ZGlmZiAtLWdpdCBhL2dkYi8yOWstc2hhcmUvUkVBRE1FIGIvZ2RiLzI5ay1zaGFyZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUxOTcxNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi8yOWstc2hhcmUvUkVBRE1FCkBAIC0wLDAgKzEsOSBAQAorVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFyZSBzaGFyZWQgd2l0aCBvdGhlciBkZWJ1Z2dlcnMgYW5kCitkZWJ1ZyBpbnRlcmZhY2VzIHRoYXQgdXNlIEFkdmFuY2VkIE1pY3JvIERldmljZXMnIFVESSAodW5pdmVyc2FsIGRlYnVnCitpbnRlcmZhY2UpIHByb3RvY29sLiAgVGhlIHByb3RvY29sIHByb3ZpZGVzIGEgY29tbW9uIGludGVyZmFjZSBhbW9uZworZGVidWdnZXJzLCBsb2dpYyBhbmFseXplcnMsIGVtdWxhdG9ycywgYW5kIGVtYmVkZGVkIHN5c3RlbXMgdGhhdCB1c2UKK0FNRCAyOTAwMCBmYW1pbHkgcHJvY2Vzc29ycy4KKworRG8gbm90IGNoYW5nZSB0aGVzZSBmaWxlcyB3aXRob3V0IGNvb3JkaW5hdGluZyB3aXRoIEFkdmFuY2VkIE1pY3JvCitEZXZpY2VzLCBFbWJlZGRlZCBQcm9jZXNzb3IgRGl2aXNpb24sIDUyMDQgRS4gQmVuIFdoaXRlIEJsdmQsIEF1c3RpbiwgVFggNzg3NDEuCitNYXliZSBwb3N0bWFzdGVyQGNheW1hbi5hbWQuY29tIGNhbiBkaXJlY3QgeW91IHRvIHRoZSBjdXJyZW50IG1haW50YWluZXJzLgpkaWZmIC0tZ2l0IGEvZ2RiLzI5ay1zaGFyZS91ZGkvdWRpMmdvMzIuYyBiL2dkYi8yOWstc2hhcmUvdWRpL3VkaTJnbzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkOThhZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi8yOWstc2hhcmUvdWRpL3VkaTJnbzMyLmMKQEAgLTAsMCArMSw2MDcgQEAKKy8qCisKK0ludGVyZmFjZSBmcm9tIFVESSBjYWxscyBpbiAzMi1iaXQgbW9kZSB0byBnbzMyIGluIDE2LWJpdCBtb2RlLiAKK0NvbW11bmljYXRpb24gaXMgZG9uZSB0aHJvdWdoIGEgc2luZ2xlIGludGVycnVwdCB2ZWN0b3IsIHdoaWNoIHBhc3NlcworZGF0YSB0aHJvdWdoIHR3byBsaW5lYXIgYnVmZmVycy4gCisKK0NhbGw6CisJQUggID0gMHhmZQorCUFMICA9IFVESSBmdW5jdGlvbiBudW1iZXIKKwlFQ1ggPSBJTiBsZW5ndGgKKwlFU0kgPSBwb2ludGVyIHRvIElOIGJ1ZmZlcgorCUVESSA9IHBvaW50ZXIgdG8gT1VUIGJ1ZmZlcgorCitSZXR1cm46CisJRUFYID0gcmV0dXJuIHZhbHVlIG9mIFVESSBmdW5jdGlvbgorCitWZWN0b3I6CisJMHgyMQorCisqLworI2lmZGVmIF9fR08zMl9fCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJ1ZGlwcm9jLmgiCisjaW5jbHVkZSAidWRpc29jLmgiCisKK2NoYXIgZGZlX2Vycm1zZ1s1MDBdOworCitzdGF0aWMgY2hhciBpbl9idWZmZXJbNDA5Nl07CitzdGF0aWMgY2hhciBvdXRfYnVmZmVyWzQwOTZdOworc3RhdGljIGNoYXIgKmluX3B0cjsKK3N0YXRpYyBjaGFyICpvdXRfcHRyOworCisjZGVmaW5lIElOX0lOSVQoKQkJaW5fcHRyID0gaW5fYnVmZmVyCisjZGVmaW5lIElOX1ZBTCh0LHYpCQkqKCh0ICopaW5fcHRyKSsrID0gdgorI2RlZmluZSBJTl9EQVRBKHB0ciwgY250KQltZW1jcHkoaW5fcHRyLCBwdHIsIGNudCksIGluX3B0ciArPSBjbnQKKworI2RlZmluZSBPVVRfSU5JVCgpCQlvdXRfcHRyID0gb3V0X2J1ZmZlcgorI2RlZmluZSBPVVRfVkFMKHQpCQkoKigodCAqKW91dF9wdHIpKyspCisjZGVmaW5lIE9VVF9EQVRBKHB0ciwgY250KQltZW1jcHkocHRyLCBvdXRfcHRyLCBjbnQpLCBvdXRfcHRyICs9IGNudAorCitzdGF0aWMgaW50IERPX0NBTEwoaW50IGZ1bmN0aW9uKQoreworICBhc20oInB1c2hsICVlc2kiKTsKKyAgYXNtKCJwdXNobCAlZWRpIik7CisgIGFzbSgibW92YiAlMCwgJSVhbCIgOiA6ICJnIiAoZnVuY3Rpb24pKTsKKyAgYXNtKCJtb3ZsIF9pbl9wdHIsICVlY3giKTsKKyAgYXNtKCJtb3ZsICRfaW5fYnVmZmVyLCAlZXNpIik7CisgIGFzbSgic3VibCAlZXNpLCAlZWN4Iik7CisgIGFzbSgibW92bCAkX291dF9idWZmZXIsICVlZGkiKTsKKyAgYXNtKCJtb3ZiICQweGZlLCAlYWgiKTsKKyAgYXNtKCJpbnQgJDB4MjEiKTsKKyAgYXNtKCJwb3BsICVlZGkiKTsKKyAgYXNtKCJwb3BsICVlc2kiKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIFRFU1RfVURJCitpbnQgbWFpbigpCit7CisgIGludCByOworICBsb25nIHAyOworICBzaG9ydCBwMTsKKyAgSU5fSU5JVCgpOworICBJTl9WQUwobG9uZywgMTExMTExMTEpOworICBJTl9WQUwoc2hvcnQsIDIyMjIpOworICBJTl9EQVRBKCJIZWxsbywgd29ybGRcbiIsIDE3KTsKKworICByID0gRE9fQ0FMTCg0Mik7CisKKyAgT1VUX0lOSVQoKTsKKyAgcDEgPSBPVVRfVkFMKHNob3J0KTsKKyAgcDIgPSBPVVRfVkFMKGxvbmcpOworICBwcmludGYoIm1haW46IHAxPSVkIHAyPSVkIHJ2PSVkXG4iLCBwMSwgcDIsIHIpOworICByZXR1cm4gcjsKK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1bnN1cHBvcnRlZChjaGFyICpzKQoreworICBwcmludGYoInVuc3VwcG9ydGVkIFVESSBob3N0IGNhbGwgJXNcbiIsIHMpOworICBhYm9ydCgpOworfQorCitVRElFcnJvciBVRElDb25uZWN0ICgKKyAgY2hhcgkJKkNvbmZpZ3VyYXRpb24sCQkvKiBJbiAqLworICBVRElTZXNzaW9uSWQJKlNlc3Npb24JCS8qIE91dCAqLworICApCit7CisgIGludCByOworICBvdXRfYnVmZmVyWzBdID0gMDsgLyogREogLSB0ZXN0ICovCisgIElOX0lOSVQoKTsKKyAgSU5fREFUQShDb25maWd1cmF0aW9uLCBzdHJsZW4oQ29uZmlndXJhdGlvbikrMSk7CisgIAorICByID0gRE9fQ0FMTChVRElDb25uZWN0X2MpOworCisgIE9VVF9JTklUKCk7ICAKKyAgKlNlc3Npb24gPSBPVVRfVkFMKFVESVNlc3Npb25JZCk7CisgIHJldHVybiByOworfQorCitVRElFcnJvciBVRElEaXNjb25uZWN0ICgKKyAgVURJU2Vzc2lvbklkCVNlc3Npb24sCQkvKiBJbiAqLworICBVRElCb29sCVRlcm1pbmF0ZQkJLyogSW4gKi8KKyAgKQoreworICBpbnQgcjsKKyAgSU5fSU5JVCgpOworICBJTl9WQUwoVURJU2Vzc2lvbklkLCBTZXNzaW9uKTsKKyAgSU5fVkFMKFVESUJvb2wsIFRlcm1pbmF0ZSk7CisgIAorICByZXR1cm4gRE9fQ0FMTChVRElEaXNjb25uZWN0X2MpOworfQorCitVRElFcnJvciBVRElTZXRDdXJyZW50Q29ubmVjdGlvbiAoCisgIFVESVNlc3Npb25JZAlTZXNzaW9uCQkJLyogSW4gKi8KKyAgKQoreworICBJTl9JTklUKCk7CisgIElOX1ZBTChVRElTZXNzaW9uSWQsIFNlc3Npb24pOworICAKKyAgcmV0dXJuIERPX0NBTEwoVURJU2V0Q3VycmVudENvbm5lY3Rpb25fYyk7Cit9CisKK1VESUVycm9yIFVESUNhcGFiaWxpdGllcyAoCisgIFVESVVJbnQzMgkqVElQSWQsCQkJLyogT3V0ICovCisgIFVESVVJbnQzMgkqVGFyZ2V0SWQsCQkvKiBPdXQgKi8KKyAgVURJVUludDMyCURGRUlkLAkJCS8qIEluICovCisgIFVESVVJbnQzMglERkUsCQkJLyogSW4gKi8KKyAgVURJVUludDMyCSpUSVAsCQkJLyogT3V0ICovCisgIFVESVVJbnQzMgkqREZFSVBDSWQsCQkvKiBPdXQgKi8KKyAgVURJVUludDMyCSpUSVBJUENJZCwJCS8qIE91dCAqLworICBjaGFyCQkqVElQU3RyaW5nCQkvKiBPdXQgKi8KKyAgKQoreworICBpbnQgcjsKKyAgSU5fSU5JVCgpOworICBJTl9WQUwoVURJVUludDMyLCBERkVJZCk7CisgIElOX1ZBTChVRElVSW50MzIsIERGRSk7CisgIHIgPSBET19DQUxMKFVESUNhcGFiaWxpdGllc19jKTsKKyAgT1VUX0lOSVQoKTsKKyAgKlRJUElkID0gT1VUX1ZBTChVRElVSW50MzIpOworICAqVGFyZ2V0SWQgPSBPVVRfVkFMKFVESVVJbnQzMik7CisgICpUSVAgPSBPVVRfVkFMKFVESVVJbnQzMik7CisgICpERkVJUENJZCA9IE9VVF9WQUwoVURJVUludDMyKTsKKyAgKlRJUElQQ0lkID0gT1VUX1ZBTChVRElVSW50MzIpOworICBzdHJjcHkoVElQU3RyaW5nLCBvdXRfcHRyKTsKKyAgcmV0dXJuIHI7Cit9CisKK1VESUVycm9yIFVESUVudW1lcmF0ZVRJUHMgKAorICBVRElJbnQJKCpVRElFVENhbGxiYWNrKQkvKiBJbiAqLworICAgICggY2hhciAqQ29uZmlndXJhdGlvbiApCS8qIEluIHRvIGNhbGxiYWNrKCkgKi8KKyAgKQoreworICBVRElFVENhbGxiYWNrKCJtb250aXAuZXhlIik7Cit9CisKK1VESUVycm9yIFVESUdldEVycm9yTXNnICgKKyAgVURJRXJyb3IJRXJyb3JDb2RlLAkJLyogSW4gKi8KKyAgVURJU2l6ZVQJTXNnU2l6ZSwJCS8qIEluICovCisgIGNoYXIJCSpNc2csCQkJLyogT3V0ICovCisgIFVESVNpemVUCSpDb3VudERvbmUJCS8qIE91dCAqLworICApCit7CisgIGludCByOworICBpZiAoTXNnU2l6ZSA+IDQwMDApCisgICAgTXNnU2l6ZSA9IDQwMDA7CisgIElOX0lOSVQoKTsKKyAgSU5fVkFMKFVESUVycm9yLCBFcnJvckNvZGUpOworICBJTl9WQUwoVURJU2l6ZVQsIE1zZ1NpemUpOworICAKKyAgciA9IERPX0NBTEwoVURJR2V0RXJyb3JNc2dfYyk7CisgIAorICBPVVRfSU5JVCgpOworICAqQ291bnREb25lID0gT1VUX1ZBTChVRElTaXplVCk7CisgIE9VVF9EQVRBKE1zZywgKkNvdW50RG9uZSk7CisgIHJldHVybiByOworfQorCitVRElFcnJvciBVRElHZXRUYXJnZXRDb25maWcgKAorICBVRElNZW1vcnlSYW5nZSBLbm93bk1lbW9yeVtdLAkJLyogT3V0ICovCisgIFVESUludAkqTnVtYmVyT2ZSYW5nZXMsCS8qIEluL091dCAqLworICBVRElVSW50MzIJQ2hpcFZlcnNpb25zW10sCQkvKiBPdXQgKi8KKyAgVURJSW50CSpOdW1iZXJPZkNoaXBzCQkvKiBJbi9PdXQgKi8KKyAgKQoreworICBpbnQgciwgaTsKKyAgaW50IG5yID0gKk51bWJlck9mUmFuZ2VzOworICBpbnQgbmMgPSAqTnVtYmVyT2ZDaGlwczsKKyAgSU5fSU5JVCgpOworICBJTl9WQUwoVURJSW50LCAqTnVtYmVyT2ZSYW5nZXMpOworICBJTl9WQUwoVURJSW50LCAqTnVtYmVyT2ZDaGlwcyk7CisgIHIgPSBET19DQUxMKFVESUdldFRhcmdldENvbmZpZ19jKTsKKyAgaWYgKHIgPT0gVURJRXJyb3JJbmNvbXBsZXRlKQorICAgIHJldHVybiByOworICBPVVRfSU5JVCgpOworICAqTnVtYmVyT2ZSYW5nZXMgPSBPVVRfVkFMKFVESUludCk7CisgICpOdW1iZXJPZkNoaXBzID0gT1VUX1ZBTChVRElJbnQpOworICBmb3IgKGk9MDsgaTxucjsgaSsrKQorICB7CisgICAgS25vd25NZW1vcnlbaV0uU3BhY2UgPSBPVVRfVkFMKHNob3J0KTsKKyAgICBLbm93bk1lbW9yeVtpXS5PZmZzZXQgPSBPVVRfVkFMKENQVU9mZnNldCk7CisgICAgS25vd25NZW1vcnlbaV0uU2l6ZSA9IE9VVF9WQUwoQ1BVU2l6ZVQpOworICB9CisgIGZvciAoaT0wOyBpPG5jOyBpKyspCisgIHsKKyAgICBDaGlwVmVyc2lvbnNbaV0gPSBPVVRfVkFMKFVESVVJbnQzMik7CisgIH0KKyAgcmV0dXJuIHI7Cit9CisKK1VESUVycm9yIFVESUNyZWF0ZVByb2Nlc3MgKAorICBVRElQSWQJKlBJZAkJCS8qIE91dCAqLworICApCit7CisgIGludCByID0gRE9fQ0FMTChVRElDcmVhdGVQcm9jZXNzX2MpOworCisgIE9VVF9JTklUKCk7CisgICpQSWQgPSBPVVRfVkFMKFVESVBJZCk7CisKKyAgcmV0dXJuIHI7Cit9CisKK1VESUVycm9yIFVESVNldEN1cnJlbnRQcm9jZXNzICgKKyAgVURJUElkCVBJZAkJCS8qIEluICovCisgICkKK3sKKyAgSU5fSU5JVCgpOworICBJTl9WQUwoVURJUElkLCBQSWQpOworCisgIHJldHVybiBET19DQUxMKFVESVNldEN1cnJlbnRQcm9jZXNzX2MpOworfQorCitVRElFcnJvciBVRElEZXN0cm95UHJvY2VzcyAoCisgIFVESVBJZAlQSWQJCQkvKiBJbiAqLworICApCit7CisgIElOX0lOSVQoKTsKKyAgSU5fVkFMKFVESVBJZCwgUElkKTsKKworICByZXR1cm4gRE9fQ0FMTChVRElEZXN0cm95UHJvY2Vzc19jKTsKK30KKworVURJRXJyb3IgVURJSW5pdGlhbGl6ZVByb2Nlc3MgKAorICBVRElNZW1vcnlSYW5nZSBQcm9jZXNzTWVtb3J5W10sCS8qIEluICovCisgIFVESUludAlOdW1iZXJPZlJhbmdlcywJCS8qIEluICovCisgIFVESVJlc291cmNlCUVudHJ5UG9pbnQsCQkvKiBJbiAqLworICBDUFVTaXplVAlTdGFja1NpemVzW10sCQkvKiBJbiAqLworICBVRElJbnQJTnVtYmVyT2ZTdGFja3MsCQkvKiBJbiAqLworICBjaGFyCQkqQXJnU3RyaW5nCQkvKiBJbiAqLworICApCit7CisgIGludCBpLCByOworICBJTl9JTklUKCk7CisgIElOX1ZBTChVRElJbnQsIE51bWJlck9mUmFuZ2VzKTsKKyAgZm9yIChpPTA7IGk8TnVtYmVyT2ZSYW5nZXM7IGkrKykKKyAgeworICAgIElOX1ZBTChzaG9ydCwgUHJvY2Vzc01lbW9yeVtpXS5TcGFjZSk7CisgICAgSU5fVkFMKENQVU9mZnNldCwgUHJvY2Vzc01lbW9yeVtpXS5PZmZzZXQpOworICAgIElOX1ZBTChDUFVTaXplVCwgUHJvY2Vzc01lbW9yeVtpXS5TaXplKTsKKyAgfQorICBJTl9WQUwoc2hvcnQsIEVudHJ5UG9pbnQuU3BhY2UpOworICBJTl9WQUwoQ1BVT2Zmc2V0LCBFbnRyeVBvaW50Lk9mZnNldCk7CisgIElOX1ZBTChVRElJbnQsIE51bWJlck9mU3RhY2tzKTsKKyAgZm9yIChpPTA7IGk8TnVtYmVyT2ZTdGFja3M7IGkrKykKKyAgICBJTl9WQUwoQ1BVU2l6ZVQsIFN0YWNrU2l6ZXNbaV0pOworICBJTl9EQVRBKEFyZ1N0cmluZywgc3RybGVuKEFyZ1N0cmluZykrMSk7CisKKyAgcmV0dXJuIERPX0NBTEwoVURJSW5pdGlhbGl6ZVByb2Nlc3NfYyk7Cit9CisKK1VESUVycm9yIFVESVJlYWQgKAorICBVRElSZXNvdXJjZQlGcm9tLAkJCS8qIEluICovCisgIFVESUhvc3RNZW1QdHIJVG8sCQkJLyogT3V0ICovCisgIFVESUNvdW50CUNvdW50LAkJCS8qIEluICovCisgIFVESVNpemVUCVNpemUsCQkJLyogSW4gKi8KKyAgVURJQ291bnQJKkNvdW50RG9uZSwJCS8qIE91dCAqLworICBVRElCb29sCUhvc3RFbmRpYW4JCS8qIEluICovCisgICkKK3sKKyAgaW50IGNsZWZ0ID0gQ291bnQsIGN0aGlzLCBkdGhpczsKKyAgaW50IGNkb25lID0gMCwgciwgYnNpemU9MjA0OC9TaXplOworICAKKyAgd2hpbGUgKGNsZWZ0KQorICB7CisgICAgY3RoaXMgPSAoY2xlZnQ8YnNpemUpID8gY2xlZnQgOiBic2l6ZTsKKyAgICBJTl9JTklUKCk7CisgICAgSU5fVkFMKHNob3J0LCBGcm9tLlNwYWNlKTsKKyAgICBJTl9WQUwoQ1BVT2Zmc2V0LCBGcm9tLk9mZnNldCk7CisgICAgSU5fVkFMKFVESUNvdW50LCBjdGhpcyk7CisgICAgSU5fVkFMKFVESVNpemVULCBTaXplKTsKKyAgICBJTl9WQUwoVURJQm9vbCwgSG9zdEVuZGlhbik7CisKKyAgICByID0gRE9fQ0FMTChVRElSZWFkX2MpOworCisgICAgT1VUX0lOSVQoKTsKKyAgICBkdGhpcyA9IE9VVF9WQUwoVURJQ291bnQpOworICAgIE9VVF9EQVRBKFRvLCBkdGhpcypTaXplKTsKKyAgICBjZG9uZSArPSBkdGhpczsKKyAgICBUbyArPSBkdGhpcypTaXplOworCisgICAgaWYgKHIgIT0gVURJTm9FcnJvcikKKyAgICB7CisgICAgICAqQ291bnREb25lID0gY2RvbmU7CisgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgY2xlZnQgLT0gY3RoaXM7CisgIH0KKyAgKkNvdW50RG9uZSA9IGNkb25lOworICByZXR1cm4gVURJTm9FcnJvcjsKK30KKworVURJRXJyb3IgVURJV3JpdGUgKAorICBVRElIb3N0TWVtUHRyCUZyb20sCQkJLyogSW4gKi8KKyAgVURJUmVzb3VyY2UJVG8sCQkJLyogSW4gKi8KKyAgVURJQ291bnQJQ291bnQsCQkJLyogSW4gKi8KKyAgVURJU2l6ZVQJU2l6ZSwJCQkvKiBJbiAqLworICBVRElDb3VudAkqQ291bnREb25lLAkJLyogT3V0ICovCisgIFVESUJvb2wJSG9zdEVuZGlhbgkJLyogSW4gKi8KKyAgKQoreworICBpbnQgY2xlZnQgPSBDb3VudCwgY3RoaXMsIGR0aGlzOworICBpbnQgY2RvbmUgPSAwLCByLCBic2l6ZT0yMDQ4L1NpemU7CisgIAorICB3aGlsZSAoY2xlZnQpCisgIHsKKyAgICBjdGhpcyA9IChjbGVmdDxic2l6ZSkgPyBjbGVmdCA6IGJzaXplOworICAgIElOX0lOSVQoKTsKKyAgICBJTl9WQUwoc2hvcnQsIFRvLlNwYWNlKTsKKyAgICBJTl9WQUwoQ1BVT2Zmc2V0LCBUby5PZmZzZXQpOworICAgIElOX1ZBTChVRElDb3VudCwgY3RoaXMpOworICAgIElOX1ZBTChVRElTaXplVCwgU2l6ZSk7CisgICAgSU5fVkFMKFVESUJvb2wsIEhvc3RFbmRpYW4pOworICAgIElOX0RBVEEoRnJvbSwgY3RoaXMqU2l6ZSk7CisgICAgRnJvbSArPSBjdGhpcypTaXplOworICAgIAorICAgIHIgPSBET19DQUxMKFVESVdyaXRlX2MpOworCisgICAgT1VUX0lOSVQoKTsKKyAgICBjZG9uZSArPSBPVVRfVkFMKFVESUNvdW50KTsKKworICAgIGlmIChyICE9IFVESU5vRXJyb3IpCisgICAgeworICAgICAgKkNvdW50RG9uZSA9IGNkb25lOworICAgICAgcmV0dXJuIHI7CisgICAgfQorICAgIGNsZWZ0IC09IGN0aGlzOworICB9CisgICpDb3VudERvbmUgPSBjZG9uZTsKKyAgcmV0dXJuIFVESU5vRXJyb3I7Cit9CisKK1VESUVycm9yIFVESUNvcHkgKAorICBVRElSZXNvdXJjZQlGcm9tLAkJCS8qIEluICovCisgIFVESVJlc291cmNlCVRvLAkJCS8qIEluICovCisgIFVESUNvdW50CUNvdW50LAkJCS8qIEluICovCisgIFVESVNpemVUCVNpemUsCQkJLyogSW4gKi8KKyAgVURJQ291bnQJKkNvdW50RG9uZSwJCS8qIE91dCAqLworICBVRElCb29sCURpcmVjdGlvbgkJLyogSW4gKi8KKyAgKQoreworICBpbnQgcjsKKyAgSU5fSU5JVCgpOworICBJTl9WQUwoc2hvcnQsIEZyb20uU3BhY2UpOworICBJTl9WQUwoQ1BVT2Zmc2V0LCBGcm9tLk9mZnNldCk7CisgIElOX1ZBTChzaG9ydCwgVG8uU3BhY2UpOworICBJTl9WQUwoQ1BVT2Zmc2V0LCBUby5PZmZzZXQpOworICBJTl9WQUwoVURJQ291bnQsIENvdW50KTsKKyAgSU5fVkFMKFVESVNpemVULCBTaXplKTsKKyAgSU5fVkFMKFVESUJvb2wsIERpcmVjdGlvbik7CisgIAorICByID0gRE9fQ0FMTChVRElDb3B5X2MpOworICAKKyAgT1VUX0lOSVQoKTsKKyAgKkNvdW50RG9uZSA9IE9VVF9WQUwoVURJQ291bnQpOworICAKKyAgcmV0dXJuIHI7Cit9CisKK1VESUVycm9yIFVESUV4ZWN1dGUgKAorICB2b2lkCisgICkKK3sKKyAgcmV0dXJuIERPX0NBTEwoVURJRXhlY3V0ZV9jKTsKK30KKworVURJRXJyb3IgVURJU3RlcCAoCisgIFVESVVJbnQzMglTdGVwcywJCQkvKiBJbiAqLworICBVRElTdGVwVHlwZSAgIFN0ZXBUeXBlLAkJLyogSW4gKi8KKyAgVURJUmFuZ2UgICAgICBSYW5nZQkJCS8qIEluICovCisgICkKK3sKKyAgSU5fSU5JVCgpOworICBJTl9WQUwoVURJVUludDMyLCBTdGVwcyk7CisgIElOX1ZBTChVRElTdGVwVHlwZSwgU3RlcFR5cGUpOworICBJTl9WQUwoVURJUmFuZ2UsIFJhbmdlKTsKKyAgCisgIHJldHVybiBET19DQUxMKFVESVN0ZXBfYyk7Cit9CisKK1VESVZvaWQgVURJU3RvcCAoCisgIHZvaWQKKyAgKQoreworICBET19DQUxMKFVESVN0b3BfYyk7Cit9CisKK1VESUVycm9yIFVESVdhaXQgKAorICBVRElJbnQzMglNYXhUaW1lLAkJLyogSW4gKi8KKyAgVURJUElkCSpQSWQsCQkJLyogT3V0ICovCisgIFVESVVJbnQzMgkqU3RvcFJlYXNvbgkJLyogT3V0ICovCisgICkKK3sKKyAgaW50IHI7CisgIElOX0lOSVQoKTsKKyAgSU5fVkFMKFVESUludDMyLCBNYXhUaW1lKTsKKyAgciA9IERPX0NBTEwoVURJV2FpdF9jKTsKKyAgT1VUX0lOSVQoKTsKKyAgKlBJZCA9IE9VVF9WQUwoVURJUElkKTsKKyAgKlN0b3BSZWFzb24gPSBPVVRfVkFMKFVESVVJbnQzMik7CisgIHJldHVybiByOworfQorCitVRElFcnJvciBVRElTZXRCcmVha3BvaW50ICgKKyAgVURJUmVzb3VyY2UJQWRkciwJCQkvKiBJbiAqLworICBVRElJbnQzMglQYXNzQ291bnQsCQkvKiBJbiAqLworICBVRElCcmVha1R5cGUJVHlwZSwJCQkvKiBJbiAqLworICBVRElCcmVha0lkCSpCcmVha0lkCQkvKiBPdXQgKi8KKyAgKQoreworICBpbnQgcjsKKyAgSU5fSU5JVCgpOworICBJTl9WQUwoc2hvcnQsIEFkZHIuU3BhY2UpOworICBJTl9WQUwoQ1BVT2Zmc2V0LCBBZGRyLk9mZnNldCk7CisgIElOX1ZBTChVRElJbnQzMiwgUGFzc0NvdW50KTsKKyAgSU5fVkFMKFVESUJyZWFrVHlwZSwgVHlwZSk7CisgIAorICByID0gRE9fQ0FMTChVRElTZXRCcmVha3BvaW50X2MpOworICAKKyAgT1VUX0lOSVQoKTsKKyAgKkJyZWFrSWQgPSBPVVRfVkFMKFVESUJyZWFrSWQpOworICByZXR1cm4gcjsKK30KKworVURJRXJyb3IgVURJUXVlcnlCcmVha3BvaW50ICgKKyAgVURJQnJlYWtJZAlCcmVha0lkLAkJLyogSW4gKi8KKyAgVURJUmVzb3VyY2UJKkFkZHIsCQkJLyogT3V0ICovCisgIFVESUludDMyCSpQYXNzQ291bnQsCQkvKiBPdXQgKi8KKyAgVURJQnJlYWtUeXBlCSpUeXBlLAkJCS8qIE91dCAqLworICBVRElJbnQzMgkqQ3VycmVudENvdW50CQkvKiBPdXQgKi8KKyAgKQoreworICBpbnQgcjsKKyAgSU5fSU5JVCgpOworICBJTl9WQUwoVURJQnJlYWtJZCwgQnJlYWtJZCk7CisgIAorICByID0gRE9fQ0FMTChVRElRdWVyeUJyZWFrcG9pbnRfYyk7CisgIAorICBPVVRfSU5JVCgpOworICBBZGRyLT5TcGFjZSA9IE9VVF9WQUwoc2hvcnQpOworICBBZGRyLT5PZmZzZXQgPSBPVVRfVkFMKENQVU9mZnNldCk7CisgICpQYXNzQ291bnQgPSBPVVRfVkFMKFVESUludDMyKTsKKyAgKlR5cGUgPSBPVVRfVkFMKFVESUJyZWFrVHlwZSk7CisgICpDdXJyZW50Q291bnQgPSBPVVRfVkFMKFVESUludDMyKTsKKyAgCisgIHJldHVybiByOworfQorCitVRElFcnJvciBVRElDbGVhckJyZWFrcG9pbnQgKAorICBVRElCcmVha0lkCUJyZWFrSWQJCQkvKiBJbiAqLworICApCit7CisgIElOX0lOSVQoKTsKKyAgSU5fVkFMKFVESUJyZWFrSWQsIEJyZWFrSWQpOworICAKKyAgcmV0dXJuIERPX0NBTEwoVURJQ2xlYXJCcmVha3BvaW50X2MpOworfQorCitVRElFcnJvciBVRElHZXRTdGRvdXQgKAorICBVRElIb3N0TWVtUHRyCUJ1ZiwJCQkvKiBPdXQgKi8KKyAgVURJU2l6ZVQJQnVmU2l6ZSwJCS8qIEluICovCisgIFVESVNpemVUCSpDb3VudERvbmUJCS8qIE91dCAqLworICApCit7CisgIGludCByOworICBJTl9JTklUKCk7CisgIGlmIChCdWZTaXplID4gNDAwMCkKKyAgICBCdWZTaXplID0gNDAwMDsKKyAgSU5fVkFMKFVESVNpemVULEJ1ZlNpemUpOworICByID0gRE9fQ0FMTChVRElHZXRTdGRvdXRfYyk7CisgIE9VVF9JTklUKCk7CisgICpDb3VudERvbmUgPSBPVVRfVkFMKFVESVNpemVUKTsKKyAgaWYgKCpDb3VudERvbmUgPD0gQnVmU2l6ZSkKKyAgICBPVVRfREFUQShCdWYsICpDb3VudERvbmUpOworICByZXR1cm4gcjsKK30KKworVURJRXJyb3IgVURJR2V0U3RkZXJyICgKKyAgVURJSG9zdE1lbVB0cglCdWYsCQkJLyogT3V0ICovCisgIFVESVNpemVUCUJ1ZlNpemUsCQkvKiBJbiAqLworICBVRElTaXplVAkqQ291bnREb25lCQkvKiBPdXQgKi8KKyAgKQoreworICBpbnQgcjsKKyAgSU5fSU5JVCgpOworICBpZiAoQnVmU2l6ZSA+IDQwMDApCisgICAgQnVmU2l6ZSA9IDQwMDA7CisgIElOX1ZBTChVRElTaXplVCxCdWZTaXplKTsKKyAgciA9IERPX0NBTEwoVURJR2V0U3RkZXJyX2MpOworICBPVVRfSU5JVCgpOworICAqQ291bnREb25lID0gT1VUX1ZBTChVRElTaXplVCk7CisgIE9VVF9EQVRBKEJ1ZiwgKkNvdW50RG9uZSk7CisgIHJldHVybiByOworfQorCitVRElFcnJvciBVRElQdXRTdGRpbiAoCisgIFVESUhvc3RNZW1QdHIJQnVmLAkJCS8qIEluICovCisgIFVESVNpemVUCUNvdW50LAkJCS8qIEluICovCisgIFVESVNpemVUCSpDb3VudERvbmUJCS8qIE91dCAqLworICApCit7CisgIGludCByOworICBJTl9JTklUKCk7CisgIGlmIChDb3VudCA+IDQwMDApCisgICAgQ291bnQgPSA0MDAwOworICBJTl9WQUwoVURJU2l6ZVQsQ291bnQpOworICBJTl9EQVRBKEJ1ZiwgQ291bnQpOworICByID0gRE9fQ0FMTChVRElQdXRTdGRpbl9jKTsKKyAgT1VUX0lOSVQoKTsKKyAgKkNvdW50RG9uZSA9IE9VVF9WQUwoVURJU2l6ZVQpOworICByZXR1cm4gcjsKK30KKworVURJRXJyb3IgVURJU3RkaW5Nb2RlICgKKyAgVURJTW9kZQkqTW9kZQkJCS8qIE91dCAqLworICApCit7CisgIGludCByOworICBJTl9JTklUKCk7CisgIHIgPSBET19DQUxMKFVESVN0ZGluTW9kZV9jKTsKKyAgT1VUX0lOSVQoKTsKKyAgKk1vZGUgPSBPVVRfVkFMKFVESU1vZGUpOworICByZXR1cm4gcjsKK30KKworVURJRXJyb3IgVURJUHV0VHJhbnMgKAorICBVRElIb3N0TWVtUHRyCUJ1ZiwJCQkvKiBJbiAqLworICBVRElTaXplVAlDb3VudCwJCQkvKiBJbiAqLworICBVRElTaXplVAkqQ291bnREb25lCQkvKiBPdXQgKi8KKyAgKQoreworICBpbnQgcjsKKyAgSU5fSU5JVCgpOworICBpZiAoQ291bnQgPiA0MDAwKQorICAgIENvdW50ID0gNDAwMDsKKyAgSU5fVkFMKFVESVNpemVULENvdW50KTsKKyAgSU5fREFUQShCdWYsIENvdW50KTsKKyAgciA9IERPX0NBTEwoVURJUHV0VHJhbnNfYyk7CisgIE9VVF9JTklUKCk7CisgICpDb3VudERvbmUgPSBPVVRfVkFMKFVESVNpemVUKTsKKyAgcmV0dXJuIHI7Cit9CisKK1VESUVycm9yIFVESUdldFRyYW5zICgKKyAgVURJSG9zdE1lbVB0cglCdWYsCQkJLyogT3V0ICovCisgIFVESVNpemVUCUJ1ZlNpemUsCQkvKiBJbiAqLworICBVRElTaXplVAkqQ291bnREb25lCQkvKiBPdXQgKi8KKyAgKQoreworICBpbnQgcjsKKyAgSU5fSU5JVCgpOworICBpZiAoQnVmU2l6ZSA+IDQwMDApCisgICAgQnVmU2l6ZSA9IDQwMDA7CisgIElOX1ZBTChVRElTaXplVCxCdWZTaXplKTsKKyAgciA9IERPX0NBTEwoVURJR2V0VHJhbnNfYyk7CisgIE9VVF9JTklUKCk7CisgICpDb3VudERvbmUgPSBPVVRfVkFMKFVESVNpemVUKTsKKyAgT1VUX0RBVEEoQnVmLCAqQ291bnREb25lKTsKKyAgcmV0dXJuIHI7Cit9CisKK1VESUVycm9yIFVESVRyYW5zTW9kZSAoCisgIFVESU1vZGUJKk1vZGUJCQkvKiBPdXQgKi8KKyAgKQoreworICBpbnQgcjsKKyAgSU5fSU5JVCgpOworICByID0gRE9fQ0FMTChVRElUcmFuc01vZGVfYyk7CisgIE9VVF9JTklUKCk7CisgICpNb2RlID0gT1VUX1ZBTChVRElNb2RlKTsKKyAgcmV0dXJuIHI7Cit9CisKKyNkZWZpbmUgREZFSVBDSWRDb21wYW55IDB4MDAwMQkvKiBDb21wYW55IElEIEFNRCAqLworI2RlZmluZSBERkVJUENJZFByb2R1Y3QgMHgxCS8qIFByb2R1Y3QgSUQgMCAqLworI2RlZmluZSBERkVJUENJZFZlcnNpb24gMHgxMjUJLyogMS4yLjUgKi8KKwordW5zaWduZWQgVURJR2V0REZFSVBDSWQgKCkKK3sKKyAgICByZXR1cm4oKCgoVURJVUludDMyKURGRUlQQ0lkQ29tcGFueSkgPDwgMTYpIHwoREZFSVBDSWRQcm9kdWN0IDw8IDEyKSB8IERGRUlQQ0lkVmVyc2lvbik7Cit9CisKKyNlbmRpZiAvKiBfX0dPMzJfXyAqLwpkaWZmIC0tZ2l0IGEvZ2RiLzI5ay1zaGFyZS91ZGkvdWRpaWRzLmggYi9nZGIvMjlrLXNoYXJlL3VkaS91ZGlpZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjgwNWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiLzI5ay1zaGFyZS91ZGkvdWRpaWRzLmgKQEAgLTAsMCArMSw0OCBAQAorLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBERkUgYW5kIFRJUCBJRHMgdG8gYmUgdXNlZCBieSBBTUQgcHJvZHVjdHMgZm9yCisgICB0aGUgVURJQ2FwYWJpbGl0aWVzIGNhbGwuCisgICAKKyAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKwkvKiBDb21wYW55IENvZGVzIC0tIEFNRCBhc3NpZ25zIHRoZXNlICovCisjZGVmaW5lIFVESUNvbXBhbnlDb2RlX0FNRCAxCisKKwkvKiBCdWlsZCBhIFVESUlEIGdpdmVuIGEgQ29tcGFueVByb2RDb2RlIGFuZCAzIHZlcnNpb24gcGllY2VzICovCisjZGVmaW5lIFVESUlEKENvbXBhbnlQcm9kQ29kZSwgdjEsdjIsdjMpICgoKChDb21wYW55UHJvZENvZGUpICYgMHhmZmZmZik8PDEyKStcCisJCQkJICAoKCh2MSkmMHhmKTw8OCkgKyAoKCh2MikmMHhmKTw8NCkgKyAoKHYzKSYweGYpKSAKKworCisJLyogRXh0cmFjdCBhIENvbXBhbnlQcm9kQ29kZSBvciBhIFZlcnNpb24gZnJvbSBhIFVESUlEICovCisjZGVmaW5lIFVESUlEX0NvbXBhbnlQcm9kQ29kZShpZCkgKCgoaWQpPj4xMikgJiAweGZmZmZmKQorI2RlZmluZSBVRElJRF9WZXJzaW9uKGlkKSAoKGlkKSYweGZmZikKKworCisjZGVmaW5lIFVESUFNRFByb2R1Y3QoUHJvZENvZGUpICgoVURJQ29tcGFueUNvZGVfQU1EPDw0KSArIChQcm9kQ29kZSYweGYpKQorCisJLyogQU1EIERGRSBQcm9kdWN0IENvZGVzICovCisjZGVmaW5lIFVESVByb2R1Y3RDb2RlX01vbmRmZSBVRElBTURQcm9kdWN0KDApCisjZGVmaW5lIFVESVByb2R1Y3RDb2RlX1hSQVkgICBVRElBTURQcm9kdWN0KDEpCisjZGVmaW5lIFVESVByb2R1Y3RDb2RlX1RJUFRlc3RlciAgVURJQU1EUHJvZHVjdCgyKQorCisJLyogQU1EIFRJUCBQcm9kdWN0IENvZGVzIChuZWVkIG5vdCBiZSBkaXN0aW5jdCBmcm9tIERGRSBQcm9kdWN0IENvZGVzKSAqLworI2RlZmluZSBVRElQcm9kdWN0Q29kZV9Nb250aXAgVURJQU1EUHJvZHVjdCgwKQorI2RlZmluZSBVRElQcm9kdWN0Q29kZV9Jc3N0aXAgVURJQU1EUHJvZHVjdCgxKQorCisKKyNkZWZpbmUgVURJTGF0ZXN0VmVyc2lvbiAweDEyMAkvKiBVREkgMS4yLjAsIGNhbiBiZSB1c2VkIGluIERGRSBhbmQgVElQIGRlc2lyZWQgVURJIHBhcmFtcyAqLworCmRpZmYgLS1naXQgYS9nZGIvMjlrLXNoYXJlL3VkaS91ZGlwMnNvYy5jIGIvZ2RiLzI5ay1zaGFyZS91ZGkvdWRpcDJzb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjllODUwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiLzI5ay1zaGFyZS91ZGkvdWRpcDJzb2MuYwpAQCAtMCwwICsxLDEyNTAgQEAKKy8qIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKK3N0YXRpYyAJY2hhciB1ZGlwMnNvY19jW109IkAoIyl1ZGlwMnNvYy5jCTIuMTEgIERhbmllbCBNYW5uIjsKK3N0YXRpYyAgY2hhciB1ZGlwMnNvY19jX0FNRFtdPSJAKCMpdWRpcDJzb2MuYwkyLjgsIEFNRCI7CisvKiAKKyogICAgICAgVGhpcyBtb2R1bGUgY29udmVydHMgVURJIFByb2NlZHVyYWwgY2FsbHMgaW50bworKglVREkgc29ja2V0IG1lc3NhZ2VzIGZvciBVTklYLiAKKyoJSXQgaXMgdXNlZCBieSBERkUgY2xpZW50IHByb2Nlc3NlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBISVNUT1JZCisqLworLyogVGhpcyBpcyBhbGwgdW5uZWVkZWQgb24gRE9TIG1hY2hpbmVzLiAgKi8KKyNpZm5kZWYgX19HTzMyX18KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIEJlZm9yZSBzeXMvZmlsZS5oIGZvciBVbml4d2FyZS4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorCisvKiBUaGlzIHVzZWQgdG8gc2F5IHN5cy9mY250bC5oLCBidXQgdGhlIG9ubHkgc3lzdGVtcyBJIGtub3cgb2YgdGhhdAorICAgcmVxdWlyZSB0aGF0IGFyZSBvbGQgKHByZS00LjMsIGF0IGxlYXN0KSBCU0Qgc3lzdGVtcywgd2hpY2ggd2UKKyAgIHByb2JhYmx5IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQuICAqLworI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9lcnJuby5oPgorI2luY2x1ZGUgInVkaXByb2MuaCIKKyNpbmNsdWRlICJ1ZGlzb2MuaCIKKworZXh0ZXJuCWludAkJZXJybm87CitleHRlcm4JaW50CQlzeXNfbmVycjsKK2V4dGVybglpbnQJCXVkcl9lcnJubzsKK2V4dGVybgljaGFyKgkJZ2V0ZW52KCk7CisKKy8qIGxvY2FsIHR5cGUgZGVjcy4gYW5kIG1hY3JvIGRlZnMuIG5vdCBpbiBhIC5oICBmaWxlICoqKioqKioqKioqKiogTUFDUk8vVFlQRQorKi8KKyNkZWZpbmUJCXZlcnNpb25fYyAweDEyMQkJLyogREZFLUlQQyB2ZXJzaW9uIGlkICovCisjZGVmaW5lCQlUUlVFIC0xCisjZGVmaW5lCQlGQUxTRSAwCisjZGVmaW5lCQlQT1JUX05VTSA3MDAwCisjZGVmaW5lCQlNQVhfU0VTU0lPTlMgNQkJLyogbWF4aW11bSBERkUtVElQIGNvbm5lY3Rpb25zICovCisjZGVmaW5lCQlTT0NfQlVGX1NJWkUgNCogMTAyNAkvKiBzaXplIG9mIHNvY2tldCBjb21tcyBidWZmZXIgKi8KKyNkZWZpbmUJCVNCVUZfU0laRSA1MDAJCS8qIHNpemUgb2Ygc3RyaW5nIGJ1ZmZlciAqLworI2RlZmluZQkJRVJSTVNHX1NJWkUgNTAwCQkvKiBzaXplIG9mIGVycm9yIG1lc3NhZ2UgYnVmZmVyICovCisKK3R5cGVkZWYgc3RydWN0IGNvbm5lY3Rpb25fc3RyCQkvKiByZWNvcmQgb2YgY29ubmVjdCBzZXNzaW9uICovCit7CisgICAgaW50CQlpbl91c2U7CisgICAgY2hhcgljb25uZWN0X2lkWzIwXTsJCS8qIGNvbm5lY3Rpb24gaWRlbnRpZmllciAqLworICAgIGNoYXIJZG9tYWluX3N0cmluZ1syMF07CS8qIGRvbW1haW5nIGZvciBjb25lY3Rpb24gKi8KKyAgICBjaGFyCXRpcF9zdHJpbmdbMzBdOwkJLyogVElQIGhvc3QgbmFtZSBmb3IgQUZfSU5FVCAqLworICAgIGNoYXIJdGlwX2V4ZVs4MF07CQkvKiBUSVAgZXhlIG5hbWUgKi8KKyAgICBpbnQJCWRmZV9zZDsJCQkvKiBhc3NvY2lhdGVkIERGRSBzb2NrZXQgKi8KKyAgICBpbnQJCXRpcF9waWQ7CQkvKiBwaWQgb2YgVElQIHByb2Nlc3MgKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gZGZlX3NvY2thZGRyOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiB0aXBfc29ja2FkZHJfaW47CisgICAgc3RydWN0IHNvY2thZGRyICAgIHRpcF9zb2NrYWRkcjsKK30gY29ubmVjdGlvbl90OworCit0eXBlZGVmIHN0cnVjdCBzZXNzaW9uX3N0cgoreworICAgIGludAkJICBpbl91c2U7CisgICAgY29ubmVjdGlvbl90KiBzb2NfY29uX3A7CQkvKiBhc3NvY2lhdGVkIGNvbm5lY3Rpb24gKi8KKyAgICBVRElTZXNzaW9uSWQgIHRpcF9pZDsJCS8qIGFzc29jaWF0ZWQgVElQIHNlc3Npb24gSUQgKi8KK30gc2Vzc2lvbl90OworCisvKiBnbG9iYWwgZGVjL2RlZnMuIHdoaWNoIGFyZSBub3QgaW4gYSAuaCAgIGZpbGUgKioqKioqKioqKioqKiBFWFBPUlQgREVDL0RFRlMKKyovCitVRElFcnJvcglkZmVfZXJybm87CitjaGFyCWRmZV9lcnJtc2dbRVJSTVNHX1NJWkVdOy8qIGVycm9yIHN0cmluZyAqLworCisvKiBsb2NhbCBkZWMvZGVmcy4gd2hpY2ggYXJlIG5vdCBpbiBhIC5oICAgZmlsZSAqKioqKioqKioqKioqKiogTE9DQUwgREVDL0RFRlMKKyovCitMT0NBTCBjb25uZWN0aW9uX3QJc29jX2NvbltNQVhfU0VTU0lPTlNdOwkKK0xPQ0FMIHNlc3Npb25fdAlzZXNzaW9uW01BWF9TRVNTSU9OU107CQorTE9DQUwgVURSCXVkcjsKK0xPQ0FMIFVEUioJdWRycyA9ICZ1ZHI7CQkvKiBVRFIgZm9yIGN1cnJlbnQgc2Vzc2lvbiAqLworTE9DQUwgaW50CWN1cnJlbnQ7CQkvKiBpbnQtaWQgZm9yIGN1cnJlbnQgc2Vzc2lvbiAqLworTE9DQUwgY2hhcglzYnVmW1NCVUZfU0laRV07CS8qIFN0cmluZyBoYW5kbGVyIGJ1ZmZlciAqLworTE9DQUwgY2hhcgljb25maWdfZmlsZVs4MF07CS8qIHBhdGgvbmFtZSBmb3IgY29uZmlnIGZpbGUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9DT05ORUNUCisqIEVzdGFibGlzaCBhIG5ldyBGREUgdG8gVElQIGNvbmVjdGlvbi4gVGhlIGZpbGUgIi4vdWRpX3NvYyIgb3IKKyogIi9ldGMvdWRpX3NvYyIgbWF5IGJlIGV4YW1pbmVkIHRvIG9idGFpbiB0aGUgY29uZWN0aW9uIGluZm9ybWF0aW9uCisqIGlmIHRoZSAiQ29uZmlnIiBwYXJhbWV0ZXIgaXMgbm90IGEgY29tcGxldGQgImxpbmUgZW50cnkiLgorKgorKiBOT1RFOiB0aGUgU2Vzc2lvbiBzdHJpbmcgbXVzdCBub3Qgc3RhcnQgd2hpdGggd2hpdGUtc3BhY2UgY2hhcmFjdGVycy4KKyogRm9ybWF0IG9mIHN0cmluZyBpczoKKyogPHNlc3Npb24+ICAgPGRvbWFpbj4gPHNvY19uYW1lfGhvc3RfbmFtZT4gPHRpcF9leGV8cG9ydD4gPHBhc3MgdG8gVURJY29ubmVjdD4KKyogc29jMmNheW1hbiAgQUZfSU5FVCAgICAgICAgICAgIGNheW1hbiAgICAgIDcwMDAgICAgICAgICAgIDxub3Qgc3VwcG9ydGVkPgorKiBzb2MydGlwICAgICBBRl9VTklYICAgYXN0cmluZyAgICAgICAgICAgICAgdGlwLmV4ZSAgICAgICAgLi4uCisqLworVURJRXJyb3IKK1VESUNvbm5lY3QoQ29uZmlnLCBTZXNzaW9uKQorICAgICBjaGFyICpDb25maWc7CQkvKiBpbiAgLS0gaWRlbnRpZmljYXRpb24gc3RyaW5nICovCisgICAgIFVESVNlc3Npb25JZCAqU2Vzc2lvbjsJLyogb3V0IC0tIHNlc3Npb24gSUQgKi8KK3sKKyAgICBVRElJbnQzMglzZXJ2aWNlX2lkID0gVURJQ29ubmVjdF9jOworICAgIGludAkJZG9tYWluOworICAgIGludAkJY250PTA7CisgICAgaW50CQlyY250LCBwb3MsIHBhcmFtc19wb3M9MDsKKyAgICBjaGFyCSp0aXBfbWFpbl9zdHJpbmc7CisgICAgY2hhcgkqZW52X3A7CisgICAgc3RydWN0IGhvc3RlbnQJKnRpcF9pbmZvX3A7CisgICAgRklMRQkqZmQ7CisjaWYgMAorICAgIEZJTEUJKmZfcDsKKyNlbmRpZgorICAgIFVESVVJbnQzMglUSVBJUENJZDsKKyAgICBVRElVSW50MzIJREZFSVBDSWQ7CisKKyNpZiAwIC8qIFRoaXMgaXMgY3JhcC4gIEl0IGFzc3VtZXMgdGhhdCB1ZGlfc29jIGlzIGV4ZWN1dGFibGUhICovCisgICAgc3ByaW50ZihzYnVmLCAid2hpY2ggdWRpX3NvYyIpOworICAgIGZfcCA9IHBvcGVuKHNidWYsICJyIik7CisgICAgaWYoZl9wKQorICAgIHsgICB3aGlsZSggKHNidWZbY250KytdPWdldGMoZl9wKSkgIT0gRU9GKTsKKwlzYnVmW2NudC0yXT0wOworICAgIH0KKyAgICBwY2xvc2UoZl9wKTsKKyNlbmRpZgorCisgICAgZm9yIChyY250PTA7CisJIHJjbnQgPCBNQVhfU0VTU0lPTlMgJiYgc2Vzc2lvbltyY250XS5pbl91c2U7CisJIHJjbnQrKyk7CisKKyAgICBpZiAocmNudCA+PSBNQVhfU0VTU0lPTlMpCisgICAgICB7CisJc3ByaW50ZihkZmVfZXJybXNnLCAiREZFLWlwYyBFUlJPUjogVG9vIG1hbnkgc2Vzc2lvbnMgYWxyZWFkeSBvcGVuIik7CisJcmV0dXJuIFVESUVycm9ySVBDTGltaXRhdGlvbjsKKyAgICAgIH0KKworICAgIC8qIE9uZSBjb25uZWN0aW9uIGNhbiBiZSBtdWx0aXBsZXhlZCBiZXR3ZWVuIHNldmVyYWwgc2Vzc2lvbnMuICovCisKKyAgICBmb3IgKGNudD0wOworCSBjbnQgPCBNQVhfU0VTU0lPTlMgJiYgc29jX2NvbltjbnRdLmluX3VzZTsKKwkgY250KyspOworCisgICAgaWYgKGNudCA+PSBNQVhfU0VTU0lPTlMpCisgICAgICB7CisgICAgICAgIHNwcmludGYoZGZlX2Vycm1zZywKKwkJIkRGRS1pcGMgRVJST1I6IFRvbyBtYW55IGNvbm5lY3Rpb25zIGFscmVhZHkgb3BlbiIpOworICAgICAgICByZXR1cm4gVURJRXJyb3JJUENMaW1pdGF0aW9uOworICAgICAgfQorCisgICAgKlNlc3Npb24gPSByY250OworICAgIHNlc3Npb25bcmNudF0uc29jX2Nvbl9wID0gJnNvY19jb25bY250XTsKKworICAgIGlmIChzdHJjaHIoQ29uZmlnLCAnICcpKQkJLyogdGVzdCBpZiBmaWxlIGVudHJ5IGdpdmVuICovCisgICAgICB7CisgICAgICAgIHNvY19jb25bY250XS5pbl91c2UgPSBUUlVFOworICAgICAgICBzc2NhbmYoQ29uZmlnLCAiJXMgJXMgJXMgJXMgJW4iLAorCSAgICAgICBzb2NfY29uW2NudF0uY29ubmVjdF9pZCwKKwkgICAgICAgc29jX2NvbltjbnRdLmRvbWFpbl9zdHJpbmcsCisJICAgICAgIHNvY19jb25bY250XS50aXBfc3RyaW5nLAorCSAgICAgICBzb2NfY29uW2NudF0udGlwX2V4ZSwKKwkgICAgICAgJnBhcmFtc19wb3MpOworCXRpcF9tYWluX3N0cmluZyA9IENvbmZpZyArIHBhcmFtc19wb3M7CisgICAgICB9CisgICAgZWxzZQkJCQkvKiBoZXJlIGlmIG5lZWQgdG8gcmVhZCB1ZGlfc29jIGZpbGUgKi8KKyAgICAgIHsKKwlzdHJjcHkoY29uZmlnX2ZpbGUsICJ1ZGlfc29jIik7CisJZW52X3AgPSBnZXRlbnYoIlVESUNPTkYiKTsKKwlpZiAoZW52X3ApCisJICBzdHJjcHkoY29uZmlnX2ZpbGUsIGVudl9wKTsKKworCWZkID0gZm9wZW4oY29uZmlnX2ZpbGUsICJyIik7CisKKwlpZiAoIWZkKQorCSAgeworCSAgICBzcHJpbnRmKGRmZV9lcnJtc2csICJVRElDb25uZWN0LCBjYW4ndCBvcGVuIHVkaV9zb2MgZmlsZTpcbiVzICIsCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCSAgICBkZmVfZXJybm8gPSBVRElFcnJvckNhbnRPcGVuQ29uZmlnRmlsZTsKKwkgICAgZ290byB0aXBfZmFpbHVyZTsKKwkgIH0KKworCXdoaWxlICgxKQorCSAgeworCSAgICBpZiAoZnNjYW5mKGZkLCAiJXMgJXMgJXMgJXMgJVteXG5dXG4iLAorCQkgICAgICAgc29jX2NvbltjbnRdLmNvbm5lY3RfaWQsCisJCSAgICAgICBzb2NfY29uW2NudF0uZG9tYWluX3N0cmluZywKKwkJICAgICAgIHNvY19jb25bY250XS50aXBfc3RyaW5nLAorCQkgICAgICAgc29jX2NvbltjbnRdLnRpcF9leGUsCisJCSAgICAgICBzYnVmKSA9PSBFT0YpCisJICAgICAgYnJlYWs7CisKKwkgICAgaWYgKHN0cmNtcChDb25maWcsIHNvY19jb25bY250XS5jb25uZWN0X2lkKSAhPSAwKQorCSAgICAgIGNvbnRpbnVlOworCisJICAgIHNvY19jb25bY250XS5pbl91c2UgPSBUUlVFOyAvKiBoZXJlIGlmIGVudHJ5IGZvdW5kICovCisKKwkgICAgdGlwX21haW5fc3RyaW5nID0gc2J1ZjsKKwkgICAgYnJlYWs7CisJICB9CisKKwlmY2xvc2UoZmQpOworCWlmICghc29jX2NvbltjbnRdLmluX3VzZSkKKwkgIHsKKwkgICAgc3ByaW50ZihkZmVfZXJybXNnLAorCQkgICAgIlVESUNvbm5lY3QsIGNhbid0IGZpbmQgYCVzJyBlbnRyeSBpbiB1ZGlfc29jIGZpbGUiLAorCQkgICAgQ29uZmlnKTsKKwkgICAgZGZlX2Vycm5vID0gVURJRXJyb3JOb1N1Y2hDb25maWd1cmF0aW9uOworCSAgICBnb3RvIHRpcF9mYWlsdXJlOworCSAgfQorICAgICAgfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTRUxFQ1QgRE9NQUlOICovCisgICAgaWYgKHN0cmNtcChzb2NfY29uW2NudF0uZG9tYWluX3N0cmluZywgIkFGX1VOSVgiKSA9PSAwKQorICAgICAgZG9tYWluID0gQUZfVU5JWDsKKyAgICBlbHNlIGlmIChzdHJjbXAoc29jX2NvbltjbnRdLmRvbWFpbl9zdHJpbmcsICJBRl9JTkVUIikgPT0gMCkKKyAgICAgIGRvbWFpbiA9IEFGX0lORVQ7CisgICAgZWxzZQorICAgICAgeworICAgIAlzcHJpbnRmKGRmZV9lcnJtc2csICJERkUtaXBjIEVSUk9SOiBzb2NrZXQgYWRkcmVzcyBmYW1pbHkgbm90IGtub3duIik7CisJZGZlX2Vycm5vID0gVURJRXJyb3JCYWRDb25maWdGaWxlRW50cnk7CisJZ290byB0aXBfZmFpbHVyZTsKKyAgICAgIH0KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1VTFRJUExFWEVEIFNPQ0tFVCA/ICovCisvKiBJZiB0aGUgcmVxdWVzdGVkIHNlc3Npb24gcmVxdWlyZXMgY29tbXVuaWNhdGlvbiB3aXRoCisgICBhIFRJUCB3aGljaCBhbHJlYWR5IGhhcyBhIHNvY2tldCBjb25uZWN0aW9uIGVzdGFibGlzaGVkLAorICAgdGhlbiB3ZSBkbyBub3QgY3JlYXRlIGEgbmV3IHNvY2tldCBidXQgbXVsdGlwbGV4IHRoZQorICAgZXhpc3Rpbmcgb25lLiBBIFRJUCBpcyBzYWlkIHRvIHVzZSB0aGUgc2FtZSBzb2NrZXQgaWYKKyAgIHNvY2tldC1uYW1lL2hvc3QtbmFtZSBhbmQgdGhlIGRvbWFpbiBhcmUgdGhlIHNhbWUuCisgKi8KKyAgICBmb3IgKHJjbnQ9MDsgcmNudCA8IE1BWF9TRVNTSU9OUzsgcmNudCsrKQorICAgICAgeworCWlmIChzb2NfY29uW3JjbnRdLmluX3VzZQorCSAgICAmJiByY250ICE9IGNudAorCSAgICAmJiBzdHJjbXAoc29jX2NvbltjbnRdLmRvbWFpbl9zdHJpbmcsCisJCSAgICAgIHNvY19jb25bcmNudF0uZG9tYWluX3N0cmluZykgPT0gMAorCSAgICAmJiBzdHJjbXAoc29jX2NvbltjbnRdLnRpcF9zdHJpbmcsCisJCSAgICAgIHNvY19jb25bcmNudF0udGlwX3N0cmluZykgPT0gMCkKKwkgIHsKKwkgICAgc2Vzc2lvblsqU2Vzc2lvbl0uc29jX2Nvbl9wID0gJnNvY19jb25bcmNudF07CisJICAgIHNvY19jb25bY250XS5pbl91c2UgPSBGQUxTRTsJLyogZG9uJ3QgbmVlZCBuZXcgY29ubmVjdCAqLworCSAgICBnb3RvIHRpcF9jb25uZWN0OyAKKwl9CisgICAgICB9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTT0NLRVQgKi8KKyAgICBzb2NfY29uW2NudF0uZGZlX3NkID0gc29ja2V0KGRvbWFpbiwgU09DS19TVFJFQU0sIDApOworICAgIGlmIChzb2NfY29uW2NudF0uZGZlX3NkID09IC0xKQorICAgICAgeworICAgIAlzcHJpbnRmKGRmZV9lcnJtc2csICJERkUtaXBjIEVSUk9SLCBzb2NrZXQoKSBjYWxsIGZhaWxlZCAlcyAiLAorCQlzdHJlcnJvciAoZXJybm8pKTsKKwlkZmVfZXJybm8gPSBVRElFcnJvclVua25vd25FcnJvcjsKKwlnb3RvIHRpcF9mYWlsdXJlOworICAgICAgfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBRl9VTklYIENPTk5FQ1QgKi8KKyAgICBpZiAoZG9tYWluID09IEFGX1VOSVgpCisgICAgICB7CisJaWYgKHN0cmNtcChzb2NfY29uW2NudF0udGlwX3N0cmluZywgIioiKSA9PSAwKQorCSAgeworCSAgICBmb3IgKHBvcyA9IDA7IHBvcyA8IDIwOyBwb3MrKykKKwkgICAgICB7CisJCWludCBmOworCisJCXNwcmludGYoc29jX2NvbltjbnRdLnRpcF9zdHJpbmcsIi90bXAvVSVkIiwgZ2V0cGlkKCkgKyBwb3MpOworCQlmID0gb3Blbihzb2NfY29uW2NudF0udGlwX3N0cmluZywgT19DUkVBVCk7CisJCWlmIChmID09IC0xKQorCQkgIGNvbnRpbnVlOworCisJCWNsb3NlKGYpOworCQl1bmxpbmsoc29jX2NvbltjbnRdLnRpcF9zdHJpbmcpOworCQlicmVhazsKKwkgICAgICB9CisKKwkgICAgaWYgKHBvcyA+PSAyMCkKKwkgICAgICB7CisJCXNwcmludGYoZGZlX2Vycm1zZywKKwkJCSJERkUtaXBjIEVSUk9SLCBjYW4ndCBjcmVhdGUgcmFuZG9tIHNvY2tldCBuYW1lIik7CisJCWRmZV9lcnJubyA9IFVESUVycm9yQ2FudENvbm5lY3Q7CisJCWdvdG8gdGlwX2ZhaWx1cmU7CisJICAgICAgfQorCSAgfQorCisgICAgICAgIHNvY19jb25bY250XS50aXBfc29ja2FkZHIuc2FfZmFtaWx5ID0gZG9tYWluOworICAgICAgICBtZW1jcHkoc29jX2NvbltjbnRdLnRpcF9zb2NrYWRkci5zYV9kYXRhLAorCSAgICAgIHNvY19jb25bY250XS50aXBfc3RyaW5nLAorCSAgICAgIHNpemVvZihzb2NfY29uW2NudF0udGlwX3NvY2thZGRyLnNhX2RhdGEpKTsKKyAgICAJaWYgKGNvbm5lY3Qoc29jX2NvbltjbnRdLmRmZV9zZCwKKwkJICAgICZzb2NfY29uW2NudF0udGlwX3NvY2thZGRyLAorCQkgICAgc2l6ZW9mKHNvY19jb25bY250XS50aXBfc29ja2FkZHIpKSkKKwkgIHsgLyogaWYgY29ubmVjdCgpIGZhaWxzIGFzc3VtZSBUSVAgbm90IHlldCBzdGFydGVkICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBRl9VTklYIEVYRUMgKi8KKwkgICAgaW50CXBpZDsKKwkgICAgaW50IHN0YXR1c3A7CisJICAgIGNoYXIgKmFyZzA7CisKKwkgICAgYXJnMCA9IHN0cnJjaHIoc29jX2NvbltjbnRdLnRpcF9leGUsJy8nKTsKKworCSAgICBpZiAoYXJnMCkKKwkgICAgICBhcmcwKys7CisJICAgIGVsc2UKKwkgICAgICBhcmcwID0gc29jX2NvbltjbnRdLnRpcF9leGU7CisgICAgCisJICAgIHBpZCA9IHZmb3JrKCk7CisKKwkgICAgaWYgKHBpZCA9PSAwKQkvKiBDaGlsZCAqLworCSAgICAgIHsKKwkJZXhlY2xwKHNvY19jb25bY250XS50aXBfZXhlLAorCQkgICAgICAgYXJnMCwKKwkJICAgICAgIHNvY19jb25bY250XS5kb21haW5fc3RyaW5nLAorCQkgICAgICAgc29jX2NvbltjbnRdLnRpcF9zdHJpbmcsCisJCSAgICAgICBOVUxMKTsKKwkgICAgICAgIF9leGl0KDEpOworCSAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdhaXRwaWQocGlkLCAmc3RhdHVzcCwgV05PSEFORykpCisJICAgICAgeworCSAgICAgICAgc3ByaW50ZihkZmVfZXJybXNnLCAiREZFLWlwYyBFUlJPUjogY2FuJ3QgZXhlYyB0aGUgVElQIik7CisJICAgICAgICBkZmVfZXJybm8gPSBVRElFcnJvckNhbnRTdGFydFRJUDsKKwkJZ290byB0aXBfZmFpbHVyZTsKKwkgICAgICB9CisKKwkgICAgcG9zID0gMzsKKyAgICAJICAgIGZvciAocG9zID0gMzsgcG9zID4gMDsgcG9zLS0pCisJICAgICAgeworCQlpZiAoIWNvbm5lY3Qoc29jX2NvbltjbnRdLmRmZV9zZCwgCisJCQkgICAgICZzb2NfY29uW2NudF0udGlwX3NvY2thZGRyLAorCQkJICAgICBzaXplb2Yoc29jX2NvbltjbnRdLnRpcF9zb2NrYWRkcikpKQorCQkgIGJyZWFrOworCQlzbGVlcCgxKTsKKwkgICAgICB9CisKKwkgICAgaWYgKHBvcyA9PSAwKQorCSAgICAgIHsKKwkJc3ByaW50ZihkZmVfZXJybXNnLCAiREZFLWlwYyBFUlJPUiwgY29ubmVjdCgpIGNhbGwgZmFpbGVkOiAlcyIsCisJICAgIAkJc3RyZXJyb3IgKGVycm5vKSk7CisJICAgICAgICBkZmVfZXJybm8gPSBVRElFcnJvckNhbnRDb25uZWN0OworCQlnb3RvIHRpcF9mYWlsdXJlOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFGX0lORVQgQ09OTkVDVCAqLworICAgIGVsc2UgaWYgKGRvbWFpbiA9PSBBRl9JTkVUKQorICAgICAgeworCWZwcmludGYoc3RkZXJyLAorCQkiREZFLWlwYyBXQVJOSU5HLCBuZWVkIHRvIGhhdmUgZmlyc3Qgc3RhcnRlZCByZW1vdGUgVElQIik7CisKKwlzb2NfY29uW2NudF0udGlwX3NvY2thZGRyX2luLnNpbl9mYW1pbHkgPSBkb21haW47CisJc29jX2NvbltjbnRdLnRpcF9zb2NrYWRkcl9pbi5zaW5fYWRkci5zX2FkZHIgPQorCSAgICBpbmV0X2FkZHIoc29jX2NvbltjbnRdLnRpcF9zdHJpbmcpOworCWlmIChzb2NfY29uW2NudF0udGlwX3NvY2thZGRyX2luLnNpbl9hZGRyLnNfYWRkciA9PSAtMSkKKwkgIHsKKwkgICAgdGlwX2luZm9fcCA9IGdldGhvc3RieW5hbWUoc29jX2NvbltjbnRdLnRpcF9zdHJpbmcpOworCSAgICBpZiAodGlwX2luZm9fcCA9PSBOVUxMKQorCSAgICAgIHsKKwkJc3ByaW50ZihkZmVfZXJybXNnLCJERkUtaXBjIEVSUk9SLCBObyBzdWNoIGhvc3QgJXMiLAorCQkJc29jX2NvbltjbnRdLnRpcF9zdHJpbmcpOworCSAgICAJZGZlX2Vycm5vID0gVURJRXJyb3JOb1N1Y2hDb25uZWN0aW9uOworCQlnb3RvIHRpcF9mYWlsdXJlOworCSAgICAgIH0KKwkgICAgbWVtY3B5KChjaGFyICopJnNvY19jb25bY250XS50aXBfc29ja2FkZHJfaW4uc2luX2FkZHIsCisJCSAgdGlwX2luZm9fcC0+aF9hZGRyLAorCQkgIHRpcF9pbmZvX3AtPmhfbGVuZ3RoKTsKKwkgIH0KKwlzb2NfY29uW2NudF0udGlwX3NvY2thZGRyX2luLnNpbl9wb3J0CisJICA9IGh0b25zKGF0b2koc29jX2NvbltjbnRdLnRpcF9leGUpKTsKKworICAgIAlpZiAoY29ubmVjdChzb2NfY29uW2NudF0uZGZlX3NkLAorCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmc29jX2NvbltjbnRdLnRpcF9zb2NrYWRkcl9pbiwKKwkJICAgIHNpemVvZihzb2NfY29uW2NudF0udGlwX3NvY2thZGRyX2luKSkpCisJICB7CisgICAgCSAgICBzcHJpbnRmKGRmZV9lcnJtc2csICJERkUtaXBjIEVSUk9SLCBjb25uZWN0KCkgY2FsbCBmYWlsZWQgJXMgIiwKKwkJICAgIHN0cmVycm9yIChlcnJubykpOworCSAgICBkZmVfZXJybm8gPSBVRElFcnJvckNhbnRDb25uZWN0OworCSAgICBnb3RvIHRpcF9mYWlsdXJlOworCSAgfQorICAgICAgfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRJUCBDT05ORUNUICovCisgICAgaWYgKGNudCA9PSAwKSB1ZHJfY3JlYXRlKHVkcnMsIHNvY19jb25bY250XS5kZmVfc2QsIFNPQ19CVUZfU0laRSk7CisKK3RpcF9jb25uZWN0OgorICAgIGN1cnJlbnQgPSBjbnQ7CisgICAgc2Vzc2lvblsqU2Vzc2lvbl0uaW5fdXNlID0gVFJVRTsJLyogc2Vzc2lvbiBpZCBpcyBub3cgaW4gdXNlICovCisKKyAgICB1ZHJfZXJybm8gPSAwOworICAgIHVkcnMtPnVkcl9vcCA9IFVEUl9FTkNPREU7CQkvKiBzZW5kIGFsbCAiaW4iIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJSW50MzIodWRycywgJnNlcnZpY2VfaWQpOworCisgICAgREZFSVBDSWQgPSAoY29tcGFueV9jIDw8IDE2KSArIChwcm9kdWN0X2MgPDwgMTIpICsgdmVyc2lvbl9jOworICAgIHVkcl9VRElVSW50MzIodWRycywgJkRGRUlQQ0lkKTsKKworICAgIHVkcl9zdHJpbmcodWRycywgdGlwX21haW5fc3RyaW5nKTsKKworICAgIHVkcl9zZW5kbm93KHVkcnMpOworCisgICAgdWRycy0+dWRyX29wID0gVURSX0RFQ09ERTsJCS8qIHJlY3YgYWxsICJvdXQiIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJVUludDMyKHVkcnMsICZUSVBJUENJZCk7CisgICAgaWYgKChUSVBJUENJZCAmIDB4ZmZmKSA8IHZlcnNpb25fYykKKyAgICAgIHNwcmludGYoZGZlX2Vycm1zZywgIkRGRS1pcGM6IE9ic29sZXRlIFRJUCBTcGVjaWZpZWQiKTsKKworICAgIHVkcl9VRElJbnQzMih1ZHJzLCAmc29jX2NvbltjbnRdLnRpcF9waWQpOworCisgICAgdWRyX1VESVNlc3Npb25JZCh1ZHJzLCAmc2Vzc2lvblsqU2Vzc2lvbl0udGlwX2lkKTsKKworICAgIHVkcl9VRElFcnJvcih1ZHJzLCAmZGZlX2Vycm5vKTsKKyAgICBpZiAoZGZlX2Vycm5vID4gMCkgVURJS2lsbCgqU2Vzc2lvbiwgMCk7CisKKyAgICByZXR1cm4gZGZlX2Vycm5vOworCit0aXBfZmFpbHVyZToKKworICAgIHNvY19jb25bY250XS5pbl91c2UgPSBGQUxTRTsKKyAgICBzZXNzaW9uWypTZXNzaW9uXS5pbl91c2UgPSBGQUxTRTsKKy8qIFhYWCAtIFNob3VsZCBhbHNvIGNsb3NlIGRmZV9zZCwgYnV0IG5vdCBzdXJlIHdoYXQgdG8gZG8gaWYgbXV4ZWQgKi8KKyAgICByZXR1cm4gZGZlX2Vycm5vOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVURJX0Rpc2Nvbm5lY3QKKyogVURJRGlzY29ubmVjdCgpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGV4aXRpbmcgdGhlCisqIERGRSB0byBlbnN1cmUgcHJvcGVyIHNodXQgZG93biBvZiB0aGUgVElQLgorKi8KK1VESUVycm9yIFVESURpc2Nvbm5lY3QoU2Vzc2lvbiwgIFRlcm1pbmF0ZSkKK1VESVNlc3Npb25JZAlTZXNzaW9uOworVURJQm9vbAkJVGVybWluYXRlOworeworICAgIGludAljbnQ7CisgICAgVURJSW50MzIJc2VydmljZV9pZCA9IFVESURpc2Nvbm5lY3RfYzsKKyAgICBpZihTZXNzaW9uIDwgMCB8fCBTZXNzaW9uID4gTUFYX1NFU1NJT05TKQorICAgIHsKKwlzcHJpbnRmKGRmZV9lcnJtc2csIiBTZXNzaW9uSWQgbm90IHZhbGlkICglZCkiLCBTZXNzaW9uKTsKKwlyZXR1cm4gVURJRXJyb3JOb1N1Y2hDb25maWd1cmF0aW9uOworICAgIH0KKyAgICB1ZHJfZXJybm8gPSAwOworICAgIHVkcnMtPnVkcl9vcCA9IFVEUl9FTkNPREU7CQkvKiBzZW5kIGFsbCAiaW4iIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJSW50MzIodWRycywgJnNlcnZpY2VfaWQpOworICAgIHVkcl9VRElTZXNzaW9uSWQodWRycywgJnNlc3Npb25bU2Vzc2lvbl0udGlwX2lkKTsKKyAgICB1ZHJfVURJQm9vbCh1ZHJzLCAmVGVybWluYXRlKTsKKyAgICB1ZHJfc2VuZG5vdyh1ZHJzKTsKKworICAgIHNlc3Npb25bU2Vzc2lvbl0uaW5fdXNlID0gRkFMU0U7CS8qIHNlc3Npb24gaWQgaXMgbm93IGZyZWUgKi8KKyAgICBmb3IgKGNudD0wOyBjbnQgPCBNQVhfU0VTU0lPTlM7IGNudCsrKQorICAgICAgICBpZihzZXNzaW9uW2NudF0uaW5fdXNlCisJJiYgc2Vzc2lvbltjbnRdLnNvY19jb25fcCA9PSBzZXNzaW9uW1Nlc3Npb25dLnNvY19jb25fcAorCQkpIGJyZWFrOworICAgIGlmKGNudCA+PSBNQVhfU0VTU0lPTlMpCS8qIHRlc3QgaWYgc29ja2V0IG5vdCBtdWx0aXBsZXhlZCAqLworICAgICAgICBpZihzaHV0ZG93bihzZXNzaW9uW1Nlc3Npb25dLnNvY19jb25fcC0+ZGZlX3NkLCAyKSkKKyAgICAgICAgeworICAgICAJICAgIHNwcmludGYoZGZlX2Vycm1zZywgIkRGRS1pcGMgV0FSTklORzogc29ja2V0IHNodXRkb3duIGZhaWxlZCIpOworCSAgICByZXR1cm4gVURJRXJyb3JJUENJbnRlcm5hbDsKKyAgICAgICAgfQorCWVsc2UKKwkgIHNlc3Npb25bU2Vzc2lvbl0uc29jX2Nvbl9wLT5pbl91c2UgPSAwOworCisgICAgdWRycy0+dWRyX29wID0gVURSX0RFQ09ERTsJCS8qIHJlY2VpdmUgYWxsICJvdXQiIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJRXJyb3IodWRycywgJmRmZV9lcnJubyk7CS8qIGdldCBhbnkgVElQIGVycm9yICovCisgICAgcmV0dXJuIGRmZV9lcnJubzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9LSUxMCisqIFVESUtpbGwoKSBpcyB1c2VkIHRvIHNlbmQgYSBzaWduYWwgdG8gdGhlIFRJUC4KKyogVGhpcyBpcyBhIHByaXZhdGUgSVBDIGNhbGwuCisqLworVURJRXJyb3IgVURJS2lsbChTZXNzaW9uLCAgU2lnbmFsKQorVURJU2Vzc2lvbklkCVNlc3Npb247CitVRElJbnQzMglTaWduYWw7Cit7CisgICAgaW50CWNudDsKKyAgICBVRElJbnQzMglzZXJ2aWNlX2lkID0gVURJS2lsbF9jOworICAgIGlmKFNlc3Npb24gPCAwIHx8IFNlc3Npb24gPiBNQVhfU0VTU0lPTlMpCisgICAgeworCXNwcmludGYoZGZlX2Vycm1zZywiIFNlc3Npb25JZCBub3QgdmFsaWQgKCVkKSIsIFNlc3Npb24pOworCXJldHVybiBVRElFcnJvck5vU3VjaENvbmZpZ3VyYXRpb247CisgICAgfQorICAgIHVkcl9lcnJubyA9IDA7CisgICAgdWRycy0+dWRyX29wID0gVURSX0VOQ09ERTsJCS8qIHNlbmQgYWxsICJpbiIgcGFyYW1ldGVycyAqLworICAgIHVkcl9VRElJbnQzMih1ZHJzLCAmc2VydmljZV9pZCk7CisgICAgdWRyX1VESVNlc3Npb25JZCh1ZHJzLCAmc2Vzc2lvbltTZXNzaW9uXS50aXBfaWQpOworICAgIHVkcl9VRElJbnQzMih1ZHJzLCAmU2lnbmFsKTsKKyAgICB1ZHJfc2VuZG5vdyh1ZHJzKTsKKworICAgIHNlc3Npb25bU2Vzc2lvbl0uaW5fdXNlID0gRkFMU0U7CS8qIHNlc3Npb24gaWQgaXMgbm93IGZyZWUgKi8KKyAgICBmb3IgKGNudD0wOyBjbnQgPCBNQVhfU0VTU0lPTlM7IGNudCsrKQorICAgICAgICBpZihzZXNzaW9uW2NudF0uaW5fdXNlCisJJiYgc2Vzc2lvbltjbnRdLnNvY19jb25fcCA9PSBzZXNzaW9uW1Nlc3Npb25dLnNvY19jb25fcAorCQkpIGJyZWFrOworICAgIGlmKGNudCA8IE1BWF9TRVNTSU9OUykJLyogdGVzdCBpZiBzb2NrZXQgbm90IG11bHRpcGxleGVkICovCisgICAgICAgIGlmKHNodXRkb3duKHNlc3Npb25bU2Vzc2lvbl0uc29jX2Nvbl9wLT5kZmVfc2QsIDIpKQorICAgICAgICB7CisgICAgIAkgICAgc3ByaW50ZihkZmVfZXJybXNnLCAiREZFLWlwYyBXQVJOSU5HOiBzb2NrZXQgc2h1dGRvd24gZmFpbGVkIik7CisJICAgIHJldHVybiBVRElFcnJvcklQQ0ludGVybmFsOworICAgICAgICB9CisJZWxzZQorCSAgc2Vzc2lvbltTZXNzaW9uXS5zb2NfY29uX3AtPmluX3VzZSA9IDA7CisKKyAgICB1ZHJzLT51ZHJfb3AgPSBVRFJfREVDT0RFOwkJLyogcmVjZWl2ZSBhbGwgIm91dCIgcGFyYW1ldGVycyAqLworICAgIHVkcl9VRElFcnJvcih1ZHJzLCAmZGZlX2Vycm5vKTsJLyogZ2V0IGFueSBUSVAgZXJyb3IgKi8KKyAgICByZXR1cm4gZGZlX2Vycm5vOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVURJX1NldF9DdXJyZW50X0Nvbm5lY3Rpb24KKyogSWYgeW91IGFyZSBjb25uZWN0ZWQgdG8gbXVsdGlwbGUgVElQcywgeW91IGNhbiBjaGFuZ2UKKyogVElQcyB1c2luZyBVRElTZXRDdXJyZW50Q29ubmVjdGlvbigpLgorKi8KK1VESUVycm9yIFVESVNldEN1cnJlbnRDb25uZWN0aW9uKFNlc3Npb24pCitVRElTZXNzaW9uSWQJU2Vzc2lvbjsKK3sKKyAgICBVRElJbnQzMglzZXJ2aWNlX2lkID0gVURJU2V0Q3VycmVudENvbm5lY3Rpb25fYzsKKworICAgIGlmKFNlc3Npb24gPCAwIHx8IFNlc3Npb24gPiBNQVhfU0VTU0lPTlMpCisJcmV0dXJuIFVESUVycm9yTm9TdWNoQ29uZmlndXJhdGlvbjsKKyAgICBpZighc2Vzc2lvbltTZXNzaW9uXS5pbl91c2UpIAkJLyogdGVzdCBpZiBub3QgaW4gdXNlIHlldCAqLworCXJldHVybiBVRElFcnJvck5vU3VjaENvbm5lY3Rpb247CisKKyAgICBjdXJyZW50ID0gU2Vzc2lvbjsKKyAgICAvKiBjaGFuZ2Ugc29ja2V0IG9yIG11bHRpcGxleCB0aGUgc2FtZSBzb2NrZXQgICovCisgICAgdWRycy0+c2QgPSBzZXNzaW9uW1Nlc3Npb25dLnNvY19jb25fcC0+ZGZlX3NkOworCisgICAgdWRyX2Vycm5vID0gMDsKKyAgICB1ZHJzLT51ZHJfb3AgPSBVRFJfRU5DT0RFOwkJLyogc2VuZCBhbGwgImluIiBwYXJhbWV0ZXJzICovCisgICAgdWRyX1VESUludDMyKHVkcnMsICZzZXJ2aWNlX2lkKTsKKyAgICB1ZHJfVURJU2Vzc2lvbklkKHVkcnMsICZzZXNzaW9uW1Nlc3Npb25dLnRpcF9pZCk7CisgICAgdWRyX3NlbmRub3codWRycyk7CisgICAgaWYodWRyX2Vycm5vKSByZXR1cm4gdWRyX2Vycm5vOworCisgICAgdWRycy0+dWRyX29wID0gVURSX0RFQ09ERTsJCS8qIHJlY2VpdmUgYWxsICJvdXQiIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJRXJyb3IodWRycywgJmRmZV9lcnJubyk7CS8qIGdldCBhbnkgVElQIGVycm9yICovCisgICAgcmV0dXJuIGRmZV9lcnJubzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRElfQ2FwYWJpbGl0aWVzCisqIFRoZSBERkUgdXNlcyBVRElDYXBhYmlsaXRpZXMoKSB0byBib3RoIGluZm9ybSB0aGUgVElQCisqIG9mIHdoYXQgc2VydmljZXMgdGhlIERGRSBvZmZlcnMgYW5kIHRvIGlucXVpcmUgb2YgdGhlCisqIFRJUCB3aGF0IHNlcnZpY2VzIHRoZSBUSVAgb2ZmZXJzLgorKi8KK1VESUVycm9yIFVESUNhcGFiaWxpdGllcyhUSVBJZCwgVGFyZ2V0SWQsIERGRUlkLCBERkUsIFRJUCwgREZFSVBDSWQsCisJCVRJUElQQ0lkLCBUSVBTdHJpbmcpCitVRElVSW50MzIJKlRJUElkOwkJLyogb3V0ICovCitVRElVSW50MzIJKlRhcmdldElkOwkvKiBvdXQgKi8KK1VESVVJbnQzMglERkVJZDsJCS8qIGluICovCitVRElVSW50MzIJREZFOwkJLyogaW4gKi8KK1VESVVJbnQzMgkqVElQOwkJLyogb3V0ICovCitVRElVSW50MzIJKkRGRUlQQ0lkOwkvKiBvdXQgKi8KK1VESVVJbnQzMgkqVElQSVBDSWQ7CS8qIG91dCAqLworY2hhcgkJKlRJUFN0cmluZzsJLyogb3V0ICovCit7CisgICAgVURJSW50MzIJc2VydmljZV9pZCA9IFVESUNhcGFiaWxpdGllc19jOworICAgIGludAkJc2l6ZTsKKworICAgIHVkcl9lcnJubyA9IDA7CisgICAgdWRycy0+dWRyX29wID0gVURSX0VOQ09ERTsJCS8qIHNlbmQgYWxsICJpbiIgcGFyYW1ldGVycyAqLworICAgIHVkcl9VRElJbnQzMih1ZHJzLCAmc2VydmljZV9pZCk7CisgICAgdWRyX1VESUludDMyKHVkcnMsICZERkVJZCk7CisgICAgdWRyX1VESUludDMyKHVkcnMsICZERkUpOworICAgIHVkcl9zZW5kbm93KHVkcnMpOworICAgIGlmKHVkcl9lcnJubykgcmV0dXJuIHVkcl9lcnJubzsKKworICAgIHVkcnMtPnVkcl9vcCA9IFVEUl9ERUNPREU7CQkvKiByZWNlaXZlIGFsbCAib3V0IiBwYXJhbXRlcnMgKi8KKyAgICB1ZHJfVURJSW50MzIodWRycywgVElQSWQpOworICAgIHVkcl9VRElJbnQzMih1ZHJzLCBUYXJnZXRJZCk7CisgICAgdWRyX1VESUludDMyKHVkcnMsIFRJUCk7CisgICAgdWRyX1VESUludDMyKHVkcnMsIERGRUlQQ0lkKTsKKyAgICAqREZFSVBDSWQgPSAoY29tcGFueV9jIDw8IDE2KSArIChwcm9kdWN0X2MgPDwgMTIpICsgdmVyc2lvbl9jOworICAgIHVkcl9VRElJbnQzMih1ZHJzLCBUSVBJUENJZCk7CisgICAgdWRyX3N0cmluZyh1ZHJzLCBzYnVmKTsKKyAgICB1ZHJfVURJRXJyb3IodWRycywgJmRmZV9lcnJubyk7CS8qIGdldCBhbnkgVElQIGVycm9yICovCisgICAgc2l6ZSA9IHN0cmxlbihzYnVmKTsKKyAgICBpZihzaXplICsxID4gODApIHJldHVybiAtMTsJCS8qIHRlc3QgaWYgc3VmZmljaWVudCBzcGFjZSAqLworICAgIHN0cmNweShUSVBTdHJpbmcsIHNidWYpOworICAgIHJldHVybiBkZmVfZXJybm87Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9FbnVtZXJhdGVfVElQcworKiBVc2VkIGJ5IHRoZSBERkUgdG8gZW5xdWlyZSBhYm91dCBhdmFpbGFibGUgVElQCisqIGNvbm5lY3Rpb25zLgorKi8KK1VESUVycm9yIFVESUVudW1lcmF0ZVRJUHMoVURJRVRDYWxsYmFjaykKKyAgaW50ICgqVURJRVRDYWxsYmFjaykoKTsJCS8qIEluIC0tIGZ1bmN0aW9uIHRvIGNhbGxiYWNrICovCit7CisgICAgRklMRQkqZnA7CisKKyAgICBmcCA9IGZvcGVuKGNvbmZpZ19maWxlLCAiciIpOworICAgIGlmKGZwID09IE5VTEwpCisJcmV0dXJuIFVESUVycm9yQ2FudE9wZW5Db25maWdGaWxlOworICAgIHdoaWxlKGZnZXRzKCBzYnVmLCBTQlVGX1NJWkUsIGZwKSkKKwlpZihVRElFVENhbGxiYWNrKCBzYnVmKSA9PSBVRElUZXJtaW5hdGVFbnVtZXJhdGlvbikKKwkgICAgYnJlYWs7CisgICAgZmNsb3NlKCBmcCk7CisgICAgcmV0dXJuIFVESU5vRXJyb3I7CQkJLyogcmV0dXJuIHN1Y2Nlc3MgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9HRVRfRVJST1JfTVNHCisqIFNvbWUgZXJyb3JzIGFyZSB0YXJnZXQgc3BlY2lmaWMuIFRoZXkgYXJlIGluZGljYXRlZAorKiBieSBhIG5lZ2F0aXZlIGVycm9yIHJldHVybiB2YWx1ZS4gVGhlIERGRSB1c2VzCisqIFVESUdldEVycm9yTXNnKCkgdG8gZ2V0IHRoZSBkZXNjcmlwdGl2ZSB0ZXh0IGZvcgorKiB0aGUgZXJyb3IgbWVzc2FnZSB3aGljaCBjYW4gdGhlbiAgYmUgIGRpc3BsYXllZCAgdG8KKyogdGhlIHVzZXIuCisqLworVURJRXJyb3IgVURJR2V0RXJyb3JNc2coZXJyb3JfY29kZSwgbXNnX2xlbiwgbXNnLCBDb3VudERvbmUpCitVRElFcnJvcgllcnJvcl9jb2RlOwkJLyogSW4gKi8KK1VESVNpemVUCW1zZ19sZW47CQkvKiBJbiAgLS0gYWxsb3dlZCBtZXNzYWdlIHNwYWNlICovCitjaGFyKgkJbXNnOwkJCS8qIE91dCAtLSBsZW5ndGggb2YgbWVzc2FnZSovCitVRElTaXplVAkqQ291bnREb25lOwkJLyogT3V0IC0tIG51bWJlciBvZiBjaGFyYWN0ZXJzICovCit7CisgICAgVURJSW50MzIJc2VydmljZV9pZCA9IFVESUdldEVycm9yTXNnX2M7CisgICAgaW50CQlzaXplOworCisgICAgdWRyX2Vycm5vID0gMDsKKyAgICB1ZHJzLT51ZHJfb3AgPSBVRFJfRU5DT0RFOwkJLyogc2VuZCBhbGwgImluIiBwYXJhbWV0ZXJzICovCisgICAgdWRyX1VESUludDMyKHVkcnMsICZzZXJ2aWNlX2lkKTsKKyAgICB1ZHJfVURJRXJyb3IodWRycywgJmVycm9yX2NvZGUpOworICAgIHVkcl9VRElTaXplVCh1ZHJzLCAmbXNnX2xlbik7CisgICAgdWRyX3NlbmRub3codWRycyk7CisgICAgaWYodWRyX2Vycm5vKSByZXR1cm4gdWRyX2Vycm5vOworCisgICAgdWRycy0+dWRyX29wID0gVURSX0RFQ09ERTsJCS8qIHJlY2VpdmUgYWxsICJvdXQiIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfc3RyaW5nKHVkcnMsIHNidWYpOworICAgIHVkcl9VRElTaXplVCh1ZHJzLCBDb3VudERvbmUpOworICAgIHVkcl9VRElFcnJvcih1ZHJzLCAmZGZlX2Vycm5vKTsJLyogZ2V0IGFueSBUSVAgZXJyb3IgKi8KKyAgICBzaXplID0gc3RybGVuKHNidWYpOworICAgIGlmKHNpemUgKzEgPiBtc2dfbGVuKSByZXR1cm4gLTE7CS8qIHRlc3QgaWYgc3VmZmljaWVudCBzcGFjZSAqLworICAgIHN0cmNweShtc2csIHNidWYpOworICAgIHJldHVybiBkZmVfZXJybm87Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9HRVRfVEFSR0VUX0NPTkZJRworKiBVRElHZXRUYXJnZXRDb25maWcoKSBnZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXJnZXQuCisqLworVURJRXJyb3IgVURJR2V0VGFyZ2V0Q29uZmlnKEtub3duTWVtb3J5LCBOdW1iZXJPZlJhbmdlcywgQ2hpcFZlcnNpb25zLAorCQlOdW1iZXJPZkNoaXBzKQorVURJTWVtb3J5UmFuZ2UJS25vd25NZW1vcnlbXTsJCS8qIE91dCAqLworVURJSW50CQkqTnVtYmVyT2ZSYW5nZXM7CS8qIEluIGFuZCBPdXQgKi8KK1VESVVJbnQzMglDaGlwVmVyc2lvbnNbXTsJCS8qIE91dCAqLworVURJSW50CQkqTnVtYmVyT2ZDaGlwczsJCS8qIEluIGFuZCBPdXQgKi8KK3sKKyAgICBVRElJbnQzMglzZXJ2aWNlX2lkID0gVURJR2V0VGFyZ2V0Q29uZmlnX2M7CisgICAgaW50CQljbnQ7CisgICAgaW50CQlNYXhPZlJhbmdlcyA9ICpOdW1iZXJPZlJhbmdlczsKKworICAgIHVkcl9lcnJubyA9IDA7CisgICAgdWRycy0+dWRyX29wID0gVURSX0VOQ09ERTsJCS8qIHNlbmQgYWxsICJpbiIgcGFyYW1ldGVycyAqLworICAgIHVkcl9VRElJbnQzMih1ZHJzLCAmc2VydmljZV9pZCk7CisgICAgdWRyX1VESUludCh1ZHJzLCBOdW1iZXJPZlJhbmdlcyk7CisgICAgdWRyX1VESUludCh1ZHJzLCBOdW1iZXJPZkNoaXBzKTsKKyAgICB1ZHJfc2VuZG5vdyh1ZHJzKTsKKyAgICBpZih1ZHJfZXJybm8pIHJldHVybiB1ZHJfZXJybm87CisKKyAgICB1ZHJzLT51ZHJfb3AgPSBVRFJfREVDT0RFOwkJLyogcmVjZWl2ZSBhbGwgIm91dCIgcGFyYW10ZXJzICovCisgICAgZm9yKGNudD0xOyBjbnQgPD0gTWF4T2ZSYW5nZXM7IGNudCsrKQorICAgIAl1ZHJfVURJTWVtb3J5UmFuZ2UodWRycywgJktub3duTWVtb3J5W2NudC0xXSk7CisgICAgdWRyX1VESUludCh1ZHJzLCBOdW1iZXJPZlJhbmdlcyk7CisgICAgdWRyX1VESUludCh1ZHJzLCBOdW1iZXJPZkNoaXBzKTsKKyAgICBmb3IoY250PTE7IGNudCA8PSAqTnVtYmVyT2ZDaGlwczsgY250KyspCisgICAgCXVkcl9VRElVSW50MzIodWRycywgJkNoaXBWZXJzaW9uc1tjbnQgLTFdKTsKKyAgICB1ZHJfVURJRXJyb3IodWRycywgJmRmZV9lcnJubyk7CS8qIGdldCBhbnkgVElQIGVycm9yICovCisgICAgcmV0dXJuIGRmZV9lcnJubzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVURJX0NSRUFURV9QUkNPRVNTCisqIFVESUNyZWF0ZVByb2Nlc3MoKSB0ZWxscyB0aGUgIHRhcmdldCAgT1MgIHRoYXQgIGEKKyogcHJvY2VzcyBpcyB0byBiZSBjcmVhdGVkIGFuZCBnZXRzIGEgUElEIGJhY2sgdW5sZXNzCisqIHRoZXJlIGlzIHNvbWUgZXJyb3IuCisqLworVURJRXJyb3IgVURJQ3JlYXRlUHJvY2VzcyhwaWQpCitVRElQSWQJKnBpZDsJLyogb3V0ICovCit7CisgICAgVURJSW50MzIJc2VydmljZV9pZCA9IFVESUNyZWF0ZVByb2Nlc3NfYzsKKworICAgIHVkcl9lcnJubyA9IDA7CisgICAgdWRycy0+dWRyX29wID0gVURSX0VOQ09ERTsJCS8qIHNlbmQgYWxsICJpbiIgcGFyYW1ldGVycyAqLworICAgIHVkcl9VRElJbnQzMih1ZHJzLCAmc2VydmljZV9pZCk7CisgICAgdWRyX3NlbmRub3codWRycyk7CisgICAgaWYodWRyX2Vycm5vKSByZXR1cm4gdWRyX2Vycm5vOworCisgICAgdWRycy0+dWRyX29wID0gVURSX0RFQ09ERTsJCS8qIHJlY2VpdmUgYWxsICJvdXQiIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJUElkKHVkcnMsIHBpZCk7CisgICAgdWRyX1VESUVycm9yKHVkcnMsICZkZmVfZXJybm8pOwkvKiBnZXQgYW55IFRJUCBlcnJvciAqLworICAgIHJldHVybiBkZmVfZXJybm87Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRElfU2V0X0N1cnJlbnRfUHJvY2VzcworKiBVRElTZXRDdXJyZW50UHJvY2VzcyAgdXNlcyAgIGEgICBwaWQgICBzdXBwbGllZCAgIGJ5CisqIFVESUNyZWF0ZVByb2Nlc3MgIGFuZCAgc2V0cyBpdCBhcyB0aGUgZGVmYXVsdCBmb3IgYWxsCisqIHVkaSBjYWxscyB1bnRpbCBhIG5ldyBvbmUgaXMgc2V0LiAgQSB1c2VyIG9mICBhCisqLworVURJRXJyb3IgVURJU2V0Q3VycmVudFByb2Nlc3MgKHBpZCkKK1VESVBJZAlwaWQ7CQkJLyogSW4gKi8KK3sKKyAgICBVRElJbnQzMglzZXJ2aWNlX2lkID0gVURJU2V0Q3VycmVudFByb2Nlc3NfYzsKKworICAgIHVkcl9lcnJubyA9IDA7CisgICAgdWRycy0+dWRyX29wID0gVURSX0VOQ09ERTsJCS8qIHNlbmQgYWxsICJpbiIgcGFyYW1ldGVycyAqLworICAgIHVkcl9VRElJbnQzMih1ZHJzLCAmc2VydmljZV9pZCk7CisgICAgdWRyX1VESVBJZCh1ZHJzLCAmcGlkKTsKKyAgICB1ZHJfc2VuZG5vdyh1ZHJzKTsKKyAgICBpZih1ZHJfZXJybm8pIHJldHVybiB1ZHJfZXJybm87CisKKyAgICB1ZHJzLT51ZHJfb3AgPSBVRFJfREVDT0RFOwkJLyogcmVjZWl2ZSBhbGwgIm91dCIgcGFyYW1ldGVycyAqLworICAgIHVkcl9VRElFcnJvcih1ZHJzLCAmZGZlX2Vycm5vKTsJLyogZ2V0IGFueSBUSVAgZXJyb3IgKi8KKyAgICByZXR1cm4gZGZlX2Vycm5vOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9JTklUSUFMSVNFX1BST0NFU1MKKyogVURJSW5pdGlhbGl6ZVByb2Nlc3MoKSBwcmVwYXJlIHByb2Nlc3MgZm9yCisqIGV4ZWN1dGlvbi4gKFJlc2V0IHByb2Nlc3NvciBpZiBwcm9jZXNzIG9zIHByb2Nlc3NvcikuCisqLworVURJRXJyb3IgVURJSW5pdGlhbGl6ZVByb2Nlc3MoIFByb2Nlc3NNZW1vcnksIE51bWJlck9mUmFuZ2VzLCBFbnRyeVBvaW50LAorCQlTdGFja1NpemVzLCBOdW1iZXJPZlN0YWNrcywgQXJnU3RyaW5nKQorVURJTWVtb3J5UmFuZ2UJUHJvY2Vzc01lbW9yeVtdOwkvKiBJbiAqLworVURJSW50CQlOdW1iZXJPZlJhbmdlczsJCS8qIEluICovCitVRElSZXNvdXJjZQlFbnRyeVBvaW50OwkJLyogSW4gKi8KK0NQVVNpemVUCSpTdGFja1NpemVzOwkJLyogSW4gKi8KK1VESUludAkJTnVtYmVyT2ZTdGFja3M7CQkvKiBJbiAqLworY2hhcgkJKkFyZ1N0cmluZzsJCS8qIEluICovCit7CisgICAgVURJSW50MzIJc2VydmljZV9pZCA9IFVESUluaXRpYWxpemVQcm9jZXNzX2M7CisgICAgaW50CQljbnQ7CisKKyAgICB1ZHJfZXJybm8gPSAwOworICAgIHVkcnMtPnVkcl9vcCA9IFVEUl9FTkNPREU7CQkvKiBzZW5kIGFsbCAiaW4iIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJSW50MzIodWRycywgJnNlcnZpY2VfaWQpOworICAgIHVkcl9VRElJbnQodWRycywgJk51bWJlck9mUmFuZ2VzKTsKKyAgICBmb3IoY250ID0gMDsgY250IDwgTnVtYmVyT2ZSYW5nZXM7IGNudCsrKQorCXVkcl9VRElNZW1vcnlSYW5nZSh1ZHJzLCAmUHJvY2Vzc01lbW9yeVtjbnRdICk7CisgICAgdWRyX1VESVJlc291cmNlKHVkcnMsICZFbnRyeVBvaW50KTsKKyAgICB1ZHJfVURJSW50KHVkcnMsICZOdW1iZXJPZlN0YWNrcyk7CisgICAgZm9yKGNudCA9IDA7IGNudCA8IE51bWJlck9mU3RhY2tzOyBjbnQrKykKKwl1ZHJfQ1BVU2l6ZVQodWRycywgJlN0YWNrU2l6ZXNbY250XSk7CisgICAgdWRyX3N0cmluZyh1ZHJzLCBBcmdTdHJpbmcpOworICAgIHVkcl9zZW5kbm93KHVkcnMpOworICAgIGlmKHVkcl9lcnJubykgcmV0dXJuIHVkcl9lcnJubzsKKworICAgIHVkcnMtPnVkcl9vcCA9IFVEUl9ERUNPREU7CQkvKiByZWNlaXZlIGFsbCAib3V0IiBwYXJhbWV0ZXJzICovCisgICAgdWRyX1VESUVycm9yKHVkcnMsICZkZmVfZXJybm8pOwkvKiBnZXQgYW55IFRJUCBlcnJvciAqLworICAgIHJldHVybiBkZmVfZXJybm87Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVURJX0RFU1RST1lfUFJPQ0VTUworKiBVRElEZXN0cm95UHJvY2VzcygpIGZyZWVzIGEgcHJvY2VzcyByZXNvdXJjZQorKiBwcmV2aW91c2x5IGNyZWF0ZWQgYnkgVURJQ3JlYXRlUHJvY2VzcygpLgorKi8KK1VESUVycm9yIFVESURlc3Ryb3lQcm9jZXNzKHBpZCkKK1VESVBJZCAgIHBpZDsJLyogaW4gKi8KK3sKKyAgICBVRElJbnQzMglzZXJ2aWNlX2lkID0gVURJRGVzdHJveVByb2Nlc3NfYzsKKworICAgIHVkcl9lcnJubyA9IDA7CisgICAgdWRycy0+dWRyX29wID0gVURSX0VOQ09ERTsJCS8qIHNlbmQgYWxsICJpbiIgcGFyYW1ldGVycyAqLworICAgIHVkcl9VRElJbnQzMih1ZHJzLCAmc2VydmljZV9pZCk7CisgICAgdWRyX1VESVBJZCh1ZHJzLCAmcGlkKTsKKyAgICB1ZHJfc2VuZG5vdyh1ZHJzKTsKKyAgICBpZih1ZHJfZXJybm8pIHJldHVybiB1ZHJfZXJybm87CisKKyAgICB1ZHJzLT51ZHJfb3AgPSBVRFJfREVDT0RFOwkJLyogcmVjZWl2ZSBhbGwgIm91dCIgcGFyYW1ldGVycyAqLworICAgIHVkcl9VRElFcnJvcih1ZHJzLCAmZGZlX2Vycm5vKTsJLyogZ2V0IGFueSBUSVAgZXJyb3IgKi8KKyAgICByZXR1cm4gZGZlX2Vycm5vOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9SRUFECisqIFVESVJlYWQoKSByZWFkcyBhIGJsb2NrIG9mIG9iamVjdHMgZnJvbSAgYSAgdGFyZ2V0CisqIGFkZHJlc3Mgc3BhY2UgIHRvIGhvc3Qgc3BhY2UuCisqLworCitVRElFcnJvciBVRElSZWFkIChmcm9tLCB0bywgY291bnQsIHNpemUsIGNvdW50X2RvbmUsIGhvc3RfZW5kaWFuKQorVURJUmVzb3VyY2UJZnJvbTsJCS8qIGluIC0gc291cmNlIGFkZHJlc3Mgb24gdGFyZ2V0ICovCitVRElIb3N0TWVtUHRyCXRvOwkJLyogb3V0IC0gZGVzdGluYXRpb24gYWRkcmVzcyBvbiBob3N0ICovCitVRElDb3VudAljb3VudDsJCS8qIGluIC0tIGNvdW50IG9mIG9iamVjdHMgdG8gYmUgdHJhbnNmZXJyZWQgKi8KK1VESVNpemVUCXNpemU7CQkvKiBpbiAtLSBzaXplIG9mIGVhY2ggb2JqZWN0ICovCitVRElDb3VudAkqY291bnRfZG9uZTsJLyogb3V0IC0gY291bnQgYWN0dWFsbHkgdHJhbnNmZXJyZWQgKi8KK1VESUJvb2wJCWhvc3RfZW5kaWFuOwkvKiBpbiAtLSBmbGFnIGZvciBlbmRpYW4gaW5mb3JtYXRpb24gKi8KK3sKKyAgICBVRElJbnQzMglzZXJ2aWNlX2lkID0gVURJUmVhZF9jOworICAgIGludAkJYnl0ZV9jb3VudDsKKworICAgIHVkcl9lcnJubyA9IDA7CisgICAgdWRycy0+dWRyX29wID0gVURSX0VOQ09ERTsJCS8qIHNlbmQgYWxsICJpbiIgcGFyYW1ldGVycyAqLworICAgIHVkcl9VRElJbnQzMih1ZHJzLCAmc2VydmljZV9pZCk7CisgICAgdWRyX1VESVJlc291cmNlKHVkcnMsICZmcm9tKTsKKyAgICB1ZHJfVURJQ291bnQodWRycywgJmNvdW50KTsKKyAgICB1ZHJfVURJU2l6ZVQodWRycywgJnNpemUpOworICAgIHVkcl9VRElCb29sKHVkcnMsICZob3N0X2VuZGlhbik7CisgICAgdWRyX3NlbmRub3codWRycyk7CisgICAgaWYodWRyX2Vycm5vKSByZXR1cm4gdWRyX2Vycm5vOworCisgICAgdWRycy0+dWRyX29wID0gVURSX0RFQ09ERTsJCS8qIHJlY2VpdmUgYWxsICJvdXQiIHBhcmFtdGVycyAqLworICAgIHVkcl9VRElDb3VudCh1ZHJzLCBjb3VudF9kb25lKTsKKyAgICBieXRlX2NvdW50ID0gKCpjb3VudF9kb25lKSAqIHNpemU7CisgICAgaWYoKmNvdW50X2RvbmUgPiAwICYmICpjb3VudF9kb25lIDw9IGNvdW50KQorICAgICAgICB1ZHJfYnl0ZXModWRycywgdG8sIGJ5dGVfY291bnQpOworICAgIGlmKHVkcl9lcnJubykgcmV0dXJuIHVkcl9lcnJubzsKKyAgICB1ZHJfVURJRXJyb3IodWRycywgJmRmZV9lcnJubyk7CS8qIGdldCBhbnkgVElQIGVycm9yICovCisgICAgcmV0dXJuIGRmZV9lcnJubzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRElfV1JJVEUKKyogVURJV3JpdGUoKSB3cml0ZXMgYSBibG9jayAgb2YgIG9iamVjdHMgIGZyb20gIGhvc3QKKyogc3BhY2UgIHRvICBhICB0YXJnZXQgIGFkZHJlc3Mrc3BhY2UuCisqLworVURJRXJyb3IgVURJV3JpdGUoIGZyb20sIHRvLCBjb3VudCwgc2l6ZSwgY291bnRfZG9uZSwgaG9zdF9lbmRpYW4gKQorVURJSG9zdE1lbVB0cglmcm9tOwkJLyogaW4gLS0gc291cmNlIGFkZHJlc3Mgb24gaG9zdCAqLworVURJUmVzb3VyY2UJdG87CQkvKiBpbiAtLSBkZXN0aW5hdGlvbiBhZGRyZXNzIG9uIHRhcmdldCAqLworVURJQ291bnQJY291bnQ7CQkvKiBpbiAtLSBjb3VudCBvZiBvYmplY3RzIHRvIGJlIHRyYW5zZmVycmVkICovCitVRElTaXplVAlzaXplOwkJLyogaW4gLS0gc2l6ZSBvZiBlYWNoIG9iamVjdCAqLworVURJQ291bnQJKmNvdW50X2RvbmU7CS8qIG91dCAtIGNvdW50IGFjdHVhbGx5IHRyYW5zZmVycmVkICovCitVRElCb29sCQlob3N0X2VuZGlhbjsJLyogaW4gLS0gZmxhZyBmb3IgZW5kaWFuIGluZm9ybWF0aW9uICovCit7CisgICAgVURJSW50MzIJc2VydmljZV9pZCA9IFVESVdyaXRlX2M7CisgICAgaW50CQlieXRlX2NvdW50ID0gY291bnQgKiBzaXplOworCisgICAgdWRyX2Vycm5vID0gMDsKKyAgICB1ZHJzLT51ZHJfb3AgPSBVRFJfRU5DT0RFOwkJLyogc2VuZCBhbGwgImluIiBwYXJhbWV0ZXJzICovCisgICAgdWRyX1VESUludDMyKHVkcnMsICZzZXJ2aWNlX2lkKTsKKyAgICB1ZHJfVURJUmVzb3VyY2UodWRycywgJnRvKTsKKyAgICB1ZHJfVURJQ291bnQodWRycywgJmNvdW50KTsKKyAgICB1ZHJfVURJU2l6ZVQodWRycywgJnNpemUpOworICAgIHVkcl9VRElCb29sKHVkcnMsICZob3N0X2VuZGlhbik7CisgICAgdWRyX2J5dGVzKHVkcnMsIGZyb20sIGJ5dGVfY291bnQpOworICAgIHVkcl9zZW5kbm93KHVkcnMpOworICAgIGlmKHVkcl9lcnJubykgcmV0dXJuIHVkcl9lcnJubzsKKworICAgIHVkcnMtPnVkcl9vcCA9IFVEUl9ERUNPREU7CQkvKiByZWNlaXZlIGFsbCAib3V0IiBwYXJhbXRlcnMgKi8KKyAgICB1ZHJfVURJQ291bnQodWRycywgY291bnRfZG9uZSk7CisgICAgdWRyX1VESUVycm9yKHVkcnMsICZkZmVfZXJybm8pOwkvKiBnZXQgYW55IFRJUCBlcnJvciAqLworICAgIHJldHVybiBkZmVfZXJybm87Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRElfQ09QWQorKiBVRElDb3B5KCkgY29waWVzIGEgYmxvY2sgb2Ygb2JqZWN0cyBmcm9tIG9uZSAgdGFyZ2V0CisqIGdldCAgYWRkcmVzcy9zcGFjZSB0byBhbm90aGVyIHRhcmdldCBhZGRyZXNzL3NwYWNlLgorKi8KK1VESUVycm9yIFVESUNvcHkoZnJvbSwgdG8sIGNvdW50LCBzaXplLCBjb3VudF9kb25lLCBkaXJlY3Rpb24gKQorVURJUmVzb3VyY2UJZnJvbTsJCS8qIGluIC0tIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb24gdGFyZ2V0ICovCitVRElSZXNvdXJjZQl0bzsJCS8qIGluIC0tIHNvdXJjZSBhZGRyZXNzIG9uIHRhcmdldCAqLworVURJQ291bnQJY291bnQ7CQkvKiBpbiAtLSBjb3VudCBvZiBvYmplY3RzIHRvIGJlIHRyYW5zZmVycmVkICovCitVRElTaXplVAlzaXplOwkJLyogaW4gLS0gc2l6ZSBvZiBlYWNoIG9iamVjdCAqLworVURJQ291bnQJKmNvdW50X2RvbmU7CS8qIG91dCAtIGNvdW50IGFjdHVhbGx5IHRyYW5zZmVycmVkICovCitVRElCb29sCQlkaXJlY3Rpb247CS8qIGluIC0tIGhpZ2gtdG8tbG93IG9yIHJldmVyc2UgKi8KK3sKKyAgICBVRElJbnQzMglzZXJ2aWNlX2lkID0gVURJQ29weV9jOworCisgICAgdWRyX2Vycm5vID0gMDsKKyAgICB1ZHJzLT51ZHJfb3AgPSBVRFJfRU5DT0RFOwkJLyogc2VuZCBhbGwgImluIiBwYXJhbWV0ZXJzICovCisgICAgdWRyX1VESUludDMyKHVkcnMsICZzZXJ2aWNlX2lkKTsKKyAgICB1ZHJfVURJUmVzb3VyY2UodWRycywgJmZyb20pOworICAgIHVkcl9VRElSZXNvdXJjZSh1ZHJzLCAmdG8pOworICAgIHVkcl9VRElDb3VudCh1ZHJzLCAmY291bnQpOworICAgIHVkcl9VRElTaXplVCh1ZHJzLCAmc2l6ZSk7CisgICAgdWRyX1VESUJvb2wodWRycywgJmRpcmVjdGlvbik7CisgICAgdWRyX3NlbmRub3codWRycyk7CisgICAgaWYodWRyX2Vycm5vKSByZXR1cm4gdWRyX2Vycm5vOworCisgICAgdWRycy0+dWRyX29wID0gVURSX0RFQ09ERTsJCS8qIHJlY2VpdmUgYWxsICJvdXQiIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJQ291bnQodWRycywgY291bnRfZG9uZSk7CisgICAgdWRyX1VESUVycm9yKHVkcnMsICZkZmVfZXJybm8pOwkvKiBnZXQgYW55IFRJUCBlcnJvciAqLworICAgIHJldHVybiBkZmVfZXJybm87Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRElfRVhFQ1VURQorKiBVRElFeGVjdXRlKCkgY29udGludWVzIGV4ZWN1dGlvbiAgb2YgIHRoZSAgZGVmYXVsdAorKiBwcm9jZXNzIGZyb20gdGhlIGN1cnJlbnQgUEMuCisqLworVURJRXJyb3IgVURJRXhlY3V0ZSgpCit7CisgICAgVURJSW50MzIJc2VydmljZV9pZCA9IFVESUV4ZWN1dGVfYzsKKworICAgIHVkcl9lcnJubyA9IDA7CisgICAgdWRycy0+dWRyX29wID0gVURSX0VOQ09ERTsJCS8qIHNlbmQgYWxsICJpbiIgcGFyYW1ldGVycyAqLworICAgIHVkcl9VRElJbnQzMih1ZHJzLCAmc2VydmljZV9pZCk7CisgICAgdWRyX3NlbmRub3codWRycyk7CisgICAgaWYodWRyX2Vycm5vKSByZXR1cm4gdWRyX2Vycm5vOworCisgICAgdWRycy0+dWRyX29wID0gVURSX0RFQ09ERTsJCS8qIHJlY2VpdmUgYWxsICJvdXQiIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJRXJyb3IodWRycywgJmRmZV9lcnJubyk7CS8qIGdldCBhbnkgVElQIGVycm9yICovCisgICAgcmV0dXJuIGRmZV9lcnJubzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9TVEVQCisqIFVESVN0ZXAoKSAgc3BlY2lmaWVzICBhICBudW1iZXIgIG9mICAiaW5zdHJ1Y3Rpb24iCisqIHN0ZXBzICB0byAgbWFrZS4KKyovCitVRElFcnJvciBVRElTdGVwKHN0ZXBzLCBzdGVwdHlwZSwgcmFuZ2UpCitVRElVSW50MzIJc3RlcHM7CQkvKiBpbiAtLSBudW1iZXIgb2Ygc3RlcHMgKi8KK1VESVN0ZXBUeXBlCXN0ZXB0eXBlOyAgICAgICAvKiBpbiAtLSB0eXBlIG9mIHN0ZXBwaW5nIHRvIGJlIGRvbmUgKi8KK1VESVJhbmdlCXJhbmdlOyAgICAgICAgICAvKiBpbiAtLSByYW5nZSBpZiBTdGVwSW5SYW5nZSBpcyBUUlVFICovCit7CisgICAgVURJSW50MzIJc2VydmljZV9pZCA9IFVESVN0ZXBfYzsKKworICAgIHVkcl9lcnJubyA9IDA7CisgICAgdWRycy0+dWRyX29wID0gVURSX0VOQ09ERTsJCS8qIHNlbmQgYWxsICJpbiIgcGFyYW1ldGVycyAqLworICAgIHVkcl9VRElJbnQzMih1ZHJzLCAmc2VydmljZV9pZCk7CisgICAgdWRyX1VESUludDMyKHVkcnMsICZzdGVwcyk7CisgICAgdWRyX1VESVN0ZXBUeXBlKHVkcnMsICZzdGVwdHlwZSk7CisgICAgdWRyX1VESVJhbmdlKHVkcnMsICZyYW5nZSk7CisgICAgdWRyX3NlbmRub3codWRycyk7CisgICAgaWYodWRyX2Vycm5vKSByZXR1cm4gdWRyX2Vycm5vOworCisgICAgdWRycy0+dWRyX29wID0gVURSX0RFQ09ERTsJCS8qIHJlY2VpdmUgYWxsICJvdXQiIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJRXJyb3IodWRycywgJmRmZV9lcnJubyk7CS8qIGdldCBhbnkgVElQIGVycm9yICovCisgICAgcmV0dXJuIGRmZV9lcnJubzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9TVE9QCisqIFVESVN0b3AoKSBzdG9wcyB0aGUgZGVmYXVsdCBwcm9jZXNzCisqLworVURJVm9pZCBVRElTdG9wKCkKK3sKKyAgICBpZiAoc3RyY21wKHNlc3Npb25bY3VycmVudF0uc29jX2Nvbl9wLT5kb21haW5fc3RyaW5nLCAiQUZfVU5JWCIpID09IDApCisgICAgICBraWxsKHNlc3Npb25bY3VycmVudF0uc29jX2Nvbl9wLT50aXBfcGlkLCBTSUdJTlQpOworICAgIGVsc2UKKyAgICAgIHVkcl9zaWduYWwodWRycyk7CisKKy8qIFhYWCAtIHNob3VsZCBjbGVhbiB1cCBzZXNzaW9uW10gYW5kIHNvY19jb25bXSBzdHJ1Y3RzIGhlcmUgYXMgd2VsbC4uLiAqLworCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVURJX1dBSVQKKyogVURJV2FpdCgpIHJldHVybnMgdGhlIHN0YXRlIG9mIHRoZSB0YXJnZXQgIHByb2Nlc29yLgorKi8KK1VESUVycm9yIFVESVdhaXQobWF4dGltZSwgcGlkLCBzdG9wX3JlYXNvbikKK1VESUludDMyICAgbWF4dGltZTsgICAgICAgIC8qIGluIC0tIG1heGltdW0gdGltZSB0byB3YWl0IGZvciBjb21wbGV0aW9uICovCitVRElQSWQgICAgICpwaWQ7ICAgICAgICAgICAvKiBvdXQgLS0gcGlkIG9mIHByb2Nlc3Mgd2hpY2ggc3RvcHBlZCBpZiBhbnkgKi8KK1VESVVJbnQzMiAgKnN0b3BfcmVhc29uOyAgIC8qIG91dCAtLSBQQyB3aGVyZSBwcm9jZXNzIHN0b3BwZWQgKi8KK3sKKyAgICBVRElJbnQzMglzZXJ2aWNlX2lkID0gVURJV2FpdF9jOworCisgICAgdWRyX2Vycm5vID0gMDsKKyAgICB1ZHJzLT51ZHJfb3AgPSBVRFJfRU5DT0RFOwkJLyogc2VuZCBhbGwgImluIiBwYXJhbWV0ZXJzICovCisgICAgdWRyX1VESUludDMyKHVkcnMsICZzZXJ2aWNlX2lkKTsKKyAgICB1ZHJfVURJSW50MzIodWRycywgJm1heHRpbWUpOworICAgIHVkcl9zZW5kbm93KHVkcnMpOworICAgIGlmKHVkcl9lcnJubykgcmV0dXJuIHVkcl9lcnJubzsKKworICAgIHVkcnMtPnVkcl9vcCA9IFVEUl9ERUNPREU7CQkvKiByZWNlaXZlIGFsbCAib3V0IiBwYXJhbWV0ZXJzICovCisgICAgdWRyX1VESVBJZCh1ZHJzLCBwaWQpOworICAgIHVkcl9VRElVSW50MzIodWRycywgc3RvcF9yZWFzb24pOworICAgIHVkcl9VRElFcnJvcih1ZHJzLCAmZGZlX2Vycm5vKTsJLyogZ2V0IGFueSBUSVAgZXJyb3IgKi8KKyAgICByZXR1cm4gZGZlX2Vycm5vOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRElfU0VUX0JSRUFLUE9JTlQKKyogVURJU2V0QnJlYWtwb2ludCgpIHNldHMgYSBicmVha3BvaW50ICBhdCAgYW4gIGFkcmVzcworKiBhbmQgIHVzZXMgIHRoZSAgcGFzc2NvdW50ICB0byBzdGF0ZSBob3cgbWFueQorKiB0aW1lcyB0aGF0IGluc3RydWN0aW9uIHNob3VsZCAgYmUgIGhpdCAgYmVmb3JlICB0aGUKKyogYnJlYWsgIG9jY3Vycy4KKyovCitVRElFcnJvciBVRElTZXRCcmVha3BvaW50IChhZGRyLCBwYXNzY291bnQsIHR5cGUsIGJyZWFrX2lkKQorVURJUmVzb3VyY2UJYWRkcjsJCS8qIGluIC0tIHdoZXJlIGJyZWFrcG9pbnQgZ2V0cyBzZXQgKi8KK1VESUludDMyCXBhc3Njb3VudDsJLyogaW4gLS0gcGFzc2NvdW50IGZvciBicmVha3BvaW50ICAqLworVURJQnJlYWtUeXBlCXR5cGU7CQkvKiBpbiAtLSBicmVha3BvaW50IHR5cGUgKi8KK1VESUJyZWFrSWQJKmJyZWFrX2lkOwkvKiBvdXQgLSBhc3NpZ25lZCBicmVhayBpZCAqLworeworICAgIFVESUludDMyCXNlcnZpY2VfaWQgPSBVRElTZXRCcmVha3BvaW50X2M7CisKKyAgICB1ZHJfZXJybm8gPSAwOworICAgIHVkcnMtPnVkcl9vcCA9IFVEUl9FTkNPREU7CQkvKiBzZW5kIGFsbCAiaW4iIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJSW50MzIodWRycywgJnNlcnZpY2VfaWQpOworICAgIHVkcl9VRElSZXNvdXJjZSh1ZHJzLCAmYWRkcik7CisgICAgdWRyX1VESUludDMyKHVkcnMsICZwYXNzY291bnQpOworICAgIHVkcl9VRElCcmVha1R5cGUodWRycywgJnR5cGUpOworICAgIHVkcl9zZW5kbm93KHVkcnMpOworICAgIGlmKHVkcl9lcnJubykgcmV0dXJuIHVkcl9lcnJubzsKKworICAgIHVkcnMtPnVkcl9vcCA9IFVEUl9ERUNPREU7CQkvKiByZWNlaXZlIGFsbCAib3V0IiBwYXJhbWV0ZXJzICovCisgICAgdWRyX1VESUJyZWFrSWQodWRycywgYnJlYWtfaWQpOworICAgIHVkcl9VRElFcnJvcih1ZHJzLCAmZGZlX2Vycm5vKTsJLyogZ2V0IGFueSBUSVAgZXJyb3IgKi8KKyAgICByZXR1cm4gZGZlX2Vycm5vOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVURJX1FVRVJZX0JSRUFLUE9JTlQKKyovCitVRElFcnJvciBVRElRdWVyeUJyZWFrcG9pbnQgKGJyZWFrX2lkLCBhZGRyLCBwYXNzY291bnQsIHR5cGUsIGN1cnJlbnRfY291bnQpCitVRElCcmVha0lkCWJyZWFrX2lkOwkvKiBpbiAtLSBhc3NpZ25lZCBicmVhayBpZCAqLworVURJUmVzb3VyY2UJKmFkZHI7CQkvKiBvdXQgLSB3aGVyZSBicmVha3BvaW50IHdhcyBzZXQgKi8KK1VESUludDMyCSpwYXNzY291bnQ7CS8qIG91dCAtIHRyaWdnZXIgcGFzc2NvdW50IGZvciBicmVha3BvaW50ICAqLworVURJQnJlYWtUeXBlCSp0eXBlOwkJLyogb3V0IC0gYnJlYWtwb2ludCB0eXBlICovCitVRElJbnQzMgkqY3VycmVudF9jb3VudDsJLyogb3V0IC0gY3VycmVudCBjb3VudCBmb3IgYnJlYWtwb2ludCAgKi8KK3sKKyAgICBVRElJbnQzMglzZXJ2aWNlX2lkID0gVURJUXVlcnlCcmVha3BvaW50X2M7CisKKyAgICB1ZHJfZXJybm8gPSAwOworICAgIHVkcnMtPnVkcl9vcCA9IFVEUl9FTkNPREU7CQkvKiBzZW5kIGFsbCAiaW4iIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJSW50MzIodWRycywgJnNlcnZpY2VfaWQpOworICAgIHVkcl9VRElCcmVha0lkKHVkcnMsICZicmVha19pZCk7CisgICAgdWRyX3NlbmRub3codWRycyk7CisgICAgaWYodWRyX2Vycm5vKSByZXR1cm4gdWRyX2Vycm5vOworCisgICAgdWRycy0+dWRyX29wID0gVURSX0RFQ09ERTsJCS8qIHJlY2VpdmUgYWxsICJvdXQiIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJUmVzb3VyY2UodWRycywgYWRkcik7CisgICAgdWRyX1VESUludDMyKHVkcnMsIHBhc3Njb3VudCk7CisgICAgdWRyX1VESUJyZWFrVHlwZSh1ZHJzLCB0eXBlKTsKKyAgICB1ZHJfVURJSW50MzIodWRycywgY3VycmVudF9jb3VudCk7CisgICAgdWRyX1VESUVycm9yKHVkcnMsICZkZmVfZXJybm8pOwkvKiBnZXQgYW55IFRJUCBlcnJvciAqLworICAgIHJldHVybiBkZmVfZXJybm87Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRElfQ0xFQVJfQlJFQUtQT0lOVAorKiBVRElDbGVhckJyZWFrcG9pbnQoKSBpcyB1c2VkIHRvICBjbGVhciAgYSAgYnJlYWtwb2ludC4KKyovCitVRElFcnJvciBVRElDbGVhckJyZWFrcG9pbnQgKGJyZWFrX2lkKQorVURJQnJlYWtJZAlicmVha19pZDsJLyogaW4gLS0gYXNzaWduZWQgYnJlYWsgaWQgKi8KK3sKKyAgICBVRElJbnQzMglzZXJ2aWNlX2lkID0gVURJQ2xlYXJCcmVha3BvaW50X2M7CisKKyAgICB1ZHJfZXJybm8gPSAwOworICAgIHVkcnMtPnVkcl9vcCA9IFVEUl9FTkNPREU7CQkvKiBzZW5kIGFsbCAiaW4iIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJSW50MzIodWRycywgJnNlcnZpY2VfaWQpOworICAgIHVkcl9VRElCcmVha0lkKHVkcnMsICZicmVha19pZCk7CisgICAgdWRyX3NlbmRub3codWRycyk7CisgICAgaWYodWRyX2Vycm5vKSByZXR1cm4gdWRyX2Vycm5vOworCisgICAgdWRycy0+dWRyX29wID0gVURSX0RFQ09ERTsJCS8qIHJlY2VpdmUgYWxsICJvdXQiIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJRXJyb3IodWRycywgJmRmZV9lcnJubyk7CS8qIGdldCBhbnkgVElQIGVycm9yICovCisgICAgcmV0dXJuIGRmZV9lcnJubzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9HRVRfU1RET1VUCisqIFVESUdldFN0ZG91dCgpICBpcyAgY2FsbGVkICAgd2hlbiAgIGEgICBjYWxsICAgdG8KKyogVURJV2FpdCgpIGluZGljYXRlcyB0aGVyZSBpcyBTVEQgb3V0cHV0IGRhdGEgcmVhZHkuIAorKi8KK1VESUVycm9yIFVESUdldFN0ZG91dChidWYsIGJ1ZnNpemUsIGNvdW50X2RvbmUpCitVRElIb3N0TWVtUHRyCWJ1ZjsJCS8qIG91dCAtLSBidWZmZXIgdG8gYmUgZmlsbGVkICovCitVRElTaXplVAlidWZzaXplOwkvKiBpbiAgLS0gYnVmZmVyIHNpemUgaW4gYnl0ZXMgKi8KK1VESVNpemVUCSpjb3VudF9kb25lOwkvKiBvdXQgLS0gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gYnVmICovCit7CisgICAgVURJSW50MzIJc2VydmljZV9pZCA9IFVESUdldFN0ZG91dF9jOworCisgICAgdWRyX2Vycm5vID0gMDsKKyAgICB1ZHJzLT51ZHJfb3AgPSBVRFJfRU5DT0RFOwkJLyogc2VuZCBhbGwgImluIiBwYXJhbWV0ZXJzICovCisgICAgdWRyX1VESUludDMyKHVkcnMsICZzZXJ2aWNlX2lkKTsKKyAgICB1ZHJfVURJU2l6ZVQodWRycywgJmJ1ZnNpemUpOworICAgIHVkcl9zZW5kbm93KHVkcnMpOworICAgIGlmKHVkcl9lcnJubykgcmV0dXJuIHVkcl9lcnJubzsKKworICAgIHVkcnMtPnVkcl9vcCA9IFVEUl9ERUNPREU7CQkvKiByZWNlaXZlIGFsbCAib3V0IiBwYXJhbWV0ZXJzICovCisgICAgdWRyX1VESVNpemVUKHVkcnMsIGNvdW50X2RvbmUpOworICAgIHVkcl9ieXRlcyh1ZHJzLCBidWYsICpjb3VudF9kb25lKTsKKyAgICB1ZHJfVURJRXJyb3IodWRycywgJmRmZV9lcnJubyk7CS8qIGdldCBhbnkgVElQIGVycm9yICovCisgICAgcmV0dXJuIGRmZV9lcnJubzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9HRVRfU1RERVJSCisqIFVESUdldFN0ZGVycigpICBpcyAgY2FsbGVkICAgd2hlbiAgIGEgICBjYWxsICAgdG8KKyogVURJV2FpdCgpIGluZGljYXRlcyB0aGVyZSBpcyBTVERFUlIgb3V0cHV0IGRhdGEgcmVhZHkKKyovCitVRElFcnJvciBVRElHZXRTdGRlcnIoYnVmLCBidWZzaXplLCBjb3VudF9kb25lKQorVURJSG9zdE1lbVB0cglidWY7CQkvKiBvdXQgLS0gYnVmZmVyIHRvIGJlIGZpbGxlZCAqLworVURJU2l6ZVQJYnVmc2l6ZTsJLyogaW4gIC0tIGJ1ZmZlciBzaXplIGluIGJ5dGVzICovCitVRElTaXplVAkqY291bnRfZG9uZTsJLyogb3V0IC0tIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIGJ1ZiAqLworeworICAgIFVESUludDMyCXNlcnZpY2VfaWQgPSBVRElHZXRTdGRlcnJfYzsKKworICAgIHVkcl9lcnJubyA9IDA7CisgICAgdWRycy0+dWRyX29wID0gVURSX0VOQ09ERTsJCS8qIHNlbmQgYWxsICJpbiIgcGFyYW1ldGVycyAqLworICAgIHVkcl9VRElJbnQzMih1ZHJzLCAmc2VydmljZV9pZCk7CisgICAgdWRyX1VESVNpemVUKHVkcnMsICZidWZzaXplKTsKKyAgICB1ZHJfc2VuZG5vdyh1ZHJzKTsKKyAgICBpZih1ZHJfZXJybm8pIHJldHVybiB1ZHJfZXJybm87CisKKyAgICB1ZHJzLT51ZHJfb3AgPSBVRFJfREVDT0RFOwkJLyogcmVjZWl2ZSBhbGwgIm91dCIgcGFyYW1ldGVycyAqLworICAgIHVkcl9VRElTaXplVCh1ZHJzLCBjb3VudF9kb25lKTsKKyAgICB1ZHJfYnl0ZXModWRycywgYnVmLCAqY291bnRfZG9uZSk7CisgICAgdWRyX1VESUVycm9yKHVkcnMsICZkZmVfZXJybm8pOwkvKiBnZXQgYW55IFRJUCBlcnJvciAqLworICAgIHJldHVybiBkZmVfZXJybm87Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVURJX1BVVF9TVERJTgorKiBVRElQdXRTdGRpbigpIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgREZFIHdhbnRzIHRvCisqIGRlbGl2ZXIgYW4gaW5wdXQgY2hhcmFjdGVyIHRvIHRoZSBUSVAuCisqLworVURJRXJyb3IgVURJUHV0U3RkaW4gKGJ1ZiwgY291bnQsIGNvdW50X2RvbmUpCitVRElIb3N0TWVtUHRyCWJ1ZjsJCS8qIGluIC0tIGJ1ZmZlciB0byBiZSBmaWxsZWQgKi8KK1VESVNpemVUCWNvdW50OwkJLyogaW4gLS0gYnVmZmVyIHNpemUgaW4gYnl0ZXMgKi8KK1VESVNpemVUCSpjb3VudF9kb25lOwkvKiBvdXQgLSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBidWYgKi8KK3sKKyAgICBVRElJbnQzMglzZXJ2aWNlX2lkID0gVURJUHV0U3RkaW5fYzsKKworICAgIHVkcl9lcnJubyA9IDA7CisgICAgdWRycy0+dWRyX29wID0gVURSX0VOQ09ERTsJCS8qIHNlbmQgYWxsICJpbiIgcGFyYW1ldGVycyAqLworICAgIHVkcl9VRElJbnQzMih1ZHJzLCAmc2VydmljZV9pZCk7CisgICAgdWRyX1VESVNpemVUKHVkcnMsICZjb3VudCk7CisgICAgdWRyX2J5dGVzKHVkcnMsIGJ1ZiwgY291bnQpOworICAgIHVkcl9zZW5kbm93KHVkcnMpOworICAgIGlmKHVkcl9lcnJubykgcmV0dXJuIHVkcl9lcnJubzsKKworICAgIHVkcnMtPnVkcl9vcCA9IFVEUl9ERUNPREU7CQkvKiByZWNlaXZlIGFsbCAib3V0IiBwYXJhbWV0ZXJzICovCisgICAgdWRyX1VESVNpemVUKHVkcnMsIGNvdW50X2RvbmUpOworICAgIHVkcl9VRElFcnJvcih1ZHJzLCAmZGZlX2Vycm5vKTsJLyogZ2V0IGFueSBUSVAgZXJyb3IgKi8KKyAgICByZXR1cm4gZGZlX2Vycm5vOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVURJX1NURElOX01PREUKKyogVURJU3RkaW5Nb2RlKCkgaXMgdXNlZCB0byBjaGFuZ2UgdGhlIG1vZGUgdGhhdCBjaGF6Y3RlcnMKKyogYXJlIGZldGNoZWQgZnJvbSB0aGUgdXNlci4KKyovCitVRElFcnJvcglVRElTdGRpbk1vZGUobW9kZSkKK1VESU1vZGUJCSptb2RlOwkJLyogb3V0IC0gKi8KK3sKKyAgICBVRElJbnQzMglzZXJ2aWNlX2lkID0gVURJU3RkaW5Nb2RlX2M7CisKKyAgICB1ZHJfZXJybm8gPSAwOworICAgIHVkcnMtPnVkcl9vcCA9IFVEUl9FTkNPREU7CQkvKiBzZW5kIGFsbCAiaW4iIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJSW50MzIodWRycywgJnNlcnZpY2VfaWQpOworICAgIHVkcl9zZW5kbm93KHVkcnMpOworICAgIGlmKHVkcl9lcnJubykgcmV0dXJuIHVkcl9lcnJubzsKKworICAgIHVkcnMtPnVkcl9vcCA9IFVEUl9ERUNPREU7CQkvKiByZWNlaXZlIGFsbCAib3V0IiBwYXJhbWV0ZXJzICovCisgICAgdWRyX1VESU1vZGUodWRycywgbW9kZSk7CisgICAgdWRyX1VESUVycm9yKHVkcnMsICZkZmVfZXJybm8pOwkvKiBnZXQgYW55IFRJUCBlcnJvciAqLworICAgIHJldHVybiBkZmVfZXJybm87Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVURJX1BVVF9UUkFOUworKiBVRElQdXRUcmFucygpIGlzIHVzZWQgdG8gZmVlZCBpbnB1dCB0byAgdGhlICBwYXNzdGhydSAgbW9kZS4KKyovCitVRElFcnJvcglVRElQdXRUcmFucyAoYnVmLCBjb3VudCwgY291bnRfZG9uZSkKK1VESUhvc3RNZW1QdHIJYnVmOwkJLyogaW4gLS0gYnVmZmVyIGFkZHJlc3MgY29udGFpbmluZyBpbnB1dCBkYXRhICovCitVRElTaXplVAljb3VudDsJCS8qIGluIC0tIG51bWJlciBvZiBieXRlcyBpbiBidWYgKi8KK1VESVNpemVUCSpjb3VudF9kb25lOwkvKiBvdXQtLSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJlZCAqLworeworICAgIFVESUludDMyCXNlcnZpY2VfaWQgPSBVRElQdXRUcmFuc19jOworCisgICAgdWRyX2Vycm5vID0gMDsKKyAgICB1ZHJzLT51ZHJfb3AgPSBVRFJfRU5DT0RFOwkJLyogc2VuZCBhbGwgImluIiBwYXJhbWV0ZXJzICovCisgICAgdWRyX1VESUludDMyKHVkcnMsICZzZXJ2aWNlX2lkKTsKKyAgICB1ZHJfVURJU2l6ZVQodWRycywgJmNvdW50KTsKKyAgICB1ZHJfYnl0ZXModWRycywgYnVmLCBjb3VudCk7CisgICAgdWRyX3NlbmRub3codWRycyk7CisgICAgaWYodWRyX2Vycm5vKSByZXR1cm4gdWRyX2Vycm5vOworCisgICAgdWRycy0+dWRyX29wID0gVURSX0RFQ09ERTsJCS8qIHJlY2VpdmUgYWxsICJvdXQiIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJU2l6ZVQodWRycywgY291bnRfZG9uZSk7CisgICAgdWRyX1VESUVycm9yKHVkcnMsICZkZmVfZXJybm8pOwkvKiBnZXQgYW55IFRJUCBlcnJvciAqLworICAgIHJldHVybiBkZmVfZXJybm87Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVURJX0dFVF9UUkFOUworKiBVRElHZXRUcmFucygpIGlzIHVzZWQgdG8gZ2V0IG91dHB1dCBsaW5lcyBmcm9tIHRoZQorKiBwYXNzdGhydSBtb2RlLgorKi8KK1VESUVycm9yCVVESUdldFRyYW5zIChidWYsIGJ1ZnNpemUsIGNvdW50X2RvbmUpCitVRElIb3N0TWVtUHRyCWJ1ZjsJCS8qIG91dCAtLSBidWZmZXIgdG8gYmUgZmlsbGVkICovCitVRElTaXplVAlidWZzaXplOwkvKiBpbiAgLS0gc2l6ZSBvZiBidWYgKi8KK1VESVNpemVUCSpjb3VudF9kb25lOwkvKiBvdXQgLS0gbnVtYmVyIG9mIGJ5dGVzIGluIGJ1ZiAqLworeworICAgIFVESUludDMyCXNlcnZpY2VfaWQgPSBVRElHZXRUcmFuc19jOworCisgICAgdWRyX2Vycm5vID0gMDsKKyAgICB1ZHJzLT51ZHJfb3AgPSBVRFJfRU5DT0RFOwkJLyogc2VuZCBhbGwgImluIiBwYXJhbWV0ZXJzICovCisgICAgdWRyX1VESUludDMyKHVkcnMsICZzZXJ2aWNlX2lkKTsKKyAgICB1ZHJfVURJU2l6ZVQodWRycywgJmJ1ZnNpemUpOworICAgIHVkcl9zZW5kbm93KHVkcnMpOworICAgIGlmKHVkcl9lcnJubykgcmV0dXJuIHVkcl9lcnJubzsKKworICAgIHVkcnMtPnVkcl9vcCA9IFVEUl9ERUNPREU7CQkvKiByZWNlaXZlIGFsbCAib3V0IiBwYXJhbWV0ZXJzICovCisgICAgdWRyX1VESVNpemVUKHVkcnMsIGNvdW50X2RvbmUpOworICAgIHVkcl9ieXRlcyh1ZHJzLCBidWYsICpjb3VudF9kb25lKTsKKyAgICB1ZHJfVURJRXJyb3IodWRycywgJmRmZV9lcnJubyk7CS8qIGdldCBhbnkgVElQIGVycm9yICovCisgICAgcmV0dXJuIGRmZV9lcnJubzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9UcmFuc19Nb2RlCisqIFVESVRyYW5zTW9kZSgpIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBtb2RlIHRoYXQgdGhlCisqIHRyYW5zcGFyZW50IHJvdXRpbmVzIG9wZXJhdGUgaW4uCisqLworVURJRXJyb3IgVURJVHJhbnNNb2RlKG1vZGUpCitVRElNb2RlCQkqbW9kZTsJCS8qIG91dCAgLS0gc2VsZWN0ZWQgbW9kZSAqLworeworICAgIFVESUludDMyCXNlcnZpY2VfaWQgPSBVRElUcmFuc01vZGVfYzsKKworICAgIHVkcl9lcnJubyA9IDA7CisgICAgdWRycy0+dWRyX29wID0gVURSX0VOQ09ERTsJCS8qIHNlbmQgYWxsICJpbiIgcGFyYW1ldGVycyAqLworICAgIHVkcl9VRElJbnQzMih1ZHJzLCAmc2VydmljZV9pZCk7CisgICAgdWRyX1VESU1vZGUodWRycywgbW9kZSk7CisgICAgdWRyX3NlbmRub3codWRycyk7CisgICAgaWYodWRyX2Vycm5vKSByZXR1cm4gdWRyX2Vycm5vOworCisgICAgdWRycy0+dWRyX29wID0gVURSX0RFQ09ERTsJCS8qIHJlY2VpdmUgYWxsICJvdXQiIHBhcmFtZXRlcnMgKi8KKyAgICB1ZHJfVURJRXJyb3IodWRycywgJmRmZV9lcnJubyk7CisgICAgcmV0dXJuIGRmZV9lcnJubzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9URVNUCisqLworVURJRXJyb3IgVURJVGVzdCggY250LCBzdHJfcCwgYXJyYXkpCitVRElTaXplVAljbnQ7CitVRElIb3N0TWVtUHRyCXN0cl9wOworVURJSW50MzIJYXJyYXlbXTsKK3sKKyAgICBVRElJbnQzMglzZXJ2aWNlX2lkID0gVURJVGVzdF9jOworICAgIFVESUludDE2CXNjbnQgPSBjbnQ7CisgICAgVURJU2l6ZVQJcl9jbnQ7CisgICAgY2hhcglidWZbMjU2XTsKKworICAgIHVkcl9lcnJubyA9IDA7CisgICAgdWRycy0+dWRyX29wID0gVURSX0VOQ09ERTsJCS8qIHNlbmQgYWxsICJpbiIgcGFyYW1ldGVycyAqLworICAgIHVkcl9VRElJbnQzMih1ZHJzLCAmc2VydmljZV9pZCk7CisKKyAgICBwcmludGYoInNlbmQJY250PSVkIHNjbnQ9JWRcbiIsIGNudCwgc2NudCk7CisgICAgdWRyX1VESVNpemVUKHVkcnMsICZjbnQpOworICAgIHVkcl9VRElJbnQxNih1ZHJzLCAmc2NudCk7CisgICAgcHJpbnRmKCIJYXJyYXlbMF09MHgleCBhcnJheVsxXT0weCV4IGFycmF5WzJdPTB4JXggYXJyYXlbM109MHgleFxuIiwKKyAgICAJYXJyYXlbMF0sIGFycmF5WzFdLCBhcnJheVsyXSwgYXJyYXlbM10pOworICAgIHVkcl9ieXRlcyh1ZHJzLCAoY2hhciopYXJyYXksIDQqc2l6ZW9mKFVESUludDMyKSk7CisgICAgcHJpbnRmKCIJc3RyaW5nPSVzXG4iLCBzdHJfcCk7CisgICAgdWRyX3N0cmluZyh1ZHJzLCBzdHJfcCk7CisgICAgdWRyX3NlbmRub3codWRycyk7CisgICAgaWYodWRyX2Vycm5vKQorICAgIHsJZnByaW50ZihzdGRlcnIsICIgREZFLWlwYyBTZW5kIEVSUk9SXG4iKTsKKwlyZXR1cm4gdWRyX2Vycm5vOworICAgIH0KKworICAgIHVkcnMtPnVkcl9vcCA9IFVEUl9ERUNPREU7CQkvKiByZWNlaXZlIGFsbCAib3V0IiBwYXJhbWV0ZXJzICovCisgICAgcHJpbnRmKCJyZWN2CSIpOworICAgIHVkcl9VRElTaXplVCh1ZHJzLCAmcl9jbnQpOworICAgIHVkcl9VRElJbnQxNih1ZHJzLCAmc2NudCk7CisgICAgcHJpbnRmKCIJcmNudD0lZCBzY250PSVkXG4iLCByX2NudCwgc2NudCk7CisgICAgdWRyX2J5dGVzKHVkcnMsIChjaGFyKilhcnJheSwgNCpzaXplb2YoVURJSW50MzIpKTsKKworICAgIHByaW50ZigiCWFycmF5WzBdPTB4JXggYXJyYXlbMV09MHgleCBhcnJheVsyXT0weCV4IGFycmF5WzNdPTB4JXhcbiIsCisgICAgCWFycmF5WzBdLCBhcnJheVsxXSwgYXJyYXlbMl0sIGFycmF5WzNdKTsKKyAgICB1ZHJfc3RyaW5nKHVkcnMsIHN0cl9wKTsKKyAgICBwcmludGYoIglzdHJpbmc9JXNcbiIsIHN0cl9wKTsKKworICAgIHVkcl9VRElFcnJvcih1ZHJzLCAmZGZlX2Vycm5vKTsKKyAgICByZXR1cm4gZGZlX2Vycm5vOworfQorCisKKworVURJVUludDMyIFVESUdldERGRUlQQ0lkKCkKK3sKKyAgICByZXR1cm4gKChjb21wYW55X2MgPDwgMTYpICsgKHByb2R1Y3RfYyA8PCAxMikgKyB2ZXJzaW9uX2MpOworfQorI2VuZGlmIC8qIF9fR08zMl9fICovCmRpZmYgLS1naXQgYS9nZGIvMjlrLXNoYXJlL3VkaS91ZGlwaGNmZy5oIGIvZ2RiLzI5ay1zaGFyZS91ZGkvdWRpcGhjZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWVmZjBhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiLzI5ay1zaGFyZS91ZGkvdWRpcGhjZmcuaApAQCAtMCwwICsxLDQ0IEBACisvKiBUaGlzIGZpbGUganVzdCBwaWNrcyB0aGUgY29ycmVjdCB1ZGlwaHh4eC5oIGRlcGVuZGluZyBvbiB0aGUgaG9zdC4KKyAgIFRoZSB0d28gaG9zdHMgdGhhdCBhcmUgbm93IGRlZmluZWQgYXJlIFVOSVggYW5kIE1TRE9TLgorCisgICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICogRm9yIHRoZSBtb21lbnQsIHdlIHdpbGwgZGVmYXVsdCB0byBCU0RfSVBDOyB0aGlzIG1pZ2h0IGNoYW5nZSBpZi93aGVuCisgKiBhbm90aGVyIHR5cGUgb2YgSVBDIChNYWNoPyBTeXNWPykgaXMgaW1wbGVtZW50ZWQuCisgKi8KKworI2lmIDAKKworLyogV2UgZG9uJ3Qgc2VlbSB0byBoYXZlIGEgY29weSBvZiB1ZGlwaGRvcy5oLiAgRnVydGhlcm1vcmUsIGFsbCB0aGUKKyAgIHRoaW5ncyBpbiB1ZGlwaHVuaXguaCBhcmUgcHJldHR5IG11Y2ggZ2VuZXJpYyAzMi1iaXQgbWFjaGluZSBkZWZpbmVzCisgICB3aGljaCBkb24ndCBoYXZlIGFueXRoaW5nIHRvIGRvIHdpdGggSVBDLiAgKi8KKworI2lmZGVmIERPU19JUEMKKyNpbmNsdWRlICJ1ZGlwaGRvcy5oIgorI2Vsc2UKKy8qI2lmZGVmIEJTRF9JUEMgKi8KKyNpbmNsdWRlICJ1ZGlwaHVuaXguaCIKKyNlbmRpZgorCisjZWxzZQorCisjaW5jbHVkZSAidWRpcGh1bml4LmgiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2RiLzI5ay1zaGFyZS91ZGkvdWRpcGh1bml4LmggYi9nZGIvMjlrLXNoYXJlL3VkaS91ZGlwaHVuaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzJmYmJmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiLzI5ay1zaGFyZS91ZGkvdWRpcGh1bml4LmgKQEAgLTAsMCArMSw4MSBAQAorLyogT3JpZ2luYWxseSBjYWxsZWQgInVkaXBoc3VuLmgiLCBob3dldmVyIGl0IHdhcyBub3QgdmVyeQorICAgU3VuLXNwZWNpZmljOyBub3cgaXQgaXMgdXNlZCBmb3IgZ2VuZXJpYy11bml4LXdpdGgtYnNkLWlwYy4KKworICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGlzIHRvIGJlIHVzZWQgdG8gcmVjb25maWd1cmUgdGhlIFVESSBQcm9jZWR1cmFsIGludGVyZmFjZQorICAgZm9yIGEgZ2l2ZW4gaG9zdC4gVGhpcyBmaWxlIHNob3VsZCBiZSBwbGFjZWQgc28gdGhhdCBpdCB3aWxsIGJlCisgICBpbmNsdWRlZCBmcm9tIHVkaXByb2MuaC4gRXZlcnl0aGluZyBpbiBoZXJlIG1heSBuZWVkIHRvIGJlIGNoYW5nZWQKKyAgIHdoZW4geW91IGNoYW5nZSBlaXRoZXIgdGhlIGhvc3QgQ1BVIG9yIGl0cyBjb21waWxlci4gTm90aGluZyBpbgorICAgaGVyZSBzaG91bGQgY2hhbmdlIHRvIHN1cHBvcnQgZGlmZmVyZW50IHRhcmdldHMuIFRoZXJlIGFyZSBtdWx0aXBsZQorICAgdmVyc2lvbnMgb2YgdGhpcyBmaWxlLCBvbmUgZm9yIGVhY2ggb2YgdGhlIGRpZmZlcmVudCBob3N0L2NvbXBpbGVyCisgICBjb21iaW5hdGlvbnMgaW4gdXNlLgorKi8KKworI2RlZmluZSBVRElTdHJ1Y3QgIHN0cnVjdAkJLyogX3BhY2tlZCBub3QgbmVlZGVkIG9uIHVuaXggKi8KKy8qIEZpcnN0LCB3ZSBuZWVkIHNvbWUgdHlwZXMgKi8KKy8qIFR5cGVzIHdpdGggYXQgbGVhc3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cyAqLwordHlwZWRlZiBkb3VibGUJCVVESVJlYWw2NDsJCS8qIDY0LWJpdCByZWFsIHZhbHVlICovCit0eXBlZGVmIGZsb2F0CQlVRElSZWFsMzI7CQkvKiAzMi1iaXQgcmVhbCB2YWx1ZSAqLworICAKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlVRElVSW50MzI7CQkvKiB1bnNpZ25lZCBpbnRlZ2VycyAqLwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlVRElVSW50MTY7IAordHlwZWRlZiB1bnNpZ25lZCBjaGFyCVVESVVJbnQ4OworICAKK3R5cGVkZWYgbG9uZwkJVURJSW50MzI7CQkvKiAzMi1iaXQgaW50ZWdlciAqLyAKK3R5cGVkZWYgc2hvcnQJCVVESUludDE2OwkJLyogMTYtYml0IGludGVnZXIgKi8gCit0eXBlZGVmIGNoYXIJCVVESUludDg7CQkvKiB1bnJlbGlhYmxlIHNpZ25lZG5lc3MgKi8KKworLyogVG8gYWlkIGluIHN1cHBvcnRpbmcgZW52aXJvbm1lbnRzIHdoZXJlIHRoZSBERkUgYW5kIFRJUCB1c2UKK2RpZmZlcmVudCBjb21waWxlcnMgb3IgaG9zdHMgKGxpa2UgRE9TIDM4NiBvbiBvbmUgc2lkZSwgMjg2IG9uIHRoZQorb3RoZXIsIG9yIGRpZmZlcmVudCBVbml4IG1hY2hpbmVzIGNvbm5lY3RlZCBieSBzb2NrZXRzKSwgd2UgZGVmaW5lCit0d28gYWJzdHJhY3QgdHlwZXMgLSBVRElJbnQgYW5kIFVESVNpemVULgorVURJSW50IHNob3VsZCBiZSBkZWZpbmVkIHRvIGJlIGludCBleGNlcHQgZm9yIGhvc3QvY29tcGlsZXIgY29tYmluYXRpb25zCit0aGF0IGFyZSBpbnRlbmRlZCB0byB0YWxrIHRvIGV4aXN0aW5nIFVESSBjb21wb25lbnRzIHRoYXQgaGF2ZSBhIGRpZmZlcmVudAorc2l6ZWQgaW50LiBTaW1pbGFybHkgZm9yIFVESVNpemVULgorKi8KK3R5cGVkZWYgaW50CQlVRElJbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlVRElVSW50OworCit0eXBlZGVmIHVuc2lnbmVkIGludAlVRElTaXplVDsKKworLyogTm93IHR3byB2b2lkIHR5cGVzLiBUaGUgZmlyc3QgaXMgZm9yIGZ1bmN0aW9uIHJldHVybiB0eXBlcywKK3RoZSBvdGhlciBmb3IgcG9pbnRlcnMgdG8gbm8gcGFydGljdWxhciB0eXBlLiBTaW5jZSB0aGVzZSB0eXBlcworYXJlIHVzZWQgc29sZWx5IGZvciBkb2N1bWVudGF0aW9uYWwgY2xhcml0eSwgaWYgeW91ciBob3N0L2NvbXBpbGVyCitkb2Vzbid0IHN1cHBvcnQgZWl0aGVyIG9uZSwgcmVwbGFjZSB0aGVtIHdpdGggaW50IGFuZCBjaGFyICoKK3Jlc3BlY3RpdmVseS4KKyovCit0eXBlZGVmIHZvaWQJCVVESVZvaWQ7CQkvKiB2b2lkIHR5cGUgKi8KK3R5cGVkZWYgdm9pZCAqCQlVRElWb2lkUHRyOwkJLyogdm9pZCBwb2ludGVyIHR5cGUgKi8KK3R5cGVkZWYgdm9pZCAqCQlVRElIb3N0TWVtUHRyOwkJLyogQXJiaXRyYXJ5IG1lbW9yeSBwb2ludGVyICovCisKKy8qIE5vdyB3ZSB3YW50IGEgdHlwZSBvcHRpbWl6ZWQgZm9yIGJvb2xlYW4gdmFsdWVzLiBOb3JtYWxseSB0aGlzCisgICB3b3VsZCBiZSBpbnQsIGJ1dCBvbiBzb21lIG1hY2hpbmVzIChaODBzLCA4MDUxcywgZXRjKSBpdCBtaWdodAorICAgYmUgYmV0dGVyIHRvIG1hcCBpdCBvbnRvIGEgY2hhcgorKi8KK3R5cGVkZWYJaW50CQlVRElCb29sOworCisvKiBOb3cgaW5kaWNhdGUgd2hldGhlciB5b3VyIGNvbXBpbGVyIHN1cHBvcnQgZnVsbCBBTlNJIHN0eWxlCisgICBwcm90b3R5cGVzLiBJZiBzbywgdXNlICNpZiAxLiBJZiBub3QgdXNlICNpZiAwLgorKi8KKyNpZiAwCisjZGVmaW5lIFVESVBhcmFtcyh4KQl4CisjZWxzZQorI2RlZmluZSBVRElQYXJhbXMoeCkJKCkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2RiLzI5ay1zaGFyZS91ZGkvdWRpcHJvYy5oIGIvZ2RiLzI5ay1zaGFyZS91ZGkvdWRpcHJvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzFjMjAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvMjlrLXNoYXJlL3VkaS91ZGlwcm9jLmgKQEAgLTAsMCArMSwzMDggQEAKKy8qIGxvY2FsIHR5cGUgZGVjcy4gYW5kIG1hY3JvIGRlZnMuCisKKyAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJ1ZGlwaGNmZy5oIgkvKiBHZXQgaG9zdCBzcGVjaWZpYyBjb25maWd1cmF0aW9uICovCisjaW5jbHVkZSAidWRpcHRjZmcuaCIJLyogR2V0IHRhcmdldCBzcGVjaWZpYyBjb25maWd1cmF0aW9uICovCisKKy8qIEhlcmUgYXJlIGFsbCBvZiB0aGUgQ1BVIEZhbWlsaWVzIGZvciB3aGljaCBVREkgaXMgY3VycmVudGx5IGRlZmluZWQgKi8KKyNkZWZpbmUgQW0yOUsJCTEJLyogQU1EJ3MgQW0yOTB4eCBhbmQgQW0yOTJ4eCBwYXJ0cyAqLworCit0eXBlZGVmIFVESUludAkJVURJRXJyb3I7Cit0eXBlZGVmIFVESUludAkJVURJU2Vzc2lvbklkOwordHlwZWRlZglVRElJbnQJCVVESVBJZDsKK3R5cGVkZWYJVURJSW50CQlVRElTdGVwVHlwZTsKK3R5cGVkZWYJVURJSW50CQlVRElCcmVha1R5cGU7Cit0eXBlZGVmCVVESVVJbnQJCVVESUJyZWFrSWQ7Cit0eXBlZGVmIFVESVVJbnQJCVVESU1vZGU7CisKK3R5cGVkZWYgVURJU3RydWN0Cit7CQkJCisgICAgQ1BVU3BhY2UJU3BhY2U7CisgICAgQ1BVT2Zmc2V0CU9mZnNldDsKK30gVURJUmVzb3VyY2U7CisKK3R5cGVkZWYJVURJU3RydWN0Cit7CisgICAgQ1BVT2Zmc2V0CUxvdzsKKyAgICBDUFVPZmZzZXQJSGlnaDsKK30gVURJUmFuZ2U7CisKK3R5cGVkZWYgVURJU3RydWN0Cit7CisgICAgQ1BVU3BhY2UJU3BhY2U7CisgICAgQ1BVT2Zmc2V0CU9mZnNldDsKKyAgICBDUFVTaXplVAlTaXplOworICAgIH0gVURJTWVtb3J5UmFuZ2U7CisKKy8qIFZhbHVlcyBmb3IgVURJU3RlcFR5cGUgcGFyYW1ldGVycyAqLworI2RlZmluZSBVRElTdGVwTmF0dXJhbAkJMHgwMDAwCisjZGVmaW5lIFVESVN0ZXBPdmVyVHJhcHMJMHgwMDAxCisjZGVmaW5lIFVESVN0ZXBPdmVyQ2FsbHMJMHgwMDAyCisjZGVmaW5lIFVESVN0ZXBJblJhbmdlCQkweDAwMDQKKyNkZWZpbmUgVURJU3RlcE5hdHVyYWwJCTB4MDAwMAorCisvKiBWYWx1ZXMgZm9yIFVESUJyZWFrVHlwZSBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFVESUJyZWFrRmxhZ0V4ZWN1dGUJMHgwMDAxCisjZGVmaW5lIFVESUJyZWFrRmxhZ1JlYWQJMHgwMDAyCisjZGVmaW5lIFVESUJyZWFrRmxhZ1dyaXRlCTB4MDAwNAorI2RlZmluZSBVRElCcmVha0ZsYWdGZXRjaAkweDAwMDgKKworLyogU3BlY2lhbCB2YWx1ZXMgZm9yIFVESVdhaXQgTWF4VGltZSBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgVURJV2FpdEZvcmV2ZXIJKFVESUludDMyKSAtMQkvKiBJbmZpbml0ZSB0aW1lIGRlbGF5ICovCisKKy8qIFNwZWNpYWwgdmFsdWVzIGZvciBQSWQgKi8KKyNkZWZpbmUgVURJUHJvY2Vzc1Byb2Nlc3NvcgktMQkvKiBSYXcgSGFyZHdhcmUsIGlmIHBvc3NpYmxlICovCisKKy8qIFZhbHVlcyBmb3IgVURJV2FpdCBTdG9wUmVhc29uICovCisjZGVmaW5lIFVESUdyb3NzU3RhdGUJCTB4ZmYKKyNkZWZpbmUgVURJVHJhcHBlZAkJMAkvKiBGaW5lIHN0YXRlIC0gd2hpY2ggdHJhcCAqLworI2RlZmluZSBVRElOb3RFeGVjdXRpbmcJCTEKKyNkZWZpbmUgVURJUnVubmluZwkJMgorI2RlZmluZSBVRElTdG9wcGVkCQkzCisjZGVmaW5lIFVESVdhcm5lZAkJNAorI2RlZmluZSBVRElTdGVwcGVkCQk1CisjZGVmaW5lIFVESVdhaXRpbmcJCTYKKyNkZWZpbmUgVURJSGFsdGVkCQk3CisjZGVmaW5lIFVESVN0ZG91dFJlYWR5CQk4CS8qIGZpbmUgc3RhdGUgLSBzaXplICovCisjZGVmaW5lIFVESVN0ZGVyclJlYWR5CQk5CS8qIGZpbmUgc3RhdGUgLSBzaXplICovCisjZGVmaW5lIFVESVN0ZGluTmVlZGVkCQkxMAkvKiBmaW5lIHN0YXRlIC0gc2l6ZSAqLworI2RlZmluZSBVRElTdGRpbk1vZGVYICAJCTExCS8qIGZpbmUgc3RhdGUgLSBtb2RlICovCisjZGVmaW5lIFVESUJyZWFrCQkxMgkvKiBGaW5lIHN0YXRlIC0gQnJlYWtwb2ludCBJZCAqLworI2RlZmluZSBVRElFeGl0ZWQJCTEzCS8qIEZpbmUgc3RhdGUgLSBleGl0IGNvZGUgKi8KKworLyogRW51bWVyYXRlIHRoZSByZXR1cm4gdmFsdWVzIGZyb20gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisgICBmb3IgVURJRW51bWVyYXRlVElQcy4KKyovCisjZGVmaW5lIFVESVRlcm1pbmF0ZUVudW1lcmF0aW9uCTAKKyNkZWZpbmUgVURJQ29udGludWVFbnVtZXJhdGlvbgkxCisKKy8qIEVudW1lcmF0ZSB2YWx1ZXMgZm9yIFRlcm1pbmF0ZSBwYXJhbWV0ZXIgdG8gVURJRGlzY29ubmVjdCAqLworI2RlZmluZSBVRElUZXJtaW5hdGVTZXNzaW9uCTEKKyNkZWZpbmUgVURJQ29udGludWVTZXNzaW9uCTAKKworLyogRXJyb3IgY29kZXMgKi8KKyNkZWZpbmUgVURJTm9FcnJvcgkJCTAJLyogTm8gZXJyb3Igb2NjdXJlZCAqLworI2RlZmluZSBVRElFcnJvck5vU3VjaENvbmZpZ3VyYXRpb24JMQorI2RlZmluZSBVRElFcnJvckNhbnRIYXBwZW4JCTIKKyNkZWZpbmUgVURJRXJyb3JDYW50Q29ubmVjdAkJMworI2RlZmluZSBVRElFcnJvck5vU3VjaENvbm5lY3Rpb24JNAorI2RlZmluZSBVRElFcnJvck5vQ29ubmVjdGlvbgkJNQorI2RlZmluZSBVRElFcnJvckNhbnRPcGVuQ29uZmlnRmlsZQk2CisjZGVmaW5lIFVESUVycm9yQ2FudFN0YXJ0VElQCQk3CisjZGVmaW5lIFVESUVycm9yQ29ubmVjdGlvblVuYXZhaWxhYmxlCTgKKyNkZWZpbmUgVURJRXJyb3JUcnlBbm90aGVyVElQCQk5CisjZGVmaW5lIFVESUVycm9yRXhlY3V0YWJsZU5vdFRJUAkxMAorI2RlZmluZSBVRElFcnJvckludmFsaWRUSVBPcHRpb24JMTEKKyNkZWZpbmUgVURJRXJyb3JDYW50RGlzY29ubmVjdAkJMTIKKyNkZWZpbmUgVURJRXJyb3JVbmtub3duRXJyb3IJCTEzCisjZGVmaW5lIFVESUVycm9yQ2FudENyZWF0ZVByb2Nlc3MJMTQKKyNkZWZpbmUgVURJRXJyb3JOb1N1Y2hQcm9jZXNzCQkxNQorI2RlZmluZSBVRElFcnJvclVua25vd25SZXNvdXJjZVNwYWNlCTE2CisjZGVmaW5lIFVESUVycm9ySW52YWxpZFJlc291cmNlCQkxNworI2RlZmluZSBVRElFcnJvclVuc3VwcG9ydGVkU3RlcFR5cGUJMTgKKyNkZWZpbmUgVURJRXJyb3JDYW50U2V0QnJlYWtwb2ludAkxOQorI2RlZmluZSBVRElFcnJvclRvb01hbnlCcmVha3BvaW50cwkyMAorI2RlZmluZSBVRElFcnJvckludmFsaWRCcmVha0lkCQkyMQorI2RlZmluZSBVRElFcnJvck5vTW9yZUJyZWFrSWRzCQkyMgorI2RlZmluZSBVRElFcnJvclVuc3VwcG9ydGVkU2VydmljZQkyMworI2RlZmluZSBVRElFcnJvclRyeUFnYWluCQkyNAorI2RlZmluZSBVRElFcnJvcklQQ0xpbWl0YXRpb24JCTI1CisjZGVmaW5lIFVESUVycm9ySW5jb21wbGV0ZQkJMjYKKyNkZWZpbmUgVURJRXJyb3JBYm9ydGVkCQkJMjcKKyNkZWZpbmUgVURJRXJyb3JUcmFuc0RvbmUJCTI4CisjZGVmaW5lIFVESUVycm9yQ2FudEFjY2VwdAkJMjkKKyNkZWZpbmUgVURJRXJyb3JUcmFuc0lucHV0TmVlZGVkCTMwCisjZGVmaW5lIFVESUVycm9yVHJhbnNNb2RlWAkJMzEKKyNkZWZpbmUgVURJRXJyb3JJbnZhbGlkU2l6ZQkJMzIKKyNkZWZpbmUgVURJRXJyb3JCYWRDb25maWdGaWxlRW50cnkJMzMKKyNkZWZpbmUgVURJRXJyb3JJUENJbnRlcm5hbAkJMzQKKy8qIFRCRCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBST0NFRFVSRVMKKyovCisKK1VESUVycm9yIFVESUNvbm5lY3QgVURJUGFyYW1zKCgKKyAgY2hhcgkJKkNvbmZpZ3VyYXRpb24sCQkvKiBJbiAqLworICBVRElTZXNzaW9uSWQJKlNlc3Npb24JCS8qIE91dCAqLworICApKTsKKworVURJRXJyb3IgVURJRGlzY29ubmVjdCBVRElQYXJhbXMoKAorICBVRElTZXNzaW9uSWQJU2Vzc2lvbiwJCS8qIEluICovCisgIFVESUJvb2wJVGVybWluYXRlCQkvKiBJbiAqLworICApKTsKKworVURJRXJyb3IgVURJU2V0Q3VycmVudENvbm5lY3Rpb24gVURJUGFyYW1zKCgKKyAgVURJU2Vzc2lvbklkCVNlc3Npb24JCQkvKiBJbiAqLworICApKTsKKworVURJRXJyb3IgVURJQ2FwYWJpbGl0aWVzIFVESVBhcmFtcygoCisgIFVESVVJbnQzMgkqVElQSWQsCQkJLyogT3V0ICovCisgIFVESVVJbnQzMgkqVGFyZ2V0SWQsCQkvKiBPdXQgKi8KKyAgVURJVUludDMyCURGRUlkLAkJCS8qIEluICovCisgIFVESVVJbnQzMglERkUsCQkJLyogSW4gKi8KKyAgVURJVUludDMyCSpUSVAsCQkJLyogT3V0ICovCisgIFVESVVJbnQzMgkqREZFSVBDSWQsCQkvKiBPdXQgKi8KKyAgVURJVUludDMyCSpUSVBJUENJZCwJCS8qIE91dCAqLworICBjaGFyCQkqVElQU3RyaW5nCQkvKiBPdXQgKi8KKyAgKSk7CisKK1VESUVycm9yIFVESUVudW1lcmF0ZVRJUHMgVURJUGFyYW1zKCgKKyAgVURJSW50CSgqVURJRVRDYWxsYmFjaykJLyogSW4gKi8KKyAgICBVRElQYXJhbXMoKCBjaGFyICpDb25maWd1cmF0aW9uICkpCS8qIEluIHRvIGNhbGxiYWNrKCkgKi8KKyAgKSk7CisKK1VESUVycm9yIFVESUdldEVycm9yTXNnIFVESVBhcmFtcygoCisgIFVESUVycm9yCUVycm9yQ29kZSwJCS8qIEluICovCisgIFVESVNpemVUCU1zZ1NpemUsCQkvKiBJbiAqLworICBjaGFyCQkqTXNnLAkJCS8qIE91dCAqLworICBVRElTaXplVAkqQ291bnREb25lCQkvKiBPdXQgKi8KKyAgKSk7CisKK1VESUVycm9yIFVESUdldFRhcmdldENvbmZpZyBVRElQYXJhbXMoKAorICBVRElNZW1vcnlSYW5nZSBLbm93bk1lbW9yeVtdLAkJLyogT3V0ICovCisgIFVESUludAkqTnVtYmVyT2ZSYW5nZXMsCS8qIEluL091dCAqLworICBVRElVSW50MzIJQ2hpcFZlcnNpb25zW10sCQkvKiBPdXQgKi8KKyAgVURJSW50CSpOdW1iZXJPZkNoaXBzCQkvKiBJbi9PdXQgKi8KKyAgKSk7CisKK1VESUVycm9yIFVESUNyZWF0ZVByb2Nlc3MgVURJUGFyYW1zKCgKKyAgVURJUElkCSpQSWQJCQkvKiBPdXQgKi8KKyAgKSk7CisKK1VESUVycm9yIFVESVNldEN1cnJlbnRQcm9jZXNzIFVESVBhcmFtcygoCisgIFVESVBJZAlQSWQJCQkvKiBJbiAqLworICApKTsKKworVURJRXJyb3IgVURJRGVzdHJveVByb2Nlc3MgVURJUGFyYW1zKCgKKyAgVURJUElkCVBJZAkJCS8qIEluICovCisgICkpOworCitVRElFcnJvciBVRElJbml0aWFsaXplUHJvY2VzcyBVRElQYXJhbXMoKAorICBVRElNZW1vcnlSYW5nZSBQcm9jZXNzTWVtb3J5W10sCS8qIEluICovCisgIFVESUludAlOdW1iZXJPZlJhbmdlcywJCS8qIEluICovCisgIFVESVJlc291cmNlCUVudHJ5UG9pbnQsCQkvKiBJbiAqLworICBDUFVTaXplVAlTdGFja1NpemVzW10sCQkvKiBJbiAqLworICBVRElJbnQJTnVtYmVyT2ZTdGFja3MsCQkvKiBJbiAqLworICBjaGFyCQkqQXJnU3RyaW5nCQkvKiBJbiAqLworICApKTsKKworVURJRXJyb3IgVURJUmVhZCBVRElQYXJhbXMoKAorICBVRElSZXNvdXJjZQlGcm9tLAkJCS8qIEluICovCisgIFVESUhvc3RNZW1QdHIJVG8sCQkJLyogT3V0ICovCisgIFVESUNvdW50CUNvdW50LAkJCS8qIEluICovCisgIFVESVNpemVUCVNpemUsCQkJLyogSW4gKi8KKyAgVURJQ291bnQJKkNvdW50RG9uZSwJCS8qIE91dCAqLworICBVRElCb29sCUhvc3RFbmRpYW4JCS8qIEluICovCisgICkpOworCitVRElFcnJvciBVRElXcml0ZSBVRElQYXJhbXMoKAorICBVRElIb3N0TWVtUHRyCUZyb20sCQkJLyogSW4gKi8KKyAgVURJUmVzb3VyY2UJVG8sCQkJLyogSW4gKi8KKyAgVURJQ291bnQJQ291bnQsCQkJLyogSW4gKi8KKyAgVURJU2l6ZVQJU2l6ZSwJCQkvKiBJbiAqLworICBVRElDb3VudAkqQ291bnREb25lLAkJLyogT3V0ICovCisgIFVESUJvb2wJSG9zdEVuZGlhbgkJLyogSW4gKi8KKyAgKSk7CisKK1VESUVycm9yIFVESUNvcHkgVURJUGFyYW1zKCgKKyAgVURJUmVzb3VyY2UJRnJvbSwJCQkvKiBJbiAqLworICBVRElSZXNvdXJjZQlUbywJCQkvKiBJbiAqLworICBVRElDb3VudAlDb3VudCwJCQkvKiBJbiAqLworICBVRElTaXplVAlTaXplLAkJCS8qIEluICovCisgIFVESUNvdW50CSpDb3VudERvbmUsCQkvKiBPdXQgKi8KKyAgVURJQm9vbAlEaXJlY3Rpb24JCS8qIEluICovCisgICkpOworCitVRElFcnJvciBVRElFeGVjdXRlIFVESVBhcmFtcygoCisgIHZvaWQKKyAgKSk7CisKK1VESUVycm9yIFVESVN0ZXAgVURJUGFyYW1zKCgKKyAgVURJVUludDMyCVN0ZXBzLAkJCS8qIEluICovCisgIFVESVN0ZXBUeXBlICAgU3RlcFR5cGUsCQkvKiBJbiAqLworICBVRElSYW5nZSAgICAgIFJhbmdlCQkJLyogSW4gKi8KKyAgKSk7CisKK1VESVZvaWQgVURJU3RvcCBVRElQYXJhbXMoKAorICB2b2lkCisgICkpOworCitVRElFcnJvciBVRElXYWl0IFVESVBhcmFtcygoCisgIFVESUludDMyCU1heFRpbWUsCQkvKiBJbiAqLworICBVRElQSWQJKlBJZCwJCQkvKiBPdXQgKi8KKyAgVURJVUludDMyCSpTdG9wUmVhc29uCQkvKiBPdXQgKi8KKyAgKSk7CisKK1VESUVycm9yIFVESVNldEJyZWFrcG9pbnQgVURJUGFyYW1zKCgKKyAgVURJUmVzb3VyY2UJQWRkciwJCQkvKiBJbiAqLworICBVRElJbnQzMglQYXNzQ291bnQsCQkvKiBJbiAqLworICBVRElCcmVha1R5cGUJVHlwZSwJCQkvKiBJbiAqLworICBVRElCcmVha0lkCSpCcmVha0lkCQkvKiBPdXQgKi8KKyAgKSk7CisKK1VESUVycm9yIFVESVF1ZXJ5QnJlYWtwb2ludCBVRElQYXJhbXMoKAorICBVRElCcmVha0lkCUJyZWFrSWQsCQkvKiBJbiAqLworICBVRElSZXNvdXJjZQkqQWRkciwJCQkvKiBPdXQgKi8KKyAgVURJSW50MzIJKlBhc3NDb3VudCwJCS8qIE91dCAqLworICBVRElCcmVha1R5cGUJKlR5cGUsCQkJLyogT3V0ICovCisgIFVESUludDMyCSpDdXJyZW50Q291bnQJCS8qIE91dCAqLworICApKTsKKworVURJRXJyb3IgVURJQ2xlYXJCcmVha3BvaW50IFVESVBhcmFtcygoCisgIFVESUJyZWFrSWQJQnJlYWtJZAkJCS8qIEluICovCisgICkpOworCitVRElFcnJvciBVRElHZXRTdGRvdXQgVURJUGFyYW1zKCgKKyAgVURJSG9zdE1lbVB0cglCdWYsCQkJLyogT3V0ICovCisgIFVESVNpemVUCUJ1ZlNpemUsCQkvKiBJbiAqLworICBVRElTaXplVAkqQ291bnREb25lCQkvKiBPdXQgKi8KKyAgKSk7CisKK1VESUVycm9yIFVESUdldFN0ZGVyciBVRElQYXJhbXMoKAorICBVRElIb3N0TWVtUHRyCUJ1ZiwJCQkvKiBPdXQgKi8KKyAgVURJU2l6ZVQJQnVmU2l6ZSwJCS8qIEluICovCisgIFVESVNpemVUCSpDb3VudERvbmUJCS8qIE91dCAqLworICApKTsKKworVURJRXJyb3IgVURJUHV0U3RkaW4gVURJUGFyYW1zKCgKKyAgVURJSG9zdE1lbVB0cglCdWYsCQkJLyogSW4gKi8KKyAgVURJU2l6ZVQJQ291bnQsCQkJLyogSW4gKi8KKyAgVURJU2l6ZVQJKkNvdW50RG9uZQkJLyogT3V0ICovCisgICkpOworCitVRElFcnJvciBVRElTdGRpbk1vZGUgVURJUGFyYW1zKCgKKyAgVURJTW9kZQkqTW9kZQkJCS8qIE91dCAqLworICApKTsKKworVURJRXJyb3IgVURJUHV0VHJhbnMgVURJUGFyYW1zKCgKKyAgVURJSG9zdE1lbVB0cglCdWYsCQkJLyogSW4gKi8KKyAgVURJU2l6ZVQJQ291bnQsCQkJLyogSW4gKi8KKyAgVURJU2l6ZVQJKkNvdW50RG9uZQkJLyogT3V0ICovCisgICkpOworCitVRElFcnJvciBVRElHZXRUcmFucyBVRElQYXJhbXMoKAorICBVRElIb3N0TWVtUHRyCUJ1ZiwJCQkvKiBPdXQgKi8KKyAgVURJU2l6ZVQJQnVmU2l6ZSwJCS8qIEluICovCisgIFVESVNpemVUCSpDb3VudERvbmUJCS8qIE91dCAqLworICApKTsKKworVURJRXJyb3IgVURJVHJhbnNNb2RlIFVESVBhcmFtcygoCisgIFVESU1vZGUJKk1vZGUJCQkvKiBPdXQgKi8KKyAgKSk7CmRpZmYgLS1naXQgYS9nZGIvMjlrLXNoYXJlL3VkaS91ZGlwdDI5ay5oIGIvZ2RiLzI5ay1zaGFyZS91ZGkvdWRpcHQyOWsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGUyZjNmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiLzI5ay1zaGFyZS91ZGkvdWRpcHQyOWsuaApAQCAtMCwwICsxLDg3IEBACisvKiBUaGlzIGZpbGUgaXMgdG8gYmUgdXNlZCB0byByZWNvbmZpZ3VyZSB0aGUgVURJIFByb2NlZHVyYWwgaW50ZXJmYWNlCisgICBmb3IgYSBnaXZlbiB0YXJnZXQuCisKKyAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBzaG91bGQgYmUgcGxhY2VkIHNvIHRoYXQgaXQgd2lsbCBiZQorICAgaW5jbHVkZWQgZnJvbSB1ZGlwcm9jLmguIEV2ZXJ5dGhpbmcgaW4gaGVyZSB3aWxsIHByb2JhYmx5IG5lZWQgdG8KKyAgIGJlIGNoYW5nZWQgd2hlbiB5b3UgY2hhbmdlIHRoZSB0YXJnZXQgcHJvY2Vzc29yLiBOb3RoaW5nIGluIGhlcmUKKyAgIHNob3VsZCBuZWVkIHRvIGNoYW5nZSB3aGVuIHlvdSBjaGFuZ2UgaG9zdHMgb3IgY29tcGlsZXJzLgorKi8KKworLyogU2VsZWN0IGEgdGFyZ2V0IENQVSBGYW1pbHkgKi8KKyNkZWZpbmUgVGFyZ2V0Q1BVRmFtaWx5IAlBbTI5SworCisvKiBFbnVtZXJhdGUgdGhlIHByb2Nlc3NvciBzcGVjaWZpYyB2YWx1ZXMgZm9yIFNwYWNlIGluIGEgcmVzb3VyY2UgKi8KKyNkZWZpbmUgVURJMjlLRFJBTVNwYWNlCQkwCisjZGVmaW5lIFVESTI5S0lPU3BhY2UJCTEKKyNkZWZpbmUgVURJMjlLQ1BTcGFjZTAJCTIKKyNkZWZpbmUgVURJMjlLQ1BTcGFjZTEJCTMKKyNkZWZpbmUgVURJMjlLSVJPTVNwYWNlCQk0CisjZGVmaW5lIFVESTI5S0lSQU1TcGFjZQkJNQorI2RlZmluZSBVREkyOUtMb2NhbFJlZ3MJCTgKKyNkZWZpbmUgVURJMjlLR2xvYmFsUmVncwk5CisjZGVmaW5lIFVESTI5S1JlYWxSZWdzCQkxMAorI2RlZmluZSBVREkyOUtTcGVjaWFsUmVncwkxMQorI2RlZmluZSBVREkyOUtUTEJSZWdzCQkxMgkvKiBOb3QgQW0yOTAwNSAqLworI2RlZmluZSBVREkyOUtBQ0NSZWdzCQkxMwkvKiBBbTI5MDUwIG9ubHkgKi8KKyNkZWZpbmUgVURJMjlLSUNhY2hlU3BhY2UJMTQJLyogQW0yOTAzeCBvbmx5ICovCisjZGVmaW5lIFVESTI5S0FtMjkwMjdSZWdzCTE1CS8qIFdoZW4gYXZhaWxhYmxlICovCisjZGVmaW5lIFVESTI5S1BDCQkxNgorI2RlZmluZSBVREkyOUtEQ2FjaGVTcGFjZQkxNwkvKiBXaGVuIGF2YWlsYWJsZSAqLworCisvKiBFbnVtZXJhdGUgdGhlIENvLXByb2Nlc3NvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVURJMjlLQ1BfRgkJMAorI2RlZmluZSBVREkyOUtDUF9GbGFnCQk4CisjZGVmaW5lIFVESTI5S0NQX0kJCTEyCisjZGVmaW5lIFVESTI5S0NQX0lUbXAJCTE2CisjZGVmaW5lIFVESTI5S0NQX1IJCTIwCisjZGVmaW5lIFVESTI5S0NQX1MJCTI4CisjZGVmaW5lIFVESTI5S0NQX1JUbXAJCTM2CisjZGVmaW5lIFVESTI5S0NQX1NUbXAJCTQ0CisjZGVmaW5lIFVESTI5S0NQX1N0YXQJCTUyCisjZGVmaW5lIFVESTI5S0NQX1ByZWMJCTU2CisjZGVmaW5lIFVESTI5S0NQX1JlZzAJCTYwCisjZGVmaW5lIFVESTI5S0NQX1JlZzEJCTY4CisjZGVmaW5lIFVESTI5S0NQX1JlZzIJCTc2CisjZGVmaW5lIFVESTI5S0NQX1JlZzMJCTg0CisjZGVmaW5lIFVESTI5S0NQX1JlZzQJCTkyCisjZGVmaW5lIFVESTI5S0NQX1JlZzUJCTEwMAorI2RlZmluZSBVREkyOUtDUF9SZWc2CQkxMDgKKyNkZWZpbmUgVURJMjlLQ1BfUmVnNwkJMTE2CisjZGVmaW5lIFVESTI5S0NQX01vZGUJCTEyNAorCisvKiBFbnVtZXJhdGUgdGhlIHN0YWNrcyBpbiBTdGFja1NpemVzIGFycmF5ICovCisjZGVmaW5lIFVESTI5S01lbW9yeVN0YWNrCTAKKyNkZWZpbmUgVURJMjlLUmVnaXN0ZXJTdGFjawkxCisKKy8qIEVudW1lcmF0ZSB0aGUgY2hpcHMgZm9yIENoaXBWZXJzaW9ucyBhcnJheSAqLworI2RlZmluZSBVREkyOUsyOUtWZXJzaW9uCTAKKyNkZWZpbmUgVURJMjlLMjkwMjdWZXJzaW9uCTEKKworLyogRGVmaW5lIHNwZWNpYWwgdmFsdWUgZm9yIGVsZW1lbnRzIG9mIENoaXBWZXJzaW9ucyBhcnJheSBmb3IKKyAqIGNoaXBzIG5vdCBwcmVzZW50ICovCisjZGVmaW5lIFVESTI5S0NoaXBOb3RQcmVzZW50CS0xCisKK3R5cGVkZWYJVURJSW50MzIJCVVESUNvdW50OwordHlwZWRlZglVRElVSW50MzIJCVVESVNpemU7CisKK3R5cGVkZWYgVURJSW50CQkJQ1BVU3BhY2U7Cit0eXBlZGVmIFVESVVJbnQzMgkJQ1BVT2Zmc2V0OwordHlwZWRlZglVRElVSW50MzIJCUNQVVNpemVUOwpkaWZmIC0tZ2l0IGEvZ2RiLzI5ay1zaGFyZS91ZGkvdWRpcHRjZmcuaCBiL2dkYi8yOWstc2hhcmUvdWRpL3VkaXB0Y2ZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0MWE1MwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi8yOWstc2hhcmUvdWRpL3VkaXB0Y2ZnLmgKQEAgLTAsMCArMSwxOSBAQAorLyogQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgInVkaXB0MjlrLmgiCmRpZmYgLS1naXQgYS9nZGIvMjlrLXNoYXJlL3VkaS91ZGlzb2MuaCBiL2dkYi8yOWstc2hhcmUvdWRpL3VkaXNvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNjhiMzkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvMjlrLXNoYXJlL3VkaS91ZGlzb2MuaApAQCAtMCwwICsxLDE4NCBAQAorLyogVGhpcyBtb2R1bGUgZGVmaW5lcyBjb25zdGFudHMgdXNlZCBpbiB0aGUgVURJIElQQyBtb2R1bGVzLgorCisgICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCitzdGF0aWMgY2hhciB1ZGlzb2NfaFtdPSJAKCMpdWRpc29jLmgJMi42ICBEYW5pZWwgTWFubiI7CitzdGF0aWMgY2hhciB1ZGlzb2NfaF9BTURbXT0iQCgjKXVkaXNvYy5oCTIuNCwgQU1EIjsKKworI2RlZmluZSBMT0NBTCBzdGF0aWMKKyNkZWZpbmUJY29tcGFueV9jCTEJCS8qIEFNRCBDb21wYW55IGlkICovCisjZGVmaW5lCXByb2R1Y3RfYyAJMQkJLyogc29ja2V0IElQQyBpZCAqLworCisvKiBFbnVtZXJhdGUgdGhlIFVESSBwcm9jZWR1cmUgc2VydmljZXMgCisqLworI2RlZmluZQlVRElDb25uZWN0X2MJCQkwCisjZGVmaW5lCVVESURpc2Nvbm5lY3RfYwkJCTEKKyNkZWZpbmUJVURJU2V0Q3VycmVudENvbm5lY3Rpb25fYwkyCisjZGVmaW5lCVVESUNhcGFiaWxpdGllc19jCQkzCisjZGVmaW5lCVVESUVudW1lcmF0ZVRJUHNfYwkJNAorI2RlZmluZQlVRElHZXRFcnJvck1zZ19jCQk1CisjZGVmaW5lCVVESUdldFRhcmdldENvbmZpZ19jCQk2CisjZGVmaW5lCVVESUNyZWF0ZVByb2Nlc3NfYwkJNworI2RlZmluZQlVRElTZXRDdXJyZW50UHJvY2Vzc19jCQk4CisjZGVmaW5lCVVESURlc3Ryb3lQcm9jZXNzX2MJCTkKKyNkZWZpbmUJVURJSW5pdGlhbGl6ZVByb2Nlc3NfYwkJMTAKKyNkZWZpbmUJVURJUmVhZF9jCQkJMTEKKyNkZWZpbmUJVURJV3JpdGVfYwkJCTEyCisjZGVmaW5lCVVESUNvcHlfYwkJCTEzCisjZGVmaW5lCVVESUV4ZWN1dGVfYwkJCTE0CisjZGVmaW5lCVVESVN0ZXBfYwkJCTE1CisjZGVmaW5lCVVESVN0b3BfYwkJCTE2CisjZGVmaW5lCVVESVdhaXRfYwkJCTE3CisjZGVmaW5lCVVESVNldEJyZWFrcG9pbnRfYwkJMTgKKyNkZWZpbmUJVURJUXVlcnlCcmVha3BvaW50X2MJCTE5CisjZGVmaW5lCVVESUNsZWFyQnJlYWtwb2ludF9jCQkyMAorI2RlZmluZQlVRElHZXRTdGRvdXRfYwkJCTIxCisjZGVmaW5lCVVESUdldFN0ZGVycl9jCQkJMjIKKyNkZWZpbmUJVURJUHV0U3RkaW5fYwkJCTIzCisjZGVmaW5lCVVESVN0ZGluTW9kZV9jCQkJMjQKKyNkZWZpbmUJVURJUHV0VHJhbnNfYwkJCTI1CisjZGVmaW5lCVVESUdldFRyYW5zX2MJCQkyNgorI2RlZmluZQlVRElUcmFuc01vZGVfYwkJCTI3CisjZGVmaW5lCVVESVRlc3RfYwkJCTI4CisjZGVmaW5lCVVESUtpbGxfYwkJCTI5CisKKyNkZWZpbmUJdWRyX1VESUludDgodWRycywgb2JqKSAgdWRyX3dvcmsodWRycywgb2JqLCAxKQorI2RlZmluZQl1ZHJfVURJSW50MTYodWRycywgb2JqKSB1ZHJfd29yayh1ZHJzLCBvYmosIDIpCisjZGVmaW5lCXVkcl9VRElJbnQzMih1ZHJzLCBvYmopIHVkcl93b3JrKHVkcnMsIG9iaiwgNCkKKyNkZWZpbmUJdWRyX1VESUludCh1ZHJzLCBvYmopICAgdWRyX3dvcmsodWRycywgb2JqLCA0KQorCisjZGVmaW5lCXVkcl9VRElVSW50OCh1ZHJzLCBvYmopICB1ZHJfd29yayh1ZHJzLCBvYmosIDEpCisjZGVmaW5lCXVkcl9VRElVSW50MTYodWRycywgb2JqKSB1ZHJfd29yayh1ZHJzLCBvYmosIDIpCisjZGVmaW5lCXVkcl9VRElVSW50MzIodWRycywgb2JqKSB1ZHJfd29yayh1ZHJzLCBvYmosIDQpCisjZGVmaW5lCXVkcl9VRElVSW50KHVkcnMsIG9iaikgICB1ZHJfd29yayh1ZHJzLCBvYmosIDQpCisKKyNkZWZpbmUJdWRyX1VESUJvb2wodWRycywgb2JqKSAgIHVkcl9VRElJbnQzMih1ZHJzLCBvYmopCisjZGVmaW5lCXVkcl9VRElDb3VudCh1ZHJzLCBvYmopICB1ZHJfVURJSW50MzIodWRycywgb2JqKQorI2RlZmluZQl1ZHJfVURJU2l6ZSh1ZHJzLCBvYmopICAgdWRyX1VESVVJbnQzMih1ZHJzLCBvYmopCisjZGVmaW5lCXVkcl9DUFVTcGFjZSh1ZHJzLCBvYmopICB1ZHJfVURJSW50MzIodWRycywgb2JqKQorI2RlZmluZQl1ZHJfQ1BVT2Zmc2V0KHVkcnMsIG9iaikgdWRyX1VESVVJbnQzMih1ZHJzLCBvYmopCisjZGVmaW5lCXVkcl9DUFVTaXplVCh1ZHJzLCBvYmopICB1ZHJfVURJVUludDMyKHVkcnMsIG9iaikKKyNkZWZpbmUJdWRyX1VESUJyZWFrSWQodWRycyxvYmopIHVkcl9VRElVSW50KHVkcnMsIG9iaikKKyNkZWZpbmUJdWRyX1VESVNpemVUKHVkcnMsIG9iaikgIHVkcl9VRElVSW50KHVkcnMsIG9iaikKKyNkZWZpbmUJdWRyX1VESU1vZGUodWRycywgb2JqKSAgIHVkcl9VRElVSW50KHVkcnMsIG9iaikKKworI2RlZmluZQl1ZHJfVURJSG9zdE1lbVB0cih1ZHJzLCBvYmopIHVkcl9VRElVSW50MzIodWRycywgb2JqKQorI2RlZmluZQl1ZHJfVURJVm9pZFB0cih1ZHJzLCBvYmopICAgdWRyX1VESVVJbnQzMih1ZHJzLCBvYmopCisjZGVmaW5lCXVkcl9VRElQSWQodWRycywgb2JqKSAgICAgICB1ZHJfVURJVUludCh1ZHJzLCBvYmopCisjZGVmaW5lCXVkcl9VRElTZXNzaW9uSWQodWRycywgb2JqKSB1ZHJfVURJSW50MzIodWRycywgb2JqKQorI2RlZmluZQl1ZHJfVURJRXJyb3IodWRycywgb2JqKSAgICAgdWRyX1VESUludDMyKHVkcnMsIG9iaikKKyNkZWZpbmUJdWRyX1VESVN0ZXBUeXBlKHVkcnMsIG9iaikgIHVkcl9VRElJbnQzMih1ZHJzLCBvYmopCisjZGVmaW5lCXVkcl9VRElCcmVha1R5cGUodWRycywgb2JqKSB1ZHJfVURJSW50MzIodWRycywgb2JqKQorCisgCisjZGVmaW5lCVVEUl9FTkNPREUgMQorI2RlZmluZQlVRFJfREVDT0RFIDIKKwordHlwZWRlZiBzdHJ1Y3QJVURSX3N0cgoreworICAgIGludAkJdWRyX29wOwkJCS8qIFVEUiBvcGVyYXRpb24gKi8KKyAgICBpbnQJCXByZXZpb3VzX29wOworICAgIGludAkJc2Q7CisgICAgaW50CQlidWZzaXplOworICAgIGNoYXIqCWJ1ZmY7CisgICAgY2hhcioJZ2V0Ynl0ZXM7CisgICAgY2hhcioJcHV0Ynl0ZXM7CisgICAgY2hhcioJcHV0ZW5kOworICAgIGludAkJZG9tYWluOworICAgIGNoYXIqCXNvY19uYW1lOworfSBVRFI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERlY2xhcmUgVURSIHN1cG9ydCBmdW5jdGlvbnMgKi8KK2ludCB1ZHJfY3JlYXRlIFVESVBhcmFtcygoCisgIFVEUioJdWRycywKKyAgaW50CXNkLAorICBpbnQJc2l6ZQorICApKTsKKworaW50IHVkcl9mcmVlIFVESVBhcmFtcygoCisgIFVEUioJdWRycywKKyAgKSk7CisKK2ludCB1ZHJfc2lnbmFsIFVESVBhcmFtcygoCisgIFVEUioJdWRycywKKyAgKSk7CisKK2ludCB1ZHJfc2VuZG5vdyBVRElQYXJhbXMoKAorICBVRFIqCXVkcnMKKyAgKSk7CisKK2ludCB1ZHJfd29yayBVRElQYXJhbXMoKAorICBVRFIqCXVkcnMsCisgIHZvaWQqCW9iamVjdF9wLAorICBpbnQJc2l6ZQorICApKTsKKworaW50IHVkcl9VRElSZXNvdXJjZSBVRElQYXJhbXMoKAorICBVRFIqCXVkcnMsCisgIFVESVJlc291cmNlKglvYmplY3RfcAorICApKTsKKworaW50IHVkcl9VRElSYW5nZSBVRElQYXJhbXMoKAorICBVRFIqCXVkcnMsCisgIFVESVJhbmdlKglvYmplY3RfcAorICApKTsKKworaW50IHVkcl9VRElNZW1vcnlSYW5nZSBVRElQYXJhbXMoKAorICBVRFIqCXVkcnMsCisgIFVESU1lbW9yeVJhbmdlKglvYmplY3RfcAorICApKTsKKworaW50IHVkcl9VRElNZW1vcnlSYW5nZSBVRElQYXJhbXMoKAorICBVRFIqCXVkcnMsCisgIFVESU1lbW9yeVJhbmdlKiBvYmplY3RfcAorICApKTsKKworaW50IHVkcl9pbnQgVURJUGFyYW1zKCgKKyAgVURSKgl1ZHJzLAorICBpbnQqCWludF9wCisgICkpOworCitpbnQgdWRyX2J5dGVzIFVESVBhcmFtcygoCisgIFVEUioJdWRycywKKyAgY2hhcioJcHRyLAorICBpbnQJbGVuCisgICkpOworCitjaGFyKiB1ZHJfaW5saW5lIFVESVBhcmFtcygoCisgIFVEUioJdWRycywKKyAgaW50CXNpemUKKyAgKSk7CisKK2NoYXIqCXVkcl9nZXRwb3MgVURJUGFyYW1zKCgKKyAgVURSKgl1ZHJzCisgICkpOworaW50CXVkcl9zZXRwb3MgVURJUGFyYW1zKCgKKyAgVURSKgl1ZHJzLAorICBjaGFyKglwb3MKKyAgKSk7CisKK2ludAl1ZHJfcmVhZG5vdyBVRElQYXJhbXMoKAorICBVRFIqCXVkcnMsCisgIGludAlzaXplCisgICkpOworCitpbnQgdWRyX2FsaWduIFVESVBhcmFtcygoCisgIFVEUioJdWRycywKKyAgaW50CXNpemUsCisgICkpOwpkaWZmIC0tZ2l0IGEvZ2RiLzI5ay1zaGFyZS91ZGkvdWRyLmMgYi9nZGIvMjlrLXNoYXJlL3VkaS91ZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGE5ZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiLzI5ay1zaGFyZS91ZGkvdWRyLmMKQEAgLTAsMCArMSw0MjcgQEAKKy8qIFRoaXMgbW9kdWxlIHN1cHBvcnRzIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBkYXRhIG9iamVjdHMgb3ZlciBhCisgICBzb2NrZXQgY29uZWN0aW9uLgorCisgICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCitzdGF0aWMgY2hhciB1ZHJfY1tdPSJAKCMpdWRyLmMJMi44ICBEYW5pZWwgTWFubiI7CitzdGF0aWMgY2hhciB1ZHJfY19BTURbXT0iQCgjKXVkci5jCTIuMywgQU1EIjsKKy8qIAorKglBbGwgZGF0YSBpcyBzZXJpYWxpc2VkIGludG8gYSBjaGFyYWN0ZXIgc3RyZWFtLAorKglhbmQgZGUtc2VyaWFsaXNlZCBiYWNrIGludG8gdGhlIGFwcHJvcHJvaWF0ZSBvYmplY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBISVNUT1JZCisqLworLyogVGhpcyBpcyBhbGwgdW5uZWVkZWQgb24gRE9TIG1hY2hpbmVzLiAgKi8KKyNpZm5kZWYgX19HTzMyX18KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIFRoaXMgdXNlZCB0byBzYXkgc3lzL2ZjbnRsLmgsIGJ1dCB0aGUgb25seSBzeXN0ZW1zIEkga25vdyBvZiB0aGF0CisgICByZXF1aXJlIHRoYXQgYXJlIG9sZCAocHJlLTQuMywgYXQgbGVhc3QpIEJTRCBzeXN0ZW1zLCB3aGljaCB3ZQorICAgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dC4gICovCisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlICJ1ZGlwcm9jLmgiCisjaW5jbHVkZSAidWRpc29jLmgiCisKK2V4dGVybglpbnQJZXJybm87CitleHRlcm4JY2hhcioJbWFsbG9jKCk7CisKKy8qIGxvY2FsIHR5cGUgZGVjcy4gYW5kIG1hY3JvIGRlZnMuIG5vdCBpbiBhIC5oICBmaWxlICoqKioqKioqKioqKiogTUFDUk8vVFlQRQorKi8KKworLyogZ2xvYmFsIGRlYy9kZWZzLiB3aGljaCBhcmUgbm90IGluIGEgLmggICBmaWxlICoqKioqKioqKioqKiogRVhQT1JUIERFQy9ERUZTCisqLworaW50CQl1ZHJfZXJybm87CQkvKiBlcnJvciBvY2N1cnMgZHVyaW5nIFVEUiBzZXJ2aWNlICovCisKKy8qIGxvY2FsIGRlYy9kZWZzLiB3aGljaCBhcmUgbm90IGluIGEgLmggICBmaWxlICoqKioqKioqKioqKioqKiBMT0NBTCBERUMvREVGUworKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRFJfQ1JFQVRFCisqIEJ1aWxkIFVEUiBzdHJ1Y3R1cmUgZm9yIGNoYXJhY3RlciBzdHJlYW0gcHJvY2Vzc2luZy4KKyovCitpbnQgdWRyX2NyZWF0ZSh1ZHJzLCBzZCwgc2l6ZSkKK1VEUioJdWRyczsKK2ludAlzZDsKK2ludAlzaXplOworeworICAgIHVkcnMtPnNkID0gc2Q7CisgICAgaWYoIXVkcnMtPmJ1ZmYpIHVkcnMtPmJ1ZmYgPSBtYWxsb2Moc2l6ZSk7CisgICAgdWRycy0+Z2V0Ynl0ZXMgPSB1ZHJzLT5idWZmOwkvKiBzZXQgdGhlIGJ1ZmZlciB0byB0aGUgc3RhcnQgKi8KKyAgICB1ZHJzLT5wdXRieXRlcyA9IHVkcnMtPmJ1ZmY7CisgICAgdWRycy0+cHV0ZW5kID0gdWRycy0+YnVmZjsKKyAgICB1ZHJzLT51ZHJfb3AgPSAtMTsJCQkvKiBkb24ndCBrbm93IHRoZSBkaXJlY3Rpb24gKi8KKyAgICB1ZHJzLT5wcmV2aW91c19vcCA9IC0xOwkJLyogZG9uJ3Qga25vdyB0aGUgZGlyZWN0aW9uICovCisgICAgdWRycy0+YnVmc2l6ZSA9IHNpemU7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRFJfRlJFRQorKiBGcmVlIFVTUiBzdHJ1Y3R1cmUgYW5kIGNsb3NlIHNvY2tldC4KKyovCitpbnQgdWRyX2ZyZWUodWRycykKK1VEUioJdWRyczsKK3sKKyAgICBjbG9zZSh1ZHJzLT5zZCk7CisgICAgZnJlZSh1ZHJzLT5idWZmKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRFJfU0lHTkFMCisqIFNlbmQgYSBzaWduYWwgdG8gdGhlIHByb2Nlc3MgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgc29ja2V0LAorKiBpbmRpY2F0aW5nIHRoYXQgaXQgc2hvdWxkIGV4cGVjdCB0byByZWNpZXZlIGEgbmV3IG1lc3NhZ2Ugc2hvcnRseS4KKyovCitpbnQgdWRyX3NpZ25hbCh1ZHJzKQorVURSKgl1ZHJzOworeworICAgIGlmKHNlbmQodWRycy0+c2QsICJJIiwgMSwgTVNHX09PQikgPT0gLTEpCisgICAgewlwZXJyb3IoIkVSUk9SLCB1ZHJfc2lnbmFsKCksIHNlbmQoLi4uTVNHX09PQikiKTsKKwl1ZHJfZXJybm8gPSAgVURJRXJyb3JJUENJbnRlcm5hbDsKKyAgICAJcmV0dXJuIC0xOwkJLyogcmV0dXJuIGVycm9yIGNvZGUgKi8KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRFJfU0VORE5PVworKiB1c2VkIHRvIGZsdXNoIHRoZSBjdXJyZW50IGNoYXJhY3RlciBzdHJlYW0gYnVmZmVyIHRvCisqIHRoZSBhc3NvY2lhdGVkIHNvY2tldC4gICovCitpbnQgdWRyX3NlbmRub3codWRycykKK1VEUioJdWRyczsKK3sKKyAgICBpbnQgc2l6ZSA9IChVRElVSW50MzIpKHVkcnMtPnB1dGVuZCkgLSAoVURJVUludDMyKSh1ZHJzLT5idWZmKTsKKyAgICBpZih1ZHJzLT5wcmV2aW91c19vcCA9PSAwKQorICAgIHsgICB1ZHJfZXJybm8gPSAgVURJRXJyb3JJUENJbnRlcm5hbDsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIHVkcnMtPnB1dGJ5dGVzID0gdWRycy0+YnVmZjsKKyAgICB1ZHJzLT5wdXRlbmQgPSB1ZHJzLT5idWZmOworICAgIGlmICh3cml0ZSh1ZHJzLT5zZCwgdWRycy0+YnVmZiwgc2l6ZSkgPT0gLTEpCisgICAgewlwZXJyb3IoIkVSUk9SLCB1ZHJfc2VuZG5vdygpLCB3cml0ZSgpIGNhbGw6ICIpOworCXVkcl9lcnJubyA9ICBVRElFcnJvcklQQ0ludGVybmFsOworICAgIAlyZXR1cm4gLTE7CQkvKiByZXR1cm4gZXJyb3IgY29kZSAqLworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVEUl9XT1JLCisqIEZ1bmN0aW9uIHRvIHNlbmQgb3IgcmVjaWV2ZSBkYXRhIGZyb20gdGhlIGJ1ZmZlcnMgc3VwcG9ydGluZworKiBzb2NrZXQgY29tbXVuaWNhdGlvbi4gVGhlIGJ1ZmZlciBjb250YWlucyBzZXJpYWxpc2VkIG9iamVjdHMKKyogc2VudC9yZWNpZXZlZCBvdmVyIGEgc29ja2V0IGNvbm5lY3Rpb24uCisqLworaW50IHVkcl93b3JrKHVkcnMsIG9iamVjdF9wLCBzaXplKQorVURSKgl1ZHJzOwordm9pZCoJb2JqZWN0X3A7CitpbnQJc2l6ZTsKK3sKKyAgICBpbnQJICAgIGNudCwgcmVtYWluOworCisgICAgaWYodWRycy0+dWRyX29wICE9IHVkcnMtPnByZXZpb3VzX29wKQorICAgIHsJaWYodWRycy0+cHJldmlvdXNfb3AgPT0gMCkKKwl7ICAgdWRyX2Vycm5vID0gIFVESUVycm9ySVBDSW50ZXJuYWw7CisJICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCXVkcnMtPnByZXZpb3VzX29wPSB1ZHJzLT51ZHJfb3A7CisJdWRycy0+cHV0Ynl0ZXMgPSB1ZHJzLT5idWZmOworCXVkcnMtPmdldGJ5dGVzID0gdWRycy0+YnVmZjsKKyAgICB9CisKKyAgICBpZih1ZHJzLT51ZHJfb3AgPT0gVURSX0VOQ09ERSkKKyAgICB7CQkJLyogd3JpdGUgZGF0YSBpbnRvIGNoYXJhY3RlciBzdHJlYW0gYnVmZmVyICovCisgICAgCWlmKCAoVURJVUludDMyKSh1ZHJzLT5wdXRieXRlcykgKyBzaXplID4KKwkgICAgKFVESVVJbnQzMikodWRycy0+YnVmZikgKyAoVURJVUludDMyKSh1ZHJzLT5idWZzaXplKSApCisJeyAgIHVkcl9lcnJubyA9ICBVRElFcnJvcklQQ0ludGVybmFsOworCSAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKwltZW1jcHkodWRycy0+cHV0Ynl0ZXMsIChjaGFyKilvYmplY3RfcCwgc2l6ZSk7CisgICAgCXVkcnMtPnB1dGJ5dGVzICs9IHNpemU7CisgICAgCWlmKHVkcnMtPnB1dGJ5dGVzID4gdWRycy0+cHV0ZW5kKSB1ZHJzLT5wdXRlbmQgPSB1ZHJzLT5wdXRieXRlczsKKyAgICB9CisgICAgZWxzZSBpZih1ZHJzLT51ZHJfb3AgPT0gVURSX0RFQ09ERSkKKyAgICB7CisgICAgCWlmKCAoVURJVUludDMyKSh1ZHJzLT5wdXRieXRlcyktKFVESVVJbnQzMikodWRycy0+Z2V0Ynl0ZXMpIDwgc2l6ZSApCisJewkJIC8qIG5lZWQgbW9yZSBkYXRhIGluIGNoYXJhY3RlciBzdHJlYW0gYnVmZmVyICovCisgICAgICAgCSAgICByZW1haW4gPSAoVURJVUludDMyKSh1ZHJzLT5idWZzaXplKSAtCisJCSggKFVESVVJbnQzMikodWRycy0+cHV0Ynl0ZXMpLShVRElVSW50MzIpKHVkcnMtPmJ1ZmYpICk7CisgICAgICAgCSAgICBpZiggKChVRElVSW50MzIpKHVkcnMtPmJ1ZnNpemUpICsgKFVESVVJbnQzMikodWRycy0+YnVmZikKKwkJLSAoVURJVUludDMyKSh1ZHJzLT5nZXRieXRlcykpIDwgc2l6ZSkKKwkgICAgeyAgIHVkcl9lcnJubyA9ICBVRElFcnJvcklQQ0ludGVybmFsOworCSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgIAkgICAgY250ID0gcmVhZCh1ZHJzLT5zZCwgKGNoYXIqKXVkcnMtPnB1dGJ5dGVzLCByZW1haW4pOworCSAgICBpZihjbnQgPT0gLTEpIHBlcnJvcigiRVJST1IgdWRyX3dvcmsoKSwgIHJlYWQoKSBmYWlsdXJlOiAiKTsKKwkgICAgdWRycy0+cHV0Ynl0ZXMgKz0gY250OworICAgIAkgICAgaWYoIChVRElVSW50MzIpKHVkcnMtPnB1dGJ5dGVzKS0oVURJVUludDMyKSh1ZHJzLT5nZXRieXRlcykgPCBzaXplICkKKwkgICAgewl1ZHJfZXJybm8gPSAgVURJRXJyb3JJUENJbnRlcm5hbDsKKwkgICAgICAgIHJldHVybiAtMTsJCS8qIHJldHVybiBlcnJvciBjb2RlICovCisgICAgCSAgICB9CisgICAgCX0JCS8qIHJlYWQgZGF0YSBmcm9tIGNoYXJhY3RlciBzdHJlYW0gYnVmZmVyICovCisJbWVtY3B5KChjaGFyKilvYmplY3RfcCwgIHVkcnMtPmdldGJ5dGVzLCBzaXplKTsKKyAgICAJdWRycy0+Z2V0Ynl0ZXMgKz0gc2l6ZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsJdWRyX2Vycm5vID0gIFVESUVycm9ySVBDSW50ZXJuYWw7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVURSX1VESVJlc291cmNlCisqLworaW50IHVkcl9VRElSZXNvdXJjZSh1ZHJzLCBvYmplY3RfcCkKK1VEUioJdWRyczsKK1VESVJlc291cmNlKglvYmplY3RfcDsKK3sKKyAgICBpbnQJcmV0dmFsOworCisgICAgcmV0dmFsID0gdWRyX0NQVVNwYWNlKHVkcnMsICZvYmplY3RfcC0+U3BhY2UpOworICAgIHJldHZhbCA9IHJldHZhbCB8ICB1ZHJfQ1BVT2Zmc2V0KHVkcnMsICZvYmplY3RfcC0+T2Zmc2V0KTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRFJfVURJUmFuZ2UKKyovCitpbnQgdWRyX1VESVJhbmdlKHVkcnMsIG9iamVjdF9wKQorVURSKgkJdWRyczsKK1VESVJhbmdlKglvYmplY3RfcDsKK3sKKyAgICBpbnQJcmV0dmFsOworCisgICAgcmV0dmFsID0gdWRyX0NQVU9mZnNldCh1ZHJzLCAmb2JqZWN0X3AtPkxvdyk7CisgICAgcmV0dmFsID0gcmV0dmFsIHwgdWRyX0NQVU9mZnNldCh1ZHJzLCAmb2JqZWN0X3AtPkhpZ2gpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVEUl9VRElNZW1vcnlSYW5nZQorKi8KK2ludCB1ZHJfVURJTWVtb3J5UmFuZ2UodWRycywgb2JqZWN0X3ApCitVRFIqCQl1ZHJzOworVURJTWVtb3J5UmFuZ2UqCW9iamVjdF9wOworeworICAgIGludAlyZXR2YWw7CisKKyAgICByZXR2YWwgPSB1ZHJfQ1BVU3BhY2UodWRycywgJm9iamVjdF9wLT5TcGFjZSk7CisgICAgcmV0dmFsID0gcmV0dmFsIHwgdWRyX0NQVU9mZnNldCh1ZHJzLCAmb2JqZWN0X3AtPk9mZnNldCk7CisgICAgcmV0dmFsID0gcmV0dmFsIHwgdWRyX0NQVVNpemVUKHVkcnMsICZvYmplY3RfcC0+U2l6ZSk7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRFJfc3RyaW5nCisqLworaW50IHVkcl9zdHJpbmcodWRycywgc3ApCitVRFIqCXVkcnM7CitjaGFyKglzcDsKK3sKKyAgICBpbnQJbGVuLCByZXR2YWw7CisKKyAgICBpZih1ZHJzLT51ZHJfb3AgPT0gVURSX0VOQ09ERSkKKyAgICB7CisJaWYoc3ApCisgICAgCXsgICBsZW4gPSBzdHJsZW4oc3ApICsgMTsKKyAgICAJICAgIHJldHZhbCA9IHVkcl9VRElJbnQzMih1ZHJzLCAmbGVuKTsKKyAgICAJICAgIHJldHZhbCA9IHJldHZhbCB8IHVkcl93b3JrKHVkcnMsIHNwLCBsZW4pOworCX0KKwllbHNlCS8qIGRlYWwgd2l0aCBOVUxMIHBvaW50ZXIgKi8KKwl7ICAgbGVuID0gMDsKKyAgICAJICAgIHJldHZhbCA9IHVkcl9VRElJbnQzMih1ZHJzLCAmbGVuKTsKKwl9CisgICAgfQorICAgIGVsc2UgaWYodWRycy0+dWRyX29wID09IFVEUl9ERUNPREUpCisgICAgeworICAgIAlyZXR2YWwgPSB1ZHJfVURJSW50MzIodWRycywgJmxlbik7CisJaWYobGVuKQorICAgIAkgICAgcmV0dmFsID0gcmV0dmFsIHwgdWRyX3dvcmsodWRycywgc3AsIGxlbik7CisJZWxzZQkqc3AgPSAnXDAnOwkJCS8qIHRlcm1pbmF0ZSBzdHJpbmcgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsJdWRyX2Vycm5vID0gIFVESUVycm9ySVBDSW50ZXJuYWw7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRFJfQllURVMKKyovCitpbnQgdWRyX2J5dGVzKHVkcnMsIHB0ciwgbGVuKQorVURSKgl1ZHJzOworY2hhcioJcHRyOworaW50CWxlbjsKK3sKKyAgICByZXR1cm4gdWRyX3dvcmsodWRycywgcHRyLCBsZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVEUl9JTlQKKyovCitpbnQgdWRyX2ludCh1ZHJzLCBpbnRfcCkKK1VEUioJdWRyczsKK2ludCoJaW50X3A7Cit7CisgICAgaW50IHJldF92YWw7CisgICAgVURJSW50MzIgIHVkcl9vYmo7CQkJLyogb2JqZWN0IG9mIGtub3cgc2l6ZSAqLworCisgICAgaWYodWRycy0+dWRyX29wID09IFVEUl9FTkNPREUpCisgICAgeworICAgICAgICB1ZHJfb2JqID0gKmludF9wOwkJLyogY29weSBpbnRvIGtub3cgb2JqZWN0IHNpemUgKi8KKyAgICAgICAgcmV0dXJuIHVkcl9VRElJbnQzMih1ZHJzLCAmdWRyX29iaik7CisgICAgfQorICAgIGVsc2UgaWYodWRycy0+dWRyX29wID09IFVEUl9ERUNPREUpCisgICAgeworICAgICAgICByZXRfdmFsID0gdWRyX1VESUludDMyKHVkcnMsICZ1ZHJfb2JqKTsJLyogZ2V0IG9iamVjdCBvZiBrbm93biBzaXplICovCisJKmludF9wID0gdWRyX29iajsKKwlyZXR1cm4gcmV0X3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsJdWRyX2Vycm5vID0gIFVESUVycm9ySVBDSW50ZXJuYWw7CisJcmV0dXJuIC0xOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRFJfSU5MSU5FCisqLworY2hhciogdWRyX2lubGluZSh1ZHJzLCBzaXplKQorVURSKgl1ZHJzOworaW50CXNpemU7Cit7CisgICAgaWYodWRycy0+dWRyX29wICE9IHVkcnMtPnByZXZpb3VzX29wKQorICAgIHsJaWYodWRycy0+cHJldmlvdXNfb3AgPT0gMCkKKwl7ICAgdWRyX2Vycm5vID0gIFVESUVycm9ySVBDSW50ZXJuYWw7CisJICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgCXVkcnMtPnByZXZpb3VzX29wPSB1ZHJzLT51ZHJfb3A7CisJdWRycy0+cHV0Ynl0ZXMgPSB1ZHJzLT5idWZmOworCXVkcnMtPmdldGJ5dGVzID0gdWRycy0+YnVmZjsKKyAgICB9CisgICAgaWYodWRycy0+dWRyX29wID09IFVEUl9FTkNPREUpCisgICAgeworICAgIAlpZih1ZHJzLT5wdXRieXRlcyArIHNpemUgPiB1ZHJzLT5idWZzaXplICsgdWRycy0+YnVmZikKKwkgICByZXR1cm4gMDsKKyAgICAJdWRycy0+cHV0Ynl0ZXMgKz0gc2l6ZTsKKwlyZXR1cm4gdWRycy0+cHV0Ynl0ZXMgLSBzaXplOworICAgIH0KKyAgICBlbHNlIGlmKHVkcnMtPnVkcl9vcCA9PSBVRFJfREVDT0RFKQorICAgIHsKKyAgICAJaWYodWRycy0+Z2V0Ynl0ZXMgKyBzaXplID4gdWRycy0+YnVmc2l6ZSArIHVkcnMtPmJ1ZmYpCisJICAgcmV0dXJuIDA7CisgICAgCXVkcnMtPmdldGJ5dGVzICs9IHNpemU7CisJcmV0dXJuIHVkcnMtPmdldGJ5dGVzIC0gc2l6ZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsJdWRyX2Vycm5vID0gIFVESUVycm9ySVBDSW50ZXJuYWw7CisJcmV0dXJuIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVEUl9HRVRQT1MKKyovCitjaGFyKgl1ZHJfZ2V0cG9zKHVkcnMpCitVRFIqCXVkcnM7Cit7CisgICAgaWYodWRycy0+dWRyX29wID09IFVEUl9FTkNPREUpCisgICAgeworCXJldHVybiB1ZHJzLT5wdXRieXRlczsKKyAgICB9CisgICAgZWxzZSBpZih1ZHJzLT51ZHJfb3AgPT0gVURSX0RFQ09ERSkKKyAgICB7CisJcmV0dXJuIHVkcnMtPmdldGJ5dGVzOworICAgIH0KKyAgICBlbHNlCisgICAgewl1ZHJfZXJybm8gPSAgVURJRXJyb3JJUENJbnRlcm5hbDsKKwlyZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVURSX1NFVFBPUworKi8KK2ludAl1ZHJfc2V0cG9zKHVkcnMsIHBvcykKK1VEUioJdWRyczsKK2NoYXIqCXBvczsKK3sKKyAgICBpZiggKChVRElVSW50MzIpcG9zID4gKFVESVVJbnQzMikodWRycy0+YnVmZikgKyAoVURJVUludDMyKSh1ZHJzLT5idWZzaXplKSkKKyAgICAgfHwgKChVRElVSW50MzIpcG9zIDwgKFVESVVJbnQzMikodWRycy0+YnVmZikgKSApCisgICAgewl1ZHJfZXJybm8gPSAgVURJRXJyb3JJUENJbnRlcm5hbDsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgaWYodWRycy0+dWRyX29wID09IFVEUl9FTkNPREUpCisgICAgeworCXVkcnMtPnB1dGJ5dGVzID0gcG9zOworCXJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmKHVkcnMtPnVkcl9vcCA9PSBVRFJfREVDT0RFKQorICAgIHsKKwl1ZHJzLT5nZXRieXRlcyA9IHBvczsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsJdWRyX2Vycm5vID0gIFVESUVycm9ySVBDSW50ZXJuYWw7CisJcmV0dXJuIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVURSX1JFQUROT1cKKyogVHJ5IGFuZCBlbnN1cmUgInNpemUiIGJ5dGVzIGFyZSBhdmFpbGFibGUgaW4gdGhlCisqIHJlY2VpdmUgYnVmZmVyIGNoYXJhY3RlciBzdHJlYW0uCisqLworaW50CXVkcl9yZWFkbm93KHVkcnMsIHNpemUpCitVRFIqCXVkcnM7CitpbnQJc2l6ZTsKK3sKKyAgICBpbnQJY250LCByZW1haW47CisKKyAgICBpZih1ZHJzLT51ZHJfb3AgPT0gVURSX0VOQ09ERSkKKyAgICB7CisJdWRyX2Vycm5vID0gIFVESUVycm9ySVBDSW50ZXJuYWw7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIGlmKHVkcnMtPnVkcl9vcCA9PSBVRFJfREVDT0RFKQorICAgIHsKKyAgICAJaWYoIChVRElVSW50MzIpKHVkcnMtPnB1dGJ5dGVzKS0oVURJVUludDMyKSh1ZHJzLT5nZXRieXRlcykgPCBzaXplICkKKwl7CQkgLyogbmVlZCBtb3JlIGRhdGEgaW4gY2hhcmFjdGVyIHN0cmVhbSBidWZmZXIgKi8KKyAgICAgICAJICAgIHJlbWFpbiA9IChVRElVSW50MzIpKHVkcnMtPmJ1ZnNpemUpIC0KKwkJKCAoVURJVUludDMyKSh1ZHJzLT5wdXRieXRlcyktKFVESVVJbnQzMikodWRycy0+YnVmZikgKTsKKyAgICAJICAgIGNudCA9IHJlYWQodWRycy0+c2QsIChjaGFyKil1ZHJzLT5wdXRieXRlcywgcmVtYWluKTsKKwkgICAgaWYoY250ID09IC0xKSBwZXJyb3IoIkVSUk9SIHVkcl93b3JrKCksICByZWFkKCkgZmFpbHVyZTogIik7CisJICAgIHVkcnMtPnB1dGJ5dGVzICs9IGNudDsKKyAgICAJICAgIGlmKCAoVURJVUludDMyKSh1ZHJzLT5wdXRieXRlcyktKFVESVVJbnQzMikodWRycy0+Z2V0Ynl0ZXMpIDwgc2l6ZSApCisgICAgCSAgICB7ICBmcHJpbnRmKHN0ZGVyciwiRVJST1IsIHVkcl9yZWFkbm93KCkgdG9vIGZldyBieXRlcyBpbiBzdHJlYW1cbiIpOworCSAgICAgICByZXR1cm4gLTE7CQkvKiByZXR1cm4gZXJyb3IgY29kZSAqLworICAgIAkgICAgfQorICAgIAl9CQkKKyAgICB9CisgICAgZWxzZQorICAgIHsJdWRyX2Vycm5vID0gIFVESUVycm9ySVBDSW50ZXJuYWw7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVURSX0FMSUdOCisqLworaW50IHVkcl9hbGlnbih1ZHJzLCBzaXplKQorVURSKgl1ZHJzOworaW50CXNpemU7Cit7CisgICAgY2hhciogICBhbGlnbjsKKyAgICBpbnQJICAgIG9mZnNldDsJCisKKyAgICBhbGlnbiA9IHVkcl9nZXRwb3ModWRycyk7CisgICAgb2Zmc2V0ID0gc2l6ZSAtICgoaW50KWFsaWduICYgKHNpemUgLTEpKTsKKyAgICBvZmZzZXQgPSBvZmZzZXQgJiAoc2l6ZSAtMSk7CisgICAgaWYob2Zmc2V0KSB1ZHJfc2V0cG9zKHVkcnMsIGFsaWduICsgb2Zmc2V0KTsKK30KKyNlbmRpZiAvKiBfX0dPMzJfXyAqLwpkaWZmIC0tZ2l0IGEvZ2RiLzI5ay1zaGFyZS91ZGlfc29jIGIvZ2RiLzI5ay1zaGFyZS91ZGlfc29jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MzMxN2YKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvMjlrLXNoYXJlL3VkaV9zb2MKQEAgLTAsMCArMSw5IEBACisjIEAoIyl1ZGlfc29jCTIuMSBEYW5pZWwgTWFubgorIyBOT1RFOiB0aGUgU2Vzc2lvbiBzdHJpbmcgbXVzdCBub3Qgc3RhcnQgd2hpdGggd2hpdGUtc3BhY2UgY2hhcmFjdGVycy4KKyMgRm9ybWF0IG9mIHN0cmluZyBpczoKKyMgPHNlc3Npb24+ICAgPGRvbWFpbj4gPHNvY19uYW1lfGhvc3RfbmFtZT4gPHRpcF9leGU+IDxwYXNzIHRvIFVESWNvbm5lY3Q+Citzb2MyY2F5bWFuICBBRl9JTkVUICAgICAgICAgICAgY2F5bWFuICAgICAgL2Jpbi91ZGlfdGlwICAgLi4uCitzb2MydGlwICAgICBBRl9VTklYICAgYXN0cmluZyAgICAgICAgICAgICAgdGlwLmV4ZSAgICAgICAgLi4uCitjdWJhICAgICAgICBBRl9VTklYICAgc29jX25hbWUgICAgLi4vYmluLjY4MDIwL3VkaV90aXAgICAgc3R1ZmYgdG8gcGFzcworY2F5bWFuICAgICAgQUZfSU5FVCAgIGNheW1hbiAgICAgIHRoaXNfZW50cnlfbm90X21hdHRlciAgIHN0dWZmIHRvIHBhc3MKK2lzcyAgICAgICAgIEFGX1VOSVggICAqICAgICAgICAgICAgICAgICAgc3VuNC9pc3N0aXAJLXIgb3Nib290CmRpZmYgLS1naXQgYS9nZGIvQ09QWUlORyBiL2dkYi9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTQ5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvQ09QWUlORwpAQCAtMCwwICsxLDM0MCBAQAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9nZGIvQ2hhbmdlTG9nIGIvZ2RiL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWU1MTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL0NoYW5nZUxvZwpAQCAtMCwwICsxLDExMTYgQEAKKzE5OTktMDQtMDcgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCSogR0RCIDQuMTggcmVsZWFzZWQuCisKKzE5OTktMDQtMDYgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCSogUkVBRE1FOiBDaGFuZ2UgcmV2aXNpb24gbnVtYmVycyBpbiB0ZXh0IHRvICI0LjE4Ii4KKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogU2V0IHRvIDQuMTguCisKKzE5OTktMDQtMDYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogc29saWIuYyAoY2xlYXJfc29saWIpOiBEb24ndCBjYWxsIGRpc2FibGVfYnJlYWtwb2ludHNfaW5fc2hsaWJzLAorCXRoaXMgYnJlYWtzIHJlcnVubmluZyBvbiBzdW40IG5hdGl2ZS4KKworMTk5OS0wNC0wNSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBORVdTOiBJbmNvcnBvcmF0ZSBzdWdnZXN0aW9ucyBmcm9tIERhdmlkIFRheWxvciBhbmQgSmFzb24gTW9sZW5kYS4KKwkKKzE5OTktMDQtMDIgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCSogUkVBRE1FOiBOb3RlIHRoYXQgR0RCIHJlcXVpcmVzIGFuIEFOU0kgQyBjb21waWxlciwgYW5kIGV4cGxhaW4KKwlob3cgdG8gZ2V0IEdDQy4KKworCSogUkVBRE1FOiBVcGRhdGUuCisJSXQgc2F5cyB3ZSBwcm92aWRlIEhUTUwgZG9jdW1lbnRhdGlvbiwgYnV0IHdlIGRvbid0LgorCVRoZSBpbnN0cnVjdGlvbnMgZm9yIGJ1aWxkaW5nIHRoZSAuaW5mbyBmaWxlcyB3ZXJlIHdyb25nLgorCUl0IGRpZG4ndCBtZW50aW9uIHRoYXQgdGV4aW5mby50ZXggd2FzIHByb3ZpZGVkIHdpdGggR0RCLgorCUl0IGRpZG4ndCBtZW50aW9uIHRoZSBpbnRsLCB0ZXhpbmZvLCBldGMsIG9yIHV0aWwgZGlyZWN0b3JpZXMuCisJKFBlcmhhcHMgdXRpbCB3b3VsZCBiZSBiZXN0IGxlZnQgdW5tZW50aW9uZWQuKQorCUl0IGRpZG4ndCBtZW50aW9uIHRoZSAtLWVuYWJsZS1idWlsZC13YXJuaW5ncyBmbGFnLCBvciB0aGUgLS1ob3N0CisJICAgIGZsYWcuCisJSXQgZGlkbid0IG1lbnRpb24gcmVtb3RlLWFycmF5LmMgb3IgcmVtb3RlLWQxMHYuYy4KKwlJdCBoYWQgYW4gb2xkIGFkZHJlc3MgZm9yIHJlcG9ydGluZyBidWdzLiAgSXQncyBub3cgZ2RiQGdudS5vcmcuCisJSXQgbWVudGlvbmVkIHh4Z2RiLCB3aGljaCBpcyBvYnNvbGV0ZSwgYnV0IGRpZG4ndCBtZW50aW9uIERERC4JCisKKwkqIGNvbmZpZy9zcGFyYy9ubS1saW51eC5oOiBEb24ndCByZWRlZmluZSBQVF9BVFRBQ0ggdG8gdXNlIHRoZQorIAlkZXByZWNhdGVkIFBUUkFDRV9TVU5BVFRBQ0ggY29tcGF0aWJpbGl0eSBjb21tYW5kcy4gIFRoZQorIAlkZWZpbml0aW9ucyBmcm9tIDxzeXMvcHRyYWNlLmg+IGFyZSBmaW5lLgorCisxOTk5LTA0LTAxICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIE5FV1M6IEFkZCBtb3JlIG5vdGVzIGFib3V0IHVzZXItdmlzaWJsZSBjaGFuZ2VzLgorCisxOTk5LTA0LTAxICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+CisKKwlGaXggZm9yIGNyb3NzLWRlYnVnZ2luZyBvbiBhbiBBSVggaG9zdCBmcm9tIEpvaGFubmEgU3Zlbm5pbmdzc29uOgorCSogYXgtZ2RiLmggKGVudW0gYXhzX2x2YWx1ZV9raW5kKTogUmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGZyb20gZW51bS4KKwkqIGF4LmggKGVudW0gYWdlbnRfb3AsIGVudW0gYWdlbnRfZmxhd3MpOiBTYW1lLgorCSogdHJhY2Vwb2ludC5oIChlbnVtIGFjdGlvbmxpbmVfdHlwZSk6IFNhbWUuCisJKiBjb25maWcveG0tYWl4NC5oOiBBZGQgZGVjbGFyYXRpb24gZm9yIHRlcm1kZWYuCisKKzE5OTktMDMtMzEgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSoganYtbGFuZy5oIChkeW5hbWljc19vYmpmaWxlKTogUmVtb3ZlIGRlY2wsIGNvbmZsaWN0cyB3aXRoIHN0YXRpYworCWRlY2wgaW4ganYtbGFuZy5jLgorCisxOTk5LTAzLTMxICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+CisKKwlNb24gTWFyIDI5IDE0OjQwOjQ0IDE5OTkgIERhdmlkIFRheWxvciAgPHRheWxvckByeW9iaS5jeWdudXMuY29tPgorCisJKiB2YWxvcHMuYyAoc2VhcmNoX3N0cnVjdF9maWVsZCk6IHJldmVydCBIUCBtZXJnZSBjaGFuZ2UKKwl0byB0aGlzIGZ1bmN0aW9uIC0tIGl0IGNhdXNlcyBtZXNzYWdlcyB0byBiZSBwcmludGVkIGFib3V0CisJbWVtYmVyIGNsYXNzIGFtYmlndWl0eSB3aGVuIHRoZSBjb21waWxlciBpcyBoYXBweS4KKwkoc2VhcmNoX3N0cnVjdF9maWVsZF9hdXgpOiBkZWxldGUgLS0gYWRkZWQgYXMgcGFydCBvZiBIUCBtZXJnZQorCWNoYW5nZTsgd2l0aCBhZm9yZW1lbnRpb25lZCBjaGFuZ2UgaXQgaXMgbm8gbG9uZ2VyIGNhbGxlZC4KKworMTk5OS0wMy0yNiAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgorCisJTWVyZ2VkIGNoYW5nZSBmcm9tIEtlaXRoIFNlaXR6OgorCQorCTE5OTktMDMtMTYgIEtlaXRoIFNlaXR6ICA8a2VpdGhzQGN5Z251cy5jb20+CisKKyAgICAgICAgKiByZW1vdGUuYyAocmVvbXRlX2JpbmFyeV9jaGVja2VkKTogTmV3IGZpbGUgZ2xvYmFsLgorICAgICAgICAoY2hlY2tfYmluYXJ5X2Rvd25sb2FkKTogTmV3IGZ1bmN0aW9uIHRvIGNoZWNrIGlmCisgICAgICAgIHN0dWIgc3VwcG9ydHMgYmluYXJ5IGRvd25sb2FkaW5nIHRoYXQgd29ya3Mgd2l0aAorICAgICAgICBzdHVicyB0aGF0IGFyZSBub3QgZWlnaHQgYml0IGNsZWFuLgorICAgICAgICAocmVtb3RlX3dyaXRlX2J5dGVzKTogQ2hlY2sgZm9yIGJpbmFyeSBkb3dubG9hZCBjYXBhYmlsaXR5CisgICAgICAgIGFuZCB1c2UgaXQgaWYgYXZhaWxhYmxlLgorICAgICAgICBSZW1vdmUgcmVmZXJlbmNlcyB0byBnbG9iYWwgcmVtb3RlX2JpbmFyeV9sZW5ndGguIFdoYXQgYSBoYWNrLgorICAgICAgICAocHV0cGt0X2JpbmFyeSk6IE5ldyBmdW5jdGlvbi4KKwkocHV0cGt0KTogQ2FsbCBwdXRwa3RfYmluYXJ5LgorCVVzZSB4b3IgdG8gZXNjYXBlIHRyb3VibGUgY2hhcmFjdGVycy4KKwkqIG0zMnItc3R1Yi5jIChiaW4ybWVtKTogRm9sbG93IGVzY2FwZSBjaGFyIGNvbnZlbnRpb24gY2hhbmdlLgorCisJQXBwbGllZCBwYXRjaCBmcm9tIFN0dSBHcm9zc21hbjoKKworCU1vbiBGZWIgMjIgMTI6MzI6MTkgMTk5OSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGN5Z251cy5jb20+CisKKwkqIGp2LXZhbHByaW50LmMgKGphdmFfdmFsX3ByaW50KTogIFJlc3RvcmUgbGluZSB0aGF0IHNvbWVob3cgZ290IGxvc3QuCisKKzE5OTktMDMtMjQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUgKFZFUlNJT04pOiBCdW1wIHRvIDQuMTcuODcuCisKKwlBdHRlbXB0IHRvIHNvcnQgb3V0IFNDTy1yZWxhdGVkIGNvbmZpZ3MuCisJKiBjb25maWd1cmUuaG9zdCAoaVszNDU2XTg2LSotc3lzdjQuMiopOiBVc2UgaW5zdGVhZCBvZgorCWlbMzQ1Nl04Ni0qLXN5c3Y0LjJNUCBhbmQgaVszNDU2XTg2LSotc3lzdjQuMnV3MiouCisJKGlbMzQ1Nl04Ni0qLXN5c3Y1Kik6IFJlY29nbml6ZS4KKwkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1Nl04Ni0qLXNjbzMuMnY1KiwgaVszNDU2XTg2LSotc2NvMy4ydjQqKToKKyAJUmVjb2duaXplLgorCitXZWQgTWFyIDI0IDAxOjAxOjI3IDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAc2x1ZGdlLmN5Z251cy5jb20+CisKKwkqIHJzNjAwMC10ZGVwLmMgKHJzNjAwMF9zb2Z0d2FyZV9zaW5nbGVfc3RlcCk6IENoYW5nZSBTSUdOQUwgdG8KKyAJdW5zaWduZWQgaW50LgorCisJRnJvbSBSb2RuZXkgQnJvd24gPHJvZG5leWJyb3duQHBtc2MuY29tPjoKKwkqIHRhcmdldC5oIChlbnVtIHRocmVhZF9jb250cm9sX2NhcGFiaWxpdGllcyksIGJyZWFrcG9pbnQuaCAoZW51bQorIAlicHR5cGUpLCBicmVha3BvaW50LmMgKGVudW0gaW5zZXJ0aW9uX3N0YXRlX3QpOiBTdHJpY3QgSVNPLUMKKyAJZG9lc24ndCBhbGxvdyB0cmFpbGluZyBjb21tYSBpbiBlbnVtIGRlZmluaXRpb24uCisJCisxOTk5LTAzLTIzICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKyAgICAgICAgKiBocHBhLXRkZXAuYyAocGFfcmVnaXN0ZXJfbG9va19hc2lkZSk6IFJlbW92ZSBDUFVfSFBQQV9SSVNDXzIwCisgICAgICAgIGNoZWNrLCB0ZXN0IGZvciBwcmVzZW5jZSBvZiBzdHJ1Y3Qgc2F2ZV9zdGF0ZV90IGFuZCB0aGUgc3Nfd2lkZSAKKyAgICAgICAgbWVtYmVyIGRpcmVjdGx5LgorICAgICAgICAqIGNvbmZpZ3VyZS5pbjogIFJlbW92ZSBDUFVfSFBQQV9SSVNDXzIwIHRlc3QuICBBZGQgdGVzdHMgZm9yCisgICAgICAgIEhBVkVfU1RSVUNUX1NBVkVfU1RBVEVfVCBhbmQgSEFWRV9TVFJVQ1RfTUVNQkVSX1NTX1dJREUuCisgICAgICAgICogYWNjb25maWcuaDogQWRkIEhBVkVfU1RSVUNUX1NBVkVfU1RBVEVfVCBIQVZFX1NUUlVDVF9NRU1CRVJfU1NfV0lERS4KKyAgICAgICAgKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVnZW5lcmF0ZWQuCisKK1R1ZSBNYXIgMjMgMTc6MjI6NTcgMTk5OSAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+CisKKwkqIHJlbW90ZS5jLCBwYXJzZS5jOiBJbmNsdWRlIGN0eXBlLmguCisKK01vbiBNYXIgMjIgMTM6MjU6MTMgMTk5OSAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogaW5mdHRyYWNlLmMgKHByb2Nfd2FpdCk6IHJlbmFtZSB0byBwdHJhY2Vfd2FpdC4KKworMTk5OS0wMy0xNyAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKEhBVkVfTVVMVElQTEVfUFJPQ19GRFMpOiBEb24ndCBkZWZpbmUgZm9yIFNvbGFyaXMKKwlob3N0cy0tZ2RiIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHlldC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK1R1ZSBNYXIgMTYgMDE6MTE6MzMgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUByaGluby5jeWdudXMuY29tPgorCisJKiB0YXJnZXQuaCAoc3RydWN0IHRhcmdldF9vcHMpLCB0YXJnZXQuYyAoZGVidWdfdG9fcXVlcnkpLAorIAlyZW1vdGUuYyAocGFja19oZXhfYnl0ZSwgcmVtb3RlX3F1ZXJ5KTogUHJvbW90ZSBjaGFyIHBhcmFtZXRlcnMgdG8KKyAJaW50LiAgU3RvcHMgY29tcGlsZSBwcm9ibGVtcyB3aXRoIHBlZGFudGljIElTTy1DIGNvbXBpbGVycy4KKworVHVlIE1hciAxNiAxNToyOTowNCAxOTk5ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGp2LWxhbmcuYywganYtbGFuZy5oIChqYXZhX3ByaW1pdGl2ZV90eXBlKTogRGVjbGFyZSBhcmd1bWVudAorCWFzIGludCBpbnN0ZWFkIG9mIGNoYXIuCisKKzE5OTktMDMtMTUgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCU1lcmdlZCBjaGFuZ2VzIGZvciBiaW5hcnkgZG93bmxvYWRzIGZyb20gTWljaGFlbCBTbnlkZXI6CisJCisJRnJpIE1hciAxMiAxMzoxMTo0OCAxOTk5ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisgICAgICAgICogcmVtb3RlLmMgKHJlbW90ZV93cml0ZV9ieXRlcyk6IGZpeCAnWCcgcGFja2V0IHByb3RvY29sIHNvIHRoYXQgaXQKKyAgICAgICAgY2FuJ3Qgb3ZlcndyaXRlIHRoZSBlbmQgb2YgaXRzIGJ1ZmZlciB3aXRoIGVzY2FwZWQgY2hhcmFjdGVycy4KKworMTk5OS0wMy0xMiAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgorCisJTWVyZ2VkIGNoYW5nZXMgZm9yIEhQL1VYIDkgZnJvbSBKYXNvbiBNb2xlbmRhOgorCisJMTk5OS0wMy0wOCAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBpbmZ0dHJhY2UuYyAoaHBwYV9nZXRfcHJvY2Vzc19ldmVudHMpOiBSZW1vdmVkLiBGdW5jdGlvbiBvbmx5IAorCXVzYWJsZSBvbiBIUFVYIDEwIGFuZCBhYm92ZS4gIEl0IGlzIG5vdCBjYWxsZWQgYnkgYW55IG90aGVyIHBhcnQKKwlvZiBHREIuCisJKiBocHBhaC1uYXQuYyAoaHBwYV9nZXRfcHJvY2Vzc19ldmVudHMpOiBEaXR0by4KKwkoY2hpbGRfcGlkX3RvX2V4ZWNfZmlsZSk6IE9ubHkgY2FsbCBwdHJhY2Ugd2l0aCBQVF9HRVRfUFJPQ0VTU19QQVRITkFNRQorCWlmIHRoYXQgc3ltYm9sIGhhcyBiZWVuIGRlZmluZWQuCisJKiBjb25maWcvcGEvbm0taHBwYWguaDogRG9uJ3Qgc2V0IHVwIHByb3RvdHlwZXMgZXQgYWwgZm9yIAorCWhwcGFfZ2V0X3Byb2Nlc3NfZXZlbnRzLgorCisJKiBjb25maWcvcGEvaHBwYWhwdXgubWggKFRFUk1fTElCKTogRG8gbm90IGluaXRpYWxpemUsIGxldCBhdXRvY29uZgorCWRldGVybWluZSBiZXN0IGxpYnJhcnkgYXV0b21hdGljYWxseS4KKwkqIGNvbmZpZy9wYS9ocHV4MTAyMC5taDogRGl0dG8uCisJKiBjb25maWcvcGEvaHB1eDExMDAubWg6IERpdHRvLgorCSogY29uZmlndXJlLmluIChURVJNX0xJQik6IEFsc28gY2hlY2sgZm9yIGxpYkhjdXJzZXMuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCisJTWVyZ2VkIGNoYW5nZXMgdG8gYWNjb21vZGF0ZSB0aGUgSHVyZDoKKwkKKyAgICAgICAgVGh1IE1hciAxMSAxODowNToxMSAxOTk5ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBpbmZwdHJhY2UuYyAocHJvY193YWl0KTogUmVuYW1lIHRvIHB0cmFjZV93YWl0LgorCSogaW5mdGFyZy5jIChjaGlsZF93YWl0KTogY2FsbCBwdHJhY2Vfd2FpdCBpbnN0ZWFkIG9mIHByb2Nfd2FpdC4KKwkqIGluZmVyaW9yLmg6IERlY2xhcmUgcHRyYWNlX3dhaXQgaW5zdGVhZCBvZiBwcm9jX3dhaXQuCisKKzE5OTktMDMtMTEgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBjbGljayB0byA0LjE3Ljg2LCBmb3IgbmV4dCBzbmFwc2hvdC4KKworMTk5OS0wMy0wOSAgUm9kbmV5IEJyb3duICA8Um9kbmV5QnJvd25AcG1zYy5jb20+CisKKwlHZXQgd29ya2luZyBvbiBVbml4V2FyZSAyLjEuMS4KKwkqIGFjY29uZmlnLmg6IFVwZGF0ZSBmb3IgZGVmaW5lcyBmb3IgcHJvY2ZzLmMuCisJKiBjb25maWd1cmUuaW46IElkZW50aWZ5IGRlZmluZXMgZm9yIHByb2Nmcy5jLgorCSogY29uZmlndXJlLmhvc3Q6IGkzODYtKi1zeXN2NC4ydXcyKiA9PiBpMzg2djQybXAKKwkqIGNvbmZpZ3VyZS50Z3Q6ICBpMzg2LSotc3lzdjQuMnV3MiogPT4gaTM4NnY0Mm1wCisJKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVnZW5lcmF0ZS4KKwkqIHByb2Nmcy5jOiBSZW5hbWUgSEFWRV9OT19QUlJVTl9UIHRvIEhBVkVfUFJSVU5fVCAoYXV0b2NvbmYKKyAJc3RhbmRhcmQpLCB3cmFwIFVOSVhXQVJFIGRpZmZlcmVuY2UgaW4gVEhFX1BSX0xXUCBtYWNybyBmb3IKKyAJbGVnaWJpbGl0eS4KKwkqIGNvbmZpZy9pMzg2L3RtLWkzODZ2NDJtcC5oOiBSZW1vdmUgSEFWRV9QU1RBVFVTX1QsCisgCUhBVkVfTk9fUFJSVU5fVDsgbm93IHNldCBieSBjb25maWd1cmUuCisKKzE5OTktMDMtMDQgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCU1lcmdlZCBjaGFuZ2VzIGZyb20gSmFzb24gTW9sZW5kYToKKwkKKwkxOTk5LTAyLTI0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKyAgICAgICAgKiBjb25maWd1cmUuaW46IFNldCBDUFVfSFBQQV9SSVNDXzIwIGlmIHRoZSBob3N0IENQVSBpcyBhIFBBIDIuMCAKKyAgICAgICAgcHJvY2Vzc29yLgorICAgICAgICAqIGFjY29uZmlnLmg6IEFkZCBDUFVfSFBQQV9SSVNDXzIwCisgICAgICAgICogY29uZmlnLmluLCBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorICAgICAgICAqIGhwcGEtdGRlcC5jIChwYV9yZWdpc3Rlcl9sb29rX2FzaWRlKTogT25seSByZWZlciB0byBuZXcgCisgICAgICAgIHN0cnVjdHVyZSBlbGVtZW50cyBpZiB3ZSBhcmUgb24gYSBQQTIuMCBzeXN0ZW0uCisgICAgICAgICogZGVmcy5oOiBJbmNsdWRlIGxpbWl0cy5oLgorCisJTWVyZ2VkIGNoYW5nZXMgZnJvbSBTdHUgR3Jvc3NtYW46CisJCisJV2VkIEZlYiAxNyAxMDoxMDoyNyAxOTk5ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBiYWJ5bG9uLTUuY3lnbnVzLmNvbT4KKworCSogZ2RidHlwZXMuaCAoZ2V0X2Rpc2NyZXRlX2JvdW5kcyk6ICBSZW1vdmUgZHVwbGljYXRlIGRlY2wuCisKKwkqIGp2LXR5cGVwcmludC5jIChqYXZhX3R5cGVfcHJpbnRfYmFzZSk6ICBDaGFuZ2UgZnB1dHMgPT4gZnB1dHNfZmlsdGVyZWQuCisJCisJTW9uIEphbiAyNSAxODozMDo1NyAxOTk5ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAY3lnbnVzLmNvbT4KKworCSoganYtbGFuZy5oIChKQVZBX09CSkVDVF9TSVpFKTogIENoYW5nZSBmcm9tIGhhcmQtd2lyZWQgY29uc3RhbnQuCisJKGphdmFfcHJpbWl0aXZlX3R5cGVfZnJvbV9uYW1lLCBnZXRfamF2YV9vYmplY3RfaGVhZGVyX3NpemUpOiAgRGVjbGFyZS4KKwkqIGp2LWxhbmcuYyAoamF2YV9jbGFzc19mcm9tX29iamVjdCk6ICBVc2UgZ2V0X2phdmFfb2JqZWN0X3R5cGUuCisJKiBqdi1sYW5nLmM6ICBVcGRhdGUgQ2xhc3MgZmllbGQgbmFtZXM6ICBkdGFibGUtPnZ0YWJsZSwKKwltc2l6ZS0+bWV0aG9kX2NvdW50LCBuZmllbGRzLT5maWVsZF9jb3VudCwgYmZzaXplLT5zaXplX2luX2J5dGVzLAorCW5tZXRob2RzLT5tZXRob2RfY291bnQuCisJKHR5cGVfZnJvbV9jbGFzcyk6ICBEZW1hbmdsZSBhcnJheSB0eXBlIG5hbWVzLgorCShqYXZhX2xpbmtfY2xhc3NfdHlwZSk6ICBBcnJheSB0eXBlIG5hbWVzIGFyZSBub3cgZGVtYW5nbGVkLgorCShnZXRfamF2YV9vYmplY3RfdHlwZSk6ICBJZiBub3QgZGVmaW5lZCB5ZXQsIHRyeSBsb29raW5nIGl0IHVwLgorCShnZXRfamF2YV9vYmplY3RfaGVhZGVyX3NpemUpOiAgTmV3IGZ1bmN0aW9uLgorCShqYXZhX3ByaW1pdGl2ZV90eXBlX2Zyb21fbmFtZSk6ICBOZXcgZnVuY3Rpb24uCisJKGphdmFfZGVtYW5nbGVkX3NpZ25hdHVyZV9sZW5ndGgsIGphdmFfZGVtYW5nbGVkX3NpZ25hdHVyZV9jb3B5KTogTmV3LgorCShqYXZhX2RlbWFuZ2xlX3R5cGVfc2lnbmF0dXJlKTogIFJlLWltcGxlbWVudCB1c2luZyBhYm92ZSBmdW5jdGlvbnMuCisJKGV2YWx1YXRlX3N1YmV4cF9qYXZhKTogIEZvciBVTk9QX0lORCwgY2FsbCBldmFsdWF0ZV9zdWJleHBfamF2YQorCXRvIGV2YWx1YXRlIHN1YmV4cCAobm90IGV2YWx1YXRlX3N1YmV4cF9zdGFuZGFyZCkuCisJRm9yIEJJTk9QX1NVQlNDUklQVCB1cGRhdGUgZm9yIG5ldyBhcnJheSB0eXBlIG5hbWluZyBzY2hlbWUuCisJKiBqdi12YWxwcmludC5jIChqYXZhX3ZhbHVlX3ByaW50KTogIFVzZSBqYXZhX2NsYXNzX2Zyb21fb2JqZWN0LgorCVVwZGF0ZSBhcnJheSBwcmludGluZyB0byBuZXcgYXJyYXkgdHlwZSBuYW1pbmcgY29udmVudGlvbi4KKwkoamF2YV92YWxfcHJpbnQpOiAgRG9pbmcgY2hlY2tfdHlwZWRlZiB3aGVuIHByaW50aW5nIGEgcG9pbnRlciBpcworCWlzIGEgd2FzdGUgb2YgZWZmb3J0LiAgQWxzbywgaGFuZGxlIFRZUEVfQ09ERV9JTlQsIHRvIG1ha2Ugc3VyZQorCUphdmEgYnl0ZXMgYXMgbm90IHByaW50ZWQgYXMgQyBjaGFycy4KKworCUZyaSBKYW4gIDggMTY6NTg6MjIgMTk5OSAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmFieWxvbi01LmN5Z251cy5jb20+CisKKwkqIGJsb2NrZnJhbWUuYyAoZmluZF9wY19zZWN0X3BhcnRpYWxfZnVuY3Rpb24pOiAgU2VhcmNoIGZ1bGwgc3ltdGFicyBhcworCWEgbGFzdCBkaXRjaCBlZmZvcnQgKGFmdGVyIHRoZSBwYXJ0aWFsICYgbWluaW1hbCBzeW10YWJzKS4KKwkqIGRlZnMuaCB1dGlscy5jOiAgRml4dXAgcHJvdG90eXBlcyBmb3IgdnByaW50Zl9maWx0ZXJlZCwKKwl2ZnByaW50Zl9maWx0ZXJlZCwgdmZwcmludGZfdW5maWx0ZXJlZCBhbmQgdnByaW50Zl91bmZpbHRlcmVkIHRvIHJldHVybgorIAlpbnRzIHRvIG1hdGNoIHRoZWlyIHN0YW5kYXJkIGVxdWl2YWxlbnRzLgorCSogZGVmcy5oIHN5bXRhYi5jIHRvcC5jOiAgQ3JlYXRlIHNraXBfcHJvbG9ndWVfaG9vayB0byBhbGxvdyBKYXZhIHRvCisJY29udHJvbCB0aGUgcHJvbG9ndWUgc2tpcHBpbmcgcHJvY2Vzcy4KKwkqIGp2LXR5cGVwcmludC5jIChqYXZhX3R5cGVfcHJpbnRfYmFzZSk6ICBSZW1vdmUgZXh0ZXJuIGZvcgorCWp2X2NsYXNzX2RlbWFuZ2xlLCBhZGQgbmV3IGFyZyBmb3Igb2JqZmlsZSAoTlVMTCkuCisJKiBzeW10YWIuaDogIFJlbW92ZSBzdHJ1Y3Qgc291cmNldmVjdG9yIGFuZCBzdHJ1Y3Qgc291cmNlLiAgRGVmaW5hdGVseQorCW5vdCBuZWVkZWQuCisJKiB2YWx1ZXMuYyAodmFsdWVfdmlydHVhbF9mbl9maWVsZCk6ICBGaXhlcyBjb2RlIHRvIGhhbmRsZSBuZXcgdnRhYmxlCisJZGVidWcgaW5mbyBmb3JtYXQuICBQYXRjaCBmcm9tIG1hcmthLgorCQorCVdlZCBEZWMgMTYgMjM6MTE6MjUgMTk5OCAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AZmVuY2VyLmN5Z251cy5jb20+CisKKwkqIGp2LWxhbmcuYyAoamF2YV9jbGFzc19mcm9tX29iamVjdCBqYXZhX2NsYXNzX2lzX3ByaW1pdGl2ZQorCWlzX29iamVjdF90eXBlKTogIENoYW5nZSBkdGFibGUgdG8gdnRhYmxlLgorCSogKGphdmFfcHJpbWl0aXZlX3R5cGUpOiAgQ2hhbmdlIGFyZyB0byB0eXBlIGNoYXIuCisJKiAoX2luaXRpYWxpemVfamF2YV9sYW5ndWFnZSk6ICBNYWtlIGphdmFfY2hhcl90eXBlIGJlIHVuc2lnbmVkLgorCSoganYtbGFuZy5oOiAgRml4dXAgcHJvdG90eXBlcy4KKwkKKwlNb24gRGVjICA3IDE5OjAyOjE1IDE5OTggIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgorCisJKiBqdi12YWxwcmludC5jIChqYXZhX3ZhbHVlX3ByaW50KTogIEZpeCBwcmludGluZyBvZiB2YWx1ZXMgd2hlcmUKKwlydW4gdGltZSB0eXBlICE9IGNvbXBpbGUgdGltZSB0eXBlLgorCisJRnJpIERlYyAgNCAxNToyMzozOCAxOTk4ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBmZW5jZXIuY3lnbnVzLmNvbT4KKyAgCisJKiBNYWtlZmlsZS5pbjogIFdoYWNrIG91dCBtMi10eXBlcHJpbnQuYy4KKwkqIGMtdHlwZXByaW50LmMgKGNfdHlwZV9wcmludF92YXJzcGVjX3N1ZmZpeCkgdHlwZXByaW50Lmg6ICBNYWtlIHRoaXMKKwlnbG9iYWwuICBJdCdzIG5lZWRlZCBieSBKYXZhLgorCSogKGNfdHlwZV9wcmludF9iYXNlKTogIFdoYWNrIHByZWZpeCBvZmYgb2YgcXVhbGlmaWVkIG1ldGhvZCBuYW1lcworCShuYW1lcyB3aXRoIG5hbWUgc3BhY2VzKS4KKwkqIGdkYnR5cGVzLmggKHN0cnVjdCBjcGx1c19zdHJ1Y3RfdHlwZSk6ICBBZGQgYml0cyBmb3IgSmF2YSBhdHRyaWJ1dGVzLgorICAJU2hyaW5rIHZvZmZzZXQKKwl0byAxNiBiaXRzIHRvIGNvbXBlbnNhdGUgZm9yIGFkZGVkIGJpdHMgYWJvdmUgKGhvcGVmdWxseSB0aGlzIGlzIHN0aWxsCisgCWVub3VnaCkuCisJKiBBZGQgbmV3IGFjY2Vzc29yIG1hY3JvcyAoVFlQRV9GTkRfRklFTERfUFVCTElDLCAuLi4pIGZvciBhbGwgbmV3CisJYXR0cmlidXRlIGJpdHMuCisJKiBqdi10eXBlcHJpbnQuYyAoamF2YV90eXBlX3ByaW50X2Jhc2UpOiAgRml4IHByaW50aW5nIG9mIG1ldGhvZAorCWF0dHJpYnV0ZXMuICBIYW5kbGUgSlZNIHN0eWxlIG1hbmdsaW5ncy4KKwkqIChqYXZhX3ByaW50X3R5cGUpOiAgRW5hYmxlIGNvZGUgdHlwZSBwcmludCB2YXJzcGVjX3N1ZmZpeCB0byBhbGxvdworCWFycmF5IGluZGljZXMgdG8gcHJpbnQgb3V0LgorCSoganYtdmFscHJpbnQuYyAoamF2YV92YWxfcHJpbnQpOiAgTWlub3IgZm9ybWF0dGluZy4KKwkqIG0yLWxhbmcuYyAobTJfbGFuZ3VhZ2VfZCk6ICBDaGFuZ2UgbTJfcHJpbnRfdHlwZSB0byBjX3ByaW50X3R5cGUuCisJKiBzdGFic3JlYWQuYyAocmVhZF9tZW1iZXJfZnVuY3Rpb25zKTogIFNhdmUgcHVibGljIGFuZCBzdGF0aWMgYXR0cmlidXRlcy4KKworMTk5OS0wMy0wMiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJRnJvbSBHYXJ5IFRob21hcyAgPGd0aG9tYXNAY3lnbnVzLmNvLnVrPjoKKwkqIGFybS10ZGVwLmMgKEFSTV9MRV9CUkVBS1BPSU5ULCBBUk1fQkVfQlJFQUtQT0lOVCwKKwlUSFVNQl9MRV9CUkVBS1BPSU5ULCBUSFVNQl9CRV9CUkVBS1BPSU5UKTogVXNlIGlsbGVnYWwgaW5zdHJ1Y3Rpb24KKwlpbnN0ZWFkIG9mIFNXSSAyNC4KKwkqIGNvbmZpZy9hcm0vdG0tYXJtLmggKENBTExfRFVNTVkpOiBEaXR0by4KKwkoSU5fU0lHVFJBTVApOiBEZWZpbmUuCisKKzE5OTktMDMtMDEgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChURVJNX0xJQik6IE1vdmUgdGhlIGNvZGUgd2hpY2ggc2V0cyB0aGlzIHRvIGEKKwliZXR0ZXIgcGxhY2UuCisKKzE5OTktMDItMjUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogYnJlYWtwb2ludC5jIChTT0xJQl9MT0FERURfTElCUkFSWV9QQVRITkFNRSwKKyAJU09MSUJfVU5MT0FERURfTElCUkFSWV9QQVRITkFNRSwgU09MSUJfQ1JFQVRFX0NBVENIX0xPQURfSE9PSywKKyAJU09MSUJfQ1JFQVRFX0NBVENIX1VOTE9BRF9IT09LKTogU3VwcGx5IGRlZmF1bHQgZGVmaW5pdGlvbnMuCisJKiBpbmZydW4uYyAoU09MSUJfSU5fRFlOQU1JQ19MSU5LRVIpOiBEaXR0by4KKworMTk5OS0wMi0yMyAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgorCisJUGF0Y2ggZnJvbSBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisgICAgICAgICogY29uZmlndXJlLmluIChURVJNX0xJQik6IE1vdmUgY2hlY2tpbmcgZm9yIFRFUk1fTElCLCBzdWJzdGl0dXRpbmcuCisgICAgICAgICogY29uZmlndXJlLCBhY2xvY2FsLm00LCBjb25maWcuaW46IFJlZ2VuZXJhdGVkLgorCisxOTk5LTAyLTIyICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogQnVtcCB0byA0LjE3Ljg1LCBmb3IgdGhlIHJlbGVhc2UgcHJvY2Vzcy4KKworCVBhdGNoIGZyb20gRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgorCSogYnJlYWtwb2ludC5jICh3YXRjaF9jb21tYW5kXzEpOiBSZWZvcm1hdCBjb21tZW50LgorCisJUGF0Y2ggZnJvbSBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+CisJKiBjLXR5cGVwcmludC5jIChjX3R5cGVfcHJpbnRfYmFzZSk6IFJlZm9ybWF0IGNvbW1lbnRzLgorCisJUGF0Y2ggZnJvbSBFZGl0aCBFcHN0ZWluICA8ZWVwc3RlaW5Ac29waGlhLmN5Z251cy5jb20+OgorICAgICAgICAqIGNvbmZpZy9wYS9ubS1ocHBhaC5oOiBBZGRlZCBwcm90b3R5cGUgZGVjbGFyYXRpb25zIGZvcgorICAgICAgICBocHBhX2VuYWJsZV9wYWdlX3Byb3RlY3Rpb25fZXZlbnRzIGFuZCAKKyAgICAgICAgaHBwYV9kaXNhYmxlX3BhZ2VfcHJvdGVjdGlvbl9ldmVudHMuCisKKwlQYXRjaCBmcm9tIEVkaXRoIEVwc3RlaW4gIDxlZXBzdGVpbkBzb3BoaWEuY3lnbnVzLmNvbT46CisgICAgICAgICogaW5mdHRyYWNlLmMgKGhwcGFfaW5zZXJ0X2h3X3dhdGNocG9pbnQpOiBNYWtlIHN1cmUgdGhhdAorICAgICAgICBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBhIHZhbHVlLgorICAgICAgICAoaHBwYV9yZW1vdmVfaHdfd2F0Y2hwb2ludCk6IE1ha2Ugc3VyZSB0aGF0IGZ1bmN0aW9uIGFsd2F5cworICAgICAgICByZXR1cm5zIGEgdmFsdWUuCisKKwlQYXRjaCBmcm9tIEVkaXRoIEVwc3RlaW4gIDxlZXBzdGVpbkBzb3BoaWEuY3lnbnVzLmNvbT46CisgICAgICAgICogaW5mdGFyZy5jIChjaGlsZF93YWl0KTogRml4ZWQgY29kZSB0aGF0IGNoZWNrcyB3aGV0aGVyCisgICAgICAgIG9yIG5vdCB0aGUgdGFyZ2V0IHByb2dyYW0gaGFzIGRvbmUgYSBmb3JrL3Zmb3JrLiAKKyAgICAgICAgcmVsYXRlZF9waWQgIGRvZXMgbm90IGhhdmUgYSB2YWx1ZSB1bmxlc3MgdGhlIHRhcmdldCAKKyAgICAgICAgcHJvZ3JhbSBoYXMgZm9ya2VkL3Zmb3JrZWQuCisJCisxOTk5LTAyLTIyICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+CisKKwkqIHRtLWg4NTAwLmgsIGkzODZseW54LW5hdC5jOiBSZW1vdmVkLiAgVGhlc2UgZmlsZXMgYXJlIGxvbmcKKwlkZWFkOyBpdCBzZWVtcyB0aGF0IHRoZXkgb25seSBhcHBlYXJlZCBkdWUgdG8gc29tZSBDVlMgd2VpcmRuZXNzLgorCUlmIHRoZXkgYXBwZWFyIGFnYWluLCB3ZSBtYXkgbmVlZCB0byBkaXN0cmlidXRlIGdhcmxpYyBhbmQgaG9seQorCXdhdGVyLgorCisxOTk5LTAyLTE2ICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogQnVtcCB0byA0LjE3LjIuCisKK1N1biBGZWIgMTQgMTg6MjE6MDggMTk5OSAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBjb25maWcvc2gvdG0tc2guaCAoQkVMSUVWRV9QQ0NfUFJPTU9USU9OKTogRGVmaW5lLCBzbyB0aGF0CisJY29mZnJlYWQuYyB3aWxsIGNvcnJlY3RseSBoYW5kbGUgY2hhciBvciBzaG9ydCBmdW5jdGlvbiBwYXJhbWV0ZXJzLgorCisxOTk5LTAyLTExICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVnZW5lcmF0ZSB3aXRoIGNvcnJlY3QgdmVyc2lvbiBvZiBhY2xvY2FsLgorCisxOTk5LTAyLTEwICBTeWQgUG9sayAgPHNwb2xrQGN5Z251cy5jb20+CisKKwkqIGFjaW5jbHVkZS5tNDogRml4IGZvciBuZXcgbG9jYXRpb24gb2YgaXRjbENvbmZpZy5zaCBhbmQgaXRrQ29uZmlnLnNoLgorCSogYWNsb2NhbC5tNDogUmVnbmVyYXRlLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisxOTk5LTAyLTEwICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKyAgICAgICAgKiBkZW1hbmdsZS5jOiBGaXggY29tbWVudHMgdG8gbWVudGlvbiAic2V0IGRlbWFuZ2xlLXN0eWxlIgorICAgICAgICBpbnN0ZWFkIG9mICJzZXQgZGVtYW5nbGUiLgorICAgICAgICBSdW4gdGhyb3VnaCBpbmRlbnQgdG8gZml4IG1pbm9yIGluZGVudGluZyBwcm9ibGVtcy4KKworV2VkIEZlYiAxMCAxNzo1MzowOSAxOTk5ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogaTM4Ni10ZGVwLmMgKGdkYl9wcmludF9pbnNuX2kzODYpOiBBZGQgbWlzc2luZyByZXR1cm5zLgorCitXZWQgRmViIDEwIDEzOjE3OjIxIDE5OTkgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCURlY2xhcmUgR291bGQgY29uZmlndXJhdGlvbiBvYnNvbGV0ZToKKwkqIGNvbmZpZ3VyZS5ob3N0LCBjb25maWd1cmUudGd0OiBDb21tZW50IG91dCBHb3VsZCBjb25maWdzLgorCSogTWFrZWZpbGUuaW46IENvbW1lbnQgb3V0IEdvdWxkLXJlbGF0ZWQgYWN0aW9ucy4KKwkqIGdvdWxkLXhkZXAuYywgZ291bGQtdGRlcC5jLCBjb25maWcvZ291bGQvKjogQ29tbWVudCBvdXQuCisJKiBORVdTOiBNZW50aW9uIG9ic29sZXRlIHN0YXR1cy4KKworMTk5OS0wMi0wOSAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+CisKKwkqIHNwYXJjbC10ZGVwLmM6IFVEUCBkb3dubG9hZCB3b3JrcyBpbiBjeWd3aW4KKworMTk5OS0wMi0wOCAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBnbnUtcmVnZXguYzogQ2hlY2sgRU5BQkxFX05MUyBpbnN0ZWFkIG9mIEhBVkVfTElCSU5UTF9ILgorCSogY29uZmlndXJlLmluOiBEb24ndCBjaGVjayBmb3IgbGliaW50bC5oLgorCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlZ2VuZXJhdGVkLgorCitNb24gRmViICA4IDE4OjEwOjUwIDE5OTkgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogTkVXUzogTWVudGlvbiBuZXcgWCBwYWNrZXQgYW5kIFBvd2VyUEMgdmFyaWFudCBzdXBwb3J0LgorCisxOTk5LTAyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaG9zdDogQWRkIHN1cHBvcnQgZm9yIFN0cm9uZ0FSTSBob3N0LgorCSogY29uZmlndXJlLnRndDogQWRkIHN1cHBvcnQgZm9yIFN0cm9uZ0FSTSB0YXJnZXQuCisKK01vbiBGZWIgIDggMTI6MDU6MDUgMTk5OSAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+CisKKwkqIGRzcmVjLmMgKG1ha2Vfc3JlYyk6IENhc3QgdGFyZ19hZGRyIHRvIGludCBpbiBjYWxsIHRvIHNwcmludGYKKyAJb3RoZXJ3aXNlIG9uIGJpZyBlbmRpYW4gbWFjaGluZSB3aXRoIGEgYmZkX3ZtYSBvZiA2NCBiaXRzLAorIAkqZXZlcnl0aGluZyogZ2V0cyBsb2FkZWQgYXQgbG9jYXRpb24gMC4KKworTW9uIEZlYiAgNyAxMDowNTo0MyAxOTk5ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisgICAgICAgKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBBbGxvdyBTSUdUUkFQIHRvIGJlICJwYXNzImVkCisgICAgICAgdG8gdGFyZ2V0IHByb2dyYW0uCisKK0ZyaSBGZWIgIDUgMTY6NDY6MTQgMTk5OSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBORVdTOiBBZGQgbWVudGlvbnMgb2YgdmFyaW91cyBuZXcgdGhpbmdzLgorCitUaHUgRmViICA0IDAwOjE5OjE0IDE5OTkgIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogTW92ZSB0ZXJtY2FwIGRldGVybWluYXRpb24gbGF0ZXIgaW4gdGhlCisJZmlsZSB0byBjYXRjaCBzZXR0aW5nIG9mIGN5Z3dpbiBmbGFnLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCitXZWQgRmViICAzIDE0OjE2OjM4IDE5OTkgIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9pMzg2L2N5Z3dpbi5taDogTW92ZSBURVJNQ0FQIHRlc3QgY29kZSB0byBjb25maWd1cmUuaW4uCisJKiBjb25maWd1cmUuaW46IFRyZWF0IGxpYnRlcm1jYXAuYSBkZXRlY3Rpb24gYXMgYSBzcGVjaWFsIGNhc2UKKwl3aGVuIGhvc3Rpbmcgb24gY3lnd2luLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisxOTk5LTAyLTAzICBLZWl0aCBTZWl0eiAgPGtlaXRoc0BjeWdudXMuY29tPgorIAorICAgICAgICAqIHJlbW90ZS5jIChyZW1vdGVfYmluYXJ5X2Rvd25sb2FkLCByZW1vdGVfYmluYXJ5X2xlbmd0aCk6IE5ldworICAgICAgICBzdGF0aWMgZ2xvYmFscyBmb3IgZGVhbGluZyB3aXRoIGJpbmFyeSB0cmFuc21pc3Npb25zLgorICAgICAgICAocmVtb3RlX3dyaXRlX2J5dGVzKTogQWRkIHN1cHBvcnQgZm9yIGJpbmFyeSBkb3dubG9hZHMKKyAgICAgICAgYnkgc2hhZG93aW5nIHRoZSAiTSIgcGFja2V0IHdpdGggYSBuZXcgIlgiIHBhY2tldC4gVGhpcworICAgICAgICBkZWZhdWx0cyB0byBPTjsgaWYgdGhlIHN0dWIgZG9lcyBub3QgdW5kZXJzdGFuZCB0aGlzLCBpdAorICAgICAgICB3aWxsIGZhbGwgYmFjayB0byB1c2luZyAiTSIuCisgICAgICAgIChwdXRwa3QpOiBBZGQgc3VwcG9ydCBmb3IgYmluYXJ5IGRvd25sb2FkaW5nLgorICAgICAgICAqIG1vbml0b3IuYyAobW9uaXRvcl9leHBlY3QpOiBUaGUgbW9uMjAwMCBtb25pdG9yCisgICAgICAgIG9uIHRoZSBNU0EyMDAwIHdpbGwgYWxzbyBlbWl0IHJhbmRvbSBEQzEvREMzIGNoYXJzLgorICAgICAgICAqIG0zMnItc3R1Yi5jOiBDaGFuZ2UgYWxsIGNoYXIncyB0byB1bnNpZ25lZCBjaGFyJ3MKKyAgICAgICAgdG8gc3VwcG9ydCBiaW5hcnkgZG93bmxvYWRpbmcuCisgICAgICAgIChoYW5kbGVfZXhjZXB0aW9uKTogQWRkIHN1cHBvcnQgZm9yIGJpbmFyeSBkb3dubG9hZGluZworICAgICAgICB2aWEgYSBuZXcgIlgiIHBhY2tldC4KKyAgICAgICAgKGdldHBhY2tldCk6IERvIE5PVCBzdHJpcCBlaWdodGggYml0IG9mIGluY29taW5nIGNoYXJzLgorICAgICAgICBXYXRjaCBvdXQgZm9yIGVzY2FwZWQgY2hhcmFjdGVycyBpbiB0aGUgaW5jb21pbmcgc3RyZWFtLgorICAgICAgICAocHV0cGFja2V0KTogRG8gTk9UIHN0cmlwIGVpZ2h0aCBiaXQgb2YgaW5jb21pbmcgY2hhcnMuCisgICAgICAgIChiaW4ybWVtKTogTmV3IGZ1bmN0aW9uIHRvIHdyaXRlIGJpbmFyeSBkYXRhIGRpcmVjdGx5IHRvCisgICAgICAgIG1lbW9yeS4KKyAgICAgICAgKiBtMzJyLXJvbS5jOiBBZGQgbmV3ICJtb24yMDAwIiB0YXJnZXQuCisKK1R1ZSBGZWIgIDIgMTg6NDA6MjkgMTk5OSAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgorCisJKiBocC1wc3ltdGFiLXJlYWQuYyAoaHByZWFkX2J1aWxkX3BzeW10YWJzKTogQ29lcmNlIGZpcnN0IGFyZworCXBhc3NlZCB0byBtYWtlX2NsZWFudXAgdG8gdGhlIGNvcnJlY3QgdHlwZS4KKwkoaHByZWFkX3F1aWNrX3RyYXZlcnNlKTogQ2hhbmdlIGZpZnRoIGFyZyB0byBjYWxsIHRvIAorCWhwcmVhZF9lbmRfcHN5bXRhYiB0byBiZSAwLiAKKwlDb21wYXJlIENVUlJfTU9EVUxFX0VORCB0byAwIHJhdGhlciB0aGFuIE5VTEwuCisJR2V0IHJpZCBvZiBpZmRlZidlZCBvdXQgY29kZS4KKwkoc2Nhbl9wcm9jcyk6IEdldCByaWQgb2YgaWZkZWYnZWQgb3V0IGNvZGUuCisKKwkqIHNvbXJlYWQuYyAoc29tX3N5bWZpbGVfcmVhZCk6IENvZXJjZSBmaXJzdCBhcmd1bWVudCBwYXNzZWQgdG8KKwltYWtlX2NsZWFudXAgdG8gdGhlIGNvcnJlY3QgdHlwZS4KKworVHVlIEZlYiAgMiAxNzozNjoyOSAxOTk5ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+CisKKwkqIGhwLXBzeW10YWItcmVhZC5jIChkb19weGRiKTogTmV3IGZ1bmN0aW9uLiBDaGVjayB3aGV0aGVyIHRoZQorCWZpbGUgbmVlZHMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHB4ZGIgKGFuIEhQIGRlYnVnIGluZm8gbWFzc2FnaW5nCisJdG9vbCksIGlmIHNvIGNhbGwgaXQuCisJKGhwcmVhZF9idWlsZF9wc3ltdGFicyk6IEluaXRpYWxpemUgc2Nhbl9zdGFydCB0byAwIGFuZAorCXNpbXBsaWZ5IGZsb3cgb2YgY29udHJvbC4KKworCSogc29tcmVhZC5jIChzb21fc3ltZmlsZV9yZWFkKTogQWRkIGNhbGwgdG8gZG9fcHhkYiAoKSwgCisJaW4gaHAtcHN5bXRhYi1yZWFkLmMuCisKKwkqIHN5bWZpbGUuYyAoc3ltYm9sX2ZpbGVfYWRkKTogUmVtb3ZlIGlmZGVmJ2VkIG91dCBIUFVYIHNwZWNpZmljCisJY29kZS4KKwkoc3ltZmlsZV9iZmRfb3Blbik6IFJlbW92ZSBIUFVYSFBQQSBpZmRlZidlZCBjb2RlLiBDb2RlIGlzIG5vdworCWluIGhwLXBzeW10YWItcmVhZC5jLgorCisxOTk5LTAyLTAyICBNYXJ0aW4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KKworCSogcHJpbnRjbWQuYyAocHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCk6IFVzZSBzdHJjYXQgdG8gY29uY2F0IGFsbAorCXRoZSBvdXRwdXQgdG9nZXRoZXIgYmVmb3JlIGNhbGxpbmcgZnByaW50Zl9maWx0ZXJlZCgpLgorCisxOTk5LTAyLTAxICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogUmVxdWlyZSBhdXRvY29uZiAyLjEzLgorCShBTV9FWEVFWFQpOiBSZXBsYWNlIHdpdGggbmV3IEFDX0VYRUVYVC4KKwkqIGFjaW5jbHVkZS5tNDogTW92ZSBpdGNsIGhlYWRlciBtYWNyb3MgZnJvbSBhY2xvY2FsLm00IHRvIGhlcmUuCisJKiBhY2xvY2FsLm00OiBSZWdlbmVyYXRlZC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKKzE5OTktMDItMDEgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCUFsbG93IFBQQyB1c2VycyB0byBzZWxlY3Qgd2hpY2ggUFBDL1JTNjAwMCB2YXJpYW50IHRoZXkncmUKKyAJZGVidWdnaW5nIGF0IHJ1bi10aW1lLiAgQXQgdGhlIG1vbWVudCwgdGhlIG9ubHkgdGhpbmcgdGhpcyBhZmZlY3RzCisgCWlzIHRoZSBzZXQgb2YgcmVnaXN0ZXJzIHZpc2libGUuCisJKiBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oIChSRUdJU1RFUl9OQU1FKTogRGVmaW5lIHRoaXMgYXMgYSBjYWxsCisJdG8gdGhlIGZ1bmN0aW9uIHJzNjAwMF9yZWdpc3Rlcl9uYW1lLgorCShyczYwMDBfcmVnaXN0ZXJfbmFtZSk6IEluY2x1ZGUgZXh0ZXJuIGRlY2wuCisJKE5VTV9SRUdTKTogQnVtcCB0byAxODMuICBXaGF0J3MgdGhlIHJpZ2h0IHdheSB0byBkbyB0aGlzPworCShGSVJTVF9VSVNBX1NQX1JFR05VTSwgTEFTVF9VSVNBX1NQX1JFR05VTSk6IFJlbmFtZWQgZnJvbQorCUZJUlNUX1NQX1JFR05VTSwgTEFTVF9TUF9SRUdOVU0uCisJKFJFR0lTVEVSX0JZVEVTKTogUmVjb21wdXRlIHRoaXMuCisJKiByczYwMDAtdGRlcC5jOiBSZW5hbWVkIGFsbCB1c2VzIG9mIEZJUlNUX1NQX1JFR05VTSBhbmQKKwlMQVNUX1NQX1JFR05VTSB0byBGSVJTVF9VSVNBX1NQX1JFR05VTSBhbmQgTEFTVF9VSVNBX1NQX1JFR05VTSwgd2l0aAorCXNvbWUgY29uY29taXRhbnQgZm9ybWF0dGluZyBjaGFuZ2VzLgorCSNpbmNsdWRlICJnZGJjbWQuaCIsIHNvIHdlIGNhbiBkZWZpbmUgY29tbWFuZHMgaGVyZS4KKwkoc3RydWN0IHZhcmlhbnQpOiBOZXcgc3RydWN0dXJlLgorCShDT01NT05fVUlTQV9SRUdfTkFNRVMsIFBQQ19VSVNBX1NQUl9OQU1FUywgUFBDX1NFR01FTlRfUkVHX05BTUVTLAorCVBQQ18zMl9PRUFfU1BSX05BTUVTLCBudW1fcmVnaXN0ZXJzKTogTmV3IG1hY3Jvcy4gCisJKHJlZ2lzdGVyX25hbWVzX3JzNjAwMCwgcmVnaXN0ZXJfbmFtZXNfdWlzYSwgcmVnaXN0ZXJfbmFtZXNfNDAzLAorIAlyZWdpc3Rlcl9uYW1lc180MDNHQywgcmVnaXN0ZXJfbmFtZXNfNTA1LCByZWdpc3Rlcl9uYW1lc184NjAsCisgCXJlZ2lzdGVyX25hbWVzXzYwMSwgcmVnaXN0ZXJfbmFtZXNfNjAyLCByZWdpc3Rlcl9uYW1lc182MDMsCisgCXJlZ2lzdGVyX25hbWVzXzYwNCwgcmVnaXN0ZXJfbmFtZXNfNzUwLCB2YXJpYW50cyk6IE5ldyB2YXJpYWJsZXMuCisJKHJzNjAwMF9yZWdpc3Rlcl9uYW1lLCBpbnN0YWxsX3ZhcmlhbnQsIGZpbmRfdmFyaWFudF9ieV9uYW1lLAorCWluc3RhbGxfdmFyaWFudF9ieV9uYW1lLCBsaXN0X3ZhcmlhbnRzLCBzaG93X2N1cnJlbnRfdmFyaWFudCwKKwlzZXRfcHJvY2Vzc29yLCBzaG93X3Byb2Nlc3Nvcik6IE5ldyBmdW5jdGlvbnMuCisJKF9pbml0aWFsaXplX3JzNjAwMF90ZGVwKTogRGVmaW5lIG5ldyBjb21tYW5kcyBgc2V0IHByb2Nlc3NvcicgYW5kCisJYHNob3cgcHJvY2Vzc29yJywgYW5kIGNhbGwgaW5zdGFsbF92YXJpYW50X2J5X25hbWUgdG8gc2V0IHRoZQorCWRlZmF1bHQgdmFyaWFudC4KKwkqIHJzNjAwMC1uYXQuYzogUmVuYW1lZCBhbGwgdXNlcyBvZiBGSVJTVF9TUF9SRUdOVU0gYW5kCisJTEFTVF9TUF9SRUdOVU0gdG8gRklSU1RfVUlTQV9TUF9SRUdOVU0gYW5kIExBU1RfVUlTQV9TUF9SRUdOVU0sIHdpdGgKKwlzb21lIGNvbmNvbWl0YW50IGZvcm1hdHRpbmcgY2hhbmdlcy4KKwkqIGNvbmZpZ3VyZS5pbjogQWNjZXB0IHRoZSBgLS13aXRoLWNwdScgZmxhZywgdG8gc3BlY2lmeSBhIGRlZmF1bHQKKwlwcm9jZXNzb3IgdmFyaWFudC4KKwkqIGFjY29uZmlnLmg6IFByb3ZpZGUgYSBibHVyYiBmb3IgVEFSR0VUX0NQVV9ERUZBVUxULCB3aGljaCBpcyBzZXQKKwlieSBjb25maWd1cmUncyBgLS13aXRoLWNwdScgZmxhZy4KKwkqIGNvbmZpZy5pbiwgY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworU3VuIEphbiAzMSAxNToyNDoyNCAxOTk5ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGJ1aWxkc3ltLmgsIGJ1aWxkc3ltLmM6IENvbnZlcnQgdG8gQU5TSS1vbmx5LgorCisJKiBidWlsZHN5bS5oLCBidWlsZHN5bS5jOiBSZWZvcm1hdCB0byBzdGFuZGFyZC4KKworCSogYnVpbGRzeW0uYyAobWVyZ2Vfc3ltYm9sX2xpc3RzKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZS4KKwkoX2luaXRpYWxpemVfYnVpbGRzeW0pOiBSZW1vdmUsIGRvZXMgbm90aGluZy4KKworMTk5OS0wMS0zMSBKLlQuIENvbmtsaW4gIDxqdGNAcmVkYmFja25ldHdvcmtzLmNvbT4KKworCSogaTM4Ni1zdHViLmMsIG0zMnItc3R1Yi5jLCBtNjhrLXN0dWIuYywgc2gtc3R1Yi5jLCBzcGFyYy1zdHViLmMsCisgCXNwYXJjbC1zdHViLCBzcGFyY2xldC1zdHViLmM6IENoYW5nZSBkZWNsYXJhdGlvbiBvZiBwdXREZWJ1Z0NoYXIKKyAJdG8gaW5jbHVkZSBleHBsaWNpdCB2b2lkIHJldHVybiB0eXBlIGFzIHBlciBkb2N1bWVudGF0aW9uLiAgRml4IHVwCisgCW9jY2FzaW9ucyB3aGVyZSBzdHVicyBlcnJvbmVvdXNseSBjaGVja2VkIHJldHVybiB0eXBlLgorCitTdW4gSmFuIDMxIDEzOjE4OjMzIDE5OTkgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCUZyb20gSi5ULiBDb25rbGluIDxqdGNAcmVkYmFja25ldHdvcmtzLmNvbT46CisJKiByZW1vdGUuYyAocmVtb3RlX3F1ZXJ5KTogRml4IHRpcG8uCisKK0ZyaSBKYW4gMjkgMTU6MjU6MDkgMTk5OSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0ICh2ODUwKTogQWRkIHdpbGRjYXJkIHRvIG1hdGNoLgorCitGcmkgSmFuIDI5IDE2OjQ0OjAxIDE5OTkgIEVkaXRoIEVwc3RlaW4gIDxlZXBzdGVpbkBzb3BoaWEuY3lnbnVzLmNvbT4KKworCSogaW5mZXJpb3IuaDogUmFuIGluZGVudC4KKworCSogZm9yay1jaGlsZC5jOiBSYW4gaW5kZW50LgorCisJKiBpbmZydW4uYyA6IFJhbiBpbmRlbnQuCisKK0ZyaSBKYW4gMjkgMTI6NTc6MzQgMTk5OSAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgorCisJKiBpbmZydW4uYyAoX2luaXRpYWxpemVfaW5mcnVuKTogRG8gbm90IHN0b3Agb3IgcHJpbnQgYW55dGhpbmcKKwl3aGVuIGEgU0lHV0lOQ0ggaXMgcmVjZWl2ZWQuCisKKwkqIE1ha2VmaWxlLmluIChtMi1leHAudGFiLmMpOiBVc2UgWUFDQyBub3QgQklTT04uCisJKGYtZXhwLnRhYi5jKTogRGl0dG8uCisJKGp2LWV4cC50YWIuYyk6IERpdHRvLgorCShjLWV4cC50YWIuYyk6IERpdHRvLgorCShZQUNDKTogRGVmaW5lIGFzIEBZQUNDQC4KKworMTk5OS0wMS0yOSAgTWFydGluIEh1bnQgIDxodW50QGN5Z251cy5jb20+CisKKwlDaGFuZ2VzIGZyb20gS2VpdGggU2VpdHogIDxrZWl0aHNAY3lnbnVzLmNvbT4KKyAgICAgICAgKiB2YWxvcHMuYyAodmFsdWVfYXNzaWduKTogQWRkIGNhbGxzIHRvIHJlZ2lzdGVyX2NoYW5nZWRfaG9vayBhbmQKKyAgICAgICAgbWVtb3J5X2NoYW5nZWRfaG9vayB0byBpbmZvcm0gVUlzIHRoYXQgdGhlIHVzZXIgaGFzIGNoYW5nZWQKKyAgICAgICAgdGhlIHRhcmdldCdzIHJlZ2lzdGVycy9tZW1vcnkuCisgICAgICAgICogZmluZHZhci5jICh3cml0ZV9yZWdpc3Rlcl9nZW4pOiBSZW1vdmUgY2FsbCB0byBwY19jaGFuZ2VkX2hvb2suCisgICAgICAgICogZGVmcy5oOiBSZW1vdmUgZGVjbGFyYXRpb24gZm9yIHBjX2NoYW5nZWRfaG9vayBhbmQKKyAgICAgICAgYWRkIGRlY2xhcmF0aW9ucyBmb3IgcmVnaXN0ZXJfY2hhbmdlZF9ob29rIGFuZAorICAgICAgICBtZW1vcnlfY2hhbmdlZF9ob29rLgorICAgICAgICAqIHRvcC5jOiBEaXR0by4KKworMTk5OS0wMS0yOSAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBwcm9jZnMuYyAod2FpdF9mZCk6IEhhbmRsZSBkZWxldGVkIHRocmVhZHMgY29ycmVjdGx5LgorCisxOTk5LTAxLTI4ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIHV0aWxzLmMgKGluaXRfcGFnZV9pbmZvKTogRm9yY2Ugd2luZG93IHNpemUgaWYgcnVubmluZyB1bmRlciBlbWFjcy4KKworMTk5OS0wMS0yNyAgSmFtZXMgSW5naGFtICA8amluZ2hhbUBjeWdudXMuY29tPgorCisJKiB0eXBlcHJpbnQuYyAod2hhdGlzX2V4cCk6IFJlbW92ZSBzdGF0aWMgZGVjbGFyYXRpb24uCisKK1dlZCBKYW4gMjcgMTY6NTA6MjUgMTk5OSAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgorCisJKiBocC1wc3ltdGFiLXJlYWQuYzogUmVmb3JtYXQgdXNpbmcgaW5kZW50LgorCitXZWQgSmFuIDI3IDEzOjIwOjI1IDE5OTkgIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KKworCSogaHAtcHN5bXRhYi1yZWFkLmM6IFJlZm9ybWF0IGNvbW1lbnRzLCB1cGRhdGUgY29weXJpZ2h0LgorCitUdWUgSmFuIDI2IDE2OjAyOjQ3IDE5OTkgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogdjg1MC10ZGVwLmMgKHY4NTBfZ2VuZXJpY19yZWdfbmFtZXMsIHY4NTBlX3JlZ19uYW1lcywKKwl2ODUwX3JlZ2lzdGVyX25hbWVzLCB2ODUwX3Byb2Nlc3Nvcl90eXBlX3RhYmxlKTogRGVjbGFyZSB0YWJsZXMKKwlhbmQgc3RydWN0dXJlcyBmb3IgaGFuZGxpbmcgZGlmZmVyZW5jZXMgaW4gcmVnaXN0ZXIgbmFtZXMgZm9yCisJdjg1MCBhbmQgdjg1MGUuCisJKHN0cnVjdCByZWdfbGlzdCk6IERlZmluZSBuZXcgc3RydWN0dXJlIGZvciBjcmVhdGluZyB0YWJsZXMKKwlvZiByZWdpc3RlciBiaXQgbWFza3MgaW4gdjg1MGUgaW5zdHJ1dGlvbnMuCisJKGhhbmRsZV9wcmVwYXJlLCBoYW5kbGVfcHVzaG0pOiBOZXcgaGVscGVycyBmb3Igdjg1MF9zY2FuX3Byb2xvZ3VlLgorCSh2ODUwX3NjYW5fcHJvbG9ndWUpOiBSZWNvZ25pemUgdjg1MGUgaW5zdHJ1Y3Rpb25zOiBjYWxsdCwgcHJlcGFyZSwKKwlhbmQgcHVzaG0uCisJKHY4NTBfdGFyZ2V0X2FyY2hpdGVjdHVyZV9ob29rKTogTmV3IGZ1bmN0aW9uIHRvIHNldCByZWdpc3RlcgorCW5hbWVzIGJhc2VkIG9uIGN1cnJlbnQgbWFjaGluZS4KKwkoX2luaXRpYWxpemVfdjg1MF90ZGVwKTogU2V0IHVwIHRhcmdldF9hcmNoaXRlY3R1cmVfaG9vay4KKwkqIGNvbmZpZy92ODUwL3RtLXY4NTAuaCAodjg1MF9yZWdpc3Rlcl9uYW1lcyk6IERlY2xhcmUuCisJKFJFR0lTVEVSX05BTUUpOiBEZWZpbmUgdG8gcmVmZXIgdG8gdjg1MF9yZWdpc3Rlcl9uYW1lcy4KKwkoU1IwX1JFR05VTSwgQ1RCUF9SRUdOVU0pOiBEZWZpbmUuCisJKFBTX1JFR05VTSk6IFJlZGVmaW5lIGluIHRlcm1zIG9mIFNSMF9SRUdOVU0uCisKK1R1ZSBKYW4gMjYgMTg6Mjc6MjYgMTk5OSAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYy1leHAudGFiLmMpOiBVc2UgQklTT04gaW5zdGVhZCBvZiBZQUNDLCB0byBwaWNrCisJdGhlIGNvcnJlY3QgdmFsdWUgZnJvbSBjb25maWd1cmUgb3V0cHV0LgorCShqdi1leHAudGFiLmMpOiBEaXR0by4KKwkoZi1leHAudGFiLmMpOiBEaXR0by4KKwkobTItZXhwLnRhYi5jKTogRGl0dG8uCisKKzE5OTktMDEtMjYgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5oIChlcF9pc19leGNlcHRpb25fY2F0Y2hwb2ludCk6IEFkZCBwcm90b3R5cGUuCisJKiBmcmFtZS5oIChzZWxlY3RfYW5kX3ByaW50X2ZyYW1lKTogQWRkIHByb3RvdHlwZS4KKwkqIHN0YWNrLmMgKGZ1bmNfY29tbWFuZCk6IENhbGwgc2VsZWN0X2FuZF9wcmludF9mcmFtZSB3aXRoIGNvcnJlY3QKKwludW1iZXIgb2YgYXJndW1lbnRzLiAgUmVmb3JtYXQgd2hpdGVzcGFjZS4KKworVHVlIEphbiAyNiAxNjo1Mzo1NCAxOTk5ICBGZXJuYW5kbyBOYXNzZXIgIDxmbmFzc2VyQGN5Z251cy5jb20+CisKKwkqIHJlbW90ZS5jIChyZW1vdGVfcXVlcnkpOiBmaXggbWF4aW11bSBwYWNrZXQgc2l6ZSB0byBhY2NvdW50IGZvcgorCSAgcmVtb3RlX2RlYnVnIHVzZS4KKwkgIChwdXRwa3QpOiBhZGQgY29tbWVudCB0byBhbGVydCBhYm91dCBleHRyYSBieXRlIG5lZWQuCisKK01vbiBKYW4gMjUgMTk6NTU6MzAgMTk5OSAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBzaC10ZGVwLmMgKHNoX3RhcmdldF9hcmNoaXRlY3R1cmVfaG9vayk6IFJldHVybiBpbW1lZGlhdGVseQorCXdoZW4gYSBtYXRjaGluZyBtYWNoaW5lIGlzIGZvdW5kLgorCitGcmkgSmFuIDIyIDA5OjEwOjM1IDE5OTkgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLW1pcHMuYyAobWlwc19pbml0aWFsaXplKTogRml4IHBhcmFtZXRlcnMgdG8gY2xlYXJfYnJlYWtwb2ludC4KKwkoY29tbW9uX2JyZWFrcG9pbnQpOiBSZXN0b3JlIHN1cHBvcnQgZm9yIGluc3RydWN0aW9uIGJyZWFrcG9pbnRzCisJb24gbm9uLUxTSSB0YXJnZXRzLgorCitUaHUgSmFuIDIxIDE3OjE2OjE5IDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc3RhY2suYzogQ2xvc2Ugb3BlbiBjb21tZW50LgorCSogc3ltdGFiLmMgKGZpbmRfcGNfc2VjdF9saW5lKTogRGl0dG8uCisKK1RodSBKYW4gMjEgMTc6NTE6NTEgMTk5OSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBwcm9jZnMuYyAoaW5pdF9wcm9jZnNfb3BzKTogTmV3IGZ1bmN0aW9uLCBmaWxscyBpbiBwcm9jZnNfb3BzLAorCWluaXQgb25seSBub256ZXJvIGZpZWxkcywgbGVhdmUgdG9fcmVxdWlyZV9hdHRhY2ggYW5kCisJdG9fcmVxdWlyZV9kZXRhY2ggZW1wdHksIG5vdCBuZWVkZWQgZm9yIC9wcm9jIHN5c3RlbXMgeWV0LgorCShfaW5pdGlhbGl6ZV9wcm9jZnMpOiBDYWxsIGluaXRfcHJvY2ZzX29wcy4KKworCUZyb20gSi5ULiBDb25rbGluIDxqdGNAcmVkYmFja25ldHdvcmtzLmNvbT46CisJKiB0b3AuYyAoaW5pdF9tYWluKTogRml4IHRpcG8gaW4gZGVzY3JpcHRpb24gb2YgdGhlIHJlbW90ZXRpbWVvdXQKKwl2YXJpYWJsZS4KKwkqIGJyZWFrcG9pbnQuYyAoYnBzdGF0X3N0b3Bfc3RhdHVzKTogSGFuZGxlIHN5c3RlbXMgd2hlcmUKKwlERUNSX1BDX0FGVEVSX0JSRUFLICE9IERFQ1JfUENfQUZURVJfSFdfQlJFQUsuCisKK1RodSBKYW4gMjEgMTc6MjU6NDYgMTk5OSAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBtb245NjAtcm9tLmMgKF9pbml0aWFsaXplX21vbjk2MCk6IENhbGwgaW5pdF9tb245NjBfY21kcworCXRvIGZpbGwgaW4gbW9uOTYwX2NtZHMgc3RydWN0dXJlIHByb3Blcmx5LgorCitXZWQgSmFuIDIwIDE3OjUzOjIyIDE5OTkgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLXNkcy5jIChzZHNfb3BzKTogRGVmaW5lIG9ubHkgb25jZS4KKwkoaW5pdF9zZHNfb3BzLCBzZHNfY29tbWFuZCwgX2luaXRpYWxpemVfcmVtb3RlX3Nkcyk6IERlY2xhcmUuCisJKGluaXRfc2RzX29wcyk6IEluaXQgb25seSBub24temVybyBmaWVsZHMuCisKK1dlZCBKYW4gMjAgMTU6NDU6MTUgMTk5OSAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBoODMwMC10ZGVwLmMgKG9yaWdpbmFsX3JlZ2lzdGVyX25hbWVzLCBoODMwMGhfcmVnaXN0ZXJfbmFtZXMsCisJaDgzMDBfcmVnaXN0ZXJfbmFtZXMpOiBEZWZpbmUgbmV3IHZhcmlhYmxlcy4KKwkoc2V0X3JlZ2lzdGVyX25hbWVzKTogTmV3IGZ1bmN0aW9uIHRvIHNldCByZWdpc3RlciBuYW1lcyBiYXNlZCBvbgorCWN1cnJlbnQgQ1BVIHR5cGUuCisJKGg4MzAwX2NvbW1hbmQsIGg4MzAwaF9jb21tYW5kLCBoODMwMHNfY29tbWFuZCk6IENhbGwKKwlzZXRfcmVnaXN0ZXJfbmFtZXMuCisJKiBjb25maWcvaDgzMDAvdG0taDgzMDAuaCAoaDgzMDBfcmVnaXN0ZXJfbmFtZXMpOiBEZWNsYXJlLgorCShSRUdJU1RFUl9OQU1FKTogRGVmaW5lIHRvIHJlZmVyIHRvIGg4MzAwX3JlZ2lzdGVyX25hbWVzLgorCisxOTk5LTAxLTE5ICBGZXJuYW5kbyBOYXNzZXIgIDxmbmFzc2VyQHRvdGVtLnRvLmN5Z251cy5jb20+CisKKwkqIHNvbC10aHJlYWQuYyBhYnVnLXJvbS5jIGNwdTMyYnVnLXJvbS5jIGRidWctcm9tLmMgbTMyci1yb20uYyAKKwltYWMtbmF0LmMgbW9uOTYwLXJvbS5jIG9wNTAtcm9tLmMgcHBjLWJkbS5jIHJlbW90ZS1hZGFwdC5jIAorCXJlbW90ZS1hcnJheS5jIHJlbW90ZS1idWcuYyByZW1vdGUtZTcwMDAuYyByZW1vdGUtZWIuYyByZW1vdGUtZXMuYyAKKwlyZW1vdGUtZXN0LmMgcmVtb3RlLWhtcy5jIHJlbW90ZS1tbS5jIHJlbW90ZS1uaW5keS5jIHJlbW90ZS1ucm9tLmMgCisJcmVtb3RlLW9zOWsuYyByZW1vdGUtcmRwLmMgcmVtb3RlLXNkcy5jIHJlbW90ZS1zaW0uYyByZW1vdGUtc3QuYyAKKwlyZW1vdGUtdWRpLmMgcm9tNjhrLXJvbS5jIHNoMy1yb20uYyBzcGFyY2wtdGRlcC5jIHNwYXJjbGV0LXJvbS5jIAorCXY4NTBpY2UuYyB3aW4zMi1uYXQuYzogY29zbWV0aWMgY2hhbmdlcyB0byBjb25mb3JtIHRvIGNvZGluZworCXN0YW5kYXJkcy4gCisKKzE5OTktMDEtMTkgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCVVzZSBhY2xvY2FsIHRvIGdlbmVyYXRlIEdEQidzIGFjbG9jYWwubTQgc2NyaXB0LiAgCisJKiBhY2luY2x1ZGUubTQ6IE5ldyBmaWxlLCBjb250YWluaW5nIHRoZSBoYW5kLXdyaXR0ZW4gbG9jYWwgbWFjcm8KKyAJZGVmaW5pdGlvbnMgdGhhdCB1c2VkIHRvIGJlIGluIGFjbG9jYWwubTQuICBEb24ndCBzaW5jbHVkZQorIAkuLi9iZmQvYWNsb2NhbC5tNCBhbnkgbW9yZTsgcnVubmluZyBhY2xvY2FsIGluIHRoaXMgZGlyZWN0b3J5IHdpbGwKKyAJZ2V0IHVzIHRoZSBkZWZpbml0aW9ucyB3ZSBuZWVkLiAgSE9XRVZFUjogRG8gc2luY2x1ZGUKKyAJLi4vYmZkL2FjaW5jbHVkZS5tNCwgYmVjYXVzZSB3ZSBuZWVkIHRoZSBkZWZpbml0aW9uIG9mCisgCUJGRF9ORUVEX0RFQ0xBUkFUSU9OLgorCSogYWNsb2NhbC5tNDogUmVnZW5lcmF0ZWQgYnkgYWNsb2NhbC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgYnkgYXV0b2NvbmYuCisKK1R1ZSBKYW4gMTkgMTA6Mjc6MjMgMTk5OSAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+CisKKwkqIGJyZWFrcG9pbnQuYyAoZGlzYWJsZV9icmVha3BvaW50c19pbl9zaGxpYnMpOiBuZXcgcGFyYW1ldGVyLAorCXNpbGVudCwgY29udHJvbHMgd2hldGhlciB0byBwcmludCBtZXNzYWdlIGFib3V0IHJlbW92YWwgb2Ygc2hhcmVkCisJbGlicmFyeSBicmVha3BvaW50cy4KKwkqIGJyZWFrcG9pbnQuaCAoZGlzYWJsZV9icmVha3BvaW50c19pbl9zaGxpYnMpOiBkZWNsIHVwZGF0ZWQuCisJKiBpcml4NS1uYXQuYyAoY2xlYXJfc29saWIpOiBjYWxsIGRpc2FibGVfYnJlYWtwb2ludHNfaW5fc2hsaWJzLgorCSogb3Nmc29saWIuYyAoY2xlYXJfc29saWIpOiBkaXR0by4KKwkqIHNvbGliLmMgKGNsZWFyX3NvbGliKTogZGl0dG8uCisJKiBzb21zb2xpYi5jIChzb21fc29saWJfcmVzdGFydCk6IHVwZGF0ZSBjYWxsIHRvCisJZGlzYWJsZV9icmVha3BvaW50c19pbl9zaGxpYnMuCisKKwkqIHRhcmdldC5oIChjaGlsZF9wb3N0X2F0dGFjaCk6IG9ubHkgZGVjbGFyZSBpZiBDSElMRF9QT1NUX0FUVEFDSAorCWlzIGRlZmluZS4KKworVHVlIEphbiAxOSAxODowNzoxMSAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvcmVsb3cuYyAoc29saWJfYWRkX3N0dWIpOiBEaXR0by4KKwkoY29yZV9maWxlX3RvX3N5bV9maWxlKTogQ2FzdCBtYWtlX2NsZWFudXAgcGFyYW1ldGVyLgorCisJKiBzb2xpYi5jIChzeW1ib2xfYWRkX3N0dWIsIHNvbGliX21hcF9zZWN0aW9ucyk6IENoYW5nZSBhcmd1bWVudAorIAl0byBQVFIgaW5zdGVkIG9mIGEgY2hhciouICBNYXRjaGVzIGNhdGNoX2Vycm9ycyBpbnRlcmZhY2UuCisKK01vbiBKYW4gMTggMTQ6MDE6MjQgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiByZW1vdGUtYXJyYXkuYyAoYXJyYXlfb3Blbik6IERvbid0IHVzZSBmcHJpbnRmX2ZpbHRlcmVkIHRvIHNlbmQKKyAJZGF0YSB0byB0aGUgbG9nIGZpbGUuCisKKwkqIHJlbW90ZS1hcnJheS5jIChoYW5kbGVfbG9hZF9kbGwpOiBDaGFuZ2UgYXJndW1lbnQgdHlwZSB0byBQVFIgc28KKyAJdGhhdCBpdCBpcyBjb21wYXRpYmxlIHdpdGggY2F0Y2hfZXJyb3JzLgorCSogb2NkLmMgKG9jZF9zdGFydF9yZW1vdGUpOiBEaXR0by4KKwkqIHJlbW90ZS1zZHMuYyAoc2RzX3N0YXJ0X3JlbW90ZSk6IERpdHRvLgorCisJKiB3aW4zMi1uYXQuYyAod2luMzJfY2hpbGRfdGhyZWFkX2FsaXZlKTogTmFtZXNwYWNlIHByb29mCisgCWNoaWxkX3RocmVhZF9hbGl2ZS4KKwkoaW5pdF9jaGlsZF9vcHMpOiBVcGRhdGUuCisKK01vbiBKYW4gMTggMTI6MDM6NDcgMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiByZW1vdGUtcmRpLmMgKGFybV9yZGlfb3Blbik6IFNldCBnZGJfaG9zdGlmLmhvc3Rvc2FyZyBhbmQKKyAJZ2RiX2hvc3RpZi5kYmdhcmcgdG8gTlVMTCBpbnN0ZWFkIG9mIHN0ZG91dC4KKwkodm9pZGR1bW15LCBteXByaW50LCBteXdyaXRlYyk6IFVzZSBnZGJfc3Rkb3V0IGluc3RlYWQgb2Ygc3Rkb3V0LgorCitNb24gSmFuIDE4IDE2OjQwOjUwIDE5OTkgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogc2VyLW9jZC5jIChvY2Rfb3Blbik6IEhhbmRsZSBVbml4IGNhc2UgZ3JhY2VmdWxseS4KKworCSogdGFyZ2V0LmMgKGR1bW15X3RhcmdldCk6IERvbid0IGluaXRpYWxpemUgc3RhdGljYWxseS4KKwkoaW5pdF9kdW1teV90YXJnZXQpOiBOZXcgZnVuY3Rpb24sIGZpbGxzIGluIGR1bW15X3RhcmdldC4KKwkoaW5pdGlhbGl6ZV90YXJnZXRzKTogVXNlIGl0LgorCSogaHB1eC10aHJlYWQuYyAoaHB1eF90aHJlYWRfb3BzKTogRG9uJ3QgaW5pdGlhbGl6ZSBzdGF0aWNhbGx5LgorCShpbml0X2hwdXhfdGhyZWFkX29wcyk6IE5ldyBmdW5jdGlvbiwgZmlsbHMgaW4gaHB1eF90aHJlYWRfb3BzLgorCShfaW5pdGlhbGl6ZV9ocHV4X3RocmVhZCk6IFVzZSBpdC4KKwkqIG0zLW5hdC5jIChtM19vcHMpOiBEb24ndCBpbml0aWFsaXplIHN0YXRpY2FsbHkuCisJKGluaXRfbTNfb3BzKTogTmV3IGZ1bmN0aW9uLCBmaWxscyBpbiBtM19vcHMuCisJKF9pbml0aWFsaXplX20zKTogVXNlIGl0LgorCisxOTk5LTAxLTE4ICBGZXJuYW5kbyBOYXNzZXIgIDxmbmFzc2VyQHRvdGVtLnRvLmN5Z251cy5jb20+CisKKwkqIHNvbC10aHJlYWQuYzogZGVsZXRlIGNvbXBpbGUgdGltZSBpbml0aWFsaXphdGlvbiBvZiB0YXJnZXRfb3BzCisJICAoX2luaXRpYWxpemVfc29sX3RocmVhZCk6IGluaXRpYWxpemUgdGFyZ2V0X29wcyBhdCBydW4gdGltZS4KKwkqIGhwdXgtdGhyZWFkLmM6IGFkZGVkIHRhcmdldF9vcHMgZW50cnkuCisJKiBtMy1uYXQuYzogZGl0dG8uCisKK01vbiBKYW4gMTggMTU6MTk6MTMgMTk5OSAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+CisKKwkqIHByb2Nmcy5jIChwcm9jZnNfb3BzKTogZGVsZXRlIGNvbXBpbGUgdGltZSBpbml0aWFsaXphdGlvbi4KKwkoX2luaXRpYWxpemVfcHJvY2ZzKTogaW5pdGlhbGl6ZSBwcm9jZnNfb3BzIGF0IHJ1biB0aW1lLgorCitNb24gSmFuIDE4IDEyOjUxOjQ0IDE5OTkgIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRW5zdXJlIHRoYXQgLWx1c2VyMzIgaXMgYWx3YXlzIGxpbmtlZCBpbgorCWZvciBjeWd3aW4gYnVpbGQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitNb24gSmFuIDE4IDA4OjM4OjA1IDE5OTkgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogdmFsdWVzLmMgKHZhbHVlX3ZpcnR1YWxfZm5fZmllbGQpOiBDbGVhciB0aGUgcG9pbnRlZC10bworCW9mZnNldCB3aGVuIGNhc3RpbmcgdG8gdGhlIGJhc2UgY2xhc3MuCisKK01vbiBKYW4gMTggMTA6MzA6NTEgMTk5OSAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS11ZGkuYyAoaW5pdF91ZGlfb3BzKTogY2hhbmdlIG5vbi1leGlzdGFudCB1ZGlfcnVuX29wcyB0bworCXVkaV9vcHM7IGRlbGV0ZSBOVUxMIGluaXRpYWxpemVycy4KKworTW9uIEphbiAxOCAxMjowMzo0NyAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNlcmlhbC5jIChzZXJpYWxfY2xvc2UpOiBnZGJfZmNsb3NlIHRhZ2VzIGdkYl9maWxlKiogYXJnLCBub3QKKyAJZ2RiX2ZpbGUqLgorCisJKiBmLXZhbHByaW50LmMsIHRhcmdldC5jLCBnZGJhcmNoLmM6IFBhc3MgZ2RiX3N0ZGVyciBub3Qgc3RkZXJyLgorCitNb24gSmFuIDE4IDEwOjQ2OjEyIDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc3RhY2suYyAocHJpbnRfZnJhbWVfaW5mb19iYXNlKTogRG9uJ3QgY2FzdCBjYWxsIHRvCisgCWNhdGNoX2Vycm9ycy4KKwkocHJpbnRfYXJnc19zdHViKTogQ2hhbmdlIGNoYXIqIGFyZyB0byBQVFIuCisJKiBzeW1taXNjLmMgKHByaW50X3N5bWJvbCk6IERpdHRvLgorCSogdG9wLmMgKHF1aXRfY292ZXIpOiBEaXR0by4KKwkqIHJlbW90ZS5jIChyZW1vdGVfb3Blbl8xLCByZW1vdGVfc3RhcnRfcmVtb3RlKTogRGl0dG8uCisJKiBpbmZydW4uYyAobm9ybWFsX3N0b3AsIGhvb2tfc3RvcF9zdHViLCByZXN0b3JlX3NlbGVjdGVkX2ZyYW1lKToKKyAJRGl0dG8uCisKKwkqIHN0YWNrLmMgKGJhY2t0cmFjZV9jb21tYW5kKTogQ2FzdCBmaXJzdCBhcmcgb2YgbWFrZV9jbGVhbnVwIHRvCisgCW1ha2VfY2xlYW51cF9mdW5jLgorCSogcmVtb3RlLmMgKHJlbW90ZV9raWxsKTogQ2FzdCBwdXRwa3QgYXJnIHRvIGNhdGNoX2Vycm9yc19mdHlwZS4KKworTW9uIEphbiAxOCAwODo0NzowMiAxOTk5ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisJCisJKiBkZWZzLmggKGNhdGNoX2Vycm9yc19mdHlwZSk6IERlZmluZS4KKwkoY2F0Y2hfZXJyb3JzKTogUmVwbGFjZSBjaGFyKiBhcmcgd2l0aCBQVFIgYXJnLgorCSogdG9wLmMgKGNhdGNoX2Vycm9ycyk6IFVwZGF0ZQorCisJKiBicmVha3BvaW50LmMgKGJwc3RhdF9zdG9wX3N0YXR1cywgYnBzdGF0X3N0b3Bfc3RhdHVzLAorIAlkZWxldGVfYnJlYWtwb2ludCwgYnJlYWtwb2ludF9yZV9zZXQpOiBEZWxldGUgYWxsIGNhc3RzIGluIGNhbGwgdG8KKyAJY2F0Y2hfZXJyb3JzLgorIAkoYnJlYWtwb2ludF9jb25kX2V2YWwsIHdhdGNocG9pbnRfY2hlY2ssCisgCWNvdmVyX3RhcmdldF9lbmFibGVfZXhjZXB0aW9uX2NhbGxiYWNrLCBicmVha3BvaW50X3JlX3NldF9vbmUpOgorIAlBcmcgaXMgUFRSIG5vdCBjaGFyKi4KKwkKKwkqIGJyZWFrcG9pbnQuYyAoY292ZXJfdGFyZ2V0X2VuYWJsZV9leGNlcHRpb25fY2FsbGJhY2spOiBDaGFuZ2UKKyAJdHlwZSB0byBpbnQuIENoZWNrIGZvciBjYXN0IHZhbHVlcyBvZiAwIGFuZCAtMS4gIFJldHVybiBhIHJlc3VsdCEKKwkoaW5zZXJ0X2JyZWFrcG9pbnRzKTogTW92ZSBkZWNsYXJhdGlvbiBvZiBTQUwgYW5kIEFSR1MgdG8gd2hlcmUKKyAJdGhleSBhcmUgdXNlZC4KKworMTk5OS0wMS0xNiAgRmVybmFuZG8gTmFzc2VyICA8Zm5hc3NlckB0b3RlbS50by5jeWdudXMuY29tPgorCisJKiByZW1vdGUuYyAocmVtb3RlX3F1ZXJ5KTogbmV3IGZ1bmN0aW9uIC0gY3JlYXRlcyBwcm9wZXIgaW50ZXJmYWNlCisJdG8gdGhlIHJlbW90ZSBwcm90b2NvbCAicSIgY29tbWFuZC4JCisKK0ZyaSBKYW4gMTUgMTc6MTE6NDggRVNUIDE5OTkgIFpkZW5layBSYWRvdWNoICAgKHJhZG91Y2hAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2ZyMzAvdG0tZnIzMC5oOiAgQ2hhbmdlZCBBQkkgdG8gbWF0Y2ggR0NDIGNoYW5nZQorCSAgKGFsd2F5cyB1c2UgcG9pbnRlciBmb3Igc3RydWN0cyBwYXNzZWQgYnkgdmFsdWUpLgorCisxOTk5LTAxLTE1ICBGZXJuYW5kbyBOYXNzZXIgIDxmbmFzc2VyQHRvdGVtLnRvLmN5Z251cy5jb20+CisKKwkqIHRhcmdldC5oOiBhZGRlZCBlbnRyeSBmb3IgdGFyZ2V0IHF1ZXJpZXMgKHRvX3F1ZXJ5KQorCSAgdGFyZ2V0LmM6IGRpdHRvLgorCitUaHUgSmFuIDE0IDE4OjI5OjE3IDE5OTkgIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJKiByZW1vdGUtbW0uYyAobW1fd2FpdCk6IGZpeCBzdHJlYW0gYXJnIHRvIGdkYl9mbHVzaC4KKwkqIHJlbW90ZS11ZGkuYyAodWRpX3dhaXQpOiBmaXggc3RyZWFtIGFyZyB0byBmd3JpdGUuCisJKiBzeW1taXNjLmMgKG1haW50ZW5hbmNlX2NoZWNrX3N5bXRhYnMpOiBmaXggc3RyZWFtIGFyZ3VtZW50IHRvCisJcHJpbnRfYWRkcmVzc19udW1lcmljLgorCQorV2VkIEphbiAxMyAxOTozMzoxNiAxOTk5ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KKworCSogYnJlYWtwb2ludC5jIChpbnNlcnRfYnJlYWtwb2ludHMpOiBpbnNlcnQgY2FzdCB0byBlbGltaW5hdGUKKwl3YXJuaW5nLgorCitXZWQgSmFuIDEzIDE0OjU5OjAyIDE5OTkgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIGluZnJ1bi5jIChzZXQvc2hvdyBzY2hlZHVsZXItbG9ja2luZykgTmV3IGNvbW1hbmQuICBTZXQgYQorCSAgbW9kZSBiaXQgdGhhdCB3aWxsIGNvbnRyb2wgaG93IEdEQiBhdHRlbXB0cyB0byBjb250cm9sIHRocmVhZAorCSAgc2NoZWR1bGluZyBmb3Igc3RlcCwgY29udGludWUsIGV0Yy4gIChyZXN1bWUpOiBtYWtlIHVzZSBvZgorCSAgdGhlIHNjaGVkdWxlLWxvY2tpbmcgbW9kZS4KKwkqIHRhcmdldC5oIChzdHJ1Y3QgdGFyZ2V0X29wcyk6IG5ldyBmaWVsZCB0b19oYXNfdGhyZWFkX2NvbnRyb2wuCisJKiBzb2wtdGhyZWFkLmM6IGluaXRpYWxpemUgdGFyZ2V0X29wcyB0b19oYXNfdGhyZWFkX2NvbnRyb2wuCisJKiBwcm9jZnMuYzogZGl0dG8uCisJKiB0YXJnZXQuYzogZGl0dG8uCisJKiBtMy1uYXQuYzogZGl0dG8uCisJKiByZW1vdGUuYzogZGl0dG8uCisJKiBocHV4LXRocmVhZC5jOiBkaXR0by4KKwkqIHRocmVhZC5jOiBjdWxsIGR1cGxpY2F0ZSBwcm90b3R5cGVzLiAgTW92ZSBwcm90b3R5cGVzIHRvIHRvcC4KKwkqIHNlcmlhbC5jOiBpbmRlbnRhdGlvbiBjbGVhbnVwLgorCSogYnJlYWtwb2ludC5jOiBhZGQgY2FzdHMgdG8gZWxpbWluYXRlIGNvbXBpbGVyIHdhcm5pbmdzLgorCQorVHVlIEphbiAxMiAxNzowMDowMCAxOTk5ICBFZGl0aCBFcHN0ZWluICA8ZWVwc3RlaW5Ac29waGlhLmN5Z251cy5jb20+CisKKwkqIGluZnRhcmcuYyAoY2hpbGRfY3JlYXRlX2luZmVyaW9yKTogZml4ZWQgSFBVWEhQUEEgc3BlY2lmaWMKKwkgIGNhbGwgdG8gZm9ya19pbmZlcmlvci4gVGhlIHNoZWxsIHBhcmFtIGlzIG5vdyBOVUxMLgorCisxOTk5LTAxLTEyICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIG1vbml0b3IuYyAoaW5pdF9iYXNlX21vbml0b3Jfb3BzKTogV2hpdGVzcGFjZSBjbGVhbnVwLgorCShfaW5pdGlhbGl6ZV9yZW1vdGVfbW9uaXRvcnMpOiBTYW1lLgorCisxOTk5LTAxLTEyICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIG1vbml0b3IuYyAoaW5pdF9tb25pdG9yX29wcyk6IEluaXRpYWxpemUgdGhlIG1vbml0b3Jfb3BzCisJc3RydWN0dXJlIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gZG9uZS4KKworVHVlIEphbiAxMiAxNDo1MDoxMCAxOTk5ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGluZnRhcmcuYyAoY2hpbGRfb3BzKTogRG9uJ3QgaW5pdGlhbGl6ZSBzdGF0aWNhbGx5LgorCShpbml0X2NoaWxkX29wcyk6IE5ldyBmdW5jdGlvbiwgZmlsbHMgaW4gY2hpbGRfb3BzLgorCShfaW5pdGlhbGl6ZV9pbmZ0YXJnKTogVXNlIGl0LgorCShjaGlsZF9wb3N0X2F0dGFjaCk6IERlY2xhcmUgZXh0ZXJuLgorCShjaGlsZF93YWl0KTogRml4IGFtYmlndW91cyBwYXJlbnMuCisJKGNoaWxkX2F0dGFjaF90b19wcm9jZXNzKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB3c3RhdHVzLgorCShjaGlsZF9pbnNlcnRfZm9ya19jYXRjaHBvaW50LCBjaGlsZF9yZW1vdmVfZm9ya19jYXRjaHBvaW50LAorCWNoaWxkX2luc2VydF92Zm9ya19jYXRjaHBvaW50LCBjaGlsZF9yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludCwKKwljaGlsZF9oYXNfZm9ya2VkLCBjaGlsZF9pbnNlcnRfZXhlY19jYXRjaHBvaW50LAorCWNoaWxkX3JlbW92ZV9leGVjX2NhdGNocG9pbnQpOiBSZXR1cm4gYSB2YWx1ZS4KKworTW9uIEphbiAxMSAxNjo0Mzo0NCAxOTk5ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiByZW1vdGUuYyAocmVtb3RlX3dhaXQpOiBBZGQgaW5mZXJpb3JfcGlkIHRvIHRocmVhZCBsaXN0IG9ubHkKKwlpZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZS4KKworMTk5OS0wMS0xMSAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBzY20tdGFncy5oOiBVcGRhdGUgRlNGJ3MgYWRkcmVzcyBvbiBjb3B5cmlnaHQgbm90aWNlLgorCSogc2VyLWU3a3BjLmM6IFNhbWUuCisJKiBnbnUtbmF0Lmg6IFNhbWUuCisKK01vbiBKYW4gMTEgMTM6NDU6NTcgMTk5OSAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmFieWxvbi01LmN5Z251cy5jb20+CisKKwkqIGR3YXJmMnJlYWQuYyAoZHVtcF9kaWUpOiAgQ2hhbmdlIHN0ZGVyciB0byBnZGJfc3RkZXJyLgorCSogZXhwcHJpbnQuYyAocHJpbnRfc3ViZXhwKTogIGZwcmludGYgPT4gZnByaW50Zl91bmZpbHRlcmVkLgorCSoganYtdHlwZXByaW50LmMgKGphdmFfdHlwZV9wcmludF9iYXNlKTogIGZwdXRzID0+IGZwdXRzX2ZpbHRlcmVkLgorCSogc3RhY2suYyAoc3RydWN0IGZ1bmN0aW9uX2JvdW5kcyk6ICBSZW1vdmUgc3VwZXJmbHVvdXMgYHR5cGVkZWYnLgorCSogc3ltZmlsZS5jIChsaXN0X292ZXJsYXlzX2NvbW1hbmQpOiAgc3Rkb3V0ID0+IGdkYl9zdGRvdXQuCisJKiBzeW1taXNjLmMgKG1haW50ZW5hbmNlX2NoZWNrX3N5bXRhYnMpOiAgc3Rkb3V0ID0+IGdkYl9zdGRvdXQuCisJKiB1dGlscy5jIChwcmludF9zcGFjZXMpOiAgTWFrZSBtb3JlIGVmZmljaWVudC4KKwkKK01vbiBKYW4gMTEgMTM6NTU6NTEgMTk5OSAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+CisKKwkqIHV0aWxzIChwcmludF9zcGFjZXMpOiBmaXggYXJnIHRvIHN0cmNhdDsgZml4IGZvcm1hdHRpbmcuCisKK0ZyaSBKYW4gIDggMTE6NTc6MjQgMTk5OSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBleGVjLmMgKGV4ZWNfb3BzKTogRG9uJ3QgaW5pdGlhbGl6ZSBzdGF0aWNhbGx5LgorCShpbml0X2V4ZWNfb3BzKTogTmV3IGZ1bmN0aW9uLCBmaWxscyBpbiBleGVjX29wcy4KKwkoX2luaXRpYWxpemVfZXhlYyk6IFVzZSBpdC4KKworVGh1IEphbiAgNyAxNzo1MDoxNSBFU1QgMTk5OSAgWmRlbmVrIFJhZG91Y2ggICAocmFkb3VjaEBjeWdudXMuY29tKQorCisJQmV0YSBGUjMwIHBvcnQuCisJKiBmcjMwLXRkZXAuYworCSogY29uZmlnL2ZyMzAvdG0tZnIzMC5oCisJCitXZWQgSmFuICA2IDEyOjI4OjM1IDE5OTkgIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZCBhbiAtLWVuYWJsZS10dWkgYXJndW1lbnQuICBDb25zdHJ1Y3QKKyAJdHVpL01ha2VmaWxlIGZyb20gdHVpL01ha2VmaWxlLmluLiAgVXNlIEFNX1BST0dfQ0NfU1REQy4gIElmIHdlCisgCWhhdmUgdGhlIEdVSSwgdGhlbiB3ZSBuZWVkIHRoaXMgdG8gcHJvY2VzcyBsaWJndWkuaC4KKwkoRU5BQkxFX0NGTEFHUyk6IGRlZmluZSBhbmQgZXhwb3J0IEJVSUxEX1RVSS4KKwkoQUNfQ0hFQ0tfSEVBREVSUyk6IEFkZCBjaGVjayBmb3IgdGVybS5oLgorCQorCSogY29uZmlndXJlLmhvc3QgKGhwcGEtKi1ocHV4MTAuMjAsIGhwcGEtKi1ocHV4MTEuMCopOiBOZXcgY29uZmlncy4KKworCSogY29uZmlnLmluLCBjb25maWd1cmUgOiByZWdlbmVyYXRlZC4KKworCSogTWFrZWZpbGUuaW46IEFsbG93IHRoZSBUVUkgY29kZSB0byBiZSBjb25kaXRpb25hbGx5IGVuYWJsZWQuCisJKFRVSV9MSUJSQVJZKTogTmV3IHZhcmlhYmxlLCB2YWx1ZSBhcmUgc2V0IGJ5IHRoZSBjb25maWd1cmF0aW9uCisgCXNjcmlwdC4gIFNldCB0byB0aGUgZW1wdHkgc3RyaW5nIHdoZW4gdGhlIFRVSSBpc24ndCBlbmFibGVkLgorCShnZGIkKEdEQkVYVCkpOiBVc2UgdGhvc2UsIGluc3RlYWQgb2YgcmVmZXJyaW5nIHRvIGFsbC10dWkgYW5kCisgCXR1aS9saWJ0dWkuYSBkaXJlY3RseS4KKwkoQlVJTERfVFVJKTogYnVpbGQgdGhlIHR1aSAtLSBvbmx5IHdoZW4gY29uZmlndXJlZCB3aXRoCisgCS0tZW5hYmxlLXR1aS4KKwkoWUxXUkFQKTogdXNlIHlsd3JhcCB0byBhdm9pZCBwcm9ibGVtcyBvbiBzeXN0ZW1zIHcvbyBiaXNvbi4KKwkoZ2RiJChFWEVFWFQpKTogbWFrZSBpdCBkZXBlbmRlbnQgb24gQlVJTERfVFVJLgorCShhbGwtdHVpKTogcmVtb3ZlIGRlcGVuZGVuY3kgZnJvbSBwaG9ueSB0YXJnZXQuCisJKGMtZXhwLnRhYi5jKTogdXNlIHlsd3JhcCBpbnN0ZWFkIG9mIGJpc29uLgorCShqdi1leHAudGFiLmMpOiBkaXR0by4KKwkoZi1leHAudGFiLmMpOiBkaXR0by4KKwkobTItZXhwLnRhYi5jKTogZGl0dG8uCisJKEFMTERFUEZJTEVTKTogYWRkIHNvbXJlYWQuYywgaHAtcHN5bXRhYi1yZWFkLmMsIGhwLXN5bXRhYi1yZWFkLmMuCisJKFNGSUxFUyk6IHJlbW92ZSB0aGUgYWJvdmUgZmlsZXMKKwkoQ09NTU9OX09CUyk6IHJlbW92ZSBzb21yZWFkLm8KKwkoU0ZJTEVTKTogQWRkIHRoZSB0dWkgZmlsZXMgdG8gdGhpcywgc28gdGhleSBnZXQgaW5jbHVkZWQgaW4gZXRhZ3MKKyAJdGFibGVzLgorCShnZGIkKEVYRUVYVCkpOiBBZGQgYWxsLXR1aSB0byB0aGUgbGlzdCBvZiBkZXBlbmRlbmNpZXMsIGFuZCBhZGQKKyAJdHVpL2xpYnR1aS5hIHRvIHRoZSBsaW5rIGxpc3QuCisJKGFsbC10dWkpOiBOZXcgcnVsZSwgd2hpY2ggZG9lcyBhIHJlY3Vyc2l2ZSBtYWtlIGluIHRoZSB0dWkKKyAJc3ViZGlyLgorCSh0dWkvbGlidHVpLmEpOiBXaGVuIHJlY3Vyc2luZywgcGFzcyBkb3duICR7RkxBR1NfVE9fUEFTU30uICBBbmQKKyAJZG9uJ3QgZWNobyB0aGUgbWFrZSBjb21tYW5kLiAgVGhpcyBpcyBjbG9zZXIgdG8gd2hhdCB0aGUgb3RoZXIKKyAJcmVjdXJzaW9ucyBkby4KKwkoSEZJTEVTX05PX1NSQ0RJUik6IGFkZCBocHJlYWQuaAorCShDT01NT05fT0JTKTogYWRkIGhwLXBzeW10YWItcmVhZC5vLCBocC1zeW10YWItcmVhZC5vCisgICAgICAgIChTRklMRVMpOiBhZGQgaHAtcHN5bXRhYi1yZWFkLmMsIGhwLXN5bXRhYi1yZWFkLmMgYWRkIHJ1bGVzIGZvcgorIAl0aGUgbmV3IGZpbGVzLiAgUmVtb3ZlIGhwcmVhZC5jLCBocHJlYWQubworCShnZGIkKEVYRUVYVCkpOiBEZXBlbmQgb24gdGhlIGFjdHVhbCB0dWkgbGlicmFyeSwgbm90IG9uIGEKKyAJZmljdGl0aW91cyB0YXJnZXQuICBTaW5jZSB0aGUgZmljdGl0aW91cyB0YXJnZXQgbmV2ZXIgZXhpc3RlZCwKKyAJbWFrZSB3b3VsZCBhbHdheXMgcmVsaW5rLgorCSh0dWkvbGlidHVpLmEpOiBBbHdheXMgcmVjdXJzZSB0byBtYWtlIHN1cmUgdGhlIGxpYnJhcnkgaXMgdXAgdG8KKyAJZGF0ZS4KKworV2VkIEphbiAgNiAxMjowNToxMiAxOTk5ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS5jOiBQYWNpZnkgLS1lbmFibGUtYnVpbGQtd2FybmluZ3MsIHJlZm9ybWF0IGNvZGUKKwl0byBjb25mb3JtIHRvIHN0YW5kYXJkcywgZml4IHNwZWxsaW5nIGVycm9ycy4KKwkoaXNoZXgsIHN0dWJoZXgsIHJlY29yZF9jdXJydGhyZWFkLCBldGMpOiBEZWNsYXJlLgorCShpc2hleCwgc3R1YmhleCk6IERlY2xhcmUgY2hhciBhcmcgYXMgaW50LgorCShwYWNrX3N0cmluZyk6IENvbW1lbnQgb3V0LCBuZXZlciB1c2VkIGJ1dCBwb3NzaWJseSB1c2VmdWwuCisJKHRocmVhZHJlZl90b19pbnQsIHJlbW90ZV9nZXRfdGhyZWFkaW5mbywgZXRjKTogTWFrZSBzdGF0aWMuCisKK1dlZCBKYW4gIDYgMTE6NDM6MzIgMTk5OSAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+CisKKwlUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGJ5IEVsZW5hIFphbm5vbmkKKyAJPGV6YW5ub25pQGN5Z251cy5jb20+IGFuZCBFZGl0aCBFcHN0ZWluIDxlZXBzdGVpbkBjeWdudXMuY29tPiBhcworIAlwYXJ0IG9mIGEgcHJvamVjdCB0byBtZXJnZSBpbiBjaGFuZ2VzIG1hZGUgYnkgSFAuCisKKwkqIGMtZXhwLnk6IHVzZSBleHRlcm5hbCBmbGFnIGhwX3NvbV9zb21fb2JqZWN0X3ByZXNlbnQgdG8gZGVjaWRlCisgCXdoZXRoZXIgY29kZSB3YXMgY29tcGlsZWQgYnkgSFAncyBjb21waWxlcnMuICBBZGQgdHdvIG5ldyBDKysKKyAJdG9rZW5zIGZvciB0cnVlIGFuZCBmYWxzZS4KKyAgICAgICAgKHl5bGV4KTogY2hlY2sgZm9yIHRlbXBsYXRlIG5hbWUgaXMgZG9uZSBkaWZmZXJlbnRseSBmb3IgdGhlCisgCUhQL2FDQyBjb21waWxlciBjYXNlLiAgQ2hhbmdlIHNvbWUgb2YgdGhlIHRlbXBsYXRlIHByb2Nlc3NpbmcgY29kZQorIAlmb3IgaGFuZGxpbmcgSFAgYUNDIHRlbXBsYXRlcy4gIEhhbmRsZSB0cnVlIGFuZCBmYWxzZSB0b2tlbnMuCisJCitUdWUgSmFuICA1IDExOjEzOjM2IDE5OTkgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS5jIChyZWNvcmRfY3VydGhyZWFkKTogTXVzdCBub3QgbW9kaWZ5IGluZmVyaW9yX3BpZCB3aGVuCisgCWNhbGxlZCBmcm9tIHdhaXRfZm9yX2luZmVyaW9yLiAgSW5zdGVhZCwgaWYgYSBuZXcgdGhyZWFkLWlkIGlzCisgCWRldGVjdGVkLCBjYWxsIGFkZF90aHJlYWQuCisJKE1BR0lDX05VTExfUElEKTogbmV3IG1hY3JvLCB1c2UgaW5zdGVhZCBvZiB0aGUgbWFnaWMgbnVtYmVyCisgCSI0MjAwMCIuCisJKHJlbW90ZV9maW5kX25ld190aHJlYWRzKTogaWYgaW5mZXJpb3JfcGlkIGlzIHVua25vd24sIGdldCBhbmQgdXNlCisgCXRoZSBjdXJyZW50IHRocmVhZCBpZC4KKwkocmVtb3RlX3N0YXJ0X3JlbW90ZSk6IG9uIGNvbm5lY3RpbmcsIGF0dGVtcHQgdG8gZ2V0IHRoZSBjdXJyZW50CisgCXRocmVhZCBpZCBmb3IgaW5mZXJpb3JfcGlkLgorCShyZW1vdGVfcmVzdW1lKTogSWYgcGlkID09IC0xLCB0aGVuIHJlc3VtZSBhbnktdGhyZWFkIChub3QgdGhlCisgCWN1cnJlbnQgdGhyZWFkIHNwZWNpZmljYWxseSkuICBBbHNvIHNvbWUgY29zbWV0aWMgZml4dXBzLgorCQorCSogdGhyZWFkLmMgKGluZm9fdGhyZWFkc19jb21tYW5kKTogZG9uJ3QgaW5pdGlhbGl6ZSBjdXJyZW50X3BpZCAKKwl1bnRpbCBhZnRlciBjYWxsIHRvIEZJTkRfTkVXX1RIUkVBRFMgKHdoaWNoIG1heSBjaGFuZ2UgaW5mZXJpb3JfcGlkKS4KKwlBbHNvIHNvbWUgY29zbWV0aWMgZml4dXBzLgorCSogaW5mcnVuLmM6IGNvc21ldGljIGZpeHVwcyBhbmQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCisJKiBpbmZjbWQuYzogY29zbWV0aWMgZml4dXBzLCBtYWlubHkgbG9uZyBsaW5lcy4KKwkKK1R1ZSBKYW4gIDUgMTE6NTU6NTcgMTk5OSAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+CisKKwkqIHRhcmdldC5jIChub3Byb2Nlc3MpOiB0ZXJtaW5hdGUgc2VudGVuY2Ugd2l0aCBhIHBlcmlvZC4KKwkqIGJyZWFrcG9pbnQuYyAoY2F0Y2hfY29tbWFuZF8xKTogZGl0dG8uCisKKwkqIGMtdmFscHJpbnQuYyAoY192YWx1ZV9wcmludCk6IHJlbW92ZSBoYWNrXjIgZnJvbSBIUDsgaXQgY2F1c2VzCisJdGVzdHN1aXRlIGxvc3NlcyB3aXRoIG5vIHJlYWwgZ2Fpbi4KKworCSogaW5mZXJpb3IuaCAoU1RBUlRfSU5GRVJJT1JfVFJBUFNfRVhQRUNURUQpOiByZXN0b3JlLCBidXQgb25seQorCWlmIHRtLSouaCBoYXNuJ3Qgb3ZlcnJpZGRlbiBkZWZhdWx0IHZhbHVlLgorCisxOTk5LTAxLTA0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogRml4IHdoaXRlc3BhY2UgaW5kZW50YXRpb24gZm9yIC0taGVscC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKKzE5OTktMDEtMDQgIE1hbnVlbCBCb3V5ZXIgPGJvdXllckBhbnRpb2NoZS5saXA2LmZyPgorCisJKiBtYWluLmM6IEFkZCAtLXdyaXRlIGNvbW1hbmQgbGluZSBvcHRpb24sIGRvY3VtZW50IC13LgorCSogZ2RiLjE6IERvY3VtZW50IC0td3JpdGUuCisKKzE5OTktMDEtMDQgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBSZXF1aXJlIGF1dG9jb25mIDIuMTIuMSBvciBoaWdoZXIuCisJKiBkb2MvY29uZmlndXJlLmluOiBEaXR0by4KKwkqIG5sbS9jb25maWd1cmUuaW46IERpdHRvLgorCSogcmRpLXNoYXJlL2NvbmZpZ3VyZS5pbjogRGl0dG8uCisJKiB0ZXN0c3VpdGUvY29uZmlndXJlLmluOiBEaXR0by4KKwkqIGRvYy9NYWtlZmlsZS5pbjogRG9uJ3QgaGFyZGNvZGUgJChTSEVMTCkuCisJKiBubG0vTWFrZWZpbGUuaW46IERpdHRvLgorCSogcmRpLXNoYXJlL01ha2VmaWxlLmluOiBEaXR0by4KKwkqIHRlc3RzdWl0ZS9NYWtlZmlsZS5pbjogRGl0dG8uCisKK01vbiBKYW4gIDQgMTI6NTM6MDMgMTk5OSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiByZW1vdGUtdnguYyAoaW5pdF92eF9vcHMsIGluaXRfdnhfcnVuX29wcyk6IFJlbW92ZSB1bm5lZWRlZAorCWluaXRzIG9mIG5ldyBmaWVsZHMsIGluY2x1ZGluZyByZWYgdG8gYm9ndXMgZmllbGQuCisJKHZ4X29wcywgdnhfcnVuX29wcyk6IE1ha2Ugc3RhdGljLgorCitNb24gSmFuICA0IDE1OjA1OjI5IDE5OTkgIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJKiBpbmZlcmlvci5oIChTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCk6IGRlbGV0ZSwKKwlhbHJlYWR5IGRlZmluZWQgaW4gdG0uaC4KKworCSogaW5mdGFyZy5jOiBjaGFuZ2UgPHN5cy91bmlzdGQuaD4gdG8gPHVuaXN0ZC5oPiBhbmQKKwljb25kaXRpb25hbGl6ZSBpdHMgaW5jbHVzaW9uLgorCSogaW5mdHRyYWNlLmM6IGRpdHRvLgorCitGb3Igb2xkZXIgY2hhbmdlcyBzZWUgQ2hhbmdlTG9nLTk4CisMCitMb2NhbCBWYXJpYWJsZXM6Cittb2RlOiBjaGFuZ2UtbG9nCitsZWZ0LW1hcmdpbjogOAorZmlsbC1jb2x1bW46IDc0Cit2ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCitFbmQ6CmRpZmYgLS1naXQgYS9nZGIvQ2hhbmdlTG9nLTMueCBiL2dkYi9DaGFuZ2VMb2ctMy54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MmFhM2QKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvQ2hhbmdlTG9nLTMueApAQCAtMCwwICsxLDQ4MzggQEAKK1R1ZSBKYW4gMjMgMTU6NDk6NDcgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jIChkZWZpbmVfc3ltYm9sKTogRGVhbCB3aXRoIGRlZnR5cGUgJ1gnLgorCisJKiBjb252ZXgtZGVwLmMgKHdhaXQpOiBNYWtlIGl0IHBpZF90LgorCisJKiBjb252ZXgtZGVwLmMgKGNvbW1fcmVnaXN0ZXJzX2luZm8pOiBhY2NlcHQgZGVjaW1hbCBjb21tIHJlZ2lzdGVyCisJc3BlY2lmaWNhdGlvbiwgYXMgImkgY29tbSAzMjc2OCIuCisKKwkqIGRieHJlYWQuYyAocHJvY2Vzc19vbmVfc3ltYm9sKTogTWFrZSBWQVJJQUJMRVNfSU5TSURFX0JMT0NLCisJbWFjcm8gc2F5IGJ5IGl0c2VsZiB3aGVyZSB2YXJpYWJsZXMgYXJlLiAgUGFzcyBpdCBkZXNjLgorCW0tY29udmV4LmggKFZBUklBQkxFU19JTlNJREVfQkxPQ0spOiBOb256ZXJvIGZvciBuYXRpdmUgY29tcGlsZXIuCisKKwkqIG0tY29udmV4LmggKFNFVF9TVEFDS19MSU1JVF9IVUdFKTogRGVmaW5lLgorCShJR05PUkVfU1lNQk9MKTogVGFrZSBvdXQgI2lmZGVmIE5fTU9OUFQgYW5kIHB1dCBpbiAweGM0LgorCitGcmkgSmFuIDE5IDIwOjA0OjE1IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBhbGJlcnQuYWkubWl0LmVkdSkKKworCSogcHJpbnRjbWQuYyAocHJpbnRfZnJhbWVfYXJncyk6IEFsd2F5cyBzZXQgaGlnaGVzdF9vZmZzZXQgdG8KKwljdXJyZW50X29mZnNldCB3aGVuIGZvcm1lciBpcyAtMS4KKworCSogZGJ4cmVhZC5jIChyZWFkX3N0cnVjdF90eXBlKTogUHJpbnQgbmljZSBlcnJvciBtZXNzYWdlCisJd2hlbiBlbmNvdW50ZXJpbmcgbXVsdGlwbGUgaW5oZXJpdGFuY2UuCisKK1RodSBKYW4gMTggMTM6NDM6MzAgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IG1vbGUuYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIpOiBBbHdheXMgdHJlYXQgTl9GTiBhcyBhIHBvdGVudGlhbAorCXNvdXJjZSBmb3IgYSB4Lm8gb3IgLWx4IHN5bWJvbCwgaWdub3JpbmcgT0ZJTEVfRk5fRkxBR0dFRC4KKworCSogcHJpbnRjbWQuYyAocHJpbnRfZnJhbWVfYXJncyk6IENhc3QgLTEgdG8gKENPUkVfQUREUikuCisKKwkqIGhwMzAwYnNkLWRlcC5jIChfaW5pdGlhbGl6ZV9ocDMwMF9kZXApOiBHZXQga2VybmVsX3VfYWRkci4KKwltLWhwMzAwYnNkLmggKEtFUk5FTF9VX0FERFIpOiBVc2Uga2VybmVsX3VfYWRkci4KKworCSogaW5mY21kLmMgKHJ1bl9jb21tYW5kKTogI2lmIDAgb3V0IGNhbGwgdG8KKwlicmVha3BvaW50X2NsZWFyX2lnbm9yZV9jb3VudHMuCisKK1RodSBKYW4gMTEgMTI6NTg6MTIgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IG1vbGUpCisKKwkqIHByaW50Y21kLmMgKHByaW50X2ZyYW1lX2FyZ3MpIFtTVFJVQ1RfQVJHX1NZTV9HQVJCQUdFXToKKwlUcnkgbG9va2luZyB1cCBuYW1lIG9mIHZhciBiZWZvcmUgZ2l2aW5nIHVwICYgcHJpbnRpbmcgJz8nLgorCitXZWQgSmFuIDEwIDE0OjAwOjE0IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvKQorCisJKiBtYW55IGZpbGVzOiBNb3ZlIHN0ZGlvLmggYmVmb3JlIHBhcmFtLmguCisKKwkqIHN1bjMtZGVwLmMgKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6IE9ubHkgdHJ5IHRvIHdyaXRlIEZQCisJcmVncyAjaWZkZWYgRlAwX1JFR05VTS4KKworTW9uIEphbiAgOCAxNzo1NjoxNSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nbykKKworCSogc3ltdGFiLmM6ICNpZiAwIG91dCAiaW5mbyBtZXRob2RzIiBjb2RlLgorCitTYXQgSmFuICA2IDEyOjMzOjA0IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvKQorCisJKiBkYnhyZWFkLmMgKHJlYWRfc3RydWN0X3R5cGUpOiBTZXQgVFlQRV9ORk5fRklFTERTX1RPVEFMCisJZnJvbSBhbGwgYmFzZWNsYXNzZXM7IHJlbW92ZSB2ZXN0aWdpYWwgdmFyaWFibGUgYmFzZWNsYXNzLgorCisJKiBmaW5kdmFyLmMgKHJlYWRfdmFyX3ZhbHVlKTogQ2hlY2sgUkVHX1NUUlVDVF9IQVNfQUREUi4KKwlwcmludGNtZC5jIChwcmludF9mcmFtZV9hcmdzKTogIENoZWNrIFNUUlVDVF9BUkdfU1lNX0dBUkJBR0UuCisJbS1zcGFyYy5oOiBEZWZpbmUgUkVHX1NUUlVDVF9IQVNfQUREUiBhbmQgU1RSVUNUX0FSR19TWU1fR0FSQkFHRS4KKworCSogYmxvY2tmcmFtZS5jIChnZXRfZnJhbWVfYmxvY2spOiBTdWJ0cmFjdCBvbmUgZnJvbSBwYyBpZiBub3QKKwlpbm5lcm1vc3QgZnJhbWUuCisKK0ZyaSBEZWMgMjkgMTU6MjY6MzMgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBwcmludGNtZC5jIChwcmludF9mcmFtZV9hcmdzKTogY2hlY2sgaGlnaGVzdF9vZmZzZXQgIT0gLTEsIG5vdCBpLgorCitUaHUgRGVjIDI4IDE2OjIxOjAyIDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogdmFsb3BzLmMgKHZhbHVlX3N0cnVjdF9lbHQpOiBDbGVhbiB1cCBlcnJvciBtc2cuCisKKwkqIGJyZWFrcG9pbnQuYyAoZGVzY3JpYmVfb3RoZXJfYnJlYWtwb2ludHMpOgorCURlbGV0ZSBleHRyYSBzcGFjZSBiZWZvcmUgImFsc28gc2V0IGF0IiBhbmQgYWRkIHBlcmlvZCBhdCBlbmQuCisKK1R1ZSBEZWMgMTkgMTA6Mjg6NDIgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28pCisKKwkqIHNvdXJjZS5jIChwcmludF9zb3VyY2VfbGluZXMpOiBUZWxsIHVzZXIgd2hpY2ggbGluZSBudW1iZXIKKwl3YXMgb3V0IG9mIHJhbmdlIHdoZW4gcHJpbnRpbmcgZXJyb3IgbWVzc2FnZS4KKworU3VuIERlYyAxNyAxNDoxNDowOSAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIGJsb2NrZnJhbWUuYyAoZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uKTogVXNlCisJQkxPQ0tfU1RBUlQgKFNZTUJPTF9CTE9DS19WQUxVRSAoZikpIGluc3RlYWQgb2YKKwlTWU1CT0xfVkFMVUUgKGYpIHRvIGdldCBzdGFydCBvZiBmdW5jdGlvbi4KKworCSogZGJ4cmVhZC5jOiBNYWtlIHh4bWFsbG9jIGp1c3QgYSAjZGVmaW5lIGZvciB4bWFsbG9jLgorCitUaHUgRGVjIDE0IDE2OjEzOjE2IDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogbTY4ay1vcGNvZGUuaCAoZnNlcSAmIGZvbGxvd2luZyBmcCBpbnN0cnVjdGlvbnMpOgorCUNoYW5nZSBAIHRvICQuCisKK0ZyaSBEZWMgIDggMTk6MDY6NDQgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBicmVha3BvaW50LmMgKGJyZWFrcG9pbnRfY2xlYXJfaWdub3JlX2NvdW50cyk6IE5ldyBmdW5jdGlvbi4KKwlpbmZjbWQuYyAocnVuX2NvbW1hbmQpOiBDYWxsIGl0LgorCitXZWQgRGVjICA2IDE1OjAzOjM4IDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogdmFscHJpbnQuYzogQ2hhbmdlIGl0IHNvICJhcnJheS1tYXggMCIgbWVhbnMgdGhlcmUgaXMKKwlubyBsaW1pdC4KKworCSogZXhwcmVhZC55ICh5eWxleCk6IENoYW5nZSBlcnJvciBtZXNzYWdlICJpbnZhbGlkIHRva2VuIGluCisJZXhwcmVzc2lvbiIgdG8gImludmFsaWQgY2hhcmFjdGVyICclYycgaW4gZXhwcmVzc2lvbiIuCisKK01vbiBEZWMgIDQgMTY6MTI6NTQgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBibG9ja2ZyYW1lLmMgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbik6IEFsd2F5cyByZXR1cm4gMQorCWZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLCBhbmQgc2V0ICpOQU1FIGFuZCAqQUREUkVTUyB0bworCW1hdGNoIHRoZSByZXR1cm4gdmFsdWUuCisKKwkqIGRieHJlYWQuYyAoc3ltYm9sX2ZpbGVfY29tbWFuZCk6IFVzZSBwZXJyb3Jfd2l0aF9uYW1lIG9uCisJZXJyb3IgZnJvbSBzdGF0LgorCShwc3ltdGFiX3RvX3N5bXRhYiwgYWRkX2ZpbGVfY29tbWFuZCksCisJY29yZS5jICh2YWxpZGF0ZV9maWxlcyksIHNvdXJjZS5jIChmaW5kX3NvdXJjZV9saW5lcyksCisJZGVmYXVsdC1kZXAuYyAoZXhlY19maWxlX2NvbW1hbmQpOiBDaGVjayBmb3IgZXJyb3JzIGZyb20gc3RhdCwKKwlmc3RhdCwgYW5kIG15cmVhZC4KKworRnJpIERlYyAgMSAwNToxNjo0MiAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIHZhbG9wcy5jIChjaGVja19maWVsZCk6IFdoZW4gZm9sbG93aW5nIHBvaW50ZXJzLCBqdXN0IGdldAorCXRoZWlyIHR5cGVzOyBkb24ndCBjYWxsIHZhbHVlX2luZC4KKwkKK1RodSBOb3YgMzAgMTQ6NDU6MjkgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBjb25maWcuZ2RiIChweXIpOiBOZXcgbWFjaGluZS4KKwljb3JlLmMgW1JFR19TVEFDS19TRUdNRU5UXTogTmV3IGNvZGUuCisJZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpOiBDYXN0IHJldHVybiBmcm9tIGNvcHlfcGVuZGluZworCXRvIGxvbmcgYmVmb3JlIGNhc3RpbmcgdG8gZW51bSBuYW1lc3BhY2UuCisJaW5mcnVuLmM6IFNwbGl0IHJlZ2lzdGVyc19pbmZvIGludG8gRE9fUkVHSVNURVJTX0lORk8KKwlhbmQgcmVnaXN0ZXJzX2luZm8uCisJbS1weXIuaCwgcHlyLXtkZXAuYyxvcGNvZGUuaCxwaW5zbi5jfTogTmV3IGZpbGVzLgorCisJKiBocDMwMGJzZC1kZXAuYzogU3RheSBpbiBzeW5jIHdpdGggZGVmYXVsdC1kZXAuYy4KKworCSogbS1ocDMwMGJzZC5oIChJTl9TSUdUUkFNUCk6IERlZmluZS4KKworTW9uIE5vdiAyNyAyMzo0ODoyMSAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBtLXNwYXJjLmggKEVYVFJBQ1RfUkVUVVJOX1ZBTFVFLCBTVE9SRV9SRVRVUk5fVkFMVUUpOgorCVJldHVybiBmbG9hdGluZyBwb2ludCB2YWx1ZXMgaW4gJWYwLgorCitUdWUgTm92IDIxIDAwOjM0OjQ2IDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jIChyZWFkX3R5cGUpOiAjaWYgMCBvdXQgY29kZSB3aGljaCBza2lwcyB0bworCWNvbW1hIGZvbGxvd2luZyB4LXJlZi4KKworU2F0IE5vdiAxOCAyMDoxMDo1NCAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6IFVuZG8gY2hhbmdlcyBvZiBOb3YgMTEgJiAxNi4KKwkocHJpbnRfc3RyaW5nKTogQWRkIHBhcmFtZXRlciBmb3JjZV9lbGxpcHNlcy4KKwkodmFsX3ByaW50KTogUGFzcyBmb3JjZV9lbGxpcHNlcyB0cnVlIHdoZW4gd2Ugc3RvcCBmZXRjaGluZyBzdHJpbmcKKwliZWZvcmUgd2UgZ2V0IHRvIHRoZSBlbmQsIGVsc2UgcGFzcyBmYWxzZS4KKworVGh1IE5vdiAxNiAxMTo1OTo1MCAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIGluZnJ1bi5jIChyZXN0b3JlX2luZmVyaW9yX3N0YXR1cyk6IERvbid0IHRyeSB0byByZXN0b3JlCisJc2VsZWN0ZWQgZnJhbWUgaWYgdGhlIGluZmVyaW9yIG5vIGxvbmdlciBleGlzdHMuCisKKwkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6IFJld3JpdGUgc3RyaW5nIHByaW50aW5nIGNvZGUgbm90IHRvCisJY2FsbCBwcmludF9zdHJpbmcuCisKKwkqIE1ha2VmaWxlLmRpc3QgKGNsZWFuKTogUmVtb3ZlIHhnZGIgYW5kIHhnZGIuby4KKworVHVlIE5vdiAxNCAxMjo0MTo0NyAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIE1ha2VmaWxlLmRpc3QgKFhHREIsIGJpbmRpciwgeGJpbmRpciwgaW5zdGFsbCwgYWxsKTogTmV3IHN0dWZmLgorCitTYXQgTm92IDExIDE1OjI5OjM4IDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogY2hhcnNfdG9fZ2V0OiBOZXcgdmFyaWFibGUuCisKK1RodSBOb3YgIDkgMTI6MzE6NDcgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBtYWluLmMgKG1haW4pOiBQcm9jZXNzICItaGVscCIgYXMgYSBzd2l0Y2ggdGhhdCBkb2Vzbid0CisJdGFrZSBhbiBhcmd1bWVudC4KKworV2VkIE5vdiAgOCAxMzowNzowMiAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIE1ha2VmaWxlLmRpc3QgKGdkYi50YXIuWik6IEFkZCAiZWxzZSB0cnVlIi4KKworVHVlIE5vdiAgNyAxMjoyNToxNCAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIGluZnJ1bi5jIChyZXN0b3JlX2luZmVyaW9yX3N0YXR1cyk6IERvbid0IGRlcmVmZXJlbmNlIGZpZCBpZiBOVUxMLgorCisJKiBjb25maWcuZ2RiIChzdW4zLCBzdW40KTogQWNjZXB0ICJzdW4zIiBhbmQgInN1bjQiLgorCitNb24gTm92ICA2IDA5OjQ5OjIzIDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogTWFrZWZpbGUuZGlzdCAoTWFrZWZpbGUpOiBNb3ZlIGNvbW1lbnRzIGFmdGVyIGNvbW1hbmRzLgorCisJKiAqLWRlcC5jIFtSRUFEX0NPRkZfU1lNVEFCXTogUGFzcyBvcHRpb25hbCBoZWFkZXIgc2l6ZSB0bworCXJlYWRfc2VjdGlvbl9oZHIoKS4KKworCSogaW5mbG93LmM6IEluY2x1ZGUgPGZjbnRsLmg+IHJlZ2FyZGxlc3Mgb2YgVVNHLgorCisJKiBjb2ZmcmVhZC5jIChyZWFkX3NlY3Rpb25faGRyKTogQWRkIG9wdGlvbmFsX2hlYWRlcl9zaXplLgorCShzeW1ib2xfZmlsZV9jb21tYW5kKTogUGFzcyBvcHRpb25hbCBoZWFkZXIgc2l6ZSB0bworCXJlYWRfc2VjdGlvbl9oZHIoKS4KKwkocmVhZF9jb2ZmX3N5bXRhYik6IEluaXRpYWxpemUgZmlsZXN0cmluZy4KKworCSogdmVyc2lvbi5jOiBDaGFuZ2UgdmVyc2lvbiB0byAzLjQueHh4LgorCisJKiBHREIgMy40IHJlbGVhc2VkLgorCitTdW4gTm92ICA1IDExOjM5OjAxIDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogdmVyc2lvbi5jOiBDaGFuZ2UgdmVyc2lvbiB0byAzLjQuCisKKwkqIHN5bXRhYi5jIChkZWNvZGVfbGluZV8xKTogT25seSBza2lwIHBhc3QgInN0cnVjdCIgaWYgaXQKKwlpcyB0aGVyZS4KKworCSogdmFsb3BzLmMgKHZhbHVlX2luZCksIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwLCBjYXNlIFVOT1BfSU5EKToKKwlIYXZlICIqIiA8aW50LXZhbHVlZC1leHA+IHJldHVybiBhbiBpbnQsIG5vdCBhIExPTkdFU1QuCisKKwkqIHV0aWxzLmMgKGZwcmludGZfZmlsdGVyZWQpOiBQYXNzIGFyZ3s0LDUsNn0gdG8gc3ByaW50Zi4KKworCSogcHJpbnRjbWQuYyAoeF9jb21tYW5kKTogVXNlIHZhcmlhYmxlIGl0c2VsZiByYXRoZXIKKwl0aGFuIHRyZWF0aW5nIGl0IGFzIGEgcG9pbnRlciBvbmx5IGlmIGl0IGlzIGEgZnVuY3Rpb24uCisJKFNlZSBjb21tZW50ICJ0aGlzIG1ha2VzIHgvaSBtYWluIHdvcmsiKS4KKworCSogY29mZnJlYWQuYyAoc3ltYm9sX2ZpbGVfY29tbWFuZCk6IFVzZSBlcnJvciBmb3IKKwkiJXMgZG9lcyBub3QgaGF2ZSBhIHN5bWJvbC10YWJsZS5cbiIuCisKK1dlZCBOb3YgIDEgMTk6NTY6MTggMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBkYnhyZWFkLmMgW0JFTElFVkVfUENDX1BST01PVElPTl9UWVBFXTogTmV3IGNvZGUuCisJbS1zcGFyYy5oOiBEZWZpbmUgQkVMSUVWRV9QQ0NfUFJPTU9USU9OX1RZUEUuCisKK1RodSBPY3QgMjYgMTI6NDU6MDAgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBpbmZydW4uYzogSW5jbHVkZSA8c3lzL2Rpci5oPi4KKworCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIsIGNhc2UgTl9MU1lNLCBjYXNlICdUJyk6CisJQ2hlY2sgZm9yIGVudW0gdHlwZXMgYW5kIHB1dCBjb25zdGFudHMgaW4gcHN5bXRhYi4KKworTW9uIE9jdCAyMyAxNTowMjoyNSAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYyAoZGVmaW5lX3N5bWJvbCwgcmVhZF9kYnhfc3ltdGFiKTogSGFuZGxlIGVudW0KKwljb25zdGFudHMgKGUuZy4JImI6Yz1lNiwwIikuCisKK1RodSBPY3QgMTkgMTQ6NTc6MjYgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBzdGFjay5jIChmcmFtZV9pbmZvKTogVXNlIEZSQU1FX0FSR1NfQUREUkVTU19DT1JSRUNUCisJbS12YXguaCAoRlJBTUVfQVJHU19BRERSRVNTX0NPUlJFQ1QpOiBOZXcgbWFjcm8uCisJKEZSQU1FX0FSR1NfQUREUkVTUyk6IFJlc3RvcmUgb2xkIG1lYW5pbmcuCisKKwkqIGZyYW1lLmggKEZyYW1lX3Vua25vd24pOiBOZXcgbWFjcm8uCisJc3RhY2suYyAoZnJhbWVfaW5mbyk6IENoZWNrIGZvciBGcmFtZV91bmtub3duIHJldHVybiBmcm9tCisJRlJBTUVfQVJHU19BRERSRVNTLgorCW0tdmF4LmggKEZSQU1FX0FSR1NfQUREUkVTUyk6IFNvbWV0aW1lcyByZXR1cm4gRnJhbWVfdW5rbm93bi4KKworCSogdXRpbHMuYyAoZmF0YWxfZHVtcF9jb3JlKTogQWRkICJpbnRlcm5hbCBlcnJvciIgdG8gbWVzc2FnZS4KKworCSogaW5mcnVuLmMgKElOX1NJR1RSQU1QKTogTmV3IG1hY3JvLgorCSh3YWl0X2Zvcl9pbmZlcmlvcik6IFVzZSBJTl9TSUdUUkFNUC4KKwltLXZheC5oIChJTl9TSUdUUkFNUCk6IE5ldyBtYWNyby4KKworV2VkIE9jdCAxOCAxNTowOToyMiAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIGNvbmZpZy5nZGIsIE1ha2VmaWxlLmRpc3Q6IFNob3J0ZW4gbS1pMzg2LXN2MzIuaC4KKworCSogY29mZnJlYWQuYyAoc3ltYm9sX2ZpbGVfY29tbWFuZCk6IFBhc3MgMCB0byBzZWxlY3Rfc291cmNlX3N5bXRhYi4KKworVHVlIE9jdCAxNyAxMjoyNDo0MSAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIGkzODYtZGVwLmMgKGkzODZfZnJhbWVfbnVtX2FyZ3MpOiBUYWtlIGZ1bmN0aW9uIGZyb20gbS1pMzg2LmgKKwlmaWxlLiAgQ2hlY2sgZm9yIHBmaSBudWxsLgorCW0taTM4Ni5oIChGUkFNRV9OVU1fQVJHUyk6IFVzZSBpMzg2X2ZyYW1lX251bV9hcmdzLgorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBzZXQgc3RvcF9mdW5jX25hbWUgdG8gMAorCWJlZm9yZSBjYWxsaW5nIGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbi4KKworVGh1IE9jdCAxMiAwMTowODo1MCAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIGJyZWFrcG9pbnQuYyAoX2luaXRpYWxpemVfYnJlYWtwb2ludCk6IEFkZCAiZGlzYSIuCisKKwkqIE1ha2VmaWxlLmRpc3Q6IEFkZCBHTE9CQUxfQ0ZMQUdTIGFuZCBwYXNzIHRvIHJlYWRsaW5lLgorCisJKiBjb25maWcuZ2RiICh2YXJpb3VzKTogIiRtYWNoaW5lID0iIC0+ICJtYWNoaW5lID0iLgorCitXZWQgT2N0IDExIDExOjU0OjMxIDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogaW5mbG93LmMgKHRyeV93cml0aW5nX3JlZ3MpOiAjaWYgMCBvdXQgdGhpcyBmdW5jdGlvbi4KKworCSogbWFpbi5jIChtYWluKTogQWRkICItaGVscCIgb3B0aW9uLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYik6IE1lcmdlIGNvZGUgZm9yIE5fRlVOIHdpdGgKKwlOX1NUU1lNLCBldGMuCisKK01vbiBPY3QgIDkgMTQ6MjE6NTUgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBpbmZsb3cuYyAodHJ5X3dyaXRpbmdfcmVnc19jb21tYW5kKTogRG9uJ3Qgd3JpdGUgcGFzdCBlbmQKKwlvZiBzdHJ1Y3QgdXNlci4KKworCSogZGJ4cmVhZC5jIChyZWFkX3N0cnVjdF90eXBlKTogI2lmIDAgb3V0IGNvZGUgd2hpY2ggY2hlY2tzIGZvcgorCWJpdHBvcyBhbmQgYml0c2l6ZSAwLgorCisJKiBjb25maWcuZ2RiOiBBY2NlcHQgc2VxdWVudC1pMzg2IChub3Qgc2VxMzg2KS4KKwkoc3ltbWV0cnkpOiBTZXQgZGVwZmlsZSBhbmQgcGFyYW1maWxlLgorCisJKiBtLWNvbnZleC5oIChJR05PUkVfU1lNQk9MKTogQ2hlY2sgZm9yIE5fTU9OUFQgaWYgZGVmaW5lZC4KKworVGh1IE9jdCAgNSAxMDoxNDoyNiAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIGRlZmF1bHQtZGVwLmMgKHJlYWRfaW5mZXJpb3JfbWVtb3J5KTogUHV0ICNpZiAwJ2Qgb3V0IGNvbW1lbnQKKwl3aXRoaW4gLyogKi8uCisKK1dlZCBPY3QgIDQgMTg6NDQ6NDEgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogY29uZmlnLmdkYjogQ2hhbmdlIC9kZXYvbnVsbCB0byBtLWkzODYuaCBmb3IgdmFyaW91cworCTM4NiBtYWNoaW5lICJvcGNvZGVmaWxlIiBlbnRyaWVzLgorCisJKiBjb25maWcuZ2RiOiBBY2NlcHQgc2VxMzg2IGZvciBzZXF1ZW50IHN5bW1ldHJ5LgorCitNb24gT2N0ICAyIDA5OjU5OjUwIDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogaHAzMDBic2QtZGVwLmM6ICBGaXggY29weXJpZ2h0IG5vdGljZS4KKworU3VuIE9jdCAgMSAxNjoyNTozMCAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIE1ha2VmaWxlLmRpc3QgKERFUEZJTEVTKTogQWRkIGlzaS1kZXAuYy4KKworCSogZGVmYXVsdC1kZXAuYyAocmVhZF9pbmZlcmlvcl9tZW1vcnkpOiBNb3ZlICNlbmRpZiBhZnRlciBlbHNlLgorCitTYXQgU2VwIDMwIDEyOjUwOjE2IDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogdmVyc2lvbi5jOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMy4zLnh4eC4KKworCSogR0RCIDMuMyByZWxlYXNlZC4KKworCSogdmVyc2lvbi5jOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMy4zLgorCisJKiBNYWtlZmlsZS5kaXN0IChSRUFETElORSk6IEFkZCB2aV9tb2RlLmMKKworCSogY29uZmlnLmdkYiAoaTM4Nik6IENoYW5nZSAvZGV2L251bGwgdG8gbS1pMzg2LmgKKworCSogY29uZmlnLmdkYjogQWRkICc7OycgYmVmb3JlICdlc2FjJy4KKworCSogTWFrZWZpbGUuZGlzdCAoZ2RiLnRhci5aKTogTW92ZSBjb21tZW50IGFib3ZlIGRlcGVuZGVuY3kuCisKKwkqIGRieHJlYWQuYyAocmVhZF9vZmlsZV9zeW10YWIpOiBDaGVjayBzeW1ib2wgYmVmb3JlIHN0YXJ0CisJb2Ygc291cmNlIGZpbGUgZm9yIEdDQ19DT01QSUxFRF9GTEFHX1NZTUJPTC4KKwkoc3RhcnRfc3ltdGFiKTogRG9uJ3QgY2xlYXIgcHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24uCisKK1RodSBTZXAgMjggMjI6MzA6MjMgMTk4OSAgUm9sYW5kIE1jR3JhdGggIChyb2xhbmQgYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIHZhbHByaW50LmMgKHByaW50X3N0cmluZyk6IElmIExFTkdUSCBpcyB6ZXJvLCBwcmludCAiIi4KKworV2VkIFNlcCAyNyAxMDoxNToxMCAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBjb25maWcuZ2RiOiAicm0gdG1wLmMiIC0+ICJybSAtZiB0bXAuYyIuCisKK1R1ZSBTZXAgMjYgMTM6MDI6MTAgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiB1dGlscy5jIChfaW5pdGlhbGl6ZV91dGlscyk6IFVzZSB0ZXJtY2FwIHRvIHNldCBsaW5lc19wZXJfcGFnZQorCWFuZCBjaGFyc19wZXJfbGluZS4KKworTW9uIFNlcCAyNSAxMDowNjo0MyAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiLCBOX1NPTCk6IERvIG5vdCBhZGQgdGhlIHNhbWUgZmlsZQorCW1vcmUgdGhhbiBvbmNlLgorCitUaHUgU2VwIDIxIDEyOjQzOjE4IDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogaW5mY21kLmMgKHVuc2V0X2Vudmlyb25tZW50X2NvbW1hbmQpOiBEZWxldGUgYWxsIHZhcmlhYmxlcworCWlmIGNhbGxlZCB3aXRoIG5vIGFyZy4KKworCSogcmVtb3RlLmMsIGluZmVyaW9yLmggKHJlbW90ZV97cmVhZCx3cml0ZX1faW5mZXJpb3JfbWVtb3J5KToKKwlOZXcgZnVuY3Rpb25zLgorCWNvcmUuYyAoe3JlYWQsd3JpdGV9X21lbW9yeSk6IFVzZSByZW1vdGVfe3JlYWQsd3JpdGV9X2luZmVyaW9yX21lbW9yeS4KKworCSogdmFsb3BzLmMgKGNhbGxfZnVuY3Rpb24pOiBXaGVuIHJlc2VydmluZyBzdGFjayBzcGFjZSBmb3IKKwlhcmd1bWVudHMsIGNhbGwgdmFsdWVfYXJnX2NvZXJjZS4KKworCSogbS1ocDlrMzIwLmg6IGRlZmluZSBCUk9LRU5fTEFSR0VfQUxMT0NBLgorCisJKiBicmVha3BvaW50LmMgKGRlbGV0ZV9jb21tYW5kKTogQXNrIGZvciBjb25maXJtYXRpb24gb25seQorCXdoZW4gdGhlcmUgYXJlIGJyZWFrcG9pbnRzLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfc3RydWN0X3R5cGUpOiBJZiBsb29rdXBfYmFzZXR5cGVfdHlwZSBoYXMKKwljb3BpZWQgYSBzdHViIHR5cGUsIGNhbGwgYWRkX3VuZGVmaW5lZF90eXBlLgorCisJKiBzcGFyY19waW5zbi5jIChjb21wYXJlX29wY29kZXMpOiBDaGVjayBmb3IgIjEraSIgYW55d2hlcmUKKwlpbiBhcmdzLgorCisJKiB2YWxfcHJpbnQuYyAodHlwZV9wcmludF9iYXNlKTogUHJpbnQgc3R1YiB0eXBlcyBhcworCSI8aW5jb21wbGV0ZSB0eXBlPiIuCisKK1dlZCBTZXAgMjAgMDc6MzI6MDAgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBzcGFyYy1vcGNvZGUuaCAoc3dhcGEpOiBSZW1vdmUgaSBiaXQgZnJvbSBtYXRjaC4KKwkoYWxsIGFsdGVybmF0ZSBzcGFjZSBpbnN0cnVjdGlvbnMpOiBEZWxldGUgc3VycGx1cyAiZm9vIHJzMSswIgorCXBhdHRlcm5zLgorCisJKiBNYWtlZmlsZS5kaXN0IChMREZMQUdTKTogU2V0IHRvICQoQ0ZMQUdTKS4KKworCSogcmVtb3RlLW11bHRpLnNoYXIgKHJlbW90ZV91dGlscy5jLCBwdXRwa3QpOiBDaGFuZ2UgY3N1bSB0byB1bnNpZ25lZC4KKworVHVlIFNlcCAxOSAxNDoxNToxNiAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBzcGFyYy1vcGNvZGUuaDogU2V0IGkgYml0IGluIGxvc2UgZm9yIG1hbnkgaW5zdHJ1Y3Rpb25zIHdoaWNoCisJYXJlbid0IGltbWVkaWF0ZS4KKworCSogc3RhY2suYyAocHJpbnRfZnJhbWVfaW5mbyk6IGFkZCAiZnVuYyA9IDAiLgorCitNb24gU2VwIDE4IDE2OjE5OjQ4IDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogc3BhcmMtb3Bjb2RlLmggKG1vdik6IEFkZCBtb3YgdG8vZnJvbSAldGJyLCAlcHNyLCAld2ltLgorCisJKiBzcGFyYy1vcGNvZGUuaCAocmV0dCk6IEZpeCBub3RhdGlvbiB0byB1c2Ugc3VnZ2VzdGVkIGFzc2VtYmxlcgorCXN5bnRheCBmcm9tIGFyY2hpdGVjdHVyZSBtYW51YWwuCisKKwkqIHN5bW1ldHJ5LWRlcC5jIChJMzg2X1JFR05PX1RPX1NZTU1FVFJZKTogTmV3IG1hY3JvLgorCShpMzg2X2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyk6IFVzZSBJMzg2X1JFR05PX1RPX1NZTU1FVFJZLgorCitTYXQgU2VwIDE2IDIyOjIxOjE3IDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBzcGlmZikKKworCSogcmVtb3RlLmMgKHJlbW90ZV9jbG9zZSk6IFNldCByZW1vdGVfZGVzYyB0byAtMS4KKworCSogZ2RiLnRleGluZm8gKE91dHB1dCk6IEZpeCBkZXNjcmlwdGlvbiBvZiBlY2hvIHRvIG1hdGNoCisJcmVhbGl0eSBhbmQgQU5TSSBDLgorCitGcmkgU2VwIDE1IDE0OjI4OjU5IDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIHN5bXRhYi5jIChsb29rdXBfc3ltYm9sKTogQWRkIGNvbW1lbnQgYWJvdXQgImFzbSIuCisKKwkqIHNwYXJjLXBpbnNuLmM6IFVzZSBOVU1PUENPREVTLgorCisJKiBzcGFyYy1vcGNvZGUuaCAoTlVNT1BDT0RFUyk6IFVzZSBzcGFyY19vcGNvZGVzWzBdIG5vdCAqc3BhcmNfb3Bjb2Rlcy4KKworVGh1IFNlcCAxNCAxNToyNToyMCAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBkYnhyZWFkLmMgKHh4bWFsbG9jKTogUHJpbnQgZXJyb3IgbWVzc2FnZSBiZWZvcmUgY2FsbGluZyBhYm9ydCgpLgorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBDaGVjayBmb3Ige3N0b3AscHJldn1fZnVuY19uYW1lCisJbnVsbCBiZWZvcmUgcGFzc2luZyB0byBzdHJjbXAuCisKK1dlZCBTZXAgMTMgMTI6MzQ6MTUgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBzcGFyYy1vcGNvZGUuaDogTmV3IGZpZWxkIGRlbGF5ZWQuCisJc3BhcmMtcGluc24uYyAoaXNfZGVsYXllZF9icmFuY2gpOiBOZXcgZnVuY3Rpb24uCisJKHByaW50X2luc24pOiBDaGVjayBmb3IgZGVsYXllZCBicmFuY2hlcy4KKworCSogc3RhY2suYyAocHJpbnRfZnJhbWVfaW5mbyk6IFVzZSBtaXNjX2Z1bmN0aW9uX3ZlY3RvciBpbgorCWNhc2Ugd2hlcmUgYXIgdHJ1bmNhdGVzIGZpbGUgbmFtZXMuCisKK1R1ZSBTZXAgMTIgMDA6MTY6MTQgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBjb252ZXgtZGVwLmMgKHBzd19pbmZvKTogTW92ZSAic3RydWN0IHBzd2JpdCAqcCIgd2l0aCBkZWNsYXJhdGlvbnMuCisKK01vbiBTZXAgMTEgMTQ6NTk6NTcgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHNwaWZmKQorCisJKiBjb252ZXgtZGVwLmMgKGNvcmVfZmlsZV9jb21tYW5kKTogRGVsZXRlIHJlZHVuZGFudCBwcmludGluZworCW9mICJQcm9ncmFtICVzIi4KKworCSogbS1jb252ZXguaCAoRU5UUllfUE9JTlQpOiBOZXcgbWFjcm8uCisKKwkqIG0tY29udmV4LmggKEZSQU1FX0NIQUlOX1ZBTElEKTogQ2hhbmdlIG91dHNpZGVfZmlyc3Rfb2JqZWN0X2ZpbGUKKwl0byBvdXRzaWRlX3N0YXJ0dXBfZmlsZQorCisJKiBtYWluLmM6ICNpZiAwIG91dCBjYXRjaF90ZXJtaW5hdGlvbiBhbmQgcmVsYXRlZCBjb2RlLgorCisJKiBjb21tYW5kLmMgKGxvb2t1cF9jbWRfMSk6IENvbnNpZGVyIHVuZGVyc2NvcmVzIHBhcnQgb2YKKwljb21tYW5kIG5hbWVzLgorCitTdW4gU2VwIDEwIDA5OjIwOjEyIDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogcHJpbnRjbWQuYzogQ2hhbmdlIGFzZHVtcF9jb21tYW5kIHRvIGRpc2Fzc2VtYmxlX2NvbW1hbmQKKwkoX2luaXRpYWxpemVfcHJpbnRjbWQpOiBDaGFuZ2UgYXNkdW1wIHRvIGRpYXNzZW1ibGUuCisKKwkqIG1haW4uYyAobWFpbik6IEV4aXQgd2l0aCBjb2RlIDAgaWYgd2UgaGl0IHRoZSBlbmQgb2YgYSBiYXRjaAorCWZpbGUuCisKKwkqIE1ha2VmaWxlLmRpc3QgKGxpYnJlYWRsaW5lLmEpOiBGaXggc3ludGF4IG9mICJDQz0ke0NDfSIuCisKK1NhdCBTZXAgIDkgMDE6MDc6MTggMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogdmFsdWVzLmMgKGhpc3RvcnlfaW5mbyk6IFJlbmFtZWQgdG8gdmFsdWVfaGlzdG9yeV9pbmZvLgorCUNvbW1hbmQgcmVuYW1lZCB0byAiaW5mbyB2YWx1ZSIgKHdpdGggImluZm8gaGlzdG9yeSIgc3RpbGwKKwlhY2NlcHRlZCkuCisKKwkqIHNwYXJjLXBpbnNuLmMgKHByaW50X2luc24pOiBFeHRlbmQgc3ltYm9saWMgYWRkcmVzcyBwcmludGluZworCXRvIGNvdmVyICJzZXRoaSIgZm9sbG93aW5nIGJ5IGFuIGluc24gd2hpY2ggdXNlcyAxK2kuCisKK0ZyaSBTZXAgIDggMTQ6MjQ6MDEgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBtLWhwOWszMjAuaCwgbS1ocDMwMGJzZC5oLCBtLWFsdG9zLmgsIG0tc3BhcmMuaCwgbS1zdW4zLmgKKwkoUkVBRF9HREJfU1lNU0VHUyk6IFJlbW92ZS4KKwlkYnhyZWFkLmMgW1JFQURfR0RCX1NZTVNFR1NdOiBSZW1vdmUgY29kZSB0byByZWFkIHN5bXNlZ3MuCisKKwkqIHNwYXJjLXBpbnNuLmMgKHByaW50X2luc24pOiBEZXRlY3QgInNldGhpLW9yIiBwYWlycyBhbmQKKwlwcmludCBzeW1ib2xpYyBhZGRyZXNzLgorCisJKiBzcGFyYy1vcGNvZGUuaCAoc2V0aGksIHNldCk6IENoYW5nZSBsb3NlIGZyb20gMHhjMDAwMDAwMCB0bworCTB4YzBjMDAwMDAwMDAuIAorCisJKiByZW1vdGUuYyAocmVtb3RlX2Rlc2MpOiBJbml0aWFsaXplIHRvIC0xLgorCisJKiBNYWtlZmlsZS5kaXN0IChsaWJyZWFkbGluZS5hKTogUGFzcyBDQz0nJHtDQ30nIHRvIHJlYWRsaW5lIG1ha2VmaWxlLgorCitUaHUgU2VwICA3IDAwOjA3OjE3IDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYyAocmVhZF9zdHJ1Y3RfdHlwZSk6IENoZWNrIGZvciBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucy4KKwl2YWx1ZXMuYywgZXZhbC5jLCB2YWxhcml0aC5jLCB2YWxwcmludC5jLCB2YWxvcHMuYzogTWVyZ2UgY2hhbmdlcworCWZyb20gVGllbWFubiBmb3Igc3RhdGljIG1lbWJlciBmdW5jdGlvbnMuCisKKwkqIHNwYXJjLW9wY29kZS5oICh0c3QpOiBGaXggYWxsIDMgcGF0dGVybnMuCisKKwkqIE1ha2VmaWxlLmRpc3QgKGdkYjEpOiBOZXcgcnVsZS4KKworCSogc3BhcmMtb3Bjb2RlLmg6IENoYW5nZSBjb21tZW50IGFib3V0IHdoYXQgdGhlIGRpc2Fzc2VtYmxlcgorCWRvZXMgd2l0aCB0aGUgb3JkZXIgb2YgdGhlIG9wY29kZXMuCisKKwkqIHNwYXJjLXBpbnNuLmMgKGNvbXBhcmVfb3Bjb2Rlcyk6IFB1dCAxK2kgYmVmb3JlIGkrMS4KKwlBbHNvIGZpeCBtaXN0YWtlbiBjb21tZW50IGFib3V0IHByZXNlcnZpbmcgb3JkZXIgb2Ygb3JpZ2luYWwgdGFibGUuCisKKwkqIHNwYXJjLW9wY29kZS5oIChjbHIsIG1vdik6IEZpeCBpbmNvcnJlY3QgbG9zZSBlbnRyaWVzLgorCisJKiBtLXN5bW1ldHJ5LmggKEZSQU1FX05VTV9BUkdTKTogQWRkIGNoZWNrIHRvIGRlYWwgd2l0aCBjb2RlIHRoYXQKKwlHQ0Mgc29tZXRpbWVzIGdlbmVyYXRlcy4KKworCSogY29uZmlnLmdkYjogQ2hhbmdlIGFsbCBvY2N1cmFuY2VzIG9mICJza2lwIiB0byAiL2Rldi9udWxsIi4KKworCSogUkVBRE1FIChhYm91dCBsYW5ndWFnZXMgb3RoZXIgdGhhbiBDKTogVXBkYXRlIGNvbW1lbnRzIGFib3V0CisJUGFzY2FsIGFuZCBGT1JUUkFOLgorCisJKiBzcGFyYy1vcGNvZGUuaCAobm9wKTogQ2hhbmdlIGxvc2UgZnJvbSAweGFlM2ZmZmZmIHRvIDB4ZmUzZmZmZmYuCisKKwkqIHZhbHVlcy5jICh2YWx1ZV92aXJ0dWFsX2ZuX2ZpZWxkKTogI2lmIDAtb3V0IGFzc2lnbm1lbnQgdG8KKwlWQUxVRV9UWVBFKHZ0YmwpLgorCitXZWQgU2VwICA2IDEyOjE5OjIyIDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogdXRpbHMuYyAoZmF0YWxfZHVtcF9jb3JlKTogTmV3IGZ1bmN0aW9uLgorCU1ha2VmaWxlLmRpc3QgKE1BTExPQ19GTEFHUyk6IHVzZSAtRGJvdGNoPWZhdGFsX2R1bXBfY29yZQorCitUdWUgU2VwICA1IDE1OjQ3OjE4IDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogYnJlYWtwb2ludC5jIChlbmFibGVfY29tbWFuZCk6IFdpdGggbm8gYXJnLCBlbmFibGUgYWxsIGJrcHRzLgorCisJKiBNYWtlZmlsZS5kaXN0IChNYWtlZmlsZSk6IFJlbW92ZSBcIidzIGFyb3VuZCAkKE1EKS4KKworCSogTWFrZWZpbGUuZGlzdDogSW4gImNkIHJlYWRsaW5lOyBtYWtlIC4gLiAuIiBjaGFuZ2UgZmlyc3QKKwlTWVNWX0RFRklORSB0byBTWVNWLgorCisJKiBtNjhrLXBpbnNuLmMgKF9pbml0aWFsaXplX3BpbnNuKTogVXNlIGFsdGVybmF0ZSBhc3NlbWJsZXIKKwlzeW50YXggI2lmZGVmIEhQVVhfQVNNCisKK1NhdCBTZXAgIDIgMjM6MjQ6NDMgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogdmFsdWVzLmMgKGhpc3RvcnlfaW5mbyk6IERvbid0IGNoZWNrIG51bV9leHBbMF0gaWYgbnVtX2V4cAorCWlzIG5pbCAoanVzdCBsaWtlIHJlY2VudCBlZGl0aW5nX2luZm8gY2hhbmdlKS4KKworRnJpIFNlcCAgMSAxOToxOTowMSAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBnZGIudGV4aW5mbyAoaW5jLWhpc3RvcnksIGluYy1yZWFkbGluZSk6IENvcHkgaW4gdGhlIGluYy0qIGZpbGVzCisJYmVjYXVzZSBwZW9wbGUgbWlnaHQgbm90IGhhdmUgbWFrZWluZm8uCisKKwkqIFJFQURNRSAoeGdkYik6IFN0cmVuZ3RoZW4gbmFzdHkgY29tbWVudHMuCisKKwkqIGdkYi50ZXhpbmZvOiBDaGFuZ2UgQHNldGZpbGVuYW1lIHRvICJnZGIuaW5mbyIuCisKK1RodSBBdWcgMzEgMTc6MjM6NTAgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogbWFpbi5jIChlZGl0aW5nX2luZm8pOiBEb24ndCBjaGVjayBhcmdbMF0gaWYgYXJnIGlzIG51bGwuCisKKwkqIG0tdmF4Lmg6IEFkZCBjb21tZW50IGFib3V0IGtub3duIHNpZ3RyYW1wIGJ1Zy4KKworCSogc3VuMy1kZXAuYywgc3BhcmMtZGVwLmMgKElTX09CSkVDVF9GSUxFLCBleGVjX2ZpbGVfY29tbWFuZCk6CisJR2V0IHJpZ2h0IHRleHQgJiBkYXRhIGFkZHJlc3NlcyBmb3IgLm8gZmlsZXMuCisKK1dlZCBBdWcgMzAgMTM6NTQ6MTkgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiB1dGlscy5jICh0aWxkZV9leHBhbmQpOiBSZW1vdmUgZnVuY3Rpb24gKGl0J3MgaW4gcmVhZGxpbmUpLgorCisJKiBzcGFyYy1vcGNvZGUuaCAoY2FsbCk6IENoYW5nZSAiOCIgdG8gIjkiIGluIGZpcnN0IHR3bworCXBhdHRlcm5zICglZzctPiVvNykuCisKK1R1ZSBBdWcgMjkgMTY6NDQ6NDEgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBwcmludGNtZC5jICh3aGF0aXNfY29tbWFuZCk6IENoYW5nZSA0dGggYXJnIHRvIHR5cGVfcHJpbnQKKwlmcm9tIDEgdG8gLTEuCisKK01vbiBBdWcgMjggMTI6MjI6NDEgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBkYnhyZWFkLmMgKHBzeW10YWJfdG9fc3ltdGFiXzEpOiBJbiAiYW5kICVzIC4uLiIgY2hhbmdlCisJcHN0LT5maWxlbmFtZSB0byBwc3QtPmRlcGVuZGVuY2llc1tpXS0+ZmlsZW5hbWUuCisKKwkqIGJsb2NrZnJhbWUuYyAoRlJBTUVMRVNTX0xPT0tfRk9SX1BST0xPR1VFKTogTmV3IG1hY3JvCisJbWFkZSBmcm9tIEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OIGZyb20gbS1zdW4zLmggZXhjZXB0CisJdGhhdCBpdCBjaGVja3MgZm9yIHplcm8gcmV0dXJuIGZyb20gZ2V0X3BjX2Z1bmN0aW9uX3N0YXJ0LgorCW0taHA5azMyMC5oLCBtLWhwMzAwYnNkLmgsIG0taTM4Ni5oLCBtLWlzaS5oLCBtLWFsdG9zLmgsCisJbS1uZXdzLmgsIG0tc3BhcmMuaCwgbS1zdW4yLmgsIG0tc3VuMy5oLCBtLXN5bW1ldHJ5LmgKKwkoRlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT04pOiBVc2UgRlJBTUVMRVNTX0xPT0tfRk9SX1BST0xPR1VFLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfc3RydWN0X3R5cGUpOiBHaXZlIHdhcm5pbmcgYW5kIGlnbm9yZSBmaWVsZAorCWlmIGJpdHBvcyBhbmQgYml0c2l6ZSBhcmUgemVyby4KKworU3VuIEF1ZyAyNyAwNDo1NToyMCAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBkYnhyZWFkLmMgKHBzeW10YWJfdG9fc3ltdGFieyxfMX0pOiBQcmludCBtZXNzYWdlIGFib3V0CisJcmVhZGluZyBpbiBzeW1ib2xzIGJlZm9yZSByZWFkaW5nIHN0cmluZ3RhYiwgbm90IGFmdGVyLgorCitTYXQgQXVnIDI2IDAyOjAxOjUzIDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jIChJU19PQkpFQ1RfRklMRSwgQUREUl9PRl9URVhUX1NFR01FTlQpOiBOZXcgbWFjcm9zLgorCShyZWFkX2RieF9zeW10YWIpOiBVc2UgdGV4dF9hZGRyICYgdGV4dF9zaXplIHRvIHNldCBlbmRfb2ZfdGV4dF9hZGRyLgorCShzeW1ib2xfZmlsZV9jb21tYW5kKTogcGFzcyB0ZXh0X2FkZHIgJiB0ZXh0X3NpemUgdG8gcmVhZF9kYnhfc3ltdGFiLgorCitGcmkgQXVnIDI1IDIzOjA4OjEzIDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogdmFscHJpbnQuYyAodmFsdWVfcHJpbnQpOiBUcnkgdG8gZ2l2ZSB0aGUgbmFtZSBvZiBmdW5jdGlvbgorCXBvaW50ZWQgdG8gd2hlbiBwcmludGluZyBhIGZ1bmN0aW9uIHBvaW50ZXIuCisKK1RodSBBdWcgMjQgMjM6MTg6NDAgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBjb3JlLmMgKHhmZXJfY29yZV9maWxlKTogSW4gY2FzZXMgd2hlcmUgTUVNQUREUiBpcyBhYm92ZSB0aGUKKwlsYXJnZXN0IGFkZHJlc3MgdGhhdCBtYWtlcyBzZW5zZSwgc2V0IGkgdG8gbGVuLgorCitUaHUgQXVnIDI0IDE2OjA0OjE3IDE5ODkgIFJvbGFuZCBNY0dyYXRoICAocm9sYW5kIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiB2YWxwcmludC5jIChwcmludF9zdHJpbmcpOiBOZXcgZnVuY3Rpb24gdG8gcHJpbnQgYSBjaGFyYWN0ZXIKKwlzdHJpbmcsIGRvaW5nIGFycmF5LW1heCBsaW1pdGluZyBhbmQgcmVwZWF0IGNvdW50IHByb2Nlc3NpbmcuCisJKHZhbF9wcmludCwgdmFsdWVfcHJpbnQpOiBVc2UgcHJpbnRfc3RyaW5nLgorCShSRVBFQVRfQ09VTlRfVEhSRVNIT0xEKTogTmV3ICNkZWZpbmUsIHRoZSBtYXggbnVtYmVyIG9mIGVsdHMgdG8gcHJpbnQKKwl3aXRob3V0IHVzaW5nIGEgcmVwZWF0IGNvdW50LiAgU2V0IHRvIHRlbi4KKwkodmFsdWVfcHJpbnQsIHZhbF9wcmludCk6IFVzZSBSRVBFQVRfQ09VTlRfVEhSRVNIT0xELgorCisJKiB1dGlscy5jIChwcmludGNoYXIpOiBVc2Uge2ZwdXRzLGZwcmludGZ9X2ZpbHRlcmVkLgorCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnQpOiBQYXNzIHRoZSByZXBlYXQgY291bnQgYXJnIHRvIHRoZQorCWZwcmludGZfZmlsdGVyZWQgY2FsbCBmb3IgIjxyZXBlYXRzIE4gdGltZXM+IiBtZXNzYWdlcy4KKworV2VkIEF1ZyAyMyAyMjo1Mzo0NyAxOTg5ICBSb2xhbmQgTWNHcmF0aCAgKHJvbGFuZCBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogdXRpbHMuYzogSW5jbHVkZSA8cHdkLmg+LgorCisJKiBtYWluLmM6IERlY2xhcmUgZnJlZS4KKworV2VkIEF1ZyAyMyAwNTowNTo1OSAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiB1dGlscy5jLCBkZWZzLmg6IEFkZCB0aWxkZV9leHBhbmQuCisJc291cmNlLmMgKGRpcmVjdG9yeV9jb21tYW5kKSwKKwltYWluLmMgKGNkX2NvbW1hbmQpLAorCW1haW4uYyAoc2V0X2hpc3RvcnlfZmlsZW5hbWUpLAorCWRieHJlYWQuYyAoc3ltYm9sX2ZpbGVfY29tbWFuZCksCisJY29mZnJlYWQuYyAoc3ltYm9sX2ZpbGVfY29tbWFuZCksCisJZGJ4cmVhZC5jIChhZGRfZmlsZV9jb21tYW5kKSwKKwlzeW1taXNjLmMgKHByaW50X3N5bXRhYnMpLAorCSotZGVwLmMgKGV4ZWNfZmlsZV9jb21tYW5kLCBjb3JlX2ZpbGVfY29tbWFuZCksCisJbWFpbi5jIChzb3VyY2VfY29tbWFuZCk6IFVzZSB0aWxkZV9leHBhbmQuCisKKwkqIGRieHJlYWQuYyAocmVhZF90eXBlKTogV2hlbiB3ZSBnZXQgYSBjcm9zcy1yZWZlcmVuY2UsIHJlc29sdmUKKwlpdCBpbW1lZGlhdGVseSBpZiBwb3NzaWJsZSwgb25seSBjYWxsaW5nIGFkZF91bmRlZmluZWRfdHlwZSBpZgorCW5lY2Vzc2FyeS4KKworCSogZ2RiLnRleGluZm86IFVuY29tbWVudCBAaW5jbHVkZXMgYW5kIHB1dCBjb21tZW50IGF0IHN0YXJ0CisJb2YgZmlsZSB0ZWxsaW5nIHBlb3BsZSB0byB1c2UgbWFrZWluZm8uCisKKwkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfYmFzZSk6IFByaW50IHRoZSByaWdodCB0aGluZyBmb3IKKwliaXRmaWVsZHMuCisKKwkqIGNvbmZpZy5nZGIgKHN1bjNvczMpOiBTZXQgcGFyYW1maWxlIGFuZCBkZXBmaWxlLgorCitUdWUgQXVnIDIyIDA1OjM4OjM2IDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogIFBhc3Mgc3RyaW5nIHRhYmxlIHNpemUgdG8KKwlyZWFkX2RieF9zeW10YWIoKS4KKwkocmVhZF9kYnhfc3ltdGFiKTogQmVmb3JlIGluZGV4aW5nIGludG8gc3RyaW5nIHRhYmxlLCBjaGVjaworCXN0cmluZyB0YWJsZSBpbmRleCBmb3IgcmVhc29uYWJsZW5lc3MuCisJKHBzeW10YWJfdG9fc3ltdGFieyxfMX0sIHJlYWRfb2ZpbGVfc3ltdGFiKTogU2FtZS4KKworVHVlIEF1ZyAyMiAwNDowNDozOSAxOTg5ICBSb2xhbmQgTWNHcmF0aCAgKHJvbGFuZCBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogbTY4ay1waW5zbi5jOiBSZXBsYWNlZCBtYW55IGNhbGxzIHRvIGZwcmludGYgYW5kIGZwdXRzIHdpdGgKKwljYWxscyB0byBmcHJpbnRmX2ZpbHRlcmVkIGFuZCBmcHV0c19maWx0ZXJlZC4KKwkocHJpbnRfaW5zbl9hcmcpOiBVc2Ugbm9ybWFsIE1JVCA2OGsgc3ludGF4IGZvciBwb3N0aW5jcmVtZW50LAorCXByZWRlY3JlbWVudCwgYW5kIHJlZ2lzdGVyIGluZGlyZWN0IGFkZHJlc3NpbmcgbW9kZXMuCisKK01vbiBBdWcgMjEgMTA6MDg6MDIgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBtYWluLmMgKGluaXRpYWxpemVfc2lnbmFscyk6IFNldCBzaWduYWwgaGFuZGxlciBmb3IgU0lHUVVJVAorCWFuZCBTSUdIVVAgdG8gZG9fbm90aGluZy4KKworCSogbnMzMmstb3Bjb2RlLmggKG9yZCk6IENoYW5nZSAxRDFEIHRvIDFEMkQuCisKKwkqIG5zMzJrLXBpbnNuLmMgKHByaW50X2luc25fYXJnLCBwcmludF9pbnNuKTogSGFuZGxlIGluZGV4CisJYnl0ZXMgY29ycmVjdGx5LgorCisJKiBuczMyay1vcGNvZGUuaDogQWRkIGNvbW1lbnRzLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfdHlwZSk6IFB1dCBlbnVtIGZpZWxkcyBpbiB0eXBlLmZpZWxkcyBpbiBvcmRlcgorCXRoYXQgdGhleSB3ZXJlIGZvdW5kIGluIHRoZSBkZWJ1Z2dpbmcgc3ltYm9scyAobm90IHJldmVyc2Ugb3JkZXIpLgorCitTdW4gQXVnIDIwIDIxOjE3OjEzIDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogbWFpbi5jIChzb3VyY2VfY29tbWFuZCk6IFJlYWQgLmdkYmluaXQgaWYgcnVuIHdpdGhvdXQgYXJndW1lbnQuCisKKwkqIHNvdXJjZS5jIChkaXJlY3RvcnlfY29tbWFuZCk6IE9ubHkgcHJpbnQgImZvbyBhbHJlYWR5IGluIHBhdGgiCisJaWYgZnJvbV90dHkuCisKKwkqIHZlcnNpb24uYzogQ2hhbmdlIHZlcnNpb24gbnVtYmVyIHRvIDMuMi54eHgKKworU2F0IEF1ZyAxOSAwMDoyNDowOCAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBtLW5ld3MuaDogRGVmaW5lIEhBVkVfV0FJVF9TVFJVQ1QuCisKKwkqIG0taXNpLmgsIGlzaS1kZXAuYzogUmVwbGFjZSB3aXRoIG5ldyB2ZXJzaW9uIGZyb20gQWRhbSBkZSBCb29yLgorCWNvbmZpZy5nZGI6IFJlbW92ZSBpc2lic2Q0My4KKworCSogbWFpbi5jIChjYXRjaF90ZXJtaW5hdGlvbik6IERvbid0IHNheSB3ZSBoYXZlIHdyaXR0ZW4KKwkuZ2RiX2hpc3RvcnkgdW50aWwgYWZ0ZXIgd2UgcmVhbGx5IGhhdmUuCisKKwkqIGNvbnZleC1kZXAuYyAoYXR0YWNoKTogQWRkICJzbGVlcCAoMSkiLgorCSh3cml0ZV92ZWN0b3JfcmVnaXN0ZXIpOiBVc2UgIkxMIiB3aXRoIGxvbmcgbG9uZyBjb25zdGFudC4KKwkod2FpdCk6IENsb3NlIGNvbW1lbnQuCisJKHdhaXQpOiBDaGFuZ2UgInVuaXggNy4xIGJ1ZyIgdG8gInVuaXggNy4xIGZlYXR1cmUiICYgcmVsYXRlZAorCWNoYW5nZXMgaW4gY29tbWVudC4KKwkoc2Nhbl9zdGFjayk6IEFuZCBmcCB3aXRoIDB4ODAwMDAwMDAgaW4gd2hpbGUgbG9vcCB0ZXN0LgorCShjb3JlX2ZpbGVfY29tbWFuZCk6IE1vdmUgY29kZSB0byBzZXQgQ09SRUZJTEUuCisJKG1hbnkgcGxhY2VzKTogQ2hhbmdlIHByaW50ZiB0byBwcmludGZfZmlsdGVyZWQuCisJKHBzd19pbmZvKTogQWxsb3cgYXJndW1lbnQgZ2l2aW5nIHZhbHVlIHRvIHByaW50IGFzIGEgcHN3LgorCShfaW5pdGlhbGl6ZV9jb252ZXhfZGVwKTogVXBkYXRlIGRvY3N0cmluZ3MuCisKKwkqIG0tY29udmV4LmggKFdPUkRTX0JJR19FTkRJQU4pOiBDb3JyZWN0IHR5cG8gKCJXUk9EUyIpCisJZGVmaW5lIE5PX1NJR0lOVEVSUlVQVC4KKwlkZWZpbmUgU0VUX1NUQUNLX0xJTUlUX0hVR0UuCisJYWRkICJ1bmRlZiBCVUlMVElOX1RZUEVfTE9OR0VTVCIgYmVmb3JlIGRlZmluaW5nIGl0LgorCVVzZSAiTEwiIGFmdGVyIGNvbnN0YW50cyBpbiBDQUxMX0RVTU1ZLgorCisJKiBkYnhyZWFkLmM6IEluIHRoZSAzIHBsYWNlcyBpdCBzYXlzIGVycm9yICJyaWRpY3Vsb3VzIHN0cmluZworCXRhYmxlIHNpemUiLi4uIGRlbGV0ZSBleHRyYSBwYXJhbWV0ZXIgdG8gZXJyb3IuCisKKwkqIGRieHJlYWQuYyAoc2Nhbl9maWxlX2dsb2JhbHMpOiBDaGVjayBmb3IgRk9SVFJBTiBjb21tb24gYmxvY2suCisJQWxsb3cgbXVsdGlwbGUgcmVmZXJlbmNlcyBmb3IgdGhlIHNha2Ugb2YgY29tbW9uIGJsb2Nrcy4KKworCSogbWFpbi5jIChpbml0aWFsaXplX21haW4pOiBTZXQgaGlzdG9yeV9maWxlbmFtZSB0byBpbmNsdWRlCisJY3VycmVudCBkaXJlY3RvcnkuCisKKwkqIHZhbHByaW50LmMgKGRlY29kZV9mb3JtYXQpOiBEb24ndCByZXR1cm4gYSBkZWZhdWx0ZWQgc2l6ZQorCWZpZWxkIGlmIG9zaXplIGlzIHplcm8uCisKKwkqIGdkYi50ZXhpbmZvIChDb21waWxhdGlvbik6IFVwZGF0ZSBpbmZvcm1hdGlvbiBvbiAtZ2cgc3ltYm9scy4KKwlEb2N1bWVudCBwcm9ibGVtIHdpdGggYXIuCisKK0ZyaSBBdWcgMTggMTk6NDU6MjAgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogdmFscHJpbnQuYyAodmFsX3ByaW50LCB2YWx1ZV9wcmludCk6IEFkZCAiPHJlcGVhdHMgJWQgdGltZXM+IiBjb2RlLgorCUFsc28gcHV0ICIuLi4iIG91dHNpZGUgcXVvdGVzIGZvciBzdHJpbmdzLgorCisJKiBtYWluLmMgKGluaXRpYWxpemVfbWFpbik6IEFkZCBjb21tZW50IGFib3V0IGhpc3Rvcnkgb3V0cHV0IGZpbGUKKwliZWluZyBkaWZmZXJlbnQgZnJvbSBoaXN0b3J5IGlucHV0IGZpbGUuCisKKwkqIG0tbmV3c29zMy5oOiBVbmRlZmluZSBOT19TSUdJTlRFUlJVUFQuICBSZWFycmFuZ2UgYSBmZXcgY29tbWVudHMuCisKKwkqIG0tbmV3c29zMy5oIChSRUdJU1RFUl9VX0FERFIpOiBVc2UgbmV3IHZlcnNpb24gZnJvbSBIaWtpY2hpLgorCisJKiBzcGFyYy1vcGNvZGUuaDogQWRkIGNvbW1lbnQgY2xhcmlmeWluZyBtZWFuaW5nIG9mIHRoZSBvcmRlciBvZgorCXRoZSBlbnRyaWVzIGluIHNwYXJjX29wY29kZXMuCisKKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwLCBjYXNlIFVOT1BfSU5EKTogRGVhbCB3aXRoIGRlZmVyZW5jaW5nCisJdGhpbmdzIHRoYXQgYXJlIG5vdCBwb2ludGVycy4KKworCSogdmFsb3BzLmMgKHZhbHVlX2luZCk6IE1ha2UgZGVyZWZlcmVuY2luZyBhbiBpbnQgZ2l2ZSBhIExPTkdFU1QuCisKKwkqIGV4cHByaW50LmMgKHByaW50X3N1YmV4cCk6IEFkZCAoaW50KSBjYXN0IGluIE9QX0xBU1QgY2FzZS4KKworCSogZGJ4cmVhZC5jIChyZWFkX2FycmF5X3R5cGUpOiBTZXQgbG93ZXIgYW5kIHVwcGVyIGlmIGFkanVzdGFibGUuCisKKwkqIHN5bXRhYi5jIChsb29rdXBfc3ltYm9sKTogRG9uJ3QgYWJvcnQgaWYgc3ltYm9sIGZvdW5kIGluIHBzeW10YWIKKwlidXQgbm90IGluIHN5bXRhYi4KKworVGh1IEF1ZyAxNyAxNTo1MToyMCAxOTg5ICBSYW5keSBTbWl0aCAgKHJhbmR5IGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBjb25maWcuZ2RiOiBDaGFuZ2VkICJNYWtlZmlsZS5jIiB0byAiTWFrZWZpbGUuZGlzdCIuCisKK1RodSBBdWcgMTcgMDE6NTg6MDQgMTk4OSAgUm9sYW5kIE1jR3JhdGggIChyb2xhbmQgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBzcGFyYy1vcGNvZGUuaCAob3IpOiBSZW1vdmVkIGluY29ycmVjdCBsb3NlIGJpdCAweDA4MDAwMDAwLgorCVttYW55XTogQ2hhbmdlZCBtYW55IGBsb3NlJyBlbnRyaWVzIHRvIGhhdmUgdGhlIDB4MTAgYml0IHNldCwgc28KKwl0aGV5IGRvbid0IHRoaW5rICVsMCBpcyAlZzAuCisKK1dlZCBBdWcgMTYgMDA6MzA6NDQgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBtLXN5bW1ldHJ5LmggKFNUT1JFX1NUUlVDVF9SRVRVUk4pOiBBbHNvIHdyaXRlIHJlZyAwLgorCShFWFRSQUNUX1JFVFVSTl9WQUxVRSk6IENhbGwgc3ltbWV0cnlfZXh0cmFjdF9yZXR1cm5fdmFsdWUuCisJc3ltbWV0cnktZGVwLmMgKHN5bW1ldHJ5X2V4dHJhY3RfcmV0dXJuX3ZhbHVlKTogTmV3IGZuLgorCisJKiBtYWluLmMgKHN5bWJvbF9jb21wbGV0aW9uX2Z1bmN0aW9uKTogRGVhbCB3aXRoIGNoYW5nZWQKKwlyZXN1bHRfbGlzdCBmcm9tIGxvb2t1cF9jbWRfMSBmb3IgYW1iaWd1b3VzIHJldHVybi4KKwljb21tYW5kLmMgKGxvb2t1cF9jbWQpOiBTYW1lLgorCisJKiBpbmZsb3cuYyBbVElPQ0dFVENdOiBNb3ZlICNpbmNsdWRlICJwYXJhbS5oIiBiYWNrIGJlZm9yZQorCXN5c3RlbSAjaW5jbHVkZXMuICBDaGFuZ2UgYWxsICNpZmRlZiBUSU9DR0VUQyB0bworCSNpZiBkZWZpbmVkKFRJT0NHRVRDKSAmJiAhZGVmaW5lZChUSU9DR0VUQ19CUk9LRU4pCisJbS1pMzg2LXN5c3YzLjIuaCwgbS1pMzg2Z2FzLXN5c3YzLjIuaDogUmVtb3ZlICIjdW5kZWYgVElPQ0dFVEMiCisJYW5kIGFkZCAiI2RlZmluZSBUSU9DR0VUQ19CUk9LRU4iLgorCisJKiBjb21tYW5kLmMgKGxvb2t1cF9jbWRfMSk6IEdpdmUgdGhlIGNvcnJlY3QgcmVzdWx0X2xpc3QgaW4gdGhlCisJY2FzZSBvZiBhbiBhbWJpZ3VvdXMgcmV0dXJuIHdoZXJlIHRoZXJlIGlzIGEgcGFydGlhbCBtYXRjaAorCShlLmcuICJpbmZvIGEiKS4gIEFkZCBjb21tZW50IGNsYXJpZnlpbmcgd2hhdCBpcyB0aGUgY29ycmVjdAorCXJlc3VsdF9saXN0LgorCisJKiBnZGIudGV4aW5mbyAoR0RCIEhpc3RvcnkpOiBEb2N1bWVudCB0aGUgdHdvIGNoYW5nZXMgYmVsb3cuCisKKwkqIG1haW4uYyAoY29tbWFuZF9saW5lX2lucHV0KTogTWFrZSBoaXN0b3J5IGV4cGFuc2lvbiBub3QKKwlqdXN0IG9jY3VyIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLgorCisJKiBtYWluLmMgKGluaXRpYWxpemVfbWFpbik6IE1ha2UgaGlzdG9yeSBleHBhbnNpb24gb2ZmIGJ5IGRlZmF1bHQuCisKKwkqIGluZmxvdy5jOiBNb3ZlICNpbmNsdWRlICJwYXJhbS5oIiBhZnRlciBzeXN0ZW0gI2luY2x1ZGVzLgorCisJKiBpMzg2LWRlcC5jIChpMzg2X2Zsb2F0X2luZm8pOiBVc2UgVV9GUFNUQVRFIG1hY3JvLgorCisJKiBtLWkzODYtc3lzdjMuMi5oLCBtLWkzODZnYXMtc3lzdjMuMi5oOiBOZXcgZmlsZXMuCisJTWFrZWZpbGUuZGlzdCwgY29uZmlnLmdkYjogS25vdyBhYm91dCB0aGVzZSBuZXcgZmlsZXMuCisKK1R1ZSBBdWcgMTUgMjE6MzY6MTEgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBzeW10YWIuYyAobG9va3VwX3N0cnVjdF9lbHRfdHlwZSk6IFVzZSB0eXBlX3ByaW50IHJhdGhlcgorCXRoYW4gYXNzdW1pbmcgdHlwZSBoYXMgYSBuYW1lLgorCitUdWUgQXVnIDE1IDAyOjI1OjQzIDE5ODkgIFJvbGFuZCBNY0dyYXRoICAocm9sYW5kIGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogc3BhcmMtb3Bjb2RlLmggKG1vdik6IFJlbW92ZWQgYm9ndXMgIm9yIGksMCxkIiBwYXR0ZXJuLgorCisJKiBzcGFyYy1vcGNvZGUuaCAobW92LCBvcik6IEZpeGVkIGluY29ycmVjdCBgbG9zZScgbWVtYmVycy4KKworCSogc3BhcmMtZGVwLmM6IERvbid0IGluY2x1ZGUgInNwYXJjLW9wY29kZS5oIi4KKwkoc2tpcF9wcm9sb2d1ZSwgaXNhbnVsbGVkKTogRGVjbGFyZSBzcGVjaWFsIHR5cGVzIHRvIHJlY29nbml6ZQorCWluc3RydWN0aW9ucywgYW5kIHVzZSB0aGVtLgorCisJKiBzcGFyYy1waW5zbi5jIChwcmludF9pbnNuKTogU2lnbi1leHRlbmQgMTMtYml0IGltbWVkaWF0ZSBhcmdzLgorCUlmIHRoZXkgYXJlIGxlc3MgdGhhbiArOSwgcHJpbnQgdGhlbSBpbiBzaWduZWQgZGVjaW1hbCBpbnN0ZWFkCisJb2YgdW5zaWduZWQgaGV4LgorCisJKiBzcGFyYy1vcGNvZGUuaCwgc3BhcmMtcGluc24uYzogQ29tcGxldGVseSByZXdyaXR0ZW4gdG8gc2hhcmUgYW4KKwlvcGNvZGUgdGFibGUgd2l0aCBnYXMsIGFuZCB0aHVzIHByb2R1Y2UgZGlzYXNzZW1ibHkgdGhhdCBsb29rcworCWxpa2Ugd2hhdCB0aGUgYXNzZW1ibGVyIGFjY2VwdHMuCisKK1R1ZSBBdWcgMTUgMTY6MjA6NTIgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogc3ltdGFiLmMgKGZpbmRfcGNfcHN5bWJvbCk6IE1vdmUgYmVzdF9wYz1wc3ltdGFiLT50ZXh0bG93LTEKKwlhZnRlciB0ZXN0IGZvciBwc3ltdGFiIG51bGwuCisKKwkqIG1haW4uYyAoZWRpdGluZ19pbmZvKTogUmVtb3ZlIHZhcmlhYmxlIHJldHZhbC4KKworCSogY29uZmlnLmdkYiAoc3VuMywgaXNpKTogQ29tbWVudCBvdXQgb2Jzb2xldGUgbWVzc2FnZSBhYm91dCB0ZWxsaW5nCisJaXQgd2hldGhlciB5b3UgaGF2ZSBhbiBGUFUgKG5vdyB0aGF0IGl0IGRldGVjdHMgaXQpLgorCisJKiBjb25maWcuZ2RiIChzdW4zKTogQWNjZXB0IHN1bjNvczMuCisKKwkqIG02OGstaW5zbi5oOiBJbmNsdWRlIDxzaWduYWwuaD4uCisKKwkqIG02OGstcGluc24uaCAoY29udmVydF97dG8sZnJvbX1fNjg4ODEpOiBBZGQgaGF2ZV9mcHUgY29kZQorCisJKiBtLW5ld3NvczMuaDogVW5kZWZpbmUgVVNFX1BDQi4gIFRoYXQgY29kZSBkaWRuJ3Qgc2VlbSB0byB3b3JrLgorCisJKiBzcGFyYy1kZXAuYzogUHV0IGluIGluc25fZm10IGFuZCBvdGhlciBzdHVmZiBmcm9tIHRoZSBvbGQKKwlzcGFyYy1vcGNvZGUuaC4KKworCSogc3BhcmMtb3Bjb2RlLmgsIHNwYXJjLXBpbnNuLmM6IENvcnJlY3QgY29weXJpZ2h0IG5vdGljZS4KKworCSogc3BhcmMtb3Bjb2RlLmgsIHNwYXJjLXBpbnNuLmM6IFJlcGxhY2UgdGhlIG9sZCBvbmVzIHdpdGggdGhlIG5ldworCW9uZXMgYnkgcm9sYW5kLgorCitUdWUgQXVnIDE1IDAyOjI1OjQzIDE5ODkgIFJvbGFuZCBNY0dyYXRoICAocm9sYW5kIGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogTWFrZWZpbGUuZGlzdDogRG9uJ3QgZGVmaW5lIENDIGF0IGFsbC4KKworCSogTWFrZWZpbGUuZGlzdCAoTWFrZWZpbGUpOiBSZW1vdmUgdG1wLmMgYWZ0ZXIgcHJlcHJvY2Vzc2luZy4KKwlVc2UgJChNRCkgaW5zdGVhZCBvZiBNX01BS0VERUZJTkUgaW4gdGhlIGNjIGNvbW1hbmQuCisKKwkqIE1ha2VmaWxlLmRpc3Q6IERvbid0IGRlZmluZSBSTF9MSUIgYXMKKwkiJHtSRUFETElORX0vbGlicmVhZGxpbmUuYSIsIHNpbmNlIFJFQURMSU5FIGlzIGEgbGlzdCBvZiBmaWxlcy4KKworTW9uIEF1ZyAxNCAyMzo0OToyOSAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIG1haW4uYyAocHJpbnRfdmVyc2lvbik6IENoYW5nZSAxOTg4IHRvIDE5ODkuCisKKwkqIG1haW4uYyAoY29weWluZ19pbmZvLCBpbml0aWFsaXplX21haW4pOiBSZW1vdmUgI2lmIDAnZCBjb2RlLgorCitUdWUgQXVnICAxIDE0OjQ0OjU2IDE5ODkgIEhpa2ljaGkgIChoaWtpY2hpIGF0IHNyYW4yMDMpCisKKwkqIG0tbmV3c29zMy5oCisJICAgIChOT19TSUdJTlRFUlJVUFQpOiBoYXZlIFNJR0lOVEVSUlVQVCBvbiBORVdTIG9zIDMuCisKKwkqIG0tbmV3cy5oKEZSQU1FX0ZJTkRfU0FWRURfUkVHUyk6IHVzZSB0aGUgc3VuMydzIGluc3RlYWQgb2Ygb2xkCisJb25lLgorCitNb24gQXVnIDE0IDE1OjI3OjAxIDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogbS1uZXdzLmgsIG0tbmV3c29zMy5oLCBuZXdzLWRlcC5jOiBNZXJnZSBhZGRpdGlvbmFsIGNoYW5nZXMKKwlieSBIaWtpY2hpIChDaGFuZ2VMb2cgZW50cmllcyBhYm92ZSkuCisKKwkqIE1ha2VmaWxlLmRpc3QgKFJFQURMSU5FKTogTGlzdCByZWFkbGluZSBmaWxlcyBpbmRpdmlkdWFsbHkKKwlzbyB3ZSBkb24ndCBhY2NpZGVudGx5IGdldCByYW5kb20gZmlsZXMgZnJvbSB0aGUgcmVhZGxpbmUKKwlkaXJlY3RvcnkuCisKKwkqIG0tbmV3cy5oIChTVE9SRV9SRVRVUk5fVkFMVUUsIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKToKKwlFeHBlY3QgZmxvYXRpbmcgcG9pbnQgcmV0dXJucyB0byBiZSBpbiBmcDAuCisKKwkqIGdkYi50ZXhpbmZvIChGb3JtYXQgb3B0aW9ucyk6IE5ldyBub2RlLgorCisJKiBnZGIudGV4aW5mbzogQ29tbWVudCBvdXQgIkBpbmNsdWRlInMgdW50aWwgYmZveCBmaXhlcyB0aGUKKwlyZWFkbGluZSAmIGhpc3RvcnkgZG9jcy4KKworCSogZGJ4cmVhZC5jIChyZWFkX2FkZGxfc3ltcyk6IFNldCBzdGFydHVwX2ZpbGVfKiBpZiBuZWNlc3NhcnkgYXQKKwl0aGUgZW5kIChhcyB3ZWxsIGFzIHdoZW4gd2UgaGl0ICIubyIpLgorCisJKiBwcmludGNtZC5jIChkZWNvZGVfZm9ybWF0KTogU2V0IHZhbC5mb3JtYXQgJiB2YWwuc2l6ZSB0byAnPycgYXQKKwlzdGFydCBhbmQgc2V0IGRlZmF1bHRzIGF0IGVuZC4KKworCSogc3ltdGFiLmMgKGRlY29kZV9saW5lXzEpOiBDaGVjayBmb3IgY2xhc3NfbmFtZSBudWxsLgorCisJKiB2YWxvcHMuYzogRWFjaCBwbGFjZSB3aGVyZSBpdCBjb21wYXJlcyBhZ2FpbnN0IGZpZWxkIG5hbWVzLAorCWNoZWNrIGZvciBudWxsIGZpZWxkIG5hbWVzLiAgKG5ldyB0X2ZpZWxkX25hbWUgdmFyaWFibGVzKS4KKworCSogdXRpbHMuYyAoZnB1dHNfZmlsdGVyZWQpOiBDaGVjayBmb3IgbGluZWJ1ZmZlciBudWxsIGJlZm9yZQorCWNoZWNraW5nIHdoZXRoZXIgdG8gY2FsbCBmcHV0cy4gIFJlbW92ZSBsYXRlciBjaGVjayBmb3IgbGluZWJ1ZmZlcgorCW51bGwuICAKKworU3VuIEF1ZyAxMyAxNTo1Njo1MCAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIG0taXNpLmgsIG0tc3VuMy5oICh7UFVTSCxQT1B9X0ZQX1JFR1MpOiAgTmV3IG1hY3Jvcy4KKwltLXN1bjMuaCAoTlVNX1JFR1MpOiBDb25kaXRpb25hbGl6ZSBvbiBGUFUuCisJY29uZmlnLmdkYiAoc3VuMywgaXNpKTogQWRkIG1lc3NhZ2UgYWJvdXQgc3VwcG9ydCBmb3IgbWFjaGluZXMKKwl3aXRob3V0IEZQVS4KKworCSogbWFpbi5jIChjYXRjaF90ZXJtaW5hdGlvbiwgaW5pdGlhbGl6ZV9zaWduYWxzKTogbmV3IGZ1bmN0aW9ucy4KKworCSogbWFpbi5jIChlZGl0aW5nX2luZm8pOiBBZGQgImluZm8gZWRpdGluZyBuIiBhbmQgImluZm8gZWRpdGluZyArIi4KKwlSZXdyaXRlIG11Y2ggb2YgdGhpcyBmdW5jdGlvbi4KKwlnZGIudGV4aW5mbyAoR0RCIFJlYWRsaW5lKTogRG9jdW1lbnQgaXQuCisKKwkqIHZhbHVlcy5jIChoaXN0b3J5X2luZm8pOiBBZGQgImluZm8gaGlzdG9yeSArIi4gIEFsc28gYWRkIGNvZGUgdG8KKwlkbyAiaW5mbyBoaXN0b3J5ICsiIHdoZW4gY29tbWFuZCBpcyByZXBlYXRlZC4KKwlnZGIudGV4aW5mbyAoVmFsdWUgSGlzdG9yeSk6IERvY3VtZW50ICJpbmZvIGhpc3RvcnkgKyIuCisKKwkqIGV4cHByaW50LmMgKHByaW50X3N1YmV4cCk6IEFkZCBPUF9USElTIHRvIGNhc2Ugc3RtdC4KKworCSogY29uZmlnLmdkYiAoc3VuNG9zNCk6IFB1dCBxdW90ZXMgYXJvdW5kIG1ha2UgZGVmaW5lLgorCisJKiBjb25maWcuZ2RiOiBDYW5vbmljYWxpemUgbWFjaGluZSBuYW1lIGF0IGJlZ2lubmluZy4KKworU2F0IEF1ZyAxMiAwMDo1MDo1OSAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIGNvbmZpZy5nZGI6IGRlZmluZSBNX01BS0VERUZJTkUKKwlNYWtlZmlsZSAoTWFrZWZpbGUsIE1EKTogQmUgYWJsZSB0byByZS1tYWtlIE1ha2VmaWxlLgorCisJKiBtYWluLmMgKGNvbW1hbmRfbGluZV9pbnB1dCk6IEFkZCBjb21tZW50cyB0bworCXRoZSBjb21tYW5kIGhpc3RvcnkuCisKKwkqIE1ha2VmaWxlLmRpc3QgKE1ha2VmaWxlKTogQWRkIC9iaW4vZmFsc2UuCisKK0ZyaSBBdWcgMTEgMTQ6MzU6MzMgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHNwaWZmKQorCisJKiBNYWtlZmlsZS5kaXN0OiBDb21tZW50IG91dCAuYy5vIHJ1bGUgYW5kIGFkZCBUQVJHRVRfQVJDSC4KKworCSogbS1hbHRvcy5oOiBJbmNsdWRlIHN5cy9wYWdlLmggJiBzeXMvbmV0LmgKKworCSogbS1hbHRvcy5oIChGUkFNRV9DSEFJTnssX1ZBTElEfSk6ICBVc2Ugb3V0c2lkZV9zdGFydHVwX2ZpbGUuCisKKwkqIGNvbmZpZy5nZGIgKGFsdG9zLCBhbHRvc2dhcyk6IEFkZCBNX1NZU1YgJiBNX0JTRF9OTSBhbmQgcmVtb3ZlCisJTV9BTExPQ0E9YWxsb2NhLm8gZnJvbSBtYWtlZGVmaW5lLgorCisJKiBjb2ZmcmVhZC5jIChjb21wbGV0ZV9zeW10YWIpOiBDaGFuZ2UgYV9lbnRyeSB0byBlbnRyeS4KKworCSogbS1hbHRvc2dhcy5oOiBOZXcgZmlsZS4KKworCSogbS1zeW1tZXRyeSAoUkVHSVNURVJfQllURSk6IEZpeCBkdW1iIG1pc3Rha2UuCisKK0ZyaSBBdWcgMTEgMDY6Mzk6NDkgMTk4OSAgUm9sYW5kIE1jR3JhdGggIChyb2xhbmQgYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIHV0aWxzLmMgKHNldF9zY3JlZW5zaXplX2NvbW1hbmQpOiBDaGVjayBmb3IgQVJHIGJlaW5nIG5pbCwgc2luY2UKKwl0aGF0J3Mgd2hhdCBleGVjdXRlX2NvbW1hbmQgd2lsbCBwYXNzIGlmIHRoZXJlJ3Mgbm8gYXJndW1lbnQuCisKKwkqIGV4cHJlYWQueSAoeXlsZXgpOiBSZWNvZ25pemUgIjB4IiBvciAiMFgiIGFzIHRoZSBiZWdpbm5pbmcgb2YgYQorCW51bWJlci4KKworVGh1IEF1ZyAxMCAxNTo0MzoxMiAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIGNvbmZpZy5nZGIsIE1ha2VmaWxlLmRpc3Q6IFJlbmFtZSBNYWtlZmlsZS5jIHRvIE1ha2VmaWxlLmRpc3QuCisKKwkqIG0tYWx0b3MuaDogQWRkIGNvbW1lbnQgYWJvdXQgcG9ydGluZyB0byBVU0dSMi4KKworCSogY29uZmlnLmdkYiAoc3BhcmMpOiBBZGQgLVVzcGFyYy4KKworV2VkIEF1ZyAgOSAxNDoyMDozOSAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIG0tc3VuM29zNC5oOiBEZWZpbmUgQlJPS0VOX0xBUkdFX0FMTE9DQS4KKworCSogdmFsdWVzLmMgKG1vZGlmeV9maWVsZCk6IENoZWNrIGZvciB2YWx1ZSB0b28gbGFyZ2UgdG8gZml0IGluCisJYml0ZmllbGQuIAorCisJKiB1dGlscy5jIChmcHV0c19maWx0ZXJlZCk6IEFsbG93IExJTkVCVUZGRVIgdG8gYmUgTlVMTC4KKworCSogYnJlYWtwb2ludC5jIChjb25kaXRpb25fY29tbWFuZCk6IENoZWNrIGZvciBhdHRlbXB0IHRvIHNwZWNpZnkKKwlub24tbnVtZXJpYyBicmVha3BvaW50IG51bWJlci4KKworCSogY29uZmlnLmdkYiwgTWFrZWZpbGUsIG0tYWx0b3MuaCwgYWx0b3MtZGVwLmM6IE1lcmdlIEFsdG9zCisJcG9ydC4KKworCSogUkVBRE1FOiBDaGFuZ2UgbWVzc2FnZSBhYm91dCBlZGl0aW5nIE1ha2VmaWxlLgorCisJKiBjb25maWcuZ2RiOiBFZGl0IE1ha2VmaWxlLgorCUNvcGllZCBNYWtlZmlsZSB0byBNYWtlZmlsZS5jIGFuZCBjaGFuZ2VkIHRvIGxldCBjb25maWcuZ2RiCisJcnVuIHVzIHRocm91Z2ggdGhlIEMgcHJlcHJvY2Vzc29yLgorCisJKiBleHByZWFkLnkgKHl5bGV4KTogVGVzdCBjb3JyZWN0bHkgZm9yIGRlZmluaXRpb24gb2YgbnVtYmVyLgorCitXZWQgQXVnICA5IDExOjU2OjA1IDE5ODkgIFJhbmR5IFNtaXRoICAocmFuZHkgYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogUHV0IGJyYWNrZXRpbmcgb2YgZW50cnkgcG9pbnQgaW4KKwl0ZXN0IGNhc2UgZm9yIC5vIHN5bWJvbHMgc28gdGhhdCBpdCB3aWxsIGJlIGNvcnJlY3QgZXZlbiB3aXRob3V0CisJZGVidWdnaW5nIHN5bWJvbHMuCisJKGVuZF9wc3ltdGFiKTogVG9vayBicmFja2V0aW5nIG91dC4KKworCSogYmxvY2tmcmFtZS5jIChvdXRzaWRlX3N0YXJ0dXBfZmlsZSk6IFJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZQorCXJldHVybiB2YWx1ZSB0byBtYWtlIHRoZSBmdW5jdGlvbmFsaXR5IGltcGxpZWQgYnkgdGhlIG5hbWUKKwljb3JyZWN0LiAKKworVHVlIEF1ZyAgOCAxMTo0ODozOCAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIGNvZmZyZWFkLmMgKHN5bWJvbF9maWxlX2NvbW1hbmQpOiBEbyAgbm90IGFzc3VtZSBwcmVzZW5jZSBvZiBhLm91dAorCWhlYWRlci4gCisKKwkqIGJsb2NrZnJhbWUuYzogUmVwbGFjZSBmaXJzdF9vYmplY3RfZmlsZV9lbmQgd2l0aAorCXN0YXJ0dXBfZmlsZV97c3RhcnQsZW5kfQorCShvdXRzaWRlX3N0YXJ0dXBfZmlsZSk6IE5ldyBmdW5jdGlvbi4KKwlkYnhyZWFkLmMgKHJlYWRfYWRkbF9zeW1zLCByZWFkX2RieF9zeW10YWIsIGVuZF9wc3ltYm9sKTogc2V0CisJc3RhcnR1cF9maWxlXyouICBEZWxldGUgZmlyc3Rfb2JqZWN0X2ZpbGVfZW5kIGNvZGUuCisJQWRkIGVudHJ5X3BvaW50IGFuZCBFTlRSWV9QT0lOVAorCWNvZmZyZWFkLmMgKGNvbXBsZXRlX3N5bXRhYik6IFNldCBzdGFydHVwX2ZpbGVfKi4KKwkoZmlyc3Rfb2JqZWN0X2ZpbGVfZW5kKTogQWRkIGFzIHN0YXRpYy4KKwltLSouaCAoRlJBTUVfQ0hBSU4sIEZSQU1FX0NIQUlOX1ZBTElEKTogQ2FsbCBvdXRzaWRlX3N0YXJ0dXBfZmlsZQorCWluc3RlYWQgb2YgY29tcGFyaW5nIHdpdGggZmlyc3Rfb2JqZWN0X2ZpbGVfZW5kLgorCisJKiBicmVha3BvaW50LmMgKGJyZWFrcG9pbnRfMSk6IENoYW5nZSAtMSB0byAoQ09SRV9BRERSKS0xLgorCisJKiBjb25maWcuZ2RiIChpMzg2LCBpMzg2Z2FzKTogQWRkIG1pc3NpbmcgcXVvdGVzIGF0IGVuZCBvZiAiZWNobyIKKworCSogc291cmNlLmMgKGRpcmVjdG9yeV9jb21tYW5kKTogQWRkIGRvbnRfcmVwZWF0ICgpOworCitNb24gQXVnICA3IDE4OjAzOjUxIDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jIChyZWFkX2FkZGxfc3ltcyk6IENoYW5nZSBzdHJjbXAgdG8gc3RybmNtcCBhbmQgcHV0IDNyZAorCWFyZyBiYWNrLgorCisJKiBjb21tYW5kLmggKHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50KTogQWRkIGNvbW1lbnQgY2xhcmlmeWluZworCXB1cnBvc2Ugb2YgYWJicmV2X2ZsYWcuCisKK01vbiBBdWcgIDcgMTI6NTE6MDMgMTk4OSAgUmFuZHkgU21pdGggIChyYW5keSBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogcHJpbnRjbWQuYyAoX2luaXRpYWxpemVfcHJpbnRjbWQpOiBDaGFuZ2VkICJ1bmRpc3BsYXkiIG5vdCB0bworCWhhdmUgYWJicmV2IGZsYWcgc2V0OyBpdCBpc24ndCBhbiBhYmJyZXZpYXRpb24gb2YgImRlbGV0ZQorCWRpc3BsYXkiLCBpdCdzIGFuIGFsaWFzLgorCitNb24gQXVnICA3IDAwOjI1OjE1IDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogc3ltdGFiLmMgKGxvb2t1cF9zeW10YWJfMSk6IFJlbW92ZSBmaWxlbWF0Y2ggKG5ldmVyIHVzZWQpLgorCisJKiBleHByZWFkLnkgW3R5cGVdOiBBZGQgc2Vjb25kIGFyZ3VtZW50IHRvIDIgY2FsbHMgdG8KKwlsb29rdXBfbWVtYmVyX3R5cGUgd2hpY2ggd2VyZSBtaXNzaW5nIHRoZW0uCisKKwkqIGRieHJlYWQuYyAoc3ltYm9sX2ZpbGVfY29tbWFuZCk6IEFkZCBmcm9tX3R0eSBhcmcuCisJQ2hlY2sgaXQgYmVmb3JlIGNhbGxpbmcgcXVlcnkuCisKKwkqIGluZmNtZC5jICh0dHlfY29tbWFuZCk6IEFkZCBmcm9tX3R0eSBhcmcuCisKKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKTogUmVtb3ZlIDNyZCBhcmd1bWVudCBmcm9tCisJY2FsbHMgdG8gdmFsdWVfeF91bm9wLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfYWRkbF9zeW1zKTogUmVtb3ZlIDNyZCBhcmd1bWVudCBmcm9tCisJY2FsbCB0byBzdHJjbXAuCisKKwkqIGdkYi50ZXhpbmZvIChDb21tYW5kIGVkaXRpbmcpOiBAaW5jbHVkZSBpbmMtcmVhZGxpbmUudGV4aW5mbworCWFuZCBpbmMtaGlzdG9yeS50ZXhpbmZvIGFuZCByZW9yZ2FuaXplIEdEQi1zcGVjaWZpYyBzdHVmZi4KKworCSogTWFrZWZpbGU6IEFkZCBsaW5lIE1BS0U9bWFrZS4KKworCSogUkVBRE1FIChzZWNvbmQgcGFyYWdyYXBoKTogRml4IHRyaXZpYWwgZXJyb3JzLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfc3RydWN0X3R5cGUpOiBNYWtlIHN1cmUgcCBpcyBpbml0aWFsaXplZC4KKworCSogbWFpbi5jIChzeW1ib2xfY29tcGxldGlvbl9mdW5jdGlvbik6IENvbXBsZXRlIGNvcnJlY3RseQorCW9uIHRoZSBlbXB0eSBzdHJpbmcuCisKK1N1biBBdWcgIDYgMjE6MDE6NTkgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBzeW1tZXRyeS1kZXAuYzogUmVtb3ZlICJsb25nIiBmcm9tIGRlZmluaXRpb24gb2YgaTM4Nl9mb2xsb3dfanVtcC4KKworCSogZ2RiLnRleGluZm8gKEJhY2t0cmFjZSk6IERvY3VtZW50ICJ3aGVyZSIgYW5kICJpbmZvIHN0YWNrIi4KKworCSogZGJ4cmVhZC5jIChjbGVhbnVwX3VuZGVmaW5lZF90eXBlcyk6IFN0cmlwIG9mZiAic3RydWN0ICIKKwlvciAidW5pb24gIiBmcm9tIHR5cGUgbmFtZXMgYmVmb3JlIGRvaW5nIGNvbXBhcmlzb24KKworU2F0IEF1ZyAgNSAwMjowNTozNiAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIGNvbmZpZy5nZGIgKGkzODYsIGkzODZnYXMpOiBJbXByb3ZlIG1ha2VmaWxlIGVkaXRpbmcgaW5zdHJ1Y3Rpb25zLgorCisJKiBNYWtlZmlsZTogRml4IHR5cG8gaW4gQ0xJQlMgZm9yIFNZU1YuCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogRGVhbCB3aXRoIE5fR1NZTSB0eXBlZGVmcy4KKworCSogZGJ4cmVhZC5jIChhZGRfZmlsZV9jb21tYW5kKTogRG8gbm90IGZyZWUgbmFtZS4gIFdlIGRpZG4ndAorCWFsbG9jYXRlIGl0OyBpdCBqdXN0IHBvaW50cyBpbnRvIGFyZ19zdHJpbmcuCisKKwkqIE1ha2VmaWxlLCBtLSouaDogQ2hhbmdlIExBQ0tfVlBSSU5URiB0byBIQVZFX1ZQUklOVEYuCisKK0ZyaSBKdWwgMjggMDA6MDc6NDggMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogTWFkZSBzdXJlIHRoYXQgYWxsIHJldHVybnMgcmV0dXJuZWQgYQorCXZhbHVlICh1c3VhbGx5IDAsIGluZGljYXRpbmcgbm8gbWVtb3J5IHByaW50ZWQpLgorCisJKiBjb3JlLmMgKHJlYWRfbWVtb3J5KTogQ2hhbmdlZCAicmV0dXJuIiB0byAicmV0dXJuIDAiLgorCisJKiBleHByZWFkLnkgKHBhcnNlX251bWJlcik6IEhhbmRsZSBzY2llbnRpZmljIG5vdGF0aW9uIHdoZW4gdGhlCisJc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gYSAnLicuCisKK1RodSBKdWwgMjcgMTU6MTQ6MDMgMTk4OSAgUmFuZHkgU21pdGggIChyYW5keSBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogaW5mcnVuLmMgKHNpZ25hbHNfaW5mbyk6IEVycm9yIGlmIHNpZ25hbCBudW1iZXIgcGFzc2VkIGlzIG91dCBvZgorCWJvdW5kcy4gCisKKwkqIGRlZnMuaDogRGVmaW5lIGFsbG9jYSB0byBiZSBfX2J1aWx0aW5fYWxsb2NhIGlmIGNvbXBpbGluZyB3aXRoCisJZ2NjIGFuZCBsb2NhbGl6ZWQgaW5jbHVzaW9uIG9mIGFsbG9jYS5oIG9uIHRoZSBzcGFyYyB3aXRoIHRoZQorCW90aGVyIGFsbG9jYSBzdHVmZi4KKwkqIGNvbW1hbmQuYzogRG9lc24ndCBuZWVkIHRvIGluY2x1ZGUgYWxsb2NhLmggb24gdGhlIHNwYXJjOyBkZWZzLmgKKwlkb2VzIGl0IGZvciB5b3UuCisKKwkqIHByaW50Y21kLmMgKHByaW50X2ZyYW1lX2FyZ3MpOiBDaGFuZ2VkIHRlc3QgZm9yIGNhbGwgdG8KKwlwcmludF9mcmFtZV9uYW1lbGVzc19hcmdzIHRvIGNoZWNrIGkgdG8gdGVsbCBpZiBhbnkgYXJncyBoYWQgYmVlbgorCXByaW50ZWQuCisKK1RodSBKdWwgMjcgMDQ6NDA6NTYgMTk4OSAgUm9sYW5kIE1jR3JhdGggIChyb2xhbmQgYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIGJsb2NrZnJhbWUuYyAoZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uKTogQWx3YXlzIGNoZWNrIHRoYXQgTkFNRQorCWFuZC9vciBBRERSRVNTIGFyZSBub3QgbmlsIGJlZm9yZSBzdG9yaW5nIGludG8gdGhlbS4KKworV2VkIEp1bCAyNiAyMzo0MToyMSAxOTg5ICBSb2xhbmQgTWNHcmF0aCAgKHJvbGFuZCBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogbS1uZXdzb3MzLmg6IERlZmluZSBCUk9LRU5fTEFSR0VfQUxMT0NBLgorCSogZGJ4cmVhZC5jIChzeW1ib2xfZmlsZV9jb21tYW5kLCBwc3ltdGFiX3RvX3N5bXRhYik6CisJVXNlIHhtYWxsb2MgI2lmZGVmIEJST0tFTl9MQVJHRV9BTExPQ0EuCisKK1R1ZSBKdWwgMjUgMTY6Mjg6MTggMTk4OSAgSmF5IEZlbmxhc29uICAoaGFjayBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIG02OGstb3Bjb2RlLmg6IG1vdmVkIHNvbWUgb2YgdGhlIGZtb3ZlbSBlbnRyaWVzIHNvIHRoZXkncmUKKwlhbGwgY29uc2VjdXRpdmUuICBUaGlzIHdheSB0aGUgYXNzZW1ibGVyIGRvZXNuJ3QgYm9tYi4KKworTW9uIEp1bCAyNCAyMjo0NTo1NCAxOTg5ICBSYW5keSBTbWl0aCAgKHJhbmR5IGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBzeW10YWIuYyAobG9va3VwX3N5bWJvbCk6IENoYW5nZWQgZXJyb3IgdG8gYW4gaW5mb3JtYXRpb25hbCAoaWYKKwlub3QgdmVyeSBjb21mb3J0aW5nKSBtZXNzYWdlIGFib3V0IGludGVybmFsIHByb2JsZW1zLiAgVGhpcyB3aWxsCisJZ2V0IGEgbnVsbCBzeW1ib2wgcmV0dXJuZWQgdG8gZGVjb2RlX2xpbmVfMSwgd2hpY2ggc2hvdWxkIGZvcmNlCisJdGhpbmdzIHRvIGJlIGxvb2tlZCB1cCBpbiB0aGUgbWlzYyBmdW5jdGlvbiB2ZWN0b3IuCisKK1dlZCBKdWwgMTkgMTM6NDc6MzQgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogc3ltdGFiLmMgKGxvb2t1cF9zeW1ib2wpOiBDaGFuZ2VkICJmYXRhbCIgdG8gImVycm9yIiBpbgorCWV4dGVybmFsIHN5bWJvbCBub3QgZm91bmQgaW4gc3ltdGFiIGluIHdoaWNoIGl0IHdhcyBzdXBwb3NlZCB0byBiZQorCWZvdW5kLiAgVGhpcyBjYW4gYmUgcmVhY2hlZCBiZWNhdXNlIG9mIGEgYnVnIGluIGFyLgorCitUdWUgSnVsIDE4IDIyOjU3OjQzIDE5ODkgIFJhbmR5IFNtaXRoICAocm9sYW5kIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBtLW5ld3MuaCBbUkVHSVNURVJfVV9BRERSXTogRGVjcmVhc2VkIHRoZSBhc3N1bWVkIG9mZnNldCBvZiBmcDAKKwlieSA0IHRvIGJyaW5nIGl0IGludG8gKGFwcGFyZW50bHkpIGFwcHJvcHJpYXRlIGFsaWdubWVudCB3aXRoCisJcmVhbGl0eS4gCisKK1R1ZSBKdWwgMTggMTg6MTQ6NDIgMTk4OSAgUmFuZHkgU21pdGggIChyYW5keSBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogTWFrZWZpbGU6IHBpbnNuLm8gc2hvdWxkIGRlcGVuZCBvbiBvcGNvZGUuaAorCisJKiBtNjhrLW9wY29kZS5oOiBNb3ZlZCBmbW92ZW14IHdpdGggcmVnaXN0ZXIgbGlzdHMgdG8gYmVmb3JlIG90aGVyCisJZm1vdmVteC4gCisKK1R1ZSBKdWwgMTggMTE6MjE6NDIgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHN1c2llKQorCisJKiBNYWtlZmlsZSwgbSouaDogT25seSAjZGVmaW5lIHZwcmludGYgKHRvIF9kb3BybnQgb3IgcHJpbnRmLAorCWRlcGVuZHMgb24gdGhlIHN5c3RlbSkgaWYgdGhlIGxpYnJhcnkgbGFja3MgaXQgKGNvbnRyb2xsZWQgYnkKKwlMQUNLX1ZQUklOVEZfREVGSU5FIGluIG1ha2VmaWxlKS4gIFVucGxlYXNhbnQsIGJ1dCBuZWNlc3NhcnkgdG8KKwltYWtlIHRoaXMgd29yayB3aXRoIHRoZSBHTlUgQyBsaWJyYXJ5LgorCitNb24gSnVsIDE3IDE1OjE3OjQ4IDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50XzEpOiBDaGFuZ2UgYWRkci1iLT5hZGRyZXNzIHRvCisJYi0+YWRkcmVzcy1hZGRyLgorCitTdW4gSnVsIDE2IDE2OjIzOjM5IDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZSBwcmludGVkIHdoZW4KKwlyaWdodCBvcGVyYW5kIG9mICdAJyBpcyBub3QgYW4gaW50ZWdlciB0byBFbmdsaXNoLgorCisJKiBpbmZjbWQuYyAocmVnaXN0ZXJzX2luZm8pOiBGaXggY2FsbCB0byBwcmludF9zcGFjZXNfZmlsdGVyZWQKKwl0byBzcGVjaWZ5IHJpZ2h0ICMgb2YgYXJndW1lbnRzLgorCisJKiBnZGIudGV4aW5mbyAoQ29tbWFuZCBFZGl0aW5nKTogRG9jdW1lbnQgaW5mbyBlZGl0aW5nIGNvbW1hbmQuCisKKwkqIGNvZmZyZWFkLmMgKHJlYWRfZmlsZV9oZHIpOiBBZGQgTUM2OE1BR0lDLgorCisJKiBzb3VyY2UuYyAoc2VsZWN0X3NvdXJjZV9zeW10YWIpOiBDaGFuZ2UgTUFYIHRvIG1heC4KKworRnJpIEp1bCAxNCAyMToxOToxMSAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBpbmZjbWQuYyAocmVnaXN0ZXJzX2luZm8pOiBDbGVhbiB1cCBkaXNwbGF5IHRvIGxvb2sgZ29vZCB3aXRoIGxvbmcKKwlyZWdpc3RlciBuYW1lcywgdG8gc2F5ICJyZWdpc3RlciIgaW5zdGVhZCBvZiAicmVnIiwgYW5kIHRvIHB1dCB0aGUKKwkicmVsYXRpdmUgdG8gc2VsZWN0ZWQgc3RhY2sgZnJhbWUiIGJpdCBhdCB0aGUgdG9wLgorCitGcmkgSnVsIDE0IDE4OjIzOjA5IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYyAocmVjb3JkX21pc2NfZnVuY3Rpb24pOiBQdXQgcGFyZW5zIGFyb3VuZCB8IHRvIGZvcmNlCisJY29ycmVjdCBldmFsdWF0aW9uLgorCitXZWQgSnVsIDEyIDEyOjI1OjUzIDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogbS1uZXdzb3MzLCBtLW5ld3MsIGluZnJ1bi5jLCBNYWtlZmlsZSwgY29uZmlnLmdkYiwgbmV3cy1kZXAuYzoKKwlNZXJnZSBpbiBIaWtpY2hpJ3MgY2hhbmdlcyBmb3IgU29ueS9OZXdzLU9TIDMgc3VwcG9ydC4KKworVHVlIEp1bCAxMSAyMTo0MTozMiAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiB1dGlscy5jIChmcHV0c19maWx0ZXJlZCk6IERvbid0IGRvIGFueSBmaWx0ZXJpbmcgaWYgb3V0cHV0IGlzCisJbm90IHRvIHN0ZG91dCwgb3IgaWYgc3Rkb3V0IGlzIG5vdCBhIHR0eS4KKwkoZnByaW50Zl9maWx0ZXJlZCk6IFJlbHkgb24gZnB1dHNfZmlsdGVyZWQncyBjaGVjayBmb3Igd2hldGhlciB0bworCWRvIGZpbHRlcmluZy4KKworVHVlIEp1bCAxMSAwMDozMzo1OCAxOTg5ICBSYW5keSBTbWl0aCAgKHJhbmR5IGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBHREIgMy4yIFJlbGVhc2VkLgorCisJKiB2YWxwcmludC5oOiBEZWxldGVkLgorCisJKiB1dGlscy5jIChmcHV0c19maWx0ZXJlZCk6IERvbid0IGRvIGFueSBmaWx0ZXJpbmcgaWYgZmlsdGVyaW5nIGlzCisJZGlzYWJsZWQgKGxpbmVzX3Blcl9wYWdlID09IDApLgorCitNb24gSnVsIDEwIDIyOjI3OjUzIDE5ODkgIFJhbmR5IFNtaXRoICAocm9sYW5kIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBleHByZWFkLnkgW3R5cGViYXNlXTogQWRkZWQgInVuc2lnbmVkIGxvbmcgaW50IiBhbmQgInVuc2lnbmVkCisJc2hvcnQgaW50IiB0byBzcGVjcy4KKworTW9uIEp1bCAxMCAyMTo0NDo1NSAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIG1haW4uYyAobWFpbik6IE1ha2UgLWNkIHVzZSBjZF9jb21tYW5kIHRvIGF2b2lkCisJY3VycmVudF9kaXJlY3Rvcnkgd2l0aCBub24tYWJzb2x1dGUgcGF0aG5hbWUuCisKK01vbiBKdWwgMTAgMDA6MzQ6MjkgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogQ2F0Y2ggZXJyb3JzIGZyb20gc3RhdCAoZXZlbgorCXRob3VnaCB0aGV5IHNob3VsZCBuZXZlciBoYXBwZW4pLgorCisJKiBzb3VyY2UuYyAob3BlbnApOiBJZiB0aGUgcGF0aCBpcyBudWxsLCB1c2UgdGhlIGN1cnJlbnQKKwlkaXJlY3RvcnkuIAorCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYik6IFB1dCBOX1NFVFYgc3ltYm9scyBpbnRvIHRoZSBtaXNjCisJZnVuY3Rpb24gdmVjdG9yIC4uLgorCShyZWNvcmRfbWlzY19mdW5jdGlvbik6IC4uLiBhcyBkYXRhIHN5bWJvbHMuCisKKwkqIHV0aWxzLmMgKGZwcmludGZfZmlsdGVyZWQpOiBSZXR1cm4gYWZ0ZXIgcHJpbnRpbmcgaWYgd2UgYXJlbid0CisJZ29pbmcgdG8gZG8gZmlsdGVyaW5nLgorCisJKiBNYWtlZmlsZTogQWRkZWQgc2V2ZXJhbCB0aGluZ3MgZm9yIG1ha2UgY2xlYW4gdG8gdGFrZSBjYXJlIG9mLgorCisJKiBleHByZWFkLnk6IExvd2VyZWQgIkAiIGluIHByZWNlZGVuY2UgYmVsb3cgKywtLCosLywlLgorCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cCk6IFJldHVybiBhbiBlcnJvciBpZiB0aGUgcmhzIG9mICJAIgorCWlzbid0IGludGVncmFsLgorCisJKiBNYWtlZmlsZTogQWRkZWQgcmVtb3ZhbCBvZiBjb3JlIGFuZCBnZGJbMC05XSBmaWxlcyB0byBjbGVhbgorCXRhcmdldC4gCisKKwkqIE1ha2VmaWxlOiBNYWRlIGEgbmV3IHRhcmdldCAiZGlzdGNsZWFuIiwgd2hpY2ggY2xlYW5zIHRoaW5ncyB1cAorCWNvcnJlY3RseSBmb3IgbWFraW5nIGEgZGlzdHJpYnV0aW9uLgorCitTdW4gSnVsICA5IDIzOjIxOjI3IDE5ODkgIFJhbmR5IFNtaXRoICAocmFuZHkgYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYzogU3Vycm91bmRlZCBkZWZpbmUgb2YgZ251IHN5bWJvbHMgd2l0aCBhbiAjaWZuZGVmCisJTk9fR05VX1NUQUJTIGluIGNhc2UgeW91IGRvbid0IHdhbnQgdGhlbSBvbiBzb21lIG1hY2hpbmVzLgorCSogbS1ucGwuaCwgbS1wbi5oOiBEZWZpbmVkIE5PX0dOVV9TVEFCUy4KKworU3VuIEp1bCAgOSAxOToyNToyMiAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiB1dGlscy5jIChmcHV0c19maWx0ZXJlZCk6IE5ldyBmdW5jdGlvbi4KKwkoZnByaW50Zl9maWx0ZXJlZCk6IFVzZSBmcHV0c19maWx0ZXJlZC4KKwl1dGlscy5jIChwcmludF9zcGFjZXNfZmlsdGVyZWQpLAorCWNvbW1hbmQuYyAoaGVscF9jbWQsaGVscF9jbWRfbGlzdCksCisJcHJpbnRjbWQuYyAocHJpbnRfZnJhbWVfYXJncyksCisJc3RhY2suYyAocHJpbnRfYmxvY2tfZnJhbWVfbG9jYWxzLCBwcmludF9mcmFtZV9hcmdfdmFycyksCisJdmFscHJpbnQuYyAobWFueSBmdW5jdGlvbnMpOiBVc2UgZnB1dHNfZmlsdGVyZWQgaW5zdGVhZCBvZgorCWZwcmludGZfZmlsdGVyZWQgdG8gYXZvaWQgYXJiaXRyYXJ5IGxpbWl0LgorCisJKiB1dGlscy5jIChmcHJpbnRmX2ZpbHRlcmVkKTogRml4IGluY29ycmVjdCBjb21tZW50LgorCitTYXQgSnVsICA4IDE4OjEyOjAxIDE5ODkgIFJhbmR5IFNtaXRoICAocmFuZHkgYXQgaG9iYmVzLmFpLm1pdC5lZHUpCisKKwkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6IENoYW5nZWQgYXNzaWdubWVudCBvZiBwcmV0dHkgdG8gdXNlCisJcHJldHR5cHJpbnQgYXMgYSBjb25kaXRpb25hbCByYXRoZXIgdGhhbiByZWx5IG9uIHZhbHVlcyBvZiB0aGUKKwllbnVtLiAKKworCSogUHJvamVjdHM6IENsZWFuZWQgdXAgYSBsaXR0bGUgZm9yIHJlbGVhc2UuCisKKwkqIG1haW4uYyAoaW5pdGlhbGl6ZV9tYWluKTogSW5pdGlhbGl6ZQorCXJsX2NvbXBsZXRpb25fZW50cnlfZnVuY3Rpb24gaW5zdGVhZCBvZiBjb21wbGV0aW9uX2VudHJ5X2Z1bmN0aW9uLiAKKworCSogTWFrZWZpbGU6IE1vZGlmaWVkIHRvIHVzZSB0aGUgbmV3IHJlYWRsaW5lIGxpYnJhcnkgc2V0dXAuCisKKwkqIGJyZWFrcG9pbnQuYyAoYnJlYWtfY29tbWFuZF8xLCBkZWxldGVfYnJlYWtwb2ludCwKKwllbmFibGVfYnJlYWtwb2ludCwgZGlzYWJsZV9icmVha3BvaW50KTogUHV0IGluIG5ldyBwcmludG91dHMgZm9yCisJeGdkYiB1c2FnZSB0cmlnZ2VyZWQgb2ZmIG9mIHhnZGJfdmVyYm9zZS4KKwkqIG1haW4uYyAobWFpbik6IEFkZGVkIGNoZWNrIGZvciBmbGFnIHRvIHNldCB4Z2RiX3ZlcmJvc2UuCisJKiBzdGFjay5jIChmcmFtZV9jb21tYW5kKTogU2V0IGZyYW1lX2NoYW5nZWQgd2hlbiBmcmFtZSBjb21tYW5kCisJdXNlZC4gCisKK0ZyaSBKdWwgIDcgMTY6MjA6NTggMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGhvYmJlcy5haS5taXQuZWR1KQorCisJKiBSZW1vdmUgdmFscHJpbnQuaCBhbmQgbW92ZSBjb250ZW50cyB0byB2YWx1ZS5oIChtb3JlIGxvZ2ljYWwpLgorCitGcmkgSnVsICA3IDAyOjI4OjA2IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCByaWNlLWNoZXgpCisKKwkqIG02OGstcGluc24uYyAocHJpbnRfaW5zbik6IEluY2x1ZGVkIGEgY2hlY2sgZm9yIHJlZ2lzdGVyIGxpc3Q7CisJaWYgdGhlcmUgaXMgb25lLCBtYWtlIHN1cmUgdG8gc3RhcnQgcCBhZnRlciBpdC4KKworCSogYnJlYWtwb2ludC5jIChicmVha19jb21tYW5kXzEsIGRlbGV0ZV9icmVha3BvaW50LAorCWVuYWJsZV9icmVha3BvaW50LCBkaXNhYmxlX2JyZWFrcG9pbnQpOiAjaWZkZWYnZCBvdXQgY2hhbmdlcworCWJlbG93OyB0aGV5IHByb2R1Y2UgdW53YW50ZWQgb3V0cHV0IGluIGdkYiBtb2RlIGluIGdudS1lbWFjcy4KKworCSogZ2RiLnRleGluZm86IFNwZWxsZWQuICBBbHNvIHJlbW92ZWQgaW5kZXggcmVmZXJlbmNlcyBmcm9tCisJY29tbWFuZCBlZGl0aW5nIHNlY3Rpb247IHRoZSByZWxldmFuY2Uvdm9sdW1lIHJhdGlvIHdhcyB0b28gbG93LgorCVJlbW92ZWQgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGZ1bmN0aW9uIGluZGV4LgorCisJKiBuczMyay1vcGNvZGUuaCwgbnMzMmstcGluc24uYzogQmFja2VkIG91dCBjaGFuZ2VzIG9mIEp1bmUgMjR0aDsKKwloYXZlbid0IHlldCByZWNlaXZlZCBsZWdhbCBwYXBlcnMuCisKKwkqIC5nZGJpbml0OiBJbmNsdWRlZCBtZXNzYWdlIHRlbGxpbmcgdGhlIHVzZXIgd2hhdCBpdCBpcyBkb2luZy4KKworCSogc3ltbWV0cnktZGVwLmM6IEFkZGVkIHN0YXRpYyBkZWNscyBmb3IgaTM4Nl9nZXRfZnJhbWVfc2V0dXAsCisJaTM4Nl9mb2xsb3dfanVtcC4KKwkqIHZhbHVlcy5jICh1bnBhY2tfZG91YmxlKTogQWRkZWQgYSByZXR1cm4gKGRvdWJsZSkwIGF0IHRoZSBlbmQgdG8KKwlzaWxlbmNlIGEgY29tcGlsZXIgd2FybmluZy4KKworCSogcHJpbnRjbWQuYyAoY29udGFpbmluZ19mdW5jdGlvbl9ib3VuZHMsIGFzZHVtcF9jb21tYW5kKTogQ3JlYXRlZAorCXRvIGR1bXAgdGhlIGFzc2VtYmx5IGNvZGUgb2YgYSBmdW5jdGlvbiAoc3VwcG9ydCBmb3IgeGdkYiBhbmQgYQorCXVzZWZ1bCBoYWNrKS4KKwkoX2luaXRpYWxpemVfcHJpbnRjbWQpOiBBZGRlZCB0aGlzIHRvIGNvbW1hbmQgbGlzdC4KKwkqIGdkYi50ZXhpbmZvIFtNZW1vcnldOiBBZGRlZCBkb2N1bWVudGF0aW9uIGZvciB0aGUgYXNkdW1wCisJY29tbWFuZC4KKwkqIGJyZWFrcG9pbnQuYyAoYnJlYWtfY29tbWFuZF8xLCBkZWxldGVfYnJlYWtwb2ludCwKKwllbmFibGVfYnJlYWtwb2ludCwgZGlzYWJsZV9icmVha3BvaW50KTogQWRkZWQgZXh0cmEgdmVyYm9zaXR5IGZvcgorCXhnZGIgY29uZGl0aW9uYWxpemVkIG9uIHRoZSBuZXcgZXh0ZXJuYWwgZnJhbWVfZnVsbF9maWxlX25hbWUuCisJKiBzb3VyY2UuYyAoaWRlbnRpZnlfc291cmNlX2xpbmUpOiBJbmNyZWFzZSB2ZXJib3NpdHkgb2YgZnVsbG5hbWUKKwlwcm9pbnRvdXQgdG8gaW5jbHVkZSBwYyB2YWx1ZS4KKwkqIHN0YWNrLmM6IEFkZGVkIGEgbmV3IHZhcmlhYmxlOyAiZnJhbWVfY2hhbmdlZCIgdG8gaW5kaWNhdGUgd2hlbgorCWEgZnJhbWUgaGFzIGJlZW4gY2hhbmdlZCBzbyB0aGF0IGdkYiBjYW4gcHJpbnQgb3V0IGEgZnJhbWUgY2hhbmdlCisJbWVzc2FnZSB3aGVuIHRoZSBmcmFtZSBvbmx5IGNoYW5nZXMgaW1wbGljaXRseS4KKwkocHJpbnRfZnJhbWVfaW5mbyk6IENoZWNrIHRoZSBuZXcgdmFyaWFibGUgaW4gZGV0ZXJtaW5pbmcgd2hlbiB0bworCXByaW50IG91dCBhIG5ldyBtZXNzYWdlIGFuZCBzZXQgaXQgdG8gemVybyB3aGVuIGRvbmUuCisJKHVwX2NvbW1hbmQpOiBJbmNyZW1lbnQgaXQuCisJKGRvd25fY29tbWFuZCk6IERlY3JlbWVudCBpdC4KKworCSogbTY4ay1waW5zbi5jIChwcmludF9pbnNuX2FyZyBbbExdKTogTW9kaWZpZWQgY2FzZXMgZm9yIHJlZ2lzdGVyCisJbGlzdHMgdG8gcmVzZXQgdGhlIHBvaW50IHRvIHBvaW50IHRvIGFmdGVyIHRoZSB3b3JkIGZyb20gd2hpY2ggdGhlCisJbGlzdCBpcyBncmFiYmVkICppZiogdGhhdCB3b3VsZCBjYXVzZSBwb2ludCB0byBwb2ludCBmYXJ0aGVyIHRoYW4KKwlpdCBjdXJyZW50bHkgaXMuCisKK1RodSBKdWwgIDYgMTQ6Mjg6MTEgMTk4OSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogdmFscHJpbnQuYyAodmFsX3ByaW50LCB2YWx1ZV9wcmludCk6IEFkZCBwYXJhbWV0ZXIgdG8gY29udHJvbAorCXByZXR0eXByaW50aW5nLgorCXZhbHByaW50Lmg6IE5ldyBmaWxlIGNvbnRhaW5pbmcgY29uc3RhbnRzIHVzZWQgZm9yIHBhc3NpbmcKKwlwcmV0dHlwcmludGluZyBwYXJhbWV0ZXIgdG8gdmFseyx1ZX1fcHJpbnQuCisJZXhwcHJpbnQuYywgaW5mY21kLmMsIHByaW50Y21kLmMsIHZhbHByaW50LmMsIHZhbHVlcy5jOgorCUNoYW5nZSBhbGwgY2FsbHMgdG8gdmFseyx1ZX1fcHJpbnQgdG8gdXNlIG5ldyBwYXJhbWV0ZXIuCisJCitNb24gSnVsICAzIDIyOjM4OjExIDE5ODkgIFJhbmR5IFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBkYnhyZWFkLmMgKCxwcm9jZXNzX29uZV9zeW1ib2wpOiBNb3ZlZCBleHRlcm4gZGVjbGFyYXRpb24gZm9yCisJaW5kZXggb3V0IG9mIGZ1bmN0aW9uIHRvIGJlZ2lubmluZyBvZiBmaWxlLgorCitNb24gSnVsICAzIDE4OjQwOjE0IDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogZ2RiLnRleGluZm8gKFJlZ2lzdGVycyk6IEFkZCAicHMiIHRvIGxpc3Qgb2Ygc3RhbmRhcmQgcmVnaXN0ZXJzLgorCitTdW4gSnVsICAyIDIzOjEzOjAzIDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIHByaW50Y21kLmMgKGVuYWJsZV9kaXNwbGF5KTogQ2hhbmdlIGQtPm5leHQgdG8gZCA9IGQtPm5leHQgc28KKwl0aGF0ICJlbmFibGUgZGlzcGxheSIgd2l0aG91dCBhcmdzIHdvcmtzLgorCitGcmkgSnVuIDMwIDIzOjQyOjA0IDE5ODkgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIHNvdXJjZS5jIChsaXN0X2NvbW1hbmQpOiAgTWFkZSBlcnJvciBtZXNzYWdlIGdpdmVuIHdoZW4gbm8KKwlzeW10YWIgaXMgbG9hZGVkIGNsZWFyZXIuCisKKwkqIHZhbG9wcy5jICh2YWx1ZV9hc3NpZ24pOiBNYWtlIGl0IHNvIHRoYXQgd2hlbiBhc3NpZ25pbmcgdG8gYW4KKwlpbnRlcm5hbCB2YXJpYWJsZSwgdGhlIHR5cGUgb2YgdGhlIGFzc2lnbm1lbnQgZXhwIGlzIHRoZSB0eXBlIG9mCisJdGhlIHZhbHVlIGJlaW5nIGFzc2lnbmVkLgorCitGcmkgSnVuIDMwIDEyOjEyOjQzIDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIG1haW4uYyAodmVyYm9zZV9pbmZvKTogQ3JlYXRlZC4KKwkoaW5pdGlhbGl6ZV9tYWluKTogUHV0ICJpbmZvIHZlcmJvc2UiIGludG8gY29tbWFuZCBsaXN0LgorCisJKiB1dGlscy5jIChzY3JlZW5zaXplX2luZm8pOiBDcmVhdGVkLgorCShfaW5pdGlhbGl6ZV91dGlscyk6IERlZmluZWQgImluZm8gc2NyZWVuc2l6ZSIgYXMgYSBub3JtYWwgY29tbWFuZC4KKworCSogdmFscHJpbnQuYyAoZm9ybWF0X2luZm8pOiBBZGRlZCBpbmZvcm1hdGlvbiBhYm91dCBtYXhpbXVtIG51bWJlcgorCW9mIGFycmF5IGVsZW1lbnRzIHRvIGZ1bmN0aW9uLgorCisJKiBibG9ja2ZyYW1lLmMgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbik6IEFnYWluLgorCisJKiBibG9ja2ZyYW1lLmMgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbik6IFJlcGxhY2VkIGEgInNob3VsZG4ndAorCWhhcHBlbiIgKHdoaWNoIGRvZXMpIHdpdGggYSB6ZXJvIHJldHVybi4KKworCSogbWFpbi5jIChkb250X3JlcGVhdCk6IE1vdmVkIGFoZWFkIG9mIGZpcnN0IHVzZS4KKworVGh1IEp1biAyOSAxOToxNTowOCAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiB2YXgtb3Bjb2RlLmg6IE1hZGUgbWlub3IgbW9kaWZpY2F0aW9ucyAobW92ZWQgYW4gaW5zdHJ1Y3Rpb24gYW5kCisJcmVtb3ZlZCBhIHR5cG8pIHRvIGJyaW5nIHRoaXMgaW50byBhY2NvcmQgd2l0aCBnYXMnIHRhYmxlOyBhbHNvCisJY2hhbmdlZCBjb3B5cmlnaHQgdG8gcmVmbGVjdCBpdCBiZWluZyBwYXJ0IG9mIGJvdGggZ2RiIGFuZCBnYXMuCisKKwkqIG02OGstb3Bjb2RlLmg6IEFkZGVkIHdob2xlIHNjYWRzIGFuZCBidW5jaGVzIG9mIG5ldyBzdHVmZiBmb3IKKwl0aGUgbTY4ODUxIGFuZCBjaGFuZ2VkIHRoZSBjb3B0eXJpZ2h0dG8gcmVjb2duaXplIHRoYXQgdGhlIGZpbGUKKwl3YXMgc2hhcmVkIGJldHdlZW4gZ2RiIGFuZCBnYXMuCisKKwkqIG1haW4uYyAoc3RvcF9zaWcpOiBVc2UgImRvbnRfcmVwZWF0ICgpIiBpbnN0ZWFkIG9mICpsaW5lID0gMDsKKworCSogY29yZS5jIChyZWFkX21lbW9yeSk6IERvbid0IGRvIGFueXRoaW5nIGlmIGxlbmd0aCBpcyAwLgorCisJKiBNYWtlZmlsZTogQWRkZWQgcmVhZGxpbmUuYyB0byB0aGUgbGlzdCBvZiBmaWxlcyBzY3Jld2VkIGJ5CisJaGF2aW5nIHRoZSBhbnNpIGlvY3RsLmggY29tcGlsYXRpb24gd2l0aCBnY2MuCisKKwkqIGNvbmZpZy5nZGI6IEFkZGVkIHN1bjRvczMgJiBzdW40LW9zMyBhcyBhdmFpbGlibGUgb3B0aW9ucy4KKworV2VkIEp1biAyOCAwMjowMToyNiAxOTg5ICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBjb21tYW5kLmMgKGxvb2t1cF9jbWQpOiBBZGQgaWdub3JlX2hlbHBfY2xhc3NlcyBhcmd1bWVudC4KKwkobG9va3VwX2NtZF8xKTogQWRkIGlnbm9yZV9oZWxwX2NsYXNzZXMgYXJndW1lbnQuCisJY29tbWFuZC5jLCBtYWluLmM6IENoYW5nZSBjYWxsZXJzIG9mIGxvb2t1cF9jbWR7LF8xfSB0byBzdXBwbHkKKyAgICAgICAgdmFsdWUgZm9yIGlnbm9yZV9oZWxwX2NsYXNzZXMuCisKK1R1ZSBKdW4gMjcgMTg6MDE6MzEgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogdXRpbHMuYyAocHJpbnRfc3BhY2VzX2ZpbHRlcmVkKTogTWFkZSBtb3JlIGVmZmljaWVudC4KKwkqIGRlZnMuaDogRGVjbGFyYXRpb24uCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnQpOiBVc2VkIGluIGEgY291cGxlIG9mIG5ldyBwbGFjZXMuCisKK01vbiBKdW4gMjYgMTg6Mjc6MjggMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGdsdXRldXMuYWkubWl0LmVkdSkKKworCSogbTY4ay1waW5zbi5jIChwcmludF9pbnNuX2FyZyBbJyMnLCAnXiddKTogQ29tYmluZWQgdGhlbSBpbnRvIG9uZQorCWNhc2Ugd2hpY2ggYWx3YXlzIGdldHMgdGhlIGFyZ3VtZW50IGZyb20gdGhlIHdvcmQgaW1tZWRpYXRlbHkKKwlmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9uLgorCShwcmludF9pbnNuX2FyZyBbIltsTF13Il0pOiBNYWtlIHN1cmUgdG8gYWx3YXlzIGdldCB0aGUgcmVnaXN0ZXIKKwltYXNrIGZyb20gdGhlIHdvcmQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBpbnN0cnVjdGlvbi4KKworU3VuIEp1biAyNSAxOToxNDo1NiAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgZ2FsYXBhcy5haS5taXQuZWR1KQorCisJKiBNYWtlZmlsZTogQWRkZWQgaHAtaW5jbHVkZSBiYWNrIGluIGFzIHNvbWV0aGluZyB0byBkaXN0cmlidXRlLgorCisJKiBzdGFjay5jIChwcmludF9ibG9ja19mcmFtZV9sb2NhbHMpOiBSZXR1cm4gdmFsdWUgY2hhbmdlZCBmcm9tCisJdm9pZCB0byBpbnQ7IHJldHVybiAxIGlmIHZhbHVlcyBwcmludGVkLiAgVXNlIF9maWx0ZXJlZC4KKwkocHJpbnRfZnJhbWVfbG9jYWxfdmFycyk6IFVzZSByZXR1cm4gdmFsdWUgZnJvbQorCXByaW50X2Jsb2NrX2ZyYW1lX2xvY2FscyB0byBtZW50aW9uIGlmIG5vdGhpbmcgcHJpbnRlZDsgbWVudGlvbgorCWxhY2sgb2Ygc3ltYm9sIHRhYmxlLCB1c2UgX2ZpbHRlcmVkLgorCShwcmludF9mcmFtZV9hcmdfdmFycyk6IFRlbGwgdGhlIHVzZXIgaWYgbm8gc3ltYm9sIHRhYmxlCisJb3Igbm8gdmFsdWVzIHByaW50ZWQuICBVc2UgZnByaW50Zl9maWx0ZXJlZCBpbnN0ZWFkIG9mIGZwcmludGYuCisJKiBibG9ja2ZyYW1lLmMgKGdldF9wcmV2X2ZyYW1lX2luZm8pOiBDaGVjayBmb3Igbm8gaW5mZXJpb3Igb3IKKwljb3JlIGZpbGUgYmVmb3JlIGNyYXNoaW5nLgorCisJKiBpbmZsb3cuYyAoaW5mZXJpb3JfZGllZCk6IFNldCBjdXJyZW50IGZyYW1lIHRvIHplcm8gdG8ga2VlcCBmcm9tCisJbG9va2luZyBsaWtlIHdlJ3JlIGluIHN0YXJ0LgorCitTYXQgSnVuIDI0IDE1OjUwOjUzIDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBnbHV0ZXVzLmFpLm1pdC5lZHUpCisKKwkqIHN0YWNrLmMgKGZyYW1lX2NvbW1hbmQpOiBBZGRlZCBhIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlCisJd2FzIGFuIGluZmVyaW9yIG9yIGEgY29yZSBmaWxlLgorCisJKiBleHByZWFkLnkgKHl5bGV4KTogQWxsb3cgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBvZiB0aGUgZm9ybSAiLjUiCisJdG8gYmUgcGFyc2VkLgorCisgICAgICAgIENoYW5nZXMgYnkgRGF2aWQgVGF5bG9yIGF0IFRNQzoKKwkqIG5zMzJrLXBpbnNuLmM6IEFkZGVkIGRlZmluZSBmb3IgP2Zsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yPyBhbmQKKwl0YWJsZXMgZm9yIHJlZ2lzdGVyIG5hbWVzIHRvIGJlIHVzZWQgZm9yIGVhY2ggb2YgdGhlIHBvc3NpYmlsaXRpZXMuCisJKGxpc3Rfc2VhcmNoKTogQ3JlYXRlZDsgc2VhcmNoZXMgYSBsaXN0IG9mIG9wdGlvbnMgZm9yIGEgc3BlY2lmaWMKKwl2YWx1ZS4KKwkocHJpbnRfaW5zbl9hcmcpOiBBZGRlZCAnUScsICdiJywgJ00nLCAnUCcsICdnJywgYW5kICdHJyBvcHRpb25zCisJdG8gdGhlIHZhbHVlIGxvY2F0aW9uIHN3aXRjaC4KKwkqIG5zMzJrLW9wY29kZS5oOiBBZGRlZCBzZXZlcmFsIG5ldyBsb2NhdGlvbiBmbGFncy4KKwlbYWRkciwgZW50ZXIsIGV4aXQsIGV4dFtid2RdLCBleHRzW2J3ZF0sIGxtciwgbHByW2J3ZF0sIHJlc3RvcmUsCisJcmV0dCwgc3ByW2J3ZF0sIHNtcl06IEltcHJvdmVkIGluc24gZm9ybWF0IG91dHB1dC4KKworCSogc3ltdGFiLmMgKGxpc3Rfc3ltYm9scyk6IFJlYXJyYW5nZSBwcmludGluZyB0byBwcm9kdWNlIHJlYWRhYmxlCisJb3V0cHV0IGZvciAiaW5mbyB0eXBlcyIuCisKKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwX2Zvcl9hZGRyZXNzKTogRml4ZWQgdHlwby4KKworCSogZGJ4cmVhZC5jIChyZWFkX3R5cGUpOiBEb24ndCBvdXRwdXQgYW4gZXJyb3IgbWVzc2FnZSB3aGVuCisJdGhlcmUgaXNuJ3QgYSAnLCcgYWZ0ZXIgYSBjcm9zcy1yZWZlcmVuY2UuCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogI2lmJ2Qgb3V0IE5fRk4gY2FzZSBpbgorCXJlYWRfZGJ4X3N5bXRhYiBpZiBpdCBoYXMgdGhlIEVYVCBiaXQgc2V0IChvdGhlcndpc2UgbXVsdGlwbGUKKwljYXNlcyB3aXRoIHRoZSBzYW1lIHZhbHVlKS4KKworRnJpIEp1biAyMyAxMzoxMjowOCAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgcGxhbnRhcmlzLmFpLm1pdC5lZHUpCisKKwkqIHN5bW1pc2MuYzogQ2hhbmdlZCBkZWNsIG9mIHByaW50X3NwYWNlcyBmcm9tIHN0YXRpYyB0byBleHRlcm4KKwkoc2luY2UgaXQncyBkZWZpbmVkIGluIHV0aWxzLmMpLgorCisJKiByZW1vdGUuYyAocmVtb3RlX29wZW4pOiBDbG9zZSByZW1vdGVfZGVzYyBpZiBpdCdzIGFscmVhZHkgYmVlbgorCW9wZW5lZC4gCisKKwkqIFJlbW90ZV9NYWtlZmlsZSwgcmVtb3RlX2d1dGlscy5jLCByZW1vdGVfaW5mbG93LmMsCisJcmVtb3RlX3NlcnZlci5jLCByZW1vdGVfdXRpbHMuYzogQ29tYmluZWQgaW50byByZW1vdGUtbXVsdGkuc2hhci4KKwkqIHJlbW90ZS1tdWx0aS5zaGFyOiBDcmVhdGVkIChWaWtyYW0gS29rYSdzIHJlbW90ZSBzdHViKS4KKwkqIHJlbW90ZS1zYS5tNjhrLnNoYXI6IENyZWF0ZWQgKEdsZW5uIEVuZ2VsJ3MgcmVtY29tLmMpLgorCSogUkVBRE1FOiBVcGRhdGVkIHRvIHJlZmxlY3QgbmV3IG9yZ2FuaXphdGlvbiBvZiByZW1vdGUgc3R1YnMuCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogUHV0IGFuIE5fRk4gaW4gd2l0aCBOX0ZOIHwgTl9FWFQgdG8KKwlhY2NvdW50IGZvciB0aG9zZSBtYWNoaW5lcyB3aGljaCBkb24ndCB1c2UgdGhlIGV4dGVybmFsIGJpdCBoZXJlLgorCVNpZ2guIAorCisJKiBtLXN5bW1ldHJ5Lmg6IERlZmluZWQgTk9fU0lHSU5URVJSVVBULgorCitUaHUgSnVuIDIyIDEyOjUxOjM3IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIHByaW50Y21kLmMgKGRlY29kZV9mb3JtYXQpOiBNYWtlIHN1cmUgY2hhcmFjdGVycyBhcmUgcHJpbnRlZAorCXVzaW5nIGEgYnl0ZSBzaXplLgorCisJKiB1dGlscy5jIChlcnJvcik6IEFkZGVkIGEgdGVybWluYWxfb3VycyBoZXJlLgorCisJKiBzdGFjay5jIChsb2NhbHNfaW5mbyk6IEFkZGVkIGNoZWNrIGZvciBzZWxlY3RlZCBmcmFtZS4KKworCSogZGJ4cmVhZC5jIChyZWFkX3R5cGUpOiBDaGVja2VkIHRvIG1ha2Ugc3VyZSB0aGF0IGEgIiwiIHdhcworCWFjdHVhbGx5IGZvdW5kIGluIHRoZSBzeW1ib2wgdG8gZW5kIGEgY3Jvc3MgcmVmZXJlbmNlLgorCitXZWQgSnVuIDIxIDEwOjMwOjAxIDE5ODkgIFJhbmR5IFNtaXRoICAocmFuZHkgYXQgdGFydGFydXMudWNoaWNhZ28uZWR1KQorCisJKiBleHByZWFkLnkgKHBhcnNlX251bWJlciwgW2V4cF0pOiBBbGxvd2VkIGZvciB0aGUgcmV0dXJuIG9mIGEKKwludW1iZXIgbWFya2VkIGFzIHVuc2lnbmVkOyB0aGlzIHdpbGwgYWxsb3cgaW5jbHVzaW9uIG9mIHVuc2lnbmVkCisJY29uc3RhbnRzLiAKKworCSogc3ltdGFiLmg6IFB1dCBpbiBkZWZhdWx0IGRlZmluaXRpb25zIGZvciBCVUlMVElOX1RZUEVfTE9OR0VTVAorCWFuZCBCVUlMVElOX1RZUEVfVU5TSUdORURfTE9OR0VTVC4KKworCSogZXhwcmVhZC55IChwYXJzZV9udW1iZXIpOiBXaWxsIG5vdyBhY2NlcHQgaW50ZWdlcnMgc3VmZml4ZWQgd2l0aAorCWEgJ3UnICh0aG91Z2ggZG9lcyBub3RoaW5nIHNwZWNpYWwgd2l0aCBpdCkuCisKKwkqIHZhbGFyaXRoLmMgKHZhbHVlX2Jpbm9wKTogQWRkZWQgY2FzZXMgdG8gZGVhbCB3aXRoIHVuc2lnbmVkCisJYXJpdGhtZXRpYyBjb3JyZWN0bHkuCisKK1R1ZSBKdW4gMjAgMTQ6MjU6NTQgMTk4OSAgUmFuZHkgU21pdGggIChyYW5keSBhdCB0YXJ0YXJ1cy51Y2hpY2Fnby5lZHUpCisKKwkqIGRieHJlYWQuYyAocHN5bXRhYl90b19zeW10YWJfMSk6IENoYW5nZWQgcmVhZGluZyBpbiBpbmZvIG1lc3NhZ2UKKwl0byBnbyB0aHJvdWdoIHByaW50Zl9maWx0ZXJlZC4KKworCSogc3ltdGFiLmMgKGxpc3Rfc3ltYm9scyk6IFBsYWNlZCBoZWFkZXIgbWVzc2FnZSBhZnRlciBhbGwgY2FsbHMKKwl0byBwc3ltdGFiX3RvX3N5bXRhYi4gCisKKwkqIHN5bXRhYi5jIChzbWFzaF90b197ZnVuY3Rpb24sIHJlZmVyZW5jZSwgcG9pbnRlcn1fdHlwZSk6IENhcnJpZWQKKwlhdHRyaWJ1dGUgb2YgcGVybWFuZW5jZSBmb3IgdGhlIHR5cGUgYmVpbmcgc21hc2hlZCBvdmVyIHRoZSBiemVybworCWFuZCBhbGxvd2VkIGFueSB0eXBlIHRvIHBvaW50IGF0IHRoaXMgb25lIGlmIGl0IGlzIHBlcm1hbmVudC4KKworCSogc3ltdGFiLmMgKHNtYXNoX3RvX3tmdW5jdGlvbiwgcmVmZXJlbmNlLCBwb2ludGVyfV90eXBlKTogRml4CisJdHlwbzogY2hlY2sgZmxhZ3Mgb2YgdG9fdHlwZSBpbnN0ZWFkIG9mIHR5cGUuCisKKwkqIG0taHA5azMyMC5oOiBDaGFuZ2VkIGNoZWNrIG9uIF9fR05VX18gcHJlZGVmaW5lIHRvIF9fR05VQ19fLgorCisJKiBNYWtlZmlsZTogTWFkZSBNVU5DSF9ERUZJTkUgc2VwZXJhdGUgYW5kIGJhc2VkIG9uIFNZU1ZfREVGSU5FOworCXRoZXkgYXJlbid0IHRoZSBzYW1lIG9uIGhwJ3MuCisKK01vbiBKdW4gMTkgMTc6MTA6MTYgMTk4OSAgUmFuZHkgU21pdGggIChyYW5keSBhdCB0YXJ0YXJ1cy51Y2hpY2Fnby5lZHUpCisKKwkqIE1ha2VmaWxlOiBGaXhlZCB0eXBvLgorCisJKiB2YWxvcHMuYyAoY2FsbF9mdW5jdGlvbik6IEVycm9yIGlmIHRoZSBpbmZlcmlvciBoYXMgbm90IGJlZW4KKwlzdGFydGVkLiAKKworCSogbnMzMmstb3Bjb2RlLmggW2NoZWNrW3djXSwgY21wbVtid2RdLCBtb3ZtW2J3ZF0sIHNrcHNiXTogRml4ZWQKKwl0eXBvcy4gCisKK0ZyaSBKdW4gIDkgMTY6MjM6MDQgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogbS1uZXdzLmggW05PX1NJR0lOVEVSUlVQVF06IERlZmluZWQuCisKKwkqIGRieHJlYWQuYyAocmVhZF90eXBlKTogU3RhcnQgY29weSBvZiB1bmRlZmluZWQgc3RydWN0dXJlIG5hbWUKKwlwYXN0IFtzdWVdIGRlZmluaW5nIHR5cGUgb2YgY3Jvc3MgcmVmLgorCisJKiBkYnhyZWFkLmMgKHByb2Nlc3Nfb25lX3N5bWJvbCk6IENoYW5nZWQgc3RyY2hyIHRvIGluZGV4LgorCisJKiBuczMyay1vcGNvZGUuaCwgbnMzMmstcGluc24uYzogTW9yZSBjaGFuZ2VzIHRvIG51bWJlciBvZgorCW9wZXJhbmRzLCBhZGRpdGlvbiBvZiBhbGwgb2YgdGhlIHNldCBjb25kaXRpb24gb3Bjb2RlcywgYWRkaXRpb24KKwlvZiBzZXZlcmFsIGZsYWcgbGV0dGVycywgYWxsIHBhdHRlcm5lZCBhZnRlciB0aGUgZ2FzIGNvZGUuCisKKwkqIG5zMzJrLW9wY29kZS5oIFttb3Z7c3UsdXN9W2J3ZF0sIG9yW2J3ZF1dOiBDaGFuZ2VkIG51bWJlciBvZgorCW9wZXJhbmRzIGZyb20gMSB0byAyLgorCitXZWQgSnVuICA3IDE1OjA0OjI0IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIHN5bXNlZy5oIFtUWVBFX0ZMQUdfU1RVQl06IENyZWF0ZWQuCisJKiBkYnhyZWFkLmMgKHJlYWRfdHlwZSk6IFNldCBmbGFnIGJpdCBpZiB0eXBlIGlzIHN0dWIuCisJKGNsZWFudXBfdW5kZWZpbmVkX3R5cGVzKTogRG9uJ3QgbWFyayBpdCBhcyBhIHN0dWIgaWYgaXQncyBiZWVuCisJZGVmaW5lZCBzaW5jZSB3ZSBmaXJzdCBsZWFybmVkIGFib3V0IGl0LgorCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogUHJpbnQgb3V0IGEgbWVzc2FnZSB0byB0aGF0IGVmZmVjdCBpZgorCXRoaXMgdHlwZSBpcyBlbmNvdW50ZXJlZC4KKworCSogc3ltc2VnLmgsIHN5bXRhYi5oOiBNb3ZlZCB0aGUgZGVmaW5pdGlvbiBvZiBUWVBFX0ZMQUdfUEVSTSBvdmVyCisJdG8gc3ltc2VnLmggc28gdGhhdCBhbGwgc3VjaCBkZWZpbml0aW9ucyB3b3VsZCBiZSBpbiB0aGUgc2FtZSBwbGFjZS4KKworCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogUHJpbnQgb3V0IDxObyBkYXRhIGZpZWxkcz4gZm9yIGEKKwlzdHJ1Y3R1cmUgaWYgdGhlcmUgYXJlbid0IGFueS4KKworCSogZGJ4cmVhZC5jIChyZWFkX3R5cGUpOiBTZXQgdHlwZSBuYW1lIG9mIGEgY3Jvc3MgcmVmZXJlbmNlIHR5cGUKKwl0byAic3RydWN0IHdoYXRldmVyIiBvciBzb21ldGhpbmcuCisKK1R1ZSBKdW4gIDYgMTk6NDA6NTIgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50XzEpOiBQcmludCBvdXQgc3ltYm9saWMgbG9jYXRpb24gb2YKKwlicmVha3BvaW50cyBmb3Igd2hpY2ggdGhlcmUgYXJlIG5vIGRlYnVnZ2luZyBzeW1ib2xzLgorCitNb24gSnVuICA1IDE1OjE0OjUxIDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGNvbW1hbmQuYyAoaGVscF9jbWRfbGlzdCk6IE1hZGUgbGluZV9zaXplIHN0YXRpYy4KKworU2F0IEp1biAgMyAxNzozMzo0NSAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBNYWtlZmlsZTogRG9uJ3QgaW5jbHVkZSB0aGUgYmludXRpbHMgaHAtaW5jbHVkZSBkaXJlY3RvcnkgaW4gdGhlCisJZGlzdHJpYnV0aW9uIGFueW1vcmU7IHJlZmVyIHRoZSB1c2VycyB0byB0aGUgYmludXRpbHMgZGlzdHJpYnV0aW9uLgorCitUaHUgSnVuICAxIDE2OjMzOjA3IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIHByaW50Y21kLmMgKGRpc2FibGVfZGlzcGxheV9jb21tYW5kKTogRml4ZWQgbG9vcCBpdGVyYXRpb24gZm9yCisJbm8gYXJnIGNhc2UuCisKKwkqIHByaW50Y21kLmMgKGRpc2FibGVfZGlzcGxheV9jb21tYW5kKTogQWRkZWQgZnJvbV90dHkgcGFyYW1ldGVyCisJdG8gZnVuY3Rpb24uCisKKwkqIHZhbG9wcy5jICh2YWx1ZV9vZl92YXJpYWJsZSk6IENhbGwgcmVhZF92YXJfdmFsdWUgd2l0aCAwIGNhc3QgdG8KKwlGUkFNRSBpbnN0ZWFkIG9mIENPUkVfQUREUi4KKworCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiBDb3JyZWN0ZWQgbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvCisJdmFsdWVfc3Vic2NyaXB0ICh0byAyKS4KKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKSwgc3ltdGFiLmMgKGRlY29kZV9saW5lXzEpLAorCW0tY29udmV4Lmg6IENoYW5nZWQgbmFtZSBvZiBGSVJTVExJTkVfREVCVUdfQlJPS0VOIHRvCisJUFJPTE9HVUVfRklSU1RMSU5FX09WRVJMQVAuIAorCisJKiBtLW1lcmxpbi5oOiBGaXhlZCB0eXBvLgorCSogbnMzMmstb3Bjb2RlLmg6IEFkZGVkIG5zMzIzODEgb3Bjb2RlcyBhbmQgImNpbnYiIGluc24sIGFuZCBmaXhlZAorCWVycm9ycyBpbiBtb3ZtW3dkXSwgcmV0dCwgYW5kIHNmc3IuCisKKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwLCBldmFsdWF0ZV9zdWJleHBfZm9yX2FkZHJlc3MpLCB2YWxvcHMuYworCSh2YWx1ZV96ZXJvKTogQ2hhbmdlIHZhbHVlX3plcm8gb3ZlciB0byB0YWtpbmcgdHdvIGFyZ3VtZW50cworCWluc3RlYWQgb2YgdGhyZWUuCisKKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKQorCSAgW09QX1ZBUl9WQUxVRV06IEdldCBjb3JyZWN0IGx2YWwgdHlwZSBmb3IgQVZPSURfU0lERV9FRkZFQ1RTIGZvcgorCSAgYWxsIHR5cGVzIG9mIHN5bWJvbHMuCisJICBbQklOT1BfRElWXTogRG9uJ3QgZGl2aWRlIGlmIGF2b2lkaW5nIHNpZGUgZWZmZWN0czsganVzdCByZXR1cm4KKwkgIGFuIG9iamVjdCBvZiB0aGUgY29ycmVjdCB0eXBlLgorCSAgW0JJTk9QX1JFUEVBVF06IERvbid0IGNhbGwgdmFsdWVfcmVwZWF0LCBqdXN0IGFsbG9jYXRlIGEKKwkgIHJlcGVhdGVkIHZhbHVlLgorCShldmFsdWV0ZV9zdWJleHBfZm9yX2FkZHJlc3MpIFtPUF9WQVJfVkFMVUVdOiBKdXN0IHJldHVybiBhIHRoaW5nCisJb2YgdGhlIHJpZ2h0IHR5cGUgKGFmdGVyIGNoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBhbGxvd2VkCisJdG8gdGFrZSB0aGUgYWRkcmVzcyBvZiB3aGF0ZXZlciB2YXJpYWJsZSBoYXMgYmVlbiBwYXNzZWQpLgorCitNb24gTWF5IDI5IDExOjAxOjAyIDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBnYWxhcGFzLmFpLm1pdC5lZHUpCisKKwkqIGJyZWFrcG9pbnQuYyAodW50aWxfYnJlYWtfY29tbWFuZCk6IFNldCB0aGUgYnJlYWtwb2ludCB3aXRoIGEKKwlmcmFtZSBzcGVjaWZpY2F0aW9uIHNvIHRoYXQgaXQgd29uJ3QgdHJpcCBpbiBpbmZlcmlvciBjYWxscyB0byB0aGUKKwlmdW5jdGlvbi4gIEFsc28gc2V0IHRoaW5ncyB1cCBzbyB0aGF0IGl0IHdvcmtzIGJhc2VkIG9uIHNlbGVjdGVkCisJZnJhbWUsIG5vdCBjdXJyZW50IG9uZS4KKworU3VuIE1heSAyOCAxNTowNTozMyAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBldmFsLmMgKGV2YWx1ZV9zdWJleHApOiBDaGFuZ2Ugc3Vic2NyaXB0IGNhc2UgdG8gdXNlIHZhbHVlX3plcm8KKwlpbiBFVkFMX0FWT0lEX1NJREVfRUZGRUNUUyBjYXNlLgorCitGcmkgTWF5IDI2IDEyOjAzOjU2IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYyAocmVhZF9hZGRsX3N5bXMsIHBzeW10YWJfdG9fc3ltdGFiKTogUmVtb3ZlZAorCWNsZWFudXBfdW5kZWZpbmVkX3R5cGVzOyB0aGlzIG5lZWRzIHRvIGJlIGRvbmUgb24gYSBzeW10YWIgYmFzaXMuCisJKGVuZF9zeW10YWIpOiBDYWxsZWQgY2xlYW51cF91bmRlZmluZWRfdHlwZXMgZnJvbSBoZXJlLgorCShjbGVhbnVwX3VuZGVmaW5lZF90eXBlcyk6IE5vIGxvbmdlciB1c2VzIGxvb2t1cF9zeW1ib2wgKGJyYWluCisJZGVhZCBpZGVhOyBvaCwgd2VsbCksIG5vdyBpdCBzZWFyY2hlcyB0aHJvdWdoIGZpbGVfc3ltYm9scy4KKworV2VkIE1heSAyNCAxNTo1Mjo0MyAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgZ2FsYXBhcykKKworCSogc291cmNlLmMgKHNlbGVjdF9zb3VyY2Vfc3ltdGFiKTogT25seSBydW4gdGhyb3VnaAorCXBhcnRpYWxfc3ltdGFiX2xpc3QgaWYgaXQgZXhpc3RzLgorCisJKiBjb2ZmcmVhZC5jIChyZWFkX2NvZmZfc3ltdGFiKTogRG9uJ3QgdW5yZWNvcmQgYSBtaXNjIGZ1bmN0aW9uCisJd2hlbiBhIGZ1bmN0aW9uIHN5bWJvbCBpcyBzZWVuIGZvciBpdC4KKworCSogZXhwcmVhZC55IFt2YXJpYWJsZV06IE1ha2Ugc3VyZSB0byB3cml0ZSBhIHR5cGUgZm9yIG1lbXZhbHMgaWYKKwl5b3UgZG9uJ3QgZ2V0IGEgbWZ0IHlvdSByZWNvZ25pemUuCisKK1R1ZSBNYXkgMjMgMTI6MTU6NTcgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IHBsYW50YXJpcy5haS5taXQuZWR1KQorCisJKiBkYnhyZWFkLmMgKHJlYWRfb2ZpbGVfc3ltdGFiLCBwc3ltdGFiX3RvX3N5bXRhYik6IE1vdmVkIGNsZWFudXAKKwlvZiB1bmRlZmluZWQgdHlwZXMgdG8gcHN5bXRhYl90b19zeW10YWIuICBUaGF0IHdheSBpdCB3aWxsIGJlCisJY2FsbGVkIG9uY2UgZm9yIGFsbCByZWFkaW5zICh3aGljaCB3aWxsLCBhbW9uZyBvdGhlciB0aGluZ3MsCisJaGVscCByZWR1Y2UgaW5maW5pdGUgbG9vcHMpLgorCisJKiBzeW10YWIuaCBbbWlzY19mdW5jdGlvbl90eXBlXTogRm9yY2VkIG1mX3Vua25vd24gdG8gMC4KKwkqIGRieHJlYWQuYyAocmVjb3JkX21pc2NfZnVuY3Rpb24pOiBDYXN0IGVudW0gdG8gdW5zaWduZWQgY2hhciAodG8KKwlmaXQpLgorCSogZXhwcmVhZC55IFt2YXJpYWJsZV06IENhc3QgdW5zaWduZWQgY2hhciBiYWNrIHRvIGVudW0gdG8gdGVzdC4KKworTW9uIE1heSAyMiAxMzowODoyNSAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgZ2x1dGV1cy5haS5taXQuZWR1KQorCisgICAgICAgIFBhdGNoZXMgYnkgSm9obiBHaWxtb3JlIGZvciBkZWFsaW5nIHdlbGwgd2l0aCBmbG9hdGluZyBwb2ludDoKKwkqIGZpbmR2YXIuYyAodmFsdWVfZnJvbV9yZWdpc3RlciwgbG9jYXRlX3Zhcl92YWx1ZSk6IFVzZWQKKwlCWVRFU19CSUdfRU5ESUFOIGluc3RlYWQgb2YgYW4gaW5saW5lIHRlc3QuCisJKiBtLXNwYXJjLmggW0lFRUVfRkxPQVRdOiBDcmVhdGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIHNwYXJjIGlzCisJSUVFRSBjb21wYXRpYmxlLgorCSogcHJpbnRjbWQuYyAocHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCk6IFVzZSBCWVRFU19CSUdfRU5ESUFOIGFuZAorCXRoZSBzdHJlYW0gYXJndW1lbnQgZm9yIHByaW50aW5nOyBhbHNvIG1vZGlmeSBkZWZhdWx0IHR5cGUgZm9yCisJJ2YnLiAgQ2hhbmdlIGhhbmRsaW5nIG9mIGludmFsaWQgZmxvYXRzOyBjaGFuZ2VkIGNhbGwgc3ludGF4IGZvcgorCWlzX25hbi4KKwkocHJpbnRfY29tbWFuZCk6IERvbid0IHByaW50IG91dCBhbnl0aGluZyBpbmRpY2F0aW5nIHRoYXQKKwlzb21ldGhpbmcgd2FzIHJlY29yZGVkIG9uIHRoZSBoaXN0b3J5IGxpc3QgaWYgaXQgd2Fzbid0LgorCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogRml4ZWQgdG8gZGVhbCBwcm9wZXJsZXkgd2l0aCBuZXcgZm9ybWF0CisJb2YgaXNfbmFuIGFuZCB1bnBhY2tpbmcgZG91YmxlcyB3aXRob3V0IGVycm9ycyBvY2N1cmluZy4KKwkoaXNfbmFuKTogQ2hhbmdlZCBhcmd1bWVudCBsaXN0IGFuZCBob3cgaXQgZmlndXJlcyBiaWcgZW5kaWFubmVzcworCSh1c2VzIG1hY3JvcykuCisJKiB2YWx1ZXMuYyAocmVjb3JkX2xhdGVzdF92YWx1ZSk6IFJldHVybiAtMSBhbmQgZG9uJ3QgcmVjb3JkIGlmCisJaXQncyBhbiBpbnZhbGlkIGZsb2F0LgorCSh2YWx1ZV9hc19kb3VibGUpOiBDaGFuZ2VkIHRvIHVzZSBuZXcgdW5wYWNrX2RvdWJsZSBjYWxsaW5nCisJY29udmVudGlvbi4KKwkodW5wYWNrX2RvdWJsZSk6IENoYW5nZWQgbm90IHRvIGNhbGwgZXJyb3IgaWYgdGhlIGZsb2F0IHdhcworCWludmFsaWQ7IHNpbXBseSB0byBzZXQgaW52cCBhbmQgcmV0dXJuLiAgQ2hhbmdlZCBjYWxsaW5nIHN5bnRheC4KKwkodW5wYWNrX2ZpZWxkX2FzX2xvbmcsIG1vZGlmeV9maWVsZCk6IENoYW5nZWQgdG8gdXNlCisJQklUU19CSUdfRU5ESUFOIHRvIGRldGVybWluZSBjb3JyZWN0IGFjdGlvbi4KKworCSogbS1ocDlrMzIwLmggW0hQX09TX0JVR106IENyZWF0ZWQ7IGRlYWxzIHdpdGggcHJvYmxlbSB3aGVyZSBhCisJdHJhcCBoYXBwZW5zIGFmdGVyIGEgY29udGludWUuCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBVc2VkLgorCisJKiBtLWNvbnZleC5oIFtGSVJTVExJTkVfREVCVUdfQlJPS0VOXTogRGVmaW5lZCBhIGZsYWcgdG8gaW5kaWNhdGUKKwl0aGF0IHRoZSBkZWJ1Z2dpbmcgc3ltYm9scyBvdXRwdXQgYnkgdGhlIGNvbXBpbGVyIGZvciB0aGUgZmlyc3QKKwlsaW5lIG9mIGEgZnVuY3Rpb24gd2VyZSBicm9rZW4uCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpLCBzeW10YWIuYyAoZGVjb2RlX2xpbmVfMSk6IFVzZWQuCisJCisJKiBnZGIudGV4aW5mbyBbRGF0YSwgTWVtb3J5XTogTWlub3IgY2xlYW51cHMgb2YgcGhyYXNpbmcuCisKK0ZyaSBNYXkgMTkgMDA6MTY6NTkgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jIChhZGRfdW5kZWZpbmVkX3R5cGUsIGNsZWFudXBfdW5kZWZpbmVkX3R5cGVzKTogQ3JlYXRlZAorCXRvIGtlZXAgYSBsaXN0IG9mIGNyb3NzIHJlZmVyZW5jZXMgdG8gYXMgeWV0IHVuZGVmaW5lZCB0eXBlcy4KKwkocmVhZF90eXBlKTogQ2FsbCBhZGRfdW5kZWZpbmVkX3R5cGUgd2hlbiB3ZSBydW4gaW50byBzdWNoIGEgY2FzZS4KKwkocmVhZF9hZGRsX3N5bXMsIHJlYWRfb2ZpbGVfc3ltdGFiKTogQ2FsbCBjbGVhbnVwX3VuZGVmaW5lZF90eXBlcworCXdoZW4gd2UncmUgZG9uZS4KKworCSogZGJ4cmVhZC5jIChwc3ltdGFiX3RvX3N5bXRhYiwgcHN5bXRhYl90b19zeW10YWJfMSk6IEJyb2tlCisJcHN5bXRhYl90b19zeW10YWIgb3V0IGludG8gdHdvIHJvdXRpbmVzOyBtYWRlIHN1cmUgdGhlIHN0cmluZworCXRhYmxlIHdhcyBvbmx5IHJlYWRpbiBvbmNlIGFuZCB0aGUgZ2xvYmFscyB3ZXJlIG9ubHkgc2Nhbm5lZCBvbmNlLAorCWZvciBhbnkgbnVtYmVyIG9mIGRlcGVuZGVuY2llcy4KKworVGh1IE1heSAxOCAxOTo1OToxOCAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBtLSouaDogRGVmaW5lZCAob3Igbm90LCBhcyBhcHByb3ByaWF0ZSBwZXIgbWFjaGluZSkKKwlCSVRTX0JJR19FTkRJQU4sIEJZVEVTX0JJR19FTkRJQU4sIGFuZCBXT1JEU19CSUdfRU5ESUFOLgorCitXZWQgTWF5IDE3IDEzOjM3OjQ1IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIG1haW4uYyAoc3ltYm9sX2NvbXBsZXRpb25fZnVuY3Rpb24pOiBBbHdheXMgY29tcGxldGUgb24gcmVzdWx0CisJY29tbWFuZCBsaXN0LCBldmVuIGlmIGV4YWN0IG1hdGNoIGZvdW5kLiAgSWYgaXQncyByZWFsbHkgYW4gZXhhY3QKKwltYXRjaCwgaXQnbGwgZmluZCBpdCBhZ2FpbjsgaWYgdGhlcmUncyBzb21ldGhpbmcgbG9uZ2VyIHRoYW4gaXQsCisJaXQnbGwgZ2V0IHRoZSByaWdodCByZXN1bHQuCisKKwkqIHN5bXRhYi5jIChtYWtlX3N5bWJvbF9jb21wbGV0aW9uX2Z1bmN0aW9uKTogRml4ZWQgdHlwbzsgc3RyY21wCisJPT0+IHN0cm5jbXAuCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogQ2hhbmdlICdHJyBjYXNlIHRvIG1hcmsgc3ltYm9scyBhcworCUxPQ19FWFRFUk5BTC4gCisKKwkqIGV4cHJlYWQueSBbdmFyaWFibGVzXTogQ2hhbmdlZCBkZWZhdWx0IHR5cGUgb2YgdGV4dCBzeW1ib2xzIHRvCisJZnVuY3Rpb24gcmV0dXJuaW5nIGludCBzbyB0aGF0IG9uZSBjYW4gdXNlLCBlZy4gc3RyY21wLgorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBJbmNsdWRlIGEgc3BlY2lhbCBmbGFnIGluZGljYXRpbmcKKwl0aGF0IG9uZSBzaG91bGRuJ3QgaW5zZXJ0IHRoZSBicmVha3BvaW50cyBvbiB0aGUgbmV4dCBzdGVwIGZvcgorCXJldHVybmluZyBmcm9tIGEgc2lndHJhbXAgYW5kIGZvcmNpbmcgYXQgbGVhc3Qgb25lIG1vdmUgZm9yd2FyZC4gCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IENoYW5nZSB0ZXN0IGZvciBuZXh0aW5nIGludG8gYQorCWZ1bmN0aW9uIHRvIGNoZWNrIGZvciBjdXJyZW50IHN0YWNrIHBvaW50ZXIgaW5uZXIgdGhhbiBwcmV2aW91cworCXN0YWNrIHBvaW50ZXIuCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IENoZWNrIGZvciBzdGVwIHJlc3VtZSBicmVhaworCWFkZHJlc3MgYmVmb3JlIGRlYWxpbmcgd2l0aCBub3JtYWwgYnJlYWtwb2ludHMuCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IEFkZGVkIGEgY2FzZSB0byBkZWFsIHdpdGggdGFraW5nCisJYW5kIHBhc3NpbmcgYWxvbmcgYSBzaWduYWwgd2hlbiBzaW5nbGUgc3RlcHBpbmcgcGFzdCBicmVha3BvaW50cworCWJlZm9yZSBpbnNlcnRpbmcgYnJlYWtwb2ludHMuCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IEluc2VydGVkIHNwZWNpYWwgY2FzZSB0byBrZWVwCisJZ29pbmcgYWZ0ZXIgdGFraW5nIGEgc2lnbmFsIHdlIGFyZSBzdXBwb3NlZCB0byBiZSB0YWtpbmcuICAKKworVHVlIE1heSAxNiAxMjo0OTo1NSAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgZ2x1dGV1cy5haS5taXQuZWR1KQorCisJKiBpbmZsb3cuYyAodGVybWluYWxfb3Vyc18xKTogQ2FzdCByZXN1bHQgb2Ygc2lnbmFsIHRvIChpbnQKKwkoKikoKSkuIAorCisJKiBnZGIudGV4aW5mbzogTWFkZSBzdXJlIHRoYXQgcmVmZXJlbmNlcyB0byB0aGUgcHJvZ3JhbSB3ZXJlIGluCisJdXBwZXIgY2FzZS4gIE1vZGlmeSBkZXNjcmlwdGlvbiBvZiB0aGUgInNldCBwcm9tcHQiIGNvbW1hbmQuCisJW1J1bm5pbmddOiBDbGVhbmVkIHVwIGludHJvZHVjdGlvbi4KKwlbQXR0YWNoXTogQ2xlYW5lZCB1cC4KKwlbU3RlcHBpbmddOiBDaGFuZ2UgIlByb2NlZWQiIHRvICJDb250aW51ZSBydW5uaW5nIiBvciAiRXhlY3V0ZSIuCisJTWlub3IgY2xlYW51cC4KKwlbU291cmNlIFBhdGhdOiBDbGVhbmVkIHVwIGludHJvLiAgQ2xlYXJlZCB1cCBkaXN0aW5jdGlvbiBiZXR3ZWVuCisJdGhlIGV4ZWN1dGFibGUgc2VhcmNoIHBhdGggYW5kIHRoZSBzb3VyY2UgcGF0aC4gIFJlc3RhdGVkIGVmZmVjdAorCW9mIHRoZSAiZGlyZWN0b3J5IiBjb21tYW5kIHdpdGggbm8gYXJndW1lbnRzLgorCVtEYXRhXTogRml4ZWQgdHlwb3MgYW5kIHRyaXZpYWwgZGV0YWlscy4KKwlbU3RlcHBpbmddOiBGaXhlZCB1cCBleHBsYW5hdGlvbiBvZiAidW50aWwiLgorCisJKiBzb3VyY2UuYyAocHJpbnRfc291cmNlX2xpbmVzKTogUHJpbnQgdGhyb3VnaCBmaWx0ZXIuCisKKwkqIHByaW50Y21kLmMgKHhfY29tbWFuZCk6IElmIHRoZSBmb3JtYXQgd2l0aCB3aGljaCB0byBwcmludCBpcworCSJpIiwgdXNlIHRoZSBhZGRyZXNzIG9mIGFueXRoaW5nIHRoYXQgaXNuJ3QgYSBwb2ludGVyIGluc3RlYWQgb2YKKwl0aGUgdmFsdWUuICBUaGlzIGlzIGZvciwgZWcuICJ4LzEwaSBtYWluIi4KKworCSogZ2RiLnRleGluZm86IFVwZGF0ZWQgbGFzdCBtb2RpZmljYXRpb24gZGF0ZSBvbiBtYW51YWwuCisKK01vbiBNYXkgMTUgMTI6MTE6MzMgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogc3ltdGFiLmMgKGxvb2t1cF9zeW10YWIpOiBGaXhlZCB0eXBvIChuYW1lID09PiBjb3B5KSBpbiBjYWxsIHRvCisJbG9va3VwX3N5bXRhYl8xLiAKKworCSogZ2RiLnRleGluZm86IEFkZGVkIGRvY3VtZW50YXRpb24gZm9yICJicmVhayBbKy1dbiIgYW5kIGZvciBuZXcKKwlhY3Rpb25zIG9mICJkaXJlY3RvcnkiIGNvbW1hbmQgKHRha2luZyBtdWx0aXBsZSBkaXJlY3RvcnkgbmFtZXMgYXQKKwl0aGUgc2FtZSB0aW1lKS4KKworCSogbTY4ay1vcGNvZGUuaDogUmVwbGFjZWQgdGhlIHZlcnNpb24gaW4gZ2RiIHdpdGggYW4gdXAtdG8tZGF0ZQorCXZlcnNpb24gZnJvbSB0aGUgYXNzZW1ibGVyIGRpcmVjdG9yeS4KKwkqIG02OGstcGluc24uYyAocHJpbnRfaW5zbl9hcmcpOiBBZGRlZCBjYXNlcyAnbCcgJiAnTCcgdG8gc3dpdGNoCisJdG8gcHJpbnQgcmVnaXN0ZXIgbGlzdHMgZm9yIG1vdmVtIGluc3RydWN0aW9ucy4KKworCSogZGJ4cmVhZC5jLCBtLWNvbnZleC5oOiBNb3ZlZCBjb252ZXggZGVwZW5kZW50IGluY2x1ZGUgZmlsZXMgb3ZlcgorCWZyb20gZGJ4cmVhZC5jIHRvIG0tY29udmV4LmguCisKKwkqIHByaW50Y21kLmMgKGRpc2FibGVfZGlzcGxheSwgZGlzYWJsZV9kaXNwbGF5X2NvbW1hbmQpOiBDaGFuZ2VkCisJbmFtZSBvZiBmaXJzdCB0byBzZWNvbmQsIGFuZCBjcmVhdGVkIGZpcnN0IHdoaWNoIHRha2VzIGFuIGludCBhcworCWFyZyByYXRoZXIgdGhhbiBhIGNoYXIgcG9pbnRlci4gIENoYW5nZWQgc2Vjb25kIHRvIHVzZSBmaXJzdC4KKwkoX2luaXRpYWxpemVfcHJpbnRjbWQpOiBDaGFuZ2VkIHRvIHVzZSBzZWNvbmQgYXMgY29tbWFuZCB0byBjYWxsLgorCShkZWxldGVfY3VycmVudF9kaXNwbGF5LCBkaXNhYmxlX2N1cnJlbnRfZGlzcGxheSk6IENoYW5nZWQgbmFtZSBvZgorCWZpcnN0IHRvIHNlY29uZCwgYW5kIGNoYW5nZWQgZnVuY3Rpb25hbGl0eSB0byBtYXRjaC4KKwkqIGluZnJ1bi5jIChub3JtYWxfc3RvcCksIG1haW4uYyAocmV0dXJuX3RvX3RvcF9sZXZlbCk6IENoYW5nZWQgdG8gCisJY2FsbCBkaXNhYmxlX2N1cnJlbnRfZGlzcGxheS4KKworCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wsIHJlYWRfZGJ4X3N5bXRhYik6IENoYW5nZWQgTl9GTiB0bworCWJlIE5fRk4gfCBOX0VYVCB0byBkZWFsIHdpdGggbmV3IEJlcmtlbGV5IGRlZmluZTsgdGhpcyB3b3JrcyB3aXRoCisJZWl0aGVyIHRoZSBvbGQgb3IgdGhlIG5ldy4KKworCSogUmVtb3RlX01ha2VmaWxlLCByZW1vdGVfZ3V0aWxzLmMsIHJlbW90ZV9pbmZsb3cuYywKKwlyZW1vdGVfc2VydmVyLmMsIHJlbW90ZV91dGlscy5jOiBDcmVhdGVkLgorCSogTWFrZWZpbGU6IEluY2x1ZGVkIGluIHRhZyBhbmQgdGFyIGZpbGVzLgorCSogUkVBRE1FOiBJbmNsdWRlZCBhIG5vdGUgYWJvdXQgdGhlbS4KKworCSogcHJpbnRjbWQuYyAocHJpbnRfYWRkcmVzcyk6IFVzZSBmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gdG8KKwlyZW1vdmUgbmVlZCB0byByZWFkaW4gc3ltdGFicyBmb3Igc3ltYm9saWMgYWRkcmVzc2VzLiAgCisKKwkqIHNvdXJjZS5jIChkaXJlY3RvcnlfY29tbWFuZCk6IFJlcGxhY2VkIGZ1bmN0aW9uIHdpdGggbmV3IG9uZQorCXRoYXQgY2FuIGFjY2VwdCBsaXN0cyBvZiBkaXJlY3RvcmllcyBzZXBlcmF0ZWQgYnkgc3BhY2VzIG9yIDoncy4KKworCSogaW5mbG93LmMgKG5ld190dHkpOiBSZXBsYWNlZCBjYWxscyB0byBkdXAyIHdpdGggY2FsbHMgdG8gZHVwLgorCitTdW4gTWF5IDE0IDEyOjMzOjE2IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIHN0YWNrLmMgKGFyZ3NfaW5mbyk6IE1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGFuIGluZmVyaW9yIG9yIGNvcmUKKwlmaWxlIGJlZm9yZSB0YWtpbmcgYWN0aW9uLgorCisJKiBuczMyay1vcGNvZGUuaCBbZGVpdywgZGVpZF06IEZpeGVkIG1hY2hpbmUgY29kZSB2YWx1ZXMgZm9yIHRoZXNlCisJb3Bjb2Rlcy4KKworCSogZGJ4cmVhZC5jIChzY2FuX2ZpbGVfZ2xvYmFscyk6IE1vZGlmaWVkIHRvIHVzZSBtaXNjIGZ1bmN0aW9uCisJdmVjdG9yIGluc3RlYWQgb2YgZmlsZSBpdHNlbGYuICBLaWxsZWQgYWxsIGFyZ3VtZW50cyB0byB0aGUKKwlmdW5jaXRvbjsgbm8gbG9uZ2VyIG5lZWRlZC4KKwkocHN5bXRhYl90b19zeW10YWIpOiBDaGFuZ2VkIGNhbGwgZm9yIGFib3ZlIHRvIHJlZmxlY3QgbmV3ICh2b2lkKQorCWFyZ3VtZW50IGxpc3QuCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiLCApOiBNb3ZlZCBIQVNIX09GRlNFVCBkZWZpbmUgb3V0IG9mCisJcmVhZF9kYnhfc3ltdGFiLiAKKworCSogZXhwcmVhZC55IFt2YXJpYWJsZV06IENoYW5nZWQgZGVmYXVsdCB0eXBlIG9mIG1pc2MgZnVuY3Rpb24gaW4KKwl0ZXh0IHNwYWNlIHRvIGJlICh2b2lkICgpKS4KKworCSogTWFrZWZpbGU6IE1vZGlmaWVkIGZvciBwcm9wZXIgbnVtYmVyIG9mIHMvciBjb25mbGljdHMgKG9yZGVyIGlzCisJY29uZnVzaW5nOyB0aGUgbW9kIHRoYXQgbmVjZXNzaXRhdGVkIHRoaXMgY2hhbmdlIHdhcyBvbiBNYXkgMTJ0aCwKKwlub3QgdG9kYXkpLiAKKworCSogZXhwcmVhZC55ICh5eWxleCk6IEFkZGVkIFNJR05FRCwgTE9ORywgU0hPUlQsIGFuZCBJTlQga2V5d29yZHMuCisJW3R5cGVuYW1lXTogQ3JlYXRlZC4KKwlbdHlwZWJhc2VdOiBBZGRlZCBydWxlcyBmb3IgTE9ORywgTE9ORyBJTlQsIFNIT1JULCBTSE9SVCBJTlQsCisJU0lHTkVEIG5hbWUsIGFuZCBVTlNJR05FRCBuYW1lIChhIGdvb2QgYXBwcm94aW1hdGlvbiBvZiBhbnNpCisJc3RhbmRhcmQpLiAJCisKKwkqIE1ha2VmaWxlOiBJbmNsdWRlZCAuYy5vIHJ1bGUgdG8gYXZvaWQgc3VuJ3MgbWFrZSBmcm9tIHRocm93aW5nCisJYW55IGN1cnZlcyBhdCB1cy4KKworCSogYmxvY2tmcmFtZS5jOiBJbmNsdWRlZCA8b2JzdGFjay5oPgorCisJKiBjb21tYW5kLmMgKGxvb2t1cF9jbWQpOiBDbGVhciBvdXQgdHJhaWxpbmcgd2hpdGVzcGFjZS4KKworCSogY29tbWFuZC5jIChsb29rdXBfY21kXzEpOiBDaGFuZ2VkIG1hbGxvYyB0byBhbGxvY2EuICAKKwkKK0ZyaSBNYXkgMTIgMTI6MTM6MTIgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogcHJpbnRjbWQuYyAocHJpbnRfZnJhbWVfYXJncyk6IE9ubHkgcHJpbnQgbmFtZWxlc3MgYXJncyB3aGVuIHlvdQorCWtub3cgaG93IG1hbnkgYXJncyB0aGVyZSBhcmUgc3VwcG9zZWQgdG8gYmUgYW5kIHdoZW4geW91J3ZlCisJcHJpbnRlZCBmZXdlciB0aGFuIHRoZW0uICBEb24ndCBwcmludCBuYW1lbGVzcyBhcmdzIGJldHdlZW4KKwlwcmludGVkIGFyZ3MuCisKKwkqIHN5bXRhYi5jIChtYWtlX3N5bWJvbF9jb21wbGV0aW9uX2Z1bmN0aW9uKTogRml4ZWQgdHlwbyAoPSA9PT4KKwk9PSkuIAorCisJKiByZW1vdGUuYyAocmVtb3RlX29wZW4pOiBpZmRlZidkIG91dCBzaWdpbnRlcnJ1cHQgY2FsbCBieSAjaWZuZGVmCisJTk9fU0lHSU5URVJSVVBULgorCSogbS11bWF4Lmg6IERlZmluZWQgTk9fU0lHSU5URVJSVVBULgorCisJKiBleHByZWFkLnkgW3B0eXBlLCBhcnJheV9tb2QsIGZ1bmNfbW9kLCBkaXJlY3RfYWJzX2RlY2wsCisJYWJzX2RlY2xdOiAgQWRkZWQgcnVsZXMgZm9yIHBhcnNpbmcgYW5kIGNyZWF0aW5nIGFyYml0cmFyaWx5CisJc3RyYW5nZSB0eXBlcyBmb3IgY2FzdHMgYW5kIHNpemVvZnMuCisKKwkqIHN5bXRhYi5jLCBzeW10YWIuaCAoY3JlYXRlX2FycmF5X3R5cGUpOiBDcmVhdGVkLiAgU29tZSBtaW5vcgorCW1pc2ZlYXR1cmVzOyBzZWUgY29tbWVudHMgZm9yIGRldGFpbHMgKG1haW4gb25lIGJlaW5nIHRoYXQgeW91CisJbWlnaHQgZW5kIHVwIGNyZWF0aW5nIHR3byBhcnJheXMgd2hlbiB5b3Ugb25seSBuZWVkZWQgb25lKS4KKworVGh1IE1heSAxMSAxMzoxMTo0OSAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiB2YWxvcHMuYyAodmFsdWVfemVybyk6IEFkZCBhbiBhcmd1bWVudCBmb3IgdHlwZSBvZiBsdmFsLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHBfZm9yX2FkZHJlc3MpOiBUYWtlIGFkZHJlc3MgcHJvcGVybHkgaW4KKwl0aGUgYXZvaWQgc2lkZSBhZmZlY3RzIGNhc2UgKGllLiBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UgaGF2ZSBhbgorCWx2YWwgaW4gbWVtb3J5IGFuZCB3ZSBjYW4gdGFrZSB0aGUgYWRkcmVzcykuCisJKGV2YWx1YXRlX3N1YmV4cCk6IFNldCB0aGUgbHZhbCB0eXBlIG9mIGV4cHJlc3Npb25zIGNyZWF0ZWQgd2l0aAorCXZhbHVlX3plcm8gcHJvcGVybGV5LgorCisJKiB2YWxvcHMuYywgdmFsdWUuaCAodmFsdWVfemVybyk6IENyZWF0ZWQtLXdpbGwgcmV0dXJuIGEgdmFsdWUgb2YKKwlhbnkgdHlwZSB3aXRoIGNvbnRlbnRzIGZpbGxlZCB3aXRoIHplcm8uCisJKiBzeW10YWIuYywgc3ltdGFiLmggKGxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGUpOiBDcmVhdGVkLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiBNb2RpZmllZCB0byBub3QgcmVhZCBtZW1vcnkgd2hlbgorCWNhbGxlZCB3aXRoIEVWQUxfQVZPSURfU0lERV9FRkZFQ1RTLgorCisJKiBNYWtlZmlsZTogTW92ZWQgZGJ4cmVhZC5jIGFoZWFkIG9mIGNvZmZyZWFkLmMgaW4gdGhlIGxpc3Qgb2YKKwlzb3VyY2UgZmlsZXMuIAorCitXZWQgTWF5IDEwIDExOjI5OjE5IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIG11bmNoOiBNYWtlIHN1cmUgdGhhdCBzeXN2IHZlcnNpb24gc3Vic3RpdHV0ZXMgZm9yIHRoZSB3aG9sZQorCWxpbmUuIAorCisJKiBzeW10YWIuaDogQ3JlYXRlZCBhbiBlbnVtIG1pc2NfZnVuY3Rpb25fdHlwZSB0byBob2xkIHRoZSB0eXBlIG9mCisJdGhlIG1pc2MgZnVuY3Rpb24gYmVpbmcgcmVjb3JkZWQuCisJKiBkYnhyZWFkLmMgKHJlY29yZF9taXNjX2Z1bmN0aW9uKTogQnJhbmNoZWQgb24gZGJ4IHN5bWJvbHMgdG8KKwlkZWNpZGUgd2hpY2ggdHlwZSB0byBhc3NpZ24gdG8gYSBtaXNjIGZ1bmN0aW9uLgorCSogY29mZnJlYWQuYyAocmVjb3JkX21pc2NfZnVuY3Rpb24pOiBBbHdheXMgYXNzaWduIHR5cGUgdW5rbm93bi4KKwkqIGV4cHJlYWQueSBbdmFyaWFibGVdOiBOb3cgdGVzdHMgYmFzZWQgb24gbmV3IHZhbHVlcy4KKworVHVlIE1heSAgOSAxMzowMzo1NCAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBzeW10YWIuYzogQ2hhbmdlZCBpbmNsdXNpb24gb2YgPHN0cmluZ3MuaD4gKGRvZXNuJ3Qgd29yayBvbgorCVNZU1YpIHRvIGRlY2xhcmF0aW9uIG9mIGluZGV4LgorCisJKiBNYWtlZmlsZTogQ2hhbmdlZCBsYXN0IGNvdXBsZSBvZiBSRUFETElORV9GTEFHUyBTWVNWX0RFRklORQorCisJKiBzb3VyY2UuYyAoe2ZvcndhcmQsIHJldmVyc2V9X3NlYXJjaF9jb21tYW5kKTogTWFkZSBhIGRlZmF1bHQKKwlzZWFyY2ggZmlsZSBzaW1pbGFyIHRvIGZvciB0aGUgbGlzdCBjb21tYW5kLgorCitNb24gTWF5ICA4IDE4OjA3OjUxIDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIHByaW50Y21kLmMgKHByaW50X2ZyYW1lX2FyZ3MpOiBJZiB3ZSBkb24ndCBrbm93IGhvdyBtYW55CisJYXJndW1lbnRzIHRoZXJlIGFyZSB0byB0aGlzIGZ1bmN0aW9uLCBkb24ndCBwcmludCB0aGUgbmFtZWxlc3MKKwlhcmd1bWVudHMuICBXZSBkb24ndCBrbm93IGVub3VnaCB0byBmaW5kIHRoZW0uCisKKwkqIHByaW50Y21kLmMgKHByaW50X2ZyYW1lX2FyZ3MpOiBDYWxsIHByaW50X2ZyYW1lX25hbWVsZXNzX2FyZ3MKKwl3aXRoIHByb3BlciBhcmd1bWVudHMgKHN0YXJ0ICYgZW5kIGFzIG9mZnNldHMgZnJvbSBhZGRyKS4KKworCSogZGJ4cmVhZC5jIChyZWFkX2FkZGxfc3ltcyk6IFJlbW92ZWQgY2FzZXMgdG8gZGVhbCB3aXRoIGdsb2JhbAorCXN5bWJvbHM7IHRoaXMgc2hvdWxkIGFsbCBiZSBkb25lIGluIHNjYW5fZ2xvYmFsX3N5bWJvbHMuCisKK1N1biBNYXkgIDcgMTE6MzY6MjMgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogTWFrZWZpbGU6IEFkZGVkIGNvcHlpbmcuYXdrIHRvICR7T1RIRVJTfS4KKworRnJpIE1heSAgNSAxNjo0OTowMSAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiB2YWxwcmludC5jICh0eXBlX3ByaW50X3ZhcnNwZWNfcHJlZml4KTogRG9uJ3QgcGFzcworCXBhc3NlZF9hX3BvaW50ZXIgb250byBjaGlsZHJlbi4KKworCSogdmFscHJpbnQuYyAodHlwZV9wcmludF92YXJzcGVjX3N1ZmZpeCk6IFByaW50ICJhcnJheSBvZiIgd2l0aAorCXdoYXRldmVyIHRoZSAib2YiIGlzIGFmdGVyIHRoYSBhcnJheSBicmFja2V0cy4KKworCSogdmFscHJpbnQuYyAodHlwZV9wcmludF92YXJzcGVjX3twcmVmaXgsc3VmZml4fSk6IEFycmFuZ2UgdG8KKwlwYXJlbnRoZXNpc3plIHBvaW50ZXJzIHRvIGFycmF5cyBhcyB3ZWxsIGFzIHBvaW50ZXJzIHRvIG90aGVyCisJb2JqZWN0cy4gCisKKwkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfdmFyc3BlY19zdWZmaXgpOiBNYWtlIHN1cmUgdG8gcHJpbnQKKwlzdWJzY3JpcHRzIG9mIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBpbiB0aGUgcmlnaHQgb3JkZXIuCisKKwkqIGluZmNtZC5jIChydW5fY29tbWFuZCk6IEZpeGVkIGltcHJvcGVyIHVzYWdlcyBvZiB2YXJpYWJsZXMKKwl3aXRoaW4gcmVtb3RlIGRlYnVnZ2luZyBicmFuY2guCisKKwkqIE1ha2VmaWxlOiBBZGRlZCBDb252ZXgubm90ZXMgdG8gdGhlIGxpc3Qgb2YgZXh0cmEgZmlsZXMgdG8gY2FycnkKKwlhcm91bmQuIAorCisJKiBkYnhyZWFkLmMgKHN5bWJvbF9maWxlX2NvbW1hbmQpOiBNYWRlIHVzZSBvZiBhbGxvY2Egb3IgbWFsbG9jCisJZGVwZW5kZW50IG9uIG1hY3JvIGRlZmluZS4KKworVGh1IE1heSAgNCAxNTo0NzowNCAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBNYWtlZmlsZTogQ2hhbmdlZCBSRUFETElORV9GTEFHUyB0byBTWVNWX0RFRklORSBhbmQgY2FsbGVkIG11bmNoCisJd2l0aCBpdCBhbHNvLgorCSogbXVuY2g6IENoZWNrIGZpcnN0IGFyZ3VtZW50IGZvciAtRFNZU1YgYW5kIGJlIGxvb3NlciBhYm91dAorCXBpY2tpbmcgdXAgaW5pdCByb3V0aW5lcyBpZiB5b3UgZmluZCBpdC4KKworCSogY29mZnJlYWQuYzogTWFkZSBmY2xvc2UgYmUgb2YgdHlwZSBpbnQuCisKKwkqIGJyZWFrcG9pbnQuYyAoX2luaXRpYWxpemVfYnJlYWtwb2ludCk6IFB1dCAidW5zZXQiIGludG8gY2xhc3MKKwlhbGlhcy4gCisKK1dlZCBNYXkgIDMgMTQ6MDk6MTIgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogbS1zcGFyYy5oIFtTVEFDS19FTkRfQUREUl06IFBhcmFtZXRlcml6ZWQgb2ZmIG9mCisJbWFjaGluZS92bXBhcmFtLmggKGFzIHBlciBKb2huIEdpbG1vcmUncyBzdWdnZXN0aW9uKS4KKworCSogYmxvY2tmcmFtZS5jIChnZXRfcHJldl9mcmFtZV9pbmZvKTogQ2hhbmdlZCB0aGlzIGZ1bmN0aW9uIGJhY2sKKwl0byBjaGVja2luZyBmcmFtZWxlc3MgaW52b2NhdGlvbiBmaXJzdCBiZWZvcmUgY2hlY2tpbmcgZnJhbWUKKwljaGFpbi4gIFRoaXMgbWVhbnMgdGhhdCBhIGJhY2t0cmFjZSB1cCBmcm9tIHN0YXJ0IHdpbGwgcHJvZHVjZSB0aGUKKwl3cm9uZyB2YWx1ZSwgYnV0IHRoYXQgYSBiYWNrdHJhY2UgZnJvbSBhIGZyYW1lbGVzcyBmdW5jdGlvbiBjYWxsZWQKKwlpbiBtYWluIHdpbGwgc2hvdyB1cCBjb3JyZWN0bHkuCisKKwkqIGJyZWFrcG9pbnQuYyAoX2luaXRpYWxpemVfYnJlYWtwb2ludCk6IEFkZGVkIGVudHJ5IGluIGhlbHAgZm9yCisJZGVsZXRlIHRoYXQgaW5kaWNhdGVzIHRoYXQgdW5zZXQgaXMgYW4gYWxpYXMgZm9yIGl0LgorCisJKiBtYWluLmMgKHN5bWJvbF9jb21wbGV0aW9uX2Z1bmN0aW9uKTogTW9kaWZpZWQgcmVjb2duaXRpb24gb2YKKwliZWluZyB3aXRoaW4gYSBzaW5nbGUgY29tbWFuZC4KKworVHVlIE1heSAgMiAxNToxMzo0NSAxOTg5ICBSYW5keSBTbWl0aCAgKHJhbmR5IGF0IGdudSkKKworCSogZXhwcmVhZC55IFt2YXJpYWJsZV06IEFkZCBzb21lIHBhcmVucyB0byBnZXQgY2hlY2tpbmcgb2YgdGhlCisJbWlzYyBmdW5jdGlvbiB2ZWN0b3IgcmlnaHQuCisKK01vbiBNYXkgIDEgMTM6MDc6MDMgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogZGVmYXVsdC1kZXAuYyAoY29yZV9maWxlX2NvbW1hbmQpOiBNYWRlIHJlZ19vZmZzZXQgdW5zaWduZWQuCisKKwkqIGRlZmF1bHQtZGVwLmMgKGNvcmVfZmlsZV9jb21tYW5kKTogSW1wcm92ZWQgZXJyb3IgbWVzc2FnZXMgZm9yCisJcmVhZGluZyBpbiByZWdpc3RlcnMuCisKKwkqIGV4cHJlYWQueTogQWxsb3dlZCBhIEJMT0NLTkFNRSB0byBiZSBvayBmb3IgYSB2YXJpYWJsZSBuYW1lIChhcworCXBlciBDIHN5bnRheCkuIAorCisJKiBkYnhyZWFkLmMgKHBzeW10YWJfdG9fc3ltdGFiKTogRmx1c2hlZCBzdGRvdXQgYWZ0ZXIgcHJpbnRpbmcKKwlzdGFydGluZyBtZXNzYWdlIGFib3V0IHJlYWRpbmcgaW4gc3ltYm9scy4KKworCSogcHJpbnRjbWQuYyAocHJpbnRfZnJhbWVfYXJncyk6IFN3aXRjaGVkIHN0YXJ0aW5nIHBsYWNlIGZvcgorCXByaW50aW5nIG9mIGZyYW1lbGVzcyBhcmdzIHRvIGJlIHNpemVvZiBpbnQgYWJvdmUgbGFzdCByZWFsIGFyZworCXByaW50ZWQuIAorCisJKiBwcmludGNtZC5jIChwcmludF9mcmFtZV9hcmdzKTogTW9kaWZpZWQgZmluYWwgY2FsbCB0bworCXByaW50X25hbWVsZXNzX2FyZ3MgdG8gbm90IHVzZSBmcmFtZSBzbG90cyB1c2VkIGFycmF5IGlmIG5vbmUgaGFkCisJYmVlbiB1c2VkLiAKKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogIFRha2UgRlVOQ1RJT05fU1RBUlRfT0ZGU0VUIGludG8KKwlhY2NvdW50IHdoZW4gZGVhbGluZyB3aXRoIGNvbXBhcmlzb24gb2YgcGMgdmFsdWVzIHRvIGZ1bmN0aW9uCisJYWRkcmVzc2VzLiAKKworCSogTWFrZWZpbGU6IEFkZGVkIG5vdGUgYWJvdXQgY29tcGlsaW5nIGdkYiBvbiBhIFZheCBydW5uaW5nIDQuMy4KKworU3VuIEFwciAzMCAxMjo1OTo0NiAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBjb21tYW5kLmMgKGxvb2t1cF9jbWQpOiBHb3QgY29ycmVjdCBlcnJvciBtZXNzYWdlIG9uIGJhZAorCWNvbW1hbmQuICAKKworCSogbS1zdW4zLmggW0FCT1VUX1RPX1JFVFVSTl06IE1vZGlmaWVkIHRvIGFsbG93IGFueSBvZiB0aGUgcmV0dXJuCisJaW5zdHJ1Y3Rpb25zLCBpbmNsdWRpbmcgdHJhcHYgYW5kIHJldHVybiBmcm9tIGludGVydXB0LgorCisJKiBjb21tYW5kLmMgKGxvb2t1cF9jbWQpOiBJZiBhIGNvbW1hbmQgaXMgZm91bmQsIHVzZSBpdCdzIHZhbHVlcworCWZvciBlcnJvciByZXBvcnRpbmcgYW5kIGRldGVybWluYXRpb24gb2YgbmVlZGVkIHN1YmNvbW1hbmRzLgorCisJKiBjb21tYW5kLmMgKGxvb2t1cF9jbWQpOiBVc2UgbnVsbCBzdHJpbmcgZm9yIGVycm9yIGlmIGNtZHR5cGUgaXMKKwludWxsOyBwYXNzICpsaW5lIHRvIGVycm9yIGluc3RlYWQgb2YgKiouCisKKwkqIGNvbW1hbmQuYyAobG9va3VwX2NtZF8xKTogRW5kIG9mIGNvbW1hbmQgbWFya2VkIGJ5IGFueXRoaW5nIGJ1dAorCWFscGhhIG51bWVyaWMgb3IgJy0nLiAgSW5jbHVkZWQgY3R5cGUuaC4KKworRnJpIEFwciAyOCAxODozMDo0OSAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBzb3VyY2UuYyAoc2VsZWN0X3NvdXJjZV9zeW10YWIpOiBLZXB0IGxpbmUgbnVtYmVyIGZyb20gZXZlcgorCWJlaW5nIGxlc3MgdGhhbiAxIGluIG1haW4gZGVjb2RlLgorCitXZWQgQXByIDI2IDEzOjAzOjIwIDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGRlZmF1bHQtZGVwLmMgKGNvcmVfZmlsZV9jb21tYW5kKTogRml4ZWQgdHlwby4KKworCSogdXRpbHMuYyAoZnByaW50Zl9maWx0ZXJlZCk6IERvbid0IHVzZSByZXR1cm4gdmFsdWUgZnJvbQorCW51bWNoYXJzLiAKKworCSogbWFpbi5jLCBjb21tYW5kLmMgKGNvbXBsZXRlX29uX2NtZGxpc3QpOiBNb3ZlZCBmdW5jdGlvbiB0bworCWNvbW1hbmQuYy4gCisKKwkqIGNvbW1hbmQuYyAobG9va3VwX2NtZCk6IE1vZGlmaWVkIHRvIHVzZSBteSBuZXcgcm91dGluZS4gIE9sZAorCXZlcnNpb24gaXMgc3RpbGwgdGhlcmUsIGlmZGVmJ2Qgb3V0LgorCisJKiBjb21tYW5kLmMsIGNvbW1hbmQuaCAobG9va3VwX2NtZF8xKTogQWRkZWQgYSByb3V0aW5lIHRvIGRvIGFsbAorCW9mIHRoZSB3b3JrIG9mIGxvb2t1cF9jbWQgd2l0aCBubyBlcnJvciByZXBvcnRpbmcgYW5kIGZ1bGwgcmV0dXJuCisJb2YgaW5mb3JtYXRpb24gZ2FybmVyZWQgaW4gc2VhcmNoLgorCitUdWUgQXByIDI1IDEyOjM3OjU0IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBnbHV0ZXVzLmFpLm1pdC5lZHUpCisKKwkqIGJyZWFrcG9pbnQuYyAoX2luaXRpYWxpemVfYnJlYWtwb2ludCk6IENoYW5nZSAiZGVsZXRlCisJYnJlYWtwaW9udHMiIHRvIGJlIGluIGNsYXNzIGFsaWFzIGFuZCBub3QgaGF2ZSB0aGUgYWJicmV2IGZsYWcKKwlzZXQuIAorCisJKiBtYWluLmMgKHN5bWJvbF9jb21wbGV0aW9uX2Z1bmN0aW9uKTogRml4IHRvIGNvcnJlY3RseSBjb21wbGV0ZQorCXRoaW5ncyB0aGF0IGNvcnJlc3BvbmQgdG8gbXVsdGl3b3JkIGFsaWFzZXMuCisKKwkqIG1haW4uYyAoY29tcGxldGVfb25fY21kbGlzdCk6IERvbid0IGNvbXBsZXRlIG9uIHNvbWV0aGluZyBpZiBpdAorCWlzbid0IGEgY29tbWFuZCBvciBwcmVmaXggKGllLiBpZiBpdCdzIGp1c3QgYSBoZWxwIHRvcGljKS4KKworCSogbWFpbi5jIChzeW1ib2xfY29tcGxldGlvbl9mdW5jdGlvbik6IFNldCBsaXN0IGluZGV4IHRvIGJlIDAgaWYKKwljcmVhdGluZyBhIGxpc3Qgd2l0aCBqdXN0IG9uZSBlbGVtZW50LgorCisJKiBtYWluLmMgKGNvbXBsZXRlX29uX2NtZGxpc3QpOiBEb24ndCBhbGxvdyB0aGluZ3Mgd2l0aAorCWFiYnJldl9mbGFnIHNldCB0byBiZSBjb21wbGV0aW9uIHZhbHVlcy4KKwkoc3ltYm9sX2NvbXBsZXRpb25fZnVuY3Rpb24pOiBEb24ndCBhY2NlcHQgYW4gZXhhY3QgbWF0Y2ggaWYgdGhlCisJYWJicmV2IGZsYWcgaXMgc2V0LgorCisJKiBkYnhyZWFkLmMgKHJlYWRfdHlwZSk6IEZpeGVkIHR5cG8gaW4gY29tcGFyaXNpb24gdG8gY2hlY2sgaWYKKwl0eXBlIG51bWJlciBleGlzdGVkLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfdHlwZSk6IE1hZGUgc3VyZSB0byBvbmx5IGNhbGwgZGJ4X2xvb2t1cF90eXBlIG9uCisJdHlwZW51bXMgaWYgdHlwZW51bXMgd2VyZSBub3QgLTEuCisKK01vbiBBcHIgMjQgMTc6NTI6MTIgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogc3ltdGFiLmM6IEFkZGVkIHN0cmluZ3MuaCBhcyBhbiBpbmNsdWRlIGZpbGUuCisKK0ZyaSBBcHIgMjEgMTU6Mjg6MzggMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogc3ltdGFiLmMgKGxvb2t1cF9wYXJ0aWFsX3N5bXRhYik6IENoYW5nZWQgdG8gb25seSByZXR1cm4gYSBtYXRjaAorCWlmIHRoZSBuYW1lIG1hdGNoIGlzIGV4YWN0ICh3aGljaCBpcyB3aGF0IEkgd2FudCBpbiBhbGwgY2FzZXMgaW4KKwl3aGljaCB0aGlzIGlzIGN1cnJlbnRseSB1c2VkLgorCitUaHUgQXByIDIwIDExOjEyOjM0IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBnbHV0ZXVzLmFpLm1pdC5lZHUpCisKKwkqIG0taXNpLmggW1JFR0lTVEVSX1VfQUREUl06IEluc3RhbGxlZCBuZXcgdmVyc2lvbiBmcm9tIG5ldC4KKwkqIGRlZmF1bHQtZGVwLmM6IERlbGV0ZWQgaW5jbHVzaW9uIG9mIGZjbnRsLmg7IGFwcGFyZW50bHkgbm90CisJbmVjZXNzYXJ5LgorCSogTWFrZWZpbGU6IEFkZGVkIGNvbW1lbnQgYWJvdXQgY29tcGlsaW5nIG9uIGlzaSB1bmRlciA0LjMuCisKKwkqIGJyZWFrcG9pbnQuYyAoYnJlYWtfY29tbWFuZF8xKTogT25seSBnaXZlIGRlY29kZV9saW5lXzEgdGhlCisJZGVmYXVsdF9icmVha3BvaW50X2RlZmF1bHRzIGlmIHRoZXJlJ3Mgbm90aGluZyBiZXR0ZXIgKGllLiBtYWtlCisJdGhlIGRlZmF1bHQgYmUgb2ZmIG9mIHRoZSBjdXJyZW50X3NvdXJjZSBub3RlcyBpZiBhdCBhbGwKKwlwb3NzaWJsZSkuIAorCisJKiBibG9ja2ZyYW1lLmMgKGdldF9wcmV2X2ZyYW1lX2luZm8pOiBDbGVhbiB1cCBjb21tZW50cyBhbmQKKwlkZWxldGUgY29kZSBpZmRlZmVkIG91dCBhcm91bmQgRlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT04gdGVzdC4gCisKKwkqIHJlbW90ZS5jOiBBZGRlZCBhICI/IiBtZXNzYWdlIHRvIHByb3RvY29sLgorCShyZW1vdGVfb3Blbik6IFVzZWQgYXQgc3RhcnR1cC4KKwkocHV0cGt0KTogUmVhZCB3aGF0ZXZlciBnYXJiYWdlIGNvbWVzIG92ZXIgdGhlIGxpbmUgdW50aWwgd2Ugc2VlIGEKKwknKycgKGllLiBkb24ndCB0cmVhdCBnYXJiYWdlIGFzIGEgdGltZW91dCkuCisKKwkqIHZhbG9wcy5jIChjYWxsX2Z1bmN0aW9uKTogRWxpbWluYXRlZCBubyBsb25nZXIgYXBwcm9wcmlhdGUKKwljb21tZW50LgorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBDaGFuZ2VkIHNldmVyYWwgY29udmV4IGNvbmRpdGlvbmFsCisJY29tcGlsYXRpb25zIHRvIGJlIGNvbmRpdGlvbmFsIG9uIENBTk5PVF9FWEVDVVRFX1NUQUNLLgorCitXZWQgQXByIDE5IDEwOjE4OjE3IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIHByaW50Y21kLmMgKHByaW50X2ZyYW1lX2FyZ3MpOiBBZGRlZCBjb2RlIHRvIGF0dGVtcHQgdG8gZGVhbAorCXdpdGggYXJndW1lbnRzIHRoYXQgYXJlIGJpZ2dlciB0aGFuIGFuIGludC4KKworCUNvbnRpbnVhdGlvbiBvZiBDb252ZXgvRm9ydHJhbiBjaGFuZ2VzOgorCSogcHJpbnRjbWQuYyAocHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCk6IEFkZGVkIGxlYWRpbmcgemVyb3MgdG8KKwlwcmludGluZyBvZiBsYXJnZSBpbnRlZ2Vycy4KKwkoYWRkcmVzc19pbmZvLCBwcmludF9mcmFtZV9hcmdzKTogQWRkZWQgY29kZSB0byBkZWFsIHdpdGgKKwlMT0NfUkVGX0FSRy4KKwkocHJpbnRfbmFtZWxlc3NfYXJncyk6IEFsbG93IHBhcmFtIGZpbGUgdG8gc3BlY2lmeSBhIHJvdXRpbmUgd2l0aAorCXdoaWNoIHRvIHByaW50IHR5cGVsZXNzIGludGVnZXJzLgorCShwcmludGZfY29tbWFuZCk6IERlYWwgd2l0aCBsb25nIGxvbmcgdmFsdWVzIHdlbGwuCisJKiBzdGFjay5jIChwcmludF9mcmFtZV9hcmdfdmFycyk6IENoYW5nZSB0byBkZWFsIHdpdGggTE9DX1JFRl9BUkcuCisJKiBzeW1taXNjLmMgKHByaW50X3N5bWJvbCk6IENoYW5nZSB0byBkZWFsIHdpdGggTE9DX1JFRl9BUkcuCisJKiBzeW1zZWcuaDogQWRkZWQgTE9DX1JFRl9BUkcgdG8gZW51bSBhZGRyZXNzX2NsYXNzLgorCSogc3ltdGFiLmMgKGxvb2t1cF9ibG9ja19zeW1ib2wpOiBDaGFuZ2VkIHRvIGRlYWwgd2l0aAorCUxPQ19SRUZfQVJHLgorCSogdmFsYXJpdGguYyAodmFsdWVfc3Vic2NyaXB0ZWRfcnZhbHVlKTogQ3JlYXRlZC4KKwkodmFsdWVfc3Vic2NyaXB0KTogVXNlZCBhYm92ZSB3aGVuIGFwcC4KKwkodmFsdWVfbGVzcywgdmFsdWVfZXF1YWwpOiBDaGFuZ2UgdG8gY2FzdCB0byAoY2hhciAqKSBiZWZvcmUgZG9pbmcKKwljb21wYXJpc29uLCBmb3IgbWFjaGluZXMgd2hlcmUgdGhhdCBjYXN0aW5nIGRvZXMgc29tZXRoaW5nLgorCSogdmFsb3BzLmMgKGNhbGxfZnVuY3Rpb24pOiBTZXR1cCB0byBkZWFsIHdpdGggbWFjaGluZXMgd2hlcmUgeW91CisJY2Fubm90IGV4ZWN1dGUgY29kZSBvbiB0aGUgc3RhY2sgc2VnbWVudC4KKwkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6IE1ha2Ugc3VyZSB0aGF0IGFycmF5IGVsZW1lbnQgc2l6ZSBpc24ndAorCXplcm8gYmVmb3JlIHByaW50aW5nLiAgU2V0IGFkZHJlc3Mgb2YgZGVmYXVsdCBhcnJheSB0byBhZGRyZXNzIG9mCisJZmlyc3QgZWxlbWVudC4gIFB1dCBpbiBhIGNvdXBsZSBvZiBpbnQgY2FzdC4gIFJlbW92ZWQgc29tZSBjb252ZXgKKwlzcGVjaWZpYyBjb2RlLiBBZGRlZCBjaGVjayBmb3IgZW5kaWFubmVzcyBvZiBtYWNoaW5lIGluIGNhc2Ugb2YgYQorCXBhY2tlZCBzdHJ1Y3R1cmUuICBBZGRlZCBjb2RlIGZvciBwcmludGluZyB0eXBlbGVzcyBpbnRlZ2VycyBhbmQKKwlmb3IgTE9ORyBMT05HJ3MuCisJKHNldF9tYXhpbXVtX2NvbW1hbmQpOiBDaGFuZ2UgdG8gdXNlIHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgdG8gZ2V0CisJYXJndW1lbnQgKHNvIGNhbiB1c2UgZXhwcmVzc2lvbnMgdGhlcmUpLgorCSogdmFsdWVzLmMgKHZhbHVlX29mX2ludGVybmFsdmFyLCBzZXRfaW50ZXJuYWx2YXJfY29tcG9uZW50LAorCXNldF9pbnRlcm5hbHZhciwgY29udmVuaWVuY2VfaW5mbyk6IEFkZCBpbiBob29rcyBmb3IgdHJhcHBlZAorCWludGVybmFsIHZhcnMuCisJKHVucGFja19sb25nKTogRGVhbCB3aXRoIExPTkdfTE9ORy4KKwkodmFsdWVfZmllbGQpOiBSZW1vdmUgTE9OR0VTVCBjYXN0LgorCSh1c2luZ19zdHJ1Y3RfcmV0dXJuKTogRml4ZWQgdHlwbyBFTlVNID09PiBVTklPTi4KKwkqIHhnZGIuYyAoX2luaXRpYWxpemVfeGdkYik6IE1ha2Ugc3VyZSB0aGF0IHNwZWNpZnlfZXhlY19maWxlX2hvb2sKKwlpcyBub3QgY2FsbGVkIHVubGVzcyB3ZSBhcmUgc2V0dGluZyB1cCBhIHdpbmRvd2luZyBlbnZpcm9uLgorCitUdWUgQXByIDE4IDEzOjQzOjM3IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwlWYXJpb3VzIGNoYW5nZXMgaW52b2x2ZWQgaW4gMSkgZ2V0dGluZyBnZGIgdG8gd29yayBvbiB0aGUgY29udmV4LAorCWFuZCAyKSBHZXR0aW5nIGdkYiB0byB3b3JrIHdpdGggZm9ydHJhbiAoZHVlIHRvIGNvbnZleCFjc21pdGgpOgorCSogY29udmV4LWRlcC5jLCBjb252ZXgtb3Bjb2RlLmgsIG0tY29udmV4LmgsIGNvbnZleC1waW5zbi5jOgorCUNyZWF0ZWQgKG9yIHJlcGxhY2VkIHdpdGggbmV3IGZpbGVzKS4KKwkqIE1ha2VmaWxlOiBBZGQgY29udmV4IGRlcGVuZGVudCBmaWxlcy4gIENoYW5nZWQgZGVmYXVsdCBmbGFncyB0bworCWdudSBtYWxsb2MgdG8gYmUgQ0ZMQUdTLgorCSogY29uZmlnLmdkYjogQWRkZWQgY29udmV4IHRvIGxpc3Qgb2YgbWFjaGluZXMuCisJKiBjb3JlLmMgKGZpbGVzX2luZm8pOiBBZGRlZCBhIEZJTEVTX0lORk9fSE9PSyB0byBiZSB1c2VkIGlmCisJZGVmaW5lZC4KKwkoeGZlcl9jb3JlX2ZpbGUpOiBDb25kaXRpb25hbGl6ZWQgY29tcGlsYXRpb24gb2YgeGZlcl9jb3JlX2ZpbGUgb24KKwl0aGUgbWFjcm8gWEZFUl9DT1JFX0ZJTEUuCisJKiBjb2ZmcmVhZC5jIChyZWNvcmRfbWlzY19mdW5jdGlvbik6IE1hZGUgc3VyZSBpdCB6ZXJvZCB0eXBlIGZpZWxkCisJKHdoaWNoIGlzIG5vdyBiZWluZyB1c2VkOyBzZWUgbmV4dCkuCisJKiBkYnhyZWFkLmM6IEluY2x1ZGVkIHNvbWUgY29udmV4IGRlcGVuZGVudCBpbmNsdWRlIGZpbGVzLgorCShjb3B5X3BlbmRpbmcsIGZpeF9jb21tb25fYmxvY2tzKTogQ3JlYXRlZC4KKwlbU1RBQl9SRUdfUkVHTlVNLCBCRUxJRVZFX1BDQ19QUk9NT1RJT05dOiBDcmVhdGVkIGRlZmF1bHQgdmFsdWVzOworCW1heSBiZSBvdmVycmlkZGVuIGluIG0tKi5oLgorCUluY2x1ZGVkIGRhdGEgc3RydWN0dXJlcyBmb3Iga2VlcGluZyB0cmFjayBvZiBjb21tb24gYmxvY2tzLgorCShkYnhfYWxsb2NfdHlwZSk6IE1vZGlmaWVkOyBpZiBjYWxsZWQgd2l0aCBuZWdhdGl2ZSAxJ3Mgd2lsbAorCWNyZWF0ZSBhIHR5cGUgd2l0aG91dCBwdXR0aW5nIGl0IGludG8gdGhlIHR5cGUgdmVjdG9yLgorCShyZWFkX2RieF9zeW10YWIsIHJlYWRfYWRkbF9zeW1zKTogTW9kaWZpZWQgY2FsbHMgdG8KKwlyZWNvcmRfbWlzY19mdW5jdGlvbiB0byBpbmNsdWRlIHRoZSBuZXcgaW5mb3JtYXRpb24uCisJKHN5bWJvbF9maWxlX2NvbW1hbmQsIHBzeW10YWJfdG9fc3ltdGFiLCBhZGRfZmlsZV9jb21tYW5kKToKKwlNb2RpZmllZCByZWFkaW5nIGluIG9mIHN0cmluZyB0YWJsZSB0byBhZGFwdCB0byBtYWNoaW5lcyB3aGljaAorCSpkb24ndCogc3RvcmUgdGhlIHNpemUgb2YgdGhlIHN0cmluZyB0YWJsZSBpbiB0aGUgZmlyc3QgZm91ciBieXRlcworCW9mIHRoZSBzdHJpbmcgdGFibGUuCisJKHJlYWRfZGJ4X3N5bXRhYiwgc2Nhbl9maWxlX2dsb2JhbHMsIHJlYWRfb2ZpbGVfc3ltdGFiLAorCXJlYWRfYWRkbF9zeW1zKTogTW9kaWZpZWQgYXNzaWdubWVudCBvZiBuYW1lc3RyaW5nIHRvIGFjY2VwdCBudWxsCisJaW5kZXggaW50byBzeW10YWIgYXMgb2suCisJKHJlYWRfYWRkbF9zeW1zKTogTW9kaWZpZWQgcmVhZGluIG9mIGEgbmV3IG9iamVjdCBmaWxlIHRvIGZpZGRsZQorCXdpdGggY29tbW9uIGJsb2NrcyBjb3JyZWN0bHkuCisJKHByb2Nlc3Nfb25lX3N5bWJvbCk6IEZpeGVkIGluY29ycmVjdCBjb21tZW50IGFib3V0IGNvbnZleC4gIEdldAorCXN5bWJvbHMgbG9jYWwgdG8gYSBsZXhpY2FsIGNvbnRleHQgZnJvbSBjb3JyZWN0IHNwb3Qgb24gYSBwZXIKKwltYWNoaW5lIGJhc2lzLiAgQ2F0Y2ggYSBidWcgaW4gcGNjIHdoaWNoIG9jY2Fpc2lvbmFsbHkgcHV0cyBhbiBTTworCXdoZXJlIHRoZXJlIHNob3VsZCBiZSBhbiBTT0wuICBTZXBlcmF0ZSBzZWN0aW9ucyBmb3IgTl9CQ09NTSAmCisJTl9FQ09NTS4KKwkoZGVmaW5lX3N5bWJvbCk6IElnbm9yZSBzeW1ib2xzIHdpdGggbm8gIjoiLiAgVXNlCisJU1RBQl9SRUdfVE9fUkVHTlVNLiAgQWRkZWQgc3VwcG9ydCBmb3IgZnVuY3Rpb24gYXJncyBjYWxsaW5nIGJ5CisJcmVmZXJlbmNlLgorCShyZWFkX3R5cGUpOiBPbmx5IHJlYWQgdHlwZSBudW1iZXIgaWYgb25lIGlzIHRoZXJlLiAgUmVtb3ZlIG9sZAorCSgjaWYgMCdkIG91dCkgYXJyYXkgY29kZS4KKwkocmVhZF9hcnJheV90eXBlKTogQWRkZWQgY29kZSBmb3IgZGVhbGluZyB3aXRoIGFkanVzdGFibGUgKGJ5CisJcGFyYW1ldGVyKSBhcnJheXMgaGFsZi1oZWFydGVkbHkuCisJKHJlYWRfZW51bV90eXBlKTogQWxsb3cgYSAnLCcgdG8gZW5kIGEgbGlzdCBvZiB2YWx1ZXMuCisJKHJlYWRfcmFuZ2VfdHlwZSk6IEFkZGVkIGNvZGUgdG8gY2hlY2sgZm9yIGxvbmcgbG9uZy4KKwkqIGV4cHJlYWQueTogTW9kaWZpZWQgdG8gdXNlIExPTkdFU1QgaW5zdGVhZCBvZiBsb25nIHdoZXJlCisJbmVjZXNzYXJ5LiAgTW9kaWZpZWQgdG8gdXNlIGEgZGVmYXVsdCB0eXBlIG9mIGludCBmb3Igb2JqZWN0cyB0aGF0CisJd2VyZW4ndCBpbiB0ZXh0IHNwYWNlLgorCSogZmluZHZhci5jIChsb2NhdGVfdmFyX3ZhbHVlLCByZWFkX3Zhcl92YWx1ZSk6IE1vZGlmaWVkIHRvIGRlYWwKKwl3aXRoIGFyZ3MgcGFzc2VkIGJ5IHJlZmVyZW5jZS4KKwkqIGluZmxvdy5jIChjcmVhdGVfaW5mZXJpb3IpOiBVc2VkIENSRUFURV9JTkZFUklPUl9IT09LIGlmIGl0CisJZXhpc3RzLgorCSogaW5mcnVuLmMgKGF0dGFjaF9wcm9ncmFtKTogUnVuIHRlcm1pbmFsIGluZmVyaW9yIHdoZW4gYXR0YWNoaW5nLgorCSh3YWl0X2Zvcl9pbmZlcmlvcik6IFJlbW92ZWQgc2V2ZXJhbCBjb252ZXggZGVwZW5kZW5jaWVzLgorCSogbWFpbi5jIChmbG9hdF9oYW5kbGVyKTogQ3JlYXRlZC4KKwlNYWRlIHdoYXRldmVyIHNpZ25hbCBpbmRpY2F0ZXMgYSBzdG9wIGNvbmZpZ3VyYWJsZSAodmlhIG1hY3JvCisJU1RPUF9TSUdOQUwpLgorCShtYWluKTogU2V0dXAgdXNlIG9mIGFib3ZlIGFzIGEgc2lnbmFsIGhhbmRsZXIuICBBZGRlZCBjaGVjayBmb3IKKwkiLW53IiBpbiBhcmdzIGFscmVhZHkgcHJvY2Vzc2VkLgorCShjb21tYW5kX2xpbmVfaW5wdXQpOiBTSUdUU1RQID09PlNUT1BfU0lHTkFMLgorCisJKiBleHByZWFkLnk6IEFkZGVkIHRva2VuIEJMT0NLTkFNRSB0byByZW1vdmUgcmVkdWNlL3JlZHVjZQorCWNvbmZsaWN0LgorCSogTWFrZWZpbGU6IENoYW5nZSBtZXNzYWdlIHRvIHJlZmxlY3QgbmV3IGdyYW1tYXIuCisKK01vbiBBcHIgMTcgMTM6MjQ6NTkgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogcHJpbnRjbWQuYyAoY29tcGFyZV9pbnRzKTogQ3JlYXRlZC4KKwkocHJpbnRfZnJhbWVfYXJncyk6IE1vZGlmaWVkIHRvIGFsd2F5cyBwcmludCBhcmd1bWVudHMgaW4gdGhlCisJb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIGZvdW5kIGluIHRoZSBzeW1ib2wgdGFibGUuICBGaWd1cmUgb3V0CisJd2hhdCBhcG90cyBhcmUgbWlzc2luZyBvbiB0aGUgZmx5LgorCisJKiBzdGFjay5jICh1cF9jb21tYW5kKTogRXJyb3IgaWYgbm8gaW5mZXJpb3Igb3IgY29yZSBmaWxlLgorCisJKiBtLWkzODYuaCwgbS1zeW1tZXRyeS5oIFtGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTl06IENyZWF0ZWQ7CisJc2FtZSBhcyBtNjhrLgorCisJKiBkYnhyZWFkLmMgKGRlZmluZV9zeW1ib2wpOiBDaGFuZ2VkICJkZXNjPT0wIiB0ZXN0IHRvCisJInByb2Nlc3NpbmdfZ2NjX2NvbXBpbGF0aW9uIiwgd2hpY2ggaXMgdGhlIGNvcnJlY3Qgd2F5IHRvIGRvIGl0LgorCitTYXQgQXByIDE1IDE3OjE4OjM4IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGV4cHJlYWQueTogQWRkZWQgcHJlY2VkZW5jZSBydWxlcyBmb3IgYXJnbGlzdHMsID86LCBhbmQgc2l6ZW9mCisJdG8gZWxpbWluYXRlIHNvbWUgc2hpZnQtcmVkdWNlIGNvbmZsaWN0cy4KKwkqIE1ha2VmaWxlOiBNb2RpZmllZCAiRXhwZWN0IiBtZXNzYWdlIHRvIGNvbmZvcm0gdG8gbmV3IHJlc3VsdHMuCisKK1RodSBBcHIgMTMgMTI6Mjk6MjYgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IHBsYW50YXJpcy5haS5taXQuZWR1KQorCisJKiBpbmZsb3cuYyAodGVybWluYWxfaW5pdF9pbmZlcmlvcik6IEZpeGVkIHR5cG8gaW4gcmVjZW50IGRpZmYKKwlpbnN0YWxsYXRpb247IFRJT0dFVEMgPT0+IFRJT0NHRVRDLgorCisJKiBtLXZheC5oLCBtLXN1bjIuaCwgbS1zdW4zLmgsIG0tc3BhcmMuaCwgbS1ocCouaCwgbS1pc2kuaCwKKwltLW5ld3MuaCBbRlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT05dOiBDcmVhdGVkIG1hY3JvIHdpdGgKKwlhcHByb3ByaWF0ZSBkZWZpbml0aW9uLgorCitXZWQgQXByIDEyIDE1OjMwOjI5IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBwbGFudGFyaXMuYWkubWl0LmVkdSkKKworCSogYmxvY2tmcmFtZS5jIChnZXRfcHJldl9mcmFtZV9pbmZvKTogQWRkZWQgaW4gYSBtYWNybyB0byBzcGVjaWZ5CisJd2hlbiBhICJmcmFtZSIgaXMgY2FsbGVkIHdpdGhvdXQgYSBmcmFtZSBwb2ludGVyIGJlaW5nIHNldHVwLgorCisJKiBNYWtlZmlsZSBbY2xlYW5dOiBNYWRlIHN1cmUgdG8gZGVsZXRlIGdudSBtYWxsb2MgaWYgaXQgd2FzIGJlaW5nCisJdXNlZC4gCisKK01vbiBBcHIgMTAgMTI6NDM6NDkgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpOiBSZXNldCB3aXRoaW5fZnVuY3Rpb24gdG8gMCBhZnRlcgorCWxhc3QgUkJSQUMgb2YgYSBmdW5jdGlvbi4KKworCSogZGJ4cmVhZC5jIChyZWFkX3N0cnVjdF90eXBlKTogQ2hhbmdlZCBjaGVjayBmb3IgZmlsbGluZyBpbiBvZgorCVRZUEVfTUFJTl9WQVJJQU5UIG9mIHR5cGUuCisKKwkqIGluZmxvdy5jIChjcmVhdGVfaW5mZXJpb3IpOiBDb25kaXRpb25hbGl6ZWQgZm9yayBzbyB0aGF0IGl0CisJd291bGQgYmUgdXNlZCBpZiBVU0cgd2FzIGRlZmluZWQgYW5kIEhBVkVfVkZPUksgd2FzIG5vdCBkZWZpbmVkLgorCisJKiBkZWZzLmg6IEFkZGVkIGNvbW1lbnQgYWJvdXQgZW51bSBjb21tYW5kX2NsYXNzIGVsZW1lbnQKKwljbGFzc19hbGlhcy4gCisKKwkqIGRieHJlYWQuYyAocHJvY2Vzc19vbmVfc3ltYm9sKTogRml4ZWQgYSB0eXBvIHdpdGggaW50ZXJlc3RpbmcKKwlpbXBsaWNhdGlvbnMgZm9yIGFzc29jaWF0aXZlIHByb2Nlc3NpbmcgaW4gdGhlIGJyYWluICgnOicgPT0+ICdjJykuCisKKwkqIHNwYXJjLWRlcC5jIChpc2FicmFuY2gpOiBDaGFuZ2VkIG5hbWUgdG8gaXNhbm51bGxlZCwgbW9kaWZpZWQgdG8KKwlkZWFsIHdpdGggY29wcm9jZXNzb3IgYnJhbmNoZXMsIGFuZCBpbXByb3ZlZCBjb21tZW50LgorCShzaW5nbGVfc3RlcCk6IENoYW5nZWQgdG8gdHJhcCBhdCBucGMgKyA0IGluc3RlYWQgb2YgcGMgKzggb24KKwlhbm51bGxlZCBicmFuY2hlcy4gIENoYW5nZWQgbmFtZSBpbiBjYWxsIHRvIGlzYWJyYW5jaCBhcyBhYm92ZS4KKworCSogbS1zdW40b3M0LmggKFNUQUNLX0VORF9BRERSRVNTKTogQ2hhbmdlZCBpdCB0byAweGY4MDAwMDAwIHVuZGVyCisJb3MgNC4wLgorCitTYXQgQXByICA4IDE3OjA0OjA3IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYyAocHJvY2Vzc19vbmVfc3ltYm9sKTogSW4gdGhlIGNhc2UgTl9GVU4gb3IgTl9GTkFNRSB0aGUKKwl2YWx1ZSBiZWluZyByZWZlcmVkIHRvIGlzIHNvbWV0aW1lcyBqdXN0IGEgdGV4dCBzZWdtZW50IHZhcmlhYmxlLgorCUNhdGNoIHRoaXMgY2FzZS4KKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKSwgYnJlYWtwb2ludC5jCisJKGJyZWFrcG9pbnRfc3RvcF9zdGF0dXMpOiBNb3ZlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGZyYW1lIHRvCisJaW5zaWRlIGJyZWFrcG9pbnRfc3RvcF9zdGF0dXMgc28gdGhhdCB0aGUgZnJhbWUgb25seSBnZXRzIHNlbGVjdGVkCisJKGFuZCB0aGUgc3ltYm9scyBwb3RlbnRpYWxseSByZWFkIGluKSBpZiB0aGUgc3ltYm9scyBhcmUgbmVlZGVkLgorCisJKiBzeW10YWIuYyAoZmluZF9wY19wc3ltYm9sKTogRml4ZWQgbWlub3IgbWlzdGhvdWdoIChwYyA+PQorCWZ1Y250aW9uIHN0YXJ0LCBub3QgPikuCisKKwkqIGJyZWFrcG9pbnQuYyAoX2luaXRpYWxpemVfYnJlYWtwb2ludCk6IENoYW5nZSAiZGVsZXRlIiBpbnRlcm5hbAorCWhlbHAgZW50cnkgdG8gc2ltcGx5IHJlZmVyIHRvIGl0IGJlaW5nIGEgcHJlZml4IGNvbW1hbmQgKHNpbmNlIHRoZQorCWxpc3Qgb2Ygc3ViY29tbWFuZHMgaXMgcmlnaHQgdGhlcmUgb24gYSAiaGVscCBkZWxldGUiKS4KKworRnJpIEFwciAgNyAxNToyMjoxOCAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBibG9ja2ZyYW1lLmMgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbik6IENyZWF0ZWQ7IGZpZ3VyZXMgb3V0CisJd2hhdCBmdW5jdGlvbiBwYyBpcyBpbiAobmFtZSBhbmQgYWRkcmVzcykgd2l0aG91dCByZWFkaW5nIGluIGFueQorCW5ldyBzeW1ib2xzLgorCSogc3ltdGFiLmg6IEFkZGVkIGRlY2wgZm9yIGFib3ZlLgorCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogVXNlZCBpbnN0ZWFkIG9mCisJZmluZF9wY19mdW5jdGlvbl9zdGFydC4KKwkqIHN0YWNrLmMgKHByaW50X2ZyYW1lX2luZm8pOiBVc2VkIGluc3RlYWQgb2YgaGFuZCBjb2RpbmcgZm9yIHNhbWUKKwl0aGluZy4gCisKKwkqIGRieHJlYWQuYyAocHN5bXRhYl90b19zeW10YWIpOiBObyBsb25nZXIgcGF0Y2ggcmVhZGluIHBzdCdzIG91dAorCW9mIHRoZSBwYXJ0aWFsX3N5bXRhYl9saXN0OyBuZWVkIHRoZW0gdGhlcmUgZm9yIHNvbWUgY2hlY2tzLgorCSogYmxvY2tmcmFtZS5jIChibG9ja19mb3JfcGMpLCBzb3VyY2UuYyAoc2VsZWN0X3NvdXJjZV9zeW10YWIpLAorCXN5bXRhYi5jIChsb29rdXBfc3ltYm9sLCBmaW5kX3BjX3N5bXRhYiwgbGlzdF9zeW1ib2xzKTogTWFkZSBleHRyYQorCXN1cmUgbm90IHRvIGNhbGwgcHN5bXRhYl90b19zeW10YWIgd2l0aCAtPnJlYWRpbiA9PSAxLCBzaW5jZSB0aGVzZQorCXBzeW10YWIgbm93IHN0YXkgb24gdGhlIGxpc3QuCisJKiBzeW10YWIuYyAoc291cmNlc19pbmZvKTogTm93IGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBwc3ltdGFicyB3aXRoCisJcmVhZGluIHNldCBhbmQgdGhvc2Ugd2l0aCBpdCBub3Qgc2V0LgorCisJKiBzeW10YWIuYyAobG9va3VwX3N5bXRhYik6IEFkZGVkIGNoZWNrIHRocm91Z2ggcGFydGlhbCBzeW10YWJzCisJZm9yIG5hbWUgd2l0aCAuYyBhcHBlbmRlZC4KKworCSogc291cmNlLmMgKHNlbGVjdF9zb3VyY2Vfc3ltdGFiKTogQ2hhbmdlZCBzZW1hbnRpY3MgYSBsaXR0bGUgc28KKwl0aGF0IHRoZSBhcmd1bWVudCBtZWFucyBzb21ldGhpbmcuCisJKiBzb3VyY2UuYyAobGlzdF9jb21tYW5kKSwgc3ltdGFiLmMgKGRlY29kZV9saW5lXzEpOiBDaGFuZ2VkIGNhbGwKKwl0byBzZWxlY3Rfc291cmNlX3N5bXRhYiB0byBtYXRjaCBuZXcgY29udmVudGlvbnMuCisKKwkqIGRieHJlYWQuYyAoYWRkX2ZpbGVfY29tbWFuZCk6IFRoaXMgY29tbWFuZCBubyBsb25nZXIgc2VsZWN0cyBhCisJc3ltYm9sIHRhYmxlIHRvIGxpc3QgZnJvbS4KKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogT25seSBjYWxsIGZpbmRfcGNfZnVuY3Rpb24gKHRvCisJZmluZCBvdXQgaWYgd2UgaGF2ZSBkZWJ1Z2dpbmcgc3ltYm9scyBmb3IgYSBmdW5jdGlvbiBhbmQgaGVuY2UgaWYKKwl3ZSBzaG91bGQgc3RlcCBvdmVyIG9yIGludG8gaXQpIGlmIHdlIGFyZSBkb2luZyBhICJzdGVwIi4KKworVGh1IEFwciAgNiAxMjo0MjoyOCAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBtYWluLmMgKGNvbW1hbmRfbGluZV9pbnB1dCk6IEFkZGVkIGEgbG9jYWwgYnVmZmVyIGFuZCBvbmx5CisJY29waWVkIGluZm9ybWF0aW9uIGludG8gdGhlIGdsb2JhbCBtYWluLmMgYnVmZmVyIHdoZW4gaXQgaXMKKwlhcHByb3ByaWF0ZSBmb3IgaXQgdG8gYmUgc2F2ZWQgKGFuZCByZXBlYXRlZCkuCisJKGRvbnRfcmVwZWF0KTogT25seSBuYWlsIGxpbmUgd2hlbiB3ZSBhcmUgcmVhZGluZyBmcm9tIHN0ZGluCisJKG90aGVyd2lzZSBudWxsIGxpbmVzIHdvbid0IHJlcGVhdCBhbmQgd2hhdCdzIGluIGxpbmUgbmVlZHMgdG8gYmUKKwlzYXZlZCkuCisJKHJlYWRfY29tbWFuZF9saW5lcyk6IEZpeGVkIHR5cG87IHlvdSBkb24ndCB3aGF0IHRvIHJlcGVhdCB3aGVuCisJcmVhZGluZyBjb21tYW5kIGxpbmVzIGZyb20gdGhlIGlucHV0IHN0cmVhbSB1bmxlc3MgaXQncyBzdGFuZGFyZAorCWlucHV0LiAKKworICAgICAgICBKb2huIEdpbG1vcmUncyAoZ251QHRvYWQuY29tKSBtb2RzIGZvciBVU0cgZ2RiOgorCSogaW5mbG93LmM6IFJlbW92ZWQgaW5jbHVzaW9uIG9mIHN5cy91c2VyLmg7IG5vIGxvbmdlciBuZWNlc3NhcnkuCisJKCwgdGVybWluYWxfaW5pdF9pbmZlcmlvciwgdGVybWluYWxfaW5mZXJpb3IsIHRlcm1pbmFsX291cnNfMSwKKwl0ZXJtX3N0YXR1c19jb21tYW5kLCBfaW5pdGlhbGl6ZV9pbmZsb3cpIFNlcGVyYXRlZCBvdXQgZGVjbGFyYXRpb24KKwlhbmQgdXNhZ2Ugb2YgdGVybWluYWwgbW9kZSBzdHJ1Y3R1cmVzIGJhc2VkIG9uIHRoZSBleGlzdGVuY2Ugb2YKKwl0aGUgaW5kaXZpZHVhbCBpb2N0bHMuCisJKiB1dGlscy5jIChyZXF1ZXN0X3F1aXQpOiBSZXN0b3JlIHNpZ25hbCBoYW5kbGVyIHVuZGVyIFVTRy4gIElmCisJcnVubmluZyB1bmRlciBVU0cgaW5pdGlhbGl6ZSBzeXNfc2lnbGlzdCBhdCBydW4gdGltZSAodG9vIG11Y2gKKwl2YXJpYXRpb24gYmV0d2VlbiBzeXN0ZW1zKS4KKworV2VkIEFwciAgNSAxMzo0NzoyNCAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisgICAgICAgIEpvaG4gR2lsbW9yZSdzIChnbnVAdG9hZC5jb20pIG1vZHMgZm9yIFVTRyBnZGI6CisJKiBkZWZhdWx0LWRlcC5jOiBNb3ZlZCBpbmNsdWRlIG9mIHN5cy91c2VyLmggdG8gYWZ0ZXIgaW5jbHVkZSBvZgorCWEub3V0LmguCisJKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6IEZpeGVkIGVycm9yIG1lc3NhZ2UuCisJKGNvcmVfZmlsZV9jb21tYW5kKTogSW1wcm92ZWQgZXJyb3IgbWVzc2FnZXMgZnJvbSByZWFkaW5nIGluIG9mCisJdSBhcmVhIGluIGNvcmUgZmlsZS4gIENoYW5nZWQgY2FsY3VsYXRpb24gb2Ygb2Zmc2V0IG9mIHJlZ2lzdGVycworCXRvIGFjY291bnQgZm9yIHNvbWUgbWFjaGluZXMgcHV0dGluZyBpdCBpbiBhcyBhbiBvZmZzZXQgcmF0aGVyCisJdGhhbiBhbiBhYnNvbHV0ZSBhZGRyZXNzLiAgQ2hhbmdlZCBlcnJvciBtZXNzYWdlcyBmb3IgcmVhZGluZyBvZgorCXJlZ2lzdGVycyBmcm9tIGNvcmUgZmlsZS4KKworCSogY29mZnJlYWQuYyAocmVhZF9maWxlX2hkcik6IEFkZGVkIGZpbmFsIGNoZWNrIGZvciBCQURNQUcgbWFjcm8KKwl0byB1c2UgaWYgY291bGRuJ3QgcmVjb2duaXplIG1hZ2ljIG51bWJlci4KKwkqIE1ha2VmaWxlOiBBZGRlZCBleHBsaWNpdCBkaXJlY3Rpb25zIGZvciBhbGxvY2EgYWRkaXRpb24uCisJSW5jbHVkZWQgYWxsb2NhLmMgaW4gbGlzdCBvZiBwb3NzaWJsZSBsaWJyYXJ5IGZpbGVzLiBDbGVhbmVkIHVwCisJcG9zc2libGUgbGlicmFyeSB1c2FnZS4gIEluY2x1ZGVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZ2NjCisJYW5kIGluY2x1ZGUgZmlsZXMuICAKKworCSogc291cmNlLmMsIHJlbW90ZS5jLCBpbmZsb3cuYywgZGJ4cmVhZC5jLCBjb3JlLmMsIGNvZmZyZWFkLmM6CisJQ2hhbmdlZCBpbmNsdWRlIG9mIHN5cy9mY250bC5oIHRvIGFuIGluY2x1ZGUgb2YgZmNudGwuaCAoYXMgcGVyCisJcG9zaXg7IHByZXN1bWFibHkgdGhpcyB3aWxsIGJyZWFrIGZld2VyIG1hY2hpbmVzLiAgSSBob3B3KS4KKwkqIFJFQURNRTogQWRkZWQgYSBwb2ludGVyIHRvIGNvbW1lbnRzIGF0IHRvcCBvZiBNYWtlZmlsZS4KKwkqIE1ha2VmaWxlOiBBZGRlZCBhIGNvbW1lbnQgYWJvdXQgbWFjaGluZXMgd2hpY2ggbmVlZCBmY250bC5oIGluCisJc3lzLiAKKworVHVlIEFwciAgNCAxMToyOTowNCAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiB2YWxwcmludC5jIChzZXRfcHJldHR5cHJpbnRfY29tbWFuZCwgc2V0X3VuaW9ucHJpbnRfY29tbWFuZCwKKwlmb3JtYXRfaW5mbyk6IENyZWF0ZWQuCisJKF9pbml0aWFsaXplX3ZhbHByaW50KTogQWRkZWQgdG8gbGlzdHMgb2YgY29tbWFuZHMuCisKKwkqIGdkYi50ZXhpbmZvIFtCYWNrdHJhY2VdOiBBZGRlZCBhIHNlY3Rpb24gZGVzY3JpYmluZyB0aGUgZm9ybWF0CisJaWYgc3ltYm9scyBoYXZlIG5vdCB5ZXQgYmVlbiByZWFkIGluLgorCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnQpOiBBZGRlZCBjb2RlIHRvIHByZXR0eXByaW50IHN0cnVjdHVyZXMgaWYKKwkicHJldHR5cHJpbnQiIGlzIHNldCBhbmQgb25seSB0byBwcmludCB1bmlvbnMgYmVsb3cgdGhlIHRvcCBsZXZlbAorCWlmICJ1bmlvbnByaW50IiBpcyBzZXQuCisKKwkqIGluZmNtZC5jIChyZWdpc3RlcnNfaW5mbyksIHZhbHByaW50LmMgKHZhbHVlX3ByaW50LCB2YWxfcHJpbnQpOgorCUFkZGVkIGFyZ3VtZW50IHRvIGNhbGwgdG8gdmFsX3ByaW50IGluZGljYXRpbmcgZGVwdGNoIG9mIHJlY3Vyc2lvbi4KKworCSogc3ltdGFiLltjaF0gKGZpbmRfcGNfcHN5bWJvbCk6IENyZWF0ZWQ7IGZpbmRzIHN0YXRpYyBmdW5jdGlvbgorCXBzeW1ib2wgd2l0aCB2YWx1ZSBuZWFyZXN0IHRvIGJ1dCB1bmRlciB2YWx1ZSBwYXNzZWQuCisJKiBzdGFjay5jIChwcmludF9mcmFtZV9pbmZvKTogVXNlZCBhYm92ZSB0byBtYWtlIHN1cmUgSSBoYXZlIGJlc3QKKwlmaXQgdG8gcGMgdmFsdWUuCisKKwkqIHN5bXNlZy5oIChzdHJ1Y3QgcGFydGlhbF9zeW1ib2wpOiBBZGRlZCB2YWx1ZSBmaWVsZC4KKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogU2V0IHZhbHVlIGZpZWxkIGZvciBwYXJ0aWFsIHN5bWJvbHMKKwlzYXZlZCAoc28gdGhhdCB3ZSBjYW4gbG9va3VwIHN0YXRpYyBzeW1ib2xzKS4KKworCSogc3ltdGFiLltjaF0gKGZpbmRfcGNfc3ltdGFiKTogQ2hhbmdlZCB0byBleHRlcm5hbC4KKwkqIHN0YWNrLmMgKHNlbGVjdF9mcmFtZSk6IENhbGwgYWJvdmUgdG8gbWFrZSBzdXJlIHRoYXQgc3ltYm9scyBmb3IKKwlhIHNlbGVjdGVkIGZyYW1lIGlzIHJlYWRpbi4KKworTW9uIEFwciAgMyAxMjo0ODoxNiAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgcGxhbnRhcmlzLmFpLm1pdC5lZHUpCisKKwkqIHN0YWNrLmMgKHByaW50X2ZyYW1lX2luZm8pOiBNb2RpZmllZCB0byBvbmx5IHByaW50IG91dCBmdWxsCisJc3RhY2sgZnJhbWUgaW5mbyBvbiBzeW1ib2xzIHdob3NlIHRhYmxlcyBoYXZlIGJlZW4gcmVhZCBpbi4KKwkqIHN5bXRhYi5jLCBzeW10YWIuaCAoZmluZF9wY19wc3ltdGFiKTogTWFkZSBmdW5jdGlvbiBleHRlcm5hbDsKKwlhYm92ZSBuZWVkZWQgaXQuCisKKwkqIG1haW4uYyAoLHNldF92ZXJib3NlX2NvbW1hbmQsIGluaXRpYWxpemVfbWFpbik6IENyZWF0ZWQgYQorCXZhcmlhYmxlICJpbmZvX3ZlcmJvc2UiIHdoaWNoIHNheXMgdG8gdGFsayBpdCB1cCBpbiB2YXJpb3VzIGFuZAorCXN1bmRyeSBwbGFjZXMuICBBZGRlZCBjb21tYW5kIHRvIHNldCB0aGlzIHZhcmlhYmxlLgorCSogZ2RiLnRleGluZm8gKEdEQiBPdXRwdXQpOiBBZGRlZCBkb2N1bWVudGF0aW9uIG9uICJzZXQgdmVyYm9zZSIKKwlhbmQgY2hhbmdlZCB0aGUgbmFtZSBvZiB0aGUgIlNjcmVlbiBPdXRwdXQiIHNlY3Rpb24gdG8gIkdEQgorCU91dHB1dCIuCisJKiBkYnhyZWFkLmMgKHBzeW10YWJfdG9fc3ltdGFiKTogQWRkZWQgaW5mb3JtYXRpb24gbWVzc2FnZSBhYm91dAorCXN5bWJvbCByZWFkaW4uICBDb25kaXRpb25hbGl6ZWQgb24gYWJvdmUuCisKKwkqIGRieHJlYWQuYyAoZGVmaW5lX3N5bWJvbCk6IE1hZGUgYW4gImkiIGNvbnN0YW50IGJlIG9mIGNsYXNzCisJTE9DX0NPTlNUIGFuZCBhbiAiciIgY29uc3RhbnQgYmUgb2YgY2xhc3MgTE9DX0NPTlNUX0JZVEVTLgorCisJKiBSRUFETUU6IE1hZGUgYSBub3RlIGFib3V0IG1vZGlmaWNhdGlvbnMgd2hpY2ggbWF5IGJlIG5lY2Vzc2FyeQorCXRvIHRoZSBtYW51YWwgZm9yIHRoaXMgdmVyc2lvbiBvZiBnZGIuCisKKwkqIGJsb2NrZnJhbWUuYyAoZ2V0X3ByZXZfZnJhbWVfaW5mbyk6IE5vdyB3ZSBnZXQgc2F2ZWQgYWRkcmVzcyBhbmQKKwljaGVjayBmb3IgdmFsaWRpdHkgYmVmb3JlIHdlIGNoZWNrIGZvciBsZWFmaXNtLiAgVGhpcyBtZWFucyB0aGF0CisJd2Ugd2lsbCBjYXRjaCB0aGUgZmFjdCB0aGF0IHdlIGFyZSBpbiBzdGFydCwgYnV0IHdlIHdpbGwgbWlzcyBhbnkKKwlmbnMgdGhhdCBzdGFydCBjYWxscyB3aXRob3V0IGFuIGZwLiAgVGhpcyBzaG91bGQgYmUgZmluZS4KKworCSogbS0qLmggKEZSQU1FX0NIQUlOKTogTW9kaWZpZWQgdG8gcmV0dXJuIDAgaWYgd2UgYXJlIGluIHN0YXJ0LgorCVRoaXMgaXMgdXN1YWxseSBhIHRlc3QgZm9yIHdpdGhpbiB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUuCisJKiBtLXNwYXJjLmggKEZSQU1FX0NIQUlOKTogVGhlIHRlc3QgaGVyZSBpcyBzaW1wbHkgaWYgdGhlIGZwIHNhdmVkCisJb2ZmIHRoZSB0aGUgc3RhcnQgc3AgaXMgMC4KKworCSogYmxvY2tmcmFtZS5jIChnZXRfcHJldl9mcmFtZV9pbmZvKTogUmVtb3ZlZCBjaGVjayB0byBzZWUgaWYgd2UKKwl3ZXJlIGluIHN0YXJ0LiAgU2NyZXdzIHVwIHNwYXJjLiAgCisKKwkqIG0tc3BhcmMuaCAoRlJBTUVfRklORF9TQVZFRF9SRUdJU1RFUlMpOiBDaGFuZ2VkIHRlc3QgZm9yIGR1bW15CisJZnJhbWUgdG8gbm90IG5lZWQgZnJhbWUgdG8gYmUgaW5uZXJtb3N0LgorCisJKiBnZGIudGV4aW5mbzogQWRkZWQgc2VjdGlvbiBvbiBmcmFtZWxlc3MgaW52b2NhdGlvbnMgb2YgZnVuY3Rpb25zCisJYW5kIHdoZW4gZ2RiIGNhbiBhbmQgY2FuJ3QgZGVhbCB3aXRoIHRoaXMuCisKKwkqIHN0YWNrLmMgKGZyYW1lX2luZm8pOiBEaXNhbGxvd2VkIGNhbGwgaWYgbm8gaW5mZXJpb3Igb3IgY29yZQorCWZpbGU7IGZhaWxzIGdyYWNlZnVsbHkgaWYgdHJ1ZWx5IGJhZCBzdGFjayBzcGVjZmljYXRpb24gaGFzIGJlZW4KKwlnaXZlbiAoaWUuIHBhcnNlX2ZyYW1lX3NwZWNpZmljYXRpb24gcmV0dXJucyAwKS4KKworRnJpIE1hciAzMSAxMzo1OTozMyAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBpbmZydW4uYyAobm9ybWFsX3N0b3ApOiBDaGFuZ2VkIHJlZmVyZW5jZXMgdG8gInVuc2V0LWVudiIgdG8KKwkiZGVsZXRlIGVudiIuCisKKwkqIGluZmNtZC5jIChfaW5pdGlhbGl6ZV9pbmZjbWQpOiBDaGFuZ2UgcmVmZXJlbmNlIHRvIHNldC1hcmdzIGluCisJaGVscCBydW4gdG8gInNldCBhcmdzIi4KKworCSogcmVtb3RlLmMgKGdldHBrdCk6IEFsbG93IGltbWVkaWF0ZSBxdWl0IHdoZW4gcmVhZGluZyBmcm9tCisJZGV2aWNlOyBpdCBjb3VsZCBiZSBodW5nLgorCisJKiBjb2ZmcmVhZC5jIChwcm9jZXNzX2NvZmZfc3ltYm9sKTogTW9kaWZ5IGhhbmRsaW5nIG9mIFJFRworCXBhcmFtZXRlciBzeW1ib2xzLgorCitUaHUgTWFyIDMwIDE1OjI3OjIzIDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYyAoc3ltYm9sX2ZpbGVfY29tbWFuZCk6IFVzZSBtYWxsb2MgdG8gYWxsb2NhdGUgdGhlCisJc3BhY2UgZm9yIHRoZSBzdHJpbmcgdGFibGUgaW4gc3ltYm9sX2ZpbGVfY29tbWFuZCAoYW5kIHNldHVwIGEKKwljbGVhbnVwIGZvciB0aGlzKS4gIFRoaXMgYWxsb3dzIGEgbW9yZSBncmFjZWZ1bCBlcnJvciBmYWlsdXJlIGlmCisJdGhlcmUgaXNuJ3QgYW55IG1lbW9yeSBhdmFpbGlibGUgKGFuZCBwcm9iYWJseSBhbGxvd3MgbW9yZSBtZW1vcnkKKwl0byBiZSBhdmFpbCwgZGVwZW5kaW5nIG9uIHRoZSBtYWNoaW5lKS4KKworCUFkZGl0aW9uYWwgbW9kcyBmb3IgaGFuZGxpbmcgR05VIEMrKyAoZnJvbSBUaWVtYW5uKToKKwkqIGRieHJlYWQuYyAocmVhZF90eXBlKTogQWRkZWQgY2FzZSBmb3IgJyMnIHR5cGUgKG1ldGhvZCB0eXBlLCBJCisJYmVsaWV2ZSkuCisJKHJlYWRfc3RydWN0X3R5cGUpOiBJZiB0eXBlIGNvZGUgaXMgdW5kZWZpbmVkLCBtYWtlIHRoZSBtYWluCisJdmFyaWFudCBmb3IgdGhlIHR5cGUgYmUgaXRzZWxmLiAgQWxsb3cgcmVjb2duaXRpb24gb2YgYmFkIGZvcm1hdAorCWluIHJlYWRpbmcgb2Ygc3RydWN0dXJlIGZpZWxkcy4KKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKTogTW9kaWZ5IGV2YWx1YXRpb24gb2YgYSBtZW1iZXIgb2YgYQorCXN0cnVjdHVyZSBhbmQgcG9pbnRlciB0byBzYW1lIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzeW50YXggaXMKKwliZWluZyB1c2VkIGNvcnJlY3RseSBhbmQgdGhhdCB0aGUgbWVtYmVyIGlzIGJlaW5nIGFjY2Vzc2VkIGNvcnJlY3RseS4KKwkqIHN5bXNlZy5oOiBBZGRlZCBUWVBFX0NPREVfTUVUSE9EIHRvIGVudW0gdHlwZV9jb2RlLiAgQWRkIGEKKwlwb2ludGVyIHRvIGFuIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzIHRvIHRoZSB0eXBlIHN0cnVjdHVyZS4KKwkqIHN5bXRhYi5jIChsb29rb3V0X21ldGhvZF90eXBlLCBzbWFzaF90b19tZXRob2RfdHlwZSk6IENyZWF0ZWQuCisJKiBzeW10YWIuaCAoVFlQRV9BUkdfVFlQRVMpOiBDcmVhdGVkLgorCSogdmFsb3BzLmMgKGNhbGxfZnVuY3Rpb24pOiBNb2RpZmllZCBoYW5kbGluZyBvZiBtZXRob2RzIHRvIGJlIHRoZQorCXNhbWUgYXMgaGFuZGxpbmcgb2YgZnVuY3Rpb25zOyBubyBsb25nZXIgY2hlY2sgZm9yIG1lbWJlcnMuCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnQsIHR5cGVfcHJpbnRfdmFyc3BlY197cHJlZml4LHN1ZmZpeH0sCisJdHlwZV9wcmludF9iYXNlKTogQWRkZWQgY29kZSB0byBwcmludCBtZXRob2QgYXJncyBjb3JyZWN0bHkuCisJKiB2YWx1ZXMuYyAodmFsdWVfdmlydHVhbF9mbl9maWVsZCk6IE1vZGlmeSBhY2Nlc3MgdG8gdmlydHVhbAorCWZ1bmN0aW9uIHRhYmxlLgorCitXZWQgTWFyIDI5IDEzOjE5OjM0IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGZpbmR2YXIuYzogU3BlY2lhbCBjYXNlcyBmb3IgUkVHSVNURVJfV0lORE9XUzogMSkgUmV0dXJuIDAgaWYgd2UKKwlhcmUgdGhlIGlubmVybW9zdCBmcmFtZSwgYW5kIDIpIHJldHVybiB0aGUgbmV4dCBmcmFtZSBpbidzIHZhbHVlCisJaWYgdGhlIFNQIGlzIGJlaW5nIGxvb2tlZCBmb3IuCisKKwkqIGJsb2NrZnJhbWUuYyAoZ2V0X25leHRfZnJhbWUpOiBDcmVhdGVkOyByZXR1cm5zIHRoZSBuZXh0IChpbm5lcikKKwlmcmFtZSBvZiB0aGUgY2FsbGVkIGZyYW1lLgorCSogZnJhbWUuaDogRXh0ZXJuIGRlbGNhcmF0aW9uIGZvciBhYm92ZS4KKworCSogbWFpbi5jIChjb21tYW5kX2xpbmVfaW5wdXQpOiBTdGljayBudWxsIGF0IGVuZCBiZWZvcmUgZG9pbmcKKwloaXN0b3J5IGV4cGFuc2lvbi4KKworVHVlIE1hciAyOCAxNzozNTo1MCAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYik6IEFkZGVkIG5hbWVzdHJpbmcgYXNzaWdubWVudCB0bworCU5fREFUQS9CU1MvQUJTIGNhc2UuICBTaWdoLgorCitTYXQgTWFyIDI1IDE3OjQ5OjA3IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGV4cHJlYWQueTogRGVmaW5lZCBZWURFQlVHLgorCitGcmkgTWFyIDI0IDIwOjQ2OjU1IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIHN5bXRhYi5jIChtYWtlX3N5bWJvbF9jb21wbGV0aW9uX2xpc3QpOiBDb21wbGV0ZWx5IHJld3JvdGUgdG8KKwluZXZlciBjYWxsIHBzeW10YWJfdG9fc3ltdGFiLCB0byBkbyBhIGNvcnJlY3Qgc2VhcmNoIChubworCWR1cGxpY2F0ZXMpIHRocm91Z2ggdGhlIHZpc2libGUgc3ltYm9scywgYW5kIHRvIGluY2x1ZGUgc3RydWN0dXJlCisJYW5kIHVuaW9uIGZpZWxkcyBpbiB0aGUgdGhpbmdzIHRoYXQgaXQgY2FuIG1hdGNoLgorCitUaHUgTWFyIDIzIDE1OjI3OjQ0IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYyAoZGJ4X2NyZWF0ZV90eXBlKTogQ3JlYXRlZDsgYWxsb2NhdGVzIGFuZCBpbml0cyBzcGFjZQorCWZvciBhIHR5cGUgd2l0aG91dCBwdXR0aW5nIGl0IG9uIHRoZSB0eXBlIHZlY3RvciBsaXN0cy4KKwkoZGJ4X2FsbG9jX3R5cGUpOiBVc2VzIGFib3ZlLgorCisJKiBNYWtlZmlsZTogeGdkYi5vIG5vdyBwcm9kdWNlZCBieSBkZWZhdWx0IHJ1bGVzIGZvciAuby5jLgorCitGcmkgTWFyIDE3IDE0OjI3OjUwIDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGluZnJ1bi5jOiBGaXhlZCB1cCBpbmNsdXNpb24gb2YgYW91dGhkci5oIG9uIFVNQVhfUFRSQUNFLgorCisJKiBNYWtlZmlsZSwgY29uZmlnLmdkYjogQWRkZWQgaHAzMDBic2QgdG8gcG90ZW50aWFsCisJY29uZmlndXJhdGlvbnMuCisJKiBocDMwMGJzZC1kZXAuYywgbS1ocDMwMGJzZC5oOiBDcmVhdGVkLgorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBSZXdyb3RlIHRvIGRvIG5vIGFjY2VzcyB0bworCWluZmVyaW9yIHVudGlsIHdlIG1ha2Ugc3VyZSBpdCdzIHN0aWxsIHRoZXJlLgorCisJKiBpbmZsb3cuYyAoaW5mZXJpb3JfZGllZCk6IEFkZGVkIGEgc2VsZWN0IHRvIGZvcmNlIHRoZSBzZWxlY3RlZAorCWZyYW1lIHRvIG51bGwgd2hlbiBpbmZlcmlvciBkaWVzLgorCisJKiBkYnhyZWFkLmMgKHN5bWJvbF9maWxlX2NvbW1hbmQpOiBmcmVlIGFuZCB6ZXJvIHN5bWZpbGUgd2hlbgorCWRpc2NhcmRpbmcgc3ltYm9scy4KKworCSogY29yZS5jICh4ZmVyX2NvcmVfZmlsZSk6IEV4dGVuZGVkIGFuZCBjbGVhbmVkIHVwIGxvZ2ljIGluCisJaW50ZXJwZXRpbmcgbWVtb3J5IGFkZHJlc3MuCisKKwkqIGNvcmUuYyAoeGZlcl9jb3JlX2ZpbGUpOiBFeHRlbmRlZCBvcGVuaW5nIGNvbW1lbnQuCisKK1RodSBNYXIgMTYgMTU6Mzk6NDIgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogY29mZnJlYWQuYyAoc3ltYm9sX2ZpbGVfY29tbWFuZCk6IEZyZWUgc3ltZmlsZSBuYW1lIHdoZW4gZnJlZWluZworCWNvbnRlbnRzLgorCisJKiBibG9ja2ZyYW1lLmMgKGdldF9wcmV2X2ZyYW1lX2luZm8pOiBBZGRlZCB0byBmYXRhbCBlcnJvciBtZXNzYWdlCisJdG8gaW5kaWNhdGUgdGhhdCBpdCBzaG91bGQgbmV2ZXIgaGFwcGVuLgorCisJKiBzdGFjay5jIChmcmFtZV9pbmZvKTogUHJpbnRlZCBvdXQgdmFsdWUgb2YgInNhdmVkIiBzcCBzZXBlcmF0ZWx5CisJdG8gY2FsbCBhdHRlbnRpb24gdG8gdGhlIGZhY3QgdGhhdCBpdCBpc24ndCBzdG9yZWQgaW4gbWVtb3J5CisJYW55d2hlcmU7IHRoZSBhY3R1YWwgcHJldmlvdXMgZnJhbWVzIGFkZHJlc3MgaXMgcHJpbnRlZC4KKworCSogbS1zcGFyYy5oIChGUkFNRV9GSU5EX1NBVkVEX1JFR1MpOiBTZXQgYWRkcmVzcyBvZiBzcCBzYXZlZCBpbgorCWZyYW1lIHRvIHZhbHVlIG9mIGZwIChyYXRoZXIgdGhhbiB2YWx1ZSBvZiBzcCBpbiBjdXJyZW50IGZyYW1lKS4KKworCSogZXhwcmVhZC55OiBBbGxvdyAidW5zaWduZWQiIGFzIGEgdHlwZSBpdHNlbGYsIGFzIHdlbGwgYXMgYSB0eXBlCisJbW9kaWZpZXIuIAorCisJKiBjb2ZmcmVhZC5jOiBBZGRlZCBkZWNsYXJhdGlvbiBmb3IgZmNsb3NlCisKK0ZyaSBNYXIgMTAgMTc6MjI6MzEgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogbWFpbi5jIChjb21tYW5kX2xpbmVfaW5wdXQpOiBDaGVja2VkIGZvciAtMSByZXR1cm4gZnJvbQorCXJlYWRsaW5lOyBpbmRpY2F0ZXMgRU9GLgorCitGcmkgTWFyICAzIDAwOjMxOjI3IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBnbHV0ZXVzLmFpLm1pdC5lZHUpCisKKwkqIHJlbW90ZS5jIChyZW1vdGVfb3Blbik6IENhc3QgcmV0dXJuIGZyb20gc2lnbmFsIHRvICh2b2lkICgqKSkgdG8KKwlhdm9pZCBwcm9ibGVtcyBvbiBtYWNoaW5lcyB3aGVyZSB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGlzIChpbnQKKwkoKikpLiAKKworCSogTWFrZWZpbGU6IFJlbW92ZWQgZGVsZXRpb24gb2YgdmVyc2lvbiBjb250cm9sIGZyb20gaXQgKHVzZXJzCisJd2lsbCBuZWVkIGl0IGZvciB0aGVpciBjaGFuZ2VzKS4KKworVGh1IE1hciAgMiAxNTozMjoyMSAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBzeW1tZXRyeS1kZXAuYyAocHJpbnRfMTE2N19yZWdzKTogUHJpbnQgb3V0IGVmZmVjdGl2ZSBkb3VibGVzIG9uCisJZXZlbiBudW1iZXIgcmVncy4KKwkoZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzKTogR2V0IHRoZSBmbG9hdGluZyBwb2ludCByZWdzIGFsc28uCisKKwkqIHhnZGIuYyAoZG9fY29tbWFuZCk6IENvcGllZCBjb21tYW5kIGJlZm9yZSBjYWxsaW5nIGV4ZWN1dGUKKwljb21tYW5kIChzbyB0aGF0IGV4ZWN1dGVfY29tbWFuZCB3b3VsZG4ndCB3cml0ZSBpbnRvIHRleHQgc3BhY2UpLgorCisJKiBjb3B5aW5nLmF3azogQ3JlYXRlZCAod2lsbCBwcm9kdWNlIGNvcHlpbmcuYyBhcyBvdXRwdXQgd2hlbgorCWdpdmVuIENPUFlJTkcgYXMgaW5wdXQpLgorCSogTWFrZWZpbGU6IFVzZWQgYWJvdmUgdG8gY3JlYXRlIGNvcHlpbmcuYy4KKwkqIG1haW4uYzogVG9vayBvdXQgaW5mb193YXJyYW50eSBhbmQgaW5mb19jb3B5aW5nLgorCisJKiAqLio6IENoYW5nZWQgY29weXJpZ2h0IG5vdGljZSB0byB1c2UgbmV3IEdOVSBHZW5lcmFsIFB1YmxpYworCUxpY2Vuc2UgKGluY2x1ZGVzIG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIG1hbnVhbCkuCisKKwkqIHhnZGIuYyAoY3JlYXRlX3RleHRfd2lkZ2V0KTogQ3JlYXRlZCB0ZXh0X3dpZGdldCBiZWZvcmUgSSBjcmVhdGUKKwl0aGUgc291cmNlIGFuZCBzaW5rLgorCShwcmludF9wcm9tcHQpOiBBZGRlZCBmZmx1c2ggKHN0ZG91dCkuCisKKwkqIE1ha2VmaWxlOiBBZGRlZCAtbFhtdSB0byB0aGUgY29tcGlsYXRpb24gbGluZSBmb3IgeGdkYi4gIExlZnQKKwl0aGUgb2xkIG9uZSB0aGVyZSBpbmNhc2UgcGVvcGxlIHN0aWxsIGhhZCBSMi4KKworCSogUkVBRE1FOiBBZGRlZCBub3RlIGFib3V0IC1nZyBmb3JtYXQuCisKKwkqIHJlbW90ZS5jIChnZXRwa3QpOiBGaXhlZCB0eXBvOyAmJiA9PT4gJi4KKworCSogTWFrZWZpbGU6IEFkZGVkIG5ldyB2YXJpYWJsZSBSRUFETElORV9GTEFHUyBzbyB0aGF0IEkgY291bGQKKwlmb3JjZSBjb21waWxhdGlvbiBvZiByZWFkbGluZS5jIGFuZCBoaXN0b3J5LmMgd2l0aCAtRFNZU1Ygb24KKwlzeXN0ZW0gViBtYWNoaW5lcy4gIE1lbnRpb25lZCBpbiBNYWtlZmlsZSBjb21tZW50cyBhdCB0b3AuCisKK1dlZCBNYXIgIDEgMTc6MDE6MDEgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGdsdXRldXMuYWkubWl0LmVkdSkKKworCSogaHA5azMyMC1kZXAuYyAoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogRml4ZWQgdHlwby4KKworRnJpIEZlYiAyNCAxNDo1ODo0NSAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBocDlrMzIwLWRlcC5jIChzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMsCisJZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzKTogQWRkZWQgc3VwcG9ydCBmb3IgcmVtb3RlIGRlYnVnZ2luZy4gCisKKwkqIHJlbW90ZS5jIChyZW1vdGVfdGltZXIpOiBDcmVhdGVkLgorCShyZW1vdGVfb3BlbiwgcmVhZGNoYXIpOiBTZXR1cCB0byB0aW1lb3V0IHJlYWRzIGlmIHRoZXkgdGFrZQorCWxvbmdlciB0aGFuICJ0aW1lb3V0Ii4gIFRoaXMgYWxsb3dzIG9uZSB0byBkZWJ1ZyBob3cgbG9uZyBzdWNoCisJdGhpbmdzIHRha2UuCisJKHB1dHBrdCk6IE1vZGlmaWVkIHRvIHByaW50IGEgZGVidWdnaW5nIG1lc3NhZ2UgKGlmIHN1Y2ggdGhpbmdzCisJYXJlIGVuYWJsZWQpIGVhY2ggdGltZSBpdCByZXNlbmRzIGEgcGFja2V0LgorCShnZXRwa3QpOiBNb2RpZmllZCB0byBtYWtlIHRoZSB2YXJpYWJsZSBDU1VNIHVuc2lnbmVkIGFuZCByZWFkIGl0CisJQ1NVTSB3aXRoIGFuICYgMHhmZiAocHJlc3VtYWJseSB0byBkZWFsIHdpdGggcG9vciBzaWduIGV4dGVuc2lvbgorCW9uIHNvbWUgbWFjaGluZXMpLiAgQWxzbyBtYWRlIGMxIGFuZCBjMiB1bnNpZ25lZC4KKwkocmVtb3RlX3dhaXQpOiBDaGFuZ2VkIGJ1ZmZlciB0byB1bnNpZ25lZCBzdGF0dXMuCisJKHJlbW90ZV9zdG9yZV9yZWdpc3RlcnMsIHJlbW90ZV93cml0ZV9ieXRlcyk6IFB1dHMgYSBudWxsIGJ5dGUgYXQKKwl0aGUgZW5kIG9mIHRoZSBjb250cm9sIHN0cmluZy4KKworCSogaW5mY21kLmMgKGF0dGFjaF9jb21tYW5kLCBkZXRhY2hfY29tbWFuZCwgX2luaXRpYWxpemVfaW5mY21kKToKKwlNYWRlIGF0dGFjaF9jb21tYW5kIGFuZCBkZXRhY2hfY29tbWFuZCBhbHdheXMgYXZhaWxpYmxlLCBidXQKKwltb2RpZmllZCB0aGVtIHRvIG9ubHkgYWxsb3cgZGV2aWNlIGZpbGUgYXR0YWNoZXMgaWYgQVRUQUNIX0RFVEFDSAorCWlzIG5vdCBkZWZpbmVkLgorCisJKiBnZGIudGV4aW5mbzogQWRkZWQgY3Jvc3MgcmVmZXJlbmNlIGZyb20gYXR0YWNoIGNvbW1hbmQgdG8gcmVtb3RlCisJZGVidWdnaW5nLiAKKworVGh1IEZlYiAyMyAxMjozNzo1OSAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiByZW1vdGUuYyAocmVtb3RlX2Nsb3NlKTogQ3JlYXRlZCB0byBjbG9zZSB0aGUgcmVtb3RlIGNvbm5lY3Rpb24KKwlhbmQgc2V0IHRoZSByZW1vdGVfZGVidWdnaW5nIGZsYWcgdG8gMC4KKwkqIGluZmNtZC5jIChkZXRhY2hfY29tbWFuZCk6IE5vdyBjYWxscyB0aGUgYWJvdmUgd2hlbiBhcHByb3ByaWF0ZS4gCisKKwkqIGdkYi50ZXhpbmZvOiBSZW1vdmVkIHJlZmVyZW5jZXMgdG8gdGhlIGBgRGlzdHJpYnV0aW9uJycgc2VjdGlvbgorCWluIHRoZSBjb3B5cmlnaHQuCisKKwkqIG1haW4uYywgdXRpbHMuYyAoSVNBVFRZKTogQ3JlYXRlZCBkZWZhdWx0IGRlZmludGlvbnMgb2YgdGhpcworCW1hY3JvIHdoaWNoIHVzZSBpc2F0dHkgYW5kIGZpbGVuby4KKwkqIHV0aWxzLmMgKGZwcmludGZfZmlsdGVyZWQsIHByaW50X3NwYWNlc19maWx0ZXJlZCksIG1haW4uYworCShjb21tYW5kX2xvb3AsIGNvbW1hbmRfbGluZV9pbnB1dCk6IFVzZWQgdGhpcyBtYWNyby4KKwkqIG0tbmV3cy5oOiBDcmVhdGVkIGEgZGVmaW5pdGlvbiB0byBvdmVycmlkZSB0aGlzIG9uZS4KKworCSogdXRpbHMuYyAoZnByaW50Zl9maWx0ZXJlZCk6IE1hZGUgbGluZV9zaXplIHN0YXRpYyAoY2x1ZWxlc3MpLgorCisJKiB1dGlscy5jIChmcHJpbnRmX2ZpbHRlcmVkKTogQ2hhbmdlZCBtYXggbGVuZ3RoIG9mIGxpbmUgcHJpbnRlZAorCXRvIGJlIDI1NSBjaGFycyBvciB0d2ljZSB0aGUgZm9ybWF0IGxlbmd0aC4KKworCSogc3ltbWV0cnktZGVwLmMsIG0tc3ltbWV0cnk6IEZpeGVkIHR5cG8gKF5MID09PiAMKS4KKworCSogcHJpbnRjbWQuYyAoZG9fZXhhbWluZSk6IEZpeGVkIHR5cG8gKFxuID09PiBcdCkuCisKK1dlZCBGZWIgMjIgMTY6MDA6MzMgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworICAgICAgICBDb250cmlidXRlZCBieSBKYXkgVm9zYnVyZ2ggKGpheUBtZW50b3IuY2MucHVyZHVlLmVkdSkKKwkqIG0tc3ltbWV0cnkuaCwgc3ltbWV0cnktZGVwLmM6IENyZWF0ZWQuCisJKiBNYWtlZmlsZTogQWRkZWQgYWJvdmUgaW4gYXBwcm9wcmlhdGUgbGlzdHMuCisJKiBjb25maWcuZ2RiOiBBZGRlZCAic3ltbWV0cnkiIHRhcmdldC4KKworCSogdXRpbHMuYyAocHJvbXB0X2Zvcl9jb250aW51ZSk6IFplcm8nZCBjaGFyc19wcmludGVkIGFsc28uCisKKwkqIHV0aWxzLmMgKGZwcmludGZfZmlsdGVyZWQpOiBDYWxsIHByb21wdCBmb3IgY29udGludWUgaW5zdGVhZCBvZgorCWRvaW5nIGl0IHlvdXJzZWxmLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYik6IEFkZGVkIGNvZGUgdG8gY29uZGl0aW9uYWxpemUgd2hhdAorCXN5bWJvbCB0eXBlIGhvbGRzIHRvICJ4Lm8iIG9yICItbHgiIHN5bWJvbCB0aGF0IGluZGljYXRlcyB0aGUKKwliZWdpbm5pbmcgb2YgYSBuZXcgZmlsZS4KKworVHVlIEZlYiAyMSAxNjoyMjoxMyAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBnZGIudGV4aW5mbzogRGVsZXRlZCBAaWdub3JlIGJsb2NrIGF0IGVuZCBvZiBmaWxlLgorCisJKiBmaW5kdmFyLmMsIHN0YWNrLmM6IENoYW5nZWQgY29tbWVudHMgdGhhdCByZWZlcmVkIHRvICJmcmFtZQorCWFkZHJlc3MiIHRvICJmcmFtZSBpZCIuCisKKwkqIGZpbmR2YXIuYyAobG9jYXRlX3Zhcl92YWx1ZSk6IE1vZGlmaWVkIHNvIHRoYXQgdGFraW5nIHRoZQorCWFkZHJlc3Mgb2YgYW4gYXJyYXkgZ2VuZXJhdGVzIGFuIG9iamVjdCB3aG9zZSB0eXBlIGlzIGEgcG9pbnRlciB0bworCXRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkuCisKK1NhdCBGZWIgMTggMTY6MzU6MTQgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogZ2RiLnRleGluZm86IFJlbW92ZWQgcmVmZXJlbmNlIHRvICIhIiBhcyBhIHNoZWxsIGVzY2FwZQorCWNoYXJhY3Rlci4gIEFkZGVkIGEgc2VjdGlvbiBvbiBjb250cm9saW5nIHNjcmVlbiBvdXRwdXQKKwkocGFnaW5hdGlvbik7IGNoYW5naW5nICJJbnB1dCIgc2VjdGlvbiB0byAiVXNlciBJbnRlcmZhY2UiCisJc2VjdGlvbi4gIENoYW5nZWQgbWFueSBpbmFwcHJvcHJpYXRlIHN1YnN1YnNlY3Rpb24gbm9kZXMgaW50bworCXN1YnNlY3Rpb25zIG5vZGVzIChpbiB0aGUgcmVhZGxpbmUgYW5kIGhpc3RvcnkgZXhwYW5zaW9uCisJc2VjdGlvbnMpLiAKKworRnJpIEZlYiAxNyAxMToxMDo1NCAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiB1dGlscy5jIChzZXRfc2NyZWVuc2l6ZV9jb21tYW5kKTogQ3JlYXRlZC4KKwkoX2luaXRpYWxpemVfdXRpbHMpOiBBZGRlZCBhYm92ZSB0byBzZXRsaXN0LgorCisJKiBtYWluLmMgKG1haW4pOiBBZGRlZCBjaGVjayB0byBzZWUgaWYgfi8uZ2RiaW5pdCBhbmQgLmdkYmluaXQKKwl3ZXJlIHRoZSBzYW1lIGZpbGU7IG9ubHkgb25lIGdldHMgcmVhZCBpZiBzby4gIEhhZCB0byBpbmNsdWRlCisJc3lzL3N0YXQuaCBmb3IgdGhpcy4KKworCSogdmFscHJpbnQuYyAodHlwZV9wcmludF9iYXNlKTogQ2hhbmdlZCBjYWxscyB0byBwcmludF9zcGFjZXMgdG8KKwlwcmludF9zcGFjZXNfZmlsdGVyZWQuIAorCisJKiBtYWluLmMgKGNvbW1hbmRfbGluZV9pbnB1dCk6IENoYW5lZCB0ZXN0IGZvciBjb21tYW5kIGxpbmUKKwllZGl0aW5nIHRvIGNoZWNrIGZvciBzdGRpbiBhbmQgaXNhdHR5LgorCisJKiBtYWluLmMgKGNvbW1hbmRfbG9vcCk6IENhbGwgcmVpbml0aWFsaXplX21vcmVfZmlsdGVyIGJlZm9yZSBlYWNoCisJY29tbWFuZCAoaWYgcmVhZGluZyBmcm9tIHN0ZGluIGFuZCBpdCdzIGEgdHR5KS4KKwl1dGlscy5jIChpbml0aWFsaXplX21vcmVfZmlsdGVyKTogQ2hhbmdlZCBuYW1lIHRvCisJcmVpbml0aWFsaXplX21vcmVfZmlsdGVyOyBraWxsZWQgYXJndW1lbnRzLgorCXV0aWxzLmMgKF9pbml0aWFsaXplX3V0aWxzKTogQ3JlYXRlZDsgaW5pdGlhbGl6ZWQgbGluZXNfcGVyX3BhZ2UKKwlhbmQgY2hhcnNfcGVyX2xpbmUgaGVyZS4KKworCSogdXRpbHMuYyAoZnByaW50Zl9maWx0ZXJlZCk6IFJlbW92ZWQgcHJpbnRpbmcgb2YgIlxcXG4iIGFmdGVyCisJcHJpbnRpbmcgbGluZXNpemUgLSAxIGNoYXJzOyBhc3N1bWUgdGhhdCB0aGUgc2NyZWVuIGRpc3BsYXkgd2lsbAorCXRha2UgY2FyZSBvZiB0aGF0LiAgU3RpbGwgd2F0Y2hpbmcgdGhhdCBvdmVyZmxvdy4KKworCSogbWFpbi5jOiBDcmVhdGVkIHRoZSBnbG9iYWwgdmFyaWFibGVzIGxpbmVzaXplIGFuZCBwYWdlc2l6ZSB0bworCWRlc2NyaWJlIHRoZSBudW1iZXIgb2YgY2hhcnMgcGVyIGxpbmUgYW5kIGxpbmVzIHBlciBwYWdlLgorCitUaHUgRmViIDE2IDE3OjI3OjQzIDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBnbHV0ZXVzLmFpLm1pdC5lZHUpCisKKwkqIHByaW50Y21kLmMgKGRvX2V4YW1pbmUsIHByaW50X3NjYWxhcl9mb3JtYXR0ZWQsIHByaW50X2FkZHJlc3MsCisJd2hhdGlzX2NvbW1hbmQsIGRvX29uZV9kaXNwbGF5LCBwdHlwZV9jb21tYW5kKSwgdmFscHJpbnQuYworCSh2YWx1ZV9wcmludCwgdmFsX3ByaW50LCB0eXBlX3ByaW50X21ldGhvZF9hcmdzLCB0eXBlX3ByaW50XzEsCisJdHlwZV9wcmludF9kZXJpdmF0aW9uX2luZm8sIHR5cGVfcHJpbnRfdmFyc3BlY19zdWZmaXgsCisJdHlwZV9wcmludF9iYXNlKSwgYnJlYWtwb2ludC5jIChicmVha3BvaW50c19pbmZvLCBicmVha3BvaW50XzEpLAorCXZhbHVlcy5jIChoaXN0b3J5X2luZm8pLCBtYWluLmMgKGVkaXRpbmdfaW5mbywgd2FycmFudHlfaW5mbywKKwljb3B5aW5nX2luZm8pLCBpbmZjbWQuYyAocmVnaXN0ZXJzX2luZm8pLCBpbmZsb3cuYworCSh0ZXJtX3N0YXR1c19jb21tYW5kKSwgaW5mcnVuLmMgKHNpZ25hbHNfaW5mbyksIHN0YWNrLmMKKwkoYmFja3RyYWNlX2NvbW1hbmQsIHByaW50X2ZyYW1lX2luZm8pLCBzeW10YWIuYyAobGlzdF9zeW1ib2xzLAorCW91dHB1dF9zb3VyY2VfZmlsZW5hbWUpLCBjb21tYW5kLmMgKGhlbHBfY21kLCBoZWxwX2xpc3QsCisJaGVscF9jb21tYW5kX2xpc3QpOiBSZXBsYWNlZCBjYWxscyB0byBwcmludGYsIGZwcmludGYsIGFuZCBwdXRjCisJd2l0aCBjYWxscyB0byBbZl1wcmludGZfZmlsdGVyZWQgdG8gaGFuZGxlIG1vcmUgcHJvY2Vzc2luZy4KKwlLaWxsZWQgbG9jYWwgbW9yZSBlbXVsYXRpb25zIHdoZXJlIEkgbm90aWNlZCB0aGVtLgorCitXZWQgRmViIDE1IDE1OjI3OjM2IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBnbHV0ZXVzLmFpLm1pdC5lZHUpCisKKwkqIGRlZnMuaCwgdXRpbHMuYyAoaW5pdGlhbGl6ZV9tb3JlX2ZpbHRlciwgZnByaW50Zl9maWx0ZXJlZCwKKwlwcmludGZfZmlsdGVyZWQpOiBDcmVhdGVkIGEgcHJpbnRmIHRoYXQgd2lsbCBhbHNvIGFjdCBhcyBhIG1vcmUKKwlmaWx0ZXIsIHByb21wdGluZyB0aGUgdXNlciBmb3IgYSA8cmV0dXJuPiB3aGVuZXZlciB0aGUgcGFnZSBsZW5ndGgKKwlpcyBvdmVyZmxvd2VkLgorCisJKiBzeW10YWIuYyAobGlzdF9zeW1ib2xzKTogRWxtaW5hdGVkIHNvbWUgY29kZSBpbnNpZGUgb2YgYW4gI2lmIDAuIAorCitUdWUgRmViIDE0IDExOjExOjI0IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBnbHV0ZXVzLmFpLm1pdC5lZHUpCisKKwkqIE1ha2VmaWxlOiBUdXJuZWQgb2ZmIGJhY2t1cCB2ZXJzaW9ucyBmb3IgdGhpcyBmaWxlOyBpdCBjaGFuZ2VzCisJdG9vIG9mdGVuLgorCisJKiBjb21tYW5kLmMgKGxvb2t1cF9jbWQsIF9pbml0aWFsaXplX2NvbW1hbmQpOiBDaGFuZ2VkICchJyBzbyB0aGF0CisJaXQgd2FzIG5vIGxvbmdlciBhIHNoZWxsIGVzY2FwZS4gICJzaCIgbXVzdCBiZSB1c2VkLgorCisJKiBtYWluLmMgKGNvbW1hbmRfbGluZV9pbnB1dCwgc2V0X2hpc3RvcnlfZXhwYW5zaW9uLAorCWluaXRpYWxpemVfbWFpbik6IFR1cm5lZCBoaXN0b3J5IGV4cGFuc2lvbiBvbiwgbWFkZSBpdCB0aGUKKwlkZWZhdWx0LCBhbmQgb25seSBleGVjdXRlIGl0IGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIGxpbmUgaXMKKwlhICchJy4KKworCSogdmVyc2lvbi5jLCBnZGIudGV4aW5mbzogTW92ZWQgdmVyc2lvbiB0byAzLjIgKGFzIHVzdWFsLCBqdW1waW5nCisJdGhlIGd1biBzb21lIHRpbWUgYmVmb3JlIHJlbGVhc2UpLgorCisJKiBnZGIudGV4aW5mbzogQWRkZWQgc2VjdGlvbnMgKGFkYXB0ZWQgZnJvbSBCcmlhbidzIG5vdGVzKSBvbgorCWNvbW1hbmQgbGluZSBlZGl0aW5nIGFuZCBoaXN0b3J5IGV4cGFuc2lvbi4KKworCSogbWFpbi5jIChzZXRfY29tbWFuZF9lZGl0aW5nLCBpbml0aWFsaXplX21haW4pOiBNb2RpZmllZCBuYW1lIHRvCisJc2V0X2VkaXRpbmcgYW5kIG1vZGlmaWVkIGNvbW1hbmQgdG8gInNldCBlZGl0aW5nIi4KKworCSogTWFrZWZpbGU6IFB1dCBpbiBkZXBlbmRlbmNpZXMgZm9yIFJFQURMSU5FT0JKUy4KKworCSogbWFpbi5jIChoaXN0b3J5X2luZm8sIGNvbW1hbmRfaW5mbyk6IENvbWJpbmVkIGludG8gbmV3IGNvbW1hbmQKKwlpbmZvOyBkZWxldGVkIGhpc3RvcnlfaW5mby4KKwkoaW5pdGlhbGl6ZV9tYWluKTogRGVsZXRlZCAiaW5mbyBoaXN0b3J5IiBjb21tYW5kOyBpdCB3YXMKKwlpbnRlcmZlcmluZyB3aXRoIHRoZSB2YWx1ZSBoaXN0b3J5LgorCisJKiBjb2ZmcmVhZC5jIChlbnRlcl9saW5lbm9zKTogTW9kaWZpZWQgdG8gZG8gYml0IGNvcHkgaW5zdGVhZCBvZgorCXBvaW50ZXIgZGVyZWZlcmVuY2UsIHNpbmNlIHRoZSBjbGlwcGVyIG1hY2hpbmUgY2FuJ3QgaGFuZGxlIGhhdmluZworCWxvbmdzIG9uIHNob3J0IGJvdW5kYXJpZXMuCisJKHJlYWRfZmlsZV9oZHIpOiBBZGRlZCBjb2RlIHRvIGdldCBudW1iZXIgb2Ygc3ltcyBmb3IgY2xpcHBlci4KKworCSogc3RhY2suYyAocmV0dXJuX2NvbW1hbmQpOiBGaXhlZCBtZXRob2QgZm9yIGNoZWNraW5nIHdoZW4gYWxsIG9mCisJdGhlIG5lY2Vzc2FyeSBmcmFtZXMgaGFkIGJlZW4gcG9wcGVkLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYiAoQUREX1BTWU1CT0xfVE9fTElTVCkpOiBGaXhlZCB0eXBvIGluCisJYWxsb2NhdGlvbiBsZW5ndGguCisKK01vbiBGZWIgMTMgMTA6MDM6MjcgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGdsdXRldXMuYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIpOiBTcGxpdCBhc3NpZ25tZW50IHRvIG5hbWVzdHJpbmcgaW50bworCXNldmVyYWwgZGlmZmVyZW50IGFzc2lnbm1lbnRzIChzbyB0aGF0IGl0IHdvdWxkbid0IGJlIGRvbmUgZXhjZXB0CisJd2hlbiBpdCBoYWQgdG8gYmUpLiAgU2hvcnRlbmVkIHN3aXRjaGVzIGFuZCBkdXBsaWNhdGVkIGNvZGUgdG8KKwlwcm9kdWNlIHRoZSBsb3dlc3QgcG9zc2libGUgZXhlY3V0aW9uIHRpbWUuICBDb21tZW50ZWQgKGF0IHRvcCBvZgorCXN3aXRjaCkgd2hpY2ggY29kZSBJIGR1cGxpY2F0ZWQuCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogTW9kaWZpZWQgd2hpY2ggdmFyaWFibGVzIHdlcmUKKwlyZWdpc3RlciBhbmQgZGVsZXRlZCBzZXZlcmFsIHZhcmlhYmxlcyB3aGljaCB3ZXJlbid0IHVzZWQuICBBbHNvCisJZWxpbWluYXRlZCAnRicgY2hvaWNlIGZyb20gc3Vic3dpdGNoLCBicm9rZSBvdXQgc3RyY21wJ3MsIHJldmVyc2VkCisJY29tcGFyZSBvbiBsaW5lIDE5ODYsIGFuZCBlbG1pbmF0ZWQgdGVzdCBmb3IgIW5hbWVzdHJpbmdbMF07IGl0IGlzCisJY2F1Z2h0IGJ5IGZvbGxvd2luZyB0ZXN0IGZvciBudWxsIGluZGV4IG9mICc6Jy4KKworU3VuIEZlYiAxMiAxMjo1Nzo1NiAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgcGxhbnRhcmlzLmFpLm1pdC5lZHUpCisKKwkqIG1haW4uYyAoZ2RiX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMpOiBUdXJuZWQgXH4gaW50byB+LgorCitTYXQgRmViIDExIDE1OjM5OjA2IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBwbGFudGFyaXMuYWkubWl0LmVkdSkKKworCSogc3ltdGFiLmMgKGZpbmRfcGNfcHN5bXRhYik6IENyZWF0ZWQ7IGNoZWNrcyBhbGwgcHN5bXRhYidzIHRpbGwKKwlpdCBmaW5kcyBwYy4KKwkoZmluZF9wY19zeW10YWIpOiBVc2VkOyBmYXRhbCBlcnJvciBpZiBwc3ltdGFiIGZvdW5kIGlzIHJlYWRpbgorCShzaG91bGQgaGF2ZSBiZWVuIGNhdWdodCBpbiBzeW10YWIgbG9vcCkuCisJKGxvb2t1cF9zeW1ib2wpOiBBZGRlZCBjaGVjayBiZWZvcmUgc2NhbiB0aHJvdWdoIHBhcnRpYWwgc3ltdGFiCisJbGlzdCBmb3Igc3ltYm9sIG5hbWUgdG8gYmUgb24gdGhlIG1pc2MgZnVuY3Rpb24gdmVjdG9yIChvbmx5IGlmIGluCisJVkFSX05BTUVTUEFDRSkuICBBbHNvIG1hZGUgc3VyZSB0aGF0IHBzeW10YWIncyB3ZXJlbid0IGZvb2xlZCB3aXRoCisJaWYgdGhleSBoYWQgYWxyZWFkeSBiZWVuIHJlYWQgaW4uCisJKGxpc3Rfc3ltYm9scyk6IENoZWNrZWQgdGhyb3VnaCBtaXNjX2Z1bmN0aW9uX3ZlY3RvciBmb3IgbWF0Y2hpbmcKKwluYW1lcyBpZiB3ZSB3ZXJlIGxvb2tpbmcgZm9yIGZ1bmN0aW9ucy4KKwkobWFrZV9zeW1ib2xfY29tcGxldGlvbl9saXN0KTogQ2hlY2tlZCB0aHJvdWdoCisJbWlzY19mdW5jdGlvbl92ZWN0b3IgZm9yIG1hdGNoaW5nIG5hbWVzLgorCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIpOiBEb24ndCBib3RoZXIgdG8gZG8gcHJvY2Vzc2luZyBvbgorCWdsb2JhbCBmdW5jdGlvbiB0eXBlczsgdGhpcyB3aWxsIGJlIHRha2VuIGNhcmUgb2YgYnkgdGhlCisJbWlzY19mdW5jdGlvbiBoYWNrLgorCisJKiBzeW10YWIuaDogTW9kaWZpZWQgY29tbWVudCBvbiBtaXNjX2Z1bmN0aW9uIHN0cnVjdHVyZS4KKworRnJpIEZlYiAxMCAxODowOTozMyAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgcGxhbnRhcmlzLmFpLm1pdC5lZHUpCisKKwkqIHN5bXNlZy5oLCBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYiwgaW5pdF9wc3ltYm9sX2xpc3QsCisJc3RhcnRfcHN5bXRhYiwgZW5kX3BzeW10YWIpLCBjb2ZmcmVhZC5jIChfaW5pdGlhbGl6ZV9jb2ZmKSwKKwlzeW10YWIuYyAobG9va3VwX3BhcnRpYWxfc3ltYm9sLCBsaXN0X3N5bWJvbHMsCisJbWFrZV9zeW1ib2xfY29tcGxldGlvbl9saXN0KTogQ2hhbmdlZCBzZXBhcmF0ZSB2YXJpYWJsZXMgZm9yCisJZGVzY3JpcHRpb24gb2YgcGFydGlhbCBzeW1ib2wgYWxsb2NhdGlvbiBpbnRvIGEgc3BlY2lmaWMga2luZCBvZgorCXN0cnVjdHVyZS4KKworCShyZWFkX2RieF9zeW10YWIsIHByb2Nlc3Nfc3ltYm9sX2Zvcl9wc3ltdGFiKTogTW92ZWQgbW9zdCBvZgorCXByb2Nlc3Nfc3ltYm9sX2Zvcl9wc3ltdGFiIHVwIGludG8gcmVhZF9kYnhfc3ltdGFiLCBtb3ZlZCBhIGNvdXBsZQorCW9mIHN5bWJvbCB0eXBlcyBkb3duIHRvIHRoZSBpbmdvcmUgc2VjdGlvbiwgc3RyZWFtbGluZWQgKEkgaG9wZSkKKwljb2RlIHNvbWUsIG1vZHVsYXJpemVkIGFjY2VzcyB0byBwc3ltYm9sIGxpc3RzLgorCitUaHUgRmViICA5IDEzOjIxOjE5IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIG1haW4uYyAoY29tbWFuZF9saW5lX2lucHV0KTogTWFkZSBzdXJlIHRoYXQgaXQgY291bGQgcmVjb2duaXplCisJbmV3bGluZXMgYXMgaW5kaWNhdGlvbnMgdG8gcmVwZWF0IHRoZSBsYXN0IGxpbmUuCisKKwkqIHN5bXRhYi5jIChfaW5pdGlhbGl6ZV9zeW10YWIpOiBDaGFuZ2VkIHNpemUgb2YgYnVpbHRpbl90eXBlX3ZvaWQKKwl0byBiZSAxIGZvciBjb21wYXRpYmlsaXR5IHdpdGggZ2NjLgorCisJKiBtYWluLmMgKGluaXRpYWxpemVfbWFpbik6IE1hZGUgaGlzdG9yeV9leHBhbnNpb24gdGhlIGRlZmF1bHQKKwl3aGVuIGdkYiBpcyBjb21waWxlZCB3aXRoIEhJU1RPUllfRVhQQU5TSU9OLgorCisJKiByZWFkbGluZS5jLCByZWFkbGluZS5oLCBoaXN0b3J5LmMsIGhpc3RvcnkuaCwgZ2VuZXJhbC5oLAorCWVtYWNzX2tleW1hcC5jLCB2aV9rZXltYXAuYywga2V5bWFwcy5jLCBmdW5tYXAuYzogTWFkZSBhbGwgb2YKKwl0aGVzZSBsaW5rcyB0byAvZ3AvZ251L2Jhc2gvKiB0byBrZWVwIHRoZW0gdXBkYXRlZC4KKwkqIG1haW4uYyAoaW5pdGlhbGl6ZV9tYWluKTogTWFkZSBkZWZhdWx0IGJlIGNvbW1hbmQgZWRpdGluZyBvbi4gCisKK1dlZCBGZWIgIDggMTM6MzI6MDQgMTk4OSAgJiBTbWl0aCAgKHJhbmR5IGF0IGhvYmJlcykKKworCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIpOiBJZ25vcmUgTl9CU0xJTkUgb24gZmlyc3QKKwlyZWFkdGhyb3VnaC4gCisKKwkqIE1ha2VmaWxlOiBSZW1vdmVkIGNvbnZleC1kZXAuYyBmcm9tIGxpc3Qgb2YgZGlzdHJpYnV0aW9uIGZpbGVzLgorCitUdWUgRmViICA3IDE0OjA2OjI1IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIG1haW4uYzogQWRkZWQgY29tbWFuZCBsaXN0cyBzZXRoaXN0bGlzdCBhbmQgdW5zZXRoaXN0bGlzdCB0bworCWFjY2VzaWJsZSBjb21tYW5kIGxpc3RzLgorCShwYXJzZV9iaW5hcnlfb3BlcmF0aW9uKTogQ3JlYXRlZCB0byBwYXJzZSBhIG9uLzEveWVzIHZzLiBvZmYvMC9ubworCXNwZWMuCisJKHNldF9jb21tYW5kX2VkaXQsIHNldF9oaXN0b3J5LCBzZXRfaGlzdG9yeV9leHBhbnNpb24sCisJc2V0X2hpc3Rvcnlfd3JpdGUsIHNldF9oaXN0b3J5X3NpemUsIHNldF9oaXN0b3J5X2ZpbGVuYW1lLAorCWNvbW1hbmRfaW5mbywgaGlzdG9yeV9pbmZvKTogQ3JlYXRlZCB0byBhbGxvdyB1c2VycyB0byBjb250cm9sCisJdmFyaW91cyBhc3BlY3RzIG9mIGNvbW1hbmQgbGluZSBlZGl0aW5nLgorCisJKiBtYWluLmMgKHN5bWJvbF9jcmVhdGlvbl9mdW5jdGlvbik6IENyZWF0ZWQuCisJKGNvbW1hbmRfbGluZV9pbnB1dCwgaW5pdGlhbGl6ZV9tYWluKTogQWRkZWQgcmVzdCBvZiBzdHVmZgorCW5lY2Vzc2FyeSBmb3IgY2FsbGluZyBiZm94JyBjb21tYW5kIGVkaXRpbmcgcm91dGluZXMgdW5kZXIKKwlydW4tdGltZSBjb250cm9sLgorCSogTWFrZWZpbGU6IEluY2x1ZGVkIHJlYWRsaW5lIGFuZCBoaXN0b3J5IHNvdXJjZSBmaWxlcyBmb3IgY29tbWFuZAorCWVkaXRpbmc7IGFsc28gbWFkZSBhcnJhbmdlbWVudHMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRlcm1jYXAKKwlsaWJyYXJ5IHdhcyBhdmFpbGFibGUuCisJKiBzeW10YWIuYyAobWFrZV9zeW1ib2xfY29tcGxldGlvbl9saXN0KTogQ3JlYXRlZC4KKworTW9uIEZlYiAgNiAxNjoyNToyNSAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBtYWluLmM6IEludmVudGVkIHZhcmlhYmxlcyB0byBjb250cm9sIGNvbW1hbmQgZWRpdGluZy4KKwljb21tYW5kX2VkaXRpbmdfcCwgaGlzdG9yeV9leHBhbnNpb25fcCwgaGlzdG9yeV9zaXplLAorCXdyaXRlX2hpc3RvcnlfcCwgaGlzdG9yeV9maWxlbmFtZS4gIEluaXRpYWxpemVkIHRoZW0gdG8gZGVmYXVsdAorCXZhbHVlcyBpbiBpbml0aWFsaXplX21haW4uCisKKwkqIGluZmNtZC5jIChyZWdpc3RlcnNfaW5mbyksIGluZnJ1bi5jIChzaWduYWxzX2luZm8pLCAKKwkqIG1haW4uYyAoZ2RiX3JlYWRfbGluZSk6IENoYW5nZWQgbmFtZSB0byBjb21tYW5kX2xpbmVfaW5wdXQuCisJKHJlYWRsaW5lKTogQ2hhbmdlZCBuYW1lIHRvIGdkYl9yZWFkbGluZTsgYWRkZWQgc2Vjb25kIGFyZ3VtZW50CisJaW5kaWNhdGluZyB0aGF0IHRoZSByZWFkIHZhbHVlIHNob3VsZG4ndCBiZSBzYXZlZCAodmlhIG1hbGxvYykuCisJKiBpbmZjbWQuYyAocmVnaXN0ZXJzX2luZm8pLCBpbmZydW4uYyAoc2lnbmFsc19pbmZvKSwgbWFpbi5jCisJKGNvcHlpbmdfaW5mbyksIHN5bXRhYi5jIChvdXRwdXRfc291cmNlX2ZpbGVuYW1lLCBNT1JFLAorCWxpc3Rfc3ltYm9scyk6IENvbnZlcnRlZCB0byB1c2UgZ2RiX3JlYWRsaW5lIGluIHBsYWNlIG9mCisJZ2RiX3JlYWRfbGluZS4gCisKKworU3VuIEZlYiAgNSAxNzozNDozOCAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBibG9ja2ZyYW1lLmMgKGdldF9mcmFtZV9zYXZlZF9yZWdzKTogUmVtb3ZlZCBtYWNybyBleHBhbnNpb24KKwl0aGF0IGhhZCBhY2NpZGVudGFsbHkgYmVlbiBsZWZ0IGluIHRoZSBjb2RlLgorCitTYXQgRmViICA0IDE3OjU0OjE0IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIG1haW4uYyAoZ2RiX3JlYWRfbGluZSwgcmVhZGxpbmUpOiBBZGRlZCBmdW5jdGlvbiByZWFkbGluZSBhbmQKKwljb252ZXJ0ZWQgZ2RiX3JlYWRfbGluZSB0byB1c2UgaXQuICBUaGlzIHdhcyBhIGNvbnZlcnNpb24gdG8gdGhlCisJbGluZSBhdCBhIHRpbWUgc3R5bGUgb2YgaW5wdXQsIGluIHByZXBhcmF0aW9uIGZvciBmdWxsIGNvbW1hbmQKKwllZGl0aW5nLiAKKworRnJpIEZlYiAgMyAxMjozOTowMyAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYik6IENhbGwgZW5kX3BzeW10YWIgYXQgdGhlIGVuZCBvZgorCXJlYWRfZGJ4X3N5bXRhYiBpZiBhbnkgcHN5bXRhYiBzdGlsbCBuZWVkcyB0byBiZSBjb21wbGV0ZWQuCisKKwkqIGNvbmZpZy5nZGIsIHN1bjMtZGVwLmM6IEJyb3VnaHQgdGhlc2UgaW50byBhY2NvcmQgd2l0aCB0aGUKKwlhY3R1YWwgc3VuMiBzdGF0dXMgKG5vIGZsb2F0aW5nIHBvaW50IHBlcmlvZDsgc3VuMy1kZXAuYyB1bmxlc3MKKwloYXMgb3MgPiAzLjApLgorCSogbS1zdW4yb3MyLmg6IERlbGV0ZWQ7IG5vdCBuZWVkZWQuCisKKwkqIGNvbmZpZy5nZGI6IEFkZGVkIGEgY291cGxlIG9mIGFsaWFzZXMgZm9yIG1hY2hpbmVzIGluIHRoZQorCXNjcmlwdC4gCisKKwkqIGluZnJ1bi5jOiBBZGRlZCBpbmNsdXNpb24gb2YgYW91dGhkci5oIGluc2lkZSBvZiAjaWZkZWYgVU1BWAorCWJlY2F1c2UgcHRyYWNlIG5lZWRzIHRvIGtub3cgYWJvdXQgdGhlIGEub3V0IGhlYWRlci4KKworCSogTWFrZWZpbGU6IE1hZGUgZGVwLm8gZGVwZW5kIG9uIGRlcC5jIGFuZCBjb25maWcuc3RhdHVzIG9ubHkuCisKKwkqIGV4cHJlYWQueTogQWRkZWQgZGVjbGFyYXRpb25zIG9mIGFsbCBvZiB0aGUgbmV3IHdyaXRlX2V4cF9lbHQKKwlmdW5jdGlvbnMgYXQgdGhlIGluY2x1ZGUgc2VjdGlvbiBpbiB0aGUgdG9wLgorCisJKiBNYWtlZmlsZTogQWRkZWQgYSBZQUNDIGRlZmluaXRpb24gc28gdGhhdCBwZW9wbGUgY2FuIHVzZSBiaXNvbgorCWlmIHRoZXkgd2lzaC4KKworCSogTWFrZWZpbGU6IEFkZGVkIHJtcycgWEdEQi1SRUFETUUgdG8gdGhlIGRpc3RyaWJ1dGlvbi4KKworCSogTWFrZWZpbGU6IEFkZGVkIHJlbW92YWwgb2YgaW5pdC5vIG9uIGEgIm1ha2UgY2xlYW4iLgorCitUaHUgRmViICAyIDE2OjI3OjA2IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqICotZGVwLmM6IERlbGV0ZWQgZGVmaW5pdGlvbiBvZiBDT0ZGX0ZPUk1BVCBpZiBBT1VUSERSIHdhcworCWRlZmluZWQgc2luY2UgMSkgV2UgKm1heSogKHJlY2VudCBtYWlsIG1lc3NhZ2UpIHdhbnQgdG8gZGVmaW5lCisJQU9VVEhEUiB1bmRlciBhIGJhc2ljYWxseSBCU0Qgc3lzdGVtLCBhbmQgMikgQU9VVEhEUiBpcyBzb21ldGltZXMKKwlhIHR5cGVkZWYgaW4gY29mZiBlbmNhcHN1bGF0aW9uIHNldHVwcy4gIEFsc28gcmVtb3ZlZCAjZGVmaW5lJ3Mgb2YKKwlBT1VUSERSIGlmIEFPVVRIRFIgaXMgYWxyZWFkeSBkZWZpbmVkIChpbnNpZGUgb2YgY29mZiBmb3JtYXQpLiAgCisJKiBjb3JlLmMsIGRieHJlYWQuYzogUmVtb3ZlZCAjZGVmaW5lJ3Mgb2YgQU9VVEhEUiBpZiBBT1VUSERSIGlzCisJYWxyZWFkeSBkZWZpbmVkIChpbnNpZGUgb2YgY29mZiBmb3JtYXQpLgorCitUdWUgSmFuIDMxIDEyOjU2OjAxIDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIEdEQiAzLjEgcmVsZWFzZWQuCisKKwkqIHZhbHVlcy5jIChtb2RpZnlfZmllbGQpOiBDaGFuZ2VkIHRlc3QgZm9yIGVuZGlhbm5lc3MgdG8gYXNzaWduCisJdG8gaW50ZWdlciBhbmQgcmVmZXJlbmNlIGNoYXJhY3RlciAoc28gdGhhdCBhbGwgYml0cyB3b3VsZCBiZQorCWRlZmluZWQpLiAKKworTW9uIEphbiAzMCAxMTo0MToyMSAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBuZXdzLWRlcC5jOiBEZWxldGVkIGluY2x1c2lvbiBvZiBmY250bC5oOyBqdXN0IGR1cGxpY2F0ZXMgc3R1ZmYKKwlmb3VuZCBpbiBzeXMvZmlsZS5oLgorCisJKiBpMzg2LWRlcC5jOiBJbmNsdWRlZCBkZWZhdWx0IGRlZmluaXRpb24gb2YgTl9TRVRfTUFHSUMgZm9yCisJQ09GRl9GT1JNQVQuCisKKwkqIGNvbmZpZy5nZGI6IEFkZGVkIGNoZWNrcyBmb3Igc2V2ZXJhbCBkaWZmZXJlbnQgb3BlcmF0aW5nCisJc3lzdGVtcy4gCisKKwkqIGNvZmZyZWFkLmMgKHJlYWRfc3RydWN0X3R5cGUpOiBQdXQgaW4gYSBmbGFnIHZhcmlhYmxlIHNvIHRoYXQKKwlvbmUgY291bGQgdGVsbCB3aGVuIHlvdSBnb3QgdG8gdGhlIGVuZCBvZiBhIHN0cnVjdHVyZS4KKworCSogc3VuMy1kZXAuYyAoY29yZV9maWxlX2NvbW1hbmQpOiBDaGFuZ2VkICNpZmRlZiBiYXNlZCBvbiBTVU5PUzQKKwl0byBpZmRlZiBiYXNlZCBvbiBGUFUuCisKKwkqIGluZnJ1bi5jIChyZXN0b3JlX2luZmVyaW9yX3N0YXR1cyk6IENoYW5nZWQgZXJyb3IgbWVzc2FnZSB0bworCSJ1bmFibGUgdG8gcmVzdG9yZSBwcmV2aW91c2x5IHNlbGVjdGVkIGZyYW1lIi4KKworCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIpOiBVc2VkIGludGVybWVkaWF0ZSB2YXJpYWJsZSBpbiBlcnJvcgorCW1lc3NhZ2UgcmVwb3J0aW5nIGEgYmFkIHN5bWJvbCB0eXBlLiAgKHNjYW5fZmlsZV9nbG9iYWxzLAorCXJlYWRfb2ZpbGVfc3ltdGFiLCByZWFkX2FkZGxfc3ltcyk6IERhdGEgdHlwZSBvZiAidHlwZSIgY2hhbmdlZCB0bworCXVuc2lnbmVkIGNoYXIgKHdoaWNoIGlzIHdoYXQgaXQgaXMpLgorCSogaTM4Ni1kZXAuYzogUmVtb3ZlZCBkZWZpbmUgb2YgQ09GRl9GT1JNQVQgaWYgQU9VVEhEUiBpcyBkZWZpbmVkLgorCVJlbW92ZWQgZGVmaW5lIG9mIGFfbWFnaWMgdG8gbWFnaWMgKHRha2VuIGNhcmUgb2YgYnkgTl9NQUdJQykuCisJKGNvcmVfZmlsZV9jb21tYW5kKTogWmVybydkIGNvcmVfYW91dGhkciBpbnN0ZWFkIG9mIHNldHRpbmcgbWFnaWMKKwl0byB6ZXJvLgorCSogaTM4Ni1waW5zbi5jOiBDaGFuZ2VkIGpjeHogPT0gakNjeHogaW4ganVtcCB0YWJsZS4KKwkocHV0b3ApOiBBZGRlZCBhIGNhc2UgZm9yICdDJy4KKwkoT1BfSik6IEFkZGVkIGNvZGUgdG8gaGFuZGxlIHBvc3NpYmxlIG1hc2tpbmcgb2YgUEMgdmFsdWUgb24KKwljZXJ0YWluIGtpbmRzIG9mIGRhdGEuCisJbS1pMzg2Z2FzLmg6IE1vdmVkIENPRkZfRU5DQVBTVUxBVEUgdG8gYmVmb3JlIGluY2x1c2lvbiBvZgorCW0taTM4Ni5oIGFuZCBkZWZpbmVkIE5BTUVTX0hBVkVfVU5ERVJTQ09SRS4KKworCSogY29mZnJlYWQuYyAodW5yZWNyb2RfbWlzY19mdW5jdGlvbiwgcmVhZF9jb2ZmX3N5bXRhYik6IEFkZGVkCisJc3ltYm9sIG51bWJlciBvbiB3aGljaCBlcnJvciBvY2N1cmVkIHRvIGVycm9yIG91dHB1dC4KKworRnJpIEphbiAyNyAxMTo1NTowNCAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBNYWtlZmlsZTogUmVtb3ZlZCBpbml0LmMgaW4gbWFrZSBjbGVhbi4gIFJlbW92ZWQgaXQgd2l0aG91dCAtZgorCWFuZCB3aXRoIGxlYWRpbmcgLSBpbiBtYWtlID9nZGIuCisKK1RodSBKYW4gMjYgMTU6MDg6MDMgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGdsdXRldXMuYWkubWl0LmVkdSkKKworCUNoYW5nZXMgdG8gZ2V0IGl0IHRvIHdvcmsgb24gZ291bGQgTlAxLgorCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIpOiBJbmNsdWRlZCBjYXNlcyBmb3IgTl9OQkRBVEEgYW5kCisJTl9OQkJTUy4KKwkocHN5bXRhYl90b19zeW10YWIpOiBDaGFuZ2VkIGRlY2xhcmF0aW9uIG9mIGhkciB0bworCURFQ0xBUkVfRklMRV9IRUFERVJTLiAgQ2hhbmdlZCBhY2Nlc3MgdG8gdXNlIFNUUklOR19UQUJMRV9TSVpFIGFuZAorCVNZTUJPTF9UQUJMRV9TSVpFLgorCSogZ2xkLXBpbnNuLmMgKGZpbmRmcmFtZSk6IEFkZGVkIGRlY2xhcmF0aW9uIG9mIGZyYW1lY2hhaW4oKSBhcworCUZSQU1FX0FERFIuIAorCisJKiBjb2ZmcmVhZC5jIChyZWFkX2NvZmZfc3ltdGFiKTogQXZvaWRlZCB0cmVhdGluZyB0eXBlZGVmcyBhcworCWV4dGVybmFsIHN5bWJvbCBkZWZpbml0aW9ucy4KKworV2VkIEphbiAyNSAxNDo0NTo0MyAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBNYWtlZmlsZTogUmVtb3ZlZCByZWZlcmVuY2UgdG8gYWxsb2NhLmMuICBJZiB0aGV5IG5lZWQgaXQsIHRoZXkKKwljYW4gcHVsbCBhbGxvY2EubyBmcm9tIHRoZSBnbnUtZW1hY3MgZGlyZWN0b3J5LgorCisJKiB2ZXJzaW9uLmMsIGdkYi50ZXhpbmZvOiBVcGRhdGVkIHZlcnNpb24gdG8gMy4xIChqdW1waW5nIHRoZSBndW4KKwlhIGJpdCBzbyB0aGF0IEkgd29uJ3QgZm9yZ2V0IHdoZW4gSSByZWxlYXNlKS4KKworCSogbS1zdW4yLmgsIG0tc3VuMm9zMi5oLCBtLXN1bjNvczQuaCwgY29uZmlnLmdkYjogTW9kaWZpZWQgY29kZSBzbworCXRoYXQgZGVmYXVsdCBpbmNsdWRlcyBuZXcgc3VuIGNvcmUsIHB0cmFjZSwgYW5kIGF0dGFjaC1kZXRhY2guCisJQWRkZWQgZGVmYXVsdHMgZm9yIHN1biAyIG9zIDIuCisKKwlNb2RpZmljYXRpb25zIHRvIHJlc2V0IHN0YWNrIGxpbWl0IGJhY2sgdG8gd2hhdCBpdCB1c2VkIHRvIGJlIGp1c3QKKwliZWZvcmUgZXhlYy4gIEFsbCBtb2RzIGluc2lkZSBvZiAjaWZkZWYgU0VUX1NUQUNLX0xJTUlUX0hVR0UuCisJKiBtYWluLmM6IEFkZGVkIGdsb2JhbCB2YXJpYWJsZSBvcmlnaW5hbF9zdGFja19saW1pdC4KKwkobWFpbik6IFNldCBvcmlnaW5hbF9zdGFja19saW1pdCB0byBvcmlnaW5hbCBzdGFjayBsaW1pdC4KKwkqIGluZmxvdy5jOiBBZGRlZCBpbmNsdXNpb24gb2YgbmVjZXNzYXJ5IGZpbGVzIGFuZCBleHRlcm5hbAorCXJlZmVyZW5jZSB0byBvcmlnaW5hbF9zdGFja19saW1pdC4KKwkoY3JlYXRlX2luZmVyaW9yKTogUmVzZXQgc3RhY2sgbGltaXQgdG8gb3JpZ2luYWxfc3RhY2tfbGltaXQuCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogS2lsbGVkIFBST0ZJTEVfU1lNQk9MUyBpZmRlZi4KKworCSogc3BhcmMtZGVwLmMgKGlzYWJyYW5jaCk6IE11bHRpcGxpZWQgb2Zmc2V0IGJ5IDQgYmVmb3JlIGFkZGluZyBpdAorCXRvIGFkZHIgdG8gZ2V0IHRhcmdldC4KKworCSogTWFrZWZpbGU6IEFkZGVkIGRlZmluaXRpb24gb2YgU0hFTEwgdG8gTWFrZWZpbGUuCisKKwkqIG0tc3VuMm9zNC5oOiBBZGRlZCBjb2RlIHRvIGRlZmluZSBORVdfU1VOX1BUUkFDRSwgTkVXX1NVTl9DT1JFLAorCWFuZCBBVFRBQ0hfREVUQUNILgorCSogc3VuMy1kZXAuYzogQWRkZWQgY29kZSB0byBhdm9pZCBmcCByZWdzIGlmIHdlIGFyZSBvbiBhIHN1bjIuCisKK1R1ZSBKYW4gMjQgMTc6NTk6MTQgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jIChyZWFkX2FycmF5X3R5cGUpOiBBZGRlZCBmdW5jdGlvbi4KKwkocmVhZF90eXBlKTogQWRkZWQgY2FsbCB0byBhYm92ZSBpbnN0ZWFkIG9mIGlubGluZSBjb2RlLgorCisJKiBNYWtlZmlsZTogQWRkZWQgJHtHTlVfTUFMTE9DfSB0byB0aGUgbGlzdCBvZiBkZXBlbmRlbmNpZXMgZm9yCisJdGhlIGV4ZWN1dGFibGVzLgorCitNb24gSmFuIDIzIDE1OjA4OjUxIDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBwbGFudGFyaXMuYWkubWl0LmVkdSkKKworCSogZ2RiLnRleGluZm86IEFkZGVkIHBhcmFncmFwaCB0byBzdW1tYXJ5IGRlc2NyaWJpbmcgbGFuZ3VhZ2VzCisJd2l0aCB3aGljaCBnZGIgY2FuIGJlIHJ1bi4gIEFsc28gYWRkZWQgZGVzY3JpcHRpb25zIG9mIHRoZQorCSJpbmZvLW1ldGhvZHMiIGFuZCAiYWRkLWZpbGUiIGNvbW1hbmRzLgorCisJKiBzeW1zZWcuaDogQ29tbWVudGVkIGEgcmFuZ2UgdHlwZSBhcyBoYXZpbmcgVFlQRV9UQVJHRVRfVFlQRQorCXBvaW50aW5nIGF0IHRoZSBjb250YWluaW5nIHR5cGUgZm9yIHRoZSByYW5nZSAob2Z0ZW4gaW50KS4KKwkqIGRieHJlYWQuYyAocmVhZF9yYW5nZV90eXBlKTogQWRkZWQgY29kZSB0byBkbyBhY3R1YWwgcmFuZ2UgdHlwZXMKKwlpZiB0aGV5IGFyZSBkZWZpbmVkLiAgQXNzdW1lZCB0aGF0IHRoZSBsZW5ndGggb2YgYSByYW5nZSB0eXBlIGlzCisJdGhlIGxlbmd0aCBvZiB0aGUgdGFyZ2V0IHR5cGU7IHRoaXMgaXMgYSBsaWUsIGJ1dCB3aWxsIGRvIHVudGlsCisJc29tZWJvZHkgZ2V0cyBiYWNrIHRvIG1lIGFzIHRvIHdoYXQgdGhlc2Ugc2lsbHkgZGJ4IHN5bWJvbHMgbWVhbi4KKwkKKwkqIGRieHJlYWQuYyAocmVhZF9yYW5nZV90eXBlKTogQWRkZWQgY29kZSB0byBiZSBtb3JlIHBpY2t5IGFib3V0CisJcmVjb2duaXppbmcgYnVpbHRpbnMgYXMgcmFuZ2UgdHlwZXMsIHRvIHRyZWF0IHR5cGVzIGRlZmluZWQgYXMKKwlzdWJyYW5nZXMgb2YgdGhlbXNlbHZlcyB0byBiZSBzdWJyYW5nZXMgb2YgaW50LCBhbmQgdG8gcmVjb2duaXplCisJdGhlIGNoYXIgdHlwZSBpZGlvbSBmcm9tIGRieCBhcyBhIHNwZWNpYWwgY2FzZS4KKworU3VuIEphbiAyMiAwMTowMDoxMyAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBtLXZheC5oOiBSZW1vdmVkIGRlZmluaXRpb24gb2YgRlVOQ1RJT05fSEFTX0ZSQU1FX1BPSU5URVIuCisJKiBibG9ja2ZyYW1lLmMgKGdldF9wcmV2X2ZyYW1lX2luZm8pOiBSZW1vdmVkIGRlZmF1bHQgZGVmaW5pdGlvbgorCWFuZCB1c2Ugb2YgYWJvdmUuICBJbnN0ZWFkIGNvbmRpdGlvbmFsaXplZCBjaGVja2luZyBmb3IgbGVhZiBub2RlcworCW9uIEZVTkNUSU9OX1NUQVJUX09GRlNFVCAoc2VlIGNvbW1lbnQgaW4gY29kZSkuCisKK1NhdCBKYW4gMjEgMTY6NTk6MTkgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jIChyZWFkX3JhbmdlX3R5cGUpOiBGaXhlZCBhc3N1bXB0aW9uIHRoYXQgaW50ZWdlciB3YXMKKwlhbHdheXMgdHlwZSAxLgorCisJKiBnZGIudGV4aW5mbzogRml4ZWQgc3BlbGxpbmcgbWlzdGFrZSBhbmQgYWRkZWQgYSBub3RlIGluIHRoZQorCXJ1bm5pbmcgc2VjdGlvbiBtYWtpbmcgaXQgY2xlYXIgdGhhdCB1c2VycyBtYXkgaW52b2tlIHN1YnJvdXRpbmVzCisJZGlyZWN0bHkgZnJvbSBnZGIuCisKKwkqIGJsb2NrZnJhbWUuYzogU2V0dXAgYSBkZWZhdWx0IGRlZmluaXRpb24gZm9yIHRoZSBtYWNybworCUZVTkNUSU9OX0hBU19GUkFNRV9QT0lOVEVSLgorCShnZXRfcHJldl9mcmFtZV9pbmZvKTogVXNlZCB0aGlzIG1hY3JvIGluc3RlYWQgb2YgY2hlY2tpbmcKKwlTS0lQX1BST0xPR1VFIGRpcmVjdGx5LgorCSogbS12YXguaDogT3ZlcnJvYWQgZGVmaW5pdGlvbjsgYWxsIGZ1bmN0aW9ucyBvbiB0aGUgdmF4IGhhdmUKKwlmcmFtZSBwb2ludGVycy4KKworRnJpIEphbiAyMCAxMjoyNTozNSAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBjb3JlLmM6IEFkZGVkIGRlZmF1bHQgZGVmaW5pdGlvbiBvZiBOX01BR0lDIGZvciBDT0ZGX0ZPUk1BVC4KKworCSogeGdkYi5jOiBJbnN0YWxsZWQgYSBmaXggdG8ga2VlcCB0aGUgdGhpbmcgZnJvbSBkeWluZyB3aGVuIHRoZXJlCisJaXNuJ3QgYW55IGZyYW1lIHNlbGVjdGVkLgorCisJKiBjb3JlLmM6IE1hZGUgYSBjaGFuZ2UgZm9yIHRoZSBVTUFYIHN5c3RlbTsgbmVlZHMgYSBkaWZmZXJlbnQKKwlmaWxlIGluY2x1ZGVkIGlmIHVzaW5nIHRoYXQgY29yZSBmb3JtYXQuIAorCisJKiBNYWtlZmlsZTogRGVsZXRlZCBkdXBsaWNhdGUgb2JzdGFjay5oIGluIGRieHJlYWQuYyBkZXBlbmRlbmN5LgorCisJKiBtdW5jaDogTW9kaWZpZWQgKG11Y2ggc2ltcGxlcikgdG8gY292ZXIgKEkgaG9wZSkgYWxsIGNhc2VzLgorCisJKiB1dGlscy5jIChzYXZlX2NsZWFudXBzLCByZXN0b3JlX2NsZWFudXBzKTogQWRkZWQgZnVuY3Rpb25zIHRvCisJYWxsb3cgeW91IHRvIHB1c2ggYW5kIHBvcCB0aGUgY2hhaW4gb2YgY2xlYW51cHMgdG8gYmUgZG9uZS4KKwkqIGRlZnMuaDogRGVjbGFyZWQgdGhlIG5ldyBmdW5jdGlvbnMuCisJKiBtYWluLmMgKGNhdGNoX2Vycm9ycyk6IE1hZGUgc3VyZSB0aGF0IHRoZSBvbmx5IGNsZWFudXBzIHdoaWNoCisJd291bGQgYmUgZG9uZSB3ZXJlIHRoZSBvbmVzIHB1dCBvbiB0aGUgY2hhaW4gKmFmdGVyKiB0aGUgY3VycmVudAorCWxvY2F0aW9uLiAKKworCSogbS0qLmggKEZSQU1FX0NIQUlOX1ZBTElEKTogUmVtb3ZlZCBjaGVjayBvbiBwYyBpbiB0aGUgY3VycmVudAorCWZyYW1lIGJlaW5nIHZhbGlkLgorCSogYmxvY2tmcmFtZS5jIChnZXRfcHJldl9mcmFtZV9pbmZvKTogTWFkZSB0aGUgYXNzdW1wdGlvbiB0aGF0IGlmCisJYSBmcmFtZSdzIHBjIHZhbHVlIHdhcyB3aXRoaW4gdGhlIGZpcnN0IG9iamVjdCBmaWxlIChwcmVzdW1lZCB0bworCWJlIC9saWIvY3J0MC5vKSwgdGhhdCB3ZSBzaG91bGRuJ3QgZ28gYW55IGhpZ2hlci4KKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogRG8gKm5vdCogZXhlY3V0ZSBjaGVjayBmb3Igc3RvcCBwYworCWF0IHN0ZXBfcmVzdW1lX2JyZWFrIGlmIHdlIGFyZSBwcm9jZWVkaW5nIG92ZXIgYSBicmVha3BvaW50IChpZS4KKwlpZiB0cmFwX2V4cGVjdGVkICE9IDApLgorCisJKiBNYWtlZmlsZTogQWRkZWQgLWcgdG8gTERGTEFHUy4KKworCSogbS1uZXdzLmggKFBPUF9GUkFNRSkgRml4ZWQgdHlwby4KKworCSogcHJpbnRjbWQuYyAocHJpbnRfZnJhbWVfYXJncyk6IE1vZGlmaWVkIHRvIHByaW50IG91dCByZWdpc3RlcgorCXBhcmFtcyBpbiBvcmRlciBieSAuc3RhYnMgZW50cnksIG5vdCBieSByZWdpc3RlciBudW1iZXIuCisKKwkqIHNwYXJjLW9wY29kZS5oOiBDaGFuZ2VkIGRlY2xhcmF0aW9uIG9mIChzdHJ1Y3QKKwlhcml0aF9pbW1fZm10KS5zaW1tIHRvIGJlIHNpZ25lZCAoYXMgcGVyIGFyY2hpdGVjdHVyZSBtYW51YWwpLgorCSogc3BhcmMtcGluc24uYyAoZnByaW50X2FkZHIxLCBwcmludF9pbnNuKTogRm9yY2VkIGEgY2FzdCB0byBhbgorCWludCwgc28gdGhhdCB3ZSByZWFsbHkgd291bGQgZ2V0IHNpZ25lZCBiZWhhaXZpb3IgKGRlZmF1bHQgZm9yIHN1bgorCWNjIGlzIHVuc2lnbmVkKS4KKworCSogaTM4Ni1kZXAuYyAoaTM4Nl9nZXRfZnJhbWVfc2V0dXApOiBSZXBsYWNlIGZ1bmN0aW9uIHdpdGggbmV3CisJZnVuY3Rpb24gcHJvdmlkZWQgYnkgcGFjZSB0byBmaXggYnVnIGluIHJlY29nbml6aW5nIHByb2xvZ3VlLgorCitUaHUgSmFuIDE5IDExOjAxOjIyIDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBwbGFudGFyaXMuYWkubWl0LmVkdSkKKworCSogaW5mY21kLmMgKHJ1bl9jb21tYW5kKTogQ2hhbmdlZCBlcnJvciBtZXNzYWdlIHRvICJQcm9ncmFtIG5vdAorCXJlc3RhcnRlZC4iIAorCisJKiB2YWx1ZS5oOiBDaGFuZ2VkICJmcmFtZSIgZmllbGQgaW4gdmFsdWUgc3RydWN0dXJlIHRvIGJlIGEKKwlGUkFNRV9BRERSIChhY3R1YWxseSBDT1JFX0FERFIpIHNvIHRoYXQgaXQgY291bGQgc3Vydml2ZSBhY3Jvc3MKKwljYWxscy4gCisKKwkqIG0tc3VuLmggKEZSQU1FX0ZJTkRfU0FWRURfUkVHUyk6IEZpeGVkIGEgdHlwby4KKworCSogdmFsdWUuaDogQWRkZWQgbHZhbDogImx2YWxfcmVnX2ZyYW1lX3JlbGF0aXZlIiB0byBpbmRpY2F0ZSBhCisJcmVnaXN0ZXIgdGhhdCBtdXN0IGJlIGludGVycGV0ZWQgcmVsYXRpdmUgdG8gYSBmcmFtZS4gIEFkZGVkCisJc2luZ2xlIGVudHJ5IHRvIHZhbHVlIHN0cnVjdHVyZTogImZyYW1lIiwgdXNlZCB0byBpbmRpY2F0ZSB3aGljaAorCWZyYW1lIGEgcmVsYXRpdmUgcmVnbnVtIGlzIHJlbGF0aXZlIHRvLgorCSogZmluZHZhci5jICh2YWx1ZV9mcm9tX3JlZ2lzdGVyKTogTW9kaWZpZWQgdG8gY29ycmVjdGx5IHNldHVwCisJdGhlc2UgZmllbGRzIHdoZW4gbmVlZGVkLiAgRGVsZXRlZCBzZWN0aW9uIHRvIGZpZGRsZSB3aXRoIGxhc3QKKwlyZWdpc3RlciBjb3BpZWQgb24gbGl0dGxlIGVuZGlhbiBtYWNoaW5lOyBtdWx0aSByZWdpc3RlcgorCXN0cnVjdHVyZXMgd2lsbCBhbHdheXMgb2NjdXB5IGFuIGludGVncmFsIG51bWJlciBvZiByZWdpc3RlcnMuCisJKGZpbmRfc2F2ZWRfcmVnaXN0ZXIpOiBNYWRlIGV4dGVybi4KKwkqIHZhbHVlcy5jIChhbGxvY2F0ZV92YWx1ZSwgYWxsb2NhdGVfcmVwZWF0X3ZhbHVlKTogWmVybyBmcmFtZQorCWZpZWxkIG9uIGNyZWF0aW9uLgorCSogdmFsb3BzLmMgKHZhbHVlX2Fzc2lnbik6IEFkZGVkIGNhc2UgZm9yIGx2YWxfcmVnX2ZyYW1lX3JlbGF0aXZlOworCWNvcHkgdmFsdWUgb3V0LCBtb2RpZnkgaXQsIGFuZCBjb3B5IGl0IGJhY2suICBEZXNjbGFyZWQKKwlmaW5kX3NhdmVkX3JlZ2lzdGVyIGFzIGJlaW5nIGV4dGVybmFsLgorCSogdmFsdWUuaDogUmVtb3ZlZCBhZGRpdGlvbiBvZiBrbHVkZ3kgc3RydWN0dXJlOyB0aG9yb3VnaGx5CisJY29tbWVudGVkIGZpbGUuCisJKiB2YWx1ZXMuYyAoZnJlZV92YWx1ZSwgZnJlZV9hbGxfdmFsdWVzLCBjbGVhcl92YWx1ZV9oaXN0b3J5LAorCXNldF9pbnRlcm5hbHZhciwgY2xlYXJfaW50ZXJuYXZhcnMpOiBLaWxsZWQgZnJlZV92YWx1ZS4KKworV2VkIEphbiAxOCAyMDowOTozOSAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiB2YWx1ZS5oOiBEZWxldGVkIHN0cnVjdCBwYXJ0aWFsX3N0b3JhZ2U7IGxlZnQgb3ZlciBmcm9tCisJeWVzdGVyZGF5LiAKKworCSogZmluZHZhci5jICh2YWx1ZV9mcm9tX3JlZ2lzdGVyKTogQWRkZWQgY29kZSB0byBjcmVhdGUgYSB2YWx1ZSBvZgorCXR5cGUgbHZhbF9yZWdfcGFydHNhdmVkIGlmIGEgdmFsdWUgaXMgaW4gc2VwZXJhdGUgcmVnaXN0ZXJzIGFuZAorCXNhdmVkIGluIGRpZmZlcmVudCBwbGFjZXMuCisKK1R1ZSBKYW4gMTcgMTM6NTA6MTggMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogdmFsdWUuaDogQWRkZWQgbHZhbF9yZWdfcGFydHNhdmVkIHRvIGVudW0gbHZhbF90eXBlIGFuZAorCWNvbW1lbnRlZCBlbnVtIGx2YWxfdHlwZS4gIENvbW1lbnRlZCB2YWx1ZSBzdHJ1Y3R1cmUuCisJQWRkZWQgInN0cnVjdCBwYXJ0aWFsX3JlZ2lzdGVyX3NhdmVkIiB0byB2YWx1ZSBzdHJ1Y3Q7IGFkZGVkCisJbWFjcm9zIHRvIGRlYWwgd2l0aCBzdHJ1Y3R1cmUgdG8gdmFsdWUuaC4KKwkqIHZhbHVlcy5jIChmcmVlX3ZhbHVlKTogQ3JlYXRlZDsgc3BlY2lhbCBjYXNlcyBsdmFsX3JlZ19wYXJ0c2F2ZWQKKwkod2hpY2ggaGFzIGEgcG9pbnRlciB0byBhbiBhcnJheSB3aGljaCBhbHNvIG5lZWRzIHRvIGJlIGZyZWUpLgorCShmcmVlX2FsbF92YWx1ZXMsIGNsZWFyX3ZhbHVlX2hpc3RvcnksIHNldF9pbnRlcm5hbHZhciwKKwljbGVhcl9pbnRlcm5hbHZhcnMpOiBNb2RpZmllZCB0byB1c2UgZnJlZV92YWx1ZXMuCisKKwkqIG0tc3Vub3M0Lmg6IENoYW5nZWQgbmFtZSB0byBzdW4zb3M0LmguCisJKiBtLXN1bjJvczQuaCwgbS1zdW40b3M0Lmg6IENyZWF0ZWQuCisJKiBjb25maWcuZ2RiOiBBZGRlZCBjb25maWd1cmF0aW9uIGVudHJpZXMgZm9yIGVhY2ggb2YgdGhlIGFib3ZlLgorCSogTWFrZWZpbGU6IEFkZGVkIGludG8gY29ycmVjdCBsaXN0cy4KKworCSogTWFrZWZpbGU6IEFkZGVkIGRlcGVuZGVuY2llcyBvbiBhLm91dC5lbmNhcC5oLiAgTWFkZQorCWEub3V0LmVuY2FwLmggZGVwZW5kZW50IG9uIGEub3V0LmdudS5oIGFuZCBkYnhyZWFkLmMgZGVwZW5kZW50IG9uCisJc3RhYi5nbnUuaC4gCisKKwkqIGluZnJ1bi5jLCByZW1vdGUuYzogUmVtb3ZlZCBpbmNsdXNpb24gb2YgYW55IGEub3V0LmggZmlsZXMgaW4KKwl0aGVzZSBmaWxlczsgdGhleSBhcmVuJ3QgbmVlZGVkLgorCisJKiBSRUFETUU6IEFkZGVkIGNvbW1lbnQgYWJvdXQgYnVnIHJlcG9ydGluZyBhbmQgY29tbWVudCBhYm91dAorCXhnZGIuIAorCisJKiBNYWtlZmlsZTogQWRkZWQgbm90ZSB0byBIUFVYIGRlcGVuZGVudCBzZWN0aW9uIHdhcm5pbmcgYWJvdXQKKwlwcm9ibGVtcyBpZiBjb21waWxlZCB3aXRoIGdjYyBhbmQgbWVudGlvbmluZyB0aGUgbmVlZCB0byBhZGQKKwktSWhwLWluY2x1ZGUgdG8gQ0ZMQUdTIGlmIHlvdSBjb21waWxlIG9uIHRob3NlIHN5c3RlbXMuICBBZGRlZCBhCisJbm90ZSBhYm91dCBuZWVkaW5nIHRoZSBHTlUgbm0gd2l0aCBjb21waWxlcnMgKm9mIGdkYiogdGhhdCB1c2UgdGhlCisJY29mZiBlbmNhcHN1bGF0ZSBmZWF0dXJlIGFsc28uICAqIGhwLWluY2x1ZGU6IE1hZGUgc3ltYm9saWMgbGluaworCW92ZXIgdG8gL2dwL2dudS9iaW51dGlscy4KKworCSogTWFrZWZpbGU6IEFkZGVkIFRTT0JTIE5UU09CUyBPQlNUQUNLIGFuZCBSRUdFWCB0byBsaXN0IG9mIHRoaW5ncworCXRvIGRlbGV0ZSBpbiAibWFrZSBjbGVhbiIuICBBbHNvIGNoYW5nZWQgInNxdWVha3ljbGVhbiIgdGFyZ2V0IGFzCisJInJlYWxjbGVhbiIuIAorCisJKiBmaW5kdmFyLmMgKHZhbHVlX2Zyb21fcmVnaXN0ZXIpOiBBZGRlZCBhc3NpZ25tZW50IG9mIFZBTFVFX0xWQUwKKwl0byBiZSBsdmFsX21lbW9yeSB3aGVuIHRoYXQgaXMgYXBwcm9wcmlhdGUgKG9yaWdpbmFsIGNvZGUgZGlkbid0CisJYm90aGVyIGJlY2F1c2UgaXQgYXNzdW1lZCB0aGF0IGl0IHdhcyB3b3JraW5nIHdpdGggYSBwcmUgbHZhbAorCW1lbW9yaWVkIHZhbHVlKS4KKworCSogZXhwcmVhZC55ICh5eWxleCk6IENoYW5nZWQgdG8gb25seSByZXR1cm4gdHlwZSBUSElTIGlmIHRoZQorCXN5bWJvbCAiJHRoaXMiIGlzIGRlZmluZWQgaW4gc29tZSBibG9jayBzdXBlcmlvciBvciBlcXVhbCB0byB0aGUKKwljdXJyZW50IGV4cHJlc3Npb24gY29udGV4dCBibG9jay4KKworTW9uIEphbiAxNiAxMzo1Njo0NCAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBtLSouaCAoRlJBTUVfQ0hBSU5fVkFMSUQpOiBPbiBtYWNoaW5lcyB3aGljaCBjaGVjayB0aGUgcmVsYXRpb24KKwlvZiBGUkFNRV9TQVZFRF9QQyAodGhpc2ZyYW1lKSB0byBmaXJzdF9vYmplY3RfZmlsZV9lbmQgKGFsbCBleGNlcHQKKwlnb3VsZCksIG1ha2Ugc3VyZSB0aGF0IHRoZSBwYyBvZiB0aGUgY3VycmVudCBmcmFtZSBhbHNvIHBhc3NlcyAoaW4KKwljYXNlIHNvbWVvbmUgc3RvcHMgaW4gX3N0YXJ0KS4KKworCSogZmluZHZhci5jICh2YWx1ZV9vZl9yZWdpc3Rlcik6IENoYW5nZWQgZXJyb3IgbWVzc2FnZSBpbiBjYXNlIG9mCisJbm8gaW5mZXJpb3Igb3IgY29yZSBmaWxlLgorCisJKiBpbmZjbWQuYyAocmVnaXN0ZXJzX2luZm8pOiBBZGRlZCBhIGNoZWNrIGZvciBpbmZlcmlvciBvciBjb3JlCisJZmlsZTsgZXJyb3IgbWVzc2FnZSBpZiBub3QuCisKKwkqIG1haW4uYyAoZ2RiX3JlYWRfbGluZSk6IE1vZGlmaWVkIHRvIHRha2UgcHJvbXB0IGFzIGFyZ3VtZW50IGFuZAorCW91dHB1dCBpdCB0byBzdGRvdXQuCisJKiBpbmZjbWQuYyAocmVnaXN0ZXJzX2luZm8sIHNpZ25hbHNfaW5mbyksIG1haW4uYyAoY29tbWFuZF9sb29wLAorCXJlYWRfY29tbWFuZF9saW5lcywgY29weWluZ19pbmZvKSwgc3ltdGFiLmMgKGRlY29kZV9saW5lXzIsCisJb3V0cHV0X3NvdXJjZV9maWxlbmFtZSwgTU9SRSwgbGlzdF9zeW1ib2xzKTogQ2hhbmdlZCBjYWxsaW5nCisJY29udmVudGlvbiB1c2VkIHRvIGNhbGwgZ2RiX3JlYWRfbGluZS4KKworCSogaW5mY21kLmMsIGluZnJ1bi5jLCBtYWluLmMsIHN5bXRhYi5jOiBDaGFuZ2VkIHRoZSBuYW1lIG9mIHRoZQorCWZ1bmN0aW9uICJyZWFkX2xpbmUiIHRvICJnZGJfcmVhZF9saW5lIi4KKwkqIGJyZWFrcG9pbnQuYzogRGVsZXRlZCBleHRlcm5hbCByZWZlcmVuY2VkIHRvIGZ1bmN0aW9uCisJInJlYWRfbGluZSIgKG5vdCBuZWVkZWQgYnkgY29kZSkuCisKK0ZyaSBKYW4gMTMgMTI6MjI6MDUgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogaTM4Ni1kZXAuYzogSW5jbHVkZSBhLm91dC5lbmNhcC5oIGlmIENPRkZfRU5DQVBTVUxBVEUuCisJKE5fU0VUX01BR0lDKTogRGVmaW5lZCBpZiBub3QgZGVmaW5lZCBieSBpbmNsdWRlIGZpbGUuCisJKGNvcmVfZmlsZV9jb21tYW5kKTogVXNlZCBOX1NFVF9NQUdJQyBpbnN0ZWFkIG9mIGFzc2lnbm1lbnQgdG8KKwlhX21hZ2ljLgorCShleGVjX2ZpbGVfY29tbWFuZCk6IFN0dWNrIGluIGEgSEVBREVSX1NFRUtfRkQuCisKKwkqIGNvbmZpZy5nZGI6IEFkZGVkIGkzODYtZGVwLmMgYXMgZGVwZmlsZSBmb3IgaTM4NmdhcyBjaG9pY2UuCisKKwkqIG11bmNoOiBBZGRlZCAtSS4gdG8gY2MgdG8gcGljayB1cCB0aGluZ3MgaW5jbHVkZWQgYnkgdGhlIHBhcmFtCisJZmlsZS4gCisKKwkqIHN0YWIuZ251LmRlZjogQ2hhbmdlZCBuYW1lIHRvIHN0YWIuZGVmIChzdGFiLmdudS5oIG5lZWRzIHRoaXMgbmFtZSkuCisJKiBNYWtlZmlsZTogQ2hhbmdlZCBuYW1lIGhlcmUgYWxzby4KKwkqIGRieHJlYWQuYzogQ2hhbmdlZCBuYW1lIG9mIGdudS1zdGFiLmggdG8gc3RhYi5nbnUuaC4KKworCSogZ251LXN0YWIuaDogQ2hhbmdlZCBuYW1lIHRvIHN0YWIuZ251LmguCisJKiBzdGFiLmdudS5kZWY6IEFkZGVkIGFzIGxpbmsgdG8gYmludXRpbHMuCisJKiBNYWtlZmlsZTogUHV0IGJvdGggaW4gaW4gdGhlIGRpc3RyaWJ1dGlvbi4KKworVGh1IEphbiAxMiAxMTozMzo0OSAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBkYnhyZWFkLmM6IE1hZGUgd2hpY2ggc3RhYi5oIGlzIGluY2x1ZGVkIGRlcGVuZGVudCBvbgorCUNPRkZfRU5DQVBTVUxBVEU7IGVpdGhlciA8c3RhYi5oPiBvciAiZ251LXN0YWIuaCIuCisJKiBNYWtlZmlsZTogSW5jbHVkZWQgZ251LXN0YWIuaCBpbiB0aGUgbGlzdCBvZiBmaWxlcyB0byBpbmNsdWRlIGluCisJdGhlIGRpc3RyaWJ1dGlvbi4KKwkqIGdudS1zdGFiLmg6IE1hZGUgYSBsaW5rIHRvIC9ncC9nbnUvYmludXRpbHMvc3RhYi5oCisKKwkqIE1ha2VmaWxlOiBJbmNsdWRlZCBhLm91dC5nbnUuaCBhbmQgbS1pMzg2Z2FzLmggaW4gbGlzdCBvZgorCWRpc3RyaWJ1dGlvbiBmaWxlcy4KKwkqIG0taTM4Nmdhcy5oOiBDaGFuZ2VkIHRvIGluY2x1ZGUgbS1pMzg2LmggYW5kIGZpZGRsZSB3aXRoIGl0CisJaW5zdGVhZCBvZiBiZWluZyBhIHdob2xlIG5ldyBmaWxlLgorCSogYS5vdXQuZ251Lmg6IE1hZGUgYSBsaW5rIHRvIC9ncC9nbnUvYmludXRpbHMvYS5vdXQuZ251LmguCisKKwlDaHJpcyBIYW5zb24ncyBjaGFuZ2VzIHRvIGdkYiBmb3IgaHAgVW5peC4KKwkqIE1ha2VmaWxlOiBNb2RpZmllZCBjb21tZW50cyBvbiBocHV4LgorCSogaHA5azMyMC1kZXAuYzogI2RlZmluZSdkIFdPUFIgJiBtb3ZlZCBpbmNsdXNpb24gb2Ygc2lnbmFsLmgKKwkqIGluZmxvdy5jOiBNb3ZlZCBhcm91bmQgZGVjbGFyYXRpb3NuIG9mIDxzeXMvZmNudGwuaD4gYW5kCisJPHN5cy9pb2N0bC5oPiBpbnNpZGUgb2YgVVNHIGRlcGVuZHMgYW5kIGRlbGV0ZWQgYWxsIFNZU1YgaWZkZWYncworCSh1c2UgVVNHIGluc3RlYWQpLgorCSogbXVuY2g6IE1vZGlmaWVkIHRvIGFjY2VwdCBhbnkgbnVtYmVyIG9mIHNwYWNlcyBiZXR3ZWVuIHRoZSBUIGFuZAorCXRoZSBzeW1ib2wgbmFtZS4KKworCVBhY2UncyBjaGFuZ2VzIHRvIGdkYiB0byB3b3JrIHdpdGggQ09GRl9FTkNBUFNVTEFURSAocm9ib3R1c3Npbik6CisJKiBjb25maWcuZ2RiOiBBZGRlZCBpMzg2Z2FzIHRvIHRhcmdldHMuCisJKiBkZWZhdWx0LWRlcC5jOiBJbmNsdWRlIGEub3V0LmVuY2FwLmggaWYgQ09GRl9FTkNBUFNVTEFURS4KKwkoTl9TRVRfTUFHSUMpOiBEZWZpbmVkIGlmIG5vdCBkZWZpbmVkIGJ5IGluY2x1ZGUgZmlsZS4KKwkoY29yZV9maWxlX2NvbW1hbmQpOiBVc2VkIE5fU0VUX01BR0lDIGluc3RlYWQgb2YgYXNzaWdubWVudCB0byBhX21hZ2ljLgorCShleGVjX2ZpbGVfY29tbWFuZCk6IFN0dWNrIGluIGEgSEVBREVSX1NFRUtfRkQuCisJKiBpbmZydW4uYywgcmVtb3RlLmM6IEFkZGVkIGFuIGluY2x1ZGUgb2YgYS5vdXQuZW5jYXAuaCBpZgorCUNPRkZfRU5DQVBTVUxBVEUgZGVmaW5lZC4gIFRoaXMgaXMgY29tbWVudGVkIG91dCBpbiB0aGVzZSB0d28KKwlmaWxlcywgSSBwcmVzdW1lIGJlY2F1c2UgdGhlIGRlZmluaXRpb25zIGFyZW4ndCB1c2VkLgorCSogbS1pMzg2Z2FzLmg6IENyZWF0ZWQuCisJKiBkYnhyZWFkLmM6IEluY2x1ZGVkIGRlZmludGlvbnMgZm9yIFVTRy4KKwkoUkVBRF9GSUxFX0hFQURFUlMpOiBOb3cgdXNlcyBIRUFERVJfU0VFS19GRCBpZiBpdCBleGlzdHMuCisJKHN5bWJvbF9maWxlX2NvbW1hbmQpOiBEZWxldGVkIHVzZSBvZiBIRUFERVJfU0VFS19GRC4KKwkqIGNvcmUuYzogRGVsZXRlZCBleHRyYSBkZWZpbml0aW9uIG9mIENPRkZfRk9STUFULgorCShOX01BR0lDKTogRGVmaW5lZCB0byBiZSBhX21hZ2ljIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCisJKHZhbGlkYXRlX2ZpbGVzKTogVVNlZCBOX01BR0lDIGluc3RlYWQgb2YgcmVhZGluZyBhX21hZ2ljLgorCitXZWQgSmFuIDExIDEyOjUxOjAwIDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIHJlbW90ZS5jOiBVcHBlZCBQQlVGU0laLgorCShnZXRwa3QpOiBBZGRlZCB6ZXJvaW5nIG9mIGMgaW5zaWRlIGxvb3AgaW4gY2FzZSBvZiBlcnJvciByZXRyeS4KKworCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIsIHByb2Nlc3Nfc3ltYm9sX2Zvcl9wc3ltdGFiKTogUmVtb3ZlZAorCWNvZGUgdG8gbm90IHB1dCBzdHVmZiB3aXRoIGRlYnVnZ2luZyBzeW1ib2xzIGluIHRoZSBtaXNjIGZ1bmN0aW9uCisJbGlzdC4gIEhhZCBiZWVuIGlmZGVmJ2Qgb3V0LgorCisJKiBnZGIudGV4aW5mbzogQWRkZWQgdGhlIGZhY3QgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIGZvciBhIGZ1bmN0aW9uCisJaXMgcHJpbnRlZCBpZiB5b3UgdXNlIHJldHVybi4KKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogUmVtb3ZlZCB0ZXN0IGluICJIYXZlIHdlIGhpdAorCXN0ZXBfcmVzdW1lX2JyZWFrcG9pbnQiIGZvciBzcCB2YWx1ZXMgaW4gcHJvcGVyIG9yaWVudGF0aW9uLiAgV2FzCisJaW4gdGhlcmUgZm9yIHJlY3Vyc2l2ZSBjYWxscyBpbiBmdW5jdGlvbnMgd2l0aG91dCBmcmFtZSBwb2ludGVycworCWFuZCBpdCB3YXMgc2NyZXdpbmcgdXAgY2FsbHMgdG8gYWxsb2NhLiAgCisKKwkqIGRieHJlYWQuYzogQWRkZWQgI2lmZGVmIENPRkZfRU5DQVBTVUxBVEUgdG8gaW5jbHVkZQorCWEub3V0LmVuY2FwLmguCisJKHN5bWJvbF9maWxlX2NvbW1hbmQpOiBEbyBIRUFERVJfU0VFS19GRCB3aGVuIGRlZmluZWQuCisJKiBkYnhyZWFkLmMsIGNvcmUuYzogRGVsZXRlZCAjaWZkZWYgUk9CT1RVU1NJTiBzdHVmZi4KKwkqIHJvYm90dXNzaW4uaDogRGVsZXRlZCBsb2NhbCBjb3B5ICh3YXMgc3ltbGluaykuCisJKiBhLm91dC5lbmNhcC5oOiBDcmVhdGVkIHN5bWxpbmsgdG8KKwkvZ3AvZ251L2JpbnV0aWxzL2Eub3V0LmVuY2FwLmguCisJKiBNYWtlZmlsZTogUmVtb3ZlZCByb2JvdHVzc2luLmggYW5kIGluY2x1ZGVkIGEub3V0LmVuY2FwLmggaW4KKwlsaXN0IG9mIGZpbGVzLgorCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnQsIHByaW50X3NjYWxhcl9mb3JtYXR0ZWQpOiBDaGFuZ2VkIGRlZmF1bHQKKwlwcmVjaXNpb24gb2YgcHJpbnRpbmcgZmxvYXQgdmFsdWU7IG5vdyA2IGZvciBhIGZsb2F0IGFuZCAxNiBmb3IgYQorCWRvdWJsZS4KKworCSogZmluZHZhci5jICh2YWx1ZV9mcm9tX3JlZ2lzdGVyKTogQWRkZWQgY29kZSB0byBkZWFsIHdpdGggdGhlCisJY2FzZSB3aGVyZSBhIHZhbHVlIGlzIHNwcmVhZCBvdmVyIHNldmVyYWwgcmVnaXN0ZXJzLiAgU3RpbGwgZG9uJ3QKKwlkZWFsIHdpdGggdGhlIGNhc2Ugd2hlbiBzb21lIHJlZ2lzdGVycyBhcmUgc2F2ZWQgaW4gbWVtb3J5IGFuZAorCXNvbWUgYXJlbid0LgorCitUdWUgSmFuIDEwIDE3OjA0OjA0IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIHhnZGIuYyAoeGdkYl9jcmVhdGVfd2luZG93KTogUmVtb3ZlZCB0aGlyZCBhcmcgKFh0RGVwdGgpIHRvCisJZnJhbWVBcmdzLiAgCisKKwkqIGluZnJ1bi5jIChoYW5kbGVfY29tbWFuZCk6IEVycm9yIGlmIHNpZ25hbCBudW1iZXIgaXMgbGVzcyBvcgorCWVxdWFsIHRvIDAgb3IgZ3JlYXRlciBvciBlcXVhbCB0byBOU0lHIG9yIGEgc2lnbmFsIG51bWJlciBpcyBub3QKKwlwcm92aWRlZC4KKworCSogY29tbWFuZC5jIChsb29rdXBfY21kKTogTW9kaWZpZWQgdG8gbm90IGNvbnZlcnQgY29tbWFuZCBzZWN0aW9uCisJb2YgY29tbWFuZCBsaW5lIHRvIGxvd2VyIGNhc2UgaW4gcGxhY2UgKGluIGNhc2UgaXQgaXNuJ3QgYQorCXN1YmNvbW1hbmQsIGJ1dCBhbiBhcmd1bWVudCB0byBhIGNvbW1hbmQpLgorCitGcmkgSmFuICA2IDE3OjU3OjM0IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYzogQ2hhbmdlZCAidGV4dCBhcmVhIiB0byAiZGF0YSBhcmVhIiBpbiBjb21tZW50cyBvbgorCU5fU0VUVi4gCisKK1dlZCBKYW4gIDQgMTI6Mjk6NTQgMTk4OSAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGdsdXRldXMuYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jOiBBZGRlZCBkZWZpbml0aW9ucyBvZiBnbnUgc3ltYm9sIHR5cGVzIGFmdGVyIGluY2x1c2lvbgorCW9mIGEub3V0LmggYW5kIHN0YWIuaC4KKworTW9uIEphbiAgMiAyMDozODozMSAxOTg5ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cCk6IEJpbmFyeSBsb2dpY2FsIG9wZXJhdGlvbnMgbmVlZGVkIHRvCisJa25vdyB0eXBlIHRvIGRldGVybWluZSB3aGV0aGVyIHNlY29uZCB2YWx1ZSBzaG91bGQgYmUgZXZhbHVhdGVkLgorCU1vZGlmaWVkIHRvIGRpc2NvdmVyIHR5cGUgYmVmb3JlIGJpbnVwX3VzZXJfZGVmaW5lZF9wIGJyYW5jaC4KKwlBbHNvIGNvbW1lbnRlZCAiZW51bSBub3NpZGUiLgorCisJKiBNYWtlZmlsZTogQ2hhbmdlZCBpbnZvY2F0aW9ucyBvZiBtdW5jaCB0byBiZSAiLi9tdW5jaCIuCisKKwkqIGdkYi50ZXhpbmZvOiBVcGRhdGVkIHRvIHJlZmVyIHRvIGN1cnJlbnQgdmVyc2lvbiBvZiBnZGIgd2l0aAorCUphbnVhcnkgMTk4OSBsYXN0IHVwZGF0ZS4KKworCSogY29mZnJlYWQuYyAoZW5kX3N5bXRhYik6IFplcm8gY29udGV4dCBzdGFjayB3aGVuIGZpbmlzaGluZworCWxleGljYWwgY29udGV4dHMuCisJKHJlYWRfY29mZl9zeW10YWIpOiBlcnJvciBpZiBjb250ZXh0IHN0YWNrIDAgaW4gIi5lZiIgZWxzZSBjYXNlLgorCisJKiBtLSouaCAoRlJBTUVfU0FWRURfUEMpOiBDaGFuZ2VkIG5hbWUgb2YgYXJndW1lbnQgZnJvbSAiZnJhbWUiIHRvCisJIkZSQU1FIiB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHJlcGxhY2VtZW50IG9mICItPmZyYW1lIiBwYXJ0IG9mCisJbWFjcm8uIAorCisJKiBpMzg2LWRlcC5jIChpMzg2X2dldF9mcmFtZV9zZXR1cCk6IEFkZGVkIGNvZGVzdHJlYW1fZ2V0KCkgdG8KKwltb3ZlIGNvZGVzdHJlYW0gcG9pbnRlciB1cCB0byB0aGUgY29ycmVjdCBsb2NhdGlvbiBpbiAic3VibCAkWCwKKwklZXNwIiBjYXNlLgorCitTdW4gSmFuICAxIDE0OjI0OjM1IDE5ODkgIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6IFJld3JvdGUgcm91dGluZSB0byBwcmludCBzdHJpbmcgcG9pbnRlZAorCXRvIGJ5IGNoYXIgcG9pbnRlcjsgd2FzIHByb2R1Y2luZyBpbmNvcnJlY3QgcmVzdWx0cyB3aGVuIHByaW50X21heAorCXdhcyAwLgorCitGcmkgRGVjIDMwIDEyOjEzOjM1IDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiLCBwcm9jZXNzX3N5bWJvbF9mb3JfcHN5bXRhYik6IFB1dAorCWV2ZXJ5dGhpbmcgb24gdGhlIG1pc2MgZnVuY3Rpb24gbGlzdC4KKworCSogQ2hlY2twb2ludGVkIGRpc3RyaWJ1dGlvbi4KKworCSogTWFrZWZpbGU6IEFkZGVkIGV4cHJlYWQudGFiLmMgdG8gdGhlIGxpc3Qgb2YgdGhpbmdzIHNsYXRlZCBmb3IKKwlkaXN0cmlidXRpb24uIAorCitUaHUgRGVjIDI5IDEwOjA2OjQxIDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIHN0YWNrLmMgKHNldF9iYWNrdHJhY2VfbGltaXRfY29tbWFuZCwgYmFja3RyYWNlX2xpbWl0X2luZm8sCisJYmFjdHJhY2VfY29tbWFuZCwgX2luaXRpYWxpemVfc3RhY2spOiBSZW1vdmVkIG1vZGlmaWNhdGlvbnMgZm9yCisJbGltaXQgb24gYmFja3RyYWNlLiAgUGlwaW5nIHRoZSBiYWNrdHJhY2UgdGhyb3VnaCBhbiBpbnRlcnVwdGFibGUKKwkibW9yZSIgZW11bGF0aW9uIGlzIGEgYmV0dGVyIHdheSB0byBkbyBpdC4KKworV2VkIERlYyAyOCAxMTo0MzowOSAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBzdGFjay5jCisJKHNldF9iYWNrdHJhY2VfbGltaXRfY29tbWFuZCk6IEFkZGVkIGNvbW1hbmQgdG8gc2V0IGEgbGltaXQgdG8gdGhlCisJbnVtYmVyIG9mIGZyYW1lcyBmb3IgYSBiYWNrdHJhY2UgdG8gcHJpbnQgYnkgZGVmYXVsdC4KKwkoYmFja3RyYWNlX2xpbWl0X2luZm8pOiBUbyBwcmludCB0aGUgY3VycmVudCBsaW1pdC4KKwkoYmFja3RyYWNlX2NvbW1hbmQpOiBUbyB1c2UgdGhlIGxpbWl0LgorCShfaW5pdGlhbGl6ZV9zdGFjayk6IFRvIGluaXRpYWxpemUgdGhlIGxpbWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlCisJKDMwKSwgYW5kIGFkZCB0aGUgc2V0IGFuZCBpbmZvIGNvbW1hbmRzIG9udG8gdGhlIGFwcHJvcHJpYXRlCisJY29tbWFuZCBsaXN0cy4KKworICAgIAkqIGdkYi50ZXhpbmZvOiBEb2N1bWVudGVkIGNoYW5nZXMgdG8gImJhY2t0cmFjZSIgYW5kICJjb21tYW5kcyIKKwljb21tYW5kcy4KKworCSogc3RhY2suYyAoYmFja3RyYWNlX2NvbW1hbmQpOiBBbHRlcmVkIHNvIHRoYXQgYSBuZWdhdGl2ZSBhcmd1bWVudAorCXdvdWxkIHNob3cgdGhlIGxhc3QgZmV3IGZyYW1lcyBvbiB0aGUgc3RhY2sgaW5zdGVhZCBvZiB0aGUgZmlyc3QKKwlmZXcuCisJKF9pbml0aWFsaXplX3N0YWNrKTogTW9kaWZpZWQgaGVscCBkb2N1bWVudGF0aW9uLgorCisJKiBicmVha3BvaW50LmMgKGNvbW1hbmRzX2NvbW1hbmQpOiBBbHRlcmVkIHNvIHRoYXQgImNvbW1hbmRzIiB3aXRoCisJbm8gYXJndW1lbnQgd291bGQgcmVmZXIgdG8gdGhlIGxhc3QgYnJlYWtwb2ludCBzZXQuCisJKF9pbml0aWFsaXplX2JyZWFrcG9pbnQpOiBNb2RpZmllZCBoZWxwIGRvY3VtZW50YXRpb24uCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IFJlbW92ZWQgaWZkZWYgb24gU3VuNDsgbm93IHlvdSBjYW4KKwlzaW5nbGUgc3RlcCB0aHJvdWdoIGNvbXBpbGVyIGdlbmVyYXRlZCBzdWIgY2FsbHMgYW5kIHdpbGwgZGllIGlmCisJeW91IG5leHQgb2ZmIG9mIHRoZSBlbmQgb2YgYSBmdW5jdGlvbi4KKworCSogc3BhcmMtZGVwLmMgKHNpbmdsZV9zdGVwKTogRml4ZWQgdHlwbzsgImJyZWFrX2luc24iID09PiAic2l6ZW9mCisJYnJlYWtfaW5zbiIuIAorCisJKiBtLXNwYXJjLmggKElOSVRfRVhUUkFfRlJBTUVfSU5GTyk6IFNldCB0aGUgYm90dG9tIG9mIGEgc3RhY2sKKwlmcmFtZSB0byBiZSB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayBmcmFtZSBpbm5lciBmcm9tIHRoaXMsIGlmIHRoYXQKKwlpbm5lciBvbmUgaXMgYSBsZWFmIG5vZGUuCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGFkZCBhCisJcHN5bXRhYiB0byBpdCdzIG93biBkZXBlbmRlbmN5IGxpc3QuCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogTW9kaWZpZWQgY2hlY2sgZm9yIGR1cGxpY2F0ZQorCWRlcGVuZGVuY2llcyB0byBjYXRjaCB0aGVtIGNvcnJlY3RseS4KKworVHVlIERlYyAyNyAxNzowMjowOSAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBtLSouaCAoRlJBTUVfU0FWRURfUEMpOiBNb2RpZmllZCBtYWNybyB0byB0YWtlIGZyYW1lIGluZm8KKwlwb2ludGVyIGFzIGFyZ3VtZW50LgorCSogc3RhY2suYyAoZnJhbWVfaW5mbyksIGJsb2NrZnJhbWUuYyAoZ2V0X3ByZXZfZnJhbWVfaW5mbyksCisJZ2xkLXBpbnNuLmMgKGZpbmRmcmFtZSksIG0tKi5oIChTQVZFRF9QQ19BRlRFUl9DQUxMLAorCUZSQU1FX0NIQUlOX1ZBTElELCBGUkFNRV9OVU1fQVJHUyk6IENoYW5nZWQgdXNhZ2Ugb2YgbWFjcm9zIHRvCisJY29uZm9ybSB0byBhYm92ZS4KKwkqIG0tc3BhcmMuaCAoRlJBTUVfU0FWRURfUEMpLCBzcGFyYy1kZXAuYyAoZnJhbWVfc2F2ZWRfcGMpOgorCUNoYW5nZWQgZnJhbWVfc2F2ZWRfcGMgdG8gaGF2ZSBhIGZyYW1lIGluZm8gcG9pbnRlciBhcyBhbgorCWFyZ3VtZW50LiAKKworCSogbS12YXguaCwgbS11bWF4LmgsIG0tbnBsLmgsIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvciksCisJYmxvY2tmcmFtZS5jIChnZXRfcHJldl9mcmFtZV9pbmZvKTogTW9kaWZpZWQgU0FWRURfUENfQUZURVJfQ0FMTAorCXRvIHRha2UgYSBmcmFtZSBpbmZvIHBvaW50ZXIgYXMgYW4gYXJndW1lbnQuCisKKwkqIGJsb2NrZnJhbWUuYyAoZ2V0X3ByZXZfZnJhbWVfaW5mbyk6IEFsdGVyZWQgdGhlIHVzZSBvZiB0aGUKKwltYWNyb3MgRlJBTUVfQ0hBSU4sIEZSQU1FX0NIQUlOX1ZBTElELCBhbmQgRlJBTUVfQ0hBSU5fQ09NQklORSB0bworCXVzZSBmcmFtZSBpbmZvIHBvaW50ZXJzIGFzIGFyZ3VtZW50cyBpbnN0ZWFkIG9mIGZyYW1lIGFkZHJlc3Nlcy4KKwkqIG0tdmF4LmgsIG0tdW1heC5oLCBtLXN1bjMuaCwgbS1zdW4zLmgsIG0tc3BhcmMuaCwgbS1wbi5oLAorCW0tbnBsLmgsIG0tbmV3cy5oLCBtLW1lcmxpbi5oLCBtLWlzaS5oLCBtLWhwOWszMjAuaCwgbS1pMzg2Lmg6CisJTW9kaWZpZWQgZGVmaW5pdGlvbnMgb2YgdGhlIGFib3ZlIG1hY3JvcyB0byBzdWl0LgorCSogbS1wbi5oLCBtLW5wbC5oLCBnb3VsZC1kZXAuYyAoZmluZGZyYW1lKTogTW9kaWZpZWQgZmluZGZyYW1lIHRvCisJdXNlIGEgZnJhbWUgaW5mbyBhcmd1bWVudDsgYWxzbyBmaXhlZCBpbnRlcm5hbHMgKHdvdWxkbid0IHdvcmsKKwliZWZvcmUpLgorCisJKiBtLXNwYXJjLmg6IENvc21ldGljIGNoYW5nZXM7IHJlb3JkZXJlZCBzb21lIG1hY3JvcyBhbmQgbWFkZSBzdXJlCisJdGhhdCBub3RoaW5nIHdlbnQgb3ZlciA4MCBsaW5lcy4KKworVGh1IERlYyAyMiAxMTo0OToxNSAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBWZXJzaW9uIDMuMCByZWxlYXNlZC4KKworCSogUkVBRE1FOiBEZWxldGVkIG5vdGUgYWJvdXQgY2hhbmdpbmcgLWxvYnN0YWNrIHRvIG9ic3RhY2suby4KKworV2VkIERlYyAyMSAxMToxMjo0NyAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBtLXZheC5oIChTS0lQX1BST0xPR1VFKTogTm93IHJlY29nbml6ZXMgZ2NjIHByb2xvZ3VlIGFsc28uCisKKwkqIGJsb2NrZnJhbWUuYyAoZ2V0X3ByZXZfZnJhbWVfaW5mbyk6IEFkZGVkIEZVTkNUSU9OX1NUQVJUX09GRlNFVAorCXRvIHJlc3VsdCBvZiBnZXRfcGNfZnVuY3Rpb25fc3RhcnQuCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBTYW1lLgorCisJKiBnZGIudGV4aW5mbzogRG9jdW1lbnRlZCBuZXcgInN0ZXAiIGFuZCAibmV4dCIgYmVoYXZpb3IgaW4KKwlmdW5jdGlvbnMgd2l0aG91dCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4KKworVHVlIERlYyAyMCAxODowMDo0NSAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBpbmZjbWQuYyAoc3RlcF8xKTogQ2hhbmdlZCBiZWhhdmlvciBvZiAic3RlcCIgb3IgIm5leHQiIGluIGEKKwlmdW5jdGlvbiB3aXRvdXQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICBJdCBub3cgc2V0cyB0aGUgc3RlcAorCXJhbmdlIGFyb3VuZCB0aGUgZnVuY3Rpb24gKHRvIHNpbmdsZSBzdGVwIG91dCBvZiBpdCkgdXNpbmcgdGhlCisJbWlzYyBmdW5jdGlvbiB2ZWN0b3IsIHdhcm5zIHRoZSB1c2VyLCBhbmQgY29udGludWVzLgorCisJKiBzeW10YWIuYyAoZmluZF9wY19saW5lKTogWmVybyAiZW5kIiBzdWJzZWN0aW9uIG9mIHJldHVybmVkCisJc3ltdGFiX2FuZF9saW5lIGlmIG5vIHN5bXRhYiBmb3VuZC4KKworTW9uIERlYyAxOSAxNzo0NDozNSAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBpMzg2LXBpbnNuLmMgKE9QX1JFRyk6IEFkZGVkIGNvZGUgZnJvbSBwYWNlIHRvIHN0cmVhbWxpbmUKKwlkaXNhc3NlbWJseSBhbmQgY29ycmVjdGVkIHR5cGVzLgorCSogaTM4Ni1kZXAuYworCShpMzg2X2ZvbGxvd19qdW1wKTogQ29kZSBhZGRlZCB0byBmb2xsb3cgYnl0ZSBhbmQgd29yZCBvZmZzZXQKKwlicmFuY2hlcy4KKwkoaTM4Nl9nZXRfZnJhbWVfc2V0dXApOiBFeHBhbmRlZCB0byBkZWFsIHdpdGggbW9yZSB3aWRlIHJhbmdpbmcKKwlmdW5jdGlvbiBwcm9sb2d1ZS4KKwkoaTM4Nl9mcmFtZV9maW5kX3NhdmVkX3JlZ3MsIGkzODZfc2tpcF9wcm9sb2d1ZSk6IENoYW5nZWQgdG8gdXNlCisJaTM4Nl9nZXRfZnJhbWVfc2V0dXAuIAorCQorCitTdW4gRGVjIDE4IDExOjE1OjAzIDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIG0tc3BhcmMuaDogRGVsZXRlZCBkZWZpbml0aW9uIG9mIFNVTjRfQ09NUElMRVJfQlVHOyB3YXMgZGVzaWduZWQKKwl0byBhdm9pZCBzb21ldGhpbmcgdGhhdCBJIGNvbnNpZGVyIGEgYnVnIGluIG91ciBjb2RlLCBub3QgdGhlaXJzLAorCWFuZCB3aGljaCBJIGZpeGVkIGVhcmxpZXIuICBBbHNvIGRlbGV0ZWQgZGVmaW5pdGlvbiBvZgorCUNBTk5PVF9VU0VfQVJCSVRSQVJZX0ZSQU1FOyBubyBsb25nZXIgdXNlZCBhbnl3aGVyZS4KKwlGUkFNRV9TUEVDSUZJQ0FUSU9OX0RZQURJQyB1c2VkIGluc3RlYWQuCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IE9uIHRoZSBzdW4gNCwgaWYgYSBmdW5jdGlvbgorCWRvZXNuJ3QgaGF2ZSBhIHByb2xvZ3VlLCBhIG5leHQgb3ZlciBpdCBzaW5nbGUgc3RlcHMgaW50byBpdC4KKwlUaGlzIGdldHMgYXJvdW5kIHRoZSBwcm9ibGVtIG9mIGEgImNhbGwgLnN0cmV0NCIgYXQgdGhlIGVuZCBvZgorCWZ1bmN0aW9ucyByZXR1cm5pbmcgc3RydWN0dXJlcy4KKwkqIG0tc3BhcmMuaDogRGVmaW5lZCBTVU40X0NPTVBJTEVSX0ZFQVRVUkUuCisKKwkqIG1haW4uYyAoY29weWluZ19pbmZvKTogU2VwZXJhdGVkIHRoZSBsYXN0IHByaW50ZiBpbnRvIHR3bworCXByaW50ZnMuICBUaGUgMzg2IGNvbXBpbGVyIHdpbGwgbm93IGhhbmRsZSBpdC4KKworCSogaTM4Ni1waW5zbi5jLCBpMzg2LWRlcC5jOiBNb3ZlZCBwcmludF8zODdfY29udHJvbF93b3JkLAorCXByaW50XzM4N19zdGF0dXNfd29yZCwgcHJpbnRfMzg3X3N0YXR1cywgYW5kIGkzODZfZmxvYXRfaW5mbyB0bworCWRlcC5jICBBbHNvIGluY2x1ZGVkIHJlZy5oIGluIGRlcC5jLgorCitTYXQgRGVjIDE3IDE1OjMxOjM4IDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBnbHV0ZXVzLmFpLm1pdC5lZHUpCisKKwkqIG1haW4uYyAoc291cmNlX2NvbW1hbmQpOiBEb24ndCBjbG9zZSBpbnN0cmVhbSBpZiBpdCdzIG51bGwKKwkoaW5kaWNhdGluZyBleGVjdXRpb24gb2YgYSB1c2VyLWRlZmluZWQgY29tbWFuZCkuCisJCSAoZXhlY3V0ZV9jb21tYW5kKTogU2V0IGluc3RyZWFtIHRvIG51bGwgYmVmb3JlIGV4ZWN1dGluZworCQkgY29tbWFuZHMgYW5kIHNldHVwIGNsZWFuIHN0dWZmIHRvIHB1dCBpdCBiYWNrIG9uIGVycm9yLgorCisJKiBpbmZsb3cuYyAodGVybWluYWxfaW5mZXJpb3IpOiBXZW50IGJhY2sgdG8gbm90IGNoZWNraW5nIHRoZQorCWlvY3RsIHJldHVybnM7IHRoZXJlIGFyZSBzb21lIHN5c3RlbXMgd2hlbiB0aGlzIHdpbGwgc2ltcGx5IGZhaWwuCisJSXQgc2VlbXMgdGhhdCwgb24gbW9zdCBvZiB0aGVzZSBzeXN0ZW1zLCBub3RoaW5nIGJhZCB3aWxsIGhhcHBlbgorCWJ5IHRoYXQgZmFpbHVyZS4KKworCSogdmFsdWVzLmMgKHZhbHVlX3N0YXRpY19maWVsZCk6IEZpeGVkIGRlcmVmZXJlbmNpbmcgb2YgbnVsbAorCXBvaW50ZXIuIAorCisJKiBpMzg2LWRlcC5jIChpMzg2X2ZvbGxvd19qdW1wKTogTW9kaWZpZWQgdG8gZGVhbCB3aXRoCisJdW5jb25kaXRpb25hbCBieXRlIG9mZnNldHMgYWxzby4KKworCSogZGJ4cmVhZC5jIChyZWFkX3R5cGUpOiBGaXhlZCB0eXBvIGluIGZ1bmN0aW9uIHR5cGUgY2FzZSBvZiBzd2l0Y2guCisKKwkqIGluZmNtZC5jIChydW5fY29tbWFuZCk6IERvZXMgbm90IHByb21wdCB0byByZXN0YXJ0IGlmIGNvbW1hbmQgaXMKKwlub3QgZnJvbSBhIHR0eS4KKworRnJpIERlYyAxNiAxNToyMTo1OCAxOTg4ICBSYW5keSBTbWl0aCAgKHJhbmR5IGF0IGNhbHZpbikKKworCSogZ2RiLnRleGluZm86IEFkZGVkIGEgdGhpcmQgb3B0aW9uIHVuZGVyIHRoZSAiQ2Fubm90IEluc2VydAorCUJyZWFrcG9pbnRzIiB3b3JrYXJvdW5kcy4KKworCSogcHJpbnRjbWQuYyAoZGlzcGxheV9jb21tYW5kKTogRG9uJ3QgZG8gdGhlIGRpc3BsYXkgdW5sZXNzIHRoZXJlCisJaXMgYW4gYWN0aXZlIGluZmVyaW9yOyBvbmx5IHNldCBpdC4KKworCSogZmluZHZhci5jICh2YWx1ZV9vZl9yZWdpc3Rlcik6IEFkZGVkIGFuIGVycm9yIGNoZWNrIGZvciBjYWxsaW5nCisJdGhpcyB3aGVuIHRoZSBpbmZlcmlvciBpc24ndCBhY3RpdmUgYW5kIGEgY29yZSBmaWxlIGlzbid0IGJlaW5nCisJcmVhZC4gCisKKwkqIGNvbmZpZy5nZGI6IEFkZGVkIHJlbWluZGVyIGFib3V0IG1vZGlmeWluZyBSRUdFWCBpbiB0aGUKKwltYWtlZmlsZSBmb3IgdGhlIDM4Ni4KKworCSogaTM4Ni1waW5zbi5jLCBpMzg2LWRlcC5jOiBNb3ZlZCBtLWkzODYuaCBoZWxwZXIgZnVuY3Rpb25zIG92ZXIKKwl0byBpMzg2LWRlcC5jLmIKKworVGh1IERlYyAxNSAxNDowNDoyNSAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBSRUFETUU6IEFkZGVkIGEgY291cGxlIG9mIG5vdGVzIGFib3V0IGNvbXBpbGluZyBnZGIgd2l0aCBpdHNlbGYuCisKKwkqIGJyZWFrcG9pbnQuYyAoc2V0X21vbWVudGFyeV9icmVha3BvaW50KTogT25seSB0YWtlcyBGUkFNRV9GUCBvZgorCWZyYW1lIGlmIGZyYW1lIGlzIG5vbi16ZXJvLgorCisJKiBwcmludGNtZC5jIChwcmludF9zY2FsYXJfZm9ybWF0dGVkKTogSW1wbGVtZW50ZWQgL2cgc2l6ZSBmb3IKKwloZXhhZGVjaW1hbCBmb3JtYXQgb24gbWFjaGluZXMgd2l0aG91dCBhbiA4IGJ5dGUgaW50ZWdlciB0eXBlLiAgSXQKKwlzZWVtcyB0byBiZSBub24tdHJpdmlhbCB0byBpbXBsZW1lbnQgL2cgZm9yIG90aGVyIGZvcm1hdHMuCisJKGRlY29kZV9mb3JtYXQpOiBBbGxvd2VkIGhleGFkZWNpbWFsIGZvcm1hdCB0byBtYWtlIGl0IHRocm91Z2ggL2cKKwlmaWxldGVyLiAKKworV2VkIERlYyAxNCAxMzoyNzowNCAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgZ2x1dGV1cy5haS5taXQuZWR1KQorCisJKiBleHByZWFkLnk6IENvbnZlcnRlZCBhbGwgY2FsbHMgdG8gd3JpdGVfZXhwX2VsdCBmcm9tIHRoZSBwYXJzZXIKKwl0byBjYWxscyB0byBvbmUgb2Ygd3JpdGVfZXhwX2VsdF97b3Bjb2RlLCBzeW0sIGxvbmdjc3QsIGRibGNzdCwKKwljaGFyLCB0eXBlLCBpbnRlcm59LiAgQ3JlYXRlZCBhbGwgb2YgdGhlc2Ugcm91dGluZXMuICBUaGlzIGdldHMKKwlhcm91bmQgcG9zc2libGUgcHJvYmxlbXMgaW4gcGFzc2luZyBvbmUgb2YgdGhlc2UgdGhpbmdzIGluIG9uZSBlYXIKKwlhbmQgZ2V0dGluZyBzb21ldGhpbmcgZGlmZmVyZW50IG91dCB0aGUgb3RoZXIuICBFbGltaW5hdGVkCisJU1VONF9DT01QSUxFUl9CVUcgaWZkZWYnczsgdGhleSBhcmUgbm93IHN1cGVyZmx1b3VzLgorCisJKiBzeW1taXNjLmMgKGZyZWVfYWxsX3BzeW10YWJzKTogUmVpbml0ZWQgcGFydGlhbF9zeW10YWJfbGlzdCB0byAwLgorCQkgICAgKF9pbml0aWFsaXplX3N5bW1pc2MpOiBJbml0aWFsaXplZCBib3RoIHN5bXRhYl9saXN0IGFuZAorCQkgICAgcGFydGlhbF9zeW10YWJfbGlzdC4KKworCSogZGJ4cmVhZC5jIChzdGFydF9wc3ltdGFiKTogRGlkbid0IGFsbG9jYXRlIGFueXRoaW5nIG9uCisJZGVwZW5kZW5jeSBsaXN0LgorCShlbmRfcHN5bXRhYik6IEFsbG9jYXRlIGRlcGVuZGVuY3kgbGlzdCBvbiBwc3ltYm9sIG9ic3RhY2sgZnJvbQorCWxvY2FsIGxpc3QuCisJKGFkZF9wc3ltdGFiX2RlcGVuZGVuY3kpOiBEZWxldGVkLgorCShyZWFkX2RieF9zeW10YWIpOiBQdXQgZGVwZW5kZW5jeSBvbiBsb2NhbCBsaXN0IGlmIGl0IGlzbid0IG9uIGl0CisJYWxyZWFkeS4KKworCSogc3ltdGFiLmM6IEFkZGVkIGRlZmluaXRpb24gb2YgcHN5bWJvbF9vYnN0YWNrLgorCSogc3ltdGFiLmg6IEFkZGVkIGRlY2xhcmF0aW9uIG9mIHBzeW1ib2xfb2JzdGFjay4KKwkqIHN5bW1pc2MuYyAoZnJlZV9hbGxfcHN5bXRhYnMpOiBBZGRlZCBmcmVlaW5nIGFuZAorCXJlaW5pdGlvbmFsaXp0aW9uIG9mIHBzeW1ib2xfb2JzdGFjay4KKwkqIGRieHJlYWQuYyAoZnJlZV9hbGxfcHN5bWJvbHMpOiBEZWxldGVkLgorCQkgICAgKHN0YXJ0X3BzeW10YWIsIGVuZF9wc3ltdGFiLAorCQkgICAgcHJvY2Vzc19zeW1ib2xfZm9yX3BzeW10YWIpOiAgQ2hhbmdlZCBtb3N0IGFsbG9jYXRpb24KKwkJICAgIG9mIHBhcnRpYWwgc3ltYm9sIHN0dWZmIHRvIGJlIG9mZiBvZiBwc3ltYm9sX29ic3RhY2suCisKKwkqIHN5bW1pc2MuYyAoZnJlZV9wc3ltdGFiLCBmcmVlX2FsbF9wc3ltdGFicyk6IERlbGV0ZWQKKwlmcmVlX3BzeW10YWIgc3Vicm91dGluZS4KKworCSogc3ltdGFiLmg6IFJlbW92ZWQgbnVtX2luY2x1ZGVzIGFuZCBpbmNsdWRlcyBmcm9tIHBhcnRpYWxfc3ltdGFiCisJc3RydWN0dXJlOyBubyBsb25nZXIgbmVlZGVkIG5vdyB0aGF0IGFsbCBpbmNsdWRlIGZpbGVzIGhhdmUgdGhlaXIKKwlvd24gcHN5bXRhYi4KKwkqIGRieHJlYWQuYyAoc3RhcnRfcHN5bXRhYik6IEVsaW1pbmF0ZWQgaW5pdGlhbGl6YXRpb24gb2YgYWJvdmUuCisJCSAgICAoZW5kX3BzeW10YWIpOiBFbGltaW5hdGVkIGZpbmFsaXphdGlvbiBvZiBhYm92ZTsgZ2V0CisJCSAgICBpbmNsdWRlcyBmcm9tIHNlcGVyYXRlIGxpc3QuCisJCSAgICAocmVhZF9kYnhfc3ltdGFiKTogTW92ZWQgaW5jbHVkZXMgZnJvbSBwc3ltdGFiIGxpc3QgdG8KKwkJICAgIHRoZWlyIG93biBsaXN0OyBpbmNsdWRlZCBpbiBjYWxsIHRvIGVuZF9wc3ltdGFiLgorCSogc3ltbWlzYy5jIChmcmVlX3BzeW10YWIpOiBEb24ndCBmcmVlIGluY2x1ZGVzLgorCitUdWUgRGVjIDEzIDE0OjQ4OjE0IDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGkzODYtcGluc24uYzogUmVmb3JtYXR0ZWQgZW50aXJlIGZpbGUgdG8gY29ycmVzcG9uZCB0byBnbnUKKwlzb2Z0d2FyZSBpbmRlbnRhdGlvbiBjb252ZW50aW9ucy4KKworCSogc3BhcmMtZGVwLmMgKHNraXBfcHJvbG9ndWUpOiBBZGRlZCBjYXBhYmlsaXR5IG9mIHJlY29nbml6aWduCisJc3RvcmVzIG9mIGlucHV0IHJlZ2lzdGVyIHBhcmFtZXRlcnMgaW50byBzdGFjayBzbG90cy4gCisKKwkqIHNwYXJjLWRlcC5jOiBBZGRlZCBhbiBpbmNsdWRlIG9mIHNwYXJjLW9wY29kZS5oLgorCSogc3BhcmMtcGluc24uYywgc3BhcmMtb3Bjb2RlLmg6IE1vdmVkIGluc25fZm10IHN0cnVjdHVyZXMgYW5kCisJdW5pb25zIGZyb20gcGluc24uYyB0byBvcGNvZGUuaC4KKwkqIHNwYXJjLXBpbnNuLmMsIHNwYXJjLWRlcC5jIChpc2FicmFuY2gsIHNraXBfcHJvbG9ndWUpOiBNb3ZlZAorCXRoaXMgZnVuY3Rpb24gZnJvbSBwaW5zbi5jIHRvIGRlcC5jLgorCisJKiBNYWtlZmlsZTogUHV0IGluIHdhcm5pbmdzIGFib3V0IGNvbXBpbGluZyB3aXRoIGdjYyAobm9uLWFuc2kKKwlpbmNsdWRlIGZpbGVzKSBhbmQgY29tcGlsaW5nIHdpdGggc2hhcmVkIGxpYnMgb24gU3Vub3MgNC4wIChjYW4ndAorCWRlYnVnIHNvbWV0aGluZyB0aGF0J3MgYmVlbiBjb21waWxlZCB0aGF0IHdheSkuCisKKwkqIHNwYXJjLXBpbnNuLmM6IFB1dCBpbiBhIGNvbXBsZXRlbHkgbmV3IGZpbGUgKHByb3ZpZGVkIGJ5CisJVGllbWFubikgdG8gaGFuZGxlIGZsb2F0aW5nIHBvaW50IGRpc2Fzc2VtYmx5LCBsb2FkIGFuZCBzdG9yZQorCWluc3RydWN0aW9ucywgYW5kIGV0Yy4gYmV0dGVyLiAgTWFkZSB0aGUgbW9kaWZpY2F0aW9ucyB0aGlzIGZpbGUKKwkoQ2hhbmdlTG9nKSBsaXN0IGZvciBzcGFyYy1waW5zbi5jIGFnYWluLgorCisJKiBzeW10YWIuYyAob3V0cHV0X3NvdXJjZV9maWxlbmFtZSk6IEluY2x1ZGVkICJtb3JlIiBlbXVsYXRpb24gaGFjay4KKworCSogc3ltdGFiLmMgKG91dHB1dF9zb3VyY2VfZmlsZW5hbWUpOiBJbml0aWFsaXplZCBDT0xVTU4gdG8gMC4KKwkJICAgKHNvdXJjZXNfaW5mbyk6IE1vZGlmaWVkIHRvIG5vdCBwcmludCBvdXQgYSBsaW5lIGZvcgorCQkgICBhbGwgb2YgdGhlIGluY2x1ZGUgZmlsZXMgd2l0aGluIGEgcGFydGlhbCBzeW10YWIgKHNpbmNlCisJCSAgIHRoZXkgaGF2ZSBwc3QncyBvZiB0aGVpciBvd24gbm93KS4gIEFsc28gbW9kaWZpZWQgdG8KKwkJICAgbWFrZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gdGhvc2UgcHN0J3MgcmVhZCBpbiBhbmQKKwkJICAgdGhvc2Ugbm90LgorCisJKiBpbmZydW4uYzogSW5jbHVkZWQgdm9pZCBkZWNsYXJhdGlvbiBvZiBzaW5nbGVfc3RlcCgpIGlmIGl0J3MKKwlnb2luZyB0byBiZSB1c2VkLgorCSogc3BhcmMtZGVwLmMgKHNpbmdsZV9zdGVwKTogTW92ZWQgZnVuY3Rpb24gcHJldmlvdXMgdG8gdXNlIG9mIGl0LgorCisJKiBNYWtlZmlsZTogVG9vayByZW1vdmFsIG9mIGV4cHJlYWQudGFiLmMgb3V0IG9mIG1ha2UgY2xlYW4gZW50cnkKKwlhbmQgcHV0IGl0IGludG8gYSBuZXcgInNxdWVha3ljbGVhbiIgZW50cnkuCisKK01vbiBEZWMgMTIgMTM6MjE6MDIgMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGdsdXRldXMuYWkubWl0LmVkdSkKKworCSogc3BhcmMtcGluc24uYyAoc2tpcF9wcm9sb2d1ZSk6IENoYW5nZWQgYSBzdHJ1Y3QgaW5zbl9mbXQgdG8gYQorCXVuaW9uIGluc25fZm10LgorCisJKiBpbmZsb3cuYyAodGVybWluYWxfaW5mZXJpb3IpOiBDaGVja2VkICphbGwqIHJldHVybiBjb2RlcyBmcm9tCisJaW9jdGwncyBhbmQgZmNudGwncyBpbiByb3V0aW5lLgorCisJKiBpbmZsb3cuYyAodGVybWluYWxfaW5mZXJpb3IpOiBBZGRlZCBjaGVjayBmb3Igc3VjZXNzIG9mCisJVElPQ1NQR1JQIGlvY3RsIGNhbGwuICBKdXN0IG5vdGlmaWVzIGlmIGJhZC4KKworCSogZGJ4cmVhZC5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogQ2xvc2Ugd2FzIGdldHRpbmcgY2FsbGVkIHR3aWNlOworCW9uY2UgZGlyZWN0bHkgYW5kIG9uY2UgdGhyb3VnaCBjbGVhbnVwLiAgS2lsbGVkIHRoZSBkaXJlY3QgY2FsbC4gIAorCitTdW4gRGVjIDExIDE5OjQwOjQwIDE5ODggICYgU21pdGggIChyYW5keSBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogRGVsZXRlZCBzcHVyaW91cyBwcmludGluZyBvZiAiPSIgZnJvbQorCVRZUEVfQ09ERV9SRUYgY2FzZS4KKworU2F0IERlYyAxMCAxNjo0MTowNyAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgZ2x1dGV1cy5haS5taXQuZWR1KQorCisJKiBkYnhyZWFkLmM6IENoYW5nZWQgYWxsb2NhdGlvbiBvZiBwc3ltYm9scyBmcm9tIHVzaW5nIG1hbGxvYyBhbmQKKwlyZWFsbG9jIHRvIHVzaW5nIG9ic3RhY2tzLiAgVGhpcyBtZWFucyB0aGV5IGFyZW4ndCByZWFsbG9jJ2Qgb3V0CisJZnJvbSB1bmRlciB0aGUgcG9pbnRlcnMgdG8gdGhlbS4KKworRnJpIERlYyAgOSAxMDozMzoyNCAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBzcGFyYy1kZXAuYyBpbmZsb3cuYyBjb3JlLmMgZXhwcmVhZC55IGNvbW1hbmQuYyBpbmZydW4uYworCWluZmNtZC5jIGRieHJlYWQuYyBzeW1taXNjLmMgc3ltdGFiLmMgcHJpbnRjbWQuYyB2YWxwcmludC5jCisJdmFsdWVzLmMgc291cmNlLmMgc3RhY2suYyBmaW5kdmFyLmMgYnJlYWtwb2ludC5jIGJsb2NrZnJhbWUuYworCW1haW4uYzogVmFyaW91cyBjbGVhbnVwcyBpbnNwaXJlZCBieSAiZ2NjIC1XYWxsIiAod2l0aG91dCBjaGVja2luZworCWZvciBpbXBsaWNpdCBkZWNsYXJhdGlvbnMpLgorCisJKiBNYWtlZmlsZTogQ2xlYW5lZCB1cCBzb21lIG1vcmUuCisKKwkqIHZhbG9wcy5jLCBtLSouaCAoRklYX0NBTExfRFVNTVkpOiBNb2RpZmllZCB0byB0YWtlIDUgYXJndW1lbnRzCisJYXMgcGVyIHdoYXQgc3BhcmMgbmVlZHMgKHByb2dyYW1taW5nIGZvciBhIHN1cGVyc2V0IG9mIG5lZWRlZAorCWFyZ3MpLgorCisJKiBkYnhyZWFkLmMgKHByb2Nlc3Nfc3ltYm9sX2Zvcl9wc3ltdGFiKTogTW9kaWZpZWQgdG8gYmUgc2xpZ2h0bHkKKwltb3JlIHBpY2t5IGFib3V0IHdoYXQgaXQgcHV0cyBvbiB0aGUgbGlzdCBvZiB0aGluZ3MgKm5vdCogdG8gYmUKKwlwdXQgb24gdGhlIG1pc2MgZnVuY3Rpb24gbGlzdC4gIFdoZW4vaWYgSSBzaGlmdCBldmVyeXRoaW5nIG92ZXIgdG8KKwliZWluZyBwbGFjZWQgb24gdGhlIG1pc2NfZnVuY3Rpb25fbGlzdCwgdGhpcyB3aWxsIGdvIGF3YXkuCisKKwkqIGluZmVyaW9yLmgsIGluZnJ1bi5jOiBBZGRlZCBmaWVsZHMgdG8gc2F2ZSBpbiBpbmZlcmlvcl9zdGF0dXMKKwlzdHJ1Y3R1cmUuIAorCisJKiBtYWtldGFyZmlsZTogRGVsZXRlZDsgZnVuY3Rpb25hbGl0eSBpcyBpbiBNYWtlZmlsZSBub3cuCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IE1vZGlmaWVkIGFsZ29yaXRobSBmb3IgZGV0ZXJtaW5pbmcKKwl3aGV0aGVyIG9yIG5vdCBhIHNpbmdsZS1zdGVwIHdhcyB0aHJvdWdoIGEgc3Vicm91dGluZSBjYWxsLiAgU2VlCisJY29tbWVudHMgYXQgdG9wIG9mIGZpbGUuCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogTWFkZSBzdXJlIHRoYXQgdGhlIElHTk9SRV9TWU1CT0wKKwltYWNybyB3b3VsZCBiZSBjaGVja2VkIGR1cmluZyBpbml0aWFsIHJlYWRpbi4KKworCSogZGJ4cmVhZC5jIChyZWFkX29maWxlX3N5bXRhYik6IEFkZGVkIG1hY3JvIEdDQ19DT01QSUxFRF9GTEFHX1NZTUJPTAorCWludG8gZGJ4cmVhZC5jIHRvIGluZGljYXRlIHdoYXQgc3RyaW5nIGluIGEgbG9jYWwgdGV4dCBzeW1ib2wgd2lsbAorCWluZGljYXRlIGEgZmlsZSBjb21waWxlZCB3aXRoIGdjYy4gIERlZmF1bHRzIHRvICJnY2NfY29tcGlsZWQuIi4KKworVGh1IERlYyAgOCAxMTo0NjoyMiAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBtLXNwYXJjLmggKEZSQU1FX0ZJTkRfU0FWRURfUkVHUyk6IENsZWFuZWQgdXAgYSBsaXR0bGUgdG8gdGFrZQorCWFkdmFudGFnZSBvZiB0aGUgbmV3IGZyYW1lIGNhY2hlIHN5c3RlbS4KKworCSogaW5mZXJpb3IuaCwgaW5mcnVuLmMsIHZhbG9wcy5jLCB2YWxvcHMuYywgaW5mY21kLmM6ICBDaGFuZ2VkCisJbWVjaGFuaXNtIHRvIHNhdmUgaW5mZXJpb3Igc3RhdHVzIG92ZXIgY2FsbHMgdG8gaW5mZXJpb3IgKGVnLgorCWNhbGxfZnVuY3Rpb24pOyBpbXBsZW1lbnRlZCBzYXZlX2luZmVyaW9yX2luZm8gYW5kCisJcmVzdG9yZV9pbmZlcmlvcl9pbmZvLgorCisJKiBibG9ja2ZyYW1lLmMgKGdldF9wcmV2X2ZyYW1lKTogU2ltcGxpZmllZCB0aGlzIGJ5IGEgZGlyZWN0IGNhbGwKKwl0byBnZXRfcHJldl9mcmFtZV9pbmZvLgorCisJKiBmcmFtZS5oLCBzdGFjay5jLCBwcmludGNtZC5jLCBtLXNwYXJjLmgsIHNwYXJjLWRlcC5jOiBSZW1vdmVkCisJYWxsIHVzZXMgb2YgZnJhbWVfaWRfZnJvbV9hZGRyLiAgVGhlcmUgYXJlIHNob3J0IHJvdXRpbmVzIGxpa2UgaXQKKwlzdGlsbCBpbiBmcmFtZV9zYXZlZF9wYyAobS1zcGFyYy5oKSBhbmQgcGFyc2VfZnJhbWVfc3BlYworCShzdGFjay5jKS4gIEV2ZW50dWFsbHkgdGhlIG9uZSBpbiBmcmFtZV9zYXZlZF9wYyB3aWxsIGdvIGF3YXkuCisKKwkqIGluZmNtZC5jLCBzcGFyYy1kZXAuYzogSW1wbGVtZW50ZWQgYSBuZXcgbWVjaGFuaXNtIGZvcgorCXJlLXNlbGVjdGluZyB0aGUgc2VsZWN0ZWQgZnJhbWUgb24gcmV0dXJuIGZyb20gYSBjYWxsLgorCisJKiBibG9ja2ZyYW1lLmMsIHN0YWNrLmMsIGZpbmR2YXIuYywgcHJpbnRjbWQuYywgbS0qLmg6ICBDaGFuZ2VkCisJYWxsIHJvdXRpbmVzIGFuZCBtYWNyb3MgdGhhdCB0b29rIGEgInN0cnVjdCBmcmFtZV9pbmZvIiBhcyBhbgorCWFyZ3VtZW50IHRvIHRha2UgYSAic3RydWN0IGZyYW1lX2luZm8gKiIuICBSb3V0aW5lczogZmluZGFyZywKKwlmcmFtZWNoYWluLCBwcmludF9mcmFtZV9hcmdzLCBGUkFNRV9BUkdTX0FERFJFU1MsCisJRlJBTUVfU1RSVUNUX0FSR1NfQUREUkVTUywgRlJBTUVfTE9DQUxTX0FERFJFU1MsIEZSQU1FX05VTV9BUkdTLAorCUZSQU1FX0ZJTkRfU0FWRURfUkVHUy4KKworCSogZnJhbWUuaCwgc3RhY2suYywgcHJpbnRjbWQuYywgaW5mY21kLmMsIGZpbmR2YXIuYywgYnJlYWtwb2ludC5jLAorCWJsb2NrZnJhbWUuYywgeGdkYi5jLCBpMzg2LXBpbnNuLmMsIGdsZC1waW5zbi5jLCBtLXVtYXguaCwKKwltLXN1bjIuaCwgbS1zdW4zLmgsIG0tc3BhcmMuaCwgbS1wbi5oLCBtLW5wbC5oLCBtLW5ld3MuaCwKKwltLW1lcmxpbi5oLCBtLWlzaS5oLCBtLWkzODYuaCwgbS1ocDlrMzIwLmg6ICBDaGFuZ2VkIHJvdXRpbmVzIHRvCisJdXNlICJzdHJ1Y3QgZnJhbWVfaW5mbyAqIiBpbnRlcm5hbGx5LgorCitXZWQgRGVjICA3IDEyOjA3OjU0IDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGZyYW1lLmgsIGJsb2NrZnJhbWUuYywgbS1zcGFyYy5oLCBzcGFyYy1kZXAuYzogQ2hhbmdlZCBhbGwgY2FsbHMKKwl0byBnZXRfW3ByZXZfXWZyYW1lX2NhY2hlX2l0ZW0gdG8gZ2V0X1twcmV2X11mcmFtZV9pbmZvLgorCisJKiBibG9ja2ZyYW1lLmM6IEVsbWluYXRlZCBnZXRfZnJhbWVfY2FjaGVfaXRlbSBhbmQKKwlnZXRfcHJldl9mcmFtZV9jYWNoZV9pdGVtOyBmdW5jdGlvbmFsaXR5IG5vdyB0YWtlbiBjYXJlIG9mIGJ5CisJZ2V0X2ZyYW1lX2luZm8gYW5kIGdldF9wcmV2X2ZyYW1lX2luZm8uCisKKwkqIGJsb2NrZnJhbWUuYzogUHV0IGFsbG9jYXRpb24gb24gYW4gb2JzdGFjayBhbmQgZWxpbWluYXRlZCBmYW5jeQorCXJlYWxsb2NhdGlvbiByb3V0aW5lcywgc2V2ZXJhbCB2YXJpYWJsZXMsIGFuZCB2YXJpb3VzIG5hc3R5CisJdGhpbmdzLiAKKworCSogZnJhbWUuaCwgc3RhY2suYywgaW5mcnVuLmMsIGJsb2NrZnJhbWUuYywgc3BhcmMtZGVwLmM6IENoYW5nZWQKKwl0eXBlIEZSQU1FIHRvIGJlIGEgdHlwZWRlZiB0byAic3RydWN0IGZyYW1lX2luZm8gKiIuICBIYWQgdG8gYWxzbworCWNoYW5nZSByb3V0aW5lcyB0aGF0IHJldHVybmVkIGZyYW1lIGlkJ3MgdG8gcmV0dXJuIHRoZSBwb2ludGVyCisJaW5zdGVhZCBvZiB0aGUgY2FjaGUgaW5kZXguCisKKwkqIGluZmNtZC5jIChmaW5pc2hfY29tbWFuZCk6IFVzZWQgcHJvcGVyIG1ldGhvZCBvZiBnZXR0aW5nIGZyb20KKwlmdW5jdGlvbiBzeW1ib2wgdG8gc3RhcnQgb2YgZnVuY3Rpb24uICBXYXMgdHJlYXRpbmcgYSBzeW1ib2wgYXMgYQorCXZhbHVlLiAKKworCSogYmxvY2tmcmFtZS5jLCBicmVha3BvaW50LmMsIGZpbmR2YXIuYywgaW5mY21kLmMsIHN0YWNrLmMsCisJeGdkYi5jLCBpMzg2LXBpbnNuLmMsIGZyYW1lLmgsIG0taHA5azMyMC5oLCBtLWkzODYuaCwgbS1pc2kuaCwKKwltLW1lcmxpbi5oLCBtLW5ld3MuaCwgbS1ucGwuaCwgbS1wbi5oLCBtLXNwYXJjLmgsIG0tc3VuMi5oLAorCW0tc3VuMy5oLCBtLXVtYXguaDogQ2hhbmdlZCBnZXRfZnJhbWVfaW5mbyBhbmQgZ2V0X3ByZXZfZnJhbWVfaW5mbworCXRvIHJldHVybiBwb2ludGVycyBpbnN0ZWFkIG9mIHN0cnVjdHVyZXMuCisKKwkqIGJsb2NrZnJhbWUuYyAoZ2V0X3BjX2Z1bmN0aW9uX3N0YXJ0KTogTW9kaWZpZWQgdG8gZ28gdG8gbWlzYworCWZ1bmN0aW9uIHRhYmxlIGluc3RlYWQgb2YgYm9tYmluZyBpZiBwYyB3YXMgaW4gYSBibG9jayB3aXRob3V0IGEKKwljb250YWluaW5nIGZ1bmN0aW9uLgorCisJKiBjb2ZmcmVhZC5jOiBEdXAnZCBkZXNjcmlwdG9yIHBhc3NlZCB0byByZWFkX2NvZmZfc3ltdGFiIGFuZAorCWZkb3BlbidkIGl0IHNvIHRoYXQgdGhlcmUgd291bGRuJ3QgYmUgbXVsdGlwbGUgY2xvc2VzIG9uIHRoZSBzYW1lCisJZmQuICBBbHNvIHB1dCAoZmNsb3NlLCBzdHJlYW0pIG9uIHRoZSBjbGVhbnVwIGxpc3QuCisKKwkqIHByaW50Y21kLmMsIHN0YWNrLmM6IENoYW5nZWQgcHJpbnRfZnJhbWVfYXJncyB0byB0YWtlIGEKKwlmcmFtZV9pbmZvIHN0cnVjdCBhcyBhcmd1bWVudCBpbnN0ZWFkIG9mIHRoZSBhZGRyZXNzIG9mIHRoZSBhcmdzCisJdG8gdGhlIGZyYW1lLgorCisJKiBtLWkzODYuaCAoU1RPUkVfU1RSVUNUX1JFVFVSTik6IERlY3JlbWVudGVkIHNwIGJ5IHNpemVvZiBvYmplY3QKKwl0byBzdG9yZSAoYW4gYWRkcmVzcykgcmF0aGVyIHRoYW4gMS4KKworCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIpOiBTZXQgZmlyc3Rfb2JqZWN0X2ZpbGVfZW5kIGluCisJcmVhZF9kYnhfc3ltdGFiIChvb3BzKS4KKworCSogY29mZnJlYWQuYyAoZmlsbF9pbl92cHRyX2ZpZWxkbm8pOiBSZXdyb3RlIFRZUEVfQkFTRUNMQVNTIGFzCisJbmVjZXNzYXJ5LiAKKworVHVlIERlYyAgNiAxMzowMzo0MyAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBjb2ZmcmVhZC5jOiBBZGRlZCBmYWtlIHN1cHBvcnQgZm9yIHBhcnRpYWxfc3ltdGFicyB0byBhbGxvdworCWNvbXBpbGF0aW9uIGFuZCBleGVjdXRpb24gd2l0aG91dCB0aGVyZSB1c2UuCisJKiBpbmZsb3cuYzogQWRkZWQgYSBjb3VwbGUgb2YgbWlub3IgVVNHIG1vZHMuCisJKiBtdW5jaDogUHV0IGluIGFwcHJvcHJpYXRlIGNvbmRpdGlvbmFscyBzbyB0aGF0IGl0IHdvdWxkIHdvcmsgb24KKwlVU0cgc3lzdGVtcy4KKwkqIE1ha2VmaWxlOiBNYWRlIHJlZ2V4LiogaGFuZGxlZCBzYW1lIGFzIG9ic3RhY2suKjsgbWFkZSBzdXJlIHRhcgorCWZpbGUgaW5jbHVkZWQgZXZlcnl0aGluZyBJIHdhbnRlZCBpdCB0byBpbmNsdWRlIChpbmNsdWRpbmcKKwltYWxsb2MuYykuCisKKwkqIGRieHJlYWQuYyAoZW5kX3BzeW10YWIpOiBDcmVhdGUgYW4gZW50cnkgaW4gdGhlCisJcGFydGlhbF9zeW10YWJfbGlzdCBmb3IgZWFjaCBzdWJmaWxlIG9mIHRoZSAubyBmaWxlIGp1c3QgcmVhZCBpbi4KKwlUaGlzIGFsbG93cyBhICJsaXN0IGV4cHJlYWQueToxMCIgdG8gd29yayB3aGVuIHdlIGhhdmVuJ3QgcmVhZCBpbgorCWV4cHJlYWQubydzIHN5bWJvbCBzdHVmZiB5ZXQuCisKKwkqIHN5bXRhYi5oLCBkYnhyZWFkLmMgKHBzeW10YWJfdG9fc3ltdGFiKTogUmVjb2duaXplIHBzdC0+bGRzeW1sZW4KKwk9PSAwIGFzIGluZGljYXRpbmcgYSBkdW1teSBwc3ltdGFiLCBvbmx5IGluIGV4aXN0ZW5jZSB0byBjYXVzZSB0aGUKKwlkZXBlbmRlbmN5IGxpc3QgdG8gYmUgcmVhZCBpbi4KKworCSogZGJ4cmVhZC5jIChzb3J0X3N5bXRhYl9zeW1zKTogRWxtaW5hdGVkIHJldmVyc2FsIG9mIHN5bWJvbHMgdG8KKwltYWtlIHN1cmUgdGhhdCByZWdpc3RlciBkZWJ1ZyBzeW1ib2wgZGVjbHMgYWx3YXlzIGNvbWUgYmVmb3JlCisJcGFyYW1ldGVyIHN5bWJvbHMuICBBZnRlciBtb2QgYmVsb3csIHRoaXMgaXMgbm90IG5lZWRlZC4KKworCSogc3ltdGFiLmMgKGxvb2t1cF9ibG9ja19zeW1ib2wpOiBUYWtlIHBhcmFtZXRlciB0eXBlIHN5bWJvbHMKKwkoTE9DX0FSRyBvciBMT0NfUkVHUEFSTSkgYWZ0ZXIgYW55IG90aGVyIHN5bWJvbHMgd2hpY2ggbWF0Y2guCisKKwkqIGRieHJlYWQuYyAocmVhZF90eXBlKTogV2hlbiBkZWZpbmluZyBhIHR5cGUgaW4gdGVybXMgb2Ygc29tZQorCW90aGVyIHR5cGUgYW5kIHRoZSBvdGhlciB0eXBlIGlzIHN1cHBvc2VkIHRvIGhhdmUgYSBwb2ludGVyIGJhY2sKKwl0byB0aGlzIHNwZWNpZmljIGtpbmQgb2YgdHlwZSAocG9pbnRlciwgcmVmZXJlbmNlLCBvciBmdW5jdGlvbiksCisJY2hlY2sgdG8gc2VlIGlmICp0aGF0KiB0eXBlIGhhcyBiZWVuIGNyZWF0ZWQgeWV0LiAgSWYgaXQgaGFzLCB1c2UKKwlpdCBhbmQgZmlsbCBpbiB0aGUgYXBwcm9wcmlhdGUgc2xvdCB3aXRoIGEgcG9pbnRlciB0byBpdC4KKworTW9uIERlYyAgNSAxMToyNTowNCAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBzeW1taXNjLmM6IEVsaW1pbmF0ZWQgZXhpc3RlbmNlIG9mIGZyZWVfaW5jbGlua19zeW10YWJzIGFuZAorCWluaXRfZnJlZV9pbmNsaW5rX3N5bXRhYnM7IHRoZXkgYXJlbid0IGNhbGxlZCBmcm9tIGFueXdoZXJlLCBhbmQKKwlpZiB0aGV5IHdlcmUgdGhleSBjb3VsZCBkaXNydXB0IGdkYidzIGRhdGEgc3RydWN0dXJlIGJhZGx5CisJKGVsaW1pbmF0aW9uIG9mIHN0cnVjdCB0eXBlJ3Mgd2hpY2ggdmFsdWVzIHRoYXQgc3RpY2sgYXJvdW5kIHBhc3QKKwllbGltaW5hdGlvbiBvZiBpbmNsaW5rIHN5bXRhYnMpLgorCisJKiBkYnhyZWFkLmMgKHN5bWJvbF9maWxlX2NvbW1hbmQpOiBGaXhlZCBhIHJldHVybiBwYXRod2F5IG91dCBvZgorCXRoZSByb3V0aW5lIHRvIGRvX2NsZWFudXBzIGJlZm9yZSBpdCBsZWZ0LgorCisJKiBpbmZjbWQuYyAoc2V0X2Vudmlyb25tZW50X2NvbW1hbmQpLCBnZGIudGV4aW5mbzogQWRkZWQKKwljYXBhYmlsaXR5IHRvIHNldCBlbnZpcm9ubWVudGFsIHZhcmlhYmxlIHZhbHVlcyB0byBudWxsLgorCisJKiBnZGIudGV4aW5mbzogTW9kaWZpZWQgZG9jIG9uICJicmVhayIgd2l0aG91dCBhcmdzIHNsaWdodGx5LgorCitTdW4gRGVjICA0IDE3OjAzOjE2IDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBnbHV0ZXVzLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYyAoc3ltYm9sX2ZpbGVfY29tbWFuZCk6IEFkZGVkIGNoZWNrOyBpZiB0aGVyZSB3ZXJlbid0CisJYW55IGRlYnVnZ2luZyBzeW1ib2xzIGluIHRoZSBmaWxlIGp1c3QgcmVhZCwgdGhlIHVzZXIgaXMgd2FybmVkLgorCisJKiBpbmZjbWQuYzogQ29tbWVudGVkIHNldF9lbnZpcm9ubWVudF9jb21tYW5kIChhIGxpdHRsZSkuCisKKwkqIGNyZWF0ZXRhZ3M6IENsZWFuZWQgdXAgYW5kIGNvbW1lbnRlZC4KKworCSogTWFrZWZpbGU6IFVwZGF0ZWQgZGVwZW5kZW5jeSBsaXN0IGFuZCBjbGVhbmVkIGl0IHVwIHNvbWV3aGF0CisJKHVzZWQgbWFjcm9zLCBkaWRuJ3QgbWFrZSAubyBmaWxlcyBkZXBlbmQgb24gLmMgZmlsZXMsIGV0Yy4pCisKK0ZyaSBEZWMgIDIgMTE6NDQ6NDYgMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogdmFsdWUuaCwgdmFsdWVzLmMsIGluZmNtZC5jLCB2YWxvcHMuYywgbS1pMzg2LmgsIG0tc3BhcmMuaCwKKwltLW1lcmxpbi5oLCBtLW5wbC5oLCBtLXBuLmgsIG0tdW1heC5oLCBtLXZheC5oLCBtLWhwOWszMjAuaCwKKwltLWlzaS5oLCBtLW5ld3MuaCwgbS1zdW4yLmgsIG0tc3VuMy5oOiAgQ2xlYW5lZCB1cCBkZWFsaW5ncyB3aXRoCisJZnVuY3Rpb25zIHJldHVybmluZyBzdHJ1Y3R1cmVzLiAgU3BlY2lmaWNhbGx5OiBBZGRlZCBhIGZ1bmN0aW9uCisJY2FsbGVkIHVzaW5nX3N0cnVjdF9yZXR1cm4gd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uCisJYmVpbmcgY2FsbGVkIGlzIHVzaW5nIHRoZSBzdHJ1Y3R1cmUgcmV0dXJuaW5nIGNvbnZlbnRpb25zIG9yIGl0IGlzCisJdXNpbmcgdGhlIHZhbHVlIHJldHVybmluZyBjb252ZW50aW9ucyBvbiB0aGF0IG1hY2hpbmUuICBBZGRlZCBhCisJbWFjcm8sIFNUT1JFX1NUUlVDVF9SRVRVUk4gdG8gc3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0cnVjdHVyZQorCXRvIGJlIGNvcGllZCBpbnRvIHdoZXJldmVyIGl0J3Mgc3VwcG9zZWQgdG8gZ28sIGFuZCBjaGFuZ2VkCisJY2FsbF9mdW5jdGlvbiB0byBoYW5kbGUgYWxsIG9mIHRoaXMgY29ycmVjdGx5LgorCisJKiBzeW1zZWcuaCwgc3ltdGFiLmgsIGRieHJlYWQuYzogQWRkZWQgaG9va3MgdG8gcmVjb2duaXplIGFuCisJTl9URVhUIHN5bWJvbCB3aXRoIG5hbWUgIipnY2MtY29tcGlsZWQqIiBhcyBiZWluZyBhIGZsYWcKKwlpbmRpY2F0aW5nIHRoYXQgYSBmaWxlIGhhZCBiZWVuIGNvbXBpbGVkIHdpdGggZ2NjIGFuZCBzZXR0aW5nIGEKKwlmbGFnIGluIGFsbCBibG9ja3MgcHJvZHVjZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgdGhhdCBmaWxlLgorCitUaHUgRGVjICAxIDEzOjU0OjI5IDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIG0tc3BhcmMuaCAoUFVTSF9EVU1NWV9GUkFNRSk6IFNhdmVkIDggbGVzcyB0aGFuIHRoZSBjdXJyZW50IHBjLAorCWFzIFBPUF9GUkFNRSBhbmQgc3BhcmMgcmV0dXJuIGNvbnZlbnRpb24gcmVzdG9yZSB0aGUgcGMgdG8gOCBtb3JlCisJdGhhbiB0aGUgdmFsdWUgc2F2ZWQuCisKKwkqIHZhbG9wcy5jLCBwcmludGNtZC5jLCBmaW5kdmFyLmMsIHZhbHVlLmg6IEFkZGVkIHRoZSByb3V0aW5lCisJdmFsdWVfZnJvbV9yZWdpc3RlciwgdG8gYWNjZXNzIGEgc3BlY2lmaWMgcmVnaXN0ZXIgb2YgYSBzcGVjaWZpYworCWZyYW1lIGFzIGNvbnRhaW5pbmcgYSBzcGVjaWZpYyB0eXBlLCBhbmQgdXNlZCBpdCBpbiByZWFkX3Zhcl92YWx1ZQorCWFuZCBwcmludF9mcmFtZV9hcmdzLgorCitXZWQgTm92IDMwIDE3OjM5OjUwIDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYyAocmVhZF9udW1iZXIpOiBXaWxsIGFjY2VwdCBlaXRoZXIgdGhlIGFyZ3VtZW50IHBhc3NlZAorCWFzIGFuIGVuZGluZyBjaGFyYWN0ZXIsIG9yIGEgbnVsbCBieXRlIGFzIGFuIGVuZGluZyBjaGFyYWN0ZXIuCisKKwkqIE1ha2VmaWxlLCBjcmVhdGV0YWdzOiBBZGRlZCBlbnRyeSB0byBjcmVhdGUgdGFncyBmb3IgZ2RiCisJZGlzdHJpYnV0aW9uIHdoaWNoIHdpbGwgbWFrZSBzdXJlIGN1cnJlbnRseSBjb25maWd1cmVkIG1hY2hpbmUKKwlkZXBlbmRlbnQgZmlsZXMgY29tZSBmaXJzdCBpbiB0aGUgbGlzdC4KKworV2VkIE5vdiAyMyAxMzoyNzozNCAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgZ2x1dGV1cy5haS5taXQuZWR1KQorCisJKiBzdGFjay5jLCBpbmZjbWQuYywgc3BhcmMtZGVwLmM6IE1vZGlmaWVkIHJlY29yZF9zZWxlY3RlZF9mcmFtZQorCXRvIHdvcmsgb2ZmIG9mIGZyYW1lIGFkZHJlc3MuCisKKwkqIGJsb2NrZnJhbWUuYyAoY3JlYXRlX25ld19mcmFtZSwgZ2V0X3ByZXZfZnJhbWVfY2FjaGVfaXRlbSk6CisJQWRkZWQgY29kZSB0byByZXNldCBwb2ludGVycyB3aXRoaW4gZnJhbWUgY2FjaGUgaWYgaXQgbXVzdCBiZQorCXJlYWxsb2MnZC4gCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogQWRkZWQgaW4gb3B0aW1pemF0aW9uIGNvbXBhcmluZworCWxhc3QgY291cGxlIG9mIGNoYXJhY3RlcnMgaW5zdGVhZCBvZiBmaXJzdCBjb3VwbGUgdG8gYXZvaWQKKwlzdHJjbXAncyBpbiByZWFkX2RieF9zeW10YWIgKHJlY29yZGluZyBleHRlcm4gc3ltcyBpbiBtaXNjCisJZnVuY3Rpb25zIG9yIG5vdCkuICAxIGNhbGwgdG8gc3RybGVuIGlzIGJhbGFuY2VkIG91dCBieSBtYW55IGZld2VyCisJY2FsbHMgdG8gc3RyY21wLgorCitUdWUgTm92IDIyIDE2OjQwOjE0IDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBjcmVhbS1vZi13aGVhdC5haS5taXQuZWR1KQorCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYik6IFRvb2sgb3V0IG9wdGltaXphdGlvbiBmb3IgaWdub3JpbmcKKwlMU1lNJ3M7IHdhcyBkaXNhbGxvd2luZyB0eXBlZGVmcy4gIFNpbGx5IG1lLiAgCisKKwkqIENoZWNrcG9pbnRlZCBkaXN0cmlidXRpb24gKG1vc3RseSBmb3Igc2VuZGluZyB0byBUaWVtYW5uKS4KKworCSogZXhwcmVzc2lvbi5oOiBBZGRlZCBCSU5PUF9NSU4gYW5kIEJJTk9QX01BWCBvcGVyYXRvcnMgZm9yIEMrKy4KKwkqIHN5bXNlZy5oOiBJbmNsdWRlZCBmbGFncyBmb3IgdHlwZXMgaGF2aW5nIGRlc3RydWN0b3JzIGFuZAorCQljb25zdHJ1Y3RvcnMsIGFuZCBmbGFncyBiZWluZyBkZWZpbmVkIHZpYSBwdWJsaWMgYW5kIHZpYQorCQl2aXJ0dWFsIHBhdGhzLiAgQWRkZWQgZmllbGRzIE5FWFRfVkFSSUFOVCwgTl9CQVNFQ0xBU1NFUywKKwkJYW5kIEJBU0VDTEFTU0VTIHRvIHRoaXMgdHlwZSAodHI6IENoYW5nZWQgdHlwZXMgZnJvbQorCQloYXZpbmcgdG8gYmUgZGVyaXZlZCBmcm9tIGEgc2luZ2xlIGJhc2VjbGFzcyB0byBhIG11bHRpcGxlCisJCWJhc2UgY2xhc3MpLgorCSogc3ltdGFiLmg6IEFkZGVkIG1hY3JvcyB0byBhY2Nlc3MgbmV3IGZpZWxkcyBkZWZpbmVkIGluIHN5bXNlZy5oLgorCQlBZGRlZCBkZWNsIGZvciBsb29rdXBfYmFzZXR5cGVfdHlwZS4KKwkqIGRieHJlYWQuYyAKKwkoY29uZGVuc2VfYWRkbF9taXNjX2J1bmNoZXMpOiBGdW5jdGlvbiBhZGRlZCB0byBjb25kZW5zZSB0aGUgbWlzYworCQlmdW5jdGlvbiBidW5jaGVzIGFkZGVkIGJ5IHJlYWRpbmcgaW4gYSBuZXcgLm8gZmlsZS4KKwkocmVhZF9hZGRsX3N5bXMpOiBGdW5jdGlvbiBhZGRlZCB0byByZWFkIGluIHN5bWJvbHMKKwkJZnJvbSBhIG5ldyAubyBmaWxlIChpbmNyZW1lbnRhbCBsaW5raW5nKS4KKwkoYWRkX2ZpbGVfY29tbWFuZCk6IENvbW1hbmQgaW50ZXJmYWNlIGZ1bmN0aW9uIHRvIGluZGljYXRlCisJCWluY3JtZW50YWwgbGlua2luZyBvZiBhIG5ldyAubyBmaWxlOyB0aGlzIG5vdyBjYWxscworCQlyZWFkX2FkZGxfc3ltcyBhbmQgY29uZGVuc2VfYWRkbF9taXNjX2J1bmNoZXMuCisJKGRlZmluZV9zeW1ib2wpOiBNb2RpZmllZCBjb2RlIHRvIGhhbmRsZSB0eXBlcyBkZWZpbmVkIGZyb20gYmFzZQorCQl0eXBlcyB3aGljaCB3ZXJlIG5vdCBrbm93biB3aGVuIHRoZSBkZXJpdmVkIGNsYXNzIHdhcworCQlvdXRwdXQuCisJKHJlYWRfc3RydWN0X3R5cGUpOiBNb2RpZmllZCB0byBiZXR0ZXIgaGFuZGxlIGRlc2NyaXB0aW9uIG9mCisJCXN0cnVjdCB0eXBlcyBhcyBkZXJpdmVkIHR5cGVzLiAgUG9zc2libHkgZGVyaXZlZCBmcm9tCisJCXNldmVyYWwgZGlmZmVyZW50IGJhc2UgY2xhc3Nlcy4gIEFsc28gYWRkZWQgbmV3IGNvZGUgdG8KKwkJbWFyayBkZWZpbml0aW9ucyB2aWEgdmlydHVhbCBwYXRocyBvciB2aWEgcHVibGljIHBhdGhzLgorCQlLaWxsZWQgc2VwZXJhdGUgY29kZSB0byBoYW5kbGUgY2xhc3NlcyB3aXRoIGRlc3RydWN0b3JzCisJCWJ1dCB3aXRob3V0IGNvbnN0cnVjdG9ycyBhbmQgaW1wcm92ZWQgbWFya2luZyBvZiBjbGFzc2VzCisJCWFzIGhhdmluZyBkZXN0cnVjdG9ycyBhbmQgY29uc3RydWN0b3JzLgorCSogaW5mY21kLmM6IE1vZGlmaWVkIGNhbGwgdG8gdmFsX3ByaW50IChvbmUgbW9yZSBhcmd1bWVudCkuCisJKiBzeW10YWIuYyAobG9va3VwX21lbWJlcl90eXBlKTogTW9kaWZpZWQgdG8gZGVhbCB3aXRoIG5ldworCQlzdHJ1Y3R1cmUgaW4gc3ltc2VnLmguCisJKGxvb2t1cF9iYXNldHlwZV90eXBlKTogRnVuY3Rpb24gYWRkZWQgdG8gZmluZCBvciBjb25zdHJ1Y3QgYSB0eXBlCisJCT9kZXJpdmVkPyBmcm9tIHRoZSBnaXZlbiB0eXBlLgorCShkZWNvZGVfbGluZV8xKTogTW9kaWZpZWQgdG8gZGVhbCB3aXRoIG5ldyB0eXBlIGRhdGEgc3RydWN0dXJlcy4KKwkJTW9kaWZpZWQgdG8gZGVhbCB3aXRoIG5ldyBudW1iZXIgb2YgYXJncyBmb3IKKwkJZGVjb2RlX2xpbmVfMi4KKwkoZGVjb2RlX2xpbmVfMik6IENoYW5nZWQgbnVtYmVyIG9mIGFyZ3MgKD93aHk/KS4KKwkoaW5pdF90eXBlKTogQWRkZWQgaW5pdHMgZm9yIG5ldyBDKysgZmllbGRzIGZyb20KKwkJc3ltc2VnLmguCisJKnZhbGFyaXRoLmMKKwkodmFsdWVfeF9iaW5vcCwgdmFsdWVfYmlub3ApOiBBZGRlZCBjYXNlcyBmb3IgQklOT1BfTUlOICYKKwkJQklOT1BfTUFYLgorCSogdmFsb3BzLmMKKwkodmFsdWVfc3RydWN0X2VsdCwgY2hlY2tfZmllbGQsCXZhbHVlX3N0cnVjdF9lbHRfZm9yX2FkZHJlc3MpOgorCQlDaGFuZ2VkIHRvIGRlYWwgd2l0aCBtdWx0aXBsZSBwb3NzaWJsZSBiYXNlY2xhc3Nlcy4KKwkodmFsdWVfb2ZfdGhpcyk6IE1hZGUgU0VMRUNURURfRlJBTUUgYW4gZXh0ZXJuIHZhcmlhYmxlLgorCSogdmFscHJpbnQuYworCSh2YWxfcHJpbnQpOiBBZGRlZCBhbiBhcmd1bWVudCBERVJFRl9SRUYgdG8gZGVyZWZlcmVuY2UgcmVmZXJlbmNlcworCQlhdXRvbWF0aWNhbGx5LCBpbnN0ZWFkIG9mIHByaW50aW5nIHRoZW0gbGlrZSBwb2ludGVycy4KKwkJQ2hhbmdlZCBudW1iZXIgb2YgYXJndW1lbnRzIGluIHJlY3Vyc2l2ZSBjYWxscyB0byBpdHNlbGYuCisJCUNoYW5nZWQgdG8gZGVhbCB3aXRoIHZhcmliYWxlIG51bWJlcnMgb2YgYmFzZSBjbGFzc2VzLgorCSh2YWx1ZV9wcmludCk6IENoYW5nZWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byB2YWxfcHJpbnQuICBQcmludAorCQl0eXBlIG9mIHZhbHVlIGFsc28gaWYgdmFsdWUgaXMgYSByZWZlcmVuY2UuCisJKHR5cGVfcHJpbnRfZGVyaXZhdGlvbl9pbmZvKTogQWRkZWQgZnVuY3Rpb24gdG8gcHJpbnQgb3V0CisJCWRlcml2YXRpb24gaW5mbyBhIGEgdHlwZS4KKwkodHlwZV9wcmludF9iYXNlKTogTW9kaWZpZWQgdG8gdXNlIHR5cGVfcHJpbnRfZGVyaXZhdGlvbl9pbmZvIGFuZAorCQl0byBoYW5kbGUgbXVsdGlwbGUgYmFzZWNsYXNzZXMuCisJCitNb24gTm92IDIxIDEwOjMyOjA3IDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGluZmxvdy5jICh0ZXJtX3N0YXR1c19jb21tYW5kKTogQWRkIHRyYWlsaW5nIG5ld2xpbmUgdG8gb3V0cHV0LiAKKworCSogc3BhcmMtZGVwLmMgKGRvX3NhdmVfaW5zbiwgZG9fcmVzdG9yZV9pbnNuKTogU2F2ZWQKKwkic3RvcF9yZWdpc3RlcnMiIG92ZXIgdGhlIGNhbGwgZm9yIHRoZSBzYWtlIG9mIG5vcm1hbF9zdG9wIGFuZAorCXJ1bl9zdGFja19kdW1teS4KKworCSogbS1zcGFyYy5oIChFWFRSQUNUX1JFVFVSTl9WQUxVRSk6IFB1dCBpbiBwYXJlbnRoZXNpcyB0byBmb3JjZQorCWFkZGl0aW9uIG9mIDggdG8gdGhlIGludCBwb2ludGVyLCBub3QgdGhlIGNoYXIgcG9pbnRlci4KKworCSogc3BhcmMtcGluc24uYyAocHJpbnRfYWRkcjEpOiBCZWxpZXZlIHRoYXQgSSBoYXZlIGdvdHRlbiB0aGUKKwlzeW50YXggcmlnaHQgZm9yIGxvYWRzIGFuZCBzdG9yZXMgYXMgYWRiIGRvZXMgaXQuCisKKwkqIHN5bXRhYi5jIChsaXN0X3N5bWJvbHMpOiBUdXJuZWQgc2VhcmNoIGZvciBtYXRjaCBvbiByZXhlZ3AgaW50bworCWEgc2luZ2xlIGxvb3AuCisKKwkqIGRieHJlYWQuYyAocHN5bXRhYl90b19zeW10YWIpOiBEb24ndCByZWFkIGl0IGluIGlmIGl0J3MgYWxyZWFkeQorCWJlZW4gcmVhZCBpbi4KKworCSogZGJ4cmVhZC5jIChwc3ltdGFiX3RvX3N5bXRhYik6IENoYW5nZWQgZXJyb3IgdG8gZmF0YWwgaW4KKwlwc3ltdGFiX3RvX3N5bXRhYi4gCisKKwkqIGV4cHJlYWQueSAocGFyc2VfbnVtYmVyKTogRml4ZWQgYnVnIHdoaWNoIHRyZWF0ZWQgJ2wnIGF0IGVuZCBvZgorCW51bWJlciBhcyAnMCcuCisKK0ZyaSBOb3YgMTggMTM6NTc6MzMgMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGdsdXRldXMuYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIsIHByb2Nlc3Nfc3ltYm9sX2Zvcl9wc3ltdGFiKTogV2FzCisJYmVpbmcgZm9vbGlzaCBhbmQgdXNpbmcgcG9pbnRlcnMgaW50byBhbiBhcnJheSBJIGNvdWxkIHJlYWxsb2MuCisJQ29udmVydGVkIHRoZXNlIHBvaW50ZXJzIGludG8gaW50ZWdlcnMuCisKK1dlZCBOb3YgMTYgMTE6NDM6MTAgMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogbS1zcGFyYy5oIChQT1BfRlJBTUUpOiBNYWRlIHRoZSBuZXcgZnJhbWUgYmUgUENfQURKVVNUIG9mIHRoZQorCW9sZCBmcmFtZS4KKworCSogaTM4Ni1waW5zbi5jLCBtLWhwOWszMjAuaCwgbS1pc2kuaCwgbS1tZXJsaW4uaCwgbS1uZXdzLmgsCisJbS1ucGwuaCwgbS1wbi5oLCBtLXNwYXJjLmgsIG0tc3VuMi5oLCBtLXN1bjMuaCwgbS11bWF4LmgsIG0tdmF4Lmg6CisJTW9kaWZpZWQgUE9QX0ZSQU1FIHRvIHVzZSB0aGUgY3VycmVudCBmcmFtZSBpbnN0ZWFkIG9mCisJcmVhZF9yZWdpc3RlciAoRlBfUkVHTlVNKSBhbmQgdG8gZmx1c2hfY2FjaGVkX2ZyYW1lcyBiZWZvcmUKKwlzZXR0aW5nIHRoZSBjdXJyZW50IGZyYW1lLiAgQWxzbyBhZGRlZCBhIGNhbGwgdG8gc2V0IHRoZSBjdXJyZW50CisJZnJhbWUgaW4gdGhvc2UgUE9QX0ZSQU1FcyB0aGF0IGRpZG4ndCBoYXZlIGl0LgorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBNb3ZlZCBjYWxsIHRvIHNldF9jdXJyZW50X2ZyYW1lIHVwCisJdG8gZ3VhcnJhbnRlZSB0aGF0IHRoZSBjdXJyZW50IGZyYW1lIHdpbGwgYWx3YXlzIGJlIHNldCB3aGVuIGEKKwlQT1BfRlJBTUUgaXMgZG9uZS4gIAorCisJKiBpbmZydW4uYyAobm9ybWFsX3N0b3ApOiBBZGRlZCBzb21ldGhpbmcgdG8gcmVzZXQgdGhlIHBjIG9mIHRoZQorCWN1cnJlbnQgZnJhbWUgKHdhcyBpbmNvcnJlY3QgYmVjYXVzZSBvZiBERUNSX1BDX0FGVEVSX0JSRUFLKS4KKworCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogQ2hhbmdlZCB0byBjaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgd2FzCisJb3V0IG9mIGJvdW5kcyB3aGVuIGJlaW5nIHByaW50ZWQgYW5kIHRvIGluZGljYXRlIHRoaXMgaWYgc28uCisKKwkqIGNvbnZleC1kZXAuYyAocmVhZF9pbmZlcmlvcl9tZW1vcnkpOiBDaGFuZ2VkIHRvIHJldHVybiB0aGUgdmFsdWUKKwlvZiBlcnJubyBpZiB0aGUgY2FsbCBmYWlsZWQgKHdoaWNoIHdpbGwgYmUgMCBpZiB0aGUgY2FsbAorCXN1Y2VlZGVkKS4gCisKK1R1ZSBOb3YgMTUgMTA6MTc6MTUgMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogVHdvIGNoYW5nZXM6IDEpIEFkZGVkIGNvZGUgdG8KKwlub3QgdHJpZ2dlciB0aGUgc3RlcCBicmVha3BvaW50IG9uIHJlY3Vyc2l2ZSBjYWxscyB0byBmdW5jdGlvbnMKKwl3aXRob3V0IGZyYW1lIGluZm8sIGFuZCAyKSBBZGRlZCBjYWxscyB0byBkaXN0aW5ndWlzaCByZWN1cnNpdmUKKwljYWxscyB3aXRoaW4gYSBmdW5jdGlvbiB3aXRob3V0IGEgZnJhbWUgKHdoaWNoIG5leHQvbmV4dGkgbWlnaHQKKwl3aXNoIHRvIHN0ZXAgb3ZlcikgZnJvbSBqdW1wcyB0byB0aGUgYmVnaW5uaW5nIG9mIGEgZnVuY3Rpb24KKwkod2hpY2ggaXQgZ2VuZXJhbGx5IGRvZXNuJ3QpLgorCisJKiBtLXNwYXJjLmggKElOSVRfRVhUUkFfRlJBTUVfSU5GTyk6IEJvdHRvbSBzZXQgY29ycmVjdGx5IGZvciBsZWFmCisJcGFyZW50cy4gCisKKwkqIGJsb2NrZnJhbWUuYyAoZ2V0X3ByZXZfZnJhbWVfY2FjaGVfaXRlbSk6IFB1dCBpbiBtb2QgdG8gY2hlY2sKKwlmb3IgYSBsZWFmIG5vZGUgKGJ5IHByZXNlbmNlIG9yIGxhY2sgb2YgZnVuY3Rpb24gcHJvbG9ndWUpLiAgSWYKKwl0aGVyZSBpcyBhIGxlYWYgbm9kZSwgaXQgaXMgYXNzdW1lZCB0aGF0IFNBVkVEX1BDX0FGVEVSX0NBTEwgaXMKKwl2YWxpZC4gIE90aGVyd2lzZSwgRlJBTUVfU0FWRURfUEMgb3IgcmVhZF9wYyBpcyB1c2VkLgorCisJKiBibG9ja2ZyYW1lLmMsIGZyYW1lLmg6IERpZCBmaW5hbCBkZWxldGlvbiBvZiB1bnVzZWQgcm91dGluZXMgYW5kCisJY29tbWVudGVkIHByb2JsZW1zIHdpdGggZ2V0dGluZyBhIHBvaW50ZXIgaW50byB0aGUgZnJhbWUgY2FjaGUgaW4KKwl0aGUgZnJhbWVfaW5mbyBzdHJ1Y3R1cmUgY29tbWVudC4KKworCSogYmxvY2tmcmFtZS5jLCBmcmFtZS5oLCBzdGFjay5jOiBLaWxsZWQgdXNlIG9mCisJZnJhbWVfaWRfZnJvbV9mcmFtZV9pbmZvOyB1c2VkIGZyYW1lX2lkX2Zyb21fYWRkciBpbnN0ZWFkLgorCisJKiBibG9ja2ZyYW1lLmMsIGZyYW1lLmgsIHN0YWNrLmMsIG90aGVycyAob29wcyk6IENvbWJpbmVkIHN0YWNrCisJY2FjaGUgYW5kIGZyYW1lIGluZm8gc3RydWN0dXJlcy4KKworCSogYmxvY2tmcmFtZS5jLCBzcGFyYy1kZXAuYywgc3RhY2suYzogQ3JlYXRlZCB0aGUgZnVuY3Rpb24KKwljcmVhdGVfbmV3X2ZyYW1lIGFuZCB1c2VkIGl0IGluIHBsYWNlIG9mIGJhZCBjYWxscyB0bworCWZyYW1lX2lkX2Zyb21fYWRkci4gCisKKwkqIGJsb2NrZnJhbWUuYywgaW5mbG93LmMsIGluZnJ1bi5jLCBpMzg2LXBpbnNuLmMsIG0taHA5azMyMC5oLAorCW0tbnBsLmgsIG0tcG4uaCwgbS1zcGFyYy5oLCBtLXN1bjMuaCwgbS12YXguaCwgZGVmYXVsdC1kZXAuYywKKwljb252ZXgtZGVwLmMsIGdvdWxkLWRlcC5jLCBocDlrMzIwLWRlcC5jLCBuZXdzLWRlcC5jLCBzcGFyYy1kZXAuYywKKwlzdW4zLWRlcC5jLCB1bWF4LWRlcC5jOiBLaWxsZWQgdXNlIG9mCisJc2V0X2N1cnJlbnRfRnJhbWVfYnlfYWRkcmVzcy4gIFVzZWQgc2V0X2N1cnJlbnRfZnJhbWUKKwkoY3JlYXRlX25ld19mcmFtZS4uLikgaW5zdGVhZC4KKworCSogZnJhbWUuaDogS2lsbGVkIHVzZSBvZiBGUkFNRV9GUF9JRC4KKworCSogaW5mcnVuLmMsIGJsb2NrZnJhbWUuYzogS2lsbGVkIHNlbGVjdF9mcmFtZV9ieV9hZGRyZXNzLiAgVXNlZAorCXNlbGVjdF9mcmFtZSAoZ2V0X2N1cnJlbnRfZnJhbWUgKCksIDApICh3aGljaCB3YXMgY29ycmVjdCBpbiBhbGwKKwljYXNlcyB0aGF0IHdlIG5lZWQgdG8gd29ycnkgYWJvdXQuCisKK01vbiBOb3YgMTQgMTQ6MTk6MzIgMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogZnJhbWUuaCwgYmxvY2tmcmFtZS5jLCBzdGFjay5jLCBtLXNwYXJjLmgsIHNwYXJjLWRlcC5jOiBBZGRlZAorCW1lY2hhbmlzbXMgdG8gZGVhbCB3aXRoIHBvc3NpYmxlIHNwZWNpZmljYXRpb24gb2YgZnJhbWVzCisJZHlhZGljYWxseS4gCisKK1N1biBOb3YgMTMgMTY6MDM6MzIgMTk4OCAgUmljaGFyZCBTdGFsbG1hbiAgKHJtcyBhdCBzdWdhci1ib21icy5haS5taXQuZWR1KQorCisJKiBuczMyay1vcGNvZGUuaDogQWRkIGluc25zIGFjYncsIGFjYmQuCisKK1N1biBOb3YgMTMgMTU6MDk6NTggMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogYnJlYWtwb2ludC5jOiBDaGFuZ2VkIGJyZWFrcG9pbnQgc3RydWN0dXJlIHRvIHVzZSB0aGUgYWRkcmVzcyBvZgorCWEgZ2l2ZW4gZnJhbWUgKGNvbnN0YW50IGFjcm9zcyBpbmZlcmlvciBydW5zKSBhcyB0aGUgY3JpdGVyaWEgZm9yCisJc3RvcHBpbmcgaW5zdGVhZCBvZiB0aGUgZnJhbWUgaWRlbnQgKHdoaWNoIHZhcmllcyBhY3Jvc3MgaW5mZXJpb3IKKwljYWxscykuIAorCitGcmkgTm92IDExIDEzOjAwOjIyIDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIGdsZC1waW5zbi5jIChmaW5kZnJhbWUpOiBNb2RpZmllZCB0byB3b3JrIHdpdGggdGhlIG5ldyBmcmFtZQorCWlkJ3MuICBBY3R1YWxseSwgaXQgbG9va3MgYXMgaWYgdGhpcyByb3V0aW5lIHNob3VsZCBiZSBjYWxsZWQgd2l0aAorCWFuIGFkZHJlc3MgYW55d2F5LgorCisJKiBmaW5kdmFyLmMgKGZpbmRfc2F2ZWRfcmVnaXN0ZXIpOiBBbHRlcmVkIGJhY3RyYWNlIGxvb3AgdG8gd29yaworCW9mZiBvZiBmcmFtZXMgYW5kIG5vdCBmcmFtZSBpbmZvcy4KKworCSogZnJhbWUuaCwgYmxvY2tmcmFtZS5jLCBzdGFjay5jLCBzcGFyYy1kZXAuYywgbS1zcGFyYy5oOiBDaGFuZ2VkCisJRlJBTUUgZnJvbSBiZWluZyB0aGUgYWRkcmVzcyBvZiB0aGUgZnJhbWUgdG8gYmVpbmcgYSBzaW1wbGUgaWRlbnQKKwl3aGljaCBpcyBhbiBpbmRleCBpbnRvIHRoZSBmcmFtZV9jYWNoZV9pdGVtIGxpc3QuCisJKiBjb252ZXgtZGVwLmMsIGRlZmF1bHQtZGVwLmMsIGdvdWxkLWRlcC5jLCBocDlrMzIwLWRlcC5jLAorCWkzODYtcGluc24uYywgaW5mbG93LmMsIGluZnJ1bi5jLCBuZXdzLWRlcC5jLCBzcGFyYy1kZXAuYywKKwlzdW4zLWRlcC5jLCB1bWF4LWRlcC5jLCBtLWhwOWszMjAuaCwgbS1ucGwuaCwgbS1wbi5oLCBtLXNwYXJjLmgsCisJbS1zdW4zLmgsIG0tdmF4Lmg6IENoYW5nZWQgY2FsbHMgb2YgdGhlIGZvcm0gc2V0X2N1cnJlbnRfZnJhbWUKKwkocmVhZF9yZWdpc3RlciAoRlBfUkVHTlVNKSkgdG8gc2V0X2N1cnJlbnRfZnJhbWVfYnlfYWRkcmVzcyAoLi4uKS4gCisKK1RodSBOb3YgMTAgMTY6NTc6NTcgMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGdsdXRldXMuYWkubWl0LmVkdSkKKworCSogZnJhbWUuaCwgYmxvY2tmcmFtZS5jLCBnbGQtcGluc24uYywgc3BhcmMtZGVwLmMsIHN0YWNrLmMsCisJaW5mcnVuLmMsIGZpbmR2YXIuYywgbS1zcGFyYy5oOiBDaGFuZ2VkIHRoZSBGUkFNRSB0eXBlIHRvIGJlCisJcHVyZWx5IGFuIGlkZW50aWZpZXIsIHVzaW5nIEZSQU1FX0ZQIGFuZCBGUkFNRV9GUF9JRCB0byBjb252ZXJ0CisJYmFjayBhbmQgZm9ydGggYmV0d2VlbiB0aGUgdHdvLiAgVGhlIGlkZW50aWZpZXIgaXMgKmN1cnJlbnRseSoKKwlzdGlsbCB0aGUgZnJhbWUgcG9pbnRlciB2YWx1ZSBmb3IgdGhhdCBmcmFtZS4KKworV2VkIE5vdiAgOSAxNzoyODoxNCAxOTg4ICBDaHJpcyBIYW5zb24gIChjcGggYXQga2xlcGgpCisKKwkqIG0taHA5azMyMC5oIChGUF9SRUdJU1RFUl9BRERSKTogUmVkZWZpbmUgdGhpcyB0byByZXR1cm4KKwlkaWZmZXJlbmNlIGJldHdlZW4gYWRkcmVzcyBvZiBnaXZlbiBGUCByZWdpc3RlciwgYW5kIGJlZ2lubmluZyBvZgorCWBzdHJ1Y3QgdXNlcicgdGhhdCBpdCBvY2N1cnMgaW4uCisKKwkqIGhwOWszMjAtZGVwLmMgKGNvcmVfZmlsZV9jb21tYW5kKTogRml4IHNpZ24gZXJyb3IgaW4gc2l6ZQorCWFyZ3VtZW50IHRvIG15cmVhZC4gIENoYW5nZSBidWZmZXIgYXJndW1lbnQgdG8gcG9pbnRlcjsgd2FzCisJY29weWluZyBlbnRpcmUgc3RydWN0dXJlLgorCShmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMsIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6IFJlcGxhY2UKKwlvY2N1cnJlbmNlcyBvZiBgRlBfUkVHSVNURVJfQUREUl9ESUZGJyB3aXRoIGBGUF9SRUdJU1RFUl9BRERSJy4KKwlGbHVzaCBmb3JtZXIgZGVmaW5pdGlvbi4KKworV2VkIE5vdiAgOSAxMjoxMTozNyAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiB4Z2RiLmM6IEtpbGxlZCBpbmNsdWRlIG9mIGluaXRpYWxpemUuaC4KKworCSogUHVsbGVkIGluIHhnZGIuYyBmcm9tIHRoZSBuZXQuCisKKwkqIENoZWNrcG9pbnRlZCBkaXN0cmlidXRpb24gKHRvIHByb3ZpZGUgdG8gM2IyIGd1eSkuCisKKwkqIGNvZmZyZWFkLmMsIGRieHJlYWQuYywgc3ltbWlzYy5jLCBzeW10YWIuYywgc3ltc2VnLmg6IENoYW5nZWQKKwlmb3JtYXQgb2YgdGFibGUgb2YgbGluZSBudW1iZXItLXBjIG1hcHBpbmcgaW5mb3JtYXRpb24uICBDYW4KKwloYW5kbGUgbmVnYXRpdmUgcGMncyBub3cuCisKKwkqIGNvbW1hbmQuYzogRGVsZXRlZCBsb2NhbCBjb3B5IG9mIHNhdmVzdHJpbmc7IGNvZGUgaW4gdXRpbHMuYyBpcworCWlkZW50aWNhbC4gCisKK1R1ZSBOb3YgIDggMTE6MTI6MTYgMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IHBsYW50YXJpcy5haS5taXQuZWR1KQorCisJKiBnZGIudGV4aW5mbzogQWRkZWQgZG9jdW1lbnRhdGlvbiBmb3Igc2hlbGwgZXNjYXBlLgorCitNb24gTm92ICA3IDEyOjI3OjE2IDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBzdWdhci1ib21icy5haS5taXQuZWR1KQorCisJKiBjb21tYW5kLmM6IEFkZGVkIGNvbW1hbmRzIGZvciBzaGVsbCBlc2NhcGUuCisKKwkqIGNvcmUuYywgZGJ4cmVhZC5jOiBBZGRlZCBST0JPVFVTU0lOIG1vZHMuCisKKwkqIENoZWNrcG9pbnRlZCBkaXN0cmlidXRpb24uCisKKwkqIHByaW50Y21kLmMgKHhfY29tbWFuZCk6IFlhbmtlZCBlcnJvciBpZiB0aGVyZSBpcyBubyBtZW1vcnkgdG8KKwlleGFtaW5lIChjb3VsZCBiZSBsb29raW5nIGF0IGV4ZWN1dGFibGUgc3RyYWlnaHQpLgorCisJKiBzcGFyYy1waW5zbi5jIChwcmludF9pbnNuKTogQW1vdW50IHRvIGxlZnRzaGlmdCBzZXRoaSBpbW0gYnkgaXMKKwlub3cgMTAgKG1hdGNoZXMgYWRiIGluIG91dHB1dCkuCisKKwkqIHByaW50Y21kLmMgKHhfY29tbWFuZCk6IERvbid0IGF0dGVtcHQgdG8gc2V0ICRfICYgJF9fIGlmIHRoZXJlCisJaXMgbm8gbGFzdF9leGFtaW5lX3ZhbHVlIChjYW4gaGFwcGVuIGlmIHlvdSBkaWQgYW4geC8wKS4KKworRnJpIE5vdiAgNCAxMzo0NDo0OSAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgZ2x1dGV1cy5haS5taXQuZWR1KQorCisJKiBwcmludGNtZC5jICh4X2NvbW1hbmQpOiBFcnJvciBpZiB0aGVyZSBpcyBubyBtZW1vcnkgdG8gZXhhbWluZS4KKworCSogZ2RiLnRleGluZm86IEFkZGVkICJjb250IiB0byB0aGUgY29tbWFuZCBpbmRleC4KKworCSogc3BhcmMtZGVwLmMgKGRvX3NhdmVfaW5zbik6IEZpeGVkIHR5cG8gaW4gc2hpZnQgYW1vdW50LgorCisJKiBtNjhrLW9wY29kZS5oOiBGaXhlZCBvcGNvZGVzIGZvciA2ODg4MS4KKworCSogYnJlYWtwb2ludC5jLCBpbmZjbWQuYywgc291cmNlLmM6IENoYW5nZWQgZGVmYXVsdHMgaW4gc2V2ZXJhbAorCXBsYWNlcyBmb3IgZGVjb2RlX2xpbmVfMSB0byB3b3JrIG9mZiBvZiB0aGUgZGVmYXVsdF9icmVha3BvaW50XyoKKwl2YWx1ZXMgaW5zdGVhZCBvZiBjdXJyZW50X3NvdXJjZV8qIHZhbHVlcyAodGhlIGN1cnJlbnRfc291cmNlXyoKKwl2YWx1ZXMgYXJlIG9mZiBieSA1IG9yIHNvIGJlY2F1c2Ugb2YgbGlzdGluZyBkZWZhdWx0cykuCisKKwkqIHN0YWNrLmMgKGZyYW1lX2luZm8pOiBpZmRlZidkIG91dCBGUkFNRV9TUEVDSUZDQVRJT05fRFlBRElDIGluCisJdGhlIHN0YWNrLmMgbW9kdWxlLiAgSWYgSSBjYW4ndCBkbyB0aGlzIHJpZ2h0LCBJIGRvbid0IHdhbnQgdG8gZG8KKwlpdCBhdCBhbGwuICBSZWFkIHRoZSBjb21tZW50IHRoZXJlIGZvciBtb3JlIGluZm8uCisKK01vbiBPY3QgMzEgMTY6MjM6MDYgMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGdsdXRldXMuYWkubWl0LmVkdSkKKworCSogZ2RiLnRleGluZm86IEFkZGVkIGRvY3VtZW50YXRpb24gb24gdGhlICJ1bnRpbCIgY29tbWFuZC4KKworU2F0IE9jdCAyOSAxNzo0NzoxMCAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgYXBwbGUtZ3Vua2llcy5haS5taXQuZWR1KQorCisJKiBicmVha3BvaW50LmMsIGluZmNtZC5jOiBBZGRlZCBVTlRJTF9DT01NQU5EIGFuZCBzdWJyb3V0aW5lcyBvZgorCWl0LiAKKworCSogYnJlYWtwb2ludC5jLCBpbmZjbWQuYywgaW5mcnVuLmM6IEFkZGVkIG5ldyBmaWVsZCB0byBicmVha3BvaW50CisJc3RydWN0dXJlIChzaWxlbnQsIGluZGljYXRpbmcgYSBzaWxlbnQgYnJlYWtwb2ludCksIGFuZCBtb2RpZmllZAorCWJyZWFrcG9pbnRfc3RvcF9zdGF0dXMgYW5kIHRoaW5ncyB0aGF0IHJlYWQgaXQncyByZXR1cm4gdmFsdWUgdG8KKwl1bmRlcnN0YW5kIGl0LgorCitGcmkgT2N0IDI4IDE3OjQ1OjMzIDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBnbHV0ZXVzLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYywgc3ltbWlzYy5jOiBBc3NvcnRlZCBzcGVlZHVwcyBmb3IgcmVhZGluLCBpbmNsdWRpbmcKKwlzcGVjaWFsIGNhc2luZyBtb3N0IGNvbW1vbiBzeW1ib2xzLCBhbmQgZG9pbmcgYnVmZmVyaW5nIGluc3RlYWQgb2YKKwljYWxsaW5nIG1hbGxvYy4gIAorCitUaHUgT2N0IDI3IDExOjExOjE1IDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBnbHV0ZXVzLmFpLm1pdC5lZHUpCisKKwkqIHN0YWNrLmMsIHNwYXJjLWRlcC5jLCBtLXNwYXJjLmg6IE1vZGlmaWVkIHRvIGFsbG93ICJpbmZvIGZyYW1lIgorCXRvIHRha2UgdHdvIGFyZ3VtZW50cyBvbiB0aGUgc3BhcmMgYW5kIGRvIHRoZSByaWdodCB0aGluZyB3aXRoCisJdGhlbS4gCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiLCBwcm9jZXNzX3N5bWJvbF9mb3JfcHN5bXRhYik6IFB1dAorCXN0dWZmIHRvIHB1dCBvbmx5IHN5bWJvbHMgdGhhdCBkaWRuJ3QgaGF2ZSBkZWJ1Z2dpbmcgaW5mbyBvbiB0aGUKKwltaXNjIGZ1bmN0aW9ucyBsaXN0IGJhY2sgaW4uCisKK1dlZCBPY3QgMjYgMTA6MTA6MzIgMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGdsdXRldXMuYWkubWl0LmVkdSkKKworCSogdmFscHJpbnQuYyAodHlwZV9wcmludF92YXJzcGVjX3N1ZmZpeCk6IEFkZGVkIGNoZWNrIGZvcgorCVRZUEVfTEVOR1RIKFRZUEVfVEFSR0VUX1RZUEUodHlwZSkpID4gMCB0byBwcmV2ZW50IGRpdmlkZSBieSAwLgorCisJKiBwcmludGNtZC5jIChwcmludF9mb3JtYXR0ZWQpOiBBZGRlZCBjaGVjayBmb3IgVkFMVUVfUkVQRUFURUQ7CisJdmFsdWVfcHJpbnQgbmVlZHMgdG8gYmUgY2FsbGVkIGZvciB0aGF0LgorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBBZGRlZCBicmVhayB3aGVuIHlvdSBkZWNpZGUgdG8KKwlzdG9wIG9uIGEgbnVsbCBmdW5jdGlvbiBwcm9sb2d1ZSByYXRoZXIgdGhhbiBjb250aW51ZSBzdGVwcGluZy4KKworCSogbS1zdW4zLmg6IEFkZGVkIGV4cGxhbmF0b3J5IGNvbW1lbnQgdG8gUkVHSVNURVJfUkFXX1NJWkUuCisKKwkqIGV4cHJlYWQueSAocGFyc2VfY18xKTogSW5pdGlhbGl6ZWQgcGFyZW5fZGVwdGggZm9yIGVhY2ggcGFyc2UuCisKK1R1ZSBPY3QgMjUgMTQ6MTk6MzggMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGdsdXRldXMuYWkubWl0LmVkdSkKKworCSogdmFscHJpbnQuYywgY29mZnJlYWQuYywgZGJ4cmVhZC5jOiBFbnVtIGNvbnN0YW50IHZhbHVlcyBpbiBlbnVtCisJdHlwZSBub3cgYWNjZXNzZWQgdGhyb3VnaCBUWVBFX0ZJRUxEX0JJVFBPUy4KKworCSogZGJ4cmVhZC5jIChwcm9jZXNzX3N5bWJvbF9mb3JfcHN5bXRhYik6IEFkZGVkIGNvZGUgdG8gZGVhbCB3aXRoCisJcG9zc2libGUgbGFjayBvZiBhICI6IiBpbiBhIGRlYnVnZ2luZyBzeW1ib2wgKGRvIG5vdGhpbmcpLgorCisJKiBzeW10YWIuYyAoZGVjb2RlX2xpbmVfMSk6IEFkZGVkIGNoZWNrIGluIGNhc2Ugb2YgYWxsIG51bWJlcnMgZm9yCisJY29tcGxldGUgbGFjayBvZiBzeW1ib2xzLgorCisJKiBzb3VyY2UuYyAoc2VsZWN0X3NvdXJjZV9zeW10YWIpOiBNYWRlIHN1cmUgdGhhdCB0aGlzIHdvdWxkbid0CisJYm9tYiBvbiBjb21wbGV0ZSBsYWNrIG9mIHN5bWJvbHMuCisKK01vbiBPY3QgMjQgMTI6Mjg6MjkgMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogbS1zcGFyYy5oLCBmaW5kdmFyLmM6IERpdGNoZWQgUkVHSVNURVJfU0FWRURfVU5JUVVFTFkgYW5kIGJhc2VkCisJY29kZSBvbiBSRUdJU1RFUl9JTl9XSU5ET1dfUCBhbmQgSEFWRV9SRUdJU1RFUl9XSU5ET1dTLiAgVGhpcyB3aWxsCisJYnJlYWsgd2hlbiB3ZSBmaW5kIGEgcmVnaXN0ZXIgd2luZG93IG1hY2hpbmUgd2hpY2ggc2F2ZXMgdGhlCisJd2luZG93IHJlZ2lzdGVycyB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gaW5mZXJpb3IgZnJhbWUuCisKKwkqIHNwYXJjLWRlcC5jIChmcmFtZV9zYXZlZF9wYyk6IFB1dCBQQ19BREpVU1QgcmV0dXJuIGJhY2sgaW4gZm9yCisJZnJhbWVfc2F2ZWRfcGMuICBTZWVtcyBjb3JyZWN0LgorCisJKiBmaW5kdmFyLmMsIG0tc3BhcmMuaDogQ3JlYXRlZCB0aGUgbWFjcm8gUkVHSVNURVJfU0FWRURfVU5JUVVFTFkKKwl0byBoYW5kbGUgcmVnaXN0ZXIgd2luZG93IGlzc3VlcyAoaWUuIHRoYXQgZmluZF9zYXZlZF9yZWdpc3RlcgorCXdhc24ndCBjaGVja2luZyB0aGUgc2VsZWN0ZWQgZnJhbWUgaXRzZWxmIGZvciBzaGl0KS4gCisKKwkqIHNwYXJjLWRlcC5jIChjb3JlX2ZpbGVfY29tbWFuZCk6IE9mZnNldCB0YXJnZXQgb2YgbyAmIGcgcmVnaXN0ZXIKKwliY29weSBieSAxIHRvIGhpdCBjb3JyZWN0IHJlZ2lzdGVycy4KKworCSogbS1zcGFyYy5oOiBDaGFuZ2VkIFNUQUNLX0VORF9BRERSLgorCitTdW4gT2N0IDIzIDE5OjQxOjUxIDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBhcHBsZS1ndW5raWVzLmFpLm1pdC5lZHUpCisKKwkqIHNwYXJjLWRlcC5jIChjb3JlX2ZpbGVfY29tbWFuZCk6IEFkZGVkIGluIGNvZGUgdG8gZ2V0IHRoZSBpICYgbAorCXJlZ2lzdGVycyBmcm9tIHRoZSBzdGFjayBpbiB0aGUgY29yZWZpbGUsIGFuZCBibGV3IGF3YXkgc29tZSB3cm9uZworCWNvZGUgdG8gZ2V0IGkgJiBsIGZyb20gaW5mZXJpb3IuCisKK0ZyaSBPY3QgMjEgMTU6MDk6MTkgMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGFwcGxlLWd1bmtpZXMuYWkubWl0LmVkdSkKKworCSogbS1zcGFyYy5oIChQVVNIX0RVTU1ZX0ZSQU1FKTogU2F2ZWQgdGhlIHZhbHVlIG9mIHRoZSBSUCByZWdpc3RlcgorCWluIHRoZSBsb2NhdGlvbiByZXNlcnZlZCBmb3IgaTcgKGluIHRoZSBjcmVhdGVkIGZyYW1lKTsgdGhpcyB3YXkKKwl0aGUgcnAgdmFsdWUgd29uJ3QgZ2V0IGxvc3QuICBUaGUgcGMgKHdoYXQgd2UgcHV0IGludG8gdGhlIHJwIGluCisJdGhpcyByb3V0aW5lKSBnZXRzIHNhdmVkIHNlcGVyYXRlbHksIHNvIHdlIGxvb3NlIG5vIGluZm9ybWF0aW9uLgorCisJKiBzcGFyYy1kZXAuYyAoZG9fc2F2ZV9pbnNuICYgZG9fcmVzdG9yZV9pbnNuKTogQWRkZWQgYSB3cmFwcGVyIHRvCisJcHJlc2VydmUgdGhlIHByb2NlZWQgc3RhdHVzIHN0YXRlIHZhcmlhYmxlcyBhcm91bmQgZWFjaCBjYWxsIHRvCisJcHJvY2VlZCAodGhlIGN1cnJlbnQgZnJhbWUgd2FzIGdldHRpbmcgbXVuZ2VkIGJlY2F1c2UgdGhpcyB3YXNuJ3QKKwliZWluZyBkb25lKS4KKworCSogbS1zcGFyYy5oIChGUkFNRV9GSU5EX1NBVkVEX1JFR1MpOiBGaXggYnVnOiBzYXZlZCByZWdpc3RlcnMKKwlhZGRyZXNzZXMgd2VyZSBiZWluZyBjb21wdXRlZCB1c2luZyBhYnNvbHV0ZSByZWdpc3RlcnMgbnVtYmVyLAorCXJhdGhlciB0aGFuIG51bWJlcnMgcmVsYXRpdmUgdG8gZWFjaCBncm91cCBvZiByZWdzLgorCisJKiBtLXNwYXJjLmggKFBPUF9GUkFNRSk6IEZpeGVkIGEgYnVnIChJIGhvcGUpIGluIHRoZSBjb250ZXh0CisJd2l0aGluIHdoaWNoIHNhdmVkIHJlZyBudW1iZXJzIHdlcmUgYmVpbmcgaW50ZXJwZXR0ZWQuICBUaGUKKwl2YWx1ZXMgdG8gYmUgcmVzdG9yZWQgd2VyZSBiZWluZyBnb3R0ZW4gaW4gdGhlIGluZmVyaW9yIGZyYW1lLCBhbmQKKwl0aGUgcmVzdG9yaW5nIHdhcyBkb25lIGluIHRoZSBzdXBlcmlvciBmcmFtZS4gIFRoaXMgbWVhbnMgdGhhdCBpCisJcmVnaXN0ZXJzIG11c3QgYmUgcmVzdG9yZWQgaW50byBvIHJlZ2lzdGVycy4KKworCSogc3BhcmMtZGVwLmMgKGRvX3Jlc3RvcmVfaW5zbik6IE1vZGlmaWVkIHRvIHRha2UgYSBwYyBhcyBhbgorCWFyZ3VtZW50LCBpbnN0ZWFkIG9mIGEgcmF3X2J1ZmZlci4gIFRoaXMgbWF0Y2hlcyAoYXQgbGVhc3QgaXQKKwlhcHBlYXJzIHRvIG1hdGNoKSB1c2FnZSBmcm9tIFBPUF9GUkFNRSwgd2hpY2ggaXMgdGhlIG9ubHkgcGxhY2UKKwlmcm9tIHdoaWNoIGRvX3Jlc3RvcmVfaW5zbiBpcyBjYWxsZWQuCisKKwkqIHNwYXJjLWRlcC5jIChkb19zYXZlX2luc24gYW5kIGRvX3Jlc3RvcmVfaW5zbik6IEFkZGVkIGNvbW1lbnRzLgorCisJKiBtLXNwYXJjLmggKEZSQU1FX0ZJTkRfU0FWRURfUkVHUyk6IE1vZGlmaWVkIG15IGNvZGUgdG8gZmluZCB0aGUKKwlzYXZlIGFkZHJlc3NlcyBvZiBvdXQgcmVnaXN0ZXJzIHRvIHVzZSB0aGUgaW4gcmVncyBvZmYgdGhlIHN0YWNrCisJcG9pbnRlciB3aGVuIHRoZSBjdXJyZW50IGZyYW1lIGlzIDEgZnJvbSB0aGUgaW5uZXJtb3N0LgorCitUaHUgT2N0IDIwIDEzOjU2OjE1IDE5ODggICYgU21pdGggIChyYW5keSBhdCBob2JiZXMuYWkubWl0LmVkdSkKKworCSogYmxvY2tmcmFtZS5jLCBtLXNwYXJjLmg6IFJlbW92ZWQgY29kZSBhc3NvY2lhdGVkIHdpdGgKKwlHRVRfUFJFVl9GUkFNRV9GUk9NX0NBQ0hFX0lURU0uICBUaGlzIGNvZGUgd2FzIG5vdCBuZWVkZWQgZm9yIHRoZQorCXNwYXJjOyB5b3UgY2FuIGFsd2F5cyBmaW5kIHRoZSBwcmV2aW91cyBmcmFtZXMgZnAgZnJvbSB0aGUgZnAgb2YKKwl0aGUgY3VycmVudCBmcmFtZSAod2hpY2ggaXMgdGhlIHNwIG9mIHRoZSBwcmV2aW91cykuICBJdCdzIGdldHRpbmcKKwl0aGUgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZnJhbWUgKGllLiBzYXZlZAorCXJlZ2lzdGVycykgdGhhdCdzIGEgYml0Y2gsIGJlY2F1c2UgdGhhdCBzdHVmZiBpcyBzYXZlZCByZWxhdGl2ZSB0bworCXRoZSBzdGFjayBwb2ludGVyIHJhdGhlciB0aGFuIHRoZSBmcmFtZSBwb2ludGVyLgorCisJKiBtLXNwYXJjLmggKEdFVF9QUkVWX0ZSQU1FX0ZST01fQ0FDSEVfSVRFTSk6IE1vZGlmaWVkIHRvIHJldHVybgorCXRoZSBmcmFtZSBwb2ludGVyIG9mIHRoZSBwcmV2aW91cyBmcmFtZSBpbnN0ZWFkIG9mIHRoZSBzdGFjaworCXBvaW50ZXIgb2Ygc2FtZS4KKworCSogYmxvY2tmcmFtZS5jIChmbHVzaF9jYWNoZWRfZnJhbWVzKTogTW9kaWZpZWQgY2FsbCB0bworCW9ic3RhY2tfZnJlZSB0byBmcmVlIGJhY2sgdG8gZnJhbWVfY2FjaGUgaW5zdGVhZCBvZiBiYWNrIHRvIHplcm8uCisJVGhpcyBsZWF2ZXMgdGhlIG9ic3RhY2sgY29udHJvbCBzdHJ1Y3R1cmUgaW4gZmluaXRlIHN0YXRlIChhbmQKKwlzdGlsbCBmcmVlcyB0aGUgZW50cnkgYWxsb2NhdGVkIGF0IGZyYW1lX2NhY2hlKS4KKworU2F0IE9jdCAxNSAxNjozMDo0NyAxOTg4ICAmIFNtaXRoICAocmFuZHkgYXQgdGFydGFydXMudWNoaWNhZ28uZWR1KQorCisJKiB2YWxvcHMuYyAoY2FsbF9mdW5jdGlvbik6IFN1aWNpZGUgbWF0ZXJpYWwgaGVyZS4gIEZpeGVkIGEgdHlwbzsKKwlDQUxMX0RVTU1ZX1NUQUNLX0FESlVTVCB3YXMgc3BlbGxlZCBDQWxsX0RVTU1ZX1NUQUNLX0FESlVTVCBvbgorCWxpbmUgNTMwIG9mIHRoZSBmaWxlLiAgVGhpcyBjb3N0IG1lIHRocmVlIGRheXMuICBJJ20gZ2l2aW5nIHVwCisJdHlwaW5nIGZvciBsZW50LgorCitGcmkgT2N0IDE0IDE1OjEwOjQzIDE5ODggICYgU21pdGggIChyYW5keSBhdCB0YXJ0YXJ1cy51Y2hpY2Fnby5lZHUpCisKKwkqIG0tc3BhcmMuaDogQ29ycmVjdGVkIGEgbWlub3IgbWlzdGFrZSBpbiB0aGUgZHVtbXkgZnJhbWUgY29kZQorCXRoYXQgd2FzIGdldHRpbmcgdGhlIDV0aCBhcmd1bWVudCBhbmQgdGhlIGZpcnN0IGFyZ3VtZW50IGZyb20gdGhlCisJc2FtZSBwbGFjZS4KKworVHVlIE9jdCAxMSAxMTo0OTozMyAxOTg4ICAmIFNtaXRoICAocmFuZHkgYXQgdGFydGFydXMudWNoaWNhZ28uZWR1KQorCisJKiBpbmZydW4uYzogTWFkZSBzdG9wX2FmdGVyX3RyYXAgYW5kIHN0b3BfYWZ0ZXJfYXR0YWNoIGV4dGVybgorCWluc3RlYWQgb2Ygc3RhdGljIHNvIHRoYXQgY29kZSB3aGljaCB1c2VkIHByb2NlZWQgZnJvbSBtYWNoaW5lCisJZGVwZW5kZW50IGZpbGVzIGNvdWxkIGZpZGRsZSB3aXRoIHRoZW0uCisKKwkqIGJsb2NrZnJhbWUuYywgZnJhbWUuaCwgc3BhcmMtZGVwLmMsIG0tc3BhcmMuaDogQ2hhbmdlZCBzZW5zZSBvZgorCS0+cHJldiBhbmQgLT5uZXh0IGluIHN0cnVjdCBmcmFtZV9jYWNoZV9pdGVtIHRvIGZpdCB1c2FnZSBpbiByZXN0CisJb2YgZ2RiIChvb3BzKS4KKworTW9uIE9jdCAxMCAxNTozMjo0MiAxOTg4ICBSYW5keSBTbWl0aCAgKHJhbmR5IGF0IGdhcmdveWxlLnVjaGljYWdvLmVkdSkKKworCSogbS1zcGFyYy5oLCBzcGFyYy1kZXAuYywgYmxvY2tmcmFtZS5jLCBmcmFtZS5oOiBXcm90ZQorCWdldF9mcmFtZV9jYWNoZV9pdGVtLiAgTW9kaWZpZWQgRlJBTUVfU0FWRURfUEMgYW5kIGZyYW1lX3NhdmVkX3BjCisJdG8gdGFrZSBvbmx5IG9uZSBhcmd1bWVudCBhbmQgZG8gdGhlIGNvcnJlY3QgdGhpbmcgd2l0aCBpdC4gIEFkZGVkCisJdGhlIHR3byBtYWNyb3MgSSByZWNlbnRseSBkZWZpbmVkIGluIGJsb2NrZnJhbWUuYyB0byBtLXNwYXJjLmguCisJSGF2ZSB5ZXQgdG8gY29tcGlsZSB0aGlzIHRoaW5nIG9uIGEgc3BhcmMsIGJ1dCBJJ3ZlIG5vdyBtZXJnZWQgaW4KKwlldmVyeXRoaW5nIHRoYXQgSSByZWNlaXZlZCBmcm9tIHRpZW1hbm4sIGVpdGhlciBleGFjdGx5LCBvciBzaW1wbHkKKwllZmZlY3RpdmVseS4gCisKKwkqIHNvdXJjZS5jOiBBZGRlZCBjb2RlIHRvIGFsbG9jYXRlZCBzcGFjZSB0byBzYWxzLnNhbHMgaW4gdGhlIGNhc2UKKwl3aGVyZSBubyBsaW5lIHdhcyBzcGVjaWZpZWQuCisKKwkqIGJsb2NrZnJhbWUuYywgaW5mcnVuLmM6IE1vZGlmaWVkIHRvIGNhY2hlIHN0YWNrIGZyYW1lcyByZXF1ZXN0ZWQKKwl0byBtaW5pbWl6ZSBhY2Nlc3NlcyB0byBzdWJwcm9jZXNzLgorCitUdWUgT2N0ICA0IDE1OjEwOjM5IDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBjcmVhbS1vZi13aGVhdC5haS5taXQuZWR1KQorCisJKiBjb25maWcuZ2RiOiBBZGRlZCBzcGFyYy4KKworTW9uIE9jdCAgMyAyMzowMToyMiAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgY3JlYW0tb2Ytd2hlYXQuYWkubWl0LmVkdSkKKworCSogTWFrZWZpbGUsIGJsb2NrZnJhbWUuYywgY29tbWFuZC5jLCBjb3JlLmMsIGRieHJlYWQuYywgZGVmcy5oLAorCWV4cHJlYWQueSwgZmluZHZhci5jLCBpbmZjbWQuYywgaW5mbG93LmMsIGluZnJ1bi5jLCBzcGFyYy1waW5zbi5jLAorCW0tc3BhcmMuaCwgc3BhcmMtZGVmLmMsIHByaW50Y21kLmMsIHN0YWNrLmMsIHN5bW1pc2MuYywgc3ltc2VnLmgsCisJdmFsb3BzLmMsIHZhbHVlcy5jOiBEaWQgaW5pdGlhbCBtZXJnZSBvZiBzcGFyYyBwb3J0LiAgVGhpcyB3aWxsCisJbm90IGNvbXBpbGU7IGhhdmUgdG8gZG8gc3RhY2sgZnJhbWUgY2FjaGluZyBhbmQgZmluaXNoIHBvcnQuCisKKwkqIGluZmxvdy5jLCBnZGIudGV4aW5mbzogYHR0eScgbm93IHJlc2V0cyB0aGUgY29udHJvbGluZyB0ZXJtaW5hbC4gCisKK0ZyaSBTZXAgMzAgMTE6MzE6MTYgMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGdsdXRldXMuYWkubWl0LmVkdSkKKworCSogaW5mZXJpb3IuaCwgaW5mY21kLmMsIGluZnJ1bi5jOiBDaGFuZ2VkIHRoZSB2YXJpYWJsZQorCXN0b3BfcmFuZG9tX3NpZ25hbCB0byBzdG9wcGVkX2J5X3JhbmRvbSBzaWduYWwgdG8gZml0IGluIGJldHRlcgorCXdpdGggbmFtZSBjb252ZW50aW9ucyAodmFyaWFibGUgaXMgbm90IGEgZGlyZWN0aW9uIHRvIHRoZQorCXByb2NlZWQvcmVzdW1lIHNldDsgaXQgaXMgaW5mb3JtYXRpb24gZnJvbSBpdCkuCisKK1RodSBTZXAgMjkgMTM6MzA6NDYgMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGNyZWFtLW9mLXdoZWF0LmFpLm1pdC5lZHUpCisKKwkqIGluZmNtZC5jIChmaW5pc2hfY29tbWFuZCk6IFZhbHVlIHR5cGUgb2YgcmV0dXJuIHZhbHVlIGlzIG5vdworCXdoYXRldmVyIHRoZSBmdW5jdGlvbiByZXR1cm5zLCBub3QgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIChmaXhlZAorCWEgYnVnIGluIHByaW50aW5nIHNhaWQgdmFsdWUpLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYiwgcHJvY2Vzc19zeW1ib2xfZm9yX3BzeW10YWIpOgorCVB1dCAqYWxsKiBnbG9iYWwgc3ltYm9scyBpbnRvIG1pc2NfZnVuY3Rpb25zLiAgVGhpcyBpcyB3aGF0IHdhcworCWhhcHBlbmluZyBhbnl3YXksIGFuZCB3ZSBuZWVkIGl0IGZvciBmaW5kX3BjX21pc2NfZnVuY3Rpb24uCisKKwkqKiBUaGlzIHdhcyBldmVudHVhbGx5IHRha2VuIG91dCwgYnV0IEkgZGlkbid0IG1hcmsgaXQgaW4gdGhlCisJQ2hhbmdlTG9nLiAgT29wcy4KKworCSogZGJ4cmVhZC5jIChwcm9jZXNzX3N5bWJvbF9mb3JfcHN5bXRhYik6IFB1dCBldmVyeSBkZWJ1Z2dlcgorCXN5bWJvbCB3aGljaCBzdXJ2aXZlcyB0aGUgdG9wIGNhc2UgZXhjZXB0IGZvciBjb25zdGFudHMgb24gdGhlCisJc3ltY2hhaW4uICBUaGlzIG1lYW5zIHRoYXQgYWxsIG9mIHRoZXNlICp3b24ndCogc2hvdyB1cCBpbiBtaXNjCisJZnVuY3Rpb25zICh0aGlzIHdpbGwgYmUgZml4ZWQgb25jZSBJIG1ha2Ugc3VyZSBpdCdzIGJyb2tlbiB0aGUgd2F5CisJaXQncyBzdXBwb3NlZCB0byBiZSkuCisKKwkqIGRieHJlYWQuYzogTW9kaWZpZWQgcGxhY2VtZW50IG9mIGRlYnVnZ2VyIGdsb2JhbHMgb250byB0aGUgaGFzaAorCWxpc3Q7IG5vdyB3ZSBleGNsdWRlIHRoZSBzdHVmZiBhZnRlciB0aGUgY29sb24gYW5kIGRvbid0IHNraXAgdGhlCisJZmlyc3QgY2hhcmFjdGVyIChkZWJ1Z2dlciBzeW1ib2xzIGRvbid0IGhhdmUgdW5kZXJzY29yZXMpLgorCisJKiBkYnhyZWFkLmM6IEtpbGxlZCBkZWJ1Z2luZm8gc3R1ZmYgd2l0aCBpZmRlZidzLgorCitXZWQgU2VwIDI4IDE0OjMxOjUxIDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBjcmVhbS1vZi13aGVhdC5haS5taXQuZWR1KQorCisJKiBzeW10YWIuaCwgZGJ4cmVhZC5jOiBNb2RpZmllZCB0byBkZWFsIHdpdGggQklOQ0wsIEVJTkNMLCBhbmQKKwlFWENMIHN5bWJvbHMgcHJvZHVjZWQgYnkgdGhlIHN1biBsb2FkZXIgYnkgYWRkaW5nIGEgbGlzdCBvZgorCXByZS1yZXF1aXNpdGUgcGFydGlhbF9zeW10YWJzIHRoYXQgZWFjaCBwYXJ0aWFsIHN5bXRhYiBuZWVkcy4KKworCSogc3ltdGFiLmgsIGRieHJlYWQuYywgc3ltdGFiLmMsIHN5bW1pc2MuYzogTW9kaWZpZWQgdG8gYXZvaWQKKwlkb2luZyBhIHFzb3J0IG9uIHRoZSBsb2NhbCAoc3RhdGljKSBwc3ltYm9scyBmb3IgZWFjaCBmaWxlIHRvCisJc3BlZWQgc3RhcnR1cC4gIFRoaXMgZmVhdHVyZSBpcyBub3QgY29tcGxldGVseSBkZWJ1Z2dlZCwgYnV0IGl0J3MKKwlpbmNsdXNpb24gaGFzIGZvcmNlZCB0aGUgaW5jbHVzaW9uIG9mIGFub3RoZXIgZmVhdHVyZSAoZGVhbGluZworCXdpdGggRUlOQ0wncywgQklOQ0wncyBhbmQgRVhDTCdzKSBhbmQgc28gSSdtIGdvaW5nIHRvIGdvIGluIGFuZAorCWRlYWwgd2l0aCB0aGVtLgorCisJKiBkYnhyZWFkLmMgKHByb2Nlc3Nfc3ltYm9sX2Zvcl9wc3ltdGFiKTogTWFkZSBzdXJlIHRoYXQgdGhlIGNsYXNzCisJb2YgdGhlIHN5bWJvbCBtYWRlIGl0IGludG8gdGhlIHBhcnRpYWxfc3ltYm9sIGVudHJ5LgorCitUdWUgU2VwIDI3IDE1OjEwOjI2IDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBnbHV0ZXVzLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYzogRml4ZWQgYnVnOyBpbml0X3BzeW1ib2xfbGlzdCB3YXMgbm90IGJlaW5nIGNhbGxlZAorCXdpdGggdGhlIHJpZ2h0IG51bWJlciBvZiBhcmd1bWVudHMgKDEpLgorCisJKiBkYnhyZWFkLmM6IFB1dCBpZmRlZidzIGFyb3VuZCBOX01BSU4sIE5fTTJDLCBhbmQgTl9TQ09QRSB0bworCWFsbG93IGNvbXBpbGF0aW9uIG9uIGEgbWljcm92YXguCisKKwkqIGNvbmZpZy5nZGI6IE1vZGlmaWVkIHNvIHRoYXQgImNvbmZpZy5nZGIgdmF4IiB3b3VsZCB3b3JrLgorCisJKiBkYnhyZWFkLmMsIHN5bXRhYi5oLCBzeW1taXNjLmgsIHN5bXRhYi5jLCBzb3VyY2UuYzogUHV0IGluIG1hbnkKKwlhbmQgdmFyaWVkIGhhY2tzIHRvIHNwZWVkIHVwIGdkYiBzdGFydHVwIGluY2x1ZGluZzogQSBjb21wbGV0ZQorCXJld3JpdGUgb2YgcmVhZF9kYnhfc3ltdGFiLCBhIG1vZGlmaWNhdGlvbiBvZiB0aGUgcGFydGlhbF9zeW10YWIKKwlkYXRhIHR5cGUsIGRlbGV0aW9uIG9mIHNlbGVjdF9zb3VyY2Vfc3ltdGFiIGZyb20KKwlzeW1ib2xfZmlsZV9jb21tYW5kLCBhbmQgb3B0aW1penRpb24gb2YgdGhlIGNhbGwgdG8gc3RyY21wIGluCisJY29tcGFyZV9wc3ltYm9scy4gCisKK1RodSBTZXAgMjIgMTE6MDg6NTQgMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGdsdXRldXMuYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jIChwc3ltdGFiX3RvX3N5bXRhYik6IFJlbW92ZWQgY2FsbCB0bworCWluaXRfbWlzY19mdW5jdGlvbnMuIAorCisJKiBkYnhyZWFkLmM6IEZpeGVkIGVudW1lcmF0aW9uIHR5cGUgY2xhc2ggKHVzZWQgZW51bSBpbnN0ZWFkIG9mCisJaW50ZWdlciBjb25zdGFudCkuCisKKwkqIGJyZWFrcG9pbnQuYzogRml4ZWQgdHlwbzsgbGFjayBvZiBcIGF0IGVuZCBvZiBsaW5lIGluIG1pZGRsZSBvZgorCXN0cmluZyBjb25zdGFudC4gCisKKwkqIHN5bXNlZy5oOiBGaXhlZCB0eXBvOyBsYWNrIG9mIHNlbWljb2xvbiBhZnRlciBzdHJ1Y3R1cmUKKwlkZWZpbml0aW9uLiAKKworCSogY29tbWFuZC5jLCBicmVha3BvaW50LmMsIHByaW50Y21kLmM6IEFkZGVkIGNtZGxpc3QgZWRpdGluZworCWZ1bmN0aW9ucyB0byBhZGQgY29tbWFuZHMgd2l0aCB0aGUgYWJicmV2IGZsYWcgc2V0LiAgQ2hhbmdlZAorCWhlbHBfY21kX2xpc3QgdG8gcmVjb2duaXplIHRoaXMgZmxhZyBhbmQgbW9kaWZpZWQgdW5zZXQsCisJdW5kaXNwbGF5LCBhbmQgZW5hYmxlLCBkaXNhYmxlLCBhbmQgZGVsZXRlIGJyZWFrcG9pbnRzIHRvIGhhdmUKKwl0aGlzIGZsYWcgc2V0LgorCitXZWQgU2VwIDIxIDEzOjM0OjE5IDE5ODggIFJhbmRhbGwgU21pdGggIChyYW5keSBhdCBwbGFudGFyaXMuYWkubWl0LmVkdSkKKworCSogYnJlYWtwb2ludC5jLCBpbmZjbWQuYywgZ2RiLnRleGluZm86IENyZWF0ZWQgInVuc2V0IiBhcyBhbiBhbGlhcworCWZvciBkZWxldGUsIGFuZCBjaGFuZ2VkICJ1bnNldC1lbnZpcm9ubWVudCIgdG8gYmUgdGhlCisJImVudmlyb25tZW50IiBzdWJjb21tYW5kIG9mICJkZWxldGUiLgorCisJKiBnZGIudGV4aW5mbywgdmFscHJpbnQuYzogQWRkZWQgZG9jdW1lbnRhdGlvbiBpbiB0aGUgbWFudWFsIGZvcgorCWJyZWFraW5nIHRoZSBzZXQtKiBjb21tYW5kcyBpbnRvIHN1YmNvbW1hbmRzIG9mIHNldC4gIENoYW5nZWQgInNldAorCW1heGltdW0iIHRvICJzZXQgYXJyYXktbWF4Ii4KKworCSogbWFpbi5jLCBwcmludGNtZC5jLCBicmVha3BvaW50LmM6IE1vdmVkIHRoZSBkZWNsYXJhdGlvbiBvZgorCWNvbW1hbmQgbGlzdHMgaW50byBtYWluIGFuZCBzZXR1cCBhIGZ1bmN0aW9uIGluIG1haW4gaW5pdGlhbGl6aW5nCisJdGhlbSB0byBndWFycmFudGVlIHRoYXQgdGhleSB3b3VsZCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZworCWFueSBvZiB0aGUgaW5kaXZpZHVhbCBmaWxlcyBpbml0aWFsaXplIHJvdXRpbmVzLgorCisJKiBjb21tYW5kLmMgKGxvb2t1cF9jbWQpOiBBIG51bGwgc3RyaW5nIHN1YmNvbW1hbmQgaXMgdHJlYXRlZCBhcworCWFuIHVua25vd24gc3ViY29tbWFuZCByYXRoZXIgdGhhbiBhbiBhbWJpZ3VvdXMgb25lIChlZy4gInNldCAkeCA9CisJMSIgd2lsbCBub3cgd29yaykuCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IFB1dCBpbiBpZmRlZiBmb3IgU29ueSBOZXdzIGluCisJY2hlY2sgZm9yIHRyYXAgYnkgSU5ORVJfVEhBTiBtYWNyby4KKworCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiBQdXQgaW4gY2F0Y2ggdG8ga2VlcCB0aGUgdXNlciBmcm9tCisJYXR0ZW1wdGluZyB0byBjYWxsIGEgbm9uIGZ1bmN0aW9uIGFzIGEgZnVuY3Rpb24uCisKK1R1ZSBTZXAgMjAgMTA6MzU6NTMgMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IG9hdG1lYWwuYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIpOiBJbnN0YWxsZWQgY29kZSB0byBrZWVwIHRyYWNrIG9mCisJd2hpY2ggZ2xvYmFsIHN5bWJvbHMgZGlkIG5vdCBoYXZlIGRlYnVnZ2VyIHN5bWJvbHMgcmVmZXJpbmcgdG8KKwl0aGVtLCBhbmQgcmVjb3JkaW5nIHRoZXNlIHZpYSByZWNvcmRfbWlzY19mdW5jdGlvbi4KKworCSogZGJ4cmVhZC5jOiBLaWxsZWQgY29kZSB0byBjaGVjayBmb3IgZXh0cmEgZ2xvYmFsIHN5bWJvbHMgaW4gdGhlCisJZGVidWdnZXIgc3ltYm9sIHRhYmxlLgorCisJKiBwcmludGNtZC5jLCBicmVha3BvaW50LmM6IE1vZGlmaWVkIGhlbHAgZW50cmllcyBmb3Igc2V2ZXJhbAorCWNvbW1hbmRzIHRvIG1ha2Ugc3VyZSB0aGF0IGFiYnJldmlhdGlvbnMgd2VyZSBjbGVhcmx5IG1hcmtlZCBhbmQKKwl0aGF0IHRoZSByaWdodCBjb21tYW5kcyBzaG93ZWQgdXAgaW4gdGhlIGhlbHAgbGlzdGluZ3MuCisKKwkqIG1haW4uYywgY29tbWFuZC5jLCBicmVha3BvaW50LmMsIGluZmNtZC5jLCBwcmludGNtZC5jLAorCXZhbHByaW50LmMsIGRlZnMuaDogTW9kaWZpZWQgaGVscCBzeXN0ZW0gdG8gYWxsb3cgaGVscCBvbiBhIGNsYXNzCisJbmFtZSB0byBzaG93IHN1YmNvbW1hbmRzIGFzIHdlbGwgYXMgY29tbWFuZHMgYW5kIGhlbHAgb24gYSBjb21tYW5kCisJdG8gc2hvdyAqYWxsKiBzdWJjb21tYW5kcyBvZiB0aGF0IGNvbW1hbmQuCisKK0ZyaSBTZXAgMTYgMTY6NTE6MTkgMTk4OCAgUmFuZGFsbCBTbWl0aCAgKHJhbmR5IGF0IGdsdXRldXMuYWkubWl0LmVkdSkKKworCSogYnJlYWtwb2ludC5jIChfaW5pdGlhbGl6ZV9icmVha3BvaW50KTogTWFkZSAiYnJlYWtwb2ludHMiCisJc3ViY29tbWFuZHMgb2YgZW5hYmxlLCBkaXNhYmxlLCBhbmQgZGVsZXRlIHVzZSBjbGFzcyAwIChpZS4gdGhleQorCXNob3cgdXAgd2hlbiB5b3UgZG8gYSBoZWxwIHh4eCBub3cpLgorCisJKiBpbmZjbWQuYyxwcmludGNtZCxjLG1haW4uYyx2YWxwcmludC5jOiBDaGFuZ2VkIHRoZSBzZXQtKgorCWNvbW1hbmRzIGludG8gc3ViY29tbWFuZHMgb2Ygc2V0LiAgQ3JlYXRlZCAic2V0IHZhcmlhYmxlIiBmb3IgdXNlCisJd2l0aCB2YXJpYWJsZXMgd2hvc2UgbmFtZXMgbWlnaHQgY29uZmxpY3Qgd2l0aCBvdGhlciBzdWJjb21tYW5kcy4KKworCSogYmxvY2tmcmFtZS5jLCBkYnhyZWFkLmMsIGNvZmZyZWFkLmMsIGV4cHJlYWQueSwgc291cmNlLmM6CisJRml4ZWQgbW9zdGx5IG1pbm9yIChhbmQgb25lIG1ham9yIG9uZSBpbiBibG9ja19mb3JfcGMpIGJ1Z3MKKwlpbnZvbHZpbmcgY2hlY2tpbmcgdGhlIHBhcnRpYWxfc3ltdGFiX2xpc3Qgd2hlbiBhIHNjYW4gdGhyb3VnaCB0aGUKKwlzeW10YWJfbGlzdCBmYWlscy4KKworV2VkIFNlcCAxNCAxMjowMjowNSAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgc3VnYXItc21hY2tzLmFpLm1pdC5lZHUpCisKKwkqIGJyZWFrcG9pbnQuYywgZ2RiLnRleGluZm86IEFkZGVkIGVuYWJsZSBicmVha3BvaW50cywgZGlzYWJsZQorCWJyZWFrcG9pbnRzIGFuZCBkZWxldGUgYnJlYWtwb2ludHMgYXMgc3lub255bXMgZm9yIGVuYWJsZSwKKwlkaXNhYmxlLCBhbmQgZGVsZXRlLiAgVGhpcyBzZWVtZWQgcmVhc29uYWJsZSBiZWNhdXNlIG9mIHRoZQorCWltbWVuaW5lbnQgYXJyaXZhbCBvZiB3YXRjaHBvaW50cyAmIGV0Yy4KKworCSogZ2RiLnRleGluZm86IEFkZGVkIGVuYWJsZSBkaXNwbGF5LCBkaXNhYmxlIGRpc3BsYXksIGFuZCBkZWxldGUKKwlkaXNwbGF5IHRvIG1hbnVhbC4KKworVHVlIFNlcCAxMyAxNjo1Mzo1NiAxOTg4ICBSYW5kYWxsIFNtaXRoICAocmFuZHkgYXQgc3VnYXItc21hY2tzLmFpLm1pdC5lZHUpCisKKwkqIGluZmVyaW9yLmgsIGluZnJ1bi5jLCBpbmZjbWQuYzogQWRkZWQgdmFyaWFibGUKKwlzdG9wX3JhbmRvbV9zaWduYWwgdG8gaW5kaWNhdGUgd2hlbiBhIHByb2NlZWQgaGFkIGJlZW4gc3RvcHBlZCBieQorCWFuIHVuZXhwZWN0ZWQgc2lnbmFsLiAgVXNlZCB0aGlzIHRvIGRldGVybWluZSAoaW4gbm9ybWFsX3N0b3ApCisJd2hldGhlciB0aGUgY3VycmVudCBkaXNwbGF5IHBvaW50IHNob3VsZCBiZSBkZWxldGVkLgorCisJKiB2YWxvcHMuYzogRml4IHRvIHZhbHVlX2luZCB0byBjaGVjayBmb3IgcmVmZXJlbmNlIGJlZm9yZSBkb2luZyBhCisJQ09FUkNFX0FSUkFZLgorCitTdW4gSnVsIDMxIDExOjQyOjM2IDE5ODggIFJpY2hhcmQgU3RhbGxtYW4gIChybXMgYXQgZnJvc3RlZC1mbGFrZXMuYWkubWl0LmVkdSkKKworCSogYnJlYWtwb2ludC5jIChfaW5pdGlhbGl6ZV9icmVha3BvaW50KTogQ2xlYW4gdXAgZG9jIGZvciBjb21tYW5kcworCXRoYXQgY2FuIG5vdyBhcHBseSBhbHNvIHRvIGF1dG8tZGlzcGxheXMuCisKKwkqIGNvZmZyZWFkLmMgKHJlY29yZF9saW5lKTogQ29ycmVjdGVkIGEgc3BhenogaW4gZWRpdGluZy4KKwlBbHNvIHJlbW92ZWQgdGhlIHR3byBsaW5lcyB0aGF0IGFzc3VtZSBsaW5lLW51bWJlcnMgYXBwZWFyCisJb25seSBpbiBpbmNyZWFzaW5nIG9yZGVyLgorCitUdWUgSnVsIDI2IDIyOjE5OjA2IDE5ODggIFBldGVyIFRlck1hYXQgIChwZXRlIGF0IGNvcm4tY2hleC5haS5taXQuZWR1KQorCisJKiBleHByZXNzaW9uLmgsIGV2YWwuYywgZXhwcHJpbnQuYywgcHJpbnRjbWQuYywgdmFsYXJpdGguYywKKwl2YWxvcHMuYywgdmFscHJpbnQuYywgdmFsdWVzLmMsIG0tKi5oOiBDaGFuZ2VzIGZvciBldmFsdWF0aW5nIGFuZAorCWRpc3BsYXlpbmcgNjQtYml0IGBsb25nIGxvbmcnIGludGVnZXJzLiAgRWFjaCBtYWNoaW5lIG11c3QgZGVmaW5lCisJYSBMT05HRVNUIHR5cGUsIGFuZCBhIEJVSUxUSU5fVFlQRV9MT05HRVNULgorCisJKiBzeW1taXNjLmM6IChwcmludF9zeW10YWIpIGNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIGZvcGVuIGFuZCBjYWxsCisJcGVycm9yX3dpdGhfbmFtZSBpZiBuZWVkZWQuCisKK1RodSBKdWwgMjEgMDA6NTY6MTEgMTk4OCAgUGV0ZXIgVGVyTWFhdCAgKHBldGUgYXQgY29ybi1jaGV4LmFpLm1pdC5lZHUpCisKKwkqIENvbnZleDogY29yZS5jOiBjaGFuZ2VzIHJlcXVpcmVkIGJ5IENvbnZleCdzIFNPRkYgZm9ybWF0IHdlcmUKKwlpc29sYXRlZCBpbiBjb252ZXgtZGVwLmMuCisKK1dlZCBKdWwgMjAgMjE6MjY6MTAgMTk4OCAgUGV0ZXIgVGVyTWFhdCAgKHBldGUgYXQgY29ybi1jaGV4LmFpLm1pdC5lZHUpCisKKwkqIGNvZmZyZWFkLmMsIGNvcmUuYywgZXhwcmVhZC55LCBpMzg2LXBpbnNuLmMsIGluZmNtZC5jLCBpbmZsb3cuYywKKwlpbmZydW4uYywgbS1pMzg2LmgsIG1haW4uYywgcmVtb3RlLmMsIHNvdXJjZS5jLCB2YWxvcHMuYzoKKwlJbXByb3ZlbWVudHMgZm9yIHRoZSBoYW5kbGluZyBvZiB0aGUgaTM4NiBhbmQgb3RoZXIgbWFjaGluZXMKKwlydW5uaW5nIFVTRy4gIChTZXZlcmFsIG9mIHRoZXNlIGZpbGVzIGp1c3QgbmVlZGVkIGV4dHJhIGhlYWRlciBmaWxlcworCXN1Y2ggYXMgdHlwZXMuaC4pIHV0aWxzLmM6IGFkZGVkIGJjb3B5LCBiY21wLCBiemVybywgZ2V0d2QsIGxpc3QKKwlvZiBzaWduYWxzLCBhbmQgcXVldWUgcm91dGluZXMgZm9yIFVTRyBzeXN0ZW1zLiAgQWRkZWQgdmZvcmsgbWFjcm8KKwl0byBpMzg2CisKKwkqIHByaW50Y21kLmMsIGJyZWFrcG9pbnQuYzogTmV3IGNvbW1hbmRzIHRvIGVuYWJsZS9kaXNhYmxlCisJYXV0by1kaXNwbGF5cy4gIEFsc28gYGRlbGV0ZSBkaXNwbGF5IGRpc3BsYXludW1iZXInIHdvcmtzIGxpa2UKKwlgdW5kaXNwbGF5IGRpc3BsYXludW1iZXInLgorCitUdWUgSnVsIDE5IDAyOjE3OjE4IDE5ODggIFBldGVyIFRlck1hYXQgIChwZXRlIGF0IGNvcm4tY2hleC5haS5taXQuZWR1KQorCisJKiBjb2ZmcmVhZC5jOiAoY29mZl9sb29rdXBfdHlwZSkgIFdyb25nIHBvcnRpb24gb2YgdHlwZV92ZWN0b3Igd2FzCisJYmVpbmcgYnplcm8nZCBhZnRlciB0eXBlX3ZlY3RvciB3YXMgcmVhbGxvY2F0ZWQuCisKKwkqIHByaW50Y21kLmM6IChkZWxldGVfZGlzcGxheSkgQ2hlY2sgZm9yIGEgZGlzcGxheSBjaGFpbiBiZWZvcmUKKwlhdHRlbXB0aW5nIHRvIGRlbGV0ZSBhIGRpc3BsYXkuCisKKwkqIGNvcmUuYywgKi1kZXAuYyAoKi1pbmZkZXAgbW92ZWQgdG8gKi1kZXApOiBtYWNoaW5lLWRlcGVuZGVudAorCXBhcnRzIG9mIGNvcmUuYyAoY29yZV9maWxlX2NvbW1hbmQsIGV4ZWNfZmlsZV9jb21tYW5kKSBtb3ZlZCB0bworCSotZGVwLmMuIAorCitNb24gSnVsIDE4IDE5OjQ1OjUxIDE5ODggIFBldGVyIFRlck1hYXQgIChwZXRlIGF0IGNvcm4tY2hleC5haS5taXQuZWR1KQorCisJKiBkYnhyZWFkLmM6IHR5cG8gaW4gcmVhZF9zdHJ1Y3RfdHlwZSAobWlzc2luZyAnPScpIHdhcyBjYXVzaW5nIGEKKwlDIHN0cnVjdCB0byBiZSBwYXJzZWQgYXMgYSBDKysgc3RydWN0LCByZXN1bHRpbmcgaW4gYSBgaW52YWxpZAorCWNoYXJhY3RlcicgbWVzc2FnZS4KKworU3VuIEp1bCAxNyAyMjoyNzozMiAxOTg4ICBQZXRlciBUZXJNYWF0ICAocGV0ZSBhdCBjb3JuLWNoZXguYWkubWl0LmVkdSkKKworCSogcHJpbnRjbWQuYywgc3ltdGFiLmMsIHZhbG9wcy5jLCBleHByZWFkLnk6IFdoZW4gYW4gZXhwcmVzc2lvbiBpcworCXJlYWQsIHRoZSBpbm5lcm1vc3QgYmxvY2sgcmVxdWlyZWQgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gaXMKKwlzYXZlZCBpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlIGBpbm5lcm1vc3RfYmxvY2snLiAgVGhpcyBpbmZvcm1hdGlvbgorCWlzIHNhdmVkIGluIHRoZSBgYmxvY2snIGZpZWxkIG9mIGFuIGF1dG8tZGlzcGxheSBzbyB0aGF0CisJZXhwcmVzc2lvbnMgd2l0aCBpbmFjdGl2ZSB2YXJpYWJsZXMgY2FuIGJlIHNraXBwZWQuICBgaW5mbyBkaXNwbGF5JworCXRlbGxzIHRoZSB1c2VyIHdoaWNoIGRpc3BsYXlzIGFyZSBhY3RpdmUgYW5kIHdoaWNoIGFyZSBub3QuICBOZXcKKwlmbiBgY29udGFpbmVkX2luJyByZXR1cm5zIG5vbnplcm8gaWYgb25lIGJsb2NrIGlzIGNvbnRhaW5lZCB3aXRoaW4KKwlhbm90aGVyLiAKKworRnJpIEp1bCAxNSAwMTo1MzoxNCAxOTg4ICBQZXRlciBUZXJNYWF0ICAocGV0ZSBhdCBjb3JuLWNoZXguYWkubWl0LmVkdSkKKworCSogaW5mcnVuLmMsIG0taTM4Ni5oOiBVc2UgbWFjcm8gVFJBUFNfRVhQRUNURUQgdG8gc2V0IG51bWJlciBvZgorCXRyYXBzIHRvIHNraXAgd2hlbiBzaCBleGVjcyB0aGUgcHJvZ3JhbS4gIERlZmF1bHQgaXMgMiwgbS1pMzg2LmgKKwlvdmVycmlkZXMgdGhpcyBhbmQgc2V0cyB0byA0LgorCisJKiBjb2ZmcmVhZC5jLCBpbmZydW4uYzogbWlub3IgY2hhbmdlcyBmb3IgdGhlIGkzODYuICBNYXkgYmUgYWJsZQorCXRvIGVsaW1pbmF0ZSB0aGVtIHdpdGggbW9yZSBnZW5lcmFsIGNvZGUuCisKKwkqIGRlZmF1bHQtaW5mZGVwLmM6ICNpZmRlZiBTWVNURU1WLCBpbmNsdWRlIGhlYWRlciBmaWxlIHR5cGVzLmguCisJQWxzbyBzd2l0Y2hlZCB0aGUgb3JkZXIgb2Ygc2lnbmFsLmggYW5kIHVzZXIuaCwgc2luY2UgU3lzdGVtIDUKKwlyZXF1aXJlcyBzaWduYWwuaCB0byBjb21lIGZpcnN0LgorCisJKiBjb3JlLmMgbWFpbi5jLCByZW1vdGUsYywgc291cmNlLmMsIGluZmxvdy5jOiAjaWZkZWYgU1lTVEVNViwKKwlpbmNsdWRlIHZhcmlvdXMgaGVhZGVyIGZpbGVzLiAgVXN1YWxseSB0eXBlcy5oIGFuZCBmY250bC5oLgorCisJKiB1dGlscy5jOiBhZGRlZCBxdWV1ZSByb3V0aW5lcyBuZWVkZWQgYnkgdGhlIGkzODYgKGFuZCBvdGhlciBzeXMKKwk1IG1hY2hpbmVzKS4KKworCSogc3lzNS5jLCByZWdleC5jLCByZWdleC5oOiBuZXcgZmlsZXMgZm9yIHN5cyA1IHN5c3RlbXMuICAoVGhlCisJcmVnZXggZmlsZXMgYXJlIHNpbXBseSBsaW5rcyB0byAvZ3AvZ251L2xpYi4pCisKK1RodSBKdWwgMTQgMDE6NDc6MTQgMTk4OCAgUGV0ZXIgVGVyTWFhdCAgKHBldGUgYXQgY29ybi1jaGV4LmFpLm1pdC5lZHUpCisKKwkqIGNvbmZpZy5nZGIsIFJFQURNRTogUHJvdmlkZSBhIGxpc3Qgb2Yga25vd24gbWFjaGluZXMgd2hlbiB1c2VyCisJZW50ZXJzIGFuIGludmFsaWQgbWFjaGluZS4gIE5ldyBzZWNvbmQgYXJnIGlzIG9wZXJhdGluZyBzeXN0ZW0sCisJY3VycmVudGx5IG9ubHkgdXNlZCB3aXRoIGBzdW5vczQnIG9yIGBvczQnLiBFbnRyeSBmb3IgaTM4NiBhZGRlZC4KKworCSogbmV3cy1pbmZkZXAuYzogbmV3IGZpbGUuCisKKwkqIG0tbmV3cy5oOiBuZXcgdmVyc2lvbiB3aGljaCBkZWFscyB3aXRoIG5ldyBidWdzIGluIG5ld3M4MDAncyBPUy4KKworVHVlIEp1bCAxMiAxOTo1MjoxNiAxOTg4ICBQZXRlciBUZXJNYWF0ICAocGV0ZSBhdCBjb3JuLWNoZXguYWkubWl0LmVkdSkKKworCSogTWFrZWZpbGUsICouYywgbXVuY2gsIGNvbmZpZy5nZGIsIFJFQURNRTogTmV3IGluaXRpYWxpemF0aW9uCisJc2NoZW1lIHVzZXMgbm0gdG8gZmluZCBmdW5jdGlvbnMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aAorCWBfaW5pdGlhbGl6ZV8nLiAgRmlsZXMgYGluaXRpYWxpemUuaCcsIGBmaXJzdGZpbGUuYycsCisJYGxhc3RmaWxlLmMnLCBgbS0qaW5pdC5oJyBubyBsb25nZXIgbmVlZGVkLiAKKworCSogZXZhbC5jLCBzeW10YWIuYywgdmFsYXJpdGguYywgdmFsb3BzLmMsIHZhbHVlLmgsIHZhbHVlcy5jOiBCdWcKKwlmaXhlcyBmcm9tIGdkYisgMi41LjQuICBldmFsdWF0ZV9zdWJleHAgdGFrZXMgYSBuZXcgYXJnLCB0eXBlCisJZXhwZWN0ZWQuIE5ldyBmbiB2YWx1ZV92aXJ0dWFsX2ZuX2ZpZWxkLgorCitNb24gSnVsIDExIDAwOjQ4OjQ5IDE5ODggIFBldGVyIFRlck1hYXQgIChwZXRlIGF0IGNvcm4tY2hleC5haS5taXQuZWR1KQorCisJKiBjb3JlLmMgKHJlYWRfbWVtb3J5KTogeGZlcl9jb3JlX2ZpbGUgd2FzIGJlaW5nIGNhbGxlZCB3aXRoIGFuCisJZXh0cmEgYXJndW1lbnQgKDApIGJ5IHJlYWRfbWVtb3J5LgorCisJKiBjb3JlLmMgKHJlYWRfbWVtb3J5KSwgKi1pbmZkZXAuYyAocmVhZF9pbmZlcmlvcl9tZW1vcnkpLAorCXZhbG9wcy5jICh2YWx1ZV9hdCk6IHJlYWRfbWVtb3J5IGFuZCByZWFkX2luZmVyaW9yX21lbW9yeSBub3cgd29yaworCWxpa2Ugd3JpdGVfbWVtb3J5IGFuZCB3cml0ZV9pbmZlcmlvcl9tZW1vcnkgaW4gdGhhdCBlcnJubyBpcworCWNoZWNrZWQgYWZ0ZXIgZWFjaCBwdHJhY2UgYW5kIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuICBVc2VkIGluCisJdmFsdWVfYXQgdG8gZGV0ZWN0IHJlZmVyZW5jZXMgdG8gYWRkcmVzc2VzIHdoaWNoIGFyZSBvdXQgb2YKKwlib3VuZHMuICBBbHNvIGNvcmUuYyAoeGZlcl9jb3JlX2ZpbGUpOiByZXR1cm4gMSBpZiBpbnZhbGlkCisJYWRkcmVzcywgMCBvdGhlcndpc2UuCisKKwkqIGluZmxvdy5jLCA8bWFjaGluZT4taW5mZGVwLmM6IHJlbW92ZWQgYWxsIGNhbGxzIHRvIHB0cmFjZSBmcm9tCisJaW5mbG93LmMgYW5kIHB1dCB0aGVtIGluIG1hY2hpbmUtZGVwZW5kZW50IGZpbGVzICotaW5mZGVwLmMuCisKK1N1biBKdWwgMTAgMTk6MTk6MzYgMTk4OCAgUGV0ZXIgVGVyTWFhdCAgKHBldGUgYXQgY29ybi1jaGV4LmFpLm1pdC5lZHUpCisKKwkqIHN5bW1pc2MuYzogKHJlYWRfc3ltc2VncykgQWNjZXB0IG9ubHkgZm9ybWF0IG51bWJlciAyLiAgU2luY2UKKwl0aGUgc2l6ZSBvZiB0aGUgdHlwZSBzdHJ1Y3R1cmUgY2hhbmdlZCB3aGVuIEMrKyBzdXBwb3J0IHdhcyBhZGRlZCwKKwlmb3JtYXQgMSBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQuCisKKwkqIGNvcmUuYywgbS1zdW5vczQuaDogKGNvcmVfZmlsZV9jb21tYW5kKSBzdXBwb3J0IGZvciBTdW5PUyA0LjAuCisJU2xpZ2h0IGNoYW5nZSBpbiB0aGUgY29yZSBzdHJ1Y3R1cmUuICAjaWZkZWYgU1VOT1M0LiAgTmV3IGZpbGUKKwltLXN1bm9zNC5oLiAgTWF5IHdhbnQgdG8gY2hhbmdlIGNvbmZpZy5nZGIgYWxzby4KKworRnJpIEp1bCAgOCAxOTo1OTo0OSAxOTg4ICBQZXRlciBUZXJNYWF0ICAocGV0ZSBhdCBjb3JuLWNoZXguYWkubWl0LmVkdSkKKworCSogYnJlYWtwb2ludC5jOiAoYnJlYWtfY29tbWFuZF8xKSBBbGxvdyBgYnJlYWsgaWYgY29uZGl0aW9uJworCXJhdGhlciB0aGFuIHBhcnNpbmcgYGlmJyBhcyBhIGZ1bmN0aW9uIG5hbWUgYW5kIHJldHVybmluZyBhbgorCWVycm9yLgorCitUaHUgSnVsICA3IDIyOjIyOjQ3IDE5ODggIFBldGVyIFRlck1hYXQgIChwZXRlIGF0IGNvcm4tY2hleC5haS5taXQuZWR1KQorCisJKiBDKys6IHZhbG9wcy5jLCB2YWxwcmludC5jLCB2YWx1ZS5oLCB2YWx1ZXMuYzogbWVyZ2VkIGNvZGUgdG8gZGVhbAorCXdpdGggQysrIGV4cHJlc3Npb25zLgorCitXZWQgSnVsICA2IDAzOjI4OjE4IDE5ODggIFBldGVyIFRlck1hYXQgIChwZXRlIGF0IGNvcm4tY2hleC5haS5taXQuZWR1KQorCisgICAgICAgICogQysrOiBkYnhyZWFkLmM6IChyZWFkX2RieF9zeW10YWIsIGNvbmRlbnNlX21pc2NfYnVuY2hlcywKKwlhZGRfZmlsZV9jb21tYW5kKSAgTWVyZ2VkIGNvZGUgdG8gcmVhZCBzeW1ib2wgaW5mb3JtYXRpb24gZnJvbQorCWFuIGluY3JlbWVudGFsbHkgbGlua2VkIGZpbGUuICBzeW1taXNjLmM6CisJKGluaXRfZnJlZV9pbmNsaW5rX3N5bXRhYnMsIGZyZWVfaW5jbGlua19zeW10YWJzKSBDbGVhbnVwCisJcm91dGluZXMuCisKK1R1ZSBKdWwgIDUgMDI6NTA6NDEgMTk4OCAgUGV0ZXIgVGVyTWFhdCAgKHBldGUgYXQgY29ybi1jaGV4LmFpLm1pdC5lZHUpCisKKwkqIEMrKzogc3ltdGFiLmMsIGJyZWFrcG9pbnQuYywgc291cmNlLmM6ICBNZXJnZWQgY29kZSB0byBkZWFsIHdpdGgKKwlhbWJpZ3VvdXMgbGluZSBzcGVjaWZpY2F0aW9ucy4gIEluIEMrKyBvbmUgY2FuIGhhdmUgb3ZlcmxvYWRlZAorCWZ1bmN0aW9uIG5hbWVzLCBzbyB0aGF0IGBsaXN0IGNsYXNzbmFtZTo6b3ZlcmxvYWRlZGZ1bmNuYW1lJworCXJlZmVycyB0byBzZXZlcmFsIGRpZmZlcmVudCBsaW5lcywgcG9zc2libHkgaW4gZGlmZmVyZW50IGZpbGVzLgorCitGcmkgSnVsICAxIDAyOjQ0OjIwIDE5ODggIFBldGVyIFRlck1hYXQgIChwZXRlIGF0IGNvcm4tY2hleC5haS5taXQuZWR1KQorCisJKiBDKys6IHN5bXRhYi5jOiByZXBsYWNlZCBsb29rdXBfc3ltdGFiXzEgYW5kIGxvb2t1cF9zeW10YWJfMiB3aXRoCisJYSBtb2RpZmllZCBsb29rdXBfc3ltYm9sIHdoaWNoIGNoZWNrcyBmb3IgZmllbGRzIG9mIHRoZSBjdXJyZW50CisJaW1wbGllZCBhcmd1bWVudCBgdGhpcycuICBwcmludGNtZC5jLCBzb3VyY2UuYywgc3ltdGFiLmMsCisJdmFsb3BzLmM6IE5lZWQgdG8gY2hhbmdlIGNhbGxlcnMgb25jZSBjYWxsZXJzIGFyZQorCWluc3RhbGxlZC4gCisKK1dlZCBKdW4gMjkgMDE6MjY6NTYgMTk4OCAgUGV0ZXIgVGVyTWFhdCAgKHBldGUgYXQgZnJvc3RlZC1mbGFrZXMuYWkubWl0LmVkdSkKKworCSogQysrOiBldmFsLmMsIGV4cHByaW50LmMsIGV4cHJlYWQueSwgZXhwcmVzc2lvbi5oLCB2YWxhcml0aC5jLCAKKwlNZXJnZWQgY29kZSB0byBkZWFsIHdpdGggZXZhbHVhdGlvbiBvZiB1c2VyLWRlZmluZWQgb3BlcmF0b3JzLAorCW1lbWJlciBmdW5jdGlvbnMsIGFuZCB2aXJ0dWFsIGZ1bmN0aW9ucy4KKwliaW5vcF9tdXN0X2JlX3VzZXJfZGVmaW5lZCB0ZXN0cyBmb3IgdXNlci1kZWZpbmVkIGJpbm9wcywgCisJdmFsdWVfeF9iaW5vcCBjYWxscyB0aGUgYXBwcm9wcmlhdGUgb3BlcmF0b3IgZnVuY3Rpb24uIAorCitUdWUgSnVuIDI4IDAyOjU2OjQyIDE5ODggIFBldGVyIFRlck1hYXQgIChwZXRlIGF0IGZyb3N0ZWQtZmxha2VzLmFpLm1pdC5lZHUpCisKKwkqIEMrKzogTWFrZWZpbGU6IGNoYW5nZWQgdGhlIGVjaG86IGV4cGVjdCAxMDEgc2hpZnQvcmVkdWNlIGNvbmZsaWN0cyAKKwlhbmQgMSByZWR1Y2UvcmVkdWNlIGNvbmZsaWN0LgorDAorTG9jYWwgVmFyaWFibGVzOgorbW9kZTogaW5kZW50ZWQtdGV4dAorbGVmdC1tYXJnaW46IDgKK2ZpbGwtY29sdW1uOiA3NAordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvZ2RiL0NoYW5nZUxvZy05MDkxIGIvZ2RiL0NoYW5nZUxvZy05MDkxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZjhkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvQ2hhbmdlTG9nLTkwOTEKQEAgLTAsMCArMSw4MzIyIEBACitNb24gRGVjIDMwIDEwOjU3OjAyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJTWFpbmx5IHN0dWZmIHRvIGltcHJvdmUgaGFuZGxpbmcgb2YgVFlQRV9DT0RFX1JFRiB2YWx1ZXMuCisJKiB2YWxvcHMuYyAodmFsdWVfYWRkcik6ICBJZiB0YWtpbmcgdGhlIGFkZHJlcyBvZiBhCisJVFlQRV9DT0RFX1JFRiwganVzdCBjYXN0IHRoZSBvYmplY3QgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKwlUWVBFX0NPREVfUFRSLiAgVGhpcyB5aWVsZHMgY29ycmVjdCBDKysgc2VtYW50aWNzLCBhbmQKKwlwcmVzZXJ2ZXMgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uLCB3aGljaCBoYXMgdGhlIG5pY2UgZWZmZWN0CisJdGhhdCAmKCZSKSBnaXZlbiB0aGUgbG9jYXRpb24gY29udGFpbmluZyBSLgorCSogdmFsdWVzLmMgKHZhbHVlX2NvcHkpOiAgTWFrZSBub24tc3RhdGljICh1c2VkIGJ5IHZhbHVlX2FkZHIpLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHBfZm9yX2FkZHJlc3MpOiAgVXNlIHRoZSBkZWZhdWx0CisJc2NoZW1lICh3aXRoIHZhbHVlX2FkZHIpIGZvciBhIHZhcmlhYmxlIGlmIGl0IGhhcyBUWVBFX0NPREVfUkVGLgorCSogdmFsb3BzLmMgKHZhbHVlX2FkZHIpLCBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cF9mb3JfYWRkcmVzcywKKwlldmFsdWF0ZV9zdWJleHBfd2l0aF9jb2VyY2lvbik6ICBGYWN0b3Igb3V0IHNvbWUgY29tbW9uCisJZXhwcmVzc2lvbnMgaW50byB2YXJpYWJsZXMsIGZvciBlYXNpZXIgcmVhZGluZy4KKwkqIGZpbmR2YXIuYyAobG9jYXRlX3Zhcl92YWx1ZSk6ICBSZW1vdmUgY29kZSB0byBoYW5kbGUKKwlUWVBFX0NPREVfUkVGIC0gaXQgc2hvdWxkIG5vIGxvbmdlciBiZSBuZWVkZWQuCisJKiB2YWxvcHMuYyAodmFsdWVfYXNzaWduKTogIERvIGEgQ09FUkNFX1JFRiBvbiB0aGUKKwlkZXN0aW5hdGlvbiBvcGVyYW5kLCBmb3IgY29ycmVjdCBDKysgc2VtYW50aWNzLgorCSogdmFsYXJpdGguYyAodmFsdWVfeF9iaW5vcCk6ICBEaXR0bzogIERlLXJlZmVyZW5jZSBDKysKKwlyZWZlcmVuY2VzIGluIHRoZSBhcmd1bWVudHMuCisJKiB2YWxvcHMuYzogIEFOU0ktZnk6IGJjb3B5LT5tZW1jcHksIGJ6ZXJvLT5tZW1zZXQuCisKK1NhdCBEZWMgMjggMTE6MzA6MjYgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIGR3YXJmcmVhZC5jLCBjb2ZmcmVhZC5jOiAgVXNlIElOSVRfQ1BMVVNfU1BFQ0lGSUMuCisJKiBzeW10YWIuYyAoZ2RiX21hbmdsZV9uYW1lKTogIFJlY29nbml6ZSBhbmQgaGFuZGxlCisJY29uc3RydWN0b3JzIHNwZWNpYWxseS4KKwkqIHN5bXRhYi5jIChjaGVja19zdHViX21ldGhvZCk6ICBUZXN0IGZvciBmYWlsdXJlIGZyb20KKwljcGx1cy1kZW1hbmdsZSBieSBjYWxsaW5nIGVycm9yKCkgaW5zdGVhZCBvZiBzZWctZmF1bHRpbmcgLi4uCisKK0ZyaSBEZWMgMjcgMjI6MjE6MzAgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIGRlZnMuaDogIEFkZCBkZWZpbml0aW9uIG9mIG51bGxfY2xlYW51cCgpCisKKwkqIHByb2Nmcy5jOiAgTWFueSBzbWFsbCBjaGFuZ2VzIHRvIGFkZCBiYXNlIHN1cHBvcnQgZm9yIGEgbmV3CisJImluZm8gcHJvYyIgY29tbWFuZCAoY3VycmVudGx5IG9ubHkgcHJpbnRpbmcgb2YgdGhlIGFkZHJlc3MKKwlzcGFjZSBtYXBwaW5nIGlzIGltcGxlbWVudGVkKSBhbmQgYWxsb3cgaXRlcmF0aW9uIG92ZXIgdGhlCisJYWRkcmVzcyBzcGFjZSBtYXBwaW5nLCBjYWxsaW5nIGFuIGFyYml0cmFyeSBmdW5jdGlvbiBmb3IgZWFjaAorCW1hcHBpbmcgKHVzZWQgZm9yIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQpLgorCisJKiBzb2xpYi5jOiAgQ2hhbmdlIGFsbCBpZmRlZnMgdGhhdCBjaGVja2VkIGZvciAic3VuIiB0byBjaGVjaworCWZvciAiIVNWUjRfU0hBUkVEX0xJQlMiIGluc3RlYWQuICBSZXdyaXRlIGxvb2t1cF9iYXNlKCkgdG8KKwloYW5kbGUgbG9jYXRpbmcgdGhlIGRlYnVnIGJhc2UgYWRkcmVzcyBldmVuIHdoZW4gbm90IGN1cnJlbnRseQorCXN0b3BwZWQgYXQgdGhlIGR5bmFtaWMgbGlua2VyIGVudHJ5IHBvaW50LgorCisJKiB1dGlscy5jOiAgQWRkIG51bGxfY2xlYW51cCgpIGFzIGEga25vd24gZnVuY3Rpb24gdGhhdCBkb2VzCisJbm90aGluZyB0byBzZXJ2ZSBhcyBhIGJhc2UgZm9yIHBvc3NpYmx5IGxvbmcgY2xlYW51cCBjaGFpbnMKKwl3aXRoIG5vIHNwZWNpZmljICJmaXJzdCBjbGVhbnVwIiB0byBzZXJ2ZSBhcyBhbiBhbmNob3IuCisKKwkqIHhtLXN5c3Y0Lmg6ICBBZGQgZGVmaW5lIG9mIFNWUjRfU0hBUkVEX0xJQlMKKworRnJpIERlYyAyNyAxMDoxMTozMyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogYXJtLW9wY29kZS5oLCBtODhrLW9wY29kZS5oLCBwbi1vcGNvZGUuaCwgbnAxLW9wY29kZS5oLAorCXB5ci1vcGNvZGUuaCwgdGFob2Utb3Bjb2RlLCB2YXgtb3Bjb2RlLmg6ICBSZW1vdmVkIC0KKwl0aGVzZSBhcmUgYWxsIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIHRoZSB2ZXJzaW9ucworCWluIC4uL2luY2x1ZGUvb3Bjb2RlLiAgVGhlIHJlbWFpbmluZyAqLW9wY29kZS5oIGhlcmUKKwlhcmUgbm90IHF1aXRlIHNvIG9idmlvdXNseSB0aGUgc2FtZSwgYW5kIG5lZWQgc3R1ZHkuCisJKiBhcm0tcGluc24uYywgZ291bGQtcGluc24uYywgbTg4ay1waW5zbi5jLCBweXItcGluc24uYywKKwl0YWhvZS1waW5zbi5jLCB2YXgtcGluc24uYzogIENoYW5nZSBzbyB0aGVzZSBpbmNsdWRlCisJb3Bjb2RlL0ZPTy5oIChhY3R1YWxseSAuLi9pbmNsdWRlL29wY29kZS9GT08uaCkKKwlpbnN0ZWFkIG9mIHRoZSByZWNlbm50bHkgZGVwYXJ0ZWQgb3Bjb2RlLUZPTy5oIGZpbGVzLgorCSogc3BhcmMtcGluc24uYzogIE5vdyB0aGF0IHdlJ3JlIHVzaW5nIHRoZSBtdWNoIHRpZ2h0ZXIKKwlvcGNvZGUgdGFibGUgaW4gLi4vaW5jbHVkZS9vcGNvZGUvc3BhcmMuaCwgd2Ugc2hvdWxkbid0CisJbmVlZCB0byBzb3J0IHRoZSBvcGNvZGVzIGJlZm9yZSBkaXMtYXNzZW1ibHkuCisKKwkqIHN5bXRhYi5oLCBzeW1taXNjLmM6ICBNYWtlIGNwbHVzX3N0cnVjdF9kZWZhdWx0IGJlIGNvbnN0LgorCSogc3ltdGFiLmgsIGJ1aWxkc3ltLmM6ICBBZGQgYW5kIHVzZSBJTklUX0NQTFVTX1NQRUNJRklDIG1hY3JvLgorCSogc3ltbWlzYy5jOiAgUmVtb3ZlIHVudXNlZCAnbmZpZWxkcycgdmFyaWFibGUuCisJKiBidWlsZHN5bS5oOiAgQWRkIGV4dGVybiBkZWNsIG9mIHVua25vd25fc3ltdHlwZV9jb21wbGFpbnQsCisJc2luY2UgaXQgdXNlZCB1c2VkIGJ5IHBhcnRpYWwtc3RhYi5oIChpbmNsdWRlZCB0d28gcGxhY2VzKS4KKwkqIHBhcnRpYWwtc3RhYi5oOiAgUmUtYXJyYW5nZSBEQlhSRUFEX09OTFkgI2lmZGVmcyBzbyB0aGF0CisJd2Ugc2hvdWxkIG5ldmVyIGhpdCB0aGUgZGVmYXVsdCBjYXNlICh1bnRpbCBuZXcgc3RhYiBjb2RlcworCWFyZSBhZGRlZCkuICBIZW5jZSwgd2UgY2FuIGxlYXZlIHRoZSBjb21wbGFpbnQgaW4gdGhlCisJZGVmYXVsdCBjYXNlIGluIGV2ZW4gd2hlbiBEQlhSRUFEX09OTFkgaXMgb2ZmLgorCSogcGFydGlhbF9zdGFiLmg6IFJlY29nbml6ZSBhIHBhaXIgb2YgTl9TTyBzdGFicyAob25lIGZvciB0aGUKKwlkaXJlY3RvcnksIG9uZSBmb3IgdGhlIGZpbGVuYW1lIHByb3Blcikgd2l0aG91dCBwZWVraW5nIGFoZWFkLgorCSogZGJ4cmVhZC5jLCBtaXBzcmVhZC5jOiBCZWNhdXNlIG9mIHByZXZpb3VzIGNoYW5nZSwgZG9uJ3QgbmVlZAorCXVnbHkgQ0hFQ0tfU0VDT05EX05fU08gbWFjcm8uCisJKiBidWlsZHN5bS5oLCBkYnhyZWFkLmMsIG1pcHNyZWFkLmM6ICBNYWtlIG5leHRfc3ltYm9sX3RleHQgYQorCW1hY3JvIHRoYXQgaW52b2tlcyBhIGZ1bmN0aW9uIHBvaW50ZXIgaW4gbmV4dF9zeW1ib2xfdGV4dF9mdW5jLgorCSogbWlwc3JlYWQuYzogIEFkZGVkIGNvbW1lbnRzIHZhcmlvdXMgcGxhY2VzIHRvCisJZXhwbGFpbiB3aGF0IGlzIGdvaW5nIG9uLgorCSogbWlwc3JlYWQuYyAocGFyc2Vfc3ltYm9sKTogIFN1cHBvcnQgdGhlIG5ldyAoU0dJLXNwZWNpZmljPykKKwlzeW1ib2wgdHlwZXMgc3RTdHJ1Y3QsIHN0VW5pb24sIGFuZCBzdEVudW0uCisJQWxzbywgc29tZSBmaXhlcyBpbiB0aGUgY29kZSBmb3IgZGVhbGluZyB3aXRoIHRhZ3MuCisJKiBtaXBzcmVhZC5jOiAgQ2hhbmdlIGhhbmRsaW5nIG9mIHN0YXJ0dXBfZmlsZV9zdGFydCBhbmQgX2VuZAorCS0gbm93IGp1c3QgdXNlIHRoZSB0ZXh0bG93IGFuZCB0ZXhoaWdoIG9mIGEgcHN5bXRhYgorCXRvIGNoZWNrIGlmIHdlJ3ZlIGZvdW5kIHRoZSBzdGFydHVwLWZpbGUuCisJKiBtaXBzcmVhZC5jOiAgUmVwbGFjZSBzX2lkeCBieSBnbG9iYWwgY3VyX3NkeCBpbiBtYW55IHBsYWNlcy4KKwlUaGlzIGlzIHNvIG1pcHNfbmV4dF9zeW1ib2xfdGV4dCBjYW4gZ2V0IGF0IGl0LgorCitUaHUgRGVjIDI2IDE5OjUyOjAxIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBkYnhyZWFkLmMsIHN5bW1pc2MuYzogIE1vdmUgYWRkX3BzeW1ib2xfdG9fcGxpc3QoKSBmcm9tCisJZGJ4cmVhZC5jIHRvIHN5bW1pc2MgYW5kIGNoYW5nZSBuYW1lIHRvIGFkZF9wc3ltYm9sX3RvX2xpc3QuCisJRGl0dG8gZm9yIGFkZF9wc3ltYm9sX2FkZHJfdG9fcGxpc3QoKS4gIEFsc28gZXhwYW5kIHRoZWlyCisJYm9keSB0byBub3QgdXNlIEFERF9QU1lNQk9MX1ZUX1RPX0xJU1QuCisKKwkqIGR3YXJmcmVhZC5jOiAgUmVtb3ZlIGFkZF9wc3ltYm9sX3RvX2xpc3QoKSBhbmQgY29udmVydCB1c2FnZXMKKwl0byB0aGUgQUREX1BTWU1CT0xfVE9fTElTVCBtYWNyby4KKworCSogaWVlZS1mbG9hdC5jOiAgQ2hhbmdlICIjaWZkZWYgREVCVUciIHRvICIjaWZkZWYgSUVFRV9ERUJVRyIKKwl0byBhdm9pZCBjb2xsaXNpb24gd2l0aCB0aGUgREVCVUcgZm9yIEFERF9QU1lNQk9MX1ZUX1RPX0xJU1QuCisKKwkqIHBhcnRpYWwtc3RhYi5oLCBzeW1maWxlLmg6ICBNb3ZlIGRlZmluaXRpb25zIG9mIHRoZSBtYWNyb3MKKwlBRERfUFNZTUJPTF9UT19MSVNUIGFuZCBBRERfUFNZTUJPTF9BRERSX1RPX0xJU1QgZnJvbQorCXBhcnRpYWwtc3RhYi5oIHRvIHN5bWZpbGUuaC4gIFRoZXkgYXJlbid0IHN0YWIgc3BlY2lmaWMuCisJQ2hhbmdlIEFERF9QU1lNQk9MX1ZUX1RPX0xJU1QgdG8gdXNlIG1lbWNweSByYXRoZXIgdGhhbiBzdHJuY3B5LgorCitUdWUgRGVjIDI0IDExOjM4OjA4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIFJvbGwgVkVSU0lPTiB0byA0LjMuMi4KKworTW9uIERlYyAyMyAxMzo1NDozNSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogbTY4ay1vcGNvZGUuaCwgbWlwcy1vcGNvZGUuaCwgc3BhcmMtb3Bjb2RlLmg6ICBEZWxldGVkLgorCSogbTY4ay1waW5zbi5jLCBtaXBzLXBpbnNuLmMsIHNwYXJjLXBpbnNuLmM6CisJSW5jbHVkZSA8b3Bjb2RlL0ZPTy5oPiBpbnN0ZWFkIG9mIDxGT08tb3Bjb2RlLmg+LgorCisJKiBzeW10YWIuaCwgc3ltdGFiLmMsIGNvZmZyZWFkLmMsIGR3YXJmcmVhZC5jLCBzeW1taXNjLmMsCisJZGJ4cmVhZC5jOiAgVGhlIFRZUEVfQ1BMVVNfU1BFQ0lGSUMgc3RydWN0dXJlIGlzIG5vdyBvbmx5CisJYWxsb2NhdGVkIHdoZW4gaXQgaXMgbmVlZGVkLiAgVW50aWwgaXQgaXMgbmVlZGVkLCBpdCBwb2ludHMKKwl0byBhIHNoYXJlZCBzdGF0aWNhbGx5IGFsbG9jYXRlZCBzdHJ1Y3R1cmUuCisKKwkqIGJ1aWxkc3ltLmgsIGJ1aWxkc3ltLmMsIGRieHJlYWQuYzogUmVtb3ZlIHRoZSBrbHVkZ3kgY29kZQorCWluIHJlYWRfb2ZpbGVfc3ltdGFiIHRvIHJlY29nbml6ZSB0d28gaW5pdGlhbCBOX1NPIHN0YWJzLAorCWFuZCBsZXQgcHJvY2Vzc19vbl9zeW1ib2wgaGFuZGxlIGl0LiAgVGhpcyBpcyBjbGVhbmVyLCBtb3JlCisJZWZmaWNpZW50LCBhbmQgbGV0cyBtaXBzcmVhZC5jIHNoYXJlIHRoZSBzYW1lIGNvZGUuCisKKwkqIHN5bWZpbGUuaCwgcGFydGlhbC1zdGFiLmg6ICBNb3ZlIEFERF9QU1lNQk9MX1ZUX1RPX0xJU1QKKwlhbmQgcmVsYXRlZCBtYWNyb3MgdG8gaGVyZSAuLi4KKwkqIGRieHJlYWQuYzogLi4uIGZyb20gaGVyZS4KKwkqIHN5bW1pc2MuYzogIE1vdmUgdGhlICJvdmVyZmxvdyIgaGFuZGxpbmcgZnJvbQorCUFERF9QU1lNQk9MX1ZUX1RPX0xJU1QgbWFjcm8gaW50byBuZXcgZnVuY3Rpb24gZXh0ZW5kX3BzeW1ib2xfbGlzdC4KKwkqIGR3YXJmcmVhZC5jOiAgUmUtd3JpdGUgYWRkX3BzeW1ib2xfdG9fbGlzdCB0byB1c2UKKwlBRERfUFNZTUJPTF9WVF9UT19MSVNUIG1hY3JvLgorCisJKiBtaXBzcmVhZC5jOiBFeHRlbmQgbWlwc3JlYWQuYyB0byBoYW5kbGUgc3RhYnMtc3R5bGUgc3ltYm9scworCWVuY2Fwc3VsYXRlZCBpbiBlY29mZiBzeW1ib2xzLiAgVGhpcyBlbmFibGUgZnVsbCBnKysgZGVidWdnaW5nLiAgCisJKiBwYXJ0aWFsLXN0YWIuaDogIE1vdmUgdGhlIGNvZGUgZm9yIHByZS1zY2FubmluZyBzeW1ib2xzCisJYW5kIGJ1aWxkaW5nIHBzeW10YWJzIHRvIGFuIGluY2x1ZGUgZmlsZSwgb3V0IGZyb20gZGJ4cmVhZC5jLgorCVRoaXMgd2F5LCB0aGUgc2FtZSBjb2RlIGNhbiBhbHNvIGJlIHVzZWQgYnkgbWlwc3JlYWQuYy4KKwkqIGRieHJlYWQuYywgYnVpbGRzeW0uaDogIFZhcmlvdXMgY2hhbmdlcyB0byBhbGxvdyBzb21lIGZ1bmN0aW9ucworCXRvIGJlIHVzZWQgYnkgbWlwc3JlYWQuYyAoYWxzbyBzb21lIGFyZ3VhYmxlIHN0eWxpc3RpYyBjaGFuZ2VzKS4KKworCSogdG0tbWlwcy5oOiAgRGVmaW5lIEJMT0NLX0FERFJFU1NfQUJTT0xVVEUsIGF0IGxlYXN0IGZvciBub3csCisJc2luY2UgbWlwcy10ZmlsZSBwdXRzIHJlbG9jYXRhYmxlIGFkZHJlc3NlcyBpbnRvIExCUkFDL1JCUkFDCisJc3RhYnMuCisKKwkqIG1pcHNyZWFkLmM6ICBSZXBsYWNlIGNvZGUgdG8gaGFuZGxlIGFtYmlndW91cyB0YWcgYmxvY2tzLgorCUluc3RlYWQgb2YgYWxsb2NhdGluZyBhIFRZUEVfQ09ERV9VTkRFRiwgZ3Vlc3MgKGJ5IGxvb2tpbmcKKwlhdCB0eXBlcyBhbmQgb2Zmc2V0cykgaWYgYSB0YWcgaXMgYSBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtLgorCVN0aWxsIHBhdGNoIGl0IGxhdGVyIGlmIHdlIGZpbmQgb3V0IGZvciBzdXJlLgorCSogbWlwc3JlYWQuYzogIEluIHZhcmlvdXMgd2F5cywgcmVwbGFjZSBGb3JpbidzCisJaWRlby1zeW5jcmF0aWMgY29kZSBieSBjb2RlIHRoYXQgZml0cyBiZXR0ZXIgd2l0aCB0aGUKKwlyZXN0IG9mIGdkYiwgZm9yIGJvdGggc3RhYnMtYmFzZWQgYW5kIGVjb2ZmLWJhc2VkIHN5bXRhYnMuCisJRS5nLiAgdXNlIGVuZF9wc3ltdGFiOyBkb24ndCBkbyBleHRyYSBwYXNzZXMgb3ZlciBGRFIgdGFibGUgdG8KKwlwcmUtcGFydGl0aW9uIGdsb2JhbCBkYXRhOyBkb24ndCB1c2UgZXh0ZXJuYWwgc3ltYm9scyB0bworCWNyZWF0ZSBzdGF0aWMvZ2xvYmFsIHN5bWJvbHMgKGp1c3QgcHV0IHRoZW0gaW4gdGhlCisJbWlzY192ZWN0b3IpOyB1c2UgQUREX1BTWU1CT0xfVE9fTElTVCBtYWNybzsgZG9uJ3QKKwlzb3J0IHBzeW10YWJzIG9yIHN5bXRhYnM7IHVzZSBvYnN0YWNrcyBtb3JlLgorCisJKiBzeW10YWIuYywgbWlwc3JlYWQuYywgZGJ4cmVhZC5jLCBidWlsZHN5bS5jOgorCUFOU0lmeTogUmVwbGFjZSBiY29weSBieSBtZW1jcHksIGJ6ZXJvIGJ5IG1lbXNldC4KKworU3VuIERlYyAyMiAxOTozMTowNCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogc29saWIuYyAobG9jYXRlX2Jhc2UpOiAgRml4IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgdGhhdCB3YXMgCisJY2F1c2luZyByZXR1cm4gb2YgcmFuZG9tIHZhbHVlIHRvIGNhbGxlZS4KKworCSogY29uZmlnL21oLWFtaXgsIGNvbmZpZy9taC1pMzg2djQ6ICBDaGFuZ2UgdG8gZmluZCBhbGxvY2EgYnkKKwljb21waWxpbmcgYW5kIGxpbmtpbmcgYWxsb2NhLmMsIGV2ZW4gd2hlbiBpdCBpcyBub3Qgc3RyaWN0bHkKKwlyZXF1aXJlZC4gIEFsc28gYXJyYW5nZSB0byBsaW5rIHdpdGggLWx0ZXJtbGliIHJhdGhlciB0aGFuCisJLWx0ZXJtY2FwLgorCisJKiBNYWtlZmlsZS5pbjogIE1vdmUgVEVSTUNBUCBkZWZpbml0aW9uIHRvIHByaW9yIHRvIGluY2x1c2lvbgorCW9mIGhvc3QgbWFrZWZpbGUgZnJhZ21lbnRzIHNvIGl0IGNhbiBiZSBvdmVycmlkZGVuLgorCitGcmkgRGVjIDIwIDE2OjMzOjM5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiB4Y29mZnJlYWQuYyAocmVhZF9zeW1ib2xfbGluZW5vKTogIExvZ2ljIGVycm9yIGluIGluY3JlbWVudGluZworCXN5bWJvbCB0YWJsZSBlbnRyeSBudW1iZXIuICAoRnJvbSBNZXRpbiBPemlzaWsuKQorCitGcmkgRGVjIDIwIDExOjM2OjM4IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWcvbWgtaTM4NnY0OiAgQ2hhbmdlIFhNX0NMSUJTIHRvICItbGMgL3Vzci91Y2JsaWIvbGlidWNiLmEiCisJc28gY29tcGlsZXMgd2l0aCBuYXRpdmUgY29tcGlsZXJzICh3aXRob3V0IGJ1aWx0aW4gYWxsb2NhKSBjYW4KKwlwaWNrIHVwIHRoZSB2ZXJzaW9uIGZyb20gdGhlIGJzZCBlbXVsYXRpb24gbGlicmFyeS4gIEhvd2V2ZXIsIHdlCisJc2VhcmNoIHRoZSBzdGFuZGFyZCBDIGxpYnJhcnkgZmlyc3Qgc28gd2UgZG9uJ3QgcGljayB1cCBsb3RzIG9mCisJb3RoZXIgYnJva2VuIHN0dWZmIGZyb20gbGlidWNiLmEsIHRoYXQgd2UgKmRvbid0KiB3YW50LgorCisJKiBjb25maWd1cmUuaW4sIHRtLWFtaXguaCwgdG0taTM4NnY0LmgsIHhtLWFtaXguaCwgeG0taTM4NnY0Lmg6CisJQ2hhbmdlIHN2cjQgcmVmZXJlbmNlcyB0byBzeXN2NC4KKworCSogc291cmNlLmM6ICBNb3ZlIGRlY2xhcmF0aW9uIG9mIGV4dGVybmFsIGZ1bmN0aW9uIGluZGV4IHRvCisJZnJvbnQgb2YgZmlsZSBzbyBpdCBpcyBpbiBzY29wZSBmb3IgYWxsIHJlZmVyZW5jZXMuCisKKwkqIHV0aWxzLmMgKGVycm9yLCBmYXRhbCk6ICBNYWtlIGRlZmluaXRpb25zIGNvbnNpc3RlbnQgd2l0aAorCWRlZnMuaCBkZWNsYXJhdGlvbnMgKGRlY2xhcmVkIGFzICJ2b2xhdGlsZSB2b2lkIikuCisKK0ZyaSBEZWMgMjAgMTA6NTU6MzYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIHJzNmstb3Bjb2RlLmg6ICBCdWdmaXggc2ZlIGFuZCBzdGJyeC4gIEJ5IEFsIEtvc3Nvdy4KKworV2VkIERlYyAxOCAxNzowOTowNiAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBjb21tYW5kLmgsIGRlZnMuaCwgZXZhbC5oLCBleHByZXNzaW9uLmgsIHJlbW90ZS1zYS5zcGFyYy5jLAorCXNwYXJjLXRkZXAuYywgc3ltdGFiLmgsIHRhcmdldC5oLCB2YWx1ZS5oLCB2eC1zaGFyZS9wdHJhY2UuaCwKKwl2eC1zaGFyZS94ZHJfcHRyYWNlLmgsIHZ4LXNoYXJlL3hkcl9yZGIuaDogIEFOU0lmeSBlbnVtcy4KKworTW9uIERlYyAxNiAxMjozMTo0NiAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlnL210LWFtaXgsIGNvbmZpZy9tdC1pMzg2djQ6ICBBZGQgc29saWIubyB0byBUREVQRklMRVMKKwlmb3IgdGhlc2UgU1ZSNCBzeXN0ZW1zLgorCisJKiBzeW1maWxlLmMgKHN5bWJvbF9maWxlX2FkZCk6ICBXaGVuIHZlcmJvc2UgaXMgc2V0LCBwcmludAorCXRoZSBuYW1lcyBvZiBmaWxlcyBmcm9tIHdoaWNoIHN5bWJvbHMgYXJlIGJlaW5nIGxvYWRlZCwgYXMKKwl3aGVuIGZyb21fdHR5IGlzIHRydWUuCisKKwkqIHNvbGliLmM6ICBDb21wbGV0ZWx5IHJlb3JnYW5pemVkIChyZXdyaXR0ZW4pIHRvIHN1cHBvcnQKKwlTVlI0IHNoYXJlZCBsaWJyYXJpZXMgaW4gYSBtYW5uZXIgdmVyeSBjbG9zZSB0byB0aGUgb3JpZ2luYWwKKwlTdW5PUyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgc3VwcG9ydCBpcyBleHBlY3RlZCB0byBjaGFuZ2UgYW5kCisJYmVjb21lIG1vcmUgZ2VuZXJhbCBhdCBzb21lIGZ1dHVyZSB0aW1lLiAgVGhlIFNWUjQgdmVyc2lvbgorCWRvZXMgbm90IHlldCB3b3JrIGZvciBhdHRhY2hlZCBwcm9jZXNzZXMsIGZvciBleGFtcGxlLgorCisJKiBkd2FyZnJlYWQuYzogIEFycmFuZ2UgaW4gZHdhcmZfYnVpbGRfcHN5bXRhYnMoKSBmb3IgdGhlIAorCXJlbG9jYXRpb24gYWRkcmVzcyB0byBiZSB2YWxpZCB3aGV0aGVyIG9yIG5vdCBzeW1ib2xzIGFyZQorCWJlaW5nIHJlYWQgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5IG9yIGFuIGV4ZWN1dGFibGUuICBVc2UgdGhlCisJcmVsb2NhdGlvbiBhZGRyZXNzIHJlY29yZGVkIGluIHRoZSBwc3ltdGFiIHdoZW4gcmVhZGluZworCWZ1bGwgc3ltYm9sIHRhYmxlcyAoaW4gcmVhZF9vZmlsZV9zeW10YWIpLiAgRW5zdXJlIHRoYXQgdGhlCisJcmVsb2NhdGVkIGFkZHJlc3MgcmFuZ2VzIGFyZSByZWNvcmRlZCBpbiBwYXJ0aWFsIHN5bXRhYnMuCisKKwkqIGVsZnJlYWQuYzogIEFkZCBuZXcgZnVuY3Rpb24gZWxmX2ludGVycHJldGVyKCkgdG8gcmV0dXJuIHRoZQorCXN0cmluZyBmcm9tIHRoZSBFTEYgIi5pbnRlcnAiIHNlY3Rpb24uICBUaGlzIGlzIHRoZSBpbnRlcnByZXRlcgorCXRoYXQgdGhlIGtlcm5lbCB0cmllcyB0byBydW4gYW5kIGZlZWQgdGhlIGV4ZWN1dGFibGUgdG8uCisJRXhwYW5kIGFyZ3VtZW50cyB0byByZWNvcmRfbWlzY19mdW5jdGlvbiB0byBpbmNsdWRlIGEgdHlwZSBhcmcuCisJTW9kaWZ5IGVsZl9zeW10YWJfcmVhZCgpIHRvIHN1cHBseSB0aGUgdHlwZSBhcmcsIGFuZCB0byBkbyBzeW1ib2wKKwlyZWxvY2F0aW9ucyBmb3Igc3ltYm9scyByZWFkIGluIGZyb20gc2hhcmVkIGxpYnJhcmllcy4KKworCSogcHJvY2ZzLmM6ICBBZGQgbmV3IGZ1bmN0aW9ucyBwcm9jX2Jhc2VfYWRkcmVzcygpIGFuZAorCXByb2NfYWRkcmVzc190b19mZCgpLCB1c2VkIGJ5IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuCisKKwkqIHRtLXN2cjQuaDogIEFkZCBtYWNyb3MgdG8gc3VwcG9ydCBTVlI0IHNoYXJlZCBsaWJyYXJpZXMuCisJRGVmaW5pdGlvbnMgZm9yIFNPTElCX0FERCwgU09MSUJfQ1JFQVRFX0lORkVSSU9SX0hPT0ssCisJQ0xFQVJfU09MSUIsIGFuZCBESVNBQkxFX1VOU0VUVEFCTEVfQlJFQUsuCisKK0ZyaSBEZWMgMTMgMjA6MTE6MjYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGluZnJ1bi5jLCByZW1vdGUtZWIuYywgcmVtb3RlLW5pbmR5LmMsIHJlbW90ZS12eC5jOiAgUmVtb3ZlCisJdW51c2VkIFNUQVJUX0lORkVSSU9SX0hPT0suCisKKwkqIHJlbW90ZS1lYi5jOiAgQ2hhbmdlIHRpbWVvdXQgdG8gMjQgc2Vjb25kcyAoKjEwIGZpdHMgaW4gYnl0ZSkKKwl0byBhY2NvdW50IGZvciBzbG93IGxvYWRpbmcgZnJvbSBmbG9wcGllcy4KKwkoZWJfY3JlYXRlX2luZmVyaW9yKTogIE5ldyBmbiwgZnJvbSBlYl9zdGFydCBhbmQKKwluaW5keV9jcmVhdGVfaW5mZXJpb3IuCisJKGViX2Nsb3NlKTogIE9ubHkgdXNlIGxvZ19maWxlIGlmIG5vbnplcm8uCisJKGViX3hmZXJfaW5mZXJpb3JfbWVtb3J5KTogIElmIG5vdCB3cml0aW5nLCB0aGVuIHJlYWQhCisJKGViX3JlYWRfaW5mZXJpb3JfbWVtb3J5LCBlYl93cml0ZV9pbmZlcmlvcl9tZW1vcnkpOiAgUmV0dXJuIGxlbmd0aC4KKwkoZWJfa2lsbCk6ICBBIG5ldyBuby1vcC4KKwkoZWJfbW91cm5faW5mZXJpb3IpOiAgUmVtb3ZlIGJyZWFrcG9pbnRzLCB0aGVuIGdlbmVyaWNhbGx5IHdlZXAuCisKK0ZyaSBEZWMgMTMgMTY6MDk6MjMgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIGJyZWFrcG9pbnQuYywgZmluZHZhci5jLCBpbmZydW4uYywgcHV0ZW52LmMsIHN0YWNrLmM6ICBGaXgKKwltaXNjZWxsYW5lb3VzIGNvbXBhcmlzb25zIG9mIGludGVnZXIgd2l0aCBOVUxMIHRoYXQgZWxpY2l0CisJY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgY29tcGFyaXNvbiBvZiBpbnRlZ2VyIHdpdGggcG9pbnRlciwgd2hlbgorCU5VTEwgaXMgKCh2b2lkICopIDApIHJhdGhlciB0aGFuIGp1c3QgYSBiYXJlIDAuCisKK1dlZCBEZWMgMTEgMTM6MDI6NTggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGJyZWFrcG9pbnQuYyAoYnJlYWtwb2ludF9yZV9zZXRfb25lKTogIERpc2FibGUgZWFjaCBicmVha3BvaW50CisJd2hpbGUgd2UgcmVzZXQgaXQsIGluIGNhc2Ugb2YgcHJvYmxlbXMuICBQcmludCBicmVha3BvaW50IG51bWJlcgorCWluIGVycm9yIG1lc3NhZ2VzLgorCisJKiBidWlsZHN5bS5jIChyZWFkX3N0cnVjdF90eXBlKTogIEF2b2lkIHN1bjMgY29tcGlsZXIgYnVnIHdpdGgKKwlmb29bLS1uXS4KKworCSogc291cmNlLmMgKGZpbmRfc291cmNlX2xpbmVzKTogSWYgZ2V0dGluZyBmaWxlIG1vZCB0aW1lIGZhaWxzLAorCWRvbid0IHdhcm4uCisKKwkqIHRhcmdldC5jICh0YXJnZXRfeGZlcl9tZW1vcnkpOiAgSWYgZXJybm8gaXMgc2V0LCByZXR1cm4gaXQsCisJcmF0aGVyIHRoYW4gRUlPLgorCitUdWUgRGVjIDEwIDA0OjA3OjIyIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgorCitTdW4gRGVjICA4IDIxOjEzOjMzIDE5OTEgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm4gYXQgc3BoYWdudW0uY3lnbnVzLmNvbSkKKworCSogc3ltdGFiLmggKHN0cnVjdCBmbl9maWVsZCk6IEFkZCBuZXcgZmllbGRzIGBpc19wcml2YXRlJywKKwlgaXNfcHJvdGVjdGVkJywgYGlzX3N0dWInLCBtYWtpbmcgcm9vbSBieSByZWR1Y2luZyB0aGUgc2l6ZSBvZgorCWB2b2Zmc2V0Jy4KKwkoc3RydWN0IGZuX2ZpZWxkbGlzdCk6IERlbGV0ZSB0aGUgZmllbGRzIGBwcml2YXRlX2ZuX2ZpZWxkX2JpdHMnCisJYW5kIGBwcm90ZWN0ZWRfZm5fZmllbGRfYml0cycuCisJKFRZUEVfRk5fe1BSSVZBVEUsUFJPVEVDVEVEfV9CSVRTKTogRGVsZXRlZC4KKwkoU0VUX1RZUEVfRk5fe1BSSVZBVEUsUFJPVEVDVEVEfSk6IERlbGV0ZWQuCisJKFRZUEVfRk5fe1BSSVZBVEUsUFJPVEVDVEVEfSk6IERlbGV0ZWQuCisJKFRZUEVfRk5fRklFTERfe1NUVUIsUFJJVkFURSxQUk9URUNURUR9KTogTmV3IG1hY3Jvcy4KKwkqIHZhbG9wcy5jLCB2YWxwcmludC5jLCBzeW10YWIuYzogQWxsIGNhbGxlcnMgdXBkYXRlZC4KKworCSogYnVpbGRzeW0uYyAocmVhZF9zdHJ1Y3RfdHlwZSk6IERlbGV0ZSB0aGUgYHZpc2liaWxpdHknIGZpZWxkCisJZnJvbSBgc3RydWN0IG5leHRfZm5maWVsZCcsIGFuZCByZXdvcmsgY29kZSBzbyB0aGF0IHZpc2liaWxpdHkKKwlpbmZvIGlzIHN0b3JlZCBpbnRvIHRoZSBmbl9maWVsZCBkaXJlY3RseS4gIEFsc28sIGhhY2tlZCB0byBzZXQKKwlUWVBFX0ZOX0ZJRUxEX1NUVUIgZm9yIGJvdGggc3RhdGljIGFuZCBub3JtYWwgbWVtYmVyIGZ1bmN0aW9ucy4KKworU2F0IERlYyAgNyAxODoxMzoxMSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogaTM4Ni10ZGVwLmM6ICBGaXggYSBwcm9ibGVtIG9uIGkzODYgc3lzdGVtcyB3aGVyZSBidWZmZXJlZCBjb2RlCisJc3RyZWFtIGFjY2VzcyB3YXMgZmFpbGluZyB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgbWluaW11bSBzaXplCisJZ3JhbnVsYXJpdHkgb2YgdGhlIGNvZGUgc2VjdGlvbi4gIEZvciBub3csIHRoZSBidWZmZXJpbmcgaXMgc2ltcGx5CisJZGlzYWJsZWQuICBUaGVyZSBpcyBhIHNpbWlsYXIgcHJvYmxlbSBpbiB0aGUgaTM4NiBkaXNhc3NlbWJlciBjb2RlCisJdGhhdCBoYXMgbm90IHlldCBiZWVuIGZpeGVkIChGSVhNRSkuCisKKwkqIGdtYWxsb2MuYzogIFVzZSBtYWNyb3MgdG8gaGlkZSBzb21lIG9mIHRoZSB1Z2x5IGNhc3RpbmcgcmVxdWlyZWQKKwlpbiB0aGUgcHJldmlvdXNseSBhcHBsaWVkIGZpeCBmb3IgcG9pbnRlcnMgd2l0aCBoaWdoIGJpdHMgc2V0LgorCitTYXQgRGVjICA3IDE2OjQ5OjM1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIFJvbGwgVkVSU0lPTiB0byA0LjMuMS4KKworU2F0IERlYyAgNyAwNDoxMjozNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCUdEQi00LjMgcmVsZWFzZSEKKworCSogTWFrZWZpbGUuaW46ICBSb2xsIFZFUlNJT04gdG8gNC4zCisJKiBSRUFETUUsIFRPRE8sIFdIQVRTLk5FVywgZGVwZW5kOiAgVXBkYXRlLgorCisJKiBpbmZsb3cuYyAodGVybWluYWxfaW5mZXJpb3IpOiAgQXZvaWQgZXJyb3IgbXNnIGlmIGF0dGFjaGVkLgorCisJKiBnbWFsbG9jLmM6ICBGaXggYnVnIHRoYXQgY2F1c2VzIG1hbGxvYyAmIGZyZWUgdG8KKwlmYWlsIG9uIHN5c3RlbXMgd2hlcmUgcG9pbnRlcnMgaGF2ZSB0aGUgaGlnaCBiaXQgc2V0ICgweDgwMGVmY2YwCisJZm9yIGV4YW1wbGUpLiAgVGhlIHByb2JsZW0gaXMgdGhhdCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3bworCXBvaW50ZXJzIGlzIGEgc2lnbmVkIGludGVnZXIsIHNvIHRoZSBjb21wdXRhdGlvbgorCisJICAgICAgICAoY2hhciAqKSAweDgwMGVmY2YwIC0gKGNoYXIgKikgMAorCisJeWllbGRzIGEgbmVnYXRpdmUgdmFsdWUuICBUaGUgc2lnbiBvZiB0aGUgcmVzdWx0IG9mIHRoZSBtb2R1bHVzCisJb3BlcmF0b3IgaXMgbWFjaGluZSBkZXBlbmRlbnQgZm9yIG5lZ2F0aXZlIG9wZXJhbmRzLCB0aHVzIGl0IGlzCisJcG9zc2libGUgZm9yIGl0IHRvIGVuZCB1cCBuZWdhdGl2ZS4gIEZyb20gRnJlZCBGaXNoLgorCitTYXQgRGVjICA3IDAwOjAwOjE1IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGluc3RhbGwgdXNpbmcgSU5TVEFMTF9QUk9HUkFNIGFuZCBJTlNUQUxMX0RBVEEuCisJICBhZGRlZCBjbGVhbi1pbmZvLiAgYWRkZWQgc29tZSBzdGFuZGFyZHMudGV4dCBzdXBwb3J0IGFuZCBtYWRlIGl0CisJICBsb29rIGxpa2Ugb3VyIG90aGVyIE1ha2VmaWxlcy4KKworCSogY29uZmlndXJlLmluOiBtYXJrIHRoaXMgZGlyZWN0b3J5IHRhcmdldCBkZXBlbmRlbnQuICBjb25maWd1cmUKKwkgIG5vdyBydW5zIGVudGlyZWx5IGluIG9iamRpciBzbyBtYWtlIGV4aXN0ZW5jZSB0ZXN0cyBhbmQKKwkgIHJlZmVyZW5jZXMgYWdhaW5zdCAke3NyY2Rpcn0uCisKK0ZyaSBEZWMgIDYgMDg6MzA6MzYgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIGR3YXJmcmVhZC5jIChlbnVtX3R5cGUsIHN0cnVjdF90eXBlKTogIEZpeGVzIGZvciBvcGFxdWUgYW5kCisJYW5vbnltb3VzIGVudW1lcmF0aW9ucywgc3RydWN0dXJlcywgYW5kIHVuaW9ucy4gIE5vdyBwYXNzZXMgYWxsCisJdGhlIGN1cnJlbnQgZ2RiIHRlc3Qgc3VpdGUgdGVzdHMuCisKK1RodSBEZWMgIDUgMjI6NDY6MTMgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogaWRlc3RkaXIgYW5kIGRkZXN0ZGlyIGdvIGF3YXkuICBBZGRlZCBjb3B5cmlnaHRzCisJICBhbmQgc2hpZnQgZ3BsIHRvIHYyLiAgQWRkZWQgQ2hhbmdlTG9nIGlmIGl0IGRpZG4ndCBleGlzdC4gZG9jZGlyCisJICBhbmQgbWFuZGlyIG5vdyBrZXllZCBvZmYgZGF0YWRpciBieSBkZWZhdWx0LgorCitUaHUgRGVjICA1IDIxOjUzOjIxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBzeW10YWIuYyAoZGVjb2RlX2xpbmVfMSk6ICBJZiBTS0lQX1BST0xPR1VFIGxlYXZlcyB1cyBpbgorCW1pZC1saW5lLCBiZSBtb3JlIGNhcmVmdWwgYWJvdXQgcG9zc2libHkgYWR2YW5jaW5nIHRvIHRoZSBuZXh0IGxpbmUuCisKK1RodSBEZWMgIDUgMTg6NTk6NTEgMTk5MSAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubiBhdCBjeWdudXMuY29tKQorCisJKiBjcGx1cy1kZW0uYyAoY3BsdXNfZGVtYW5nbGUpOiBDYWxsIGBzdHJpbmdfbmVlZCcgd2hlbgorCW51bGwtdGVybWluYXRpbmcgYSBwYXJ0aWFsbHktY29tcHV0ZWQgc3RyaW5nLgorCitUaHUgRGVjICA1IDE4OjE5OjQzIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBkd2FyZnJlYWQuYyAoZW51bV90eXBlKTogIEJ1aWxkIGEgY29ycmVjdCBUWVBFX05BTUUsIGFkZCBhCisJc3ltYm9sIHRvIHRoZSBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbWVtYmVyIG9mIHRoZSBlbnVtLgorCisJKiBkd2FyZnJlYWQuYyAoc3RydWN0X3R5cGUpOiAgQnVpbGQgYSBjb3JyZWN0IFRZUEVfTkFNRS4KKworCSogZHdhcmZyZWFkLmMgKGFkZF9lbnVtX3BzeW1ib2wpOiAgTmV3IGZ1bmN0aW9uIHRvIGV4dHJhY3QgZW51bQorCW1lbWJlciBuYW1lcyBhbmQgYWRkIHRoZW0gdG8gdGhlIHBhcnRpYWwgc3ltYm9sIHRhYmxlIHdoaWxlCisJYnVpbGRpbmcgcGFydGlhbCBzeW1ib2wgdGFibGVzLgorCitUaHUgRGVjICA1IDE3OjMxOjA1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBzeW10YWIuYyAoY2hlY2tfc3R1Yl9tZXRob2QpOiAgTXVzdCBhbGxvY2F0ZSB0d28gZXh0cmEgYXJndW1lbnQKKwlzbG90cyAob25lIGZvciBgdGhpcycsIG9uZSBmb3IgYXJnbGlzdCB0ZXJtaW5hdG9yKS4KKworVGh1IERlYyAgNSAxMDo1MTowNSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogaW5mbG93LmMgKGNoaWxkX3Rlcm1pbmFsX2luZm8pOiBTdXBwbHkgbWlzc2luZyAnIicgY2hhcmFjdGVyLgorCisJKiBidWlsZHN5bS5jIChkZWZpbmVfc3ltYm9sKTogIFN1cHBseSBtaXNzaW5nIHBhcmVudGhlc2lzLgorCitUaHUgRGVjICA1IDAzOjM0OjIxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBjb3JlZGVwLmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogIEZlbmNlcG9zdCBlcnJvci4gIEZpeGVkIGJ5CisJSmF5IExlcHJlYXUgPGxlcHJlYXVAY3MudXRhaC5lZHU+LgorCisJKiBpbmZsb3cuYzogIFJlbWVtYmVyIHdoZXRoZXIgR0RCIGhhcyBhIHRlcm1pbmFsLiAgQXZvaWQgc3dpdGNoaW5nCisJdGVybWluYWxzIGJhY2sgYW5kIGZvcnRoIGlmIHdlIGRvbid0IGhhdmUgb25lLgorCisJKiBjLWV4cC55IChwYXJzZV9udW1iZXIpOiAgWmVybyBpcyBub3QgYW4gdW5zaWduZWQgaW50IGNvbnN0YW50IQorCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIpOiAgRW51bSB0eXBlIG51bWJlcnMgY2FuIGJlIGluICgxLDIpIGZvcm0uCisKKwlJbXByb3ZlIHR5cGUgcGFyc2luZy4KKwkqIGJ1aWxkc3ltLmMgKGRlZmluZV9zeW1ib2wsIHJlYWRfcmFuZ2VfdHlwZSk6IEFkZAorCWxvbmdfa2x1ZGdlX25hbWUgdGhhdCBwYXNzZXMgdGhlIG5hbWVzIG9mIHJhbmdlIHR5cGVzIGJlaW5nCisJZGVmaW5lZCwgZG93biB0byB3aGVyZSB3ZSBtdXN0IGNob29zZSBiZXR3ZWVuICdpbnQnIGFuZCAnbG9uZycKKwl2YXJpYW50cy4gIFRoaXMgZmFpbHMgb24gU3VuIEMgYW55d2F5IHNpbmNlIHRoZSBjb21waWxlciBpdHNlbGYgaXMKKwljb25mdXNlZCBiZXR3ZWVuIGludCBhbmQgbG9uZy4KKwkocmVhZF9hcnJheV90eXBlLCBjbGVhbnVwX3VuZGVmaW5lZF90eXBlcyk6ICBDb3JyZWN0IHRoZSBzaXplIG9mCisJYXJyYXkgdHlwZSB3aG9zZSBlbGVtZW50LXR5cGUgc2l6ZSBpc24ndCBpbW1lZGlhdGVseSBrbm93bi4KKworCUVhcmx5IHByZXBhcmF0aW9uIHRvIGJsb3cgYXdheSBtYW55IGJ1aWx0aW4gdHlwZXMsIGJ1aWxkaW5nIHRoZW0KKwlvbiB0aGUgZmx5IGFzIG5lZWRlZC4gIERvbid0IGNvbXBhcmUgdHlwZXMgdG8gYnVpbHRpbiB0eXBlcyB3aXRoCisJPT07IGV4YW1pbmUgdGhlIHJlbGV2YW50IGZpZWxkcyBpbnN0ZWFkLgorCSogY29mZnJlYWQuYyAocHJvY2Vzc19jb2ZmX3N5bWJvbDogQ19BUkcsIENfUkVHUEFSTSk6ICBBdm9pZCA9PS4KKwkqIGJ1aWxkc3ltLmMgKGRlZmluZV9zeW1ib2wsIGNhc2UgJ3AnKTogIEF2b2lkID09LgorCSogdmFsb3BzLmMgKHZhbHVlX2FyZ19jb2VyY2UpOiAgQXZvaWQgPT0uICBEb24ndCBhc3N1bWUgaG9zdCBhbmQKKwl0YXJnZXQgdHlwZXMgYXJlIHRoZSBzYW1lLgorCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogIEkgZmluYWxseSB1bmRlcnN0YW5kIGFycmF5cywgcmVtb3ZlIEZJWE1FLgorCisJKiBzeW1taXNjLmMgKHByaW50cHN5bXNfY29tbWFuZCk6ICBSZWR1Y2UgcmVkdW5kYW5jeSwgYW5kIHB1dCBhbGwKKwlhZGRyZXNzZXMgaW4gR0RCIGl0c2VsZiBpbnRvIHBhcmVucyBmb3IgZWFzeSBjbGVhbnVwIGFuZCBkaWZmaW5nLgorCitXZWQgRGVjICA0IDIxOjA1OjMwIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBkd2FyZnJlYWQgKGVudW1fdHlwZSk6ICBBcnJhbmdlIGZvciB0aGUgb3JkZXIgb2YgZW51bWVyYXRpb24KKwltZW1iZXJzIHRvIG1hdGNoIHRoZSBzb3VyY2UgY29kZSBvcmRlcjsgbm90IHRoZSBvcmRlciBpbiB0aGUKKwlEd2FyZiBpbmZvcm1hdGlvbiwgd2hpY2ggaXMgZXhwbGljaXRseSByZXZlcnNlIG9yZGVyLgorCitXZWQgRGVjICA0IDE4OjI0OjM5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBtYWluLmMgKGlucHV0X2Zyb21fdGVybWluYWxfcCk6ICBDaGVjayB3aGV0aGVyIEdEQiBoYXMgYQorCXRlcm1pbmFsIGF0IGFsbC4KKwkoaW5pdGlhbGl6ZV9tYWluKTogIFJldmlzZSBkb2MgZm9yIGBzZXQgZWRpdGluZycuCisKK1dlZCBEZWMgIDQgMTU6MzY6MzkgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIGR3YXJmcmVhZC5jIChzdHJ1Y3RfdHlwZSk6ICBIYW5kbGUgc3RydWN0dXJlcyBhbmQgdW5pb25zIHdoaWNoCisJY29udGFpbiBESUUncyBvdGhlciB0aGFuIGp1c3QgbWVtYmVyIGRpZXMuCisKK1dlZCBEZWMgIDQgMDE6NTk6MDUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIHN5bWZpbGUuYyAocmVyZWFkX3N5bWJvbHMpOiAgQXZvaWQga2x1ZGdpbmcgbXRpbWVfc2V0LCBub3cgdGhhdAorCUJGRCBpcyBmaXhlZC4KKworVHVlIERlYyAgMyAxNzoyNDo1NyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBWRVJTSU9OIDQuMi45Ni4KKworCSogbWFpbi5jIChpbml0aWFsaXplX21haW4pOiAgUmV2aXNlIGNvbW1hbmQgZGVzY3JpcHRpb25zLgorCSogY29tbWFuZC5jIChzaG93X3VzZXIpOiAgYGluZm8gdXNlcicgLT4gYHNob3cgdXNlcicuCQorCSogc3ltdGFiLmMgKF9pbml0aWFsaXplX3N5bXRhYik6ICBUeXBvIGluIGBpbmZvIHR5cGVzJyBkZXNjLgorCisJKiBjb2ZmcmVhZC5jIChjb2ZmX3N5bWZpbGVfcmVhZCk6ICBBdm9pZCBzZWxlY3Rfc291cmNlX3N5bXRhYiwKKwlzaW5jZSBpdCBpcyBub3QgbmVlZGVkIGFuZCBjYW4gY2F1c2UgZXJyb3JzIHdoZW4gZXhhbWluaW5nICIubyJzLgorCShyZWFkX2NvZmZfc3ltdGFiLCBkZWNvZGVfYmFzZV90eXBlKTogIFVzZSBjb21wbGFpbiwgbm90IHByaW50Zi4KKwlQcmludCBzeW1ib2wgbmFtZSwgbm90IGl0cyBudW1iZXIuCisJUmVtb3ZlICIjaWYgZGVmaW5lZChjbGlwcGVyKSAjZGVmaW5lIEJFTElFVkVfUENDX1BST01PVElPTiIsIHdoaWNoCisJc29tZWRheSBzaG91bGQgZ28gaW4gYSBjbGlwcGVyIHRhcmdldCBjb25maWcgZmlsZS4KKworCSogc3ltZmlsZS5jIChjb21wYWN0X21pc2NfZnVuY3Rpb25fdmVjdG9yKTogIEhhbmRsZSBlbXB0eSB2ZWN0b3IuCisJKGNvbXBsYWluLCBjbGVhcl9jb21wbGFpbnRzLCBzeW1zX2Zyb21fb2JqZmlsZSk6ICBGaXggY29tcGxhaW50CisJZm9ybWF0dGluZy4KKwkqIHhjb2ZmZXhlYy5jOiAgQ2hhbmdlIHN5bXNfZnJvbV9vYmpmaWxlIGNhbGxlci4KKworCSogc3BhcmMteGRlcC5jOiAgRm9yY2UgdG0tZmlsZSBhcyB0bS1zcGFyYy5oLCB0byBtYWtlIGl0IGNvbXBpbGUKKwl3aGVuIGNvbmZpZ3VyZWQgZm9yIGNyb3NzIGRlYnVnZ2luZy4gIEZJWE1FLCB0aGlzIG5lZWRzIGEgbW9yZQorCWdlbmVyYWwgc29sdXRpb24uCisKK01vbiBEZWMgIDIgMTE6MDQ6MDUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIG1pcHMtdGRlcC5jIChpbml0X2V4dHJhX2ZyYW1lX2luZm8pOiAgRmxvYXQgcmVnaXN0ZXIKKwknaScgaGFzIGdkYi1pbnRlcm5hbCBudW1iZXIgJ0ZQMCtpJywgbm90ICczMitpJy4KKwkqIG1pcHNyZWFkLmMgKG5ld19zeW1ib2wpOiAgVHJhbnNsYXRlIGcrKyBzcGVjaWFsCisJc3ltYm9sICIkdCIgdG8gInRoaXMiLgorCitTYXQgTm92IDMwIDIxOjI5OjU1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCisJQ2hhbmdlcyBkdWUgdG8gaW5jbHVkZSBmaWxlIHJlbmFtaW5nOgorCisJKiB4Y29mZnJlYWQuYzoJaW50ZXJuYWxjb2ZmLmgJLT5jb2ZmL2ludGVybmFsLmMsCisJICAJCWNvZmYtcnM2MDAwLmgJLT5jb2ZmL3JzNjAwMC5oCisJKiBtaXBzcmVhZC5jOgljb2ZmLW1pcHMuaAktPmNvZmYvbWlwcy5oCisJKiBlbGZyZWFkLmM6ICAgIGVsZi1jb21tb24uaAktPmVsZi9jb21tb24uaCAKKwkJCWVsZi1leHRlcm5hbC5oCS0+ZWxmL2V4dGVybmFsLmgsCisJCQllbGYtaW50ZXJuYWwuaAktPmVsZi9pbnRlcm5hbC5oCisJKiBkd2FyZnJlYWQuYwlkd2FyZi5oCQktPmVsZi9kd2FyZi5oCisJKiBkYnhyZWFkLmM6CWFvdXQ2NC5oCS0+YW91dC9hb3V0NjQuaAorCQkJc3RhYi5nbnUuaAktPmFvdXQvc3RhYl9nbnUuaAorCQkgICAKKwkqIGNvZmZyZWFkLmM6ICAgaW50ZXJuYWxjb2ZmLmgJLT5jb2ZmL2ludGVybmFsLmgKKwkqIGJ1aWxkc3ltLmM6ICAgc3RhYi5nbnUuaAktPmFvdXQvc3RhYl9nbnUuaAorCSogZGVwZW5kICAgICAgICBVcGRhdGVkIHRvIHRha2UgdGhlIGFib3ZlIGludG8gYWNjb3VudC4KKworRnJpIE5vdiAyOSAxNjo1OToyNSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgQWRkIFNWUjQgaTM4NiBjb25maWd1cmF0aW9ucy4KKworCSogY29uZmlnL21oLWkzODZ2NCwgY29uZmlnL210LWkzODZ2NCwgdG0taTM4NnY0LmgsIHhtLWkzODZ2NC5oOgorCU5ldyBmaWxlcyBmb3IgaTM4Ni9TVlI0LgorCisJKiB0bS1pMzg2di5oOiAgQWxsb3cgU1RBUlRfSU5GRVJJT1JfVFJBUFNfRVhQRUNURUQgYW5kCisJREVDUl9QQ19BRlRFUl9CUkVBSyB0byBiZSBwcmVkZWZpbmVkIGJ5IGZpbGVzIGluY2x1ZGluZyAKKwl0bS1pMzg2di5oLgorCisJKiBpMzg2LXRkZXAuYzogIEFkZCBzdXBwbHlfZ3JlZ3NldCgpLCBmaWxsX2dyZWdzZXQoKSwKKwlzdXBwbHlfZnByZWdzZXQoKSwgYW5kIGZpbGxfZnByZWdzZXQoKSBmdW5jdGlvbnMsIHdoaWNoIGFyZQorCXRhcmdldCBkZXBlbmRlbnQgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIHRoZSBTVlI0IC9wcm9jIHJlZ2lzdGVyCisJaW50ZXJmYWNlLgorCisJKiBkd2FyZnJlYWQuYyAoZW51bV90eXBlLCBzdHJ1Y3RfdHlwZSk6ICBFeHBhbmQgcmVjb2duaXplZAorCWNvbXBpbGVyIGdlbmVyYXRlZCB0YWdzIHRvIGluY2x1ZGUgc3ltYm9scyBiZWdpbm5pbmcgd2l0aCAnLicgYXMKKwl3ZWxsIGFzICd+Jy4KKworCSogc3ltdGFiLmMgKHNvdXJjZXNfaW5mbyk6ICBDaGFuZ2Ugc2ltcGxlIHByaW50ZiBvZiBlcnJvciBtZXNzYWdlCisJdG8gY2FsbCB0byBlcnJvcigpLgorCitGcmkgTm92IDI5IDE2OjA0OjIxIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCisKKwkqIGRvYy9nZGIudGV4aW5mbzogcmVtb3ZlIGxlYWRpbmcgY29tbWVudHMgdGhhdCBzdXJ2aXZlZCBNNCBidXQKKyAgICAgICAgZGVzY3JpYmVkIGl0cyByb2xlIGluIHRoZSBkb2M7IGFkZCBvbmUgbW9yZSBmb250IHRvIGNvbG9waG9uOworICAgICAgICBzdHJlbmd0aGVuIGRpc2NsYWltZXIgYWJvdXQgdW5zdXBwb3J0ZWQgY29uZmlncy4KKworV2VkIE5vdiAyNyAwMToyMzo0MSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCUZpeCBidWdzIGluIEMrKyBkZWJ1Z2dpbmcuCisKKwkqIHN5bXRhYi5oOiAgdGFyZ2V0X3R5cGUgaXMgbm90IHVzZWQgaW4gcmVjb3JkIHR5cGVzLgorCUVsaW1pbmF0ZSBUWVBFX01BSU5fVkFSSUFOVCBhbmQgVFlQRV9ORVhUX1ZBUklBTlQuICBFbGltaW5hdGUKKwlsb29rdXBfbWV0aG9kX3R5cGUuICBBZGQgVFlQRV9UWVBFX1NQRUNJRklDIG1hY3JvLgorCisJKiBzeW10YWIuYyAobG9va3VwX21lbWJlcl90eXBlKTogIERvbid0IGNoYWluIHRoZW0gdXAsIGp1c3QKKwlhbGxvY2F0ZSBvbmUgaW4gc3ltYm9sX29ic3RhY2sgd2hlbiB3ZSBuZWVkIG9uZS4KKwkoYWxsb2NhdGVfc3R1Yl9tZXRob2QpOiAgQnVpbGQgc3R1YiBpbiBzeW1ib2xfb2JzdGFjay4KKwkoY2hlY2tfc3R1Yl9tZXRob2QpOiAgTW92ZSBoZXJlIGZyb20gdmFsdWVzLmMuICBEb24ndCBkZWFsbG9jYXRlCisJc3R1Yjsgb3ZlcndyaXRlIGl0LgorCShsb29rdXBfbWV0aG9kX3R5cGUpOiAgR29uZSBub3cuCisKKwkqIGJ1aWxkc3ltLmM6IEhhbmRsZSBnKysgdjEgc3RhYnMgYSBsaXR0bGUgYml0IGJldHRlci4KKwlDaGFuZ2Ugc29tZSBDKysgcGFyc2luZyBlcnJvcigpcyB0byBjb21wbGFpbigpdHMuCisJKiBidWlsZHN5bS5jLCBmaW5kdmFyLmMsIHByaW50Y21kLmMsIHN5bXRhYi5jOiAgTWFrZSB1bmlvbnMgYW5kCisJc3RydWN0cyBoYXZlIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGFuZCB3b3JrIHRoZSBzYW1lIGFzIGZhciBhcworCUMrKyBpcyBjb25jZXJuZWQuIAorCSogYnVpbGRzeW0uYywgc3ltdGFiLmMsIHZhbHVlcy5jOiBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8KKwlUWVBFX01BSU5fVkFSSUFOVCBhbmQgVFlQRV9ORVhUX1ZBUklBTlQuCisKKwkqIHZhbG9wcy5jOiAgSW1wcm92ZSBjb21tZW50cyBhbmQgaW5kZW50YXRpb24uICBPbmx5IGNhbGwKKwljaGVja19zdHViX21ldGhvZCB3aGVuIHRoZSBzdHViIGZsYWcgaXMgb24uCisJKiB2YWxwcmludC5jOiAgRml4IG9yIG1hcmsgbWlub3IgYnVncyBhbmQgdW5wb3J0YWJpbGl0aWVzLgorCQorCSogY29mZnJlYWQuYyAoYW5vbnltb3VzIHVuaW9ucyk6ICBBbGxvY2F0ZSBhIGNwbHVzIHN0cnVjdHVyZS4KKworCSogbWlwc3JlYWQuYzogIEVsaW1pbmF0ZSAidGVtcGxhdGUiIHR5cGVzLiAgQnVpbGQgbmV3LCByZWFsCisJdHlwZXMgd2hlbmV2ZXIgd2UgbmVlZCB0aGVtLiAgQWxsb2NhdGUgY3BsdXMgc3RydWN0dXJlcyBhcyBuZWVkZWQuCisJQnVsbGV0cHJvb2YgdGhlIHR5cGUgcGFyc2luZyBhIGJpdCBtb3JlLiAgTWFyayBzdG9yYWdlIGxlYWtzLgorCShwYXJzZV90eXBlKTogIENvcHkgVFlQRV9UWVBFX1NQRUNJRklDIHdoZW4gY29weWluZyBhIHJlYWwgdHlwZQorCW9uIHRvcCBvZiBhIHBhcnRpYWwgdHlwZS4KKworRnJpIE5vdiAyMiAxNjozOTo1NyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogaW5mbG93LmMgKHRlcm1pbmFsX2luZmVyaW9yKTogIENoZWNrIHRoZSByZXN1bHRzIG9mIGlvY3RsJ3MsIGFuZAorCXByaW50IGEgbWVzc2FnZSBpZiBhbnkgb2YgdGhlbSBmYWlsLgorCSh0ZXJtaW5hbF9vdXJzXzEpOiAgU3RvcmUgcmVzdWx0IG9mIGlvY3RsJ3MgZm9yIGRlYnVnZ2luZywgYnV0CisJZG9uJ3QgcHJpbnQgKHRoZSB0ZXJtaW5hbCBpc24ndCBvdXJzLi4uKS4KKworCSogdG0tdGFob2UuaCAoRlJBTUVfQVJHU19BRERSRVNTKTogIE5vIG5lZWQgdG8gb2Zmc2V0IGZyb20gZnJhbWUKKwlwb2ludGVyLgorCisJKiBtMi1leHAueSAoTUFYLCBNSU4pOiAgUmVuYW1lIHRvIE1BWF9GVU5DLCBNSU5fRlVOQyB0byBhdm9pZAorCWNvbmZsaWN0cyB3aXRoIHN5c3RlbSBoZWFkZXIgZmlsZXMuCisKK0ZyaSBOb3YgMjIgMDg6Mjc6NDAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIFJvbGwgVkVSU0lPTiB0byA0LjIuOTUuCisKKwkqIGJ1aWxkc3ltLmMsIGNvcmVkZXAuYywgbWVtLWJyZWFrLmMsIHhjb2ZmcmVhZC5jOiAgUHV0IDxzdGRpby5oPgorCWZpcnN0LCBiZWZvcmUgZGVmcy5oLgorCSogY29uZmlnL21oLWkzODZzY286IE92ZXJyaWRlIGNvbXBpbGVyIHRvIGdjYywgcHJpbnQgd2FybmluZy4KKwkqIGNvbmZpZ3VyZS5pbjogIEhhbmRsZSBpMzg2LW5vbmUtYW91dCByYXRoZXIgdGhhbiBpMzg2LWFvdXQtbm9uZS4KKwkqIGluZnB0cmFjZS5jLCBsYW5ndWFnZS5oLCB1dGlscy5jOiAgTGludC4KKwkqIG0yLWV4cC55OiAgI3VuZGVmIE1BWCBhbmQgTUlOIGluIGNhc2Ugc3lzdGVtIGluY2x1ZGVzIHNldCB0aGVtLgorCSogeG0tdGFob2UuaDogIFNldCBIT1NUX0JZVEVfT1JERVIuICBJbmNsdWRlIHN5c3RlbSB2ZXJzaW9ucyBvZgorCXtCSUcsTElUVExFfV9FTkRJQU4gYW5kIHRoZSBJTlRfTUFYIGZhbWlseSBmaXJzdCwgdG8gYXZvaWQKKwlyZWRlZmluaXRpb24gd2FybmluZ3MuCisJKiBkZWZzLmg6ICBSZW9yZGVyIHRoaW5ncyBzbyB0aGF0IHRoZSB4bS1maWxlIGdldHMgZmlyc3QgY3JhY2sKKwlhdCAjZGVmaW5lJ3MsIGZvbGxvd2VkIGJ5IGRlZnMuaCBhbmQgdGhlbiB0aGUgdG0tZmlsZS4KKwkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlIHNwYWNlcyBhZnRlciAnaWdub3JlIGV4aXQgY29kZScgLSBmbGFncy4KKwlMYXRlLW1vZGVsIEJTRCAnbWFrZSdzIGRvbid0IGNvcGUgd2l0aCB0aGVtLgorCitUaHUgTm92IDIxIDIzOjQ4OjU2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIFJvbGwgbmV3IGZpbGVzIGludG8gdmFyaW91cyBsaXN0cy4KKworVGh1IE5vdiAyMSAxODoyNjoxMSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogZHdhcmZyZWFkLmMgKHN0cnVjdF90eXBlKTogIE11c3QgaW5pdGlhbGl6ZSB0aGUgYysrIHNwZWNpZmljCisJcG9ydGlvbiBvZiB1bmlvbiB0eXBlcyBhcyB3ZWxsIGFzIHN0cnVjdCB0eXBlcywgc2luY2UgZ2RiIGF0dGVtcHRzCisJdG8gcmVmZXJlbmNlIHRoZSBjKysgc3BlY2lmaWMgaW5mbyBmb3IgYm90aCB0eXBlcy4KKworVGh1IE5vdiAyMSAxMDoyMzo1MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IFJvbGwgVkVSU0lPTiB0byA0LjIuOTAuCisKKwkqIGRlZnMuaDogIEluY29ycG9yYXRlIHBhcmFtLmggaW50byBkZWZzLmguICBBbGwgdXNlcnMgY2hhbmdlZC4KKwkqIHBhcmFtLW5vLXRtLmg6ICBDaGFuZ2UgdXNlcnMgdG8gZGVmaW5lIFRNX0ZJTEVfT1ZFUlJJREUgaW5zdGVhZC4KKwkqIHBhcmFtLmgsIHBhcmFtLW5vLXRtLmg6ICBSZW1vdmVkLgorCSogVXBkYXRlIGNvcHlyaWdodHMgaW4gYWxsIGNoYW5nZWQgZmlsZXMuCisJKiBkYnhyZWFkLmMsIGR3YXJmcmVhZC5jLCBpbmZsb3cuYywgaW5mcnVuLmMsIG0yLWV4cC55LCBwdXRlbnYuYywKKwlzb2xpYi5jLCBzeW10YWIuaCwgdG0tdW1heC5oLCB2YWxwcmludC5jOiAgTGludC4KKwkqIHRtLWNvbnZleC5oLCB0bS1ocDMwMGhwdXguaCwgdG0tbWVybGluLmgsIHRtLXNwYXJjLmgsCisJeG0tbWVybGluLmg6ICBBdm9pZCBob3N0IGluY2x1ZGUgZmlsZXMgaW4gdGFyZ2V0IGRlc2NyaXB0aW9ucy4KKwkqIGdldHBhZ2VzaXplLmg6ICBSZW1vdmVkLCBsaWJpYmVydHkgY29wZXMgbm93LgorCSogTWFrZWZpbGUuaW46ICBSZW1vdmUgZ2V0cGFnZXNpemUuaCwgcGFyYW0uaCwgcGFyYW0tbm8tdG0uaC4KKworCSogZXhlYy5jIChleGVjX2ZpbGVzX2luZm8pOiAgSWYgYHZlcmJvc2UnIGlzIHNldCwgc2hvdyBmaWxlIG9mZnNldAorCWFzIHdlbGwuCisKKwkqIG1haW4uYzogIFVzZSBnZXRjd2QgcmF0aGVyIHRoYW4gZ2V0d2QuCisJKiBzdGFuZGFsb25lLmM6ICBGYWtlIGdldGN3ZCByYXRoZXIgdGhhbiBnZXR3ZC4KKwkqIHhtLSouaDogIFJlbW92ZSBmYWtlIHZhbHVlcyBvZiBNQVhQQVRITEVOLgorCisJKiB4Y29mZmV4ZWMuYzogIEFkZCAvKiAqLyB0byAjaWYgMCdkIHRoaW5nIHRvIGhlbHAgQU5TSS4KKworV2VkIE5vdiAyMCAxODozNTo1NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogUmVtb3ZlIGdkYi9ocC1pbmNsdWRlLiAgU3VwcG9ydCBmb3IgSFAgYS5vdXQgb2RkaXRpZXMgc2hvdWxkIGJlCisJaW4gQkZELCBub3QgaW4gR0RCLiAgTW92ZSBnZGIvaHAtaW5jbHVkZS9hLm91dC5oIHRvIGluY2x1ZGUvYS5vdXQuaHAuaC4KKworCSogaW5mcHRyYWNlLmMsIHRtLXN1bjM4Ni5oOiAgQ2FzaGllciA8YS5vdXQuZ251Lmg+LCByZW1vdmUgcmVmcy4KKworCSogY29uZmlndXJlLmluLCB4Y29uZmlnLCB0Y29uZmlnLCBNYWtlZmlsZS5pbiwgZG9jL2dkYmludC50ZXhpbmZvOgorCU1ha2VmaWxlIGZyYWdtZW50cyBmb3IgdmFyaW91cyBob3N0cyBhbmQgdGFyZ2V0cyBub3cgY29tZSBmcm9tCisJZ2RiL2NvbmZpZy9taC0qIGFuZCBnZGIvY29uZmlnL210LSouICBUaGlzIGlzIGZvciBjb25zaXN0ZW5jeSB3aXRoCisJb3RoZXIgY29uZmlnIHNldHVwcy4KKworCSogcnM2MDAwLXBpbnNuLmMsIHJzNmstb3Bjb2RlLmg6ICBDbGVhbiB1cC4KKwkqIHJzNmstb3Bjb2RlLmRlZjogIERlbGV0ZS4KKworV2VkIE5vdiAyMCAwNTowNDo0MCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogZHdhcmZyZWFkLmM6ICBSZWNvZ25pemUgb2Jzb2xldGUgZm9ybSBvZiBBVF9lbGVtZW50X2xpc3QKKwlhdHRyaWJ1dGUgc3RpbGwgdXNlZCBieSBhdCBsZWFzdCBvbmUgQVQmVCBjb21waWxlciwgYW5kIHBvc3NpYmx5CisJbW9yZS4KKworVHVlIE5vdiAxOSAwNzo1Mzo1NSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogZHdhcmZyZWFkLmMgKGVudW1fdHlwZSwgc3RydWN0X3R5cGUpOiAgSWdub3JlIG5hbWVzIGludmVudGVkIGJ5CisJaGVscGZ1bCBjb21waWxlcnMgZm9yIGFub255bW91cyBzdHJ1Y3RzLCB1bmlvbnMsIGFuZCBlbnVtcy4KKworCSogYy1leHAueSwgbTItZXhwLnk6ICBBZGQgZGVmaW5lcyBmb3IgeXltYXhkZXB0aCwgeXlfeXlzLCBhbmQKKwl5eV95eXYsIHNvIG11bHRpcGxlIHBhcnNlcnMgcHJvZHVjZWQgYnkgU1ZSNCB2ZXJzaW9ucyBvZiB5YWNjCisJY2FuIGNvZXhpc3QgaW4gdGhlIHNhbWUgZXhlY3V0YWJsZSB3aXRob3V0IGNvbGxpc2lvbi4KKworCSogc3ltdGFiLmg6ICBBZGQgZGVjbGFyYXRpb24gZm9yIGxvb2t1cF90ZW1wbGF0ZV90eXBlKCkgdG8ga2lsbAorCWNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGNvbnZlcnNpb25zIGZyb20gaW50IHRvIHBvaW50ZXIuCisKK01vbiBOb3YgMTggMTc6NDU6MTggMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIHByb2Nmcy5jOiAgTW92ZSBpbmNsdXNpb24gb2YgZGVmcy5oIHRvIGJlZm9yZSBwYXJhbS5oLCBhcyBpbgorCWFsbCB0aGUgb3RoZXIgc291cmNlIGZpbGVzIHRoYXQgaW5jbHVkZSBib3RoLiAgVGhpcyBpcyByZXF1aXJlZAorCXRvIHN1cHBseSBzb21lIHR5cGVkZWZzIHRoYXQgYXJlIHVzZWQgaW4gZmlsZXMgaW5jbHVkZWQgYnkgcGFyYW0uaC4KKworCSogbTY4ay10ZGVwLmMgKG02OGtfc2tpcF9wcm9sb2d1ZSk6ICBBZGQgZ2VuZXJpYyBtNjhrIHN1cHBvcnQgZm9yCisJc2tpcHBpbmcgZnVuY3Rpb24gcHJvbG9ndWVzLCBhbGEgdGhlIG90aGVyIGNwdSBmYW1pbGllcyAoaTM4NiwKKwltaXBzLCBtODhrLCBldGMpLiAgQWRkIHRoZSBhYmlsaXR5IHRvIHNraXAgbW92bSBhbmQgZm1vdm0KKwlpbnN0cnVjdGlvbnMgaW4gdGhlIHByb2xvZ3Vlcy4gIFN0aWxsIG5lZWRzIHN1cHBvcnQgZm9yIHByb2ZpbGUKKwkoLXAgY29tcGlsZWQpIHByb2xvZ3VlIHNlcXVlbmNlcyAoRklYTUUpLgorCisJKiB0bS02OGsuaDogIENoYW5nZSBTS0lQX1BST0xPR1VFIG1hY3JvIHRvIHVzZSB0aGUgbmV3IGdlbmVyaWMKKwltNjhrIHByb2xvZ3VlIHNraXBwaW5nIGZ1bmN0aW9uIGJ5IGRlZmF1bHQuCisKKwkqIHRtLWFsdG9zLmgsIHRtLWlzaS5oOiAgQ29udGludWUgdG8gdXNlIHRoZSBvbGQgZGVmaW5pdGlvbiBvZgorCVNLSVBfUFJPTE9HVUUuCisKK01vbiBOb3YgMTggMTU6MTI6NDUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlIHRkZXNjIHN0dWZmLCBhbmQgZXh0cmEgYmxhbmtzIGJlZm9yZSBjb2xvbnMuCisJKiBibG9ja2ZyYW1lLmM6ICBSZW1vdmUgdGRlc2MtcmVsYXRlZCBjb2RlLiAgRGVmYXVsdAorCUZSQU1FX0NIQUlOX0NPTUJJTkUuCisJKiBpbmZydW4uYzogIFJlbW92ZSB0ZGVzYy1yZWxhdGVkIGNvZGUuCisJKiBtODhrLXRkZXAuYyAoZnJhbWVfY2hhaW5fY29tYmluZSwgaW5pdF9mcmFtZV9wYyk6ICBSZW1vdmUgY29waWVzCisJb2YgZGVmYXVsdGFibGUgdGhpbmdzLgorCSogdG0tbTg4ay5oOiAgTmV3IGZpbGUsIGNvbW1vbiB0byBhbGwgTW90byA4OGsgdGFyZ2V0IGNvbmZpZ3MuCisJRGVyaXZlZCBmcm9tIHRtLWRlbHRhODguaC4KKwkqIHRtLWRlbHRhODguaDogIFVzZSBpdC4KKwkqIHhtLW04OGsuaDogIENvbW1vbiBmaWxlIGZvciA4OEsgaG9zdHMuICBSZW1vdmUgb2Jzb2xldGUgc3R1ZmYuCisJKiB4bS1kZWx0YTg4Lmg6ICBVc2UgaXQuCisJKiB0bS0qLmg6ICBSZW1vdmUgRlJBTUVfQ0hBSU5fQ09NQklORSBtYWNyb3MsIHNpbmNlIGFsbCBhcmUKKwlkZWZhdWx0LgorCSogY29mZnJlYWQuYzogIFJlbW92ZSB0ZGVzYyBzdHVmZi4KKwkqIHRjb25maWcvZGVsdGE4OCwgdGNvbmZpZy9tODhrOiAgUmVtb3ZlIHRkZXNjIHN0dWZmLgorCSogeGNvbmZpZy9tODhrOiAgUmVuYW1lIHRtLTg4ay5oIHRvIHRtLW04OGsuaC4KKworTW9uIE5vdiAxOCAxMzo1MTozNyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogc291cmNlLmMgKG9wZW5fc291cmNlX2ZpbGUpOiAgSWYgb3BlbnAgZmFpbHMsIHRyeSBhZ2FpbgorCXVzaW5nIGp1c3QgdGhlIGJhc2UgKG5vbi1kaXJlY3RvcnkpIHBhcnQgb2YgdGhlIGZpbGVuYW1lLgorCVRoaXMgc29sdmVzIHZhcmlvdXMgYW5ub3lpbmcgcHJvYmxlbXMsIHN1Y2ggYXMgd2hlbiB0aGUKKwlzb3VyY2Ugd2FzIGNvbXBpbGVkIHdpdGggYW4gYWJzb2x1dGUgcGF0aG5hbWUgLSBhbmQgdGhlCisJc291cmNlIGZpbGVzIGhhdmUgbW92ZWQuICBPciBpZiB0aGUgc291cmNlIHdhcyBjb21waWxlZAorCXVzaW5nIGEgcmVsYXRpdmUgcGF0aG5hbWUsIGl0IGNhbiBiZSBtb3JlIGNvbnZlbmllbnQKKwl0byBqdXN0IHNwZWNpZmljIHRoZSBzb3VyY2UgZGlyZWN0b3J5IHRvIHRoZSBkaXIgY29tbWFuZC4KKworTW9uIE5vdiAxOCAwMDowNDo0MSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmMgKG11bmdlX2Z1bmN0aW9uX25hbWUpOiAgQWRkIG1pc3NpbmcgdGhpcmQgYXJnIHRvCisJaW5zdGFuY2Ugb2YgY2FsbCB0byBkb190eXBlKCkuCisKKwkqIGR3YXJmcmVhZC5jOiAgQ2hhbmdlcyB0byBtYXRjaCBuZXcgZHdhcmYuaC4gIFJlbW92ZSAKKwlBVF9kZXJpdl9saXN0LCBBVF9sb2NsaXN0LCBBVF9pbmNvbXBsZXRlLCBBVF9jb25zdF9kYXRhLAorCWFuZCBBVF9pc19leHRlcm5hbC4KKworU3VuIE5vdiAxNyAxNjoyMDo1MyAxOTkxICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBzeW10YWIuaCAoc3RydWN0IHR5cGUpOiBNb3ZlZCBDKystc3BlY2lmaWMgZmllbGRzIGludG8gbmV3IHR5cGUKKwlgc3RydWN0IGNwbHVzX3N0cnVjdF90eXBlJy4gIE5vdyB0YWtlcyAxMCUgbGVzcyBtZW1vcnkuICBNYW55CisJbWFjcm9zIGNoYW5nZWQuCisJKiBzeW10YWIuYyAoaW5pdF90eXBlKTogRG9uJ3Qgc2V0IGZpZWxkcyBiZWxvbmdpbmcgdG8KKwlUWVBFX0NQTFVTX1NQRUNJRklDIHVubGVzcyBUWVBFIGlzIFRZUEVfQ09ERV9TVFJVQ1QuCisJKiBidWlsZHN5bS5jIChyZWFkX3R5cGUpOiBBbGxvY2F0ZSBUWVBFX0NQTFVTX1NQRUNJRklDIGZvcgorCVRZUEVfQ09ERV9TVFJVQ1QuCisJKHJlYWRfc3RydWN0X3R5cGUpOiBEaXR0by4gIEFsc28sIGFkZCBjb21tZW50cyBhYm91dCBob3cgd2UgY2FuCisJZGVkdWNlIFRZUEVfVlBUUl9GSUVMRE5PIGZyb20gaW5oZXJpdGFuY2UgaW5mbyBhbmQgZmllbGRuYW1lIGluZm8uCisJKiBjb2ZmcmVhZC5jIChkZWNvZGVfYmFzZV90eXBlKTogQWxsb2NhdGUgVFlQRV9DUExVU19TUEVDSUZJQyBmb3IKKwlUWVBFX0NPREVfU1RSVUNULgorCShyZWFkX3N0cnVjdF90eXBlKTogRGl0dG8uCisJKiBkd2FyZnJlYWQuYyAoc3RydWN0X3R5cGUpOiBEaXR0by4KKworCSogc3ltdGFiLmMgKHJlYWRfcmFuZ2VfdHlwZSk6IERvbid0IHNldCBUWVBFX01BSU5fVkFSSUFOVC4KKwkobG9va3VwX3BvaW50ZXJfdHlwZSk6IERvbid0IHVzZSBvciBzZXQgVFlQRV9NQUlOX1ZBUklBTlQuCisJKGxvb2t1cF9yZWZlcmVuY2VfdHlwZSk6IERpdHRvLgorCisJKiBjcGx1cy1kZW0uYzogTWFueSBjaGFuZ2VzIG1hZGUgdG8gaGFuZGxlIGRlY29kaW5nIG9mCisJQU5TSS1tYW5nbGVkIG5hbWVzLgorCSogc3ltdGFiLmMgKGdkYl9tYW5nbGVfbmFtZSk6IE1hbmdsZS9kZW1hbmdsZSBBTlNJLW1hbmdsZWQgbmFtZXMKKwlhcyB3ZWxsLgorCitGcmkgTm92IDE1IDE3OjU3OjU5IDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6ICBwYXRjaCB0byBrZWVwIERFQyBDCisJY29tcGlsZXIgZnJvbSBtYWtpbmcgZ2RiIGJvbWIgb3V0LiAgVGhhbmtzIHRvIEVkIFNhbnRpYWdvIQorCitUaHUgTm92IDE0IDE5OjI3OjMwIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBzeW1maWxlLmM6ICBBZGQgZnVuY3Rpb24gY29tcGFjdF9taXNjX2Z1bmN0aW9uX3ZlY3RvcigpIHRvCisJcmVtb3ZlIGR1cGxpY2F0ZSBtaXNjIGZ1bmN0aW9uIHZlY3RvciBlbnRyaWVzLiAgU2VlIGNvbW1lbnRzCisJaW4gc291cmNlIGZvciB3aHkgdGhpcyBpcyBuZWNlc3NhcnkvZGVzaXJhYmxlLgorCisJKiBkd2FyZnJlYWQuYzogIEFkZCBtaXNjIGZ1bmN0aW9uIHR5cGUgcGFyYW1ldGVyIHRvIGludGVybmFsCisJcmVjb3JkX21pc2NfZnVuY3Rpb24oKS4gIFJlbW92ZSBjYWxscyB0byBpbml0X21pc2NfYnVuY2hlcygpCisJYW5kIGNvbmRlbnNlX21pc2NfYnVuY2hlcygpLCB0aGVzZSBhcmUgbm93IGRvbmUgaW4gZWxmcmVhZC5jLgorCisJKiBlbGZyZWFkLmM6ICBBZGQgc3VwcG9ydCBmb3IgcmVhZGluZyBiZmQgY2Fub25pY2FsIHN5bWJvbCB0YWJsZXMKKwlhbmQgZ2VuZXJhdGluZyBtaXNjIGZ1bmN0aW9uIHZlY3RvciBlbnRyaWVzIGZvciBnbG9iYWwgYW5kCisJYWJzb2x1dGUgc3ltYm9scy4gIERvIGNhbGxzIHRvIGluaXRfbWlzY19idW5jaGVzKCkgYW5kCisJY29uZGVuc2VfbWlzY19idW5jaGVzKCkgd2hlcmUgdGhleSB3aWxsIGVuY2xvc2UgYWxsIGNhbGxzIHRvCisJcmVjb3JkX21pc2NfZnVuY3Rpb24oKSwgaW5jbHVkaW5nIHRob3NlIGluIGR3YXJmcmVhZC5jLgorCitUaHUgTm92IDE0IDE3OjAyOjExIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCisKKwkqIGRvYy9NYWtlZmlsZS5pbjogbmV3IHRhcmdldHMgZ2RiLm1lLCBnZGIubXMsIGdkYi5tbQorCShyb2ZmYWJsZSBkb2N1bWVudGF0aW9uKS4KKwkqIGRvYy9nZGIudGV4aW5mbzogZW1iZWRkZWQgaGludHMgKGFzIGNvbW1lbnRzKSBmb3IgYmV0dGVyCisJdGV4aTJyb2ZmIGNvbnZlcnNpb24uCisKK1RodSBOb3YgMTQgMTM6MTg6MjUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIG04OGstdGRlcC5jIChleGFtaW5lX3Byb2xvZ3VlKTogIERlYWwgd2l0aCBPUiBpbnN0cnVjdGlvbnMKKwl0aGF0IHNodWZmbGUgcGFyYW1ldGVycyBpbnRvIG90aGVyIHJlZ3MuCisJKiBzeW10YWIuYyAoZGVjb2RlX2xpbmVfMSk6ICBGaXggYnVnIGludHJvZHVjZWQgaW4gUGVyJ3MgY2hhbmdlCisJb2YgTm92IDEydGguCisKK1dlZCBOb3YgMTMgMTk6NTE6MTEgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIHhjb25maWcvZGVsdGE4OCBtYWRlIGl0IGluc3RhbGwgYSBzeXNWIG1hbnVhbCBwYWdlOworCWdkYi56IGludG8gdGhlIHJpZ2h0IHBsYWNlLgorCitXZWQgTm92IDEzIDE2OjQ1OjEzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJTW90b3JvbGEgODgwMDAgcG9ydCB3aXRob3V0IHRlYXJzLCBJIG1lYW4gd2l0aG91dCB0ZGVzY3MuCisKKwkqIG04OGstdGRlcC5jOiAgQmxvdyBhd2F5IGFsbCB0ZGVzYyBzdHVmZi4KKwlQcm92aWRlIGZ1bmN0aW9ucyBmb3IgYWxsIHRoZSBmcmFtZS1yZWxhdGVkIG1hY3JvcyBpbgorCXRtLWRlbHRhODguaC4gIEFkb3B0IGk5NjAtc3R5bGUgRVhUUkFfRlJBTUVfSU5GTy4KKwkoZXhhbWluZV9wcm9sb2d1ZSwgZnJhbWVfZmluZF9zYXZlZF9yZWdzLCBza2lwX3Byb2xvZ3VlKTogIGJvcnJvdworCWZyb20gaTk2MC10ZGVwLmMgYW5kIGFkYXB0IHRvIHRoZSBmdW5jdGlvbiBwcm9sb2d1ZXMgb24gdGhlIDg4ay4KKwkocmVhZF9uZXh0X2ZyYW1lX3JlZyk6ICBCb3Jyb3cgZnJvbSBtaXBzLXRkZXAuYy4KKwlGSVhNRTogIGZyYW1lX2xvY2Fsc19hZGRyZXNzIHNob3VsZCBnbyBhd2F5LgorCisJKiB0bS1kZWx0YTg4Lmg6ICBEdW1wIGFsbCB0aGUgdGRlc2Mgc3R1ZmYuCisJTWFjcm9zIGZvciBhbGwgZnJhbWUtcmVsYXRlZCBzdHVmZiBjYWxsIGZucyBvZiBzYW1lIG5hbWUuCisJUmVtb3ZlIGR1cGxpY2F0ZWQgZGVmaW5pdGlvbnMuICBGUF9SRUdOVU0gYmVjb21lcyBzYW1lIGFzCisJU1BfUkVHTlVNLiAgCisKKwkqIHhtLTg4ay5oOiAgRWxpbWluYXRlIGxvdHMgb2YgbGlicmFyeSBkZXBlbmRlbmNpZXMsIG5vdyBoYW5kbGVkCisJaW4gbGliaWJlcnR5LiAgRWxpbWluYXRlIEtEQiBub25zdXBwb3J0LgorCisJKiBkb2MvZ2RiaW50LnRleGluZm86ICBBZGQgcnVkaW1lbnRzIG9uIGZyYW1lcy4gIEZJWE1FLCBhZGQgbW9yZS4KKworCisJKiBzdGFjay5jIChmcmFtZV9pbmZvKTogIE1hcmsgZnJhbWVsZXNzIGZ1bmN0aW9ucy4KKwlQcmludCBsb2NhbHMgYWRkcmVzcyAoRklYTUUsIHJlbW92ZSBpZiBzYW1lKS4KKwkqIGJsb2NrZnJhbWUuYzogIENvbW1lbnQgY2hhbmdlcywgRklYTUUgYWZ0ZXIuCisJKiBjb2ZmcmVhZC5jOiAgRXZlbiB3aXRob3V0IFRERVNDLCBuZWVkIHRvIHphcCAiQCIgc3ltYm9scy4KKwlEb24ndCByZWdpc3RlciBmb3Igd2llcmQgZm9ybWF0IG5hbWVzOyBjaGFuZ2UgdGhlIG5hbWVzIGluIEJGRC4KKworCSogYWxsb2NhLmMsIGxhbmd1YWdlLmMsIHRkZXNjLmM6ICBMaW50LgorCSogdGRlc2MuYywgdGRlc2MtbGliOiBGSVhNRTogIHJlbW92ZSB0aGVzZS4KKworVHVlIE5vdiAxMiAxOTozMDoyMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBBZGQgdGRlc2MgbGlicmFyeSBzdXBwb3J0LiAgRml4dXBzIHRvIGxpbnQsCisJY29weWluZy5jIHJ1bGVzLgorCitUdWUgTm92IDEyIDEzOjQzOjI2IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBzeW10YWIuYyAoZGVjb2RlX2xpbmVfMSk6ICBSZW1vdmUgc3B1cmlvdXMgY2FsbCB0byBvcGVyYXRvcl9jaGFycy4KKworCUFsbG93IHNldHRpbmcgYnJlYWtwb2ludHMgb24gQysrIGRlc3RydWN0b3JzLgorCSogdmFsb3BzLmMgKGRlc3RydWN0b3JfbmFtZV9wKTogIERvbid0IGNoZWNrIFRZUEVfSEFTX0RFU1RSVUNUT1IsCisJc2luY2UgaXQgbGllcy4gIFJlbHkgb24gY2FsbGVycyB0byBjYXRjaCBtaXNzaW5nIGRlc3RydWN0b3JzLgorCSogc3ltdGFiLmMgKGRlY29kZV9saW5lXzEpOiAgRm9yIGV4YW1wbGUgKHNlZSBhYm92ZSksIGhlcmUuCisJKiBidWlsZHN5bS5jLCBzeW10YWIuaDogIFJlbW92ZSBUWVBFX0ZMQUdTX0hBU3tDT04sREV9U1RSVUNUT1IKKwlmbGFncyBzaW5jZSB0aGV5IGFyZSBubyBsb25nZXIgdXNlZC4KKworCUZpeGVzIHRvIHN1cHBvcnQgQysrIG1ldGhvZHMgd2l0aCBmdW5jdGlvbmFsIHBhcmFtZXRlcnMuCisJKiBjLWV4cC55IChmdW5jX21vZCBydWxlKTogIEFsbG93IChhbmQgaWdub3JlKSBsaXN0IG9mIHBhcmFtZXRlcgorCXR5cGVzIGluIGEgZnVuY3Rpb24gdHlwZS4KKwkqIGV2YWwuYyAocGFyc2VfYW5kX2V2YWxfdHlwZSksIHZhbHVlLmg6ICBOZXcgZnVuY3Rpb24sCisJcGFyc2VfYW5kX2V2YWxfdHlwZSwgaXMgYmFzZWQgb24gb2xkIGNvZGUgZnJvbSBjaGVja19zdHViX21ldGhvZC4KKwlCdXQgZG9uJ3QgYWN0dWFsbHkgZXZhbHVhdGUgdGhlIGNhc3QsIHNpbmNlIHRoYXQgY2FsbHMKKwl2YWx1ZV9jYXN0KCksIHdoY2loIG1heSBmYWlsLiAgSnVzdCBleHRyYWN0IHRoZSB0eXBlCisJZnJvbSB0aGUgcGFyc2VkIGV4cHJlc3Npb24uCisJKiB2YWx1ZXMuYyAoY2hlY2tfc3R1Yl9tZXRob2QpOiAgV2hpbGUgbG9vcGluZyB0aHJvdWdoIHRoZQorCWFyZ3VtZW50cywgYWRqdXN0IGRlcHRoICphZnRlciogcGFyYW1ldGVyIGhhcyBiZWVuIGhhbmRsZWQuCisJUmVwbGFjZSBjYWxsIGFuZCBzZXR1cCBvZiBwYXJzZV9hbmRfZXZhbCB3aXRoIG5ldyBmdW5jdGlvbgorCXBhcnNlX2FuZF9ldmFsX3R5cGUuCisKK1R1ZSBOb3YgMTIgMDk6NDA6MDcgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIHV0aWxzLmMsIHJlbS1tdWx0aS5zaGFyOiAgUmVtb3ZlIGZpeGVkIGFyZyBjb3VudCB2ZXJzaW9uIG9mCisJY29uY2F0KCkuCisKKwkqIGFsdG9zLXhkZXAuYywgYXJtLXhkZXAuYywgY29mZnJlYWQuYywgY29tbWFuZC5jLCBjb252ZXgteGRlcC5jLAorCWNvcmUuYywgZHdhcmZyZWFkLmMsIGdvdWxkLXhkZXAuYywgaW5mY21kLmMsIGxhbmd1YWdlLmMsCisJbTg4ay14ZGVwLmMsIG1haW4uYywgcHJpbnRjbWQuYywgcHlyLXhkZXAuYywgc291cmNlLmMsCisJc3VuMzg2LXhkZXAuYywgc3ltbS14ZGVwLmMsIHVtYXgteGRlcC5jLCB2YWx1ZXMuYywgeGNvZmZyZWFkLmM6CisJQ2hhbmdlIGFsbCBpbnN0YW5jZXMgb2YgdXNlIG9mIGZpeGVkIGFyZ3MgY29uY2F0KCkgdG8gdmFyaWFibGUKKwlhcmdzIGNvbmNhdCgpIG5vdyBsb2NhdGVkIGluIGxpYmliZXJ0eS4KKworVHVlIE5vdiAxMiAwNzoyMzo0NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBBZGQgeGNvZmZyZWFkLmMsIHhjb2ZmZXhlYy5jLgorCSogeGNvZmZyZWFkLmM6ICBOZXcgZmlsZSBmb3IgaGFuZGxpbmcgQUlYIG1hbmdsZWQtY29mZiBmaWxlcy4KKwkqIHhjb25maWcvcnM2MDAwLCB0Y29uZmlnL3JzNjAwMDogIE5ldyBmaWxlcy4KKwkqIGJ1aWxkc3ltLmM6ICBBZGQgaG9va3MgZm9yIHhjb2ZmcmVhZC5jLgorCSogcnM2MDAwLXBpbnNuLmMsIHJzNjAwMC10ZGVwLmMsIHJzNjAwMC14ZGVwLmMsIHRtLXJzNjAwMC5oLAorCXhtLXJzNjAwMC5oLCByczZrLW9wY29kZS5kZWYsIHJzNmstb3Bjb2RlLmg6ICBOZXcgZmlsZXMuCisJKiB4Y29mZmV4ZWMuYzogIE5ldyBmaWxlIGZvciBoYW5kbGluZyBBSVggc2hhcmVkIGxpYnJhcmllcy4KKworTW9uIE5vdiAxMSAxOToxNDozMSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogY29yZS5jOiAgTWlub3IgcmV3b3JkaW5nIG9mIG1lc3NhZ2UgdG8gdXNlciBjb250YWluaW5nIG5hbWUgb2YKKwkoYW5kIHBvc3NpYmx5IGFyZ3VtZW50cyB0bykgdGhlIHByb2dyYW0gdGhhdCBnZW5lcmF0ZWQgYSBjb3JlCisJZmlsZS4KKworCSogZWxmcmVhZC5jOiAgUmVtb3ZlIHRoZSByZWdpc3Rlcl9hZGRyKCkgc3R1YiBub3cgdGhhdCBpdCBpcyBubworCWxvbmdlciBuZWVkZWQuCisKKwkqIHByb2Nmcy5jOiAgTW92ZSBtaXNwbGFjZWQgI2VuZGlmIGZvciBBVFRBQ0hfREVUQUNILiAgQWRkIG5ldworCWZldGNoX2NvcmVfcmVnaXN0ZXJzKCkgZnVuY3Rpb24gZm9yIGNvcmUgZmlsZSBzdXBwb3J0LgorCitTYXQgTm92ICA5IDEzOjM3OjU3IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBkd2FyZnJlYWQuYyAoZHdhcmZfcHN5bXRhYl90b19zeW10YWIpOiAgUmVtb3ZlIGxlZnRvdmVyIGNhbGwKKwl0byBkb19jbGVhbnVwcygpIHdoaWNoIHJlc3VsdGVkIGZyb20gYSBwcmV2aW91cyBjaGFuZ2UuCisKKwkqIGVsZnJlYWQuYzogIFJlLWVuYWJsZSBjb21waWxhdGlvbiBvZiByZWdpc3Rlcl9hZGRyKCkgc3R1YgorCXdoZW5ldmVyIGl0IGlzIG5vdCBzdXBwbGllZCBieSBjb3JlZGVwLmMKKworU2F0IE5vdiAgOSAwMDo0MDozMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCUFkZCB0cmFja2luZyBvZiBvYmplY3QgZmlsZXMgKHRoYXQgY29udGFpbiBzeW1ib2xzKSB0byBnZGIuCisJVGhpcyBpbmNsdWRlcyBhICJzdHJ1Y3Qgb2JqZmlsZSIgdGhhdCBvd25zIHN5bXRhYnMgYW5kIHBzeW10YWJzCisJdGhhdCB3ZXJlIHJlYWQgaW4gZnJvbSB0aGF0IGJpbmFyeSBmaWxlLgorCisJKiBzeW1maWxlLmg6ICBBZGQgc3RydWN0IG9iamZpbGUuICBBZGQgcG9pbnRlciB0byB0aGUgb2JqZmlsZQorCWludG8gdGhlIHN0cnVjdCBzeW1fZm5zLgorCVJlcGxhY2UgZ2xvYmFsIGBzeW1maWxlJyBhbmQgYHN5bWZpbGVfbXRpbWUnIHdpdGgKKwlgc3ltZmlsZV9vYmpmaWxlJy4gIEFkZCBnbG9iYWwgb2JqZWN0X2ZpbGVzIGNoYWluLgorCisJKiBzeW1maWxlLmM6ICBNb3ZlIHBhcmFtLmggYWJvdmUgc3ltdGFiLmguCisJKHNvcnRfbWlzY19mdW5jdGlvbl92ZWN0b3IpOiAgQWRkLgorCShzeW1zX2Zyb21fb2JqZmlsZSk6ICBXYXMgc3ltc19mcm9tX2JmZC4KKwkoc3ltZmlsZV9vcGVuKTogIE5vdyByZXR1cm5zIG9iamZpbGUuCisJKGFsbG9jYXRlX29iamZpbGUpOiAgTmV3LgorCShmcmVlX29iamZpbGUpOiAgTmV3LCByZXBsYWNpbmcgZnJlZV9hbGxfLipzeW10YWJzLgorCShzeW1maWxlX2luaXQpOiAgVGFrZXMgb2JqZmlsZSBhcmcsIHB1dHMgaXQgaW4gc3ltX2ZucyByZXN1bHQuCisJKHJlcmVhZF9zeW1ib2xzKTogIFNlYXJjaGVzIHdob2xlIGNoYWluIG9mIG9iamZpbGVzLgorCShhbGxvY2F0ZV9zeW10YWIpOiAgVGFrZXMgb2JqZmlsZSBhcyBuZXcgcGFyYW1ldGVyLCBjaGFpbnMgdGhlbS4KKwlIYW5kbGUgSU5JVF9FWFRSQV9TWU1UQUJfSU5GTy4KKwkoZnJlZV9hbGxfcHN5bXRhYnMsIGZyZWVfYWxsX3N5bXRhYnMpOiAgTW92ZSBoZXJlIGZyb20gc3ltbWlzYy5jLgorCisJKiBkYnhyZWFkLmM6ICBNYWtlIG1vcmUgZXJyb3JzIGludG8gY29tcGxhaW50cy4KKwkocHVzaF9zdWJmaWxlLCBwb3Bfc3ViZmlsZSk6ICBNb3ZlIHRvIGJ1aWxkc3ltLmMuCisJKGRieF9zeW1maWxlX3JlYWQsIGRieF9zeW1maWxlX2luaXQsIGZpbGxfc3ltYnVmLCByZWFkX2RieF9zeW10YWIsCisJc3RhcnRfcHN5bXRhYiwgcHN5bXRhYl90b19zeW10YWJfMSwgcmVhZF9vZmlsZV9zeW10YWIsCisJZGJ4X3BzeW10YWJfdG9fc3ltdGFiLCApOiAgVXNlIGJmZCBvcHMsIGRvbid0IHVzZSBmaWxlIGRlc2NyaXB0b3IuCisJUGFzcyBvYmpmaWxlLiAgQ2hhbmdlIGNhbGxlcnMuCisJKGZpbGxfc3ltYnVmLCBTV0FQX1NZTUJPTCk6ICBUYWtlIGJmZCBhcyBhcmcuCisJKHJlYWRfZGJ4X3N5bXRhYik6ICBKdXN0IHdpcGUgb3V0IG5ldyBzeW1ib2xzLCBub3QgYWxsLCBvbiBlcnJvci4KKwkoZW5kX3BzeW10YWIpOiAgQmxvdyBhd2F5IHBzeW10YWIgaWYgZW1wdHkuCisJKHByb2Nlc3Nfc3ltYm9sX3BhaXIpOiAgU3dhbGxvdyBpbnRvIHJlYWRfb2ZpbGVfc3ltdGFiLgorCShwcm9jZXNzX29uZV9zeW1ib2wpOiAgVXNlIHB1c2hfY29udGV4dCBhbmQgcG9wX2NvbnRleHQuCisJKHZpcnR1YWxfY29udGV4dCk6ICBEZWxldGUgI2lmIDAnZCBvYnNvbGV0ZSBzdHVmZi4KKworCSogYnVpbGRzeW0uYyAoZW5kX3N5bXRhYik6ICBQYXNzIG9iamZpbGUuCisJKGRieF9sb29rdXBfdHlwZSk6ICBIYW5kbGUgbnVsbCB0eXBldmVjdG9yLgorCShkYnhfYWxsb2NfdHlwZSk6ICBDaGVjayBmaWxlIG51bWJlciwgbm90IHN5bSBudW1iZXIsIGZvciAtMS4KKwkoZmluZF9zeW1ib2xfaW5fbGlzdCk6ICBBZGQgZm9yIHhjb2ZmcmVhZC4KKwkoc3RhcnRfc3ltdGFiKTogIERlZmF1bHQgdHlwZXZlY3RvciBpcyBlbXB0eS4gIEtlZXAgcmV1c2luZyBzYW1lCisJY29udGV4dF9zdGFjay4KKwkoZW5kX3N5bXRhYik6ICBUYWtlIG9iamZpbGUgYXJndW1lbnQgYW5kIHBhc3MgaXQgdG8KKwlhbGxvY2F0ZV9zeW10YWIuICBEb24ndCBtYWtlIGEgc3ltdGFiIGlmIG5vIGJsb2NrcyBvciBzeW1ib2xzLgorCUhhbmRsZSBlbXB0eSB0eXBldmVjdG9yLgorCShwdXNoX2NvbnRleHQpOiAgTmV3IGZ1bmN0aW9uIGZvciBjb250ZXh0IHN0YWNrIG5lc3RpbmcuCisJKHJlYWRfdHlwZSk6ICBNYXJrIEZJWE1FIHdoZXJlIHdlIG5lZWQgdG8gcmVpbnRyb2R1Y2UgdHlwZSBzbWFzaGluZy4KKworCSogYnVpbGRzeW0uaCAocG9wX2NvbnRleHQpOiAgTWFjcm8sIHBhaXJlZCB3aXRoIHB1c2hfY29udGV4dC4KKwkoc3ViZmlsZV9zdGFjayk6ICBNb3ZlIGhlcmUgZnJvbSBkYnhyZWFkLmMuCisKKwkqIGNvZmZyZWFkLmMgKGVuZF9zeW10YWIsIHJlYWRfY29mZl9zeW10YWIpOiAgVGFrZSBhbmQgdXNlIG9iamZpbGUgYXJnLgorCShyZWFkX2NvZmZfc3ltdGFiKTogIENsZWFudXAgYnkgZnJlZWluZyBvYmpmaWxlLCBub3QgYWxsIHN5bXRhYnMuCisKKwkqIG1pcHNyZWFkLmMgKHJlYWRfbWlwc19zeW10YWIsIHBhcnNlX3BhcnRpYWxfc3ltYm9scywgcGFyc2VfZmRyLAorCW5ld19wc3ltdGFiLCBuZXdfc3ltdGFiKTogIFRha2UgYW5kIHVzZSBvYmpmaWxlIGFyZy4KKworCSogZHdhcmZyZWFkLmMgKHNjYW5fY29tcGlsYXRpb25fdW5pdHMsIHN0YXJ0X3BzeW10YWIsCisJcHJvY2Vzc19kaWVzLCBlbmRfc3ltdGFiLCBkd2FyZl9idWlsZF9wc3ltdGFicywKKwlyZWFkX2xleGljYWxfYmxvY2tfc2NvcGUsIHJlYWRfZnVuY19zY29wZSwgcmVhZF9maWxlX3Njb3BlKTogIFRha2UKKwlhbmQgdXNlIG9iamZpbGUgYXJndW1lbnQuCisJKHBzeW10YWJfdG9fc3ltdGFiXzEsIHJlYWRfb2ZpbGVfc3ltdGFiKTogIERvbid0IHRha2Ugb3IgdXNlIGZpbGUKKwlkZXNjcmlwdG9yLiAgVXNlIEJGRCBpbnRlcm5hbCBmdW5jdGlvbnMgaW5zdGVhZC4KKwkoZW5kX3N5bXRhYik6ICBDYWxsIGdsb2JhbCBhbGxvY2F0ZV9zeW10YWIuCisKKwkqIGVsZnJlYWQuYywgdGFyZ2V0LmM6ICBNaW5vciBjaGFuZ2VzIHRvIGFjY29tbW9kYXRlIG9iamZpbGVzLgorCSogc3ltdGFiLmg6ICBwYXJ0aWFsX3N5bWJvbF90YWJsZSBoYXMgbm8gc3ltZmlsZV9uYW1lIG1lbWJlciBub3cuCisJKGZuX2ZpZWxkbGlzdHMgdm9mZnNldCk6ICBhdm9pZCBub24taW50IGJpdGZpZWxkLgorCShzdHJ1Y3Qgc3ltdGFiKTogIEFkZCBvYmpmaWxlICogYW5kIG9iamZpbGVfY2hhaW4gKiBvZiBzeW10YWJzLgorCShzdHJ1Y3QgcGFydGlhbF9zeW10YWIpOiAgQWRkIG9iamZpbGUgKiBhbmQgb2JqZmlsZV9jaGFpbiAqIG9mCisJcHN5bXRhYnMuICBSZW1vdmUgc3ltZmlsZV9uYW1lLgorCisJKiBzeW1taXNjLmM6ICBMb3NlIGZyZWVfYWxsX3N5bXRhYnMsIGZyZWVfYWxsX3BzeW10YWJzLgorCShwcmludHN5bXNfY29tbWFuZCk6ICBSZW5hbWUgZnJvbSBwcmludF9zeW10YWJzLiAgQWRkIHNlbGVjdGl2ZQorCWxpc3RpbmcgaWYgMm5kIGFyZ3VtZW50IGdpdmVuLiAgUHJpbnQgb2JqZmlsZSBpbmZvLgorCShwcmludHBzeW1zX2NvbW1hbmQpOiAgUmVuYW1lIGZyb20gcHJpbnRfcGFydGlhbF9zeW10YWJzLiAgRGl0dG8gYWxsLgorCShwcmludG9iamZpbGVzX2NvbW1hbmQpOiAgTmV3OyBwcmludHMgb2JqZmlsZXMgbGlzdHMsIGFuZCBjaGVja3MKKwlmb3IgY29uc2lzdGVuY3kgb2Ygc3ltdGFiLCBwc3ltdGFiLCBhbmQgb2JqZmlsZSBsaXN0cy4KKworCSogc3ltZmlsZS5oLCBzeW1maWxlLmMsIHN5bXRhYi5oOiAgTGludAorCitGcmkgTm92ICA4IDIzOjM4OjQ4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBjb21tYW5kLmM6ICBJbmNsdWRlIHBhcmFtLmguCisJKiBkZWZzLmggKHdhcm5pbmdfc2V0dXAsIHdhcm5pbmcpOiAgRGVjbGFyZS4KKwkqIGV4cHByaW50LmMgKHByaW50X3N1YmV4cCwgVU5PUF9NRU1WQUwgY2FzZSk6ICBMaW50LgorCSogaW5mbG93LmMgKG5ld190dHkpOiAgVXNlIFVTRV9PX05PQ1RUWSAjZGVmaW5lLgorCSogbGFuZ3VhZ2UuYywgcHJpbnRjbWQuYyAocHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCksIHNpZ25hbWUuYywKKwlzdGFjay5jOiAgbGludC4KKworVGh1IE5vdiAgNyAxODoyNjoxNSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGxpbmsgd2l0aCBsaWJpYmVydHkgYWZ0ZXIgbGlicmVhZGxpbmUsIHNpbmNlCisJcmVhZGxpbmUgbWlnaHQgd2FudCBzb21ldGhpbmcgaW4gbGliaWJlcnR5LgorCSogbTg4ay14ZGVwLmM6IEZpeGVkIHRoZSByZWdpc3RlciBvZmZzZXRzIGluIHRoZSBwdHJhY2VfdXNlcgorCXN0cnVjdCBmb3IgQkNTIDg4ayBtYWNoaW5lcy4KKwkqIHhtLW04OGsuaDogZG9uJ3QgZGVmaW5lIFVTSVpFIGlmIGFscmVhZHkgZGVmaW5lZC4KKwkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgZGVsdGE4OCB0YXJnZXQuCisKK1RodSBOb3YgIDcgMDQ6NTE6MTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGFtMjlrLXBpbnNuLmMsIGFtMjlrLW9wY29kZS5oOiAgRml4IGRlY29kaW5nIG9mIG10YWNjLCBkbWFjLCBmbWFjLgorCisJKiB0bS0qLmg6ICBSZW1vdmUgUkVBRF9EQlhfRk9STUFULCBDT0ZGX0ZPUk1BVCwgYW5kCisJUkVBRF9NSVBTX0ZPUk1BVCwgd2hpY2ggaGF2ZSBiZWVuIHVudXNlZCBzaW5jZSBCRkQuICBTdGlsbAorCXJlbWFpbmluZyBpcyBDT0ZGX05PX0xPTkdfRklMRV9OQU1FUy4KKwkqIHRtLXN1bjMuaCwgdG0tYWx0b3MuaDogIFJlbW92ZSBkZXRyaXR1cyBhY2NpZGVudGFsbHkgbGVmdCBmcm9tCisJZnVuY3Rpb24gY2FsbGluZyBjb2RlIG1vdmVkIHRvIG02OGstdGRlcC5jLgorCitXZWQgTm92ICA2IDE3OjIxOjU5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBjb2ZmcmVhZC5jOiAgRWxpbWluYXRlIGNfbnN5bXMgaW4gZmF2b3Igb2YgY19uYXV4LgorCUNvbXBsYWluIGlmIG5vIGF1eGVudHMgb24gLmJmIGFuZCAuZWYgRkNOIHN5bWJvbHMsIGFuZCBhc3N1bWUKKwlsb3RzIG9mIGxpbmUgbnVtYmVycy4KKwkoaW5pdF9saW5lbm9zLCBlbnRlcl9saW5lbm9zKTogIFVzZSBhIHNlbnRpbmVsIGF0IHRoZSBlbmQgb2YgdGhlCisJcmVhZC1pbiBsaW5lbm9zLCB0byBtYWtlIGZvciBhIGZhc3QsIHNhZmUgbG9vcC1lbmQgdGVzdC4KKworV2VkIE5vdiAgNiAwMjo1NDowOCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQorCisJKiBjb2ZmcmVhZC5jIChyZWFkX2NvZmZfc3ltdGFiKTogY29mZnJlYWQgdXNlZCB0byByZWx5IG9uIHRoZQorCXhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vIGZpZWxkIGdpdmluZyB0aGUgIyBvZiBsaW5ub3MgaW4gYQorCWZ1bmN0aW9uLiBUd28gb2YgdGhlIGZvcm1hdHMgSSdtIHVzaW5nICgyOWsgYW5kIDg4aykgZG9uJ3Qgc2VlbSB0bworCXNldCBpdC4gVGhzIHBhdGNoIHRvIGZjbl9sYXN0X2xpbmUgYW5kIChlbnRlcl9saW5lbm9zKSBpcyBhbgorCWF0dGVtcHQgdG8gdXNlIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgbGlubm8gdGFibGUgaW4gdGhlIGZpbGUgdG8gc2V0CisJdGhlIG51bWJlciBvZiBsaW5lbm9zIHRvIHByb2Nlc3MuCisKK1R1ZSBOb3YgIDUgMjI6NDc6NDYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IHB1dCBhIC0gaW5mcm9udCBvZiB0aGUgbXYgeS50YWIuYyBjLWV4cC50YWIuYyBhbmQKKwltdiB5LnRhYi5jIG0yLWV4cC50YWIuYywgc28gdGhhdCBpZiBiaXNvbiBpcyB1c2VkLCBhbmQgdGhlIGZpbGVzCisJYXJlIGNyZWF0ZWQgaW4gcGxhY2UsIHNvIHRoZSBtdiBmYWlscywgdGhlbiB0aGUgbWFrZSBjb250aW51ZXMuCisKK1R1ZSBOb3YgIDUgMTY6NDc6NDcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwlBZGQgQysrIGFzIGEgc2VwYXJhdGUgbGFuZ3VhZ2UuCisJKiBkZWZzLmggKGVudW0gbGFuZ3VhZ2UpOiBBZGQgbGFuZ3VhZ2VfY3BsdXMuCisJKiBkd2FyZnJlYWQuYyAoZW5kX3N5bXRhYik6ICBTdXBwb3J0IGxhbmd1YWdlX2NwbHVzLgorCSogYy1leHAueTogIEFkZCBuZXcgc3RydWN0IGxhbmd1YWdlX2RlZm4gY3BsdXNfbGFuZ3VhZ2VfZGVmbi4KKwlEb24ndCBzZXQgYyB0byBiZSB0aGUgZGVmYXVsdCBsYW5ndWFnZSAoc2VlIG1haW4uYykuCisJKiBjLWV4cC55ICh5eWxleCk6ICBPbmx5IGxvb2sgZm9yIGZpZWxkIG9mIHRoaXMgaWYKKwlsYW5ndWFnZSBpcyBDKysuICAoRmlyc3QgZGlmZmVyZW5jZSBmcm9tIEMhKQorCSogbGFuZ3VhZ2UuYzogIEFkZCBjYXNlIGJyYW5jaGVzIGZvciBDKysgKGN1cnJlbnRseSwgYWxsCisJdGhlIHNhbWUgYXMgQykuICBBbHNvLCBhZGQgYysrIHRvICJ1c2FnZSIgbm90ZSBmb3IgInNldCBsYW5nIi4KKwkqIHZhbHByaW50LmMgKHR5cGVkZWZfcHJpbnQpLiAgQWRkIGNhc2UgYnJhbmNoZXMgZm9yIEMrKy4gCisJKiBtYWluLmMgKG1haW4pOiAgTmV3IHdheSB0byBzZXQgaW5pdGlhbCBsYW5ndWFnZTogIExvb2sgYXQKKwlmaWxlIGV4dGVuc2lvbiBvZiBwc3ltdGFiIGNvbnRhaW5pbmcgbWFpbigpLiAgKFNhbWUgYXMgd2UKKwlkbyBmb3Igc3ltdGFicywgYnV0IGF2b2lkIGxvYWRpbmcgdGhlIHN5bXRhYiB5ZXQuKQorCSogc3ltdGFiLmM6IE5ldyByb3V0aW5lIGZpbmRfbWFpbl9wc3ltdGFiKCksIHVzZWQgYnkgbWFpbigpCisJdG8gc2V0IGluaXRpYWwgbGFuZ3VhZ2UuCisJKiBzeW1maWxlLmMgKGFsbG9jYXRlX3N5bXRhYik6ICBNb3ZlIGNvZGUgZm9yIG1hcHBpbmcgZmlsZQorCWV4dGVuc2lvbnMtPiBsYW5ndWFnZXMgdG8gbmV3IGRlZHVjZV9sYW5ndWFnZV9mcm9tX2ZpbGVuYW1lKCkuCisKKwlGaXggYSBDKysgcHJvYmxlbSB3aGVuIGxvb2tpbmcgZm9yIG1ldGhvZHMgaW4gc3VwZXItY2xhc3Nlcy4KKwlUaGVyZSB3YXMgY29uZnVzaW9uIGJldHdlZW4gYmFzZSBhbmQgZGVyaXZlZCB0eXBlcy4KKwkqIHZhbG9wcy5jICh2YWx1ZV9mbl9maWVsZCk6ICBDaGFuZ2UgZnVuY3Rpb24gaW50ZXJmYWNlLgorCSogdmFsdWVzLmM6ICBVc2UgbmV3IHZhbHVlX2ZuX2ZpZWxkIGludGVyZmFjZS4KKworTW9uIE5vdiAgNCAxMDo0OTozMyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogaW5mcnVuLmM6ICBGaXhlZCB0eXBvIGluIGNvbW1lbnQuCisJKiB1dGlscy5jOiAgQWxsIHRoZSB2KmZwcmludGYgZW11bGF0aW9uIGlzIG5vdyBpbiBsaWJpYmVydHksCisJc28gd2UgY2FuIGdldCByaWQgb2Ygc29tZSBqdW5rLgorCSogeG0tc3VuM29zNC5oLCB4bS1zdW40b3M0LmgsIHhjb25maWcvZGVjc3RhdGlvbiwgeGNvbmZpZy9pMzg2c2NvLAorCXhjb25maWcvc3VuM29zNCwgeGNvbmZpZy9zdW40b3M0OiBEb25gdCBuZWVkIEhBVkVfU1RSU1RSIGFueSBtb3JlLgorCSogbTY4ay1waW5zbi5jIChwcmludF9pbnNuX2FyZyk6ICBTdXBwb3J0IEJCL0JXL0JMCisJdHlwZSBvcGVyYW5kcywgYXMgdXNlZCBieSBicmFuY2ggaW5zdHJ1Y3Rpb25zLgorCSogZ21hbGxvYy5jOiBGaXggcHJvdG90eXBlIG9mIG1lbWNweS4KKwkqIGVsZnJlYWQuYzogQ29tbWVudCBvdXQgcmVnaXN0ZXJfYWRkciwgc2luY2UgaXQgY29uZmxpY3RzCisJd2l0aCB0aGUgb25lIGluIGNvcmVkZXAuYy4KKwkqIGJ1aWxkc3ltLmg6ICBSZW1vdmUgZXh0ZXJuIGRlY2xhcmF0aW9ucyBvZiB0d28gZnVuY3Rpb25zCisJdGhhdCBhcmUgcmVhbGx5IHN0YXRpYyBpbiBidWlsZHN5bS5jLgorCSogdG0tbWlwcy5oOiBBZGQgc3ltYm9saWMgbmFtZXMgZm9yIG1vcmUgcmVnaXN0ZXJzLgorCSogbWlwcy14ZGVwLmMgKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6IFVzZSBuZXcgcmVnaXN0ZXIgbmFtZXMuCisJKiB4bS1taXBzLmg6IFNpbXBsaWZ5IFJFR0lTVEVSX1VfQUREUiwgc2luY2UgaXQgaXMgbm93CisJb25seSB1c2VkIGZvciBjb3JlIGZpbGVzLCBub3QgcHRyYWNlLiAgVGhlcmVmb3JlLAorCXRoZSBLRVJORUxfVV9BRERSIGhhY2sgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKwlUaGUgbWFwcGluZyB0byBwdHJhY2UgbnVtYmVyIGlzIG5vdyBpbiBpbiBtaXBzLXhkZXAuYy4KKwkqIG1pcHMteGRlcC5jOiAgRGVmaW5lIFJFR0lTVEVSX1BUUkFDRV9BRERSICh1c2luZyB0aGUKKwltYXBwaW5nIGZyb20gdGhlIG9sZCBSRUdJU1RFUl9VX0FERFIpLCBhbmQgdXNlIGl0CisJaW4ge2ZldGNoLHN0b3JlfV9pbmZlcmlvcl9yZWdpc3RlcnMuCisJKiBtaXBzcmVhZC5jOiBSZW5hbWUgI2luY2x1ZGUgZWNvZmYuaCB0byBuZXcgbmFtZSBjb2ZmLW1pcHMuaC4KKwkqIG1pcHMtdGRlcC5jIChtaXBzX3B1c2hfZHVtbXlfZnJhbWUsIG1pcHNfcG9wX2ZyYW1lKToKKwlTYXZlL3Jlc3RvcmUgRlAgcmVncyBjb3JyZWN0bHkgKD8pLgorCSogZGJ4cmVhZC5jOiBSZW1vdmUgZHVwbGljYXRlIGRlZmluZV9zeW1ib2wgYW5kIHR5cGVfc3lub255bV9uYW1lCisJKHRoZXNlIGhhZCBiZWVuIHByZXZpb3VzbHkgbW92ZWQgdG8gYnVpbGRzeW0uYykuCisJSGVuY2UsIGRlZmluZV9zeW1ib2wgYmVjb21lcyBleHRlcm4gaW5zdGVhZCBvZiBzdGF0aWMuCisJKiBidWlsZHN5bS5jIChyZWFkX3N0cnVjdF90eXBlKTogIENvbW1lbnQgb3V0IGJvZ3VzIGhhbmRsaW5nCisJb2YgQysrIG9wZXJhdG9yIG1ldGhvZHMuICBNaW5vciBoYWNraW5nIG9mIHJlYWRpbmcgb2YgY2xhc3MKKwljb250ZXh0cy4gTWFrZSBkZWZpbmVfc3ltYm9sIG5vbi1zdGF0aWMsIHNvIGRieHJlYWQuYyBjYW4gY2FsbCBpdC4KKworRnJpIE5vdiAgMSAxMTowNTo0NyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogbWlwc3JlYWQuYyAocmVhZF9taXBzX3N5bXRhYiwgcmVhZF90aGVfbWlwc19zeW10YWIpOiAgVXNlIHJlYWwKKwlmaWxlbmFtZSB3aXRoIGVycm9yIG1lc3NhZ2VzLgorCSogc3RhY2suYyAoZnJhbWVfc2VsZWN0X2NvbW1hbmQpOiAgUmVuYW1lIHRvIHNlbGVjdF9mcmFtZV9jb21tYW5kCisJdG8gYXZvaWQgImZyIiBhbmQgImZyYSIgaGF2aW5nIG5vbnVuaXF1ZSBjb21wbGV0aW9ucy4KKwkqIHN5bWZpbGUuYyAoc29ydF9zeW10YWJfc3ltcyk6ICBJZ25vcmUgc29ydCBvZiB6ZXJvIHN5bXRhYiAqLgorCShzeW1maWxlX2luaXQpOiAgUHJpbnQgZmlsZSBmb3JtYXQgbmFtZSB3aGVuIHVuYWJsZSB0byBoYW5kbGUgaXQuCisJKGZyZWVfbmFtZWRfc3ltdGFicyk6ICBVc2UgQkxPQ0tWRUNUT1IgcmF0aGVyIHRoYW4gb2Jzb2xldGUgQkxPQ0tMSVNULgorCSogc3ltbWlzYy5jIChmcmVlX3N5bXRhYik6ICBPbmx5IGZyZWUgbGluZXRhYmxlIGlmIG5vbnplcm8uCisJKiBzeW10YWIuaDogIFJlbW92ZSBvYnNvbGV0ZSBCTE9DS0xJU1QgbWFjcm9zLgorCitUaHUgT2N0IDMxIDE4OjEyOjQzIDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBhbm90aGVyIHN0ZXBpL25leHRpIGZpeC4gIEVuc3VyZQorCXRoYXQgc3RvcF9zdGVwIGlzIDEgYXQgYm90dG9tIG9mIG1haW4gbG9vcC4gIEkgZG9uJ3Qga25vdyB3aHkgdGhpcworCW5lZWRzIHRvIGJlIGRvbmUsIGJ1dCBpdCBoZWxwcyBtZSBzbGVlcCBiZXR0ZXIgYXQgbmlnaHQuCisKK1N1biBPY3QgMjcgMTg6MTg6MzkgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogbWFpbi5jIChpbml0aWFsaXplX2hpc3RvcnkpOiAgUmVhZCBoaXN0b3J5IGFmdGVyIHJlYWRpbmcgYWxsCisJaW5pdCBmaWxlcy4KKworU3VuIE9jdCAyNyAxNDowOToyNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogYnVpbGRzeW0uYzogIEJyZWFrIG91dCBpbml0aWFsIG1hbGxvYyBzaXplcy4KKwkocmVjb3JkX2xpbmUpOiAgUmVjb3JkIGRpcmVjdGx5IGluIGEgc3ViZmlsZS4gIEFsbG9jIG9uIGRlbWFuZC4KKwkoY29tcGFyZV9saW5lX251bWJlcnMpOiAgQWRkIGZyb20geGNvZmZyZWFkLmMuCisJKGVuZF9zeW10YWIpOiAgTmV3IHBhcmFtcyBzYXkgd2hldGhlciB0byBzb3J0IHBlbmRpbmdzIGFuZAorCWxpbmV0YWJsZS4gIFBhdGNoIGJsb2NrIHN0YWJzIGlmIGRlZmluZWQuICBTaHJpbmsgbGluZXRhYmxlIGJlZm9yZQorCWFsbG9jYXRpbmcgdGhlIHN5bXRhYi4KKwkqIGJ1aWxkc3ltLmg6ICBEZWxldGUgbGluZV92ZWN0b3IqIGFuZCBwcmV2X2xpbmVfbnVtYmVyLiAgQWRkIAorCWdsb2JhbF9zdGFicyBhbmQgZmlsZV9zdGFicyBmb3IgeGNvZmZyZWFkLgorCSogZGJ4cmVhZC5jIChzdGFydF9zdWJmaWxlKTogIE1vdmUgdG8gYnVpbGRzeW0uICBDaGFuZ2UgYWJvdmUgY2FsbHMuCisJKiBzeW10YWIuaDogIExJTkVUQUJMRShzeW10YWIpIGNhbiBub3cgYmUgbnVsbC4gIFphcCBMSU5FTElTVC4KKwkqIHN5bW1pc2MuYywgc3ltdGFiLmM6ICBDb3BlIHdpdGggbnVsbCBMSU5FVEFCTEVzLgorCisJKiBibG9ja2ZyYW1lLmM6ICBQYXNzIGZyb21sZWFmIHRvIElOSVRfRVhUUkFfRlJBTUVfSU5GTy4KKwkqIHRtLTI5ay5oLCB0bS04OGsuaCwgdG0taTk2MC5oLCB0bS1pcml4My5oLCB0bS1taXBzLmgsIHRtLXB5ci5oLAorCXRtLXNwYXJjLmg6ICBBY2NlcHQgZnJvbWxlYWYgcGFyYW1ldGVyLgorCSogYy1leHAueSAoeXllcnJvcik6ICBQYXNzIGVycm9yIG1lc3NhZ2UgaWYgZ2l2ZW4uCisJKiBjb25maWd1cmUuaW46ICBBZGQgcnM2MDAwIGhvc3QgYW5kIHRhcmdldC4KKwkqIGluZmxvdy5jIChuZXdfdHR5KTogIE9fTk9DVFRZIGtsdWRnZSBmb3IgUlMvNjAwMC4KKwkqIHN5bWZpbGUuaCAoZW50cnlfcG9pbnQpOiAgQWRkLgorCitTYXQgT2N0IDI2IDAwOjE2OjMyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWd1cy5jb20pCisKKwkqIGJ1aWxkc3ltLmM6ICBOZXcgZmlsZS4gIEJyZWFrcyBvdXQgc3ltYm9sLXRhYmxlLWJ1aWxkaW5nIHJvdXRpbmVzCisJZnJvbSBkYnhyZWFkLmMsIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCB3aXRoIHhjb2ZmcmVhZC5jLgorCSogYnVpbGRzeW0uaDogIE5ldyBmaWxlLiAgRGVjbGFyYXRpb25zIGZvciBidWlsZHN5bS5jIHVzZXJzLgorCSogZGJ4cmVhZC5jOiAgUmVtb3ZlIGxhcmdlIGNodW5rcyBpbnRvIGJ1aWxkc3ltLmMuCisJKiBNYWtlZmlsZS5pbjogIEFkZCBidWlsZHN5bS5jIGFuZCBidWlsZHN5bS5oLgorCisJKiBzeW1maWxlLmMgKHN5bXNfZnJvbV9iZmQpOiAgTmV3IHJvdXRpbmUuCisJKGFkZF9zeW1ib2xfZmlsZSk6ICBDYWxsIGl0IHRvIGRvIHRoZSByZWFsIHdvcmsuCisJKHN5bXNfZnJvbV9iZmQpOiAgSW5pdGlhbGl6ZSBlbnRyeV9wb2ludCBiZWZvcmUgY2FsbGluZyBzeW1maWxlX2luaXQuCisJKiBzeW10YWIuaCwgc3ltZmlsZS5jLCBjb2ZmcmVhZC5jLCBtaXBzcmVhZC5jLCBkd2FyZnJlYWQuYzoKKwlBdm9pZCBkZWNsYXJpbmcgb3Igc2V0dGluZyBlbnRyeV9wb2ludCAoc3ltZmlsZS5oICYgc3ltZmlsZS5jIGNvcGUpLgorCitGcmkgT2N0IDI1IDEwOjU4OjE2IDE5OTEgIE1hcmsgRWljaGluICAoZWljaGluIGF0IGN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jIChjcGx1cy1kZW1hbmdsZSk6IGFkZGVkIHN1cHBvcnQgZm9yIHRlbXBsYXRlcywgc3RhdGljCisJZGF0YSwgYW5kIHRoZSBuZXcgKGNvcnJlY3QpIG1hbmdsaW5nIGZvciBkZXN0cnVjdG9ycy4KKworCSogZHdhcmZyZWFkLmM6IChkd2FyZndhcm4pOiBjcmVhdGVkIGEgdmFyYXJncyB2ZXJzaW9uIG9mCisJZHdhcmZ3YXJuLCBmb3Igbm9uIF9fU1REQ19fIGNvbXBpbGVycy4KKworCSogYy1leHAueTogKHl5bGV4KTogYWRkZWQgbWF0Y2ggZm9yICJ0ZW1wbGF0ZSIgdG9rZW4uCisJKHR5cGViYXNlKTogYWRkZWQgVEVNUExBVEUgbmFtZSAnPCcgdHlwZSAnPicgY2xhdXNlLCBmb3IgZXhwbGljaXQKKwlzcGVjaWZpY2F0aW9uIG9mIHRlbXBsYXRlIHR5cGVzLgorCisJKiBzeW10YWIuYzogKGxvb2t1cF90ZW1wbGF0ZV90eXBlKTogbmV3IGZ1bmN0aW9uIGZvciBmaW5kaW5nCisJdGVtcGxhdGVzIGluIHN5bWJvbCB0YWJsZS4KKwkodHlwZV9uYW1lX25vX3RhZyk6IGNoYW5nZWQgdG8gZXhwbGljaXRseSBjaGVjayBmb3Igcy91L2UgYXQgdGhlCisJYmVnaW5uaW5nIG9mIHRoZSBzeW1ib2wgLSBpZiBpdCBpcyBhIHRlbXBsYXRlLCBub25lIG9mIHRoZXNlIHdpbGwKKwliZSB0aGVyZSAoYnV0IHRoZSBuYW1lIHdpbGwgc3RpbGwgY29udGFpbiBzcGFjZXMuKQorCitGcmkgT2N0IDI1IDE4OjU5OjMyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJVmFyaW91cyBmaXhlcyB0byBpbXByb3ZlIGcrKyBkZWJ1Z2dpbmcuCisJKiBzeW10YWIuaDogIEFkZCBpc19jb25zdCBhbmQgaXNfdm9sYXRpbGUgZmxhZ3MgZm9yIGVhY2ggbWV0aG9kLgorCVRoZXNlIGFyZSBiaXQgZmllbGRzIC0gdGFrZSB0aGVpciBzcGFjZSBmcm9tIHZvZmZzZXQsCisJd2hpY2ggc2hyaW5rcyB0byAzMCBiaXRzLiAgU2luY2Ugdm9mZnNldCBpcyBub3cgYSBiaXRmaWVsZCwKKwltYWtlIGl0IHVuc2lnbmVkIGZvciBwb3J0YWJpbGl0eS4gIFRoaXMgY2hhbmdlcyBpdHMgaW50ZXJwcmV0YXRpb24KKwlzbGlnaHRseTogIFN0YXRpYyBtZXRob2RzIG5vdyBoYXZlIHZvZmZzZXQgMSBpbnN0ZWFkIG9mIC0xLAorCWFuZCB2aXJ0dWFsIG9mZnNldHMgc3RhcnQgYXQgMiwgbm90IDEuCisJKiBzeW10YWIuYzogIFJlbmFtZWQgZ2RiX21hbmdsZV90eXBlbmFtZSB0byBnZGJfbWFuZ2xlX25hbWUsCisJc2luY2UgaXQgbm93IHJldHVybnMgYW4gZW50aXJlIG1hZ2xlZCBtZXRob2QgbmFtZSwgbm90IGp1c3QKKwl0aGUgdHlwZSBwYXJ0LiAgVGhpcyBhdm9pZHMgc29tZSBkdXBsaWNhdGlvbi4KKwlJdCBhbHNvIGFsbG93cyB1cyB0byBjb3JyZWN0bHkgbWFuZ2xlIGNvbnN0IGFuZCB2b2xhdGlsZQorCW1ldGhvZHMgKHVzaW5nIHRoZSBuZXcgaXNfY29uc3QgYW5kIGlzX3ZvbGF0aWxlIGJpdCBmaWVsZHMKKwltZW50aW9uZWQgYWJvdmUpLgorCSogdmFscHJpbnQuYyAodHlwZV9wcmludF9iYXNlKSwgdmFsdWVzLmMgKGNoZWNrX3N0dWJfbWV0aG9kKToKKwlTaW1wbGlmeSBieSB1c2luZyBuZXcgZ2RiX21hbmdsZV9uYW1lLgorCSogdmFsdWVzLmMgKHZhbHVlX2hlYWRvZik6ICBGaXggdG8gY29ycmVjdGx5IGhhbmRsZSBzaW5nbGUKKwlpbmhlcml0YW5jZSAoYWN0dWFsbHkgdHdvIGZpeGVzLCBlaXRoZXIgb2Ygd2hpY2ggc3VmZmljZXMpLgorCSogZGJ4cmVhZC5jIChyZWFkX3N0cnVjdF90eXBlKTogIEhhbmRsZSBjb25zdCBhbmQgdm9sYXRpbGUKKwltZXRob2Qgc3BlY2lmaWVycy4KKwkqIGRieHJlYWQuYyAocmVhZF9zdHJ1Y3RfdHlwZSk6ICBZZXQgb25lIG1vcmUgcGxhY2Ugd2hlcmUKKwl3ZSBtdXN0IGhhbmRsZSAnXFwnIGNvbnRpbnVhdGlvbnMuCisJKiB2YWxwcmludC5jICh2dGJsX3B0cl9uYW1lKTogQWRkIGZpbmFsICdcMCcuCisKK0ZyaSBPY3QgMjUgMTY6MDY6MzggMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogdG0tc3BhcmMuaCwgdG0tNjhrLmggKEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKTogIGZpeCBvdXRwdXQgb2YKKwlzaG9ydCByZXR1cm4gdmFsdWVzIGZvciBzcGFyYyBhbmQgNjhrLiAgUGF0Y2ggZnJvbSBQYXVsIEVnZ2VydC4KKworCSogY29mZnJlYWQuYywgY29yZWRlcC5jLCBpMzg2LXhkZXAuYzogIGluc3RhbGwgcGF0Y2hlcyBmb3IKKwlTeXNWLzM4NiAzLjIgZnJvbSBNYXVybyBEZVBhbG1hLgorCitGcmkgT2N0IDI1IDAyOjAyOjEzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBjb3JlLmMgKGNvcmVfZmlsZV9pbmZvKSwgZXhlYy5jIChleGVjX2ZpbGVfaW5mbyk6ICBQcmludCBmaWxlCisJdHlwZS4gIFVzZSBwcmludGZfZmlsdGVyZWQuCisKKwkqIHZhbG9wcy5jICh2YWx1ZV9mZXRjaF9sYXp5KTogIEF2b2lkIDAtbGVuZ3RoIGZldGNoZXMuCisKK1RodSBPY3QgMjQgMjM6MDY6NDAgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIGR3YXJmcmVhZC5jOiAgQWRkIGNhc3RzIHRvIHJlbW92ZSBjb21waWxlciB3YXJuaW5ncy4KKworCSogdG0tM2IxLmgsIHRtLTY4ay5oLCB0bS1hbHRvcy5oLCB0bS1hbWl4LmgsIHRtLWhwMzAwYnNkLmgsCisJdG0taHAzMDBocHV4LmgsIHRtLWlzaS5oLCB0bS1uZXdzLmgsIHRtLXBuLmgsIHRtLXN1bjIuaCwKKwl0bS1zdW4zLmg6ICBSZW1vdmUgbG9jYWxseSBkdXBsaWNhdGVkIGNvZGUgZm9yIGNhbGxpbmcgZnVuY3Rpb25zCisJaW4gdGhlIGluZmVyaW9yLiAgVGhlIG9ubHkgZGlmZmVyZW5jZXMgd2VyZSBpbiB0aGUgc3BlY2lmaWMgdHJhcAorCXZlY3RvcnMgdXNlZCBhbmQgd2hldGhlciBvciBub3QgYW4gZnB1IHdhcyBwcmVzZW50LiAgVGhlc2UgYXJlCisJbm93IGhhbmRsZWQgYnkgYXBwcm9wcmlhdGUgZGVmaW5pdGlvbnMgb2YgQlBUX1ZFQ1RPUiBhbmQKKwlIQVZFXzY4ODgxIHJlc3BlY3RpdmVseS4gIE90aGVyIG1pbm9yIG9idmlvdXMgY2xlYW51cHMuCisKKwkqIHZhbG9wcy5jOiAgQ29ycmVjdCBhIG1pbm9yIG1pc3NwZWxsaW5nLgorCisJKiB1dGlscy5jOiAgUmVtb3ZlIGxvY2FsIEJTRC9VU0cgaGFja3MgdGhhdCBhcmUgbm93IGluIGxpYmliZXJ0eS4KKworCSogZHdhcmZyZWFkLmM6ICBSZW1vdmUgcHJvdG90eXBlIGZvciBkd2FyZndhcm4uICBEb2VzIG5vdCB3b3JrCisJd2l0aCA8dmFyYXJncy5oPi4KKworVGh1IE9jdCAyNCAwOTozMzo0NCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogc3RhY2suYyAoZnJhbWVfY29tbWFuZCk6ICBBbHdheXMgcHJpbnQuICBVc2UgbmV3CisJZnJhbWVfc2VsZWN0X2NvbW1hbmQgdG8gc2VsZWN0IGEgZnJhbWUgd2l0aG91dCBwcmludGluZy4JCisKKwkqIGR3YXJmcmVhZC5jOiAgVXNlIDx2YXJhcmdzLmg+LCBzaW5jZSA8c3RkYXJnLmg+IGlzIG5vdCBwb3J0YWJsZS4KKworVGh1IE9jdCAyNCAwMTozMjo1MSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworICAgICAgICAqIGR3YXJmcmVhZC5jOiBOZXcgZmlsZSBmb3IgRFdBUkYgZGVidWdnaW5nIGZvcm1hdCBzdXBwb3J0LgorCisJKiBlbGZyZWFkLmM6IE5ldyBmaWxlIGZvciBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0IHN1cHBvcnQuCisKKwkqIHByb2Nmcy5jOiBOZXcgZmlsZSBmb3IgU1ZSNCAvcHJvYyAocHJvY2VzcyBmaWxlIHN5c3RlbSkgc3VwcG9ydC4KKworCSogdG0tYW1peC5oLCB4bS1hbWl4LmgsIHRjb25maWcvYW1peCwgeGNvbmZpZy9hbWl4OiBOZXcgZmlsZXMgZm9yCisJQW1pZ2EgVU5JWCBzdXBwb3J0LgorCisJKiB4bS1zdnI0LmgsIHRtLXN2cjQuaDogTmV3IGZpbGVzIGZvciBTVlI0IHN1cHBvcnQuCisKKwkqIHhtLW02OGsuaDogTmV3IGZpbGUgZm9yIGhvc3QgbWFjaGluZXMgd2l0aCBtNjhrIGNwdS4KKworCSogTWFrZWZpbGUuaW46IEFkZCBlbGZyZWFkLmMgYW5kIGR3YXJmcmVhZC5jIHRvIFNGSUxFU19NQUlORElSLgorCUFkZCBlbGZyZWFkLm8gYW5kIGR3YXJmcmVhZC5vIHRvIE9CUy4KKworCSogc3ltZmlsZS5oOiBBZGQgImVsZiIgdG8gbGlzdCBvZiBzdXBwb3J0ZWQgZm9ybWF0cyBpbiBjb21tZW50LgorCisJKiBjLWV4cC55LCBkZWZzLmgsIHN5bXRhYi5oLCB2YWxwcmludC5jOiAgQWRkIHRocmVlIG5ldyBidWlsdGluCisJdHlwZXMgdG8gZ2RiLCBidWlsdGluX3R5cGVfbG9uZ19kb3VibGUsIGJ1aWx0aW5fdHlwZV9jb21wbGV4LCBhbmQKKwlidWlsdGluX3R5cGVfZG91YmxlX2NvbXBsZXguICBBZGQgYW5kIHVzZSBuZXcgVEFSR0VUX1NIT1JUX0JJVCwKKwlUQVJHRVRfSU5UX0JJVCwgVEFSR0VUX0xPTkdfQklULCBUQVJHRVRfRkxPQVRfQklULAorCVRBUkdFVF9ET1VCTEVfQklULCBUQVJHRVRfTE9OR19ET1VCTEVfQklULCBUQVJHRVRfQ09NUExFWF9CSVQsIGFuZAorCVRBUkdFVF9ET1VCTEVfQ09NUExFWF9CSVQsIGFzIHRoZSBzaXplcyBpbiBiaXRzIG9mIHRoZSBpbmRpY2F0ZWQKKwl0eXBlcyBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUgKGFsYSB0aGUgZXhpc3RpbmcgVEFSR0VUX0xPTkdfTE9OR19CSVQpLgorCisJKiBpbmZydW4uYzogIFdoZW4gdXNpbmcgU1ZSNCAvcHJvYyBpbnRlcmZhY2UgaW5zdGVhZCBvZiBwdHJhY2UoKSwKKwljYWxsIHByb2Nfc2V0X2V4ZWNfdHJhcCgpIHRvIHNldHVwIGNoaWxkIHRvIHN0b3AgYXQgZmlyc3QgaW5zdHJ1Y3Rpb24uCisKKwkqIGluZnRhcmcuYzogV2hlbiB1c2luZyBTVlI0IC9wcm9jIGludGVyZmFjZSwgY2FsbCBwcm9jX3dhaXQoKQorCXJhdGhlciB0aGFuIHdhaXQoKS4KKworCSogbTY4ay10ZGVwLmM6IEFkZCBuZXcgcm91dGluZXMgc3VwcGx5X2dyZWdzZXQoKSwgZmlsbF9ncmVnc2V0KCksCisJc3VwcGx5X2ZwcmVnc2V0KCksIGFuZCBmaWxsX2ZwcmVnc2V0KCksIHdoaWNoIGFyZSBtYWNoaW5lCisJZGVwZW5kZW50IHN1cHBvcnQgcm91dGluZXMgZm9yIFNWUjQgL3Byb2MgaW50ZXJmYWNlLgorCisJKiB1dGlscy5jOiBBZGQgd2FybmluZ19zZXR1cCgpIGFuZCB3YXJuaW5nKCkuICBXYXJuaW5nKCkgYmVoYXZlcworCXRoZSBzYW1lIGFzIGVycm9yKCkgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyBub3JtYWxseSByYXRoZXIgdGhhbgorCWp1bXBpbmcgYmFjayB0byBjb21tYW5kIGxldmVsLiAgTW9kdWxlcyB0aGF0IGRvbid0IHdhbnQgdG8gY2FsbAorCXdhcm5pbmcoKSBmb3Igc29tZSByZWFzb24sIGJ1dCB3YW50IHRvIHByb2R1Y2UgdGhlaXIgb3duIHdhcm5pbmdzLAorCWNhbiBjYWxsIHdhcm5pbmdfc2V0dXAoKSB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSB3YXkKKwl3YXJuaW5nKCkgYW5kIGVycm9yKCkgZGVhbCB3aXRoIHRoZSB0ZXJtaW5hbC4KKworCSogc3ltdGFiLmM6IE1ha2UgaW50ZXJuYWwgZXJyb3JzIHByb2R1Y2UgbW9yZSB1c2VmdWwgbWVzc2FnZXMuCisKKwkqIHRtLTY4ay5oOiBNb3ZlIGNvZGUgdGhhdCBpcyBkdXBsaWNhdGVkIGluIGFsbW9zdCBldmVyeSBzaW5nbGUKKwltNjhrIGJhc2VkIG1hY2hpbmUncyBjb25maWd1cmF0aW9uIGZpbGVzIHRvIHRoaXMgY29tbW9uIGZpbGUuCisJRHVwbGljYXRpb25zIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIHN0aWxsIG5lZWQgdG8gYmUgcmVtb3ZlZAorCShGSVhNRSkuCisKKwkqIGluZnJ1bi5jIChjaGlsZF9jcmVhdGVfaW5mZXJpb3IpOiBTeXN0ZW0gViB2ZXJzaW9ucyBtdXN0IGNhbGwKKwlzZXRwZ3JwKCkgd2l0aCBubyBhcmd1bWVudHMsIHRvIGNvbXBseSB3aXRoIHByb3RvdHlwaW5nIHR5cGljYWxseQorCWluIDx1bmlzdGQuaD4uCisKKwkqIG11bmNoOiBBZGQgc3VwcG9ydCBmb3IgU1ZSNCBzdHlsZSBubSBvdXRwdXQuCisKKwkqIGRieHJlYWQuYywgbWlwc3JlYWQuYyBzeW1taXNjLmMsIHN5bXRhYi5jOiAgUmVtb3ZlIHRoZSBvYmplY3QKKwlmaWxlIHNwZWNpZmljIGZpZWxkcyBmcm9tIHRoZSBwYXJ0aWFsIHN5bWJvbCB0YWJsZSBzdHJ1Y3R1cmUgYW5kCisJcmVwbGFjZSB0aGVtIHdpdGggYSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBmb3IgZWFjaCBkaWZmZXJlbnQKKwlmbGF2b3Igb2Ygb2JqZWN0IGZpbGUgcmVhZGVyIHRvIGluaXRpYWxpemUgYXBwcm9wcmlhdGVseS4KKworV2VkIE9jdCAyMyAwOTozODoyMCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogeGNvbmZpZy9zdW5bMzRdb3M0OiAgQWRkIG5vdGUgYWJvdXQgc3Ryc3RyIGJvdGNoIG9uIHN1bm9zNC4wLjNjCisJYW5kIHByZXZpb3VzLgorCisJKiBtaXBzcmVhZC5jIChmaXh1cF91bmRlZl90eXBlKTogIE5ldyBmdW5jdGlvbi4gIElmIGEgc3RydWN0IC8KKwl1bmlvbiAvIGVudW0gaXMgZGVmaW5lZCBpbiBhIGhlYWRlciBmaWxlIGJ1dCBub3doZXJlIGVsc2UgdXNlZCwKKwkoYnkgdHlwZWRlZmluZywgcG9pbnRlciByZWZlcmVuY2luZyBvciBkZWNsYXJhdGlvbikgdGhlIG1pcHNyZWFkIGNvZGUKKwlidWlsZHMgdGhlIGNvbXBsZXRlIHRyZWUgZm9yIHRoZSBzdHJ1Y3R1cmUgYnV0IGxlYXZlcyBpdHMgY29kZSBhcworCVRZUEVfQ09ERV9VTkRFRiBhcyBpdCBkb2Vzbid0IGtub3cgd2hhdCBraW5kIG9mIGFnZ3JlZ2F0ZSBpdCBpcy4KKwlHdWVzcyBpdHMgdHlwZSBiYXNlZCBvbiB0aGUgZGV0YWlscyBvZiB0aGUgbWVtYmVycy4KKworVHVlIE9jdCAyMiAxODowNDozMiAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiAgQ2hlY2sgcmV0dXJuIHZhbHVlIGZyb20KKwlmaW5kX3BjX2xpbmUuCisKK01vbiBPY3QgMjEgMTc6NDc6MDMgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogIGZpeCBzdGVwaS9uZXh0aSB0aGF0IHdhcyBicm9rZW4KKwlieSBteSBsYXN0IGVkaXQgdG8gdGhpcyByb3V0aW5lLgorCitNb24gT2N0IDIxIDE0OjI3OjQzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiB0bS1zdW4zLmggKEZJWF9DQUxMX0RVTU1ZKTogcHJvYmxlbSB3aXRoIGNyb3NzIGRlYnVnZ2luZy4KKwlGSVhfQ0FMTF9EVU1NWSBkb2VzIHVuYWxpZ25lZCBhY2Nlc3NlcyBhbmQvb3IgZm9yZ2V0cyB0byBieXRlIHN3YXAKKwl0aGUgdmFsdWVzIGJlZm9yZSBwdXR0aW5nIHRoZW0gaW50byB0aGUgZHVtbXkgY29kZS4gIChGcm9tIFBldGVyCisJU2NoYXVlcikKKworTW9uIE9jdCAyMSAxMDowNDozOSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IGFkZGVkIGVibW9uIHRhcmdldC4KKworV2VkIE9jdCAxNiAyMjo0OTo1OCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCUdEQi00LjIgcmVsZWFzZSEKKworCSogTWFrZWZpbGUuaW46ICBSb2xsIFZFUlNJT04gdG8gNC4yLgorCSogUkVBRE1FLCBUT0RPLCBXSEFUUy5ORVc6ICBVcGRhdGUuCisKKwkqIGNvcmUuYyAoY29yZV9vcGVuKTogIEltcHJvdmUgZXJyb3IgbWVzc2FnZSBmb3IgYmFkIGZpbGUuCisJUGFzcyAucmVnIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MgdG8gZmV0Y2hfY29yZV9yZWdpc3RlcnMgdG8gaGVscAorCWl0IGZpbmQgdGhlIHJlZ2lzdGVycyBpbiB0aGUgY29yZS1maWxlIGhlYWRlci4KKwkqIGNvcmVkZXAuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiAgVGFrZSBuZXcgYXJndW1lbnQsIHVzZSBpdCwKKwlhbmQgcGFzcyBpdCB0byByZWdpc3Rlcl9hZGRyIHRvIGxvY2F0ZSB0aGUgYmxvY2sgb2YgcmVnaXN0ZXJzLgorCSogeG0tbWlwcy5oOiAgVXBkYXRlIEtFUk5FTF9VX0FERFIgZm9yIG5ldyBzY2hlbWUuICBDbGVhbnVwIGEgYml0LgorCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYiwgcHJvY2Vzc19vbmVfc3ltYm9sKTogIEhhbmRsZQorCVNlcXVlbnQgTl9GTl9TRVEgbGlrZSBldmVyeWJvZHkgZWxzZSdzIE5fRk4uCisKKwkqIG1haW4uYzogIENpcmN1bXZlbnQgU0NPIGNjIGJ1ZyB3aXRoICNpZiAhIWRlZmluZWQoVVNHKS4KKwkqIHRtLWkzODZ2Lmg6ICAjZW5kaWYgZ3Vjay4KKwkqIHhjb25maWcvaTM4Nio6ICBSZW1vdmUgLURnZXRwYWdlc2l6ZSgpPTQwOTYga2x1ZGdlLgorCSogeGNvbmZpZy9pMzg2c2NvOiAgQWRkIEhBVkVfU1RSU1RSIHRvIGF2b2lkIEFOU0kgYmRlYXRoLgorCSogeGNvbmZpZy90YWhvZTogIEFkZCBSRUdFWCwgd2hpY2ggc2VlbXMgdG8gYmUgbWlzc2luZy4KKworCSogY29yZWRlcC5jOiAgQWRkIDxzeXMvdHlwZXMuaD4gZm9yIFNDT25peC4KKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltbnRhYik6ICBBdm9pZCBjb3JlZHVtcCBvbiBtYWxmb3JtZWQgZmlsZS4KKwkqIHByaW50Y21kLmMgKHByaW50X2Zvcm1hdHRlZCk6ICBGbHVzaCBvdXRwdXQgYmVmb3JlIGRpc2Fzc2VtYmx5LgorCitUdWUgT2N0IDE1IDIwOjEyOjMyIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIGRvYy9yZWZjYXJkLnRleCAoc2VjICJXb3JraW5nIEZpbGVzIik6IGNvbnNpc3RlbnQgbWV0YXZhcnMgYW5kCisJb3RoZXIgaW1wcm92ZW1lbnRzLCBkdWUgdG8gY29tbWVudHMgYnkgRnJhbudvaXMgUGluYXJkCisJKHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhKSAKKworCSogZG9jL2dkYi50ZXhpbmZvIChhcHBlbmRpeCAiSW5zdGFsbGluZyBHREIiKTogY2hhbmdlcyBpbgorCWNvbmZpZ3VyZSwgYW5kIGltcHJvdmVuZXRzIHJlbGF0ZWQgdG8gUGluYXJkJ3MgcmVmY2FyZCBjb21tZW50cworCitUdWUgT2N0IDE1IDA4OjQ1OjEyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJQ2hhbmdlcyBmcm9tIEZyZWQgRmlzaDoKKwkqIHRtLTY4ay5oIChGUElfUkVHTlVNKTogIEFkZC4KKwkqIGluZnJ1bi5jIChjaGlsZF9jcmVhdGVfaW5mZXJpb3IpOiAgZmx1c2ggc3Rkb3V0IGFuZCBzdGRlcnIKKwliZWZvcmUgZm9ya2luZy4KKwkqIGNvbmZpZ3VyZS5pbjogIEhhbmRsZSBhbWlnYWRvcywgYW1peCBob3N0cyBhbmQgdGFyZ2V0cy4KKwkqIGluZmxvdy5jOiAgSGFuZGxlIFRJT0NHTFRDX0JST0tFTiBmb3IgQW1pZ2EuCisKKwlGcm9tIEFuZHJlYXMgU2Nod2FiOgorCSogdmFsdWVzLmMgKHNob3dfY29udmVuaWVuY2UpOiAgVXNlIHByaW50Zl9maWx0ZXJlZC4KKwkqIG1haW4uYyAoZGVmaW5lX2NvbW1hbmQpOiAgQ2hlY2sgcmVzdWx0IG9mIGxvb2t1cF9jb21tYW5kIGZvcgorCWV4YWN0IG1hdGNoLgorCShlY2hvX2NvbW1hbmQpOiAgVXNlIHByaW50Zl9maWx0ZXJlZCwgYW5kIGZvcmNlIG91dHB1dCBvdXQuCisKKwkqIGRieHJlYWQuYyAocmVhZF9lbnVtX3R5cGUpOiAgQXZvaWQgTW9kdWxhLTIga2x1ZGdlIHRoYXQgYnJlYWtzIEMKKwlwcm9ncmFtcy4KKwkqIGkzODctdGRlcC5jIChkb3VibGVfdG9faTM4Nyk6ICBGaXggdHlwbyBmb3IgZG91YmxlX3RvX2llZWVfZXh0ZW5kZWQuCisJKiB1dGlscy5jIChfaW5pdGlhbGl6ZV91dGlscyk6ICBJZiAhSVNBVFRZLCBkb24ndCBwYWdpbmF0ZS4KKwkqIGNvbmZpZ3VyZS5pbiwgdGNvbmZpZy9kZWNzdGF0aW9uLCB4Y29uZmlnL2RlY3N0YXRpb246ICBSZW5hbWUKKwlkZWMzMTAwIHRvIGRlY3N0YXRpb24uCisKK01vbiBPY3QgMTQgMTM6Mzc6NTAgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKKworCSogZG9jL2dkYi50ZXhpbmZvOiBDYXRjaCB1cCB0byBjaGFuZ2VzIHJlY29yZGVkIGhlcmUgaW4gQ2hhbmdlTG9nCisJKG5vZGVzIENvbnRpbnVpbmcgYW5kIFN0ZXBwaW5nOyBNZW1vcnk7IFRhcmdldHMpIGNsYXJpZmljYXRpb25zCisJZHVlIHRvIExhcnJ5IEJyZWVkCisKK0ZyaSBPY3QgMTEgMjM6Mjc6MDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIHRtLXtpcml4MyxtaXBzLG5pbmR5OTYwLHBuLHN5bW1ldHJ5LHZ4OTYwfS5oOiAgTW92ZQorCVJFR0lTVEVSX1VfQUREUiB0byBjb3JyZXNwb25kaW5nIHhtLSBmaWxlLiAgU3VnZy4gYnkgUGV0ZXIgU2NoYXVlci4KKworCSogc3ltbWlzYy5jIChwcmludF9wYXJ0aWFsX3N5bXRhYnMpOiAgQWRkIHByaW50cHN5bXMgZGVidWcgY21kLgorCisJKiBtNjhrLXRkZXAuYyAobTY4a19wdXNoX2R1bW15X2ZyYW1lLCBtNjhrX3BvcF9mcmFtZSk6ICBBZGQKKwlnZW5lcmljIHJvdXRpbmVzIGZvciBjYWxsaW5nIGluZmVyaW9yIGZ1bmN0aW9ucy4KKworCSogYmxvY2tmcmFtZS5jIChpbnNpZGVfbWFpbl9zY29wZSwgaW5zaWRlX2VudHJ5X3Njb3BlKTogIE5ldy4KKworCSogY29weWluZy5hd2s6ICBGaWx0ZXIgZm9ybWZlZWRzIG91dCBvZiBjb3B5aW5nICYgd2FycmFudGVlLgorCU1ha2UgdGhlbSBhdmFpbGFibGUgYXMgYHNob3cgY29weWluZycgYW5kIGBzaG93IHdhcnJhbnRlZScgYWxzby4KKwkqIG1haW4uYyAocHJpbnRfZ251X2FkdmVydGlzZW1lbnQpOiAgQWR2dCBgc2hvdycgY29tbWFuZHMuCisKK1RodSBPY3QgMTAgMTc6MjU6NDcgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIG1hY2gzODYteGRlcC5jOiAgRXZlbiB3aGVuIGNyb3NzLWNvbXBpbGluZywgbGVhdmUgaW4gdGhlCisJY29yZS1maWxlIHJlYWRpbmcgY29kZS4KKwkqIGNvcmUuYyAoZ2V0X2NvcmVfcmVnaXN0ZXJzKTogIEF2b2lkIGNvcmVkdW1wIGlmIG5vIC5yZWcgc2VjdGlvbi4KKworV2VkIE9jdCAgOSAxNzowMzozNCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogbWlwc3JlYWQuYywgY29mZnJlYWQuYzogIGluaXRpYWxpc2UgVFlQRV9WUFRSX0ZJRUxETk8gdG8gLTEuCisJVGhpcyBhdm9pZHMgY29yZWR1bXBzIHVuZGVyIGBzZXQgcHJpbnQgb2JqZWN0IG9uJyBpbiB2YWx1ZV9oZWFkb2YKKwkoY2FsbGVkIGVycm9uZW91c2x5IGJ5IHZhbHVlX2Zyb21fdnRhYmxlX2luZm8pIGZvciBgcCAmc3RydWN0JworCW9yIGBwICpzdHJ1Y3QnLiAgRnJvbSBQZXRlciBTY2hhdWVyLgorCitNb24gT2N0ICA3IDAwOjA2OjUyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIFJvbGwgdmVyc2lvbiB0byA0LjEuMi4KKwkqIGRieHJlYWQuYzogIFVzZSBhb3V0NjQuaCwgbm90IGEub3V0LmdudS5oLiAgR2V0IGV4dGVybmFsIHN5bWJvbCBlbnRyeQorCXNpemUgZnJvbSBCRkQgKGJ1dCwgRklYTUUsIHdlIGRvbid0IHlldCByZWFkIGV4dGVybmFsIG5saXN0cydzIGFuZAorCWNvbnZlcnQgdGhlbSB0byBpbnRlcm5hbCBubGlzdHMncyBiZWZvcmUgaGFuZGxpbmcgdGhlbSAtLSB3ZSBzdGlsbAorCWFzc3VtZSB0aGV5IGhhdmUgdGhlIHNhbWUgc2l6ZSBhbmQgYWxpZ25tZW50LikgIFVzZSBTRVRfTkFNRVNUUklORworCWV2ZXJ5d2hlcmUgdXNlZnVsLgorCSogZXhlYy5jIChleGVjX2ZpbGVfY29tbWFuZCk6ICBNb3ZlIGRlYWQgY29mZi1lbmNhcHN1bGF0aW9uIGNvZGUKKwl0byBCRkQuCisJKiBtODhrLXRkZXAuYywgbTg4ay14ZGVwLmM6ICBSZW1vdmUgZW5jYXAgdGVzdCBhbmQgI2luYyA8YS5vdXQuaD4uCisKK0ZyaSBPY3QgIDQgMjI6MzA6MDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiwgdG0taTM4NnYuaCwgeG0taTM4NnYuaDogSW50ZWwgMzg2IE1hY2ggaG9zdCBwb3J0LgorCSogeG0taTM4Nm1hY2guaCwgbWFjaDM4Ni14ZGVwLmMsIHhjb25maWcvaTM4Nm1hY2g6ICBOZXcgZmlsZXMuCisKK0ZyaSBPY3QgIDQgMTc6MDQ6MzEgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwlNb3JlIHBhdGNoZXMgZnJvbSBQZXRlciBTY2hhdWVyIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT46CisJKiBtaXBzLXhkZXAuYyAoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogIERvbid0IHRyeSB0bworCXdyaXRlIHRoZSAocHNldWRvKSBGUC4KKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6ICBJbXByb3ZlZCBhbGdvcml0aG0gZm9yCisJc2V0dGluZyBwc3QtPnRleHRoaWdoLgorCitGcmkgT2N0ICA0IDE2OjQ3OjMyIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCisKKwkqIGRvYy9NYWtlZmlsZTogbWFrZSBURVhJTlBVVFMgaW5jbHVkZSAuIGV2ZXJ5d2hlcmUKKworRnJpIE9jdCAgNCAwMDozNTo1NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogY29mZnJlYWQuYywgZGJ4cmVhZC5jLCBzeW1maWxlLmMsIHN5bW1pc2MuYywgc3ltdGFiLmg6ICBSZW1vdmUKKwl2ZXN0aWdlcyBvZiB0eXBldmVjdG9ycywgd2hpY2ggd2VyZSBmb3Igc3ltc2VncyBhbmQgYXJlIG5vIGxvbmdlcgorCXVzZWQuICAoRnJvbSBhIHF1ZXN0aW9uIGJ5IEVsaW90IERyZXNzZWxoYXVzCisJPGRyZXNzZWxoQFJGVDMwLm5hcy5uYXNhLmdvdj4pLgorCitUaHUgT2N0ICAzIDA5OjMzOjI2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisgICAgCSogZGJ4cmVhZC5jLCBjb2ZmcmVhZC5jOiAgc3RhdGljLWl6ZSBmdW5jdGlvbnMgdGhhdCB3ZXJlCisJZ3JhdHVpdGlvdXNseSBleHRlcm5hbC4gIChGcm9tIEZyZWQgRmlzaC4pCisKKwkqIGMtZXhwLnk6ICBzeW0tPmNsYXNzIHRvIFNZTUJPTF9DTEFTUyAoc3ltKS4KKworCSogZGJ4cmVhZC5jIChkYnhfbG9va3VwX3R5cGUpOiAgS2VlcCBkb3VibGluZyBzaXplIG9mIHR5cGV2ZWN0b3IKKwl1bnRpbCBpdCBpcyBsYXJnZSBlbm91Z2guICAgIAorCisJKiBkYnhyZWFkLmMgKHJlYWRfdHlwZSk6ICBIYW5kbGUgZXJyb3IgY2FzZSBzbGlnaHRseSBiZXR0ZXIuCisJTWFrZSBjb21wbGFpbnQgbWVzc2FnZSBub3QgQysrLXNwZWNpZmljLgorCitXZWQgT2N0ICAyIDE3OjIxOjA3IDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBGaXggc3RlcC9uZXh0IHNvIHRoYXQgeW91IG9ubHkKKwlzdG9wIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgbGluZS4gIFRoaXMgZml4ZXMgdmFyaW91cyBwcm9ibGVtcworCXdpdGggZm9yIGxvb3BzLCBuZXN0ZWQgaWYtZWxzZSdzIGFuZCBzd2l0Y2ggc3RhdGVtZW50cy4KKworVHVlIE9jdCAgMSAwNjozMzo1NSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogc3ltdGFiLmMgKGxvb2t1cF9zeW10YWJfMSwgbG9va3VwX3N5bWJvbCk6ICAiZmF0YWwiIGVycm9ycworCWJldHdlZW4gc3ltdGFicyBhbmQgcHN5bXRhYnMgYmVjb21lIG9yZGluYXJ5IGVycm9yKClzLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYik6ICBSZWxvY2F0ZSBlbmRfb2ZfdGV4dF9hZGRyCisJcHJvcGVybHksIG1ha2luZyAiZW5kIHBjIiBjb3JyZWN0IGluIHNoYXJlZCBsaWIgcHN5bXRhYnMuCisJKEZyb20gR3V5IEhhcnJpcyA8Z3V5QGF1c3BleC5jb20+LikKKworTW9uIFNlcCAzMCAxMzoxNTozMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogZGJ4cmVhZC5jOiAgRW5hYmxlLCBidXQgc29mdGVuLCBjb25zdF92b2xfY29tcGxhaW50LgorCShyZWFkX2RieF9zeW10YWIpOiAgTl9TVFNZTSBhbmQgTl9MQ1NZTSBkZWZpbmUgc3RhdGljIHZhcnMuCisJRGl0dG8gR291bGQgTl9OQlNUUyBhbmQgTl9OQkxDUy4gIEFsc28sIGFsbCB0eXBlcyBpbiB0aGUgcHN5bXRhYgorCXNob3VsZCBiZSBmaWxlLXNjb3BlLCBub3QgZ2xvYmFsLgorCShyZWFkX3N0cnVjdF90eXBlKTogIFJlbW92ZSBhbmNpZW50IG11bHRpcGxlLWluaGVyaXRhbmNlIHdhcm5pbmcuCisJKHJlYWRfcmFuZ2VfdHlwZSk6ICBDaGVjayBiYXNlIHR5cGUsIGNvbXBsYWluICYgcGF0Y2ggaWYgdW5kZWZpbmVkLgorCSogc3RhY2suYyAoZnJhbWVfaW5mbyk6ICBEZW1hbmdsZSB0aGUgZnVuY3Rpb24gbmFtZSBpbiBgaW5mbyBzdGFjaycuCisJKEZyb20gUGV0ZXIgU2NoYXVlcikKKworU2F0IFNlcCAyOCAxMDowMjozMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHBfZm9yX2FkZHJlc3MpOiAgRG9uJ3QgdXNlCisJVFlQRV9QT0lOVEVSX1RZUEUgZGlyZWN0bHkgKGl0IG1pZ2h0IGJlIHplcm8gaWYgdGhpcyB0eXBlIGhhcworCW5ldmVyIGhhZCBhIHBvaW50ZXIgY3JlYXRlZCBiZWZvcmUpOyB1c2UgbG9va3VwX3BvaW50ZXJfdHlwZS4KKwkqIHN5bXRhYi5jIChsb29rdXBfbWV0aG9kX3R5cGUpOiAgQXJndW1lbnRzIHdlcmUgc3dhcHBlZCBpbiBhbGwKKwljYWxsZXJzLCBzbyBmaXggaXQgaGVyZS4gIEknbSBhbWF6ZWQgdGhpcyB3b3JrZWQgYXQgYWxsIQorCitGcmkgU2VwIDI3IDE4OjA5OjMxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBjLWV4cC55LCBtMi1leHAueTogIERlZmluZSBtb3JlIHl5c3ltYm9scyB0aGF0IGhhcHBlbiB0byBiZQorCSJic3MiIHJhdGhlciB0aGFuICJkYXRhIiBzeW1ib2xzLCBidXQgd2hpY2ggc3RpbGwgY29uZmxpY3QuCisJKiBtMi1leHAueTogIExpbnQuCisKKwkqIGNvZmZyZWFkLmMgKGNvZmZfc3ltZmlsZV9yZWFkKTogIFVzZSB4bWFsbG9jLCBub3QgbWFsbG9jLgorCSogY29yZS5jIChjb3JlX2ZpbGVzX2luZm8pOiAgU2hvcnRlbiBvdXRwdXQuCisJKiBleGVjLmMgKGV4ZWNfZmlsZXNfaW5mbyk6ICBEaXR0by4KKwkoYnVpbGRfc2VjdGlvbl90YWJsZSk6ICBJZ25vcmUgemVyby1sZW5ndGggc2VjdGlvbnMuCisJKiBsYW5ndWFnZS5jLCBwcmludGNtZC5jOiAgTGludC4KKwkqIGxhbmd1YWdlLmggKGdldF9mcmFtZV9sYW5ndWFnZSk6ICBEZWNsYXJlLgorCSogc2FiZXIuc3VwcHJlc3M6ICB1cGRhdGUuCisJKiBzdGFjay5jIChmaW5kX3JlbGF0aXZlX2ZyYW1lKTogIFJlbW92ZSBjb21wbGV4IGNvZGUgdGhhdCB3YXMKKwkjaWYgMCdkLCBzdGljayB3aXRoIHNpbXBsZSBjb2RlLiAgTGludC4KKyAgICAgICAgKiBzYWJlci5zdXBwcmVzczogIFVwZGF0ZSBhIGJpdC4KKwkqIHN5bWZpbGUuYyAoYWRkX3N5bWJvbF9maWxlX2NvbW1hbmQpOiAgQWRkICI/IiB0byBxdWVzdGlvbi4KKwkqIHV0aWxzLmMgKHBhcnNlX2VzY2FwZSk6ICBBdm9pZCBcYSBkdWUgdG8gYmRlYWQgY29tcGlsZXJzLgorCSogdmFsdWUuaDogIERlY2xhcmUgdHlwZWRlZl9wcmludC4KKworCSogdmFscHJpbnQuYyAodmFsX3ByaW50LCB0eXBlX3ByaW50X2Jhc2UpOiAgVFlQRV9DT0RFX1JBTkdFIGxlc3MKKwlrbHVkZ2V5LgorCisJKiBuaW5keS10ZGVwLmMgKG5pbmR5X2ZyYW1lX2NoYWluX3ZhbGlkKTogIFVzZSBsb29rdXBfbWlzY19mdW5jLgorCShSZXBvcnRlZCBieSBNYXJrIFBlZWsgPG1hcmtAaW1hZ2VuLmNvbT4uKQorCisJKiBzb2xpYi5jIChzb2xpYl9tYXBfc2VjdGlvbnMpOiAgUmVsb2NhdGUgYWxsIHNlY3Rpb25zLCBldmVuCisJdGhvdWdoIG9ubHkgdGhlIHRleHQgc2VjdGlvbidzIHNpemUgaXMgdHJhY2tlZC4gIE1hcmsgbGRfdGV4dAorCWZvciBldmVudHVhbCBlbGltaW5hdGlvbiBhcyB3ZSBnZW5lcmFsaXplIHRvIE4gc2VjdGlvbnMuCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBEb24ndCBjaGVjayBpZiB0aGUgUEMgaXMgaW4gYQorCWNhbGxfZHVtbXkgaWYgd2Ugd2VyZSBzdG9wcGVkIGJ5IGEgcmFuZG9tIHNpZ25hbCB0aGF0IGlzIGJlaW5nCisJcGFzc2VkIHRvIHRoZSBwcm9ncmFtLiAgVGhpcyBwcm9kdWNlZCB3aWVyZCByZXN1bHRzIHdoZW4gY2FsbGluZworCWZ1bmN0aW9ucyBpbiB0aGUgaW5mZXJpb3IgYW5kIHNpZ25hbHMgKGUuZy4gU0lHQUxSTSkgd2VyZSBpbiB1c2UuCisKK1R1ZSBTZXAgMjQgMTg6MDU6MzAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGluZnJ1bi5jIChJTl9TSUdUUkFNUCk6ICBOb3QgcGFyZW50aGVzaXplZCBwcm9wZXJseS4KKwlCdWdmaXggZnJvbSBQYXVsIEVnZ2VydCA8ZWdnZXJ0QHR3aW5zdW4uY29tPi4KKwkqIHRtLXVsdHJhMy5oIChJTl9TSUdUUkFNUCk6ICBEaXR0by4KKwkqIHZhbHByaW50LmMgKHByaW50X2Zsb2F0aW5nKTogIFByaW50IDkgZGlnaXRzIGZvciBJRUVFIGZsb2F0cy4KKwlGcm9tIFBhdWwgRWdnZXJ0LgorCitNb24gU2VwIDIzIDE1OjUwOjA3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIFJvbGwgVkVSU0lPTiB0byA0LjEuMS4KKwkqIHNvdXJjZS5jIChsaW5lX2luZm8pOiAgUGV0ZXIgU2NoYXVlciBmaXhlcyBhIGJ1ZyBJIGludHJvZHVjZWQgaW4KKwloZXggY29udmVyc2lvbi4KKworRnJpIFNlcCAyMCAxNjoxMDo1MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCUdEQi00LjEgcmVsZWFzZSEKKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiAgU2V0IHRvIDQuMS4JCisJKiBsYW5ndWFnZS5jIChzZXRfbGFuZ3VhZ2VfY29tbWFuZCk6ICBQcmludCB1c2VmdWwgaGVscCBtZXNzYWdlLAorCWFuZCByZXN0b3JlIHRoZSBsYW5ndWFnZSBzdHJpbmcgYWZ0ZXIgZ2l2aW5nIGhlbHAuCisJKiB2YWxwcmludC5jICh0eXBlZGVmX3ByaW50KTogIFByaW50IHR5cGVkZWYgaW4gQyBvciBNMi4KKwkqIHN5bXRhYi5jIChsaXN0X3N5bWJvbHMpOiAgVXNlIGl0LgorCSogbWFpbi5jIChtYWluKTogIEF2b2lkIGFueSBvdXRwdXQgYmVmb3JlIChnZGIpIHByb21wdCB3aGVuIC1xLgorCSogbGFuZ3VhZ2UuYyAoc2V0X2xhbmd1YWdlX2NvbW1hbmQpOiAgSGFuZGxlIGVycm9ycyBieSByZXN0b3JpbmcKKwl0aGUgbGFuZ3VhZ2Ugc3RyaW5nIHRvIGl0cyBjdXJyZW50IHN0YXRlIChmaXggZnJvbSBBLiBCZWVycykuCisJKiBkb2MvZ2RiaW50LnRleGluZm86ICBSb2xsIGluIGluZm9ybWF0aW9uIGZyb20gUkVBRE1FLiAgUmVhcnJhbmdlCisJImhvdyB0byBpbnN0YWxsIiBhbmQgImhvdyB0byBwcmludCB0aGUgZG9jIiBzdHVmZiBzbyBpdCBkcm9wcworCWVhc2llciBpbnRvIFJFQURNRS4KKwkqIGNvbmZpZ3VyZS5pbjogIFJlbmFtZSBydHBjIENQVSB0byByb21wIHRvIG1hdGNoIGNvbmZpZy5zdWIuCisJKiBSRUFETUUsIFdIQVRTLk5FVywgVE9ETzogIFVwZGF0ZSBmb3IgZ2RiLTQuMS4KKworRnJpIFNlcCAyMCAxNzozOToxNCAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQorCisJKiBkb2MvZ2RiLnRleGluZm86IFVwZGF0ZXMgZnJvbSBDaGFuZ2VMb2cuICBzZXQvc2hvdyB3cml0ZSwgCisJYXV0b2xvYWRpbmcgc2hhcmVkIGxpYnMsIGNvcHlyaWdodCBldGMgb24gR0RCIHN0YXJ0dXAsIGNsZWFuIHVwICRfCisJYW5kICRfXyBpbmRleCByZWZzLCBzZXQvc2hvdyBsaXN0c2l6ZSBhbmQgcmVsYXRlZCB1cGRhdGVzIHRvIGxpc3QKKwljbWQuICBOZXcgaG9zdC90YXJnZXQgY29uZmlncy4KKworRnJpIFNlcCAyMCAxNTo0NjowMCAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQorCisJKiBkb2MvTWFrZWZpbGU6IGdlbmVyYXRlIGF1eCB2ZXJzaW9uLW5vIGZpbGUgZG9jL2dkYlZOLm00CisJZnJvbSBtYWluIE1ha2VmaWxlLmluIHZlcnNpb24gZGVmaW5pdGlvbgorCWRvYy9nZGIudGV4aW5mbzogdXNlIHZlcnNpb24gcmVjb3JkZWQgaW4gZG9jL2dkYlZOLm00IGZvciBjdXJyZW50CisJR0RCIHZlcnNpb24gbm8gcmVmcyAKKwlNYWtlZmlsZS5pbiAoc2V0dXAtdG8tZGlzdCk6IGdlbmVyYXRlIGRvYy9nZGJWTi5tNCAKKworCSogZG9jL2dkYi50ZXhpbmZvOiBtZXJnZSBuZXcgbGFuZ3VhZ2Utc3dpdGNoaW5nIGFuZCBsYW5nLXNwZWNpZmljCisJZG9jIGJ5IEFuZHJldyBCZWVycworCitGcmkgU2VwIDIwIDE1OjAwOjU3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBtY2hlY2suYzogQWRkIF9fT05FRklMRSBrbHVkZ2UgdG8gYWxsb3cgY29tcGlsYXRpb24gYnkgbm9uLUFOU0kKKwljb21waWxlcnMgKHdoaWNoIG1heSBsYWNrIHN0ZGRlZi5oKS4KKworRnJpIFNlcCAyMCAxMzoyOTo0MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIsIHByb2Nlc3Nfb25lX3N5bWJvbCk6ICBOX0ZOIGFuZAorCU5fV0FSTklORyBhcmUgdGhlIHNhbWUgZXhjZXB0IGZvciB0aGUgTl9FWFQgYml0LCBzbyBqdXN0IHVzZSB0aGVpcgorCXZhbHVlcyBhbG9uZSwgcmF0aGVyIHRoYW4gT1ItaW5nIHRoZW0gd2l0aCBOX0VYVC4KKworRnJpIFNlcCAyMCAxMjoyNzo1NSAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBtaXBzcmVhZC5jIChwYXJzZV9saW5lcyk6ICBEZWFsIHdpdGggbmVnYXRpdmUgZXh0ZW5kZWQgbGluZQorCW9mZnNldHMgY29ycmVjdGx5LgorCisJKiBjLWV4cC55LCBtMi1leHAueTogICNkZWZpbmUgeXllcnJmbGFnIGFuZCB5eW5lcnJzIHRvIGF2b2lkCisJZ2xvYmFsIHN5bWJvbCBjb25mbGljdHMuCisKK0ZyaSBTZXAgMjAgMDI6Mjg6MTUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIC5nZGJpbml0OiAgTW92ZSAnc2V0IGNvbXBsYWludHMnIHRvIHRvcCwgc28gaXQgcnVucyBldmVuIGluCisJY2FzZSB3ZSBhcmVuJ3QgZGVidWdnaW5nIEdEQi4KKwkqIGxhbmd1YWdlLmMgKF9pbml0aWFsaXplX2xhbmd1YWdlKTogIEZpeCB0eXBlIGNoZWNrIGFuZCByYW5nZQorCWNoZWNrIGRvY3VtZW50YXRpb24gc3RyaW5ncy4KKwkqIHV0aWxzLmMgKCFIQVZFX1ZQUklOVEYpOiAgRGVmaW5lIHZmcHJpbnRmIGFzIGEgZnVuY3Rpb24sIHNvCisJbGFuZ3VhZ2UuYyBjYW4gdXNlIGl0LiAgKFRob3VnaCBsYW5ndWFnZS5jIHNob3VsZCByZWFsbHkgbm90IGJlCisJaGFuZGxpbmcgd2FybmluZ3MvZXJyb3JzIHRoZSB3YXkgaXQgZG9lcywgRklYTUUuKQorCSogc3ltdGFiLmMgKGxvb2t1cF9wcmltaXRpdmVfdHlwZSk6ICBjb25zdCBsaW50LgorCisJQnVnZml4IGZyb20gUGV0ZXIgU2NoYXVlcjoKKwkqIHNvdXJjZS5jIChsaW5lc190b19saXN0KTogIE1ha2Ugc2lnbmVkLCB0byBhdm9pZCBjb21wYXJpc29uCisJZ29pbmcgdW5zaWduZWQgYW5kIGNvbXBsYWluaW5nIHRoYXQgLTMgaXMgdG9vIGhpZ2ggZm9yIDIxIGxpbmVzLgorCSogc3RhY2suYyAobGluZXNfdG9fbGlzdCk6ICBEaXR0by4KKworVGh1IFNlcCAxOSAyMzozMzo0MSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEhGSUxFUyk6ICBBZGQgbWluaW1vbi5oLgorCShWRVJTSU9OKTogIFJvbGwgdmVyc2lvbiBudW1iZXIgdG8gNC4wLjk1LgorCShnZGIudGFyLlosIG1ha2UtcHJvdG8tZ2RiLmRpciwgc2V0dXAtdG8tZGlzdCwgZ2RiLVhYWC50YXIuWik6CisJTmV3IHJ1bGVzIGZvciBidWlsZGluZyBkaXN0cmlidXRpb25zLiAgTm9ybWFsIGRpc3RyaWJ1dGlvbgorCWlzIGJ1aWx0IGJ5IGRvaW5nIGBtYWtlIC1mIE1ha2VmaWxlLmluIGdkYi50YXIuWicgaW4gdGhlIGRpcmVjdG9yeQorCW9uZSBsZXZlbCB1cCBmcm9tIGhlcmU7IGl0IGNhbGxzIG1ha2UtcHJvdG8tZ2RiLmRpciB0byBidWlsZCBhCisJZGlyZWN0b3J5IGBwcm90by1nZGInIHdoaWNoIGlzIGFuIGltYWdlIG9mIHRoZSByZWxlYXNlLiAgVGhlIG9sZAorCWBnZGIudGFyLlonIHJ1bGUgc3RpbGwgd29ya3MgdG9vLgorCSogY29uZmlnLnN1YiwgY29uZmlndXJlOiAgUm9sbCBpbiBsYXRlc3QgZnJvbSAuLgorCitUaHUgU2VwIDE5IDE3OjQxOjI0IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCisKKwkqIGRvYy9nZGJpbnQudGV4aW5mbzogUmVvcmRlciBjb250ZW50czsgcmVvcmdhbml6ZSBuZXctaG9zdCwKKwluZXctdGFyZ2V0LCBhbmQgbmV3LWNvbmZpZyBjaGFwdGVyczsgZml4IG1pbm9yIHR5cG9zOyBjb21lIGNsb3NlcgorCXRvIHVzdWFsIEdOVSBtYXJrdXAgY29udmVudGlvbnMgZm9yIEBmaWxlIEBzYW1wIEBjb2RlIEB2YXIuCisKK1RodSBTZXAgMTkgMTc6MDQ6MTIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwlQYXRjaGVzIGZyb20gUGV0ZXIgU2NoYXVlciA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+OgorCSogbWlwc3JlYWQuYyAocGFyc2VfcGFydGlhbF9zeW1ib2xzKTogRW50ZXIgdGhlIG5hbWUgb2YgYWxsCisJc3RydWN0cy91bmlvbnMuLi4gaW50byB0aGUgcHN5bXRhYiBzbyB3ZSBjYW4gYWNjZXNzIHRoZW0gaWYgdGhlCisJc3ltdGFiIGlzIG5vdCByZWFkIGluLgorCSogbWlwcy10ZGVwLmM6ICBSZW1vdmUgc29tZSB1bm5lZWRlZCAjaW5jbHVkZXMuCisJKiB4Y29uZmlnL2RlYzMxMDA6IEFkZCBIQVZFX1NUUlNUUi4KKworVGh1IFNlcCAxOSAxNToxNDoyMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBDaXJjdW12ZW50IFN1biBNYWtlIGJ1ZyBvbiAqLWV4cC50YWIuby4KKwkqIGMtZXhwLnksIG0yLWV4cC55OiAgTGludC4KKwkqIG0yLWV4cC55OiAgQXZvaWQgdXNpbmcgeXl0bmFtZVtdIHdoaWNoIGlzIGEgQmlzb24taXNtLgorCSogdmFscHJpbnQuYyAodmFsX3ByaW50X2ZpZWxkcyk6ICBDaGVjayBmb3Igc3R1YiB0eXBlLgorCSogbWlwc3JlYWQuYyAoX2luaXRpYWxpemVfbWlwc3JlYWQpOiAgQXZvaWQgdXNpbmcKKwlidWlsdGluX3R5cGVfdm9pZCBhdCBpbml0aWFsaXplIHRpbWUuCisJKG1pcHNjb2ZmX3N5bWZpbGVfcmVhZCk6ICB1c2UgaXQgbm93LgkKKworV2VkIFNlcCAxOCAxNTo1NTo1MSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCU1lcmdlIG11bHRpcGxlLWxhbmd1YWdlIHN1cHBvcnQsIGFuZCBwYXJ0aWFsIE1vZHVsYS0yIHN1cHBvcnQsCisJZnJvbSBBbmRyZXcgQmVlcnMgPGJlZXJzQGNzLmJ1ZmZhbG8uZWR1Pi4KKworCSogaTM4Ny10ZGVwLmM6ICBOZXcgZmlsZSwgY29uc29saWRhdGVzIG1vc3QgODAzODcgc3VwcG9ydCwKKwlhbmQgZWxpbWluYXRlcyBob3N0IGRlcGVuZGVuY3kgb24gZG91YmxlPC0+ZXh0ZW5kZWQgY29udmVyc2lvbnMuCisJKiBpMzg2LXhkZXAuYywgc3ltbS14ZGVwLmM6ICBSZW1vdmUgbW9zdCAzODcgc3VwcG9ydC4KKwkqIHhjb25maWcvaTM4NntzY28sdix2LWcsdjMyLHYzMi1nfTogIE5vdyBuZWVkIGkzODctdGRlcC5vLgorCisJKiBzeW1maWxlLmMgKGFsbG9jYXRlX3N5bXRhYik6ICBOZXcgZm4sIGNvbnNvbGlkYXRlcyB0aGUgd29yaworCW9mIGFsbG9jYXRpbmcgYW5kIGluaXRpYWxpemluZyBhIG5ldyBzdHJ1Y3Qgc3ltdGFiLiAgU2V0IHRoZQorCWxhbmd1YWdlIG9mIHRoZSBzeW10YWIgYmFzZWQgb24gaXRzIGZpbGVuYW1lIGV4dGVuc2lvbi4KKwkqIHN5bWZpbGUuaDogIERlY2xhcmUgaXQuCisJKiBtaXBzcmVhZC5jIChuZXdfc3ltdGFiKTogIFVzZSBpdC4gIE1pbm9yIGZvcm1hdHRpbmcgY2hhbmdlcy4KKwkqIGRieHJlYWQuYyAoZW5kX3N5bXRhYik6ICBVc2UgaXQuCisKKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3N5bWJvbCwgY2FzZSBzdFBhcmFtIGFuZCBzdFByb2MpOiAgQWRkICNpZiAwJ2QKKwljb2RlIGZvciBzYXZpbmcgdHlwZXMgb2YgcGFyYW1ldGVycyB3aXRoIGVhY2ggZnVuY3Rpb24gZGVmaW5pdGlvbi4KKwkqIGRieHJlYWQuYyAoZGVmaW5lX3N5bWJvbCwgZnVuY3Rpb24gYW5kIHBhcmFtZXRlciBjYXNlcyk6ICBEaXR0by4KKwkocmVhZF9kYnhfc3ltdGFiLCBjYXNlIE5fREVGRCk6ICBJZ25vcmUuCisJKHJlYWRfZW51bV90eXBlKTogIFJlY29nbml6ZSBGQUxTRS9UUlVFIGVudW0gYXMgTW9kdWxhLTIgQk9PTEVBTi4KKwkocmVhZF9yYW5nZV90eXBlKTogIFJlbmFtZSBNQVhfT0ZfVFlQRSB0byBNQVhfT0ZfQ19UWVBFLCBldGMuCisJI2lmIDAgb3V0IGl0cyB1c2VzLCB0aG91Z2gsIHNpbmNlIHRoZXkgc2V0IGEgZGVhZCB2YWx1ZS4KKwkqIGNvZmZyZWFkLmMgKGVuZF9zeW10YWIpOiAgVXNlIGFsbG9jYXRlX3N5bXRhYi4KKwkocHJvY2Vzc19jb2ZmX3N5bWJvbCk6ICAjaWYgMCdkIGZvciBmdW5jdGlvbnMgYW5kIHBhcmFtcyBhcyBhYm92ZS4KKwkocmVhZF9lbnVtX3R5cGUpOiAgUmVjb2duaXplIE1vZHVsYS0yIEJPT0xFQU4uCisJKiBzeW10YWIuYyAoYWRkX3BhcmFtX3RvX3R5cGUpOiAgI2lmIDAnZCBmdW5jdGlvbiB0byBhZGQgYQorCXBhcmFtZXRlciB0eXBlIHRvIGEgZnVuY3Rpb24gdHlwZSdzIGZpZWxkIGxpc3QuCisKKwkqIGRlZnMuaCAobG9jYWxfaGV4X2Zvcm1hdCwgbG9jYWxfaGV4X3N0cmluZywgKl9jdXN0b20pOiAgQWRkLgorCSogaTM4Ni14ZGVwLmMsIHB5ci10ZGVwLmMsIHB5ci14ZGVwLmMsIHJlbW90ZS12eC5jLCBzb2xpYi5jLAorCXNvdXJjZS5jLCBzeW1maWxlLmMsIGRieHJlYWQuYywgYnJlYWtwb2ludC5jLCBjb3JlLmMsIGV4ZWMuYywKKwlpMzg3LXRkZXAuYywgaW5mY21kLmMsIG1pcHMtdGRlcC5jLCBzdGFjay5jLCBwcmludGNtZC5jOiAgT3V0cHV0CisJaGV4IHdpdGggbG9jYWxfaGV4X3N0cmluZyBmb3IgTW9kdWxhLTIgc3VwcG9ydC4KKworCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50X2NvbmRfZXZhbCk6ICBVc2UgbmV3IHZhbHVlX3RydWUgdG8gdGVzdAorCWJyZWFrcG9pbnQgY29uZGl0aW9uIGxhbmd1YWdlLWluZGVwZW5kZW50bHkuCisKKwkqIHBhcnNlLmM6ICBOZXcgZmlsZSB3aXRoIHRoZSBjb21tb24gY29kZSByZW1haW5zIG9mIGV4cHJlYWQueS4KKwkqIHBhcnNlci1kZWZzLmg6ICBOZXcgZmlsZSB3aXRoIGNvbW1vbiBkZWNsYXJhdGlvbnMgZnJvbSBleHByZWFkLnkuCisJKiBjLWV4cC55OiAgTmV3IGZpbGUgd2l0aCB0aGUgQyBwYXJzZXIgZnJvbSBleHByZWFkLnksIGFuZCBvdGhlcgorCWxhbmd1YWdlLXNwZWNpZmljIGluZm9ybWF0aW9uLgorCSogbTItZXhwLnk6ICBOZXcgZmlsZSB3aXRoIHRoZSBNb2R1bGEtMiBwYXJzZXIgYW5kIGV0Yy4KKwkqIGV4cHJlYWQueSwgZXhwcmVhZC50YWIuYzogIFJlbW92ZS4KKwkqIGJyZWFrcG9pbnQuYywgZXZhbC5jLCBwcmludGNtZC5jLCBleHByZXNzaW9uLmg6ICBVc2UKKwlwYXJzZV9leHByZXNzaW9uIGFuZCBwYXJzZV9leHBfMSByYXRoZXIgdGhhbiBwYXJzZV9jX2V4cHJlc3Npb24KKwlhbmQgcGFyc2VfY18xLgorCisJKiBzeW10YWIuaCAoZW51bSBsYW5ndWFnZXMpOiAgTW92ZSB0byBkZWZzLmguCisJKGVudW0gdHlwZV9jb2RlKTogIEFkZCBUWVBFX0NPREVfQ0hBUiBhbmQgVFlQRV9DT0RFX0JPT0wuCisJRGVjbGFyZSBNb2R1bGEtMiBidWlsdGluIHR5cGVzLgorCUFkZCBNQVhfT0ZfVFlQRSBhbmQgTUlOX09GX1RZUEUgbWFjcm9zLgorCisJKiBzeW10YWIuYyAoX2luaXRpYWxpemVfc3ltdGFiKTogIFJlbW92ZSBidWlsdGluIHR5cGUKKwlkZWZpbml0aW9uIGFuZCBpbml0aWFsaXphdGlvbiB0byAqLWV4cC55LiAgCisJKGxvb2t1cF9wcmltaXRpdmVfdHlwZW5hbWUpOiAgVXNlIGxhbmd1YWdlLWRlcGVuZGVudCB2ZWN0b3IuCisJKGxvb2t1cF90eXBlbmFtZSk6ICBGaXggYnVnLCBtYWtlIGl0IHdvcmsgaWYgcHJpbWl0aXZlIHR5cGVuYW1lLgorCShsb29rdXBfdW5zaWduZWRfdHlwZW5hbWUpOiAgQ2FsbCBhYm92ZS4KKwkoY3JlYXRlX2FycmF5X3R5cGUpOiAgU2V0IHVwIHJhbmdlIHR5cGUgZm9yIGFycmF5IGluZGV4LgorCShsaXN0X3N5bWJvbHMpOiAgQ2FsbCB0eXBlZGVmX3ByaW50IHRvIHByaW50IHR5cGVkZWZzLgorCisJKiB2YWx1ZXMuYyAodW5wYWNrX2xvbmcsIHZhbHVlX2Zyb21fbG9uZ2VzdCk6ICBIYW5kbGUKKwlUWVBFX0NPREVfQk9PTCBhbmQgVFlQRV9DT0RFX0NIQVIuCisKKwkqIGV4cHJlc3Npb24uaCAoZW51bSBleHBfb3Bjb2RlKTogIEFkZCBNb2R1bGEtMiBzcGVjaWZpYyBvcGNvZGVzLgorCSogZXhwcHJpbnQuYzogIExvb2sgdXAgZXhwcmVzc2lvbiBvcGNvZGVzIGluIGxhbmd1YWdlLXNwZWNpZmljCisJdGFibGUsIGJhc2VkIG9uIGV4cHJlc3Npb24ncyBsYW5ndWFnZS4gIEhhbmRsZSBzb21lIE1vZHVsYS0yCisJc3BlY2lmaWMgb3Bjb2Rlcy4KKworCSogc3RhY2suYyAoZnJhbWVfaW5mbyk6ICBQcmludCBsYW5ndWFnZSBvZiBzdGFjayBmcmFtZS4KKwkoc2VsZWN0X2ZyYW1lKTogIEFsc28gc2VsZWN0IGxhbmd1YWdlLCBpZiBpbiBhdXRvLW1vZGUuCisJKGdldF9mcmFtZV9sYW5ndWFnZSk6ICBOZXcgc3Vicm91dGluZS4KKwkqIG1haW4uYyAoZXhlY3V0ZV9jb21tYW5kKTogIFdhcm4gYXMgbGFuZ3VhZ2UgY2hhbmdlcyBhdXRvbWF0aWNhbGx5LgorCisJKiBwcmludGNtZC5jIChwdHlwZV9jb21tYW5kKTogIFBhcnNlIHR5cGVzIHVzaW5nIHRoZSBsYW5ndWFnZQorCXBhcnNlciwgYm90aCBmb3IgbGFuZ3VhZ2UtaW5kZXBlbmRlbmNlLCBhbmQgc28gdGhhdCBzY29wZXMgY2FuCisJYmUgc3BlY2lmaWVkLgorCisJKiBsYW5ndWFnZS5oLCBsYW5ndWFnZS5jOiAgTmV3IGZpbGVzIGZvciBsYW5ndWFnZS1zcGVjaWZpYyBtYWNyb3MsCisJZGVjbGFyYXRpb25zLCBhbmQgZGVmaW5pdGlvbnMuCisKKwlNaXNjIGZpeGVzOgorCisJKiBtYWluLmMgKG1haW4pOiAgSWYgZXJyb3IoKSBpcyBjYWxsZWQgZHVyaW5nIGVhcmx5CisJaW5pdGlhbGl6YXRpb24sIHByaW50IGl0cyBtZXNzYWdlIGFuZCB0aGVuIGV4aXQoMSkgZnJvbSBHREIuCisKKwkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfYmFzZSk6ICBBdm9pZCBwcmludGluZyBnYXJiYWdlIGZvciBpbnRzCisJb2YgdW51c3VhbCBzaXplcy4KKwkoX2luaXRpYWxpemVfdmFscHJpbnQpOiAgV2FybiBhYm91dCBob3N0L3RhcmdldCBzaXplIGFzc3VtcHRpb247CisJaW1wcm92ZSBsb25nIGxvbmcgc3VwcG9ydCBzbGlnaHRseS4JCisJCisJKiBjb252ZXgtdGRlcC5jIChjb21tX3JlZ2lzdGVyc19pbmZvKTogIEF2b2lkIHBhcnNpbmcgZGVjaW1hbCBhbmQKKwloZXggLS0gbGV0IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgZG8gaXQuCisKKwkqIGRvYy9nZGJpbnQudGV4aW5mbyAoTGFuZ3VhZ2VzKTogIERvYyBob3cgdG8gYWRkIGEgbGFuZ3VhZ2UuCisKKwkqIE1ha2VmaWxlLmluOiAgQ29wZSB3aXRoIG5ldyBmaWxlcyBhbmQgcmVtb3ZlZCBmaWxlcy4KKworVHVlIFNlcCAxNyAwODozNzo0MSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwlBZGQgQW5kcmV3IEJlZXJzJyBjaGFuZ2VzIGZvciBNb2R1bGEtMiBzdXBwb3J0LiAgSGlzIENoYW5nZUxvZworCWVudHJpZXMgYXJlIGVuY2xvc2VkIGhlcmVpbi4gIE5vdCBhbGwgb2YgdGhlc2UgY2hhbmdlcworCWhhdmUgYmVlbiBtZXJnZWQgaW50byB0aGUgbWFzdGVyIEdEQiBzb3VyY2VzIC0tIGNoZWNrIHRoZQorCUNoYW5nZUxvZyBhYm92ZSBoZXJlIGZvciB0aGUgbWVyZ2UgbG9nLgorCitNb24gSnVuICAzIDE3OjA1OjQ1IEVEVCAxOTkxCisKKyAgICAgbTItZXhwLnkgICAgICAgQ3JlYXRlZC4gIFRlc3RlZCBvdXRzaWRlIG9mIEdEQiBmb3IgYSBmZXcgZGF5cy4gIFByb3BlcgorICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcnMgd2VyZSBhZGRlZCwgQyBzcGVjaWZpYyBvcGVyYXRvcnMgYW5kIHRva2VucworICAgICAgICAgICAgICAgICAgICByZW1vdmVkLiAgeXlsZXgoKSByZXZhbXBlZCB0byBzb21lIGV4dGVudC4gIFN0aWxsIHRoaW5ncworICAgICAgICAgICAgICAgICAgICBtaXNzaW5nIGZyb20gdGhlIGdyYW1tYXIsIHN1Y2ggYXMgc2V0cy4KKyAgICAgICAgICAgICAgICAgICAgVGVzdGVkIGZvciB0d28gd2Vla3MgaW4gR0RCIHYzLjUuCisKK1R1ZSBKdW4gMTEgMTc6MjM6NDggRURUIDE5OTEKKworICAgICBtMi1leHAueSAgICAgICBBZGRlZCBib29sZWFuIGNvbnN0YW50cyBUUlVFIGFuZCBGQUxTRSB0byB0aGUgZ3JhbW1hcgorICAgICAgICAgICAgICAgICAgICBzbyB0aGV5IGFyZSBidWlsdC1pbi4gIFNvcnQgb2YgYSBoYWNrLgorCitGcmkgSnVuIDE0IDEyOjUzOjUxIEVEVCAxOTkxCisKKyAgICAgbTItZXhwLnkgICAgICAgQWRkZWQgcmFuZ2UgY2hlY2tpbmcgZm9yIG51bWVyaWMgY29uc3RhbnRzLiAgQW55IG51bWVyaWMKKyAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQgaXMgYXNzdW1lZCB0byBiZSBvZiBidWlsdGluIHR5cGUgSU5URUdFUiB1bmxlc3M6CisgICAgICAgICAgICAgICAgICAgICgxKSBpdCBpcyBvY3RhbCBvciBoZXhhZGVjaW1hbCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhCisgICAgICAgICAgICAgICAgICAgIENBUkRJTkFMOyAoMikgaXQgaXMgdG9vIGJpZyB0byBmaXQgaW50byBhbiBJTlRFR0VSLCBpbgorICAgICAgICAgICAgICAgICAgICB3aGljaCBjYXNlIGl0IGlzIGEgQ0FSRElOQUwuCisgICAgIGV2YWwuYyAgICAgICAgIEFkZGVkIHNpbXBsZSByYW5nZSBjaGVja2luZyBmb3IgKywgLSwgYW5kICogb24gaW50ZWdlcnMuCisgICAgICAgICAgICAgICAgICAgIERvZXNuJ3Qgd29yayB2ZXJ5IHdlbGwgZm9yICosIHNpbmNlIDYgKiAxLDAwMCwwMDAsMDAwID0KKyAgICAgICAgICAgICAgICAgICAgMSw3MDUsMDMyLDcwNCwgd2hpY2ggZmFpbHMgdGhlIHNpbXBsZSB0ZXN0IG9mIHJlc3VsdCA+PQorICAgICAgICAgICAgICAgICAgICBmaXJzdF9vcGVyYW5kLCBubyBtYXR0ZXIgaW4gd2hhdCBvcmRlciB0aGUgb3BlcmFuZHMgYXJlLgorCitUdWUgSnVuIDE4IDE0OjExOjMwIEVEVCAxOTkxCisKKyAgICAgQnJva2UgdGhlIHBhcnNlciBpbnRvIHBhcnRzLCBvbmUgY29udGFpbmluZyB0aGUgQyBncmFtbWFyIGFuZCB0aGUgb3RoZXIKKyAgICAgY29udGFpbmluZyBjb2RlIHRvIGJlIHNoYXJlZCBieSBhbGwgb2YgdGhlIGdyYW1tYXJzLgorCisgICAgIFRoZSBmb2xsb3dpbmcgZmlsZXMgbm8gbG9uZ2VyIGV4aXN0OgorCisgICAgICAgICAgZXhwcmVhZC55CisgICAgICAgICAgZXhwcmVhZC50YWIuYworCisgICAgIFRoZSBmb2xsb3dpbmcgZmlsZXMgd2VyZSBhZGRlZDoKKworICAgICAgICAgIGMtZXhwLnkgICAgICAgIChUaGUgQyBncmFtbWFyKQorICAgICAgICAgIG0yLWV4cC55ICAgICAgIChUaGUgTW9kdWxhLTIgZ3JhbW1hcikKKyAgICAgICAgICBwYXJzZXItY29kZS5jICAoQ29kZSB0aGF0IGlzIHNoYXJlZCBieSB0aGUgYWJvdmUgZ3JhbW1hcikKKyAgICAgICAgICBwYXJzZXItY29kZS5oCisgICAgICAgICAgcGFyc2VyLWRlZnMuaAorCisgICAgIE1ha2VmaWxlLmRpc3QgIENoYW5nZWQgdG8gcmVmbGVjdCB0aGUgYWJvdmUgZGVwZW5kZW5jaWVzLiAgTk9URTogIEl0IGlzCisgICAgICAgICAgICAgICAgICAgIG5vdyBuZWNlc3NhcnkgdG8gdXNlIHRoZSBCaXNvbiBjb21waWxlciBjb21waWxlciwgc2luY2UgaXQKKyAgICAgICAgICAgICAgICAgICAgd2lsbCBnZW5lcmF0ZSBmdW5jdGlvbi92YXJpYWJsZSBwcmVmaXhlcyBvdGhlciB0aGFuIHl5LgorCitUdWUgSnVuIDE4IDE2OjQ3OjQ5IEVEVCAxOTkxCisKKyAgICAgc3ltdGFiLltjaF0gICAgQWRkZWQgdGhlIGV4dGVybmFsIHZhcmlhYmxlIHdvcmtpbmdfbGFuZywgdGhhbiBob2xkcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgdGhlIGN1cnJlbnQgd29ya2luZyBsYW5ndWFnZS4KKyAgICAgICAgICAgICAgICAgICAgQWRkZWQgdGhlIGVubnVtZXJhdGVkIHR5cGUgbGFuZ3VhZ2VfbW9kZSwgd2l0aCB0aGUgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlX2F1dG8gYW5kIGxhbmd1YWdlX21hbnVhbCwgdGhlIGZvcm1lciBtZWFuaW5nIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgR0RCIHNldHMgd29ya2luZ19sYW5nIGFzIG5lZWRlZCwgYW5kIHRoZSBsYXR0ZXIgbWVhbmluZworICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSB2YWx1ZSBvZiB3b3JraW5nX2xhbmcgaXMgdG90YWxseSB1bmRlciB1c2VyCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuCisgICAgIHN5bXRhYi5bY2hdICAgIEFkZGVkIHRoZSBNb2R1bGEtMiBwZXJ2YXNpdmUgdHlwZXMgSU5URUdFUiwgQ0FSRElOQUwsCisgICAgICAgICAgICAgICAgICAgIFJFQUwsIEJPT0xFQU4gYW5kIENIQVIuICBBbHNvIGFkZGVkIHRoZSB0eXBlIGNvZGVzCisgICAgICAgICAgICAgICAgICAgIFRZUEVfQ09ERV9CT09MIGFuZCBUWVBFX0NPREVfQ0hBUi4KKyAgICAgdXRpbHMuYyAgICAgICAgQWRkZWQgc2V0X2xhbmd1YWdlX2NvbW1hbmQgYW5kIHNob3dfbGFuZ3VhZ2VfY29tbWFuZCB0bworICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnQgdGhlIEdEQiBzdXBwb3J0IGNvbW1hbmRzICJzZXQgbGFuZ3VhZ2UiIGFuZAorICAgICAgICAgICAgICAgICAgICAic2hvdyBsYW5ndWFnZSIuCisgICAgIGV4cHJlc3Npb24uaCAgIEEgbnVtYmVyIG9mIGlkZW50aWZpZXJzIHdlcmUgYWRkZWQgdG8gdGhlIHR5cGUgZXhwX29wY29kZQorICAgICAgICAgICAgICAgICAgICB0byBmYWNpbGl0YXRlIE1vZHVsYS0yIGJ1aWx0aW4gZnVuY3Rpb25zLCBpbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgIGRpdmlzaW9uLCBhbmQgYXJyYXkgaW5kZXhpbmcuCisKK1dlZCBKdW4gMTkgMTM6MjU6NTggRURUIDE5OTEKKworICAgICBsYW5ndWFnZS5oICAgICBBZGRlZCB0aGUgbWFjcm8gU1RSSUNUX1RZUEUsIHdoaWNoIGV2YWx1YXRlcyB0byBub24temVybworICAgICAgICAgICAgICAgICAgICBpZiB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWVkIGJ5IHdvcmtpbmdfbGFuZyByZXF1aXJlcyB0aGUgdXNlCisgICAgICAgICAgICAgICAgICAgIG9mIHN0cmljdCB0eXBpbmcgb2YgZXhwcmVzc2lvbnMuICBFdmVudHVhbGx5LCBldmVuIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBhYmxlIHRvIGJlIGNoYW5nZWQgYnkgdGhlIHVzZXIuCisgICAgICAgICAgICAgICAgICAgIEFkZGVkIHRoZSBtYWNybyBSQU5HRV9DSEVDSywgd2hpY2ggZXZhbHVhdGVzIHRvIG5vbi16ZXJvCisgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBsYW5ndWFnZSBzcGVjaWZpZWQgYnkgd29ya2luZ19sYW5nIHJlcXVpcmVzIHRoZQorICAgICAgICAgICAgICAgICAgICBjaGVja2luZyBvZiBhIHZhbHVlIGFnYWluc3QgdGhlIGRvbWFpbiBvZiBpdHMgdHlwZS4KKyAgICAgICAgICAgICAgICAgICAgRXZlbnR1YWxseSwgZXZlbiB0aGlzIHdpbGwgYmUgYWJsZSB0byBiZSBjaGFuZ2VkIGJ5IHRoZQorICAgICAgICAgICAgICAgICAgICB1c2VyLgorICAgICBsYW5ndWFnZS5bY2hdICBQcmVkaWNhdGVzIGludm9sdmluZyB0eXBlcyAoc2ltcGxlX3R5cGUsIG9yZGVyZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgc2FtZV90eXBlLCBpbnRlZ3JhbF90eXBlLCBudW1lcmljX3R5cGUsIGNoYXJhY3Rlcl90eXBlLAorICAgICAgICAgICAgICAgICAgICBib29sZWFuX3R5cGUsIGZsb2F0X3R5cGUpIGFyZSBhZGRlZC4gIFRoZXNlIHByZWRpY2F0ZXMgYXJlCisgICAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHdvcmtpbmdfbGFuZywgYW5kIGFyZSBoYW5keQorICAgICAgICAgICAgICAgICAgICBpbiB0eXBlLWNoZWNraW5nLgorCitXZWQgSnVuIDE5IDE1OjM5OjM0IEVEVCAxOTkxCisKKyAgICAgZXZhbC5jICAgICAgICAgQWRkZWQgdGhlIGZ1bmN0aW9uIHR5cGVfYXJyYXlfcmFuayB3aGljaCBjb21wdXRlcyB0aGUgcmFuaworICAgICAgICAgICAgICAgICAgICBvZiBhbiBhcnJheSB0eXBlLgorICAgICB2YWxhcml0aC5jICAgICBBZGRlZCB0aGUgZnVudGlvbiB2YWx1ZV9ib29sLCB3aGljaCB3aGVuIGdpdmVuIGEgaW50ZWdlcgorICAgICB2YWx1ZS5oICAgICAgICB2YWx1ZSAoaWUuIHN0cnVjdCB2YWx1ZSAqKSBhcyBhbiBhcmd1bWVudCwgaXQgcmV0dXJucyBhCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsdWUgKGllLiAgc3RydWN0IHZhbHVlICopIHRydWUgaWYgdGhhdCBpbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgIGlzIG5vbi16ZXJvLCBhbmQgYSBib29sZWFuIHZhbHVlIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgdmFscHJpbnQuYyAgICAgQWRkZWQgY2FzZXMgZm9yIFRZUEVfQ09ERV9CT09MLCBzbyBNb2R1bGEtMiBCT09MRUFOIHZhbHVlcworICAgICAgICAgICAgICAgICAgICB3aWxsIHByaW50IG91dCBwcm9wZXJseS4KKworV2VkIEp1biAxOSAxNjozNjozNCBFRFQgMTk5MQorCisgICAgIHZhbG9wcy5jICAgICAgIEFkZGVkIHRoZSBmdW5jdGlvbiB2YWx1ZV9jYXBpdGFsaXplLCB3aGljaCByZXR1cm5zIGl0CisgICAgIHZhbHVlLmggICAgICAgIGFyZ3VtZW50IGNhcGl0YWxpemVkIGlmIGl0cyBhcmd1bWVudCBpcyBhIGxvd2VyY2FzZQorICAgICAgICAgICAgICAgICAgICBsZXR0ZXIsIG9yIHRoZSBhcmd1bWVudCB1bmNoYW5nZWQgaWYgaXRzIGFyZ3VtZW50IGlzIG5vdCBhCisgICAgICAgICAgICAgICAgICAgIGxldHRlci4KKyAgICAgdmFsYXJpdGguYyAgICAgQWRkZWQgdGhlIGZ1bmN0aW9uIHJhbmdlX2NoZWNrX3AsIHdoaWNoIHJldHVybnMgbm9uLXplcm8KKyAgICAgdmFsdWUuaCAgICAgICAgaWYgaXRzIHZhbHVlIGFyZ3VtZW50IGlzIGJldHdlZW4gdGhlIGludGVncmFsIGJvdW5kcyB1cHBlcgorICAgICAgICAgICAgICAgICAgICBhbmQgbG93ZXIuCisgICAgICAgICAgICAgICAgICAgIEFkZGVkIHRoZSBmdW5jdGlvbiByYW5nZV9jaGVja19lbnVtX3AsIHdoaWNoIG1ha2VzIHN1cmUKKyAgICAgICAgICAgICAgICAgICAgdGhhdCBpdHMgdmFsdWUgYXJndW1lbnQgaXMgYSB2YWxpZCBtZW1iZXIgb2YgdGhlIGRvbWFpbiBvZgorICAgICAgICAgICAgICAgICAgICBpdHMgdHlwZSBhcmd1bWVudC4KKyAgICAgICAgICAgICAgICAgICAgQWRkZWQgdGhlIGZ1bmN0aW9uIHJhbmdlX2NoZWNrX3JhbmdlX3AsIHdoaWNoIG1ha2VzIHN1cmUKKyAgICAgICAgICAgICAgICAgICAgaXRzIHZhbHVlIGFyZ3VtZW50IGxpZXMgYmV0d2VlbiB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcworICAgICAgICAgICAgICAgICAgICBvZiBpdHMgdHlwZSBhcmd1bWVudCwgd2hpY2ggbXVzdCBiZSBhIHJhbmdlZCB0eXBlLgorICAgICAgICAgICAgICAgICAgICBBZGRlZCB0aGUgZnVuY3Rpb24gY2hlY2tfYXJyYXlfaW5kZXgsIHdoaWNoIHJhbmdlIGFuZCB0eXBlCisgICAgICAgICAgICAgICAgICAgIGNoZWNrcyBhbiBpbmRleCBvZiBhbiBhcnJheS4KKyAgICAgICAgICAgICAgICAgICAgQWRkZWQgdGhlIGZ1bmN0aW9uIHZhbHVlX211bHRpX3N1YnNjcmlwdCwgd2hpY2ggY29tcHV0ZXMKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlbaWR4MSxpZHgyLi4uaWR4Tl0sIGdpdmVuIGEgdmFsdWUgYXJyYXkgYW5kIGFuIGFycmF5CisgICAgICAgICAgICAgICAgICAgIG9mIHZhbHVlcyByZXByZXNlbnRpbmcgaW5kaWNpZXMuCisgICAgIHZhbHVlcy5jICAgICAgIENoYW5nZWQgdmFsdWVfZnJvbV9sb25nIHRvIHdvcmsgd2l0aCBUWVBFX0NPREVfQ0hBUiBhbmQKKyAgICAgICAgICAgICAgICAgICAgdW5wYWNrX2xvbmcgdG8gd29yayB3aXRoIFRZUEVfQ09ERV9CT09MIGFuZAorICAgICAgICAgICAgICAgICAgICBUWVBFX0NPREVfQ0hBUi4KKworV2VkIEp1biAxOSAxODowNDowOCBFRFQgMTk5MQorCisgICAgIHN5bXRhYi5jICAgICAgIFN0b3JlZCBwZXJ2YXNpdmUgdHlwZXMgaW4gYSBzdHJ1Y3R1cmUgYW5kIG1ha2UKKyAgICAgICAgICAgICAgICAgICAgbG9va3VwX3BlcnZhc2l2ZV90eXBlKCkgYSBsb29rdXAgZnVuY3Rpb24gdGhhdCB3YXMgYmFzZWQKKyAgICAgICAgICAgICAgICAgICAgb24gd29ya2luZ19sYW5nLiAgSWYgbG9va3VwX3BlcnZhc2l2ZV90eXBlKCkgcmV0dXJuZWQKKyAgICAgICAgICAgICAgICAgICAgbm9uLXplcm8sIHRoZW4gdGhhdCB2YWx1ZSB3YXMgcmV0dXJuZWQgKGEgZml4LCBzaW5jZQorICAgICAgICAgICAgICAgICAgICBiZWZvcmUgaXQgc2ltcGx5IHdvdWxkbid0IHJldHVybiB0aGUgcGVydmFzaXZlIHR5cGUuKQorICAgICBsYW5ndWFnZS5oICAgICBBZGRlZCB0aGUgbWFjcm8gQ0FTVF9JU19DT05WRVJTSU9OLCB3aGljaCBldmFsdWF0ZXMgdG8KKyAgICAgICAgICAgICAgICAgICAgbm9uLXplcm8gaWYgdGhlIGxhbmd1YWdlIHNwZWNpZmllZCBieSB3b3JraW5nX2xhbmcgbWVhbnMKKyAgICAgICAgICAgICAgICAgICAgImNvbnZlcnNpb24iIHdoZW4gaXQgc2F5cyAiY2FzdCIuCisgICAgIHZhbG9wcy5jICAgICAgIEFkZGVkIHRoZSBmdW5jdGlvbiB2YWx1ZV9yZWFsX2Nhc3QoKSwgd2hpY2ggcGVyZm9ybXMgYQorICAgICB2YWx1ZS5oICAgICAgICAqY2FzdCosIG5vdCBhICpjb252ZXJzaW9uKiwgd2hpY2ggaXMgd2hhdCB2YWx1ZV9jYXN0KCkKKyAgICAgICAgICAgICAgICAgICAgZG9lcyB3aGVuIGl0IGNhbi4gIEluIHBhcnRpY3VsYXIsCisgICAgICAgICAgICAgICAgICAgIHZhbHVlX2Nhc3QoPGZsb2F0X3R5cGU+LDQpID0gNC4wLCB3aGlsZQorICAgICAgICAgICAgICAgICAgICB2YWx1ZV9yZWFsX2Nhc3QoPGZsb2F0X3R5cGU+LDQpID0gc29tZSBtZXNzLgorICAgICBldmFsLmMgICAgICAgICBNb2R1bGEtMiBidWlsdGluIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZDogIEFCUywgQ0FQLCBDSFIsCisgICAgIHBhcnNlci1jb2RlLmMgIEZMT0FULCBISUdILCBNQVgsIE1JTiwgT0RELCBPUkQsIFRSVU5DLCBhbmQgVkFMLiAgCisgICAgIGV4cHJlc3Npb24uaCAgIEFkZGVkIG1hY3JvcyBNQVhfT0ZfVFlQRSBhbmQgTUlOX09GX1RZUEUgdG8gd29yayB3aXRoIE1BWAorICAgICAgICAgICAgICAgICAgICBhbmQgTUlOIG9uIGludGVncmFsIHR5cGVzLiAgKk5PVEUqOiBUaGVzZSBhcmUgY3VycmVudGx5CisgICAgICAgICAgICAgICAgICAgIGhhcmRjb2RlZCB0byB3b3JrIG9ubHkgaWYgdGhlcmUgYXJlIDggYml0cyBwZXIgc3RvcmFnZQorICAgICAgICAgICAgICAgICAgICB1bml0LiAgRklYTUUuCisgICAgIGV2YWwuYyAgICAgICAgIE1hZGUgbG9naWNhbCBmdW5jdGlvbnMgY2FsbCB2YWx1ZV9ib29sIHRvIHJldHVybiBhCisgICAgICAgICAgICAgICAgICAgIHByb3Blcmx5IHR5cGVkIGJvb2xlYW4gdmFsdWUsIGJhc2VkIG9uIHdvcmtpbmdfbGFuZy4KKworVGh1IEp1biAyMCAxMTo1NToyNyBFRFQgMTk5MQorCisgICAgIHZhbHByaW50LmMgICAgIFR5cGVzIG5vdyBwcmludCBvdXQgaW4gYSBNb2R1bGEtMiBmYXNoaW9uLiAgVGhpcyB3b3JrcyBmb3IKKyAgICAgICAgICAgICAgICAgICAgdGhlIGNhc2VzIHdoZW4gdGhlIHR5cGUgaXMgcHJpbnRlZCBvdXQgc3RlcC1ieS1zdGVwLCB0aGF0CisgICAgICAgICAgICAgICAgICAgIGlzLCBpdCBkb2Vzbid0IHdvcmsgd2hlbiB0aGUgbmFtZSBvZiBhIHN0cnVjdHVyZWQgdHlwZQorICAgICAgICAgICAgICAgICAgICAod2hpY2ggaW5jbHVkZXMgdGhlIGtleXdvcmQgInN0cnVjdCIsIGV0Yy4pICBpcyBzaW1wbHkKKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheWVkLgorICAgICAgICAgICAgICAgICAgICBGSVhNRTogIFBlcmhhcHMgdGhpcyBpcyBiYWQuICBQYXJ0cyBvZiBpdCBzZWVtIHRvIGtsdWRnZXksCisgICAgICAgICAgICAgICAgICAgIHNpbmNlIHR5cGUgc3BlY2lmaWNhdGlvbnMgaW4gQyBhbmQgTW9kdWxhLTIgYXJlIHZlcnkKKyAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50LiAgVGhlIEMgcHJpbnRpbmcgb2YgYSB0eXBlIGlzIHZlcnkgcmVjdXJzaXZlLAorICAgICAgICAgICAgICAgICAgICB3aGVyZWFzIGluIE1vZHVsYS0yIGl0IGlzIGdlbmVyYWxseSB2ZXJ5IHNpbXBsZS4gIEMgaGFzCisgICAgICAgICAgICAgICAgICAgIHR5cGUgcHJlZml4ZXMgYW5kIHN1ZmZpeGVzLCB3aGljaCBoYXZlIG5vIHJlYWwgYW5hbG9ndWUgaW4KKyAgICAgICAgICAgICAgICAgICAgTW9kdWxhLTIuICBNYXliZSB0eXBlX3ByaW50KCkgc2hvdWxkIGNhbGwgYSBsYW5ndWFnZQorICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyB0eXBlIHByaW50ZXIuICBUaGlzIGlzIGFsc28gYWR2YW50YWdlb3VzIGlmIHdlCisgICAgICAgICAgICAgICAgICAgIGNvbXBpbGUgR0RCIHRvIGV4Y2x1ZGUgc29tZSBvZiB0aGUgbGFuZ3VhZ2VzLiAgV2UnbGwganVzdAorICAgICAgICAgICAgICAgICAgICBsZWF2ZSB0aG9zZSBmdW5jdGlvbnMgb3V0LgorCitUaHUgSnVuIDIwIDE2OjU3OjEwIEVEVCAxOTkxCisKKyAgICAgZGJ4cmVhZC5jICAgICAgV2hlbiByZWFkaW5nIHRoZSBjb21wbGV0ZSBzeW1ib2wgdGFibGUgaW4gKHZpYQorICAgICAgICAgICAgICAgICAgICBwc3ltdGFiX3RvX3N5bXRhYigpKSwgdGhlIG51bWJlciBhbmQgdHlwZXMgb2YgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzIGFyZSBhZGRlZCB0byBhIGZ1bmN0aW9uIHR5cGUuICBkZWZpbmVfc3ltYm9sKCkKKyAgICAgICAgICAgICAgICAgICAgY2FsbHMgYWRkX3BhcmFtX3RvX3R5cGUoKSB0byBhY2NvbXBsaXNoIHRoaXMuCisgICAgICAgICAgICAgICAgICAgIEFzc3VtcHRpb246ICB3aGVuIHdlIGNvbWUgYWNyb3NzIGEgZnVuY3Rpb24gZGVmaW5pdGlvbgorICAgICAgICAgICAgICAgICAgICAoTl9GVU4gc3ltYm9sIHdpdGggYW4gJ2YnIG9yICdGJyBpbiB0aGUgbmFtZSksIGl0cworICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMgd2lsbCBhcHBlYXIgYmVmb3JlIGFub3RoZXIgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgV2hlbiBhIGZ1bmN0aW9uIGlzIGZvdW5kLCBhIHBvaW50ZXIgdG8gaXRzIHR5cGUgaXMgcGxhY2VkCisgICAgICAgICAgICAgICAgICAgIGluIHRoZSBnbG9iYWwgaW5fZnVuY3Rpb25fdHlwZS4gIENoYW5nZXMgdGhhdAorICAgICAgICAgICAgICAgICAgICBhZGRfcGFyYW1fdG9fdHlwZSgpIG1ha2VzIGFyZSB0byB0aGlzIGdsb2JhbC4KKyAgICAgdmFscHJpbnQuYyAgICAgVGhlIHR5cGUgb2YgYSBmdW5jdGlvbiBub3cgaW5jbHVkZXMgKGZvciBNb2R1bGEtMikgdGhlCisgICAgICAgICAgICAgICAgICAgIHR5cGVzIG9mIGl0cyBwYXJhbWV0ZXJzLgorICAgICBldmFsLmMgICAgICAgICBUeXBlIGNoZWNraW5nIGFuZCBhIGNoZWNrIGZvciB0aGUgcHJvcGVyIG51bWJlciBvZgorICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMgaXMgbm93IGRvbmUgZm9yIGZ1bmN0aW9uIGNhbGxzLiAgTm90IHN1cmUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIGltcGFjdCB0aGlzIGhhcyBvbiBDKysgbWVtYmVyIGZ1bmN0aW9uIHlldC4KKworVGh1IEp1biAyMCAxOTo1ODo0OCBFRFQgMTk5MQorCisgICAgIHZhbHByaW50LmMgICAgIFJld3JvdGUgdGhlIHR5cGUgcHJpbnRlci4gIEJyb2tlIGl0IGludG8gdHdvIGxhbmd1YWdlCisgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIHBhcnRzLCBhZGRpbmcgdGhlIGZ1bmN0aW9ucyB0eXBlX3ByaW50X20yKCkgYW5kCisgICAgICAgICAgICAgICAgICAgIHR5cGVfcHJpbnRfbTJfMSgpLgorICAgICAgICAgICAgICAgICAgICBBbiB1bmZvcnR1bmF0ZSBjb25zZXF1ZW5jZSBpcyB0aGlzOiAgaWYgeW91IGRlYnVnZ2luZyBhIEMKKyAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbSBpbiBNb2R1bGEtMiBtb2RlICh3aHk/KSwgaW5mbyB0eXBlcyBkb2VzIG5vdCB3b3JrCisgICAgICAgICAgICAgICAgICAgIHdlbGwgd2l0aCByZWd1bGFyIGV4cHJlc3Npb25zLCBzaW5jZSB0aGUgdHlwZXMgYXJlIHByaW50ZWQKKyAgICAgICAgICAgICAgICAgICAgb3V0IGluIE1vZHVsYS0yIHRlcm1pbm9sb2d5LCBidXQgc3RvcmVkIGluIEMgdGVybWlub2xvZ3kuCisgICAgIGxhbmd1YWdlLltjaF0gIEFkZGVkIHRoZSBmdW5jdGlvbnMgbmV3X3R5cGVfbGFzdCgpLCB0eXBlX2tleXdvcmQoKSwgYW5kCisgICAgICAgICAgICAgICAgICAgIHR5cGVfc2VwKCkgdG8gYWlkIGluIHRoZSBwcmludGluZyBvZiB0eXBlZGVmcy4KKyAgICAgc3ltdGFiLmMgICAgICAgTWFkZSB0aGUgcHJpbnRpbmcgb2YgdHlwZWRlZnMgYXMgbGFuZ3VhZ2UgaW5kZXBlbmRlbnQgYXMKKyAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgdGhyb3VnaCBjYWxscyB0byBuZXdfdHlwZV9sYXN0KCksIHR5cGVfa2V5d29yZCgpLAorICAgICAgICAgICAgICAgICAgICBhbmQgdHlwZV9zZXAoKS4KKworRnJpIEp1biAyMSAxMTo1MDoyNiBFRFQgMTk5MQorCisgICAgIGRieHJlYWQuYyAgICAgIENoZWNrIGFsbCBpbmNvbWluZyBlbm51bWVyYXRlZCB0eXBlcy4gIElmIGl0IGxvb2tzIGxpa2UKKyAgICAgICAgICAgICAgICAgICAgTW9kdWxhLTIncyBCT09MRUFOIHR5cGUsIHRoZW4gY2hhbmdlIHRoZSB0eXBlX2NvZGUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIHR5cGUgdG8gVFlQRV9DT0RFX0JPT0wgc28gd2UgY2FuIHByb2Nlc3MgaXQgYXMgYSBib29sZWFuCisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLgorICAgICB2YWxwcmludC5jICAgICBSZXBsYWNlZCBzb21lIG9mIHRoZSAweCV4IHdpdGggY2FsbHMgdG8gc3ByaW50ZiBhbmQKKyAgICAgICAgICAgICAgICAgICAgaGV4Zm9ybWF0KCkgaW4gdmFsX3ByaW50KCkuCisgICAgIGxhbmd1YWdlLltjaF0gIEFkZGVkIHRoZSBmdW5jdGlvbiBoZXhfdG9fc3RyaW5nKCksIHdoaWNoIGNvbnZlcnRzIGl0cworICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhbCBhcmd1bWVudCB0byBhIGhleGFkZWNpbWFsIG51bWJlciAoZm9ybWF0IGlzCisgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlIGJhc2VkKSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGEgc3RyaW5nLgorCitNb24gSnVuIDI0IDEyOjI1OjA3IEVEVCAxOTkxCisKKyAgICAgdmFscHJpbnQuYyAgICAgU29tZSBmdW5jdGlvbnMgY2FsbCB0eXBlX3ByaW50XzEoKSBkaXJlY3RseSwgaW5zdGVhZCBvZgorICAgICB2YWx1ZS5oICAgICAgICB1c2luZyB0eXBlX3ByaW50KCksIHNvIHRoZXkgY2FuIHNwZWNpZnkgd2hlcmUgKGNvbHVtbikgdG8KKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpbmdzLiAgU2luY2UgdHlwZV9wcmludCgpIHRha2VzIGNhcmUgb2YgbGFuZ3VhZ2UKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jZSwgdGhhdCBuZWVkcyB0byBiZSBjYWxsZWQgZmlyc3QuICBBZGRlZCBhCisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBkZXB0aCB0byB0eXBlX3ByaW50KCkgKHNvIGl0IGlzIG5vdyBsaWtlCisgICAgICAgICAgICAgICAgICAgIHR5cGVfcHJpbnRfMSkuICBDaGFuZ2VkIHR5cGVfcHJpbnQgdG8gdHlwZV9wcmludF9hdCwgYW5kCisgICAgICAgICAgICAgICAgICAgIG1hZGUgdHlwZV9wcmludCBhIG1hY3JvIHRoYXQgcGFzc2VzIGEgZGVwdGggYXJndW1lbnQgb2YKKyAgICAgICAgICAgICAgICAgICAgemVyby4KKyAgICAgc3ltbWlzYy5jICAgICAgQ2hhbmdlZCBhbGwgY2FsbHMgdG8gdHlwZV9wcmludF8xIHRvIGNhbGxzIHRvCisgICAgICAgICAgICAgICAgICAgIHR5cGVfcHJpbnRfYXQuCisgICAgIE1ha2VmaWxlLmRpc3QgIE1hZGUgaXQgcG9zc2libGUgdG8gYnVpbGQgR0RCIGZvciBhIHNwZWNpZmljIHNldCBvZgorICAgICBkZXBlbmQgICAgICAgICBsYW5ndWFnZXMuICBEbyB0aGlzIGJ5IHBhc3NpbmcgYSBkZWZpbml0aW9uIGZvciB0aGUgbWFjcm8KKyAgICAgICAgICAgICAgICAgICAgTEFOR1MgdG8gbWFrZS4gIExBTkdTIHNob3VsZCBiZSBhIHN0cmluZyBjb250YWluaW5nIGEKKyAgICAgICAgICAgICAgICAgICAgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbGFuZ3VhZ2UgbmFtZXMgKGllLiBMQU5HUz0iYyBtMiIpLgorICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyB0byBidWlsZCBhbGwgbGFuZ3VhZ2VzLiAgTm90ZSB0aGF0IGdyYW1tYXIKKyAgICAgICAgICAgICAgICAgICAgZmlsZXMgbXVzdCBmb2xsb3cgdGhlIG5hbWluZyBjb252ZW50aW9uIG9mIDxsYW5nPi1leHAueS4KKyAgICAgZ2RiLmxhbmcgICAgICAgVGhpcyBob2xkcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgTEFOR1MgbWFjcm8uICBJdCBpcworICAgICAgICAgICAgICAgICAgICBleGFtaW5lZCBldmVyeSB0aW1lIG1ha2UgaXMgY2FsbGVkLCBhbmQgaXMgdXBkYXRlZCBpZgorICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcnkuCisgICAgIGV2YWwuYyAgICAgICAgIEFkZGVkICNpZmRlZiBfTEFOR188bGFuZz4gdG8gdGhlc2UgZmlsZXMuCisgICAgIGV4cHJlYWQuYyAgICAgIFN0aWxsIG5lZWQgdG8gYWRkIHRoZW0gdG8gZGJ4cmVhZC5jIGFuZCBjb2ZmcmVhZC5jLgorICAgICBtYWluLmMKKyAgICAgc291cmNlLmMKKyAgICAgc3ltdGFiLmMKKyAgICAgdXRpbHMuYworICAgICB2YWxhcml0aC5jCisgICAgIHZhbHByaW50LmMKKworTW9uIEp1biAyNCAxNjozMzoxMSBFRFQgMTk5MQorCisgICAgIGxhbmd1YWdlLltjaF0gIEFkZGVkIHRoZSBmdW5jdGlvbnMgaGV4Zm9ybWF0X3ByZSgpIGFuZAorICAgICAgICAgICAgICAgICAgICBoZXhfdG9fc3RyaW5nX3ByZSgpLCB3aGljaCB0YWtlIGEgcHJlZml4IGFyZ3VtZW50IHRvCisgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgaW4gdGhlIGZvcm1hdCBzdHJpbmcuICBUaHVzLCBoZXhmb3JtYXRfcHJlKCIwOCIpIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIweDA4eCIgKGlmIHRoZSB3b3JraW5nIGxhbmd1YWdlIGlzIGxhbmd1YWdlX2MpLiAKKyAgICAgICAgICAgICAgICAgICAgTWFkZSBoZXhmb3JtYXQoKSBhbmQgaGV4X3RvX3N0cmluZygpIGNhbGxzIHRvIHRoZSBhYm92ZQorICAgICAgICAgICAgICAgICAgICB3aXRoICIiIGFzIHRoZSBwcmVmaXggYXJndW1lbnQuCisKKyAgICAgYW0yOWstcGluc24uYywgYXJtLXBpbnNuLmMsIGJyZWFrcG9pbnQuYywgY29udmV4LXRkZXAuYywgZXhlYy5jLCBjb3JlLmMsCisgICAgIGRieHJlYWQuYywgaTM4Ni1waW5zbi5jLCBpMzg2LXN0dWIuYywgaTM4Ni14ZGVwLmMsIGk5NjAtcGluc24uYywKKyAgICAgaW5mY21kLmMsIGluZmxvdy5jLCBtNjhrLXBpbnNuLmMsIG02OGstc3R1Yi5jLCBtODhrLXBpbnNuLmMsCisgICAgIG1pcHMtcGluc24uYywgbWlwcy10ZGVwLmMsIG5zMzJrLXBpbnNuLmMsIHByaW50Y21kLmMsIHB5ci1waW5zbi5jLAorICAgICBweXItdGRlcC5jLCBweXIteGRlcC5jLCByZW1vdGUtdnguYywgcmVtb3RlLmMsIHNvbGliLmMsIHNvdXJjZS5jLAorICAgICBzdGFjay5jLCBzdW4zODYteGRlcC5jLCBzeW1maWxlLmMsIHN5bW0teGRlcC5jLCBzeW1taXNjLmMsIHRhaG9lLXBpbnNuLmMsCisgICAgIHZhbHByaW50LmMsIHZheC1waW5zbi5jCisKKyAgICAgICAgICBDaGFuZ2VkIGFsbCBvY2N1cmVuY2VzIG9mIDB4JVswLTldKmwqeCBpbiBwcmludGYgZm9ybWF0IHN0cmluZ3MgdG8KKyAgICAgICAgICBjYWxscyB0byBoZXhmb3JtYXQoKSBhbmQgaGV4X3RvX3N0cmluZygpLiAgRm9ybWF0IHN0cmluZ3Mgd2l0aG91dAorICAgICAgICAgIHRoZSBsZWFkaW5nICIweCIgd2VyZSBpZ25vcmVkLgorCisgICAgIGRlcGVuZCAgICAgICAgIFVwZGF0ZWQgdG8gdGFrZSB0aGUgYWJvdmUgaW50byBhY2NvdW50LgorCisKK1R1ZSBKdW4gMjUgMTU6Mjc6MTggRURUIDE5OTEKKworICAgICBzeW10YWIuaCAgICAgICBBZGRlZCB0aGUgdHlwZXMgcmFuZ2VfbW9kZV90LCByYW5nZV9jaGVja190LCB0eXBlX21vZGVfdCwKKyAgICAgICAgICAgICAgICAgICAgYW5kIHR5cGVfY2hlY2tfdCB0byBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHN0YXRlIG9mCisgICAgICAgICAgICAgICAgICAgIHJhbmdlIGFuZCB0eXBlIGNoZWNraW5nLgorICAgICBtYWluLmMgICAgICAgICBBZGRlZCB0aGUgdmFyaWFibGVzIHJhbmdlX21vZGUsIHJhbmdlX2NoZWNrLCB0eXBlX21vZGUsCisgICAgICAgICAgICAgICAgICAgIGFuZCB0eXBlX2NoZWNrIHRvIHJlY29yZCB0aGUgY3VycmVudCBzdGF0ZSBvZiByYW5nZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgdHlwZSBjaGVja2luZy4gIEFkZGVkIGluaXRpYWxpemF0aW9uIGNvZGUgdG8gbWFpbigpLgorICAgICBsYW5ndWFnZS5oICAgICBDaGFuZ2VkIHRoZSBtYWNyb3MgU1RSSUNUX1RZUEUgYW5kIFJBTkdFX0NIRUNLIHRvIGV4YW1pbmUKKyAgICAgICAgICAgICAgICAgICAgdGhlIGFib3ZlIHZhcmlhYmxlcy4KKworCitUdWUgSnVuIDI1IDE3OjU3OjA4IEVEVCAxOTkxCisKKyAgICAgZGJ4cmVhZC5jICAgICAgcHJvY2Vzc19vbmVfc3ltYm9sKCkgdXBkYXRlcyB0aGUgdmFyaWFibGUgKGVudW0gbGFuZ3VhZ2UpCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9sYW5nIGJhc2VkIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGVuYW1lCisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZCBpbiB0aGUgTl9TTyBzeWJtb2wgdGhhdCBzdGFydGVkIHRoaXMgc3ltdGFiLgorICAgICAgICAgICAgICAgICAgICBXaGVuIGVuZF9zeW10YWIoKSBpcyBjYWxsZWQsIHRoZSB2YWx1ZSBvZiBzb3VyY2VfbGFuZyBpcworICAgICAgICAgICAgICAgICAgICBwdXQgaW50byB0aGUgbGFuZ3VhZ2UgZmllbGQuCisgICAgIHN0YWNrLmMgICAgICAgIHNlbGVjdF9mcmFtZSgpIHNldHMgd29ya2luZ19sYW5nIChhbmQgcG9zc2libHkgdHlwZV9jaGVjaworICAgICAgICAgICAgICAgICAgICBhbmQgcmFuZ2VfY2hlY2spIHRvIHRoZSBsYW5ndWFnZSBmaWVsZCBvZiB0aGUgc3ltdGFiCisgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZnJhbWUgdGhhdCBpcyBzZWxlY3RlZCBpZiB3b3JraW5nX21vZGUKKyAgICAgICAgICAgICAgICAgICAgaXMgbGFuZ3VhZ2VfYXV0by4gIElmIHdvcmtpbmdfbW9kZSBpcyBsYW5ndWFnZV9tYW51YWwsIGEKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyBpcyBwcmludGVkIGFuZCB3b3JraW5nX2xhbmcgaXMgbm90IHNldC4KKyAgICAgbGFuZ3VhZ2UuYyAgICAgQWRkZWQgdGhlIGZ1bmN0aW9uIHNldF90eXBlX3JhbmdlKCksIHdoaWNoIHNldHMgdGhlIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgIHR5cGVfY2hlY2sgYW5kIHJhbmdlX2NoZWNrIChpZiB0aGVpciBtb2RlcyBjYWxsIGZvcgorICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWMgc2V0dGluZykgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmFsdWUgb2YKKyAgICAgICAgICAgICAgICAgICAgd29ya2luZ19sYW5nLiAgQSBub24temVybyBhcmd1bWVudCB3aWxsIGNhdXNlIHRoZSBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzIHRvIGJlIG91dHB1dC4KKworCitXZWQgSnVuIDI2IDE0OjUxOjQwIEVEVCAxOTkxCisKKyAgICAgZXZhbC5jICAgICAgICAgQWRkZWQgcmFuZ2UgY2hlY2tzIG9uIGFzc2lnbm1lbnQuCisgICAgIG0yLWV4cC55ICAgICAgIEFkZGVkIHRoZSBncmFtbWFyIGZvciBzZXRzIHRvIHRoZSBsYW5ndWFnZS4gIEN1cnJlbnRseSwKKyAgICAgICAgICAgICAgICAgICAgdGhlc2UgZG8gbm90IGRvIGFueXRoaW5nIGV4Y2VwdCBwcmludCBhbiBlcnJvciBtZXNzYWdlLgorCitXZWQgSnVuIDI2IDE3OjAxOjA0IEVEVCAxOTkxCisKKyAgICAgbTItZXhwLnkgICAgICAgQWRkZWQgdGhlIGFiaWxpdHkgZm9yIHBhcnNlX251bWJlcigpIHRvIHBhcnNlIG5lZ2F0aXZlCisgICAgICAgICAgICAgICAgICAgIG51bWJlcnMuICBBIGdsb2JhbCBmbGFnIGlzIHNldCB1cG9uIGVuY291bnRlcmluZyBhIHVuYXJ5CisgICAgICAgICAgICAgICAgICAgIG1pbnVzLiAgVGhpcyB3YXMgZG9uZSB0byBtYWtlLCBmb3IgZXhhbXBsZSwgMSBwYXJzZSBhcyBhCisgICAgICAgICAgICAgICAgICAgIENBUkRJTkFMLCBhbmQgbm90IGFzIGFuIGludGVnZXIsIHBlciBXaXJ0aCdzIGV4YW1wbGVzIGluCisgICAgICAgICAgICAgICAgICAgIFByb2dyYW1taW5nIGluIE1vZHVsYS0yIGVkLjQuCisgICAgIHZhbHByaW50LmMgICAgIEFkZGVkIHN1cHBvcnQgZm9yICJzZXQgcmFkaXggMiIgYnkgdGhlbiBzZXR0aW5nCisgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQgdG8gJ3QnLgorICAgICBldmFsLmMgICAgICAgICBJbXBsZW1lbnRlZCByYW5nZSBjaGVja2luZyBvbiBzdWJyYW5nZSB0eXBlcy4gIEFkZGVkIGNhbGxzCisgICAgICAgICAgICAgICAgICAgIHRvIHJhbmdlX2NoZWNrX3JhbmdlX3AgZm9yIEJJTk9QX0FTU0lHTiBhbmQgQklOT1BfVkFMLgorICAgICAgICAgICAgICAgICAgICBJbXBsZW1lbnRlZCBNSU4gYW5kIE1BWCBmb3IgZW5udW1lcmF0ZWQgdHlwZXMuICBUaGUKKyAgICAgICAgICAgICAgICAgICAgbWluaW11bSB2YWx1ZSBvZiBhbiBlbm51bWVyYXRlZCB0eXBlIGlzIGRlZmluZWQgYnkgV2lydGgKKyAgICAgICAgICAgICAgICAgICAgYXMgdGhlIGZpcnN0IGlkZW50aWZpZXIsIGFuZCB0aGUgbWF4aW11bSBhcyB0aGUgbGFzdC4KKyAgICAgbTItZXhwLnkgICAgICAgTWFkZSBvY3RhbCBudW1iZXJzIGVuZGluZyB3aXRoICJCIiBiZSBjaGFyYWN0ZXJzIGFuZCB0aG9zZQorICAgICAgICAgICAgICAgICAgICBlbmRpbmcgd2l0aCAiQyIgYmUgbnVtYmVycywgcGVyIFdpcnRoJ3MgYm9vay4gKHAuIDM0KQorICAgICAgICAgIAorVGh1IEp1biAyNyAxNDoxMTo1MiBFRFQgMTk5MQorCisgICAgIHN0YWNrLmMgICAgICAgIHNlbGVjdF9mcmFtZSgpIG5vdyBvbmx5IHNldHMgd29ya2luZ19sYW5nLCBpdCBkb2VzIG5vdAorICAgICAgICAgICAgICAgICAgICBub3RpZnkgdGhlIHVzZXIuICBJZiB3b3JraW5nX21vZGUgaXMgbGFuZ3VhZ2VfbWFudWFsLCB0aGVuCisgICAgICAgICAgICAgICAgICAgIGEgd2FybmluZyBpcyBpc3N1ZWQgb25jZS4KKyAgICAgbWFpbi5jICAgICAgICAgQXQgdGhlIGVuZCBvZiBlYWNoIGNhbGwgdG8gZXhlY3V0ZV9jb21tYW5kKCksIHdvcmtpbmdfbGFuZworICAgICAgICAgICAgICAgICAgICBpcyBjaGVja2VkIGFnYWluc3QgdGhlIGxvY2FsIHN0YXRpYyAoZW51bSBsYW5ndWFnZSkKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudC4gIElmIHRoZXkgZGlmZmVyIGFuZCB3b3JraW5nX21vZGUgaXMKKyAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VfYXV0bywgdGhlIG5ldyBzZXR0aW5ncyBvZiBsYW5ndWFnZSwgdHlwZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgcmFuZ2UgY2hlY2tpbmcgYXJlIHByaW50ZWQgb3V0LgorICAgICBzdGFjay5jICAgICAgICBNb2RpZmllZCBmcmFtZV9pbmZvKCkgdG8gaW5jbHVkZSB0aGUgbGFuZ3VhZ2Ugb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgZnJhbWUgaW4gdGhlIG91dHB1dCBvZiAiaW5mbyBmcmFtZSIuCisgICAgIGxhbmd1YWdlLltjaF0gIEFkZGVkIHRoZSBmdW5jdGlvbiBsYW5ndWFnZV9zdHIoKSB3aGljaCByZXR1cm5zIHRoZSBuYW1lCisgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBjdXJyZW50IGxhbmd1YWdlLgorCitGcmkgSnVuIDI4IDE1OjMzOjE0IEVEVCAxOTkxCisKKyAgICAgbTItZXhwLnkgICAgICAgQWRkZWQgdGhlIGJ1aWx0LWluIHByb2NlZHVyZXMgSU5DLCBJTkNMLCBERUMsIGFuZCBERUNMIHRvCisgICAgICAgICAgICAgICAgICAgIHRoZSBsYW5ndWFnZS4gIElOQ0wgYW5kIERFQ0wgY3VycmVudGx5IGNhdXNlIGFuIGVycm9yLAorICAgICAgICAgICAgICAgICAgICBzaW5jZSBzZXRzIGFyZSBub3QgaW1wbGVtZW50ZWQgeWV0LiAgSU5DIGFuZCBERUMgYXJlCisgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGFzIFBSRUlOQ1JFTUVOVC9QUkVERUNSRU1FTlQgd2l0aCBvbmUKKyAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQsIGFuZCBhcyBBU1NJR05fTU9ESUZZIHdpdGggdHdvIGFyZ3VtZW50cy4KKyAgICAgZXZhbC5jICAgICAgICAgQWRkZWQgdHlwZSBjaGVja2luZyB0byB0aGUgYWJvdmUgY2FzZXMuCisgICAgIHZhbHVlLmggICAgICAgIEFkZGVkIG5vdF9sdmFsX2NvbnN0YW50IHRvIHRoZSBsdmFsX3R5cGUgZW5udW1lcmF0ZWQgdHlwZS4KKyAgICAgICAgICAgICAgICAgICAgbm90X2x2YWxfY29uc3RhbnQgbWVhbnMgdGhhdCB0aGUgdmFsdWUgaXMgYSBjb25zdGFudAorICAgICAgICAgICAgICAgICAgICB2YWx1ZTsgdGhhdCBpcyAzIG9yICdhJyBvciBUUlVFLCBub3QgYXMgaW4gYSBjb25zdGFudAorICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyLiAgVGhpcyBpcyB1c2VkIHRvIGhlbHAgY29lcmNlIG51bWJlcnMgc3VjaCBhcyAzCisgICAgICAgICAgICAgICAgICAgIHRvIGVpdGhlciBzaWduZWQgb3IgdW5zaWduZWQgbnVtYmVycy4KKyAgICAgdmFsb3BzLmMgICAgICAgQWRkZWQgdGhlIGZ1bmN0aW9uIHZhbHVlX2NvZXJjZV9jb25zdGFudHMoKSB3aGljaCBjb2VyY2VzCisgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50IGludGVnZXJzIGFzIGZvbGxvd2luZzogIGlmIG9uZSBpcyBhIGNvbnN0YW50IGFuZAorICAgICAgICAgICAgICAgICAgICB0aGUgb3RoZXIgaXMgbm90LCB0aGUgY29uc3RhbnQncyB0eXBlIGlzIHNldCB0byB0aGUgdHlwZQorICAgICAgICAgICAgICAgICAgICBvZiB0aGUgb3RoZXIgYXJndW1lbnQuICBJZiBib3RoIGFyZSBjb25zdGFudHMgYW5kIG9uZSBpcworICAgICAgICAgICAgICAgICAgICBzaWduZWQsIHRoZSBvdGhlciBpcyBjb252ZXJ0ZWQgdG8gYSBzaWduZWQgY29uc3RhbnQuCisKK1NhdCBKdW4gMjkgMTc6MjY6MjkgRURUIDE5OTEKKworICAgICB2YWxhcml0aC5jICAgICBBZGRlZCBhIGJldHRlciByYW5nZSBjaGVja2VyLiAgSXQgbm93IGNoZWNrcyByYW5nZQorICAgICAgICAgICAgICAgICAgICAoc3VjY2Vzc2Z1bGx5KSBvbiBpbnRlZ3JhbCBvcGVyYXRpb25zIFsrLV0gKHNpZ25lZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQpIGZvciBhbnkgQyBzaXplZCB0eXBlLiAgU3RpbGwgZG9lcyBub3Qgd29yayB3ZWxsCisgICAgICAgICAgICAgICAgICAgIGZvciBtdWx0aXBsaWNhdGlvbi4pCisgICAgICAgICAgICAgICAgICAgIGludF9pbl9zaXplKCkgcmV0dXJucyBhbiBpbnRlZ2VyIHRoYXQgaXMgY29lcmNlZCB0byBmaXQgaW50bworICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzLgorCitNb24gSnVsICAxIDEzOjA0OjE0IEVEVCAxOTkxCisKKyAgICAgbGFuZ3VhZ2UuW2NoXSAgQWRkZWQgdGhlIGZ1bmN0aW9uIGJpbm9wX3Jlc3VsdF90eXBlKCksIHdoaWNoIHJldHVybnMgdGhlCisgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW4gKHN0cnVjdCB0eXBlICopIHR5cGUgdGhhdCB3b3VsZCBiZSB0aGUgcmVzdWx0IG9mIGEKKyAgICAgICAgICAgICAgICAgICAgYmlub3Agb24gdGhlIHR3byB2YWx1ZXMgVjEgYW5kIFYyLgorCitXZWQgSnVsICAzIDE5OjIyOjUzIEVEVCAxOTkxCisKKyAgICAgc291cmNlLmMgICAgICAgRXh0ZW5kZWQgc291cmNlX2luZm8oKSB0byBpbmNsdWRlIHRoZSBzb3VyY2UgbGFuZ3VhZ2UgaW4KKyAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCBmcm9tICJpbmZvIHNvdXJjZSIuCisgICAgIAorRnJpIEp1bCAgNSAxMzo0ODo1MiBFRFQgMTk5MQorCisgICAgIHV0aWxzLmMgICAgICAgIE1vdmVkIHRoZSBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgdGhlIEdEQiBzZXQvc2hvdyBjb21tYW5kcworICAgICAgICAgICAgICAgICAgICBkZWFsaW5nIHdpdGggbGFuZ3VhZ2UgaW50byBsYW5ndWFnZS5jLgorICAgICBsYW5ndWFnZS5jICAgICBBZGRlZCB0aGUgZnVuY3Rpb24gbGFuZ3VhZ2VfaW5mbygpLCB3aGljaCBkaXNwbGF5cyBpbmZvCisgICAgICAgICAgICAgICAgICAgIGFib3V0IHRoZSBjdXJyZW50IHdvcmtpbmcgbGFuZ3VhZ2UsIHR5cGUgYW5kIHJhbmdlIGNoZWNrCisgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLiAgQ2FsbGVkIHZpYSB0aGUgR0RCIGNvbW1hbmQgImluZm8gbGFuZ3VhZ2UiLgorICAgICAgICAgICAgICAgICAgICBBZGRlZCBhbiBpbml0aWFsaXphdGlvbiByb3V0aW5lIF9pbml0aWFsaXplX2xhbmd1YWdlKCksCisgICAgICAgICAgICAgICAgICAgIHRoYXQgc2V0cyBkZWZhdWx0cyBmb3IgdGhlIGxhbmd1YWdlLCB0eXBlIGFuZCByYW5nZQorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMgYW5kIHNldHMgdXAgdGhlIG5ldyBHREIgY29tbWFuZHMuCisgICAgIG1haW4uYyAgICAgICAgIExhbmd1YWdlIHNldHVwIG1vdmVkIHRvIGxhbmd1YWdlLmMuCisgICAgIGRlcGVuZCAgICAgICAgIFJlYnVpbHQuCisKK01vbiBKdWwgIDggMTA6MTA6MjIgRURUIDE5OTEKKworICAgICB2YWxhcml0aC5jICAgICBEZWJ1Z2dlZCB0aGUgcmFuZ2UgY2hlY2tlciBmb3IgYXJpdGhtZXRpYy4gIFN0aWxsIGRvZXMgbm90CisgICAgICAgICAgICAgICAgICAgIHdvcmsgZm9yIG11bHRpcGxpY2F0aW9uIHZlcnkgd2VsbC4KKworTW9uIEp1bCAgOCAxMjo0MDozNyBFRFQgMTk5MQorCisgICAgIGxhbmd1YWdlLltjaF0gIEFkZGVkIHRoZSBmdW5jdGlvbiB2YWx1ZV90cnVlKCkgd2hpY2ggcmV0dXJucyBub24temVybyBpZgorICAgICAgICAgICAgICAgICAgICBpdHMgYXJndW1lbnQgcmVwcmVzZW50cyBhIGJvb2xlYW4gdHJ1ZSB2YWx1ZS4KKyAgICAgYnJlYWtwb2ludC5jICAgQ2hhbmdlZCBicmVha3BvaW50X2NvbmRfZXZhbCgpIHRvIGNhbGwgdmFsdWVfdHJ1ZSgpIHRvCisgICAgICAgICAgICAgICAgICAgIGNoZWNrIHRoZSB0cnV0aCBvZiBhbiBleHByZXNzaW9uLgorCitUaHUgSnVsIDExIDEyOjUxOjM0IEVEVCAxOTkxCisKKyAgICAgbGFuZ3VhZ2UuW2NoXSAgQWRkZWQgdGhlIHByZWRpY2F0ZSBzdHJ1Y3R1cmVkX3R5cGUoKSwgd2hpY2ggcmV0dXJucworICAgICAgICAgICAgICAgICAgICBub24temVybyBpZiB0aGUgYXJndW1lbnQgaXMgYSBzdHJ1Y3R1cmVkIHR5cGUuCisgICAgICAgICAgICAgICAgICAgIEFkZGVkIHRoZSBwcmVkaWNhdGUgcG9pbnRlcl90eXBlKCksIHdoaWNoIHJldHVybnMgbm9uLXplcm8KKyAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0eXBlLgorICAgICBldmFsLmMgICAgICAgICBBZGRlZCB0aGUgYWJpbGl0eSB0byBkbyBhZGRpdGlvbiBhbmQgc3Vic3RyYWN0aW9uIG9uCisgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJzIGFuZCBpbnRlZ2Vycy4gICBUaGlzIGNhc2Ugc2ltcGx5IGJ5cGFzc2VzIHRoZQorICAgICAgICAgICAgICAgICAgICB0eXBlIGNoZWNrZXIuCisKK1RodSBKdWwgMTEgMTQ6NDE6NDIgRURUIDE5OTEKKworICAgICBpbmNsdWRlL3N0YWIuZGVmCisgICAgICAgICAgICAgICAgICAgIEFkZGVkIHRoZSBzeW1ib2wgTl9ERUZEICgweDRhKSB3aGljaCBpcyBhIGRlZmluaXRpb24KKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlIGRlcGVuZGVuY3kgdGhhdCBpcyB1c2VkIGJ5IHRoZSBHTlUgTW9kdWxhLTIKKyAgICAgICAgICAgICAgICAgICAgY29tcGlsZXIgYW5kIHRoZSBsaW5rZXIuICBJdCBpcyBub3QgaW1wb3J0YW50IHRvIEdEQiwKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IHRoYXQgW2RieHxjb2ZmfG1pcHNdcmVhZC5jIHNob3VsZCBpZ25vcmUgdGhlc2UKKyAgICAgICAgICAgICAgICAgICAgc3ltYm9scy4KKworRnJpIEp1bCAxMiAxNjowNzowMCBFRFQgMTk5MQorCisgICAgIHZhbHByaW50LmMgICAgIENoYW5nZWQgdGhlIFRZUEVfTEVOR1RIKHR5cGUpID49IDAgdG8gVFlQRV9MRU5HVEgodHlwZSkgPgorICAgICAgICAgICAgICAgICAgICAwIGluIHZhbF9wcmludCgpLiAgQWxzbyBhZGRlZCBzdGF0ZW1lbnRzIHRvIHRoZSBlbHNlIHBhcnQKKyAgICAgICAgICAgICAgICAgICAgdG8gY29lcmNlIHR5cGUgKGFyZ3VtZW50IHRvIHZhbF9wcmludCkgdG8gYSBwb2ludGVyIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgYW4gImFycmF5IG9mIHVuc3BlY2lmaWVkIGxlbmd0aCIuCisgICAgIHZhbG9wcy5jICAgICAgIEFkZGVkIHRoZSBmdW5jdGlvbiB2YWx1ZV9tMl9zdHJpbmcoKSwgd2hpY2ggcmV0dXJucyBhCisgICAgICAgICAgICAgICAgICAgICh2YWx1ZSkgdmFsdWUgd2hpY2ggaXMgYSBjb25zdGFudCBzdHJpbmcsIHdob3NlIHR5cGUgaXMKKyAgICAgICAgICAgICAgICAgICAgKEFSUkFZIFswLi5uXSBPRiBDSEFSKS4gIFRoZSBsZW5ndGggZmllbGQgb2YgdGhlIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIGlzIHNldCB0byB6ZXJvLCBzbyBpdCB3aWxsIGJlIGludGVycHJldGVkIGFzIGFuCisgICAgICAgICAgICAgICAgICAgICJhcnJheSBvZiB1bnNwZWNpZmllZCBsZW5ndGgiLgorICAgICBzdGFjay5jICAgICAgICBNb3ZlZCB0aGUgbGFuZ3VhZ2UvZnJhbWUgbWlzbWF0Y2ggY2hlY2sgdG8KKyAgICAgICAgICAgICAgICAgICAgbWFpbi5jOmV4ZWN1dGVfY29tbWFuZCgpLgorICAgICBtYWluLmMgICAgICAgICBUaGUgd29ya2luZyBsYW5ndWFnZSBpcyByZWNvcmRlZCBlYWNoIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZV9jb21tYW5kKCkgaXMgZXhlY3V0ZWQuICBJZiB3b3JraW5nIGxhbmcgaGFzCisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgZHVyaW5nIGl0cyBleGVjdXRpb24sIHRoZW4gdGhlIG5ldworICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZS90eXBlL3JhbmdlIGluZm8gaXMgcHJpbnRlZCBvdXQgZm9yIHRoZSB1c2VyLiAgSWYKKyAgICAgICAgICAgICAgICAgICAgdGhlIHdvcmtpbmcgbGFuZ3VhZ2UgZG9lcyBub3QgbWF0Y2ggdGhlIGxhbmd1YWdlIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICBmcmFtZSwgYSB3YXJuaW5nIGlzIGlzc3VlZC4KKworU2F0IEp1bCAxMyAxNjoxNjozOSBFRFQgMTk5MQorCisgICAgIGV2YWwuYyAgICAgICAgIE1vdmVkIGFsbCB0aGUgdHlwZS1jaGVja2luZyBzdHVmZiBmb3Igb3BlcmF0b3JzIHRvCisgICAgIGxhbmd1YWdlLltjaF0gIGxhbmd1YWdlLmMuICBUaGlzIGlzIHNvIHdlIGNhbiBrZWVwIGxhbmd1YWdlLXNwZWNpZmljCisgICAgICAgICAgICAgICAgICAgIHN0dWZmIChsaWtlIGZvciB3aGF0IHR5cGUgb3BlcmF0b3JzIGFyZSBkZWZpbmVkKSBpbgorICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZS5jLgorICAgICBsYW5ndWFnZS5bY2hdICBBZGRlZCB0aGUgZnVuY3Rpb24gYmlub3BfdHlwZV9jaGVjaygpLCB3aGljaCBjaGVja3MgdG8gc2VlCisgICAgICAgICAgICAgICAgICAgIGlmIGl0cyB0d28gKHZhbHVlKSBhcmd1bWVudHMgYXJlIHR5cGUtY29tcGF0aWJsZSB3aXRoIGl0cworICAgICAgICAgICAgICAgICAgICBvcGNvZGUgYXJndW1lbnQuICBUaGUgb3Bjb2RlIHNob3VsZCByZXByZXNlbnQgYW4gb3BlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgIGludm9sdmluZyBhbiBvcGVyYXRvci4gIEFsc28gYWRkZWQgdGhlIG1hY3JvIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgIHVub3BfdHlwZV9jaGVjaywgd2hpY2ggY2FsbHMgYmlub3BfdHlwZV9jaGVjayB3aXRoIGEKKyAgICAgICAgICAgICAgICAgICAgTlVMTCBzZWNvbmQgYXJndW1lbnQuCisgICAgIGV4cHByaW50LmMgICAgIEFkZGVkIE1vZHVsYS0yIG9wZXJhdG9ycyB0byB0aGUgb3BfcHJpbnRfdGFiLCBzbyBpbmZvCisgICAgIGV4cHJlc3Npb24uaCAgIGJyZWFrIHdvcmtzIGNvcnJlY3RseS4gIEFsc28gYWRkZWQgIm9wX3N0cmluZyIsIHdoaWNoCisgICAgICAgICAgICAgICAgICAgIHJldHVybnMgdGhlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSAoZW51bSBleHBfb3Bjb2RlKQorICAgICAgICAgICAgICAgICAgICBvcGNvZGUgdGhhdCBpcyBpdHMgYXJndW1lbnQuCisKKworU2F0IEp1bCAxMyAxODoyNjoxOCBFRFQgMTk5MQorCisgICAgIGNvZmZyZWFkLmMgICAgIEFkZGVkIGNvZGUgdG8gcmVjb3JkIHRoZSB0eXBlIG9mIGZ1bmN0aW9uIGFyZ3VtZW50cyB3aXRoCisgICAgICAgICAgICAgICAgICAgIGVhY2ggcGFyaWN1bGFyIGZ1bmN0aW9uLiAgQ29kZSBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhhdAorICAgICAgICAgICAgICAgICAgICBhZGRlZCB0byBkYnhyZWFkLmMuICAKKyAgICAgZGJ4cmVhZC5jICAgICAgTW92ZWQgYWRkX3BhcmFtX3RvX3R5cGUoKSB0byBzeW10YWIuYworICAgICBzeW10YWIuW2NoXSAgICBBZGRlZCBmdW5jdGlvbiBhZGRfcGFyYW1fdG9fdHlwZSgpIGZyb20gZGJ4cmVhZC5jCisKKyAgICAgKioqIE5PVEU6ICBUaGUgYWJvdmUgYWRkaXRpb25zIGhhdmUgbm90IGJlZW4gdGVzdGVkLgorCitNb24gSnVsIDE1IDEyOjUwOjQ3IEVEVCAxOTkxCisKKyAgICAgbGFuZ2F1Z2UuW2NoXSAgQWRkZWQgdGhlIGZ1bmN0aW9ucyB0eXBlX2Vycm9yIGFuZCByYW5nZV9lcnJvciwgd2hpY2ggd29yaworICAgICAgICAgICAgICAgICAgICBsaWtlIGVycm9yKCkgZXhjZXB0IGlmIHRoZSB0eXBlL3JhbmdlIG1vZGUgaXMgc2V0IHRvCisgICAgICAgICAgICAgICAgICAgICpfbW9kZV93YXJuLCB0aGVuIHRoZXkgZG8gbm90IGRvIGEgcmV0dXJuX3RvX3RvcF9sZXZlbCgpLAorICAgICAgICAgICAgICAgICAgICBidXQgbWVyZWx5IHByaW50IGEgd2FybmluZy4KKyAgICAgICAgICAgICAgICAgICAgQWxzbyBjaGFuZ2VkIFtzZXR8c2hvd11fW3R5cGV8cmFuZ2VdX2NvbW1hbmQoKSB0byBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgIHRoZSBuZXcgIndhcm4iIGZlYXR1cmUuCisKK1RodSBKdWwgMTggMTc6NTA6NTQgRURUIDE5OTEKKworICAgICBtaXBzcmVhZC5jICAgICBBZGRlZCBjb2RlIHRvIHJlY29yZCB0aGUgdHlwZSBvZiBmdW5jdGlvbiBhcmd1bWVudHMgd2l0aAorICAgICAgICAgICAgICAgICAgICBlYWNoIHBhcnRpY3VsYXIgZnVuY3Rpb24uICBDb2RlIGlzIHZlcnkgc2ltaWxhciB0byB0aGF0CisgICAgICAgICAgICAgICAgICAgIGFkZGVkIHRvIGRieHJlYWQuYy4gIAorCisgICAgICoqKiBOT1RFOiAgVGhlIGFib3ZlIGFkZGl0aW9ucyBoYXZlIG5vdCBiZWVuIHRlc3RlZC4KKworRnJpIEp1bCAxOSAxMToxOToxMCBFRFQgMTk5MQorCisgICAgIGRlZnMuaCAgICAgICAgIEFkZGVkIG1hY3JvcyBNQVhfT0ZfU0laRSwgTUlOX09GX1NJWkUsIFVNQVhfT0ZfU0laRSwgYW5kCisgICAgICAgICAgICAgICAgICAgIFVNSU5fT0ZfU0laRSwgd2hpY2ggd2hlbiBnaXZlbiBhIHNpemUgb2YgYSBudW1lcmljIHR5cGUsCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGUgbWF4aW11bSBhbmQgbWluaW11bSB2YWx1ZSBpdCBjYW4gaG9sZC4gIFVNQVguLi4KKyAgICAgICAgICAgICAgICAgICAgYW5kIFVNSU4uLi4gcmV0dXJuIHRoZSByZXN1bHQgZm9yIHVuc2lnbmVkIHR5cGVzLgorICAgICBzeW10YWIuaCAgICAgICBBZGRlZCB0aGUgbWFjcm9zIE1BWF9PRl9UWVBFIGFuZCBNSU5fT0ZfVFlQRSB0byBvcGVyYXRlIG9uCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0eXBlcy4gIFRoZXkgY2FsbCBhYm92ZSBtYWNyb3MuCisgICAgIGRieHJlYWQuYyAgICAgIFJlbmFtZWQgdGhlIE1BWCBhbmQgTUlOX09GX1RZUEUgbWFjcm9zIHRvIC4uLl9PRl9DVFlQRSB0bworICAgICAgICAgICAgICAgICAgICBhdm9pZCBhIG5hbWUgY29ubGljdCB3aXRoIHRoZSBhYm92ZS4KKyAgICAgYy1leHAueSAgICAgICAgQWRkZWQgcmFuZ2UgY2hlY2tpbmcgb24gbnVtZXJpYyBjb25zdGFudHMgaW4KKyAgICAgICAgICAgICAgICAgICAgcGFyc2VfbnVtYmVyKCkgZm9yIGNvbXBsZXRlbmVzcy4KKyAgICAgdmFsYXJpdGguYyAgICAgTWFkZSBiaW5vcF91c2VyX2RlZmluZWRfcCgpIGFuZCB1bm9wX3VzZXJfZGVmaW5lZF9wKCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgaWYgd29ya2luZ19sYW5nIGlzIG5vdCBsYW5ndWFnZV9jLgorCitUaHUgQXVnICA4IDE0OjE3OjIyIEVEVCAxOTkxCisKKwltYWluLmMKKwlwcmludGNtZC5jCisJYnJlYWtwb2ludC5jCURvY3VtZW50YXRpb24gc3RyaW5ncyBvZiBzb21lIGNvbW1hbmRzIGNoYW5nZWQgdG8KKwkJCQllbGltaW5hdGUgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIEMgbGFuZ3VhZ2Ugd2hlcmUKKwkJCQlhcHByb3ByaWF0ZS4KKworVHVlIEF1ZyAxMyAxNTo0ODowMyBFRFQgMTk5MQorCisJbTItZXhwLnkJCUFkZGVkIHF1YWxpZmllZCBpZGVudGlmaWVycyB0byB0aGUgZ3JhbW1hci4gIFRoZSBzZW1hbnRpY3MKKwkJCQlhcmUgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20gdGhvc2Ugb2YgdGhlIEdEQiBvcGVyYXRvciA6OgorCWMtZXhwLnkKKwltMi1leHAueQkJQWRkZWQgYSBydWxlIHRvIGVhY2ggZ3JhbW1hciBvZiB0aGUgZm9ybTogIHN0YXJ0IDo6PSBleHAgfAorCQkJCXR5cGVfZXhwLCB3aGVyZSB0eXBlX2V4cCBpcyBhbnkgdmFsaWQgdHlwZSBleHByZXNzaW9uLgorCWV4cHJlc3Npb24uaAkKKwlldmFsLmMJCUFkZGVkIHRoZSBvcGNvZGUgT1BfVFlQRSwgYW5kIGFuIGVycm9yIGNhc2UgaW4gZXZhbC5jLgorCXByaW50Y21kLmMJTW9kaWZpZWQgcHR5cGVfY29tbWFuZCgpIHNvIGl0IGFjdHVhbGx5IHBhcnNlcyB0aGUgaW5wdXQKKwkJCQkobmVjZXNzYXJ5IGZvciB0eXBlIGV4cHJlc3Npb25zIHdpdGggc2NvcGUgcXVhbGlmaWVycykuCisJCQkJQWRkZWQgdGhlIGZ1bmN0aW9uIHB0eXBlX2V2YWwoKSB3aGljaCBleHBlY3RzIGFuCisJCQkJZXhwcmVzc2lvbiBjb21wb3NlZCBvZiBvbmUgT1BfVFlQRSBlbGVtZW50LgorCSouW2NoXQkJUmVwbGFjZWQgYWxsIG9jY3VyZW5jZXMgb2YgcGFyc2VfY19leHByZXNzaW9uIHdpdGgKKwkJCQlwYXJzZV9leHByZXNzaW9uCisJKi5bY2hdCQlSZXBsYWNlZCBhbGwgb2NjdXJlbmNlcyBvZiBwYXJzZV9jXzEgd2l0aCBwYXJzZV9leHBfMQorCitbRW5kIG9mIENoYW5nZUxvZyBlbnRyaWVzIGZyb20gQW5kcmV3IEJlZXJzIGZvciBNb2R1bGEtMiBzdXBwb3J0Ll0KKworTW9uIFNlcCAxNiAxNzoxOTo0NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCVNtYWxsIGZpeGVzIGZyb20gUGV0ZXIgU2NoYXVlcjoKKworCSogaW5mcnVuLmMgKGNoaWxkX2F0dGFjaCk6ICBMaW50LgorCSogc29saWIuYyAoZmluZF9zb2xpYik6ICBIYW5kbGUgc2hhcmVkIGxpYnMgdmVyc2lvbiAyLgorCisJU21hbGwgZml4ZXMgZnJvbSBEYXZpZCBXb29kOgorCisJKiB4bS11bHRyYTMuaCAoU1lTX1NJR0xJU1RfTUlTU0lORyk6ICBUeXBvLgorCisJU21hbGwgZml4ZXM6CisKKwkqIHJlbW90ZS12eC5jOiAgTW92ZSA8c3RkaW8uaD4gdG8gdG9wLCBmb3IgRklMRS4gIEZpeCBmcm9tCisJSm9obiBTIDxiYXNyYWkla2FuZ2EuZG5ldEBjM3BvLnNtLWFsYy5hZi5taWw+LgorCisJKiB1dGlscy5jICh3cmFwX2hlcmUpOiAgQXZvaWQgd3JhcCBhY3Rpb24gb2YgZnB1dHNfZmlsdGVyZWQgaWYKKwljaGFyc19wZXJfbGluZSBpcyBhdCBtYXhpbXVtICh1c2VyIHR5cGVkIGBzZXQgd2lkdGggMCcpLiAgRml4CisJZnJvbSBBbmRyZWFzIFNjaHdhYiA8c2Nod2FiQGxzNS5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4uCisKK1R1ZSBTZXAgMTcgMTc6MzE6MDQgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogY29yZWRlcC5jOiAgaW5jbHVkZSBwdHJhY2UuaCB3aGVyZSBuZWNlc3NhcnkuCisJKiBtaXBzcmVhZC5jKHBhcnNlX2xpbmVzKTogIGZpeCB1bnNpZ25lZCBjaGFyIHByb2JsZW0gdGhhdCB3YXMKKwltZXNzaW5nIHVwIGxpbmUgbnVtYmVycyBvbiBTR0kncyBhbmQgcG9zc2libHkgb3RoZXIgTUlQUyBiYXNlZAorCXBsYXRmb3Jtcy4KKwkqIGluZnJ1bi5jIChjaGlsZF9jcmVhdGVfaW5mZXJpb3IpOiAgdXNlIGJldHRlciB0ZXN0IHRvIGNoZWNrCisJcmV0dXJuIHZhbCBmcm9tIHNldHBncnAoKS4KKwkqIHRtLWlyaXgzLmgsIHhtLWlyaXgzLmgsIHRjb25maWcvaXJpeDMsIHhjb25maWcvaXJpeDM6ICBhZGQgdGhlc2UKKwlmb3Igc2dpL2lyaXggc3VwcG9ydC4KKworV2VkIFNlcCAxOCAwNDozMzozMSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogbWlwc3JlYWQuYyAocGFyc2Vfc3ltYm9sKTogIFB1dCBub24tc3RhdGljIHByb2NlZHVyZXMKKwlpbiB0aGUgZ2xvYmFsIGJsb2NrLgorCitGcmkgU2VwIDEzIDAwOjE0OjUyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJUGF0Y2ggdG9nZXRoZXIgYHRleHRfc3RhcnQnIGFuZCBgdGV4dF9lbmQnIGZvciAyOUsgcG9ydC4KKworCSogZXhlYy5jIChleGVjX2NvbW1hbmQpOiAgSWYgTkVFRF9URVhUX1NUQVJUX0VORCwgZGVmaW5lIHRoZQorCXZhcmlhYmxlcyBhbmQgc2V0IHRoZW0gYmFzZWQgb24gdGhlIGV4ZWMgZmlsZS4KKwkqIGFtMjlrLXRkZXAuYzogIGRlY2xhcmUgdGV4dF9zdGFydC4KKwkqIHZhbG9wcy5jIChjYWxsX2Z1bmN0aW9uX2J5X2hhbmQpOiAgZGVjbGFyZSB0ZXh0X2VuZC4KKworCSogaW5mZXJpb3IuaDogIEVsaW1pbmF0ZSBDQU5OT1RfRVhFQ1VURV9TVEFDSyBpbiBmYXZvciBvZgorCWRlZmluaW5nIENBTExfRFVNTVlfTE9DQVRJT04gYXMgQkVGT1JFX1RFWFRfRU5ELiAgVGhpcyBpcworCWJlY2F1c2UgbWFjaGluZXMgdGhhdCBkbyB0aGlzIHdpbGwgYWxzbyBoYXZlIHRvIGtub3cgdG8KKwlzZXQgTkVFRF9URVhUX1NUQVJUX0VORC4gIEJlc2lkZXMsIGl0IHdhcyBhIHJlZHVuZGFudCB3YXkgdG8KKwlzYXkgdGhlIHNhbWUgdGhpbmcuCisJKiB0bS0yOWsuaCwgdG0tY29udmV4LmgsIHRtLW5wMS5oOiAgRWxpbWluYXRlCisJQ0FOTk9UX0VYRUNVVEVfU1RBQ0ssIGRlZmluZSBDQUxMX0RVTU1ZX0xPQ0FUSU9OIGFuZAorCU5FRURfVEVYVF9TVEFSVF9FTkQuCisKK1RodSBTZXAgMTIgMDA6MjI6MjQgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJQU1EIDI5MDAwIGNoYW5nZXMgZnJvbSBEYXZpZCBXb29kIDx3b29kQGRhdmlkLnVsdHJhLm55dS5lZHU+OgorCisJKiBNYWtlZmlsZS5pbiAoQ0xJQlMpOiAgUHV0IFhNX0NMSUJTIGFuZCBUTV9DTElCUyBhdCBlbmQuCisJUGFzcyBNVU5DSF9ERUZJTkUgdG8gbXVuY2ggd2hlbmV2ZXIgd2UgcnVuIGl0LgorCSogYW0yOWstcGluc24uYyAocHJpbnRfaW5zbik6ICBIYW5kbGUgTk9QIHNwZWNpYWxseS4gIEF2b2lkICUjeAorCWZvcm1hdCBzdHJpbmc7IHVzZSAweCV4IGluc3RlYWQuCisJKiBhbTI5ay10ZGVwLmM6ICBVc2UgRFVNTVlfU0FWRV9HUkVHUyBhbmQgUkVUVVJOX1JFR05VTS4KKwkqIHVsdHJhLXhkZXAuYywgeG0tdWx0cmEuaDogIE5ldyBmaWxlcyBmb3IgVWx0cmFjb21wdXRlciBob3N0IHN5c3RlbS4KKwkqIHhtLXJ0YnNkLmg6ICBOZXcgaG9zdCBzdXBwb3J0IGZvciBSVC9QQyBydW5uaW5nIEJTRCBVbml4LgorCSogaW5mbG93LmM6ICBIYW5kbGUgYHNob3J0JyBwcm9jZXNzIGdyb3VwIElEcy4KKwkqIGluZnB0cmFjZS5jIChmZXRjaF9yZWdpc3Rlcik6ICBTdXBwb3J0IENBTk5PVF9GRVRDSF9SRUdJU1RFUiwKKwlhbmQgY2hlY2sgZm9yIHB0cmFjZSBlcnJvcnMuCisJKiBjb2ZmcmVhZC5jIChTREJfUkVHX1RPX1JFR05VTSk6ICBEZWZpbmUgaWYgbm90IGFscmVhZHkuCisJKGNvZmZfc3ltZmlsZV9pbml0KTogIEluaXRpYWxpemUgdGV4dF9iZmRfc2NudW0uCisJKHJlYWRfY29mZl9zeW10YWIpOiAgVXNlIGl0IHRvIGZpbmQgdGhlIHRleHQgW2FuZCBhYnNvbHV0ZT9dIHNlY3Rpb25zLgorCSogLi4vY29uZmlnLnN1YjogIEFkZCB2ZW5kb3Igbnl1IGFuZCBvcyAic3ltWzEtOV0qIi4KKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGhvc3RzIHJ0cGMtKi0qIGFuZCBhMjlrLSotKi4KKwlNZXJnZSB0YXJnZXQgYXJtIGNhc2Ugd2l0aCBvdGhlciAiZWFzeSIgY2FzZXMuICBBZGQgdGFyZ2V0CisJY2FzZXMgYTI5ay0qLW5vbmUgKHJlaGFjayBvZiBhbTI5ayksIGEyOWstKi1rZXJuIChyZW1vdGUgdG8KKwlVbHRyYWNvbXB1dGVyIGtlcm5lbCksIGFuZCBhMjlrLSotc3ltMSAodWx0cmFjb21wdXRlciBPUydzIHVzZXIKKwlwcm9jZXNzKS4KKwkqIG1pbmltb24uaCwgcmVtb3RlLWFkYXB0LmMsIHJlbW90ZS1tbS5jOiAgQWRkLgorCSogbXVuY2g6ICBDb3BlIHdpdGggUlQvUEMgcHV0dGluZyBmbnMgaW4gZGF0YSBzZWdtZW50LgorCVJlc3RvcmUgYWJpbGl0eSB0byBvdmVycmlkZSBgbm0nIGJ5IHNwZWNpZnlpbmcgTVVOQ0hfTk0uCisJKiB4Y29uZmlnL3J0YnNkLCB4Y29uZmlnL3VsdHJhMzogIE5ldyBob3N0IHN5c3RlbXMuCisJKiB0Y29uZmlnL2EyOWs6ICBSZW5hbWUgZnJvbSB0Y29uZmlnL2FtMjlrLiAgQWRkIHJlbW90ZS1tbQorCWFuZCByZW1vdGUtYWRhcHQuICBSZW1vdmUgZW5jYXBzdWxhdGVkIGNvZmYgI2RlZmluZSdzICh0aGUKKwlzdXBwb3J0IHNob3VsZCBnbyBpbiBCRkQsIGFuZCBnZGIgc2hvdWxkbid0IGtub3cgb3IgY2FyZSkuCisJKiB0Y29uZmlnL2EyOWsta2VybjogIFNhbWUsIGJ1dCBmb3IgcmVtb3RlIGtlcm5lbCBkZWJ1Z2dpbmcuCisJKiB0Y29uZmlnL3VsdHJhMzogIEZvciBkZWJ1Z2dpbmcgdXNlciBwcm9jZXNzZXMgb24gVWx0cmEzL1N5bTEuCisJKiB0bS0yOWsuaDogIFVwZGF0ZSBCQURNQUcgKHRob3VnaCBpdCBzaG91bGQgZ28gYXdheSkuCisJQWxsb3cgdGhlIHJlZ2lzdGVyIGRlZmluaXRpb25zIHRvIGJlIG92ZXJyaWRkZW4gaW4gYW5vdGhlcgorCXRtLWZpbGUuICBGaXggU1JfUkVHTlVNLiAgQWRkIGEgbWVzcyBvZiBfUkVHTlVNJ3MuICBTZXBhcmF0ZQorCVJFVFVSTl9SRUdOVU0gZnJvbSBHUjk2X1JFR05VTSBhbmQgRFVNTVlfU0FWRV9HUkVHUyBmcm9tCisJRFVNTVlfU0FWRV9HUjk2LCBmb3IgaGFuZGxpbmcga2VybmVsIGNhbGxpbmcgY29udmVudGlvbnMKKwl0aGF0IHVzZSBHUjY0KyByYXRoZXIgdGhhbiBHUjk2Ky4KKwkqIHRtLXVsdHJhMy5oOiAgTmV3IGZpbGUsIGZvciB1c2Ugb24gVWx0cmEzIFVuaXggYXMgd2VsbCBhcyBmb3IKKwlyZW1vdGUgZGVidWdnaW5nIG9mIFVsdHJhMyBrZXJuZWwuICBJbmNsdWRlcyB0bS0yOWsuaCBhbmQKKwlvdmVycmlkZXMgdmFyaW91cyB0aGluZ3MuCisKKwkqIHJlbW90ZS1tbS5jIChtbV9hdHRhY2gsIG1tX3dhaXQpOiAgSGFuZGxlIGF0dGFjaCBsaWtlCisJY2hpbGRfYXR0YWNoIGRvZXMsIG1ha2luZyBhIGNsZWFuIHN0b3AgaW4gdGhlIG5ld2x5IGF0dGFjaGVkCisJcHJvZ3JhbS4KKwkqIHJlbW90ZS1lYi5jOiAgTGludC4KKworCSogY29mZnJlYWQuYzogIE1ha2UgY29mZnJlYWQgaW5kZXBlbmRlbnQgb2YgYW55IHBhcnRpY3VsYXIKKwl2YXJpYW50IG9mIENPRkYuICBBdm9pZCAjaW5jbHVkZS1pbmcgYW55IHBhcnRpY3VsYXIgb25lIGV4Y2VwdAorCWludGVybmFsY29mZi5oLiAgQkZEIG5vdyBwYXNzZXMga2V5IHZhbHVlcyBmb3Igc3ltYm9sIHJlYWRpbmcKKwlhcyBwYXJ0IG9mIGl0cyBjb2ZmX2RhdGEgc3RydWN0dXJlIChMSU5FU1osIFNZTUVTWiwgQVVYRVNaLAorCWFuZCB0aGUgc3ltYm9sIG1hc2tzIGFuZCBzaGlmdHMpOyB1c2UgdGhlbS4KKwlSZW1vdmUgb2Jzb2xldGUgZW5kX29mX3RleHRfYWRkci4KKworCSogZXhlYy5jOiAgUmVtb3ZlIHVudXNlZCBpbmNsdWRlIGZpbGVzLgorCitXZWQgU2VwIDExIDE5OjM4OjQ0IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGRvY3VtZW50YXRpb24gdGFyZ2V0cyk6ICBQYXNzICQoTTQpLgorCUJ1Z2ZpeCBmcm9tIGVnZ2VydEB0d2luc3VuLmNvbSAoUGF1bCBFZ2dlcnQpLgorCisJKiBzdGFjay5jIChkb3duX3NpbGVudGx5X2NvbW1hbmQpOiAgQ2hlY2sgZm9yIHN0YWNrIGV4aXN0ZW5jZS4KKworVHVlIFNlcCAxMCAyMzowODoyOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIFVwZGF0ZSB0byA0LjAuMy4KKworVHVlIFNlcCAxMCAwOToxOToyOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGNvcmUuYyAoY29yZV9maWxlX2NvbW1hbmQpOiAgUHJpbnQgZnJhbWUgYXQgY29yZWR1bXAgd2l0aAorCWl0cyBsZXZlbCBudW1iZXIsIGJ5IGNhbGxpbmcgcHJpbnRfc3RhY2tfZnJhbWUuCisJKiBmcmFtZS5oOiAgQWRkIHNlbGVjdGVkX2ZyYW1lX2xldmVsLCBwcmludF9zdGFja19mcmFtZS4KKwkqIGZyYW1lLmgsIHN0YWNrLmM6ICBSZW1vdmUgcHJpbnRfc2VsX2ZyYW1lLCBwcmludF9zZWxlY3RlZF9mcmFtZS4KKwkqIGNvbnZleC10ZGVwLmMsIGNvbnZleC14ZGVwLmMsIGluZmNtZC5jLCBpbmZsb3cuYywgaW5mcnVuLmM6CisJQ2hhbmdlIHByaW50X3NlbF9mcmFtZSBhbmQgcHJpbnRfc2VsZWN0ZWRfZnJhbWUgY2FsbGVycyB0bworCXByaW50X3N0YWNrX2ZyYW1lLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfb2ZpbGVfc3ltdGFiKTogIEF2b2lkIGVtcHR5IGVsc2UgY2xhdXNlLgorCSogc3ltZmlsZS5jIChmcmVlX25hbWVkX3N5bXRhYnMpOiAgRGl0dG8uCisJKiBtYWluLmMgKG1haW4pOiAgd3JhcF9oZXJlIG5lZWRzIGFuIGFyZy4KKwkqIHNvbGliLmMgKGZpbmRfc29saWIpOiAgQXZvaWQgbWVtb3J5IGFjY2VzcyBpZiBfRFlOQU1JQyBpcyB6ZXJvLgorCShzb2xpYl9hZGQpOiAgQXZvaWQgbm9pc2UuICAKKwkoc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiAgTGludC4KKwkoc2hhcmVkbGlicmFyeV9jb21tYW5kKTogIE1vdmUgZG9udF9yZXBlYXQgdG8gaGVyZS4KKwkqIHV0aWxzLmMgKGVycm9yKTogIENhbGwgd3JhcF9oZXJlIHRvIGZvcmNlIGJ1ZmZlcmVkIG91dHB1dC4KKworCVNtYWxsIHBhdGNoZXMgZnJvbSBQZXRlciBTY2hhdWVyOgorCisJKiBjb2ZmcmVhZC5jIChzdGFydF9zeW10YWIpOiAgRnJlZSBhbnkgZXhpc3RpbmcgbGluZV92ZWN0b3IgYmVmb3JlCisJbWFsbG9jLWluZyBuZXcgb25lLgorCShyZWFkX2NvZmZfc3ltdGFiKTogIERpdHRvIGZvciB0eXBlX3ZlY3Rvci4KKworCSogc291cmNlLmMgKGxpbmVzX3RvX2xpc3QpOiAgTmV3IHZhcmlhYmxlLCByZXBsYWNpbmcgZnVuY3Rpb24uCisJKGFsbCB1c2VzKTogIFVzZSBhcyB2YXJpYWJsZS4KKwkoX2luaXRpYWxpemVfc291cmNlKTogIEFkZCAnc2V0IGxpc3RzaXplJyBhbmQgJ3Nob3cgbGlzdHNpemUnLgorCSogdXRpbHMuYyAobGluZXNfdG9fbGlzdCk6ICBSZW1vdmUgZnVuY3Rpb24uCisJKiBzdGFjay5jIChwcmludF9mcmFtZV9pbmZvKTogIFVzZSBhcyB2YXJpYWJsZS4KKwkqIGRlZnMuaCAobGluZXNfdG9fbGlzdCk6ICBSZW1vdmUgZGVjbGFyYXRpb24uCisKK01vbiBTZXAgIDkgMTM6NDU6NTcgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBicmVha3BvaW50LmMgKGluc2VydF9icmVha3BvaW50cyk6ICBSZXN0b3JlIHdhcm5pbmcgYWJvdXQKKwl0aGUgcHJvZ3JhbSBtaWdodCBiZSBydW5uaW5nIGluIGFub3RoZXIgcHJvY2VzcywgYnV0IG9ubHkgZm9yCisJc3lzdGVtcyB3aXRoIHRoaXMgYnJhaW4gZGVhdGggKCNpZmRlZiBPTkVfUFJPQ0VTU19XUklURVRFWFQpLgorCSogeG0taHAzMDBic2QuaCwgeG0tbWlwcy5oLCB4bS12YXguaDogIERlZmluZSBpdC4KKworCSogdXRpbHMuYyAoZXJyb3IpOiAgaWYgZXJyb3JfcHJlX3ByaW50IGlzIHNldCwgcHJpbnQgdGhlIHN0cmluZworCWZpcnN0LgorCSogbWFpbi5jIChtYWluLCBwcmludF9nbnVfYWR2ZXJ0aXNlbWVudCwgcHJpbnRfZ2RiX3ZlcnNpb24pOgorCVJlZm9ybWF0IGxlZ2FsZXNlIHNvIGl0IGFsd2F5cyBwcmludHMsIGJ1dCBhY3RzIGFzIGFuICJJJ20gaGVyZSIKKwltZXNzYWdlIHdoaWxlIHN5bWJvbHMgYXJlIGJlaW5nIHJlYWQuICBJZiBhbnkgZXJyb3JzIG9jY3VyLAorCXByaW50IGEgZmV3IG5ld2xpbmVzIHRvIHNldCBvZmYgdGhlIG1lc3NhZ2UgYW5kIHN0YXJ0IGl0IGF0IHRoZQorCWxlZnQgbWFyZ2luLiAgUmVtb3ZlIG1lbnRpb24gb2YgImhlbHAiIGNvbW1hbmQsIGFuZCBkb24ndCB5YWsKKwlhYm91dCBzeW1ib2wgcmVhZGluZy4KKwkoY2F0Y2hfZXJyb3JzKTogIEVycm9yIHN0cmluZyBpcyBub3cgcHJpbnRlZCBmaXJzdCBpbiBjYXNlIG9mCisJZXJyb3IsIG5vdCBsYXN0LgorCSogY29tbWFuZC5jICh1bmRlZl9jbWRfZXJyb3IsIGxvb2t1cF9jbWQpOiAgT24gdW5kZWZpbmVkIGNvbW1hbmQsCisJc3VnZ2VzdCB0aGUgImhlbHAiIGNvbW1hbmQuCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIFNldCB0byA0LjAuMi4KKworVGh1IFNlcCAgNSAyMzo0OTo0OCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIC5nZGJpbml0OiAgUmVtb3ZlIHVzZWxlc3MgInJyIiBjb21tYW5kLiAgU2V0IGNvbXBsYWludHMKKwl0byAxIGZvciBwZW9wbGUgZGVidWdnaW5nIGdkYi4KKworCSogYnJlYWtwb2ludC5jLCByZW1vdGUtdnguYzogIFJld29yZCBzdHJpbmdzIHByaW50ZWQgYnkKKwljYXRjaF9lcnJvcnMgY2FsbGVycy4KKworV2VkIFNlcCAgNCAxMTowNzo1MCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIFdIQVRTLk5FVzogICJoaXN0b3J5IHdyaXRlIC0+IGhpc3Rvcnkgc2F2ZSIuICBEb2MgIndyaXRlIG9uL29mZiIuCisJKEZpeCBmcm9tIGtlbmNAdmlld2xvZ2ljLmNvbS4pCisKKwlGaXggc29tZSBpbmZyYXN0cnVjdHVyZSB0byBiZSBhYmxlIHRvIGNvcGUgd2l0aCBob3N0IGFuZCB0YXJnZXQKKwltYWNoaW5lcyB3aXRoIGRpZmZlcmVudCBzaXplZCBiYXNpYyB0eXBlcyAoaW50cywgcHRycywgZXRjKS4KKwkoSWRlYSBmcm9tIHBpZXJyZUBsYS50Y2UuY29tIChQaWVycmUgV2lsbGFyZCkuKQorCisJKiB2YWx1ZXMuYyAodmFsdWVfZnJvbV9sb25nZXN0KTogIFJlbmFtZSBmcm9tIHZhbHVlX2Zyb21fbG9uZy4KKwlIYW5kbGUgcG9pbnRlciB0eXBlcyBhcyB3ZWxsIGFzIGludGVnZXJzLCBzbyB0aGF0IHRhcmdldHMgd2l0aAorCWRpZmZlcmVudCBwb2ludGVyIHNpemVzIGZyb20gdGhlIGhvc3QgY2FuIGJlIGFjY29tb2RhdGVkLgorCSogYnJlYWtwb2ludC5jLCBjb252ZXgtdGRlcC5jLCBldmFsLmMsIGV4cHByaW50LmMsIHByaW50Y21kLmMsCisJdmFsYXJpdGguYywgdmFsb3BzLmMsIHZhbHByaW50LmMsIHZhbHVlLmgsIHZhbHVlcy5jOiAgUmVuYW1lCisJdXNlcyBvZiB2YWx1ZV9mcm9tX2xvbmcgdG8gdmFsdWVfZnJvbV9sb25nZXN0LgorCSogZXZhbC5jLCBmaW5kdmFyLmMsIHByaW50Y21kLmMsIHZhbGFyaXRoLmMsIHZhbG9wcy5jOiAgUGFzcworCXRoZSBjb3JyZWN0IHBvaW50ZXIgdHlwZSB0byB2YWx1ZV9mcm9tX2xvbmd7ZXN0fS4KKworCSogZG9jL2dkYi50ZXhpbmZvICgkXywgJF9fKTogIERlc2NyaWJlIHR5cGVzIG9mIHRoZXNlIHZhcmlhYmxlcy4KKworCSogcmVtb3RlLXZ4LmM6ICBSZW1vdmUgb2Jzb2xldGUgY29kZSBmb3IgY2FsbGluZyBmdW5jdGlvbnMgdmlhCisJdnh3b3JrcyBrbHVkZ2UgaW50ZXJmYWNlIChpdCByZWZlcmVuY2VkIHZhbHVlX2Zyb21fbG9uZykuCisKKwkqIHZhbG9wcy5jICh2YWx1ZV9zdHJpbmcpOiAgRmluZCBtYWxsb2Mgd2l0aCBsb29rdXBfbWlzY19mdW5jLCBub3QKKwlyYXcgc2VhcmNoLgorCitUdWUgU2VwICAzIDE4OjM3OjQ2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCU1ha2Ugd3JpdGluZyB0byBmaWxlcyB3b3JrIHByb3Blcmx5LiAgKEZpeGVzIHRvIEJGRCBhcmUgYWxzbyBuZWVkZWQuKQorCisJKiBjb3JlLmMgKGNvcmVfb3Blbik6ICBPcGVuIGZpbGUgb3Vyc2VsdmVzLCByZWFkIG9yIHIvdywgZGVwZW5kaW5nIG9uCisJd3JpdGVfZmlsZXMuICBVc2UgYmZkX2Zkb3BlbnIuICAKKwkqIGdkYmNvcmUuaCAod3JpdGVfZmlsZXMpOiAgTmV3IHZhcmlhYmxlLgorCSogZXhlYy5jICh3cml0ZV9maWxlcyk6ICBEZWZpbmUgdmFyaWFibGUsIGFkZCBzZXQmc2hvdyBmb3IgaXQuCisJKGV4ZWNfZmlsZV9jb21tYW5kKTogIFVzZSB3cml0ZV9maWxlcyB0byBvcGVuIGZvciByZWFkIG9yIHIvd3JpdGUuCisKKwlNYWtlIHNoYXJlZCBsaWJyYXJ5IHJlYWRpbmcgaGFwcGVuIGF1dG9tYXRpY2FsbHkuICBUaGVzZSBjaGFuZ2VzCisJYXJlIG1vc3RseSBmcm9tIFBldGVyIFNjaGF1ZXIgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPi4KKworCSogaW5mZXJpb3IuaCAoc3RvcF9zb29uX3F1aWV0bHkpOiAgQWRkIHRvIGV4cG9ydGVkIHZhcmlhYmxlcy4KKwkqIGluZnJ1bi5jIChjaGlsZF9jcmVhdGVfaW5mZXJpb3IpOiAgY2FsbCBzb2xpYiBob29rLCBpZiBkZWZpbmVkLgorCShjaGlsZF9hdHRhY2gpOiAgY2FsbCBzb2xpYiBob29rLCBpZiBkZWZpbmVkLgorCSogc29saWIuYzogIEluY2x1ZGUgaW5mZXJpb3IuaC4gIEFkZCBmcm9tX3R0eSB0byBzb19saXN0IGFzIGtsdWRnZS4KKwkoZmluZF9zb2xpYik6ICBVc2UgbG9va3VwX21pc2NfZnVuYyByYXRoZXIgdGhhbiBoYW5kLXJvbGxlZC4KKwkoc3ltYm9sX2FkZF9zdHViKTogIE5ldyBzdHViIGZvciBjYXRjaF9lcnJvcnMuCisJKHNvbGliX2FkZCk6ICBBdm9pZCBvdXRwdXQgaWYgIWZyb21fdHR5LiAgQ2F0Y2ggZXJyb3JzIHJhdGhlcgorCXRoYW4ganVzdCBjYWxsaW5nIHN5bWJvbF9maWxlX2FkZCBhbmQgYm9tYmluZy4KKwkoc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiAgSW50ZXJmYWNlIHdpdGggdGhlIHRhcmdldCBwcm9jZXNzCisJdG8gbGV0IGl0IHJlYWQgYW5kIGFsbG9jIHNoYXJlZCBsaWJzLCB0aGVuIGZpZ3VyZSBvdXQgd2hhdCBpdCBkaWQuCisKKwkqIGNvcmUuYyAodmFsaWRhdGVfZmlsZXMpOiAgRml4IHR5cG8sIHNvZnRlbiB3YXJuaW5nLiAgCisJKEZpeCBmcm9tIEhpcm90byBLYWdvdGFuaSA8a2Fnb3RhbmlAY3MudGl0ZWNoLmFjLmpwPi4pCisKKwkqIHV0aWxzLmMgKGZwdXRzX2RlbWFuZ2xlZCk6ICBBdm9pZCBkdXBsaWNhdGUgcHJpbnRpbmcgaWYKKwlkZW1hbmdsaW5nIGlzIG9mZi4gIChGaXggZnJvbSBKLlQuIENvbmtsaW4gPGp0Y0BjYXllbm5lLmNvbT4uKQorCisJKiBpbmZydW4uYyAocHJvY2VlZCk6ICBDYXN0IC0xIHRvIChDT1JFX0FERFIpIGJlZm9yZSBjb21wYXJpbmcuCisJKEZpeCBmcm9tIHBpZXJyZUBsYS50Y2UuY29tIChQaWVycmUgV2lsbGFyZCkuKQorCisJKiBtYWluLmMgKGNhdGNoX2Vycm9ycyk6ICBDaGFuZ2UgYXJndW1lbnQgdG8gYSBjaGFyICogZnJvbSBhbiBpbnQsCisJc2luY2UgYSBjaGFyICogY2FuIHBvaW50IHRvIGEgc3RydWN0IGZ1bGwgb2YgZ2xvcCwgYnV0IGFuIGludAorCWlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGFibGUgdG8gaG9sZCBhIHBvaW50ZXIuCisJKiBicmVha3BvaW50LmMgKGJyZWFrcG9pbnRfY29uZF9ldmFsLCBicHN0YXRfc3RvcF9zdGF0dXMsCisJYnJlYWtwb2ludF9yZV9zZXRfb25lLCBicmVha3BvaW50X3JlX3NldCk6ICBBZGFwdC4KKwkqIGNvcmUuYyAoY29yZV9vcGVuLCBzb2xpYl9hZGRfc3R1Yik6ICBBZGFwdC4KKwkqIHJlbW90ZS12eC5jIChzeW1ib2xfc3R1YiwgYWRkX3N5bWJvbF9zdHViLCBjYWxsZXJzKTogIEFkYXB0LgorCitXZWQgQXVnIDI4IDE4OjE4OjA1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgVkVSU0lPTiB0byA0LjAuMS4gIEV2YWRlIEdOVSBNYWtlIGJ1ZworCWJ5IGFkZGluZyAuTk9FWFBPUlQgdGFyZ2V0LgorCitGcmkgQXVnIDIzIDE3OjE0OjI1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogR0RCLTQuMCByZWxlYXNlIQorCSogVXBkYXRlIFJFQURNRS4KKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIFJvbGwgdG8gNC4wLgorCShnZGIudGFyLlopOiAgTWFrZSByZWZjYXJkLnBzIGFzIHdlbGwsIGZvciBzaGlwbWVudC4KKworRnJpIEF1ZyAyMyAxNDowNzowOSAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogZG9jL2dkYi50ZXhpbmZvOiBtaW5vciByZXdvcmRpbmdzLCBjcm9zc3JlZiB0byBwdHlwZSBmcm9tIHByaW50LAorCW1vcmUgb24gcHJpbnRzeW1zLiAKKworCSogZG9jL01ha2VmaWxlLCBNYWtlZmlsZS5pbjogZ2VuZXJhdGUgImdkYi1hbGwudGV4aSIgcmF0aGVyIHRoYW4KKwkiZ2RiLWFsbC50ZXhpbmZvIiAKKworCSogZG9jL3JkbC1hcHBzLnRleGk6IHJlbmFtZWQgZnJvbSByZGwtYXBwcy50ZXhpbmZvCisKKwkqIE1ha2VmaWxlLmluLCBkb2MvTWFrZWZpbGUsIGRvYy9nZGIudGV4aW5mbzoKKwlyZWZsZWN0IGFib3ZlIG5hbWUgY2hhbmdlCisKKwkqIFdIQVRTLk5FVzogY29ycmVjdCBwb2ludGVyIHRvIHJlZmNhcmQuCisKKwkqIGRvYy9nZGIudGV4aW5mbzogdXBkYXRlIE5ldyBGZWF0dXJlcywgSW5zdGFsbGluZworCisJKiBkb2MvZ2RiaW50LnRleGluZm86IGFkZCBzaG9ydCBkZXNjcmlwdGlvbiBvZiBjb25maWd1cmUgK3RlbXBsYXRlCisKK0ZyaSBBdWcgMjMgMTE6NDY6MDggMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGRvYy9nZGIudGV4aW5mbzogdXBkYXRlLCBmaXggYnVncyBpbiAiSW5zdGFsbGluZyIgYXBwZW5kaXgKKworRnJpIEF1ZyAyMyAwMTowMjowMCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgQWRkIGNvbmZpZy5zdWIsIG1ha2UgZG9jL3JkbC1hcHBzLnRleGluZm8gZm9yCisJdGFyIGZpbGUsIGFkZCBkZXBlbmRlbmNpZXMgZm9yIHJlZmVyZW5jZWQgZG9jIGZpbGVzLgorCitUaHUgQXVnIDIyIDIyOjE3OjA2IDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBjb2ZmcmVhZC5jLCBzeW1maWxlLmMsIHN0YWNrLmM6ICBzYWJlcml6ZWQuCisKK1RodSBBdWcgMjIgMTY6MjA6MjcgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGRvYy9yZWZjYXJkLnRleDogcGVybXV0ZWQgRXNzZW50aWFsIENvbW1hbmRzIHNlYworCisJKiBkb2MvZ2RiLnRleGluZm86IG5ldyBDKysgY2hhcHRlcjsgcmV2aXNlZCBpbnN0YWxsYXRpb24gYXBwZW5kaXg7CisJbmV3IGRvYyBmb3IKKwkJc2V0L3Nob3cgc3ltYm9sLXJlbG9hZGluZworCQlkZWZhdWx0IHNldCBjb21wbGFpbnRzIDAKKwkJaW5mbyBhbGwtcmVnaXN0ZXJzCisJCVJFVC1yZXBlYXQgZGlzYWJsZWQgYWZ0ZXIgcHJvbXB0ZWQgbG9uZyBkaXNwbGF5cworCQlwcm9jZXNzSUQgKGF0dGFjaCkgaW50ZXJwcmV0YXRpb24gb2YgMm5kIEdEQiBjbWRsaW5lIGFyZworCitUaHUgQXVnIDIyIDE0OjA1OjQ3IDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBleHByZWFkLnksIGNvZmZyZWFkLmMsIGRieHJlYWQuYywgdGFyZ2V0LmMsIG1lbS1icmVhay5jLAorCSAgY3BsdXMtZGVtLmMsIHZhbHVlcy5jLCB2YWxwcmludC5jLCBzeW1maWxlLmMsIHJlbW90ZS5jLAorCSAgYnJlYWtwb2ludC5jLCBtYWluLmM6ICBsaW50LgorCitUaHUgQXVnIDIyIDAyOjAyOjI2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCUluc3RhbGwgbmV3IGNvbmZpZ3VyYXRpb24gc2NoZW1lIGZvciBHREIgYW5kIGZyaWVuZHMuCisKKwkqIGNvbmZpZy5zdWI6ICBUcmFuc2xhdGUgb3JkaW5hcnkgbmFtZXMgdG8gdGhyZWUtcGFydCBuYW1lcy4KKwkqIGNvbmZpZ3VyZTogIFVzZSB0aHJlZS1wYXJ0IG5hbWVzIGludGVybmFsbHkuCisJKiBjb25maWd1cmUuaW46ICBUcmFuc2xhdGUgdGhyZWUtcGFydCBuYW1lcyB0byBmaWxlbmFtZXMuCisKKwkqIFJFQURNRSwgV0hBVFMuTkVXOiAgVXBkYXRlIGZvciBnZGItNC4wLgorCSogTWFrZWZpbGUuaW46ICBSb2xsIFZFUlNJT04gdG8gMy45OS4KKworV2VkIEF1ZyAyMSAxODoyMTowOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGluZnB0cmFjZS5jIChLRVJORUxfVV9BRERSX0JTRCk6ICBJbmNsdWRlIGEub3V0LmdudS5oLgorCSogaTk2MC10ZGVwLmMsIG02OGstdGRlcC5jLCBzcGFyYy10ZGVwLmMsIHRtLWk5NjAuaCwKKwl0bS1tNjhrLmgsIHJlbW90ZS1uaW5keS5jOiAgQ2hhbmdlIGV4dF9mb3JtYXRfWFhYIHN0cnVjdHMKKwl0byBzaW5nbGUgc3RydWN0dXJlcyByYXRoZXIgdGhhbiBhcnJheXM7IHdoZW4gcGFzc2luZworCXRoZWlyIGFkZHJlc3MsIHVzZSAmLiAgVGhpcyBhdm9pZHMgdHJvdWJsZSB3aXRoIGJkZWFkIGNvbXBpbGVycy4KKwkqIG1jaGVjay5jOiBEb24ndCBpbmNsdWRlIDxzdGRsaWIuaD47IGp1c3QgZGVjbGFyZSAidm9pZCBhYm9ydCgpOyIKKwlpbnN0ZWFkLiAgVGhpcyBhdm9pZHMgcG9ydGFiaWxpdHkgaGVhZGFjaGVzLgorCSogbWlwcy10ZGVwLmMgKG1pcHNfZG9fcmVnaXN0ZXJzX2luZm8pOiAgT25seSBwcmludCBGUCByZWdzIGlmCisJYXNrZWQgdG8uCisJKiBzb3VyY2UuYyAob3Blbl9zb3VyY2VfZmlsZSk6ICBBdm9pZCBBTlNJIGNvbnN0IGJkZWF0aCBieSAKKwlza2lwcGluZyBkZWNsYXJhdGlvbiBhbmQgdGhlbiBjYXN0aW5nIHJlc3VsdCB2YWx1ZS4KKwkqIHRtLWhwMzAwYnNkLmg6ICBDbGFyaWZ5IGNvbW1lbnQuCisJKiB1dGlscy5jIChzdHJzdHIpOiAgUmVzdWx0IGlzIGNvbnN0IGNoYXIgKjsgQU5TSSBiZGVhdGguCisJKiB4bS1ocDMwMGJzZC5oOiAgRGVmaW5lIEhPU1RfQllURV9PUkRFUi4gIFJlZGVmaW5lIElOVF9NSU4sCisJc2luY2Ugc3lzdGVtIGluY2x1ZGUgZmlsZSBkZWZpbmVzIGl0IGRpZmZlcmVudGx5IGZyb20gImRlZnMuaCIsCisJdGhvdWdoIHRoZSB0d28gYXJlIGVxdWl2YWxlbnQgZm9yIG91ciBwdXJwb3Nlcy4KKwkqIHRjb25maWcvaHAzMDBic2Q6ICBBZGQgbTY4ay10ZGVwLm8uCisKK1R1ZSBBdWcgMjAgMTY6MDE6MTEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiB0Y29uZmlnL3N1bio0OiAgUmVtb3ZlIHdhcm5pbmdzIGFib3V0IHN5c3RlbSBhc3NlbWJsZXIuCisKK01vbiBBdWcgMTkgMTM6NDQ6NDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBtY2hlY2suYzogIEF2b2lkIHdhcm5pbmcgYWJvdXQgdW5kZWNsYXJlZCBhYm9ydCBmbi4KKwkqIHRtLXNwYXJjLmggKFBDX0FESlVTVCk6ICBBdm9pZCBjYWxsaW5nIGVycm9yKCkgZnJvbSB0aGlzOworCWl0IGNhdXNlcyByZWN1cnNpdmUgY2FsbHMgdG8gZXJyb3IoKSB3aGVuIHVzZWQgaW4gY2xlYW51cHMuCisJVG8gZG8gc28gcmVxdWlyZXMgdGhhdCB3ZSBtYWtlIGl0IGEgZnVuY3Rpb24sIHNvIHdlIGRvLgorCSogc3BhcmMtdGRlcC5jIChzcGFyY19wY19hZGp1c3QpOiAgTmV3IGltcGxlbSBvZiBQQ19BREpVU1QuCisJKiB1dGlscy5jIChkb19jbGVhbnVwcyk6ICBSZW1vdmUgdGhlIGN1cnJlbnQgY2xlYW51cCBmcm9tIHRoZQorCWNoYWluICpiZWZvcmUqIGNhbGxpbmcgaXQsIGluIGNhc2UgZXJyb3IoKSBpcyBjYWxsZWQgZnJvbSBpdC4KKwlUaGUgcmVzdWx0IHdvbid0IGJlIHByZXR0eSwgYnV0IHdvbid0IGJlIGFuIGluZmluaXRlIGxvb3AgZWl0aGVyLgorCitNb24gQXVnIDE5IDAwOjQxOjA0IDE5OTEgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm4gYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGRieHJlYWQuYyAocmVhZF9zdHJ1Y3RfdHlwZSk6IEdyb2sgYW5vbiBzdHJ1Y3RzIGZvciBDKysuCisJKHZiX25hbWUsIHZwdHJfbmFtZSk6IE51bGwgdGVybWluYXRlIHRoZXNlIHN0cmluZ3MuCisKK0ZyaSBBdWcgMTYgMDg6MzE6MDMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJTWlub3IgYnVnIGZpeGVzIGZyb20gQlNEIE5ldDIgZ2RiOgorCisJKiBibG9ja2ZyYW1lLmMgKGdldF9wcmV2X2ZyYW1lX2luZm8pOiAgSWYgRlJBTUVfQ0hBSU5fQ09NQklORQorCXJldHVybnMgMCwgdGhlcmUgaXMgbm8gcHJldmlvdXMgZnJhbWUuCisJKiBicmVha3BvaW50LmMgKGNvbW1hbmRzX2NvbW1hbmQpOiAgSWYgIWZyb21fdHR5LCBkb24ndCBjYWxsCisJaW5wdXRfZnJvbV90ZXJtaW5hbF9wKCkuCisJKiBkYnhyZWFkLmMgKHJlY29yZF9taXNjX2Z1bmN0aW9uKTogIFNwZWVkIHVwIHNsaWdodGx5LgorCShjb21wYXJlX3BzeW1ib2xzKTogIERpdHRvLgorCSogaW5mY21kLmMgKGRvX3JlZ2lzdGVyc19pbmZvKTogIFRha2UgYSBzZWNvbmQgYXJndW1lbnQgdG8KKwlkZXRlcm1pbmUgd2hldGhlciB0byBwcmludCBmbG9hdCByZWdpc3RlcnMuICAiaW5mbyByZWdpc3RlcnMiCisJZG9lcyBub3QgZG8gc28gYW55bW9yZS4gICJpbmZvIGFsbC1yZWdpc3RlcnMiIGRvZXMsIG5vdy4KKwkqIG1pcHMtdGRlcC5jLCBweXItdGRlcC5jICh4eHhfZG9fcmVnaXN0ZXJzX2luZm8pOiAgVGFrZSBzZWNvbmQKKwlhcmcgYW5kIGlnbm9yZSBpdC4KKwkqIHRtLW1pcHMuaCwgdG0tcHlyLmggKERPX1JFR0lTVEVSU19JTkZPKTogIFBhc3Mgc2Vjb25kIGFyZy4KKwkqIGluZmxvdy5jIChpbml0aWFsaXplX2luZmxvdyk6ICBTZXQgdGZsYWdzX291cnMgY29ycmVjdGx5LgorCQorCU90aGVyIGZpeGVzOgorCisJKiBicmVha3BvaW50LmMgKGJwc3RhdF9kb19hY3Rpb25zKTogIFVzZSBhIGNsZWFudXAgdG8gcmVzdG9yZQorCWV4ZWN1dGluZ19icmVha3BvaW50X2NvbW1hbmRzIGlmIHdlIGFyZSBpbnRlcnJ1cHRlZCBieSBlcnJvci4KKwkqIGNvZmZyZWFkLmMgKGluaXRfbGluZW5vKTogIEF2b2lkIHByb2JsZW0gd2l0aCB6ZXJvLXNpemVkIGxpbmV0YWIKKwl2ZXJzdXMgbWFsbG9jL2ZyZWUuICBGcm9tOiBqb2huQGxhYnRhbS5sYWJ0YW0ub3ouYXUgKEpvaG4gQ2FyZXkpLgorCSogY29yZS5jIChzb2xpYl9hZGRfc3R1YiwgY29yZV9vcGVuKTogIENhbGwgU09MSUJfQUREIGluc2lkZSBhCisJY2F0Y2hfZXJyb3JzKCkgc28gd2UgY2FuIHNldHVwIHRoZSBmcmFtZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIKKwl0aGUgc2hhcmVkIGxpYnMgd29yay4KKwkqIGllZWUtZmxvYXQuYyAoZG91YmxlX3RvX2llZWVfZXh0ZW5kZWQpOiAgR2V0IGV4cG9uZW50IGZyb20KKwlyaWdodCBwbGFjZSBpbiBsaXR0bGUtZW5kaWFuIHN5c3RlbXMuICBGcm9tIEpvaG4gQ2FyZXkuCisKK1RodSBBdWcgMTUgMTg6NDM6NTcgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBtYWluLmM6IFJlbW92ZSB1bnVzZWQgdGVybWluYXRpbmdfc2lnbmFscyBhbmQgY2F0Y2hfdGVybWluYXRpb24oKS4KKwkobG9uZ19vcHRpb25zKTogIFRlcm1pbmF0ZSB3aXRoIGEgemVybyBlbGVtZW50LgorCVtCdWdmaXggZnJvbSBBdHN1byBLYXdhZ3VjaGkgPGF0c3VvQGhhcms4Ni5oYXJsLmhpdGFjaGkuY28uanA+Ll0KKwkoZ2RiX3JlYWRsaW5lKTogIE1ha2UgY2FsbC1jb21wYXRpYmxlIHdpdGggcmVhZGxpbmUuCisJKGluaXRfc2lnbmFscyk6ICBJbXByb3ZlIGNvbW1lbnRzIHJlIHZmb3JrIHZzLiBzaWduYWwuCisKKwkqIHV0aWxzLmMgKHByb21wdF9mb3JfY29udGludWUpOiAgVXNlIG5ldyBnZGJfcmVhZGxpbmUoKS4KKwlJZiB3ZSBwcm9tcHQgZm9yIGNvbnRpbnVhdGlvbiwgd2UgZG9uJ3QgbGV0IENSIHJlcGVhdCB0aGUgcHJldmlvdXMKKwljb21tYW5kLCBvbmNlIHdlIGdldCBiYWNrIHRvIGEgcHJvbXB0LiAgSXQncyB0b28gZWFzeSB0byBrZWVwCisJaGl0dGluZyBDUiwgZXhwZWN0aW5nICItLW1vcmUtLSIgcHJvbXB0cywgYW5kIGhhdmUgc29tZSBsb25nCisJY29tbWFuZCBzdGFydCByZXBlYXRpbmcgb24geW91LgorCitUdWUgQXVnIDEzIDE2OjE3OjU2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogYmxvY2tmcmFtZS5jIChmcmFtZWxlc3NfbG9va19mb3JfcHJvbG9ndWUpOiAgU3BlZWQgdXAgYnkKKwljYWxsaW5nIFNLSVBfUFJPTE9HVUVfRlJBTUVMRVNTX1AgaWYgaXQncyBkZWZpbmVkLgorCSogdG0tc3BhcmMuaCAoU0tJUF9QUk9MT0dVRSwgU0tJUF9QUk9MT0dVRV9GUkFNRUxFU1NfUCk6CisJRGVmaW5lIHR3byB2YXJpYW50cywgb25lIGZhc3Rlci4KKwkqIHNwYXJjLXRkZXAuYyAoc3BhcmNfZnJhbWVfY2hhaW4pOiAgVXNlIHRhcmdldF9yZWFkX21lbW9yeQorCWFuZCByZXR1cm4gemVybywgcmF0aGVyIHRoYW4gZ2l2aW5nIGFuIGVycm9yLgorCShzZXR1cF9hcmJpdHJhcnlfZnJhbWUpOiAgSW5pdGlhbGl6ZSB0aGUgUEMgaW4gdGhlIG5ldyBmcmFtZS4KKwkoc2tpcF9wcm9sb2d1ZSk6ICBBZGQgYSBzZWNvbmQgYXJnIHNheWluZyB3aGV0aGVyIHdlJ3JlIGp1c3QKKwljaGVja2luZyBmb3IgYSBmcmFtZWxlc3MgZnVuY3Rpb24gb3Igbm90LgorCisJKiBjb3JlLmMgKGNvcmVfb3BlbiwgY29yZV9jbG9zZSwgY29yZV94ZmVyX21lbW9yeSk6ICBNb3ZlCisJc2VjdGlvbiB0YWJsZSBwb2ludGVycyBhbmQgYmZkKiBpbnRvIHRoZSB0YXJnZXRfb3BzLgorCShjb3JlX29wZW4pOiAgQWxsb3cgZXJyb3JzIGluIHNoYXJlZCBsaWIgcmVhZGluZywgZXRjLgorCShjb3JlX2ZpbGVzX2luZm8pOiAgRGVzY3JpYmUgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbnMuCisKKwkqIGV4ZWMuYyAoZXhlY19vcGVuLCBleGVjX2Nsb3NlLCBleGVjX3hmZXJfbWVtb3J5LCB4ZmVyX21lbW9yeSwKKwlleGVjX2ZpbGVzX2luZm8sIHNldF9zZWN0aW9uX2NvbW1hbmQpOiAgTW92ZSBzZWN0aW9uIHRhYmxlCisJcG9pbnRlcnMgYW5kIGJmZCogaW50byB0aGUgdGFyZ2V0X29wcy4KKwkoYWRkX3RvX3NlY3Rpb25fdGFibGUpOiAgQWRkIEJGRCB0byBzZWN0aW9uIHRhYmxlLgorCisJKiB0YXJnZXQuYyAodGFyZ2V0X3hmZXJfbWVtb3J5LCB0YXJnZXRfaW5mbyk6ICBQYXNzIHRhcmdldCB0bworCXhmZXJfbWVtb3J5IGFuZCB0YXJnZXRfaW5mbyBmdW5jdGlvbnMuCisJKiB0YXJnZXQuaDogICAnJworCisJKiBnZGJjb3JlLmg6ICBNb3ZlIHN0cnVjdCBzZWN0aW9uX3RhYmxlLgorCSogdGFyZ2V0Lmg6ICBOZXcgaG9tZSBvZiBzdHJ1Y3Qgc2VjdGlvbl90YWJsZS4KKworCSogc29saWIuYyAoc29saWJfYWRkKTogIE5ldyBhcmd1bWVudCBpcyB0aGUgdGFyZ2V0X29wcyB3aG9zZQorCXNlY3Rpb24gbGlzdCBpcyB0byBiZSBhZGRlZCB0bywgaWYgYW55LiAgUmVhbGxvY2F0ZSB0aGUKKwlzZWN0aW9ucyBpbiB0aGF0IHRhcmdldCB0byBhZGQgYW55IHRoYXQgY29tZSBmcm9tIHNoYXJlZCBsaWJzLgorCSh0aHJvdWdob3V0KSBzb19zZWN0aW9ucyByZW5hbWVkIHRvIHNlY3Rpb25zLgorCShzb2xpYl94ZmVyX21lbW9yeSk6ICBEZWxldGVkLgorCSogdG0tc3Vub3MuaCAoU09MSUJfQUREKTogIEFkZCB0YXJnZXQgYXJndW1lbnQuCisJKFNPTElCX1hGRVJfTUVNT1JZKTogIERlbGV0ZS4KKworCSogY29yZS5jLCBleGVjLmMsIGluZnRhcmcuYywgcmVtb3RlLWViLmMsIHJlbW90ZS1uaW5keS5jLAorCXJlbW90ZS12eC5jLCByZW1vdGUuYywgdGFyZ2V0LmMsIHRhcmdldC5oOiAgUmVtb3ZlIGFkZF9zeW1zIHZlY3RvcgorCWZyb20gdGFyZ2V0X29wcy4gIEl0J3MgdGhlIHNhbWUgb24gYWxsIHRhcmdldHMuICBBZGQgdHdvIHNlY3Rpb24KKwlwb2ludGVycyB0byB0YXJnZXRfb3BzLgorCisJKiBzdGFjay5jIChmaW5kX3JlbGF0aXZlX2ZyYW1lKTogIER1bXAgYW5jaWVudCBhbGdvcml0aG0gZm9yCisJImRvd24iLCBqdXN0IHVzZSBoYW5keSAibmV4dCIgcG9pbnRlcnMuCisJKGZyYW1lX2NvbW1hbmQpOiAgRG9uJ3QgZXJyb3IgaWYgdGhlcmUgaXMgbm8gc3RhY2s7IGxldCB1c2VyCisJc2V0IG9uZS4KKworCSogaW5mbG93LmMgKG5ld190dHlfcHJlZm9yaywgbmV3X3R0eSk6ICBOZXcgcHJlZm9yayByb3V0aW5lCisJbW9kaWZpZXMgc3RhdGljIHN0YXRlIGluIHRoZSBwYXJlbnQgcHJvY2VzczsgbmV3X3R0eSBpdHNlbGYKKwlydW5zIGluIHRoZSBjaGlsZCBhbmQgbW9kaWZpZXMgdGhlIGNoaWxkJ3MgZmlsZSBkZXNjcmlwdG9ycworCXRvIG1hdGNoIHRoZSBzYXZlZCBzdGF0aWMgc3RhdGUuCisJKiBpbmZydW4uYyAoY2hpbGRfY3JlYXRlX2luZmVyaW9yKTogIENhbGwgbmV3X3R0eV9wcmVmb3JrLAorCWZvcmssIHRoZW4gbmV3X3R0eS4KKworCSogaW5mcHRyYWNlLmMgKGNoaWxkX3hmZXJfbWVtb3J5KTogIEFkZCBpZ25vcmVkIHRhcmdldCBhcmcuCisJKiByZW1vdGUtZWIuYyAoZWJfeGZlcl9pbmZlcmlvcl9tZW1vcnkpOiAgJycKKwkqIHJlbW90ZS1uaW5keS5jIChuaW5keV94ZmVyX2luZmVyaW9yX21lbW9yeSk6ICAnJworCSogcmVtb3RlLXZ4LmMgKHZ4X3hmZXJfbWVtb3J5KTogICAgJycKKwkqIHJlbW90ZS5jIChyZW1vdGVfeGZlcl9tZW1vcnkpOiAgICcnLiAgUmVuYW1lIGZyb20KKwlyZW1vdGVfeGZlcl9pbmZlcmlvcl9tZW1vcnkuCisKKwkqIG1haW4uYyAobWFpbik6ICBPbmx5IHRyeSB0byBhdHRhY2ggImNvcmVmaWxlIiBhcmd1bWVudCBpZgorCWl0IHN0YXJ0cyB3aXRoIGEgZGlnaXQuCisKKwkqIHN5bWZpbGUuYyAoc3ltYm9sX3JlbG9hZGluZyk6ICBOZXcgInNldC9zaG93IiB2YXJpYWJsZS4KKwkoc3ltYm9sX2ZpbGVfYWRkKTogIFNob3J0ZW4gbWVzc2FnZSBhYm91dCBzeW1ib2wgcmVhZGluZy4KKwkoYWRkX3N5bWJvbF9maWxlX2NvbW1hbmQpOiAgTWVyZ2Ugd2l0aCBhZGRfc3ltc19hZGRyX2NvbW1hbmQsCisJc2luY2UgdGhpcyBzaG91bGQgd29yayBvbiBhbGwgdGFyZ2V0cyBub3cuCisJKHN0b3Bfd2hpbmluZyk6ICBEZWZhdWx0IHRvIHplcm8sIHRvIHNodXQgdXAgY29tcGxhaW50cworCWFib3V0IGJhZCBzeW1ib2wgdGFibGVzIG9uIG1hbnkgc3lzdGVtcy4KKwkoZnJlZV9uYW1lZF9zeW10YWJzKTogIEp1c3QgZXhpdCB1bmxlc3Mgc3ltYm9sX3JlbG9hZGluZy4KKworCSogeG0tc3VuM29zNC5oLCB4bS1zdW40b3M0Lmg6ICBEZWZpbmUgQlJPS0VOX0xBUkdFX0FMTE9DQSwKKwlhbmQgYWRkIGNvbW1lbnQgZXhwbGFpbmluZyBzaGFyZWQgbGlicmFyeSBzY3Jldy4KKworCSogc291cmNlLmM6ICAjaWYgZGVmaW5lZCA9PiAjaWZkZWYuCisKK1RodSBBdWcgIDggMTI6MjM6MTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBkb2MvZ2RiaW50LnRleGluZm86ICBJbXByb3ZlIGRvYyBvbiBwb3J0aW5nIHRvIG5ldyBPUydzLgorCitUdWUgQXVnICA2IDE3OjE2OjE1IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBkb2MvcmRsLWFwcHMudGV4aW5mbzogcHJvdmlkZSBkZWZhdWx0IHJlYWRsaW5lLWFwcGVuZGl4IGZpbmRlcgorCShkb2MvTWFrZWZpbGUga25vd3MgaG93IHRvIG1ha2Ugb25lIGZvciBsb2NhbCBjb25maWcpCisKKwkqIE1ha2VmaWxlLmluOiB1c2UgZG9jL01ha2VmaWxlIGZvciBkb2MgdGFyZ2V0cworCisJKiBkb2MvTWFrZWZpbGU6IEdEQiBkb2N1bWVudGF0aW9uIG5vdyBoYXMgaXRzIG93biBNYWtlZmlsZQorCSAgZG9jL3JlZmNhcmQudGV4OiByZW5hbWVkIGZyb20gImdkYnJjLnRleCIKKwkgIGRvYy9nZGJpbnQudGV4aW5mbzogYWRkIG1hcmt1cCBpbiAiQ2xlYW51cHMiIGNoYXB0ZXIKKworCitGcmkgQXVnICAyIDAwOjEzOjA2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogdmFsdWVzLmMgKGJhc2VjbGFzc19hZGRyKTogIFdoZW4gcmVhZGluZyB0YXJnZXQgbWVtb3J5LCB1c2UgdGhlCisJbGVuZ3RoIG9mIHRoZSBiYXNldHlwZSwgbm90IHRoZSB1cHBlciB0eXBlLiAgV2UndmUgb25seSBtYWxsb2MnZAorCWVub3VnaCBzcGFjZSBmb3IgdGhlIGJhc2V0eXBlLCBsZWFkaW5nIHRvIGVycm9ycyBpbiBmcmVlKCkuCisKKwkqIGV4cHByaW50LmMgKHByaW50X3N1YmV4cCk6ICBQcmludCBVTk9QX01FTVZBTCBvZiBhbiBPUF9MT05HIHRoYXQKKwllbmRzIHVwIGFzIGEgZnVuY3Rpb24gc3BlY2lhbGx5LCBzaW5jZSB3ZSBrbm93IHRoZSBhY3R1YWwgdHlwZSBvZgorCXRoZSBwb2ludGVkLXRvIGFkZHJlc3MuICBUaGlzIChzb21ld2hhdCkgZml4ZXMgZGlzcGxheSBvZgorCWV4cHJlc3Npb25zIHRoYXQgaW5jbHVkZSBtaXNjX2Z1bmN0aW9uX3ZlY3RvciBuYW1lcy4gIFRyeSBgY29uZCAxCisJIXN0cmNtcCgiYSIsImIiKScgdGhlbiBgaSBiJy4KKworCSogaW5mcnVuLmM6ICBNb3ZlIERPX0RFRkVSUkVEX1NUT1JFUyBmcm9tIHByb2NlZWQoKSB0byByZXN1bWUoKS4KKwlUaGUgY2hpbGQgY2FuIGJlIHByb2NlZWRlZCBmcm9tIGluc2lkZSB3YWl0X2Zvcl9pbmZlcmlvciBpbgorCWV2YWx1YXRpbmcgYnJlYWtwb2ludCBjb25kaXRpb25zLCBhbmQgRE9fREVGRVJSRURfU1RPUkVTIHdhcworCWdldHRpbmcgc2tpcHBlZCBpbiB0aGF0IGNhc2UuCisKKwkqIGV4cHByaW50LmMgKHByaW50X3N1YmV4cCk6ICBVc2UgZmlsdGVyZWQgb3V0cHV0LCBzaW5jZSB0aGUKKwlzdWJyb3V0aW5lcyB3ZSBjYWxsIHVzZSBpdCwgb3RoZXJ3aXNlIHRoZSBvdXRwdXQgaXMgaG9ycmlibHkKKwltYW5nbGVkLCBzaW5jZSBvdXRwdXQgb2Ygd3JhcHBhYmxlIHN0dWZmIGNvbWVzIG91dCBsYXRlLgorCisJKiBNYWtlZmlsZS5pbjogIEJ1bXAgVkVSU0lPTiB0byAzLjk4LjEKKworCSogaW5mcnVuLmMgKGNoaWxkX2NyZWF0ZV9wcm9jZXNzKTogIFVzZSBleGVjbHAgdG8gZmluZCB0aGUKKwlzaGVsbCB0byBleGVjIG91ciB0YXJnZXQgcHJvZ3JhbS4gIFRoaXMgcmVxdWlyZXMgc29tZSBmaWRkbGluZworCXdpdGggYGVudmlyb24nIHNpbmNlIHRoZXJlIGlzIG5vIGV4ZWNscGUoKS4KKworVGh1IEF1ZyAgMSAxNTozNToxNyAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiwgZG9jL2dkYnJjLnRleCwgZG9jL3JjLSogKG5ldyBmaWxlcyk6CisJTWlub3IgcmVhcnJhbmdlbWVudCBvZiByZWZjYXJkIHBlcm1pdHMgdHdvIG5ldyBtYWtlIHRhcmdldHMtLQorCWdkYnJjLmR2aQkgICAgRFZJIG91dHB1dCBmb3IgcmVmY2FyZCwgdXNpbmcgQ00gZm9udHMKKwlnZGJyYy5wcwkgICAgUG9zdFNjcmlwdCByZWZjYXJkLCB1c2luZyBQUyBmb250cworCitXZWQgSnVsIDMxIDE2OjQ2OjIxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogR0RCLTMuOTggcmVsZWFzZS4KKworCSogVE9ETywgUHJvamVjdHMsIFdIQVRTLk5FVywgUkVBRE1FOiAgVXBkYXRlIGZvciBnZGItMy45OC4KKwkqIE1ha2VmaWxlLmluIChnZGItYWxsLnRleGluZm8pOiAgQXZvaWQgdG91Y2hpbmcgZmlsZSBpZiBNNCBkaWVzLgorCitXZWQgSnVsIDMxIDE2OjM1OjU4IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBkb2MvZ2RiLnRleGluZm86IGxhc3QgY2hhbmdlcyBmb3IgcmVsZWFzZS4KKwlNaW5vciB0eXBvIGFuZCBmb3JtYXR0aW5nIGZpeGVzOyBpbmNvcnBvcmF0ZWQgbW9zdCBmaXhlcyByZW1haW5pbmcgZnJvbQorCWZpbGVkIG1haWwgY29tbWVudGluZyBvbiBlYXJsaWVyIGRyYWZ0cy4KKworCUFkZGVkIHdhcm5pbmdzOiBwaXBlcyBkb24ndCB3b3JrIGluIHJ1biBjb21tYW5kOworCSAgICAgICAgY29uZGl0aW9ucyBhcmUgY29udmVyc2Ugb2YgYXNzZXJ0aW9uczsKKwkgICAgICAJc3RlcCBvdmVyIGZuIHdpdGhvdXQgZGVidWcgaW5mbyBnb2VzIHRvIG5leHQgZm47CisJCXZhcnMgbWF5IGhhdmUgIndyb25nIiB2YWx1ZXMgbmVhciBmbiBlbnRyYW5jZSwgZXhpdAorCisJQWRkZWQgZXhhbXBsZSBmcm9tIEtpbmdzdG9uIG9uIHByaW50aW5nIHJlcGVhdGVkIG5vbmFkamFjZW50IHZhbHVlcworCisJQWRkZWQgZXhwbGljaXQgbWVudGlvbiB0aGF0IGluIEVtYWNzIGdkYiBtb2RlIEMtYyBhbmQgQy16IGFyZSBsaWtlCisJc2hlbGwgbW9kZSBmb3Igc2lnbmFscworCisJUmVuYW1lZCAiU3RlcHBpbmcgYW5kIENvbnRpbnVpbmciIHRvICJDb250aW51aW5nIGFuZCBTdGVwcGluZyIgc28gaXQKKwlkb2Vzbid0IHNvdW5kIHNvIG11Y2ggbGlrZSBpdHMgcGFyZW50ICJTdG9wcGluZyBhbmQgQ29udGludWluZyI7IGFsc28KKwltb3ZlZCBlbnRyaWVzIG9uIGNvbnRpbnVlIHRvIHRvcCBvZiBzZWN0aW9uLCBzbyB0aGV5IGRvbid0IGdldCBsb3N0LgorCisJSW1wcm92ZWQgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gYXBwZW5kaXgsIGFkZGVkIG1hbnVhbCBmb3JtYXR0aW5nCisJaW5zdHJ1Y3Rpb25zIAorCitUdWUgSnVsIDMwIDE3OjI2OjM5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgUmVtb3ZlIHhtLmggYW5kIHRtLmggZXZlbiBpZiB3ZSBhcmVuJ3QgbGlua2luZworCW5ldyBvbmVzLCBzbyAiLi9jb25maWd1cmUgc3VuNDsgLi9jb25maWd1cmUgbm9uZSIgZG9lcyB0aGUgcmlnaHQKKwl0aGluZy4gIEFzc3VtZSB0aGF0IGFsbGRlcHMubWFrIGFuZCBkZXBlbmQgYXJlIGFscmVhZHkgYnVpbHQgaW4KKwlzcmNkaXIsIGFuZCBhdm9pZCBydW5uaW5nICJtYWtlIiAocGFydGljdWxhcmx5ICJtYWtlIGRlcGVuZCIsCisJd2hpY2ggaW52b2x2ZXMgImdjYyIpIGZyb20gaW5zaWRlIGNvbmZpZ3VyZS4gIEJ1aWxkIE1ha2VmaWxlCisJZGlyZWN0bHkgcmF0aGVyIHRoYW4gYnVpbGRpbmcgTWFrZWZpbGUuY29uZiBmaXJzdC4KKwkqIGNvbmZpZ3VyZTogIFJlZ2VuZXJhdGUgd2l0aCBhYm92ZSBjaGFuZ2VzLgorCSogTWFrZWZpbGUuaW46ICBVc2UgJChCSVNPTikgdG8gZmluZCBiaXNvbi4gIFJvbGwgVkVSU0lPTgorCXRvIDMuOTguICBSZXZpc2UgZ2RiLnRhci5aIHByb2NlZHVyZSB0byBwcm9kdWNlIGEgZmlsZQorCWNhbGxlZCBnZGItJChWRVJTSU9OKS50YXIuWiBidXQgd2hpY2ggdW5wYWNrcyBpbnRvIGEKKwlkaXJlY3RvcnkgY2FsbGVkICJnZGIiLiAgTW92ZSBub24tc291cmNlIGZpbGVzIG91dCBvZgorCSQoU0ZJTEVTX1NVQkRJUikuICBQcmV0dHkgdXAgYWxsZGVwcy5tYWsgd2l0aCBjb21tZW50cy4KKwkoZGVwZW5kKTogIERvbid0IHRyeSB0byBkbyAiZ2NjIGV4cHJlYWQueSIuCisJKGV4cHJlYWQubyk6ICBVcGRhdGUgZGVwZW5kZW5jaWVzIGJ5IGhhbmQuCisKK01vbiBKdWwgMjkgMTU6MjE6MDkgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGRvYy9nZGIudGV4aW5mbzoKKwlGaXhlZCBhIHZhcmlldHkgb2Ygc21hbGwgdHlwb3MgdGhhdCBwcmV2ZW50ZWQgaW5mbyBmcm9tIGZvcm1hdHRpbmcKKwljbGVhbmx5OyBhbHRlcmVkIHRvby1sb25nIGhlYWRpbmcgZm9yIEdQTCBBcHBlbmRpeCwgYXMgZGlzY3Vzc2VkCisJdy9STVM7IENoYW5nZWQgZGF0ZSBvbiBjb3ZlciB0byBKdWx5IDkxLgorCitGcmkgSnVsIDI2IDEzOjIwOjAyIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBkb2MvZ2RiLnRleGluZm86CisJKDEpIEFwcGxpZWQgc29tZSBmaXhlcyBkdWUgdG8gY29tbWVudHMgZnJvbSBMYXJyeSBCcmVlZCAoZWFzaWVyIG9uZXMKKwl0aHJvdWdoIGNoYXBzZWMgNS4yKQorCSgyKSBFbGltaW5hdGVkIHVzZSBvZiBAZm9vdG5vdGUtLS1oYWQgbXkgZG91YnRzIGFib3V0IGl0IGFueXdheXMsIGFuZAorCWl0J3MgYnJva2VuIGluIGxhdGVzdCB0ZXhpbmZvCisJKDMpIEludHJvZHVjZWQgKnNvbWUqIHVzZSBvZiBbXSBmb3Igb3B0aW9uYWwgYXJndW1lbnRzLCB3aGVyZQorCWV4cGxhbmF0aW9uIGlzIG5vdCBzaW1wbGVyIGJ5IGxpc3RpbmcgY21kIHcgYXJnIGFuZCBjbWQgdy9vdXQgYXJnCisJc2VwYXJhdGVseS4gIFN0aWxsIG5vdCB1c2luZyBAZGVmZm4uCisJKDQpIERyb3BwZWQgaW4gR1BMLTIuICBOT1RFOiBvbmUgb2YgR1BMLTIgb3IgdGV4aW5mbyBpcyBicm9rZW47IGEKKwljb3VwbGUgb2YgaGVhZGluZ3MgYXJlIHRvbyBsb25nLiAgTmVlZCBwYXRjaGVzIHRvIHRleGluZm8gb3IgcmV2aXNpb24KKwl0byBHUEwtMi4KKworCSogUGFydGlhbCB1cGRhdGUgdG8gUkVBRE1FICh3aGljaCBzdGlsbCBuZWVkcyB3b3JrIGZvciB0aGlzCisJcmVsZWFzZSEpOiAoMSkgdXNlIG9mIGNvbmZpZ3VyZSBjb3JyZWN0ZWQgZm9yIG5ldyBzY3JpcHQsIAorICAgICAgICAgICAgICAgICAgICgyKSAibWFrZSBnZGIuZHZpIiBhbmQgIm1ha2UgZ2RiLmluZm8iIG1lbnRpb25lZC4KKworV2VkIEp1bCAyNCAwNjo0NDowMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIHN5bXRhYi5jIChsb29rdXBfc3ltYm9sKTogIERvbid0IGNvbXBsYWluIHJpZ2h0IG9mZiBhYm91dAorCW5vIGRlYnVnIHN5bWJvbHM7IHVzZSB0aGUgbWlzYyBmdW5jdGlvbiB2ZWN0b3IgZmlyc3QuCisJKGxpc3Rfc3ltYm9scyk6ICBVc2UgbWlzYyBmdW5jdGlvbiB2ZWN0b3IgdG8gZmluZCBzeW1ib2xzCisJdGhhdCBkb24ndCBoYXZlIGRlYnVnIGluZm8sIGFuZCBwcmludCB0aGVtLgorCShmaW5kX3BjX3N5bXRhYik6ICBUZW1wb3JhcmlseSBhdm9pZCBmYXRhbCgpIHdoZW4gcHN5bXRhYgorCVBDIHJhbmdlIGRvZXNuJ3QgbWF0Y2ggc3ltdGFiIFBDIHJhbmdlLCBhcyBpdCBkb2VzIG9uIHRoZSAKKwlNSVBTIGJlY2F1c2Ugb3VyIHN5bXRhYiByZWFkaW5nIGlzbid0IHBlcmZlY3QuCisKKwkqIGRieHJlYWQuYyAoZGJ4X3N5bWZpbGVfcmVhZCk6ICBNYWtlIHdhcm5pbmcgYWJvdXQKKwkibm8gZGVidWcgc3ltYm9scyIgc2xpZ2h0bHkgbmljZXIuCisKKwkqIHNvdXJjZS5jIChzZWxlY3Rfc291cmNlX3N5bXRhYik6ICBJZiAibWFpbiIgc3ltYm9sIGV4aXN0cywKKwlidXQgZGVjb2RlX2xpbmVfc3BlYyBjYW4ndCBmaW5kIGxpbmUgaW5mbywgZG9uJ3QganVzdCByZXR1cm4KKwlhIHplcm87IHRyeSBvdGhlciBzb3VyY2Ugc3ltdGFicyBvciBnaXZlIGFuIGVycm9yLgorCisJKiBtaXBzcmVhZC5jIChwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiAgU29ydCB0aGUgcHN5bXRhYnMgYnkKKwl0aGVpciBsb3cgYWRkcmVzc2VzIGZpcnN0LCB0aGVuIHJpcCB0aHJvdWdoIGZpeGluZyBoaWdoIGFkZHJzLgorCisJKiBuczMyay1vcGNvZGUuaCAoc2Zzcik6ICBCdWdmaXggZnJvbSBSdW5lIE5lcmd9cmQsCisJPHJ1bmVuZUBpZmkudWlvLm5vPi4KKwkoTlMzMktfU1ZDX0lNTUVEX09QRVJBTkRTKTogIFJldmVyc2UgdGhlICNpZm5kZWYuCisKK1R1ZSBKdWwgMjMgMTg6NTI6NDMgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIE1pbm9yLCBtb3N0bHkgbWVjaGFuaWNhbCwgY2xlYW51cCBvZiBkb2Mgc3ViZGlyIGZvciBjbGVhbiAKKwltYWtlaW5mbydpbmcgYW5kIFRlWGluZzsgYWxzbyBlbnN1cmVkIGdkYi1hbGwudGV4aW5mbyAocG9zdC1tNCkgCisJYW5kIGdkYi5pbmZvIChwb3N0LSB0ZXhpbmZvMiBtYWtlaW5mbykgZ2VuZXJhdGVkIGZvciBkaXN0cmlidXRpb24uCisKK1N1biBKdWwgMjEgMDM6NTQ6NTIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJTW9zdGx5IE1JUFMgYW5kIGdlbmVyYWwgc3ltYm9sLXJlYWRpbmcgZml4dXBzLgorCisJKiBkb2MvZ2RiaW50LnRleGluZm86ICBBZGQgZG9jdW1lbnRhdGlvbiBvbiBzeW1ib2wtcmVhZGluZworCWludGVyZmFjZS4KKworCSogbWlwc3JlYWQuYzogIFJlbW92ZSBrbHVkZ2VzIGFyb3VuZCAjaW5jbHVkZSAiZWNvZmYuaCIuCisJUmVtb3ZlIHJlZGVmaW5pdGlvbnMgb2YgYV9tYWdpYywgZXRjLCBubyBsb25nZXIgdXNlZC4KKwkocGFyc2Vfc3ltYm9sLCApOiAgQ29udmVydCAiSW50ZXJuYWw6IiBwcmludGZzIHRvIGNvbXBsYWluKCl0cy4KKwlGaXggZ2xvYmFsIG92ZXJ2aWV3IGNvbW1lbnRzIHRvIG1hdGNoIHN5bWZpbGUuYyBwcm90b2NvbC4KKwkobWlwc2NvZmZfbmV3X2luaXQpOiAgRWxpbWluYXRlIGN1cl9oZHIgaWYgd2UgaGF2ZSBvbmUuCisJKG1pcHNjb2ZmX3N5bWZpbGVfcmVhZCk6ICBFbGltaW5hdGUgdW51c2VkIGNvZGUuICBBdm9pZAorCXNvcnRpbmcgYWxsIHRoZSBzeW10YWJzLCB3aGVuIGFsbCB3ZSBoYXZlIHJlYWQgaGVyZSBpcyBwc3ltdGFicy4KKwlUaGUgc3ltdGFicyBhcmUgc29ydGVkIGFzIHRoZXkgYXJlIGNyZWF0ZWQgYW55d2F5LiAgVGVsbAorCWNvbmRlbnNlX21pc2NfYnVuY2hlcyB3aGV0aGVyIHdlJ3JlIG1haW5saW5lLgorCShwc3ltdGFiX3RvX3N5bXRhYl8xKTogIFBhc3MgZmlsZW5hbWUgd2hlbiByZWN1cnNpbmcsIHRvIG1ha2UKKwlzdGFjayB0cmFjZSBtb3JlIGluZm9ybWF0aXZlLgorCShwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiAgQXNzdW1lIGN1cl9oZHIgYXMgYXJndW1lbnQuCisJKHJlYWRfbWlwc19zeW10YWIpOiAgRG9uJ3QgY2xvYmJlciBjdXJfaGRyLCBzbyBpdCBjYW4gYmUgZnJlZWQuCisJUGFzcyBjdXJfaGRyIGltcGxpY2l0bHkgdG8gcGFyc2VfcGFydGlhbF9zeW1ib2xzLiAgQXZvaWQgY2hlY2tpbmcKKwl0aGUgVFlQRV9OQU1FIG9mIGNoYXIgKiwgc2luY2UgdGhhdCdzIGRvbmUgaW4gc3ltZmlsZS5jLgorCShmcmVlX251bWFyZ3MsIHBhcnNlX3N5bWJvbCwgYWRkX3N5bWJvbCwgYWRkX2Jsb2NrLAorCXNocmlua19saW5ldGFibGUpOiAgRGVjbGFyZSB0aGVzZSBmbnMgdm9pZC4gCisJKHVwZ3JhZGVfdHlwZSk6ICBDb252ZXJ0IHRyZWUgb2YgaWYncyB0byBzd2l0Y2guICBDbGVhbiB1cAorCWJvZ3VzICJvZmYgPT0gMCIgaGFuZGxpbmcgd2l0aCBhIGNvbXBsYWludC4gIEF2b2lkIHNldHRpbmcKKwlmaWVsZCBiaXRwb3MgYW5kIGJpdHNpemUgb2YgYXJyYXkgd2l0aCBsb3dlciBhbmQgdXBwZXIgYm91bmRzLgorCUNoZWNrIHNwZWNpZmllZCBiaXRzaXplIG9mIGVsZW1lbnRzIGFnYWluc3QgdGhlaXIgYWN0dWFsIHR5cGUncworCWJpdHNpemUsIGFuZCBjb21wbGFpbiBpZiBkaWZmZXJlbnQuICBDb21wbGFpbiBhYm91dCB1bmtub3duIAorCXR5cGUgcXVhbGlmaWVycy4KKwkocGFyc2VfZmRyKTogIERvbid0IGFzc3VtZSBzaXplb2YoY2hhciAqKSA9PSBzaXplb2YgKHN0cnVjdCAqKS4KKwkocHN5bXRhYl90b19zeW10YWJfMSk6ICBQcmludCBuYW1lcyBvZiBzdWJzaWRpYXJ5IGZpbGVzIHRoYXQKKwlhcmUgYmVpbmcgcmVhZCBpbi4gIEZJWE1FLCB3ZSByZWFkIGZhciB0b28gbWFueSBmaWxlcy4gIFRoaXMgY29kZQorCWlzIG5vdCB0aGUgcHJvYmxlbSwgdGhlIHByb2JsZW0gaXMgaW4gcGFyc2VfZmRyIHdoZXJlIHRoZSBwc3ltdGFicworCWFyZSBzZXQgdXAuCisJKGNyb3NzX3JlZik6ICBSZXN1bHQgc2hvdWxkIGluZGljYXRlIHRoYXQgd2UgdXNlZCBvbmUgYXV4IGVudHJ5CisJbm9ybWFsbHksIG9yIHR3byBpZiB3ZSBlbmNvdW50ZXJlZCBhICJuZXh0IiBlbnRyeS4gIFRoaXMgdXNlZAorCXRvIGxlYXZlIHRoZSBjYWxsZXIgcG9pbnRpbmcgYXQgdGhlIHdyb25nIGF1eCBlbnRyeS4KKwkoYWRkX3N5bWJvbCk6ICBJZiBvdmVyZmxvd2VkIGN1cl9ibG9jaywgcmVhbGxvY2F0ZSBpdCBsYXJnZXIsCisJY2hhc2UgYWxsIHBvaW50ZXJzIHRvIGl0LCBhbmQgY29tcGxhaW4oKSwgcmF0aGVyIHRoYW4gY2xvYmJlciBtZW1vcnkuCisJKHNocmlua19ibG9jayk6ICBVc2UgeHJlYWxsb2MgcmF0aGVyIHRoYW4geG1hbGxvYy1hbmQtY29weS4KKwkobmV3X2ZpZWxkKTogIE9ubHkgYWxsb2NhdGUgb25lIGZpZWxkIGluaXRpYWxseSwgbm90IHR3by4KKwlQdWxsICsrIG91dCBvZiBtYWNybyBhcmd1bWVudC4gIFNpbXBsaWZ5LgorCShfaW5pdGlhbGl6ZV9taXBzcmVhZCk6ICBBdm9pZCBpbml0aWFsaXphdGlvbiBvZiBpbXBvcnRkCisJZ2xvYmFsX3BzeW1ib2xzIGFuZCBzdGF0aWNfcHN5bWJvbHMuIAorCisJKiBzeW1maWxlLmMgKHBzeW10YWJfdG9fc3ltdGFiKTogIERlcGVuZCBvbiBYWFhfcHN5bXRhYl90b19zeW10YWIKKwl0byBwcm9wZXJseSBzZXQgcHN0LT5zeW10YWI7IGF2b2lkIHNlYXJjaGluZyBmb3IgaXQuCisJKHN5bWZpbGVfZm5zKTogIEltcHJvdmUgY29tbWVudHMsIGFkZCBhIEZJWE1FLgorCSogZGJ4cmVhZC5jOiAgVXBkYXRlIGNvbW1lbnRzIHRvIHJlZmxlY3Qgc3ltZmlsZSBwcm90b2NvbC4KKwkocmVhZF9vZmlsZV9zeW10YWIsIGVuZF9zeW10YWIpOiAgUmV0dXJuIHRoZSBzeW10YWIuCisJKHBzeW10YWJfdG9fc3ltdGFiXzEpOiAgU2V0IHBzdC0+c3ltdGFiLgorCisJKiBjb2ZmcmVhZC5jIChjb2ZmX3N5bWZpbGVfcmVhZCk6ICB0ZWxsIGNvbmRlbnNlX21pc2NfYnVuY2hlcworCXdoZXRoZXIgd2UncmUgbWFpbmxpbmUuCisKKwkqIHN5bWZpbGUuaCAoc3ltX2Zucyk6ICBSZW1vdmUgdW51c2VkIHN5bV9kaXNjYXJkIG1lbWJlci4KKwkqIGNvZmZyZWFkLmMsIG1pcHNyZWFkLmMsIGRieHJlYWQuYzogIFJlbW92ZSBYWFhfc3ltZmlsZV9kaXNjYXJkLgorCisJKiBtdHJhY2UuYyAobXRyYWNlKTogIFRha2UgZWZmZWN0IGlmIG1hbGx3YXRjaCBpcyBzZXQsIGV2ZW4gaWYKKwl0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90LgorCSogaW5mY21kLmMgKGZpbmlzaF9jb21tYW5kKTogIFVzZSBmaWx0ZXJlZCBwcmludGZzLgorCSogY3BsdXMtZGVtLmM6ICBBZGQgc3RydWN0IHRhZ3MgdG8gYSBmZXcgdW5uYW1lZCBzdHJ1Y3RzLgorCSogdmFsb3BzLmMgKHZhbHVlX2NvZXJjZV9hcnJheSk6ICBJbXByb3ZlIGNvbW1lbnRzLgorCSogdmFscHJpbnQuYyAodHlwZV9wcmludF92YXJzcGVjX3N1ZmZpeCk6ICBQcmludCBhcnJheSBzaXplIG9ubHkKKwlpZiBncmVhdGVyIHRoYW4gemVyby4KKwkqIG04OGstdGRlcC5jOiAgU2hpZnQgc29tZSBsaW5lcyBsZWZ0IGJ5IG9uZSBzcGFjZSwgdGhhdCBoYWQKKwlhcHBhcmVudGx5IGJlZW4gdHJhc2hlZCBhdCBzb21lIHBvaW50LgorCSogVE9ETzogIE1vcmUgdGhpbmdzIHRvIGRvLCBhIGZldyBnb3QgZG9uZS4KKworVGh1IEp1bCAxOCAyMjo0NjowNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIHN5bXRhYi5oIChMT0NfRVhURVJOQUwpOiAgRWxpbWluYXRlIGluIGZhdm9yIG9mIExPQ19TVEFUSUMuCisJKGxkc3ltb2ZmLCBsZHN5bWxlbiwgZ2xvYmFsc19vZmZzZXQsIHN0YXRpY3Nfb2Zmc2V0KTogSW1wcm92ZQorCWNvbW1lbnRzLgorCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIpOiAgTE9DX0VYVEVSTkFMIC0+IExPQ19TVEFUSUMuCisJKiBleHByZWFkLnksIGZpbmR2YXIuYywgc3ltbWlzYy5jOiAgRGl0dG8uCisJKiBwcmludGNtZC5jIChhZGRyZXNzX2luZm8pOiAgVXBkYXRlIHByaW50ZWQgZm9ybXMgb2YgTE9DXworCXN5bWJvbHMuICBFbGltIExPQ19FWFRFUk5BTC4gIAorCShwcmludF9mcmFtZV9hcmdzKTogIEtlZXAgdHJhY2sgb2YgcGFyYW0gc3RhY2sgb2Zmc2V0cyBiZWZvcmUKKwlyZS1sb29raW5nIHVwIHRvIGZpbmQgdGhlIGxvY2FsIHJlZ2lzdGVyIHBhcmFtIGlzIGtlcHQgaW4uCisKKwkqIG1pcHNyZWFkLmM6ICBVc2UgPHN5bWNvbnN0Lmg+IGFuZCA8c3ltLmg+IHJhdGhlciB0aGFuIDxzeW1zLmg+LgorCUZ1cnRoZXIgaW50ZWdyYXRpb24gb2YgbWlwc3JlYWQgaW50byBnZGIuICBFbGltaW5hdGUgdW51c2VkCisJcm91dGluZXMsIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMuICBIYW5kbGUgc3RhdGljIHN5bWJvbHMgaW4gCisJcHN5bXRhYnMgYXMgd2VsbCBhcyBleHRlcm5hbCBzeW1ib2xzLiAgV2hlbiByZWFkaW5nIHN5bXRhYnMsCisJaW5zZXJ0IHN5bWJvbHMgaW50byB0aGUgY29ycmVjdCBibG9jayAoZ2xvYmFsLCBzdGF0aWMsIG9yIGEgbG9jYWwKKwlibG9jaykuCisJKHJlYWRfbWlwc19zeW10YWIsIHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6ICBEb24ndCBwYXNzIHVzZWxlc3MKKwkiaW5jcmVtZW50YWwiIGFyZy4KKwkobWlwc2NvZmZfc3ltZmlsZV9yZWFkKTogIERvbid0IGNhbGwgc2VsZWN0X3NvdXJjZV9zeW10YWIuCisJKHBhcnNlX3N5bWJvbCk6ICBVc2UgU1lNQk9MX1ZBTFVFX0FERFJFU1Mgd2hlcmUgYXBwcm9wcmlhdGUsCisJcmF0aGVyIHRoYW4gU1lNQk9MX1ZBTFVFLgorCShwYXJzZV9leHRlcm5hbCk6ICBDb21tZW50IGNsb2JiZXJpbmcgb2YgdG9wX3N0YWNrLgorCShwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiAgVXBkYXRlIGNvbW1lbnRzLiAgQWxsb2NhdGUgYW5kIHBhcnNlCisJc3RhdGljIHN5bWJvbHMgYXMgd2VsbCBhcyBleHRlcm5hbCBzeW1ib2xzLiAgRklYTUUsIGVudW0gdmFsdWVzCisJYXJlIG5vdCBoYW5kbGVkIGluIHRoaXMgcGFzcywgYnV0IHNob3VsZCBiZS4gIElubGluZSBuZXdfcHN5bWJvbC4KKwlVc2UgU1lNQk9MX1ZBTFVFX0FERFJFU1MuCisJKHBzeW10YWJfdG9fc3ltdGFiXzEpOiAgUmVhZCBzeW1ib2xzIGludG8gZ2xvYmFsIHN0YXRpYyBibG9jaworCWJ5IGRlZmF1bHQgKHVudGlsIGVudGVyIHNvbWUgZnVuY3Rpb24ncyBsb2NhbCBibG9jayBjb250ZXh0KS4KKwkoc29ydF9ibG9ja3MpOiAgQ2xlYW4gdXAgU1RBVElDX0JMT0NLIGFzIHdlbGwgYXMgR0xPQkFMX0JMT0NLLgorCShkZXN0cm95X2FsbF9zeW10YWJzLCBuZXdfcHN5bWJvbCk6ICBFbGltaW5hdGUsIHVudXNlZC4KKworCSogc291cmNlLmMgKHNlbGVjdF9zb3VyY2Vfc3ltdGFiKTogIFNlbGVjdCBhIHNvdXJjZSBzeW10YWIKKwlmcm9tIGVpdGhlciB0aGUgc3ltdGFicyBvciwgZmFpbGluZyB0aGF0LCB0aGUgcHN5bXRhYnMuCisJKGxpc3RfY29tbWFuZCk6ICBVcGRhdGUgZXJyb3IgbWVzc2FnZS4KKwkoZm9yd2FyZF9zZWFyY2hfY29tbWFuZCwgcmV2ZXJzZV9zZWFyY2hfY29tbWFuZCk6ICBVc2UgZ2V0Yywgbm90CisJZmdldGMsIGZvciBzcGVlZC4gIEZJWE1FLCBhZGQgY29tbWVudCBhYm91dCBidWZmZXJzIHRoYXQgZGllIGlmCisJb3ZlcnJ1biBieSBsb25nIGxpbmUuCisKKwkqIHZhbHVlcy5jICh1bnBhY2tfZmllbGRfYXNfbG9uZywgbW9kaWZ5X2ZpZWxkKTogIEF2b2lkIHNoaWZ0aW5nCisJYnkgYW4gZW50aXJlIHdvcmQsIHdoaWNoIGlzIG5vdCBwb3J0YWJsZSwgaWYgd2UgaGF2ZSBhIDMyLWJpdAorCWZpZWxkLiAgKENvZGUgaW4gZGJ4cmVhZC5jIGFscmVhZHkgdHVybnMgc3VjaCBiaXRmaWVsZHMsIGlmCisJYWxpZ25lZCwgaW50byBvcmRpbmFyeSBpbnRzLCBidXQgZml4aW5nIHRoaXMgd2lsbCBoZWxwIGZvciBvdGhlcgorCXN5bWJvbCBmb3JtYXRzIGFuZCBmb3IgZnV0dXJlIGNoYW5nZXMuKQorCSogY29yZS5jIChjb3JlX29wZW4pOiAgSGFuZGxlIEFOU0kgY29uc3QgYnJhaW4gZGVhdGguCisJKiB1dGlscy5jICh2cHJpbnRmKTogIEZpeCB2YXJhcmdzIHR5cG8uCisKK1N1biBKdWwgMTQgMDA6NDI6NTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBmaW5kdmFyLmMgKGZpbmRfdmFyX3ZhbHVlKTogIEhhbmRsZSAmZnVuY3Rpb24gYmV0dGVyLgorCSogVE9ETzogIERvY3VtZW50IHdvcmsgbmVlZGVkIG9uICZmbiBhbmQgJmFycmF5LgorCSogcHJpbnRjbWQuYyAocHJpbnRfYWRkcmVzc19zeW1ib2xpYyk6ICBOZXcgYXJnIGlzIHRoZSBwcmVmaXgKKwl0byBwcmludCBpZiBhIG5hbWUgaXMgcHJpbnRlZC4KKwkocHJpbnRfYWRkcmVzc19kZW1hbmdsZSk6ICBIb25vciAic2V0IHByaW50IGFkZHJlc3MiIG5vdy4KKwlVc2UgbmV3IGFyZyBhYm92ZSB0byBpbXByb3ZlIHNwYWNpbmcgb2Ygb3V0cHV0LgorCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogIFdoZW4gcHJpbnRpbmcgZnVuY3Rpb24gcG9pbnRlcnMsCisJcHJpbnQgc3ltYm9saWMgZm9ybSB0b28uCisJKiBicmVha3BvaW50LmMgKGJyZWFrcG9pbnRfMSk6ICBVc2UgbmV3IHByaW50X2FkZHJlc3Nfc3ltYm9saWMuCisKK01vbiBKdWwgIDggMTk6MDI6NDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBjb3JlLmMgKG1lbW9yeV9lcnJvcik6ICBSZXdvcmQgZXJyb3IgbXNnIHRvIG1pc2xlYWQgbGVzcy4KKworCSogbWlwcy1waW5zbi5jIChwcmludF9pbnNuX2FyZyAnZCcpOiAgUHJpbnQgJCB3aXRoIHJlZyBuYW1lLgorCisJKiBtaXBzcmVhZC5jIChyZWFkX21pcHNfc3ltdGFiLCByZWFkX3RoZV9taXBzX3N5bXRhYiwKKwlwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiBVc2UgbmV3ZXIgQkZEIGludGVybmFscyAoZXh0ZXJuYWxfZmlsZWhkcgorCWFuZCBleHRlcm5hbF9hb3V0aGRyKSwgYnl0ZS1zd2FwIHRoZSBmaWVsZHMgdGhhdCB3ZSBjYXJlIGFib3V0CisJYmVmb3JlIHVzaW5nIHRoZW0sIGFuZCBtYWtlIHRoZSBmaWxlIGhlYWRlciBkYXRhIGxvY2FsIHRvCisJcmVhZF90aGVfbWlwc19zeW10YWIgcmF0aGVyIHRoYW4gZ2xvYmFsLgorCitTYXQgSnVsICA2IDAxOjM0OjE1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogbnMzMmstb3Bjb2RlLmggKG1vdm13LCBtb3ZtZCk6ICBGaXggb3Bjb2Rlcy4gIEJ1ZyBmaXgKKwlmcm9tIFJ1bmUgTmVyZ31yZCA8cnVuZW5lQGlmaS51aW8ubm8+IG9uIDUgSnVsIDE5OTEuCisKKwkqIG1haW4uYyAoY29tbWFuZF9saW5lX2lucHV0KTogIEZsdXNoIHN0ZG91dCBhbmQgc3RkZXJyCisJYmVmb3JlIGV2ZXJ5IGNhbGwgdG8gcmVhZGxpbmUuICBUaGlzIHJlcG9ydGVkbHkgZml4ZXMgYSBidWcKKwl0aGF0IGNvbWVzIHVwIGluIFN5cyBWIHJ1bm5pbmcgZW1hY3MtZ2RiIGFuZC9vciB4eGdkYiwKKwl3aGVuIHN0ZGluL291dCBhcmUgcGlwZXMgb3Igc29ja2V0cy4KKworVGh1IEp1bCAgNCAxNDo0NzowNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46ICBBdm9pZCByZWJ1aWxkaW5nICJkZXBlbmQiIGFzIG11Y2guCisJQXZvaWQgZGVjbGFyaW5nIE1ha2VmaWxlIGRlcGVuZGVuY2llcywgYmVjYXVzZSBHTlUgTWFrZSBzdHVwaWRseQorCXRyaWVzIHRvIHVwZGF0ZSBpdCBpZiB3ZSBkby4KKworCSogY29mZnJlYWQuYzogIFJldmlzZSBmb3IgbWlub3IgY2hhbmdlcyB0byBiZmQgaW50ZXJuYWwgY29mZgorCWluZGV4ZXMuCisKKwkqIGNvbmZpZ3VyZTogIElmIC10ZW1wbGF0ZT0gaXMgZ2l2ZW4gYSByZWxhdGl2ZSBwYXRoLCBtYWtlIGl0IAorCWFic29sdXRlIGJlZm9yZSByZWN1cnJpbmcgaW4gc3ViZGlyZWN0b3JpZXMuCisKKwkqIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogIEluc3RhbGwgImNvbmZpZ3VyZSIgc2NyaXB0CisJYXMgcmVwbGFjZW1lbnQgZm9yIGNvbmZpZy5nZGIuCisJKiBjb25maWcuZ2RiLCBNYWtlZmlsZS5kaXN0LCBNYWtlZmlsZS5zZGlyOiAgUmVtb3ZlCisJKiBSRUFETUU6ICBVcGRhdGUgZm9yIGNvbmZpZ3VyZSwgbW9zdGx5LiAgRklYTUUuCisKKwkqIEFkZCBkZWMzMTAwIGFzIGVxdWl2YWxlbnQgdG8gbGl0dGxlbWlwcy4gIEluZGljYXRlIGluIGFsbCBob3N0ICYKKwl0YXJnZXQgY29uZmlnIGZpbGVzIHRoYXQgdGhleSBhcmUgZm9yIHRoZSBob3N0LiAgV2hlbiB0aGUgbGluZXMKKwlnZXQgY29waWVkIGludG8gdGhlIE1ha2VmaWxlLCB0aGlzIG1ha2VzIGl0IG1vcmUgb2J2aW91cyB3aGF0J3MKKwl1cC4KKworTW9uIEp1biAyNCAyMzo0OTowNyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIHNwYXJjLW9wY29kZS5oICh0cmFwIG9wY29kZXMpOiAgQXZvaWQgbGVhZGluZyBzcGFjZXMgb3IKKwl0YWJzLCB3aGljaCBlbmQgdXAgaW4gdGhlIGRpc2Fzc2VtYmxlciBvdXRwdXQgaW5hZHZlcnRlbnRseS4KKworV2VkIE1heSAyOSAyMzowMTowMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwlNYWtlIGl0IGNvbXBpbGUgY2xlYW5seSBpbiBhbiBBTlNJIEdDQzIgZW52aXJvbm1lbnQuCisKKwkqIGJsb2NrZnJhbWUuYzogIDxzdGRpby5oPgorCSogY3BsdXMtZGVtLmM6ICBmcmVlIHRha2VzIGEgdm9pZCAqLCBpZmRlZiBfX1NURENfXworCSogZGJ4cmVhZC5jIChyZWFkX2h1Z2VfbnVtYmVyKTogIGF2b2lkIGdjYzIgYnVnIGhvaXN0aW5nIGNhbGMgb2YKKwlMT05HX01BWC9yYWRpeC4KKwkqIGRlZnMuaCAoYWxsb2NhKTogIEF2b2lkIGRvaW5nIGFueXRoaW5nIGlmIGFsbG9jYSBhbHJlYWR5IGRlZidkLgorCSogc3RkZGVmLmgsIHN0ZGxpYi5oOiAgUmVtb3ZlIHRoZXNlIGZpbGVzLgorCSogc3ltdGFiLmM6ICBBdm9pZCBkZWNsYXJpbmcgcXNvcnQsIGNsb3NlLgorCSogc3ltZmlsZS5jOiAgQXZvaWQgZGVjbGFyaW5nIGNsb3NlLgorCSogdXRpbHMuYyAodnByaW50Zik6ICBEZWNsYXJlICJhcCIgYXJnIGFzIHByb3BlciB2YV9hbGlzdC4JCisJKiBzcGFyYy10ZGVwLmM6ICBBdm9pZCBpbmNsdWRpbmcgbG90cyBvZiBTdW4taG9zdC1zcGVjaWZpYyBmaWxlcy4KKworCUFzc29ydGVkIG90aGVyIGNoYW5nZXMuCisJKiBkYnhyZWFkLmM6ICBpbmNsdWRlICJsaWJhb3V0LmgiLCBub3QgImxpYmEub3V0LmgiLgorCSogcHJpbnRjbWQuYyAocHJpbnRfZnJhbWVfYXJncyk6ICBTZXQgcmVjdXJzZSBwcm9wZXJseSBmb3IKKwlpbmRlbnRhdGlvbiBvZiBzdHJ1Y3QgYW5kIGFycmF5IHBhcmFtZXRlcnMuCisJKiB2YWxvcHMuYyAodmFsdWVfY2FzdCk6ICBBbGxvdyBjYXN0IHRvIHZvaWQuCisJKiBpbmZydW4uYyAocmVzdW1lKTogIElmIE5PX1NJTkdMRV9TVEVQLCBjYWxsIG1hY2hpbmUgZGVwZW5kZW50CisJc2luZ2xlX3N0ZXAoKSBpbiBhIHRhcmdldC1pbmRlcGVuZGVudCBmYXNoaW9uLgorCSogc3BhcmMtdGRlcC5jIChzaW5nbGVfc3RlcCk6ICBEb24ndCBjYWxsIHB0cmFjZSBvdXJzZWx2ZXMsIGp1c3QKKwlzZXQgdXAgdG8gYmUgcmVhZHkgdG8gY29udGludWUuICBUaGlzIG1ha2VzIHVzIHRhcmdldCBpbmRlcGVuZGVudC4KKwkqIGluZnB0cmFjZS5jIChjaGlsZF9yZXN1bWUpOiAgUmVtb3ZlIGNhbGwgdG8gc2luZ2xlX3N0ZXA7IG5vdworCWNhbiBzaW5nbGUgc3RlcCBhIFNQQVJDIHRhcmdldCBvZiBhbnkga2luZC4KKworV2VkIE1heSAyMiAxODoxODoyNCAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5kaXN0LCBkb2MvZ2RiLnRleGluZm8sIGRvYy8qLW00LnRleGluZm86IHNwbGl0IHVwIEdEQgorCWRvY24gaW50byBzZXBhcmF0ZSBzZWN0aW9ucy0tLWJhc2ljYWxseSBjaGFwdGVycywgcGx1cyB0d28gbG9vc2UKKwlwaWVjZXMgdGhhdCBjYW4gYmUgY29uZmlndXJlZCB0byBnbyBpbiBkaWZmZXJlbnQgcGxhY2VzLiAgVGhpcworCWFsbG93cyBHTlUgbTQgdG8gcHJlcHJvY2VzcyB0aGUgbWFudWFsIHdpdGhvdXQgY29yZWR1bXBpbmcuCisKKwkqIE1ha2VmaWxlLmRpc3Q6IHRlbGwgVGVYIHdoZXJlIHRvIGZpbmQgdGV4aW5mby4KKworTW9uIE1heSAyMCAxMjoxNTowNCAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5kaXN0LCBkb2MvZ2RiLnRleGluZm86IHJlc3BlY3RpdmVseSBjcmVhdGUsIGFuZCB1c2UsCisJdGhlIG5ldyB0YXJnZXQgInJkbC1hcHBzLnRleGluZm8iIHdoaWNoIGNhcHR1cmVzIHRoZSBNYWtlZmlsZQorCXZhcmlhYmxlIHRoYXQgcmVjb3JkcyB3aGVyZSB0byBmaW5kIHRoZSBSZWFkbGluZSBsaWJyYXJpZXMuCisKK1N1biBNYXkgMTkgMDU6MzY6NTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiB0YWhvZS1waW5zbi5jOiAgI2luY2x1ZGUgInRhaG9lLW9wY29kZS5oIiwgbm90ICJvcGNvZGUuaCIuCisJKiB0bS10YWhvZS5oIChGSVhfQ0FMTF9EVU1NWSk6ICBJZ25vcmUgbW9yZSBwYXJhbWV0ZXJzLgorCSogZGVmcy5oIChjb25zdCwgdm9sYXRpbGUpOiAgT25seSBkZWZpbmUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KKwkqIE1ha2VmaWxlLmRpc3QgKGdkYi50YXIuWik6ICBDcmVhdGUgZG9jIHN1YmRpciB3L291dCBDVlMvUkNTIGNydWQuCisKKwkqIFJFQURNRTogIFVwZGF0ZSBmb3IgcmVsZWFzZSAzLjk1LgorCSogY29uZmlnLmdkYjogIERvbid0IGNyZWF0ZSByZWFkbGluZSBkaXIgaW4gc3ViZGlyIGJ1aWxkcy4KKwkqIG1haW4uYzogIEluY2x1ZGUgd2l0aCAiLi4uIiBmb3JtIGZvciBub24tc3lzdGVtIGluY2x1ZGUgZmlsZXMsCisJc28gImdjYyAtTU0iIGZvciAibWFrZSBkZXBlbmQiIHdvcmtzLgorCUluY2x1ZGUgcmVhZGxpbmUgZmlsZXMgd2l0aCAiLi4uaCIgcmF0aGVyIHRoYW4gPHJlYWRsaW5lLy4uLmg+LgorCSogbWlwc3JlYWQuYzogIEluY2x1ZGUgImVjb2ZmLmgiIHJhdGhlciB0aGFuICJpbnRlbC1jb2ZmLmgiLgorCisJKiBjb2ZmcmVhZC5jOiAgVW5kbyBtaW5vciBkYW1hZ2UgZG9uZSBieSBSaWNoIFBpeGxleS4gIFVzZQorCWRpZmZlcmVudCBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zIG9mIENPRkYKKwlkYXRhIHN0cnVjdHVyZXMuICBVc2UgbmV3IEJGRCByb3V0aW5lcyBmb3Igc3dhcHBpbmcgdGhlbSBpbiBhbmQKKwlvdXQuCisJKiBzeW1maWxlLmMgKGZyZWVfbmFtZWRfc3ltdGFicyk6ICBBdm9pZCBmcmVlaW5nIGZpbGUgbmFtZXMgdGhhdAorCWFyZSBudWxsIG9yIGVtcHR5LiAgT2xkIGk5NjAgdG9vbHMgc2VlbSB0byBwcm9kdWNlIGZpbGVzIHRoYXQKKwljbGFpbSB0byBoYXZlIGVtcHR5IG5hbWVzLCBjYXVzaW5nIGVhY2ggc3VjY2Vzc2l2ZSBmaWxlIHJlYWQKKwl0byBibG93IGF3YXkgdGhlIHByZXZpb3VzIG9uZS4KKwkqIHNwYXJjLXhkZXAuYyAoZGVmZXJyZWRfc3RvcmVzKTogIFJlcGFpciBtaW5vciBkYW1hZ2UgYnkgUmljaC4KKwlNb3ZlIGRlZmVycmVkX3N0b3JlcyB0byB0b3Agb2YgZmlsZSwgYnV0IGRvbid0IHNlcGFyYXRlIGl0cworCSNkZWZpbmUncyBmcm9tIGl0cyB2YXJpYWJsZS4gIEFkZCBjb21tZW50YXJ5LgorCSogTWFrZWZpbGUuZGlzdDogIEZpeCBSaWNoIGRhbWFnZTsgdW5kbyAiY29uZmlndXJlIiBjaGFuZ2VzIGluCisJZmF2b3Igb2Yga2VlcGluZyB0aGUgKHdvcmtpbmcpIGNvbmZpZy5nZGIuICBNb3ZlIHJlYWRsaW5lCisJbGlicmFyeSB1cCBhIG5vdGNoLgorCitGcmkgTWF5IDE3IDEyOjQ5OjU2IDE5OTEgIFBlciBCb3RobmVyICAodmlhIGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogZGJ4cmVhZC5jIChyZWFkX3N0cnVjdF90eXBlKTogIFRyeSB0byBoYW5kbGUgZysrIHZlcnNpb24gMSBNSQorCWRlYnVnIGluZm8uCisJKiBpbmZwdHJhY2UuYyAoZmV0Y2hfcmVnaXN0ZXJzKTogIG5vIHJlc3VsdCwgc2luY2Ugbm93IHZvaWQuCisJKiB0Y29uZmlnL25ld3M6ICB0YXJnZXQgZGVwZW5kcyBvbiBtNjhrLXRkZXAgdG9vLgorCitGcmkgTWF5IDE3IDE0OjQwOjE0IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmRpc3Q6IGFkZGVkIHJlYWRsaW5lL2luYy0qLnRleGluZm8gdG8gZGVwZW5kZW5jaWVzIGZvcgorCWdkYi5kdmkgdGFyZ2V0CisKKwkqIHJlYWRsaW5lL2luYy1oaXN0b3J5LnRleGluZm8sIHJlYWRsaW5lL2luYy1yZWFkbGluZS50ZXhpbmZvOgorCWFwcGxpZWQgdmFyaW91cyBzbWFsbCBmaXhlcyBkdWUgdG8gb3IgaW5zcGlyZWQgYnkgUk1TIGNvbW1lbnRzCisKKwkqIGRvYy9nZGIudGV4aW5mbzogZmluaXNoZWQgdXNpbmcgYWxsIFJNUyBjb21tZW50cywgc2F2ZSB0aG9zZSBmb3IKKwlhcHBlbmRpY2VzIG9uIHJlYWRsaW5lIGFuZCBjbWQgaGlzdG9yeSAod2hpY2ggYXJlIGluIG90aGVyIHNvdXJjZQorCWZpbGVzKSAKKworVGh1IE1heSAxNiAxODowNjowNSAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBkb2MvZ2RiLnRleGluZm86ICgxKSBVcGRhdGVkIHcvcmVmIHRvIFJNUyBjb21tZW50cyB0aHJvdWdoCisJY2hhcHRlciA5OyAoMikgZG9jdW1lbnRlZCAnYnJlYWsnIGNvbW1hbmQncyBtZW51IG1vZGUgZm9yCisJb3ZlcmxvYWRlZCBuYW1lcywgaW4gcmVzcG9uc2UgdG8gaGdzIHByb2JsZW0gcmVwb3J0IEMrKyBwLTMxCisKK1dlZCBNYXkgMTUgMTE6MDI6NDggMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgZm93YW50b24uY3lnbnVzLmNvbSkKKworCSogZG9jL2dkYi50ZXhpbmZvOiAoMSkgYmV0dGVyIGludHJvZHVjdG9yeSBleGFtcGxlOyAoMikgbW9yZQorCWNvbnNpc3RlbnQgdXNlIG9mIEBjb2RlLCBAc2FtcCwgQGZpbGUsIEBrYmQgdGhyb3VnaG91dDsgc21hbGwKKwljbGVhbnVwcyB0byBmaXJzdCB0aHJlZSBub2RlczsgKDMpIG5ldyAiQ29udHJpYnV0b3JzIiBub2RlOworCSg0KSBBcHBlbmRpeCwgUmVuYW1lZCBDb21tYW5kczsgKDUpIGRpdmVydCBzcGVjaWFsaXplZCBzdGFydHVwCisJaW5zdHJ1Y3Rpb25zIHRvICJUYXJnZXRzIiBjaGFwdGVyIGZvciBnZW5lcmljIG1hbnVhbHMsIHdoaWxlCisJbGVhdmluZyB0aGVtIHVwIGZyb250IGZvciBtYW51YWxzIHNwZWNpZmljIHRvIHNwZWNpYWxpemVkCisJZW52aXJvbm1lbnRzOyAoNikgYXBwbHkgZml4ZXMgZnJvbSBSTVMgY29tbWVudHMgdGhyb3VnaCBjaGFwdGVyIDQuCisKKwkqIHByZXRleC5tNDogbW9kaWZ5IGV4cGxhbmF0b3J5IHRleHQgc2xpZ2h0bHkgKGFuZCByZWRlZmluZQorCSJyZWdleHAiKSB0byBrZWVwIEdOVSBtNCBmcm9tIGNvbXBsYWluaW5nLiAgKEl0IHN0aWxsIGNyYXNoZXMKKwlsYXRlciwgYnV0IG9uZSBzdGVwIGF0IGEgdGltZS4uLikKKworV2VkIE1heSAxNSAxMDozMjoxMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIHJlYWRsaW5lL3JlYWRsaW5lLmMgKHVwZGF0ZV9saW5lKTogIEF2b2lkIGRlcmVmZXJlbmNpbmcgYSBwb2ludGVyCisJYmVmb3JlIGNvbXBhcmluZyBpdCB0byBpdHMgYm91bmRzLiAgU2FiZXIgY2F1Z2h0IHRoaXMuCisJKGluaXRfdGVybWluYWxfaW8pOiAgRG9uJ3Qgc2V0IEJDIGZyb20gdGhlICJwYz0iIHRlcm1jYXAgdmFyaWFibGUsCisJYW5kIG9ubHkgc2V0IFBDIGlmIHRnZXRzdHIgcmV0dXJuZWQgbm9uLW51bGwuICBTYWJlciBjYXVnaHQgdGhpcy4KKworVHVlIE1heSAxNCAxNjoyOTo1MyBQRFQgMTk5MSAgUm9sYW5kIFBlc2NoIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuZGlzdDogcHV0IGdkYi5kdmkgc3R1ZmYgKHVwZGF0ZWQgdG8gdXNlIE00IHByZXByb2Nlc3NvcgorCXN0dWZmIGZvciBjb25maWcgbWFudWFsKSBoZXJlIHdoZXJlIGl0IGNvdW50czsgdXBkYXRlZAorCXRvIHVzZSBuZXcgc3ViZGlyIHN0cnVjdHVyZSAoZ2RiL2RvYy8pLgorCisJKiBNYWtlZmlsZTogZ2VuZXJhdGVkIGZyb20gYWJvdmUgdmlhIAorCQkgICAgY29uZmlnLmdkYiBub25lIAorCWJlZm9yZSBjaGVja2luCisKKwkqIGdkYmludC50ZXhpbmZvOiBhZGRlZCBpbnN0cnVjdGlvbnMgb24gZ2VuZXJhdGluZyBnZGIuaW5mbyogZmlsZXMKKwlsb2NhbGx5IGZvciByZWxlYXNlLiAgVGhlc2UgYXJlIG9yZGluYXJ5IGluZm8KKwlmaWxlcywgZm9ybWF0dGVkIGZyb20gZ2RiLnRleGluZm8gKHZpYSBnZGItYWxsLnRleGluZm8sIHNlZQorCU1ha2VmaWxlKS0tLWJ1dCBkdWUgdG8gdXNlIG9mIHRleGluZm8gMiwgY2FuJ3QgY291bnQgb24gbWFrZWluZm8KKwl0byBnZW5lcmF0ZSB0aGVzZSwgc28gd2UgZGlzdHJpYnV0ZSB0aGVtIGFscmVhZHkgZm9ybWF0dGVkLgorCisJKiBnZGIudGV4aW5mbzogaW5jbHVkZWQgZnVsbCBJbmZvIG5vZGUgYW5kIG1lbnUgY3J1ZCAoYXMgZ2VuZXJhdGVkCisJYnkgQy11IE0teCB0ZXhpbmZvLW1hc3Rlci1tZW51IHVzaW5nIHRoZSB0ZXhpbmZvLTIgZWxpc3AgY29kZSkuCisKKwkqIE1ha2VmaWxlOiB1cGRhdGVkICJnZGIuZHZpIiB0YXJnZXQgdG8gdXNlIE00IHByZXByb2Nlc3NvcjsKKwlwdXQgaW4gY29tbWVudHMtZm9yLWZ1dHVyZSBnZGIuaW5mbyB0YXJnZXQgKG9uZSBkYXkgbWFrZWluZm8gd2lsbAorCXdvcmsgYWdhaW4pLgorCitUdWUgTWF5IDE0IDEzOjUxOjM2IFBEVCAxOTkxICBSb2xhbmQgUGVzY2ggKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbzogVXBkYXRlZCB0byBpbmNsdWRlIG5ldyBvciBvbGQgdW5kb2N1bWVudGVkCisJY29tbWFuZHMsIGF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgKHBlcmhhcHMgc29tZSBvdGhlcnMgSSBmb3Jnb3QgdG8KKwlyZWNvcmQpOiBpbmZvIGYsIGluZm8gZmxvYXQsIGluZm8gcGF0aCwgaW5mbyBwcm9ncmFtLCBpbmZvIHMsIGluZm8KKwlzZXQsIGluZm8gc291cmNlLCBpbmZvIHRlcm1pbmFsLCBpbmZvIHR5cGVzLCBpbmZvIHVzZXIsIHNldC9zaG93CisJcHJpbnQgb2JqZWN0LiAgCisJQWxzbyBjb3ZlcmVkIGFsbCByZWNlbnQgR0RCIGNvbW1hbmQgcmVuYW1lcyBmb3IgdjQuCisKK01vbiBNYXkgMTMgMTQ6NTc6NDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBtaXBzcmVhZC5jOiAgUmF0aGVyIHRoYW4ga2VlcGluZyBjb3VudCBvZiBob3cgbWFueSBzeW10YWJzCisJYW5kIHBzeW10YWJzIHdlIGhhdmUsIGZvciBzb3J0aW5nIHB1cnBvc2VzLCBjb3VudCB0aGVtIHdoZW4KKwl3ZSBuZWVkIHRvIHNvcnQuICBUaGlzIGZpeGVzIGJ1ZyBpbiByZXJlYWRpbmcgb2Ygc3ltYm9sIHRhYmxlcy4KKworRnJpIE1heSAxMCAxNTo0MzozMyBQRFQgMTk5MSAgUm9sYW5kIFBlc2NoIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogaW5mY21kLmM6IHJlbmFtZWQgImluZm8gcGF0aCIgdG8gInNob3cgcGF0aHMiCisgICAgICAgICogZ2RicmMudGV4OiBkb2N1bWVudGVkIGFib3ZlLgorCitXZWQgTWF5ICA4IDA0OjUxOjExIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLmM6ICBGaXggY29tbWVudHMuCisJKiB1dGlscy5jIChlcnJvcik6ICBGb3JjZSBvdXQgYW55IHBlbmRpbmcgd3JhcCBvdXRwdXQuCisKK1NhdCBNYXkgIDQgMTE6MTE6MDcgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5kaXN0OiAgUm9sbCBWRVJTSU9OIHRvIDMuOTUuCisJRml4IHVwICJzYWJlcl9nZGIiIHRvIHdvcmsgYWdhaW4uCisJKiBzYWJlci5zdXBwcmVzczogIFVwZGF0ZS4KKworCSogY29mZnJlYWQuYywgZXhlYy5jLCBpbmZwdHJhY2UuYywgaW5mdGFyZy5jLCByZW1vdGUuYywgc29saWIuYywKKwlzeW10YWIuaCwgdGFyZ2V0LmMsIHRhcmdldC5oOiAgTGludC4KKwkqIGNvcmUuYzogIHNldHVwIGFuZCBzZWxlY3QgZnJhbWUgYWZ0ZXIgcmVhZGluZyBzaGFyZWQgbGlicywKKwllbHNlIHJlYWRpbmcgc2hhcmVkIGxpYnMgd2lsbCBjbG9iYmVyIHRoZW0uICBMaW50LgorCSogdXRpbHMuYyAoZXJyb3IpOiAgRm9yY2Ugb3V0IGFueSBidWZmZXJlZCB3cmFwIHRleHQuCisKK0ZyaSBNYXkgIDMgMjI6MDE6NTYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiByZW1vdGUuYzogIFJlbW92ZSBkZWNscyBvZiBtZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQKKwlhbmQgbWVtb3J5X3JlbW92ZV9icmVha3BvaW50LCBubyBsb25nZXIgdXNlZC4gIChTdWdnZXN0aW9uIG9mCisJSmFuIE5vcmRlbikuCisKKwkqIE1ha2VmaWxlLmRpc3Q6ICB1c2UgJHtzdWJkaXJ9IGluIHBhdGhzIG9mIEJGRCBhbmQgTElCSUJFUlRZLAorCXRvIG1ha2UgaXQgZWFzaWVyIHRvIGludGVyZmFjZSB0byAiY29uZmlndXJlIidkIGxpYnJhcmllcy4KKworRnJpIE1heSAgMyAxMzoxMDowMSBQRFQgMTk5MSAgUm9sYW5kIFBlc2NoIChwZXNjaCBhdCBmb3dhbnRvbi5jeWdudXMuY29tKQorCisgICAgICAgICogdmFscHJpbnQuYzogIGludHJvZHVjZSAic2V0IHAiLCAic2V0IHByIiwgInNob3cgcCIgYW5kICJzaG93IHByIiBhcworCWFsaWFzZXMgZm9yIHNldC9zaG93IHByaW50LgorCitUaHUgTWF5ICAyIDExOjIyOjAyIDE5OTEgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogY29mZnJlYWQuYyAoY29mZl9zeW1fZm5zKSBbVERFU0NdOiBNYWtlIHRoZSB0eXBlIGJlIG04OGtiY3MuCisKKwkqIG04OGstdGRlcC5jIChJRUVFX2lzTkFOKTogTmV3IGZ1bmN0aW9uLgorCisJKiBpbmZydW4uYywgbTg4ay10ZGVwLmMsIG04OGsteGRlcC5jOiBDaGFuZ2UKKwlpbml0aWFsaXplX3t0ZGVzYyxkY29udGV4dH0gdG8gaW5pdF97dGRlc2MsZGNvbnRleHR9LgorCisJKiBpbmZydW4uYyBbVERFU0NdOiBBZGQgYSBidW5jaCBvZiBjcnVkLgorCisJKiB4bS04OGsuaCBbX19HTlVDX19dOiBEb24ndCBkZWZpbmUgbWVtc2V0LgorCisJKiBtODhrLXhkZXAuYzogI2lmIDAgb3V0IHB1c2hfYnJlYWtwb2ludC4KKworCSogdG0tODhrLmg6IERlZmluZSBHRVRfU0FWRURfUkVHSVNURVIuCisKKwkqIHRtLTg4ay5oOiBEZWZpbmUgREdVWC4KKworCSogbTg4ay1vcGNvZGUuaCAoVUVYVCwgU0VYVCwgTUFLRSk6IFB1dCBwYXJlbnRoZXNlcyBhcm91bmQgYXJndW1lbnRzLgorCisJKiBtODhrLXBpbnNuLmMgKHNwcmludF9hZGRyZXNzKTogRGVjbGFyZSBhdCB0b3Agb2YgZmlsZS4KKworCSogbTg4ay14ZGVwLmM6ICNpZiAwIG91dCBjb3JlX2ZpbGVfY29tbWFuZC4KKworCSogdmFsdWVzLmMgKHt1bnBhY2tfLHZhbHVlX2FzX31wb2ludGVyKTogSnVzdCBjYWxsCisJe3VucGFja18sdmFsdWVfYXNffWxvbmcgKGZvciBub3cgYW55d2F5KS4KKworCSogbTg4ay10ZGVwLmMgKGdldF9zYXZlZF9yZWdpc3Rlcik6IE1ha2UgZ2V0X3JlZyBhIGRjX3dvcmRfdCAoKikoKS4KKwkocHNyX3JlZ2lzdGVyKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGRjX3dvcmRfdC4KKworCSogbTg4ay10ZGVwLmMgKHRkZXNjX3JlYWRfZnVuY3Rpb24pOiBDb21tZW50IG91dCBjYWxsIHRvIHB0cmFjZS4KKworCSogbTg4ay10ZGVwLmMgKGdldF9zYXZlZF9yZWdpc3Rlcik6IEFkZCBsdmFscCBwYXJhbWV0ZXIuCisKKwkqIGdkYmNvcmUuaCAod3JpdGVfbWVtb3J5KTogRG9uJ3QgcHJvdG90eXBlIGl0LgorCisJKiB0bS04OGsuaCwgbTg4ay10ZGVwLmM6IE1ha2Ugc3RhY2tfZXJyb3IsIHN0YWNrX2ptcCBnbG9iYWwuCisJbTg4ay14ZGVwLmM6IERvbid0IG1lbnRpb24gc3RhY2tfZXJyb3IuCisKKwkqIHt4LHR9Y29uZmlnL204OGsgKHtYLFR9REVQRklMRVMpOiBBZGQgbWlzc2luZyBmaWxlcy4KKworCSogbXRyYWNlLmM6IERvbid0IHR5cGVkZWYgdGhpbmdzIGxpa2Ugc2l6ZV90LCBqdXN0ICNkZWZpbmUgdGhlbS4KKworCSogY29mZnJlYWQuYyBbVERFU0NdOiAjaWYgMCBvdXQgcmVmZXJlbmNlcyB0byBjb2Zmc3luLgorCisJKiBzeW10YWIuaCAoc3RydWN0IHN5bXRhYik6IEluY2x1ZGUgRVhUUkFfU1lNVEFCX0lORk8uCisJdG0tODhrLmg6IERlZmluZSBFWFRSQV9TWU1UQUJfSU5GTy4KKworCSogY29mZnJlYWQuYyBbVERFU0NdOiBJbmNsdWRlICJ0ZGVzYy5oIiBhbmQgbWFrZSB0ZGVzY19oYW5kbGUKKwlkY19kY29udGV4dF90IG5vdCBpbnQuCisKKwkqIGNvZmZyZWFkLmMgW1RERVNDXTogVXNlIHN5c3RlbSBpbmNsdWRlIGZpbGVzIG5vdCA8aW50ZWwtY29mZi5oPi4KKworCSogY29mZnJlYWQuYyBbVERFU0NdOiBNb3ZlIHNldHRpbmcgb2YgZGVidWdfaW5mbyBmcm9tCisJY29mZl9zeW1maWxlX3JlYWQgdG8gZmluZF9saW5lbm9zIGFuZCBtYWtlIGl0IHdvcmsgd2l0aCBCRkQuCisKKwkqIGNwbHVzLWRlbS5jIFtfX1NURENfX106IE1ha2UgeHttLHJlfWFsbG9jIHJldHVybiB2b2lkKi4KKworCSogc2lnbmFtZS5jOiBDYXN0IGNvbnN0IGNoYXIqIHRvIGNoYXIqIHdoZW4gYXNzaWduaW5nIHRvIHN5c19zaWdsaXN0LgorCisJKiB1dGlscy5jIChzdHJzYXZlKTogTWFrZSBhcmcgY29uc3QgY2hhciogbm90IGNoYXIqLgorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpIFtTSElGVF9JTlNOX1JFR1NdOiBVc2UKKwlicHN0YXRfZXhwbGFpbnNfc2lnbmFsIChzdG9wX2Jwc3RhdCkgbm90IHN0b3BfYnJlYWtwb2ludC4KKworCSogdG0tODhrLmggKFNUQVJUX0lORkVSSU9SX0hPT0spOiBNYWtlIHRkZXNjX2hhbmRsZSBhIGRjX2hhbmRsZV90LgorCisJKiB0bS04OGsuaCAoRVhUUkFDVF9SRVRVUk5fVkFMVUUpOiBVc2UgY2hhciAqIG5vdCB2b2lkICouCisKKwkqIGZpbmR2YXIuYyAocmVhZF92YXJfdmFsdWUsIGNhc2UgTE9DX0NPTlNUX0JZVEVTKTogUHV0IHRoZSBhZGRyZXNzCisJaW4gYSBjaGFyICosIG5vdCBhIENPUkVfQUREUi4gIFVzZSBTWU1CT0xfVkFMVUVfQllURVMuCisKKwkqIHRtLTg4ay5oIChJTklUX0VYVFJBX0ZSQU1FX0lORk8pOiBVc2UgZmNpIG5vdCBwcmV2IChmY2kgaXMKKwlwcmV2IGV4Y2VwdCBmcm9tIGNyZWF0ZV9uZXdfZnJhbWUpLiAgTWFrZSBuZXh0X2ZyYW1lIGEKKwlsb2NhbCB2YXJpYWJsZS4KKwlEZWNsYXJlIGdldF9wcmV2X2NvbnRleHQuCisJe3gsdH1tLTg4ay5oOiBFbmNsb3NlIFVTRyBhbmQgQkNTIGRlZmluZXMgaW4gI2lmICFkZWZpbmVkLgorCW04OGste29wY29kZS5oLHBpbnNuLmMseGRlcC5jLHRkZXAuY306IE5ldyBmaWxlcyAoc2FtZSBjb250ZW50cyBhcworCWJlZm9yZTsgdGhleSBoYWQganVzdCBiZWVuIGxlZnQgb3V0IG9mIHRoZSBkaXN0cmlidXRpb24gZm9yIGEgbG9uZworCXRpbWUpLgorCitUaHUgTWF5ICAyIDE3OjUzOjU2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCU1pcHMgYnJpbmd1cCBhbmQgZ2VuZXJhbCBjbGVhbnVwCisKKwkqIGNwbHVzLWRlbS5jOiAgTW92ZSBDUExVU19NQVJLRVIgZGVmaW5lIHRvIGFmdGVyIGRlZnMuaC4KKwkqIGluZnB0cmFjZS5jIChQVF9XUklURV9ELCBQVF9SRUFEX0QpOiAgVXNlIGNvcnJlY3QgdmFsdWVzLgorCShUaGlzIHN0aWxsIGRvZXNuJ3Qgc2VlbSB0byBtYWtlIE1JUFMgYmtwdHMgd29yay4pCisJKiBtaXBzcmVhZC5jOiAgUmVtb3ZlIGR1cCAiUmVhZGluZyBzeW1ib2wgZGF0YS4uLiIgbXNnLgorCShzeW1ib2xfZmlsZV9jb21tYW5kLCBhZGRfZmlsZV9jb21tYW5kKTogIFJlbW92ZSwgb2Jzb2wuCisJKiBwcmludGNtZC5jIChwdHlwZV9jb21tYW5kKTogIFNheSAiYW4gZW51bSIgcmF0aGVyIHRoYW4gImEgZW51bSIuCisJV3JhcCBvdXRwdXQgYXBwcm9wcmlhdGVseS4KKwkqIHN0YWNrLmMgKGxvY2Fsc19pbmZvLCBjYXRjaF9pbmZvLCBhcmdzX2luZm8pOiAgQ2hlY2sKKwlzZWxlY3RlZF9mcmFtZSByYXRoZXIgdGhhbiB0YXJnZXRfaGFzX3N0YWNrIG9yIGNvcmVkdW1waW5nLgorCSogdmFscHJpbnQuYyAodHlwZV9wcmludF92YXJzcGVjX3N1ZmZpeCk6ICBXcmFwICJwdHlwZSIgb3V0cHV0IG9mCisJZW51bXMgYXBwcm9wcmlhdGVseS4KKworV2VkIE1heSAgMSAxNDoxMDoyMiAxOTkxICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIHNpZ25hbWUuYzogSW5jbHVkZSBkZWZzLmggYW5kIHBhcmFtLmguCisKKwkqIGNwbHVzLWRlbS5jOiBJbmNsdWRlIGRlZnMuaCBhbmQgcGFyYW0uaC4KKwlNYWtlZmlsZS5kaXN0OiBEb24ndCBoYWNrIGluIHRoZSAicGFyYW0uaCIuCisJcGFyYW0uaDogRG9uJ3QgaW5jbHVkZSBkZWZzLmguCisKKwkqIGV4cHJlYWQueTogVXNlIGEgdW5pb24gdG8gZGVhbCB3aXRoIHRoZSBmYWN0IHRoYXQgdHlwZV9zdGFjaworCWNhbiBoYXZlIGJvdGggaW50cyBhbmQgZW51bSB0eXBlX3BpZWNlcyBpbiBpdC4KKwkoe3B1c2gscG9wfV90eXBlX2ludCk6IE5ldyBmdW5jdGlvbnMuCisKK1R1ZSBBcHIgMzAgMTM6MTg6NTggMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBjcGx1cy1kZW0uYyAoY3BsdXNfbWFuZ2xlX29wbmFtZSk6IERvbid0IGNhbGwgZXJyb3IuCisJdmFsdWVzLmMgKGNoZWNrX3N0dWJfbWV0aG9kKTogQ2FsbCBlcnJvciBpZiBOVUxMIHJldHVybiBmcm9tCisJY3BsdXNfbWFuZ2xlX29wbmFtZS4KKworCSogYmxvY2tmcmFtZS5jLCBicmVha3BvaW50LmMsIGNvcmUuYywgY29tbWFuZC5jLCBmaW5kdmFyLmMsCisJZXZhbC5jLCBleHBwcmludC5jLCBpbmZjbWQuYywgaW5mcnVuLmMsIG1haW4uYywgcHJpbnRjbWQuYywKKwlyZW1vdGUuYywgc291cmNlLmMsIHN0YWNrLmMsIGRieHJlYWQuYywgY29mZnJlYWQuYywgc3ltZmlsZS5oLAorCXN5bWZpbGUuYywgdXRpbHMuYywgdmFsYXJpdGguYywgdmFsdWVzLmMsIHZhbG9wcy5jLCB0bS02OGsuaCwKKwl0YXJnZXQuYywgaW5mdGFyZy5jLCBpZWVlLWZsb2F0LmMsIGVudmlyb24uYywgZGVmcy5oLAorCWNvbW1hbmQuaCwgaW5mZXJpb3IuaCwgZ2RiY29yZS5oLCBzeW10YWIuaCwgZXhwcmVzc2lvbi5oLAorCXN5bXRhYi5jLCBjcGx1cy1kZW0uYywgdmFsdWUuaCwgZXhwcmVhZC55LCB2YWxwcmludC5jLAorCWNvcHlpbmcuYXdrLCBzb2xpYi5jLCBpbmZsb3cuYywgc3ltbWlzYy5jCisJOiBMaW50LiAgVXNlIHJlYWRfbWVtb3J5IG5vdCByZWFkX21lbW9yeV9pbnRlZ2VyIG9uIENPUkVfQUREUidzLgorCVVzZSB7dmFsdWVfYXMsdW5wYWNrfV9wb2ludGVyIChhZGRlZCB0byB2YWx1ZXMuYykKKwlub3Qge3ZhbHVlX2FzLHVucGFja31fbG9uZyBvbiBDT1JFX0FERFIncy4KKwlVc2UgbG9uZ2VzdF90b19pbnQgKGFkZGVkIHRvIGRlZnMuaCkgaW5zdGVhZCBvZiBjYXN0IHRvIGludC4KKwlSZW1vdmUgZnJvbV90dHkgYXJnIHRvIG1vZF9wYXRoLgorCVB1dCBzeW1maWxlX2JmZCBpbiB7Y29mZixkYnh9cmVhZC5jIG5vdCBzeW1maWxlLmguCisJVXNlIE9QX05VTEwgaW5zdGVhZCBvZiAwIHdoZXJlIGR1bW15IGVudW0gZXhwX29wY29kZSBuZWVkZWQuCisKKwkqIHRtLXNwYXJjLmg6IFJlbW92ZSBHRVRfUldJTkRPV19SRUcuCisJKEZSQU1FX0NIQUlOKTogQ2FsbCBzcGFyY19mcmFtZV9jaGFpbi4KKwlzcGFyYy10ZGVwLmMgKHNwYXJjX2ZyYW1lX2NoYWluKTogTmV3IGZ1bmN0aW9uLgorCXRtLXNwYXJjLmggKEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MpOiBjYWxsCisJc3BhcmNfZXh0cmFjdF9zdHJ1Y3RfdmFsdWVfYWRkcmVzcyAoYWRkZWQgdG8gc3BhcmMtdGRlcC5jKS4KKworCSogeG0tc3VuMzg2Lmg6IERvbid0IGRlZmluZSBTRVRfU1RBQ0tfTElNSVRfSFVHRS4KKworVHVlIEFwciAzMCAxMzoxMzozMyAxOTkxICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiB2YWxwcmludC5jICh0eXBlX3ByaW50X2Jhc2UpOiBJZiB0aGUgdHlwZSBiZWluZyBwcmludGVkIGlzIGEKKwlzdHJ1Y3QgY29udGFpbmluZyB1bmRlZmluZWQgdHlwZXMsIHByaW50ICI8dW5kZWZpbmUgdHlwZT4iCisJYXMgdGhlIHR5cGUgaW5zdGVhZCBvZiBjcmFzaGluZy4KKwkqIHZhbHVlcy5jICh2YWx1ZV9oZWFkb2YpOiBHZXQgdGhlIHZ0YWJsZSBwb2ludGVyIHRha2luZworCVRZUEVfVlBUUl9CQVNFVFlQRSBpbnRvIGFjY291bnQuCisJKiBzeW10YWIuYywgc3ltdGFiLmgsIGRieHJlYWQuYzogRml4IHZhcmlvdXMgd2hpdGVzcGFjZSBzcGxvdGNoZXMuCisKK01vbiBBcHIgMjkgMTM6MjI6NTEgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBNb3ZlIEJST0tFTl9MQVJHRV9BTExPQ0EgZnJvbSB0bS1zdW4zODYuaCB0byB4bS1zdW4zODYuaC4KKworCSogc3VuMzg2LXhkZXAuYyBbIUdEQl9UQVJHRVRfSVNfU1VOMzg2XTogSnVzdCBwcm92aWRlIGVtcHR5CisJZnVuY3Rpb25zIHdoaWNoIGRvbid0IGRvIGFueXRoaW5nLgorCXRtLXN1bjM4Ni5oOiBEZWZpbmUgR0RCX1RBUkdFVF9JU19TVU4zODYuCisKKwkqIE1ha2VmaWxlLmRpc3Q6IEFkZCBjb21tZW50IGFib3V0IHRtLXN1bjNvczQuaDogdG0tc3VuMy5oLCBldGMuCisKKwkqIHN1bjMteGRlcC5jLCB0bS1zdW4zLmgsIHRtLTY4ay5oOiBDaGFuZ2UgVEFSR0VUX1NVTjMgdG8KKwlHREJfVEFSR0VUX0lTX1NVTjMuCisKKwkqIGluZnJ1bi5jOiBEb24ndCBpbmNsdWRlIHN5cy91c2VyLmggYW5kIGZyaWVuZHMgKHdyb25nIGZvcgorCWNyb3NzLWRlYnVnZ2luZyBhbmQgbm90IG5lY2Vzc2FyeSBhbnltb3JlIChzZWUgSU5fU0lHVFJBTVAgaW4KKwl4bS12YXguaCkpLgorCVtTRVRfU1RBQ0tfTElNSVRfSFVHRV06IEluY2x1ZGUgPHN5cy97cmVzb3VyY2UsdGltZX0uaD4uCisJeG0tdGFob2UuaDogRG9uJ3QgZGVmaW5lIF9ESVJFTlRfLgorCisJKiB4bS10YWhvZS5oOiBSZW1vdmUgVVNFX09MRF9UVFkgKG5vdCBuZWVkZWQgbm93IHRoYXQgdGVybWluYWwuaAorCWluY2x1ZGVzIHNndHR5LmggYmVmb3JlIHN5cy9pb2N0bC5oKS4KKworU3VuIEFwciAyOCAyMjowNDo0NyAxOTkxICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIHBhcmFtLW5vLXRtLmg6IE1ha2UgQklUU19CSUdfRU5ESUFOIGRlZmluZWQgdG8gMC8xLCBub3QgZGVmaW5lZAorCW9yIG5vdCBkZWZpbmVkLiAgRG9uJ3QgZGVmaW5lIGl0IGJhc2VkIG9uIFRBUkdFVF9CWVRFX09SREVSIGlmCisJaXQncyBhbHJlYWR5IGRlZmluZWQgKGluIHRoZSB0bS5oIGZpbGUpLgorCW1pcHMtb3Bjb2RlLmggKEJJVF9GSUVMRFNfKiksCisJdmFsdWVzLmMgKG1vZGlmeV9maWVsZCwgdW5wYWNrX2ZpZWxkX2FzX2xvbmcpOgorCVVzZSAjaWYgQklUU19CSUdfRU5ESUFOIG5vdCAjaWZkZWYgQklUU19CSUdfRU5ESUFOLgorCXt4LHR9bS10YWhvZS5oLCB0YWhvZS1waW5zbi5jLCB0YWhvZS1vcGNvZGUuaDogTmV3IGZpbGVzLgorCitGcmkgQXByIDI2IDEyOjAyOjA2IDE5OTEgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogdG0tc3BhcmMuaDogQWRkIGNvbW1lbnRzIGFib3V0IGdjYyB2ZXJzaW9uIDIgYW5kIHN0cnVjdHVyZSBwYXNzaW5nLgorCisJKiB4Y29uZmlnL2kzODZ2eywzMn17LC1nfTogQWRkIFhNX0NGTEFHUz0tRGdldHBhZ2VzaXplKCk9NDA5Ni4KKwlnbWFsbG9jLmM6ICNpZiAwIG91dCAhSEFWRV9HRVRQQUdFU0laRSBjb2RlLgorCisJKiBleHByZWFkLnkgKGFic19kZWNsKTogQWNjZXB0ICcmJyBhbmQgJyYnIGFic19kZWNsLgorCisJKiBzeW10YWIuYywgc3ltdGFiLmg6IEhhdmUgYSBidWlsdGluX3R5cGVfeyx1bnNpZ25lZF99bG9uZ19sb25nCisJcmVnYXJkbGVzcyBvZiBMT05HX0xPTkcuCisJZGVmcy5oIChUQVJHRVRfTE9OR19MT05HX0JJVCk6IE5ldyBtYWNyby4KKwlleHByZWFkLnkgKHR5cGViYXNlKTogQWRkIHt1bnNpZ25lZCx9IGxvbmcgbG9uZyB7LGludH0uCisKK1RodSBBcHIgMjUgMTI6MzE6MjIgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiB2YWxvcHMuYyAodHlwZWNtcCk6IElmIHQyID09IDAsIHJldHVybiAxLgorCitXZWQgQXByIDI0IDA5OjQ1OjE3IDE5OTEgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKwlDaGFuZ2VzIGZyb20gVGllbWFubjoKKwkqIGNwbHVzLWRlbS5jIChvcHRhYmxlKTogQWRkICJudyIsICJkbCIsICJjb21wb3VuZCIuCisJKGNwbHVzX21hbmdsZV9vcG5hbWUpOiBOZXcgZnVuY3Rpb24uCisJKGRvX3R5cGUpOiBBZGQgY2FzZSAnUScuCisJKiB2YWx1ZXMuYyAoY2hlY2tfc3R1Yl9tZXRob2QpOiBEbyBsb29rdXBfbWV0aG9kX3R5cGUgYW5kIHN0dWZmCisJcmF0aGVyIHRoYW4gc21hc2hfdG9fbWV0aG9kX3R5cGUuCisJc3ltdGFiLmMsIHN5bXRhYi5oIChhbGxvY2F0ZV9zdHViX21ldGhvZCk6IE5ldyBmdW5jdGlvbi4KKwlkYnhyZWFkLmMgKHJlYWRfdHlwZSk6IElmIHdlIGdldCAiIyMiLCBkb24ndCBsb29rdXBfZnVuY3Rpb25fdHlwZQorCWFuZCBzdGFydCBjbG9iYmVyaW5nIGl0OyBhbGxvY2F0ZV9zdHViX21ldGhvZCBpbnN0ZWFkLgorCSogcHJpbnRjbWQuYyAoeF9jb21tYW5kKTogRGVyZWZlcmVuY2UgcmVmZXJlbmNlcy4KKwkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfdmFyc3BlY19wcmVmaXgsIGNhc2UgVFlQRV9DT0RFX01FVEhPRCk6CisJRG9uJ3QgcHJpbnQgIiAiIHR5cGVfcHJpbnRfYmFzZSAoLi4uKSAiOjoiIGlmICFwYXNzZWRfYV9wdHIuCisJKiBkYnhyZWFkLmMgKHJlYWRfc3RydWN0X3R5cGUpOiBQdXQgIm9wJCIgaW5zdGVhZCBvZiAib3BlcmF0b3IiCisJaW4gdGhlIHN5bWJvbCB0YWJsZS4KKwkqIHZhbHVlcy5jIChjaGVja19zdHViX21ldGhvZCk6IERlYWwgd2l0aCBvcGVyYXRvciBuYW1lcy4KKwkqIHZhbHByaW50LmMgKGNwbHVzX3ZhbF9wcmludCk6IENoZWNrIGZvciBlcnJvciBpbiBiYXNlY2xhc3NfYWRkci4KKwkqIHZhbHVlcy5jOiBNb3ZlIGRlY2xhcmF0aW9uIG9mIGNwbHVzX2RlbWFuZ2xlIHRvIHRvcCBvZiBmaWxlLgorCSogdmFsdWVzLmMgKGJhc2VjbGFzc19hZGRyKTogSWYgY2FuJ3QgcmVhZCBtZW1vcnksIHNldCAqRVJSUAorCXJhdGhlciB0aGFuIGNhbGxpbmcgZXJyb3IoKS4KKwkqIHZhbHVlLmg6IFJlbW92ZSByZWR1bmRhbnQgZGVjbGFyYXRpb24gb2YgdmFsdWVfc3RhdGljX2ZpZWxkLgorCSogdmFsdWVzLmMgKHZhbHVlX3N0YXRpY19maWVsZCk6IFJlY3Vyc2l2ZWx5IGNoZWNrIGFsbCBiYXNlY2xhc3Nlcy4KKwlSZXR1cm4gTlVMTCBpZiBub3QgZm91bmQuCisJKiB2YWx1ZXMuYywgdmFsdWUuaDogTmV3IGZ1bmN0aW9ucyB2YWx1ZV97aGVhZG9mLGZyb21fdnRhYmxlX2luZm99LgorCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogUHJpbnQgb3V0IGZpcnN0IGVsZW1lbnQgb2YgdnRibAorCXNwZWNpYWxseS4KKwkqIHZhbHByaW50LmM6IE1vdmUgcHJpbnQgY29udHJvbHMgdG8gdG9wIGFuZCBhZGQgb2JqZWN0cHJpbnQuCisJQWRkIGNvbW1hbmQgInNldCBwcmludCBvYmplY3Qgb24vb2ZmIi4KKwkqIHZhbHByaW50LmMgKHZhbHVlX3ByaW50LCBpc192dGJsX21lbWJlcik6IFB1dCB0aGluZ3MgaW4gbG9jYWwKKwl2YXJpYWJsZXMgcmF0aGVyIHRoYW4gY29udGludWFsbHkgZG9pbmcgVkFMVUVfVFlQRSAodmFsKSwgZXRjLgorCSogdmFsb3BzLmMgKHZhbHVlX3N0cnVjdF9lbHRfZm9yX2FkZHJlc3MpOiBDYWxsIGNoZWNrX3N0dWJfbWV0aG9kLgorCSogdmFsb3BzLmMgKHZhbHVlX3N0cnVjdF9lbHQpOiBSZW1vdmUgZm91bmQsIGFyZzFfYXNfcHRyLgorCSogdmFsb3BzLmMgKHNlYXJjaF9zdHJ1Y3RfbWV0aG9kKTogR2l2ZSBlcnJvciBpZiBqID4gMCAmJiBhcmdzID09IDAuCisJKiB2YWxvcHMuYyAoc2VhcmNoX3N0cnVjdF9maWVsZCk6IE5ldyBhcmd1bWVudCBsb29raW5nX2Zvcl9iYXNlY2xhc3MuCisJR2l2ZSBlcnJvciBpZiB2YWx1ZV9zdGF0aWNfZmllbGQgb3IgdmFsdWVfcHJpbWl0aXZlX2ZpZWxkCisJcmV0dXJuIE5VTEwuCisJdmFsb3BzLmMgKHZhcmlvdXMpOiBDYWxsIHNlYXJjaF9zdHJ1Y3RfZmllbGQgd2l0aCBleHRyYSBwYXJhbWV0ZXIuCisJKiBzeW10YWIuYyAoZGVjb2RlX2xpbmVfMSk6IERlYWwgd2l0aCBvcGVyYXRvcnMgc3BlY2lmaWVkIGFzCisJIm9wZXJhdG9yIiA8b3B0aW9uYWwgd2hpdGVzcGFjZT4gPHN5bWJvbHMgZm9yIG9wZXJhdG9yPi4KKwkob3BlcmF0b3JfY2hhcnMpOiBIZWxwIGRvIGl0LgorCSogc3ltdGFiLmMgKGxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGUpOiBDYWxsIGNoZWNrX3N0dWJfdHlwZS4KKwlUYWtlIGFkZGl0aW9uYWwgYXJndW1lbnQgbm9lcnIuCisJRG9uJ3QgZHVtcCBjb3JlIGlmIFRZUEVfRklFTERfTkFNRSBpcyBOVUxMLgorCUNoZWNrIHRoZSBiYXNlY2xhc3NlcyByZWN1cnNpdmVseS4KKwkqIHN5bWZpbGUuYyAoZmlsbF9pbl92cHRyX2ZpZWxkbm8pOiBEb24ndCBjYWxsIGNoZWNrX3N0dWJfdHlwZS4KKwlSZXR1cm4gdm9pZCBub3QgaW50LiAoYWxzbyBkZWNsYXJhdGlvbnMgaW4gc3ltZmlsZS5oIGFuZCB2YWx1ZS5oKS4KKwlEZWFsIHdpdGggbXVsdGlwbGUgaW5oZXJpdGFuY2UuCisJKiBwcmludGNtZC5jIChwcmludF9jb21tYW5kXzEpOiBBZGQgaWYgKG9iamVjdHByaW50KSBjb2RlLgorCSogZXhwcmVhZC55ICh2YXJpYWJsZSk6IEFsbG93IGZvciBkZXN0cnVjdG9yIHdpdGggZm9vOjp+bmFtZS4KKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwLCBjYXNlIFVOT1BfTE9HTk9UKTogSWYgZm9sbG93aW5nIG9wY29kZQorCWlzIE9QX1NDT1BFLCBnaXZlIGFuIGVycm9yLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiBQYXNzIHRoaXJkIGFyZyB0byBsb29rdXBfc3RydWN0X2VsdF90eXBlLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApLCB2YWx1ZXMuYyAodmFsdWVfdmlydHVhbF9mbl9maWVsZCk6CisJRG9uJ3QgYm90aGVyIHRvIGRvIGFueXRoaW5nIHdpdGgKKwlyZXR1cm4gdmFsdWUgZnJvbSBmaWxsX2luX3ZwdHJfZmllbGRuby4KKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKTogSWYgdmFsdWVfc3RhdGljX2ZpZWxkIHJldHVybnMgTlVMTCwKKwlnaXZlIGFuIGVycm9yLgorCSogZGJ4cmVhZC5jIChyZWFkX3N0cnVjdF90eXBlKTogU2V0IGZjb250ZXh0IHRvIDAgZm9yIG5vcm1hbCBtZW1iZXIKKwlmdW5jdGlvbi4KKwkqIGRieHJlYWQuYyAocmVhZF9zdHJ1Y3RfdHlwZSk6IEluaXRpYWxpemUgbmFtZSB0byAwLgorCSogZGJ4cmVhZC5jIChyZWFkX29maWxlX3N5bXRhYiwgTl9DQVRDSCk6IEFkZCBvZmZzZXQgdG8gYnVmcC0+bl92YWx1ZS4KKwkqIGRieHJlYWQuYyAoZGJ4X2NyZWF0ZV90eXBlKTogWmVybyBUWVBFX1ZQVFJfQkFTRVRZUEUuCisJKHJlYWRfc3RydWN0X3R5cGUpOiBEb24ndCBib3RoZXIgdG8gc2V0IFRZUEVfVlRQUl97QkFTRVRZUEUsRklFTEROT30KKwlpZiBpdCdzIGp1c3QgZ29pbmcgdG8gYmUgezAsMX0uCisKKwkqIGRieHJlYWQuYyAodmlydHVhbF9jb250ZXh0KTogVXNlIFRZUEVfQkFTRUNMQVNTIHN0YXJ0aW5nIGF0IDAKKwkoeWVzLCBpdCdzICNpZiAwLCBidXQganVzdCBpbiBjYXNlLi4uKS4KKworCSogdmF4LW9wY29kZS5oLCBleHByZWFkLnksIGV4cHByaW50LmMsIGNwbHVzLWRlbS5jOiBEZWNsYXJlIHNvbWUKKwl0aGluZ3MgImNvbnN0Ii4KKworCSogaTM4Ni1zdHViLmM6IE5ldyBmaWxlLgorCisJKiBXSEFUUy5ORVc6IFJlbW92ZSBtZW50aW9uIG9mIHJlYWRsaW5lIGFuZCBtb3JlIHBhZ2luZyAoaW4gMy41KS4KKwlUcnkgdG8ga2VlcCBjb21tYW5kIG5hbWVzIHVwIHRvIGRhdGUgd2l0aCByZW5hbWluZy4KKworCSogZ21hbGxvYy5jIFshSEFWRV9HRVRQQUdFU0laRV06IFRyeSB0byBmaWd1cmUgb3V0IHRoZSBwYWdlc2l6ZS4KKworCSogaW5mdW4uYyAocmVzdW1lLCByZXN1bWVfY2xlYW51cHMpOiBOZXcgZnVuY3Rpb25zLgorCSh3YWl0X2Zvcl9pbmZlcmlvciwgcHJvY2VlZCwgY2hpbGRfY3JlYXRlX2luZmVyaW9yKTogVXNlIHJlc3VtZQorCW5vdCB0YXJnZXRfcmVzdW1lLgorCisJKiByZW1vdGUuYyAoZ2V0cGt0KTogRG9uJ3Qgc2V0IGltbWVkaWF0ZV9xdWl0LgorCisJKiBibG9ja2ZyYW1lLmMsIGZyYW1lLmggKHJlaW5pdF9mcmFtZV9jYWNoZSk6IE5ldyBmdW5jdGlvbi4KKwlzb2xpYi5jIChzb2xpYl9hZGQpLCBzeW1maWxlLmMgKHssYWRkX31zeW1ib2xfZmlsZV9jb21tYW5kKToKKwlVc2UgaXQuCisKK1R1ZSBBcHIgMjMgMTA6Mzg6NDEgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBzeW10YWIuYyAobG9va3VwX3N5bWJvbCk6IEFkZCAzIG1vcmUgb2YgdGhvc2UgbG9vcHMgdGhyb3VnaAorCXRoZSBzeW10YWJzIHdoaWNoIHdlIGFsbCBrbm93IGFuZCBsb3ZlOiAoMSkgTG9vayBpbiB0aGUKKwlTVEFUSUNfQkxPQ0sgZm9yIG1hbmdsZWQgc3ltYm9scyByaWdodCBhZnRlciB3ZSBjaGVjayB0aGUgYmxvY2tzLAorCSgyLCAzKSBMb29rIGluIHRoZSBTVEFUSUNfQkxPQ0sgZm9yIGFsbCB0aGUgc3ltdGFicyBhbmQgcHN5bXRhYnMKKwlhdCB0aGUgZW5kLgorCisJKiBtYWluLmMgKGNkX2NvbW1hbmQpOiBDYWxsIGRvbnRfcmVwZWF0LgorCisJKiBkYnhyZWFkLmMgKHJlYWRfc3RydWN0X3R5cGUpOiBJZiBjb25zdC92b2xhdGlsZSBjaGFyYWN0ZXIgaXMKKwltaXNzaW5nLCBkb24ndCBjb21wbGFpbiwganVzdCBjb250aW51ZS4KKworCSogZGJ4cmVhZC5jIChyZWFkX3N0cnVjdF90eXBlKTogT25seSB0cnkgdG8gcmVhZCB0aGUgZmNvbnRleHQgaWYKKwlpdCBpcyB0aGVyZS4gIEFsc28gY2hhbmdlICJlcnJvcl90eXBlICIgdG8gInJldHVybiBlcnJvcl90eXBlICIuCisJdmFsdWVzLmMgKHZhbHVlX3ZpcnR1YWxfZm5fZmllbGQpOiBJZiB0aGVyZSBpcyBubyBmY29udGV4dCwKKwl0aGVuIGRvIHRoaW5ncyB0aGUgd2F5IEdEQiAzLnggZGlkLgorCXZhbG9wcy5jIChzZWFyY2hfc3RydWN0X21ldGhvZCk6IEFkZCB0eXBlIHRvIHZhbHVlX3ZpcnR1YWxfZm5fZmllbGQKKwlhcmd1bWVudHMuCisKKwkqIGRieHJlYWQuYyAocmVhZF9zdHJ1Y3RfdHlwZSk6IEZpeCB0eXBvOiAqcHAgIT0gJ1wwJyAtPiAqKnBwICE9ICdcMCcuCisKK01vbiBBcHIgMjIgMDA6MDI6NDMgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBwcmludGNtZC5jIChwcmludF9zY2FsYXJfZm9ybWF0dGVkKTogQWRkICd0JyBmb3IgYmluYXJ5LgorCisJKiBkYnhyZWFkLmMgKGVuZF9wc3ltdGFiKTogSW5pdGlhbGl6ZSBwc3QtPnN5bXRhYi4KKworCSogY29yZS5jIChjb3JlX29wZW4pOiBDYWxsIEFERF9TT0xJQi4KKworCSogdG0tc3BhcmMuaDogSW5jbHVkZSA8c3VuNC9yZWcuaD4gbm90IDxtYWNoaW5lL3JlZy5oPi4KKwlzcGFyYy10ZGVwLmM6IERvbid0IGluY2x1ZGUgPG1hY2hpbmUvcmVnLmg+LgorCisJKiBzdW4zLXhkZXAuYyBbIVRBUkdFVF9TVU4zXTogSnVzdCBwcm92aWRlIGVtcHR5IGZ1bmN0aW9ucyB3aGljaAorCWRvbid0IGRvIGFueXRoaW5nLgorCisJKiBjb3JlLmMgKGNvcmVfb3Blbik6IEFkZCBtYWtlX2NsZWFudXAgKHVucHVzaF90YXJnZXQsICZjb3JlX29wcykuCisKKwkqIFNoYXJlZCBsaWJyYXJ5L2NvcmVmaWxlIGNoYW5nZXMgZnJvbSBQZXRlciBTY2hhdWVyOgorCWNvcmUuYyAoY29yZV9jbG9zZSk6IENhbGwgQ0xFQVJfU09MSUIuCisJKGNvcmVfb3Blbik6IFJlbW92ZSBjb21tZW50IGFib3V0ICJzaG91bGQgZGVhbCB3aXRoIHNoYXJlZCBsaWIiLgorCShjb3JlX3hmZXJfbWVtb3J5KTogSWYgd2UgY2FuJ3QgeGZlciB0aGUgdXN1YWwgd2F5LCB0cnkgdGhlCisJc2hhcmVkIGxpYnJhcmllcy4KKwlzb2xpYi5jIChzb19saXN0KTogTmV3IGZpZWxkcyBzb19iZmQgYW5kIHNvX3NlY3Rpb25zeyxfZW5kfS4KKwkoZmluZF9zb2xpYik6IFVzZSBzb2xpYl9tYXBfc2VjdGlvbnMgdG8gZ2V0IGxkX3RleHQuCisJKHNvbGliX21hcF9zZWN0aW9ucywgc29saWJfeGZlcl9tZW1vcnkpOiBOZXcgZnVuY3Rpb25zLgorCShjbGVhcl9zb2xpYik6IEZyZWUgc29fc2VjdGlvbnMgYW5kIGNsb3NlIHNvX2JmZC4KKwl0bS1zdW5vcy5oOiBBZGQgc29saWJfeGZlcl9tZW1vcnksIHNvbGliX2FkZC4KKworCSogc3BhcmMtdGRlcC5jIChza2lwX3Byb2xvZ3VlKTogRG9uJ3Qgc2tpcCBhbnl0aGluZyB1bmxlc3MgdGhlcmUKKwlpcyBhICJzYXZlIiBpbnN0cnVjdGlvbiBpbiB0aGVyZSBzb21ld2hlcmUuCisKKwkqIHN5bWZpbGUuYyAoc3ltYm9sX2ZpbGVfYWRkKTogQWRkIGNvbW1lbnQuCisJc29saWIuYyAoc29saWJfYWRkKTogRG9uJ3QgbWFsbG9jIG5hbWUgcGFzc2VkIHRvIHN5bWJvbF9maWxlX2FkZC4KKworCSogZXhlYy5jIChidWlsZF9zZWN0aW9uX3RhYmxlKTogSWYgKnN0YXJ0IGlzbid0IE5VTEwsIGZyZWUgaXQuCisJCisJKiBzdGFjay5jIChwYXJzZV9mcmFtZV9zcGVjaWZpY2F0aW9uKTogRXJyb3IgaWYgTlVMTCBzZWxlY3RlZF9mcmFtZS4KKwlpbmZjbWQuYyAoZmluaXNoX2NvbW1hbmQpOiBFcnJvciBpZiBOVUxMIHNlbGVjdGVkX2ZyYW1lLgorCWluZmxvdy5jIChraWxsX2NvbW1hbmQpOiBEZWFsIHdpdGggTlVMTCBzZWxlY3RlZF9mcmFtZS4KKwlzdGFjay5jIChyZWNvcmRfc2VsZWN0ZWRfZnJhbWUpOiBTZXQgKkZSQU1FUCB0byBOVUxMIGlmIHRoZXJlCisJaXMgbm8gc2VsZWN0ZWQgZnJhbWUuCisJaW5mcnVuLmMgKHJlc3RvcmVfaW5mZXJpb3Jfc3RhdHVzKTogQWRkIGNvbW1lbnQuCisJZmluZHZhci5jIChyZWFkX3Zhcl92YWx1ZSk6IENoZWNrIGZvciBOVUxMIGZyYW1lIHdoZXJlIHdlIG5lZWQKKwlhIGZyYW1lLgorCWJyZWFrcG9pbnQuYyAoZ2V0X2NhdGNoX3NhbHMpOiBDaGVjayBmb3IgTlVMTCBzZWxlY3RlZF9mcmFtZS4KKworCSogYnJlYWtwb2ludC5jIChicHN0YXRfcHJpbnQpOiBUcnkgYWxsIGVsZW1lbnRzIG9uIHRoZSBicHN0YXQKKwljaGFpbiBiZWZvcmUgZ2l2aW5nIHVwIHdpdGggYW4gaW50ZXJuYWwgZXJyb3IuCisKK1N1biBBcHIgMjEgMjE6NDM6MTAgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiB2YWx1ZS5oLCB2YWx1ZXMuYyAodmFsdWVfeyxmcmVlX3RvX31tYXJrKTogTmV3IGZ1bmN0aW9ucy4KKwlicmVha3BvaW50LmMgKGJwc3RhdF9zdG9wX3N0YXR1cyk6IFVzZSB0aGVtLgorCisJKiB0bS1pMzg2dnssLWd9Lmg6IFJlbW92ZSBOX1NFVF9NQUdJQyBkZWZpbmUuCisKK1NhdCBBcHIgMjAgMjE6NDI6NDcgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBpMzg2LXRkZXAuYzogUmVtb3ZlIHVubmVjZXNzYXJ5ICNpbmNsdWRlcy4KKworCSogc3ltdGFiLmMgKHZhcmlvdXMpOiBDaGFuZ2UgZXJyb3IgcmV0dXJuIG9mIGZpbmRfbGluZV9jb21tb24gdG8gLTEuCisKKwkqIGNvZmZyZWFkLmMgKGZpbmRfbGluZW5vcyk6IFVzZSBMSU5FU1ogbm90IHNpemVvZiAoc3RydWN0IGxpbmVubykuCisKKwkqIGNvZmZyZWFkLmMgKGVuZF9zeW10YWIpOiBJbml0aWFsaXplIGxhbmd1YWdlLCBkaXJuYW1lLCBhbmQKKwlmdWxsbmFtZSBmaWVsZHMuCisKK0ZyaSBBcHIgMTkgMTg6MTg6MzEgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBtaXBzLXRkZXAuYyAobWlwc19mcmFtZV9jaGFpbik6IERvbid0IGNoYWluIGlmIHNhdmVkX3BjID09IDAuCisKKwkqIHN0ZGRlZi5oIChzaXplX3QpOiBMZXQgZWl0aGVyIF9TSVpFX1Qgb3IgX1NJWkVfVF8gZ3VhcmQgaXQuCisKKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3N5bWJvbCk6IFNldCBzdGFydHVwX2ZpbGVfe3N0YXJ0LGVuZH0gaWYKKwllbnRyeV9wb2ludCBpcyBpbiBjdXJyZW50IGZpbGUuCisKKwkqIGZpbmR2YXIuYyAocmVhZF9yZWdpc3Rlcl9nZW4pOiBBZGQgInRhcmdldCBieXRlLW9yZGVyIiBjb21tZW50LgorCitXZWQgQXByIDE3IDE3OjA5OjQ4IDE5OTEgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogaTM4Ni10ZGVwLmMgKGkzODZfZ2V0X2ZyYW1lX3NldHVwKTogVXNlIFNXQVBfVEFSR0VUX0FORF9IT1NUCisJYmVmb3JlIHJldHVybmluZyBsb2NhbHMgb3Igc2xvY2Fscy4KKworCSogaTM4Ni10ZGVwLmMgKGkzODZfZm9sbG93X2p1bXApOiBEbyBub3QgYWRkIGRhdGExNiB0byBwb3MgaW4KKwljYWxsIHRvIGNvZGVzdHJlYW1fc2VlazsgYWRkIG9uZSB0byBwb3MgaWYgKGFuZCBvbmx5IGlmKQorCXdlIGFyZSBkZWFsaW5nIHdpdGggYSBqdW1wIHdpdGggZGF0YTE2ID09IDEgKGkuZS4gMHg2NiwgMHhlOSkuCisKK01vbiBBcHIgMTUgMTI6MDQ6MzIgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiB2YWxvcHMuYyAoY2FsbF9mdW5jdGlvbl9ieV9oYW5kKTogUHV0IGR1bW15MSBpbiB0YXJnZXQgb3JkZXIKKwliZWZvcmUgRklYX0NBTExfRFVNTVkuCisKKwkqIHRtLWkzODZ2LmggKEZJWF9DQUxMX0RVTU1ZKTogRG9uJ3QgZGVwZW5kIG9uIGhvc3QgYnl0ZSBvcmRlci4KKworU3VuIEFwciAxNCAxMTo1NToxOSAxOTkxICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIHZhbG9wcy5jIChwdXNoX3dvcmQpOiBBZGQgU1dBUF9UQVJHRVRfQU5EX0hPU1QuCisKKwkqIHJlbW90ZS5jIChyZW1vdGVfb3Blbik6IFNlbmQgJysnIGJlZm9yZSBjYWxsaW5nIHB1dHBrdCgpLgorCisJKiB0bS1pMzg2di5oIChSRUdJU1RFUl9WSVJUVUFMX1RZUEUpOiBSZXR1cm4gcG9pbnRlciB0byB2b2lkLAorCW5vdCBpbnQsIGZvciBwYywgZnAsIGFuZCBzcC4KKworCSogcmVtb3RlLmMgKHJlbW90ZV9vcGVuKTogQ2FsbCBzdGFydF9yZW1vdGUgYWZ0ZXIgcHV0cGt0KCI/Iik7CisJaW5mcnVuLmMgKHN0YXJ0X3JlbW90ZSk6IEFsc28gY2FsbCB3YWl0X2Zvcl9pbmZlcmlvciAmIG5vcm1hbF9zdG9wLgorCitTYXQgQXByIDEzIDIyOjExOjQyIDE5OTEgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBzcGlmZi5jeWdudXMuY29tKQorCisJKiBleGVjLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgorCisJKiBzdW4zLXhkZXAuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiBBZGQgI2lmZGVmIEZQMF9SRUdOVU0uCisKK0ZyaSBBcHIgMTkgMDk6MzY6NTAgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiB0bS02OGsuaCAoTlVNX1JFR1MpOiBDb25kaXRpb25hbGl6ZSBvbiBUQVJHRVRfU1VOMyBub3Qgc3VuLgorCXRtLXN1bjMuaDogRGVmaW5lIFRBUkdFVF9TVU4zLgorCisJKiB1dGlscy5jOiBVc2UgQ1BMVVNfTUFSS0VSIG5vdCAnJCcuCisKKwkqIGNwbHVzLWRlbS5jOiBVc2UgQ1BMVVNfTUFSS0VSIG5vdCAnJCcuICBJZiBDUExVU19NQVJLRVIgaXNuJ3QKKwlkZWZpbmVkLCBkZWZpbmUgaXQgdG8gJyQnLgorCisJKiBhcm0tb3Bjb2RlLmg6IE5ldyBmaWxlIChzYW1lIGNvbnRlbnRzIGFzIGJlZm9yZTsgaXQgaGFkCisJanVzdCBiZWVuIGxlZnQgb3V0IG9mIHRoZSBkaXN0cmlidXRpb24gZm9yIGEgbG9uZyB0aW1lKS4KKworCSogdG0tNjhrLmg6IFB1dCBkZWNsYXJhdGlvbiBvZiBleHRfZm9ybWF0XzY4ODgxIG91dHNpZGUgdGhlIG1hY3Jvcy4KKworCSogbWFpbi5jOiBOZXcgSEFWRV9TSUdTRVRNQVNLICNpZmRlZnMuCisKKwkqIGNvZmZyZWFkLmMgKHJlYWRfY29mZl9zeW10YWIpOiBDaGVjayBmb3IgIkxGJSIgd2l0aCBhbGwgdGhlCisJb3RoZXIgTColIHRoaW5ncy4KKworCSogY29mZnJlYWQuYyAoU0RCX1RZUEUpOiBOZXcgbWFjcm8uCisJdmFyaW91czogVXNlIGl0IGluc3RlYWQgb2YgY2hlY2tpbmcgYWdhaW5zdCBUX05VTEwuCisKKwkqIE1ha2VmaWxlLmRpc3QgKGNwbHVzLWRlbS5vKTogSGFjayBpbiBhbiAjaW5jbHVkZSAicGFyYW0uaCIKKwliZWZvcmUgd2UgY29tcGlsZSBpdC4KKwlkZWZzLmg6IFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24uCisJcGFyYW0uaDogSW5jbHVkZSBkZWZzLmguCisJc2lnbmFtZS5jOiBDaGFuZ2UgI2lmZGVmIFNZU19TSUdMSVNUX01JU1NJTkcgdG8gI2lmLgorCXBhcmFtLW5vLXRtLmg6IERlZmluZSBTWVNfU0lHTElTVF9NSVNTSU5HIGZyb20gVVNHLgorCitUaHUgQXByIDE4IDE5OjQ5OjEwIDE5OTEgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogaTM4Ni1waW5zbi5jIChPUF9FKTogQ2hhbmdlICVkIHRvIDB4JXggZm9yIGNvbnNpc3RlbmN5LgorCisJKiBwdXRlbnYuYzogTmV3IGZpbGUKKwlNYWtlZmlsZS5kaXN0OiBBZGQgaXQgdG8gJChPQlMpLgorCisJKiBtaXBzcmVhZC5jIFshQ01VQ1NdOiAjaW5jbHVkZSA8c3ltcy5oPi4KKworCSogbWlwcy14ZGVwLmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogI2lmIDAgb3V0IHRoZSB3aG9sZSBmdW5jdGlvbi4KKworCSogTW92ZSByZWFkX21lbW9yeV9ub2JwdCBmcm9tIG1lbS1icmVhay5jIHRvIGJyZWFrcG9pbnQuYy4KKworTW9uIEFwciAxNSAyMTo0NTozNSAxOTkxICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIHV0aWxzLmMgKF9pbml0aWFsaXplX3V0aWxzKTogUmVuYW1lICJzZXQgZGVtYW5nbGUiIHRvCisJInNldCBwcmludCBkZW1hbmdsZSIsICJzZXQgYXNtLWRlbWFuZ2xlIiB0byAic2V0IHByaW50CisJYXNtLWRlbWFuZ2xlIiBhbmQgInNldCBzZXZlbmJpdC1zdHJpbmdzIiB0byAic2V0IHByaW50CisJc2V2ZW5iaXQtc3RyaW5ncyIuCisKKwkqIG1haW4uYyAoaW5pdGlhbGl6ZV9tYWluKTogUmVuYW1lICJzZXQgaGlzdG9yeSB3cml0ZSIgdG8KKwkic2V0IGhpc3Rvcnkgc2F2ZSIuCisKKwkqIG1haW4uYyAoaW5pdGlhbGl6ZV9tYWluKTogUmVuYW1lICJzZXQgY2F1dGlvbiIgdG8KKwkic2V0IGNvbmZpcm0iLgorCisJKiB2YWx1ZXMuYyAoX2luaXRpYWxpemVfdmFsdWVzKTogUmVtb3ZlICJpbmZvIGhpc3RvcnkiIGFsaWFzCisJZm9yICh3aGF0IGlzIG5vdykgInNob3cgdmFsdWVzIi4KKworCSogaW5mY21kLmMsIGdkYmNtZC5oOiBBZGQgdW5zZXRsaXN0LgorCWluZmNtZC5jOiBBZGQgdW5zZXRfY29tbWFuZC4KKwkoX2luaXRpYWxpemVfaW5mY21kKTogQWRkICJ1bnNldCIgYW5kIHVzZSBpdCBmb3IgInVuc2V0IGVudiIuCisKKwkqIGJyZWFrcG9pbnQuYyAoX2luaXRpYWxpemVfYnJlYWtwb2ludCk6IFJlbW92ZSAidW5zZXQiLgorCisJKiB2YWxwcmludC5jOiBBZGQgInNldC9zaG93IHByaW50Iiwge3NldCxzaG93fV9wcmludC4KKwlSZW5hbWUgInNldCBhZGRyZXNzcHJpbnQiIHRvICJzZXQgcHJpbnQgYWRkcmVzcyIuCisJUmVuYW1lICJzZXQgYXJyYXlwcmludCIgdG8gInNldCBwcmludCBhcnJheSIuCisJUmVuYW1lICJzZXQgYXJyYXktbWF4IiB0byAic2V0IHByaW50IGVsZW1lbnRzIi4KKwlSZW5hbWUgInNldCBwcmV0dHlwcmludCIgdG8gInNldCBwcmludCBwcmV0dHkiLgorCVJlbmFtZSAic2V0IHVuaW9ucHJpbnQiIHRvICJzZXQgcHJpbnQgdW5pb24iLgorCVJlbmFtZSAic2V0IHZ0YmxwcmludCIgdG8gInNldCBwcmludCB2dGJsIi4KKworCSogbWFpbi5jOiBSZW5hbWUgdmVyc2lvbl9pbmZvIHRvIHNob3dfdmVyc2lvbi4KKwkoX2luaXRpYWxpemVfbWFpbik6IFJlbmFtZSAiaW5mbyB2ZXJzaW9uIiB0byAic2hvdyB2ZXJzaW9uIi4KKworCSogdmFsdWVzLmM6IFJlbmFtZSB2YWx1ZV9oaXN0b3J5X2luZm8gdG8gc2hvd192YWx1ZXMuCisJKF9pbml0aWFsaXplX3ZhbHVlcyk6IFJlbmFtZSAiaW5mbyB2YWx1ZXMiIHRvICJzaG93IHZhbHVlcyIuCisKK1N1biBBcHIgMTQgMjM6MDg6MzQgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBpbmZ0YXJnLmMgKGNoaWxkX29wZW4pLCByZW1vdGUtdnh7LC42OH0uYyAodnhfcHJvY19vcGVuKToKKwlOZXcgZnVuY3Rpb24gdG8gZ2l2ZSBjb3JyZWN0IGVycm9yIG1lc3NhZ2UuCisKK1RodSBBcHIgMTEgMTc6MTk6NDEgMTk5MSAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiB0YXJnZXQuaDogQWRkIHRvX2RvYyBhbmQgdGFyZ2V0X3ByZW9wZW4uCisJdGFyZ2V0LmM6IEFkZCB0YXJnZXRfcHJlb3BlbiBhbmQgdGFyZ2V0X2NvbW1hbmQuCisJUmVtb3ZlIHRhcmdldF9pbmZvLgorCShhZGRfdGFyZ2V0KTogQ2FsbCBhZGRfY21kIGFuZCBtZXNzIHdpdGggdGFyZ2V0bGlzdC0+ZG9jLgorCWNvcmUuYywgZXhlYy5jLCByZW1vdGUtZWIuYywgcmVtb3RlLW5pbmR5LmMsIHJlbW90ZS12eC5jLAorCXJlbW90ZS12eC42OC5jLCBpbmZ0YXJnLmMsIHJlbW90ZS5jOiBBZGQgZG9jIGZpZWxkIHRvIHRhcmdldCBzdHJ1Y3QuCisJQ2FsbCB0YXJnZXRfcHJlb3BlbiBmcm9tIG9wZW4gcm91dGluZS4KKworCSogbWFpbi5jOiBSZW5hbWUgZWRpdGluZ19pbmZvIHRvIHNob3dfY29tbWFuZHMuCisJKF9pbml0aWFsaXplX21haW4pOiBSZW5hbWUgImluZm8gZWRpdGluZyIgdG8gInNob3cgY29tbWFuZHMiLgorCisJKiBzb3VyY2UuYzogUmVuYW1lIGRpcmVjdG9yaWVzX2luZm8gdG8gc2hvd19kaXJlY3Rvcmllcy4KKwkoX2luaXRpYWxpemVfdmFsdWVzKTogUmVuYW1lICJpbmZvIGRpcmVjdG9yaWVzIiB0byAic2hvdyBkaXJlY3RvcmllcyIuCisKKwkqIHZhbHVlcy5jOiBSZW5hbWUgY29udmVuaWVuY2VfaW5mbyB0byBzaG93X2NvbnZlbmllbmNlLgorCShfaW5pdGlhbGl6ZV92YWx1ZXMpOiBSZW5hbWUgImluZm8gY29udmVuaWVuY2UiIHRvICJzaG93IGNvbnZlbmllbmNlIi4KKworCSogY29weWluZy5hd2sgKF9pbml0aWFsaXplX2NvcHlpbmcpOiBSZW5hbWUgImluZm8gY29weWluZyIgdG8KKwkic2hvdyBjb3B5aW5nIiBhbmQgImluZm8gd2FycmFudHkiIHRvICJzaG93IHdhcnJhbnR5Ii4KKwlSZW5hbWUge2NvcHlpbmcsd2FycmFudHl9X2luZm8gdG8gc2hvd197Y29weWluZyx3YXJyYW50eX0uCisKKwkqIHN5bWZpbGUuYzogUmVuYW1lIGFkZF9zeW1zX2NvbW1hbmQgdG8gYWRkX3N5bWJvbF9maWxlX2NvbW1hbmQuCisJKF9pbml0aWFsaXplX3N5bWZpbGUsIGFkZF9zeW1zX2FkZHJfY29tbWFuZCk6CisJUmVuYW1lIGFkZC1zeW1zIHRvIGFkZC1zeW1ib2wtZmlsZS4KKworVGh1IEFwciAxOCAxODowODozMCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIHN5bWZpbGUuaCAoZnJlZV9uYW1lZF9zeW10YWJzKTogIFJlbmFtZSBmcm9tIGZyZWVfbmFtZWRfc3ltdGFiLgorCSogc3ltZmlsZS5jIChjbGVhcl9zeW10YWJfdXNlcnNfb25jZSwgY2FzaGllcl9wc3ltdGFiLAorCWZyZWVfbmFtZWRfc3ltdGFicyk6ICBNb3ZlIHRoZXNlIHJvdXRpbmVzIGZyb20gc3ltbWlzYy5jLgorCSogc3ltbWlzYy5jIChzYW1lKTogIHNhbWUuCisJKGZyZWVfc3ltdGFiKTogIE1ha2Ugbm9uLXN0YXRpYy4KKwkqIHN5bXRhYi5oIChmcmVlX3N5bXRhYik6ICBEZWNsYXJlIGFzIGV4cG9ydGVkIHZvaWQgZm4gbm93LgorCSogZGJ4cmVhZC5jIChlbmRfc3ltdGFiLCBlbmRfcHN5bXRhYik6ICBDaGFuZ2UgY29tbWVudHMuCisJKGluaXRpYWxpemVfZGJ4cmVhZCk6ICBDYWxsIGRieF9uZXdfaW5pdCgpIGluIGNhc2UgdGhlIGZpcnN0CisJY29tbWFuZCBpcyBhZGQtc3ltYm9scy4KKwkqIHRhcmdldC5jIChkdW1teV90YXJnZXQpOiAgUGVybWl0IGFkZF9zeW1zX2FkZHJfY29tbWFuZC4KKworU2F0IEFwciAxMyAxNDo0NjowNyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwlQZXJtaXQgc3ltYm9scyB0byBiZSBzdXBlcnNlZGVkIHdoZW4gbmV3IHN5bWJvbCBmaWxlcyBoYXZlCisJYmVlbiByZWFkIGluLCBwYXJ0aWN1bGFybHkgZm9yIFZ4V29ya3MuCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogQWxsb3cgTl9TT0wgdG8gY2xlYW5seSB0YWtlIHVzIGJhY2sKKwl0byB0aGUgbWFpbiBmaWxlLCBhcyB3ZWxsIGFzIHRvIGluY2x1ZGUgZmlsZXMuICBBbHNvLCBwdXQgZ2xvYmFsCisJZnVuY3Rpb25zIGludG8gdGhlIGdsb2JhbCBwc3ltdGFiLCB0byBtYWtlICJpIGZ1biIgd29yay4KKwkoZW5kX3BzeW10YWIpOiAgRnJlZSBuYW1lZCBzeW10YWJzIGFuZCBwc3ltdGFicyBmb3IgYSBmaWxlLCBvbmNlIGEKKwluZXcgcHN5bXRhYiBmb3IgaXQgaGFzIGJlZW4gcmVhZC4KKwkqIGNvZmZyZWFkLmMgKGVuZF9wc3ltdGFiKTogIEZyZWUgbmFtZWQgc3ltdGFicyBhbmQgcHN5bXRhYnMgZm9yCisJYSBmaWxlLCBvbmNlIGEgbmV3IHN5bXRhYiBoYXMgYmVlbiByZWFkIGZvciBpdC4KKwkqIG1pcHNyZWFkLmM6ICBGSVhNRS4gIFdlIG5lZWQgdG8gZG8gdGhlIHNhbWUgZm9yIE1JUFMsIGJ1dCBpdAorCWxvb2tzIGhhcmRlciB0byBkZXRlcm1pbmUgdGhlIHRvcC1sZXZlbCBibG9jayBiZWZvcmUgaXQncyBiZWVuCisJcXVldWVkIHRvIHRoZSBwc3ltdGFiIGxpc3QuCQorCisJKiBzeW1maWxlLmMgKHN5bWJvbF9maWxlX2FkZCk6ICBVc2UgZmlsdGVyZWQgcHJpbnRpbmcgYW5kIHdyYXAgaXQuCisJSWYgd2UgaGF2ZSB3aXBlZCBvdXQgYW55IG9sZCBzeW1ib2wgdGFibGVzLCBjbGVhbiB1cCBhdCBlbmQgb2YKKwlzeW1ib2wgcmVhZGluZy4KKwkoc3ltYm9sX2ZpbGVfY29tbWFuZCk6ICBEb24ndCByZWZlcmVuY2Ugc3ltZmlsZV9mbnMgaWYgaXQncyB6ZXJvLgorCisJKiBzeW10YWIuaCAoR0xPQkFMX0JMT0NLLCBTVEFUSUNfQkxPQ0ssIEZJUlNUX0xPQ0FMX0JMT0NLKTogIE5ldworCWRlZmluZXMgZm9yIHRoZSBibG9ja3Mgb2YgYSBibG9ja3ZlY3RvciB0aGF0IGNvbnRhaW4gZ2xvYmFsIGFuZAorCWZpbGUtc3RhdGljIHN5bWJvbHMgYW5kIHRoZSBmaXJzdCBvZiB0aGUgc21hbGxlciBzY29wZSBjb250b3Vycy4gCisJKiBzeW10YWIuYyAobG9va3VwX3N5bWJvbCwgZmluZF9wY19zeW10YWIsIGZpbmRfcGNfbGluZSwKKwlkZWNvZGVfbGluZV8xLCBtYWtlX3N5bWJvbF9jb21wbGV0aW9uX2xpc3QpOiAgVXNlIHRoZSBhYm92ZS4KKwkqIGNvZmZyZWFkLmMgKGVuZF9zeW10YWIsIHBhdGNoX29wYXF1ZV90eXBlcyk6ICBEaXR0by4KKwkqIGRieHJlYWQuYyAoZW5kX3N5bXRhYik6ICBEaXR0by4KKwkqIGV4cHJlYWQueSAoYmxvY2spOiAgRGl0dG8uCisJKiBtaXBzcmVhZC5jICh0aHJvdWdob3V0KTogIERpdHRvLgorCSogc3ltbWlzYy5jIChmcmVlX25hbWVkX3N5bXRhYnMpOiAgRGl0dG8uCisKKwkqIHN5bXRhYi5jIChsaXN0X3N5bWJvbHMpOiAgUHJvY2VzcyB0aGUgZmlyc3Qgc3ltYm9sIG9mIHRoZQorCXN0YXRpYyBwc3ltYm9scyBsaXN0LgorCSh0eXBlc19pbmZvKTogIFJlc3RvcmUgdGhpcyBmdW5jdGlvbiBmcm9tIGl0cyB1bnRpbWVseSAjaWYgMC4KKwlJdCdzIG5vdCBwZXJmZWN0LCBidXQgaXQgaXMgYmV0dGVyIHRoYW4gbm90aGluZy4KKwkoX2luaXRpYWxpemVfc3ltdGFiKTogIFJlc3RvcmUgImluZm8gdHlwZXMiLgorCitUaHUgQXByIDExIDA1OjIzOjE5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogbTY4ay1zdHViLmM6ICBSZW1vdGUgc3R1YiBmb3IgNjgweDAncywgY3JlYXRlZCBmcm9tCisJcmVtLW02OGsuc2hhciAod2hpY2ggaXMgcmVtb3ZlZCkuCisJKiBuaW5keS1zaGFyZS97TWFrZWZpbGUsT25pbmR5LmMsYmxvdXQuaCxlbnYuaCxuaW5keS5jLHR0eWZsdXNoLmN9OgorCVJlbW92ZSBSQ1MgbG9nIHN0dWZmIG5vdyB0aGF0IHdlIHVzZSBDVlMgYW5kIGl0IGJsb3dzIG91ciBkaWZmcy4KKworV2VkIEFwciAxMCAxNDoxODowNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIHN5bW1pc2MuYyAoZnJlZV9uYW1lZF9zeW10YWIpOiAgTWFrZSBpdCB3b3JrLCBpbiBpdHMgY3VycmVudAorCWtsdWRneSBmYXNoaW9uLiAgQ2hhbmdlIHJlc3VsdCB0byBpbmRpY2F0ZSBpZiB3ZSBibGV3IGF3YXkgYmtwdHMuCisJKiBkYnhyZWFkLmMgKGVuZF9zeW10YWIpOiAgQWNjdW11bGF0ZSByZXN1bHQgZnJvbQorCWZyZWVfbmFtZWRfc3ltdGFiIGFuZCBwcmludCB3YXJuaW5nIGlmIHdlIGJsZXcgdXNlcidzIHN0YXRlLgorCSogc3ltZmlsZS5oOiAgZnJlZV9uYW1lZF9zeW10YWIgbm93IHJldHVybnMgYW4gaW50LgorCitNb24gQXByICA4IDIzOjU3OjQzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogZGJ4cmVhZC5jIChkYnhfc3ltZmlsZV9yZWFkKTogIEluaXRpYWxpemUgcHN5bWJvbCBsaXN0IGlmIHRoaXMKKwlpcyB0aGUgZmlyc3Qgc3ltYm9sIHJlYWQsIGV2ZW4gaWYgbm90IG1haW5saW5lLgorCShkYnhfcHN5bXRhYl90b19zeW10YWIpOiAgc3ltZmlsZSBtaWdodCBiZSB6ZXJvLCBjb3BlLgorCSogZXhlYy5jIChleGVjX29wcyk6ICBBZGRfc3ltc19hZGRyIGlzIHZhbGlkIGluIG91ciB0dmVjLgorCShzZXRfc2VjdGlvbl9jb21tYW5kKTogIE5ldyBjb21tYW5kICgic2VjdGlvbiB4eHggeXl5IiAtLSBzaG91bGQKKwliZSByZW5hbWVkIHRvICJzZXQgc2VjdGlvbiB4eHggeXl5IiBGSVhNRSkgd2hpY2ggc2V0cyB0aGUKKwliYXNlIGFkZHJlc3Mgb2YgYSBzZWN0aW9uIG9mIHRoZSBleGVjIGZpbGUsIG92ZXJyaWRpbmcgdGhlCisJdmlydHVhbCBhZGRyZXNzIHRoYXQgQkZEIHJlcG9ydHMuCisKK0ZyaSBBcHIgIDUgMTc6MTQ6MzkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBleGVjLmM6ICBBZGQgYWRkX3N5bXNfYWRkcl9jb21tYW5kIHRvIGV4ZWNfb3BzLCBzbyB5b3UgY2FuCisJbG9hZCBzeW1ib2xzIGF0IGFueSBhZGRyZXNzIHdoaWxlIGV4YW1pbmluZyBhbiBleGVjIGZpbGUuCisKK1RodSBBcHIgIDQgMTA6MDk6MzUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiB0bS1pMzg2di5oIChGTE9BVF9JTkZPKTogIERvbid0IGRlZmluZSBpdCwgc2luY2UgdGhlIGNvZGUKKwlmb3IgcHJpbnRpbmcgdGhlIGZsb2F0IGluZm8gaXMgaG9zdC1kZXBlbmRlbnQsIG5vdAorCXRhcmdldC1kZXBlbmRlbnQuICBGSVhNRS4KKwkqIGkzODYtcGluc24uYzogIE1vdmUgI2luY2x1ZGVzIHRvIHRvcCwgcmVtb3ZlIHVzZWxlc3Mgb25lcy4KKwkqIGkzODYtdGRlcC5jOiAgRG9uJ3QgYm90aGVyIGluY2x1ZGluZyA8Li4uL3JlZy5oPiBzaW5jZSB3ZQorCWRvbid0IHVzZSBpdCAoYW5kIGl0IGRvZXNuJ3QgZXhpc3Qgb24gaG9zdCBzeXN0ZW1zKS4KKworCSogaWVlZS1mbG9hdC5jIChpZWVlX2V4dGVuZGVkX3RvX2RvdWJsZSk6ICBDb252ZXJ0IE5hTiB0byBJbmYuCisJQ29udmVydCBuZWdhdGl2ZSBudW1iZXJzIHByb3Blcmx5LgorCShpZWVlX3Rlc3QpOiAgTWFrZSBudW1iZXJzIHJlYWxseSByYW5kb207IGZpeCBmb3JtYXQgYXJnLgorCisJKiBpbmZjbWQuYyAoYXR0YWNoX2NvbW1hbmQsIGRldGFjaF9jb21tYW5kKTogIERvbid0IHJlcGVhdCBvbiBDUi4KKwkqIGNvcmUuYyAoY29yZV9kZXRhY2gpOiAgVW5wdXNoIGNvcmVfb3BzLCB3aGljaCBtaWdodCBub3QgYmUgb24KKwl0b3AuICBXZSB1c2VkIHRvIGp1c3QgcG9wIHRoZSB0b3AsIHdoaWNoIGJyb2tlIHRoaW5ncy4gIERvbid0CisJbmVlZCBkb250X3JlcGVhdCgpIGFueSBtb3JlLgorCShjb3JlX2ZpbGVfY29tbWFuZCk6ICBQc3N0ISAgRG9uJ3QgcmVwZWF0IGl0LgorCSogcmVtb3RlLW5pbmR5LmMgKG5pbmR5X2RldGFjaCk6ICBEb24ndCBuZWVkIGRvbnRfcmVwZWF0KCkgbm93LgorCSogZXhwcHJpbnQuYyAocHJpbnRfc3ViZXhwKTogIEF2b2lkIHN3aXRjaCBmYWxsdGhydSBvbgorCUJJTk9QX0FTU0lHTl9NT0RJRlksIHNvIHdlIGNhbiBwcmludCArPSBhbmQgc3VjaC4KKwkqIGZyYW1lLmg6ICBGaXggdHlwby4KKwkqIGluZmxvdy5jIChraWxsX2NvbW1hbmQpOiAgQWZ0ZXIga2lsbGluZyBpbmZlcmlvciwgcHJpbnQgb3VyCisJY3VycmVudCBmcmFtZSBpbiB0aGUgY29yZSBmaWxlLCBpZiB3ZSBoYXZlIG9uZS4KKwkoZ2VuZXJpY19tb3Vybl9pbmZlcmlvcik6ICBXaGVuIGluZmVyaW9yIGRpZXMsIGVpdGhlciBzZWxlY3QKKwl0aGUgY3VycmVudCBmcmFtZSAoaW4gdGhlIG5ldyB0YXJnZXQsIGUuZy4gY29yZSBmaWxlKSwgb3IgCisJc2V0IGJvdGggdGhlIGN1cnJlbnQgYW5kIHNlbGVjdGVkIGZyYW1lcyB0byBOVUxMLgorCisJQ2hhbmdlcyBmcm9tIFBldGVyIFNjaGF1ZXIuCisKKwkqIGluZnB0cmFjZS5jOiAgQXZvaWQgPHN5cy9wdHJhY2UuaD4gb24gVVNHLgorCisJKiBNYWtlIGFsbCBmaWxlIG5hbWVzIGZpdCBpbiAxNCBjaGFyYWN0ZXJzIChzaWdoIGFuZCBkYW1uISk6CisJbXYgaHAzMDBocHV4LXhkZXAuYyBocDMwMHV4LXhkZXAuYworCW12IHN5bW1ldHJ5LXhkZXAuYyBzeW1tLXhkZXAuYworCW12IHN5bW1ldHJ5LXRkZXAuYyBzeW1tLXRkZXAuYworCW12IGNvbnZleC1vcGNvZGUuaCBjb252eC1vcGNvZGUuaAorCW12IHRtLXZ4d29ya3M5NjAuaCB0bS12eDk2MC5oCisJbXYgdG0tdnh3b3JrczY4LmggdG0tdng2OC5oCisJbXYgTWFrZWZpbGUuc3JjZGlyIE1ha2VmaWxlLnNkaXIKKwltdiBnZGItaW50LnRleGluZm8gZ2RiaW50LnRleGluZm8KKwltdiByZW1vdGUtc2EubTY4ay5zaGFyIHJlbS1tNjhrLnNoYXIKKwltdiByZW1vdGUtbXVsdGkuc2hhciByZW0tbXVsdGkuc2hhcgorCSogTWFrZWZpbGUuZGlzdCwgUkVBRE1FLCBjb25maWcuZ2RiLCBjb252ZXgtcGluc24uYywKKwl0Y29uZmlnL3N5bW1ldHJ5LCB0Y29uZmlnL3Z4d29ya3M5NjAsIHRjb25maWcvdnh3b3JrczY4LAorCXhjb25maWcvaHAzMDBocHV4LCB4Y29uZmlnL3N5bW1ldHJ5OiAgQ2hhbmdlIG5hbWVzIHRvIHNob3J0ZXIKKwluYW1lcy4KKworCSogY29tbWFuZC5jICh1c2VyX2luZm9fMSwgdXNlcl9pbmZvKTogIE5ldyBjb21tYW5kIGZvciBsaXN0aW5nCisJdGhlIHVzZXItZGVmaW5lZCBjb21tYW5kcy4KKworV2VkIEFwciAgMyAxNTowMDoyNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGRieHJlYWQuYyAocmVhbGx5X2ZyZWVfcGVuZGluZ3MpOiAgQ2xlYXIgZmlsZV9zeW1ib2xzCisJYW5kIGdsb2JhbF9zeW1ib2xzIGFmdGVyIGZyZWVpbmcgdGhlbTsgb3RoZXJ3aXNlLCBydW5uaW5nCisJdGhpcyBmdW5jdGlvbiB0d2ljZSAoaWYgaXQgYXBwZWFycyB0d2ljZSBvbiB0aGUgY2xlYW51cAorCWNoYWluKSwgd2UgdHJ5IHRvIGZyZWUgdGhpbmdzIHR3aWNlLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYik6ICBDYWxjdWxhdGUgZW5kX29mX3RleHRfYWRkcgorCWJhc2VkIG9uIHRleHRfYWRkciAodGhlIGFkZHJlc3Mgb2YgdGV4dCBpbiBjb3JlKSwgbm90IG9uIGFkZHIgKHRoZQorCW9mZnNldCBiZXR3ZWVuIHRleHQgaW4gdGhlIC5vIGZpbGUgYW5kIGluIGNvcmUpLiAgVGhpcyBjaGFuZ2UKKwlpcyBmcm9tIFBldGVyIFNjaGF1ZXIuCisKKwkqIG1haW4uYzogIERlZmluZSBBTExfQ0xFQU5VUFMgYXMgYSBjYXN0IG9mIHplcm8uCisJKHJldHVybl90b190b3BfbGV2ZWwpOiAgVXNlIGl0LgorCShtYWluKTogIERvIGFsbCBjbGVhbnVwcyBhZnRlciBlYWNoIGNvbW1hbmQgcnVuIGFzIHBhcnQKKwlvZiB0aGUgZ2RiIHN0YXJ0dXAgc2VxdWVuY2UuICBBbHNvIGRvIGFsbCBjbGVhbnVwcyBiZWZvcmUKKwllbnRlcmluZyB0aGUgY29tbWFuZCBsb29wLCBhbmQgZXZlcnkgdGltZSB3ZSBleGl0IHRoZSBjb21tYW5kCisJbG9vcCBhbmQgcmVlbnRlci4gIEJlZm9yZSwgdGhlIGNsZWFudXBzIGZyb20gdGhlIHN0YXJ0dXAgc2VxdWVuY2UKKwl3ZXJlIGJlaW5nIGxlZnQgdW5kb25lIHVudGlsIHRoZSBmaXJzdCBlcnJvciEKKwkoY29tbWFuZF9sb29wKTogIFJlbmFtZSBkb19ub3RoaW5nIGNsZWFudXAgdG8gY29tbWFuZF9sb29wX21hcmtlcgorCXNvIHdlIGNhbiBzZWUgaXQgZWFzaWx5IHdoZW4gZXhhbWluaW5nIHRoZSBjbGVhbnVwIGNoYWluLgorCShpbml0X3NpZ25hbHMpOiAgQWRkIGFub3RoZXIgZG9fbm90aGluZyBmb3Igc2lnbmFsIGhhbmRsaW5nLgorCShxdWl0X2NvbW1hbmQpOiAgT25seSB0cnkgdG8ga2lsbCB0YXJnZXQgaWYgaXQgaGFzIGV4ZWN1dGlvbi4KKwlQcm9ibGVtcyBpbiB0aGUgdGFyZ2V0IHN0YWNrIGdvdCB1cyBpbnRvIGEgc3RhdGUgd2hlcmUKKwlpbmZlcmlvcl9waWQgd2FzIG5vbnplcm8gYnV0IG5vbmUgb2YgdGhlIHRhcmdldHMgaGFkIGV4ZWN1dGlvbi4KKwlJbiB0aGlzIHN0YXRlIHlvdSBjb3VsZG4ndCBleGl0IGdkYi4KKworCSogZGJ4cmVhZC5jOiAgVHdvIGNoYW5nZXMgZnJvbSBQZXRlciBTY2hhdWVyLgorCShlY2hvX2NvbW1hbmQpOiAgRmZsdXNoIG91dHB1dCBhZnRlciBhbiBlY2hvIGNvbW1hbmQuCisJKHNob3dfaGlzdG9yeSk6ICBQYXNzIGFsbCBhcmdzIHRvIGNtZF9zaG93X2xpc3QuCisKKwkqIHV0aWxzLmMgKGluaXRfbWFsbG9jKTogIENhbGwgbXRyYWNlIHRvIHR1cm4gb24gdHJhY2luZworCWlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBNQUxMT0NfVFJBQ0UgaXMgc2V0IHRvIGEgZmlsZSBuYW1lLgorCSogbXRyYWNlLmM6ICBBZGQgc291cmNlIGZpbGUgd2hpY2ggcHJvdmlkZXMgYSBsb2cgb2YgZXZlcnkgbWFsbG9jLAorCWZyZWUsIGFuZCByZWFsbG9jIHRvIGEgdHJhY2UgZmlsZS4KKwkqIG10cmFjZS5hd2s6ICBBZGQgc291cmNlIGZpbGUgd2hpY2ggYW5hbHl6ZXMgdGhlIHRyYWNlIGZpbGUuCisJKiBNYWtlZmlsZS5kaXN0IChHTlVfTUFMTE9DLCBNQUxMT0NTUkMpOiAgQWRkIG10cmFjZS57YyxvLGF3a30uCisJKFZFUlNJT04pOiAgUm9sbCB0byAzLjk0LjMuCisKKwkqIGJyZWFrcG9pbnQuYyAoYnJlYWtwb2ludF8xKTogIEFkZCBhIHNwYWNlIHRvICJpIHdhdGNoIiBvdXRwdXQuCisJKGNoZWNrX2R1cGxpY2F0ZXMpOiAgRG9uJ3QgYm90aGVyIHdpdGggd2F0Y2hwb2ludHMuCisJKHNldF9yYXdfYnJlYWtwb2ludCk6ICBDb21tZW50IGFib3V0IGRhbmdlciBvZiB0aGlzIHJvdXRpbmUuCisJKHdhdGNoX2NvbW1hbmQpOiAgUGFyc2UgYW5kIGV2YWwgYWxsIGFyZ3MgYmVmb3JlIGNhbGxpbmcKKwlzZXRfcmF3X2JyZWFrcG9pbnQuCisKKwkqIHNvbGliLmMgKGZpbmRfc29saWIpOiAgQXZvaWQgZXJyb3IgaW4gcmVmZXJlbmNpbmcgbWVtb3J5IHRvCisJc2VlIGlmIGFueSBtb3JlIHNoYXJlZCBsaWJyYXJpZXMgaGF2ZSBiZWVuIGFkZGVkLiAgVGhpcyBpcworCXBhcnRpY3VsYXJseSB1c2VmdWwgaWYgdGhlIHRhcmdldCBoYXMgdGVybWluYXRlZC4gIEJ1ZyByZXBvcnRlZAorCWJ5IFBldGVyIFNjaGF1ZXIuCisKKwlDaGFuZ2VzIGZyb20gUGV0ZXIgU2NoYXVlciA8cGVzcmVtQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+CisJaW4gYnJpbmdpbmcgdXAgMy45NC4yIG9uIHRoZSBTdW4tMy4KKworICAgICAgICAqIE1ha2VmaWxlLmRpc3Q6ICBJbmNsdWRlIENGTEFHUyBpbiBydWxlIGZvciBjcGx1cy1kZW0uby4KKyAgICAgICAgKiBicmVha3BvaW50LmMgKGVuYWJsZV9icmVha3BvaW50KTogIENoZWNrIGZvciB2YWxpZCB3YXRjaHBvaW50CisgICAgICAgIGV4cHJlc3Npb24gKGluIHNjb3BlKSBiZWZvcmUgcmVlbmFibGluZyB3YXRjaHBvaW50LgorCSogc2lnbmFtZS5jIChpbml0X3NpZ3MpOiAgQWRkIG1pc3NpbmcgZGVjbGFyYXRpb24gb2YgaSwgZml4CisJc3lzX3NpZ2xpc3QgZGVjbGFyYXRpb24uCisJKiBzb3VyY2UuYyAobGlzdF9jb21tYW5kKTogIEZpeGVkIHJhbmdlIGNvbXB1dGF0aW9uIHRvIHVzZQorCWxpbmVzX3RvX2xpc3QgKCkuCisJKiBzdGFjay5jIChiYWNrdHJhY2VfY29tbWFuZCk6ICBEbyBub3QgYWxsb3cgY29tbWFuZCBpZiB0YXJnZXQgaGFzCisJbm8gc3RhY2ssIHByaW50IGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2UuCisJKiB0YXJnZXQuYyAodGFyZ2V0X2NvbW1hbmQpOiAgRG8gbm90IHdyaXRlIGludG8gY29tbWFuZCBsaW5lCisJYmVjYXVzZSB0aGlzIGZhaWxzIGlmIHRoZSB0YXJnZXQgY29tbWFuZCBpcyB1c2VkIGluIGEgdXNlciBkZWZpbmVkCisJY29tbWFuZC4gIFtUaGlzIGNoYW5nZSB3YXMgZW5oYW5jZWQgYnkgZ251IHRvIHN1cHBvcnQgYW55LQorCXVuaXF1ZS1wcmVmaXggbWF0Y2hpbmcgb24gdGFyZ2V0IG5hbWVzLl0KKwkqIHZhbG9wcy5jICh2YWx1ZV9zdHJ1Y3RfZWx0KTogIEF2b2lkIGluZmluaXRlIGxvb3Agb24gYW4KKwllcnJvbmVvdXMgYXR0ZW1wdCB0byBwcmludCB0aGUgbWVtYmVyIG9mIGZ1bmN0aW9uICh0cnkgcCBtYWluLnApLgorCitNb24gQXByICAxIDE3OjA1OjQ1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogZXhwcmVhZC55IChuYW1lX25vX3R5cGVuYW1lKTogIEF2b2lkIHJlZHVjZS9yZWR1Y2UgZXJyb3JzCisJY2F1c2VkIGJ5IGFtYmlndWl0eSBpbiBoYW5kbGluZyBOQU1FX09SX0lOVCBhbmQgTkFNRV9PUl9VSU5ULgorCVNpbmNlIHRoZSBHREIgcGFyc2VyIHJlYWxseSBkb2Vzbid0IHVzZSBuYW1lX25vX3R5cGVuYW1lIGluIGEKKwluYW1lLW9ubHkgY29udGV4dCwgdGhlIHBhcnNlciBjYW4ndCB0ZWxsIHRoZSBkaWZmIGJldHdlZW4KKwluYW1lcyBhbmQgbnVtYmVycyBoZXJlLiAgQXZvaWQgYWxsb3dpbmcgYSBuYW1lX25vX3R5cGVuYW1lCisJdG8gYmUgYSBOQU1FX09SXypJTlQgdG8gcmVzb2x2ZSB0aGUgY29uZmxpY3QuCisKK1N1biBNYXIgMzEgMjA6MTI6MDcgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJQnVnZml4ZXMgZnJvbSBNYXJrIEZveCAobWFya2ZAd3JzLmNvbSkgKHRlc3Q9dGVzdEZpZWxkLmMpOgorCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnRfZmllbGRzKTogIGJpdGZpZWxkIHByaW50aW5nIGRpZG4ndCBoYW5kbGUKKwlieXRlIG9yZGVyLiAgSW5kaXJlY3QgdGhyb3VnaCBhIGZldyBtb3JlIGZucyB0byBjb3BlLgorCisJKiB2YWx1ZXMuYyAobW9kaWZ5X2ZpZWxkKTogIGFsc28gY29wZSB3aXRoIGJ5dGUgb3JkZXIuCisKK1NhdCBNYXIgMjMgMTA6MDI6MjEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJQ2xlYW51cCBmb3IgcmVsZWFzZSAzLjk0LjI6CisKKwkqIE1ha2VmaWxlLmRpc3Q6IFB1bGwgUkVNT1RFX09CUy4gIEZpeCBzYWJlciBpbmNsdWRlcyBmb3IgQkZECisJaW5jbHVkZSBmaWxlcy4gIFJvbGwgdmVyc2lvbiB0byAzLjk0LjIuCisJCisJKiBjb2ZmcmVhZC5jIChpbml0X3N0cmluZ3RhYik6ICBSZWFkIGxlbmd0aCBpbnRvIHVuc2lnbmVkIGNoYXIKKwlhcnJheSBiZWZvcmUgc3dhcHBpbmc7IGRvbid0IGFzc3VtZSAzMi1iaXQgbG9uZ3MuCisKKwkqIHRhcmdldC5jICh0YXJnZXRfaW5mbyk6IERvbid0IGJvdGhlciB3aXRoIGdldF9zeW1fZmlsZSwganVzdCB1c2UKKwl0aGUgc3ltZmlsZSBnbG9iYWwgdmFyaWFibGUuCisJKiBzeW10YWIuaCwgc3ltZmlsZS5jIChnZXRfc3ltX2ZpbGUpOiAgRGVsZXRlIGl0LgorCisJKiBkYnhyZWFkLmMgKGRieF9zeW1maWxlX2luaXQpOiAgRG9uJ3QgZGVwZW5kIG9uIGxvbmcgPT0gNCBieXRlcy4KKwkoZGVmaW5lX3N5bWJvbCk6ICBTZXQgc3ltYm9sIGxpbmUgbnVtYmVyIHRvIDAgaWYgbm90IGdjYy1jb21waWxlZC4KKwkocmVhZF90eXBlKTogIFJlcGxhY2Ugb25lIG1vcmUgZXJyb3IoKSB3aXRoIGNvbXBsYWluKCkuCisKKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6ICBSZXBsYWNlIHByaW50ZiB3aXRoIGNvbXBsYWluLgorCisJKiBpOTYwLXRkZXAuYzogIEZpeCBjb3B5cmlnaHQgYXR0cmlidXRpb24uCisKKwkqIGNvbmZpZy5nZGI6ICBRdW90ZSBhbGwgYmFja3F1b3RlcyBpbiBkb3VibGVxdW90ZXMuICBZb3UgY2FuCisJcXVvdGUgbWUgb24gdGhhdC4gIEJTRCA0LjQgc2hlbGwgZm91bmQgdGhpcyBvbmUuCisKKwkqIGluZnB0cmFjZS5jICh0aHJvdWdob3V0KTogIFRoZSB0aGlyZCBhcmd1bWVudCB0byBwdHJhY2UgaXMgYW4KKwlpbnQgKiwgbm90IGFuIGludC4KKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogIFdoZW4gcHJvZ3JhbSBoYXMgdGVybWluYXRlZCwgd2UKKwloYXZlIHRvIGNhbGwgdGFyZ2V0X3Rlcm1pbmFsX291cnMgYmVmb3JlIHdlIHBvcCB0aGF0IHRhcmdldCBvZmYKKwl0aGUgc3RhY2sgKGUuZy4gYmVmb3JlIGEgY2FsbCB0byB0YXJnZXRfa2lsbCBvcgorCXRhcmdldF9tb3Vybl9pbmZlcmlvcikuICBUaGlzIGZpeGVzIHByb2JsZW0gd2hlcmUgYSBwcm9ncmFtCisJdGVybWluYXRlcywgdGhlbiBHREIgc3RvcHMgZm9yICh0dHkgb3V0cHV0KSBhbmQgeW91IGhhdmUgdG8gdHlwZQorCSJmZyIgdG8gdGhlIHNoZWxsIHRvIHJlc3VtZSBpdC4gIEZJWE1FOiAgVGhpcyBjb2RlIGZvciB3aGF0IHRvCisJZG8gYWZ0ZXIgdGVybWluYXRpb24gcmVhbGx5IHNob3VsZCBiZSBpbiBub3JtYWxfc3RvcCBpbnN0ZWFkLgorCisJKiBnZGJjb3JlLmggKHJlYWRfbWVtb3J5X2NoZWNrKTogIENoYW5nZSBkZWNsYXJhdGlvbjsgaXQgY2hhbmdlZAorCW5hbWVzIG1vbnRocyBhZ28uCisKKwkqIHRlcm1pbmFsLmg6ICBJbmNsdWRlIDxzZ3R0eS5oPiBiZWZvcmUgPHN5cy9pb2N0bC5oPiwgc2luY2UgaW4gQlNECisJNC40IHByZXJlbGVhc2VzLCB0aGlzIGF2b2lkcyBhIGJ1ZyBpbiB0aGVpciBzZ3R0eSBjb21wYXRhYmlsaXR5CisJc3VwcG9ydC4KKwkqIHJlbW90ZS5jOiAgVXNlIHRlcm1pbmFsLmggcmF0aGVyIHRoYW4gaGFuZC1yb2xsaW5nIHRoZSBzYW1lLgorCisJKiBzaWduYW1lLmMsIHNpZ25hbWUuaCAocHNpZ25hbCk6ICBBcmcgaXMgdW5zaWduZWQsIG5vdCBpbnQuCisJKiB1dGlscy5jIChzdHJzYXZlLCBzdHJzdHIpOiAgRml4IGFyZyB0eXBlcy4KKwkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6ICBsaW50CisKKwlNSVBTIHN5bWJvbCB0YWJsZSBzdXBwb3J0IGZyb20gUGVyIEJvdGhuZXI6CisKKwkqIHN5bWZpbGUuYyAoc3ltdGFiX2Zucyk6ICBSZW1vdmUgaW5pdGlhbGl6ZXIgdGFibGUgdGhhdCBuZWVkcyB0bworCWJlIGhhY2tlZCBmb3IgZWFjaCBuZXcgc3ltYm9sIGZpbGUgZm9ybWF0IHN1cHBvcnRlZC4KKwkoYWRkX3N5bXRhYl9mbnMpOiAgTmV3IGZ1bmN0aW9uLCBjaGFpbnMgc3ltYm9sIHRhYmxlCisJaGFuZGxlcnMgaW50byB0aGUgZ2xvYmFsIGxpc3QuCisJKHN5bWZpbGVfaW5pdCk6ICBTZWFyY2ggdGhpcyBsaXN0LgorCSogc3ltZmlsZS5oOiAgQWRkIG5leHQgcG9pbnRlciwgZGVjbGFyZSBhZGRfc3ltdGFiX2Zucy4KKwkqIGNvZmZyZWFkLmMgKF9pbml0aWFsaXplX2NvZmZyZWFkKTogQ2FsbCBhZGRfc3ltdGFiX2Zucy4KKwkqIGRieHJlYWQuYyAoX2luaXRpYWxpemVfZGJ4cmVhZCk6ICBDYWxsIGFkZF9zeW10YWJfZm5zLgorCisJKiBtaXBzcmVhZC5jIChwc3ltdGFiX3RvX3N5bXRhYl8xKTogcmV0dXJuIHZvaWQgaW5zdGVhZCBvZiAoc3RydWN0CisJc3ltYm9sICopLiAgVGh1cywgd2Ugbm8gbG9uZ2VyIG5lZWQgdGhlIGhhY2sgdG8gdHJhc2gKKwlwc3QtPmZpbGVuYW1lLiAgR29vZCwgc2luY2UgdGhhdCBoYWNrIGNvbmZ1c2VkIGNvZGUgaW4gc3ltZmlsZS5jIQorCisJKHJlb3JkZXJfc3ltdGFicywgZGVzdHJveV9hbGxfc3ltdGFicyk6ICBSZW1vdmVkIHN0YXRpYworCWFsbF9zeW10YWJzLCB3aGljaCB3YXMgdXNlZCB0byBxc29ydCBzeW10YWJzIGluIHJlb3JkZXJfc3ltdGFicy4KKwlJbnN0ZWFkLCB0aGUgbGF0dGVyIG5vdyB1c2VzIGEgdGVtcG9yYXJ5IGFycmF5IChzdGFjay1hbGxvY2F0ZWQKKwlmcm9tIGFuIG9ic3RhY2ssIGFuZCB0aGVuIGZyZWVkKS4KKworCShwYXJzZV9zeW1ib2wpOiAgQWRkZWQgYSBoYWNrIHRvIGZpeCB1cCBCTE9DS197U1RBUlQsRU5EfSBpZiB0aGV5CisJaGF2ZW4ndCBiZWVuIHNldCBpbiB0aGUgb3V0ZXJtb3N0IHN0QmxvY2sgb2YgYSBwcm9jZWR1cmUuIFRoaXMgd2FzCisJYSBwcm9ibGVtIHdpdGggZjc3IGJpbmFyaWVzIG9uIFVsdHJpeCA0Lj8uCisKKwkobmV3X3N5bXRhYiwgbmV3X3N5bWJvbCwgbmV3X3R5cGUpOiAgQ29udGludWUgY2hhbmdpbmcgY29kZSB0byB1c2UKKwlvYnN0YWNrcyBtb3JlIGFuZCBvdGhlcndpc2UgY29uZm9ybSB0byBkYnhyZWFkIGludGVybmFsIHN0eWxlLgorCU1hZGUgdGhlIGZyZWVfY29kZSBvZiBzeW10YWJzIGJlIGZyZWVfbGluZXRhYmxlIChhcyBpbiBkYnhyZWFkKQorCWluc3RlYWQgb2YgZnJlZV9jb250ZW50cy4gIFRoaXMgaW1wbGllcyBtZW1vcnkgbGVha3Mgd2hlbiByZWFkaW5nCisJYSBuZXcgc3ltYm9sIHRhYmxlLCB1bnRpbCB0aGUgY29udmVyc2lvbiBpcyBmaW5pc2hlZC4gRGlkIGNoYW5nZQorCShzdHJ1Y3Qgc3ltYm9sKSBhbmQgKHN0cnVjdCB0eXBlKSB0byBiZSBhbGxvY2F0ZWQgb24gdGhlCisJc3ltYm9sX29ic3RhY2suICBCbG9ja3MgYW5kIGJsb2NrdmVjdG9ycyBhcmUgYW1vbmcgdGhlIHRoaW5ncworCXN0aWxsICJsZWFraW5nLiIKKworCSogbWlwc3JlYWQuYyAocGFyc2VfcGFydGlhbF9zeW1ib2xzLCBwYXJzZV9mZHIpOiAgSXQgaGFzbid0IGJlZW4KKwl0ZXN0ZWQgbXVjaCwgYnV0IGl0IHNvbHZlZCBvbmUgcHJvYmxlbSAocmVwb3J0ZWQgYnkgTWVpc3NuZXIpLCBhbmQKKwljbGVhbnMgdXAgc29tZSBvdGhlciB0aGluZ3MuICBUaGUgcHJvYmxlbSBoYXBwZW5lZCB3aGVuIGFuCisJaW5jbHVkZWQgZmlsZSBjb250YWlucyBhY3R1YWwgY29kZSAoZnVuY3Rpb25zKSBhbmQgbm90IGp1c3QKKwlkZWZpbml0aW9ucy4gVGhlIG1pcHMgY29mZiBpcyBhIGxpdHRsZSBpbmNvbnZlbmllbnQgdGhlcmUsIHNpbmNlCisJaXQgbWF5IGNhdXNlIGEgcHJvY2VkdXJlIHRvIGJlIG1hcHBlZCB0byB0aGUgd3JvbmcgcHN5bXRhYi4KKworCSogbWlwcy10ZGVwLmMgKGhldXJpc3RpY19wcm9jX2Rlc2MpOiAgTWlub3IgY2xlYW51cC4KKwkqIG1pcHMteGRlcC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6ICBNaW5vciBjbGVhbnVwLiAgRklYTUUsCisJdGhpcyB3aWxsIG5lZWQgd29yayBmb3IgdGhlIG5ldyBjb3JlIHBhcmFkaWdtLgorCisJT3Bjb2RlIHBhdGNoZXMgZnJvbSB0aGUgbmV0OgorCisJKiBtaXBzLW9wY29kZS5oOiBmaXggaW5jb3JyZWN0IGRpc2Fzc2VtYmx5IG9mIHRoZSBtZmMxLCBjZmMxLCBhbmQKKwljdGMxIGluc3RydWN0aW9ucy4gQWxzbywgdGhlIGN2dC5kLncgYW5kIGN2dC5zLncgaW5zdHJ1Y3Rpb25zIHdlcmUKKwltaXNzaW5nIGFsdG9nZXRoZXIgLSB0aGV5IGFyZSBhZGRlZCBoZXJlLiAgRnJvbSBCcnVjZSBCYXVtYW4uCisJKiBtaXBzLW9wY29kZS5oOiAgVGhlIGxvdyBtYXNrIGZvciBDMCBpbnN0cnVjdGlvbnMgd2FzIHRvbyBzbWFsbC4KKwlGcm9tIEdhcnJldHQgTGF1LiAgSSBtb2RpZmllZCB0aGUgZml4IHRvIGNoZWNrIHRoZSBlbnRpcmUgMzItYml0CisJb3Bjb2RlLgorCisJKiBuczMyay1vcGNvZGUuaDogIEZpeCBvcGNvZGVzIGZvciBkZWl3IGFuZCBkZWlkLiAgRnJvbSBCcnVjZQorCUJhdW1hbi4KKworVGh1IE1hciAyMSAxMjo1Njo0NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwlSb2xsIGluIGNoYW5nZXMgZnJvbSBQZXIgQm90aG5lciAoVHVlLCAyNSBTZXAgOTAgMTE6MTE6MDQpOgorCisJKiBkYnhyZWFkLmMgKHJlYWRfdHlwZSk6IFBvaW50ZXIgc3VidHJhY3Rpb24gKHZhbHVlX3N1YiBpbgorCXZhbGFyaXRoLmMpIHNvbWV0aW1lcyBmYWlsZWQgYmVjYXVzZSB0aGUgdHlwZXMgb2YgdGhlCisJIHBvaW50ZXJzIGJlaW5nIHN1YnRyYWN0ZWQgd2VyZSBub3QgaWRlbnRpY2FsLgorCVRoZXNlIGRpZmZlcmVkIGJlY2F1c2UgZGJ4cmVhZC5jIHdhcyBhbGxvY2F0aW5nIHBvaW50ZXIgdHlwZXMKKwl1c2luZyBkYnhfYWxsb2NfdHlwZStzbWFzaF90b19wb2ludGVyX3R5cGUgaW5zdGVhZCBvZgorCWxvb2t1cF9wb2ludGVyX3R5cGUuIEkgZmFpbGVkIHRvIGZpbmQgYSBqdXN0aWZpY2F0aW9uIGZvciB0aGUKKwlmb3JtZXIsIHNvIEkgY2hhbmdlZCBpdCB0byB1c2UgdGhlIGxhdHRlci4gU2ltaWxhcmx5LCBJCisJcmVwbGFjZWQgc21hc2hfdG9fZnVuY3Rpb25fdHlwZSBieSBsb29rdXBfZnVuY3Rpb25fdHlwZSwKKwlhbmQgc21hc2hfdG9fcmVmZXJlbmNlX3R5cGUgYnkgbG9va3VwX3JlZmVyZW5jZV90eXBlLgorCisJKiBtaXBzcmVhZC5jIChwYXJzZV9zeW1ib2wsIHVwZ3JhZGVfdHlwZSwgcGFyc2VfcHJvY2VkdXJlLCAKKwlfaW5pdGlhbGl6ZV9taXBzcmVhZCk6ICBjb3JyZXNwb25kaW5nIGNoYW5nZXMuCisKKwkqIHN5bXRhYi5jIChzbWFzaF90b197cG9pbnRlcixyZWZlcmVuY2UsZnVuY3Rpb259X3R5cGUpOiBlbGltaW5hdGUuCisKKwkqIHNvdXJjZS5jIChtb2RfcGF0aCk6IERvIHRpbGRlX2V4cGFuZCBvbiBlYWNoIGNvbXBvbmVudCBvZiB0aGUgcGF0aCwKKwlyYXRoZXIgdGhhbiBvbiB0aGUgKGxpc3Qgb2YpIHBhdGhzIGFzIGEgd2hvbGUuCisJKHByaW50X3NvdXJjZV9saW5lcyk6ICBTZXQgZmlyc3RfbGluZV9saXN0ZWQgaW4gYWRkaXRpb24gdG8KKwljdXJyZW50X3NvdXJjZV9zeW10YWIgYW5kIGN1cnJlbnRfc291cmNlX2xpbmUuICBJZiB0aGUgc291cmNlIHdhcworCW5vdCBmaW5kYWJsZSwgYWZ0ZXIgYSAiZGlyIiBjb21tYW5kIHRvIGZpeCB0aGUgcHJvYmxlbSwKKwlhICJsaXN0IiB3b3VsZCBnZXQgdGhlIHdyb25nIGxpbmVzLgorCisJV2hpbGUgSSB3YXMgdGhlcmUuLi4gKGdudSk6CisKKwkqIGRieHJlYWQuYyAocmVhZF90eXBlKTogIENoYW5nZSBlcnJvciB0byBjb21wbGFpbnQuCisKK1RodSBNYXIgMjEgMTI6NTY6NDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJRmlyc3QgYXR0ZW1wdCBhdCBkZXRhaWxlZCB1bmRlcnN0YW5kaW5nIG9mIHN5bWJvbCB0YWJsZSBtZW1vcnkgYWxsb2MuCisKKwkqIGRieHJlYWQuYyAoZGJ4X3N5bWZpbGVfcmVhZCk6ICBGcmVlIG91ciBzdHJpbmcgdGFibGUgaWYgd2UKKwlhcmVuJ3QgdGhlIG1haW5saW5lLiAgRnJlZSB0aGUgImluZm8iIHN0cnVjdCBzaW5jZSB3ZSdyZSBkb25lIHdpdGgKKwlpdC4gCisJKGluaXRfcHN5bWJvbF9saXN0KTogIEZyZWUgYW55IHByZXZpb3VzbHkgYWxsb2NhdGVkIHBzeW1ib2wgbGlzdHMuCisJKCk6IEZJWE1FOiBTaG91bGQgcmVhbGxvYy1kb3duIHRoZSBwc3ltYm9sIGxpc3RzIHdoZW4gZG9uZSByZWFkaW5nCisJdGhlIG1haW4gc3ltYm9sIGZpbGU/CisKKwkqIHN5bW1pc2MuYyAoZnJlZV9zeW10YWIpOiAgRnJlZSBmdWxsbmFtZSBmaWVsZCB0b28uCisKKwkqIHhtLWhwMzAwaHB1eC5oIChVU0cpOiAgI3VuZGVmIHRoZW4gI2RlZmluZSBzbyBNYWtlZmlsZSBjYW4gLUQuCisJKFJFR0lTVEVSX0FERFIpOiAgTWFrZSByZXN1bHQgdHlwZSB1bnNpZ25lZCBpbnQuCisKKwkqIHhjb25maWcve2kzODYqLGhwMzAwaHB1eCxhbHRvc2dhcyxhbHRvc306ICBBbGwgY29uZmlnIGZpbGVzIHRoYXQKKwlkZWZpbmUgUkVHRVggbXVzdCBhbHNvIGRlZmluZSBSRUdFWDEgKGl0cyBkZXBlbmRlbmN5KS4KKworVHVlIE1hciAxOSAyMToyODo1NyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIHRjb25maWcvaTk2MDogIE5vIGxvbmdlciB3b3JrcywgcG9pbnRzIHlvdSBhdCB2eHdvcmtzOTYwIG9yCisJbmluZHk5NjAuCisKKwkqIHhnZGIuYywgWEdEQi1SRUFETUU6ICBSZW1vdmUgZmlsZS4gIFVzZXJzIGNhbiBnZXQgdGhlIG11Y2gKKwliZXR0ZXIgeHhnZGIuCisJKiBNYWtlZmlsZS5kaXN0OiAgUmVtb3ZlIGFsbCB0cmFjZSBvZiB4Z2RiLgorCisJKiBicmVha3BvaW50LmMgKGJyZWFrcG9pbnRfMSk6ICBQYXNzIGRlbWFuZ2xlIGFyZyB0bworCXByaW50X2FkZHJlc3Nfc3ltYm9saWMuCisJKGNsZWFyX2JyZWFrcG9pbnRzKTogIFJlbW92ZSB1bnVzZWQgZnVuY3Rpb24uCisJKGJyZWFrcG9pbnRfcmVfc2V0X29uZSk6ICBHdXRzIG9mIGJyZWFrcG9pbnRfcmVfc2V0LgorCShicmVha3BvaW50X3JlX3NldCk6ICBVc2UgY2F0Y2hfZXJyb3JzIHRvIGRvIHRoZW0gYWxsIGFueXdheS4KKworCSogZ2RiLWludC50ZXhpbmZvIChIb3N0IHZlcnN1cyBUYXJnZXQpOiAgQWRkIHNlY3Rpb24gb24gd2hhdCBpcworCWEgImhvc3QiIGZlYXR1cmUgdmVyc3VzIHdoYXQgaXMgYSAidGFyZ2V0IiBmZWF0dXJlLgorCisJKiBpbmZjbWQuYyAocGF0aF9jb21tYW5kLCBwYXRoX2luZm8pOiAgSGFuZGxlIHRoZSBQQVRIIHZhcmlhYmxlCisJKG9iamVjdCBzZWFyY2ggcGF0aCkgYXMgY29udmVuaWVudGx5IGFzIHRoZSBzb3VyY2Ugc2VhcmNoIHBhdGguCisJKiBlbnZpcm9uLmMgKHNldF9pbl9lbnZpcm9uKTogIFNldCBzb21lIHZhcnMgaW4gR0RCJ3MgZW52aXJvbm1lbnQsCisJaW4gYWRkaXRpb24gdG8gdGhlIGNoaWxkJ3MuICBQQVRILCBHOTYwQkFTRSwgRzk2MEJJTiBmb3Igc3RhcnRlcnMuCisJKiBzb3VyY2UuYyAobW9kX3BhdGgpOiAgTmV3IGZ1bmN0aW9uLCBmcm9tIGd1dHMgb2YKKwlkaXJlY3RvcnlfY29tbWFuZCwgbW9kaWZpZXMgYSBwYXRoLiAgVXNlZCBieSBwYXRoX2NvbW1hbmQuCisJKGRpcmVjdG9yeV9jb21tYW5kKTogIENhbGwgaXQuCisJKiBkZWZzLmggKHN0cnNhdmUpOiAgRGVjbGFyZS4KKworCSogdXRpbHMuYyAoc2V2ZW5iaXRfc3RyaW5ncyk6ICBBZGQgbmV3IHByaW50aW5nIG9wdGlvbi4KKwkocHJpbnRjaGFyKTogIFVzZSBpdC4KKwkoc3Ryc2F2ZSk6ICBQcm92aWRlIHRoaXMgaGFuZHkgaGVscGVyIHJvdXRpbmUuCisJKHNldF93aWR0aF9jb21tYW5kKTogIFJlbmFtZSBzZXRfc2NyZWVuX3dpZHRoX2NvbW1hbmQuCisJKF9pbml0aWFsaXplX3V0aWxzKTogICJzZXQgc2NyZWVuLXdpZHRoIiA9PiAic2V0IHdpZHRoIjsKKwkic2V0IHNjcmVlbi1oZWlnaHQiID0+ICJzZXQgaGVpZ2h0IjsgYWRkIHNldmVuYml0LXN0cmluZ3MuCisKKwkqIGluZmNtZC5jIChkb19yZWdpc3RlcnNfaW5mbyk6ICBQcmludCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMKKwlpbiByYXcgaGV4IGFzIHdlbGwgYXMgZmxvYXQgZm9ybWF0LCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMKKwlhICJ2aXJ0dWFsIiBjb252ZXJ0aWJsZSByZWdpc3Rlci4KKwkqIHRtLXNwYXJjLmggKFBSSU5UX1JFR0lTVEVSX0hPT0spOiAgUHJpbnQgZXZlcnkgcGFpciBvZiBmbG9hdAorCXJlZ3MgYXMgYSBkb3VibGUsIGp1c3QgaW4gY2FzZSBpdCdzIGJlaW5nIHVzZWQgdGhhdCB3YXkuCQorCSogdmFsdWVzLmMgKHVucGFja19sb25nKTogIENvbW1lbnQgb24gYXJyYXkvZnVuY3Rpb24gY29lcmNpb24uCisJKHVucGFja19kb3VibGUpOiAgQXJndW1lbnQgaXMgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIgbm93LiAgRm9yCisJaW50ZWdlciBhcmd1bWVudHMsIGp1c3QgY2FsbCB1bnBhY2tfbG9uZyBhbmQgZmxvYXQgdGhlIHJlc3VsdC4KKwkqIG02OGstdGRlcC5jOiBpbmNsdWRlIGRlZnMuaCBmb3IgImNvbnN0IiBoYW5kbGluZy4KKwkqIHJlbW90ZS1uaW5keS5jOiAgVXNlIGllZWUtZmxvYXQgc3R1ZmYuCisJKG5pbmR5X2ZldGNoX3JlZ2lzdGVycyk6ICBVbnBhY2sgZG91YmxlIHJlZ3MgdG8gaG9zdCBkb3VibGUsIHRoZW4KKwl0byBleHRlbmRlZC4KKwkobmluZHlfc3RvcmVfcmVnaXN0ZXJzKTogIFBhY2sgZXh0ZW5kZWRzIHRvIGhvc3QgZG91YmxlLCBmbGlwCisJYXJvdW5kIGJ5IG1pc3VzaW5nIHVucGFja19kb3VibGUsIHNlbmQgYXMgdGFyZ2V0IGRvdWJsZS4KKworCSogdG0tdnh3b3JrczY4LmggKEZSQU1FX0NIQUlOKTogIEhhbmRsZSBjdXJyZW50IGZyYW1lIHBvaW50ZXIgb2YKKwl6ZXJvLCBhcyB3aGVuIHN0b3BwZWQgYXQgdGhlIGZpcnN0IGluc3RydWN0aW9uIG9mIGEgcHJvY2Vzcy4KKworCSogYmxvY2tmcmFtZS5jOiAgRml4IGZpbGVuYW1lIGluIGNvbW1lbnQgKHBhcmFtLmggPT4gdG0uaCkuCisJKiBzcGFyYy10ZGVwLmMgKHNraXBfcHJvbG9ndWUpOiAgTW9yZSBleHBsaWNpdCBudWRnaW5nIGNvbW1lbnRzLgorCSogdG0tNjhrLmg6ICBGaXggdHlwb3MuCisKK0ZyaSBNYXIgMTUgMDE6MDk6MzQgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJQ2hhbmdlcyBmcm9tIGEgYnJpbmd1cCBvbiB0aGUgREVDIFZheCB1bmRlciBVbHRyaXggNC4wLgorCisJKiBjb3JlZGVwLmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogIFBhc3MgZW5kLWFkZHJlc3Mgb2YgcmVnaXN0ZXIKKwlzZWN0aW9uIHRvIHJlZ2lzdGVyX2FkZHIgYXMgZXhwZWN0ZWQuICBEb24ndCBjYWxsIHN1cHBseV9yZWdpc3RlcgorCWlmIHdlJ2QganVzdCBwYXNzIGl0IGdhcmJhZ2UuCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogIFNraXAgTl9OU1lNUyBvbiBVbHRyaXguCisKKwkqIGV4ZWMuYyAoeGZlcl9tZW1vcnkpOiAgVXNlIGJvb2xlYW4geGZlcl9mbiByZXN1bHQsIG5vdCBpbnQuCisKKwkqIHRhcmdldC5jIChwdXNoX3RhcmdldCwgdGFyZ2V0X2luZm8pOiAgQ2FzdCBlbnVtcyB0byBpbnQgZm9yIDwgb3IKKwk+IGNvbXBhcmlzb24uCisKKwkqIHN0YWNrLmMgKHByaW50X2ZyYW1lX2luZm8pOiAgSWRlbnRpZnkgc291cmNlIGZpbGUgJiBsaW5lCisJZXZlbiBpZiB3ZSBjYW4ndCBwcmludCBpdC4KKworCSogeG0tdmF4LmggKE1JU1NJTkdfVlBSSU5URik6ICBObyBsb25nZXIgbWlzc2luZyBpbiBVbHRyaXggVjQuMC4KKworU2F0IE1hciAgOSAxMDowODoyMCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwlDbGVhbiB1cCBJRUVFIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQuCisKKwkqIGllZWUtZmxvYXQuaDogIE5ldyBmaWxlLgorCSogaWVlZS1mbG9hdC5jOiAgV3JpdGUgcmVhbCByb3V0aW5lcyB0byBjb252ZXJ0IGJldHdlZW4gaG9zdAorCWRvdWJsZXMgYW5kIHZhcmlvdXMgdGFyZ2V0IElFRUUgZXh0ZW5kZWRzLgorCSogbTY4ay14ZGVwLmM6ICBFbGltaW5hdGUgYXNzZW1ibGVyIGNvZGUgZm9yIGV4dGVuZGVkIGZsb2F0cy4KKwkqIHhjb25maWcvezNiMSxhbHRvcyxhbHRvc2dhcyxocDMwMGJzZCxpc2ksbmV3cyxuZXdzMTAwMCxzdW4yb3MzLAorCXN1bjJvczQsc3VuMyxzdW4zb3MzLHN1bjNvczR9OiAgRWxpbWluYXRlIHVzZSBvZiBtNjhrLXhkZXAuby4KKwkqIHRtLWk5NjAuaCwgdG0tNjhrLmggKFJFR0lTVEVSX0NPTlZFUlRfVE9fVklSVFVBTCwKKwlSRUdJU1RFUl9DT05WRVJUX1RPX1JBVyk6ICBVc2UgaWVlZV9leHRlbmRlZF90b19kb3VibGUgYW5kCisJZG91YmxlX3RvX2llZWVfZXh0ZW5kZWQuCisJKiBpOTYwLXRkZXAuYzogIERlZmluZSBleHRfZm9ybWF0X2k5NjAuCisJKiBtNjhrLXRkZXAuYzogIERlZmluZSBleHRfZm9ybWF0XzY4ODgxLgorCSogc3BhcmMtdGRlcC5jOiAgRGVmaW5lIGV4dF9mb3JtYXRfc3BhcmMsIHRob3VnaCB1bnVzZWQuCisJKiBNYWtlZmlsZS5kaXN0IChIRklMRVMpOiAgQWRkIGllZWUtZmxvYXQuaC4KKwkqIGluZnRhcmcuYzogI2luY2x1ZGUgImllZWUtZmxvYXQuaCIgZm9yIHRoZSBSRUdJU1RFUl9DT05WRVJUCisJbWFjcm9zLgorCisJT2Jzb2xldGUgdGhlICJjb2Zmc3RyaXAiIHByb2dyYW0gaW4gZmF2b3Igb2YgdXNpbmcgQkZEJ3Mgc3RyaXAuCisKKwkqIG5pbmR5LXNoYXJlL2NvZmZzdHJpcC5jOiAgUmVtb3ZlIGZpbGUuCisJKiBuaW5keS1zaGFyZS9uaW5keS5jIChjb2Zmc3RyaXApOiAgUm91dGluZSB0byBydW4gYmZkX3N0cmlwLgorCSogTWFrZWZpbGUuZGlzdDogIFJlbW92ZSByZWZlcmVuY2VzIHRvIG5pbmR5LXNoYXJlL2NvZmZzdHJpcC5jLgorCSogdGNvbmZpZy9uaW5keTk2MDogIFJlbW92ZSByZWZlcmVuY2UgdG8gY29mZnN0cmlwLm8uCisKKwkqIE1ha2VmaWxlLmRpc3Q6ICBSb2xsIHZlcnNpb24gbnVtYmVyIHRvIDMuOTQuMSAobm90IHlldCBmaW5hbCkuCisKK1dlZCBNYXIgIDYgMDk6NTY6NDUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBzeW1maWxlLmg6ICBBZGQgc3ltZmlsZV9iZmQsIGNvbW1vbiBiZXR3ZWVuIGRieHJlYWQgYW5kIGNvZmZyZWFkLgorCSogZGJ4cmVhZC5jOiAgUmVtb3ZlIHN0YXRpYyBzeW1maWxlX2JmZC4KKwkqIGluZmNtZC5jIChkb19yZWdpc3RlcnNfaW5mbyk6ICBBZGQgUFJJTlRfUkVHSVNURVJfSE9PSywgdGhvdWdoCisJaXQgaXMgbm90IHVzZWQgeWV0LgorCSogaW5mdGFyZy5jIChjaGlsZF9kZXRhY2gpOiAgUG9wIHRoZSBjaGlsZF9vcHMgdmVjdG9yIGlmIHRoZQorCWRldGFjaCBpcyBzdWNjZXNzZnVsLgorCSogcmVtb3RlLW5pbmR5LmMgKG5pbmR5X2NyZWF0ZV9pbmZlcmlvcik6ICBEb24ndCBwdXNoIGEgbmV3CisJbmluZHlfb3BzIHNpbmNlIG5pbmR5IHVzZXMgdGhlIHNhbWUgb25lIGZvciBleGVjdXRpb24gYW5kIG1lbW9yeQorCWV4YW1pbmF0aW9uIGFueXdheS4KKwkqIGNvcmUuYyAoY29yZV9vcHMpOiAgVXNlIGNoaWxkX2F0dGFjaCBhbmQgY2hpbGRfY3JlYXRlX2luZmVyaW9yCisJcmF0aGVyIHRoYW4gZGVmYXVsdCBhdHRhY2ggYW5kIGNyZWF0ZV9pbmZlcmlvciBmdW5jdGlvbnMuCisKKwlIYW5kbGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGluIGNvcmUgZmlsZXMuCisKKwkqIHNwYXJjLXhkZXAuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiAgUmV3cml0ZSBmb3IgZmxvYXQgc3VwcG9ydC4KKwkqIHN1bjMteGRlcC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6ICBSZXdyaXRlIGZvciBmbG9hdCBzdXBwb3J0LgorCVRoaXMgdmVyc2lvbiB1bnRlc3RlZCBzaW5jZSBCRkQgZG9lc24ndCB5ZXQgc3VwcG9ydCBzdW4zIGNvcmUKKwlmaWxlcy4KKwkqIGhwMzAwaHB1eC14ZGVwLmM6ICBSZXdyaXRlIGZldGNoX2NvcmVfcmVnaXN0ZXJzIHRvIG5ldyBjYWxsaW5nCisJY29udmVudGlvbnMuICBGaXggY29tbWVudHMgYW5kIHN0eWxlLiAgVGhpcyB2ZXJzaW9uIGhhcyBub3QKKwliZWVuIGNvbXBpbGVkIHlldCwgc2luY2Ugd2UgaGF2ZSBubyBIUCBpbmhvdXNlLgorCSogY29yZS5jIChnZXRfY29yZV9yZWdpc3RlcnMpOiAgTG9vayBmb3IgdHdvIHNlY3Rpb25zLCAiLnJlZyIKKwlhbmQgIi5yZWcyIiwgYW5kIHBhc3MgYm90aCB0byBmZXRjaF9jb3JlX3JlZ2lzdGVycyBzZXF1ZW50aWFsbHkuCisKKwlSZXZpc2UgZGlyZWN0b3J5IHBhdGggeWV0IGFnYWluLgorCisJKiBzb3VyY2UuYyAoZm9yZ2V0X2NhY2hlZF9zb3VyY2VfaW5mbyk6ICBOb3Qgc3RhdGljIGFueSBtb3JlLgorCShpbml0X3NvdXJjZV9wYXRoKTogIE5ldyBkZWZhdWx0IHNvdXJjZSBwYXRoIGlzICIkY2RpcjokY3dkIi4KKwkoZGlyX2NvbW1hbmQpOiAgSGFuZGxlIHZhcmlhYmxlIGFyZ3VtZW50cyAoJGNkaXIsICRjd2QpLgorCShzb3VyY2VfaW5mbyk6ICBQcmludCAiQ29tcGlsYXRpb24gZGlyZWN0b3J5IiByYXRoZXIgdGhhbgorCSJPcmlnaW5hbGx5IGNvbXBpbGVkIGluIiB0byByZW1pbmQgcGVvcGxlIG9mICRjZGlyLgorCShvcGVucCk6ICBJZiB0aGUgcGF0aCBjb250YWlucyAkY3dkLCB1c2UgY3VycmVudCBkaXJlY3RvcnkuCisJKG9wZW5fc291cmNlX2ZpbGUpOiAgSWYgY29tcGlsYXRpb24gZGlyZWN0b3J5IGlzIGtub3duLCByZXBsYWNlCisJZmlyc3QgJGNkaXIgaW4gcGF0aCB3aXRoIHRoZSBjb21waWxhdGlvbiBkaXJlY3RvcnkuCisJKHByaW50X3NvdXJjZV9saW5lcyk6ICBFdmVuIGlmIHdlIGNhbid0IHByaW50IHRoZSBsaW5lcywgc2V0IHRoZQorCWN1cnJlbnQgc3ltdGFiIGFuZCBsaW5lIGZvciBmdXR1cmUgY29tbWFuZHMgbGlrZSAiaW5mbyBzb3VyY2UiIG9yCisJImJyZWFrcG9pbnQiLiAgQWxzbywgZXJyb3IgbWVzc2FnZSBub3cgY29udGFpbnMgdGhlIGZpbGUgbmFtZSwKKwlsaW5lIG51bWJlciwgYW5kIGZpbGUgYWNjZXNzIGVycm9yIG1lc3NhZ2UuCisJKF9pbml0aWFsaXplX3NvdXJjZSk6ICBGaXggaGVscCB0ZXh0IHRvIGRlc2NyaWJlIGNoYW5nZXMuCisJKiBtYWluLmMgKGNkX2NvbW1hbmQpOiAgRm9yZ2V0IGNhY2hlZCBzb3VyY2UgaW5mbyB3aGVuIHdlIGNoZGlyLgorCSogdXRpbHMuYyAoc3Ryc3RyKTogIEFkZCBzaW1wbGUgaW1wbGVtZW50YXRpb24uCisKK1R1ZSBNYXIgIDUgMDE6NDE6NDAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIGNvZmZyZWFkLmMgKHJlYWRfb25lX3N5bSwgaW5pdF9saW5ldGFibGUsIGluaXRfc3RyaW5ndGFiKToKKwlCeXRlLXN3YXAgQ09GRiBzeW1ib2wgdGFibGVzIGlmIG5lY2Vzc2FyeSB3aGVuIHJlYWRpbmcgdGhlbSBpbi4KKwlVc2UgY29tcGxhaW4oKSB0byByZXBsYWNlIGVycm9yIG1lc3NhZ2UgaW4gb25lIHNwb3QuICBOZWVkcworCWNvcnJlc3BvbmRpbmcgY2hhbmdlIGluIGJmZC9jb2ZmLWNvZGUuaCB0byBtYWtlIHNvbWUgc3ltYm9sCisJc3dhcHBpbmcgcm91dGluZXMgbm9uLXN0YXRpYy4KKworTW9uIE1hciAgNCAwMDo1Mzo0MCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwlNZXJnZSBjaGFuZ2VzIGZyb20gRWlyaWsgRnVsbGVyLCBmb3IgVVRlay4KKworCSogZGVmcy5oIChlcnJubyk6ICBBZGQgZGVjbGFyYXRpb24uCisJKiBhbHRvcy14ZGVwLmMsIGFybS14ZGVwLmMsIGNvbnZleC14ZGVwLmMsIGdvdWxkLXhkZXAuYywKKwlocDMwMGhwdXgteGRlcC5jLCBpbmZydW4uYywgaW5mbG93LmMsIGluZnB0cmFjZS5jLCBpMzg2LXRkZXAuYywKKwlpMzg2LXhkZXAuYywgcHlyLXhkZXAuYywgbWlwcy14ZGVwLmMsIHJlbW90ZS1lYi5jLCByZW1vdGUtbmluZHkuYywKKwlyZW1vdGUtdnguYywgc291cmNlLmMsIHN0YW5kYWxvbmUuYywgc3R1ZmYuYywgc3VuMzg2LXhkZXAuYywKKwlzeW1tZXRyeS10ZGVwLmMsIHN5bW1ldHJ5LXhkZXAuYywgdW1heC14ZGVwLmMsIHV0aWxzLmM6ICBFbGltaW5hdGUKKwlkZWNsYXJhdGlvbnMgb2YgZXJybm8uCisKKwkqIHJlbW90ZS1lYi5jOiAgRGVmaW5lIEIxOTIwMCBhbmQgQjM4NDAwIGFzIEVYVEEgYW5kIEVYVEIuCisKKwkqIHJlbW90ZS12eC5jOiAgSW5jbHVkZSA8c3lzL3RpbWUuaD4gZm9yIFVUZWs7IFN1biBnZXRzIGl0IHZpYQorCTxycGMvcnBjLmg+IGFuZCA8cnBjL3R5cGVzLmg+LgorCitTYXQgTWFyICAyIDE1OjQ3OjU1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogaTk2MC10ZGVwLmMgKGV4YW1pbmVfcHJvbG9ndWUpOiAgQWRkIG5ldyBhcmd1bWVudCBsaW1pdCwKKwl3aGljaCBzdG9wcyB0aGUgc2NhbiBhdCB0aGUgZW5kIG9mIHRoZSBwcm9sb2d1ZSwgb3IgYXQgdGhlIFBDLgorCVRoaXMgZml4ZXMgYSBwcm9ibGVtIHdoZXJlIGl0IHdhbGtzIGRvd24gaW50byB0aGUgY29kZSBmb3IgdGhlCisJdXNlcidzIHN0YXRlbWVudHMgaWYgdGhhdCBjb2RlIGxvb2tzIGxpa2UgZnVuY3Rpb24gcHJvbG9ndWVzLgorCU1hcmsgRm94IGFuZCBJIGhhdmUgYmVlbiBib3VuY2luZyB0aGlzIGNvZGUgYmFjayBhbmQgZm9ydGgsIG1ha2luZworCXNtYWxsIGNoYW5nZXMgdG8gaXQuICBDYWxsZXJzIGNoYW5nZWQgdG8gbWF0Y2guCisKK1R1ZSBGZWIgMjYgMDE6NDc6MDcgMTk5MSAgQ3lnbnVzIEpvaG4gR2lsbW9yZSAgKGN5Z251cyBhdCB5dWJhKQorCisJQ2xlYW51cCBmb3IgZ2RiLTMuOTQgcmVsZWFzZSBmaW5hbDoKKworCSogTWFrZWZpbGUuZGlzdDogIFJlbW92ZSByZW1vdGUtdnguYywgcmVtb3RlLW5pbmR5LmMsIGFuZCBhbGwKKwl0aGUgLmMgZmlsZXMgZnJvbSB2eC1zaGFyZSBhbmQgbmluZHktc2hhcmUsIGZyb20gdGhlIHZhcmlvdXMgCisJbWFjcm9zLCBzaW5jZSB0aGV5IGFyZSBub3QgZm91bmQgdmlhIEFMTERFUEZJTEVTLgorCShTRklMRVMpOiAgQWRkIHRtLWk5NjAuaC4KKwkoYWxsZGVwcy5tYWsgcnVsZSk6ICBCcmVhayBvdXQgQUxMREVQRklMRVNfTUFJTkRJUiBhbmQKKwlBTExERVBGSUxFU19TVUJESVIuICBMaXN0IGFsbCB0aGUgbmluZHkgYW5kIHZ4d29ya3Mgc3ViZGlyIGZpbGVzCisJaW4gdGhlIFNVQkRJUiBsaXN0LgorCShUQUdGSUxFU19NQUlORElSKTogIENoYW5nZSBBTExERVBGSUxFUyB0byBBTExERVBGSUxFU19NQUlORElSLgorCShnZGIudGFyLlopOiAgVXNlIEFMTERFUEZJTEVTX1NVQkRJUiBhcyB3ZWxsIGFzIFNGSUxFU19TVUJESVIuCisKK01vbiBGZWIgMjUgMTY6MDI6MzUgMTk5MSAgQ3lnbnVzIEpvaG4gR2lsbW9yZSAgKGN5Z251cyBhdCBvbGRtYW4pCisKKwkqIGFtMjlrLXRkZXAuYzogIEFkZCBjb250cmlidXRpb24gbGluZS4KKwkoZXhhbWluZV9wcm9sb2d1ZSk6ICBDYWNoZSBpbmZvcm1hdGlvbiBhYm91dCBmdW5jdGlvbiBwcm9sb2d1ZXMgaW4KKwl0aGUgbWlzYy1mdW5jdGlvbi12ZWN0b3IgdG8gYXZvaWQgbG90cyBvZiByZWZlcmVuY2VzIG92ZXIgdGhlCisJc2VyaWFsIGxpbmUgd2hpbGUgZXhhbWluaW5nIGluc3RydWN0aW9ucy4KKworCSogY29yZS5jIChjb3JlX2Nsb3NlKTogIE5ldyBmdW5jdGlvbiBtYWRlIGZyb20gY2xlYW51cF9jb3JlLgorCisJKiBjb3JlLmMsIGV4ZWMuYywgaW5mdGFyZy5jLCByZW1vdGUtZWIuYywgcmVtb3RlLW5pbmR5LmMsCisJcmVtb3RlLXZ4LmMsIHJlbW90ZS5jLCB0YXJnZXQuYywgdGFyZ2V0LmgsIAorCVVwZGF0ZSB0YXJnZXRfb3BzIHZlY3RvciB0byBhZGQgYXR0YWNoLCBjbG9zZSwgYW5kIGxvYWQgZW50cmllcy4KKwlVc2UgYWRkX3N5bXNfYWRkcl9jb21tYW5kLCBub3QgYWRkX2ZpbGVfYWRkcl9jb21tYW5kLCBmb3IKKwlhZGRfZmlsZS4gIEJyZWFrIG91dCBjbG9zZSByb3V0aW5lIGZyb20gZXhpc3RpbmcgY29kZS4KKworCSogZGJ4cmVhZC5jIChyZWFsbHlfZnJlZV9wZW5kaW5ncyk6ICBEb24ndCBmcmVlIHBlbmRpbmdfYmxvY2tzOworCXRoZXkgYXJlIGluIGFuIG9ic3RhY2suCisJKHJlYWRfZGJ4X3N5bXRhYik6ICBSZWxvY2F0ZSBlbmRfb2ZfdGV4dF9hZGRyIGluIHRoZSBwc3ltdGFiLgorCUxpbnQuCisJKGRlZmluZV9zeW1ib2wpOiAgQWRkIHN5bWJvbCB0eXBlIHBhcmFtZXRlcjsgY2hhbmdlIGNhbGxlcnM7CisJcGFzcyB0eXBlIHBhcmFtZXRlciB0byBEQlhfUEFSTV9TWU1CT0xfQ0xBU1MgbWFjcm8gdG8gYWxsb3cKKwlpdCB0byBpbmZsdWVuY2UgdGhlIHN5bWJvbCBjbGFzcyBvbiB0aGUgaTk2MC4KKwkoZGVmaW5lX3N5bWJvbCk6ICBTd2FwIExPQ19DT05TVCdzIGludG8gdGFyZ2V0IGJ5dGUgb3JkZXIuCisKKwkqIGV4ZWMuYyAoZXhlY19jbG9zZSk6ICBOZXcgZnVuY3Rpb24uCisJKGV4ZWNfZmlsZV9jb21tYW5kKTogIENhbGwgaXQuCisKKwkqIGZpbmR2YXIuYyAocmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMpOiAgRG9jIGJ5dGUgb3JkZXIsCisJRml4IGJ5dGUgb3JkZXIgb2YgZnJhbWUgcG9pbnRlci4KKwkocmVhZF92YXJfdmFsdWUpOiAgUmVzdWx0IG9mIDAgaWYgdmFyJ3MgdmFsdWUgY2FuJ3QgYmUgZm91bmQsCisJZS5nLiBtaXNzaW5nIEZSQU1FX0FSR1NfQUREUkVTUy4gIEJ5dGUtc3dhcCBMT0NfQ09OU1QgYW5kCisJTE9DX0xBQkVMIHZhbHVlcyB0byB0YXJnZXQgb3JkZXIuICBBZGQgTE9DX0xPQ0FMX0FSRy4KKwkobG9jYXRlX3Zhcl92YWx1ZSk6ICBVc2UgcmVhZF92YXJfdmFsdWUgYW5kIHVzZSBpdHMgbGF6eSBhZGRyZXNzCisJYXMgdGhlIGxvY2F0aW9uIG9mIHRoZSB2YXIncyB2YWx1ZS4gIExpbnQuCisKKwkqIGk5NjAtcGluc24uYyAobmV4dF9pbnNuKTogIEFkZCByb3V0aW5lIGZyb20gdnhnZGIgZm9yIHNjYW5uaW5nCisJaW5zdHJ1Y3Rpb25zLiAgICAgICAKKworCSogaTk2MC10ZGVwLmMgKGFyZ19hZGRyZXNzLCBpOTYwX2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyk6ICBSZW1vdmUKKwlvYnNvbGV0ZSBJbnRlbCB2ZXJzaW9ucyBpbiBmYXZvciBvZiB2eGdkYiB2ZXJzaW9ucy4KKwkoY2hlY2tfaG9zdCwgYnl0ZXN3YXAsIGJ5dGVzd2FwX3ZhbCwgcmVvcmRlcl92YWwpOiAgRWxpbWluYXRlCisJY29kZSBkZWFsaW5nIHdpdGggYnl0ZSBvcmRlciBvZiB2YWx1ZXMsIHdoaWNoIEludGVsIGRpZCBpbiBob3N0IGJ5dGUKKwlvcmRlciByYXRoZXIgdGhhbiBnZGItNCdzIHRhcmdldCBieXRlIG9yZGVyLgorCShpOTYwX2ZyYW1lX2NoYWluX3ZhbGlkKTogIE1vdmUgdG8gbmluZHktdGRlcC5jLgorCShleGFtaW5lX3Byb2xvZ3VlLCBza2lwX3Byb2xvZ3VlLCBmcmFtZV9maW5kX3NhdmVkX3JlZ3MsCisJZnJhbWVfYXJnc19hZGRyZXNzLCBsZWFmcHJvY19yZXR1cm4sIHNhdmVkX3BjX2FmdGVyX2NhbGwsCisJcG9wX2ZyYW1lKTogIEFkZCB2eGdkYiB2ZXJzaW9ucyBmcm9tIE1hcmsgRm94LgorCShleGFtaW5lX3Byb2xvZ3VlLCBmcmFtZV9zdHJ1Y3RfcmVzdWx0X2FkZHJlc3MpOiAgQWRkIGNvZGUKKwl0byBkZWFsIHdpdGggdGhlIHNhdmVkIHZhbHVlIG9mIEcxMyAoc3RydWN0IHJldHVybiBhZGRyZXNzCisJcG9pbnRlcikuCisJKGZyYW1lX2FyZ3NfYWRkcmVzcyk6ICBNb2RpZnkgTWFyaydzIHZlcnNpb24gdG8gcHJlZmVyIHRoZQorCXNhdmVkIHZhbHVlIG92ZXIgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIHRvcG1vc3QgZnJhbWUuCisJQ2FjaGUgcmVzdWx0IGluIHRoZSBmcmFtZSBpbmZvIHRvIGF2b2lkIHBlcmZvcm1hbmNlIGhhaXIgaW4KKwljYWxsZXJzLgorCShwcmludF9mYXVsdCk6ICBBZGQgZ2RiOTYwIGNvZGUgZm9yIHByaW50aW5nIGZhdWx0cy4KKwkoX2luaXRpYWxpemVfaTk2MCk6ICBBY3R1YWxseSBjYWxsIGNoZWNrX2hvc3QuCisKKwkqIGllZWUtZmxvYXQuYyAoaWVlZV9leHRlbmRlZF90b19kb3VibGUsIGllZWVfZG91YmxlX3RvX2V4dGVuZGVkKToKKwlhZGQgc3R1YiByb3V0aW5lcy4gIEZJWE1FLCB0aGVzZSBjdXJyZW50bHkganVzdCByZXR1cm4gemVybyEKKworCSogaW5mY21kLmMgKHByb2dyYW1faW5mbyk6ICBVc2UgUFJJTlRfUkFORE9NX1NJR05BTC4KKwkoYXR0YWNoX2NvbW1hbmQpOiAgQ2FsbCB0YXJnZXRfYXR0YWNoLCBub3QgdGFyZ2V0X29wZW4sIG5vdy4KKworCSogaW5mcnVuLmMgKG5vcm1hbF9zdG9wKTogIE1ha2UgZ2xvYmFsLCBub3Qgc3RhdGljLCBmb3IgdnhfYXR0YWNoLgorCShjaGlsZF9hdHRhY2gpOiAgUmVuYW1lIGZyb20gY2hpbGRfb3Blbi4KKwkod2FpdF9mb3JfaW5mZXJpb3IpOiBVc2UgUFJJTlRfUkFORE9NX1NJR05BTC4gIElmIHN0b3BfcGMgaXMgemVybywKKwlkb24ndCBjb25mdXNlIGl0IHdpdGggYSB6ZXJvIHN0ZXBfcmVzdW1lX2JyZWFrX2FkZHJlc3MuIAorCisJKiBpbmZ0YXJnLmMgKGNoaWxkX2RldGFjaCk6ICBFbGltaW5hdGUgaW5mZXJpb3JfcGlkIHRlc3QuCisJKGNoaWxkX2ZpbGVzX2luZm8pOiAgQ2xlYW4gdXAgbWVzc2FnZSBhIGJpdC4KKwkoY2hpbGRfb3BzKTogIFVzZSBjaGlsZF9hdHRhY2gsIG5vdCBjaGlsZF9vcGVuLCB0byBhdHRhY2guCisKKwkqIG1lbS1icmVhay5jOiAgI2lmZGVmIG91dCB0aGUgd2hvbGUgZmlsZSBpZiBCUkVBS1BPSU5UIGlzIG5vdAorCXNldCAoZS5nLiBvbiBWeFdvcmtzIG9yIE5JTkRZKS4gIE1vdmUgcmVhZF9tZW1vcnlfbm9icHQgZnJvbQorCWZpbmR2YXIuYyB0byBoZXJlLCBzaW5jZSBpdCBkZXBlbmRzIG9uIHRoZSBjb250ZW50cyBvZiB0aGUKKwlzaGFkb3dfY29udGVudHMgb2YgYnJlYWtwb2ludHMsIGJ1dCBrZWVwIGlmICNpZiAwIHNpbmNlIGl0IGlzCisJbmV2ZXIgY2FsbGVkLgorCisJKiBuaW5keS10ZGVwLmM6ICBOZXcgZmlsZSwgY29udGFpbnMgbmluZHlfZnJhbWVfY2hhaW5fdmFsaWQsIG1vdmVkCisJZnJvbSBpOTYwLXRkZXAuYy4KKworCSogcHJpbnRjbWQuYyAoYWRkcmVzc19pbmZvKTogIEhhbmRsZSBMT0NfTE9DQUxfQVJHLiAgTGludC4KKwkocHR5cGVfY29tbWFuZCwgZGlzcGxheV9jb21tYW5kKTogIEVsaW1pbmF0ZSBoYXZlX2luZmVyaW9yX3AgYW5kCisJaGF2ZV9jb3JlX2ZpbGVfcCBpbiBmYXZvciBvZiB0YXJnZXRfaGFzX3N0YWNrIG9yCisJdGFyZ2V0X2hhc19leGVjdXRpb24uCisJKHByaW50X2ZyYW1lX2FyZ3MpOiAgSGFuZGxlIExPQ19MT0NBTF9BUkcuICBFbGltaW5hdGUgZHVwbGljYXRlCisJY29kZSBmb3IgYWN0dWFsbHkgZmluZGluZyB0aGUgdmFsdWVzIG9mIGFyZ3VtZW50cywgdGhvdWdoIHdlIHN0aWxsCisJa2VlcCB0cmFjayBvZiB0aGUgbWF4aW11bSBzdGFjayBvZmZzZXQgZm9yIHVzZSBpbiBwcmludGluZyB1bm5hbWVkCisJYXJndW1lbnRzLiAgSGFuZGxlIG1pc3NpbmcgRlJBTUVfQVJHU19BRERSRVNTLgorCisJKiByZW1vdGUtbmluZHkuYyAoaTk2MF9wcmludF9mYXVsdCk6ICBNb3ZlIHRvIGk5NjAtdGRlcC5jLgorCShzdHJ1Y3QgbmluZHlfcmVncyk6ICBEZWZpbmUgcmVnaXN0ZXJzIHBhc3NlZCB0by9mcm9tIG5pbmR5LgorCShuaW5keV9mZXRjaF9yZWdpc3RlcnMsIG5pbmR5X3N0b3JlLXJlZ2lzdGVycyk6ICBUcmFuc2xhdGUgYmV0d2VlbgorCW5pbmR5IGFuZCBHREIgZm9ybWF0cyBmb3IgdGhlIHJlZ2lzdGVycy4KKwkoZGNhY2hlX2luaXQpOiAgU3RhdGljYWxseSBhbGxvY2F0ZSB0aGUgY2FjaGUsIHNpbmNlIGl0IHdhcyBiZWluZworCWFsbG9jYXRlZCBieSBhIG1hbGxvYyB0aGF0IHdhcyBuZXZlciBmcmVlZCBhbnl3YXkuCisJKG5pbmR5X2NyZWF0ZV9pbmZlcmlvcik6ICBFcnJvciwgbm90IGNvcmUgZHVtcCwgaWYgbm8gZXhlYyBmaWxlLgorCShuaW5keV9iZWZvcmVfbWFpbl9sb29wKTogIFVzZSB0YXJnZXRfbG9hZCwgbm90IHRhcmdldF9hZGRfZmlsZS4KKworCSogcmVtb3RlLXZ4LmMgKG5ldF9sb2FkKTogIFNwZWNpZnkgbGFyZ2UgdGltZW91dCBmb3IgbG9hZAorCXJlcXVlc3RzLiAgQWxsb3cgdXNlciB0byBicmVhayBvdXQgd2l0aCBJTlRFUlJVUFQuCisJKG5ldF9icmVhayk6ICBSZW1vdmUgdXNlbGVzcyBjb2RlLCBjbGVhbiB1cC4gIENoYW5nZSBjYWxsZXJzLgorCShwYXJzZS1hcmdzLCBza2lwX3doaXRlX3NwYWNlLCBmaW5kX3doaXRlX3NwYWNlKTogIENsZWFuIHVwIGFyZworCXBhcnNpbmcgdG8gY29wZSB3aXRoIHF1b3RlZCBzdHJpbmdzLgorCShuZXRfd2FpdCwgbmV0X3F1aXQpOiAgTmV2ZXIgY2FsbCBlcnJvciwganVzdCByZXR1cm4gc3RhdHVzLgorCSh2eF9yZWFkX3JlZ2lzdGVyLCB2eF93cml0ZV9yZWdpc3Rlcik6ICBDbGVhbnVwIHN0YXR1cyBjaGVja2luZy4KKwkjaWZkZWYgdGhlIGNvZGUgYmFzZWQgb24gd2hpY2ggQ1BVIHdlIGFyZSB1c2luZyAoOTYwIG9yIDY4ayksCisJRklYTUUsIHRoaXMgc2hvdWxkIGJlIGNvbXBsZXRlbHkgZ2VuZXJhbCBidXQgaXQgaXNuJ3QgeWV0LgorCSh2eF94ZmVyX21lbW9yeSwgdnhfcmVzdW1lKTogIENsZWFudXAgc3RhdHVzIGNoZWNraW5nLgorCSh2eF9ydW5fZmlsZXNfaW5mbyk6ICBJbXByb3ZlIG1lc3NhZ2UuCisJKHZ4X2xvYWRfY29tbWFuZCk6ICBSZW5hbWVkIGZyb20gdnhfYWRkX2ZpbGVfY29tbWFuZC4gIEFsbG93IGxvYWQKKwl0byBiZSBpbnRlcnJ1cHRlZC4KKwkobmV0X3B0cmFjZSk6ICBSZW1vdmUgdW51c2VkIHJvdXRpbmUuCisJKHZ4X3dhaXQpOiAgQWRvcHQgY29kZSBmcm9tIHZ4Z2RiOTYwIHRvIGNvcGUgd2l0aCBicm9rZW4KKwljb25uZWN0aW9ucyB0byB0YXJnZXQgbWFjaGluZSBhbmQgcHJvbXB0IHRvIGRpc2Nvbm5lY3QuICBSZW1vdmUKKwlkZWJ1ZyBwcmludG91dHMuICBNYXAgc29tZSBFVkVOVF8ncyB0byBTSUduYWxzLgorCShhZGRfc3ltYm9sX3N0dWIsIHZ4X29wZW4pOiAgUHJpbnQgbmFtZXMgb2Ygb2JqZWN0IGZpbGVzIHdlIGZvdW5kLAorCWFuZCAib2siIGlmIHdlIHJlYWQgdGhlaXIgc3ltYm9scyBPSy4gIENsYXJpZnkgb3V0cHV0IGluIGdlbmVyYWwuCisJKHZ4X2F0dGFjaCwgdnhfZGV0YWNoLCB2eF9raWxsKTogIEFkZCB0aGVzZSBjb21tYW5kcy4KKwkodnhfY29udmVydF9mcm9tX3ZpcnR1YWwsIHZ4X2NvbnZlcnRfdG9fdmlydHVhbCk6ICBTaW1wbGlmeS4KKwkodnhfcnVuX29wcyk6ICBUdXJuIG9mZiBhbGxfbWVtLCB0byBhdm9pZCBzcHVyaW91cyBtc2cgaW4gdGhlCisJImluZm8gZmlsZXMiIG91dHB1dCwgYW5kIGNyZWF0ZV9pbmZlcmlvciwgc2luY2Ugd2UgYWxyZWFkeSBoYXZlCisJYW4gaW5mZXJpb3IuCisKKwkqIHN0YWNrLmMgKGZyYW1lX2luZm8pOiAgUmVwbGFjZSBGcmFtZV91bmtub3duIHdpdGggMC4KKwkocHJpbnRfZnJhbWVfYXJnX3ZhcnMpOiAgSGFuZGxlIExPQ19MT0NBTF9BUkcuCisJKHJldHVybl9jb21tYW5kKTogIFBvcCB1bnRpbCB0aGUgUEMgbWF0Y2hlcyBhcyB3ZWxsIGFzIHRoZSBGUCwKKwlzbyBpdCB3b3JrcyBldmVuIGlmIHRoZSBGUCBpcyBzaGFyZWQgd2l0aCBhbm90aGVyIGZ1bmN0aW9uLAorCWFzIGluICJmcmFtZWxlc3MiIG9yICJsZWFmIiBwcm9jZWR1cmVzLgorCisJKiBzeW1maWxlLmMgKGxvYWRfY29tbWFuZCk6ICByZW5hbWVkIGZyb20gYWRkX2ZpbGVfdGFyZ2V0X2NvbW1hbmQuCisJKGFkZF9zeW1zX2FkZHJfY29tbWFuZCk6ICByZW5hbWVkIGZyb20gYWRkX2ZpbGVfYWRkcl9jb21tYW5kLgorCShhZGRfc3ltc19jb21tYW5kKTogIFN0dWIgdG8gY2FsbCB0YXJnZXRfYWRkX3N5bXMuCisJKF9pbml0aWFsaXplX3N5bWZpbGUpOiAgQ2hhbmdlIGNvbW1hbmQgbmFtZXMgYW5kIGRlc2NyaXB0aW9ucywKKwlhZGQtZmlsZSA9PiBhZGQtc3ltcywgYW5kIGxvYWQgZnJvbSBhbGlhcyB0byBpdHMgb3duIGNvbW1hbmQuCisKKwkqIHRhcmdldC5jIChraWxsX29yX2JlX2tpbGxlZCwgbWF5YmVfa2lsbF90aGVuX2F0dGFjaCwKKwltYXliZV9raWxsX3RoZW5fY3JlYXRlX2luZmVyaW9yKTogIERlZmF1bHQgZm9yIGF0dGVtcHRzIHRvIHN0YXJ0CisJYSBwcm9jZXNzLCBpZiBvbmUgaXMgYWxyZWFkeSBydW5uaW5nLCBpcyB0byBhc2sgYWJvdXQga2lsbGluZworCWl0IGFuZCByZXRyeSBpZiB5ZXMuCisJKHVwc3RhY2tfY3JlYXRlX2luZmVyaW9yKTogICNpZi0wIGl0LCBzdHJhdGEgb2Jzb2xldGUgaXQuCisJKHB1c2hfdGFyZ2V0LCB1bnB1c2hfdGFyZ2V0LCBwb3BfdGFyZ2V0KTogIHRvX2Nsb3NlKCkgYSB0YXJnZXQKKwliZWZvcmUgdW5zdGFja2luZyBpdC4gCisJKHRhcmdldF9pbmZvKTogIFJlbmFtZWQgZnJvbSB0YXJnZXRfZmlsZXNfaW5mby4KKwkoX2luaXRpYWxpemVfdGFyZ2V0cyk6ICBSZW5hbWUgImkgZmlsZXMiIGFzICJpIHRhcmdldCIsIGFjY2Vzc2libGUKKwl1bmRlciBib3RoIG5hbWVzLgorCisJKiB0YXJnZXQuaDogIEltcHJvdmUgY29tbWVudHMgYWJvdXQgdGhlIHRhcmdldF8gdmVjdG9yZWQgcm91dGluZXMuCisKKwkqIHRtLWk5NjAuaDogIFJlbW92ZSBOSU5EWS1zcGVjaWZpYyBzdHVmZiB0byB0bS1uaW5keTk2MC5oLgorCUNvbnZlcnQgY29tbWVudGluZyBzdHlsZSB0byBzdGFuZGFyZCBHTlUgc3R5bGUuCisJKERCWF9QQVJNX1NZTUJPTF9DTEFTUyk6IGFsbG93IExPQ19MT0NBTF9BUkcncyB0byBiZSByZWNvZ25pemVkLgorCShTS0lQX1BST0xPR1VFKTogIE5vIGxvbmdlciBhIG5vLW9wLgorCShTQVZFRF9QQ19BRlRFUl9DQUxMKTogIE5vdyBoYW5kbGVzIGxlYWYgcHJvY2VkdXJlcy4KKwkoKl9SRUdOVU0pOiAgU29ydCByZWdpc3RlciBudW1iZXJzLgorCShSRUdJU1RFUl9CWVRFUywgUkVHSVNURVJfQllURSwgUkVHSVNURVJfUkFXX1NJWkUsCisJTUFYX1JFR0lTVEVSX1JBV19TSVpFLCBSRUdJU1RFUl9DT05WRVJUSUJMRSwKKwlSRUdJU1RFUl9DT05WRVJUX1RPX1ZJUlRVQUwsIFJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXKTogIEZsb2F0IHJlZ3MKKwlhcmUgbm93IDEwIGJ5dGUgZXh0ZW5kZWRzLCBub3QgOCBieXRlIGRvdWJsZXMuCisJKEZSQU1FX0NIQUlOX1ZBTElEKTogIE1ha2UgdGhpcyBjb25maWctZGVwZW5kZW50LCBzaW5jZSBpdCBkaWZmZXJzCisJZm9yIG5pbmR5IHZlcnN1cyB2eHdvcmtzIHRhcmdldHMuICBGSVhNRSwgdGhpcyBzaG91bGQgcG9zc2libHkgZ28KKwlpbiB0aGUgdGFyZ2V0IHZlY3Rvci4KKwkoRVhUUkFfRlJBTUVfSU5GTywgSU5JVF9FWFRSQV9GUkFNRV9JTkZPKTogIENhY2hlIGJvdGgKKwlmcmFtZV9zYXZlZF9yZWdzIGFuZCBhcmcgcG9pbnRlciB3aXRoIGVhY2ggZnJhbWUuCisJKEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OKTogIE5ldyBsZWFmcHJvYyBzdXBwb3J0LgorCShGUkFNRV9BUkdTX0FERFJFU1MpOiAgVXNlIGNhY2hlZCByZXN1bHQuCisJKEZSQU1FX0FSR1NfQUREUkVTU19DT1JSRUNUKTogIE5ldywgYXZvaWRzIGcxNCBndWVzc2luZy4KKwkoRlJBTUVfRklORF9TQVZFRF9SRUdTKTogIENoYW5nZSBhcmcgdG8gc3Vic2lkaWFyeSBmbi4KKwkoUFJJTlRfUkFNRE9OX1NJR05BTCk6ICBDYWxsIHByaW50X2ZhdWx0LgorCShQT1BfRlJBTUUpOiAgTm93IHdvcmtzLgorCisJKiB0bS1uaW5keTk2MC5oOiAgQnJlYWsgdGhpcyBvZmYgdG0taTk2MC5oLiAgTklORFktc3BlY2lmaWMKKwlvcHRpb24gcGFyc2luZyBhbmQgc3RhcnR1cDsgU1RBQ0tfRU5EX0FERFIsIEZSQU1FX0NIQUlOX1ZBTElELAorCUJSRUFLUE9JTlQsIGFuZCBERUNSX1BDX0FGVEVSX0JSRUFLIGFyZSBoZXJlLgorCShBRERJVElPTkFMX09QVElPTl9IQU5ETEVSKTogIHVzZSB0YXJnZXRfbG9hZCwgbm90CisJdGFyZ2V0X2FkZF9maWxlLgorCQorCSogdG0tdnh3b3Jrczk2MC5oOiAgQnJlYWsgdGhpcyBvZmYgdG0taTk2MC5oLiAgVnhHREIgc3BlY2lmaWMKKwlzdGFydHVwOyBERUNSX1BDX0FGVEVSX0JSRUFLLCBhbmQgRlJBTUVfQ0hBSU5fVkFMSUQgYXJlIGhlcmUuCisKKwkqIHZhbGFyaXRoLmMgKHZhbHVlX3N1YnNjcmlwdGVkX3J2YWx1ZSk6ICBBdm9pZCBoYW5kbGluZworCWZsb2F0cyBhbmQgZG91YmxlcyBzcGVjaWFsbHk7IGl0IGdhdmUgYWxpZ25tZW50IGVycm9ycy4gIExpbnQuCisKKwkqIHZhbG9wcy5jICh2YWx1ZV9vZl92YXJpYWJsZSwgdmFsdWVfb2ZfdGhpcyk6ICBFcnJvciBpZiB1bmtub3duCisJdmFsdWUuCisKKwkqIHZhbHByaW50LmMgKHByaW50X2Zsb2F0aW5nKTogIEJjb3B5IHJhdGhlciB0aGFuIHBvaW50ZXItZGVyZWYsCisJdG8gYXZvaWQgYWxpZ25tZW50IHByb2JsZW1zLgorCSh2YWx1ZV9wcmludCk6ICBIYW5kbGUgdW5rbm93biB2YWx1ZSBhZGRyZXNzLgorCShjcGx1c192YWxfcHJpbnQpOiAgVHdvIGFyZ3MgYXJlIGlnbm9yZWQ7IHJlbW92ZSB0aGVtLiAgQ2hhbmdlIGNhbGxlci4KKwkodmFsX3ByaW50KTogIFVzZSB1bnBhY2tfbG9uZyByYXRoZXIgdGhhbiBwb2ludGVyLWRlcmVmLgorCisJKiB2YWx1ZXMuYzogIExpbnQuCisJKHVucGFja19sb25nLCB1bnBhY2tfZG91YmxlKTogIFVzZSBiY29weSByYXRoZXIgdGhhbiBwb2ludGVyLWRlcmVmCisJdG8gYXZvaWQgYWxpZ25tZW50IHByb2JsZW1zLgorCSh2YWx1ZV9iZWluZ19yZXR1cm5lZCk6ICBFcnJvciBpZiByZXR1cm4gdmFsdWUgdW5rbm93bi4KKwkoc2V0X3JldHVybl92YWx1ZSk6ICBBZGQgYm9nb3NpdHkgd2FybmluZywgRklYTUUuICAgICAgICAqCisKKwkqIFRPRE86ICBBIHdvbWFuJ3Mgd29yayBpcyBuZXZlciBkb25lLgorCisJKiBNYWtlZmlsZS5kaXN0OiAgRGlzdHJpYnV0ZSBSRU1PVEVfT0JTIGludG8gdGNvbmZpZyBmaWxlcy4KKwlTZXBhcmF0ZSBJTkNMVURFX0NGTEFHUyBmb3IgdXNlIHdpdGggbGludC4gIEFkZCBMSU5URklMRVMuCisJQWRkIGllZWUtZmxvYXQubyB0byBPQlMuCisJKiB0Y29uZmlnL3tuaW5keTk2MCx2eHdvcmtzNjgsdnh3b3Jrczk2MH06ICBJbmNsdWRlIHRoZSBkZXNpcmVkCisJUkVNT1RFX09CUyByZW1vdGUtaW50ZXJmYWNlIGZpbGVzIGluIHRoZSBUREVQRklMRVMgYW5kIFRNX0ZJTEUuCisJKiB0Y29uZmlnL2k5NjA6ICBGSVhNRS4gIEhhbGYtbWVyZ2UsIHByb2R1Y2Ugd2FybmluZyBpZiBjb25maWcnZC4KKworCUNoYW5nZXMgdG8gZ2VuZXJhbGl6ZSB0aGUgVnhXb3JrcyBSUEMgcHJvdG9jb2wgc2xpZ2h0bHksIHRvIGhhbmRsZQorCWk5NjAgYXMgd2VsbCBhcyA2ODAwMC4KKworCSogdngtc2hhcmUvZGJnUnBjTGliLmggKFZYX1NPVVJDRV9TVEVQKTogIEFkZC4KKwkqIHZ4LXNoYXJlL3JlZy5oOiAgUHJvZHVjZSBpOTYwIHJlZ3MgI2lmZGVmIEk4MDk2MAorCSogdngtc2hhcmUveGRyX3B0cmFjZS5jOiAgU2tpcCBGUEEgcmVnaXN0ZXJzIGlmIDk2MC4KKwkqIHZ4LXNoYXJlL3hkcl9yZGIuaDogIEFkZCBTT1VSQ0VfU1RFUCBzdHJ1Y3QgYW5kIHhkciBkZWNsLgorCSogdngtc2hhcmUveGRyX3JkYi5jOiAgQWRkIHhkcl9TT1VSQ0VfU1RFUCByb3V0aW5lLgorCSogdngtc2hhcmUveGRyX3JlZ3MuYzogIEFkZCB4ZHJfcmVncywgeGRyX2ZwX3N0YXR1cywgeGRyX2V4dF9mcAorCWZvciBpOTYwLiAgQ2hhbmdlIHhkcl92ZWN0b3JzIHRvIHhkcl9vcGFxdWVzIGZvciA2OGsgcmVnaXN0ZXJzLAorCXNvIHRoZXkgd2lsbCBtb3ZlIGluIHRhcmdldCBieXRlIG9yZGVyIHJhdGhlciB0aGFuIG5ldHdvcmsKKwlieXRlIG9yZGVyIChoYXBwZW5zIHRvIGJlIHRoZSBzYW1lKS4JCisKK01vbiBGZWIgMjUgMDM6NDE6NDQgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiB0bS1jb252ZXguaCAoRU5EX09GX1RFWFRfREVGQVVMVCk6ICBSZW1vdmUgI2lmIDAnZCBibG9jay4KKworU3VuIEZlYiAyNCAwMDo1NTo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGFtMjlrLXBpbnNuLmMsIAorCUFkZCBjb250cmlidXRpb24gbGluZXMgdG8gdmFyaW91cyBmaWxlcywgc2hvd2luZyB3aGVyZSB0aGV5CisJY2FtZSBmcm9tLgorCisJKiBicmVha3BvaW50LmMgKGJyZWFrX2luc24sIGNoZWNrX2JyZWFrX2luc25fc2l6ZSwKKwlyZWFkX21lbW9yeV9ub2JwdCk6ICBSZW1vdmUgdG8gbWVtLWJyZWFrLmMuCisKKwkqIHhtLSouaCwgcGFyYW0tbm8tdG0uaCwgdG0tMjlrLmgsIHZhbHByaW50LmM6ICBDaGFuZ2UgQllURV9PUkRFUiB0bworCUhPU1RfQllURV9PUkRFUi4KKworCSogdG0tMjlrLmggKFNUQUJfUkVHX1RPX1JFR05VTSk6ICBXYXJuIHVzZXIgaWYgc3ltYm9sIHRhYmxlCisJZW50cnkgaGFzIGJhZCByZWdpc3RlciBudW1iZXIuICBUaGlzIGNoYW5nZSBpcyBub3QKKwl0ZXN0ZWQgaW4gdGhpcyByZWxlYXNlLCBGSVhNRS4KKworCSogZnJhbWUuaDogIEVsaW1pbmF0ZSBGcmFtZV91bmtub3duIGluIGZhdm9yIG9mIGEgc2ltcGxlIHplcm8uCisJdG0tdmF4Lmg6ICBEaXR0by4KKworCSogdmFsdWUuaDogIEZvcmNlIHZhbHVlJ3MgY29udGVudHMgZmllbGQgdG8gYmUgYWxpZ25lZCB0byBob2xkCisJYXQgbGVhc3QgYSBkb3VibGUgb3IgYSBsb25nIGxvbmcgKGlmIHN1cHBvcnRlZCkuICBUaGlzIGF2b2lkcworCWRvaW5nIGJjb3B5J3MgaW4gYW5kIG91dCBvZiB0aGUgY29udGVudHMgZmllbGQuCisKKwkoc3RlcF8xKTogIEF2b2lkIGNvcmVkdW1wIHVuZGVyIG9ic2N1cmUgY2lyY3Vtc3RhbmNlcyB3aGVuIHdlCisJaGF2ZSBubyBmcmFtZS4KKworCSogc3ltdGFiLmggKG1pc2NfaW5mbyk6ICBBZGQgZmllbGQgdG8gbWlzYyBmdW5jdGlvbiB2ZWN0b3IgZm9yCisJYW55IGtpbmQgb2YgY2FjaGVkIGluZm9ybWF0aW9uIHRoZSB0YXJnZXQgY29kZSBkZXNpcmVzLiAgQU1ECisJMjkwMDAgdXNlcyB0aGlzIHRvIGF2b2lkIHJlcGVhdGluZyBleGFtaW5lX2Z1bmN0aW9uX3Byb2xvZ3VlJ3MuCisKKwkqIGNvZmZyZWFkLmM6ICBMaW50LiAgUmVtb3ZlIHN0YXRpYyBzeW1maWxlLCByZWFkX3NlY3Rpb25faGVhZGVyLgorCWNvcmUuYyAoaGF2ZV9jb3JlX2ZpbGVfcCk6ICBMaW50OiByZW1vdmUuCisJZXhwcHJpbnQuYyAocHJpbnRfc3ViZXhwKTogIExpbnQuCisJaW5mcHRyYWNlLmMsIHZhbG9wcy5jLCB2YWxwcmludC5jOiAgbGludC4KKworCVJvbGwgaW4gY2hhbmdlcyBmcm9tIHZ4Z2RiLTUuMC4xOgorCisJKiBzeW10YWIuaDogIENvbW1lbnQgYnl0ZSBvcmRlciBvZiBlYWNoIGFkZHJlc3MgY2xhc3MuICBBZGQKKwlMT0NfTE9DQUxfQVJHIGZvciBmcmFtZS1yZWxhdGl2ZSBhcmdzICg5NjApLgorCWV4cHJlYWQueTogIFVzZSBMT0NfTE9DQUxfQVJHIHdoZXJlIExPQ19BUkcgaXMgdXNlZC4KKwlzeW10YWIuYywgc3ltbWlzYy5jOiAgZGl0dG8uCisJCisJKiBpbmZydW4uYyAoaW5pdF93YWl0X2Zvcl9pbmZlcmlvcik6ICBDbGVhciBzdG9wX3NpZ25hbC4KKworCSogcmVtb3RlLmMgKHJlbW90ZV9yZXN1bWUpOiAgRXJyb3IgaWYgcmVzdW1lIHdpdGggYSBzaWduYWwuCisKKwkqIHN5bWZpbGUuYyAocHJpbV9yZWNvcmRfbWlzY19mdW5jdGlvbik6ICBDbGVhciBtaXNjX2luZm8uCisJKGZpbGxfaW5fdnB0cl9maWVsZG5vKTogIENoZWNrIHN0dWIgdHlwZSBvZiBhcmcuCisKKwkqIHZhbG9wcy5jICh2YWx1ZV9jYXN0KTogIEF2b2lkIGxvb2tpbmcgdXAgbmFtZXMgb2YgdHlwZXMgd2hvc2UKKwluYW1lIHdlIGRvbid0IGtub3csIHRvIHByZXZlbnQgY29yZWR1bXAuICBTdW4gQ0MgcHJvZHVjZXMgdHlwZWRlZgorCXJ0eCBhbmQgdGhlIG5hbWUgb2YgKnJ0eCBpcyB6ZXJvLi4uCisKK01vbiBGZWIgMTggMjE6MTY6MjUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJUm9sbCBpbiBjaGFuZ2VzIGZyb20gZmluYWwgQU1EIDI5MDAwIHBvcnQgKFRpZW1hbm4pLgorCisJdGNvbmZpZy9hbTI5azogIEFkZCBDT0ZGX0VOQ0FQU1VMQVRFIGFuZCBUQVJHRVQ9VEFSR0VUX0FNMjlLCisJZm9yIC4uL2luY2x1ZGUvYS5vdXQuZW5jYXAuaC4gIFRoaXMgbWlnaHQgbm90IHdvcmsgbm93IHRoYXQgQkZECisJaXMgc2VwYXJhdGVseSBjb21waWxlZC4gIEluc3RlYWQsIEJGRCBzdXBwb3J0IGZvciBlbmNhcCB3aWxsIGhhdmUKKwl0byB0cmFuc2xhdGUgbWFjaGluZSB0eXBlIDI5ayBpbnRvIHRoZSByaWdodCBDT0ZGX01BR0lDLgorCQorCSogaW5mY21kLmM6IFJlbW92ZSByZWZlcmVuY2VzIHRvIGluZmVyaW9yX3BpZCB0aGF0IGFyZW4ndCB1c2VkCisJaW4gYWN0dWFsIHB0cmFjZSBjYWxsczsgdXNlIHRhcmdldF9oYXNfZXhlY3V0aW9uLCBldGMuCisJKGhhdmVfaW5mZXJpb3JfcCk6ICBSZW1vdmUgZnVuY3Rpb24uCisJKHByb2dyYW1faW5mbyk6ICBQcmludCB0YXJnZXQgaW5mbyByYXRoZXIgdGhhbiAicHJvY2VzcyBudW1iZXIiOworCWF2b2lkIGdyYXR1aXRvdXMgbWVzc2FnZXMgdW5sZXNzIGZyb21fdHR5LgorCShydW5fc3RhY2tfZHVtbXksIGZpbmlzaF9jb21tYW5kKTogIFNldCBwcm9jZWVkX3RvX2ZpbmlzaC4KKwlpbmZydW4uYzogUmVtb3ZlIGluZmVyaW9yX3BpZCByZWZzLiAgRGVjbCAmIGluaXQgcHJvY2VlZF90b19maW5pc2guCisJbWFpbi5jOiAgTGludC4gIExvc2UgaGF2ZV9pbmZlcmlvcl9wKCkuCisJaW5mZXJpb3IuaCAoaGF2ZV9pbmZlcmlvcl9wKTogIFJlbW92ZSwgbGludC4KKwkocHJvY2VlZF90b19maW5pc2gpOiAgQWRkIGZsYWcgdG8gYXNrIHRoYXQgYWxsIHJlZ3MgYmUgc2F2ZWQKKwlieSBub3JtYWxfc3RvcCwgZm9yIHRoZSBmZXcgY29tbWFuZHMgdGhhdCBuZWVkIGl0LCBzcGVlZGluZyB1cAorCXNlcmlhbCBJL08uICBBZGQgY29tbWVudHMgdG8gc3RvcF9yZWdpc3RlcnMuCisKKwkqIHJlbW90ZS1lYi5jOiAgUmVtb3ZlIG5ld2xpbmUgZnJvbSBicmVha3BvaW50IG1lc3NhZ2Ugd2UgZ3JlcAorCWZvci4gIE5ldmVyIHRpbWUgb3V0IHdoZW4gcnVubmluZyB0aGUgdXNlciBwcm9ncmFtLgorCQorCisKK1dlZCBGZWIgMTMgMTU6MzQ6NDAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJUm9sbCBpbiBjaGFuZ2VzIGZyb20gdnhnZGItNS4wLjE6CisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogSWYgd2UgZW5jb3VudGVyIGEgIkZPUlRSQU4gQ09NTU9OIgorCXN5bWJvbCBpbiBpdHMgcmF3IGZvcm0sIHdlIGFyZSBwcm9jZXNzaW5nIGFuIHVubGlua2VkICIubyIgZmlsZS4KKwlTZWUgaWYgdGhlIHRhcmdldCBlbnZpcm9ubWVudCBoYXMgYXNzaWduZWQgaXQgYW4gYWRkcmVzcywgdXNpbmcKKwl0YXJnZXRfbG9va3VwX3N5bWJvbCAoVnhXb3JrcyBkb2VzKSwgYW5kIGVudGVyIGl0IGludG8gdGhlIHN5bXRhYgorCXRoYXQgd2F5LgorCisJKiB0bS12eHdvcmtzLmggKEZSQU1FX0NIQUlOLCBGUkFNRV9DSEFJTl9WQUxJRCk6ICBPdmVycmlkZSB1c3VhbAorCTY4ayB2ZXJzaW9ucyBmb3IgYSBzaW1wbGVyIHZlcnNpb24gdGhhdCBhc3N1bWVzIHplcm8gRlAgYXQgYm90dG9tLgorCUZpeGVzIGJ1ZyBvZiB0cnVuY2F0ZWQgc3RhY2sgcmVwb3J0cy4KKworCSogdGFyZ2V0LmggKHRhcmdldF9sb29rdXBfc3ltYm9sKTogIERlZmluZSB0aGlzIHJvdXRpbmUncyBhcmdzCisJYW5kIHJlc3VsdCwgZmluYWxseS4KKworCSogdGFyZ2V0LmMgKG5vc3ltYm9sKTogIERlZmF1bHQgcm91dGluZSBmb3IgdGFyZ2V0X2xvb2t1cF9zeW1ib2wuCisJKHRhcmdldF9kZWZhdWx0KTogIERlZmF1bHQgbG9va3VwX3N5bWJvbCBhbmQgY2FsbF9mdW5jdGlvbiB0b28uCisJKGZpbGVzX2luZm8pOiAgT25seSBwcmludCBoYXNfYWxsX21lbW9yeSB3YXJuaW5nIGlmIGEgbm9uLWR1bW15CisJdGFyZ2V0IGZvbGxvd3MuCisKKwkqIHJlbW90ZS12eC5jICh2eF9yZWFkX3JlZ2lzdGVyLCB2eF9jb252ZXJ0X3RvX3ZpcnR1YWwsCisJdnhfY29udmVydF9mcm9tX3ZpcnR1YWwpOiBJZiB0YXJnZXQgZG9lcyBub3QgaGF2ZSBmbG9hdGluZyBwb2ludCwKKwl6ZXJvIHJlZ2lzdGVyICJ2YWx1ZXMiLCBhbmQgYXZvaWQgZG9pbmcgY3Jvc3MtbmV0IGNvbnZlcnNpb25zLgorCSh2eF9sb29rdXBfc3ltYm9sKTogIFJlbmFtZSBuZXRfbG9va3VwX3N5bWJvbCwgYWRkIHRvIHZlY3RvcnMuCisJKHZ4X29wZW4pOiAgUmVhcnJhbmdlIGNvZGUgdGhhdCBhdHRhY2hlcyB0byB0YXJnZXQgYW5kIHJlYWRzCisJc3ltYm9scyBmb3IgYWxsIGxvYWRlZCBtb2R1bGVzLCB0byB3b3JrIGlmIHNvbWUgb2YgdGhlIG1vZHVsZXMKKwlhcmUgbm90IGFjY2Vzc2libGUuICBBZGQgc3ltYm9sX3N0dWIoKSBhbmQgYWRkX3N5bWJvbF9zdHViKCkKKwlhcyBjYWxsYmFja3MgZnJvbSBjYXRjaF9lcnJvcnMoKS4gIEFsbG93IGNvbm5lY3QgYXR0ZW1wdCB0byBiZQorCWludGVycnVwdGVkIHBhaW5sZXNzbHkgd2l0aCBeQyAoRklYTUUsIHRoZXJlIGFyZSBzdGlsbCBzb21lIGJ1Z3MKKwlpZiB0aGUgaW50ZXJydXB0IGhhcHBlbnMgZHVyaW5nIHN5bWJvbCByZWFkaW5nLikuICBQcmludAorCWZpbmFsIG1lc3NhZ2Ugd2l0aCBwdXRzX2ZpbHRlcmVkLCBzaW5jZSBzeW1ib2wgbWVzc2FnZXMgYXJlCisJbm93IGZpbHRlcmVkIHRvby4KKworCU1pc2MgY2xlYW51cDoKKworCSogbWFpbi5jIChjYXRjaF9lcnJvcnMpOiAgT25seSBwcmludCBlcnJzdHJpbmcgaWYgbm9uLW51bGwuCisJKGNvbW1hbmRfbG9vcCk6ICBBdm9pZCBhbiBpb2N0bCBwZXIgY29tbWFuZCB0byB0ZXN0IElTQVRUWS4KKworCSogcmVtb3RlLXZ4LmMgKG5ldF9sb2FkKTogIG1ha2Ugc3RhdGljOyBhdm9pZCBzb3Bob21vcmljIG1zZy4KKwkodnhfeGZlcl9tZW1vcnkpOiAgUmV0dXJuIGNvcnJlY3QgcmVzdWx0IQorCSh2eF9maWxlc19pbmZvKTogIEluZGljYXRlIHdoZXRoZXIgdGFyZ2V0IGhhcyBmbG9hdCBvciBub3QuCisJKHZ4X2xvb2t1cF9zeW1ib2wpOiAgQ29tcGxhaW4sIG5vdCBlcnJvciwgaWYgdGFyZ2V0IGdvbmUuCisJKHZ4X29wZW4pOiAgUHJpbnQgIkNvbm5lY3RlZCIgbXNnIGJlZm9yZSBkaXNhYmxpbmcgaW1tZWRpYXRlLXF1aXQuCisJW0ZJWE1FOiAgbG9va3VwX3N5bWJvbCBhbmQgdnhfb3BlbiBjaGFuZ2VzIG5lZWQgdGVzdGluZy5dCisKKwl0YXJnZXQuYywgcmVtb3RlLWViLmMsIGluZnRhcmcuYywgYW0yOWstb3Bjb2RlLmgsIHRhcmdldC5oLAorCXRtLTI5ay5oLCB0bW0tdnh3b3JrczY4LmgsIHN5bWZpbGUuYywgZ2RiLWludC50ZXhpbmZvOiBBZGQKKwljb250cmlidXRvciBsaW5lcyBhbmQgdXBkYXRlIGNvcHlyaWdodHMgdG8gMTk5MS4KKworCUNoYW5nZXMgZnJvbSBhbiBhdHRlbXB0ZWQgSC1QVVggaG9zdCBwb3J0OgorCisJKiBpbmZwdHJhY2UuYyAoUFRfQVRUQUNILCBQVF9ERVRBQ0gpOiAgSGFuZGxlIEhQL1VYLCB3aGljaCAKKwlkZWZpbmVzIFBUX0FUVEFDSCBhbmQgUFRfREVUQUNIIGJ1dCBub3QgUFRfS0lMTC4KKwkqIHJlbW90ZS1lYi5jIChlYl9vcGVuKTogIE1pc3BsYWNlZCBlbmRpZiBraWxscyBzeXN2IEgvUFVYLgorCSogcmVtb3RlLXZ4LmM6IGluY2x1ZGUgPHN5cy90aW1lLmg+IGZvciBIUFVYLgorCSogaHAzMDBocHV4LXhkZXAuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiAgUmV3cml0ZSBvbGQKKwkiY29yZV9maWxlX2NvbW1hbmQiIHJvdXRpbmUgdG8gQkZEIHJlZ2ltZS4gIE1heSBub3Qgd29yayB5ZXQuCisKKwlBdHRlbXB0ZWQgcG9ydCBvZiAiZ2RiLTMuNCBWYW4gSmFjb2Jzb24geGdkYiIgdG8gbW9kZXJuIGdkYi4KKworCSogeGdkYi5jOiBSZXBsYWNlIFgxMCB2ZXJzaW9uIHdpdGggc29tZSBWSiB2ZXJzaW9uLgorCShGSVhNRTogIEl0cyBjb3B5cmlnaHQgYXNzaWdubWVudCBpcyBub3Qgb24gcmVjb3JkLikKKwkqIHhnZGIuYzogIFVwZGF0ZSBpbmNsdWRlIGZpbGVzIHRvIFgxMVI0IChYYXcgY3J1ZCkuCisJKHhnZGJfZGlzcGxheV9zb3VyY2UsIGNyZWF0ZV90ZXh0X3dpZGdldCk6IGZpeCBjYWxsIHRvCisJZ2V0X2ZpbGVuYW1lX2FuZF9jaGFycG9zLiAgUmV3YWNrIHNvdXJjZSB3aW5kb3cgc3R1ZmYgZm9yIFgxMVI0CisJKGdsZWFuZWQgZnJvbSBpbmNsdWRlIGZpbGVzLCBhbmQgIm5tJ3MiIG9mIGJpbmFyeSBsaWJyYXJpZXMsIHNpbmNlCisJSSBoYWQgbm8gZG9jIGF2YWlsYWJsZSkuCisJKGFwcGVuZF9zZWxlY3Rpb24sIGFwcGVuZF9zZWxlY3Rpb25fd29yZCk6IERpc2FibGUgd2l0aCBGSVhNRQorCXNpbmNlIFI0IGNoYW5nZWQgaW50ZXJmYWNlIGhlcmUuCisJKGNyZWF0ZV9idXR0b25zKTogIEFkZCBiYWNrIHRoZSBvbGQgc2V0IG9mIGJ1dHRvbnMuCisJKHhnZGJfY3JlYXRlX3dpbmRvdyk6ICBGaXggY2FsbCB0byBYdEluaXRpYWxpemUgKCZhcmdjIG5vdCBhcmdjKS4KKworCSogTWFrZWZpbGUuZGlzdCAoeGdkYiwgeGdkYi1pbml0LmMpOiAgVXBkYXRlIGZvciBYMTFSNCBvbiBTdW5zLgorCVJvbGwgVkVSU0lPTiB0byAzLjk0IChub3QgeWV0IGZpbmFsIHRob3VnaCkuCisKK1NhdCBGZWIgIDkgMDk6NDY6MjUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBvYnN0YWNrLmggKG9ic3RhY2tfcHRyX2dyb3csIG9ic3RhY2tfcHRyX2dyb3dfZmFzdCwKKwlvYnN0YWNrX2ludF9ncm93LCBvYnN0YWNrX2ludF9ncm93X2Zhc3QpOiAgRWxpbWluYXRlCisJY2FzdCBvbiBsZWZ0IG9mIGFzc2lnbm1lbnQsIHdoaWNoIGdpdmVzIE1JUFMgY2MgZml0cyBhbmQgaXMKKwlub3QgU3RhbmRhcmQgQy4KKworCSogc3BhcmMtcGluc24uYyAocHJpbnRfaW5zbik6IEVsaW1pbmF0ZSAnc2V0JyB0ZXN0LCBzdWJzdW1lZCBieQorCUZfQUxJQVMuICBVc2UgcHJpbnRmLCBub3QgZnByaW50Ziwgd2hlbiBub3QgcGFzc2luZyBhIGZpbGUKKwlwb2ludGVyLi4uCisJKGNvbXBhcmVfb3Bjb2Rlcyk6IENoZWNrIHRoYXQgaWRlbnRpY2FsIGluc3RydWN0aW9ucyBoYXZlCisJaWRlbnRpY2FsIG9wY29kZXMsIGNvbXBsYWluIG90aGVyd2lzZS4KKworCSogc3BhcmMtb3Bjb2RlLmggKHN0ICVmc3IpOiAgRml4IG9wY29kZSAibG9zZSIgbWFzay4gIFRoaXMKKwl3YXMgcmVwb3J0ZWQgYnkgUm9sYW5kIE1jR3JhdGguCisJKHVuaW1wKTogT25seSBtYXRjaCBpZiBleGFjdGx5IHplcm8gaW5zdHJ1Y3Rpb24uICAoUm9sYW5kKQorCShicmFuY2hlcyBhbmQgdHJhcHMpOiAgR2VuZXJhdGUgYWxsIHZhcmlhdGlvbnMgb2YgdGhlc2UKKwlpbnN0cnVjdGlvbnMgd2l0aCBtYWNyb3MsIGJhc2VkIG9uIGEgc2luZ2xlIGNhbGwgdGhhdCBkZWZpbmVzCisJZWFjaCBjb25kaXRpb24gbmFtZSBhbmQgaXRzIGJpbmFyeSByZXByZXNlbnRhdGlvbi4KKwkoc2V0KTogIFR1cm4gb24gYWxpYXMgYml0LCB0byBhdm9pZCB0ZXN0IGluIHNwYXJjLXBpbnNuLmMuCisKKwkqIHZhbHByaW50LmMgKHZhbF9wcmludF9maWVsZHMpOiAgVGFrZSwgYW5kIHVzZSwgZm9ybWF0IHBhcmFtZXRlci4KKwlUaGlzIG1lYW5zIHRoYXQgInAveCBzdHJ1Y3QiIGFnYWluIHByaW50cyB0aGUgZWxlbWVudHMgaW4gdGhlCisJZGVzaXJlZCBmb3JtYXQuICBDaGFuZ2VkIGNhbGxlcnMuCisKKwkqIHN0YWNrLmMgKGZyYW1lX2luZm8pOiAgVXNlIGZpbHRlcmVkIG91dHB1dCwgYW5kIGluZGljYXRlIHdyYXAKKwlwb2ludHMuICBSZW1vdmUga2x1ZGd5IGZvcm1hdHRpbmcgZGVzaWduZWQgdG8gYXZvaWQgbGluZSB3cmFwLgorCisJKiB1dGlscy5jICh3cmFwX2hlcmUpOiAgSWYgdGhlIGxpbmUgaXMgYWxyZWFkeSBmdWxsIChiZWNhdXNlCisJd2UgaGFkIHByaW50ZWQgYSBsb25nIGluZGVudCBvciBsb25nIHdyYXBwZWQgc3RyaW5nKSwgZG8gYW4KKwlpbW1lZGlhdGUgbmV3bGluZS1hbmQtaW5kZW50LgorCisJKiBtNjhrLXBpbnNuLmMgKHByaW50X2luc25fYXJnKTogQnVnZml4IGZyb20KKwludG10diF0aG9tcHNvbkBhbWVzLmFyYy5uYXNhLmdvdiAoTWlrZSBUaG9tcHNvbik6ICdia3B0ICMwJworCWluc3RydWN0aW9uIGlzIGluY29ycmVjdGx5IGRpc2Fzc2VtYmxlZCBhcyBia3B0ICM4LgorCisJKiBkYnhyZWFkLmMgKGVuZF9wc3ltdGFiKTogQnVnZml4IGZyb20gUGV0ZXIgU2NoYXVlcgorCTxwZXNyZW1AcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT46IElmIHlvdSB3YW50IHRvIHNldCBhCisJYnJlYWtwb2ludCBpbiBhICoueSBmaWxlIGdkYiB3aWxsIHNheSBSZWFkaW5nIGluIHN5bWJvbHMgZm9yICoueS4uLgorCWFuZCB0aGVuIHdpbGwgZHVtcCBjb3JlIChzb21ldGltZXMpLiBJIHRyYWNlZCBpdCBiYWNrIHRvIGFuCisJdW5pbml0aWFsaXplZCBzeW1maWxlX25hbWUgaW4gcHN5bXRhYl90b19zeW10YWIuCisJKGNvbnN0X3ZvbF9jb21wbGFpbnQpOiAgQWRkIHF1b3RlcyB0byBtZXNzYWdlLgorCShkZWZpbmVfc3ltYm9sKTogIE9ubHkgYmVsaWV2ZSBsaW5lIG51bWJlciBpZiBnY2NfY29tcGlsZWQuCisJQXZvaWQgYWxsb2NhdGluZyBzeW1ib2wgaWYgd2Ugd2lsbCBub3QgcmV0dXJuIGl0LgorCisJQWRkIHRhcmdldCBzdHJhdGEgc3VwcG9ydCBzbyB0aGF0IG5ld2x5IGVzdGFibGlzaGVkIHRhcmdldHMgZ28KKwlpbnRvIHRoZWlyIHJpZ2h0IHBsYWNlIGluIHRoZSB0YXJnZXQgc3RhY2sgKGUuZy4gYSBuZXcgZXhlYyBmaWxlCisJZG9lc24ndCB3aXBlIG91dCB0aGUgYWJpbGl0eSB0byBhY2Nlc3MgdGhlIHJ1bm5pbmcgcHJvY2VzcykuCisKKwkqIHRhcmdldC5oLCBjb3JlLmMsIGV4ZWMuYywgaW5mdGFyZy5jLCByZW1vdGUtZWIuYywKKwlyZW1vdGUtbmluZHkuYywgcmVtb3RlLXZ4LmMsIHJlbW90ZS5jLCB0YXJnZXQuYzogIEFkZCB0b19zdHJhdHVtCisJYW5kIGluaXRpYWxpemUgaXQgcHJvcGVybHkgaW4gYWxsIHRoZSB0YXJnZXRzLgorCisJKiB0YXJnZXQuaDogIERvY3VtZW50IHN0cmF0YS4gIENoYW5nZSByZXR1cm4gdHlwZSBvZiBwdXNoX3RhcmdldC4KKworCSogdGFyZ2V0LmMgKG5vbWVtb3J5KTogIG5ldyBmdW5jdGlvbiBmb3IgZHVtbXkgbWVtb3J5IGFjY2Vzcy4KKwkodGNvbXBsYWluKTogIFJlbmFtZSBjb21wbGFpbiwgbm93IGFsc28gdXNlZCBpbiBzeW1maWxlLmMuCisJKHB1c2hfdGFyZ2V0KTogIFB1c2ggdGFyZ2V0cyB3aXRoaW4gc3RyYXRhLiAgTmV3IHJldHVybiB2YWx1ZSBzaG93cworCXdoZXRoZXIgbmV3IHRhcmdldCBpcyBvbiB0b3Agb2Ygc3RhY2sgb3Igbm90LiAgQWx3YXlzIGtlZXAgZHVtbXkKKwl0YXJnZXQgb24gc3RhY2suCisJKHRhcmdldF9maWxlc19pbmZvKTogIElnbm9yZSBkdW1teSB0YXJnZXQuCisKKwkqIGNvcmUuYyAoY29yZV9vcGVuKTogIFdhcm4gdXNlciwgYW5kIHNraXAgYWNjZXNzaW5nIGZpbGUsIGlmIHRoZQorCWNvcmUgdGFyZ2V0IGlzIG5vdCB0aGUgdG9wbW9zdCB0YXJnZXQgaW4gdGhlIHN0YWNrLgorCSogcmVtb3RlLW5pbmR5LmMgKG5pbmR5X2NyZWF0ZV9pbmZlcmlvcik6ICBBdm9pZCB1bnB1c2hfdGFyZ2V0LCBub3cKKwlhbHJlYWR5IGhhbmRsZWQuCisKKwkqIHJlbW90ZS12eC5jOiAgUmVtb3ZlIHZ4X3ByZXBhcmVfdG9fc3RvcmUgZnJvbSB2eHdvcmtzIG1lbW9yeQorCXRhcmdldF9vcHMsIGl0IGRvZXNuJ3QgYmVsb25nIHRoZXJlIHNpbmNlIHdlIGhhdmUgbm8gcmVncyB0aGVyZS4KKwlDaGFuZ2UgbmFtZSBvZiB0YXJnZXQgZnJvbSBtYWNoaW5lID0+IG1lbW9yeSB0byBjbGFyaWZ5LgorCitUaHUgRmViICA3IDE2OjMyOjA5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBzcGlmZi5jeWdudXMuY29tKQorCisJKiBGcmVlemUgdmVyc2lvbiAzLjkzIGZvciByZWxlYXNlLgorCisJKiBNYWtlZmlsZS5kaXN0OiAgSGFuZGxlIHZ4LXNoYXJlIGFuZCBuaW5keS1zaGFyZSBzdWJkaXJzCisJcHJvcGVybHkgd2hlbiBidWlsZGluZyBnZGIudGFyLlouCisKKwkqIHN5bXRhYi5jOiAgbGludDsgYWRkIG5vX3N5bXRhYl9tc2cgdG8gY29uc29saWRhdGUgdGhlIG1lc3NhZ2VzCisJcHJpbnRlZCBpbiB2YXJpb3VzIHBsYWNlcywgc28gSSBjb3VsZCBjaGFuZ2UganVzdCBvbmUgY29weS4KKworCSogZGJ4cmVhZC5jLCBjb2ZmcmVhZC5jOiAgQ2hhbmdlIHJlZmVyZW5jZXMgdG8gYmZkLT5pb3N0cmVhbQorCXRvIGNhc3QgdG8gRklMRSAqLCBub3cgdGhhdCBCRkQgYXZvaWRzIG5lZWRpbmcgdHlwZXMgZGVmaW5lZAorCWluIG90aGVyIGhlYWRlciBmaWxlcy4KKworVHVlIEZlYiAgNSAyMTozOTozNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGNvbW1hbmQuYywgZGJ4cmVhZC5jLCBleHBwcmludC5jLCBpbmZjbWQuYywgaW5mcHRyYWNlLmMsCisJaW5mcnVuLmMsIHByaW50Y21kLmMsIHJlbW90ZS1uaW5keS5jLCBzb3VyY2UuYywgc3BhcmMtdGRlcC5jLAorCXNwYXJjLXhkZXAuYywgc3ltZmlsZS5oLCBzeW1taXNjLmMsIHV0aWxzLmMsIHZhbHByaW50LmM6IExpbnQKKwkoYWN0dWFsbHkgZ2NjIC1XYWxsKS4KKworCSogZGJ4cmVhZC5jOiAgUmVtb3ZlIGZpcnN0X2dsb2JhbF9zeW0sIGxhc3RfZ2xvYmFsX3N5bSwgc2luY2UKKwl0aGV5IGFyZSBuZXZlciByZWZlcmVuY2VkLgorCisJKiBkZWZzLmggKGJhdWRfcmF0ZSk6ICBEZWNsYXJlLgorCW1haW4uYzogRGVmaW5lIGl0LCBhbmQgYWRkIHRoZSAtYiBvcHRpb24gdG8gc2V0IGl0LgorCisJKiBnZGItaW50LnRleGluZm86ICBBZGQgdGV4dCBvbiBob3cgdG8gZGVmaW5lIGEgbmV3IGhvc3Qgb3IgdGFyZ2V0CisJYXJjaGl0ZWN0dXJlLCBwcm9tcHRlZCBieSBQZXIgQm90aG5lcidzIHF1ZXN0aW9ucyBhYm91dCBNSVBTCisJc3VwcG9ydC4KKworCSogZ2RiLnRleGluZm86ICBEb2N1bWVudCAiY29tcGxhaW50cyIuICBDaGFuZ2UgZG9jIG9mIC1xIHNpbmNlCisJZ2RiIG5vIGxvbmdlciBwcmludHMgdGhlIGNvcHlyaWdodCBhbmQgYmx1cmIgaWYgeW91IHNwZWNpZnkgYSBmaWxlCisJbmFtZSB0byBiZSBkZWJ1Z2dlZCAoanVzdCBsaWtlIEVtYWNzKS4gIEFkZCBkb2MgZm9yIE5pbmR5LXNwZWNpZmljCisJY29tbWFuZCBsaW5lIGZsYWdzIGZvciBzcGVjaWZ5aW5nIHRhcmdldCBzZXJpYWwgcG9ydCBhbmQgc3VjaC4KKwlVcGRhdGUgY29weXJpZ2h0IHRvIDE5OTEuCisKKwkqIGdkYmNvcmUuaDogIFJlbW92ZSBhIGxhcmdlIG1hc3Mgb2Ygbm93LXVzZWxlc3MgY3J1ZCwgc2luY2UgQkZECisJaGFzIHRha2VuIG92ZXIgZm9yIHVzIHRoZSBqb2Igb2YgcmlwcGluZyB1cCBleGVjdXRhYmxlIGZpbGVzLiAgVGhlCisJY3J1ZCBjYXVzZWQgUGVyIEJvdGhuZXIncyBwb3J0IHRvIG5vdCBjb21waWxlLgorCisJKiBpbmZydW4uYyAobm9ybWFsX3N0b3ApOiAgQXZvaWQgcHJpbnRpbmcgIlByb2dyYW0gZXhpdGVkCisJbm9ybWFsbHkiIGlmIHdlIGFyZSBpbiBiYXRjaCBtb2RlLiAgVGhpcyBhbGxvd3MgYSBHREIgd2hpY2gKKwlleGVjdXRlcyBhIHByb2dyYW0gb24gYSB0YXJnZXQgc3lzdGVtLCB0byBiZWhhdmUgbGlrZSBhIFVuaXgKKwljb21tYW5kIChpbnB1dCBmcm9tIHN0ZGluLCBvdXRwdXQgdG8gc3Rkb3V0LCBubyBleHRyYW5lb3VzCisJb3V0cHV0KS4KKworCSogbWFpbi5jIChtYWluKTogIEFsbG93IGFkZGl0aW9uYWwgbWFjaGluZS1kZXBlbmRlbnQgY29tbWFuZCBsaW5lCisJb3B0aW9ucyB0byBiZSBzcGVjaWZpZWQgd2l0aCB0aGUgQURESVRJT05BTF9PUFRJT05TLAorCUFERElUSU9OQUxfT1BUSU9OX0NBU0VTLCBBRERJVElPTkFMX09QVElPTl9IRUxQLCBhbmQKKwlBRERJVElPTkFMX09QVElPTl9IQU5ETEVSIG1hY3Jvcy4gIEFsc28gYWxsb3cgbWFjaGluZS1kZXBlbmRlbnQKKwlwcm9jZXNzaW5nIHRvIG9jY3VyIGp1c3QgYmVmb3JlIHRoZSBtYWluIGxvb3Agd2l0aAorCUJFRk9SRV9NQUlOX0xPT1BfSE9PSy4gIAorCShtYWluKTogIElmIGEgImNvcmUgZmlsZSIgYXJndW1lbnQgaXMgc3BlY2lmaWVkLCBhbmQgaXQgaXMgbm90IGEKKwljb3JlIGZpbGUsIHRyeSBpdCBhcyBhIHByb2Nlc3MgSUQgdG8gYXR0YWNoLiAgCisJKHN5bWJvbF9jb21wbGV0aW9uX2Z1bmN0aW9uKTogIEF0dGVtcHQgdG8gY29wZSB3aXRoIAorCSJzaG93IHNjcmVlbi0iIFRBQiwgbm90IHZlcnkgc3VjY2Vzc2Z1bGx5LiAgVGhpcyBuZWVkcyBtb3JlIHdvcmssCisJRklYTUUuCisJKGJhdGNoX2ZpbGUpOiAgTmV3IGZ1bmN0aW9uLCByZXR1cm5zIHdoZXRoZXIgd2UgYXJlIHJlYWRpbmcKKwljb21tYW5kcyBmcm9tIGFuIGludGVyYWN0aXZlIHR0eSBvbiBzdGRpbiwgb3IgZnJvbSBzb21ld2hlcmUgZWxzZS4KKwlDYWxsZWQgYnkgbm9ybWFsX3N0b3Agc2luY2UgaXQgZG9lc24ndCBnZXQgZnJvbV90dHkgcGFzc2VkIGRvd24KKwl0byBpdCBsaWtlIG1hbnkgY29tbWFuZHMgZG8uCisKKwkqIHJlbW90ZS1uaW5keS5jOiAgSGFuZGxlIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciBuaW5keQorCWNvbm5lY3Rpb24uCisJKG5pbmR5X2JlZm9yZV9tYWluX2xvb3ApOiAgUHJvbXB0IHVzZXIgZm9yIHR0eSBuYW1lIGlmIHRoZXkKKwlkb24ndCBzcGVjaWZ5IGl0IGJlZm9yZSBnZXR0aW5nIHRvIHRoZSBpbnRlcmFjdGl2ZSBjb21tYW5kIGxvb3AuCisKKwkqIHRtLWk5NjAuYzogIEFkZCBBRERJVElPTkFMX09QVElPTlMsIGV0YywgdG8gaGFuZGxlIC1PLCAtYnJrLAorCWFuZCAtciBjb21tYW5kIGxpbmUgb3B0aW9ucy4gIEFsc28gYWRkIGhvb2sgYmVmb3JlIG1haW4gbG9vcAorCXRvIG1ha2UgaXQgZWFzeSB0byBzcGVjaWZ5IGEgdHR5LgorCisJKiBUT0RPOiAgTW9yZSB0aGluZ3MgdG8gZG8sIG9uZSBkb25lLgorCitNb24gRmViICA0IDIzOjU3OjM5IDE5OTEgIEpvaG4gR2lsbW9yZSBhbmQgTWlrZSBUaWVtYW5uICAoYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGRieHJlYWQuYzogIE1ha2UgY29tcGxhaW50KCkgY2FsbHMgcGFzcyBwb2ludGVyLCBub3Qgc3RydWN0LgorCUFkZCBjb21wbGFpbnRzIGFib3V0IGJhZGx5IGZvcm1hdHRlZCBDKysgdHlwZSBpbmZvcm1hdGlvbgorCShjb25zdC92b2xhdGlsZSBpbmRpY2F0b3IsIGFuZCBwYXJzZSBlcnJvcnMgcmVzdWx0aW5nIGluCisJZXJyb3JfdHlwZSkuICBGaXggQysrIHZpcnR1YWwgbWVtYmVyIGZuIGNvbW1lbnQuCisJKHJlYWRfc3RydWN0X3R5cGUpOiAgQXZvaWQgYnVtcGluZyBwb2ludGVyIGlmIHdlIGdvdCBhIHBhcnNlCisJZXJyb3I7IHRoaXMgcHJldmVudHMgb3VyIHdhbGtpbmcgYmV5b25kIHRoZSBlbmQgb2YgYSBzdHJpbmcuCisJVGVybWluYXRlIGxvb3Agb24gbnVsbCBjaGFyIGFzIHdlbGwgYXMgc2VtaWNvbG9uLgorCShwcm9jZXNzX29uZV9zeW1ib2wpOiAgRml4IHRoZSBMQlJBQyBmaXggc28gdGhhdCBpdCB1c2VzIHRoZQorCWxhc3QgcHJldmlvdXMgU0xJTkUsIEZVTiwgb3IgU08gcmVjb3JkJ3MgUEMgYWRkcmVzcy4gIEMrKyBkZWJ1ZworCXN5bWJvbHMgZGlkIG5vdCBoYXZlIFNMSU5FIHJlY29yZHMgaW4gYSB1c2VmdWwgb3JkZXIgY29tcGFyZWQKKwl0byB0aGUgTEJSQUMgcmVjb3Jkcy4KKwkoZGVmaW5lX3N5bWJvbCk6ICBIYW5kbGUgImNhdGNoIiByZWNvcmRzLgorCisJKiBzeW10YWIuYyAoY2hlY2tfc3R1Yl90eXBlKTogIEFkZGVkIG5ldyBjb21wbGFpbgorCWBzdHViX25vbmFtZV9jb21wbGFpbicgYW5kIGFkZGVkIGEgY29uc2lzdGVuY3kgY2hlY2sgdG8KKwlrZWVwIHRoZSBkZWJ1Z2dlciBmcm9tIGNyYXNoaW5nIHdoZW4gZmluaXNoaW5nIGZyb20gYW4KKwlleGNlcHRpb24gZnJhbWUuICBBIHJlYWwgZml4IHdpbGwgYmUgbmVlZGVkIGxhdGVyLgorCitTYXQgRmViICAyIDEwOjQzOjA1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogaW5mY21kLmMgKGF0dGFjaF9jb21tYW5kKTogIE1ha2UgZ2xvYmFsLgorCisJKiBNYWtlZmlsZS5kaXN0IChSRU1PVEVfT0JTKTogIE1ha2UgdGhlc2UgY29tcGlsZSBieSBkZWZhdWx0LAorCWJ1dCBtYWtlIHRoZW0gZWFzeSB0byBjb21tZW50IG91dC4gIFBlcmhhcHMgbGF0ZXIgdGhleSBzaG91bGQKKwliZSBlbmFibGVkIGJ5IHdoYXQgQ1BVIHlvdSBjb25maWd1cmUgZm9yPyAgRklYTUUuCisJKFZFUlNJT04pOiAgUm9sbCB0byAzLjkzLgorCShwaW5zbi5vKTogIFJlbW92ZSBydWxlIGZvciBvYnNvbGV0ZSBmaWxlLgorCShkYnhyZWFkLm8sY29mZnJlYWQubyxtaXBzcmVhZC5vKTogIFVzZSAke3NyY2Rpcn0gZXhwbGljaXRseS4KKworCVJ1biBkb3duIGEgcHJvYmxlbSB0aGF0IG1hbmlmZXN0ZWQgYnkgcHJpbnRpbmcgdGhlIHdyb25nIGZ1bmN0aW9uCisJbmFtZSBpbiBzdGFjayB0cmFjZXMgb2YgcmVhZF9vZmlsZV9zeW10YWIuICBUdXJuZWQgb3V0IHRoYXQgdGhlIAorCXByb2JsZW0gd2FzIHRoZSBTdW5PUyA0LjEuMSAoYW5kIHByZXZpb3VzKSBDIGNvbXBpbGVyIG91dHB1dHMKKwl0aGUgTEJSQUMgc3ltYm9sIHdpdGggYW4gYWRkcmVzcyBpbiB0aGUgKmRhdGEqIHNlZ21lbnQsIHdoaWNoCisJYmxldyBvdXIgYmluYXJ5IHNlYXJjaCB0aHJvdWdoIHRoZSBibG9ja3MuCisKKwkqIGRieHJlYWQuYzogVXNlIHRoZSBjb21wbGFpbigpIGZhY2lsaXR5IGNvbnNpc3RlbnRseSB0byBiaXRjaAorCWFib3V0IHByb2JsZW1zIGluIHRoZSBzeW1ib2wgZmlsZSB3ZSBhcmUgcmVhZGluZy4KKwkoZmluaXNoX2Jsb2NrKTogIEFkZCBjb2RlIHRvIGNoZWNrIHRoZSBuZXN0aW5nIG9mIHRoZSBibG9ja3M7CisJY29tcGxhaW4gYW5kIFByb2NydXN0IHRoZW0gdG8gZml0IGlmIHdyb25nLgorCShtYWtlX2Jsb2NrdmVjdG9yKTogIENoZWNrIHRoZSBvcmRlciBvZiB0aGUgYmxvY2tzLCBjb21wbGFpbiAKKwlbYnV0IGRvbid0IGNvcGVdIGlmIHdyb25nLgorCShwcm9jZXNzX29uZV9zeW1ib2wpOiAgaWZuZGVmIFNVTl9GSVhFRF9MQlJBQ19CVUcsIGNoZWNrIExCUkFDCisJc3ltYm9scyB0byBiZSBzdXJlIHRoZWlyIFBDIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGFzdCBTTElORQorCShsaW5lIG51bWJlcikgc3ltYm9sIHdlJ3ZlIHNlZW4sIGNvbXBsYWluaW5nIGFuZCBhZG9wdGluZyB0aGUKKwlTTElORSBQQyB2YWx1ZSBpZiB3cm9uZy4KKworCSogc3ltZmlsZS5oIChzdHJ1Y3QgY29tcGxhaW50LCBjb21wbGFpbnRfcm9vdCwgY29tcGxhaW4sIAorCWNsZWFyX2NvbXBsYWludHMpOiAgQWRkLgorCSogc3ltZmlsZS5jIChjb21wbGFpbiwgY29tcGxhaW50X3Jvb3QsIGNsZWFyX2NvbXBsYWludHMpOiAgQWRkCisJZmFjaWxpdHkgdG8gZGVhbCB3aXRoIG5vbi1mYXRhbCBjb21wbGFpbnRzIGFuZCB0byByZWd1bGFyaXplIHRoZWlyCisJc3VwcHJlc3Npb24uCisJKHN5bWJvbF9maWxlX2FkZCk6ICBDbGVhciBjb21wbGFpbnQgY291bnRlcnMgdG8gYWxsb3cgbmV3IGNvbXBsYWludHMuCisJKGluaXRpYWxpemVfc3ltZmlsZSk6ICBBZGQgJ3NldCBjb21wbGFpbnRzJyBhbmQgJ3Nob3cgY29tcGxhaW50cycuCisKKwkqIGRieHJlYWQuYyAoZGJ4X3N5bWZpbGVfcmVhZCk6ICBSZW1lbWJlciB0aGUgYWRkcmVzcyBhbmQgc2l6ZQorCW9mIHRoZSBzdHJpbmcgdGFibGUgZm9yIHRoZSBtYWluIHN5bWJvbCBmaWxlLCBzbyB3ZSB3b24ndCByZWFkIGl0CisJbW9yZSB0aGFuIG9uY2UuCisJKGRieF9wc3ltdGFiX3RvX3N5bXRhYik6ICBGaXggdGhlIGNoZWNrIGZvciBtYWluIHN5bWJvbCBmaWxlLAorCXRvIGF2b2lkIHJlYWRpbmcgdGhlIHN0cmluZyB0YWJsZSB5ZXQgYWdhaW4uICBMaW50LgorCSh0aHJvdWdob3V0KTogIEltcHJvdmUgZmlsdGVyZWQgb3V0cHV0LCBpbmNsdWRpbmcgd29yZCB3cmFwLgorCShyZWFkX3JhbmdlX3R5cGUpOiAgSW1wcm92ZSBCb3RobmVyJ3MgZml4IHRvIGhhbmRsZSBvdGhlciB0eXBlcyB0b28uCisKKwkqIHV0aWxzLmM6ICBJbXByb3ZlIGxpbmUgd3JhcCBpbXBsZW1lbnRhdGlvbi4gIEhhbmRsZSB1bmxpbWl0ZWQKKwl3aWR0aCBieSBtYWtpbmcgY2hhcnNfcGVyX2xpbmUgdW5zaWduZWQuCisJKHB1dHNfZmlsdGVyZWQpOiAgTmV3LCBlYXN5LCBmdW5jdGlvbi4JCisKKwkqIGRlZnMuaCAocHV0c19maWx0ZXJlZCk6ICBhZGQuCisKKwkqIG1pcHNyZWFkLmMgKGNvbXBhcmVfc3ltYm9scywgc29ydF9zeW10YWIpOiAgUmVtb3ZlIHRoZXNlIGZucywKKwljYWxsIHRoZSBpZGVudGljYWwgc29ydF9zeW10YWJfc3ltcygpIGluIHN5bWZpbGUuYyBpbnN0ZWFkLgorCisJKiBleHByZWFkLnk6ICBTdWdnZXN0IHRoZSBgZmlsZScgY29tbWFuZCByYXRoZXIgdGhhbiBgc3ltYm9sLWZpbGUnLgorCisJKiBjb21tYW5kLmggKGVudW0gdmFyX3R5cGVzKTogIEFkZCB6aW50ZWdlciBmb3Igc2Vyb2FibGUKKwl1bnNpZ25lZCBpbnRlZ2VyLgorCSogY29tbWFuZC5jIChkb19zZXRzaG93X2NvbW1hbmQpOiAgSGFuZGxlIHZhcl96aW50ZWdlci4gIFJlc3RydWN0dXJlCisJbmVzdGVkIGlmJ3MgaW50byBhIHN3aXRjaC4KKworCSogYnJlYWtwb2ludC5jIChicHN0YXRfcHJpbnQpOiBJZiBicHN0YXQgInByaW50IiBmbGFnIGlzIG5vdCBzZXQsCisJd2UgZGlkIG5vdCBzdG9wIGJlY2F1c2Ugb2YgYSBicmVha3BvaW50IChpdCBtdXN0IGhhdmUgYmVlbiBmb3IKKwlzb21lIG90aGVyIHJlYXNvbiwgbGlrZSBhICJzdGVwaSIpLCBzbyBkb24ndCBwcmludCBhbnl0aGluZy4KKworCSogc3ltdGFiLmM6IEluY2x1ZGUgPHN5cy90eXBlcy5oPiBhbGwgdGhlIHRpbWUuICBOb3cgdGhhdCBCRkQKKwlkb2Vzbid0IGluY2x1ZGUgPHN5cy90eXBlcy5oPiwgb2xkIFN1bk9TJ3MgcmVxdWlyZSBpdCBmb3IKKwk8c3lzL3N0YXQuaD4uCisKK1NhdCBGZWIgIDIgMTA6Mzk6MTUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyQGNzLndpc2MuZWR1KQorCisJQSB0ZXN0IHBvcnQgb2YgZ2RiLTMuOTIuNiB0byB0aGUgU29ueSBORVdTLgorCisJKiBNYWtlZmlsZS5kaXN0CisJRG9uJ3Qgbm9ybWFsbHkgbGluayBpbiByZW1vdGUtIG9yIHZ4IHN0dWZmLgorCVNvbWUgb2YgaXQgZG9lc24ndCBjb21waWxlLCBhbmQgaXQgd2FzdGVzIHNwYWNlIGZvciA5OSUJb2YgdGhlIHVzZXJzLgorCVJlbW92ZSByZWZlcmVuY2UgdG8gbm8tbG9uZ2VyLXVzZWQgSEFWRV9WUFJJTlRGLgorCUZpeGVkIEJGRF9ERVAgdHlwbyB0byBCRkRfRElSLgorCSogZGJ4cmVhZC5jCisJRml4IGNhc3QgaW4gYXJnIHRvIGJmZF9oX2dldGxvbmcuCisJTWFrZSBjaGFyICpwcmVmaXggYmUgY29uc3QuCisJRml4IGhvdyBjZXJ0YWluIHJhbmdlIHR5cGVzIGFyZSBtYXBwZWQgaW50byBidWlsdGluIHVuc2lnbmVkIGludCB0eXBlcy4KKwkqIGluZnJ1bi5jCisJUmVtb3ZlIDIgI2luY2x1ZGVzLiBUaGV5IGNhdXNlIGVycm9ycyAob24gU29ueSwgYXQgbGVhc3QpLAorCWFuZCBhcmVuJ3QgbmVlZGVkICh0aGV5IHdlcm4ndCBpbiBlYXJsaWVyIHZlcnNpb25zKS4KKwkqIHByaW50Y21kLmMKKwlwcmludF9hZGRyZXNzX3N5bWJvbGljIHNob3VsZCBuZXZlciBkZW1hbmdsZSBsYWJlbHMKKwkoc2luY2UgaXQgcHJpbnRzICphc3NlbWJsZXItbGV2ZWwqIGxhYmVscykuCisKKwkgICAgICAgW1RoaXMgd2FzIHN1cGVyc2VkZWQgYnkgdGhlIGNoYW5nZSB0byBwcmludGNtZCBiZWxvdy5dCisKKwkqIHV0aWxzLmMKKwlBZGQgc29tZSAidm9sYXRpbGUiIHJldHVybiB0eXBlcyB0byBhdm9pZCB3YXJuaW5ncy4KKwlJZiBNSVNTSU5HX1ZQUklOVEYgYWRkIHZwcmludGYgZnVuY3Rpb24gYW5kIG5vdCBqdXN0IG1hY3JvCisJKHNpbmNlIHZwcmludGYgaXMgdXNlZCBpbiBwcmludGNtZC5jKS4KKwkqIHZhbHByaW50LmMKKwlVbmxlc3MgX19HTlVDX18sIHVzZSBvYnN0YWNrX2dyb3cgaW5zdGVhZCBvZiBvYnN0YWNrX3B0cl9ncm93LgorCShUaGUgbGF0dGVyIGlzbid0IGdyb2trZWQgYnkgc29tZSBQQ0MtYmFzZWQgY29tcGlsZXJzLikKKworCSAgICAgW1RoaXMgY2hhbmdlIGlzIGluIGFiZXlhbmNlLCB3ZSBwcmVmZXIgdG8gZml4IG9ic3RhY2tfcHRyX2dyb3cuXQorCisJTWFrZSBjaHVuayBzaXplIG9mIGRvbnRfcHJpbnRfb2JzdGFjayAzMio0IGluc3RlYWQgb2YgZGVmYXVsdCA0MDk2LgorCSogbmluZHktc2hhcmUvY29mZnN0cmlwLmMKKwlBZGRlZCBzb21lIGZvcndhcmQgZGVjbGFyYXRpb25zIChvdGhlcndpc2UsIGdjYyBjb21wbGFpbnMKKwlhYm91dCBpbXBsaWNpdCBleHRlcm4gcmVkZWZpbmVkIGFzIHN0YXRpYykuCisKK1N1biBKYW4gMjAgMDI6Mzg6MTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJQ2hhbmdlcyBpbnNwaXJlZCBieSBQZXIgQm90aG5lcjoKKwkqIHByaW50Y21kLmMgKHByaW50X2FkZHJlc3Nfc3ltYm9saWMpOiAgVGFrZSBhZGRpdGlvbmFsIHBhcmFtZXRlcgorCXNwZWNpZnlpbmcgd2hldGhlciB0byBkZW1hbmdsZS4KKwkocHJpbnRfYWRkcmVzcyk6ICBQYXNzIGluIGFzbV9kZW1hbmdsZSB0byBjb250cm9sIGRlbWFuZ2xpbmcuCisJKHByaW50X2FkZHJlc3NfZGVtYW5nbGUpOiAgTmV3IGZuLCB0YWtlcyBleHBsaWNpdCBhcmcgdG8gY29udHJvbAorCWRlbWFuZ2xpbmcuCisJKiB1dGlscy5jOiAgQWRkIG5ldyB2YXJzIGRlbWFuZ2xlIGFuZCBhc21fZGVtYW5nbGUsIGFuZCBsZXQgdGhlbQorCWJlIHNldCBhbmQgc2hvd24uCisJKGZwdXRzX2RlbWFuZ2xlZCk6ICBJZiAhZGVtYW5nbGUsIGp1c3QgcHJpbnQgdGhlIGFyZ3VtZW50LgorCShmcHJpbnRfc3ltYm9sKTogIElmICFkZW1hbmdsZSwganVzdCBwcmludCByYXcgc3ltYm9sLgorCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogIENhbGwgcHJpbnRfYWRkcmVzc19kZW1hbmdsZSByYXRoZXIgdGhhbgorCXByaW50X2FkZHJlc3MsIHRvIGNhdXNlIGRlbWFuZ2xpbmcgdG8gZGVwZW5kIG9uIHRoZSBnbG9iYWwKKwlyYXRoZXIgdGhhbiBhc3NlbWJsZXItbGV2ZWwgZGVtYW5nbGluZyBzZXR0aW5nLgorCSogV0hBVFMuTkVXLCBnZGIudGV4aW5mbzogIERvY3VtZW50LgorCisJKiBtYWluLmMgKHNob3dfY29tbWFuZCk6ICBTaG93IGFsbCBzZXR0aW5ncyBpZiBubyBhcmcuCisJKGluaXRpYWxpemVfbWFpbik6ICBNYWtlICJpbmZvIHNldCIgdGhlIHNhbWUgYXMgbmFrZWQgInNob3ciLgorCSogY29tbWFuZC5jIChjbWRfc2hvd19saXN0KTogIEhhbmRsZSBwcmVmaXggY29tbWFuZHMgaW4gdGhlCisJbGlzdCwgYW5kIHByaW50IHRoZSBuYW1lIG9mIHRoZSBzZXR0aW5nIGFzIHdlbGwgYXMgaXRzIEVuZ2xpc2gKKwlkZXNjcmlwdGlvbiBhbmQgdmFsdWUuCisKKwlBbGxvdyBnZGIgZnVuY3Rpb25zIHRvIHNwZWNpZnkgd2hlcmUgYSBsaW5lIHNob3VsZCB3cmFwIGlmIGl0CisJZXhjZWVkcyB0aGUgc2l6ZSBvZiBhIHRlcm1pbmFsIGxpbmUuICBVc2UgaXQgdG8gbWFrZSB0aGUgb3V0cHV0CisJcHJldHRpZXIuCisJKiB1dGlscy5jIChzZXRfc2NyZWVuX3dpZHRoX2NvbW1hbmQpOiAgTmV3IGZuLCBtYWxsb2NzIGEgYnVmZmVyCisJb2YgdGhlIHJpZ2h0IHNpemUgd2hlbiBzY3JlZW4gd2lkdGggY2hhbmdlcy4KKwkoc2V0X3NjcmVlbnNpemVfY29tbWFuZCwgc2NyZWVuc2l6ZV9pbmZvKTogIFJlbW92ZSAjaWYgMCdkIGZucy4KKwkod3JhcF9oZXJlKTogIE5ldyBmbiwgaW5kaWNhdGVzIGEgcG9pbnQgaW4gdGhlIG91dHB1dCB3aGVyZSB3ZQorCXNob3VsZCB3cmFwIHRoZSBsaW5lIHJhdGhlciB0aGFuIGp1c3QgbGV0dGluZyBpdCBvdmVyZmxvdyBhdCBhCisJcmFuZG9tIHBsYWNlLgorCShmcHV0c19maWx0ZXJlZCk6ICBJbXBsZW1lbnQgd3JhcHBpbmcuCisJKG5fc3BhY2VzKTogIE5ldyBmbiwgcmV0dXJucyBhIHBvaW50ZXIgdG8gTiBzcGFjZXMuCisJKHByaW50X3NwYWNlc19maWx0ZXJlZCk6ICBVc2Ugbl9zcGFjZXMuCisJKiBkZWZzLmggKG5fc3BhY2VzKTogIERlY2xhcmUuCisJKiBzdGFjay5jIChwcmludF9mcmFtZV9pbmZvKTogIFdyYXAgd2l0aCA0LXNwYWNlIGluZGVudCBhZnRlcgorCWZuIG5hbWUgYW5kIGJlZm9yZSBmaWxlbmFtZSBhbmQgbGluZSBudW1iZXIuCisJKiBwcmludGNtZC5jIChwcmludF9mcmFtZV9hcmdzKTogIFdyYXAgd2l0aCA0LXNwYWNlIGluZGVudAorCWJlZm9yZSBlYWNoIGFyZ3VtZW50IG5hbWUgaXMgcHJpbnRlZC4KKwkqIHZhbHByaW50LmMgKHZhbHVlX3ByaW50KTogIFdyYXAgd2l0aCBubyBpbmRlbnRhdGlvbiBiZWZvcmUKKwllYWNoIHJlcGV0aXRpb24uCisJKHZhbF9wcmludF9maWVsZHMpOiAgV3JhcCB3aXRoIGluZGVudGF0aW9uIHJlbGF0aXZlIHRvIG5lc3RpbmcKKwlsZXZlbCBiZWZvcmUgZWFjaCBmaWVsZCBuYW1lLgorCSh2YWxfcHJpbnQpOiAgV3JhcCB3aXRoIG5lc3RpbmcgaW5kZW50YXRpb24gYmVmb3JlIGFycmF5IGVsZW1lbnRzLgorCSogY29tbWFuZC5jIChkb19zZXRzaG93X2NvbW1hbmQpOiAgQXZvaWQgZXh0cmEgbmV3bGluZXMsCisJd3JhcCB3aXRoIDQtc3BhY2UgaW5kZW50IGFyb3VuZCB2YWx1ZXMgcHJpbnRlZCwgZW5kIHdpdGggcGVyaW9kLgorCSogV0hBVFMuTkVXLCBnZGIudGV4aW5mbywgZ2RiLWludC50ZXhpbmZvOiAgRG9jdW1lbnQuCisKKwkqIGJyZWFrcG9pbnQuYyAoYnJlYWtwb2ludF8xKTogIEltcGxlbWVudCBhZGRyZXNzcHJpbnQgZm9yCisJImluZm8gYnJlYWtwb2ludHMiIGRpc3BsYXkuICBDaGFuZ2UgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlcgorCWZvcm1hdCB0byAiIGF0IGZpbGU6bm5uIiByYXRoZXIgdGhhbiAiIChmaWxlIGxpbmUgbm5uKSIuCisJKiBnZGIudGV4aW5mbzogIERvY3VtZW50LgorCisKK0ZyaSBKYW4gMTggMDc6MjE6MjUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJRnJvemVuIGZvciBnZGItMy45Mi42IHJlbGVhc2UuCisKKwlSRUFETUUsIFdIQVRTLk5FVzogIFVwZGF0ZSBmb3IgMy45Mi42IHJlbGVhc2UuCisKKwl0Y29uZmlnL3thbHRvcywgaTM4NnYsIGkzODZ2MzIsIG04OGssIHVtYXh9OiAgRWxpbWluYXRlCisJY29mZnJlYWQubyBmcm9tIGNvbmZpZ3Mgc2luY2UgaXQgaXMgbm93IGJ1aWx0IGJ5IGRlZmF1bHQuCisJdGNvbmZpZy97M2IxLCBhbHRvc2dhcywgYXJtLCBjb252ZXgsIGhwMzAwYnNkLCBocDMwMGhwdXgsCisJaTM4NnYtZywgaTM4NnYzMi1nLCBpc2ksIG1lcmxpbiwgbmV3cywgbmV3czEwMDAsIG5wMSwgcG4sCisJcHlyYW1pZCwgc3ltbWV0cnksIHZheCwgdnh3b3JrczY4fTogIEVsaW1pbmF0ZSBkYnhyZWFkLm8KKwlmcm9tIGNvbmZpZ3Mgc2luY2UgaXQgaXMgbm93IGJ1aWx0IGJ5IGRlZmF1bHQuCisKKwlNYWtlZmlsZS5kaXN0OiBVcGRhdGUgZm9yIHJlbGVhc2UgMy45Mi42LiAgSGFuZGxlIGZpbGVzIHRoYXQKKwloYXZlIGJlZW4gbW92ZWQgdG8gLi4vaW5jbHVkZSwgLi4vZ2V0b3B0LCBvciAuLi9iZmQuICBBZGQKKwlzYWJlci5zdXBwcmVzcyBhbmQgdGVzdHMgZGlyZWN0b3J5LiAgQWRkIGNvbmZpZy5zdGF0dXMgdG8KKwl0aGUgcmVsZWFzZSAoaXQgd2lsbCBzYXkgIm5vbmUiKS4KKworCWNvcmVkZXAuYzogIE1pbm9yIGZvcm1hdHRpbmcgZml4ZXMuCisKKwlUaGVzZSBjaGFuZ2VzIHdlcmUgbWFkZSBpbiBlYXJseSBEZWNlbWJlciBidXQgb25seSBjaGVja2VkIGluIG5vdzoKKwkqIG5pbmR5LXNoYXJlL09uaW5keS5jLCBuaW5keS1zaGFyZS9jb2Zmc3RyaXAuYywKKwluaW5keS1zaGFyZS9uaW5keS5jOiAgbGludAorCSogbmluZHktc2hhcmUvbmluZHkuYyAobmluU3RvcFdoeSk6ICBEb24ndCBieXRlc3dhcCB0aGUgCisJcmVnaXN0ZXIgdmFsdWVzIGNvbWluZyBiYWNrIGZyb20gdGhlIHRhcmdldDsgd2Ugc3RvcmUgdmFsdWVzCisJaW4gdGFyZ2V0IGJ5dGUgb3JkZXIgZXZlcnl3aGVyZS4KKworV2VkIEphbiAxNiAxOTowMTozNyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCisKKwkqIGFtMjlrLW9wY29kZS5oLCBhbTI5ay1waW5zbi5jOiAgQWRkIDI5MDUwIG9wY29kZXMuCisKKwkqIHZhbHByaW50LmMgKGNwbHVzX3ZhbF9wcmludCwgdmFsX3ByaW50X2ZpZWxkcyk6ICBOZXcgZnVuY3Rpb25zLAorCXdoaWNoIHByaW50IEMrKyBvYmplY3RzLiAgVGhleSBjb25zcGlyZSB0byBhdm9pZCBwcmludGluZyBhCisJdmlydHVhbCBiYXNlIGNsYXNzIG1vcmUgdGhhbiBvbmNlLCBmb2xsb3dpbmcgYWxsIHRoZSB0d2lzdHMgYW5kCisJdHVybnMgb2YgQysrIHZpcnR1YWwgYmFzZSBydWxlcy4KKwkodmFsX3ByaW50KTogIENhbGwgdGhlIGFib3ZlIHJhdGhlciB0aGFuIGRvIGl0IGJ5IGhhbmQuCisKKwkqIHN5bWZpbGUuYyAoc3ltYm9sX2ZpbGVfYWRkKTogIE9ubHkgcmVzZXQgc3ltZmlsZV9tdGltZSBmb3IgbWFpbgorCXN5bWJvbCBmaWxlLCBub3QgZm9yIGFkZGVkIGZpbGVzIGxpa2Ugc2hhcmVkIGxpYnMuICBUaGlzIHJlYWxseQorCW5lZWRzIHRvIGJlIGdlbmVyYWxpemVkIHRvIGEgdGltZXN0YW1wIHBlciBmaWxlLgorCisJKiBjb3JlLmMgKGNsZWFudXBfY29yZSk6ICBBdm9pZCBjb3JlZHVtcCBpZiBubyBjb3JlIGZpbGUuCisJCisJKiBjb25maWcuZ2RiOiAgQWNjZXB0IC1ob3N0IG9yIC10YXJnZXQgaW4gcGxhY2Ugb2YgK2hvc3Qgb3IKKwkrdGFyZ2V0LgorCisJKiBjb2ZmcmVhZC5jIChmaW5kX2xpbmVub3MpOiAgQXZvaWQgZGVzdXBwb3J0ZWQgQkZEIGludGVyZmFjZQorCXRvIGxpbmUgbnVtYmVycy4gIFdlIHN0aWxsIHJlYWQgdGhlbSBtYW51YWxseSByYXRoZXIgdGhhbiB1c2luZworCUJGRCdzICJnZW5lcmljIiBmZWF0dXJlcy4KKworCSogZ2RicmMudGV4LCB0aHJlZWNvbC50ZXg6ICBBZGQgR0RCIHJlZmVyZW5jZSBjYXJkIGFuZCBpdHMKKwlmb3JtYXR0aW5nIGNvZGUuCisJTWFrZWZpbGUuZGlzdDogIEFkZCByZWZjYXJkIHRvIE9USEVSUyBsaXN0IGZvciBjcmVhdGluZyB0YXIgZmlsZXMuCisKKwkqIE1ha2VmaWxlLmRpc3Q6ICBFbGltaW5hdGUgdXNlIG9mICQ8IGluIGV4cGxpY2l0IHRhcmdldHMuCisKKwkqIHJlYWRsaW5lL01ha2VmaWxlOiAgVXNlICQ8IHJhdGhlciB0aGFuICQqLmMsIHdoaWNoIGRvZXMgbm90CisJaW5jbHVkZSB0aGUgVlBBVEggaW4gR05VIE1ha2UuCisKKwkqIHRjb25maWcvaTk2MC1ib3V0LCB0Y29uZmlnL2k5NjAtY29mZjogIFRoZXNlIGFyZSBpZGVudGljYWwKKwljb3BpZXMgb2YgdGNvbmZpZy9pOTYwLCBhZGRlZCBmb3IgZ2xvYmFsIGNvbmZpZ3VyYXRpb24KKwljb21wYXRhYmlsaXR5LiAgQWxsIGk5NjAgdmVyc2lvbnMgY2FuIHJlYWQgYm90aCBjb2ZmIGFuZCBiLm91dC4KKworCSogdG0tODhrLmg6ICBGaXggbXVsdGlsaW5lIG1hY3JvIHRoYXQgbGFja2VkIFwncy4gIFJlbW92ZQorCUNPRkZfRk9STUFUIGFuZCBDT0ZGX0NIRUNLX1hfWkVST0VTIHNpbmNlIHRoZXNlIGFyZSBub3cgaGFuZGxlZAorCWF1dG9tYXRpY2FseS4KKworCSogVE9ETzogIFRoaW5rIG9mIG1vcmUgdGhpbmdzIHRvIGRvLgorCitXZWQgSmFuICAyIDE5OjA5OjI5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBzcGlmZi5jeWdudXMuY29tKQorCisJdGNvbmZpZy97YW0yOWssaTk2MCxzdW4yKixzdW4zKixzdW40Kn06ICBFbGltaW5hdGUgY29uZmlnCisJb2Ygc2RiIHZlcnN1cyBkYnggZGVidWcgc3ltYm9scy4gIEFkZCBrbHVkZ2UgZm9yIDY4ODgxIDgwLWJpdCB0bworCTY0LWJpdCBmbG9hdCBjb252ZXJzaW9uLgorCisJdGNvbmZpZy9zdW40LCB0Y29uZmlnL3N1bjMsIHhjb25maWcvc3VuNCwgeGNvbmZpZy9zdW4zOiAgTWFrZQorCWVxdWl2YWxlbnQgdG8gc3VuP29zNCBzbyBnbG9iYWwgY29uZmlnIHdvcmtzLgorCitXZWQgSmFuICAyIDE4OjIwOjUxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBzcGlmZi5jeWdudXMuY29tKQorCisJRml4IGZyb20gRWJlcmhhcmQgTWF0dGVzIDxtYXR0ZXNAYXp1LmluZm9ybWF0aWsudW5pLXN0dXR0Z2FydC5kZT4KKwkKKwkqIG1haW4uYzogIE9ubHkgZGVjbGFyZSBsaW5lc2l6ZSBvbmNlOyBkZWNsYXJlIHBhZ2VzaXplIG5vdCBhdAorCWFsbCwgc2luY2UgaXQgaXMgbmV2ZXIgdXNlZC4KKwkobWFpbik6ICBDbGVhciBuZXdseSBhbGxvY2F0ZWQgbGluZSBiZWZvcmUgaXQgaXMgdXNlZC4KKworRnJpIERlYyAyOCAwMDoxMzo0MiAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQorCisJRnVydGhlciBzdGFiaWxpemF0aW9uIGZvciB0aGUgSW50ZWwgOTYwLgorCisJKiBNYWtlZmlsZS5kaXN0OiBQYXJhbWV0ZXJpemUgdGhlIGxvY2F0aW9uIG9mIHRoZSAiaW5jbHVkZSIKKwlhbmQgImJmZCIgZGlyZWN0b3JpZXMsIGFzIHdlbGwgYXMgImdldG9wdCIuICBBZGQgc3ltZmlsZS5jLgorCUxpbmsgaW4gYm90aCBkYnhyZWFkIGFuZCBjb2ZmcmVhZC4gIEZpeCB1cCAibWFrZSBkZXBlbmQiIHRvCisJcmV3YWNrIHRoZSBsb2NhdGlvbnMgb2YgaW5jbHVkZSwgYmZkLCBhbmQgZ2V0b3B0IGluIGl0cyBvdXRwdXQuCisKKwkqIFJFQURNRTogIERvY3VtZW50IG1vdmluZyBpbmNsdWRlIGZpbGVzLCBpbXByb3ZlIHNvbWUgb2YKKwl0aGUgb3RoZXIgZG9jLgorCisJKiBjb2ZmcmVhZC5jOiAgTW92ZSBjb21tb24gY29kZSBvdXQgdG8gc3ltZmlsZS5jLiAgQ2hhbmdlCisJc3ltYm9sX2ZpbGVfY29tbWFuZCBzdHlsZSBpbnRlcmZhY2UgdG8gdXNlIG5ldyAqX3N5bWZpbGVfaW5pdAorCWFuZCAqX3N5bWZpbGVfcmVhZCBpbnRlcmZhY2UgdW5kZXIgQkZELiAgVXNlIEJGRCBpbnRlcm5hbAorCWluZm8gdG8gbG9jYXRlIGxpbmUgdGFibGUsIHN5bWJvbHMsIGV0Yy4KKworCSogY29yZS5jIChjb3JlX2ZldGNoX3JlZ2lzdGVycyk6ICBSZW5hbWUgdG8gZ2V0X2NvcmVfcmVnaXN0ZXJzCisJdG8gYXZvaWQgY29uZnVzaW9uIHdpdGggZmV0Y2hfY29yZV9yZWdpc3RlcnMuCisJKHJlZ2lzdGVyX2FkZHIpOiAgTW92ZSB0byBjb3JlZGVwLmMsIHdoaWNoIGlzIGFscmVhZHkgbWFjaGluZQorCWRlcGVuZGVudC4gIFRoaXMgbGVhdmVzIGNvcmUuYyBwcmV0dHkgY2xlYW4gb2YgZGVwZW5kZW5jaWVzLgorCisJKiBjb3JlZGVwLmMgKHJlZ2lzdGVyX2FkZHIpOiAgQWNjZXB0IHRoaXMgcm91dGluZSBmcm9tIGNvcmUuYy4KKworCSogZGJ4cmVhZC5jOiBNb3ZlIGNvbW1vbiBjb2RlICh3aXRoIGNvZmZyZWFkLmMsIGV0YykgaW50byBuZXcKKwlzeW1maWxlLmMuICBFYWNoIHBzeW10YWIgbm93IGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUKKwlmb3JtYXQtZGVwZW5kZW50IGZ1bmN0aW9uIHRoYXQga25vd3MgaG93IHRvIHJlYWQgaXQgaW4uICBNYWtlCisJc29tZSB0aGluZ3Mgc3RhdGljLiAgCisJKGRieF9wc3ltdGFiX3RvX3N5bXRhYik6IFJlbmFtZWQgZnJvbSBwc3ltdGFiX3RvX3N5bXRhYl8yLgorCShwcm9jZXNzX29uZV9zeW1ib2wpOiBBZGQgY29kZSB0byBjb21wbGFpbiBhYm91dCBhICJjb21waWxlciBidWcKKwl3ZSBtdXp6bGUgaGVyZSIsIGlmIHdlIGFjdHVhbGx5IHNlZSBpdC4KKworCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiAgSW5zZXJ0IG1pc3NpbmcgImJyZWFrIiBzdGF0ZW1lbnRzCisJaW4gY29kZSB0aGF0IGRldGVybWluZXMgd2hldGhlciBhIHZhcmlhYmxlIGlzIGFuIGx2YWx1ZSBpbgorCW1lbW9yeSwgcmVnaXN0ZXIsIG9yIHdoYXRldmVyLglJIGRldGVjdGVkIHRoaXMgdmlhIGEgY29tcGlsZXIKKwlidWcgaW4gd2hpY2ggaXQgKmFsbW9zdCogbWFzaGVkIG91dCB0aGUgd2hvbGUgc3dpdGNoIHN0YXRlbWVudC4KKworCSogZ2RiLWludC50ZXhpbmZvOiAgQWRkIG1pbm9yIHNlY3Rpb25zIG9uIGNvbmZpZ3VyaW5nIGdkYiBmb3IKKwlyZWxlYXNlLCBhbmQgYWJvdXQgdGhlIFJFQURNRSBmaWxlLgorCisJKiBpbmZjbWQuYyAocmVnaXN0ZXJzX2luZm8pOiAgRml4IGZvcm1hdHRpbmcgc29tZXdoYXQuICBTdGlsbAorCW5vdCBhcyBwcmV0dHkgYXMgYmVmb3JlLCBidXQgaXQgaGFuZGxlcyBieXRlIHN3YXBwaW5nLgorCisJKiByZW1vdGUtbmluZHkuYzogSWYgZGF0YSBjYWNoZSByb3V0aW5lcyBhcmUgaW50ZXJydXB0ZWQgd2hpbGUKKwl3YWl0aW5nIGZvciB0aGUgcmVtb3RlIGVuZCwgYmUgc3VyZSB0aGF0IGFueSB1bmluaXRpYWxpemVkIGNhY2hlCisJYmxvY2tzIGFyZSBvbiB0aGUgZnJlZSBsaXN0LCBub3Qgb24gdGhlIHZhbGlkIGxpc3QhCisKKwkqIHN5bWZpbGUuaDogRmxlc2ggb3V0IHRoaXMgaGVhZGVyIGZpbGUgd2l0aCBhbGwgdGhlIHZhcmlvdXMKKwlyb3V0aW5lcyBhbmQgdmFyaWFibGVzIHRoYXQgaGF2ZSBiZWVuIG1lcmdlZCBpbiBmcm9tIGRieHJlYWQuYworCWNvZmZyZWFkLmMsIGFuZCBzeW10YWIuYyB0byBzeW1maWxlLmMuCisKKwkqIHN5bWZpbGUuYzogTmV3IGZpbGUsIGNvbnRhaW5pbmcgY29kZSBjb21tb24gdG8gZGJ4cmVhZC5jLAorCWNvZmZyZWFkLmMsIGFuZCBzb21lIGNvZGUgZnJvbSBzeW10YWIuYy4gIEFsbCBnZW5lcmljIGNvZGUgZm9yCisJcmVhZGluZyBzeW1ib2wgZmlsZXMgc2hvdWxkIGJlIGluIGhlcmUgbm93LgorCSh1bnJlY29yZF9taXNjX2Z1bmN0aW9uKTogIFJlbW92ZSB1bnVzZWQgZnVuY3Rpb24uCisKKwkqIHN5bXRhYi5oOiAgUmVtb3ZlIGZpbGUtcmVhZGluZyB0aGluZ3MgdG8gc3ltZmlsZS5oLgorCisJKiBzeW10YWIuYzogIFJlbW92ZSBmaWxlLXJlYWRpbmcgdGhpbmdzIHRvIHN5bWZpbGUuYy4KKworCSogdG0taTk2MC5oOiAgRml4IEZSQU1FX0NIQUlOIHR5cGVzOyBkZWZpbmUgUFJJTlRfUkFORE9NX1NJR05BTAorCXRvIGRlY29kZSBpOTYwIGZhdWx0IHR5cGVzLgorCisJKiB0YXJnZXQuaCwgcmVtb3RlLmMsIHJlbW90ZS1lYi5jLCByZW1vdGUtdnguYywgcmVtb3RlLW5pbmR5LmMsCisJdGFyZ2V0LmM6IENoYW5nZSB0eXBlIG9mIHRoZSAicmVzdW1lIiBmdW5jdGlvbiBmcm9tIGludCB0byB2b2lkLAorCXNpbmNlIGl0cyByZXN1bHQgd2FzIG5ldmVyIHVzZWQuCisKK1NhdCBEZWMgMjIgMDI6NTE6NDAgMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludCkKKworCSogbWFpbi5jOiAgUmVwbGFjZSAic3R1cGlkIiB3aXRoICJjYXV0aW9uIjsgeW91IG5vdyAic2V0IGNhdXRpb24KKwlvbiBvciBvZmYiLgorCisJKiBwcmludGNtZC5jIChwcmludF9zY2FsYXJfZm9ybWF0dGVkKTogIEZpeCB0eXBvIGluICdnJyBmb3JtYXQKKworCSogaW5mY21kLmMgKGRvX3JlZ2lzdGVyc19pbmZvKTogIENhbGwgdmFsX3ByaW50IHRvIGRlYWwgd2l0aCB0aGUKKwlieXRlIG9yZGVyIG9mIHRoZSByZWdpc3RlcnMgYmVpbmcgcHJpbnRlZC4gIEZJWE1FLCB0aGlzIG1ha2VzCisJdGhlIGZvcm1hdHRpbmcgb2YgdGhlIG91dHB1dCB1Z2xpZXIuCisKKwkqIGluZmNtZC5jICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBJZiBQUklOVF9SQU5ET01fU0lHTkFMIGlzCisJZGVmaW5lZCwgY2FsbCBpdCBmb3Igc2lnbmFscyB0aGUgZGVidWdnZXIgZG9lc24ndCBpdHNlbGYgdXNlLgorCVRoZSBpOTYwIHVzZXMgdGhpcyBmb3IgbW9yZSBkZXRhaWxlZCBmYXVsdCBpbmZvcm1hdGlvbi4KKworCSogcmVtb3RlLmMgKHJlbW90ZV9vcGVuKTogIElmIGFyZyBpcyBudWxsLCBwcmludCBoZWxwIHJhdGhlciB0aGFuCisJZHVtcGluZyBjb3JlLgorCisJKiBzcGFyYy14ZGVwLmMgKHJlZ2lzdGVyX3ZhbGlkKTogIEF2b2lkIGRlY2xhcmluZyBzaXplLCBzaW5jZQorCXZhcmlvdXMgbW9kdWxlcyB3aWxsIHRoaW5rIG9mIHZhcmlvdXMgc2l6ZXMgZGVwZW5kaW5nIG9uIHRoZQorCWFyY2hpdGVjdHVyZSBvZiB0aGVpciB0bS1maWxlLiAgRklYTUUsIHdlIG5lZWQgcHJvdGVjdGlvbiBhZ2FpbnN0CisJYWN0dWFsbHkgZW50ZXJpbmcgb25lIG9mIHRob3NlIG1vZHVsZXMsIHdoaWNoIHdvdWxkIGNsb2JiZXIKKwlzdG9yYWdlIGlmIG5vdCBmb3IgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgY29tcGlsZWQgaW50byBnZGIuCisKKwkqIHN0YWNrLmMgKHVwX2NvbW1hbmQsIGRvd25fY29tbWFuZCk6ICBBbHdheXMgcHJpbnQgdGhlIGZyYW1lCisJeW91IGFycml2ZSBhdC4KKwkodXBfc2lsZW50bHlfY29tbWFuZCwgZG93bl9zaWxlbnRseV9jb21tYW5kKTogIE5ldyBjb21tYW5kcworCWZvciB1c2UgaW4gc2NyaXB0cy4KKworCSogaTk2MC1waW5zbi5jIChyZWcpLCBpOTYwLXRkZXAuYzogIExpbnQuCisKKwkqIGk5NjAtdGRlcC5jIChpOTYwX2ZyYW1lX2NoYWluX3ZhbGlkKTogTG9va3VwX3N5bWJvbCBub3cgdGFrZXMKKwltb3JlIHBhcmFtZXRlcnMgdGhhbiBpdCB1c2VkIHRvLgorCisJKiBmaW5kdmFyLmMgKHJlZ2lzdGVycyk6ICBJbmNyZWFzZSBzbG9wIHRvIDI1NiBieXRlcywgd2hpY2ggc2hvdWxkCisJcHJvdGVjdCB1cyBhZ2FpbnN0IGV2ZW4gbW9zdCBSSVNDIG1hY2hpbmVzIHdpdGggbGFyZ2UgcmVnaXN0ZXIKKwlzZXRzLgorCShsb2NhdGVfdmFyX3ZhbHVlKTogIE1vdmUgZGVjbGFyYXRpb24gaW5zaWRlIHJlbGF0ZWQgaWZkZWYuCisKKwkqIHJlbW90ZS1uaW5keS5jICgpOiAgVXNlIFRJT0NTRVROIHJhdGhlciB0aGFuIFRJT0NTRVRQCisJdGhyb3VnaG91dCwgdG8gYXZvaWQgdGhyb3dpbmcgYXdheSBidWZmZXJlZCBpbnB1dCBmcm9tIHRoZSBib2FyZC4KKwkobmluZHlfd2FpdCk6ICBTdXBwbHlfcmVnaXN0ZXIgdGFrZXMgYWRkcl9vZl92YWx1ZSwgbm90IHZhbHVlLgorCShpOTYwX3ByaW50X2ZhdWx0KTogIFJlbmFtZWQgZnJvbSBpODA5NjBfZmF1bHQuCisJKG5pbmR5X2ZldGNoX3JlZ2lzdGVycyk6ICBBdm9pZCBoYXZlX3JlZ3Mgc3R1ZmYsIGp1c3QgZ2V0IHRoZW0uCisJKG5pbmR5X3N0b3JlX3JlZ2lzdGVycyk6ICBBdm9pZCByZWdzX2NoYW5nZWQgc3R1ZmYsIGp1c3Qgc3R1ZmYKKwl0aGVtLgorCShuaW5keV9jcmVhdGVfaW5mZXJpb3IpOiAgRG9uJ3QgYm90aGVyIHRvIHdyaXRlIFBDX1JFR05VTSBzaW5jZQorCXdlIGNhbiBzZXQgdGhlIFBDIGluIHRoZSBjYWxsIHRvIHByb2NlZWQoKS4gIFVucHVzaCBuaW5keV9vcHMKKwliZWZvcmUgcHVzaGluZyBpdCBvbiB0b3AsIHRvIGF2b2lkIG1lc3NhZ2UgdG8gdXNlci4gIEVsaW1pbmF0ZQorCWNvbW1lbnRhcnkgZnJvbSBVbml4IG1hY2hpbmVzIHRoYXQganVzdCBtaXNsZWFkcyBoZXJlLgorCShyZXNldF9jb21tYW5kKTogIEZpeCBlcnJvciBtZXNzYWdlIHRvIHN1Z2dlc3QgdGFyZ2V0IGNvbW1hbmQuCisJCitXZWQgRGVjIDE5IDExOjAzOjU2IDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQpCisKKwlSZWxlYXNlIDMuOTIuNSBhcyBmcm96ZW4uCisKKwlTdGFiaWxpemUgdGhlIG1lcmdlZCByZWxlYXNlLi4ud2l0aCBoZWxwIGZyb20gbGludCwgU2FiZXIgQywKKwlnY2MgLVcsIGV0Yy4KKworCUV2ZXJ5d2hlcmU6ICBBZGQgaW5jbHVkZSBmaWxlcyBuZWVkZWQgdG8gZGVjbGFyZSByZXR1cm4gdHlwZXMKKwlvZiBmdW5jdGlvbnMgY2FsbGVkLgorCisJKiBnZGIudGV4aW5mbzogIFJvbGFuZCBQZXNjaCBpcyBkb2N1bWVudGluZyBnZGIsIGdsb3J5IGJlIQorCisJKiBicmVha3BvaW50Lmg6ICBBZGQgdW5kZWNsYXJlZCBicmVha3BvaW50IGZ1bmN0aW9ucywgYW5kIHNvbWUKKwlmdW5jdGlvbnMgZm9yIGRpc3BsYXkgaGFuZGxpbmcgc2luY2UgSSBjb3VsZG4ndCB0aGluayBvZiBhIGJldHRlcgorCS5oIHRvIHB1dCB0aGVtIGluLgorCisJKiBicmVha3BvaW50LmMgKGluc2VydF9icmVha3BvaW50cyk6ICBNYWtlIGNvZGUgZm9yIGRpc2FibGluZworCXNoYXJlZCBsaWJyYXJ5IGJrcHRzIG1vcmUgbGlrZWx5IHRvIHdvcmsuICBJdCdzIHVzZWQgd2hlbiB3ZQorCXJlcnVuIGEgcHJvZ3JhbSBhbmQgc3RvcCBiZWZvcmUgdGhlIHNoYXJlZCBsaWJyYXJ5IGhhcyBiZWVuCisJbWFwcGVkIGluLgorCShicmVha3BvaW50X2NvbmRfZXZhbCwgYnBzdGF0X3N0b3Bfc3RhdHVzKTogIFBhc3MgYXJnIGFzIGludCwKKwljYXN0IGZyb20gcG9pbnRlciwgc28gaXQgc3F1ZWV6ZXMgdGhyb3VnaCBjYXRjaF9lcnJvcnMuCisJKGJwc3RhdF9zdG9wX3N0YXR1cyk6ICBGaXggbG9naWMgYnJva2VuIHNvbWUgdGltZSBhZ28uICBXZSBub3cKKwlhbHdheXMgY3JlYXRlIGEgYnBzdGF0IGlmIHRoZSBzdG9wIGFkZHJlc3MgbWF0Y2hlcyBhIGJyZWFrcG9pbnQsCisJZXZlbiBpZiB3ZSBkb24ndCBzdG9wIHRoZXJlIC0tIGp1c3QgbGlrZSB0aGUgb2xkIGNvZGUgdXNlZCB0byBkbworCWJlZm9yZSBJIGdvdCBteSBmaW5nZXJzIGludG8gaXQgKHNpZ2gpLgorCShicmVha3BvaW50XzEpOiAgUHJpbnQgImlnbm9yZSBjb3VudCIgYWZ0ZXIgInN0b3Agb25seSBpZiIKKwljb25kaXRpb24sIHNpbmNlIHRoYXQncyBob3cgaXQgYWN0dWFsbHkgd29ya3MuCisJKG1lbnRpb24pOiAgSGFuZGxlIHdhdGNocG9pbnRzIGFzIHdlbGwgYXMgYnJlYWtwb2ludHMuCisJKHdhdGNoX2NvbW1hbmQpOiAgdXNlIHNldF9yYXdfYnJlYWtwb2ludCBhbmQgbWVudGlvbiB0byBkbyBtb3N0IAorCW9mIHRoZSB3b3JrIChhbmQgaW5pdGlhbGl6ZSBhbGwgdGhlIGZpZWxkcyEpLiAgT25seSBwYXNzIG9uZQorCWFyZyB0byBwYXJzZV9jX2V4cHJlc3Npb24sIHNpbmNlIHRoYXQncyBhbGwgaXQgdGFrZXMuCisKKwkqIGNvbW1hbmQuYyAobm90X2p1c3RfaGVscF9jbGFzc19jb21tYW5kKTogIFJlbmFtZSBhcmcgdG8gYXJncworCXNpbmNlIHdlIGlnbm9yZSAidW51c2VkIGFyZ3VtZW50IiB3YXJuaW5ncyBvbiB2YXJzIG5hbWVkICJhcmdzIi4KKwlpbmZsb3cuYyAoY2hpbGRfdGVybWluYWxfaW5mbyk6ICBkaXR0by4KKwlpbmZwdHJhY2UuYyAoa2lsbF9pbmZlcmlvcik6ICBkaXR0bworCW1haW4uYyAoY2F0Y2hfZXJyb3JzLCB2ZXJzaW9uX2luZm8sIHF1aXRfY29tbWFuZCwgcHdkX2NvbW1hbmQsCisJc291cmNlX2NvbW1hbmQsIGR1bXBfbWVfY29tbWFuZCwgZWRpdGluZ19pbmZvLAorCXNldF9oaXN0b3J5X3NpemVfY29tbWFuZCwgc2V0X2hpc3RvcnksIHNob3dfaGlzdG9yeSwKKwlzZXRfdmVyYm9zZSk6IGRpdHRvCisJc3RhY2suYyAobG9jYWxzX2luZm8pOiAgZGl0dG8KKwl0YXJnZXQuYyAodGFyZ2V0X2ZpbGVzX2luZm8pOiAgZGl0dG8KKwl2YWxwcmludC5jIChzZXRfaW5wdXRfcmFkaXgsIHNldF9vdXRwdXRfcmFkaXgpOiAgZGl0dG8KKworCSogY29yZS5jOiAgUmVtb3ZlIG9sZCB2YXJpYWJsZXMgZm9yIGhhbmRsaW5nIGNvcmUgYW5kIGV4ZWMgZmlsZQorCXNlY3Rpb25zIChkYXRhX3N0YXJ0LCBkYXRhX2VuZCwgc3RhY2tfc3RhcnQsIHN0YWNrX2VuZCwKKwlyZWdfc3RhY2tfc3RhcnQsIHJlZ19zdGFja19lbmQsIHJlZ19zdGFja19vZmZzZXQsIHRleHRfc3RhcnQsCisJdGV4dF9lbmQsIGV4ZWNfZGF0YV9zdGFydCwgZXhlY19kYXRhX2VuZCwgdGV4dF9vZmZzZXQsCisJZXhlY19kYXRhX29mZnNldCwgZGF0YV9vZmZzZXQsIHN0YWNrX29mZnNldCkuICBUaGV5J3JlCisJc3VwZXJzZWRlZCB0aGUgbW9yZSBnZW5lcmFsIGJ1aWxkX3NlY3Rpb25fdGFibGUgYW5kCisJeGZlcl9tZW1vcnkuCisJKGdldF9leGVjX2ZpbGUpOiAgTWVudGlvbiB0aGUgYGZpbGUnIGNvbW1hbmQuCisJKHJlYWRfbWVtb3J5X2NoZWNrKTogIFJlbmFtZSB0byBtZW1vcnlfZXJyb3IsIGFuZCBvbmx5IGNhbGwgaXQKKwlpbiB0aGUgY2FzZSBvZiBhbiBhY3R1YWwgZXJyb3IuCisJKHJlYWRfbWVtb3J5LCB3cml0ZV9tZW1vcnkpOiAgY2FsbCBtZW1vcnlfZXJyb3IuCisJKGNvcmVfZmV0Y2hfcmVnaXN0ZXJzKTogIFJlZ2lzdGVyIHNlY3Rpb24gbmFtZSBpcyAiLnJlZyIuCisKKwljb3JlZGVwLmM6ICBSZW1vdmUgYSBidW5jaCBvZiBjcnVkIG5vdyB0aGF0IGFsbCB0aGlzIGZpbGUgZG9lcworCWlzIHB1bGwgdGhlIHJlZ2lzdGVycyBvdXQgb2YgYSBjb3JlIGZpbGUuCisJKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogIFJld3JpdGUgdG8gYWN0dWFsbHkgd29yaywgSSBob3BlLgorCisJZGJ4cmVhZC5jOiAgVXNlIGEub3V0LmdudS5oLCBub3Qgc3lzdGVtIGEub3V0LCBub3cuCisJUmVwbGFjZSBpbmRleCgpIHdpdGggc3RyY2hyKCkuICBSZW1vdmUgYWxsIHRoZSBwcmUtQkZEIG1hY3JvCisJZGVmaW5pdGlvbnMgZm9yIGFjY2Vzc2luZyB0aGUgc3ltYm9sIGZpbGUuCisJKHN0cnVjdCBkYnhfc3ltZmlsZV9pbmZvKTogIEVuY2Fwc3VsYXRlIHRoZSBpbmZvcm1hdGlvbiB0aGF0CisJZGJ4X3N5bWZpbGVfaW5pdCBuZWVkcyB0byBwYXNzIHRvIGRieF9zeW1maWxlX3JlYWQgaW4gdGhpcworCXN0cnVjdC4KKworCShkYnhfbmV3X2luaXQsIGRieF9zeW1maWxlX2luaXQsIGRieF9zeW1maWxlX3JlYWQsCisJZGJ4X3N5bWZpbGVfZGlzY2FyZCk6IFJlYXJyYW5nZSBzeW1ib2wgZmlsZSByZWFkaW5nIHRvIGRpdmlkZQorCXRoZSBmb3JtYXQtc3BlY2lmaWMgcGFydCBmcm9tIHRoZSBmb3JtYXQtaW5kZXBlbmRlbnQgcGFydCwKKwlsZWF2aW5nIHRoZSBmb3JtYXQtaW5kZXBlbmRlbnQgcGFydCBzdWNoIGFzIGZpbGUgbmFtZSBleHBhbnNpb24KKwlhbmQgb3BlbmluZyBpbiBzeW10YWIuYy4gIFRoaXMgcmVwbGFjZXMKKwlwYXJ0aWFsX3N5bWJvbF9maWxlX29wZW4gYW5kIHBhcnRpYWxfc3ltYm9sX2ZpbGVfcmVhZC4KKwlTeW1ib2xfZmlsZV9yZWFkLCBhZGRfZmlsZSwgYWRkX2ZpbGVfdGFyZ2V0X2NvbW1hbmQsCisJYWRkX2ZpbGVfYWRkcl9jb21tYW5kIG1vdmUgdG8gc3ltdGFiLmMuICBQYXNzIGFuIGV4cGxpY2l0CisJIm1haW5saW5lIiBmbGFnIGZvciB3aGVuIHJlYWRpbmcgdGhlIG1haW4gc3ltYm9sIHRhYmxlLCByYXRoZXIKKwl0aGFuIHJlbHlpbmcgb24gdGhlIG9mZnNldCBhZGRyZXNzIHRvIGJlIHplcm8gb3Igbm9uemVyby4KKworCShkYnhfc3ltZmlsZV9yZWFkKTogRG9uJ3QgYWxsb3cgdm9pZCAqJ3MgdG8gYmUgcHJpbnRlZCBhcworCXR5cGVkZWZzLgorCShTV0FQX1NZTUJPTCk6ICBVc2UgYmZkIHJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB0aGUgc3ltYm9scy4KKwkoQUREX1BTWU1CT0xfVE9fTElTVCk6ICBNYWtlIHRoZSAiZnVuY3Rpb24gY2FsbCByYXRoZXIgdGhhbgorCW1hY3JvIiBkZWJ1ZyB2ZXJzaW9uIHJlYWxseSB3b3JrLgorCShyZWFkX2RieF9zeW10YWIpOiAgUmVtb3ZlIHVucmVmJ2QgcGFyYW1ldGVyIGluY2xpbmsuCisJQXZvaWQgc3dhcHBpbmcgTl9TTElORSBzeW1ib2xzLCBmb3Igc3BlZWQuCisJTWVyZ2UgTl9URVhUIU5fRVhUIGNhc2Ugd2l0aCB0aGUgb3RoZXIgZXh0ZXJuYWwgc3ltYm9sCisJZGVmaW5pdGlvbnMnIGNhc2UuIEFkZCBjb21tZW50cy4KKwkoc3RhcnRfcHN5bXRhYik6ICBBbGxvY2F0ZSB0aGUgc3ltZmlsZSBuYW1lIGluIHRoZSBwc3ltdGFiIG9uCisJdGhlIHBzeW1ib2xfb2JzdGFjaywgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIGNhbGxlcidzIHN0b3JhZ2UuCisJKGVuZF9wc3ltdGFiKTogT25seSBhbGxvY2F0ZSBhIGRlcGVuZGVuY2llcyBsaXN0IGlmIHRoZXJlIGFyZQorCW1vcmUgdGhhbiB6ZXJvLgorCShwc3ltdGFiX3RvX3N5bXRhYl8yKTogIFVzZSBCRkQgd2hlbiByZW9wZW5pbmcgZmlsZSB0byByZWFkCisJaXRzIHN5bWJvbHMgZm9yIHJlYWwuCisJKHJlYWRfc3RydWN0X3R5cGUpOiAgQWRkIEZJWE1FIGNvbW1lbnRzIHdoZXJlIGl0IG5lZWRzIHdvcmsKKwlmb3IgQysrIGJvZ29zaXR5LgorCShyZWFkX2h1Z2VfbnVtYmVyKTogIEFkZCBGSVhNRSBhYm91dCBvdmVyZmxvd3MuCisJKHJlYWRfcmFuZ2VfdHlwZSk6ICBBZGQgRklYTUUgYWJvdXQgY29tcGFyaW5nIGEgbG9uZyB0byAxPDwzMi4KKworCSogY29mZnJlYWQuYzogIE1pbm9yIGNoYW5nZXMgdG8gbW92ZSB0aGluZ3MgY2xvc2VyIHRvIHRoZSBuZXcKKwlyZWdpbWUgd2l0aCBzeW10YWIuYyBhbmQgZGJ4cmVhZC5jICAgTWFqb3Igd29yayBpcyBzdGlsbCBuZWVkZWQKKwloZXJlLgorCisJKiBleGVjLmMgKGV4ZWNfZmlsZV9jb21tYW5kKTogIFJlbW92ZSBvbGQgdmFyaWFibGVzIChzZWUgY29yZS5jCisJYWJvdmUpLgorCSh4ZmVyX21lbW9yeSk6IElmIG1lbW9yeSB0cmFuc2ZlciBpcyByaWdodCBhdCB0aGUgZW5kIG9mIGEKKwlzZWN0aW9uLCBkb24ndCBsb3NlLgorCisJKiBmaW5kdmFyLmMgKGdldF9zYXZlZF9yZWdpc3Rlcik6ICBJZiB2YWx1ZSBpcyBpbiBhIHJlYWwKKwlyZWdpc3RlciwgTFZBTCBpcyBsdmFsX3JlZ2lzdGVyLCBub3QgbHZhbF9tZW1vcnkuCisKKwlmcmFtZS5oOiAgRGVjbGFyZSBwcmludF9zZWxfZnJhbWUgYW5kIHJlY29yZF9zZWxlY3RlZF9mcmFtZS4KKworCWdkYi1pbnQudGV4aW5mbzogIE5ldyBmaWxlLCBmb3IgR0RCIGludGVybmFscyBkb2N1bWVudGF0aW9uLgorCVZlcnkgc2ltcGxlLCB1bmZvcm1hdHRlZCBkb2Mgb2YgY2xlYW51cHMgaXMgdGhlcmUgZm9yIG5vdy4KKworCWdkYmNvcmUuaDogIFJlbW92ZSBvYnNvbGV0ZSB2YXJpYWJsZXMgdGhhdCBkZXNjcmliZWQgYS5vdXQKKwlzZWN0aW9uIGFkZHJlc3NlcyBhbmQgb2Zmc2V0cy4gIChTZWUgY29yZS5jIGFib3ZlLikKKwlEZWNsYXJlIGZldGNoX2NvcmVfcmVnaXN0ZXJzIGFuZCByZWdpc3RlcnNfZmV0Y2hlZC4KKworCWdldG9wdC5jOiAgRGVjbGFyZSBjaGFyICphbGxvY2EoKTsgZXZlbiBvbiBTUEFSQy4KKworCWluZmNtZC5jIChydW5fY29tbWFuZCk6ICBDYWxsIHRhcmdldF9raWxsIHJhdGhlciB0aGFuCisJa2lsbF9pbmZlcmlvci4gCisJKHN0ZXBfY29tbWFuZCwgbmV4dF9jb21tYW5kLCBzdGVwaV9jb21tYW5kLCBuZXh0aV9jb21tYW5kKToKKwlEZWNsYXJlIGZyb21fdHR5IHBhcmFtZXRlciBldmVuIHRob3VnaCB3ZSBkb24ndCB1c2UgaXQuCisJKHJ1bl9zdGFja19kdW1teSk6ICBhcmd1bWVudCBCVUZGRVIgaXMgYSBjaGFyIGFycmF5LCBub3QKKwlhIHBvaW50ZXIgdG8gUkVHSVNURVJfVFlQRS4KKwkoZmluaXNoX2NvbW1hbmQpOiAgdXNpbmdfc3RydWN0X3JldHVybiBuZWVkZWQgYSB2YWx1ZSAqLCAKKwlub3QgYSBzdHJ1Y3Qgc3ltYm9sICouCisKKwkqIGluZnB0cmFjZS5jIChjaGlsZF94ZmVyX21lbW9yeSk6ICBUbyBhdm9pZCBkZXBlbmRlbmN5IG9uCisJd2hlcmUgc2VjdGlvbnMgYXJlIGluIG1lbW9yeSwgdHJ5IFBUX1dSSVRFX0QgYW5kIGlmIHRoYXQgZmFpbHMsCisJdHJ5IFBUX1dSSVRFX0kuICBNb3N0IFVuaXhlcyBkb24ndCBjYXJlIHdoaWNoIHlvdSB1c2UuCisKKwkqIGluZnJ1bi5jIChzdGVwX3Jlc3VtZV9icmVha19zaGFkb3cpOiAgQ2hhbmdlIHRvIGFycmF5IHRvCisJbWF0Y2ggb3RoZXIgYnJlYWtwb2ludCBzaGFkb3cgc3RvcmFnZS4KKwkoY2xlYXJfcHJvY2VlZF9zdGF0dXMpOiAgUGFzcyBhZGRyZXNzIG9mIGJwc3RhdCB0bworCWJwc3RhdF9jbGVhciwgbm90IHRoZSBicHN0YXQgaXRzZWxmLgorCShjaGlsZF9jcmVhdGVfaW5mZXJpb3IpOiAgRklYTUUgY29tbWVudCBhYm91dCBpZiB0aGUgY2hpbGQKKwlleGl0cy4KKwkoc3RhcnRfaW5mZXJpb3IpOiAgUmVtb3ZlIG9sZCBmdW5jdGlvbi4KKwkoY2hpbGRfb3Blbik6ICBVc2UgdGFyZ2V0X2tpbGwgcmF0aGVyIHRoYW4ga2lsbF9pbmZlcmlvci4KKwkod2FpdF9mb3JfaW5mZXJpb3IpOiAgRGl0dG8uCisJKGluc2VydF9zdGVwX2JyZWFrcG9pbnQsIHJlbW90ZV9zdGVwX2JyZWFrcG9pbnQpOiAgVXNlCisJbmV3IHN0ZXBfcmVzdW1lX2JyZWFrX3NoYWRvdy4KKworCSogaW5mdGFyZy5jIChjaGlsZF93YWl0KTogIElmIGFsbCBjaGlsZCBwcm9jZXNzZXMgZGllLAorCXByZXRlbmQgdGhhdCB0aGUgb25lIGJlaW5nIHdhaXRlZCBmb3IgZXhpdGVkIHdpdGggc2lnbmFsIDQyLgorCisJKiBtYWluLmMgKGNvbW1hbmRfbGluZV9pbnB1dCk6ICBXaGVuIHNjYW5uaW5nIGZvciBjb21tZW50cywKKwlkb24ndCBjb3JlZHVtcCBvbiB1bmNsb3NlZCBxdW90ZXMuCisJKHF1aXRfY29tbWFuZCk6ICBVc2UgdGFyZ2V0X2tpbGwgcnRoZXIgdGhhbiBraWxsX2luZmVyaW9yLgorCShfaW5pdGlhbGl6ZV9tYWluKTogIFJlbmFtZSBjbGFzc191c2VyIGZyb20gInVzZXIiIHRvCisJInVzZXItZGVmaW5lZCIuCisKKwkqIHByaW50Y21kLmMgKHByaW50X2NvbW1hbmRfMSk6ICBJbml0aWFsaXplICJmbXQiIGlmIG5vIGZvcm1hdAorCWlzIHNwZWNpZmllZCBieSB0aGUgdXNlci4KKwkocHJpbnRfZnJhbWVfYXJncyk6ICBPbmx5IGFkZCB0byBhcmdzX3ByaW50ZWQgaWYgd2UgYXJlCisJYWN0dWFsbHkgZmV0Y2hpbmcgYXJncyBmcm9tIHRoZSBzdGFjayAoYXZvaWRpbmcgdW5kZWZpbmVkCisJYXJnX3NpemUpLgorCShfaW5pdGlhbGl6ZV9wcmludGNtZCk6ICBSZW1vdmUgYm9ndXMgXHsgZnJvbSBzdHJpbmcuCisKKwkqIHJlbW90ZS1lYi5jIChlYl9vcGVuKTogIEF2b2lkIGNvcmVkdW1wIG9uIG5vIGFyZ3VtZW50LgorCisJKiByZW1vdGUtbmluZHkuYzogIEJyaW5nIG91dCBvZiBJbnRlbCBlbnZpcm9ubWVudCBpbnRvIG5ldworCXRhcmdldCBlbnZpcm9ubWVudC4gIFJlbW92ZSBhbGwgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gb24KKwlJODA5NjAuICBNYXNzaXZlIGhhY2tpbmcgdGhyb3VnaG91dC4KKwkobmluZHlfeGZlcl9pbmZlcmlvcl9tZW1vcnkpOiAgTmV3IHJvdXRpbmUgc3RvbGVuIGZyb20KKwlpbmZwdHJhY2UuYy4KKwkobmluZHlfY3JlYXRlX2luZmVyaW9yKTogIE5ldyByb3V0aW5lIHBpZWNlZCB0b2dldGhlciwgcHJvYmFibHkKKwlub3QgcXVpdGUgd29ya2luZyB5ZXQuCisJKG5pbmR5X29wcyk6ICBOZXcgdGFyZ2V0X29wcyBzdHJ1Y3QgZm9yIG5pbmR5LgorCisJKiByZW1vdGUtdnguYzoJVXNlIHdyaXRlX21lbW9yeSByYXRoZXIgdGhhbiB0YXJnZXRfd3JpdGVfbWVtb3J5CisJdG8gZ2V0IGVycm9yIGNoZWNraW5nLgorCSh2eF9hZGRfZmlsZV9jb21tYW5kLCB2eF9vcGVuKTogVXNlIHN5bWJvbF9maWxlX2FkZCByYXRoZXIgdGhhbgorCWFkZF9maWxlLgorCSh2eF9jcmVhdGVfaW5mZXJpb3IpOiAgVXNlIHRhcmdldF90ZXJtaW5hbF9vdXJzLi4uCisKKwkqIHNpZ25hbWUuYyAoX2luaXRpYWxpemVfc2lnbmFtZSk6ICBBbHdheXMgaW5pdGlhbGl6ZSwgc2luY2UKKwl3ZSBuZWVkIHRoZSB0YWJsZSBmb3IgdGhpbmdzIG90aGVyIHRoYW4gcHNpZ25hbC4KKwkKKwkqIHNvbGliLmMgKHNvbGliX2FkZCk6ICBVc2Ugc3ltYm9sX2ZpbGVfYWRkLCBub3QgYWRkX2ZpbGUuCisJKHNvbGliX2FkZHJlc3MpOiAgUmV0dXJuIGJvb2xlYW4gcmVzdWx0IHJhdGhlciB0aGFuIHN0cnVjdAorCXBvaW50ZXIgd2hpY2ggbm9ib2R5IGVsc2Uga25vd3MgdGhlIHR5cGUgb2YuCisKKwkqIHNwYXJjLXRkZXAuYywgdmFsb3BzLmM6ICBVc2Ugd3JpdGVfbWVtb3J5IHJhdGhlciB0aGFuCisJdGFyZ2V0X3dyaXRlX21lbW9yeSwgdG8gZ2V0IGVycm9yIGNoZWNraW5nLgorCisJKiBzdGFjay5jIChsb2NhbHNfaW5mbywgY2F0Y2hfaW5mbywgYXJnc19pbmZvLAorCWdldF9zZWxlY3RlZF9ibG9jaywgZnJhbWVfY29tbWFuZCwgdXBfY29tbWFuZCk6IFVzZQorCXRhcmdldF9oYXNfc3RhY2ssIHJhdGhlciB0aGFuIGhhdmVfaW5mZXJpb3JfcCBvcgorCWhhdmVfY29yZV9maWxlX3AuCisKKwkqIHN1bjMteGRlcC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6ICBSZXdyaXRlIGZvciBuZXcgQkZEIHJlZ2ltZS4KKworCSogc3ltZmlsZS5oOiAgTmV3IGZpbGUsIGRlZmluaW5nIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUKKwlnZW5lcmljIGFuZCBvYmplY3QtZmlsZS1zcGVjaWZpYyBzeW1ib2wgcmVhZGluZyBjb2RlLgorCisJKiBzeW10YWIuYzogIE1vdmUgZ2VuZXJpYyBzeW1ib2wtcmVhZGluZyBpbnRlcmZhY2UgdG8gc3ltdGFiLmMsCisJZnJvbSBkYnhyZWFkLmMsIGNvZmZyZWFkLmMsIG1pcHNyZWFkLmMsIGV0Yy4gIEFkZCBzeW10YWJfZm5zCisJdGFibGUgdG8gbWFwIEJGRCB0YXJnZXRzIHRvIHN5bWJvbC1yZWFkaW5nIG1vZHVsZXMgaW4gR0RCLgorCUNoYW5nZSBpbmRleCB0byBzdHJjaHIuCisJKGxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGUpOiAgVXNlIGVycm9yKCkgcmF0aGVyIHRoYW4gaGFuZC1tYWRlCisJc2ltdWxhdGlvbnMgdGhlcmVvZi4KKwkobG9va3VwX3BhcnRpYWxfc3ltYm9sKTogIFNwZWVkdXAgc2xpZ2h0bHkgd2hlbiBsZW5ndGggPT0gMC4KKwkoc3ltYm9sX2ZpbGVfYWRkKTogIE5ldyBmdW5jdGlvbi4KKwkoc3ltYm9sX2ZpbGVfY29tbWFuZCk6ICBDYWxsIGl0LgorCShzeW1maWxlX29wZW4sIHN5bWZpbGVfaW5pdCk6ICBOZXcgZnVuY3Rpb24uCisJKGFkZF9maWxlX3RhcmdldF9jb21tYW5kLCBhZGRfZmlsZV9hZGRyX2NvbW1hbmQpOiBtb3ZlZCBmcm9tCisJZGJ4cmVhZC5jLgorCisJKiB0YXJnZXQuYyAodGFyZ2V0X2NvbW1hbmQpOiAgdXNlIHRhcmdldF9raWxsLgorCisJKiB0YXJnZXQuaCAodGFyZ2V0X2ZpbGVzX2luZm8pOiAgRG9uJ3QgZGVjbGFyZSwgbmV2ZXIgY2FsbGVkCisJZnJvbSBvdXRzaWRlLgorCisJKiB0bS1zdW4yLmgsIHRtLXN1bjMuaCAoU1RBQ0tfRU5EX0FERFIpOiBVc2Ugc3lzdGVtIGluY2x1ZGUKKwlmaWxlcyB0byBkZXRlcm1pbmUgc3RhY2sgZW5kIGFkZHJlc3MuCisKKwkqIHZhbGFyaXRoLmMgKHZhbHVlX3hfYmlub3AsIHZhbHVlX3hfdW5vcCk6IENoYW5nZSBlcnJvciBtZXNzYWdlCisJdG8gYmUgbW9yZSB1c2VmdWwuICBQYXNzIHByb3BlciBhcmd1bWVudCB0byB2YWx1ZV9zdHJ1Y3RfZWx0LgorCisJKiB2YWxvcHMuYyAodmFsdWVfYXNzaWduKTogIEZJWE1FIGNvbW1lbnQgdGhhdCBsb25nIGxvbmcgCisJYml0ZmllbGRzIHdpbGwgYnJlYWsgaGVyZS4KKworCSogTWFrZWZpbGUuZGlzdDogIEFkZCBzeW1maWxlLmgsIHJlbW90ZS1uaW5keS5jLCByZW1vdGUtZWIuYy4KKwlVcGRhdGUgYG1ha2Ugc2FiZXJfZ2RiJyB0byB3b3JrIGJldHRlci4KKworCSogVE9ETzogIEEgd29tYW4ncyB3b3JrIGlzIG5ldmVyIGRvbmUuCisKKwkqIGNwbHVzLWRlbS5jLCBlbnZpcm9uLmMsIGluZmVyaW9yLmgsIGluZnJ1bi5jLCBpbmZ0YXJnLmMsCisJbWFpbi5jLCBvYnN0YWNrLmMsIHByaW50Y21kLmMsIHJlbW90ZS1lYi5jLCByZW1vdGUtbmluZHkuYywKKwlyZW1vdGUtdnguYywgcmVtb3RlLmMsIHNvbGliLmMsIHNvdXJjZS5jLCBzcGFyYy1waW5zbi5jLAorCXNwYXJjLXRkZXAuYywgc3BhcmMteGRlcC5jLCBzeW1taXNjLmMsIHN5bXRhYi5jLCBzeW10YWIuaAorCXRhcmdldC5jLCB0ZXJtaW5hbC5oLCB0bS1zcGFyYy5oLCB0bS1zdW5vcy5oLCB1dGlscy5jLAorCXZhbG9wcy5jLCB2YWxwcmludC5jLCBleGVjLmM6ICBMaW50LgorCisKK1dlZCBEZWMgMTIgMjM6NDQ6MTUgMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwlDb250aW51aW5nIEludGVsIDk2MCBwb3J0IG1lcmdlIG9mIEdEQi4KKworCSogTWFrZWZpbGUuZGlzdDogIE1lcmdlIGk5NjAgIm5pbmR5LXNoYXJlIiBmaWxlcy4gIFJlbmFtZQorCW1hbGxvYy5oIHRvIGdtYWxsb2MuaCB0byBhdm9pZCBuYW1lIGNvbmZsaWN0cyBpbiAvdXNyL2luY2x1ZGUuCisJRG9uJ3Qgc2hpcCBnZGIuZHZpIGluIHRhciBmaWxlLiAgTGluayBnZGIgd2l0aCBpbml0Lm8sIG5vdCBpbml0LmMuCisJV2FjayBvdmVyICJtYWtlIGRlcGVuZCIgc28gaXQgaGFuZGxlcyBmaWxlcyBpbiBzdWJkaXJlY3RvcmllcworCXZ4LXNoYXJlLCBuaW5keS1zaGFyZSwgYmZkLCBhbmQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorCisJKiBibG9ja2ZyYW1lLmMgKGdldF9wcmV2X2ZyYW1lX2luZm8pOiAgUmVtb3ZlIGZhdGFsIGVycm9yCisJaWYgc3RhY2sgbm90IGRlZmluZWQuCisKKwkqIGNvcmUuYyAoY29yZV9vcGVuLCBjb3JlX2RldGFjaCk6ICBOZXcgZnVuY3Rpb25zIHRoYXQgaGFuZGxlCisJdGhlIG9sZCAiY29yZS1maWxlIiBjb21tYW5kIGFzICJ0YXJnZXQgY29yZSIgYW5kICJkZXRhY2giIGluc3RlYWQuCisJKGNvcmVfZmlsZV9jb21tYW5kKTogIENhbGwgdGhlbS4KKwkoY29yZV94ZmVyX21lbW9yeSk6ICBVc2UgY29tbW9uIHJvdXRpbmUgeGZlcl9tZW1vcnkuCisKKwkqIGRieHJlYWQuYzogIEluY2x1ZGUgYS5vdXQuZ251LmgsIG5vdCBzeXN0ZW0gYS5vdXQuaC4KKwlkYnhyZWFkIG5vdyB1c2VzIGJmZCBmb3IgZXZlcnl0aGluZyBidXQgc3ltYm9sIHJlYWRpbmcgaXRzZWxmLgorCUJGRCBpbnRlcm5hbHMgYXJlIHVzZWQgdG8gZHJhZyBvdXQgdGhlIHJlbGV2YW50IGZpbGUgb2Zmc2V0cy4KKwkocGFydGlhbF9zeW1ib2xfZmlsZV9vcGVuKTogIENoYW5nZSBhcmdzIGFsbCBhcm91bmQgZm9yIEJGRC4KKworCSogc3ltdGFiLmM6IFJlbmFtZSAidmFsdWUiIHRvICJ2YWwiIGV2ZXJ5d2hlcmUsIHNvIHdlIGNhbgorCSNpbmNsdWRlICJ2YWx1ZS5oIi4KKwkoc3ltYm9sX2ZpbGVfY29tbWFuZCk6ICBOZXcgY29tbWFuZCwgbW92ZWQgZnJvbSBkYnhyZWFkLmMKKwlhbmQgY29mZnJlYWQuYy4gIEl0IHVzZXMgQkZEIHRvIHJlYWQgdGhlIGZpbGUsIHRoZW4gdmVjdG9ycworCWJhc2VkIG9uIGl0cyB0eXBlLCB0byBkYnggb3IgY29mZiBzeW1ib2wgcmVhZGVycy4KKwkqIHN5bXRhYi5oOiAgRXh0ZXJuIGEgZmV3IHZhcnMgZm9yIHN5bWJvbF9maWxlX2NvbW1hbmQuCisKKwkqIHRhcmdldC5oOiAgQnJlYWtwb2ludCB0YWtlcyBhIGNoYXIgKiBzYXZlIGFyZWEsIG5vdCBhIGNoYXIgKiouCisKKwkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6ICBXaGVuIHVucGFja2luZyBiaXRmaWVsZHMsIG9mZnNldAorCXRoZSBhZGRyZXNzIGluIGdkYiBvZiB0aGUgdmFsdWUsIGlmIGl0IGlzIGRlY2xhcmVkIHdpdGggYSBzaG9ydGVyCisJdHlwZS4gIFJlbW92ZSB0aGUgbGFzdCAicnVudGltZSBrbHVkZ2UgdGVzdCIgb2YgaG9zdCBieXRlIG9yZGVyLgorCisJKiB1dGlscy5jOiAgUmVtb3ZlIG9sZCBteV9iZmRfcmVhZCByb3V0aW5lLgorCisJKiBzdGFjay5jIChmcmFtZV9pbmZvKTogIFVzZSB0YXJnZXRfaGFzX3N0YWNrLiAgUHJpbnQgcHJvZ3JhbSBjb3VudGVyCisJcmVnaXN0ZXIncyBhY3R1YWwgbmFtZSByYXRoZXIgdGhhbiAicGMiLCBzaW5jZSBpdCdzIGNhbGxlZCB0aGUKKwkiaXAiIChpbnN0cnVjdGlvbiBwb2ludGVyKSBvbiB0aGUgaTk2MCAoc2lnaCkuCisKKwkqIHRhcmdldC5jICh0YXJnZXRfY29tbWFuZCk6ICBBZGQgY29tbWFuZCBmb3Igc2VsZWN0aW5nIGEgdGFyZ2V0CisJdHlwZSBhbmQgY2FsbGluZyBpdHMgb3BlbiByb3V0aW5lLiAgVGhpcyBpcyB1c2VkIGZvciBpbml0aWF0aW5nCisJY29tbXVuaWNhdGlvbiB3aXRoIGEgcGFydGljdWxhciB0YXJnZXQsIGluIGEgZ2VuZXJpYyB3YXkuCisKKwkqIHRtLWk5NjAuaDogIFVwZGF0ZSBmb3IgbW9kZXJuIGdkYi4gIFJlbW92ZSBzZW1pY29sb25zIGZyb20KKwl2YXJpb3VzIG1hY3Jvcy4gIEhhbmRsZSByZWFkaW5nIHN0cnVjdCByZXR1cm4gY29udmVudGlvbiwgYW5kCisJZXJyb3Itb3V0IGF0dGVtcHRzIHRvIHJldHVybiBzdHJ1Y3RzIHdpdGggdGhlICJyZXR1cm4iIGNvbW1hbmQuCisJQmUgc3VyZSBnZGIgZG9lc24ndCB0aGluayB3ZSBrbm93IGhvdyB0byBjYWxsIGZ1bmN0aW9ucyBpbiB0aGUKKwlpbmZlcmlvci4KKworCSogaTk2MC10ZGVwLmM6ICBSZW5hbWUgRlJBTUVfQ0hBSU5fVkFMSUQgYW5kIEZSQU1FX0ZJTkRfU0FWRURfUkVHUworCXRvIGk5NjBfeHh4IGluIGxvd2VyIGNhc2UuCisJKGFyZ19hZGRyZXNzKTogIENpcmN1bXZlbnQgZXJyb3JzIGR1ZSB0byBMT0NfQVJHX0JMT0NLCisJbm90IGJlaW5nIGRlZmluZWQgeWV0LgorCisJKiByZW1vdGUuYyAocmVtb3RlX29wZW4pOiAgQ2FsbCBzdGFydF9yZW1vdGUgdG8gaW5pdGlhbGl6ZSAKKwl3YWl0X2Zvcl9pbmZlcmlvciBkdXJpbmcgb3Blbi4KKwkocmVtb3RlX3hmZXJfaW5mZXJpb3JfbWVtb3J5KTogIFJldHVybiBsZW5ndGggd3JpdHRlbiByYXRoZXIKKwl0aGFuIGVycm5vIHZhbHVlLgorCisJKiByZW1vdGUtdnguYyAodGFyZ2V0X2NvbW1hbmQgLT4gdnhfb3Blbik6ICBVc2UgbmV3IGdlbmVyaWMKKwl0YXJnZXQgY29tbWFuZC4KKwkqIHJlbW90ZS1lYi5jLCBpbmZ0YXJnLmMsIGV4ZWMuYzogZGl0dG8uCisKKwkqIGluZnJ1bi5jOiAgRml4IGNvbW1lbnRzLgorCShhdHRhY2hfcHJvZ3JhbSAtPiBjaGlsZF9vcGVuKTogIFVzZSBuZXcgZ2VuZXJpYyB0YXJnZXQgY29tbWFuZC4KKwkod2FpdF9mb3JfaW5mZXJpb3IpOiAgQ2xlYXIgc2F2ZWQgcmVnaXN0ZXIgdmFsdWVzIGJlZm9yZSB0YXJnZXRfd2FpdCwKKwlzbyB0YXJnZXRfd2FpdCBjYW4gc2V0IHNvbWUgb2YgdGhlbSBpZiBjb252ZW5pZW50LgorCisJKiBpbmZwdHJhY2UuYyAoZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzLCBzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMpOgorCVJldHVybiBzdWNjZXNzIGluZGljYXRvciwgbm90IHZvaWQuCisJKGNoaWxkX3hmZXJfbWVtb3J5KTogIEF2b2lkIGZldGNoaW5nIGluaXRpYWwgd29yZCBpZiB3ZSdsbAorCW92ZXJ3cml0ZSBpdCBhbnl3YXkuCisKKwkqIGluZmNtZC5jIChhdHRhY2hfY29tbWFuZCk6ICBVc2UgbmV3IGdlbmVyaWMgdGFyZ2V0IG9wZW4gcm91dGluZS4KKwkoX2luaXRpYWxpemVfaW5mY21kKTogIFVwZGF0ZSBkb2Mgb24gYXR0YWNoIGFuZCBkZXRhY2ggY29tbWFuZHMuCisJKGRvX3JlZ2lzdGVyc19pbmZvKTogIE1lcmdlIGluIGEgYnl0ZS1vcmRlciBwcm9ibGVtIGFzIGEgRklYTUUKKwljb21tZW50LgorCisJKiBmaW5kdmFyLmMgKGZpbmRfc2F2ZWRfcmVnaXN0ZXIpOiAgQXZvaWQgcHJvYmxlbSBpbiBjdXJyZW50IGZyYW1lLgorCShyZWFkX3JlbGF0aXZlX3JlZ2lzdGVyKTogIERpdHRvLgorCSh3cml0ZV9yZWdpc3Rlcik6ICBDb252ZXJ0IGJ5dGUgb3JkZXIgb24gdGhlIHdheSBvdXQuCisKKwkqIGV4ZWMuYyAoZmlsZV9jb21tYW5kKTogIEFkZC4KKwkoYWRkX3RvX3NlY3Rpb25fdGFibGUsIGV4ZWNfY29tbWFuZCk6ICBVc2UgbmV3IGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4KKwkoeGZlcl9tZW1vcnkpOiAgQ29tbW9uIGZ1bmN0aW9uIGJldHdlZW4gY29yZV94ZmVyX21lbW9yeSBhbmQKKwlleGVjX3hmZXJfbWVtb3J5LgorCShleGVjX3hmZXJfbWVtb3J5KTogIFVzZSBpdC4KKworCSogcG4tb3Bjb2RlLmg6ICBEb2N1bWVudCB0aGF0IGEgIlBOIiBpcyBhIEdvdWxkIFBvd2VyTm9kZS4KKworCSogYnJlYWtwb2ludC5jLCBicmVha3BvaW50LmgsIHN5bXRhYi5oLCB2YWx1ZS5oLCBmcmFtZS5oLCB1dGlscy5jLAorCXZhbG9wcy5jLCBzdGFjay5jLCB0YXJnZXQuYywgc3BhcmMteGRlcC5jLCBzb3VyY2UuYywgcHJpbnRjbWQuYywKKwlpbmZjbWQuYywgaTk2MC1waW5zbi5jLCBldmFsLmMsIGRlZnMuaDogIGxpbnQgYW5kIGdjYyAtV2FsbC4KKworU3VuIERlYyAgMiAxNjo0NTowNiAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCU1lcmdlIEludGVsIDk2MCBwb3J0IG9mIGdkYiwgY29udGludWluZy4uLgorCisJKiBkYnhyZWFkLmMgKHBhcnRpYWxfc3ltYm9sX2ZpbGVfb3BlbiwgcGFydGlhbF9zeW1ib2xfZmlsZV9yZWFkLAorCXN5bWJvbF9maWxlX2NvbW1hbmQpOiAgUGFzcyBmcm9tX3R0eSBhcmcgdG8gaHVzaCAnZW0gdXAuCisKKwkqIGNvZmZyZWFkLmMgKHN5bWJvbF9maWxlX2NvbW1hbmQpOiAgQXZvaWQgb3V0cHV0IGlmIGZyb21fdHR5ICE9IDEuCisJQWRkIG1hZ2ljIG51bWJlcnMgZm9yIDk2MCBDT0ZGIGZvcm1hdC4KKworRnJpIE5vdiAzMCAwOToxODoyMCAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCU1lcmdlIEludGVsIDk2MCBwb3J0IG9mIGdkYiwgZnJvbSBJbnRlbCAiMS4yIiByZWxlYXNlLgorCisJQ0hBTkdFX0xPRyBlbnRyaWVzIGZyb20gdGhlaXIgcG9ydCwgd2hpY2ggd2FzIGJhc2VkIG9uCisJZ2RiKy0yLjguMDoKKworICAgIFRodSBTZXAgIDYgMTE6MDI6MjIgUERUIDE5OTAKKwlSZW1vdmUgdGVtcCBmaWxlIGlmIGRvd25sb2FkIGlzIGludGVycnVwdGVkLgorCisgICAgV2VkIEF1ZyAgMSAwOTowODozMyBQRFQgMTk5MAorCU5vdyB1c2VzIGJpbmFyeSBwcm90b2NvbCB0byB0YWxrIHRvIE5JTkRZLgorCU9sZCBoZXggcHJvdG9jb2wgKE5JTkRZIDIuMTMgYW5kIG9sZGVyKSBzdXBwb3J0ZWQgd2l0aCAtTyBzd2l0Y2guCisJVGltZXMgb3V0IGFmdGVyIDUgc2Vjb25kcyB3aGVuIHRyeWluZyB0byB0YWxrIHRvIE5JTkRZLgorCisgICAgVHVlIE1heSAyOSAxMjo1NDo0OSBQRFQgMTk5MAorCUFkZGVkIHZhcmlhYmxlIGJhdWQgcmF0ZSAoLWIgc3dpdGNoKS4KKwlTb3VyY2UgY29kZSByZW9yZ2FuaXphdGlvbi4KKworICAgIFRodSBBcHIgMjYgMTE6MDk6NTUgUERUIDE5OTAKKwlNb3JlIGNsZWFudXAgb2YgYmF0Y2ggbW9kZTsgIHNwZWNpZmljYWxseSwgZXhlY3V0ZSAiLXMiLCAiLWUiLCBhbmQKKwkiLXNlIiBzd2l0Y2hlcyBhcyBzb29uIGFzIHRoZXkgYXJlIGVuY291bnRlcmVkIG9uIHRoZSBpbnZvY2F0aW9uIGxpbmUuCisKKyAgICBGcmkgQXByIDIwIDEzOjQ3OjE1IFBEVCAxOTkwCisJQWRkIC1icmsgc3dpdGNoLgorCisgICAgVGh1IEFwciAxOSAwOTo1NDoyOCBQRFQgMTk5MAorCUFkZCAncmVzZXQnIGNvbW1hbmQuCisKKyAgICBXZWQgQXByIDE4IDA5OjQ4OjA3IFBEVCAxOTkwCisJQWZ0ZXIgb3BlbmluZyByZW1vdGUgdHR5LCB3YWl0IGZvciAxIHNlY29uZCB0byBnbyBieSB3aXRob3V0IGlucHV0CisJZnJvbSBpdCBiZWZvcmUgdHJ5aW5nIHRvIHRhbGsgdG8gTklORFkgKGZpeGVzIHByb2JsZW1zIHdpdGggdGhlCisJSGV1cmlrb24gSEs4MC9WOTYwRSkuCisKKyAgICBNb24gQXByICA0IDE2OjMzOjA1IFBEVCAxOTkwCisJU29tZSBvdXRwdXQgd2FzIG5vdCBiZWluZyBzdXBwcmVzc2VkIGluICdiYXRjaCcgbW9kZS4KKworICAgIFRodSBNYXIgMjIgMTU6MzE6MTEgUFNUIDE5OTAKKwlBc2sgdXNlciBpZiBvbGQgc3ltYm9sIHRhYmxlIHNob3VsZCBiZSBkZWxldGVkIHdoZW4gbmV3IGZpbGUgaXMKKwlkb3dubG9hZGVkLgorCisJQWxsb3cgdXNlciB0byBydW4gYSBwcm9ncmFtIGRvd25sb2FkZWQgYmVmb3JlIGdkYjk2MCB3YXMgYnJvdWdodCB1cC4KKworCUNvcnJlY3QgImV4ZWMtZmlsZSIgaGVscCBtZXNzYWdlIGZvciBpODA5NjAgY29udGV4dC4KKworCUNvcnJlY3QgYnVnIGluIGNhbGN1bGF0aW5nIHVzZXIgc3BhY2UgYWRkcmVzczogIGNvdWxkIG9jY2FzaW9uYWxseQorCWNvcnJ1cHQgdXNlciBwcm9ncmFtLgorCisJTWFrZSBzdXJlIHRvIHplcm8gbG93LW9yZGVyIGJpdHMgaW4gcmlwJ3MgYmVjYXVzZSBvZiBidWcgaW4gOTYwQ0EKKwlBLXN0ZXAgcGFydDogIGNvdWxkIGNhdXNlIG9wZXJhdGlvbiBmYXVsdHMgd2hlbiAibmV4dCJpbmcgYWNyb3NzCisJYSBmdW5jdGlvbiBjYWxsLgorCisJQ29ycmVjdCBidWcgdGhhdCBtYWRlIGl0IGltcG9zc2libGUgdG8gZ2V0IHNvdXJjZSBsaW5lIG51bWJlcnMgZm9yCisJY29kZSBsb2FkZWQgYXQgYWRkcmVzc2VzIGhpZ2hlciB0aGFuIDB4N2ZmZmZmZmYuCisKKyAgICBXZWQgSmFuIDEwIDEyOjQzOjIyIFBTVCAxOTkwCisJT3BlbiByZW1vdGUgdHR5IGZvciBleGNsdXNpdmUgdXNlLgorCisgICAgRnJpIEphbiAgNSAxMjoxNDo0MiBQU1QgMTk5MAorCUNvcnJlY3QgZGlzYXNzZW1ibHkgKENBIG1hbnVhbCB3YXMgcmlnaHQgYWZ0ZXIgYWxsKToKKwlvcGNvZGUgZm9yIHN5c2N0bCBpcyAweDY1OQorCisgICAgTW9uIE9jdCAyMyAxMjowMzowNCBQRFQgMTk4OQorCVVzZSBHOTYwQkFTRSBhbmQgRzk2MEJJTiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gZmluZCAnc3gnIHV0aWxpdHkuCisKKyAgICBNb24gT2N0IDE2IDE0OjE1OjA5IFBEVCAxOTg5CisJInNmcjAiLSJzZnIzMSIgc2hvdWxkIGhhdmUgYmVlbiBuYW1lZCAic2YwIi0ic2YzMSIKKworICAgIE1vbiBPY3QgIDIgMTU6NTY6MzEgUERUIDE5ODkKKworCUFkZGVkIDk2MENBIGRpc2Fzc2VtYmx5IHN1cHBvcnQuCisKKwlUbyBzaW1wbGlmeSBtYWludGVuYW5jZToKKwkJLSBlbGltaW5hdGVkIHVzZSBvZiBzeW1ibGljIGxpbmtzIG9uIHBpbnNuLmM6IHVzZSBpOTYwLXBpbnNuLmMKKwkJCWRpcmVjdGx5IGluc3RlYWQuCisJCS0gZWxpbWluYXRlZCBvcGNvZGUuaDogaW5jb3Jwb3JhdGVzIHRhYmxlcyBpbnRvIGk5NjAtcGluc24uYworCQktIG1vdmVkIDk2MC1zcGVjaWZpYyByb3V0aW5lcyBmcm9tIGk5NjAtcGluc24uYyB0byBpOTYwLW1kLmMKKwkJLSBtYWRlIGRpc2Fzc2VtYmx5IGludGVyZmFjZSBpZGVudGljYWwgdG8gdGhhdCBpbiBnZG1wOTYwLgorCisKKworV2VkIE5vdiAyOCAyMTozMjo0OCAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQorCisJKiB0YXJnZXQuaDogQWxsb3cgdGFyZ2V0cyB0byBzdGFjay4gIEFkZCB0YXJnZXRfaGFzX21lbW9yeSwKKwlfcmVnaXN0ZXJzLCBldGMuICBSZXN0cnVjdHVyZSBtZW1vcnkgYWNjZXNzIGFuZCAiaW5mbyBmaWxlcyIKKwl0byB3YWxrIHRoZSB0YXJnZXQgc3RhY2suCisJKiBleGVjLmMsIGNvcmUuYywgaW5mdGFyZy5jLCByZW1vdGUuYywgcmVtb3RlLXZ4LmMsIHJlbW90ZS1lYi5jLAorCXRhcmdldC5jOiAgQ2hhbmdlIHRhYmxlcyB0byBtYXRjaCB0YXJnZXQuaC4KKwkqIGluZmxvdy5jIChjaGlsZF9tb3Vybl9pbmZlcmlvcik6ICBwb3AgY2hpbGRfb3BzLgorCShnZW5lcmljX21vdXJuX2luZmVyaW9yKTogIFVzZSBuZXcgaGFzX3N0YWNrIGZsYWcuCisJKiBpbmZwdHJhY2UuYyAoY2hpbGRfeGZlcl9tZW1vcnkpOiBOZXcgbWVtb3J5IHJlZ2ltZS4KKwkqIGluZnRhcmcuYyAoY2hpbGRfZmlsZXNfaW5mbyk6IE5ldyAiaW5mbyBmaWxlcyIgcmVnaW1lLgorCSogcmVtb3RlLWViLmM6IE5ldyBtZW1vcnkgcmVnaW1lLCBuZXcgaW5mbyBmaWxlcy4KKwkqIHJlbW90ZS12eC5jOiBOZXcgbWVtb3J5IHJlZ2ltZSwgbmV3IGluZm8gZmlsZXMuICBOb3cgdXNlCisJc2VwYXJhdGUgdGFyZ2V0cyBmb3IgVnhXb3JrcyBhdHRhY2htZW50IHRvIG1hY2hpbmUsIGFuZCAKKwlhY3R1YWxseSBydW5uaW5nIGEgcHJvY2VzcyB1bmRlciBWeFdvcmtzLCBzaW5jZSBvbmUgaGFzCisJc3RhY2sgJiBleGVjdXRpb24gJiByZWdzIGFuZCB0aGUgb3RoZXIgZG9lc24ndC4KKwkqIHJlbW90ZS5jOiBOZXcgbWVtb3J5IHJlZ2ltZSwgbmV3IGluZm8gZmlsZXMuCisJKiBzcGFyYy14ZGVwLmMgKGZldGNoX2NvcmUtcmVnaXN0ZXJzKTogIE5ldyBtZW1vcnkgcmVnaW1lLgorCSogdGFyZ2V0LmM6ICBOZXcgcm91dGluZXMgYW5kIHN1cHBvcnQgZm9yIHN0YWNrZWQgdGFyZ2V0cywKKwluZXcgbWVtb3J5IHJlZ2ltZSwgbmV3IGluZm8gZmlsZXMgcmVnaW1lLgorCQorCisJR2VuZXJhbGl6ZSBzZWN0aW9uIGhhbmRsaW5nIGZvciBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHNlY3Rpb25zLAorCWluY2x1ZGluZyB1c2Ugb2YgdGhlIG5ldyBCRkQgKGJpbmFyeSBmaWxlKSBsaWJyYXJ5LgorCSogZ2RiY29yZS5oOiBBZGQgc3RydWN0IHNlY3Rpb25fdGFibGUuCisJKiBleGVjLmMgKGJ1aWxkX3NlY3Rpb25fdGFibGUpOiAgSXRlcmF0ZSBhbGwgc2VjdGlvbnMgYW5kCisJcmVjb3JkIHdoYXQgZ2RiIG5lZWRzIHRvIGtub3cgYWJvdXQgdGhlbS4KKwkoZXhlY19jb21tYW5kKTogIFVzZSBpdC4KKwkoZXhlY194ZmVyX21lbW9yeSk6ICBVc2UgdGhlIHRhYmxlLgorCShleGVjX2ZpbGVzX2luZm8pOiAgUHJpbnQgdGhlIHRhYmxlLgorCSogY29yZS5jIChjb3JlX2ZpbGVfY29tbWFuZCwgY29yZV94ZmVyX21lbW9yeSwgY29yZV9maWxlc19pbmZvKToKKwlMaWtld2lzZS4JCisJKiBzb3VyY2UuYyAoZmluZF9zb3VyY2VfbGluZXMpOiAgVXNlIGJmZF9nZXRfbXRpbWUuCisJKiBkYnhyZWFkLmM6ICBRdWljayBjaGFuZ2VzIHRvIG1ha2UgaXQgY29tcGlsZSB3aXRoIG5ldyBCRkQuCisJKiB1dGlscy5jIChlcnJvcik6ICBBdm9pZCB1c2luZyBiZmRfZXJyb3IgaW4gZ2VuZXJpYyByb3V0aW5lcy4KKwkKKwkqIGNvcmUuYyAoY29yZV9mZXRjaF9yZWdpc3RlcnMpOiAgR2V0IGZyb20gdGhlICIucmVncyIgc2VjdGlvbiBvZgorCXRoZSBCRkQgY29yZSBmaWxlLgorCSogc3BhcmMteGRlcC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6ICBVc2UgdGhlIC5yZWdzIGluZm8uCisKKwkqIGluZmVyaW9yLmggKGF0dGFjaF9mbGFnKTogIEV4cG9ydC4KKwkqIGluZmNtZC5jIChydW5fY29tbWFuZCk6ICB1c2UgbmV3IHRhcmdldF9jcmVhdGVfaW5mZXJpb3IuCisJKiBpbmZydW4uYyAoY2hpbGRfY3JlYXRlX2luZmVyaW9yKTogIERvbid0IHJldHVybiByZXN1bHQuCisJKiBNYWtlZmlsZS5kaXN0IChWRVJTSU9OKTogIDMuOTEuNC4KKworRnJpIE5vdiAyMyAyODoxNTozOCAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQorCisJKiBicmVha3BvaW50LmMgKGJwc3RhdF9udW0pOiAgSGFuZGxlIGJyZWFrcG9pbnRzIHdoaWNoIGhhdmUKKwlzaW5jZSBiZWVuIGRlbGV0ZWQsIHN1Y2ggYXMgdGVtcG9yYXJ5IGJyZWFrcG9pbnRzLgorCWluZmNtZC5jIChwcm9ncmFtX2luZm8pOiAgZGl0dG8uCisKKwkqIGNvcmUuYyAoY29yZV9maWxlX2NvbW1hbmQpOiAgRGlzcGxheSB0aGUgZnJhbWUgd2hlcmUgdGhlIGNvcmUKKwlkdW1wIG9jY3VycmVkLgorCisJKiBtYWluLmM6ICBsaW50LgorCisJKiByZW1vdGUtdnguYyAodGFyZ2V0X2NvbW1hbmQpOiAgTWVyZ2UgaW4gdGFyZ2V0IGNvbW1hbmQgZnJvbQorCXRhcmctdnguYy4gIEEgZmV3IG90aGVyIGNsZWFudXBzLgorCisJKiBUT0RPLCBQcm9qZWN0czogIExvdHMgbW9yZSBzdHVmZiB0byBkby4uLgorCitGcmkgTm92IDIzIDE4OjE1OjM4IDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQpCisKKwlNYXNzaXZlIGNoYW5nZXMgdG8gd2FsbCBvZmYgdGhlIHJlbW90ZS1kZWJ1Z2dpbmcgaW50ZXJmYWNlCisJYmVoaW5kIGEgZnVuY3Rpb24gdmVjdG9yLiAgVGhlIHBvcnQgdG8gaGFuZGxlIFZ4V29ya3MgdGFyZ2V0cworCWlzIGFsc28gcGFydCBvZiB0aGlzLgorCisJQWxsIGZpbGVzOiAgUmVwbGFjZSByZWZlcmVuY2VzIHRvIHJlbmFtZWQgZnVuY3Rpb25zLAorCXJlbW92ZSByZWZlcmVuY2VzIHRvIHJlbW90ZV9kZWJ1Z2dpbmcsIHJlbW92ZSByZWZlcmVuY2VzIHRvCisJaGF2ZV9pbmNsdWRlX2ZpbGUsIGhhdmVfY29yZV9maWxlIGluIGZhdm9yIG9mIHRhcmdldF9oYXNfc3RhY2ssCisJdGFyZ2V0X2hhc19tZW1vcnksIGV0Yy4KKworCSogTW9kdWxhcml6ZSB0aGUgYnJlYWtwb2ludCBpbnRlcmZhY2UuCisJYnJlYWtwb2ludC5oIChCUkVBS1BPSU5UX01BWCk6ICBOZXcgZGVmaW5lIHNldHMgbWF4IGxlbmd0aCBvZgorCWEgYnJlYWtwb2ludCBpbnN0cnVjdGlvbi4KKwlicmVha3BvaW50LmM6IHN0cnVjdCBicmVha3BvaW50J3Mgc2hhZG93X2NvbnRlbnRzIG5vdyBzaXplZCBhcworCUJSRUFLUE9JTlRfTUFYLgorCShpbnNlcnRfYnJlYWtwb2ludHMpOiAgVmVjdG9yIHRvIHRhcmdldCB0byBpbnN0YWxsIGJyZWFrcG9pbnRzLgorCShyZW1vdmVfYnJlYWtwb2ludHMpOiAgVmVjdG9yIHRvIHRhcmdldCBoZXJlIHRvby4KKwlSZW1vdmUgUkVNT1RFX1NBX1NQQVJDIGtsdWRnZXMgYW5kIG90aGVyIHJlbW90ZV9kZWJ1Z2dpbmcuCisJc3BhcmMtdGRlcC5jIChzaW5nbGVfc3RlcCk6ICBVc2UgbmV3IGJyZWFrcG9pbnQgaW50ZXJmYWNlIGZvcgorCXRoZSBzaW5nbGUtc3RlcCBicmVha3BvaW50cy4KKwltZW0tYnJlYWsuYyAobWVtb3J5X2luc2VydF9icmVha3BvaW50LCBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQpOgorCU5ldyBmaWxlLCBjb250YWlucyByb3V0aW5lcyB0byBpbnNlcnQgYW5kIHJlbW92ZSBicmVha3BvaW50cyBieQorCXJlYWRpbmcgb3V0IHRoZSBvbGQgY29udGVudHMgYW5kIGxhdGVyIHJlcGxhY2luZyB0aGVtLiAgVGhpcyBpcworCWhvdyBwdHJhY2UgYnJlYWtwb2ludHMgd29yaywgYW5kIG1hbnkgcmVtb3RlIHN5c3RlbXMgYXMgd2VsbC4KKworCSogdG0tdnh3b3JrczY4Lmg6ICBOZXcgY29uZmlnIGZpbGUsIG92ZXJyaWRlcyBhIGZldyB0aGluZ3MgZm9yCisJV2luZCBSaXZlcidzIHByZWZlcmVuY2VzLgorCisJKiB0YXJnZXQuaDogIE5ldyBmaWxlLCBmb3IgdHJhbnNmZXIgdmVjdG9yIHVzZWQgdG8gdGFsayB0byB0aGUKKwlpbmZlcmlvciAoY2hpbGQsIGF0dGFjaGVkLCBjb3JlLCBleGVjLCByZW1vdGUsIGV0YykuICBBbGwgYWNjZXNzZXMKKwl0byB0aGUgdGhpbmcgYmVpbmcgZGVidWdnZWQgc2hvdWxkIGNvbWUgdGhyb3VnaCB0aGVzZSB2ZWN0b3JzLgorCXRhcmdldC5jOiAgTmV3IGZpbGUsIHJvdXRpbmVzIHRvIGhhbmRsZSB0cmFuc2ZlciB2ZWN0b3IuCisJKHZhcmlvdXMgZmlsZXMpOiAgQWRkIHRyYW5zZmVyIHZlY3RvcnMgWFhYX29wcyBmb3IgdGhlIHZhcmlvdXMKKwl0YXJnZXRzIGFuZCBwc2V1ZG8tdGFyZ2V0cyAoY29yZSBmaWxlcywgZXRjKSB3ZSBzdXBwb3J0LgorCisJKiBicmVha3BvaW50LmMgKGJwc3RhdF9zdG9wX3N0YXR1cyk6ICBGdXJ0aGVyIGV4cGxvcmF0aW9ucyBvZgorCXdhdGNocG9pbnRzIGFuZCB3aHkgdGhpbmdzIGRvbid0IHdvcmsgYWxsIHRoZSB0aW1lLgorCShicHN0YXRfYWxsb2MpOiAgTmV3IGZuIHRvIGFsbG9jYXRlIGEgYnBzdGF0IGFuZCBjaGFpbiBpdC4KKworCSogY29uZmlnLmdkYjogIE9ubHkgYWRkICJzb3VyY2UgJHtzcmNkaXJ9Ly5nZGJpbml0IiB0bworCXRoZSBsb2NhbCBnZGJpbml0IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBoYXZlIGl0LgorCisJKiBjb3JlLmMgKGNvcmVfb3BzKTogIGFkZCBhbmQgaW5zdGFsbC4KKwlBbGxvdyBjb3JlIGRlYnVnZ2luZyB3aXRob3V0IGV4ZWMgZmlsZS4KKworCSogZGJ4cmVhZC5jIChmcmVlX2FuZF9pbml0X2hlYWRlcl9maWxlcyk6ICBNZXJnZSB0d28gZm5zLgorCShlbmRfc3ltdGFiKTogIEZyZWUgbmFtZWQgc3ltYm9sIHRhYmxlIHdoZW4gYSBuZXcgdmVyc2lvbiBjb21lcyBpbi4KKwkocmVhZF9kYnhfc3ltdGFiKTogIFJlbG9jYXRlIGFsbCBraW5kcyBvZiBzeW1ib2xzIHdpdGggYmFzZQorCWFkZHJlc3MuICBGaXJzdCBzdGVwIHRvd2FyZCBoYW5kbGluZyBkaWZmZXJlbnQgdGV4dCwgZGF0YSwgYnNzCisJcmVsb2MuCisJKGFkZF9maWxlX2FkZHJfY29tbWFuZCk6ICBSZW5hbWVkIGFkZF9maWxlX2NvbW1hbmQuCisJKGFkZF9maWxlX2NvbW1hbmQpOiAgVmVjdG9yIHRvIHJlbW90ZSBoYW5kbGVyLgorCUFkZCAibG9hZCIgYXMgYW4gYWxpYXMgZm9yICJhZGQtZmlsZSIgY29tbWFuZC4KKworCSogZGVmcy5oOiAgQWxsb3cgInZvbGF0aWxlIiB0byBiZSB1c2VkIGluIG5vbi1BTlNJOyB1c2UgaXQgZm9yCisJbm9uLXJldHVybmluZyBmdW5jdGlvbnMuCisKKwkqIGV4ZWMuYzogIEFkZCBleGVjX29wcywgYW5kIHB1c2ggaXQgYXMgYSB0YXJnZXQgd2hlbiBhbiBleGVjCisJZmlsZSBpcyBzcGVjaWZpZWQuCisKKwkqIGluZmNtZC5jIChydW5fY29tbWFuZCk6ICBQYXNzIGV4ZWN1dGFibGUgZmlsZSBuYW1lIGFuZCBhcmcgbGlzdAorCXNlcGFyYXRlbHkgd2hlbiBzdGFydGluZyBhbiBpbmZlcmlvci4gIFBlcm1pdCAicnVuIiB3aGVuIG5vIGV4ZWMKKwlmaWxlIGlzIHNwZWNpZmllZCwgZm9yIFZ4V29ya3MuCisJKGRldGFjaF9jb21tYW5kKTogIE1vdmUgdG8gY2hpbGRfZGV0YWNoIGluIGluZnRhcmcuYy4KKworCSogaW5mdGFyZy5jOiAgTmV3IGZpbGUuICBVbml4LWNoaWxkLXNwZWNpZmljIHJvdXRpbmVzLCBhbmQgdGhlCisJY2hpbGRfb3BzIHN0cnVjdHVyZS4KKworCSogaW5mZXJpb3IuaCAocmVnaXN0ZXJzKTogIEV4cG9ydCAicmVnaXN0ZXJzIiBhcyB0aGUgd2F5IGZvcgorCXRhcmdldCBkZXBlbmRlbnQgcmVnaXN0ZXIgaGFuZGxlcnMgdG8gZmluZCBnZGIncyBsb2NhbCBjb3B5IG9mCisJdGhlIHJlZ2lzdGVycy4gIFJlbmFtZSAic3RvcF9hZnRlcl9hdHRhY2giIHRvICJzdG9wX3Nvb25fcXVpZXRseSIKKwlzaW5jZSBpdCBpcyBub3cgdXNlZCBieSBwbGFjZXMgdGhhdCB3YW50IHdhaXRfZm9yX2luZmVyaW9yIHRvCisJaGFuZGxlIHRoZSBncnVuZ2UgYnV0IHdhbnQgdG8gc2VlIGV2ZXJ5IHRyYXAgZnJvbSB0aGUgaW5mZXJpb3IuCisKKwkqIGluZmxvdy5jIChjcmVhdGVfaW5mZXJpb3IpOiAgUHVsbCBvdXQsIGFuZCBtZXJnZSBpbnRvIGluZnJ1bi5jLgorCUVsaW1pbmF0ZSByZW1vdGVfZGVidWdnaW5nIGhvb2tzIGluIHRlcm1pbmFsIGhhbmRsaW5nLgorCisJKiBpbmZydW4uYzogIFJlcGxhY2Ugc3RhcnRfaW5mZXJpb3Igd2l0aCBjaGlsZF9jcmVhdGVfaW5mZXJpb3IuCisJTW92ZSBhbGwgdGhlIGhhaXIgb2YgVW5peCBzaGVsbHMgYW5kIHB0cmFjZSBpZGlvc3luY3JhY2llcyBpbnRvCisJY2hpbGRfY3JlYXRlX2luZmVyaW9yLCBzbyByZW1vdGUgaGFuZGxlcnMgZG9uJ3QgaGF2ZSB0byBkZWFsLgorCVJlbW92ZSBydW5uaW5nX2luX3NoZWxsLiAgUmVuYW1lIHN0b3BfYWZ0ZXJfYXR0YWNoIHRvCisJc3RvcF9zb29uX3F1aWV0bHksIGFuZCB1c2UgaXQgaW4gYSBmZXcgb3RoZXIgcGxhY2VzIHdoZXJlIHdlIHdhbnQKKwl0byBqdXN0IGNhbGwgd2FpdF9mb3JfaW5mZXJpb3IgYW5kIGdldCBjb250cm9sIGJhY2sgb24gdGhlIGZpcnN0CisJdHJhcC4gIHRyYXBfZXhwZWN0ZWQgbm93IG5ldmVyIHRha2VzIGEgdmFsdWUgPiAxLgorCShpbml0X3dhaXRfZm9yX2luZmVyaW9yKTogIEluaXRpYWxpemUgc3RhdGljIHZhcnMgd2hlbiBhIG5ldworCXByb2Nlc3MgaXMgY3JlYXRlZC4KKworCW1haW4uYyAoZ2RiaW5pdCk6ICBBZGQgbmV3IGhvb2sgZm9yIC5nZGJpbml0IGZpbGUgbmFtZSwgbGV0CisJaXQgYmUgb3ZlcnJpZGRlbiBieSBjb25maWcgZmlsZXMgYXMgR0RCSU5JVF9GSUxFTkFNRS4KKwkoREVGQVVMVF9QUk9NUFQpOiAgQWRkIG5ldyBob29rIGZvciBvdmVycmlkaW5nIChnZGIpIHByb21wdC4KKwlCb3RoIG9mIHRoZXNlIGFyZSB1c2VkIGZvciBWeFdvcmtzIGdkYi4KKworCW1jaGVjay5jOiAgcmVuYW1lIGluY2x1ZGUgZmlsZSAiZ21hbGxvYy5jIiB0byBhdm9pZCBwcm9ibGVtcworCXdpdGggc3lzdGVtIGluY2x1ZGUgZmlsZSAibWFsbG9jLmMiLgorCisJcGFyYW0tbm8tdG0uaDogIE5ldyBpbmNsdWRlIGZpbGUsIHNhbWUgYXMgcGFyYW0uaCBidXQgZG9lcyBub3QKKwlpbmNsdWRlIHRoZSBkZWZhdWx0ICJ0bS5oIiBmaWxlLiAgVGhpcyBpcyB1c2VkIGluIGZpbGVzIHdoZXJlCisJdGhlIHRhcmdldCBpcyBrbm93biwgZS5nLiByZW1vdGUtZWIuYyBvciBzcGFyYy14ZGVwLmMuCisKKwlwYXJhbS5oOiAgTm93IGp1c3QgYSBzaGVsbCB0aGF0IGluY2x1ZGVzIHRtLmggYW5kIHBhcmFtLW5vLXRtLmguCisKKwlyZW1vdGUtdnguYzogIE5ldyBmaWxlLCBWeFdvcmtzIHJlbW90ZSBkZWJ1Z2dpbmcgc3VwcG9ydC4gIFVzZXMKKwlSUEMgcm91dGluZXMgdGhhdCBhcmUgc2hhcmVkIHdpdGggdGhlIHRhcmdldCBzeXN0ZW0sIGluIGRpcmVjdG9yeQorCSR7c3JjZGlyfS92eC1zaGFyZS4KKworCXJlbW90ZS5jOiAgVmVjdG9yaXplIHJlbW90ZSBpbnRlcmZhY2UuCisKKwlzb3VyY2UuYzogIEdsb2JhbGl6ZSBzb3VyY2VfcGF0aCwgYW5kIG1ha2UgYW4gYWxpYXMgImwiIGZvciAibGlzdCIKKwlzaW5jZSB3ZSBub3cgaGF2ZSB0aGUgImxvYWQiIGNvbW1hbmQuCisKKwlzcGFyYy14ZGVwLmM6ICBVc2UgbmV3IHBhcmFtLW5vLXRtLmguCisKKwlzeW1taXNjLmMgKGZyZWVfbmFtZWRfc3ltdGFiKTogIEFkZCBuZXcgZnVuY3Rpb24gZnJvbSBXaW5kIFJpdmVyLgorCUhvd2V2ZXIsIGlmZGVmIGl0IG91dCBmb3Igbm93IHdoaWxlIHdlIHRoaW5rIGFib3V0IHdoYXQgaXQgc2hvdWxkCisJcmVhbGx5IGJlIGRvaW5nLgorCisJdG0tc3VuMy5oLCB4bS1zcGFyYy5oLCB4bS1zdW4zLmgsIHhtLXN5bW1ldHJ5Lmg6IE1vdmUKKwlQUkVQQVJFX1RPX1NUT1JFIHRvCisJdGhlIHhtLSBmaWxlLCBhbmQgY2hhbmdlIGl0cyBuYW1lIHRvIENISUxEX1BSRVBBUkVfVE9fU1RPUkUsIHNpbmNlCisJbm9uLVVuaXgtY2hpbGRyZW4gaGFuZGxlIHRoaXMgd2l0aCB0aGVpciBvd24gY29kZSBpbiB0aGUgdGFyZ2V0CisJdHJhbnNmZXIgdmVjdG9yLgorCisJTWFrZWZpbGUuZGlzdDogIFJvbGwgdmVyc2lvbiB0byAzLjkyLjMuICBBZGQgdngtc2hhcmUgc3R1ZmYgdG8KKwlzb3VyY2UgYW5kIHRhcmdldCBsaXN0cy4gIEFkZCB2eC1zaGFyZSB0byBkZWZhdWx0IGxpc3Qgb2YgaW5jbHVkZQorCWRpcmVjdG9yaWVzLiAgQWRkIG5ldyBmaWxlcyB0byBzcmMgYW5kIHRhcmdldCBsaXN0czogbWVtLWJyZWFrLAorCXRhcmdldCwgaW5mdGFyZywgcmVtb3RlLWViLCByZW1vdGUtdngsIHRhcmctdnguICBCZSBzdXJlIHRoZQorCSR7c3JjZGlyfSB2ZXJzaW9ucyBvZiBtdW5jaCBhbmQgY3JlYXRldGFncyBhcmUgdXNlZC4KKworCSogdmFsb3BzLmMgKGZpbmRfZnVuY3Rpb25fYWRkcik6ICBTcGxpdCBvdXQgb2YgY2FsbF9mdW5jdGlvbi4KKwkoY2FsbF9mdW5jdGlvbl9ieV9oYW5kKTogIFJlbmFtZSBjYWxsX2Z1bmN0aW9uOyB0aGlzIGZ1bmN0aW9uIAorCWNhbGxzIGZ1bmN0aW9ucyBpbiB0aGUgdGFyZ2V0IGJ5IGxhYm9yaW91c2x5IHBhdGNoaW5nIHRoZSB0YXJnZXQKKwl3b3JkLWJ5LXdvcmQgd2l0aCB0aGUgcmlnaHQgc3RhY2ssIGFyZ3MsIHJlZ3MsIGV0Yy4KKworCitNb24gTm92ICA1IDE3OjI5OjEwIDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQpCisKKwlIYW5kbGUgQU1EIDI5MDAwIGEgYml0IGJldHRlci4KKworCSogcmVtb3RlLWViLmMgKHJlYWRjaGFyKTogIE1hc2sgcmVjZWl2ZWQgY2hhciBsb2cgdG8gbWFrZSBpdCByZWFkYWJsZS4KKwkocmVtb3RlX3N0YXJ0KTogIFBhc3MgYXJndW1lbnRzIGRvd24gdG8gZXhlY3V0aW5nIHByb2dyYW0uCisJTWFrZSBzdGFydGFkZHIgdW5zaWduZWQuCisJaW5mcnVuLmMgKHN0YXJ0X2luZmVyaW9yKTogIEFjY2VwdCBhcmdzLCBwYXNzIHRoZW0gdG8KKwlyZW1vdGVfc3RhcnQuCisJaW5mY21kLmMgKHJ1bl9jb21tYW5kKTogIFBhc3MgYXJncyBkb3duIHRvIHN0YXJ0X2luZmVyaW9yLgorCisJKiB0Y29uZmlnL2FtMjlrLWFvdXQsIHRjb25maWcvYW0yOWstY29mZjogIE5ldyBmaWxlcyBzcGVjaWZ5aW5nCisJdGhlIHRhcmdldCBvYmplY3QgZmlsZSBmb3JtYXQuCisJdG0tMjlrLmg6ICBQYXkgaGVlZCB0byBDT0ZGX0VOQ0FQU1VMQVRFLgorCisJKiBhbTI5ay1waW5zbi5jIChwcmludF9pbnNuKTogIFByaW50IDB4IG9uIGhleCBudW1iZXJzIGluIGRpc2Fzc2VtYmx5LgorCWFtMjlrLXRkZXAuYyAoZXhhbWluZV9wcm9sb2d1ZSk6ICBCZXR0ZXIgY2hlY2tpbmcgb2YgZnVuY3Rpb24gcHJlZml4ZXMuCisKK1N1biBPY3QgIDcgMTg6MjA6NDUgMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludCkKKworCSogTWFrZWZpbGUuZGlzdCAoVkVSU0lPTik6ICBSb2xsIHZlcnNpb24gdG8gMy45MS45IGFuZCBmcmVlemUuCisJKiBUT0RPOiAgV2UgZGlkIGEgZmV3IHRoaW5ncywgd2UgaGF2ZSBtb3JlIHRvIGRvIHRob3VnaC4KKworCSogeG0tc3BhcmMuaCAoQ0xFQVJfREVGRVJSRURfU1RPUkVTKTogIERlZmluZS4KKwkqIGluZmxvdy5jIChpbmZlcmlvcl9kaWVkKTogIENsZWFyIGRlZmVycmVkIHN0b3Jlcy4KKwkKKwkqIERlYnVnIHByb2JsZW1zIHdpdGggZHVtbXkgZnJhbWVzIGFuZCBjYWxscyB0byB0aGUgaW5mZXJpb3IuCisJKiB0bS1zcGFyYy5oIChQVVNIX0RVTU1ZX0ZSQU1FLCBQT1BfRlJBTUUpOiAgTW92ZSB0byBzcGFyYy10ZGVwLmMuCisJKiBzcGFyYy10ZGVwLmMgKGRvX3Jlc3RvcmVfaW5zbik6ICBTaW1wbGlmeS4KKwkoc3BhcmNfZnJhbWVfZmluZF9zYXZlZF9yZWdzKTogIFNpbXBsaWZ5IGFuZCBmaXggd2hhdCB3ZSBmaW5kLgorCShzcGFyY19wdXNoX2R1bW15X2ZyYW1lKTogIFNpbXBsaWZ5IGFuZCBmaXggd2hhdCB3ZSBwdXNoLgorCShzcGFyY19wb3BfZnJhbWUpOiAgU2xpZ2h0bHkgbW9yZSBoYWlyIGhlcmUsIGRlY2lkaW5nIHdoZXRoZXIKKwl3ZSBhcmUgcmVzdG9yaW5nIGEgc2F2ZWQgUEMgb3IgcmV0dXJuaW5nIHRvIGEgcmV0dXJuIGFkZHJlc3MgaW4gJWk3LgorCSogc3BhcmMteGRlcC5jIChyZWFkX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBEZWJ1ZyBpZiB2YWxpZCByZWcgaXMgcmVhZC4KKworCSogdXRpbHMuYyAoeG1hbGxvYywgeHJlYWxsb2MpOiAgUmV0dXJuIHR5cGUgZGVwZW5kcyBvbiBfX1NURENfXy4KKwkqIHN5bXRhYi5oICh4bWFsbG9jKTogZGl0dG8sIGZvciBvYnN0YWNrX2NodW5rX2FsbG9jLgorCSogb2JzdGFjay5oIChjaHVua2Z1bik6IGRpdHRvLgorCSogZGVmcy5oICh4bWFsbG9jLCB4cmVhbGxvYyk6IGRpdHRvCisKKwkqIHV0aWxzLmMgKHF1aXQpOiAgR3JhYiB0aGUgdGVybWluYWwgZnJvbSB0aGUgY2hpbGQgaWYgbmVjZXNzYXJ5LiAKKworCSogaW5mbG93LmMgKHRlcm1fc3RhdHVzX2NvbW1hbmQpOiBSZW5hbWUgdG8gdGVybV9pbmZvLCBjaGFuZ2UKKwl0byAiaW5mbyB0ZXJtaW5hbCIuCisKKwkqIHNwYXJjLXBpbnNuLmMgKHByaW50X2luc24pOiAgRGlzYXNzZW1ibHkgcHJlZmVycyByZWFsIGluc3RydWN0aW9ucy4KKwkoaXNfZGVsYXllZF9icmFuY2gpOiAgU3BlZWQgdXAuCisJKiBzcGFyYy1vcGNvZGUuaDogQWRkIEFMSUFTIGJpdCB0byBhbGlhc2VzLiAgRml4IHVwIG9wY29kZSB0YWJsZXMuCisJU3RpbGwgbWlzc2luZyBzb21lIGZsb2F0IG9wcywgYW5kIG5lZWRzIHRlc3RpbmcuCisKKwkqIFN1cHBvcnQgZm9yIGlucHV0IGFuZCBvdXRwdXQgcmFkaXhlcyBvdGhlciB0aGFuIGJhc2UgMTAKKwkqIGRlZnMuaCAoaW5wdXRfcmFkaXgsIG91dHB1dF9yYWRpeCk6ICBEZWNsYXJlLgorCSogZXhwcmVhZC55ICh5eXBhcnNlLCBwYXJzZV9udW1iZXIpOiAgSGFuZGxlIGNoYW5nZXMgb2YgaW5wdXQKKwlyYWRpeCwgYW5kIGFtYmlndW91cyBuYW1lcy1vci1udW1iZXJzIGluIHJhZGl4ZXMgPjEwLgorCSogcHJpbnRjbWQuYyAocHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCk6ICBQcmludCBmb3JtYXR0ZWQgaGV4CisJbnVtYmVycyBpbiB2YXJ5aW5nIGNvbHVtbiB3aWR0aHMuCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnQpOiAgVXNlIG91dHB1dF9mb3JtYXQgdG8gcHJpbnQgc2NhbGFyIGludHMuCisJKHNldF9pbnB1dF9yYWRpeCwgc2V0X291dHB1dF9yYWRpeCwgc2V0X3JhZGl4KTogIENyZWF0ZS4KKwkoc2V0X291dHB1dF9yYWRpeCk6ICBTZXQgb3V0cHV0X2Zvcm1hdCBmcm9tIG91dHB1dF9yYWRpeC4KKwkoX2luaXRpYWxpemVfdmFscHJpbnQpOiAgYWRkIGBzZXQgcmFkaXgnIGJ1dCBsZWF2ZSB0aGUgb3RoZXJzIG9mZi4KKwkKKwkqIG1haW4uYyAoZXhlY3V0ZV9jb21tYW5kKTogTGV0IHN0dXBpZCBxdWVzdGlvbnMgYmUgdHVybmVkIG9mZi4KKwkoX2luaXRpYWxpemVfbWFpbik6IEhhbmRsZSAic2V0IHN0dXBpZGl0eSIsIGV0Yy4KKworCSogbWFpbi5jLCBpbmZsb3cuYywgaW5mZXJpb3IuaCwgZnJhbWUuaCwgY29tbWFuZC5jLCBkZWZzLmgsIAorCXNwYXJjLXBpbnNuLmMsIHNwYXJjLXhkZXAuYywgdmFsdWUuaCwgdmFsb3BzLmMsIHZhbHVlcy5jOiAgTGludC4KKworVHVlIE9jdCAgMiAxMToyMDowMiAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQorCisJKiBUT0RPLCBNYWtlZmlsZS5kaXN0LCBDaGFuZ2VMb2c6ICBGcmVlemUgZm9yIDMuOTEuOCByZWxlYXNlLgorCWJmZCBzdHVmZiBpcyBzdGlsbCBzY3Jld2VkIHVwLCBidXQgd2l0aCBzb21lIG1hbnVhbCB3b3JrLCBpdAorCWNvbXBpbGVzLgorCisJKiBicmVha3BvaW50LmMgKGJwc3RhdF9kb19hY3Rpb25zKTogIFN0YXJ0IG92ZXIgaWYgYSBjb21tYW5kCisJcHJvY2VlZHMgdGhlIGluZmVyaW9yLCBzaW5jZSB0aGUgaW5mZXJpb3Igd2lsbCBoYXZlIHN0b3BwZWQgYW5kCisJd2lsbCBuZWVkIHRvIGhhdmUgaXRzIG5ldyBzdG9wLWFjdGlvbnMgdGFrZW4gY2FyZSBvZi4KKworCSogZGJ4cmVhZC5jIChyZWFkX3N0cnVjdF90eXBlKTogIEV4cHJlc3Npb24gZ2l2ZXMgU3VuMyA0LjAuMworCWNvbXBpbGVyIGZpdHMsIHNpbXBsaWZ5IGl0LgorCisJKiBnZGIudGV4aW5mbyAoZGlyZWN0b3J5IGNvbW1hbmQpOiBEb2MgbmV3IGRpciBjb21tYW5kLgorCXNvdXJjZS5jIChkaXJlY3RvcnlfY29tbWFuZCk6ICAiZGlyIiBub3cgcHV0cyB0aGluZ3Mgb24gdGhlIGZyb250CisJb2YgdGhlIHBhdGgsIG1vdmVzIGR1cHMgdXAgZnJvbnQsIGFuZCBoYW5kbGVzIG11bHRpcGxlIG5hbWVzCisJb24gdGhlIGNvbW1hbmQgbGluZSwgaW5zZXJ0aW5nIGVhY2ggb25lIGluIG9yZGVyLiAgSXQgYWxzbworCWJsb3dzIGF3YXkgY2FjaGVkIGxpbmUgYW5kIGZ1bGxfZmlsZW5hbWUgaW5mby4KKworCSogc3RhY2suYyAoYmFja3RyYWNlX2NvbW1hbmQpOiAgU2tpcCAibW9yZSBzdGFjayBmcmFtZXMgZm9sbG93IgorCXVubGVzcyBpbnRlcmFjdGl2ZS4KKworCSogQ2hhbmdlICNpZm5kZWYgSEFWRV9WUFJJTlRGIHRvICNkZWZpbmUgTUlTU0lOR19WUFJJTlRGIGluCisJeG0tY29udmV4LmgsIHhtLWhwMzAwYnNkLmgsIHhtLWlzaS5oLCB4bS1tZXJsaW4uaCwgeG0tbmV3cy5oLCAKKwl4bS1ucDEuaCwgeG0tcG4uaCwgeG0tcHlyLmgsIHhtLXN5bW1ldHJ5LmgsIHhtLXVtYXguaCwgeG0tdmF4LmguCisJVGhlIG9ubHkgb2RkIG9uZSB3YXMgR291bGQgTlAxLCB3aGljaCBoYWQgZGVmaW5lZCB2cHJpbnRmIHRvCisJInByaW50ZiIhISEKKworCSogTWVyZ2UgVGVkIEdvbGRzdGVpbiA8dGVkZ0BFbmcuc3VuLmNvbT4ncyBjaGFuZ2VzIGZvciBlcG9jaC4KKwlwcmludGNtZC5jIChwcmludF9jb21tYW5kXzEpOiBQYXNzICdpbnNwZWN0JyBmbGFnIGRvd24gYXMgYSBnbG9iYWwKKwl2YXJpYWJsZSwgaW5zcGVjdF9pdC4KKwl2YWxwcmludC5jIChwcmludF9zdHJpbmcsIHZhbF9wcmludCk6IFVzZSB0aGUgZ2xvYmFsIGluc3BlY3RfaXQKKwl0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIHByaW50IGluIEVwb2NoIHN0eWxlIG9yIG5vcm1hbCBzdHlsZS4JCisKK01vbiBPY3QgIDEgMjM6NTU6MjYgMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludCkKKworCSogcHJpbnRjbWQuYyAoY2FsbF9jb21tYW5kKTogIGFkZCBhbiBhbGlhcyBmb3IgdGhlICJwcmludCIgY29tbWFuZAorCXdoaWNoIHJ1bnMgZXhwcmVzc2lvbnMgYW5kIGRvZXNuJ3QgcHJpbnQgdGhlIHJlc3VsdCBpZiB2b2lkLgorCShwcmludF9jb21tYW5kXzEpOiBpbXBsZW1lbnQgaXQuCisKKwkqIGNvbW1hbmQuYzogUmVtb3ZlICNpZiAwJ2QgY29kZS4gIEluaXRpYWxpemUgYWxsIHRoZSBmaWVsZHMKKwlpbiBhZGRfY21kICgpLiAgUmVuYW1lIGRvX25vdGhpbmdfY29tbWFuZCB0bworCW5vdF9qdXN0X2hlbHBfY2xhc3NfY29tbWFuZCwgYW5kIG1ha2UgaXQgZXh0ZXJuYWxseSB2aXNpYmxlLgorCWNvbW1hbmQuaDogYWRkIHVzZXJfY29tbWFuZHMgdG8gc3RydWN0LgorCSogbWFpbi5jIChkZWZpbmVfY29tbWFuZCk6ICBEb24ndCBvdmVybG9hZCBjLT5mdW5jdGlvbiB3aXRoIGEgY2hhcgorCXN0cmluZyBhcyB3ZWxsIGFzIGEgZnVuY3Rpb24gcG9pbnRlci4KKworCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiAgUmVpbnN0YWxsIHRpZW1hbm4gY2hhbmdlcyB0bworCWNhbGxpbmcgY29udmVudGlvbiBvZiB2YWx1ZV9zdHJ1Y3RfZWx0ICgpIHRoYXQgZ290IGRyb3BwZWQgaW4KKwltZXJnZS4KKworCSogdG0tc3BhcmMuaCAoRlJBTUVfRklORF9TQVZFRF9SRUdTKTogIG1vdmUgdG8gc3BhcmMteGRlcC5jLgorCXNwYXJjLXRkZXAuYyAoc3BhcmNfZnJhbWVfZmluZF9zYXZlZF9yZWdzKTogIGRpdHRvLgorCisJKiB0bS1zcGFyYy5oIChQT1BfRlJBTUUpOiByZXBsYWNlIHNvbWUgY29uc3RhbnRzIHdpdGggZGVmaW5lcy4KKworCSogc3BhcmMteGRlcC5jIChzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMpOiAgZGVmZXIgc3RvcmVzIHRvIHJlZ3MKKwl1bnRpbCBhIGdvb2QgdGltZSAoZS5nLiB3aGVuIHdlIGFyZSBhYm91dCB0byBydW4gdGhlIGNoaWxkKSwKKwlzYXZpbmcgcHRyYWNlIGNhbGxzLgorICAgIAkqIGluZnJ1bi5jIChwcm9jZWVkKTogIGhhbmRsZSBET19ERUZFUlJFRF9TVE9SRVMuCisJKiB0bS1zcGFyYy5oOiBkZWZpbmUgRE9fREVGRVJSRURfU1RPUkVTLgorCisJKiBzcGFyYy14ZGVwLmMgKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6IHdoZW4gc3RvcmluZyBmbG9hdAorCXJlZ2lzdGVycywgZG9uJ3Qgc3RvcmUgc3RhY2sgcmVncyB0b28uICBXaGVuIHN0b3JpbmcgdGhlIFNQLAorCWhvd2V2ZXIsIERPIHN0b3JlIHRoZSBzdGFjayByZWdzIHRvby4gIFRoaXMgZml4ZXMgYSBidWcgaW4gd2hpY2gKKwl0aGUgZHVtbXkgZnJhbWUgaXMgbm90IHJlY29nbml6ZWQgd2hlbiBhIGNhbGxfZnVuY3Rpb24gZmluaXNoZXMsCisJYmVjYXVzZSBpdHMgZnJhbWUgcG9pbnRlciAoaW4gdGhlIHN0YWNrIHJlZ3MpIHdhcyBuZXZlcgorCWluaXRpYWxpemVkLgorCShyZWFkX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBNYXJrIFdJTSBhbmQgVEJSIGFuZCBGUFMgYW5kIENQUyB2YWxpZAorCWV2ZW4gdGhvdWdoIHdlIGRvbid0IGtub3cgaG93IHRvIHJlYWQgdGhlbSBmcm9tIGFuIGluZmVyaW9yLgorCXZhbG9wcy5jIChjYWxsX2Z1bmN0aW9uKTogIENvbW1lbnQgYWJvdXQgc3RvcmluZyBTUC4KKworCSogaW5mcnVuLmMgKHNhdmVfaW5mZXJpb3Jfc3RhdHVzKTogU2F2ZSBhd2F5IHRoZSBvcmlnaW5hbCBicHN0YXQKKwljaGFpbiBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIuICBJbnN0YWxsIHRoZSBjb3BpZWQgdmVyc2lvbiBmb3IKKwl1c2UgYnkgd2hvZXZlciBzYXZlZCB0aGUgc3RhdHVzLiAgSXQgd2lsbCBiZSBibG93IGF3YXkgYnkKKwlyZXN0b3JlX2luZmVyaW9yX3N0YXR1cywgYW5kIHRoZSBvcmlnaW5hbCBjaGFpbiByZXN0b3JlZC4gIFRoaXMgaXMKKwlpbXBvcnRhbnQgZm9yIHBlb3BsZSB3aG8gaGF2ZSBwb2ludGVycyBpbnRvIHRoZSBvcmlnaW5hbC4KKworCSogYnJlYWtwb2ludC5jLCBjb21tYW5kLmgsIGNvcHlpbmcuYXdrLCBkYnhyZWFkLmMsIGRlZnMuaCwKKwlmaW5kdmFyLmMsIGZyYW1lLmgsIG9ic3RhY2suaCwgb2JzdGFjay5jLCBpbmZsb3cuYywgdmFsdWUuaCwKKwltYWluLmMsIHByaW50Y21kLmMsIHNwYXJjLXRkZXAuYywgc3ltdGFiLmMsIHZhbHByaW50LmM6IGxpbnQKKworCitGcmkgU2VwIDI4IDIwOjMyOjQ2IDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5kaXN0OiBSb2xsIHZlcnNpb24gdG8gMy45MS44LiAgQWRkIGJmZC5oIGFuZCBiZmRjb25maWcuaAorCXRlbXBvcmFyaWx5IHRvIHRoZSBtYWtlZmlsZS4gIEFkZCBhbTI5ay1vcGNvZGUuaCBhbmQgV0hBVFMuTkVXLgorCUFkZCBzdHVmZi5jIGFuZCBrZGItc3RhcnQuYyB0byB0aGUgT1RIRVJTIGxpc3QgZm9yIHRhciBmaWxlcy4KKworRnJpIFNlcCAyOCAxOToxMjoxMiAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQorCisJKiBNZXJnZSBNaWtlIFRpZW1hbm4ncyBtdWx0aXBsZSBpbmhlcml0YW5jZSBjaGFuZ2VzIGZyb20gU3VuLgorCVN0b3JlIHRoZSBiYXNlY2xhc3NlcyBpbiBhIHR5cGUgc3RydWN0IHN0YXJ0aW5nIGZyb20gYXJyYXkgZWxlbWVudAorCTAgcmF0aGVyIHRoYW4gZnJvbSB0aGUgdW51c3VhbCBhcnJheSBlbGVtZW50IDEuCisKKwlkYnhyZWFkLmM6IHRoZSBhYm92ZS4KKwkodmlydHVhbF9jb250ZXh0KTogQWRkCisJUmVhZCBuZXcgZGVidWcgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggdmlydHVhbCBmdW5jdGlvbiB0YWJsZQorCWEgdmlydHVhbCBmdW5jdGlvbiBpcyBmcm9tLCBhbmQgc3RvcmUgaXQgaW4gZm5fZmllbGQuZmNvbnRleHQuCisJCisJc3ltdGFiLmg6IEFkZCBmY29udGV4dHQuICBGaXggYmFzZWNsYXNzIGluZGljZXMuICBUeXBvIGluCisJVFlQRV9GTl9GSUVMRF9TVEFUSUNfUC4KKworCXN5bXRhYi5jOiB0aGUgYWJvdmUuCisJdmFsb3BzLmM6IHRoZSBhYm92ZS4gIEhhbmRsZSBwb2ludGVyIGNhc3RzIG9mIG9iamVjdCAqJ3MuCisJKHNlYXJjaF9zdHJ1Y3RfbWV0aG9kKTogQWRkLgorCSh2YWx1ZV9zdHJ1Y3RfZWx0KTogRmlyc3QgYXJnIGlzIG5vdyBhIHBvaW50ZXIgdG8gYSB2YWx1ZSwgYW5kIGlzCisJbW9kaWZpZWQgb24gcmV0dXJuLgorCisJdmFscHJpbnQuYzogdGhlIGFib3ZlLgorCXZhbHVlcy5jICh2YWx1ZV92aXJ0dWFsX2ZuX2ZpZWxkKTogQWRkIHR5cGUgYXJnLiAgSGFuZGxlCisJb2Zmc2V0dGluZyB0byB0aGUgcHJvcGVyIG9iamVjdCB3aGVuIGNhbGxpbmcgdmlydHVhbCBmbnMuCisJVGhlIGFib3ZlLgorCShiYXNlY2xhc3NfYWRkcik6IEFkZCB2YWx1ZXAgYXJnLgorCisJKiBSRUFETUU6ICBEb2N1bWVudCB0aGUgY3VycmVudCBzdGF0ZSBvZiBCRkQgY29uZmlnIChtaXNzaW5nKS4KKwkqIFRPRE8sIENoYW5nZUxvZywgTWFrZWZpbGUuZGlzdDogUm9sbCB2ZXJzaW9uLgorCSogV0hBVFMuTkVXOiBBZGQgc3VtbWFyeSBvZiBjaGFuZ2VzIHNpbmNlIDMuNS4KKworVGh1IFNlcCAyNyAxNjoyMzoxMiAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQorCisJKiBkYnhyZWFkLmMgKHJlYWRfc3RydWN0X3R5cGUpOiBDbGVhciBiaXQgdmVjdG9ycyB3aGVuZXZlcgorCXdlIGFsbG9jYXRlIG9uZS4KKwlzeW10YWIuYyAoQl9DTFJBTEwpOiBkZWZpbmUuCisKKwkqIHRtLXNwYXJjLmggKFNUT1JFX1JFVFVSTl9WQUxVRSk6IEF2b2lkIGNsb2JiZXJpbmcgdHlwZXMgYnkKKwl1c2luZyA9PSByYXRoZXIgdGhhbiA9LiAgSHVoLi4uICBUaGlzIGZpeGVzIHRoZSBkcmVhZGVkIHByb2JsZW0KKwl3aGVyZWluIGJ1aWx0aW5fdHlwZV9pbnQgYmVjb21lcyBUWVBFX0NPREVfRkxULgorCisJKiBjb3JlLmMgKGluZm9fZmlsZXMpOiBTaG93IHRoZSBpbmZlcmlvciBwaWQuCisKKwkqIGNvbmZpZy5nZGI6IEF2b2lkIHB1dHRpbmcgImRpciIgY29tbWFuZCBpbnRvIC5nZGJpbml0LiAgR0RCCisJYWxyZWFkeSBrbm93cyBob3cgdG8gbG9vayBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4KKworCSogUmVtb3ZlIHBzeW10YWIgaGFpciBmcm9tIG1hbnkgcGxhY2VzLiAgUmVtb3ZlIGR1cGxpY2F0ZWQgY29kZQorCWZvciBzZWFyY2hpbmcgc3ltYm9sIHRhYmxlcy4gIEhpZGUgcHN5bXRhYnMgZnJvbSBtb3N0IHBsYWNlcy4KKwlNYWtlIGl0IGZhc3QgdG8gZ2V0IGZyb20gYSBwc3ltdGFiIHRvIGl0cyBzeW10YWIuCisKKwlibG9ja2ZyYW1lLmMgKGJsb2NrdmVjdG9yX2Zvcl9wYyk6IFJlbW92ZSBwc3ltdGFiIGhhaXIuCisJY29mZnJlYWQuYyAocHN5bXRhYl90b19zeW10YWIpOiBSZW5hbWUgdG8gcHN5bXRhYl90b19zeW10YWIyLgorCW1pcHNyZWFkLmMgKHBzeW10YWJfdG9fc3ltdGFiKTogUmVuYW1lIHRvIHBzeW10YWJfdG9fc3ltdGFiMi4KKwlkYnhyZWFkLmM6IGV4cG9ydCBwc3ltdGFiX3RvX3N5bXRhYiwgbWFrZSBpdCB3b3JrIGlmIGNhbGxlZCBOIHRpbWVzLgorCShwc3ltdGFiX3RvX3N5bXRhYik6IFJlbmFtZSB0byBwc3ltdGFiX3RvX3N5bXRhYjIuICBJbml0aWFsaXplCisJbmV3IHN5bXRhYiBjb21wbGV0ZWx5LiAgTmV3IHBzeW10YWJzIGdldCBzeW10YWIgcG9pbnRlcgorCWluaXRpYWxpemVkIHRvIHplcm8uICBSZW1vdmUgTUkgd2FybmluZyBwcmludGYuICAKKwlzeW10YWIuaDogQ29tbWVudHMuICBBZGQgcHN5bXRhYiB0byBzeW10YWIgcG9pbnRlci4KKwkoUFNZTVRBQl9UT19TWU1UQUIpOiBOZXcgbWFjcm8uCisJc3ltdGFiLmM6IHVzZSBQU1lNVEFCX1RPX1NZTVRBQi4gIEFkZCBwc3ltdGFiX3RvX3N5bXRhYiBhbmQgZXhwb3J0IGl0LgorCXNvdXJjZS5jOiB1c2UgUFNZTVRBQl9UT19TWU1UQUIuICBSZW1vdmUgc3ltdGFiIHZlcnNpb24gYW5kCisJY29tcGlsYXRpb24gZmllbGRzLgorCXN0YWNrLmMgKGJhY2t0cmFjZV9jb21tYW5kKTogQXZvaWQgcHJlLXBhc3MgdG8gcmVhZCBzeW1ib2xzLCBpZgorCXZlcmJvc2UgaXMgbm90IHNldC4KKwkocHJpbnRfZnJhbWVfaW5mbyk6IEF2b2lkIHNwZWNpYWwtY2FzaW5nIHN5bWJvbHMgdGhhdCBoYXZlIG5vdCB5ZXQKKwliZWVuIHJlYWQgaW4uCisKKwkqIHNvdXJjZS5jIChvcGVuX3NvdXJjZV9maWxlKTogUXVpY2sgcGF0aCBpZiB3ZSBoYXZlIGFscmVhZHkKKwlsb2NhdGVkIHRoZSBzb3VyY2UgZmlsZSBieSBpdHMgZnVsbCBuYW1lLgorCisJKiBzeW10YWIuYyAobG9va3VwX3N5bWJvbCk6IFVzZSBmaW5kX3BjX3N5bXRhYiByYXRoZXIgdGhhbgorCWZpbmRfcGNfcHN5bXRhYi4gIFdoZW4gYSBuYW1lIGlzIGZvdW5kIGluIHRoZSBtaXNjIGZ1bmN0aW9uCisJdmVjdG9yLCBzZWFyY2ggdGhlIHN5bWJvbCB0YWJsZSBmb3IgaXRzIG1hbmdsZWQgbmFtZSwgbm90IHRoZQorCW5hbWUgdGhhdCB0aGUgdXNlciB0eXBlZC4KKworCSogYmZkLmg6IEZpeCBtaXNzaW5nIGNvbW1lbnQgdGVybWluYXRvcnMsIG1ha2UgI2VuZGlmcyBtYXRjaC4KKworCSogdmFsYXJpdGguYyAodmFsdWVfbGVzcyk6IEhhbmRsZSB1bnNpZ25lZCBpbnQgY29tcGFyaXNvbnMuCisJQWRkIEZJWE1FIGFib3V0IHBvaW50ZXIgY29tcGFyZXMsIHdoaWNoIGFzc3VtZSBob3N0IGFuZCB0YXJnZXQKKwlwb2ludGVycyBhcmUgdGhlIHNhbWUuCisKKwkqIGNvbW1hbmQuYyAoZG9fbm90aGluZ19jb21tYW5kKTogbGludAorCWRieHJlYWQuYzogbGludC4gIFJlbW92ZSBzb3J0X3N5bXMuICBEb2N1bWVudCBDKysgdmlzaWJpbGl0eSBpbmZvLAorCWZpeCBjb21tZW50cyBvbiBkZWJ1ZyBzeW1ib2wgZm9ybWF0IGZvciB2aXNpYmlsaXR5LiAgQWN0dWFsbHkgc2V0CisJdmlzaWJpbGl0eSBvZiBzeW1ib2xzLgorCW1haW4uYyAoZWNob19jb21tYW5kKTogbGludDsgdXNlIDxyZWFkbGluZS9oaXN0b3J5Lmg+LgorCXRtLXNwYXJjLmggKEZSQU1FX0ZJTkRfU0FWRURfUkVHUyk6IGxpbnQKKwlvYnN0YWNrLmggKF9vYnN0YWNrX2JsYW5rKTogUmVhcnJhbmdlIHBvaW50ZXIgbWF0aCB0byBhdm9pZAorCXBvaW50aW5nIHBhc3QgZW5kIG9mIGFsbG9jYXRlZCBtZW1vcnk7IHNhYmVyIGNvbXBsYWlucy4KKwlvYnN0YWNrLmg6IERlY2xhcmUgdGhlIGV4dGVybmFsIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZS4KKwl2YWxhcml0aC5oOiB1c2UgPHN0cmluZy5oPgorCXNvbGliLmMgKHNvbGliX2FkZCk6IGxpbnQuCisKK0ZyaSBTZXAgMjEgMTc6MDU6MTkgMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludCkKKworCSogbWFpbi5jIChpbml0aWFsaXplX21haW4pOiAgRGVmYXVsdCBpbmZvX3ZlcmJvc2UgdG8gb2ZmLCBub3cgdGhhdAorCXN5bWJvbCByZWFkaW5nIGlzIGZhc3QuCisJKHF1aXRfY29tbWFuZCk6ICBBdm9pZCBjbG9iYmVyaW5nIGV4ZWNfYmZkIHdoaWxlIHF1aXR0aW5nLgorCisJKiBJbml0aWFsIEJGRCAoYmluYXJ5IGZpbGUgZGlkZGxpbmcgbGlicmFyeSkgbWVyZ2VyOgorCWNvZmZyZWFkLmM6IENoYW5nZSBBT1VUSERSIHRvIHN0cnVjdCBleGVfaGRyLgorCWRieHJlYWQuYzogZGl0dG8uCisJY29yZS5jOiBpbml0aWFsaXplIGluaXRpYWxpemVkIGRhdGEgYXQgY29tcGlsZSB0aW1lLgorCShjb3JlX2ZpbGVfY29tbWFuZCk6ICBNb3ZlIGZyb20gY29yZWRlcC5jLCBjb252ZXJ0IHRvIGJmZC4KKwkoeGZlcl9jb3JlX2ZpbGUpOiBDb252ZXJ0IHRvIGJmZC4KKwlleGVjLmMgKGV4ZWNfZmlsZV9jb21tYW5kKTogdXNlIGJmZCByb3V0aW5lcy4KKwlnZGJjb3JlLmg6IEJGRC4KKwltaXBzLXRkZXAuYzogUmVtb3ZlIGV4ZWNfZmlsZV9jb21tYW5kIGFuZCBmcmllbmRzLgorCXNvdXJjZS5jOiBiZmQuCisJCisJKiBjb3JlZGVwLmM6IChmZXRjaF9jb3JlX3JlZ2lzdGVycykgQ29udmVydCBjb3JlX2ZpbGVfY29tbWFuZCB0bworCWZldGNoX2NvcmVfcmVnaXN0ZXJzLgorCW1pcHMteGRlcC5jLCBzcGFyYy14ZGVwLmMsIHN1bjMteGRlcC5jOiBkaXR0by4KKwkKKwkqIHV0aWxzLmM6IChlcnJvcik6IEJvZ3VzIGNyYXAsIEZJWE1FLCB0byBwcmludCBiZmQgZXJyb3JzLgorCShteV9iZmRfcmVhZCk6IE1vcmUgYm9nb3NpdHksIHdoaWNoIEkgZG9uJ3QgdGhpbmsgd2UgY2FsbC4KKwkocHJvZ3JhbV9uYW1lKTogUmVtb3ZlIHRoaXMgYXRyb2NpdHkgYXNhcCEKKworV2VkIFNlcCAxOSAxMzozNjo0MSAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQorCisJKiBGcm9tIFBlciBCb3RobmVyOgorCXZhbHVlcy5jOiBhbGxvY2F0ZV9yZXBlYXRfdmFsdWUgd2FzIG5vdCBjbGVhcmluZyB0aGUKKwlvcHRpbWl6ZWRfb3V0IGZpZWxkLgorCSh2YWx1ZV9zdGF0aWNfZmllbGQpOiBtaW5vciBzdHlsaXN0aWMgZml4ICh3cm9uZyBtYWNybyB3YXMgdXNlZCkuCisJdmFsb3BzLmMgKHZhbHVlX3N0cnVjdF9lbHRfZm9yX2FkZHJlc3MpOiBkaWRuJ3Qgd29yayBmb3IgQysrCisJc3RhdGljIGZpZWxkcy4KKworCSogc2lnbmFtZS5jIChfaW5pdGlhbGl6ZV9zaWduYW1lKTogIEluaXRpYWxpemUgc2lnbmFsIG5hbWVzIG9uY2UuCisKKwkqIGJyZWFrcG9pbnQuaCwgY29tbWFuZC5jLCBjb3B5aW5nLmF3aywgZGVmcy5oLCBlbnZpcm9uLmMsCisJZXhlYy5jLCBmcmFtZS5oLCBpbmZjbWQuYywgaW5mZXJpb3IuaCwgbWFpbi5jLCBtdW5jaCwgc3VuMy14ZGVwLmMsCisJc3ltdGFiLmgsIHRtLTI5ay5oLCB2YWxwcmludC5jLCB2YWx1ZS5oLCB2YWx1ZXMuYzogIExpbnQuCisKKwkqIHJlbW90ZS1lYi5jOiAgU3VwcG9ydCB1c2VyLXNldHRhYmxlIGJhdWQgcmF0ZXMgb24gdGhlIHNlcmlhbCBwb3J0LgorCisJKiB0bS1zdW4zLmggKFBSRVBBUkVfVE9fU1RPUkUpOiBmaXggdHlwby4KKworRnJpIFNlcCAxNCAxMzoyODoyOSAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQorCisJKiB0Y29uZmlnL3N1bjNvczQ6IFJlbW92ZSB3YXJuaW5nIGFib3V0IG5hdGl2ZSBhc3NlbWJsZXIsCisJc2luY2UgaXQgYWxzbyBvY2N1cnMgaW4gdGhlIHhjb25maWcgZmlsZS4KKworCSogZmluZHZhci5jIChyZWdpc3RlcnMpOiBBbGxvY2F0ZSBzb21lIHNsb3AgYWZ0ZXIgYHJlZ2lzdGVycycKKwl0byBwcmV2ZW50IHN0cmF5IGFjY2Vzc2VzIGZyb20gdHJhc2hpbmcgdGhlIG5leHQgdmFyaWFibGUuCisKKwkqIHRtLTY4ay5oIChSRUdJU1RFUl9CWVRFUyk6ICBBbGxvY2F0ZSB0aGUgcmlnaHQgbnVtYmVyIG9mIGJ5dGVzCisJb24gdGhlIHN1bi0zLCBieSBjaGFuZ2luZyB0aGUgI2lmZGVmIGZyb20gYHN1bjMnICh3aGljaCBpcyBub3QKKwlkZWZpbmVkIGJ5IGNjKSB0byBgc3VuJy4gIFN5bXB0b20gd2FzIHRyYXNoZWQgYnVpbHRpbl90eXBlX1hYWAorCXZhcnMsIHdoaWNoIGhhcHBlbmVkIHRvIGZvbGxvdyBgcmVnaXN0ZXJzJyBpbiB0aGUgZXhlY3V0YWJsZS4KKworCSogcmVhZGxpbmUvaGlzdG9yeS5jIChoaXN0b3J5X3NlYXJjaCk6IEhlZWQgZ2NjLTIncyBhZHZpY2UKKwlhbmQgcGFyZW50aGVzaXplICYmIGluc2lkZSB8fCkuCisKKwkqIGFtMjlrLW9wY29kZS5oLCBhbTI5ay1waW5zbi5jLCBhbTI5ay10ZGVwLmMsIHJlbW90ZS1lYi5jLAorCXRtLTI5ay5jOiAgSW5zZXJ0IEZTRiBjb3B5cmlnaHQgaGVhZGVycy4KKworCSogcmVtb3RlLWViLmM6ICBCZXR0ZXIgY29tbWVudHMuCisKKwkqIE1ha2VmaWxlLmRpc3Q6ICBVcGRhdGUgdG8gMy45MS42LgorCSogVE9ETzogbm90ZSBQUkVQQVJFX1RPX1NUT1JFIHByb2JsZW0uCisKK1RodSBTZXAgMTMgMDk6NTI6MzMgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludCkKKworCSogc3RhY2suYyAoZnJhbWVfaW5mbyk6IE9ubHkgdXNlIEZSQU1FX0ZJTkRfU0FWRURfUkVHUyBpZiBkZWZpbmVkLgorCisJKiByZW1vdGUuYzogIFdyYXAgdGhlIHdob2xlIGZpbGUgaW4gI2lmICFkZWZpbmVkIChTUEVDSUFMX1JFTU9URSkuCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvciwgYXQgZW5kKTogRG9uJ3Qgc2V0IHVwCisJcHJldl8qIGlmIHRoZSBpbmZlcmlvciBubyBsb25nZXIgZXhpc3RzLgorCisJKiBpbmZlcmlvci5oIChDQUxMX0RVTU1ZX0xPQ0FUSU9OKTogTmV3IG1hY3JvLCB0byByZXBsYWNlCisJQ0FOTk9UX0VYRUNVVEVfU1RBQ0suCisJdmFsb3BzLmMgKGNhbGxfZnVuY3Rpb24pOiBVc2UgaXQuCisKKwkqIHRtLWNvbnZleC5oOiBBZGQgQ0FMTF9EVU1NWV9MRU5HVEggZm9yIHVzZSBieSBQQ19JTl9DQUxMX0RVTU1ZLgorCisJKiBpbmZlcmlvci5oIChQQ19JTl9DQUxMX0RVTU1ZKTogTmV3IG1hY3JvLgorCWluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvciwgMiBwbGFjZXMpOiBVc2UgaXQuCisKKwkqIHZhbHVlcy5jICh2YWx1ZV9iZWluZ19yZXR1cm5lZCk6IE9ubHkgdXNlCisJRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyBpZiBkZWZpbmVkLgorCisJKiBNb3ZlIFBSRVBBUkVfVE9fU1RPUkUgZnJvbSB4bS1zdW4zLmggdG8gdG0tc3VuMy5oIHRvIGRvIHRoZQorCXJpZ2h0IHRoaW5nIGZvciByZW1vdGUtZWIuYy4gIAorCisJKiBzdW4zLXhkZXAuYzogIFJlbW92ZSBleHRyYW5lb3VzIGNhbGwgdG8gcmVtb3RlX3N0b3JlX3JlZ2lzdGVycy4KKwkqIHN1bjM4Ni14ZGVwLmMsIGhwMzAwaHB1eC14ZGVwLmMsIHNwYXJjLXhkZXAuYzogIERpdHRvLgorCisJKiBibG9ja2ZyYW1lLmM6ICBQdXQgZ2V0X2ZyYW1lX3NhdmVkX3JlZ3MgaW5zaWRlICNpZiAhZGVmaW5lZAorCShGUkFNRV9GSU5EX1NBVkVEX1JFR1MpLgorCisJKiBmaW5kdmFyLmMgKHtmZXRjaCxzdG9yZX1fcmVnaXN0ZXJzKTogQ2hlY2sgZm9yCisJUkVNT1RFX3tGRVRDSF9TVE9SRX1fUkVHSVNURVIgbWFjcm8uCisKKwkqIGZpbmR2YXIuYyAoZ2V0X3NhdmVkX3JlZ2lzdGVyKTogQWRkIGFyZ3VtZW50IGx2YWwgYW5kCisJY2hhbmdlIG1lYW5pbmcgb2YgYXJndW1lbnQgYWRkci4KKwlmaW5kdmFyLmM6ICBDaGFuZ2UgY2FsbHMgdG8gZ2V0X3NhdmVkX3JlZ2lzdGVyIHRvIHJlZmxlY3QKKwluZXcgY2FsbGluZyBjb252ZW50aW9uLgorCXZhbG9wcy5jICh2YWx1ZV9hc3NpZ24pOiBVc2UgZ2V0X3NhdmVkX3JlZ2lzdGVyIGluc3RlYWQgb2YKKwlmaW5kX3NhdmVkX3JlZ2lzdGVyLgorCitTdW4gU2VwICAyIDEyOjQwOjIwIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKKworCSogY29mZnJlYWQuYyAocmVhZF9vbmVfc3ltKTogTWFrZSB0ZW1wX2F1eCBhbiBBVVhFTlQsIG5vdAorCWFuICh1bmluaXRpYWxpemVkKSBwb2ludGVyIHRvIG9uZS4gIFVzZSAiJiIgd2hlbiBwYXNzaW5nIGl0CisJdG8gZnJlYWQuCisKK0ZyaSBBdWcgMzEgMjI6NTc6NTQgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGN5Z2ludC5jeWdudXMuY29tKQorCisJKiBjb2ZmcmVhZC5jIChnZXRmaWxlbmFtZSk6IFVzZSBER1VYIHhfb2Zmc2V0IGFuZCB4X25hbWUgaWYKKwlkZWZpbmVkLgorCisJKiBjb2ZmcmVhZC5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogUHV0IHNlbWljb2xvbiBhZnRlcgorCSJpbnQgZnJvbV90dHkiLgorCVB1dCBzYWZlX3RvX2luaXRfdGRlc2NfY29udGV4dCBpbiAjaWYgZGVmaW5lZCAoVERFU0MpLgorCVB1dCAjaWZkZWYgVERFU0NzIGluIDFzdCBjb2x1bW4gZm9yIG5vbi1BTlNJIGNwcCdzLgorCWNvZmZyZWFkLmM6ICNpbmNsdWRlIDxzeXMvc3RhdC5oPi4KKwkocmVhZF9jb2ZmX3N5bXRhYik6IFR5cG86IGluX3NvdXJjZV9maWxlcyAtPiBpbl9zb3VyY2VfZmlsZS4KKwlBZGQgbWlzc2luZyAnKScgaW4gY2hlY2sgZm9yICJsYyUiIGFuZCBmcmllbmRzLiAgUmVtb3ZlCisJZXh0cmFuZW91cyAnfScuCisJRGVjbGFyZSByZWFkX29uZV9zeW0oKSBhdCB0b3Agb2YgZmlsZS4KKwkocmVhZF9maWxlX2hkcik6IFB1dCBpbiBleHRyYSAjaWZkZWZzIHNvIE1DNjhNQUdJQyBhbmQKKwlNQzY4V1JNQUdJQyBjYW4gaGF2ZSB0aGUgc2FtZSB2YWx1ZSB3aXRob3V0IGNhdXNpbmcgYSBkdXBsaWNhdGUKKwljYXNlLgorCitUaHUgU2VwIDEzIDE1OjU1OjM2IDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQpCisKKwkqIEFsbG93IGEgTWFrZWZpbGUgdG8gYmUgYnVpbHQgd2l0aG91dCBidWlsZGluZyB0aGUKKwl0bSBhbmQgeG0gZmlsZSBsaW5rcyB0aGF0IHNjcmV3IHVwIGJ1aWxkcyBpbiBzdWJkaXJlY3Rvcmllcy4KKwlUaGlzIGlzIGRvbmUgd2l0aCBgY29uZmlnLmdkYiBub25lJywgdGhlbiB5b3UgY2FuIGRvIHRoaW5ncworCWxpa2UgYG1ha2UgZ2RiLnRhci5aJy4KKwkqIHRjb25maWcvbm9uZTogQ29uZmlnIGZpbGUgZm9yIG5vIHRhcmdldCBzeXN0ZW0KKwkqIHhjb25maWcvbm9uZTogQ29uZmlnIGZpbGUgZm9yIG5vIGhvc3Qgc3lzdGVtCisJKiBjb25maWcuZ2RiOiBJZiBubyBUTSBvciBYTSBmaWxlcyBhcmUgY2FsbGVkIG91dCBieSB0aGUKKwlob3N0IG9yIHRhcmdldCBmaWxlLCBkb24ndCBtYWtlIGxpbmtzIGZvciB0aGVtLgorCisJKiBjcGx1cy1kZW0uYzogQWRkIGRvY3VtZW50YXRpb24uCisKKwkqIGRieHJlYWQuYyAocmVhZF9vZmlsZV9zeW10YWIpOiBUdXJuIGEgZmF0YWwgZXJyb3IgaW50byBhCisJc2ltcGxlIGVycm9yLCBzbyB0aGUgdXNlcidzIGdkYiBkb2Vzbid0IGNyYXNoIGR1ZSB0byBzb21lIG9iamVjdAorCWZpbGUgcHJvYmxlbSAoZS5nLiBzb21lYm9keSBpcyByZWJ1aWxkaW5nIHRoZSBmaWxlIG91dCBmcm9tIHVuZGVyCisJZ2RiKS4KKworCSogcHJpbnRjbWQuYyAocHJpbnRfYWRkcmVzc19zeW1ib2xpYyk6IGRlbWFuZ2xlIHRoZSBzeW1ib2wuCisKKwkqIE1ha2VmaWxlLmRpc3QgKE9USEVSUyk6IFJlbW92ZSB0ZGVzYy1saWIgYmVjYXVzZSBpdCBoYXMgCisJTW90b3JvbGEgY29weXJpZ2h0cyBpbiBpdC4gIE1ha2UgIm1ha2UgZ2RiLnRhci5aIiB3b3JrLgorCShhbGxkZXBzLm1hayk6IHNvcnQgYW5kIHVuaXEgYWxsIHJlc3VsdHMgZnJvbSB0aGlzOyBkdXBsaWNhdGVzCisJaG9zZSBnZGIudGFyLlogbGluayBidWlsZGluZy4gIFJlbW92ZSBSQ1MgZmlsZXMgZnJvbQorCXRjb25maWcgYW5kIHhjb25maWcuICBBZGQgY29uZmlnIGZpbGVzIGZvciBzdW4zODYuICBBZGQKKwlhIGZldyBvZGQgZmlsZXMgdG8gT1RIRVJTIGFuZCBIRklMRVMuCisKK01vbiBTZXAgMTAgMjE6MjA6MjQgMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludCkKKworCSogTWFrZWZpbGUuZGlzdDogUHVsbCBzb2xpYi5jIHRvIHRjb25maWcvc3VuP29zNC4KKwlSb2xsIHZlcnNpb24gbnVtYmVyIHRvIDMuOTEuNS4gIE1ha2UgbGludCB3b3JrIGluIGJpbmRpci4KKworCSogUkVBRE1FOiAgRG9jdW1lbnQgY3Jvc3MtZGVidWdnaW5nIGFuZCBuZXcgZmlsZSBzdHJ1Y3R1cmUuCisKKwkqIGJsb2NrZnJhbWUuYzogTGludC4gIEluY2x1ZGUgInZhbHVlLmgiIHRvIGRlY2xhcmUgcmVhZF9yZWdpc3Rlci4KKwkoZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uKTogcmVtb3ZlIGR1cGxpY2F0ZSBsaW5lLgorCisJKiBjb21tYW5kLmg6IExpbnQuICBEZWNsYXJlIGVycm9yX25vX2FyZyBhbmQgZG9udF9yZXBlYXQuCisKKwkqIHRtLW5ld3MuaDogUmVtb3ZlIGluYWR2ZXJ0ZW50bHkgZHVwbGljYXRlZCBzdHVmZi4KKworCSogbWlwc3JlYWQuYzogUmVtb3ZlIGNhY2hlX3BjX2Z1bmN0aW9uIHN0dWZmLCBub3cgZG9uZSBjbGVhbmx5LgorCUNsZWFuIHVwIHVzYWdlIG9mIG1pc2NfZnVuY3Rpb25fdHlwZS4gIERlY2xhcmUgc29tZSBDT1JFX0FERFJzLgorCisJKiBjb25maWcuZ2RiOiBBbGxvdyBgY29uZmlnLmdkYiBob3N0IHRhcmdldCcgZm9ybS4gIENsZWFuCisJdXAgcHJldmlvdXMgY2hhbmdlIHRoYXQgcHJpbnRlZCBib2d1cyBtZXNzYWdlcyB3aGVuIHlvdSBqdXN0IHNhaWQKKwlgY29uZmlnLmdkYicuCisKKwkqIGNvcmUuYzogI2luY2x1ZGUgImNvbW1hbmQuaCIgZm9yIGxpbnQuCisJKiBkYnhyZWFkLmM6IGxpbnQKKwkqIGV2YWwuYzogbGludAorCSogbWFpbi5jOiBSZW1vdmUgc29tZSBjYXN0cyBvZiBlbnVtcy4gIExpbnQuCisJKiBzb3VyY2UuYzogbGludAorCSogc3ltdGFiLmM6IGxpbnQKKwkqIHN5bXRhYi5oOiBsaW50CisJKiBleHByZWFkLnk6IGxpbnQKKwkqIHZhbGFyaXRoLmM6IGxpbnQKKworCSogcHJpbnRjbWQuYyAoaW5pdGlhbGl6ZV9wcmludGNtZCk6IEZpeCB0aGlua28gaW4gaW5zcGVjdCBjbWQuCisJCisJKiBzcGFyYy10ZGVwLmMgKGlzYW5udWxsZWQpOiBUYWtlIGluc3RydWN0aW9uIGFzIHBhcmFtZXRlciwgZG9uJ3QKKwlyZWFkIGl0IGZyb20gbWVtb3J5LiAgVGhpcyB3aWxsIGFsbG93IHVzIHRvIHNhdmUgcHRyYWNlIGNhbGxzCisJZXZlbnR1YWxseS4gICBDaGFuZ2VkIGNhbGxlciBzaW5nbGVfc3RlcCB0b28uCisKKwkqIHNwYXJjLXhkZXAuYyAoZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzKTogQXZvaWQgcmVhZGluZyByZWdzCisJdGhhdCB3ZSBhcmVuJ3QgZ29pbmcgdG8gdXNlLCBzYXZpbmcgbWFueSBwdHJhY2UgY2FsbHMsIGVzcGVjaWFsbHkKKwl3aGVuIHdhdGNocG9pbnRpbmcgb3Igc2luZ2xlIHN0ZXBwaW5nLiAgVXNlIHNvbWUgI2RlZmluZSdzIGZvcgorCWNvbnN0YW50cy4KKwkoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogRGl0dG8uCisJKGNvcmVfZmlsZV9jb21tYW5kKTogVXNlIHNvbWUgI2RlZmluZSdzIGZvciBjb25zdGFudHMuCisKKwkqIHRtLXNwYXJjLmg6IEFkZCAjZGVmaW5lJ3MgZm9yIHNvbWUgcmVnaXN0ZXIgbnVtYmVycywgc28gd2UKKwljYW4gZWxpbWluYXRlIHRoZSB1c2Ugb2YgcmFuZG9tIGNvbnN0YW50cyBpbiBzcGFyYy14ZGVwLmMuCisKKwkqIHN0YWNrLmMgKGZyYW1lX2NvbW1hbmQsIHByaW50X2ZyYW1lX2luZm8sIHVwX2NvbW1hbmQsCisJZG93bl9jb21tYW5kKSBSZW1vdmUgZnJhbWVfY2hhbmdlZCwgc2luY2UgaXQKKwljYXVzZXMgYSBidWcgYW5kIGRvZXNuJ3Qgc2VlbSB0byBkbyBhbnl0aGluZyB1c2VmdWwuICBJbiBzb21lCisJcGxhY2VzIGl0IHdhcyB1c2VkIGFzIGEgZmxhZywgaW4gb3RoZXJzIGFzIGEgc3RhY2sgbGV2ZWwgKD8pLgorCisJKiB1dGlscy5jOiBVc2UgTUlTU0lOR19WUFJJTlRGIHJhdGhlciB0aGFuIEhBVkVfVlBSSU5URiwgc28gdGhlCisJZGVmYXVsdCBpcyB0byB1c2UgdGhlIHBvcnRhYmxlICh2cHJpbnRmKSB2ZXJzaW9uIHJhdGhlciB0aGFuIHRoZQorCWtsdWRnZSB2ZXJzaW9uLgorCSogeG0tbmV3cy5oIChNSVNTSU5HX1ZQUklOVEYpOiBBZGQuCisKKwkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6IERlbWFuZ2xlIGZhbmN5IHZ0YmwgcHJpbnRvdXRzLiAgTGludC4KKworU2F0IFNlcCAgOCAwMDoyNDoxMiAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQorCisJKiBSZW1vdmUgc3R1ZmYgdGhhdCBmb3JjZXMgLUJzdGF0aWMgbGlua2luZyBvZiBnZGIsIGFuZCB3YXJuaW5ncworCWFib3V0IGxpbmtpbmcgZGVidWdnZWQgcHJvZ3JhbXMgLUJzdGF0aWMgaW4gdGhlIHN1bj9vczQgY29uZmlnCisJZmlsZXMgaW4gdGNvbmZpZyBhbmQgeGNvbmZpZyBzdWJkaXJlY3Rvcmllcy4KKworCSogbWFpbi5jIChtYWluKTogIFJlbW92ZSB1bnJlYWNoZWQgZXhpdCgwKSBub3cgdGhhdCB3ZSBleGl0CisJdmlhIHF1aXRfY29tbWFuZCgpLgorCisJKiBDcmVhdGUgVE9ETyBmaWxlIGZvciBvbmxpbmUgYnVnIGxpc3QuICBUaGVyZSBhcmUgdG9vIG1hbnkKKwkibGl0dGxlIiBidWdzIHRvIGtlZXAgdHJhY2sgb2Ygb24gcGFwZXIuCisKKwkqIENoYW5nZSBQcm9qZWN0cyBmaWxlIHRvIHJlZmVyIHRvIGJ1Zy1nZGJAY3lnbnVzLmNvbQorCXJhdGhlciB0aGFuIGtpbmdkb25AYWkuCisKK0ZyaSBTZXAgIDcgMjM6MzU6MTUgMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludCkKKworCSogTWFrZWZpbGUuZGlzdCAoVkVSU0lPTik6IDMuOTEuNCBub3cuCisKKwkqIHN5bXRhYi5jIChpbml0X21pc2NfYnVuY2hlcyk6IFJlbmFtZSBmcm9tIGluaXRfbWlzY19mdW5jdGlvbnMuCisJKGNvbmRlbnNlX21pc2NfYnVuY2hlcyk6IEFkZCBzYW5pdHkgY2hlY2sgdGhhdCBtaXNjX2NvdW50IGlzCisJdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBzeW1ib2xzIGluIHRoZSBidW5jaC4KKwkKKwkqIGNvZmZyZWFkLmM6IHJlbmFtZSBpbml0X21pc2NfYnVuY2hlcy4gIFBhc3MgYW4gYXJndW1lbnQgCisJdG8gY29uZGVuc2VfbWlzY19idW5jaGVzIChhIHplcm8pLgorCisJKiBkYnhyZWFkLmMgKHBhcnRpYWxfc3ltYm9sX2ZpbGVfcmVhZCk6IENhbGwgaW5pdF9taXNjX2J1bmNoZXMKKwlldmVyeSB0aW1lIHdlIGFyZSBjYWxsZWQ7IGRvbid0IHJlbHkgb24gb3VyIGNhbGxlciB0byBkbyBpdC4KKwkoYWRkX2ZpbGUpOiBSZW1vdmUgY2FsbCB0byBpbml0X21pc2NfYnVuY2hlcy4KKworCSogbWlwc3JlYWQuYzogT25seSB3YXJuLCBkb24ndCBlcnJvciwgaWYgdW5rbm93biBzeW1ib2wgdHlwZXMuCisJVGhpcyBrZWVwcyBhbiBvbGQgZ2RiIGZyb20gZmFsbGluZyBvbiBpdHMgZmFjZSBpZiBpdCBzZWVzIG5ld2x5CisJZXh0ZW5kZWQgc3ltYm9sIGluZm8uICBSZW5hbWUgaW5pdF9taXNjX2J1bmNoZXMuCisKK0ZyaSBTZXAgIDcgMjI6NTg6MTUgMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludCkKKworCSogTWVyZ2UgaW4gY2hhbmdlcyBmcm9tIFBlciBCb3RobmVyIGZvciBERUNzdGF0aW9ucyBhbmQgb3RoZXIKKwlNSVBTIHN0dWZmLiAgVGhlIHJlc3QgaXMgQm90aG5lciBzcGVha2luZzoKKworCVRoZSBuZXh0IG1lc3NhZ2UgaXMgYSBtZXJnZXIgb2YgQWxlc3NhbmRvIEZvcmluJ3MgbWlwcyBwb3J0IHdpdGgKKwltaW5lLiAgSSd2ZSB0cmllZCB0byB1c2UgbXkgZ29vZCBpZiBiaWFzZWQganVkZ21lbnQgdG8gZ2V0CisJdGhlIGJlc3Qgb2YgYm90aC4gSXQgKmRvZXMqIG5lZWQgdGVzdGluZy4KKworCVNvbWUgb2YgdGhlIGNoYW5nZXMgYXJlIGdlbmVyYWwsICpub3QqIG1pcHMtc3BlY2lmaWMuCisKKwlwYXJhbS5oOgorCURpZG4ndCBiZWxpZXZlIGluIGxpdHRsZS1lbmRpYW4gYml0IG9yZGVyLgorCVRoZXJlIGFyZSBzdGlsbCBpbmNvbnNpc3RlbmNpZXMgYWJvdXQgd2hldGhlciBmbGFncworCWxpa2UgQklUU19CSUdfRU5ESUFOIGFyZSBpbnRlZ2VyICgjaWYgLi4uKSBvcgorCWJvb2xlYW4gKCNpZmRlZiAuLi4pLiBJIHRyaWVkIHRvIHBhcGVyIG92ZXIgdGhlbS4KKworCWRieHJlYWQuYyxjb2ZmcmVhZC5jLG1pcHNyZWFkLmMsc3ltdGFiLmMsc3ltdGFiLmg6CisJTW92ZWQgc29tZSBtaXNjX2Z1bmN0aW9uIGNvZGUgdGhhdCB3YXMgY29tbW9uIHRvCisJe2RieCxjb2ZmLG1pcHN9cmVhZC5jIHRvIHN5bXRhYi5jLgorCUluIHRoZSBwcm9jZXNzLCBJIHRoaW5rIEkgY2xlYW5lZCB0aGluZ3MgdXAgYSBiaXQuCisJQXQgdGhlIHNhbWUgdGltZSwgbW92ZWQgb2JzYXZlc3RyaW5nIGFuZCBvYmNvbmNhdCB0byBzeW10YWIuYy4KKworCWRieHJlYWQuYzoKKwlSZW1vdmVkIG9ic29sZXRlIGNvbmRlbnNlX2FkZGxfbWlzY19idW5jaGVzICh1c2UKKwljb25kZW5zZV9taXNjX2J1bmNoZXMoMSkgaW5zdGVhZCkuCisKKwlleGVjLmM6CisJTmVlZGVkIHRvIGluY2x1ZGUgPHN5cy9kaXI+LCBhdCBsZWFzdCBvbiBERUNzdGF0aW9ucy4KKworCXZhbG9wcy5jLCBtaXBzLXRkZXAuYywgdG0tbWlwcy5oOgorCUFkZGVkIFBVU0hfQVJHVU1FTlRTIG1hY3JvIHRvIHN1cHBvcnQgZnVubnkgYXJndW1lbnQtcHVzaGluZworCWNvbnZlbnRpb25zICh3aGVuIFNUQUNLX0FMSUdOIGlzIGluc3VmZmljaWVudCkuCisJTmVlZGVkIG9uIG1pcHMsIHdoZXJlIGRvdWJsZXMgbmVlZCA4LWJ5dGUgYWxpZ25tZW50LAorCWJ1dCBpbnRzIG9ubHkgbmVlZCA0LgorCisJbWlwcy1vcGNvZGUuaDoKKwlSZW1vdmVkIGNydWZ0IHRoYXQgd2FzIG5vdCBiZWluZyB1c2VkLgorCU1lcmdlZCBpbiBtYW55IGZpeGVzIChtb3N0IGZyb20gRnJhbmsgWWVsbGluLCBmeUBsdWNpZC5jb20pLgorCisJbWlwcy1waW5zbi5jOgorCVByaW50ICQgYmVmb3JlIHJlZ2lzdGVyLW5hbWVzIChJIHRoaW5rIHRoYXQgbWFrZXMgdGhpbmdzIGEgbGl0dGxlCisJbW9yZSBjb25zaXN0ZW50KS4KKwlOZXZlciBwcmludCB0d28gaW5zdHJ1Y3Rpb25zLCBldmVuIGlmIG9uZSBkZWxheXMuCisJUmVtb3ZlZCBoZXgtZGlzYXNzZW1ibGUgc2V0X2NtZC4gIChUaGlzIGlzIG5vdCBtaXBzLXNwZWNpZmljLAorCXNvIEkgdGhpbmsgdGhlIGFyZ3VtZW50IGlzIHdoZXRoZXIgaXQgaXMgZ2VuZXJhbGx5IHdvcnRod2hpbGUgb3Igbm90LgorCUknbSBpbmNsaW5lZCB0byB0aGluayBub3QsIGdpdmVuIGhvdyBlYXN5IGl0IGlzIHRvCisJY29udmVydCBiZXR3ZWVuIHJhZGl4ZXMgaW4gZ2RiLikKKworCW1pcHNyZWFkLmM6CisJVGhpcyBpcyBiYXNpY2FsbHkgQWxlc3NhbmRvJ3MgY29kZS4KKwlJdCBkb2Vzbid0IHVzZSBvYnN0YWNrczsgSSBjaGFuZ2VkIGl0IHRvIHVzZSBvYnN0YWNrcworCWluIGEgZmV3IG1pbm9yIHBsYWNlcyB3aGVyZSB1c2luZyBtYWxsb2MgY2F1c2VzIGEKKwltZW1vcnkgbGVhay4gKFByb2JhYmx5LCBtb3JlIHBsYWNlcyBjb3VsZC9zaG91bGQgYmUgY2hhbmdlZC4pCisJSSBhZGRlZCByZWNvcmRfbWlzY19mdW5jdGlvbiB3aGVyZSBpdCB3YXMgbWlzc2luZy4KKwlJbiBzeW1ib2xfZmlsZV9jb21tYW5kIGFuZCBhZGRfZmlsZV9jb21tYW5kLCBJIHRyaWVkCisJdG8gbWFrZSB0aGUgY29kZSBjb25zaXN0ZW50IHdpdGggbW9yZSByZWNlbnQgdmVyc2lvbnMuCisJTWlub3Igc3lsaXN0aWMgY2hhbmdlcyBpbiBwYXJzZV9wcm9jZWR1cmUuCisJTWFrZSBhIC5nZGJpbmZvLiBwc3VlZG8tc3ltYm9sIHBvaW50IGJhY2sgdG8gdGhlIHJlYWwKKwlwcm9jZWR1cmUgc3ltYm9sICh1c2luZyB0aGUgaXN5bSBmaWVsZCkuCisKKwltaXBzLXRkZXAuYzoKKwlUaGlzIGlzIGJhc2ljYWxseSBmcm9tIG15IHBvcnQsIGJ1dCB3aXRoIGEgbG90IG9mIGRldGFpbHMKKwlhbmQgYSBudW1iZXIgb2Ygcm91dGluZXMgbWVyZ2VkIGluIGZyb20gQWxlc3NhbmRvJ3MgdmVyc2lvbi4KKwlJIGJhc2ljYWxseSB1c2VkIG15IGNvZGUgInJhdyIgYmFja3RyYWNlICh1c2UgaGV1cmlzdGljcworCWZyb20gdGhlIGFjdHVhbCBjb2RlLCByYXRoZXIgdGhhbiBzeW1ib2wgdGFibGUgaW5mbykgLSB0aG91Z2gKKwl0aGUgaWRlYSBpcyBBbGVzc2FuZHJvJ3MuIEkgZmVlbCBteSBjb2RlIGlzIGEgbGl0dGxlIGNsZWFuZXIKKwloZXJlLCBwYXJ0aWN1bGFybHkgaW4gYmVpbmcgYSBsaXR0bGUgbW9yZSBmbGV4aWJsZSwgc3VjaCBhcyBiZWluZworCWFibGUgdG8gaGFuZGxlIGdjYy1wcm9kdWNlZCBjb2RlICh3aGljaCBpdCBub3cgY2FuKS4KKwlJdCBhbHNvIGRvZXNuJ3QgZG8gZnJhbWUgY2FjaGluZyAod2hpY2ggaXMgbm90IHVzZWZ1bAorCW1vcmUgcmVjZW50IGdkYiB2ZXJzaW9ucykuCisJSSBhbHNvIHVzZWQgbXkgY29kZSBmb3IgcHVzaF8vcG9wX2R1bW15LCBtb3JlIG9yIGxlc3MuCisJSSB0cmllZCB0byBpbmNvcnBvcmF0ZSBBRidzIGNvZGUgZm9yIHRlc3Rpbmcgc2lndHJhbXAKKwl3aGlsZSBiYWNrdHJhY2luZzsgSSBwcm9iYWJseSBnb3QgaXQgd3JvbmcuCisJQWRkZWQgbWlwc19wcmludF9yZWdpc3Rlciwgd2hpY2ggdHJpZXMgdG8gc2NydW5jaCBhcyBtdWNoCisJaW5mb3JtYXRpb24gYXMgcG9zc2libGUgb24gYSBzY3JlZW4uLi4KKwlSZW1vdmVkIHRoZSBza2lwLXByb2xvZ3VlIHNldF9jbWQuIEFzIHdpdGggaGV4LWRpc2Fzc2VtYmxlIChzZWUKKwl1bmRlciBtaXBzLXBpbnNuLmMpLCBJIGRvbid0IHNlZSBhbnl0aGluZyBtaXBzLXNwZWNpZmljIGhlcmUsCisJYW5kIEkgZG9uJ3Qgc2VlIGl0IGJlaW5nIGFsbCB0aGF0IHVzZWZ1bCBhbnl3YXkuCisJCisJdG0tbWlwcy5oOgorCUFkZGVkIGEgJGZwIHBzdWVkby1yZWcgZGlzdGluY3QgZnJvbSAkZnAgKG5pY2UgZm9yIGdjYykuCisJVXNlIG1vcmUgcmVnaXN0ZXIgbmFtZXMgKHJhdGhlciB0aGFuIGhhcmQtY2FzZXMgbnVtYmVycykuCisJCitUaHUgU2VwICA2IDE4OjMzOjE1IDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQpCisKKwkqIEhhY2sgdXAgMy45MC4xMSBjaGFuZ2VzOgorCisJKiBNYWtlZmlsZS5kaXN0IChkZXBlbmQpOiBwYXJhbWV0ZXJpemUgJChHQ0MpLgorCUFkZCBzb2xpYi5jIGFuZCBzb2xpYi5vLgorCShyZWFkbGluZSk6IEZpeCB2cGF0aCBmb3IgYm90aCBhYnNvbHV0ZSBvciByZWxhdGl2ZSBTUkNESVIuCisKKwkqIGJsb2NrZnJhbWUuYzogRml4IGZyb20gU2NoYWVmZXJAYXNjLnNsYi5jb20gZm9yIHNoYXJlZCBsaWJzLgorCUFsc28sIGxldCB0aGUgcGFydCBJIGRpZG4ndCB1bmRlcnN0YW5kIGF0IGxlYXN0IGNvbXBpbGUgc28KKwlJIGNhbiB0ZXN0IHRoZSByZXN0LiAgRklYTUUuCisKKwkqIGRieHJlYWQuYzogRml4IHRoaW5rbyB1c2luZyBzdHJjbXAuCisJKGluaXRfcHN5bWJvbF9saXN0KTogZGVjbGFyZSBzdGF0aWMuCisJKHBhcnRpYWxfc3ltYm9sX2ZpbGVfb3Blbik6IENvbW1lbnQgY2xlYW51cHMgYmV0dGVyLCBhdm9pZAorCWNsZWFuaW5nIHVwIHRoZSBzdHJpbmcgdGFibGUgc2luY2UgdGhlIGNhbGxlciB3aWxsIGRvIHRoYXQuCisJTW92ZSB0aGUgc3RhdCBmb3IgbW9kIHRpbWUgaW50byBzeW1ib2xfZmlsZV9jb21tYW5kLCB0ZW1wb3JhcmlseS4KKwkoVGhlcmUgc2hvdWxkIGJlIGEgbW9kIHRpbWUgZm9yIGVhY2ggc3ltYm9sIGZpbGUsIGV2ZW50dWFsbHksCisJdG8gY29udHJvbCBpdHMgcmVyZWFkaW5nLiAgRklYTUUuKQorCisJKiBpbmZwdHJhY2UuYyAoUFRfV1JJVEVfRCk6IHVzZSBzYW1lIHZhbHVlIGFzIFBUX1dSSVRFX0kgZm9yCisJU3VuT1MsIHdoaWNoIGdpdmVzIGVycm9yIGZvciBzaGFyZWQgbGlicyBvdGhlcndpc2UuICAoRnJvbQorCVNjaGFlZmVyLCBwcm9iYWJseSBGSVhNRSBuZWVkcyB3b3JrIGZvciBwb3J0YWJpbGl0eS4pCisKKwkqIHNvbGliLmM6ICBNb3ZlICNpbmNsdWRlICJwYXJhbS5oIiB0byB3b3JrLgorCUxvd2VyY2FzZSBhbGwgdGhlIFVwcGVyY2FzZSBMZXR0ZXJzIEluIHRoZSBNZXNzYWdlcy4KKwkoZmluZF9zb2xpYik6IENsZWFuIHVwIGluZmVyaW9yX3NvX25hbWUgZm9yIGRlYnVnIHByaW50b3V0cy4KKwlBbGxvdyBubyBhcmd1bWVudCwgdG8gbWVhbiBhbGwgc2hhcmVkIGxpYnJhcmllcy4KKworCSogc3ltbWlzYy5jOiBpbmNsdWRlIHBhcmFtLmggdG8gZ2V0IENMRUFSX1NPTElCLgkKKworV2VkIFNlcCAgNSAxODowMDowOCAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQorCisJKiBNZXJnZSBpbiBLaW5nZG9uJ3MgY2hhbmdlcyBmcm9tIEZTRjogdGhlIGRpZmZzIGZyb20gMy45MC45CisJICB0byAzLjkwLjExLiAgQ2hhbmdlTG9nIGVudHJpZXMgYmVsb3cgYXJlIGZyb20gdGhpcy4KKworV2VkIEp1biAxMyAwOToxNzozOSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgbW9sZS5haS5taXQuZWR1KQorCisJKiBWZXJzaW9uIDMuOTAuMTEuCisKKwkqIE1ha2VmaWxlLmRpc3QgKEhGSUxFUyk6IEFkZCB0bS1zdW5vcy5oLgorCitUdWUgSnVuIDEyIDE2OjE1OjI2IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIFZlcnNpb24gMy45MC4xMC4KKworCSogTWFrZWZpbGUuZGlzdCAoZ2RiLnRhci5aKTogQ2hhbmdlIGxpbmtpbmcgb2YgY29uZmlnIHNvIGl0IHdvcmtzLgorCitUaHUgSnVuICA3IDE2OjIyOjI3IEVEVCAxOTkwICBKYXkgRmVubGFzb24gKGhhY2tAYWkubWl0LmVkdSkKKworCSogc3BhcmMtb3Bjb2RlLmggIEFkZGVkIHNpbmdsZS1vcGVyYW5kIHZlcnNpb24gb2YgcmV0dC4KKworTW9uIEp1biAgNCAxODoxMjozMSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiBtLXNwYXJjLmggKFJFR19TVFJVQ1RfSEFTX0FERFIsIFNUUlVDVF9BUkdfU1lNX0dBUkJBR0UpOgorCVB1dCBwYXJlbnMgYXJvdW5kIGdjY19wIGluIGV4cGFuc2lvbi4KKworVGh1IE1heSAyNCAxNTo0NDo1MSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgbW9sZS5haS5taXQuZWR1KQorCisJKiB1dGlscy5jIChsaW5lc190b19saXN0KTogUmV0dXJuIDEwIGlmIGxpbmVzX3Blcl9wYWdlID09IDAuCisKK1dlZCBNYXkgMjMgMTY6MzY6MDQgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogQ2hhbmdlcyBmb3IgU3VuIHNoYXJlZCBsaWJyYXJpZXM6CisJYmxvY2tmcmFtZS5jIChmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24pOiBJZiBhIG5vbi10ZXh0IHN5bWJvbAorCWlzIGZvdW5kLCBzZXQgKmFkZHJlc3MgPSBwYyAtIEZVTkNUSU9OX1NUQVJUX09GRlNFVC4KKwlicmVha3BvaW50LmMgKGluc2VydF9icmVha3BvaW50cykgW0RJU0FCTEVfVU5TRVRUQUJMRV9CUkVBS106CisJRGlzYWJsZSBicmVha3BvaW50cyBpbnN0ZWFkIG9mIGdpdmluZyBhbiBlcnJvci4KKwlzb3VyY2UuYyAoc2VsZWN0X3NvdXJjZV9zeW10YWIpOiBJbml0aWFsaXplIGNzX3BzdC4KKwlzeW1taXNjLmM6IENhbGwgQ0xFQVJfU09MSUIgaWYgZGVmaW5lZC4KKwlzeW10YWIuaDogTWFrZSB0ZXh0e2xvdyxoaWdofSBDT1JFX0FERFIgbm90IGludC4KKwkocHN5bXRhYik6IE5ldyBmaWVsZCBhZGRyLgorCXNvbGliLmM6IE5ldyBmaWxlLgorCWRieHJlYWQuYzogTW92ZSBERUNMQVJFX0ZJTEVfSEVBREVSUyBvdXRzaWRlIGZ1bmN0aW9ucy4KKwkocmVjb3JkX21pc2NfZnVuY3Rpb24pOiBHaXZlIGNvcnJlY3QgdHlwZSBmb3IgTl9EQVRBIHN5bWJvbHMuCisJKGNvbmRlbnNlX21pc2NfYnVuY2hlcyk6IGRvICJtaXNjX2Z1bmN0aW9uX2NvdW50ID0gaiIgcmVnYXJkbGVzcworCW9mIGluY2xpbmsuCisJVGFrZSBjb2RlIHdoaWNoIGlzIHNoYXJlZCBiZXR3ZWVuIHN5bWJvbF9maWxlX2NvbW1hbmQgYW5kCisJYWRkX2ZpbGVfY29tbWFuZCBhbmQgcHV0IGl0IGludG8gcGFydGlhbF9zeW1ib2xfZmlsZV97b3BlbixyZWFkfS4KKwlTcGxpdCBhZGRfZmlsZV9jb21tYW5kIGludG8gYWRkX2ZpbGVfY29tbWFuZCBhbmQgYWRkX2ZpbGUuCisJTWFrZSBwc3ltdGFiX3RvX3N5bXRhYiByZWFkIGluIHRoZSBzdHJpbmcgdGFibGUgaWYgdGhlIGZpbGUKKwlpcyBub3Qgc3ltZmlsZS4KKwlUd28gbmV3IHBhcmFtZXRlcnMgdG8gcmVhZF9kYnhfc3ltdGFiIGFuZCBzdGFydF9wc3ltdGFiLgorCXRtLXN1bm9zLmg6IE5ldyBmaWxlLgorCitUdWUgTWF5IDIyIDE3OjQzOjAzIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIGluZmNtZC5jOiBDaGFuZ2UgY29udF9jb21tYW5kIHRvIGNvbnRpbnVlX2NvbW1hbmQgYW5kICJjb250IgorCXRvICJjb250aW51ZSIuCisKK01vbiBNYXkgMjEgMTQ6NDE6NDEgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogYnJlYWtwb2ludC5jIChlbmFibGVfYnJlYWtwb2ludCk6IEdldCB2YWx1ZSBvZiB3YXRjaHBvaW50LgorCisJKiBkZWZzLmggW3NwYXJjXTogVXNlIDxhbGxvY2EuaD4gcmVnYXJkbGVzcyBvZiBfX0dOVUNfXy4KKworCSogdmFsdWVzLmMgKFVTRV9TVFJVQ1RfQ09OVkVOVElPTik6IENoZWNrIGZvciBzdHJ1Y3R1cmVzIG9mCisJc2l6ZSAxLDIsNCw4IHJhdGhlciB0aGFuIHNpemUgPCA4LgorCisJKiBkYnhyZWFkLmMgKGRieF9sb29rdXBfdHlwZSk6IERvIGYtPmxlbmd0aCAqPSAyIGFzIG1hbnkgdGltZXMKKwlhcyBuZWNlc3NhcnksIG5vdCBqdXN0IG9uY2UuCisKKwkqIHNwYXJjLW9wY29kZS5oOiBBZGQgYSBidW5jaCBvZiBuZXcgb3Bjb2RlcyB3aGljaCBTdW4gYXMgc3VwcG9ydHMuCisKK1RodSBNYXkgMTcgMTU6MDQ6MDkgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSoge3QseH1tLXN1bjM4Ni5oLCBzdW4zODYteGRlcC5jLCB7eCx0fWNvbmZpZy9zdW4zODYKKworCSogdG0tbmV3cy5oOiBBZGQgQ0FMTF9EVU1NWV8qLgorCisJKiB0bS02OGsuaDogUmVtb3ZlIGR1cGxpY2F0ZSBjb21tZW50IGF0IEZSQU1FX0ZJTkRfU0FWRURfUkVHUy4KKworCSogY29uZmlnLmdkYjogSW4gbGlzdF9ob3N0LCBsaXN0X3RhcmdldCwgdXNlICR7aX0sIG5vdCAkaS4KKworVHVlIE1heSAxNSAyMToyNzoxMiAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiBzb3VyY2UuYyAoZmluZF9zb3VyY2VfbGluZXMpIFtCUk9LRU5fTEFSR0VfQUxMT0NBXTogVXNlIHhtYWxsb2MuCisKKwkqIHNwYXJjLW9wY29kZS5oOiBDaGFuZ2UgYWxsIHN0b3JlIGZsb2F0aW5nLXBvaW50IHN0YXRlIHJlZ2lzdGVyCisJaW5zdHJ1Y3Rpb25zIHRvIGhhdmUgdGhlIHJpZ2h0IG1hdGNoICYgbG9zZSBmaWVsZHMuCisKK1NhdCBNYXkgIDUgMTI6Mzk6MTggMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogTWFrZWZpbGUuZGlzdDogTW92ZSAtSSR7c3JjZGlyfSB0byBHTE9CQUxfQ0ZMQUdTIGFuZCBwYXNzCisJVlBBVEggdG8gcmVhZGxpbmUuCisJY29uZmlnLmdkYjogSWYgc3JjZGlyICE9IC4sIGNyZWF0ZSByZWFkbGluZSBkaXJlY3RvcnkgYW5kCisJY29weSBhIG1ha2VmaWxlIGludG8gaXQuCisKKwkqIHdhaXQuaCwgaW5mcnVuLmM6IENoYW5nZSBXUkVUQ09ERSB0byBXRVhJVFNUQVRVUyBmb3IKKwljb25zaXN0ZW5jeSB3aXRoIFBPU0lYLgorCisJKiBicmVha3BvaW50LmMgKGJwc3RhdF9zdG9wX3N0YXR1cyk6IERpc2FibGUgd2F0Y2hwb2ludAorCXdoZW4gd2UgZXhpdCBpdHMgZXhwX3ZhbGlkX2Jsb2NrLgorCitUdWUgU2VwICA0IDExOjQ2OjQ2IDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQpCisKKwkqIE1ha2VmaWxlLmRpc3Q6IEJ1bXAgdmVyc2lvbiB0byAzLjkxLjMuCisKKwkqIENsZWFuIHVwIGhhbmRsaW5nIG9mIGJyZWFrcG9pbnQgY29tbWFuZHMgKHNvbWV3aGF0KS4KKwkgIFByb21wdGVkIGJ5IFRpZW1hbm4gYnVnIHJlcG9ydCAiY29udCAxMCIgZG9lc24ndCB3b3JrIGFueSBtb3JlLgorCisJICBpbmZlcmlvci5oOiBBZGQgYnJlYWtwb2ludF9wcm9jZWVkZWQgdG8gaW5mZXJpb3Igc3RhdHVzIHN0cnVjdAorCSAgYW5kIGdsb2JhbHM7IHNhdmUgaXQgYW5kIHJlc3RvcmUgaXQuCisJICAoY2xlYXJfYnJlYWtwb2ludF9jb21tYW5kcyk6IENsZWFudXAsIHJlbW92ZSBvbGQgI2RlZmluZS4KKworCSAgaW5mcnVuLmMgKGNsZWFyX3Byb2NlZWRfc3RhdHVzKTogU2V0IGJyZWFrcG9pbnRfcHJvY2VlZGVkLgorCSAgKHNhdmVfaW5mZXJpb3Jfc3RhdHVzLCByZXN0b3JlX2luZmVyaW9yX3N0YXR1cyk6IGhhbmRsZSBpdCBhbHNvLgorCSAgKHByb2NlZWQpOiBSZW1vdmUgZWFybGllciBjb2RlIHRoYXQgc2V0IGJyZWFrcG9pbnRfcHJvY2VlZGVkLgorCSAgSXQgaXMgbm93IHNldCBvbmx5IGluIGNsZWFyX3Byb2NlZWRfc3RhdHVzLgorCSAgKGNsZWFyX3Byb2NlZWRfc3RhdHVzKTogQ2xlYW51cCwgdXNlIGJwc3RhdF9jbGVhciByYXRoZXIKKwkgIHRoYW4gY2xlYXJfYnJlYWtwb2ludF9jb21tYW5kcy4gIE5vIGNhbGxlcnMgbmVlZCB0aGUgc3RvcF9icHN0YXQKKwkgIGJldHdlZW4gY2xlYXJfcHJvY2VlZF9zdGF0dXMgYW5kIHByb2NlZWQuCisKKwkgIGluZmNtZC5jOiBBZGQgYnJlYWtwb2ludF9wcm9jZWVkZWQgZGVmaW5pdGlvbiBhbmQgY29tbWVudC4KKwkgIChjb250X2NvbW1hbmQsIGp1bXBfY29tbWFuZCwgc2lnbmFsX2NvbW1hbmQpOiBNb3ZlIGNhbGwgdG8KKwkgIGNsZWFyX3Byb2NlZWRfc3RhdHVzIHJpZ2h0IG5leHQgdG8gY2FsbCB0byBwcm9jZWVkLgorCisJICBicmVha3BvaW50LmMgKGJwc3RhdF9kb19hY3Rpb25zKTogQXZvaWQgY2xvYmJlcmluZyBvdXIKKwkgIGNhbGxlcidzIGFyZ3VtZW50IHdoaWxlIHJ1bm5pbmcgZG93biB0aGUgY2hhaW4gb2YgYnJlYWtwb2ludHMuCisJICBVc2UgbmV3IHZhcmlhYmxlICJicmVha3BvaW50X3Byb2NlZWRlZCIgdG8gZGV0ZXJtaW5lIHdoZW4KKwkgIGEgY29tbWFuZCB0aGF0IGl0IGV4ZWN1dGVzIG1vdmVzIHRoZSBpbmZlcmlvciBwYXN0IHRoZQorCSAgYnJlYWtwb2ludC4KKwkgIChicHN0YXRfY2xlYXIpOiBIYW5kbGUgTlVMTCBhcmd1bWVudC4KKwkgIChicHN0YXRfY2xlYXJfYWN0aW9ucyk6IEF2b2lkIHVzZWxlc3MgY2FsbCB0bworCSAgYnJlYWtwb2ludF9hdXRvX2RlbGV0ZS4KKwkgIChkZWxldGVfYnJlYWtwb2ludCk6ICBDbGVhbiB1cCBicHN0YXQncyB0aGF0IGFyZSBwb2ludGluZyB0bworCSAgdGhlIGRlbGV0ZWQgYnJlYWtwb2ludCBmcm9tIHRoZSBzdG9wX2Jwc3RhdCBjaGFpbi4KKwkgIChicmVha3BvaW50X2F1dG9fZGVsZXRlKTogU2ltcGxpZnkuCisKKwkqIENsZWFuIHVwIGhhbmRsaW5nIG9mIEVPRiwgZXJyb3Igb24gc3RkaW4sIGV0Yy4gIFRoaXMgd2FzCisJICBwcm9tcHRlZCBieSBhIG5ldHdvcmsgcHJvYmxlbSB0aGF0IGNhdXNlZCBnZGIgdG8gZ28gaW50byBhbgorCSAgaW5maW5pdGUgbG9vcCBmaWxsaW5nIHVwIGl0cyBtYWxsb2MnZCBtZW1vcnkuCisKKwkgIG1haW4uYyAocmV0dXJuX3RvX3RvcF9sZXZlbCk6IENsZWFudXA6IGNhbGwgYnBzdGF0X2NsZWFyX2FjdGlvbnMsCisJICBub3QgY2xlYXJfYnJlYWtwb2ludHNfY29tbWFuZHMsIHdoaWNoIGlzIG5vdyBnb25lLgorCSAgKG1haW4pOiBJZiBjb21tYW5kX2xvb3AgcmV0dXJucyAoZS5nLiBmcm9tIEVPRiBvbiBzdGRpbiksIGRvCisJICBhIHF1aXRfY29tbWFuZCAobG9vcGluZyBiYWNrIHRvIGNvbW1hbmRfbG9vcCBpZiBxdWl0X2NvbW1hbmQKKwkgIGRvZXNuJ3QgcmVhbGx5IHF1aXQpLgorCSAgKGNvbW1hbmRfbG9vcCk6IGNoZWNrIHJlc3VsdCBmcm9tIGNvbW1hbmRfbGluZV9pbnB1dCBhbmQKKwkgIGV4aXQgaWYgaXQgcmV0dXJucyBOVUxMLCByYXRoZXIgdGhhbiBwYXNzaW5nIHRoZSBOVUxMIHRvCisJICBleGVjdXRlX2NvbW1hbmQuCisJICAoZ2RiX3JlYWRsaW5lKTogIEZyZWUgbWFsbG9jJ2QgcmVzdWx0IHNwYWNlIGJlZm9yZSByZXR1cm5pbmcKKwkgIE5VTEwgZm9yIEVPRi4KKworCSogdXRpbHMuYyAocXVlcnkpOiBIYW5kbGUgQy1kIHRvIG1lYW4gInllcyIsIGp1c3QgYXMgaWYgdGhlCisJICBpbnB1dCB3YXMgbm90IGEgdGVybWluYWwuICBBbHNvIGF2b2lkIGluZmluaXRlIGxvb3AgaWYgRU9GCisJICBvY2N1cnMgaW4gbWlkLWlucHV0LWxpbmUgYmVmb3JlIG5ld2xpbmUuICBUaGlzIGFsbG93cworCSAgcXVlcnkgdG8gYmUgdXNlZCBhdCBFT0Ygb24gc3RkaW4gd2l0aCByZWFzb25hYmxlIHJlc3VsdHMuCisKKwkqIGluZnJ1bi5jIChwcm9jZWVkKTogU2V0IGJyZWFrcG9pbnRfcHJvY2VlZGVkLgorCisJKiB2YWx1ZXMuYyAodmFsdWVfYXNfbG9uZyk6IEF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiBmb3IgZW51bXMuCisJICAoX2luaXRpYWxpemVfdmFsdWVzKTogRml4IHR5cG8gaW4gaGVscCBtc2cgKGtpbmdkb24pLgorCisJKiBNYWtlZmlsZS5kaXN0IChSTF9MSUIpOiBVc2UgUkxfTElCX0RFUCBmb3IgZGVwZW5kZW5jaWVzLAorCSAgUkxfTElCIGZvciBsaW5raW5nLiAgVGhpcyBhbGxvd3MgLWxyZWFkbGluZSBmb3IgbGlua2luZworCSAgYW5kIG5vdGhpbmcgZm9yIGRlcGVuZGVuY2llcywgb25jZSByZWFkbGluZSBpcyBhIHJlYWwgbGlicmFyeS4KKworCSogY29uZmlnLmdkYjogSmltIEtpbmdkb246IGdpdmUgdXNlZnVsIGVycm9yIG1lc3NhZ2UgaWYgdGhlCisJICBob3N0IG9yIHRhcmdldCB0eXBlIGlzIG5vdCByZWNvZ25pemVkLgorCisJKiBkZWZzLmggKGFsbG9jYSk6IFNQQVJDIDxhbGxvY2EuaD4gZG9lcyBub3QgZGVjbGFyZSBhbGxvY2EsCisJICBpdCBqdXN0IGRlZmluZXMgaXQuICBEdW1iLCBidXQgZGVhbCB3aXRoIGl0LgorCisJKiBKaW0gS2luZ2RvbiBzdWdnZXN0czoKKwkgIGluIHhjb25maWcvc3VuM29zNCwgQ0ZMQUdTIHNob3VsZCBiZSBYTV9DRkxBR1MuCisKK1dlZCBBdWcgMjkgMTg6MDM6MjcgMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludCkKKworCSogTWFrZWZpbGUuZGlzdCAoVkVSU0lPTik6IEJ1bXAgdmVyc2lvbiAjIHRvIDMuOTEuMi4KKworCSogQ2xlYW4gdXAgQm90aG5lcidzIGNoYW5nZXMuCisKKwkqIGJsb2NrZnJhbWUuYyAoY2xlYXJfcGNfZnVuY3Rpb25fY2FjaGUpOiBOZXcgZnVuY3Rpb24uCisJKiBibG9ja2ZyYW1lLmM6IHJlbWFrZSBjYWNoZV9wY19mdW5jdGlvbl8qIHN0YXRpYy4KKwkqIGRieHJlYWQuYyAoc3ltYm9sX2ZpbGVfY29tbWFuZCk6IHJlbW92ZSByZWZlcmVuY2VzIHRvCisJCSAgICBjYWNoZV9wY19mdW5jdGlvbl8qIHZhcmlhYmxlcy4KKwkqIGRieHJlYWQuYyAocmVhZF9zdHJ1Y3RfdHlwZSk6IFVzZSBWT0ZGU0VUX1NUQVRJQy4KKwkqIHByaW50Y21kLmM6IEF2b2lkIGtsdWRnaW5nIGEgZ2xvYmFsIHZhcmlhYmxlIChhZGRyZXNzcHJpbnQpCisJICB0byBhdm9pZCBwcmludGluZyB0aGUgYWRkcmVzcyBvZiBhIHN0cmluZyB0d2ljZS4gIEluc3RlYWQsCisJICBwYXNzIHRoZSBmb3JtYXQgbGV0dGVyICdzJyBkb3duIGxvdyBlbm91Z2ggdGhhdCBpdCBjYW4gYmUgc2VlbgorCSAgdG8gYXZvaWQgdGhpcyBwcm9ibGVtLgorCSAgKHByaW50X2Zvcm1hdHRlZCk6IFBhc3MgZm9ybWF0IGFyZyB0byB2YWx1ZV9wcmludC4KKwkgIChyZXN0b3JlX2FkZHJlc3NwcmludCk6IFJlbW92ZSBmdW5jdGlvbi4KKwkgIChkb19leGFtaW5lKTogIEF2b2lkIGhhY2tpbmcgYWRkcmVzc3ByaW50LCBjbGVhbnVwcyBhbmQgc3VjaC4KKwkgIChwcmludF9mcmFtZV9hcmdzKTogIEFkZCBhIGNvbW1lbnQgdG8gYSBCb3RobmVyIGNoYW5nZS4KKwkqIHN5bXRhYi5oOiBkZWZpbmUgVk9GRlNFVF9TVEFUSUMgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mICItMSIuCisJKiBzeW1taXNjLmMgKGZyZWVfYWxsX3N5bXRhYnMpOiBDYWxsIGNsZWFyX3BjX2Z1bmN0aW9uX2NhY2hlCisJICB0byB3aXBlIG91dCB0aGUgdmFsdWVzIGNhY2hlZCBpbiBibG9ja2ZyYW1lLmMuCisJKiBzeW10YWIuYyAoZmluZF9tZXRob2QpOiBBZGQgY29tbWVudCBzYXlpbmcgaG93IGJpZyB5b3UgbXVzdAorCSAgYWxsb2NhdGUgdG8gYmUgImJpZyBlbm91Z2giLiAgUGVyIGJlaW5nIHRlcnNlIGFnYWluLgorCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogSGFuZGxlIGZvcm1hdCBsZXR0ZXIgInMiIHRvIHByaW50CisJICBzdHJpbmdzIHdpdGhvdXQgYWRkcmVzc2VzLiAgQWRkIGNvbW1lbnQgdG8gdnRibCBwcmludGluZyBjb2RlCisJICB3aGljaCBjYXN0cyB3aXRoIHdpbGQgYWJhbmRvbi4gIFJlYXJyYW5nZSByZWZlcmVuY2UtcHJpbnRpbmcKKwkgIGNvZGUgc28gaXQgcHJpbnRzOgorCSAgICAgICBAMHhhZGRyOiB2YWx1ZQkJKHByaW50IHcvYWRkcmVzc3ByaW50KQorCSAgICAgICB2YWx1ZQkJCShwcmludCB3L35hZGRyZXNzcHJpbnQpCisJICAgICAgIEAweGFkZHIJCQkocGFyYW1ldGVyIGxpc3RzIHcvYWRkcmVzc3ByaW50KQorCSAgb3IgICBub3RoaW5nCQkJKHBhcmFtZXRlciBsaXN0cyB3L28gYWRkcmVzc3ByaW50KQorCitUdWUgQXVnIDI4IDEwOjQ3OjE4IDE5OTAgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQpCisKKwkqIE1lcmdlIG1vcmUgY2hhbmdlcyBmcm9tIFBlciBCb3RobmVyOgorCitHZGIncyBoYW5kbGluZyBvZiBUWVBFX0NPREVfUkVGIHdhcyBzbyBjb3VudGVyLUMrKyAoYW5kIG90aGVyd2lzZQorYW5ub3lpbmcpIHRoYXQgSSB0cmllZCB0byBpbXByb3ZlIGl0LiBIZXJlIGFyZSBteSBzdWdnZXN0aW9ucy4KKworCVRoZXNlIHBhdGNoZXMgYWxsIGF0dGVtcHQgdG8gaGFuZGxlIFRZUEVfQ09ERV9SRUYgKGFzIGluIEMrKykgYmV0dGVyLgorCisJZmluZHZhci5jOgorCURvIGF1dG9tYXRpYyBkZS1yZWZlcmVuY2Ugd2hlbiB0YWtpbmcgdGhlIGFkZHJlc3Mgb2YgYSByZWZlcmVuY2UuCisJcHJpbnRjbWQuYzoKKwlEb24ndCBkZXJlZl9yZWYgd2hlbiBwcmludGluZyBwYXJhbWV0ZXIgbGlzdHMuCisJdmFsb3BzLmM6CisJTW9yZSBhdHRlbXB0cyBhdCB0cmVhdGluZyByZWZlcm5lbmNlcyBwcm9wZXJseS4KKwl2YWxwcmludC5jOgorCUluIHZhbF9wcmludCwgaWYgZGVyZWZfcmVmPT0wLCBkb24ndCBwcmludCBkYW5nbGluZyAiID0gIi4KKwl2YWx1ZS5oOgorCUFkZCBDT0VSQ0VfUkVGIG1hY3JvLCB3aGljaCBkZS1yZWZlcmVuY2VzIGFuIFJFRi4KKworCSogTWVyZ2UgY2hhbmdlcyBmcm9tIFBlciBCb3RobmVyOgorCisqIEZpeGVkIChTb255IG5ld3MpLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gcHJvYmxlbXMuCisqIEZpeGVkIG90aGVyIHByb2JsZW1zIHdpdGggdXNpbmcgdmFuaWxsYSBwY2MgYW5kIGxpYmMgKGVudW0gcHJvYmxlbXM7Cithc3N1bXB0aW9uIHRoYXQgdnNwcmludGYgZXhpc3RzKS4KKyogU29tZSBtYWpvciBzcGVlZC11cHMgKGZpbmNfcGNfcGFydGlhbF9mdW5jdGlvbiBub3cgY2FjaGVzIGEgbWF0Y2g7CitwYXJzaW5nIGF2b2lkcyBkdXBsaWNhdGUgc3ltYm9sX2xvb2t1cCBjYWxscykuCisqIENoYW5nZWQgaGFuZGxpbmcgb2YgYmFzZWNsYXNzZXMgKG5vIGxvbmdlciB1c2UgYmFzZWNsYXNzZXMgZmllbGQKK29mIHN0cnVjdCB0eXBlLCB1c2UgdGhlIGZpcnN0IG5fYmFzZWNsYXNzZXMgZmllbGRzIGluc3RlYWQpLgorKiBWYXJpb3VzIG1pbm9yIGNoYW5nZXMvZml4ZXMsIG1vc3QgQysrLXJlbGF0ZWQuCisKK2Jsb2NrZnJhbWUuYzoKK0NhY2hlIHRoZSBtb3N0IHByZXZpb3VzIG1hdGNoIGZyb20gZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uLgorKFNhdmUgYm90aCBsb3cgYW5kIGhpZ2ggZW5kcyBvZiBtYXRjaGluZyBmdW5jdGlvbidzIHBjIHJhbmdlLikKK1RoaXMgc3BlZWRzIHVwIHRoZSBsb29wIG9mIGluZnJ1bi5jOndhaXRfZm9yX2luZmVyaW9yIHF1aXRlCithIGJpdCwgYW5kIG1ha2VzIHN0ZXAvbmV4dCBjb21tYW5kcyBtdWNoIHppcHBpZXIuCitjb21tYW5kLmM6CitBZGRlZCBhbiBlbnVtLT5pbnQgY2FzdCAob3RoZXJ3aXNlLCBzb21lIGNvbXBpbGVycyBiYXJmKS4KK2RieHJlYWQuYzoKK05vIGxvbmdlciBzZXQgYmFzZWNsYXNzIG9mZnNldCB0byAwLCBzaW5jZSBtdWx0aXBsZQoraW5oZXJpdGFuY2Ugbm93IG1vc3RseSB3b3Jrcy4KK0FkZGVkIGEgbnVtYmVyIG9mIGNhc3RzLCB0byBzaHV0IHVwIGNvbXBpbGVyIHdhcm5pbmdzCisoYWZ0ZXIgc3RhYnMgd2hlcmUgbWFkZSBlbnVtcywgbm90IGludHMpLgorV2hlbiBkaXNjYXJkaW5nIGEgc3ltYm9sIHRhYmxlIChpbiBzeW1ib2xfZmlsZV9jb21tYW5kKSwKK211c3QgY2xlYXIgdGhlIGNhY2hlIGludHJvZHVjZWQgaW4gYmxvY2tmcmFtZS5jLgorRG9uJ3QgY29udmVydCAkdnRibF9wdHJfdHlwZSB0byB2dGJsIGFueSBtb3JlLgorR2V0IHJpZCBvZiBUWVBFX0JBU0VDTEFTRUVTIGFuZCAgYmFzZWNsYXNzX3ZlYyAoc2VlIGFsc28gc3ltdGFiLmgpLgorTWFzayBvZmYgc2lnbiBiaXQgZW1pdHRlZCBieSBnKysgZm9yIHZpcnR1YWwgdGFibGUgb2Zmc2V0LgorU2V0IHZvZmZzZXQgdG8gLTEgKG5vdCAxKSBmb3Igc3RhdGljIG1lbWJlciBmdW5jdGlvbnMuCitleHByZWFkLnk6CitDaGFuZ2VkIHBhcnNpbmcvbGV4aW5nIG9mIG5hbWVzIHRvIGF2b2lkIGRvaW5nIHN5bWJvbCBsb29rdXAgdHdpY2UKKyhvbmNlIHdoZW4gbGV4aW5nIHRvIGRldGVybWluZSBzeW1ib2wgY2xhc3MsIG9uY2UgZm9yIHJlYWwpLgorTm93IG9ubHkgY2FsbCBzeW1ib2xfbG9va3VwIG9uY2UuIEZpZWxkcyBvZiAndGhpcycgd2luIGVzcGVjaWFsbHkgYmlnLgorcHJpbnRjbWQuYzoKK1N1YnByZXNzIHByaW50aW5nIGFkZHIgdHdpY2UgaW4gdGhlIGNhc2Ugb2YgJ3gvcyBhZGRyJy4KK3N5bXRhYi5jOgorbG9va3VwX2Jhc2V0eXBlX3R5cGUgaXMgbm8gbG9uZ2VyIHVzZWQuCitBZGQgZmluZF9tZXRob2RzIGFzIHJlY3Vyc2l2ZSBoZWxwZXIgZnVuY3Rpb24gdG8gZGVjb2RlX2xpbmVfMS4KK1RoaXMgYWxsb3dzIG11bHRpcGxlIGluaGVyaXRhbmNlIHRvIHdvcmsuCitBbHNvLCBvbmNlIG9uZSBvciBtb3JlIG1hdGNoZXMgaGFzIGJlZW4gZm91bmQsIGRvIG5vdCBsb29rIGluCitiYXNlLWNsYXNzZXMuIChCYXNlY2xhc3MgbWV0aG9kcyB3b3VsZCBiZSBvdmVycmlkZGVuLCBhbnl3YXkuKQorc3ltdGFiLmg6CitSZW1vdmVkIGJhc2VjbGFzc2VzIGFycmF5IGluIHN0cnVjdCB0eXBlLgorSW5zdGVhZCBvZiB1c2luZyBiYXNlY2xhc3Nlc1tpXSwgdXNlIGZpZWxkc1tpLTFdLgorQWRkZWQgdmlydHVhbF9maWVsZF9iaXRzW2ldIHRvIGluZGljYXRlIGlmIHRoZSBpJ3RoIGJhc2VjbGFzcyBpcyB2aXJ0dWFsLgorQ2hhbmdlZCBzaWduIGNvbnZlbnRpb24gb2Ygdm9mZnNldCAocHJldmlvdXMgd2FzIGluY29uc2lzdGVudCkuCit0bS1uZXdzLmg6CitTb21lIG1hY3JvcyAoQ0FMTF9EVU1NWSBhbmQgcmVsYXRpdmVzKSB3ZXJlIG1pc3NpbmcuIFB1dCB0aGVtIGJhY2suCit1dGlscy5jOgorVXNlZCB0byBhc3N1bWUgZXhpc3RlbmNlIG9mIHZzcHJpbnRmLiBSZS13cml0dGVuIHRvIG5vdCBuZWVkIGl0CitpZiBIQVZFX1ZQUklOVEYgaXMgdW5kZWZpbmVkLgordmFsb3BzLmM6Cit0eXBlY21wIHdhcyB0b28gcGVzc2ltaXN0aWMuIE1hZGUgaXQgbGVzcyBzby4KK3ZhbHByaW50LmM6CitEb24ndCBwcmludCBzcGFjZSBhZnRlciBhZGRyZXNzLgorSWYgdnRhYmxlIHBvaW50cyB0byBhIG1pc2Mgc3ltYm9sICh3aXRoIDAgb2Zmc2V0KSwgcHJpbnQgaXQsCitzaW5jZSB0aGF0IGluZGljYXRlcyB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QuCitDaGFuZ2VkIHlwZV9wcmludF9kZXJpdmF0aW9uX2luZm8gdG8gdXNlIG5ldyBpbmhlcml0YW5jZQorc2NoZW1lICh3aXRob3V0IGJhc2VjbGFzc2VzIHZlY3RvcikuCit2YWx1ZXMuYzoKK0luIHZhbHVlX3ByaW1pdGl2ZV9maWVsZCwgZml4ZWQgc29tZSBidWdzIGxlZnQgb3ZlciBmcm9tIHByZXZpb3VzIHNldCBvZiBmaXhlcy4KK0Fsc28sIGNoYW5nZXMgbmVlZGVkIGJlY2F1c2UgVFlQRV9CQVNFQ0xBU1NFUyB3ZXJlIHJlbW92ZWQuCit4bS1uZXdzLmg6CitSRUdJU1RFUl9VX0FERFIgZGlkbid0IHdvcmsgZm9yIFBDLiBSZXdyb3RlIHRvIHVzZSBhbiBhcnJheS4KKworVHVlIEF1ZyAyMSAyMDowODo1NCAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQorCisJKiBzb3VyY2UuYzoKKyAgSWYgdGhlcmUgaXMgbm8gcGF0aCBzZXQsIGFuZCB0aGUgc3ltYm9scyBkb24ndCBpbmRpY2F0ZSB3aGF0IGRpcmVjdG9yeQorICBhIGZpbGUgd2FzIGNvbXBpbGVkIGluLCBsb29rIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIEJ1dCBlaXRoZXIKKyAgYSBwYXRoIG9yIGEga25vd24gY29tcGlsYXRpb24gZGlyZWN0b3J5IHdpbGwgcHJldmVudCB0aGlzLgorCisJKiBkYnhyZWFkLmM6CisgIFRocmVlIGluZGVwZW5kZW50IGJ1ZyBmaXhlczoKKyAgICogUmVtb3ZlIHRoZSAjaWYgMCBibG9jayB0aGF0IGJyZWFrcyBzb21lIHN0dWZmLgorICAgKiBTdW5PUyA0LjEgZml4ZWQgdGhlIHByb21vdGVkLXBhcmFtZXRlci13cm9uZy1hZGRyIGJ1ZyBpbiBTdW4gQzsKKyAgICAgYWRhcHQgZ2RiIHRvIGVpdGhlciBTdW5PUyA0LjAuKiBvciA0LjEuCisgICAqIE1BWF9PRl9UWVBFIGFuZCBNSU5fT0ZfVFlQRSB0aGlua28uICBCeSB0ZWRnQHN1biwgSSB0aGluay4KKyAKKwkqIHN5bXRhYi5jOgorICBJbnN0YW50aWF0ZSB0aGUgY2xhc3MgVCB3aGVuIGxvb2tpbmcgZm9yIG1ldGhvZHMgaW4gaXQuICAoVGllbWFubkBzdW4pCisKKwkqIHZhbHByaW50LmM6CisgICh0eXBlX3ByaW50KSBEZW1hbmdsZSB0aGUgbmFtZSBiZWluZyBwcmludGVkLgorICAodHlwZV9wcmludF9iYXNlKSBIYW5kbGUgYm90Y2hlZCBkZW1hbmdsaW5nIHdpdGhvdXQgY29yZWR1bXAgKHRpZW1hbm4pLgorCisJKiB2YWx1ZXMuYzoKKyAgKGNoZWNrX3N0dWJfbWV0aG9kKTogIERvY3VtZW50IHJvdXRpbmUuCisJCQkodGllbWFubikgZml4IGJ1ZyBmb3Igbm8tYXJnIGZ1bmN0aW9ucworCQkJQXZvaWQgY2xvYmJlcmluZyBiZXlvbmQgZW5kIG9mIG1hbGxvYydkIHN0b3JhZ2UuCisJCQlUZXJtaW5hdGUgdGhlIGFyZ3VtZW50IGxpc3QgcHJvcGVybHkuCisKK1NhdCBBdWcgMTggMDE6Mjk6NTkgMTk5MCAgUGVyIEJvdGhuZXIgKGJvdGhuZXJAY3Mud2lzYy5lZHUpCisKKwkqIENoYW5nZXMgbWVyZ2VkIGJ5IEpvaG4gR2lsbW9yZToKKyAgICAKK2JyZWFrcG9pbnQuYzoKKyAgSW4gYnJlYWtwb2ludF8xLCB1c2UgbmV3IHByaW50X2FkZHJlc3Nfc3ltYm9saWMgaW5zdGVhZAorICBvZiBmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24uIChUaGlzIGZvcmNlcyB1c2Ugb2YgYXNzZW1ibGVyLWxldmVsCisgIGFkZHJlc3NlcywgYW5kIGF2b2lkcyBtaXNsZWFkaW5nIG5vbi1tYW5nbGVkIHNvdXJjZS1sZXZlbCBuYW1lcy4pCitjcGx1cy1kZW0uYzoKKyAgR2VuZXJhbGl6ZSBhbnNpIGFyZ3VtZW50IHN1Y2ggdGhhdCAtMSBtZWFucyBza2lwIGFyZ2xpc3QgdG90YWxseS4KKyAgUmVtb3ZlZCBnbG9iYWwgdmFyaWFibGUgcHJpbnRfYW5zaV9xdWFsaWZpZXJzICh3aGljaCBtYWRlCisgIGNvZGUgbm9uLXJlZW50cmFudCksIGluIGZhdm9yIG9mIGV4dHJhIGV4cGxpY2l0IGFyZ3VtZW50cworICB0byBpbnRlcm5hbCByb3V0aW5lcy4KK3ByaW50Y21kLmM6CisgIEFkZCBuZXcgaGVscGVyIGZ1bmN0aW9uIHByaW50X2FkZHJlc3Nfc3ltYm9saWMuCisgIFVzZSBmaW5kX3BjX21pc2NfZnVuY3Rpb24gaW5zdGVhZCBvZiBmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24KKyAgKHNpbmNlIHdlIHdhbnQgYXNzZW1ibGVyLWxldmVsIHN5bWJvbHMgaGVyZSkuCitzdGFjay5jOgorICBQcmludCB1bmtub3duIGZ1bmN0aW9uIGFzIGp1c3QgImYgKC4uLikiLCBub3QgImYgKC4uLikgKC4uLikiLgorICBVc2UgbmV3IGZwdXRzX2RlbWFuZ2xlZCBleHBsaWNpdGx5Lgorc3ltdGFiLmM6CisgIEZpeGVkIGEgdHlwaW5nIHZpb2xhdGlvbiAocHJvYmxlbTogdmFsdWUuaCBjYW5ub3QgYmUgaW1wb3J0ZWQKKyAgd2l0aG91dCByZW5hbWluZyBtYW55IHZhcmlhYmxlIGluIHRoaXMgZmlsZSkuCisgIGxvb2t1cF9zeW1ib2w6IElmIG5vIG1hdGNoaW5nIG1pc2NfZnVuYywgbG9vayBmb3IgYSBDKystbWFuZ2xlZCBuYW1lLgorICBkZWNvZGVfbGluZV8xOiBNb3ZlZCBmb3J3YXJkIHNvbWUgbmV2ZXItcmVhY2hlZCBjb2RlLgorICBNYWRlIGRlY29kZV9saW5lXzIgc2tpcCBmdW5jdGlvbiBwcm9sb2d1ZXMgY29ycmVjdGx5LgordXRpbHMuYzoKKyAgZnB1dHNfZmlsdGVyZWQgc2hvdWxkIG5vdCBkZW1hbmdsZSBieSBkZWZhdWx0LgorICBBZGQgbmV3IGZwdXRzX2RlbWFuZ2xlZCB0byBkZW1hbmdsZSBvbiBkZW1hbmQuLgordmFsb3BzLmM6CisgIENoYW5nZSB2YWx1ZV9zdHJ1Y3RfZWx0IHRvIHVzZSB2YWx1ZV9wcmltaXRpdmVfZmllbGQgKHVzaW5nIHJlY3Vyc2l2ZQorICB1dGlsaXR5IGZ1bmN0aW9uIHNlYXJjaF9zdHJ1Y3RfZmllbGQpLiBUaGlzIGFsbG93cyBmb28uYmFyIHRvIHdvcmsKKyAgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlIChzbyBmYXIgb25seSBmb3IgZGF0YSBmaWVsZHMpLgorICBDaGFuZ2UgY2hlY2tfZmllbGQgaW4gdGhlIHNhbWUgd2F5IChyZWN1cnNpdmUgaGVscGVyIGZ1bmN0aW9uCisgIHRvIHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2UpLgorICAoTm90ZTogdGhlcmUgYXJlIG1vcmUgb2YgdGhlc2UgcHJvYmxlbXMgdGhhdCBJIGhhdmVuJ3QgZml4ZWQuCisgIEFueSBjb2RlIHRoYXQgc2F5cyBUWVBFX0JBU0VDTEFTUyAodCwgMSkgaXMgcHJvYmFibHkgd3JvbmcuKQorICB2YWx1ZV9vZl90aGlzOiAndGhpcycgc3ltYm9sIG5hbWUgaXMgbm93IGp1c3QgInRoaXMiLCBub3RlICIkdGhpcyIuCit2YWxwcmludC5jOgorICBEb24ndCBwcmludCBzdGF0aWMgbWVtYmVycy4KKyAgQXZvaWQgcHJpbnRpbmcgIm1lbWJlcnMgb2YgPHR5cGU+IiBpZiB0aGVyZSBhcmUgbm9uZS4KKyAgU2ltcGxpZmllZCB0eXBlX3ByaW50X2Rlcml2YXRpb25faW5mbyBieSBtZXJnaW5nIGR1cGxpY2F0ZSBjb2RlLgorICBSZW1vdmUgdXNlbGVzcyBibGFuayBsaW5lcyBpbiB0eXBlX3ByaW50X2Jhc2UgKHB0eXBlIGNvbW1hbmQpLgordmFsdWUuaDoKKyAgQWRkZWQgZGVjbGFyYXRpb24gb2YgbmV3IHJvdXRpbmUgdmFsdWVfcHJpbWl0aXZlX2ZpZWxkLgordmFsdWVzLmM6CisgIEFkZGVkIHZhbHVlX3ByaW1pdGl2ZV9maWVsZCB3aGljaCBpcyBnZW5lcmFsaXplZCB2ZXJzaW9uIG9mCisgIHZhbHVlX2ZpZWxkIHRoYXQgY2FuIGhhbmRsZSBtdWx0aXBsZSBpbmhlcml0YW5jZSAobm9uLXplcm8gb2Zmc2V0cyBldGMpLgorICBSZS1pbXBsZW1lbnRlZCB2YWx1ZV9maWVsZCB0byBjYWxsIHZhbHVlX3ByaW1pdGl2ZV9maWVsZC4KKworRnJpIEF1ZyAxNyAyMzozMzo0NCAxOTkwICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50KQorCisJKiBpbmZjbWQuYyAtLSBpbnNlcnQgZWxzZSB0byBhdm9pZCAnZGVsZXRlIGVudicgY29yZWR1bXAgd2hlbiB5b3UKKwlkZWxldGUgdGhlIHdob2xlIGVudmlyb25tZW50LiAgS2FybCBCZXJyeSByZXBvcnRlZCB0aGUgYnVnLgorCSogc291cmNlLmMgLSBmaXggb3BlbnAgdG8gYXZvaWQgLy8ncyBpbiBmaWxlbmFtZXMsIHdoaWNoCisJdHJpZ2dlciBhbiBFbWFjcyBidWcgY2F1c2luZyBpdCB0byBub3QgYmUgYWJsZSB0byBmaW5kIGZpbGVzCisJd2hlbiBydW5uaW5nIGdkYiBpbiBhIHdpbmRvdy4KKwkqIGRieHJlYWQuYyAtIHphcCB0aGUgI2lmIDAgdGhhdCBib3RjaGVzIHRoZSBhZGQtZmlsZSBjb2RlLgorCUl0IHNlZW1zIHRvIHdvcmsgYSBsb3QgYmV0dGVyIHdpdGhvdXQgYWxsIHRoZSBjb2RlIGNvbW1lbnRlZCBvdXQuCisKK0ZyaSBKdWwgMjAgMTY6NTg6NDYgMTk5MCAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIE1lcmdlIFRpZW1hbm4ncyBhbmQgVGVkIEdvbGRzdGVpbidzIGNoYW5nZXMsIGRldGFpbGVkIGJlbG93LAorCWludG8gZ2RiLTMuOTAuOS4KKworVHVlIEp1bCAxNyAxOTozNDozMyAxOTkwICBUZWQgR29sZHN0ZWluICAodGVkZyBhdCBnb2xlbSkKKworCSogTWFrZWZpbGUgLSBhZGRlZCBhICR7Q0ZMQUdTfSB0byBhIGNvdXBsZSBvZiBlbnRyaWVzLAorCWFkZGVkIHJlbW90ZS1zYS5zcGFyYy5jCisJKiBhZGRlZCByZW1vdGUuc2Etc3BhcmMuYywgYSBtb2RpZmljYXRpb24gb2YgcmVtb3RlLmMKKwl3aGljaCBjb25kdWN0cyBhIGRpYWxvZyBkaXJlY3RseSB3aXRoIHRoZSBTcGFyY1N0YXRpb24gcHJvbS4KKwkqIGJyZWFrcG9pbnQuYywgaW5mcnVuLmMsIHNwYXJjZGVwLmMgIGFkZGVkIAorCXJlbW90ZV9pbnNlcnRfYnJlYWtwb2ludCgpLCBhbmQgcmVtb3RlX3JlbW92ZV9icmVha3BvaW50KCkgCisJdG8gYnJlYWtwb2ludC5jIGluc3RlYWQgb2YgZGlyZWN0bHkgd3JpdGluZyBicmVha3BvaW50IGluc3RydWN0aW9ucy4KKwkqIHNwYXJjZGVwLmMgb24gcmVtb3RlX2RlYnVnZ2luZyx0aGVyZSBpcyBubyBuZWVkIAorCXRvIHJlbW92ZSBzaWdubGUgc3RlcCBicmVha3BvaW50IGluc3RydWN0aW9ucy4KKwkqIG1haW4uYyBhZGRlZCAiLWVwb2NoIiBmbGFnIGFuZCAiaW50IGVwb2NoX2ludGVyZmFjZSIgdG8gbWFpbi5jCisJZ2xvYmFsIHZhcmlhYmxlCisJKiBwcmludGNtZC5jIC0gZXBvY2ggaW50ZXJmYWNlIHNlbmRzIGxpc3AgZXhwcmVzc2lvbnMgdG8gb3BlbiB1cAorCWVwb2NoIHdpbmRvd3Mgb24gaW5zcGVjdGlvbi4KKwkqIHZhbHByaW50LmMgLSBhZGRlZCBhcnJheXByaW50LCBhbmQgYWRkcmVzc3ByaW50IGFuZCBtYWRlIGFkZGluZworCWZvcm1hdCBjb250cm9scyBlYXNpZXIKKwkqIHdhaXQuaCBhZGRlZCBhIGNvdXBsZSBvZiB1bmRlZidzIGJlY2F1c2Ugd2Ugd2VyZSBnZXR0aW5nCisJY29tcGxhaW50cyBhYm91dCBXU1RPUFNJRyBhbmQgV1RFUk1TSUcgYmVnaW4gcmVkZWZpbmVkLgorCisKK1dlZCBKdWwgIDQgMDU6Mjc6NTEgMTk5MCAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubiBhdCBtYXNoYW0pCisKKwkqIHN5bXRhYi5jIChkZWNvZGVfbGluZV8xKTogQWRkIHN1cHBvcnQgZm9yIGhhbmRsaW5nIG1ldGhvZCBzdHVicworCWluIHRoZSB0eXBlIGluZm9ybWF0aW9uLgorCitUdWUgSnVsICAzIDA5OjM5OjE4IDE5OTAgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm4gYXQgbWFzaGFtKQorCisJKiB2YWx1ZXMuYyAoYmFzZWNsYXNzX2FkZHIpOiBSdW4gbG9vcCBmcm9tIElOREVYKzEgdG8KKwlOX0JBU0VDTEFTU0VTOyBvdGhlcndpc2UsIHdlIGNhbiBzdGlsbCBnZXQgaW50byBhIGxvb3AuCisJQEAgVGhpcyBzaG91bGQgYmUgcmVzdHJ1Y3R1cmVkIHRvIHVzZSBhIGNsZWFuZXIgc2VhcmNoIHN0cmF0ZWd5LgorCitTdW4gSnVsICAxIDEyOjI4OjUxIDE5OTAgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm4gYXQgbWFzaGFtKQorCisJKiBkYnhyZWFkLmMgKGRlZmluZV9zeW1ib2wscmVhZF90eXBlKTogR3JvayBHTlUgQysrJ3MgbmV3CisJYWJicmV2aWF0aW9uICJUdCIgZm9yIHRhZ3Mgd2hpY2ggaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIHRoZWlyCisJdHlwZWRlY2xzLgorCitGcmkgSnVuIDI5IDAxOjAzOjQ2IDE5OTAgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm4gYXQgbWFzaGFtKQorCisJKiBzeW10YWIuYyAobGlzdF9zeW1ib2xzKTogYWRkIGFiaWxpdHkgdG8gc2V0IGJyZWFrcG9pbnRzIG9uIGFsbAorCXRoZSBmdW5jdGlvbnMgd2hpY2ggbWF0Y2ggYSBwYXJ0aWN1bGFyIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKworVHVlIEp1biAyNiAwNDoyNjoyOSAxOTkwICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uIGF0IG1hc2hhbSkKKworCSogY3BsdXMtZGVtLmMgKGNwbHVzX2RlbWFuZ2xlKTogTmV3IHBhcmFtZXRlciBBTlNJIHNheXMgd2hldGhlciB3ZQorCXNob3VsZCBwcmludCBBTlNJIHF1YWxpZmllcnMgKHN1Y2ggYXMgYGNvbnN0JyBhbmQgYHZvbGF0aWxlJykuCisJQWxsIGNhbGxlcnMgY2hhbmdlZCB0byBjYWxsIHdpdGggQU5TSSA9PSAxLCBleGNlcHQgZnJvbQorCWBjaGVja19tZXRob2Rfc3R1YicsIHdoaWNoIHVzZXMgb2xkLXN0eWxlIHN5bnRheC4KKworCSogc3ltc2VnLmggKHN0cnVjdCBmbl9maWVsZCk6IFJlbW92ZSB1bm5lY2Nlc3NhcnkgYGFyZ3MnIGZpZWxkLgorCSogc3ltdGFiLmggKFRZUEVfRk5fRklFTERfQVJHUyk6IFJlZGVmaW5lZC4KKworCSogdmFsdWVzLmMgKGNoZWNrX3N0dWJfbWV0aG9kKTogTmV3IGZ1bmN0aW9uLgorCisJKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IEhhbmRsZSAibG9uZyBsb25nIiAoZW5jb2RlZCBhcyAneCcpLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfdHlwZSk6IEhhbmRsZSBuZXcgR05VIEMrKyBtZXRob2QgdHlwZSBzdHVicy4KKwkqIHZhbHByaW50ICh0eXBlX3ByaW50X2Jhc2UpOiBEaXR0by4KKworCSogc3ltdGFiLmMgKGdkYl9tYW5nbGVfdHlwZW5hbWUpOiBOZXcgZnVuY3Rpb24uCisKK1R1ZSBKdW4gIDUgMDA6MTg6NDMgMTk5MCAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubiBhdCBnemlsbGEpCisKKwkqIGJyZWFrcG9pbnQuYyAoY2F0Y2hfY29tbWFuZCk6IE5ldyBmdW5jdGlvbi4gIFByb3ZpZGVzIGEKKwltZWNoYW5pc20gdG8gc2V0IGJyZWFrcG9pbnRzIGJhc2VkIG9uIGNhdGNoIGNsYXVzZXMuCisJKGRpc2FibGVfY2F0Y2gpOiBTaW1pbGFyLCBidXQgZGlzYWJsZXMgYnJlYWtwb2ludHMgb24gY2F0Y2gKKwljbGF1c2VzLgorCShkZWxldGVfY2F0Y2gpOiBTaW1pbGFyLCBidXQgZGVsZXRlZCBicmVha3BvaW50cyBvbiBjYXRjaCBjbGF1c2VzLgorCitTdW4gSnVuICAzIDIyOjU0OjA4IDE5OTAgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm4gYXQgZ3ppbGxhKQorCisJKiBibG9ja2ZyYW1lLmMgKGJsb2NrdmVjdG9yX2Zvcl9wYyk6IE5ldyBmdW5jdGlvbi4KKwkqIGJsb2NrZnJhbWUuYyAoYmxvY2tfZm9yX3BjKTogQ2hhbmdlZCB0byBjYWxsCisJYGJsb2NrdmVjdG9yX2Zvcl9wYycgYW5kIGdldCB0aGUgYmxvY2sgaXRzZWxmLgorCisJKiBzdGFjay5jIChjYXRjaF9pbmZvKTogTmV3IGZ1bmN0aW9uLiAgUHJpbnRzIGluZm8gYWJvdXQKKwlleGNlcHRpb25zIHdoaWNoIGNhbiBiZSBjYXVnaHQgaW4gdGhlIGN1cnJlbnQgZnJhbWUuCisJKiBzdGFjay5jIChwcmludF9mcmFtZV9sYWJlbF92YXJzKTogTmV3IGZ1bmN0aW9uLiAgU2ltaWxhciB0bworCWBwcmludF9mcmFtZV9sb2NhbF92YXJzJy4KKwkqIHN0YWNrLmMgKHByaW50X2Jsb2NrX2ZyYW1lX2xhYmVscyk6IFByaW50cyBvdXQgbGFiZWxzIHRoYXQgYXJlCisJZGVmaW5lZCBpbiB0aGlzIGZyYW1lLiAgVGhlc2UgbGFiZWxzIGFyZSBleGNlcHRpb25zIHRoYXQgY2FuIGJlCisJY2F1Z2h0LgorCisJKiBkYnhyZWFkLmM6IFVwZGF0ZWQgdG8gaGFuZGxlIE5fQ0FUQ0ggc3ltdGFiIHR5cGVzLgorCitUaHUgTWF5ICAzIDIyOjEwOjAwIDE5OTAgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm4gYXQgdGVhY2FrZSkKKworCSogdmFscHJpbnQuYyAoZXZlcnl3aGVyZSk6IFRZUEVfTkFNRSAoVFlQRSkgbm8gbG9uZ2VyIGNvbWVzIGluIHRoZQorCWZvcm0gInN0cnVjdCAuLi4iIGZvciBHTlUgQysrLiAgRG9uJ3QgZmx1c2ggYW55IHBhcnQgb2YgVFlQRV9OQU1FCisJd2hlbiBwcmludGluZyB0aGUgdHlwZS4KKworV2VkIE1heSAgMiAyMjo0MzowNCAxOTkwICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uIGF0IHRlYWNha2UpCisKKwkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6IFVzZSBgYmFzZWNsYXNzX2FkZHInIHRvIGFjY2VzcyB0aGUKKwliYXNlY2xhc3NlcyBwb2ludGVkIHRvIHZpYSB0aGUgZGVyaXZlZCBjbGFzcyBvYmplY3QgYXQgVkFMQUREUi4KKworCSogdmFsdWVzLmMgKGJhc2VjbGFzc19hZGRyKTogTmV3IGZ1bmN0aW9uLiAgQ2FzdHMgZGVyaXZlZCBwb2ludGVycworCXRvIGJhc2VjbGFzcyBwb2ludGVycyB0YWtpbmcgdmlydHVhbCBiYXNlY2xhc3NlcyBhbmQgbXVsdGlwbGUKKwlpbmhlcml0YW5jZSBpbnRvIGFjY291bnQuCisKK1NhdCBNYXkgIDUgMTI6Mzk6MTggMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogVmVyc2lvbiAzLjkwLjkuCisKK0ZyaSBNYXkgIDQgMTI6MTI6NTUgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogYnJlYWtwb2ludC5jICh3YXRjaF9jb21tYW5kLCBicHN0YXRfc3RvcF9zdGF0dXMpOiBEZWFsIHdpdGgKKwlleHBfdmFsaWRfYmxvY2sgZmllbGQgY29ycmVjdGx5LgorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBXaGVuIGNoZWNraW5nICJkb24ndCBldmVuIHRoaW5rCisJYWJvdXQgYnJlYWtwb2ludHMiIGlmIHN0b3Bfc2lnbmFsID09IFNJR1RSQVAgJiYgdHJhcF9leHBlY3RlZCwKKwlhbHNvIGNoZWNrIHN0ZXBfcmVzdW1lX2JyZWFrcG9pbnQuCisJSW5zZXJ0IGJyZWFrcG9pbnRzIGFuZCBjb250aW51ZSAobm90IHN0ZXApIGlmCisJc3RlcF9yZXN1bWVfYnJlYWtfYWRkcmVzcyAhPSBOVUxMLCBldmVuIGlmIGFub3RoZXJfdHJhcC4KKwlJZiB0cmFwX2V4cGVjdGVkIGFuZCB3ZSBlbnRlciBzaWd0cmFtcCwgdGhlbiBzZXQgdXAgYQorCXN0ZXBfcmVzdW1lX2JyZWFrLgorCUlmIHRyYXBfZXhwZWN0ZWQgaXMgc2V0IHdoZW4gd2UgaGl0IHRoZSBzdGVwX3Jlc3VtZV9icmVhaywKKwlzZXQgYW5vdGhlcl90cmFwLgorCVdoZW4gY2FsbGluZyByZXN1bWUgYW5kIHRyYXBfZXhwZWN0ZWQgc2F5cyB0ZWxsIHJlc3VtZSB0byBzdGVwCisJKDIgcGxhY2VzKSwgYWxzbyBjaGVjayBzdGVwX3Jlc3VtZV9icmVha19hZGRyZXNzLgorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBEb24ndCBzZXQKKwlwcmV2X3twYyxzcCxmdW5jX3tzdGFydCxuYW1lfX0gYmVmb3JlIGNhbGxpbmcgd2FpdCAoKS4KKwlEbyBzZXQgdGhlbSBhZnRlciBleGl0aW5nIGxvb3AuCisJTW92ZSB0aGVpciBkZWNsYXJhdGlvbnMgb3V0c2lkZSBmdW5jdGlvbnMuCisJKHN0YXJ0X2luZmVyaW9yKTogSW5pdGlhbGl6ZSB0aGVtLgorCitUaHUgTWF5ICAzIDAwOjE1OjExIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvciwgYWZ0ZXIgY2hlY2sgZm9yIHRyYXBfZXhwZWN0ZWQgPiAxKToKKwlSZXN0b3JlIG9sZCBjb2RlIHdoaWNoIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiB0cmFwX2V4cGVjdGVkIGFuZAorCXJ1bm5pbmdfaW5fc2hlbGwsIGp1c3QgbWFrZSB0aGUgbGF0dGVyIHRha2UgYW55IG5vbi1UUkFQIHNpZ25hbCwKKwlub3QganVzdCBTRUdWLgorCisJKiB2YWx1ZXMuYyAoYWxsb2NhdGVfdmFsdWUpOiBaZXJvIFZBTFVFX09QVElNSVpFRF9PVVQgZmxhZy4KKworCSogTWFrZWZpbGUuZGlzdCAocGluc24ubyk6IFVzZSBQSU5TTl9DQyB0byBjb21waWxlLgorCXhjb25maWcvM2IxIChDQyxQSU5TTl9DQyk6IERlZmluZS4KKworCSogeGNvbmZpZy9hbHRvcywgYWx0b3MtZGVwLmM6IFJlbmFtZSBhbHRvcy1kZXAuYyB0byBhbHRvcy14ZGVwLmMuCisKKwkqIFZlcnNpb24gMy45MC44CisKKwkqIGJyZWFrcG9pbnQuYyAoYnBzdGF0X3N0b3Bfc3RhdHVzKSwKKwlpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpIFtTSElGVF9JTlNUX1JFR1NdOiBOZXcgY29kZS4KKworCSogcGFyYW0uaCwgdG0tODhrLmg6IERlZmluZSBBRERSX0JJVFNfKi4KKwlpbmZjbWQuYyAoanVtcF9jb21tYW5kLCByZWFkX3BjKSwgaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKSwKKwlwcmludGNtZC5jIChkb19vbmVfZGlzcGxheSk6IFVzZSB0aGVtLgorCisJKiB1dGlscy5jOiBTcGxpdCAjaWZkZWYgVVNHIGludG8gYSBVU0dfVVRJTFMgYW5kIGEgUVVFVUVfTUlTU0lORy4KKwl4bS04OGsuaDogRGVmaW5lIFVTR19VVElMUy4KKworV2VkIE1heSAgMiAwMDowNTozMyAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiBwcmludGNtZC5jIChwcmludGZfY29tbWFuZCkgW19fSU5UX1ZBUkFSR1NfSF06IE5ldyBjb2RlLgorCShwcmludGZfY29tbWFuZCk6IEFkZCBmcm9tX3R0eSBwYXJhbWV0ZXIuCisKKwkqIHZhbHByaW50LmMgKHZhbHVlX3ByaW50KTogQ2hlY2sgVkFMVUVfT1BUSU1JWkVEX09VVCBmbGFnLgorCisJKiB2YWx1ZS5oOiBBZGQgb3B0aW1pemVkX291dCBmaWVsZCBhbmQgY2hhbmdlIGxhenkgZmllbGQgdG8KKwljaGFyLiAgQWRkIG1hY3JvIFZBTFVFX09QVElNSVpFRF9PVVQuCisKKwkqIGkzODYtcGluc24uYzogQ2hhbmdlIGZyb20gRWlyaWsgRnVsbGVyIHRvIHdyaXRlIHRvIHN0cmVhbSBkaXJlY3RseQorCWluc3RlYWQgb2Ygc3R1ZmZpbmcgdGhpbmdzIGluIGJ1ZmZlcnMgKG9hcHBlbmQsIGV0YykuCisKKwkqIGJyZWFrcG9pbnQuYyAoYnBzdGF0X2RvX2FjdGlvbnMpOiBJZiAqQlNQIGlzIHNldCB0byBOVUxMIGJ5CisJZXhlY3V0ZV9jb21tYW5kLCBleGl0IGJvdGggbG9vcHMuCisKKwkqIE1ha2VmaWxlLmRpc3Q6IERvbid0IHNldCBUQVJHRVRfQVJDSC4gIEFkZCAuYy5vIHJ1bGUuCisKK1R1ZSBNYXkgIDEgMTc6MDc6MjMgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogTWFrZWZpbGUuZGlzdCAoUkFQUF9PQlMsIHJhcHApLAorCXJnZGIuYywgcnNlcmlhbC5jLCBydWRwLmMsIHNlcmlhbC5jLCB1ZHAuYywgeGRlcC5oLAorCXJlbW90ZS5oOiBBZGRlZC4KKwltNjhrLXhkZXAuYywgY29yZWRlcC5jOiBXcmFwIGluICNpZiAhZGVmaW5lZCAoUkRCKS4KKworCSogdmFsb3BzLmMgKHZhbHVlX3N0cnVjdF9lbHQpLCB2YWx1ZXMuYyAodmFsdWVfc3RhdGljX2ZpZWxkKToKKwlDaGFuZ2UgZXJyb3IgbWVzc2FnZXMgdG8gcmVtb3ZlIHJlZmVyZW5jZXMgdG8gYGluZm8gbWV0aG9kcycuCisKK1R1ZSBBcHIgMjQgMTA6MjU6MTAgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogTW9yZSA4OGsgY2hhbmdlczoKKwlpbmZydW4uYyAoc3RhcnRfaW5mZXJpb3IpOiBBZGQgU1RBUlRfSU5GRVJJT1JfSE9PSy4KKwlpbmZjbWQuYyBbU0hJRlRfSU5TVF9SRUdTXTogTmV3IGNvZGUuCisJZmluZHZhci5jIChyZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyk6IFJldHVybiBhIHZhbHVlLgorCWluZmNtZC5jIChkb19yZWdpc3RlcnNfaW5mbyk6IENoZWNrIHZhbHVlIGZyb20KKwlyZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcy4KKworCSogY29tbWFuZC5jIChkZWxldGVfY21kKTogRnJlZSB0aGUgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQocykKKwl3ZSBhcmUgcmVtb3ZpbmcuCisKK01vbiBBcHIgMjMgMTA6NDI6MjEgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogTW9yZSA4OGsgY2hhbmdlczoKKwlmaW5kdmFyLmMgKGdldF9zYXZlZF9yZWdpc3Rlcik6IE5ldyBmdW5jdGlvbi4KKwlmaW5kdmFyLmM6IFJld3JpdGUgY29kZSB3aGljaCBjYWxsZWQgZmluZF9zYXZlZF9yZWdpc3RlciB0bworCWNhbGwgZ2V0X3NhdmVkX3JlZ2lzdGVyIGluc3RlYWQuCisKK1N1biBBcHIgMjIgMTQ6NDc6NTEgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogQ2hhbmdlIGVycm9yIG1lc3NhZ2UgcHJpbnRlZCB3aGVuCisJdGhlIHR5cGUgaGFzIFRZUEVfRkxBR19TVFVCIHNldC4KKworCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogQ2hlY2sgZm9yIFRZUEVfQ09ERV9VTkRFRi4KKworCSogZmluZHZhci5jICh3cml0ZV9yZWdpc3Rlcik6IFNldCByZWdpc3Rlcl92YWxpZCAocmVnbm8pLgorCisJKiB2YWxvcHMuYyAoY2FsbF9mdW5jdGlvbik6IENoZWNrIGZvciBOVUxMIHJldHVybiBmcm9tIGJsb2NrX2Zvcl9wYy4KKworRnJpIEFwciAyMCAxMTozMToyMyAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiBmaW5kdmFyLmMgKHdyaXRlX3JlZ2lzdGVyKTogQWRkIFBSRVBBUkVfVE9fU1RPUkUuCisJe3N1bjMsc3BhcmMsc3ltbWV0cnl9LXhkZXAuYyAoUFJFUEFSRV9UT19TVE9SRSk6IEFkZC4KKwlpbmZwdHJhY2UuYywge21pcHMscHlyLHN5bW1ldHJ5LHN1bjMsYXJtLGhwMzAwaHB1eH0teGRlcC5jCisJKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6IERvbid0IGNhbGwgcmVhZF9yZWdpc3Rlcl9ieXRlcy4KKwlzeW1tZXRyeS14ZGVwLmMgKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6CisJI2lmIDAgb3V0IGNvZGUgdG8gZmV0Y2ggcmVnaXN0ZXJzLgorCisJKiB2YWx1ZXMuYyAodmFsdWVfYXNfbG9uZyk6IENhbGwgQ09FUkNFX0FSUkFZLgorCisJKiB0bS1zdW4zLmg6IEluY2x1ZGUgdG0tNjhrLmggbm90IG0tNjhrLmgKKworCSogc3BhcmMtdGRlcC5jIChzaW5nbGVfc3RlcCk6IFNldCBuZXh0X3BjLCBucGM0IHdpdGhpbgorCWlmICghb25lX3N0ZXBwZWQpLCBub3Qgb3V0c2lkZSBpdC4KKworCSogQ2hhbmdlcyBmcm9tIERhdGEgR2VuZXJhbCBmb3IgODhrOgorCSogY29mZnJlYWQuYyAocmVhZF9maWxlX2hkcik6IEFkZCAqODgqTUFHSUMuCisJKiBjb2ZmcmVhZC5jIChoYXZlX3N5bWJvbF9maWxlX3ApOiBOZXcgZnVuY3Rpb24uCisJKiBjb2ZmcmVhZC5jIFtDT0ZGX0NIRUNLX1hfWkVST0VTXSBbVERFU0NdOiBOZXcgY29kZS4KKwkqIGNvZmZyZWFkLmMgKHJlYWRfb25lX3N5bSk6IElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUKKwlhdXggZW50cnksIGRvbid0IGdpdmUgYW4gZXJyb3IgbWVzc2FnZSwganVzdCBpZ25vcmUgdGhlCisJZXh0cmEgb25lcy4KKwkqIGNvZmZyZWFkLmMgKHByb2Nlc3NfY29mZl9zeW1ib2wpOiBSZXBsYWNlIGNsaXBwZXIgd2l0aAorCUJFTElFVkVfUENDX1BST01PVElPTiBpbiAjaWZkZWYncy4KKwkqIGNvZmZyZWFkLmM6IERlZmluZSBMX0xOTk8zMiBpZiBub3QgZGVmaW5lZC4KKwkoZW50ZXJfbGluZW5vcyk6IFVzZSBpdC4KKwkqIGJsb2NrZnJhbWUuYzogQWRkIElOSVRfRlJBTUVfUEMgaG9vayBhbmQgdXNlIGl0IGluCisJZ2V0X3ByZXZfZnJhbWVfaW5mby4KKwltLW04OGsuaDogVXNlIElOSVRfe0ZSQU1FX1BDLEVYVFJBX0ZSQU1FX0lORk99IHRvIGRvIHRkZXNjIHN0dWZmLgorCVVzZSBkdW1teSB2ZXJzaW9ucyBvZiBGUkFNRV9DSEFJTl8qLgorCSogTWFrZWZpbGUuZGlzdCwgeGNvbmZpZy9pMzg2KjogUmVuYW1lIE1fQ0xJQlMgdG8gWE1fQ0xJQlMgYW5kIGFkZAorCVRNX0NMSUJTIGFuZCBDREVQUy4KKwl0ZGVzYy9saWJkYy5vOiBOZXcgdGFyZ2V0LgorCXRkZXNjLntjLGh9LCB0ZGVzYy8qLCB7dCx4fWNvbmZpZy9tODhrOiBOZXcgZmlsZXMuCisKK1RodSBBcHIgMTIgMTU6NDc6MDAgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogbTY4ay1vcGNvZGUuaCAoYnJhcywgYnNycyk6IFVzZSAiQnciIG5vdCAiQmciLgorCitUdWUgQXByIDEwIDIwOjUwOjI1IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIFZlcnNpb24gMy45MC43LgorCisJKiB4bS1taXBzLmggKEJZVEVfT1JERVIpOiBJZiBub3QgZGVmaW5lZCwgbWFrZSBpdCBMSVRUTEVfRU5ESUFOLgorCisJKiBtaXBzLXhkZXAuYyAoe2ZldGNoLHN0b3JlfV9pbmZlcmlvcl9yZWdpc3RlcnMpOiBSZW1vdmUgdmFyaWFibGUKKwlvZmZzZXQgYW5kIGp1c3QgdXNlIHJlZ2lzdGVyX2FkZHIgKHJlZ25vLCAxKS4KKwkoY29yZV9maWxlX2NvbW1hbmQpOiBSZW1vdmUgdmFyaWFibGUgcmVnX29mZnNldCBhbmQganVzdCB1c2UKKwlyZWdpc3Rlcl9hZGRyIChyZWdubywgMCkuCisKKwkqIGdkYmNvcmUuaCBbQ09GRl9GT1JNQVRdOiAjdW5kZWYgYV9tYWdpYyBiZWZvcmUgcmVkZWZpbmluZyBpdC4KKworCSogaW5mcnVuLmMgKCJpZiAodHJhcF9leHBlY3RlZCAmJiBzdG9wX3NpZ25hbCAhPSBTSUdUUkFQKSIsIG5lYXIgZW5kCisJb2Ygd2FpdF9mb3JfaW5mZXJpb3IpOiBBbHdheXMgcGFzcyAwIGFzIGZpcnN0IGFyZyB0byByZXN1bWUuCisJI2lmIDAgb3V0ICJTSUdTRUdWIGluIHNoZWxsIiB0ZXN0IHJpZ2h0IGFib3ZlIGl0IChub3cgcmVkdW5kYW50KS4KKworCSogaTM4Ni1waW5zbi5jIChvYXBwZW5kX2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24uCisJKG9hcHBlbmQpOiBNYWtlIGl0ICJzdGF0aWMgdm9pZCIgYW5kIGRlY2xhcmUgYXQgdG9wIG9mIGZpbGUuCisJKE9QX0osIE9QX0RJUik6IFVzZSBvYXBwZW5kX2FkZHJlc3MuCisKK01vbiBBcHIgIDkgMTU6MjI6MDkgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogbWlwcy14ZGVwLmM6IEluY2x1ZGUgPG1pcHMvaW5zdC5oPiBub3QgIm1pcHMvaW5zdC5oIi4KKworCSogd2FpdC5oIFtIQVZFX1dBSVRfU1RSVUNUXTogUHV0ICNkZWZpbmVzIGluICNpZiAhZGVmaW5lZCBzbyB0aGF0CisJaXQncyBPSyBpZiB0aGV5IGFyZSBkZWZpbmVkIGluIDxzeXMvd2FpdC5oPi4KKworCSogZmluZHZhci5jIChmZXRjaF9yZWdpc3RlcnMpOiBQYXNzICJyZWdpc3RlcnMiLCBub3QgIiZyZWdpc3RlcnMiLAorCXRvIHJlbW90ZV9mZXRjaF9yZWdpc3RlcnMuCisKKwkqIG1pcHMtdGRlcC5jIChfaW5pdGlhbGl6ZV9taXBzZGVwKTogUmVtb3ZlIGhleF9kaXNhc3NlbWJsZXIKKwlhbmQgcmUtd3JpdGUgc2tpcF9wcm9sb2d1ZSB0byB1c2UgYWRkX3NldF9jbWQuCisKKwkqIE1ha2VmaWxlLmRpc3QgKGFsbGRlcHMubWFrKTogRG9uJ3QgcHV0IFwgYWZ0ZXIgdGhlIGxhc3QKKwlmaWxlbmFtZSBpbiBlYWNoIGxpc3QuCisKK1N1biBBcHIgIDggMDE6NTk6MTkgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogVmVyc2lvbiAzLjkwLjYuCisKKwkqIE1ha2VmaWxlLmRpc3QgKGFsbGRlcHMubWFrKTogIlhNX0ZJTEUiIC0+ICJYTV9GSUxFPSIuCisKKwkqIHZhbGFyaXRoLmMgKHZhbHVlX3hfe3VuLGJpbn1vcCk6IHVzZSAib3BlcmF0b3IiIG5vdCAib3BlcmF0b3IgIgorCXRvIG1hdGNoIGRieHJlYWQuYyBjaGFuZ2Ugb2YgMTYgTWFyIDkwLgorCisJKiB2YWxhcml0aC5jICh2YWx1ZV94X3Vub3ApOiBQYXNzICZzdGF0aWNfbWVtZnVuY3AsCisJbm90IHN0YXRpY19tZW1mdW5jcC4KKworCSogYnJlYWtwb2ludC5jOiBBZGQgd2F0Y2hwb2ludCBzdHVmZi4KKwlicmVha3BvaW50Lmg6IEFkZCBicHN0YXRfc2hvdWxkX3N0ZXAuCisJaW5mcnVuLmMgKHByb2NlZWQsIHdhaXRfZm9yX2luZmVyaW9yKTogVXNlIGl0LgorCWJyZWFrcG9pbnQuaDogQWRkIGJwc3RhdF9wcmludCAoYW5kIHJlbmFtZSBvbGQgYnBzdGF0X3ByaW50CisJdG8gYnBzdGF0X3Nob3VsZF9wcmludCkuCisJaW5mcnVuLmMgKG5vcm1hbF9zdG9wKTogVXNlIGl0LgorCisJKiB2YWx1ZS5oOiBBZGQgdmFsdWVfZnJlZS4gIERlY2xhcmUgYSBmZXcgZnVuY3Rpb25zLgorCitTYXQgQXByICA3IDIxOjQzOjQzIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogUmVtb3ZlIFBST0ZJTEVfVFlQRVMgY29kZSBhbmQKKwlpbnNlcnQgY29tbWVudCBzdWdnZXN0aW5nIGVhc3kgc2hlbGwgc2NyaXB0IGVxdWl2YWxlbnRzLgorCisJKiB2YWx1ZXMuYyAodW5wYWNrX2xvbmcpOiBHaXZlIGJldHRlciBlcnJvciBtZXNzYWdlcyBmb3IKKwl1bnJlY29nbml6ZWQgc2l6ZXMgb2YgaW50cyBhbmQgZmxvYXRzLgorCitGcmkgQXByICA2IDAwOjMyOjIxIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIGRieHJlYWQuYywgZ2RiY29yZS5oIChJU19PQkpFQ1RfRklMRSk6IENoZWNrIGZvciBhX2Ryc2l6ZQorCW5vbnplcm8gYXMgd2VsbCBhcyBhX3Ryc2l6ZS4KKworCSogTW9yZSBwbGFjZXM6IFVzZSBTV0FQX1RBUkdFVF9BTkRfSE9TVC4KKworCSogdmFsb3BzLmMgKGRlc3RydWN0b3JfbmFtZV9wKTogT25seSBza2lwICJzdHJ1Y3QgIiBpZiBwcmVzZW50LgorCisJKiBtYWluLmMgKGdkYl9yZWFkbGluZSk6IFJldHVybiBOVUxMIG9uIGVuZCBvZiBmaWxlLgorCisJKiBzcGFyYy1vcGNvZGUuaDogQWRkIGptcCAxKzIsIGptcCAxK2ksIGptcCBpKzEuCisKKwkqIE1ha2VmaWxlLmRpc3Q6IE1ha2UgZXhwcmVhZC50YWIuYyB1bmFtYmlndW91c2x5IGJlIGluIHNyY2Rpci4KKworCSogbWFpbi5jOiBTcGxpdCBzb3VyY2VfY29tbWFuZCBpbnRvIHNvdXJjZV9jb21tYW5kIGFuZAorCXJlYWRfY29tbWFuZF9maWxlLgorCShtYWluKTogQWNjZXB0ICItIiBhcyBhcmcgdG8gK2NvbW1hbmQgZm9yIHN0ZGluLgorCisJKiBkYnhyZWFkLmMgKHBzeW10YWJfdG9fc3ltdGFiKTogRG9uJ3QgcmVhZCBzdHJpbmcgdGFibGUuCisJKHN5bWJvbF9maWxlX2NvbW1hbmQpOiBTYXZlIHN0cmluZyB0YWJsZSBzaXplLgorCisJKiBWZXJzaW9uIDMuOTAuNQorCisJKiBzeW10YWIuYzogUmVtb3ZlIGRlY2xhcmF0aW9uIG9mIGxvb2t1cF9taXNjX2Z1bmMuCisKKwkqIG1pcHMtcGluc24uYzogQWRkIHVzZV9oZXhfcCBzdHVmZiAocmUtd29ya2VkIGZyb20gRm9yaW4gc3R1ZmYpLgorCisJKiBtaXBzLW9wY29kZS5oOiBBZGQgYmRlbGF5IGZpZWxkLgorCW1pcHMtcGluc24uYzogVmFyaW91cyBjaGFuZ2VzIGZyb20gRm9yaW4sIEkgdGhpbmsgdG8gbWFrZSBpdCBsb29rCisJbGlrZSB0aGUgTUlQUyBhc3NlbWJsZXIgZm9ybWF0LgorCW1pcHMtdGRlcC5jLCBtaXBzLXhkZXAuYywgbWlwc3JlYWQuYzogVmFyaW91cyBjaGFuZ2VzIGZyb20gRm9yaW4uCisKKwkqIGdkYmNvcmUuaDogRGVjbGFyZSByZWdpc3Rlcl9hZGRyLgorCisJKiBnZGJjb3JlLmg6IEluY2x1ZGUgPGEub3V0Lmg+LCBiZWZvcmUgdHJ5aW5nIHRvIHJlZGVmaW5lIE5fVFhUQUREUgorCWFuZCBmcmllbmRzLgorCXZhcmlvdXM6IERvbid0IGluY2x1ZGUgYm90aCBhLm91dC5oIGFuZCBnZGJjb3JlLmguCisKKwkqIE1ha2VmaWxlLmRpc3QgKEhGSUxFUyk6IEFkZCBwYXJhbS5oCisKKwkqIHV0aWxzLmMgKGluaXRfbWFsbG9jKTogTW92ZWQgaGVyZSBmcm9tIG1jaGVjay5jIGFuZCBtb2RpZmllZAorCXRvIHVzZSB0aGUgc3RhbmRhcmQgbWNoZWNrLmMKKwlNYWtlZmlsZS5kaXN0OiBNb2RpZnkgdG8gcmVmbGVjdCBuZXcgbWNoZWNrLgorCitUaHUgQXByICA1IDE2OjM4OjI4IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIHZhbHByaW50LmMgKHZhbF9wcmludCwgcHJpbnRfaGV4X2NoYXJzKTogUHJpbnQgaW50ZWdlcnMKKwlsYXJnZXIgdGhhbiBMT05HRVNULgorCisJKiB2YWxhcml0aC5jICh2YWx1ZV9zdWIpOiBHaXZlIGVycm9yIG1lc3NhZ2UgaWYgYXR0ZW1wdCB0bworCXN1YnRyYWN0IHNvbWV0aGluZyBvZiB0aGUgd3JvbmcgdHlwZSBmcm9tIGEgcG9pbnRlci4KKworCSogYnJlYWtwb2ludC5jIChicHN0YXRfc3RvcF9zdGF0dXMpOiBJbml0aWFsaXplIHJldHZhbCB0byBOVUxMLgorCisJKiBpMzg2LXRkZXAuYyAoaTM4Nl9wb3BfZnJhbWUpOiBDaGFuZ2UgYWRkciB0byBhZHIuCisKK1dlZCBBcHIgIDQgMDU6MjE6NTAgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHRlZW5hZ2UtbXV0YW50KQorCisJKiBtYWluLmMgKGNvbW1hbmRfbGluZV9pbnB1dCk6IHJldHVybiBOVUxMIG9uIGVuZCBvZiBmaWxlLgorCShleGVjdXRlX2NvbW1hbmQpOiBJZiBwIGlzIE5VTEwsIHJldHVybiBhbG1vc3QgcmlnaHQgYXdheS4KKwkocmVhZF9jb21tYW5kX2xpbmVzKTogVHJlYXQgZW5kIG9mIGZpbGUgbGlrZSAiZW5kIi4KKworCSogcHJpbnRjbWQuYyAocHJpbnRfZnJhbWVfYXJncyk6IENoYW5nZSBpdCBzbyBudW0gaXMgbnVtYmVyCisJb2YgaW50cyBvZiBhcmdzLCBub3QgbnVtYmVyIG9mIGFyZ3MuCisKKwkqIHhtLSouaDogTWFrZSBzdXJlIEJZVEVfT1JERVIgaXMgZGVmaW5lZC4KKwlBbHNvIGZpeCB2YXJpb3VzICNpbmNsdWRlcyBvZiBvbGQgbmFtZXMgb2YgdGhpbmdzLgorCisJKiBtYWluLmMgKGNvbW1hbmRfbGluZV9pbnB1dCk6IEZpeCBjb21tZW50IGNvZGUgb2YgMiBBcHIuCisKKwkqIHZhbHVlcy5jICh2YWx1ZV9mcm9tX2xvbmcsIHVucGFja19sb25nKTogU1dBUF9UQVJHRVRfQU5EX0hPU1QuCisJdmFyaW91czogUmVwbGFjZSB7QllURVMsV09SRFN9X0JJR19FTkRJQU4gd2l0aCBUQVJHRVRfQllURV9PUkRFUi4KKwl2YWxhcml0aC5jIHZhcmlvdXM6IFNXQVBfVEFSR0VUX0FORF9IT1NULgorCWRieHJlYWQuYyAoUkVBRF9GSUxFX0hFQURFUlMpOiBTV0FQX1RBUkdFVF9BTkRfSE9TVC4KKwkoU1dBUF9TWU1CT0wpOiBOZXcgbWFjcm8uICBVc2UgaXQgd2hlcmV2ZXIgc3ltYnVmX2lkeCBpcyBpbmNyZW1lbnRlZC4KKwlleGVjLmMgKGV4ZWNfZmlsZV9jb21tYW5kKTogU1dBUF9UQVJHRVRfQU5EX0hPU1QuCisKKwkqIHZhbGFyaXRoLmMgKHZhbHVlX3N1YnNjcmlwdGVkX3J2YWx1ZSk6IEp1c3QgYmNvcHkoKSB0aGUKKwlhcHByb3ByaWF0ZSBieXRlcyByYXRoZXIgdGhhbiBwbGF5aW5nIHN0cmFuZ2UgZ2FtZXMgd2l0aAorCXZhbHVlX2Zyb21fbG9uZy4KKworCSogcGFyYW0uaCAoU1dBUF9UQVJHRVRfQU5EX0hPU1QpOiBOZXcgbWFjcm8uCisKKwkqIHRtLW5wMS5oIChWN19SRUdOVU0pOiBDaGFuZ2UgZnJvbSAyNyB0byAyNi4KKwkoUkVHSVNURVJfVklSVFVBTF9UWVBFKTogUmV0dXJuIGNvcnJlY3QgcmVzdWx0IGZvciB2ZWN0b3IgcmVncy4KKwlnb3VsZC10ZGVwLmM6IE5ldyBmaWxlLgorCisJKiBNb3ZlIHJlYWRpbmcgb2YgcmVnaXN0ZXIgYmVmb3JlIHN0b3JlIGZyb20KKwlmaW5kdmFyLmMgKHdyaXRlX3JlZ2lzdGVyKSB0bworCWluZnB0cmFjZS5jLCAqLXhkZXAuYyAoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXIpLgorCisJKiBmaW5kdmFyLmMgKGZldGNoX3JlZ2lzdGVycywgc3RvcmVfcmVnaXN0ZXJzKTogTmV3IGZ1bmN0aW9ucy4KKwl3cml0ZV9yZWdpc3RlcnssX2J5dGVzfTogVXNlIHN0b3JlX3JlZ2lzdGVycyByZWdhcmRsZXNzIG9mCisJaGF2ZV9pbmZlcmlvcl9wLgorCXJlZ2lzdGVyc192YWxpZDogTmV3IHZhcmlhYmxlLgorCShzdXBwbHlfcmVnaXN0ZXIsIHJlYWRfcmVnaXN0ZXIsIGV0Yy4pOiBVc2UgaXQuCisJKHJlYWRfcmVnaXN0ZXJfZ2VuKTogTmV3IHZhcmlhYmxlLgorCXZhcmlvdXM6IFVzZSByZWFkX3JlZ2lzdGVyX2dlbiByYXRoZXIgdGhhbiByZWFkX3JlZ2lzdGVyX2J5dGVzCisJd2hlcmUgYXBwcm9wcmlhdGUuCisJKi14ZGVwLmMgKGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyk6IFJlbW92ZSByZW1vdGVfZGVidWdnaW5nIGNoZWNrLgorCWluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvciwgc3RhcnRfaW5mZXJpb3IpOiBDYWxsIHJlZ2lzdGVyc19jaGFuZ2VkCisJbm90IGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycy4KKwkqLXhkZXAuYyAoZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzKTogQ2FsbCByZWdpc3RlcnNfZmV0Y2hlZCBpZgorCW5vdCBzZXR0aW5nIHJlZ2lzdGVycyB2aWEgc3VwcGx5X3JlZ2lzdGVyLCBhbmQgaWYgZmV0Y2hpbmcKKwlhbGwgcmVnaXN0ZXJzLgorCWluZnB0cmFjZS5jLCAqLXhkZXAuYyAoZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzKTogQWRkIHBhcmFtLAorCSMgb2YgcmVnaXN0ZXIgdG8gZmV0Y2ggKC0xIGZvciBhbGwpLgorCWluZnB0cmFjZS5jLCBocDMwMGhwdXgteGRlcC5jIChmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMpOgorCUFjdHVhbGx5IGZldGNoIG9ubHkgdGhvc2UgcmVnaXN0ZXJzIG5lZWRlZC4KKwl2YWx1ZS5oOiBEZWNsYXJlIGFsbCB0aGUgZXh0ZXJuIHJlZ2lzdGVyIGZ1bmN0aW9ucyBmcm9tIGZpbmR2YXIuYy4KKworCSogY29mZnJlYWQuYyAocmVhZF9jb2ZmX3N5bXRhYik6IFRlc3QgZm9yIHNwZWNpZmljIGtpbmRzIG9mIEdDQworCWxhYmVscyAoTEklLiosIExQQiUuKiwgZXRjKSwgbm90IGp1c3QgPz8lLiouCisKKwkqIGNvZmZyZWFkLmMgKHJlY29yZF9taXNjX2Z1bmN0aW9uKTogVXNlIG1mX3RleHQgbm90IG1mX3Vua25vd24uCisKKwkqIHV0aWxzLmMsZGVmcy5oIChsaW5lc190b19saXN0KTogTmV3IGZ1bmN0aW9uLgorCXNvdXJjZS5jIChzZWxlY3Rfc291cmNlX3N5bXRhYiwgbGlzdF9jb21tYW5kLCBmb3J3YXJkX3NlYXJjaF9jb21tYW5kLAorCXJldmVyc2Vfc2VhcmNoX2NvbW1hbmQpLCBzdGFjay5jIChwcmludF9mcmFtZV9pbmZvKToKKwlVc2UgaXQgaW5zdGVhZCBvZiAxMC4KKworCSogbXVuY2g6IElmIE1VTkNIX05NIHZhcmlhYmxlIGV4aXN0cywgdXNlIGl0LgorCisJKiBtYWluLmMgKGluaXRpYWxpemVfbWFpbik6IFNldCBybF9yZWFkbGluZV9uYW1lLgorCW1haW4uYzogI2luY2x1ZGUgcmVhZGxpbmUuaCBhbmQgI3VuZGVmIHNhdmVzdHJpbmcuCisJUmVtb3ZlIGRlY2xhcmF0aW9ucyBvZiB0aGluZ3MgZGVjbGFyZWQgaW4gcmVhZGxpbmUuaC4KKworCSogbWFpbi5jIChnZGJfcmVhZGxpbmUpOiBJZiBpbnN0cmVhbSA9PSAwLCByZWFkIGZyb20gc3RkaW4uCisKKwkqIG1haW4uYyAobWFpbik6IE9ubHkgY2FsbCBjbGVhcmVyciBpZiBJU0FUVFkuICBFeGl0IGxvb3AgaWYKKwlmZW9mIChpbnN0cmVhbSkuCisKKwkqIGluZmNtZC5jIChkZXRhY2hfY29tbWFuZCk6IFNldCBpbmZlcmlvcl9waWQgdG8gMCBhZnRlcgorCWNhbGxpbmcgcmVtb3RlX2Nsb3NlLgorCisJKiBtYWluLmMgKG1haW4pOiBJZiBleGVjIGFuZCBzeW0gZmlsZXMgYXJlIHRoZSBzYW1lLCBhbmQgdGhlcmUKKwlpcyBhbiBlcnJvciByZWFkaW5nIGV4ZWNmaWxlLCBkb24ndCB0cnkgdG8gcmVhZCBzeW0gZmlsZS4KKworCSogaW5mY21kLmMgKGRldGFjaF9jb21tYW5kKSBbQVRUQUNIX0RFVEFDSF06IERvbid0IHRyeSB0byBkZXRhY2gKKwlmcm9tIGluZmVyaW9yIHdoZW4gcmVtb3RlIGRlYnVnZ2luZy4KKworCSogc291cmNlLmMgKHJldmVyc2Vfc2VhcmNoX2NvbW1hbmQpOiBDaGFuZ2Ugd2hpbGUgdGVzdCBmcm9tIDEgdG8KKwlsaW5lID4gMS4KKworVHVlIEFwciAgMyAxODoxNDoxNCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiBWZXJzaW9uIDMuOTAuNC4KKworCSogTWFrZWZpbGUuZGlzdCAoZ2RiLnRhci5aKTogVXNlIC16IG9wdGlvbiB0byB0YXIgcmF0aGVyIHRoYW4KKwljcmVhdGluZyBnZGIudGFyIGFuZCBjYWxsaW5nIGNvbXByZXNzIHNlcGFyYXRlbHkuCisKKwkqIGJyZWFrcG9pbnQuYyAocmVhZF9tZW1vcnlfbm9icHQpOiBEbyBub3QgdHJlYXQgYmNvcHkgYXMgaWYgaXQKKwlyZXR1cm5lZCBhbiAiZXJybm8iIHZhbHVlLgorCisJKiB2YXJpb3VzOiBNYWtlIHN1cmUgZ2RiY29yZS5oIGlzIG5vdCBpbmNsdWRlZCBiZWZvcmUgYS5vdXQuaC4KKworCSogTWFrZWZpbGUuZGlzdCAoT1BDT0RFUyk6IEFkZCBtaXBzLW9wY29kZS5oLgorCisJKiBjb25maWcuZ2RiOiBQcmludCBsaXN0cyBvZiB7aG9zdHMsdGFyZ2V0c30gYWZ0ZXIgZmluZGluZyBzcmNkaXIuCisJV2hlbiBwYXJzaW5nICt7aG9zdCx0YXJnZXR9PSwgc3RyaXAgb2ZmICt7aG9zdCx0YXJnZXR9PSwgbm90ICt7eCx0fW09LgorCisJKiBNYWtlZmlsZS5kaXN0IChnZGIudGFyKTogRG8ge3QseH1jb25maWcgbm90IGp1c3QgY29uZmlnLgorCitNb24gQXByICAyIDAyOjQyOjIzIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIHNwYXJjLW9wY29kZS5oIChpbmMpOiBGaXggaW5jb3JyZWN0IGxvc2UgZmllbGQuCisKKwkqIHZhbGFyaXRoLmMgKHZhbHVlX3N1YnNjcmlwdGVkX3J2YWx1ZSk6IFVzZSBUQVJHRVRfQllURV9PUkRFUiwKKwlyYXRoZXIgdGhhbiBjaGVja2luZyBlbmRpYW5uZXNzIGF0IHJ1bnRpbWUuCisKKwkqIG1haW4uYyAoY29tYW5kX2xpbmVfaW5wdXQpOiBBY2NlcHQgY29tbWVudHMgYW55d2hlcmUsIG5vdAorCWp1c3QgYXQgc3RhcnRzIG9mIGxpbmVzLgorCitTYXQgTWFyIDMxIDIxOjU5OjM1IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIHN5bXRhYi5jIChjaGVja19zdHViX3R5cGUpOiBDYWxsIGxvb2t1cF9zeW1ib2wgd2l0aCA1IGFyZ3MuCisKK0ZyaSBNYXIgMzAgMTU6MjM6NTIgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogZnJhbWUuaDogI2luY2x1ZGUgcGFyYW0uaC4KKwlwYXJhbS5oOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLgorCisJKiBpMzg2LXRkZXAuYyAoaTM4Nl9nZXRfZnJhbWVfc2V0dXApOiBGaXggY29tbWVudCBhYm91dCB3aGF0CisJb3Bjb2RlIDB4NTUgaXMuCisJSWYgMHg4MSBvciAweDgzIGlzIGZvbGxvd2VkIGJ5IHNvbWV0aGluZyBiZXNpZGVzIDB4ZWMsCisJcHV0IGNvZGVzdHJlYW0gYmFjayB3aGVyZSBpdCB3YXMgYW5kIHJldHVybiAwLgorCVtVU0VfTUFDSElORV9SRUdfSF06IEluY2x1ZGUgPG1hY2hpbmUvcmVnLmg+IG5vdCA8c3lzL3JlZy5oPgorCU1vdmUgaW5jbHVkZSBvZiBhLm91dC5oIGFib3ZlIDxzeXMvdXNlci5oPi4KKwkoaTM4Nl9mcmFtZV9maW5kX3NhdmVkX3JlZ3MpOiBNYWtlIGxvY2FscyBzaWduZWQuCisJKGkzODZfZnJhbWVfZmluZF9zYXZlZF9yZWdzLCBpMzg2X3B1c2hfZHVtbXlfZnJhbWUsIGkzODZfcG9wX2ZyYW1lKToKKwlVc2UgUkVHSVNURVJfQllURVMsIFJFR0lTVEVSX1JBV19TSVpFLCBldGMuIHRvIGRlYWwgd2l0aCBmbG9hdGluZworCXBvaW50IHJlZ2lzdGVycy4KKworV2VkIE1hciAyOCAxODozMzo0MCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgbW9sZS5haS5taXQuZWR1KQorCisJKiBNYWtlZmlsZS5kaXN0IChPVEhFUlMpOiBBZGQgZ2RiLmR2aS4KKwkoZ2RiLmR2aSk6IE5ldyBydWxlLgorCisJKiBicmVha3BvaW50LmMgKF9pbml0aWFsaXplX2JyZWFrcG9pbnQpOiBDbGVhbiB1cCBkb2NzdHJpbmdzIHNvCisJYXMgbm90IHRvIG1lbnRpb24gc3ViY29tbWFuZHMgKGUuZy4gYXV0by1kaXNwbGF5KS4KKwlDYWxsIGFkZF9jbWQgbm90IGFkZF9hYmJyZXZfY21kIGZvciAiZGlzYWJsZSBicmVha3BvaW50IiBhbmQKKwlwdXQgaXQgaW4gY2xhc3NfYWxpYXMuCisKKwkqIGJyZWFrcG9pbnQuYyAoc2V0X2JyZWFrcG9pbnRfY291bnQpOiBOZXcgZnVuY3Rpb24uCisJKHNldF9icmVha3BvaW50LCBicmVha19jb21tYW5kXzEpOiBVc2UgaXQuCisKKwkqIGJyZWFrcG9pbnQuYyAoZ2V0X251bWJlcik6IE5ldyBmdW5jdGlvbi4KKwkoKl9jb21tYW5kLCBtYXBfYnJlYWtwb2ludF9udW1iZXJzKTogVXNlIGl0LgorCisJKiBpbmZwdHJhY2UuYyAod3JpdGVfaW5mZXJpb3JfbWVtb3J5KTogUmVtb3ZlIHJlbW90ZV9kZWJ1Z2dpbmcKKwlzdHVmZiAoaXMgaGFuZGxlZCBpbiBjb3JlLmMpLgorCShyZWFkX2luZmVyaW9yX21lbW9yeSk6IFJlbW92ZSAjaWYgMCdkIG91dCByZW1vdGVfZGVidWdnaW5nIGNvZGUuCisKK1R1ZSBNYXIgMjcgMTY6NTE6MjcgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IG1vbGUuYWkubWl0LmVkdSkKKworCSogaW5mZXJpb3IuaDogSW5jbHVkZSBmcmFtZS5oLgorCisJKiBmaW5kdmFyLmMgKHdyaXRlX3JlZ2lzdGVyKTogUmVwbGFjZSBzdW40ICNpZmRlZiB3aXRoCisJY2hlY2sgb2YgQ0FOTk9UX1NUT1JFX1JFR0lTVEVSLgorCXhtLXNwYXJjLmg6IERlZmluZSBDQU5OT1RfU1RPUkVfUkVHSVNURVIuCisKKwkqIHNwYXJjLXRkZXAuYzogUmVtb3ZlIHN1cGVyZmx1b3VzIGRlY2xhcmF0aW9uIG9mCisJZ2V0X2JyZWFrcG9pbnRfY29tbWFuZHMuCisKKwkqIGJyZWFrcG9pbnQue2MsaH06IEFkZCBicHN0YXQgc3R1ZmYuCisJYnBzdGF0X2RvX2FjdGlvbjogUmUtd29yayBkb19icmVha3BvaW50X2NvbW1hbmRzIGludG8gdGhpcy4KKwltYWluLmMgKGNvbW1hbmRfbG9vcCk6IENhbGwgYnBzdGF0X2RvX2FjdGlvbiBub3QKKwlkb19icmVha3BvaW50X2NvbW1hbmRzLgorCWluZmVyaW9yLmgsIGluZnJ1bi5jLCBicmVha3BvaW50LmMsIGluZmNtZC5jOgorCVJld29yayBicmVha3BvaW50X2NvbW1hbmRzIGFuZCBzdG9wX2JyZWFrcG9pbnQKKwlzdHVmZiB0byB1c2UgYnBzdGF0IGluc3RlYWQuCisKKwkqIGluZmNtZC5jIChwcm9ncmFtX2luZm8pOiAiaW5mbyByZWciLT4iaW5mbyByZWdpc3RlcnMiLgorCisJKiBucDEtb3Bjb2RlLmg6IFJlbmFtZWQgZnJvbSBucGwtb3Bjb2RlLmguCisJZ291bGQtcGluc24uYzogSW5jbHVkZSBucDEtb3Bjb2RlLmguCisJTWFrZWZpbGUuZGlzdCAoT1BDT0RFUyk6IENoYW5nZSBucGwtb3Bjb2RlLmggdG8gbnAxLW9wY29kZS5oCisKKwkqIGNvZmZyZWFkLmMgKHJlYWRfZW51bV90eXBlKTogU3RvcCByZWFkaW5nIHdoZW4gd2UgaGl0IC5lb3MuCisKK01vbiBNYXIgMjYgMTU6NTI6MzUgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogVmVyc2lvbiAzLjkwLjMuCisKKwkqIGJyZWFrcG9pbnQuYyAocmVhZF9tZW1vcnlfbm9icHQpOiBOZXcgZnVuY3Rpb24uCisJZ2RiY29yZS5oOiBEZWNsYXJlIHJlYWRfbWVtb3J5X3tub2JwdCxjaGVja30uCisJbWlwcy10ZGVwLmM6IFVzZSByZWFkX21lbW9yeV9ub2JwdCBub3QgYnJlYWtwb2ludF9zaGFkb3dfdmFsLgorCitGcmkgTWFyIDIzIDE0OjI2OjM4IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBtb2xlLmFpLm1pdC5lZHUpCisKKwkqIGluZmxvdy5jICh0ZXJtaW5hbF9pbmZlcmlvcik6IFJlZW5hYmxlIGNvbW1lbnRlZCBvdXQKKwlpbmZlcmlvcl90aGlzcnVuX3Rlcm1pbmFsIGNoZWNrLgorCSh0ZXJtaW5hbF9vdXJzXzEpOiBJZiBpbmZlcmlvcl90aGlzcnVuX3Rlcm1pbmFsIGlzIG5vbnplcm8sCisJcmV0dXJuIGltbWVkaWF0ZWx5LgorCisJKiBNYWtlZmlsZS5kaXN0OiBSZXdyaXRlIERFUEZJTEVTLCBNX0ZJTEUsIGV0Yy4gc3R1ZmYgdG8gZGVhbAorCXdpdGggaG9zdCAmIHRhcmdldCBzZXBhcmF0aW9uLgorCisJKiBjb25maWcvKjogU3BsaXQgaW50byB4Y29uZmlnLyogYW5kIHRjb25maWcvKi4KKwkqLWRlcC5jOiBTcGxpdCBpbnRvICoteGRlcC5jIGFuZCAqLXRkZXAuYy4KKworCSogbWFpbi5jIChtYWluKTogQWx3YXlzIHBhc3MgdHdvIGFyZ3MgdG8geHJlYWxsb2MuCisKK1RodSBNYXIgMjIgMjA6Mjk6MjUgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IG1vbGUuYWkubWl0LmVkdSkKKworCSogTWFrZWZpbGUuZGlzdCAoeyxkaXN0fWNsZWFuKTogcm0ge3gsdH1tLmggbm90IHBhcmFtLmgKKwl4Z2RiLm86IFJlbW92ZSBvYnNvbGV0ZSBkZXBlbmRlbmN5IChub3cgaW4gZGVwZW5kKS4KKworCSogYXJtLXBpbnNuLmM6IEluY2x1ZGUgYXJtLW9wY29kZS5oIG5vdCBvcGNvZGUuaC4KKworCSogbWlwcy1waW5zbi5jLCBtaXBzLW9wY29kZS5oOiBOZXcgZmlsZXMgZnJvbSBCb3RobmVyIChmcm9tCisJcmVsZWFzZSBvZiAyNCBKYW4gOTAgd2l0aCBtaXBzLW9wY29kZS5oIHBhdGNoIGZyb20gMSBGZWIgOTApLgorCisJKiB1dGlscy5jICh4bWFsbG9jKTogUmV0dXJuIE5VTEwgb24gcmVxdWVzdCBmb3IgMCBieXRlcy4KKworV2VkIE1hciAyMSAxMzozMDowOCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgbW9sZS5haS5taXQuZWR1KQorCisJKiBjb25maWcuZ2RiOiBSZS13cml0ZSBtYWNoaW5lIHN0dWZmIHRvIGRlYWwgd2l0aCBob3N0ICYgdGFyZ2V0LgorCisJKiB4bS1hbHRvcy5oOiBEb24ndCBkZWZpbmUgSEFWRV9XQUlUX1NUUlVDVC4KKworCSogbS0qLmg6IFNwbGl0IGludG8geG0tKi5oIGFuZCB0bS0qLmguCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IFB1dCAjaWZkZWYgc29ueV9uZXdzIGNvZGUKKwlpbiByZWdhcmRsZXNzIG9mIG1hY2hpbmUuCisKKwkqIHN5bXRhYi5jIChkZWNvZGVfbGluZV8xKTogQWRkIHF1b3RlcyBhbmQgY2FwaXRhbGl6ZSBlcnJvcgorCW1lc3NhZ2UgIm5vIGNsYXNzLCBzdHJ1Y3QsIG9yIHVuaW9uIG5hbWVkIi4KKworCSogTWFrZWZpbGUuZGlzdCAoY3BsdXMtZGVtLm8pOiBDb21waWxlIHdpdGggLURub3VuZGVyc2NvcmUuCisKKwkqIHN0YWNrLmMgKHByaW50X2ZyYW1lX2luZm8pOiBVc2UgcHJpbnRfc3ltYm9sIHRvIHByaW50IGZ1bmN0aW9uIG5hbWUuCisKKwkqIHN5bXRhYi5jIChvdXRwdXRfc291cmNlX2ZpbGVuYW1lKTogRG9uJ3QgcHJpbnQgYSBjb21tYSBpZgorCXdlIGFyZSBza2lwcGluZyBhIGZpbGVuYW1lIGFscmVhZHkgcHJpbnRlZC4KKworVHVlIE1hciAyMCAxMDo0ODo1NCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgbW9sZS5haS5taXQuZWR1KQorCisJKiBzeW10YWIuYyAob3V0cHV0X3NvdXJjZV9maWxlbmFtZSk6IERvbid0IHByaW50IGEgZmlsZW5hbWUKKwltb3JlIHRoYW4gb25jZS4KKworCSogdXRpbHMuYyAoZnByaW50X3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KKwlkZWZzLmg6IERlY2FsYXJlIGl0LgorCXZhcmlvdXM6IFVzZSBmcHJpbnRfc3ltYm9sIHRvIHByaW50IHN5bWJvbCBuYW1lcy4KKwlNYWtlZmlsZS5kaXN0IChTRklMRVMsIE9CUyk6IEFkZCBjcGx1cy1kZW0ue2Msb30uCisKK01vbiBNYXIgMTkgMTc6MTE6MDMgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IG1vbGUuYWkubWl0LmVkdSkKKworCSogY29mZnJlYWQuYyAocmVhZF9maWxlX2hkcik6IEFkZCBNQzY4Sz8/TUFHSUMuCisKKwkqIGNvZmZyZWFkLmMgKHJlYWRfY29mZl9zeW10YWIpOiBJZ25vcmUgc3diZWcgYW5kIHN0cmluZyBsYWJlbAorCXN5bWJvbHMuCisKKwkqIGNvZmZyZWFkLmMgKHJlYWRfY29mZl9zeW10YWIpOiBJbmNyZW1lbnQgbnVtX29iamVjdF9maWxlcworCWluIGNhc2UgQ19TVEFUIG5vdCBDX0ZJTEUuCisJTmV3IHZhcmlhYmxlIGluX3NvdXJjZV9maWxlLiAgU2V0IGl0IGluIGNhc2UgQ19GSUxFLgorCUNoZWNrIGl0IGluIGNhc2UgQ19TVEFULgorCisJKiBjb2ZmcmVhZC5jIFtGVU5DVElPTl9FUElMT0dVRV9TSVpFXTogTmV3IGNvZGUuCisJbS11bWF4LmggKEZVTkNUSU9OX0VQSUxPR1VFX1NJWkUpOiBEZWZpbmUuCisKKwkqIGNvbmZpZy8zYjE6IE5ldyBmaWxlLgorCisJKiBjb25maWcvc3VuKjogUHJpbnQgbWVzc2FnZSB3YXJuaW5nIHBlb3BsZSB0byB1c2UgR0FTIHdpdGggR0NDLgorCitTdW4gTWFyIDE4IDAyOjU2OjQwIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBtb2xlLmFpLm1pdC5lZHUpCisKKwkqIGluZmNtZC5jIChydW5fc3RhY2tfZHVtbXkpOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZS4KKworCSogbS02OGsuaCAoUkVHSVNURVJfVklSVFVBTF9UWVBFKTogTWFrZSBwYywgZnAsIHNwIGNoYXIgKi4KKworCSogbS1taXBzLmggKExPTkdFU1QsIEJVSUxUSU5fVFlQRV9MT05HRVNUKTogUmVtb3ZlLgorCitTYXQgTWFyIDE3IDIxOjI3OjQ5IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBtb2xlLmFpLm1pdC5lZHUpCisKKwkqIG1pcHMtZGVwLmM6IFJlbW92ZSBpbmZwdHJhY2UuYyBzdHVmZi4KKworCSogbS1iaWdtaXBzLmg6IE5ldyBmaWxlLgorCW0tbWlwcy5oIFtNSVBTRUJdOiBSZW1vdmUgKl9CSUdfRU5ESUFOIHN0dWZmLgorCisJKiBtLXNwYXJjLmggKEZJWF9DQUxMX0RVTU1ZKTogRG8gbm90IGluc2VydCB1bmltcCBpbnN0cnVjdGlvbgorCWlmIGZ1bmN0aW9uIHdhcyBjb21waWxlZCB3aXRoIGdjYy4KKworCSogbS1taXBzLmg6IFJlbW92ZSBGSVhfQ0FMTF9EVU1NWV9BTElHTkVEIGFuZCBtYWtlIEZJWF9DQUxMX0RVTU1ZCisJdXNlIG5ldyBhcmdzLgorCisJKiB2YWxvcHMuYyAoY2FsbF9mdW5jdGlvbik6IE5ldyBhcmdzIHRvIEZJWF9DQUxMX0RVTU1ZLgorCW0tKi5oIChGSVhfQ0FMTF9EVU1NWSk6IFRha2UgbmV3IGFyZ3MuCisKKwkqIHZhbHVlcy5jICh1c2luZ19zdHJ1Y3RfcmV0dXJuKTogTmV3IHBhcmFtZXRlciBnY2NfcC4KKwl2YWxvcHMuYyAoY2FsbF9mdW5jdGlvbik6IE5ldyB2YXJpYWJsZSB1c2luZ19nY2MuCisJdmFsb3BzLmMgKGNhbGxfZnVuY3Rpb24pIFtSRUdfU1RSVUNUX0hBU19BRERSXTogTmV3IGNvZGUuCisKKwkqIG0tbWlwcy5oLCBtaXBzLWRlcC5jOiBOZXcgZmlsZXMgZnJvbSBGb3Jpbi4KKwltLW1pcHMuaDogUmVwbGFjZSBSRVRVUk5fU1RSVUNUX0JZX1JFRiB3aXRoIFVTRV9TVFJVQ1RfQ09OVkVOVElPTi4KKworRnJpIE1hciAxNiAxMzoxNzoxOSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiBNYWtlZmlsZS5kaXN0OiBBZGQgc29tZSBkZXBlbmRlbmNpZXMgb2YgbS0qLmggZmlsZXMuCisJKEhGSUxFUyk6IEFkZCBtLTY4ay5oLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfc3RydWN0X3R5cGUpOiBQdXQgIm9wZXJhdG9yKyIgbm90ICJvcGVyYXRvciArIgorCWluIHN5bXRhYi4KKworCSogY29yZS5jOiBTcGxpdCByZWFkX21lbW9yeSBpbnRvIHJlYWRfbWVtb3J5X2NoZWNrIGFuZCByZWFkX21lbW9yeS4KKwlicmVha3BvaW50LmMgKGluc2VydF9icmVha3BvaW50cyk6IElmIGNhbid0IHJlYWQgbWVtb3J5LAorCXRlbGwgdXNlciB0aGF0IGVycm9yIHdhcyBkdWUgdG8gc2V0aW5nIGJyZWFrcG9pbnRzLgorCitUaHUgTWFyIDE1IDExOjQ3OjE5IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIGluZnJ1bi5jIFtDT0ZGX0VOQ0FQU1VMQVRFXTogSW5jbHVkZSBhLm91dC5lbmNhcC5oLgorCisJKiBibG9ja2ZyYW1lLmMgKEZSQU1FTEVTU19MT09LX0ZPUl9QUk9MT0dVRSk6IE1ha2UgaXQgYSBmdW5jdGlvbi4KKwl2YXJpb3VzIG0tKi5oOiBDYWxsIGZ1bmN0aW9uIG5vdCBtYWNyby4KKwlmcmFtZS5oOiBEZWNsYXJlIHRoZSBmdW5jdGlvbi4KKworV2VkIE1hciAxNCAwMjo0NDo1MSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiBzcGFyYy1kZXAuYzogSW5jbHVkZSBzaWduYW1lLmguCisKKwkqIHNwYXJjLXBpbnNuLmMgKHByaW50X2luc24pOiBXaGVuIGxvb2tpbmcgZm9yIHNldGhpIGJlZm9yZQorCWRlbGF5ZWQgYnJhbmNoLCBjYWxsIHJlYWRfbWVtb3J5X25vZXJyIG5vdCByZWFkX21lbW9yeS4KKworCSogbS1pc2kuaCwgbS1zdW4zLmgsIG0tbmV3cy5oLCBtLWhwMzAwYnNkLmgsIG0tYWx0b3MuaCwKKwltLWhwMzAwaHB1eC5oLCBtLXN1bjIuaDogTWVyZ2UgbWFjaGluZSBzdHVmZiBleGNlcHQgaW5mZXJpb3IKKwlmdW5jdGlvbiBjYWxsIHN0dWZmIGludG8gbmV3IGZpbGUgbS02OGsuaC4gIENyZWF0ZSBtLTNiMS5oLgorCitUdWUgTWFyIDEzIDIxOjM0OjMzIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIGluZmxvdy5jIChuZXdfdHR5KTogSWYgY2FuJ3Qgb3BlbiB0dHksIHByaW50IGVycm9yIG1lc3NhZ2UKKwliZWZvcmUgZXhpdGluZy4KKworCSogYmxvY2tmcmFtZS5jOiBSZW1vdmUgZGVjbGFyYXRpb24gb2YgcHN5bXRhYl90b19zeW10YWIuCisJc3ltdGFiLmg6IERlY2xhcmUgcHN5bXRhYl90b19zeW10YWIuCisJYmxvY2tmcmFtZS5jOiBSZW1vdmUgZGVjbGFyYXRpb25zIG9mIGJsb2NrX2Zvcl9wYyBhbmQKKwlmaW5kX3BjX2Z1bmN0aW9uX3N0YXJ0LgorCWZyYW1lLmg6IEFkZCBkZWNsYXJhdGlvbnMgb2YgYmxvY2tfZm9yX3BjIGFuZCBmaW5kX3BjX2Z1bmN0aW9uX3N0YXJ0LgorCVJlbW92ZSBkZWNsYXJhdGlvbiBvZiBub25leGlzdGVudCBmdW5jdGlvbiBmaW5kX3BjX2Z1bmN0aW9uLgorCXZhbHVlcy5jOiBpbmNsdWRlIGZyYW1lLmggaW5zdGVhZCBvZiBkZWNsYXJpbmcgYmxvY2tfZm9yX3BjLgorCisJKiBWZXJzaW9uIDMuOTAuMi4KKworTW9uIE1hciAxMiAxNDoyMDowNiAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiBtYWluLmMgKG1haW4pOiBEZWxldGUgc3VwZXJmbHVvdXMgImUiIGZyb20gbG9uZ19vcHRpb25zLgorCitTYXQgTWFyIDEwIDE1OjQ3OjIzIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6IFByaW50IDwlZCBiaXQgaW50ZWdlcj4gbm90IGp1c3QKKwk8bGFyZ2UgaW50ZWdlcj4uCisKKwkqIGRieHJlYWQuYyAoZXJyb3JfdHlwZSk6IEZpeCBsb29wIHRoYXQgZmluZHMgJ1wwJyBzbyB0aGF0IG9uCisJZXhpdCwgKnBwIHBvaW50cyB0byB0aGUgJ1wwJywgbm90IHRoZSBjaGFyYWN0ZXIgYWZ0ZXIuCisJKHJlYWRfdHlwZSk6IE1ha2Ugc3VyZSB0aGF0IHBsYWNlcyB3aGljaCBjYWxsIHJlYWRfdHlwZSBhbmQgdGhlbgorCXRyeSB0byByZWFkIG1vcmUgaW5wdXQgc3RvcCBpbW1lZGlhdGVseSB3aXRoIGFub3RoZXIgZXJyb3IKKwl1cG9uIGVuY291bnRlcmluZyAnXDAnLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfcmFuZ2VfdHlwZSk6IEZpeCBjaGVjayBmb3IgbGFyZ2Ugc2lnbmVkCisJaW50ZWdyYWwgdHlwZSB0byBtYXRjaCBjb21tZW50IGFuZCByZWFsaXR5LiAgU2V0IFRZUEVfTEVOR1RIIGJhc2VkCisJb24gbjJiaXRzIGZvciBzaWduZWQsIG4zYml0cyBmb3IgdW5zaWduZWQuCisKKwkqIGluZmNtZC5jIChjb250X2NvbW1hbmQpOiBQcmludCB3YXJuaW5nIG1lc3NhZ2UgaWYgd2UKKwlkZWNpZGUgdG8gaWdub3JlIHRoZSBhcmd1bWVudC4KKworCSogZ2RiLnRleGluZm8gKGF0dGFjaCk6IEB4cmVme0F0dGFjaH0gLT4gQHhyZWZ7UmVtb3RlfS4KKworRnJpIE1hciAgOSAxNjoyNjo0NyAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiBzeW10YWIuaCAoYWRkcmVzc19jbGFzcyk6IFJlaW5zdGF0ZSBMT0NfRVhURVJOQUwgd2l0aCByZXdyaXR0ZW4KKwljb21tZW50LgorCisJKiBleHByZWFkLnkgKHl5ZXJyb3IsIHBhcnNlX2NfMSk6IE1ha2UgeXllcnJvciB0YWtlIGEgY2hhciAqIGFyZy4KKworCSogbWFpbi5jIChzeW1ib2xfY29tcGxldGlvbl9mdW5jdGlvbik6IERvbid0IGNhbGwgZXJyb3IoKSBvbgorCSJpbmZvIGprbGRza2YiLgorCisJKiBtLW5wbC5oIChVU0VfU1RSVUNUX0NPTlZFTlRJT04pOiBDaGFuZ2UgPj0gdG8gPi4KKworVGh1IE1hciAgOCAwMDoxOTowMSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiBzeW1zZWcuaDogTnVrZSBtb3JlIHN5bXNlZyByZWZlcmVuY2VzIGluY2x1ZGluZyBMT0NfRVhURVJOQUwuCisJUHV0IGNvbnRlbnRzIG9mCXN5bXNlZy5oIGludG8gc3ltdGFiLmggYW5kIHJlbW92ZSBzeW1zZWcuaC4KKworV2VkIE1hciAgNyAxODowMjoxNSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiBzeW10YWIuaCAoU1lNQk9MX0xJTkUpOiBOZXcgbWFjcm8uCisJc3ltdGFiLmMgKGRlY29kZV9saW5lXzEpOiBBY2NlcHQgdmFyaWFibGUgYXMgd2VsbCBhcyBmdW5jdGlvbi4KKwlMb29rdXAgdmFyaWFibGUvZnVuY3Rpb24gaW4gc2VsZWN0ZWQgYmxvY2sgaWYgbm8gZmlsZSBzcGVjaWZpZWQuCisJcHJpbnRjbWQuYzogI2lmIDAgb3V0IHdoZXJlaXNfY29tbWFuZC4KKworCSogY29tbWFuZC5jIChkb19zZXRzaG93X2NvbW1hbmQpOiBDYWxsIGZ1bmN0aW9uIHdpdGggYWRkaXRpb25hbAorCWFyZ3VtZW50IEMuCisJbWFpbi5jIChzZXRfaGlzdG9yeV9zaXplX2NvbW1hbmQpOiBUYWtlIGFyZ3VtZW50IEMuCisJKHNldF92ZXJib3NlKTogTmV3IGZ1bmN0aW9uIHRvIHNldCBkb2NzdHJpbmcuCisJKGluaXRpYWxpemVfbWFpbik6IFB1dCBzZXRfdmVyYm9zZSBpbiBjb21tYW5kIGxpc3QuCisJY29tbWFuZC5jIChsb29rdXBfY21kXzEpOiBBY2NlcHQgcmVzdWx0X2xpc3QgTlVMTC4KKworCSogdmFscHJpbnQuYyAoX2luaXRpYWxpemVfdmFscHJpbnQpOiBDaGFuZ2UgZG9jc3RyaW5nIGZvcgorCSJzZXQgdW5pb25wcmludCIgdG8gbm9ybWFsIHNldC9zaG93IGZvcm0uCisKKwkqIGNvbW1hbmQuYyAoYWRkX3Nob3dfZnJvbV9zZXQpOiBDaGVjayB0aGF0IGRvY3N0cmluZyBzdGFydHMgd2l0aAorCSJTZXQgIiBiZWZvcmUgYXNzdW1pbmcgaXQgZG9lcy4KKworCSogbWFpbi5jIChzaG93X2hpc3RvcnkpOiBDYWxsIGNtZF9zaG93X2xpc3QuCisJY29tbWFuZC57YyxofSAoY21kX3Nob3dfbGlzdCk6IE5ldyBmdW5jdGlvbi4KKwljb21tYW5kLmg6IERlY2xhcmUgZG9fc2V0c2hvd19jb21tYW5kLgorCisJKiBjb21tYW5kLmggKGNtZF9saXN0X2VsZW1lbnQpOiBOZXcgZmllbGQgY29tcGxldGVyLgorCW1haW4uYyAoc3ltYm9sX2NvbXBsZXRpb25fZnVuY3Rpb24pOiBVc2UgaXQuCisJc3ltdGFiLmg6IERlY2xhcmUgbWFrZV9zeW1ib2xfY29tcGxldGlvbl9saXN0LgorCWNvbW1hbmQuYyAoYWRkX2NtZCk6IFNldCBjb21wbGV0ZXIuCisJbWFpbi5jLCBnZGJjbWQuaCAobm9vcF9jb21wbGV0ZXIpOiBOZXcgZnVuY3Rpb24uCisJaW5mY21kLmM6IFNldCBjb21wbGV0ZXIgZm9yIGVudmlyb25tZW50IGZ1bmN0aW9ucy4KKworCSogc3ltdGFiLmMgKHR5cGVzX2luZm8sIF9pbml0aWFsaXplX3N5bXRhYik6ICNpZiAwIG91dC4KKwl2YXJpb3VzOiBVc2UgZnB1dHNfZmlsdGVyZWQsIG5vdCBmcHJpbnRmX2ZpbHRlcmVkKCVzKS4KKworCSogdmFscHJpbnQuYyAodHlwZV9wcmludF9iYXNlKTogQ2hlY2sgZm9yIGludGVnZXJzIGxhcmdlciB0aGFuCisJTE9OR0VTVC4KKworCSogc3VuMy1kZXAuYzogSW5jbHVkZSAic2lnbmFtZS5oIiBpbnN0ZWFkIG9mIGRpcmVjdGx5IGRlY2xhcmluZworCXN5c19zaWdsaXN0LgorCitUdWUgTWFyICA2IDE0OjU5OjM0IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIGluZnJ1bi5jIChzaWduYWxzX2luZm8pOiBBbGxvdyBhcmd1bWVudCB0byBiZSBhIHNpZ25hbCBuYW1lCisJYXMgd2VsbCBhcyBhbiBleHByZXNzaW9uLgorCShoYW5kbGVfY29tbWFuZCk6IENoZWNrIGZvciBlcnJvciBmcm9tIHNpZ19udW1iZXIuCisKKwkqIG1haW4uYyAoZmxvYXRfaGFuZGxlcik6IENoYW5nZSBlcnJvciBtZXNzYWdlLgorCisJKiBpbmZsb3cuYyAoY3JlYXRlX2luZmVyaW9yKTogSWYgZ2V0ZW52ICgiU0hFTEwiKSBleGlzdHMsIHVzZSBpdAorCWluc3RlYWQgb2YgL2Jpbi9zaC4KKworCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIsIGNhc2UgTl9TTyk6IE5ldyB2YXJpYWJsZSBmaXJzdF9zeW1udW0uCisJUGFzcyBpdCB0byB7c3RhcnQsZW5kfV9wc3ltdGFiLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfb2ZpbGVfc3ltdGFiKTogSW5jcmVtZW50IHN5bWJ1Zl9pZHggYW5kIHN5bW51bQorCXdoZW4gY2FsbGluZyBwcm9jZXNzX3N5bWJvbF9wYWlyLgorCisJKiBzeW10YWIuYyAoc291cmNlc19pbmZvLCBvdXRwdXRfc291cmNlX2ZpbGVuYW1lKToKKwlSZS13cml0ZSBzbyBvdXRwdXRfc291cmNlX2ZpbGVuYW1lIHRha2VzIGEgZmlyc3QgcGFyYW1ldGVyCisJaW5zdGVhZCBvZiBhIG5leHQgb25lLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYiwgY2FzZSBOX1NPKTogV2hlbiBpbmNyZW1lbnRpbmcKKwlzeW1idWZfaWR4LCBpbmNyZW1lbnQgc3ltbnVtIGFsc28uCisKKwkqIHZhbHVlcy5jIChzZXRfaW50ZXJuYWx2YXJfY29tcG9uZW50KTogVXNlIFZBTFVFX0NPTlRFTlRTLAorCW5vdCBWQUxVRV9DT05URU5UU19SQVcuCisKKwkqIHN5bW1pc2MuYyAoZnJlZV9zeW10YWIpOiBEb24ndCBmcmVlIGZpbGVuYW1lIChub3cgaW4gc3ltYm9sX29ic3RhY2spLgorCisJKiBlbnZpcm9uLmMgKGluaXRfZW52aXJvbik6IENvcHkgZW50aXJlIHN0cmluZywgaW5jbHVkaW5nCisJdGVybWluYXRpbmcgJ1wwJy4KKworCSogdmFsdWUuaCwgdmFsdWVzLmM6IFJlbmFtZSB2YWx1ZV9sYXp5IHRvIHZhbHVlX2ZldGNoX2xhenkuCisJdmFsdWVzLmMgKHZhbHVlX29mX2ludGVybmFsdmFyKTogQ2FsbCB2YWx1ZV9mZXRjaF9sYXp5LgorCisJKiBkYnhyZWFkLmMgKHJlYWRfaHVnZV9udW1iZXIpOiBSZXR1cm4gYW4gZXJyb3Igb24gZW5jb3VudGVyaW5nCisJYSBsYXJnZSBkZWNpbWFsIG51bWJlci4KKworCSogZGJ4cmVhZC5jIChyZWFkX2h1Z2VfbnVtYmVyKTogUmV2ZXJzZSBzZW5zZSBvZiBvdmVyZmxvdyB0ZXN0LgorCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnQsIGNhc2UgVFlQRV9DT0RFX0lOVCk6IENoZWNrIGZvciBpbnRlZ2VycworCWxhcmdlciB0aGFuIExPTkdFU1QuCisKKwkqIGRieHJlYWQuYyAocmVhZF9vZmlsZV9zeW10YWIpOiBXaGVuIGNhbGxpbmcgcHJvY2Vzc19vbmVfc3ltYm9sLAorCWNhbGwgaXQgd2l0aCBkZXNjIGFuZCB2YWx1ZSByYXRoZXIgdGhhbiB3aXRoIGJ1ZnAtPm5fe2Rlc2MsdmFsdWV9LgorCisJKiBkZWZzLmggKExPTkdfTUFYKTogRGVmaW5lLgorCisJKiBzdW4zLWRlcC5jOiBEZWNsYXJlIHN5c19zaWdsaXN0LgorCisJKiBpbmZwdHJhY2UuYzogTW92ZSBpbmNsdWRlIG9mIGdkYmNvcmUuaCBhZnRlciBhLm91dC5oCisKKwkqIE1ha2VmaWxlLmRpc3QgKGV4cHJlYWQubywgbWNoZWNrLm8pOiBSZW1vdmUgbGVhZGluZyAiLi8iIG5vdAorCWxlYWRpbmcgIi4iLgorCisJKiBtLWhwMzAwaHB1eC5oIFshSFBVWF9WRVJTSU9OXzVdOiBEZWZpbmUgS0VSTkVMX1VfQUREUl9IUFVYLgorCWluZnB0cmFjZS5jIFtLRVJORUxfVV9BRERSX0hQVVhdIFtLRVJORUxfVV9BRERSX0JTRF06CisJU2V0IGtlcm5lbF91X2FkZHIgdXNpbmcgbmxpc3QoKS4KKwltLWhwMzAwYnNkLmg6IERlZmluZSBLRVJORUxfVV9BRERSX0JTRC4KKworTW9uIE1hciAgNSAxNjo1Mjo0MSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYik6IElmIHZhbHVlIG9mIC5vIHN5bWJvbCBpcyBjcmF6eSwKKwlkb24ndCBlbmQgcHN5bXRhYi4KKworCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIpOiBJZ25vcmUgZmlyc3Qgb2YgYSBwYWlyIG9mIE5fU08KKwl3aGVuIGJvdGggYXBwZWFyLgorCShzdGFydF9zdWJmaWxlLCBzdGFydF9zeW10YWIpOiBFeHRyYSBwYXJhbWV0ZXIgZGlybmFtZS4KKwkoc3RhcnRfc3ViZmlsZSk6IFVzZSBvYnNhdmVzdHJpbmcsIG5vdCBzYXZlc3RyaW5nLCBmb3IgbmFtZS4KKwl2YXJpb3VzOiBDYWxsIHN0YXJ0X3tzdWJmaWxlLHN5bXRhYn0gd2l0aCBleHRyYSBhcmd1bWVudC4KKwkoZW5kX3N5bXRhYik6IFNldCBkaXJuYW1lIGZpZWxkIGluIHN5bXRhYi4KKwkocmVhZF9vZmlsZV9zeW10YWIpOiBDYWxsIHByb2Nlc3Nfc3ltYm9sX3BhaXIgb24gcGFpciBvZiBOX1NPLgorCShwcm9jZXNzX3N5bWJvbF9wYWlyKTogTmV3IGZ1bmN0aW9uLgorCXN5bXRhYi5oIChzeW10YWIpOiBOZXcgZmllbGQgZGlybmFtZS4KKwlzb3VyY2UuYyAob3Blbl9zb3VyY2VfZmlsZSk6IE5ldyBmdW5jdGlvbi4KKwlzb3VyY2UuYzogVXNlIG9wZW5fc291cmNlX2ZpbGUgaW5zdGVhZCBvZiBvcGVucCB3aGVyZSBhcHByb3ByaWF0ZS4KKworCSogZGVmcy5oIChUQVJHRVRfQ0hBUl9CSVQpOiBEZWZpbmUuCisKK1N1biBNYXIgIDQgMTM6MTE6NDggMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jIChmaWxsX3N5bWJ1Zik6IFByaW50IGVycm9yIG1lc3NhZ2VzIG5pY2VseS4KKworCSogTWFrZWZpbGUuZGlzdCAoU0ZJTEVTKTogUHV0IHN0YW5kYWxvbmUuYyBhdCBlbmQuCisKKwkqIE1ha2VmaWxlLmRpc3QgKGFsbGRlcHMubWFrKTogUHV0IG91dCBiYWNrc2xhc2ggYWZ0ZXIgYXJtLWNvbnZlcnQucy4KKworCSogc3ltdGFiLntjLGh9IChidWlsdGluX3R5cGVfZXJyb3IpOiBOZXcgdHlwZS4KKwlzeW1zZWcuaCAodHlwZV9jb2RlKTogQWRkIFRZUEVfQ09ERV9FUlJPUi4KKwl2YWxwcmludC5jICh2YWxfcHJpbnQsIHR5cGVfcHJpbnRfYmFzZSksCisJdmFsdWVzLmMgKHVzaW5nX3N0cnVjdF9yZXR1cm4sIHNldF9yZXR1cm5fdmFsdWUpOgorCUNoZWNrIGZvciBhbmQgZGVhbCB3aXRoIFRZUEVfQ09ERV9FUlJPUi4KKwlkYnhyZWFkLmMgKGVycm9yX3R5cGUpOiBOZXcgZnVuY3Rpb24KKwkocmVhZF90eXBlIGFuZCBzdWJyb3V0aW5lcyk6IENhbGwgZXJyb3JfdHlwZSBpbnN0ZWFkIG9mIGVycm9yLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfaHVnZV9udW1iZXIpOiBOZXcgZnVuY3Rpb24uCisJKHJlYWRfcmFuZ2VfdHlwZSk6IFVzZSByZWFkX2h1Z2VfbnVtYmVyIGFuZCBjaGVjayByZXN1bHRzCisJdG8gc2VlIGlmIGl0IGlzIGEgbGFyZ2UgaW50ZWdyYWwgdHlwZS4KKworCSogc3ltbWlzYy5jOiBSZW1vdmUgc3ltc2VnIHN0dWZmLgorCisJKiBHb3VsZCBOUDEgY2hhbmdlcyBmcm9tIChvciBpbnNwaXJlZCBieSkgY2hwbWpkQGdkci5iYXRoLmFjLnVrCisJZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIpIFtOX05CU1RTXToKKwlUcmVhdCB0aGlzIGFuZCBOX05CTENTIGxpa2UgTl9MQ1NZTSwgZXRjLgorCShwcm9jZXNzX29uZV9zeW1ib2wpIFtCTE9DS19BRERSRVNTX0FCU09MVVRFXTogTmV3IGNvZGUuCisJbS1ucGwuaCAoVVNFX1NUUlVDVF9DT05WRU5USU9OKTogQWRkLgorCShJR05PUkVfU1lNQk9MKTogQWRkIDB4YTQuCisJKEVORF9PRl9URVhUX0RFRkFVTFQpOiBSZW1vdmUuCisJKFNUUklOR19UQUJMRV9PRkZTRVQpOiBkb24ndCBhZGQgc2l6ZW9mKGludCkuCisJWyFIQVZFX1ZQUklOVEZdOiBEZWZpbmUgdnByaW50ZiB0byBiZSBkb3BybnQsIG5vdCBwcmludGYuCisJKEJMT0NLX0FERFJFU1NfQUJTT0xVVEUpOiBEZWZpbmUuCisJKEJSRUFLUE9JTlQpOiBQYWQgdG8gc2l6ZSBvZiBtYWNoaW5lIHdvcmQuCisJKFNBVkVEX1BDX0FGVEVSX0NBTEwpOiBSZW1vdmUgYCBhdCBzdGFydCBvZiBsaW5lICghKS4KKwkoUjJfUkVHTlVNKTogRGVmaW5lLgorCShTUF9SRUdOVU0sIEZQX1JFR05VTSk6IFN3aXRjaCBkZWZpbml0aW9ucy4KKwkoUkVHSVNURVJfVV9BRERSKTogVXNlIEZQX1JFR05VTSBpbiBwbGFjZSBvZiBTUF9SRUdOVU0uCisJKFNUT1JFX1NUUlVDVF9SRVRVUk4sIEVYVEFDVF9SRVRVUk5fVkFMVUUsIFNUT1JFX1JFVFVSTl9WQUxVRSwKKwljYWxsIGZ1bmN0aW9uIHN0dWZmKToKKwlSZXBsYWNlIGJvZ3VzIGRlZmluaXRpb25zIHdpdGggY29ycmVjdCBvbmVzIGZvciBOUDEuCisJKENBTk5PVF9FWEVDVVRFX1NUQUNLKTogRGVmaW5lLgorCShGUkFNRV9MT0NBTFNfQUREUkVTUyk6IERvbid0IGFkZCA4MC4KKwkoRlJBTUVfRklORF9TQVZFRF9SRUdTKTogQWxzbyBnZXQgU1AuCisJZ291bGQtcGluc24uYyAoZmluZGZyYW1lKTogTW92ZSBmcmFtZWNoYWluIGRlY2xhcmF0aW9uIG91dHNpZGUgI2lmIDAuCisJaW5mcHRyYWNlLmMgKHdyaXRlX2luZmVyaW9yX21lbW9yeSk6IENoZWNrIGFkZHIgYWdhaW5zdCB0ZXh0X2VuZAorCWFuZCB1c2UgUFRfV1JJVEVfSSBvciBQVF9XUklURV9EIGFzIGFwcHJvcHJpYXRlLgorCShzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMpOiBEb24ndCB0cnkgdG8gd3JpdGUgcmVnaXN0ZXJzIGluCisJQ0FOTk9UX1NUT1JFX1JFR0lTVEVSLgorCW0tbnBsLmggKENBTk5PVF9TVE9SRV9SRUdJU1RFUik6IERlZmluZS4KKwlucGwtb3Bjb2RlLmggKGxpbCk6IDB4ZjgwODAwMDAgLT4gMHhmODBiMDAwMC4KKwkKKwkqIG11bmNoOiBEaXN0aW5ndWlzaCBiZXR3ZWVuIEJTRCBhbmQgU3lzdGVtIFYgbm0gYnkgYWN0dWFsbHkKKwlzZWVpbmcgd2hhdCBvdXRwdXQgZnJvbSBubSBsb29rcyBsaWtlLgorCitGcmkgTWFyICAyIDEzOjQzOjM2IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIHByaW50Y21kLmMgKHByaW50X2ZyYW1lX2FyZ3MpOiBDaGFuZ2UgaGlnaGVzdF9vZmZzZXQgdG8gcG9pbnQKKwl0byBuZXh0IHVucHJpbnRlZCBhcmcuCisKKwkqIG1haW4uYyAobWFpbik6IFByaW50ICJ0eXBlIGhlbHAgZm9yIGxpc3Qgb2YgY29tbWFuZHMiIGFsb25nCisJd2l0aCB0aGUgdmVyc2lvbi4gIEZvbGxvdyBpdCB3aXRoIGEgYmxhbmsgbGluZS4KKworVGh1IE1hciAgMSAxNDo0OToyNiAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiB2YWxwcmludC5jOiBNb3ZlIHByaW50X2FkZHJlc3MgZm9yIGZ1bmN0aW9uIGZyb20gdmFsdWVfcHJpbnQKKwl0byB2YWxfcHJpbnQuCisKK1dlZCBGZWIgMjggMTU6MDY6MTIgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogTWFrZWZpbGUuZGlzdCAobS1zdW40b3M0LmgpOiBEZXBlbmQgb24gbS1zcGFyYy5oCisKKwkqIE1ha2VmaWxlLmRpc3QgKHZlcnNpb24uYyk6IERlcGVuZCBvbiBNYWtlZmlsZS5kaXN0LCBub3QgTWFrZWZpbGUuCisKKwkqIE1ha2VmaWxlLmRpc3Q6IENoYW5nZSBNQUtFRklMRVMgdG8gTWFrZWZpbGVzLgorCisJKiBzeW10YWIuaDogRGVjbGFyZSBnZXRfc3ltX2ZpbGUuCisJY29yZS5jOiBJbmNsdWRlIHN5bXRhYi5oLgorCisJKiBNb3ZlIHNpZ25hbCBuYW1lIHN0dWZmIGZyb20gdXRpbHMuYyB0byBzaWduYW1lLmMKKwlNb3ZlIHNpZ25hbCBuYW1lIHN0dWZmIGZyb20gZGVmcy5oIHRvIHNpZ25hbWUuaC4KKwlNYWtlZmlsZS5kaXN0IChTRklMRVMsIEhGSUxFUywgT0JTKTogQWRkIHNpZ25hbWUue2MsaCxvfS4KKworTW9uIEZlYiAyNiAxMjowMzoxMiAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiBjb21tYW5kLmMgKGFkZF9jbWQpOiBEb24ndCBjYWxsIHNhdmVzdHJpbmcgb24gbmFtZS4KKworU3VuIEZlYiAyNSAxNTo1MjoxOCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiBwcmludGNtZC5jIChwcmludF9mcmFtZV9hcmdzKTogTWFrZSBoaWdoZXN0X29mZnNldCBhbiBpbnQuCisJTmV3IHZhcmlhYmxlIGFyZ3NfcHJpbnRlZC4KKwkocHJpbnRfZnJhbWVfbmFtZWxlc3NfYXJncyk6IFJlbW92ZSBwYXJhbWV0ZXIgZW5kIGFuZCBhZGQgbnVtCisJYW5kIGZpcnN0LgorCShwcmludF9mcmFtZV9hcmdzKTogQ2hhbmdlIGNhbGwgdG8gcHJpbnRfZnJhbWVfbmFtZWxlc3NfYXJncy4KKworRnJpIEZlYiAyMyAyMTo0MDoxNSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiBzdGFjay5jICh1cF9jb21tYW5kLCBkb3duX2NvbW1hbmQpOgorCU9ubHkgcHJpbnQgc3RhY2sgZnJhbWUgaWYgZnJvbV90dHkuCisKK1RodSBGZWIgMjIgMTI6MDE6MzYgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogZXhwcmVhZC55OiBJbmxjdWRlIHZhbHVlLmggYW5kIGRvbid0IGNhc3QgcmV0dXJuIHZhbHVlIGZyb20KKwlsb29rdXBfaW50ZXJuYWx2YXIuCisKKwkqIGluZnJ1bi5jOiBSZW1vdmUgY29kZSBpbiAjaWZkZWYgVU1BWF9QVFJBQ0UuCisKKwkqIHZhbHVlcy5jIChjb252ZW5pZW5jZV9pbmZvKTogUHJpbnQgaW4gZm9ybSAiJGZvbyA9IDUiLgorCURvbid0IHByaW50ICJEZWJ1Z2dlciBjb252ZW5pZW5jZSB2YXJpYWJsZXM6IiBiZWZvcmUgZmlyc3Qgb25lLgorCisJKiBNYWtlZmlsZS5kaXN0OiBSZW1vdmUgQUREX0ZJTEVTIGZyb20gQ0xJQlMuCisJKGdkYiwga2RiLCB4Z2RiKTogUHV0IGluIEFERF9GSUxFUyBhcyB3ZWxsIGFzIENMSUJTLgorCisJKiBtLXB5ci5oOiAjaWYgMCBvdXQgY2FsbCBkdW1teSBzdHVmZi4KKwlQdXQgaW4gUE9QX0ZSQU1FIHdoaWNoIGp1c3QgY2FsbHMgZXJyb3IoKS4KKwl2YWxvcHMuYzogSWYgQ0FMTF9EVU1NWSBpcyBub3QgZGVmaW5lZCwgcHV0IGluIGR1bW15IGNhbGxfZnVuY3Rpb24KKwl3aGljaCBqdXN0IHByaW50cyBhbiBlcnJvciBtZXNzYWdlLgorCitUdWUgRmViIDIwIDIyOjExOjQwIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIGJyZWFrcG9pbnQuYyAoY29tbWFuZHNfY29tbWFuZCk6IEFkZCBhcmcgZnJvbV90dHkuCisKKwkqIG1haW4uYyAobWFpbik6IFB1dCBpZiAoIXNldGptcCAodG9fdG9wX2xldmVsKSkgYXJvdW5kIGNhbGxzCisJdG8gKl9jb21tYW5kIG1hZGUgaW4gcmVzcG9uc2UgdG8gY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKworTW9uIEZlYiAxOSAxMzo1ODoyOCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiBtYWluLmMgKG1haW4pOiBVc2UgZ2V0b3B0X2xvbmdfb25seS4gIE1vdmUgb25lLWNoYXJhY3RlciBvcHRpb25zCisJdG8gbG9uZ19vcHRpb25zLiAgUmVtb3ZlIGVudHJpZXMgd2hpY2ggYXJlIGp1c3QgdW5hbWJpZ3VvdXMKKwlhYmJyZXZpYXRpb25zIG9mIG90aGVyIG9wdGlvbnMuCisKKwkqIGNvbW1hbmQuaDogQWRkIHR5cGVzIGNtZF90eXBlcyBhbmQgdmFyX3R5cGVzLgorCUFkZCBmaWVsZHMgdHlwZSwgdmFyX3R5cGUsIGFuZCB2YXIgdG8gc3RydWN0IGNtZF9saXN0X2VsZW1lbnQuCisJY29tbWFuZC5jIChhZGRfc2V0X2NtZCwgYWRkX3NldF9mcm9tX3Nob3cpOiBOZXcgZnVuY3Rpb25zLgorCShhZGRfY21kKTogU2V0IGMtPnZhcl90eXBlLgorCShhZGRfYWJicmV2X2NtZCk6IENhbGwgYWRkX2NtZCBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIGNvZGUuCisJbWFpbi5jOiBBZGQgc2hvd2xpc3QuCisJTW92ZSBwYXJzZV9iaW5hcnlfb3BlcmF0aW9uIGZyb20gbWFpbi5jIHRvIGNvbW1hbmQuYy4KKwljb21tYW5kLmMgKGRvX3NldHNob3dfY29tbWFuZCk6IE5ldyBmdW5jdGlvbi4KKwlnZGJjbWQuaDogTmV3IGZpbGUuCisJTWFrZWZpbGUuZGlzdDogQWRkIGdkYmNtZC5oLgorCW1hbnkgZmlsZXM6IEluY2x1ZGUgZ2RiY21kLmgsIHVzZSBhZGRfc2V0X2NtZCBhbmQgYWRkX3Nob3dfZnJvbV9zZXQuCisJUmVwbGFjZSBpbmZvICogd2l0aCBzaG93ICogd2hlcmUgYXBwcm9wcmlhdGUuCisJdXRpbHMuYyAoZnB1dHNfZmlsdGVyZWQpOiBVc2UgVUlOVF9NQVggaW4gbGluZXNfcGVyX3BhZ2UgdG8gbWVhbgorCW5vIHBhZ2luZy4KKwlkZWZzLmg6IERlZmluZSBVSU5UX01BWC4KKwlpbmZjbWQuYyAocnVuX2NvbW1hbmQpOiBVc2UgZXhlY3V0ZV9jb21tYW5kLCBub3Qgc2V0X2FyZ3NfY29tbWFuZC4KKwltYWluLmMgKGV4ZWN1dGVfY29tbWFuZCk6IENhbGwgZG9fc2V0c2hvd19jb21tYW5kIGlmIG5lY2Vzc2FyeS4KKwltYWluLmMgKHNob3dfY29tbWFuZCwgc2hvd19oaXN0b3J5KTogTmV3IGZ1bmN0aW9ucy4KKwltYWluLmMgKGluaXRpYWxpemVfbWFpbik6IENhbGwgYWRkX3ByZWZpeF9jbWQKKwlmb3Igc2hvdyBhbmQgc2hvdyBoaXN0b3J5LgorCisJKiBjb2ZmcmVhZC5jIChlbnRlcl9saW5lbm9zKTogUHJpbnQgZXJyb3IgaWYKKwlmaWxlX29mZnNldCA8IGxpbmV0YWJfb2Zmc2V0LgorCitTdW4gRmViIDE4IDE1OjM3OjA1IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIGNvbnZleC1kZXAuYyAoY29tbV9yZWdpc3RlcnNfaW5mbyk6IEZpeCB0eXBvLiAgKCJhcmdjIi0+ImFyZyIpLgorCitXZWQgRmViIDE0IDIwOjQ1OjE0IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIGNvbmZpZy5nZGI6IENyZWF0ZSBNYWtlZmlsZSB3aXRoIG1ha2UuCisKKwkqIE1ha2VmaWxlLmRpc3QsIGNvbmZpZy5nZGI6IE1vdmUgInNyY2Rpcj0iIGxpbmUgZnJvbSBNYWtlZmlsZS5kaXN0CisJdG8gbmV3IGZpbGUgTWFrZWZpbGUuc3JjZGlyLgorCisJKiB2YWxwcmludC5jOiBJbmNsdWRlIDxlcnJuby5oPi4KKworCSogdmFsdWUuaDogRGVjbGFyZSB2YWx1ZV9jb2VyY2VfZnVuY3Rpb24uCisKKwkqIGZpbmR2YXIuYzogQWRkIG1pc3NpbmcgIiBhZnRlciAjaW5jbHVkZSAiZ2RiY29yZS5oCisKKwkqIG1haW4uYyAobWFpbik6IFJlLXdyaXRlIGNvbW1hbmQgcGFyc2luZyB0byB1c2UgZ2V0b3B0LgorCU9uICJnZGIgK2hlbHAiIHByaW50IG9wdGlvbnMgd2l0aCAnKycgbm90ICctJy4KKwlNYWtlZmlsZS5kaXN0OiBBZGQgZ2V0b3B0LgorCitUdWUgRmViIDEzIDAwOjA4OjI3IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIE1ha2VmaWxlLmRpc3Q6IEFkZCAic3JjZGlyPS4iCisJY29uZmlnLmdkYjogRWRpdCBzcmNkaXI9IHJhdGhlciB0aGFuIGFkZGluZyBpdCB0byB0aGUgYmVnaW5uaW5nLgorCisJKiBweXItZGVwLmM6IE1ha2UgZ2xvYmFsX3JlZ19vZmZzZXQsIGxhc3RfZnJhbWVfb2Zmc2V0IG5vdCBzdGF0aWMuCisJTW92ZSBkZWZpbml0aW9uIG9mIHJlZ19zdGFja19vZmZzZXQgdG8gY29yZS5jIFtSRUdfU1RBQ0tfU0VHTUVOVF0uCisKKwkqIGNvbmZpZy9weXJhbWlkOiBQcmludCBtZXNzYWdlIGFib3V0IGFsbG9jYS4KKworCSogYnJlYWtwb2ludC5jIChjbGVhcl9jb21tYW5kKTogV2hlbiBwcmludGluZyAibm8gYnJlYWtwb2ludCIKKwllcnJvciwgb25seSB1c2UgYXJnIGlmIG5vbi1OVUxMLgorCisJKiBjb3JlLmMgKHJlYWRfbWVtb3J5KTogUmVuYW1lIHRvIHJlYWRfbWVtb3J5X25vZXJyLgorCShyZWFkX21lbW9yeSk6IE5ldyBmdW5jdGlvbiB3aGljaCBjYWxscyByZWFkX21lbW9yeSBhbmQgY2hlY2tzIGZvciBlcnIuCisJZ2RiY29yZS5oOiBEZWNsYXJlIGFsbCBleHRlcm4gY29yZS5jIGZ1bmN0aW9ucy4KKwltb3ZlIG15cmVhZCBmcm9tIGNvcmUuYyB0byB1dGlscy5jLgorCWRlY2xhcmUgaXQgaW4gZGVmcy5oLgorCShyZWFkX21lbW9yeV9pbnRlZ2VyKTogbW92ZSBmcm9tIGluZmNtZC5jIHRvIGNvcmUuYy4KKwlnZGJjb3JlLmg6IERlY2xhcmUgaXQuCisJTWFueSBwbGFjZXM6IFJlbW92ZSBlcnJvciBjaGVja2luZyBvbiByZWFkX21lbW9yeSwgb3IgY2FsbAorCXJlYWRfbWVtb3J5X25vZXJyIGluc3RlYWQuICBJbmNsdWRlICJnZGJjb3JlLmgiIGlmIGNhbGxpbmcgZWl0aGVyLgorCisJKiB2YWx1ZS5oIChDT0VSQ0VfQVJSQVkpOiBDb2VyY2UgZnVuY3Rpb25zIHRvIGZ1bmN0aW9uIHBvaW50ZXJzLgorCXZhbG9wcy5jICh2YWx1ZV9jb2VyY2VfZnVuY3Rpb24pOiBOZXcgZnVuY3Rpb24uCisKKwkqIGNvcmUuYywgY29udmV4LWRlcC5jLCBhcm0tZGVwLmMgKHhmZXJfY29yZV9maWxlKTogUmV0dXJuIEVJTworCWlmIGFkZHJlc3Mgb3V0IG9mIGJvdW5kcy4KKworCSogbS1hcm0uaCwgYXJtLWRlcC5jIGFybS1waW5zbi5jIGFybS1vcGNvZGUuaDogTmV3IGZpbGVzLgorCWRieHJlYWQuYywgbS1jb252ZXguaCAoVkFSSUFCTEVTX0lOU0lERV9CTE9DSyk6IEFkZCBnY2NfcCBwYXJhbWV0ZXIuCisJTWFrZWZpbGUuZGlzdCAoYWxsZGVwcy5tYWspOiBTcGVjaWFsIGNhc2UgZm9yIGFybS1jb252ZXJ0LnMuCisJZGJ4cmVhZC5jIChkZWZpbmVfc3ltYm9sKTogQ2hlY2sgZm9yIGxvY2FsIGJhc2VkIG9uIGl0IG5vdAorCWJlaW5nIGFueSBvbmUgb2YgdGhlIGtub3duIGRlZnR5cGVzLgorCXZhbHVlcy5jICh1c2luZ19zdHJ1Y3RfcmV0dXJuKTogVXNlIG5ldyBtYWNybyBVU0VfU1RSVUNUX0NPTlZFTlRJT04uCisKKwkqIE1ha2VmaWxlLmRpc3QsIGNvbmZpZy5nZGI6IFB1dCBpbiBzcmNkaXIgc3R1ZmYuCisKK01vbiBGZWIgMTIgMjI6NDY6MTYgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogYnJlYWtwb2ludC5jOiBBZGQgYWRkcl9zdHJpbmcgYW5kIGNvbmRfc3RyaW5nIGZpZWxkcyB0bworCXN0cnVjdCBicmVha3BvaW50LgorCShicmVha19jb21tYW5kXzEpOiBTZXQgdGhlbS4gIFVzZSBtZW50aW9uICgpLgorCShtZW50aW9uKTogQ3JlYXRlIHdpdGggY29kZSBmcm9tIGJyZWFrX2NvbW1hbmRfMS4KKwkoYnJlYWtwb2ludF9yZV9zZXQpOiBOZXcgZnVuY3Rpb24uCisJKGJyZWFrcG9pbnRfY2xlYXIpOiBSZW1vdmUuCisJKGNvbmRpdGlvbl9jb21tYW5kKTogU2V0IGNvbmRfc3RyaW5nLgorCShicmVha3BvaW50X2RlbGV0ZSk6IEZyZWUgY29uZF9zdHJpbmcgYW5kIGFkZHJfc3RyaW5nLgorCURlY2xhcmUgcGFyc2VfY18xJ3MgdHlwZSBhbmQgcmVtb3ZlIGNhc3RzIHRvIHN0cnVjdCBleHByZXNzaW9uICouCisJc3ltbWlzYy5jIChmcmVlX2FsbF9zeW10YWJzKTogRG9uJ3QgY2FsbCBicmVha3BvaW50X2NsZWFyLgorCWRieHJlYWQuYywgY29mZnJlYWQuYyAocmVyZWFkX3N5bWJvbHMpOiBDYWxsIGJyZWFrcG9pbnRfcmVfc2V0LAorCUluY2x1ZGUgYnJlYWtwb2ludC5oLgorCWJyZWFrcG9pbnQuaDogTmV3IGZpbGUuCisJZGJ4cmVhZC5jOiBNb3ZlIGRlY2xhcmF0aW9uIG9mIHN5bW1pc2MuYyBmdW5jdGlvbnMgdG8gc3ltdGFiLmguCisKK1N1biBGZWIgMTEgMTc6Mjk6MjMgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogc3ltdGFiLmM6IE1ha2UgbG9va3VwX2Jsb2NrX3N5bXRhYiBleHRlcm4uCisJc3ltdGFiLmg6IERlY2xhcmUgaXQuCisJdmFsb3BzLmMgKHZhbHVlX29mX3RoaXMpOiBVc2UgaXQuCisKK0ZyaSBGZWIgIDkgMDg6NTk6MzcgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogY29uZmlnL2hwMzAwaHB1eDogUHJpbnQgbWVzc2FnZSB0ZWxsaW5nIHBlb3BsZSB0byB1c2UgZ2NjLgorCisJKiB2YWx1ZS5oOiBEZWNsYXJlIHByaW50X2Zsb2F0aW5nLgorCXByaW50Y21kLmMgKHByaW50X3NjYWxhcl9mb3JtYXR0ZWQsIGNhc2UgJ2YnKTogVXNlIHByaW50X2Zsb2F0aW5nLgorCXZhbHByaW50LmMgKHZhbF9wcmludCwgY2FzZSBUWVBFX0NPREVfRkxUKTogVXNlIHByaW50X2Zsb2F0aW5nLgorCXZhbHByaW50LmMgKHByaW50X2Zsb2F0aW5nKTogTWFrZSB0aGlzIGZ1bmN0aW9uIG91dCBvZiBpc19uYW4KKwlhbmQgdGhlIGNvZGUgd2hpY2ggd2FzIGluIHZhbF9wcmludC4KKwlQdXQgcGFyZW50aGVzZXMgYXJvdW5kIGhpZ2ggJiAweGZmZmZmLgorCVByaW50IHNpZ24gYW5kIGZyYWN0aW9uIGZvciBOYU4ncy4KKwlQcmludCAxNyBkaWdpdHMgbm90IDE2IGZvciBkb3VibGVzLgorCShpc19uYW4pOiBSZW1vdmUuCisJbS1uZXdzLmgsIG0tc3VuMy5oOiBEZWZpbmUgSUVFRV9GTE9BVC4KKworCSogUmVuYW1lIGdsZC1waW5zbi5jIHRvIGdvdWxkLXBpbnNuLmMuCisJY29uZmlnL3twbixucGx9OiBDaGFuZ2UgbmFtZSBvZiBnbGQtcGluc24uYworCitUdWUgRmViICA2IDAwOjI1OjM2IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIGluZnB0cmFjZS5jOiBEZWZpbmUgUFRfQVRUQUNIIGlmIG5vdCBkZWZpbmVkLgorCW0taHAzMDBocHV4Lmg6IERlZmluZSBBVFRBQ0hfREVUQUNILgorCisJKiBtYWluLmMgKGluaXRpYWxpemVfbWFpbik6IENoYW5nZSBhbGlhcyBjbGFzcyB0byBhbGlhc2VzLgorCisJKiBkYnhyZWFkLmM6IFNlYXJjaCBhbmQgZGVzdHJveSByZWZlcmVuY2VzIHRvIHN5bXNlZ3MuCisJQWxzbyByZW1vdmUgc29tZSAjaWYgMCdkIGNvZGUuCisKKwkqIGNvcmUuYzogUmVtb3ZlIHJlcmVhZF9leGVjLgorCWRieHJlYWQuYyAocmVyZWFkX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24uCisJZGJ4cmVhZC5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogU2V0IHN5bWZpbGVfbXRpbWUuCisJY29mZnJlYWQuYzogU2FtZS4KKwlpbmZjbWQuYyAocnVuX2NvbW1hbmQpOiBDYWxsIHJlcmVhZF9zeW1ib2xzIG5vdCByZXJlYWRfZXhlYy4KKworCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogV2hlbiBwcmludGluZyBzdHJpbmcgYWZ0ZXIgY2hhciAqLCBwcmludAorCWl0IGZvciAiIiBqdXN0IGxpa2UgYW55IG90aGVyIHN0cmluZy4KKworCSogY29yZS5jIChyZXJlYWRfZXhlYyk6IE5ldyBwcm9jZWR1cmUuCisJaW5mY21kLmMgKHJ1bl9jb21tYW5kKTogQ2FsbCByZXJlYWRfZXhlYy4KKworCSogY29mZnJlYWQuYyAoc3ltYm9sX2ZpbGVfY29tbWFuZCk6IEFkZCBmcm9tX3R0eS4KKworCSogZGJ4cmVhZC5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogT25seSBhc2sgYWJvdXQgbG9hZGluZyBuZXcKKwlzeW1ib2wgdGFibGUgaWYgZnJvbV90dHkuCisKK01vbiBGZWIgIDUgMDI6MjU6MjUgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogaW5mbG93LmMgKGluZmVyaW9yX2RpZWQpOiBDYWxsIGJyZWFrcG9pbnRfY2xlYXJfaWdub3JlX2NvdW50cy4KKworCSogTWFrZWZpbGUuZGlzdCAoT0JTKTogUmVtb3ZlIGRieHJlYWQubyBhbmQgY29mZnJlYWQuby4KKworCSogY29uZmlnLmdkYjogSWdub3JlIGZpbGVzIGVuZGluZyBpbiAnIycgaW4gY29uZmlnLgorCisJKiBzdGFjay5jIChiYWNrdHJhY2VfY29tbWFuZCk6IEFkZCBRVUlUIHRvIGdldF9wcmV2X2ZyYW1lIGxvb3BzLgorCitTYXQgRmViICAzIDIyOjI1OjA5IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIE1ha2VmaWxlLmRpc3QgKFlBQ0MpOiBEb24ndCB1c2UgLXYuCisKK0ZyaSBGZWIgIDIgMTk6MjY6NTAgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IG1vbGUuYWkubWl0LmVkdSkKKworCSogY3JlYXRldGFnczogT25seSBjaGFuZ2UgLm8gdG8gLmMgYXQgZW5kIG9mIG5hbWUuCisKKwkqIE1ha2VmaWxlLmRpc3QgKGFsbGRlcHMubWFrKTogbmV3IHRhcmdldC4KKwkoTWFrZWZpbGUpOiBhZGQgYWxsZGVwcy5tYWsuCisJKFNPVVJDRVMpOiByZW1vdmUgUElOU05TLgorCShUQUdGSUxFUzogdXNlIEFMTFBBUkFNLgorCShnZGIudGFyKTogYWRkIGNvbmZpZy8uCisKKwkqIGNvbmZpZy5nZGI6IENoZWNrIGZvciBNX0ZJTEU9IG5vdCAjcGFyYW0uaAorCWNvbmZpZy8qOiBNYWtlIHN1cmUgTV9GSUxFPSBleGlzdHMgd2l0aCBzcGFjZSBhZnRlciBNX0ZJTEU9LgorCU1ha2VmaWxlLmRpc3QgKFRBR1MpOiBQYXNzIE1fRklMRSBhbmQgREVQRklMRVMuCisJY3JlYXRldGFnczogQ2hhbmdlIC5vIHRvIC5jLiAgUmVtb3ZlIHNwZWNpYWwgdGVzdHMgZm9yIGRlcC5jIGV0Yy4KKworCSogZGJ4cmVhZC5jLCBjb2ZmcmVhZC5jOiBEb24ndCBjaGVjayBDT0ZGX0ZPUk1BVCBhbmQgUkVBRF9EQlhfRk9STUFULgorCU1ha2VmaWxlLmRpc3Q6IE1vdmUge2RieCxjb2ZmfXJlYWQuYyBmcm9tIFNGSUxFUyB0byBBTExERVBGSUxFUy4KKwljb25maWcvKjogYWRkIGRieHJlYWQubyBvciBjb2ZmcmVhZC5vIHRvIGRlcGZpbGVzLgorCisJKiBNYWtlZmlsZS5kaXN0IChkZXBlbmQpOiBEZXBlbmQgb24gJChTT1VSQ0VTKSwgbm90IGZvcmNlLgorCitUaHUgRmViICAxIDE3OjQzOjU0IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIHN5bW1pc2MuYyAocHJpbnRfc3ltYm9sKTogUHJpbnQgbmV3bGluZSBhZnRlciBsYWJlbC4KKworV2VkIEphbiAzMSAyMjozNTozOCAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgcG9nby5haS5taXQuZWR1KQorCisJKiBkYnhyZWFkLmMgKHJlYWRfYWRkbF9zeW1zKTogUmVtb3ZlIGNvZGUgdGhhdCBjaGVja3MgZm9yCisJX2V0ZXh0LgorCU1vdmUgZW5kX29mX3RleHRfYWRkciBpbnRvIHJlYWRfZGJ4X3N5bXRhYi4KKwkocmVhZF9kYnhfc3ltdGFiKTogI2lmIDAgb3V0IGNvZGUgd2hpY2ggY2hlY2tzIGZvciBfZXRleHQuCisKK1R1ZSBKYW4gMzAgMTU6NDA6MTkgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGFsYmVydC5haS5taXQuZWR1KQorCisJKiBNYWtlZmlsZS5kaXN0IChnZGIudGFyKTogVXNlIHJlYWRsaW5lJ3MgIm1ha2UgcmVhZGxpbmUudGFyIgorCWluc3RlYWQgb2YgaGF2aW5nIGEgbGlzdCBvZiByZWFkbGluZSBmaWxlcy4KKworCSogaW5mcnVuLmMgKG5vcm1hbF9zdG9wKTogI2lmIDAgb3V0ICJ5b3UgaGF2ZSBmb3VuZCBhIGJ1ZyBpbiBzaCIuCisKKwkqIG11bmNoICgtRFNZU1YpOiBDaGVjayBmb3IgLnRleHQgYXQgZW5kIG9mIG5hbWUuCisJT3B0aW9uYWxseSBhbGxvdyBleHRyYSB1bmRlcnNjb3JlIGJlZm9yZSBpbml0aWFsaXplLgorCVJlbW92ZSBzcGFjZSBiZXR3ZWVuICMhIGFuZCAvYmluL3NoLgorCisJKiBtLW1lcmxpbi5oOiBQdXQgaW4gY2xhcmlmeWluZyBjb21tZW50cyBhYm91dCBTSEVMTF9GSUxFLgorCU1ha2VmaWxlLmRpc3QgKGluc3RhbGwpOiBFeGVjdXRlIE1fSU5TVEFMTC4KKwljb25maWcvbWVybGluOiBEZWZpbmUgTV9JTlNUQUxMLgorCitNb24gSmFuIDI5IDA0OjMyOjA5IDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIGluZmxvdy5jOiBDaGFuZ2UgYWxsIHJlZmVyZW5jZXMgdG8gc2lnbmFsIGhhbmRsZXJzIGZyb20KKwlpbnQgKCopKCkgdG8gdm9pZCAoKikoKS4KKworCSogbWFpbi5jOiBEZWNsYXJlIGluaXRfc2lnbmFscyBiZWZvcmUgdXNlICYgbWFrZSBpdCB2b2lkLgorCURlY2xhcmUgaW5pdGlhbGl6ZV9hbGxfZmlsZXMuCisKKwkqIE1ha2VmaWxlLmRpc3QgKGNvbmZpZy5zdGF0dXMpOiBOZXcgdGFyZ2V0LgorCitTYXQgSmFuIDI3IDAwOjE5OjUwIDE5OTAgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBwb2dvLmFpLm1pdC5lZHUpCisKKwkqIGRlZnMuaCAoZW51bSBjb21tYW5kX2NsYXNzKTogUmVtb3ZlIGNvbW1hIGFmdGVyIGxhc3QgZWxlbWVudC4KKworCSogTWFrZWZpbGUuZGlzdCAoZ2RiLnRhci5aKTogVXNlIGNvbXByZXNzIDxmb28gPmJhciByYXRoZXIKKwl0aGFuIGRlbGV0aW5nIGdkYi50YXIuWiBiZWZvcmUgc3RhcnRpbmcuCisKKwkqIGRieHJlYWQuYyAocHJvY2Vzc19vbmVfc3ltYm9sKTogQ29tcGFyZSBjb250ZXh0X3N0YWNrX2RlcHRoCisJd2l0aCAhVkFSSUFCTEVTX0lOU0lERV9CTE9DSywgbm90IFZBUklBQkxFU19JTlNJREVfQkxPQ0suCisKKwkqIG1jaGVjay5jOiBQdXQgd2hvbGUgZmlsZSBpbiAjaWYgZGVmaW5lZCBNQUxMT0NfUkFOR0VfQ0hFQ0suCisKKwkqIG1jaGVjay5jIChjaGVja2hkcik6IENhbGwgZmF0YWxfZHVtcF9jb3JlIG5vdCBhYm9ydC4KKworCSogbWNoZWNrLmM6IENvcHkgZnJvbSBtYWxsb2MgZGlzdHJpYnV0aW9uLgorCisJKiBtYWluLmMgKG1haW4pOiBDYWxsIGluaXRfbWFsbG9jICgpLgorCisJKiBtYWluLmMgKGluaXRpYWxpemVfc2lnbmFscyk6IFJlbmFtZSB0byBpbml0X3NpZ25hbHMuCisKK0ZyaSBKYW4gMjYgMDA6NTM6MjMgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IG1vbGUuYWkubWl0LmVkdSkKKworCSogKmRlcC5jOiBNYWtlIGNvcmVfZmlsZV9jb21tYW5kIHJldHVybiB2b2lkLgorCisJKiBnZGJjb3JlLmggWyFLRVJORUxfVV9BRERSXTogRGVjbGFyZSBrZXJuZWxfdV9hZGRyLgorCWluZnB0cmFjZS5jIFshS0VSTkVMX1VfQUREUl06IE1ha2UgaXQgZXh0ZXJuLgorCisJKiBhbHRvcy1kZXAuYyAoTkJQRywgVVBBR0VTKTogV3JhcCAjZGVmaW5lIGluICNpZiAhZGVmaW5lZC4KKworCSogbS1wbi5oIChHT1VMRF9QTik6IERlZmluZS4KKwkqLXBpbnNuLmM6IEluY2x1ZGUgYWN0dWFsIG9wY29kZSB0YWJsZSBub3QganVzdCBvcGNvZGUuaAorCisJKiBtYWluLmMgW0FMSUdOX1NUQUNLX09OX1NUQVJUVVBdOiBOZXcgY29kZS4KKwltLWkzODYuaDogRGVmaW5lIEFMSUdOX1NUQUNLX09OX1NUQVJUVVAuCisKKwkqIG0tbWVybGluLmggKE5PX1NJR0lOVEVSUlVQVCwgU0hFTExfRklMRSk6IERlZmluZS4KKworCSogTW92ZSBjb2RlIGZyb20gaW5mcHRyYWNlIFtVU0VfUFRSQUNFX0dFVFJFR1NdIHRvIHN1bjMtZGVwLmMuCisJbS1zdW57MiwzfS5oLCBtLXNwYXJjLmg6IERlZmluZSBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMuCisKKwkqIE1ha2VmaWxlLmRpc3QsIGNvbmZpZy5nZGIsIGNvbmZpZy8qOgorCVJlLXdyaXRlIHRvIHVzZSBtYWNoaW5lLWRlcGVuZGVudCBtYWtlZmlsZXMgaW5zdGVhZCBvZiBjcHAuCisKKwkqIG0taHAzMDBocHV4Lmg6IERlZmluZSBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMuCisJaW5mcHRyYWNlLmM6IFB1dCB7ZmV0Y2gsc3RvcmV9X2luZmVyaW9yX3JlZ2lzdGVycyBpbnNpZGUKKwkjaWYgIWRlZmluZWQgRkVUQ0hfSU5GRVJJT1JfUkVHSVNURVJTLgorCisJKiBTcGxpdCBleGVjY29yZS5jIGludG8gZXhlYy5jIGFuZCBjb3JlZGVwLmMuCisJTW92ZSBhIGJ1bmNoIG9mIHN0dWZmIGZyb20gY29yZWRlcC5jIGFuZCAqZGVwLmMgdG8gZ2RiY29yZS5oLgorCisJKiBpbmZwdHJhY2UuYyAoe2ZldGNoLHN0b3JlfV9pbmZlcmlvcl9yZWdpc3RlcnMpOgorCVVzZSBVX1JFR1NfT0ZGU0VUIHRvIHNldCBvZmZzZXQuCisJbS11bWF4Lmg6IERlZmluZSBVX1JFR1NfT0ZGU0VULgorCisJKiBtLXVtYXguaDogRGVmaW5lIFBUUkFDRV97QVRUQUNILERFVEFDSH0uCisKKwkqIG0taTM4Ni5oIChOX1NFVF9NQUdJQyk6IERlZmluZS4KKwltLWkzODZnYXMuaDogYWRkICN1bmRlZiBOX1NFVF9NQUdJQy4KKworVGh1IEphbiAyNSAxODozOTo0NSAxOTkwICBKaW0gS2luZ2RvbiAgKGtpbmdkb24gYXQgbW9sZS5haS5taXQuZWR1KQorCisJKiBtLWhwMzAwYnNkLmg6IFJlbW92ZSBLRVJORUxfVV9BRERSLgorCisJKiBpbmZwdHJhY2UuYyBbIUtFUk5FTF9VX0FERFJdOiBHZXQgYWRkcmVzcyBvZiBrZXJuZWwgdSBhcmVhCisJYXQgcnVudGltZS4KKworCSogaW5mcHRyYWNlLmM6IFJlcGxhY2UgbnVtYmVycyB3aXRoIFBUX0tJTEwsIGV0Yy4KKwkoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogTG9vcCBmb3IgYXMgbWFueSB3b3JkcyBhcmUgaW4gdGhlIHJlZ2lzdGVyLgorCisJKiBpbmZwdHJhY2UuYyBbTk9fU0lOR0xFX1NURVBdOiBDYWxsIHNpbmdsZV9zdGVwKCkuCisKKwkqIGtpbGxfaW5mZXJpb3J7LF9mYXN0fTogRGVjbGFyZSBhcyByZXR1cm5pbmcgdm9pZC4KKworCSogbS1zdW4zLmggKFVTRV9QVFJBQ0VfR0VUUkVHUyk6IERlZmluZS4KKworCSogZXhlY2NvcmUuYzogQWRkIElTX09CSkVDVF9GSUxFICYgcmVsYXRlZCBzdHVmZi4KKworCSogaW5mcHRyYWNlLmM6IEluY2x1ZGUgPHN5cy9wdHJhY2UuaD4uCisJW0FUVEFDSF9ERVRBQ0hdIFtVU0VfUFRSQUNFX0dFVFJFR1NdOiBOZXcgY29kZS4KKworCSogU3BsaXQgZGVmYXVsdC1kZXAuYyBpbnRvIGluZnB0cmFjZS5jIGFuZCBleGVjY29yZS5jLgorCisJKiB2YWxwcmludC5jIFtJRUVFX0ZMT0FUXTogQ2hhbmdlIHZvaWQgKiB0byBjaGFyICouCisKKwkqIGJyZWFrcG9pbnQuYzogQ2hhbmdlIHByaW50Zl9maWx0ZXJlZCglcykgdG8gZnB1dHNfZmlsdGVyZWQuCisKK1dlZCBKYW4gMjQgMDA6MzU6NTIgMTk5MCAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IHBvZ28uYWkubWl0LmVkdSkKKworCSogZGJ4cmVhZC5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogV2hlbiBmcmVlaW5nIGV2ZXJ5dGhpbmcsIGZyZWUKKwl0aGUgc3RyaW5nIHRhYmxlIHRvby4KKworCSogTWFrZWZpbGUuZGlzdCAoZ2RiMSk6IGFkZCAicm0gLWYgZ2RiMSIuCisKKwkqIHByaW50Y21kLmMgKHByaW50X3NjYWxhcl9mb3JtYXR0ZWQpOiBJZiBzaXplIGlzIDAsIHVzZSAnYicKKwknaCcsICd3Jywgb3IgJ2cnIGRlcGVuZGluZyBvbiB0aGUgdHlwZS4KKworCSogc3RhY2suYyAoYmFja3RyYWNlX2NvbW1hbmQpOiBSZWFkIGluIHN5bWJvbHMgZm9yIGZyYW1lcyB3ZSdsbAorCXByaW50IGJlZm9yZSBwcmludGluZyB0aGVtLgorCisJKiB2YWxvcHMuYyAodmFsdWVfYXQpOiBEb24ndCBwcmludCAiSS9PIGVycm9yIiBvbiBFSU8gZnJvbQorCXB0cmFjZS4gIERvbid0IHByaW50ICJvdXQgb2YgYm91bmRzIiBmb3IgYW55IHB0cmFjZSBlcnJvcgorCWV4Y2VwdCBFSU8uCisKKwkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfYmFzZSwgY2FzZSBUWVBFX0NPREVfRU5VTSk6CisJUHJpbnQgIkZPTyA9IDUiIG5vdCAiRk9PIDogNSIuCisKKwkqIHN5bXRhYi57YyxofTogTWFrZSBsb29rdXBfbWlzY19mdW5jIGV4dGVybi4KKworCSogTWFrZWZpbGUuZGlzdDogRGVmaW5lIFZFUlNJT04gaW4gbWFrZWZpbGUsIGFuZCBnZW5lcmF0ZQorCXZlcnNpb24uYyBhdXRvbWF0aWNhbGx5LgorCShnZGIudGFyKTogVXNlIGdkYi0kKFZFUlNJT04pLCBub3QgZGlzdC1nZGIuCisKKwkqIGV4cHJlYWQueSAoeXlsZXgpOiBVc2UgbG9va3VwX3ByaW1pdGl2ZV90eXBlbmFtZSB0bworCWN1dCBkb3duIG9uIGNhbGxzIHRvIGxvb2t1cF9zeW1ib2wuCisJc3ltdGFiLntjLGh9IChsb29rdXBfcHJpbWl0aXZlX3R5cGVuYW1lKTogTmV3IGZ1bmN0aW9uLgorCShsb29rdXBfdHlwZW5hbWUpOiBVc2UgaXQuCisKKwkqIHN5bXRhYi57YyxofSAoY2hlY2tfc3R1Yl90eXBlKTogTmV3IGZ1bmN0aW9uLgorCXZhbHByaW50LmMgKHR5cGVfcHJpbnRfYmFzZSwgdmFsX3ByaW50LCB0eXBlX3ByaW50X2Rlcml2YXRpb25faW5mbyksCisJdmFsdWVzLmMgKGFsbG9jYXRlX3ZhbHVlKTogQ2FsbCBpdC4KKworCSogcHJpbnRjbWQuYyAod2hlcmVpc19jb21tYW5kKTogTmV3IGZ1bmN0aW9uLgorCXN5bXRhYi5jIChsb29rdXBfc3ltYm9sKTogQWRkIHN5bXRhYiBwYXJhbWV0ZXIuCisJdmFyaW91czogUGFzcyBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIGxvb2t1cF9zeW1ib2wuCisJc3ltc2VnLmggKHN0cnVjdCBzeW1ib2wpOiBBZGQgbGluZSBmaWVsZC4KKwlkYnhyZWFkLmMgKGRlZmluZV9zeW1ib2wpOiBTZXQgc3ltLT5saW5lLgorCisJKiBkYnhyZWFkLmMgKHN5bWJvbF9maWxlX2NvbW1hbmQpOiBSZWFkIHN0cmluZyB0YWJsZSBpbnRvCisJbWFsbG9jJ2QgbWVtb3J5IChzeW1maWxlX3N0cmluZ190YWJsZSkgYW5kIGxlYXZlIGl0IHRoZXJlLgorCShwc3ltdGFiX3RvX3N5bXRhYik6IFVzZSBzeW1maWxlX3N0cmluZ190YWJsZS4KKworCSogdXRpbHMuYyAoc2lnX2FiYnJldik6IFJldHVybiBOVUxMIGlmIG5vdCBmb3VuZC4KKwlpbmZydW4uYyAoc2lnX3ByaW50X3toZWFkZXIsaW5mb30pOiBDb25zb2xpZGF0ZSBkdXBsaWNhdGVkCisJY29kZSBmcm9tIGhhbmRsZV9jb21tYW5kLCBzaWduYWxzX2luZm8uCisJKHNpZ19wcmludF9pbmZvKTogSnVzdCBwcmludCBudW1iZXIgaWYgbm8gbmFtZSBmcm9tIHNpZ19hYmJyZXYuCisKKwkqIE1ha2VmaWxlLmRpc3QgKE9USEVSUyk6IEFkZCBDaGFuZ2VMb2ctMy54CisKKwkqIGluZnJ1bi5jIChyZXN0b3JlX2luZmVyaW9yX3N0YXR1cyk6ICNpZiAwIG91dAorCSJVbmFibGUgdG8gcmVzdG9yZSBwcmV2aW91c2x5IHNlbGVjdGVkIGZyYW1lIiBlcnJvciBtZXNzYWdlLgorCisJKiBpbmZydW4uYyAoc2lnbmFsc19pbmZvLCBoYW5kbGVfY29tbWFuZCk6IFByaW50IHNpZ25hbAorCWFiYnJldnMgYWxvbmcgd2l0aCBudW1iZXJzLgorCisJKiBpbmZydW4uYyAoaGFuZGxlX2NvbW1hbmQpOiBBY2NlcHQgc3ltYm9sIHNpZ25hbCBuYW1lcy4KKworCSogdXRpbHMuYyAoc2lnX3tudW1iZXIsYWJicmV2fSwgaW5pdF9zaWcpOiBOZXcgZnVuY3Rpb25zLgorCV9pbml0aWFsaXplX3V0aWxzOiBDYWxsIGluaXRfc2lnIGZvciBlYWNoIHNpZ25hbC4KKwlkZWZzLmg6IERlY2xhcmUgdGhlbS4KKworCSogZGVmYXVsdC1kZXAuYyAocmVhZF9pbmZlcmlvcl9tZW1vcnkpOiBDaGVjayBxdWl0X2ZsYWcgaW4KKwlmZXRjaCBsb29wLgorCisJKiBDaGFuZ2VzIGZvciBsYXp5IGZldGNoaW5nIChzcGVlZHMgdGhpbmdzIHVwIGZvciBiaWcgb2JqZWN0cyk6CisJdmFsdWUuaCAoc3RydWN0IHZhbHVlKTogTmV3IGZpZWxkIGxhenkuCisJVkFMVUVfQ09OVEVOVFNfUkFXLCBWQUxVRV9MQVpZLCB2YWx1ZV9hdF9sYXp5OiBOZXcuCisJZmluZHZhci5jIChyZWFkX3Zhcl92YWx1ZSk6IFNldCBsYXp5IGluc3RlYWQgb2YgZmV0Y2hpbmcuCisJdmFyaW91czogQ29weSBpbnRvIFZBTFVFX0NPTlRFTlRTX1JBVywgbm90IFZBTFVFX0NPTlRFTlRTLgorCXZhbG9wcy5jOiBBZGQgdmFsdWVfYXRfbGF6eSwgdmFsdWVfbGF6eS4KKwl2YXJpb3VzOiBDYWxsIHZhbHVlX2F0X2xhenkgaW5zdGVhZCBvZiB2YWx1ZV9hdC4KKworCSogc3ltdGFiLmggKExPTkdFU1QpOiBEZWZpbmUuCisKKwkqIG0tKi5oIChMT05HRVNULCBCVUlMVElOX1RZUEVfTE9OR0VTVCk6IERlbGV0ZSAoaW4gc3ltdGFiLmgpLgorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiAjaWYgMCBvdXQgc3RvcCBpZiBBQk9VVF9UT19SRVRVUk4KKworCSogdmVyc2lvbi5jOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gNC4wZGV2ZWxvcG1lbnQKKworRm9yIG9sZGVyIGNoYW5nZXMgc2VlIENoYW5nZUxvZy0zLngKKwwKK0xvY2FsIFZhcmlhYmxlczoKK21vZGU6IGluZGVudGVkLXRleHQKK2xlZnQtbWFyZ2luOiA4CitmaWxsLWNvbHVtbjogNzQKK3ZlcnNpb24tY29udHJvbDogbmV2ZXIKK0VuZDoKZGlmZiAtLWdpdCBhL2dkYi9DaGFuZ2VMb2ctOTIgYi9nZGIvQ2hhbmdlTG9nLTkyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNWM5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvQ2hhbmdlTG9nLTkyCkBAIC0wLDAgKzEsNjI4NSBAQAorVGh1IERlYyAzMSAxMTowNjozOCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEJJU09OKTogIEFkZCBjb21tZW50IHRoYXQgd2hlbiBiaXNvbiBpcyB1c2VkLCBpdAorCW11c3QgaW5jbHVkZSB0aGUgIi15IiBvcHRpb24uCisJKiBjLWV4cC55LCBtMi1leHAueSAoeXlydWxlLCB5eW5hbWUsIHl5c3MsIHl5c3NwLCB5eXZzLCB5eXZzcCk6CisJUmVtb3ZlIGRlZmluZXMgdG8gcmVtYXAgbm9uLXlhY2Mgc3ltYm9scywgdGh1cyBiYWNraW5nIG91dCBvZgorCXByZXZpb3VzIHJlY2VudCBjaGFuZ2VzLiAgU3RhbmRhcmQgcG9saWN5IGlzIHRoYXQgbm9uLXlhY2MgcGFyc2VyCisJZ2VuZXJhdG9ycyBnZXQgZml4ZWQsIHJhdGhlciB0aGFuIGFkZGluZyBidWcgd29ya2Fyb3VuZHMgaW4gZ2RiCisJZm9yIGVhY2ggbmV3IG9uZSB0aGF0IHBvcHMgdXAuICBFeHBhbmQgY29tbWVudCB0byBub3RlIHRoaXMuCisJKiBjLWV4cC55LCBtMi1leHAueSAoWVlERUJVRyk6ICBSZXZlcnQgYmFjayB0byBkaXNhYmxlZCBieSBkZWZhdWx0LgorCitUaHUgRGVjIDMxIDA5OjAzOjAyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIHBhcnRpYWwtc3RhYi5oIChuZWFyIE5fQklOQ0wpOiAgUmVtb3ZlIHJlZHVuZGFudCBjb2RlIGluIE5fQklOQ0wKKwljYXNlLiAgVXNlIGNvZGUgaW4gTl9TT0wuCisKKwkqIHBhcmVhZC5jOiAgTmV3IGZpbGUgdGhhdCBjb250YWlucyBhbGwgSFBQQS9IUFVYIHN5bWJvbCByZWFkaW5nCisJY29kZS4KKwkqIGRieHJlYWQuYzogIFJlbW92ZSBhbG1vc3QgYWxsIEhQUEEvSFBVWCBzeW1ib2wgcmVhZGluZyBjb2RlLgorCSogKGRieF9zeW1maWxlX2luaXQpOiAgVXNlIHNpemVvZihsb25nKSBpbnN0ZWFkIG9mIDQuCisJKiAoZGJ4X3N5bWZpbGVfb2Zmc2V0cyk6ICBNYWtlIHN0YXRpYy4KKwkqIChwYXN0YWJfYnVpbGRfcHN5bXRhYnMpOiAgTmV3IGludGVyZmFjZSByb3V0aW5lIGZvciBwYXJlYWQgdG8KKwlzZW5kIHN0YWJzIGludG8gZGJ4cmVhZC4KKwkqIGdkYi1zdGFicy5oOiAgUmVtb3ZlIGdvYnMgb2YgSFBQQSBjcnVmdC4KKworV2VkIERlYyAzMCAxOTo0NzoxMyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogYy1leHAueSwgbTItZXhwLnkgKHl5cnVsZSwgeXluYW1lKTogIFJlbWFwIGxpa2Ugb3RoZXIgeXkqIG5hbWVzCisJZm9yIGJ5YWNjLgorCSogY2gtZXhwLnkgKHl5cnVsZSwgeXluYW1lKTogIFJlbWFwIGxpa2Ugb3RoZXIgeXkqIG5hbWVzIGZvciBieWFjYy4KKworCSogYy1leHAueSwgbTItZXhwLnkgKHl5cmVkcywgeXl0b2tzKTogIFJlbWFwIGxpa2Ugb3RoZXIgeXkqIG5hbWVzLgorCSogYy1leHAueSwgbTItZXhwLnkgKFlZREVCVUcpOiAgRGVmaW5lIGlmIE1BSU5URU5BTkNFX0NNRFMgaXMgZGVmaW5lZAorCWFuZCBZWURFQlVHIGlzIG5vdCBhbHJlYWR5IGRlZmluZWQuCisJKiBjLWV4cC55IChzdHJuY21wKTogIFJlcGxhY2UgdGhyb3VnaG91dCB3aXRoIFNUUkVRTiwgbWlzc2VkCisJdGhlbSBkdXJpbmcgdGhlIHByZXZpb3VzIHJlcGxhY2VtZW50cy4KKwkqIHByaW50Y21kLmMgKF9pbml0aWFsaXplX3ByaW50Y21kKTogIFVwZGF0ZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uCisJZm9yICJzZXQiIGNvbW1hbmQgdG8gbm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IHN5bnRheCBpcyBsYW5ndWFnZQorCWRlcGVuZGVudC4KKwkqIGNoLWV4cC55ICh5eXJlZHMsIHl5dG9rcyk6ICBSZW1hcCBsaWtlIG90aGVyIHl5KiBuYW1lcy4KKwkqIGNoLWV4cC55IChZWURFQlVHKTogIERlZmluZSBpZiBNQUlOVEVOQU5DRV9DTURTIGlzIGRlZmluZWQKKwlhbmQgWVlERUJVRyBpcyBub3QgYWxyZWFkeSBkZWZpbmVkLgorCSogY2gtZXhwLnkgKEdEQl9SRUdOQU1FLCBHREJfTEFTVCwgR0RCX1ZBUklBQkxFLCBHREJfQVNTSUdOTUVOVCwKKwlzaW5nbGVfYXNzaWdubWVudF9hY3Rpb24pOiBOZXcgdGVybWluYWxzIGFuZCBub250ZXJtaW5hbCBmb3IgZ2RiCisJZXh0ZW5zaW9ucyB0byBjaGlsbCBleHByZXNzaW9uIGdyYW1tZXIuCisJKiBjaC1leHAueSAobWF0Y2hfZG9sbGFyX3Rva2Vucyk6ICBMZXhlciByb3V0aW5lIHRvIG1hdGNoIGFsbAorCXRva2VucyB0aGF0IHN0YXJ0IHdpdGggJyQnIChyZWdpc3RlciBuYW1lcywgY29udmVuaWVuY2UgdmFycywgZXRjKS4KKwkqIGNoLWV4cC55ICh0b2tlbnRhYjIpOiAgQWRkIEdEQl9BU1NJR05NRU5ULgorCSogY2gtZXhwLnkgKHl5bGV4KTogIENhbGwgbWF0Y2hfZG9sbGFyX3Rva2Vucy4KKworTW9uIERlYyAyOCAxNTowMDowMSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBocHBhaC10ZGVwLmMgKHNraXBfdHJhbXBvbGluZV9jb2RlKTogIFVzZSBuZXcgbWFjcm9zIGZvcgorCWFjY2Vzc2luZyBtaW5pbWFsIHN5bWJvbCBkYXRhLgorCSogaW5mY21kLmMgKHJlYWRfcGMpOiAgVXNlICNpZmRlZiwgbm90ICNpZi4KKwkqIHN5bWZpbGUuYyAoc3ltc19mcm9tX29iamZpbGUpOiAgQWRkIENPTlNUIHRvIGRlY2wgZm9yIHRhcmdldHMuCisJKiB0bS1ocHBhLmggKEZJWF9DQUxMX0RVTU1ZKTogIFVzZSBuZXcgbWFjcm9zIGZvciBhY2Nlc3NpbmcKKwltaW5pbWFsIHN5bWJvbCBkYXRhLgorCisJKiBocHBhaC10ZGVwLmMgKGZyYW1lX3NhdmVkX3BjKTogIFVzZSBiZXR0ZXIgdGVzdCBmb3Igb3V0ZXJtb3N0CisJZnJhbWUuICBVc2UgZmluZF9yZXR1cm5fcmVnbnVtIHRvIGZpbmQgdGhlIGNhbGxlci4KKwkqIChmaW5kX3Vud2luZF9lbnRyeSk6ICBOZXcgcm91dGluZSB0byBsb2NhdGUgc3RhY2sgZnJhbWUgaW5mbworCWFzc29jaWF0ZWQgd2l0aCBhIHByb2NlZHVyZS4gIFRoaXMgbG9va3MgaW4gdGhlICRVTldJTkRfU1RBUlQkCisJc2VjdGlvbiBpbiB0aGUgU09NIGZpbGUuCisJKiAoZmluZF9yZXR1cm5fcmVnbnVtKTogIE5ldyByb3V0aW5lLiAgVXNlcyBmaW5kX3Vud2luZF9lbnRyeSgpIHRvCisJZmlndXJlIG91dCB3aGVyZSB0aGUgY2FsbGVyJ3MgcmV0dXJuIGFkZHJlc3MgaXMgc3RvcmVkLgorCSogKGZpbmRfcHJvY19mcmFtZXNpemUpOiAgTmV3IHJvdXRpbmUuICBVc2VzIGZpbmRfdW53aW5kX2VudHJ5KCkKKwl0byBmaWd1cmUgb3V0IHRoZSBmcmFtZSBzaXplIGZvciBhIHByb2NlZHVyZS4KKwkqIChzYXZlZF9wY19hZnRlcl9jYWxsKTogIE5ldyByb3V0aW5lLCBtb3ZlZCBmcm9tIHRtLWhwcGEuaC4KKwkqIChpbml0X2V4dHJhX2ZyYW1lX2luZm8pOiAgTmV3IHJvdXRpbmUuICBDb3JyZWN0cyBQQyBhbmQgRlAgZm9yCisJb3V0ZXJtb3N0IGZyYW1lIGlmIG5lY2Vzc2FyeS4KKwkqIChmcmFtZV9jaGFpbik6ICBOZXcgcm91dGluZSwgbW92ZWQgZnJvbSB0bS1ocHBhLmguCisJKiAoc2tpcF90cmFtcG9saW5lX2NvZGUpOiAgSGFuZGxlIGNvbXB1dGVkIGZ1bmN0aW9uIGNhbGxzIChpZToKKwljYWxscyBmcm9tICQkZHluY2FsbCkuCisJKiAodW53aW5kX2NvbW1hbmQpOiAgVGVtcG9yYXJ5IHN1cHBvcnQgZnVuY3Rpb24gdG8gYWxsb3cgdXNlcgorCXRvIGNvbnRyb2wvb2JzZXJ2ZSBhc3BlY3RzIG9mIHRoZSB1bndpbmQgKHN0YWNrIGZyYW1lKSBpbmZvLgorCSogaW5mY21kLmMgKHJlYWRfcGMpOiAgKFRlbXBvcmFyeSksIHB1dCBhIGhhY2sgaW4gdG8gc2VlIGlmIHRoZSBQQworCXdhcyBpbiBhIHN5c3RlbSBjYWxsLCBpZiBzbywgdGhlbiByZWFkIHRoZSBQQyBmcm9tIHIzMS4KKwkqIHRtLWhwcGFoLmggKFNLSVBfVFJBTVBPTElORV9DT0RFLCBJTl9TT0xJQl9UUkFNUE9MSU5FKTogIERlYWwKKwl3aXRoIGV4dHJhIGFyZyBmb3Igc2tpcF90cmFtcG9saW5lX2NvZGUoKS4KKwkqIChJTklUX0VYVFJBX0ZSQU1FX0lORk8pOiAgRGVmaW5lIHRvIHBvaW50IGF0IHN1YnIgKHNlZSBhYm92ZSkuCisJKiAoRlJBTUVfQ0hBSU4sIEZSQU1FX0NIQUlOX1ZBTElEKTogIFR1cm4gaW50byByZWFsIHN1YnJvdXRpbmVzLgorCSogdG0taHBwYS5oIChTQVZFRF9QQ19BRlRFUl9DQUxMKTogIFR1cm4gaW50byByZWFsIHN1YnJvdXRpbmUuCisKK1N1biBEZWMgMjcgMTc6MzQ6MTUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGRieHJlYWQuYyAoZGJ4X3N5bWZpbGVfaW5pdCwgZWxmc3RhYl9idWlsZF9wc3ltdGFicyk6CisJQ2FsbCBuZXcgYmZkX2dldF9zaXplKCkgYW5kIHZlcmlmeSB0aGF0IHN0cmluZyB0YWJsZSBpcyBubyBsYXJnZXIKKwl0aGFuIHRoZSBmaWxlIHRoYXQgaXMgc3VwcG9zZWQgdG8gY29udGFpbiBpdC4KKwkqIHN5bWZpbGUuYyAoc3ltc19mcm9tX29iamZpbGUpOiAgT25seSBjb21wbGFpbiBhYm91dCBjb25maWd1cmVkCisJTkFNRVNfSEFWRV9VTkRFUlNDT1JFIGRpZmZlcmVuY2VzIGJldHdlZW4gZ2RiIGFuZCBiZmQgaWYgdGhlCisJY3VycmVudCB0YXJnZXQgaXMgdGhlIGRlZmF1bHQgQkZEIHRhcmdldC4KKworU2F0IERlYyAyNiAyMDo1MTo0MSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogc29saWIuYyAoQktQVF9BVF9NQUlOKTogIENoYW5nZSB0byBCS1BUX0FUX1NZTUJPTC4KKwkqIHNvbGliLmMgKGJrcHRfbmFtZXMpOiAgTmV3IGFycmF5IG9mIHN5bWJvbCBuYW1lcyB0byB0cnkgdG8KKwl1c2UgZm9yIHRoZSAibWFwcGluZyBjb21wbGV0ZSIgYnJlYWtwb2ludC4gIENvbmZpZ3VyYWJsZQorCWRlZmluZSBTT0xJQl9CS1BUX05BTUUgaXMgZmlyc3Qgb25lIHRvIHRyeS4KKwkqIHNvbGliLmMgKGZpbmRfc29saWIpOiAgVGVzdCBkZWJ1Z19iYXNlIGZvciBub256ZXJvIHJhdGhlcgorCXRoYW4ganVzdCBncmVhdGVyIHRoYW4gemVyby4KKwkqIHNvbGliLmMgKGVuYWJsZV9icmVhayk6ICBVc2UgYmtwdF9uYW1lcyB0byBsb29rIHVwIGFkZHJlc3MKKwlhdCB3aGljaCB0byBzZXQgIm1hcHBpbmcgY29tcGxldGUiIGJyZWFrcG9pbnQuCisKK1R1ZSBEZWMgMjIgMjA6MzM6MzggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGRlZnMuaCAoU1RSQ01QLCBTVFJFUSwgU1RSRVFOKTogIE5ldyBtYWNyb3MuCisJKiBkZWZzLmggKGRlbWFuZ2xlX2FuZF9tYXRjaCk6ICBSZW1vdmUgcHJvdG90eXBlLgorCSogZHdhcmZyZWFkLmMgKFNUUkVRLCBTVFJFUU4pOiAgUmVtb3ZlIG1hY3JvcywgcmVwbGFjZWQgd2l0aCBTVFJFUQorCSAgYW5kIFNUUkVRTiBkZWZpbmVkIGluIGRlZnMuaC4KKwkqIGR3YXJmcmVhZC5jIChzZXRfY3VfbGFuZ3VhZ2UpOiAgRm9yIGNvbXBsZXRlbHkgdW5rbm93biBsYW5ndWFnZXMsCisJICB0cnkgdG8gZGVkdWNlIHRoZSBsYW5ndWFnZSBmcm9tIHRoZSBmaWxlbmFtZS4gIFJldGFpbiBiZWhhdmlvcgorCSAgdGhhdCBmb3Iga25vd24gbGFuZ3VhZ2VzIHdlIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSwgd2UgdXNlCisJICBsYW5ndWFnZV91bmtub3duLgorCSogZHdhcmZyZWFkLmMgKGVudW1fdHlwZSwgc3ltdGhlc2l6ZV90eXBlZGVmKTogIEluaXRpYWxpemUgbGFuZ3VhZ2UKKwkgIGFuZCBkZW1hbmdsZWQgbmFtZSBmaWVsZHMgaW4gc3ltYm9sLgorCSogZHdhcmZyZWFkLmMsIG1pcHNyZWFkLmMsIHBhcnRpYWwtc3RhYi5oOiAgRm9yIGFsbCB1c2FnZXMgb2YKKwkgIEFERF9QU1lNQk9MX1RPX0xJU1QsIGFkZCBsYW5ndWFnZSBhbmQgb2JqZmlsZSBwYXJhbWV0ZXJzLgorCSogZHdhcmZyZWFkLmMgKG5ld19zeW1ib2wpOiAgQXR0ZW1wdCB0byBkZW1hbmdsZSBDKysgc3ltYm9sIG5hbWVzCisJICBhbmQgY2FjaGUgdGhlIHJlc3VsdHMgaW4gU1lNQk9MX0RFTUFOR0xFRF9OQU1FIGZvciB0aGUgc3ltYm9sLgorCSogZWxmcmVhZC5jIChTVFJFUSk6ICBSZW1vdmUgbWFjcm8sIHVzZSBTVFJFUSBkZWZpbmVkIGluIGRlZnMuaC4KKwkgIFJlcGxhY2UgdXNhZ2VzIHRocm91Z2hvdXQuCisJKiBlbGZyZWFkLmMgKGRlbWFuZ2xlLmgpOiAgSW5jbHVkZS4KKwkqIGVsZnJlYWQuYyAocmVjb3JkX21pbmltYWxfc3ltYm9sKTogIFJlbW92ZSBwcm90b3R5cGUgYW5kIGZ1bmN0aW9uLgorCSogZ2RidHlwZXMuaCwgc3ltdGFiLmggKEJfU0VULCBCX0NMUiwgQl9UU1QsIEJfVFlQRSwgQl9CWVRFUywKKwkgIEJfQ0xSQUxMKTogIE1vdmVkIGZyb20gc3ltdGFiLmggdG8gZ2RidHlwZXMuaC4KKwkqIGluZmNtZC5jIChqdW1wX2NvbW1hbmQpOiAgUmVtb3ZlIGNvZGUgdG8gZGVtYW5nbGUgbmFtZSBhbmQgYWRkCisJICBpdCB0byBhIGNsZWFudXAgbGlzdC4gIE5vdyBqdXN0IHVzZSBTWU1CT0xfREVNQU5HTEVEX05BTUUuCisJKiBtaW5zeW1zLmMgKGRlbWFuZ2xlLmgpOiAgSW5jbHVkZS4KKwkqIG1pbnN5bXMuYyAobG9va3VwX21pbmltYWxfc3ltYm9sKTogIEluZGVudCBjb21tZW50IHRvIG1hdGNoIGNvZGUuCisJKiBtaW5zeW1zLmMgKGluc3RhbGxfbWluaW1hbF9zeW1ib2xzKTogIEF0dGVtcHQgdG8gZGVtYW5nbGUgc3ltYm9sCisJICBuYW1lcyBhcyBDKysgbmFtZXMsIGFuZCBjYWNoZSB0aGVtIGluIFNZTUJPTF9ERU1BTkdMRURfTkFNRS4KKwkqIG1pcHNyZWFkLmMgKHBzeW10YWJfbGFuZ3VhZ2UpOiAgQWRkIHN0YXRpYyB2YXJpYWJsZS4KKwkqIHN0YWJzcmVhZC5jIChkZW1hbmdsZS5oKTogIEluY2x1ZGUuCisJKiBzdGFic3JlYWQuYyAoZGVmaW5lX3N5bWJvbCk6ICBBdHRlbXB0IHRvIGRlbWFuZ2xlIEMrKyBzeW1ib2wKKwkgIG5hbWVzIGFuZCBjYWNoZSB0aGVtIGluIHRoZSBTWU1CT0xfREVNQU5HTEVEX05BTUUgZmllbGQuCisJKiBzdGFjay5jIChyZXR1cm5fY29tbWFuZCk6ICBSZW1vdmUgZXhwbGljaXQgZGVtYW5nbGluZyBvZiBuYW1lCisJICBhbmQgdXNlIG9mIGNsZWFudXBzLiAgSnVzdCB1c2UgU1lNQk9MX0RFTUFOR0xFRF9OQU1FLiAKKwkqIHN5bWZpbGUuYyAoZGVtYW5nbGUuaCk6ICBJbmNsdWRlLgorCSogc3ltZmlsZS5jIChhZGRfcHN5bWJvbF90b19saXN0LCBhZGRfcHN5bWJvbF9hZGRyX3RvX2xpc3QpOiAgRml4CisJICB0byBtYXRjaCBtYWNyb3MgaW4gc3ltZmlsZS5oIGFuZCBhbGxvdyB0aGVtIHRvIGJlIGNvbXBpbGVkCisJICBpZiBJTkxJTkVfQUREX1BTWU1CT0wgaXMgbm90IHRydWUuCisJKiBzeW1maWxlLmggKElOTElORV9BRERfUFNZTUJPTCk6ICBEZWZhdWx0IHRvIHRydWUgaWYgbm90IHNldC4KKwkqIHN5bWZpbGUuaCAoQUREX1BTWU1CT0xfKik6ICBBZGQgbGFuZ3VhZ2UgYW5kIG9iamZpbGUgcGFyYW1ldGVycy4KKwkgIEFkZCBjb2RlIHRvIGRlbWFuZ2xlIGFuZCBjYWNoZSBDKysgc3ltYm9sIG5hbWVzLiAgVXNlIG1hY3JvIGZvcm0KKwkgIGlmIElOTElORV9BRERfUFNZTUJPTCBpcyB0cnVlLCBvdGhlcndpc2UgdXNlIEMgZnVuY3Rpb24gZm9ybS4KKwkqIHN5bW1pc2MuYyAoYWRkX3BzeW1ib2xfdG9fbGlzdCwgYWRkX3BzeW1ib2xfYWRkcl90b19saXN0KToKKwkgIFJlbW92ZSwgYWxzbyBkZWZpbmVkIGluIHN5bWZpbGUuYywgd2hpY2ggd2UgYWxyZWFkeSBmaXhlZC4KKwkqIHN5bXRhYi5jIChleHBlbnNpdmVfbWFuZ2xlcik6ICBSZW1vdmUgcHJvdG90eXBlIGFuZCBmdW5jdGlvbi4KKwkqIHN5bXRhYi5jIChmaW5kX21ldGhvZHMpOiAgUmVtb3ZlIHBoeXNuYW1lcyBwYXJhbWV0ZXIgYW5kIGZpeAorCSAgcHJvdG90eXBlIHRvIG1hdGNoLgorCSogc3ltdGFiLmMgKGNvbXBsZXRpb25fbGlzdF9hZGRfc3ltYm9sKTogIE5hbWUgY2hhbmdlZCB0bworCSAgY29tcGxldGlvbl9saXN0X2FkZF9uYW1lLgorCSogc3ltdGFiLmMgKENPTVBMRVRJT05fTElTVF9BRERfU1lNQk9MKTogIE5ldyBtYWNybywgYWRkcyBib3RoCisJICB0aGUgbm9ybWFsIHN5bWJvbCBuYW1lIGFuZCB0aGUgY2FjaGVkIEMrKyBkZW1hbmdsZWQgbmFtZS4KKwkqIHN5bXRhYi5jIChsb29rdXBfZGVtYW5nbGVkX3BhcnRpYWxfc3ltYm9sLAorCSAgbG9va3VwX2RlbWFuZ2xlZF9ibG9ja19zeW1ib2wpOiAgUmVtb3ZlIHByb3RvdHlwZXMgYW5kIGZ1bmN0aW9ucy4KKwkqIHN5bXRhYi5jIChsb29rdXBfc3ltYm9sKTogIFJlbW92ZSB1c2Ugb2YgZXhwZW5zaXZlX21hbmdsZXIsCisJICB1c2UgbG9va3VwX2Jsb2NrX3N5bWJvbCBpbnN0ZWFkIG9mIGxvb2t1cF9kZW1hbmdsZWRfYmxvY2tfc3ltYm9sLgorCSAgUmVtb3ZlIGNvZGUgdG8gdHJ5IGRlbWFuZ2xpbmcgbmFtZXMgYW5kIG1hdGNoaW5nIHRoZW0uCisJKiBzeW10YWIuYyAobG9va3VwX3BhcnRpYWxfc3ltYm9sLCBsb29rdXBfYmxvY2tfc3ltYm9sKToKKwkgIEZpeCB0byB0cnkgbWF0Y2hpbmcgdGhlIGNhY2hlZCBkZW1hbmdsZWQgbmFtZSBpZiBubyBtYXRjaCBpcworCSAgZm91bmQgdXNpbmcgdGhlIHJlZ3VsYXIgc3ltYm9sIG5hbWUuCisJKiBzeW10YWIuYyAoZmluZF9tZXRob2RzKTogIFJlbW92ZSB1bnVzZWQgcGh5c25hbWVzIGFycmF5LgorCSogc3ltdGFiLmMgKG5hbWVfbWF0Y2gsIE5BTUVfTUFUQ0gpOiAgUmVtb3ZlIGZ1bmN0aW9uIGFuZCBtYWNybywKKwkgIHJlcGxhY2VkIHdpdGggU1lNQk9MX01BVENIRVNfUkVHRVhQIGZyb20gc3ltdGFiLmguCisJKiBzeW10YWIuYyAoY29tcGxldGlvbl9saXN0X2FkZF9zeW1ib2wpOiAgUmV3cml0ZSB0byB1c2UgY2FjaGVkCisJICBDKysgZGVtYW5nbGVkIHN5bWJvbCBuYW1lcy4KKwkqIHN5bXRhYi5oOiAgTXVjaCByZWZvcm1hdHRpbmcgb2Ygc3RydWN0dXJlcyBhbmQgc3VjaCB0byBhZGQKKwkgIHdoaXRlc3BhY2UgdG8gbWFrZSB0aGVtIG1vcmUgcmVhZGFibGUsIGFuZCBtYWtlIHRoZW0gbW9yZQorCSAgY29uc2lzdGVudCB3aXRoIG90aGVyIGdkYiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuCisJKiBzeW10YWIuaCAoZ2VuZXJhbF9zeW1ib2xfaW5mbyk6IE5ldyBzdHJ1Y3QgY29udGFpbmluZyBmaWVsZHMKKwkgIGNvbW1vbiB0byBhbGwgc3ltYm9scy4KKwkqIHN5bXRhYi5oIChTWU1CT0xfTEFOR1VBR0UsIFNZTUJPTF9ERU1BTkdMRURfTkFNRSwKKwkgIFNZTUJPTF9TT1VSQ0VfTkFNRSwgU1lNQk9MX0xJTktBR0VfTkFNRSwgU1lNQk9MX01BVENIRVNfTkFNRSwKKwkgIFNZTUJPTF9NQVRDSEVTX1JFR0VYUCwgTVNZTUJPTF9JTkZPLCBNU1lNQk9MX1RZUEUpOiAgTmV3IG1hY3Jvcy4KKwkqIHN5bXRhYi4gKHN0cnVjdCBtaW5pbWFsX3N5bWJvbCwgc3RydWN0IHBhcnRpYWxfc3ltYm9sLCBzdHJ1Y3QKKwkgIHN5bWJvbCk6IFVzZSBnZW5lcmFsX3N5bWJvbF9pbmZvIHN0cnVjdC4KKwkqIHV0aWxzLmMgKGRlbWFuZ2xlX2FuZF9tYXRjaCk6ICBSZW1vdmUsIG5vIGxvbmdlciB1c2VkLgorCSogdmFsb3BzLmMgKGRlbWFuZ2xlLmgpOiAgSW5jbHVkZS4JCisJKiB4Y29mZmV4ZWMuYyAoZXEpOiAgUmVtb3ZlIG1hY3JvLCByZXBsYWNlIHVzYWdlcyB3aXRoIFNUUkVRLgorCSogYmxvY2tmcmFtZS5jLCBicmVha3BvaW50LmMsIGMtZXhwLnksIGMtdmFscHJpbnQuYywgZGJ4cmVhZC5jLAorCSAgaW5mY21kLmMsIG0yLWV4cC55LCBtaW5zeW1zLmMsIG9iamZpbGVzLmgsIHNvbGliLmMsIHN0YWNrLmMsCisJICBzeW1taXNjLmMsIHN5bXRhYi5jLCB2YWxvcHMuYzogIFJlcGxhY2UgcmVmZXJlbmNlcyB0byBtaW5pbWFsCisJICBzeW1ib2wgZmllbGRzIHdpdGggYXBwcm9wcmlhdGUgbWFjcm9zLgorCSogYnJlYWtwb2ludC5jLCBidWlsZHN5bS5jLCBjLWV4cC55LCBjLXR5cGVwcmludC5jLCBjLXZhbHByaW50LmMsCisJICBjb2ZmcmVhZC5jLCBjb21tYW5kLmMsIGNvbnZleC10ZGVwLmMsIGNwLXZhbHByaW50LmMsIGRieHJlYWQuYywKKwkgIGRlbWFuZ2xlLmMsIGVsZnJlYWQuYywgZW5lcmdpemUuYywgZW52aXJvbi5jLCBleGVjLmMsCisJICBnZGJ0eXBlcy5jLCBpOTYwLXRkZXAuYywgaW5mcnVuLmMsIGluZnJ1bi1oYWNrZWQuYywgbGFuZ3VhZ2UuYywKKwkgIG1haW4uYywgbWluc3ltcy5jLCBtaXBzcmVhZC5jLCBwYXJ0aWFsLXN0YWIuaCwgcmVtb3RlLWVzMTgwMC5jLAorCSAgcmVtb3RlLW5pbmR5LmMsIHJlbW90ZS11ZGkuYywgcnM2MDAwLXRkZXAuYywgc29saWIuYywgc291cmNlLmMsCisJICBzcGFyYy1waW5zbi5jLCBzdGFic3JlYWQuYywgc3RhbmRhbG9uZS5jLCBzdGF0ZS5jLCBzdHVmZi5jLCAKKwkgIHN5bWZpbGUuYywgc3ltbWlzYy5jLCBzeW10YWIuYywgc3ltdGFiLmgsIHRtLXN5c3Y0LmgsCisJICB0bS11bHRyYTMuaCwgdmFsdWVzLmMsIHhjb2ZmZXhlYy5jLCB4Y29mZnJlYWQuYzogIFJlcGxhY2Ugc3RyY21wCisJICBhbmQgc3RybmNtcCB1c2FnZXMgd2l0aCBTVFJFUSwgU1RSRVFOLCBvciBTVFJDTVAgYXMgYXBwcm9wcmlhdGUuCisJKiBicmVha3BvaW50LmMsIGJ1aWxkc3ltLmMsIGMtdHlwZXByaW50LmMsIGV4cHByaW50LmMsIGZpbmR2YXIuYywKKwkgIG1pcHNyZWFkLmMsIHByaW50Y21kLmMsIHNvdXJjZS5jLCBzdGFic3JlYWQuYywgc3RhY2suYywKKwkgIHN5bW1pc2MuYywgdG0tMjlrLmgsIHZhbG9wcy5jLCB2YWx1ZXMuYzogIFJlcGxhY2UgU1lNQk9MX05BTUUKKwkgIHJlZmVyZW5jZXMgd2l0aCBTWU1CT0xfU09VUkNFX05BTUUgb3IgU1lNQk9MX0xJTktBR0VfTkFNRSBhcworCSAgYXBwcm9wcmlhdGUuCisJKiBidWlsZHN5bS5jIChzdGFydF9zdWJmaWxlLCBwYXRjaF9zdWJmaWxlX25hbWVzKTogIERlZmF1bHQgdGhlCisJICBzb3VyY2UgbGFuZ3VhZ2UgdG8gd2hhdCBjYW4gYmUgZGVkdWNlZCBmcm9tIHRoZSBmaWxlbmFtZS4KKwkqIGJ1aWxkc3ltLmMgKGVuZF9zeW10YWIpOiAgVXBkYXRlIHRoZSBzb3VyY2UgbGFuZ3VhZ2UgaW4gdGhlCisJICBhbGxvY2F0ZWQgc3ltdGFiIHRvIG1hdGNoIHdoYXQgd2UgaGF2ZSBiZWVuIHVzaW5nLgorCSogYnVpbGRzeW0uaCAoc3RydWN0IHN1YmZpbGUpOiAgQWRkIGEgbGFuZ3VhZ2UgZmllbGQuCisJKiBjLXR5cGVwcmludC5jIChjX3ByaW50X3R5cGUpOiAgUmVtb3ZlIGNvZGUgdG8gZG8gZXhwbGljaXQKKwkgIGRlbWFuZ2xpbmcuCisJKiBkYnhyZWFkLmMgKHBzeW10YWJfbGFuZ3VhZ2UpOiAgQWRkIHN0YXRpYyB2YXJpYWJsZS4KKwkqIGRieHJlYWQuYyAoc3RhcnRfcHN5bXRhYik6ICBJbml0aWFsaXplIHBzeW10YWJfbGFuZ3VhZ2UgdXNpbmcKKwkgIGRlZHVjZV9sYW5ndWFnZV9mcm9tX2ZpbGVuYW1lLgorCitNb24gRGVjIDIxIDIyOjI0OjMzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnQpOiAgUmVvcmdhbml6ZSBjb21tZW50IGFuZCBhZGQgbm90ZQorCWFib3V0IGRlcGVuZGVuY3kgb24gdGFyZ2V0IGJ5dGUgb3JkZXJpbmcuCisJKiBjaC1leHAueSAodmFsdWVfYXJyYXlfc2xpY2UpOiAgRml4IHR5cG8uCisJKiBjaC12YWxwcmludC5jIChjaGlsbF92YWxfcHJpbnQpOiBSZW1vdmUgQydpc20gdGhhdCBhcnJheXMgb2YKKwlieXRlIHNpemVkIGludHMgYXJlIGFzc3VtZWQgdG8gYmUgY2hhciBzdHJpbmdzIGFuZCBwcmludGVkIHdpdGgKKwlzdHJpbmcgc3ludGF4LiAgSW4gY2hpbGwsIGFycmF5cyBvZiBjaGFycyBhbmQgYXJyYXlzIG9mCisJYnl0ZXMvdWJ5dGVzIGFyZSBkaXN0aW5xdWlzaGFibGUsIGFuZCBwcmludGVkIGFwcHJvcHJpYXRlbHkuCisKK01vbiBEZWMgMjEgMTg6MDI6MzUgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogdG0taHBwYWguaDogICNkZWZpbmUgTkVFRF9URVhUX1NUQVJUX0VORCBmb3IgdGFyZ2V0IG1lbW9yeQorCXJlYWQvd3JpdGUgcm91dGluZXMgZm9yIEhQVVguCisKKwkqIGhwcGEtcGluc24uYyAocHJpbnRfaW5zbik6ICBJbXByb3ZlIGhhbmRsaW5nIG9mIGJlIGFuZCBibGUKKwlicmFuY2ggdGFyZ2V0cyB0byBjb21wdXRlIHRhcmdldCBhZGRyZXNzIHVzaW5nIGNvbnN0IGZyb20gcHJldmlvdXMKKwlpbnN0cnVjdGlvbiBpZiBuZWNlc3NhcnkuCisJKiBBZGQgYFEnIG9wZXJhdG9yIHRvIHByaW50IG91dCBiaXQgcG9zaXRpb24gZmllbGQgdmFyaW91cworCWluc3RydWN0aW9ucy4KKwkqIGhwcGFoLW5hdC5jOiAgI2luY2x1ZGUgc3lzL3BhcmFtLmgsIGFuZCBzeXMvdXNlci5oLiAgR2VuZXJhbAorCWNsZWFudXBzLCB1c2UgbmV3IGNvZGUgZnJvbSBVdGFoLgorCSogKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBVcGRhdGUgdG8gbmV3IGNvZGUgZnJvbSBVdGFoLgorCSogKGluaXRpYWxpemVfa2VybmVsX3VfYWRkcik6ICBSZS1lbmFibGUgZGVjbCBvZiBzdHJ1Y3QgdXNlciB1LgorCSogKGZldGNoX3JlZ2lzdGVyKTogIENsZWFyIG91dCBwcml2IGxldmVsIHdoZW4gcmVhZGluZyBQQ3MuCisJKiBocHBhaC10ZGVwLmM6ICBHZXQgcmlkIG9mIGdvYnMgb2YgS0VSTkVMREVCVUcgc3R1ZmYuCisJKiBSZW1vdmUgZGVjbCBvZiBlcnJubywgI2luY2x1ZGUgd2FpdC5oIGFuZCB0YXJnZXQuaC4KKwkqIChmcmFtZV9zYXZlZF9wYyk6ICBDaGVjayBgZmxhZ3MnIHBzZXVkby1yZWdpc3RlciB0byBzZWUgaWYgd2UKKwl3ZXJlIGluc2lkZSBvZiBhIGtlcm5lbCBjYWxsLiAgSWYgc28sIHRoZW4gUEMgaXMgaW4gYSBkaWZmZXJlbnQKKwlyZWdpc3Rlci4gIEFsc28sIG1hc2sgb3V0IGJvdHRvbSB0d28gYml0cyBvZiBhbGwgUENzIHNvIGFzIG5vdCB0bworCWNvbmZ1c2UgaGlnaGVyIGxldmVsIGNvZGUuCisJKiAocHVzaF9kdW1teV9mcmFtZSk6ICBDcmVhdGUgZnJvbSAjZGVmaW5lIGluIHRtLWhwcGEuaC4KKwkqIChmaW5kX2R1bW15X2ZyYW1lX3JlZ3MpOiAgVXBkYXRlIGZyb20gVXRhaC4KKwkqIChocF9wb3BfZnJhbWUpOiAgQ3JlYXRlIGZyb20gI2RlZmluZSBpbiB0bS1ocHBhLmguCisJKiAoaHBfcmVzdG9yZV9wY19xdWV1ZSk6ICBOZXcsIGZyb20gVXRhaC4KKwkqIChocF9wdXNoX2FyZ3VtZW50cyk6ICBCaWcgZml4ZXMgZnJvbSBVdGFoLgorCSogKHBhX2RvX3JlZ2lzdGVyc19pbmZvLCBwYV9wcmludF9yZWdpc3RlcnMpOiAgT25seSBwcmludCBvdXQgZnAKKwlyZWdzIHVwb24gcmVxdWVzdC4KKwkqIChza2lwX3RyYW1wb2xpbmVfY29kZSk6ICBOZXcgcm91dGluZSB0byBkZWFsIHdpdGggc3R1YnMgdGhhdAorCWxpdmUgaW4gbm93aGVyZWxhbmQgYmV0d2VlbiBjYWxsZXJzIGFuZCBjYWxsZWVzLgorCSogaTg2MC10ZGVwLmM6ICBSZW1vdmUgZGVjbCBvZiBhdHRhY2hfZmxhZy4KKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBBZGQgbmV3IG1hY3JvCisJSU5TVFJVQ1RJT05fTlVMTElGSUVELCB3aGljaCBjYW4gdGVsbCBpZiB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlZAorCWF0IGJ5IFBDIHdpbGwgYmUgbnVsbGlmaWVkLiAgSWYgc28sIHRoZW4gc3RlcCB0aGUgdGFyZ2V0IG9uY2UgbW9yZQorCXNvIGFzIHRvIGF2b2lkIGNvbmZ1c2luZyB0aGUgdXNlci4KKwkqIChqdXN0IGJlZm9yZSBzdGVwX292ZXJfZnVuY3Rpb246KTogIFVzZSBzdG9wX2Z1bmNfc3RhcnQsIG5vdAorCXN0b3BfcGMgd2hlbiBjaGVja2luZyBmb3IgdGhlIGV4aXN0YW5jZSBvZiBsaW5lIG51bWJlciBpbmZvLgorCXN0b3BfZnVuY19zdGFydCB3aWxsIHJlZmxlY3QgdGhlIHByb3BlciBhZGRyZXNzIG9mIHRoZSB0YXJnZXQKKwlyb3V0aW5lLCBub3Qgb2YgdGhlIHN0dWIgdGhhdCB3ZSBtYXkgYmUgdHJhdmVyc2luZyB0byBnZXQgdGhlcmUuCisJKiB0bS1ocHBhLmg6ICBkZWZpbmUgU0tJUF9UUkFNUE9MSU5FX0NPREUgYW5kIElOX1NPTElCX1RSQU1QT0xJTkUKKwl0byBkZWFsIHdpdGggdGhlIHN0dWJzIHRoYXQgUEEgY29tcGlsZXJzIHNvbWV0aW1lcyBzdGljayBiZXR3ZWVuCisJY2FsbGVycyBhbmQgY2FsbGVlcy4gIEFsc28sIGRlZmluZSBGTEFHU19SRUdOVU0gZm9yIGFjY2VzcyB0byB0aGUKKwlgZmxhZ3MnIHBzZXVkby1yZWcuCisJKiAoUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMLCBSRUdJU1RFUl9DT05WRVJUX1RPX1JBVyk6ICBVc2UKKwltZW1jcHksIG5vdCBiY29weS4KKwkqIChDQU5OT1RfU1RPUkVfUkVHSVNURVIpOiAgTmV3IGZyb20gVXRhaC4gIFNheXMgdGhhdCB3ZSBjYW4ndAorCXdyaXRlIGdyMCwgUEMgcmVncywgYW5kIFBTVyEKKwkqIChGUkFNRV9GSU5EX1NBVkVEX1JFR1MpOiAgQnVnIGZpeGVzIGZyb20gVXRhaC4KKwkqIChQVVNIX0RVTU1ZX0ZSQU1FLCBQT1BfRlJBTUUpOiAgTWFrZSBpbnRvIHJlYWwgcm91dGluZXMgaW4KKwlocHBhaC1uYXQuYy4KKwkqIChDQUxMX0RVTU1ZLCBGSVhfQ0FMTF9EVU1NWSk6ICBGaXhlcyBmcm9tIFV0YWguCisJKiBEZWZpbmUgc3RydWN0IHVud2luZF90YWJsZV9lbnRyeS4KKwkqIHZhbG9wcy5jIChjYWxsX2Z1bmN0aW9uX2J5X2hhbmQpOiAgQWRkIGFub3RoZXIgYXJnIHRvCisJRklYX0NBTExfRFVNTVkgKHVuZGVyICNpZmRlZiBHREJfVEFSR0VUX0lTX0hQUEEpLiAgV2h5IGlzIHRoaXMKKwluZWNlc3Nhcnk/CisKK01vbiBEZWMgMjEgMDI6MTc6NTcgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiByZW1vdGUtdnguYzogcmVtb3ZlIGluY2x1ZGUgb2YgInN5bWZpbGUuaCIsIHJlcGxhY2UgaXQgd2l0aCAiY29tcGxhaW50cy5oIgorCitGcmkgRGVjIDE4IDEwOjMyOjI1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICBCdW1wIHRvIDQuNy40LgorCSogTWFrZWZpbGUuaW4gKFNGSUxFU19NQUlORElSKTogIEFkZCB0eXBlcHJpbnQuYywgYy10eXBlcHJpbnQuYywKKwkgIG0yLXR5cGVwcmludC5jLCBjLXZhbHByaW50LmMgY3AtdmFscHJpbnQuYyBtMi12YWxwcmludC5jLgorCSogTWFrZWZpbGUuaW4gKEhGSUxFUyk6ICBBZGQgdmFscHJpbnQuaC4KKwkqIE1ha2VmaWxlLmluIChPQlMpOiAgQWRkIHR5cGVwcmludC5vLCBjLXR5cGVwcmludC5vLAorCSAgbTItdHlwZXByaW50Lm8sIGMtdmFscHJpbnQubywgY3AtdmFscHJpbnQubyBtMi12YWxwcmludC5vLgorCSogdHlwZXByaW50LmMsIHR5cGVwcmludC5oOiAgTmV3IGZpbGVzIGZvciBsYW5ndWFnZSBpbmRlcGVuZGVudAorCSAgdHlwZSBwcmludGluZyBmdW5jdGlvbnMuCisJKiBjLXR5cGVwcmludC5jLCBtMi10eXBlcHJpbnQuYzogIE5ldyBmaWxlcyBmb3IgbGFuZ3VhZ2UgZGVwZW5kZW50CisJICB0eXBlIHByaW50aW5nIGZ1bmN0aW9ucyBhbmQgZGVmaW5pdGlvbnMuCisJKiB2YWxwcmludC5oOiAgTmV3IGluY2x1ZGUgZmlsZSBmb3IgbGFuZ3VhZ2UgaW5kZXBlbmRlbnQgdmFsdWUKKwkgIHByaW50aW5nIGRlZmluaXRpb25zLgorCSogYy12YWxwcmludC5jLCBjcC12YWxwcmludC5jLCBtMi12YWxwcmludC5jOiAgTmV3IGZpbGVzIGZvciBsYW5ndWFnZQorCSAgZGVwZW5kZW50IHZhbHVlIHByaW50aW5nIGZ1bmN0aW9ucy4KKwkqIGMtZXhwLnkgKHByb2R1Y3Rpb24gcHR5cGUpOiAgQWRkIHJhbmdlX3R5cGUgdmFyaWFibGUgYW5kIHVzZSBuZXcKKwkgIGNyZWF0ZV9yYW5nZV90eXBlIGZ1bmN0aW9uLgorCSogYy1leHAueSAodG9rZW50YWIyLCB0b2tlbnRhYjMpLCBjLWxhbmcuYyAoY19vcF9wcmludF90YWIpLAorCSAgaW5mY21kLmMgKHBhdGhfdmFyX25hbWUpLCBsYW5ndWFnZS5jICh1bmtfb3BfcHJpbnRfdGFiKSwgCisJICBtMi1sYW5nLmMgKG0yX29wX3ByaW50X3RhYik6ICBDaGFuZ2UgZnJvbSBBTlNJLW9ic29sZXNjZW50CisJICAiY29uc3Qgc3RhdGljIiB0byBBTlNJLWNvbmZvcm1hbnQgInN0YXRpYyBjb25zdCIuCisJKiBjLWV4cC55IChjX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlKTogIFJlbW92ZSB1bnVzZWQgbmJ5dGVzLgorCSogYy1leHAueSAoY19sYW5ndWFnZV9kZWZuLCBjcGx1c19sYW5ndWFnZV9kZWZuKTogIEFkZCBjX3ByaW50X3R5cGUsCisJICBhbmQgY192YWxfcHJpbnQuCisJKiBjLWxhbmcuaCAoY19wcmludF90eXBlLCBjX3ZhbF9wcmludCk6ICBBZGQgcHJvdG90eXBlcy4KKwkqIGNvZmZyZWFkLmMgKGRlY29kZV90eXBlKTogIEFkZCByYW5nZV90eXBlIHZhcmlhYmxlIGFuZCBjYWxsIHRvCisJICBuZXcgY3JlYXRlX3JhbmdlX3R5cGUgZnVuY3Rpb24uCisJKiBjb21wbGFpbnRzLmMgKGNvbXBsYWluKTogIFJlbW92ZSB1bnVzZWQgdmFsIHZhcmlhYmxlLgorCSogY29tcGxhaW50cy5jIChfaW5pdGlhbGl6ZV9jb21wbGFpbnRzKTogIE1ha2UgaXQgdm9pZC4KKwkqIGNvbnZleC10ZGVwLmMgKHZhbHVlX29mX3RyYXBwZWRfaW50ZXJuYWx2YXIpOiAgQWRkIHJhbmdlX3R5cGUKKwkgIHZhcmlhYmxlIGFuZCBjYWxsIG5ldyBjcmVhdGVfcmFuZ2VfdHlwZSBmdW5jdGlvbi4KKwkqIGRlZnMuaCAoZW51bSB2YWxfcHJldHR5cHJpbnQpOiAgTW92ZSBlbnVtIGZyb20gdmFsdWUuaCB0byBoZXJlCisJICBzbyB3ZSBjYW4gYXZvaWQgaGF2aW5nIHRvIGluY2x1ZGUgdmFsdWUuaCBqdXN0IGZvciBwcm90b3R5cGVzIHRoYXQKKwkgIG5lZWQgdGhlIGVudW0gKHRoYW5rcyBBTlNJKS4KKwkqIGR3YXJmcmVhZC5jIChzdHJ1Y3RfdHlwZSk6ICBMb2NhbCBhbm9ueW1vdXNfc2l6ZSB2YXJpYWJsZSBpcworCSAgb25seSB1c2VkIGlmICFCSVRTX0JJR19FTkRJQU4uCisJKiBkd2FyZnJlYWQuYyAoZGVjb2RlX3N1YnNjcmlwdF9kYXRhX2l0ZW0pOiAgQWRkIHJhbmdldHlwZQorCSAgdmFyaWFibGUgYW5kIGNhbGwgbmV3IGNyZWF0ZV9yYW5nZV90eXBlIGZ1bmN0aW9uLgorCSogZWxmcmVhZC5jIChlbGZfc3ltZmlsZV9yZWFkKTogIFJlbW92ZSB1bnVzZWQgZGJ4IGFuZCB0ZXh0X3NlY3QKKwkgIHZhcmlhYmxlcy4KKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKTogIFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgbmFtZQorCSAgYW5kIHRoZSBzdGF0ZW1lbnQgd2l0aCBubyBzaWRlIGVmZmVjdHMgdGhhdCBpbml0aWFsaXplcyBpdC4KKwkqIGV4cHByaW50LmMgKHByaW50X3N1YmV4cCk6ICBDaGFuZ2UgbG9jYWxfcHJpbnRzdHIgdG8KKwkgIExBX1BSSU5UX1NUUklORy4KKwkqIGdkYnR5cGVzLmMgKGNyZWF0ZV9yYW5nZV90eXBlKTogIE5ldyBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMKKwkgIGEgcmFuZ2UgdHlwZSB1c2luZyBjb2RlIGZyYWdtZW50cyBmcm9tIG9iamVjdCBmaWxlIHJlYWRlcnMgYXMKKwkgIGFuIGV4YW1wbGUgb2Ygd2hhdCBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQuCisJKiBnZGJ0eXBlcy5jIChjcmVhdGVfYXJyYXlfdHlwZSk6ICBSZW1vdmVkIGluZGV4X3R5cGUsIGxvd19ib3VuZCwKKwkgIGFuZCBoaWdoX2JvdW5kIHBhcmFtZXRlcnMsIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgcmFuZ2VfdHlwZQorCSAgcGFyYW1ldGVyLiAgQ2hhbmdlIGZ1bmN0aW9uIGJvZHkgdG8gdXNlIHBhc3NlZCBpbiByYW5nZV90eXBlCisJICByYXRoZXIgdGhhbiBoYW5kY3JhZnRpbmcgb25lLgorCSogZ2RidHlwZXMuaCAoY3JlYXRlX3JhbmdlX3R5cGUpOiAgQWRkIHByb3RvdHlwZS4KKwkqIGdkYnR5cGVzLmggKGNyZWF0ZV9hcnJheV90eXBlKTogIENoYW5nZSBwcm90b3R5cGUgcGFyYW1ldGVycy4KKwkqIGluZnJ1bi5jIChub3JtYWxfc3RvcCk6ICBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlcyB0ZW0gYW5kIGMuCisJKiBpbmZydW4uYyAoaG9va19zdG9wX3N0dWIpOiAgUmV0dXJuIDAgcmF0aGVyIHRoYW4gcmFuZG9tIHZhbHVlLgorCSogbGFuZ3VhZ2UuYyAodW5rX2xhbmdfcHJpbnRfdHlwZSwgdW5rX2xhbmdfdmFsX3ByaW50KTogIEFkZAorCSAgc3R1YiBmdW5jdGlvbnMgdGhhdCBjYWxsIGVycm9yIGlmIGNhbGxlZC4KKwkqIGxhbmd1YWdlLmMgKHVua25vd25fbGFuZ3VhZ2VfZGVmbiwgYXV0b19sYW5ndWFnZV9kZWZuLAorCSAgbG9jYWxfbGFuZ3VhZ2VfZGVmbik6ICBBZGQgaW5pdGlhbGl6ZXJzIHVua19sYW5nX3ByaW50X3R5cGUgYW5kCisJICB1bmtfbGFuZ192YWxfcHJpbnQuCisJKiBsYW5ndWFnZS5oIChzdHJ1Y3QgbGFuZ3VhZ2VfZGVmbik6ICBSZWZvcm1hdCBmb3IgbGFyZ2VyCisJICBjb21tZW50cywgYWRkIGxhX3ByaW50X3R5cGUgYW5kIGxhX3ZhbF9wcmludCBtZW1iZXJzLiAgQWRkCisJICBMQV9QUklOVF9UWVBFIGFuZCBMQV9WQUxfUFJJTlQgbWFjcm9zLiAgQ2hhbmdlIGxvY2FsX3ByaW50Y2hhcgorCSAgdG8gTEFfUFJJTlRfQ0hBUiBhbmQgbG9jYWxfcHJpbnRzdHIgdG8gTEFfUFJJTlRfU1RSSU5HLgorCSogbTItbGFuZy5jIChtMl9jcmVhdGVfZnVuZGFtZW50YWxfdHlwZSk6ICBSZW1vdmUgdW51c2VkIGxvY2FsCisJICB2YXJpYWJsZSBuYnl0ZXMuCisJKiBtMi1sYW5nLmMgKG0yX2xhbmd1YWdlX2RlZm4pOiAgQWRkIGluaXRpYWxpemVycyBtMl9wcmludF90eXBlCisJICBhbmQgbTJfdmFsX3ByaW50LgorCSogbTItbGFuZy5oIChtMl9wcmludF90eXBlLCBtMl92YWxfcHJpbnQpOiAgQWRkIHByb3RvdHlwZXMuCisJKiBtYWluLmMgKGV4ZWN1dGVfY29tbWFuZCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgY21kbGluZXMuCisJKiBtYWluLmMgKGVjaG9fY29tbWFuZCksIHN0YWJzcmVhZC5jIChyZWFkX3R5cGUpLCBwcmludGNtZC5jCisJICAoY2xlYXJfZGlzcGxheXMpLCBzeW1taXNjLmMgKGJsb2NrX2RlcHRoKSwgdmFsdWVzLmMKKwkgIChjbGVhcl92YWx1ZV9oaXN0b3J5KToKKwkgIE1ha2UgdGVzdGluZyBvZiB0cnV0aCB2YWx1ZSBvZiBhc3NpZ25tZW50IHJlc3VsdCBleHBsaWNpdC4KKwkqIG1pcHNyZWFkLmMgKHVwZ3JhZGVfdHlwZSk6ICBVcGRhdGUgRklYTUUgdG8gaW5jbHVkZSBmdXR1cmUgdXNlCisJICBvZiBjcmVhdGVfcmFuZ2VfdHlwZS4KKwkqIHByaW50Y21kLmMgKHB0eXBlX2NvbW1hbmQsIHB0eXBlX2V2YWwsIHdoYXRpc19jb21tYW5kLAorCSAgd2hhdGlzX2V4cCwgbWFpbnRlbmFuY2VfcHJpbnRfdHlwZSk6ICBNb3ZlIHByb3RvdHlwZXMgYW5kIGZ1bmN0aW9ucworCSAgdG8gbmV3IHR5cGVwcmludC5jLgorCSogcHJpbnRjbWQuYyAoX2luaXRpYWxpemVfcHJpbnRjbWQpOiAgTW92ZSBhZGRfY29tIGNhbGxzIGZvcgorCSAgcHR5cGVfY29tbWFuZCBhbmQgd2hhdGlzX2NvbW1hbmQgdG8gbmV3IHR5cGVwcmludC5jLgorCSogc2VyLWJzZC5jIChzZXJpYWxfb3Blbik6ICBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHNndHR5Yi4KKwkqIHNvdXJjZS5jIChmaW5kX3NvdXJjZV9saW5lcyk6ICBMb2NhbCB2YXJpYWJsZSBjIG9ubHkgdXNlZAorCSAgd2hlbiBMU0VFS19OT1RfTElORUFSIGlzIGRlZmluZWQuCisJKiBzdGFic3JlYWQuYyAocmVhZF9hcnJheV90eXBlKTogIFVzZSBuZXcgY3JlYXRlX3JhbmdlX3R5cGUKKwkgIGZ1bmN0aW9uLgorCSogc3RhYnNyZWFkLmMgKHJlYWRfcmFuZ2VfdHlwZSk6ICBBZGQgbmV3IGluZGV4X3R5cGUgdmFyaWFibGUgYW5kCisJICBjYWxsIG5ldyBjcmVhdGVfcmFuZ2VfdHlwZSBmdW5jdGlvbiByYXRoZXIgdGhhbiBoYW5kY3JhZnRpbmcKKwkgIHJhbmdlIHR5cGVzLgorCSogc3ltbWlzYy5jICh0eXBlX3ByaW50XzEpOiAgQ2hhbmdlIHVzYWdlcyB0byBMQV9QUklOVF9UWVBFLgorCSogc3ltdGFiLmMgKHR5cGVkZWZfcHJpbnQgdXNhZ2VzKTogIFVzZSBjX3R5cGVkZWZfcHJpbnQsIHJlbmFtZWQuCisJKiBzeW10YWIuYyAodHlwZV9wcmludF9iYXNlIHVzYWdlcyk6ICBVc2UgY190eXBlX3ByaW50X2Jhc2UuCisJKiBzeW10YWIuYyAodHlwZV9wcmludF92YXJzcGVjX3ByZWZpeCB1c2FnZXMpOiAgVXNlIAorCSAgY190eXBlX3ByaW50X3ZhcnNwZWNfcHJlZml4LgorCSogc3ltdGFiLmMgKHR5cGVfcHJpbnRfbWV0aG9kX2FyZ3MgdXNhZ2VzKTogIFVzZQorCSAgY3BfdHlwZV9wcmludF9tZXRob2RfYXJncy4KKwkqIHZhbHByaW50LmM6ICBDb21wbGV0ZWx5IHJpcHBlZCBhcGFydCBhbmQgdGhlIGZyYWdtZW50cyB1c2VkCisJICB0byBjcmVhdGUgYy12YWxwcmludC5jLCBjcC12YWxwcmludC5jLCBtMi12YWxwcmludC5jLCBhbmQKKwkgIHZhbHByaW50LmguICBSZW1haW5pbmcgc3R1ZmYgaXMgbGFuZ3VhZ2UgaW5kZXBlbmRlbnQuCisJKiB2YWx1ZS5oIChzdHJ1Y3QgZm5fZmllbGQpOiAgRm9yd2FyZCBkZWNsYXJlIGZvciBwcm90b3R5cGVzLgorCSogdmFsdWUuaCAodHlwZV9wcmludF8xKTogIFJlbW92ZSBwcm90b3R5cGUuCisJKiB2YWx1ZS5oIChlbnVtIHZhbF9wcmV0dHlwcmludCk6ICBNb3ZlZCB0byBkZWZzLmguCisJKiB2YWx1ZS5oICh0eXBlZGVmX3ByaW50KTogIFByb3RvdHlwZSByZW5hbWVkIHRvIGNfdHlwZWRlZl9wcmludC4KKwkqIHZhbHVlLmggKGJhc2VjbGFzc19vZmZzZXQpOiAgQWRkIHByb3RvdHlwZS4KKwkqIE1ha2VmaWxlLmluIChTRklMRVNfTUFJTkRJUik6ICBBZGQgY2gtdHlwZXByaW50LmMsIGNoLXZhbHByaW50LmMuCisJKiBNYWtlZmlsZS5pbiAoT0JTKTogIEFkZCBjaC10eXBlcHJpbnQubywgY2gtdmFscHJpbnQuby4KKwkqIGNoLXR5cGVwcmludC5jOiAgTmV3IGZpbGUgZm9yIGxhbmd1YWdlIGRlcGVuZGVudCB0eXBlIHByaW50aW5nLgorCSogY2gtdmFscHJpbnQuYzogIE5ldyBmaWxlIGZvciBsYW5ndWFnZSBkZXBlbmRlbnQgdmFsdWUgcHJpbnRpbmcuCisJKiBjaC1leHAueSAocGFyc2VfbnVtYmVyKTogIFJlbW92ZSBwcm90b3R5cGUgYW5kIHN0dWIgZnVuY3Rpb24uCisJKiBjaC1leHAueSAoZGVjb2RlX2ludGVnZXJfbGl0ZXJhbCk6ICBSZW1vdmVkIHVudXNlZCBkaWdpdHMgYW5kCisJICB0ZW1wIHZhcmlhYmxlcy4KKwkqIGNoLWV4cC55IChjb252ZXJ0X2Zsb2F0KTogIENvbXBsZXRlbHkgaWZkZWYgb3V0IGZvciBub3cuCisJKiBjaC1leHAueSAodG9rZW50YWIyLCB0b2tlbnRhYjMsIHRva2VudGFiNCwgdG9rZW50YWI1KSwKKwkgIGNoLWxhbmcuYyAoY2hpbGxfb3BfcHJpbnRfdGFiKToKKwkgIENoYW5nZSBmcm9tIEFOU0ktb2Jzb2xlc2NlbnQgImNvbnN0IHN0YXRpYyIgdG8gQU5TSS1jb25mb3JtYW50CisJICAic3RhdGljIGNvbnN0Ii4KKwkqIGNoLWV4cC55ICh5eWxleCk6ICBBZGQgdW5oYW5kbGVkIHN0b3JhZ2UgY2xhc3MgZW51bWVyYXRpb24KKwkgIGxpdGVyYWxzIHRvIHN3aXRjaCBzdGF0ZW1lbnQgZm9yIGNvbXBsZXRlbmVzcy4KKwkqIGNoLWxhbmcuYyAoY2hpbGxfY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGVzKTogIFJlbW92ZSB1bnVzZWQKKwkgIG5ieXRlcyB2YXJpYWJsZS4gIENoYW5nZSBkdW1teSB0eXBlIHRvIDIgYnl0ZXMgdG8gbWF0Y2ggaW50LgorCSAgSGFuZGxlIEZUX1ZPSUQgdHlwZXMgZ3JhdHVpdHVvdXNseSBhZGRlZCB0byBjaGlsbCBEV0FSRiBieQorCSAgY29tcGlsZXIuICBDaGFuZ2UgRlRfQ0hBUiBjYXNlIHRvIGdlbmVyYXRlIGFuIFRZUEVfQ09ERV9DSEFSCisJICB0eXBlIHJhdGhlciB0aGFuIGEgb25lIGJ5dGUgVFlQRV9DT0RFX0lOVCB0eXBlLgorCSogY2gtbGFuZy5jIChjaGlsbF9sYW5ndWFnZV9kZWZuKTogIEFkZCBjaGlsbF9wcmludF90eXBlIGFuZAorCSAgY2hpbGxfdmFsX3ByaW50LgorCSogY2gtbGFuZy5oIChjaGlsbF9wcmludF90eXBlLCBjaGlsbF92YWxfcHJpbnQpOiAgQWRkIHByb3RvdHlwZXMuCisKK1RodSBEZWMgMTcgMDA6NDQ6NTcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwlFbGltaW5hdGUgdXNlcyBvZiBOQU1FU19IQVZFX1VOREVSU0NPUkUsIHVzaW5nCisJYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIGluc3RlYWQuCisKKwkqIGNvZmZyZWFkLmMgKEVYVEVSTkFMX05BTUUpOiAgTmV3IG1hY3JvIGZvciByZW1vdmluZyBwb3NzaWJsZQorCWxlYWRpbmcgY2hhcmFjdGVyIGZyb20gbmFtZXMuCisJKHJlYWRfY29mZl9zeW10YWIpOiAgVXNlIEJGRCdzIEZJTEUgKiwgZG9uJ3Qgb3BlbiBhIHNlY29uZCBvbmUuCisJKHByb2Nlc3NfY29mZl9zeW1ib2wsIGNvZmZfcmVhZF9zdHJ1Y3RfdHlwZSwgY29mZl9yZWFkX2VudW1fdHlwZSk6CisJUmVwbGFjZSBOQU1FU19IQVZFX1VOREVSU0NPUkUgd2l0aCBFWFRFUk5BTF9OQU1FLgorCisJKiBrZGItc3RhcnQuYyAobWFpbik6ICBSZW1vdmUgTkFNRVNfSEFWRV9VTkRFUlNDT1JFLgorCSogbWluc3ltcy5jIChpbnN0YWxsX21pbmltYWxfc3ltYm9scyk6ICBSZXBsYWNlIE5BTUVTX0hBVkVfVU5ERVJTQ09SRS4KKwlSZW1vdmUgU09NRV9OQU1FU19IQVZFX0RPVCBzdXBwb3J0IChhcHBhcmVudGx5IHVudXNlZCkuCisJKiBwYXJ0aWFsLXN0YWIuaDogIFJlcGxhY2UgTkFNRVNfSEFWRV9VTkRFUlNDT1JFLgorCSogc29saWIuYzogIFJlcGxhY2UgTkFNRVNfSEFWRV9VTkRFUlNDT1JFLgorCSogc3RhYnNyZWFkLmg6ICBSZW1vdmUgTkFNRVNfSEFWRV9VTkRFUlNDT1JFIGFuZCBIQVNIX09GRlNFVC4KKwkqIHN5bWZpbGUuYyAoc3ltc19mcm9tX29iamZpbGUpOiAgSW5zZXJ0IGRlYnVnZ2luZyBjaGVjayB0byB0ZXN0CisJTkFNRVNfSEFWRV9VTkRFUlNDT1JFIHNldHRpbmcgYWdhaW5zdCB0aGUgQkZEIHN1cHBvcnQuCisKKwkqIGRvYy9nZGJpbnQudGV4aW5mbyAoSG9zdCBDb25kaXRpb25hbHMpOiAgUmVtb3ZlCisJTkFNRVNfSEFWRV9VTkRFUlNDT1JFLCBTT01FX05BTUVTX0hBVkVfRE9ULCBkb2N1bWVudAorCU1FTV9GTlNfREVDTEFSRUQuCisJKFRhcmdldCBDb25kaXRpb25hbHMpOiAgUmVtb3ZlIGFsbCBvZiB0aGUgYWJvdmUuCisKKwkqIHhtLXJzNjAwMC5oIChNRU1fRk5TX0RFQ0xBUkVEKTogIFVwZGF0ZSBjb21tZW50cy4KKworCSogY29mZnJlYWQuYyAocmVhZF9jb2ZmX3N5bXRhYiwgQ19CTE9DSyk6ICBVc2UgY29tcGxhaW4oKSByYXRoZXIKKwl0aGFuIGVycm9yKCkgZm9yIC5iYi8uZWIuICBCdWcgZm91bmQgYnkgRWRkaWUgRnVuZywgPGVmdW5nQGNzLnVxLm96LmF1Pi4KKworVHVlIERlYyAxNSAxMDowNTo1NiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvZmZyZWFkLmMgKGRlY29kZV90eXBlKTogY2F0Y2ggbmVnYXRpdmUgdGFnbmR4IGZpZWxkcyBnZW5lcmF0ZWQKKwlieSBTQ08gMy4ydjQgY2MuCisJKiBleGVjLmM6IGNvbW1lbnQgb3V0IHN0cmluZyBmb2xsb3dpbmcgI2VuZGlmLgorCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotc2NvMy4ydjQqKTogdXNlIGhvc3QgaTM4NnNjbzQuCQorCSogeG0taTM4NnNjby5oOiBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gYW5kIDxzeXMvZGlyLmg+LCByZXF1aXJlZCBieQorCTxzeXMvdXNlci5oPi4KKwkqIGNvbmZpZy9pMzg2c2NvNC5taDogbmV3IGZpbGU7IGxpa2UgaTM4NnNjby5taCwgYnV0IGRvbid0IHJlcXVpcmUKKwlnY2MsIGFuZCBkZWZpbmUgY29uc3QgdG8gZW1wdHkgdG8gYXZvaWQgU0NPIDMuMnY0IGNjIGJ1Zy4KKworVHVlIERlYyAxNSAwNDoxNDoyNCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogY29tcGxhaW50cy5jOiAgTmV3IGZpbGUsIGNvZGUgbW92ZWQgZnJvbSB1dGlscy5jLgorCSogY29tcGxhaW50cy5jIChjb21wbGFpbik6ICBNYWRlIGludG8gYSB2YXJhcmdzIGZ1bmN0aW9uLgorCSogY29tcGxhaW50cy5oOiAgTmV3IGZpbGUsIGNvZGUgbW92ZWQgZnJvbSBzeW1maWxlLmguCisJKiBNYWtlZmlsZS5pbiAoU0ZJTEVTX01BSU5ESVIpOiAgQWRkIGNvbXBsYWludHMuYy4KKwkqIE1ha2VmaWxlLmluIChIRklMRVMpOiAgQWRkIGNvbXBsYWludHMuaC4KKwkqIE1ha2VmaWxlLmluIChPQlMpOiAgQWRkIGNvbXBsYWludHMuby4KKwkqIHN5bWZpbGUuYyAoY29tcGxhaW50X3Jvb3QsIHN0b3Bfd2hpbmluZywgY29tcGxhaW50X3NlcmllcywKKwljb21wbGFpbiwgY2xlYXJfY29tcGxhaW50cywgYWRkX3Nob3dfZnJvbV9zZXQgZm9yIHN0b3Bfd2hpbmluZyk6CisJTW92ZWQgdG8gY29tcGxhaW50cy5jLgorCSogc3ltZmlsZS5oIChzdHJ1Y3QgY29tcGxhaW50LCBjb21wbGFpbnRfcm9vdCBkZWNsLCBjb21wbGFpbgorCXByb3RvdHlwZSwgY2xlYXJfY29tcGxhaW50cyBwcm90b3R5cGUpOiAgTW92ZWQgdG8gY29tcGxhaW50cy5oLgorCSogYnVpbGRzeW0uYywgY29mZnJlYWQuYywgZGJ4cmVhZC5jLCBkd2FyZnJlYWQuYywgZWxmcmVhZC5jLAorCWdkYnR5cGVzLmMsIG1pcHNyZWFkLmMsIHN0YnNyZWFkLmMsIHN5bWZpbGUuYzogIEluY2x1ZGUKKwljb21wbGFpbnRzLmguICBSZW1vdmUgY2FzdHMgZnJvbSBhcmd1bWVudHMgdG8gY29tcGxhaW4oKSwKKwl3aGljaCBpcyBub3cgYSB2YXJhcmdzIGZ1bmN0aW9uLCBhbmQgcmVtb3ZlIHVubmVjZXNzYXJ5CisJcGxhY2Vob2xkZXIgemVybyBhcmdzLgorCSogZGVmcy5oIChiZWdpbl9saW5lKTogIEFkZCBwcm90b3R5cGUuCisJKiBkZWZzLmggKHZwcmludGZfZmlsdGVyZWQpOiAgQWRkIHByb3RvdHlwZS4KKwkqIGR3YXJmcmVhZC5jICh2YXJhcmdzLmgpOiAgUmVtb3ZlLCBubyBsb25nZXIgbmVlZGVkLgorCSogZHdhcmZyZWFkLmMgKGR3YXJmd2Fybik6ICBSZW1vdmUgcHJvdG90eXBlIGFuZCBmdW5jdGlvbi4KKwkqIGR3YXJmcmVhZC5jIChjb21wbGFpbnRzKTogIERlZmluZSBhIGJ1bmNoIG9mIGNvbXBsYWludHMuCisJKiBkd2FyZnJlYWQuYyAoU1FVQVdLKTogIFJlbW92ZSBtYWNybyBkZWZzLCBjb252ZXJ0IGFsbAorCXVzYWdlcyB0byBzdGFuZGFyZCBjb21wbGFpbigpIGNhbGxzLgorCSogdXRpbHMuYyAoYmVnaW5fbGluZSk6ICBOZXcgZnVuY3Rpb24gdGhhdCBlbnN1cmVzIHRoYXQKKwl3aGF0ZXZlciBnZXRzIGZpbHRlci1wcmludGVkIG5leHQgc3RhcnRzIG9uIGl0cyBvd24gbGluZS4KKwkqIHV0aWxzLmMgKHZwcmludGZfZmlsdGVyZWQpOiAgTmV3IGZ1bmMsIGxpa2UgdmZwcmludGZfZmlsdGVyZWQsCisJYnV0IHRvIHN0ZG91dCAoY2FsbHMgdmZwcmludGZfZmlsdGVyZWQgaW50ZXJuYWxseSkuCisKK1R1ZSBEZWMgMTUgMDI6MDE6MDAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIHJlbW90ZS5jOiAgQXZvaWQgcHJpbnRmX2ZpbHRlcmVkIGxpbmUgbGltaXQuICBTdWdnZXN0ZWQgYnkKKwlSb2JlcnQgUi4gSGVucnksIDxycmhAdGVyYS5jb20+LgorCSogaW5mY21kLmMgKGVudmlyb25tZW50X2luZm8pOiAgRGl0dG8sIGZvciBEb24gQWxsZW4gPGFsbGVuQHRoaW5rLmNvbT4uCisKKwkqIG1haW4uYyAobWFpbik6ICBBY2NlcHQgLS1zaWxlbnQgYXMgd2VsbCBhcyAtLXF1aWV0LiAgQ2hhbmdlICtoZWxwCisJdG8gLS1oZWxwLiAgU3VnZ2VzdGVkIGJ5IEthcmwgQmVycnksIDxrYXJsQGNzLnVtYi5lZHU+LgorCisJKiBkb2MvZ2RiaW50LnRleGluZm86ICBTV0FQX0hPU1RfQU5EX1RBUkdFVCA9PiBTV0FQX1RBUkdFVF9BTkRfSE9TVC4KKwlOb3RpY2VkIGJ5IEFuZHkgSmFja3NvbiwgPGFyakBjYW0tb3JsLmNvLnVrPi4KKworTW9uIERlYyAxNCAyMzoyODoxNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogdG0tbmluZHk5NjAuaCwgcmVtb3RlLW5pbmR5LmM6ICBMaW50LgorCitNb24gRGVjIDE0IDE4OjQ4OjUyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBnZGJ0eXBlcy5jIChjcmVhdGVfYXJyYXlfdHlwZSk6ICBDb21wbGV0ZSByZXdyaXRlLiAgTm93IHJlcXVpcmVzCisJYSBvcHRpb25hbCB0eXBlIHRvIGRlY29yYXRlIGFzIGFuIGFycmF5IHR5cGUsIHRoZSB0eXBlIG9mIHRoZQorCWluZGV4LCBhbmQgdGhlIGJvdW5kcyBvZiB0aGUgYXJyYXkuICBSZWNvcmRzIHRoaXMgYWRkaXRpb25hbCBpbmZvCisJaW4gdGhlIGFycmF5IHR5cGUgZm9yIHVzZSB3aXRoIGxhbmd1YWdlcyB3aXRoIG5vbnplcm8gYXJyYXkKKwlib3VuZHMuCisJKiBnZGJ0eXBlcy5oIChlbnVtIHR5cGVfY29kZSk6ICBVcGRhdGUgY29tbWVudCBmb3IgVFlQRV9DT0RFX0FSUkFZCisJdG8gbm90ZSB0aGF0IGFycmF5cyBtYXkgaGF2ZSBib3VuZHMuCisJKiBnZGJ0eXBlcy5oIChjcmVhdGVfYXJyYXlfdHlwZSk6ICBVcGRhdGUgcHJvdG90eXBlLgorCSogYy1leHAueSAocHR5cGUgcHJvZHVjdGlvbik6ICBBZGp1c3QgZm9yIG5ldyBjcmVhdGVfYXJyYXlfdHlwZQorCWNhbGxpbmcgY29udmVudGlvbnMuCisJKiBjb2ZmcmVhZC5jIChkZWNvZGVfdHlwZSk6ICBDYWxsIGNyZWF0ZV9hcnJheV90eXBlIHJhdGhlciB0aGFuCisJaGFuZGNyYWZ0aW5nIGFycmF5IHR5cGVzLgorCSogY29udmV4LXRkZXAuYyAodmFsdWVfdHlwZSk6ICBSZW1vdmUsIG5vdyB1c2UgY3JlYXRlX2FycmF5X3R5cGUuCisJKiBjb252ZXgtdGRlcC5jICh2YWx1ZV9vZl90cmFwcGVkX2ludGVybmFsdmFyKTogIENvbnZlcnQgY2FsbHMgdG8KKwl2ZWN0b3JfdHlwZSBpbnRvIGNhbGxzIHRvIGNyZWF0ZV9hcnJheV90eXBlLgorCSogZHdhcmZyZWFkLmMgKGRlY29kZV9zdWJzY3JfZGF0YSk6ICBOYW1lIGNoYW5nZWQgdG8KKwlkZWNvZGVfc3Vic2NyaXB0X2RhdGFfaXRlbSB0aHJvdWdob3V0LgorCSogZHdhcmZyZWFkLmMgKGRlY29kZV9zdWJzY3JpcHRfZGF0YV9pdGVtKTogIFJld3JpdGUgdG8gdXNlCisJY3JlYXRlX2FycmF5X3R5cGUuICBOb3cgcmVjb3JkcyBpbmRleCB0eXBlIGFuZCByYW5nZSBhcyB3ZWxsLgorCSogZHdhcmZyZWFkLmMgKGR3YXJmX3JlYWRfYXJyYXlfdHlwZSk6ICBSZXdyaXRlIGFzIHBhcnQgb2YKKwljaGFuZ2UgdG8gdXNlIGNyZWF0ZV9hcnJheV90eXBlLgorCSogZHdhcmZyZWFkLmMgKHJlYWRfc3Vicm91dGluZV90eXBlKTogIFRlc3QgZXhpc3RpbmcgdXNlciBkZWZpbmVkCisJdHlwZXMgYmVmb3JlIGRlY29yYXRpbmcgdGhlbSwgdG8gZW5zdXJlIHRoZXkgYXJlIGJsYW5rLCBhbmQKKwljb21wbGFpbiBhYm91dCBpdCBpZiB0aGV5IGFyZSBub3QuCisJKiBkd2FyZnJlYWQuYyAoZGVjb2RlX2Z1bmRfdHlwZSk6ICBGb3IgdW5yZWNvZ25pemVkIHR5cGVzLCBhbHdheXMKKwlyZXR1cm4gc29tZSB2YWxpZCB0eXBlICh0eXBlIGludGVnZXIpLiAgSWYgdGhlIHVucmVjb2duaXplZCB0eXBlCisJY2Fubm90IGJlIGFuIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZSwgY29tcGxhaW4gYXMgd2VsbC4KKwkqIG04OGstdGRlcC5jIChwdXNoZWRfc2l6ZSk6ICBVcGRhdGUgY29tbWVudCBmb3IgVFlQRV9DT0RFX0FSUkFZLgorCSogbTg4ay10ZGVwLmMgKHN0b3JlX3BhcmFtKTogIFVwZGF0ZSBjb21tZW50IGZvciBUWVBFX0NPREVfQVJSQVkuCisJKiBtaXBzcmVhZC5jICh1cGdyYWRlX3R5cGUpOiAgQWRkIEZJWE1FIGNvbW1lbnQgdGhhdCBjb2RlIHRvCisJaGFuZGNyYWZ0IGFycmF5cyBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBjYWxsIHRvIGNyZWF0ZV9hcnJheV90eXBlLgorCSogc3RhYnNyZWFkLmMgKHJlYWRfYXJyYXlfdHlwZSk6ICBSZXBsYWNlIGNvZGUgdG8gaGFuZGNyYWZ0CisJYXJyYXkgdHlwZXMgd2l0aCBjYWxsIHRvIGNyZWF0ZV9hcnJheV90eXBlLgorCSogdmFscHJpbnQuYyAodHlwZV9wcmludF92YXJzcGVjX3ByZWZpeCk6ICBNaW5vciBmb3JtYXR0aW5nCisJY2hhbmdlLCBqb2luIGxpbmVzIHRoYXQgZG9uJ3QgbmVlZCB0byBiZSBzcGxpdC4KKworTW9uIERlYyAxNCAxNzoxODo0MiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBjb252ZXgteGRlcC5jLCBocHBhYi1uYXQuYywgaW5mcHRyYWNlLmM6ICBSZW1vdmUKKwlkZWNsIGZvciBhdHRhY2hfZmxhZywgaXQgbm93IGxpdmVzIGluIGluZmVyaW9yLmguCisJKiBocHBhLXBpbnNuLmM6ICBSZWZvcm1hdCBvcGNvZGUgdGFibGVzLiAgQWRkIGZ1bmN0aW9uIHByb3RvdHlwZXMuCisJTWFrZSBtb3N0IGZ1bmN0aW9ucyBzdGF0aWMuCisJKiBocHBhaC1uYXQuYzogIEdlbmVyYWwgY2xlYW51cHMsIHJlbW92ZSBCU0Qgc3BlY2lmaWMgY29kZSAoc2luY2UKKwl0aGF0IGFsbCBsaXZlcyBpbiBocHBhYi1uYXQuYykuCisJKiBocHBhaC10ZGVwLmMgKGZyYW1lX2NoYWluX3ZhbGlkKSwgdG0taHBwYS5oIChGUkFNRV9DSEFJTik6CisJQ2hhbmdlIHNlbnNlIG9mIHRlc3QgYWdhaW5zdCBpbnNpZGVfZW50cnlfZmlsZSgpLiAgVGhpcyBmaXggaXMKKwlmcm9tIFUuIG9mIFV0YWguCisJKiB0bS1ocHBhLmggKFBVU0hfRFVNTVlfRlJBTUUsIFBPUF9GUkFNRSk6ICBVc2UgY2hhciAqIGZvciAybmQgYXJnCisJdG8gcmVhZC93cml0ZV9yZWdpc3Rlcl9ieXRlcygpLgorCSogZ2RidHlwZXMuaDogIFJlbW92ZSBjb25zdCBmcm9tIGRlY2wgZm9yIGNwbHVzX3N0cnVjdF9kZWZhdWx0IHRvCisJd29yayBhcm91bmQgUEEtR0FTIGFzc2VtYmxlciBidWcuICBBbHNvLCBhZGQgdHJhaWxpbmcgKi8gdG8gc29tZQorCWNvbW1lbnRzLgorCSogZ2RidHlwZXMuYzogIFJlbW92ZSBjb25zdCBmcm9tIGRlY2wgZm9yIGNwbHVzX3N0cnVjdF9kZWZhdWx0LgorCVNhbWUgcmVhc29uIGFzIGFib3ZlLgorCitXZWQgRGVjICA5IDE5OjUzOjI1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBtaXBzcmVhZC5jIChwYXJzZV9zeW1ib2wpOiBXaGVuIGNoZWNraW5nIHdoZXRoZXIgYSBzdHJ1Y3R1cmVkCisJdHlwZSBpcyBhbiBlbnVtLCBjaGVjayBxdWFsaWZpZXJzIG9mIGl0cyBmaXJzdCBtZW1iZXIsIGFzIHdlbGwgYXMKKwl0aGUgYmFzZSB0eXBlIG9mIHRoZSBtZW1iZXIuICBCdWcgZm91bmQgYW5kIGZpeGVkIGJ5IEpvaG4gTS4KKwlGYXJyZWxsLCA8ZmFycmVsbEBmam9yZC5yZW8uZGVjLmNvbT4uCisKKwkqIHZ4LXNoYXJlL3tyZWcuaCx4ZHJfcmVncy5oLHhkcl9yZWdzLmN9OiAgUmVtb3ZlLCB1bnVzZWQuCisJKiByZW1vdGUtdnguYzogIERvbid0IGluY2x1ZGUgdngtc2hhcmUvcmVnLmguCisJKiB2eC1zaGFyZS9wdHJhY2UuaDogIFJlcHJvZHVjZSBmcm9tIHNjcmF0Y2guCisJKiBjb25maWcve3Z4d29ya3M2OCx2eHdvcmtzOTYwfTogIERvbid0IGluY2x1ZGUgeGRyX3JlZ3Muby4KKwkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlIHJlZmVyZW5jZXMgdG8gcmVtb3ZlZCBmaWxlcywgYW5kIHRvIHJlbW92ZWQKKwkyOWstc2hhcmUgZGlyZWN0b3JpZXMuCisKK1R1ZSBEZWMgIDggMTM6MzA6NTggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGMtbGFuZy5jIChfaW5pdGlhbGl6ZV9jX2xhbmd1YWdlKTogIE5hbWUgY2hhbmdlZCBmcm9tCisJX2luaXRpYWxpemVfY19leHAuCisJKiBtMi1sYW5nLmMgKF9pbml0aWFsaXplX20yX2xhbmd1YWdlKTogIE5hbWUgY2hhbmdlZCBmcm9tCisJX2luaXRpYWxpemVfbTJfZXhwLgorCSogbTItbGFuZy5jIChfaW5pdGlhbGl6ZV9tMl9sYW5ndWFnZSk6ICBDaGFuZ2UgbWFsbG9jIHRvIHhtYWxsb2Mgc2luY2UKKwlpdCBpcyBubyBsb25nZXIgaW5zaWRlIG0yLWV4cC55LCB3aGVyZSBpdCB3YXMgcmVtYXBwZWQgYnkgTWFrZWZpbGUuCisJKiBjLWV4cC55LCBtMi1leHAueTogIE1pZ3JhdGUgY29kZSB0aGF0IGhhcyBub3RoaW5nIHRvIGRvIHdpdGgKKwlleHByZXNzaW9uIHBhcnNpbmcgaW50byBjLWxhbmcuYyBhbmQgbTItbGFuZy5jIHJlc3BlY3RpdmVseS4KKwkqIGMtbGFuZy5jLCBtMi1sYW5nLmM6ICBOZXcgZmlsZXMsIGNvZGUgbWlncmF0ZWQgZnJvbSBjLWV4cC55IGFuZAorCW0yLWV4cC55IHJlc3BlY3RpdmVseS4KKwkqIGMtbGFuZy5oLCBtMi1sYW5nLmg6ICBOZXcgZmlsZXMsIGludGVybmFsIGludGVyZmFjZXMgYmV0d2VlbiBjLSoKKwlhbmQgbTItKiBmaWxlcyByZXNwZWN0aXZlbHkuCisJKiBNYWtlZmlsZS5pbiAoU0ZJTEVTX01BSU5ESVIpOiAgQWRkIGMtbGFuZy5jLCBtMi1sYW5nLmMuCisJKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogIEFkZCBjLWxhbmcuaCwgbTItbGFuZy5oLgorCSogTWFrZWZpbGUuaW4gKE9CUyk6ICBBZGQgYy1sYW5nLm8sIG0yLWxhbmcuby4KKwkqIGV4cHJlc3Npb24uaCAoc3RydWN0IGJsb2NrKTogIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIHByb3RvdHlwZXMuCisJKiBsYW5ndWFnZS5oIChzdHJ1Y3Qgb2JqZmlsZSk6ICBGb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBwcm90b3R5cGVzLgorCSogTWFrZWZpbGUuaW4gKFNGSUxFU19NQUlORElSKTogIEFkZCBjaC1sYW5nLmMuCisJKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogIEFkZCBjaC1sYW5nLmguCisJKiBNYWtlZmlsZS5pbiAoT0JTKTogIEFkZCBjaC1sYW5nLm8uCisJKiBjaC1leHAueTogIE1pZ3JhdGUgY29kZSB0aGF0IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggZXhwcmVzc2lvbgorCXBhcnNpbmcgaW50byBjaC1sYW5nLmMuCisJKiBjaC1sYW5nLmM6ICBOZXcgZmlsZSwgY29kZSBtaWdyYXRlZCBmcm9tIGMtZXhwLnkuCisJKiBjaC1sYW5nLmg6ICBOZXcgZmlsZSwgaW50ZXJuYWwgaW50ZXJmYWNlIGJldHdlZW4gY2gtKiBmaWxlcy4KKwkqIGNoLWxhbmcuYyAoX2luaXRpYWxpemVfY2hpbGxfbGFuZ3VhZ2UpOiAgTmFtZSBjaGFuZ2VkIGZyb20KKwlfaW5pdGlhbGl6ZV9jaGlsbF9leHAuCisKKwlDaGFuZ2VzIGZvciBBbWlnYSBVbml4IGZyb20gcmhlYWxleUB1Yi5kLnVtbi5lZHUuCisJKiBjb25maWcvYW1peC5taCAoTkFUX0ZJTEUpOiAgQWRkLCBzZXQgdG8gbm0tc3lzdjQuaC4KKwkqIGNvbmZpZy9hbWl4Lm1oIChOQVRERVBGSUxFUyk6ICBBZGQuCisJKiBjb25maWcvYW1peC5taCAoWERFUEZJTEVTKTogIE1vdmUgcHJvY2ZzLm8gYW5kIGZvcmstY2hpbGQubworCXRvIE5BVERFUEZJTEVTLgorCisJKiBkd2FyZnJlYWQuYyAoZGVjb2RlX3N1YnNjcl9kYXRhKTogIFJlbW92ZSBzcHVyaW91cyB0ZXN0IHRoYXQKKwlhY2NlcHRlZCBvbmx5IGludGVnZXIgc3Vic2NyaXB0IHR5cGVzLiAgV2UgZG9uJ3QgZG8gYW55dGhpbmcKKwl3aXRoIHRoZSB0eXBlIGF0IHRoZSBtb21lbnQgYW55d2F5LgorCitGcmkgRGVjICA0IDA2OjU2OjU2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjaC1leHAueSAobWF0Y2hfY2hhcmFjdGVyX2xpdGVyYWwpOiAgRml4IGNhc2Ugd2hlcmUgbm8KKwltYXRjaCBhdCBhbGwgaXMgZm91bmQuCisJKiBjaC1leHAueSAoY2hpbGxfY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGUpOiAgQ2hpbGwgdXNlcyBmaXhlZAorCXdpZHRoIHR5cGVzLiAgRm9yIGV4YW1wbGUsICJJTlQiIGlzIGFsd2F5cyAyIGJ5dGVzIHJlZ2FyZGxlc3MKKwlvZiB0aGUgdmFsdWVzIG9mIGFueSBUQVJHRVRfKl9CSVQgbWFjcm9zLiAgU28gdXNlIGV4cGxpY2l0CisJbnVtZXJpYyBzaXplcyBmb3IgdGhlIHR5cGVzLgorCitUaHUgRGVjICAzIDEyOjAwOjA2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjLWV4cC55IChjX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlKTogIE5ldyBmdW5jdGlvbiB0byBjcmVhdGUKKwlsYW5ndWFnZSBzcGVjaWZpYyBmdW5kYW1lbnRhbCB0eXBlcyBmb3IgQy4KKwkqIG0yLWV4cC55IChtMl9jcmVhdGVfZnVuZGFtZW50YWxfdHlwZSk6ICBOZXcgZnVuY3Rpb24gdG8gY3JlYXRlCisJbGFuZ3VhZ2Ugc3BlY2lmaWMgZnVuZGFtZW50YWwgdHlwZXMgZm9yIE1vZHVsYSAyLgorCSogYy1leHAueSAoY19sYW5ndWFnZV9kZWZuLCBjcGx1c19sYW5ndWFnZV9kZWZuKTogIEFkZAorCWNfY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGUgdG8gbGFuZ3VhZ2Ugc3RydWN0IGluaXRpYWxpemVycy4KKwkqIG0yLWV4cC55IChtMl9sYW5ndWFnZV9kZWZuKTogIEFkZCBtMl9jcmVhdGVfZnVuZGFtZW50YWxfdHlwZQorCXRvIGxhbmd1YWdlIHN0cnVjdCBpbml0aWFsaXplcnMuCisJKiBkd2FyZnJlYWQuYyAoZXhwcmVzc2lvbi5oLCBsYW5ndWFnZS5oKTogIEluY2x1ZGUuCisJKiBkd2FyZnJlYWQuYyAoZnR5cGVzKTogIE5ldyBhcnJheSB0byBob2xkIGZ1bmRhbWVudGFsIHR5cGVzCisJZm9yIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4KKwkqIGR3YXJmcmVhZC5jIChjdV9sYW5ndWFnZV9kZWZuKTogIE5ldyBwb2ludGVyIHRvIGxhbmd1YWdlCisJc3RydWN0IGZvciBsYW5ndWFnZSBvZiBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuCisJKiBkd2FyZnJlYWQuYyAoZHdhcmZfZnVuZGFtZW50YWxfdHlwZSk6ICBOZXcgZnVuY3Rpb24gdG8KKwljcmVhdGUvbG9va3VwIGZ1bmRhbWVudGFsIHR5cGVzLgorCSogZHdhcmZyZWFkLmMgKHNldF9jdV9sYW5ndWFnZSk6ICBJbml0aWFsaXplIGN1X2xhbmd1YWdlX2RlZm4uCisJKiBkd2FyZnJlYWQuYyAodGhyb3VnaG91dCk6ICBSZXBsYWNlIGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlCisJd2l0aCBkd2FyZl9mdW5kYW1lbnRhbF90eXBlLgorCSogZHdhcmZyZWFkLmMgKHJlYWRfZmlsZV9zY29wZSk6ICBaZXJvIG91dCBmdHlwZXMgZm9yIGVhY2ggbmV3CisJY29tcGlsYXRpb24gdW5pdCAobWF5IGJlIGRpZmZlcmVudCBsYW5ndWFnZSBvciBkaWZmZXJlbnQgb2JqZmlsZSkuCisJKiBnZGJ0eXBlcy5jIChsb29rdXBfZnVuZGFtZW50YWxfdHlwZSk6ICBNb3ZlIGFjdHVhbCB0eXBlCisJY3JlYXRpb25zIGludG8gbGFuZ3VhZ2Ugc3BlY2lmaWMgZnVuZGFtZW50YWwgdHlwZSBjcmVhdGlvbgorCWZ1bmN0aW9ucyBhbmQgY2FsbCB2aWEgY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGUuICBBZGQgY29tbWVudAorCWFib3V0IHRoaXMgZnVuY3Rpb24gYmVpbmcgb2Jzb2xlc2NlbnQuCisJKiBnZGJ0eXBlcy5oIChGVF9CWVRFLCBGVF9VTlNJR05FRF9CWVRFKTogIE5ldyB0eXBlcywgdHJ1ZSBieXRlCisJc2l6ZWQgc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2Vycy4KKwkqIGdkYnR5cGVzLmggKEZUX05VTV9NRU1CRVJTKTogIEluY3JlbWVudCwgbmV3IHR5cGVzIGFkZGVkLgorCSogbGFuZ3VhZ2UuYyAobGFuZ3VhZ2VfZGVmKTogIE5ldyBmdW5jdGlvbiB0byBsb29rdXAgYSBsYW5ndWFnZQorCXN0cnVjdCBnaXZlbiBpdCdzIGVudW1lcmF0aW9uLgorCSogbGFuZ3VhZ2UuaCAoc3RydWN0IGxhbmd1YWdlX2RlZm4pOiAgQWRkIGxhX2Z1bmRfdHlwZSwgYSBwb2ludGVyCisJdG8gYSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgZnVuZGFtZW50YWwgdHlwZXMgZm9yIHRoaXMgbGFuZ3VhZ2UuCisJKiBsYW5ndWFnZS5oIChjcmVhdGVfZnVuZGFtZW50YWxfdHlwZSk6ICBOZXcgbWFjcm8gdG8gY3JlYXRlCisJZnVuZGFtZW50YWwgdHlwZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuCisJKiBsYW5ndWFnZS5oIChsYW5ndWFnZV9kZWYpOiAgQWRkIHByb3RvdHlwZS4KKwkqIGxhbmd1YWdlLmMgKHVua19sYW5nX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlKTogIE5ldyBmdW5jdGlvbgorCWZvciBpbml0aWFsaXppbmcgbGFuZ3VhZ2Ugc3RydWN0cywgY2FsbHMgZXJyb3IgaWYgY2FsbGVkLgorCSogbGFuZ3VhZ2UuYyAodW5rX2xhbmd1YWdlX2RlZm4sIGF1dG9fbGFuZ3VhZ2VfZGVmbiwgCisJbG9jYWxfbGFuZ3VhZ2VfZGVmbik6ICBVc2UgdW5rX2xhbmdfY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGUuCQorCWNoLWV4cC55IChjaGlsbF9jcmVhdGVfZnVuZGFtZW50YWxfdHlwZSk6ICBOZXcgZnVuY3Rpb24uCisJY2gtZXhwLnkgKGNoaWxsX2xhbmd1YWdlX2RlZm4pOiAgQWRkIGNoaWxsX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlLgorCWNoLWV4cC55IChfaW5pdGlhbGl6ZV9jaGlsbF9leHApOiAgQk9PTCB0eXBlcyBhcmUgb25seSBvbmUgYnl0ZS4KKworVHVlIERlYyAgMSAxNzowNzozMSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZHdhcmZyZWFkLmMgKENISUxMX1BST0RVQ0VSKTogIEFkZCBwcm9kdWNlciBzdHJpbmcgZm9yCisJR05VIGNoaWxsLgorCSogZHdhcmZyZWFkLmMgKGhhbmRsZV9wcm9kdWNlcik6ICBUZXN0IENISUxMX1BST0RVQ0VSIGFzIHdlbGwKKwlhcyBHQ0NfUFJPRFVDRVIgYW5kIEdQTFVTX1BST0RVQ0VSLgorCitNb24gTm92IDMwIDE4OjQ2OjU4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIHJlbW90ZS11ZGkuYyAodWRpX3dhaXQpOiAgRG9uJ3Qgc3RvcCBpZiBUSVAgc2F5cyB0aGF0IHJlbW90ZSBpcworCXN0aWxsIHJ1bm5pbmcuCisKK01vbiBOb3YgMzAgMTI6MDA6MjUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIHRtLXN1bjRzb2wyLmg6ICBBZGQgQ1BMVVNfTUFSS0VSLiAgU29sYXJpcyAyLjAgcmVxdWlyZXMgJy4nCisJcmF0aGVyIHRoYW4gJyQnLiAgVGhpcyBwYXJ0aWN1bGFyIHBpZWNlIG9mIGJyYWluZGFtYWdlIGlzCisJc3ByZWFkaW5nIGxpa2Ugb296ZS4gSXQncyBub3cgaW5mZWN0ZWQgbGliaWJlcnR5LCBkZWphLWdudSwKKwlnZGIsIGFuZCBnY2MuCisJKiB2YWx1ZXMuYyAoYmFzZWNsYXNzX2FkZHIpOiAgVXNlIENQTFVTX01BUktFUiByYXRoZXIgdGhhbgorCWhhcmR3aXJlZCAnJCcgY2hhcmFjdGVyLgorCitTdW4gTm92IDI5IDE1OjIyOjQyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKENoYW5nZXMgdG8gYnJlYWsgaW5jcmVkaWJseSB1Z2x5LCB1bm1haW50YWluYWJsZSA3NTAgbGluZQorCSByZWFkX3N0cnVjdF90eXBlIGZ1bmN0aW9uIHVwIGludG8gbWFuYWdhYmxlIHBpZWNlcy4pCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICBCdW1wIHRvIDQuNy4zLgorCSogc3RhYnNyZWFkLmMgKHN0cnVjdCBmaWVsZF9pbmZvKTogIExvY2FsIHN0cnVjdCBkZWZpbml0aW9uLgorCSogc3RhYnNyZWFkLmMgKHJlYWRfbWVtYmVyX2Z1bmN0aW9ucywgcmVhZF9zdHJ1Y3RfZmllbGRzLAorCXJlYWRfYmFzZWNsYXNzZXMsIHJlYWRfdGlsZGVfZmllbGRzLCBhdHRhY2hfZm5fZmllbGRzX3RvX3R5cGUsCisJYXR0YWNoX2ZpZWxkc190b190eXBlLCByZWFkX2NwcF9hYmJyZXYpOiAgUHJvdG90eXBlcyBhbmQgbmV3CisJZnVuY3Rpb25zIGZyb20gZnJhZ21lbnRlZCByZWFkX3N0cnVjdF90eXBlLgorCSogc3RhYnNyZWFkLmMgKHN0YWJzX2dlbmVyYWxfY29tcGxhaW50KTogIENhdGNoYWxsIGNvbXBsYWludC4KKwkqIHN0YWJzcmVhZC5jIChTVEFCU19DT05USU5VRSk6ICBNYWNybydpemUgY3JldGlub3VzIHN0YWJzCisJc3ltYm9sIG5hbWUgY29udGludWF0aW9uIGNvZGUuICBVc2UgbWFjcm8gdGhyb3VnaG91dC4KKwkqIHN0YWJzcmVhZC5jICh2YXJpb3VzIHBsYWNlcyk6ICBSZXBsYWNlIGFkZC1vbmUtdG8tcG9pbnRlcgorCXdpdGggcG9pbnRlciBpbmNyZW1lbnQuCisJKiBzdGFic3JlYWQuYyAocmVhZF90eXBlKTogIFJldGFpbiBmdW5jdGlvbiBsb2NhbCBjb3B5IG9mIHR5cGUKKwlkZXNjcmlwdG9yLiAgUmVhcnJhbmdlIGNvZGUgY2FsbGluZyByZWFkX3N0cnVjdF90eXBlKCkgdG8gbWF0Y2gKKwluZXcgY29udmVudGlvbnMuCisJKiBzdGFic3JlYWQuYyAoZGVmaW5lX3N5bWJvbCk6ICBGb3IgdGhlIHNha2Ugb2YgZGJ4LCBnY2MgZW1pdHMKKwlhIHNpbmdsZSBibGFuayBhcyB0aGUgbmFtZSBvZiBuYW1lbGVzcyBlbnVtZXJhdGlvbnMuICBSZWNvZ25pemUKKwl0aGlzIHNwZWNpYWwgY2FzZSBhbmQgc2V0IG5hbWVsZXNzIGZsYWcuCisJKiBjaC1leHAueSAoR0VORVJBTF9QUk9DRURVUkVfTkFNRSwgTE9DQVRJT05fTkFNRSk6ICBOZXcKKwl0ZXJtaW5hbCB0b2tlbnMuCisJKiBjaC1leHAueSAoYWNjZXNzX25hbWUpOiAgTmV3IG5vbi10ZXJtaW5hbCB0b2tlbiBhbmQKKwlwcm9kdWN0aW9uLgorCSogY2gtZXhwLnkgKGdlbmVyYWxfcHJvY2VkdXJlX25hbWUpOiAgTm93IGEgdGVybWluYWwgdG9rZW4uCisJKiBjaC1leHAueSAobG9jYXRpb24pOiAgRXhwYW5kIHByb2R1Y3Rpb24uCisJKiBjaC1leHAueSAobWF0Y2hfc2ltcGxlX25hbWVfc3RyaW5nKTogIE5ldyBmdW5jdGlvbi4KKwkqIGNoLWV4cC55ICh5eWxleCk6ICBDYWxsIG1hdGNoX3NpbXBsZV9uYW1lX3N0cmluZyBhbmQgcmV0dXJuCisJR0VORVJBTF9QUk9DRURVUkVfTkFNRSBvciBMT0NBVElPTl9OQU1FIGFzIGFwcHJvcHJpYXRlLgorCitXZWQgTm92IDI1IDA3OjE3OjEzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBtdW5jaDogIEJhY2tzbGFzaCBlc2NhcGUgdmVydGljYWwgYmFyIGNoYXJhY3RlcnMgaW5zaWRlCisJZ3JlcCBwYXR0ZXJucyBzaW5jZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5nIGZvciBzb21lIGdyZXBzLgorCSogcGFyc2UuYyAod3JpdGVfZXhwX3N0cmluZyk6ICBDb21wbGV0ZSByZXdyaXRlIHRvIHN0b3JlIHN0cmluZworCWNvbnRhbnRzIGFzIGEgbGVhZGluZyBleHBsaWNpdCBsZW5ndGgsIGZvbGxvd2VkIGJ5IHRoZSBzdHJpbmcgZGF0YSwKKwlmb2xsb3dlZCBieSBhIHRyYWlsaW5nIGV4cGxpY2l0IGxlbmd0aC4KKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKSwgZXhwcHJpbnQuYyAocHJpbnRfc3ViZXhwKSwKKwlwYXJzZS5jIChsZW5ndGhfb2Zfc3ViZXhwKSwgcGFyc2UuYyAocHJlZml4aWZ5X3N1YmV4cCk6CisJVXNlIHJlY29yZGVkIGV4cGxpY2l0IGxlbmd0aCBvZiBzdHJpbmdzIGluIGV4cHJlc3Npb24gZWxlbWVudHMsCisJcmF0aGVyIHRoYW4gc3RybGVuLiAgQWRqdXN0IGNvZGUgdG8gc2tpcCBvdmVyIHN0cmluZ3Mgc3RvcmVkIGluCisJZXhwcmVzc2lvbiBlbGVtZW50cywgYW5kIGNvZGUgdG8gYWNjZXNzIHN0cmluZ3MsIHRvIGFjY291bnQgZm9yCisJbmV3IGxlYWRpbmcgZXhwbGljaXQgc2l6ZSBleHByZXNzaW9uIGVsZW1lbnQuCisJKiBwYXJzZS5jIChsZW5ndGhfb2Zfc3ViZXhwKTogIFRlc3QgZm9yIG1pbmltdW0gZW5kcG9zIG9mIDEsIG5vdAorCTAsIHRvIGF2b2lkIG5lZ2F0aXZlIGV4cHJlc3Npb24gZWxlbWVudCBpbmRpY2VzLgorCSogdmFsb3BzLmMgKHNlYXJjaF9zdHJ1Y3RfbWV0aG9kKTogIE1pbm9yIHdoaXRlc3BhY2UgY2hhbmdlLgkKKworTW9uIE5vdiAyMyAxMToxNDoxNSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogYy1leHAueSAoeXlsZXgpOiAgQWRkIHRlbXBidWYsIHRlbXBidWZpbmRleCwgYW5kIHRlbXBidWZzaXplLAorCXdoaWNoIHRvZ2V0aGVyIG1haW50YWluIGEgZHluYW1pY2FsbHkgZXhwYW5kYWJsZSBzdGF0aWMgYnVmZmVyCisJZm9yIHRoZSBsZXhlciB0byB1c2Ugd2hlbiB0cmFuc2xhdGluZyBDIHN0cmluZ3MgdG8gdGhlaXIgaW50ZXJuYWwKKwlmb3JtIChvdGhlciBmdXR1cmUgdXNlcyBwb3NzaWJsZSkuICBGaXggcGFyc2luZyBvZiBDIHN0eWxlIHN0cmluZ3MKKwl0byBkbyB0aGUgbm9ybWFsIEMgc3R5bGUgaW5wdXQgY29udmVyc2lvbnMgb2YgZXNjYXBlZCBjaGFyYWN0ZXIKKwlzZXF1ZW5jZXMuCisJKiB2YWxvcHMuYyAodmFsdWVfc3RyaW5nKTogIFJlbW92ZSB0cmFuc2xhdGlvbiBvZiBlc2NhcGVkCisJY2hhcmFjdGVyIHNlcXVlbmNlcywgbm93IGRvbmUgaW4gQyBleHByZXNzaW9uIHBhcnNlci4KKwkqIGxhbmd1YWdlLmggKFBSSU5UX0xJVEVSQUxfRk9STSk6ICBOZXcgbWFjcm8gdGhhdCB0YWtlcyBjaGFyYWN0ZXIKKwlhbmQgZGVjaWRlcyBpZiBpdCBzaG91bGQgYmUgcHJpbnRlZCBpbiBsaXRlcmFsIGZvcm0gb3Igc29tZSBvdGhlcgorCWZvcm0sIGJhc2VkIG9uIGl0J3MgQVNDSUkgdmFsdWUgYW5kIHNldHRpbmcgb2Ygc2V2ZW5iaXRfc3RyaW5ncy4KKwkqIHtjLWV4cC55LCBtMi1leHAueX0gKGVtaXRfY2hhcik6ICBVc2UgbmV3IFBSSU5UX0xJVEVSQUxfRk9STQorCW1hY3JvLCBjaGFuZ2UgaW5kZW50YXRpb24gc3R5bGUuCisJKiBjaC1leHAueSAoY2hpbGxfcHJpbnRjaGFyKTogIFVzZSBuZXcgUFJJTlRfTElURVJBTF9GT1JNIG1hY3JvLgorCSogY2gtZXhwLnkgKGNoaWxsX3ByaW50c3RyKTogIEZpcnN0IGN1dCBhdCByZWFsIGZ1bmN0aW9uIGluc3RlYWQKKwlvZiBlcnJvciBzdHViLgorCitTdW4gTm92IDIyIDE2OjIxOjQxIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogbmluZHktc2hhcmUvc3RvcC5oOiBmaXhlZCBib2d1cyBjb21tZW50LWVuZCBpbiBjb3B5cmlnaHQgbWVzc2FnZQorCisJKiBpOTYwLXBpbnNuLmM6IGZpeGVkIHR3byBjYWxscyBvZiBmcHV0c19maWx0ZXJlZCB0aGF0IGhhZCAzIGFyZ3VtZW50cworCitGcmkgTm92IDIwIDIxOjM1OjU3IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBkZWZzLmggKHNldmVuYml0X3N0cmluZ3MpOiAgQWRkIGRlY2xhcmF0aW9uLgorCSogZGVmcy5oIChwcmludGNoYXIpOiAgUmVwbGFjZSB3aXRoIGdkYl9wcmludGNoYXIuCisJKiBsYW5ndWFnZS5oIChsYW5ndWFnZV9kZWZuKTogIEFkZCBuZXcgZnVuY3Rpb24gcG9pbnRlcnMKKwlsYV9wcmludGNoYXIgYW5kIGxhX3ByaW50c3RyLCB0byBkbyBsYW5ndWFnZSBkZXBlbmRlbnQKKwlwcmludGluZyBvZiBjaGFyYWN0ZXJzIGFuZCBzdHJpbmdzLgorCSogbGFuZ3VhZ2UuaCAobG9jYWxfcHJpbnRjaGFyLCBsb2NhbF9wcmludHN0cik6ICBOZXcgbWFjcm9zCisJdG8gY2FsbCBsYW5ndWFnZSBkZXBlbmRlbnQgZnVuY3Rpb25zIHBvaW50ZWQgdG8gYnkgbGFfcHJpbnRjaGFyCisJYW5kIGxhX3ByaW50c3RyIHJlc3BlY3RpdmVseS4KKwkqIGMtZXhwLnkgKGVtaXRfY2hhciwgY19wcmludGNoYXIsIGNfcHJpbnRzdHIpOiAgTmV3IGxhbmd1YWdlCisJZGVwZW5kZW50IGZ1bmN0aW9ucyBmb3IgcHJpbnRpbmcgY2hhcmFjdGVycyBhbmQgc3RyaW5ncy4KKwkqIGMtZXhwLnkgKGNfbGFuZ3VhZ2VfZGVmbiwgY3BsdXNfbGFuZ3VhZ2VfZGVmbik6ICBBZGQKKwljX3ByaW50Y2hhciBhbmQgY19wcmludHN0ci4KKwkqIGNvbW1hbmQuYyAoZG9fc2V0c2hvd19jb21tYW5kKTogIFJlbmFtZSBwcmludGNoYXIgdXNlIHRvCisJZ2RiX3ByaW50Y2hhci4KKwkqIGV4cHByaW50LmMgKHByaW50X3N1YmV4cCk6ICBSZXBsYWNlIEMgc3R5bGUgc3RyaW5nIG91dHB1dAorCXdpdGggY2FsbCB0byBsb2NhbF9wcmludHN0ci4KKwkqIGxhbmd1YWdlLmMgKHVua19sYW5nX3ByaW50Y2hhciwgdW5rX2xhbmdfcHJpbnRzdHIpOgorCU5ldyBzdHVicywgY3VycmVudGx5IGVycm9ycy4KKwkqIGxhbmd1YWdlLmMgKHVua25vd25fbGFuZ3VhZ2VfZGVmbiwgYXV0b19sYW5ndWFnZV9kZWZuLAorCWxvY2FsX2xhbmd1YWdlX2RlZm4pOiAgQWRkIHVua19sYW5nX3ByaW50Y2hhciBhbmQKKwl1bmtfbGFuZ19wcmludHN0ci4KKwkqIG0yLWV4cC55IChlbWl0X2NoYXIsIG0yX3ByaW50Y2hhciwgbTJfcHJpbnRzdHIpOiAgTmV3CisJbGFuZ3VhZ2UgZGVwZW5kZW50IGZ1bmN0aW9ucyB0byBwcmludCBjaGFyYWN0ZXJzIGFuZCBzdHJpbmdzLgorCSogbTItZXhwLnkgKG0yX2xhbmd1YWdlX2RlZm4pOiAgQWRkIG0yX3ByaW50Y2hhciBhbmQgbTJfcHJpbnRzdHIuCisJKiB1dGlscy5jIChwcmludGNoYXIpOiAgUmVuYW1lZCB0byBnZGJfcHJpbnRjaGFyLgorCSogdmFscHJpbnQuYyAocHJpbnRfc3RyaW5nKTogIFJlbW92ZSBwcm90b3R5cGUsIGZ1bmN0aW9uIG1vdmVkCisJdG8gYy1leHAueSwgd2hlcmUgaXQgYmVjb21lcyBjX3ByaW50c3RyLgorCSogdmFscHJpbnQuYyAocHJpbnRfbWF4KTogIE1hZGUgZ2xvYmFsIGZvciByZWZlcmVuY2UgZnJvbSB0aGUKKwlsYW5ndWFnZSBkZXBlbmRlbnQgcHJpbnRpbmcgcm91dGluZXMgaW4gKi1leHAueS4KKwkqIHZhbHByaW50LmMgKHJlcGVhdF9jb3VudF90aHJlc2hvbGQpOiAgTmV3IHZhcmlhYmxlIHdpdGggZnVuY3Rpb24KKwlvZiBvbGQgUkVQRUFUX0NPVU5UX1RIUkVIT0xEIGRlZmluZSwgYnV0IG5vdyBzZXR0YWJsZSBieSB1c2VyLgorCUNoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byBvbGQgbWFjcm8gdG8gcmVmZXJlbmNlcyB0byBuZXcgdmFyaWFibGUuCisJKiB2YWxwcmludC5jICh2YWx1ZV9wcmludCwgdmFsX3ByaW50KTogIFJlcGxhY2UgY2FsbHMgdG8KKwlwcmludF9zdHJpbmcgd2l0aCBjYWxscyB0byBsb2NhbF9wcmludHN0ci4KKwkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6ICBSZXBsYWNlIEMgc3R5bGUgY2hhcmFjdGVyIHByaW50aW5nCisJd2l0aCBjYWxsIHRvIGxvY2FsX3ByaW50Y2hhci4KKwkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6ICBBZGQgY2FzZSBmb3IgVFlQRV9DT0RFX0NIQVIuCisJKiB2YWxwcmludC5jIChfaW5pdGlhbGl6ZV92YWxwcmludCk6ICBBZGQgYWRkX3Nob3dfZnJvbV9zZXQKKwljYWxsIGZvciBzZXR0aW5nIHVwIHJlcGVhdF9jb3VudF90aHJlc2hvbGQgYXMgcHJpbnQgdmFyaWFibGUuCisJKiBjaC1leHAueSAoZGVjb2RlX2ludGVnZXJfdmFsdWUpOiAgTmV3IGZ1bmN0aW9uLgorCSogY2gtZXhwLnkgKGRlY29kZV9pbnRlZ2VyX2xpdGVyYWwpOiAgVXNlIGRlY29kZV9pbnRlZ2VyX3ZhbHVlLgorCSogY2gtZXhwLnkgKGNoaWxsX3ByaW50Y2hhciwgY2hpbGxfcHJpbnRzdHIpOiAgTmV3IGxhbmd1YWdlCisJZGVwZW5kZW50IGZ1bmN0aW9ucyBmb3IgcHJpbnRpbmcgY2hhcmFjdGVycyBhbmQgc3RyaW5ncy4KKwkqIGNoLWV4cC55IChjaGlsbF9sYW5ndWFnZV9kZWZuKTogIEFkZCBjaGlsbF9wcmludGNoYXIgYW5kCisJY2hpbGxfcHJpbnRzdHIuCisKK1RodSBOb3YgMTkgMjE6MjI6MjEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIG1haW4uYyAobWFpbik6ICBQcmludCBHREIgdmVyc2lvbiBudW1iZXIgaW4gZ2RiIC1oZWxwOyBkb2MgcGlkIGFyZy4KKwlTdWdnZXN0ZWQgYnkgTWFydHkgTGVpc25lciwgPGxlaXNuZXJAZXNvLm1jLnhlcm94LmNvbT4uCisJKHByaW50X2dkYl92ZXJzaW9uKTogIE5ldyBhcmcgaXMgc3Rkb3V0IG9yIHN0ZGVyci4gIENhbGxlcnMgY2hhbmdlZC4KKworV2VkIE5vdiAxOCAxNTowNTo0NSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIHJlbW90ZS12eC5jICh2eF9raWxsKToganVzdCB3YXJuIGlmIHdlIGNhbid0IGNvbnRhY3QgdGhlIGJvYXJkLAorCWFuZCBhc3N1bWUgdGhlIHByb2Nlc3MgaGFzIGJlZW4ga2lsbGVkLgorCitXZWQgTm92IDE4IDE0OjM5OjU3IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIHJlbW90ZS11ZGkuYyAodWRpX29wZW4pOiAgUmVzZXQgdmFycyBzbyB0aGF0IHVzZXIgY2FuIHJlLXJ1bgorCXByb2dyYW1zIHdpdGhvdXQgbGVhdmluZyBHREIuCisJKiAobWFueSByb3V0aW5lcyk6ICBTbGlnaHRseSBpbXByb3ZlIGVycm9yIGhhbmRsaW5nLgorCSogKGRvd25sb2FkKTogIFplcm8gb3V0IEJTUyBieSBsb25ncyBpbnN0ZWFkIG9mIGJ5dGVzIHRvIGF2b2lkCisJdGltZW91dHMgaW4gcmVhbCBoYXJkd2FyZS4KKwkqIDI5ay1zaGFyZS91ZGkvdWRpcDJzb2MuYyAoVURJRGlzY29ubmVjdCwgVURJS2lsbCk6ICBJbmRpY2F0ZQorCXRoYXQgY29ubmVjdGlvbiBpcyBubyBsb25nZXIgaW4gdXNlIGFmdGVyIHNodXRkb3duKCkgb2Ygc29ja2V0LgorCVRoaXMga2VlcHMgR0RCIGZyb20gZHlpbmcgb2YgYSBTSUdQSVBFIHdoZW4geW91IGlzc3VlIG11bHRpcGxlCisJYHRhcmdldCB1ZGknIGNvbW1hbmRzLgorCitXZWQgTm92IDE4IDE0OjI3OjQ3IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBsYW5ndWFnZS5oIChsYW5ndWFnZV9mb3JtYXRfaW5mbyk6ICBOZXcgc3RydWN0dXJlIHRvIGJ1bmRsZQorCWxvY2FsIGZvcm1hdHRpbmcgaW5mb3JtYXRpb24uCisJKiBsYW5ndWFnZS5oIChsYW5ndWFnZV9kZWZuKTogIFJlcGxhY2UgaW5kaXZpZHVhbCBmb3JtYXQgaW5mbworCXdpdGggbGFuZ3VhZ2VfZm9ybWF0X2luZm8gc3RydWN0cy4KKwkqIGxhbmd1YWdlLmggKGxvY2FsXypfZm9ybWF0LCBsb2NhbF8qX2Zvcm1hdF9wcmVmaXgsCisJbG9jYWxfKl9mb3JtYXRfc3BlY2lmaWVyLCBsb2NhbF8qX2Zvcm1hdF9zdWZmaXgpOiAgTmV3IG1hY3JvcworCWZvciBiaW5hcnkvb2N0YWwvZGVjaW1hbC9oZXggZm9ybWF0cyB0byBhY2Nlc3MgaW5mbyBlbGVtZW50cy4KKwkqIGMtZXhwLnkgKGNfbGFuZ3VhZ2VfZGVmbik6ICBVcGRhdGUgZm9yIG5ldyBmb3JtYXQgaGFuZGxpbmcuCisJKiBtMi1leHAueSAobTJfbGFuZ3VhZ2VfZGVmbik6ICBVcGRhdGUgZm9yIG5ldyBmb3JtYXQgaGFuZGxpbmcuCisJKiBkYnhyZWFkLmMgKGxhbmd1YWdlLmgpOiAgSW5jbHVkZSBmb3IgcGFydGlhbC1zdGFiLmggdXNlLgorCSogbWlwc3JlYWQuYyAoZXhwcmVzc2lvbi5oLCBsYW5ndWFnZS5oKTogIEluY2x1ZGUgZm9yCisJcGFydGlhbC1zdGFiLmggdXNlLgorCSogZGVmcy5oIChsb2NhbF9oZXhfZm9ybWF0LCBsb2NhbF9oZXhfZm9ybWF0X2N1c3RvbSwKKwlsb2NhbF9oZXhfc3RyaW5nLCBsb2NhbF9oZXhfc3RyaW5nX2N1c3RvbSk6ICBNb3ZlIHRvIGxhbmd1YWdlLmguCisJKiBsYW5ndWFnZS5jIChsb2NhbF9oZXhfZm9ybWF0X2N1c3RvbSwgbG9jYWxfaGV4X3N0cmluZywKKwlsb2NhbF9oZXhfc3RyaW5nX2N1c3RvbSwgbG9jYWxfb2N0YWxfZm9ybWF0X2N1c3RvbSk6ICBVc2UgbmV3CisJZm9ybWF0IGhhbmRsaW5nLgorCSogbGFuZ3VhZ2UuYyAodW5rbm93bl9sYW5ndWFnZV9kZWZuLCBhdXRvX2xhbmd1YWdlX2RlZm4sCisJbG9jYWxfbGFuZ3VhZ2VfZGVmbik6ICBVcGRhdGUgZm9yIG5ldyBmb3JtYXQgaGFuZGxpbmcuCisJKiBwcmludGNtZC5jIChwcmludF9zY2FsYXJfZm9ybWF0dGVkKTogIFVzZSBuZXcgbWFjcm9zCisJdG8gYWNjZXNzIGRlY2ltYWwgYW5kIGJpbmFyeSBmb3JtYXQgaW5mbyBmb3IgcHJpbnRpbmcuCisJKiBjLWV4cC55IChjaGlsbF9sYW5ndWFnZV9kZWZuKTogIFVwZGF0ZSBmb3IgbmV3IGZvcm1hdCBoYW5kbGluZy4KKwkqIGNoLWV4cC55IChDSEFSQUNURVJfTElURVJBTCk6ICBBZGQgc3VwcG9ydCB0byB5eWxleC4KKwkqIGNoLWV4cC55IChkZWNvZGVfaW50ZWdlcl9saXRlcmFsKTogIEFkZCBmdW5jdGlvbgorCSogY2gtZXhwLnkgKG1hdGNoX2ludGVnZXJfbGl0ZXJhbCk6ICBVc2UgZGVjb2RlX2ludGVnZXJfbGl0ZXJhbC4KKwkqIGNoLWV4cC55IChidWlsdGluX3R5cGVfY2hpbGxfY2hhcik6ICBBZGQgZGVmaW5pdGlvbi4KKwkqIGdkYnR5cGVzLmggKGJ1aWx0aW5fdHlwZV9jaGlsbF9jaGFyKTogIEFkZCBkZWNsYXJhdGlvbi4KKworVHVlIE5vdiAxNyAxMToxNzowNiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKyAJKiB0bS1yczYwMDAuaCAoQkVMSUVWRV9QQ0NfUFJPTU9USU9OKTogRGVmaW5lLCBzaW5jZSBBSVggY2MgZ2V0cworCWl0IHJpZ2h0LgorCShhaXhfZnJhbWVkYXRhKTogYWRkZWQgbm9zYXZlZHBjIGZpZWxkLgorCShTQVZFRF9QQ19BRlRFUl9DQUxMKTogRG9uJ3QgdHJ5IHRvIG9wdGltaXplOyBqdXN0IGNhbGwKKwlyZWFkX3JlZ2lzdGVyLgorCShGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTik6IFBhc3Mgc2Vjb25kIGFyZ3VtZW50IG9mIDAuCisJKEZSQU1FX1NBVkVEX1BDKTogSWYgUEMgbm90IHNhdmVkLCB1c2UgU0FWRURfUENfQUZURVJfQ0FMTC4KKwkqIHJzNjAwMC10ZGVwLmMgKHNraXBfcHJvbG9ndWUpOiBIYW5kbGUgZ2NjIGdlbmVyYXRlZCBzdGZkCisJaW5zdHJ1Y3Rpb25zIGFzIGZ1bmN0aW9uX2ZyYW1lX2luZm8gZG9lcy4gIEV4cGFuZCBzcGVjaWFsIGNhc2Ugb2YKKwlzdCByMzEsLTQocjEpIHRvIGJlIHN0IHIzMSxOVU0ocjEpLCBzaW5jZSBnY2MgY2FuIGdlbmVyYXRlIG9mZnNldHMKKwlvdGhlciB0aGFuIC00LgorCShwb3BfZnJhbWUpOiBBZGQgNCByYXRoZXIgdGhhbiBzaXplb2YgKGludCkgdG8gYXZvaWQgaG9zdAorCWRlcGVuZGVuY2UuCisJKGZ1bmN0aW9uX2ZyYW1lX2luZm8pOiBTZXQgZnJhbWVsZXNzIGlmIHRoZSBmdW5jdGlvbiBoYXMgbm8gZnJhbWUsCisJYW5kIHNldCBub3NhdmVkcGMgaWYgdGhlIFBDIHdhcyBub3Qgc2F2ZWQuICBIYW5kbGUgZ2NjIGdlbmVyYXRlZAorCXN0ZmQgMzEsLTQoMzEpOyBzdCAzMSwgLTEyKDMxKSBjb3JyZWN0bHkuCisJKGZyYW1lbGVzc19mdW5jdGlvbl9pbnZvY2F0aW9uKTogTmV3IHNlY29uZCBhcmd1bWVudCBwY3NhdmVkOyBpZiAwCisJcmV0dXJuIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGhhcyBhIGZyYW1lLCBpZiAxIHJldHVybiB3aGV0aGVyIHRoZQorCWZ1bmN0aW9uIHNhdmVkIFBDLgorCShmcmFtZV9pbml0aWFsX3N0YWNrX2FkZHJlc3MpOiBDb3JyZWN0IHR5cG86IGNhY2hlIHJlZ2lzdGVycyBmb3IKKwljYWxsZWVfZmksIG5vdCBmb3IgZmksIChhdm9pZHMgcmVhZGluZyBnYXJiYWdlIG1lbW9yeSBsb2NhdGlvbnMpLgorCitNb24gTm92IDE2IDE1OjU4OjA3IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvciAoanVzdCBiZWZvcmUgc3RlcF9vdmVyX2Z1bmN0aW9uCisJbGFiZWwpKTogIENoYW5nZSB0ZXN0IGZvciBzdGVwcGluZyBpbnRvIHN1YnJvdXRpbmUgdG8gY2hlY2sgZm9yIHRoZQorCXByZXNlbmNlIG9mIGxpbmUgbnVtYmVyIGluZm8uICBUaGlzIG1ha2VzIHN0dWZmIGNvbXBpbGVkIHdpdGggLWcxCisJY2F1c2UgR0RCIHRvIG5vdCBsb3NlIGNvbnRyb2wgd2hlbiBzdGVwcGluZy4KKworCSogc3ltdGFiLmMgKGZpbmRfcGNfbGluZSk6ICBJbXByb3ZlIGNvZGUgcGVyIGdudSdzIHN1Z2dlc3Rpb25zLgorCUltcHJvdmUgY29tbWVudHMgYXMgd2VsbC4KKworU3VuIE5vdiAxNSAwOToyMjowOSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiAgQnVtcCB0byA0LjcuMgorCSogc3ltdGFiLmMgKGZpbmRfcGNfc3ltdGFiKTogIEZpeCByZXR1cm4gb2YgcmFuZG9tIHZhbHVlCisJdG8gY2FsbGVyLgorCSogTWFrZWZpbGUuaW4gKGMtZXhwLnRhYi5jLCBtMi1leHAudGFiLmMpOiAgQWRkIGRlcGVuZGVuY3kgb24KKwlNYWtlZmlsZSBzaW5jZSBpdCBjb250YWlucyBzZWQgcGF0dGVybnMgdXNlZCBpbiBnZW5lcmF0aW9uLgorCUFkZCBzZWQgcGF0dGVybiB0byBhbHNvIGRlbGV0ZSAjaW5jbHVkZSBvZiBhbnkgbWFsbG9jLmguCisJKiBjLWV4cC55LCBleHByLmMsIGV4cHJlc3Npb24uaCwgbGFuZ3VhZ2UuYywgbTItZXhwLnksCisJcGFyc2VyLWRlZnMuaCwgdmFsYXJpdGguYywgdmFsb3BzLmMsIHZhbHVlLmg6ICBSZW1hcCBtYWNyb3MgYW5kCisJZnVuY3Rpb24gbmFtZXMgdG8gY29uZm9ybSB0byBLJlIgdGVybWlub2xvZ3kgd2l0aCByZXNwZWN0IHRvCisJbG9naWNhbCBhbmQgYml0d2lzZSBvcGVyYXRvcnM6CisJVU5PUF9aRVJPUCA9PiBVTk9QX0xPR0lDQUxfTk9UCisJVU5PUF9MT0dOT1QgPT4gVU5PUF9DT01QTEVNRU5UCisJQklOT1BfTE9HQU5EID0+IEJJTk9QX0JJVFdJU0VfQU5ECisJQklOT1BfTE9HWE9SID0+IEJJTk9QX0JJVFdJU0VfWE9SCisJQklOT1BfTE9HSU9SID0+IEJJTk9QX0JJVFdJU0VfSU9SCisJQklOT1BfQU5EID0+IEJJTk9QX0xPR0lDQUxfQU5ECisJQklOT1BfT1IgPT4gQklOT1BfTE9HSUNBTF9PUgorCVBSRUNfT1IgPT4gUFJFQ19MT0dJQ0FMX09SCisJUFJFQ19BTkQgPT4gUFJFQ19MT0dJQ0FMX0FORAorCVBSRUNfTE9HSU9SID0+IFBSRUNfQklUV0lTRV9JT1IKKwlQUkVDX0xPR1hPUiA9PiBQUkVDX0JJVFdJU0VfWE9SCisJUFJFQ19MT0dBTkQgPT4gUFJFQ19CSVRXSVNFX0FORAorCXZhbHVlX3plcm9wKCkgPT4gdmFsdWVfbG9naWNhbF9ub3QoKQorCXZhbHVlX2xvZ25vdCgpID0+IHZhbHVlX2NvbXBsZW1lbnQoKQorCSogYy1leHAueSAoY19vcF9wcmludF90YWIpOiAgQWRkIGV4cGxpY2l0IGVtcHR5IHRlcm1pbmF0b3IuCisJKiBtMi1leHAueSAobTJfb3BfcHJpbnRfdGFiKTogIEFkZCBleHBsaWNpdCBlbXB0eSB0ZXJtaW5hdG9yLgorCSogaTM4Ny10ZGVwLmMgKHN5cy9kaXIuaCk6ICBSZW1vdmUsIGFwcGVhcnMgdG8gYmUgdW5uZWNlc3NhcnkKKwlhbmQgaXMgbm9uZXhpc3RhbnQgaW4gc29tZSBTVlI0IGJhc2VkIHN5c3RlbXMuCisJKiBsYW5ndWFnZS5jIChERUZBVUxUX0FMTE9DU0laRSk6ICBDaGFuZ2UgZnJvbSAzID0+IDQuCisJKiBtMi1leHAueSAobnVtYmVyX3NpZ24sIG1vZGJsb2NrKTogIE1ha2Ugc3RhdGljLCAjaWZkZWYgb3V0CisJdW51c2VkIG1vZGJsb2NrLgorCSogbTItZXhwLnkgKEFOREFORCk6ICBSZW5hbWUgdG8gTE9HSUNBTF9BTkQuCisJKiBzb3VyY2UuYyAoc291cmNlX2luZm8pOiAgRml4IG1pbm9yIG5pdHMsIHByaW50ICIxIGxpbmUiIHJhdGhlcgorCXRoYW4gIjEgbGluZXMiLCBhbmQgImxhbmd1YWdlIGlzIDxsYW5nPiIuCisJKiB2YWxhcml0aC5jICh2YWx1ZV9iaW5vcCk6ICBIYW5kbGUgVFlQRV9DT0RFX0JPT0wgYXMgd2VsbAorCWFzIFRZUEVfQ09ERV9JTlQgYW5kIFRZUEVfQ09ERV9GTE9BVC4KKwkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6ICBQcmludCBUWVBFX0NPREVfQk9PTCB0eXBlIHZhbHVlcyBhcworCSJUUlVFIiBvciAiRkFMU0UiLgorCSogdmFsdWVzLmMgKHZhbHVlX2Zyb21fbG9uZ2VzdCk6ICBIYW5kbGUgVFlQRV9DT0RFX0JPT0wuCisJKiBjaC1leHAueTogIE5ldyBleHByZXNzaW9uIHBhcnNlciwgZm9yIEdOVS1DaGlsbC4KKwkqIGRlZnMuaCAoZW51bSBsYW5ndWFnZSk6ICBBZGQgbGFuZ3VhZ2VfY2hpbGwuCisJKiBkd2FyZnJlYWQuYyAoc2V0X2N1X2xhbmd1YWdlKTogIEFkZCBMQU5HX0NISUxMIGNhc2UgYW5kIG1ha2UKKwlMQU5HX01PRFVMQTIgYSByZWNvZ25pemVkIGxhbmd1YWdlLgorCSogZ2RidHlwZXMuaCAoZW51bV90eXBlY29kZSk6ICBOb3RlIFRZUEVfQ09ERV9CT09MIHVzZWQgZm9yIAorCUNoaWxsIGFzIHdlbGwgYXMgTW9kdWxhLTIuCisJKiBnZGJ0eXBlcy55IChidWlsdGluX3R5cGVfY2hpbGxfYm9vbCwgYnVpbHRpbl90eXBlX2NoaWxsX2xvbmcsCisJYnVpbHRpbl90eXBlX2NoaWxsX3Vsb25nLCBidWlsdGluX3R5cGVfY2hpbGxfcmVhbCk6ICBBZGQuCisJKiBsYW5ndWFnZS5jIChzZXRfbGFuZ3VhZ2VfY29tbWFuZCk6ICBBZGQgY2hpbGwuCisJKiBsYW5ndWFnZS5jIChiaW5vcF9yZXN1bHRfdHlwZSwgaW50ZWdyYWxfdHlwZSwgY2hhcmFjdGVyX3R5cGUsCisJYm9vbGVhbl90eXBlLCBzdHJ1Y3R1cmVkX3R5cGUsIHZhbHVlX3RydWUsIGJpbm9wX3R5cGVfY2hlY2spOgorCUFkZCBsYW5ndWFnZV9jaGlsbCBjYXNlcy4KKwkqIGxhbmd1YWdlLmggKF9MQU5HX2NoaWxsKTogIERlZmluZS4KKwkqIHN5bWZpbGUuYyAoZGVkdWNlX2xhbmd1YWdlX2Zyb21fZmlsZW5hbWUpOiAgUmVjb2duaXplIHRoZQorCWZpbGVuYW1lIGV4dGVuc2lvbnMgIi5jaGlsbCIsICIuYzE4NiIsIGFuZCAiLmMyODYiIGZvciBDaGlsbC4KKwkqIHZhbHByaW50LmMgKHR5cGVkZWZfcHJpbnQpOiAgQWRkIGNhc2UgZm9yIGxhbmd1YWdlX2NoaWxsLgorCSogTWFrZWZpbGUuaW4gKFNGSUxFU19NQUlORElSKTogIEFkZCBjaC1leHAueS4KKwkqIE1ha2VmaWxlLmluIChZWUZJTEVTKTogIEFkZCBjaC1leHAudGFiLmMuCisJKiBNYWtlZmlsZS5pbiAoWVlPQkopOiAgQWRkIGNoLWV4cC50YWIuby4KKwkqIE1ha2VmaWxlLmluIChzYWJlcl9nZGIpOiAgQWRkIHVubG9hZCBvZiBjaC1leHAueSBhbmQgbG9hZAorCW9mIGNoLWV4cC50YWIuYy4KKwkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiAgQWRkIHRhcmdldCBjaC1leHAudGFiLmMuCisJKiBNYWtlZmlsZS5pbiAocmVhbGNsZWFuKTogIEFkZCBybSBvZiBjaC1leHAudGFiLmMuCisJKiBNYWtlZmlsZS5pbiAoY2gtZXhwLnRhYi5vLCBjaC1leHAudGFiLmMpOiAgTmV3IHRhcmdldHMuCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cCk6ICBBZGQgT1BfQk9PTCBjYXNlLgorCSogZXhwcHJpbnQuYyAocHJpbnRfc3ViZXhwKTogIEFkZCBPUF9CT09MIGNhc2UuCQorCitGcmkgTm92IDEzIDIwOjM2OjI4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBpbmZjbWQuYyAoc2V0X2Vudmlyb25tZW50X2NvbW1hbmQpOiAgQXZvaWQgc2tpcHBpbmcgZmlyc3QKKwljaGFyIG9mIGVudiB2YWx1ZSBpZiBhbiAnPScgYXBwZWFycyBpbiBpdC4gIEJ1ZyByZXBvcnQgYW5kIGZpeAorCWJ5IE1hcmsgSnVuZ2VybWFuLCA8bWFqQGx1Y2lkLmNvbT4uCisKK0ZyaSBOb3YgMTMgMjA6MjQ6MTAgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogaW5mY21kLmMgKHN0ZXBfb3Zlcl9jYWxscyk6ICBJbXByb3ZlIGNvbW1lbnRzLgorCSogc3ltdGFiLmMgKGZpbmRfcGNfcHN5bXRhYik6ICBDbGVhbiB1cCBhIGJpdC4KKwkqIChmaW5kX3BjX3N5bXRhYik6ICBGaXggY29tbWVudHMsIGNsZWFuIHVwIGNvZGUuCisJKiAoZmluZF9wY19saW5lKTogIEdlbmVyYWwgY2xlYW51cHMsIGVmZmljaWVuY3kgaW1wcm92ZW1lbnRzLgorCUFsc28sIGRvbid0IHJldHVybiBnYXJiYWdlIHdoZW4gc29tZSBsaW5lIGluZm8gZXhpc3RzLCBidXQgdGhlcmUKKwl3YXMgbm8gZ29vZCBtYXRjaC4KKworVGh1IE5vdiAgNSAyMzowNDozOCAxOTkyIFJvYiBSeWFuIChycjJiQGFuZHJldy5jbXUuZWR1KQorCisgICAgICAgICogeGNvZmZleGVjLmMgKHZtYXBfc3ltdGFiKTogZml4ZWQgYSBidWcgd2hlcmUgaWYgYSBvYmplY3QgaGFzIG5vCisgICAgICAgIG1lbWJlciwgYW5kIHRoZSBzdGF0IHBvaW50ZXIgcGFzc2VkIHRvIHZtYXBfc3ltdGFiIHdhcyBOVUxMLCB0aGUKKyAgICAgICAgd3Jvbmcgdm1hcCBlbnRyaWVzIHdvdWxkIGJlIG1vZGlmaWVkLiAgRml4ZXMgYmVoYXZpb3Igd2hlcmUKKyAgICAgICAgYXR0ZW1wdGluZyB0byBsb2FkIHN5bWJvbHMgZm9yIGEgbW9kdWxlIHdpdGggbm8gbWVtYmVyIHdvdWxkIG1lc3MKKyAgICAgICAgdXAgYWxyZWFkeSByZWFkIGluIHN5bWJvbHMuCisKK1dlZCBOb3YgMTEgMTc6MDk6MTcgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBSZW1vdmUgZGVwZW5kYW5jaWVzIGZvciAyOWstc2hhcmUvZGZlL3lhbmsubyBhbmQKKwkyOWstc2hhcmUvZGZlL21pbmkydWRpLm8uCisJKiBjb25maWcvYTI5ay11ZGkubXQ6ICBSZW1vdmUgeWFuay5vIGFuZCBtaW5pMnVkaS5vLgorCSogYWxsZGVwcy5tYWssIGRlcGVuZDogIFVwZGF0ZSB0byBkZWFsIHdpdGggcmVtb3ZhbCBvZgorCWFmb3JlbWVudGlvbmVkIGZpbGVzLgorCSogcmVtb3RlLXVkaS5jOiAgTWFqb3IgY2xlYW51cHMuICBDbGVhbiB1cCB1ZGlfb3BlbiBhbmQgZHJvcAorCXJlcXVpcmVtZW50IGZvciB1c2VsZXNzICdwcm9ncmFtJyBhcmd1bWVudC4gIENsZWFuIHVwCisJdWRpX2NyZWF0ZV9pbmZlcmlvciwgYW5kIHVkaV9sb2FkIHRvIGNhbGwgY29tbW9uIGRvd25sb2FkKCkKKwlyb3V0aW5lLiAgQ3JlYXRlIGRvd25sb2FkIHJvdXRpbmUgdG8gbG9hZCByZW1vdGUgaG9zdHMgZGlyZWN0bHkKKwkod2l0aCB0aGUgaGVscCBvZiBCRkQpIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB5YW5rLmMgYW5kCisJbWluaTJ1ZGkuYy4KKwlGaXggdWRpX2RldGFjaCB0byBjYWxsIFVESURpc2Nvbm5lY3Qgd2l0aAorCXRoZSByaWdodCBhcmd1bWVudHMuICBDbGVhbiB1cCB1ZGlfcmVzdW1lLCBkb24ndCBhc3NpZ24gdGlwX2Vycm9yCisJdHdpY2UuICBDbGVhbiB1cCB1ZGlfd2FpdCwgc3RyYWlnaHRlbiBvdXQgc3RhdHVzIGNvZGVzLiAgTWFrZQorCXVkaV9raWxsIHJlYWxseSB3b3JrLgorCitGcmkgTm92ICA2IDEwOjI2OjAxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisgICAgCSogYy1leHAueTogc2VwYXJhdGVkIGhvc3QvdGFyZ2V0IGlkZWEgb2YgaW50ZWdlciB0eXBlIHNpemUsCisJcmVtb3ZlZCByZWR1bmRhbnQgcGFyc2UgcnVsZXMuIChZWVNUWVBFKTogYWRkZWQgdHlwZWRfdmFsLCByZW1vdmVkCisJVUlOVCBhbmQgQ0hBUiBydWxlcy4gKHBhcnNlX251bWJlcik6IHdvcmsgb3V0IHRoZSB0YXJnZXR3aXNlIHR5cGUKKwlvZiBhIG51bWJlciBiYXNlZCB1cG9uIGl0J3Mgc2l6ZSBhbmQgcXVhbGlmaWVycy4gKHl5bGV4KTogY2hhcnMKKwlhcmUgbm93IHRyZWF0ZWQgdGhlIHNhbWUgd2F5IGFzIGludHMuCisKKwkqIHNvdXJjZS5jIChpbmRlbnRpZnlfc291cmNlX2xpbmUpOiBkb24ndCBjb3JlIGR1bXAgaWYgd2FudGVkCisJbGluZSBpcyBsYXJnZXIgdGhhbiBudW1iZXIgb2YgbGluZXMgaW4gc291cmNlLiAoY2FuIGhhcHBlbiB3aGVuCisJY29mZiBnZXRzIGNvbmZ1c2VkIGFib3V0ICNpbmNsdWRlZCBzb3VyY2UpLgorCitGcmkgTm92ICA2IDAzOjAwOjM5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJRml4IHByb2JsZW1zIG5vdGljZWQgYnkgQWxsYW4gU3RlZWwsIDxhbGxhbkBtYXRocy5zdS5vei5hdT4sCisJd2hlbiBkZWJ1Z2dpbmcgYSBwcm9ncmFtIHdpdGggMTAwIHNoYXJlZCBsaWJyYXJpZXMuCisKKwkqIHNvbGliLmMgKHNvbGliX21hcF9zZWN0aW9ucyk6ICBBbHdheXMgY2xvc2UgdGhlIEJGRCB3ZSBvcGVuLgorCUZyZWUgYWxsIG1hbGxvYydkIHN0b3JhZ2Ugd2UgYWxsb2NhdGUsIHRvbywgaW5jbHVkaW5nIGVycm9yIGNhc2VzLgorCShzdHJ1Y3Qgc29fbGlzdCk6ICBSZW1vdmUgdW51c2VkIHNvX2JmZCBtZW1iZXIuCisJKGNsZWFyX3NvbGliKTogIERvbid0IGJvdGhlciBjbG9zaW5nIHNvX2JmZC4KKworCSogc3ltZmlsZS5jIChzeW1maWxlX2JmZF9vcGVuKTogIE1hcmsgbmV3bHkgb3BlbmVkIEJGRCBhcworCWNhY2hlYWJsZS4gIGBTbyBtYW55IHN5bWJvbCBmaWxlcywgc28gbGl0dGxlIGZpbGUgZGVzY3JpcHRvcnMuJworCQorRnJpIE5vdiAgNiAwMDoxNDozOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogbTY4ay1zdHViLmM6ICBSZW1vdmUgYW5zaWRlY2wuaCBhbmQgdGhlIGZldyB1c2VzIG9mIGl0LgorCVN0dWJzIHNob3VsZCBzdGFuZCBhbG9uZSBhcyBtdWNoIGFzIHBvc3NpYmxlLgorCisJKiBzb3VyY2UuYyAoc2hvd19kaXJlY3Rvcmllcyk6ICBBdm9pZCBwcmludGZfZmlsdGVyZWQgbGVuZ3RoIHByb2IKKwlwb2ludGVkIG91dCBieSBKb25hdGhhbiBTdG9uZS4KKworCSogaTk2MC1waW5zbi5jIChNRU1fTUFYLCBNRU1fU0laKTogIFNldCB1cHBlciBsaW1pdCBwcm9wZXJseSB0bworCWF2b2lkIGFjY2Vzc2VzIGJleW9uZCBlbmQgb2YgdGFibGUuICBGaXggYnkgTGVlIFcuIENvb3ByaWRlciwKKwk8TGVlX0Nvb3ByaWRlckB2b3Muc3RyYXR1cy5jb20+LgorCitUaHUgTm92ICA1IDE3OjMzOjA4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiB7c2VyLWJzZC5jLCBzZXItdGVybWlvcy5jfSAoc2VyaWFsX2Nsb3NlKTogIFBhc3MgYWRkcmVzcyBvZgorCXN0cnVjdCwgbm90IHN0cnVjdCBpdHNlbGYuCisJKiBzZXJpYWwuaCAoc2VyaWFsX3Jlc3RvcmUpOiAgRml4IHByb3RvdHlwZSwgdGFrZXMgcG9pbnRlciBub3QKKwlzdHJ1Y3QuCisKK1RodSBOb3YgIDUgMTc6MTI6NDIgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGRlcGVuZCk6ICBBZGQgbm0uaCB0byB0aGUgbGlzdCBvZiB0aGluZ3MgdG8gZml4dXAuCisJKiBkZXBlbmQ6ICBSZWRvLCB0byBmaXh1cCBubS5oIHByb2JsZW1zIHdpdGggKi10YWIuYyBmaWxlcy4KKworVGh1IE5vdiAgNSAwMDoxOTo1MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogaTM4Ni1zdHViLmM6ICBSZW1vdmUgYW5zaWRlY2wuaCBhbmQgdGhlIGZldyB1c2VzIG9mIGl0LgorCVN0dWJzIHNob3VsZCBzdGFuZCBhbG9uZSBhcyBtdWNoIGFzIHBvc3NpYmxlLgorCisJKiBSRUFETUU6ICBBZGQgcmVtb3RlLWVzMTgwMC5jIGFuZCByZW1vdGUtc3QyMDAwLmMgdG8gdGFibGUuCisJKiBnbzMyLW5hdC5jOiAgUmVtb3ZlLCB0aGVyZSBpcyBubyBuYXRpdmUgZ28zMiBzdXBwb3J0LgorCSogZ28zMi14ZGVwLmM6ICBSZW1vdmUgdW51c2VkIGZvcmssIGZ2b3JrLCB3YWl0LCBleGVjbHAsIGtpbGxfaW5mZXJpb3IuCisKK1dlZCBOb3YgIDQgMTU6Mjc6MzEgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogaW5mbG93LmMgKHBhc3Nfc2lnbmFsLCBzZXRfc2lnaW50X3RyYXAsIGNsZWFyX3NpZ2ludF90cmFwKTogIEFkZAorCW5ldyByb3V0aW5lcyB0byBkZWFsIHdpdGggc2VuZGluZyBTSUdJTlRzIHRvIGF0dGFjaGVkIHByb2Nlc3NlcworCXdoZW4gdGhlIHVzZXIgaW50ZXJydXB0cyB0aGUgY29udHJvbGxpbmcgR0RCLgorCSogaW5mdGFyZy5jIChjaGlsZF93YWl0KSwgcHJvY2ZzLmMgKHByb2Nmc193YWl0KTogIEFkZCBjYWxscyB0bworCXRoZSBhZm9yZW1lbnRpb25lZCByb3V0aW5lcyB3aGVuIHdhaXRpbmcgZm9yIHRoZSBhdHRhY2hlZCBwcm9jZXNzLgorCisJKiBlbGZyZWFkLmMsIG1pcHNyZWFkLmM6ICBJbmNsdWRlIDxzdHJpbmcuaD4uCisJKiBpMzg2LXN0dWIuYzogIEluY2x1ZGUgImFuc2lkZWNsLmgiIHRvIGRlYWwgd2l0aCBwcm90b3R5cGVzLgorCSogc2VyaWFsLmg6ICBBZGQgcHJvdG90eXBlIGZvciBzZXJpYWxfcmVzdG9yZSgpLgkKKworV2VkIE5vdiAgNCAxMToxMzoyNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIG1pbnN5bXMuYyAobG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjKTogc3VidHJhY3QgMSwgbm90IDIsIGZyb20KKwltaW5pbWFsX3N5bWJvbF9jb3VudCwgYmVjYXVzZSB0aGUgTlVMTCBzeW1ib2wgaXMgbm90IGluY2x1ZGVkIGluCisJdGhlIGNvdW50LiAgVGhpcyBwcmV2ZW50ZWQgdGhpcyBmdW5jdGlvbiBmcm9tIGZpbmRpbmcgdGhlIGxhc3QKKwlzeW1ib2wgaW4gdGhlIHRhYmxlLgorCitUdWUgTm92ICAzIDExOjI5OjE3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpOiBpZiBub3QgZGVmaW5lZAorCShCTE9DS19BRERSRVNTX0ZVTkNUSU9OX1JFTEFUSVZFKSwgc2V0IGZ1bmN0aW9uX3N0YXJ0X29mZnNldCBhdAorCXRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24sIG5vdCBqdXN0IGFmdGVyIE5fRlVOLgorCitGcmkgT2N0IDMwIDE2OjMzOjAyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoYy1leHAudGFiLmMsIG0yLWV4cC50YWIuYyk6ICBBZGQgc2VkIHBhdHRlcm5zIHRvCisJICByZW1hcCBhbGwgbWFsbG9jJ3MgdG8geG1hbGxvYydzIGFuZCBhbGwgcmVhbGxvYydzIHRvIHhyZWFsbG9jJ3MuCisJKiBjLWV4cC55LCBtMi1leHAueTogIEFkZCBjb21tZW50IGFib3V0IGhvdyBtYWxsb2MvcmVhbGxvYyBhcmUKKwkgIHJlbWFwcGVkIHRvIHhtYWxsb2MveHJlYWxsb2MsIHVzZSBvbmx5IG1hbGxvYy9yZWFsbG9jIGluIGdyYW1tZXIKKwkgIGZpbGUuICBSZW1vdmUgcHJlcHJvY2Vzc29yIGRlZmluZXMgdGhhdCBwcmV2aW91c2x5IGRpZCByZW1hcHBpbmcuCisKK0ZyaSBPY3QgMzAgMDA6NTg6MTggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGluZmNtZC5jIChydW5fY29tbWFuZCk6ICBBdm9pZCBsb25nIGNhbGxzIHRvIHByaW50Zl9maWx0ZXJlZC4KKwlCdWcgZml4IGNvdXJ0ZXN5IG9mIEFsZXhhbmRlciBLbGFpYmVyLgorCitUdWUgT2N0IDI3IDE3OjA4OjQ1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJaHAzMDAgbmF0aXZlIHN1cHBvcnQgKGhwMzAwaHB1eCB1bnRlc3RlZCkuCisKKwkqIGhwMzAwdXgteGRlcC5jOiByZW1vdmVkLgorCSogeG0taHAzMDBic2QuaCAoUkVHSVNURVJfVV9BRERSKTogcmVtb3ZlZC4KKwkqIHhtLWhwMzAwaHB1eC5oOiB1cGRhdGVkIGNvcHlyaWdodC4KKwkgIChBVFRBQ0hfREVUQUNILCBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMpOiByZW1vdmVkLgorCSogbm0taHAzMDBic2QuaCwgbm0taHAzMDBocHV4LmgsIGhwMzAwdXgtbmF0LmM6IG5ldyBmaWxlcy4KKwkqIE1ha2VmaWxlLmluIChIRklMRVMpOiBhZGRlZCBubS1ocDMwMGJzZC5oIGFuZCBubS1ocDMwMGhwdXguaC4KKwkqIGNvbmZpZy9ocDMwMGJzZC5taCAoWERFUEZJTEVTKTogcmVtb3ZlZCBpbmZwdHJhY2UubyBpbmZ0YXJnLm8KKwkgIGZvcmstY2hpbGQubyBjb3JlZGVwLm8gY29yZWxvdy5vLgorCSAgKE5BVF9GSUxFLCBOQVRERVBGSUxFUyk6IG5ldyBtYWNyb3MuCisJKiBjb25maWcvaHAzMDBic2QubXQgKFRERVBGSUxFUyk6IHJlbW92ZWQgZXhlYy5vLgorCSogY29uZmlnL2hwMzAwaHB1eC5taCAoWERFUEZJTEVTKTogcmVtb3ZlZCBpbmZwdHJhY2UubyBpbmZ0YXJnLm8KKwkgIGZvcmstY2hpbGQuby4KKwkgIChOQVRfRklMRSwgTkFUREVQRklMRVMpOiBuZXcgbWFjcm9zLgorCSogY29uZmlnL2hwMzAwaHB1eC5tdCAoVERFUEZJTEVTKTogcmVtb3ZlZCBleGVjLm8uCisKKwlWYXggdWx0cml4IG5hdGl2ZSBzdXBwb3J0LgorCisJKiBubS12YXguaDogbmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogYWRkZWQgbm0tdmF4LmguCisJKiBjb25maWcvdmF4dWx0Lm1oIChYREVQRklMRVMpOiBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gZm9yay1jaGlsZC5vCisJICBjb3JlZGVwLm8gY29yZWxvdy5vIHJlbW92ZWQuCisJICAoTkFUX0ZJTEUsIE5BVERFUEZJTEVTKTogbmV3IG1hY3Jvcy4KKwkqIHhtLXZheC5oOiB1cGRhdGVkIGNvcHlyaWdodC4KKwkgIChSRUdJU1RFUl9VX0FERFIpOiByZW1vdmVkLgorCisJQXBvbGxvIG5hdGl2ZSBzdXBwb3J0ICh1bnRlc3RlZCkuCisKKwkqIE1ha2VmaWxlLmluIChIRklMRVMpOiBhZGRlZCBubS1hcG9sbG82OFtidl0uaC4KKwkqIGE2OHYtbmF0LmMsIG5tLWFwb2xsbzY4W2J2XS5oOiBuZXcgZmlsZXMuCisJKiB4bS1hcG9sbG82OFtidl0uaCAoRkVUQ0hfSU5GRVJJT1JfUkVHSVNURVJTKTogcmVtb3ZlZC4KKwkqIHhtLWFwb2xsbzY4Yi5oIChQVFJBQ0VfSU5fV1JPTkdfUExBQ0UpOiByZW1vdmVkLgorCSogYTY4di14ZGVwLmM6IHJlbW92ZWQuCisJKiBjb25maWcvYXBvbGxvNjhbYnZdLm1oIChYREVQRklMRVMpOiByZW1vdmVkIGluZnB0cmFjZS5vCisJICBpbmZ0YXJnLm8gZm9yay1jaGlsZC5vIGE2OHYteGRlcC5vLgorCSAgKE5BVF9GSUxFLCBOQVRERVBGSUxFUyk6IG5ldyBtYWNyb3MuCisKKwkqIGRlZnMuaDogaW5jbHVkZSBubS5oLgorCSogY29yZWRlcC5jLCBpbmZwdHJhY2UuYywgcHJvY2ZzLmMsIHJzNjAwMC1uYXQuYywgc3BhcmMtbmF0LmMsCisJICBzcGFyYy10ZGVwLmMsIDogZG8gbm90IGluY2x1ZGUgbm0uaC4KKwkqIGRvYy9nZGJpbnQudGV4aW5mbzogbm0uaCBub3cgaW5jbHVkZWQgaW4gZGVmcy5oLgorCitGcmkgT2N0IDIzIDA0OjQ3OjE3IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIDQuNy4xIHBvc3QgcmVsZWFzZSEKKworCSogY29uZmlnL2hwcGFocHV4Lm1oIChOQVRERVBGSUxFUyk6ICBBZGQgaHBwYWgtbmF0Lm8uCisKK0ZyaSBPY3QgMjMgMDA6NDg6MDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIGdkYi00LjcgcmVsZWFzZS4KKwkqIFJFQURNRTogIFVwZGF0ZSBmb3IgZ2RiLTQuNy4KKworVGh1IE9jdCAyMiAxMToyNDoxOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBzcGFyYy10ZGVwLmM6ICBpbmNsdWRlIG5tLmggKGZvciBub3cpIHNvIHRoYXQgd2UgZ2V0IFVTRV9QUk9DX0ZTCisJd2hlbiBuZWNlc3NhcnkuCisKKwkqIGFsbGRlcHMubWFrLCBkZXBlbmQ6ICBVcGRhdGUuCisKK1RodSBPY3QgMjIgMDM6MTQ6MzYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIHBhcnRpYWwtc3RhYi5oICgnZicsICdGJyk6ICBEb24ndCByZWZlcmVuY2UgcHN0LT50ZXh0bG93IGlmIHBzdAorCWlzIG51bGwuCisJKiB0bS1zdW40c29sMi5oIChQUk9MT0dVRV9GSVJTVExJTkVfT1ZFUkxBUCk6ICBSZW1vdmUgLS0gaXQgCisJY2F1c2VzIHByb2JsZW1zIGluIHNldHRpbmcgYnJlYWtwb2ludCBpbiB0aGUgcmlnaHQgcGxhY2UgaW4KKwlmdW5jdGlvbnMgd2l0aCBgZmxvYXQnIGFyZ3Mgd2hpY2ggYXJlIHBhc3NlZCBhcyBkb3VibGVzLgorCSogeG0tdmF4YnNkLmggKE1FTV9GTlNfREVDTEFSRUQpOiAgQXZvaWQgZXJyb25lb3VzIHJlZGVjbCdzLgorCSogY29uZmlnL3JzNjAwMC5taCAoTkFUREVQRklMRVMpOiAgQWRkIGNvcmVsb3cuby4KKworVGh1IE9jdCAyMiAwMTowMToyNCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogIEFkZCBubS1pMzg2c2NvLmguCisJKiBkd2FyZnJlYWQuYzogIGluY2x1ZGUgPHN5cy90eXBlcy5oPiBmb3IgU0NPLgorCSogaW5mcHRyYWNlLmM6ICBEb24ndCBpbmNsdWRlIHB0cmFjZS5oIHVuZGVyIFNDTy4KKwkqIGNvbmZpZy9pMzg2c2NvLm1oOiAgVXNlIC1EX1BPU0lYX1NPVVJDRSBpbnN0ZWFkIG9mIC1wb3NpeCBmb3IKKwlnY2MuCisJKiBjb25maWcvaTM4NnYubXQ6ICBBZGQgZXhlYy5vIHRvIFRERVBGSUxFUy4KKworV2VkIE9jdCAyMSAxOTowODoyMCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBpMzg2di1uYXQuYzogIFJlbW92ZSBzcGFjZSBmcm9tIGZyb250IG9mICNlbmRpZi4KKwkqIGlyaXg0LW5hdC5jOiAgUmVtb3ZlIGV4dGVybnMgb2YgcmVnaXN0ZXJzW10sIGluY2x1ZGUgaW5mZXJpb3IuaAorCWluc3RlYWQuCisJKiBtaXBzLW5hdC5jOiAgRXhwbGljaXRseSBpbml0aWFsaXplIHplcm9idWYgdG8gMCEKKwkqIG1pcHMtdGRlcC5jIChpbml0X2V4dHJhX2ZyYW1lX2luZm8pOiAgVW5kbyBKb2huJ3MgbGFzdCBjaGFuZ2UuCisJQWx3YXlzIHNldHVwIGZjaS0+ZnJhbWUsIGV2ZW4gaWYgaXQncyBub24temVyby4gIFRvbyBtYW55IHBsYWNlcworCWRlcGVuZCB1cG9uIHRoaXMgYmVoYXZpb3IgKGFuZCBJIGhhdmUgdG8gZ2V0IGEgcmVsZWFzZSBvdXQgdGhlCisJZG9vcikhCisJKiBtaXBzcmVhZC5jIChwYXJzZV9wYXJ0aWFsX3N5bWJvbHMsIHBzeW10YWJfdG9fc3ltdGFiXzEpOiAgU2V0CisJcHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24gaWYgd2UgZmluZCB0aGUgZW1iZWRkZWQgc3RhYnMgbWFya2VyLgorCVRoaXMgZml4ZXMgc2V2ZXJhbCBidWdzIHdpdGggZmluZGluZyB0aGUgbG9jYXRpb24gb2Ygc2hvcnQgb3IgY2hhcgorCWZ1bmN0aW9uIHBhcmFtZXRlcnMgcGFzc2VkIG9uIHRoZSBzdGFjay4KKworV2VkIE9jdCAyMSAxNzo0NjowNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwlOYXRpdmUgc3VwcG9ydCBmb3Igc3VuNHNvbDIuCisKKwkqIHhtLXN5c3Y0LmggKFVTRV9QUk9DX0ZTLCBBVFRBQ0hfREVUQUNIKTogcmVtb3ZlZCB0byBubS1zeXN2NC5oLgorCSogbm0tc3lzdjQuaDogbmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogYWRkZWQgbm0tc3lzdjQuaC4KKwkqIGNvbmZpZy9zdW40c29sMi5taCAoWERFUEZJTEVTKTogcmVtb3ZlZCBwcm9jZnMubyBmb3JrLWNoaWxkLm8uCisJICAoTkFUX0ZJTEUsIE5BVERFUEZJTEVTKTogbmV3IG1hY3Jvcy4KKwkqIGNvbmZpZy9zdW40c29sMi5tdCAoVERFUEZJTEVTKTogcmVtb3ZlZCBleGVjLm8gYW5kIHNvbGliLm8uCisKK1dlZCBPY3QgMjEgMDM6NTE6MDEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGNvcmVkZXAuYzogIEluY2x1ZGUgIm5tLmgiIHRvIGdldCBSRUdJU1RFUl9VX0FERFIuCisJKiBkb2MvZ2RiaW50LnRleGluZm86ICBJbXByb3ZlIFJFR0lTVEVSX1VfQUREUiBhbmQgVVNFX1BST0NfRlMgZG9jLgorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICBUaWNrIHRvIDQuNi45LgorCitUdWUgT2N0IDIwIDIzOjI3OjU2IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBtaXBzcmVhZC5jIChVTlNBRkVfREFUQV9BRERSKTogIFJlbW92ZSBNSVBTLWhvc3Qtc3BlY2lmaWMKKwlkZWZpbml0aW9uLCByZXBsYWNlIHdpdGggcG9ydGFibGUgb25lLgorCSogcmVtb3RlLW5pbmR5LmM6ICBMaW50LgorCShuaW5keV93YWl0KTogIFJldHVybiB0eXBlIGlzIGludCwgcmVzdWx0IGlzIGluZmVyaW9yX3BpZC4KKwkqIHN5bW1pc2MuYyAoZHVtcF9wc3ltdGFiKTogIE9ubHkgcHJpbnQgc2VjdGlvbl9vZmZzZXRzIGlmIHNldC4KKwkoaW5pdGlhbGl6ZV9zeW1taXNjKTogIFJlbW92ZSBlbXB0eSBmdW5jdGlvbi4KKwkqIHRtLXNwYy1ub3VuLmgsIHRtLXN1bjRvczQuaCwgdG0tc3VuNHNvbDIuaCAoU1RBQ0tfRU5EX0FERFJFU1MpOgorCVJlbW92ZSBvYnNvbGV0ZSwgbWlzc3BlbGxlZCBtYWNyby4KKwkqIGRvYy9nZGJpbnQudGV4aW5mbzogIERvY3VtZW50IG9ic29sZXRlIFNUQUNLX0VORF9BRERSLgorCShhbGwgQG5vZGUgY29tbWFuZHMpOiAgVXNlIG5ldyBmb3JtIHRvIGF2b2lkIG5pdHBpY2tpbmcgZXJyb3JzLgorCSogZG9jL2dkYmludC50ZXhpbmZvOiAgRG9jdW1lbnQgaG9zdC9uYXRpdmUvdGFyZ2V0IHNwbGl0LgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK1dlZCBPY3QgMjEgMDA6MTQ6MzQgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogbWlwcy1uYXQuYyAoemVyb2J1Zik6ICBHZXQgcmlkIG9mIGNvbnN0IHRvIGF2b2lkIGdjYyB3YXJuaW5ncy4KKworCSogeG0tbWlwcy5oIChvZmZzZXRvZik6ICBEb24ndCBkZWZpbmUgdGhpcyBpZiBfX1NURENfXy4KKworVHVlIE9jdCAyMCAyMTozMjoxOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwl1bWF4IG5hdGl2ZSBzdXBwb3J0ICh1bnRlc3RlZCkuCisKKwkqIGNvbmZpZy91bWF4Lm1oIChYREVQRklMRVMpOiByZW1vdmVkIGluZnB0cmFjZS5vIGluZnRhcmcubworCSAgZm9yay1jaGlsZC5vLgorCSAgKE5BVF9GSUxFLCBOQVRERVBGSUxFUyk6IG5ldyBtYWNyb3MuCisJKiBjb25maWcvdW1heC5tdCAoVERFUEZJTEVTKTogcmVtb3ZlZCBleGVjLm8uCisJKiB4bS11bWF4LmggKFVfUkVHU19PRkZTRVQsIEFUVEFDSF9ERVRBQ0gsIFJFR0lTVEVSX1VfQUREUik6CisJICByZW1vdmVkIHRvIG5tLXVtYXguaC4KKwkqIG5tLXVtYXguaDogbmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogYWRkZWQgbm0tdW1heC5oLgorCisJaHBwYSBuYXRpdmUgc3VwcG9ydCAodW50ZXN0ZWQpLgorCisJKiBjb25maWcvaHBwYWhwdXgubWgsIGNvbmZpZy9ocHBhYnNkLm1oIChYREVQRklMRVMpOiBub3cgZW1wdHkuCisJICAoTkFUX0ZJTEUsIE5BVERFUEZJTEVTKTogbmV3IG1hY3Jvcy4KKwkqIGNvbmZpZy9ocHBhYnNkLm10IChUREVQRklMRVMpOiByZW1vdmVkIGV4ZWMubyBhbmQgaHBwYWItY29yZS5vLgorCSogY29uZmlnL2hwcGFocHV4Lm10IChUREVQRklMRVMpOiByZW1vdmVkIGV4ZWMuby4KKwkqIHhtLWhwcGFbYmhdLmggKFJFR0lTVEVSX1VfQUREUiwgVV9SRUdTX09GRlNFVCk6IHJlbW92ZWQuCisJKiBubS1ocHBhW2JoXS5oLCBocHBhW2JoXS1uYXQuYzogbmV3IGZpbGVzLgorCSogaHBwYVtiaF0teGRlcC5jOiByZW1vdmVkLgorCSogaHBwYVtiaF1oLXRkZXAuYzogZG8gbm90IGluY2x1ZGUgcHRyYWNlLmguCisJKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogYWRkZWQgbm0taHBwYVtiaF0uaC4KKworCSogZG9jL2dkYmludC50ZXhpbmZvOiBhZGQgUFVTSF9EVU1NWV9GUkFNRSwgUE9QX0ZSQU1FLgorCitUdWUgT2N0IDIwIDAwOjAxOjQ2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIG1pcHMtbmF0LmM6ICBTdHJhaWdodGVuIG91dCBpbmNsdWRlIGZpbGVzLiAgV29yayBhcm91bmQKKwljb25mbGljdGluZyBkZWZzIG9mIEpCX3h4eCBzeW1zIGluIDxzZXRqbXAuaD4gYW5kIDxtYWNoaW5lL3BjYi5oPgorCWZvciBVbHRyaXgtNC4yLgorCitNb24gT2N0IDE5IDE1OjA5OjU3IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIG1pcHMtbmF0LmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzLCByZWdpc3Rlcl9hZGRyKTogIENvcHkgZnJvbQorCWNvcmVkZXAuYywgYnV0IHplcm8gb3V0IEZQX1JFR05VTSAmIFpFUk9fUkVHTlVNIHNvIHRoYXQgc3RhY2sKKwliYWNrdHJhY2VzIGZyb20gY29yZSBmaWxlcyB3b3JrLgorCSogY29uZmlnL2RlY3N0YXRpb24ubWgsIGNvbmZpZy9pcml4My5taDogIFJlbW92ZSBjb3JlZGVwLm8uCisJRnVuY3Rpb25zIGFyZSBub3cgZGVmaW5lZCBpbiBtaXBzLW5hdC5jLgorCisJKiB0bS1pcml4My5oOiAgUHV0IE1JUFNfRUZJX1NZTUJPTF9OQU1FIGluIGhlcmUgdG9vLgorCisJKiByZW1vdGUtaG1zLmM6ICBEaXNhYmxlIGFsbCB1c2VzIG9mIHNlcmlhbF9uZXh0YmF1ZHJhdGUgYW5kCisJc2VyaWFsX2RlZmF1bHRfbmFtZSgpLgorCisJKiByZW1vdGUtaG1zLmMsIHNlci1nbzMyLmMsIHNlcmlhbC5oOiAgQ2hhbmdlIGZyb20KKwlzZXJpYWxfdGltZWRyZWFkY2hhcigpIHRvIG5ldyBzZXJpYWxfcmVhZGNoYXIoKS4KKworCSogTWFrZWZpbGUuaW4gKEhGSUxFUyk6ICBGaXh1cCBsaXN0IG9mIG5tLSouaCBmaWxlcy4gIEFkZCBtaXNzaW5nIG9uZXMuCisKK01vbiBPY3QgMTkgMTI6NDU6MjMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIGMtZXhwLnk6ICBNb3ZlZCBoYW5kbGluZyBvZiAnY29uc3QnIGFuZCAndm9sYXRpbGUnIGZyb20KKwk8dHlwZT4gdG8gPHR5cGViYXNlPi4gIFRoaXMgcmVtb3ZlcyAyIGNvbmZsaWN0cy4KKworU3VuIE9jdCAxOCAwMDozNjozMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50X3JlX3NldF9vbmUpOiAgRG9uJ3QgZGVsZXRlIHdhdGNocG9pbnRzCisJZnJvbSBicmVha3BvaW50IHRhYmxlIHdoZW4gcmVzZXRpbmcgYnJlYWtwb2ludHMuCisKK1NhdCBPY3QgMTcgMDA6NTk6MjMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwlOYXRpdmUgc3VwcG9ydCBjbGVhbnVwIGFuZCBjb3JlZmlsZSBmaXhlcyBmb3IgaTM4NiBTVlI0IHN5c3RlbXMuCisKKwkqIGkzODYtdGRlcC5jIChzdXBwbHlfZ3JlZ3NldCwgZmlsbF9ncmVnc2V0LCBzdXBwbHlfZnByZWdzZXQsCisJICBmaWxsX2ZwcmVnc2V0KTogTW92ZWQgdG8gaTM4NnY0LW5hdC5jCisJKiBpMzg2djQtbmF0LmMsIG5tLWkzODZ2NC5oLCA6ICBOZXcgZmlsZXMuCisJKiBpMzg2c29sMi5taCwgaTM4NnY0Lm1oLCBuY3IzMDAwLm1oIChOQVRfRklMRSk6ICBVc2Ugbm0taTM4NnY0LmguCisJKiBpMzg2c29sMi5taCwgaTM4NnY0Lm1oLCBuY3IzMDAwLm1oIChOQVRERVBGSUxFUyk6ICBBZGQgY29yZWxvdy5vLAorCSAgY2hhbmdlIGkzODZ2LW5hdC5vIHRvIGkzODZ2NC1uYXQuby4KKworRnJpIE9jdCAxNiAxMzowNjowOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwlNaXNjZWxsYW5lb3VzIDM4NiBjb25maWdzIHVwZGF0ZWQuCisKKwkqIGNvbmZpZy9pMzg2YW91dC5tdCAoVERFUEZJTEVTKTogcmVtb3ZlZCBleGVjLm8uCisJKiBjb25maWcvaTM4NnNvbDIubWgsIGNvbmZpZy9uY3IzMDAwLm1oLCBjb25maWcvaTM4NnY0Lm1oCisJICAoWERFUEZJTEVTKTogcmVtb3ZlZCBwcm9jZnMubyBmb3JrLWNoaWxkLm8gaTM4Ni14ZGVwLm8uCisJICAoTkFUX0ZJTEUsIE5BVERFUEZJTEVTKTogbmV3IG1hY3Jvcy4KKwkqIGNvbmZpZy9pMzg2YW91dC5tdCwgY29uZmlnL2kzODZzb2wyLm10LCBjb25maWcvbmNyMzAwMC5tdCwKKwkgIGNvbmZpZy9pMzg2djQubXQgKFRERVBGSUxFUyk6IHJlbW92ZWQgZXhlYy5vLgorCSogY29uZmlnL2kzODZ2MzIubWggKFhERVBGSUxFUyk6IHJlbW92ZWQgaW5mcHRyYWNlLm8gaW5mdGFyZy5vCisJICBmb3JrLWNoaWxkLm8gY29yZWRlcC5vIGNvcmVsb3cubyBpMzg2LXhkZXAubyBpMzg3LXRkZXAuby4KKwkgIChOQVRfRklMRSwgTkFUREVQRklMRVMpOiBuZXcgbWFjcm9zLgorCSogY29uZmlnL2kzODZzY28ubWggKFhERVBGSUxFUyk6IHJlbW92ZWQgaW5mcHRyYWNlLm8gaW5mdGFyZy5vCisJICBmb3JrLWNoaWxkLm8gY29yZWRlcC5vIGNvcmVsb3cubyBpMzg2LXhkZXAuby4KKwkgIChOQVRfRklMRSwgTkFUREVQRklMRVMpOiBuZXcgbWFjcm9zLgorCisJTmF0aXZlIHN1cHBvcnQgY2xlYW51cCBmb3IgaTM4NmJzZCAodW50ZXN0ZWQpLgorCisJKiBjb25maWcvaTM4NmJzZC5tdCAoTkFUREVQRklMRVMpOiBleGVjLm8gcmVtb3ZlZC4KKwkqIGNvbmZpZy9pMzg2YnNkLm1oIChOQVRERVBGSUxFUyk6IGFkZGVkIGV4ZWMubworCSogdG0taTM4NmJzZC5oIChGTE9BVF9JTkZPKTogcmVtb3ZlZC4KKwkqIG5tLWkzODZic2QuaCAoRkxPQVRfSU5GTyk6IGFkZGVkLgorCisJTmF0aXZlIHN1cHBvcnQgZm9yIGkzODZ2ICh1bnRlc3RlZCkuCisKKwkqIGNvbmZpZy9pMzg2di5taCAoWERFUEZJTEVTKTogcmVtb3ZlZCBpbmZwdHJhY2UubyBpbmZ0YXJnLm8KKwkgIGZvcmstY2hpbGQubyBjb3JlZGVwLm8gY29yZWxvdy5vIGkzODYteGRlcC5vIGkzODctdGRlcC5vLgorCSAgKE5BVF9GSUxFLCBOQVRERVBGSUxFUyk6IG5ldyBtYWNyb3MuCisJKiBjb25maWcvaTM4NnYubXQgKFRERVBGSUxFUyk6IHJlbW92ZWQgZXhlYy5vLCBhZGRlZCBpMzg3LXRkZXAuby4KKwkqIGkzODYteGRlcC5jOiByZW1vdmVkLgorCSogTWFrZWZpbGUuaW4gKEhGSUxFUyk6IGFkZGVkIG5tLWkzODZ2LmgKKwkqIGkzODZ2LW5hdC5jLCBubS1pMzg2di5oOiBuZXcgZmlsZS4KKwkqIHhtLWkzODZ2Lmg6IChSRUdJU1RFUl9VX0FERFIsIGkzODZfcmVnaXN0ZXJfdV9hZGRyKTogcmVtb3ZlZCB0bworCSAgbm0taTM4NnYuaC4KKwkqIHRtLWkzODZ2LmggKEZMT0FUX0lORk8pOiByZW1vdmVkLgorCisJTmF0aXZlIHN1cHBvcnQgZm9yIGxpbnV4ICh1bnRlc3RlZCkuCisKKwkqIGNvbmZpZy9saW51eC5taCAoWERFUEZJTEVTKTogcmVtb3ZlZCBpbmZwdHJhY2UubyBpbmZ0YXJnLm8KKwkgIGZvcmstY2hpbGQubyBjb3JlZGVwLm8gY29yZWxvdy5vIGkzODctdGRlcC5vIGkzODYteGRlcC5vLgorCSAgKE5BVF9GSUxFLCBOQVRERVBGSUxFUyk6IG5ldyBtYWNyb3MuCisJKiBjb25maWcvbGludXgubXQgKFRERVBGSUxFUyk6IHJlbW92ZWQgZXhlYy5vLCBhZGRlZCBpMzg3LXRkZXAuby4KKwkqIE1ha2VmaWxlLmluIChIRklMRVMpOiBhZGRlZCBubS1saW51eC5oLgorCSogbm0tbGludXguaDogbmV3IGZpbGUuCisJKiB4bS1saW51eC5oOiB1cGRhdGVkIGNvcHlyaWdodC4gIGNsZWFuZWQgdXAgZm9ybWF0dGluZy4KKwkgIChBVFRBQ0hfREVUQUNILCBVX1JFR1NfT0ZGU0VUKTogcmVtb3ZlZCB0byBubS1saW51eC5oLgorCisJTmF0aXZlIHN1cHBvcnQgZm9yIHN1bjM4NiAodW50ZXN0ZWQpLgorCisJKiBjb25maWcvc3VuMzg2Lm1oIChYREVQRklMRVMpOiByZW1vdmVkIGluZnB0cmFjZS5vIGluZnRhcmcubworCSAgZm9yay1jaGlsZC5vIHN1bjM4Ni14ZGVwLm8uCisJICAoTkFUX0ZJTEUsIE5BVERFUEZJTEVTKTogbmV3IG1hY3Jvcy4KKwkqIGNvbmZpZy9zdW4zODYubXQgKFRERVBGSUxFUyk6IHJlbW92ZWQgZXhlYy5vLgorCSogTWFrZWZpbGUuaW4gKEhGSUxFUyk6IGFkZGVkIG5tLXN1bjM4Ni5oLgorCSogc3VuMzg2LW5hdC5jLCBubS1zdW4zODYuaDogbmV3IGZpbGUuCisJKiBzdW4zODYteGRlcC5jOiByZW1vdmVkLgorCSogeG0tc3VuMzg2Lmg6IHVwZGF0ZWQgY29tbWVudCBhbmQgY29weXJpZ2h0LgorCSAgKEFUVEFDSF9ERVRBQ0gsIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUyk6IHJlbW92ZWQgdG8KKwkgIG5tLXN1bjM4Ni5oLgorCisJTmF0aXZlIHN1cHBvcnQgZm9yIGkzODZtYWNoICh1bnRlc3RlZCkuCisKKwkqIGNvbmZpZy9pMzg2bWFjaC5taCAoWERFUEZJTEVTKTogcmVtb3ZlZCBpbmZwdHJhY2UubyBpbmZ0YXJnLm8KKwkgIGZvcmstY2hpbGQubyBtYWNoMzg2LXhkZXAuby4KKwkgIChOQVRfRklMRSwgTkFUREVQRklMRVMpOiBuZXcgbWFjcm9zLgkgIAorCSogTWFrZWZpbGUuaW4gKEhGSUxFUyk6IGFkZGVkIG5tLWkzODZtYWNoLmguCisJKiBubS1pMzg2bWFjaC5oLCBpMzg2bWFjaC1uYXQuYzogbmV3IGZpbGVzLgorCSogbWFjaDM4Ni14ZGVwLmM6IHJlbW92ZWQuCisJKiB4bS1pMzg2bWFjaC5oOiB1cGRhdGVkIGNvcHlyaWdodC4KKwkgIChBVFRBQ0hfREVUQUNILCBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMpOiByZW1vdmVkIHRvCisJICBubS1pMzg2bWFjaC5oLgorCisJTmF0aXZlIHNlcGFyYXRpb24gZm9yIGdvMzIgKHVudGVzdGVkKS4KKworCSogY29uZmlnL2dvMzIubWggKE5BVF9GSUxFLCBOQVRERVBGSUxFUyk6IG5ldyBtYWNyb3MuCisJKiBnbzMyLW5hdC5jOiBuZXcgZmlsZS4KKwkqIGdvMzIteGRlcC5jIChjYWxsX3B0cmFjZSwgY2hpbGRfcmVzdW1lLAorCSAgZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzLCBzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMsCisJICBjaGlsZF94ZmVyX21lbW9yeSwgZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiByZW1vdmVkIHRvIGdvMzItbmF0LmMuCisKKwlOYXRpdmUgc3VwcG9ydCBmb3IgbTg4ayAodW50ZXN0ZWQpLgorCisJKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogYWRkZWQgbm0tbTg4ay5oCisJKiB4bS1kZWx0YTg4LmgsIHhtLW04OGsuaCAoUkVHSVNURVJfVV9BRERSLAorCSAgRkVUQ0hfSU5GRVJJT1JfUkVHSVNURVJTKTogcmVtb3ZlZC4KKwkqIGNvbmZpZy9tODhrLm1oLCBjb25maWcvZGVsdGE4OC5taCAoWERFUEZJTEVTKTogaW5mcHRyYWNlLm8KKwkgIGluZnRhcmcubyBmb3JrLWNoaWxkLm8gbTg4ay14ZGVwLm8gcmVtb3ZlZCB0byBOQVRERVBGSUxFUy4KKwkgIChOQVRfRklMRSwgTkFUREVQRklMRVMpOiBuZXcgbWFjcm9zLgorCSogY29uZmlnL204OGsubXQsIGNvbmZpZy9kZWx0YTg4Lm10IChUREVQRklMRVMpOiByZW1vdmVkIGV4ZWMuby4KKwkqIG04OGstbmF0LmMsIG5tLW04OGsuaCwgbm0tZGVsdGE4OC5oOiBuZXcgZmlsZXMuby4KKwkqIG04OGsteGRlcC5jOiByZW1vdmVkLgorCitGcmkgT2N0IDE2IDA0OjE2OjMwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBpMzg2Yi1uYXQuYzogIENvbW1lbnQgY2hhbmdlcy4KKwkqIG5tLWkzODZic2QuaCwgeG0taTM4NmJzZC5oOiAgU3BsaXQgbmF0aXZlIGRlcGVuZGVudCBwaWVjZXMgb3V0CisJaW50byBuZXcgbm0tZmlsZS4KKwkqIGNvbmZpZy9pMzg2YnNkLm1oIChOQVRfRklMRSk6ICBQb2ludCB0byBuZXcgbm0tZmlsZS4KKworRnJpIE9jdCAxNiAwMzozNDowMSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCUF2b2lkIGxvbmdqbXAoKS1jYXRjaGluZyBjb21waWxhdGlvbiBlcnJvcnMgaW4gY3Jvc3MtcG9ydHMuCisKKwkqIGRvYy9nZGJpbnQudGV4aW5mbzogIFVwZGF0ZSBHRVRfTE9OR0pNUF9UQVJHRVQsIExfU0VUIGRvYy4KKwkqIGlyaXg0LW5hdC5jLCBtaXBzLW5hdC5jIChKQl9FTEVNRU5UX1NJWkUsIGdldF9sb25nam1wX3RhcmdldCk6CisJTW92ZSBmcm9tIG1pcHMtdGRlcC5jIGFuZCB0bS17aXJpeDMsbWlwc30uaC4KKwkqIG1pcHMtbmF0LmM6ICBSZW1vdmUgYSBidW5jaCBvZiBjb2RlIHRoYXQgd2FzIGlmZGVmJ2Qgb3V0IG9mCisJbmF0aXZlIE1JUFMgcG9ydHMuCisJKiBubS1pcml4My5oLCBubS1taXBzLmggKEdFVF9MT05HSk1QX1RBUkdFVCk6ICBNb3ZlIGZyb20gdG0taXJpeDMuaAorCWFuZCB0bS1taXBzLmguCisKKwkqIHVsdHJhMy1uYXQuYyAocmVnaXN0ZXJfYWRkcik6ICBNb3ZlIGZyb20gdWx0cmEzLXhkZXAuYy4KKwkoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiAgRml4IGJmZF9zZWVrIGFyZ3VtZW50cy4JCisKK0ZyaSBPY3QgMTYgMDM6MDI6MjggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwlNYWtlIGNvcmUgZmlsZXMgd29yayBhZ2FpbiAoYWRkIGJhY2sgdGhlIGBjb3JlJyB0YXJnZXQpLgorCisJKiBjb25maWcvZGVjc3RhdGlvbi5taCwgbmV3cy5taCwgc3VuMm9zMy5taCwgc3VuMm9zNC5taAorCShOQVRERVBGSUxFUyk6ICBBZGQgY29yZWxvdy5vLgorCSogY29uZmlnL2RlbHRhODgubXQsIG04OGsubXQgKFRERVBGSUxFUyk6ICBSZW1vdmUgY29yZWRlcC5vLCBpdCdzCisJbmF0aXZlIGRlcGVuZGVudC4KKworCSogY29uZmlnLzNiMS5taCwgYmlnbWlwcy5taCwgaHAzMDBic2QubWgsIGhwcGFic2QubWgsIGhwcGFocHV4Lm1oLAorCWkzODZzY28ubWgsIGkzODZ2Lm1oLCBpMzg2djMyLm1oLCBpcml4My5taCwgaXNpLm1oLCBsaW51eC5taCwKKwlsaXR0bGVtaXBzLm1oLCBtZXJsaW4ubWgsIG5ld3MxMDAwLm1oLCBwbi5taCwgcnRic2QubWgsIHRhaG9lLm1oLAorCXZheGJzZC5taCwgdmF4dWx0Lm1oIChYREVQRklMRVMpOiBBZGQgY29yZWxvdy5vIHdoZW5ldmVyIGNvcmVkZXAubworCWFwcGVhcnMuICBGSVhNRSwgdGhlc2Ugc2hvdWxkIGJlIG1vdmVkIHRvIE5BVERFUEZJTEVTIGZvciBuYXRpdmUKKwl1c2Ugb25seS4KKworVGh1IE9jdCAxNSAyMTo1Mzo1MyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwlVbHRyYTMgaG9zdC90YXJnZXQvbmF0aXZlIHNwbGl0LiAgKHVudGVzdGVkKS4KKworCSogdWx0cmEzLXhkZXAuYzogdXBkYXRlZCBjb3B5cmlnaHQuICBEbyBub3QgaW5jbHVkZSBzeXMvcHRyYWNlLmguCisJICAoZmV0Y2hfcmVnaXN0ZXIsIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycywKKwkgIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycywgZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiByZW1vdmVkIHRvCisJICB1bHRyYTMtbmF0LmMuCisJKiB4bS11bHRyYTMuaCAoRkVUQ0hfSU5GRVJJT1JfUkVHSVNURVJTLCBVX1JFR1NfT0ZGU0VUKTogcmVtb3ZlZAorCSAgdG8gbm0tdWx0cmEzLmguCisJKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogYWRkZWQgbm0tdWx0cmEzLmguCisJKiBubS11bHRyYTMuaCwgdWx0cmEzLW5hdC5jOiBuZXcgZmlsZXMgZm9yIG5hdGl2ZSBzdXBwb3J0LgorCSogY29uZmlnL3VsdHJhMy5taCAoWERFUEZJTEVTKTogcmVtb3ZlZCBpbmZwdHJhY2UubyBpbmZ0YXJnLm8KKwkgIGZvcmstY2hpbGQuby4KKwkgIChOQVRfRklMRSwgTkFUREVQRklMRVMpOiBuZXcgbWFjcm9zIGZvciBuYXRpdmUgc3VwcG9ydC4KKwkqIGNvbmZpZy91bHRyYTMubXQgKFRERVBGSUxFUyk6IGV4ZWMubyByZW1vdmVkLgorCisJKiB4bS12YXh1bHQuaDogYWRkIE1FTV9GTlNfREVDTEFSRUQuCisKK1RodSBPY3QgMTUgMDI6NTk6MzAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIFJvbGwgdG8gNC42LjguCisJKE9CUyk6ICBQdXQgdmVyc2lvbi5vIGZpcnN0LCBzbyBNYWtlZmlsZSByZWJ1aWxkIGhhcHBlbnMgZWFybHkuCisJCisJKiBjb21tYW5kLmg6ICBQdWJsaWNpemUgcHJvdG90eXBlIGZvciBub3RfanVzdF9oZWxwX2NsYXNzX2NvbW1hbmQuCisJKiBjb21tYW5kLmM6ICBSZW1vdmUgcHJvdG8uCisJKiBtYWludC5jOiAgTWFyayAibXQiIGFzIGFuIGFiYnJldiwgdG8gYXZvaWQgZHVwbGljYXRlZCBoZWxwCisJb3V0cHV0LiAgTW92ZSAibWFpbnQgaW5mbyIgZnJvbSBjbGFzcyBpbmZvIHRvIGNsYXNzIG1haW50ZW5hbmNlLAorCWFuZCBpbXByb3ZlIHRleHQuCisJKiBpbmZydW4uYzogIE1vdmUgInN0b3AiIHRvIGNsYXNzX29ic2N1cmUsIGFuZCBnaXZlIGl0IGEKKwlmdW5jdGlvbiBzbyBpdCB3aWxsIG5vdCBiZSBzZWVuIGFzIGEgZ2xvYmFsIGhlbHAgdG9waWMuICBGSVhNRSwKKwlpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gc2V0IHRoZXNlIGF0dHJpYnV0ZXMgaW5kZXBlbmRlbnRseS4KKworCSogY29yZS5jIChjb3JlX2NvbW1hbmQpOiAgTWFrZSBuaWNlciBlcnJvciBtZXNzYWdlIGZvciBubyBjb3JlIHN1cHBvcnQuCisKKwlMaW50IGFyb3VuZCBmaWxlX3B0cidzIChiZmQncyBvZmZfdCdzKSBhbmQgYmZkX3NlZWsuCisKKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiKTogIFVzZSBMX1NFVCBhcyBiZmRfc2VlayBhcmcuCisJKGVsZnN0YWJfYnVpbGRfcHN5bXRhYnMpOiAgc3RhYm9mZnNldCBhbmQgc3RhYnN0cm9mZnNldCBhcmdzIGFyZQorCWZpbGVfcHRyJ3MuCisJKiBkd2FyZnJlYWQuYyAoc3RydWN0IGR3ZmluZm8pOiAgQ29udmVydCBkYmZvZmYsIGxuZm9mZiB0byBmaWxlX3B0ci4KKwkoc2Nhbl9jb21waWxhdGlvbl91bml0cyk6ICBQdW50IHVudXNlZCBmaWxlbmFtZSBhcmcuICBkYmZvZmYsCisJbG5vZmZzZXQsIGFuZCBjdXJsbm9mZnNldCBhcmUgZmlsZV9wdHIncyBub3cuCisJKGR3YXJmX2J1aWxkX3BzeW10YWJzKTogIERyb3AgZGVzYyBhbmQgZmlsZW5hbWUgYXJnczsgdXNlCisJb2JqZmlsZS4gIGRiZm9mZiBhbmQgbG5vZmZzZXQgYXJlIGZpbGVfcHRyJ3Mgbm93LgorCShyZWFkX29maWxlX3N5bXRhYik6ICBmb2Zmc2V0IGlzIG5vdyBmaWxlX3B0ci4gIFVzZSBMX1NFVCBpbiBiZmRfc2Vlay4KKwkqIGVsZnJlYWQuYyAoc3RydWN0IGVsZmluZm8pOiAgZGJvZmZzZXQgYW5kIGxub2Zmc2V0IGFyZSBmaWxlX3B0cidzLgorCShlbGZfc3ltZmlsZV9yZWFkKTogIFNraXAgZGVzYyBhbmQgZmlsZW5hbWUgYXJncyB0bworCWR3YXJmX2J1aWxkX3BzeW10YWJzLiAgUGFzcyBmaWxlX3B0cidzIHRvIGVsZnN0YWJfYnVpbGRfcHN5bXRhYnMuCisJKiBnZGItc3RhYnMuaDogIFVzZSBmaWxlX3B0ciByYXRoZXIgdGhhbiBvZmZfdC4KKwkqIG1pcHNyZWFkLmMgKGZpeHVwX3N5bXRhYik6IGZfcHRyIGlzIGEgZmlsZV9wdHIuICBSZS1lbmFibGUKKwljb21waWxlLXRpbWUgZGVidWcgY2hlY2sgdGhhdCBzb21lb25lIHR1cm5lZCBvZmYgYXMgInVudXNlZCIuCisJKHJlYWRfdGhlX21pcHNfc3ltdGFiKTogIHN0X2ZpbHB0ciBpcyBhIGZpbGVfcHRyLiAgRml4IGJmZF9zZWVrIGNhbGwuCisJKiBzeW1maWxlLmg6ICBVcGRhdGUgZHdhcmZfYnVpbGRfcHN5bXRhYnMgYW5kCisJZWxmc3RhYl9idWlsZF9wc3ltdGFicyBwcm90b3R5cGVzLgorCSogeGNvZmZyZWFkLmMgKGluaXRfc3RyaW5ndGFiLCBpbml0X2xpbmVubywgeGNvZmZfc3ltZmlsZV9yZWFkKToKKwlVc2UgZmlsZV9wdHIgb2Zmc2V0cy4gIGJmZF9zZWVrcyB1c2UgTF9TRVQuCisKK1RodSBPY3QgMTUgMDE6Mjc6MzIgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogbWlwcy10ZGVwLmMsIG1pcHNyZWFkLmMsIHRtLW1pcHMuaDogIEdldCByaWQgb2YgIi5nZGJpbmZvLiIKKwlzeW1ib2wuICAjZGVmaW5lIE1JUFNfRUZJX1NZTUJPTF9OQU1FIGluc3RlYWQuICBVc2UgZGlmZmVyZW50CisJdmFsdWUgc28gdGhhdCBkZW1hbmdsZXIgd29uJ3QgYmUgaW52b2tlZC4gIFRoaXMgZ3JlYXRseSBzcGVlZHMgdXAKKwlzdGVwcGluZy4KKwkqIG1pcHMtdGRlcC5jIChtaXBzX3BvcF9mcmFtZSk6ICBSZXdyaXRlIGhhbmRsaW5nIG9mCisJbGlua2VkX3Byb2NfaW5mbyBzbyB0aGF0IGl0IHByb3Blcmx5IGRlYWxsb2NhdGVzIHRoZSBhcHByb3ByaWF0ZQorCWl0ZW0gYWZ0ZXIgaXQgaXMgZG9uZSB3aXRoIGl0IGluc3RlYWQgb2YgYmVmb3JlLgorCSogRG9uJ3QgcGFzcyBib2d1cyBmcmFtZSBwb2ludGVyIHRvIGNyZWF0ZV9uZXdfZnJhbWUoKS4gIEp1c3QKKwlsZWF2ZSBpdCBhcyB6ZXJvIHNvIHRoYXQgbG93ZXIgbGV2ZWwgY29kZSB3aWxsIGZpZ3VyZSBvdXQgdGhlCisJY29ycmVjdCB2YWx1ZS4KKworV2VkIE9jdCAxNCAxODo1NjoyOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwlTb255IE5ld3MgbmF0aXZlIHN1cHBvcnQuCisKKwkqIE1ha2VmaWxlLmluIChIRklMRVMpOiBhZGRlZCBubS1uZXdzLmguCisJKiBubS1uZXdzLmg6IG5ldyBmaWxlLgorCSogY29uZmlnL25ld3MubWggKFhERVBGSUxFUyk6IHJlbW92ZWQgaW5mcHRyYWNlLm8gaW5mdGFyZy5vCisJICBmb3JrLWNoaWxkLm8gY29yZWRlcC5vIHRvIE5BVERFUEZJTEVTLgorCSAgKE5BVF9GSUxFLCBOQVRERVBGSUxFUyk6IG5ldyBtYWNyb3MgZm9yIG5hdGl2ZSBzdXBwb3J0LgorCSogY29uZmlnL25ld3MubXQgKFRERVBGSUxFUyk6IHJlbW92ZWQgZXhlYy5vLgorCisJKiByZW1vdGUtdnguYzogcmVtb3ZlIHJlZHVuZGFudCBpbmNsdWRlIG9mIHN5cy90aW1lLmguCisKKwkqIGluZnJ1bi5jOiBpbmNsdWRlIGN0eXBlLmguICBPdGhlcndpc2Ugc29tZSBtYWNoaW5lcyByZXN1bHQgaW4KKwkgIHVuZGVmaW5lZCBmb3IgaXNkaWdpdC4KKworVHVlIE9jdCAxMyAwMToyNzoxNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgQ29udmVydCBtNjhrIGVudHJpZXMgdG8gbTY4KiBlbnRyaWVzIHRvIGhhbmRsZQorCWFsbCB0aGUgdmFyaW91cyBtNjh4eHggaG9zdHMgYW5kIHRhcmdldHMuCisJKiBjb25maWcvbmV3czEwMDAubXQ6ICBObyBsb25nZXIgbmVlZGVkLCBzYW1lIGFzIG5ld3MubXQuCisKK0ZyaSBPY3QgIDkgMTg6NTQ6MzcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJKiBjb25maWcvc3VuM29zWzM0XS5taCAoTkFUREVQRklMRVMpOiByZW1vdmUgZHVwbGljYXRlIGluZnRhcmcuby4KKworRnJpIE9jdCAgOSAxNDoyMDowOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogIEFkZCBhbGwgbm0taXJpeDMuaCwgbm0taXJpeDQuaCwKKwlubS1zdW4yLmgsIG5tLW1pcHMuaC4KKworCSogY29uZmlnL2lyaXgzLm1oIChOQVRERVBGSUxFUyk6ICBuYXQtbWlwcy5vID0+IG1pcHMtbmF0Lm8uCisKKwkqIE1ha2VmaWxlLmluIChhbGxkZXBzLm1hayk6ICBBZGQgPSBzaWduIGFmdGVyIE5BVERFUEZJTEVTLgorCisJKiBjb25maWcvYmlnbWlwcy5taCBjb25maWcvbGl0dGxlbWlwcy5taDogIFJlbW92ZSBtaXBzLXhkZXAuby4KKworRnJpIE9jdCAgOSAwODo0MToxMSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIHhtLWhwcGFoLmg6IGlmIF9fU1REQ19fIGlzIG5vdCBkZWZpbmVkLCBkZWZpbmUKKwlIUFBBX0NPTVBJTEVSX0JVRy4KKwlzeW10YWIuYyAoZGVjb2RlX2xpbmVfMSk6IGF2b2lkIGEgYnVnIGluIHRoZSBIUDkwMDAvNzAwIG5hdGl2ZQorCWNvbXBpbGVyOyBzZWUgdGhlIGNvbW1lbnQgaW4gdGhlIGZpbGUuCisKK0ZyaSBPY3QgIDkgMDQ6NDM6NDMgMTk5MiAgSm9obiBHaWxtb3JlIChnbnVAY3lnbnVzLmNvbSkKKworCUZpcnN0IGN1dCBhdCBzdXBwb3J0IGZvciBhbGwgQlNEIHZhcmlhbnRzIG9uIDM4Ni4KKworCSogdG0taTM4NmJzZC5oLCB4bS1pMzg2YnNkLmg6ICBOZXcgY29uZmlnIGZpbGVzLgorCSogaTM4NmItbmF0LmM6ICBOZXcgbmF0aXZlIHN1cHBvcnQgZmlsZS4KKwkqIGNvbmZpZ3VyZS5pbjogIEFkZCBob3N0IGFuZCB0YXJnZXQgZm9yIGlbMzRdODYtKi1ic2QqLgorCSogY29uZmlnL2kzODZic2QubWgsIGNvbmZpZy9pMzg2YnNkLm10OiAgTmV3IGNvbmZpZyBmaWxlcy4KKworRnJpIE9jdCAgOSAwMDozMTozMyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwlTdW4yIG5hdGl2ZSBzdXBwb3J0ICh1bnRlc3RlZCkuCisKKwkqIHhtLXN1bjIuaCAoQVRUQUNIX0RFVEFDSCwgRkVUQ0hfSU5GRVJJT1JfUkVHSVNURVJTLAorCSAgUkVHSVNURVJfVV9BRERSKTogcmVtb3ZlZCB0byBubS1zdW4yLmguCisJKiBubS1zdW4yLmg6IG5ldyBmaWxlLgorCSogY29uZmlnL3N1bjJvc1szNF0ubWggKFhERVBGSUxFUyk6IGluZnB0cmFjZS5vIGluZnRhcmcubworCSAgZm9yay1jaGlsZC5vIHN1bjMteGRlcC5vIHJlbW92ZWQuCisJICAoTkFUX0ZJTEUsIE5BVERFUEZJTEVTKTogbmV3IG1hY3Jvcy4KKworCU1pcHMgbmF0aXZlIHN1cHBvcnQuICBEZWNzdGF0aW9uIGFuZCBpcmlzNCBoYXZlIGJlZW4gdGVzdGVkLgorCUlyaXMzIGhhcyBub3QuCisKKwkqIG1pcHMtdGRlcC5jIChzdXBwbHlfZ3JlZ3NldCwgZmlsbF9ncmVnc2V0LCBzdXBwbHlfZnByZWdzZXQsCisJICBmaWxsX2ZwcmVnc2V0KTogcmVtb3ZlZCB0byBpcml4NC1uYXQuYworCSogbWlwcy14ZGVwLmM6IHJlbW92ZWQuCisJKiBpcml4NC1uYXQuYywgbWlwcy1uYXQuYywgbm0taXJpeDMuaCwgbm0taXJpeDQuaCwgbm0tbWlwcy5oOiBuZXcKKwkgIGZpbGVzLgorCSogcHJvY2ZzLmM6IGluY2x1ZGUgbm0uaC4KKwkqIHhtLWlyaXgzLmggKFVfUkVHU19PRkZTRVQsIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUyk6IHJlbW92ZWQuCisJKiB4bS1pcml4NC5oOiBidW1wIGNvcHlyaWdodC4KKwkoVV9SRUdTX09GRlNFVCwgRkVUQ0hfSU5GRVJJT1JfUkVHSVNURVJTLCBVU0VfUFJPQ19GUywKKwlQUk9DX05BTUVfRk1UKTogcmVtb3ZlZC4KKwkqIHhtLW1pcHMuaCAoRkVUQ0hfSU5GRVJJT1JfUkVHSVNURVJTKTogcmVtb3ZlZC4KKwkqIGNvbmZpZy9pcml4NC5taCAoWERFUEZJTEVTKTogcmVtb3ZlZCBwcm9jZnMubyBmb3JrLWNoaWxkLm8uCisJKE5BVF9GSUxFLCBOQVRERVBGSUxFUyk6IG5ldyBtYWNyb3MgZm9yIG5hdGl2ZSBzdXBwb3J0LgorCShDQyk6IHN1cHBseSBkZWZhdWx0IGNvbXBpbGVyIHN3aXRjaGVzLgorCSogY29uZmlnL2lyaXgzLm1oIChYREVQRklMRVMpOiByZW1vdmVkIGluZnB0cmFjZS5vIGluZnRhcmcubworCSAgZm9yay1jaGlsZC5vIGNvcmVkZXAuby4KKwkoTkFUX0ZJTEUsIE5BVERFUEZJTEVTKTogbmV3IG1hY3JvcyBmb3IgbmF0aXZlIHN1cHBvcnQuICBOb3RlIHRoYXQKKwlpcml4MyBpcyB1bnRlc3RlZC4KKwkqIGNvbmZpZy9kZWNzdGF0aW9uLm1oIChYREVQRklMRVMpOiByZW1vdmVkIGluZnB0cmFjZS5vIGluZnRhcmcubworCSAgZm9yay1jaGlsZC5vIG1pcHMteGRlcC5vIGNvcmVkZXAuby4KKwkgIChOQVRfRklMRSwgTkFUREVQRklMRVMpOiBuZXcgbWFjcm9zIGZvciBuYXRpdmUgc3VwcG9ydC4KKworVGh1IE9jdCAgOCAyMzo1MDo1MSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9yczYwMDAubWggKFhERVBGSUxFUyk6IHJlbW92ZWQgZm9yay1jaGlsZC5vLgorCShOQVRERVBGSUxFUyk6IGFkZGVkIGZvcmstY2hpbGQubworCSogY29uZmlnL3N1bjNvczMubWggKFhERVBGSUxFUyk6IHJlbW92ZWQgZm9yay1jaGlsZC5vLgorCShOQVRERVBGSUxFUyk6IGFkZGVkIGZvcmstY2hpbGQubworCSogY29uZmlnL3N1bjNvczQubWggKFhERVBGSUxFUyk6IHJlbW92ZWQgZm9yay1jaGlsZC5vLgorCShOQVRERVBGSUxFUyk6IGFkZGVkIGZvcmstY2hpbGQubworCitUaHUgT2N0ICA4IDIzOjE5OjI1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBpbmZjbWQuYyAocGF0aF9pbmZvKTogIEF2b2lkIDI1MC1jaGFyIGxpbWl0IG9uIHByaW50Zl9maWx0ZXJlZCwKKwlieSB1c2luZyBwdXRzX2ZpbHRlcmVkIGluc3RlYWQuCisKK0ZyaSBPY3QgIDkgMDA6Mjg6MjUgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiByZW1vdGUtbmluZHkuYyAobmluZHlfbG9hZCk6IFJlcGxhY2VtZW50IHZlcnNpb24gZnJvbSBTdGV2ZQorCUNoYW1iZXJsYWluLCBkb2Vzbid0IHJlcXVpcmUgZm9ya2luZyB0byBydW4gInN0cmlwIiBvciAic3giLgorCitUaHUgT2N0ICA4IDE4OjI3OjM1IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChIRklMRVMpOiAgQWRkIG5tLSouaCBmaWxlcy4KKworVGh1IE9jdCAgOCAxNjoyNzo0NSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9zdW40b3M0Lm1oIChYREVQRklMRVMpOiBmb3JrLWNoaWxkLm8gcmVtb3ZlZC4KKwkoTkFUREVQRklMRVMpOiBhZGRlZCBmb3JrLWNoaWxkLm8uCisKKwkqIGRvYy9nZGJpbnQudGV4aW5mbzogZG9jdW1lbnQgYSBmZXcgbW9yZSBtYWNyb3MsIGNyZWF0ZSBuZXcKKwkgIHNlY3Rpb24gZm9yIG5hdGl2ZSBtYWNyb3MuCisKK1RodSBPY3QgIDggMTM6NTI6NDYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gYWxsZGVwcy5tYWsgZGVwZW5kOiAgUmlwIG91dCAyOWsvdWRpIHBlbmRpbmcKKwlyZXNvbHV0aW9uIG9mIGNvcHlyaWdodCBpc3N1ZXMuCisKK1dlZCBPY3QgIDcgMjA6MDg6NTMgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKHNldHVwLXRvLWRpc3QpOiAgUmVtb3ZlIC1ub3JlY3Vyc2lvbiBzbyB0aGF0IGRvYworCXN1YmRpciBnZXRzIGNvbmZpZ3VyZWQuCisKK1dlZCBPY3QgIDcgMTI6MjQ6MDEgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChuaW5keS5vKTogRGVmaW5lICJTVFJJUCIgYXMgcGF0aG5hbWUgb2Ygc3RyaXAKKwlwcm9ncmFtLgorCSogbmluZHktc2hhcmUvbmluZHkuYyAoY29mZnN0cmlwKTogVXNlIHRoYXQgcGF0aG5hbWUsIGluc3RlYWQgb2YKKwlzZWFyY2hpbmcgZm9yIGEgImJmZF9zdHJpcCIgcHJvZ3JhbS4gIEFsc28sIGZpeGVkIHVwIGFyZ3VtZW50cworCXBhc3NlZCB0byB0aGF0IHByb2dyYW0uCisKKwkqIHRtLW5pbmR5OTYwLmggKEFERElUSU9OQUxfT1BUSU9OUyk6IFVzZSAiLXNlciIgcmF0aGVyIHRoYW4gIi1yIiwKKwl3aGljaCBpcyBub3cgdXNlZCBmb3Igc29tZXRoaW5nIGVsc2UuICBSZXdyaXRlIGRlc2NyaXB0aW9uIG9mCisJYXNzb2NpYXRlZCBwYXJhbWV0ZXJzIHRvIG1hdGNoIGhvdyBnZGIgZG9lcyBpdCBub3cuCisJKEFERElUSU9OQUxfT1BUSU9OX0hFTFApOiBGaXggbWVzc2FnZSBhY2NvcmRpbmdseS4KKworCSogbTY4ay1waW5zbi5jIChwcmludF9pbnNuX2FyZyk6IEhhbmRsZSBuZXcgImAiIG9wZXJhbmQgdHlwZS4KKworVHVlIE9jdCAgNiAxNDo0NzoxMSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwlOT1RJQ0VfU0lHTkFMX0hBTkRMSU5HX0NIQU5HRSBtYWNybyBhZGRlZCB0byB0aGUgdGFyZ2V0IHZlY3RvciBhcworCXRvX25vdGljZV9zaWduYWxzLgorCisJKiBpbmZlcmlvci5oIChwcm9jX3NpZ25hbF9oYW5kbGluZ19jaGFuZ2UpOiBwcm90b3R5cGUgcmVtb3ZlZC4KKwkqIGluZnJ1bi5jIChOT1RJQ0VfU0lHTkFMX0hBTkRMSU5HX0NIQU5HRSk6IGRlZmF1bHQgcmVtb3ZlZC4KKwkoaGFuZGxlX2NvbW1hbmQpOiBub3cgY2FsbHMgdGFyZ2V0X25vdGljZV9zaWduYWxzLgorCSogcHJvY2ZzLmMgKHByb2Nfc2lnbmFsX2hhbmRsaW5nX2NoYW5nZSk6IHJlbmFtZWQgdG8KKwkgIHByb2Nmc19ub3RpY2Vfc2lnbmFscy4gIE5vdyBzdGF0aWMuICBBZGQgcHJvdG90eXBlLiAgQWxsIGNhbGxlcnMKKwkgIGNoYW5nZWQuCisJKiB0YXJnZXQuaCAoc3RydWN0IHRhcmdldF9vcHMpOiBuZXcgZmllbGQsIHRvX25vdGljZV9zaWduYWxzLgorCSh0YXJnZXRfbm90aWNlX3NpZ25hbHMpOiBuZXcgbWFjcm8gdG8gY292ZXIgbmV3IGZpZWxkLgorCSogdGFyZ2V0LmMgKGNsZWFudXBfdGFyZ2V0KTogZGVmYXVsdCB0b19ub3RpY2Vfc2lnbmFscyB0byBpZ25vcmUuCisJKiBjb3JlbG93LmMgKGNvcmVfb3BzKSwKKwlleGVjLmMgKGV4ZWNfb3BzKSwKKwlpbmZ0YXJnLmMgKGNoaWxkX29wcyksCisJcHJvY2ZzLmMgKHByb2Nmc19vcHMpLAorCXJlbW90ZS1hZGFwdC5jIChhZGFwdC1vcHMpLAorCXJlbW90ZS1lYi5jIChlYl9vcHMpLAorCXJlbW90ZS1lczE4MDAuYyAoZXMxODAwX29wcywgZXMxODAwX2NoaWxkX29wcyksCisJcmVtb3RlLWhtcy5jIChobXNfb3BzKSwKKwlyZW1vdGUtbW0uYyAobW1fb3BzKSwKKwlyZW1vdGUtbmluZHkuYyAobmluZHlfb3BzKSwKKwlyZW1vdGUtc3QyMDAwLmMgKHN0MjAwMF9vcHMpLAorCXJlbW90ZS11ZGkuYyAodWRpX29wcyksCisJcmVtb3RlLXZ4LmMgKHZ4X29wcywgdnhfcnVuX29wcyksCisJcmVtb3RlLmMgKHJlbW90ZV9vcHMpLAorCXRhcmdldC5jIChkdW1teV90YXJnZXQpLAorCXhjb2ZmZXhlYy5jIChleGVjX29wcyk6IGFkZGVkIHN0YXRpYyBpbml0aWFsaXplciBmb3IKKwl0b19ub3RpY2Vfc2lnbmFscy4KKwkqIHhtLWlyaXg0LmgsIHhtLXN5c3Y0LmggKE5PVElDRV9TSUdOQUxfSEFORExJTkdfQ0hBTkdFKTogcmVtb3ZlZC4KKworVHVlIE9jdCAgNiAxMjoxMzowOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogbWFpbi5jIChkZWZpbmVfY29tbWFuZCk6ICBBZGQgZm9yZ290dGVuIGluaXRpYWxpemVyLgorCitUdWUgT2N0ICA2IDAyOjIzOjE3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBsYW5ndWFnZS5jLCBsYW5ndWFnZS5oOiAgTW92ZSBzYXZlZF9sYW5ndWFnZSBvdXQgdG8gZ2xvYmFsCisJZXhwZWN0ZWRfbGFuZ3VhZ2UuICBTZXQgZXhwZWN0ZWRfbGFuZ3VhZ2Ugd2hlbiB1c2VyIGV4cGVjdGF0aW9uCisJY2hhbmdlcy4KKwkqIGxhbmd1YWdlLmMgKGxhbmd1YWdlX2luZm8pOiAgRG9uJ3QgcHJpbnQgdHlwZS9yYW5nZSBjaGVja2luZyBndWIuCisJKiBtYWluLmMgKG1haW4pOiAgU2V0IGV4cGVjdGVkIGxhbmd1YWdlLgorCShleGVjdXRlX2NvbW1hbmQpOiAgQ2hlY2sgYWdhaW5zdCBleHBlY3RlZCBsYW5ndWFnZS4KKwkqIHN5bWZpbGUuYyAoc2V0X2luaXRpYWxfbGFuZ3VhZ2UpOiAgU2V0IGV4cGVjdGVkIGxhbmd1YWdlLgorCisJKiBjb25maWd1cmUuaW4sIGNvbmZpZy9pMzg2c29sMi57bWgsbXR9OiAgUHJlbGltaW5hcnkgU29sYXJpcy14ODYgY29uZi4KKworRnJpIFNlcCAgNCAwMDozNDozMCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwlBIGJ1bmNoIG9mIGNoYW5nZXMgbW9zdGx5IHRvIGltcHJvdmUgZGVidWdnaW5nIG9mIEMrKyBwcm9ncmFtcy4KKwlTcGVjaWZpY2FsbHksIHRoZSBjYWxsaW5nIG9mIGluZmVyaW9ycyBtZXRob2RzIGlzIGltcHJvdmVkLgorCisJKiB2YWx1ZS5oOiAgTmV3IG1hY3JvcyBNRVRIT0RfUFRSX0lTX1ZJUlRVQUwsCisJTUVUSE9EX1BUUl9GUk9NX1ZPRkZTRVQsIE1FVEhPRF9QVFJfVE9fVk9GRlNFVCB0byBwYXJ0aWFsbHkKKwloaWRlIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIHBvaW50ZXItdG8tbWV0aG9kIG9iamVjdHMuCisJSG93IHRvIHRlbGwgaWYgdGhlIHBvaW50ZXIgcG9pbnRzIHRvIGEgdmlydHVhbCBtZXRob2QgaXMKKwlzdGlsbCB2ZXJ5IGRlcGVuZGVudCBvbiB0aGUgcGFydGljdWxhciBjb21waWxlciwgYnV0IHRoaXMKKwlzaG91bGQgbWFrZSBpdCBlYXNpZXIgdG8gZmluZCB0aGUgcGxhY2VzIHRvIGNoYW5nZS4KKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwIFtjYXNlIE9QX0ZVTkNBTExdKSwgdmFscHJpbnQuYworCSh2YWxfcHJpbnQgW2Nhc2UgVFlQRV9DT0RFX1BUUl0pOiAgVXNlIHRoZSBuZXcgTUVUSE9EX1BUUl8qCisJbWFjcm9zLCBpbnN0ZWFkIG9mIGEgaGFyZC13aXJlZC1pbiBjb2RlIHRoYXQgaW5jb3JyZWN0bHkKKwlhc3N1bWVkIGEgbm8tbG9uZ2VydXNlZCByZXByZXNlbnRhdGlvbiBvZiBwb2ludGVyLXRvLW1ldGhvZAorCXZhbHVlcy4gIEFuZCBvdGhlcndpc2UgZml4IHRoZSByZWxldmFudCBiaXQtcm90dGVkIGNvZGUuCisKKwkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfYmFzZSBbY2FzZSBUWVBFX0NPREVfU1RSVUNUXSk6CisJSWYgdGhlcmUgYXJlIGJvdGggZmllbGRzIGFuZCBtZXRob2RzLCBwdXQgYSBzcGFjZSBiZXR3ZWVuLgorCisJKiBzdGFic3JlYWQuYyAocmVhZF9zdHJ1Y3RfdHlwZSk6ICBGaXggYnVnIGluIGhhbmRsaW5nIG9mCisJR05VIEMrKyBhbm9ueW1vdXMgdHlwZSAoaW5kaWNhdGVkIGJ5IENQTFVTX01BUktFUiBmb2xsb3dlZAorCWJ5ICdfJykuICAoSXQgdXNlZCB0byBwcmVtYXR1cmVseSBleGl0IHRoZSBsb29wIHJlYWRpbmcgaW4KKwl0aGUgZmllbGRzLCBzbyBpdCB3b3VsZCB0aGluayBpdCBzaG91bGQgc3RhcnQgcmVhZGluZworCW1ldGhvZHMgd2hpbGUgc3RpbGwgaW4gdGhlIGZpZWxkcy4gIFRoaXMgY291bGQgY3Jhc2ggZ2RiCisJZ2l2ZW4gYSBnY2MgdGhhdCBjYW4gZW1pdCBuZXN0ZWQgdHlwZSBpbmZvcm1hdGlvbi4pCisKKwkqIHZhbG9wcy5jIChzZWFyY2hfc3RydWN0X21ldGhvZCk6ICBQYXNzICd0aGlzJyB2YWx1ZSBieQorCXJlZmVyZW5jZSBpbnN0ZWFkIG9mIGJ5IHZhbHVlLiAgVGhpcyBwcm92aWRlcyBhIG1vcmUKKwljb25zaXN0ZW50IGludGVyZmFjZSB0aHJvdWdoIGEgcmVjdXJzaXZlIHNlYXJjaCB3aGVyZSB0aGUKKwkiYm90dG9tIiBmdW5jdGlvbnMgbWF5IG5lZWQgdG8gYWRqdXN0IG9mZnNldHMgKGR1ZSB0byBtdWx0aXBsZQorCWluaGVyaXRhbmNlKS4KKwkqIHZhbG9wcy5jLCB2YWx1ZS5oLCB2YWx1ZXMuYzogIFBhc3MgZXh0cmEgcGFyYW1ldGVycyB0bworCXZhbHVlX2ZuX2ZpZWxkIGFuZCB2YWx1ZV92aXJ0dWFsX2ZuX2ZpZWxkIHNvIHdlIGNhbgorCWNvcnJlY3RseSBhZGp1c3Qgb2Zmc2V0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZS4KKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwIFtjYXNlIE9QX0ZVTkNBTExdKTogIFNpbXBsaWZ5CisJdmlydHVhbCBmdW5jdGlvbiBjYWxscyBieSB1c2luZyB2YWx1ZV92aXJ0dWFsX2ZuX2ZpZWxkKCkuCisJKiB2YWx1ZXMuYzogTmV3IGZ1bmN0aW9uIGJhc2VjbGFzc19vZmZzZXQsIGRlcml2ZWQgZnJvbQorCWJhc2VjbGFzc19hZGRyICh3aGljaCBwZXJoYXBzIGNhbiBiZSBtYWRlIG9ic29sZXRlPykuCisJSXQgcmV0dXJucyBhbiBvZmZzZXQgcmF0aGVyIHRoYW4gYW4gYWRkcmVzcy4gIFRoaXMgaXMgYQorCWNsZWFuZXIgaW50ZXJmYWNlIHNpbmNlIGl0IGRvZXNuJ3QgbWVzcyBhcm91bmQgYWxsb2NhdGluZworCW5ldyB2YWx1ZXMuCisJKiB2YWxvcHMuYyAoc2VhcmNoX3N0cnVjdF9tZXRob2QpOiAgVXNlIGJhc2VjbGFzc19vZmZzZXQKKwlyYXRoZXIgdGhhbiBiYXNlY2xhc3NfYWRkci4KKworTW9uIE9jdCAgNSAxNjowMjowNCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIFJlLWluc3RhbGwgMjlLL1VESSBzdHVmZi4KKwkqIHJlbW90ZS11ZGkuYyAodWRpX3Jlc3VtZSk6ICBDbGVhbiB1cC4KKwkqICh1ZGlfd2FpdCk6ICBSZXdyaXRlLCBsZWF2ZSBvdXQgYnVncy4KKwkqIEFkZCBkZWJ1Z2dpbmcgY29kZSB0byBwcmludCBvdXQgYWxsIHJlZ2lzdGVyIGZldGNoZXMgYW5kIHN0b3Jlcy4KKwkqIFN0cmFpZ2h0ZW4gb3V0IHRhcmdldF9vcHMuCisJKiB0bS0yOWsuaCAoRFVNTVlfRlJBTUVfUlNJWkUpOiAgUGFkIG91dCB0byBkb3VibGV3b3JkLgorCitNb24gT2N0ICA1IDA5OjQ2OjQ0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXVkaS5jICh1ZGlfY3JlYXRlX2luZmVyaW9yKTogcnVuIHdpdGggbm8gYXJndW1lbnRzIHNob3VsZAorCW5vdCBwYXNzIHRoZSBwcm9ncmFtIG5hbWUgYXMgYW4gYXJndW1lbnQsIHNpbmNlIHRoZSBVREkgY29kZQorCWFscmVhZHkgaGFuZGxlcyB0aGF0LgorCSh1ZGlfbG9hZCk6IGdldCB0aGUgc3ltYm9scyBmcm9tIHByb2dfbmFtZSwgbm90IGFyZ19zdHJpbmcgKHRoZQorCWxvYWQgY29tbWFuZCBzaG91bGQgcmVhbGx5IHVzZSBhcmdfc3RyaW5nIGFzIHRoZSBwcm9ncmFtIG5hbWUsIG5vdAorCXByb2dfbmFtZSwgYnV0IGF0IGxlYXN0IHRoZSBydW4gY29tbWFuZCB3b3JrcyBub3cpLgorCisJKiBtdW5jaDogSFA5MDAwLzMwMCBubSBwdXRzIGFuIGV4dHJhIHNwYWNlIGJldHdlZW4gVCBhbmQgc3ltYm9sCisJbmFtZS4KKworCSogY29uZmlnL2lyaXg0Lm1oOiBhZGRlZCAtbHN1biB0byBYTV9DTElCUyB0byBnZXQgUlBDIGZ1bmN0aW9ucworCW5lZWRlZCBmb3Igdnh3b3JrcyB0YXJnZXRzLgorCitGcmkgT2N0ICAyIDIyOjA0OjQyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBhbTI5ay10ZGVwLmMgKF9pbml0aWFsaXplXzI5ayk6ICBNYWtlIGl0IHBvc3NpYmxlIGZvciB0aGUKKwl1c2VyIHRvIHNldCBhbmQgcXVlcnkgdGhlIGFkZHJlc3Mgd2hlcmUgZnVuY3Rpb24gY2FsbHMgaW50byB0aGUKKwlpbmZlcmlvciB3cml0ZSBhIHNtYWxsIHNjcmF0Y2ggcm91dGluZS4gIGBzZXQgY2FsbF9zY3JhdGNoX2FkZHJlc3MnCisJKiBpbmZlcmlvci5oIChQQ19JTl9DQUxMX0RVTU1ZKTogIEZpeCBmZW5jZXBvc3QgZXJyb3IuCisJKiByZW1vdGUuYyAocmVtb3RlX3ByZXBhcmVfdG9fc3RvcmUpOiBPbmx5IGZldGNoIHJlZ3MgaWYgdGhleSBhcmUKKwlub3QgYWxyZWFkeSBjYWNoZWQgdmFsaWRseS4KKworVGh1IE9jdCAgMSAxNDozNjo0MiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwlSczYwMDAgbmF0aXZlIHN1cHBvcnQuCisKKwkqIGluZnB0cmFjZS5jOiByZW1vdmUgI2lmZGVmIFVTRyBmcm9tIGFyb3VuZCBpbmNsdWRlIHB0cmFjZS5oLgorCSAgbWFjaGluZXMgd2l0aG91dCB0aGlzIGhlYWRlciBzaG91bGQgbm90IGJlIGNvbXBpbGluZyB0aGlzIGZpbGUuCisJKiBubS1yczYwMDAuaCwgcnM2MDAwLW5hdC5jOiBuZXcgZmlsZXMgZm9yIG5hdGl2ZSBzdXBwb3J0LgorCSogcnM2MDAwLXRkZXAuYzogZG8gbm90IGluY2x1ZGUgc3lzL3B0cmFjZS5oIG9yIHN5cy9yZWcuaC4KKwkqIHJzNjAwMC14ZGVwLmM6IHJlbW92ZWQuICBhbGwgY29kZSBub3cgaW4gcnM2MDAwLW5hdC5jLgorCSogeG0tcnM2MDAwLmg6IGRvIG5vdCBpbmNsdWRlIHB0cmFjZS5oLgorCSAgKEFUVEFDSF9ERVRBQ0gsIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUyk6IG1vdmVkIHRvIG5tLXJzNjAwMC5oLgorCSogY29uZmlnL3JzNjAwMC5taCAoWERFUEZJTEVTKTogcmVtb3ZlZCByczYwMDAteGRlcC5vLgorCSAgaW5mcHRyYWNlLm8gYW5kIGluZnRhcmcubyBtb3ZlIHRvIE5BVERFUEZJRVMuCisJICAoTkFUX0ZJTEUsIE5BVERFUEZJTEVTKTogbmV3IG1hY3JvIGZvciBuYXRpdmUgc3VwcG9ydC4KKworCVN1bjMgbmF0aXZlIHN1cHBvcnQuCisKKwkqIGNvbmZpZy9zdW4zb3MzLm1oLCBjb25maWcvc3VuM29zNC5taCAoTkFUX0ZJTEUsIE5BVERFUEZJTEVTKToKKwkgIG5ldyBtYWNyb3MgZm9yIG5hdGl2ZSBzdXBwb3J0LgorCSAgKFhERVBGSUxFUyk6IG1vdmVkIGluZnB0cmFjZS5vIGFuZCBpbmZ0YXJnLm8gdG8gTkFUREVQRklMRVMsCisJICByZW1vdmVkIHN1bjMteGRlcC5vLgorCSogeG0tc3VuMy5oIChBVFRBQ0hfREVUQUNILCBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMpOiBtb3ZlZCB0bworCSAgbm0tc3VuMy5oLgorCSogc3VuMy14ZGVwLmM6IHJlbW92ZWQuICBBbGwgY29kZSBpcyBub3cgaW4gc3VuMy1uYXQuYy4KKwkqIHN1bjMtbmF0LmMsIG5tLXN1bjMuaDogbmV3IGZpbGVzIGZvciBuYXRpdmUgc3VwcG9ydC4KKworVGh1IE9jdCAgMSAxMDozMDo1NCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZHdhcmZyZWFkLmMgKGRic2l6ZSk6ICBOZXcgdmFyaWFibGUgdG8gaG9sZCBzaXplIG9mIGR3YXJmIGluZm8uCisJKiBkd2FyZnJlYWQuYyAoZHdhcmZfYnVpbGRfcHN5bXRhYnMpOiAgUmVuYW1lIGRic2l6ZSBwYXJhbWV0ZXIgdG8gCisJZGJmc2l6ZSBhbmQgdXNlIGl0IHRvIGluaXRpYWxpemUgbmV3IGxvY2FsIGZpbGUgc2NvcGUgZGJzaXplLgorCSogZHdhcmZyZWFkLmMgKHJlYWRfb2ZpbGVfc3ltdGFiKTogIEluaXRpYWxpemUgZGJzaXplIGFuZCB1c2UgaXQuCisJKiBkd2FyZnJlYWQuYyAoYmFzaWNkaWVpbmZvKTogIFVzZSBkYnNpemUgdG8gY2hlY2sgZm9yIG92ZXJzaXplCisJRElFcyBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IGNoZWNrIGZvciB1bmRlcnNpemUgRElFcy4gIFRoaXMgaGVscHMKKwl0byBncmFjZWZ1bGx5IGRldGVjdCBhbmQgcmVqZWN0IGNvcnJ1cHRlZCBESUUgaW5mb3JtYXRpb24uCisKK1RodSBPY3QgIDEgMDE6NTc6NTYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwlBZGQgYGNvbW1hbmQgaG9va3MnIGFuZCBhIGhvb2sgZm9yIGluZmVyaW9yIHByb2dyYW0gc3RvcHBpbmcuCisKKwkqIGNvbW1hbmQuaCAoc3RydWN0IGNtZF9saXN0X2VsZW1lbnQpOiAgUmVtb3ZlIHVudXNlZCBgYXV4JworCWZpZWxkLiAgQWRkIG5ldyBgaG9vaycsIGBob29rZWUnLCBhbmQgYGNtZF9wb2ludGVyJyBmaWVsZHMuCisJKiBjb21tYW5kLmMgKGFkZF9jbWQpOiAgSW5pdGlhbGl6ZSBuZXcgZmllbGRzLCBlbGltIG9sZC4KKwkoYWRkX2FsaWFzX2NtZCk6ICBDbG9uZSBuZXcgZmllbGRzLgorCShkZWxldGVfY21kKTogIFVuLWhvb2sgaG9va2VlIGlmIHdlJ3JlIGRlbGV0aW5nIGhvb2suCisJKGhlbHBfY21kKTogIFRlbGwgdXNlciB0aGUgY29tbWFuZCBpcyBob29rZWQsIGlmIGl0IGlzLgorCShsb29rdXBfY21kXzEpOiAgQWJicmV2aWF0aW9ucyByZXR1cm4gdGhlIG9yaWdpbmFsIGNvbW1hbmQKKwlpbnN0ZWFkIG9mIHRoZW1zZWx2ZXMsIHNvIHRoYXQgaG9va3Mgb24gdGhlIG9yaWdpbmFsIGNtZCB3aWxsIGJlCisJcnVuLgorCSogZGVmcy5oIChlbnVtIGNvbW1hbmRfY2xhc3MpOiAgQWRkIGNsYXNzX3BzZXVkbyBhbmQgY29tbWVudHMuCisJKiBnZGJjbWQuaCAoZXhlY3V0ZV91c2VyX2NvbW1hbmQpOiAgQWRkIHByb3RvdHlwZS4KKwkqIGluZnJ1bi5jIChub3JtYWxfc3RvcCk6ICBJZiB0aGUgc3RvcCBjb21tYW5kIGlzIGhvb2tlZCwKKwlydW4gdGhlIGhvb2sgd2hlbmV2ZXIgd2Ugc3RvcC4KKwkoaG9va19zdG9wX3N0dWIpOiAgU3R1YiBmb3IgY2F0Y2hfZXJyb3JzLgorCShfaW5pdGlhbGl6ZV9pbmZydW4pOiAgU2V0IHVwIHBzZXVkbyAic3RvcCIgY29tbWFuZC4KKwkqIG1haW4uYyAoZXhlY3V0ZV91c2VyX2NvbW1hbmQpOiAgQ29kZSBleHRyYWN0ZWQgZnJvbSBleGVjdXRlX2NvbW1hbmQuCisJKGV4ZWN1dGVfY29tbWFuZCk6ICBJZiBob29rZWQsIHJ1biB0aGUgaG9vayBiZWZvcmUgdGhlIGNvbW1hbmQuCisJKGRlZmluZV9jb21tYW5kKTogIElmIGRlZmluaW5nIGEgbmV3IGhvb2ssIGNoZWNrIHRoZSBjb21tYW5kIGl0CisJaXMgaG9va2luZywgYW5kIHdhcm4gaWYgbm9uZS4gIEluc3RhbGwgdGhlIGhvb2suCisJKiBzb3VyY2UuYyAoX2luaXRpYWxpemVfc291cmNlKTogICJsIiBpcyBhbiBhYmJyZXYgZm9yICJsaXN0Ii4KKwkqIGRvYy9nZGIudGV4aW5mbzogIERvY3VtZW50IGNvbW1hbmQgaG9va3MuCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIFJvbGwgdG8gNC42LjcuCisJKiBjb25maWcvc3VuNG9zNC5taDogIFJlbW92ZSBkdXAgaW5mdGFyZy5vIGZyb20gTkFUREVQRklMRVMuCisJKiBpbmZydW4uYyAoYnJlYWtwb2ludHNfaW5zZXJ0ZWQpOiAgTWFrZSBpdCBzdGF0aWMgYWdhaW4uCisJKiB0bS1zeW1tZXRyeS5oIChGTE9BVF9JTkZPKTogICNpZiAwIGl0IGZvciBjcm9zcy1wdHJhY2UgYWJ1c2UuCisKK1dlZCBTZXAgMzAgMTU6MzM6MjIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJTmF0aXZlIGZpbGUgcmVuYW1pbmcuCisKKwkqIG5hdC1zcGFyYy5jIC0+IHNwYXJjLW5hdC5jCisJKiBuYXQtc3VuNG9zNC5oIC0+IG5tLXN1bjRvczQuaAorCSogbmF0LXRyYXNoLmggLT4gbm0tdHJhc2guaAorCSogY29uZmlnL3N1bjRvczQubWg6IHRyYWNrIGZpbGUgcmVuYW1pbmcuCisJKiBjb25maWd1cmUuaW46IGxpbmsgdG8gbm0uaCByYXRoZXIgdGhhbiBuYXQuaC4KKwkqIGluZnB0cmFjZS5jOiBpbmNsdWRlIG5tLmggcmF0aGVyIHRoYW4gbmF0LmguCisKK1R1ZSBTZXAgMjkgMTQ6MzU6MDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJSG9zdC90YXJnZXQvbmF0aXZlIHNwbGl0IGZvciBzdW40LgorCisJKiBNYWtlZmlsZS5pbiAoVFNPQlMpOiByZW1vdmVkIGNvcmVsb3cuby4KKwkqIGluZnB0cmFjZS5jOiBpbmNsdWRlZCBuYXQuaC4KKwkqIG5hdC10cmFzaC5oOiB0ZW1wb3JhcnkgaGVhZGVyIGZpbGUuICBUaGlzIHNob3VsZCBiZSByZW1vdmVkIG9uY2UKKwkgIGFsbCBob3N0cyBoYXZlIHRoZSBuYXRpdmUvaG9zdC90YXJnZXQgc3BsaXQuCisJKiBjb25maWd1cmUuaW46IGFkZCBhIHN5bWxpbmsgZnJvbSBuYXQtdHJhc2guaCB0byBuYXQuaCBpZiBubworCSAgb3RoZXIgbmF0IGZpbGUgZXhpc3RzIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24uCisJKiBzcGFyYy10ZGVwLmM6IG5vIGxvbmdlciBpbmNsdWRlIHN5cy9wdHJhY2UuaC4KKwkqIHNwYXJjLXhkZXAuYzogcmVtb3ZlZC4gIGNvbnRlbnRzIGhhdmUgYmVlbiBtb3ZlZCB0byBuYXQtc3BhcmMuYy4KKwkqIHhtLXNwYXJjLmggKEFUVEFDSF9ERVRBQ0gsIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUyk6IG1vdmVkIHRvCisJICBuYXQtc3VuNG9zNC5oLgorCSogbmF0LXNwYXJjLmMsIG5hdC1zdW40b3M0Lmg6IG5ldyBmaWxlcyBmb3Igc3VuNCBuYXRpdmUgc3VwcG9ydC4KKwkqIGNvbmZpZy9zdW40b3M0Lm1oIChYREVQRklMRVMpOiBtb3ZlZCBpbmZwdHJhY2UubyBhbmQgaW5mdGFyZy5vCisJICB0byBOQVRERVBGSUxFUy4gIHJlbW92ZWQgc3BhcmMteGRlcC5vLgorCSAgKE5BVERFUEZJTEVTLCBOQVRfRklMRSk6IG5ldyBtYWNyb3MgZm9yIG5hdGl2ZSBzdXBwb3J0LgorCisJQnJlYWsgdGhlIGRpcmVjdCBjb25uZWN0aW9uIGZyb20gY29yZV9maWxlX2NvbW1hbmQgdG8gYW55CisJcGFydGljdWxhciB0eXBlIG9mIGNvcmUgZmlsZSBzdXBwb3J0LgorCisJKiB0YXJnZXQuaCAoZmluZF9jb3JlX3RhcmdldCk6IG5ldyBwcm90b3R5cGUuCisJKiB0YXJnZXQuYyAoZmluZF9jb3JlX3RhcmdldCk6IG5ldyBmdW5jdGlvbi4gIFdhbGtzIHRoZSB0YXJnZXQKKwkgIGxpc3QgbG9va2luZyBmb3IgdGhlIGNvcmUgdGFyZ2V0LgorCSogY29yZS5jIChjb3JlX2ZpbGVfY29tbWFuZCk6IHJlcGxhY2UgY2FsbHMgdG8gY29yZV9kZXRhY2ggYW5kCisJICBjb3JlX29wZW4gd2l0aCBmaW5kX2NvcmVfdGFyZ2V0IGFuZCBkaXJlY3QgY2FsbHMuCisKK1R1ZSBTZXAgMjkgMTA6MTk6MDAgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiB4bS1ocDMwMGhwdXguaDogZGVmaW5lIE1FTV9GTlNfREVDTEFSRUQ7IGluY2x1ZGUgPHN5cy9wdHJhY2UuaD4KKwlmb3IgaW5mcHRyYWNlLmMuCisJY29uZmlnL2hwMzAwaHB1eC5taDogQUxMT0NBMSB3YXMgbm90IGRlZmluZWQuCisKK01vbiBTZXAgMjggMjI6MDM6NDEgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jLCBleGVjLmMsIGxhbmd1YWdlLmMsIG1haW4uYywgcHJpbnRjbWQuYywgc3ltZmlsZS5jLAorCXRhcmdldC5jLCB2YWxwcmludC5jOiAgVXNlIHVuZmlsdGVyZWQgZm9ybXMgb2YgZi9wcmludGYsIGV0LiBhbC4KKwl1bnRpbCB3ZSBjYW4gZmlndXJlIG91dCBhIGJldHRlciB3YXkgdG8gZG8gcGFnaW5nLgorCitTYXQgU2VwIDI2IDAyOjA3OjMxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBmaW5kdmFyLmMgKHN1cHBseV9yZWdpc3Rlcik6ICBBZGQgQ0xFQU5fVVBfUkVHSVNURVJfVkFMVUUgaG9vay4KKwkqIHRtLWhwcGEuaCAoQ0xFQU5fVVBfUkVHSVNURVJfVkFMVUUpOiAgVXNlIGl0LgorCSogaHBwYS1jb3JlZGVwLmM6ICBSZW1vdmUsIG5vdyB0aGF0IHdlIHVzZSB0aGUgaG9vay4KKwkqIGNvbmZpZy9ocHBhYi5taCwgY29uZmlnL2hwcGFoLm1oOiAgVXNlIHN0YW5kYXJkIGNvcmVkZXAuby4KKwkqIGhwcGFiLXhkZXAuYywgaHBwYWgteGRlcC5jOiAgUmVtb3ZlIGN1c3RvbSBjb2RlLCB1c2UgaG9vay4KKworCSogZGJ4cmVhZC5jLCBwYXJ0aWFsLXN0YWIuaDogIFJlcGxhY2UgYWxsICNpZmRlZiBocDkwMDBzODAwJ3Mgd2l0aAorCUdEQl9UQVJHRVRfSVNfSFBQQSdzLiAgVGhpcyBpcyBhIFNFUklPVVMgS0xVREdFLiAgVGhlIGNvZGUgbmVlZHMgdG8gYWxsCisJYmUgcmlwcGVkIG91dCBhbmQgcmVpbXBsZW1lbnRlZCByaWdodCAoc2VlIGVsZnJlYWQuYykuCisJKiB0bS1ocHBhLmggKEdEQl9UQVJHRVRfSVNfSFBQQSk6ICBEZWZpbmUuCisKKwlSZW5hbWUgYWxsIEhQUEEgZmlsZXMgdG8gZml0IGludG8gdW5pcXVlIERPUyBmaWxlbmFtZXM6CisJKiAqaHBwYWJzZCogID0+ICpocHBhYioKKwkqICpocHBhaHB1eCogPT4gKmhwcGFoKgorCitTYXQgU2VwIDI2IDAwOjI1OjE1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJTWFrZSB0aGUgL3Byb2Mgc3VwcG9ydCBhIHRhcmdldC1zdHJ1Y3QgaW4gaXRzIG93biByaWdodC4KKworCSogTWFrZWZpbGUuaW46IFJlbW92ZSBpbmZ0YXJnLltjb10sIHNpbmNlIGl0IGlzIG5vdyBpbmNsdWRlZCB2aWEKKwljb25maWcvKi5taCBmaWxlcy4KKwkqIGNvbmZpZy8qLm1oOiAgQWRkIGluZnRhcmcubyBhbmQgZm9yay1jaGlsZC5vIHRvIGFsbCAqLm1oIHRoYXQKKwlyZWZlcmVuY2UgaW5mcHRyYWNlLm8uICBBZGQgZm9yay1jaGlsZC5vIHRvIGFsbCAqLm1oIHRoYXQKKwlyZWZlcmVuY2UgcHJvY2ZzLm8uCisKKwkqIGluZmVyaW9yLmggKHByb2Nfd2FpdCwgaW5mZXJpb3JfcHJvY19pbml0LCBwcm9jX3NldF9leGVjX3RyYXApOgorCU5vIGxvbmdlciBnbG9iYWwgZnVuY3Rpb25zLgorCShmb3JrX2luZmVyaW9yKTogIE5ldyBnbG9iYWwgZnVuY3Rpb24gZnJvbSBmb3JrLWNoaWxkLmMuCisJKiBpbmZ0YXJnLmMgKGNoaWxkX3dhaXQpOiAgUmVtb3ZlIFVTRV9QUk9DX0ZTIGNvbmRpdGlvbmFsLgorCShwdHJhY2VfbWUsIHB0cmFjZV9oaW0pOiAgTmV3IHN0dWIgZnVuY3Rpb25zIGZvciBmb3JrX2luZmVyaW9yKCkuCisJKGNoaWxkX2NyZWF0ZV9pbmZlcmlvcik6ICBNb3ZlZCB0byBmb3JrLWNoaWxkLmMgYXMgZm9ya19pbmZlcmlvci4KKwkoY2hpbGRfY3JlYXRlX2luZmVyaW9yKTogIE5ldyB0aW55IGZ1bmN0aW9uIHRoYXQgY2FsbHMgZm9ya19pbmZlcmlvci4KKwkqIGZvcmstY2hpbGQuYzogIE5ldyBmaWxlLCBjb250YWluaW5nIGZvcmtfaW5mZXJpb3IsIHdoaWNoIGlzCisJYnVpbHQgZnJvbSBzbGlnaHQgbW9kcyB0byBpbmZ0YXJnLmMncyBjaGlsZF9jcmVhdGVfaW5mZXJpb3IuCisKKwkqIHByb2Nmcy5jIChwcm9jZnNfb3BzKTogIEFkZCB0YXJnZXQgdmVjdG9yLgorCShhdHRhY2gpOiAgUmVuYW1lIGFzIHN0YXRpYyBkb19hdHRhY2guCisJKHByb2Nmc19jcmVhdGVfaW5mZXJpb3IpOiAgTmV3IHRpbnkgZnVuY3Rpb24gdGhhdCBjYWxscyBmb3JrX2luZmVyaW9yLgorCShjaGlsZF94ZmVyX21lbW9yeSk6ICBSZW5hbWUgdG8gc3RhdGljIHByb2Nmc194ZmVyX21lbW9yeS4KKwkoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogIFJlbmFtZSB0byBzdGF0aWMgcHJvY2ZzX3N0b3JlX3JlZ2lzdGVycy4KKwkoaW5mZXJpb3JfcHJvY19pbml0KTogIFJlbmFtZSB0byBzdGF0aWMgcHJvY2ZzX2luaXRfaW5mZXJpb3IuCisJKHByb2Nmc19hdHRhY2gsIHByb2Nmc19kZXRhY2gsIHByb2Nmc19wcmVwYXJlX3RvX3N0b3JlLAorCXByb2Nmc19maWxlc19pbmZvLCBwcm9jZnNfb3BlbiwgcHJvY2ZzX21vdXJuX2luZmVyaW9yLAorCXByb2Nmc19jYW5fcnVuKTogIFNsaWdodGx5IG1hbmdsZWQgY29waWVzIG9mIHRoZSBjb3JyZXNwb25kaW5nCisJY2hpbGRfWFhYIHJvdXRpbmVzIGZyb20gaW5mdGFyZy5jLgorCShwcm9jX3dhaXQpOiAgUmVuYW1lZCB0byBzdGF0aWMgcHJvY2ZzX3dhaXQuCisJKGNoaWxkX3Jlc3VtZSk6ICBSZW5hbWUgdG8gc3RhdGljIHByb2Nmc19yZXN1bWUuCisJKGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBSZW5hbWUgdG8gc3RhdGljIHByb2Nmc19mZXRjaF9yZWdpc3RlcnMuCisJKGluaXRpYWxpemVfcHJvY19mcyk6ICBSZW5hbWUgdG8gaW5pdGlhbGl6ZV9wcm9jZnMuICBTZXQgdXAKKwlwcm9jZnNfb3BzLCB0b28uCisKKwkqIHB1dGVudi5jOiAgaW5kZXggLT4gc3RyY2hyLgorCSogcmVnZXguYzogIEFsd2F5cyByZW5hbWUgYmNvcHkgdG8gbWVtY3B5LCBldGMuCisJRklYTUU6ICBFdmVudHVhbGx5IGRvIHRoZSByZW5hbWVzIHJhdGhlciB0aGFuIHVzZSAjZGVmaW5lJ3MuCisJKiBzcGFyYy10ZGVwLmMgKGRlZmVycmVkX3N0b3Jlcyk6ICBNb3ZlZCBmcm9tIHNwYXJjLXhkZXAuYy4KKwlGaXggYmNvcHktPm1lbWNweS4KKwkqIHNwYXJjLXhkZXAuYzogIE1vdmUgZGVmZXJyZWRfc3RvcmVzIHRvIHRhcmdldCBkZXBlbmRlbnQuCisJKiB4bS1pcml4NC5oLCB4bS1zeXN2NC5oIChDUkVBVEVfSU5GRVJJT1JfSE9PSyk6ICBObyBsb25nZXIgbmVlZGVkLgorCitGcmkgU2VwIDI1IDIxOjU5OjI3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJU3BsaXQgbm9uLXRhcmdldC1kZXBlbmRlbnQgY29kZSBvdXQgb2YgdGFyZ2V0X2F0dGFjaCByb3V0aW5lcy4KKworCSogdGFyZ2V0Lmg6ICBDb21tZW50cyBvbiB0YXJnZXRfYXR0YWNoIGFyZ3MgYW5kIHJlc3VsdHMuCisJKiBpbmZjbWQuYyAoYXR0YWNoX2NvbW1hbmQpOiBDaGVjayBmb3IgZXhpc3RpbmcgZXhlY3V0aW9uLCBjYWxsCisJdGFyZ2V0X2F0dGFjaCwgc2V0IHVwIHRlcm1pbmFsIHN0YXR1cyBhbmQgd2FpdF9mb3JfaW5mZXJpb3IsIHdhaXQKKwlmb3IgdGhlIGF0dGFjaCBzdGF0dXMsIGFuZCBkbyBub3JtYWxfc3RvcC4KKwkqIGluZnRhcmcuYyAoY2hpbGRfYXR0YWNoKTogIFJlbW92ZSB0YXJnZXQgaW5kZXBlbmRlbnQgc3R1ZmYuCisJKiByZW1vdGUtYWRhcHQuYyAoYWRhcHRfYXR0YWNoKTogIERpdHRvLgorCSogcmVtb3RlLW1tLmMgKG1tX2F0dGFjaCk6ICBEaXR0by4KKwkqIHJlbW90ZS11ZGkuYyAodWRpX2F0dGFjaCk6ICBEaXR0by4KKwkqIHJlbW90ZS12eC5jICh2eF9hdHRhY2gpOiAgRGl0dG8uCisKKwlDbGVhbnVwLgorCisJKiByZW1vdGUtaG1zLmMgKGhtc19hdHRhY2gpOiAgUmVtb3ZlIGNvbXBsZXRlbHksIGl0IHdhcyB1c2VsZXNzLgorCSogcmVtb3RlLW1tLmMsIHJlbW90ZS1obXMuYywgcmVtb3RlLXVkaS5jLCByZW1vdGUtYWRhcHQuYzogIFJlbW92ZQorCWNvbW1lbnRlZC1vdXQgc3RhcnRfcmVtb3RlIGNhbGxzLgorCSogcmVtb3RlLWhtcy5jLCByZW1vdGUtYWRhcHQuYywgcmVtb3RlLW1tLmMsIHJlbW90ZS11ZGkuYzogUmVtb3ZlCisJREVOVEVSIGFuZCBERVhJVCBtYWNyb3MgYW5kIHRoZWlyIGNhbGxzLiAgVXNlIGEgcmVhbCBkZWJ1Z2dlciAtLQorCWxpa2UgZ2RiIC0tIHRvIHNlZSB3aGF0IGZ1bmN0aW9ucyBhcmUgYmVpbmcgY2FsbGVkIHdoZW4uCisJKiB1dGlscy5jIChzdHJjbXBfaXcpOiAgTWFrZSBub25zdGF0aWMsIGZvciBsaW50LgorCitGcmkgU2VwIDI1IDE4OjQ4OjIwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBpbmZydW4uYywgaW5mdGFyZy5jLCBpbmZlcmlvci5oOiAgQ29tbWVudCBhbmQgbGludCBjbGVhbnVwcy4KKworRnJpIFNlcCAyNSAxNToxMzo0NCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiB0bS1zcGFyYy5oLCBkYnhyZWFkLmMgKHJlYWRfb2ZpbGVfc3ltdGFiKTogIEluc3RhbGwgSmltIFdpbHNvbidzCisJZml4IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBnY2MxICYgZ2NjMiBjb21waWxlZCBmaWxlcyBzbyB0aGF0IHdlCisJY2FuIGRlYnVnIGNhbGxzIHRoYXQgcGFzcyBzdHJ1Y3RzIGFzIGFyZ3MgY29ycmVjdGx5LgorCSogc3ltbWlzYy5jIChkdW1wX3N5bXRhYik6ICBJZiBibG9jayB3YXMgY29tcGlsZWQgd2l0aCBnY2MsIHNheQorCXNvLCBhbmQgd2hhdCB2ZXJzaW9uLgorCisJKiByZW1vdGUuYyAocmVtb3RlX3dhaXQpOiAgTWFrZSByZWdzIGJlIGNoYXIgdG8gYXZvaWQgcGljYXl1bmUKKwlBTlNJIGNvbXBpbGVyIHdhcm5pbmdzLgorCisJKiBlbmVyZ2l6ZS5oOiAgTW92ZSBhbGwgZXh0ZXJuYWwgc3RydWN0IGRlY2xzIHRvIGluc2lkZSBvZgorCV9fU1REQ19fLCBhZGQgcHJvdG90eXBlIGZvciBlbmVyZ2l6ZV9zaGVsbF93YWl0KCkuCisJKiBlbmVyZ2l6ZS5jIChnZXRwdHkpOiAgQ2xlYW4gdXAsIG1ha2UgdXMgcmVhbGx5IGdldCBhIGNvbnRyb2xsaW5nCisJdGVybWluYWwuCisJKiAoZW5lcmdpemVfaW5pdGlhbGl6ZSk6ICBEaXNhYmxlIFNJR0lPIHByaW9yIHRvIHNldHRpbmcgdXAgZm9yCisJSS9PIGludGVycnVwdHMuICBNb3ZlIHNldHNpZCgpLCBldC4gYWwuIHRvIGdldHB0eSgpLgorCSogKGVuZXJnaXplX3NoZWxsX3dhaXQpOiAgTmV3IHJvdXRpbmUgdG8gd2FpdCBmb3IgdGhpbmdzIHN0YXJ0ZWQKKwl2aWEgdGhlIHNoZWxsIGNvbW1hbmQsIHVzZXMgd2FpdCgpIGluc3RlYWQgb2YgL2Rldi9wcm9jLgorCSogQWxzbywgYWRkIHByb3RvdHlwZSBmb3IgZXhlY3V0ZV9jb21tYW5kXzEoKS4KKworRnJpIFNlcCAyNSAxMjowOTozMyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwkqIGluZnRhcmcuYyAoY2hpbGRfY3JlYXRlX2luZmVyaW9yLCBjaGlsZF9hdHRhY2gsCisJICBjaGlsZF9tb3Vybl9pbmZlcmlvcik6IGNvbGxlY3QgdW5peCBjaGlsZCBwcm9jZXNzIHN0cmF0dW0KKwkgIGZ1bmN0aW9ucyB3aGljaCBsaXZlIGJlbG93IHRoZSB0YXJnZXQgdmVjdG9yIGludG8gdGhpcyBmaWxlIHRvCisJICBmYWNpbGl0YXRlIGhvc3QvdGFyZ2V0L25hdGl2ZSBzcGxpdC4gIEFsc28sIG1ha2UgdGhlbSBzdGF0aWMuCisJKiBpbmZsb3cuYyAoY2hpbGRfbW91cm5faW5mZXJpb3IpOiByZW1vdmVkLgorCSogaW5mcnVuLmMgKGNoaWxkX2NyZWF0ZV9pbmZlcmlvciwgY2hpbGRfYXR0YWNoKTogcmVtb3ZlZC4KKwkgIChyZXN1bWUpOiBiZWNvbWVzIGdsb2JhbCBzbyB0aGF0IGZ1bmN0aW9ucyBiZWxvdyB0aGUKKwkgIHRhcmdldCB2ZWN0b3IgY2FuIGZpbmQgaXQuCisJKiBpbmZlcmlvci5oIChyZXN1bWUpOiBhZGQgcHJvdG90eXBlLgorCSAgKGNoaWxkX21vdXJuX2luZmVyaW9yLCBjaGlsZF9jcmVhdGVfaW5mZXJpb3IsIGNoaWxkX2F0dGFjaCk6CisJICByZW1vdmUgcHJvdG90eXBlcy4KKworCSogeGNvZmZleGVjLmMgKGV4ZWNfb3BzKTogY2hpbGRfYXR0YWNoIGFuZCBjaGlsZF9jcmVhdGVfaW5mZXJpb3IKKwkgIHJlcGxhY2VkIHdpdGggZmluZF9kZWZhdWx0X2F0dGFjaCBhbmQKKwkgIGZpbmRfZGVmYXVsdF9jcmVhdGVfaW5mZXJpb3IuCisKK0ZyaSBTZXAgMjUgMTA6MjE6MDQgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQorCisJKiBpOTYwLXBpbnNuLmM6IFVzZSBfZmlsdGVyZWQgcm91dGluZXMgZm9yIHByaW50aW5nLCBzbyBzeW1ib2xpYworCWFkZHJlc3NlcyBkb24ndCBnZXQgZGlzcGxheWVkIGluIHRoZSB3cm9uZyBwb3NpdGlvbnMuCisKK0ZyaSBTZXAgMjUgMDk6NTI6NDcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisgICAgICAgIFNlcGFyYXRlIGNvcmUgZnVuY3Rpb25zIGFsb25nIHRhcmdldCB2ZWN0b3IgaW4gcHJlcGFyYXRpb24gZm9yCisgICAgICAgIG5hdGl2ZSBzdXBwb3J0LiAgRnVuY3Rpb25zIGFib3ZlIHZlY3RvciBub3cgbGl2ZSBpbiBjb3JlLmMuICBUaG9zZQorICAgICAgICBiZWxvdyBpbiBjb3JlbG93LmMuCisKKwkqIGNvcmUuYyAoc29saWJfYWRkX3N0dWIsIGNvcmVfY2xvc2UsIGNvcmVfb3BlbiwgY29yZV9kZXRhY2gsCisJICBnZXRfY29yZV9yZWdpc3RlcnMsIGNvcmVfZmlsZXNfaW5mbywgY29yZV9vcHMpOiBtb3ZlZCB0byBjb3JlbG93LmMKKwkgIChfaW5pdGlhbGl6ZV9jb3JlKTogcmVtb3ZlZCBhZGRpdGlvbiBvZiBjb3JlX29wcyB0YXJnZXQuCisJKiBjb3JlbG93LmM6IG5ldyBmaWxlLgorCShzb2xpYl9hZGRfc3R1YiwgY29yZV9jbG9zZSwgY29yZV9vcGVuLCBjb3JlX2RldGFjaCwKKwlnZXRfY29yZV9yZWdpc3RlcnMsIGNvcmVfZmlsZXNfaW5mbywgY29yZV9vcHMpOiBtb3ZlZCBmcm9tIGNvcmUuYworCShfaW5pdGlhbGl6ZV9jb3JlbG93KTogbmV3IGZ1bmN0aW9uLgorCSogZ2RiY29yZS5oIChjb3JlX29wZW4sIGNvcmVfZGV0YWNoKTogYWRkZWQgcHJvdG90eXBlcy4KKwkoY29yZV9vcHMpOiBhZGQgZm9yd2FyZCBkZWNsYXJhdGlvbi4KKwkqIE1ha2VmaWxlLmluIChTRklMRVNfTUFJTkRJUik6IGFkZCBjb3JlLmMKKwkoT0JTKTogYWRkIGNvcmUubworCShUU09CUyk6IGNoYW5nZSBjb3JlLm8gdG8gY29yZWxvdy5vCisKK1dlZCBTZXAgMjMgMTE6MTQ6NTMgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogbTY4ay10ZGVwLmMgKG02OGtfc2F2ZWRfcGNfYWZ0ZXJfY2FsbCk6ICBVc2UgJ0dEQl9UQVJHRVRfSVNfU1VOMycKKwlpbnN0ZWFkIG9mICdzdW4nIHByZWRlZmluZWQgc3ltYm9sIHNvIHRoYXQgdHJhcCBhbmFseXNpcyBjb2RlIGlzCisJZW5hYmxlZCBvbmx5IHdoZW4gdGhlIFRBUkdFVCBpcyBhIHN1bjMuCisKK1R1ZSBTZXAgMjIgMTc6MTM6MTkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiB0bS1pOTYwLmggKGV4dF9mb3JtYXRfaTk2MCk6IEFkZCB0b3AtbGV2ZWwgZGVjbGFyYXRpb24uCisJKFJFR0lTVEVSX0NPTlZFUlRfVE9fe1ZJUlRVQUwsUkFXfSk6IERvbid0IGRlY2xhcmUgaXQgaW4gbmVzdGVkCisJYmxvY2tzLCBlbHNlIFN1bjQgY29tcGlsZXIgY29tcGxhaW5zLgorCitUdWUgU2VwIDIyIDAwOjQzOjUxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBtaXBzLXBpbnNuLmMgKHByaW50X2luc25fYXJnLCBjYXNlICdCJyk6ICBEaXNhc3NlbWJsZSBgYnJlYWsnCisJaW5zdHJ1Y3Rpb24ncyBhcmd1bWVudC4gIFBhdGNoIGZyb20gam9uYXRoYW5AY3Muc3RhbmZvcmQuZWR1CisJKEpvbmF0aGFuIFN0b25lKS4KKworTW9uIFNlcCAyMSAxODoxNjozMCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwlCcmVhayB0aGUgdGhyZWFkIG9mIGNvbnRyb2wgdGhhdCBpbXBsaWVzIHRoYXQgYSB1bml4IGNoaWxkCisJcHJvY2VzcyB3aWxsIGJlIHRoZSBkZWZhdWx0IHRhcmdldC4KKworCSogdGFyZ2V0LmMgKGZpbmRfZGVmYXVsdF9ydW5fdGFyZ2V0LCBmaW5kX2RlZmF1bHRfYXR0YWNoLAorCWZpbmRfZGVmYXVsdF9jcmVhdGVfaW5mZXJpb3IsIHJldHVybl96ZXJvKTogIG5ldyBmdW5jdGlvbnMuCisJKGNsZWFudXBfdGFyZ2V0KTogIE1ha2UgcmV0dXJuX3plcm8gdGhlIGRlZmF1bHQgZm9yIHRvX2Nhbl9ydW4uCisKKwkqIGV4ZWMuYyAoZXhlY19vcHMpLCBjb3JlLmMgKGNvcmVfb3BzKTogIFJlcGxhY2UgY2hpbGRfYXR0YWNoIGFuZAorCWNoaWxkX2NyZWF0ZV9pbmZlcmlvciByZWZlcmVuY2VzIHdpdGggZmluZF9kZWZhdWx0X1hYWCBpbnN0ZWFkLgorCisJKiB0YXJnZXQuaCAoc3RydWN0IHRhcmdldF9vcHMpOiBuZXcgZmllbGQsIHRvX2Nhbl9ydW4uCisJKGZpbmRfZGVmYXVsdF9hdHRhY2gsIGZpbmRfZGVmYXVsdF9jcmVhdGVfaW5mZXJpb3IpOiAgbmV3IHByb3RvdHlwZXMuCisJKHRhcmdldF9jYW5fcnVuKTogbmV3IG1hY3JvLgorCisJKiBBbHNvIGFkZGVkIGEgemVybyAoZGVmYXVsdCkgdG9fY2FuX3J1biBlbGVtZW50IHRvIGFsbCBzdGF0aWMKKwlzdHJ1Y3QgdGFyZ2V0X29wcyBpbml0aWFsaXphdGlvbnMgdGhyb3VnaG91dCBHREIsIGV4Y2VwdDogCisJKiBpbmZ0YXJnLmMgKGNoaWxkX29wcyk6IFVzZSBuZXcgY2hpbGRfY2FuX3J1bigpIHRvIGVuYWJsZSBjaGlsZCBydW5zLgorCisJKiBpbmZydW4uYyAoY2hpbGRfY3JlYXRlX2luZmVyaW9yKTogIENsZWFuIHVwIGVycm9yIGhhbmRsaW5nIHdoZW4KKwlubyBleGVjIGZpbGUgaXMgc3BlY2lmaWVkLgorCShjaGlsZF9hdHRhY2gpOiAgRG9uJ3QgcmVxdWlyZSBleGVjIGZpbGUuCisKK01vbiBTZXAgMjEgMTk6NDM6MTMgMTk5MiAgSm9obiBHaWxtb3JlIGFuZCBLLiBSaWNoYXJkIFBpeGxleSAoZ251QGN5Z251cy5jb20pCisKKwlSZW1vdmUga2lsbF9pbmZlcmlvcl9mYXN0LCBpbiBmYXZvciBvZiB0YXJnZXRfa2lsbCwgd2hpY2ggZ29lcworCXRocm91Z2ggdGhlIHRhcmdldCB2ZWN0b3IuCisKKwkqIGluZmVyaW9yLmggKGtpbGxfaW5mZXJpb3JfZmFzdCk6IHJlbW92ZSBkZWNsYXJhdGlvbi4KKworCSogbWFpbi5jIChkaXNjb25uZWN0KTogY2FsbCBxdWl0X2NvdmVyIHVzaW5nIGNhdGNoX2Vycm9ycyByYXRoZXIKKwl0aGFuIGNhbGxpbmcga2lsbF9pbmZlcmlvcl9mYXN0IGRpcmVjdGx5LiAgTmV3IHdheSBnb2VzIHRocm91Z2gKKwl0aGUgdGFyZ2V0IHZlY3RvciwgaGFuZGxlcyBhdHRhY2hlZCBwcm9jZXNzZXMsIGFuZCB3cml0ZXMKKwljb21tYW5kIGhpc3RvcnkgaWYgYXBwcm9wcmlhdGUuCisJKHF1aXRfY292ZXIpOiBuZXcgZnVuY3Rpb24sIHdyYXBwZXIgZm9yIHF1aXRfY29tbWFuZC4KKworCSogY29udmV4LXhkZXAuYywgZ28zMi14ZGVwLmMsIGhwcGFic2QteGRlcC5jLCBocHBhaHB1eC14ZGVwLmMsCisJaW5mcHRyYWNlLmMsIHByb2Nmcy5jOiAgUmVtb3ZlZCBhbGwgaW5zdGFuY2VzIG9mIGtpbGxfaW5mZXJpb3JfZmFzdCwKKwlpbmxpbmluZyB0aGVtIGludG8gdGhlIGxvY2FsIGtpbGxfaW5mZXJpb3Igd2hlbiBuZWVkZWQuCisKK01vbiBTZXAgMjEgMTk6MjM6MDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGluZnJ1bi5jIChfaW5pdGlhbGl6ZV9pbmZydW4pOiAgQWxpYXMgYGkgaGFuZGxlJyA9PSBgaSBzaWduYWxzJy4KKwkqIHN0YWJzcmVhZC5jIChyZWFkX3N0cnVjdF90eXBlKTogU2ltcGxpZnkgY29tcGxpY2F0ZWQgZXhwcmVzc2lvbgorCWZvciBkdW1iIERFQ3N0YXRpb24gY29tcGlsZXIuCisKK01vbiBTZXAgMjEgMTQ6NTQ6MzUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBtNjhrLXBpbnNuIChwcmludF9pbnNuX2FyZywgZmV0Y2hfYXJnKTogYWRkZWQgc3VwcG9ydCBmb3IKKwlvcGVyYW5kcyB0byBtZW1vcnkgbWFuYWdlbWVudCBpbnN0cnVjdGlvbnMsIGZyb20gV1JTLgorCitTZXAgMjAgMDg6NDI6MTIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIG1haW4uYyAobWFpbik6ICBCYWNrIG91dCBwcmV2aW91cyBsYW5ndWFnZSBzZXR0aW5nIGNoYW5nZXMuCisJUmVwbGFjZSB3aXRoIHNpbXBsZSBkZWZhdWx0IHRvIEMgYmVmb3JlIHByb2Nlc3NpbmcgYW55IGluaXQKKwlmaWxlcy4gIFRoZXJlIE1VU1QgYmUgYSBsYW5ndWFnZSBzZXQsIGV2ZW4gaW4gdGhlIGFic2VuY2Ugb2YKKwlpbml0IGZpbGVzIG9yIGV4ZWN1dGFibGVzLCBvciBleHByZXNzaW9uIHBhcnNpbmcgZmFpbHMuCisKK1NhdCBTZXAgMTkgMDk6NTI6MjYgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIG1haW4uYyAobWFpbik6ICBNb3ZlIGNvZGUgdGhhdCBzZXRzIGluaXRpYWwgbGFuZ3VhZ2UgdG8KKwlzeW1maWxlLmMuICBGaXh1cCBwbGFjZXMgd2hlcmUgY29tbWFuZCBmaWxlcyBhcmUgcHJvY2Vzc2VkIHRvCisJYmUgY29uc2lzdGVudCBpbiBzZXR0aW5nIGEgZGVmYXVsdCBsYW5ndWFnZSBpZiBub25lIGhhcyBiZWVuCisJcHJldmlvdXNseSBzZXQuCisJKiBzeW1maWxlLmMgKHNldF9pbml0aWFsX2xhbmd1YWdlKTogIEFkZCBjb2RlIG1vdmVkIGZyb20KKwltYWluKCkgdGhhdCBzZXRzIGFuIGluaXRpYWwgZGVmYXVsdCBsYW5ndWFnZSB3aGVuIGEgbmV3CisJc3ltYm9sIGZpbGUgaXMgcmVhZC4KKwkqIHN5bWZpbGUuYyAoc3ltYm9sX2ZpbGVfY29tbWFuZCk6ICBDYWxsIHNldF9pbml0aWFsX2xhbmd1YWdlLgorCSogc3ltdGFiLmMgKGZpbmRfbWFpbl9wc3ltdGFiKTogIEFkZCBGSVhNRSBjb21tZW50LgorCitXZWQgU2VwIDE2IDIyOjMxOjU1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jLCBzcGFyYy10ZGVwLmM6IGNvbW1lbnQgY2hhbmdlcy4KKwkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0YXJnZXRfZGVwZW5kZW50IGxpbmUuCisKKwkqIHJlbW90ZS1tbS5jIChtbV9hdHRhY2gpOiBjaGFuZ2UgcHJpbnRmIHRvIGVycm9yIHRvIHByZXZlbnQKKwlmYWxsdGhyb3VnaCBidWcuCisJKiByZW1vdGUtdWRpLmMgKHVkaV9hdHRhY2gpOiBjaGFuZ2UgcHJpbnRmIHRvIGVycm9yIHRvIHByZXZlbnQKKwlmYWxsdGhyb3VnaCBidWcuCisKKwkqIHJzNjAwMC10ZGVwLmMgKHB1c2hfZHVtbXlfZnJhbWUsIHBvcF9kdW1teV9mcmFtZSk6IHJlcGxhY2UKKwljYWxscyB0byB7ZmV0Y2h8c3RvcmV9X2luZmVyaW9yX3JlZ2lzdGVycyB3aXRoIGNhbGxzIHRvCisJdGFyZ2V0X3tmZXRjaHxzdG9yZX1fcmVnaXN0ZXJzLCBmb3IgcmVtb3RlLXRhcmdldCBpbmRlcGVuZGVuY2UuCisKK1NhdCBTZXAgMTkgMDQ6MjM6NTQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgRml4IGJ1ZyBJIGludHJvZHVjZWQgaW4gbWVyZ2luZyBSaWNoJ3MgY2hhbmdlLgorCSogaW5mcnVuLmMgKGNoaWxkX2NyZWF0ZV9pbmZlcmlvcik6ICBVc2UgcHJvY2VlZCgpIHJhdGhlciB0aGFuCisJZG9pbmcgYWxsIHRoZSBzYW1lIHN0dWZmIGJ5IGhhbmQuCisKK1RodSBTZXAgMTcgMTc6MzU6MzcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBhZGQgc3VwcG9ydCBmb3IgZmlsZXMgdXNlZCBvbmx5IHdoZW4KKwljb25maWd1cmVkIG5hdGl2ZSwgdGhhdCBpcywgd2hlbiBob3N0ID0gdGFyZ2V0LgorCitXZWQgU2VwIDE2IDIzOjAzOjIzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogdG0tc3BhcmMuaCwgeG0tc3BhcmMuaDogZXh0ZXJucyBhbmQgbWFjcm9zIHJlbGF0aW5nIHRvIGRlZmVycmVkCisJc3RvcmVzIGFyZSB0YXJnZXQgZGVwZW5kZW50IGFuZCB3ZXJlIG1vdmVkIGZyb20geG0gdG8gdG0uCisKK1NhdCBTZXAgMTkgMDM6MTQ6MzcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChnZGItYWxsLnRleGkpOiAgQnVpbGQgaW4gb2JqZGlyLCBub3QgJHNyY2Rpci4KKworCSogY29uZmlnL2RlY3N0YXRpb24ubWg6ICBBZGQgTU1BTExPQ19MSUIgYW5kIE1NQUxMT0NfRElTQUJMRQorCW92ZXJyaWRlcywgdG8gYXZvaWQgcHJvYmxlbSBpbiB4ZHJfYnl0ZXMgd2l0aCBtYWxsb2MoMCkgPT4gMC4KKworV2VkIFNlcCAxNiAyMDowNDo1NCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwkqIHRhcmdldC5oIChzdHJ1Y3QgdGFyZ2V0X29wcyk6ICByZW1vdmVkIHRvX2NvbnZlcnRfdG9fdmlydHVhbCBhbmQKKwl0b19jb252ZXJ0X2Zyb21fdmlydHVhbCBlbGVtZW50cy4gIEluaXRpYWxpemF0aW9ucyByZW1vdmVkIGZyb20KKwlhbGwgc3RhdGljIGluaXRpYWxpemF0aW9ucy4KKwkodGFyZ2V0X2NvbnZlcnRfdG9fdmlydHVhbCwgdGFyZ2V0X2NvbnZlcnRfZnJvbV92aXJ0dWFsKToKKwlyZW1vdmVkLgorCShob3N0X2NvbnZlcnRfdG9fdmlydHVhbCwgaG9zdF9jb252ZXJ0X2Zyb21fdmlydHVhbCk6ICBSZW1vdmVkCisJZm9yd2FyZCBkZWNsYXJhdGlvbnMuCisJKiB0YXJnZXQuYyAoY2xlYW51cF90YXJnZXQpOiByZW1vdmVkIGRlZmF1bHQgYXNzaWdubWVudHMgZm9yCisJdG9fY29udmVydF90b192aXJ0dWFsIGFuZCB0b19jb252ZXJ0X2Zyb21fdmlydHVhbC4KKwkqIGluZnRhcmcuYyAoaG9zdF9jb252ZXJ0X3RvX3ZpcnR1YWwsIGhvc3RfY29udmVydF9mcm9tX3ZpcnR1YWwpOgorCXJlbW92ZWQuCisJKiBmaW5kdmFyLmMgKHZhbHVlX29mX3JlZ2lzdGVyLCB2YWx1ZV9mcm9tX3JlZ2lzdGVyKTogIAorCXRhcmdldF9jb252ZXJ0X3RvX3ZpcnR1YWwgaW5saW5lZC4KKwkqIGluZmNtZC5jIChkb19yZWdpc3RlcnNfaW5mbyk6ICB0YXJnZXRfY29udmVydF90b192aXJ0dWFsIGlubGluZWQuCisJKiB2YWxvcHMuYyAodmFsdWVfYXNzaWduKTogIHRhcmdldF9jb252ZXJ0X2Zyb21fdmlydHVhbCBpbmxpbmVkLgorCitGcmkgU2VwIDE4IDAyOjA3OjM5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBtYWluLmMgKGdkYl9yZWFkbGluZSk6ICBBdm9pZCBwcmludGZfZmlsdGVyZWQsIHdoaWNoIHNldHMgY2hhcgorCXBvc2l0aW9uIHdyb25nIGlmIHVzZWQgZm9yIHRoZSBwcm9tcHQuCisJKiB1dGlscy5jIChwdXRzX2ZpbHRlcmVkKTogIENvbW1lbnQ6ICBOT1QgYSBwdXRzKCkgcmVwbGFjZW1lbnQhCisKKwlTdXBwb3J0IGZvciBhY2Nlc3NpbmcgYXJiaXRyYXJ5IE1JUFMgc3RhY2sgZnJhbWVzIGluIG1lbW9yeS4KKworCSogYmxvY2tmcmFtZS5jIChnZXRfcHJldl9mcmFtZV9pbmZvKTogIElmIElOSVRfRlJBTUVfUENfRklSU1QgaXMKKwlzZXQsIHJ1biBpdCBiZWZvcmUgSU5JVF9FWFRSQV9GUkFNRV9JTkZPLgorCSogc3RhY2suYyAoZnJhbWVfaW5mbyk6ICBJZiBQUklOVF9FWFRSQV9GUkFNRV9JTkZPIGRlZmluZWQsIGNhbGwgaXQuCisKKwkqIG1pcHMtdGRlcC5jIChpbml0X2V4dHJhX2ZyYW1lX2luZm8pOiBPbmx5IGNsb2JiZXIgdGhlIGBmcmFtZScKKwkoRlApIHZhbHVlIGluIHRoZSBmcmFtZV9pbmZvIHN0cnVjdCBpZiBpdCBpcyB6ZXJvIChhcyBmcm9tIHRvcCBvZgorCWV4ZWN1dGlvbiBzdGFjaykuCisJKHNldHVwX2FyYml0cmFyeV9mcmFtZSk6ICBJbXBsZW1lbnQgRlJBTUVfU1BFQ0lGSUNBVElPTl9EWUFESUMuCisKKwkqIG1pcHMteGRlcC5jIChmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMpOiAgWkVST19SRUdOVU0gYWx3YXlzCisJY29tZXMgYmFjayBhcyB6ZXJvLiAgU28gZG9lcyBGUF9SRUdOVU0sIGFzIGEgdHJpZ2dlciBmb3IKKwlpbml0X2V4dHJhX2ZyYW1lX2luZm8uCisKKwkqIHRtLW1pcHMuaCAoSU5JVF9GUkFNRV9QQ19GSVJTVCk6ICBLbHVkZ2UsIEZJWE1FLCBkZWZpbmVkIHRvIGdldAorCXRoZSBwcm9ncmFtIGNvdW50ZXIgc2V0IGJlZm9yZSBJTklUX0VYVFJBX0ZSQU1FX0lORk8gaXMgcnVuLgorCShJTklUX0ZSQU1FX1BDKTogIERlZmluZWQgdG8gbnVsbC4KKwkoUFJJTlRfRVhUUkFfRlJBTUVfSU5GTyk6IHByaW50IGZyYW1lIHBvaW50ZXIgbG9jYXRpb24gdmlhIHN5bXRhYi4KKwkoRlJBTUVfU1BFQ0lGSUNBVElPTl9EWUFESUMpOiAgQXNrIGZvciB0d28gYXJncyBpbiBmcmFtZSBjb21tYW5kLgorCUJyaWVmbHkgZXhwbGFpbiBNSVBTIHN0YWNrcyBpbiBHREIuCisKK1RodSBTZXAgMTcgMDM6NDk6NTkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGNvcHlpbmcuYXdrLCBjb3B5aW5nLmMgKHNob3dfY29weWluZ19jb21tYW5kLAorCXNob3dfd2FycmFudHlfY29tbWFuZCk6ICBSZW5hbWUgZnJvbSBjb3B5aW5nX2luZm8sIHdhcnJhbnR5X2luZm8sCisJdG8gbWF0Y2ggY29tbWFuZCBmdW5jdGlvbiBjb252ZW50aW9ucy4KKworCSogdXRpbHMuYyAocHJvbXB0X2Zvcl9jb250aW51ZSk6ICBSZWluaXRpYWxpemUgbW9yZS1jb3VudHMKKwliZWZvcmUgcHJpbnRpbmcgYW55dGhpbmcsIGFuZCBhZ2FpbiBhZnRlcndhcmQuICBGaXggY29tbWVudHMuCisJKHZmcHJpbnRmX2ZpbHRlcmVkKTogIEVsaW1pbmF0ZSBzdGF0aWMgYnVmZmVyOyB1c2UgYXV0byBidWZmZXIsCisJb3IgYWxsb2NhKCkgaWYgbmVlZGVkLgorCisJKiByczYwMDAteGRlcC5jOiAgVXNlIGNvcnJlY3QgY29uZGl0aW9uYWwgKElCTTYwMDBfVEFSR0VUKSB0bworCWRldGVjdCBuYXRpdmUgdmVyc3VzIGNyb3NzLWhvc3QuCisKK1dlZCBTZXAgMTYgMjE6NTc6MTQgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogbTY4ay10ZGVwLmMgKHN1bjNfc2F2ZWRfcGNfYWZ0ZXJfY2FsbCk6ICBPbmx5IGRvIHRyYXAgY2hlY2sgZm9yCisJU3Vucy4gIFJlbmFtZSB0byBtNjhrX3NhdmVkX3BjX2FmdGVyX2NhbGwuCisJKiB0bS02OGstbm91bi5oLCB0bS1zdW4zLmggKFNBVkVEX1BDX0FGVEVSX0NBTEwpOiAgVXNlCisJbTY4a19zYXZlZC4uLiBpbnN0ZWFkIG9mIHN1bjNfc2F2ZWQuLi4KKworV2VkIFNlcCAxNiAxNzowMDowNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKHVwZGF0ZS1kZXBlbmQsIHVwZGF0ZS1hbGxkZXBzKTogU3BsaXQgb3V0IG9mCisJc2V0dXAtdG8tZGlzdCwgZm9yIGNvbnZlbmllbmNlIGluIHJlYnVpbGRpbmcgdGhlIGRlcGVuZCBhbmQKKwlhbGxkZXBzLm1hayBmaWxlcy4KKwkoYXNzb3J0ZWQpOiAgVXBkYXRlIHRvIGNhdGNoIHN0cmFnZ2xlciBmaWxlcyB3aGVuIGJ1aWxkaW5nIGdkYi50YXIuWi4KKworVHVlIFNlcCAxNSAwMToxODo1MCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCVByZWxpbWluYXJ5IGNsZWFudXAgZm9yIHNwbGl0dGluZyBob3N0L25hdGl2ZS90YXJnZXQuCisKKwkqIGluZnB0cmFjZS5jIChjaGlsZF9yZXN1bWUpOiAgRG9uJ3QgZGVhbCB3aXRoIE5PX1NJTkdMRV9TVEVQCisJaGVyZTsgaXQgaXMgZGVhbHQgd2l0aCBhdCBhIGdkYi10YXJnZXQtaW5kZXBlbmRlbnQgbGV2ZWwuCisJKiByczYwMDAtdGRlcC5jIChzaW5nbGVfc3RlcCk6ICBEb24ndCBjYWxsIHB0cmFjZSwgd2UgYXJlIGEKKwloaWdoIHRvbmVkIHJvdXRpbmUuICBGaXggcmV0dXJuIHR5cGUgdG8gdm9pZC4KKwkqIHRtLXJzNjAwMC5oIChBSVhfQlVHR1lfUFRSQUNFX0NBTEwpOiBaYXAsIHdlIHRoaW5rIHdlIGZpeGVkIGl0LgorCVJpY2ggYW5kIEkgYmVsaWV2ZSB0aGUgInJlYWwgcHJvYmxlbSIgd2FzIHRoYXQgYm90aCBzaW5nbGVfc3RlcAorCWFuZCB0YXJnZXRfcmVzdW1lIHdlcmUgaXNzdWluZyBQVF9DT05USU5VRSBjYWxscy4gIFRoaXMgd291bGQKKwljYXVzZSB0aGUgc2Vjb25kIFBUX0NPTlRJTlVFIHRvIHNvbWV0aW1lcyBmYWlsIGJlY2F1c2UgdGhlIHByb2Nlc3MKKwl3YXMgYWxyZWFkeSBydW5uaW5nLgorCSogaW5mcHRyYWNlLmMgKGNoaWxkX3Jlc3VtZSk6ICBSZW1vdmUgQUlYX0JVR0dZX1BUUkFDRV9DQUxMIGtsdWRnZS4KKworTW9uIFNlcCAxNCAxOToyMDo0MyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBlbmVyZ2l6ZS5jIChwdHlfdG9fa2VybmVsKTogIE11c3QgY2hlY2sgZm9yIEVBR0FJTiBhcworCXRlcm1pbmF0aW9uIGNvbmRpdGlvbi4KKwkoZnVsbF9maWxlbmFtZSk6ICBEb24ndCBwcmVwZW5kIGRpcm5hbWUgaWYgZmlsZW5hbWUgYmVnaW5zIHdpdGggLy4KKwkoYnJlYWtwb2ludF9ub3RpZnksIGtlcm5lbF9kaXNwYXRjaCk6ICBEZWFsIHdpdGggRHluYW1pY0xvYWQKKwltZXNzYWdlcyBwcm9wZXJseSEhCisJKGdldHB0eSAoTkNSKSk6ICBMb3RzYSBidWcgZml4ZXMuLi4KKwkoa2VybmVsX2Rpc3BhdGNoIChjYXNlIFN0b3BSVHlwZSkpOiAgVXNlIGtpbGwoKSBpbnN0ZWFkIG9mCisJa2lsbHBnKCkgc28gd2UgY2FuIGRlYWwgd2l0aCBsb3Npbmcgc3lzdGVtcy4uLgorCSh3YWl0X2Zvcl9ldmVudHMpOiAgV29yayBhcm91bmQgTkNSIHNlbGVjdCgpIGxvc3NhZ2UuICBJdCBkb2Vzbid0CisJemVybyBvdXQgcmVhZGZkcyB3aGVuIHNlbGVjdCgpIHJldHVybnMgemVyby4KKwkoZW5lcmdpemVfaW5pdGlhbGl6ZSk6ICBVc2UgSV9TRVRTSUcgdG8gZ2V0IFNJR0lPIGludGVycnVwdHMuICBVc2UKKwlnZXRjd2QoKSBpbnN0ZWFkIG9mIGdldHdkKCkgKE5DUiBnZXR3ZCgpIHNlZyBmYXVsdHMpLgorCShlbmVyZ2l6ZV93YWl0KTogIFVzZSBzaWdhY3Rpb24oKSBmb3IgTkNSLiAgVGhlaXIgdmVyc2lvbiBvZiBzaWduYWwoKQorCWlzIHVucmVsaWFibGUgYnkgZGVmYXVsdC4KKworCSogcHJvY2ZzLmMgKHByb2Nfd2FpdCk6ICBDYWxsIHByaW50X3N5c19lcnJtc2coKSBpZiB3ZSBnZXQgYW4KKwllcnJvciBmcm9tIFBJT0NTV1NUT1AuCisKKwkqIGJyZWFrcG9pbnQuYywgY29yZS5jLCBleGVjLmMsIGxhbmd1YWdlLmMsIG1haW4uYywgcHJpbnRjbWQuYywKKwlzeW1maWxlLmMsIHRhcmdldC5jLCB2YWxwcmludC5jOiAgVXNlIF9maWx0ZXJlZCBmb3JtIG9mICpwcmludGYuCisJZGVmcy5oLCB1dGlscy5jOiAgTWFrZSB2ZnByaW50Zl9maWx0ZXJlZCBnbG9iYWwuCisKKwkqIGVuZXJnaXplLmMgKHNlbmRfbG9jYXRpb24pOiAgTmV3IHJvdXRpbmUgdG8gY29uc29saWRhdGUgYWxsCisJcGxhY2VzIHdoZXJlIHdlIG11c3Qgbm90aWZ5IGtlcm5lbCBvZiB3aGVyZSB0aGUgZ2l2ZW4gcGMgaXMuCisJKGNwbHVzX2RlbWFuZ2xlKTogIFB1dCBzaW5nbGUtcXVvdGVzIGFyb3VuZCBkZW1hbmdsZWQgbmFtZXMuCisJKGVuZXJnaXplX2NhbGxfY29tbWFuZCk6ICBDYWxsIHNlbmRfbG9jYXRpb24oKSBhZnRlciBkb2luZyB1cCwKKwlkb3duLCBhbmQgZnJhbWUgY29tbWFuZHMuCisKK0ZyaSBTZXAgMTEgMTg6Mjg6MjggMTk5MiAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKKworCSogZG9jL2dkYi50ZXhpbmZvLCBkb2MvZ2RiaW52LW0ubTQuaW4sIGRvYy9nZGJpbnYtcy5tNC5pbjogZmlyc3QKKwlwYXNzIGF0IGRvYyBmb3IgdHdvIG5ldyByZW1vdGUgdGFyZ2V0cy0tLTI5SyB1c2luZyBVREksIGFuZCBUYW5kZW0KKwlTVDIwMDAgdXNpbmcgU1REQlVHLgorCisJKiBkb2MvYWxsLm00LCBkb2Mvbm9uZS5tNDogbmV3IG00IHN3aXRjaCwgX1NUMjAwMF9fCisKKwkqIGRvYy9hbGwubTQ6IHR1cm4gb24gSDgvMzAwIHN0dWZmIGZvciBnZW5lcmljIG1hbnVhbAorCisJKiBkb2MvZ2RiaW52LXMubTQuaW46IHJlbW92ZSB0ZXh0IG9uIHNwZWNpYWwgcHJvY2VkdXJlcyB0byBjb250aW51ZSAKKwlhZnRlciBleHBsaWNpdCBjYWxsIHRvIGJyZWFrcG9pbnQoKSBpbiBzZXJpYWwgc3R1YnMuCisKK0ZyaSBTZXAgMTEgMDE6MzQ6MjUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QHNwaGFnbnVtLmN5Z251cy5jb20pCisKKwkqIG1pcHNyZWFkLmM6ICBDbGVhbiB1cCBzb21lIHdoaXRlIHNwYWNlLgorCShwYXJzZV9zeW1ib2wpOiAgSGFuZGxlIHN0RW5kIG9mIHN0RmlsZS4KKwkocGFyc2VfcGFydGlhbF9zeW1ib2xzKTogIFJlbW92ZSBvbGQgI2lmIDAnZCBjb2RlLiAgSGFuZGxlIHN0TG9jYWwuCisKKwkqIG1pcHMteGRlcC5jIChSRUdJU1RFUl9QVFJBQ0VfQUREUiwgZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzLAorCXN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBSZXBsYWNlIHVuZXhwbGFpbmVkIG51bWJlcnMKKwl3aXRoIG1hbmlmZXN0IGNvbnN0YW50cyBmcm9tIGEgREVDc3RhdGlvbiBoZWFkZXIgZmlsZS4KKwkqIHhtLW1pcHMuaCAoS0VSTkVMX1VfQUREUik6ICBHZXQgZnJvbSA8bWFjaGluZS9wYXJhbS5oPi4KKwkoUkVHSVNURVJfVV9BRERSKTogIEZpeCB1cCBmb3IgVWx0cml4IDQuMi4KKworCSogdG0tdGFob2UuaCwgeG0tdGFob2UuaCAoS0VSTkVMX1VfQUREUik6ICBNb3ZlIG1hY3JvIHRvIHhtLXRhaG9lLmguCisKKwkqIHN0YWNrLmMgKF9pbml0aWFsaXplX3N0YWNrKTogICJkb3ciIHNob3VsZCBiZSBhIHZhbGlkIGFiYnJldmlhdGlvbgorCWZvciAiZG93biIuICBTdWdnZXN0ZWQgYnkgUmljaGFyZCBTdGFsbG1hbi4KKworVGh1IFNlcCAxMCAxNToyNjowNyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS12eC5jOiBSZW5hbWUgcmVhbGxvYyBmb3IgaW5jbHVzaW9uIG9mIHJwYy9ycGMuaCwgdG8gYXZvaWQKKwlyZWRlY2xhcmF0aW9uIGJ1ZyBvbiBTdW5PUyA0LgorCitXZWQgU2VwICA5IDE3OjM2OjUzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBpMzg2LXN0dWIuYywgc3BhcmMtc3R1Yi5jIChnZXRwYWNrZXQpOiAgQWN0dWFsbHkgY2hlY2sgY2hlY2tzdW1zLgorCSogbTY4ay1zdHViLmM6ICBSZW1vdmUgYSBmZXcgZXh0cmFuZW91cyBBTlNJLWlzbXMuCisJKiByZW1vdGUtbmluZHkuYyAobmluZHlfcHJlcGFyZV90b19zdG9yZSk6ICBPbmx5IGZldGNoIHJlZ3MgaWYgCisJdGhleSBhcmVuJ3QgYWxyZWFkeSB0aGVyZS4KKwkqIHJlbW90ZS12eC5jICh2eF9wcmVwYXJlX3RvX3N0b3JlKTogIERpdHRvLgorCSogeGNvZmZyZWFkLmM6ICBTdXJyb3VuZCBmb3J3YXJkIHN0cnVjdCBkZWZucyB3aXRoICNpZmRlZiBfX1NURENfXy4KKworV2VkIFNlcCAgOSAxNjo1MDoyMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCVJlbW92ZWQgYSBsYXJnZSBudW1iZXIgb2YgY2hhbmdlcyBpbnNlcnRlZCBieSBQZXIgQm90aG5lcgorCWZvciBDKysgc3VwcG9ydC4gIFRoZXNlIHdpbGwgZ28gYmFjayBpbiB3aGVuIHRoZXkndmUgYmVlbgorCWV4YW1pbmVkLgorCitUdWUgU2VwICA4IDIxOjA1OjE4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIHNlcmlhbC5oOiAgRml4IHByb3RvdHllIGZvciBzZXJpYWxfcmF3KCkuCisJKiBzZXItYnNkLmMsIHNlci10ZXJtaW9zLmM6ICBGaXggYXJncyBmb3Igc2VyaWFsX29wZW4oKSAmCisJc2VyaWFsX3dyaXRlKCkgdG8gbWF0Y2ggcHJvdG90eXBlcy4KKwkqIHJlbW90ZS1zdDIwMDAuYyAoZ2V0X3JlZ19uYW1lKTogIE1ha2UgKnAgYmUgY29uc3QuCisKK1R1ZSBTZXAgIDggMTc6MjQ6NTIgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQorCisJKiByZW1vdGUtbmluZHkuYyAobmluZHlfZmV0Y2hfcmVnaXN0ZXJzKTogTWFrZSByZXR1cm4gdHlwZSB2b2lkLAorCXRvIGFncmVlIHdpdGggdGFyZ2V0IHN0cnVjdHVyZSBmaWVsZCB0eXBlLgorCShuaW5keV9zdG9yZV9yZWdpc3RlcnMpOiBEaXR0by4KKworCSogTWFrZWZpbGUgKE9QQ09ERVMpOiBOZXcgdmFyLCBwb2ludGluZyB0byBvcGNvZGVzIGxpYnJhcnkuCisJKENMSUJTLCBDREVQUyk6IEluY2x1ZGUgaXQuCisJKHNhYmVyX2dkYik6IExvYWQgb3Bjb2RlcyBsaWJyYXJ5LgorCitUdWUgU2VwICA4IDE1OjIyOjA2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGE2OHYteGRlcC5jIChzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMpOiAgZGVjbGFyZSBhcyB2b2lkLgorCSogaW5mcHRyYWNlLmM6ICBIUC9BcG9sbG9zIGhhdmUgcHRyYWNlLmggaW4gdGhlIHdyb25nIHBsYWNlLgorCSogcmVtb3RlLXN0MjAwMC5jOiAgTWFzc2l2ZSBjaGFuZ2VzIHRvIHVzZSBuZXcgc2VyaWFsIHBhY2thZ2UuCisJQWxzbyBhZGRlZCAnY29ubmVjdCcgY29tbWFuZCB0byB0cmFuc3BhcmFudGx5IGNvbm5lY3QgdG8gc2VyaWFsCisJcG9ydC4KKwkqIHNlci10ZXJtaW9zLmM6ICBCaWcgY2xlYW51cCwgdXNlIG5pY2VyIGNvZGluZyBjb252ZW50aW9ucy4KKwkqIHNlci1ic2QuYzogIE5ldyBtb2R1bGUsIHNlcmlhbCBzdHVmZiBmb3IgQlNEIHN5c3RlbXMuCisJKiBzZXJpYWwuaDogIERlZmluZSBzdHJ1Y3QgdHR5c3RhdGUgcHJvcGVybHkgdXNpbmcgSEFWRV9URVJNSU8uCisJKiB4bS1hcG9sbG82OGIuaDogICNkZWZpbmUgUFRSQUNFX0lOX1dST05HX1BMQUNFLi4uCisKK0ZyaSBTZXAgIDQgMTg6NTM6NTcgMTk5MiAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKKworCSogZG9jL2dkYi50ZXhpbmZvOiBmaXggc2hhbWVmdWwgZXJyb3Igb2YgYWdyZWVtZW50IHJlcG9ydGVkIGJ5CisJamltYkBvY2NzLmNzLm9iZXJsaW4uZWR1IChKaW0gQmxhbmR5KQorCSogZG9jL2dkYi50ZXhpbmZvOiByZW1vdmUgb2xkIHBhcnRpYWwgZGlzY3Vzc2lvbiBvZiByZW1vdGUgc2VyaWFsCisJcHJvdG9jb2wgKHZpYSBzZXJpYWwgZGVidWcgc3R1YnMpCisJKiBkb2MvZ2RiaW52LW0ubTQuaW4sIGRvYy9nZGJpbnYtcy5tNC5pbjogbmV3IHNlY3Rpb24gZGlzY3Vzc2luZworCXVzZSBvZiBzZXJpYWwgZGVidWcgc3R1YnMKKworRnJpIFNlcCAgNCAwMDozNDozMCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIHN5bWZpbGUuaDogIERlY2xhcmF0aW9uIG9mIHNldF9kZW1hbmdsaW5nX3N0eWxlKCkgbW92ZWQKKwloZXJlIGZyb20gZGVtYW5nbGUuaCAod2hpY2ggaXMgbm93IGluIC4uL2luY2x1ZGUpLgorCSogaTM4Ni14ZGVwLmM6ICBVcGRhdGUgY29tbWVudC4KKworVGh1IFNlcCAgMyAxMzo0NDo0NiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwkqIHN5bXRhYi5jIChjb21wbGV0aW9uX2xpc3RfYWRkX3N5bWJvbCk6IHJlc3RydWN0dXJlZCB0byBvcHRpbWl6ZQorCWZvciB0aW1lLiAgRmlyc3QgY2xpcCBuYW1lcyB0aGF0IGNhbm5vdCBtYXRjaC4gIFRoZW4gY2xpcCBhbnkKKwluYW1lcyB3ZSd2ZSBhbHJlYWR5IGNvbnNpZGVyZWQuICBEcm9wIGEgcmVkdW5kYW50IHN0cm5jcHkuICBEcm9wCisJYSByZWR1bmRhbnQgbWFsbG9jIGFuZCBhc3NvY2lhdGVkIGZyZWUgZm9yIGRlbWFuZ2xlZCBuYW1lcy4KKworVGh1IFNlcCAgMyAwOToxNzowNSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBhNjh2LXhkZXAuYyAoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogIERlZmluZSBhcyB0eXBlIHZvaWQuCisJKiBjb25maWd1cmUuaW46ICBBZGQgaG9zdCBtNjhrLWFwb2xsbyotYnNkKi4KKwkqIGRlbWFuZ2xlLmMgKHN0cnVjdCBkZW1hbmdsZXJzKTogIFVzZSBlbnVtIGluc3RlYWQgb2YgY29uc3RhbnQKKwl2YWx1ZSB0byBrZWVwIGJyYWluZGFtYWdlZCBIUC9BcG9sbG8gY29tcGlsZXIgaGFwcHkuCisKK1dlZCBTZXAgIDIgMjA6NDU6MzEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiB1dGlscy5jIChzdHJjbXBfaXcpOiAgQWRkIGEgaGFjayB0byBhbGxvdyAiRk9PKEFSR1MpIiB0bworCW1hdGNoICJGT08iLiAgVGhpcyBhbGxvd3MgJ2JyZWFrIEZvbycgdG8gd29yayB3aGVuIEZvbyBpcworCWEgbWFuZ2xlZCBDKysgZnVuY3Rpb24uICAoU2VlIGNvbW1lbnQgYmVmb3JlIGZ1bmN0aW9uLikKKworV2VkIFNlcCAgMiAxMzo0NToyNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3JzNjAwMC5taCAoTUhfQ0ZMQUdTKTogIENpcmN1bXZlbnQgSUJNIDxycGMvcnBjLmg+IGJ1ZywKKwlmb3IgZmlsZXMgaW4gdngtc2hhcmUvKi5jLgorCSogeG0tcnM2MDAwLmggKGZkX3NldCk6ICBDaXJjdW12ZW50IHRoZSByczYwMDAubWggY2lyY3VtdmVudGlvbiwKKwlmb3Igbm9ybWFsIEdEQiBzb3VyY2UgZmlsZXMuCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIFJvbGwgdG8gNC42LjYuCisKKwkqIHRtLXZ4NjguaCwgdG0tZXMxODAwLmg6ICBVc2UgdG0tNjhrLmggcmF0aGVyIHRoYW4gdG0tc3VuMy5oLgorCSogdG0tc3VuMy5oOiAgUmVtb3ZlIFNUQUNLX0VORF9BRERSLCBubyBsb25nZXIgdXNlZC4KKwkqIHRtLXN1bjNvczQuaDogIFVwZGF0ZSBjb21tZW50cy4KKwkqIHhtLWRlbHRhODguaDogIFJlbW92ZSBTVEFDS19FTkRfQUREUi4KKworV2VkIFNlcCAgMiAwMToxODozMSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiAgUm9sbCB0byA0LjYuNS4KKworCSogaW5mcnVuLmM6ICBMaW50IGZvciByZWNlbnQgYGhhbmRsZScgY2hhbmdlcy4KKworCSogc2VyLXRlcm1pb3MuYywgc2VyLWdvMzIuYzogIFJlbW92ZSBERUZVTiBjcmFwLCBjbGVhbiB1cC4KKwkqIHNlcmlhbC5oIChFWEZVTik6ICBSZW1vdmUgYWxsIHVzZXMsIGNvbnZlcnQgdG8gUEFSQU1TLgorCSogY29uZmlnL3N1bjRvczQubWg6ICBJbmNsdWRlIHNlci10ZXJtaW9zLm8uICBGSVhNRSwgYWxsIC5taCBmaWxlcworCXNob3VsZCBpbmNsdWRlIGEgc2VyLVhYWC5vIG1vZHVsZS4KKworCSogZGJ4cmVhZC5jIChlbGZzdGFiX2J1aWxkX3BzeW10YWJzKTogIFJlbW92ZSBERUZVTiBjcmFwLgorCSogZGVmcy5oLCBpOTYwLXBpbnNuLmMsIHJlbW90ZS1obXMuYzogIFJlcGxhY2UgQ09OU1Qgd2l0aCBzaW1wbGUgY29uc3QuCisKKwkqIGNvbmZpZ3VyZS5pbjogIE1hcCB1bnJlY29nbml6ZWQgc3VuIDY4aydzLCBzdW4gc3BhcmNzLCBpbnRvIAorCWtub3duIHN1bnMgaW4gY29uZmlndXJlLmluLCByYXRoZXIgdGhhbiBtYXBwaW5nIHRoZW0gdG8gdW5pcXVlCisJY29uZmlnIGZpbGVzIHRoYXQgaGFwcGVuIHRvIGR1cGxpY2F0ZSBvdGhlciBjb25maWcgZmlsZXMuCisJKiBjb25maWcvc3VuMy57bWgsbXR9OiAgUmVtb3ZlICh1c2UgaWRlbnRpY2FsIHN1bjNvczQuKikuCisJKiBjb25maWcvc3VuNC57bWgsbXR9OiAgUmVtb3ZlICh1c2UgaWRlbnRpY2FsIHN1bjRvczQuKikuCisKK1dlZCBTZXAgIDIgMDA6MTA6NDMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAoKi0qLXN1bm9zKik6ICBVc2UgdHJhaWxpbmcgKiB0byBtYXRjaCBhbGwKKwlzdWItdmFyaWFudHMgb2YgU3VuT1MsIGUuZy4gc3Vub3M0KiB0byBtYXRjaCBzdW5vczQuMS4xLgorCShzcGFyYy0qLXN1bm9zMyk6ICBSZW1vdmUgaG9zdCAmIHRhcmdldC4gIFN1bm9zMyBuZXZlciBzaGlwcGVkCisJaW4gcHJvZHVjdGlvbiBvbiBTdW4tNC4KKwkoe2EyOWssaVszNF04NixpOTYwfS0qLWVsZik6ICBBZGQgdGFyZ2V0cywgZXF1aXZhbGVudCB0byBjb2ZmLgorCShtNjhrLSote2FvdXQsY29mZixlbGZ9KTogIEFkZCB0YXJnZXRzLCB3L25ldyBjb25maWcgYW5kIHRtIGZpbGVzLgorCShzcGFyYy0qLXthb3V0LGNvZmYsZWxmfSk6ICBBZGQgdGFyZ2V0cywgdy9uZXcgY29uZmlnIGFuZCB0bSBmaWxlcy4KKworCSogY29uZmlnL202OGstdW4ubXQsIGNvbmZpZy9tNjhrLW5vdW4ubXQsIGNvbmZpZy9zcGFyYy11bi5tdCwKKwljb25maWcvc3BhcmMtbm91bi5tdDogIE5ldyB0YXJnZXQgY29uZmlncyBmb3IgZW1iZWRkZWQuCisJKiBjb25maWcvc3VuNG9zMy57bWgsbXR9OiAgUmVtb3ZlLCBuZXZlciBleGlzdGVkIGluIHByb2R1Y3Rpb24uCisKKwkqIHRtLTY4ay11bi5oLCB0bS02OGstbm91bi5oLCB0bS1zcGMtdW4uaCwgdG0tc3BjLW5vdW4uaDogIE5ldworCXRhcmdldCBkZWZpbml0aW9ucyBmb3IgZW1iZWRkZWQgd2l0aCBhbmQgd2l0aG91dCB1bmRlcmxpbmVzIG9uCisJaWRlbnRpZmllcnMuCisKKwkqIHRtLXNwYXJjLmgsIHRtLXN1bjIuaCwgdG0tc3VuMy5oOiAgRGVsZXRlIE5BTUVTX0hBVkVfVU5ERVJTQ09SRToKKwlub3QgYSBwYXJhbWV0ZXIgb2YgdGhlIENQVSwgYnV0IG9mIHRoZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4KKwkqIHRtLWVzMTgwMC5oLCB0bS1zdW5vcy5oLCB0bS12eDY4Lmg6ICBBZGQgTkFNRVNfSEFWRV9VTkRFUlNDT1JFLgorCitUdWUgU2VwICAxIDE3OjMxOjQ1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBicmVha3BvaW50LmMgKGJyZWFrcG9pbnRfcmVfc2V0KTogIEF2b2lkIHNldHRpbmcgc291cmNlIHN5bXRhYgorCSh3aGljaCBpbnZvbHZlcyByZWFkaW5nIGluIG1haW4ncyBzeW10YWIpIGlmIHdlIGhhdmUgbm8gYnJlYWtwb2ludHMuCisKK01vbiBBdWcgMzEgMTM6NDc6NDUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGR3YXJmcmVhZC5jIChjdV9sYW5ndWFnZSk6ICBOZXcgbG9jYWwgdmFyaWFibGUgdG8gcmVjb3JkCisJbGFuZ3VhZ2UgZm9yIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdCBiZWluZyBwcm9jZXNzZWQuCisJKiBkd2FyZnJlYWQuYyAoc2V0X2N1X2xhbmd1YWdlKTogIE5ldyBsb2NhbCBmdW5jdGlvbiB0byBkZWNvZGUKKwlhbmQgcmVjb3JkIGxhbmd1YWdlIGZvciBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQgYmVpbmcgcHJvY2Vzc2VkLgorCSogZHdhcmZyZWFkLmMgKHN5bnRoZXNpemVfdHlwZWRlZik6ICBBZGQgbG9jYWwgZnVuY3Rpb24gdG8KKwlzeW50aGVzaXplIGEgdHlwZWRlZiBmb3IgQysrIGNsYXNzZXMsIHN0cnVjdHMsIHVuaW9ucywgYW5kCisJZW51bWVyYXRpb25zLgorCSogZHdhcmZyZWFkLmMgKHJlYWRfc3RydWN0dXJlX3Njb3BlKTogIFN5bnRoZXNpemUgdHlwZWRlZnMKKwlmb3IgQysrIGNsYXNzZXMsIHN0cnVjdHMgYW5kIHVuaW9ucy4KKwkqIGR3YXJmcmVhZC5jIChyZWFkX2VudW1lcmF0aW9uKTogIFN5bnRoZXNpemUgdHlwZWRlZnMgZm9yCisJQysrIGVudW1lcmF0aW9ucy4KKwkqIGR3YXJmcmVhZC5jIChyZWFkX2ZpbGVfc2NvcGUpOiAgIENhbGwgc2V0X2N1X2xhbmd1YWdlIHRvCisJcmVjb3JkIGxhbmd1YWdlIGZvciBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICBBZnRlciBzeW10YWIKKwlpcyBidWlsdCwgc2F2ZSB0aGlzIHJlY29yZGVkIGxhbmd1YWdlLgorCSogZHdhcmZyZWFkLmMgKHByb2Nlc3NfZGllcywgYWRkX3BhcnRpYWxfc3ltYm9sLCBzdHJ1Y3RfdHlwZSwKKwlzY2FuX3BhcnRpYWxfc3ltYm9scywgbmV3X3N5bWJvbCk6ICBSZWNvZ25pemUgVEFHX2NsYXNzX3R5cGUuCisJKiBkd2FyZnJlYWQuYyAoYWRkX3BhcnRpYWxfc3ltYm9sKTogIFN5bnRoZXNpemUgcGFydGlhbCBzeW1ib2wKKwl0eXBlZGVmcyBmb3IgQysrIGNsYXNzZXMsIHN0cnVjdHMsIHVuaW9ucywgYW5kIGVudW1lcmF0aW9ucy4KKwkqIGR3YXJmcmVhZC5jIChzY2FuX2NvbXBpbGF0aW9uX3VuaXRzKTogIENhbGwgc2V0X2N1X2xhbmd1YWdlCisJdG8gcmVjb3JkIGxhbmd1YWdlIGZvciBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuCQorCSogZHdhcmZyZWFkLmMgKHNjYW5fcGFydGlhbF9zeW1ib2xzKTogIENhbGwgYWRkX2VudW1fcHN5bWJvbCBoZXJlCisJZm9yIFRBR19lbnVtZXJhdGlvbl90eXBlcywgcmF0aGVyIHRoYW4gaW4gYWRkX3BhcnRpYWxfc3ltYm9sLgorCSogZHdhcmZyZWFkLmMgKGFkZF9wYXJ0aWFsX3N5bWJvbCk6ICBDb21iaW5lIFRBR19lbnVtZXJhdGlvbl90eXBlCisJY2FzZSB3aXRoIGNsYXNzLCBzdHJ1Y3QsIGFuZCB1bmlvbiB0eXBlIGNhc2VzLCBub3cgdGhhdCB0aGV5IGFyZQorCXRoZSBzYW1lLiAgUmVtb3ZlIHRlc3RzIGZvciBub24tTlVMTCBuYW1lIGF0dHJpYnV0ZXMsIG5vdyBkb25lCisJYnkgY2FsbGVycy4KKwkqIGdkYnR5cGVzLmggKFRZUEVfQ09ERV9DTEFTUyk6ICBBZGQgdHlwZSBmb3IgQysrIGNsYXNzZXMsIGJ1dAorCXRyZWF0IGFzIGFsaWFzIGZvciBUWVBFX0NPREVfU1RSVUNUIGZvciBub3cuCisKK1N1biBBdWcgMzAgMjE6MzI6MTcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogbWFwICJnZGIiIHRocm91Z2ggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSB3aGVuCisJaW5zdGFsbGluZy4KKworU3VuIEF1ZyAzMCAyMToxODo1MSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSoge2kzODYtdGRlcC5jLCBtNjhrLXRkZXAuYywgbWlwcy10ZGVwLmMsIHNwYXJjLXRkZXAuY30KKwkgIChzdXBwbHlfZ3JlZ3NldCwgZmlsbF9ncmVnc2V0LCBzdXBwbHlfZnByZWdzZXQsIGZpbGxfZnByZWdzZXQpOgorCVVzZSAicmVnaSIgZm9yIGxvY2FsIGluZGV4aW5nIHRocm91Z2ggcmVnaXN0ZXIgbnVtYmVycywgcmVzZXJ2aW5nCisJInJlZ25vIiBmb3IgdGhlIG5hbWUgb2YgYSBzcGVjaWZpYyByZWdpc3RlciBwYXNzZWQgYXMgYW4gaW5wdXQKKwlwYXJhbWV0ZXIuICBGaXggYnVnIHByb3BhZ2F0ZWQgdGhyb3VnaCBhbGwgdmVyc2lvbnMgdGhhdCBzb21ldGltZXMKKwl1c2VkIHJlZ25vIGFzIGFuIGluZGV4IHdoZW4gaXQgc2hvdWxkIGhhdmUgYmVlbiByZWdpLCB0aHVzIHVzaW5nCisJLTEgYXMgYW4gaW5kZXggaW4gc29tZSBjYXNlcy4KKworU3VuIEF1ZyAzMCAxODoxNToxNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jLCBkZW1hbmdsZS5oOiAgTW92ZWQgdG8gLi4vbGliaWJlcnR5IGFuZCAuLi9pbmNsdWRlLAorCXJlc3BlY3RpdmVseSwgc28gc2FtZSBkZW1hbmdsZXIgY2FuIGJlIHVzZWQgYnkgb3RoZXIgcHJvZ3JhbXMuCisJKiBNYWtlZmlsZS5pbjogIFJlbW92ZSBkZW1hbmdsZXIgc3R1ZmYuCisJKiBNYWtlZmlsZS5pbiAoZGVwZW5kKTogIFBhc3MgLUkuLi9yZWFkbGluZSAobmVlZGVkIGZvciBtYWluLmMpLgorCSogZGVtYW5nbGUuYyAoX2luaXRpYWxpemVfZGVtYW5nbGVyKTogIFRlbGwgZGVtYW5nbGVyIHdoaWNoCisJQ1BMVVNfTUFSS0VSIHRvIGFzc3VtZS4KKworRnJpIEF1ZyAyOCAxMzoxMzozMyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCVJTLzYwMDAgcG9ydGFiaWxpdHkgY2hhbmdlcyAoZm9yIGhvc3RpbmcgY3Jvc3MtZGVidWdnZXJzKS4KKworCSogYnJlYWtwb2ludC5jIChmaXh1cF9icmVha3BvaW50cyk6ICBSZS1rbHVkZ2UgdG8gSUJNNjAwMF9UQVJHRVQuCisJKiBidWlsZHN5bS5jLCByczYwMDAteGRlcC5jLCByczYwMDAtdGRlcC5jLCB0bS1yczYwMDAuaCwgCisJeGNvZmZleGVjLmMsIHhjb2ZmcmVhZC5jOiAgUmVuYW1lIGFpeGNvZmYgdG8geGNvZmYgZXZlcnl3aGVyZS4KKwkqIHByaW50Y21kLmMgKHByaW50X2ZyYW1lX2FyZ3MpOiAgUmVtb3ZlIGFuIFJTLzYwMDAgZGVwZW5kZW5jeS4KKwkqIHN0YWJzcmVhZC5jIChkZWZpbmVfc3ltYm9sKTogIFJlbW92ZSBSUy82MDAwIGRlcGVuZGVuY2llcy4KKwkqIHRtLXJzNjAwMC5oIChBVFRBQ0hfREVUQUNIKTogIFJlbW92ZTogaG9zdC1kZXBlbmRlbnQuCisJKFBUUkFDRV9BVFRBQ0gsIFBUUkFDRV9ERVRBQ0gpOiAgUmVtb3ZlOiBob3N0LWRlcC4KKwkoTk9fU0lOR0xFX1NURVApOiAgQWRkLCB0YXJnZXQtZGVwZW5kZW50LgorCShsb2FkaW5mb3RleHRpbmRleCk6ICBMb3dlcmNhc2UsIHJlbW92ZSAiYWl4XyIuCisJKiB4bS1yczYwMDAuaDogIEFkZCA8c3lzL3B0cmFjZS5oPiBmb3IgaW5mcHRyYWNlLmMuCisJKE5PX1NJTkdMRV9TVEVQKTogIFJlbW92ZSwgdGFyZ2V0LWRlcGVuZGVudC4KKwkqIHhjb2ZmZXhlYy5jICh2bWFwX3N5bXRhYik6ICBDbGVhbnVwICNpZiAwJ2QgY29kZS4KKwkqIHhjb2ZmcmVhZC5jOiAgT25seSBidWlsZCBmaWxlIGlmIFJTLzYwMDAgbmF0aXZlIEdEQi4KKwkoYnVpbGRfZnVuY3Rpb25fc3ltYm9sKTogIFJlbW92ZSAjaWYgMCdkIGNvZGUuCisJKiByczYwMDAtdGRlcC5jOiAgQ2xlYW51cC4gIEFkZCBzdGF0aWMgZm4gcHJvdG9zLgorCVVzZSBDT1JFX0FERFIgZm9yIGFkZHJlc3NlcyB0aHJvdWdob3V0LiAgTWFrZSB2b2lkIGZucyB2b2lkLgorCShwb3BfZHVtbXlfZnJhbWUpOiAgQWRkIEZJWE1FIGFib3V0IGJvZ29zaXR5IG9mIGRlc2lnbiBoZXJlLgorCShyczYwMDBfc3RydWN0X3JldHVybl9hZGRyZXNzKTogIERpdHRvLgorCShmcmFtZWxlc3NfZnVuY3Rpb25faW52b2NhdGlvbiwgZnJhbWVfZ2V0X2NhY2hlX2ZzciwKKwlmcmFtZV9pbml0aWFsX3N0YWNrX2FkZHJlc3MsIHhjb2ZmX3JlbG9jYXRlX3N5bXRhYiwKKwl4Y29mZl9pbml0X2xvYWRpbmZvLCBmcmVlX2xvYWRpbmZvLCB4Y29mZl9hZGRfdG9jX3RvX2xvYWRpbmZvLAorCWFkZF90ZXh0X3RvX2xvYWRpbmZvLCBmaW5kX3RvY19hZGRyZXNzKTogIE1vdmUgZnJvbSB4ZGVwIGZpbGUuCisJVXNlIENPUkVfQUREUnMuICBDaGFuZ2UgaWRlbnRpZmllcnMgdG8gbG93ZXJjYXNlLgorCisJKiByczYwMDAteGRlcC5jOiAgTWFrZSB3aG9sZSBmaWxlIGNvbmRpdGlvbmFsIG9uIG5hdGl2ZSBSUy82MDAwLAorCXN1cHBseWluZyBkdW1teSByb3V0aW5lcyBpZiBub24tbmF0aXZlLiAgQWRkIHByb3RvdHlwZSBmb3IKKwlzdGF0aWMgZXhlY19vbmVfZHVtbXlfaW5zbi4gIE1vdmUgYSBtZXNzIG9mIGZ1bmN0aW9ucyB0bworCXJzNjAwMC10ZGVwLmMgKGFzIGFib3ZlKS4gIFJlbW92ZSAjaWYgMCdkIGNvZGUuCisKKwkqIGNvbmZpZy9yczYwMDAubWggKFhERVBGSUxFUyk6ICBNb3ZlIHhjb2ZmZXhlYy5vIHRvIHRhcmdldCBzaWRlLgorCShYTV9DTElCUyk6ICBBZGQgLWxtIHRvIGNpcmN1bXZlbnQgQUlYIDMuMiBsaWJjIGxkZXhwIGJ1Zy4KKwkqIGNvbmZpZy9yczYwMDAubXQgKFRERVBGSUxFUyk6ICBBZG9wdCB4Y29mZmV4ZWMuby4KKworCSogZ2RidHlwZXMuaCAoVFlQRV9BTExPQyk6ICBQYXJlbnRoZXNpemUgcmVzdWx0IHRvIGF2b2lkIHByb2JsZW1zCisJZm9yIGNhbGxlcnMuCisKKwkqIHZ4LXNoYXJlL1JFQURNRSwgbmluZHktc2hhcmUvUkVBRE1FOiAgTmV3IGZpbGVzIGRlc2NyaWJpbmcKKwlob3cgdGhlc2UgZGlyZWN0b3JpZXMnIGNvZGUgaXMgc2hhcmVkLCBhbmQgd2l0aCB3aG9tLgorCitUaHUgQXVnIDI3IDIwOjA0OjU2IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKHRhcmdldCBjb25maWd1cmF0aW9ucyk6ICBSZWZvcm1hdCBpbnRvIHRhYmxlLgorCVJlbW92ZSB1bnN1cHAuIEFtaWdhZG9zIGhvc3QgYW5kIHRhcmdldC4gIERpdHRvIE1hY2ggMzg2IHRhcmdldC4KKworCSogdG0tYWx0b3NnYXMuaCwgdG0taTM4NnYtZy5oOiAgUmVtb3ZlIGFuY2llbnQgY29mZiBlbmNhcCBjb25maWdzLgorCSogY29uZmlnL3thbHRvc2dhcy5tdCwgaTM4NnYtZy5tdCwgaTM4NnYzMi1nLm10fTogIERpdHRvLgorCSogY29uZmlnL3tpMzg2c2NvLm10LGkzODZ2MzIubXR9OiAgUmVtb3ZlOyBpZGVudGljYWwgdG8gaTM4NnYubXQuCisJKiBjb25maWcve2dvMzIubXQsaTk2MC5tdH06ICBSZW1vdmU7IHRoZXkgb25seSBwcmludGVkIGVycm9yIG1zZ3MuCisJKiBjb25maWcvbmluZHk5NjAubXQ6ICBSZW1vdmUgdXNlbGVzcyBNVF9DRkxBR1Mgc2V0dGluZy4KKwkqIGNvbmZpZy9pMzg2YW91dC5tdDogIFVzZSB0bS1pMzg2di5oLCBub3QgdG0taTM4NnYtZy5oLgorCisJKiBNYWtlZmlsZS5pbiAoY29uZmlnLWNoZWNrKTogIEFkZCBjb21tYW5kIHRvIGNoZWNrIHdoZXRoZXIKKwljb25maWd1cmUuaW4gaXMgY29uc2lzdGVudCB3aXRoIGNvbmZpZy8qLgorCitXZWQgQXVnIDI2IDIxOjEwOjUyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKGhvc3QgY29uZmlndXJhdGlvbnMpOiAgUmVmb3JtYXQgbmVzdGVkIGNhc2VzIGludG8KKwllYXN5LXRvLW1haW50YWluIHRhYmxlLgorCShtNjhrLWFsdG9zLSosIGkzODZ2Kik6ICBXZSBkb24ndCBjYXJlIHdoZXRoZXIgY29mZiBlbmNhcCBpcyB1c2VkLgorCWNvbmZpZy97YWx0b3NnYXMubWgsIGkzODZ2LWcubWgsIGkzODZ2MzItZy5taH06ICBSZW1vdmUuCisKK1dlZCBBdWcgMjYgMTY6MDI6MDEgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jOiAgUmVvcmRlciBhcmdzIHRvIG1vc3QgbG9jYWwgZnVuY3Rpb25zIHRvIG1ha2UgdGhlbQorCWZvbGxvdyB0aGUgY29uc2lzdGVudCBwYXR0ZXJuIG9mIHN0cnVjdCB3b3JrX3N0dWZmIHBvaW50ZXIgZmlyc3QsCisJZm9sbG93ZWQgYnkgcG9pbnRlciBpbnRvIHN0cmluZyBiZWluZyBkZW1hbmdsZWQsIGZvbGxvd2VkIGJ5CisJcG9pbnRlciB0byB0aGUgc3RyaW5nIHdoZXJlIHRoZSByZXN1bHQgaXMgYmVpbmcgc3RvcmVkLCBmb2xsb3dlZAorCWJ5IG90aGVyIGFyZ3MuICBBbHNvIGdlbmVyYWxseSByZXBsYWNlIG1vc3QgdmFyaWFibGVzIG9mIG5hbWUKKwkidHlwZSIgd2l0aCAibWFuZ2xlZCIgZm9yIGNvbnNpc3RlbmN5LiAgVGhleSBhbGwgcG9pbnRlZCB0byB0aGUKKwlzYW1lIHN0cmluZyBidXQgaGFsZiB3ZXJlIG9uZSBuYW1lIGFuZCBoYWxmIHRoZSBvdGhlci4KKwkqIGNwbHVzLWRlbS5jIChMT05HRVJOQU1FUyk6ICBSZW1vdmUgI2lmbmRlZidzLgorCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3F1YWxpZmllZCk6ICBSZXdyaXRlIHRvIGNsZWFuIHVwIGFuZCBhbGxvdworCXVzZSB3aGVuZXZlciBhIHF1YWxpZmllZCBuYW1lIGlzIGJlaW5nIGRlbWFuZ2xlZC4KKwkqIGNwbHVzLWRlbS5jIChkb190eXBlKTogIFF1YWxpZmllZCBuYW1lcyBhcmUgdHJlYXRlZCBzaW1pbGFybHkKKwl0byBmdW5kYW1lbnRhbCB0eXBlcywgbm90IGFzIG1vZGlmaWVycyBvZiBmdW5kYW1lbnRhbCB0eXBlcy4JCisKK01vbiBBdWcgMjQgMjA6NDQ6MzggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgQWRkIHNwYXJjbGl0ZSBhcyBhIHRhcmdldC4KKworCSogc3BhcmMtc3R1Yi5jIChoYW5kbGVfZXhjZXB0aW9uKTogIEZsdXNoIGluc3RydWN0aW9uIGNhY2hlIGp1c3QKKwliZWZvcmUgcmV0dXJuaW5nIHRvIHRoZSB1c2VyLiAgKGhleFRvSW50KTogIEZpeCBvdmVyemVhbG91cyBjbGVhbnVwLgorCitNb24gQXVnIDI0IDExOjU3OjEzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBpbmZydW4uYyAoaGFuZGxlX2NvbW1hbmQpOiAgUmV3cml0ZSB0byBhbGxvdyBtdWx0aXBsZSBzaWduYWwKKwludW1iZXJzLCBzaWduYWwgbnVtYmVyIHJhbmdlcywgYW5kIHRvIHJlY29nbml6ZSAiYWxsIiB0byBtZWFuIGFsbAorCXNpZ25hbHMgZXhjZXB0IHRob3NlIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLgorCSogaW5mcnVuLmMgKFNFVF9TSUdTLCBVTlNFVF9TSUdTKTogIE1hY3JvcyB1c2VkIGluIGhhbmRsZV9jb21tYW5kCisJdG8gc2V0IG9yIHJlc2V0IGFjdGlvbnMgZm9yIHNwZWNpZmljIHNpZ25hbHMuCisKK1N1biBBdWcgMjMgMTc6MTA6MDcgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNvZmZyZWFkLmMgKGRlY29kZV90eXBlKTogIENhbGwgYWxsb2NfdHlwZSB0byBhbGxvYyBuZXcKKwl0eXBlcy4KKwkqIHN0YWJzcmVhZC5jIChyZWFkX2FycmF5X3R5cGUsIHJlYWRfcmFuZ2VfdHlwZSwgZGVmaW5lX3N5bWJvbCk6CisJQ2FsbCBhbGxvY190eXBlIHRvIGFsbG9jIG5ldyB0eXBlcy4KKwkqIHN0YWJzcmVhZC5jIChkZWZpbmVfc3ltYm9sKTogIE1vdmUgZGJsX3ZhbHUgc3ltYm9sIGZpZWxkIGRhdGEKKwlmcm9tIHR5cGVfb2JzdGFjayB0byBzeW1ib2xfb2JzdGFjay4KKwkqIHN0YWJzcmVhZC5jIChkZWZpbmVfc3ltYm9sKTogIE1vdmUgdHlwZWRlZl9zeW0gZnJvbSB0eXBlX29ic3RhY2sKKwl0byBzeW1ib2xfb2JzdGFjay4KKwkqIGdkYnR5cGVzLmggKFRZUEVfQUxMT0MpOiAgTmV3IG1hY3JvIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBkYXRhCisJYXNzb2NpYXRlZCB3aXRoIGEgdHlwZSwgdXNpbmcgdGhlIHNhbWUgbWVjaGFuaXNtIGFzIHdhcyB1c2VkIHRvCisJYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSB0eXBlIHN0cnVjdHVyZSBpdHNlbGYuCisJKiBjb2ZmcmVhZC5jIChwYXRjaF90eXBlLCBjb2ZmX3JlYWRfc3RydWN0X3R5cGUsCisJY29mZl9yZWFkX2VudW1fdHlwZSk6ICBVc2UgVFlQRV9BTExPQy4KKwkqIGR3YXJmcmVhZC5jIChzdHJ1Y3RfdHlwZSk6ICBVc2UgVFlQRV9BTExPQy4KKwkqIGdkYnR5cGVzLmMgKGNyZWF0ZV9hcnJheV90eXBlLCBjaGVja19zdHViX21ldGhvZCwgCisJYWxsb2NhdGVfY3BsdXNfc3RydWN0X3R5cGUpOiAgVXNlIFRZUEVfQUxMT0MuCisJKiBtaXBzcmVhZC5jIChwYXJzZV9zeW1ib2wsIHBhcnNlX3R5cGUpOiAgVXNlIFRZUEVfQUxMT0MuCisJKiBzdGFic3JlYWQuYyAocmVhZF9zdHJ1Y3RfdHlwZSwgcmVhZF9hcnJheV90eXBlLCByZWFkX2VudW1fdHlwZSwKKwlyZWFkX3JhbmdlX3R5cGUpOiAgVXNlIFRZUEVfQUxMT0MuCisKK1N1biBBdWcgMjMgMTE6MDQ6MDggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGJyZWFrcG9pbnQuYyAoYnJlYWtwb2ludF9yZV9zZXQpOiAgU2VsZWN0IGEgZGVmYXVsdCBzb3VyY2UKKwlzeW10YWIgaWYgb25lIGlzIG5vdCBjdXJyZW50bHkgc2VsZWN0ZWQuCisJKiB1dGlscy5jIChxdWVyeSk6ICBDYWxsIHdyYXBfaGVyZSBiZWZvcmUgYnVpbGRpbmcgdGhlIG91dHB1dAorCXF1ZXJ5IHN0cmluZywgdG8gdHVybiBvZmYgd3JhcHBpbmcgYW5kIGZsdXNoIGFueSBidWZmZXJlZCBvdXRwdXQuCisJT3RoZXJ3aXNlIG91ciBxdWVyeSBtYXkgZW5kIHVwIGluIHRoZSB3cmFwIGJ1ZmZlciBhbmQgbmV2ZXIgYmUKKwlzZWVuIGJ5IHRoZSB1c2VyLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiAgUmVwb3J0IGVycm9yIHdoZW4gYXR0ZW1wdGluZyB0bworCWV2YWx1YXRlIHN1YnNjcmlwdCBmb3IgdHlwZXMgd2l0aG91dCBhIHRhcmdldCB0eXBlLCByYXRoZXIKKwl0aGFuIGR1bXBpbmcgY29yZSBieSB1c2luZyB0aGUgTlVMTCBwb2ludGVyLgorCSogc3ltZmlsZS5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogIEZvcmdldCBjdXJyZW50X3NvdXJjZV9zeW10YWIKKwlhbmQgY3VycmVudF9zb3VyY2VfbGluZSB3aGVuIGRpc2NhcmRpbmcgc3ltYm9sIHRhYmxlLgorCitTYXQgQXVnIDIyIDIyOjMzOjIwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJQnVnIGZpeGVzIGZyb20gQW5kcmV3IEhleWJleSA8YXRoQGxjcy5taXQuZWR1Pi4KKworCSogdG0tbWlwcy5oIChSRUdJU1RFUl9WSVJUVUFMX1RZUEUpOiAgRmxvYXQgcmVncyBhcmUgZmxvYXQgdHlwZS4KKwkqIG1pcHMtdGRlcC5jIChtaXBzX3ByaW50X3JlZ2lzdGVyKTogIEFsbG9jIGVub3VnaCBzcGFjZSBmb3IgdHdvIHJlZ3MuCisKK0ZyaSBBdWcgMjEgMTU6MTc6MDMgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLmMgKHJlbW90ZV9vcGVuKTogIEZpeCBiYXVkIHJhdGUgc2V0dGluZyB0byBtYWtlIC1iIGZsYWcKKwl3b3JrLiAgKHJlbW90ZV93YWl0KTogIENoYW5nZSAnVCcgbWVzc2FnZSBwYXJzZXIgdG8gZGVhbCB3aXRoIG5ldworCWltcHJvdmVkIGZvcm1hdCB3aGljaCBhbGxvd3Mgc3R1YiB0byBzZW5kIGFuIGFyYml0cmFyeSBidW5jaCBvZgorCXJlZ2lzdGVycy4KKwkqIHNwYXJjLXN0dWIuYzogIEdlbmVyYWwgY2xlYW51cHMuICAodHJhcF9sb3csIGhhbmRsZV9leGNlcHRpb24pOgorCW1ha2UgYWxsIHRoaXMgcmUtZW50cmFudCBieSBzdG9yaW5nIGFsbCBzdGF0ZSBvbiB0aGUgc3RhY2suICBDbGVhbgorCXVwIG1lbW9yeSBlcnJvciB0cmFwcGluZy4gIChjb21wdXRlU2lnbmFsLCBzZXRfZGVidWdfdHJhcHMpOgorCW1ha2UgaXQgYWxsIHRhYmxlIGRyaXZlbi4gIE1ha2UgYSBzdGFydCBhdCBhIGJhdWQgcmF0ZSBzZXR0aW5nIGNvbW1hbmQuCisKK1dlZCBBdWcgMTkgMTA6MjM6MjcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBtNjhrLXBpbnNuLmM6IGhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlICdyJywgaW50cm9kdWNlZCBmb3IgY2FzMi4KKworCSogcmVtb3RlLXZ4LmM6IHJlZGVmaW5lIG1hbGxvYyB0byBhdm9pZCBidWdneSBkZWNsYXJhdGlvbiBvbgorCVJTLzYwMDAgPHJwYy90eXBlcy5oPi4KKwl4bS1yczYwMDAuaDogaW5jbHVkZSA8c3lzL3NlbGVjdC5oPiB0byBkZWZpbmUgZmRfc2V0IGZvcgorCTxycGMvc3ZjLmg+IG9uIFJTLzYwMDAuCisKK1R1ZSBBdWcgMTggMTQ6NDg6MjQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisgCSogTWFrZWZpbGUuaW46IGFkZGVkIEZMQUdTX1RPX1BBU1MgdmFyaWFibGUsIGFuZCBwYXNzZWQgaXQgdG8KKwlyZWN1cnNpdmUgaW52b2NhdGlvbnMgb2YgbWFrZS4gIEFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uCisJZGlyZWN0b3JpZXMuCisKK01vbiBBdWcgMTcgMTg6Mjk6NTggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBtNjhrLXBpbnNuLmM6ICBNaW5vciBmaXggaW4gc3R5bGUgb2Ygb3V0cHV0IChkb24ndCB1c2UKKwlyYW5nZSB0byBpbmRpY2F0ZSBmbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVycykuCisKK1NhdCBBdWcgMTUgMDI6NTg6MDMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIG02OGstcGluc24uYzogIFN1cnJvdW5kIGV4dGVuZGVkIHN1cHBvcnQgd2l0aCAjaWZkZWYgSEFWRV82ODg4MS4KKworCSogaW5mY21kLmMgKHJlZ2lzdGVyc19pbmZvKTogIEhhbmRsZSBtdWx0aXBsZSByZWdpc3RlciBuYW1lcy4KKwlDaGFuZ2VzIGluc3BpcmVkIGJ5IFJvbGFuZCBNY0dyYXRoLgorCitTYXQgQXVnIDE1IDAyOjI4OjUyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIHNwYXJjLXN0dWIuYzogIE5ldyBmaWxlLiAgTWl4IGl0IHdpdGggeW91ciBTUEFSQ2xpdGUKKwlhcHBsaWNhdGlvbiwgYW5kIGl0IHdpbGwgc3BlYWsgR0RCIHJlbW90ZSBwcm90b2NvbCEKKwkqIHJlbW90ZS5jIChyZW1vdGVfd2FpdCk6ICBDaGFuZ2UgJ1QnIChleHBlZGl0ZWQgcmVwbHkpIG1lc3NhZ2UgdG8KKwlkZWFsIHdpdGggYXJiaXRyYXJ5IHJlZ2lzdGVycy4gIE5lZWRlZCBmb3Igc3BhcmMtc3R1Yi4KKworRnJpIEF1ZyAxNCAxMjoxMToyNSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmMgKGNwbHVzX21hcmtlcnMpOiAgQWRkIHRhYmxlIGZvciBnbnUgc3R5bGUgYW5kCisJdXNlIHRocm91Z2hvdXQsIGluIHBsYWNlIG9mIGNvbXBpbGUgdGltZSBjb25zdGFudCBDUExVU19NQVJLRVIuCisJKiBjcGx1cy1kZW0uYyAoQVJNX1ZUQUJMRV9TVFJJTkcsIEFSTV9WVEFCTEVfU1RSTEVOKTogIEFkZC4KKwkqIGNwbHVzLWRlbS5jIChjZnJvbnRfc3BlY2lhbCk6ICBOZXcgZnVuY3Rpb24sIGFzIHN1Z2dlc3RlZAorCWJ5IHBmaWVsYW5kQHN0cmF0dXMuY29tLgorCSogY3BsdXMtZGVtLmMgKGZvcmdldF90eXBlcyk6ICBOZXcgZnVuY3Rpb24uCisJKiBjcGx1cy1kZW0uYyAoY3BsdXNfZGVtYW5nbGUpOiAgQ2FsbCBnbnVfc3BlY2lhbCwgbW92ZWQgZnJvbQorCWRlbWFuZ2xlX3ByZWZpeCgpLgorCSogY3BsdXMtZGVtLmMgKG1vcF91cCk6ICBDYWxsIGZvcmdldF90eXBlcygpLgorCSogY3BsdXMtZGVtLmMgKEFVVE9fREVNQU5HTElORywgR05VX0RFTUFOR0xJTkcsIExVQ0lEX0RFTUFOR0xJTkcpOgorCVVzZSB0aHJvdWdob3V0LCBpbnN0ZWFkIG9mIGNoZWNraW5nIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZS4KKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9zaWduYXR1cmUpOiAgV2hlbiBmaW5kaW5nIGFuIGV4cGxpY2l0CisJc3RhcnQgb2YgZnVuY3Rpb24gYXJncywgZm9yZ2V0IGFsbCByZW1lbWJlcmVkIHR5cGVzIGZvcgorCWx1Y2lkL2Nmcm9udCBzdHlsZSBkZW1hbmdsaW5nLgorCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCk6ICBJbiBhIHNlcXVlbmNlIG9mIHR3byBvciBtb3JlCisJdW5kZXJiYXIgY2hhcmFjdGVycywgdXNlIGxhc3QgcGFpciBhcyB0aGUgZGVsaW1pdGVyLiAgSG9pc3QKKwlnbnVfc3BlY2lhbCgpIGNhbGwgdXAgdG8gY3BsdXNfZGVtYW5nbGUoKS4gIENhbGwgY2Zyb250X3NwZWNpYWwoKQorCXdoZW4gYXBwcm9wcmlhdGUuCisJKiBjcGx1cy1kZW0uYyAoY3BsdXNfc3BlY2lhbCk6ICBGaXggdmlydHVhbCB0YWJsZSBuYW1lIGRlbWFuZ2xpbmcKKwlmb3IgaW5oZXJpdGVkIGNsYXNzZXMuCQorCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2FyZ3MpOiAgRG9jdW1lbnQgcXVpcmtzIG9mIG51bWJlcmVkCisJcmVmZXJlbmNlcyB0byBwcmV2aW91c2x5IHNlZW4gdHlwZXMuCisJKiBkYnhyZWFkLmMgKHJlYWRfb2ZpbGVfc3ltdGFiLCBwcm9jZXNzX29uZV9zeW1ib2wpOgorCVVzZSBBVVRPX0RFTUFOR0xJTkcgcmF0aGVyIHRoYW4gZXhwbGljaXRseSBjaGVja2luZworCWN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZS4KKwkqIGRlbWFuZ2xlLmg6ICBBZGQgc29tZSBjb21tZW50cy4KKwkqIGRlbWFuZ2xlLmggKEFVVE9fREVNQU5HTElORywgR05VX0RFTUFOR0xJTkcsIExVQ0lEX0RFTUFOR0xJTkcsCisJQ0ZST05UX0RFTUFOR0xJTkcpOiAgTmV3IG1hY3Jvcy4KKwkqIGR3YXJmcmVhZC5jIChMQ0NfUFJPRFVDRVIpOiAgUmVtb3ZlIHRyYWlsaW5nIHNwYWNlLCB3aGljaCBpcworCW5vdCBmb3VuZCBpbiB0aGUgYWN0dWFsIHByb2R1Y2VyIHN0cmluZyBwcm9kdWNlZCBieSBsY2MuCisJKiBkd2FyZnJlYWQuYyAoaGFuZGxlX3Byb2R1Y2VyKTogIFVzZSBBVVRPX0RFTUFOR0xJTkcgcmF0aGVyCisJdGhhbiBleHBsaWNpdGx5IGNoZWNraW5nIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZS4KKworVGh1IEF1ZyAxMyAxMTo1NDo0NiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jIChlbmFibGVfbG9uZ2ptcF9icmVha3BvaW50LAorCWRpc2FibGVfbG9uZ2ptcF9icmVha3BvaW50LCBzZXRfbG9uZ2ptcF9yZXN1bWVfYnJlYWtwb2ludCk6CisJQ2hlY2sgZm9yIGR1cGxpY2F0ZSBicmVha3BvaW50cyBhdCB0aGUgc2FtZSBhZGRyZXNzLiAgQnVnIHJlcG9ydAorCWFuZCBwcmVsaW1pbmFyeSBmaXggZnJvbSBEYXZlIE1vcnJpc29uLCA8ZHJtb3JyaXNAdXMub3JhY2xlLmNvbT4uCisKK1dlZCBBdWcgMTIgMTE6MTQ6NTggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGJ1aWxkc3ltLmMgKGVuZF9zeW10YWIpOiAgRG9jdW1lbnQgdGhhdCBlbmRfc3ltdGFiIGNhbiByZXR1cm4KKwlOVUxMIHVuZGVyIG5vbi1lcnJvciBjb25kaXRpb25zLgorCSogZHdhcmZyZWFkLmMgKHJlYWRfZmlsZV9zY29wZSk6ICBHdWFyZCBhZ2FpbnN0IGRlcmVmZXJlbmNpbmcgTlVMTAorCXJldHVybmVkIGZyb20gZW5kX3N5bXRhYiBmb3IgZW1wdHkgY29tcGlsYXRpb24gdW5pdHMuCisKK1R1ZSBBdWcgMTEgMDI6NDk6MzkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGFtMjlrLXRkZXAuYzogIExpbnQgZnJvbSBERUNzdGF0aW9uIGNvbXBpbGVyLgorCSogbWVtLWJyZWFrLmM6ICBSZXN0b3JlIHRlc3Qgb2YgQlJFQUtQT0lOVCBzaXplIHRoYXQgRnJlZCByZW1vdmVkLgorCUFzIHRoZSBtYW4gcGFnZSBzYXlzLCAiU29tZXRpbWVzIHlvdSBqdXN0IGNhbid0IGdldCBsaW50IHRvIHNodXQKKwl1cCIuICBUaGF0IGRvZXNuJ3QgbWVhbiB5b3Ugc2hvdWxkIGJsb3cgYXdheSB0aGUgY29kZSBpdCB3b24ndAorCXNodXQgdXAgYWJvdXQuCisJKiBtaXBzLXhkZXAuYzogIFJldmlzZSBzdHViYmluZy1vdXQgb2YgY29kZSB1bnRpbCBSaWNoIGNsZWFucworCWl0IHVwIG92ZXIgdGhlIG5leHQgZmV3IHdlZWtzLiAgTWFrZSBtaXBzIHggMjlrIGJ1aWxkLgorCSogdG0tMjlrLmggKENBTExfRFVNTVkpOiAgTWFrZSBpdCB3b3JrIG9uIGNyb3NzLWVuZGlhbiBob3N0cy4KKwkoRklYX0NBTExfRFVNTVkpOiAgQ29tbWVudCBpbiB0aGUgcGF0Y2hpbmcgb2YgdGhlIGJyZWFrcG9pbnQsCisJYnV0IGxlYXZlIGl0IGFzIGEgY29tbWVudCBiZWNhdXNlIHRoZSBicmVha3BvaW50IGluc3RydWN0aW9uIAorCWlzIG5vdCBlYXNpbHkgYWNjZXNzaWJsZSBhdCB0aGlzIG1vbWVudCAoaXQncyBzdGF0aWMsIGFuZCBpZgorCXdlIGRlZmluZSBvbmUgaGVyZSwgaXQgZ29lcyBpbnRvIGV2ZXJ5IGZpbGUgY29tcGlsZWQpLgorCitNb24gQXVnIDEwIDIyOjI3OjE5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICBCdW1wIHRvIDQuNi4zLgorCSogZHdhcmZyZWFkLmMgKHNjYW5fcGFydGlhbF9zeW1ib2xzKTogIFNraXAgb3ZlciBESUUncyB3aXRoaW4KKwlmdW5jdGlvbiBzY29wZXMgd2hlbiBidWlsZGluZyBwYXJ0aWFsIHN5bWJvbCB0YWJsZXMuCisJKiBvYmpmaWxlcy5jIChvcGVuX2V4aXN0aW5nX21hcHBlZF9maWxlKTogIE1ha2UgaXQgY2xlYXIgaW4KKwl3YXJuaW5nIG1lc3NhZ2UgdGhhdCBvdXQgb2YgZGF0ZSBtYXBwZWQgZmlsZXMgYXJlIGlnbm9yZWQuCisJKiBzeW10YWIuYyAobG9va3VwX3N5bXRhYl8xLCBsb29rdXBfc3ltYm9sKTogIFByaW50IGNvbXBpbGF0aW9uCisJdW5pdCBzb3VyY2UgZmlsZSBuYW1lIGluIGVycm9yIG1lc3NhZ2UuCisKK1NhdCBBdWcgIDggMjM6MTI6MjIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGR3YXJmcmVhZC5jIChzdHJ1Y3QgZGllaW5mbyk6ICBBZGQgaGFzX2F0X2J5dGVfc2l6ZS4KKwkqIGR3YXJmcmVhZC5jIChzdHJ1Y3RfdHlwZSk6ICBJbiBhYnNlbmNlIG9mIEFUX2J5dGVfc2l6ZSBmb3IKKwliaXRmaWVsZCwgdXNlIHNpemUgb2Ygb2JqZWN0IG9mIG1lbWJlcidzIHR5cGUgZm9yIHRoZSBzaXplIG9mCisJdGhlIGFub255bW91cyBvYmplY3QgY29udGFpbmluZyB0aGUgYml0IGZpZWxkLgorCSogZHdhcmZyZWFkLmMgKGNvbXBsZXRlZGllaW5mbyk6ICBTZXQgaGFzX2F0X2J5dGVfc2l6ZSB3aGVuCisJYW4gQVRfYnl0ZV9zaXplIGF0dHJpYnV0ZSBpcyBzZWVuLgorCSogbWlwc3JlYWQuYyAocHN5bXRhYl90b19zeW10YWJfMSk6ICBGaXggbWlzc3BlbGxlZCBjYXN0IHRvCisJdW5pb24gYXV4X2V4dCAod2FzIGF1eF9lbnQpLgorCSogaTM4Ni1waW5zbi5jIChwcmludF9pbnNuKTogIENhc3QgMiduZCBhcmcgdG8gcmVhZF9tZW1vcnkgZnJvbQorCXVuc2lnbmVkIGNoYXIqIHRvIGNoYXIqLCBmb3IgTHVjaWQgY29tcGlsZXIuCisJKiBpMzg2LXRkZXAuYyAoY29kZXN0cmVhbV9maWxsKTogIEZpeCBjYXN0IG9mIDInbmQgYXJnIHRvIHJlYWRfbWVtb3J5CisJdG8gYmUgY29ycmVjdCB0eXBlIChmcm9tIHVuc2lnbmVkIGNoYXIqIHRvIGNoYXIqKS4KKwkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfZGVyaXZhdGlvbl9pbmZvKTogIE1pbm9yIHR3ZWFrIHRvIHBsYWNlbWVudAorCW9mIGNvbW1hcyBpbiBkZXJpdmVkIGNsYXNzIHByaW50aW5nLgorCSogeGNvZmZyZWFkLmMgKGJ1aWx0aW5fdHlwZSk6ICBGaXggbWlzc3BlbGxpbmcgaW4gZmF0YWwgbWVzc2FnZS4KKworRnJpIEF1ZyAgNyAxMToxODoyMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogeG0tZ28zMi5oOiBEZWZpbmUgTFNFRUtfTk9UX0xJTkVBUgorCSogc291cmNlLmMgKGZpbmRfc291cmNlX2xpbmVzKTogaWYgTFNFRUtfTk9UX0xJTkVBUiBpcyBkZWZpbmVkCisJdGhlbiB3b3JrIG91dCB0aGUgbHNlZWsgcG9zaXRpb25zIG9mIG5ld2xpbmVzIGJ5IHJ1bm5pbmcgdGhyb3VnaAorCXRoZSBmaWxlIGFuZCBgdGVsbCdpbmcuICBUaGlzIG1ha2VzIHNvdXJjZSBmaWxlIGxpc3Rpbmcgd29yayBvbgorCU9TJ3Mgd2hlcmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBoeXNpY2FsIHBvc2l0aW9uIGluIGZpbGUgYW5kCisJY2Fub25pY2FsIHBvc2l0aW9uIGlzIGluZGV0ZXJtaW5hdGUsIGVnIFZNUyBhbmQgRE9TLgorCitUaHUgQXVnICA2IDEwOjU2OjAxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBzdGFic3JlYWQuYzogIEVuc3VyZSB0aGF0IGFsbCBtZW1iZXJzIG9mIGFsbCBhbGxvY2F0ZWQgc3RydWN0dXJlcworCWFyZSBpbml0aWFsaXplZCB0byBrbm93biBzdGF0ZSB0byBhdm9pZCBoYXJkIHRvIGZpbmQgYnVncyB3aXRoIGdkYgorCXVzaW5nIGZpZWxkcyBjb250YWluaW5nIHJhbmRvbSBkYXRhLgorCSogYnVpbGRzeW0uYyAoc3RhcnRfc3ViZmlsZSk6ICBDb21wYWN0IGRpcm5hbWUgaW5pdGlhbGl6YXRpb24uCisJKiBidWlsZHN5bS5jIChwYXRjaF9zdWJmaWxlX25hbWVzKTogIE5ldyBmdW5jdGlvbi4KKwkqIGJ1aWxkc3ltLmMgKGVuZF9zeW10YWIpOiAgTWFrZSBjb3B5IG9mIGRpcm5hbWUgb24gc3ltYm9sIG9ic3RhY2suCisJKiBidWlsZHN5bS5jIChlbmRfc3ltdGFiKTogIEZyZWUgYWxsIG1hbGxvYydkIHN1YmZpbGUgZmllbGRzLgorCSogYnVpbGRzeW0uaCAocGF0Y2hfc3ViZmlsZV9uYW1lcyk6ICBBZGQgcHJvdG90eXBlLgorCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpOiAgQ2FsbCBwYXRjaF9zdWJmaWxlX25hbWVzLgorCitXZWQgQXVnICA1IDAxOjQyOjQwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiByZW1vdGUtdWRpLmM6ICBVcGRhdGUgY29tbWVudHMuCisKKwkqIHJlbW90ZS5jIChnZXRwa3QpOiAgT25seSBmb3JjZSByZXRyYW5zbWlzc2lvbiB0ZW4gdGltZXM7CisJYWZ0ZXIgdGhhdCwgYXNzdW1lIGJ1ZyBpbiB0YXJnZXQgY29kZSwgYW5kIGhhbmRsZSBwa3QgYW55d2F5LgorCitNb24gQXVnICAzIDE3OjA2OjIwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIEFkZCBzdXBwb3J0IGZvciBhcG9sbG8gNjhrIHVuZGVyIEJTRCBlbnZpcm9ubWVudC4KKwkqIHhtLWFwb2xsbzY4Yi5oOiAgTmV3IGZpbGUgdG8gc3VwcG9ydCBhYm92ZS4KKworTW9uIEF1ZyAgMyAwMDoyNTo1NiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIGk0ODYgaG9zdCBjcHUuCisJKiB2YWxwcmludC5jICh0eXBlX3ByaW50X2Rlcml2YXRpb25faW5mbyk6ICBQcmludCBkZXJpdmF0aW9uIGluZm8KKwlpbiBzYW1lIGZvcm0gYXMgY2xhc3MgZGVjbGFyYXRpb25zIGluIHNvdXJjZS4KKwkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfdmFyc3BlY19zdWZmaXgpOiAgU3BsaXQgYXJnIHByaW50aW5nCisJY29kZSBvdXQgdG8gdHlwZV9wcmludF9hcmdzIGZ1bmN0aW9uLgorCQorU2F0IEF1ZyAgMSAxMzozMjo1OCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZHdhcmZyZWFkLmMgKHN0cnVjdCBkaWVpbmZvKTogIFJlbW92ZSBvYnNvbGV0ZSBhdF92aXNpYmlsaXR5LCAKKwlhdF9pbXBvcnQsIGF0X2ZyYW1lX2Jhc2UuCisJKiBkd2FyZnJlYWQuYyAoY29tcGxldGVkaWVpbmZvKTogIFJlbW92ZSBjYXNlcyBmb3Igb2Jzb2xldGUKKwlBVF92aXNpYmlsaXR5LCBBVF9pbXBvcnQsIGFuZCBBVF9mcmFtZV9iYXNlIGF0dHJpYnV0ZXMuCisJKiBicmVha3BvaW50LmggKEJSRUFLUE9JTlRfTUFYKTogIEluY3JlYXNlIGZyb20gMTAgdG8gMTYgZm9yCisJaTg2MCwgd2hpY2ggY2FuIGtlZXAgdXAgdG8gNCBzaGFkb3cgYnJlYWtwb2ludHMuCisJKiB0bS1zdHJhdHVzLmggKFVTRyk6ICBEZWZpbmUuCisJKiB0bS1zdHJhdHVzLmggKFRBUkdFVF9CWVRFX09SREVSKTogIERlZmluZSB0byBCSUdfRU5ESUFOLgorCSogeG0tc3RyYXR1cy5oIChIT1NUX0JZVEVfT1JERVIpOiAgRGVmaW5lIHRvIEJJR19FTkRJQU4uCisJKiB4bS1zdHJhdHVzLmggKHhtLXN5c3Y0LmgpOiAgSW5jbHVkZSwgbmFtZSBjaGFuZ2VkIGZyb20geG0tc3ZyNC5oLgorCSogeG0tc3RyYXR1cy5oIChOT19KT0JfQ09OVFJPTCk6ICBSZW1vdmUgZGVmaW5lLgorCSogY29uZmlnL3N0cmF0dXMubXQgKFRERVBGSUxFUyk6ICBJbmNsdWRlIGZpbGVzIGF2YWlsYWJsZSBmcm9tCisJc3RyYXR1cyB0aGF0IGFyZSBub3QgeWV0IGluIHJlbGVhc2UgcGVuZGluZyByZWNlaXB0IG9mIHBhcGVyd29yaworCWF0IEZTRi4KKwkqIGJ1aWxkc3ltLmMgKGZpbmlzaF9ibG9jayk6ICBNaW5vciBjb2RlIGZvcm1hdCBjaGFuZ2UuCisJKiBnZGJ0eXBlcy5oIChzdHJ1Y3QgZmllbGQpOiAgQWRkIHRvIGNvbW1lbnRzLgorCSogZ2RidHlwZXMuaCAodmlydHVhbF9maWVsZF9iaXRzKTogIEFkZCB0byBjb21tZW50cy4KKwkqIG9iamZpbGVzLmMgKGFsbG9jYXRlX29iamZpbGUpOiAgQ2hhbmdlIG9ic3RhY2sgaW50ZXJmYWNlIHRvCisJbWF0Y2ggRlNGIG1lcmdpbmcgZWZmb3J0cy4KKworTW9uIEp1bCAyNyAyMToxNDo0NCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiAgQnVtcCB0byA0LjYuMi4KKwkqIE1ha2VmaWxlLmluIChTRklMRVNfTUFJTkRJUik6ICBBZGQgc3RhYnNyZWFkLmMKKwkqIE1ha2VmaWxlLmluIChPQlMpOiAgQWRkIHN0YWJzcmVhZC5vCisJKiBNYWtlZmlsZS5pbiAoc3RhYnNyZWFkLm8pOiAgQWRkIGJ1aWxkIHJ1bGUuCisJKiBzdGFic3JlYWQuYywgc3RhYnNyZWFkLmg6ICBOZXcgZmlsZXMuCisJKiBidWlsZHN5bS5jOiAgU3BsaXQgb3V0IHN0YWJzIHNwZWNpZmljIHN1cHBvcnQgdG8gc3RhYnNyZWFkLmMuCisJKiBidWlsZHN5bS5oOiAgU3BsaXQgb3V0IHN0YWJzIHNwZWNpZmljIHN1cHBvcnQgdG8gc3RhYnNyZWFkLmguCisJKiBkYnhyZWFkLmMgKHN0YWJzcmVhZC5oKTogIEluY2x1ZGUKKwkqIGRieHJlYWQuYyAoZGJ4X25ld19pbml0KTogIENhbGwgc3RhYnNyZWFkX25ld19pbml0LgorCSogZGJ4cmVhZC5jIChkYnhfcHN5bXRhYl90b19zeW10YWJfMSk6ICBDYWxsIHN0YWJzcmVhZF9pbml0LgorCSogZGJ4cmVhZC5jIChyZWFkX29maWxlX3N5bXRhYik6ICBDYWxsIGVuZF9zdGFicy4KKwkqIGRieHJlYWQuYyAocHJvY2Vzc19vbmVfc3ltYm9sKTogIENhbGwgZW5kX3N0YWJzIGFuZCBzdGFydF9zdGFicy4KKwkqIGRieHJlYWQuYyAoZWxmc3RhYl9idWlsZF9wc3ltdGFicyk6ICBDYWxsIHN0YWJzcmVhZF9uZXdfaW5pdC4KKwkqIGR3YXJmcmVhZC5jIChwc3ltdGFiX3RvX3N5bXRhYl8xKTogIENhbGwgYnVpbGRzeW1faW5pdCwgYWRkCisJcmVhbGx5X2ZyZWVfcGVuZGluZ3MgdG8gY2xlYW51cHMuCisJKiBlbGZyZWFkLmMgKGVsZl9uZXdfaW5pdCk6ICBDYWxsIHN0YWJzcmVhZF9uZXdfaW5pdC4KKwkqIGdkYnR5cGVzLmM6ICBTbWFsbCBjaGFuZ2VzIHRvIG1haW50ZW5hbmNlIGNvbW1hbmRzLgorCSogbWlwc3JlYWQuYyAoc3RhYnNyZWFkLmgpOiAgSW5jbHVkZS4KKwkqIG1pcHNyZWFkLmMgKHBzeW10YWJfdG9fc3ltdGFiXzEpOiAgQ2FsbCBlbmRfc3RhYnMuCisJKiB4Y29mZnJlYWQuYyAoc3RhYnNyZWFkLmgpOiAgSW5jbHVkZS4KKwkqIHhjb2ZmcmVhZC5jIChnbG9iYWxfc3RhYnMpOiAgUmVtb3ZlIHJlZHVuZGFudCBkZWYuCisJKiB4Y29mZnJlYWQuYyAocmVhZF94Y29mZl9zeW10YWIpOiAgQ2FsbCBzdGFydF9zdGFicyBhbmQgZW5kX3N0YWJzLgorCitXZWQgSnVsIDIyIDIxOjM5OjMzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBsbW9kZV9pbmZlcmlvcl92YWxpZCwgbG1vZGVfb3Vyc192YWxpZDogIE5ldyBzdGF0aWMgdmFycy4KKwkqIGluZmxvdy5jICh0ZXJtaW5hbF9pbml0X2luZmVyaW9yLCB0ZXJtaW5hbF9pbmZlcmlvciwKKwl0ZXJtaW5hbF9vdXJzXzEsIGluaXRpYWxpemVfaW5mbG93KTogIFJlY29yZCBhbmQgdXNlIHN0YXRlCisJb2YgbG1vZGVfaW5mZXJpb3JfdmFsaWQgYW5kIGxtb2RlX291cnNfdmFsaWQuCisKK1dlZCBKdWwgMjIgMDQ6MjM6MDMgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQorCisJKiBlczE4MDAuYzogdXNlIEZSRUFEfEZXUklURSByYXRoZXIgdGhhbiBfRlJFQUR8X0ZXUklURS4KKwlpbmNsdWRlIDxzZ3R0eS5oPiBvbiBVU0cuICAoZnJvbSBzZWYpLgorCisJKiBkZXBlbmQ6IGVzMTgwMCBkZXBlbmRlbmN5IG5lZWRlZCBoZXJlLgorCitNb24gSnVsIDIwIDIxOjA5OjUzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBidWlsZHN5bS5jIChyZWFkX3N0cnVjdF90eXBlKTogIEluaXRpYWxpemUgc3RydWN0cyBhbGxvY2F0ZWQKKwl3aXRoIGFsbG9jYSwgdG8gYXZvaWQgdXNpbmcgcmFuZG9tIHZhbHVlcyBmcm9tIHN0YWNrIGxhdGVyIG9uLgorCSogZGVmcy5oIChmcHJpbnRmX2ZpbHRlcmVkKTogIEFkZCBwcm90b3R5cGUuCisJKiBnZGJ0eXBlcy5jIChjaGVja19zdHViX21ldGhvZCk6ICBGaXggbWlzbGVhZGluZyBjb21tZW50cy4KKwkqIGdkYnR5cGVzLmMgKHByaW50X2FyZ190eXBlcywgZHVtcF9mbl9maWVsZGxpc3RzKTogIE5ldyBtYWludAorCXN1cHBvcnQgZnVuY3Rpb25zLgorCSogZ2RidHlwZXMuYyAocHJpbnRfY3BsdXNfc3R1ZmYsIHJlY3Vyc2l2ZV9kdW1wX3R5cGUpOiAgTWFueQorCXNtYWxsIGNoYW5nZXMgdG8gbWFpbnQgc3VwcG9ydCBmdW5jdGlvbnMuCisJKiBnZGJ0eXBlcy5oIChjcGx1c19zdHJ1Y3RfdHlwZSk6ICBSZW9yZ2FuaXplIG1lbWJlciBvcmRlcmluZworCWZvciBzb21lIGZpZWxkcyBhbmQgZXhwYW5kIGNvbW1lbnRzLgorCSogb2JqZmlsZXMuYyAoYWxsb2NhdGVfb2JqZmlsZSk6ICBVc2UgbmV3IG9ic3RhY2tfYWxsb2NfYXJnCisJbWFjcm8gYW5kIHRyYWNrIGNoYW5nZSB0byBvYnN0YWNrX2Z1bGxfYmVnaW4gbWFjcm8uCisJKiB1dGlscy5jIChmcHJpbnRmaV9maWx0ZXJlZCk6ICBOZXcgZnVuY3Rpb24uCisJKiB2YWxwcmludC5jICh0eXBlX3ByaW50X2Jhc2UpOiAgRml4dXAgZmllbGQgcHJpbnRpbmcgdG8gbm90CisJcHJpbnQgZXh0cmFuZW91cyBsaW5lcyBhbmQgbm90IHByaW50IGJvZ3VzICJubyBkYXRhIGZpZWxkcyIKKwltZXNzYWdlcyBmb3IgQysrIGNsYXNzZXMgd2l0aCBubyBkYXRhIG1lbWJlcnMuICBBbHNvIHVzZSBuZXcKKwlmcHJpbnRmaV9maWx0ZXJlZCBmdW5jdGlvbi4KKworTW9uIEp1bCAyMCAxMToyNToxOCAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogZXMxODAwIG9rIGZvciA2ODAwMCB0b28uCisKK1NhdCBKdWwgMTggMTU6NDg6NTggMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IGVjaG8gZXJyb3IgbWVzc2FnZXMgdG8gc3RkZXJyLCBub3Qgc3Rkb3V0CisKK0ZyaSBKdWwgMTcgMTc6MDc6MjQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBocHBhKiBpbnN0ZWFkIG9mIGhwcGEKKworRnJpIEp1bCAxNyAxNjo1MjowNCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBlbmVyZ2l6ZS5jOiAgU2Vjb25kIGN1dCBhdCBEeW5hbWljTG9hZCBtZXNzYWdlIGhhbmRsaW5nLgorCisJKiBlbmVyZ2l6ZS5jOiAgUmVsYXRpdml6ZSBwYXRobmFtZXMgaW4gI2luY2x1ZGUgc3RhdGVtZW50cy4KKwkqIChrZXJuZWxfZGlzcGF0Y2gpOiAgQmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvciB1bmtub3duIHByb3RvY29sCisJbWVzc2FnZXMuCisJKiAoa2VybmVsX2Rpc3BhdGNoKTogIEZpcnN0IGN1dCBhdCBEeW5hbWljTG9hZCBtZXNzYWdlIGhhbmRsaW5nLgorCisJKiBNYWtlZmlsZS5pbjogIFJlbW92ZSAtSS4uL3JlYWRsaW5lIGZyb20gYWxsIGNvbXBpbGF0aW9ucywKKwlpbmNsdWRlIGEgc3BlY2lhbCBjYXNlIGZvciBtYWluLm8gaW5zdGVhZC4KKworRnJpIEp1bCAxNyAxMDoxNDo1NiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiAgQXNrIGxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGUgdG8gY2FsbAorCWVycm9yIGlmIGl0IGZhaWxzIHRvIGZpbmQgYSBtZW1iZXIgdHlwZSwgcmF0aGVyIHRoYW4gcmV0dXJuIE5VTEwKKwlhbmQgdHJpZ2dlciBhIGNvcmVkdW1wLgorCSogc3ltdGFiLmMgKGxvb2t1cF9zeW1ib2wsIGxvb2t1cF9kZW1hbmdsZWRfYmxvY2tfc3ltYm9sLAorCWxvb2t1cF9kZW1hbmdsZWRfcGFydGlhbF9zeW1ib2wsKTogIEFzayBkZW1hbmdsZV9hbmRfbWF0Y2ggdG8KKwltYXRjaCBvbiBjb21wbGV0ZSBkZW1hbmdsaW5ncywgaW5jbHVkaW5nIGFyZ3VtZW50IGxpc3RzIGZvciBtZW1iZXIKKwlmdW5jdGlvbnMsIHJhdGhlciB0aGFuIGp1c3QgYWNjZXB0aW5nIHRoZSBmaXJzdCBkZW1hbmdsaW5nIHRoYXQKKwltYXRjaGVzIHRoZSBjbGFzcyBhbmQgZnVuY3Rpb24gbmFtZS4KKwkqIGR3YXJmcmVhZC5jIChyZWFkX2ZpbGVfc2NvcGUpOiAgUGFzcyBjb250ZW50cyBvZiBBVF9jb21wX2RpcgorCXRvIHN0YXJ0X3N5bXRhYiBhcyB0aGUgZGlyZWN0b3J5IG5hbWUuCisJKiBkd2FyZnJlYWQuYyAoY29tcGxldGVkaWVpbmZvKTogIFN0cmlwIG9mZiBhbnkgbGVhZGluZyBob3N0bmFtZQorCXBvcnRpb24gb2YgdGhlIEFUX2NvbXBfZGlyIGF0dHJpYnV0ZSBzdHJpbmcuICBHZGIgZG9lc24ndCBrbm93CisJd2hhdCB0byBkbyB3aXRoIHRoZW0gKEZJWE1FKS4KKworVGh1IEp1bCAxNiAxMzozNzowOSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBicmVha3BvaW50LmMgKGNvbW1hbmRzX2NvbW1hbmQpOiAgU2ltcGxpZnkgY29kZSBhIGJpdCwgcmVtb3ZlCisJdW5uZWNlc3NhcnkgZmZsdXNoKCkuCisKKwkqIE1ha2VmaWxlLmluIChPVEhFUlMpOiAgQWRkIGdjYy5wYXRjaC4KKwkqIHBhcnRpYWwtc3RhYi5oIChOX1NPKTogIEZpeCBoYW5kbGluZyBvZiByZWR1bmRhbnQgU09zIChhZ2Fpbi4uLikKKworVGh1IEp1bCAxNiAxMjowNzo0MCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZHdhcmZyZWFkLmMgKExDQ19QUk9EVUNFUik6ICBDaGFuZ2UgdG8gbWF0Y2ggY3VycmVudCBOQ1IKKwlsY2MgcHJvZHVjZXIgc3RyaW5nLgorCitUaHUgSnVsIDE2IDExOjQwOjU1IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIFdIQVRTLk5FVyByZW5hbWVkIHRvIE5FV1MuCisKK1dlZCBKdWwgMTUgMTE6Mzc6MzEgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGRieHJlYWQuYywgZHdhcmZyZWFkLmM6ICBSZS1lbmFibGUgZXhwZXJpbWVudGFsIGNvZGUgdG8KKwlhdXRvbWF0aWNhbGx5IHNlbGVjdCBkZW1hbmdsaW5nIHN0eWxlLgorCSogZGVtYW5nbGUuYyAoREVGQVVMVF9ERU1BTkdMSU5HX1NUWUxFKTogIFJlbmFtZSBmcm9tIHNpbXBseQorCURFTUFOR0xJTkdfU1RZTEUsIHRvIG1ha2UgbW9yZSBkZXNjcmlwdGl2ZS4gIFJldmVydCBiYWNrIHRvCisJImF1dG8iIGFzIGRlZmF1bHQuICBDb21tZW50IHVzZS4KKwkqIE1ha2VmaWxlLmluIChERU1BTkdMSU5HX1NUWUxFLCBERU1BTkdMRV9PUFRTKTogIFJlbW92ZS4KKwkqIE1ha2VmaWxlLmluICgke0RFTUFOR0xFUn0ubykgUmVtb3ZlIHRhcmdldCBhbmQgc3BlY2lhbAorCWNvbXBpbGF0aW9uIHJ1bGUuCisKK1R1ZSBKdWwgMTQgMjM6MDU6MTQgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIEJ1bXAgdG8gNC42LjEgKHBvc3QtcmVsZWFzZSB2ZXJzaW9ucykuCisKK1R1ZSBKdWwgMTQgMTk6MjY6NTQgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIGRlbWFuZ2xlLmM6ICBDaGFuZ2UgZGVmYXVsdCBkZW1hbmdsaW5nIHN0eWxlIHRvCisJZ251LgorCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgdmVyc2lvbiB0byA0LjYgISEhCisJKiBSRUFETUUsIFdIQVRTLk5FVzogIFVwZGF0ZSBmb3IgNC42LgorCitUdWUgSnVsIDE0IDE2OjU5OjQ2IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQorCisJKiBpOTYwLXRkZXAuYyAoZnJhbWVfYXJnc19hZGRyZXNzKTogSWYgYXJnIHBvaW50ZXIgY2FuJ3QgYmUgZm91bmQsCisJdXNlIGZyYW1lIGFkZHJlc3MuCisKKwkqIGJ1aWxkc3ltLmMgKHJlYWRfc3RydWN0X3R5cGUpOiBEb24ndCBkaWUgb24gVFlQRV9DT0RFX1VOREVGCisJbm9kZXMgYXMgYmFzZSBjbGFzc2VzLgorCitUdWUgSnVsIDE0IDAwOjEyOjMwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGFsbGRlcHMubWFrLCBkZXBlbmQ6ICBVcGRhdGUuCisKKwkqIHhjb2ZmcmVhZC5jOiAgQWRkIGRlY2wgZm9yIHNlY3Rpb25fb2Zmc2V0IHRvIGtlZXAgcHJvdG90eXBlIGhhcHB5LgorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICA0LjUuOS4KKworCSogeG0taHAzMDBic2QuaDogIEFkZCBkZWNsIGZvciBzdHJkdXAoKS4KKwkqIG1pcHMtdGRlcC5jIChoZXVyaXN0aWNfcHJvY19kZXNjKTogIEZpbGwgaW4gcHJvYyBzdGFydCBhZGRyIGluCisJUERSLiAgQ2xlYW51cCBhIGZldyB0aGluZ3MsIGZpeCBjb21waWxhdGlvbiB3YXJuaW5ncy4KKworTW9uIEp1bCAxMyAxOTowNjo1NCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKERFTUFOR0xJTkdfU1RZTEUpOiAgTmV3IGRlZmluZSB0byBzZXQgZGVmYXVsdAorCWRlbWFuZ2xpbmcgc3R5bGUgZm9yIEMrKy4gIERlZmF1bHRzIHRvICJhdXRvIi4KKwkqIE1ha2VmaWxlLmluIChERU1BTkdMRV9PUFRTKTogIFVzZSBERU1BTkdMSU5HX1NUWUxFLgorCSogTWFrZWZpbGUuaW4gKFNGSUxFU19NQUlORElSKTogIEFkZCBkZW1hbmdsZS5jCisJKiBNYWtlZmlsZS5pbiAoT0JTKTogIEFkZCBkZW1hbmdsZS5vCisJKiBjcGx1cy1kZW0uYyAoR05VX0RFTUFOR0xJTkcsIEFSTV9ERU1BTkdMSU5HLCBMVUNJRF9ERU1BTkdMSU5HKToKKwlSZW1vdmUgY29tcGlsZSB0aW1lIGRlY2lzaW9ucyBhYm91dCBkZW1hbmdsaW5nIHN0eWxlIGFuZCByZXBsYWNlCisJd2l0aCBydW50aW1lIGRlY2lzaW9ucyB1c2luZyBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUuCisJKiBjcGx1cy1kZW0uYyAobWFpbik6ICBFeHBhbmQgY29kZSBpbmNsdWRlZCBkdXJpbmcgYnVpbGRpbmcgb2YKKwlzdGFuZGFsb25lIGRlbWFuZ2xlciB0byByZWNvZ25pemUgZGVtYW5nbGluZyBzdHlsZSBvcHRpb25zLgorCSogZGJ4cmVhZC5jIChkZW1hbmdsZS5oKTogIEluY2x1ZGUuCisJKiBkYnhyZWFkLmMgKHJlYWRfb2ZpbGVfc3ltdGFiLCBwcm9jZXNzX29uZV9zeW1ib2wpOiAgU2V0IEdOVSBDKysKKwlkZW1hbmdsaW5nIHN0eWxlIGlmIHByb2Nlc3NpbmcgZysrIGNvZGUgYW5kIGN1cnJlbnQgZGVtYW5nbGluZyBzdHlsZQorCWlzIGF1dG8gKE5vdGU6IHRoaXMgZmVhdHVyZSBjdXJyZW50bHkgZGlzYWJsZWQuKQorCSogZGVtYW5nbGUuYzogIE5ldyBmaWxlLCBnZW5lcmljIGRlbWFuZ2xpbmcgY29udHJvbC4KKwkqIGRlbWFuZ2xlLmggKGRlbWFuZ2xpbmdfc3R5bGVzKTogIE5ldyBlbnVtZXJhdGlvbiB0byBzZWxlY3Qgb25lCisJb2Ygc2V2ZXJhbCBkZW1hbmdsaW5nIHN0eWxlcy4gIEFsc28gZGVmaW5lIHN0cmluZyBuYW1lcyBmb3IgZWFjaAorCXN0eWxlLgorCSogZGVtYW5nbGUuaCAoc2V0X2RlbWFuZ2xpbmdfc3R5bGUpOiAgQWRkIHByb3RvdHlwZS4KKwkqIGR3YXJmcmVhZC5jIChkZW1hbmdsZS5oKTogIEluY2x1ZGUuCisJKiBkd2FyZnJlYWQuYyAoR1BMVVNfUFJPRFVDRVIsIExDQ19QUk9EVUNFUiwgQ0ZST05UX1BST0RVQ0VSKToKKwlOZXcgcHJvZHVjZXIgc3RyaW5nIHByZWZpeGVzIHRvIHJlY29nbml6ZS4KKwkqIGR3YXJmcmVhZC5jIChoYW5kbGVfcHJvZHVjZXIpOiAgQ29uc29saWRhdGUgYWN0aW9ucyBmb3Igc3BlY2lmaWMKKwlwcm9kdWNlcnMuICBTZXQgZGVtYW5nbGluZyBzdHlsZSBiYXNlZCBvbiBwcm9kdWNlciBzdHJpbmcgaWYKKwljdXJyZW50IHN0eWxlIGlzIGF1dG8uICAoTm90ZTogdGhpcyBmZWF0dXJlIGN1cnJlbnRseSBkaXNhYmxlZC4pCisJKiBjb25maWcvbmNyMzAwMC5tdCAoREVNQU5HTEVfT1BUUyk6ICBSZW1vdmUuCisKK1NhdCBKdWwgMTEgMTg6MjM6NTggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9zdW40c29sMi5taDogIFJlbW92ZSAteHMgZmxhZywgZGVmYXVsdCBJTlNUQUxMIHRvIGNwLgorCitGcmkgSnVsIDEwIDEzOjU4OjM0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogZ2RidHlwZXMuYywgZ2RidHlwZXMuaDogIE5ldyBmdW5jdGlvbiBsb29rdXBfc2lnbmVkX3R5cGVuYW1lLgorCSogYy1leHAueTogIENhbGwgbG9va3VwX3NpZ25lZF90eXBlbmFtZSgpIGFmdGVyIHNlZWluZworCSJzaWduZWQiLiAgVGhpcyBoYW5kbGVzICJzaWduZWQgY2hhciIgY29ycmVjdGx5LgorCSogYy1leHAueTogIFJlY29nbml6ZSAoYnV0IGlnbm9yZSkgJ2NvbnN0JyBhbmQgJ3ZvbGF0aWxlJworCWtleXdvcmRzIGJlZm9yZSBhIHR5cGUgc3BlY2lmaWVyLgorCitGcmkgSnVsIDEwIDEwOjE5OjUyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb21tYW5kLmMgKGxvb2t1cF9jbWRfMSk6ICBDbGFyaWZ5IGRlc2NyaXB0aXZlIGNvbW1lbnRzLgorCSogZ2RiY21kLmggKG1haW50ZW5hbmNlcHJpbnRsaXN0KTogIEFkZCBkZWNsYXJhdGlvbi4KKwkqIG1haW4uYyAobWFpbnRlbmFuY2VwcmludGxpc3QpOiAgQWRkIGRlZmluaXRpb24uCisJKiBtYWluLmMgKGdkYl9jb21wbGV0ZXJfY29tbWFuZF93b3JkX2JyZWFrX2NoYXJhY3RlcnMpOiAgQWRkLgorCSogbWFpbi5jIChzeW1ib2xfY29tcGxldGlvbl9mdW5jdGlvbik6ICBTd2l0Y2ggY29tcGxldGVyIHdvcmQKKwlicmVhayBjaGFyYWN0ZXIgc2V0cyBkeW5hbWljYWxseSwgYmFzZWQgb24gd2hldGhlciBjb21wbGV0aW9uIGlzCisJYmVpbmcgZG9uZSBvbiBjb21tYW5kcyBvciBvbiBzb21ldGhpbmcgZWxzZS4KKwkqIG1haW4uYyAoaW5pdGlhbGl6ZV9jbWRfbGlzdHMpOiAgSW5pdCBtYWludGVuYW5jZXByaW50bGlzdC4KKwkqIG1haW50LmM6ICBJbmNsdWRlIGRlbWFuZ2xlLmguCisJKiBtYWludC5jIChtYWludGVuYW5jZV9kZW1hbmdsZSk6ICBOZXcgZnVuY3Rpb24uCisJKiBtYWludC5jIChtYWludGVuYW5jZV9wcmludF9jb21tYW5kKTogIE5ldyBmdW5jdGlvbi4KKwkqIG1haW50LmMgKF9pbml0aWFsaXplX21haW50X2NtZHMpOiAgUmVvcmdhbml6ZSBzb21lIGNvbW1hbmRzCisJdW5kZXIgbmV3IG1haW50ZW5hbmNlIHByaW50IHN1YmNvbW1hbmQuCisKK1RodSBKdWwgIDkgMTk6MDU6MjcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBnZGJ0eXBlcy5jIChsb29rdXBfc3RydWN0X2VsdF90eXBlKTogIElmIHRoZSBpbnB1dCB0eXBlIGlzCisJVFlQRV9DT0RFX1BUUiBvciBUWVBFX0NPREVfUkVGLCBkZXJlZmVyZW5jZSBpdCB0byBnZXQgdGhlCisJdGFyZ2V0IHR5cGUuICBPdGhlcndpc2UsICd3aGF0aXMgdGhpcy5maWVsZCcgd291bGRuJ3Qgd29yaywKKwl3aGljaCB3b3VsZCBiZSBpbmNvbnNpc3RlbnQsIHNpbmNlICdwcmludCB0aGlzLmZpZWxkJyB3b3Jrcy4KKwkqIGJ1aWxkc3ltLmMgKHJlYWRfc3RydWN0X3R5cGUsIHJlYWRfZW51bV90eXBlKTogIENsZWFyCisJVFlQRV9GTEFHX1NUVUIgZmxhZy4KKwkqIGJ1aWxkc3ltLmMgKGNsZWFudXBfdW5kZWZpbmVkX3R5cGVzKTogIERvbid0IHJlbHkgb24gYQorCWZsYXdlZCAiUmVhc29uYWJsZSB0ZXN0IHRvIHNlZSBpZiIgYSB0eXBlIGhhcyBiZWVuIGRlZmluZWQKKwlzaW5jZSBpdCB3YXMgcmVmZXJyZWQgdG87IG5vdyB3ZSBjYW4ganVzdCBzZWUgaWYgdGhlCisJVFlQRV9GTEFHX1NUVUIgZmxhZyBoYXMgYmVlbiBjbGVhcmVkLgorCSogdmFscHJpbnQuYyAocHJpbnRfdHlwZV9iYXNlKTogIEVtaXQgcHVibGljL3Byb3RlY3RlZC9wcml2YXRlCisJbGFiZWxzIGZvciBtZXRob2RzIGFzIHdlbGwgYXMgZmllbGRzLiAgQWxzbywgaW5kZW50IHRoZXNlIGxhYmVscworCTIgc3BhY2VzIGluc3RlYWQgb2YgNCwgZm9yIGEgbW9yZSBjb252ZW50aW9uYWwgImxvb2siLgorCSogc3ltdGFiLmMgKGdkYl9tYW5nbGVfbmFtZSk6ICBVbmRvIEZyZWQncyBjaGFuZ2UsIHVubGVzcworCUdDQ19NQU5HTEVfQlVHIGlzIGRlZmluZWQuICBBbHNvLCBoYW5kbGUgZGVzdHJ1Y3RvcnMgc3BlY2lhbGx5LgorCSogZ2NjLnBhdGNoOiAgTmV3IGZpbGUuICBDb250YWlucyBwYXRjaCBmb3IgZ2NjIChzbyBwZW9wbGUKKwl3aXRoIGdkYi0yLjIueCB3b24ndCBoYXZlIHRvIHdhaXQgZm9yIGEgbmV3IGdjYyByZWxlYXNlKS4KKworVGh1IEp1bCAgOSAxODo0NDoyNiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCSogaTk2MC1waW5zbi5jIChtZW0pOiBWYXJpYWJsZXMgcmVnWzEyM10gc2hvdWxkIHBvaW50IHRvIENPTlNULgorCShwcmludF9hZGRyKTogQ2FsbCBwcmludF9hZGRyZXNzIHRvIHNob3cgc3ltYm9saWMgdmVyc2lvbiBhcyB3ZWxsLgorCisJKiByZW1vdGUtdnguYyAodnhfa2lsbCk6IERvbid0IGxvb2sgZm9yIGFyZ3VtZW50czsgdGhleSBhcmVuJ3QKKwliZWluZyBwYXNzZWQuCisJKHZ4X3JlYWRfcmVnaXN0ZXIpOiBEZWNsYXJlIGluZmVyaW9yX2ZwX3JlZ3MuICBEZWxldGUgY29kZSBmb3IKKwljb3B5aW5nICJpbmZlcmlvcl9yZWdpc3RlcnMiIGFyb3VuZDsgdGhlIHZhbHVlcyBhcmUgYWxyZWFkeSBpbiB2YXIKKwkicmVnaXN0ZXJzIi4gIFVzZSBjb3JyZWN0IHNpemUgZm9yIHJlZ2lzdGVyIHNldC4KKworCSogcmVtb3RlLXZ4LmMgKHZ4X3dyaXRlX3JlZ2lzdGVyKTogRG9uJ3QgdHJ5IHdyaXRpbmcgRlAgcmVnczsgdGhlCisJdGFyZ2V0IGRvZXNuJ3Qgc3VwcG9ydCBpdC4KKwkodnhfcmVhZF9yZWdpc3Rlcik6IERvbid0IHRyeSByZWFkaW5nIHRoZW0gZWl0aGVyLgorCisJKiB0bS1pOTYwLmggKElQX1JFR05VTSk6IE1vdmUgdG8gZW5kIG9mIG5vbi1GUCBsaXN0LCBzaW5jZSB0aGUKKwlWeFdvcmtzIGJhY2sgZW5kIHJlYWRzIHRoZW0gaW4gb25lIGNvbnRpZ3VvdXMgc2V0IGV4Y2VwdCBmb3IgdGhpcworCW9uZS4KKwkocmVnaXN0ZXJfbmFtZXMpOiBDaGFuZ2UgInBjIiB0byAicGN3IiB0byBhdm9pZCBjb25mdXNpb24gcHJpbnRpbmcKKwkiJHBjIi4KKwkqIHRtLXZ4OTYwLmggKFBDX1JFR05VTSk6IFVzZSBSSVBfUkVHTlVNLCBzaW5jZSB0aGF0J3Mgd2hlcmUgd2UKKwlmaW5kIHRoZSBQQyB1bmRlciBWeFdvcmtzLgorCitXZWQgSnVsICA4IDIxOjM0OjMwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBkd2FyZnJlYWQuYyAoYWxsb2NfdXR5cGUsIGRlY29kZV9zdWJzY3JfZGF0YSk6ICBDYWxsIGFsbG9jX3R5cGUKKwl0byBjcmVhdGUgbmV3IGJsYW5rIHR5cGVzLCBpbnN0ZWFkIG9mIGhhbmRjcmFmdGluZyB0aGVtLgorCSogZGVmcy5oIChwcmludGZpX2ZpbHRlcmVkKTogIEFkZCBwcm90b3R5cGUuCisJKiB1dGlscy5jIChwcmludGZpX2ZpbHRlcmVkKTogIE5ldyBmdW5jdGlvbi4KKwkqIGdkYnR5cGVzLmMgKHJlY3Vyc2l2ZV9kdW1wX3R5cGUpOiAgVXNlIHByaW50ZmlfZmlsdGVyZWQgdG8KKwl0byBzaW1wbGlmeSB0aGUgY29kZS4gIE90aGVyIGNsZWFudXBzLgorCSogZ2RidHlwZXMuYyAoY2hlY2tfc3R1Yl9tZXRob2QpOiAgRGVtYW5nbGUgdXNpbmcgRE1HTF9BTlNJLgorCSogZ2RidHlwZXMuaCAoc3RydWN0IGNwbHVzX3N0cnVjdF90eXBlKTogIEFkZCBjb21tZW50cyBkZXNjcmliaW5nCisJdXNlIG9mIHZhcmlvdXMgZmllbGRzLgorCSogZ2RidHlwZXMuYyAocHJpbnRfYml0X3ZlY3RvciwgcHJpbnRfY3BsdXNfc3R1ZmYpOiAgTmV3IGZ1bmN0aW9ucy4KKwkqIGMtZXhwLnkgKCV0b2tlbik6ICBBZGQgQ0xBU1MgYXMgYSB0b2tlbiBmb3IgQysrLCBhZGQgZ3JhbW1hcgorCXByb2R1Y3Rpb24gdGhhdCBjdXJyZW50bHkgdHJlYXRzIGl0IGV4YWN0bHkgdGhlIHNhbWUgYXMgU1RSVUNULgorCSogYy1leHAueSAoeXlsZXgpOiAgUmVjb2duaXplICJjbGFzcyIgYXMgdG9rZW4gQ0xBU1MuCisJKiBzeW10YWIuYyAoZ2RiX21hbmdsZV9uYW1lKTogIFJld3JpdGUgdG8gbWF0Y2ggY3VycmVudCBnKysgc3RhYnMuCisJKiBzeW10YWIuYyAoZGVjb2RlX2xpbmVfMSk6ICBGaXggdG8gcGFzcyBxdW90ZWQgYXJncyBvbiBkb3duIHRvCisJZ2VuZXJhbCBzeW1ib2wgaGFuZGxpbmcgY29kZS4gIENhbGwgY3BsdXNfbWFuZ2xlX29wbmFtZSB3aXRoCisJRE1HTF9BTlNJLgorCSogc3ltdGFiLmMgKGRlY29kZV9saW5lXzIpOiAgUHJpbnQgZGVtYW5nbGVkIGZ1bmN0aW9uIG5hbWVzIGluCisJYnJlYWtwb2ludCBtZW51cywgaW5zdGVhZCBvZiBqdXN0IGZpbGUgYW5kIGxpbmUgbnVtYmVyLgorCSogc3ltdGFiLmMgKG5hbWVfbWF0Y2gpOiAgQ2FsbCBjcGx1c19kZW1hbmdsZSB3aXRoIERNR0xfQU5TSS4KKwkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfYmFzZSk6ICBQcmludCAiY2xhc3MiIGZvciBDKysgY2xhc3NlcywKKwlyYXRoZXIgdGhhbiAic3RydWN0Ii4gIFByaW50IHNlY3Rpb24gbGFiZWxzIGZvciBwdWJsaWMsIHByb3RlY3RlZAorCWFuZCBwcml2YXRlIG1lbWJlcnMgb2YgQysrIGNsYXNzZXMuCQorCSogdmFsdWVzLmM6ICBJbmNsdWRlIGRlbWFuZ2xlLmguCisJKiB2YWx1ZXMuYyAodmFsdWVfaGVhZG9mKTogIENhbGwgY3BsdXNfZGVtYW5nbGUgd2l0aCBETUdMX0FOU0kuCisKK1dlZCBKdWwgIDggMTc6MjM6MDcgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiAgVXBkYXRlIHRvIDQuNS44LgorCisgV2VkIEp1bCAgOCAwMDoxMTowMiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBkYnhyZWFkLmMgKGRieF9zeW1maWxlX2luaXQpOiAgSW5pdCBzdGFiX3NlY3Rpb25faW5mbyB0byBOVUxMIHRvCisJcHJldmVudCBjcmFzaGVzIHdoZW4gZXhhbWluaW5nIGNyb3NzLXRhcmdldHMuCisJKiBkYnhyZWFkLmMgKHByb2Nlc3Nfb25lX3N5bWJvbCk6ICBJbmNsdWRlIGRpcmVjdG9yeSBuYW1lIHdoZW4KKwljYWxsaW5nIHN0YXJ0X3N1YmZpbGUgZm9yIFNPTCAmIEJJTkNMIHN5bWJvbHMuICBUaGlzIGFsbG93cyBnZGIgdG8KKwlmaW5kIGluY2x1ZGUgZmlsZXMsIGFuZCB5YWNjL2xleCBzb3VyY2VzIHdoZW4gdGhlIGN3ZCBkb2Vzbid0IG1hdGNoCisJdGhhdCBpbiB3aGljaCB0aGUgb2JqZWN0IHdhcyBjb21waWxlZC4KKwkqIG9iamZpbGVzLmggKEFMTF9NU1lNQk9MUyk6ICBEb24ndCBzZWcgZmF1bHQgd2hlbiB0aGVyZSBhcmUgbm8KKwltc3ltYm9scy4KKwkqIHN5bXRhYi5jIChsb29rdXBfc3ltdGFiXzEpOiAgUmV3cml0ZS4gIEl0IG5vdyBoYW5kbGVzIGluY2x1ZGUKKwlmaWxlcy4KKworVHVlIEp1bCAgNyAwOTowMDo0MiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogbWFpbnQuYyAobWFpbnRlbmFuY2VfY29tbWFuZCwgbWFpbnRlbmFuY2VfaW5mb19jb21tYW5kKToKKwlJbnN0YWxsIHdpdGggYWxsb3dfdW5rbm93biBhcyAwIGFuZCBjYWxsIGhlbHBfbGlzdCB0byBzaG93CisJbGlzdCBvZiBwb3NzaWJpbGl0aWVzIHdoZW4gbm8gc3ViY29tbWFuZCBpcyBzcGVjaWZpZWQuCisKK1R1ZSBKdWwgIDcgMDA6MjA6MjkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIEFkZCBtNjhrLWVyaWNzc29uLSouCisJKiByZW1vdGUtZXMxODAwLmMsIHRtLWVzMTgwMC5oLCBjb25maWcvZXMxODAwLm10OiAgTmV3IGZpbGVzLgorCitTdW4gSnVsICA1IDE3OjE3OjE2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBtYWludC5jOiAgTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbiAoU0ZJTEVTX01BSU5ESVIpOiAgQWRkIG5ldyBmaWxlIG1haW50LmMuCisJKiBNYWtlZmlsZS5pbiAoT0JTKTogIEFkZCBuZXcgZmlsZSBtYWludC5vLgorCSogZGVmcy5oIChjb21tYW5kX2NsYXNzKTogIEFkZCBjbGFzc19tYWludGVuYW5jZS4KKwkqIGRlZnMuaCAoTUFJTlRFTkFOQ0VfQ01EUyk6ICBEZWZhdWx0IHRvIGluY2x1ZGluZyBtYWludGVuYW5jZQorCWNvbW1hbmRzLiAgQWxsb3cgZm9yIHRoZW0gKGFuZCBvdGhlciBub25lc3NlbnRpYWwgcGFydHMgb2YgZ2RiKQorCXRvIGJlIHNlbGVjdGl2ZWx5IGxlZnQgb3V0IHVuZGVyIHNwZWNpYWwgY2lyY3Vtc3RhbmNlcy4KKwkqIGdkYnR5cGVzLmMgKHJlY3Vyc2l2ZV9kdW1wX3R5cGUpOiAgTmV3IGZ1bmN0aW9uOyBzdXBwb3J0cworCW1haW50ZW5hbmNlIHByaW50LXR5cGUgY29tbWFuZC4KKwkqIGdkYnR5cGVzLmggKHJlY3Vyc2l2ZV9kdW1wX3R5cGUsIG1haW50ZW5hbmNlX3ByaW50X3R5cGUpOgorCUFkZCBwcm90b3R5cGVzLgorCSogbWFpbi5jIChtYWludGVuYW5jZWxpc3QsIG1haW50ZW5hbmNlaW5mb2xpc3QpOiAgQWRkIG1haW50ZW5hbmNlCisJY29tbWFuZCBsaXN0cy4KKwkqIG1haW4uYyAoaW5pdGlhbGl6ZV9jbWRfbGlzdHMpOiAgRWxpbWluYXRlIHVubmVjZXNzYXJ5IGNhc3RzIG9uCisJaW5pdGlhbGl6ZXJzLiAgQWRkIGluaXRpYWxpemF0aW9ucyBmb3Igc2V0cHJpbnRsaXN0LCBzaG93cHJpbnRsaXN0LAorCXNldGNoZWNrbGlzdCwgc2hvd2NoZWNrbGlzdCwgbWFpbnRlbmFuY2VsaXN0LCBhbmQgbWFpbnRlbmFuY2VpbmZvbGlzdC4KKwkqIHByaW50Y21kLmMgKG1haW50ZW5hbmNlX3ByaW50X3R5cGUpOiAgTmV3IG1haW50ZW5hbmNlIGNtZC4KKwkqIHZhbHByaW50LmMgKHNldHByaW50bGlzdCwgc2hvd3ByaW50bGlzdCk6ICBNb3ZlIHRvIG1haW4uYywgYXMKKwlpbXBsaWVkIGJ5IGNvbW1lbnQgdGhhdCBhbGwgY21kIGxpc3RzIGFyZSBvd25lZCBieSBtYWluLmMuCisJKiBpbmZjbWQuYyAodW5zZXRsaXN0KTogIE1vdmUgdG8gbWFpbi5jLCBhcyBpbXBsaWVkIGJ5IGNvbW1lbnQKKwl0aGF0IGFsbCBjbWQgbGlzdHMgYXJlIG93bmVkIGJ5IG1haW4uYy4KKwkqIGxhbmd1YWdlLmMgKHNldGNoZWNrbGlzdCwgc2hvd2NoZWNrbGlzdCk6ICBNb3ZlIHRvIG1haW4uYywgYXMKKwlpbXBsaWVkIGJ5IGNvbW1lbnQgdGhhdCBhbGwgY21kIGxpc3RzIGFyZSBvd25lZCBieSBtYWluLmMKKwkqIGJyZWFrcG9pbnQuYyAoZW5hYmxlbGlzdCwgZW5hYmxlYnJlYWtsaXN0LCBkaXNhYmxlbGlzdCwgY21kbGlzdCwKKwlkZWxldGVsaXN0KTogIFJlbW92ZSByZWR1bmRhbnQgZGVjbGFyYXRpb25zIChhbHNvIGluIGdkYmNtZC5oKS4KKwkqIHN5bW1pc2MuYyAocHJpbnRzeW1zX2NvbW1hbmQpOiAgTm93IG1haW50ZW5hbmNlX3ByaW50X3N5bWJvbHMuCisJKiBzeW1taXNjLmMgKHByaW50bXN5bXNfY29tbWFuZCk6ICBOb3cgbWFpbnRlbmFuY2VfcHJpbnRfbXN5bWJvbHMuCisJKiBzeW1taXNjLmMgKHByaW50cHN5bXNfY29tbWFuZCk6ICBOb3cgbWFpbnRlbmFuY2VfcHJpbnRfcHN5bWJvbHMuCisJKiBzeW1taXNjLmMgKHByaW50b2JqZmlsZXNfY29tbWFuZCk6ICBOb3cgbWFpbnRlbmFuY2VfcHJpbnRfb2JqZmlsZXMuCisJKiBzeW10YWIuaCAobWFpbnRlbmFuY2VfcHJpbnRfc3ltYm9scywgbWFpbnRlbmFuY2VfcHJpbnRfcHN5bWJvbHMsCisJbWFpbnRlbmFuY2VfcHJpbnRfbXN5bWJvbHMsIG1haW50ZW5hbmNlX3ByaW50X29iamZpbGVzKToKKwlBZGQgcHJvdG90eXBlcy4KKwkqIHN5bW1pc2MuYyAocHJpbnRzeW1zX2NvbW1hbmQsIHByaW50cHN5bXNfY29tbWFuZCwKKwlwcmludG1zeW1zX2NvbW1hbmQsIHByaW50b2JqZmlsZXNfY29tbWFuZCk6ICBSZW1vdmVkIGZyb20KKwlfaW5pdGlhbGl6ZV9zeW1taXNjLgorCSogbWFpbi5jIChkdW1wX21lX2NvbW1hbmQpOiAgTW92ZWQgdG8gbWFpbnQuYyBhbmQgcmVuYW1lZCB0bworCW1haW50ZW5hbmNlX2R1bXBfbWUuCisJKiBicmVha3BvaW50LmMgKGFsbF9icmVha3BvaW50c19pbmZvKTogIFJlbmFtZSB0bworCW1haW50ZW5hbmNlX2luZm9fYnJlYWtwb2ludHMuCisJKiBicmVha3BvaW50LmMgKF9pbml0aWFsaXplX2JyZWFrcG9pbnQpOiAgQ29udmVydCBhZGRfaW5mbyBvZgorCWFsbF9icmVha3BvaW50c19pbmZvIHRvIGFkZCBtYWludGVuYW5jZV9pbmZvX2JyZWFrcG9pbnRzIHRvIHRoZQorCW1haW50ZW5hbmNlaW5mb2xpc3QgaW5zdGVhZC4KKwltYWluLmMgKGluaXRpYWxpemVfbWFpbik6ICBTZXQgdXAgbWFpbnRlbmFuY2UgY2xhc3MgY29tbWFuZHMuCisKK1N1biBKdWwgIDUgMTE6MDM6NTMgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogZW5lcmdpemUtcGF0Y2hlczogIEZpeCBtaW5vciBwcm9ibGVtcyB3aXRoIGJ1aWxkaW5nIGVuZXJnaXplIGxpYi4KKworCSogZW5lcmdpemUtcGF0Y2hlczogIENoYW5nZSBuYW1lcyBvZiBhbGwgY2FkaWxsYWMgcHJvY2VkdXJlIGNhbGxzCisJdG8gYmUgZW5lcmdpemUgcHJvY2VkdXJlIGNhbGxzLiAgU2ltcGxpZnkgbWFueSBob29rcyBieSBtb3ZpbmcKKwl0ZXN0cyBlbmVyZ2l6ZS5jLiAgQ29uZmlndXJlIGVuZXJnaXplLCBhbmQgYnVpbGQgaXQgYXV0b21hdGljYWxseSBub3cuCisKK1N1biBKdWwgIDUgMDk6NDM6MjggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIEJ1bXAgdG8gNC41LjcuCisJKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfYXJncyk6ICBWYWxpZGF0ZSBpbmRleCBmb3IgcHJldmlvdXNseQorCXNlZW4gdHlwZSB0byBndWFyZCBhZ2FpbnN0IGJvZ3VzIHZhbHVlcyBmcm9tIG1hbGZvcm1lZCBtYW5nbGluZ3MuCisJKiB2YWxvcHMuYyAodmFsdWVfc3RydWN0X2VsdF9mb3JfcmVmZXJlbmNlKTogIEd1YXJkIGFnYWluc3QKKwlibGluZGx5IHVzaW5nIE5VTEwgcmV0dXJuIHZhbHVlIGZyb20gbG9va3VwX3N5bWJvbC4KKworU3VuIEp1bCAgNSAwOTo0Njo0MyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBjYWRpbGxhYy5jLCBjYWRpbGxhYy1wYXRjaGVzOiAgUmVuYW1lIHRvIGVuZXJnaXplLmMgYW5kCisJZW5lcmdpemUtcGF0Y2hlcy4gIENoYW5nZSBhbGwgcm91dGluZXMgYW5kIHZhcmlhYmxlcyBuYW1lZAorCSdjYWRpbGxhYyonIHRvICdlbmVyZ2l6ZSonLiAgQ3JlYXRlIG5ldyBmaWxlIGNhbGxlZCBlbmVyZ2l6ZS5oIHRvCisJaG9sZCBhbGwgaW50ZXJmYWNlIGRlY2xhcmF0aW9ucy4KKworCSogZGVibGliL2Nvbm5lY3Rpb24vKjogIE1vdmUgYWxsIG9mIHRoaXMgc3R1ZmYgaW50byBlbmVyZ2l6ZS8sIGJ1dAorCWRlbGV0ZSB1bm5lZWRlZCBmaWxlcy4KKworU3VuIEp1bCAgNSAwMzowNjozOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogdG0tc3lzdjQuaCAoTkFNRVNfSEFWRV9VTkRFUlNDT1JFKTogIFNWUjQgc3lzdGVtcyBkb24ndC4KKworCSogYnVpbGRzeW0uYyAoZmluaXNoX2Jsb2NrKTogIEZpeCB0aGlua28gYGlubmVyIGJsb2NrJyBjb21wbGFpbnRzLgorCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpOiAgUGFyc2UgTl9PUFQgImdjYzJfY29tcGlsZWQuIi4KKwkqIHByb2Nmcy5jIChwcm9jX3NldF9leGVjX3RyYXApOiBTZXQgcnVuLW9uLWxhc3QtY2xvc2UgZmxhZyBvbgorCWNoaWxkIHByb2Nlc3NlcywgdG8gYXZvaWQgZGVhZCBvbmVzICJoYW5naW5nIGFyb3VuZCIgYWZ0ZXIgR0RCIGV4aXRzLgorCShhdHRhY2gpOiBBbHdheXMgc3RvcCB0aGUgcHJvY2VzcyBpZiBpdCBuZWVkcyBpdC4gIFNldCBSTEMgZmxhZworCXdoZW4gYXR0YWNoaW5nIHJ1bm5pbmcgcHJvY2Vzc2VzLCBzbyBpdCB3aWxsIGNvbnRpbnVlIGlmIHdlIGRldGFjaAorCWl0LCBxdWl0LCBvciBhcmUga2lsbGVkLgorCShkZXRhY2gpOiAgQ2xlYXIgZmF1bHRzIGFuZCBzZXQgUkxDIGZsYWcgdG8gbWFrZSBwcm9jZXNzIHJ1bgorCXdoZW4gd2UgY2xvc2UgaXQuCisJKG9wZW5fcHJvY19maWxlKTogIE5ldyBgbW9kZScgYXJndW1lbnQgZm9yIE9fUkRPTkxZIG9yIE9fUkRXUi4KKwlDYWxsZXJzIGNoYW5nZWQuCisJKGluZm9fcHJvYyk6ICBPcGVuIHByb2Nlc3MgT19SRE9OTFksIHNvIHdlIGNhbiBzZWUgYW55IHByb2Nlc3MsCisJZXZlbiB0aG9zZSBjb250cm9sbGVkIGJ5IGRlYnVnZ2Vycy4KKwkqIHRtLXN1bjRzb2wyLmggKFNVTl9GSVhFRF9MQlJBQ19CVUcpOiAgVGhleSBkaWQgKGluIFNvbCAyKS4KKworU2F0IEp1bCAgNCAwMzo0MzozOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCVJlbG9jYXRlIHN5bWJvbHMgdXNpbmcgYW4gYXJyYXkgb2Ygc2VjdGlvbl9vZmZzZXRzLCByYXRoZXIgdGhhbiBhCisJc2luZ2xlIGBhZGRyJyBvciBgb2Zmc2V0Jy4gIFRoaXMgbWFrZXMgU29sYXJpcy0yIHN1cHBvcnQgd29yaywgYW5kCisJcGVybWl0cyBiZXR0ZXIgVnhXb3JrcyAoYW5kIG1heWJlIHhjb2ZmKSBzdXBwb3J0IGxhdGVyLgorCisJKiBzeW10YWIuaCAoc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyk6ICBOZXcgc3RydWN0dXJlIGZvciBrZWVwaW5nCisJYSBzZXQgb2Ygb2Zmc2V0cywgcmF0aGVyIHRoYW4gYSBzaW5nbGUgb25lLgorCShzdHJ1Y3Qgb2JqZmlsZSk6ICBSZXBsYWNlIGFkZHIgd2l0aCBzZWN0aW9uX29mZnNldHMgbWVtYmVyLgorCSogc3ltZmlsZS5oOiAgQWRkIHN5bV9vZmZzZXRzIHRvIHN0cnVjdCBzeW1fZm5zLiAgQ29uZm9ybWluZyBjaGFuZ2VzLgorCSogZ2RiLXN0YWJzLmg6ICBOZXcgaW5jbHVkZSBmaWxlIHdpdGggYHN5bWJvbCB0eXBlIHNwZWNpZmljJworCXBhcmFtZXRlcnMgZm9yIHBzeW10YWJzIGFuZCBvYmpmaWxlcy4KKwkqIE1ha2VmaWxlLmluIChIRklMRVMpOiAgQWRkIGdkYi1zdGFicy5oLgorCSogYnVpbGRzeW0uaCAoc3RhcnRfcHN5bXRhYiwgcHJvY2Vzc19vbmVfc3ltYm9sKTogIEZpeCBwcm90b3R5cGVzLgorCSogY29mZnJlYWQuYzogIENvbmZvcm1pbmcgY2hhbmdlcy4gIEZha2Ugb2Zmc2V0IGFycmF5IGFsd2F5cyAwLgorCSogZGJ4cmVhZC5jOiAgQ29uZm9ybWluZyBjaGFuZ2VzLgorCShzdHJ1Y3QgZGJ4X3N5bWZpbGVfaW5mbyk6ICBNb3ZlIHRvIGdkYi1zdGFicy5oLgorCShzdGFydF9wc3ltdGFiKTogIENhbGwgZWxmc3RhYl9vZmZzZXRfc2VjdGlvbnMgdG8gY2FsY3VsYXRlIGdvb2QKKwlvZmZzZXRzIGZvciB0aGlzIHNvdXJjZSBmaWxlLCBiYXNlZCBvbiB0aGUgRUxGIHN5bWJvbCB0YWJsZSBpbmZvLgorCShyZWFkX29maWxlX3N5bXRhYik6ICBZYW5rIE5fQ0FUQ0gsIHdoaWNoIGlzIGRlYWQuCisJKHByb2Nlc3Nfb25lX3N5bWJvbCwgTl9DQVRDSCk6ICBZYW5rLgorCSgiLCBOX0ZVTiwgTl9GTkFNRSwgTl9GTiwgTl9GTl9TRVEsIE5fU08sIE5fU09MLCBOX0VOVFJZKToKKwlSZWxvY2F0ZSB3aXRoIFNFQ1RfT0ZGX1RFWFQuCisJKCIsIE5fU1RTWU0sIE5fTENTWU0sIE5fUk9TWU0pOiAgR3JvcGUgYXJvdW5kIGluIHRoZSBzdGFiIHN0cmluZworCXRvIGRpc3Rpbmd1aXNoIHJlbG9jYXRhYmxlIGZyb20gYWJzb2x1dGUgc3ltYm9scy4gIFRoZW4sIGlmIG5vdAorCWFic29sdXRlLCBkbzoKKwkoIiwgTl9TVFNZTSwgTl9EU0xJTkUpOiAgU0VDVF9PRkZfREFUQS4KKwkoIiwgTl9MQ1NZTSwgTl9CU0xJTkUpOiAgU0VDVF9PRkZfQlNTLgorCSgiLCBOX1JPU1lNKTogIFNFQ1RfT0ZGX1JPREFUQS4KKwkoZWxmc3RhYl9idWlsZF9wc3ltdGFicyk6ICBDYWxsZXIgaGFzIGFsbG9jYXRlZCBkYnhfc3ltZmlsZV9pbmZvLgorCShkYnhfc3ltZmlsZV9vZmZzZXRzKTogIEFkZCB0byB0cmFuc2xhdGUgYWRkciB0byBvZmZzZXQuCisJKiBkd2FyZnJlYWQuYzogIENvbmZvcm1pbmcgY2hhbmdlcy4gIFNpbmdsZSBvZmZzZXQgY3VycmVudGx5IHVzZWQuCisJKiBlbGZyZWFkLmM6ICBBZGQgdmFyaW91cyBjb21wbGFpbnRzIGFib3V0IGVsZi9zdGFiIHN0dWZmLgorCSNpbmNsdWRlIGdkYi1zdGFicy5oLiAgQ29uZm9ybWluZyBjaGFuZ2VzLCB1c2luZyBhIHNpbmdsZSBvZmZzZXQuCisJKGVsZl9zeW10YWJfcmVhZCk6ICBSZWNvcmQgaW5mbyBmcm9tIEJTRl9GSUxFIHN5bWJvbHMsIGFuZCBsb2NhbAorCXZhcmlhYmxlcyBjYWxsZWQgIkJic3MuYnNzIiwgIkRkYXRhLmRhdGEiLCBhbmQgIkRyb2RhdGEucm9kYXRhIiwKKwlmb3IgbGF0ZXIgdXNlIGluIGJ1aWxkaW5nIHBzeW10YWJzLgorCShlbGZfc3ltZmlsZV9yZWFkKTogIEFsbG9jYXRlIGRieF9zeW1maWxlX2luZm8gaGVyZSwgdG8ga2VlcAorCXRoZSBpbmZvIGNvbGxlY3RlZCBpbiBlbGZfc3ltdGFiX3JlYWQuICBDbGVhbnVwIGNhbGxzIGZyZWVfZWxmaW5mby4KKwkoZnJlZV9lbGZpbmZvKTogIE5ldyBmbiwgZnJlZXMgYWxsIGNoYWluZWQgc3RhYl9zZWN0aW9uX2luZm9zCisJaW4gYW4gb2JqZmlsZSwgYW5kIHphcHMgdGhlIHN0YXJ0LW9mLWNoYWluIHBvaW50ZXIuCisJKGVsZnN0YWJfb2Zmc2V0X3NlY3Rpb25zKTogIE5ldyBmbiwgbG9va3MgaW4gc3RhYl9zZWN0aW9uX2luZm8KKwljaGFpbiB0byBkZXRlcm1pbmUgc2VjdGlvbiBiYXNlcyB0byByZWxvY2F0ZSBhIHBzeW10YWIncyB3b3J0aAorCW9mIHN5bWJvbHMsIGFzIHRoZXkgYXJlIGJlaW5nIHJlYWQuCisJKiBtaXBzcmVhZC5jOiAgQ29uZm9ybWluZyBjaGFuZ2VzLiAgU3RhYnMtcmVhZGluZyB3aWxsIHJlbG9jYXRlCisJdXNpbmcgb25lIG9mZnNldC4gIE1JUFMtcmVhZGluZyB3aWxsIG5vdCByZWxvY2F0ZSBhdCBhbGwuCisJKiBwYXJ0aWFsLXN0YWIuaDogIFJlbG9jYXRlIGRpZmZlcmVudCBzeW1ib2wgdHlwZXMgdXNpbmcgZGlmZmVyZW50CisJb2Zmc2V0cyBmcm9tIHNlY3Rpb25fb2Zmc2V0cy4KKwkqIHN5bWZpbGUuYzogIENvbmZvcm1pbmcgY2hhbmdlcy4KKwkoZmluZF9sb3dlc3Rfc2VjdGlvbik6ICBVbnVzZWQgZnVuY3Rpb24gdG8gdXNlIGxhdGVyCisJdG8gZnJlZSB1cyBmcm9tIHRoZSBUeXJhbm55IG9mIHRoZSBUZXh0IFNlY3Rpb24uCisJKHN5bXNfZnJvbV9vYmpmaWxlKTogIFRyYW5zbGF0ZSBhYnNvbHV0ZSBhcmcgQUREUiB0byBvZmZzZXRzIHVzZWQKKwlpbiBhbGwgbG93ZXIgbGF5ZXJzIG9mIHN5bWJvbCByZWFkaW5nLiAgQ2FsbCBmb3JtYXQtc3BlY2lmaWMKKwlzeW1fb2Zmc2V0cyBmdW5jdGlvbiB0byBpbml0aWFsaXplIG9mZnNldHMgZm9yIGhpZ2ggc3BlZWQgc3ltYm9sCisJcmVhZGluZy4KKwkoc3ltYm9sX2ZpbGVfYWRkKTogIENhbGwgcmVpbml0X2ZyYW1lX2NhY2hlIHNvIGNhbGxlcnMgZG9uJ3QgaGF2ZSB0by4KKwkoc3ltYm9sX2ZpbGVfY29tbWFuZCwgYWRkX3N5bWJvbF9maWxlX2NvbW1hbmQpOiAgQ2FsbGVycyBjaGFuZ2VkLgorCSogc3ltbWlzYy5jIChkdW1wX3BzeW10YWIpOiAgUHJpbnQgbmV3IHJlbG9jYXRpb24gcGFyYW1ldGVycy4KKwkqIHhjb2ZmcmVhZC5jOiAgQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgorCisJKiBidWlsZHN5bS5jOiAgVGlkeSBpbm5lcmJsb2NrX2NvbXBsYWludCBhbmQgYmxvY2t2ZWN0b3JfY29tcGxhaW50LgorCSogbWFpbi5jIChtYWluKTogIFJlYWQgdGhlICRIT01FLy5nZGJpbml0IGZpbGUgYmVmb3JlIHByb2Nlc3NpbmcKKwl0aGUgYXJndiBhcmd1bWVudHMgKGUuZy4gcmVhZGluZyBzeW1ib2wgZmlsZXMgb3IgY29yZQorCWZpbGVzKS4gIFRoaXMgYWxsb3dzIGdsb2JhbCBwYXJhbWV0ZXJzIHRvIGJlIHNldCwgd2hpY2ggd2lsbCBhcHBseQorCWR1cmluZyB0aGUgc3ltYm9sIHJlYWRpbmcuICBUaGUgLi8uZ2RiaW5pdCBpcyBzdGlsbCByZWFkIGFmdGVyCisJYXJndiBwcm9jZXNzaW5nLgorCSogc3ltdGFiLmMgKGxpc3Rfc3ltYm9scyk6ICBgaSB2YXJpYWJsZXMnIHNob3VsZG4ndCBzaG93IGVudW0gdmFsdWVzLgorCSogeGNvZmZleGVjLmM6ICBDbGVhbiB1cCBxdW90ZSBpbnNpZGUgY29tbWVudC4KKworRnJpIEp1bCAgMyAyMDoxODoyNiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jLCBidWlsZHN5bS5jLCBjLWV4cC55LCBjb2ZmcmVhZC5jLCBjb21tYW5kLmMsCisJY29yZS5jLCBjcGx1cy1kZW0uYywgZGJ4cmVhZC5jLCBkd2FyZnJlYWQuYywgZWxmcmVhZC5jLCBlbnZpcm9uLmMsCisJZXZhbC5jLCBmaW5kdmFyLmMsIGdkYnR5cGVzLmMsIGhwcGFic2QtdGRlcC5jLCBocHBhaHB1eC10ZGVwLmMsCisJaTM4Ni10ZGVwLmMsIGllZWUtZmxvYXQuYywgaW5mY21kLmMsIGluZmxvdy5jLCBpbmZwdHJhY2UuYywKKwlpbmZydW4uYywgbTItZXhwLnksIG1pcHNyZWFkLmMsIG9iamZpbGVzLmMsIHBhcnNlLmMsIHByb2Nmcy5jLAorCXB1dGVudi5jLCByZW1vdGUtbW0uYywgcmVtb3RlLXZ4LmMsIHNvbGliLmMsIHNwYXJjLXRkZXAuYywKKwlzcGFyYy14ZGVwLmMsIHN0YWNrLmMsIHN5bWZpbGUuYywgc3ltdGFiLmMsIHN5bXRhYi5oLCB0YXJnZXQuYywKKwl0bS1pMzg2di5oLCB0bS1zcGFyYy5oLCB1dGlscy5jLCB2YWxhcml0aC5jLCB2YWxvcHMuYywgdmFscHJpbnQuYywKKwl2YWx1ZXMuYywgeGNvZmZyZWFkLmM6CisJUmVtb3ZlICIodm9pZCkiIGNhc3RzIGZyb20gZnVuY3Rpb24gY2FsbHMgd2hlcmUgdGhlIHJldHVybiB2YWx1ZQorCWlzIGlnbm9yZWQsIGluIGFjY29yZGFuY2Ugd2l0aCBHTlUgY29kaW5nIHN0YW5kYXJkcy4KKworRnJpIEp1bCAgMyAwMDowMDo0OSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpOiAgSWdub3JlIE5fTUFJTiwgTl9FTkRNIGZvciBTb2xhcmlzLgorCSogcGFydGlhbC1zdGFiLmg6ICBJZ25vcmUgTl9FTkRNLgorCSogZWxmcmVhZC5jIChlbGZfc3ltdGFiX3JlYWQpOiAgSWdub3JlIHN5bWJvbHMgdGhhdCBkb24ndCBoYXZlIGEKKwlDT0RFIG9yIERBVEEgc2VjdGlvbiBhdHRhY2htZW50LiAgVGhpcyBlbGltaW5hdGVzIGEgbG90IG9mIHJhbmRvbQorCXZhbHVlcyBmcm9tIHNoYXJlZCBsaWJyYXJpZXMsIHdoaWNoIHNjcmV3IHVwIHRoZSBvcmRpbmFyeSBzeW1ib2xzCisJaW4gdGhlIGFkZHJlc3MgcmFuZ2VzIHRoZXkgaGFwcGVuIHRvIG92ZXJsYXAuCisJKiBidWlsZHN5bS5jIChkZWZpbmVfc3ltYm9sKTogIEVsaW1pbmF0ZSBzcGVjaWFsIHRlc3RzCisJZm9yIGZ1bmN0aW9uIHR5cGVzOyBtb3ZlIGludG8gImZ1bmN0aW9uIiBjYXNlcyBpbiBzd2l0Y2ggc3RhdGVtZW50LgorCShkZWZpbmVfc3ltYm9sOiAnZicsICdGJywgJ1AnKTogIFByb2Nlc3MgYWxsIHBhcmFtZXRlciB0eXBlcworCWluIGNhc2UgdGhleSBkZWZpbmUgbmV3IHR5cGUgbnVtYmVycy4gIEJ1dCBpZ25vcmUgdGhlbSAoRklYTUUpLgorCSgnaycsICdCJyk6ICBJZ25vcmUgY29uc3QgYW5kIHZvbGF0aWxlIGlmIHdlIHNlZSB0aGVtIChGSVhNRSkuCisJKHJlYWRfc3VuX2J1aWx0aW5fdHlwZSk6ICBBZGQgY29tbWVudGFyeS4KKworV2VkIEp1bCAgMSAwMDo0NzowMiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIHhtLXJzNjAwMC5oOiBkZWZpbmUgTUVNX0ZOU19ERUNMQVJFRAorCitUdWUgSnVuIDMwIDAyOjI1OjEwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiB0bS1taXBzLmggKEdEQl9UQVJHRVRfSVNfTUlQUyk6ICBEZWZpbmUgZm9yIG1pcHMteGRlcC5jLgorCShSRUFEX01JUFNfRk9STUFULCBDT0ZGX0ZPUk1BVCk6ICBSZW1vdmUsIHVudXNlZCBub3cuCisJKiBtaXBzLXhkZXAuYzogIFJlbW92ZSBtb3N0IGluY2x1ZGUgZmlsZXMgKHVudXNlZCwgY2F1c2VkIGVycnMpLgorCShmZXRjaF9jb3JlX3JlZ2lzdGVycyk6ICBVc2UgcmlnaHQgcGFyYW1ldGVycyBpbiBkdW1teSBmbi4KKworTW9uIEp1biAyOSAxODozMDo1NyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogYnVpbGRzeW0uYyAoc2Nhbl9maWxlX2dsb2JhbHMpOiAgQmV3YXJlIHRoZSBudWxsIGZpbGUuCisJRml4IGZyb20gSmltIFdpbGxpYW1zLgorCisJKiBzdGFjay5jIChyZXR1cm5fY29tbWFuZCk6ICBFdmFsdWF0ZSBleHByZXNzaW9uICpiZWZvcmUqIHBvcHBpbmcKKwlvZmYgdGhlIHN0YWNrIGZyYW1lcyEgIEZpeCBpbnNwaXJlZCBieSBKaW0gV2lsbGlhbXMuCisJKHVwX3NpbGVudGx5X2NvbW1hbmQsIGRvd25fc2lsZW50bHlfY29tbWFuZCk6ICBObyBzZWwgZnJhbWUgaXMgZXJyb3IuCisKKwkqIGRlZnMuaCAobWVtY3B5LCBtZW1zZXQpOiAgQ29uZGl0aW9uYWxpemUgZGVjbHMgb24KKwkjaWZuZGVmIE1FTV9GTlNfREVDTEFSRUQsIHNpbmNlIERFQ3N0YXRpb24gZGlmZmVycy4KKwkoYWxsb2NhKTogIEJyZWFrIG91dCB0aGUgU1REQyBhbmQgbm9uLVNUREMgYWxsb2NhIGNhc2VzLCB0byBtYWtlCisJaXQgd29yayBvbiBvbGQgcHJlcHJvY2Vzc29ycyBhcyB3ZWxsIGFzICJwaWNreSBBTlNJIiBvbmVzLgorCSogeG0tbWlwcy5oIChtZW1jcHksIG1lbXNldCk6ICBEZWNsYXJlLCBhbmQgc2V0IE1FTV9GTlNfREVDTEFSRUQuCisKKwkqIG1pcHMtdGRlcC5jIChoZXVyaXN0aWNfcHJvY19zdGFydCk6ICBaZXJvIGFyZyBwcm9kdWNlcyB6ZXJvLgorCSogdXRpbHMuYyAoZnB1dHNfZGVtYW5nbGVkKTogIFJlbmFtZSBTTE9QIHNpbmNlIERFQ3N0YXRpb24gc3lzdGVtCisJaGVhZGVyIGZpbGVzIGRlZmluZSBpdCEKKworCSogdG0tMjlrLmggKEJSRUFLUE9JTlQpOiAgQWxsb3cgaXQgdG8gYmUgb3ZlcnJpZGRlbiB3aXRoIC1ELgorCitNb24gSnVuIDI5IDE2OjMwOjI1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBkYnhyZWFkLmMsIGkzODYtcGluc24uYywgaTM4Ni10ZGVwLmMsIHJlZ2V4LmMsIHNvbGliLmMsIHN5bW1pc2MuYywKKwlzeW10YWIuaCwgdG0taTM4NnY0LmgsIHZhbHByaW50LmMsIHZhbHVlcy5jOiAgTGludC4KKwkqIGJyZWFrcG9pbnQuYywgYy1leHAueSwgY29mZnJlYWQuYywgY29tbWFuZC5jLCBlbnZpcm9uLmMsIGV2YWwuYywKKwlmaW5kdmFyLmMsIGluZmNtZC5jLCBpbmZwdHJhY2UuYywgaW5mcnVuLmMsIG0yLWV4cC55LCBwYXJzZS5jLAorCXB1dGVudi5jLCBzb2xpYi5jLCBzcGFyYy14ZGVwLmMsIHN5bXRhYi5jLCB0bS1pMzg2di5oLCB0bS1zcGFyYy5oLAorCXV0aWxzLmMsIHZhbGFyaXRoLmMsIHZhbG9wcy5jLCB2YWxwcmludC5jLCB2YWx1ZXMuYzoKKwlSZXBsYWNlIGJjb3B5KCkgdXNlIHdpdGggbWVtY3B5KCksIHdoaWNoIGlzIG1vcmUgc3RhbmRhcmQgYW5kIGNhbgorCXRha2UgYWR2YW50YWdlIG9mIGdjYydzIGJ1aWx0aW4gZnVuY3Rpb25zIGZvciBpbmNyZWFzZWQgcGVyZm9ybWFuY2UuCisJKiBicmVha3BvaW50LmMsIGJ1aWxkc3ltLmMsIGNvZmZyZWFkLmMsIGRieHJlYWQuYywgaTM4Ni10ZGVwLmMsCisJaWVlZS1mbG9hdC5jLCBpbmZjbWQuYywgc3BhcmMtdGRlcC5jLCBzdGFjay5jLCBzeW10YWIuYywgc3ltdGFiLmgsCisJdGFyZ2V0LmMsIHZhbHVlcy5jOgorCVJlcGxhY2UgYnplcm8oKSB1c2Ugd2l0aCBtZW1zZXQoKSwgd2hpY2ggaXMgbW9yZSBzdGFuZGFyZCBhbmQgY2FuCisJdGFrZSBhZHZhbnRhZ2Ugb2YgZ2NjJ3MgYnVpbHRpbiBmdW5jdGlvbnMgZm9yIGluY3JlYXNlZCBwZXJmb3JtYW5jZS4KKwkqIGkzODYtdGRlcC5jLCBtYWluLmMsIHZhbHByaW50LmM6CisJUmVwbGFjZSBiY21wKCkgdXNlIHdpdGggbWVtY21wKCksIHdoaWNoIGlzIG1vcmUgc3RhbmRhcmQgYW5kIGNhbgorCXRha2UgYWR2YW50YWdlIG9mIGdjYydzIGJ1aWx0aW4gZnVuY3Rpb25zIGZvciBpbmNyZWFzZWQgcGVyZm9ybWFuY2UuCisKK1N1biBKdW4gMjggMTM6MzA6MjIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIHJlbW90ZS5jIChyZW1vdGVfd2FpdCk6ICBGaXggY2FzdCBvbiBzaWduYWwoKSBjYWxsLgorCSogZGVmcy5oIChhbGxvY2EpOiAgTW9yZSBkaWRkbGluZyB3aXRoIGFsbG9jYS4gIEhhdmUgdG8gZW5zdXJlCisJdGhhdCBpdCBoYXMgYSBwcm90b3R5cGUsIHNvIHRoYXQgaWYgYWxsb2NhIGlzIGRlZmluZWQgYXMgYSBtYWNybworCXRoYXQgdGFrZXMgYW4gYXJnLCB0aGUgZGVmaW5pdGlvbiBpcyBzZWVuIGFzIGEgdXNlIG9mIGEgbWFjcm8KKwl0aGF0IHRha2VzIGFuIGFyZywgdG8gc2F0aXNmeSBwaWNreSBBTlNJIHByZXByb2Nlc3NvcnMuCisKK1NhdCBKdW4gMjcgMTI6MTI6MjAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIHNwYXJjLXBpbnNuLmM6ICBVc2UgPHN0cmluZy5oPiByYXRoZXIgdGhhbiAic3RyaW5nLmgiLCBmb3IKKwljb25zaXN0ZW5jeSB3aXRoIGFsbCBvdGhlciBnZGIgZmlsZXMuCisJKiBjYWRpbGxhYy5jOiAgVXNlIDxzdHJpbmcuaD4gcmF0aGVyIHRoYW4gPHN0cmluZ3MuaD4uCisJKiBjYWRpbGxhYy5jIChrZXJuZWxfZGlzcGF0Y2gpOiAgQ29udmVydCByaW5kZXggdXNhZ2UgdG8gc3RycmNoci4KKwkqIE1ha2VmaWxlLmluIChNQUtFKTogIFJlbW92ZSBkZWZpbml0aW9uIGZvciBjb25zaXN0ZW5jeSB3aXRoCisJb3RoZXIgTWFrZWZpbGUuaW4gZmlsZXMgYW5kIHRvIGZpeCBwcm9ibGVtIHdpdGggcmVjdXJzaXZlIG1ha2VzLgorCitGcmkgSnVuIDI2IDE5OjAzOjIzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBocHBhaHB1eC14ZGVwLmMgKGNoaWxkX3hmZXJfbWVtb3J5KTogIEF2b2lkIFBUX1dEVVNFUiBiZWNhdXNlIGl0CisJY3Jhc2hlcyBILVBVWC4KKworRnJpIEp1biAyNiAxMTowOToxMCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogc291cmNlLmMgKHByaW50X3NvdXJjZV9saW5lcyk6IGZvciBET1MgaW50ZXJvcGVyYWJpbGl0eTsgZG9uJ3QKKwlwcmludCBDUiAoMDEzKSBhcyBeTS4KKworVGh1IEp1biAyNSAxNToxODo0MiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBkYnhyZWFkLmMgKGRieF9zeW1maWxlX2luaXQpOiAgTW92ZSBtb3JlIGNvZGUgdW5kZXIgaHA5MDAwczgwMAorCWNvbmRpdGlvbmFsLgorCSogaHBwYWJzZC1jb3JlLmM6ICBEb24ndCBpbmNsdWRlICJwYXJhbS5oIiwgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisJaW5zdGVhZC4KKwkqIHJlbW90ZS5jIChyZW1vdGVfd2FpdCk6ICBDYXN0IHNpZ25hbCB0byB2b2lkICogdG8gYXZvaWQgd2FybmluZworCWZyb20gYnVzdGVkIEhQIGNvbXBpbGVyLgorCisJKiBwYXJ0aWFsLXN0YWIuaCAoTl9TTyk6ICBSZWFycmFuZ2UgY29kZSBhIGxpdHRsZSBzbyB0aGF0IGFsbCBTTworCXN0YWJzIGNhdXNlIGVuZF9wc3ltdGFiIHRvIGJlIGNhbGxlZC4KKworCSogYnVpbGRzeW0uYyAocmVhZF9zdW5fYnVpbHRpbl90eXBlKTogIEhhbmRsZSBuZXcgRkNTIFN1biBDQworCWNvbXBpbGVyIGZlYXR1cmUgb2YgcHV0dGluZyAnYycgaW50byBiYXNpYyB0eXBlIGRlc2NyaXB0b3JzIGZvcgorCWFsbCBmb3JtcyBvZiBjaGFyLgorCisJKiBwcm9jZnMuYyAoY2hpbGRfcmVzdW1lKTogIFdvcmsgYXJvdW5kIFNvbGFyaXMgKG9uIFNwYXJjKSBsb3NzYWdlCisJd2hlcmUgdGhlcmUgaXMgbm8gcGxhY2UgZm9yIG5QQyBpbiBwcnJ1biBzdHJ1Y3QuCisKK1RodSBKdW4gMjUgMTI6MDY6MDAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIG1pcHNyZWFkLmM6ICBQYXNzIE5VTEwgbmFtZSBwb2ludGVyIHRvIGluaXRfdHlwZSwgbm90IDAuCisJKiBnZGJ0eXBlcy5jIChpbml0X3R5cGUpOiAgVXNlIGNvcHkgb2YgdHlwZW5hbWUgb24gdHlwZV9vYnN0YWNrLgorCSogZHdhcmZyZWFkLmMgKGVudW1fdHlwZSk6ICBTYXZlIGVudW0gbmFtZXMgb24gdHlwZV9vYnN0YWNrLgorCSogZHdhcmZyZWFkLmMgKHN0cnVjdF90eXBlKTogIFNhdmUgbWVtYmVyIG5hbWUgb24gdHlwZV9vYnN0YWNrLgorCSogc3ltdGFiLmMgKF9pbml0aWFsaXplX3N5bXRhYik6ICBGaXggbWlzc3BlbGxpbmcuCisJKiByZWdleC5jIChzdG9yZV9qdW1wLCBpbnNlcnRfanVtcCk6ICBSZXR1cm4gdm9pZC4KKworVGh1IEp1biAyNSAwNDowMDoxMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogZGVmcy5oIChQQVJBTVMpOiAgTW92ZSB0byAuLi9pbmNsdWRlL2Fuc2lkZWNsLmguCisJKGFsbG9jYSk6ICBEZWNsYXJlIHJldHVybiB0eXBlIG9uIFNQQVJDLCBzaW5jZSBTdW4gZG9lc24ndC4KKwkoKl9CWVRFX09SREVSKTogIEltcHJvdmUgY29tbWVudDogICptdXN0KiBiZSBkZWZpbmVkLgorCisJKiB0bS1ocHBhLmg6ICBOZXcgZmlsZSwgYXJjaGl0ZWN0dXJhbCBkZWZpbml0aW9uIG9mIEhQIFBBLgorCSogdG0taHBwYWJzZC5oLCB0bS1ocHBhaHB1eC5oOiAgU2hyaW5rIHRvIGRlbHRhcyBmcm9tIHRtLWhwcGEuaC4KKworCSogYW0yOWstcGluc24uYywgYW0yOWstdGRlcC5jLCBjb3B5aW5nLmF3aywgY29weWluZy5jLAorCWhwcGEtY29yZWRlcC5jLCBocHBhLXBpbnNuLmMsIGhwcGFic2QtY29yZS5jLCBocHBhYnNkLXRkZXAuYywKKwlocHBhYnNkLXhkZXAuYywgaHBwYWhwdXgtdGRlcC5jLCBocHBhaHB1eC14ZGVwLmMsIHJlbW90ZS11ZGkuYywKKwlzZXItZ28zMi5jLCB4Y29mZnNvbGliLmM6ICBSZW1vdmUgPHN0ZGlvLmg+IHdoaWNoIGlzIGFscmVhZHkgaW4KKwkiZGVmcy5oIi4KKworCSogaHBwYS1jb3JlZGVwLmMsIGhwcGEtcGluc24uYywgaHBwYWJzZC1jb3JlLmMsIGhwcGFic2QtdGRlcC5jLAorCWhwcGFic2QteGRlcC5jLCBocHBhaHB1eC10ZGVwLmMsIGhwcGFocHV4LXhkZXAuYywgeGNvZmZzb2xpYi5jLAorCXhjb2Zmc29saWIuaCwgeG0tZ28zMi5oLCB4bS1ocHBhYnNkLmgsIHhtLWhwcGFocHV4Lmg6ICBDb3B5cmlnaHRzLgorCitXZWQgSnVuIDI0IDEyOjUzOjIwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBwcmludGNtZC5jIChvdXRwdXRfY29tbWFuZCk6ICBUaGlua28uCisJKHhfY29tbWFuZCk6ICBPbmx5IHNldCByZW1lbWJlcmVkIHNpemUvZm9ybWF0IGlmIGNtZCBzdWNjZWVkcy4KKworCSogZGJ4cmVhZC5jIChyZWFkX29maWxlX3N5bXRhYik6ICBSZW1vdmUgTl9DQVRDSCBzcGVjaWFsIGNhc2UsCisJc2luY2UgaXQgaXMgbm8gbG9uZ2VyIHVzZWQgYW5kIGJ1cm5zIHRpbWUgZm9yIGV2ZXJ5IHN5bWJvbCByZWFkLgorCShwcm9jZXNzX29uZV9zeW1ib2wpOiAgVHJlYXQgTl9DQVRDSCBsaWtlIGRlZmF1bHQgKGNvbXBsYWluKS4KKworV2VkIEp1biAyNCAwMDoyNjo1NiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBwYXJ0aWFsLXN0YWIuaCAoY2FzZSBOX1RFWFQpOiAgRml4IGZlbmNlcG9zdCBlcnJvciB3aGVuCisJZGV0ZWN0aW5nIHN0YXJ0IG9mIG5ldyBzeW1ib2wgaW5mbyBhZnRlciByZWFkaW5nIHN5bXRhYiBmb3IgYQorCW1vZHVsZSB3aXRoIGEgemVybyBsZW5ndGggVEVYVCBzZWdtZW50LgorCitUdWUgSnVuIDIzIDIxOjQ2OjI2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICBCdW1wIHRvIDQuNS42LgorCSogY29mZnJlYWQuYyAoY29mZl9lbmRfc3ltdGFiKTogIENhc3QgMm5kIGFyZyBvZiBjb21wbGFpbigpIHRvCisJY29ycmVjdCB0eXBlLgorCSogZGVmcy5oIChOT1JFVFVSTik6ICBEZWZpbmUgYXdheSBmb3IgTHVjaWQgY29tcGlsZXIuCisJKiByZW1vdGUuYyAocmVtb3RlX3RpbWVyLCByZW1vdGVfaW50ZXJydXB0KTogIFNpZ25hbCBoYW5kbGVycworCXRha2Ugb25lIGludCBhcmcuCisJKiBzZXItdGVybWlvcy5jIChzZXJpYWxfd3JpdGUsIHNlcmlhbF9jbG9zZSk6ICBSZXR1cm4gd2hhdGV2ZXIKKwl2YWx1ZSB0aGUgd3JpdGUvY2xvc2UgY2FsbCByZXR1cm5zLCByYXRoZXIgdGhhbiBmYWxsaW5nIG9mZiBlbmQuCisJKiBpbmZlcmlvci5oIChQVFJBQ0VfQVJHM19UWVBFKTogIFRoaXJkIGFyZyB0byBwdHJhY2UgaXMgaW50IG9uCisJbW9yZSBzeXN0ZW1zIHRoYW4gaXQgaXMgImNoYXIgKiIuICBEZWZpbmUgUFRSQUNFX0FSRzNfVFlQRSB0bworCWRlZmF1bHQgdG8gaW50LgorCSogaW5mcHRyYWNlLmMsIGhwcGFic2QteGRlcC5jLCBocHBhaHB1eC14ZGVwLmMsIGkzODYteGRlcC5jLAorCWluZmVyaW9yLmggKGNhbGxfcHRyYWNlKTogIFVzZSBQVFJBQ0VfQVJHM19UWVBFIHRvIGRlY2xhcmUgdHlwZQorCW9mIHRoaXJkIGFyZy4KKwkqIGE2OHYteGRlcC5jLCBhcm0teGRlcC5jLCBjb252ZXgteGRlcC5jLCBocDMwMHV4LXhkZXAuYywgaW5mcnVuLmMsCisJbTg4ay14ZGVwLmMsIG1hY2gzODYteGRlcC5jLCBtaXBzLXhkZXAuYywgb3M2OGsteGRlcC5jLCBweXItdGRlcC5jLAorCXB5ci14ZGVwLmMsIHJzNjAwMC14ZGVwLmMsIHNwYXJjLXhkZXAuYywgc3VuMy14ZGVwLmMsIHN1bjM4Ni14ZGVwLmMsCisJc3ltbS14ZGVwLmMsIHVsdHJhMy14ZGVwLmM6ICBVc2UgUFRSQUNFX0FSRzNfVFlQRSB0byBjYXN0IHB0cmFjZQorCWFyZ3VtZW50IDMuCisJKiBzcGFyYy14ZGVwLmMsIGE2OHYteGRlcC5jIChmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMsCisJc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogU3VwcGx5IG1pc3NpbmcgZm91cnRoIGFyZ3VtZW50IHRvCisJcHRyYWNlKCkuCisJKiBjYWRpbGxhYy5jIChrZXJuZWxfZGlzcGF0Y2gpOiAgTWFrZSByZXR1cm4gdHlwZSB2b2lkLgorCSogY2FkaWxsYWMuYyAoaW9zaWcpOiAgU2lnbmFsIGhhbmRsZXJzIHRha2Ugb25lIGludCBhcmcuCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnRfZmllbGRzKTogIENhbGwgZnByaW50X3N5bWJvbCB0byBnZXQKKwlhdXRvbWF0aWMgQysrIGRlbWFuZ2xpbmcgZm9yIG1hbmdsZWQgZmllbGQgbmFtZXMuCisKK01vbiBKdW4gMjIgMjA6MTg6MDYgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNvbW1hbmQuYyAoYWRkX2FiYnJldl9wcmVmaXhfY21kKTogIEZpeCBtaXNzcGVsbGluZyBpbiBjb21tZW50LgorCSogZHdhcmZyZWFkLmMgKGVudW1fdHlwZSk6ICBGaXggbWlzc3BlbGxpbmcgaW4gY29tbWVudC4KKwkqIHZhbHByaW50LmMgKHZhbF9wcmludF9maWVsZHMsIGNwbHVzX3ZhbF9wcmludCk6ICBNaW5vcgorCWFkanVzdG1lbnQgdG8gcHJpbnRpbmcgb2YgQysrIGNsYXNzIHN0cnVjdHVyZXMgdG8gbW9yZSBjbG9zZWx5CisJbWF0Y2ggZm9ybWF0IGZvciBwcmludGluZyBDIHN0cnVjdHVyZXMsIHdpdGggYW5kIHdpdGhvdXQgc2V0dGluZworCXByZXR0eSBwcmludC4KKworTW9uIEp1biAyMiAxNzoxOTowMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogIERvbid0IHRlc3QgZm9yIFNJR0VNVAorCSh3aGljaCBpcyBub3QgYSBQb3NpeCBzaWduYWwpIGlmIGl0IGlzbid0IGRlZmluZWQuCisJKiB0bS1saW51eC5oLCB4bS1saW51eC5oLCBjb25maWcvbGludXgubVtodF0sIGNvbmZpZ3VyZS5pbjoKKwlOZXcgcG9ydCB0byBMaW51eCAoYSBmcmVlIFVuaXggY2xvbmUgZm9yIDM4NiBtYWNoaW5lcykuCisKK1NhdCBKdW4gMjAgMTk6MTk6NTIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwlDT0ZGIGNoYW5nZXMgZm9yIGRlYWxpbmcgYmV0dGVyIHdpdGggRVBJIDI5SyBDIGNvbXBpbGVyIG91dHB1dC4KKworCSogY29mZnJlYWQuYyAocmVjb3JkX21pbmltYWxfc3ltYm9sKTogIFBhc3MgdGhlIG1pbnN5bSB0eXBlIHRvIGl0LgorCUNhbGxlcnMgY2hhbmdlZC4KKwkoY29mZl9lbmRfc3ltdGFiKTogIFNvcnQgYmxvY2tzIGlmIG5lZWRlZC4gIENvbXBsYWluIGlmIG1pc29yZGVyZWQuCisJKHJlYWRfY29mZl9zeW10YWIpOiAgTW92ZSBwYXRjaF9vcGFxdWVfdHlwZXMgY2FsbCBmcm9tCisJY29mZl9zeW1maWxlX3JlYWQuICBSZXN0cmljdCBpdCB0byBzeW10YWJzIGZyb20gdGhpcyBvYmpmaWxlLgorCShwcm9jZXNzX2NvZmZfc3ltYm9sOiBDX1RQREVGKTogIERvbid0IHB1dCBvcmRpbmFyeSBmb3dhcmQKKwlyZWZlcmVuY2VzIG9uIG9wYXF1ZSB0eXBlIGNoYWluOyBqdXN0IGxldCBjb2ZmX2xvb2t1cF90eXBlIGhhbmRsZSAnZW0uCisJKGRlY29kZV90eXBlKTogIENvbXBsYWluIGFib3V0IHRhZ25keCB2YWx1ZXMgb24KKwlub24tc3RydWN0L3VuaW9uL2VudW0gdHlwZXMsIHdoaWNoIHRoZSBFUEkgY29tcGlsZXIgdGVuZHMgdG8gcHJvZHVjZS4KKworCSogc3ltdGFiLmMgKGxpc3Rfc3ltYm9scyk6ICBNYWtlIG1pbmltYWwgc3ltYm9sIHZhcmlhYmxlLWZpbmRpbmcgd29yay4KKworCSogdG0tNjhrLmggKEZJWF9DQUxMX0RVTU1ZKTogQXZvaWQgYWxpZ25tZW50IGFuZCBieXRlIG9yZGVyCisJZGVwZW5kZW5jeS4KKworCSogZWxmcmVhZC5jIChlbGZfc3ltZmlsZV9yZWFkKTogIFVwZGF0ZSBiZmRfZWxmX2ZpbmRfc2VjdGlvbgorCXVzYWdlIHRvIG1hdGNoIG5ldyBwcm90b3R5cGUuICBJbmNsdWRlIGxpYmJmZC5oIHRvIGdldCBwcm90b3R5cGUuCisKKwkqIHNvdXJjZS5jIChmaW5kX3NvdXJjZV9saW5lcyk6ICBIYW5kbGUgbGFyZ2Ugc3Rfc2l6ZSBmaWVsZHMuCisKK1NhdCBKdW4gMjAgMTY6Mjg6MzkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGluZmNtZC5jIChqdW1wX2NvbW1hbmQpOiAgVXNlIGNsZWFudXBzIHRvIGF2b2lkIG1lbW9yeSBsZWFrcy4KKwkqIHN0YWNrLmMgKHJldHVybl9jb21tYW5kKTogIFVzZSBjbGVhbnVwcyB0byBhdm9pZCBtZW1vcnkgbGVha3MuCisKK0ZyaSBKdW4gMTkgMTk6MDY6NDEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIHJlbW90ZS1hZGFwdC5jLCByZW1vdGUtZWIuYywgcmVtb3RlLW1tLmM6ICBMaW50LiAgRml4CisJSU5UX1JFR05VTSB0byBJTlRFX1JFR05VTS4KKworCSogdG0tMjlrLmggKFNEQl9SRUdfVE9fUkVHTlVNKTogIEFkZCBmb3IgRVBJIDI5SyBDIGNvbXBpbGVyLgorCitGcmkgSnVuIDE5IDE1OjMwOjE1IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiwgZGJ4cmVhZC5jLCBocHBhLWNvcmVkZXAuYywgaHBwYS1waW5zbi5jLAorCWhwcGFic2QtY29yZS5jLCBocHBhYnNkLXRkZXAuYywgaHBwYWJzZC14ZGVwLmMsIGhwcGFocHV4LXRkZXAuYywKKwlocHBhaHB1eC14ZGVwLmMsIG11bmNoLCBwYXJ0aWFsLXN0YWIuaCwgdG0taHBwYWJzZC5oLAorCXRtLWhwcGFocHV4LmgsIHhtLWhwcGFic2QuaCwgeG0taHBwYWhwdXguaDogIEhQUEEgbWVyZ2UuCisKKwkqIE1ha2VmaWxlLmluIChjLWV4cC50YWIuYywgbTItZXhwLnRhYi5jKTogIEZpbHRlciBvdXQgYm9ndXMgZXh0ZXJuCisJZGVjbGFyYXRpb25zIG9mIG1hbGxvYy9yZWFsbG9jL2ZyZWUgdGhhdCBhcmUgaW5zZXJ0ZWQgYnkgc29tZQorCXZlcnNpb25zIG9mIHlhY2MuCisJKiBtMi1leHAueTogIFByZXZlbnQgY29uZmxpY3RzIHdpdGggVFJVRSBhbmQgRkFMU0UgdG9rZW5zIGJ5CisJI3VuZGVmZmluZyB0aGVtLgorCSogeG0tcnM2MDAwLmg6ICBEZWNsYXJlIG1hbGxvYy9yZWFsbG9jL2ZyZWUgYXBwcm9wcmlhdGVseS4gIFlldAorCWFub3RoZXIgZGVjbCBvZiBzdHJkdXAgKHRoaXMgcmVhbGx5IG91Z2h0IHRvIGNvbWUgZnJvbSBsaWJpYmVydHkuaCEpLgorCitGcmkgSnVuIDE5IDEwOjI4OjA1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiByZW1vdGUuYyAoZ2V0cGt0KTogIEVycm9yIGlmIGlucHV0IGV4Y2VlZHMgYnVmZmVyIHNpemUuCisJKF9pbml0aWFsaXplX3JlbW90ZSk6ICBgc2V0IHJlbW90ZWRlYnVnJyBlbmFibGVzIHBhY2tldCB0cmFjZS4KKworCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2w6Tl9GVU4pOiAgR0NDIG5vdyBwcm9kdWNlcyByZWxhdGl2ZQorCU5fU0xJTkUncywgZXRjLCBqdXN0IGxpa2UgU3VuIGNjIG9uIFNvbGFyaXMyLgkKKworCSogYW0yOWstdGRlcC5jIChyZWFkX3JlZ2lzdGVyX3N0YWNrLCB3cml0ZV9yZWdpc3Rlcl9zdGFjayk6CisJQ2hhbmdlIFJTVEFDS19ISUdIX0FERFIgdG8gcnN0YWNrX2hpZ2hfYWRkcmVzcywgYSB1c2VyLXNldHRhYmxlCisJdmFyaWFibGUuICBBZGQgYHNldCcgYW5kIGBzaG93JyBjb21tYW5kcyBmb3IgaXQuCisJKiBkb2MvZ2RiLnRleGluZm86ICBEb2N1bWVudCBpdC4KKworVGh1IEp1biAxOCAxOTozNToyMiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogdmFscHJpbnQuYyAodHlwZV9wcmludF8xKTogIFBsdWcgbWVtb3J5IGxlYWsuICBQcmludCBhbGwKKwlDKysgc3ltcyBhcyBkZW1hbmdsZWQsIG5vdCBqdXN0IGZ1bmN0aW9ucy4KKwkqIGJ1aWxkc3ltLmMgKHJlYWRfcmFuZ2VfdHlwZSk6ICBXaGVuIHdlIGZpbmQgYSBzaWduZWQgY2hhcgorCXR5cGUsIGRvIGEgbG9va3VwIG9mIHNpZ25lZCBjaGFyLCBub3QgcGxhaW4gY2hhci4gIFBsYWluIGNoYXIncworCXN0aWxsIGdldCBsb29rZWQgdXAgYXMgcGxhaW4gY2hhcidzIGVsc2V3aGVyZS4KKworVGh1IEp1biAxOCAxODo1OTowNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogZXZhbC5jOiAgQXZvaWQgcmVzaWR1ZS1ieS16ZXJvIHdoZW4gZXZhbHVhdGluZyB3aXRob3V0IHNpZGUgZWZmZWN0cy4KKwkoQnVnIGFuZCBmaXggZm91bmQgYnkgUGllcnJlIFdpbGxhcmQuKQorCitXZWQgSnVuIDE3IDEzOjA4OjMzIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIHhtLXJzNjAwMC5oOiAgRml4IGRlY2xzIGZvciBtYWxsb2MsIHJlYWxsb2MsIGFuZCBmcmVlLgorCisJKiB4bS1yczYwMDAuaDogIEFkZCBkZWNsIGZvciBzdHJkdXAoKS4KKworCSogdG0tcnM2MDAwLmg6ICBSZW1vdmUgI2luY2x1ZGUgb2YgaW5mZXJpb3IuaC4gIEZpeGVzIG1hbnkKKwljb21waWxhdGlvbiBlcnJvcnMuCisKKwkqIGJyZWFrcG9pbnQuYyAoZW5hYmxlX2NvbW1hbmQsIGRpc2FibGVfY29tbWFuZCk6ICBXaXRob3V0IGFyZ3MsCisJc2hvdWxkIG9ubHkgYWZmZWN0IG5vcm1hbCBicmVha3BvaW50cyBhbmQgd2F0Y2hwb2ludHMuCisKKwkqIG02OGstcGluc24uYyAocHJpbnRfaW5zbl9hcmcpOiAgTWFrZSByZWdpc3RlciBiZSBjb25zdC4KKwkqIHhjb2ZmZXhlYy5jOiAgUmVtb3ZlICcgZnJvbSBjb21tZW50LgorCSogeG0tc3VuM29zNC5oOiAgRGVmaW5lIE1BTExPQ19JTkNPTVBBVElCTEUgdG8gYXZvaWQgY29uZmxpY3RzCisJd2l0aCBkZWNscyBvZiBtYWxsb2MgaW4gYy1leHAudGFiLmMgKGFzIHByb2R1Y2VkIGJ5IHlhY2MpLgorCVRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzLi4uCisKK1dlZCBKdW4gMTcgMTE6MTA6NDAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIHBhcnRpYWwtc3RhYi5oOiBDb252ZXJ0IHNpbmdsZSByaW5kZXggdXNlIHRvIHN0cnJjaHIuCisJKiBtaXBzcmVhZC5jLCBkYnhyZWFkLmM6ICBSZW1vdmUgdHJvdWJsZXNvbWUgaW5jbHVzaW9uIG9mIG5vbi0KKwlzdGFuZGFyZCA8c3RyaW5ncy5oPiBmaWxlLCBub3cgdGhhdCB0aGUgb25seSBzaW5nbGUgdXNlIG9mCisJcmluZGV4IGluIHRoZSBnZGIgc291cmNlIGZpbGVzIGlzIGdvbmUuCisKK1R1ZSBKdW4gMTYgMjI6MTc6NDkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIG1pcHNyZWFkLmM6ICBVbmRvIGlsbCBlZmZlY3RzIGZyb20gaW5jbHVkaW5nIDxzdHJpbmdzLmg+LAorCXdoaWNoICNkZWZpbmVzIGluZGV4IHRvIGJlIHN0cmNoci4gIFVuZm9ydHVuYXRlbHksIGluZGV4IGlzCisJYSBtZW1iZXIgb2YgYSBzeW1ib2wgdGFibGUgc3RydWN0dXJlIHRoYXQgY2FuJ3QgYmUgY2hhbmdlZC4KKwkqIG1pcHNyZWFkLmM6ICB0bS1taXBzLmggaW5jbHVkZXMgY29mZi9zeW1jb25zdC5oIGFuZCBjb2ZmL3N5bS5oLAorCXJlbW92ZSByZWR1bmRhbnQgI2luY2x1ZGUncy4KKworVHVlIEp1biAxNiAxNDoxNTo1MSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBtaXBzcmVhZC5jOiAgI2luY2x1ZGUgPHN0cmluZ3MuaD4gZm9yIHJpbmRleCgpLgorCitUdWUgSnVuIDE2IDA5OjAxOjQ5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiB4Y29mZmV4ZWMuYyAobWFwX3ZtYXApOiAgVHVybiBjb21tZW50IGludG8gYSByZWFsIEMgY29tbWVudC4KKworTW9uIEp1biAxNSAxODo0MToyMyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBkYnhyZWFkLmMgKHByb2Nlc3Nfb25lX3N5bWJvbCksIHBhcnRpYWwtc3RhYi5oOiAgSWdub3JlCisJZXh0cmFuZW91cyBTTyBzdGFicyBmcm9tIGJ1c3RlZCBDKysgY29tcGlsZXJzLgorCitNb24gSnVuIDE1IDEyOjIxOjQ1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICBCdW1wIHRvIDQuNS41LgorCSogc3ltdGFiLmMgKGRlY29kZV9saW5lXzEpOiAgVW50aWwgQysrIHN1cHBvcnQgc3RhYmlsaXplcywgd2hlbgorCUMrKyBsb29rdXBzIGZhaWwsIHByaW50IHBvc3NpYmx5IGhlbHBmdWwgaGludCBhYm91dCBjb21wbGV0aW9uLgorCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3NpZ25hdHVyZSk6ICBGaXggQVJNIHN0eWxlIGRlbWFuZ2xpbmcKKwlmb3Igc3RhdGljIGRhdGEgbWVtYmVycy4KKwkqIGRieHJlYWQuYyAoZGJ4X3BzeW10YWJfdG9fc3ltdGFiXzEpOiAgRml4IHByb3RvdHlwZS4KKwkqIGNvbmZpZy9uY3IzMDAwLm1oIChJTlNUQUxMKTogIERvbid0IHVzZSAvdXNyL3VjYi9pbnN0YWxsLAorCWl0J3MgYnJva2VuIG9uIG5jcjMwMDAncy4KKworTW9uIEp1biAxNSAwNzoyMTowMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZHdhcmZyZWFkLmMgKGRlY29kZV9tb2RpZmllZF90eXBlKTogIENoYW5nZSB0eXBlIG9mIGZpcnN0IGFyZy4KKwlDaGFuZ2UgJ21vZGlmaWVyJyB0byBjaGFyIGZyb20gdW5zaWduZWQgY2hhci4gIENhc3Qgc2luZ2xlIHVzZQorCXRoYXQgbmVlZHMgdG8gYmUgdW5zaWduZWQgY2hhci4KKwkqIHN5bXRhYi5oIChTWU1CT0xfQkFTRVJFR19WQUxJRCk6ICBFeHBsYWluIGRpc2FibGluZy4KKwkqIHV0aWxzLmMgKHN0cmR1cF9kZW1hbmdsZWQpOiAgQWRkIGZ1bmN0aW9uLgorCSogZGVmcy5oIChzdHJkdXBfZGVtYW5nbGVkKTogIEFkZCBwcm90b3R5cGUuCisJKiBzdGFjay5jIChyZXR1cm5fY29tbWFuZCk6ICBEZW1hbmdsZSBDKysgZnVuY3Rpb24gbmFtZXMgZm9yIHF1ZXJ5LgorCSogaW5mY21kLmMgKGp1bXBfY29tbWFuZCk6ICBEZW1hbmdsZSBDKysgZnVuY3Rpb24gbmFtZXMgZm9yIHF1ZXJ5LgorCSogY3BsdXMtZGVtLmMgKGNvbnN1bWVfY291bnQpOiAgTmV3IGZ1bmN0aW9uIGFuZCBwcm90b3R5cGUuCisJKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfY2xhc3MsIGdudV9zcGVjaWFsLCBkZW1hbmdsZV9mdW5jX3R5cGUsCisJZG9fdHlwZSk6ICBSZXBsYWNlIGNvbnZlcnNpb24gY29kZSB3aXRoIGNvbnN1bWVfY291bnQoKS4KKwkqIGNwbHVzLWRlbS5jIChnbnVfc3BlY2lhbCk6ICBGaXggZGVtYW5nbGVkIG9mIHN0YXRpYyBtZW1iZXJzLgorCSogc291cmNlLmMgKGxpc3RfY29tbWFuZCk6ICBQcmludCBkZW1hbmdsZWQgZnVuY3Rpb24gbmFtZXMKKwl3aGVuIGFwcHJvcHJpYXRlLiAgRml4IHN1cHBsaWVkIGJ5IFBldGVyIFNjaGF1ZXIuCisKK01vbiBKdW4gMTUgMDE6NDU6NDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIHNwYXJjLXRkZXAuYzogIENsZWFuIHVwIHNsaWdodGx5IGZvciBTb2xhcmlzMi4KKworCSogYnVpbGRzeW0uYyAoZGVmaW5lX3N5bWJvbCk6ICBOYW1lbGVzcyB0eXBlcyBhcmUgbm93IG9uIHNldmVyYWwKKwlwbGF0Zm9ybXM7IGdlbmVyYWxpemUgdGhlbSBhbmQgdW4taWZkZWYgdGhlbSB0byBtYWtlIFNvbGFyaXMgMgorCXdvcmsuCisKK1N1biBKdW4gMTQgMTA6NTU6NTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGluZmNtZC5jOiAgRml4IHR5cG8gKHJlcG9ydGVkIGJ5IFJvYiBTYXZveWUpLgorCSogeG0tc3VuNHNvbDIuaCAoZ3JlZ3NldF90KTogIFRoaW5rbyBpbiByZWdpc3RlciBzZXQgZGVmaW5pdGlvbi4KKwkqIHN5bXRhYi5oOiAgRGlzYWJsZSBTWU1CT0xfQkFTRVJFR19WQUxJRCB1bnRpbCBpdCB3b3Jrcy4KKwkqIGRieHJlYWQuYyAoZGJ4X3BzeW10YWJfdG9fc3ltdGFiXzEpOiAgUmVuYW1lZCBmcm9tCisJcHN5bXRhYl90b19zeW10YWJfMS4gIFVzZSBjdXJyZW50IHBzeW10YWIncyBzeW1fb2Zmc2V0IGFuZCBzeW1ib2xfc2l6ZSwKKwlyYXRoZXIgdGhhbiB0aGUgb25lIGZvciB0aGUgZmlyc3QgZmlsZSBpbiB0aGUgZGVwZW5kZW5jeSBjaGFpbi4KKworCSogZGJ4cmVhZC5jIChlbmRfcHN5bXRhYik6ICBPbmx5IHJlc2V0IHRleHRoaWdoIGlmIGl0J3Mgbm90IGFscmVhZHkKKwlzZXQuICBEb24ndCByZXNldCBvdXIgb3duIHRleHRoaWdoLCBvciBkZXBlbmRlbmN5LW9ubHkgcHN0J3MsIGluCisJc2Nhbm5pbmcgYWxsIHRoZSByZXN0IG9mIHRoZSBwc3ltdGFicy4KKwkocHJvY2Vzc19vbmVfc3ltYm9sKTogIEZpeCBjb21tZW50cyBhcm91bmQgTl9PQkosIE5fT1BULCBOX1VOREYuCisKKwkqIGJ1aWxkc3ltLmggKE5fVU5ERik6ICBJbXByb3ZlIGNvbW1lbnRzLgorCShOX0xTWU0sIGV0Yyk6ICBTa2lwIHR5cGVzIHdpdGhvdXQgbmFtZXMgKCI6VCgwLDMpPXNmb29iLi4uIikuCisKK1NhdCBKdW4gMTMgMTE6MTY6NDUgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIHN5bXRhYi5oIChzdHJ1Y3Qgc3ltYm9sKTogIEFkZCBhdXhfdmFsdWUgdW5pb24gZm9yIHByZXNlcnZpbmcKKwlhbiBhZGRpdGlvbmFsIHBlci1zeW1ib2wgdmFsdWUuCisJKiBzeW10YWIuaCAoU1lNQk9MX0JBU0VSRUcsIFNZTUJPTF9CQVNFUkVHX1ZBTElEKTogIEFkZCBkZWZpbmVzLgorCSogZnJhbWUuaCAoRlJBTUVfR0VUX0JBU0VSRUdfVkFMVUUpOiAgUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb24uCisJKiBmaW5kdmFyLmMgKHJlYWRfdmFyX3ZhbHVlKTogIFVzZSBTWU1CT0xfQkFTRVJFRyBpZiB2YWxpZC4KKwkqIHByaW50Y21kLmMgKGFkZHJlc3NfaW5mbyk6ICBVc2UgU1lNQk9MX0JBU0VSRUcgaWYgdmFsaWQuCisJKiBzeW1taXNjLmMgKHByaW50X3N5bWJvbCk6ICBVc2UgU1lNQk9MX0JBU0VSRUcgaWYgdmFsaWQuCisKK1NhdCBKdW4gMTMgMDk6MTg6NDYgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBydGwuY3lnbnVzLmNvbSkKKworCSogc3ltZmlsZS5jIChjbGVhcl9zeW10YWJfdXNlcnNfb25jZSk6IE5vdyBub24tc3RhdGljIChmb3IKKwlvYmpmaWxlcy5jKS4KKworRnJpIEp1biAxMiAxODo1NDo0MCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogYXJtLXBpbnNuLmMsIGk5NjAtcGluc24uYywgbTY4ay1waW5zbi5jLCBtaXBzLXBpbnNuLmMsIAorCW5zMzJrLXBpbnNuLmMsIHB5ci1waW5zbi5jLCBzcGFyYy1waW5zbi5jLCB0YWhvZS1waW5zbi5jLCAKKwl2YXgtcGluc24uYzogIFJlbW92ZSByZWdfbmFtZXMgZGVjbCAobm93IGluIGRlZnMuaCkuCisKKwlTb2xhcmlzLTIgc3VwcG9ydCBvbiBTUEFSQzoKKworCSogZGJ4cmVhZC5jOiAgQWRkIHN5bWJvbF9zaXplIHRvIHN0cnVjdCBkYnhfc3ltZmlsZV9pbmZvLgorCUFkZCBzeW1ib2xfc2l6ZSBhbmQgZmlsZSBvZmZzZXRzIHRvIHN0cnVjdCBzeW1sb2MuCisJQWRkIHN0YXRpYyBzeW1ib2xfdGFibGVfb2Zmc2V0LCBzdHJpbmdfdGFibGVfb2Zmc2V0LAorCWZpbGVfc3RyaW5nX3RhYmxlX29mZnNldCwgbmV4dF9maWxlX3N0cmluZ190YWJsZV9vZmZzZXQsIAorCWxhc3RfZnVuY3Rpb25fbmFtZS4KKwkoYWRkX29sZF9oZWFkZXJfZmlsZSk6ICBDb252ZXJ0IGVycm9yKCkgdG8gY29tcGxhaW4oKXQuCisJKGRieF9zeW1maWxlX3JlYWQpOiAgR2V0IHN5bWJvbCBzaXplIHZpYSB0aGUgb2JqZmlsZS4KKwlBbHNvIGdldCBzeW1ib2xfdGFibGVfb2Zmc2V0LgorCShkYnhfc3ltZmlsZV9pbml0KTogIFJlY29yZCBzeW1ib2wgc2l6ZSBhbmQgY291bnQgdmlhIHRoZSBvYmpmaWxlLgorCShkYnhfbmV4dF9zeW1ib2xfdGV4dCk6ICBBbHdheXMgYWRkIGZpbGVfc3RyaW5nX3RhYmxlX29mZnNldCB3aGVuCisJYWNjZXNzaW5nIHN0cmluZyB0YWJsZS4KKwkocmVhZF9kYnhfc3ltdGFiKTogIEluaXRpYWxpemUgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0IHRvIDAuCisJKFNFVF9OQU1FU1RSSU5HKTogIFVzZSB0aGUgb2Zmc2V0LgorCShlbmRfcHN5bXRhYik6ICBMYXJnZSBrbHVkZ2UgdG8gZGV0ZXJtaW5lIGFkZHJlc3NlcyB3aGVyZSBzb3VyY2UKKwlmaWxlcyBzdGFydCBhbmQgZW5kIChmb3IgdGhlIHBzeW10YWIgaGVhZGVyKS4KKwkocHN5bXRhYl90b19zeW10YWJfMSk6ICBTZXQgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0IGJlZm9yZSByZWFkaW5nLgorCUdldCB0aGlzLCBzeW1ib2wgc2l6ZSwgYW5kIHN5bWJvbCBvZmZzZXQsIGZyb20gcHN5bXRhYi4KKwkocmVhZF9vZmlsZV9zeW10YWIpOiAgRG9uJ3QgYmFjayB1cCBvbmUgc3ltYm9sIGZvciBTb2xhcmlzMi4KKwlQYXRjaCB1cCBsYXN0X3NvdXJjZV9zdGFydF9hZGRyIGlmIHplcm8gaW4gTl9TTy4KKwkocHJvY2Vzc19vbmVfc3ltYm9sKTogIEFkZCB2YXJpYWJsZSBmdW5jdGlvbl9zdGFydF9vZmZzZXQuCisJKCAiIiwgTl9GVU4sIE5fTEJSQUMsIE5fUkJSQUMsIE5fU0xJTkUpOiAgQWRkIGlmZGVmIGZvcgorCUJMT0NLX0FERFJFU1NfRlVOQ1RJT05fUkVMQVRJVkUuCisJKCAiIiwgTl9PQkosIE5fT1BUKTogIElnbm9yZS4KKwkoZWxmc3RhYl9idWlsZF9wc3ltdGFicyk6ICBOZXcgZnVuY3Rpb24gdG8gcmVhZCBzdGFicyBvdXQgb2YKKwlhbiBFTEYgZmlsZS4KKworCSogTWFrZWZpbGUuaW46ICBBY2NlcHQgJChCSVNPTikgZXZlbiB0aG91Z2ggd2UgcmVhbGx5IHdhbnQgJChZQUNDKS4KKwkoZ2RiKTogIHVzZSBHTE9CQUxfQ0ZMQUdTIHdoZW4gbGlua2luZywgdG9vLgorCSogcGFydGlhbC1zdGFiLmggKE5fVU5ERik6ICBEZWFsIHdpdGggU29sMiByZWxhdGl2ZSBzdHJpbmd0YWIgb2Zmc2V0cy4KKwkoTl9PQkosIE5fT1BUKTogIElnbm9yZS4KKwkoJ2YnLCAnRicpOiAgU2F2ZSBsYXN0IGZ1bmN0aW9uIG5hbWUuCisKKwkqIGVsZnJlYWQuYyAocmVjb3JkX21pbmltYWxfc3ltYm9sX2FuZF9pbmZvKTogIEtsdWRnZWQgdG8gcHV0CisJZXh0cmEgaW5mbyBpbiB0aGUgbWluaW1hbCBzeW1ib2wuCisJKGVsZl9zeW10YWJfcmVhZCk6ICBUaGUgZXh0cmEgaW5mbyBpcyB0aGUgc2l6ZSBvZiBhbiBFTEYgb2JqZWN0LAorCXdoaWNoIHdhcyBrbHVkZ2VkIHRvIHVzIGluIHRoZSBgdWRhdGEnIGZpZWxkIG9mIHRoZSBCRkQgc3ltYm9sLgorCUdhZyBtZSB3aXRoIGEgY3Jvd2Jhci4uLgorCShlbGZfc3ltZmlsZV9yZWFkKTogIEtlZXAgdHJhY2sgb2YgYm90aCB0aGUgYWJzb2x1dGUgbG9hZCBhZGRyZXNzLAorCWFuZCB0aGUgb2Zmc2V0IGJldHdlZW4gbG9hZCBhZGRyIGFuZCBzeW1ib2xzLiAgSGFuZGxlIFNUQUJTIGFzCisJd2VsbCBhcyBEV0FSRiBzZWN0aW9ucywgcGFzc2luZyB0aGUgYWJzb2x1dGUgbG9hZCBhZGRyZXNzIHRvCisJZWxmc3RhYl9idWlsZF9wc3ltdGFicy4KKworCSogc3ltZmlsZS5oOiAgUHJvdG90eXBlIGVsZnN0YWJfYnVpbGRfcHN5bXRhYnMuCisJKiBzeW1maWxlLmM6ICBBZGQgYWxtb3N0LU9LIGRlYnVnIHZlcnNpb25zIG9mIGFkZF9wc3ltYm9sXyp0b19saXN0LgorCisJKiB4bS1zeXN2NC5oOiAgQWRkIDxsaW1pdHMuaD4gdG8gYXZvaWQgY29uZmxpY3RpbmcgZGVmbnMgaW4gZGVmcy5oLgorCisJKiBidWlsZHN5bS5oOiAgQWRkIHByb2Nlc3NpbmdfYWNjX2NvbXBpbGF0aW9uIGZsYWcuCisJKiBidWlsZHN5bS5jIChyZWFkX3N1bl9idWlsdGluX3R5cGUsIHJlYWRfc3VuX2Zsb2F0aW5nX3R5cGUpOiAgTmV3LgorCShkZWZpbmVfc3ltYm9sKTogIFNraXAgYXJnIHR5cGVzIGluIGZ1bmN0aW9uIGVudHJpZXMuICBSZXNvbHZlCisJb3ZlcmxvYWRlZCAnUCcgd2hpY2ggYWNjIHVzZXMgZm9yIHByb3RvdHlwZXMgb2YgZnVuY3Rpb25zIGNhbGxlZAorCWJ5IHRoaXMgZmlsZS4KKwkocmVhZF90eXBlOiAnYicsICdyJyk6ICBIYW5kbGUgU29sYXJpczIgYnVpbHRpbiB0eXBlcy4KKworCSogbWluc3ltcy5jIChwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbF9hbmRfaW5mbyk6ICBIYWNrIHRvCisJc2F2ZSBzaXplIG9mIEVMRiBzeW1ib2xzLiAgRklYTUUuCisJKiB0bS1zdW40b3M1Lmg6ICBSZW5hbWUgdG8gdG0tc3VuNHNvbDIuaC4gIFVwZGF0ZSBkZWZpbmVzIGZvciBTb2wyLgorCSogeG0tc3VuNG9zNS5oOiAgUmVuYW1lIHRvIHhtLXN1bjRzb2wyLmguICBIYWNrIG1vcmUgZGVmaW5lcy4KKworCSogY29uZmlndXJlLmluOiAgU29sYXJpcyBjb25maWcgaXMgc3BhcmMtc3VuLXNvbGFyaXMyLgorCSogY29uZmlnL3N1bjRvczUubVtodF06ICBSZW5hbWUgdG8gY29uZmlnL3N1bjRzb2wyLm1baHRdOyBuZXcgeG0sIHRtLgorCisJKiBvYmpmaWxlcy5jIChmcmVlX29iamZpbGUpOiAgRWxpbWluYXRlIHN0b3JhZ2UgbGVha3MuICBDb250cmlidXRlZAorCWJ5IDxQZXRlci5TY2hhdWVyQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGJwLmRlPi4gCisJKiBzeW1maWxlLmMgKHN5bWZpbGVfYmZkX29wZW4pOiAgQ29tbWVudCB3aGVyZSBuYW1lIGlzIGZyZWVkLgorCSogc3ltbWlzYy5jIChleHRlbmRfcHN5bWJvbF9saXN0KTogIENvbW1lbnQgd2hlcmUgbGlzdCBpcyBmcmVlZC4KKworRnJpIEp1biAxMiAwODoyNDozNiAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogZXhwcHJpbnQuYyAocHJpbnRfc3ViZXhwKTogIEFkZCBtaXNzaW5nICddJy4KKwkqIGRlZnMuaCAocmVnX25hbWVzKTogIEZpeCBkZWNsYXJhdGlvbiB0byBtYXRjaCB0aGF0IGluIGluZmNtZC5jCisJKiBzdGFjay5jIChyZWdfbmFtZXMpOiAgRGVsZXRlIHJlZHVuZGFudCAoYW5kIGluY29uc2lzdGVudCkgZGVjbC4KKwkqIFdIQVRTLk5FVzogIFBvaW50IG91dCBpbXByb3ZlZCBDKysgZnVuY3Rpb24gbmFtZSBoYW5kbGluZy4KKwkqIGdkYnR5cGVzLmMgKGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlKTogIEZvciBub3csIHVzZSB0aGUgc2FtZQorCXR5cGUgbmFtZXMgZm9yIGJvdGggaW1wbGljaXRseSBhbmQgZXhwbGljaXRseSBzaWduZWQgaW50ZWdyYWwKKwl0eXBlcy4gIFNlZSBjb21tZW50IGluIHRoZSBzb3VyY2UgY29kZS4KKworVGh1IEp1biAxMSAxMjozMTo1MCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCVR3byBgbG9uZyBsb25nJyBmaXhlcyBmcm9tIFJvYmVydCBSLiBIZW5yeSAocnJoQGRpbm8udGVyYS5jb20pOgorCSogZGVmcy5oIChsb25nZXN0X3RvX2ludCk6ICBBdm9pZCB2b2lkIGFybSBvZiA/OiBpbiBlcnJvciBjYXNlLgorCSogZXhwcHJpbnQuYyAocHJpbnRfc3ViZXhwKTogIEZpeCBwcmludGluZyBvZiByZWdpc3RlciBuYW1lcy4KKworVGh1IEp1biAxMSAwMTozMzo0MCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogaW5mZXJpb3IuaCAocmVnaXN0ZXJfdmFsaWQpOiAgRGVjbGFyZS4KKwkqIHJlbW90ZS11ZGkuYywgcnM2MDAwLXhkZXAuYywgc3BhcmMteGRlcC5jLCB0bS1yczYwMDAuaDogIFJlbW92ZSBkZWNsLgorCSogb2JqZmlsZXMuaCAoQUxMX09CSkZJTEVfe1NZTVRBQlMsUFNZTVRBQlMsTVNZTUJPTFN9KTogIEFkZAorCW1hY3JvcyBmb3IgdHJhdmVyc2luZyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGluIGEgc2luZ2xlIG9iamZpbGUuCisJKiB0bS1tODhrLmgsIHRtLXNwYXJjLmggKFJFR0lTVEVSX05BTUVTKTogIFJlbW92ZSBleHRyYSBzZW1pY29sb24uCisJKiB0bS1pOTYwLmggKFJFR0lTVEVSX05BTUVTKTogIENvc21ldGljIGNoYW5nZS4KKwkqIGluZmNtZC5jOiAgTGludC4KKworVHVlIEp1biAgOSAxNzoxOTo0NSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogYy1leHAueSwgbTItZXhwLnk6ICBNb3ZlIHJlbWFwcGluZyBkZWZpbmVzIGZvciBtYWxsb2MgYW5kCisJcmVhbGxvYy4gIEFkZCByZW1hcHBpbmcgZGVmaW5lcyBmb3Ige3l5c3MsIHl5c3NwLCB5eXZzLCB5eXZzcH0uCisJKiBjb25maWcve2FtaXgubWgsIGkzODZ2NC5taCwgbmNyMzAwMC5taCwgc3RyYXR1cy5taCwKKwlzdW40b3M1Lm1ofTogIEFkZCBkZWZpbml0aW9uIGZvciBJTlNUQUxMIHVzaW5nIC91c3IvdWNiL2luc3RhbGwuCisKK1R1ZSBKdW4gIDkgMTY6Mjk6MTkgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogZGVwZW5kOiAgcmVidWlsZCB0byBhY2NvdW50IGZvciByZW1vdGUtc3QyMDAwLmMuCisJKiByZW1vdGUtc3QyMDAwLmM6ICBBbG1vc3Qgd29ya3Mgbm93LgorCSogdG0tc3QyMDAwLmg6ICBOZWVkIHRvIHR1cm4gb24gSEFWRV82ODg4MSwgZWxzZSB0aGluZ3Mgd29uJ3QgY29tcGlsZS4KKworTW9uIEp1biAgOCAyMzowNTo1MSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogYy1leHAueSAoeXlsZXgpOiAgUmVjb2duaXplIHNpbmdsZS1xdW90ZWQgc3RyaW5ncyB0aGF0IHNwZWNpZnkKKwl0b2tlbnMgd2l0aCBlbWJlZGRlZCB3aGl0ZXNwYWNlLCBzdWNoIGFzIEMrKyBkZW1hbmdsZWQgbmFtZXMuCisJKiBkZWZzLmggKGRlbWFuZ2xlX2FuZF9tYXRjaCwgc3RyY21wX2l3LCBza2lwX3F1b3RlZCk6ICBQcm90b3R5cGVzLgorCSogbWFpbi5jIChnZGJfY29tcGxldGVyX3F1b3RlX2NoYXJhY3RlcnMpOiAgQWRkIGdsb2JhbCB2YXJpYWJsZS4KKwkqIG1haW4uYyAoc3ltYm9sX2NvbXBsZXRpb25fZnVuY3Rpb24pOiAgVG90YWwgcmV3cml0ZSBmb3IgQysrCisJZGVtYW5nbGVkIG5hbWUgaGFuZGxpbmcuCisJKiBtYWluLmMgKHNraXBfcXVvdGVkKTogIE5ldyBmdW5jdGlvbi4KKwkqIG1haW4uYyAobWFpbik6ICBTZXQgcmxfY29tcGxldGVyX3F1b3RlX2NoYXJhY3RlcnMuCisJKiBzeW1taXNjLmMgKGR1bXBfc3ltdGFiKTogIFByaW50IHNvdXJjZSBsYW5ndWFnZSBmb3Igc3ltdGFiLgkKKwkqIHN5bXRhYi5jIChleHBlbnNpdmVfbWFuZ2xlcik6ICBBZGQgcHJvdG90eXBlIGFuZCBmdW5jdGlvbi4KKwkqIHN5bXRhYi5jIChjb21wbGV0aW9uX2xpc3RfYWRkX3N5bWJvbCk6ICBUb3RhbCByZXdyaXRlIGZvciBuZXcKKwlDKysgZGVtYW5nbGVkIG5hbWUgaGFuZGxpbmcuCisJKiBzeW10YWIuYyAobG9va3VwX3N5bWJvbCk6IENoZWNrIGZvciBkZW1hbmdsZWQgQysrIHN5bWJvbCBmaXJzdCwKKwlvdGhlciBjaGFuZ2VzIGZvciBkZW1hbmdsZWQgQysrIHN5bWJvbCBoYW5kbGluZy4KKwkqIHN5bXRhYi5jIChsb29rdXBfZGVtYW5nbGVkX2Jsb2NrX3N5bWJvbCk6ICBVc2UgZGVtYW5nbGVfYW5kX21hdGNoLgorCSogc3ltdGFiLmMgKGxvb2t1cF9kZW1hbmdsZWRfcGFydGlhbF9zeW1ib2wpOiAgVXNlIGRlbWFuZ2xlX2FuZF9tYXRjaC4KKwkqIHN5bXRhYi5jIChkZWNvZGVfbGluZV8xKTogIFJlY29nbml6ZSBDKysgZGVtYW5nbGVkIG5hbWVzIG9uIGlucHV0LgorCSogc3ltdGFiLmMgKGNvbXBsZXRpb25fbGlzdF9hZGRfc3ltYm9sKTogIFRvdGFsIHJld3JpdGUgZm9yIG5ldworCUMrKyBkZW1hbmdsZWQgbmFtZSBoYW5kbGluZy4KKwkqIHN5bXRhYi5jIChleHBlbnNpdmVfbWFuZ2xlcik6ICBOZXcgZnVuY3Rpb24uCisJKiB1dGlscy5jIChzdHJjbXBfaXcsIGRlbWFuZ2xlX2FuZF9tYXRjaCk6ICBOZXcgZnVuY3Rpb25zLgorCSogeGNvZmZyZWFkLmMgKGFpeGNvZmZfc3ltZmlsZV9yZWFkKTogIEZpeCBwcm90b3R5cGUuCisKK01vbiBKdW4gIDggMjE6NTk6MDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgUm9sbCBWRVJTSU9OIHRvIDQuNS40LgorCSogTWFrZWZpbGUuaW4sIGNvbmZpZy8qLm1oLCBjb25maWcvKi5tdDogIFJlbmFtZSBUTV9DRkxBR1MKKwl0byBNVF9DRkxBR1MsIFhNX0NGTEFHUyB0byBNSF9DRkxBR1MgdG8gbWF0Y2ggZmlsZSBuYW1lcy4KKwkqIGNvbmZpZy9zdW40b3M1Lm1oOiAgQWRkIE1IX0NGTEFHUz0teHMgdG8gc2F2ZSBkZWJ1ZyBpbmZvLgorCitNb24gSnVuICA4IDE0OjE3OjQyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGFsbGRlcHMubWFrOiAgUmVidWlsZCB0byBhY2NvdW50IGZvciBuZXcgZmlsZXMuCisJKiBjb25maWcvc3QyMDAwLm10OiAgVXNlIHRtLXN0MjAwMC5oLCBub3QgdG0tNjhrLmguCisJKiB0bS1zdDIwMDAuaDogIE5ldyBmaWxlLgorCSogY29uZmlndXJlLmluOiAgVGFuZGVtIGRlYnVnIG1vbml0b3IgKHN0MjAwMCkgc3VwcG9ydC4KKwkqIHJlbW90ZS1zdDIwMDAuYywgY29uZmlnL3N0MjAwMC5tdDogIGRpdHRvLgorCitGcmkgSnVuICA1IDExOjUxOjAxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBibG9ja2ZyYW1lLmMgKGluc2lkZV9lbnRyeV9maWxlLCBpbnNpZGVfbWFpbl9mdW5jLAorCWluc2lkZV9lbnRyeV9mdW5jKTogIFJldHVybiAwIGlmIG5vIHN5bWJvbHM7IGF2b2lkIGNyYXNoaW5nLgorCitXZWQgSnVuICAzIDE3OjQ4OjA0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiB4Y29mZnJlYWQuYyAocmVhZF94Y29mZl9zeW10YWIpOiAgU2V0IGNfc2NsYXNzIGZyb20gbl9zY2xhc3MKKwl3aXRob3V0IG1hc2tpbmcsIHNpbmNlIGl0IGlzIHNpZ25lZCBhbmQgd2lsbCBsYXRlciBiZSBjb21wYXJlZAorCWFnYWluc3Qgc2lnbmVkIHF1YW50aXRpZXMuICBUaGUgcmlnaHQgZml4IGlzIHByb2JhYmx5IHRvIG1ha2UKKwlpdCBhbGwgdW5zaWduZWQsIGJ1dCB0aGlzIGlzIGEgc21hbGwsIHNhZmUgZml4IGZvciB0aGlzIHJlbGVhc2UuCisJRklYTUUgLS0gbWFrZSB0aGUgcmVhbCBjaGFuZ2Ugc29tZXRpbWUgc29vbi4KKworTW9uIEp1biAgMSAxNjoxNjoxMiAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQGN5Z251cy5jb20pCisKKwkqIHJlbW90ZS12eC5jICh2eF9sb2FkX2NvbW1hbmQsYWRkX3N5bWJvbF9zdHViKTogRGVmYXVsdCBSRUFETk9XCisJcGFyYW1ldGVyIGluIGNhbGwgdG8gYHN5bWJvbF9maWxlX2FkZCcgdG8gMC4KKworCSogeG0tc3VuNG9zNC5oIChNQUxMT0NfSU5DT01QQVRJQkxFKTogRGVmaW5lIGl0LgorCitTdW4gTWF5IDMxIDA2OjM4OjI3IDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBIYW5kbGUgLW02ODBbMDEyMzRdMC13cnMuCisKK0ZyaSBNYXkgMjkgMjI6MTY6MDIgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBydGwuY3lnbnVzLmNvbSkKKworCSogbTY4ay1waW5zbi5jIChwcmludF9pbnNuX2FyZyk6IFBhc3MgJkVYVF9GT1JNQVRfNjg4ODEgdG8KKwlgaWVlZV9leHRlbmRlZF90b19kb3VibGUnLgorCitXZWQgTWF5IDI3IDA5OjI3OjU3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiB2YWxvcHMuYyAodmFsdWVfYXNzaWduKTogIExpbnQsIGJ5IFBpZXJyZSBXaWxsYXJkLgorCitUdWUgTWF5IDE5IDE5OjM4OjEwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBjb3JlZGVwLmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogIFJlbW92ZSBwcmVtYXR1cmUgd2FybmluZywKKwl3aGljaCB0cmlnZ2VycyBvbiBERUNzdGF0aW9uIGV2ZW4gdGhvdWdoIGFsbCByZWdzIGFyZSBhY2Nlc3NpYmxlLgorCisJKiBtNjhrLXBpbnNuLmMgKHByaW50X2luc25fYXJnKTogIFVzZSBuZXcgbWFjcm9zIHRvIGdldAorCXNpZ24tZXh0ZW5zaW9uIG9mIGluc3RydWN0aW9uIGZpZWxkcyBldmVuIG9uIHVuc2lnbmVkLWNoYXIgaG9zdHMuCisJQnVnIGZvdW5kIGJ5IEZyZWQgSiBSb2ViZXIsIGZqckBzZ2ZiLnNzZC5yYXkuY29tLgorCisJODhLIGNoYW5nZXMgaW5zcGlyZWQgYnkgVGVkIExlbW9uICh1dW5ldCFsdXBpbmUhbWVsbG9uKToKKwkqIHRtLW04OGsuaCwgdG0tdW1heC5oOiAgQXZvaWQgc2l6ZW9mKCkgaW4gUkVHSVNURVJfeHh4IG1hY3JvcywKKwlzaW5jZSB0aGV5IGRlZmluZSB0aGUgdGFyZ2V0LCBub3QgdGhlIGhvc3QuCisJKiBtODhrLXBpbnNuLmM6ICBGaXggdHlwby4KKworVGh1IE1heSAxNCAwMToxNjo0OCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogdmFsYXJpdGguYyAodmFsdWVfemVyb3ApOiAgLTAuMCBpcyBzdGlsbCB6ZXJvLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiAgQXZvaWQgTmFOIGFub21hbGllcyBpbiBmbG9hdCBjb21wYXJlcy4KKwlQYXRjaGVzIGJ5IFBhdWwgRWdnZXJ0IDxlZ2dlcnRAdHdpbnN1bi5jb20+LgorCitNb24gTWF5IDE4IDEzOjUzOjUxIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGFsbGRlcHMubWFrLCBkZXBlbmQ6ICByZS1tYWtlIHRvIGFjY291bnQgZm9yIHNlci0qLmMuCisKK1N1biBNYXkgMTcgMTY6NTE6MjAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGluZmxvdy5jIChuZXdfdHR5KTogIFRlbXBvcmFyaWx5IGlnbm9yZSBTSUdUVE9VIHdoZW4KKwlkaXNjb25uZWN0aW5nIGZyb20gY29udHJvbGxpbmcgdGVybWluYWwsIHRvIGF2b2lkIGdkYiBoYW5naW5nCisJb24gU1ZSNC4gIEZpeGVzIGJ1ZyByZXBvcnRlZCBieSBPbGl2ZXIgT2tyb25nbGkuCisJKiBwcm9jZnMuYyAoUFJPQ19OQU1FX0ZNVCk6ICBDaGFuZ2UgZm9ybWF0IHRvIG1hdGNoIGRlZmF1bHQgdXNlZAorCWJ5IHN5c3RlbSwgYXMgc3VnZ2VzdGVkIGJ5IE9saXZlciBPa3JvbmdsaS4KKwkqIHRtLTY4ay5oIChGUkFNRV9GSU5EX1NBVkVEX1JFR1MpOiAgQXBwbHkgbWlzc2luZyBwYXJlbnRoZXNlcworCWJ1ZyBmaXggZnJvbSBCcmVudCBUb3duc2hlbmQgKGJzdCV0dEBjYW0uT1JHKS4KKwkqIGMtZXhwLnkgKG5vbmVtcHR5X3R5cGVsaXN0KTogIEZpeCBtZW1vcnkgb3ZlcnJ1biBidWcgcmVwb3J0ZWQKKwlieSB0dXJsYWlzQHJlY2hzZXIudG90YWwuZnIuCisJKiBkd2FyZnJlYWQuYyAoZGVjb2RlX3N1YnNjcl9kYXRhKTogIEZpeCBidWcgaW4gY2FsY3VsYXRpb24gb2YKKwlsZW5ndGggb2Ygbm9uLXplcm8gbG93ZXJib3VuZCBhcnJheXMuICBCdWcgZml4IGZyb20gUGVnZ3kgRmllbGFuZC4KKwkqIG9iamZpbGVzLmggKHVubGlua19vYmpmaWxlKTogIEFkZCBwcm90b3R5cGUuCisJKiBvYmpmaWxlcy5jICh1bmxpbmtfb2JqZmlsZSk6ICBBZGQgZnVuY3Rpb24uCisJKiBvYmpmaWxlcy5jIChmcmVlX29iamZpbGUpOiAgQ2FsbCB1bmxpbmtfb2JqZmlsZS4KKwkqIG9iamZpbGVzLmMgKGFsbG9jYXRlX29iamZpbGUpOiAgQ2FsbCB1bmxpbmtfb2JqZmlsZSBvbiBuZXdseQorCXJlbWFwcGVkIG9iamZpbGVzLiAgQnVnIHJlcG9ydGVkIGJ5IGhhaG5Ac3Vuc2hpbmUubGFicy50ZWsuY29tLgorCUFsc28sIGRpc2NhcmQgb2xkIHBvc3NpYmx5IGJvZ3VzIHNmIHN0cnVjdC4KKwkqIHN5bWZpbGUuYyAoc3ltYm9sX2ZpbGVfYWRkKTogIENhbGwgaW5pdF9lbnRyeV9wb2ludF9pbmZvKCkgYW5kCisJZmluZF9zeW1fZm5zKCkgZm9yIHJlbWFwcGVkIHN5bWJvbCBmaWxlcywgaW4gY2FzZSBvZiBhbnkgY2hhbmdlcworCXNpbmNlIHRoZSBsYXN0IG1hcHBpbmcuCisKK1dlZCBNYXkgMTMgMTg6Mjg6MjAgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGZpbmR2YXIuYyAocmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMpOiB1c2UgdGhlIHJhdyBzaXplCisJb2YgYSByZWdpc3RlciB0byBiY29weSwgcmF0aGVyIHRoYW4gdGhlIGhvc3QncyBzaXplb2YoQ09SRV9BRERSKS4KKworVHVlIE1heSAxMiAxNzo0NDozOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCUNoYW5nZXMgdG8gc3VwcG9ydCBHREIgcnVubmluZyBvbiBET1MgdXNpbmcgR08zMiBhbmQgSDggc3VwcG9ydAorCisJKiBkZWZzLmg6IGlmIHhtLmggZG9lc24ndCBkZWZpbmUgRk9QRU5fUkIsIGluY2x1ZGUgImZvcGVuLXNhbWUuaCIsCisJYWxsb3dpbmcgaG9zdHMgd2l0aCBkaWZmZXJlbnQgdGV4dCBhbmQgYmluYXJ5IGZpbGUgZm9ybWF0cyB0bworCXdvcmsuCisJKiBjb2ZmcmVhZC5jIChyZWFkX2NvZmZfc3ltdGFiKTogY2hhbmdlZCBjYWxsaW5nIGNvbnZlbnRpb24gYW5kCisJb3BlcmF0aW9uIC0gbm93IGl0IG9wZW5zIGl0cyBvd24gZmlsZSB3aXRoIEZPUEVOX1JCIHJhdGhlciB0aGFuCisJZHVwaW5nIGFuZCBmZG9wZW5pbmcgdGhlIHByb3ZpZGVkIGhhbmRsZS4KKwkqIGRieHJlYWQuYywgY3BsdXMtZGVtLmM6ICNpbmNsdWRlIG1hbmdsaW5nLgorCSogZXhlYy5jOiBJZiBPX0JJTkFSWSBpc24ndCBkZWZpbmVkLCBzZXQgaXQgdG8gMCwgY2FsbCBvcGVucCBmb3IKKwliaW5hcnkgZmlsZXMgb3JpbmcgaW4gdGhlIHJpZ2h0IGJpdC4KKwkqIHV0aWxzLmMsIHRlcm1pbmFsLmgsIGluZmxvdy5jOiBoYWNrZXJ5IGJlY2F1c2UgZG9zIGRvZXNuJ3QgaGF2ZSB0ZXJtaW5hbHMuCisJKiByZW1vdGUtaG1zLmM6IGNsZWFudXAgdG8gdXNlIHRoZSBuZXcgcmVtb3RlIHNlcmlhbCBzdHVmZgorCSogc2VyaWFsLmgsIHNlci10ZXJtaW9zLmMsIHNlci1nbzMyLmM6IG5ld2ZpbGVzIHRvIHByb3ZpZGUgaG9zdAorCWluZGVwZW5kZW50IHJlbW90ZSB0ZXJtaW5hbCBJL08uCisJKiByZW1vdGUuYzogaWYgRE9OVF9VU0VfUkVNT1RFIG5vdCBkZWZpbmVkLCB0aGVuIGRvbid0IHVzZSBpdC4KKwkqIHNvdXJjZS5jIChvcGVucCk6IGZpeCBvZmYgYnkgb25lIHByb2JsZW0gcmVtb3ZpbmcgLyAtIGNhbiBub3cKKwlvcGVuIGEgc291cmNlIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IHdpdGggRE9TLgorCSogdmFsdWVzLmMgKHZhbHVlX2FzX3BvaW50ZXIpOiByZW1vdmUgYm9ndXMgYWRkcmVzcyBiaXRzIGZyb20KKwlsb25nLiAodW5wYWNrX2xvbmcpOiB1bnBhY2sgaW50byB1bnNpZ25lZCBsb25nL3Nob3J0IGlmIHBvaW50ZXIuCisKK1R1ZSBNYXkgMTIgMTQ6MTU6NDggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogaW5mcnVuLmMgKGNoaWxkX2F0dGFjaCk6ICBEb24ndCBhbGxvdyBnZGIgdG8gYXR0YWNoIHRvIGl0c2VsZi4KKwlJdCBnZXRzIHBlcm1hbmVudGx5IHN0dWNrIGluIG1hbnkgT1Nlcy4KKwkqIGJyZWFrcG9pbnQuYywgaW5mY21kLmMsIGluZnJ1bi5jLCB1dGlscy5jOiAgQ2hhbmdlIG1hbnkgcHJpbnRmcworCXRvIHByaW50Zl9maWx0ZXJlZC4KKwkqIGJyZWFrcG9pbnQuYzogSW1wcm92ZQloZWxwIHRleHQgZm9yIGluZm8gYnJlYWtwb2ludHMuCisKK01vbiBNYXkgMTEgMTQ6MTc6MTggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIFJFQURNRTogIEFkZCBwb2ludGVyIHRvIGludGVybmFscyBkb2MsIGFuZCBkZXNjcmliZSByZWFkaW5nCisJaW5mbyBmaWxlcy4KKwkqIHV0aWxzLmMgKHByaW50X3N5c19lcnJtc2cpOiAgVXNlIHN0ZGVyci4gIFJlcG9ydGVkIGJ5IFBpZXJyZSBXaWxsYXJkLgorCSogc3ltdGFiLmMgKG91dHB1dF9zb3VyY2VfZmlsZW5hbWUpOiAgUmVtb3ZlIG9sZCBnbG9wIGZvciB3cmFwcGluZworCWxpbmVzLCB1c2Ugd3JhcF9oZXJlLiAgUmVwb3J0ZWQgYnkgUGllcnJlIFdpbGxhcmQgKHBpZXJyZUBsYS50Y2UuY29tKS4KKworVGh1IE1heSAgNyAxMTo0NTowMyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICB2ZXJzaW9uLmMgc2hvdWxkIGRlcGVuZCBvbiBNYWtlZmlsZSwgbm90IE1ha2VmaWxlLmluLgorCSogbXVuY2g6ICBBZGQgc29ydCAtdSB0byBhdm9pZCBkdXBsaWNhdGlvbnMuCisJKiBzeW10YWIuYyAobG9va3VwX3N5bWJvbCk6ICBJbXByb3ZlIFN0dSdzIGZpeCBvZiAyMiBBcHJpbC4KKwlJbXByb3ZlZCBmaXggYnkgaGFobkBzdW5zaGluZS5sYWJzLnRlay5jb20gKERvdWcgSGFobikuCisKK01vbiBNYXkgMTEgMTM6Mjc6NDYgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9zaWduYXR1cmUpOiAgUmVjb2duaXplIG1pc3BsYWNlZCAnXycgdG8KKwlhdm9pZCBpbmZpbml0ZSBsb29wcyB3aGlsZSBkZW1hbmdsaW5nIGJvZ3VzIG1hbmdsZWQgbmFtZXMuCisJKiB2YWxwcmludC5jICh0eXBlX3ByaW50X2Jhc2UpOiAgTWlub3IgZml4IGZvciBHTlUgc3R5bGUgZ3VpZGUKKwljb25mb3JtYW5jZS4KKworU2F0IE1heSAgOSAxODowMjoxNyAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgZmlzaHBvbmQpCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIEJ1bXAgdG8gNC41LjMKKwkqIE1ha2VmaWxlLmluIChERU1BTkdMRV9PUFRTKTogIFJlbW92ZSBvYnNvbGV0ZSAtRG5vdW5kZXJzY29yZQorCSogTWFrZWZpbGUuaW4gKGRlbWFuZ2xlKTogIE5ldyB0YXJnZXQgdG8gY3JlYXRlIHN0YW5kYWxvbmUKKwlkZW1hbmdsZXIgd2l0aCBzYW1lIGNvZGUgYW5kIG9wdGlvbnMgYXMgaW50ZXJuYWwgZGVtYW5nbGVyLgorCSogY3BsdXMtZGVtLmM6ICBNYXNzaXZlIHJlc3RydWN0dXJpbmcsIHJld3JpdGluZywgY2xlYW51cHMsIGV0YworCXRvIHN1cHBvcnQgQVJNIHN0eWxlIGFuZCBMdWNpZCBzdHlsZSBkZW1hbmdsaW5nLCBpbXByb3ZlCisJbWFpbnRhaW5hYmlsaXR5LCBmaXggc2V2ZXJhbCBkZW1hbmdsaW5nIGJ1Z3MuICBNb3JlIGNoYW5nZXMKKwl0byBmb2xsb3cuCisJKiBkZWZzLmggKHN0cnN0cik6ICBBZGQgQU5TSSBjb21wYXRpYmxlIHByb3RvdHlwZS4KKwkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfMSk6ICBEZW1hbmdsZSB1c2luZyBhbnNpIG9wdGlvbi4KKwkqIGNvbmZpZy9uY3IzMDAwLm10IChERU1BTkdMRV9PUFRTKTogIFJlbW92ZSAtRG5vdW5kZXJzY29yZS4KKworU2F0IE1heSAgOSAxNDo0NzoyOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiB4Y29mZmV4ZWMuYyAodm1hcF9leGVjKTogIERvbid0IGFzc3VtZSAudGV4dCBhbmQgLmRhdGEgYXJlIHRoZQorCWZpcnN0IHR3byBzZWN0aW9ucy4KKworRnJpIE1heSAgOCAxMTo0MjoxNSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3Byb2NlZHVyZSk6ICBSZXR1cm4gcmF0aGVyIHRoYW4gdXNpbmcKKwl1bmluaXRpYWxpemVkIHZhcmlhYmxlICdiJy4KKworRnJpIE1heSAgOCAwNzo0ODoyNyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiwgcmVtb3RlLXVkaS5jLCByZW1vdGUtdnguYywgMjlrLXNoYXJlL2RmZS9taW5pMnVkaS5jLAorCTI5ay1zaGFyZS9kZmUveWFuay5jLCB2eC1zaGFyZS94ZHJfcHRyYWNlLmMsIHZ4LXNoYXJlL3hkcl9yZWdzLmM6CisJUmVtb3ZlIC1JMjlrLXNoYXJlLCAtSXZ4LXNoYXJlIGZyb20gTWFrZWZpbGUuaW4uICBNYWtlICNpbmNsdWRlcworCXJlbGF0aXZlIHRvIGVhY2ggc291cmNlIGZpbGUuCisKK0ZyaSBNYXkgIDggMDc6NDg6MjcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBwcm9wb2dhdGUgSU5TVEFMTCwgSU5TVEFMTF9EQVRBLCBJTlNUQUxMX1BST0dSQU0gb24KKwlyZWN1cnNpb25zLgorCitUaHUgTWF5ICA3IDEwOjAwOjUyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGFtMjlrLXBpbnNuLmM6ICBVc2UgbmV3IG9wY29kZSB0YWJsZSBpbiAib3Bjb2RlL2EyOWsuaCIuCisJKiBhbTI5ay10ZGVwLmM6ICBVcGRhdGUgdG8gbGF0ZXN0IGNvZGUgZnJvbSBBTUQuCisJKGdldF9zYXZlZF9yZWdpc3RlcikgZG9uJ3QgY3JhcCBvdXQgaWYgbm8gZnJhbWUuCisJKiByZW1vdGUtdWRpLmM6ICBTZXQvY2xlYXIgaW5mZXJpb3JfcGlkIGFzIGFwcHJvcHJpYXRlLgorCSh1ZGlfb3BlbikgY2FsbCB0YXJnZXRfcHJlb3BlbiwgZG9uJ3QgY2xvc2UgZmQgMCEhISwgY2xlYW4gdXAKKwllcnJvciBoYW5kbGluZy4gIEZpeHVwIGVuZC1vZi1kZWJ1Z2dpbmcgbWVzc2FnZXMuCisJKHVkaV9mZXRjaF9yZWdpc3RlcnMpIGNsZWFuIHVwIGJpZyB0aW1lLCBtYWlubHkgZG9uJ3QgbXVsdGlwbHkKKwlyZWdpc3Rlcl92YWxpZCBpbmRpY2VzIGJ5IDQsIGFuZCB1c2UgcHJvcGVyIE9mZnNldCB3aGVuIHJlYWRpbmcKKwlncjk2LWdyMTI3LiAgKHVkaV9zdG9yZV9yZWdpc3RlcnMpIGdlbmVyYWwgY2xlYW51cC4KKwkoZmV0Y2hfcmVnaXN0ZXIpIGNsZWFudXAsIHNpbXBsaWZ5LiAgKHJlZ251bV90b19zcm51bSkKKwlJTlRfUkVHTlVNLT5JTlRFX1JFR05VTS4KKwkqIHRtLTI5ay5oOiAgVXBncmFkZSB0byBsYXRlc3QgY29kZSBmcm9tIEFNRC4KKwkqIDI5ay1zaGFyZS91ZGkvdWRpcDJzb2MuYzogIEdldCByaWQgb2YgdXNlbGVzcyBlcnJtc2dfbSBtYWNyby4KKwkoVURJQ29ubmVjdCkgQ2xlYW4gdXAgZXJyb3IgcHJvY2Vzc2luZyAobGlrZSwgZG9uJ3QgZG8gZXhpdCgpIGlmCisJZXhlY2xwIGZhaWxzKSwgbWFrZSBjb2RlIHJlc3RhcnRhYmxlLCBtYWtlIG1vcmUgYXR0cmFjdGl2ZS4KKwkoVURJU3RvcCkgVXNlIFNJR0lOVCBpbnN0ZWFkIG9mIFNJR1VTUjEsIGFzIGlzc3RpcCB3b24ndCBzdG9wCisJb3RoZXJ3aXNlLgorCitXZWQgTWF5ICA2IDE0OjM0OjE4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogdG0taXJpeDMuaDogIFJlLWRlZmluZSBDUExVU19NQVJLRVIgdG8gJy4nLgorCSogeG0tcnM2MDAwLmgsIHRtLXJzNjAwMC5oOiAgTW92ZSByZS1kZWZpbml0aW9uIG9mIENQTFVTX01BUktFUgorCWZyb20gZm9ybWVyIHRvIGxhdHRlci4KKworV2VkIE1heSAgNiAxNDoxMjozNSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogY3BsdXMtZGVtLmMgKGRvX2FyZ3MpOiAgSGFuZGxlIHZvaWQgYXJncyB0aGUgc2FtZSBhcyBvdGhlcnMuCisJKiBvYmpmaWxlcy5jIChmcmVlX29iamZpbGUpOiAgT25seSB0cnkgdG8gdW5tYXAgZmlsZXMgd2hlbgorCXJldXNhYmxlIG9iamZpbGVzIGFyZSBzdXBwb3J0ZWQuCisJKiB2YWxwcmludC5jICh0eXBlX3ByaW50X3ZhcnNwZWNfc3VmZml4KTogIEFkZCBwYXJhbWV0ZXIgdGhhdAorCXNwZWNpZmllcyBpZiBDKysgZGVtYW5nbGluZyBpbmNsdWRlZCBmdW5jdGlvbiBhcmd1bWVudHMuICBVc2UKKwlpdCB0byBzdXBwcmVzcyBwcmludGluZyBleHRyYSBwYWlyIG9mICgpJ3MuCisJKiB2YWxwcmludC5jICh0eXBlX3ByaW50XzEpOiAgRml4IHByb2JsZW0gd2l0aCBwcmludGluZyBkZW1hbmdsZWQKKwlDKysgZnVuY3Rpb24gdHlwZXMgd2hlcmUgZGVtYW5nbGVkIHR5cGUgaW5jbHVkZXMgdGhlIGZ1bmN0aW9uCisJYXJncy4KKworVHVlIE1heSAgNSAxMToxMDoyNyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKERFTUFOR0xFUik6ICBEZWZpbmUgYW5kIGRlZmF1bHQgdG8gY3BsdXMtZGVtLgorCUFsbG93cyBzZWxlY3Rpb24gb2YgQysrIGRlbWFuZ2xlciB0byBiZSBhIGNvbmZpZ3VyYXRpb24gb3B0aW9uCisJdW50aWwgbXVsdGlwbGUgZGVtYW5nbGVycyBhcmUgc3VwcG9ydGVkLgorCSogZGVtYW5nbGUuaDogIE5ldyBpbmNsdWRlIGZpbGUgZm9yIGV4dGVuZGVkIGRlbWFuZ2xlciBzdXBwb3J0LgorCSogYnJlYWtwb2ludC5jLCBnZGJ0eXBlcy5jLCBwcmludGNtZC5jLCBzdGFjay5jLCBzeW10YWIuYywKKwl1dGlscy5jLCB2YWxwcmludC5jOiAgSW5jbHVkZSAiZGVtYW5nbGUuaCIgYW5kIGNoYW5nZSBhbGwgY2FsbHMKKwl0byBjcGx1c19kZW1hbmdsZSgpIG9yIGZwdXRzX2RlbWFuZ2xlZCgpIHRvIHVzZSBpbmRpdmlkdWFsCisJZGVtYW5nbGluZyBvcHRpb25zLgorCSogdmFscHJpbnQuYyAodHlwZV9wcmludF8xKTogIENoYW5nZSBvcHRpb25zIHRvIGNwbHVzX2RlbWFuZ2xlCisJdG8gcHJpbnQgZGVtYW5nbGVkIGZ1bmN0aW9uIGFyZ3MuICBTdGlsbCBicm9rZW4sIGJ1dCBub3cgbGVzcyBzby4KKwkqIGNwbHVzLWRlbS5jOiAgSW5jbHVkZSBkZW1hbmdsZS5oLCByZW9yZ2FuaXplIGFuZCB1cGRhdGUgc29tZQorCWNvbW1lbnRzIHRvIHJlZmxlY3QgcmVhbGl0eS4KKwkqIGNwbHVzLWRlbS5jIChjcGx1c19kZW1hbmdsZSwgY3BsdXNfbWFuZ2xlX29wbmFtZSk6ICBDaGFuZ2UKKwlzZWNvbmQgYXJnIGZyb20gZml4ZWQgaW50ZWdlciB0byBiaXQgYmFzZWQgbXVsdGlwbGUgb3B0aW9ucy4KKwkqIGNwbHVzLWRlbS5jIChvcHRhYmxlKTogIFJlZm9ybWF0IGFuZCByZXBsYWNlIGFuc2kgbWVtYmVycyB3aXRoCisJYml0IGJhc2VkIG9wdGlvbnMuCisJKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6ICBGaXggYnVnIHdpdGggcGFyc2luZyBtaXNzaW5nIHJldHVybiB0eXBlLgorCitNb24gTWF5ICA0IDIyOjI2OjU5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiB2YWx1ZXMuYyAoc2V0X2ludGVybmFsdmFyKTogIEZvcmNlIGV2YWx1YXRpb24gb2YgbGF6eSB2YWx1ZXMuCisJQnVnIHJlcG9ydGVkIGJ5IFJNUy4KKworU3VuIE1heSAgMyAxNTo0Nzo0NSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiAgQnVtcCB0byA0LjUuMi4KKwkqIE1ha2VmaWxlLmluIChERU1BTkdMRV9PUFRTKTogIEFkZCwgZGVmYXVsdCB0byAtRG5vdW5kZXJzY29yZS4KKwkqIGNvbmZpZ3VyZS5pbjogIFNpbXBsaWZ5IG5jcjMwMDAgZ2RiX2hvc3QgbG9naWMsIGFkZCBnZGJfdGFyZ2V0LgorCSogZHdhcmZyZWFkLmMgKHN0cnVjdF90eXBlKTogIEFwcGx5IGZpeCBmcm9tIFBlZ2d5IEZpZWxhbmQgZm9yCisJcHJvcGVyIGhhbmRsaW5nIG9mIGJpdCBmaWVsZHMuCisJKiBnZGJ0eXBlcy5oIChzdHJ1Y3QgdHlwZSk6ICBDbGFyaWZ5IHVzZSBvZiBmaWVsZC5iaXRwb3MuCisJKiBzeW10YWIuaDogIEZpeCBjb3VwbGUgb2YgbWlzc3BlbGxpbmdzIGluIGNvbW1lbnRzLgorCSogdmFsdWUuaCAoc3RydWN0IHZhbHVlKTogIENsYXJpZnkgdXNlIG9mIGJpdHBvcy4KKwkqIHZhbHVlLmggKHVucGFja19maWVsZF9hc19sb25nKTogIENoYW5nZSBwcm90b3R5cGUsIHJldHVybnMKKwlMT05HRVNULgorCSogdmFsdWVzLmMgKHVucGFja19maWVsZF9hc19sb25nKTogIENoYW5nZSByZXR1cm4gdHlwZSB0byBMT05HRVNULAorCXNpZ24gZXh0ZW5kIHVucGFja2VkIGZpZWxkcyB0aGF0IGFyZSBzaWduZWQsIG90aGVyIHJld3JpdGluZy4KKwkqIGNvbmZpZy9uY3IzMDAwLm10OiAgTmV3IHRhcmdldCBjb25maWcgZmlsZS4KKworRnJpIE1heSAgMSAwMTo1MzoyNiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogdXRpbHMuYyAocHJpbnRjaGFyKTogIFByaW50IDB4N0YgYW5kIDB4ODAtMHg5RiBpbiBcbm5uIG5vdGF0aW9uCisJZXZlbiB3aGVuIHByaW50aW5nIDgtYml0IGNoYXJhY3RlcnMuCisKKwkqIGdkYnR5cGVzLmMgKG1ha2Vfe3JlZmVyZW5jZSxwb2ludGVyLGZ1bmN0aW9ufV90eXBlKTogIE5ldworCWZ1bmN0aW9ucyB3aGljaCBoYW5kbGUgb3ZlcndyaXRpbmcgb2YgZm9yd2FyZC1yZWZlcmVuY2VkIHR5cGVzCisJZm9yIHN0YWJzIGZpbGUgcmVhZGluZy4KKwkobG9va3VwX3tyZWZlcmVuY2UscG9pbnRlcixmdW5jdGlvbn1fdHlwZSk6ICBUaGVzZSBqdXN0IGNhbGwKKwl0aGUgbWFrZV8qX3R5cGUgZnVuY3Rpb25zIHdpdGggYSBudWxsIHN0b3JhZ2UgYWxsb2MgcGFyYW1ldGVyLgorCSogZ2RidHlwZXMuaCAobWFrZV97cmVmZXJlbmNlLHBvaW50ZXIsZnVuY3Rpb259X3R5cGUpOiAgRGVjbGFyZS4KKwkqIHhjb2ZmcmVhZC5jIChzbWFzaF90b19wb2ludGVyX3R5cGUpOiAgUmVtb3ZlLCBubyBsb25nZXIgdXNlZC4KKworCSogYnVpbGRzeW0uYyAoZGJ4X2xvb2t1cF90eXBlKTogIFplcm8gcmVzdWx0IGZvciAoLTEsLTEpIGFyZy4KKwkoZGJ4X2FsbG9jX3R5cGUpOiAgTWFrZSBpdCBlYXNpZXIgdG8gdW5kZXJzdGFuZC4gIE5vIGZ1bmN0IGNoYW5nZS4KKwkoZGVmaW5lX3N5bWJvbDogJ3QnKTogIERvbid0IHB1dCB0aGUgdHlwZWRlZiBuYW1lIGludG8gdGhlIG5hbWUgb2YKKwl0aGUgc3RydWN0LCB1bmlvbiwgb3IgZW51bS4gIEJ1Z2ZpeC4KKwkocmVhZF90eXBlOiAnKicsICcmJywgJ2YnKTogIEFkZCBjb21tZW50cy4gIFVzZSBtYWtlX1hYWF90eXBlCisJcm91dGluZXMgdG8gcHJvcGVybHkgaGFuZGxlIG92ZXJ3cml0aW5nIHByZWFsbG9jYXRlZCB0eXBlcyBzbyB0aGF0CisJZm9yd2FyZCByZWZlcmVuY2VzIHdpbGwgd29yay4KKwkocmVhZF9lbnVtX3R5cGUpOiAgRm9yY2UgZW51bSB2YWx1ZXMgdG8gZmlsZSBzY29wZSwgZHVlIHRvIGJ1ZyBpbgorCVN1biBjb21waWxlciBvdXRwdXQuICBGSVhNRSwgZml4IGxhdGVyLgorCisJUmVtb3ZlIHVudXNlZCBoZWFkZXJfZmlsZV9wcmV2X2luZGV4IG1lY2hhbmlzbS4gIEl0IHdhcyBhbHJlYWR5CisJb2Jzb2xldGUgaW4gZ2RiLTMuNS4gIFRoZXNlIGNvbW1lbnRzIGFwcGVhcmVkIGluIDMuNToKKwkgIC8qIFRoaXMgY29kZSB3YXMgdXNlZCBiZWZvcmUgSSBrbmV3IGFib3V0IHRoZSBpbnN0YW5jZSBjb2Rlcy4KKwkgICAgIE15IGZpcnN0IGh5cG90aGVzaXMgaXMgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJ5IG5vdworCSAgICAgdGhhdCBpbnN0YW5jZSBjb2RlcyBhcmUgaGFuZGxlZC4gICovCisJKiBkYnhyZWFkLmMgKGFkZF9uZXdfaGVhZGVyX2ZpbGUpOiAgUmVtb3ZlIGhlYWRlcl9maWxlX3ByZXZfaW5kZXguCisJKiBidWlsZHN5bS5oOiAgUmVtb3ZlIGl0IGFuZCBwcmV2X2luZGV4IHRoYXQgc2F2ZXMgaXQuCisJKiBidWlsZHN5bS5jIChwdXNoX3N1YmZpbGUsIHBvcF9zdWJmaWxlLCBzdGFydF9zeW10YWIpOiAgUmVtb3ZlIGl0LgorCisJKiBzb2xpYi5jIChzcGVjaWFsX3N5bWJvbF9oYW5kbGluZyk6ICBXaGVuIGNhbGxlZCBmcm9tIGNvcmUgZmlsZXMsCisJbXVzdCBzZXQgdXAgZGVidWdfYWRkci4gIERvbid0IHByaW50IGVycm9yIG1lc3NhZ2VzLCBqdXN0IHJldHVybi4KKwkqIHN5bW1pc2MuYyAocHJpbnRfc3ltYm9sKTogIExlc3MgYXNjaWkgZGlhcnJoZWEgZm9yIGVudW1zLCBwbGVhc2UuCisKK1dlZCBBcHIgMjkgMTU6MjY6NTEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQorCisJKiBjcGx1cy1kZW0uYzogIEFsbG93IG5lc3RlZCBjbGFzcyBuYW1lcyAoYXMgaW4KKwlGb286OkJhcjo6bWV0aG9kKCkpLgorCUFsbG93IHRoZSBjbGVhbmVyIGNmcm9udCBzdHlsZSBvZiBuZXN0ZWQgY2xhc3MgbmFtZXMKKwkoUTJfM0ZvbzNCYXIgYXMgd2VsbCBhcyBRMjNGb28zQmFyKS4KKwlNYWtlIGNwbHVzX2RlbWFuZ2xlIHJlLWVudHJhbnQgYnkgcmVtb3ZpbmcgdXNlIG9mIGdsb2JhbAorCXZhcmlhYmxlcy4gIEluc3RlYWQsIHBsYWNlIGFsbCBzaGFyZWQgdmFyaWFibGVzIGluIGEKKwlzdGFjay1hbGxvY2F0ZWQgc3RydWN0dXJlLCBhbmQgcGFzcyBhcm91bmQgaXRzIGFkZHJlc3MuCQorCitGcmkgQXByIDI0IDA3OjQxOjE5IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChtYWtlLXByb3RvLWdkYi0xKTogIDFzdCBjdXQgYXQgcGFja2FnaW5nCisJMjlrLXNoYXJlLyogc3ViZGlycy4uLgorCisJKiByZW1vdGUtdWRpLmMgKHVkaV9pbnNlcnQvcmVtb3ZlX2JyZWFrcG9pbnQpOiAgQ29tcGxldGVseQorCXJld3JpdGUsIG9ubHkgbGVhdmUgb3V0IHRoZSBidWdzLgorCisJKiBNYWtlZmlsZS5pbjogIEFkZCAyOWsvVURJIHN1cHBvcnQuICBJbXByb3ZlIGRlcGVuZC4KKwkqIGFsbGRlcHMubWFrLCBjb25maWd1cmUuaW4sIGRlcGVuZDogIEFkZCAyOWsvVURJIHN1cHBvcnQuCisKKwkqIGFtMjlrLXRkZXAuYzogIFVwZGF0ZSB0byB1c2UgbmV3IGNhbGxpbmcgY29udmVudGlvbnMsIGFuZCBtaXNjCisJc3ltYm9sIGVsZW1lbnRzLgorCisJKiBtNjhrLXBpbnNuLmMgKHByaW50X2luc25fYXJnKTogIE1ha2UgYnJhbmNoIG9mZnNldHMgYmUgc2lnbmVkLgorCitUaHUgQXByIDIzIDE4OjQzOjE3IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiB0bS0yOWsuaDogIFNldCBERUNSX1BDX0FGVEVSX0JSRUFLIHRvIDAsIGFzIDI5a3MgaGF2ZSBuaWNlCisJYnJlYWtwb2ludCBpbnN0cnVjdGlvbnMgdGhhdCBsZWF2ZSBQQyBwb2ludGluZyBhdCB0aGUgcmlnaHQgcGxhY2UuCisKKwkqIGNvcmUuYyAoY29yZV9vcGVuKTogIENhbGwgd2FybmluZygpIHRvIHByaW50IHdhcm5pbmdzLgorCitXZWQgQXByIDIyIDA5OjU1OjQyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIHN5bXRhYi5jIChsb29rdXBfc3ltYm9sKTogIE5lZWQgdG8gY2hlY2sgaWYgbXN5bWJvbC0+bmFtZSBpcworCU5VTEwsIGFzIEFMTF9NU1lNQk9MUyB3aWxsIG5ldmVyIHJldHVybiBhIE5VTEwgbXN5bWJvbCBwb2ludGVyLgorCVRoaXMgcHJldmVudHMgYSBjcmFzaCB3aGVuIHRyeWluZyB0byBsb29rdXAgdGhlIHZhbHVlIG9mIGEKKwlub24tZXhpc3RlbnQgc3ltYm9sLgorCitXZWQgQXByIDIyIDA5OjQyOjE1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBzaWduYW1lLmMsIHNpZ25hbWUuaDogIFJlbW92ZSwgcmVwbGFjZWQgYnkgc3Ryc2lnbmFsLmMgaW4KKwlsaWJpYmVydHkuCisJKiBpOTYwLXRkZXAuYywgaW5mcnVuLmMsIG1hY2gzODYteGRlcC5jLCBwcm9jZnMuYywgc3BhcmMtdGRlcC5jLAorCXN1bjM4Ni14ZGVwLmM6ICBSZW1vdmUgaW5jbHVkZSBvZiBzaWduYW1lLmgJCisJKiBNYWtlZmlsZS5pbiAoU0ZJTEVTX01BSU5ESVIpOiAgUmVtb3ZlIHNpZ25hbWUuYworCSogTWFrZWZpbGUuaW4gKEhGSUxFUyk6ICBSZW1vdmUgc2lnbmFtZS5oCisJKiBNYWtlZmlsZS5pbiAoT0JTKTogIFJlbW92ZSBzaWduYW1lLm8KKwkqIGRlZnMuaCAoc2FmZV9zdHJlcnJvciwgc2FmZV9zdHJzaWduYWwsIHN0cmVycm5vLCBzdHJzaWdubywKKwllcnJub19tYXgsIHNpZ25vX21heCwgc3RydG9lcnJubywgc3RydG9zaWdubywgc3Ryc2lnbmFsLAorCXBzaWduYWwsIHBlcnJvcik6ICBBZGQgcHJvdG90eXBlcy4KKwkqIGRlZnMuaCwgeG0tYXBvbGxvNjh2LmgsIHhtLXVsdHJhMy5oIChTWVNfU0lHTElTVF9NSVNTSU5HKToKKwlSZW1vdmUgZGVmaW5lLgorCSogZGVwZW5kOiAgTWFudWFsbHkgcmVtb3ZlIHNpZ25hbWUuW2Nob10gcmVmZXJlbmNlcy4KKwkqIGNvbnZleC10ZGVwLmMgKHN1YnNpZ19uYW1lKTogIFJlcGxhY2UgdXNlIG9mIHN5c19zaWdsaXN0IHdpdGgKKwlzdHJzaWduYWwuCisJKiBjb252ZXgteGRlcC5jIChjb3JlX2ZpbGVfY29tbWFuZCk6ICBSZXBsYWNlIHVzZSBvZiBzeXNfc2lnbGlzdAorCXdpdGggc2FmZV9zdHJzaWduYWwuCisJKiBjb3JlLmMgKGNvcmVfb3Blbik6ICBSZXBsYWNlIHVzZSBvZiBzeXNfc2lnbGlzdCB3aXRoCisJc2FmZV9zdHJzaWduYWwuCisJKiBjb3JlLmMgKG1lbW9yeV9lcnJvcik6ICBSZXBsYWNlIHVzZSBvZiBzeXNfZXJybGlzdCB3aXRoCisJc2FmZV9zdHJlcnJvci4KKwkqIGk5NjAtdGRlcC5jIChwcmludF9mYXVsdCk6ICBSZXBsYWNlIHVzZSBvZiBzeXNfc2lnbGlzdCB3aXRoCisJc2FmZV9zdHJzaWduYWwuCisJKiBpbmZjbWQuYyAocHJvZ3JhbV9pbmZvKTogIFJlcGxhY2UgdXNlIG9mIHN5c19zaWdsaXN0IHdpdGgKKwlzYWZlX3N0cnNpZ25hbC4KKwkqIGluZnJ1bi5jIChzaWduYWxfc3RvcCwgc2lnbmFsX3ByaW50LCBzaWduYWxfcHJvZ3JhbSk6CisJQWxsb2NhdGUgZHluYW1pY2FsbHkgYmFzZWQgb24gZHluYW1pYyBkZXRlcm1pbmF0aW9uIG9mIG51bWJlcgorCW9mIHNpZ25hbHMgdG8gc3VwcG9ydC4KKwkqIGluZnJ1bi5jIChjaGlsZF9jcmVhdGVfaW5mZXJpb3IpOiAgUmVwbGFjZSB1c2Ugb2Ygc3lzX2Vycmxpc3QKKwl3aXRoIHNhZmVfc3RyZXJyb3IuCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiAgUmVwbGFjZSB1c2Ugb2Ygc3lzX3NpZ2xpc3Qgd2l0aAorCXNhZmVfc3Ryc2lnbmFsLgorCSogaW5mcnVuLmMgKHNpZ19wcmludF9pbmZvKTogIFJlcGxhY2UgdXNlIG9mIHNpZ19hYmJyZXYgd2l0aAorCXN0cnNpZ25vIGFuZCBzeXNfc2lnbGlzdCB3aXRoIHNhZmVfc3Ryc2lnbmFsLgorCSogaW5mcnVuLmMgKGhhbmRsZV9jb21tYW5kKTogIENhbGwgc2lnbm9fbWF4IHRvIGZpbmQgbnVtYmVyIG9mCisJc2lnbmFscy4gIFJlcGxhY2Ugc2lnX251bWJlciB3aXRoIHN0cnRvc2lnbm8gYW5kIHNpZ19hYmJyZXYgd2l0aAorCXN0cnNpZ25vLgorCSogaW5mcnVuLmMgKHNpZ25hbHNfaW5mbyk6ICBSZXBsYWNlIHNpZ19udW1iZXIgd2l0aCBzdHJ0b3NpZ25vLgkKKwkqIGluZnJ1bi5jIChfaW5pdGlhbGl6ZV9pbmZydW4pOiAgQ2FsbCBzaWdub19tYXggdG8gZmluZCBudW1iZXIgb2YKKwlzaWduYWxzLiAgRHluYW1pY2FsbHkgYWxsb2NhdGUgc2lnbmFsX3tzdG9wLHByaW50LHByb2dyYW19LgorCSogcHJvY2ZzLmMgKGVycm5vX3RhYmxlKTogIFJlbW92ZSwgbm93IGluIGxpYmliZXJ0eS9zdHJlcnJvci5jLgorCSogcHJvY2ZzLmMgKGVycm5vbmFtZSk6ICBBZGQgZnVuY3Rpb24gYW5kIHByb3RvdHlwZS4KKwkqIHByb2Nmcy5jIChpbmZvX3Byb2Nfc2lnaW5mbyk6ICBDYWxsIGVycm5vbmFtZSwgcmVwbGFjZSB1c2UKKwlvZiBzeXNfc2lnbGlzdCB3aXRoIHNhZmVfc3Ryc2lnbmFsLgorCSogcHJvY2ZzLmMgKGluZm9fcHJvY19zdG9wLCBpbmZvX3Byb2Nfc2lnbmFscyk6ICBSZXBsYWNlIHVzZSBvZgorCXN5c19zaWdsaXN0IHdpdGggc2FmZV9zdHJzaWduYWwuCisJKiBwcm9jZnMuYyAoaW5mb19wcm9jX3N0b3ApOiAgQ2FsbCBlcnJub25hbWUuCisJKiBwcm9jZnMuYyAoc2lnbmFsbmFtZSk6ICBSZXBsYWNlIHNpZ19hYmJyZXYgd2l0aCBzdHJzaWduby4KKwkqIHN0dWZmLmMgKG1haW4sIGdldF9vZmZzZXQpOiAgUmVwbGFjZSB1c2Ugb2Ygc3lzX2Vycmxpc3Qgd2l0aAorCXN0cmVycm9yLgorCSogc3VuMzg2LXhkZXAuYyAoY29yZV9maWxlX2NvbW1hbmQpOiAgUmVwbGFjZSB1c2Ugb2Ygc3lzX3NpZ2xpc3QKKwl3aXRoIHNhZmVfc3Ryc2lnbmFsLgorCSogdW1heC14ZGVwLmMgKGNvcmVfZmlsZV9jb21tYW5kKTogIFJlcGxhY2UgdXNlIG9mIHN5c19zaWdsaXN0CisJd2l0aCBzYWZlX3N0cnNpZ25hbC4KKwkqIHV0aWxzLmMgKHNhZmVfc3RyZXJyb3IsIHNhZmVfc3Ryc2lnbmFsKTogIEFkZCBmdW5jdGlvbnMgdGhhdAorCWNhbGwgc3RyZXJyb3IgYW5kIHN0cnNpZ25hbCByZXNwZWN0aXZlbHksIGFuZCBkZWFsIHdpdGggTlVMTAorCXJldHVybnMuCisJKiB1dGlscy5jIChwZXJyb3Jfd2l0aF9uYW1lLCBwcmludF9zeXNfZXJybXNnKTogIFJlcGxhY2UgdXNlIG9mCisJc3lzX2Vycmxpc3Qgd2l0aCBzYWZlX3N0cmVycm9yLgorCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogIFJlcGxhY2UgdXNlIG9mIHN5c19lcnJsaXN0IHdpdGgKKwlzYWZlX3N0cmVycm9yLgorCitUdWUgQXByIDIxIDEyOjAwOjQ3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogcmV3b3JrIENGTEFHUyBzbyB0aGF0IHRoZXkgY2FuIGJlIHNldCBmcm9tIHRoZQorCSAgY29tbWFuZCBsaW5lIHRvIG1ha2UuICBDRkxBR1MgLT4gSU5URVJOQUxfQ0ZMQUdTLgorCSAgVVNFUl9DRkxBR1MgLT4gQ0ZMQUdTLiAgUmVtb3ZlIE1JTlVTX0cuICBEZWZhdWx0IENGTEFHUyB0byAtZy4KKwkgIFBhc3MgQ0ZMQUdTIG9uIHJlY3VzaW9ucy4KKworRnJpIEFwciAxNyAxOToyNTo1NyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZ2RidHlwZXMuaCwgYy1leHAueSwgbTItZXhwLnksIG1pcHNyZWFkLmMsIGdkYnR5cGVzLmM6ICBCYWNrCisJb3V0IG9mIGNoYW5nZSBvbiA0LzE0LzkyIGFuZCByZW1vdmUgVFlQRV9GTEFHX0ZVTkRfVFlQRS4gIEl0IHdhcworCW92ZXJraWxsIGZvciB0aGUgcHJvYmxlbSBpdCBzb2x2ZWQuCisJKiB2YWxwcmludC5jICh0eXBlX3ByaW50X2Jhc2UpOiAgUmVtb3ZlIFRZUEVfRkxBR19GVU5EX1RZUEUgdGVzdAorCWFuZCBkZWZhdWx0IHRvIHNpbXBseSBwcmludGluZyB0eXBlIG5hbWVzIGFzIGFwcHJvcHJpYXRlLgorCSogbWFpbi5jIChtYWluKTogIFJlbW92ZSBvbmUgb2YgdGhlIGxlYWRpbmcgbmV3bGluZXMgZnJvbQorCXdhcm5pbmdfcHJlX3ByaW50IGluaXRpYWxpemF0aW9uLgorCSogb2JqZmlsZXMuYyAob3Blbl9leGlzdGluZ19tYXBwZWRfZmlsZSk6ICBBZGQgZnVuY3Rpb24gYW5kCisJcHJvdG90eXBlLgorCSogb2JqZmlsZXMuYyAob3Blbl9tYXBwZWRfZmlsZSk6ICBSZXdyaXRlIHRvIHVzZSBuZXcgZnVuY3Rpb24KKwlvcGVuX2V4aXN0aW5nX21hcHBlZF9maWxlLgorCitUaHUgQXByIDE2IDIzOjUwOjEyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBzdW4zLXhkZXAuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiAgTGludC4KKwkqIHRtLXN1bjMuaDogIFByb3RvdHlwZSBsaW50LgorCSogdmFsdWUuaDogIFR5cG8uCisKK1RodSBBcHIgMTYgMTk6NTY6NTAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGR3YXJmcmVhZC5jIChUQVJHRVRfRlRfUE9JTlRFUl9TSVpFLCBUQVJHRVRfRlRfTE9OR19TSVpFKToKKwlEZWZpbmUgdXNpbmcgVEFSR0VUX1BUUl9CSVQgYW5kIFRBUkdFVF9MT05HX0JJVCBmb3Igbm93LgorCSogb2JqZmlsZXMuYzogIENhc3QgY2FsbHMgdG8gY2xvc2UoKSB3aXRoIHVudXNlZCByZXR1cm5zIHRvIHZvaWQuCisJKiBvYmpmaWxlcy5jIChhbGxvY2F0ZV9vYmpmaWxlKTogIEluaXRpYWxpemUgb2JqZmlsZSdzIG1tZmQsIGZyZWUKKwlvbGQgb2JqZmlsZSdzIG5hbWUgYmVmb3JlIHVwZGF0aW5nIGl0LgorCSogb2JqZmlsZXMuYyAoZnJlZV9vYmpmaWxlKTogIE1ham9yIHJld3JpdGUgZm9yIG1hcHBlZCBvYmpmaWxlcy4KKwkqIG9iamZpbGVzLmggKG9iamZpbGUgc3RydWN0KTogIEFkZCBtbWZkIG1lbWJlci4KKwkqIHN5bWZpbGUuYyAoc3ltc19mcm9tX29iamZpbGUpOiAgTW92ZSBzb21lIGNvZGUgdG8KKwluZXdfc3ltZmlsZV9vYmpmaWxlLgorCSogc3ltZmlsZS5jIChuZXdfc3ltZmlsZV9vYmpmaWxlKTogIEFkZCBuZXcgZnVuY3Rpb24sIGNvbW1vbiBjb2RlCisJZnJvbSBzeW1zX2Zyb21fb2JqZmlsZS4KKwkqIHN5bWZpbGUuYyAoc3ltYm9sX2ZpbGVfYWRkKTogIENhbGwgbmV3X3N5bWZpbGVfb2JqZmlsZSBmb3IgYm90aAorCW1hcHBlZCBhbmQgdW5tYXBwZWQgc3ltYm9sIGZpbGVzLgorCSogc3ltZmlsZS5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogIFByaW50ICJObyBzeW1ib2wgZmlsZSBub3ciCisJbWVzc2FnZSwgYWxhIGV4ZWNfZmlsZV9jb21tYW5kIGZvciB0aGUgZXhlYyBmaWxlLgorCSogc3ltZmlsZS5oIChuZXdfc3ltZmlsZV9vYmpmaWxlKTogIEFkZCBwcm90b3R5cGUuCQorCSogeGNvZmZleGVjLmMgKG1hcF92bWFwKTogIEFkZCBjYWxsIHRvIG5ld19zeW1maWxlX29iamZpbGUuCisJKiB4Y29mZnNvbGliLmMgKHNvbGliX2FkZCk6ICBBZGQgY2FsbCB0byBuZXdfc3ltZmlsZV9vYmpmaWxlLgorCitUaHUgQXByIDE2IDE4OjI2OjM0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiByczYwMDAtcGluc24uYzogIE5ldyB2ZXJzaW9uIGZyb20gSUJNIChNZXRpbikuCisJKiBtMi1leHAueTogIFJlLXdyaXRlIHN0cmluZyBpbml0aWFsaXplcnMgKCI8PiIgPT4geyc8JywgJz4nfSkKKwl0byBhdm9pZCB3YXJuaW5ncyBmcm9tIHNvbWUgY29tcGlsZXJzLgorCitUdWUgQXByIDE0IDIyOjMzOjU1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBnZGJ0eXBlcy5oIChGVF9GSVhFRF9ERUNJTUFMLCBGVF9GTE9BVF9ERUNJTUFMKTogIEFkZCBkZWZpbmVzLgorCSogZ2RidHlwZXMuaCAoVFlQRV9GTEFHX0ZVTkRfVFlQRSk6ICBBZGQgZGVmaW5lIGZvciBiaXQgaW4gYQorCXR5cGUncyBmbGFnIHdvcmQgdGhhdCBtYXJrcyBpdCBhcyBhIGZ1bmRhbWVudGFsIHR5cGUuCisJKiBjLWV4cC55IChfaW5pdGlhbGl6ZV9jX2V4cCk6IEFkZCBUWVBFX0ZMQUdfRlVORF9UWVBFIGJpdCB0bworCWZsYWdzIGFyZ3VtZW50IGZvciBhbGwgY2FsbHMgdG8gaW5pdF90eXBlKCkuCisJKiBtMi1leHAueSAoX2luaXRpYWxpemVfbTJfZXhwKTogQWRkIFRZUEVfRkxBR19GVU5EX1RZUEUgYml0IHRvCisJZmxhZ3MgYXJndW1lbnQgZm9yIGFsbCBjYWxscyB0byBpbml0X3R5cGUoKS4gIEFsc28gcmVtb3ZlCisJZGVwZW5kZW5jeSBvbiBob3N0IHNpemVzIGZvciBpbnRzLCBmbG9hdHMsIGV0Yy4KKwkqIG1pcHNyZWFkLmMgKF9pbml0aWFsaXplX21pcHNyZWFkKTogQWRkIFRZUEVfRkxBR19GVU5EX1RZUEUgYml0IHRvCisJZmxhZ3MgYXJndW1lbnQgZm9yIGFsbCBjYWxscyB0byBpbml0X3R5cGUoKS4gIEFsc28gcmVtb3ZlCisJZGVwZW5kZW5jeSBvbiBob3N0IHNpemVzIGZvciBpbnRzLCBmbG9hdHMsIGV0Yy4KKwkqIGdkYnR5cGVzLmMgKGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlKTogIEFkZCBUWVBFX0ZMQUdfRlVORF9UWVBFCisJYml0IHRvIGZsYWdzIGFyZ3VtZW50IGZvciBhbGwgY2FsbHMgdG8gaW5pdF90eXBlKCkuICBBZGQgdHlwZXMKKwlGVF9GSVhFRF9ERUNJTUFMIGFuZCBGVF9GTE9BVF9ERUNJTUFMLgorCSogdmFscHJpbnQuYyAodW5zaWduZWRfdHlwZV90YWJsZSwgc2lnbmVkX3R5cGVfdGFibGUsCisJZmxvYXRfdHlwZV90YWJsZSk6ICBSZW1vdmUuCisJKiB2YWxwcmludC5jICh0eXBlX3ByaW50X2Jhc2UpOiAgVGVzdCBuZXcgVFlQRV9GTEFHX0ZVTkRfVFlQRQorCWJpdCB3aGVuIHByaW50aW5nIGZ1bmRhbWVudGFsIHR5cGVzLCBhbmQgcHJpbnQgdGhlIGFjdHVhbCBuYW1lCisJZm9yIHN1Y2ggdHlwZXMsIHJhdGhlciB0aGFuIGludmVudGluZyBvbmUuICBSZW1vdmUgY29kZSB0aGF0CisJaW52ZW50ZWQgZnVuZGFtZW50YWwgdHlwZSBuYW1lcy4KKwkqIHZhbHByaW50LmMgKF9pbml0aWFsaXplX3ZhbHByaW50KTogIFJlbW92ZSBpbml0aWFsaXphdGlvbnMKKwlmb3Igbm93IHJlbW92ZWQgdW5zaWduZWRfdHlwZV90YWJsZSwgc2lnbmVkX3R5cGVfdGFibGUsIGFuZAorCWZsb2F0X3R5cGVfdGFibGUuCisKK1R1ZSBBcHIgMTQgMTQ6MzA6NDYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXZ4LmMsIHZ4LXNoYXJlL3hkcl9wdHJhY2UuYywgdngtc2hhcmUveGRyX3B0cmFjZS5oLAorCXZ4LXNoYXJlL3hkcl9yZGIuaDogIFVwZGF0ZSBmb3IgbmV3IHJlbW90ZSBwcm90b2NvbCB1bmRlciBWeFdvcmtzCisJNS4wLjIuCisKK01vbiBBcHIgMTMgMjA6NTk6MjEgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGR3YXJmcmVhZC5jICh0YXJnZXRfdG9faG9zdCk6ICBOZXcgZnVuY3Rpb24gc2ltaWxhciB0byBwcmV2aW91cworCXN3YXBpbiBmdW5jdGlvbi4KKwkqIGR3YXJmcmVhZC5jIChTV0FQSU4sIHN3YXBpbik6ICBSZW1vdmUgbWFjcm8gYW5kIHN1cHBvcnQgZnVuY3Rpb24uCisJRXh0ZW5zaXZlIGNoYW5nZXMgdG8gY29udmVydCBhbGwgcHJldmlvdXMgdXNhZ2VzIHRvIHVzZSBuZXcKKwl0YXJnZXRfdG9faG9zdCgpIGZ1bmN0aW9uLgorCSogZHdhcmZyZWFkLmMgKHN0cnVjdCBkaWVpbmZvKTogIENoYW5nZSB0eXBlcyBvZiBtb3N0IGludGVncmFsCisJbWVtYmVycyB0byBiZSB1bnNpZ25lZC4KKworTW9uIEFwciAxMyAxNTo1OToxMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogV0hBVFMuTkVXOiAgUmV2aXNlIC1tYXBwZWQgZG9jLgorCitTYXQgQXByIDExIDIzOjE0OjM2IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBtaXBzcmVhZC5jIChwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiAgQ29tcGxhaW4gd2hlbiBzaC0+aW5kZXggaXMKKwl0b28gaGlnaCBvciB3aGVuIHNraXBwaW5nIGBmb3J3YXJkcycgbW92ZXMgdXMgYmFja3dhcmRzLgorCShwYXJzZV90eXBlKTogIFByaW50IG1pcy1ndWVzc2VkIHRhZyBuYW1lIGluIGNvbXBsYWludC4KKwkocGFyc2VfZXh0ZXJuYWwpOiAgRWxpbWluYXRlIGN1cl9zdGFiIGFuZCBvYnNjdXJlIHRvcF9zdGFjayBjbG9iYmVycy4KKwkocGFyc2VfcHJvY2VkdXJlKTogIERvIG5vdCBhdHRlbXB0IHRvIGNyZWF0ZSBzeW1ib2xzOyBqdXN0IGZpbGwgaW4KKwl0aGUgU1lNQk9MX1ZBTFVFIGZpZWxkIG9mIGEgLmdkYmluZm8uIHN5bWJvbCBpZiB3ZSBjYW4gZmluZCBvbmUuCisJKHBzeW10YWJfdG9fc3ltdGFiXzEpOiAgU3BsaXQgdXAgYHN0YWJzJyBmcm9tIGBuYXRpdmUgZWNvZmYnIGNvZGUKKwlmb3IgY2xhcml0eS4gIFNldCB0b3Bfc3RhY2sgYmVmb3JlIGNhbGxpbmcgcGFyc2VfZXh0ZXJuYWwuICBJbgorCXN0YWJzLCBzb3J0IHN5bWJvbHMgYmVmb3JlIGNhbGxpbmcgcGFyc2VfcHJvY2VkdXJlLgorCSogbWlwc3JlYWQuYzogIExpbnQuCisJKiBzeW1taXNjLmMgKHN0ZF9pbiwgc3RkX291dCwgc3RkX2Vycik6ICBBZGQgdmFycyB0byBhY2Nlc3Mgc3RkCisJRklMRSAqJ3Mgd2hlbiBkZWJ1Z2dpbmcgR0RCIChlLmcuIGFzIGFyZ3MgdG8gZHVtcF9zeW10YWIpLgorCSogTWFrZWZpbGUuaW46ICBSZW1vdmUgc3RhZ2UqIHRhcmdldHMuICBBdm9pZCBlY2hvIG9uIHJlY3Vyc2l2ZQorCW1ha2VzLiAgRWxpbWluYXRlIGRvYy9NYWtlZmlsZSBmcm9tIHRhci5aIGZpbGUgaWYgZG9jL01ha2VmaWxlLmluCisJZXhpc3RzLgorCitGcmkgQXByIDEwIDIzOjQ3OjM3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICBTZXQgdG8gNC41LjEuCisJKiB4Y29mZnJlYWQuYyAoTk9fVFlQRURFRlMpOiAgRml4IHR5cG8gaW4gY29tbWVudGVkLW91dCAjZGVmaW5lLgorCSogc3BhcmMtdGRlcC5jIChzdXBwbHlfZ3JlZ3NldCwgZmlsbF9ncmVnc2V0LCBzdXBwbHlfZnByZWdzZXQsCisJZmlsbF9ncmVnc2V0KTogIE5ldyBmdW5jdGlvbnMgZm9yIFNWUjQgL3Byb2Mgc3VwcG9ydC4KKwkqIG1pcHNyZWFkLmM6ICBDbGVhbnVwLiAgQWRkIG1vcmUgY29tcGxhaW50cyBmb3IgdW5oYW5kbGVkIGNhc2VzLgorCVJlbW92ZSBuZXcgc3ltYm9sIHR5cGVzIGFuZCBzdWNoIHRvIC4uL2luY2x1ZGUvY29mZi9zeW1jb25zdC5oLgorCShwYXJzZV9zeW1ib2wpOiAgU2ltcGxpZnkgY29kZSBmb3IgcGFyc2luZyBzdHJ1Y3QvZW51bS91bmlvbnMuCisJKHBhcnNlX3R5cGUpOiAgSGFuZGxlIGBsb25nIGxvbmcnIHR5cGVzLgorCSh1cGdyYWRlX3R5cGUpOiAgSGFuZGxlIGBjb25zdCcgcXVhbGlmaWVyLgorCShwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiAgZml4IGluZGVudGF0aW9uLCBjbGVhbiBhIGJpdC4JCisKK0ZyaSBBcHIgMTAgMjI6NDE6MDMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGR3YXJmcmVhZC5jIChTV0FQSU4sc3dhcGluKTogIE5ldyBtYWNybyBhbmQgZnVuY3Rpb24gdG8gY2FsbCB0bworCWNvcHkgaW4gZGF0YSBmcm9tIHJhdyByZWFkIGJ1ZmZlcnMsIGNhbGxpbmcgYmZkIGJ5dGVzd2FwcGluZworCXJvdXRpbmVzIGFzIGFwcHJvcHJpYXRlLiAgVXNlIHRvIHJlcGxhY2UgbW9zdCBleGlzdGluZyBtZW1jcHkKKwljYWxscy4KKwkqIGR3YXJmcmVhZC5jIChiYXNpY2RpZWluZm8sIGNvbXBsZXRlZGllaW5mbyk6ICBBZGQgb2JqZmlsZSBhcmcuCisJKiBjb25maWd1cmUuaW46ICBSZWNvZ25pemUgbmV3IG5jcjMwMDAgY29uZmlnLgorCSogY29uZmlnL25jcjMwMDAubWg6ICBOZXcgY29uZmlnIGZpbGUuCisKK0ZyaSBBcHIgMTAgMDg6MzA6NTggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCUdEQi00LjUgcmVsZWFzZSEKKworCSogUkVBRE1FOiAgVXBkYXRlIGZvciByZWxlYXNlLgorCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgdmVyc2lvbiB0byA0LjUuCisJKiBXSEFUUy5ORVc6ICBUaGUgb2J2aW91cy4KKworCSogZGVwZW5kOiAgR2VuZXJhdGUgbmV3IGRlcGVuZCBmaWxlIGZvciB0aGlzIHJlbGVhc2UuCisKKwkqIE1ha2VmaWxlLmluIChkZXBlbmQpOiAgRml4IGRlcGVuZGFuY3kgZ2VuZXJhdGlvbiBzbyB0aGF0IGl0IGRvZXMKKwlub3QgaW5jbHVkZSBnY2MgJ2ZpeGluY2x1ZGVkJyBmaWxlcywgd2hpY2ggYXJlIHVzdWFsbHkgaW4gYSBzeXN0ZW0KKwlzcGVjaWZpYyBsb2NhdGlvbi4KKworVGh1IEFwciAgOSAxMzozNTowMCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwlDaGFuZ2VzIGZyb20gbWV0aW5AaWJtcGEuYXdkcGEuaWJtLmNvbSAoTWV0aW4gRy4gT3ppc2lrKS4KKwkqIGJ1aWxkc3ltLmMgICgjaWZkZWYgUlM2MDAwX1RBUkdFVCk6ICBEb24ndCBjcmVhdGUgdW5uZWNlc3NhcnkKKwlzeW1ib2xzIGZvciBuYW1lbGVzcyB0eXBlcy4gIEFuZCwgaGFuZGxlIGBSJyAocmVnaXN0ZXIgcGFyYW1ldGVyCisJdHlwZSkgZm9yIEFJWC4gIChhbiBleHRlbnNpb24gdG8gZXhpc3Rpbmcgc3RhYnN0cmluZyBncmFtbWFyKS4KKwkqIHJzNjAwMC14ZGVwLmM6ICBGaXggdHlwbyAoPSBzaG91bGQgaGF2ZSBiZWVuID09KS4KKworVGh1IEFwciAgOSAxMjoxMDowNiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIHZlcnNpb249NC40Ljg4LCBhZGQgeG0tdmF4LmggdG8gSEZJTEVTLgorCitUaHUgQXByICA5IDAyOjI5OjAzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiB4bS1zdW40b3M1LmggKERPX0RFRkVSUkVEX1NUT1JFUywgQ0xFQVJfREVGRVJSRURfU1RPUkVTKTogIFphcC4KKwkqIHNpZ25hbWUuYyAoU0lHV0FJVElORywgU0lHTFdQKTogIEFkZC4KKworVHVlIEFwciAgNyAxNjozNDowNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogeG0taTM4Nm1hY2guaDogIGFkZCBkZWNscyBmb3IgZXJybm8gYW5kIHN0cmR1cCgpLgorCisJKiBicmVha3BvaW50LmMgKGJyZWFrcG9pbnRfMSk6ICBBZGQgKGludCkgY2FzdHMgZm9yIGVudW1zCisJdXNlZCBpbiBhcnJheSBpbmRleCBjb250ZXh0IChvdGhlcndpc2UsIHNvbWUgY29tcGlsZXJzIGJhcmYpLgkKKworVHVlIEFwciAgNyAwODo0NTo0NiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBtNjhrLXRkZXAuYywgdG0tc3VuMy5oOiAgI2lmZGVmIGFyb3VuZCBnZXRfbG9uZ2ptcF90YXJnZXQoKS4KKwlDaGFuZ2UgZGVmIG9mIFNBVkVEX1BDX0FGVEVSX0NBTEwgdG8gY2FsbCByb3V0aW5lIHRvIHNlZSBpZiB3ZSBhcmUKKwlpbiBhIHN5c3RlbSBjYWxsLCBhbmQgcHJvdmlkZSBiZXR0ZXIgYmFja3RyYWNlIGlmIHNvLgorCisJKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogIEFkZCB4Y29mZnNvbGliLmguCisJKiByczZrLW9wY29kZS5oOiAgTW92ZSB0byAuLi9pbmNsdWRlL29wY29kZS9yczZrLmguCisJKiByczYwMDAtcGluc24uYzogICNpbmNsdWRlICJvcGNvZGUvcnM2ay5oIgorCisJKiBtaXBzcmVhZC5jIChyZWFkX21pcHNfc3ltdGFiLCByZWFkX3RoZV9taXBzX3N5bXRhYiwKKwltaXBzY29mZl9zeW1maWxlX3JlYWQpOiAgQ29udmVydCB0byBCRkQgdG8gZG8gZmlsZSBJL08uCisKKwkqIHN5bWZpbGUuYzogICNpbmNsdWRlIDxjdHlwZS5oPiB0byBnZXQgcHJvcGVyIGRlZiBpZiBpc3NwYWNlKCkuCisKKwkqIGkzODYtdGRlcC5jIChnZXRfbG9uZ2ptcF90YXJnZXQpOiAgI2lmZGVmIEdFVF9MT05HSk1QX1RBUkdFVC4KKworTW9uIEFwciAgNiAxNzoyNTo0NSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogbWlwc3JlYWQuYzogQ3JlYXRlIGEgLmdkYmluZm8gcHNldWRvLXN5bWJvbCBmb3IgZWFjaAorCWZ1bmN0aW9uIGFsc28gd2hlbiBwYXJzaW5nIGVtYmVkZGVkIHN0YWJzLgorCitNb24gQXByICA2IDE1OjI1OjAzIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIG1pcHNyZWFkLmM6ICBGaXggbW9yZSBkZWNsYXJhdGlvbnMuCisKKwkqIG1pcHNyZWFkLmM6ICBGaXggbWFueSBpbnZvY2F0aW9ucyBvZiBjb21wbGFpbi4gIFVzZSBlbnVtCisJdHlwZV9jb2RlIHdoZXJlIGFwcHJvcHJpYXRlLgorCisJKiB4bS12YXh1bHQuaDogIEFkZCBkZWNsIGZvciBzdHJkdXAoKS4KKworCSogTWFrZWZpbGUuaW46IEFkZCBkZXBlbmRhbmNpZXMgZm9yIHhtLXZheGJzZC5oIGFuZCB4bS12YXh1bHQuaAorCWZvciB4bS12YXguaC4KKworRnJpIEFwciAgMyAxNzo0MToyOSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBidWlsZHN5bS5oLCBkYnhyZWFkLmMsIG1pcHNyZWFkLmM6ICBBZGQgb2JqZmlsZSBhcmcgdG8KKwlwcm9jZXNzX29uZV9zeW1ib2wuCisKK0ZyaSBBcHIgIDMgMTI6MTc6MTQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIG11bmNoOiBNdXN0IHByZS1wZW5kICJfIiB0byAiaW5pdGlhbGl6ZSIgZm9yIFNZU1Ygc3R5bGUgbm0uCisJKiB0bS1yczYwMDAuaCwgeGNvZmZleGVjLmMsIHhjb2ZmcmVhZC5jLCB4bS1yczYwMDAuaDoKKwlNZXJnZSBpbiBtb3JlIHBhdGNoZXMgZm9yIHJzNjAwMCBmcm9tIE1ldGluIE96aXNpay4KKwkqIHV0aWxzLmM6ICBGaXggdHlwbyBpbiBjb21tZW50LgorCitGcmkgQXByICAzIDExOjIzOjAzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBwcm9jZnMuYyAocHJvY2luZm8gc3RydWN0KTogIEFkZCBub3Bhc3NfbmV4dF9zaWdzdG9wIG1lbWJlci4KKwkqIHByb2Nmcy5jIChhdHRhY2gpOiAgU2V0IG5vcGFzc19uZXh0X3NpZ3N0b3AgaWYgYXR0YWNoZWQgCisJcHJvY2VzcyBpcyBmb3JjaWJseSBzdG9wcGVkLgorCSogcHJvY2ZzLmMgKGNoaWxkX3Jlc3VtZSk6ICBVc2Ugbm9wYXNzX25leHRfc2lnc3RvcCB0byBzdXBwcmVzcworCXJlc2VuZGluZyBTSUdTVE9QIHRvIGF0dGFjaGVkIHByb2Nlc3Mgb24gZmlyc3QgcmVzdW1lLgorCitGcmkgQXByICAzIDAxOjM3OjI2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChTRklMRVNfTUFJTkRJUik6ICBhZGQgbWlwc3JlYWQuYworCitUaHUgQXByICAyIDIwOjIwOjU0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoT0JTKTogIENvbXBpbGUgbWlwc3JlYWQuYyBmb3IgYWxsIHRhcmdldHMgbm93LgorCShWRVJTSU9OKTogIEJ1bXAgdG8gNC40Ljg1LgorCSogbWlwc3JlYWQuYzogIFVwZGF0ZSBmb3IgbmV3IGluY2x1ZGUgZmlsZXMuICBMaW50LgorCSogdG0taXJpeDMuaCwgdG0tbWlwcy5oOiAgVXNlIG5ldyBpbmNsdWRlIGZpbGVzIGZvciBFQ09GRiBzeW10YWIuCisJKiBjb25maWcve2JpZ21pcHMubXQsIGxpdHRsZW1pcHMubXQsIGlyaXgzLm10LCBkZWNzdGF0aW9uLm10fToKKwlEb24ndCBuZWVkIHRvIGJyaW5nIGluIG1pcHNyZWFkLm8gc3BlY2lhbGx5IGFueSBtb3JlLgorCitUaHUgQXByICAyIDE5OjM4OjMxIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIG1pcHNyZWFkLmMgKGZpeHVwX3NpZ3RyYW1wKTogIEFsc28gbG9vayBmb3IgX3NpZ3RyYW1wIGFzIGEgcmVhbAorCXJvdXRpbmUgKGZvciBJcml4LTQueCkuICBNYWtlIG1hbnkgZnVuY3Mgc3RhdGljIGFuZCB2b2lkLgorCSogbWlwcy10ZGVwLmMgKG1pcHMtZnJhbWUtY2hhaW4pOiAgQ2xlYW4gdXAsIHNpbXBsaWZ5LgorCSogKGluaXRfZXh0cmFfZnJhbWVfaW5mbyk6ICBEb24ndCB0cmFzaCBjYWNoZWQgdmFsdWUgb2YgZnJhbWUKKwlwb2ludGVyIHJlZ2lzdGVyLiAgVGhpcyBmaXhlcyBiYWNrdHJhY2luZyB0aHJvdWdoIHJvdXRpbmVzIHRoYXQgdXNlCisJYWxsb2NhKCkuICBHZW5lcmFsbHkgY2xlYW4gdXAgZGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9ucywgYW5kIHVzZQorCXR5cGVkZWZzIGFuZCBtYWNyb3MgdG8gcmVmZXJlbmNlIGRhdGEgc3RydWN0dXJlcyBhcyBhcHByb3ByaWF0ZS4KKwkqIHRtLWlyaXgzLmgsIHRtLW1pcHMuaCAoRVhUUkFfRlJBTUVfSU5GTyk6ICB1c2UgcHJvcGVyIHR5cGUgZm9yCisJcHJvY19kZXNjIGVsZW1lbnQuCisKK1RodSBBcHIgIDIgMDk6NDc6MTEgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIHZhbHVlcy5jICh1bnBhY2tfbG9uZyk6ICBGaXggdW5wYWNraW5nIGVycm9yIGZvciBzaWduZWQgY2hhcnMKKwlvbiBob3N0cyB3aGVyZSB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgdHlwZSBpcyB1bnNpZ25lZC4KKwkqIHByb2Nmcy5jIChwcl9mbGFnX3RhYmxlLCBwcl93aHlfdGFibGUpOiAgQWRkIHNvbWUgZW50cmllcworCWZvciBuZXdlciBTVlI0IHZhcmlhbnRzLgorCSogcHJvY2ZzLmMgKHByb2Nfc2V0X2V4ZWNfdHJhcCk6ICBSZW9yZGVyIHRlc3RzIGZvciBpb2N0bCdzIHRoYXQKKwl0dXJuIG9mZiB0cmFjZSBpbmhlcml0LW9uLWZvcmsgZmxhZyB0byBmYXZvciBsYXRlc3QgU1ZSNCBtZXRob2QuCisJKiBwcm9jZnMuYyAobWFwcGluZ2ZsYWdzKTogIEFkZCBzdXBwb3J0IGZvciBNQV9QSFlTCisKK1RodSBBcHIgIDIgMDA6NTU6NTYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGJ1aWxkc3ltLmMgKHJlYWRfc3RydWN0X3R5cGUpOiAgQXZvaWQgY29yZWR1bXAgd2hlbiBDKysKKwlhYmJyZXZpYXRlZCB0eXBlIG5hbWUgaXMgbWVzc2VkIHVwLiAgUmVwb3J0ZWQgYnkgSm9lIEJ1Y2suCisJRklYTUUsIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgR0RCIG9yIEdDQyBuZWVkcyB0byBiZQorCXNtYXJ0ZXIgdG8gY29ycmVjdGx5IGxvY2F0ZSB0aGlzIHR5cGUgbmFtZS4KKworCSogYy1leHAueSwgY29mZnJlYWQuYywgY29tbWFuZC5jLCBjb21tYW5kLmgsIGNvcHlpbmcuYXdrLAorCWRieHJlYWQuYywgZ2RidHlwZXMuYywgaW5mY21kLmMsIGluZmVyaW9yLmgsIGluZnJ1bi5jLAorCW0yLWV4cC55LCBwcmludGNtZC5jLCByZW1vdGUuYywgc29saWIuYywgc291cmNlLmMsIHN0YWNrLmMsCisJc3ltdGFiLmMsIHRtLXN1bjRvczQuaCwgdG0tc3VuNG9zNS5oLCB2YWx1ZXMuYzogIExpbnQuCisJKiBzeW1maWxlLmMgKGFkZF9zeW1ib2xfZmlsZV9jb21tYW5kKTogIEluaXRpYWxpemUgbWFwcGVkL3JlYWRub3cuCisKK1dlZCBBcHIgIDEgMTE6Mzk6NTIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGJyZWFrcG9pbnQuaCAoYnBkaXNwLCBicHR5cGUpOiAgUmVtb3ZlIHRyYWlsaW5nIGNvbW1hLgorCSogc3ltdGFiLmggKGN1cnJlbnRfc291cmNlX3N5bXRhYik6ICBNYWtlIGV4dGVybgorCSogc3ltdGFiLmggKGN1cnJlbnRfc291cmNlX2xpbmUpOiBNYWtlIGV4dGVybgorCSogaW5mZXJpb3IuaDogIE1vdmUgYWxsIHByb2Nmcy5jIHByb3RvdHlwZXMgdG8gb25lIHBsYWNlLCBhZGQKKwlwcm90b3R5cGUgZm9yIHByb2Nfc2lnbmFsX2hhbmRsaW5nX2NoYW5nZS4gIEFkZCBwcm90b3R5cGVzIGZvcgorCXNpZ25hbF9zdG9wX3N0YXRlLCBzaWduYWxfcHJpbnRfc3RhdGUsIGFuZCBzaWduYWxfcGFzc19zdGF0ZS4KKwkqIGluZmVyaW9yLmggKHN0b3Bfc29vbl9xdWlldGx5KTogIE1ha2UgZXh0ZXJuCisJKiBpbmZlcmlvci5oIChhdHRhY2hfZmxhZyk6ICBNYWtlIGV4dGVybgorCSogaW5mcnVuLmMgKE5PVElDRV9TSUdOQUxfSEFORExJTkdfQ0hBTkdFKTogIERlZmF1bHQgaXMgbnVsbC4KKwkqIGluZnJ1bi5jIChzaWduYWxfc3RvcF9zdGF0ZSwgc2lnbmFsX3ByaW50X3N0YXRlLAorCXNpZ25hbF9wYXNzX3N0YXRlKTogIE5ldyBmdW5jdGlvbnMgdG8gcXVlcnkgc3BlY2lmaWMgc2lnbmFsCisJaGFuZGxpbmcgZmxhZ3MuCisJKiBpbmZydW4uYyAoaGFuZGxlX2NvbW1hbmQpOiAgTWlub3IgZXJyb3IgbWVzc2FnZSBjaGFuZ2UsIGFkZAorCU5PVElDRV9TSUdOQUxfSEFORExJTkdfQ0hBTkdFLgorCSogcHJvY2ZzLmMgKG9wZW5fcHJvY19maWxlKTogIFJlbW92ZSBpcmlzIHNwZWNpZmljIHJlc2V0IG9mCisJaW5oZXJpdC1vbi1mb3JrIGZsYWcsIG1vdmVkIHRvIHByb2Nfc2V0X2V4ZWNfdHJhcCgpLgorCSogcHJvY2ZzLmMgKHByb2Nfc2V0X2V4ZWNfdHJhcCk6ICBBZGQgU1ZSNCBhbmQgaXJpcyBjb2RlCisJdG8gcmVzZXQgaW5oZXJpdC1vbi1mb3JrIGZsYWcsIGJhc2ggY29tbWVudCB0byBHTlUgZm9ybS4KKwkqIHByb2Nmcy5jIChwcm9jX2Jhc2VfYWRkcmVzcywgc2V0X3Byb2Nfc2lnaW5mbywKKwlmZXRjaF9jb3JlX3JlZ2lzdGVycyk6ICBDb25mb3JtIHRvIGNvZGUgc3R5bGUuCisJKiBwcm9jZnMuYyAoc2lnbmFtZS5oKTogIEluY2x1ZGUuCisJKiBwcm9jZnMuYyAoTUFYX1NZU0NBTExTLCBzeXNjYWxsX3RhYmxlW10sIGluaXRfc3lzY2FsbHRhYmxlKCksCisJc3lzY2FsbG5hbWUoKSwgaW5mb19wcm9jX3N5c2NhbGxzKCkpOiAgTmV3IG1hY3JvcywgdGFibGVzLCBhbmQKKwlmdW5jdGlvbnMgdG8gb3JnYW5pemUgYW5kIHJlcG9ydCBzeXN0ZW0gY2FsbCBpbmZvcm1hdGlvbi4KKwkqIHByb2Nmcy5jIChzYXZlZF9mbHRzZXQsIHNhdmVkX3RyYWNlLCBzYXZlZF9zaWdob2xkLAorCXNhdmVkX2V4aXRzZXQsIHNhdmVkX2VudHJ5c2V0KTogIEFkZCB0byBwcm9jaW5mbyBzdHJ1Y3QuCisJKiBwcm9jZnMuYyAoc3RydWN0IHRyYW5zKTogIEFkZC4KKwkqIHByb2Nmcy5jIChwcl9mbGFnX3RhYmxlLCBwcl93aHlfdGFibGUsIGZhdWx0c190YWJsZSwKKwlzaWdpbmZvX3RhYmxlLCBlcnJub190YWJsZSk6ICBUYWJsZXMgdG8gdHJhbnNsYXRlIG51bWVyaWMgdmFsdWVzCisJdG8gc3ltYm9saWMgbmFtZXMgYW5kIHNob3J0IGRlc2NyaXB0aW9ucy4KKwkqIHByb2Nmcy5jIChzaWduYWxuYW1lLCBpbmZvX3Byb2Nfc2lnbmFscyk6ICBBZGQgZnVuY3Rpb24gYW5kCisJcHJvdG90eXBlLgorCSogcHJvY2ZzLmMgKHByb2NfaW5mbyk6ICBOb3cgaW5mb19wcm9jLgorCSogcHJvY2ZzLmMgKHByb2NfaW5mb19hZGRyZXNzX21hcCk6ICBOb3cgaW5mb19wcm9jX21hcHBpbmdzLgorCSogcHJvY2ZzLmMgKGluZm9fcHJvY19mbGFncywgaW5mb19wcm9jX3N0b3AsIGluZm9fcHJvY19zaWdpbmZvLAorCWluZm9fcHJvY19mYXVsdHMsIGxvb2t1cG5hbWUsIGxvb2t1cGRlc2MsIHNpZ2NvZGVuYW1lLAorCXNpZ2NvZGVkZXNjKTogIE5ldyBmdW5jdGlvbnMuCisJKiBwcm9jZnMuYyAocHJvY19zaWduYWxfaGFuZGxpbmdfY2hhbmdlKTogIE5ldyBmdW5jdGlvbiB0byBzZXQKKwl0aGUgdHJhY2UgZmxhZ3MgYmFzZWQgb24gdGhlIHN0YXRlIG9mIGdkYidzIHNpZ25hbCBoYW5kbGluZyBmbGFncy4KKwkqIHByb2Nmcy5jIChpbmZlcmlvcl9wcm9jX2luaXQpOiAgQ2FsbCBwcm9jX3NpZ25hbF9oYW5kbGluZ19jaGFuZ2UKKwlhbmQgcmVtb3ZlIGNvZGUgdG8gZG8gUElPQ1NUUkFDRSBpb2N0bC4KKwkqIHByb2Nmcy5jIChhdHRhY2gsIGRldGFjaCk6ICBQcmVzZXJ2ZSBhbmQgcmVzdG9yZSBwcm9jZXNzIGZsYWdzCisJdXNpbmcgc2F2ZWRfKiBmaWVsZHMgaW4gcHJvY2luZm8gc3RydWN0LgorCSogcHJvY2ZzLmMgKGF0dGFjaCk6ICBDYWxsIHByb2Nfc2lnbmFsX2hhbmRsaW5nX2NoYW5nZS4KKwkqIHByb2Nmcy5jIChpbmZvX3Byb2MpOiAgTWFqb3IgcmV3b3JrIHRvIGV4cGFuZCAiaW5mbyBwcm9jIiBjbWQuCisJKiBwcm9jZnMuYyAocHJvY19kZXNjKTogIFVwZGF0ZSBmb3IgbGF0ZXN0IGNoYW5nZXMuCisJKiB4bS1pcml4NC5oIChDUkVBVEVfSU5GRVJJT1JfSE9PSyk6ICBQcm90ZWN0IGJ5IFVTRV9QUk9DX0ZTLgorCSogeG0taXJpeDQuaCAoTk9USUNFX1NJR05BTF9IQU5ETElOR19DSEFOR0UpOiAgQWRkIGRlZmluaXRpb24uCisJKiB4bS1zeXN2NC5oIChOT1RJQ0VfU0lHTkFMX0hBTkRMSU5HX0NIQU5HRSk6ICBBZGQgZGVmaW5pdGlvbi4KKworVHVlIE1hciAzMSAxODozODoyOCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogcHJvY2ZzLmMgKHNldF9wcm9jX3NpZ2luZm8pOiAgQWRkIHByb3RvdHlwZSBhbmQgbmV3IGZ1bmN0aW9uLgorCSogcHJvY2ZzLmMgKGRldGFjaCwgY2hpbGRfcmVzdW1lKTogIENhbGwgc2V0X3Byb2Nfc2lnaW5mbyB0byBzZXQKKwl1cCBpbmZlcmlvciBzaWdpbmZvIHN0cnVjdC4KKwkqIGVsZnJlYWQuYyAoZWxmX3N5bWZpbGVfcmVhZCk6ICBDb21wdXRlIHRoZSByZWxvY2F0aW9uIGFtb3VudAorCWJ5IHN1YnRyYWN0aW5nIG9mZiB0aGUgYWRkcmVzcyBvZiB0aGUgIi50ZXh0IiBzZWN0aW9uLgorCSogc29saWIuYzogIEFkZCBwb2ludGVyIHRvICIudGV4dCIgc2VjdGlvbiB0byBzb19saXN0IHN0cnVjdC4KKwkqIHNvbGliLmMgKHNvbGliX21hcF9zZWN0aW9ucyk6ICBJbml0aWFsaXplIHBvaW50ZXIgdG8gIi50ZXh0IgorCXNlY3Rpb24gaW4gc29fbGlzdCBzdHJ1Y3QuCisJKiBzb2xpYi5jIChzeW1ib2xfYWRkX3N0dWIpOiAgUGFzcyBiYXNlIGFkZHJlc3Mgb2YgIi50ZXh0IgorCXNlY3Rpb24gdG8gc3ltYm9sX2ZpbGVfYWRkLCByYXRoZXIgdGhhbiB0aGUgbG9hZCBhZGRyZXNzIG9mCisJdGhlIHNoYXJlZCBsaWJyYXJ5LiAgT24gU3VuT1MgdGhleSBhcmUgdGhlIHNhbWUuICBPbiBTVlI0IHRoZXkKKwlhcmUgbm90LgorCitUdWUgTWFyIDMxIDE3OjQ4OjE1IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3Byb2NlZHVyZSk6ICBQRFIuaXN5bSBzaG91bGQgZ2V0IHBvaW50ZXIgdG8KKwlmdW5jdGlvbiBuYW1lLCBub3QgLmdkYmluZm8uIHN5bWJvbC4KKworVHVlIE1hciAzMSAxNzowNTowNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50XzEpOiAgRml4IHByb3RvdHlwZSwgdGhpcyB0aW1lIGZvciBzdXJlIQorCitUdWUgTWFyIDMxIDExOjAxOjA2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIDQuNC44CisKKwkqIHByb2Nmcy5jIChvcGVuX3Byb2NfZmlsZSk6ICBEaXNhYmxlIGluaGVyaXQtb24tZm9yayBmbGFnIHNvIHRoYXQKKwljb21tYW5kcyBpbiAuY3NocmMvLnByb2ZpbGUgd29uJ3QgZ2V0IHRyYWNlZC4KKworVHVlIE1hciAzMSAwODoxMTo1OCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogZWxmcmVhZC5jIChlbGZfc3ltdGFiX3JlYWQpOiAgVXNlIHhtYWxsb2MsIG5vdCBiZmRfeG1hbGxvYy4KKwkqIGV4ZWMuYyAoYnVpbGRfc2VjdGlvbl90YWJsZSk6ICBEb24ndCBhYm9ydCBpZiBubyBzZWN0aW9ucy4KKwkqIHNwYXJjLXRkZXAuYyAoc2luZ2xlX3N0ZXApOiAgTGludC4KKwkqIHV0aWxzLmMgKG1yZWFsbG9jKTogIEhhbmRsZSByZWFsbG9jICgwLCBzaXplKSBjYXNlIGhlcmUuCisKK01vbiBNYXIgMzAgMTY6NTA6NDMgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGFsbGRlcHMubWFrKTogIENvbmZpZyBmaWxlcyBhcmUgbm93ICoubVtodF0gYXMKKwlvcHBvc2VkIHRvIG1baHRdLSohCisKKwkqIGNvbmZpZy9pcml4NC5taDogIERvbid0IHVzZSBjb3JlZGVwLm8uICBJdCBkb2Vzbid0IHdvcmsgd2l0aCBwcm9jZnMuCisKKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3N5bWJvbCwgcGFyc2VfcHJvY2VkdXJlKTogIFJlLWRvIHRoZSB3YXkgdGhhdAorCS5nZGJpbmZvLiBzeW1ib2xzIGFyZSBjcmVhdGVkLiAgTW92ZSBjcmVhdGlvbiBmcm9tIHBhcnNlX3Byb2NlZHVyZQorCXRvIHBhcnNlX3N5bWJvbCwgd2hlcmUgaXQgaXMgZmFpcmx5IGVhc3kgdG8gZ3JvdyB0aGUgc3ltdGFiLiAgVGhpcworCWFsc28gZml4ZXMgYSBzeW10YWIgdHJhc2hpbmcgYnVnIG9uIGFsbCBtaXBzLWJhc2VkIHN5c3RlbXMuCisJKiAoZ290X251bWFyZ3MsIGxvb2t1cF9udW1hcmdzLCBmcmVlX251bWFyZ3MpOiAgRGVsZXRlLiAgTm90CisJbmVlZGVkIGFueW1vcmUuCisJKiB0bS1taXBzLmgsIHRtLWlyaXMzLmgsIG1pcHMtdGRlcC5jLCBtaXBzcmVhZC5jOiAgUmUtZG8gc3RydWN0CisJbWlwc19leHRyYV9mdW5jX2luZm8sIGFuZCBhbGwgdGhlIFBST0NfeHh4IG1hY3JvcyB0aGF0IGxvb2sgYXQgaXQuCisKK01vbiBNYXIgMzAgMTQ6MTc6NTMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIGMtZXhwLnk6ICBBZGQgbWlzc2luZyByZXR1cm4gdHlwZSB0byB5eXBhcnNlKCkgcHJvdG90eXBlLgorCitTYXQgTWFyIDI4IDIyOjIyOjA2IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJQ3JlYXRlIGFuZCB1c2UgbWFjcm9zIGZvciBpdGVyYXRpbmcgb24gc3ltdGFicywgcHN5bXRhYnMsIG1zeW1ib2xzLgorCisJKiBtaW5zeW1zLmMgKGl0ZXJhdGVfb3Zlcl9tc3ltYm9scyk6ICBSZW1vdmU7IGNsdW5reSBhbmQgc2xvdy4KKwkqIHN5bWZpbGUuaCwgc3ltdGFiLmggKGl0ZXJhdGVfb3Zlcl9tc3ltYm9scyk6ICBSZW1vdmUgcHJvdG90eXBlCisJKiBjb2ZmcmVhZC5jIChjb2ZmX3N5bWZpbGVfcmVhZCk6ICBpdGVyYXRlX292ZXJfc3ltdGFicyA9PiBBTExfU1lNVEFCUy4KKwkocGF0Y2hfb3BhcXVlX3R5cGVzKTogIEF2b2lkIGR1bW15IGFyZ3MgYW5kIHJlc3VsdC4KKwkqIG9iamZpbGVzLmMgKGhhdmVfcGFydGlhbF9zeW1ib2xzLCBoYXZlX2Z1bGxfc3ltYm9scywKKwloYXZlX21pbmltYWxfc3ltYm9scyk6ICBleHBsaWNpdCBpdGVyYXRpb24gPT4gQUxMX09CSkZJTEVTOyBzaW1wbGlmeS4KKwkoaXRlcmF0ZV9vdmVyX29iamZpbGVzLCBpdGVyYXRlX292ZXJfc3ltdGFicywKKwlpdGVyYXRlX292ZXJfcHN5bXRhYnMpOiAgUmVtb3ZlLCBjbHVua3kgYW5kIHNsb3cuCisJKiBvYmpmaWxlcy5oOiAgUmVwbGFjZSBpdGVyYXRlX292ZXJfKiBwcm90b3R5cGVzIHdpdGggQUxMX1NZTVRBQlMsCisJQUxMX1BTWU1UQUJTLCBhbmQgQUxMX01TWU1CT0xTIG1hY3Jvcy4KKwkqIHN5bW1pc2MuYyAoZHVtcF9zeW10YWIsIGR1bXBfcHN5bXRhYiwgZHVtcF9tc3ltYm9scywKKwlkdW1wX29iamZpbGUpOiAgUmVtb3ZlIGR1bW15IGFyZ3MgYW5kIHJlc3VsdHMuICBNb3ZlIGZpbGVuYW1lCisJY29tcGFyaXNvbnMgdG8gY2FsbGVycy4KKwkocHJpbnRzeW1zX2NvbW1hbmQsIHByaW50cHN5bXNfY29tbWFuZCwgcHJpbnRtc3ltc19jb21tYW5kLAorCXByaW50b2JqZmlsZXNfY29tbWFuZCk6ICBpdGVyYXRlX292ZXJfKiA9PiBBTExfKi4gIENvbXBhcmUgZmlsZW5hbWVzLgorCSogc3ltdGFiLmMgKGxvb2t1cF9zeW10YWJfMSwgbG9va3VwX3N5bXRhYiwgbG9va3VwX3BhcnRpYWxfc3ltdGFiLAorCWxvb2t1cF9zeW1ib2wsIGZpbmRfbWFpbl9wc3ltdGFiLCBmaW5kX3BjX3N5bXRhYiwgc291cmNlc19pbmZvLAorCWxpc3Rfc3ltYm9scywgbWFrZV9zeW1ib2xfY29tcGxldGlvbl9saXN0KTogIFJlcGxhY2UgZXhwbGljaXQKKwlpdGVyYXRpb24gd2l0aCBBTExfU1lNVEFCUywgQUxMX1BTWU1UQUJTLCBvciBBTExfTVNZTUJPTFMuCisJRWxpbWluYXRlIERpamtzdHJhIGZsYWcgY3JhcCwgYnJlYWsgb3V0IG9mIGxvb3BzIHdpdGggZ290b3MuCisJKGxvb2t1cF9zeW10YWJfMSk6ICBQcm90ZWN0ICcvJyB0ZXN0cyBmcm9tIHNob3J0IGZpbGVuYW1lcy4KKwkoY3BsdXNfbWFuZ2xlZF9zeW1ib2wpOiAgTW92ZSBpbmxpbmUgaW50byBsb29rdXBfc3ltYm9sLgorCSogeGNvZmZleGVjLmMgKHJlbG9jYXRlX29iamZpbGVfbXN5bWJvbHMpOiAgUmVtb3ZlIHBvb3IgaGFjay4KKwkocmVsb2NhdGVfbWluaW1hbF9zeW1ib2wpOiAgTW92ZSBpbmxpbmUgdG8gdm1hcF9zeW10YWIuCisJKHZtYXBfc3ltdGFiKTogIFJlcGxhY2UgaXRlcmF0aW9uIHdpdGggQUxMX09CSkZJTEVTLAorCWl0ZXJhdGVfb3Zlcl9tc3ltYm9scyB3aXRoIEFMTF9NU1lNQk9MUy4KKworCU1pc2MgY2xlYW51cCBwcmlvciB0byByZWxlYXNlLgorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICBSb2xsIHRvIDQuNC43LgorCShIRklMRVMpOiAgQWRkIGNhbGwtY21kcy5oLgorCSogY2FsbC1jbWRzLmg6ICBOZXcgaGVhZGVyIGZvciBjb21tYW5kIGZucyBjYWxsZWQgYnkgb3RoZXIgZmlsZXMuCisJKiBicmVha3BvaW50LmMgKHdhdGNocG9pbnRzX2luZm8pOiAgUmVtb3ZlLCBzYW1lIGFzIGJyZWFrcG9pbnRzX2luZm8uCisJKGJyZWFrcG9pbnRfMSk6ICBSZW1vdmUgdW51c2VkIHR5cGUgYXJnLiAgQ2hhbmdlIGNhbGxlcnMuCisKKwkqIGR3YXJmcmVhZC5jIChkd2FyZl9idWlsZF9wc3ltdGFicyk6ICBSZW1vdmUgbWFpbmxpbmUgdGVzdC4KKwkqIG1pcHNyZWFkLmMgKGNvbXBhcmVfc3ltdGFicywgY29tcGFyZV9wc3ltdGFicyk6ICBSZW1vdmUsIHVudXNlZC4KKwkqIG1pcHNyZWFkLmM6ICBBZGQgcHJvdG90eXBlcyBmb3IgYWxsIHN0YXRpYyBmdW5jdGlvbnMuCisKKwkqIHN5bW1pc2MuYyAoZHVtcF9zeW10YWJfbGluZXMsIGR1bXBfc3ltdGFicywgZHVtcF9sYXN0X3N5bXRhYiwKKwlkdW1wX2Jsb2NrdmVjdG9yLCBkdW1wX2Jsb2NrLCBkdW1wX2FkZHJjaGFzcywgZHVtcF9uYW1lc3BhY2UsCisJZHVtcF9zeW1ib2wsIGR1bXBfdHlwZSwgZHVtcF9saW5ldGFibGUsIGR1bXBfc3RydGJsKTogIFJlbW92ZSwgdW51c2VkLgorCSogeGNvZmZyZWFkLmMgKGR1bXBfc3ltdGFiX2xpbmVzLCBkdW1wX3N5bXRhYnMsIGR1bXBfbGFzdF9zeW10YWIsCisJZHVtcF9ibG9ja3ZlY3RvciwgZHVtcF9ibG9jaywgZHVtcF9hZGRyY2hhc3MsIGR1bXBfbmFtZXNwYWNlLAorCWR1bXBfc3ltYm9sLCBkdW1wX3R5cGUsIGR1bXBfbGluZXRhYmxlLCBkdW1wX3N0cnRibCk6ICBSZW1vdmUgMm5kCisJdW51c2VkIGNvcHkhCisKKwkqIGJ1aWxkc3ltLmMgKGRlZmluZV9zeW1ib2wpOiAgSGFuZGxlIGdsb2JhbCByZWdpc3RlciB2YXJpYWJsZXMKKwkoZnJvbSBQaWVycmUgV2lsbGFyZCkuICBDb21wbGFpbiBpZiByZWdpc3RlciBudW1iZXJzIGFyZSB0b28gbGFyZ2UuCisJKiB0YXJnZXQuYyAobm9tZW1vcnkpOiAgTm93IHRoYXQgaGlnaGVyIGxldmVscyBleGFtaW5lIGVycm5vLCBnaXZlIEVJTy4KKwkqIHRtLXNwYXJjLmg6ICBEb24ndCAjaW5jbHVkZSA8c3VuNC9yZWcuaD4uCisJKiBzcGFyYy10ZGVwLmMgKHNwYXJjX2ZyYW1lX2NoYWluLCBmcmFtZV9zYXZlZF9wYyk6ICBSZW1vdmUKKwlkZXBlbmRlbmN5IG9uIDxzdW40L3JlZy5oPi4gIFN0YXJ0IHRvIGhhbmRsZSBjcm9zcy1ieXRlLW9yZGVyLgorCisJKiBsYW5ndWFnZS5oOiAgQXZvaWQgZm9yd2FyZCBlbnVtIGRlY2xhcmF0aW9uLgorCSogY29uZmlndXJlLmluLCB0bS1zdW40b3M1LmgsIHhtLXN1bjRvczUuaCwgY29uZmlnL3N1bjRvczUubWgsCisJY29uZmlnL3N1bjRvczUubXQ6ICBOZXcgaG9zdCBhbmQgdGFyZ2V0LgorCSogZGVmcy5oIChlcnJubyk6ICNpbmNsdWRlIDxlcnJuby5oPiByYXRoZXIgdGhhbiBhc3N1bWluZyBpbnQuCisJRnJvbSBQaWVycmUgV2lsbGFyZC4KKworCSogYnJlYWtwb2ludC5jLCBicmVha3BvaW50LmgsIGJ1aWxkc3ltLmMsIGNvZmZyZWFkLmMsIGNwbHVzLWRlbS5jLAorCWRieHJlYWQuYywgZHdhcmZyZWFkLmMsIGVsZnJlYWQuYywgaW5mY21kLmMsIGluZnJ1bi5jLCBpbmZ0YXJnLmMsCisJbGFuZ3VhZ2UuYywgbWFpbi5jLCBtZW0tYnJlYWsuYywgbWlwcy10ZGVwLmMsIG1pcHNyZWFkLmMsCisJcGFydGlhbC1zdGFiLmgsIHJlbW90ZS5jLCBzYWJlci5zdXBwcmVzcywgc3ltZmlsZS5jLCBzeW10YWIuYywKKwl2YWxvcHMuYywgdmFscHJpbnQuYywgeGNvZmZyZWFkLmMsIGMtZXhwLnksIG0yLWV4cC55LCBibG9ja2ZyYW1lLmMsCisJY29tbWFuZC5jLCBjb3JlLmMsIGV4ZWMuYywgZ2RidHlwZXMuaCwgcGFyc2UuYywgcHJpbnRjbWQuYywgc29saWIuYywKKwlzcGFyYy14ZGVwLmMsIHV0aWxzLmMsIHZhbHVlLmgsIHZhbHVlcy5jOiAgTGludC4KKworU2F0IE1hciAyOCAwMjo0MzoyNiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogYnVpbGRzeW0uYyAocmVhZF9yYW5nZV90eXBlKTogIEF2b2lkIGludCBvdmVyZmxvdyBieSB1c2luZyB1bnNpZ25lZC4KKwkqIGRieHJlYWQuYyAoZGJ4X3N5bWZpbGVfaW5pdCk6ICBSZW1vdmUgYm9ndXMgYGx2YWx1ZSBjYXN0Jy4KKwkqIGxhbmd1YWdlLmggKGVudW0gZXhwX29wY29kZSk6ICBBdm9pZCBmb3J3YXJkIGVudW0gZGVmLgorCSogbWFpbi5jIChkZWZpbmVfY29tbWFuZCwgdXNlcl9kZWZpbmVkX2NvbW1hbmQpOiAgTGludC4KKwkqIG1lbS1icmVhay5jLCB4Y29mZnJlYWQuYzogIExpbnQuCisJKiBzb2xpYi5jOiAgT25seSAjaW5jbHVkZSA8YS5vdXQuaD4gb24gU3VuT1MsIG5vdCBTVlI0LgorCitTdW4gTWFyIDI5IDE0OjE2OjIyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBNZXJnZWQgaW4gbGF0ZXN0IFJTNjAwMCBkaWZmcyBmcm9tIE1ldGluIEcuIE96aXNpay4KKwkqIHhjb2Zmc29saWIuYywgeGNvZmZzb2xpYi5oOiAgTmV3IGZpbGVzLCBmcm9tIE1ldGluLgorCSogVmFyaW91cyBmaWxlczogQ2hhbmdlZCAjaWZkZWYgSUJNNjAwMCB0byBJQk02MDAwX0hPU1QKKwlvciBJQk02MDAwX1RBUkdFVCBhcyAoYXBwcm94aW1hdGVseSkgYXBwcm9wcmlhdGUuCisKK1NhdCBNYXIgMjggMTM6MDA6MTAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIG9iamZpbGVzLmggKE9CSkZfU1lNUyk6ICBEZWZpbmUgZmxhZyBiaXQgZm9yIG9iamZpbGUgZmxhZ3MuCisJKiBzeW1maWxlLmMgKHN5bWJvbF9maWxlX2FkZCk6ICBVc2UgT0JKRl9TWU1TIHRvIGRlY2lkZSAgd2hldGhlcgorCW9yIG5vdCB0byB0cnkgcmVhZGluZyBzeW1ib2xzIGZyb20gYSBtYXBwZWQgb2JqZmlsZS4gIFBsdWdzIG1lbW9yeQorCWxlYWsgZHVlIHRvIHNoYXJlZCBsaWJyYXJpZXMgZ2VuZXJhdGluZyBubyBwc3ltdGFicyBvciBzeW10YWJzLgorCitGcmkgTWFyIDI3IDE1OjQ0OjU1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBidWlsZHN5bS5jIChNQVhfT0ZfQ19UWVBFLCBNSU5fT0ZfQ19UWVBFKTogIFVudXNlZCwgcmVtb3ZlLgorCSogY29weWluZy5hd2s6ICBMaW50LiAgTWFrZSBzdHJvbmdlciB3YXJuaW5nIGF0IHRvcCBvZiBjb3B5aW5nLmMuCisJKiBlbGZyZWFkLmMgKGVsZl9zeW10YWJfcmVhZCk6ICBFbGltaW5hdGUgY2hlY2sgb2YgbWFpbmxpbmUuCisJKiBnZGJ0eXBlcy5jIChzbWFzaF90b18qKTogIFJlbW92ZSBGSVhNRSBjb21tZW50cy4KKwkobG9va3VwX3BvaW50ZXJfdHlwZSk6ICBBZGQgRklYTUUgY29tbWVudC4KKwkqIG1haW4uYyAoc2V0X2hpc3Rvcnlfc2l6ZV9jb21tYW5kKTogIERpc2FsbG93IG5lZ2F0aXZlIHNpemUuCisJKiBwYXJ0aWFsLXN0YWIuaDogIFVwZGF0ZSBjb3B5cmlnaHQuCisJKiByczYwMDAtdGRlcC5jIChza2lwX3RyYW1wb2xpbmVfY29kZSk6ICBCZXR0ZXIgY29tbWVudHMuCisKK1dlZCBNYXIgMjUgMTA6NDU6MzggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIG1haW4uYyAoc2V0X2hpc3Rvcnlfc2l6ZV9jb21tYW5kKTogIE5lZ2F0aXZlIHNpemUgaXMgZXJyb3IuCisJKFJlcG9ydGVkIGJ5IFBlZ2d5IEZpZWxhbmQuKQorCitUaHUgTWFyIDI2IDE3OjAxOjE4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb2ZmcmVhZC5jIChjb2ZmX3N5bWZpbGVfaW5pdCk6ICBVcGRhdGUgY29tbWVudC4KKwkqIGRieHJlYWQuYyAoREJYX1NZTUZJTEVfSU5GTywgREJYX1RFWFRfU0VDVCwgREJYX1NZTUNPVU5ULAorCURCWF9TVFJJTkdUQUIsIERCWF9TVFJJTkdUQUJfU0laRSwgREJYX1NZTVRBQl9PRkZTRVQpOiAgRGVmaW5lCisJbWFjcm9zIHRvIGFjY2VzcyB0aGUgZGJ4IHNwZWNpZmljIG9iamZpbGUgaW5mb3JtYXRpb24uCisJKiBkYnhyZWFkLmMgKHN5bWZpbGVfc3RyaW5nX3RhYmxlLCBzeW1maWxlX3N0cmluZ190YWJsZV9zaXplKToKKwlSZW1vdmUgdGhlc2UgbG9jYWwgdmFyaWFibGVzLgorCSogZGJ4cmVhZC5jIChyZWFkX29maWxlX3N5bXRhYiwgcHN5bXRhYl90b19zeW10YWJfMSwKKwlyZWFkX2RieF9zeW10YWIpOiAgUmVtb3ZlIHRoZSBzdHJpbmd0YWIgYW5kIHN0cmluZ3RhYl9zaXplIHBhcmFtcworCWZyb20gdGhlIGZ1bmN0aW9uIHByb3RvdHlwZXMsIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLCBhbmQgdGhlCisJZnVuY3Rpb24gY2FsbHMuICBUaGVzZSBhcmUgbm93IGF2YWlsYWJsZSB2aWEgREJYX1NUUklOR1RBQiBhbmQKKwlEQlhfU1RSSU5HVEFCX1NJWkUgdXNpbmcgdGhlIG9iamZpbGUgcG9pbnRlci4KKwkqIGRieHJlYWQuYyAoZGJ4X3N5bWZpbGVfcmVhZCk6ICBSZWxvY2F0ZSBhZGRyIGJlZm9yZSB1c2luZyBhcworCWFuIGFyZyB0byByZWFkX2RieF9zeW10YWIuCisJKiBkYnhyZWFkLmMgKGRieF9zeW1maWxlX3JlYWQpOiAgUmVtb3ZlIGNvZGUgdGhhdCBmcmVlJ2QgdGhlCisJc3RyaW5ndGFiIGFuZCB0aGUgZGJ4IHNwZWNpZmljIHBlci1vYmpmaWxlIHByaXZhdGUgaW5mby4KKwkqIGRieHJlYWQuYyAoaW5pdF9wc3ltYm9sX2xpc3QpOiAgUmVtb3ZlIHN5bWJvbCBjb3VudCBmcm9tIHBhc3NlZAorCWFyZ3MgaW4gcHJvdG90eXBlLCBmdW5jdGlvbiBkZWZpbml0aW9uLCBhbmQgZnVuY3Rpb24gY2FsbHMuICBJdCBpcworCW5vdyBhdmFpbGFibGUgdmlhIHRoZSBEQlhfU1lNQ09VTlQgbWFjcm8gdXNpbmcgdGhlIG9iamZpbGUKKwlwb2ludGVyLgorCSogZGJ4cmVhZC5jIChkYnhfc3ltZmlsZV9yZWFkLCBkYnhfc3ltZmlsZV9pbml0KTogIFJlbW92ZSB0aGUKKwlsb2NhbCBpbnN0YW5jZSBvZiBzdHJ1Y3QgZGJ4X3N5bWZpbGVfaW5mbyBhbmQgcmVwbGFjZSB3aXRoIERCWF8qCisJbWFjcm9zLgorCSogZGJ4cmVhZC5jIChkYnhfc3ltZmlsZV9yZWFkKTogIFJlbW92ZSBpbml0J3Mgb2Ygbm93IGRlbGV0ZWQKKwlzeW1maWxlX3N0cmluZ190YWJsZSBhbmQgc3ltZmlsZV9zdHJpbmdfdGFibGVfc2l6ZS4KKwkqIGRieHJlYWQuYyAoZGJ4X3N5bWZpbGVfZmluaXNoKTogIFJlbW92ZSBub3cgb2Jzb2xldGUgZnJlZSBvZgorCXN5bWZpbGVfc3RyaW5nX3RhYmxlLgorCSogZGJ4cmVhZC5jIChpbml0X3BzeW1ib2xfbGlzdCk6ICBVc2UgREJYX1NZTUNPVU5ULgorCSogZGJ4cmVhZC5jIChkYnhfcHN5bXRhYl90b19zeW10YWIpOiAgUmVtb3ZlIGxvY2FsIHN0cmluZ3RhYiBhbmQKKwlzdHJpbmd0YWIgc2l6ZSB2YXJpYWJsZXMuICBSZW1vdmUgYWxsIGNvZGUgdGhhdCB1c2VkIHRvIHJlcmVhZAorCXRoZSBzdHJpbmd0YWIuCisJKiBvYmpmaWxlcy5jIChhbGxvY2F0ZV9vYmpmaWxlKTogIE1vdmUgY2FsbHMgdG8gaW5pdF9tYWxsb2MoKQorCXRvIHByaW9yIHRvIGFueSBjYWxscyB0byBtbWFsbG9jIGZvciB0aGUgb2JqZmlsZSBzcGVjaWZpYyBoZWFwLgorCSogdXRpbHMuYyAoaW5pdF9tYWxsb2MpOiAgRG9jdW1lbnQgdGhlIHJlcXVpcmVtZW50IHRoYXQgZm9yIGVhY2gKKwloZWFwIGZvciB3aGljaCBjb3JydXB0aW9uIGNoZWNraW5nIGlzIGRlc2lyZWQsIHRoYXQgaW5pdF9tbWFsbG9jCisJbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gYW55IG1tYWxsb2MgY2FsbHMgb24gdGhlIGhlYXAuCisKK1RodSBNYXIgMjYgMTM6MjA6MDYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIHJzNjAwMC1waW5zbi5jOiAgTWFrZSBkaXMtYXNzZW1ibHkgb3V0cHV0IG1vcmUgbGlrZQorCW90aGVyIHRhcmdldHM6ICBEb24ndCBwcmludCBpbnN0cnVjdGlvbiBpbiBoZXggYmVmb3JlCisJdGhlIGFzc2VtYmx5OyAgdXNlIHByaW50X2FkZHJlc3MgdG8gcHJpbnQgb3V0IGp1bXAKKwlkZXN0aW5hdGlvbnMuCisKK1dlZCBNYXIgMjUgMTY6NTI6MzUgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIGMtZXhwLnksIGdkYnR5cGVzLmg6ICBBZGQgYnVpbHRpbl90eXBlX3NpZ25lZF9jaGFyLgorCSogY3BsdXMtZGVtLmM6ICBTdXBwb3J0ICJTYyIgbWVhbmluZyAic2lnbmVkIGNoYXIiLgorCitXZWQgTWFyIDI1IDE1OjIxOjQ0IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIGZpeCBpcmlzL2lyaXMzLgorCitXZWQgTWFyIDI1IDE0OjU1OjQ4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBjb21tYW5kLmMsIG1haW4uYyAodmFyaW91cyBwbGFjZXMpOiAgVXNlIGN0eXBlLmggbWFjcm9zCisJKHN1Y2ggYXMgaXN1cHBlcih4KSksICBpbnN0ZWFkIG9mIGhhcmQtd2lyaW5nIGluIEFTQ0lJLWlzbXMKKwkoc3VjaCBhcyAoeCA+PSAnQScgJiYgeCA8PSAnWicpKS4KKwkoVGhlcmUgYXJlIHN0aWxsIG1vcmUgb2YgdGhlc2UgaW4gb3RoZXIgZmlsZXMuKQorCSogbWFpbi5jIChkZWZpbmVkX2NvbW1hbmQpOiAgTG93ZXItY2FzZSB0aGUgdXNlcidzCisJbmV3IGNvbW1hbmQgYmVmb3JlIGVudGVyaW5nIGl0LiAgTmVlZGVkIGJlY2F1c2UKKwljb21tYW5kIGxvb2t1cCBpcyBjYXNlLWluc2Vuc2l0aXZlIChhbmQgYWxzbyBsb3dlci1jYXNlcykuCisJKEJhc2VkIG9uIE1ldGluJ3MgZWFybGllciBwYXRjaC4pCisKK1R1ZSBNYXIgMjQgMjM6Mjc6MDEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9pcml4NC5taDogbmV3IGZpbGUuCisKK1R1ZSBNYXIgMjQgMTQ6MTc6NDggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogaW5mY21kLmMgKHN0ZXBfMSk6ICBDYWxsIGRpc2FibGVfbG9uZ2ptcF9icmVha3BvaW50IGF0IHRoZSByaWdodAorCXRpbWUuCisKKwkqIHhtLW1pcHMuaDogIERlY2xhcmUgc3RyZHVwIGZvciB1bHRyaXguCisKKwkqIG1pcHNyZWFkLmMgKGZpeHVwX3NpZ3RyYW1wKTogIE1ha2Ugc3VyZSB0aGF0IGN1cnJlbnRfb2JqZmlsZSBpcyBzZXR1cAorCXdoZW4gY2FsbGluZyBuZXdfc3ltYm9sLgorCSogbWlwcy10ZGVwLmMgKG1pcHNfZnJhbWVfY2hhaW4pOiAgVXNlIHN5bWZpbGVfb2JqZmlsZSBpbnN0ZWFkIG9mCisJY3VycmVudF9vYmpmaWxlLgorCitUdWUgTWFyIDI0IDEzOjI2OjI1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3JzNjAwMC5taDogIFVwZGF0ZSAoZm9yIEZyZWQncyBuZXcgbW1hbGxvYykKKwlmbGFncyB0byBkaXNhYmxlIHVzZSBvZiBHTlUgbWFsbG9jL21tYWxsb2MuCisJKiBtdW5jaDogIENoYW5nZSBTWVNWIHJ1bGUgdG8gYWxsb3cgLnRleHQgYmVmb3JlIHRoZSBsYWJlbCwKKwlhcyB3ZWxsIGFzIGFmdGVyLCB0byB3b3JrIGZvciBBSVguCisJKiBnZGJ0eXBlcy5oOiAgTWlub3IgY2xhcmlmaWN0aW9uLgorCitUdWUgTWFyIDI0IDA3OjI2OjE5IDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AY3lnbnVzLmNvbSkKKworCSogYnVpbGRzeW0uYyAocmVhZF9zdHJ1Y3RfdHlwZSk6IEhhbmRsZSBjcmV0aW5vdXMgZGJ4IHN5bWJvbCBuYW1lCisJY29udGludWF0aW9uIGluIHlldCBhbm90aGVyIHBsYWNlIChiZXR3ZWVuIG1ldGhvZCBkZWNsYXJhdGlvbnMpLgorCitNb24gTWFyIDIzIDIzOjAxOjQxIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIG1pcHMtdGRlcC5jOiAgaW5jbHVkZSBzeW1maWxlLmggYW5kIG9iamZpbGVzLmggdG8gZml4CisJY29tcGlsYXRpb24gZXJyb3JzLgorCitNb24gTWFyIDIzIDE1OjQ5OjE0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiB2YWxvcHMuYyAodmFsdWVfc3RydWN0X2VsdF9mb3JfcmVmZXJlbmNlKTogIEFkZGVkICdvZmZzZXQnCisJcGFyYW1ldGVyIHRvIGhhbmRsZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KKwkqIGV2YWwuYywgdmFsdWUuaDogIFVwZGF0ZSBhY2NvcmRpbmdseS4KKworRnJpIE1hciAyMCAxNzo0MzoyNyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogb2JqZmlsZXMuaDogTmV3IGZpbGUKKwkqIE1ha2VmaWxlLmluIChIRklMRVMpOiAgQWRkIG9iamZpbGVzLmgKKwkqIGJsb2NrZnJhbWUuYzogIFJlbW92ZSBlbnRyeV9zY29wZV9sb3dwYywgZW50cnlfc2NvcGVfaGlnaHBjLAorCW1haW5fc2NvcGVfbG93cGMsIG1haW5fc2NvcGVfaGlnaHBjLgorCSogYmxvY2tmcmFtZS5jLCBidWlsZHN5bS5jLCBjb2ZmcmVhZC5jLCBkYnhyZWFkLmMsIGR3YXJmcmVhZC5jLAorCWVsZnJlYWQuYywgZ2RidHlwZXMuaCwgbWluc3ltcy5jLCBtaXBzcmVhZC5jLCBvYmpmaWxlcy5jLCBzb2xpYi5jLAorCXNvdXJjZS5jLCBzeW1maWxlLmMsIHN5bW1pc2MuYywgc3ltdGFiLmMsIHRhcmdldC5jLCB4Y29mZmV4ZWMuYywKKwl4Y29mZnJlYWQuYywgOiAgSW5jbHVkZSBvYmpmaWxlcy5oLgorCSogdG0tMjlrLmgsIHRtLWkzODZ2LmgsIHRtLW1lcmxpbi5oLCB0bS1yczYwMDAuaCwgdG0tc3VuMzg2LmgsCisJdG0tc3ltbWV0cnkuaCwgdG0tdGFob2UuaCwgdG0tdW1heC5oLCB0bS12YXguaCwgbTg4ay10ZGVwLmMsCisJbWlwcy10ZGVwLmMgKEZSQU1FX0NIQUlOKTogUmVuYW1lZCBvdXRzaWRlX3N0YXJ0dXBfZmlsZSB0bworCWluc2lkZV9lbnRyeV9maWxlKCkgYW5kIGxvZ2ljIGNoYW5nZWQgYXBwcm9wcmlhdGVseS4KKwkqIGJsb2NrZnJhbWUuYyAob3V0c2lkZV9zdGFydHVwX2ZpbGUpOiAgUmVuYW1lZCB0bworCWluc2lkZV9lbnRyeV9maWxlKCkgYW5kIGxvZ2ljIGNoYW5nZWQgYXBwcm9wcmlhdGVseS4KKwkqIGJsb2NrZnJhbWUuYyAoaW5zaWRlX21haW5fc2NvcGUpOiAgUmVuYW1lZCB0byBpbnNpZGVfbWFpbl9mdW5jKCkKKwlhbmQgbG9naWMgY2hhbmdlZCB0byB1c2UgcGVyLW9iamZpbGUgc3BlY2lmaWMgZmllbGRzLgorCSogYmxvY2tmcmFtZS5jIChpbnNpZGVfZW50cnlfc2NvcGUpOiAgUmVuYW1lZCB0bworCWluc2lkZV9lbnRyeV9mdW5jKCkgYW5kIGxvZ2ljIGNoYW5nZWQgdG8gdXNlIHBlci1vYmpmaWxlIHNwZWNpZmljCisJZmllbGRzLgorCSogYmxvY2tmcmFtZS5jLCBidWlsZHN5bS5oLCBjb2ZmcmVhZC5jLCBkd2FyZnJlYWQuYywgbWlwc3JlYWQuYywKKwlzeW1maWxlLmMsIG1pcHMtdGRlcC5jIChzdGFydHVwX2ZpbGVfc3RhcnQsIHN0YXJ0dXBfZmlsZV9lbmQpOgorCVJlbW92ZSBleHRlcm4gZGVjbHMuCisJKiBzeW1maWxlLmMsIHN5bWZpbGUuaCAoZW50cnlfcG9pbnQpOiAgUmVtb3ZlIGV4dGVybiBkZWNsLgkKKwkqIGNvZmZyZWFkLmMgKGNvZmZfc3ltZmlsZV9pbml0KTogIENvbW1vbiBlbnRyeSBwb2ludCBpbml0IGNvZGUKKwltb3ZlZCB0byBzeW1maWxlcy5jLCBjYWxsIGluaXRfZW50cnlfcG9pbnRfaW5mbygpLgorCSogY29mZnJlYWQuYyAoY29tcGxldGVfc3ltdGFiKTogIFVzZSBuZXcgcGVyLW9iamZpbGUgZW50cnkgaW5mby4KKwkqIG1pcC10ZGVwLmMgKG1pcHNfZnJhbWVfY2hhaW4pOiAgVXNlIG5ldyBwZXItb2JqZmlsZSBlbnRyeSBpbmZvLgorCSogbWlwc3JlYWQuYyAocGFyc2VfcGFydGlhbF9zeW1ib2xzKTogIFVzZSBuZXcgcGVyLW9iamZpbGUgZW50cnkKKwlpbmZvLgorCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIpOiAgVXNlIG5ldyBwZXItb2JqZmlsZSBlbnRyeSBpbmZvLgorCSogZGVmcy5oIChpbnNpZGVfZW50cnlfc2NvcGUsIG91dHNpZGVfc3RhcnR1cF9maWxlLAorCWluc2lkZV9tYWluX3Njb3BlKTogIFByb3RvdHlwZXMgY2hhbmdlZCBmb3IgcmVuYW1lcyB0bworCWluc2lkZV9lbnRyeV9mdW5jLCBpbnNpZGVfZW50cnlfZmlsZSwgaW5zaWRlX21haW5fZnVuYywKKwlyZXNwZWN0aXZlbHkuCisJKiBzeW1maWxlLmMgKHN5bXNfZnJvbV9vYmpmaWxlKTogIENvbW1vbiBlbnRyeSBwb2ludCBpbml0IGNvZGUKKwltb3ZlZCB0byBpbml0X2VudHJ5X3BvaW50X2luZm8oKSBhbmQgY2FsbCBpbml0X2VudHJ5X3BvaW50X2luZm8oKS4KKwkqIHN5bWZpbGUuaCAoaW5pdF9lbnRyeV9wb2ludF9pbmZvKTogIEluY2x1ZGUgcHJvdG90eXBlLgorCSogeGNvZmZyZWFkLmMgKGFpeGNvZmZfc3ltZmlsZV9pbml0KTogIENvbW1vbiBlbnRyeSBwb2ludCBpbml0IGNvZGUKKwltb3ZlZCB0byBzeW1maWxlcy5jIGFuZCBjYWxsIGluaXRfZW50cnlfcG9pbnRfaW5mbygpLgorCSogZHdhcmZyZWFkLmMgKGVudHJ5X3Njb3BlX2xvd3BjLCBlbnRyeV9zY29wZV9oaWdocGMsCisJbWFpbl9zY29wZV9sb3dwYywgbWFpbl9zY29wZV9oaWdocGMpOiAgUmVtb3ZlIGV4dGVybiBkZWNscy4KKwkqIGR3YXJmcmVhZC5jIChyZWFkX2Z1bmNfc2NvcGUsIHJlYWRfZmlsZV9zY29wZSk6ICBVc2UgbmV3IHBlci0KKwlvYmpmaWxlIGVudHJ5IGluZm8uCisJKiBmcmFtZS5oIChGUkFNRV9DSEFJTl9WQUxJRCk6ICBQcm92aWRlIGRlZmF1bHQgZGVmaW5pdGlvbiB0aGF0CisJd29ya3MgZm9yIHRoZSBtYWpvcml0eSBvZiB0YXJnZXRzLgorCSogdG0tNjhrLmgsIHRtLWNvbnZleC5oLCB0bS1oODMwMC5oLCB0bS1pMzg2di5oLCB0bS1pcml4My5oLAorCXRtLW1lcmxpbi5oLCB0bS1taXBzLmgsIHRtLXB5ci5oLCB0bS1yczYwMDAuaCwgdG0tc3BhcmMuaCwKKwl0bS1zdW4zODYuaCwgdG0tdGFob2UuaCwgdG0tdW1heC5oLCB0bS12YXguaCAoRlJBTUVfQ0hBSU5fVkFMSUQpOgorCVVzZSBkZWZhdWx0IGRlZmluaXRpb24gaW4gZnJhbWUuaC4KKwkqIGZyYW1lLmggKHNlbGVjdGVkX2ZyYW1lX2xldmVsKTogIE1ha2UgZGVjbCBleHRlcm4uCisJKiBvYmpmaWxlcy5jLCBzeW1maWxlLmMgKGN1cnJlbnRfb2JqZmlsZSk6ICBNb3ZlZCB0byBvYmpmaWxlcy5jCisJKiBvYmpmaWxlcy5jLCBzeW1maWxlLmMgKHN5bWZpbGVfb2JqZmlsZSk6ICBNb3ZlZCB0byBvYmpmaWxlcy5jCisJKiBwYXJ0aWFsLXN0YWIuaDogIFVzZSBuZXcgcGVyLW9iamZpbGUgZW50cnkgaW5mby4KKwkqIHN5bWZpbGUuaCAoc3RydWN0IG9iamZpbGUpOiAgUmVtb3ZlZCwgbW92ZWQgdG8gb2JqZmlsZXMuaC4KKwkqIHN5bWZpbGUuaCwgb2JqZmlsZXMuaCAoYWxsb2NhdGVfb2JqZmlsZSwgZnJlZV9vYmpmaWxlLAorCWZyZWVfYWxsX29iamZpbGVzLCBpdGVyYXRlX292ZXJfb2JqZmlsZXMsIGl0ZXJhdGVfb3Zlcl9zeW10YWJzLAorCWl0ZXJhdGVfb3Zlcl9wc3ltdGFicywgaGF2ZV9wYXJ0aWFsX3N5bWJvbHMsIGhhdmVfZnVsbF9zeW1ib2xzLAorCWhhdmVfbWluaW1hbF9zeW1ib2xzKTogIFByb3RvdHlwZXMgbW92ZWQgdG8gb2JqZmlsZXMuaC4KKwkqIHN5bWZpbGUuaCwgb2JqZmlsZXMuaCAoQUxMX09CSkZJTEVTLCBBTExfT0JKRklMRVNfU0FGRSk6CisJTWFjcm9zIG1vdmVkIHRvIG9iamZpbGVzLmguCisJKiB0bS1oODMwMC5oLCB0bS1pMzg2djQuaCAoRlJBTUVfQ0hBSU5fVkFMSURfQUxURVJOQVRFKTogRGVmaW5lLgorCitUaHUgTWFyIDE5IDE4OjQ5OjQ1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJTW9yZSBDKysgaW1wcm92ZW1lbnRzIChwb2ludGVycyB0byBtZW1iZXJzLCBxdWFsaWZpZWQgbmFtZXMpLgorCSogYy1leHAueTogIFN1cHBvcnQgZXhwLnR5cGU6Om5hbWUgYW5kIGV4cC0+dHlwZTo6bmFtZQorCXN5bnRheGVzLiAgKFVuZm9ydHVuYXRlbHksIGRvZXNuJ3Qgd29yayBmb3Igc3RhdGljIG1lbWJlcnMuKQorCSogYy1leHAueSwgZXZhbC5jOiAgIE1ha2UgdHlwZTo6fnR5cGUgd29yayBiZXR0ZXIuCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cDogT1BfU0NPUEUpOiAgUmVwbGFjZSB1c2Ugb2YKKwl2YWx1ZV9zdGF0aWNfZmllbGQgYnkgdmFsdWVfc3RydWN0X2VsdF9mb3JfcmVmZXJlbmNlLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiAgTWVyZ2UgY29kZSBmb3IgU1RSVUNUT1BfTUVNQkVSCisJYW5kIFNUUlVDVE9QX01QVFI7IGNhc3QgYXJnMSB0byBkb21haW4tdHlwZSBvZiBhcmcyLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiAgUmVtb3ZlIHNwZWNpYWwgY2FzZSBmb3IgVU5PUF9BRERSCisJZm9yIE9QX1NDT1BFIG9wZXJhbmQ7IG5vIHBvaW50IGluIGl0IG5vdyB0aGF0IHdlIHVzZSBsYXp5CisJcmVhZGluZyBvZiB2YWx1ZXMsIGFuZCB1c2UgInJlZmVyZW5jZSB0byBtZW1iZXIiIG9iamVjdHMuCisJKiBnZGJ0eXBlcy5oOiAgQ2xhcmlmeSBjb21tZW50LgorCSogdmFsb3BzLmM6ICBDaGFuZ2UgdmFsdWVfc3RydWN0X2VsdF9mb3JfYWRkcmVzcyB0byByZXR1cm4KKwlhIHJlZmVyZW5jZSAob3IgdmFyaWFibGUpLCByYXRoZXIgdGhhbiBhIHBvaW50ZXIuICBDaGFuZ2UKKwl0aGUgbmFtZSB0byB2YWx1ZV9zdHJ1Y3RfZWx0X2Zvcl9yZWZlcmVuY2UgdG8gcmVmbGVjdCB0aGlzLgorCVJldHVybmluZyBhIHJlZmVyZW5jZSBpbnN0ZWFkIG9mIGEgYWRkcmVzcyBwcm92aWRlcyBhCisJZ2VuZXJhbGl6YXRpb24sIHNpbmNlIHdlIGNhbiB1c2UgdGhlIHJvdXRpbmUgZm9yIGJvdGgKKwljbGFzczo6bmFtZSBhcyB3ZWxsIGFzICZjbGFzczo6bmFtZS4KKwlBbHNvLCByZWN1cnNlIHRvIGhhbmRsZSBtdWx0aXBsZSBpbmhlcml0YW5jZSBwcm9wZXJseS4KKwkqIHZhbHByaW50LmM6ICBNb3ZlZCBjb2RlIHRvIHByaW50IHBvaW50ZXItdG8tbWVtYmVycworCXRvIG5ldyBmdW5jdGlvbiBwb2ludF9jbGFzc19tZW1iZXIuICBUaGlzIGFsbG93cyBhCisJInJlZmVyZW5jZS10by1tZW1iZXIiIHRvIGJlIHByaW50ZWQgdXNpbmcgdGhlIHNhbWUgY29kZS4KKwkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfdmFyc3BlY19wcmVmaXgpOiAgQXZvaWQgcHJpbnRpbmcKKwkic3RydWN0ICIgZm9yIGRvbWFpbnMgb2YgY2xhc3MtbWVtYmVyIHR5cGVzLgorCSogdmFsb3BzLmMgKHNlYXJjaF9zdHJ1Y3RfZmllbGQpOiAgSW5saW5lIGNvZGUgZm9yIHNpbXBsaWZpZWQKKwl2ZXJzaW9uIG9mIHZhbHVlX3N0YXRpY19maWVsZCAod2hpY2ggY2FuIHRoZW4gYmUgZGVsZXRlZCkuCisJKiB2YWx1ZS5oOiAgUmVuYW1lIHZhbHVlX3N0cnVjdF9lbHRfZm9yX2FkZHJlc3MgdG8KKwl2YWx1ZV9zdHJ1Y3RfZWx0X2Zvcl9yZWZlcmVuY2UuICBEZWxldGUgdmFsdWVfc3RhdGljX2ZpZWxkLgorCSogdmFsdWVzLmM6ICBSZW1vdmUgbm8gbG9uZ2VyIHVzZWQgZnVuY3Rpb24gdmFsdWVfc3RhdGljX2ZpZWxkLgorCitUaHUgTWFyIDE5IDEzOjU0OjExIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb2ZmcmVhZC5jLCBtaXBzcmVhZC5jLCB4Y29mZnJlYWQuYywgY29mZnJlYWQuYywgZGJ4cmVhZC5jLAorCWVsZnJlYWQuYyAoY29mZl9zeW1maWxlX2ZpbmlzaCk6ICBBZGQgZnVuY3Rpb24sIHByb3RvdHlwZSwgYW5kCisJYWRkIHRvIHRoZSB4eHh4X3N5bV9mbnMgc3RydWN0IGZvciBlYWNoIGZpbGUgdHlwZS4gIEFsc28gcmVmb3JtYXQKKwl0aGUgeHh4eF9zeW1fZm5zIHZlY3RvciB0byBhIHN0YW5kYXJkIGZvcm1hdCBhbmQgYWRkIGNvbW1lbnRzLgorCSogY29mZnJlYWQuYywgbWlwc3JlYWQuYywgeGNvZmZyZWFkLmMsIGNvZmZyZWFkLmMsIGRieHJlYWQuYywKKwllbGZyZWFkLmMgKHh4eF9zeW1maWxlX25ld19pbml0LCB4eHhfc3ltZmlsZV9pbml0LCB4eHhfc3ltZmlsZV9yZWFkKTogIAorCVBhc3MgcG9pbnRlciB0byBzdHJ1Y3Qgb2JqZmlsZSByYXRoZXIgdGhhbiBwb2ludGVyIHRvIHN5bV9mbnMuCisJQ2hhbmdlIHJlZmVyZW5jZXMgaW5zaWRlIGVhY2ggZnVuY3Rpb24gYWNjb3JkaW5nbHkuICBBbGxvY2F0ZSBhbnkKKwlzeW1ib2wgZmlsZSBzcGVjaWZpYyBpbmZvIGluIHRoZSBwZXItb2JqZmlsZSBtZW1vcnkgcmVnaW9uLgorCSogZGJ4cmVhZC5jIChmcmVlX2FuZF9pbml0X2hlYWRlcl9maWxlcyk6ICBCcmVhayBmdW5jdGlvbiBpbnRvCisJZnJlZV9oZWFkZXJfZmlsZXMoKSwgY2FsbGVkIGZyb20gZGJ4X3N5bWZpbGVfZmluaXNoKCksIGFuZAorCWluaXRfaGVhZGVyX2ZpbGVzKCksIGNhbGxlZCBmcm9tIGRieF9uZXdfaW5pdCgpLgorCSogZGJ4cmVhZC5jIChkYnhfbmV3X2luaXQpOiAgTW92ZSBkZWFsbG9jYXRpb24gdGhpbmdzIHRvIG5ldworCWRieF9zeW1maWxlX2ZpbmlzaCBmdW5jdGlvbi4KKwkqIGVsZnJlYWQuYyAoZWxmX25ld19pbml0KTogIENhbGwgYnVpbGRzeW1fbmV3X2luaXQoKS4KKwkqIG9iamZpbGVzLmMgKGZyZWVfb2JqZmlsZSk6IENhbGwgdGhlIGFwcHJvcHJpYXRlIHN5bWZpbGVfZmluaXNoKCkKKwlyb3V0aW5lIGZvciB0aGUgb2JqZmlsZSBiZWZvcmUgZGVhbGxvY2F0aW5nIG90aGVyIHN0dWZmLgorCSogc3BhcmMtdGRlcC5jIChnZXRfbG9uZ2ptcF90YXJnZXQpOiAgQ2FzdCB0YXJnZXRfcmVhZF9tZW1vcnkgYXJnLgorCSogc3ltZmlsZS5oOiAgTW92ZSBzdHJ1Y3Qgc3ltX2ZucyB0byBiZWZvcmUgc3RydWN0IG9iamZpbGUgZGVmLgorCUFkZCBzeW1fZmluaXNoIGZ1bmN0aW9uIHBvaW50ZXIgYW5kIGNoYW5nZSBwcm90b3R5cGVzIG9mIG90aGVyCisJZnVuY3Rpb24gcG9pbnRlcnMgdG8gcmVmbGVjdCBwYXNzaW5nIHN0cnVjdCBvYmpmaWxlIHBvaW50ZXIgcmF0aGVyCisJdGhhbiBzdHJ1Y3Qgc3ltX2ZucyBwb2ludGVyLgorCSogc3ltZmlsZS5jOiAgUmVtb3ZlIG5vdyBvYnNvbGV0ZSBzeW10YWJfZm5zIHBvaW50ZXIuCisJKiBzeW1maWxlLmMgKHN5bWZpbGVfaW5pdCk6ICBSZW5hbWVkIHRvIGZpbmRfc3ltX2ZucywgYW5kIG5vdyBvbmx5CisJbG9jYXRlcyB0aGUgY29ycmVjdCBzeW1fZm5zIHN0cnVjdCBmb3IgdGhlIGdpdmVuIG9iamZpbGUuCisJKiBzeW1maWxlLmMgKHN5bXNfZnJvbV9vYmpmaWxlLCBzeW1ib2xfZmlsZV9hZGQpOiAgUmVzdHJ1Y3R1cmVkCisJZm9yIGJldHRlciBzdXBwb3J0IG9mIG1hcHBlZCBzeW1ib2wgdGFibGVzLgorCSogc3ltZmlsZS5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogIFJlbW92ZSBvYnNvbGV0ZSBjb2RlIHVzaW5nCisJc3ltZmlsZV9mbnMuCisJKiBzeW1maWxlLmg6ICBSZW1vdmUgZHVwbGljYXRlIGRlY2xhcmF0aW9ucyBmb3Igc3ltZmlsZV9vYmpmaWxlLAorCWVudHJ5X3BvaW50LCBhbmQgb2JqZWN0X2ZpbGVzLgorCSogdGFyZ2V0LmMgKHRhcmdldF9pbmZvKTogIENvbXBhcmUgc3ltZmlsZV9vYmpmaWxlIHRvIE5VTEwuCisJKiB4Y29mZnJlYWQuYyAoYWl4Y29mZl9uZXdfaW5pdCk6ICBNb3ZlIGRlYWxsb2NhdGlvbiBzdHVmZiB0bworCWFpeGNvZmZfc3ltZmlsZV9maW5pc2goKS4KKworV2VkIE1hciAxOCAxODoyMjo0NiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogaW5mcnVuLmMgKElOX1NPTElCX1RSQU1QT0xJTkUpOiAgQWRkIGRlZmF1bHQgZGVmaW5pdGlvbi4KKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBVc2UgSU5fU09MSUJfVFJBTVBPTElORS4KKwkqIHRtLXN5c3Y0LmggKElOX1NPTElCX1RSQU1QT0xJTkUpOiBBZGQgU1ZSNCBkZWZpbml0aW9uLgorCitXZWQgTWFyIDE4IDE1OjUxOjE1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJU29tZSBpbXByb3ZlbWVudHMgdG8gZysrIGRlYnVnZ2luZy4KKwkqIHN5bXRhYi5jIChsaXN0X3N5bWJvbHMpOiBkZW1hbmdsZSBiZWZvcmUgcGF0dGVybiBtYXRjaGluZy4KKwkqIHN5bXRhYi5jOiAgT3RoZXIgZml4ZXMgdG8gaW1wcm92ZSBoYW5kaW5nIG9mIG9wZXJhdG9ycy4KKwkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfYmFzZSk6ICBGaXggdGVzdCBmb3IgY29uc3RydWN0b3IuCisJKiB2YWx1ZXMuYyAodmFsdWVfc3RhdGljX2ZpZWxkKTogIEFsbG93IGV2YWx1YXRpb24gb2YKKwlDTEFTUzo6TUVUSE9ELCByZXR1cm5pbmcgYSBmdW5jdGlvbiBwb2ludGVyLgorCitXZWQgTWFyIDE4IDA4OjM5OjUyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICBSb2xsICA0LjQuNi4KKwkqIGV4ZWMuYyAoZXhlY19maWxlX2NvbW1hbmQpOiAgQWRkIGNvZGUgdG8gaWdub3JlIG9wdGlvbmFsIGFyZ3MKKwlwYXNzZWQgaW4gYnkgZmlsZV9jb21tYW5kKCkgZm9yIHVzZSBpbiBzeW1ib2xfZmlsZV9jb21tYW5kKCkuCisJKiBtYWluLmMgKG1haW4pOiAgRG9jdW1lbnQgLW1hcHBlZCBhbmQgLXJlYWRub3cgaW4gaGVscCBzdW1tYXJ5LgorCSogb2JqZmlsZXMuYyAob3Blbl9tYXBwZWRfZmlsZSk6ICBDb3NtZXRpYyBjaGFuZ2UsIGFyZyByZW5hbWVkLgorCSogb2JqZmlsZXMuYyAoYWxsb2NhdGVfb2JqZmlsZSk6ICBGaWxlbmFtZSBhcmcgcmVtb3ZlZC4gIENoYW5nZXMKKwl0byBnZXQgZmlsZW5hbWUgZnJvbSBiZmQgd2l0aCBiZmRfZ2V0X2ZpbGVuYW1lKCkuICBUZXN0IG1hcHRvCisJYWdhaW5zdCAwLCBub3QgTlVMTC4gIFVzZSBtc3Ryc2F2ZSgpIHRvIG1ha2UgY29weSBvZiBmaWxlbmFtZS4KKwkqIHJlbW90ZS1tbS5jIChtbV9sb2FkKTogIFN5bWJvbF9maWxlX2FkZCgpIHRha2VzIGFuIGFkZGl0aW9uYWwKKwlhcmcuCisJKiByZW1vdGUtdnguYyAodnhfbG9hZF9jb21tYW5kLCBhZGRfc3ltYm9sX3N0dWIpOgorCVN5bWJvbF9maWxlX2FkZCgpIHRha2VzIGFuIGFkZGl0aW9uYWwgYXJnLgorCSogc29saWIuYyAoc3ltYm9sX2FkZF9zdHViKTogIFN5bWJvbF9maWxlX2FkZCgpIHRha2VzIGFuCisJYWRkaXRpb25hbCBhcmcuCisJKiBzeW1maWxlLmMgKHN5bWZpbGVfb3Blbik6ICBSZW5hbWVkIHRvIHN5bWZpbGVfYmZkX29wZW4gYW5kCisJY2hhbmdlZCB0byByZXR1cm4gYSBiZmQgbm90IGFuIG9iamZpbGUgcG9pbnRlci4KKwkqIHN5bWZpbGUuYyAoc3ltc19mcm9tX29iamZpbGUpOiBFbGltaW5hdGUgbG9jYWwgY29weSBvZiBiZmQuCisJKiBzeW1maWxlLmMgKHN5bWJvbF9maWxlX2FkZCk6ICBUYWtlcyBhbiBhZGRpdGlvbmFsIGFyZyAocmVhZG5vdykuCisJQ2hhbmdlIHRvIGVsaW1pbmF0ZSBsb2NhbCBiZmQgYW5kIHVzZSBzeW1maWxlX2JmZF9vcGVuKCkgcGx1cworCWFsbG9jYXRlX29iamZpbGUoKS4gIEFkZCBjb2RlIHRvIGltcGxlbWVudCByZWFkbm93IG9wdGlvbi4KKwkqIHN5bWZpbGUuYyAoc3ltYm9sX2ZpbGVfY29tbWFuZCk6IENoYW5nZXMgdG8gb3B0aW9uIGhhbmRsaW5nLAorCXJlYWRub3cgZnVuY3Rpb25hbGl0eSBtb3ZlZCB0byBzeW1ib2xfZmlsZV9hZGQoKS4KKwkqIHN5bWZpbGUuYyAoc3ltZmlsZV9pbml0KTogIEVsaW1pbmF0ZSBsb2NhbCBjb3B5IG9mIGJmZC4KKwkqIHN5bWZpbGUuYyAoYWRkX3N5bWJvbF9maWxlX2NvbW1hbmQpOiAgQ2hhbmdlcyB0byBwYXJzZSBtYXBwZWQKKwlhbmQgcmVhZG5vdyBvcHRpb25zLgorCSogc3ltZmlsZS5oIChhbGxvY2F0ZV9vYmpmaWxlKTogIEFyZyByZW1vdmVkIGZyb20gcHJvdG90eXBlLgorCSogc3ltdGFiLmggKHN5bWJvbF9maWxlX2FkZCk6ICBBcmcgYWRkZWQgdG8gcHJvdG90eXBlLgorCSogeGNvZmZleGVjLmMgKG1hcF92bWFwKTogIEFsbG9jYXRlX29iamZpbGUoKSB0YWtlcyBhbiBhZGRpdGlvbmFsCisJYXJnLgorCitTYXQgTWFyIDE0IDE2OjM4OjQ3IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBnbWFsbG9jLmMsIGdtYWxsb2MuaCBtY2hlY2suYyBtbWFwLWFsbG9jLmMgbW1hcC1zYnJrLmMgbXRyYWNlLmMsCisJbXRyYWNlLmF3aywgc3RhdGUuYywgc3RhdGUuaDogIFJlbW92ZWQuCisJKiAuZ2RiaW5pdDogQWRkIC4uL21hbGxvYywgLi4vbGliaWJlcnR5LCBhbmQgLi4vYmZkIHRvIGxpc3Qgb2YKKwlkaXJlY3RvcmllcyBzZWFyY2hlZCBmb3Igc291cmNlIGZpbGVzLgorCSogTWFrZWZpbGUuaW4gKEdOVV9NQUxMT0MsIE1BTExPQ19DRkxBR1MsIE1BTExPQ1NSQyk6IFJlbW92ZWQKKwkqIE1ha2VmaWxlLmluIChNTUFMTE9DX0RJUiwgTU1BTExPQ19ERVAsIE1NQUxMT0NfTElCLAorCU1NQUxMT0NfRElTQUJMRSwgTU1BTExPQ19DSEVDSywgTU1BTExPQ19DRkxBR1MpOiBBZGQKKwkqIE1ha2VmaWxlLmluIChDRkxBR1MpOiAgUmVwbGFjZSBNQUxMT0NfQ0ZMQUdTIHdpdGggTU1BTExPQ19DRkxBR1MuCisJKiBNYWtlZmlsZS5pbiAoQ0xJQlMsIENERVBTKTogIEFkZCBNTUFMTE9DX0xJQgorCSogTWFrZWZpbGUuaW4gKEFERF9GSUxFUywgQUREX0RFUFMpOiAgUmVtb3ZlIEdOVV9NQUxMT0MuCisJKiBNYWtlZmlsZS5pbiAoU0ZJTEVTX01BSU5ESVIpOiBSZW1vdmUgc3RhdC5jIG1tYXAtYWxsb2MuYywgbW1hcC0KKwlzYnJrLmMKKwkqIE1ha2VmaWxlLmluIChIRklMRVMpOiBSZW1vdmUgc3RhdGUuaAorCSogTWFrZWZpbGUuaW4gKFBPU1NMSUJTX01BSU5ESVIpOiBSZW1vdmUgTUFMTE9DU1JDLgorCSogTWFrZWZpbGUuaW4gKE9CUyk6IFJlbW92ZSBzdGF0ZS5vIG1tYXAtYWxsb2MubyBtbWFwLXNicmsubworCSogTWFrZWZpbGUuaW4gKHNhYmVyX2dkYik6IFJlbW92ZSBtY2hlY2ssIG10cmFjZS4gIEFkZCBNTUFMTE9DX0RJUi4KKwkqIE1ha2VmaWxlLmluIChjbGVhbik6IFJlbW92ZSBhbGwgb2JqZWN0IGZpbGVzLgorCSogYy1leHAueTogIERlZmluZSBtYWxsb2MgdG8geG1hbGxvYyBhbmQgcmVhbGxvYyB0byB4cmVhbGxvYy4KKwkqIGNwbHVzLWRlbS5jOiBSZW1vdmUgcHJvdG90eXBlcyBkZWZpbml0aW9ucyB0aGF0IGFyZSBub3cgZG9uZSBpbgorCWRlZi5oLgorCSogZGJ4cmVhZC5jICh0aHJvdWdob3V0KTogIENoYW5nZSBmcm9tIHVzaW5nIHBlci1vYmpmaWxlCisJeG1hbGxvYy94cmVhbGxvYy9mcmVlIGZ1bmN0aW9ucyB0byB4bW1hbGxvYy94bXJlYWxsb2MvbWZyZWUuCisJKiBkZWZzLmg6IFJlbW92ZSBwcm90b3R5cGVzIGZvciBtbWFwXyogZnVuY3Rpb25zLiAgQWRkIHByb3RvdHlwZXMKKwlmb3IgeG1tYWxsb2MsIHhtcmVhbGxvYywgbWZyZWUsIG1tY2hlY2ssIG1tdHJhY2UsIG1tYWxsb2NfYXR0YWNoLCAKKwltbWFsbG9jX2RldGFjaCwgbW1hbGxvY19zZXRrZXksIG1zYXZlc3RyaW5nLCBhbmQgbXN0cnNhdmUsIG5vbWVtLgorCSogZGVwZW5kOiAgUmVtb3ZlIGRlcGVuZGVuY2llcyBmb3Igc3RhdGUubywgc3RhdGUuaC4KKwkqIGR3YXJmcmVhZC5jOiBBZGQgZGVjbGFyYXRpb24gZm9yIHdhcm5pbmdfcHJlX3ByaW50LgorCSogZHdhcmZyZWFkLmMgKGR3YXJmd2Fybik6ICBVc2Ugd2FybmluZ19wcmVfcHJpbnQuCisJKiBkd2FyZnJlYWQuYyAodGhyb3VnaG91dCk6ICBDaGFuZ2UgZnJvbSB1c2luZyBwZXItb2JqZmlsZQorCXhtYWxsb2MveHJlYWxsb2MvZnJlZSBmdW5jdGlvbnMgdG8geG1tYWxsb2MveG1yZWFsbG9jL21mcmVlLgorCSogZ2RidHlwZXMuYyAobG9va3VwX2Z1bmRhbWVudGFsX3R5cGUpOiAgRml4IGluaXRfdHlwZSBjYWxscyB0bworCXVzZSBzdXBwbGllZCBvYmpmaWxlLgorCSogaTM4Ni14ZGVwLmMgKHByaW50XzM4N19zdGF0dXMpOiBDaGFuZ2UgdG8gdXNlIHdhcm5pbmcoKSByYXRoZXIKKwl0aGFuIHByaW50ZnMuCisJKiBpMzg3LXRkZXAuYyAocHJpbnRfMzg3X2NvbnRyb2xfd29yZCk6ICBDaGFuZ2UgdG8gdXNlIHdhcm5pbmcoKQorCXJhdGhlciB0aGFuIHByaW50ZnMuCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiAgUmVtb3ZlIHVucmVhY2hhYmxlIGFib3J0KCkgY2FsbAorCXRoYXQgc29tZSBjb21waWxlcnMgZ3J1bWJsZSBhYm91dC4JCQorCSogbGFuZ3VhZ2UuYyAodGhyb3VnaG91dCk6ICBBZGQgZGVjbGFyYXRpb24gZm9yIHdhcm5pbmdfcHJlX3ByaW50CisJYW5kIHVzaW5nIHdhcm5pbmcoKSBpbnN0ZWFkIG9mIHByaW50ZnMuCisJKiBtMi1leHAueTogIERlZmluZSBtYWxsb2MgdG8geG1hbGxvYyBhbmQgcmVhbGxvYyB0byB4cmVhbGxvYy4KKwkqIG1haW4uYyAobWFpbik6ICBBZGQgZGVjbGFyYXRpb24gZm9yIHdhcm5pbmdfcHJlX3ByaW50IGFuZCBzZXQgaXQKKwlzaW1pbGFybHkgdG8gZXJyb3JfcHJlX3ByaW50LiAgQWRkIGRlY2xhcmF0aW9ucyBmb3IKKwltYXBwZWRfc3ltYm9sX2ZpbGVzIGFuZCByZWFkbm93X3N5bWJvbF9maWxlcy4gIEFkZCBhcHByb3ByaWF0ZQorCWRlZmluaXRpb25zIHRvIGxvbmdfb3B0aW9uc1tdLgorCSogbWluc3ltcy5jOiAgVHJpdmlhbCBmaXggdG8gY29tbWVudC4KKwkqIG9iamZpbGVzLmMgKGFsbG9jYXRlX29iamZpbGUpOiAgU3Vic3RhbnRpYWxseSByZXdyaXR0ZW4gZm9yCisJdXNpbmcgbWFwcGVkIHN5bWJvbCBmaWxlcy4KKwkqIG9iamZpbGVzLmMgKHRocm91Z2hvdXQpOiAgQ2hhbmdlIGZyb20gdXNpbmcgcGVyLW9iamZpbGUKKwl4bWFsbG9jL3hyZWFsbG9jL2ZyZWUgZnVuY3Rpb25zIHRvIHhtbWFsbG9jL3htcmVhbGxvYy9tZnJlZS4KKwkqIG9iamZpbGVzLmMgKG9wZW5fbWFwcGVkX2ZpbGUsIG1hcHBlZF90b19hZGRyZXNzKTogIEFkZCBmdW5jdGlvbnMuCisJKiBzb3VyY2UuYyAodGhyb3VnaG91dCk6ICBDaGFuZ2UgZnJvbSB1c2luZyBwZXItb2JqZmlsZQorCXhtYWxsb2MveHJlYWxsb2MvZnJlZSBmdW5jdGlvbnMgdG8geG1tYWxsb2MveG1yZWFsbG9jL21mcmVlLgorCSogc291cmNlLmMgKG9wZW5fc291cmNlX2ZpbGUpOiAgVXNlIG1zdHJzYXZlIHRvIHNhdmUgZmlsZSBuYW1lIGluCisJbWFwcGVkIHN5bWJvbCByZWdpb24gZm9yIG9iamZpbGUuCisJKiBzeW1maWxlLmM6ICBSZW1vdmUgaW5jbHVkZSBmb3Igc3RhdGUuaC4KKwlpbmNsdWRlIHRvIGxvY2FsIGZvcm0uCisJKiBzeW1maWxlLmMgKHN5bWJvbF9maWxlX2FkZF9kaWdlc3RlZCk6ICBSZW1vdmUuCisJKiBzeW1maWxlLmMgKHN5bWJvbF9maWxlX2FkZCk6ICBTdWJzdGFudGlhbGx5IHJld3JpdHRlbiBmb3IgbWFwcGVkCisJc3ltYm9sIGZpbGVzLgorCSogc3ltZmlsZS5oOiAgUmVtb3ZlIG1hbGxvYy94cmVhbGxvYy94bWFsbG9jL3hyZWFsbG9jL2ZyZWUgbWVtYmVycworCWZyb20gb2JqZmlsZSBzdHJ1Y3R1cmUuICBBZGQgbWFsbG9jIGRlc2NyaXB0b3IgcG9pbnRlciAobWQpLgorCSogc3ltZmlsZS5oIChPQkpGX0RVTVBBQkxFKTogIENoYW5nZWQgbmFtZSB0byBPQkpGX01BUFBFRC4KKwkqIHN5bW0teGRlcC5jIChwcmludF9mcHVfc3RhdHVzKTogIFVzZSB3YXJuaW5nKCkgcmF0aGVyIHRoYW4KKwlwcmludGZzLgorCSogc3ltbWlzYy5jIChmcmVlX3N5bXRhYl9ibG9jayk6ICBOb3cgdGFrZXMgYW5kIHVzZXMgY3VycmVudAorCW9iamZpbGUgcG9pbnRlci4KKwkqIHN5bW1pc2MuYyAodGhyb3VnaG91dCk6ICBDaGFuZ2UgZnJvbSB1c2luZyBwZXItb2JqZmlsZQorCXhtYWxsb2MveHJlYWxsb2MvZnJlZSBmdW5jdGlvbnMgdG8geG1tYWxsb2MveG1yZWFsbG9jL21mcmVlLgorCSogc3ltdGFiLmMgKGNwbHVzX21hbmdsZWRfc3ltYm9sKTogIENhc3QgcmV0dXJuIHZhbHVlIHRvIGF2b2lkCisJU3VuIGNvbXBpbGVyIGdydW1ibGluZ3Mgd2hlbiBQVFIgaXMgY2hhciAqLgorCSogc3ltdGFiLmMgKGxvb2t1cF9zeW1ib2wpOiAgQ2FzdCByZXR1cm4gdmFsdWUgb2YgaXRlcmF0ZV9vdmVyXworCW1zeW1ib2xzKCkgdG8gY29ycmVjdCBwb2ludGVyIHR5cGUuCisJKiB1dGlscy5jICh3YXJuaW5nX3ByZV9wcmludCk6ICBJbml0aWFsaXplIHRvICJcbndhcm5pbmc6ICIuCisJKiB1dGlscy5jIChmYXRhbCwgZmF0YWxfZHVtcF9jb3JlKTogIEVuc3VyZSB0aGF0IHRoZSBmYXRhbAorCWVycm9yIGFsd2F5cyBzdGFydHMgb24gYSBsaW5lIG9mIGl0J3Mgb3duLgorCSogdXRpbHMuYyAoaW5pdF9tYWxsb2MsIG1hbGxvY19ib3RjaCwgeG1hbGxvYywgeHJlYWxsb2MpOgorCVJld3JpdGUgZm9yIG5ldyBtYXBwZWQgbWFsbG9jIHBhY2thZ2UgdXNlLgorCSogdXRpbHMuYyAobW1hbGxvYywgbXJlYWxsb2MsIG1mcmVlKTogIFN0dWJzIGZvciBjb25maWd1cmF0aW9ucworCXRoYXQgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIG1hcHBlZCBtYWxsb2MgcGFja2FnZTsgcGFzcyBhcmd1bWVudHMKKwlvbiB0byB0cmFkaXRpb25hbCBtYWxsb2MgcGFja2FnZSBmdW5jdGlvbnMuCisJKiB1dGlscy5jIChub21lbSk6ICBBZGQgZm9yIGZhdGFsIHZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCBhYm9ydHMuCisJKiB1dGlscy5jICh4bW1hbGxvYywgeG1yZWFsbG9jLCB4bWFsbG9jLCB4cmVhbGxvYyk6ICBMaWtlIG1tYWxsb2MsCisJbXJlYWxsb2MsIG1hbGxvYywgYW5kIHJlYWxsb2MgYnV0IGdldCBmYXRhbCBlcnJvciBpZiBydW5zIG91dAorCW9mIG1lbW9yeS4KKwkqIHV0aWxzLmMgKG1zYXZlc3RyaW5nLCBtc3Ryc2F2ZSk6ICBTYXZlIGEgc3RyaW5nIGluIGEgc3BlY2lmaWMKKwltYXBwZWQgbWFsbG9jIHJlZ2lvbi4KKwkqIHV0aWxzLmMgKHByaW50X3NwYWNlcyk6ICBVc2UgeG1hbGxvYyB0byBnZXQgdGhlIGJ1ZmZlci4KKwkqIHhtLWFtaXguaCwgeG0taTM4NnY0LmgsIHhtLXN1bjNvczQuaCwgeG0tc3VuNG9zNC5oOiAgQWRkIGRlZmluZXMKKwlmb3IgTU1BUF9CQVNFX0FERFJFU1MgYW5kIE1NQVBfSU5DUkVNRU5ULgorCSogY29uZmlnL2kzODZ2NC5taDogIEluc2lnbmlmaWNhbnQgcmVvcmdhbml6YXRpb24uCisKK1NhdCBNYXIgMTQgMTE6NDQ6NDcgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIHhjb2ZmcmVhZC5jOiAgT25seSBlbmFibGUgY29tcGlsYXRpb24gb2YgZGVidWdnaW5nIGZ1bmN0aW9ucworCWlmIElCTTYwMDAgaXMgZGVmaW5lZC4gIEZhaWxzIHRvIGNvbXBpbGUgb3RoZXJ3aXNlLgorCitGcmkgTWFyIDEzIDE1OjUxOjExIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogcGFzcyBNQUtFSU5GTyBkb3duIG9uIGluZm8uCisKK0ZyaSBNYXIgMTMgMTI6NTY6MzYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIG1pcHNyZWFkLmMgKG1pcHNjb2ZmX3N5bWZpbGVfcmVhZCk6ICBFbGltaW5hdGUgYSBsb3Qgb2YKKwl1c2VsZXNzIGNvZGUsIGluY2x1ZGluZyBhbiBsc2VlayB0byBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlLgorCVJlcG9ydGVkIGJ5IEppbSBXaWxsaWFtcyA8amltYm9Ad3JzLmNvbT4uCisKK1RodSBNYXIgMTIgMTE6NTY6NDYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwlNZXJnZWQgaW4gcGF0Y2hlcyBmcm9tIG1ldGluQGlibXBhLmF3ZHBhLmlibS5jb20gKE1ldGluIEcuCisJT3ppc2lrKSAoZGF0ZWQgRnJpLCA2IE1hciA5MiAxNzo1MSkgZm9yIHRoZSByczYwMDAuCisJKiBtaW5zeW1zLmMsIHN5bWZpbGUuYzogIENoYW5nZXMgdGhhdCBtYXkgYmUgZ2VuZXJhbGx5CisJYXBwbGljYWJsZSwgYnV0IGFyZSAjaWZkZWYgSUJNNjAwMCBmb3Igbm93LgorCSogcnM2MDAwLXhkZXAuYzogIEZpeGVkIHR5cG8gaW4gY29tbWVudC4KKwkqIHJzNjAwMC10ZGVwLmM6ICBOb24tc3Vic3RhdGlhbCBjaGFuZ2VzLgorCSogeG9mZnJlYWQuYzogIFRoZSBtYWluIGNoYW5nZSBoZXJlIGlzIGFkZGl0aW9uIG9mIHNvbWUKKwlkZWJ1Z2dpbmcgZnVuY3Rpb25zLgorCSogeG9mZmV4ZWMuYzogTW9yZSBjaGFuZ2VzLgorCisJKiB4Y29mZnJlYWQuYzogIEZpeGVkIHR3byB0b28tZmV3LXBhcmFtZXRlcnMgYnVncy4KKworCSogc29saWIuaCwgaW5mcnVuLmMsIHRtLXJzNjAwMC5oOiAgQWRkIGEgUElEIHBhcmFtZXRlcgorCXRvIFNPTElCX0NSRUFURV9JTkZFUklPUl9IT09LIG1hY3JvLgorCitTdW4gTWFyICA4IDIxOjE3OjQ4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBzeW1maWxlLmg6ICBBZGQgcHJvdG90eXBlIGZvciBpdGVyYXRlX292ZXJfbXN5bWJvbHMoKS4KKwkqIHN5bXRhYi5jIChjcGx1c19tYW5nbGVkX3N5bWJvbCk6ICBBZGQgZnVuY3Rpb24uCisJKiBzeW10YWIuYyAobG9va3VwX3N5bWJvbCk6ICBDYWxsIGNwbHVzX21hbmdsZWRfc3ltYm9sIHZpYQorCWl0ZXJhdGVfb3Zlcl9tc3ltYm9scyB0byBmaW5kIGRlbWFuZ2xlZCBDKysgc3ltYm9sLgorCSogeGNvZmZleGVjLmMgKHJlbG9jYXRlX21pbmltYWxfc3ltYm9sKTogUmV0dXJuIG1lYW5pbmdmdWwKKwl2YWx1ZSB0byBpdGVyYXRlX292ZXJfbXN5bWJvbHMoKS4KKwkqIHhjb2ZmZXhlYy5jICh2bWFwX3N5bXRhYik6ICBJZ25vcmUgcmV0dXJuIGZyb20gaXRlcmF0ZV9vdmVyXworCW1zeW1ib2xzKCkuCisKK0ZyaSBNYXIgIDYgMjE6NTk6MzQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGRlZCBjaGVjayB0YXJnZXQuCisKK1RodSBNYXIgIDUgMjM6NTY6MDEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGVjb2ZmLmM6ICBNb3ZlIHRvIC4uL2JmZC9jb2ZmLW1zeW0uYy4KKwkqIGNvbmZpZy9tdC0qbWlwczogIFJlbW92ZSBlY29mZi5vIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uCisJKiByZW1vdGUuYyAoKTogIEFkZCBuZXdsaW5lIHRvIGluaXRpYWwgKy4KKwkocmVtb3RlX3Jlc3VtZSk6ICBNZW50aW9uIGhvdyB0byBjb3BlIHdpdGggc2lnbmFscy4KKwkocmVtb3RlX2ludGVycnVwdCk6ICBBZGQgZGVidWcgbXNnLgorCShyZW1vdGUtd2FpdCk6ICBJbXBsZW1lbnQgbmV3ICdUJyByZXBseSwgd2hpY2ggaW5jbHVkZXMKKwlzdGF0dXMsIFBDLCBhbmQgRlAgYWxsIGluIGEgc2luZ2xlIHNob3J0IG1lc3NhZ2UuCisJKHB1dHBrdCk6ICBBZGQgZnVydGhlciBkZWJ1Z2dpbmcgb2YgcGFja2V0IGFja3MuCisJKiBtaXBzcmVhZC5jIChmaXh1cF9zeW10YWIpOiAgQWxzbyBzd2FwIFJGRCdzLgorCShwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiAgQXZvaWQgYnVnIG9uIHVua25vd24gc3ltYm9sIHR5cGVzLgorCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiAgUm9sbCB0byA0LjQuNS4KKwkqIG1pcHMtdGRlcC5jIChoZXVyaXN0aWNfcHJvY19zdGFydCk6ICBBdm9pZCBsb25nIGRlbGF5cworCWZvciByZW1vdGUgTUlQUyBieSBsaW1pdGluZyBoZXVyaXN0aWMgdG8gMjAwIGJ5dGUgc2VhcmNoLgorCShoZXVyaXN0aWNfcHJvY19kZXNjKTogIEJ5dGUtc3dhcHBpbmcuCisJKG1pcHNfcHJpbnRfcmVnaXN0ZXIpOiAgQ29wZSB3aXRoIGZhaWx1cmUgb2YKKwlyZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcy4gIEJ5dGUtc3dhcCBpbnRlZ2VycyBmb3IKKwlwcmludGluZy4KKwkqIG1pcHMtcGluc24uYyAocHJpbnRfaW5zbik6ICBCeXRlLXN3YXAgaW5zdHJ1Y3Rpb24uCisKK1RodSBNYXIgIDUgMTI6MzI6MDkgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlnLnN1YiBjb25maWd1cmUuaW4gY29uZmlnL21oLWlyaXg0CisJZ2RiL2NvbmZpZ3VyZS5pbiBnZGIvbWlwcy10ZGVwLmMgZ2RiL21pcHNyZWFkLmMKKwlnZGIvcHJvY2ZzLmMgZ2RiL3NpZ25hbWUuaCBnZGIvdG0taXJpeDMuaCBnZGIvdG0tbWlwcy5oCisJZ2RiL3htLWlyaXg0LmggZ2RiL2NvbmZpZy9tdC1pcml4MworCWdkYi9jb25maWcvbWgtaXJpeDQgdGV4aW5mby9jb25maWd1cmUuaW46ICBQb3J0IHRvIFNHSSBJcml4LTQueC4KKworV2VkIE1hciAgNCAxMTo1Njo0MiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZGVmcy5oLCB1dGlscy5jOiAgeHJlYWxsb2MgdGFrZXMgUFRSIGFzIGZpcnN0IGFyZy4KKwkqIGRlZnMuaDogIFJld29yZCBjb25mdXNpbmcgY29tbWVudCBhYm91dCBBTlNJIHByb3RvdHlwZXMuCisJKiBkZWZzLmg6ICBTb21lIG1pbm9yIHdoaXRlc3BhY2UgY2hhbmdlcy4KKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBDb21wYXJlIGludCB0bXAgdG8gaW50IDAsCisJbm90IE5VTEwsIHdoaWNoIGNhbiBiZSAodm9pZCAqKS4KKwkqIHRtLWFtaXguaCwgdG0taTM4NnY0Lmg6ICBBZGQgZGVmaW5lcyBmb3Igc2V0am1wL2xvbmdqbXAgaGFuZGxpbmcuCisJKiB0bS1pMzg2di5oIChTUF9BUkcwKTogIERlZmluZQorCSogeG0tc3lzdjQuaDogIEJhY2sgb3V0IG9mIGNoYW5nZSBmb3IgbWlzc2luZyBwcm90b3R5cGVzLgorCSogaTM4Ni10ZGVwLmMgKGdldF9sb25nam1wX3RhcmdldCk6ICBBZGQgZnVuY3Rpb24uCisKK1dlZCBNYXIgIDQgMDU6NDY6MTEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogaW5zdGFsbCBtYW4gcGFnZSB0b28uCisKK1R1ZSBNYXIgIDMgMTU6MTE6NTIgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBjeWdudXMuY29tKQorCisJKiBBbGwgR0RCIGZpbGVzIHRoYXQgI2luY2x1ZGUgZGVmcy5oOiBSZW1vdmVkIHN0ZGlvLmguCisJKGRlZnMuaCk6ICNpbmNsdWRlIHN0ZGlvLmguCisKK01vbiBNYXIgIDIgMjM6MDA6MTIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGdkYnR5cGVzLmMgKGxvb2t1cF9wb2ludGVyX3R5cGUpOiBpbml0aWFsaXplIHRoZSBUWVBFX0xFTkdUSCBvZgorCWEgcHR5cGUgdG8gcmVmbGVjdCB0aGUgc2V0dGluZyBvZiBUQVJHRVRfUFRSX0JJVC4gIFNldCB0aGUKKwlUWVBFX0ZMQUdTIG9mIGEgcHR5cGUgdG8gVFlQRV9GTEFHX1VOU0lHTkVELgorCSogdG0taDgzMDAuaCwgaDgzMDAtdGRlcC5jLCByZW1vdGUtaG1zLmM6IHBlcnNvbmFsIGNoZWNrcG9pbnQKKwkqIHByaW50Y21kLmMgKHByaW50X2FkZHJlc3MpOiBpZiBBRERSX0JJVFNfUkVNT1ZFIGlzIGRlZmluZWQsIHVzZQorCWl0IGJlZm9yZSBwcmludGluZyBvdXQgdGhlIGhleCBzaGFwZSBvZiBhbiBhZGRyZXNzLgorCitTdW4gTWFyICAxIDE3OjQxOjA5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiByczYwMDAteGRlcC5jIChmcmFtZV9pbml0aWFsX3N0YWNrX2FkZHJlc3MpOiAgTW92ZQorCWNvZGUgdG8gc2V0IGZyYW1lLT5jYWNoZV9mc3IgaW50byBuZXcgc2VwYXJhdGUgZnVuY3Rpb24KKwlmcmFtZV9nZXRfY2FjYWhlX2Zzci4gIFRoaXMgYWxsb3dzIGZpeGluZyBhIGZhdGFsIGVycm9yLgorCSogeGNvZmZleGVjLmM6ICBUdXJuIHByZXZpb3VzbHkgc3VwcHJlc3NlZCBlcnJvcgorCW1lc3NhZ2UgYmFjayBvbiwgYWZ0ZXIgY2xlYW5pbmcgdXAgQkZELgorCisJKiBicmVha3BvaW50LmMgKGJyZWFrcG9pbnRfcmVfc2V0KTogIFJlbW92ZWQgKGF0IGxlYXN0IGZvciBub3cpCisJcHJpbnRpbmcgb2YgYmxhbmsgbGluZSwgc2luY2UgaXQgY2FzZXMgcHJpbnRpbmcgb2YgYW4KKwlleHRyYSBibGFuayBsaW5lLiAgSXMgdGhpcyBpbnRlbmRlZD8gIEl0IGRvZXMgbWVzcyB1cAorCWdkYiB0ZXN0IHN1aXRlLgorCSogZGVmcy5oOiAgUHV0IGJhY2sgZGVjbGFyYXRpb25zIG9mIG1hbGxvYyBhbmQgcmVhbGxvYywKKwlidXQgcHJvdGVjdGVkIGJ5ICNpZm5kZWYgTUFMTE9DX0lOQ09NUEFUSUJMRS4KKwkqIG9iamZpbGVzLmM6ICBVbmRvIHByZXZpb3VzIGNoYW5nZTogIFVzZSBtYWxsb2MvcmVhbGxvYworCWZvciBvYmpmaWxlIG1hbGxvYy9yZWFsbG9jIGZpZWxkcyAoYnV0IGFkZCBhIGNhc3QpLgorCSogeGNvZmZleGVjLmM6ICBTdXBwcmVzcyBhbiBlcnJvciBtZXNzYWdlIChmb3Igbm93KS4KKworU2F0IEZlYiAyOSAxNDo0MzowMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCUNoYW5nZXMgZnJvbSBtZXRpbkBpYm1wYS5hd2RwYS5pYm0uY29tIChNZXRpbiBHLiBPemlzaWspCisJW01haWwgZGF0ZWQgRnJpLCAyMSBGZWIgOTIgMTM6MTQ6NTQgLTA4MDBdCisJKiBidWlsZHN5bS5jOiBVc2Ugc21hc2hfdG9fcG9pbnRlcl90eXBlKCkgdG8gaGFuZGxlIGZvcndhcmQgdHlwZQorCXJlZmVyZW5jZXMuCisJKiB4Y29mZnJlYWQuYzogTW9kaWZpY2F0aW9ucyB0byBDX0RFQ0wgc3RvcmFnZSBjbGFzcyBoYW5kbGluZywgYW5kCisJaW50cm9kdWN0aW9uIG9mIGFuIG9sZCBzbWFzaF90b19wb2ludGVyX3R5cGUoKSByb3V0aW5lLgorCisJQ2hhbmdlcyBmcm9tIG1ldGluQGlibXBhLmF3ZHBhLmlibS5jb20gKE1ldGluIEcuIE96aXNpaykKKwlbTWFpbCBkYXRlZCBUaHUsIDIwIEZlYiA5MiAxMzo1NzoxNiAtMDgwMF0KKwkqIHJzNjAwMC14ZGVwLmMsIHJzNjAwMC10ZGVwLmMsIHRtLXJzNjAwMC5oOiBmdW5jdGlvbl9mcmFtZV9pbmZvKCkKKwlwYXJhbWV0ZXJzIGhhdmUgYmVlbiBtb2RpZmllZC4KKworCUNoYW5nZXMgZnJvbSBtZXRpbkBpYm1wYS5hd2RwYS5pYm0uY29tIChNZXRpbiBHLiBPemlzaWspCisJW01haWwgZGF0ZWQgVGh1LCAyMCBGZWIgOTIgMTA6MTA6MDUgLTA4MDBdCisJKiByczYwMDAtdGRlcC5jOiBCZWZvcmUgRmViIDUgOTIsIHJlZ2lzdGVyX3ZhbGlkW10gYXJyYXkgd2FzIG5vdCB1c2VkLAorCWFuZCBmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMoKSBhbHdheXMgZmV0Y2hlZCBhbGwgdGhlIHJlZ2lzdGVycworCXJlc3VsdGluZyB2YWxpZCByZWdpc3RlciB2YWx1ZXMgYXQgaGFuZCBhbGwgdGhlIHRpbWUuIFB1c2hpbmcgYSBkdW1teQorCWZyYW1lIGRpZCBub3QgcmVxdWlyZSB2YWxpZGF0aW5nIGFsbCByZWdpc3RlciB2YWx1ZXMgZmlyc3QuIEFmdGVyCisJcHV0dGluZyB0aGUgYWJvdmUgbWVjaGFuaXNtIGludG8gYWN0aW9uLCB3ZSBkaWRuJ3QgaGF2ZSB2YWxpZCByZWdpc3RlcnMKKwl2YWx1ZXMgYWx3YXlzIHJlYWR5LiBUaHVzLCBhbGwgcmVnaXN0ZXJzIG5lZWQgdG8gYmUgZmV0Y2hlZCBiZWZvcmUKKwlwdXNoaW5nIGEgZHVtbXkgZnJhbWUgbm93LgorCisJQ2hhbmdlcyBmcm9tIG1ldGluQGlibXBhLmF3ZHBhLmlibS5jb20gKE1ldGluIEcuIE96aXNpaykKKwlbTWFpbCBkYXRlZCBUaHUsIDEzIEZlYiA5MiAxNjoyMjo0NCAtMDgwMF0KKwkqIHJzNjAwMC14ZGVwLmM6IGZyYW1lX2luaXRpYWxfc3RhY2tfYWRkcmVzcygpIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZQorCXRoZSBzdGFydGluZyBhZGRyZXNzIChhY3R1YWwgZnJhbWUgYWRkcmVzcykgb2YgYSBmcmFtZS4KKwkqIHJzNjAwMC10ZGVwLmM6IG1vZGlmaWNhdGlvbnMgdG8gZnVuY3Rpb25fZnJhbWVfaW5mbygpIHRvIHNlZSBpZgorCWZ1bmN0aW9uIHJlc2VydmVzIGEgZnJhbWUgcG9pbnRlciByZWdpc3RlciAoYWxsb2NhIHJlZ2lzdGVyKQorCSogdG0tcnM2MDAwLmg6IEVYVFJBX0ZSQU1FX0lORk8sIEZSQU1FX0FSR1NfQUREUkVTUyBhbmQKKwlGUkFNRV9MT0NBTFNfQUREUkVTUyBoYXMgYmVlbiB1cGRhdGVkIHRvIHN1cHBvcnQgZGVidWdnaW5nIG9mCisJZnVuY3Rpb25zIHdpdGggYWxsb2NhKCkgY2FsbHMuCisKK1N1biBNYXIgIDEgMTM6MTM6MzkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIHhtLXN5c3Y0Lmg6ICBQcm92aWRlIGRlZmluaXRpb25zL3Byb3RvdHlwZXMgZm9yIGhvc3QgZW52aXJvbm1lbnQKKwlmdW5jdGlvbnMgZm9yIHdoaWNoIG5vIGRlZmluaXRpb25zIG9yIHByb3RvdHlwZXMgYXJlIHByb3ZpZGVkIGluCisJYW55IGN1cnJlbnRseSBpbmNsdWRlZCBnZGIgb3IgaG9zdCBlbnZpcm9ubWVudCBoZWFkZXIgZmlsZXMuCisJRm9yIFNWUjQsIHRoaXMgY3VycmVudGx5IGluY2x1ZGVzIG1hbGxvYyBhbmQgcmVhbGxvYywgd2hpY2ggY2Fubm90CisJYmUgcG9ydGFibHkgcHJvdG90eXBlZCBpbiBhbnkgZ2RiIGluY2x1ZGUgZmlsZS4KKworU2F0IEZlYiAyOSAxNDo0MzowMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogYnVpbGRzeW0uaDogIFJlbW92ZSBvYnNvbGV0ZSB2YXJpYWJsZSBmaWxlX3N0YWJzLgorCisJKiBNYWtlZmlsZS5pbjogIE1vdmUgcGxhY2Ugd2hlcmUgY29uZmlndXJlIG1lcmdlcyBpbiBob3N0LQorCWFuZCB0YXJnZXQtZGVwZW5kZW50IGZyYWdtZW50cyBsYXRlciwgc28gdGhlIGxhdHRlcgorCWNhbiBvdmVycmlkZSAoc2F5KSBHTlVfTUFMTE9DLgorCSogY29uZmlnL21oLXJzNjAwMDogIFVzZSBzeXN0ZW0gbWFsbG9jLiAgT3RoZXJ3aXNlLCBJCisJZW5kZWQgdXAgd2l0aCAqdHdvKiBpbmNvbXBhdGlibGUgdmVyc2lvbnMgb2YgbWFsbG9jCisJKGZ1bmN0aW9ucyBpbiBsaWJjIHdvdWxkIGNhbGwgdGhlIG1hbGxvYyBpbiBsaWJjKS4KKwlJIGFzc3VtZSB0aGlzIGlzIGEgc2hhcmVkIGxpYnJhcnkgcHJvYmxlbS4KKworCSogcmVtb3RlLmM6ICBGaXggKHByZXN1bWVkKSB0eXBvLgorCSogb2JqZmlsZXMuYzogIFVzZSB4bWFsbG9jL3hyZWFsbG9jIGluc3RlYWQgb2YKKwltYWxsb2MvcmVhbGxvYyAoc2luY2UgdGhlIGxhdHRlciBhcmUgbm8gbG9uZ2VyIGRlY2xhcmVkKS4KKworCUNoYW5nZXMgZnJvbSBtZXRpbkBpYm1wYS5hd2RwYS5pYm0uY29tIChNZXRpbiBHLiBPemlzaWspCisJW01haWwgZGF0ZWQgVGh1LCA2IEZlYiAxOTkyIDEwOjIyOjAyIC0wODAwXQorCSogcnM2MDAwLXhkZXAuYzogSW1wcm92ZW1lbnRzIHRvIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycygpIHRvCisJaGFuZGxlIGluZGl2aWR1YWwgcmVnaXN0ZXJzLgorCSogdG0tcnM2MDAwLmg6IEZpeCBTQVZFRF9QQ19BRlRFUl9DQUxMIG1hY3JvIHRvIGhhbmRsZSBwYyB2YWx1ZQorCWNvcnJlY3RseSBpbiBjYXNlIGl0IHdhc24ndCBjYWNoZWQgeWV0LiAoQSBwcm9ibGVtIHNob3dlZCB1cAorCWFmdGVyIGZldGNoaW5nIGluZGl2aWR1YWwgcmVnaXN0ZXJzLikKKwkqIGJ1aWxkc3ltLmM6IERpc2FibGUgdHlwZV9zeW5vbnltX25hbWUncyB0eXBlIG5hbWUgb3ZlcndyaXRpbmcKKwlpbiBjYXNlcyBpdCBpcyB1bm5lY2VzYXJ5LiByczYwMDAgcG9ydGF0aW9uIGRvZXNuJ3QgdXNlCisJdHlwZV9zeW5vbnltX25hbWUsIGFuZCBpdCB1c2VkIHRvIG51bGxpZnkgdHlwZSBuYW1lcworCSogeGNvZmZyZWFkLmM6IHRvIGhhbmRsZSBnKysncyB0eXBlbmFtZSBhYmJyZXZpYXRpb24sIGZpbGwgaW4gYQorCXR5cGUncyBuYW1lIGFzIHNvb24gYXMgc3BhY2UgZm9yIHRoYXQgdHlwZSBpcyBhbGxvY2F0ZWQuCisJKiB4Y29mZnJlYWQuYzogaWdub3JlIGEgc2VjdGlvbidzIGxpbmVubyBpbmZvcm1hdGlvbiBpZiBpdCBpcworCW5vdCBgLnRleHQnLiAoSW4gcnM2MDAwIGJmZCBwb3J0YXRpb24gaW50ZWdyYXRpb24sIHNraXBwaW5nIG92ZXIKKwlgLnBhZCcgc2VjdGlvbnMgYXJlIGlnbm9yZWQgc2luY2UgaXQgd2FzIGluIG1hY2hpbmUgaW5kZXBlbmRlbnQKKwlwYXJ0IG9mIHRoZSBjb2RlLiBUaHVzLCBhIHByb2JsZW0gb2YgZmFrZSBzZWN0aW9ucyB3aXRoIGludmFsaWQKKwlsaW5lbm8gaW5mb3JtYXRpb24gYXJpc2VkLikKKworCUNoYW5nZXMgZnJvbSBtZXRpbkBpYm1wYS5hd2RwYS5pYm0uY29tIChNZXRpbiBHLiBPemlzaWspCisJW01haWwgZGF0ZWQgVGh1LCA2IEZlYiAxOTkyIDEzOjI2OjIyIC0wODAwXQorCSogcnM2MDAwLXRkZXAuYzogbWFrZSBmdW5jdGlvbl9mcmFtZV9pbmZvKCkgd29yayB3aGV0aGVyIG9yIG5vdAorCXJlYWRpbmcgZnJvbSBhIGNvcmUgZmlsZS4KKwkqIHRtLXJzNjAwMC5oOiBJbXBsZW1lbnRhdGlvbiBvZiBGUkFNRV9GSU5EX1NBVkVEX1JFR1MgbWFjcm8uCisKKwkqIGluZnJ1bi5jLiBtYWluLmMsIHByaW50Y21kLmMuIHN5bXRhYi5jOgorCU1vcmUgY2hhbmdlcyBmcm9tIElCTSBmb3IgcnM2MDAwLgorCisKK1RodSBGZWIgMjcgMjI6NTc6MTkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIHJzNmstb3Bjb2RlLmgsIHRtLXJzNjAwMC5oLCB4bS1yczYwMDAuaCwgcnM2MDAwLXRkZXAuYywKKwlyczYwMDAteGRlcC5jLCB4Y29mZmV4ZWMuYywgeGNvZmZyZWFkLmM6CisJTWVyZ2UgaW4gY2hhbmdlcyAobW9zdGx5IGZyb20gSUJNKSBmb3IgUlM2MDAwLgorCSogYnJlYWtwb2ludC5jLCBidWlsZHN5bS5jLCBpbmZwdHJhY2UuYywgc3RhY2suYywgc3ltdGFiLmM6CisJTW9yZSBjaGFuZ2VzIGZyb20gSUJNIGZvciBSUzYwMDAuICBUaGVzZSBhcmUgaW4gbWFjaGluZS0KKwlpbmRlcGVuZGVudCBjb2RlLCBhbmQgcHJvYmFibHkgY291bGQgZG8gd2l0aCBzb21lIGNsZWFuaW5nCisJdXAuICBUaGUgbW9zdCBxdWVzdGlvbmFibGUgb2YgdGhlc2UgYXJlICNpZmRlZiBJQk02MDAwLgorCSogaW5mcnVuLmMsIHNwYXJjLXRkZXAuYzogUGFzcyBhIHBhcmFtZXRlciAoc2lnbmFsIG51bWJlcikKKwl0byBzaW5nbGVfc3RlcCgpIChmb3IgY29uc2lzdGVuY3kgd2l0aCByczYwMDAgYW5kIGk4NjApLgorCSogdXRpbHMuYzogIEFsbG93IHRoZSAxc3QgYXJnIHRvIHhyZWFsbG9jIHRvIGJlIE5VTEwKKwkoaW4gd2hpY2ggY2FzZSBkbyBtYWxsb2MpLiAgVGhpcyByZW1vdmVzIHRoZSBuZWVkIGZvcgorCXNvbWUgdGVzdHMgaW4geGNvZmYgY29kZSAoYW5kIHBlcmhhcHMgb3RoZXIgcGxhY2VzPykuCisJKiBjb2ZmcmVhZC5jOiBSZW1vdmVkIHZhcmlhYmxlcyBsYXN0X3NvdXJjZV9maWxlLAorCXR5cGVfdmVjdG9yLCBhbmQgdHlwZV92ZWN0b3JfbGVuZ3RoIGFzIHRoZXNlIGFyZSBub3cKKwlkZWZpbmVkIGJ5IGJ1aWxkc3ltLltjaF0uCisJKiBkZWZzLmg6ICBSZW1vdmUgcHJvdG90eXBlcyBmb3IgbWFsbG9jIGFuZCByZWFsbG9jLCBzaW5jZQorCXRoZXNlIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gaW1wbGVtZW50IHhtYWxsb2MgYW5kIHhyZWFsbG9jLAorCWFuZCB0aGV5IGNvbmZsaWN0IHdpdGggPHN0ZGxpYi5oPiBpbiBBSVggLSB3aGVyZSB0aGV5CisJcmV0dXJuIHZvaWQqIGV2ZW4gd2hlbiBfX1NURENfXyBpc24ndCBkZWZpbmVkLiAgU2lnaC4KKwkqIG11bmNoOiAgUmVjb2duaXplICppbml0aWFsaXplKiBpbiBkYXRhIGFzIHdlbGwgYXMgdGV4dAorCShBSVggdXNlcyBkYXRhKS4gIEFsc28sIGluY29ycG9yYXRlIGEgcGF0Y2ggZnJvbSBHYXJyZXR0CisJV29sbG1hbiA8d29sbG1hbkB1dm0tZ2VuLnV2bS5lZHU+IHRvIG1ha2UgdGhlIHNlZCBzY3JpcHQKKwltdWNoIG1vcmUgc2Vuc2libGUsIGJ5IG9ubHkgdHJ5aW5nIHRvIG1hdGNoIHRoZSBuYW1lIG9mCisJdGhlIGluaXRpYWxpemVfZm9vIGZ1bmN0aW9uLCBhbmQgbm90IHRoZSBqdW5rIGJlZm9yZSBpdC4KKwkKK1RodSBGZWIgMjcgMjA6MDc6NDMgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50X3JlX3NldF9vbmUpOiAgRG9uJ3QgcmVzZXQgYnJlYWtwb2ludAorCXVubGVzcyBzeW1ib2wgdGFibGUgaW5kaWNhdGVzIHRoYXQgc29tZXRoaW5nIGhhcyBjaGFuZ2VkLgorCitUaHUgRmViIDI3IDExOjQ4OjQ3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiByZW1vdGUuYzogIE1ha2UgaXQgd29yayBmb3IgZW1iZWRkZWQgTUlQUy4gIEluY3JlYXNlIGJ1ZmZlcgorCXNpemUsIGFuZCB1c2UgdGhyb3VnaG91dC4gIFJvdW5kIGJ1ZmZlciBzaXplIHVwIGlmIHRvbyBtYW55IHJlZ3MuCisJU3VwcG9ydCBiYXVkIHJhdGUgc2V0dGluZyBhbmQgdHJ5IGZvciBhbiA4LWJpdCBwYXRoLiAgSWYKKwlpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIGZvciB0YXJnZXQsIHNlbmQgYSBeQyBkb3duIHRoZSB3aXJlLgorCUF2b2lkIHNpbmdsZS1ieXRlIHJlYWRzLgorCSogdG0tbWlwcy5oOiAgQWRkIG1vcmUgZW1iZWRkZWQtc3lzdGVtIHJlZ2lzdGVycyB0byBSRUdJU1RFUl9OQU1FUworCWFuZCBOVU1fUkVHUy4KKwkqIG1pcHMteGRlcC5oOiAgQXZvaWQgdGhlIGVtYmVkZGVkIHJlZ3Mgd2hlbiBvbiBVbml4LgorCisJKiBtaXBzcmVhZC5jOiAgQnl0ZS1zd2FwIHRoZSBzeW1ib2wgdGFibGUgc3RydWN0dXJlcywgdXNpbmcKKwlyb3V0aW5lcyBmcm9tIGVjb2ZmLmMsIHRvIHJlYWQgYSBzeW1ib2wgdGFibGUgd3JpdHRlbiBpbiBhbnkKKwlvZiB0aGUgZm91ciBwb3NzaWJsZSBieXRlIG9yZGVycy4KKwkqIGNvbmZpZ3VyZS5pbiAobWlwcy1iaWctKiB0YXJnZXQpOiAgU2FtZSBhcyBTb255IE5ld3MuCisJKiBjb25maWcvbXQtYmlnbWlwcywgY29uZmlnL210LWxpdHRsZW1pcHM6ICBBZGQgZWNvZmYuby4KKwkqIGVjb2ZmLmM6ICBOZXcgZmlsZSBmb3Igc3ltYm9sIHN3YXBwaW5nIHJvdXRpbmVzLgorCitUaHUgRmViIDI3IDA5OjI2OjM4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGJyZWFrcG9pbnQuYyAoYWxsX2JyZWFrcG9pbnRzX2luZm8sIGJyZWFrcG9pbnRfMSk6ICBBZGQgJ2luZm8KKwlhbGwtYnJlYWtwb2ludHMnIGNvbW1hbmQuCisJKiAoZ2V0X251bWJlcik6ICBBbGxvdyB1c2VycyB0byBlbnRlciBuZWdhdGl2ZSBicmVha3BvaW50IG51bWJlcnMuCisJKiAoYnJlYWtwb2ludF8xKTogIFJlZm9ybWF0IGRpc3BsYXkgb2YgJ2luZm8gYnJlYWsnIHRvIHNob3cgbmV3CisJZmllbGRzLgorCSogKGNyZWF0ZV9sb25nam1wX2JyZWFrcG9pbnQsIGJyZWFrcG9pbnRfcmVfc2V0LAorCWJyZWFrcG9pbnRfcmVfc2V0X29uZSwgZW5hYmxlL2Rpc2FibGVfbG9uZ2ptcF9icmVha3BvaW50KSwKKwlzeW1maWxlLmMgIChzeW1zX2Zyb21fb2JqZmlsZSk6ICBSZS1kbworCWluc2VydGlvbiBvZiBsb25nam1wIGJyZWFrcG9pbnRzLiAgTW92ZSBhbGwgY29kZSBpbnRvCisJYnJlYWtwb2ludF9yZV9zZXQsIGFuZCBjYWxsIHRoYXQgaW5zdGVhZCBvZgorCWNyZWF0ZV9sb25nam1wX2JyZWFrcG9pbnQgaW4gc3ltZmlsZS5jLgorCitUaHUgRmViIDI3IDA2OjExOjA1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBicmVha3BvaW50LmggKEFMTF9CUkVBS1BPSU5UU19TQUZFKTogIEFkZC4KKwkqIGJyZWFrcG9pbnQuYyAoYnJlYWtwb2ludF9yZV9zZXQpOiAgVXNlIEFMTF9CUkVBS1BPSU5UU19TQUZFLgorCSogc3ltdGFiLmMgKGZpbmRfcGNfc3ltdGFiKTogIEhhbmRsZSBoYXZpbmcgbm8gb2JqZmlsZXMuCisJKiBpbmZjbWQuYzogIEZpeCBjb21tZW50LgorCSogb2JqZmlsZXMuYyAoZnJlZV9hbGxfb2JqZmlsZXMpOiAgQWRkLgorCSogc3ltZmlsZS5oIChBTExfT0JKRklMRVMsIEFMTF9PQkpGSUxFU19TQUZFKTogIEFkZC4KKwkqIHN5bWZpbGUuYyAoc3ltYm9sX2ZpbGVfY29tbWFuZCk6ICBmcmVlIGFsbCBvYmpmaWxlcyB3aGVuCisJc3BlY2lmeWluZyBhIG5ldyBzeW1ib2wgZmlsZS4KKwkocmVyZWFkX3N5bWJvbHMpOiAgU3RhdCB0aGUgZmlsZSBuYW1lLCBkb24ndCBmc3RhdCB0aGUgZGVzY3JpcHRvci4KKworV2VkIEZlYiAyNiAxODowNDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0cmFjZXMgb2YgbmFtZXN1YmRpciwKKwkgIC1zdWJkaXJzLCAkKHN1YmRpciksICQodW5zdWJkaXIpLCBzb21lIHJjcyB0cmlnZ2Vycy4gIEZvcmNlZAorCSAgY29weXJpZ2h0cyB0byAnOTIsIGNoYW5nZWQgc29tZSBmcm9tIEN5Z251cyB0byBGU0YuCisKK1R1ZSBGZWIgMjUgMTk6MzE6MTkgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogZGJ4cmVhZC5jIChlbmRfcHN5bXRhYik6ICBEZWxldGUgZW1wdHkgcHN5bXRhYnMuCisJKiBzeW1maWxlLmMgKGFsbG9jYXRlX3BzeW10YWIpOiAgUmVjeWNsZSBlbXB0eSBwc3ltdGFicy4KKwkqIHN5bWZpbGUuaCAoc3RydWN0IG9iamZpbGUpOiAgQWRkIGZyZWVfcHN5bXRhYnMuCisKK1NhdCBGZWIgMjIgMDI6MDA6MzIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIFJvbGwgdG8gZ2RiLTQuNC40LgorCisJKiBzeW1maWxlLmMgKHN5bWJvbF9maWxlX2NvbW1hbmQpOiAgc3RyY21wID0+ICFzdHJjbXAuCisJKiBicmVha3BvaW50Lmg6ICBNb3ZlIHByb3RvdHlwZXMgdG8gZm9sbG93IGVudW0gZGVmaW5pdGlvbiB0aGV5IG5lZWQuCisJKiBicmVha3BvaW50LmMsIGluZnJ1bi5jOiAgTGludC4KKwkqIHByaW50Y21kLmM6ICBVc2UgYGVudW0gZW5hYmxlJyByYXRoZXIgdGhhbiBgZW51bQorCWRpc3BsYXlfc3RhdHVzJy4KKwkqIG1pcHNyZWFkLmM6ICBGaXJzdCBwYXNzIGF0IG1ha2luZyBpdCBjb21waWxlIHdpdGggdGhlIG5ldworCW9iamZpbGUgY2hhbmdlcy4gIFByb2JhYmx5IHNlcmlvdXNseSBicm9rZW4gc3RpbGwsIGJ1dCBpdAorCWNvbXBpbGVzLiAgRklYTUUuCisKK1NhdCBGZWIgMjIgMDA6NTY6MzkgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogaW5mcnVuLmMsIGluZmNtZC5jLCBicmVha3BvaW50LmMsIG1haW4uYywgc3ltZmlsZS5jLAorCWJyZWFrcG9pbnQuaCwgdG0tc3VuNG9zNC5oLCB0bS1zcGFyYy5oLCBzcGFyYy10ZGVwLmMsIHRtLW1pcHMuaCwKKwltaXBzLXRkZXAuaCwgdG0tc3VuMy5oLCB0bS02OGsuaCwgbTY4ay10ZGVwLmg6ICBBZGQgc3VwcG9ydCBmb3IKKwlzdGVwcGluZyAoYW5kIG5leHRpbmcpIHRocm91Z2ggbG9uZ2ptcCgpLiAgQWxzbywgY2xlYW51cAorCWJyZWFrcG9pbnQgaGFuZGxpbmcgcXVpdGUgYSBiaXQgYnkgY3JlYXRpbmcgZXhwbGljaXQgYnJlYWtwb2ludAorCXR5cGVzIGluc3RlYWQgb2YgdXNpbmcgbWFnaWMgYnJlYWtwb2ludCBudW1iZXJzLgorCU1ha2VmaWxlLmluOiAgVXBkYXRlIHZlcnNpb24gdG8gNC40LjMKKworU2F0IEZlYiAyMiAwMDowODo1MCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogYnVpbGRzeW0uYywgZHdhcmZyZWFkLmMsIGdkYnR5cGVzLmMsIGluZmxvdy5jLCBtYWluLmMsCisJbWluc3ltcy5jLCBwcmludGNtZC5jLCByZW1vdGUuYywgc2FiZXIuc3VwcHJlc3M6ICBTYWJlcmxpbnQuCisJKiBzeW1taXNjLmMsIHhjb2ZmcmVhZC5jOiAgTW92ZSBkZWJ1ZyBmdW5jdGlvbnMgdG8gc3ltbWlzYy5jLgorCisJKiB4bS1zdW4zb3M0LmgsIHhtLXN1bjRvczQuaDogIEVuYWJsZSBIQVZFX01NQVAuCisKKwkqIG1pbnN5bXMuYyAoaW5zdGFsbF9taW5pbWFsX3N5bWJvbHMpOiAgQWRkIGJ1bmNoZXMgdG8gYW55CisJZXhpc3RpbmcgbWluc3ltcyBpbiB0aGUgb2JqZmlsZS4gIEF2b2lkIGV4dHJhIG1hbGxvY2F0aW9uCisJYnkgd29ya2luZyBkaXJlY3RseSBpbiB0aGUgb2JzdGFjay4gIFJlbW92ZSBpZ25vcmVkIGBtYWlubGluZScgcGFybS4KKwkqIGNvZmZyZWFkLmMsIGRieHJlYWQuYywgZWxmcmVhZC5jLCBtaXBzcmVhZC5jLCBzb2xpYi5jLCBzeW10YWIuaCwKKwl4Y29mZnJlYWQuYzogIENoYW5nZSBhbGwgY2FsbGVycy4KKwkqIEZJWE1FOiAgV2Ugc2hvdWxkIGJlIGFibGUgdG8gZWxpbWluYXRlIE1BSU5MSU5FIGZyb20gYWxsIHRoZQorCXN5bWJvbCByZWFkZXJzIG5vdywgd2l0aCBhIHNtYWxsIGJpdCBvZiB3b3JrLgorCisJKiB2YWxvcHMuYywgdmFsdWUuaDogIExpbnQuCisJKiByZW1vdGUtdnguYzogIEFkZCBtaXNzaW5nIGJyZWFrOyBzdGF0ZW1lbnQuICBCdWdmaXggYnkKKwlNaWNoYWVsIFNjbGFmYW5pLCA8c2NsYWZhbmlAc3JjLmRlYy5jb20+LgorCitGcmkgRmViIDIxIDE3OjI5OjU0IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICBVcGRhdGUgdmVyc2lvbiB0byA0LjQuMgorCSogTWFrZWZpbGUuaW4gKFNGSUxFU19NQUlORElSKTogIEFkZCBnZGJ0eXBlcy5jLCBzdGF0ZS5jLCBvYmpmaWxlcy5jLAorCW1pbnN5bXMuYywgbW1hcC1hbGxvYy5jLCBtbWFwLXNicmsuYworCSogTWFrZWZpbGUuaW4gKEhGSUxFUyk6ICBBZGQgZ2RidHlwZXMuaCwgc3RhdGUuaCwgc29saWIuaAorCSogTWFrZWZpbGUuaW4gKE9CUyk6ICBBZGQgZ2RidHlwZXMubywgc3RhdGUubywgb2JqZmlsZXMubywgbWluc3ltcy5vLAorCW1tYXAtYWxsb2MubywgbW1hcC1zYnJrLm8KKworCSogYWx0b3MteGRlcC5jOiAgTWlub3Igd2hpdGVzcGFjZSBjaGFuZ2UuCisJKiBhbTI5ay10ZGVwLmMgKGV4YW1pbmVfcHJvbG9ndWUpOiAgQ29udmVydCBmcm9tIG1pc2MgZnVuY3Rpb24gdmVjdG9yCisJdXNlIHRvIG5ldyBtaW5pbWFsIHN5bWJvbCB0YWJsZSB1c2UuCisJKiBhcm0teGRlcC5jIChmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMpOiAgRG9jdW1lbnQgdW51c2VkIGFyZ3VtZW50LgorCSogYXJtLXhkZXAuYyAoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogIFJldHVybnMgdm9pZC4KKwkqIGJsb2NrZnJhbWUuYyAoZ2V0X3BjX2Z1bmN0aW9uX3N0YXJ0LCBmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24pOgorCUNvbnZlcnQgZnJvbSBtaXNjIGZ1bmN0aW9uIHZlY3RvciB1c2UgdG8gbmV3IG1pbmltYWwgc3ltYm9sIHRhYmxlIHVzZS4KKwlSZW1vdmUgZmluZF9wY19taXNjX2Z1bmN0aW9uKCkuICBJZmRlZiBvdXQgYmxvY2tfaW5uZXJtb3N0X2ZyYW1lKCkuCisJKiBicmVha3BvaW50LmM6ICBBZGQgcHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLgorCSogYnJlYWtwb2ludC5jIChjYXRjaF9jb21tYW5kXzEpOiAgQ2hhbmdlIHRvIHN0YXRpYyBhbmQgcmVtb3ZlIHVudXNlZAorCWxvY2FsICJwYyIuCisJKiBicmVha3BvaW50LmMgKG1hcF9icmVha3BvaW50X251bWJlcnMpOiAgUHJvdG90eXBlIGFyZyAiZnVuY3Rpb24iLgorCSogYnJlYWtwb2ludC5oOiAgQ2hhbmdlIGZ1bmN0aW9uIGRlY2xzIHRvIHByb3RvdHlwZSBmb3JtLgorCSogYnVpbGRzeW0uYzogIEFkZCBwcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuCisJKiBidWlsZHN5bS5jOiAgTW92ZWQgaGFzaG5hbWUoKSBmdW5jdGlvbiBoZXJlIGZyb20gZGJ4cmVhZC5jLgorCSogYnVpbGRzeW0uYyAoZGJ4X2xvb2t1cF90eXBlKTogIENhc3QgYXJncyB0byB4cmVhbGxvYygpLgorCSogYnVpbGRzeW0uYzogIFJlbW92ZSBkYnhfY3JlYXRlX3R5cGUoKSwgdXNlcyBjaGFuZ2VkIHRvIGFsbG9jX3R5cGUoKS4KKwkqIGJ1aWxkc3ltLmMgKGRieF9hbGxvY190eXBlKTogIENoYW5nZSB0byBzdGF0aWMuCisJKiBidWlsZHN5bS5jIChmaW5pc2hfYmxvY2spOiBBZGQgb2JqZmlsZSBwYXJhbWV0ZXIuCisJKiBidWlsZHN5bS5jIChtaXNjKTogIENoYW5nZSBzeW1ib2xfb2JzdGFjayB0byBvYmpmaWxlIHZlcnNpb24uCisJKiBidWlsZHN5bS5jIChtYWtlX2Jsb2NrdmVjdG9yKTogQ2hhbmdlIHRvIHN0YXRpYy4KKwkqIGJ1aWxkc3ltLmMgKHN0YXJ0X3N1YmZpbGUpOiAgVXNlIHN0cmR1cCBpbnN0ZWFkIG9mIG9ic2F2ZXN0cmluZy4KKwkqIGJ1aWxkc3ltLmMgKGNvbXBhcmVfbGluZV9udW1iZXJzKTogQ2hhbmdlIHRvIHN0YXRpYywgYXJncyBhcmUgY29uc3QsCisJY2FzdCBhcmdzIHdoZW4gdXNlZC4KKwkqIGJ1aWxkc3ltLmMgKHN0YXJ0X3N5bXRhYik6ICBJbmxpbmUgbmV3X29iamVjdF9oZWFkZXJfZmlsZXMoKSBjYWxsLgorCSogYnVpbGRzeW0uYyAocGF0Y2hfYmxvY2tfc3RhYnMpOiAgTW92ZWQgdG8gdGhpcyBmaWxlIGZyb20geGNvZmZyZWFkCisJYW5kIG1hZGUgc3RhdGljLiAgQWRkIG9iamZpbGUgcGFyYW1ldGVyLgorCSogYnVpbGRzeW0uYyAoZW5kX3N5bXRhYik6IFNpbXBsaWZ5IGNvZGUgdXNpbmcgbGluZSB0YWJsZSBzaXplLgorCVJlYWxsb2MgdGhlIGxpbmV0YWJsZSBvbiB0aGUgb2JqZmlsZSBzeW1ib2xfb2JzdGFjayBhbmQgY29weSB0aGVyZS4KKwkqIGJ1aWxkc3ltLmMgKHNjYW5fZmlsZV9nbG9iYWxzKTogIENvbnZlcnQgZnJvbSBtaXNjIGZ1bmN0aW9uIHZlY3RvcgorCXVzZSB0byBuZXcgbWluaW1hbCBzeW1ib2wgdXNlLgorCSogYnVpbGRzeW0uYyAoZGVmaW5lX3N5bWJvbCk6ICBBZGQgb2JqZmlsZSBwYXJhbWV0ZXIuICBNYWtlIHN1cmUKKwlzdHJpbmdzIGdldCBhbGxvY2F0ZWQgaW4gb2JqZmlsZSdzIHN5bWJvbF9vYnN0YWNrLiAgQ29udmVydCByZWZlcmVuY2VzCisJdG8gYnVpbHRpbiB0eXBlcyB0byBsb29rdXBfZnVuZGFtZW50YWxfdHlwZSgpLgorCSogYnVpbGRzeW0uYyAocmVhZF90eXBlKTogIE1ha2Ugc3RhdGljLCBhZGQgb2JqZmlsZSBwYXJhbWV0ZXIsIGNvbnZlcnQKKwlyZWZlcmVuY2VzIHRvIGJ1aWxkaW4gdHlwZXMgdG8gbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUoKS4KKwkqIGJ1aWxkc3ltLmMgKHJlYWRfc3RydWN0X3R5cGUpOiAgQWRkIG9iamZpbGUgcGFyYW1ldGVyLgorCSogYnVpbGRzeW0uYyAocmVhZF9hcnJheV90eXBlKTogIE1ha2Ugc3RhdGljLCBhZGQgb2JqZmlsZSBwYXJhbWV0ZXIuCisJKiBidWlsZHN5bS5jIChyZWFkX2VudW1fdHlwZSk6ICBNYWtlIHN0YXRpYywgYWRkIG9iamZpbGUgcGFyYW1ldGVyLgorCSogYnVpbGRzeW0uYyAocmVhZF9odWdlX251bWJlcik6IE1ha2Ugc3RhdGljLgorCSogYnVpbGRzeW0uYyAocmVhZF9yYW5nZV90eXBlKTogTWFrZSBzdGF0aWMsIGFkZCBvYmpmaWxlIHBhcmFtZXRlciwKKwljb252ZXJ0IHJlZmVyZW5jZXMgdG8gYnVpbGRpbiB0eXBlcyB0byBsb29rdXBfZnVuZGFtZW50YWxfdHlwZSAoKS4KKwkqIGJ1aWxkc3ltLmMgKHJlYWRfYXJncyk6ICBNYWtlIHN0YXRpYywgYWRkIG9iamZpbGUgcGFyYW1ldGVyLgorCSogYnVpbGRzeW0uaDogIENvbnZlcnQgZnVuY3Rpb24gZGVjbCdzIHRvIHByb3RvdHlwZSBmb3JtLgorCSogYy1leHAueTogIEFkZCBwcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMsIGNvbnZlcnQgdXNlcyBvZiBtaXNjCisJZnVuY3Rpb24gdmVjdG9yIHRvIG1pbmltYWwgc3ltYm9sIHRhYmxlLiAgUmVmb3JtYXQgYWxsIGJ1aWx0aW4gdHlwZQorCWluaXRpYWxpemF0aW9ucyBhbmQgcGFzcyBhIE5VTEwgb2JqZmlsZSB0byBpbml0X3R5cGUoKSBmb3IgdGhlbS4KKwkqIGNvZmZyZWFkLmM6ICBDaGFuZ2UgY29udGV4dF9zdGFjayByZWYncyB0byBjb2ZmX2NvbnRleHRfc3RhY2ssCisJYWRkIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMuICBDYXN0IHVzZXMgb2YgeHJlYWxsb2MgYXJnIDEuCisJKiBjb2ZmcmVhZC5jIChjb2ZmX2FsbG9jX3R5cGUpOiAgQ2FsbCBhbGxvY190eXBlIGluc3RlYWQgb2YgIGhhbmQtCisJY3JhZnRpbmcgYSBuZXcgdHlwZS4KKwkqIGNvZmZyZWFkLmMgKGFkZF9zeW1ib2xfdG9fbGlzdCk6ICBDaGFuZ2UgdG8gY29mZl9hZGRfc3ltYm9sX3RvX2xpc3QuCisJKiBjb2ZmcmVhZC5jIChmaW5pc2hfYmxvY2spOiAgQ2hhbmdlIG5hbWUgdG8gY29mZl9maW5pc2hfYmxvY2suCisJKiBjb2ZmcmVhZC5jIChtYWtlX2Jsb2NrdmVjdG9yKTogIEFkZCBhbmQgdXNlIG9iamZpbGUgcGFyYW1ldGVyLgorCSogY29mZnJlYWQuYyAocmVjb3JkX2xpbmUpOiAgQ2hhbmdlIG5hbWUgdG8gY29mZl9yZWNvcmRfbGluZS4KKwkqIGNvZmZyZWFkLmMgKHN0YXJ0X3N5bXRhYik6ICBDaGFuZ2UgbmFtZSB0byBjb2ZmX3N0YXJ0X3N5bXRhYi4KKwkqIGNvZmZyZWFkLmMgKGVuZF9zeW10YWIpOiAgQ2hhbmdlIG5hbWUgdG8gY29mZl9lbmRfc3ltdGFiLgorCSogY29mZnJlYWQuYyAocmVjb3JkX21pc2NfZnVuY3Rpb24pOiAgQ2hhbmdlIG5hbWUgdG8gcmVjb3JkX21pbmltYWxfCisJc3ltYm9sIGFuZCBjaGFuZ2UgdG8gbWluaW1hbCBzeW1ib2wgdGFibGUgdXNlIGZyb20gbWlzYyBmdW5jIHRibC4KKwkqIGNvZmZyZWFkLmMgKGNvZmZfc3ltZmlsZV9yZWFkKTogIENvbnZlcnQgZnJvbSBtaXNjIGZ1bmN0aW9uIHZlY3RvcgorCXVzZSB0byBtaW5pbWFsIHN5bWJvbCB0YWJsZSB1c2UuCisJKiBjb2ZmcmVhZC5jIChoYXNobmFtZSk6ICBSZW1vdmU7IHVzZSBjb21tb24gdmVyc2lvbiBpbiBidWlsZHN5bS5jLgorCSogY29mZnJlYWQuYyAoZGVjb2RlX2Jhc2VfdHlwZSk6ICBDaGFuZ2UgcmVmZXJlbmNlcyB0byBidWlsdGluIHR5cGVzCisJdG8gY2FsbHMgdG8gbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUoKS4KKwkqIGNvZmZyZWFkLmMgKHJlYWRfc3RydWN0X3R5cGUpOiAgQ2hhbmdlIG5hbWUgdG8gY29mZl9yZWFkX3N0cnVjdF90eXBlLgorCSogY29mZnJlYWQuYyAocmVhZF9lbnVtX3R5cGUpOiAgQ2hhbmdlIG5hbWUgdG8gY29mZl9yZWFkX2VudW1fdHlwZS4KKwkqIGNvbW1hbmQuYzogQWRkIHByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4KKwkqIGNvbW1hbmQuYyAoYWRkX2NtZCk6ICBQcm90b3R5cGUgdGhlICdmdW4nIHBhcmFtZXRlciBhbmQgdXNlIHRoZQorCWFwcHJvcHJpYXRlIG1lbWJlciBvZiB0aGUgZnVuY3Rpb24gdW5pb24gZm9yIHRoYXQgdHlwZS4KKwkqIGNvbW1hbmQuYyAoYWRkX2FiYnJldl9jbWQpOiAgUHJvdG90eXBlIHRoZSAnZnVuJyBwYXJhbWV0ZXIgYW5kCisJaWZkZWYgb3V0IHRoZSBmdW5jdGlvbiBzaW5jZSBpdCBpc24ndCBjdXJyZW50bHkgdXNlZC4KKwkqIGNvbW1hbmQuYyAoYWRkX2FsaWFzX2NtZCk6ICBQYXNzIGNvcnJlY3QgZnVuY3Rpb24gdHlwZSB0byBhZGRfY21kLgorCSogY29tbWFuZC5jIChhZGRfcHJlZml4X2NtZCk6ICBQcm90b3R5cGUgdGhlICdmdW4nIHBhcmFtZXRlci4KKwkqIGNvbW1hbmQuYyAoYWRkX2FiYnJldl9wcmVmaXhfY21kKTogIFByb3RvdHlwZSB0aGUgJ2Z1bicgcGFyYW1ldGVyLgorCSogY29tbWFuZC5jIChoZWxwX2NtZCk6ICBDb21wYXJlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gTlVMTC4KKwkqIGNvbW1hbmQuYyAoaGVscF9jbWRfbGlzdCk6ICBDb21wYXJlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gTlVMTC4KKwkqIGNvbW1hbmQuYyAobG9va3VwX2NtZF8xKTogIFVzZSBjb3JyZWN0IG1lbWJlciBvZiBmdW5jdGlvbiB1bmlvbi4KKwkqIGNvbW1hbmQuYyAodW5kZWZfY21kX2Vycm9yKTogIE1ha2Ugc3RhdGljLgorCSogY29tbWFuZC5jIChjb21wbGV0ZV9vbl9jbWRsaXN0KTogIFVzZSBjb3JyZWN0IG1lbWJlciBvZiBmdW5jIHVuaW9uLgorCSogY29tbWFuZC5jIChkb19zZXRzaG93X2NvbW1hbmQpOiAgVXNlIGNvcnJlY3QgbWVtYmVyIG9mIGZ1bmMgdW5pb24uCisJKiBjb21tYW5kLmMgKHNoZWxsX2VzY2FwZSk6ICBDb252ZXJ0IHJpbmRleCB1c2UgdG8gc3RycmNoci4KKwkqIGNvbW1hbmQuaCAoQ09NTUFORF9IKTogIERlZmluZSBpZiBhbHJlYWR5IGluY2x1ZGVkLgorCSogY29tbWFuZC5oIChjbWRfbGlzdF9lbGVtZW50IHN0cnVjdCk6ICBDaGFuZ2UgJ2Z1bmN0aW9uJyB0byBhIHVuaW9uCisJYW5kIHByb3RvdHlwZSBhcmdzLiAgUHJvdG90eXBlIGNvbXBsZXRlciBmdW5jdGlvbi4KKwkqIGNvbW1hbmQuaDogIENvbnZlcnQgZGVjbCdzIHRvIHByb3RvdHlwZSBmb3JtLgorCSogY29udmV4LXhkZXAuYyAoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogIFJldHVybnMgdm9pZC4KKwkqIGNvcHlpbmcuYzogIFByb3RvdHlwZSBsb2NhbCBmdW5jdGlvbnMuCisJKiBjb3JlZGVwLmM6ICBNaW5vciB3aGl0ZXNwYWNlIGNoYW5nZS4KKwkqIGNwbHVzLWRlbS5jOiAgUmVtb3ZlIGhhY2sgdG8gdXNlIEJTRCBlcXVpdmFsZW50cyBvZiBtZW0qIGFuZCBzdHIqLgorCSogY3BsdXMtZGVtLmM6ICBQcm90b3R5cGUgbG9jYWwgZnVuY3Rpb25zLgorCSogZGJ4cmVhZC5jIChoYXNobmFtZSk6ICBSZW1vdmU7IG1vdmVkIHRvIGJ1aWxkc3ltLmMuCisJKiBkYnhyZWFkLmMgKGZyZWVfYW5kX2luaXRfaGVhZGVyX2ZpbGVzKTogIE1ha2Ugc3RhdGljLgorCSogZGJ4cmVhZC5jOiAgQWRkIHByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4KKwkqIGRieHJlYWQuYyAobmV3X29iamVjdF9oZWFkZXJfZmlsZXMpOiAgUmVtb3ZlOyBpbmxpbmVkIHVzYWdlcy4KKwkqIGRieHJlYWQuYyAoeHJlYWxsb2MgdXNhZ2VzKTogIENhc3QgYXJncy4KKwkqIGRieHJlYWQuYyAocmVjb3JkX21pc2NfZnVuY3Rpb24pOiAgQ2hhbmdlIHRvIHJlY29yZF9taW5pbWFsX3N5bWJvbAorCWFuZCBjaGFuZ2UgdXNhZ2VzIGFjY29yZGluZ2x5LgorCSogZGJ4cmVhZC5jIChzdGF0aWNfcHN5bWJvbHMgdXNhZ2VzKTogIENoYW5nZSB0byB1c2UgcGVyLW9iamZpbGUgY29weS4KKwkqIGRieHJlYWQuYyAoeG1hbGxvYyB1c2FnZXMpOiAgVXNlIHBlci1vYmpmaWxlIGNvcHkgd2hlbiBhcHByb3ByaWF0ZS4KKwkqIGRieHJlYWQuYyAoZGJ4X25leHRfc3ltYm9sX3RleHQpOiAgTWFrZSBzdGF0aWMuCisJKiBkYnhyZWFkLmMgKGluaXRfcHN5bWJvbF9saXN0KTogIENvbnZlcnQgdG8gdXNlIHBlci1vYmpmaWxlIGRhdGEuCisJKiBkYnhyZWFkLmMgKGluaXRfYmluY2xfbGlzdCk6ICBBZGQgYW5kIHVzZSBvYmpmaWxlIHBhcmFtZXRlci4KKwkqIGRieHJlYWQuYyAoZnJlZV9iaW5jbF9saXN0KTogIEFkZCBhbmQgdXNlIG9iamZpbGUgcGFyYW1ldGVyLgorCSogZGJ4cmVhZC5jIChjb21wYXJlX3BzeW1ib2xzKTogIFJlbW92ZTsgdXNlIGNvbW1vbiBzeW1maWxlLmMgdmVyc2lvbi4KKwkqIGRieHJlYWQuYyAoZW5kX3BzeW10YWIpOiAgQ29udmVydCB0byB1c2UgcGVyLW9iamZpbGUgZGF0YS4KKwkqIGR3YXJmcmVhZC5jIChERUZVTi9FWEZVTik6ICBSZW1vdmUgYWxsIHVzYWdlcy4gIFVzZSBQQVJBTVMgZm9yCisJcHJvdG90eXBlcy4KKwkqIGR3YXJmcmVhZC5jIChyZWNvcmRfbWlzY19mdW5jdGlvbik6ICBDaGFuZ2UgbmFtZSB0byByZWNvcmRfbWluaW1hbF8KKwlzeW1ib2wgYW5kIHVzZSBtaW5pbWFsIHN5bWJvbCB0YWJsZSB0aHJvdWdob3V0LgorCSogZHdhcmZyZWFkLmMgKGNvbXBhcmVfcHN5bWJvbHMpOiAgUmVtb3ZlOyB1c2UgY29tbW9uIHN5bXRhYi5jIHZlcnNpb24uCisJKiBkd2FyZnJlYWQuYzogIENvbnZlcnQgYWxsIHJlZmVyZW5jZXMgdG8gYnVpbHRpbiB0eXBlcyB0byB1c2UgdGhlIG5ldworCWxvb2t1cF9mdW5kYW1lbnRhbF90eXBlIGZ1bmN0aW9uLgorCSogZHdhcmZyZWFkLmMgKHJlYWRfZW51bWVyYXRpb24pOiAgQWRkIGFuZCB1c2Ugb2JqZmlsZSBwYXJhbWV0ZXIuCisJKiBlbGZyZWFkLmMgKERFRlVOL0VYRlVOKTogIFJlbW92ZSBhbGwgdXNhZ2VzLiAgVXNlIFBBUkFNUyBmb3IgcHJvdG8tCisJdHlwZXMuCisJKiBlbGZyZWFkLmMgKHJlY29yZF9taXNjX2Z1bmN0aW9uKTogIENvbnZlcnQgdG8gdXNlIHJlY29yZF9taW5pbWFsXworCXN5bWJvbC4KKwkqIGVsZnJlYWQuYyAoZWxmX3N5bXRhYl9yZWFkKTogIEFkZCBvYmpmaWxlIHBhcmFtZXRlci4KKwkqIGV2YWwuYzogIEFkZCBwcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMgYW5kIG1vdmUgc29tZSBkZWNscworCWFyb3VuZCB0byBhY2NvbW9kYXRlIHByb3RvdHlwZXMuCisJKiBleHBwcmludC5jOiAgQWRkIHByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gIENoYW5nZSByZWZlcmVuY2VzCisJdG8gbWlzYyBmdW5jdGlvbiB2ZWN0b3IgdG8gbWluaW1hbCBzeW1ib2wgdGFibGUuCisJKiBmaW5kdmFyLmMgKHJlYWRfbWVtb3J5IHVzYWdlcyk6ICBDYXN0IGFyZ3MuCisJKiBnZGJ0eXBlcy5oOiAgTmV3IGZpbGUsIHR5cGUgaW5mbyBmcm9tIHN5bWZpbGUuaCBhbmQgc3ltdGFiLmguCisJKiBnbWFsbG9jLmM6ICBVc2UgTk9BUkdTIHdoZXJlIHByb3RvdHlwZXMgdXNlZCBoYXJkd2lyZWQgdm9pZC4KKwkqIGdtYWxsb2MuYyAoQkxPQ0tTSVpFKTogIENvbnN0YW50IHRvIGJlIHNoaWZ0ZWQgaXMgdW5zaWduZWQuCisJKiBnbWFsbG9jLmg6ICBVc2UgTk9BUkdTIHdoZXJlIHByb3RvdHlwZXMgdXNlZCBoYXJkd2lyZWQgdm9pZC4KKwkqIGdvdWxkLXhkZXAuYzogIE1pbm9yIHdoaXRlc3BhY2UgY2hhbmdlLgorCSogaHAzMDB1eC14ZGVwLmMgKGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBSZW1vdmUgdW51c2VkIHJlZ25vIHZhci4KKwkqIGhwMzAwdXgteGRlcC5jIChzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMpOiAgUmV0dXJucyB2b2lkLgorCSogaHAzMDB1eC14ZGVwLmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogIFRha2VzIHVudXNlZCBhcmcgcmVnX2FkZHIuCisJKiBpMzg2LXN0dWIuYzogQWRkIHByb3RvdHlwZXMsIGNoYW5nZSAidm9sYXRpbGUiIHRvIE5PUkVUVVJOLgorCSogaTM4Ni10ZGVwLmM6IEFkZCBwcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuCisJKiBpMzg2LXRkZXAuYyAoY29kZXN0cmVhbV9maWxsLCBjb2Rlc3RyZWFtX3NlZWssIGNvZGVzdHJlYW1fcmVhZCwKKwlpMzg2X2dldF9mcmFtZV9zZXR1cCwgaTM4Nl9za2lwX3Byb2xvZ3VlKTogRXhwbGljaXRseSBkZWNsYXJlIHBhcmFtcworCXRoYXQgZGVmYXVsdGVkIHRvIGludC4KKwkqIGkzODYtdGRlcC5jIChpMzg2X2ZvbGxvd19qdW1wLCBpMzg2X2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncywKKwlpMzg2X3B1c2hfZHVtbXlfZnJhbWUpOglSZXR1cm5zIHZvaWQuCisJKiBpMzg2LXhkZXAuYyAoaTM4Nl9yZWdpc3Rlcl91X2FkZHIpOiAgRGVjbGFyZSBwYXJhbXMgdGhhdCBkZWZhdWx0IHRvCisJaW50IGFuZCBleHBsaWNpdGx5IGRlY2xhcmUgcmV0dXJuIHR5cGUgYXMgaW50LgorCSogaTM4Ny10ZGVwLmM6ICBNaW5vciBmb3JtYXR0aW5nIGNoYW5nZXMuCisJKiBpOTYwLXRkZXAuYyAobGVhZnByb2NfcmV0dXJuKTogIENvbnZlcnQgZnJvbSBtaXNjIGZ1bmN0aW9uIHZlY3RvcgorCXVzZSB0byBtaW5pbWFsIHN5bWJvbCB0YWJsZSB1c2UuCisJKiBpbmZjbWQuYzogIEFkZCBwcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuCisJKiBpbmZjbWQuYyAoY29udGludWVfY29tbWFuZCwgdW50aWxfbmV4dF9jb21tYW5kLCB1bnRpbF9jb21tYW5kLAorCXBhdGhfaW5mbywgcGF0aF9jb21tYW5kKTogIE1ha2Ugc3RhdGljLgorCSogaW5mY21kLmMgKHN0ZXBfMSwgdW50aWxfbmV4dF9jb21tYW5kKTogIENvbnZlcnQgZnJvbSBtaXNjIGZ1bmMKKwl2ZWN0b3IgdG8gbWluaW1hbCBzeW1ib2wgdGFibGUgdXNlLgorCSogaW5mbG93LmM6ICBBZGQgcHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLgorCSogaW5mcHRyYWNlLmMgKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBSZXR1cm5zIHZvaWQsIG5vdCBpbnQuCisJKiBsYW5ndWFnZS5jIChfaW5pdGlhbGl6ZV9sYW5ndWFnZSk6ICBVc2UgcHJvcGVyIG1lbWJlciBvZiBmdW5jdGlvbgorCXVuaW9uLgorCSogbTItZXhwLnk6ICBBZGQgcHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLCBjb252ZXJ0IG1pc2MgZnVuY3Rpb24KKwl2ZWN0b3IgdXNlcyB0byBtaW5pbWFsIHN5bWJvbCB0YWJsZSB1c2VzLgorCSogbTItZXhwLnkgKG1ha2VfcXVhbG5hbWUsIHl5ZXJyb3IpOiAgTWFrZSBzdGF0aWMuCisJKiBtMi1leHAueSAoX2luaXRpYWxpemVfbTJfZXhwKTogIENhbGwgaW5pdF90eXBlcyB3aXRoIE5VTEwgb2JqZmlsZS4KKwkqIG02OGstcGluc24uYzogIEFkZCBwcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuCisJKiBtNjhrLXBpbnNuLmMgKHByaW50X2luc24pOiAgQ2FzdCBhcmdzIHRvIHJlYWRfbWVtb3J5LgorCSogbTY4ay1waW5zbi5jIChmZXRjaF9hcmcpOiAgTWFrZSBwYXJhbWV0ZXIgJ2NvZGUnIGFuZCBpbnQuCisJKiBtNjhrLXN0dWIuYzogIEFkZCBwcm90b3R5cGVzLgorCSogbTg4ay1waW5zbi5jIChzcHJpbnRfYWRkcmVzcyk6ICBDb252ZXJ0IGZyb20gbWlzYyBmdW5jdGlvbiB2ZWN0b3IKKwl1c2UgdG8gbWluaW1hbCBzeW1ib2wgdGFibGUgdXNlLgorCSogbTg4ay14ZGVwLmMgKGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBUYWtlcyBhbiB1bnVzZWQgcGFyYW1ldGVyLgorCSogbTg4ay14ZGVwLmMgKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBSZXR1cm5zIHZvaWQuCisJKiBtYWNoMzg2LXhkZXAuYyAoZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzKTogIFRha2VzIGFuIHVudXNlZCBwYXJhbS4KKwkqIG1hY2gzODYteGRlcC5jIChzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMpOiAgUmV0dXJucyB2b2lkLgorCSogbWFjaDM4Ni14ZGVwLmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogIFRha2VzIGFuIHVudXNlZCBwYXJhbWV0ZXIuCisJKiBtYWluLmM6ICBBZGQgcHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLgorCSogbWFpbi5jIChyZXR1cm5fdG9fdG9wX2xldmVsKTogIElzIHR5cGUgTk9SRVRVUk4gKHZvbGF0aWxlKS4gIENhc3QKKwlsb25nam1wKCkgcmVzdWx0IHRvIChOT1JFVFVSTiB2b2lkKS4KKwkqIG1haW4uYyAoY2F0Y2hfZXJyb3JzKTogIFByb3RvdHlwZSB0aGUgJ2Z1bmMnIHBhcmFtZXRlci4KKwkqIG1haW4uYyAoZGlzY29ubmVjdCwgc3RvcF9zaWcsIGRvX25vdGhpbiwgZmxvYXRfaGFuZGxlcik6CisJVGFrZXMgYW4gdW51c2VkIGFyZy4KKwkqIG1haW4uYyAoZXhlY3V0ZV9jb21tYW5kKTogIENhbGwgdGhlIHJpZ2h0IG1lbWJlciBvZiB0aGUgZnVuYyB1bmlvbi4KKwkqIG1haW4uYyAoY29tbWFuZF9sb29wX21hcmtlciwgc3ltYm9sX2NvbXBsZXRpb25fZnVuY3Rpb24sCisJY29tbWFuZF9sb29wKTogIE1ha2Ugc3RhdGljLgorCSogbWFpbi5jIChjb21tYW5kX2xpbmVfaW5wdXQpOiAgTWFrZSBsaW5lbGVuZ3RoIHVuc2lnbmVkLCBjYXN0IGFyZworCXRvIGNvbW1hbmRfbGluZV9pbnB1dCgpLgorCSogbWFpbi5jIChhZGRfaW5mbywgYWRkX2NvbSk6ICBQcm90b3R5cGUgdGhlICdmdW4nIHBhcmFtZXRlci4KKwkqIG1haW4uYyAoaW5pdGlhbGl6ZV9tYWluKTogIENhbGwgcmlnaHQgbWVtYmVyIG9mIGZ1bmN0aW9uIHVuaW9uLgorCSogbWNoZWNrLmMgKE5PQVJHUyk6ICBDaGFuZ2UgaGFyZHdpcmVkIHZvaWQgaW4gcHJvdG90eXBlcyB0byBOT0FSR1MuCisJKiBtZW0tYnJlYWsuYzogIEluY2x1ZGUgc3ltdGFiLmgKKwkqIG1pcHMteGRlcC5jIChmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMpOiAgVGFrZXMgdW51c2VkIHBhcmFtLgorCSogbWlwcy14ZGVwLmMgKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBSZXR1cm5zIHZvaWQuCisJKiBtaXBzcmVhZC5jIChtaXBzY29mZl9zeW1maWxlX3JlYWQpOiAgQ2hhbmdlIGZyb20gbWlzYyBmdW5jdGlvbiB2ZWN0b3IKKwl1c2UgdG8gbWluaW1hbCBzeW1ib2wgdGFibGUgdXNlLgorCSogbWlwc3JlYWQuYyAoc3ltYm9sX29ic3RhY2sgdXNhZ2VzKTogIENvbnZlcnQgYWxsIHRvIHVzZSBwZXItb2JqZmlsZQorCXZlcnNpb24uCisJKiBtaXBzcmVhZC5jIChtYWtlX3R5cGUpOiAgUmVtb3ZlLCBjb252ZXJ0IHVzYWdlcyB0byBpbml0X3R5cGUuCisJKiBtaXBzcmVhZC5jIChfaW5pdGlhbGl6ZV9taXBzcmVhZCk6ICBDYWxsIGluaXRfdHlwZSB3aXRoIE5VTEwgb2JqZmlsZS4KKwkqIG5pbmR5LXRkZXAuYyAobmluZHlfZnJhbWVfY2hhaW5fdmFsaWQpOiAgQ29udmVydCBmcm9tIG1pc2MgZnVuY3Rpb24KKwl2ZWN0b3IgdXNlIHRvIG1pbmltYWwgc3ltYm9sIHRhYmxlIHVzZS4KKwkqIHBhcnNlLmM6ICBBZGQgcHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLgorCSogcGFyc2UuYyAoeHJlYWxsb2MgdXNhZ2VzKTogIENhc3QgYXJncy4KKwkqIHBhcnNlLmMgKHByZWZpeGlmeV9leHByZXNzaW9uLCBsZW5ndGhfb2Zfc3ViZXhwKTogIE1ha2Ugc3RhdGljLgorCSogcGFyc2VyLWRlZnMuaCAoUEFSU0VSX0RFRlNfSCk6ICBEZWZpbmUgd2hlbiBmaXJzdCBpbmNsdWRlZC4KKwkqIHBhcnNlci1kZWZzLmg6ICBDb252ZXJ0IGZ1bmN0aW9uIGRlY2xzIHRvIHByb3RvdHlwZSBmb3JtLgorCSogcGFydGlhbC1zdGFiLmg6ICBDb252ZXJ0IGZyb20gbWlzYyBmdW5jdGlvbiB2ZWN0b3IgdXNlIHRvIG5ldyBtaW5pbWFsCisJc3ltYm9sIHRhYmxlIHVzZS4KKwkqIHBhcnRpYWwtc3RhYi5oIChnbG9iYWxfcHN5bWJvbHMsIHN0YXRpY19wc3ltYm9scyB1c2FnZXMpOiAgUmVmZXJlbmNlCisJdGhlIHBlci1vYmpmaWxlIGNvcGllcy4KKwkqIHByaW50Y21kLmM6ICBBZGQgcHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgTW92ZSBzb21lIHN0cnVjdAorCWRlZmluaXRpb25zIGFyb3VuZCB0byBhY2NvbW9kYXRlIHByb3RvdHlwZXMuCisJKiBwcmludGNtZC5jIChkZWNvZGVfZm9ybWF0KTogIE1ha2Ugc3RhdGljLCBjaGFuZ2UgYXJncyBvZm9ybWF0IGFuZAorCW9zaXplIHRvIGludCBmcm9tIGNoYXIuCisJKiBwcmludGNtZC5jIChwcmludF9mb3JtYXR0ZWQpOiAgQ2hhbmdlICdmb3JtYXQnIGFuZCAnc2l6ZScgdG8gaW50LgorCSogcHJpbnRjbWQuYyAocHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCk6ICBDaGFuZ2UgYXJnICdmb3JtYXQnIHRvIGludC4KKwkqIHByaW50Y21kLmMgKHByaW50X2FkZHJlc3Nfc3ltYm9saWMpOiAgQ29udmVydCBmcm9tIG1pc2MgZnVuY3Rpb24KKwl2ZWN0b3IgdXNlIHRvIG1pbmltYWwgc3ltYm9sIHRhYmxlIHVzZS4KKwkqIHByaW50Y21kLmMgKGFkZHJlc3NfaW5mbyk6ICBDb252ZXJ0IGZyb20gbWlzYyBmdW5jdGlvbiB2ZWN0b3IgdXNlCisJdG8gbWluaW1hbCBzeW1ib2wgdGFibGUgdXNlLgorCSogcHJpbnRjbWQuYyAoZGVsZXRlX2Rpc3BsYXksIGVuYWJsZV9kaXNwbGF5LCBkaXNhYmxlX2Rpc3BsYXlfY29tbWFuZCk6CisJTWFrZSBzdGF0aWMuCisJKiBwcm9jZnMuYyAoRVhGVU4vREVGVU4pOiAgUmVtb3ZlIGFsbCB1c2FnZXMsIGNvbnZlcnQgdG8gUEFSQU1TLgorCSogcHJvY2ZzLmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogIEFkZCB1bnVzZWQgcGFyYW0gcmVnX2FkZHIuCisJKiBweXIteGRlcC5jIChmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMpOiAgQWRkIHVudXNlZCBwYXJhbSByZWduby4KKwkqIHB5ci14ZGVwLmMgKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBSZXR1cm5zIHZvaWQuCisJKiByZW1vdGUtbW0uYyAobW1fbG9hZCk6ICBzeW1ib2xfZmlsZV9hZGQgcmV0dXJuIHZhbHVlIHVudXNlZC4KKwkqIHJlbW90ZS1uaW5keS5jOiAgTWlub3IgZm9ybWF0IGNoYW5nZS4KKwkqIHJlbW90ZS12eC5jICh2eF9sb2FkX2NvbW1hbmQpOiAgc3ltYm9sX2ZpbGVfYWRkIHJlc3VsdCB1bnVzZWQuCisJKiByczYwMDAteGRlcC5jIChmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMpOiAgQWRkIHVudXNlZCBwYXJhbSByZWduby4KKwkqIHJzNjAwMC14ZGVwLmMgKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBSZXR1cm5zIHZvaWQuCisJKiByczYwMDAteGRlcC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6ICBhZGQgdW51c2VkIHBhcmFtIHJlZ19hZGRyCisJKiByczYwMDAteGRlcC5jIChhaXhjb2ZmX3JlbG9jYXRlX3N5bXRhYik6ICBDb252ZXJ0IGZyb20gbWlzYyBmdW5jdGlvbgorCXZlY3RvciB1c2UgdG8gbWluaW1hbCBzeW1ib2wgdGFibGUgdXNlLgorCSogc29saWIuYzogIEFkZCBwcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuCisJKiBzb2xpYi5jIChzb2xpYl9hZGRfY29tbW9uX3N5bWJvbHMsIGxvY2F0ZV9iYXNlKTogIENvbnZlcnQgZnJvbSBtaXNjCisJZnVuY3Rpb24gdmVjdG9yIHVzZSB0byBtaW5pbWFsIHN5bWJvbCB0YWJsZSB1c2UuCisJKiBzb2xpYi5jIChFWEZVTi9ERUZVTik6ICBSZW1vdmUgYWxsIHVzYWdlcywgY29udmVydCB0byBQQVJBTVMuCisJKiBzb2xpYi5jIChmaW5kX3NvbGliLCBzaGFyZWRfbGlicmFyeV9jb21tYW5kKTogIE1ha2Ugc3RhdGljCisJKiBzb2xpYi5jIChyZWFkX21lbW9yeSwgd3JpdGVfbWVtb3J5IHVzYWdlcyk6ICBDYXN0IGFyZ3MuCisJKiBzb2xpYi5jIChzcGVjaWFsX3N5bWJvbF9oYW5kbGluZyk6ICBBZGQgZnVuY3Rpb24KKwkqIHNvdXJjZS5jOiAgQWRkIHByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4KKwkqIHNvdXJjZS5jIChzZWxlY3Rfc291cmNlX3N5bXRhYik6ICBDb252ZXJ0IHRvIHNjYW4gb2JqZmlsZXMuCisJKiBzb3VyY2UuYyAob3Blbl9zb3VyY2VfZmlsZSk6ICBNYWtlIHN0YXRpYy4KKwkqIHNvdXJjZS5jICh4cmVhbGxvYyB1c2FnZXMpOiAgQ2FzdCBhcmdzLgorCSogc291cmNlLmMgKHNvdXJjZV9saW5lX2NoYXJwb3MpOiAgaWZkZWYgb3V0LCB1bnVzZWQuCisJKiBzb3VyY2UuYyAoZ2V0X2ZpbGVuYW1lX2FuZF9jaGFycG9zKTogIE1ha2Ugc3RhdGljLgorCSogc3RhY2suYzogIEFkZCBwcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuCisJKiBzdGFjay5jIChwcmludF9mcmFtZV9pbmZvLCBmcmFtZV9pbmZvKTogIENvbnZlcnQgZnJvbSBtaXNjIGZ1bmN0aW9uCisJdmVjdG9yIHVzZSB0byBtaW5pbWFsIHN5bWJvbCB0YWJsZSB1c2UuCisJKiBzeW1maWxlLmM6ICBBZGQgcHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLgorCSogc3ltZmlsZS5jIChjb21wYXJlX3N5bWJvbHMpOiAgTWFrZSBhcmdzIGNvbnN0IFBUUidzLgorCSogc3ltZmlsZS5jIChjb21wYXJlX3BzeW1ib2xzLCBzb3J0X3BzdF9zeW1ib2xzKSBhZGQuCisJKiBzeW1maWxlLmMgKHNvcnRfYWxsX3N5bXRhYl9zeW1zKTogIFNjYW4gb2JqZmlsZSBsaXN0LgorCSogc3ltZmlsZS5jIChvYnNhdmVzdHJpbmcpOiAgQWRkIG9iamZpbGUgcGFyYW1ldGVyLgorCSogc3ltZmlsZS5jIChpbml0X21pc2NfYnVuY2hlcywgcHJpbV9yZWNvcmRfbWlzY19mdW5jdGlvbiwKKwljb21wYXJlX21pc2NfZnVuY3Rpb25zLCBkaXNjYXJkX21pc2NfYnVuY2hlcywgY29uZGVuc2VfbWlzY19idW5jaGVzLAorCXNvcnRfbWlzY19mdW5jdGlvbl92ZWN0b3IsIGNvbXBhY3RfbWlzY19mdW5jdGlvbl92ZWN0b3IpOiBSZW1vdmUKKwkqIHN5bWZpbGUuYyAoc3ltYm9sX2ZpbGVfYWRkX2RpZ2VzdGVkKTogIEFkZCBmdW5jdGlvbi4KKwkqIHN5bWZpbGUuYyAoc3ltYm9sX2ZpbGVfYWRkKTogIFJldHVybnMgc3RydWN0IG9iamZpbGUgKi4KKwkqIHN5bWZpbGUuYyAoc3ltYm9sX2ZpbGVfY29tbWFuZCk6ICBNb2RpZnkgZm9yIHN0YXRlIGZpbGUgdXNlLgorCSogc3ltZmlsZS5jIChzeW1maWxlX29wZW4pOiAgQWRkIHBhcmFtZXRlciAiZHVtcGFibGUiLgorCSogc3ltZmlsZS5jIChhbGxvY2F0ZV9vYmpmaWxlLCBmcmVlX29iamZpbGUpOiAgTW92ZWQgdG8gb2JqZmlsZXMuYworCSogc3ltZmlsZS5jIChsb2FkX2NvbW1hbmQsIGFkZF9zeW1ib2xfZmlsZV9jb21tYW5kKTogIE1ha2Ugc3RhdGljLgorCSogc3ltZmlsZS5jIChmaWxsX2luX3ZwdHJfZmllbGRubyk6ICBNb3ZlZCB0byBnZGJ0eXBlcy5jCisJKiBzeW1maWxlLmMgKHJpbmRleCB1c2FnZXMpOiAgQ29udmVydGVkIHRvIHN0cnJjaHIuCisJKiBzeW1maWxlLmMgKGFsbG9jYXRlX3BzeW10YWIpOiAgTmV3CisJKiBzeW1maWxlLmMgKGZyZWVfbmFtZWRfc3ltdGFicyk6ICBJZmRlZiBvdXQgY29kZSB0aGF0IG5lZWRzIHRvIGJlCisJY29udmVydGVkIHRvIG1pbmltYWwgc3ltYm9sIHRhYmxlIHVzYWdlLCBidXQgbm8gb2J2aW91cyBjb252ZXJzaW9uLgorCSogc3ltZmlsZS5jIChmcmVlX2FsbF9zeW10YWJzKTogIFJlbW92ZS4KKwkqIHN5bWZpbGUuYyAoX2luaXRpYWxpemVfc3ltZmlsZSk6ICBVc2UgcGVyLW9iamZpbGUgaW5mby4KKwkqIHN5bWZpbGUuaDogIFJld29yayB0aGUgb2JqZmlsZSBzdHJ1Y3R1cmUgdG8gYWRkIHBlci1vYmpmaWxlIGRhdGEKKwlvYmplY3RzIChwc3ltYm9sX29ic3RhY2ssIHN5bWJvbF9vYnN0YWNrLCB0eXBlX29ic3RhY2ssCisJZ2xvYmFsX3BzeW1ib2xzLCBzdGF0aWNfcHN5bWJvbHMsIG1zeW1ib2xzLCBtaW5pbWFsX3N5bWJvbF9jb3VudCwKKwlmdW5kYW1lbnRhbF90eXBlcywgbWFsbG9jLCByZWFsbG9jLCBmcmVlLCB4bWFsbG9jLCB4cmVhbGxvYywgZXRjKS4KKwlBZGQgcHJvdG90eXBlcyB0byBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCisJKiBzeW1tLXRkZXAuYyAoc3ltbWV0cnlfZXh0cmFjdF9yZXR1cm5fdmFsdWUpOiAgQ29udmVydCBmcm9tIG1pc2MKKwlmdW5jdGlvbiB2ZWN0b3IgdXNhZ2UgdG8gbWluaW1hbCBzeW1ib2wgdGFibGUgdXNhZ2UuCisJKiBzeW1taXNjLmMgKERFVl9UVFkpOiAgRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgorCSogc3ltbWlzYy5jOiAgQWRkIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMuCisJKiBzeW1taXNjLmMgKGR1bXBfb2JqZmlsZSwgZHVtcF9tc3ltYm9scywgZHVtcC1zeW10YWIsIHByaW50X3N5bXMsCisJcHJpbnRwc3ltc19jb21tYW5kLCBwcmludF9vYmpmaWxlcywgcHJpbnRfb2JqZmlsZXNfY29tbWFuZCk6CisJUmV3b3JrIHRvIHVzZSBpdGVyYXRlX292ZXJfKgorCSogc3ltdGFiLmM6ICBBZGQgcHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLgorCSogc3ltdGFiLmMgKGxvb2t1cF9zeW10YWJfMSk6ICBDb252ZXJ0IHRvIGxvb2sgdGhyb3VnaCBvYmpmaWxlcy4KKwkqIHN5bXRhYi5jIChsb29rdXBfcGFydGlhbF9zeW10YWIpOiAgU2NhbiB0aHJvdWdoIG9iamZpbGVzLgorCSogc3ltdGFiLmMgKGxvb2t1cF9wcmltaXRpdmVfdHlwZW5hbWUsIGxvb2t1cF90eXBlbmFtZSwgbG9va3VwXworCXVuc2lnbmVkX3R5cGVuYW1lLCBsb29rdXBfc3RydWN0LCBsb29rdXBfdW5pb24sIGxvb2t1cF9lbnVtLAorCWxvb2t1cF90ZW1wbGF0ZV90eXBlLCBsb29rdXBfc3RydWN0X2VsdF90eXBlLCBsb29rdXBfcG9pbnRlcl90eXBlLAorCWxvb2t1cF9yZWZlcmVuY2VfdHlwZSwgbG9va3VwX21lbWJlcl90eXBlLCBhbGxvY2F0ZV9zdHViX21ldGhvZCwKKwljaGVja19zdHViX21ldGhvZCwgY3JlYXRlX2FycmF5X3R5cGUsIHNtYXNoX3RvX21lbWJlcl90eXBlLCk6CisJTW92ZWQgdG8gZ2RidHlwZXMuYworCSogc3ltdGFiLmMgKGxvb2t1cF9zeW1ib2wpOiAgU29tZSBhcmdzIGFyZSBjb25zdC4KKwkqIHN5bXRhYi5oOiBBbGwgdHlwZSByZWxhdGVkIGRlZnMgYW5kIHN0cnVjdHMgbW92ZWQgdG8gZ2RidHlwZXMuaAorCSogc3ltdGFiLmg6IENvbnZlcnQgZGVjbHMgdG8gcHJvdG90eXBlcy4KKwkqIHRhcmdldC5jIChub3Byb2Nlc3MpOiAgTWFrZSBzdGF0aWMuCisJKiB0YXJnZXQuaDogIENoYW5nZSBkZWNsJ3MgdG8gcHJvdG90eXBlcy4KKwkqIHRtLXN1bm9zLmg6IChDTEVBUl9TT0xJQiwgU09MSUJfQURELCBTT0xJQl9DUkVBVEVfSU5GRVJJT1JfSE9PSywKKwlESVNBQkxFX1VOU0VUVEFCTEVfQlJFQUspIE1vdmVkIHRvIHNvbGliLmguCisJKiB1dGlscy5jIChfaW5pdGlhbGl6ZV91dGlscyk6ICBVc2UgY29ycmVjdCBtZW1iZXIgb2YgZnVuY3Rpb24gdW5pb24uCisJKiB2YWxhcml0aC5jOiAgaW5jbHVkZSBnZGJ0eXBlcy5oCisJKiB2YWxvcHMuYzogaW5jbHVkZSBnZGJ0eXBlcy5oLCBhZGQgcHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLgorCSogdmFsb3BzLmMgKHZhbHVlX3B1c2gsIHZhbHVlX2FyZ19wdXNoLCBmaW5kX2Z1bmN0aW9uX2FkZHIpOgorCU1ha2Ugc3RhdGljLgorCSogdmFsb3BzLmMgKHZhbHVlX3N0cmluZyk6ICBDb252ZXJ0IGZyb20gbWlzYyBmdW5jdGlvbiB2ZWN0b3IgdXNlCisJdG8gbWluaW1hbCBzeW1ib2wgdGFibGUgdXNlLgorCSogdmFsb3BzLmMgKGNoZWNrX2ZpZWxkX2luKTogIE1ha2UgYXJnIGNvbnN0LgorCSogdmFscHJpbnQuYzogIEFkZCBwcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuCisJKiB2YWxwcmludC5jIChwcmludF9zdHJpbmcpOiAgTWFrZSBzdGF0aWMKKwkqIHZhbHByaW50LmMgKHZhbHVlX3ByaW50LCB2YWxfcHJpbnRfZmllbGRzLCB2YWxfcHJpbnQpOiBNYWtlIGFyZyBpbnQuCisJKiB2YWx1ZXMuYzogIEFkZCBwcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuCisJKiB2YWx1ZXMuYyAodmFsdWVfaGVhZG9mKTogIENvbnZlcnQgZnJvbSBtaXNjIGZ1bmN0aW9uIHZlY3RvciB0bworCW1pbmltYWwgc3ltYm9sIHRhYmxlLgorCSogeGNvZmZleGVjLmM6ICBBZGQgcHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLgorCSogeGNvZmZleGVjLmMgKGV4ZWNfY2xvc2UsIGZpbGVfY29tbWFuZCwgYWRkX3RvX3NlY3Rpb25fdGFibGUpOgorCU1ha2Ugc3RhdGljLgorCSogeGNvZmZleGVjLmMgKHJlbG9jYXRlX21pbmltYWxfc3ltYm9sKTogIEFkZC4KKwkqIHhjb2ZmcmVhZC5jIChwYXRjaF9ibG9ja19zdGFicyk6ICBNb3ZlZCB0byBidWlsZHN5bXMuYy4KKwkqIHhjb2ZmcmVhZC5jOiBBZGQgcHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLgorCSogeGNvZmZyZWFkLmMgKHNvcnRfc3ltcyk6ICBDb252ZXJ0IHRvIHNjYW4gb2JqZmlsZXMuCisJKiB4Y29mZnJlYWQuYyAocmVhZF94Y29mZl9zeW10YWIpOiAgTWFrZSBzdGF0aWMuCisJKiB4Y29mZnJlYWQuYyAodmFyaW91cyk6ICBSZXBsYWNlIHJlZmVyZW5jZXMgdG8gYnVpbHRpbiB0eXBlcyB3aXRoCisJY2FsbHMgdG8gbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUuICBSZXBsYWNlIHJlZmVyZW5jZXMgdG8gc3ltYm9sX29ic3RhY2sKKwlhbmQgcHN5bWJvbF9vYnN0YWNrIHdpdGggcG9pbnRlcnMgdG8gdGhlIHBlci1vYmpmaWxlIGNvcGllcy4KKwkqIHhjb2ZmcmVhZC5jIChkdW1wX2xpbmV0YWJsZSwgZHVtcF90eXBlLCBkdW1wX3N5bWJvbCwgZHVtcF9uYW1lc3BhY2UsCisJZHVtcF9ibG9jaywgZHVtcF9ibG9ja3ZlY3RvciwgZHVtcF9sYXN0X3N5bXRhYiwgZHVtcF9zeW10YWJzKToKKwlNYWtlIHN0YXRpYy4KKwkqIHhjb2ZmcmVhZC5jIChpbml0X3N0cmluZ3RhYik6ICBBZGQgb2JqZmlsZSBwYXJhbWV0ZXIuCisJKiBnZGJ0eXBlcy5jOiBOZXcgZmlsZQorCSogbWluc3ltcy5jOiBOZXcgZmlsZQorCSogbW1hcC1hbGxvYy5jOiBOZXcgZmlsZQorCSogbW1hcC1zYnJrLmM6IE5ldyBmaWxlCisJKiBvYmpmaWxlcy5jOiBOZXcgZmlsZQorCSogc3RhdGUuYzogTmV3IGZpbGUKKwkqIHN0YXRlLmg6IE5ldyBmaWxlCisKK0ZyaSBGZWIgMjEgMTc6Mjk6NTQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIENoZWNrIGluIEZyZWQgRmlzaCdzIGNoYW5nZXMgaW4gdGhlc2UgbW9kdWxlcy4gIEZyZWQKKwl3aWxsIG1ha2UgQ2hhbmdlTG9nIGVudHJpZXMgZm9yIGFsbCBvZiB0aGVtLiAgVXBkYXRlIFZFUlNJT04KKwl0byA0LjQuMi4KKworVGh1IEZlYiAyMCAxODoxMDoxNyAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogdG0tc3BhcmMuaCwgdG0tc3lzdjQuaCwgc29saWIuaDogIE1vdmUgc2hhcmVkIGxpYiBkZWZpbml0aW9ucworCWludG8gc29saWIuaC4KKwkqIHNwYXJjLXBpbnNuLmMsIHNwYXJjLXRkZXAuYywgc3RhbmRhbG9uZS5jLCBzdW4zLXhkZXAuYywKKwlzdW4zODYteGRlcC5jLCBzeW1tLXhkZXAuYywgdGFyZ2V0LmMsIHVsdHJhMy14ZGVwLmMsIHV0aWxzLmMsCisJdmFsdWUuaDogUHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9uczsgbGludC4KKwkqIGdkYnR5cGVzLmg6ICBFbXB0eSBmaWxlIHRvIGVhc2UgdHJhbnNpdGlvbi4KKworVGh1IEZlYiAyMCAxNjo0MzoxMyAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogZW52aXJvbi5oLCBleHByZXNzaW9uLmgsIGZyYW1lLmgsIGdkYmNtZC5oLCBnZGJjb3JlLmgsCisJaW5mZXJpb3IuaCwgbGFuZ3VhZ2UuaCwgc2lnbmFtZS5oLCB0YXJnZXQuaCwgdGVybWluYWwuaCwgCisJdG0tNjhrLmgsIHRtLWkzODZ2LmgsIHRtLXNwYXJjLmgsIHRtLXN1bjM4Ni5oLCB0bS1zeW1tZXRyeS5oLAorCXhtLWkzODZ2LmgsIHhtLXNwYXJjLmg6IFByb3RvdHlwZXMgZm9yIGFsbCBleHRlcm5hbCBmdW5jdGlvbnMuCisJTGludC4KKwkqIGNvcmUuYywgZXhlYy5jLCBpbmZydW4uYywgaW5mdGFyZy5jLCBsYW5ndWFnZS5jLCByZW1vdGUuYywKKwlzaWduYW1lLmMsIHNwYXJjLXhkZXAuYzogUHJvdG90eXBlcyBmb3IgYWxsIHN0YXRpYyBmdW5jdGlvbnMuCisJTGludC4KKwkqIGNvcmUuYywgZXZhbC5jLCBleGVjLmMsIGluZnRhcmcuYywgcmVtb3RlLWFkYXB0LmMsIHJlbW90ZS1lYi5jLAorCXJlbW90ZS1obXMuYywgcmVtb3RlLW1tLmMsIHJlbW90ZS1uaW5keS5jLCByZW1vdGUtdnguYywgcmVtb3RlLmMsCisJdGFyZ2V0LmMsIHRhcmdldC5oLCB2YWxhcml0aC5jLCB2YWxvcHMuYywgdmFsdWUuaCwgeGNvZmZleGVjLmM6CisJUmVtb3ZlIHRvX2NhbGxfZnVuY3Rpb24gYW5kIHRhcmdldF9jYWxsX2Z1bmN0aW9uLCBzaW5jZSBpdAorCWFsd2F5cyBjYWxscyB0aGUgc2FtZSB0aGluZyAoY2FsbF9mdW5jdGlvbl9ieV9oYW5kKS4KKwkqIGNvcmUuYywgZXhlYy5jLCBzb2xpYi5jOiAgUmVuYW1lIHRhcmdldF9vcHMgc2VjdGlvbnMgPT4KKwl0b19zZWN0aW9ucywgZXRjLgorCSogaW5mY21kLmMsIGluZmxvdy5jLCBpbmZwdHJhY2UuYywgaW5mcnVuLmMsIG1haW4uYywgdGFyZ2V0LmMsCisJdGFyZ2V0Lmg6ICB0YXJnZXRfa2lsbCB0YWtlcyBubyBhcmdzLgorCSogbGFuZ3VhZ2UuYyAobGFuZ3VhZ2VfaW5mbyk6ICBTY2FmZm9sZGluZyB0byBhbGxvdyBicmllZmVyCisJbWVzc2FnZXMgd2hlbiB0aGUgY3VycmVudCBsYW5ndWFnZSBjaGFuZ2VzLiAgRklYTUUuCisJKiB4bS1hbWl4LmgsIHhtLWkzODZ2NC5oLCB4bS1zdHJhdHVzLmg6IERlZmluZSBOT1JFVFVSTiB0byBhdm9pZAorCWNvbXBsYWludHMgYWJvdXQgdm9sYXRpbGUgZnVuY3Rpb25zLgorCSogeG0tc3lzdjQuaCAoSEFWRV9NTUFQKTogIERlZmluZS4KKworVGh1IEZlYiAyMCAwOTowNDoxOCAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogZGVmcy5oOiAgSW5jbHVkZSBhbnNpZGVjbC5oIGFuZCBQQVJBTVMgbWFjcm8uICBVc2UgUEFSQU1TCisJdG8gbWFrZSBwcm90b3R5cGVzIGZvciBhbGwgZnVuY3Rpb25zIGRlY2xhcmVkIGhlcmUuCisJKiBjcGx1cy1kZW0uYzogIEF2b2lkIGRlY2xhcmluZyB4bWFsbG9jIGFuZCB4cmVhbGxvYy4KKwkqIGMtZXhwLnk6ICBSZW5hbWUgU0lHTkVELCBPUiwgYW5kIEFORCB0byBhdm9pZCBjb25mbGljdC4KKwkqIGVudmlyb24uYzogIEluY2x1ZGUgPHN0ZGlvLmg+IGJlZm9yZSBkZWZzLmguICBNaW5vciBjbGVhbnVwLgorCSogaWVlZS1mbG9hdC5oOiAgVXNlIFBBUkFNUyBmb3IgcHJvdG90eXBlczsgbWFrZSBzb21lIHBhcmFtcyBjb25zdC4KKwkqIGllZWUtZmxvYXQuYywgdmFsYXJpdGguYzogIEluY2x1ZGUgPHN0ZGlvLmg+LiAgTGludC4gIGIqPT5tZW0qLgorCSogbTItZXhwLnk6ICBSZW1vdmUgdW51c2VkIENPTlNUOyBSZW5hbWUgT1IgYW5kIEFORC4KKwkqIHV0aWxzLmM6ICBBdm9pZCBkZWNsYXJpbmcgbWFsbG9jIGFuZCByZWFsbG9jLiAgTGludC4KKwkocmVxdWVzdF9xdWl0KTogIEFjY2VwdCBzaWduYWwtbnVtYmVyIHBhcmFtZXRlci4KKworTW9uIEZlYiAxNyAwNzoxMzoyNyAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogZHdhcmZyZWFkLmMgKHByb2Nlc3NfZGllcyk6ICBBZGQgY2FzZSB0byBoYW5kbGUgVEFHX3BvaW50ZXJfdHlwZQorCURJRSdzLiAgQWRkIG5ldyBmdW5jdGlvbiByZWFkX3RhZ19wb2ludGVyX3R5cGUoKSB0byByZWFkIHRoZW0uCisKKwkqIGR3YXJmcmVhZC5jIChkd2FyZl9yZWFkX2FycmF5X3R5cGUsIHJlYWRfc3Vicm91dGluZV90eXBlKToKKwlXaGVuIGNyZWF0aW5nIGEgbmV3IHVzZXIgZGVmaW5lZCB0eXBlLCBjaGVjayB0byBzZWUgaWYgYSBwYXJ0aWFsCisJdHlwZSBhbHJlYWR5IGV4aXN0cywgYW5kIGlmIHNvLCBiYXNoIGl0IHRvIGZpdC4KKworRnJpIEZlYiAxNCAxOTowMDoxNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogY29mZnJlYWQuYyAoZGVjb2RlX2Jhc2VfdHlwZSk6ICBQYXNzIGxvbmcsIG5vdCB1bmlvbi4KKwlGaXggYnkgRXJpYyBWYWxldHRlLCBldkBjaG9ydXMuZnIuCisKK1RodSBGZWIgMTMgMTc6MTQ6MjggMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIGVsZnJlYWQuYyAoZWxmX3N5bXRhYl9yZWFkKTogIEZpeCBjb2RlIHRvIGNvcnJlY3RseSB0cmFjaworCWNoYW5nZXMgaW4gYmZkIGZvciBhYnNvbHV0ZSBzeW1ib2xzLgorCitUaHUgRmViIDEzIDEyOjQzOjI5IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIHhtLXZheGJzZC5oOiAgQ2xvc2Ugb2ZmIGNvbW1lbnQuCisKK1RodSBGZWIgMTMgMDc6NDU6MTkgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIHhtLXN5c3Y0Lmg6ICBEZWZpbmUgTkVFRF9QT1NJWF9TRVRQR0lELgorCitGcmkgRmViICA3IDExOjUxOjEyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBtaXBzLXRkZXAuYyAobWlwc19wcmludF9yZWdpc3RlcnMpOiAgUHJpbnQgY29ycmVjdCByZWdpc3RlcgorCW51bWJlciBmb3IgZG91YmxlIHBzZXVkby1yZWdpc3RlcnMuCisKK0ZyaSBGZWIgIDcgMDc6NTY6MDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGJ1aWxkc3ltLmMgKHJlYWRfc3RydWN0X3R5cGUpOiAgQXZvaWQgZG91YmxlLWJ1bXAgb2YgcGFyc2UgcHRyCisJaW4gdGhlIG9wJDo6T1BFUkFUT1IuIGNhc2UuICBGcm9tIFN0ZXZlbiBNY0Nhbm5lLAorCTxtY2Nhbm5lQGhvcnNlLmVlLmxibC5nb3Y+LgorCisJKiBleGVjLmMgKHNldF9zZWN0aW9uX25hbWUpOiAgUGFzcyBhcmcgdG8gZXhlY19maWxlc19pbmZvOworCW9ubHkgY2FsbCBpdCBpZiBpbnRlcmFjdGl2ZS4gIEZyb20gRnJhbmNpcyBLYXV0aCA8ZmtAdHYudHYudGVrLmNvbT4uCisKK1RodSBGZWIgIDYgMTc6NDE6MzIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIG1haW4uYyAocHJpbnRfZ2RiX3ZlcnNpb24pOiAgQ29weXJpZ2h0IG1zZzogb25seSB0aGlzIHllYXIuCisJKGNkX2NvbW1hbmQpOiAgQXZvaWQgY2hhbmdpbmcgY3VycmVudF9kaXJlY3Rvcnkgb24gZXJyb3IuCisKK1RodSBGZWIgIDYgMTU6MTQ6MDEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6ICBIYW5kbGUgZGVwZW5kZW5jaWVzCisJYmV0d2VlbiBwYXJ0aWFsIHN5bWJvbCB0YWJsZXMgKHdoZW4gbm90IGRvaW5nIHN0YWJzLWluLWVjb2ZmKS4KKwkoVGhpcyB1c2VkIHRvIGJlIGhhbmRsZWQgYnkgcGFyc2VfZmRyLCBidXQgcGFyc2VfZmRyIHdhcworCWluY29tcGF0aWJsZSB3aXRoIGhhbmRsaW5nIHN0YWJzLWluLWVjb2ZmLCBzbyB0aGUgY29kZQorCXdhcyByZS13cml0dGVuIHRvIG5vdCB1c2UgcGFyc2VfZmRyLiAgVW5mb3J0dW5hdGVseSwKKwl0aGUgbG9naWMgdG8gaGFuZGxlIGRlcGVuZGVuY2llcyB3YXMgb3Zlcmxvb2tlZC4pCisKK1RodSBGZWIgIDYgMTE6NTE6MzkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIGNvZmZyZWFkLmMgKHJlYWRfZW51bV90eXBlKTogVXNlIHRoZSBzaXplIG9mIGEgdGFyZ2V0IGludCB3aGVuCisJZGVzY3JpYmluZyBlbnVtLgorCSogZGVmcy5oOiBhZGRlZCBuZXcgI2RlZmluZSBmb3IgVEFSR0VUX1BUUl9CSVQsIGRlZmF1bHRzIHRvIHNpemUKKwlvZiB0YXJnZXQgaW50LgorCSogaDgzMDAtdGRlcC5jLCByZW1vdGUtaG1zLmMsIHRtLWg4MzAwLmg6IHRvbyBtYW55IGNoYW5nZXMgdG8gY291bnQKKwkqIHN5bXRhYi5jIChsb29rdXBfcmVmZXJlbmNlX3R5cGUsIGxvb2t1cF9wdHJfdHlwZSk6IHVzZQorCVRBUkdFVF9QVFJfQklUIHRvIGRldGVybWluZSBzaXplIG9mIGEgcG9pbnRlcgorCSogdmFsdWVzLmMgKHVucGFja19sb25nKTogd2hlbiB1bnBhY2tpbmcgYSBSRUYgb3IgYSBQVFIgZG9uJ3QKKwlhc3N1bWUgdGhlIHNpemUgb2YgdGhlIHR5cGUuCisKK1dlZCBGZWIgIDUgMjI6Mjk6NTkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3N5bWJvbCk6ICBBdm9pZCBjbG9iYmVyaW5nIGVudW0gcG9pbnRlciB3aGVuCisJbG9va2luZyBhdCBpdHMgbWVtYmVycy4gIEltcHJvdmUgZ3Vlc3MgYmV0d2VlbiBzdHJ1Y3QgYW5kIHVuaW9uLAorCW9ubHkgYXNzdW1pbmcgdW5pb24gaWYgbXVsdGlwbGUgbWVtYmVycyBoYXZlIG9mZnNldHMgb2YgemVyby4KKworVHVlIEZlYiAgNCAxODowNTo0NCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogbWlwc3JlYWQuYzogIFVzZSAoRlAwX1JFR05VTS0zMikgaW5zdGVhZCBvZiBtYWdpYyBudW1iZXIgNi4KKwkoVGhpcyBpcyBqdXN0IGZvciBjbGFyaXR5IC0gYW5kIG9uZSBkYXkgcGVybWl0dGluZyB1cyB0bworCSBjaGFuZ2UgRlAwX1JFR05VTSBmcm9tIDM4IHRvIDMyLCB3aGljaCB3b3VsZCBtYWtlIG1vcmUgc2Vuc2UuKQorCSogdG0tbWlwcy5oOiAgQWRkZWQgU1RBQl9SRUdfVE9fUkVHTlVNIG1hY3JvLCBzbyB0aGF0CisJcmVnaXN0ZXIgbnVtYmVycyBpbiBzdGFicy1pbi1lY29mZiBnZXQgaGFuZGxlZCBjb3JyZWN0bHkuCisKK1NhdCBGZWIgIDEgMDQ6NDU6MTAgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworIAkqIHhtLXZheC5oLCB4bS12YXh1bHQuaCwgeG0tdmF4YnNkLmgsIGNvbmZpZy9taC12YXh1bHQsCisJY29uZmlnL21oLXZheGJzZCwgY29uZmlndXJlLmluOiAgU3BsaXQgdXAgY29uZmlnIHN0dWZmIGZvciBWYXhlbgorCWludG8gQlNEIGFuZCBVbHRyaXguCisKK1NhdCBGZWIgIDEgMDQ6Mzk6NDEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGRieHJlYWQuYyAoZGJ4X3N5bWZpbGVfaW5pdCk6ICBDYWxsIG1hbGxvYywgbm90IHhtYWxsb2MuCisKK1NhdCBGZWIgIDEgMDQ6MTU6NDEgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBJbmNyZW1lbnQgdmVyc2lvbiB0byA0LjQuMS4KKwkqIG1haW4uYyAocHJpbnRfZ2RiX3ZlcnNpb24pOiAgVXBkYXRlIGNvcHlyaWdodCBub3RpY2UuCisKK1NhdCBGZWIgIDEgMDE6NDM6MTEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIG1pcHNyZWFkLmM6ICBQcmVwZW5kICJzdHJ1Y3QgIiB0byB0aGUgbmFtZXMgb2Ygc3RydWN0dXJlCisJdHlwZXMsIGFuZCBzaW1pbGFybHkgZm9yIGVudW1zIGFuZCB1bmlvbnMuICAoVGhpcyB1c2VkCisJdG8gYmUgZG9uZSwgYnV0IGdvdCBsb3N0IGluIHRoZSByZS13cml0ZSB0byAiZ3Vlc3MiIHRoZQorCWRpZmZlcmVuY2UgYmV0d2VlbiBlbnVtL3N0cnVjdC91bmlvbi4pCisJQWxzbywgZ3Vlc3MgdGhhdCBhIHRhZyBpcyBhbiBlbnVtIGlmIHRoZSBmaXJzdCBtZW1iZXIKKwloYXMgdHlwZSBidE5pbC4KKworRnJpIEphbiAzMSAyMTo0NTo1MSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiB4bS12YXguaDogICNpZm5kZWYgdWx0cml4IGFyb3VuZCAjaW5jbHVkZSBvZiBlbmRpYW4uaCBhbmQKKwlsaW1pdHMuaCAoc2lnaCkuCisKK0ZyaSBKYW4gMzEgMDA6MDU6MDEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIFByb2plY3RzOiAgUGF0Y2hpbmcgZXhlY3V0YWJsZXMgaXMgZG9uZS4KKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIFJvbGwgdG8gZ2RiLTQuNC4KKwkqIFJFQURNRSwgV0hBVFMuTkVXOiAgVXBkYXRlIGZvciBnZGItNC40LgorCisJKiBzeW1maWxlLmMgKHJlcmVhZF9zeW1ib2xzKTogIFdoZW5ldmVyIHdlIHJlcmVhZCBvbmUgb2JqZWN0CisJZmlsZSdzIHN5bWJvbHMsIHdlIG11c3QgcmVzdGFydCB0aGUgc2NhbiwgYmVjYXVzZSB0aGUgb2JqZWN0X2ZpbGVzCisJY2hhaW4gaGFzIGJlZW4gcGVybXV0ZWQuCisKKwkqIGV4ZWMuYyAoZXhlY19maWxlc19pbmZvKTogIFNwbGl0IG91dCBpbnRvIHByaW50X3NlY3Rpb25faW5mby4KKwlQcmludCBCRkQgZmlsZW5hbWUgb2YgZWFjaCBzZWN0aW9uIGlmIGl0J3Mgbm90IHRoZSBkZWZhdWx0IG9uZS4KKwkqIGNvcmUuYyAoY29yZV9maWxlc19pbmZvKTogIENhbGwgcHJpbnRfc2VjdGlvbl9pbmZvLgorCisJKiB4bS12YXguaDogIEluY2x1ZGUgYSBmZXcgc3lzdGVtIGhlYWRlciBmaWxlcyB3aG9zZSBkZWZpbml0aW9ucworCW11c3QgcHJlY2VkZSBkZWZzLmguCisJKiBsYW5ndWFnZS5jLCBsYW5ndWFnZS5oOiAgTWFrZSBzb21lIHRoaW5ncyBjb25zdC4KKwkqIGV4cHJlc3Npb24uaCwgbWFpbi5jOiAgY29uc3Qgc3ByZWFkcyBsaWtlIG9vemUuCisKKwkqIG1lbS1icmVhay5jIChicmVha19pbnNuLCBicmVha19pbnNuX3NpemUpOiAgVXNlIHVuc2lnbmVkIGNoYXJzLAorCXNpbmNlIEJSRUFLUE9JTlQgdmFsdWVzIGNhbiBiZSA+MHg4MC4KKworVGh1IEphbiAzMCAxNzoyMToxNCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBpbmZydW4uYywgeG0taTM4NnNjby5oOiAgU0NPIG5lZWRzIHRvIHVzZSBzZXRwZ2lkKCkuCisKK1RodSBKYW4gMzAgMDE6MDQ6MjMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIHNwYXJjLXBpbnNuLmM6ICBSZW1vdmUga2x1ZGdlIGZvciBwcmVmZXJyaW5nIGFyY2hpdGVjdHVyZXMuCisJUmVtb3ZlICNpZmRlZidzIGZvciBTT1JUX05FRURFRC4gIFdlIG5lZWQgdG8gc29ydCB0aGUgdGFibGUsIG5vdworCWFuZCBmb3JldmVyLiAgQWRkIGBhZGQnIGluc3RydWN0aW9uIHRvIHRoZSBzZXQgdGhhdCBnZXQgY2hlY2tlZAorCWZvciBhIHByZWNlZGluZyBgc2V0aGknIGluIG9yZGVyIHRvIHByaW50IGFuIGFic29sdXRlIGFkZHJlc3MuCisJQ29ycmVzcG9uZGluZyBjaGFuZ2VzIGluIC4uL2luY2x1ZGUvb3Bjb2RlL3NwYXJjLmggbmVlZGVkCisJdG8gZWxpbWluYXRlIGdhcmJhZ2UgaW5zdHJ1Y3Rpb25zLgorCitXZWQgSmFuIDI5IDE5OjI0OjM0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQorCisJKiBtaXBzcmVhZC5jIChwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiAgTWFrZSBzdXJlIHBhcnRpYWwKKwlzeW1ib2xzIGFyZSBjcmVhdGVkIGZvciBleHRlcm5hbCBzeW1ib2xzIChhcyB1c2VkIHRvIGJlCisJdGhlIGNhc2UpLiAgVGhpcyBpcyBhIGJpdCBvZiBhIHBhaW4gd2l0aCB0aGUgbWlwcy1jb2ZmLgorCUl0IHVzZXMgYSB0YWJsZSB3aGljaCBwb2ludHMgdG8gYWxsIG9mIHRoZSBleHRlcm5hbAorCXN5bWJvbHMgYmVsb25naW5nIHRvIGEgcGFydGljdWxhciBGRFIgb3IgcHN5bXRhYi4KKwlPbmNlIHdlJ3ZlIGdlbmVyYXRlZCB0aGlzIHRhYmxlLCB3ZSBtaWdodCBhcyB3ZWxsIHNhdmUKKwlpdCwgYW5kIHRoZW4gdXNlIGl0IGluIHBzeW10YWJfdG9fc3ltdGFiXzEgdG8gZmluZAorCXRoZSBzeW1ib2xzIHRvIHBhc3MgdG8gcGFyc2VfZXh0ZXJuYWwoKS4KKwkqIHN5bWZpbGUuYywgIHN5bWZpbGUuYzogIE5ldyBmdW5jdGlvbiBzdGFydF9wc3ltdGFiX2NvbW1vbgorCXRvIHNoYXJlIHRoZSBjb21tb24gcGFydHMgb2YgYWxsb2NhdGluZyBhIG5ldyBwc3ltdGFiCisJZm9yIGRieHJlYWQsIG1pcHNyZWFkIChhbmQgbGF0ZXIgZHdhcmZyZWFkKS4gIEl0cyBjb2RlCisJd2FzIHB1bGxlZCBvdXQgZnJvbSBzdGFydF9wc3ltdGFiIGluIGRieHJlYWQuYy4KKwkqIGRieHJlYWQuYyAoc3RhcnRfcHN5bXRhYik6ICBVc2Ugc3RhcnRfcHN5bXRhYl9jb21tb24oKS4KKworCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogIElmIHRoZXJlIGlzIGFuIGVycm9yIHdoZW4gdHJ5aW5nCisJdG8gcHJpbnQgYSBzdHJpbmcsIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSByZWFsbHkgaXMgYSBwcm9ibGVtCisJYnkgcmVhZGluZyBqdXN0IG9uZSBjaGFyYWN0ZXIuICBJZiB0aGF0IHdvcmtzLCBhc3N1bWUKKwl0aGluZ3MgYXJlIG9rLgorCitXZWQgSmFuIDI5IDE4OjU4OjQzIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIHNwYXJjLXBpbnNuLmMgKGNvbXBhcmVfb3Bjb2Rlcyk6ICBNYWtlIGl0IHByZWZlciB2NiwgdjcsCisJY3lwcmVzcywgdjggbW5lbW9uaWNzIGluIHRoYXQgb3JkZXIuCisKK1R1ZSBKYW4gMjggMTc6MzI6MTMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIHNwYXJjLXBpbnNuLmM6ICBQdXQgdGhlIHFzb3J0KCkgYmFjayBpbi4KKworTW9uIEphbiAyNyAxODo1MTowMyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogZmluZHZhci5jIChyZWFkX3JlZ2lzdGVyLCB3cml0ZV9yZWdpc3Rlcik6ICBIYW5kbGUgbWFjaGluZXMKKwl3aGVyZSBSRUdJU1RFUl9UWVBFIGlzIG5vdCB0aGUgc2FtZSBzaXplIGFzICJpbnQiLgorCisJSGFuZGxlIGRlYnVnIHN5bWJvbHMgaW4gZHluYW1pY2FsbHkgbG9hZGVkIChyZWxvY2F0ZWQpIGNvZGU6CisKKwkqIGRieHJlYWQuYyAocmVhZF9vZmlsZV9zeW10YWIpOiAgRml4IHVwIE5fQ0FUQ0ggYmV0dGVyLiAgUGFzcworCW9mZnNldCB0byBwcm9jZXNzX29uZV9zeW1ib2wuCisJKHByb2Nlc3Nfb25lX3N5bWJvbCk6ICBUYWtlIG5ldyBvZmZzZXQgcGFyYW1ldGVyLiAgQWRkIGl0IGludG8KKwlhcHByb3ByaWF0ZSBzeW1ib2wgdHlwZXMgdG8gcmVsb2NhdGUgc3ltYm9scyB0byBsb2FkZWQgYWRkcmVzc2VzLgorCUhhbmRsZSBhbGwgcG9zc2libGUgc3ltYm9sIHR5cGVzLCBhbmQgY29tcGxhaW4oKSBhYm91dCB0eXBlcyB0aGF0CisJd2UgZG9uJ3QgZXhwZWN0IHRvIHNlZS4KKwkqIG1pcHNyZWFkLmMgKHBzeW10YWJfdG9fc3ltdGFiXzEpOiAgUGFzcyBvZmZzZXQgb2YgemVybyB0bworCXByb2Nlc3Nfb25lX3N5bWJvbCAoRklYTUUsIHNob3VsZCBwYXNzIHJlYWwgb2Zmc2V0KS4KKworCU1pc2MgYnVnZml4ZXM6CisKKwkqIGJyZWFrcG9pbnQuYyAocmVzb2x2ZV9zYWxfcGMpOiAgU3BsaXQgb3V0IGNvZGUgdG8gcmVzb2x2ZSBhCisJc2FsJ3MgUEMgdmFsdWUuCisJKHNldF9icmVha3BvaW50LCBicmVha19jb21tYW5kXzEsIHVudGlsX2JyZWFrX2NvbW1hbmQsCisJY2F0Y2hfY29tbWFuZF8xLCBicmVha3BvaW50X3JlX3NldF9vbmUpOiAgVXNlIGl0LgorCSogc3ltdGFiLmggKHJlc29sdmVfc2FsX3BjKTogIERlY2xhcmUuCisJKiBpbmZjbWQuYyAoanVtcF9jb21tYW5kKTogIFVzZSByZXNvbHZlX3NhbF9wYy4KKworCSogc291cmNlLmMgKGxpc3RfY29tbWFuZCk6ICBTaG9ydGVuICJGSUxFLCBsaW5lIE4iIHRvICJGSUxFOk4iLgorCisJKiBwdXRlbnYuYyAocHV0ZW52KTogIEF2b2lkIHVucG9ydGFibHkgY2FzdGluZyBwb2ludGVycyB0byB1bnNpZ25lZHMuCisKKwkqIGMtZXhwLnkgKHl5bGV4KTogIGB0aGlzJyBhbmQgYHRlbXBsYXRlJyBhcmUgb25seSB0b2tlbnMgaW4gQysrLgorCisJKiB4bS1jb252ZXguaCwgeG0taHAzMDBic2QuaCwgeG0taXNpLmgsIHhtLW1lcmxpbi5oLCB4bS1uZXdzLmgsCisJeG0tbnAxLmgsIHhtLXBuLmgsIHhtLXB5ci5oLCB4bS1ydGJzZC5oLCB4bS1zeW1tZXRyeS5oLCB4bS11bWF4Lmg6CisJUmVtb3ZlIE1JU1NJTkdfVlBSSU5URiBkZWNsYXJhdGlvbiwgYW5kIHN1cGVyZmx1b3VzICJrZ2RiIiBkZWZpbmVzLgorCitNb24gSmFuIDI3IDE1OjQ2OjIxIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGRieHJlYWQuYyAocHJvY2Vzc19vbmVfc3ltYm9sKTogIE1ha2UgYSBmaXJzdCBjdXQgYXQgaGFuZGxpbmcKKwlzeW1ib2wgdGFibGVzIGdlbmVyYXRlZCBieSBTdW4ncyBhY2MuICAoI2lmZGVmJ2Qgb3V0LCBGSVhNRS4pCisKKwkqIHN5bXRhYi5jIChmaW5kX3BjX2xpbmUpOiAgRml4IHN0ZXBwaW5nIGludG8gYW5kIG91dCBvZiAjaW5jbHVkZWQKKwlmaWxlcy4KKworTW9uIEphbiAyNyAxMzowMDo1NSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoT1BDT0RFUyk6ICBSZW1vdmUgT1BDT0RFUyBkZWZzIGFuZCByZWZzLiAgVGhlcmUgaXMKKwlubyBsb25nZXIgYW55IG5lZWQgdG8gY29weSAuLi9pbmNsdWRlL29wY29kZS8qIGludG8gZ2RiLgorCitNb24gSmFuIDI3IDEyOjMwOjM4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBDaGFuZ2VMb2csIENoYW5nZUxvZy05MDkxOiAgU3BsaXQgQ2hhbmdlTG9nIGF0IDE5OTIuCisKK1N1biBKYW4gMjYgMTk6MDU6NDAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCisKKwkqIHZhbHByaW50LmMgKHR5cGVfcHJpbnRfYmFzZSwgdHlwZV9wcmludF9tZXRob2RfYXJncyk6CisJUHJpbnQgQysrIGNvbnN0cnVjdG9yIG1ldGhvZHMgd2l0aG91dCBib2d1cyAicmV0dXJuIHR5cGUuIgorCitTYXQgSmFuIDI1IDE1OjU3OjU5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBpbmZwdHJhY2UuYyAoY2hpbGRfeGZlcl9tZW1vcnkpOiAgUGFyYW1ldGVyICJ0YXJnZXQiIHNob3VsZAorCWJlIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSwgbm90IHRoZSBlbnRpcmUgc3RydWN0dXJlLgorCitGcmkgSmFuIDI0IDAxOjMwOjI3IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBkZXBlbmQ6ICBDb252ZXJ0IHRoZSBjb3VwbGUgb2YgcmVmZXJlbmNlcyB0byBhbnNpZGVjbC5oIHRoYXQKKwl1c2VkIHRoZSBsb2NhbCBnZGIgdmVyc2lvbiB0byB1c2UgdGhlIC4uL2luY2x1ZGUgdmVyc2lvbi4KKworVGh1IEphbiAyMyAyMjoyNDo0MyAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogcHJvY2ZzLmMKKwkoY2hpbGRfeGZlcl9tZW1vcnkpOiBUYWtlcyBwb2ludGVyIHRvIGEgc3RydWN0LCBub3QgZW50aXJlIHN0cnVjdC4KKwkoaW5mZXJpb3JfcHJvY19pbml0KTogIEZpeCBub24tQU5TSSB2ZXJzaW9uIG9mIGFyZ3MuCisJKGF0dGFjaCk6ICBDYWxsIHByaW50X3N5c19lcnJtc2cgd2l0aCBjb3JyZWN0IG51bWJlciBvZiBhcmdzLgorCShtYXBwaW5nZmxhZ3MpOiAgTWFrZSBzdGF0aWMsIGRvZXMgbm90IG5lZWQgdG8gYmUgZ2xvYmFsLgorCisJKiBpMzg2LXRkZXAuYyAoaTM4Nl9mcmFtZV9udW1fYXJncyk6ICBUYWtlcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QKKwlub3QgdGhlIGVudGlyZSBzdHJ1Y3QgaXRzZWxmLgorCisJKiB2YWxvcHMuYyAodmFsdWVfYXNzaWduKTogIENhc3Qgc29tZSBhcmdzIHRvIG1vZGlmeV9maWVsZCgpIGFuZAorCXtyZWFkLHdyaXRlfV9yZWdpc3Rlcl9ieXRlcygpIGNvcnJlY3RseS4KKworCSogYW5zaWRlY2wuaDogIFJlbW92ZWQsIGlzIGR1cGxpY2F0ZSBvZiAuLi9pbmNsdWRlL2Fuc2lkZWNsLmgKKworCSogTWFrZWZpbGUuaW4gKE1BTExPQ1NSQyk6ICBSZW1vdmVkIHJlZmVyZW5jZSB0byByZW1vdmVkIGxvY2FsCisJY29weSBvZiBhbnNpZGVjbC5oLgorCisJKiBkd2FyZnJlYWQuYyAobGlzdF9pbl9zY29wZSk6ICBOZWVkcyBhbiBpbml0aWFsIHZhbHVlLCB1c2UgZmlsZQorCXNjb3BlLgorCitNb24gSmFuIDIwIDE5OjA2OjI4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIG1haW4uYyAobWFpbik6ICBNYWtlIG9wdGlvbl9pbmRleCBsb2NhbCB0byBrZWVwIG5ldyBnZXRvcHQgaGFwcHkuCisJbWFpbi5jLCBzb2xpYi5jLCBNYWtlZmlsZS5pbjogIFVwZGF0ZSBjb3B5cmlnaHQgbm90aWNlcy4KKworTW9uIEphbiAyMCAwODo1NDowMCAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uIGF0IGN5Z251cy5jb20pCisKKwkqIGNwbHVzLWRlbS5jIChjcGx1c19kZW1hbmdsZSk6IENvcnJlY3RseSBkZW1hbmdsZSBkZXN0cnVjdG9ycy4KKworU2F0IEphbiAxOCAxNzoxNzo0NSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogIEFkZCBwYXJ0aWFsLXN0YWIuaC4KKworU2F0IEphbiAxOCAxNjo0NTowMSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21oLXN0cmF0dXMsIGNvbmZpZy9tdC1zdHJhdHVzLCB0bS1zdHJhdHVzLmgsIHhtLXN0cmF0dXMuaDoKKwlOZXcgZmlsZXMgZm9yIHN0cmF0dXMuICBOb3QgY29tcGxldGUgZW5vdWdoIHRvIGFjdHVhbGx5IGJ1aWxkCisJb24gdGhlIFN0cmF0dXMgbWFjaGluZTsgdGhhdCBhd2FpdHMgY29weXJpZ2h0IGFzc2lnbm1lbnQgZm9yCisJaTg2MCBjaGFuZ2VzLgorCisJKiBNYWtlZmlsZS5pbiAoVVNFUl9DRkxBR1MpOiAgQWRkIG1hY3JvIHNwZWNpZmljYWxseSByZXNlcnZlZAorCWZvciBnZXR0aW5nIGN1c3RvbSBmbGFncyBpbnRvIENGTEFHUyB3aGVuIGRvaW5nIG1ha2VzLgorCisJKiBjb25maWd1cmUuaW46ICBBZGQgY29uZmlnIGluZm9ybWF0aW9uIGZvciBzdHJhdHVzLgorCitUaHUgSmFuIDE2IDAwOjUxOjQ2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBkYnhyZWFkLmMgKHByb2Nlc3Nfb25lX3N5bWJvbCk6ICBQYXNzIGFkZHJlc3Mgb2Ygc3RydWN0dXJlCisJdG8gY29tcGxhaW4oKSwgcmF0aGVyIHRoYW4gdGhlIHdob2xlIHN0cnVjdHVyZS4KKworV2VkIEphbiAxNSAwOTo1NjoxNiAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogc29saWIuYyAoc29saWJfYWRkX2NvbW1vbl9zeW1ib2xzKTogIE9ubHkgY29tcGlsZSBpbiB3aGVuIG5vdAorCXVzaW5nIFNWUjQgc3R5bGUgc2hhcmVkIGxpYnJhcmllcy4KKworVHVlIEphbiAxNCAyMjozNDowMCAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogZHdhcmZyZWFkLmMgKGxvY3ZhbCk6ICBBZGQgb2ZmcmVnIGZsYWcgdG8gaW5kaWNhdGUgbG9jYXRpb24KKwl2YWx1ZXMgdGhhdCBhcmUgY29tcHV0ZWQgb2ZmIGEgYmFzZSByZWdpc3Rlci4KKworCSogZHdhcmZyZWFkLmMgKG5ld19zeW1ib2wpOiAgUmV3b3JrIFRBR19nbG9iYWxfdmFyaWFibGUgYW5kCisJVEFHX2xvY2FsX3ZhcmlhYmxlIGNhc2VzIHRvIGFjY291bnQgZm9yIHN0YXRpYyB2YXJpYWJsZXMKKwl3aXRoaW4gZnVuY3Rpb24gc2NvcGVzLgorCitUdWUgSmFuIDE0IDEyOjI4OjUyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGluZmxvdy5jOiAgcmVtb3ZlICNpbmNsdWRlIDxzeXMvZGlyLmg+LiAgTm90IG5lY2Vzc2FyeSwgYW5kCisJZG9lc24ndCBleGlzdCBvbiBzb21lIHN5c3RlbXMuCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvciEhISEpOiAgUHJldmVudCBnZGIgZnJvbSBoYW5naW5nIHdoZW4KKwluZXh0aW5nIG92ZXIgcmVjdXJzaXZlIGZ1bmN0aW9uIGNhbGxzLgorCisJKiB0YXJnZXQuYyAodGFyZ2V0X3JlYWRfc3RyaW5nKTogIENyZWF0ZSB0aGlzIHJvdXRpbmUgdG8gcmVhZCBudWxsCisJdGVybWluYXRlZCBzdHJpbmdzIGZyb20gdGhlIHRhcmdldC4gIEl0IGRlYWxzIHdpdGggcnVubmluZyBvZmYgdGhlCisJZW5kIG9mIG1lbW9yeSBlbGVnYW50bHkgYXMgd2VsbC4gIHNvbGliLmMgKGZpbmRfc29saWIpOiAgVXNlCisJdGFyZ2V0X3JlYWRfc3RyaW5nKCkgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBydW5uaW5nIG9mZiB0aGUgZW5kIG9mCisJbWVtb3J5LgorCisJKiBpbmZsb3cuYyAoY2hpbGRfdGVybWluYWxfaW5mbyk6ICAjaWZkZWYgVElPQ1BHUlAgYXJvdW5kIGxpbmVzCisJdGhhdCByZWZlcmVuY2UgcGdycF9pbmZlcmlvci4KKworTW9uIEphbiAxMyAxNDo1NzoxMSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogdG0tbWlwcy5oOiAgUmVtb3ZlZCBCTE9DS19BRERSRVNTX0FCU09MVVRFLCBub3cgdGhhdAorCW1pcHMtdGZpbGUgaGFzIGJlZW4gaGFja2VkIHRvIGFjdCBtb3JlICJ0cmFkaXRpb25hbGx5LiIKKwkqIGRieHJlYWQuYzogIEZpeGVkIHR5cG8gaW4gY29tbWVudC4KKworU3VuIEphbiAxMiAxMzowODozNiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKKworCSogbWlwcy10ZGVwLmMgKG1pcHNfc2tpcF9wcm9sb2d1ZSk6ICBBZGQgc29tZSBudW1iZXIgb2YKKwknc3cnIGluc3RydWN0aW9ucyBiZWZvcmUgJ2FkZGl1JyBhZGp1c3RzIHRoZSBzdGFjay4KKworRnJpIEphbiAxMCAxMzo0NzowNiAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogZHdhcmZyZWFkLmMgKHN0YXJ0X3N5bXRhYiwgZW5kX3N5bXRhYiwgc2NvcGVjb3VudCwgb3BlbnNjb3BlLAorCWZyZWVzY29wZSwgYnVpbGRibG9jayBjbG9zZXNjb3BlLCByZWNvcmRfbGluZSwgYWRkX3N5bWJvbF90b19saXN0LAorCWdhdGhlcmJsb2NrcywgbWFrZV9ibG9ja3ZlY3Rvcik6ICBFeHRlbnNpdmUgY2hhbmdlcyB0byBzd2l0Y2gKKwl0byBnZW5lcmljIHN5bWJvbCB0YWJsZSBidWlsZGluZyBjb2RlIGluIGJ1aWxkc3ltLmMuICBSZW1vdmUKKwlzY29wZSB0cmVlIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucywgc3ltYm9sIHRhYmxlIGJ1aWxkaW5nCisJZnVuY3Rpb25zLCBhbmQgbG90cyBvZiBvdGhlciBzbWFsbCBjaGFuZ2VzLgorCisJKiBkd2FyZnJlYWQuYzogIEFkZCBuZXcgbWFjcm9zIEdDQ19QUk9EVUNFUiBhbmQgU1RSRVFOLiAgUmVtb3ZlCisJR0NDX0NPTVBJTEVEX0ZMQUdfU1lNQk9MIGFuZCBHQ0MyX0NPTVBJTEVEX0ZMQUdfU1lNQk9MLgorCitUdWUgSmFuICA3IDEzOjA5OjU3IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGJ1aWxkc3ltLmMgKGNsZWFudXBfdW5kZWZpbmVkX3R5cGVzKTogIEFkZCBzdXBwb3J0IGZvciBlbnVtcy4KKwlUaGlzIGZpeGVzIHRoZSAnR0RCIGludGVybmFsIGVycm9yLiAgY2xlYW51cF91bmRlZmluZWRfdHlwZXMgd2l0aAorCWJhZCB0eXBlJyBwcm9ibGVtLgorCitTdW4gSmFuICA1IDA5OjQ3OjUwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGRieHJlYWQuYzogIGRldGVjdCBnY2MyIGNvbXBpbGF0aW9ucy4KKworVGh1IEphbiAgMiAxNTowNzo0MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogc3BhcmMtcGluc24uYzogIFJlbmFtZSBiaXRmaWVsZHMgdGhhdCBvdmVybGFwIHdpdGggbWFjcm8gbmFtZXMKKwlpbiAuLi9pbmNsdWRlL29wY29kZS9zcGFyYy5oLgorCitXZWQgSmFuICAxIDA0OjI5OjAwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIENoYW5nZSB0bS1zdnI0LmggdG8gdG0tc3lzdjQuaC4gIENoYW5nZSB4bS1zdnI0LmgKKwl0byB4bS1zeXN2NC5oLiAgU3BsaXQgT1BDT0RFX0RJUiBpbnRvIE9QQ09ERV9ESVIxIGFuZCBPUENPREVfRElSMgorCXRvIHJlZmxlY3QgYWN0dWFsIGxvY2F0aW9ucyBvZiBvcGNvZGUgZmlsZXMsIHNvIFRBR1MgdGFyZ2V0IHdpbGwKKwliZSBidWlsZGFibGUuCisKKwkqIGkzODYtdGRlcC5jOiAgQ2hhbmdlIGFuIGVycm9uZW91cyAnbTY4aycgcmVmZXJlbmNlIHRvICdpMzg2Jy4KKworCSogaTM4Ni10ZGVwLmMgKHN1cHBseV9mcHJlZ3NldCwgZmlsbF9mcHJlZ3NldCk6ICBSZW1vdmUgbTY4aworCWNvZGUuCisKKwkqIG02OGstdGRlcC5jIChzdXBwbHlfZnByZWdzZXQsIGZpbGxfZnByZWdzZXQpOiAgRml4IGFycmF5CisJZGVyZWZlcmVuY2luZyB0byBhY2Nlc3MgdGhlIGNvcnJlY3QgZWxlbWVudHMuCisKKwkqIHZhbG9wcy5jICh2YWx1ZV9hZGRyKTogIERlY2xhcmUgcmV0dXJuIHR5cGUgb2YgZXh0ZXJuYWwgZnVuYworCXZhbHVlX2NvcHkoKS4KKworCSogeGNvZmZyZWFkLmM6ICBVbmRlZmluZSBuZXh0X3N5bWJvbF90ZXh0IGJlZm9yZSByZWRlZmluaW5nIGl0LgorCitGb3Igb2xkZXIgY2hhbmdlcyBzZWUgQ2hhbmdlTG9nLTkwOTEKKwwKK0xvY2FsIFZhcmlhYmxlczoKK21vZGU6IGluZGVudGVkLXRleHQKK2xlZnQtbWFyZ2luOiA4CitmaWxsLWNvbHVtbjogNzQKK3ZlcnNpb24tY29udHJvbDogbmV2ZXIKK0VuZDoKZGlmZiAtLWdpdCBhL2dkYi9DaGFuZ2VMb2ctOTMgYi9nZGIvQ2hhbmdlTG9nLTkzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MzE1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvQ2hhbmdlTG9nLTkzCkBAIC0wLDAgKzEsNzU5NyBAQAorRnJpIERlYyAzMSAxNDozMzo0OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbmluZHktc2hhcmUvbmluZHkuYzogRml4IG9yZGVyIG9mIGFyZ3VtZW50cyB0byBzdG9yZV91bnNpZ25lZF9pbnRlZ2VyCisJKHNlY29uZCBhbmQgdGhpcmQgYXJndW1lbnRzIHdlcmUgcmV2ZXJzZWQpLgorCShzYXkpOiBVc2UgdmFyYXJncy4KKworRnJpIERlYyAzMSAxMjoxMzo0NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLW1pcHMuYzogQWRkIHRpbWVvdXQgcGFyYW1ldGVyIHRvIG1pcHNfcmVxdWVzdCBhbmQKKwltaXBzX3JlY2VpdmVfcGFja2V0LgorCShjYWxsZXJzKTogcGFzcyBpbiBtaXBzX3JlY2VpdmVfd2FpdCBleGNlcHQgbWlwc19pbml0aWFsaXplICh3aGVyZQorCXdlIHVzZSBpdCB0byBjbGVhbiB1cCB0aGUga2x1ZGdlIHdoZXJlIHdlIGhhZCBiZWVuIGNoYW5naW5nCisJbWlwc19yZWNlaXZlX3dhaXQgdGVtcG9yYXJpbHkpIGFuZCBtaXBzX3dhaXQgKHdoZXJlIHdlIHBhc3MgaW4KKwktMSBmb3Igbm8gdGltZW91dCkuCisKK0ZyaSBEZWMgMzEgMTQ6MzM6NDkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWNrLmMgKHByaW50X2Jsb2NrX2ZyYW1lX2xvY2Fscyk6IEFsc28gcHJpbnQgTE9DX0JBU0VSRUcgdmFyaWFibGVzLgorCitGcmkgRGVjIDMxIDA2OjU1OjM4IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogc3ltdGFiLmMgKGZpbmRfbWV0aG9kcyk6IENhbGwgZnByaW50Zl9zeW1ib2xfZmlsdGVyZWQgd2l0aCBETUdMX0FOU0kuCisKK1RodSBEZWMgMzAgMTA6MTY6NTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHZhbHVlcy5jICh1bnBhY2tfbG9uZyk6IEZpeCBnYXJibGVkIGVycm9yIG1lc3NhZ2UuCisKKwkqIHJlbW90ZS1taXBzLmMgKG1pcHNfZXJyb3IpOiBOZXcgZnVuY3Rpb24uCisJKiByZW1vdGUtbWlwcy5jOiBVc2UgaXQgaW5zdGVhZCBvZiBlcnJvcigpIG1vc3QgcGxhY2VzLgorCSogcmVtb3RlLW1pcHMuYyAobWlwc19yZWNlaXZlX3BhY2tldCk6IE5ldyBhcmcgdGhyb3dfZXJyb3IuCisJKG1pcHNfaW5pdGlhbGl6ZSk6IFVzZSBpdCBub3QgY2F0Y2hfZXJyb3JzLgorCSogZGVmcy5oOiBEZWNsYXJlIGVycm9yX3ByZV9wcmludCBhbmQgd2FybmluZ19wcmVfcHJpbnQgaGVyZS4uLgorCSogbWFpbi5jOiAuLi5ub3QgaGVyZS4KKworCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50X2NoYWluKTogTWFrZSBzdGF0aWMuCisJKiBicmVha3BvaW50LmMsIGJyZWFrcG9pbnQuaCAoZnJhbWVfaW5fZHVtbXkpOiBOZXcgZnVuY3Rpb24uCisJKiBzdGFjay5jIChwcmludF9mcmFtZV9pbmZvKTogVXNlIGl0LgorCitUaHUgRGVjIDMwIDA3OjQxOjM2IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZXhlYy5jIChhZGRfdG9fc2VjdGlvbl90YWJsZSk6ICBDaGVjayBmb3IgU0VDX0FMTE9DIGluc3RlYWQgb2YKKwlTRUNfTE9BRCB0byBoYW5kbGUgLmJzcyBzZWdtZW50cyBwcm9wZXJseS4KKworVGh1IERlYyAzMCAxMDoxNjo1NCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogRW5hYmxlIGNvZGUgd2hpY2ggYXNzdW1lcyB0aGF0IGlmCisJd2UganVtcCBpbnRvIHRoZSBwcm9sb2d1ZSBmcm9tIGFub3RoZXIgZnVuY3Rpb24sIHRoZW4gaXQgd2FzIGEKKwlzdWJyb3V0aW5lIGNhbGwuICAjaWYgMCBBVF9GVU5DVElPTl9TVEFSVDsgdGhlIGFib3ZlIGNvZGUgc2hvdWxkCisJdGFrZSBjYXJlIG9mIHRoaXMgY2FzZS4KKworV2VkIERlYyAyOSAxMjozMjowOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogdmFscHJpbnQuYyAodmFsX3ByaW50X3N0cmluZyk6IENoYW5nZSBjaHVua3NpemUgZnJvbSAyMDAKKwl0byA4LgorCisJKiBzeW1maWxlLmMgKGdlbmVyaWNfbG9hZCk6IElmIG5vIGFyZ3VtZW50cywgZ2V0IGZpbGUgbmFtZQorCWZyb20gZ2V0X2V4ZWNfZmlsZS4KKworCSogYy1leHAueTogUmV2ZXJ0IEt1bmcncyBjaGFuZ2UuICAiLi4uIiBpcyBub3QgYSB0eXBlLCBhbmQgdGhlCisJY2hhbmdlIGNhdXNlZCAicCAoLi4uKTAiIHRvIGR1bXAgY29yZS4KKwkqIGdkYnR5cGVzLmMgKGNoZWNrX3N0dWJfbWV0aG9kKTogRG9uJ3QgcGFzcyAiLi4uIiB0bworCXBhcnNlX2FuZF9ldmFsX3R5cGUuICBUaGlzIHNob3VsZCBmaXggdGhlIGJ1ZyB3aGljaCBLdW5nIHdhcworCXRyeWluZyB0byBmaXguCisKKwkqIHN0YWJzcmVhZC5jIChkZWZpbmVfc3ltYm9sKTogSWYgd2UgY2hvb3NlIG5vdCB0byBjb21iaW5lCisJdHdvIHN5bWJvbHMsIGRvbid0IGp1c3QgaWdub3JlIHRoZSBzZWNvbmQgKExPQ19SRUdJU1RFUikgb25lLgorCSogcHJpbnRjbWQuYyAocHJpbnRfZnJhbWVfYXJncyk6IElmIHdlIGhhdmUgYSBMT0NfQVJHIGFuZCBhCisJTE9DX1JFR0lTVEVSLCB1c2UgdGhlIExPQ19BUkcgbm90IHRoZSBMT0NfUkVHSVNURVIuCisKK1R1ZSBEZWMgMjggMTU6MDg6MDAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCisKKwkqIHNvbGliLmMgKERFQlVHX0JBU0UpOiAgUmVtb3ZlIG1hY3JvIGFuZCBhbGwgcmVmZXJlbmNlcy4KKwkqIHNvbGliLmMgKGRlYnVnX2Jhc2Vfc3ltYm9scyk6ICBBZGQgYXJyYXkgb2Ygc3ltYm9scyB0byBsb29rdXAuCisJKiBzb2xpYi5jIChJR05PUkVfRklSU1RfTElOS19NQVBfRU5UUlkpOiAgQWRkIG1hY3JvLgorCSogc29saWIuYyAobG9va19mb3JfYmFzZSwgbG9jYXRlX2Jhc2UpOiAgVXNlIGRlYnVnX2Jhc2Vfc3ltYm9scy4KKwkqIHNvbGliLmMgKGZpbmRfc29saWIpOiAgVXNlIElHTk9SRV9GSVJTVF9MSU5LX01BUF9FTlRSWS4KKworVHVlIERlYyAyOCAxMjowNjo1NyAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGMtZXhwLnkgOiBmaXggZ3JhbW1hciB0byBwYXJzZSBlbGxpcHNpcyAoLi4uKQorCitNb24gRGVjIDI3IDE4OjQyOjE0IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogc3RhYnNyZWFkLmMgKHJlYWRfdHlwZSk6IGZpeCBwcm9ibGVtIHdoZW4gcmVhZGluZyBzdGF0aWMgbWVtYmVyCisJb2YgYSBjbGFzcy4gY2F1c2VkIGJ5IGNoYW5nZSB0byBhbGxvdyA6OiBpbnNpZGUgdGVtcGxhdGUKKwlpbnN0YW50aWF0ZWQgbmFtZS4KKworTW9uIERlYyAyNyAxMTowNzowNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RidHlwZXMuaDogRXhwYW5kIG9uIGNvbW1lbnRzIGZvciBUWVBFX0NPREVfQklUU1RSSU5HIGFuZAorCVRZUEVfQ09ERV9TVFJJTkcgYSBiaXQuCisKKwkqIG02OGstdGRlcC5jIChtNjhrX3NraXBfcHJvbG9ndWUsIG02OGtfZmluZF9zYXZlZF9yZWdzKToKKwlBbGxvdyBwZWEgJWZwOyBtb3ZlLmwgJXNwLCAlZnAgaW5zdGVhZCBvZiBsaW5rIGluc3RydWN0aW9uIHRvCisJc2V0IHVwIHRoZSBuZXcgZnJhbWUuCisKKwkqIG1haW4uYyAoaW5pdF9tYWluKTogQ2hhbmdlICJzZXQgcmVtb3RlZGVidWciIGJhY2sgdG8gdmFyX3ppbnRlZ2VyCisJZnJvbSB2YXJfYm9vbGVhbi4KKworCSogYy1leHAueSAoeXlsZXgpOiBEb24ndCB0cnkgdG8gZGVhbCB3aXRoIG5lc3RlZCB0eXBlcy4KKworCSogY3AtdmFscHJpbnQuYyAoY3BsdXNfcHJpbnRfdmFsdWUpOiBDYWxsIGNoZWNrX3N0dWJfdHlwZSBvbgorCVRZUEVfQkFTRUNMQVNTICh0eXBlLCBpKSBiZWZvcmUgd2UgbG9vayBhdCBpdHMgbmFtZS4KKworCSogZGJ4cmVhZC5jOiBNb3ZlIGRlZmF1bHQgZGVmaW5pdGlvbiBvZiBHQ0NfQ09NUElMRURfRkxBR19TWU1CT0wKKwlmcm9tIGhlcmUgLiAuIC4KKwkqIHN5bXRhYi5oOiAuIC4gLiB0byBoZXJlLgorCSogZGJ4cmVhZC5jIChyZWNvcmRfbWluaW1hbF9zeW1ib2wpOiBNb3ZlIGNoZWNrIGZvciBnY2N7LDJ9X2NvbXBpbGVkLgorCWFuZCBfX2dudV9jb21waWxlZCogZnJvbSBoZXJlIC4gLiAuCisJKiBtaW5zeW1zLmMgKHByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9sX2FuZF9pbmZvKTogLiAuIC4gdG8gaGVyZS4KKwkqIG1pbnN5bXMuYyAocHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2wpOiBDYWxsCisJcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2xfYW5kX2luZm8gcmF0aGVyIHRoYW4gZHVwbGljYXRpbmcgY29kZS4KKwkqIG1pbnN5bXMuYywgc3ltdGFiLmggKHByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9seyxfYW5kX2luZm99KSwKKwljb2ZmcmVhZC5jIChyZWNvcmRfbWluaW1hbF9zeW1ib2wpLAorCXhjb2ZmcmVhZC5jIChSRUNPUkRfTUlOSU1BTF9TWU1CT0wpLCBjYWxsZXJzOiBBZGQgb2JqZmlsZSBwYXJhbWV0ZXIuCisKK1N1biBEZWMgMjYgMjA6NDQ6MDIgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGRieHJlYWQuYyAocHJvY2Vzc19vbmVfc3ltYm9sKTogSGFuZGxlIHN0YWJzLWluLXNvbSBqdXN0IGxpa2UKKwlzdGFicy1pbi1lbGYuCisJKHBhc3RhYl9idWlsZF9wc3ltdGFicyk6IExpa2V3aXNlLgorCisJKiBocHBhLXRkZXAuYzogQ2hhbmdlIGFsbCBjb21tZW50cyB0byByZWZlcmVuY2UgJXIzIG9yIGZyYW1lCisJcG9pbnRlciByYXRoZXIgdGhhbiAlcjQuCisJKGZyYW1lX2NoYWluLCBza2lwX3Byb2xvZ3VlLCBkaWdfcnBfZnJvbV9zdGFjayk6IEhhbmRsZSAlcjMgYXMgdGhlCisJZnJhbWUgcG9pbnRlci4KKworCSogY29uZmlnL3BhL3RtLWhwcGEuaCAoRlBfUkVHTlVNKTogRGVmaW5lIGFzICVyMy4KKwkoRklORF9GUkFNRV9TQVZFRF9SRUdTKTogSGFuZGxlICVyMyBhcyBmcmFtZSBwb2ludGVyLgorCShDQUxMX0RVTU1ZKTogTGlrZXdpc2UuCisKK1N1biBEZWMgMjYgMTY6NTk6MzkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGV4ZWMuYyAoZXhlY19maWxlX2NvbW1hbmQpOiBJZiBlcnJvciBvY2N1cnMgYWZ0ZXIgd2UgaGF2ZSBvcGVuZWQKKwlleGVjX2JmZCBidXQgYmVmb3JlIHdlIGNhbGwgcHVzaF90YXJnZXQsIG1ha2Ugc3VyZSB0byBjbG9zZSBleGVjX2JmZC4KKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogUmVtb3ZlIGNvbmZ1c2luZyBhbmQgaW5hY2N1cmF0ZQorCXN0dWZmIGFib3V0IHN1YnJvdXRpbmUgY2FsbHMsIHJldHVybiwgZXRjLiwgZnJvbSBjb21tZW50IHdoaWNoCisJc2F5cyAiV2UndmUgd2FuZGVyZWQgb3V0IG9mIHRoZSBzdGVwIHJhbmdlLiIuCisKK1N1biBEZWMgMjYgMDk6MTg6MTAgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBXaGVuIGNoZWNraW5nIHdoZXRoZXIgdGhlIGxpbmUgaGFzCisJY2hhbmdlZCwgY2hlY2sgdGhlIHN5bXRhYiBhcyB3ZWxsLgorCitTdW4gRGVjIDI2IDA5OjE4OjEwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGJ0eXBlcy5jIChmb3JjZV90b19yYW5nZV90eXBlKTogVXNlIHN3aXRjaCBzdGF0ZW1lbnQuCisJY29tcGxhaW4oKSBub3Qgd2FybmluZygpIGlmIHRoZSBUWVBFX0NPREUgaXNuJ3Qgb25lIHdlIGtub3cgaG93IHRvCisJZGVhbCB3aXRoIGdyYWNlZnVsbHkuICBVc2UgYnVpbHRpbl90eXBlX2ludCBub3QKKwlsb29rdXBfZnVuZGFtZW50YWxfdHlwZSAodGhlIG9iamZpbGUgd2UgcGFzc2VkIHRvCisJbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUgd2FzIHNvbWV0aW1lcyBOVUxMKS4KKworCSogdmFsb3BzLmMgKGNhbGxfZnVuY3Rpb25fYnlfaGFuZCwgcHVzaF93b3JkKSwgZGVmcy5oIChwdXNoX3dvcmQpLAorCWNvbnZleC14ZGVwLmMsIG04OGstbmF0LmMsIGkzODZtMy1uYXQuYywgbWlwcy10ZGVwLmMsIG1pcHNtMy1uYXQuYywKKwluczMya20zLW5hdC5jLCByZW1vdGUtYnVnLmMsIG04OGstdGRlcC5jLCByZW1vdGUtaG1zLmMsIHJlbW90ZS1taXBzLmMsCisJY29uZmlnL2dvdWxkL3RtLW5wMS5oLCBocHBhLXRkZXAuYyAoaHBwYV9maXhfY2FsbF9kdW1teSksIHJlbW90ZS12eC5jOgorCVVzZSBSRUdJU1RFUl9TSVpFLCB1bnNpZ25lZCBMT05HRVNULCBhbmQKKwl7c3RvcmUsZXh0cmFjdH1fdW5zaWduZWRfaW50ZWdlciwgaW5zdGVhZCBvZiBzaXplb2YKKwkoUkVHSVNURVJfVFlQRSkgYW5kIFJFR0lTVEVSX1RZUEUuCisJKiBBbGwgdG0uaCBmaWxlczogQ2hhbmdlIFJFR0lTVEVSX1RZUEUgdG8gUkVHSVNURVJfU0laRS4KKwkqIGhwcGEtdGRlcC5jIChwYV9wcmludF9mcF9yZWcpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHZhbC4KKworCSogTWFrZWZpbGUuaW4gKEFMTERFUEZJTEVTKTogUmVtb3ZlIGkzODZseS1uYXQuYyBhbmQgbTY4a2x5LW5hdC5jLgorCUFkZCBseW54LW5hdC5jLgorCitTYXQgRGVjIDI1IDIwOjA1OjQxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisgICAgKiBocHBhLXRkZXAuYyAoaW5pdF9leHRyYV9mcmFtZV9pbmZvKTogQ29ycmVjdGx5IGFkanVzdCB0aGUgYmFzZQorCW9mIHRoZSBjdXJyZW50IGZyYW1lIHdoZW4gImZyb21sZWFmIiBpcyB0cnVlLiAgRG8gbm90IGFkanVzdCB0aGUKKwlmcmFtZSBiYXNlIG9mIHRoZSBpbm5lcm1vc3QgZnJhbWUgaWYgaXQgaXMgYSBsZWFmIGZ1bmN0aW9uLgorCitTYXQgRGVjIDI1IDEzOjM5OjIxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFic3JlYWQuYyAoZGVmaW5lX3N5bWJvbCk6IE9ubHkgY29tYmluZSBhIHAvciBwYWlyIGludG8gYQorCUxPQ19SRUdQQVJNIGlmIFJFR19TVFJVQ1RfSEFTX0FERFIuCisKK1NhdCBEZWMgMjUgMDk6NTA6MjkgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiB2YWxvcHMuYyAodmFsdWVfc3RydWN0X2VsdCk6IENoZWNrIGZvciAodmFsdWUpLTEgcmV0dXJuIGZyb20KKwlzZWFyY2hfc3RydWN0X21ldGhvZC4KKworU2F0IERlYyAyNSAwOTo1MDoyOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZGVmcy5oOiBNb3ZlIGRlZmluaXRpb25zIG9mIFRBUkdFVF8qX0JJVCBhZnRlciBpbmNsdWRlIG9mIHRtLmguCisJVGhlIG9sZCB3YXkgKHVzaW5nICN1bmRlZiBpbiB0bS5oKSB3YXMgdWdseSBhbmQgYXNraW5nIGZvcgorCXRyb3VibGUsIGJlY2F1c2UgaXQgbWFrZXMgaXQgcG9zc2libGUgZm9yIHNvbWUgZmlsZSB0byB1c2UgdGhlCisJd3JvbmcgZGVmaW5pdGlvbi4gIE1vdmUgZGVmaW5pdGlvbiBvZiBIT1NUX0NIQVJfQklUIGFmdGVyIGRlZmluaXRpb24KKwlvZiBUQVJHRVRfQ0hBUl9CSVQuCisJKiBjb25maWcvYWxwaGEvdG0tYWxwaGEuaCwgY29uZmlnL2g4MzAwL3RtLWg4MzAwLmgsCisJY29uZmlnL2g4NTAwL3RtLWg4NTAwLmgsIGNvbmZpZy96OGsvdG0tejhrLmg6IERvbid0IHVuZGVmIFRBUkdFVF8qX0JJVAorCWJlZm9yZSBkZWZpbmluZyB0aGVtLgorCisJKiBtZGVidWdyZWFkLmM6IENoYW5nZSB0aGUgYnVpbHRpbl90eXBlXyogaW4gdGhpcyBmaWxlIHRvCisJbWRlYnVnX3R5cGVfKiBhbmQgbWFrZSB0aGVtIHN0YXRpYy4gIFVzZSBUWVBFX0NPREVfRVJST1IgZm9yCisJY29tcGxleCBhbmQgZmxvYXQgZGVjaW1hbC4KKworCSogcHJpbnRjbWQuYyAoZGlzYXNzZW1ibGVfY29tbWFuZCk6IENhbGwgd3JhcF9oZXJlIGJldHdlZW4gcHJpbnRpbmcKKwlhZGRyZXNzIGFuZCBwcmludGluZyBpbnN0cnVjdGlvbi4KKworRnJpIERlYyAyNCAxNDoyMzo1NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnNyZWFkLmMgKHJlYWRfdHlwZSk6IERvbid0IGZhbGwgdGhyb3VnaCAnUycgY2FzZSAodGhlIGNhc2UgaXQKKwl3YXMgZmFsbGluZyB0aG91Z2ggaGFwcGVuZWQgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nICgiYnJlYWs7IikgYnV0IHRoYXQKKwlpcyBoYXJkbHkgYSBnb29kIHRoaW5nIHRvIGFzc3VtZSkuCisKK1R1ZSBEZWMgMjEgMTM6MzI6MDIgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIGNoLWV4cC55IChtYXRjaF9kb2xsYXJfdG9rZW5zKTogIEZpeCBvZmYtYnktb25lIGJ1Zy4KKwkqIGNoLWxhbmcuYyAoY2hpbGxfaXNfdmFyeWluZ19zdHJ1Y3QpLCBjaC1sYW5nLmg6ICBOZXcgZnVuY3Rpb24uCisJKiBjaC1sYW5nLmMgKGNoaWxsX3ByaW50c3RyKTogIFVzZSBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3Rlcy4KKwkqIGNoLXR5cGVwcmludC5jIChjaGlsbF90eXBlX3ByaW50X2Jhc2UpOiAgSGFuZGxlIFRZUEVfQ09ERV9CSVRTVFJJTkcuCisJSW1wcm92ZSBwcmludGluZyBvZiBUWVBFX0NPREVfU1RSSU5HLCBUWVBFX0NPREVfU0VULCBhbmQKKwlUWVBFX0NPREVfU1RSVUNUIChpbmNsdWRpbmcgY2hlY2tpbmcgY2hpbGxfaXNfdmFyeWluZ19zdHJ1Y3QpLgorCVByaW50IFRZUEVfRFVNTVlfUkFOR0UgYnkgcHJpbnRpbmcgaXRzIFRZUEVfVEFSR0VUX1RZUEUuCisJSGFuZGxlIFRZUEVfQ09ERV9FTlVNLgorCSogY2gtdmFscHJpbnQuYyAoY2hpbGxfdmFsX3ByaW50KTogIEhhbmRsZSBUWVBFX0NPREVfQklUU1RSSU5HLgorCUZvciBUWVBFX0NPREVfU1RSSU5HLCBuZXZlciBwcmludCBhZGRyZXNzLiAgSGFuZGxlIFZBUllJTkcgc3RyaW5ncy4gCisJKiBnZGJ0eXBlcy5jIChmb3JjZV90b19yYW5nZV90eXBlKTogIE5ldy4KKwkqIGdkYnR5cGVzLmMgKGNyZWF0ZV9zZXRfdHlwZSk6ICBNYWtlIHdvcmssIGZvbGxvd2luZyBDaGlsbCBsYXlvdXQuCisJKiBnZGJ0eXBlcy5oIChUWVBFX0xPV19CT1VORCwgVFlQRV9ISUdIX0JPVU5ELCBUWVBFX0RVTU1ZX1JBTkdFKTogTmV3LgorCSogc3RhYnNyZWFkLmMgKHJlYWRfdHlwZSk6ICBEaXN0aW5ndWlzaCBzdHJpbmcgYW5kIGJpdHN0cmluZyBmcm9tCisJY2hhci1hcnJheSBhbmQgc2V0LgorCSogdmFsYXJpdGguYyAodmFsdWVfc3Vic2NyaXB0KSwgdmFsb3BzLmMgKHZhbHVlX2NvZXJjZV9hcnJheSk6CisJSGFuZGxlIFNUUklOR3MgYXMgd2VsbCBhcyBBUlJBWXMuCisJKiB2YWxhcml0aC5jICh2YWx1ZV9iaXRfaW5kZXgpOiAgRml4IHRoaW5rLiAgVXNlIG5ldyBtYWNyb3MuCisKKworRnJpIERlYyAxNyAxMDo0NTozMiAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIHN5bXRhYiAoZGVjb2RlX2xpbmVfMSk6IGZpeCBhIGJ1ZyB3aGVuIHBvc2l0aW9uIGNoYXIgaXMgbm90CisJc2V0IGNvcnJlY3RseS4KKwkqIGMtdmFscHJpbnQgKGNfdmFsX3ByaW50KTogaGFuZGxlIHZ0YmwgcHJpbnRpbmcgd2hlbiB2dGJsIGlzIG5vdAorCXNldCB1cCB5ZXQuCisKK1RodSBEZWMgMTYgMTY6NDY6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBtaXBzLXRkZXAuYyAocmVhZF9uZXh0X2ZyYW1lX3JlZyk6IElmIFNJR0ZSQU1FX1JFR19TSVpFIGlzIG5vdAorCWRlZmluZWQsIGRlZmluZSBpdCBhcyA0LgorCitUaHUgRGVjIDE2IDEzOjA4OjAxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvbTY4ay9ubS1ocDMwMGJzZC5oOiBDb3JyZWN0bHkgaWRlbnRpZnkgNC4zQlNEIHZzIDQuNEJTRC4KKworCSogY29uZmlnL202OGsvdG0taHAzMDBic2QuaCAoUkVNT1RFX0JQVF9WRUNUT1IpOiBEZWZpbmUuCisKKwkqIGNvbmZpZy9tNjhrL3RtLW02OGsuaCAoUkVNT1RFX0JQVF9WRUNUT1IpOiBBbGxvdyB0YXJnZXRzIHRvCisJb3ZlcnJpZGUuCisJKFJFTU9URV9CUkVBS1BPSU5UKTogTGlrZXdpc2UuCisKK1RodSBEZWMgMTYgMDk6MTQ6NTggMTk5MyAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcmVhZC5jIChyZWFkX2hwX2Z1bmN0aW9uX3R5cGUpOiBDb3JyZWN0bHkgaGFuZGxlCisJcGFzcy1ieS12YWx1ZSBzdHJ1Y3R1cmVzID4gNjRiaXRzIGluIHNpemUuCisJKHByb2Nlc3Nfb25lX2RlYnVnX3N5bWJvbCk6IExpa2V3aXNlLgorCitNb24gRGVjIDEzIDIwOjE3OjM5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQorCisJSW1wbGVtZW50IHN1cHBvcnQgZm9yIENoaWxsIFBPV0VSU0VUcy4KKwkqIGNoLWV4cC55IChvcGVyYW5kXzIpOiAgSW1wbGVtZW50ICdFbGVtZW50IElOIFBvd2VyU2V0Jy4KKwkqIGNoLXR5cGVwcmludC5jIChjaGlsbF90eXBlX3ByaW50X2Jhc2UpOiAgSGFuZGxlIFBPV0VSU0VUcy4KKwkqIGNoLXZhbHByaW50LmMgKGNoaWxsX3ZhbF9wcmludCk6ICBIYW5kbGUgVFlQRV9DT0RFX1NFVC4KKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKTogIEltcGxlbWVudCBCSU5PUF9JTi4KKwkqIGV4cHJlc3Npb24uaCAoZW51bSBleHBfb3Bjb2RlKTogIEFkZGVkIEJJTk9QX0lOLgorCSogZ2RidHlwZXMuYyAoY3JlYXRlX3NldF90eXBlKSwgZ2RidHlwZXMuaDogIE5ldyBmdW5jdGlvbi4KKwkqIHN0YWJzcmVhZC5jIChyZWFkX3R5cGUpOiAgSWYgJ1MnLCBjcmVhdGUgYSBzZXQgdHlwZS4KKwkqIHZhbGFyaXRoLmMgKHZhbHVlX2JpdF9pbmRleCwgdmFsdWVfaW4pLCB2YWx1ZS5oOiAgTmV3IGZ1bmN0aW9ucywKKwlmb3IgaW5kZXhpbmcgaW4gU0VUcy4KKworTW9uIERlYyAxMyAwNjo0MjozNyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogcGFyZWFkLmMgKHBhX3N5bWZpbGVfaW5pdCk6IENoZWNrIGZvciB0aGUgZXhpc3RhbmNlIG9mIHN0YWJzCisJYWZ0ZXIgREJYX1RFWFRfU0VDVCBoYXMgYmVlbiBpbml0aWFsaXplZC4KKworVHVlIE5vdiAyMyAxNzoyOToyOCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisgICAgICAgICogY29uZmlnL2g4MzAwL3RtLWg4MzAwLmggKEJSRUFLUE9JTlQpOiBJbnNuIGNoYW5nZWQgdG8gc2xlZXAuCisJKERFQ1BfUENfQUZURVJfQlJFQUspOiBOb3cgaXMgMC4KKwkqIGNvbmZpZy9oODUwMC90bS1oODUwMC5oIChSRUdJU1RFUl9CWVRFUywgUkVHSVNURVJfQllURSwKKwlSRUdJU1RFUl9OQU1FUyk6IHVwZGF0ZSB0byBuZXcgdmlldy4gIChJTklUX0VYVFJBX0ZSQU1FX0lORk8pOiBObworCWV4dHJhIGZyYW1lIGluZm8gbm93LgorCSogY29uZmlnL3NoL3NoLmggKE5PUCk6IERlZmluZSBOT1AgaW5zbi4KKwkqIGNvbmZpZy96OGsvdG0tejhrLmggKEJJRyk6IGlzIG5vdyBzaW1fejgwMDFfbW9kZS4gIAorCSogY29uZmlnL3o4ay96OGtzaW0ubXQgKFRERVBGSUxFUyk6IEFkZCByZW1vdGUtc2ltLm8gdG8gbGlzdC4KKwkqIHNlci1nbzMyLmM6IExpbnQuIChzdHJuY2FzZWNtcCk6IFJlbW92ZWQsIG5vdyBpbiBsaWJpYmVydHkuCisJKGdvMzJfcmVhZGNoYXIpOiBTcGVjaWFsIGhhbmRsaW5nIGZvciBmYXN0ZXIgcG9sbGluZy4gKGFzeW5jCisJc3RydWN0dXJlKTogVm9sYXRpbGUuCisJKiBoODMwMC10ZGVwLmMgKHByaW50X3JlZ2lzdGVyX2hvb2spOiBBbGxvY2F0ZSBhbmQgdXNlIHRoZSByaWdodAorCW51bWJlciBieXRlcyBmb3IgdGhlIHJhdyByZWdpc3Rlci4KKwkqIGg4NTAwLXRkZXAuYyAocmVnb2ZmLCBmcmFtZV9maW5kX3NhdmVkX3JlZywgZXhhbWluZV9wcm9sb2d1ZSk6CisJZGVsZXRlZC4gKGg4NTAwX3JlZ2lzdGVyX3NpemUsIGg4NTAwX3JlZ2lzdGVyX3ZpcnR1YWxfdHlwZSwgKToKKwlVc2UgbmV3IHdheSBvZiBjb3VudGluZyByZWdpc3RlcnMuCisJKiByZW1vdGUtZTcwMDAuYyAoZWNob19pbmRleCk6IGRlbGV0ZWQuIChleHBlY3QpOiBCZXR0ZXIgaGFuZGxpbmcKKwlvZiB1c2VyIGludGVycnVwdHMuIChleHBlY3RfcHJvbXB0KTogUmVtb3ZlIG5ldmVyIHVzZWQgbG9nIGZpbGUKKwlzdXBwb3J0LiAod2FudCwgd2FudF9ub3BjKTogQWRkIHN1cHBvcnQgZm9yIEg4LzMwMEguCisJKGZldGNoX3JlZ3NfZnJvbV9kdW1wKTogVHJlYXQgXHIgYW5kIFxuIGFzIHdoaXRlc3BhY2UuCisJKGU3MDAwX2RyYWluKTogU2VuZCBhbiAiZW5kIiBjb21tYW5kIGJlZm9yZSB3YWl0aW5nIGZvciBvdXRwdXQgdG8KKwlzdG9wLiAgKGU3MDAwX3dhaXQpOiBDb3BlIHdpdGggSDgvMzAwSCwgYmV0dGVyIGhhbmRsaW5nIG9mIHVzZXIKKwlpbnRlcnJ1cHRzLiAgKHdoeV9zdG9wLCBleHBlY3Rfbiwgc3ViMl9mcm9tX3BjKTogTmV3IGZ1bmN0aW9uLgorCSogcmVtb3RlLXV0aWxzLmMgKGdyX2xvYWRfaW1hZ2UpOiBjYWxsIGZmbHVzaCBhbmQgUVVJVCBtb3JlIHJlZ3VsYXJseS4KKwkqIHV0aWxzLmMgKG5vdGljZV9xdWl0KTogTmV3IGZ1bmN0aW9uIGZvciBwb2xsaW5nIGZvciB1c2VyIGludGVycnVwdHMuCisKK0ZyaSBEZWMgMTAgMTU6NTM6NTYgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIHN0YWJzcmVhZC5jIChyZWFkX2FycmF5X3R5cGUpOiAgQWxsb3cgbmVnYXRpdmUgYXJyYXkgYm91bmRzLAorCXdpdGhvdXQgaW50ZXJwcmV0aW5nIHRoYXQgdG8gbWVhbiAiYWRqdXN0YWJsZS4iCisJKiBjaC12YWxwcmludC5jIChjaGlsbF92YWxfcHJpbnQpOiAgSGFuZGxlIFJBTkdFIHR5cGVzLgorCSogY2gtdHlwZXByaW50LmMgKGNoaWxsX3R5cGVfcHJpbnRfYmFzZSk6ICBIYW5kbGUgQk9PTC4KKwlIYW5kbGUgdmFyaWFudCByZWNvcmRzLiAgSGFuZGxlIFJBTkdFIHR5cGVzLgorCitUdWUgRGVjICA3IDE1OjQxOjMyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21pcHMvaWR0Lm10OiBVc2UgdG0taWR0LmggaW5zdGVhZCBvZiB0bS1iaWdtaXBzLmguCisJKiBjb25maWcvbWlwcy9pZHRsLm10OiBVc2UgdG0taWR0bC5oIGluc3RlYWQgb2YgdG0tbWlwcy5oLgorCSogY29uZmlnL21pcHMvdG0taWR0LmgsIGNvbmZpZy9taXBzL3RtLWlkdGwuaDogTmV3IGZpbGVzOyB1c2UKKwlkaWZmZXJlbnQgQlJFQUtQT0lOVCB2YWx1ZSBmb3IgSURULgorCisJKiBtaXBzcmVhZC5jOiBJbmNsdWRlIGJmZC5oIGFuZCBjb2ZmL3N5bS5oLgorCitNb24gRGVjICA2IDE2OjM0OjEwIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBzZXItdW5peC5jIChzZXRfdHR5X3N0YXRlKTogc2V0IHRoZSByZXN0IG9mIHRoZSB0ZXJtaW5hbCBzdGF0ZQorCSAgcGllY2VzLgorCitNb24gRGVjICA2IDEyOjAxOjM3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgbWlwcyogZm9yIGFsbCBtaXBzIHRhcmdldHMuCisJKG1pcHMqZWwtKi1lbGYqLCBtaXBzKi0qLWVsZiopOiBOZXcgdGFyZ2V0czsgdXNlIGlkdCBhbmQgaWR0bC4KKworCUFkZGVkIElyaXggNSBzdXBwb3J0LgorCSogY29uZmlndXJlLmluIChtaXBzLXNnaS1pcml4NSopOiBOZXcgaG9zdCBhbmQgdGFyZ2V0LiAgVXNlIGlyaXg1CisJZm9yIGJvdGguCisJKiBjb25maWcvbWlwcy9pcml4NS5taCwgY29uZmlnL21pcHMvaXJpeDUubXQsCisJY29uZmlnL21pcHMveG0taXJpeDUuaCwgY29uZmlnL21pcHMvbm0taXJpeDUuaCwKKwljb25maWcvbWlwcy90bS1pcml4NS5oLCBpcml4NS1uYXQuYzogTmV3IGZpbGVzIGZvciBJcml4IDUgc3VwcG9ydC4KKwkqIG1kZWJ1Z3JlYWQuYzogTmV3IGZpbGUsIHNwbGl0IG91dCBvZiBtaXBzcmVhZC5jLiAgQWRkZWQKKwllbGZtZGVidWdfYnVpbGRfcHN5bXRhYnMgcm91dGluZS4gIEFkZGVkIHNvbWUgY2hlY2tzIG9uIGV4dGVybmFsCisJc3ltYm9scy4gIENoYW5nZWQgY29kZSB0byBrZWVwIGVjb2ZmX2RlYnVnX2luZm8gYW5kCisJZWNvZmZfZGVidWdfc3dhcCBzdHJ1Y3RzIGluIHRoZSBwc3ltdGFiIGFuZCBpbiBnbG9iYWwgcG9pbnRlcnMKKwlyYXRoZXIgdGhhbiByZXRyaWV2aW5nIHRoZW0gZnJvbSB0aGUgYmZkLiAgQWxzbyBjaGFuZ2VkIHRvIGtlZXAKKwl0aGUgcGVuZGluZyBsaXN0IHdpdGggdGhlIHBzeW10YWIgcmF0aGVyIHRoYW4gdGhlIG9iamZpbGUgKGVhY2gKKwlwc3ltdGFiIGZvciBhIHNpbmdsZSBvYmpmaWxlIHBvaW50cyB0byB0aGUgc2FtZSBwZW5kaW5nIGxpc3QpLgorCSogbWlwc3JlYWQuYzogQnVsayBvZiBmaWxlIG1vdmVkIGludG8gbWRlYnVncmVhZC5jLCBsZWF2aW5nIGp1c3QKKwl0aGUgc3ltX2Zucy4KKwkqIE1ha2VmaWxlLmluIChTRklMRVMpOiBBZGRlZCBtZGVidWdyZWFkLmMuCisJKE9CUyk6IEFkZGVkIG1kZWJ1Z3JlYWQuby4KKwkobWRlYnVncmVhZC5vKTogTmV3IHRhcmdldC4KKwkqIHN5bWZpbGUuaDogRGVjbGFyZSBtZGVidWdfYnVpbGRfcHN5bXRhYnMgYW5kCisJZWxmbWRlYnVnX2J1aWxkX3BzeW10YWJzLgorCSogZWxmcmVhZC5jIChzdHJ1Y3QgZWxmaW5mbyk6IEFkZGVkIG1kZWJ1Z3NlY3QgZmllbGQuCisJKGVsZl9sb2NhdGVfc2VjdGlvbnMpOiBSZW1lbWJlciBsb2NhdGlvbiBvZiAubWRlYnVnIHNlY3Rpb24uCisJKGVsZl9zeW1maWxlX3JlYWQpOiBDYWxsIGVsZm1kZWJ1Z19idWlsZF9wc3ltdGFicyBvbiAubWRlYnVnCisJc2VjdGlvbi4KKwkqIGluZnJ1bi5jIChBVF9GVU5DVElPTl9TVEFSVCk6IFNldCB0byAwIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCisJKHdhaXRfZm9yX2luZmVyaW9yKTogVXNlIEFUX0ZVTkNUSU9OX1NUQVJUIGlmIGl0IGlzIGRlZmluZWQgdG8gc2VlCisJaWYgUEMgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24uCisJKiBtaXBzLXRkZXAuYyAocmVhZF9uZXh0X2ZyYW1lX3JlZyk6IFVzZSBTSUdGUkFNRV9SRUdfU0laRSwgYW5kCisJZ2l2ZSBpdCBhIGRlZmF1bHQgZGVmaW5pdGlvbi4KKwkobWlwc19za2lwX3Byb2xvZ3VlKTogU2tpcCBpbnN0cnVjdGlvbnMgd2hpY2ggaW5pdGlhbGl6ZSAkZ3AKKwlyZWdpc3Rlci4KKwkoaW5fc2lndHJhbXApOiBOZXcgcHJvY2VkdXJlLCBtb3ZlZCBpbiBmcm9tIG1pcHNyZWFkLmMuCisJKiBjb25maWcvbWlwcy90bS1taXBzLmg6IERlY2xhcmUgaW5fc2lndHJhbXAuCisKKwkqIHNlcmlhbC5oIChzZXJpYWxfZmRvcGVuKTogTWFrZSBwYXJhbWV0ZXIgY29uc3QgdG8gbWF0Y2gKKwlmdW5jdGlvbiBkZWZpbml0aW9uLgorCitGcmkgRGVjICAzIDE0OjIwOjQzIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taXBzL2lyaXg0Lm1oOiAgRW5hYmxlIHNlci10Y3Auby4KKworVHVlIE5vdiAzMCAxNToyNDoyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChjaGVjayk6IERvIG5vdCB1c2Ugc3ViZGlyX2RvLCBzbyB0aGF0CisJVEFSR0VUX0ZMQUdTX1RPX1BBU1MgaXMgdXNlZCBjb3JyZWN0bHkuCisKK01vbiBOb3YgMjkgMTY6MTA6MzggMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogaTM4Ni1ubG1zdHViLmM6ICBVbmRvIEkvTyByZWRpcmVjdGlvbiBjaGFuZ2VzIGJ5IFRvbSBMb3JkLgorCVRoZXNlIGRlZmluaXRlbHkgd29uJ3Qgd29yayB1bmRlciBOZXR3YXJlLgorCitNb24gTm92IDI5IDE1OjM0OjU4IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogc3RhYnNyZWFkLmMocmVhZF9zdHJ1Y3RfZmllbGQpOiBGaXggdGhlIGNoZWNrIHdoZW4gZ2V0dGluZyB0bworCW1lbWJlciBmdW5jdGlvbnMuCisKK01vbiBOb3YgMjkgMTY6NDg6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJZ2NjIC1XYWxsIC1PIGxpbnQ6CisJKiBtaXBzLXRkZXAuYyAoaGV1cmlzdGljX3Byb2NfZGVzYyk6IEluaXRpYWxpemUgcmVnMzAgdG8gYXZvaWQKKwl3YXJuaW5nLiAgVW5uZXN0IGNvbW1lbnQuCisJKGluaXRfZXh0cmFfZnJhbWVfaW5mbyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgbWFzay4KKwkoTUFTSyk6IEZ1bGx5IHBhcmVudGhlc2l6ZS4KKwkobWlwc19wdXNoX2R1bW15X2ZyYW1lKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSB2YWwuCisJKG1pcHNfc2tpcF9wcm9sb2d1ZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIGYgYW5kIGIuCisKK01vbiBOb3YgMjkgMTI6MjM6MjUgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBtaXBzcmVhZC5jIChwYXJzZV9zeW1ib2wsIHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6IERvIG5vdCBjcmVhdGUKKwkocGFydGlhbCkgc3ltYm9scyBmb3Igb3BhcXVlIHN0cnVjdCBkZWZpbml0aW9ucy4KKworTW9uIE5vdiAyOSAxMTozNjo1NyAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBpMzg2bHktdGRlcC5jIChpMzg2bHlueF9zYXZlZF9wY19hZnRlcl9jYWxsKTogIENoYW5nZSBjYWxsX2luc3QKKwl0byB1bnNpZ25lZCBjaGFyIHRvIGF2b2lkIGRvbWFpbiB3YXJuaW5nIGZvciBzb21lIHZhbHVlcy4KKworTW9uIE5vdiAyMiAyMzo0Mjo1OSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiByZW1vdGUtZTcwMDAuYyAoZTcwMDBfd2FpdCk6IENvcGUgd2l0aCBIOC8zMDAgcmVnaXN0ZXIgZHVtcC4KKwkqIGNvbmZpZy9oODMwMC9oODMwMGhtcy5tdDogQWRkIHJlbW90ZS1lNzAwMC4KKworTW9uIE5vdiAyMiAxMTowMzo0NSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCU1lcmdlZCBjaGFuZ2VzIGZyb20ga2V2QHNwdWRzLmdlZy5tb3QuY29tIChLZXZpbiBBLiBCdWV0dG5lcik6CisJKiBnZGIvY29uZmlnL204OGsvZGVsdGE4OC5taCAoTkFUREVQRklMRVMpOiBBZGRlZCBjb3JlbG93Lm8gYW5kCisJY29yZWRlcC5vIHRvIHRoaXMgbGlzdC4KKwkqIGdkYi9tODhrLW5hdC5jIChtODhrX3JlZ2lzdGVyX3VfYWRkcik6ICBBdm9pZCBlcnJvciB3aGVuIHBhc3NlZAorCXRoZSBudW1iZXIgZm9yIGFuIE04ODExMCBleHRlbmRlZCByZWdpc3RlciBieSBqdXN0IHJldHVybmluZyB0aGUKKwlhZGRyZXNzIG9mIHIwLgorCitTYXQgTm92IDIwIDA5OjIwOjUxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBydGwuY3lnbnVzLmNvbSkKKworCSogZ28zMi14ZGVwLmMgKHJlX2NvbXAsIHJlX2V4ZWMpOiAgUmVtb3ZlIHN0dWJzIG5vdyB0aGF0IGdkYgorCWFsd2F5cyB1c2VzIGl0J3Mgb3duIHZlcnNpb24gb2YgcmVnZXguCisKK0ZyaSBOb3YgMTkgMTg6MjM6MTkgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQorCisJKiB2YWxvcHMuYyh2YWx1ZV9zdHJ1Y3RfZWx0X2Zvcl9yZWZlcmVuY2UpOiBlbmhhbmNlICBzZWFyY2ggb3BlcmF0b3IgaW4KKwljKysuCisJKiBzeW10YWIuYyhkZWNvZGVfbGluZV8xKTogc2FtZSBhcyBhYm92ZS4KKworRnJpIE5vdiAxOSAxNTowODo0NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3ltdGFiLmMgKGRlY29kZV9saW5lXzEpOiBBZGQgY29tbWVudCBhYm91dCB1c2Ugb2YKKwlyZXR1cm5fdG9fdG9wX2xldmVsIGRpcmVjdGx5IGluc3RlYWQgb2YgZXJyb3IuICBBZGQgY29tbWVudCBzYXlpbmcKKwl0aGF0IHRoZSAnJyBzaG91bGQgbm90IGJlIG5lZWRlZC0tdGhhdCB0aGUgY29tcGxldGVyIHNob3VsZCBiZSBmaXhlZC4KKworRnJpIE5vdiAxOSAxMTowMDozMyAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIHN5bXRhYi5jKGRlY29kZV9saW5lXzEpOiBmaXggdGhlIGluY29uc2lzdGVuY3kgb2Ygc2V0dGluZworCWJyZWFrcG9pbnQgd2l0aCAnJyBvciB3aXRob3V0IHRoZW0uIFRoZSAnJyBpcyBuZWVkZWQgd2hlbiB5b3UKKwl3YW50IG5hbWUgY29tcGxldGlvbi4KKworVGh1IE5vdiAxOCAwODoyNTo1MCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogdmFscHJpbnQuYyAodmFsX3ByaW50X3N0cmluZyk6ICBXaGVuIGxvb2tpbmcgZm9yIGEgbnVsbAorCXRlcm1pbmF0b3IgY29tcGFyZSBjdXJyZW50IGJ1ZnNpemUgdG8gZmV0Y2hsaW1pdCB0byBkZXRlcm1pbmUKKwl3aGVuIHRvIHN0b3AsIGluc3RlYWQgb2YgY29tcHV0aW5nIGJ1ZmZlcitmZXRjaGxpbWl0IHdoaWNoCisJbWF5IG92ZXJmbG93IGZvciB2ZXJ5IGxhcmdlIGxpbWl0cyAobGlrZSAidW5saW1pdGVkIikuCisKK1dlZCBOb3YgMTcgMTg6MjM6MDkgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBldmFsLmMoZXZhbHVhdGVfc3ViZXhwKTogdG8gdXNlIHVuaWZpZWQgc2VhcmNoIHNvIHR5cGUgY29udmVyc2lvbiAKKwlvcGVyYXRvciB3b3JrcyBpbiBjYWxsaW5nIG1ldGhvZC4KKwkqIHZhbGFyaXRoLmModmFsdWVfeF9iaW5vcCwgdmFsdWVfeF91bm9wKTogc2FtZSBhcyBhYm92ZS4KKwkqIHZhbG9wcy5jKHNlYXJjaF9zdHJ1Y3RfbWV0aG9kKTogc2FtZSBhcyBhYm92ZS4KKworV2VkIE5vdiAxNyAxODo0NzozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIG1pcHNyZWFkLmM6IENoYW5nZSB1c2Ugb2YgRUNPRkYgaW5mb3JtYXRpb24gdG8gY29ycmVzcG9uZCB0bworCWNoYW5nZXMgaW4gYmZkL2xpYmVjb2ZmLmguCisJKG1pcHNjb2ZmX3N5bWZpbGVfb2Zmc2V0cyk6IE1hZGUgc3RhdGljLgorCitXZWQgTm92IDE3IDA5OjQzOjMxIDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogdmFsb3BzLmMgKHR5cGVjbXApOiBpbXByb3ZlIHByb3RvdHlwZSBtYXRjaGluZyB3aGVuIGNhbGxpbmcKKwlhIG1ldGhvZC4gTWFrZSAncCAoKihvc3RyZWFtICopICZjb3V0KSA8PCAibGxsIiAnIHRvIHdvcmsuCisJKiBldmFsLmMoZXZhbHV0ZV9zdWJleHApOiBmaXggb3BlcmF0b3Igc2VhcmNoIHByb2JsZW0gd2hlbiBjYWxsCisJbGlrZSAgcCB4LidvcGVyYXRvcisnKGkpLgorCitUdWUgTm92IDE2IDE3OjE1OjAzIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGkzODZseS1uYXQuYywgaTM4Nmx5bngtbmF0LmMsIG02OGtseS1uYXQuYzogIFJlbW92ZS4gIE1vdmUKKwljb21tb24gY29kZSBpbnRvIGx5bngtbmF0LmMuCisJKiBseW54LW5hdC5jOiAgTmV3IG1vZHVsZS4gIENvbnRhaW5zIHBvcnRhYmxlIGNvZGUgZm9yIEx5bnggbmF0aXZlCisJc3R1ZmYgKG1vc3RseSBwdHJhY2UgcmVsYXRlZCkuCisJKiBjb25maWcvaTM4Ni9pMzg2bHlueC5taCAoTkFUREVQRklMRVMpOiAgaTM4Nmx5LW5hdC5vIC0+IGx5bngtbmF0Lm8KKwkqIGNvbmZpZy9tNjhrL202OGtseW54Lm1oIChOQVRERVBGSUxFUyk6ICBpMzg2bHktbmF0Lm8gLT4gbHlueC1uYXQubworCisJKiBjb25maWcvbm0tbHlueC5oLCBjb25maWcvdG0tbHlueC5oOiAgTmV3IGZpbGVzIHRvIGNvbnRhaW4KKwlub24tYXJjaGl0ZWN0dXJlIHNwZWNpZmljIG5hdGl2ZSBhbmQgdGFyZ2V0IGRlZnMuCisJKiBjb25maWcvaTM4Ni9ubS1pMzg2bHlueC5oLCBjb25maWcvaTM4Ni90bS1pMzg2bHlueC5oLAorCWNvbmZpZy9tNjhrL25tLW02OGtseW54LmgsIGNvbmZpZy9tNjhrL3RtLW02OGtseW54Lmg6ICBNb3ZlIGFsbAorCShhcmNoKSBwb3J0YWJsZSBzdHVmZiBpbnRvIC4uL3t0bSBubX0tbHlueC5oLgorCitUdWUgTm92IDE2IDEzOjMzOjQ3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzeW10YWIuYyAoZ2RiX21hbmdsZV9uYW1lKTogT25seSBhc3N1bWUgdGhhdCB0aGUgcGh5c25hbWUgaXMKKwl0aGUgZW50aXJlIG1hbmdsZWQgbmFtZSBpZiBpdCBsb29rcyBsaWtlIHRoZSBtYW5nbGVkIG5hbWUgb2YgYQorCWNvbnN0cnVjdG9yLiAgTmVlZGVkIGZvciB0ZXN0c3VpdGUgdG8gd29yayB3aXRoIEdDQyAyLjQuNS4KKworCSogYTY4di1uYXQuYzogUmVwbGFjZSB3aXRoIG5ldyB2ZXJzaW9uIGZyb20gVHJveSBSb2xsby4gIFRoZQorCXZlcnNpb24JSSBhbSByZXBsYWNpbmcgYXBwZWFycyB0byBiZSBhbiBvbGQgY29weSBvZiBzdW4zLW5hdC5jLgorCSogZHN0cmVhZC5jIChkc3Rfc3ltZmlsZV9yZWFkKTogUmVwbGFjZSBzb3J0X2FsbF9zeW10YWJfc3ltcyBjYWxsCisJd2l0aCBsb29wLgorCisJKiBNYWtlZmlsZS5pbiAoVEFHUyk6IERlcGVuZCBvbiBUQUdGSUxFU197Tk8sV0lUSH1fU1JDRElSLgorCisJKiBNYWtlZmlsZS5pbjogKEhGSUxFUyxUQUdGSUxFUyk6IFNwbGl0IGludG8gX1dJVEhfU1JDRElSIGFuZAorCV9OT19TUkNESVIgdmVyc2lvbnMuCisJKFRBR1MpOiBPbmx5IGFkZCBzcmNkaXIgdG8gVEFHRklMRVNfTk9fU1JDRElSLgorCShUaGlzIGlzIHBhcnQgb2YgYSBsb25nIHNhZ2EgaW52b2x2aW5nIG1lIHB1dHRpbmcgc3JjZGlyIG9uCisJZXZlcnl0aGluZyAocGVyaGFwcyBmb3Igbm93LW9ic29sZXRlIHJlYXNvbnMsIEkgZm9yZ2V0KSwgUmljaAorCXJlbW92aW5nIHRoZSBzcmNkaXIgZnJvbSBldmVyeXRoaW5nLCBTdHUgcHV0dGluZyBpdCBiYWNrIHNvbWUKKwlwbGFjZXMgZm9yIFN1biBtYWtlLCBhbmQgbWUganVzdCBub3cgZ2V0dGluZyBhcm91bmQgdG8gZml4aW5nCisJYG1ha2UgVEFHUycgYWdhaW4pLgorCitNb24gTm92IDE1IDEyOjI5OjEwIDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogc3RhY2suYyhwcmludF9mcmFtZV9pbmZvKTogcHJpbnQgZGVtYW5nbGVkIGZ1bmN0aW9uIG5hbWUKKwlhbnNpIHN0eWxlLgorCitNb24gTm92IDE1IDE0OjMyOjI5IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKyAgICAJKiByZW1vdGUtZTcwMDAuYzogTmV3IGZpbGUgdG8gY29wZSB3aXRoIHRoZSBIaXRhY2hpIEU3MDAwIElDRS4KKwkqIHJlbW90ZS11dGlscy5jLCByZW1vdGUtdXRpbHMuaCAoZ3JfbG9hZF9pbWFnZSk6IE5ldyBmdW5jdGlvbiB0bworCWRvd25sb2FkIHRvIHRhcmdldC4KKwkqIGg4MzAwLXRkZXAuYywgaDg1MDAtdGRlcC5jLCByZW1vdGUtejhrLmMsIHNoLXRkZXAuYyB6OGstdGRlcC5jCisJKHNpbV9sb2FkKTogZGVsZXRlLgorCSogcmVtb3RlLXNpbS5jIChnZGJzaW1fbG9hZCk6IFVzZSBncl9sb2FkX2ltYWdlLCByYXRoZXIgdGhhbgorCXNpbV9sb2FkLgorCSogY29uZmlnL3NoL3NoLm10OiBBZGQgcmVtb3RlLWU3MDAwCisKK01vbiBOb3YgMTUgMTE6Mzg6MjUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9pMzg2L2xpbnV4Lm1oOiBSZW1vdmUgWE1fQ0xJQlMsIFRFUk1MSUIsIFNZU1ZfREVGSU5FLCBhbmQKKwlSRUdFWC4KKwkqIGNvbmZpZy9pMzg2L3htLWxpbnV4Lmg6IERvbid0IGluY2x1ZGUgeG0taTM4NnYuaC4gIERlZmluZQorCUhPU1RfQllURV9PUkRFUiBvdXJzZWx2ZXMuICBEZWZpbmUgSEFWRV9URVJNSU9TIG5vdCBIQVZFX1RFUk1JTy4KKwlEZWZpbmUgTkVFRF9QT1NJWF9TRVRQR0lELiAgSW5jbHVkZSB1bmlzdGQuaC4KKworTW9uIE5vdiAxNSAxMjoyOToxMCAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIHN5bXRhYi5jKGdkYl9tYW5nbGVfbmFtZSk6IGZpeCB0aGUgcHJvYmxlbSB3aXRoIGNvbnN0cnVjdG9yCisJbmFtZSBtYW5nbGluZy4KKworTW9uIE5vdiAxNSAxMTozODoyNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RidHlwZXMuaDogQWRkIFRZUEVfRkxBR19UQVJHRVRfU1RVQi4KKwkqIGdkYnR5cGVzLmMgKGNoZWNrX3N0dWJfdHlwZSk6IE9uIFRZUEVfRkxBR19UQVJHRVRfU1RVQiwgZG8KKwl3aGF0IGNsZWFudXBfdW5kZWZpbmVkX3R5cGVzIGRvZXMgZm9yIGFycmF5cywgZXhjZXB0IHdlIGNsZWFyCisJVFlQRV9GTEFHX1RBUkdFVF9TVFVCIGlmIHdlIGZpeCB1cCB0aGUgdHlwZS4KKwkqIHN0YWJzcmVhZC5jIChjbGVhbnVwX3VuZGVmaW5lZF90eXBlcyk6IEFkZCBjb21tZW50cyBhYm91dCBob3cKKwlkb2luZyBhcnJheXMgaGVyZSBpcyBubyBsb25nZXIgdGhlIGNsZWFuIHdheSB0byBkbyBpdC4KKwkocmVhZF9hcnJheV90eXBlKTogU2V0IFRZUEVfRkxBR19UQVJHRVRfU1RVQiBhcyB3ZWxsIGFzIGNhbGxpbmcKKwlhZGRfdW5kZWZpbmVkX3R5cGUuCisJKiBjLXR5cGVwcmludC5jLCBjaC10eXBlcHJpbnQuYzogTW92ZSBjYWxsIHRvIGNoZWNrX3N0dWJfdHlwZQorCW91dHNpZGUgc3dpdGNoIHNvIGl0IGhhcHBlbnMgZm9yIGFsbCB0eXBlIGNvZGVzLgorCSogY3AtdmFscHJpbnQuYyAoY3BfcHJpbnRfdmFsdWVfZmllbGRzKTogUmVjdXJzZSB0byB2YWxfcHJpbnQsCisJaW5zdGVhZCBvZiBjX3ZhbF9wcmludCwgc28gdGhhdCBjaGVja19zdHViX3R5cGUgZ2V0cyBjYWxsZWQuCisKKwkqIGdkYnR5cGVzLmgsIGdkYnR5cGVzLmMsIG0yLWxhbmcuYywgY2gtbGFuZy5jLCBjLWxhbmcuYzogUmVtb3ZlCisJVFlQRV9GTEFHX1NJR05FRC4gIEl0IHdhcyBpbmNvbnNpc3RlbnRseSBzZXQsIG5ldmVyIGNoZWNrZWQKKwkoZXhjZXB0IGluIHJlY3Vyc2l2ZV9kdW1wX3R5cGUpLCBhbmQgaXMgcG9pbnRsZXNzLgorCitNb24gTm92IDE1IDAwOjQwOjM4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisgICAgICAgICogcGFyZWFkLmMgKHBhX3N5bWZpbGVfaW5pdCk6IExvb2sgZm9yIHRoZSAkVEVYVCQgc2VjdGlvbiByYXRoZXIKKwl0aGFuIHRoZSAudGV4dCBzZWN0aW9uLgorCitTdW4gTm92IDE0IDAwOjI4OjEzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFic3JlYWQuYzogUmVtb3ZlICNpZiAwJ2QgZGJ4X2NsYXNzX2NvbXBsYWludC4gIFdlIG5vdyBoYW5kbGUKKwl0aGlzIChtb3JlIG9yIGxlc3MpIGdyYWNlZnVsbHksIGFuZCBjb21wbGFpbigpIHdhcyBuZXZlciBhIGdvb2QKKwl3YXkgb2YgZGVhbGluZyB3aXRoIHRoaXMuCisKKwkqIHN0YWJzcmVhZC5jIChyZWFkX3R5cGUpOiBTa2lwIHRoZSBjb2xvbiB3aGVuIHJlYWRpbmcgYQorCWNyb3NzLXJlZmVyZW5jZS4gIE9ubHkgY29tcGxhaW4sIG5vdCBlcnJvcl90eXBlLCBvbiB1bnJlY29nbml6ZWQKKwljcm9zcy1yZWZlcmVuY2UgdHlwZXMuICBlcnJvcl90eXBlLCBub3QgZHVtcCBjb3JlLCBpZiB0aGUgY29sb24gaXMKKwltaXNzaW5nLgorCitGcmkgTm92IDEyIDE2OjIzOjA4IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9tNjhrL3RtLXN1bjMuaDogIERpc2FibGUgdXNlIG9mIGFsdGVybmF0ZSBicmVha3BvaW50IGluc24KKwl3aGVuIGRvaW5nIHJlbW90ZSBzdHVmZi4KKworRnJpIE5vdiAxMiAxNjoyMjozOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYy1leHAueSAoeXlsZXgpOiBDYWxsIGxvb2t1cF9zeW10YWIgbm90IGxvb2t1cF9wYXJ0aWFsX3N5bXRhYi4KKworCSogcGFydGlhbC1zdGFiLmg6IElnbm9yZSAnOicgc3ltYm9sIGRlc2NyaXB0b3JzLiAgU2FtZSBjYXNlIGFzCisJS3VuZydzIHN0YWJzcmVhZC5jIGNoYW5nZS4KKworRnJpIE5vdiAxMiAxMToxODowMiAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIHN0YWJzcmVhZC5jIChwYXRjaF9ibG9ja19zdGFicywgZGVmaW5lX3N5bWJvbCwgcmVhZF90eXBlKTogaW4KKwlnKysgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiwgbmVzdGVkIGNsYXNzIGNhbiBiZSBwYXJ0IG9mIHRoZQorCXBhcmFtcywgYW5kICc6OicgY2FuIGdldHMgaW50byBzeW1ib2wgb3IgdHlwZSBuYW1lcy4gVGhpcyBpcworCXRvIGZpeCB0aGUgcHJvYmxlbS4KKworCSogZ2RidHlwZXMuYyAobG9va3VwX3N0cnVjdF9lbHRfdHlwZSk6IEhhbmRsZSB0eXBlIHJlZiBvciBwb2ludGVyCisJdG8gc3RydWN0L3VuaW9uIGNhc2UuCisKK0ZyaSBOb3YgMTIgMTA6Mzk6MzEgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogY29mZi1zb2xpYi5jIChjb2ZmX3NvbGliX2FkZCk6ICBDYXN0IHJlc3VsdCBvZiBhbGxvY2EoKS4KKwkqIG02OGstdGRlcC5jIChtNjhrX3NhdmVkX3BjX2FmdGVyX2NhbGwpOiAgR2V0IHJpZCBvZgorCUdEQl9UQVJHRVRfSVNfU1VOMy4gIFVzZSBtb3JlIGdlbmVyYWwgU1lTQ0FMTF9UUkFQIG1hY3JvLgorCSogY29uZmlnL202OGsvbTY4a2x5bngubWggKE5BVERFUEZJTEVTKTogIFJlbW92ZSBleGVjLm8gKGl0J3MKKwlhbHJlYWR5IGluIFRERVBGSUxFUykuCisJKiBjb25maWcvbTY4ay90bS1tNjhrLmggKFNBVkVEX1BDX0FGVEVSX0NBTEwpOiAgVXNlCisJbTY4a19zYXZlZF9wY19hZnRlcl9jYWxsLgorCSogUmVtb3ZlIGFsbCBTdW4zIHNwZWNpZmljIHN0dWZmLgorCSogKEZJWF9DQUxMX0RVTU1ZKTogIENhc3QgYXJnIHRvIGJmZF9wdXRiMzIgdG8gdW5zaWduZWQgY2hhciAqLgorCSogY29uZmlnL202OGsvdG0tbTY4a2x5bnguaDogIERlZmluZSBTWVNDQUxMX1RSQVAgYXMgdHJhcCAjMTAuCisJRGlzYWJsZSBSRU1PVEVfQlJFQUtQT0lOVCBtZWNoYW5pc20uCisJKiBjb25maWcvbTY4ay90bS1zdW4zLmg6ICBHZXQgcmlkIG9mIEdEQl9UQVJHRVRfSVNfU1VOMy4KKwkqIFByb3RlY3QgZnJvbSBtdWx0aXBsZSBpbmNsdWRpb24uCisJKiBNb3ZlIFN1bjMgc3BlY2lmaWMgc3R1ZmYgZnJvbSB0bS1tNjhrLmggdG8gaGVyZS4KKwkqIERlZmluZSBTWVNDQUxMX1RSQVAgYXMgdHJhcCAjMC4KKwkqIFJlbW92ZSBkZWYgb2YgU0FWRURfUENfQUZURVJfQ0FMTCAobm93IGluIHRtLW02OGsuaCkuCisJKiBnZGJzZXJ2ZXIvbG93LWx5bnguYzogIFJlZG8gYWxsIHJlZ2lzdGVyIHN0b3JlL2ZldGNoIHN0dWZmIHRvCisJbWFrZSBpdCBwb3J0YWJsZSBmb3IgMzg2IGFuZCA2OGsuCisKK0ZyaSBOb3YgMTIgMDk6NTM6MjYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIG1pcHMtdGRlcC5jIChpbml0X2V4dHJhX2ZyYW1lX2luZm8pOiBDaGVjayB0byBzZWUgd2hldGhlciB0aGUKKwlyZWdpc3RlcnMgbWVudGlvbmVkIGluIHRoZSBwcm9jX2Rlc2MgaGF2ZSBiZWVuIHNhdmVkLiAgVGhpcworCWdlbmVyYWxpemVzIG1pcHNfaW5fbGVuaWVudF9wcm9sb2d1ZSBpbiB0aGUgc2Vuc2UgdGhhdCB3ZSBrZWVwCisJc2VhcmNoaW5nIHVudGlsIHdlJ3ZlIGZvdW5kIHNhdmVzIGZvciBhbGwgdGhlIHJlZ2lzdGVycywgbm90IGp1c3QKKwlsb29rIGZvciBhICJsZW5pZW50IHByb2xvZ3VlIiBwYXR0ZXJuLgorCSogbWlwcy10ZGVwLmM6ICNpZiAwIGxlbmllbnQgcHJvbG9ndWUgY29kZS4KKworCSogbWlwcy10ZGVwLmMgKGhldXJpc3RpY19wcm9jX2Rlc2MpOiBEb24ndCBhc3N1bWUgYSBob3N0IHNob3J0CisJaXMgMTYgYml0cy4KKworVGh1IE5vdiAxMSAxOTo1ODowNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2kzODYvaTM4NnNvbDIubWg6IENvbW1lbnQgb3V0IGNvcmVsb3cuby4KKworCSogcHJpbnRjbWQuYyAoYWRkcmVzc19pbmZvKTogVXNlIGZpbHRlcmVkLCBub3QgdW5maWx0ZXJlZCBmdW5jdGlvbnMuCisJV2Ugc2hvdWxkIGJlIGFibGUgdG8gZGVhbCB3aXRoIGEgUVVJVCBoZXJlLgorCitUaHUgTm92IDExIDE1OjIyOjIwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBwcmludGNtZC5jIChhZGRyZXNzX2luZm8pOiBVc2UgZnByaW50Zl9zeW1ib2xfZmlsdGVyZWQKKwl0byBwcmludCB0aGUgc3ltYm9sIG5hbWUuCisKKwkqIHN0YWJzcmVhZC5jIChkZWZpbmVfc3ltYm9sKTogSGFuZGxlIGNmcm9udCBsb3NzYWdlIGZvciAKKwlzdHJ1Y3QvdW5pb24vZW51bXMgYW5kIHR5cGVkZWZzLgorCisJKiBwYXJ0aWFsLXN0YWIuaCAoY2FzZSBOX0JJTkNMKTogVXBkYXRlIHBzeW10YWJfbGFuZ3VhZ2UKKwlhcyBhcHByb3ByaWF0ZSB3aGVuIGNoYW5naW5nIHN1YmZpbGVzLgorCShjYXNlIE5fU09MKTogVXBkYXRlIHBzeW10YWJfbGFuZ3VhZ2UgYXMgYXBwcm9wcmlhdGUgd2hlbgorCWNoYW5naW5nIHN1YmZpbGVzLiAgQWRkIHR5cGVkZWYgZm9yIHN0cnVjdHMsIHVuaW9ucywgYW5kIGVudW1zCisJd2hlbiBwcm9jZXNzaW5nIEMrKyBmaWxlcy4KKworVGh1IE5vdiAxMSAxMzoxODo0NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogUkVBRE1FOiBSZW1vdmUgaW5mb3JtYXRpb24gb24gbGFuZ3VhZ2VzIGFuZCBqdXN0IGNpdGUgdGhlIChuZXdseQorCXVwZGF0ZWQpIGluZm9ybWF0aW9uIGluIGRvYy9nZGIudGV4aW5mbyBpbnN0ZWFkLgorCisJKiBkZWx0YTY4LW5hdC5jOiBGaXggdHlwb3MgKGFkZCBtaXNzaW5nICIpOyIgYW5kIHN0dWN0IC0+IHN0cnVjdCkuCisKK1dlZCBOb3YgMTAgMDk6MzE6MTAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGRieHJlYWQuYyAocHJvY2Vzc19vbmVfc3ltYm9sLCBOX1JCUkFDKTogRG9uJ3QgY2xlYXIKKwl3aXRoaW5fZnVuY3Rpb24ganVzdCBiZWNhdXNlIGxvY2FsX3N5bWJvbHMgaXMgTlVMTC4gIEl0IGFwcGVhcnMKKwl0aGF0IHRoaXMgYnVnIGhhcyBleGlzdGVkIHNpbmNlIHRoZSAxMCBBcHIgODkgY2hhbmdlIHdoaWNoIHN0YXJ0ZWQKKwljbGVhcmluZyB3aXRoaW5fZnVuY3Rpb24gaGVyZS4KKworCSogY29uZmlnL202OGsvdG0tbTY4ay5oOiBDbGVhbiB1cCBDQUxMX0RVTU1ZIGNvbW1lbnQuCisJKiBjb25maWcvbTY4ay97dG0taHAzMDBic2QuaCx0bS1ocDMwMGhwdXguaCx0bS1tNjhrLWVtLmgsCisJdG0tbW9uaXRvci5oLHRtLXN1bjMuaCx0bS12eDY4Lmh9LCBjb25maWcvc3BhcmMvdG0tc3BhcmMuaDoKKwlEZWZpbmUgQkVMSUVWRV9QQ0NfUFJPTU9USU9OLgorCSogZGJ4cmVhZC5jOiBSZW1vdmUgQkVMSUVWRV9QQ0NfUFJPTU9USU9OIGRlZmluZS4gIFRoZSBjb2RlIHdoaWNoCisJdXNlZCB0aGlzIHdhcyBtb3ZlZCB0byBzdGFic3JlYWQuYyBhIGxvbmcgdGltZSBhZ28uCisKKwkqIGRzdHJlYWQuYyAoZHN0X3N5bV9mbnMpOiBVcGRhdGUgZm9yIGZsYXZvdXJzLgorCSogc3ltZmlsZS5jIChmaW5kX3N5bV9mbnMpOiBBZGQga2x1ZGdlIGZvciBhcG9sbG8gbGlrZSBmb3IgcnMvNjAwMC4KKwkqIGRzdHJlYWQuYyAoZHN0X3N5bWZpbGVfb2Zmc2V0cyk6IFNldCBvYmpmaWxlLT5udW1fc2VjdGlvbnMuCisKKwlnY2MgLVdhbGwgbGludDoKKwkqIHRocmVhZC5jOiBJbmNsdWRlICJnZGJjbWQuaCIgYW5kIDxjdHlwZS5oPi4KKwkqIE1ha2VmaWxlLmluOiBVcGRhdGUgZGVwZW5kZW5jeS4KKwkqIHRocmVhZC5jICh0aHJlYWRfY29tbWFuZCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgcC4KKwkqIHZhbHVlcy5jICh1bnBhY2tfZG91YmxlKTogVXNlIGxlbiBpbnN0ZWFkIG9mIFRZUEVfTEVOR1RIICh0eXBlKS4KKwkqIHZhbHByaW50LmMgKHByaW50X2Zsb2F0aW5nKTogQ29ycmVjdGx5IGNoZWNrIHNpZ24gYml0IG5vdyB0aGF0CisJd2UgYXJlIHVzaW5nIHVuc2lnbmVkIGFyaXRobWV0aWMuCisJKiBzeW10YWIuYyAoZmluZF9wY19saW5lX3JhbmdlKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgZXhhY3RfbWF0Y2gsCisJaW5kLCBhbmQgbC4KKworVHVlIE5vdiAgOSAxNzo0MjoyNSAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIHZhbGFyaXRoLmMgKHZhbHVlX3hfYmlub3ApOiBmaXggc2VhcmNoIG9wZXJhdG9yIGluIGNsYXNzIGJ1ZworCSogdmFsYXJpdGguYyAodmFsdWVfeF91bm9wKTogZml4IHNlYXJjaCBvcGVyYXRvciBpbiBjbGFzcyBidWcKKworVHVlIE5vdiAgOSAxOToyMDoxNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGluaXQuYyk6IEFkZCB1ZGkyZ28zMi5vIHRvIGxpc3Qgb2YgZmlsZXMgdGhhdCB3ZQorCXNob3VsZCBub3QgdHJ5IHRvIHNlYXJjaCBmb3IgX2luaXRpYWxpemVfKiBmdW5jdGlvbnMuCisKKwkqIHJlbW90ZS11ZGkuYyAodWRpX3dhaXQpOiBDaGFuZ2UgVURJR2RiX1N0ZG91dFJlYWR5IGJhY2sgdG8KKwlVRElTdGRvdXRSZWFkeS4gIEl0IGFjY2lkZW50YWxseSBnb3QgY2hhbmdlZCBvbiAyNCBPY3QgOTMgd2hlbgorCXN0ZG91dCB3YXMgY2hhbmdlZCB0byBnZGJfc3Rkb3V0LiAgTGlrZXdpc2UgZm9yIFVESUdldFN0ZG91dCwKKwlVRElTdGRlcnJSZWFkeSwgYW5kIFVESUdldFN0ZGVyci4KKworVHVlIE5vdiAgOSAxMjo0ODowNiAxOTkzICBUb20gTG9yZCAgKGxvcmRAY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLWhtcy5jIChobXNfd2FpdCk6IGZpeGVkIHRvbyBtYW55IGFyZ3VtZW50cyB0byBwdXRjX3VuZmlsdGVyZWQuCisKK1R1ZSBOb3YgIDkgMTI6MjA6NDYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHV0aWxzLmMgKHF1aXQpOiBBbHNvIGNhbGwgZ2RiX2ZsdXNoIG9uIHN0YW5kYXJkIG91dHB1dCBhbmQgZXJyb3IuCisKKwkqIC5nZGJpbml0OiBSZW1vdmUgInNvdXJjZSAvLmdkYmluaXQiLiAgSXQgY2F1c2VzIGEgc3B1cmlvdXMgZXJyb3IKKwlpZiAvLmdkYmluaXQgZG9lc24ndCBleGlzdCAoYW5kIEkga25vdyBvZiBubyBjb252ZW50aW9uIG9mIHB1dHRpbmcKKwlzb21ldGhpbmcgaW4gLy5nZGJpbml0KS4KKworTW9uIE5vdiAgOCAxODoxNzoxMSAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNwLXZhbHByaW50LmMgKGNwX3ByaW50X3ZhbHVlX2ZpZWxkcyk6IGNoYW5nZSBvdXRwdXQgZnJvbSA8bm8KKwl2YWx1ZT4gdG8gPG9wdGltaXplZCBvdXQgb3IgemVybyBsZW5ndGg+CisKK01vbiBOb3YgMDggMTc6MDU6MzAgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IENoYW5nZSBSVU5URVNUX0ZMQUdTIGJhY2sgdG8gUlVOVEVTVEZMQUdTCisJCSAgICAgICBDaGFuZ2UgUlVOVEVTVCA9IHJ1bnRlc3QgdG8gdGVzdCBmb3IgZXhpc3RhbmNlIG9mCisJCQlhIHJ1bnRlc3QgaW4gdGhlIHNvdXJjZSB0cmVlIGZpcnN0LgorCitNb24gTm92ICA4IDEwOjQyOjAzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBHQ0MuICBSZW1vdmUgIiNDQz1jYyIgbGluZQorCXdoaWNoIGRvZXNuJ3QgcmVhbGx5IHJlbGF0ZSB0byBhbnl0aGluZy4KKworCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBUZXN0IGZvciBleGlzdGVuY2Ugb2YgZ2NjL3hnY2MsIG5vdAorCWZvciBleGlzdGVuY2Ugb2YgZ2NjL01ha2VmaWxlLgorCisJKiBpbmZsb3cuYyAodGVybWluYWxfaW5pdF9pbmZlcmlvciksIGluZnB0cmFjZS5jIChjaGlsZF9yZXN1bWUpOgorCUFkZCBjb21tZW50cyBhYm91dCB1c2Ugb2YgTHlueCBQSURHRVQgYW5kIGhvdyB3ZSB3aWxsIHdhbnQgdG8KKwljbGVhbiBpdCB1cC4KKworCSogc3RhYnNyZWFkLmM6IFJlbW92ZSBsb25nX2tsdWRnZV9uYW1lIGNvZGUgKGl0IHdhcyBhbHJlYWR5ICNpZiAwKS4KKwkqIHN0YWJzcmVhZC5jIChyZWFkX29uZV9zdHJ1Y3RfZmllbGQpOiBDbGVhbiB1cCBjb21tZW50cyB0byByZWZsZWN0CisJS3VuZydzIGNoYW5nZSBvZiA1IE5vdiA5My4KKwkqIHN0YWJzcmVhZC5jIChyZWFkX29uZV9zdHJ1Y3RfZmllbGQpOiBEb24ndCBnaXZlIHVwIG9uIHVua25vd24KKwl2aXNpYmlsaXR5IGNoYXJhY3RlciwganVzdCBzaG92ZSBpdCBpbiBmaXAtPmxpc3QtPnZpc2liaWxpdHkuCisJKHJlYWRfYmFzZWNsYXNzZXMpOiBEb24ndCBnaXZlIHVwIG9uIHVua25vd24gdmlydHVhbCBvciB2aXNpYmlsaXR5CisJY2hhcmFjdGVycywganVzdCBhc3N1bWUgYSByZWFzb25hYmxlIGRlZmF1bHQsIGNvbXBsYWluLCBhbmQga2VlcAorCWdvaW5nLgorCShhdHRhY2hfZmllbGRzX3RvX3R5cGUpOiBDb21wbGFpbiBvbiB1bnJlY29nbml6ZWQgdmlzaWJpbGl0eS4KKwlPbmUgcmVzdWx0IG9mIGFsbCB0aGlzIGlzIHRoYXQgJzknIChWSVNJQklMSVRZX0lHTk9SRSkgY2FuIGJlIHVzZWQKKwlpbiBhIHN0YWIgYXMgd2VsbCBhcyBiZWluZyBzb21ldGhpbmcgd2hpY2ggR0RCIHVzZXMgaW50ZXJuYWxseS4KKworTW9uIE5vdiAgOCAwNzo1NzozMCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IFJlbW92ZSBoODMwMGgsIHdlIGhhdmUgbXVsdGlsaWIgbm93LgorCitNb24gTm92ICA4IDA2OjExOjI0IDE5OTMgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHVuaXh3YXJlIGFzIGEgY29uZmlndXJhdGlvbiBhbGlhcyBmb3IgeDg2CisJc3lzdjQKKworCSogY29uZmlnL2kzODYvaTM4Nm53Lm10OiBhZGQgaTM4Ny10ZGVwLm8sIGV4ZWMubyB0byBUREVQRklMRVMKKworU3VuIE5vdiAgNyAyMzo0OToyMSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIHN5bXRhYi5jIChkZWNvZGVfbGluZV8xLCBkZWNvZGVfbGluZV8yKTogIERvIG5vdCBhZGp1c3QgcGMgYnkKKwlGVU5DVElPTl9TVEFSVF9PRkZTRVQgaWYgZnVuZmlyc3RsaW5lIGlzIG5vdCBzZXQuCisKK0ZyaSBOb3YgIDUgMTc6MTk6MzAgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBnZGJ0eXBlcy5oIDogYWRkIGEgZmllbGQgJ2lnbm9yZV9maWVsZF9iaXRzIGluIGNwbHVzX3NwZWNpZmljLAorCWFuZCBtYWNyb3MgdG8gaGFuZGxlIHRoZSBiaXRzLgorCSogc3RhYnNyZWFkLmMgKHJlYWRfb25lX3N0cnVjdF9maWVsZCk6IGFkZCBWSVNJQklMSVRZX0lHTk9SRSwgYW5kCisJZm9yIGZpZWxkIG9mIGxlbmd0aCAwLCBzZXQgdGhpcyBiaXQgb24uCisJKiBjcC12YWxwcmludC5jIChjcF9wcmludF92YWx1ZV9maWVsZHMpOiBmb3IgVklTSUJJTElUWV9JR05PUkUKKwlmaWVsZCwgcHJpbnQgPG5vIHZhbHVlPi4KKworRnJpIE5vdiAgNSAxNDo0Mzo0NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogVmVyc2lvbiA0LjExLjIuCisKK0ZyaSBOb3YgIDUgMDk6NDk6MjIgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogaW5mbG93LmMgKHRlcm1pbmFsX2luaXRfaW5mZXJpb3IpOiBUZW1wb3JhcmlseSB1c2UgTHlueCBQSURHRVQKKwltYWNybyB0byBzZXQgcHJvY2VzcyBncm91cHMuCisJKiBpbmZwdHJhY2UuYyAoY2hpbGRfcmVzdW1lKTogVGVtcG9yYXJpbHkgdXNlIEx5bnggUElER0VUIHRvCisJc3BlY2lmeSByZXN1bXB0aW9uIG9mIGFsbCB0aHJlYWRzLgorCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogIEZpeCBoYW5kbGluZyBvZiB0aHJlYWQtc3BlY2lmaWMKKwlicmVha3BvaW50cyBmb3Igc3lzdGVtcyB3aGVyZSBERUNSX1BDX0FGVEVSX0JSRUFLID4gMCAoaWU6IGJhY2t1cAorCVBDIGJ5IHRoZSByaWdodCBhbW91bnQgd2hlbiBjb250aW51aW5nIHRoZSB0aHJlYWQpLgorCSogdGhyZWFkLmMgKHRocmVhZF9hcHBseV9jb21tYW5kKTogIEFkZCB0aGUgIGB0aHJlYWQgYXBwbHknCisJY29tbWFuZCB0byBhcHBseSBhIGdpdmVuIEdEQiBjb21tYW5kIHRvIGEgbGlzdCBvZiB0aHJlYWRzLgorCitGcmkgTm92ICA1IDA1OjU4OjAzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoaW5pdC5jKTogRG9uJ3QgY2FsbCBzZWQgaWYgZmlsZW5hbWUgaXMgZW1wdHkuCisKK1RodSBOb3YgIDQgMDg6Mjc6MjQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGRieHJlYWQuYyAodW5rbm93bl9zeW1jaGFyX2NvbXBsYWludCk6IE1ha2UgbWVzc2FnZSByZWZlciB0bworCSJzeW1ib2wgZGVzY3JpcHRvciIgbm90ICJzeW1ib2wgdHlwZSBjaGFyYWN0ZXIiIGZvciBjb25zaXN0ZW5jeQorCXdpdGggc3RhYnMudGV4aW5mbyB0ZXJtaW5vbG9neS4KKworCSogc3RhYnNyZWFkLmMgKHJlYWRfc3RydWN0X2ZpZWxkcyk6IEFjY2VwdCBlaXRoZXIgJyQnIG9yICcuJyBhcworCXRoZSBjaGFyYWN0ZXIgd2hpY2ggaW50cm9kdWNlcyBhIGNwcF9hYmJyZXYgb3IgYW5vbnltb3VzIHR5cGUuCisKKwkqIGMtbGFuZy5jIChjX3ByaW50c3RyKTogUHJpbnQgIiIgdG8gc3RyZWFtIChsaWtlIGFsbCB0aGUgb3RoZXIKKwlvdXRwdXQgZnJvbSB0aGlzIGZ1bmN0aW9uKSwgbm90IGdkYl9zdGRvdXQuCisKKwkqIGRieHJlYWQuYyAocHJvY2Vzc19vbmVfc3ltYm9sKTogRG8gcmVsb2NhdGUgJ1MnIHN5bWJvbHMgYnkKKwl0aGUgdGV4dCBvZmZzZXQgKHJldmVydCAxMiBPY3QgOTMgY2hhbmdlKS4KKworCSogY29uZmlndXJlLmluOiBNYWtlIGhwcGEqLSotaGl1eCogdXNlIGhwcGFocHV4LAorCW5vdCBub24tZXhpc3RlbnQgaHBwYWhpdXguCisKK1dlZCBOb3YgIDMgMTY6MjQ6MDkgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQorCisJKiB2YWx1ZXMuYyAodmFsdWVfZm5fZmllbGQpOiB3aGVuIHBoeXNpY2FsIG5hbWUgbm90IGZvdW5kLCBkbyBub3QKKwllcnJvciwgYnV0IHJldHVybiBudWxsLgorCSogdmFsb3BzLmMgKHZhbHVlX3N0cnVjdF9lbHQpOiB3aGVuIG5hbWUgYW5kIGFyZ3MgbWF0Y2ggZG9lcyBub3QKKwltZWFuIGl0IGlzIHRoZSBvbmUsIHNvbWUgdGltZXMgYSB0eXBlZGVmIGNsYXNzIGNhbiBoYXZlIHRoZSBzYW1lCisJbWVtYmVyIG1ldGhvZCBhbmQgYXJncy4gVGhpcyBwcm9iYWJseSB3aWxsIG5vdCBoYXBwZW4gd2l0aCBuZXcKKwl2ZXJzaW9uIG9mIGcrKywgYnV0IGl0IGRvZXMgaGFwcGVuIGluIG9sZCBnKysgYW5kIGNhdXNlIGdkYiBlcnJvci4KKworV2VkIE5vdiAgMyAwOToyMDoxOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCU1lcmdlIGNoYW5nZXMgZm9yIGRvcyB4IHVkaToKKwkqIE1ha2VmaWxlLmluICh1ZGkyZ28zMi5vKTogYWRkIHJ1bGUgdG8gYnVpbGQgdGhpcyBmaWxlCisJKiAyOWstc2hhcmUvdWRpL3VkaTJnbzMyLmM6IG5ldyBmaWxlCisJKiBjb25maWcvYTI5ay9hMjlrLXVkaS5tdDogYWRkIHVkaTJnbzMyLm8KKwkqIDI5ay1zaGFyZS91ZGkve3Vkci5jLCB1ZGlwMnNvYy5jfTogI2lmZGVmIG91dCB0aGUgZW50aXJlIGZpbGUgCisJICBpZiBfX0dPMzJfXyBpcyBkZWZpbmVkLiAgV2hhdCBhIGhhY2suCisKK1dlZCBOb3YgIDMgMDk6MjA6MTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS5jIChwdXRwa3QsIGdldHBrdCk6IERvbid0IGNhbGwgaW50ZXJydXB0X3F1ZXJ5LgorCisJKiBmaW5kdmFyLmMgKHZhbHVlX29mX3JlZ2lzdGVyKTogUmVuYW1lIHZhbCB0byByZWdfdmFsIHRvIGF2b2lkCisJbmFtZSBjb25mbGljdCB3aXRoIHNvbWUgKGUuZy4gdG0tbTY4ay5oKSBSRUdJU1RFUl9DT05WRVJUX1RPX1ZJUlRVQUwuCisKKwkqIG1haW4uYzogQWRkIHZhcmlhYmxlcyBzb3VyY2VfbGluZV9udW1iZXIsIHNvdXJjZV9maWxlX25hbWUsCisJc291cmNlX2Vycm9yLCBzb3VyY2VfZXJyb3JfYWxsb2NhdGVkLCBhbmQgc291cmNlX3ByZV9lcnJvci4KKwkoY29tbWFuZF9saW5lX2lucHV0KTogSWYgc291cmNlX2ZpbGVfbmFtZSBzZXQsIGluY3JlbWVudAorCXNvdXJjZV9saW5lX251bWJlciBhbmQgc2V0IGVycm9yX3ByZV9wcmludCB3aXRoIHRoZW0uCisJKHNvdXJjZV9jb21tYW5kKTogU2V0IHNvdXJjZV8qIGFuZCBtYWtlIGEgY2xlYW51cCBzbyB0aGV5IGdldAorCXNldCBiYWNrLgorCitUdWUgTm92ICAyIDE2OjI4OjM0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFjay5jIChkb3duX3NpbGVudGx5X2NvbW1hbmQpOiBBZGQgY29tbWVudCBhYm91dCBQUiAxOTEzLgorCisJKiBicmVha3BvaW50LmMgKGluc2VydF9icmVha3BvaW50cywgZGVsZXRlX2JyZWFrcG9pbnQpOiBDYWxsCisJdGFyZ2V0X3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCBiZWZvcmUgYXR0ZW1wdGluZyBvdXRwdXQuCisKKwkqIGZvcmstY2hpbGQuYyAoZm9ya19pbmZlcmlvcik6IEZpeCBjb21tZW50IHNvIHRoYXQgaXQgc3VnZ2VzdHMKKwkic2V0IHNoZWxsIiByYXRoZXIgdGhhbiBoYXZpbmcgInNldCBlbnYgU0hFTEwiIGFmZmVjdCBHREIncworCW9wZXJhdGlvbi4KKworVHVlIE5vdiAgMiAxNTowMzowOCAxOTkzICBUb20gTG9yZCAgKGxvcmRAcnRsLmN5Z251cy5jb20pCisKKwkqIHV0aWxzLmMgKHZmcHJpbnRmX3VuZmlsdGVyZWQpOiBkb24ndCB1c2UgbWF5YmVfZmlsdGVyZWQKKwlzaW5jZSBpdCBpbnZvbHZlcyBhIGZpeGVkIHNpemUgYnVmZmVyLgorCitUdWUgTm92ICAyIDEzOjQyOjMwIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZmluZHZhci5jICh2YWx1ZV9vZl9yZWdpc3RlciwgdmFsdWVfZnJvbV9yZWdpc3RlciksCisJaHBwYS10ZGVwLmMgKHBhX3ByaW50X2ZwX3JlZyksIGluZmNtZC5jIChkb19yZWdpc3RlcnNfaW5mbyksCisJdmFsb3BzLmMgKHZhbHVlX2Fzc2lnbik6ICAgVXNlIFJFR0lTVEVSX0NPTlZFUlRfVE9fKiBvbmx5IGlmCisJUkVHSVNURVJfQ09OVkVSVElCTEUgaXMgZGVmaW5lZCwgb3RoZXJ3aXNlIGp1c3QgY29weSB0aGUgY29udGVudC4KKwlQYXNzIGRlc2lyZWQgdHlwZSB0byBSRUdJU1RFUl9DT05WRVJUX1RPXyouCisKKwkqIGNvbmZpZy9tNjhrL3RtLW02OGsuaCwgY29uZmlnL2k5NjAvdG0taTk2MC5oIChSRUdJU1RFUl9DT05WRVJUXyopOgorCVBhc3MgbGVuZ3RoIG9mIGRlc2lyZWQgdHlwZSB0byBzdG9yZS9leHRyYWN0X2Zsb2F0aW5nLgorCSogY29uZmlnL2kzODYvdG0tYXJtLmgsIGNvbmZpZy9pMzg2L3RtLWkzODZhaXguaCwgCisJY29uZmlnL2kzODYvdG0tc3VuMzg2LmgsIGNvbmZpZy9pMzg2L3RtLXN5bW1ldHJ5LmgsIAorCWNvbmZpZy9tODhrL3RtLW04OGsuaCBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oIChSRUdJU1RFUl9DT05WRVJUXyopOgorCVVzZSBleHRyYWN0X2Zsb2F0aW5nIGFuZCBzdG9yZV9mbG9hdGluZyB3aXRoIGxlbmd0aCBvZiBkZXNpcmVkIHR5cGUuCisJKiBjb25maWcvbTY4ay90bS1uZXdzLmggKFNUT1JFLEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKTogIEFkZCB0eXBlCisJcGFyYW1ldGVyIHRvIFJFR0lTVEVSX0NPTlZFUlRfKi4KKworCSogY29uZmlnL2EyOWsvdG0tYTI5ay5oLCBjb25maWcvY29udmV4L3RtLWNvbnZleC5oLAorCWNvbmZpZy9nb3VsZC90bS1ucDEuaCwgY29uZmlnL2dvdWxkL3RtLXBuLmgsIGNvbmZpZy9oODMwMC90bS1oODMwMC5oLAorCWNvbmZpZy9oODUwMC90bS1oODUwMC5oLCBjb25maWcvaTM4Ni90bS1pMzg2di5oLAorCWNvbmZpZy9taXBzL3RtLW1pcHMuaCwgY29uZmlnL25zMzJrL3RtLW1lcmxpbi5oLAorCWNvbmZpZy9uczMyay90bS11bWF4LmgsIGNvbmZpZy9wYS90bS1ocHBhLmgsIGNvbmZpZy9weXIvdG0tcHlyLmgsCisJY29uZmlnL3NoL3RtLXNoLmgsIGNvbmZpZy9zcGFyYy90bS1zcGFyYy5oLCBjb25maWcvdGFob2UvdG0tdGFob2UuaCwKKwljb25maWcvdmF4L3RtLXZheC5oLCBjb25maWcvejhrL3RtLXo4ay5oIChSRUdJU1RFUl9DT05WRVJUSUJMRSwKKwlSRUdJU1RFUl9DT05WRVJUX1RPX1JBVywgUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMKTogIFJlbW92ZQorCXZlcnNpb25zIGZvciB3aGljaCBSRUdJU1RFUl9DT05WRVJUSUJMRSBpcyBhbHdheXMgZmFsc2UuCisJKiB6OGstdGRlcC5jIChyZWdpc3Rlcl9jb252ZXJ0X3RvX3ZpcnR1YWwsIHJlZ2lzdGVyX2NvbnZlcnRfdG9fcmF3KToKKwlSZW1vdmUsIG5vIGxvbmdlciB1c2VkLgorCisJKiBhbHBoYS10ZGVwLmMgKGFscGhhX3JlZ2lzdGVyX2NvbnZlcnRfdG9fcmF3LAorCWFscGhhX3JlZ2lzdGVyX2NvbnZlcnRfdG9fdmlydHVhbCk6ICBOZXcgcm91dGluZXMgdG8gaGFuZGxlCisJdGhlIGRpZmZlcmVudCByYXcgZm9ybWF0cyBpbiBhbHBoYSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMuCisJKiBjb25maWcvYWxwaGEvdG0tYWxwaGEuaCAoUkVHSVNURVJfQ09OVkVSVElCTEUsCisJUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMLCBSRUdJU1RFUl9DT05WRVJUX1RPX1JBVyk6ICBVc2UgdGhlbS4KKworVHVlIE5vdiAgMiAxMjo0NToyMyAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCisKKwkqIGdkYnNlcnZlci9jb25maWd1cmUuaW46IFJlY29nbml6ZSAqLSotbHlueG9zKiBpbnN0ZWFkIG9mCisJKi0qLWx5bngqLCByZWNvZ25pemUgc3BhcmMtKi1seW54b3MqLgorCSogZ2Ric2VydmVyL01ha2VmaWxlLmluIChpbnN0YWxsLCBpbnN0YWxsX29ubHkpOiBBZGQuCisJKiBnZGJzZXJ2ZXIvZ2Ric2VydmVyLjE6IE5ldyBmaWxlLCBtYW4gcGFnZSBmb3IgZ2Ric2VydmVyLgorCitUdWUgTm92ICAyIDAzOjAxOjAxIDE5OTMgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJICogaHByZWFkLmM6IEluY2x1ZGUgPHRpbWUuaD4gYW5kIDxzeXMvdHlwZXMuaD4uICBDaGFuZ2UgaW5jbHVkZQorCSBvZiAibGliaHBwYS5oIiB0byAic29tLmgiLgorCSAoQllURVNfSU5fV09SRCk6IERlZmluZS4KKwkgKGhwcGFfc3ltX2Zucyk6ICJocHBhIiBpcyA0IGNoYXJhY3RlcnMsIG5vdCA1LgorCQorTW9uIE5vdiAgMSAwOTo0MDoyMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3ltdGFiLmMsIHN5bXRhYi5oLCBzb3VyY2UuYzogQ2hhbmdlIGZpbmRfbGluZV9wY19yYW5nZSB0byB0YWtlCisJYSBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIGFyZ3VtZW50LCByYXRoZXIgdGhhbiBhIHN5bXRhYiBhbmQgYSBsaW5lLgorCVJlLXdyaXRlIGl0IHRvIGJlIGJhc2VkIG9uIHRoZSBhZGRyZXNzIHJhdGhlciB0aGFuIGJvZ3VzbHkgYWRkaW5nCisJb25lIHRvIHRoZSBsaW5lIG51bWJlciBhbmQgaG9waW5nIHRoYXQgaGFzIHNvbWV0aGluZyB0byBkbyB3aXRoIHRoZQorCWVuZCBvZiB0aGUgbGluZS4KKworCSogY29uZmlnL204OGsvbTg4ay5taCAoTkFUREVQRklMRVMpOiBSZW1vdmUgZXhlYy5vLgorCisJKiBwYXJlYWQuYyAocGFfc3ltdGFiX3JlYWQpOiBDaGFuZ2UgY29tbWVudHMgdG8gc2F5IGlnbm9yaW5nCisJbGFiZWxzIHJlYWxseSBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgYXNzZW1ibGVyL2NvbXBpbGVyLgorCisJKiBNYWtlZmlsZS5pbjogQWRkIC1PIHRvIENYWEZMQUdTLgorCisJKiBUT0RPOiBFeHBhbmQgY29tbWVudHMgb24gZmFzdCB3YXRjaHBvaW50cy4KKworU3VuIE9jdCAzMSAxOTo0NTowNiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogcGFyZWFkLmMgKHBhX3N5bXRhYl9yZWFkKTogQWxzbyBmaWx0ZXIgb3V0IGxvY2FsIHN5bWJvbHMKKwlzdGFydGluZyB3aXRoICJMJCIuCisKK1N1biBPY3QgMzEgMDk6Mjg6NDYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN5bWZpbGUuaCAoc3ltX2ZucyksIHN5bWZpbGUuYyAoZmluZF9zeW1fZm5zKSwgeGNvZmZyZWFkLmMsCisJY29mZnJlYWQuYywgZGJ4cmVhZC5jLCBlbGZyZWFkLmMsIG1pcHNyZWFkLmMsIG5sbXJlYWQuYywgcGFyZWFkLmM6CisJQ2hhbmdlIGZyb20gdXNpbmcgYmZkIHRhcmdldCBuYW1lIHRvIHVzaW5nIHRoZSBmbGF2b3VyLgorCisJKiBvYmpmaWxlcy5oLCBpbmZjbWQuYywgc3ltZmlsZS5jOiBBZGQgY29tbWVudHMgYWJvdXQgaG93IHZhcmlvdXMKKwlvYmpmaWxlcyBnZXQgY3JlYXRlZCBhbmQgd2hlbiB3ZSBzaG91bGQgYmxvdyB0aGVtIGF3YXkuCisKK1NhdCBPY3QgMzAgMDg6MzI6NTMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN5bWZpbGUuYyAocmVyZWFkX3N5bWJvbHMpOiBXaGVuIHJlLXJlYWRpbmcgc3ltYm9scywgZG8gYWxsIHRoZQorCXJpZ2h0IG9wZXJhdGlvbnMgb3Vyc2VsZiwgcmF0aGVyIHRoYW4gY2FsbGluZyBzeW1ib2xfZmlsZV9jb21tYW5kLgorCUlmIHdlIHJlLXJlYWQgc29tZXRoaW5nLCBjYWxsIGNsZWFyX3N5bXRhYl91c2VycyBub3QganVzdAorCWJyZWFrcG9pbnRfcmVfc2V0LgorCSogb2JqZmlsZXMuaCwgb2JqZmlsZXMuYyAoYnVpbGRfb2JqZmlsZV9zZWN0aW9uX3RhYmxlKTogTm8gbG9uZ2VyCisJc3RhdGljLgorCSogc3ltZmlsZS5jIChjbGVhcl9zeW10YWJfdXNlcnMpOiBDYWxsIGNsZWFyX3BjX2Z1bmN0aW9uX2NhY2hlLgorCSogY29mZnJlYWQuYywgZGJ4cmVhZC5jLCBlbGZyZWFkLmMsIG1pcHNyZWFkLmMsIG5sbXJlYWQuYywgcGFyZWFkLmMKKwkoKl9zeW1maWxlX29mZnNldHMpOiBTZXQgb2JqZmlsZS0+bnVtX3NlY3Rpb25zLgorCSogcmVtb3RlLmMgKHJlbW90ZV93YWl0KSwgc3ltZmlsZS5jIChzeW1zX2Zyb21fb2JqZmlsZSk6CisJRG9uJ3QgbXVjayB3aXRoIG9iamZpbGUtPm51bV9zZWN0aW9ucyBub3cgdGhhdCBhbGwgdGhlIHN5bWJvbAorCXJlYWRlcnMgc2V0IGl0LgorCSogZWxmcmVhZC5jOiBDbGVhbiB1cCBvYnNvbGV0ZSBjb21tZW50IGFib3V0IGhhbmRsaW5nIG9ubHkgRFdBUkYuCisJKiBwYXJlYWQuYzogUmVtb3ZlIGNvbW1lbnQgYWJvdXQgaG93IHdlIHNob3VsZCB1c2UgYW4gIm9yZGluYXJ5IgorCWZpbGUgZm9ybWF0IHdpdGggYW4gaHBwYSBzdWZmaXguICBUaGVyZSBpcyBub3RoaW5nIG9yZGluYXJ5IGFib3V0IFNPTS4KKworCSogY29uZmlnL2kzODYve2kzODZtMy5taCxpMzg2bWsubWh9LCBjb25maWcvbWlwcy9taXBzbTMubWgsCisJY29uZmlnL25zMzJrL25zMzJrbTMubWg6IENoYW5nZSBNTUFMTE9DX0xJQiB0byBNTUFMTE9DLgorCSogVE9ETzogVXBkYXRlIE1hY2ggc3R1ZmYuCisKK0ZyaSBPY3QgMjkgMTY6MzA6MzYgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQorCisJTHlueE9TIHN1cHBvcnQ6CisJKiBjb25maWd1cmUuaW46IENoYW5nZSAqLSotbHlueCogdG8gKi0qLWx5bnhvcyosIGFkZAorCXNwYXJjLSotbHlueG9zKi4KKwkqIE1ha2VmaWxlLmluIChBTExERVBGSUxFUyk6IEFkZCBtNjhrbHktbmF0LmMsIHNwYXJjbHktbmF0LmMuCisJUmVuYW1lIGkzODZseW54LW5hdC5bY29dIHRvIGkzODZseS1uYXQuW2NvXS4KKwkoQUxMQ09ORklHKTogQWRkIGNvbmZpZy97bTY4ayxzcGFyY30ve202OGssc3BhcmN9bHlueC5tW2h0XS4KKwkobTY4a2x5LW5hdC5vLCBzcGFyY2x5LW5hdC5vKTogQWRkIHJ1bGVzLgorCSogaTM4Nmx5LXRkZXAuYzogQ29zbWV0aWNzLgorCSogaTM4Nmx5bngtbmF0LmM6IFJlbW92ZWQuCisJKiBpMzg2bHktbmF0LmM6IE5ldyBmaWxlLCB3YXMgaTM4Nmx5bngtbmF0LmMuCisJKiBtNjhrbHktbmF0LmM6IE5ldyBmaWxlLgorCSogc3BhcmNseS1uYXQuYzogTmV3IGZpbGUuCisJKiBjb25maWcveG0tbHlueC5oOiBOZXcgZmlsZSwgY3B1LWluZGVwZW5kZW50IGhvc3QgaW5mby4KKwkqIGNvbmZpZy9pMzg2L2kzODZseW54Lm1oOiBDaGFuZ2VzIGZvciBjb25zaXN0ZW5jeS4KKwkqIGNvbmZpZy9pMzg2L2kzODZseW54Lm10OiBEaXR0by4KKwkqIGNvbmZpZy9pMzg2L3RtLWkzODZseW54Lmg6IERpdHRvLgorCSogY29uZmlnL2kzODYvbm0taTM4Nmx5bnguaDogRGl0dG8uCisJKiBjb25maWcvaTM4Ni94bS1pMzg2bHlueC5oOiBJbmNsdWRlIGNvbmZpZy94bS1seW54LmguCisJKiBjb25maWcvbTY4ay9tNjhrbHlueC5taCwgY29uZmlnL202OGsvbTY4a2x5bngubXQsCisJY29uZmlnL202OGsvdG0tbTY4a2x5bnguaCwgY29uZmlnL202OGsvbm0tbTY4a2x5bnguaCwKKwljb25maWcvbTY4ay94bS1tNjhrbHlueC5oOiBOZXcgZmlsZXMsIE02OEsgTHlueE9TIHN1cHBvcnQuCisJKiBjb25maWcvc3BhcmMvc3BhcmNseW54Lm1oLCBjb25maWcvc3BhcmMvc3BhcmNseW54Lm10LAorCWNvbmZpZy9zcGFyYy90bS1zcGFyY2x5bnguaCwgY29uZmlnL3NwYXJjL25tLXNwYXJjbHlueC5oLAorCWNvbmZpZy9zcGFyYy94bS1zcGFyY2x5bnguaDogTmV3IGZpbGVzLCBTcGFyYyBMeW54T1Mgc3VwcG9ydC4KKworRnJpIE9jdCAyOSAwODoxMToyOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZGVmcy5oLCBmaW5kdmFyLmMgKGV4dHJhY3RfZmxvYXRpbmcsIHN0b3JlX2Zsb2F0aW5nKTogTmV3IGZ1bmN0aW9ucy4KKwkqIE1vdmUgU1dBUF9UQVJHRVRfQU5EX0hPU1QgZnJvbSBkZWZzLmggdG8gZmluZHZhci5jIGJlY2F1c2UgaXQgaXMKKwlub3cgdXNlZCBvbmx5IGJ5IGV4dHJhY3RfZmxvYXRpbmcgYW5kIHN0b3JlX2Zsb2F0aW5nLgorCSogdmFscHJpbnQuYyAocHJpbnRfZmxvYXRpbmcpOiBVc2UgdW5zaWduZWQgYXJpdGhtZXRpYy4gIFVzZQorCWV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciBpbnN0ZWFkIG9mIFNXQVBfVEFSR0VUX0FORF9IT1NULgorCUNoYW5nZSBzaXplb2YgKGZsb2F0KSB0byA0IGFuZCBzaXplb2YgKGRvdWJsZSkgdG8gOCAodGhvc2UgYXJlIGFsd2F5cworCXRoZSByZWxldmFudCBzaXplcyBmb3IgdGhpcyBjb2RlLCB3aGljaCBpcyBpbiAjaWZkZWYgSUVFRV9GTE9BVCkuCisJKiB2YWx1ZXMuYyAodW5wYWNrX2xvbmcsIHVucGFja19kb3VibGUsIHZhbHVlX2Zyb21fZG91YmxlKSwKKwl2YWxhcml0aC5jICh2YWx1ZV9iaW5vcCksIHN0YWJzcmVhZC5jIChkZWZpbmVfc3ltYm9sKToKKwlVc2UgZXh0cmFjdF9mbG9hdGluZyBhbmQgc3RvcmVfZmxvYXRpbmcgaW5zdGVhZCBvZgorCVNXQVBfVEFSR0VUX0FORF9IT1NULgorCSogY29uZmlnL202OGsvdG0tbTY4ay5oLCBjb25maWcvaTk2MC90bS1pOTYwLmggKFJFR0lTVEVSX0NPTlZFUlRfKik6CisJVXNlIGV4dHJhY3RfZmxvYXRpbmcgYW5kIHN0b3JlX2Zsb2F0aW5nLgorCSogY29uZmlnL204OGsvdG0tbTg4ay5oOiBBZGQgY29tbWVudHMgKGl0IHNob3VsZCBiZSBkb2luZyB0aGUgc2FtZSkuCisJKiBpMzg2LXRkZXAuYyAoaTM4Nl9leHRyYWN0X3JldHVybl92YWx1ZSksCisJKiByZW1vdGUtbmluZHkuYyAobmluZHlfc3RvcmVfcmVnaXN0ZXJzKTogVXNlIHN0b3JlX2Zsb2F0aW5nLgorCitGcmkgT2N0IDI5IDA5OjMxOjM4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHJ0bC5jeWdudXMuY29tKQorCisJKiByZW1vdGUtc2ltLmMgKGdkYnNpbV9zdG9yZV9yZWdpc3Rlcik6ICBDaGFuZ2UgdmFyIG5hbWUgc28KKwlpdCBjb21waWxlcyB3aXRoIG5vbi1BTlNJIGNvbXBpbGVycy4KKworRnJpIE9jdCAyOSAwODoxMToyOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogVE9ETzogQWRkIGlkZWEgZm9yICJkaXNhc3NlbWJsZSIgd2l0aCBzb3VyY2UuCisKK0ZyaSBPY3QgMjkgMDA6NDE6MDEgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIEJ1bXAgdG8gNC4xMS4xIGFmdGVyIHJlbGVhc2UgYW5kIGN2cworCXRhZ2dpbmcuCisKK1RodSBPY3QgMjggMDk6MTQ6NDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIFRPRE86IEFkZCBzZWN0aW9uIG9uIE1hY2guICBTdG9wIGNhbGxpbmcgaXQgYSAiYnVnIGxpc3QiLgorCVJlbW92ZSBKb2huJ3MgbmFtZSBhbmQgZW1haWwgYWRkcmVzcy4gIFJlbW92ZSBpdGVtIG9uICJhbHdheXMiCisJKCJob29rLXN0b3AiIHRha2VzIGNhcmUgb2YgdGhpcykuICBSZW1vdmUgaXRlbSBvbiBleGVjdXRhYmxlcyB3aXRoCisJbm8gc3ltYm9scyAodGhpcyB3b3JrcyBvbiBzb21lIG1hY2hpbmVzLCBhdCBsZWFzdCkuICBSZW1vdmUgaXRlbQorCWFib3V0IGNhbGxpbmcgZXJyb3IoKSBkdXJpbmcgc3ltYm9sIHJlYWRpbmcgKEkgdGhpbmsgYWxsIHRoZSBpbXBvcnRhbnQKKwlvbmVzIGhhdmUgYmVlbiBjbGVhbmVkIHVwKS4gIFJldmlzZSBpdGVtcyBhYm91dCBzaWduYWxzIGFuZCByZW1vdGUKKwlzeXN0ZW1zLiAgUmVtb3ZlIHNlY3Rpb24gb24gXlogcmVxdWlyaW5nIHNldmVyYWwgY29udGludWVzIHRvIG1ha2UKKwlpdCBnbyAodGhpcyBub3cgd29ya3MuICBQZXJoYXBzIHRoZSBpdGVtIGlzIGJhc2VkIG9uIGNvbmZ1c2lvbiBvdmVyCisJcHJvZ3JhbXMgKGxpa2UgR0RCIGl0c2VsZikgd2hpY2ggY2F0Y2ggU0lHVFNUUCBhbmQgdGhlbiByZS1zZW5kCisJdGhlbXNlbHZlcyB0aGUgc2lnbmFsLiAgUFIgMjU3NSBtaWdodCBjb250YWluIHJlbGV2YW50IGluZm8pLgorCitUaHUgT2N0IDI4IDE2OjU1OjM0IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBORVdTOiAgTm90ZSBpbXByb3ZlbWVudHMgaW4gQysrIHN1cHBvcnQsIHByZWxpbWluYXJ5IHRocmVhZAorCWltcGxlbWVudGF0aW9uLCBhbmQgTHlueE9TIG5hdGl2ZSBhbmQgdGFyZ2V0IHN1cHBvcnQgZm9yIDM4Ni4KKworVGh1IE9jdCAyOCAxNjo1NTozNCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogUkVBRE1FOiAgQWRkIG5vdGUgZnJvbSBQZXRlciBTY2hhdWVyIGFib3V0IE9TRi8xIHNoYXJlZAorCWxpYnJhcmllcy4gIEFkZCBub3RlIGZyb20gUGFjZSBXaWxsaXNzb24gYWJvdXQgY29uZmlndXJpbmcgb24gQlNESQorCUJTRC8zODYgcmVsZWFzZSAxLjAuICBVcGRhdGUgZ2RiIHJlZmVyZW5jZXMgdG8gZ2RiIDQuMTEuCisKK1RodSBPY3QgMjggMDk6MTQ6NDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE5FV1M6IEFkZCBub3RlcyBhYm91dCBBbHBoYSBhbmQgInNldCByZW1vdGVkZWJ1ZyIgZm9yIFVESS4KKworCSogdmFsb3BzLmMgKHZhbHVlX2Fzc2lnbik6IENoYW5nZSBiaXRmaWVsZCBjb2RlIHRvIHVzZSBhIGJ1ZmZlciBvZgorCXRoZSBjb3JyZWN0IHNpemUsIHJhdGhlciB0aGFuIGFuIGludC4KKworV2VkIE9jdCAyNyAxMzo0MzowNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2kzODYve2kzODZtMy5tdCxpMzg2bTMubWh9LAorCWNvbmZpZy9taXBzL3ttaXBzbTMubXQsbWlwc20zLm1ofSwKKwljb25maWcvbnMzMmsve25zMzJrbTMubXQsbnMzMmttMy5taH06IFVzZSBjb3JyZWN0IG5hbWVzIGZvciBUTV9GSUxFCisJYW5kIFhNX0ZJTEUuICBSZXBsYWNlIGhvc3QgZmlsZXMgKm1hY2gzLXhkZXAubyB3aXRoIG5hdGl2ZQorCWZpbGVzICptMy1uYXQuby4gIFJlcGxhY2UgaG9zdCBmaWxlIG9zLW1hY2gzLm8gd2l0aCBuYXRpdmUKKwlmaWxlIG0zLW5hdC5vLgorCisJKiByZW1vdGUtdWRpLmM6IFJlbW92ZSBMT0dfRklMRSBzdHVmZjsgc3VwZXJjZWRlZCBieSAic2V0IHJlbW90ZWRlYnVnIi4KKwkqIHJlbW90ZS1tb24uYzogUmVtb3ZlIGNvbW1lbnRlZCBvdXQgInNldCByZW1vdGVkZWJ1ZyIgY29tbWFuZC4KKwkqIHJlbW90ZS1uaW5keS5jOiBDbGVhbiB1cCBjb21tZW50IGFib3V0IHdhbnRpbmcgYWx0ZXJuYXRpdmUgdG8KKwlvcHRpb25zIHNwZWNpZmllZCBvbiB0aGUgR0RCIGNvbW1hbmQgbGluZS4KKworCSogZm9yay1jaGlsZC5jIChmb3JrX2luZmVyaW9yKTogU2V0IGluZmVyaW9yX3BpZCBiZWZvcmUgY2FsbGluZworCWluaXRfdHJhY2VfZnVuLiAgTW92ZSB0aGUgY29kZSB3aGljaCBnZXRzIHVzIHRocm91Z2ggdGhlIHNoZWxsCisJdG8gbmV3IGZ1bmN0aW9uIHN0YXJ0dXBfaW5mZXJpb3IuCisJKiBpbmZlcmlvci5oOiBEZWNsYXJlIHN0YXJ0dXBfaW5mZXJpb3IuCisJKiBwcm9jZnMuYyAocHJvY2ZzX2luaXRfaW5mZXJpb3IpLCBpbmZ0YXJnLmMgKHB0cmFjZV9oaW0pOgorCUNhbGwgc3RhcnR1cF9pbmZlcmlvci4KKwkqIG0zLW5hdC5jIChtM190cmFjZV9oaW0pOiBDYWxsIGludGVyY2VwdF9leGVjX2NhbGxzLgorCSogY29uZmlnL25tLW0zLmg6IERvbid0IGRlZmluZSBTVEFSVFVQX0lORkVSSU9SLgorCSogY29uZmlnL2kzODYvdG0taTM4Nm0zLmgsIGNvbmZpZy9uczMyay90bS1uczMyay5oLAorCWNvbmZpZy9taXBzL3RtLW1pcHNtMy5oOiBEb24ndCBkZWZpbmUgU1RBUlRfSU5GRVJJT1JfVFJBUFNfRVhQRUNURUQuCisKKwkqIG02OGstc3R1Yi5jOiBDaGFuZ2UgdmVjdG9yIDEzIGZyb20gU0lHRlBFIHRvIFNJR0JVUy4KKworVHVlIE9jdCAyNiAyMjowNTowMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy10ZGVwLmMgKG1pcHNfcG9wX2ZyYW1lKTogSWYgcHJvY19kZXNjIGlzIE5VTEwsIGRvbid0IGR1bXAgY29yZS4KKworVHVlIE9jdCAyNiAxNTowNzoyOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCWdjYyAtV2FsbCBsaW50OgorCSogbmxtcmVhZC5jOiBJbmNsdWRlIHN0YWJzcmVhZC5oLgorCSogTWFrZWZpbGUuaW46IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCisKKwkqIHJlbW90ZS5jOiBDaGFuZ2UgUEJVRlNJWiBiYWNrIHRvIDQwMC4gIEpvaG4ncyAyOCBGZWIgMTk5MiBjaGFuZ2UKKwl0byBpbmNyZWFzZSBpdCBicm9rZSB0aGUgYWJpbGl0eSB0byB3cml0ZSBsYXJnZSBjaHVua3Mgb2YgbWVtb3J5CisJd2l0aCBtNjhrLXN0dWIgYW5kIGkzODYtc3R1Yi4gIE5vdyB3ZSBvbmx5IHVzZSBtb3JlIHRoYW4gNDAwIG9uCisJbWFjaGluZXMgd2hlcmUgd2UgbmVlZCB0aGF0IG11Y2ggdG8gd3JpdGUgdGhlIHJlZ2lzdGVycy4KKwkqIHJlbW90ZS5jIChyZW1vdGVfd3JpdGVfYnl0ZXMpOiBFbGltaW5hdGUgcG9zc2libGUgYWJvcnQoKS4gIFRoZQorCWNoZWNrIGZvciB3aGVuIHRvIGFib3J0IHdhcyBvZmYgYnkgYSBmZXcgYnl0ZXMgYW5kIGJlc2lkZXMgd2hpY2gsCisJaXQgaXMgaGFuZGxlZCBieSBNQVhCVUZCWVRFUywgd2hpY2ggdGhlIGNhbGxlciB1c2VzLgorCSogbTY4ay1zdHViLmM6IEFkZCBjb21tZW50cyBhYm91dCB0cmFwICMxIGFuZCB0cmFwICM4IGluc3RydWN0aW9ucy4KKworVHVlIE9jdCAyNiAwODozNjowNyAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiByZW1vdGUtc2ltLmggKFNJTV9BRERSKTogTmV3IHR5cGUgKHNhbWUgYXMgQ09SRV9BRERSKS4KKwkoc2ltX3NldF9wYyk6IFVwZGF0ZSBwcm90b3R5cGUuCisJKHNpbV9yZWFkLCBzaW1fd3JpdGUpOiBEaXR0bywgYW5kIHVzZSB1bnNpZ25lZCBjaGFyICpidWYuCisJKHNpbV9mZXRjaF9yZWdpc3Rlciwgc2ltX3N0b3JlX3JlZ2lzdGVyKTogVXNlIHVuc2lnbmVkIGNoYXIgKmJ1Zi4KKwkoc2ltX2luZm8pOiBQYXNzIHByaW50ZiBmdW5jdGlvbiBhcyBhcmd1bWVudCwgYWRkIHZlcmJvc2UgYXJndW1lbnQuCisJKHNpbV9zdG9wX3JlYXNvbik6IFJlbmFtZWQgZnJvbSBzaW1fc3RvcF9zaWduYWwsIGZpeCBwcm90b3R5cGUuCisJKiByZW1vdGUtc2ltLmMgKGdkYnNpbV93YWl0KTogVXBkYXRlIGNhbGwgdG8gc2ltX3N0b3BfcmVhc29uLgorCShnZGJzaW1fZmlsZXNfaW5mbyk6IFVwZGF0ZSBjYWxsIHRvIHNpbV9pbmZvLgorCitUdWUgT2N0IDI2IDEwOjQxOjI5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiB2YWxvcHMuYyAodmFsdWVfYXNzaWduKTogQ2FsbCByZWluaXRfZnJhbWVfY2FjaGUgd2hlbiBhc3NpZ25pbmcKKwl0byBhIHJlZ2lzdGVyLgorCitNb24gT2N0IDI1IDExOjA4OjU5IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBGaXggUEMgb3V0IG9mIG9iamZpbGUgYm91bmRzCisJY2hlY2sgdG8ganVzdCB1c2Ugc3RvcF9mdW5jX25hbWUgPT0gMC4KKwkqIHJlbW90ZS11ZGkuYyAoc3RvcmVfcmVnaXN0ZXIpOiAgSW52YWxpZGF0ZSBOUEMvUENfUkVHTlVNIGFmdGVyCisJY2hhbmdpbmcgUEMuCisKK01vbiBPY3QgMjUgMTQ6NTc6NDUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYnNlcnZlci97bG93LWx5bnguYyxsb3ctc3BhcmMuYyxsb3ctc3VuMy5jfSwgc3RhbmRhbG9uZS5jLAorCW0zLW5hdC5jLCBpMzg2bTMtbmF0LmMsIG1pcHNtMy1uYXQuYywgbnMzMmttMy1uYXQuYzogYmNvcHkgLT4gbWVtY3B5LgorCisJZ2NjIC1XYWxsIGxpbnQ6CisJKiBicmVha3BvaW50LmM6IEluY2x1ZGUgdGhyZWFkLmguCisJKiBjb2ZmcmVhZC5jOiBJbmNsdWRlIHN0YWJzcmVhZC5oLgorCSogTWFrZWZpbGUuaW46IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCisJKiBicmVha3BvaW50LmMgKG1lbnRpb24pOiBBZGQgYnBfY2FsbF9kdW1teSB0byBzd2l0Y2guCisJKiBzeW1taXNjLmMgKGR1bXBfc3ltdGFiKTogVXNlICVkIG5vdCAlbGQgZm9yIGxpbmUgbnVtYmVyLgorCitTdW4gT2N0IDI0IDE4OjI5OjMyIDE5OTMgIFRvbSBMb3JkICAobG9yZEBydGwuY3lnbnVzLmNvbSkKKworCSogZXZlcnkgbm9uLW9ic29sZXRlIGZpbGUgZXhjZXB0IHV0aWxzLmM6CisJICBDaGFuZ2UgdGhlIHN0cmVhbSBhcmd1bWVudCB0byBfZmlsdGVyZWQgdG8gR0RCX0ZJTEUgKi4KKwkgIENoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byBzdGRvdXQvc3RkZXJyIHRvIGdkYl9zdGRvdXQvZ2RiX3N0ZGVyci4KKwkgIFJlcGxhY2UgYWxsIGNhbGxzIHRvIHN0ZGlvIG91dHB1dCBmdW5jdGlvbnMgd2l0aAorCSAgICBjYWxscyB0byBjb3JyZXNwb25kaW5nIF91bmZpbHRlcmVkIGZ1bmN0aW9ucy4KKwkgIFJlcGxhY2VkIGNhbGxzIHRvIGZvcGVuIGZvciBvdXRwdXQgdG8gZ2RiX2ZvcGVuLgorCSAgQWRkZWQgc3VmZmljaWVudCBnb28gdG8gdXRpbHMuYyBhbmQgZGVmcy5oIHRvIG1ha2UgdGhlIGFib3ZlCisJICB3b3JrLgorCSAgCisJICBUaGUgbmV0IGVmZmVjdCBpcyB0aGF0IHN0ZGlvIG91dHB1dCBmdW5jdGlvbnMgYXJlIG9ubHkgZGlyZWN0bHkKKwkgIHVzZWQgaW4gdXRpbHMuYy4gIEVsc2V3aGVyZSwgdGhlIF91bmZpbHRlcmVkIGFuZCBfZmlsdGVyZWQgCisJICBmdW5jdGlvbnMgYW5kIEdEQl9GSUxFIHR5cGUgYXJlIHVzZWQuCisKKwkgIEluIHRoZSBuZWFyIGZ1dHVyZSwgR0RCX0ZJTEUgd2lsbCBzdG9wIGJlaW5nIGVxdWl2YWxhbnQgdG8gCisJICBGSUxFLgorCisJICBUaGUgc2VtYW50aWNzIG9mIHNvbWUgY29tbWFuZHMgaGFzIGNoYW5nZWQgaW4gYSB2ZXJ5IHN1YnRsZSB3YXk6CisJICBjYWxsZWQgaW4gdGhlIHJpZ2h0IGNvbnRleHQsIHRoZXkgbWF5IGNhdXNlIG5ldyBvY2N1cmVuY2VzIG9mIAorCSAgcHJvbXB0X2Zvcl9jb250aW51ZSgpIGJlaGF2aW9yLgorCisJICBQbGVhc2UgcmVzcGVjdCB0aGlzIGNoYW5nZSBieSBub3QgcmVpbnRyb2R1Y2luZyBzdGRpbyBvdXRwdXQgCisJICBkZXBlbmRlbmNpZXMgaW4gdGhlIG1haW4gYm9keSBvZiBnZGIgY29kZS4gIEFsbCBvdXRwdXQgZnJvbQorCSAgY29tbWFuZHMgc2hvdWxkIGdvIHRvIGEgR0RCX0ZJTEUuCisKK1N1biBPY3QgMjQgMjA6MTY6MzggMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBwYXJzZS5jLCBwYXJzZXItZGVmcy5oICh3cml0ZV9leHBfbXN5bWJvbCk6ICBOZXcgZnVuY3Rpb24gdG8gd3JpdGUKKwl0aGUgYXBwcm9wcmlhdGUgZXhwcmVzc2lvbiBmb3IgYSBtaW5pbWFsIHN5bWJvbC4gIFRha2VuIGZyb20gYy1leHAueQorCWFuZCBtMi1leHAueSBidXQgaGFuZGxlcyBtc3RfZmlsZV8qLgorCSogYy1leHAueSwgbTItZXhwLnk6ICBVc2UgaXQuCisKK1N1biBPY3QgMjQgMDk6MzE6MDUgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGxpc2EuY3lnbnVzLmNvbSkKKworCSogZWxmcmVhZC5jIChlbGZfc3ltdGFiX3JlYWQpOiAgVXNlIGJmZCBjb252ZW50aW9uIHRoYXQgYm90aAorCWluaXRpYWxpemVkIGFuZCB1bmluaXRpYWxpemVkIGRhdGEgc2VjdGlvbnMgaGF2ZSB0aGUgU0VDX0FMTE9DCisJZmxhZyBiaXQgc2V0LCBidXQgb25seSBpbml0aWFsaXplZCBzZWN0aW9ucyBoYXZlIFNFQ19MT0FEIHNldC4KKwlTRUNfREFUQSBpcyBpZ25vcmVkIHNpbmNlIGl0IG9ubHkgZ2V0cyBzZXQgZm9yIGluaXRpYWxpemVkIAorCWRhdGEuCisKK1NhdCBPY3QgMjMgMTQ6NDg6MTggMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXNpbS5oIChzaW1fc3RvcCk6IE5ldyBlbnVtLgorCShzaW1fc3RvcF9zaWduYWwpOiBDaGFuZ2UgcHJvdG90eXBlLCByZXN1bHQgaXMgZW51bSBzaW1fc3RvcC4KKwkqIHJlbW90ZS1zaW0uYyAoZ2Ric2ltX3dhaXQpOiBVcGRhdGUgY2FsbCB0byBzaW1fc3RvcF9zaWduYWwuCisKK0ZyaSBPY3QgMjIgMDc6NDk6NTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzcmVhZC5jIChkZWZpbmVfc3ltYm9sKTogU2tpcCB0aGUgd2hvbGUgdGhpbmcgYWJvdXQgInBjYworCXByb21vdGlvbiIgb24gbGl0dGxlLWVuZGlhbiBtYWNoaW5lcy4KKworCSogcmVtb3RlLXZ4LmMgKHZ4X3dhaXQpOiBSZW5hbWUgcGlkIHBhcmFtZXRlciB0byBwaWRfdG9fd2FpdF9mb3IuCisJU29tZSBjb21waWxlcnMgKGxlZ2l0aW1hdGVseSkgZG9uJ3QgbGlrZSB2YXJpYWJsZXMgaW4gdGhlCisJZnVuY3Rpb24ncyBvdXRlcm1vc3QgYmxvY2sgd2hvc2UgbmFtZSBpcyB0aGUgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YKKwlhIHBhcmFtZXRlci4KKworCU1lcmdlIEFwb2xsbyBwYXRjaGVzIGZyb20gVHJveSBSb2xsbyAodHJveUBjYm1lLnVuc3cuZWR1LmF1KToKKwkqIGRzdC5oLCBkc3RyZWFkLmMsIGNvbmZpZy9tNjhrL3thcG9sbG82OGIubXQsdG0tYXBvbGxvNjhiLmh9OgorCU5ldyBmaWxlcy4KKwkqIGNvbmZpZy9tNjhrL25tLWFwb2xsbzY4Yi5oOiBBZGQgbW9yZSBkZWZpbmVzLgorCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgYXBvbGxvIHRhcmdldCwgbm90IGp1c3QgaG9zdC4KKworCSogY29uZmlndXJlLmluOiBBZGQgKiB0byBlbmQgb2YgYWxsIE9TIG5hbWVzLgorCitGcmkgT2N0IDIyIDA2OjE0OjAxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoQUxMUEFSQU0pOiAgQWRkIGNvbmZpZy9tODhrL3htLWRlbHRhODh2NC5oCisKK1RodSBPY3QgMjEgMTI6MjM6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbml0LmMpOiBHZW5lcmF0ZSB1c2luZyB0aGUgc291cmNlLCBub3QgbXVuY2guICBUaGlzCisJY2xlYW5zIHVwIGFsbCBraW5kcyBvZiBoYXNzbGVzICh3aGljaCBubSB0byB1c2UgaW4gbXVuY2gsIGV0YykuICBUaGUKKwluZXcgZm9ybWF0dGluZyBjb252ZW50aW9ucyAobW9zdGx5IGFscmVhZHkgZm9sbG93ZWQpIGFyZSB0aGF0CisJdGhlIG5hbWUgb2YgdGhlIF9pbml0aWFsaXplXyogcm91dGluZXMgbXVzdCBzdGFydCBpbiBjb2x1bW4gemVybywKKwlhbmQgbXVzdCBub3QgYmUgaW5zaWRlICNpZi4KKwkqIG11bmNoOiBSZW1vdmVkLgorCSogTWFrZWZpbGUuaW46IFJlbW92ZSByZWZlcmVuY2VzIHRvIG11bmNoLgorCSogc2VyaWFsLmMsIHJlbW90ZS5jLCBpbmZwdHJhY2UuYywgbWFpbnQuYywgY29udmV4LXRkZXAuYywKKwlhbHBoYS10ZGVwLmMsIGhwMzAwdXgtbmF0LmMsIGhwcGFiLW5hdC5jLCBvc2Zzb2xpYi5jLCByZW1vdGUtZXMuYywKKwlwcm9jZnMuYywgcmVtb3RlLXVkaS5jLCBzZXItZ28zMi5jLCB1bHRyYTMteGRlcC5jLCBzaC10ZGVwLmMsCisJaTk2MC10ZGVwLmMsIGhwcGEtdGRlcC5jLCBoODUwMC10ZGVwLmMsIGRweDItbmF0LmMsIGRlbHRhNjgtbmF0LmMsCisJejhrLXRkZXAuYzogTWFrZSBzdXJlIHRoZSBhYm92ZSBjb252ZW50aW9ucyBhcmUgZm9sbG93ZWQuICBNYWtlCisJc3VyZSB0aGV5IGFyZSBhbGwgZGVjbGFyZWQgYXMgcmV0dXJuaW5nIHZvaWQuICBDbGVhbiB1cAorCW1pc2NlbGxhbmVvdXMgY29tbWVudHMgYW5kIHN1Y2guCisKKwkqIHNoLXRkZXAuYyAoc2ltX2xvYWQpOiBBZGQgZnVuY3Rpb24uCisKK1RodSBPY3QgMjEgMTU6NTg6NDggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQorCisJKiByZW1vdGUtbWlwcy5jIChtaXBzX3dhaXQpOiBhZGQgcGlkIGFyZ3VtZW50LgorCitUaHUgT2N0IDIxIDEyOjIzOjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoYy1leHAudGFiLm8pOiBSZW1vdmUgbm90aWNlIGFib3V0IHNoaWZ0L3JlZHVjZSBjb25mbGljdHMKKwl3aGljaCBubyBsb25nZXIgb2NjdXIuCisKKwlnY2MgLVdhbGwgbGludDoKKwkqIGZpbmR2YXIuYyAoc3ltYm9sX3JlYWRfbmVlZHNfZnJhbWUpLCBjb3JlbG93LmMgKGlnbm9yZSksCisJaW5mbG93LmMgKGdkYl9oYXNfYV90ZXJtaW5hbCk6IE1ha2Ugc3VyZSB0byByZXR1cm4gYSB2YWx1ZS4KKwkqIHJlZ2V4Lmg6IERlY2xhcmUgcmVfc2V0X3N5bnRheC4KKwkqIHByaW50Y21kLmM6IEluY2x1ZGUgdmFscHJpbnQuaC4KKwkqIGluZmNtZC5jLCBleGVjLmMsIG1haW50LmMsIGNvcmUuYzogSW5jbHVkZSBsYW5ndWFnZS5oLgorCSogbWFpbnQuYzogSW5jbHVkZSBleHByZXNzaW9uLmguCisJKiBpbmZydW4uYywgZm9yay1jaGlsZC5jLCBjb3JlbG93LmMsIGluZmxvdy5jOiBJbmNsdWRlIHRocmVhZC5oLgorCSogaW5mdGFyZy5jOiBJbmNsdWRlIGNvbW1hbmQuaC4KKwkqIGNvcmVkZXAuYzogSW5jbHVkZSB2YWx1ZS5oLgorCSogYy1leHAueSwgbTItZXhwLnksIGNoLWV4cC55OiBJbmNsdWRlIGJmZC5oLCBzeW1maWxlLmggYW5kIG9iamZpbGVzLmguCisJKiBjaC10eXBlcHJpbnQuYzogSW5jbHVkZSB0eXBlcHJpbnQuaC4KKwkqIGNoLXZhbHByaW50LmM6IEluY2x1ZGUgYy1sYW5nLmguCisJKiBubG1yZWFkLmM6IEluY2x1ZGUgYnVpbGRzeW0uaC4KKwkqIGVudmlyb24uYzogSW5jbHVkZSBnZGJjb3JlLmguICBPbmx5IGluY2x1ZGUgZGVmcy5oIG9uY2UuCisJKHNldF9pbl9lbnZpcm9uKTogQ2FzdCBjb25zdCBjaGFyICogdG8gY2hhciAqIHdoZW4gcGFzc2luZyB0bworCXNldF9nbnV0YXJnZXQuCisJKiBNYWtlZmlsZS5pbjogVXBkYXRlIGRlcGVuZGVuY2llcyB0byByZWZsZWN0IGFsbCB0aGVzZSBuZXcgaW5jbHVkZXMuCisJUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXM6CisJKiBwcmludGNtZC5jIChwcmludGZfY29tbWFuZCk6IGFyZ3NfdG9fdnByaW50Zi4KKwkqIGNvZmZyZWFkLmMgKGNvZmZfc3ltZmlsZV9pbml0KTogc3Ryc2VjdGlvbi4KKwlNb3ZlIHZhcmlhYmxlcyB0byB3aXRoaW4gdGhlICNpZmRlZnMgd2hlcmUgdGhleSBhcmUgdXNlZDoKKwkqIHN5bXRhYi5jIChnZGJfbWFuZ2xlX25hbWUpOiBvcG5hbWUuCisJKiBpbmZ0YXJnLmMgKGNoaWxkX2F0dGFjaCk6IHBpZCBhbmQgZXhlY19maWxlLgorCSogaW5mdGFyZy5jIChjaGlsZF9kZXRhY2gpOiBzaWdnbmFsLgorCSogb2JqZmlsZXMuYyAoYWxsb2NhdGVfb2JqZmlsZSk6IG1hcHRvLCBtZCwgYW5kIGZkLgorCSogb2JqZmlsZXMuYyAoZnJlZV9vYmpmaWxlKTogbW1mZC4KKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IEluY2x1ZGUgQlBTVEFUX1dIQVRfTEFTVCBpbiBzd2l0Y2guCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBSZW1vdmUgdW51c2VkIHNhbWVfcGlkIGxhYmVsLgorCSogaW5mZXJpb3IuaDogRGVjbGFyZSBzZXRfc2lnaW50X3RyYXAgYW5kIGNsZWFyX3NpZ2ludF90cmFwLgorCSogcGFyc2VyLWRlZnMuaDogRGVjbGFyZSB3cml0ZV9leHBfZWx0X2Jsb2NrLgorCSogc3RhYnNyZWFkLmg6IERlY2xhcmUgZWxmc3RhYl9vZmZzZXRfc2VjdGlvbnMgYW5kCisJY29mZnN0YWJfYnVpbGRfcHN5bXRhYnMuCisKK1RodSBPY3QgMjEgMTI6MDU6MDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwlQYXRjaCBmcm9tIEplZmYgTGF3OgorCSogcGFyZWFkLmM6IEZpeCByZWZlcmVuY2VzIHRvICJocHBhIiB0aGF0IHNob3VsZCBub3cgYmUgInNvbSIuCisKK1RodSBPY3QgMjEgMTI6MjM6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN5bXRhYi5jIChkZWNvZGVfbGluZV8xKTogRG9uJ3QgdXNlIFNZTUJPTF9MSU5FIGZvciBmdW5jdGlvbnMuCisKK1RodSBPY3QgMjEgMDI6NTk6MDcgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXVkaS5jICh1ZGlfc3RvcmVfcmVnaXN0ZXJzLCBzdG9yZV9yZWdpc3Rlcik6ICBVc2UKKwlVREkyOUtQQyBhZGRyZXNzIHNwYWNlIHdoZW4gbW9kaWZ5aW5nIFBDLiAgSXQgc2VlbXMgdGhhdCB5b3UgY2FuJ3QKKwltb2RpZnkgdGhlIFBDIGRpcmVjdGx5IChhdCBsZWFzdCBpbiB0aGUgaXNzdGlwIHNpbXVsYXRvcikuCisKK1dlZCBPY3QgMjAgMTE6MzU6NDMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHRhcmdldC5oOiBQdXQgcmVtb3RlX2RlYnVnIGRlY2xhcmF0aW9uIGJhY2sgaGVyZS4gIEFkZCBiYXVkX3JhdGUuCisJKiByZW1vdGUuYywgcmVtb3RlLXVkaS5jLCByZW1vdGUtdXRpbHMuaDogTGV0IHRhcmdldC5oIHRha2UgY2FyZSBvZgorCWRlY2xhcmluZyB0aGVzZS4gIFRob3NlIHJhbmRvbSBleHRlcm5zIGFsbCBvdmVyIGFyZSBlcnJvciBwcm9uZS4KKwkqIE1vdmUgInNldCByZW1vdGViYXVkIiBmcm9tIHJlbW90ZS11dGlscy5jIHRvIG1haW4uYyB0byBpdCBhcHBsaWVzCisJdG8gcmVtb3RlLmMgYXMgd2VsbC4KKworCSogeGNvZmZyZWFkLmMgKHhjb2ZmX3N5bWZpbGVfcmVhZCksIGNvZmZyZWFkLmMgKGNvZmZfc3ltZmlsZV9yZWFkKToKKwlTb3J0IHN5bXRhYnMgZm9yIHRoaXMgb2JqZmlsZSBvbmx5LCBub3QgZm9yIGFsbCBvYmpmaWxlcy4KKwkqIHN5bWZpbGUuYywgc3ltZmlsZS5oIChzb3J0X2FsbF9zeW10YWJfc3ltcyk6IFJlbW92ZTsgbm8gbG9uZ2VyIHVzZWQuCisKKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3N5bWJvbCk6IEluIHRoaXJkLWV5ZSwgYSBmdW5jdGlvbiBoYXMgYSBibG9jaworCXdpdGhpbiBpdCB3aGljaCByZXByZXNlbnRzIHRoZSB3aG9sZSBmdW5jdGlvbi4gIENyZWF0ZSBvbmx5IG9uZQorCUdEQiBibG9jayBmb3IgYm90aC4KKworV2VkIE9jdCAyMCAxNzo0Nzo0MiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBtYWluLmM6ICBNYWtlIGJhdWRfcmF0ZSBhbmQgcmVtb3RlX2RlYnVnIGJlIGdsb2JhbCB2YXJpYWJsZXMsCisJcmVtb3ZlICNpbmNsdWRlICJyZW1vdGUtdXRpbHMuaCIuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGJ1aWxkCisJR0RCIHdpdGhvdXQgcmVtb3RlLXV0aWxzLmMuICBBbHNvLCBtb3ZlIHNldHRpbmcgb2YgcmVtb3RlX2RlYnVnCisJaW50byBtYWluLCBzbyB0aGF0IGFsbCByZW1vdGUqLmMgZmlsZXMgY2FuIHVzZSBpdCAobm90IGp1c3QgdGhlCisJc2VyaWFsIGxpbmUgb25lcykuICBBbmQsIG1ha2UgYmF1ZF9yYXRlIGJlIGFuIGludC4KKwkqIHJlbW90ZS11ZGkuYzogIENoYW5nZSBraW9kZWJ1ZyB0byByZW1vdGVfZGVidWcuCisJKiByZW1vdGUtdXRpbHMuYzogIE1vdmUgc2V0dGluZyBvZiBiYXVkIHJhdGUgYW5kIGRlYnVnIGludG8gbWFpbi5jLgorCSogcmVtb3RlLXV0aWxzLmg6ICBSZWRlZmluZSBzcl97Z2V0IHNldH1fZGVidWcgYW5kIHNyX3tnZXQgc2V0fV9iYXVkCisJdG8gdXNlIGJhdWRfcmF0ZSBhbmQgcmVtb3RlX2RlYnVnIGdsb2JhbHMgZm9yIGNvbXBhdGliaWxpdHkuCisJKiByZW1vdGUuYzogIFVzZSByZW1vdGVfZGVidWcgYW5kIGJhdWRfcmF0ZSBnbG9iYWxzIGRpcmVjdGx5LAorCWluc3RlYWQgb2Ygc3JfIGZ1bmN0aW9ucywgc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGxvYWQKKwlyZW1vdGUtdXRpbHMuYy4KKwkqIGNvbmZpZy9hMjlrL2EyOWstdWRpLm10OiAgRGVmaW5lIFJFTU9URV9PIGFzIG51bGwgc28gdGhhdCB3ZSBkb24ndAorCWdldCB0aGUgZGVmYXVsdCByZW1vdGUqIG1vZHVsZXMuCisKK1dlZCBPY3QgMjAgMTE6MzU6NDMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzcmVhZC5jIChkZWZpbmVfc3ltYm9sKTogV2hlbiBjb21iaW5pbmcgYSBMT0NfQVJHIGFuZCBhCisJTE9DX1JFR0lTVEVSLCB1c2UgdGhlIHR5cGUgZnJvbSB0aGUgTE9DX1JFR0lTVEVSLCBub3QgZnJvbSB0aGUKKwlMT0NfQVJHLgorCitXZWQgT2N0IDIwIDE0OjM0OjM4IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2kzODYveG0tZ28zMi5oOiBkZWZpbmUgc29tZSBzaWduYWxzIGlmIHRoZXkgYXJlbid0CisJICBhbHJlYWR5IGRlZmluZWQuCisKK1dlZCBPY3QgMjAgMTE6MzU6NDMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChJTlRFUk5BTF9MREZMQUdTKTogTmV3IG1hY3JvLiAgVGhlIG5ldyBwYXJ0IGlzCisJdGhhdCB3ZSB1c2UgQ0ZMQUdTIGFuZCBQUk9GSUxFX0NGTEFHUyB0byBsaW5rLgorCShnZGIsIHJhcHAsIGtkYik6IFVzZSBJTlRFUk5BTF9MREZMQUdTIGluc3RlYWQgb2YKKwlMREZMQUdTIGFuZC9vciBHTE9CQUxfQ0ZMQUdTLgorCitXZWQgT2N0IDIwIDA5OjI5OjU1IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgQWRkICQoc3JjZGlyKSB0byBhbGwgcmVmcyB0byAyOWstc2hhcmUKKwlkaXJlY3Rvcmllcy4KKworVHVlIE9jdCAxOSAxNzoyMzozNCAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEFMTENPTkZJRyk6ICBBZGQgY29uZmlnL2kzODYve2kzODZtMy5taCwgaTM4Nm0zLm10LAorCWkzODYvaTM4Nm1rLm1oIGkzODYvaTM4Nm1rLm10fSwgY29uZmlnL21pcHMve21pcHNtMy5taCwKKwltaXBzbTMubXR9LCBjb25maWcvbnMzMmsve25zMzJrbTMubWgsIG5zMzJtMy5tdH0KKwkqIE1ha2VmaWxlLmluIChyZW1vdGVfdXRpbHNfaCk6ICBBZGQgcmVtb3RlLXNpbS5oCisJKiBNYWtlZmlsZS5pbiAoTk9OU1JDKTogIEFkZCBpMzg2LW5sbXN0dWIuYworCSogTWFrZWZpbGUuaW4gKEhGSUxFUyk6ICBBZGQgY29mZi1zb2xpYi5oCisKK1R1ZSBPY3QgMTkgMTQ6MTU6NDAgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQorCisJKiB2YWx1ZXMuYyAodmFsdWVfdmlydHVhbF9mbl9maWVsZCk6IEZpeCB0aGUgb2Zmc2V0IGNhbGN1bGF0aW9uCisJd2hlbiBjYWxsaW5nIHZpcnR1YWwgZnVuY3Rpb25zLiAoZ2RiLnQyMi92aXJ0ZnVuYy5leHApLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiBzYW1lIGFzIGFib3ZlLgorCitUdWUgT2N0IDE5IDEwOjQzOjE2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWcvcnM2MDAwL3JzNjAwMC5taCAoVEVSTUNBUCk6IERlZmluZSB0byAtbGN1cnNlcy4KKworCSogTWFrZWZpbGUuaW46IERlZmluZSBDWFhGTEFHUy4KKworVHVlIE9jdCAxOSAwOToyODo1MiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBzcGFyY2xpdGUvTWFrZWZpbGUuaW46ICBGaXh1cCBzbyB0aGF0IHRoaXMgd29ya3Mgd2l0aCBTdW4gbWFrZQorCWFuZCBWUEFUSC4KKworVHVlIE9jdCAxOSAxMDo0MzoxNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5oIChzdHJ1Y3QgYnBzdGF0X3doYXQpOiBEb24ndCB1c2UgYml0ZmllbGRzLgorCisJKiB0eXBlcHJpbnQuYzogQWRkICJjbGFzcyBDTEFTUy1OQU1FIiB0byBkb2NzdHJpbmcgZm9yIHB0eXBlLgorCitUdWUgT2N0IDE5IDA2OjE3OjEwIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEFMTFBBUkFNKTogIEFkZCBjb25maWcvbTg4ay97bm0tZGVsdGE4OHY0LmgsCisJdG0tZGVsdGE4OHY0LmgsIHhtLWRndXguaH0uCisJKiBNYWtlZmlsZS5pbiAoQUxMQ09ORklHKTogIEFkZCBjb25maWcvbTg4ay97ZGVsdGE4OHY0Lm1oLAorCWRlbHRhODh2NC5tdH0uCisKKwkqIFJFQURNRTogIFJlbW92ZSBjb21tZW50IGFib3V0IFN1bk9TIDUueCBwcm9ncmFtcyBsZWF2aW5nCisJY29yZWR1bXBzLiAgSW5mbyBmcm9tIFN1biBpcyB0aGF0IHRoaXMgd2FzIG5vdCBpbiBjdXN0b21lcgorCXJlbGVhc2VzLgorCitNb24gT2N0IDE4IDEwOjI4OjA4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBocHBhLXRkZXAuYyAocmVzdG9yZV9wY19xdWV1ZSk6IENhbGwgdGFyZ2V0X3Rlcm1pbmFsX291cnMgYWZ0ZXIKKwlkb25lIHN0ZXBwaW5nIHRoZSBpbmZlcmlvci4KKworCSogYy1leHAueTogUmVtb3ZlIG5ldmVyLXVzZWQgKGJlY2F1c2Ugb2Ygc2hpZnQvcmVkdWNlIGNvbmZsaWN0cykKKwlydWxlcyBmb3IgcG9pbnRlcnMgdG8gbWVtYmVycy4KKwkqIE1ha2VmaWxlLmluOiBSZW1vdmUgbm90aWNlIGFib3V0IGV4cGVjdGVkIHNoaWZ0L3JlZHVjZSBjb25mbGljdHMuCisKKwkqIGJ1aWxkc3ltLmMgKGZpbmlzaF9ibG9jayk6IElmIHdlIHBvcCB0aGUgY29udGV4dCBzdGFjayBhbmQgaXQgaXMKKwlub3QgZW1wdHksIGNvbXBsYWluICgpIGluc3RlYWQgb2YgYWJvcnQgKCkuCisKK1N1biBPY3QgMTcgMTk6NDI6MzEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHBhcnNlLmMsIHBhcnNlci1kZWZzLmggKGZvbGxvd190eXBlcyk6IE5ldyBmdW5jdGlvbi4KKwkqIGMtZXhwLnkgKHB0eXBlIDogdHlwZWJhc2UgYWJzX2RlY2wpOiBVc2UgaXQuCisJKiBjLWV4cC55IChwdHlwZSk6IEFkZCBzdXBwb3J0IGZvciB0eXBlIHF1YWxpZmllcnMgYWZ0ZXIgdGhlCisJdHlwZWJhc2UuICBUaGUgdHlwZWJhc2UgcnVsZSBhbHJlYWR5IGhhcyBzdXBwb3J0IGZvciB0aGVtIGJlZm9yZQorCXRoZSB0eXBlYmFzZS4KKwkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBzaGlmdC9yZWR1Y2UKKwljb25mbGljdHMgdG8gNi4gIFRoaXMgaXMgT0stLXRoZSAyIG5ldyBjb25mbGljdHMgYXJlIGJhc2ljYWxseSB0aGUKKwlzYW1lIGFzIG9uZSBvZiB0aGUgb2xkIG9uZXMuCisKK1N1biBPY3QgMTcgMTM6MDQ6NDkgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIEJ1bXAgdG8gNC4xMC4zLgorCitTdW4gT2N0IDE3IDA5OjE4OjU3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBDbGVhbiB1cCBjb21tZW50cyB3aGljaCB3ZXJlIGF0CisJdGhlIHRvcCBvZiB0aGUgZmlsZSwgbWFraW5nIHRoZW0gbW9yZSBjb25jaXNlIGFuZCBtb3ZpbmcgdGhlbSB3aXRoCisJdGhlIGNvZGUgKFNvcnJ5LCBSYW5keSwgYnV0IHRoZXNlIHN0cmVhbS1vZi1jb25zY2lvdXNuZXNzIGNvbW1lbnRzCisJcmVhbGx5IGhhdmUgdG8gZ28pLiAgU3dpdGNoIHRoZSBvcmRlciBvZiB0aGUgIiYmIiwgd2hpY2ggbWFrZXMKKwl0aGluZ3MgY2xlYXJlciBhbmQgdHVybnMgb3V0IHRvIGJlIGFuIGltcHJvdmVtZW50IHdpdGggcmVzcGVjdCB0bworCXNpZGUgZWZmZWN0cyBhbmQgc3BlZWQuCisKK1N1biBPY3QgMTcgMDI6MDY6MDEgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogcHJvY2ZzLmM6ICBIYW5kbGUgcHJvY2VzcyBleGl0cyBtb3JlIGVsZWdhbnRseSBieSB0cmFwcGluZyBvbgorCWVudHJ5IHRvIF9leGl0LiAgQWxzbywgY2xlYW51cCBwcm9jaW5mbyBsaXN0IHdoZW4gcHJvY2VzcyBkaWVzIG9mCisJaXQncyBvd24gYWNjb3JkIChhcyBvcHBvc2VkIHRvIGJlaW5nIGtpbGxlZCkuCisKK1NhdCBPY3QgMTYgMjA6NDc6MzAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9tODhrL3htLWRndXguaDogRGVmaW5lIE5PX1BUUkFDRV9ILgorCisJKiBjb3JlbG93LmMgKGFkZF90b190aHJlYWRfbGlzdCk6IE5lZWQgYSBjYXN0IHRvIGdvIGZyb20gUFRSIHRvCisJYXNlY3Rpb24gKi4KKworCSogaW5mcnVuLmM6IEFkZCBjb21tZW50IGFib3V0IHNpZ25hbHMuCisKKwkqIGZvcmstY2hpbGQuYyAoZm9ya19pbmZlcmlvcik6IFJlbW92ZSBDUkVBVEVfSU5GRVJJT1JfSE9PSyBhZ2Fpbi4KKwlTdHUgcmVpbnN0YXRlZCBpdCAoYWNjaWRlbnRseSBJIGFzc3VtZSkuCisKK1NhdCBPY3QgMTYgMTU6Mjc6MTAgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogcHJvY2ZzLmMgKHByb2Nmc193YWl0KTogIExvc2luZyBVbml4d2FyZSBjYW4ndCBkbyBwb2xsIG9uIC9wcm9jCisJZmlsZXMuICBVc2UgUElPQ1dTVE9QIGluc3RlYWQuCisJKiBjb3JlbG93LmMgKGFkZF90b190aHJlYWRfbGlzdCk6ICBGaXggYXJnIHRvIG1hdGNoIHByb3RvdHlwZS4KKworCSogcHJvY2ZzLmMgKHByb2Nmc19zZXRfc3Byb2NfdHJhcCk6ICBEb24ndCB1c2UgdGhpcyBpZiBzcHJvYworCWlzbid0IGF2YWlsYWJsZS4KKwkqIChwcm9jZnNfbm90aWNlX3NpZ25hbHMpOiAgRml4IHByb3RvdHlwZS4KKworRnJpIE9jdCAxNSAyMjo0NjowNyAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBicmVha3BvaW50LmMgKGJyZWFrcG9pbnRfdGhyZWFkX21hdGNoIGJyZWFrX2NvbW1hbmRfMSk6CisJVGhyZWFkLXNwZWNpZmljIGJyZWFrcG9pbnQgc3VwcG9ydC4KKwkqIGJyZWFrcG9pbnQuaCAoc3RydWN0IGJyZWFrcG9pbnQpOiAgQWRkIHRocmVhZCBpZCBmaWVsZC4KKwkqIGZvcmstY2hpbGQuYyAoZm9ya19pbmZlcmlvcik6ICBNb3ZlIGNhbGwgdG8gaW5pdF90aHJlYWRfbGlzdCgpCisJYmFjayBhIGJpdCBzbyB0aGF0IGluaXRfdHJhY2VfZnVuIGNhbiBkbyB0aHJlYWQgZnVuY3Rpb25zLgorCSogaHBwYS10ZGVwLmMgKHJlc3RvcmVfcGNfcXVldWUpOiAgQWRkIHBpZCB0byBjYWxsIHRvIHRhcmdldF93YWl0LgorCSogaHBwYWItbmF0LmMgKGNoaWxkX3Jlc3VtZSk6ICBIYW5kbGUgZGVmYXVsdCBwaWQuCisJKiBocHBhaC1uYXQuYyAoY2hpbGRfcmVzdW1lKTogIEhhbmRsZSBkZWZhdWx0IHBpZC4KKwkqIGkzODZseW54LW5hdC5jIChjaGlsZF93YWl0KTogIE5ldyBhcmcgcGlkLgorCSogaW5mbG93LmMgKGtpbGxfY29tbWFuZCk6ICBSZXNldCB0aHJlYWQgbGlzdC4KKwkqIGluZnB0cmFjZS5jIChjaGlsZF9yZXN1bWUpOiAgSGFuZGxlIGRlZmF1bHQgcGlkLgorCSogaW5mcnVuLmM6ICBUaHJlYWQtc3BlY2lmaWMgYnJlYWtwb2ludCBzdXBwb3J0LgorCSogaW5mdGFyZy5jIChjaGlsZF93YWl0KTogIEFkZCBwaWQgYXJnLgorCSogb3Nmc29saWIuYyAoc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiAgQWRkIHBpZCB0byBjYWxsIHRvCisJdGFyZ2V0X3Jlc3VtZS4KKwkqIHByb2Nmcy5jOiAgTXVsdGktdGhyZWFkIHN1cHBvcnQuCisJKiByZW1vdGUtYnVnLmMgKGJ1Z193YWl0KTogIEFkZCBwaWQgYXJnLgorCSogcmVtb3RlLWhtcy5jIChobXNfd2FpdCk6ICBBZGQgcGlkIGFyZy4KKwkqIHJlbW90ZS1taXBzLmMgKG1pcHNfd2FpdCk6ICBBZGQgcGlkIGFyZy4KKwkqIHJlbW90ZS1tb24uYyAobW9uaXRvcl93YWl0KTogIEFkZCBwaWQgYXJnLgorCSogcmVtb3RlLW5pbmR5LmMgKG5pbmR5X3dhaXQpOiAgQWRkIHBpZCBhcmcuCisJKiByZW1vdGUtc2ltLmMgKGdkYnNpbV93YWl0KTogIEFkZCBwaWQgYXJnLgorCSogcmVtb3RlLXVkaS5jICh1ZGlfd2FpdCk6ICBBZGQgcGlkIGFyZy4KKwkqIHJlbW90ZS12eC5jICh2eF93YWl0KTogIEFkZCBwaWQgYXJnLgorCSogcmVtb3RlLXo4ay5jIChzaW1fd2FpdCk6ICBBZGQgcGlkIGFyZy4KKwkqIHJlbW90ZS5jIChyZW1vdGVfd2FpdCk6ICBBZGQgcGlkIGFyZy4KKwkqIHNvbGliLmMgKHNvbGliX2NyZWF0ZV9pbmZlcmlvcl9ob29rKTogIEFkZCBwaWQgdG8gY2FsbCB0bworCXRhcmdldF9yZXN1bWUuCisJKiB0YXJnZXQuaCAoc3RydWN0IHRhcmdldF9vcHMpOiAgQWRkIHBpZCBhcmcgdG8gdG9fd2FpdCBhbmQKKwl0b19ub3RpY2Vfc2lnbmFscy4KKwkqIHRocmVhZC5jICh2YWxpZF90aHJlYWRfaWQpOiAgTmV3IGZ1bmMgdG8gdmFsaWRhdGUgdGhyZWFkICNzLgorCSogKHBpZF90b190aHJlYWRfaWQpOiAgTmV3IGZ1bmMgdG8gZG8gdGhlIG9idmlvdXMuCisJKiB0aHJlYWQuaDogIFByb3RvdHlwZXMgZm9yIGFib3ZlLgorCisJKiBjb2ZmLXNvbGliLmMgKGNvZmZfc29saWJfYWRkKTogIFVzZSBuYW1lb2Zmc2V0IGZpZWxkIHRvIGxvY2F0ZQorCWZpbGVuYW1lLgorCitGcmkgT2N0IDE1IDIxOjI5OjQwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBoODMwMC10ZGVwLmMsIGg4NTAwLXRkZXAuYzogRGVmaW5lIHNpbV9sb2FkIG9ubHksIGJ1dCBub3QKKwlzaW1fa2lsbCwgc2ltX29wZW4sIG9yIHNpbV9zZXRfYXJncy4KKworCSogc3RhY2suYyAocHJpbnRfc3RhY2tfZnJhbWUpOiBQdXQgY2F0Y2hfZXJyb3JzIGFyb3VuZAorCXByaW50X2ZyYW1lX2luZm8gc28gKGZvciBleGFtcGxlKSBlcnJvciBwcmludGluZyBzb3VyY2UgZG9lc24ndAorCWNhdXNlIGF1dG8tZGlzcGxheXMgdG8gZ2V0IHNraXBwZWQgaW4gbm9ybWFsX3N0b3AuCisKKwkqIGZpbmR2YXIuYyAodmFsdWVfZnJvbV9yZWdpc3Rlcik6IFdoZW4gcHJlcGFyaW5nIHRvIGNhc3QgYSB2YWx1ZQorCWZyb20gUkVHSVNURVJfVklSVFVBTF9UWVBFIHRvIHR5cGUsIGNvcHkgdGhlIFJFR0lTVEVSX1ZJUlRVQUxfU0laRTsKKwl0aGUgb2xkIGNvZGUgZGlkbid0IGNvcHkgdGhlIHdob2xlIHRoaW5nLgorCSogdmFsb3BzLmMgKHZhbHVlX2Fzc2lnbik6IEFkZCBjb21tZW50LgorCitGcmkgT2N0IDE1IDEyOjU3OjMwIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogbWlwc3JlYWQuYyAodXBncmFkZV90eXBlKTogIFJlcGxhY2UgYml0c2l6ZSBzYW5pdHkgY2hlY2tzIGFuZAorCWNvbXBsYWludCBieSBhIGNvbW1lbnQgZXhwbGFpbmluZyB3aHkgdGhleSB3ZXJlIHVzZWxlc3MuIAorCitGcmkgT2N0IDE1IDE0OjMwOjMwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNb3ZlIGNvbW1lbnRzIG9uIGJ5cGFzc2luZyBjYWxsIGR1bW15IGJyZWFrcG9pbnQgZnJvbSBzdGFjay5jCisJdG8gYnJlYWtwb2ludC5oLgorCitGcmkgT2N0IDE1IDExOjUyOjU2IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogc3ltdGFiLmMgKGxvb2t1cF9wYXJ0aWFsX3N5bXRhYik6ICBJZiBmaWxlbmFtZSBpcyBub3QgZm91bmQgYW5kCisJY29udGFpbnMgbm8gc2xhc2hlcywgdHJ5IGFnYWluIGFuZCBjb21wYXJlIHdpdGhvdXQgbGVhZGluZyBwYXRoCisJY29tcG9uZW50cy4KKwkqIHN5bXRhYi5jIChsb29rdXBfc3ltdGFiXzEpOiAgUmVwbGFjZSBvcGVuIGNvZGVkIHZlcnNpb24gb2YKKwlsb29rdXBfcGFydGlhbF9zeW10YWIgd2l0aCBhIGZ1bmN0aW9uIGNhbGwuCisKK1RodSBPY3QgMTQgMjA6MzQ6MTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGZvcmstY2hpbGQuYyAoZm9ya19pbmZlcmlvciksIHJlbW90ZS1lYi5jIChlYl9jcmVhdGVfaW5mZXJpb3IpLAorCXJlbW90ZS1tb24uYyAobW9uaXRvcl9jcmVhdGVfaW5mZXJpb3IpLCByZW1vdGUtbmluZHkuYworCShuaW5keV9jcmVhdGVfaW5mZXJpb3IpLCByZW1vdGUtc3QuYyAoc3QyMDAwX2NyZWF0ZV9pbmZlcmlvciksCisJcmVtb3RlLXZ4LmMgKHZ4X2NyZWF0ZV9pbmZlcmlvcik6IFJlbW92ZSBDUkVBVEVfSU5GRVJJT1JfSE9PSzsgaXQKKwlpcyByZXBsYWNlZCBieSBpbml0X3RyYWNlX2Z1bi4KKwkqIGNvbmZpZy9jb252ZXgveG0tY29udmV4LmgsIGNvbnZleC14ZGVwLmM6IEFkZCBjb21tZW50cyBleHBsYWluaW5nCisJaG93IHRvIGRvIHdpdGhvdXQgQ1JFQVRFX0lORkVSSU9SX0hPT0sgZm9yIHdob2V2ZXIgZml4ZXMgdGhlIENvbnZleAorCXBvcnQuCisKKwkqIE1ha2VmaWxlLmluOiBBZGQgTWFjaCBmaWxlcyB0byBBTExERVBGSUxFUywgZXRjLgorCSogbTMtbmF0LmM6IENsZWFuIHVwIG1vcmUgaGFpci0tbWVzc2FnZSgpLCBjcHJvY3MuCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBNYWNoIHRhcmdldHMgYW5kIGhvc3RzLgorCSogY29uZmlnL25zMzJrL3RtLXVtYXguaDogQWRkIHNvbWUgI2lmbmRlZidzIHNvIHRtLW5zMzJrbTMuaCBjYW4KKwlpbmNsdWRlIHRoaXMgZmlsZS4KKwkqIE1hY2ggaGVhZGVycyBpbiBjb25maWcvKi90bS0qLmg6IEZpeCBpbmNsdWRlcyB0byBtYXRjaCBjb3JyZWN0CisJbG9jYXRpb25zIG9mIGZpbGVzLgorCitUaHUgT2N0IDE0IDIxOjM1OjU1IDE5OTMgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLW1vbi5jIChnZW5lcmFsX29wZW4pOiBTZXQgZGV2X25hbWUuIE1pbm9yIHR3ZWFraW5nIHRvIGdldAorCWl0IHdvcmtpbmcgYWdhaW4uCisJKiBjb25maWcvbTY4ay90bS1tb25pdG9yLmg6IFJlbW92ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBuYW1lcworCWFzIHRoZXJlIGFyZW4ndCBhbnkgb24gYW55IG9mIHRoZSBtb25pdG9ycyB0aGF0IHVzZSB0aGlzIGNvZGUuCisKK1dlZCBPY3QgMTMgMTE6NDc6MjMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGluZmxvdy5jOiBQYXNzIHBvaW50ZXIgdG8gcHJvY2VzcyBncm91cCwgbm90IHByb2Nlc3MgZ3JvdXAgaXRzZWxmLAorCXRvIFRJT0NTUEdSUCBpb2N0bC4KKworCSogaW5mbG93LmMgKHRlcm1pbmFsX291cnNfMSk6IERvbid0IHByaW50IHdhcm5pbmcgb24gZmFpbHVyZSB0bworCXNldCBwcm9jZXNzIGdyb3VwLgorCisJKiBwcmludGNtZC5jIChwcmludGZfY29tbWFuZCk6IEluc3RlYWQgb2YgdXNpbmcgbWFrZXZhKiBhbmQKKwljYWxsaW5nIHZwcmludGYsIGp1c3QgbWFrZSB0aGUgYXBwcm9wcmlhdGUgY2FsbHMgdG8gcHJpbnRmLgorCSogcHJpbnRjbWQuYywgY29uZmlnL3BhL3htLXBhLmgsIGNvbmZpZy9taXBzL3htLW1ha2V2YS5oLAorCWNvbmZpZy9hbHBoYS94bS1hbHBoYS5oLCBjb25maWcvbTg4ay94bS1tODhrLmg6IFJlbW92ZSBhbGwKKwl0cmFjZXMgb2YgbWFrZXZhKi4gIE15IGFwb2xvZ2llcyB0byBldmVyeW9uZSAoaW5jbHVkaW5nIG1lISkKKwl3aG8gc3BlbnQgc28gbXVjaCB0aW1lIGdldHRpbmcgaXQgdG8gd29yayBvbiB2YXJpb3VzIG1hY2hpbmVzLAorCWJ1dCBsb29rIGF0IHRoZSBicmlnaHQgc2lkZSwgYXQgbGVhc3QgeW91IHdvbid0IGhhdmUgdG8gZG8gaXQKKwlhZ2FpbiBpbiB0aGUgZnV0dXJlLgorCisJKiBwcmludGNtZC5jIChwcmludGZfY29tbWFuZCk6IE1ha2UgYSBjbGVhbnVwIGZvciB2YWxfYXJncyAoZml4ZXMKKwlhIG1lbW9yeSBsZWFrKS4KKworVHVlIE9jdCAxMiAyMjo1NDo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21pcHMveG0tbWlwcy5oOiBSZW1vdmUgY29tbWVudCBhYm91dCBIQVZFX1NHVFRZIHZzLiB1c2xlZXAuCisKK1R1ZSBPY3QgMTIgMTI6MDE6MjkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IG9ubHkgY29uZmlndXJlIGdkYnNlcnZlciBmb3IgbmF0aXZlIGVudmlyb25tZW50cworCitUdWUgT2N0IDEyIDA4OjU5OjE1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFic3JlYWQuYyAocmVhZF90eXBlKTogVHJlYXQgYSBuZWdhdGl2ZSB0eXBlIG51bWJlciBhdCB0aGUgc3RhcnQKKwlvZiBhIHR5cGUgYXMgYSB0eXBlIHJlZmVyZW5jZSwgbm90IGFzIGEgZGVmaW5pdGlvbiBvZiBhIHR5cGUgd2l0aAorCSI1MD0iIG9taXR0ZWQuICBUaGlzIG1ha2VzIHRoaW5ncyB3b3JrIG9uIHRoZSBSUy82MDAwIGFnYWluICh0aGUKKwkxNCBTZXAgMTk5MyBjaGFuZ2UgYnJva2UgaXQpLgorCisJKiBpbmZsb3cuYzogVXNlIDAgKHN0YW5kYXJkIGlucHV0KSBub3Qgc2NiLT5mZC4KKwkodGVybWluYWxfb3Vyc18xKTogSWYgcHJpbnRpbmcgd2FybmluZywgZG9uJ3QgY2xhaW0gaXQgaGFwcGVuZWQgaW4KKwl0ZXJtaW5hbF9pbmZlcmlvci4KKworCSogYmxvY2tmcmFtZS5jIChnZXRfcHJldl9mcmFtZV9pbmZvKTogRG9uJ3QgZXJyb3IoKSBpZiB0aGVyZSBhcmUgbm8KKwlmcmFtZXM7IGp1c3QgcmV0dXJuIE5VTEwuCisKKwkqIHhjb2Zmc29saWIuaCwgeGNvZmZleGVjLmM6IFVuZG8gdGhlIHBhcnQgb2YgRnJlZCdzIGJmZC0+YWJmZAorCWNoYW5nZSB3aGljaCBpbnZvbHZlZCBzdHJ1Y3R1cmUgZWxlbWVudHMuICBJdCB3YXMgdW5uZWNlc3NhcnkgYW5kCisJd2FzIG5vdCBjb25zaXN0ZW50bHkgZG9uZS4KKworCSogc3RhYnNyZWFkLmgsIHN0YWJzcmVhZC5jLCBkYnhyZWFkLmMgKGNvbW1vbl9ibG9jayosIGNvcHlfcGVuZGluZyk6CisJTW92ZSBjb21tb24gYmxvY2sgaGFuZGxpbmcgZnJvbSBkYnhyZWFkLmMgdG8gc3RhYnNyZWFkLmMuCisJVXNlIHRoZSBuYW1lIGZyb20gdGhlIEJDT01NIGluc3RlYWQgb2YgdGhlIEVDT01NLgorCUFsbG9jYXRlIHRoaW5ncyBvbiB0aGUgc3ltYm9sX29ic3RhY2suCisJKiB4Y29mZnJlYWQuYyAocHJvY2Vzc194Y29mZl9zeW1ib2wpOiBQcm9jZXNzIENfQkNPTU0sIENfRUNPTU0sCisJYW5kIENfRUNPTUwuICBPbiB1bnJlY29nbml6ZWQgc3RvcmFnZSBjbGFzc2VzLCBnbyBhaGVhZCBhbmQgY2FsbAorCWRlZmluZV9zeW1ib2wgKGFmdGVyIHRoZSBjb21wbGFpbnQpLgorCisJKiBkYnhyZWFkLmMgKHByb2Nlc3Nfb25lX3N5bWJvbCk6IERvbid0IHJlbG9jYXRlICdTJyBzeW1ib2xzIGJ5CisJdGhlIHRleHQgb2Zmc2V0LgorCitUdWUgT2N0IDEyIDEyOjMzOjA5IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogb3Nmc29saWIuYyAoc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiAgUmVzZXQgc3RvcF9zb29uX3F1aWV0bHkKKwlhZnRlciBzaGFyZWQgbGlicmFyeSBzeW1ib2wgcmVhZGluZyB0byBnZXQgcmlkIG9mIHdhcm5pbmcgZnJvbQorCWhldXJpc3RpY19wcm9jX3N0YXJ0LgorCitUdWUgT2N0IDEyIDEyOjAxOjI5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXNpbS5jOiBmaXggdW50ZXJtaW5hdGVkIGNoYXJhY3RlciBzdHJpbmcKKworVHVlIE9jdCAxMiAwODo1OToxNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnNyZWFkLmM6IEZpeCBjb21tZW50IGFib3V0IGdjYyAyLjMuMyBzdGFiIGZvciBsb25nIGxvbmcgaW50LgorCitNb24gT2N0IDExIDE0OjI3OjI1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBtMy1uYXQuYywgY29uZmlnL25tLW0zLmg6IEFkZCBhIHRhcmdldF9vcHMgc3RydWN0IGFuZCBvdGhlcgorCXZhcmlvdXMgdGhpbmdzIHRvIHRyeSB0byBnZXQgdGhpcyB0byB3b3JrLgorCisJKiBzeW10YWIuaDogRml4IGNvbW1lbnRzIHJlIGhlYWRlcnMsIHNoYXJpbmcgYmxvY2t2ZWN0b3JzLCBldGMuCisKK01vbiBPY3QgMTEgMTE6NDY6MDYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWcvaTk2MC92eHdvcmtzOTYwLm10IChSRU1PVEVfTyk6IGFkZCBkY2FjaGUubyBhbmQgcmVtb3RlLXV0aWxzLm8KKworTW9uIE9jdCAxMSAwMjo0ODo1NyAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6ICBEbyBub3QgYWRkIHVuZGVmaW5lZAorCXN5bWJvbHMgdG8gdGhlIHBhcnRpYWwgc3ltYm9sIHRhYmxlLgorCSogYWxwaGEtdGRlcC5jIChpbml0X2V4dHJhX2ZyYW1lX2luZm8pOiAgUmVtb3ZlIGtsdWRnZSBmb3IgZ2NjLAorCWdjYyBoYXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBuYXRpdmUgdG9vbHMuCisJKiBhbHBoYS10ZGVwLmMgKGFscGhhX3B1c2hfYXJndW1lbnRzKTogIFJlbmFtZSBOVU1fQVJHX1JFR1MgdG8KKwlBTFBIQV9OVU1fQVJHX1JFR1MgYW5kIG1vdmUgaXRzIGRlZmluaXRpb24gdG8gdG0tYWxwaGEuaC4KKwkqIGNvbmZpZy9hbHBoYS90bS1hbHBoYS5oIChGUkFNRV9BUkdTX0FERFJFU1MpOiAgQ2hhbmdlIGl0IHRvIHRoZQorCXdheSB0aGUgbmF0aXZlIHRvb2xzIGRlZmluZSBpdCwgdXBkYXRlIGNvbW1lbnQuCisKK0ZyaSBPY3QgIDggMTU6NTQ6MDYgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCisKKwkqIG9zZnNvbGliLmMsIHJlbW90ZS1zaW0uYywgcmVtb3RlLmMsIHNvbGliLmMsIHhjb2ZmZXhlYy5jLCAKKwl4Y29mZnNvbGliLmg6ICBVc2UgJ2FiZmQnIGZvciBiZmQgdmFyaWFibGVzIGluc3RlYWQgb2YgJ2JmZCcuCisJU3VuIGNjIGRvZXNuJ3QgbGlrZSB2YXJpYWJsZSBuYW1lcyB0aGF0IG1hdGNoIHRoZWlyIHR5cGVkZWYnZCB0eXBlLgorCitGcmkgT2N0ICA4IDE0OjU2OjIxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBpbmZsb3cuYzogUmVtb3ZlIHVudXNlZCBpbmNsdWRlcyBvZiBzeXMvcGFyYW0uaCBhbmQgc3lzL3R5cGVzLmguCisKKwkqIGluZmxvdy5jLCBzZXItdW5peC5jLCBzZXItZ28zMi5jLCBzZXItdGNwLmMsIHNlcmlhbC5oLAorCXRlcm1pbmFsLmgsIGZvcmstY2hpbGQuYywgbWFpbi5jLCB1dGlscy5jOiBNb3ZlIGFsbCB0aGUgcHJvY2VzcworCWdyb3VwIHN0dWZmIGJhY2sgdG8gaW5mbG93LmMgYW5kIHRlcm1pbmFsLmg7IHRoYXQncyBhIGJldHRlciBwbGFjZQorCWZvciBpdCBhbmQgZml4ZXMgcHJvYmxlbXMgd2l0aCB0cnlpbmcgdG8gZ2V0L3NldCB0aGUgcHJvY2VzcyBncm91cAorCW9mIGEgdHR5IHdlJ3JlIGRvaW5nIHJlbW90ZSBkZWJ1Z2dpbmcgb24uCisJKiB0ZXJtaW5hbC5oOiBTa2lwIHRoZSByZWRlZmluZXMgYW5kIGluY2x1ZGVzIGlmIEhBVkVfVEVSTUlPUy4KKworCSogZmluZHZhci5jLCB2YWx1ZS5oIChzeW1ib2xfcmVhZF9uZWVkc19mcmFtZSk6IE5ldyBmdW5jdGlvbi4KKwkqIGMtZXhwLnksIG0yLWV4cC55OiBDYWxsIGl0IGluc3RlYWQgb2YgaGF2aW5nIG91ciBvd24gc3dpdGNoIG9uCisJdGhlIHN5bWJvbCdzIGNsYXNzLgorCSogdmFsb3BzLmMgKHZhbHVlX29mX3ZhcmlhYmxlKTogVXNlIHN5bWJvbF9yZWFkX25lZWRzX2ZyYW1lIHRvCisJZGVjaWRlIHdoZXRoZXIgd2UgY2FyZSBhYm91dCBmaW5kaW5nIGEgZnJhbWUuCisKK0ZyaSBPY3QgIDggMDI6MzQ6MjEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBibG9ja2ZyYW1lLmMgKGdldF9mcmFtZV9ibG9jayk6ICBEbyBub3QgYWRqdXN0IHBjIGlmIHRoZSBmcmFtZQorCWZ1bmN0aW9uIHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbC4KKworVGh1IE9jdCAgNyAxOToyMDoxMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2g4MzAwL3RtLWg4MzAwLmg6IERvbid0IGRlZmluZSBzcl9nZXRfZGVidWcuCisJKiByZW1vdGUtc2ltLmM6IEluY2x1ZGUgcmVtb3RlLXV0aWxzLmguCisJKiB0YXJnZXQuaDogQWRkIGNvbW1lbnQgYWJvdXQgdGFyZ2V0X2hhc19leGVjdXRpb24uCisKK1RodSBPY3QgIDcgMTY6MTQ6MTkgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogaDgzMDAtdGRlcC5jIChzaW1fbG9hZCwgc2ltX2tpbGwsIHNpbV9vcGVuLCBzaW1fc2V0X2FyZ3MpOgorCU5ldyBmdW5jdGlvbnMuCisJKiBpbmZydW4uYyAobm9ybWFsX3N0b3ApOiBEb24ndCB0cnkgYW5kIHNldCB0aGUgcGMgaW4gdGhlIGN1cnJlbnQKKwlmcmFtZSBjb3JlZHVtcCBpZiB0aGVyZSBpc24ndCBvbmUuCisJKiByZW1vdGUtc2ltLmMgKGdkYnNpbV9zdG9yZV9yZWdpc3Rlcik6IERvbid0CisJU1dBUF9UQVJHRVRfQU5EX0hPU1QsIHNpbV9zdG9yZV9yZWdpc3RlciB0YWtlcyBieXRlcyBpbiByYXcgb3JkZXIuCisJKGdkYnNpbV93YWl0KTogU2V0IHN0YXR1cyB3aXRoIFdTRVRTVE9QLgorCSogY29uZmlnL2g4MzAwL3RtLWg4MzAwLmggKHNyX2dldF9kZWJ1Zyk6IERlZmluZQorCitUaHUgT2N0ICA3IDEyOjU2OjU3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJTmV3IE1hY2ggc3R1ZmY6CisJKiBjb25maWcvaTM4Ni9pMzg2bWFjaC5jOiBFeHBsYWluIHRoaXMgaXMgZm9yIHRoZSBvbGQgKHByb2JhYmx5CisJbm9uLWZ1bmN0aW9uYWwgYW5kL29yIG9ic29sZXRlKSBNYWNoIHN0dWZmLgorCSogbTMtbmF0LmMsIGNvbmZpZy9ubS1tMy5oLAorCWkzODZtMy1uYXQuYywgbWlwc20zLW5hdC5jLCBuczMya20zLW5hdC5jLAorCWNvbmZpZy9pMzg2L3tpMzg2bTMubWgsaTM4Nm0zLm10LHRtLWkzODZtMy5oLHhtLWkzODZtMy5ofSwKKwljb25maWcvaTM4Ni97aTM4Nm1rLm1oLGkzODZtay5tdCx0bS1pMzg2bWsuaCx4bS1pMzg2bWsuaH0sCisJY29uZmlnL21pcHMve21pcHNtMy5taCxtaXBzbTMubXQsdG0tbWlwc20zLmgseG0tbWlwc20zLmh9LAorCWNvbmZpZy9uczMyay97bnMzMmttMy5taCxuczMya20zLm10LHRtLW5zMzJrbTMuaCx4bS1uczMya20zLmh9OgorCU5ldyBmaWxlcy4KKworCSogYmxvY2tmcmFtZS5jIChmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24pOiBJZiB3ZSBjYWxsCisJUFNZTVRBQl9UT19TWU1UQUIsIGNhbGwgdGFyZ2V0X3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCBmaXJzdC4KKwlUaGlzIGlzIG5lZWRlZCBub3cgdGhhdCB3YWl0X2Zvcl9pbmZlcmlvciBwYXNzZXMgaW4gZW5kYWRkci4KKwkqIGluZnJ1bi5jOiBNb3ZlIGNhbGwgdG8gdGFyZ2V0X3Rlcm1pbmFsX2luZmVyaW9yIGZyb20gcHJvY2VlZAorCXRvIHJlc3VtZS4KKworVGh1IE9jdCAgNyAwOToyMjowNCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBibG9ja2ZyYW1lLmMgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbik6ICBGaXggaGFuZGxpbmcgZm9yIFBDcworCWJleW9uZCB0aGUgZW5kIG9mIHRoZSBsYXN0IGZ1bmN0aW9uIGluIGFuIG9iamZpbGUuCisJKiBjb2ZmLXNvbGliLmMgKGNvZmZfc29saWJfYWRkKTogIFVzZSBCRkQgdG8gZ2V0IGZpZWxkcyBmcm9tIC5saWIKKwlzZWN0aW9uLgorCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogIE1vZGlmeSB0ZXN0IGZvciBzdWJyb3V0aW5lIGVudHJ5CisJdG8gaW5jbHVkZSBwYyBvdXQgb2YgYm91bmRzIG9mIHRoZSBwcmV2aW91cyBmdW5jdGlvbi4KKwkqIHJlbW90ZS5jIChyZW1vdGVfd2FpdCk6ICBVc2Ugc3RydG91bCBmb3IgcGFyc2luZyAnTicgbWVzc2FnZS4KKwlBZGQgY29kZSB0byByZWxvY2F0ZSBzeW1maWxlX29iamZpbGUtPnNlY3Rpb25zLgorCitUaHUgT2N0ICA3IDA2OjIyOjQzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWcvc3BhcmMvc3VuNG9zNC5taDogQWRkIGNvbW1lbnQgc2F5aW5nIHdoeSB3ZSBkb24ndCB1c2UKKwktbHJlc29sdi4KKworVGh1IE9jdCAgNyAwOToyOToxMSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGJyZWFrcG9pbnQuYywgYnJlYWtwb2ludC5oIChicmVha3BvaW50X2luaXRfaW5mZXJpb3IpOiAgTmV3IGZ1bmN0aW9uCisJdGhhdCBjbGVhcnMgdGhlIGBpbnNlcnRlZCcgZmxhZyBmb3IgYWxsIGJyZWFrcG9pbnRzIGFuZCBkZWxldGVzCisJYW55IGJyZWFrcG9pbnRzIHdoaWNoIHNob3VsZCBnbyBhd2F5IGJldHdlZW4gcnVucyBvZiBwcm9ncmFtcy4KKwkqIGluZmxvdy5jIChnZW5lcmljX21vdXJuX2luZmVyaW9yKSwgaW5mcnVuLmMgKGluaXRfd2FpdF9mb3JfaW5mZXJpb3IpLAorCXJlbW90ZS1lcy5jIChlczE4MDBfbG9hZCksIGNvbW1lbnRzIGluIGV4ZWMuYyBhbmQgY29yZWxvdy5jOgorCVVzZSBpdCBpbnN0ZWFkIG9mIG1hcmtfYnJlYWtwb2ludHNfb3V0LgorCSogYnJlYWtwb2ludC5jIChtYXJrX2JyZWFrcG9pbnRzX291dCk6ICBVcGRhdGUgY29tbWVudCwgdG0tcnM2MDAwLmgKKwl1c2VzIGl0IGluIGEgY29tcGxldGVseSBkaWZmZXJlbnQgY29udGV4dC4KKwkqIGJyZWFrcG9pbnQuYyAoYnJlYWtwb2ludF9yZV9zZXRfb25lKTogIEFkZCBicF9jYWxsX2R1bW15IGNhc2UuCisKK1RodSBPY3QgIDcgMDk6Mjk6MTEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBNYWtlZmlsZS5pbiAoUkVHRVgsIFJFR0VYMSk6ICBBbHdheXMgdXNlIG91ciBvd24gdmVyc2lvbiBvZgorCXJlZ2V4LmMgdG8gYmUgY29uc2lzdGVudCBhY3Jvc3MgaG9zdHMuCisJKiBzb3VyY2UuYyAoX2luaXRpYWxpemVfc291cmNlKTogIEluaXRpYWxpemUgcmVnZXggdG8gdXNlIGdyZXAKKwlzdHlsZSBzeW50YXggYXMgYW4gYXBwcm94aW1hdGlvbiB0byBQT1NJWCBiYXNpYyByZWdleCBzeW50YXguCisKK1dlZCBPY3QgIDYgMTI6NDM6NDcgMTk5MyAgSmVmZnJleSBBIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKwkJCSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGhwcGEtdGRlcC5jIChmcmFtZV9jaGFpbik6IFJld29yayBzbyB0aGF0IGl0IGNvcnJlY3RseQorCWhhbmRsZXMgYm91bmRhcmllcyB3aGVyZSBjb2RlIHdpdGggYSBmcmFtZSBwb2ludGVyIGNhbGxzIGNvZGUKKwl3aXRob3V0IGEgZnJhbWUgcG9pbnRlci4KKwkoZGlnX2ZwX2Zyb21fc3RhY2spOiBOZXcgZnVuY3Rpb24uCisKK1dlZCBPY3QgIDYgMTI6NDM6NDcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGJyZWFrcG9pbnQuYyAoZGVsZXRlX2JyZWFrcG9pbnQpOiBEb24ndCBpbnNlcnQgYSBkaXNhYmxlZCBicmVha3BvaW50LgorCisJKiBSRUFETUU6IEFkZCBBbHBoYSBub3RlcyBmcm9tIFNjaGF1ZXIuCisKK1R1ZSBPY3QgIDUgMTU6MjY6MDQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsLCB1bmluc3RhbGwpOiBSZW1vdmUgJCRuLjEgc3R1ZmY7IEkgZG9uJ3QKKwl1bmRlcnN0YW5kIHdoYXQgaXQgaXMgdHJ5aW5nIHRvIGRvLCBidXQgSSBzdXNwZWN0IGl0J3Mgbm90IGRvaW5nCisJaXQuCisKKwkqIGNvbmZpZy9uczMyay9tZXJsaW4ubWg6IEFkZCBjb21tZW50IGFib3V0IE1fSU5TVEFMTC4KKwkqIGNvbmZpZy9tODhrL3tkZWx0YTg4Lm1oLGRlbHRhODh2NC5taH06IFJlbW92ZSBNX0lOU1RBTEwgYW5kCisJTV9VTklOU1RBTEw7IGl0IHRyaWVzIHRvIGluc3RhbGwgYSBub24tZXhpc3RlbnQgZmlsZSBnZGIuei4KKwkqIE1ha2VmaWxlLmluOiBSZW1vdmUgTV9JTlNUQUxMIHN0dWZmOyB0aGUgYWJvdmUgd2VyZSB0aGUgb25seSB1c2VzLgorCisJKiBzdGFic3JlYWQuYyAocmVhZF9yYW5nZV90eXBlKTogUmVtb3ZlIGNvbW1lbnQgd2hpY2ggcmVjb21tZW5kcworCWRpc3Rpbmd1aXNoaW5nIGZsb2F0IGZyb20gY29tcGxleCBieSB0aGUgbmFtZS4KKworVHVlIE9jdCAgNSAxMjoxNzo0MCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisJCQkgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCQkJICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJQ2hhbmdlcyB0byBzdXBwb3J0IGFscGhhIE9TRi8xIGluIG5hdGl2ZSBtb2RlLgorCSogYWxwaGEtbmF0LmMsIGFscGhhLXRkZXAuYywgY29uZmlnL2FscGhhL2FscGhhLW9zZjEubXQsCisJICBjb25maWcvYWxwaGEvbm0tYWxwaGEuaCwgY29uZmlnL2FscGhhL3RtLWFscGhhLmgsIG9zZnNvbGliLmM6CisJTmV3IGZpbGVzLgorCSogTWFrZWZpbGUuaW46ICBBZGQgbmV3IGZpbGVzIGFuZCBkZXBlbmRlbmNpZXMuCisJKiBjb25maWd1cmUuaW46ICBBZGQgYWxwaGEgdGFyZ2V0LgorCSogY29uZmlnL2FscGhhL2FscGhhLW9zZjEubWggKE5BVERFUEZJTEVTKTogIEFkZCBvc2Zzb2xpYi5vCisJKiBjb25maWcvYWxwaGEvYWxwaGEtb3NmMS5taCAoTUhfQ0ZMQUdTKTogIFJlbW92ZSwgd2UgY2FuIGhhbmRsZQorCXNoYXJlZCBsaWJyYXJpZXMgbm93LgorCSogY29uZmlnL2FscGhhL3htLWFscGhhLmg6ICBDbGVhbnVwLCBnZXQgTUFLRVZBXyogZGVmaW5lcyByaWdodC4KKworCSogZGVmcy5oIChDT1JFX0FERFIpOiAgTWFrZSBpdHMgdHlwZSBvdmVycmlkYWJsZSB2aWEgQ09SRV9BRERSX1RZUEUsCisJcHJvdmlkZSBgdW5zaWduZWQgaW50JyBkZWZhdWx0LgorCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50X2F1dG9fZGVsZXRlKTogIERlbGV0ZSBvbmx5IGlmIHdlIHJlYWxseQorCXN0b3BwZWQgZm9yIHRoZSBicmVha3BvaW50LgorCSogc3RhYnNyZWFkLmMsIHN0YWJzcmVhZC5oIChkZWZpbmVfc3ltYm9sKTogIENoYW5nZSB2YWx1IHBhcmFtZXRlcgorCXRvIGEgQ09SRV9BRERSLgorCSogc3RhYnNyZWFkLmMgKHJlYWRfcmFuZ2VfdHlwZSk6ICBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGxvd2VyCisJYm91bmQgb3ZlcmZsb3dzIGFuZCB0aGUgdXBwZXIgZG9lc24ndCBhbmQgdGhlIHJhbmdlIGlzIGxlZ2FsLgorCSogaW5mcnVuLmMgKHJlc3VtZSk6ICBEbyBub3Qgc3RlcCBhIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gaWYKKwlDQU5OT1RfU1RFUF9CUkVBS1BPSU5UIGlzIGRlZmluZWQuCisKKwkqIGluZmVyaW9yLmggKENBTExfRFVNTVlfTE9DQVRJT04pOiAgTmV3IHZhcmlhbnQgQVRfRU5UUllfUE9JTlQuCisJTm93IHRoYXQgd2UgaGF2ZSB0aGUgYnBfY2FsbF9kdW1teSBicmVha3BvaW50IHRoZSBjYWxsIGR1bW15IGNvZGUKKwlpcyBubyBsb25nZXIgbmVlZGVkLiBQVVNIX0RVTU1ZX0ZSQU1FLCBQVVNIX0FSR1VNRU5UUyBhbmQKKwlGSVhfQ0FMTF9EVU1NWSBjYW4gYmUgdXNlZCB0byBzZXQgdXAgZXZlcnl0aGluZyBmb3IgdGhlIGR1bW15LgorCVRoZSBicmVha3BvaW50IGZvciB0aGUgZHVtbXkgaXMgc2V0IGF0IHRoZSBlbnRyeSBwb2ludCBhbmQgdGhhdHMgaXQuCisJKiBibG9ja2ZyYW1lLmMgKGluc2lkZV9lbnRyeV9maWxlLCBpbnNpZGVfZW50cnlfZnVuYyk6ICBEbyBub3Qgc3RvcAorCWJhY2t0cmFjZXMgaWYgcGMgaXMgaW4gdGhlIGNhbGwgZHVtbXkgYXQgdGhlIGVudHJ5IHBvaW50LgorCSogaW5mY21kLmMgKHJ1bl9zdGFja19kdW1teSk6ICBIYW5kbGUgQVRfRU5UUllfUE9JTlQgY2FzZS4gVXNlCisJdGhlIGV4cGVjdGVkIGJyZWFrcG9pbnQgcGMgd2hlbiBzZXR0aW5nIHVwIHRoZSBmcmFtZSBmb3IKKwlzZXRfbW9tZW50YXJ5X2JyZWFrcG9pbnQuCisJKiBzeW1maWxlLmMgKGVudHJ5X3BvaW50X2FkZHJlc3MpOiAgTmV3IGZ1bmN0aW9uIGZvciBBVF9FTlRSWV9QT0lOVAorCXN1cHBvcnQuCisJKiB2YWxvcHMuYyAoY2FsbF9mdW5jdGlvbl9ieV9oYW5kKTogIEhhbmRsZSBBVF9FTlRSWV9QT0lOVCBjYXNlLgorCitUdWUgT2N0ICA1IDExOjM3OjAyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBocHBhKi0qLWhpdXgqIChjdXJyZW50bHkgc3lub255bSBmb3IgaHB1eCkuCisJQ2hhbmdlIG90aGVyIGhwcGEgaG9zdCBlbnRyaWVzIHRvIHVzZSAtKi0gbm90IC1ocC0uCisKK01vbiBPY3QgIDQgMTk6MTY6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBpMzg2LW5sbXN0dWIuYzogTmV3IGZpbGU7IGRlYnVnZ2luZyBzdHViIGZvciBpMzg2IE5ldFdhcmUuICBNdXN0CisJYmUgY29tcGlsZWQgd2l0aCBOZXRXYXJlIGhlYWRlciBmaWxlcyBhbmQgdHVybmVkIGludG8gYW4gTkxNIHdpdGgKKwlubG1jb252LgorCitNb24gT2N0ICA0IDExOjAyOjExIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBtaW5zeW1zLmMgKGxvb2t1cF9taW5pbWFsX3N5bWJvbF9ieV9wYyk6IERvbid0IHVzZSBtc3RfYWJzIHN5bWJvbHMuCisKKwkqIGRieHJlYWQuYyAocHJvY2Vzc19vbmVfc3ltYm9sKTogTWFrZSBuX29wdF9mb3VuZCBzdGF0aWMuCisKKwkqIFJlbmFtZSBpMzg2bHlueC10ZGVwLmMgdG8gaTM4Nmx5LXRkZXAuYyBmb3IgMTQgY2hhcmFjdGVyIGZpbGUgbmFtZXMuCisJKiBNYWtlZmlsZS5pbiwgY29uZmlnL2kzODYvaTM4Nmx5bngubXQ6IENoYW5nZSBhY2NvcmRpbmdseS4KKworCSogdmFsdWVzLmMgKHJlY29yZF9sYXRlc3RfdmFsdWUpOiBGZXRjaCBsYXp5IHZhbHVlcyBhbmQgc2V0IFZBTFVFX0xWQUwKKwl0byBub3RfbHZhbC4KKworU3VuIE9jdCAgMyAxNTo1NDo1MSAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCisKKwkqIG9iamZpbGVzLmggKG9iamZpbGUpOiBOZXcgc2xvdCBzeW1fc3RhYl9pbmZvLCB1c2UgYnkgbW9zdAorCXN0YWItcmVhZGluZyBmb3JtYXRzLgorCSogZ2RiLXN0YWJzLmggKERCWF9TWU1GSUxFX0lORk8pOiBBY2Nlc3Mgc3ltX3N0YWJfaW5mbyBpbnN0ZWFkIG9mCisJc3ltX3ByaXZhdGUuCisJKiBjb2ZmcmVhZC5jIChjb2ZmX3N5bWZpbGVfaW5pdCk6IEFsbG9jIHN0cnVjdCBmb3Igc3ltX3N0YWJfaW5mby4KKwkqIGRieHJlYWQuYywgZWxmcmVhZC5jLCBwYXJlYWQuYzogQ2hhbmdlIHN5bV9wcml2YXRlIHJlZmVyZW5jZXMgdG8KKwlzeW1fc3RhYl9pbmZvIHJlZmVyZW5jZXMuCisKK1NhdCBPY3QgIDIgMTk6Mjg6MzUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIG1pcHNyZWFkLmMsIG9iamZpbGVzLmMsIHV0aWxzLmM6IFVzZSBQVFIgbm90IHZvaWQgKi4gIFJJU0MvT1MKKwk0LjAyIGxhY2tzIHZvaWQgKi4KKwkqIGVsZnJlYWQuYzogVXNlIHZvaWQgKiBub3QgUFRSIGluc2lkZSBQQVJBTVMuCisKKwkqIGNvbmZpZy9taXBzL25ld3MtbWlwcy5taDogUmVtb3ZlIGNvcmVkZXAubzsgbWlwcy1uYXQubyBkb2VzIGl0LgorCSogY29uZmlnL21pcHMvbmV3cy1taXBzLm1oOiBEZWZpbmUgTkFUX0ZJTEUgbm90IE5NX0ZJTEUuCisJKiBjb25maWcvbWlwcy9ubS1uZXdzLW1pcHMuaDogSW5jbHVkZSBtaXBzL25tLW1pcHMuaCBub3Qgbm0tbWlwcy5oLgorCitTYXQgT2N0ICAyIDE2OjA1OjIyIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluLCBjb2ZmLXNvbGliLmMsIGNvZmYtc29saWIuaCwgaTM4Nmx5bngubXQsCisJdG0taTM4Nmx5bnguaDogIEFkZCBzdXBwb3J0IGZvciBTVlIzIENPRkYgc2hhcmVkIGxpYnJhcmllcy4KKworU2F0IE9jdCAgMiAxNTo1MDo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbTg4ay1uYXQuYyAoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogV2hlbiB3cml0aW5nIGFsbCByZWdpc3RlcnMsCisJZG9uJ3QgdHJ5IHRvIHdyaXRlIEVYSVBfUkVHTlVNIG9yIEVOSVBfUkVHTlVNIChub3QgbmVlZGVkIGZvciB0aGlzCisJY2FzZSwgYW5kIHRoZXkgY2F1c2UgdHJvdWJsZSkuCisKKwkqIFRPRE86IERvbid0IHN1Z2dlc3QgZG9pbmcgZmFzdCB3YXRjaHBvaW50cyBieSBzdGVwcGluZyBhIGxpbmUKKwlhdCBhIHRpbWUuICBUaGF0IHdvdWxkIGJlIHJlYWxseSBoYWlyeSBhbmQgc3RpbGwgbm90IGZhc3QgZW5vdWdoLgorCURvIHN1Z2dlc3QgZGVidWcgcmVnaXN0ZXJzIGFuZCBwYWdlIHRhYmxlIGRpZGRsaW5nLgorCitGcmkgT2N0ICAxIDE0OjU0OjQ2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBwcmludGNtZC5jIChkb19leGFtaW5lKTogTWFrZSBtZWFuaW5nIG9mICdoJywgJ3cnLCBhbmQgJ2cnIG5vdAorCWRlcGVuZCBvbiBidWlsdGluX3R5cGVfKi4gIEluc3RlYWQsIGl0IGlzIGFsd2F5cyAyLCA0LCBhbmQgOCBieXRlcworCWxpa2UgdGhlIGRvY3VtZW50YXRpb24gc2F5cy4KKwkqIHByaW50Y21kLmMgKGRlY29kZV9mb3JtYXQpIFtDQ19IQVNfTE9OR19MT05HXTogUmVtb3ZlICdsJyBhcworCXN5bm9ueW0gZm9yICdnJy4gIFRoaXMgd2FzIG5ldmVyIGRvY3VtZW50ZWQsIGl0IHNob3VsZG4ndCBkZXBlbmQgb24KKwlDQ19IQVNfTE9OR19MT05HLCBhbmQgSSBkb24ndCBzZWUgd2hhdCdzIHdyb25nIHdpdGggJ2cnLgorCitGcmkgT2N0ICAxIDEwOjA2OjM1IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogc3ltdGFiLmM6IGZpeCBhIGJ1ZyBpbiB0ZXN0c3VpdGUgKHZpcnRmdW5jLmV4cCkKKworVGh1IFNlcCAzMCAxMTozMDo1NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbTg4ay1uYXQuYyAoZmlsbF9ncmVnc2V0KTogRml4IHR5cG8gKFJfU0ZJUCAtPiBSX0ZJUCkuCisKKwkqIGMtdHlwZXByaW50LmMgKGNfdHlwZV9wcmludF9iYXNlLCBUWVBFX0ZOX0ZJRUxEX1NUVUIgY29kZSk6CisJSWYgZGVtYW5nbGVkIG5hbWUgbGFja3MgYSBjb2xvbiwgZG9uJ3QgZHVtcCBjb3JlLgorCisJKiBibG9ja2ZyYW1lLmMgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbik6IElmIHBzdC0+cmVhZGluIGlzCisJc2V0LCBkb24ndCB0cnkgdG8gZ2V0IHN5bWJvbHMgZnJvbSBwc3QuCisKKwkqIGluZmxvdy5jIChnZW5lcmljX21vdXJuX2luZmVyaW9yKTogQ2FsbCByZWluaXRfZnJhbWVfY2FjaGUKKwlpbnN0ZWFkCW9mIGRvaW5nIGl0IG91cnNlbGYuCisJKiBibG9ja2ZyYW1lLmMgKHJlaW5pdF9mcmFtZV9jYWNoZSk6IFVzZSBjb2RlIHdoaWNoIHdhcyBpbgorCWdlbmVyaWNfbW91cm5faW5mZXJpb3Igc28gd2UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIGV2ZW4gd2hlbgorCXdlIGhhdmUgc3dpdGNoZWQgdGFyZ2V0cy4KKwkqIGNvcmVsb3cuYyAoY29yZV9kZXRhY2gpOiBDYWxsIHJlaW5pdF9mcmFtZV9jYWNoZS4KKwkqIHRhcmdldC5jICh0YXJnZXRfZGV0YWNoKTogRG9uJ3QgY2FsbCBnZW5lcmljX21vdXJuX2luZmVyaW9yCisJKHJldmVydCB5ZXN0ZXJkYXkncyBjaGFuZ2UsIG5vdyBoYW5kbGVkIGJ5IGNvcmVfZGV0YWNoKS4KKwkqIG9iamZpbGVzLmMgKGZyZWVfb2JqZmlsZSk6IERldGFjaCBhbnkgY29yZSBmaWxlIGlmIHdlIGNhbGwKKwlTT0xJQl9DTEVBUi4gICNpbmNsdWRlIHRhcmdldC5oLgorCisJKiBmb3JrLWNoaWxkLmMgKGZvcmtfaW5mZXJpb3IpOiBEb24ndCBjYWxsIHRhcmdldF90ZXJtaW5hbF9pbml0CisJYW5kIHRhcmdldF90ZXJtaW5hbF9pbmZlcmlvciB1bnRpbCB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBpbmZlcmlvcgorCWhhcyBjYWxsZWQgZ2RiX3NldHBnaWQuICBUaGlzIGZpeGVzIFBSIDI5MDAgKFNjaGF1ZXIgdHJhY2tlZCBpdAorCWRvd24gYW5kIHdhcyBhYmxlIHRvIHJlbGlhYmx5IHJlcHJvZHVjZSBpdCBieSBwdXR0aW5nIGEgc2xlZXAoKQorCWJlZm9yZSB0aGUgZ2RiX3NldHBnaWQoKSkuCisKK1RodSBTZXAgMzAgMTI6MDA6NDkgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjLWV4cC55LCBtMi1leHAueTogIENoYW5nZSB0eXBlIG9mIGFkZHJlc3MgZm9yIG1zeW1ib2wgdG8KKwlidWlsdGluX3R5cGVfbG9uZy4KKwkqIGluZnB0cmFjZS5jIChmZXRjaF9yZWdpc3Rlciwgc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXIsCisJY2hpbGRfeGZlcl9tZW1vcnkpOiAgVXNlIFBUUkFDRV9YRkVSX1RZUEUgZm9yIHRoZSB0eXBlIG9mIHB0cmFjZQorCXRyYW5zZmVycy4gUHJvdmlkZSBhbiBgaW50JyBkZWZhdWx0IGZvciBQVFJBQ0VfWEZFUl9UWVBFLgorCitUaHUgU2VwIDMwIDExOjMwOjU2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBkZWZzLmggKFRBUkdFVF8qX0JJVCk6IERvbid0IHVzZSBob3N0IGluZm9ybWF0aW9uIChzaXplb2YpIGluCisJcGlja2luZyBkZWZhdWx0cy4KKworCSogY3AtdmFscHJpbnQuYyAoY3BfaXNfdnRibF9wdHJfdHlwZSk6IENvbnRpbnVlIHRvIGFjY2VwdCBvbGQgZm9ybS4KKworVGh1IFNlcCAzMCAxMToyNTo1NSAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY3lnbnVzLmNvbSkKKworCSogY3AtdmFscHJpbnQuYyAoY3BfaXNfdnRibF9wdHJfdHlwZSk6CisJY2hhbmdlIHZ0YWJsZSBmaWVsZCBuYW1lIHRvIF9fdnRibCAocHIyNjk1KS4KKworCSogc3ltdGFiLmMgKGdkYl9tYW5nbGVfbmFtZSk6IGZpeCBhIGJ1ZywgdG8gZ2V0IG1hbmdsZWQgbmFtZSByaWdodC4KKworV2VkIFNlcCAyOSAxODozNDoyMiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIEFkZCBkZXBzIGZvciBpMzg2bHlueC1uYXQubyBhbmQgaTM4Nmx5bngtdGRlcC5vIHRvCisJa2VlcCBub24tZ251IG1ha2VzIGhhcHB5LgorCitXZWQgU2VwIDI5IDE3OjIwOjU0IDE5OTMgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBocHJlYWQuYyAocmVhZF9ocHV4X3N5bXRhYik6IFdoZW4gYSBLX0VORCBpcyBmb3VuZCBmb3IgYQorCUtfTU9EVUxFLCBjbGVhciB0aGUgaGF2ZV9tb2R1bGUgYW5kIGhhdmVfbmFtZSBmbGFncy4KKworV2VkIFNlcCAyOSAxMDo1MjoxOSAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY3lnbnVzLmNvbSkKKworCSogYy12YWxwcmludC5jOiB0byBmaXggdmlydHVhbCB0YWJsZSBwcmludCBidWcgKHByMjY5NSkuCisKK1dlZCBTZXAgMjkgMTA6NTI6MTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHRhcmdldC5jICh0YXJnZXRfZGV0YWNoKTogQ2FsbCBnZW5lcmljX21vdXJuX2luZmVyaW9yLgorCSogaW5mbG93LmMgKGdlbmVyaWNfbW91cm5faW5mZXJpb3IpOiBDYWxsIGZsdXNoX2NhY2hlZF9mcmFtZXMuCisKK1R1ZSBTZXAgMjggMjM6MDg6NTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGRieHJlYWQuYywgY29mZnJlYWQuYywgZWxmcmVhZC5jOiBBIGZldyBjaGFuZ2VzIHRvIGNvbW1lbnRzLgorCitUdWUgU2VwIDI4IDE4OjM5OjM3IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBSZW5hbWUgLi4uLWx5bngqIHRvIC4uLi1seW54b3MqLgorCUFkZCBtNjgqLSotbHlueG9zKiBjb25maWd1cmF0aW9uLgorCSogZGJ4cmVhZC5jIChjb2Zmc3RhYl9idWlsZF9wc3ltdGFicyk6IE5ldyBmdW5jdGlvbiwKKwlpbnRlcmZhY2VzIGNvZmZyZWFkLmMgdG8gZGJ4cmVhZCBmdW5jdGlvbnMuCisJKiBjb2ZmcmVhZC5jIChjb2ZmX3N5bWZpbGVfaW5mbyk6ICBFeHBhbmQgdG8gaW5jbHVkZQorCWRieF9zeW1maWxlX2luZm8gc2xvdHMuCisJKGNvZmZfc3ltZmlsZV9pbml0KTogSW5pdCBjb2ZmX3N5bWZpbGVfaW5mbyBzdHJ1Y3QuCisJKGNvZmZfbG9jYXRlX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9ucywgZmluZHMgdGhlIHN0YWIgYW5kIHN0YWJzdHIKKwlzZWN0aW9ucy4KKwkoY29mZl9zeW1maWxlX3JlYWQpOiBDYWxsIGNvZmZzdGFiX2J1aWxkX3BzeW10YWJzIGlmIGEgc3RhYgorCXNlY3Rpb24gaXMgcHJlc2VudC4KKwkoY29mZl9zZWN0aW9uX29mZnNldHMpOiBSZXBsYWNlIGZha2UgdmVyc2lvbiB3aXRoIHJlYWwgb2Zmc2V0cy4KKworVHVlIFNlcCAyOCAxODowMDo1MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaW5mY21kLmMgKHJ1bl9zdGFja19kdW1teSk6IFNldCB0aGUgZnJhbWUgaW4gdGhlIGJwX2NhbGxfZHVtbXkKKwlicmVha3BvaW50LgorCitUdWUgU2VwIDI4IDE3OjUzOjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL25tLXN5c3Y0Lmg6IEluY2x1ZGUgc29saWIuaC4gIERlZmluZSBTVlI0X1NIQVJFRF9MSUJTLgorCSogY29uZmlnL3RtLXN5c3Y0Lmg6IERvbid0IGluY2x1ZGUgc29saWIuaC4KKwkqIGNvbmZpZy94bS1zeXN2NC5oOiBEb24ndCBkZWZpbmUgU1ZSNF9TSEFSRURfTElCUy4KKwkqIGNvbmZpZy9pMzg2L2kzODZ2NC5tdCAoVERFUEZJTEVTKTogTW92ZSBzb2xpYi5vIGZyb20gaGVyZS4uLgorCSogY29uZmlnL2kzODYvaTM4NnY0Lm1oIChOQVRERVBGSUxFUyk6IC4uLnRvIGhlcmUuCisJKiBjb25maWcvaTM4Ni9ubS1pMzg2djQuaDogSW5jbHVkZSBubS1zeXN2NC5oLgorCSogY29uZmlnL202OGsvYW1peC5tdCAoVERFUEZJTEVTKTogTW92ZSBzb2xpYi5vIGZyb20gaGVyZS4uLgorCSogY29uZmlnL202OGsvYW1peC5taCAoTkFUREVQRklMRVMpOiAuLi50byBoZXJlLgorCitUdWUgU2VwIDI4IDA5OjQ1OjM4IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogc3ltbWlzYy5jIChwcmludF9zeW1ib2wpOiBVc2UgJTAyeCBub3QgJTJ4IGZvciBMT0NfQ09OU1RfQllURVMuCisKKwlDbGVhbiB1cCBwcm9ibGVtcyB3aXRoIHRhcmdldHMgYW5kIGhvc3RzIHRoYXQgaGF2ZSA2NCBiaXQgbG9uZ3MKKwlhbmQgcG9pbnRlcnMgYW5kIDMyIGJpdCBpbnRzLgorCSogYnJlYWtwb2ludC5jLCBidWlsZHN5bS5jLCBjLWxhbmcuYywgYy12YWxwcmludC5jLCBjaC1sYW5nLmMsCisJY2gtdmFscHJpbnQuYywgY29yZS5jLCBjcC12YWxwcmludC5jLCBkYnhyZWFkLmMsIGV4ZWMuYywKKwlleHBwcmludC5jLCBnZGJ0eXBlcy5jLCBpbmZjbWQuYywgbGFuZ3VhZ2UuYywgbGFuZ3VhZ2UuaCwKKwltMi1sYW5nLmMsIG1haW50LmMsIG1pcHMtdGRlcC5jLCBtaXBzcmVhZC5jLCBwYXJ0aWFsLXN0YWIuaCwKKwlwcmludGNtZC5jLCByZW1vdGUtdnguYywgc29saWIuYywgc291cmNlLmMsIHN0YWNrLmMsIHN5bWZpbGUuYywKKwlzeW1taXNjLmMsIHN5bXRhYi5jLCB2YWxvcHMuYywgdmFscHJpbnQuYywgeGNvZmZleGVjLmM6CisJQ2hhbmdlIGFsbCBwcmludGYgZm9ybWF0cyBmcm9tICV4IHRvICVseCBpZiBvdXRwdXR0aW5nIGFuIGFkZHJlc3MuCisJQ2hhbmdlIGxhXypfZm9ybWF0IHRvIHVzZSBsb25nIGZvcm1hdC4KKwlsb2NhbF9oZXhfc3RyaW5nLCBsb2NhbF9oZXhfc3RyaW5nX2N1c3RvbSBub3cgdGFrZSBhbiB1bnNpZ25lZCBsb25nCisJYXJndW1lbnQsIGNoYW5nZSBhbGwgY2FsbGVycy4KKwkqIGNvZmZyZWFkLmMgKHJlYWRfY29mZl9zeW10YWIpOiAgUmVtb3ZlIHN1cGVyZmx1b3VzIGNhc3QgZm9yCisJY29tcGxhaW50IG91dHB1dC4KKwkqIGRieHJlYWQuYyAoZW5kX3BzeW10YWIpOiAgQ2FzdCBNU1lNQk9MX0lORk8gdG8gbG9uZywgbm90IGludC4KKwkqIGZpbmR2YXIuYywgdmFsdWUuaCAod3JpdGVfcmVnaXN0ZXIpOiAgQ2hhbmdlIHZhbCB0byBMT05HRVNULgorCSogZ2RidHlwZXMuaCAoc3RydWN0IHR5cGUpOiAgQ2hhbmdlIGBiaXRzaXplJyB0byBsb25nIGFzCisJVFlQRV9GSUVMRF9TVEFUSUNfUEhZU05BTUUgdXNlcyB0aGlzIGZpZWxkIGFzIGEgcG9pbnRlci4KKwkqIGluZmVyaW9yLmggKHN0cnVjdCBpbmZlcmlvcl9zdGF0dXMpOiAgQ2hhbmdlIHR5cGUgb2Ygc3RvcF9wYyB0bworCUNPUkVfQUREUi4KKwkqIGxhbmd1YWdlLmggKGxvY2FsX29jdGFsX3N0cmluZywgbG9jYWxfb2N0YWxfc3RyaW5nX2N1c3RvbSk6CisJUmVtb3ZlIHByb3RvdHlwZSwgdGhlIGZ1bmN0aW9ucyBhcmUgbmVpdGhlciBkZWZpbmVkIG5vciB1c2VkLgorCSogbWlwc3JlYWQuYyAocGFyc2Vfc3ltYm9sKTogIFVzZSB0ZW1wb3JhcnkgdmFyaWFibGUgZm9yIGJpdHNpemUgYXMKKwlmLT5iaXRzaXplIGlzIGEgbG9uZyBub3cuCisJKiBvYmpmaWxlcy5jIChhZGRfdG9fb2JqZmlsZV9zZWN0aW9ucywgYnVpbGRfb2JqZmlsZV9zZWN0aW9uX3RhYmxlKToKKwlVc2UgdW5zaWduZWQgbG9uZyBjYXN0cyBpbnN0ZWFkIG9mIGludCBmb3IgYWJ1c2luZyBzZWN0aW9uc19lbmQKKwlwb2ludGVyIGFzIGludGVnZXIuCisJKiBzdGFjay5jIChwYXJzZV9mcmFtZV9zcGVjaWZpY2F0aW9uKTogIENoYW5nZSB0eXBlIG9mIGBhcmdzJyB0bworCUNPUkVfQUREUiBmb3IgU0VUVVBfQVJCSVRSQVJZX0ZSQU1FLgorCisJKiBwcmludGNtZC5jIChtYWtlX3Zhc2l6ZSk6ICBBbGxvdyByZWRlZmluaXRpb24gdmlhIE1BS0VWQV9TSVpFLgorCSogbWlwc3JlYWQuYyAocGFyc2VfdHlwZSk6ICBBbHBoYSBjYyBub3cgc3VwcG9ydHMgdGhlIHQtPmNvbnRpbnVlZAorCWJpdCwgdXBkYXRlIGFsZ29yaXRobSB0byBtYXRjaCB0aGUgd2F5IHRoZSBjb21waWxlciB1c2VzIGl0LgorCitUdWUgU2VwIDI4IDEyOjA1OjExIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiB1dGlscy5jIChmcHJpbnRmaV9maWx0ZXJlZCk6IEZpeCBjb21tZW50cy4KKworTW9uIFNlcCAyNyAxODoxMDowOCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBjb2ZmcmVhZC5jIChyZWFkX2NvZmZfc3ltdGFiKTogIERvbid0IGNhbGwgZ2V0ZmlsZW5hbWUgaWYgdGhlcmUKKwlhcmUgbm8gYXV4ZW50cy4KKworTW9uIFNlcCAyNyAxMDoyMjozNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3ltdGFiLmMgKGZpbmRfcGNfbGluZSk6IEZpeCBjb21tZW50cy4KKworCSogcmVtb3RlLXVkaS5jICh1ZGlfbW91cm4pOiBEb24ndCBwb3AgdGFyZ2V0LgorCitGcmkgU2VwIDI0IDE3OjI1OjQxIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGNvcmVsb3cuYzogIEFkZCBtdWx0aSB0aHJlYWQvcHJvY2VzcyBzdXBwb3J0IGZvciBjb3JlIGZpbGVzIHdpdGgKKwkucmVnL1hYWCBwc2V1ZG8tc2VjdGlvbnMuCisJKiBpMzg2bHlueC1uYXQuYyB0aHJlYWQuaCB0aHJlYWQuYzogIFJlbW92ZSB1bm5lY2Vzc2FyeSBjb3JlIGZpbGUKKwlzdXBwb3J0LgorCitUaHUgU2VwIDIzIDEwOjQ5OjM3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiByZW1vdGUtdWRpLmMgKGRvd25sb2FkKTogU2tpcCB6ZXJvIGxlbmd0aCBzZWN0aW9ucy4KKworCSogdmFsb3BzLmMgKHNlYXJjaF9zdHJ1Y3RfbWV0aG9kLCB2YWx1ZV9zdHJ1Y3RfZWx0KToKKwlVc2UgKHZhbHVlKS0xLCBub3QgLTEsIGZvciBlcnJvci4KKworCSogaW5mY21kLmMgKHN0ZXBfMSksIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IEFkZCBjb21tZW50cworCWFib3V0IFNISUZUX0lOU1RfUkVHUy4KKworCSogZXhlYy5jIChleGVjX2ZpbGVfY29tbWFuZCk6IFNldCB0ZXh0X2VuZCBiYXNlZCBvbiBhbGwgY29kZSByZWFkb25seQorCXNlY3Rpb25zLCBub3QganVzdCAiLnRleHQiLgorCisJKiBkZWZzLmgsIGluZmNtZC5jLCBjb25maWcvejhrL3RtLXo4ay5oLCBjb25maWcvbTg4ay90bS1tODhrLmgsCisJY29uZmlnL3NoL3RtLXNoLmgsIGNvbmZpZy9oODMwMC90bS1oODMwMC5oLCBjb25maWcvaDg1MDAvdG0taDg1MDAuaCwKKwl6OGstdGRlcC5jOiBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gQUREUl9CSVRTX1NFVC4KKwkqIGNvbmZpZy9tODhrL3RtLW04OGsuaDogRGVmaW5lIFRBUkdFVF9XUklURV9QQy4KKworCSogY29uZmlnL204OGsvdG0tbTg4ay5oLCBtODhrLXRkZXAuYzogQWRkIGNhbGwgZnVuY3Rpb24gc3R1ZmYuCisKK1RodSBTZXAgMjMgMDA6MTM6MDYgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb25maWcvbWlwcy90bS1taXBzLmggKFNUT1JFX1NUUlVDVF9SRVRVUk4pOiAgRGVmaW5lIGFzIG5vb3AgYXMKKwl0aGUgcHVzaGluZyBvZiB0aGUgc3RydWN0IHJldHVybiBhZGRyZXNzIGlzIGFscmVhZHkgaGFuZGxlZCBpbgorCW1pcHNfcHVzaF9hcmd1bWVudHMuCisJKiBtaXBzLXRkZXAuYyAocmVpbml0X2ZyYW1lX2NhY2hlX3NmdW5jKTogIEZpeCB0eXBvIGluIHByb3RvdHlwZQorCWRlY2xhcmF0aW9uLgorCSogbWlwc3JlYWQuYyAocGFyc2Vfc3ltYm9sLCBwYXJzZV90eXBlLCB1cGdyYWRlX3R5cGUpOiAgQWRkIG1vcmUKKwlzYW5pdHkgY2hlY2tzIGZvciBjb3JydXB0IHN5bWJvbCBlbnRyaWVzIHRvIGF2b2lkIGNvcmUgZHVtcHMKKwlyZXBvcnRlZCBieSBiZW5zb25Ab2RpLmNvbS4gT2J2aW91c2x5IFVsdHJpeCA0LjNBIGNjIG5vdyBoYXMKKwl0aGUgc2FtZSBwcm9ibGVtcyBhcyB0aGUgT1NGLzEgYWxwaGEgY2MuCisJKiBtaXBzcmVhZC5jIChwYXJzZV9saW5lcyk6ICBJdGVyYXRlIG92ZXIgdGhlIHJhbmdlIG9mIHRoZSBjb21wcmVzc2VkCisJbGluZSBudW1iZXIgZW50cmllcywgdGhlIG9sZCBpdGVyYXRpb24gc29tZXRpbWVzIGZhaWxlZCB0byBzdG9wCisJYW5kIHdyb3RlIHBhc3QgdGhlIGVuZCBvZiB0aGUgTElORVRBQkxFLiBBZGQgc2FuaXR5IGNoZWNrIHRvIGF2b2lkCisJdGhlIHNhbWUgcHJvYmxlbSBpbiBjYXNlIHRoZSBsaW5lIG51bWJlciBpbmZvIGlzIGNvcnJ1cHQuCisJKiBtaXBzcmVhZC5jIChwYXJzZV9wcm9jZWR1cmUpOiAgQWRqdXN0IHBkciBmb3IgYWxwaGEgX19zaWd0cmFtcC4KKwkqIG1pcHNyZWFkLmMgKHBhcnNlX2V4dGVybmFsLCBwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiAgSWdub3JlIHN0TmlsCisJc3ltYm9scyB0aGF0IGFyZSBwcm9kdWNlZCBmb3Igc3RhdGljcyBpbiAubyBmaWxlcyBhbmQgc3RMb2NhbCBzeW1ib2xzCisJdGhhdCBhcmUgcHJvZHVjZWQgZm9yIGV2ZXJ5IHNlY3Rpb24gaW4gT1NGLzEgZHluYW1pY2FsbHkgbGlua2VkCisJIGV4ZWN1dGFibGVzLgorCSogbWlwc3JlYWQuYyAocHN5bXRhYl90b19zeW10YWJfMSk6ICBQdXQgb3V0IGB1bmRlZmluZWQgc3ltYm9scycKKwl3YXJuaW5nIG9ubHkgdW5kZXIgYHZlcmJvc2Ugb24nIGFzIHRoZXJlIGFyZSBtYW55IHVuZGVmaW5lZCBzeW1ib2xzCisJaW4gYSBkeW5hbWljYWxseSBsaW5rZWQgZXhlY3V0YWJsZS4KKworV2VkIFNlcCAyMiAxMDoyODowNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2k5NjAvbmluZHk5NjAubXQ6IERvbid0IGRlZmluZSBSRU1PVEVfTzsgUkVNT1RFX08gd2FzCisJaW50ZW5kZWQgb25seSBmb3IgVnhXb3Jrcy4gIFJlbW92ZSBkY2FjaGUubyBmcm9tIFRERVBGSUxFUyBub3cKKwl0aGF0IHdlIHBpY2sgaXQgdXAgZnJvbSB0aGUgZGVmYXVsdCBSRU1PVEVfTy4KKworCSogYnJlYWtwb2ludC5jIChicHN0YXRfd2hhdCk6IEluaXRpYWxpemUgcmV0dmFsLmNhbGxfZHVtbXkgYW5kCisJcmV0dmFsLnN0ZXBfcmVzdW1lLgorCisJKiBtaXBzLXRkZXAuYyAobWlwc19mcmFtZV9jaGFpbik6IElmIGZyYW1lIHNpemUgemVybywgcmV0dXJuIHplcm8uCisJKiByczYwMDAtdGRlcC5jOiBBZGQgY29tbWVudCBhYm91dCBmcmFtZWxlc3NuZXNzLgorCisJKiByZW1vdGUtbmluZHkuYzogRGVjbGFyZSBuaW5NZW1HZXQgYW5kIG5pbk1lbVB1dC4KKworV2VkIFNlcCAyMiAwODowMjo1NyAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIEFkZCBpMzg2bHlueC10ZGVwIHRvIHRoZSByaWdodCBwbGFjZXMuCisJKFRBUkRJUlMpOiAgQWRkIGdkYnNlcnZlci4KKworCSogZXhlYy5jIChwcmludF9zZWN0aW9uX2luZm8pOiAgUHJpbnQgZW50cnkgcG9pbnQuCisJKiBpMzg2bHlueC1uYXQuYyAoaTM4Nmx5bnhfc2F2ZWRfcGNfYWZ0ZXJfY2FsbCk6ICBNb3ZlIGludG8KKwlpMzg2bHlueC10ZGVwLmMuICBBZGQgY29yZSBmaWxlIHN1cHBvcnQuCisJKiBpMzg2bHlueC10ZGVwLmM6ICBOZXcgbW9kdWxlIGZvciBMeW54LzM4NiB0YXJnZXQgZGVwZW5kYW50IGNvZGUuCisJKiBtYWludC5jOiAgQWRkIGBtYWludCBpbmZvIHNlY3Rpb25zJyBjb21tYW5kIHRvIHByaW50IGluZm8gYWJvdXQgYWxsCisJc2VjdGlvbnMgdGhhdCBCRkQga25vd3MgYWJvdXQgZm9yIGV4ZWMgYW5kIGNvcmUgZmlsZXMuCisJKiBzcGFyYy10ZGVwLmMgKHNwYXJjX3B1c2hfZHVtbXlfZnJhbWUpOiAgVXBkYXRlIHN0YWNrIHBvaW50ZXIKKwliZWZvcmUgcHV0dGluZyBmcmFtZSBvbiB0aGUgc3RhY2suICBDb25zb2xpZGF0ZSB3cml0ZXMgdG8gcmVkdWNlCisJdHJhZmZpYyBmb3IgcmVtb3RlIGRlYnVnZ2luZy4KKwkqIGNvbmZpZy9pMzg2L2kzODZseW54Lm1oIChOQVRERVBGSUxFUyk6ICBSZW1vdmUgZXhlYy5vLgorCSogY29uZmlnL2kzODYvaTM4Nmx5bngubXQgKFRERVBGSUxFUyk6ICBBZGQgZXhlYy5vLCBpMzg2bHlueC10ZGVwLm8uCisJKiBjb25maWcvaTM4Ni9ubS1pMzg2bHlueC5oOiAgQWRkIHRhcmdldF9waWRfdG9fc3RyKCkuCisJKiBjb25maWcvaTM4Ni90bS1pMzg2bHlueC5oOiAgUmVtb3ZlIHRhcmdldF9waWRfdG9fc3RyKCkuCisJKiBzcGFyY2xpdGUvTWFrZWZpbGUuaW46ICBBZGQgZGVwcyB0byBrZWVwIFN1biBtYWtlIGhhcHB5LgorCitUdWUgU2VwIDIxIDE3OjQ4OjE0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBicmVha3BvaW50LmgsIGJyZWFrcG9pbnQuYyAoYnBzdGF0X3N0b3Bfc3RhdHVzKTogQWRkIG5ldyBhcmd1bWVudAorCW5vdF9hX2JyZWFrcG9pbnQuCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBQYXNzIGl0LiAgQWxzbyBjb25zb2xpZGF0ZSB0aGUKKwl0ZXN0IG9mIHdoZXRoZXIgd2UgYXJlIHN0ZXBwaW5nIGludG8gYSBDVVJSRU5UTFlfU1RFUFBJTkcgbWFjcm8uCisKK1R1ZSBTZXAgMjEgMTc6MjI6MzQgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJKiBicmVha3BvaW50LmMgKGJwc3RhdF9zdG9wX3N0YXR1cyksCisJICBpbmZjbWQuYyAoc3RlcF8xKSwKKwkgIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IGNvbGxhcHNlIFNISUZUX0lOU1RfUkVHUyBpZmRlZgorCSAgYW5kIGluc2VydCBtYWNyby4KKworCSogbTg4ay10ZGVwLmM6IGluY2x1ZGUgaWVlZS1mbG9hdC5oLiAgbmV3IGdsb2JhbCB0YXJnZXRfaXNfbTg4MTEwLgorCSAgbmV3IGNvbnN0IHN0cnVjdCBleHRfZm9ybWF0X204ODExMCBmb3IgZmxvYXQgZm9ybWF0LgorCSAgKHBpY19wcm9sb2d1ZV9jb2RlKTogYWRkIGJyYWNlcy4KKwkgIChuZXh0X2luc24pOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlIGJ1Zi4KKwkgIChmcmFtZV9maW5kX3NhdmVkX3JlZ3MpOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlcyBuZXh0X2FkZHIsCisJICBzYXZlZF9yZWdzLCByZWdudW0uCisJICAoZnJhbWVfbG9jYWxzX2FkZHJlc3MpOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlcyBmcmFtZSwgYXAuCisJICAoZnJhbWVfYXJnc19hZGRyZXNzKTogcmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgZnJhbWUsIGFwLgorCSAgKHB1c2hfcGFyYW1ldGVycyk6IGFkZCBzb21lIGJyZWFrcyBhbmQgYSBkZWZhdWx0IGNhc2UuCisKKwkqIHJlbW90ZS1idWcuYzogcmVtb3ZlIHJlZHVuZGFudCBpbmNsdWRlcyBvZiB2YWx1ZS5oLCB0YXJnZXQuaCwKKwkgIHNlcmlhbC5oLgorCSAgKGJ1Z19vcGVuKTogY29ycmVjdGVkIHR5cG8sIHNyX211bHRpX3NjYW4gLT4gZ3JfbXVsdGlfc2Nhbi4KKwkgIChidWdfZmV0Y2hfcmVnaXN0ZXIpOiBzcGVjaWFsIGNhc2Ugc2ZpcCByZWdpc3RlciBmb3IgbTg4MTEwLgorCSAgcmVtb3ZlIGZsYWcgYml0IG1hc2tpbmcgb2YgcGMgcmVnaXN0ZXJzLiAgVGhpcyBzaG91bGQgYmUgaGFuZGxlZAorCSAgYnkgdGhlIEFERFJfQklUU18qIG1hY3Jvcy4KKwkgIChidWdfc3RvcmVfcmVnaXN0ZXIpOiBzcGVjaWFsIGNhc2Ugc2ZpcCByZWdpc3RlciBmb3IgbTg4MTEwLgorCSAgQ29ycmVjdGVkIHNwcmludCBmb3JtYXQgZm9yIGV4dGVuZGVkIHJlZ2lzdGVycy4KKworCSogY29uZmlnL204OGsvdG0tbTg4ay5oOiB3aGl0ZSBzcGFjZSBhbmQgY29tbWVudCBjaGFuZ2VzLiAgaW5jbHVkZQorCSAgaWVlZS1mbG9hdC5oLiBleHBhbmRlZCB0byBjb3BlIHdpdGggbTg4MTEwIGV4dGVuZGVkIHJlZ2lzdGVycy4KKwkgIChSMF9SRUdOVU0sIFhGUF9SRUdOVU0sIFgwX1JFR05VTSk6IG5ldyBtYWNyb3MuCisJICAoU0hJRlRfSU5TVF9SRUdTKTogYmVjb21lcyBhIHJlYWwgbWFjcm8uCisKK1R1ZSBTZXAgMjEgMTc6NDg6MTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGJyZWFrcG9pbnQuYyAoYnJlYWtwb2ludF8xKTogU3VwcG9ydCBicF9jYWxsX2R1bW15LgorCitUdWUgU2VwIDIxIDE3OjA2OjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogZWxmcmVhZC5jIChyZWNvcmRfbWluaW1hbF9zeW1ib2xfYW5kX2luZm8pOiBHdWVzcyB0aGUgc2VjdGlvbiB0bworCXVzZSBmcm9tIHRoZSB0eXBlLgorCSogb2JqZmlsZXMuYzogSW5jbHVkZSBnZGItc3RhYnMuaCBmb3IgU0VDVF8qIG1hY3Jvcy4KKwkob2JqZmlsZV9yZWxvY2F0ZSk6IFJlbG9jYXRlIHRleHRsb3cgYW5kIHRleHRoaWdoIGluIHBzeW10YWJzLgorCVJlbG9jYXRlIHBhcnRpYWwgc3ltYm9scy4gIENoZWNrIHRoYXQgbWluaW1hbCBTWU1CT0xfU0VDVElPTiBpcworCW5vbm5lZ2F0aXZlIGJlZm9yZSB1c2luZyBpdC4KKwkqIHN5bXRhYi5oOiBBZGp1c3Qgc2VjdGlvbiBmaWVsZCBjb21tZW50LgorCisJKiByZW1vdGUuYyAoaW50ZXJydXB0X3F1ZXJ5KTogTmV3IGZ1bmN0aW9uLgorCShyZW1vdGVfaW50ZXJydXB0X3R3aWNlKTogQ2FsbCBpbnRlcnJ1cHRfcXVlcnkuCisJKHB1dHBrdCwgZ2V0cGt0KTogSWYgcXVpdF9mbGFnIGlzIHNldCwgY2FsbCBpbnRlcnJ1cHRfcXVlcnkuCisJKHJlbW90ZV93YWl0KTogRG9uJ3QgYm90aGVyIHdpdGggb2JqZmlsZV9yZWxvY2F0ZSBpZiB0aGUgYWRkcmVzc2VzCisJaGF2ZW4ndCBjaGFuZ2VkLgorCShyZW1vdGVfZmV0Y2hfcmVnaXN0ZXJzKTogSWYgd2Ugc2VlIGEgcGFja2V0IHRoYXQgZG9lc24ndCBzdGFydAorCXdpdGggYSBoZXggY2hhcmFjdGVyLCBmZXRjaCBhIG5ldyBvbmUuCisKK1R1ZSBTZXAgMjEgMTE6NDQ6MDAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS5jLCByZW1vdGUtdXRpbHMuYzogVXNlIFNFUklBTF9GTFVTSF9JTlBVVCBhZnRlciBvcGVuaW5nIGl0LgorCisJKiBwcmludGNtZC5jIChwcmludF9zY2FsYXJfZm9ybWF0dGVkKTogV2hlbiB0cnVuY2F0aW5nIHZhbHVlIHdlIGFyZQorCWdvaW5nIHRvIHByaW50IGFzIHVuc2lnbmVkLCBoYW5kbGUgaXQgZ2VuZXJhbGx5IGZvciBhbnkgbGVuZ3RoCisJbGVzcyB0aGFuIHNpemVvZiAoTE9OR0VTVCksIHJhdGhlciB0aGFuIHNwZWNpYWwtY2FzaW5nIHNpemVvZiAoY2hhciksCisJc2l6ZW9mIChzaG9ydCksIGFuZCBzaXplb2YgKGxvbmcpLiAgQ2xhcmlmeSBjb21tZW50IG9uIHdoYXQgdGhpcworCWlzIGZvci4KKworCSogc3ltZmlsZS5jIChkZWR1Y2VfbGFuZ3VhZ2VfZnJvbV9maWxlbmFtZSk6IEFjY2VwdCAuY3h4IGZvciBDKysuCisJKiBidWlsZHN5bS5jIChzdGFydF9zdWJmaWxlKTogVXNlIGRlZHVjZV9sYW5ndWFnZV9mcm9tX2ZpbGVuYW1lCisJcmF0aGVyIHRoYW4gY2hlY2tpbmcgZm9yIC5DIG9yIC5jYyBvdXJzZWxmLgorCitNb24gU2VwIDIwIDE0OjUzOjExIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBkZWZzLmg6IERlY2xhcmUgYXJndW1lbnQgb2YgcmVfY29tcCBhcyBjb25zdCBjaGFyICouCisKKwkqIHJlbW90ZS5jLCByZW1vdGUtbWlwcy5jOiBVc2Ugc3JfZ2V0X2RlYnVnIG5vdCByZW1vdGVfZGVidWcuCisKKwkqIFJFQURNRTogU2F5IHVzaW5nIGJmZCBmcm9tIGFub3RoZXIgcmVsZWFzZSBkb2Vzbid0IGdlbmVyYWxseSB3b3JrLgorCitTYXQgU2VwIDE4IDEwOjEzOjE4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBwb3NlaWRvbi5jeWdudXMuY29tKQorCisJKiBtaXBzcmVhZC5jIChwYXJzZV90eXBlKTogRG9uJ3QgY29tcGxhaW4oKSBpZiB3ZSBndWVzc2VkIHN0cnVjdAorCWFuZCBpdCB3YXMgYSB1bmlvbiwgb3IgdmljZSB2ZXJzYS4KKworCSogZGVmcy5oIChtYWtlX2NsZWFudXApOiBDaGFuZ2UgUFRSIHRvIHZvaWQgKiB3aGVuIGluc2lkZSBQQVJBTVMuCisKKwlTb21lIG9mIHRoZSBmb2xsb3dpbmcgaXMgaW4gI2lmZGVmIENBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQuCisJKiBicmVha3BvaW50LmggKGVudW0gYnB0eXBlKTogQWRkIGJwX2NhbGxfZHVtbXkuCisJKHN0cnVjdCBicHN0YXRfd2hhdCk6IEFkZCBjYWxsX2R1bW15IGZpZWxkLgorCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogRGVhbCB3aXRoIGl0LgorCSogYnJlYWtwb2ludC5jIChicHN0YXRfd2hhdCk6IERlYWwgd2l0aCBjYWxsIGR1bW15IGJyZWFrcG9pbnQuCisJKiBpbmZjbWQuYyAocnVuX3N0YWNrX2R1bW15KTogU2V0IHRoZSBjYWxsIGR1bW15IGJyZWFrcG9pbnQuCisJKiBjb25maWcvc3BhcmMvdG0tc3BhcmMuaDogRGVmaW5lIENBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQuCisKKwkqIHJlbW90ZS1zaW0uaDogTmV3IGZpbGUuCisJKiByZW1vdGUtc2ltLmM6IEFkZCByZW1vdGUgZGVidWcgZmVhdHVyZS4gIFJlbmFtZSBzdHVmZiB0byBkaXN0aW5ndWlzaAorCWludGVyZmFjZSB0byBzaW11bGF0b3IgZnJvbSBnZGItc3BlY2lmaWMgc3R1ZmYuICBPdGhlciBjaGFuZ2VzLgorCSogcmVtb3RlLXNwNjRzaW0uYzogUmVuYW1lZCB0byByZW1vdGUtc2ltLmMuCisJVXNlIHNyX2dldF9kZWJ1ZyBpbnN0ZWFkIG9mIG91ciBvd24gc2ltX3ZlcmJvc2Uvc2ltaWZfc25vb3AuCisJVXNlIGdudXRhcmdldCBpbiBjYWxsIHRvIGJmZF9vcGVuci4KKwlSZW5hbWUgc2ltaWZfKiB0byBnZGJzaW1fKi4KKwkqIGNvbmZpZy9zcGFyYy9zcDY0c2ltLm10OiBDaGFuZ2UgcmVtb3RlLXNwNjRzaW0uYyB0byByZW1vdGUtc2ltLmMuCisKK0ZyaSBTZXAgMTcgMDQ6NDE6MTcgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBmaW5kdmFyLmMgKGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIpOiAgQ2FzdCAqcCB0byBMT05HRVNUIGJlZm9yZSBkb2luZworCXRoZSB4b3IgYW5kIHN1YnRyYWN0LiAgT3RoZXJ3aXNlIGl0IHdpbGwgbm90IHNpZ24gZXh0ZW5kIGlmIHRoZSB0eXBlCisJb2YgTE9OR0VTVCBpcyBsYXJnZXIgdGhhbiBpbnQuCisJKiBjcC12YWxwcmludC5jIChjcF9wcmludF9jbGFzc19tZXRob2QpOiAgSW5oaWJpdCBjb3JlIGR1bXAgaWYKKwlkb21haW4gaXMgYW4gdW5kZWZpbmVkIGNyb3NzIHJlZmVyZW5jZS4KKwkqIHZhbG9wcy5jIChjYWxsX2Z1bmN0aW9uX2J5X2hhbmQpOiAgU2V0IHJlYWxfcGMgdG8gY29ycmVjdAorCXZhbHVlIGlmIENBTExfRFVNTVlfTE9DQVRJT04gIT0gT05fU1RBQ0suCisKK1RodSBTZXAgMTYgMjA6Mzc6MDYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWcvYTI5ay90bS1hMjlrLmggKEZSQU1FX0NIQUlOKTogSWYgcnNpemUgaXMgemVybywgcmV0dXJuIHplcm8uCisKK1RodSBTZXAgMTYgMTM6MTY6MjIgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogIEFsbG93IHVzZXIgdG8gc2luZ2xlIHN0ZXAgd2l0aGluCisJYSBzdGFjayBkdW1teS4KKworVGh1IFNlcCAxNiAxMjozNDowMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGRieHJlYWQuYyAoY29weV9wZW5kaW5nKTogRGVhbCB3aXRoIEVORCBOVUxMLgorCShwcm9jZXNzX29uZV9zeW1ib2wpOiBBZGQgY29tbWVudHMgYWJvdXQgd2hhdCBjb21tb25fYmxvY2sgTlVMTCBtZWFucy4KKworV2VkIFNlcCAxNSAxNDo1MDoyNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS11ZGkuYywgcmVtb3RlLWFkYXB0LmMsIHJlbW90ZS1tbS5jOiBNb3ZlIHByb2Nlc3Nvcl90eXBlCisJdG8gdG0tYTI5ay5oIGFuZCBhMjlrLXRkZXAuYyBhbmQgbWFrZSBpdCBhbiBlbnVtLgorCSogYTI5ay10ZGVwLmMgKGEyOWtfZ2V0X3Byb2Nlc3Nvcl90eXBlKTogTmV3IGZ1bmN0aW9uLiAgRml4IG1hbnkKKwlhc3BlY3RzIG9mIGhvdyB3ZSBkZXRlY3RlZCB0aGUgcHJvY2Vzc29yIHR5cGUuCisJKiByZW1vdGUtdWRpLmMsIHJlbW90ZS1hZGFwdC5jLCByZW1vdGUtbW0uYyAoKl9vcGVuKTogQ2FsbCBpdAorCXJhdGhlciB0aGFuIGZpZ3VyaW5nIG91dCB0aGUgdHlwZSBvdXJzZWx2ZXMuCisKK1RodSBTZXAgMTYgMTI6MTI6NTkgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogc3BhcmMtc3R1Yi5jIChfdHJhcF9sb3cpOiAgRG8gcmVzdG9yZS9zYXZlIHNlcXVlbmNlIGFmdGVyCisJc2V0dGluZyBzcCB0byBlbnN1cmUgdGhhdCB3ZSBsb2FkIHRoZSBwcmV2aW91cyB3aW5kb3cgZnJvbSB0aGUKKwlyaWdodCBwbGFjZSBvbiB0aGUgc3RhY2suCisKK1RodSBTZXAgMTYgMDA6MzY6MzIgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBtaXBzcmVhZC5jOiAgTWFueSBjaGFuZ2VzIGZvciBhbHBoYSBlY29mZiBmb3JtYXQ6CisJQ29ycmVjdCBzaXplb2YoaW50KSA9PSBzaXplb2YobG9uZykgYXNzdW1wdGlvbnMuCisJUmVwbGFjZSBzdFBhcnNlZCBoYWNrIGJ5IHB1dHRpbmcgdGhlIHBhcnNlZCB0eXBlcyBvbiB0aGUgcGVuZGluZyBjaGFpbi4KKwlSZXBsYWNlIG1pcHMgc3BlY2lmaWMgZWNvZmYgbWFwcGluZyBieSBFQ09GRl9SRUdfVE9fUkVHTlVNIG1hY3JvLAorCXByb3ZpZGUgZGVmYXVsdCBmb3IgY3Jvc3MgZGVidWdnaW5nLgorCVN3YXBwaW5nIHRoZSBzeW1ib2wgYmFjayBpcyBubyBsb25nZXIgbmVlZGVkIGFzIHRoZSBzeW1ib2wgaXMgbm90CisJbW9kaWZpZWQgYW55bW9yZS4KKwlBZGQgbmV3IGFscGhhIGJhc2ljIHR5cGVzLCBoYW5kbGUgYnRUeXBlZGVmLCBoYW5kbGUgc3RTdGF0aWNQcm9jCisJZXh0ZXJuYWwgc3ltYm9scyAuCisJVXBkYXRlIGFuZCBjbGVhbiB1cCBjcm9zc19yZWYgZm9yIGFscGhhIGNjIGNyb3NzIHJlZiB2YXJpYXRpb25zLgorCUFsbG9jYXRlIHR5cGVzIG9uIHRoZSB0eXBlX29ic3RhY2sgdG8gaW5oaWJpdCBzdG9yYWdlIGxlYWtzLgorCSogY29uZmlnL21pcHMvdG0tbWlwcy5oIChFQ09GRl9SRUdfVE9fUkVHTlVNKTogIERlZmluZS4KKwkqIGdkYnR5cGVzLmMgKHJlY3Vyc2l2ZV9kdW1wX3R5cGUpOiAgRHVtcCBUWVBFX1RBR19OQU1FIGlmIGl0IGlzIHNldC4KKworVHVlIFNlcCAxNCAwOToxMjoxNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIHN0YWJzcmVhZC5jIChyZWFkX3R5cGUpOiBQcm9jZXNzICJzIiAoc2l6ZSkgdHlwZSBhdHRyaWJ1dGUuCisJSWYgdHlwZSBpcyBkZWZpbmVkIHRvIGFub3RoZXIgdHlwZSwgY29weSB0aGUgdHlwZS4KKworVHVlIFNlcCAxNCAxODozNzoxNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9pMzg2L2kzODZ2NC5taCAoTkFUREVQRklMRVMpOiBNb3ZlIGV4ZWMubyBmcm9tIGhlcmUuLi4KKwkqIGNvbmZpZy9pMzg2L2kzODZ2NC5tdCAoVERFUEZJTEVTKTogLi4udG8gaGVyZS4KKworVHVlIFNlcCAxNCAxMjoyMTo0OSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChyZW1vdGVfdXRpbHNfaCk6IGFkZCBzZXJpYWwuaCBhbmQgdGFyZ2V0LmguCisJICAobWFpbi5vLCByZW1vdGUtZXMubywgcmVtb3RlLW5pbmR5Lm8sIHJlbW90ZS5vKTogcmVtb3ZlIHRhcmdldC5oCisJICAoYWxyZWFkeSBpbiByZW1vdGVfdXRpbHNfaCkuCisJICAocmVtb3RlLXV0aWxzLm8pOiBuZXcgcnVsZS4KKworCSogcmVtb3RlLXV0aWxzLmg6IGluY2x1ZGUgc2VyaWFsLmguCisKKwkqIHNlcmlhbC5oOiBpZmRlZiBwcm90ZWN0IGZyb20gbXVsdGlwbGUgaW5jbHVzaW9uLgorCisJKiByZW1vdGUuYywgcmVtb3RlLW5pbmR5LmMsIHJlbW90ZS1tb24uYywgcmVtb3RlLWVzLmM6IGluY2x1ZGUKKwkgIHJlbW90ZS11dGlscy5oLgorCisJKiByZW1vdGUuYyAocmVtb3RlX29wZW4pLCByZW1vdGUtbmluZHkuYyAobmluZHlfb3BlbiwKKwkgIG5pbmR5X2ZpbGVzX2luZm8pLCByZW1vdGUtbW9uLmMgKGdlbmVyYWxfb3BlbiksIHJlbW90ZS1lcy5jCisJICAoZXMxODAwX29wZW4pOiB1c2UgcmVtb3RlLXV0aWxzIGZhY2lsaXRpZXMgZm9yIGJhdWQgcmF0ZS4KKworVHVlIFNlcCAxNCAwOToxMjoxNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIHBhcmVhZC5jLCBjb2ZmcmVhZC5jLCBlbGZyZWFkLmMsIGR3YXJmcmVhZC5jOgorCUluY2x1ZGUgPHRpbWUuaD4gYW5kIDxzeXMvdHlwZXMuaD4gYmVmb3JlIGxpYmJmZC5oLgorCisJKiBwYXJlYWQuYzogRGVmaW5lIEJZVEVTX0lOX1dPUkQgYmVmb3JlIGluY2x1ZGluZyBhb3V0L2FvdXQ2NC5oLgorCisJKiBNYWtlZmlsZS5pbiAoYTI5ay10ZGVwLm8pOiBEZXBlbmQgb24gJChkZWZzX2gpLgorCSogY29uZmlnL2EyOWsvdG0tYTI5ay5oIChTQVZFRF9QQ19BRlRFUl9DQUxMKTogVXNlIGdyMTIyIG5vdCBscjAKKwlpZiB0aGlzCWlzIGEgdHJhbnNwYXJlbnQgcHJvY2VkdXJlLgorCitNb24gU2VwIDEzIDE2OjA2OjQzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLmM6IERlZmluZSByZW1vdGVfZGVidWcgdG8gMCBhbmQgI2lmIDAgYmF1ZF9yYXRlLiAgVGVtcG9yYXJ5CisJaGFjayBzbyB0aGlzIGZpbGUgY29tcGlsZXMgYWdhaW4uCisKKwkqIHJlbW90ZS11dGlscy5jIChncl9tdWx0aV9zY2FuKTogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbSBhbGxvY2EuCisJKGdyX211bHRpX3NjYW4pOiAjaWYgMCBuZXZlci1yZWFjaGVkIHJldHVybigtMSkuCisKKwkqIHJlbW90ZS11ZGkuYyAodWRpX3dhaXQpOiBSZXR1cm4gaW5mZXJpb3JfcGlkIG5vdCAwLgorCitNb24gU2VwIDEzIDE0OjE0OjM1IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCUNvbGxlY3Qgc29tZSByZW1vdGUgdGhpbmdzIGludG8gcmVtb3RlLXV0aWxzLgorCSogcmVtb3RlLXV0aWxzLltjaF06IG5ldyBmaWxlcyBvZiBmdW5jdGlvbnMgY29sbGVjdGVkIGZyb20gc2V2ZXJhbAorCSAgZGlmZmVyZW50IHJlbW90ZSB0YXJnZXRzLgorCSogTWFrZWZpbGUuaW4gKFJFTU9URV9PKTogYWRkIHJlbW90ZS11dGlscy5vLgorCSAgKGRjYWNoZV9oLCByZW1vdGVfdXRpbHNfaCk6IG5ldyBtYWNyb3MuCisJICAoSEZJTEVTKTogYWRkICQocmVtb3RlX3V0aWxzX2gpLgorCSAgKEFMTERFUEZJTEVTKTogYWRkICQocmVtb3RlX3V0aWxzX2gpLgorCSAgKGRjYWNoZS5vKTogbmV3IHJ1bGUuCisJICAobWFpbi5vLCByZW1vdGUtYnVnLm8pOiBhbHNvIGRlcGVuZCBvbiAkKHJlbW90ZV91dGlsc19oKS4KKwkqIHRhcmdldC5oIChyZW1vdGVfZGVidWcpOiBleHRlcm4gbW92ZWQgdG8gcmVtb3RlLXV0aWxzLmguCisJKiB0YXJnZXQuYyAoZmluZF9kZWZhdWx0X3J1bl90YXJnZXQsIGZpbmRfY29yZV90YXJnZXQpOiBpbml0aWFsaXplCisJICBydW5hYmxlLgorCSAgKHJlbW90ZV9kZWJ1Zyk6IG1vdmVkIHRvIHJlbW90ZS11dGlscy5jLgorCSAgKF9pbml0aWFsaXplX3RhcmdldHMpOiBtb3ZlIGRlY2xhcmF0aW9uIG9mIHVzZXIgdmFyaWFibGUKKwkgIHJlbW90ZWRlYnVnIHRvIHJlbW90ZS11dGlscy5jLgorCSogcmVtb3RlLWJ1Zy5jOiBpbmNsdWRlIHJlbW90ZS11dGlscy5oIHJhdGhlciB0aGFuIGRjYWNoZS5oLgorCSAgKGJ1Z19jbG9zZSwgYnVnX3dyaXRlLCBidWdfd3JpdGVfY3IsIGRlc2MsIGJ1Z19kY2FjaGUsIHRpbWVvdXQsCisJICBkZXZfbmFtZSwgY2hlY2tfb3BlbiwgaXNfb3BlbiwgcmVhZGNoYXIsIHJlYWRjaGFyX25vZmFpbCwKKwkgIHBvbGxjaGFyLCBleHBlY3QsIGV4cGVjdF9wcm9tcHQsIGdldF9oZXhfZGlnaXQsIGdldF9oZXhfYnl0ZSwKKwkgIGdldF9oZXhfd29yZCwgYnVnX2tpbGwsIGJ1Z19kZXRhY2gsIGJ1Z19jcmVhdGVfaW5mZXJpb3IsCisJICBtdWx0aS1zY2FuLCBidWdfcHJlcGFyZV90b19zdG9yZSwgYnVnX2ZldGNoX3dvcmQsCisJICBidWdfc3RvcmVfd29yZCwgYnVnX2ZpbGVzX2luZm8sIGJ1Z19tb3VybiwgYnVnX2NvbSwgYnVnX2RldmljZSwKKwkgIGJ1Z19zcGVlZCk6IHJlbW92ZWQgYW5kIHJlcGxhY2VkIHdpdGggZmFjaWxpdGllcyBmcm9tCisJICByZW1vdGUtdXRpbHMuW2NoXS4KKwkgIChidWdfcmVhZF9pbmZlcmlvcl9tZW1vcnkpOiByZW5hbWVkIHRvIGJ1Z19yZWFkX21lbW9yeS4KKwkgIChidWdfd3JpdGVfaW5mZXJpb3JfbWVtb3J5KTogcmVuYW1lZCB0byBidWdfd3JpdGVfbWVtb3J5LgorCSAgKGJ1Z194ZmVyX2luZmVyaW9yX21lbW9yeSk6IHJlbmFtZWQgdG8gYnVnX3hmZXJfbWVtb3J5LgorCSAgKGdldF93b3JkKTogY29tbWVudCBvdXQgdGhpcyB1bnVzZWQgZnVuY3Rpb24gZm9yIG5vdy4KKwkgIChidWdfc2V0dGluZ3MsIGNwdV9jaGVja19zdHJpbmdzKTogbmV3IHN0YXRpY3MuCisJICAoYnVnX29wZW4pOiByZXdyaXR0ZW4gdG8gdXNlIGdyX29wZW4uCisJICAoX2luaXRpYWxpemVfcmVtb3RlX2J1Zyk6IHJlbW92ZSBkZWNsYXJhdGlvbnMgb2YgY29tbWFuZHMgYnVnLAorCSAgZGV2aWNlLCBzcGVlZC4KKwkqIG1haW4uYzogaW5jbHVkZSByZW1vdGUtdXRpbHMuaC4KKwkgIChiYXVkX3JhdGUpOiByZW1vdmVkIHRvIHJlbW90ZS11dGlscy5jLgorCSAgKG1haW4pOiBoYW5kbGUgYmF1ZCByYXRlIHNldHRpbmdzIHVzaW5nIG5ldyBmYWNpbGl0aWVzIGZyb20KKwkgIHJlbW90ZS11dGlscy4KKwkqIGRlZnMuaCAoYmF1ZF9yYXRlKTogcmVtb3ZlZCBleHRlcm4uCisKKwltODgxMTAgc3VwcG9ydCB2aWEgYnVnLTE5NyBtb25pdG9yLgorCSogcmVtb3RlLWJ1Zy5jIChnZXRfcmVnX25hbWUsIGJ1Z19mZXRjaF9yZWdpc3RlciwKKwkgIGJ1Z19zdG9yZV9yZWdpc3Rlcik6IGFkZGVkIG04ODExMCBleHRlbmRlZCByZWdpc3RlciBzdXBwb3J0LgorCSAgKHdhaXRfc3RyaW5ncyk6IGFkZGVkIGJ1Zy0xOTcgcHJvbXB0LgorCSAgKGJ1Z193YWl0KTogY29wZSB3aXRoIGJ1Zy0xOTcgcHJvbXB0LgorCSAgKHN0YXJ0X2xvYWQpOiBjb3BlIHdpdGggZWl0aGVyIGJ1Zy0xOTcgb3IgYnVnLTE4NyBwcm9tcHQuCisKK01vbiBTZXAgMTMgMTI6NTM6MDkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBpbmZlcmlvci5oLCBpbmZydW4uYywgdGhyZWFkLmMsIGluZmNtZC5jOiBSZW1vdmUgYWxsIHVzZXMgb2YKKwlwY19jaGFuZ2VkLiAgSWYgaXQgd2FzIGV2ZXIgc2V0IHRvIGEgbm9uLXplcm8gdmFsdWUsIGl0IHdhcyBiZWZvcmUKKwlHREIgMi44LiAgSXQgZG9lc24ndCBzZWVtIHRvIGhhdmUgYW55IHVzZWZ1bCBmdW5jdGlvbi4KKworCSogZGVmcy5oOiBEb24ndCBkZWZpbmUgTk9SRVRVUk4gKHNlZSBjb21tZW50KS4KKworU2F0IFNlcCAxMSAxMDo0NjowOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcG9zZWlkb24uY3lnbnVzLmNvbSkKKworCSogbTg4ay1uYXQuYyAoZmlsbF9ncmVnc2V0KTogU2V0IHIzMSBhbmQgc2ZpcC4KKworVGh1IFNlcCAgOSAxMDoxODoyOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXVkaS5jICh1ZGlfd2FpdCwgY2FzZSBVRElTdGRpbk5lZWRlZCk6IFVzZSBhIGxvb3AgY2FsbGluZworCWdldGNoYXIoKSAodGVybWluYXRlZCBvbmx5IG9uICdcbicpIGluc3RlYWQgb2Ygc2NhbmYuICBTZW5kIHRoZQorCSdcbicgd2hpY2ggdGVybWluYXRlcyBpdCB0byB0aGUgcmVtb3RlIHN5c3RlbS4KKworCU1vcmUgZ2NjIGxpbnQ6CisJKiBleGVjLmMgKGlnbm9yZSk6IFJldHVybiAwLgorCSogc3RhY2suYyAocmV0dXJuX2NvbW1hbmQpOiBGZXRjaCBsYXp5IHZhbHVlIGRpcmVjdGx5LCBub3QgdmlhCisJVkFMVUVfQ09OVEVOVFMsIHRvIGF2b2lkICJ2YWx1ZSBjb21wdXRlZCBpcyBub3QgdXNlZCIuCisJKiBpbmZsb3cuYyAobmV3X3R0eSk6IE1vdmUgb3NpZ3R0b3UgaW5zaWRlICNpZi4KKworCSogcmVtb3RlLmMgKHJlbW90ZV9mZXRjaF9yZWdpc3RlcnMpOiBJZiByZW1vdGUgcmVwbHkgaXMgc2hvcnQsIGp1c3QKKwlub3RlIHRoYXQgZmFjdCBhbmQga2VlcCBnb2luZyAocmVhZGluZyBleHRyYSByZWdpc3RlcnMgYXMgYWxsIGJpdHMgMCkuCisJKHJlbW90ZV9zdG9yZV9yZWdpc3RlcnMpOiBTZW5kIG51bWJlciBvZiByZWdpc3RlcnMgdGhhdCB3ZXJlIGZvdW5kCisJYnkgcmVtb3RlX2ZldGNoX3JlZ2lzdGVycy4KKwkqIG02OGstdGRlcC5jLCBjb25maWcvbTY4ay90bS1tNjhrLmgsIGNvbmZpZy9tNjhrL3RtLSouaDogUmVtb3ZlCisJSEFWRV82ODg4MS4gIERlZmluZSBDQU5OT1RfU1RPUkVfUkVHSVNURVIgaWYgcHRyYWNlKCkgY2FuJ3Qgd3JpdGUKKwlmbG9hdGluZyByZWdpc3RlcnMuCisJKiBjb25maWcvbTY4ay97dG0tbTY4ay1ub2ZwLmgsbTY4ay1ub2ZwLm10LHRtLW02OGstZnAuaCxtNjhrLWZwLm10fToKKwlSZW1vdmUsIHJlcGxhY2VkIGJ5IHt0bS1tNjhrLWVtLmgsbTY4ay1lbS5tdH0uCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCisKK1RodSBTZXAgIDkgMDQ6NTk6MDMgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBtaXBzcmVhZC5jIChjcm9zc19yZWYpOiAgQWxsb3cgU0dJIGV4dGVuZGVkIHN5bWJvbCB0eXBlcyBhcyBjcm9zcworCXJlZmVyZW5jZSB0YXJnZXRzLgorCSogc3ltbWlzYy5jIChwcmludF9zeW1ib2wpOiAgVXNlIFRZUEVfVEFHX05BTUUgbm90IFRZUEVfTkFNRSB0byBhdm9pZAorCXByaW50aW5nIG9mIGlkZW50aXRpZXMuCisKK1dlZCBTZXAgIDggMTk6MTg6MjcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGJyZWFrcG9pbnQuYyAoYnJlYWtwb2ludF8xKTogRGVhbCB3aXRoIHN0ZXAgcmVzdW1lIGJyZWFrcG9pbnQuCisKK1dlZCBTZXAgIDggMTM6MDE6MTAgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwlHY2MgbGludC4KKwkqIGNvbmZpZy9tODhrL3RtLW04OGsuaCAoZnJhbWVfZmluZF9zYXZlZF9yZWdzKTogcHJvdG90eXBlLgorCSogY29uZmlnL2g4MzAwL3RtLWg4MzAwLmggKE5VTV9SRUdTKTogcmV3cml0ZSB0byBhdm9pZCBuZXN0ZWQgY29tbWVudC4KKwkqIGJsb2NrZnJhbWUuYyAoZ2V0X3ByZXZfZnJhbWVfaW5mbyk6IGluaXRpYWxpemUgYWRkcmVzcy4KKwkqIGJyZWFrcG9pbnQuYyAoYnBzdGF0X2NvcHkpOiBpbml0aWFsaXplIHJldHZhbC4KKwkgIChicHN0YXRfc3RvcF9zdGF0dXMpOiBpbml0aWFsaXplIHZhbHVlX2lzX3plcm8uCisJICAoYnBzdGF0X3doYXQpOiBpbml0aWFsaXplIGJzX2NsYXNzLgorCSAgKGJyZWFrcG9pbnRfMSwgbWVudGlvbik6IGFkZCBkby1ub3RoaW5nIGNhc2UgZm9yIGJwX3N0ZXBfcmVzdW1lLgorCSAgKGJyZWFrX2NvbW1hbmRfMSk6IGluaXRpYWxpemUgY29uZF9lbmQsIGFkZHJfZW5kLCAmCisJICBjYW5vbmljYWxfc3RyaW5nc19jaGFpbi4KKwkgIChlbmFibGVfYnJlYWtwb2ludCk6IGluaXRpYWxpemUgc2F2ZV9zZWxlY3RlZF9mcmFtZS4KKwkqIGJ1aWxkc3ltLmMgKGVuZF9zeW10YWIpOiBpbml0aWFsaXplIHN5bXRhYiAmIGxpbmV0YWJsZXNpemUuCisJKiBjLWV4cC55IChwYXJzZV9udW1iZXIpOiBpbml0aWFsaXplIGkuCisJKiBjLXR5cGVwcmludC5jIChjX3R5cGVfcHJpbnRfdmFyc3BlY19wcmVmaXgpOiBpbmNsdWRlCisJICBUWVBFX0NPREVfQklUU1RSSU5HIGluIHN3aXRjaCBzdGF0ZW1lbnRzIGFuZCBkbyBub3RoaW5nLgorCSogYy12YWxwcmludC5jIChjX3ZhbF9wcmludCk6IHJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIGMuCisJKiBjaC12YWxwcmludC5jIChjaGlsbF92YWxfcHJpbnQpOiByZW1vdmVkIHVudXNlZCB2YXJpYWJsZSBlbHRsZW4uCisJKiBjcC12YWxwcmludC5jIChjcF9wcmludF9jbGFzc19tZXRob2QpOiBpbml0aWFsaXplIGYgJiBqLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiBpbml0aWFsaXplIHBjMiwgYXJnMSwgYXJnMi4KKwkqIGV4cHByaW50LmMgKHByaW50X3N1YmV4cCk6IGluaXRpYWxpemUgbXlwcmVjLCBhc3NvYywgJiB0ZW1wc3RyLgorCSogZmluZHZhci5jICh2YWx1ZV9mcm9tX3JlZ2lzdGVyKTogaW5pdGlhbGl6ZSBmaXJzdF9hZGRyLgorCSogZ2RidHlwZXMuYyAobG9va3VwX3N0cnVjdF9lbHRfdHlwZSk6IGxvY2FsaXplIHVzZSBvZiB0ZW1wb3JhcnkKKwkgIHZhcmlhYmxlIHR5cGVuYW1lLgorCSogaW5mY21kLmMgKHJ1bl9zdGFja19kdW1teSk6IHJldHVybiB6ZXJvIHJhdGhlciB0aGFuIHNpbXBsZQorCSAgcmV0dXJuLgorCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogaW5pdGlhbGl6ZSBzdG9wX3NwLCBwcm9sb2d1ZV9wYy4KKwkgIHJlbW92ZSBzeW10YWIsIGFwcGVhcnMgdW51c2VkLgorCSAgKHJlc3RvcmVfc2VsZWN0ZWRfZnJhbWUpOiByZXR1cm4gMS4KKwkqIG1pcHNyZWFkLmMgKHBzeW10YWJfdG9fc3ltdGFiXzEpOiBpbml0aWFsaXplIGZpcnN0X29mZi4KKwkgIChmaXh1cF9zaWd0cmFtcCk6IGluaXRpYWxpemUgYjAuCisJKiBwcmludGNtZC5jIChkb19leGFtaW5lKTogaW5pdGlhbGl6ZSB2YWxfdHlwZS4KKwkgIChwcmludF9mcmFtZV9hcmdzKTogaW5pdGlhbGl6ZSBiLgorCSogc2VyLXRjcC5jICh0Y3BfcmVzdG9yZSk6IGNvbW1lbnQgb3V0IGRlY2xhcmF0aW9uLiAgQXBwZWFycworCSAgdW51c2VkLgorCSogc2VyLXVuaXguYyAoaGFyZHdpcmVfcmVzdG9yZSk6IGNvbW1lbnQgb3V0IGRlY2xhcmF0aW9uLiAgQXBwZWFycworCSAgdW51c2VkLgorCSAgKGhhcmR3aXJlX3NlbmRfYnJlYWspOiBtb3ZlZCB2YXJpYWJsZSBzdGF0dXMgaW50byBpZmRlZgorCSAgSEFWRV9TR1RUWS4KKwkgICh3YWl0X2Zvcik6IG1vdmVkIHZhcmlhYmxlIG51bWZkcyBpbnRvIGlmZGVmIEhBVkVfU0dUVFkuCisJKiBzZXJpYWwuaDogY29tbWVudCBjaGFuZ2Ugb25seS4KKwkqIHN0YWJzcmVhZC5jIChyczYwMDBfYnVpbHRpbl90eXBlKTogaW5pdGlhbGl6ZSByZXR0eXBlLgorCSAgKHJlYWRfcmFuZ2VfdHlwZSk6IGluaXRpYWxpemUgbmJpdHMuCisJKiBzdGFjay5jIChwcmludF9mcmFtZV9pbmZvKTogcmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBudW1hcmdzLgorCSAgKHBhcnNlX2ZyYW1lX3NwZWNpZmljYXRpb24pOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlcyBhcmcxLCBhcmcyLAorCSAgYXJnMy4KKwkgIChyZXR1cm5fY29tbWFuZCk6IGluaXRpYWxpemUgcmV0dXJuX3ZhbHVlLgorCSogc3ltZmlsZS5jIChjYXNoaWVyX3BzeW10YWIpOiBpbml0aWFsaXplIHBwcmV2LgorCSogc3ltdGFiLmMgKGZpbmRfcGNfcHN5bWJvbCk6IGluaXRpYWxpemUgYmVzdC4KKwkgIChsb29rdXBfc3ltYm9sKTogaW5pdGlhbGl6ZSBzLgorCSAgKG1ha2Vfc3ltYm9sX2NvbXBsZXRpb25fbGlzdCk6IGluaXRpYWxpemUgcXVvdGVfcG9zLgorCSogdGhyZWFkLmM6IGluY2x1ZGUgY29tbWFuZC5oLgorCSAgKHRocmVhZF9pbmZvKTogc3RhdGljIGRlY2xhcmF0aW9uIHJlbW92ZWQ7IHVudXNlZC4KKwkgIChpbmZvX3RocmVhZHNfY29tbWFuZCk6IGZpeCA9PSB2cyA9IHR5cG8uCisJKiB0eXBlcHJpbnQuYyAod2hhdGlzX2V4cCk6IGluaXRpYWxpemUgb2xkX2NoYWluLgorCSogdmFscHJpbnQuYyAodmFsX3ByaW50X3N0cmluZyk6IHJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKwkgIGZpcnN0X2FkZHJfZXJyLiAgSW5pdGlhbGl6ZSBvbGRfY2hhaW4uCisJICAoX2luaXRpYWxpemVfdmFscHJpbnQpOiB3aGl0ZSBzcGFjZSBjb21tZW50IGNoYW5nZS4KKwkqIHZhbHVlcy5jIChzaG93X3ZhbHVlcyk6IHJld3JpdGUgaWYgc3RhdGVtZW50IHRvIGF2b2lkIGVtcHR5CisJICBib2R5LgorCSAgKHZiX21hdGNoKTogcmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBmaWVsZHR5cGVfdGFyZ2V0X3R5cGUuCisKK1dlZCBTZXAgIDggMTA6MjE6MzMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChtaXBzcmVhZC5vKTogRGVwZW5kIG9uICQoYmZkX2gpLgorCitUdWUgU2VwICA3IDEzOjA2OjQ0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGJzZXJ2ZXIvTWFrZWZpbGUuaW4gKFRBR1MpOiBjb25maWcgZmlsZXMgYXJlIGluCisJJChzcmNkaXIpLy4uL2NvbmZpZywgbm90ICQoc3JjZGlyKS9jb25maWcuCisKKwkqIGNvbmZpZy9wYS90bS1ocHBhLmg6IERlY2xhcmUgdGFyZ2V0X3JlYWRfcGMgYW5kIHRhcmdldF93cml0ZV9wYy4KKwkoU1RPUkVfUkVUVVJOX1ZBTFVFKTogUGFzcyB0aGUgY29ycmVjdCBvZmZzZXQgb2YgdGhlIHJldHVybgorCXJlZ2lzdGVyIHRvIHdyaXRlX3JlZ2lzdGVyX2J5dGVzLgorCSogaHBwYS10ZGVwLmM6IFVzZSB0YXJnZXRfd3JpdGVfcGMgaWYgUENPUV9UQUlMX1JFR05VTSB3YXMgbm90IHNhdmVkLgorCitUdWUgU2VwICA3IDE0OjMwOjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLmMgKHJlbW90ZV93YWl0KTogRG9uJ3QgY2FsbCBlcnJvci4gIEluc3RlYWQsIGNhbGwgd2FybmluZworCWluc2lkZSBhIGxvb3AuICBVc2VyIGNhbiBeQyB0byBnZXQgb3V0LgorCisJKiBjb25maWcvbTY4ay90bS1tNjhrLmggKEZJWF9DQUxMX0RVTU1ZKTogQ2hhbmdlZCBuYW1lIG9mIHN3YXBwaW5nCisJcm91dGluZSB0byBtYXRjaCBCRkQgbmFtZSBjaGFuZ2UuCisJKiBjb25maWcvejhrL3RtLXo4ay5oIChGSVhfQ0FMTF9EVU1NWSk6IExpa2V3aXNlLgorCitNb24gU2VwICA2IDE1OjAxOjU3IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCisKKwkqIGVsZnJlYWQuYzogY2hhbmdlIGVsZjMyX3N5bWJvbF90eXBlIHRvIGVsZl9zeW1ib2xfdHlwZQorCitNb24gU2VwICA2IDE1OjQzOjI1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLmMgKHJlbW90ZV93YWl0KTogQWRkZWQgJ1cnIGFuZCAnTicgcmVzcG9uc2VzLgorCitGcmkgU2VwICAzIDA4OjU3OjEwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBtYWluLmMsIHV0aWxzLmM6IEFkZCBjb21tZW50cyBhYm91dCBpbW1lZGlhdGVfcXVpdC4KKworCSogZWxmcmVhZC5jIChlbGZfc3ltdGFiX3JlYWQpOiBEb24ndCBhZGQgc3ltYm9scyBzdGFydGluZyB3aXRoICIuTCIKKwl0byBtaW5pbWFsIHN5bWJvbHMuCisKKwkqIHRhcmdldC5jIChwb3BfdGFyZ2V0KTogRG9uJ3QgdHJ5IHRvIGRlYWwgd2l0aCB0aGUgc3RhY2sgYmVjb21pbmcKKwllbXB0eS4gIFNob3VsZG4ndCBoYXBwZW4gYW5kIHRoZSBjb2RlIHRoYXQgdHJpZWQgd2FzIGJyb2tlbi4KKworCSogZGNhY2hlLmM6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20geG1hbGxvYy4KKworCSogcmVtb3RlLmM6IE1vdmUgc2V0dGluZyBvZiBpbW1lZGlhdGVfcXVpdCBmcm9tIHJlbW90ZV9vcGVuIHRvCisJcmVtb3RlX3N0YXJ0X2R1bW15IGFuZCBzZXQgaXQgYmFjayB0byB6ZXJvIHdoZW4gZG9uZS4KKworVGh1IFNlcCAgMiAwMDowNzozNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbTg4ay10ZGVwLmM6IFJlbW92ZSBhIGJ1bmNoIG9mIHVudXNlZCAjaW5jbHVkZXMuCisKKwkqIGxhbmd1YWdlLmg6IEFkZCBjb21tZW50IGFib3V0IGN1cnJlbnRfbGFuZ3VhZ2UuCisKKwkqIG1pcHMtdGRlcC5jIChfaW5pdGlhbGl6ZV9taXBzX3RkZXApOiBDaGFuZ2UgaGV1cmlzdGljLWZlbmNlLXBvc3QKKwlmcm9tIHZhcl91aW50ZWdlciB0byB2YXJfemludGVnZXIuCisKKwkqIGNvbmZpZ3VyZS5pbjogRml4IHR5cG8gKGRlbHRhODhyNCAtPiBkZWx0YTg4djQpLgorCisJKiBjb25maWcvbTg4ay94bS1kZWx0YTg4Lmg6IERvbid0IGluY2x1ZGUgc3lzL3NpZ2luZm8uaC4gIEl0IHdhcworCXRvIG1ha2UgdGhpcyB3b3JrIG9uIFNWUjQgYmVmb3JlIFNWUjQgaGFkIGl0cyBvd24gY29uZmlndXJhdGlvbiwKKwlhbmQgaXQgYnJlYWtzIFNWUjMuCisKKwkqIGNvbmZpZy9tODhrL3RtLWRlbHRhODh2NC5oOiBEZWZpbmUgRlJBTUVfQ0hBSU5fVkFMSURfQUxURVJOQVRFLgorCisJKiBjb25maWcvbTg4ay9kZWx0YTg4djQuaCAoTkFUREVQRklMRVMpOiBSZW1vdmUgaW5mcHRyYWNlLm8gaW5mdGFyZy5vLgorCisJKiBjb25maWcvbTg4ay94bS1kZ3V4Lmg6IFJlbmFtZWQgZnJvbSBjb25maWcvbTg4ay94bS1tODhrLmguCisJKiBjb25maWcvbTg4ay9tODhrLm1oOiBVc2UgeG0tZGd1eC5oLgorCSogY29uZmlnL204OGsveG0tbTg4ay5oOiBOZXcgZmlsZSwgd2l0aCBIT1NUX0JZVEVfT1JERVIsCisJTUFLRVZBX0VORCBhbmQgTUFLRVZBX0FSRy4KKwkqIGNvbmZpZy9tODhrL3htLSouaDogSW5jbHVkZSBtODhrL3htLW04OGsuaC4KKwkqIHByaW50Y21kLmM6IFJlbW92ZSBfX0lOVF9WQVJBUkdTX0ggY29kZTsgbm93IGluIHhtLW04OGsuaC4KKworV2VkIFNlcCAgMSAxOTozMToyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXVkaS5jICh1ZGlfd2FpdCk6IENhbGwgYHdhcm5pbmcnIG5vdCBgZXJyb3InLgorCisJKiBzeW10YWIuYyAoQ09NUExFVElPTl9MSVNUX0FERF9TWU1CT0wpOiBJZiB0aGUgc3ltYm9sIGhhcyBhCisJZGVtYW5nbGluZywgZG9uJ3QgcHV0IHRoZSBtYW5nbGVkIGZvcm0gaW4gdGhlIGNvbXBsZXRpb24gbGlzdC4KKworCSogc3ltdGFiLmMsIHN5bWZpbGUuYywgYy1leHAueSwgY2gtZXhwLnksIG0yLWV4cC55LCBidWlsZHN5bS5jLAorCXN5bWZpbGUuaCwgc3RhYnNyZWFkLmMsIG1pbnN5bXMuYywgc29saWIuYywgbmxtcmVhZC5jLCBkd2FyZnJlYWQuYworCXBhcnRpYWwtc3RhYi5oLCBzeW1taXNjLmMsIGdkYnR5cGVzLmM6IExpbnQuICBSZW1vdmUgKG9yIHB1dAorCWluc2lkZSAjaWYpIHVudXNlZCB2YXJpYWJsZXMgYW5kIGxhYmVscy4gIEZpeCB1bmNsb3NlZCBjb21tZW50LgorCURlYWwgd2l0aCBlbnVtZXJhdGlvbiB2YWx1ZXMgdW5oYW5kbGVkIGluIHN3aXRjaCBzdGF0ZW1lbnRzLiAgTWFrZQorCXN1cmUgbm9uLXZvaWQgZnVuY3Rpb25zIHJldHVybiB2YWx1ZXMuICBJbmNsdWRlIGFwcHJvcHJpYXRlCisJaGVhZGVycy4KKwkqIGRieHJlYWQuYyAoZWxmc3RhYl9idWlsZF9wc3ltdGFicyk6IERvbid0IGNoZWNrIGZvciB1bnNpZ25lZAorCXZhbHVlIDwgMC4KKworV2VkIFNlcCAgMSAxNDozNjowMCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwkqIGk5NjAtdGRlcC5jLCBuczMyay1waW5zbi5jLCByZW1vdGUtYWRhcHQuYywgeGNvZmZyZWFkLmM6CisJICBpbmRleCAtPiBzdHJjaHIuCisKK1dlZCBTZXAgIDEgMTE6MzU6NDkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS5jOiBBZGQgY29tbWVudCBleHBsYWluaW5nIHdoeSBkY2FjaGUgaXMgZGlzYWJsZWQuCisJKHJlbW90ZV9mZXRjaF93b3JkLCByZW1vdGVfc3RvcmVfd29yZCk6IE1ha2Ugc3RhdGljIGFuZCAjaWYgMC4KKwlUaGV5IGFyZSBub3QgY2FsbGVkIGZyb20gYW55d2hlcmUuCisKK1dlZCBTZXAgIDEgMTQ6NDE6MjggMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJKiBhcm0tdGRlcC5jLCBjb252ZXgtdGRlcC5jLCBjb252ZXgteGRlcC5jLCBkYnhyZWFkLmMsCisJICBoODMwMC10ZGVwLmMsIGg4NTAwLXRkZXAuYywgaTk2MC1waW5zbi5jLCBpOTYwLXRkZXAuYywKKwkgIGluZnB0cmFjZS5jLCBtODhrLXRkZXAuYywgbWlwcy10ZGVwLmMsIHJlZ2V4LmMsIHJlbW90ZS12eC5jLAorCSAgcnM2MDAwLXRkZXAuYywgeGNvZmZleGVjLmMsIHhjb2ZmcmVhZC5jLCB6OGstdGRlcC5jLAorCSAgY29uZmlnL2FybS90bS1hcm0uaCwgY29uZmlnL2NvbnZleC90bS1jb252ZXguaCwKKwkgIGNvbmZpZy9nb3VsZC90bS1ucDEuaCwgY29uZmlnL2dvdWxkL3RtLXBuLmgsCisJICBjb25maWcvbTY4ay90bS1pc2kuaCwgY29uZmlnL25zMzJrL3RtLXVtYXguaCwKKwkgIGNvbmZpZy9wYS90bS1ocHBhLmgsIGNvbmZpZy9weXIvdG0tcHlyLmgsCisJICBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oLCBjb25maWcvdGFob2UvdG0tdGFob2UuaCwKKwkgIGNvbmZpZy92YXgvdG0tdmF4Lmg6ICBiemVybyAtPiBtZW1zZXQuCisKKwkqIHJlZ2V4LmM6IGJjbXAgLT4gbWVtY21wLgorCitXZWQgU2VwICAxIDExOjM1OjQ5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzeW10YWIuYyAoZmluZF9wY19saW5lLCBmaW5kX2xpbmVfY29tbW9uKSwKKwlzeW10YWIuaCAoc3RydWN0IGxpbmV0YWJsZSksIHhjb2ZmcmVhZC5jIChhcnJhbmdlX2xpbmV0YWJsZSk6CisJUmV2aXNlIGNvbW1lbnRzIHJlIGxpbmV0YWJsZSBzb3J0aW5nLgorCSogYnVpbGRzeW0uYyAoY29tcGFyZV9saW5lX251bWJlcnMpOiBTb3J0IGJ5IHBjLCBub3QgYnkgbGluZS4KKwkqIGNvZmZyZWFkLmM6IFRlbGwgZW5kX3N5bXRhYiB0byBzb3J0IHRoZSBsaW5lIHRhYmxlLgorCisJKiBjb2ZmcmVhZC5jOiBSZS13b3JrIGEgbG90IG9mIHRoZSBjb2ZmLXNwZWNpZmljIHN0dWZmIHRvIHVzZSBzdHVmZgorCWluIGJ1aWxkc3ltLmMuICBUaGlzIGluY2x1ZGVzIGNvZmZfZmluaXNoX2Jsb2NrLCBjb2ZmX2NvbnRleHRfc3RhY2ssCisJY29mZl9sb2NhbF9zeW1ib2xzLCBjb2ZmX2ZpbGVfc3ltYm9scywgY29mZl9nbG9iYWxfc3ltYm9scywKKwljb2ZmX2VuZF9zeW10YWIgYW5kIGNvZmZfYWRkX3N5bWJvbF90b19saXN0LgorCShyZWFkX2VudW1fdHlwZSk6IERlYWwgd2l0aCBpdCBub3cgdGhhdCB3ZSBoYXZlIGEgInN0cnVjdCBwZW5kaW5nIgorCW5vdCBhICJzdHJ1Y3QgY29mZl9wZW5kaW5nIi4KKworCSogYnVpbGRzeW0uYyAoZW5kX3N5bXRhYik6IERvbid0IHJlYWxsb2Mgc3ViZmlsZS0+bGluZXRhYmxlLgorCitXZWQgU2VwICAxIDEzOjEyOjQzIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogYTY4di1uYXQuYywgYWx0b3MteGRlcC5jLCBjb252ZXgtdGRlcC5jLCBjb252ZXgteGRlcC5jLAorCSAgZmluZHZhci5jLCBocHBhYi1uYXQuYywgaHBwYWgtbmF0LmMsIGkzODZtYWNoLW5hdC5jLAorCSAgaXJpeDQtbmF0LmMsIG02OGstdGRlcC5jLCBtODhrLXRkZXAuYywgbWlwc3JlYWQuYywgcmVnZXguYywKKwkgIHJlbW90ZS1idWcuYywgcmVtb3RlLWhtcy5jLCByczYwMDAtbmF0LmMsIHJzNjAwMC10ZGVwLmMsCisJICBzcGFyYy1uYXQuYywgc3RhYnNyZWFkLmMsIHN1bjMtbmF0LmMsIHN1bjM4Ni1uYXQuYywgc3ltZmlsZS5jLAorCSAgdW1heC14ZGVwLmMsIHhjb2ZmcmVhZC5jLCAyOWstc2hhcmUvdWRpL3VkaXAyc29jLmMsCisJICAyOWstc2hhcmUvdWRpL3Vkci5jLCBjb25maWcvYTI5ay90bS1hMjlrLmgsIGNvbmZpZy9hcm0vdG0tYXJtLmgsCisJICBjb25maWcvY29udmV4L3RtLWNvbnZleC5oLCBjb25maWcvZ291bGQvdG0tbnAxLmgsCisJICBjb25maWcvZ291bGQvdG0tcG4uaCwgY29uZmlnL2g4MzAwL3RtLWg4MzAwLmgsCisJICBjb25maWcvaDg1MDAvdG0taDg1MDAuaCwgY29uZmlnL2kzODYvdG0taTM4NmFpeC5oLAorCSAgY29uZmlnL2kzODYvdG0tc3VuMzg2LmgsIGNvbmZpZy9pMzg2L3RtLXN5bW1ldHJ5LmgsCisJICBjb25maWcvaTk2MC90bS1pOTYwLmgsIGNvbmZpZy9tNjhrL3RtLW5ld3MuaCwKKwkgIGNvbmZpZy9tODhrL3RtLW04OGsuaCwgY29uZmlnL21pcHMvdG0tbWlwcy5oLAorCSAgY29uZmlnL25zMzJrL3RtLW1lcmxpbi5oLCBjb25maWcvbnMzMmsvdG0tdW1heC5oLAorCSAgY29uZmlnL3BhL3RtLWhwcGEuaCwgY29uZmlnL3B5ci90bS1weXIuaCwKKwkgIGNvbmZpZy9yczYwMDAvdG0tcnM2MDAwLmgsIGNvbmZpZy9zaC90bS1zaC5oLAorCSAgY29uZmlnL3RhaG9lL3RtLXRhaG9lLmgsIGNvbmZpZy92YXgvdG0tdmF4LmgsCisJICBjb25maWcvejhrL3RtLXo4ay5oLCBuaW5keS1zaGFyZS9uaW5keS5jOiBiY29weSAtPiBtZW1jcHkuCisKK1dlZCBTZXAgIDEgMDU6MDU6NTMgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBtaXBzcmVhZC5jIChwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiAgVXNlIGxhbmd1YWdlIGZyb20gRkRSIGlmIGl0CisJaXMgdW5hbWJpZ291cy4gIFBhdGNoIGZyb20gcHRmQGRlbGNhbS5jby51ayAoUGF1bCBGbGluZGVycykuCisJKiBtaXBzcmVhZC5jIChlY29mZl9zeW1maWxlX2luZm8pOiAgTmV3IHN0cnVjdCB0byBob2xkIHRoZSBnbG9iYWwKKwlwZW5kaW5nX2xpc3QuCisJKiBtaXBzcmVhZC5jIChtaXBzY29mZl9zeW1maWxlX2luaXQsIHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6CisJQWxsb2NhdGUgdGhlIGdsb2JhbCBwZW5kaW5nIGxpc3QgYW5kIGxpbmsgaXQgdG8gdGhlIG9iamZpbGUuCisJKiBtaXBzcmVhZC5jIChpc19wZW5kaW5nX3N5bWJvbCwgYWRkX3BlbmRpbmcpOiAgVXNlIGdsb2JhbCBwZW5kaW5nCisJbGlzdCBmcm9tIG9iamZpbGUuIEFsbG9jYXRlIHBlbmRpbmcgbGlzdCBlbnRyaWVzIGZyb20gdGhlCisJcHN5bWJvbF9vYnN0YWNrLgorCSogbWlwc3JlYWQuYyAoZnJlZV9wZW5kaW5nKTogIFJlbW92ZS4gVGhlIHBlbmRpbmcgbGlzdCBpcyBub3cKKwlmcmVlZCB3aGVuIHRoZSBwc3ltYm9sX29ic3RhY2sgaXMgZnJlZWQuCisJKiBtaXBzcmVhZC5jIChwc3ltdGFiX3RvX3N5bXRhYjEpOiAgUmVtb3ZlIHBlbmRpbmcgbGlzdCBhbGxvY2F0aW9uLAorCXRoZSBnbG9iYWwgcGVuZGluZyBsaXN0IGlzIHVzZWQgbm93LgorCSogbWlwc3JlYWQuYyAocGFyc2VfcGFydGlhbF9zeW1ib2xzKTogIFNraXAgb25seSB0aGUgZmlyc3QKKwlmaWxlIGluZGlyZWN0IGVudHJ5IHdoZW4gYnVpbGRpbmcgdGhlIGRlcGVuZGVuY3kgbGlzdC4KKworVHVlIEF1ZyAzMSAxNTowMToyNyAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwlCcmVhayBkY2FjaGUgY29kZSBvdXQgb2YgcmVtb3RlLmMuCisJKiBkY2FjaGUuaDogd2hpdGUgc3BhY2UgY2hhbmdlcyBvbmx5LgorCSogZGNhY2hlLmM6IGFkZCB1c2VyIHNldHRhYmxlIHZhcmlhYmxlIHRvIHNldCB3aGV0aGVyIGRhdGEgY2FjaGluZworCSAgaXMgaW4gdXNlLgorCSogcmVtb3RlLmM6IGluY2x1ZGUgZGNhY2hlLmguIHJlbW92ZWQgZGF0YSBjYWNoaW5nIGNvZGUgd2hpY2ggaXMKKwkgIG5vdyBpbiBkY2FjaGUuYy4gIENvbXBpbGUgaW4gZGF0YSBjYWNoaW5nIGFnYWluLiAgKGRhdGEgY2FjaGluZworCSAgaXMgY3VycmVudGx5IG9mZiBieSBkZWZhdWx0LikKKwkgIChyZW1vdGVfcmVhZF9ieXRlcywgcmVtb3RlX3dyaXRlX2J5dGVzKTogY2hhbmdlIHNlY29uZCBhcmcgdG8KKwkgIHVuc2lnbmVkIGNoYXIuCisJICAocmVtb3RlX2RjYWNoZSk6IG5ldyBzdGF0aWMgdmFyaWFibGUuCisJKiBNYWtlZmlsZS5pbiAoUkVNT1RFX08pOiBhZGQgZGNhY2hlLm8uCisJKiBjb25maWcvbTg4ay9tODhrLm10IChUREVQRklMRVMpOiByZW1vdmVkIGRjYWNoZS5vLgorCisJQnJlYWsgZGNhY2hlIGNvZGUgb3V0IG9mIHJlbW90ZS1uaW5keS5jLgorCSogcmVtb3RlLW5pbmR5LmM6IHJlbW92ZWQgZGNhY2hlIGNvZGUuICBDaGFuZ2VkIGNhbGxlcnMgdG8gdXNlIG5ldworCSAgY29udmVudGlvbnMuICBpbmNsdWRlIGRjYWNoZS5oLgorCSAgKG5pbmR5X2RjYWNoZSk6IG5ldyBzdGF0aWMgdmFyaWFibGUuCisJKiBjb25maWcvaTk2MC9uaW5keTk2MC5tdCAoVERFUEZJTEVTKTogYWRkZWQgZGNhY2hlLm8uCisKKwlCcmVhayBkY2FjaGUgY29kZSBvdXQgb2YgcmVtb3RlLWJ1Zy5jIGludG8gZGNhY2hlLltoY10uCisJKiBNYWtlZmlsZS5pbiAoZGNhY2hlX2gpOiBuZXcgbWFjcm8uCisJICAoSEZJTEVTKTogYWRkZWQgJChkY2FjaGVfaCkuCisJICAoQUxMREVQRklMRVMpOiBhZGRlZCBkY2FjaGUuYy4KKwkgIChkY2FjaGUubyk6IG5ldyBydWxlLgorCSAgKHJlbW90ZS1idWcubyk6IG5vdyBkZXBlbmRzIG9uICQoZGNhY2hlX2gpLgorCSogcmVtb3RlLWJ1Zy5jOiBpbmNsdWRlIGRjYWNoZS5oLiByZW1vdmUgZXh0ZXJucyBmb3IgaW5zcXVlIGFuZAorCSAgcmVtcXVlLCBhZGQgZXh0ZXJuIGZvciBiY29weS4gIFByb3RvdHlwZSBidWdfY2xvc2UsCisJICBidWdfY2xlYXJfYnJlYWtwb2ludHMsIGJ1Z193cml0ZV9jci4gIGRjYWNoZSBjb2RlIG1vdmVkIHRvCisJICBkY2FjaGUuW2hjXS4gIENoYW5nZWQgZGNhY2hlIGNhbGxpbmcgY29udmVudGlvbiB0byBpbmNsdWRlIGFuCisJICBpbml0aWFsIERDQUNIRSBhcmd1bWVudC4KKwkgIChidWdfZGNhY2hlKTogbmV3IHN0YXRpYyB2YXJpYWJsZS4KKwkgIChidWdfcmVhZF9pbmZlcmlvcl9tZW1vcnkpOiBjaGFuZ2Ugc2Vjb25kIGFyZyB0bworCSAgdW5zaWduZWQgY2hhci4KKwkqIGRjYWNoZS5bY2hdOiBuZXcgZmlsZXMuCisJKiBjb25maWcvbTg4ay9tODhrLm10IChUREVQRklMRVMpOiBhZGQgZGNhY2hlLm8uCisKK1R1ZSBBdWcgMzEgMTA6MzM6MTMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGMtdHlwZXByaW50LmMgKGNfcHJpbnRfdHlwZV9iYXNlKTogVHJlYXQgc2hvdyA9IDAganVzdCBsaWtlCisJc2hvdyA8IDAuICBUaGUgb25seSBjYXNlIHdoZXJlIHdlIGhhZCBiZWVuIGRpc3Rpbmd1aXNoaW5nIGlzIHRoYXQKKwlzaG93ID0gMCB1c2VkIHRvIHByaW50ICJzdHJ1Y3QgICIgb3IgImVudW0gICIgaW5zdGVhZCBvZgorCSJzdHJ1Y3Qgey4uLn0iIG9yICJlbnVtIHsuLi59IiB3aGljaCBzZWVtcyBjbGVhcmx5IHdyb25nLgorCitNb24gQXVnIDMwIDE3OjUxOjMyIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgbTg4MTEwIGFzIGFuIG04OGsuCisKK01vbiBBdWcgMzAgMTY6MDc6NTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHZhbG9wcy5jIChjYWxsX2Z1bmN0aW9uX2J5X2hhbmQpOiBJZiB3ZSBkaXNjYXJkIGNsZWFudXBzLCBjYWxsCisJYnBzdGF0X2NsZWFyICgmaW5mX3N0YXR1cy5zdG9wX2Jwc3RhdCkuCisKK01vbiBBdWcgMzAgMTI6NDc6NDYgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBzdGFic3JlYWQuaCwgZGJ4cmVhZC5jIChlbmRfcHN5bXRhYik6ICBSZXR1cm4gTlVMTCBpZiB0aGUgcHN5bXRhYgorCXdhcyBlbXB0eSBhbmQgdGhyb3duIGF3YXkuCisJKiBtaXBzcmVhZC5jIChwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiAgRG8gbm90IGFkZCBlbXB0eSBwc3ltdGFicyB0bworCWRlcGVuZGVuY3kgbGlzdCwgc2tpcCBzZWxmIGRlcGVuZGVuY2llcy4KKwkqIG1pcHNyZWFkLmMgKHBhcnNlX2Zkcik6ICBSZW1vdmVkLCBvYnNvbGV0ZS4KKwkqIG1pcHNyZWFkLmMgKHBhcnNlX2xpbmVzKTogIENoZWNrIGZvciBjYkxpbmUgYmVpbmcgemVybywgbm90CisJY2JMaW5lT2Zmc2V0LgorCSogbWlwc3JlYWQuYyAoc3RydWN0IHN5bWxvYyk6ICBBZGQgcHN0X2xhbmd1YWdlLgorCSogbWlwc3JlYWQuYyAocGFyc2VfcGFydGlhbF9zeW1ib2xzKTogU2V0IHVwIHByb3BlciBsYW5ndWFnZSBmb3IKKwloZWFkZXIgZmlsZXMsIHNhdmUgaXQgaW4gcHN0X2xhbmd1YWdlIGZvciBwc3ltdGFiX3RvX3N5bXRhYl8xLgorCSogbWlwc3JlYWQuYyAocHN5bXRhYl90b19zeW10YWJfMSk6ICBVc2UgcHN0X2xhbmd1YWdlLgorCitNb24gQXVnIDMwIDEwOjQ4OjA2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IEZpeCB0eXBvIG04OCotbW90b3JvbGEtc3ZyNCogLT4gc3lzdjQqLgorCitGcmkgQXVnIDI3IDE3OjA5OjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogcGFyZWFkLmM6IEluY2x1ZGUgc29tLmggaW5zdGVhZCBvZiBsaWJocHBhLmguICAoRnJvbSBVdGFoLikKKworRnJpIEF1ZyAyNyAwOTozMDo0MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogc3ltbWlzYy5jIChkdW1wX3N5bXRhYik6IFVzZSBjYXRjaF9lcnJvcnMgYXJvdW5kIHByaW50X3N5bWJvbC4KKwlDaGFuZ2UgY2FsbGluZyBzZXF1ZW5jZSBvZiBwcmludF9zeW1ib2wgdG8gZml0IGNhdGNoX2Vycm9ycy4KKworCSogbWlwcy10ZGVwLmM6IENhbGwgcmVpbml0X2ZyYW1lX2NhY2hlIGV2ZXJ5IHRpbWUgdGhlIHVzZXIgZG9lcworCSJzZXQgaGV1cmlzdGljLWZlbmNlLXBvc3QiLgorCisJKiBnZGJzZXJ2ZXIvbG93LXN1bjMuYzogTmV3IGZpbGUuCisJKiBnZGJzZXJ2ZXIvTWFrZWZpbGUuaW4sIGNvbmZpZy9tNjhrL3N1bjMubWg6IENoYW5nZSBhY2NvcmRpbmdseS4KKworCSogUmVuYW1lIGZpbGVzIGZvciAxNC1jaGFyYWN0ZXIgbGltaXRzOgorCWdkYnNlcnZlci9yZW1vdGUtZ3V0aWxzLmMgLT4gZ2Ric2VydmVyL3V0aWxzLmMKKwlnZGJzZXJ2ZXIvcmVtb3RlLWluZmxvdy5jIC0+IGdkYnNlcnZlci9sb3ctbHlueC5jCisJZ2Ric2VydmVyL3JlbW90ZS1pbmZsb3ctc3BhcmMuYyAtPiBnZGJzZXJ2ZXIvbG93LXNwYXJjLmMKKwlnZGJzZXJ2ZXIvcmVtb3RlLXNlcnZlci5jIC0+IGdkYnNlcnZlci9zZXJ2ZXIuYworCXJlbW90ZS1tb25pdG9yLmMgLT4gcmVtb3RlLW1vbi5jCisJKiBNYWtlZmlsZS5pbiwgZ2Ric2VydmVyL01ha2VmaWxlLmluLCBnZGJzZXJ2ZXIvY29uZmlndXJlLmluLAorCWNvbmZpZy9tNjhrL21vbml0b3IubXQsCWNvbmZpZy9pMzg2L2kzODZseW54Lm1oLAorCWNvbmZpZy9zcGFyYy9zdW40b3M0Lm1oOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCisJKiBnZGJzZXJ2ZXIvTWFrZWZpbGUuaW46IFJlbW92ZSBtb3JlIGp1bmsgaW5oZXJpdGVkIGZyb20gZ2RiIE1ha2VmaWxlLgorCitUaHUgQXVnIDI2IDE0OjMyOjUxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBpbmZjbWQuYywgaW5mZXJpb3IuaCAocnVuX3N0YWNrX2R1bW15KTogSWYgd2Ugc3RvcCBzb21ld2hlcmUKKwliZXNpZGVzIHRoZSBkdW1teSwgcmV0dXJuIDEgcmF0aGVyIHRoYW4gY2FsbGluZyBlcnJvcigpLgorCUxldCBjYWxsZXIgcHJpbnQgdGhlIGVycm9yIG1lc3NhZ2UuICBSZW1vdmUgbmFtZSBhcmd1bWVudC4KKwkqIHZhbG9wcy5jIChjYWxsX2Z1bmN0aW9uX2J5X2hhbmQpOiBEZWFsIHdpdGggY2hhbmdlcyB0byBjYWxsaW5nCisJc2VxdWVuY2Ugb2YgcnVuX3N0YWNrX2R1bW15LiAgRGlzY2FyZCByZXN0b3JlX2luZmVyaW9yX3N0YXR1cyBjbGVhbnVwCisJaWYgcnVuX3N0YWNrX2R1bW15IHJldHVybnMgMS4KKworCSogVmVyc2lvbiA0LjEwLjIuCisKKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaCAoRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyk6CisJR2V0IHN0cnVjdCByZXR1cm4gYWRkcmVzcyBmcm9tIHYwLCBub3QgYTAuCisKKwkqIGluZnJ1bi5jIChyZXN0b3JlX2luZmVyaW9yX3N0YXR1cyk6IFVzZSBjYXRjaF9lcnJvcnMgd2hlbgorCXJlc3RvcmluZyBzZWxlY3RlZCBmcmFtZS4KKworV2VkIEF1ZyAyNSAyMTo1MjoyNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaW5mcnVuLmMgKHNhdmVfaW5mZXJpb3Jfc3RhdHVzLCByZXN0b3JlX2luZmVyaW9yX3N0YXR1cyk6CisJU2F2ZSBhbmQgcmVzdG9yZSB0aGUgcmVnaXN0ZXJzIHRvby4KKwkqIGluZmVyaW9yLmggKHN0cnVjdCBpbmZlcmlvcl9zdGF0dXMpOiBBZGQgInJlZ2lzdGVycyIuCisKK1R1ZSBBdWcgMjQgMDA6MzY6MTcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGRieHJlYWQuYyAoZW5kX3BzeW10YWIpOiBDbGVhbiB1cCBjb21tZW50LgorCisJKiBmcmFtZS5oLCBzeW10YWIuaCwgZmluZHZhci5jIChyZWFkX3Zhcl92YWx1ZSk6ICBDaGFuZ2UgYmFzZXJlZworCXN1cHBvcnQgdG8gdXNlIExPQ19CQVNFUkVHIHJhdGhlciB0aGFuIFNZTUJPTF9CQVNFUkVHX1ZBTElELgorCSogZHdhcmZyZWFkLmM6IFVzZSBMT0NfQkFTRVJFRyB3aGVyZSBhcHByb3ByaWF0ZS4KKwkqIFZhcmlvdXM6IFN1cHBvcnQgTE9DX0JBU0VSRUcgYW5kIExPQ19CQVNFUkVHX0FSRy4KKworCSogY29mZnJlYWQuYyAoaW5pdF9saW5lbm8sIGluaXRfc3RyaW5ndGFiKTogRG9uJ3QgY2hlY2sgd2hldGhlcgorCXhtYWxsb2MgcmV0dXJuZWQgTlVMTC4KKworCSogY29uZmlnL3ZheC94bS12YXh1bHQuaDogRGVmaW5lIE5PX1BUUkFDRV9ILgorCisJKiB0YXJnZXQuYywgdGFyZ2V0Lmg6IEFkZCAic2V0IHJlbW90ZWRlYnVnIiBjb21tYW5kLgorCSogcmVtb3RlLWJ1Zy5jLCByZW1vdGUuYywgcmVtb3RlLW1pcHMuYzogUmVtb3ZlICJzZXQgcmVtb3RlZGVidWciIGFuZAorCSJzZXQgbTg4a3Nub29wIiBvcHRpb25zIGFuZCB1c2UgZ2VuZXJpYyAic2V0IHJlbW90ZWRlYnVnIiBpbnN0ZWFkLgorCSogTkVXUzogRGVzY3JpYmUgdGhpcyBjaGFuZ2UuCisKK01vbiBBdWcgMjMgMjA6MjY6MjIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGJ1aWxkc3ltLmg6IFJlbW92ZSBkZWNsYXJhdGlvbiBvZiBkYnhyZWFkLmMgZnVuY3Rpb25zLgorCSogc3RhYnNyZWFkLmg6IEdyb3VwIHRvZ2V0aGVyIGRieHJlYWQuYyBmdW5jdGlvbnMuCisJTW92ZSBlbGZzdGFiX2J1aWxkX3BzeW10YWJzIGhlcmUgZnJvbSBzeW1maWxlLmguCisJRGVjbGFyZSBwYXN0YWJfYnVpbGRfcHN5bXRhYnMuCisJKiBlbGZyZWFkLmMsIHBhcmVhZC5jOiBJbmNsdWRlIHN0YWJzcmVhZC5oIChmb3Igc3RhYnNyZWFkX25ld19pbml0CisJZGVjbGFyYXRpb24sIGV0YykuCisKK01vbiBBdWcgMjMgMTc6MTY6MjMgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJKiByZW1vdGUtYnVnLmM6IHJlbmFtZSBxdWlldCB0byBidWc4OGtfc25vb3AuCisJICAoZG91YmxlX3NjYW4sIG11bHRpX3NjYW4pOiBnZW5lcmFsaXplIGRvdWJsZV9zY2FuIGludG8gYSBzY2FuCisJICBmb3IgbXVsdGlwbGUgcGF0dGVybnMuICBSZW5hbWUgdG8gbXVsdGlfc2Nhbi4KKwkgIChidWdfd2FpdCwgYnVnX3dyaXRlX2luZmVyaW9yX21lbW9yeSk6IGFkYXB0IHRvIHVzZSB0aGUgbmV3CisJICBtdWx0aV9zY2FuIGluIG9yZGVyIHRvIGNhdGNoIGFuZCByZXByZXNlbnQgdGFyZ2V0IGJ1cyBlcnJvcnMuCisJICAoYnVnX3NjYW4pOiBjdXJyZW50bHkgdW51c2VkLCBzbyBjb21tZW50IG91dC4KKwkgIChidWdfcXVpZXQpOiByZW1vdmVkLiAgUmVwbGFjZWQgd2l0aCBhIHN0YW5kYXJkIHVzZXIgc2V0dGFibGUgYm9vbGVhbi4KKworCSogbTg4ay10ZGVwLmM6IHJlbW92ZSBpbmNsdWRlIG9mIHN5cy9kaXIuaC4gIEFwcGVhcnMgdW5uZWNlc3NhcnkKKwkgIGFuZCBpc24ndCBhdmFpbGFibGUgb24gc29sYXJpcy4KKworTW9uIEF1ZyAyMyAxNDo1Njo0MiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL204OGsve2RlbHRhODh2NC5tdCxkZWx0YTg4djQubWh9OiBOZXcgZmlsZXMKKwkqIGNvbmZpZy9tODhrL2RlbHRhODgubWg6IEZpeCBjb21tZW50LgorCSogY29uZmlnL204OGsvdG0tZGVsdGE4OC5oOiBSZW1vdmUgdW51c2VkIEJDUyBkZWZpbmUuCisJKiBjb25maWcvbTg4ay97dG0tZGVsdGE4OHY0LmgseG0tZGVsdGE4OHY0Lmgsbm0tZGVsdGE4OHY0Lmh9OgorCU5ldyBmaWxlcy4KKwkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIG04OCotbW90b3JvbGEtc3lzdjQqLgorCSogbTg4ay1uYXQuYzogQWx3YXlzIGluY2x1ZGUgc3lzL3R5cGVzLmg7IGRvbid0IGRlcGVuZCBvbiBVU0cuCisKK01vbiBBdWcgMjMgMTI6NTc6NDIgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBtaXBzcmVhZC5jIChwYXJzZV9zeW1ib2wsIHBhcnNlX3R5cGUsIGNyb3NzX3JlZik6ICBQYXNzIG5hbWUgb2YKKwlzeW1ib2wgYXMgYW4gYXJndW1lbnQgYW5kIHVzZSBpdCBpbiBjb21wbGFpbnRzLgorCSogc3ltbWlzYy5jIChkdW1wX3BzeW10YWIpOiAgRHVtcCBmaWxlbmFtZXMgb2YgZGVwZW5kZW5jaWVzLgorCitNb24gQXVnIDIzIDE5OTMgIFNlYW4gRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKKwkJIGFuZCBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCUFkZCBOZXRCU0Qgc3VwcG9ydDoKKwkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIG5ldGJzZC4KKworU3VuIEF1ZyAyMiAyMjo1MDozMiAxOTkzICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHByZWFkLmMgKGdldF90ZXh0bG93KTogRG9uJ3QgZ28gcGFzdCBhIEtfRU5EIHdoZW4gbG9va2luZyBmb3IgYQorCUtfRlVOQ1RJT04uICBBdm9pZHMgbG9zaW5nIG9uIHNvdXJjZSBmaWxlcyB3aXRoIG5vIGZ1bmN0aW9ucy4gCisKK0ZyaSBBdWcgMjAgMTQ6MDE6MzkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS1uaW5keS5jOiBSZW1vdmUgdW51c2VkIGluY2x1ZGUgb2Ygc3lzL2lvY3RsLmguCisKKwkqIGZyYW1lLmgsIHN5bXRhYi5oOiBSZXZpc2UgY29tbWVudHMgcmVnYXJkaW5nIGJhc2VyZWdzLgorCitGcmkgQXVnIDIwIDE1OjA3OjA1IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogbWlwc3JlYWQuYyAocGFyc2VfcGFydGlhbF9zeW1ib2xzLCBwc3ltdGFiX3RvX3N5bXRhYl8xKToKKwlTZXQgbGFuZ3VhZ2UgZm9yIHBzeW10YWIgYW5kIHN5bXRhYi4KKwkqIG1pcHNyZWFkLmMgKG5ld19zeW1ib2wpOiAgU2V0IGxhbmd1YWdlIGFuZCBpbml0aWFsaXplIGRlbWFuZ2xlZAorCW5hbWUgZm9yIHN5bWJvbC4KKwkqIHN5bW1pc2MuYyAocHJpbnRfc3ltYm9sKTogIFVzZSBTWU1CT0xfU09VUkNFX05BTUUgd2hlbiBwcmludGluZworCXRoZSBzeW1ib2wgdHlwZS4KKwkqIHN5bXRhYi5jIChkZWNvZGVfbGluZV8xKTogIEluaGliaXQgY29yZWR1bXBzIHdpdGggY2Zyb250IGV4ZWN1dGFibGVzLgorCitGcmkgQXVnIDIwIDE0OjAxOjM5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNb3ZlIEtFUk5FTF9VX0FERFIgZnJvbSB4bS1ocDMwMGJzZC5oIHRvIG5tLWhwMzAwYnNkLmggYW5kIG1ha2UKKwlpdCBjb25kaXRpb25hbGl6ZWQgb24gNC4zIHZzLiA0LjQuCisJKiBjb25maWcvbTY4ay9ubS1ocDMwMGJzZC5oOiBNb3ZlIFJFR0lTVEVSX1VfQUREUiBvdXQgb2YgNC4zIGFuZAorCTQuNCBzZWN0aW9uczsgaXQgd2FzIGlkZW50aWNhbCBhbmQgbm93IHdvcmtzIGZvciA0LjQuCisKKwkqIG1pcHMtdGRlcC5jIChpc19kZWxheWVkKTogVXNlIElOU04qQlJBTkNIKiBub3QgQU5ZX0RFTEFZLgorCisJKiBwcmludGNtZC5jIChNQUtFVkFfRU5EKTogVXBkYXRlIHRoaXMgdmVyc2lvbiB0byB1c2UgImFsaWduZXIiLgorCitUaHUgQXVnIDE5IDIyOjA4OjA5IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY29uZmlnL3ZheC90bS12YXguaCAoQkVMSUVWRV9QQ0NfUFJPTU9USU9OKTogIERlZmluZS4KKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3N5bWJvbCwgcGFyc2VfdHlwZSwgY3Jvc3NfcmVmKTogIEhhbmRsZSBjb3JydXB0CisJZmlsZSBpbmRpcmVjdCBlbnRyaWVzIHdpdGggY29tcGxhaW50cyBpbnN0ZWFkIG9mIGNvcmUgZHVtcHMuIFJlbW92ZQorCWNvbXBsYWludCBmb3Igc3RUeXBlZGVmIHdpdGhpbiBhZ2dyZWdhdGVzLgorCitUaHUgQXVnIDE5IDE3OjU4OjM5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb2ZmcmVhZC5jIChwcm9jZXNzX2NvZmZfc3ltYm9sKTogSWdub3JlIHRhZ25hbWVzIGxpa2UgLjBmYWtlLgorCisJKiBjb2ZmcmVhZC5jIChjb2ZmX3JlYWRfZW51bV90eXBlKTogI2lmIDAgb3V0IGNvZGUgd2hpY2ggY2hhbmdlcworCWVudW0ge0ZBTFNFLCBUUlVFfSBpbnRvIGJvb2xlYW4uCisKKwkqIGNvbmZpZy9tNjhrL2RlbHRhNjgubXt0LGh9OiBVc2Ugbm0tZGVsdGE2OC5oLCBldGMuIG5vdAorCW5vbi1leGlzdGVudCBmaWxlcyBubS1kZWx0YS5oLCBldGMuCisJKiBjb25maWcvbTY4ay90bS1kZWx0YTY4Lmg6IERlZmluZSBDQU5OT1RfU1RPUkVfUkVHSVNURVIuCisJKiBkZWx0YTY4LW5hdC5jOiBBZGQgIlswXSIgaW4gb2Zmc2V0b2YgYXJndW1lbnQuCisJKiBkZWx0YTY4LW5hdC5jIChfaW5pdGlhbGl6ZV9rZXJuZWxfdV9hZGRyKTogRG9uJ3QgdHJ5IHRvIHNldCB1cAorCW5sIHdpdGggaW5pdGlhbGl6ZXIsIGp1c3QgYXNzaWduIHRvIGl0LiAgQ2hlY2sgbl9zY251bSBmaWVsZCBvbgorCXJldHVybi4gCisKK1dlZCBBdWcgMTggMjE6NDI6NTIgMTk5MyAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcmVhZC5jIChyZWFkX2hwdXhfc3ltdGFiKTogQ2FsbCBTRVRfTkFNRVNUUklORyBmb3IgS19NT0RVTEUKKwlkZWJ1ZyBzeW1ib2xzLgorCitXZWQgQXVnIDE4IDEyOjAzOjAwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBwcmludGNtZC5jIChwcmludF9hZGRyZXNzKSwgdmFsdWVzLmMgKHZhbHVlX2FzX3BvaW50ZXIpOiBEb24ndAorCXVzZSBBRERSX0JJVFNfUkVNT1ZFLgorCSogZGVmcy5oOiBUcnkgdG8gY2xhcmlmeSBjb21tZW50IGFib3V0IEFERFJfQklUU19SRU1PVkUuCisKKwkqIGJsb2NrZnJhbWUuYyAoYmxvY2tfaW5uZXJtb3N0X2ZyYW1lKTogVW5jb21tZW50LgorCVJldHVybiBOVUxMIGlmIHBhc3NlZCBOVUxMLgorCSogZnJhbWUuaDogRGVjbGFyZSBpdC4KKwkqIGV4cHJlc3Npb24uaCAodW5pb24gZXhwX2VsZW1lbnQpOiBBZGQgZmllbGQgYmxvY2suCisJKiBwYXJzZS5jICh3cml0ZV9leHBfZWx0X2Jsb2NrKTogTmV3IGZ1bmN0aW9uLgorCSogZXhwcmVzc2lvbi5oIChPUF9WQVJfVkFMVUUpOiBOb3cgdGFrZXMgYWRkaXRpb25hbCBzdHJ1Y3QgYmxvY2sgKi4KKwkqICotZXhwLnk6IFdyaXRlIGJsb2NrIGZvciBPUF9WQVJfVkFMVUUuCisJKiBldmFsLmMsIGV4cHByaW50LmMsIHBhcnNlLmM6IERlYWwgd2l0aCBibG9jayBmb3IgT1BfVkFSX1ZBTFVFLgorCSogdmFsb3BzLmMsIHZhbHVlLmggKHZhbHVlX29mX3ZhcmlhYmxlKSwgY2FsbGVyczoKKwlBZGQgc2Vjb25kIGFyZ3VtZW50LCBmb3IgYmxvY2suCisKKwkqIG1haW4uYyAoZ2RiX3JlYWRsaW5lKTogSWYgd2UgcmVhZCBzb21lIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnkgRU9GLAorCXJldHVybiB0aGVtIHJhdGhlciB0aGFuIHJldHVybmluZyBOVUxMLgorCitUdWUgQXVnIDE3IDExOjE0OjI1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBtaXBzLXRkZXAuYzogUmVtb3ZlIHVudXNlZCAjaWZuZGVmIE5VTUVSSUNfUkVHX05BTUVTIGFuZCBhZGQgY29tbWVudC4KKworVHVlIEF1ZyAxNyAxNToxMDowNCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9tODhrL3RtLW04OGsuaDogRml4IHR5cG8gaW4gY29tbWVudC4KKwkgIChGUF9SRUdOVU0pOiBkZWZpbmUgaW4gdGVybXMgb2YgU1BfUkVHTlVNCisJICByYXRoZXIgdGhhbiBieSBhYnNvbHV0ZSBudW1iZXIuICBBbHNvIGNsZWFybHkgY29tbWVudCB0aGF0IHRoaXMKKwkgIGlzIGEgY29udmVuaWVudCBsaWUgaW4gb3JkZXIgdG8gZGVjcmVhc2UgZnV0dXJlIGNvbmZ1c2lvbi4KKwkgIChBQ1RVQUxfRlBfUkVHTlVNKTogbmV3IG1hY3JvIGZvciBGUC4KKwkgIChGUkFNRV9DSEFJTl9WQUxJRCk6IHJlbW92ZWQuICBTdGFuZGFyZCBkZWZhdWx0IHdvcmtzIGZpbmUuCisJKiBtODhrLXRkZXAuYyAoZnJhbWVfY2hhaW5fdmFsaWQpOiByZWR1bmRhbnQsIHNvIHJlbW92ZWQuCisJICAoTkVYVF9QUk9MT0dVRV9JTlNOKTogcmVtb3ZlZCB1bnVzZWQgZm91cnRoIGFyZywgZml4ZWQgYWxsCisJICBjYWxsZXJzLgorCSAgKHJlYWRfbmV4dF9mcmFtZV9yZWcpOiBkZWNsYXJlIHN0YXRpYy4KKwkgIChleGFtaW5lX3Byb2xvZ3VlKTogcmVtb3ZlZCB1bnVzZWQgdmFyaWFiZWwgaW5zbjIsIHJlbmFtZSBpbnNuMQorCSAgdG8gaW5zbiwgcmV3cm90ZSBjb21tZW50IGFib3V0IGZpbmRpbmcgZnAsIHNwLCBldGMuIHNldCBmcmFtZV9mcAorCSAgYmFzZWQgb24gQUNUVUFMX0ZQX1JFR05VTSByYXRoZXIgdGhhbiBGUF9SRUdOVU0gd2hpY2ggaXMKKwkgIGFjdHVhbGx5IGEgc2NhbW1lZCBhbGlhcyBmb3IgU1BfUkVHTlVNIG9uIG04OGsuIAorCisJKiBmcmFtZS5oOiBmaXhlZCB0eXBvIGluIGNvbW1lbnQuCisKK1R1ZSBBdWcgMTcgMTE6MTQ6MjUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIDI5ay1zaGFyZS91ZGkvdWRpcGhjZmcuaDogQWx3YXlzIGluY2x1ZGUgdWRpcGh1bml4Lmggbm90IHVkaXBoZG9zLmguCisKKwkqIGNvbXBsYWludHMuYyAoY29tcGxhaW4pOiBmZmx1c2ggKHN0ZG91dCkgYWZ0ZXIgb3V0cHV0LgorCitUdWUgQXVnIDE3IDAxOjQzOjU1IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogYmxvY2tmcmFtZS5jLCBmcmFtZS5oIChzaWd0cmFtcF9zYXZlZF9wYyk6ICBOZXcgcm91dGluZSB0byBmZXRjaAorCXRoZSBzYXZlZCBwYyBmcm9tIHNpZ2NvbnRleHQgb24gdGhlIHN0YWNrIGZvciBCU0Qgc2lnbmFsIGhhbmRsaW5nLgorCSogY29uZmlnL2kzODYvdG0taTM4NmJzZC5oIChTSUdUUkFNUF9TVEFSVCwgU0lHVFJBTVBfRU5ELCBGUkFNRV9DSEFJTiwKKwlGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTiwgRlJBTUVfU0FWRURfUEMsIFNJR0NPTlRFWFRfUENfT0ZGU0VUKToKKwlEZWZpbmUgdG8gbWFrZSBiYWNrdHJhY2luZyB0aHJvdWdoIHNpZ3RyYW1wIHdvcmsuCisJKiBjb25maWcvdmF4L3RtLXZheC5oIChTSUdUUkFNUF9TVEFSVCwgU0lHVFJBTVBfRU5ELCBUQVJHRVRfVVBBR0VTLAorCUZSQU1FX1NBVkVEX1BDLCBTSUdDT05URVhUX1BDX09GRlNFVCk6ICBEaXR0by4KKworTW9uIEF1ZyAxNiAxMzo1MjoxNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbWFpbi5jIChjZF9jb21tYW5kKTogSWYgY3VycmVudF9kaXJlY3Rvcnkgb24gZW50cnkgaXMgIi8iLCB0aGVuCisJZG9uJ3QgYXBwZW5kIGFuIGV4dHJhIHNsYXNoLgorCURvbid0IGFzc3VtZSB0aGF0IC8uLi8uLiBtZWFucyAvLgorCisJKiB0YXJnZXQuYyAodGFyZ2V0X3hmZXJfbWVtb3J5KTogQ2xlYXIgZXJybm8gYmVmb3JlIGNhbGxpbmcKKwl0b194ZmVyX21lbW9yeS4KKworCSogc3RhY2suYyAoZnJhbWVfaW5mbywgcHJpbnRfZnJhbWVfaW5mbyk6IEFkZCBjb21tZW50IGFib3V0IHVzaW5nCisJdGhlIHN0YXJ0aW5nIHNvdXJjZSBsaW5lIG51bWJlciBvbiBhIGxpbmUgYm91bmRhcnkgaWYgYmFja3RyYWNpbmcKKwl0aHJvdWdoIHNpZ3RyYW1wLgorCitNb24gQXVnIDE2IDA5OjUyOjMzIDE5OTMgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBocHJlYWQuYzogQWRkIFUgVXRhaCBjb250cmlidXRpb24gbm90aWNlLiAgQWRkIFRPRE8gbGlzdC4KKwkoaHBfdHlwZV9sb29rdXApOiBVc2UgVFlQRV9OQU1FIGFuZCBUWVBFX1RBR19OQU1FLgorCShwcm9jZXNzX29uZV9kZWJ1Z19zeW1ib2wpOiBMaWtld2lzZS4KKworTW9uIEF1ZyAxNiAwMjo1NjowMSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGJsb2NrZnJhbWUuYyAoY3JlYXRlX25ld19mcmFtZSwgZ2V0X3ByZXZfZnJhbWVfaW5mbyk6CisJVXNlIHRoZSBmdW5jdGlvbiBuYW1lIHdoZW4gY2FsbGluZyBJTl9TSUdUUkFNUC4KKwkqIGNvbmZpZy9tNjhrL3RtLW02OGsuaCAoU0lHX1BDX0ZQX09GRlNFVCwgU0lHX1NQX0ZQX09GRlNFVCk6CisJRGVmaW5lIGZvciBjb3JyZWN0IGhhbmRsaW5nIG9mIGJhY2h0cmFjZXMgdGhyb3VnaCBfc2lndHJhbXAuCisJKiBtNjhrLXRkZXAuYyAobTY4a19maW5kX3NhdmVkX3JlZ3MpOiAgQWRqdXN0IHNhdmVkIHNwIGZvciBmYWtlCisJc2lndHJhbXAgZnJhbWVzLgorCSogbWlwc3JlYWQuYyAocGFyc2VfdHlwZSk6ICBIYW5kbGUgY29ycnVwdCBUSVIgaW5mbyB3aXRoIGNvbXBsYWludAorCWluc3RlYWQgb2YgY29yZSBkdW1wLgorCSogbWlwc3JlYWQuYyAocGFyc2VfcGFydGlhbF9zeW1ib2xzKTogIFB1dCBzdGF0aWMgc3ltYm9scyBpbnRvIHRoZQorCW1pbWltYWwgc3ltYm9sIHRhYmxlLCB1c2UgcHJvcGVyIG1zdF90eXBlcyBmb3IgYWxsIG1pbmltYWwgc3ltYm9scy4KKwkqIHN0YWNrLmMgKGZyYW1lX2luZm8sIHByaW50X2ZyYW1lX2luZm8pOiAgVXNlIHRoZSBzdGFydGluZyBzb3VyY2UKKwlsaW5lIG51bWJlciBvbiBhIGxpbmUgYm91bmRhcnkgaWYgYmFja3RyYWNpbmcgdGhyb3VnaCBzaWd0cmFtcC4KKworRnJpIEF1ZyAxMyAxNDozNzowNSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS1idWcuYzogaW5jbHVkZSBnZGJjbWQuaC4KKwkgIChzbGVlcCwgcmVtcXVlLCBpbnNxdWUpOiBmb3J3YXJkIGRlY2xzIGFkZGVkLgorCSAgKGJ1Z19mZXRjaF9yZWdpc3RlcnMsIGJ1Z19zdG9yZV9yZWdpc3RlcnMpOiBmb3J3YXJkIGRlY2xzCisJICByZW1vdmVkLgorCSAgKGJ1Z19yZWFkX2luZmVyaW9yX21lbW9yeSwgYnVnX3dyaXRlX2luZmVyaW9yX21lbW9yeSk6IGZvcndhcmQKKwkgIGRlY2xzIGFkZGVkLgorCSAgKHNyZWNfZnJhbWUsIHNyZWNfbWF4X3JldHJpZXMsIHNyZWNfYnl0ZXMsIHNyZWNfZWNob19wYWNlLAorCSAgc3JlY19zbGVlcCwgc3JlY19ub2lzZSk6IG5ldyBzdGF0aWMgdmFyaWFibGVzIGZvciB1c2VyIHNldHRhYmxlCisJICBvcHRpb25zLiAgTW9zdGx5IHRoZXNlIGFyZSBmb3IgZGVidWdnaW5nIGFuZCB0dW5pbmcuICBJIGRvbid0CisJICBleHBlY3QgdGhlbSB0byBzdGF5IHVzZXIgc2V0dGFibGUgb3B0aW9ucyBmb3IgbG9uZy4KKwkgICh0aW1lb3V0KTogY2hhbmdlIGRlZmF1bHQgdG8gNCBzZWNvbmRzLgorCSAgKGNoZWNrX29wZW4pOiBkZWNsYXJlIGZ1bnRpb24gc3RhdGljLCBmb3JjZSByZXR1cm4gdmFsdWUuCisJICAocmVhZGNoYXJfbm9mYWlsKTogaWYgdGltZW91dCwgdGhlbiBzYXkgc28gaWYgbm90IGJlaW5nIHF1aWV0LgorCSAgKHBvbGxjaGFyLCBkb3VibGVfc2NhbiwgYnVnX3NjYW4sIGJ1Z19zcmVjX3dyaXRlX2NyLAorCSAgc3RhcnRfbG9hZCk6IG5ldyBmdW5jdGlvbnMuCisJICAoYnVnX3dhaXQpOiByZXdyaXR0ZW4gdG8gdXNlIGRvdWJsZSBzY2FuLgorCSAgKGV4cGVjdCk6IHdoaWxlICgxKSAtPiBmb3IgKDs7KQorCSAgKGdldF9oZXhfZGlnaXQpOiByZXdyaXRlIGlmIGNvbmRpdGlvbiB0byBhdm9pZCBnY2MgY29tcGxhaW50cy4KKwkgIChidWdfbG9hZCwgYnVnX2NyZWF0ZV9pbmZlcmlvciwgYnVnX29wZW4sIGJ1Z19zdG9yZV9yZWdpc3Rlcik6CisJICByZW1vdmVkIHVudXNlZCB2YXJpYWJsZXMuCisJICAoYnVnX2xvYWQpOiByZXBsYWNlZCBERUxUQSBtYWNybyB3aXRoIHVzZXIgc2V0dGFibGUgc3JlY19mcmFtZQorCSAgdmFyaWFibGUuICBPdGhlciBtaW5vciBsaW50LgorCSAgKGZpbmRfZW5kX29mX3dvcmQsIGlzX2JhdWRyYXRlX3JpZ2h0LCBzZXRfcmF0ZSwgbm90X2J1Z193YWl0LAorCSAgZ2V0aGV4LCB0aW1lZF9yZWFkLCB0cmFuc2xhdGVfYWRkciwgYnVnX2JlZm9yZV9tYWluX2xvb3ApOgorCSAgdW5zdXNlZCBhbmQgcmVtb3ZlZC4KKwkgIChidWdfcmVzdW1lKTogYWRkIG1pc3NpbmcgZmlyc3QgYXJnLCBwaWQuCisJICAoZ2V0X3JlZ19uYW1lKTogdXNlIGlwIHJhdGhlciB0aGFuIGNyMDQuCisJICAoYnVnX3dyaXRlLCBidWdfd3JpdGVfY3IsIGJ1dF9jbGVhcl9icmVha3BvaW50cywgYnVnX3F1aWV0KToKKwkgIGRlY2xhcmUgdHlwZSwgYXJncywgYW5kIGV4cGxpY2l0bHkgcmV0dXJuLgorCSAgKGJ1Z19zdG9yZV9yZWdpc3Rlcik6IHN0cmFpZ2h0ZW4gb3V0IHRoZSBpcCB2cyBjcjA0IGNvbmZ1c2lvbi4KKwkgIChidWdfd3JpdGVfaW5mZXJpb3JfbWVtb3J5KTogcmV3cml0ZSB0byBjb3BlIHdpdGggZXJyb3JzIHdoaWxlCisJICBkb3dubG9hZGluZyBzLXJlY29yZHMuCisJICAoYnVnX3JlYWRfaW5mZXJpb3JfbWVtb3J5KTogZGVjbGFyZSBzdGF0aWMuCisJICAoYnVnX2NsZWFyX2JyZWFrcG9pbnRzKTogZXhwZWN0IG5vYnIgYmVmb3JlIHByb21wdC4KKwkgIChfaW5pdGlhbGl6ZV9yZW1vdGVfYnVnKTogYWRkIGluaXRpYWxpemF0aW9ucyBmb3Igc3JlYy1ieXRlcywKKwkgIHNyZWMtbWF4LXJldHJpZXMsIHNyZWMtZnJhbWUsIHNyZWMtbm9pc2UsIHNyZWMtc2xlZXAsCisJICBzcmVjLWVjaG8tcGFjZS4KKworCSogTWFrZWZpbGUuaW4gKHJlbW90ZS1idWcubyk6IG5ldyBydWxlLgorCSAgKEFMTERFUEZJTEVTKTogYWRkZWQgcmVtb3RlLWJ1Zy5jCisKKwkqIHJlbW90ZS1obXMuYyAoaG1zX3dhaXQpOiB1c2UgLTEgZm9yIHRpbWVvdXQncyB3aGljaCBtZWFucyBibG9jaworCSAgZm9yZXZlciByYXRoZXIgdGhhbiA5OTk5OS4KKworCSogc2VyLXVuaXguYyAoZ2V0X3R0eV9zdGF0ZSk6IGlmIGEgZGVzY3JpcHRvciBpcyBub3QgYSB0dHksIHRoZW4KKwkgIHNpbXBseSBzYXZlIGVuY29kZSB0aGlzIGZhY3QgYXMgdGhlIHByb2Nlc3MgZ3JvdXAgYW5kIHJldHVybgorCSAgc3VjY2VzcyByYXRoZXIgdGhhbiBhbiBlcnJvci4KKwkgIChzZXRfdHR5X3N0YXRlKTogaWYgcHJvY2VzcyBncm91cCBpcyAtMSwgZG8gbm90IHJlc2V0IHRoZQorCSAgcHJvY2VzcyBncm91cC4KKwkgIChoYXJkd2lyZV9yZWFjaGFyKTogY29tbWVudCBjaGFuZ2UuCisKKwkqIHNlcmlhbC5oOiBjb21tZW50IGNoYW5nZS4KKworCSogY29uZmlnL204OGsvdG0tbTg4ay5oOiBjb21tZW50IGNoYW5nZSB0byByZW1vdmUgZW1iZWRkZWQKKwkgIGNvbW1lbnQuCisJICAoU0tJUF9QUk9MT0dVRSk6IHNraXBfcHJvbG9ndWUgcmV0dXJucyBhIHZhbHVlIHdoaWNoIGlzIGV4cGVjdGVkCisJICB0byByZXNldCB0aGUgcGMgYXJndW1lbnQuICBTbyByZXNldCBpdC4KKworRnJpIEF1ZyAxMyAxMDoxNToyNCAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiAgQnVtcCB0byA0LjEwLjEgYWZ0ZXIgcmVsZWFzZSBhbmQgY3ZzCisJdGFnZ2luZy4KKworVGh1IEF1ZyAxMiAyMDo0MDoxNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2Ric2VydmVyL01ha2VmaWxlLmluOiBVc2UgR0RCU0VSVkVSX0xJQlMgYW5kCisJR0RCU0VSVkVSX0RFUEZJTEVTLiAgQWxzbyByZW1vdmUgbXVjaCAoYnV0IG5vdCBhbGwgdGhhdCBjb3VsZCBiZQorCXJlbW92ZWQpIGNydWQgaW5oZXJpdGVkIGZyb20gZ2RiIE1ha2VmaWxlLmluLgorCSogY29uZmlnL2kzODYvaTM4Nmx5bngubWgsIGNvbmZpZy9zcGFyYy9zdW40b3M0Lm1oOiBEZWZpbmUgR0RCU0VSVkVSXyouCisJKiBnZGJzZXJ2ZXIvUkVBRE1FOiBTYXkgaXQgd29ya3Mgb24gU3VuIGFuZCBjaGFuZ2UgY29uZmlndXJhdGlvbgorCWluc3RydWN0aW9ucyBzbGlnaHRseS4KKworV2VkIEF1ZyAxMSAxODo1Njo1OSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9pMzg2L2kzODZ2NC5taDogdXNlIC1sc29ja2V0IGFuZCAtbG5zbCwgZm9yIHJlbW90ZQorCXRhcmdldHMgdGhhdCB1c2UgQlNEIHN0eWxlIG5ldHdvcmsgY29ubmVjdGlvbnMKKworV2VkIEF1ZyAxMSAxNzo1NDoyNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXttb25pdG9yLGJ1Z30uYzogTWFrZSBidWdfb3BzIG5vdCBzdGF0aWMgKGZvcndhcmQgZGVjbGFyYXRpb24KKwlvZiBzdGF0aWNzIGRvZXNuJ3Qgd29yayB3aXRoIFN1bk9TNCAvYmluL2NjKS4KKwlSZW5hbWUgdGhlIG9jY3VycmVuY2UgaW4gcmVtb3RlLW1vbml0b3IuYyB0byBtb25pdG9yX2J1Z19vcHMuCisKK1R1ZSBBdWcgMTAgMTM6MDc6MTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGJsb2NrZnJhbWUuYyAoZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uKSwKKwltaXBzLXRkZXAuYyAoZmluZF9wcm9jX2Rlc2MpOiBEZWFsIHdpdGggInBhdGhvbG9naWNhbCIgY2FzZS4KKworVHVlIEF1ZyAxMCAxNDo1MDozMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogdXRpbHMuYyAod3JhcF9oZXJlKTogQWxsb3cgaW5kZW50IHRvIGJlIE5VTEwuCisJKGZwdXRzX2ZpbHRlcmVkKTogRG9uJ3QgY2hlY2sgZm9yIG51bGwgd3JhcF9pbmRlbnQgKHdyYXBfaGVyZSBub3cKKwlndWFyYW50ZWVzIHRoYXQgaXQgaXNuJ3QsIGFuZCBhbnl3YXkgd2Ugd2VyZSBvbmx5IGNoZWNraW5nIG9uZSBvdXQKKwlvZiB0aGUgdHdvIHBsYWNlcyB3ZSBkZXJlZmVyZW5jZWQgaXQpLgorCisJKiBvYmpmaWxlcy5oIChzdHJ1Y3Qgb2JqZmlsZSk6IENsZWFuIHVwIGNvbW1lbnRzIGZvcgorCXtvYmosc3ltfV9wcml2YXRlIHRvIGNsYXJpZnkgd2hhdCB0aGV5IGFyZSBwcml2YXRlIHRvLgorCitNb24gQXVnICA5IDE2OjQ1OjAwIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKKworCSogc3RhYnNyZWFkLmMsIGJ1aWxkc3ltLmMgKGhhc2huYW1lKTogTW92ZWQgZnVuY3Rpb24gdG8KKwkgIGJ1aWxkc3ltLmMsIGFzIHN1Z2dlc3RlZCBpbiB0aGUgc291cmNlcy4KKworTW9uIEF1ZyAgOSAwOTo1Mzo0NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXVkaS5jOiBNYWtlIHVkaV9vcHMgZXh0ZXJuIHJhdGhlciB0aGFuIHRyeWluZyBmb3J3YXJkCisJZGVjbGFyYXRpb24gb2YgYSBzdGF0aWMgdmFyaWFibGUuCisKKwkqIGhwcGFiLW5hdC5jOiBEZWZpbmUgcHRyYWNlIHRvIGNhbGxfcHRyYWNlIGFuZCBwYXNzIHRoZSA1dGggYXJnCisJdGhlcmUsIHJhdGhlciB0aGFuIHVzaW5nIGFuIEFOU0kgQyBzcGVjaWZpYyBtYWNyby4KKworCSogMjlrLXNoYXJlL3VkaS91ZHIuYzogSW5jbHVkZSBmY250bC5oIG5vdCBzeXMvZmNudGwuaC4gIEFsc28gcHV0CisJc3lzL3R5cGVzLmggbmVhciB0aGUgdG9wIChqdXN0IG9uIGdlbmVyYWwgcHJpbmNpcGxlcykuCisKKwkqIGVudmlyb24uYyAoc2V0X2luX2Vudmlyb24pOiBSZW1vdmUgRzk2MEJBU0UgYW5kIEc5NjBCSU47IHRoZXkgYXJlCisJbm8gbG9uZ2VyIHVzZWQuCisKKwkqIGdkYmNvcmUuaDogTmV3IHZhcmlhYmxlIGdudXRhcmdldC4KKwkqIGNvcmUuYzogQWRkIGNvbW1hbmRzIHRvIHNldCBhbmQgc2hvdyBpdC4KKwkqIENhbGxlcnMgdG8gYmZkXypvcGVuKjogUGFzcyBnbnV0YXJnZXQgaW5zdGVhZCBvZiBOVUxMIGFzIHRhcmdldC4KKwkqIGVudmlyb24uYyAoc2V0X2luX2Vudmlyb24pOiBGb3IgR05VVEFSR0VULCB1c2Ugc2V0X2dudXRhcmdldCBub3QKKwlwdXRlbnYuCisKKwkqIHN5bXRhYi5jIChkZWNvZGVfbGluZV8xKTogR2l2ZSBlcnJvciBvbiB1bm1hdGNoZWQgc2luZ2xlIHF1b3RlLgorCitTdW4gQXVnICA4IDEzOjU5OjQ5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzZXItdW5peC5jIChoYXJkd2lyZV9zZW5kX2JyZWFrKSBbSEFWRV9TR1RUWV06IFVzZSBzZWxlY3Qgbm90IHVzbGVlcC4KKworCSogcmVtb3RlLmM6IEFkZCBjb21tZW50cyBhYm91dCAnZCcsICdyJywgYW5kIHVucmVjb2duaXplZCByZXF1ZXN0cy4KKworCSogaW5mbG93LmMgKHRlcm1pbmFsX2luaXRfaW5mZXJpb3IpOiBEb24ndCBtdWNrIHdpdGggdHR5IHN0YXRlIGlmCisJZ2RiX2hhc19hX3Rlcm1pbmFsKCkgaXMgZmFsc2UuCisKK1N1biBBdWcgIDggMTA6MDc6NDcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGR3YXJmcmVhZC5jIChyZWNvcmRfbWluaW1hbF9zeW1ib2wpOiAgUmVtb3ZlIHByb3RvdHlwZSBhbmQKKwlmdW5jdGlvbi4KKwkqIGR3YXJmcmVhZC5jIChhZGRfcGFydGlhbF9zeW1ib2wpOiAgUmVtb3ZlIGNvZGUgdG8gYWRkIG1pbmltYWwKKwlzeW1ib2xzIGFuZCByZW1vdmUgY29tbWVudCBhYm91dCBsaW1pdGF0aW9ucy4gIEV4cGVyaW1lbnRzIHNob3cKKwl0aGF0IG5vdyB0aGF0IGdkYiBoYW5kbGVzIHRoZSBFTEYgc3ltdGFiIGJldHRlciBmb3IgY3JlYXRpbmcKKwltaW5pbWFsIHN5bWJvbHMsIHRoYXQgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBhZGRlZCBieQorCWV4YW1pbmluZyB0aGUgRFdBUkYgaW5mb3JtYXRpb24sIGFuZCBpbiBmYWN0LCBnaXZlbiB0aGUKKwlsaW1pdGF0aW9ucywgdGhlIERXQVJGIGNvZGUgd2FzIGFjdHVhbGx5IG1ha2luZyB0aGluZ3Mgd29yc2UuCisKK1NhdCBBdWcgIDcgMTA6NTk6MDMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGVsZnJlYWQuYyAoZWxmX3N5bXRhYl9yZWFkKTogIFByb3Blcmx5IHNvcnQgb3V0IHRoZSBic3Mgc3ltYm9scworCWZyb20gdGhlIGRhdGEgc3ltYm9scyBhbmQgZ2l2ZSB0aGVtIHRoZSBjb3JyZWN0IG1pbmltYWxfc3ltYm9sX3R5cGUuCisJQWRkIGZpbGUgc3RhdGljIHN5bWJvbHMgdG8gdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlLCBub3QganVzdAorCWdsb2JhbCBzeW1ib2xzLiAgQWRkIGFic29sdXRlIHN5bWJvbHMgYXMgd2VsbCAobGlrZSBfZWRhdGEsIF9lbmQpLgorCVJlZG8gc3RhYnMtaW4tZWxmIHNwZWNpYWwgc3ltYm9sIGhhbmRsaW5nIG5vdyB0aGF0IGZpbGUgc3RhdGljCisJc3ltYm9scyBhcmUgZW50ZXJlZCBpbnRvIHRoZSBpbnRvIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZS4KKwkqIGR3YXJmcmVhZC5jIChhZGRfcGFydGlhbF9zeW1ib2wpOiAgQWRkIGNvbW1lbnQgYWJvdXQgbGltaXRhdGlvbnMKKwlvZiBEV0FSRiBzeW1ib2xzIGZvciBkaXN0aW5xdWlzaGluZyBkYXRhIGZyb20gYnNzIHdoZW4gYWRkaW5nCisJbWluaW1hbCBzeW1ib2xzLiAgQWRkIGZpbGUgbG9jYWwgc3ltYm9scyB0byBtaW5pbWFsIHN5bWJvbHMuCisKK1RodSBBdWcgIDUgMDg6NTg6NTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHNlci1nbzMyLmM6IERlZmluZSBqb2JfY29udHJvbCB2YXJpYWJsZS4KKworVGh1IEF1ZyAgNSAxNTo1NjoxMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogejhrLWNvZmYgaXMgdGhlIHNhbWUgYXMgejhrLXNpbQorCitUaHUgQXVnICA1IDA4OjU4OjU4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiAyOWstc2hhcmUvdWRpL3VkaXAyc29jLmM6IEluY2x1ZGUgc3lzL3R5cGVzLmggYmVmb3JlIHN5cy9maWxlLmguCisKKwkqIGNvbmZpZy9pMzg2L3RtLWkzODZic2QuaCAoTlVNX1JFR1MpOiAgVGhlcmUgYXJlIG9ubHkgMTAsIG5vdCAxMS4KKworCSogaW5mbG93LmM6IFB1dCBhbGwgdXNlcyBvZiBGX0dFVEZMIGFuZCBGX1NFVEZMIGluICNpZmRlZiBGX0dFVEZMLgorCisJKiAyOWstc2hhcmUvdWRpL3VkaXAyc29jLmM6IEluY2x1ZGUgZmNudGwuaCBub3Qgc3lzL2ZjbnRsLmguCisKK1dlZCBBdWcgIDQgMTg6MzI6MTIgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGluZmxvdy5jIChwYXNzX3NpZ25hbCk6ICBTaWduYWwgaGFuZGxlcnMgdGFrZSBvbmUgaW50IGFyZzsKKwlzdXBwbHkgYW4gdW51c2VkIG9uZSB0byBtYWtlIGl0IHR5cGUgY29tcGF0aWJsZSBhcyBhbiBhcmcgdG8KKwlzaWduYWwoKS4KKworVHVlIEF1ZyAgMyAxODozNDoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaDogSW5jbHVkZSBiZmQuaCBiZWZvcmUgY29mZi9zeW0uaC4KKworVHVlIEF1ZyAgMyAxNTozNDo1NyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEFMTENPTkZJRyk6ICBBZGQgY29uZmlnL2kzODYvaTM4Nm53Lm10LAorCWNvbmZpZy9tNjhrL2RlbHRhNjgubWgsIGNvbmZpZy9tNjhrL2RlbHRhNjgubXQsCisJY29uZmlnL202OGsvZHB4Mi5taCwgY29uZmlnL202OGsvZHB4Mi5tdCwgY29uZmlnL21pcHMvcmlzY29zLm1oLAorCWNvbmZpZy9taXBzL25ld3MtbWlwcy5taC4KKwkqIE1ha2VmaWxlLmluIChBTExQQVJBTSk6ICBBZGQgY29uZmlnL2kzODYvbm0tc3ltbWV0cnkuaCwKKwljb25maWcvaTM4Ni90bS1pMzg2bncuaCwgY29uZmlnL202OGsvbm0tZGVsdGE2OC5oLAorCWNvbmZpZy9tNjhrL3RtLWRlbHRhNjguaCwgY29uZmlnL202OGsveG0tZGVsdGE2OC5oLAorCWNvbmZpZy9tNjhrL25tLWRweDIuaCwgY29uZmlnL202OGsvdG0tZHB4Mi5oLAorCWNvbmZpZy9tNjhrL3htLWRweDIuaCwgY29uZmlnL21pcHMveG0tbWFrZXZhLmguCisJKiBNYWtlZmlsZS5pbiAoQUxMREVQRklMRVMpOiAgQWRkIGRweDItbmF0LmMuCisKK1R1ZSBBdWcgIDMgMTI6MDI6MDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBtaXBzcmVhZC5jOiBVcGRhdGVkIGZvciBCRkQgRUNPRkYgY2hhbmdlcy4gIE5vdyBnZXRzIHRoZQorCXN3YXBwaW5nIHJvdXRpbmVzIGFuZCBleHRlcm5hbCBzdHJ1Y3R1cmUgc2l6ZXMgdmlhIHRoZQorCWVjb2ZmX2JhY2tlbmQgaW5mb3JtYXRpb24uICBObyBsb25nZXIgaW5jbHVkZXMgY29mZi9taXBzLmguCisKK1R1ZSBBdWcgIDMgMTA6NTg6MDQgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChTRklMRVMpOiBBZGQgdGhyZWFkLmMKKworVHVlIEF1ZyAgMyAxMDoyMTo1OCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiByZW1vdGUtc3A2NHNpbS5jIChzaW1pZl9jcmVhdGVfaW5mZXJpb3IpOiBBZGQgRklYTUUgcmVnYXJkaW5nCisJc2ltX3NldF9hcmdzIHJldHVybiBjb2RlLgorCitNb24gQXVnICAyIDE2OjM1OjMxIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBidW1wZWQgdG8gNC45LjQuCisKKwkqIHJlbW90ZS1tb25pdG9yLmM6IHVwZGF0ZWQgY29weXJpZ2h0LgorCSAgKGJ1Z19vcHMsIG1vbml0b3JfZGVzYyk6IG5vdyBzdGF0aWMuCisJICAobW9uaXRvcl9kZXNjKTogaW4gc2V2ZXJhbCBwbGFjZXMsIGNoZWNrIGFuZC9vciBzZXQgdG8gTlVMTC4KKworCSogcmVtb3RlLWhtcy5jIChobXNfZmlsZXNfaW5mbyk6IEFkZCB0aGUgYXBwcm9wcmlhdGUgaXRlbXMgd2hlcmUKKwkgIG1pc3NpbmcgaW4gdGhlIHByaW50ZiBjYWxsLgorCisJKiByZW1vdGUtYnVnLmM6IG5ldyBmaWxlIGZvciBtODhrIGJ1ZyBzdXBwb3J0LgorCisJKiBjb25maWcvbTg4ay9tODhrLm10IChUREVQRklMRVMpOiBhZGRlZCByZW1vdGUtYnVnLm8uCisKK01vbiBBdWcgIDIgMTQ6MjI6MDkgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogaDgzMDAtdGRlcC5jOiAgVXNlIG5ldyB2YXJpYWJsZSBoODMwMGhtb2RlLgorCitNb24gQXVnICAyIDEyOjA2OjAwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiB2YWxvcHMuYyAodHlwZWNtcCk6IElmIHdlIGFyZSBwYXNzaW5nIGEgbm9uLXJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uCisJd2hpY2ggdGFrZXMgYSByZWZlcmVuY2UsIHBhc3MgdGhlIGFkZHJlc3MuCisJKHZhbHVlX2FyZ19jb2VyY2UpOiBEb24ndCB1c2UgQ09FUkNFX0VOVU07IHdlIGRvbid0IHdhbnQgdG8gZGVyZWZlcmVuY2UKKwlyZWZlcmVuY2VzIGhlcmUuCisKKwkqIHRocmVhZC5jICh0aHJlYWRfc3dpdGNoKTogRGVmaW5lIGFzIHN0YXRpYy4KKwkoYWRkX3RocmVhZCk6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20geG1hbGxvYy4KKworCSogZ2RidHlwZXMuYyAoZmlsbF9pbl92cHRyX2ZpZWxkbm8pOiBDYWxsIGNoZWNrX3N0dWJfdHlwZS4KKwkqIGdkYnR5cGVzLntjLGh9OiBJbXByb3ZlIGNvbW1lbnRzIG9uIHZwdHJfZmllbGRuby4KKworTW9uIEF1ZyAgMiAxMTo1ODo1MiAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKKworCSogUkVBRE1FOiAgRWxhYm9yYXRlIG9uIGdkYiBDKysgc3VwcG9ydCBhbmQgY2Zyb250IHN1cHBvcnQuCisKK01vbiBBdWcgIDIgMTE6MzA6NTcgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogaTM4Nmx5bngtbmF0LmMsIHRocmVhZC5jLCB0aHJlYWQuaDogIFVwZGF0ZSBjb3B5cmlnaHRzLgorCitNb24gQXVnICAyIDEyOjA2OjAwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoQUxMREVQRklMRVMpOiBBZGQgaTM4Nmx5bngtbmF0LmMuCisKK01vbiBBdWcgIDIgMDg6NDI6NTAgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogZ2Ric2VydmVyL3JlbW90ZS1pbmZsb3cuYyAoY3JlYXRlX2luZmVyaW9yKTogIEZpeCBjb21tZW50cywgYW5kCisJZXJyb3IgbXNnLiAgU2V0dXAgc2VwZXJhdGUgcHJvY2VzcyBncm91cCBmb3IgY2hpbGQuCisJKiAod3JpdGVfaW5mZXJpb3JfbWVtb3J5KTogIFNsZWVwIGZvciAxIHNlY29uZCBhbmQgcmV0cnkgb24gcHRyYWNlCisJZmFpbHVyZS4KKworU3VuIEF1ZyAgMSAyMjo1ODoxOCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWcvaTM4Ni9pMzg2bHlueC5taCAoTkFUREVQRklMRVMpOiAgRHJvcCBjb3JlZGVwIChmb3Igbm93KS4KKwkqIGNvbmZpZy9pMzg2L25tLWkzODZic2QuaDogIFByb3RlY3QgZnJvbSBtdWx0aXBsZSBpbmNsdXNpb24uCisJKiBjb25maWcvaTM4Ni9ubS1pMzg2bHlueC5oOiAgTG90c2EgbmV3IGhvc3QgcG9ydGluZyBzdHVmZi4KKwkqIGNvbmZpZy9pMzg2L3RtLWkzODZseW54Lmg6ICBEZWZpbmUgU0FWRURfUENfQUZURVJfQ0FMTCBhbmQKKwl0YXJnZXRfcGlkX3RvX3N0ci4KKworCSogTWFrZWZpbGUuaW4gKENMSUJTKTogIFJlb3JkZXIgdG8gbWFrZSBMeW54IGxkIGhhcHB5LgorCSogKEhGSUxFUyk6ICBOZXcgZmlsZSB0aHJlYWQuaC4KKwkqIChPQlMpOiAgTmV3IGZpbGUgdGhyZWFkLmMuCisJKiBjb25maWd1cmUuaW46ICBIb3N0IGNvbmZpZyBmb3IgTHlueC8zODYuCisJKiBmb3JrLWNoaWxkLmMgKGZvcmtfaW5mZXJpb3IpOiAgQ2FsbCBpbml0X3RocmVhZF9saXN0KCkuCisJKiBpbmZydW4uYyAocmVzdW1lKTogIEFkZCBwaWQgdG8gaW52b2NhdGlvbiBvZiB0YXJnZXRfcmVzdW1lKCkuCisJKiAod2FpdF9mb3JfaW5mZXJpb3IpOiBQYXkgYXR0ZW50aW9uIHRvIHBpZCBmcm9tIHRhcmdldF93YWl0KCkuCisJTXVsdGktdGhyZWFkaW5nIGNvZGUgbm93IHVzZXMgdGhpcyB0byBkZXRlcm1pbmUgd2hhdCB0byBkby4KKwkqIGluZnRhcmcuYyAoY2hpbGRfd2FpdCk6ICBDb25kaXRpb25hbGl6ZSBiYXNlZCBvbiBDSElMRF9XQUlUIG1hY3JvLgorCVVzZSB0YXJnZXRfcGlkX3RvX3N0cigpIG1hY3JvIHRocm91Z2hvdXQgd2hlbiBwcmludGluZyBwaWQuCisJKiBpbmZlcmlvci5oIChjaGlsZF9yZXN1bWUpOiAgQWRkIHBpZCB0byBwcm90b3R5cGUuCisJKiBocHBhYi1uYXQuYyBocHBhaC1uYXQuYyBpbmZwdHJhY2UuYyAoY2hpbGRfcmVzdW1lKTogIFBhc3MgaW4gcGlkIGFzCisJYXJndW1lbnQsIGluc3RlYWQgb2YgdXNpbmcgaW5mZXJpb3JfcGlkLgorCSogcHJvY2ZzLmMgKHByb2Nmc19yZXN1bWUpOiAgUGFzcyBpbiBwaWQgYXMgYXJndW1lbnQuICBJZ25vcmVkIGZvcgorCW5vdy4gIFVzZSB0YXJnZXRfcGlkX3RvX3N0cigpIG1hY3JvIHRocm91Z2hvdXQgZm9yIHByaW50aW5nIHByb2Nlc3MgaWQuCisJKiByZW1vdGUtYWRhcHQuYyAoYWRhcHRfcmVzdW1lKTogIFBhc3MgaW4gcGlkIGFzIGFyZ3VtZW50LgorCSogcmVtb3RlLWViLmMgKGViX3Jlc3VtZSk6ICBQYXNzIGluIHBpZCBhcyBhcmd1bWVudC4KKwkqIHJlbW90ZS1lcy5jIChlczE4MDBfcmVzdW1lKTogIFBhc3MgaW4gcGlkIGFzIGFyZ3VtZW50LgorCSogcmVtb3RlLWhtcy5jIChobXNfcmVzdW1lKTogIFBhc3MgaW4gcGlkIGFzIGFyZ3VtZW50LgorCSogcmVtb3RlLW1pcHMuYyAobWlwc19yZXN1bWUpOiAgUGFzcyBpbiBwaWQgYXMgYXJndW1lbnQuCisJKiByZW1vdGUtbW0uYyAobW1fcmVzdW1lKTogIFBhc3MgaW4gcGlkIGFzIGFyZ3VtZW50LgorCSogcmVtb3RlLW1vbml0b3IuYyAobW9uaXRvcl9yZXN1bWUpOiAgUGFzcyBpbiBwaWQgYXMgYXJndW1lbnQuCisJKiByZW1vdGUtbmluZHkuYyAobmluZHlfcmVzdW1lKTogIFBhc3MgaW4gcGlkIGFzIGFyZ3VtZW50LgorCSogcmVtb3RlLXNhLnNwYXJjLmMgKHJlbW90ZV9yZXN1bWUpOiAgUGFzcyBpbiBwaWQgYXMgYXJndW1lbnQuCisJKiByZW1vdGUtc2ltLmMgKHJlbV9yZXN1bWUpOiAgUGFzcyBpbiBwaWQgYXMgYXJndW1lbnQuCisJKiByZW1vdGUtc3A2NHNpbS5jIChzaW1pZl9yZXN1bWUpOiAgUGFzcyBpbiBwaWQgYXMgYXJndW1lbnQuCisJKiByZW1vdGUtc3QuYyAoc3QyMDAwX3Jlc3VtZSk6ICBQYXNzIGluIHBpZCBhcyBhcmd1bWVudC4KKwkqIHJlbW90ZS11ZGkuYyAodWRpX3Jlc3VtZSk6ICBQYXNzIGluIHBpZCBhcyBhcmd1bWVudC4KKwkqIHJlbW90ZS12eC5jICh2eF9yZXN1bWUpOiAgUGFzcyBpbiBwaWQgYXMgYXJndW1lbnQuCisJKiByZW1vdGUtejhrLmMgKHJlbV9yZXN1bWUpOiAgUGFzcyBpbiBwaWQgYXMgYXJndW1lbnQuCisJKiByZW1vdGUuYyAocmVtb3RlX3Jlc3VtZSk6ICBQYXNzIGluIHBpZCBhcyBhcmd1bWVudC4KKwkqIHNvbGliLmMgKHNvbGlkX2NyZWF0ZV9pbmZlcmlvcl9ob29rKTogIFBhc3MgaW5mZXJpb3JfcGlkIHRvCisJdGFyZ2V0X3Jlc3VtZSgpLgorCSogdGFyZ2V0LmMgKG5vcm1hbF9waWRfdG9fc3RyKTogIE5ldyByb3V0aW5lIHRvIHByaW50IG91dCBwcm9jZXNzCisJSUQgbm9ybWFsbHkuCisJKiB0YXJnZXQuaCAoc3RydWN0IHRhcmdldF9vcHMpOiAgQWRkIHBpZCB0byBwcm90b3R5cGUgYXQKKwl0b19yZXN1bWUoKS4gICh0YXJnZXRfcmVzdW1lKTogIEFkZCBwaWQgYXJndW1lbnQuCisJKiAodGFyZ2V0X3BpZF90b19zdHIpOiAgRGVmYXVsdCBkZWZpbml0aW9uIGZvciBub3JtYWwgdHlwZSBwaWRzLgorCSogdGhyZWFkLmgsIHRocmVhZC5jOiAgTmV3IG1vZHVsZXMgZm9yIG11bHRpIHRocmVhZC9wcm9jZXNzIGNvbnRyb2wuCisKK1N1biBBdWcgIDEgMTM6MDI6NDIgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIFJFQURNRTogIFNheSB0aGF0IGJ1Zy1nZGIgaXMgYWxzbyB0aGUgcGxhY2UgdG8gc2VuZCByZXF1ZXN0cworCWZvciBoZWxwIHdpdGggR0RCLgorCitTdW4gQXVnICAxIDA5OjQyOjEzIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAobWFrZS1wcm90by1nZGItMSk6ICBVc2UgLWYgb3B0IG9uIHJtIG9mIE1ha2VmaWxlLgorCSogaDg1MDAtdGRlcC5jOiAgQWRkIHBhcmVucyBhcm91bmQgYSBmZXcgbWFjcm8gYXJncy4KKworRnJpIEp1bCAzMCAxNTo0Mzo0OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogVE9ETzogUmVtb3ZlIGl0ZW1zIGFib3V0IHVuaXgtdG8tdW5peC9yYXBwIGRlYnVnZ2luZyAobm93IHdlCisJaGF2ZSBnZGJzZXJ2ZXIpLCBtb3ZpbmcgeG0gZmlsZXMgdG8gc3ViZGlyZWN0b3J5LCBwdHlwZSB5eWx2YWwsCisJYW5kIGZpbGUtbG9jYWwgc3ltYm9scy4KKworCSogZ2RidHlwZXMuaDogSW1wcm92ZSBjb21tZW50cyBhYm91dCBDKysgbWV0aG9kcy4KKworRnJpIEp1bCAzMCAxNDoxNjozMiAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKKworCSogYy1leHAueTogIEFkZCBtaXNzaW5nIDV0aCBhcmcgZm9yIG9uZSBjYWxsIHRvIGxvb2t1cF9zeW1ib2wsIGNhc3QKKwlOVUxMIGluIGFsbCBvdGhlciBjYWxscyB0byBjb3JyZWN0IHBvaW50ZXIgdHlwZXMuCisKK0ZyaSBKdWwgMzAgMTU6NDM6NDkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwlGcm9tIEplZmZyZXkgTGF3OgorCSogdG0taHBwYS5oIChUQVJHRVRfV1JJVEVfUEMpOiBEZWZpbmUuCisJKiBocHBhLXRkZXAuYyAoaHBwYV9maXhfY2FsbF9kdW1teSk6IElmIGluIGEgc3lzY2FsbCwKKwl0aGVuIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgZHVtbXkgaXRzZWxmIHJhdGhlciB0aGFuCisJdGhlIGFkZHJlc3Mgb2YgJCRkeW5jYWxsLgorCSh0YXJnZXRfd3JpdGVfcGMpOiBOZXcgZnVuY3Rpb24gdG8gc3RvcmUgYSBuZXcgUEMuCisKK0ZyaSBKdWwgMzAgMTI6NTE6MjcgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCQkJICBhbmQgSmltIEtpbmdkb24gKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50X3JlX3NldF9vbmUpOiAgQWx3YXlzIHJlcGFyc2UgYnJlYWtwb2ludAorCWNvbmRpdGlvbnMsIHRoZXkgbWlnaHQgY29udGFpbiBzeW1ib2wgdGFibGUgcmVmZXJlbmNlcy4KKworRnJpIEp1bCAzMCAxMjo1MToyNyAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3N5bWJvbCk6ICBIYW5kbGUgb3BhcXVlIHN0cnVjdCBkZWZpbml0aW9ucyBhbmQKKwl0eXBlIG5hbWluZyBmb3Igc3RUeXBlZGVmIHN5bWJvbHMuCisKK0ZyaSBKdWwgMzAgMTQ6NDQ6MjEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGMtZXhwLnkgKHl5bGV4KTogRGV0ZWN0IEMrKyBuZXN0ZWQgdHlwZXMuCisKK0ZyaSBKdWwgMzAgMTE6MDc6MzcgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogc3A2NC10ZGVwLmMgKHNwYXJjNjRfZnJhbWVfY2hhaW4sIHNwYXJjNjRfZnJhbWVfc2F2ZWRfcGMpOiBEZWxldGVkLgorCShkdW1wX2NjcmVnLCBzcGFyY19wcmludF9yZWdpc3Rlcl9ob29rKTogTmV3IGZucy4KKwkqIHJlbW90ZS1zaW0uaDogTmV3IGZpbGUuCisJKiByZW1vdGUtc3A2NHNpbS5oIChzaW1fKik6IEV4dGVybmFsIGZucy4gIChzaW1pZl8qKTogSW50ZXJuYWwgZm5zLgorCisJKiBjb25maWcvc3BhcmMvc3A2NC5tdDogTmV3IGZpbGUuCisJKiBjb25maWcvc3BhcmMvdG0tc3A2NC5oIChGUkFNRV9DSEFJTiwgRlJBTUVfU0FWRURfUEMpOiBEZWxldGVkLgorCShQUklOVF9SRUdJU1RFUl9IT09LKTogQ2FsbCBuZXcgZm4gc3BhcmNfcHJpbnRfcmVnaXN0ZXJfaG9vay4KKworRnJpIEp1bCAzMCAxMDoxNTowMSAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEFMTENPTkZJRyk6ICBBZGQgY29uZmlnL2kzODYvcHR4Lm1oCisKK0ZyaSBKdWwgMzAgMDg6NTg6MDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwlGcm9tIEouIExhdzoKKwkqIGluZmNtZC5jIChyZWFkX3BjKTogUmVtb3ZlIFBBIHNwZWNpZmljIGNvZGUuCisJKiB0bS1ocHBhLmggKFRBUkdFVF9SRUFEX1BDKTogRGVmaW5lLgorCSogaHBwYS10ZGVwLmMgKHRhcmdldF9yZWFkX3BjKTogTmV3IGZ1bmN0aW9uLgorCisJKiBzeW10YWIuYyAoZ2RiX21hbmdsZV9uYW1lKTogRGVhbCB3aXRoIGl0IGlmIHR5cGUgbGFja3MgYSBuYW1lLgorCitGcmkgSnVsIDMwIDA3OjM2OjUzIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBORVdTOiAgQWRkIG5vdGUgdGhhdCBERUMgYWxwaGEgc3VwcG9ydCBpcyBob3N0IG9ubHksIG5vdCBuYXRpdmUuCisJKiBSRUFETUU6ICBFbXBoYXNpemUgdGhhdCBDKysgc3VwcG9ydCB3b3JrcyBiZXN0IHdpdGggR05VIEMrKyBhbmQKKwlzdGFicyBkZWJ1Z2dpbmcgZm9ybWF0LgorCSogZGVsdGE2OC1uYXQuYzogIEFkZCBtaXNzaW5nIEZTRiBjb3B5cmlnaHQuCisKK0ZyaSBKdWwgMzAgMDg6NTg6MDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHBhcmVhZC5jIChwYV9zeW10YWJfcmVhZCk6IFB1dCBmaWxlLWxvY2FsIHN5bWJvbHMgaW4gbWluaW1hbCBzeW1ib2xzLgorCSogaHBwYS10ZGVwLmMgKGZyYW1lX2NoYWluX3ZhbGlkKTogQ2hlY2sgdGhhdCBvdXIgZnVuY3Rpb24gaGFzIHRoZQorCXNhbWUgYWRkcmVzcyBhcyBfc3RhcnQsIG5vdCB0aGF0IGl0IG11c3QgYmUgdGhlIHNhbWUgc3ltYm9sLgorCitGcmkgSnVsIDMwIDAwOjE4OjQwIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoQUxMREVQRklMRVMpOiAgQWRkIGRlbHRhNjgtbmF0LmMKKwkqIE1ha2VmaWxlLmluIChkZWx0YTY4LW5hdC5vKTogIEFkZCBkZXBlbmRlbmN5LgorCitUaHUgSnVsIDI5IDEyOjA5OjQ2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiB2YWx1ZS5oIChDT0VSQ0VfRU5VTSk6IFVzZSBDT0VSQ0VfUkVGIHRvIGNvZXJjZSByZWZzOyB2YWx1ZV9pbmQKKwl3YXMgYWRlcXVhdGUgaW4gZ2RiIDMuNSBidXQgbm90IG5vdy4KKworCSogdmFsb3BzLmMgKHR5cGVjbXApOiBBbiBhcnJheSBpbiB0MiBtYXRjaGVzIGEgcG9pbnRlciBpbiB0MS4KKworCSogdmFsb3BzLmMgKHR5cGVjbXApOiBXaGVuIGNvbXBhcmluZyB0eXBlMSYgdG8gdHlwZTIsIGNvbXBhcmUKKwl0eXBlMSBhbmQgdHlwZTIgYXMgbGVuaWVudGx5IGFzIGlmIHdlIHdlcmUgY29tcGFyaW5nIHR5cGUxIHRvCisJdHlwZTIuCisKKwkqIGNwLXZhbHByaW50LmMgKGNwbHVzX3ByaW50X3ZhbHVlKTogRG9uJ3QgZHVtcCBjb3JlIGlmIHRoZQorCWJhc2VjbGFzcyBkb2Vzbid0IGhhdmUgYSBuYW1lLgorCSogdmFsdWVzLmMgKHZiX21hdGNoKTogTmV3IGZ1bmN0aW9uLCB3aGljaCBmaW5kcyB0aGUgdmlydHVhbAorCWJhc2UgY2xhc3MgcG9pbnRlciBldmVuIGlmIHRoZSB0eXBlcyBhcmUgbmFtZWxlc3MuCisJKGJhc2VjbGFzc197YWRkcixvZmZzZXR9KTogVXNlIGl0LgorCisJKiBocHBhLXRkZXAuYzogTWFrZSAibWFpbnRlbmFuY2UgcHJpbnQgdW53aW5kIiBjb21tYW5kIGZyb20gb2xkCisJInVud2luZCIgY29tbWFuZC4KKworCSogcmVtb3RlLXVkaS5jOiBSZW1vdmUgdWRpX3RpbWVyLCBjYWxsIHRvIHNpZ2ludGVycnVwdCwgYW5kIGFzc29jaWF0ZWQKKwlvYnNvbGV0ZSBqdW5rIHdoaWNoIGFwcGFyZW50bHkgaGFkIGJlZW4gY29waWVkIGZyb20gdGhlCisJcHJlLXNlcmlhbC5oIHJlbW90ZS5jLCBidXQgd2hpY2ggaXMgbm8gbG9uZ2VyIHVzZWQuCisKK1RodSBKdWwgMjkgMTI6MzY6MjAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChOT05TUkMpOiAgTmVlZCAyOWstc2hhcmUvUkVBRE1FLCBub3QKKwkyOWstc2hhcmUvdWRpL1JFQURNRS4KKworVGh1IEp1bCAyOSAxMjowOTo0NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogcGFyZWFkLmMgKHBhX3N5bWZpbGVfaW5pdCk6IElmIGVycm9yIHJlYWRpbmcgc3RyaW5nIHRhYmxlLCBkb24ndAorCXVzZSBlcnJubyBpbiBjYXNlcyB3aGVyZSBpdCBoYXNuJ3QgYmVlbiBzZXQuCisKKwkqIHNlci11bml4LmMgKGdkYl9zZXRwZ2lkKTogUGFzcyBvdXIgcGlkLCBub3QgMCwgdG8gc2V0cGdpZC4KKworCSogcmVtb3RlLW1vbml0b3IuYyAoX2luaXRpYWxpemVfbW9uaXRvcik6IENvbW1lbnQgb3V0IHVzZSBvZgorCWNvbm5lY3RfY29tbWFuZCwgc2luY2UgY29ubmVjdF9jb21tYW5kIGl0c2VsZiBpcyBjb21tZW50ZWQgb3V0LgorCisJKiByZW1vdGUtbW9uaXRvci5jIChnZW5lcmljX29wZW4pOiBQYXJzZSBhcmd1bWVudHMgdGhlIHNhbWUgd2F5CisJYXMgcmVtb3RlLmMuCisKKwkqIGhwcGEtdGRlcC5jIChwY19pbl9saW5rZXJfc3R1Yik6IEZpeCB1bmNsb3NlZCBjb21tZW50cy4KKworV2VkIEp1bCAyOCAxMzoxOTozNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21pcHMveG0tbWlwcy5oOiBEZWZpbmUgSEFWRV9URVJNSU9TLgorCisJKiBkYnhyZWFkLmMgKHJlY29yZF9taW5pbWFsX3N5bWJvbCk6IERvbid0IHB1dCBnY2NfY29tcGlsZWQgb3IKKwlfX2dudV9jb21waWxlZCogc3ltYm9scyBpbnRvIHRoZSBtaW5pbWFsIHN5bWJvbHMuCisKK1dlZCBKdWwgMjggMDg6MjY6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiByZW1vdGUtbWlwcy5jIChfaW5pdGlhbGl6ZV9yZW1vdGVfbWlwcyk6IEFkZGVkICJ0aW1lb3V0IiBhbmQKKwkicmV0cmFuc21pdC10aW1lb3V0IiB2YXJpYWJsZXMgdG8gc2V0IG1pcHNfcmVjZWl2ZV93YWl0IGFuZAorCW1pcHNfcmV0cmFuc21pdF93YWl0LCByZXNwZWN0aXZlbHkuCisKK1dlZCBKdWwgMjggMDM6NTg6NTggMTk5MyAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBzeW1taXNjLmMgKGR1bXBfbXN5bWJvbHMpOiAgSGFuZGxlIG5ldyBtc3RfZmlsZV8qIHR5cGVzLgorCitUdWUgSnVsIDI3IDEyOjA3OjM4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiByZW1vdGUtdWRpLmM6IFJlbW92ZSBvbGQgY29tbWVudCBhYm91dCBkb3dubG9hZCBub3QgaW1wbGVtZW50ZWQuCisKKwkqIHNlcmlhbC5oLCBzZXIte3VuaXgsZ28zMix0Y3B9LmM6IEFkZCBmbHVzaF9pbnB1dCBhbmQgc2VuZF9icmVhay4KKwkqIG5pbmR5LXNoYXJlLyosIHJlbW90ZS1uaW5keS5jOiBFeHRlbnNpdmUgaGFja2luZyB0byBtYWtlIGl0CisJY29uZm9ybSB0byBHREIgY29udmVudGlvbnMgbGlrZSB1c2luZyBtZW1jcHkgbm90IGJjb3B5LCBzZXJpYWwuaCwKKwlldGMuICBUaGlzIGlzIHRvIG1ha2UgaXQgaG9zdCBvbiBTb2xhcmlzLCBBSVgsIGV0Yy4KKwkqIE1ha2VmaWxlLmluOiBSZWZsZWN0IHJlbW92ZWQgbmluZHktc2hhcmUgZmlsZXMuCisJKiBjb25maWcvaTk2MC9uaW5keTk2MC5tdCAoVERFUEZJTEVTKTogUmVtb3ZlIHR0eWJyZWFrLm8uCisKKwkqIHN0YWNrLmMgKHByaW50X2ZyYW1lX2luZm8pOiBSZXZpc2UgY29tbWVudCBhYm91dCBgcGF0aG9sb2dpY2FsJworCWNhc2UgKHRoZXJlIHdhcyBhIHdyb25nIEZJWE1FIGFib3V0IHRleHQgbGFiZWxzOyBhbHNvIGFzbSgpIGNhbgorCXRyaWdnZXIgdGhpcyBhcyB3ZWxsIGFzIHZlcnNpb25zIG9mIGFyIHdoaWNoIHRydW5jYXRlIC5vIG5hbWVzKS4KKworCSogYnVpbGRzeW0uYyAoc3RhcnRfc3ViZmlsZSk6IElmIGEgLmMgZmlsZSBpbmNsdWRlcyBhIC5DIGZpbGUsIHNldAorCXRoZSBsYW5ndWFnZSBvZiBib3RoIG9mIHRoZW0gdG8gQysrLgorCisJKiBjb25maWcvc3BhcmMveG0tc3VuNG9zNC5oOiBEZWZpbmUgTUVNX0ZOU19ERUNMQVJFRCBhbmQgaW5jbHVkZQorCTxtZW1vcnkuaD4uCisJSW5jbHVkZSA8bWFsbG9jLmg+IHJhdGhlciB0aGFuIGRlY2xhcmluZyBtYWxsb2MgZnVuY3Rpb25zIG91cnNlbGYuCisKKwkqIHNlci11bml4LmMgKHNldF90dHlfc3RhdGUpOiBEb24ndCBpZ25vcmUgZXJyb3JzIHNldHRpbmcgcHJvY2VzcworCWdyb3VwLgorCSogaW5mbG93LmMgKHRlcm1pbmFsX2luZmVyaW9yKTogSWYgYXR0YWNoX2ZsYWcgc2V0LCBpZ25vcmUgZXJyb3JzCisJZnJvbSBzZXRfdHR5X3N0YXRlLgorCisJKiBmb3JrLWNoaWxkLmMgKGZvcmtfaW5mZXJpb3IpOiBPbmx5IHF1b3RlIGV4ZWMgZmlsZSBpZiBuZWVkZWQuCisKKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3N5bWJvbCk6IFJlbW92ZSAyMSBKdWwgOTMgY2hhbmdlIHdpdGgKKwlzdFR5cGVkZWYgaW5zaWRlIGFuIHN0QmxvY2suCisKK1R1ZSBKdWwgMjcgMTI6MzY6NDkgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBicmVha3BvaW50LmMgKGJyZWFrcG9pbnRfMSk6ICBXYWxrIHRoZSBicmVha3BvaW50IGNoYWluIHRvIGRlY2lkZSBpZgorCXdlIGhhdmUgYnJlYWtwb2ludHMgb3Igd2F0Y2hwb2ludHMgYXMgd2UgbWlnaHQgaGF2ZSB0byBpZ25vcmUgaW50ZXJuYWwKKwlicmVha3BvaW50cy4KKworCUZpeCBnZGIgY29yZSBkdW1wcyBhZnRlciBgZmlsZSBuZXdmaWxlJyBjb21tYW5kcy4KKwkqIHN5bXRhYi5oLCBzeW1maWxlLmMgKGNsZWFyX3N5bXRhYl91c2Vycyk6ICBOZXcgcm91dGluZSB3aGljaAorCXVuY29uZGl0aW9uYWxseSBjbGVhcnMgc3ltdGFiIHVzZXJzLiBjbGVhcl9zeW10YWJfdXNlcnNfb25jZQorCWNvbW1lbnRlZCBvdXQgYXMgaXQgd2FzIGEgbm9vcCBhbnl3YXkuCisJKiBvYmpmaWxlcy5jIChmcmVlX29iamZpbGUpOiAgRG9uJ3QgY2FsbCBjbGVhcl9zeW10YWJfdXNlcnNfb25jZS4KKwkqIG9iamZpbGVzLmMgKGZyZWVfYWxsX29iamZpbGVzKSwgc3ltZmlsZS5jIChuZXdfc3ltZmlsZV9vYmpmaWxlKSwKKwl4Y29mZmV4ZWMuYyAoZXhlY19jbG9zZSk6ICBDYWxsIGNsZWFyX3N5bXRhYl91c2VycyBpZiBuZWNlc3NhcnkuCisJKiBzeW1maWxlLmMgKHN5bXNfZnJvbV9vYmpmaWxlKTogIEluc3RhbGwgY2xlYW51cHMgZm9yIGVycm9ycyBkdXJpbmcKKwlzeW1ib2wgcmVhZGluZy4KKwkqIGNvZmZyZWFkLmMsIGRieHJlYWQuYywgbWlwc3JlYWQuYywgeGNvZmZyZWFkLmMgKCpfc3ltZmlsZV9yZWFkKToKKwlMaW50IGNsZWFudXAgY29kZSwgY2FsbCBkb19jbGVhbnVwcyBleHBsaWNpdGx5LgorCSogc3ltZmlsZS5jIChzeW1ib2xfZmlsZV9hZGQpOiAgQ2FsbCBuZXdfc3ltZmlsZV9vYmpmaWxlIGFuZAorCXJlaW5pdF9mcmFtZV9jYWNoZSBfYWZ0ZXJfIHRoZSBuZXcgc3ltYm9scyBhcmUgcmVhZCBpbi4KKworVHVlIEp1bCAyNyAwMTo1NzowMSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3R5cGUpOiAgRG8gbm90IHNldCB0YWcgbmFtZSBmb3IgY29tcGlsZXIKKwlnZW5lcmF0ZWQgZmFrZSB0YWcgbmFtZXMuCisKK01vbiBKdWwgMjYgMTc6MzE6NDkgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWcvbTg4ay9tODhrLm10IChUREVQRklMRVMpOiBhZGQgZXhlYy5vLgorCitNb24gSnVsIDI2IDEzOjE3OjM2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBocHBhLXRkZXAuYzogUmVtb3ZlIGFsbCB1c2VzIG9mIHVzZV91bndpbmQgYW5kIGBzZXQgdXNlX3Vud2luZCcKKwljb21tYW5kLiAgTm93IHdlIHVzZSB1bndpbmQgaW5mbyBieSBkZWZhdWx0IGlmIHdlIGNhbiBmaW5kIGl0LgorCisJKiBjb25maWcvc3BhcmM6IE1vdmUgVkFSSUFCTEVTX0lOU0lERV9CTE9DSyBhbmQgU1VOX0ZJWEVEX0xCUkFDX0JVRworCXRvIHRtLXNwYXJjLmggc28gdGhleSBhcmUgc2hhcmVkIGJldHdlZW4gU29sYXJpcyBhbmQgU3VuT1M0LgorCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpOiBEZWFsIHdpdGggU3VuT1M0IGFjYyBOX1NUU1lNIGFuZAorCU5fR1NZTSBmdW5jdGlvbnMuCisKKwkqIGNvbmZpZy9wYS90bS1ocHBhLmggKFJFR0lTVEVSX05BTUVTKTogVXNlICJmciIgcmF0aGVyIHRoYW4gImZwIgorCWZvciBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMuCisKKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3N5bWJvbCk6IFB1dCBzdFN0YXRpY1Byb2Mgc3ltYm9scyBpbiBtaW5pbWFsCisJc3ltYm9scyBhcyBtc3RfZmlsZV90ZXh0LgorCisJKiBocHBhLXRkZXAuYyAocGNfaW5fbGlua2VyX3N0dWIpOiBSZXR1cm4gMCBpZiBjYW4ndCByZWFkIG1lbW9yeS4KKworCSogc3RhYnNyZWFkLmMgKHJzNjAwMF9idWlsdGluX3R5cGUpOiBNYWtlIGxvZ2ljYWwgdHlwZXMgYmUKKwlUWVBFX0NPREVfQk9PTC4KKworU3VuIEp1bCAyNSAyMzo0MTo0OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC57YyxofSAoc3RydWN0IGJyZWFrcG9pbnQpOiBSZXBsYWNlIHN5bXRhYiBmaWVsZCB3aXRoCisJc291cmNlX2ZpbGUgZmllbGQuCisKK0ZyaSBKdWwgMjMgMDk6NTc6MjUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS5jOiBEb24ndCBlcnJvcigpIG9uIGVycm9ycyB4ZmVycmluZyBtZW1vcnkuCisJKiB0YXJnZXQuaDogQ2xlYW4gdXAgY29tbWVudHMgYWJvdXQgKnhmZXJfbWVtb3J5LgorCisJKiBleGVjLmMsIGNvcmVsb3cuYyAodGFyZ2V0X29wcyBzdHJ1Y3QpOiBEb24ndCBhbGxvdworCXtpbnNlcnQscmVtb3ZlfV9icmVha3BvaW50cyB0byBiZSBkZWZhdWx0ZWQgdG8KKwltZW1vcnlfe2luc2VydF9yZW1vdmV9X2JyZWFrcG9pbnQuCisKKwkqIGRlbWFuZ2xlLmM6IE1ha2UgaXQgc28gYGhlbHAgc2V0IGRlbScgdGVsbHMgeW91IGhvdyB0byBnZXQgdGhlCisJbGlzdCBvZiBkZW1hbmdsaW5nIHN0eWxlcy4KKworVGh1IEp1bCAyMiAxNTo0MTowOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IFVzZSBSRU1PVEVfTyBtYWNybyBub3QgcmVtb3RlLm8uCisJKiBjb25maWcvaTk2MC97bmluZHk5NjAsdnh3b3Jrczk2MH06IERvbid0IHVzZSByZW1vdGUuby4KKworVGh1IEp1bCAyMiAxMjo0MzoyNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvcmVkZXAuYzogSWYgTkVFRF9TWVNfQ09SRV9IIGRlZmluZWQsIGluY2x1ZGUgPHN5cy9jb3JlLmg+CisJKGNhbid0IGluY2x1ZGUgaXQgaW4gbm0tKi5oIGZpbGUgYmVjYXVzZSBpdCBjYXVzZXMgY29uZmxpY3RzIHdpdGgKKwlhLm91dCBzeW1ib2wgZGVmaW5pdGlvbnMpLgorCSogaHAzMDB1eC1uYXQuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiBDb21tZW50ZWQgb3V0OyBvYnNvbGV0ZS4KKwkqIGNvbmZpZy9tNjhrL2hwMzAwaHB1eC5taCAoTkFUREVQRklMRVMpOiBBZGRlZCBjb3JlZGVwLm8gYW5kCisJY29yZWxvdy5vLgorCSogY29uZmlnL202OGsvbm0taHAzMDBocHV4LmggKE5FRURfU1lTX0NPUkVfSCk6IERlZmluZWQuCisJKFJFR0lTVEVSX1VfQUREUik6IERlZmluZWQuCisJKiBjb25maWcvbTY4ay94bS1ocDMwMGhwdXguaCAoSEFWRV9URVJNSU9TKTogRGVmaW5lIGluc3RlYWQgb2YKKwlIQVZFX1RFUk1JTy4KKwkqIGNvbmZpZy9wYS94bS1ocHBhaC5oOiBMaWtld2lzZS4KKworV2VkIEp1bCAyMSAxMTozNzozMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogbWlwc3JlYWQuYyAocGFyc2Vfc3ltYm9sKTogd2hlbiBzdFR5cGVkZWYgYW5kIGZyaWVuZHMgb2NjdXIgd2l0aGluCisJYW4gc3RCbG9jaywgc2tpcCBvdmVyIHRoZSBmaWVsZHMgb2YgdGhlIGlubmVyIG9uZS4KKworCSogbWlwcy10ZGVwLmMgKGluaXRfZXh0cmFfZnJhbWVfaW5mbyk6IElmIGluIGxlbmllbnQgcHJvbG9ndWUsIGNhbGwKKwloZXVyaXN0aWNfcHJvY19kZXNjIHJhdGhlciB0aGFuIGp1c3QgYXNzdW1pbmcgcmVnaXN0ZXJzIG5vdCBzYXZlZC4KKworCSogTWFrZWZpbGUuaW4gKHJlZ2V4Lm8pOiBBZGQgZGVwZW5kZW5jeS4KKworCSogaHBwYXtiLGh9LW5hdC5jOiBXYXJuaW5nLCBub3QgZXJyb3IsIGlmIGNhbid0IGFjY2VzcyByZWdpc3RlcnMuCisKKwkqIGNvbmZpZy9wYS9ocHBhe2IsaH0uaDogRGVmaW5lIEFUVEFDSF9ERVRBQ0guCisKK1dlZCBKdWwgMjEgMDM6MDc6MzAgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb25maWcvbWlwcy94bS1tYWtldmEuaDogIE5ldyBmaWxlIGltcGxlbWVudHMgdmFfbGlzdCBhbGlnbm1lbnQKKwlyZXN0cmljdGlvbnMgZm9yIG1pcHMgaG9zdHMuCisJKiBjb25maWcvbWlwcy97eG0taXJpeDMuaCwgeG0tbWlwcy5oLCB4bS1uZXdzLW1pcHMuaCwgeG0tcmlzY29zLmh9OgorCVVzZSBpdC4KKworV2VkIEp1bCAyMSAwMDoxMTowNSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIG1pcHMtdGRlcC5jIChpbml0X2V4dHJhX2ZyYW1lX2luZm8pOiAgRG8gbm90IGNoZWNrIGZvcgorCW1pcHNfaW5fbGVuaWVudF9wcm9sb2d1ZSBpZiBpdCBpcyBhIGR1bW15IGZyYW1lLgorCSogbWlwc3JlYWQuYyAoZml4dXBfc2lndHJhbXApOiAgSW5pdGlhbGl6ZSBwZHIuYWRyLCBpdCBpcyB1c2VkIGJ5CisJbWlwc19pbl9sZW5pZW50X3Byb2xvZ3VlLgorCitUdWUgSnVsIDIwIDE0OjE0OjU5IDE5OTMgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBocHJlYWQuYyAocmVhZF9ocF9hcnJheV90eXBlKTogSGFuZGxlICJjaGFyIGZvb1tdIi4KKworVHVlIEp1bCAyMCAxMjo1Mzo0NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogbWlwcy10ZGVwLmMgKGhldXJpc3RpY19wcm9jX3N0YXJ0KTogRmlyc3QgdGltZSB3ZSBwcmludCB0aGUKKwl3YXJuaW5nLCBlbGFib3JhdGUuCisJKF9pbml0aWFsaXplX21pcHNfdGRlcCk6IEltcHJvdmUgZG9jc3RyaW5nIGZvciBgc2V0IGhldXInLgorCisJKiBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oOiBSZW1vdmUgY2FsbCB0byBpbnNlcnRfc3RlcF9icmVha3BvaW50LgorCisJKiBzeW10YWIuYyAoZmluZF9saW5lX3N5bXRhYik6IE5ldyBmdW5jdGlvbiwgdG8gZGVhbCB3aXRoIG11bHRpcGxlCisJc3ltdGFicyB3aXRoIHRoZSBzYW1lIG5hbWUuCisJKGZpbmRfbGluZV9wY3ssX3JhbmdlfSk6IFVzZSBpdC4KKwkoZmluZF9wY19zeW10YWIpOiBBZGQgY29tbWVudCBhYm91dCBvdmVybGFwcGluZyBzeW10YWJzLgorCitNb24gSnVsIDE5IDIxOjI5OjE0IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoU0ZJTEVTKTogIEFkZCBubG1yZWFkLmMuCisJKiBNYWtlZmlsZS5pbiAoT0JTKTogIEFkZCBubG1yZWFkLm8uCisJKiBNYWtlZmlsZS5pbiAobmxtcmVhZC5vKTogIEFkZCBuZXcgdGFyZ2V0LgorCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotbmV0d2FyZSk6ICBOZXcgY29uZmlndXJhdGlvbi4KKwkqIG5sbXJlYWQuYywgY29uZmlnL2kzODYve2kzODZudy5tdCwgdG0taTM4Nm53Lmh9OiAgTmV3IGZpbGVzCisJZm9yIE5MTS9OZXRXYXJlIHN1cHBvcnQuCisKK01vbiBKdWwgMTkgMTE6NDg6NTcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIHN5bXRhYi5oIChlbnVtIG1pbmltYWxfc3ltYm9sX3R5cGUpOiBBZGQgbXN0X2ZpbGVfKi4KKwkqIHBhcnRpYWwtc3RhYi5oIFtEQlhSRUFEX09OTFldOiBSZWNvcmQgc3RhdGljcyBpbiBtaW1pbmFsIHN5bWJvbHMuCisJKiBkYnhyZWFkLmMgKHJlY29yZF9taW5pbWFsX3N5bWJvbCk6IERlYWwgd2l0aCBzdGF0aWNzLgorCSogbWluc3ltcy5jIChsb29rdXBfbWluaW1hbF9zeW1ib2wpOiBQcmVmZXIgZXh0ZXJuYWxzIHRvIHN0YXRpY3MuCisKKwkqIGNvbmZpZy9pMzg2L3htLWkzODZzY28uaDogRGVmaW5lIEhBVkVfVEVSTUlPUy4KKworCSogcHJpbnRjbWQuYywgY29uZmlnL3BhL3htLXBhLmgsIGNvbmZpZy9hbHBoYS94bS1hbHBoYS5oOiBNYWtlIGl0IHNvCisJYXJnX2J5dGVzIGZpZWxkIG9mIG1ha2V2YV9saXN0IGlzIGFsd2F5cyBhbGlnbmVkLgorCSogY29uZmlnL3BhL3htLXBhLmg6IE1ha2UgYXJnbGlzdF9hZGRyZXNzIGEgY2hhciAqLgorCisJKiBzZXItdW5peC5jOiBEb24ndCB0cnkgdG8gdXNlIGpvYiBjb250cm9sIHdpdGggdGVybWlvLgorCitTdW4gSnVsIDE4IDIzOjExOjI4IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKwkJCSAgYW5kIEppbSBLaW5nZG9uIChraW5nZG9uQGN5Z251cy5jb20pCisKKwlNYWtlIGJyZWFrcG9pbnRfcmVfc2V0X29uZSB3b3JrIHdpdGggb3ZlcmxvYWRlZCBtZW1iZXIgZnVuY3Rpb25zLAorCWBiIDEyMycgYW5kIGBiIGZvbycgaWYgZm9vIGlzIGEgc3RhdGljIGZ1bmN0aW9uLgorCSogc3ltdGFiLmMgKGRlY29kZV9saW5lXzEsIGRlY29kZV9saW5lXzIpOiAgTmV3IGFyZ3VtZW50IGBjYW5vbmljYWwnCisJdG8gcmV0dXJuIGNhbm9uaWNhbCBsaW5lIHNwZWNzIGlmIHJlcXVlc3RlZCBieSB0aGUgY2FsbGVyLgorCSogYnJlYWtwb2ludC5jLCBzb3VyY2UuYywgc3ltdGFiLmMsIHN5bXRhYi5oOiAgQ2hhbmdlIHByb3RvdHlwZXMgYW5kCisJY2FsbGVycyBhY2NvcmRpbmdseS4KKwkqIHN5bXRhYi5jIChidWlsZF9jYW5vbmljYWxfbGluZV9zcGVjKTogIE5ldyBoZWxwZXIgZnVuY3Rpb24gd2hpY2gKKwljb25zdHJ1Y3RzIHRoZSBjYW5vbmljYWwgbGluZSBzcGVjLgorCSogYnJlYWtwb2ludC5jIChicmVha19jb21tYW5kXzEpOiAgVXNlIGNhbm9uaWNhbCBsaW5lIHNwZWMgaW5zdGVhZAorCW9mIGNvbW1hbmQgc3RyaW5nIGFzIGFkZHJfc3RyaW5nIGlmIG5lY2Vzc2FyeS4KKwkqIHNvdXJjZS5jIChsaW5lX2luZm8pOiAgRml4IHN0b3JhZ2UgbGVhay4KKworU3VuIEp1bCAxOCAxNToyMjo0NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCisKKwkqIGluZnB0cmFjZS5jOiBTcGxpdCBvdXQgZGVmaW5lIG9mIFBUX0tJTEw7IFNlcXVlbnQgZGVmaW5lcyBQVF9LSUxMCisJYnV0IG5vdCB0aGUgb3RoZXJzLgorCSogc3ltbS10ZGVwLmM6IFJlbW92ZSBleGVjX2ZpbGVfY29tbWFuZC4KKwlbX1NFUVVFTlRfXSAocHR4X2NvZmZfcmVnbm9fdG9fZ2RiLCByZWdpc3Rlcl9hZGRyKTogTmV3IGZ1bmN0aW9ucy4KKwlBIGZldyBtaXNjZWxsYW5lb3VzIGNsZWFudXBzLgorCSogc3ltbS1uYXQuYzogUmVuYW1lZCBmcm9tIHN5bW0teGRlcC5jLgorCSogQWxsIHN5bW1ldHJ5IGRlcGVuZGVudCBmaWxlczogTWFueSBjaGFuZ2VzLgorCisJKiBtaXBzLXRkZXAuYyAobWlwc19za2lwX3Byb2xvZ3VlKTogTmV3IGFyZ3VtZW50IGxlbmllbnQuCisJVXNlIHJlYWRfbWVtb3J5X25vYnB0LgorCShpc19kZWxheWVkLCBtaXBzX2luX2xlbmllbnRfcHJvbG9ndWUpOiBOZXcgZnVuY3Rpb25zLgorCShpbml0X2V4dHJhX2ZyYW1lX2luZm8pOiBJZiBpbiB0aGUgcHJvbG9ndWUsIGRvbid0IHVzZSBzYXZlZCByZWdpc3RlcnMuCisJKiBjb25maWcvbWlwcy90bS1taXBzLmg6IERlY2xhcmUgbWlwc19za2lwX3Byb2xvZ3VlLgorCisJKiBwYXJ0aWFsLXN0YWIuaCAoTl9TTyk6IEFkZCB0aGUgdGV4dCBvZmZzZXQgdG8gdmFsdSBiZWZvcmUsIG5vdCBhZnRlciwKKwlwYXNzaW5nIGl0IHRvIEVORF9QU1lNVEFCLgorCitGcmkgSnVsIDE2IDE4OjQ4OjUyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBydGwuY3lnbnVzLmNvbSkKKworCSogc3ltdGFiLmMgKGZpbmRfcGNfc3ltdGFiKTogQ2FsbCB3YXJuaW5nLCBub3QgcHJpbnRmIGRpcmVjdGx5LgorCisJKiBzb2xpYi5jIChzb2xpYl9hZGQpOiBVc2UgeHtyZSxtfWFsbG9jLCBub3Qge3JlLG19YWxsb2MuCisKK0ZyaSBKdWwgMTYgMDk6NTY6NDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBtaXBzcmVhZC5jOiBObyBsb25nZXIgbmVlZCB0byB1bmRlZmluZSBaTUFHSUMuCisKK1RodSBKdWwgMTUgMTg6MDM6MzcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBtODhrLXBpbnNuLmM6IE1vdmVkIGNvZGUgaW50byBvcGNvZGVzL204OGstZGlzLmMuCisJKHByaW50X2luc24pOiBOb3cganVzdCBjYWxscyBwcmludF9pbnNuX204OGsuCisKK1RodSBKdWwgMTUgMTQ6NTQ6MDUgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogaDgzMDAtdGRlcC5jIChleGFtaW5lX3Byb2xvZ3VlKTogTWFrZSBwcm90b3R5cGUgbWF0Y2ggZGVmaW5pdGlvbi4KKworVGh1IEp1bCAxNSAwODozNDo0OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogTkVXUzogTWVudGlvbiB0aGF0IHJlbW90ZS5jIG5vdyBoYXMgYSBgbG9hZCcgb3BlcmF0aW9uLgorCisJKiBocHBhLXRkZXAuYyAocGNfaW5fbGlua2VyX3N0dWIpOiBOZXcgZnVuY3Rpb24uCisJKGZpbmRfcHJvY19mcmFtZXNpemUpOiBSZXR1cm4gMCBmb3IgbGlua2VyIHN0dWJzLgorCShycF9zYXZlZCk6IFRlbGwgdGhlIGNhbGxlciB3aGVyZSBycCBpcyBzYXZlZC4KKwkoZnJhbWVfY2hhaW5fdmFsaWQpOiBSZXR1cm4gMSBmb3IgbGlua2VyIHN0dWJzLgorCShmcmFtZV9zYXZlZF9wYyk6IFVzZSByZXR1cm4gdmFsdWUgZnJvbSBycF9zYXZlZC4KKworCSogc3RhY2suYyAocHJpbnRfZnJhbWVfaW5mbyk6IFdoZW4gY2hlY2tpbmcgUENfSU5fQ0FMTF9EVU1NWSwKKwlwYXNzIHRoZSBzcCByZWxhdGl2ZSB0byB0aGUgZnJhbWUgaW4gcXVlc3Rpb24sIG5vdCB0aGUgc3AgaW4gdGhlCisJaW5uZXJtb3N0IGZyYW1lLgorCitXZWQgSnVsIDE0IDE3OjM3OjAzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBtaXBzcmVhZC5jIChwYXJzZV9wcm9jZWR1cmUpOiBUYWtlIGFzIGFyZ3VtZW50IHRoZSBzeW10YWIgdG8gbG9vaworCXRoZSBuYW1lIHVwIGluLiAgTG9vayBpdCB1cCB3aXRoIG15bG9va3VwX3N5bWJvbCwgbm90IGxvb2t1cF9zeW1ib2wuCisJKHBzeW10YWJfdG9fc3ltdGFiXzEpOiBGb3Igc3RhYnMsIHBhc3MgdGhlIHN5bXRhYiB0byBwYXJzZV9wcm9jZWR1cmUuCisKKwkqIG1pcHNyZWFkLmMgKG15bG9va3VwX3N5bWJvbCk6IFVzZSBzdHJjbXAsIG5vdCBTVFJFUSwgYXMgd2UgaGF2ZQorCWFscmVhZHkgY2hlY2tlZCB0aGUgZmlyc3QgY2hhcmFjdGVycy4KKworCUNoYW5nZXMgZnJvbSBKZWZmcmV5IExhdzoKKwkqIHByaW50Y21kLmMgKG1ha2V2YV9saXN0KTogVXNlIE1BS0VWQV9FWFRSQV9JTkZPIHRvIGRlZmluZQorCW1hY2hpbmUgZGVwZW5kZW50IGZpZWxkcyBpbiB0aGUgbWFrZXZhX2xpc3Qgc3RydWN0dXJlLgorCShtYWtldmFfc2l6ZSk6IEFsbG9jYXRlIGV4dHJhIHNwYWNlIHRvIGhhbmRsZSBnYXBzIG1hZGUgYnkKKwlhbGlnbm1lbnQgcmVzdHJpY3Rpb25zLgorCSogY29uZmlnL3BhL3htLXBhLmggKE1BS0VWQV9FWFRSQV9JTkZPKTogRGVmaW5lLgorCShNQUtFVkFfU1RBUlQpOiBJbml0aWFsaXplIGFyZ2xpc3RfYWRkcmVzcyBmaWVsZC4KKwkoTUFLRVZBX0FSRyk6IEFsd2F5cyBzdG9yZSBhcmd1bWVudHMgb24gbmF0dXJhbCBhbGlnbm1lbnQgCisJYm91bmRhcmllcy4gIFNldCBhcmdsaXN0X2FkZHJlc3MgdG8gdGhlIGFkZHJlc3MgcmlnaHQgYWZ0ZXIKKwl0aGUgYXJncy4gIAorCShNQUtFVkFfRU5EKTogU2ltcGx5IHJldHVybiB0aGUgdmFsdWUgc3RvcmVkIGluIGFyZ2xpc3RfYWRkcmVzcy4KKworV2VkIEp1bCAxNCAxMzo1MTo1NCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY2gtdmFscHJpbnQuYyAoY2hpbGxfdmFsX3ByaW50LCBjYXNlIFRZUEVfQ09ERV9TVFJJTkcpOiBQcmludAorCWFkZHJlc3MsIG5vdCBhZGRyLgorCisJKiBocHBhaC1uYXQuYyAoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogRG9uJ3QgcHJpbnQgaSBpbiBjYXNlcworCXdoZXJlIHdlIGFyZW4ndCB1c2luZyBpdC4KKworCSogYTI5ay10ZGVwLmMgKGdldF9zYXZlZF9yZWdpc3Rlcik6IEZpeCB0eXBvLgorCitXZWQgSnVsIDE0IDA5OjQ1OjUyIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGg4MzAwaCAodmFyaWFudCBvZiBoODMwMCkuCisKK1dlZCBKdWwgMTQgMDk6NDU6NTIgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgc3BhcmM2NC0qLSouCisKK1R1ZSBKdWwgMTMgMTQ6MDM6NDggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzcmVhZC5jIChkZWZpbmVfc3ltYm9sKTogTWFrZSB0aGUgY2FkZHJfdCBoYWNrIGFwcGx5IHRvIGBmdW5jdGlvbgorCXJldHVybmluZyBmb28nIGFzIHdlbGwgYXMgYHBvaW50ZXIgdG8gZm9vJy4KKworCSogcmVtb3RlLmMgW1JFTU9URV9CUkVBS1BPSU5UXTogVXNlIGZvciBicmVha3BvaW50IGluc24gaWYgZGVmaW5lZC4KKwkqIGNvbmZpZy9tNjhrL3RtLW02OGsuaDogRGVmaW5lIGl0LgorCSogbWVtLWJyZWFrLmMsIGJyZWFrcG9pbnQuYzogSW1wcm92ZSBjb21tZW50cy4KKworVHVlIEp1bCAxMyAxMzozNTozMSAxOTkzICBGcmVkZXJpYyBQaWVycmVzdGVndXkgKEYuUGllcnJlc3RlZ3V5QGZyY2wuYnVsbC5mcikKKworCSogY29uZmlnL202OGsvdG0tZHB4Mi5oOiBSZXBsYWNlICJ0bS02OGsuaCIgd2l0aCAibTY4ay90bS1tNjhrLmgiLgorCSogY29uZmlnL202OGsveG0tZHB4Mi5oOiBEZWZpbmUgSEFWRV9URVJNSU9TIG5vdCBIQVZFX1RFUk1JTy4KKworVHVlIEp1bCAxMyAxMTo1MDozOCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBnZGJjb3JlLmggKHJlYWRfbWVtb3J5X2ludGVnZXIsIHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIpOgorCU1ha2UgcHJvdG90eXBlIG1hdGNoIGRlZmluaXRpb24uCisKK1R1ZSBKdWwgMTMgMTE6MTU6MTUgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGVsZnJlYWQuYzogIFJlbW92ZSBub3RpY2UgYWJvdXQgZmlsZSBzdGlsbCBiZWluZyB1bmRlcgorCWNvbnN0cnVjdGlvbi4KKwkqIE1ha2VmaWxlLmluICh1bHRyYTMteGRlcC5vLCB1bWF4LXhkZXAubyk6ICBBZGQgbWlzc2luZyAnKScuCisKK01vbiBKdWwgMTIgMTc6NDY6MzUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGEyOWstdGRlcC5jIChyZWFkX3JlZ2lzdGVyX3N0YWNrKTogTWFrZSB2YWwgc3RhdGljLgorCitNb24gSnVsIDEyIDE0OjEwOjQ4IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9oODMwMC90bS1oODMwMC5oIChSRUdJU1RFUl9DT05WRVJUSUJMRSk6IENoYW5nZSB2YWx1ZSB0byAwLgorCShSRUdJU1RFUl9DT05WRVJUX1RPX1ZJUlRVQUwsIFJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXKTogTW92ZSBkZWYnbiB0bworCXVzdWFsIHNwb3QuCisKK01vbiBKdWwgMTIgMTE6Mjk6NDQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGMtdmFscHJpbnQuYyAoY192YWxfcHJpbnQpOiBGaXggdGhpbmtvIHdpdGggdW5zcGVjaWZpZWQgbGVuZ3RoCisJYXJyYXlzLgorCisJKiBocHBhLXRkZXAuYyAoZmluZF9wcm9jX2ZyYW1lc2l6ZSk6IElmIHRoZXJlIGlzIGEgZnJhbWUgcG9pbnRlciwKKwl1c2UgaXQuCisKK1N1biBKdWwgMTEgMTk6MzU6MDUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN5bXRhYi5jIChkZWNvZGVfbGluZV8xKTogVXNlIGVuZCBvZiBibG9jayB0byBmaWd1cmUgb3V0IHdoZXRoZXIKKwl2YWwuZW5kIGlzIGluIHRoZSBzYW1lIGZ1bmN0aW9uLCBub3QgbWluaW1hbCBzeW1ib2xzLgorCisJKiBzb3VyY2UuYyAobGluZV9pbmZvKTogQWRkIGEgZmV3IG1vcmUgd3JhcF9oZXJlJ3MuCisKKwkqIGkzODYtdGRlcC5jIChpMzg2X2ZvbGxvd19qdW1wKTogRG8gYnl0ZXN3YXBwaW5nIHdoZXJlIG5lZWRlZCBhbmQKKwlkb24ndCBtYWtlIGFzc3VtcHRpb25zIGFib3V0IHNpemVzIG9mIGhvc3QgZGF0YSB0eXBlcy4KKworCSogYmxvY2tmcmFtZS5jLCBzeW10YWIuaCAoZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uKTogTmV3IGFyZyBlbmRhZGRyLgorCSogaW5mcnVuLmMsIGJyZWFrcG9pbnQuYywgcHJpbnRjbWQuYzogQ2hhbmdlIGNhbGxlcnMuCisJKiBwcmludGNtZC5jIChjb250YWluaW5nX2Z1bmN0aW9uX2JvdW5kcyk6IFJlbW92ZS4KKwkqIHByaW50Y21kLmMgKGRpc2Fzc2VtYmxlX2NvbW1hbmQpOiBVc2UgZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uLAorCW5vdCBjb250YWluaW5nX2Z1bmN0aW9uX2JvdW5kcy4KKwkqIGluZmNtZC5jIChzdGVwXzEpOiBVc2UgZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIHJhdGhlciB0aGFuCisJdHJ5aW5nIHRvIHJvbGwgb3VyIG93bi4gIE1vdmUgY2hlY2sgZm9yIGEgcGMgYmV0d2VlbiBTSUdUUkFNUF9TVEFSVCBhbmQKKwlTSUdUUkFNUF9FTkQgaW4gZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uLCBub3Qgc3RlcF8xLgorCisJKiBzcGFyYy10ZGVwLmMgKHNwYXJjX2ZyYW1lX2NoYWluLCBmcmFtZV9zYXZlZF9wYyk6CisJS2VlcCB1bnN3YXBwZWQgdmFsdWUgaW4gYXJyYXkgb2YgY2hhciwgbm90IFJFR0lTVEVSX1RZUEUuCisJVXNlIFJFR0lTVEVSX1JBV19TSVpFIG5vdCBzaXplb2YgKFJFR0lTVEVSX1RZUEUpLgorCShzcGFyY19leHRyYWN0X3N0cnVjdF92YWx1ZV9hZGRyZXNzKTogVXNlIFRBUkdFVF9QVFJfQklUIG5vdAorCXNpemVvZiAoQ09SRV9BRERSKS4KKworVGh1IEp1bCAgMSAxNTo1MDowNSAxOTkzICBGcmVkZXJpYyBQaWVycmVzdGVndXkgKEYuUGllcnJlc3RlZ3V5QGZyY2wuYnVsbC5mcikKKworCSogY29uZmlndXJlLmluIChtNjgqLWJ1bGwtc3lzdiopOiBhZGRlZCBzdXBwb3J0IGZvciBCdWxsIGRweDIuCisJKiBjb25maWcvbTY4ay97dCx4LG59bS1kcHgyLmgsIGRweDItbmF0LmM6IE5ldyBmaWxlcy4KKwkqIGNvbmZpZy9tNjhrL2RweDIubXtoLHR9OiBOZXcgZmlsZXMuCisKK1RodSBKdWwgIDEgMTU6NDY6MTAgMTk5MyAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcmVhZC5jOiBSdW4gdGhyb3VnaCBnbnUtaW5kZW50LgorCitTdW4gSnVsIDExIDEyOjMyOjA4IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9zcGFyYy90bS1zcGFyYy5oIChQUklOVF9SRUdJU1RFUl9IT09LKTogRml4IHR5cG8sIGFkZAorCW1vcmUgcGFyZW5zIGFyb3VuZCBtYWNybyBhcmcuCisKK1NhdCBKdWwgMTAgMDk6NTQ6MTcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGluZnJ1bi5jOiBSZW1vdmUgc3RlcF9yZXN1bWVfe2R1cGxpY2F0ZSxzaGFkb3d9LiAgUmVwbGFjZQorCXN0ZXBfcmVzdW1lX2JyZWFrX2FkZHJlc3Mgd2l0aCBzdGVwX3Jlc3VtZV9icmVha3BvaW50IChub3cgbG9jYWwKKwl0byB3YWl0X2Zvcl9pbmZlcmlvcikuCisJKHtpbnNlcnQscmVtb3ZlfV9zdGVwX2JyZWFrcG9pbnQpOiBSZW1vdmUuCisJKHdhaXRfZm9yX2luZmVyaW9yKTogU2V0IHN0ZXAgcmVzdW1lIGJyZWFrIHdpdGgKKwlzZXRfbW9tZW50YXJ5X2JyZWFrcG9pbnQuICBUZXN0IGhpdHRpbmcgaXQgd2l0aCBicHN0YXRfc3RvcF9zdGF0dXMKKwlhbmQgYnBzdGF0X3doYXQJKHN0b3Bfc3RlcF9yZXN1bWVfYnJlYWsgcmVtb3ZlZCkuCisJKiBicmVha3BvaW50LntoLGN9LCBpbmZydW4uYzogUmV0dXJuIHZhbHVlIGZyb20gYnBzdGF0X3doYXQgbm93IHN0cnVjdAorCXdoaWNoIGluY2x1ZGVzIHByZXZpb3VzIHJldHVybiB2YWx1ZSBhcyBtYWluX2FjdGlvbiwgYW5kIGEgc3RlcF9yZXN1bWUKKwliaXQuCisJKiBicmVha3BvaW50LmMgKGRlbGV0ZV9icmVha3BvaW50KTogSWYgYnJlYWtwb2ludCB3YXMgaW5zZXJ0ZWQsIGFuZAorCXRoZXJlIGlzIGFub3RoZXIgYnJlYWtwb2ludCB0aGVyZSwgaW5zZXJ0IGl0LgorCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogUmVhcnJhbmdlIHRoZSBzcGFnaGV0dGkgYSBiaXQuICBVc2UKKwlhIGZldyBtb3JlIGdvdG9zLgorCVZhcmlvdXM6IENsZWFuIHVwIGFuZCBhZGQgY29tbWVudHMuCisKKwkqIGluZnJ1bi5jIFtUREVTQ106IFJlbW92ZSByZW1haW5pbmcgdGRlc2MgY29kZSAoc2VlIENoYW5nZUxvZworCWZvciBXZWQgTm92IDEzIDE2OjQ1OjEzIDE5OTEpLgorCitGcmkgSnVsICA5IDEyOjM2OjQ2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiB2YWx1ZXMuYywgdmFsdWUuaCAobW9kaWZ5X2ZpZWxkKSwgY2FsbGVyczogTWFrZSBmaWVsZHZhbCBhIExPTkdFU1QuCisKKwkqIGg4MzAwLXRkZXAuYyAoTkVYVF9QUk9MT0dVRV9JTlNOKTogTWFrZSBwd29yZDEgYW4gSU5TTl9XT1JEICoKKwlub3Qgc2hvcnQgKi4KKworCSogZmluZHZhci5jLCBkZWZzLmgKKwkoe2V4dHJhY3Qsc3RvcmV9X3tzaWduZWRfaW50ZWdlcix1bnNpZ25lZF9pbnRlZ2VyLGFkZHJlc3N9KToKKwlOZXcgcm91dGluZXMgdG8gcmVwbGFjZSBTV0FQX1RBUkdFVF9BTkRfSE9TVC4KKwlBbGwgb3ZlcjogQWxsIHVzZXMgb2YgU1dBUF9UQVJHRVRfQU5EX0hPU1Qgb24gaW50ZWdlcnMgcmVwbGFjZWQuCisKKwkqIGNvbmZpZy9zcGFyYy90bS1zcGFyYy5oOiBBZGQgY29tbWVudCBzdWdnZXN0aW5nIHRoYXQgcmVtb3ZpbmcKKwlpbnMgYW5kIGxvY2FscyBmcm9tIHRoZSByZWdpc3RlcnMgYXJyYXkgbWlnaHQgY2xlYW4gdGhpbmdzIHVwLgorCisJKiB1dGlscy5jOiBDbGVhbiB1cCBjb21tZW50cyBhYm91dCB3cmFwIGJ1ZmZlciBhbmQgd3JhcF9oZXJlLgorCSogcHJpbnRjbWQuYyAocHJpbnRmX2NvbW1hbmQpOiBDYWxsIHdyYXBfaGVyZSBiZWZvcmUgdnByaW50Zi4KKworCSogbWlwc3JlYWQuYyAoY3Jvc3NfcmVmKTogU2V0IHRoZSBuYW1lIHRvIHVua25vd24gZm9yICJzdHJ1Y3QgKiIgY2FzZS4KKwlQYXRjaCBmcm9tIHB0ZkBkZWxjYW0uY28udWsgKFBhdWwgRmxpbmRlcnMpLgorCisJKiBhMjlrLXRkZXAuYywgZmluZHZhci5jIChnZXRfc2F2ZWRfcmVnaXN0ZXIpOiBGaXggYnl0ZXN3YXBwaW5nIHNpbnMuCisKK0ZyaSBKdWwgIDkgMDk6NDc6MDIgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBkZWZzLmgsIHJlbW90ZS1lYi5jIChUTV9GSUxFX09WRVJSSURFKTogIFJlbW92ZSBpdC4KKwkqIG1pcHMtdGRlcC5jIChpbml0X2V4dHJhX2ZyYW1lX2luZm8pOiAgU2V0IHByb3BlciBmY2ktPmZyYW1lIGlmIHBjCisJaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkdW1teSBjb2RlLgorCitUaHUgSnVsICA4IDE0OjQ4OjU0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzcGFyYy10ZGVwLmMgKHNwYXJjX3B1c2hfZHVtbXlfZnJhbWUpOiBTa2lwIGFsbCB0aGUgZG9fc2F2ZV9pbnNuCisJc3R1ZmYsIGp1c3Qgd3JpdGUgdGhlIHNwIGFuZCBmcC4KKwkoc3BhcmNfcG9wX2ZyYW1lKTogU2tpcCB0aGUgZG9fcmVzdG9yZV9pbnNuOyB3ZSBhbHJlYWR5IHJlc3RvcmUKKwl0aGUgc3Agd2l0aCB0aGUgb3RoZXIgb3V0IHJlZ2lzdGVycy4KKworCSogaHBwYS10ZGVwLmMgKGhwcGFfcHVzaF9hcmd1bWVudHMpOiBBbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yCisJYXJndW1lbnRzLgorCisJKiBocHBhLXRkZXAuYzogQ2hhbmdlIF9pbml0aWFsaXplX2hwcGFiX3RkZXAgdG8gX2luaXRpYWxpemVfaHBwYV90ZGVwLgorCitUaHUgSnVsICA4IDE0OjQ3OjAwIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIHNwYXJjLXRkZXAuYyAoc3BhcmNfZnJhbWVfY2hhaW4pOiBIYW5kbGUgc2l6ZW9mIChDT1JFX0FERFIpCisJIT0gc2l6ZW9mIChSRUdJU1RFUl9UWVBFKS4KKwkoZnJhbWVfc2F2ZWRfcGMpOiBEaXR0by4KKworVGh1IEp1bCAgOCAwODoyMjowNSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBjb25maWcvaDgzMDAvdG0taDgzMDAuaDogKFJFR0lTVEVSX1RZUEVTKTogQWRqdXN0IGZvciBoOC8zMDBoLgorCShSRUdJU1RFUl9SQVdfU0laRSk6IERpdHRvLgorCShSRUdJU1RFUl9WSVJUVUFMX1RZUEUpOiBVc2UgYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmcgZm9yIHJlZ3MKKwlvbiB0aGUgaDgvMzAwaCAoaW50cyBtYXkgc3RpbGwgYmUgMTYgYml0cykuCisJKEVYVFJBQ1RfUkVUVVJOX1ZBTFVFLCBTVE9SRV9SRVRVUk5fVkFMVUUsCisJRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyk6IEFkZCBGSVhNRSdzIGZvciBoOC8zMDBoLiAgU29tZQorCXRob3VnaHQgbmVlZGVkIGhlcmUuCisKKwkqIGg4MzAwLXRkZXAuYyAocHJpbnRfaW5zbik6IENhbGwgcHJpbnRfaW5zbl9oODMwMGggaWYgaDgvMzAwaC4KKwkoZXhhbWluZV9wcm9sb2d1ZSk6IHJlZ19zYXZlX2RlcHRoIGlzIDQgaWYgaDgvMzAwaC4KKworCSogZmluZHZhci5jIChyZWFkX3JlZ2lzdGVyKTogUHJvdmlkZSBzb21lIHN1cHBvcnQgZm9yIDY0IGJpdCByZWdzLgorCSh3cml0ZV9yZWdpc3Rlcik6IERpdHRvLgorCitXZWQgSnVsICA3IDE0OjMwOjAwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWcvbWlwcy9ubS1yaXNjb3MuaDogbWFjaGluZS9tYWNocGFyYW0uaCBpcyBhbHdheXMgdGhlIHJpZ2h0CisJcGxhY2UgdG8gbG9vayBmb3IgQlNENDNfTkJQRywgbm90IG1hY2hpbmUvdm1wYXJhbS5oCisKKwkqIGluZmNtZC5jIChydW5fc3RhY2tfZHVtbXkpOiBOZXcgYXJndW1lbnQgbmFtZS4KKwlDaGFuZ2UgZXJyb3IgbWVzc2FnZSBpbiAoYW5vdGhlcikgYXR0ZW1wdCB0byBtYWtlIGl0IGNvbXByZWhlbnNpYmxlLgorCSogdmFsb3BzLmMgKGNhbGxfZnVuY3Rpb25fYnlfaGFuZCk6IFBhc3MgbmFtZSB0byBydW5fc3RhY2tfZHVtbXkuCisJKiBzeW10YWIuaDogRGVjbGFyZSBkZW1hbmdsZSBhbmQgYXNtX2RlbWFuZ2xlIHNpbmNlIG1hY3JvcyB1c2UgdGhlbS4KKworCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiBBZGQgY29tbWVudCBhYm91dCBjYWxsaW5nIGEgbWVtYmVyCisJZnVuY3Rpb24gb2YgYSB2YXJpYWJsZSBpbiBhIHJlZ2lzdGVyLgorCisJKiBleHByZXNzaW9uLmg6IENsZWFuIHVwIGNvbW1lbnQgYWJvdXQgc3RyaW5nIGluIFNUUlVDVF9TVFJVQ1QgZXRjLgorCisJKiBjb25maWcve3JzNjAwMC90bS1yczYwMDAuaCxzcGFyYy90bS1zcGFyYy5oLHB5ci90bS1weXIuaH0sCisJaW5mZXJpb3IuaCAoUENfSU5fQ0FMTF9EVU1NWSkgW09OX1NUQUNLXTogQWRkIGNvbW1lbnRzIGFib3V0IHN0YWNrCisJZnJhbWUgdG9wcyBhbmQgYm90dG9tcy4KKworCSogZnJhbWUuaCwgYmxvY2tmcmFtZS5jLCBzdGFjay5jLCBhMjlrLXRkZXAuYywKKwljb25maWcvZ291bGQvdG1wLXtwbixucDF9LmgsCisJY29uZmlnL3tzcGFyYy90bS1zcGFyYy5oLHB5ci90bS1weXIuaCx2YXgvdG0tdmF4Lmh9OiBSZW1vdmUgZmllbGQKKwluZXh0X2ZyYW1lIGZyb20gc3RydWN0IGZyYW1lX2luZm8uICBJdCBoYXMgbm8gcHVycG9zZSBiZXlvbmQKKwktPm5leHQtPmZyYW1lIGFuZCBpcyBhbiBhcnRpZmFjdCBmcm9tIEdEQiAyLjguCisKK1R1ZSBKdWwgIDYgMTE6NTE6MTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBSZW1vdmUgZ2RiIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBvbmUuCisJVXBkYXRlIGluaXQuYyBhdG9taWNhbGx5LgorCisJKiBNYWtlZmlsZS5pbiAoQUxMUEFSQU0pOiBBZGQgY29uZmlnL3thbHBoYS94bS1hbHBoYS5oLHBhL3htLXBhLmh9LgorCShBTExDT05GSUcpOiBBZGQgY29uZmlnL2FscGhhL2FscGhhLW9zZjEubWguCisKKwkqIGluZmNtZC5jIChfaW5pdGlhbGl6ZV9pbmZjbWQpOiBJbiBkb2NzdHJpbmcgZm9yICJjb250aW51ZSIsCisJZGVzY3JpYmUgYXJndW1lbnQgYXMgc2V0dGluZyBpZ25vcmUgY291bnQuCisKK1N1biBKdWwgIDQgMTU6MDQ6NDcgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjeWdudXMuY29tKQorCisJKiBoODMwMC10ZGVwLmMgKGV4YW1pbmVfcHJvbG9ndWUpOiBGaXggY2FsbCB0bworCXJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIuCisKK0ZyaSBKdWwgIDIgMTg6MjI6NTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taXBzL3t4LG59bS1pcml4ezMsNH0uaDogTWFrZSBzb21lIGRlZmluaXRpb25zIGhlcmUKKwlyYXRoZXIgdGhhbiBpbmNsdWRpbmcgeG0tYmlnbWlwcy5oLgorCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cCk6IEltcHJvdmUgZXJyb3IgbWVzc2FnZXMgZm9yIE9QX1RZUEUgYW5kCisJZGVmYXVsdCBjYXNlcy4KKworCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSB5LnRhYi5oLgorCitGcmkgSnVsICAyIDE0OjU1OjQ4IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZXhlYy5jIChleGVjX2ZpbGVfY29tbWFuZCk6ICBSZW1vdmUgTWFyIDI4IGhhY2sgYXMgQkZEIGhhbmRsZXMKKwlmaWxlIHVwZGF0ZXMgcHJvcGVybHkgbm93LgorCSogbWlwc3JlYWQuYyAobWlwc19jb2ZmX25ld19pbml0KTogIEZvcmNlIHJlZXZhbHVhdGlvbiBvZiBzaWd0cmFtcAorCWFkZHJlc3NlcyBpZiBzd2l0Y2hpbmcgdG8gYSBuZXcgc3ltYm9sIGZpbGUuCisJKiBkYnhyZWFkLmMgKHByb2Nlc3Nfb25lX3N5bWJvbCk6ICBBdm9pZCBkZXJlZmVyZW5jaW5nIE5VTEwKKwlzeW1ib2xzIHRoYXQgbWlnaHQgYmUgcmV0dXJuZWQgZnJvbSBkZWZpbmVfc3ltYm9sLgorCitGcmkgSnVsICAyIDEzOjMzOjEyIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwlOZXcgdGFyZ2V0IG1hY3JvcyBmb3IgZ2V0dGluZyBhdCB0aGUgcGMsIHNwIGFuZCBmcC4KKwkqIGluZmNtZC5jIChyZWFkX3BjLCB3cml0ZV9wYyk6ICBNb2RpZnkgdG8gdXNlIG5ldyBtYWNyb3MuCisJKHJlYWRfc3AsIHdyaXRlX3NwLCByZWFkX2ZwLCB3cml0ZV9mcCk6IE5ldyBmdW5jdGlvbnMuCisJKiBibG9ja2ZyYW1lLmMgKHJlaW5pdF9mcmFtZV9jYWNoZSwgZ2V0X3ByZXZfZnJhbWVfaW5mbyk6CisJVXNlIG5ldyBmdW5jdGlvbnMuCisJKiBicmVha3BvaW50LmMgKGJwc3RhdF9hbGxvYyk6IGRpdHRvLgorCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogZGl0dG8uCisJKiBzdGFjay5jIChwcmludF9mcmFtZV9pbmZvKTogZGl0dG8uCisJKiB2YWxvcHMgKGNhbGxfZnVuY3Rpb25fYnlfaGFuZCk6IGRpdHRvLgorCSogY29yZWxvdy5jIChjb3JlX29wZW4pOiBkaXR0by4KKwkqIGg4NTAwLXRkZXAuYzogKHRhcmdldF9yZWFkX3NwLCB0YXJnZXRfd3JpdGVfc3AsIHRhcmdldF9yZWFkX3BjLAorCXRhcmdldF93cml0ZV9wYywgdGFyZ2V0X3JlYWRfZnAsIHRhcmdldF93cml0ZV9mcCk6IE5ldyBmdW5jdGlvbnMuCisJKiBpbmZlcmlvci5oIChyZWFkX3NwLCB3cml0ZV9zcCwgcmVhZF9mcCwgd3JpdGVfZnApOiBQcm90b3R5cGVzLgorCisJKiBjb25maWcvYWxwaGEveG0tYWxwaGEuaDogQWRkIE1BS0VWQV9FTkQuCisJKiBjb25maWcvaDg1MDAvdG0taDg1MDAuaDogRGVmaW5lIG5ldyBtYWNyb3MuCisKK0ZyaSBKdWwgIDIgMTM6NTE6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKG1pcG9zLSotcmlzY29zKik6IE5ldyBob3N0IGFuZCB0YXJnZXQ7IHVzZSByaXNjb3MuCisJKiBjb25maWcvbWlwcy9ubS1yaXNjb3MuaDogSWYgQlNENDNfTkJQRyBpcyBub3QgZGVmaW5lZCBieQorCXZtcGFyYW0uaCwgaW5jbHVkZSBtYWNocGFyYW0uaC4KKwkoS0VSTkVMX1VfQUREUik6IERlZmluZSB0byBiZSBCU0Q0M19VQUREUi4KKworRnJpIEp1bCAgMiAxMzozOTo0OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYy1leHAueSAoeXlsZXgpOiBHaXZlIGVycm9yIGlmIHVubWF0Y2hlZCBzaW5nbGUgcXVvdGUuCisKKwkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL202OGsvKmRlbHRhNjgqLCBkZWx0YTY4LW5hdC5jOiBOZXcgcG9ydC4KKworCSogUmVtb3ZlIHVudXNlZCBTVEFDS19FTkRfQUREUiBpbiB0aGUgZm9sbG93aW5nIGZpbGVzIChpbiBvdGhlcgorCWZpbGVzIGl0IGlzIHVzZWQgZm9yIHNvbWV0aGluZyk6IHRtLW1pcHMuaCwgdG0tc3VuMi5oLCB0bS1uZXdzLmgsCisJdG0tYTI5aywgdG0taTM4NnYuaCwgdG0taHBwYS5oLCB0bS1uaW5keTk2MC5oLCB0bS1hbWl4LmgsCisJdG0taHAzMDBocHV4LmgsIHRtLWlzaS5oLgorCitUaHUgSnVsICAxIDA5OjUxOjI3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBjb25maWcvbWlwcy9ubS1yaXNjb3MuaDogRGVmaW5lIE5CUEcgYW5kIFVQQUdFUy4KKwljb25maWcvbWlwcy94bS1yaXNjb3MuaDogSW5jbHVkZSA8c3lzL3R5cGVzLmg+LgorCisJKiBzZXItdW5peC5jIChoYXJkd2lyZV9ub2ZsdXNoX3NldF90dHlfc3RhdGUpOiBVc2UgYW4gYXNzaWdubWVudCwKKwlub3QgYW4gaW5pdGlhbGl6ZXIsIHRvIGNvcHkgdGhlIHN0cnVjdHVyZS4KKworCSogZ2RidHlwZXMuaCAoc3RydWN0IHR5cGUpOiBBZGQgZmllbGQgdGFnX25hbWUuCisJKiBnZGJ0eXBlcy5jICh0eXBlX25hbWVfbm9fdGFnKSwgYy10eXBlcHJpbnQuYyAoY190eXBlX3ByaW50X2Jhc2UpOgorCVVzZSBpdC4KKwkqIHtjb2ZmLGR3YXJmLG1pcHMsc3RhYnN9cmVhZC5jOiBTZXQgaXQuCisKKwkqIHhtLXN5c3Y0Lmg6IFVuZGVmaW5lIEhBVkVfVEVSTUlPLgorCisJKiBjb25maWcvbWlwcy9ubS1yaXNjb3MuaDogUmVtb3ZlIHVubWF0Y2hlZCAjZW5kaWYuCisJRGVmaW5lIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUy4KKwkqIGNvbmZpZy9taXBzL3Jpc2Nvcy5taDogRG9uJ3QgaW5jbHVkZSBjb3JlZGVwLm87IG1pcHMtbmF0Lm8gaXMgZW5vdWdoLgorCUZpeCBtaXNzcGVsbGluZyBvZiBOQVRfRklMRS4KKwkqIG1pcHMtbmF0LmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogSWYgS0VSTkVMX1VfQUREUiBpcyBub3QgZGVmaW5lZCwKKwl3ZSBjYW4gc3RpbGwgcHJvY2VzcyAibW9kZXJuIiBjb3JlIGZpbGVzLgorCisJKiBzZXItdW5peC5jIChoYXJkd2lyZV9wcmludF90dHlfc3RhdGUpIFtIQVZFX1RFUk1JT1NdOiBEb24ndAorCXByaW50IGNfbGluZS4KKwkoX2luaXRpYWxpemVfc2VyX2hhcmR3aXJlKTogSnVzdCBjaGVjayB3aGV0aGVyIF9QT1NJWF9KT0JfQ09OVFJPTAorCWlzIGRlZmluZWQ7IGRvbid0IGNhcmUgd2hhdCBpdCBpcyBkZWZpbmVkIHRvLgorCitXZWQgSnVuIDMwIDIwOjA2OjQ2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWcvdmF4L3htLXZheHVsdDIuaDogRGVmaW5lIEZEX1NFVCBhbmQgRkRfWkVSTy4KKworVHVlIEp1biAyOSAxMTowMjo1OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaW5mdGFyZy5jOiBSZW1vdmUgdW51c2VkIGluY2x1ZGUgb2YgdGVybWluYWwuaC4KKwkqIHNpZ25hbHMuaDogRG9uJ3QgdW5kZWZpbmUgc2lnbmFscyBhbnltb3JlLgorCSogbWFpbi5jOiBVc2Ugam9iX2NvbnRyb2wgZnJvbSBzZXJpYWwuaC4KKwkqIGZvcmstY2hpbGQuYyAoZm9ya19pbmZlcmlvcik6IFVzZSBnZGJfc2V0cGdpZC4KKwkqIHNlcmlhbC5oLCBzZXItdW5peC5jLCBzZXItZ28zMi5jOiBQcm92aWRlIGdkYl9zZXRwZ2lkLgorCSogdXRpbHMuYyAocXVpdCk6IFVzZSBjdXJyZW50X3RhcmdldC0+dG9fdGVybWluYWxfb3VycyB0byBmaWd1cmUKKwlvdXQgd2hldGhlciB3ZSBjYXJlIGFib3V0IGxhY2sgb2Ygam9iIGNvbnRyb2wsIHJhdGhlciB0aGFuIF9fR08zMl9fLgorCSogdXRpbHMuYzogSW5jbHVkZSBzZXJpYWwuaCBub3QgdGVybWluYWwuaAorCShxdWl0KTogVXNlIGpvYl9jb250cm9sIG5vdCBUSU9DR1BHUlAuCisJKiB0ZXJtaW5hbC5oOiBEb24ndCB1bmRlZmluZSBUSU9DR1BHUlAuCisJKiBzZXJpYWwuaCwgc2VyLXVuaXguYywgc2VyLWdvMzIuYywgc2VyLXRjcC5jOiBBZGQgU0VSSUFMX0ZMVVNIX09VVFBVVC4KKwkqIHV0aWxzLmMgKHF1aXQpOiBVc2UgaXQuCisJKiBzZXJpYWwuaDogQWRkIFNFUklBTF9VTl9GRE9QRU4uCisJKiB1dGlscy5jIChxdWl0KTogVXNlIGl0LgorCSogc2VyLXVuaXguYzogQWRkIHByb2Nlc3MgZ3JvdXAgdG8gdHR5c3RhdGUuCisJW0hBVkVfU0dUVFldOiBBZGQgdGNoYXJzLCBsdGNoYXJzLCBhbmQgbG1vZGUgdG8gdHR5c3RhdGUuCisJKiBpbmZsb3cuYzogSW5jbHVkZSBzZXJpYWwuaCBub3QgdGVybWluYWwuaC4KKwlVc2Ugc2VyaWFsLmggc3R1ZmYgdG8gcmVwbGFjZSBtb3N0IG9mIHRoZSBtYXplIG9mICNpZmRlZidzLgorCSogaW5mbG93LmMsIG1haW4uYywgaW5mZXJpb3IuaDogbWFrZSBnZGJfaGFzX2FfdGVybWluYWwgYSBmdW5jdGlvbi4KKwkqIHNlcmlhbC5oOiBEb2N1bWVudCBTRVJJQUxfU0VUX1RUWV9TVEFURSBhcyBiZWluZyBpbW1lZGlhdGUuCisJKiBzZXItdW5peC5jOiBVc2UgVElPQ1NFVE4gbm90IFRJT0NTRVRQIHNvIGl0IGlzIHRydWUuCisJKiBzZXJpYWwuaCwgc2VyLXVuaXguYywgc2VyLWdvMzIuYywgc2VyLXRjcC5jOgorCUFkZCBTRVJJQUxfUFJJTlRfVFRZX1NUQVRFLCBTRVJJQUxfTk9GTFVTSF9TRVRfVFRZX1NUQVRFLCBhbmQKKwlTRVJJQUxfU0VUX1BST0NFU1NfR1JPVVAuCisJKiBpbmZsb3cuYzogVXNlIHRoZW0uCisJKiBjb25maWcveG0tc3ZyNC5oLCBjb25maWcvcnM2MDAwL3htLXJzNjAwMC5oLCBjb25maWcvc3BhcmMvc3VuNG9zNC5oOgorCURlZmluZSBIQVZFX1RFUk1JT1MuCisJKiBWYXJpb3VzOiBSZW1vdmUgYWxsIHVzZSBvZiBUSU9DKl9CUk9LRU4uCisKK1dlZCBKdW4gMzAgMTI6MjA6NTEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb25maWcvbTY4ay90bS1zdW4zLmggKEJFTElFVkVfUENDX1BST01PVElPTl9UWVBFKTogRGVmaW5lLgorCitUdWUgSnVuIDI5IDEzOjQ0OjQxIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogdGFyZ2V0LmggKHRhcmdldF9kZXRhY2gpOiAgVHVybiBtYWNybyBpbnRvIGZ1bmN0aW9uLgorCSogdGFyZ2V0LmMgKHRhcmdldF9kZXRhY2gpOiAgRGVmaW5lIGl0LCBkbyBkZWZlcnJlZCByZWdpc3RlciBzdG9yZXMKKwliZWZvcmUgY2FsbGluZyB0aGUgcmVhbCB0YXJnZXQgZnVuY3Rpb24uCisKK1R1ZSBKdW4gMjkgMTM6MTU6NDIgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCQkJICBhbmQgSmltIEtpbmdkb24gKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogc3ltdGFiLmggKEJMT0NLX1NIT1VMRF9TT1JUKTogIERvIG5vdCBzb3J0IGJsb2NrcyBjb3JyZXNwb25kaW5nIHRvCisJYSBmdW5jdGlvbiB0byBhdm9pZCBwcmludGluZyBvZiBmdW5jdGlvbiBhcmd1bWVudHMgaW4gd3Jvbmcgb3JkZXIKKwlkdWUgdG8gc29ydGluZy4KKwkqIHN5bWZpbGUuYyAoY29tcGFyZV9zeW1ib2xzKTogIFJlbW92ZSBjb2RlIGZvciBzb3J0aW5nIGFyZ3VtZW50cworCWFzIGJsb2NrcyBjb250YWluaW5nIGFyZ3VtZW50cyBhcmUgbm8gbG9uZ2VyIHNvcnRlZC4KKwkqIHN5bXRhYi5jIChsb29rdXBfYmxvY2tfc3ltYm9sKTogIFVwZGF0ZSBjb21tZW50IGFjY29yZGluZ2x5LgorCitUdWUgSnVuIDI5IDExOjAyOjU4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWcvcGEvdG0taHBwYS5oOiBSZW1vdmUgdW51c2VkIEFSR1NfR1JPV19ET0MuCisJKFJFR19TVFJVQ1RfSEFTX0FERFIpOiBBZGQgY29tbWVudC4KKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogVXNlIGZpbmRfcGNfbGluZSBub3QgZmluZF9wY19zeW10YWIKKwl0byBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLgorCitUdWUgSnVuIDI5IDA4OjI5OjE3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXVkaS5jOiBGaXggZG9jc3RyaW5nIHNvIHRoYXQgaXQgY29tcGlsZXMuCisKKwkqIHJlbW90ZS1taXBzLmMsIHJlbW90ZS1uaW5keS5jOiBtb3ZlIGJmZC5oIGJlZm9yZSBzeW1maWxlLmgKKwkoZm9yIGZpbGVfcHRyKS4KKworVHVlIEp1biAyOSAwOToxMToyNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpOiBJZiB3ZSBmaW5kIGEgTE9DX0JMT0NLIHdoZXJlIHdlCisJZG9uJ3QgZXhwZWN0IGl0LCBjaGFuZ2UgaXQgdG8gTE9DX1NUQVRJQyBzbyBhdCBsZWFzdCB3ZSBkb24ndCBjb3JlZHVtcC4KKworCSogYy10eXBlcHJpbnQuYyAoY190eXBlX3ByaW50X2Jhc2UpOiBEb24ndCBlcnJvcigpIG9uIGludmFsaWQgdHlwZS4KKworCSogc3ltdGFiLmg6IEFkZCBjb21tZW50cyBhYm91dCBsaW5lIG51bWJlcnMuCisJKiBzb3VyY2UuYyAoaWRlbnRpZnlfc291cmNlX2xpbmUpOiBGaXggb2ZmIGJ5IG9uZSBidWcgd2l0aCBsaW5lLgorCitNb24gSnVuIDI4IDE5OjAwOjIxIDE5OTMgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBocHJlYWQuYzogRG8gbm90IGluY2x1ZGUgbGliaHBwYXguICBJbnN0ZWFkIGluY2x1ZGUgbGliaHBwYS5oCisJYW5kIGhwdXgtc3ltdGFiLmguICBNaXNjIGluZGVudGlvbiBmaXhlcy4KKwkoZmluZF91bndpbmRfZW50cnkpOiBBZGQgUEFSQU0gcHJvdG90eXBlLgorCShyZWFkX2hwdXhfc3ltdGFiKTogTW9yZSBmaXhlcyBmb3IgbmFtZXMgYW5kIHNpemVzIG9mIHN0cnVjdHMsCisJdW5pb25zLCBlbnVtcywgdHlwZWRlZnMsIGFuZCB0YWdkZWZzLgorCShyZWFkX2hwX2VudW1fdHlwZSwgcmVhZF9ocF9zdHJ1Y3RfdHlwZSk6IExpa2V3aXNlLgorCShyZWFkX2hwX3NldF90eXBlLCByZWFkX2hwX3N1YnJhbmdlX3R5cGUpOiBMaWtld2lzZS4KKwkoaHBfdHlwZV9sb29rdXAsIHByb2Nlc3Nfb25lX2RlYnVnX3N5bWJvbCk6IExpa2V3aXNlLgorCShwcm9jZXNzX29uZV9kZWJ1Z19zeW1ib2wpOiBTZWFyY2ggZm9yd2FyZCBmcm9tIHRoZSBLX0ZVTkNUSU9OIGZvcgorCXRoZSBmaXJzdCBLX0JFR0lOIHdoZW4gc2V0dGluZyB0aGUgbGluZSBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIGEKKwlmdW5jdGlvbi4gIEF2b2lkIHVubmVjZXNzYXJ5IGNhbGxzIHRvIHNhdmVzdHJpbmcuCisJKGhwX2FsbG9jX3R5cGUpOiBJbml0aWFsaXplIFRZUEVfQ1BMVVNfU1BFQ0lGSUMgaGVyZS4gIFJlbW92ZQorCW1vc3QgY2FzZXMgd2hlcmUgd2Ugc2V0IGl0IGVsc2V3aGVyZS4KKwkoaHBwYV9zeW1fZm5zKTogVXNlICJocHBhIiBpbnN0ZWFkIG9mIGhwcGF4IHNpbmNlIGhwcmVhZC5jIGFuZAorCXBhcmVhZC5jIHVzZSB0aGUgc2FtZSBCRkQgYmFja2VuZCBub3cuICBBbGwgcmVmZXJlbmNlcyBjaGFuZ2VkLgorCShocHV4X3N5bWZpbGVfaW5pdCk6IEFsbG9jYXRlIHNwYWNlIHRvIGhvbGQgdGhlIGRlYnVnZ2luZyBzZWN0aW9uCisJY29udGVudHMgb24gdGhlIHN5bWJvbCBvYnN0YWNrLgorCitNb24gSnVuIDI4IDEwOjA5OjA4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBwcmludGNtZC5jIChtYWtldmEqKTogTmV3IGludGVyZmFjZSwgZm9yIG1ha2luZyBhIHZhX2xpc3QuCisJKHByaW50Zl9jb21tYW5kKTogVXNlIGl0LgorCSogY29uZmlnL204OGsveG0tZGVsdGE4OC5oOiBSZW1vdmUgVlBSSU5URiBkZWZpbmUsIG5vdCBuZWVkZWQuCisJKiBjb25maWcvcGEveG0tcGEuaDogTmV3IGZpbGUuCisJKiBjb25maWcvcGEveG0taHBwYXtiLGh9Lmg6IEluY2x1ZGUgaXQuCisKKwkqIHhjb2ZmcmVhZC5jOiBSZW1vdmUgb2Jzb2xldGUgTk9fVFlQRURFRlMgY29tbWVudC4KKworU3VuIEp1biAyNyAwODo1NDo1NSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIHZhbHByaW50LmMgKHZhbF9wcmludF90eXBlX2NvZGVfaW50KTogIEZpeCBvZmYgYnkgb25lIGVycm9yIHdpdGgKKwllbGltaW5hdGluZyBsZWFkaW5nIHplcm9lcyBmb3IgbGFyZ2UgbGl0dGxlIGVuZGlhbiBpbnRlZ2Vycy4KKworU3VuIEp1biAyNyAwODo1ODo1NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21pcHMvcmlzY29zLm1oIChDQyk6IFVzZSAtc3lzdHlwZSBzeXN2LgorCisJKiBzZXItdW5peC5jOiBNb3ZlICNpbmNsdWRlIG9mIDxzeXMvdGltZS5oPiB0byBIQVZFX1NHVFRZIHNlY3Rpb24uCisKKwkqIE1ha2VmaWxlLmluIChBTExQQVJBTSk6IEFkZCBjb25maWcvbWlwcy97eCxufS17bmV3cy1taXBzLHJpc2Nvc30uaC4KKworRnJpIEp1biAyNSAxMToyMjoyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL202OGsvdG0tbTY4ay5oOiBSZW1vdmUgb2Jzb2xldGUgY29tbWVudCBhYm91dCBkdXBsaWNhdGluZworCUNBTExfRFVNTVkgYmV0d2VlbiBkaWZmZXJlbnQgNjhrIG1hY2hpbmVzLgorCitGcmkgSnVuIDI1IDE3OjAyOjQ1IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGdkYnNlcnZlci9NYWtlZmlsZS5pbjogIEFkZCBkZXBlbmRhbmNpZXMgb24gc2VydmVyLmguCisJKiBnZGJzZXJ2ZXIvcmVtb3RlLWd1dGlscy5jOiAgUmVtb3ZlIGxvdHMgb2YgdW51c2VkIGZ1bmN0aW9ucyBhbmQKKwl2YXJpYWJsZXMuCisJKiBnZGJzZXJ2ZXIvcmVtb3RlLWluZmxvdy5jOiAgUmVtb3ZlIGxvdHMgb2YgdW51c2VkIHZhcmlhYmxlcyBhbmQKKwkjaW5jbHVkZXMuICBBbHNvLCB1c2UgUFRSQUNFXyogc3ltYm9scyBpbnN0ZWFkIG9mIGNvbnN0YW50cy4gCisJKG15d2FpdCk6ICBTdXJyb3VuZCBjYWxscyB0byB3YWl0KCkgd2l0aCBlbmFibGUvZGlzYWJsZV9hc3luY19pbygpCisJc28gdGhhdCB3ZSBjYW4gYmUgaW50ZXJydXB0ZWQgZnJvbSBHREIgd2hpbGUgd2FpdGluZyBmb3IgdGhlCisJY2hpbGQuICBBbHNvLCBoYW5kbGUgY2hpbGQgZXhpdCBtb3JlIGdyYWNlZnVsbHkuCisJKiBnZGJzZXJ2ZXIvcmVtb3RlLXNlcnZlci5jOiAgUmVtb3ZlIGxvdHMgb2YgdW51c2VkIHZhcmlhYmxlcy4KKwlNb3ZlIGFsbCBleHRlcm4gZGVmcyBpbnRvIHNlcnZlci5oLiAgUmVkbyBtYWluIGxvb3Agc28gdGhhdAorCWZhaWx1cmUgZnJvbSBnZXRwa3QoKSBjYXVzZXMgY29tbXVuaWNhdGlvbnMgdG8gYmUgcmUtZXN0YWJsaXNoZWQuCisJRml4ICdrJyBjb21tYW5kIHNvIHRoYXQgaXQgcmVzdGFydHMgdGhlIGNoaWxkLgorCSogZ2Ric2VydmVyL3JlbW90ZS11dGlscy5jOiAgUmVtb3ZlIGxvdHMgb2YgdW5sb3ZlZCB2YXJzIGFuZAorCXN1YnJzLiAgTW92ZSBtYW55IGV4dGVybiBkZWNscyBpbnRvIHNlcnZlci5oLiAgKHJlbW90ZV9vcGVuKTogIEZvcgorCXRjcCwgc2VwZXJhdGUgdXNhZ2Ugb2YgcHJvdG8gZmQgZnJvbSBjb25uZWN0ZWQgZmQuICBDbG9zZSBwcm90bworCWZkIGFmdGVyIGdldHRpbmcgY29ubmVjdGlvbi4gIChwdXRwa3QvZ2V0cGt0KTogIFBheSBhdHRlbnRpb24gdG8KKwllcnJvcnMgd2hlbiByZWFkaW5nL3dyaXRpbmcuICBSZXBvcnQgdGhlc2UgdG8gdGhlIGNhbGxlci4gIE5ldworCXJvdXRpbmVzIGlucHV0X2ludGVycnVwdC9lbmFibGVfYXN5bmNfaW8vZGlzYWJsZV9hc3luY19pbyB0byBtYWtlCisJaXQgcG9zc2libGUgdG8gZ2V0IGFuIEkvTyBpbnRlcnJ1cHQgd2hlbiBkYXRhIGFycml2ZXMgZnJvbSB0aGUKKwljb21tIGxpbmsuCisJKiBzZXJpYWwuaDogIE5ldyBmaWxlIHRvIGNvbnRhaW4gY29tbW9uIGRlZnMgZm9yIGFsbCByZW1vdGUgZmlsZXMuCisKK0ZyaSBKdW4gMjUgMTc6MDI6NDUgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLmM6ICBBZGQgYXJnIG5hbWVzIHRvIHByb3RvdHlwZXMsIGluIGEgbW9kZXN0IGVmZm9ydCBhdAorCWNsYXJpZmljYXRpb24uICBBbHNvIGFkZCBwcm90b3R5cGVzIGZvciBzb21lIG5ldyBmdW5jdGlvbnMuCisJKiAocmVtb3RlX3dhaXQpOiAgQmV0dGVyIGVycm9yIHJlcG9ydGluZyBmb3IgJ1QnIHJlc3BvbnNlcy4KKwkqIHNlci1nbzMyLmMgKHN0cm5jYXNlY21wKTogIE1ha2Ugc3RyMSAmIHN0cjIgYmUgY29uc3QuCisJKiAoZG9zX2FzeW5jX2luaXQpOiAgTWFrZSB1c2FnZSBtZXNzYWdlIHJlZmxlY3QgcmVxdWVzdGVkIHBvcnQgIy4KKwkqIHNlci10Y3AuYyAodGNwX29wZW4pOiAgVGVybWluYXRlIGhvc3RuYW1lIHByb3Blcmx5IHRvIHByZXZlbnQKKwlyYW5kb20gaG9zdG5hbWUgbG9va3VwIGZhaWx1cmVzLiAgQWRkIG5pY2VyIG1lc3NhZ2UgZm9yIHVua25vd24KKwlob3N0IGVycm9yLiAgKHdhaXRfZm9yKTogIFdha2UgdXAgaW4gY2FzZSBvZiBleGNlcHRpb25zLiAgQWxzbywKKwlyZXN0YXJ0IHNlbGVjdCgpIGlmIHdlIGdvdCBFSU5UUi4KKwkqIHNlci11bml4LmMgKHdhaXRfZm9yKTogIFJlc3RhcnQgc2VsZWN0KCkgaWYgd2UgZ290IEVJTlRSLgorCSogc2VyaWFsLmM6IChzZXJpYWxfY2xvc2UpOiAgQ2xlYW4gdXAgY29kZS4KKworRnJpIEp1biAyNSAxMToyMjoyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL202OGsvdG0tbTY4ay5oOiBSZW1vdmUgb2Jzb2xldGUgY29tbWVudCBhYm91dCBkdXBsaWNhdGluZworCUNBTExfRFVNTVkgYmV0d2VlbiBkaWZmZXJlbnQgNjhrIG1hY2hpbmVzLgorCitGcmkgSnVuIDI1IDExOjIyOjI4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoKi50YWIuYyk6IFVzZSAuL2MtZXhwLnRhYi5jIG5vdCBqdXN0IGMtZXhwLnRhYi5jLgorCU1ha2UgY29tbWVudCBleHBsYWluaW5nIHRoaXMgY29tcHJlaGVuc2libGUuCisJKFRBR0ZJTEVTKTogSW5jbHVkZSBBTExERVBGSUxFUy4KKwkoQUxMREVQRklMRVMpOiB1ZGkyc29jLmMgYW5kIHVkci5jIGFyZSBpbiAyOWstc2hhcmUvdWRpLCBub3QKKwkyOWstc2hhcmUvdWRpL3VkaS4KKwkodXBkYXRlLWFsbGRlcHMpOiBSZW1vdmU7IG9ic29sZXRlLgorCisJKiByZW1vdGUuYzogTW92ZSBjb21tZW50cyByZWdhcmRpbmcgcGFja2V0cyB0byB0b3Agb2YgZmlsZSB3aXRoIHRoZQorCXJlc3Qgb2YgdGhlIHByb3RvY29sIGNvbW1lbnRzLgorCUZpeCBpbmNvcnJlY3QgZGVzY3JpcHRpb24gb2YgJ1QnIHJlc3BvbnNlLgorCisJKiBSRUFETUUgKFJlcG9ydGluZyBCdWdzKTogUmVmZXIgcGVvcGxlIHRvIHRoZSBHREIgbWFudWFsLgorCisJKiBjLXZhbHByaW50LmMgKGNfdmFsX3ByaW50KTogSGFuZGxlIFRZUEVfQ09ERV9CT09MRUFOLgorCSogc3RhYnNyZWFkLmM6IFR5cGUgLTE2IGlzIDQgYnl0ZXMuCisKKwkqIHJlbW90ZS11ZGkuYzogSW1wcm92ZSBkb2NzdHJpbmcuCisKK0ZyaSBKdW4gMjUgMTE6MTY6MzEgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGVsZnJlYWQuYyAoZWxmX3N5bWZpbGVfcmVhZCk6ICBDYWxsIGJmZF9lbGZfZmluZF9zZWN0aW9uLCBub3QKKwliZmRfZWxmMzJfZmluZF9zZWN0aW9uLCB0byB0cmFjayBiZmQgY2hhbmdlcy4KKworRnJpIEp1biAyNSAxMToyMjoyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21pcHMvcmlzY29zLm1oIChSRUdFWHssMX0sIE1VTkNIX0RFRklORSwgTUhfQ0ZMQUdTKTogRGVmaW5lLgorCSogY29uZmlnL21pcHMveG0tcmlzY29zLmg6IERlZmluZSBVU0cuCisKK1RodSBKdW4gMjQgMTQ6NTI6NDUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIG1haW4uYyAoZmlsZW5hbWVfY29tcGxldGVyKTogRG9uJ3QgY29tcGxldGUgdG8gZmlsZXMgZW5kaW5nIGluIH4uCisKKwkqIE5FV1M6IE1lbnRpb24gZmlsZW5hbWUgY29tcGxldGlvbiBhbmQgImluZm8gbGluZSIgZW5oYW5jZW1lbnRzLgorCisJKiBtYWluLmMgKHN5bWJvbF9jb21wbGV0aW9uX2Z1bmN0aW9uKTogT24gImluZm8gdCBmb28iLCByZXR1cm4gTlVMTCwKKwlkb24ndCBlcnJvcigpLgorCisJKiBtYWluLmMgKHN5bWJvbF9jb21wbGV0aW9uX2Z1bmN0aW9uKTogRG9uJ3QgdXNlIHJlYWRsaW5lIHdvcmQKKwlicmVha2luZy4gIFVzZSBuZXcgY2FsbGluZyBjb252ZW50aW9uIGZvciBjLT5jb21wbGV0ZXIgYW5kCisJY29tcGxldGVfb25fY21kbGlzdC4KKwkqIGNvbW1hbmQuaCAoc3RydWN0IGNvbW1hbmQpOiBDaGFuZ2UgYXJndW1lbnRzOyBub3cgdGhlIHRleHQgcGFzc2VkCisJdG8gY29tcGxldGVyIGRvZXMgbm90IGhhdmUgYW55IHdvcmQgYnJlYWtpbmcgZG9uZS4gIE5ldyBhcmcgd29yZC4KKwkqIHN5bXRhYi57YyxofSAobWFrZV9zeW1ib2xfY29tcGxldGlvbl9saXN0KTogRG8gd29yZCBicmVha2luZy4gIFRha2UKKwl3b3JkIGFyZ3VtZW50LgorCSoge21haW4uYyxnZGJjbWQuaH0gKHtmaWxlbmFtZSxub29wfV9jb21wbGV0ZXIpOiBUYWtlIHdvcmQgYXJndW1lbnQuCisJKiBjb21tYW5kLntjLGh9IChjb21wbGV0ZV9vbl9jbWRsaXN0KTogVGFrZSB3b3JkIGFyZ3VtZW50LgorCisJKiBjb21tYW5kLmMgKGxvb2t1cF9jbWRfMSk6IERvYyBmaXguCisKK1RodSBKdW4gMjQgMTM6MjY6MDQgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoT1BfSU5DTFVERSk6IGRlZmluZS4KKwkgIChPUENPREVfQ0ZMQUdTKTogdXNlIE9QX0lOQ0xVREUuCisKKwkqIGNvbmZpZy9pMzg2L25jcjMwMDAubWgsIGNvbmZpZy9pMzg2L2kzODZ2NC5taCwKKwljb25maWcvaTM4Ni9pMzg2c29sMi5taCwgY29uZmlnL202OGsvaHAzMDBocHV4Lm1oLAorCWNvbmZpZy9tNjhrL2FtaXgubWgsIGNvbmZpZy9taXBzL2lyaXhbMzRdLm1oLAorCWNvbmZpZy9tODhrL2RlbHRhODgubWgsIGNvbmZpZy9zcGFyYy9zdW40c29sMi5taCAoQUxMT0NBLAorCUFMTE9DQTEpOiBtYWNyb3MgcmVtb3ZlZC4KKworCSogY29uZmlnL21pcHMvZGVjc3RhdGlvbi5taCwgY29uZmlnL3JzNjAwMC9yczYwMDAubWgKKwkoTU1BTExPQ19MSUIpOiByZW5hbWVkIHRvIE1NQUxMT0MuCisKK1dlZCBKdW4gMjMgMDA6MjU6NTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHBhcnRpYWwtc3RhYi5oOiBDb25zb2xpZGF0ZSBjYXNlIHN0YXRlbWVudHMgZm9yIE5fTFNZTSBhbmQgTl9GVU4uCisJKiBkYnhyZWFkLmM6IENoYW5nZSBjb21tZW50IHJlZ2FyZGluZyBhY2MuCisKK1dlZCBKdW4gMjMgMTY6MzM6MzYgMTk5MyAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcmVhZC5jOiBEb2N1bWVudCBhIGZldyBmdW5jdGlvbnMsIG1pc2MgY2xlYW51cHMuICBVcGRhdGUKKwljb3B5cmlnaHQgdG8gcmVmbGVjdCB0aGUgZmlyc3QgInJlbGVhc2UiIG9mIHRoaXMgZmlsZS4KKwkoc3RydWN0IGhwdXhfc3ltZmlsZV9pbmZvKTogRGVsZXRlIHVubmVlZGVkIGZpZWxkcy4gIEtlZXAgcG9pbnRlcnMKKwl0byB0aGUgY29udGVudHMgb2YgdGhlIGRlYnVnIHNlY3Rpb25zIHJhdGhlciB0aGFuIG9mZnNldHMgd2l0aGluCisJdGhlIGZpbGUgaXRzZWxmLiAgQ29ycmVzcG9uZGluZyBjaGFuZ2VzIHRvIHRoZSBhY2Nlc3NvciBtYWNyb3MuCisJKHNsX3N5bWJvbF9zaXplLCBzbHRfc3ltYnVmKTogRGVsZXRlIHVubmVlZGVkIGdsb2JhbCB2YXJpYWJsZXMuCisJKHNsdF9zeW1idWZfc3RhcnQsIHNsdF9zeW1idWZfZW5kLCBsbnR0X3N5bWJ1Zik6IExpa2V3aXNlLgorCShsbnR0X3N5bWJ1Zl9zdGFydCwgbG50dF9zeW1idWZfZW5kLCBnbnR0X3N5bWJ1Zik6IExpa2V3aXNlLgorCShnbnR0X3N5bWJ1Zl9zdGFydCwgZ250dF9zeW1idWZfZW5kKTogTGlrZXdpc2UuCisJKGZpbGxfc2x0X3N5bWJ1ZiwgZmlsbF9sbnR0X3N5bWJ1Zik6IERlbGV0ZSB1bm5lZWRlZCBmdW5jdGlvbnMuCisJKGZpbGxfZ250dF9zeW1idWYpOiBMaWtld2lzZS4KKwkoZ2V0X2xudHQsIGdldF9nbnR0LCBnZXRfc2x0KTogU2ltcGxpZnkuCisJKGhwdXhfc3ltZmlsZV9pbml0KTogUmVhZCBhbmQgc3RvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBkZWJ1Z2dpbmcKKwlzZWN0aW9ucy4gIERvIGVycm9yIGNoZWNraW5nIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBCRkQgY2FsbHMuCisJKHJlYWRfaHB1eF9zeW10YWIpOiBEZWxldGUgS0VSTkVMREVCVUcgY3J1ZC4gIElnbm9yZSBkZWJ1ZyBzeW1ib2xzCisJd2hpY2ggYXJlIG5vdCBuZWVkZWQgZm9yIGJ1aWxkaW5nIHBhcnRpYWwgc3ltYm9sIHRhYmxlcy4gIEhhbmRsZQorCUtfQ09OU1QsIEtfVFlQRURFRiwgYW5kIEtfVEFHREVGIGp1c3QgbGlrZSBLX1NWQVIgYW5kIEtfRFZBUi4KKwkocmVhZF9vZmlsZV9zeW10YWIpOiBEZWxldGUgdXNlbGVzcyBwcm9jZXNzaW5nX2djY19jb21waWxhdGlvbiBzdHVmZi4KKwkocmVhZF9ocF9zdHJ1Y3RfdHlwZSk6IEluaXRpYWxpemUgVFlQRV9DUExVU19TUEVDSUZJQy4KKwkocmVhZF9ocF9zZXRfdHlwZSwgcmVhZF9ocF9hcnJheV90eXBlKTogTGlrZXdpc2UuCisJKHJlYWRfaHBfc3VicmFuZ2VfdHlwZSwgaHBfdHlwZV9sb29rdXApOiBMaWtld2lzZS4KKworV2VkIEp1biAyMyAxNTowNDo1NCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwlNYWtlZmlsZSBvdmVyaGF1bCBkcm9wcGluZyBhdXRvZGVwZW5kIGZlYXR1cmVzLgorCSogTWFrZWZpbGUuaW46IG1hbnkgY29tbWVudCBjaGFuZ2VzLiAgZm9yY2VkIGNvbnNpc3RlbnQgdXNlIG9mICQoKQorCSAgZm9yIG1ha2VmaWxlIHZhcmlhYmxlcyByZWZlcmVuY2VzLiAgZHJvcHBlZCBsZWFkaW5nIC4vIGluIGZpbGUKKwkgIHJlZmVyZW5jZXMuICBEcm9wICQoc3JjZGlyKS8gcHJlZml4IG9uIGFsbCBkZXBlbmRlbmNpZXMuCisJICBJbnNlcnRlZCBjb250ZW50cyBvZiBhbGxkZXBzLm1hayBhbmQgZGVwZW5kLgorCSAgKElOQ0xVREVfQ0ZMQUdTKTogZGVmaW5lZCBhcyBuZXcgbWFjcm8gZm9yIGdldHRpbmcgbGliaWJlcnR5J3MKKwkgIGluY2x1ZGUgZGlyZWN0b3J5IGludG8gdGhlIGNvbXBpbGF0aW9uIGxpbmUuCisJICAoR0RCX0NGTEFHUyk6IG5ldyBtYWNybyB0byB0YWtlIHVwIHRoZSBzZW1hbnRpYyBwcmV2aW91c2x5IGhlbGQKKwkgIGJ5IElOQ0xVREVfQ0ZMQUdTLgorCSAgKExJQklCRVJUWSk6IGRyb3BwZWQgYW5jaWVudCBzdWJkaXIgbWFjcm8uICBJIGxhc3QgcmVtb3ZlZCB0aGlzCisJICBtYWNybyBpbiBmZWIgb2YgJzkyLiAgSG93IGRvZXMgaXQga2VlcCBjb21pbmcgYmFjaz8KKwkgIChNTUFMTE9DX0xJQik6IHJlbmFtZWQgdG8gTU1BTExPQy4KKwkgIChCRkRfU1JDX0RJUik6IHJlbmFtZWQgdG8gQkZEX1NSQy4KKwkgIChCRkRfT0JKX0RJUik6IHJlbmFtZWQgdG8gQkZEX0RJUi4KKwkgIChCRkRfTElCKTogcmVuYW1lZCB0byBCRkQuCisJICAoQkZEX0lOQ0xVREVTKTogcmVuYW1lZCB0byBCRkRfQ0ZMQUdTLgorCSAgKFJFQURMSU5FX0RJUik6IG5vdyByZXByZXNlbnRzIG9iamVjdCBkaXJlY3RvcnkuCisJICAoUkxfTElCKTogcmVuYW1lZCB0byBSRUFETElORS4KKwkgIChSRUFETElORV9TUkMsIFJFQURMSU5FX0NGTEFHUywgT1BDT0RFUywgT1BDT0RFU19DRkxBR1MpOiBuZXcKKwkgIG1hY3Jvcy4KKwkgIChJTlRFUk5BTF9DRkxBR1MpOiBhZGRlZCBHREJfQ0ZMQUdTLCBPUENPREVTX0NGTEFHUywKKwkgIFJFQURMSU5FX0NGTEFHUywgQkZEX0NGTEFHUy4gIERyb3BwZWQgVVNFUl9DRkxBR1MuCisJICAoTERGTEFHUyk6IHJlbW92ZWQgZGVmYXVsdCBhc3NpZ25tZW50LgorCSAgKFRFWElESVIsIElOQ0xVREVfREVQLCBNTUFMTE9DX0RJUiwgTU1BTExPQ19ERVAsIEJGRF9ERVAsCisJICBSRUFETElORV9ERVAsIExJQklCRVJUWV9ESVIsIFRFU1RTLCBkZXBlbmQsIFNUQUdFU1RVRkYpOiB1bnVzZWQsIHNvIHJlbW92ZWQuCisJICAoQUxMT0NBMSwgQUxMT0NBKTogcmVtb3ZlZCBhbGwgcmVmZXJlbmNlcy4gIGFsbG9jYSBpcyBub3cgaW4KKwkgIGxpYmliZXJ0eS4KKwkgIChWRVJTSU9OKTogdW5pbGF0ZXJhbGx5IGFuZCBhcmJpdHJhcmlseSBidW1wZWQgdG8gNC45LjMuCisJICAoU0ZJTEVTLCBOT05TUkMsIEhGSUxFUywgQUxMREVQRklMRVMsIEFMTFBBUkFNLCBBTExDT05GSUcpOgorCSAgcmVtb3ZlZCBhbGwgJChzcmNkaXIpIHByZWZpeGVzLgorCSAgKGdldG9wdF9oLCBpZWVlLWZsb2F0X2gsIGJmZF9oLCB3YWl0X2gsIGRpcy1hc21faCk6IG5ldyBtYWNyb3MKKwkgIGZvciBwb3RlbnRpYWwgZGVwZW5kZW5jaWVzLiAgY29tbWVudGVkIG91dCBieSBkZWZhdWx0LgorCSAgKHJlYWRsaW5lX2hlYWRlcnMsIHVkaWhlYWRlcnMpOiBjb252ZW5pZW50IGFiYnJldmlhdGlvbnMuCisJICAoZ2RiY29yZV9oLCBmcmFtZV9oLCBzeW10YWJfaCwgZ2RidHlwZXNfaCwgZXhwcmVzc2lvbl9oLAorCSAgdmFsdWVfaCwgYnJlYWtwb2ludF9oLCBjb21tYW5kX2gsIGdkYmNtZF9oLCBkZWZzX2gsIGluZmVyaW9yX2gpOgorCSAgbmV3IG1hY3JvcyB1c2VkIGZvciBoZWFkZXIgZmlsZSBkZXBlbmRlbmNpZXMuCisJICAoaW5zdGFsbC1pbmZvLCBjbGVhbi1pbmZvKTogY29sbGFwc2UgaW50byB0aGUgaW5mbyBydWxlLgorCSAgKGluc3RhbGwpOiBub3cgZGVwZW5kcyBvbiBhbGwuCisJICAoaW5zdGFsbC1vbmx5KTogbmV3IHRhcmdldCBmb3IgaW5zdGFsbGluZyB3aXRob3V0IGRlcGVuZGluZyBvbgorCSAgYWxsLgorCSAgKHVuaW5zdGFsbCk6IG5ldyB0YXJnZXQuCisJICAoY29uZmlnLWNoZWNrLCBjb25maWctY2hlY2staG9zdHMsIGNvbmZpZy1jaGVjay10YXJnZXRzKTogYWRkZWQKKwkgIGZpeG1lIGNvbW1lbnRzLgorCSAgKGNoLWV4cC50YWIuYywgbTItZXhwLnRhYi5jKTogYWRkZWQgYXJ0aWZpY2lhbCBkZXBlbmRlbmNpZXMgaW4KKwkgIG9yZGVyIHRvIGZvcmNlIHBhcmFsbGVsIG1ha2VzIGludG8ga2VlcGluZyB0aGVzZSBydWxlcyBzZXBhcmF0ZS4KKwkqIGNvbmZpZ3VyZS5pbjogb21pdCBjYXQnaW5nIGRlcGVuZCBmaWxlIG9udG8gZ2VuZXJhdGVkIE1ha2VmaWxlLgorCSogYWxsZGVwcy5tYWssIGRlcGVuZDogcmVtb3ZlZC4KKworCSogaW5mZXJpb3IuaDogcmVtb3ZlIHJlZHVuZGFudCBpbmNsdWRlIG9mIHN5bXRhYi5oIHdoaWNoIGlzCisJaW5jbHVkZWQgaW4gdmFsdWUuaCB2aWEgYnJlYWtwb2ludC5oLgorCisJKiBhbGxvY2EuYzogcmVtb3ZlZC4gIGFsbG9jYSBpcyBub3cgaW4gbGliaWJlcnR5LgorCisJKiBjb25maWcvbTg4ay9kZWx0YTg4Lm1oLCBjb25maWcvbnMzMmsvbWVybGluLm1oIChNX1VOSU5TVEFMTCk6CisJbmV3IG1hY3JvIHRvIHVuZG8gd2hhdCBNX0lOU1RBTEwgZG9lcy4KKworV2VkIEp1biAyMyAwMDoyNTo1OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL25zMzJrL3ttZXJsaW4ubWgseG0tbWVybGluLmh9OiBCZSBjb25zaXN0ZW50IGFib3V0IG5hbWUKKwlvZiBnZGItc2guCisKKwkqIGRieHJlYWQuYyAoY29weV9wZW5kaW5nKTogQ2hhbmdlIG5hbWUgYW5kIGZ1bmN0aW9uIG9mIGJlZ2kgYXJndW1lbnQKKwl0byBlbmRpLCBzaW5jZSB0aGF0IGlzIHdoYXQgdGhlIGNhbGxlciBuZWVkcy4KKworCSogTWFrZWZpbGUuaW4gKFRBR0ZJTEVTKTogRG9uJ3QgaW5jbHVkZSBZWUZJTEVTLgorCisJKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogSW5jbHVkZSBtb25pdG9yLmguCisKKwkqIE1ha2VmaWxlLmluOiBJbmNsdWRlIHRleHQgdGhhdCB1c2VkIHRvIGJlIGluIGFsbGRlcHMubWFrLgorCVJlbW92ZSBjb25maWcvbWlwcy97YmlnbWlwcy5taCx4bS1iaWdtaXBzfSBmcm9tIGl0LgorCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGFsbCB0cmFjZXMgb2YgYWxsZGVwcy5tYWsuCisKKwkqIG1haW4uYyAobWFpbik6IFByaW50IGhlbHAgbWVzc2FnZSBvbiBzdGRvdXQgbm90IHN0ZGVycgorCXBlciBzdGFuZGFyZHMudGV4aS4KKwlOZXcgb3B0aW9uIC0tdmVyc2lvbiBwZXIgc3RhbmRhcmRzLnRleGkuCisJSW4gaGVscCBtZXNzYWdlLCBzaG93IGxvbmcgb3B0aW9ucyB3aXRoICItLSIgbm90ICItIi4KKwlEb24ndCB0cnkgdG8gcHJpbnQgaGVscCBtZXNzYWdlIG9yIHZlcnNpb24gdW50aWwgYWZ0ZXIgd2UgaGF2ZQorCWNhbGxlZCBpbml0aWFsaXplX2FsbF9maWxlcy4KKworVHVlIEp1biAyMiAxMTowMzoxMyAxOTkzICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHByZWFkLmM6IERlbGV0ZSB1c2VsZXNzICNpZiAxIHN0YXRlbWVudHMuCisJKGhwX3R5cGVfdHJhbnNsYXRlKTogVXNlIFRfTE9ORywgVF9VTlNfTE9ORywgYW5kIFRfRE9VQkxFIGluc3RlYWQKKwlvZiBtYWdpYyBpbnRlZ2Vycy4gIEZpeCBoYW5kbGluZyBmb3IgVF9VTlNfSU5ULiAgQWJvcnQgaWYgdGhlIHR5cGUKKwlwYXNzZWQgaW4gaXMgbm90IGFuICJpbW1lZGlhdGUiIHR5cGUuCisJKHJlYWRfaHBfZW51bV90eXBlKTogUHJvcGVybHkgY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgdHlwZS4KKwkocmVhZF9ocF9hcnJheV90eXBlKTogTGlrZXdpc2UuCisJKGhwX3R5cGVfbG9va3VwKTogUHJlZml4IHRoZSBuYW1lcyBvZiBzdHJ1Y3RzLCB1bmlvbnMgYW5kIGVudW1zCisJd2l0aCAic3RydWN0IiwgInVuaW9uIiwgYW5kICJlbnVtIiBhcyBhcHByb3ByaWF0ZS4KKworVHVlIEp1biAyMiAwMzoxNTozOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc29saWIuYyAoc29saWJfYWRkX2NvbW1vbl9zeW1ib2xzKTogRG9uJ3QgY2FsbCBsb29rdXBfbWluaW1hbF9zeW1ib2wuCisJKHNvbGliX2FkZCk6IENhbGwgc3BlY2lhbF9zeW1ib2xfaGFuZGxpbmcgb25jZSwgbm90IG9uY2UgcGVyIGxpYnJhcnkuCisKKwkqIHByb2Nmcy5jIChwcm9jZnNfcmVzdW1lKTogRG9uJ3QgcGFzcyBhIFNJR1RTVFAgd2hvc2UgYWN0aW9uCisJaXMgU0lHX0RGTC4KKworCSogcHJvY2ZzLmMgKHByb2Nmc19yZXN1bWUpOiBTa2lwIHRoZSB1bm5lY2Vzc2FyeSBQUlNWQUREUiBvbiBhbGwKKwlzeXN0ZW1zLCBub3QganVzdCBTb2xhcmlzLgorCisJKiBzdGFic3JlYWQuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCisKK01vbiBKdW4gMjEgMTY6MDk6NDYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIGZvcmstY2hpbGQuYyAoZm9ya19pbmZlcmlvcik6IFF1b3RlIGV4ZWNfZmlsZSBzbyBpdCBjYW4gY29udGFpbgorCWZ1bmt5IGNoYXJhY3RlcnMuCisKK01vbiBKdW4gMjEgMTY6NTY6NDcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChJTkNMVURFX0NGTEFHUyk6ICBBZGQgQkZEX0lOQ0xVREVTIGZvciBub3csIHNpbmNlCisJYmZkLmggaXMgaW5jbHVkZWQgYnkgdGFyZ2V0LmgsIHdoaWNoIG1vc3Qgb2YgZ2RiIGluY2x1ZGVzLgorCSogZGVwZW5kOiAgSGFuZCByZW1vdmUgQkZEX0lOQ0xVREVTIGZyb20gJHtDQ30gbGluZXMsIG5vdyB0aGF0CisJaXQncyBpbiBJTkNMVURFX0NGTEFHUy4KKworTW9uIEp1biAyMSAxNjowOTo0NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2kzODYvKmFpeCosIGkzODZhaXgtbmF0LmM6IE5ldyBmaWxlcy4KKwkqIGNvbmZpZ3VyZS5pbjogVXNlIHRoZW0uCisJKiBhbGxkZXBzLm1hazogTGlzdCB0aGVtLgorCSogY29mZnJlYWQuYyAoZGVjb2RlX2Jhc2VfdHlwZSk6IERlYWwgd2l0aCBhbm9ueW1vdXMgZW51bSB0eXBlLgorCSogaTM4Ny10ZGVwLmMgKHByaW50XzM4N19zdGF0dXNfd29yZCk6IEFkZCBjb21tZW50IHJlICJ0b3AiLgorCSogaTM4Ni10ZGVwLmMgW0kzODZfQUlYX1RBUkdFVF0gKGkzODZfZXh0cmFjdF9yZXR1cm5fdmFsdWUpOiBOZXcgZnVuYy4KKwkqIGRieHJlYWQuYzogVXNlIFNFRUtfU0VUIGFuZCBTRUVLX0NVUiwgbm90IExfKi4gIERlZmluZSB0aGVtIGlmIGFuZAorCW9ubHkgaWYgbm90IGRlZmluZWQgYnkgYSBoZWFkZXIgZmlsZS4KKwkqIG1pcHNyZWFkLmM6IERvbid0IGRlZmluZSBMX1NFVCBvciBMX0lOQ1IuCisKK01vbiBKdW4gMjEgMTU6MTA6MDcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChCRkRfSU5DTFVERVMpOiAgQmZkLmggaXMgbm93IGJhY2sgaW4gYmZkIGJ1aWxkIGRpci4KKwkqIGRlcGVuZDogIEhhbmQgdXBkYXRlZCB0byBtYXRjaC4KKworTW9uIEp1biAyMSAxMDoxMzo0MiAxOTkzICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHByZWFkLmM6IEluY2x1ZGUgImRlbWFuZ2xlLmgiLgorCShwcm9jZXNzX29uZV9kZWJ1Z19zeW1ib2wpOiBTZXQgdGhlIFNZTUJPTF9MQU5HVUFHRSBhbmQKKwlTWU1CT0xfSU5JVF9ERU1BTkdMRURfTkFNRSBmb3IgdGhlIGN1cnJlbnQgc3ltYm9sLiAgQWRqdXN0CisJU1lNQk9MX1ZBTFVFIGZvciBsb2NhbCB2YXJpYWJsZXMgaW4gdGhlIHN0YWNrIGJ5IHRoZSBzaXplIG9mIHRoZQorCWN1cnJlbnQgZnVuY3Rpb24ncyBzdGFjayAoZm91bmQgaW4gdW53aW5kIGRlc2NyaXB0b3IpLiAgS2VlcAorCWJldHRlciB0cmFjayBvZiB0aGUgY3VycmVudCB1bndpbmQgZGVzY3JpcHRvci4gCisKK1N1biBKdW4gMjAgMTM6MTE6MTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHN0YWJzcmVhZC5jIChyZWFkX3N0cnVjdF9maWVsZHMpOiBEb24ndCBjYWxsIHJlYWRfY3BwX2FiYnJldiBvbiAkXy4KKwkocmVhZF9jcHBfYWJicmV2KTogRG9uJ3QgY29tcGxhaW4gc3BlY2lhbGx5IGZvciAkXy4gIEFsc28gcmV0dXJuIDAgaWYKKwl3ZSBkb24ndCByZWNvZ25pemUgdGhlIGFiYnJldi4KKworU3VuIEp1biAyMCAwMDoyNDo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc29saWIuYyAoc29saWJfYWRkX2NvbW1vbl9zeW1ib2xzKTogQWRkIGNvbW1lbnQgYWJvdXQgcGVyZm9ybWFuY2UuCisKK0ZyaSBKdW4gMTggMTI6Mzc6MzYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taXBzL3t7eCxufW0tcmlzY29zLmgscmlzY29zLm1ofTogTmV3IGZpbGVzLgorCSogY29uZmlndXJlLmluIChtaXBzLSotc3lzdiopOiBVc2UgcmlzY29zIGZvciBob3N0LCBiaWdtaXBzIGZvciB0YXJnZXQuCisKKwkqIGNvbmZpZy9taXBzL3t7eCxufW0tbmV3cy1taXBzLmgsbmV3cy1taXBzLm1ofTogTmV3IGZpbGVzLgorCSogY29uZmlnL21pcHMve2JpZ21pcHMubWgseG0tYmlnbWlwcy5ofTogUmVtb3ZlLgorCSogY29uZmlndXJlLmluIChtaXBzLXNvbnktKik6IFVzZSBuZXdzLW1pcHMgZm9yIGhvc3QuCisKKwkqIGJ1aWxkc3ltLmg6IERvYyBmaXggZm9yIHByb2Nlc3NpbmdfYWNjX2NvbXBpbGF0aW9uLgorCitUaHUgSnVuIDE3IDE5OjU3OjA4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBwcmludGNtZC5jIChwcmludF9mb3JtYXR0ZWQpOiBEb24ndCB1c2UgdGFiIGluIHdyYXBfaGVyZSBhcmcuCisKK1RodSBKdW4gMTcgMTc6Mjk6MzAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpc2EuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKElOVEVSTkFMX0NGTEFHUyk6IEluY2x1ZGUgLi4vaW5jbHVkZSBhcyB3ZWxsIGFzCisJJHtzcmNkaXJ9Ly4uL2luY2x1ZGUuCisKKwkqIGNvbmZpZy9tODhrL3htLWRlbHRhODguaDogQ29tbWVudCBvdXQgdW51c2VkIGRlZmluZXMgd2hpY2ggY29uZmxpY3QKKwl3aXRoIHN5c3RlbSBoZWFkZXJzLgorCSogcHJpbnRjbWQuYyAocHJpbnRmX2NvbW1hbmQpOiBDYXN0IHNlY29uZCBhcmcgdG8gdnByaW50ZiB0byBQVFIuCisJVXNlIFZQUklOVEYgbWFjcm8gaWYgZGVmaW5lZC4KKwkqIGNvbmZpZy9tODhrL3htLWRlbHRhODguaDogRGVmaW5lIFZQUklOVEYuICBJbmNsdWRlIDxzeXMvc2lnaW5mby5oPi4KKwlEZWZpbmUgVElPQ3tHRVRDLEdMVEN9X0JST0tFTi4KKwkqIG04OGstbmF0LmM6IFVuY29tbWVudCBpbmNsdWRlIG9mIDxzeXMvcHRyYWNlLmg+LgorCSogbWFpbi5jOiBSZW5hbWUgaW5pdGlhbGl6ZV97bWFpbixjbWRfbGlzdHMsaGlzdG9yeX0gdG8gaW5pdF8qIHRvCisJbWFrZSB0aGluZ3MgZWFzaWVyIG9uIG11bmNoIChhcHBhcmVudGx5IHRoaXMgbWF0dGVycyBvbgorCXRoZSBkZWx0YTg4IHdpdGggc3ZyMykuCisKK1RodSBKdW4gMTcgMTY6NTM6NTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKKwkKKwkqIE1ha2VmaWxlLmluOiBjYW5vbmljYWxpemUgaW5zdGFsbC5zaDsgZm9yIHVzZSB3aXRoaW4KKwl0aGlzIGRpcmVjdG9yeSAoYW5kIHN1YmRpcnMpCisKK1R1ZSBKdW4gMTUgMTc6MDE6MjMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogcmVtb3ZlIHBhcmVudGRpciBzdXBwb3J0OyB1c2UgSU5TVEFMTF9YRk9STQorCitUaHUgSnVuIDE3IDE1OjA4OjM1IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEtKi1vc2YqKSwgY29uZmlnL2FscGhhL2FscGhhLW9zZi5taDogTmV3CisJaG9zdC4KKwkqIHNoLXRkZXAuYyAoZnJhbWVfZmluZF9zYXZlZF9yZWdzKTogVXNlIE5VTV9SRUdTIHJhdGhlciB0aGFuIGhhcmQKKwl3aXJlZCAoYW5kIHdyb25nKSBjb25zdGFudC4KKwkqIHZhbHVlcy5jICh1bnBhY2tfbG9uZyk6IEFkZCBjYXNlIHRvIHVucGFjayB3aGVuIHRhcmdldCBvYmplY3QgaXMKKwlzaXplb2YoaW50KS4KKwkqIGNvbmZpZy9zaC90bS1zaC5oIChSRUdJU1RFUl9OQU1FUyk6IEtub3cgYWJvdXQgdGhlIG5ld3Mgb25lcyB0aGUKKwlzaW11bGF0b3IgZGVmaW5lcy4KKworV2VkIEp1biAxNiAxNjowODoxOCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwkqIE5FV1M6IHRyYWNraW5nIHVzZXIgdmlzaWJsZSBjaGFuZ2VzIHN0YXJ0aW5nIHdpdGgKKwl2eHdvcmtzLXRpbWVvdXQuCisKKwkqIHJlbW90ZS12eC5jIChfaW5pdGlhbGl6ZV92eCk6IHJlbmFtZSB1c2VyIHNldHRhYmxlIG9wdGlvbiBmcm9tCisJcnBjVGltZW91dCB0byB2eHdvcmtzLXRpbWVvdXQuCisKK1dlZCBKdW4gMTYgMTQ6MzQ6MTAgMTk5MyAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcmVhZC5jIChocF90eXBlX3RyYW5zbGF0ZSk6IEZpeCBwcm9tb3Rpb24gYnVncyBmcm9tCisJY2hhciB0byBzaG9ydCBhbmQgc2hvcnQgdG8gaW50LgorCitXZWQgSnVuIDE2IDEyOjIxOjQ5IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoZGVwZW5kKTogIE1vcmUgbWFrZWZpbGUgZGlkZGxpbmcuCisJKiBhbGxkZXBzLm1haywgZGVwZW5kOiAgVXBkYXRlIHRvIGxhdGVzdCBhdXRvbWF0aWNhbGx5IGJ1aWx0CisJdmVyc2lvbnMuCisKKwkqIE1ha2VmaWxlLmluIChkZXBlbmQpOiAgQmZkLmgga2VlcHMgbW92aW5nLCBrZWVwIHVwIHdpdGggaXQuCisJKiBhbGxkZXBzLm1haywgZGVwZW5kOiAgVXBkYXRlIHRvIGxhdGVzdCBhdXRvbWF0aWNhbGx5IGJ1aWx0CisJdmVyc2lvbnMuCisKK1R1ZSBKdW4gMTUgMTI6MjY6MDUgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJKiByZW1vdGUtdnguYzogaW5jbHVkZSBnZGJjbWQuaCBmb3Igc2V0bGlzdC4KKwkgIChfaW5pdGlhbGl6ZV92eCk6IG1ha2UgcnBjVGltZW91dCB1c2VyIHNldHRhYmxlLgorCitNb24gSnVuIDE0IDA5OjIzOjUxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBtYWluLmMsIGdkYmNtZC5oOiBBZGQgZnVuY3Rpb24gZmlsZW5hbWVfY29tcGxldGVyLgorCSogbWFpbi5jLCBzeW1maWxlLmMsIHNvdXJjZS5jLCBleGVjLmMsIGNvcmUuYzogVXNlIGl0IGZvcgorCSJkaXJlY3RvcnkiLCAic291cmNlIiwgImNkIiwgInN5bWJvbC1maWxlIiAiYWRkLXN5bWJvbC1maWxlIiwKKwkibG9hZCIsICJmaWxlIiwgImV4ZWMtZmlsZSIsICJjb3JlLWZpbGUiIGNvbW1hbmRzLgorCShCdXQgJy8nIGlzIGEgd29yZCBicmVhaywgbGltaXRpbmcgdXNlZnVsbmVzczsgc2VlIGNvbW1lbnRzKS4KKworCSogc291cmNlLmMgKG1vZF9wYXRoKTogV2FybmluZyBub3QgZXJyb3IgaWYgY2FuJ3QgZmluZCBkaXJlY3RvcnkuCisKKwkqIGlzaS14ZGVwLmM6IE5ldyBmaWxlLgorCSogY29uZmlnL202OGsvaXNpLm1oIChYREVQRklMRVMpOiBBZGQgaXNpLXhkZXAubworCitTdW4gSnVuIDEzIDA5OjE3OjQ4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBjb25maWcvbTY4ay94bS1uZXdzLmg6IEluY2x1ZGUgPHN5cy9wYXJhbS5oPi4KKworCSogbTg4ay10ZGVwLmMgKElFRUVfaXNOQU4pOiBSZW1vdmUuCisJY29uZmlnL204OGsvdG0tbTg4ay5oIChJTlZBTElEX0ZMT0FUKTogUmV0dXJuIDAuICBUaGlzIHdhcyB0aGUgc2FtZQorCWJyb2tlbiBpc05BTiBhcyBvbiB0aGUgbWlwcy4KKworCSogdmFscHJpbnQuYyAoX2luaXRpYWxpemVfdmFscHJpbnQpOiBVc2UgYy0+ZnVuY3Rpb24uc2Z1bmMgbm90IGp1c3QKKwljLT5mdW5jdGlvbi4KKworCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpOiBJZiBTVU5fRklYRURfTEJSQUNfQlVHIGlzIG5vdAorCWRlZmluZWQsIGRvbid0IHdvcnJ5IGFib3V0IFN1bidzIHNpbGx5IExCUkFDIGJ1Zy4KKwkqIGNvbmZpZy9tNjhrL3RtLXN1bjMuaDogRGVmaW5lIFNVTl9GSVhFRF9MQlJBQ19CVUcgdG8gMC4KKworCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpOiBJZiB0aGVyZSdzIGEgc3ltYm9sIGJlZm9yZSBhbgorCU5fU08sIGRvbid0IGVycm9yKCkuCisJKGNhc2UgTl9CQ09NTSk6IGNvbXBsYWluICgpIG5vdCBlcnJvciAoKS4KKworCSogZGVmcy5oLCBtYWluLmMgKGNhdGNoX2Vycm9ycyk6IEFkZCByZXR1cm5fbWFzayBhcmcuCisJc3RhY2suYyAocHJpbnRfZnJhbWVfaW5mbyk6IFBhc3MgUkVUVVJOX01BU0tfRVJST1IuCisJb3RoZXIgY2FsbGVyczogUGFzcyBSRVRVUk5fTUFTS19BTEwuCisJKHJldHVybl90b190b3BfbGV2ZWwpLCBjYWxsZXJzOiBBZGQgcmV0dXJuX3JlYXNvbiBhcmcuCisJKiB1dGlscy5jIChxdWl0KToKKwlVc2UgcmV0dXJuX3RvX3RvcF9sZXZlbCAoUkVUVVJOX1FVSVQpIGluc3RlYWQgb2YgZXJyb3IgKCkuCisJKiBtYWluLmMgKG1haW4pLCB0bS1uaW5keTk2MC5oIChBRERJVElPTkFMX09QVElPTl9IQU5ETEVSKToKKwlVc2UgU0VUX1RPUF9MRVZFTCBub3Qgc2V0am1wICh0b190b3BfbGV2ZWwpLgorCSogcmVtb3RlLW5pbmR5LmM6IFVzZSBjYXRjaF9lcnJvcnMgbm90IHNldGptcCAodG9fdG9wX2xldmVsKS4KKworU2F0IEp1biAxMiAxNDo0MDo1NCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogc29saWIuYyAoc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spIFtTVlI0X1NIQVJFRF9MSUJTXToKKwlEb24ndCB0cnkgdG8gZ2V0IHRoZSBkZWJ1ZyBiYXNlIHlldC4KKworCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpOiBTZXQgbl9vcHRfZm91bmQgYmFzZWQgb24gd2hldGhlcgorCWEgbm9uLWdjYyBOX09QVCBzeW1ib2wgaXMgZm91bmQuICBNYWtlIFNVTl9GSVhFRF9MQlJBQ19CVUcgYSBtYWNybworCXdoaWNoIHJldHVybnMgMCBvciAxIHRvIHNheSB3aGV0aGVyIHRvIGRvIGl0LgorCSogY29uZmlnL3NwYXJjL3N1bjR7c29sMixvczR9LmgKKwkoU1VOX0ZJWEVEX0xCUkFDX0JVRyxWQVJJQUJMRVNfSU5TSURFX0JMT0NLKTogVXNlIG5fb3B0X2ZvdW5kIHNvCisJdGhlIHJpZ2h0IHRoaW5nIGhhcHBlbnMgZm9yIGJvdGggYWNjIGFuZCBTdW5PUzQgL2Jpbi9jYy4KKworCSogdmFscHJpbnQuYyAocHJpbnRfaGV4X2NoYXJzKTogVXNlIGxvY2FsX2hleF9mb3JtYXRfe3ByZSxzdWZ9Zml4LgorCSogcHJpbnRjbWQuYyAocHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCk6IFVzZSB2YWxfcHJpbnRfdHlwZV9jb2RlX2ludC4KKworCSogbWlwcy10ZGVwLmM6IFJlbW92ZSBpc2FfTkFOOyBpdCBhc3N1bWVkIHNpemVvZihob3N0IGludCkgPT0gNCBhbmQKKwlwcm9iYWJseSBjb250YWluZWQgYnl0ZS1vcmRlciBzaW5zIHRvby4KKwljb25maWcvbWlwcy90bS1taXBzLmggKElOVkFMSURfRkxPQVQpOiBEZWZpbmUgdG8gMCBsaWtlIG1vc3QgbWFjaGluZXMuCisJVGhlIElFRUVfRkxPQVQgY29kZSBpbiBwcmludF9mbG9hdGluZyB0YWtlcyBjYXJlIG9mIGl0LgorCitTYXQgSnVuIDEyIDE0OjQ3OjA0IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICBCdW1wIHRvIDQuOS4yLgorCSogYy12YWxwcmludC5jIChjX3ZhbF9wcmludCk6ICBGb3IgYXJyYXkgb2YgY2hhcnMgcHJpbnRlZCB3aXRoCisJc3RyaW5nIHN5bnRheCwgZG9uJ3QgcHJpbnQgdGhlIGFkZHJlc3Mgb2YgdGhlIGFycmF5LiAgRnJvbQorCWJvdGhuZXJAY3lnbnVzLmNvbS4KKwkqIGMtZXhwLnkgKHl5bGV4KTogUmVjb2duaXplICcuJyBhcyBpbmRpY2F0aW5nIGEgZmxvYXRpbmcgcG9pbnQKKwludW1iZXIgcmVnYXJkbGVzcyBvZiB0aGUgcmFkaXguICBGcm9tIHdpbHNvbkBjeWdudXMuY29tLgorCSogdmFscHJpbnQuYyAoc2V0X2lucHV0X3JhZGl4XzEsIHNldF9vdXRwdXRfcmFkaXhfMSk6ICBOZXcKKwlwcm90b3R5cGVzIGFuZCBmdW5jdGlvbnMgdGhhdCBkbyB0aGUgYWN0dWFsIHJhZGl4IHNldHRpbmcgd29yay4KKwkqIHZhbHByaW50LmMgKHNldF9yYWRpeCwgc2V0X291dHB1dF9yYWRpeCwgc2V0X2lucHV0X3JhZGl4KToKKwlSZXdyaXRlIHRvIHVzZSBzZXRfaW5wdXRfcmFkaXhfMSBhbmQgc2V0X291dHB1dF9yYWRpeF8xLgorCSogdmFscHJpbnQuYyAoaW5pdGlhbGl6ZV92YWxwcmludCk6ICBFbmFibGUgY29tbWFuZHMgdG8KKwlpbmRlcGVuZGVudGx5IHNldCBhbmQgc2hvdyBpbnB1dCBhbmQgb3V0cHV0IHJhZGljZXMuCisJKiB2YWxwcmludC5jIChzaG93X3JhZGl4KTogIE5ldyBwcm90b3R5cGUgYW5kIGZ1bmN0aW9uIHRoYXQKKwloYW5kbGVzIHNlcGFyYXRlIGlucHV0IGFuZCBvdXRwdXQgcmFkaWNlcy4KKworRnJpIEp1biAxMSAxODozOTozOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKKworCVBhdGNoZXMgZnJvbSBKZWZmIExhdywgbGF3QGNzLnV0YWguZWR1OgorCSogaHBwYS1waW5zbi5jOiBOb3cgdXNlcyBkaXNhc3NlbWJsZXIgZnJvbSBvcGNvZGUgbGlicmFyeSwKKwl0aGlzIGNvbnRhaW5zIG9ubHkgdGhlIHN0dWIgZnVuY3Rpb24gcHJpbnRfaW5zbi4KKworRnJpIEp1biAxMSAxNToxOTo1OSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogbWFpbi5jIChtYWluKTogYmFjayB0byB0d28gcGVyaW9kcyBmb3IgZWxpcHNlLgorCSAgKHByaW50X2dkYl92ZXJzaW9uKTogcmV2aXNlZCBmb3JtYXQgZm9yIGNvbmZpZ3VyYXRpb24gaW5mby4KKworRnJpIEp1biAxMSAxMDoyNDozNSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZGVmcy5oIChJTlRfTUFYKTogIENhc3QgdW5zaWduZWQgc2hpZnQgcmVzdWx0IHRvIGludC4KKworRnJpIEp1biAxMSAxMDoxNzo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpOiBSYXRoZXIgdGhhbiBoYXZpbmcKKwlCTE9DS19BRERSRVNTX0ZVTkNUSU9OX1JFTEFUSVZFIGEgbWFjcm8sIG1ha2UgaXQgYSB2YXJpYWJsZSB3aGljaAorCWlzIHRydWUgaWYgd2UgYXJlIGRvaW5nIHN0YWJzLWluLWVsZiwgZmFsc2Ugb3RoZXJ3aXNlLgorCWNvbmZpZy9zcGFyYy90bS1zdW40c29sMi5oOiBEb24ndCBkZWZpbmUgaXQuCisKK0ZyaSBKdW4gMTEgMTM6MzM6NDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiByZW1vdGUtbWlwcy5jIChtaXBzX3NlbmRfcGFja2V0KTogRG9uJ3QgcHJpbnQgZ2FyYmFnZSBjaGFyYWN0ZXIKKwlpbiBkZWJ1Z2dpbmcgaW5mby4KKwkobWlwc19yZXF1ZXN0KTogRG9uJ3QgY2hlY2sgdGhhdCByZW1vdGUgcGlkIGlzIDAsIGJlY2F1c2UKKwlzb21ldGltZXMgaXQgaXNuJ3QuCisJKG1pcHNfZmV0Y2hfcmVnaXN0ZXJzKTogUGFzcyBhIHBvaW50ZXIgdG8gU1dBUF9UQVJHRVRfQU5EX0hPU1QsCisJbm90IGFuIGludGVnZXIuCisKK0ZyaSBKdW4gMTEgMTA6MTc6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHN0YWNrLmMgKHByaW50X2ZyYW1lX2luZm8pOiBVc2UgY2F0Y2hfZXJyb3JzIGFyb3VuZCBwcmludF9mcmFtZV9hcmdzLgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGRlcGVuZCBvbiBnZGIuCisKKwkqIFJlbmFtZSByZW1vdGUtZXMxODAwLmMgdG8gcmVtb3RlLWVzLmMKKwlhbmQgcmVtb3RlLXN0MjAwMC5jIHRvIHJlbW90ZS1zdC5jIGZvciAxNC1jaGFyIGZpbGVuYW1lcy4KKwljb25maWcvbTY4ay97ZXMxODAwLHN0MjAwMH06IFVzZSB0aGUgbmV3IG5hbWVzLgorCisJKiBtaXBzLXRkZXAuYyAoaXNhX05BTik6IERvbid0IHJldHVybiB0cnVlIG9uIC0wLgorCitGcmkgSnVuIDExIDEwOjI0OjM1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBkZWZzLmggKElOVF9NQVgpOiAgQ2FzdCB1bnNpZ25lZCBzaGlmdCByZXN1bHQgdG8gaW50LgorCitUaHUgSnVuIDEwIDEzOjI2OjQxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBlbGZyZWFkLmMgKGVsZl9zeW10YWJfcmVhZCk6ICBBZGQgYmZkIHNlY3Rpb24gYWRkcmVzcyB0byBiZmQKKwlzeW1ib2xzLCBub3cgdGhhdCB0aGV5IGFyZSBzZWN0aW9uIHJlbGF0aXZlLgorCSogc29saWIuYyAoYmZkX2xvb2t1cF9zeW1ib2wpOiAgRGl0dG8uCisKK1RodSBKdW4gMTAgMTE6Mjc6MzQgMTk5MyAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcmVhZC5jIChyZWFkX2hwX2Z1bmN0aW9uX3R5cGUpOiBBZGp1c3QgU1lNQk9MX1ZBTFVFIGZvcgorCWFyZ3VtZW50cyBpbiB0aGUgc3RhY2sgYnkgdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24ncyBzdGFjaworCShmb3VuZCBpbiB0aGUgdW53aW5kIGRlc2NyaXB0b3IpLgorCShwcm9jZXNzX29uZV9kZWJ1Z19zeW1ib2wpOiBMaWtld2lzZS4gIEtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQKKwlmdW5jdGlvbidzIHVud2luZCBkZXNjcmlwdG9yLgorCitUaHUgSnVuIDEwIDEwOjU2OjU2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoZGVwZW5kKTogQWRkIGJmZCAtSSdzIGZvciBwYXJlYWQuYyBhbmQgeGNvZmZleGVjLmMKKwlkZXBlbmQ6IFVwZGF0ZWQgYWNjb3JkaW5nbHkuCisKK1dlZCBKdW4gIDkgMTY6MDg6NDQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluICgqLnRhYi5jKTogVXNlIG12IGZvciBhdG9taWMgdXBkYXRlLgorCisJKiBNYWtlZmlsZS5pbiAoe2Rpc3QscmVhbH1jbGVhbik6IEFsc28gcmVtb3ZlIG5tLmguCisJKHJlYWxjbGVhbik6IEFsc28gcmVtb3ZlICR7VEVTVFN9LCB5Lm91dHB1dCwgeWFjYy57YWN0cyx0bXB9LgorCShkaXN0Y2xlYW4pOiBEb24ndCByZWJ1aWxkICoudGFiLmMgb3IgVEFHUy4KKworV2VkIEp1biAgOSAxMjo1Njo1OCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKHZlcnNpb24uYyk6IGFkZCBob3N0IGFuZCB0YXJnZXQgbmFtZXMgdG8gdmVyc2lvbi5jLgorCSogbWFpbi5jIChtYWluKTogcHJpbnQgdGhyZWUgcGVyaW9kcyBmb3IgdGhlIGVsaXBzZS4KKwkgIChwcmludF9nZGJfdmVyc2lvbik6IGFsc28gcHJpbnQgY29uZmlndXJhdGlvbi4KKworCSogdWRpL3VkaWlkcy5oLCB1ZGkvdWRpcDJzb2MuYywgdWRpL3VkaXBoY2ZnLmgsIHVkaS91ZGlwaHVuaXguaCwKKwkgIHVkaS91ZGlwcm9jLmgsIHVkaS91ZGlwdDI5ay5oLCB1ZGkvdWRpcHRjZmcuaCwgdWRpL3VkaXNvYy5oLAorCSAgdWRpL3Vkci5jOiBDaGFuZ2UgQU1EIGNvcHlyaWdodHMgdG8gRlNGIGNvcHlsZWZ0ICc5My4KKworCSogcmVtb3RlLWViLmMgKGdldF9oZXhfcmVncywgZWJfZmV0Y2hfcmVnaXN0ZXJzKSwgcmVtb3RlLWFkYXB0LmMKKwkgIChnZXRfaGV4X3JlZ3MsIGFkYXB0X2ZldGNoX3JlZ2lzdGVycyk6IGNhc3QgYXJncyB0bworCSAgc3VwcGx5X3JlZ2lzdGVyIHRvIGF2b2lkIGdjYyB3YXJuaW5nLgorCisJKiBjb25maWcvYTI5ay9hMjlrLm10IChUREVQRklMRVMpOiBkcm9wIG1pbmltb24gc3VwcG9ydC4gIEl0CisJICBkb2Vzbid0IGNvbXBpbGUgb24gc29sYXJpcyBhbmQgaXMgbm93IG9ic29sZXRlLgorCisJKiBjb25maWcvc3BhcmMvc3VuNG9zNC5taCAoWE1fQ0xJQlMpOiByZW1vdmUgLWxyZXNvbHYuICBUaGlzCisJICBicmVha3Mgc3RvY2sgc3Vub3MgaW5zdGFsbGF0aW9ucy4KKworV2VkIEp1biAgOSAwNjoxNDozMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogbTY4ay1zdHViLmM6IEFkZCBjb21tZW50IGFib3V0IGZyYW1lIGNhY2hlLgorCisJKiB0YXJnZXQuaCAodGFyZ2V0X3N0b3JlX3JlZ2lzdGVycyk6IERvYyBmaXggcmUgZXJyb3IgaGFuZGxpbmcuCisKKwkqIGZpbmR2YXIuYyAod3JpdGVfcmVnaXN0ZXIpOiBDYWxsIFNXQVBfVEFSR0VUX0FORF9IT1NUIHJlZ2FyZGxlc3MKKwlvZiByZWdpc3Rlcl92YWxpZFtyZWdub10uCisKK1R1ZSBKdW4gIDggMTQ6NDI6MTAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQorCisJKiBzeW10YWIuaCwgZHdhcmZyZWFkLmM6IERvYyBmaXggcmUgZGVwZW5kZW5jaWVzLgorCitUdWUgSnVuICA4IDE3OjU0OjA5IDE5OTMgIFJvYiBTYXZveWUgIChyb2JAcnRsLmN5Z251cy5jb20pCisKKwkqIHNlcmlhbC5jIChzZXJpYWxfY2xvc2UpOiBJZiBzY2IgaXMgTlVMTCwgZG9uJ3QgdHJ5IHRvIGNsb3NlCisJaXQuIAorCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3Igcm9tNjhrIGFuZCBidWcgYm9vdCBtb25pdG9ycy4KKworVHVlIEp1biAgOCAxNzozOToxMiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBjb2ZmcmVhZC5jIChpbml0X3N0cmluZ3RhYik6IEZpeCBidWcgd2hlcmUgc2l6ZW9mKGxvbmcpICE9IDQuCisJKiBnZGJjb3JlLmgsIGNvcmUuYyAocmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlcik6IE5ldyBmdW5jdGlvbi4KKwkqIGZpbmR2YXIuYyAocmVhZF9yZWdpc3Rlciwgd3JpdGVfcmVnaXN0ZXIpOiBGaXggdGhpbmtvIHdoZXJlCisJc2l6ZW9mKGhvc3QgbG9uZykgIT0gc2l6ZW9mKHRhcmdldCBpbnQpLgorCSogaDgzMDAtdGRlcC5jOiBVc2UgbmV3IHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgY2FsbC4KKwkqIHNoLXRkZXAuYyAoX2luaXRpYWxpemVfc2hfdGRlcCk6IEFkZCBtZW1vcnlfc2l6ZSBjb21tYW5kLgorCitUdWUgSnVuICA4IDE0OjQyOjEwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBydGwuY3lnbnVzLmNvbSkKKworCSogTW92ZSBjb25maWcvbTY4ay90bS1tNjhrLmggKEZSQU1FX0ZJTkRfU0FWRURfUkVHUykgdG8KKwltNjhrLXRkZXAuYyAobTY4a19maW5kX3NhdmVkX3JlZ3MpLiAgRG9uJ3QgZHVwbGljYXRlIGNvZGUgYmV0d2VlbgorCTY4ODgxIGFuZCBub24tNjg4ODEgY2FzZXMuICBDaGVjayBmb3IgYSBwYWlyIG9mIG1vdmVsIGluc3RydWN0aW9ucy4KKworVHVlIEp1biAgOCAxNDo1Mjo1NSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCisKKwlGaXJzdCBjdXQgYXQgc3BhcmMtdnh3b3JrcyB0YXJnZXR0aW5nLgorCSogY29uZmlnL3NwYXJjL3RtLXZ4c3BhcmMuaCwgY29uZmlnL3NwYXJjL3Z4c3BhcmMubXQ6IG5ldyBmaWxlcy4KKwkqIGNvbmZpZ3VyZS5pbjogc3BhcmMtdnh3b3JrcyBnZGJfdGFyZ2V0IG5vdyB2eHNwYXJjLgorCisJKiByZW1vdGUtZWIuYywgcmVtb3RlLmM6IHN5bWZpbGUuaCByZXF1aXJlcyBiZmQuaCBzbyBpbmNsdWRlIGl0LgorCitUdWUgSnVuICA4IDE0OjQyOjEwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL202OGsveG0tbmV3cy5oOiBhZGQgImV4dGVybiBpbnQgZXJybm8iLgorCitUdWUgSnVuICA4IDEzOjQ1OjA3IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKKworCSogcmVtb3ZlLXZ4LmMgKHZ4X3JlYWRfcmVnaXN0ZXIsIHZ4X3dyaXRlX3JlZ2lzdGVyKTogY29sbGFwc2UKKwkgIGlmZGVmIEk4MDk2MCBlbHNlIChhc3N1bWVzKSBtNjhrIGludG8gcGFyYW1ldGVyaXphYmxlIG1hY3JvcworCSAgVlhfTlVNX1JFR1MgYW5kIFZYX1NJWkVfRlBSRUdTLgorCSogY29uZmlnL202OGsvdG0tdng2OC5oLCBjb25maWcvaTk2MC90bS12eDk2MC5oIChWWF9OVU1fUkVHUywKKwkgIFZYX1NJWkVfRlBSRUdTKTogbmV3IGRlZmluaXRpb25zLgorCitUdWUgSnVuICA4IDExOjA4OjI5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBzeW1maWxlLntjLGh9IChnZW5lcmljX2xvYWQpOiBOZXcgZnVuY3Rpb24uCisJcmVtb3RleywtbmluZHksLWViLC1taXBzfS5jOiBVc2UgaXQuCisKK01vbiBKdW4gIDcgMjA6MDc6MzAgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGRlcGVuZCk6ICBNb3JlIHNlZCBndWJiaXNoIHRvIGRlYWwgd2l0aAorCS4uL2JmZC9iZmQuaCBiZWluZyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBidWlsZC4KKwkqIGRlcGVuZDogIFJlLWRvbmUgd2l0aCBjb3JyZWN0ZWQgbWFrZWZpbGUuCisKK01vbiBKdW4gIDcgMTY6MzI6MDUgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChCRkRfU1JDX0RJUik6ICBSZW5hbWVkIGRlZiBhbmQgdXNhZ2VzIGZyb20gQkZEX0RJUi4KKwkqIE1ha2VmaWxlLmluIChCRkRfT0JKX0RJUik6ICBOZXcgZGVmaW5pdGlvbiBmb3IgdGhlIGJmZCBidWlsZAorCWRpcmVjdG9yeSB0byBmaW5kIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGhlYWRlciBmaWxlcyBhbmQgbGlicmFyeS4KKwkqIE1ha2VmaWxlLmluIChCRkRfTElCKTogIFVzZSBCRkRfT0JKX0RJUi4KKwkqIE1ha2VmaWxlLmluIChMSU5URkxBR1MpOiAgSW5jbHVkZSBCRkRfT0JKX0RJUi4KKwkqIE1ha2VmaWxlLmluIChzYWJlcl9nZGIpOiAgSW5jbHVkZSBCRkRfT0JKX0RJUi4KKwkqIE1ha2VmaWxlLmluIChkZXBlbmQpOiAgSW5jbHVkZSBCRkRfT0JKX0RJUiBpbiBnY2MgYXJncy4KKwkqIE1ha2VmaWxlLmluIChwYXJlYWQubywgeGNvZmZleGVjLm8pOiAgUmVtb3ZlLCBub3cgaW4gZGVwZW5kLgorCSogZGVwZW5kLCBhbGxkZXBzLm1hazogIFJlYnVpbGQgYWZ0ZXIgTWFrZWZpbGUuaW4gY2hhbmdlcy4KKworRnJpIEp1biAgNCAxMDoxODo1MSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogY2hhbmdlIGx5bnggc3VwcG9ydCB0byBDUFUtKi1seW54b3MqCisKKwkqIE1ha2VmaWxlLmluIChzdWJkaXJfZG8pOiBjaGFuZ2UgdGVzdCBmcm9tIGV4aXN0ZW5jZSBvZiBkaXJlY3RvcnkKKwl0byBleGlzdGVuY2Ugb2YgTWFrZWZpbGUgKHRoZSBkaXJlY3RvcnkgbWF5IGV4aXN0IGJ1dCBub3QgYmUgY29uZmlndXJlZCkKKworVGh1IEp1biAgMyAwMToxODo1MSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9zcGFyYy94bS1zdW40c29sMi5oOiBkZWZpbmUgTUVNX0ZOU19ERUNMQVJFRAorCitGcmkgSnVuICA0IDEwOjQzOjMzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChtaXBzLWlkdC1lY29mZmwqKTogTmV3IHRhcmdldDsgdXNlIGlkdGwuCisJKG1pcHMtaWR0LWVjb2ZmKik6IEFkZGVkIHRyYWlsaW5nICcqJy4KKwkqIGNvbmZpZy9taXBzL2lkdGwubXQ6IE5ldyBmaWxlOyBsaWtlIGlkdC5tdCwgYnV0IGxpdHRsZSBlbmRpYW4uCisKK1RodSBKdW4gIDMgMTc6MzY6NTYgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogc2VyLWdvMzIuYzogIENsZWFuIHVwIGxvdHMgb2YgY29tcGlsYXRpb24gbml0cy4KKworVGh1IEp1biAgMyAxNDo0NDo1NyAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBQYXRjaGVzIGZyb20gSmVmZnJleSBMYXcgPGxhd0Bjcy51dGFoLmVkdT4uCisJKiBocHBhYi1uYXQuYzogRWxpbWluYXRlIHVubmVjZXNzYXJ5IGlmZGVmcyBmb3IKKwlGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMsIENBTk5PVF9GRVRDSF9SRUdJU1RFUiwgYW5kCisJQ0FOTk9UX1NUT1JFX1JFR0lTVEVSLgorCShmZXRjaF9yZWdpc3Rlcik6IERlbGV0ZSBjb2RlIHRvIGhhbmRsZSBDQU5OT1RfRkVUQ0hfUkVHSVNURVIuCisJKiBocHBhLXBpbnNuLmM6IFN1cHBvcnQgJ0knLCAnSicsIGFuZCAnSycgaW4gb3V0cHV0CisJdGVtcGxhdGVzIGZvciAxLjEgRlAgY29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbnMuCisKK1RodSBKdW4gIDMgMDM6MzQ6NDkgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBSZW1vdmUgc2VyLXRjcC5bY29dLiAgKFVzZSBYREVQRklMRVMgaW5zdGVhZC4pCisJKiBhbGxkZXBzLm1haywgZGVwZW5kOiAgUmVidWlsZCB0byBhY2NvdW50IGZvciBzZXItdGNwLgorCSogY29uZmlnL3NwYXJjL3N1bjRvczQubWg6ICBBZGQgc2VyLXRjcCB0byBYREVQRklMRVMuCisJKiBnZGJzZXJ2ZXIvTWFrZWZpbGUuaW4gKGdkYnNlcnZlcik6ICBVc2UgLWxic2QuCisJKiBnZGJzZXJ2ZXIvcmVtb3RlLWluZmxvd3stc3BhcmN9LmMgKGNyZWF0ZV9pbmZlcmlvcik6ICBEb24ndCB1c2UgYQorCXNoZWxsIHdoZW4gcnVubmluZyB0aGUgY2hpbGQsIGFzIGFyZ3MgaGF2ZSBiZWVuIGV4cGFuZGVkIGJ5IHRoZQorCXRpbWUgd2UgZ2V0IGhlcmUuICBTaW1wbGlmeSBjYWxsaW5nIGNvbnZlbnRpb24uCisJKiBnZGJzZXJ2ZXIvcmVtb3RlLXNlcnZlci5jIChtYWluKTogIFVzZSBuZXcgY2FsbGluZyBjb252ZW50aW9uCisJZm9yIGNyZWF0ZV9pbmZlcmlvciwgcmVtb3ZlIGRlZnVuY3QgY29kZSBmb3IgY29hbGVzY2luZyBhcmd2LgorCVJlbW92ZSBleHRyYSBjYWxscyB0byBteXdhaXQoKSwgYXMgd2Ugbm8gbG9uZ2VyIGhhdmUgdG8gd2FkZQorCXRocm91Z2ggYSBzaGVsbC4KKworCSogdGFyZ2V0LmMgKHRhcmdldF9yZWFkX21lbW9yeV9wYXJ0aWFsKTogIERvbid0IGRlcmVmIGVycm5vcHRyCisJd2hlbiBjaGVja2luZyBmb3IgbnVsbCBwb2ludGVyLgorCitXZWQgSnVuICAyIDE5OjU4OjQ2IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiByZW1vdGUtZXMxODAwLmM6ICBGaXggdHlwby4KKworVHVlIEp1biAgMSAyMToyMjozOSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogdGFyZ2V0LmMgKHRhcmdldF9yZWFkX21lbW9yeV9wYXJ0aWFsKTogIExpa2UgdGFyZ2V0X3JlYWRfbWVtb3J5LAorCWJ1dCBkb2VzIHBhcnRpYWwgcmVhZHMsIHN1Y2ggYXMgcmVhZHMgdGhhdCBidW1wIGludG8gdGhlIGVuZCBvZgorCXRoZSBhZGRyZXNzIHNwYWNlLgorCSogdGFyZ2V0LmggKHRhcmdldF9yZWFkX21lbW9yeV9wYXJ0aWFsKTogIEFkZCBwcm90b3R5cGUuCisJKiB2YWxwcmludC5jIChQUklOVF9NQVhfREVGQVVMVCk6ICBOZXcgZGVmaW5lLCBpbml0aWFsIHZhbHVlIDIwMC4KKwkqIHZhbHByaW50LmMgKHZhbF9wcmludF9zdHJpbmcpOiAgQ29tcGxldGUgcmV3cml0ZSB0byBmaXggYnVnIHdpdGgKKwlidW1waW5nIGludG8gZW5kIG9mIG1lbW9yeSwgYXZvaWRpbmcgdW5uZWNlc3NhcmlseSBsb25nIHJlYWRzLCBhbmQKKwlmaXhpbmcgYnVnIHdoZW4gcHJpbnRfbWF4IGlzIHNldCB0byAwICh1bmxpbWl0ZWQgcHJpbnQgbGVuZ3RoKS4KKwkqIHZhbHByaW50LmMgKF9pbml0aWFsaXplX3ZhbHByaW50KTogIFVzZSBQUklOVF9NQVhfREVGQVVMVCB0bworCWluaXRpYWxpemUgcHJpbnRfbWF4LgorCitUdWUgSnVuICAxIDE4OjExOjM1IDE5OTMgIFJvYiBTYXZveWUgIChyb2IgYXQgZGFya3N0YXIuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3Igcm9tNjhrIGFuZCBidWcgYm9vdCBtb25pdG9ycy4KKworTW9uIE1heSAzMSAxMDozNzowNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogcHJpbnRjbWQuYyAocHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCk6IFByaW50IGludGVnZXJzIGJpZ2dlciB0aGFuCisJTE9OR0VTVCBpbiBoZXggbm8gbWF0dGVyIGhvdyBiaWcsIGFuZCBubyBtYXR0ZXIgd2hhdCB0aGUgZm9ybWF0CisJYW5kIHNpemUuCisKKwkqIHN0YWJzcmVhZC5jIChyZWFkX3R5cGUpOiBTa2lwIHR5cGUgYXR0cmlidXRlcyBpZiBwcmVzZW50LgorCisJKiBzdGFic3JlYWQuYyAocmVhZF9odWdlX251bWJlcik6IERvbid0IGFjY2VwdCAnMCcgKyByYWRpeCBhcyBwYXJ0CisJb2YgbnVtYmVyLCBqdXN0IHRocm91Z2ggJzAnICsgcmFkaXggLSAxLgorCitTdW4gTWF5IDMwIDE1OjM1OjIxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoU0VSX0hBUkRXSVJFKTogIFRlbXBvcmFyaWx5IGNvbW1lbnQgb3V0IHNlci10Y3Auby4KKworCSoge2RieHJlYWQuYywgZHdhcmZyZWFkLmN9IChyZWFkX29maWxlX3N5bXRhYik6ICBSZXdyaXRlIHRvIHRha2UKKwlzaW5nbGUgcGFyYW1ldGVyLCB0aGUgcG9pbnRlciB0byB0aGUgcGFydGlhbCBzeW10YWIsIHJhdGhlciB0aGFuCisJYSBidW5jaCBvZiBhcmdzIHRoYXQgYXJlIGRlcml2ZWQgZnJvbSB0aGUgcGFydGlhbCBzeW10YWIuICBDaGFuZ2UKKwlwcm90b3R5cGVzIGFuZCBjYWxsZXJzIHRvIG1hdGNoLgorCisJKiBkYnhyZWFkLmMgKHJlYWRfb2ZpbGVfc3ltdGFiKTogIFJlbW92ZSAiI2lmIDEiIGFyb3VuZCBjb2RlIHRvCisJc2V0IGRlbWFuZ2xpbmcgc3R5bGUgYXV0b21hdGljYWxseS4KKwkqIGRlZnMuaCAoQ1BMVVNfTUFSS0VSKTogIENsYXJpZnkgY29tbWVudCB0aGF0IHRoaXMgaXMgb25seSBmb3IKKwlHTlUgQysrLCBub3QgQysrIGluIGdlbmVyYWwuCisJKiBzeW10YWIuaCAoZ2VuZXJhbF9zeW1ib2xfaW5mbyk6ICBTaW1wbGlmeSBieSBlbGltaW5hdGluZyBvbmUKKwlzdHJ1Y3R1cmUgbGV2ZWwgZm9yIHRoZSBsYW5ndWFnZSBkZXBlbmRlbnQgaW5mby4KKworU2F0IE1heSAyOSAxNTo1OToyOSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogYy10eXBlcHJpbnQuYyAoY190eXBlX3ByaW50X2Jhc2UpOiAgQXZvaWQgZGVyZWZlcmVuY2luZyBOVUxMCisJbmFtZXMgZm9yIFRZUEVfQ09ERV9TVFJVQ1QgYW5kIFRZUEVfQ09ERV9VTklPTiB0eXBlcy4KKwlUWVBFX0NPREVfRU5VTSB3YXMgYWxyZWFkeSB0ZXN0aW5nIGZvciB0aGlzLgorCitGcmkgTWF5IDI4IDE3OjE4OjA1IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgQWRkIG5ldyBmaWxlIHNlci10Y3AuYy4KKwkqIGRlZnMuaCAobWVtY21wKTogIEFkZCBkZWNsIGZvciBtZW1jbXAgdG8gI2lmbmRlZiBNRU1fRk5TX0RFQ0xBUkVELgorCSogZmluZHZhci5jICh3cml0ZV9yZWdpc3Rlcik6ICBTZWUgaWYgd2UgYXJlIHdyaXRpbmcgYmFjayB0aGUgc2FtZQorCXZhbHVlIHRoYXQncyBhbHJlYWR5IGluIHRoZSByZWdpc3Rlci4gIElmIHNvLCBkb24ndCBib3RoZXIuCisJKiByZW1vdGUuYyAocHV0cGt0LCBnZXRwa3QpOiAgSW1wcm92ZSBoYW5kbGluZyBvZiBjb21tdW5pY2F0aW9uCisJcHJvYmxlbXMuCisJKiBzZXItZ28zMi5jOiAgUHJvdG90eXBlIGl0IHRvIGRlYXRoLiAgVXBkYXRlIHNlcmlhbF9vcHMgYW5kIGFkZAorCWR1bW15IHJvdXRpbmVzIHdoZXJlIGFwcHJvcHJpYXRlLgorCSogc2VyLXRjcC5jOiAgTmV3IG1vZHVsZSB0byBpbXBsZW1lbnQgc2VyaWFsIEkvTyB2aWEgVENQCisJY29ubmVjdGlvbnMuCisJKiBzZXItdW5peC5jOiAgQ2xlYW4gdXAgZ2V0dGluZy9zZXR0aW5nIG9mIHR0eSBzdGF0ZS4gIEdldCByaWQgb2YKKwlTRVJJQUxfUkVTVE9SRSwgYWRkIFNFUklBTF97R0VUfFNFVH1fVFRZX1NUQVRFIGludGVyZmFjZXMuCisJKiBzZXJpYWwuYzogIEFkZCBzdGFydCBvZiBzdXBwb3J0IGZvciBjb25uZWN0IGNvbW1hbmQuCisJKHNlcmlhbF9vcGVuKTogIERpc3Rpbmd1aXNoIGJldHdlZW4gdGNwIGFuZCBsb2NhbCBkZXZpY2VzLgorCSogc2VyaWFsLmggKHN0cnVjdCBzZXJpYWxfb3BzKTogIEdldCByaWQgb2YgcmVzdG9yZSwgYWRkCisJZ2V0X3R0eV9zdGF0ZSBhbmQgc2V0X3R0eV9zdGF0ZS4gIERlZmluZSBwcm90b3lwZXMgYW5kIG1hY3JvcyBmb3IKKwl0aGlzIG1lc3MuCisJKiBnZGJzZXJ2ZXIvcmVtb3RlLXV0aWxzLmM6ICBBZGQgdGNwIHN1cHBvcnQuICAocmVhZGNoYXIpOiAgRG8KKwlzb21lIHJlYWwgYnVmZmVyaW5nLiAgSGFuZGxlIGVycm9yIGNvbmRpdGlvbnMgZ3JhY2VmdWxseS4KKwkqIGdkYnNlcnZlci9yZW1vdGUtaW5mbG93LXNwYXJjLmM6ICBVcGRhdGUgdG8gcmVtb3RlLWluZmxvdy5jCisJKEx5bngpLCByZW1vdmUgbG90cyBvZiBjcnVmdC4KKworRnJpIE1heSAyOCAxNzoyNDo1MSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIHByaW50Y21kLmMgKHByaW50X2FkZHJlc3Nfc3ltYm9saWMpOiB0dXJuIHRoaXMgaW50byBhbiBhc3NpZ21lbnQKKwlpbnN0ZWFkIG9mIGFuIGluaXRpYWxpemF0aW9uIChtYW55IGNvbXBpbGVycyBkb24ndCBhY2NlcHQKKwlzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24pLiAKKworVGh1IE1heSAyNyAxNjo1NjoyNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogeGNvZmZyZWFkLmMgKHJlYWRfeGNvZmZfc3ltdGFiKTogSWYgc2V2ZXJhbCBwcm9ncmFtIGNzZWN0cyBpbiBvbmUKKwlzb3VyY2UgZmlsZSwgZ2l2ZSB0aGVtIGFsbCB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUsIHJhdGhlciB0aGFuCisJdGhlIDJuZCBhbmQgc3Vic2VxdWVudCBvbmVzIGhhdmluZyBOVUxMIG5hbWVzLgorCitUaHUgTWF5IDI3IDA2OjE2OjU2IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogcHJpbnRjbWQuYyAocHJpbnRfYWRkcmVzc19zeW1ib2xpYyk6ICBBcHBlbmQgc291cmNlIGZpbGVuYW1lIGFuZAorCWxpbmVudW1iZXIgb2YgdGhlIHN5bWJvbCBpZiBwcmludCBzeW1ib2wtZmlsZW5hbWUgaXMgb24uCisJKGluaXRpYWxpemVfcHJpbnRjbWQpOiAgYHNldCBwcmludCBzeW1ib2wtZmlsZW5hbWUnLgorCitXZWQgTWF5IDI2IDEzOjQ2OjE2IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIEFkZCBjb25maWcgZm9yIEx5bnggdGFyZ2V0LiAgQ29uZmlndXJlIGdkYnNlcnZlcgorCW9ubHkgZm9yIEx5bnguICBSZS1kbyBzZWxlY3RpdmUgY29uZmlndXJhdGlvbiBvZiBzcGFyY2xpdGUuCisKKwkqIGdkYnNlcnZlci97cmVtb3RlLWd1dGlscy5jIHJlbW90ZS1zZXJ2ZXIuYyBNYWtlZmlsZS5pbgorCWNvbmZpZ3VyZS5pbiByZW1vdGUtaW5mbG93LmMgcmVtb3RlLXV0aWxzLmN9OiAgTmV3IGZpbGVzIHRvCisJc3VwcG9ydCBHREIgcmVtb3RlIHNlcnZlci4gIEN1cnJlbnRseSBvbmx5IHdvcmtzIGZvciBMeW54LgorCitXZWQgTWF5IDI2IDEwOjI4OjE0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFic3JlYWQuYyAoZGVmaW5lX3N5bWJvbCwgY2FzZSAndCcpOiBPbmx5IHNldCB0aGUgbmFtZSBpZiBpdAorCWlzIG5vdCBhIHBvaW50ZXIgdHlwZS4KKworCSogc3RhYnNyZWFkLmMgKGRlZmluZV9zeW1ib2wpOiBDbGVhbiB1cCBsb2dpYzsgbW92ZSB0aGUgcmVhZF90eXBlCisJY2FsbHMgdG8gaW5zaWRlIHRoZSBzd2l0Y2ggc3RhdGVtZW50ICh0aGlzIGltcHJvdmVzIHRoZSBlcnJvcgorCWhhbmRsaW5nKS4KKworCSogbWlwc3JlYWQuYyAocGFyc2Vfc3ltYm9sLCBwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiBEZWFsIHdpdGggRm9ydHJhbgorCWNvbW1vbiBibG9ja3MuCisKK1R1ZSBNYXkgMjUgMjA6NDQ6MjQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHByaW50Y21kLmMgKHByaW50X2Zvcm1hdHRlZCwgY2FzZSAnaScpOiBQYXNzIGEgdGFiIHRvIHdyYXBfaGVyZS4KKworCSogc291cmNlLmMgKGxpbmVfaW5mbyk6IENoYW5nZSAicGMiIHRvICJhZGRyZXNzIiBpbiBtZXNzYWdlcyBhbmQKKwl1c2UgcHJpbnRfYWRkcmVzcyBmb3IgYWRkcmVzc2VzLgorCisJKiBzb3VyY2UuYyAobGluZV9pbmZvKTogSWYgd2UgZG9uJ3QgZmluZCBhIHN5bXRhYiwgcHJpbnQgbW9yZSB1c2VmdWwKKwlvdXRwdXQsIGluY2x1ZGluZyB0aGUgc3ltYm9saWMgYWRkcmVzcy4KKworCSogc291cmNlLmMgKGxpbmVfaW5mbyk6IElmIC0tZnVsbG5hbWUsIGRpc3BsYXkgdGhlIHNvdXJjZS4KKwkoaWRlbnRpZnlfc291cmNlX2xpbmUpLCBjYWxsZXJzOiBUYWtlIHBjIGFzIGFyZ3VtZW50LCByYXRoZXIgdGhhbgorCWFzc3VtaW5nIGlubmVybW9zdCBmcmFtZSAoZW1hY3MgZG9lc24ndCB1c2UgdGhpcywgc28gbm8gb25lIGV2ZXIKKwlub3RpY2VkKS4KKwkqIHN5bXRhYi5oOiBEZWNsYXJlIGZyYW1lX2ZpbGVfZnVsbF9uYW1lLgorCSogbWFpbi5jOiBEb24ndC4KKworVHVlIE1heSAyNSAxNTozMDo0MyAxOTkzICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCisKKwkqIGJyZWFrcG9pbnQuYyAoY2F0Y2hfY29tbWFuZF8xKTogRml4IHR5cG8gaW4gZXJyb3IgbXNnLgorCitUdWUgTWF5IDI1IDE2OjA1OjU1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKKworCSogZWxmcmVhZC5jIChlbGZfc3ltZmlsZV9yZWFkKTogVXBkYXRlIEVMRiBzdHJ1Y3R1cmUgYW5kIHJvdXRpbmUKKwluYW1lcyB0byBzcGVjaWZ5IDMyLWJpdCB2ZXJzaW9ucy4KKwkoZWxmX3N5bXRhYl9yZWFkKTogUmV0cmlldmUgc2l6ZSBmaWVsZCBkaXJlY3RseSBmcm9tIHN5bWJvbCwKKwlpbnN0ZWFkIG9mIHVzaW5nIG9sZCBrbHVkZ2UuCisKKwkqIG1pcHMtcGluc24uYyAocHJpbnRfaW5zbik6IENhc3QgYWRkcmVzcyB0byBiZmRfdm1hIGJlZm9yZQorCWNhbGxpbmcgb3Bjb2RlcyBsaWJyYXJ5LgorCSogejhrLXRkZXAuYyAocHJpbnRfaW5zbik6IExpa2V3aXNlLgorCitUdWUgTWF5IDI1IDEzOjA2OjI4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFic3JlYWQuYzogUmVtb3ZlIGFsbCB1c2VzIG9mIGVycm9yKCkuICBNYWtlIGVycm9yX3R5cGUgYW5kCisJcmVhZF90eXBlX251bWJlciBzdGF0aWMuCisJKGRlZmluZV9zeW1ib2wpOiBEb24ndCB0cnkgdG8gZGVhbCB3aXRoIGEgbWlzc2luZyBzeW1ib2wKKwlkZXNjcmlwdG9yIHdoaWNoIGlzbid0IGZvbGxvd2VkIGJ5IGRpZ2l0LCAnKCcsIG9yICctJy4KKwkqIHN0YWJzcmVhZC5oOiBEb24ndCBkZWNsYXJlIHJlYWRfdHlwZV9udW1iZXIgaGVyZS4KKwkqIGdkYnR5cGVzLmg6IERvbid0IGRlY2xhcmUgZXJyb3JfdHlwZSBoZXJlLgorCSogeGNvZmZyZWFkLmM6IFJlbW92ZSBOT19UWVBFREVGUyBjb2RlLgorCitUdWUgTWF5IDI1IDA5OjMzOjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbWlwcy10ZGVwLmM6IFJlbW92ZWQgI2luY2x1ZGUgb2YgbWFueSBoZWFkZXIgZmlsZXMsIGFuZCAjZGVmaW5lCisJb2YgTUlQU01BR0lDOyBubyBsb25nZXIgdXNlZC4KKworVHVlIE1heSAyNSAwOTozNjoxMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogTWFueSBwbGFjZXM6IHJlcGxhY2UgInRoZSBpbmZlcmlvciIgaW4gbWVzc2FnZXMgd2l0aCAidGhlIHByb2dyYW0iCisJb3IgInRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkIi4KKwkqIGluZmxvdy5jICh0cnlfd3JpdGluZ19yZWdzKTogUmVtb3ZlOyBpdCdzIGJlZW4gI2lmIDAnZCBmb3JldmVyCisJYW5kIEknbSBnZXR0aW5nIHNpY2sgb2YgbWFpbnRhaW5pbmcgaXQuCisKKwkqIGNvbmZpZy9pMzg2L2xpbnV4Lm1oOiBEb24ndCB1c2UgXCBuZXdsaW5lOyB0aGUgYXdrIHNjcmlwdHMgZG9uJ3QKKwlzdXBwb3J0IGl0LgorCisJKiBjb25maWcvaTM4Ni9nbzMyLm1oOiBEZWZpbmUgU0VSX0hBUkRXSVJFLgorCSogTWFrZWZpbGUuaW46IERlZmluZSBTRVJfSEFSRFdJUkUuCisJKERFUEZJTEVTKTogVXNlIGl0LgorCShhbGxkZXBzLm1hayk6IEFkZCBTRVJfSEFSRFdJUkUuCisJUmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIHNlci1oYXJkd2lyZS57YyxvfS4KKwkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGFsbCBzZXJfaGFyZHdpcmUgYW5kIGdkYl9zZXJpYWxfZHJpdmVyIHN0dWZmLgorCitNb24gTWF5IDI0IDIzOjUwOjA1IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogc3BhcmMtbmF0LmMgKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBGaWxsIGluIGFsbCBtZW1iZXJzIG9mCisJaW5mZXJpb3JfZnBfcmVnaXN0ZXJzIGJ5IHJlYWRpbmcgdGhlbSBmcm9tIHRoZSBpbmZlcmlvciBiZWZvcmUKKwltb2RpZnlpbmcgYW5kIHdyaXRpbmcgdGhlbSBiYWNrLgorCUZpeGVzIHVuZXhwbGFpbmFibGUgaW5mZXJpb3IgRlAgZXhjZXB0aW9ucyBhZnRlciBjYWxscyB0byB0aGUgaW5mZXJpb3IKKwlvciBzZXR0aW5nIG9mIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycy4KKwkqIG1pcHMtdGRlcC5jIChtaXBzX3NraXBfcHJvbG9ndWUpOiAgU2tpcCBtb3ZlIG9mIGFyZ3VtZW50IHJlZ2lzdGVyCisJdG8gcmVnaXN0ZXIgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGdjYy0yLjQuCisKK1R1ZSBNYXkgMjUgMDA6NDI6MzkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCisKKwkqIGhwcGEtcGluc24uYzogRGVmaW5lIE9MRF9UQUJMRSBiZWZvcmUgaW5jbHVkaW5nIG9wY29kZS9ocHBhLmguCisKK01vbiBNYXkgMjQgMTM6NTU6MTQgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2kzODYve2kzODZseW54Lm1oIGkzODZseW54Lm10IG5tLWkzODZseW54LmggdG0taTM4Nmx5bnguaAorCXhtLWkzODZseW54Lmh9OiAgTmV3IGNvbmZpZ3VyYXRpb24gZm9yIEx5bnguCisKK01vbiBNYXkgMjQgMTA6MDE6MTAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIG1pcHNyZWFkLmMgKHBhcnNlX3N5bWJvbCk6IERlYWwgd2l0aCBzY1ZhciBhbmQgc2NWYXJSZWdpc3Rlci4KKwkqIHN5bXRhYi5oOiBDb21tZW50IHRoYXQgTE9DX1JFR1BBUk1fQUREUiBjYW4gYmUgY2FsbCBieSByZWZlcmVuY2UuCisKKwkqIGMtdHlwZXByaW50LmMgKGNfdHlwZV9wcmludF9iYXNlKTogRG9uJ3QgcHJpbnQgdHlwZWRlZidkIG5hbWVzCisJYXMgc3RydWN0LCB1bmlvbiwgb3IgZW51bSB0YWdzLgorCitNb24gTWF5IDI0IDAxOjEwOjAxIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogc3ltbWlzYy5jIChkdW1wX21zeW1ib2xzKTogQXZvaWQgZ2RiIGNvcmVkdW1wIHdpdGggc3RyaXBwZWQKKwlleGVjdXRhYmxlLgorCitTYXQgTWF5IDIyIDEwOjAzOjA5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpLAorCWluZmNtZC5jIChwcm9ncmFtX2luZm8sIHNpZ25hbF9jb21tYW5kKTogIFVzZSBzeW1ib2xpYyBzaWduYWwgbmFtZXMuCisKKwkqIGluZnRhcmcuYyAoY2hpbGRfd2FpdCk6IERlYWwgd2l0aCBFSU5UUiBhbmQgaW5jbHVkZSBtZXNzYWdlIGZyb20KKwlzdHJlcnJvciBpZiBwcmludGluZyBhbiBlcnJvciBtZXNzYWdlLgorCisJKiBtYWluLmMgKGNvbW1hbmRfbGluZV9pbnB1dCk6IFVzZSBTVE9QX1NJR05BTCBub3QgU0lHVFNUUC4KKworCSogc3RhYnNyZWFkLmM6IFJlbW92ZSBtb3N0IHVzZXMgb2YgbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUuCisJKGRlZmluZV9zeW1ib2wpOiBVc2UgcmVhZF90eXBlIGZvciB0eXBlIG9mIGVudW0gY29uc3RhbnQsCisJbm90IGp1c3QgcmVhZF90eXBlX251bWJlci4gIEFsc28gZG9uJ3QgY2FsbCBlcnJvcigpLgorCShkZWZpbmVfc3ltYm9sKTogRm9yIHVucmVjb2duaXplZCBjb25zdGFudCB0eXBlLCBvbmUgY29tcGxhaW50ICh0aGUKKwlvbmUgZnJvbSBlcnJvcl90eXBlKSBpcwllbm91Z2guICBEb24ndCBtYWtlIG91ciBvd24gaW4gYWRkaXRpb24uCisJKGRlZmluZV9zeW1ib2wpOiBEb24ndCB0cmVhdCBhbiBOX0ZVTiAnUicgYXMgYSBwcm90b3R5cGUuCisJKiBnZGJ0eXBlcy5oOiBEb2MgZml4ZXMuCisKK1NhdCBNYXkgMjIgMDM6MzM6MDcgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJRml4IHN0YWNrIHVud2luZGluZyB0aHJvdWdoIF9zaWd0cmFtcCBvbiBJcml4LiBUaGVzZSBwYXRjaGVzIGFyZSBmcm9tCisJUGF1bCBGbGluZGVycyA8cHRmQGRlbGNhbS5jby51az4uCisJKiBtaXBzcmVhZC5jIChmaXh1cF9zaWd0cmFtcCk6IEZpbmQgX3NpZ3RyYW1wIG9uIElyaXggZXZlbiB3aGVuIHRoZQorCWV4ZWN1dGFibGUgdXNlcyBzaWd2ZWMuCisJKiBtaXBzLXRkZXAuYyAocmVhZF9uZXh0X2ZyYW1lX3JlZyk6IEFsbG93IHRtLWZpbGUgdG8gb3ZlcnJpZGUKKwlzaWdjb250ZXh0IG9mZnNldHMuCisJKiBjb25maWcvbWlwcy90bS1pcml4My5oOiBBZGQgc2lnY29udGV4dCBvZmZzZXRzIGZvciBJcml4LgorCitTYXQgTWF5IDIyIDAwOjM5OjAxIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogQ2xlYXIgc3RvcF9zaWduYWwgaWYgaXQgc2hvdWxkIG5vdAorCWJlIHBhc3NlZCB0byB0aGUgaW5mZXJpb3IgdG8gbWFrZSAiaGFuZGxlIDxzaWduYWw+IG5vcGFzcyBub3N0b3AiIHdvcmsuCisKK1NhdCBNYXkgMjIgMDA6MjE6NDEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb25maWcvbWlwcy90bS1pcml4My5oOiBDbGVhbiB1cCwgdXNlIHRtLWJpZ21pcHMuaCBhbmQgcmVkZWZpbmUKKwl0aGUgbmVjZXNzYXJ5IGJpdHMuCisJKiBmaW5kdmFyLmMgKHZhbHVlX2Zyb21fcmVnaXN0ZXIpOiBGaXggdW5pbml0aWFsaXplZCBmaXJzdF9hZGRyCisJd2hpY2ggY2F1c2VkIHByb2JsZW1zIHdpdGggYXNzaWdubWVudCBvZiBkb3VibGVzIHRvIHJlZ2lzdGVyIHZhcmlhYmxlcworCW9uIHNvbWUgdGFyZ2V0cy4KKwkqIG1pcHNyZWFkLmM6IFJlbW92ZSBUTV9GSUxFX09WRVJSSURFLCBpbmNsdWRlIHRtLmggYW5kIHByb3ZpZGUgdGhlCisJbWlzc2luZyBtaXBzIGRlZmluaXRpb25zIGlmIG5lY2Vzc2FyeS4KKworCUZpeCBoYW5kbGluZyBvZiBkb3VibGUgcmVnaXN0ZXIgdmFyaWFibGVzIGZvciBtaXBzIHRhcmdldHMgYW5kIGJpZworCWVuZGlhbiBob3N0cy4gVGhlc2UgcGF0Y2hlcyBhcmUgZnJvbSBQYXVsIEZsaW5kZXJzIDxwdGZAZGVsY2FtLmNvLnVrPi4KKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaDogSW5jcmVhc2UgTUFYX1JFR0lTVEVSX3tSQVcsVklSVFVBTH1fU0laRSB0bworCSAgOCBieXRlcyBmb3IgZG91Ymxlcy4KKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaCAoUkVHSVNURVJfQ09OVkVSVF9UT19UWVBFKTogTmV3IG1hY3JvIGZvcgorCSAgY29udmVyc2lvbiBvZiB0eXBlIGhlbGQgaW4gbXVsdGlwbGUgcmVnaXN0ZXJzIHRvIGhvc3QgZm9ybWF0LgorCSogY29uZmlnL21pcHMvdG0tbWlwcy5oIChSRUdJU1RFUl9DT05WRVJUX0ZST01fVFlQRSk6IE5ldyBtYWNybywKKwkgIGNvbXBhbmlvbiB0byBSRUdJU1RFUl9DT05WRVJUX1RPX1RZUEUuCisJKiBjb25maWcvbWlwcy90bS1taXBzLmggKEVYVFJBQ1RfUkVUVVJOX1ZBTFVFLCBTVE9SRV9SRVRVUk5fVkFMVUUpOgorCSAgQ29udmVydCB0byBmdW5jdGlvbiBjYWxscy4KKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaCAoRklYX0NBTExfRFVNTVkpOiBOZXcgY29kZSBmb3IgYmlnIGVuZGlhbgorCSAgbWlwcyB0YXJnZXRzLgorCSogbWlwcy10ZGVwLmMgKG1pcHNfcHJpbnRfcmVnaXN0ZXIpOiBSYXcgYnVmZmVyIG5vdyBuZWVkcyBqdXN0CisJICBNQVhfUkVHSVNURVJfUkFXX1NJWkUgYnl0ZXMuCisJKiBtaXBzLXRkZXAuYyAobWlwc19wcmludF9yZWdpc3Rlcik6IFVzZSBSRUdJU1RFUl9DT05WRVJUX1RPX1RZUEUKKwkgIChpZiBkZWZpbmVkKSBmb3IgZG91Ymxlcy4KKwkqIG1pcHMtdGRlcC5jOiAobWlwc19leHRyYWN0X3JldHVybl92YWx1ZSwgbWlwc19zdG9yZV9yZXR1cm5fdmFsdWUpOgorCSAgTmV3IGZ1bmN0aW9ucywgdGFrZSBjYXJlIG9mIFJFR0lTVEVSX0NPTlZFUlRfVE8vRlJPTV9UWVBFLgorCSogdmFsb3BzLmMgKHZhbHVlX2Fzc2lnbik6IFVzZSBSRUdJU1RFUl9DT05WRVJUX1RPX1RZUEUgaWYKKwkgIGRlZmluZWQuCisJKiBmaW5kdmFyLmMgKHZhbHVlX2Zyb21fcmVnaXN0ZXIpOiBVc2UgUkVHSVNURVJfQ09OVkVSVF9UT19UWVBFIGlmCisJICBkZWZpbmVkLgorCitGcmkgTWF5IDIxIDA5OjA0OjI1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IEFkZCBpWzM0XTg2LSotaXNjKi4KKworCSogc3RhYnNyZWFkLmM6IE1ha2Ugc3VyZSBhbGwgY29tcGxhaW4oKSBwYXNzIHRoZSBhZGRyZXNzIG9mIHRoZSBzdHJ1Y3QuCisKKwkqIHhjb2ZmcmVhZC5jOiBNYWtlIHN1cmUgYWxsIHN0cnVjdCBjb21wbGFpbnRzIGFyZSBzdGF0aWMgbm90IGF1dG8uCisKKwkqIE1ha2VmaWxlLmluOiBBZGQgcnVsZSBmb3IgeGNvZmZleGVjLm8gbGlrZSB0aGF0IGZvciBwYXJlYWQuby4KKworCSogeGNvZmZyZWFkLmMgKHByb2Nlc3NfeGNvZmZfc3ltYm9sLCBjYXNlIENfTFNZTSk6IFVzZSBkZWZpbmVfc3ltYm9sLgorCitXZWQgTWF5IDE5IDEyOjMzOjU5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWcvaTM4Ni9saW51eC5taDogUmUtZW5hYmxlIGNvcmVkdW1wcyBub3cgdGhhdCB0aGV5IHNob3VsZCB3b3JrLgorCitXZWQgTWF5IDE5IDE1OjQ0OjIwIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBjb25maWcvbTY4ay90bS1tNjhrLmggKEZSQU1FX0NIQUlOKTogYWRkIG1pc3NpbmcgY2xvc2UgcGFyZW4uCisKK1dlZCBNYXkgMTkgMTU6MzM6NTcgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3BhL25tLWhwcGFiLmg6ICBDb21tZW50IFBUUkFDRV9BUkczX1RZUEUuCisKK1dlZCBNYXkgMTkgMTI6MzM6NTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChJTlNUQUxMRURfTElCUyk6IE5ldyB2YXJpYWJsZS4KKworVHVlIE1heSAxOCAxNDowODo1MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbWFpbi5jIChxdWl0X2NvbW1hbmQpOiBJbiB0aGUgInF1aXQgYW55d2F5PyIgbWVzc2FnZSwgdGVsbCB0aGUgdXNlcgorCXdoZXRoZXIgd2UgYXJlIHBsYW5uaW5nIHRvIGRldGFjaCBvciBraWxsIHRoZSBwcm9ncmFtLgorCisJKiBjb25maWcvdmF4L3ZheGJzZC5taDogQWRkICJOQVRfRklMRT0gbm0tdmF4LmgiLgorCSogY29uZmlnL3ZheC94bS12YXhic2QuaDogVXNlIDxzeXMvcGFyYW0uaD4gbm90IDxtYWNoaW5lL2xpbWl0cy5oPgorCisJKiBpbmZjbWQuYyAocmVhZF9wYyk6IERvYyBmaXguCisKKwkqIHByaW50Y21kLmMgKHByaW50X2FkZHJlc3Nfc3ltYm9saWMpOiBVc2UgJXUgbm90ICVkIGZvciBvZmZzZXQuCisKKwkqIGJsb2NrZnJhbWUuYyAoZ2V0X3ByZXZfZnJhbWVfaW5mbyk6IElmIHBjIGluIHNpZ3RyYW1wLCBzZXQKKwlzaWduYWxfaGFuZGxlcl9jYWxsZXIuCisJKiB0bS02OGsuaCAoRlJBTUVfe0NIQUlOLFNBVkVEX1BDfSk6IERlYWwgd2l0aCBzaWd0cmFtcC4KKwkqIHRtLWhwMzAwYnNkLmg6IERlZmluZSBTSUdUUkFNUF97U1RBUlQsRU5EfSBub3QgSU5fU0lHVFJBTVAuCisJKiBpbmZlcmlvci5oIChJTl9TSUdUUkFNUCk6IERlZmluaXRpb24gbW92ZWQgZnJvbSBpbmZydW4uYy4KKwlVc2UgU0lHVFJBTVBfU1RBUlQgaWYgZGVmaW5lZC4KKwkqIGluZmNtZC5jIChzdGVwXzEpOiBVc2UgU0lHVFJBTVBfe1NUQVJULEVORH0gaWYgbmVlZGVkLgorCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogQ2hlY2sgSU5fU0lHVFJBTVAgYmVmb3JlIFNLSVBfUFJPTE9HVUUuCisKKwkqIGluZnB0cmFjZS5jOiBSZW1vdmUgdW51c2VkIEtFUk5FTF9VX0FERFJfSFBVWCBjb2RlLgorCisJKiBpbmZjbWQuYyAoc3RlcF8xKTogRml4IHBvb3JseSB3b3JkZWQgZXJyb3IgbWVzc2FnZS4KKworCSogY29uZmlnL3tpMzg2L2xpbnV4Lm1oLG02OGsvaXNpLm1ofSAoTkFUREVQRklMRVMpOgorCUNvbW1lbnQgb3V0IGNvcmVsb3cuYyBiZWNhdXNlIGNvcmUgZHVtcHMgYXJlIGJyb2tlbiBvbiB0aGVzZSBtYWNoaW5lcy4KKworCSogTWFrZWZpbGUuaW4gKGRlcGVuZCk6ICBQdXQgIiR7c3JjZGlyfSIgaW4gZ2VuZXJhdGVkIGRlcGVuZGVuY2llcworCWlmIHNyY2RpciBpcyBub3QgIi4iLgorCUFsc28gcHV0IGluIC1JJHtCRkRfRElSfSBvciAtSSR7UkVBRExJTkVfRElSfSBmb3IgZmlsZXMgd2hpY2ggbmVlZCBpdC4KKwkoSU5DTFVERV9DRkxBR1MpOiAgUmVtb3ZlIEJGRF9ESVIgYW5kIFJFQURMSU5FX0RJUi4KKwkqIGRlcGVuZDogIFVwZGF0ZSB0byBsYXRlc3QgYXV0b21hdGljYWxseSBidWlsdCB2ZXJzaW9uLgorCitUdWUgTWF5IDE4IDA4OjEwOjQ1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBDaGFuZ2VMb2csIENoYW5nZUxvZy05MjogIFNwbGl0IENoYW5nZUxvZyBhdCAxOTkzLgorCSogTWFrZWZpbGUuaW4gKE5PTlNSQyk6ICBBZGQgQ2hhbmdlTG9nLTkyCisKK1R1ZSBNYXkgMTggMDg6MDM6MzcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGZpbmR2YXIuYyAoe3JlYWQsd3JpdGV9X3JlZ2lzdGVyKTogVXNlIFJFR0lTVEVSX1JBV19TSVpFCisJbm90IHR5cG8gUkFXX1JFR0lTVEVSX1NJWkUuCisKKwkqIGZyYW1lLmgsIGluZmVyaW9yLmg6IERvYyBmaXhlcy4KKworTW9uIE1heSAxNyAxNTo0MzowMyAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBmaW5kdmFyLmMgKHdyaXRlX3JlZ2lzdGVyKTogIEFkZCBzYW5pdHkgY2hlY2sgZm9yIHJlZ2lzdGVyIHNpemUuCisJKHJlYWRfcmVnaXN0ZXIpOiAgRml4dXAgc2FuaXR5IGNoZWNrIGZvciByZWdpc3RlciBzaXplIHRvIGJlCisJY29uc2lzdGVudCB3aXRoIHdyaXRlX3JlZ2lzdGVyKCkuCisKK01vbiBNYXkgMTcgMDc6MzY6MjAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBzcGFyY2xpdGUvTWFrZWZpbGUuaW46IEFkZCBkdW1teSBpbmZvLCBpbnN0YWxsIGFuZCBpbnN0YWxsLWluZm8KKwl0YXJnZXRzLgorCitUaHUgTWF5IDEzIDA3OjMwOjIyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLW5pbmR5LmM6IFJlbW92ZWQgZGVjbGFyYXRpb24gb2YgY29mZnN0cmlwLgorCSogbmluZHktc2hhcmUvbmluZHkuYzogI2lmIDAgY29mZnN0cmlwIHJvdXRpbmU7IG5vIGxvbmdlciB1c2VkLgorCitXZWQgTWF5IDEyIDAwOjM1OjE5IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICBCdW1wIHRvIDQuOS4xIGFmdGVyIHJlbGVhc2UgYW5kIGN2cworCXRhZ2dpbmcuCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIEdEQiA0LjkgcmVsZWFzZS4KKworVHVlIE1heSAxMSAwODowNDo0MSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogUkVBRE1FOiAgVXBkYXRlIGtub3duIGJ1Z3MgdG8gaW5jbHVkZSB0aGUgU29sYXJpcyBidWcgdGhhdAorCWxlYXZlcyBjb3JlIGR1bXBzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aGVuIHJlc3RhcnRpbmcgdGhlCisJaW5mZXJpb3Igd2l0aCAicnVuIi4gIEV4cGFuZCBvbiB0aGUgdGVzdHN1aXRlIGluZm9ybWF0aW9uLgorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICBCdW1wIHRvIDQuOC45NiBmb3Igd2hhdCBzaG91bGQgaG9wZWZ1bGx5CisJYmUgdGhlIGxhc3QgNC45IHByZXJlbGVhc2UgdGVzdCBhcmNoaXZlLgorCitNb24gTWF5IDEwIDIyOjEzOjIzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBjb25maWcvbTY4ay94bS1ocDMwMGJzZC5oOiBJbmNsdWRlIDxzeXMvcGFyYW0uaD4gdG8gYXZvaWQgSU5UX01BWAorCXJlZGVmaW5lZCB3YXJuaW5ncy4KKworTW9uIE1heSAxMCAyMDowMDo0MyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogUkVBRE1FLCBORVdTOiAgVXBkYXRlIGZvciBnZGIgNC45IHJlbGVhc2UuCisKK01vbiBNYXkgMTAgMTk6Mzg6MzQgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGNoLWV4cC55IChNQVgsIE1JTik6ICBSZW5hbWUgdG8gTUFYX1RPS0VOLCBNSU5fVE9LRU4uCisJKiB0YXJnZXQuYyAoTUlOKTogICN1bmRlZiBiZWZvcmUgZGVmaW5pbmcuCisKK01vbiBNYXkgMTAgMTY6MDM6MDMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKyAgICAgICAgUGF0Y2ggZnJvbSBKZWZmcmV5IExhdzoKKyAgICAgICAgKiBnZGIvY29uZmlnL3BhL25tLWhwcGFiLmggKFBUUkFDRV9BUkczX1RZUEUpOiBEZWZpbmUgYXMgY2FkZHJfdC4KKworTW9uIE1heSAxMCAxNToyODoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGhwcGEtdGRlcC5jIChocHBhX3B1c2hfYXJndW1lbnRzKTogQWxsb2NhdGUgY29ycmVjdCBhbW91bnQgb2YKKwltZW1vcnkuCisKK01vbiBNYXkgMTAgMTM6MTQ6NDYgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNoLWV4cC55IChzdGFydCk6ICBBcHBseSB3b3JrLWFyb3VuZCB0byBhdm9pZCBiaXNvbiB3YXJuaW5nLgorCitTdW4gTWF5ICA5IDA3OjI1OjAyIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoQklTT04pOiAgUmVtb3ZlIGRvdWJsZSBxdW90ZXMgYXJvdW5kIEJJU09OCisJZGVmaW5pdGlvbiB3aGVuIGJpc29uIGlzIHVzZWQuCisKKwkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotaHAtYnNkKTogIENoYW5nZSB0byBocHBhKi1ocC1ic2QqCisJKiBjb25maWd1cmUuaW4gKGhwcGEqLWhwLWhwdXgpOiAgQ2hhbmdlIHRvIGhwcGEqLWhwLWhwdXgqCisJKiBjb25maWd1cmUuaW4gKG02OCotaHAtYnNkKTogIENoYW5nZSB0byBtNjgqLWhwLWJzZCoKKwkqIGNvbmZpZ3VyZS5pbiAobTY4Ki1ocC1ocHV4KTogIENoYW5nZSB0byBtNjgqLWhwLWhwdXgqCisJKiBjb25maWd1cmUuaW4gKGhwcGEqLSotYnNkKTogIENoYW5nZSB0byBocHBhKi0qLWJzZCoKKwkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1ocHV4KTogIENoYW5nZSB0byBocHBhKi0qLWhwdXgqCisJKiBjb25maWd1cmUuaW4gKG02OCotaHAtYnNkKTogIENoYW5nZSB0byBtNjgqLWhwLWJzZCoKKwkqIGNvbmZpZ3VyZS5pbiAobTY4Ki1ocC1ocHV4KTogIENoYW5nZSB0byBtNjgqLWhwLWhwdXgqCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIEJ1bXAgdG8gNC44LjYuCisKK1NhdCBNYXkgIDggMTI6MzY6MDMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9wYS94bS1ocHBhaC5oIChNQUxMT0NfSU5DT01QQVRJQkxFKTogIERlZmluZSBpdCwgYW5kCisJaW5jbHVkZSBkZWNsYXJhdGlvbnMgZm9yIG1hbGxvYy9yZWFsbG9jL2ZyZWUuICBCb3RoIG1hbGxvYyBhbmQKKwlyZWFsbG9jIHJldHVybiAndm9pZCAqJyBmb3Igbm9uLUFOU0kgY29tcGlsYXRpb25zLgorCitTYXQgTWF5ICA4IDAxOjM5OjMwIDE5OTMgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY29mZnJlYWQuYyAocmVhZF9jb2ZmX3N5bXRhYik6IERvbid0IGZjbG9zZSBzdHJlYW0gYXMgaXQgaXMgbm8KKwlsb25nZXIgb3BlbmVkIHR3aWNlLgorCitUaHUgTWF5ICA2IDIxOjA4OjU1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBzb2xpYi5jIChjbGVhcl9zb2xpYik6IERvbid0IGNsb3NlIGJmZCBpZiBpdCBpcyBOVUxMLgorCitUaHUgTWF5ICA2IDIwOjU1OjM1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb3JlLmMgKGRpc19hc21fcmVhZF9tZW1vcnkpOiAgQ2FzdCBzZWNvbmQgYXJnIG9mCisJdGFyZ2V0X3JlYWRfbWVtb3J5IHRvICJjaGFyICoiLgorCSogYnJlYWtwb2ludC5jICh3YXRjaHBvaW50X2NoZWNrKTogIENoYW5nZSBhcmcgdHlwZSBmcm9tIFBUUiB0bworCSJjaGFyICoiLCB0byBtYXRjaCBvdGhlciBmdW5jdGlvbnMgY2FsbGVkIGJ5IGNhdGNoX2Vycm9ycygpLgorCitUaHUgTWF5ICA2IDE1OjQ3OjQ1IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIE1vcmUgcGF0Y2hlcyBmcm9tIEplZmZyZXkgTGF3IChsYXdAY3MudXRhaC5lZHUpLgorCSogZ2RiL2NvbmZpZy9ubS1ocHBhYi5oIChQVFJBQ0VfQVJHM19UWVBFKTogRGVmaW5lIGFzIGNhZGRyX3QuCisJKiBnZGIvY29uZmlnL3BhL3RtLWhwcGFoLmggKG1pbGxpY29kZV9zdGFydCwgbWlsbGljb2RlX2VuZCk6CisJRGVsZXRlIHVubmVjZXNzYXJ5IGRlY2xhcmF0aW9ucy4KKworVGh1IE1heSAgNiAxNToxNTo0NiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBzZXItdW5peC5jICh3YWl0X2Zvcik6ICBVc2UgVlRJTUUgdG8gZG8gdGltZW91dHMgaW5zdGVhZCBvZgorCXBvbGwoKSBmb3IgdGVybWlve3N9LgorCitUaHUgTWF5ICA2IDEwOjAzOjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBpMzg2LXRkZXAuYyAoaTM4Nl9mcmFtZV9udW1fYXJncyk6IEFsd2F5cyByZXR1cm4gLTEuCisKK1dlZCBNYXkgIDUgMTU6MTY6MzMgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworICAgICAgICAqIFBhdGNoZXMgZnJvbSBKZWZmcmV5IExhdyA8bGF3QGNzLnV0YWguZWR1Pi4KKwkqIGdkYi9ocHBhLXRkZXAuYzogRGVjbGFyZSBmcmFtZV9zYXZlZF9wYy4KKwkoZnJhbWVsZXNzX2Z1bmN0aW9uX2ludm9jYXRpb24pOiBOZXcgZnVuY3Rpb24uCisJKGZyYW1lX3NhdmVkX3BjLCBpbml0X2V4dHJhX2ZyYW1lX2luZm8pOiBVc2UgCisJZnJhbWVsZXNzX2Z1bmN0aW9uX2ludm9jYXRpb24uCisJKiBnZGIvY29uZmlnL3BhL3RtLWhwcGEuaCAoU0FWRURfUENfQUZURVJfQ0FMTCk6IFVzZSBzYXZlZF9wY19hZnRlcgorCWNhbGwgaW5zdGVhZCBvZiBqdXN0IGdyYWJiaW5nIHRoZSB2YWx1ZSBjdXJyZW50bHkgaW4gJXIyLgorCShGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTik6IFVzZSBmcmFtZWxlc3NfZnVuY3Rpb25faW52b2NhdGlvbi4KKwkqIGdkYi9jb25maWcvcGEvdG0taHBwYWguaCAoU0FWRURfUENfQUZURVJfQ0FMTCk6IERlbGV0ZSBwcml2YXRlCisJZGVmaW5pdGlvbiBhbmQgdXNlIHRoZSBjb21tb24gb25lIGluIHRtLWhwcGEuaC4KKwkqIGdkYi9ocHBhLXRkZXAuYyAoZnJhbWVfY2hhaW5fdmFsaWQpOiBJZiAidXNlX3Vud2luZCIgaXMgdHJ1ZSwgdGhlbgorCXVzZSB1bndpbmQgZGVzY3JpcHRvcnMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmcmFtZSBjaGFpbiBpcyB2YWxpZC4KKwkqIGdkYi9ocHBhLXRkZXAuYyAoZmluZF9kdW1teV9mcmFtZV9yZWdzKTogIFJld29yayBzbyB0aGF0CisJaXQgZG9lcyBub3QgYXNzdW1lICVyNCBpcyB0aGUgZnJhbWUgcG9pbnRlci4KKwkqIGdkYi9ocHBhLXBpbnNuLmMgKHByaW50X2luc24pOiBIYW5kbGUgJ3InIGFuZCAnUicgZm9yIGJyZWFrLCByc20sCisJYW5kIHNzbSBpbnN0cnVjdGlvbnMuCisJKiBnZGIvaHBwYS10ZGVwLmMgKGV4dHJhY3RfNXJfc3RvcmUsIGV4dHJhY3RfNVJfc3RvcmUpOiBOZXcKKwloZWxwZXIgZnVuY3Rpb25zIGZvciBwcmludF9pbnNuLgorCSogZ2RiL2hwcGEtdGRlcC5jIChnY2NfcCwgaHB1eF9jY19wKTogRGVsZXRlIHVudXNlZCBmdW5jdGlvbnMuCisJKiBnZGIvY29uZmlnL3BhL3RtLWhwcGEuaCAoQUJPVVRfVE9fUkVUVVJOKTogSGFuZGxlIGEgcmV0dXJuCisJd2hpY2ggbnVsbGlmaWVzIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24uCisKK1R1ZSBNYXkgIDQgMTI6MTE6MzggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIGluZnB0cmFjZS5jIFtGSVZFX0FSR19QVFJBQ0VdOiBEZWZpbmUgcHRyYWNlIHRvIGNhbGxfcHRyYWNlIGFuZAorCXBhc3MgdGhlIDV0aCBhcmcgdGhlcmUsIHJhdGhlciB0aGFuIHVzaW5nIGFuIEFOU0kgQy1zcGVjaWZpYyBtYWNyby4KKworCSogTWFrZWZpbGUuaW4gKGRlcGVuZCk6IERvbid0IGluY2x1ZGUgJHtDQ30gY29tbWFuZCBmb3IgKi50YWIuYy4KKworVHVlIE1heSAgNCAxOTozMzoxMiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiAgQnVtcCB0byA0LjguNQorCSogTWFrZWZpbGUuaW4gKElOQ0xVREVfQ0ZMQUdTKTogIEFkZCBCRkRfRElSIGFuZCBSRUFETElORV9ESVIKKwlkaXJlY3RvcmllcyB0byBpbmNsdWRlIHNlYXJjaCBwYXRoLgorCSogTWFrZWZpbGUuaW4gKENMSUJTLCBDREVQUywgQUREX0ZJTEVTLCBBRERfREVQUyk6ICBDbGVhbiB1cAorCXdoaXRlc3BhY2UuCisJKiBNYWtlZmlsZS5pbiAoZGVwZW5kKTogIEZvciBnY2MgLU1NIGxpbmUsIHVzZSBJTlRFUk5BTF9DRkxBR1MKKwkqIE1ha2VmaWxlLmluIChtYWluLm8sIGRieHJlYWQubywgY29mZnJlYWQubywgbWlwc3JlYWQubywKKwllbGZyZWFkLm8sIGR3YXJmcmVhZC5vLCBzdGFic3JlYWQubywgeGNvZmZyZWFkLm8sIHhjb2ZmZXhlYy5vLAorCXhkcl9sZC5vLCB4ZHJfcmRiLm8sIG5pbmR5Lm8sIE9uaW5keS5vLCB0dHlicmVhay5vLCB0dHlmbHVzaC5vLAorCXVkci5vLCB1ZGlwMnNvYy5vKTogIFJlbW92ZSBleHBsaWNpdCBydWxlcywgdXNlIHRoZSBvbmVzIHRoYXQKKwlhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgaW4gImRlcGVuZCIuCisJKiBNYWtlZmlsZS5pbiAocGFyZWFkLm8pOiAgRG9jdW1lbnQgd2h5IGEgZGVwZW5kZW5jeSBkb2Vzbid0IGdldAorCWF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGluICJkZXBlbmQiIGFuZCBsZWF2ZSB0aGlzIGV4cGxpY2l0IHJ1bGUKKwlpbiBmb3Igbm93IChGSVhNRSkuCisJKiBkZXBlbmQ6ICBVcGRhdGUgdG8gbGF0ZXN0IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHZlcnNpb24uCisKK1R1ZSBNYXkgIDQgMTI6MTE6MzggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHhjb2ZmcmVhZC5jOiBEb2MgZml4LgorCisJKiBNYWtlZmlsZS5pbiAoZGVwZW5kKTogSW5jbHVkZSAkKENDKSBjb21tYW5kIGluIGdlbmVyYXRlZCBvdXRwdXQuCisKK01vbiBNYXkgIDMgMjI6NTE6MDUgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChOT05TUkMpOiAgUmVtb3ZlICR7c3JjZGlyfS9wdXRlbnYuYy4KKwkqIE1ha2VmaWxlLmluIChTRklMRVMpOiAgQWRkICR7c3JjZGlyfS9wdXRlbnYuYy4KKwkqIGRlcGVuZDogIFVwZGF0ZSB0byBsYXRlc3QgYXV0b21hdGljYWxseSBidWlsdCB2ZXJzaW9uLgorCitNb24gTWF5ICAzIDE5OjIwOjIwIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIHNwYXJjbGl0ZS9NYWtlZmlsZS5pbjogIENyZWF0ZSBkZWZhdWx0IHRhcmdldCB0aGF0IGRvZXMgbm90aGluZworCWluIG9yZGVyIHRvIGZvcmNlIHVzZXIgdG8gYnVpbGQgYnkgaGFuZC4KKworCSogc3BhcmNsaXRlL01ha2VmaWxlOiAgUmVtb3ZlLiAgSXQncyBub3QgbmVjZXNzYXJ5IGFueW1vcmUuCisKKwkqIHNlci11bml4LmMgKHdhaXRfZm9yKTogIE5ldyByb3V0aW5lIHRvIGhhbmRsZSByZWFkIHRpbWVvdXRzLAorCWV0Yy4gIFVzZXMgcG9sbCgpIGlmIEhBVkVfVEVSTUlPW1NdIGlzIGRlZmluZWQsIHNlbGVjdCgpIG90aGVyd2lzZS4KKworTW9uIE1heSAgMyAxMzo1MjowOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIG1pcHMtcGluc24uYyAocHJpbnRfaW5zbik6IFJldHVybiB2YWx1ZS4KKworU3VuIE1heSAgMiAxMTo0Mzo1NyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFNGSUxFUyk6ICBSZW1vdmUgc2VyLWhhcmR3aXJlLmM7IGl0IGlzIGEgbGluayBtYWRlCisJYXQgY29uZmlndXJhdGlvbiB0aW1lIGFuZCBkb2Vzbid0IGJlbG9uZyBpbiB0aGUgZGlzdHJpYnV0aW9uIGFyY2hpdmUuCisKKwkqIE1ha2VmaWxlLmluIChOT05TUkMpOiAgQWRkIDI5ay1zaGFyZS9SRUFETUUuCisJKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogIEFkZCAyOWstc2hhcmUvdWRpL3VkaWlkcy5oLgorCisJKiBkZWZzLmggKFVJTlRfTUFYLCBMT05HX01BWCwgSU5UX01BWCwgSU5UX01JTik6ICBSZXBsYWNlIGhleAorCWNvbnN0YW50cyB3aXRoIHNsaWdodGx5IG1vcmUgcG9ydGFibGUgZGVmaW5pdGlvbnMgKHN0aWxsIGRlcGVuZHMKKwlvbiAyJ3MgY29tcGxlbWVudCBhcml0aG1ldGljIHRob3VnaCkuCisJKiBjb25maWcvaTM4Ni9ubS1saW51eC5oOiAgRGVmaW5lIE5PX1NZU19SRUdfSCBmb3Igbm8gPHN5cy9yZWcuaD4uCisJKiBpMzg2di1uYXQuYyAoc3lzL3JlZy5oKTogIENvbmRpdGlvbmFsaXplIGluY2x1ZGUgb24KKwlOT19TWVNfUkVHX0guICBMaW51eCBkb2Vzbid0IGhhdmUgPHN5cy9yZWcuaD4uCisJKiBzZXItdW5peC5jICh0ZXJtaW8uaCk6ICBJbmNsdWRlIDx0ZXJtaW8uaD4gbGlrZSBvdGhlciBmaWxlcyB0aGF0CisJaW5jbHVkZSB0ZXJtaW8uaCwgbm90IDxzeXMvdGVybWlvLmg+IHdoaWNoIG1heSBub3QgZXhpc3QgKG9uCisJbGludXggZm9yIGV4YW1wbGUpLgorCitTYXQgTWF5ICAxIDE2OjA1OjI0IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiB2YWxwcmludC5jIChwcmludF9sb25nZXN0KTogIENoYW5nZSBmb3JtYXQgcGFyYW1ldGVyIGZyb20gYQorCSdjaGFyJyB0byBhbiAnaW50Jy4gIFdlIGNhbid0IGhhdmUgJ2NoYXInIHBhcmFtZXRlcnMgd2l0aCB0aGUKKwljdXJyZW50IGNvZGluZyBzdHlsZSwgd2hlcmUgd2UgbWl4IHByb3RvdHlwZXMgd2l0aCBwcmUtQU5TSQorCXN0eWxlIGRlY2xhcmF0aW9ucy4KKwkqIHZhbHVlLmggKHByaW50X2xvbmdlc3QpOiAgQ2hhbmdlIGZvcm1hdCBwYXJhbWV0ZXIgaW4gcHJvdG90eXBlCisJZnJvbSBhICdjaGFyJyB0byBhbiAnaW50Jy4JCisKK1NhdCBNYXkgIDEgMDI6NDc6MjAgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb25maWcvbWlwcy90bS1taXBzLmggKFNUQUJfUkVHX1RPX1JFR05VTSk6IE1hdGNoIGl0IHdpdGggdGhlIGdjYworCWRlZmluaXRpb24uCisJKiBjb25maWcvbWlwcy90bS1pcml4My5oIChTVEFCX1JFR19UT19SRUdOVU0pOiBBZGQuCisJKiBpcml4NC1uYXQuYyAoZmlsbF9mcHJlZ3NldCk6IEZpeCBidWcgd2l0aCBpbmRleGluZyBpbnRvIGZwcmVnc2V0cC4KKworRnJpIEFwciAzMCAxNzo0NTozMiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisgICAgICAgICogVGhlIGZvbGxvd2luZyBwYXRjaGVzIGFyZSBmcm9tIEplZmZyZXkgTGF3IDxsYXdAY3MudXRhaC5lZHU+LgorCSogY29uZmlnL3BhL2hwcGFic2QubWg6ICBBZGQgbW9yZSBmaWxlcyB0byBOQVRERVBGSUxFUy4KKwkqIGNvbmZpZy9wYS94bS1ocHBhW2JoXS5oOiBEZWZpbmUgRklWRV9BUkdfUFRSQUNFLgorCSogaHBwYWItbmF0LmM6IERlbGV0ZSBXQU5UX05BVElWRV9UQVJHRVQgaWZkZWZzLgorCXB0cmFjZSBuZWVkcyA1IGFyZ3VtZW50cywgI2RlZmluZSBwdHJhY2UgdG8gYWx3YXlzCisJcGFzcyB6ZXJvIGFzIHRoZSA1dGggYXJndW1lbnQuCisKK0ZyaSBBcHIgMzAgMTU6NTQ6MTMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogTWF0Y2ggejhrLSotc2ltIGZvciB6ODAwMC4KKwkqIGNvbmZpZy9oODUwMC90bS1oODUwMC5oLCBoODUwMC10ZGVwLmM6IExpbnQuCisJKiByZW1vdGUtaG1zLmM6IFVwZGF0ZSB0byB1c2UgbmV3IHNlcmlhbCBwcm90b2NvbC4KKworRnJpIEFwciAzMCAxNjo1MDozOCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCisKKwkqIG1pcHMtdGRlcC5jOiByZW1vdmUgaW5jbHVkZSBvZiBzeXMvZGlyLmguICBEb2Vzbid0IHNlZW0KKwkgIG5lY2Vzc2FyeSBhbmQgU29sYXJpcyBkb2Vzbid0IGhhdmUgaXQuCisKKwkqIE1ha2VmaWxlLmluIChjbGVhbi1pbmZvLCBpbnN0YWxsLCBpbnN0YWxsLWluZm8sIGluZm8sIGR2aSwKKwkgIGNoZWNrLCBhbGwpOiBkbyBub3QgZWNobyByZWN1cnNpb24gbGluZXMuCisKKwkqIDI5ay1zaGFyZS91ZGlwMnNvYy5jIChVRElDb25uZWN0KTogcmVwbGFjZSB1bmlvbiB3YWl0IHdpdGggaW50LgorCisJKiBjb25maWcvc3BhcmMvc3VuNHNvbDIubWggKFhNX0NMSUJTKTogYWRkIC1sc29ja2V0IHdoaWNoIGlzCisJICByZXF1aXJlZCB0YXJnZXQgcG9ydHMgd2hpY2ggdXNlIHNvY2tldHMgKGxpa2UgYTI5ay11ZGkpLgorCisJKiByZW1vdGUtdWRpLmMgKHVkaV93YWl0KTogVXNlIFNJR1VSRywgYXMgU29sYXJpcyBkb2Vzbid0IGhhdmUgU0lHTE9TVC4KKworRnJpIEFwciAzMCAxMTowNTo0MiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogc2VyLXVuaXguYyBbVVNFX3tURVJNSU8sQUxBUk19X1RJTUVPVVRdOiBOZXcgY29kZSB0byBkZWFsIHdpdGgKKwlzeXN0ZW1zIGxhY2tpbmcgc2VsZWN0KCkuCisKKwkqIE1ha2VmaWxlLmluIChUQUdTKTogRG9jIGZpeC4gIERlYWwgd2l0aCBlbXB0eSBERVBGSUxFUy4KKworRnJpIEFwciAzMCAxMDowNjo0NiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogYWxsZGVwcy5tYWssIGRlcGVuZDogIFVwZGF0ZSB3aXRoIGxhdGVzdCBhdXRvbWF0aWNhbGx5IGJ1aWx0CisJdmVyc2lvbnMuCisKK1RodSBBcHIgMjkgMTI6MDM6MjMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChTRklMRVMpOiAgQWRkIHNlci11bml4LmMgYW5kIHNlci1nbzMyLmMuCisKKwkqIE1ha2VmaWxlLmluIChtYWtlLXByb3RvLXRlc3RzdWl0ZS5kaXIpOiAgTmV3IHRhcmdldCB0byBtYWtlCisJcHJvdG90eXBlIHRlc3RzdWl0ZSB0cmVlLgorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICBCdW1wIHRvIDQuOC40LgorCitUaHUgQXByIDI5IDA4OjQ2OjIyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBzdGFic3JlYWQuYyAoZGVmaW5lX3N5bWJvbCk6IElmIHVucmVjb2duaXplZCBjb25zdGFudCB0eXBlLAorCWNvbXBsYWluKCkgbm90IGVycm9yKCkuCisKK1RodSBBcHIgMjkgMDA6MDM6NTkgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGluZnB0cmFjZS5jOiAgQWRkIG1pc3NpbmcgY2xvc2UgcGFyZW4gdG8gdGVzdCBmb3IKKwlGSVZFX0FSR19QVFJBQ0UgZGVmaW5lZC4KKworCSogZGVmcy5oIChDQ19IQVNfTE9OR19MT05HKTogIFNldCB1cCB0byBkZWZpbmUgQ0NfSEFTX0xPTkdfTE9ORworCXdoZW4gY29tcGlsaW5nIHdpdGggZ2NjLCBidXQgZGlzYWJsZSBpdCBmb3Igbm93LiAgU2VlIGNvbW1lbnQuCisJKiBkZWZzLmggKExPTkdFU1QpOiAgRGVmaW5lIGFzIGVpdGhlciAibG9uZyIgb3IgImxvbmcgbG9uZyIKKwliYXNlZCBvbiBDQ19IQVNfTE9OR19MT05HLgorCSogZGVmcy5oIChsb25nZXN0X3RvX2ludCk6ICBVc2UgQ0NfSEFTX0xPTkdfTE9ORyB0byBjb250cm9sCisJaG93IGxvbmdlc3RfdG9faW50IGlzIGRlZmluZWQuCisJKiBjLXZhbHByaW50LmMgKGNfdmFsX3ByaW50KTogIENhbGwgcHJpbnRfbG9uZ2VzdC4KKwkqIGV4cHByaW50LmMgKGR1bXBfZXhwcmVzc2lvbik6ICBVc2UgUFJJTlRGX0hBU19MT05HX0xPTkcKKwlpbnN0ZWFkIG9mIExPTkdfTE9ORy4KKwkqIHtwcmludGNtZC5jLCBnZGJ0eXBlcy5ofSAoTE9OR19MT05HKTogIFJlcGxhY2UgdXNhZ2VzIHdpdGgKKwlDQ19IQVNfTE9OR19MT05HLgorCSogcHJpbnRjbWQuYyAocHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCk6ICBDYWxsIHByaW50X2xvbmdlc3QKKwlhbmQgbGV0IGl0IGZpZ3VyZSBvdXQgd2hhdCB0byBkbyBmb3IgUFJJTlRGX0hBU19MT05HX0xPTkcuCisJKiB0eXBlcHJpbnQuYyAocHJpbnRfdHlwZV9zY2FsYXIpOiAgQ2FsbCBwcmludF9sb25nZXN0IGFuZCBsZXQKKwlpdCBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gZm9yIFBSSU5URl9IQVNfTE9OR19MT05HLgorCSogdmFscHJpbnQuYyAodmFsX3ByaW50X3R5cGVfY29kZV9pbnQpOiAgQ2FsbCBwcmludF9sb25nZXN0CisJYW5kIGxldCBpdCBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gZm9yIFBSSU5URl9IQVNfTE9OR19MT05HLgorCSogc3RhYnNyZWFkLmMgKExPTkdfTE9ORyk6ICBSZXBsYWNlIHVzYWdlcyB3aXRoIENDX0hBU19MT05HX0xPTkcuCisJKiB2YWx1ZS5oIChzdHJ1Y3QgdmFsdWUpOiAgUmVwbGFjZSB1c2FnZSBvZiBMT05HX0xPTkcgd2l0aAorCUNDX0hBU19MT05HX0xPTkcuCisJKiB2YWx1ZS5oIChwcmludF9sb25nZXN0KTogIEFkZCBwcm90b3R5cGUuCisJKiB2YWx1ZXMuYyAoTE9OR19MT05HKTogIFJlcGxhY2UgdXNhZ2VzIHdpdGggQ0NfSEFTX0xPTkdfTE9ORy4KKwkqIHZhbHVlcy5jICh1bnBhY2tfZG91YmxlKTogIENvbGxhcHNlIGNvZGUgdGhhdCB3YXMgdW5uZWNlc3NhcmlseQorCWRlcGVuZGVudCBvbiBDQ19IQVNfTE9OR19MT05HLiAgVXNlIExPTkdFU1QgaW5zdGVhZCBvZiBkaXJlY3QgdHlwZXMuCisJKiB2YWx1ZXMuYyAodmFsdWVfZnJvbV9sb25nZXN0KTogIFJlbW92ZSBkZXBlbmRlbmN5IG9uCisJQ0NfSEFTX0xPTkdfTE9ORyBhbmQganVzdCB1c2UgTE9OR0VTVC4KKwkqIHNvbGliLmMgKHNvbGliX21hcF9zZWN0aW9ucyk6ICBVc2UgYmZkX2dldF9maWxlbmFtZQorCXRvIGFjY2VzcyBmaWxlbmFtZSBmaWVsZC4KKwkqIHNvbGliLmMgKGNsZWFyX3NvbGliKTogIFNhdmUgZmlsZW5hbWUgYW5kIGZyZWUgaXQgbGF0ZXIsIGFmdGVyCisJYmZkX2Nsb3NlLCBzaW5jZSBiZmRfY2xvc2UgbWF5IHJlZmVyZW5jZSBpdC4gIFVzZSBiZmRfZ2V0X2ZpbGVuYW1lCisJdG8gYWNjZXNzIHRoZSBmaWVsZC4KKwkqIGNvbmZpZy9jb252ZXgveG0tY29udmV4LmggKExPTkdfTE9ORyk6ICBSZXBsYWNlIHdpdGgKKwlDQ19IQVNfTE9OR19MT05HLiAgQWRkIGRlZmluZSBmb3IgUFJJTlRGX0hBU19MT05HX0xPTkcuCisJKiBkb2MvZ2RiaW50LnRleGluZm8gKExPTkdfTE9ORyk6ICBSZXBsYWNlIHdpdGggQ0NfSEFTX0xPTkdfTE9ORy4KKwlBZGQgUFJJTlRGX0hBU19MT05HX0xPTkcgcmVmZXJlbmNlcy4KKworV2VkIEFwciAyOCAwNjoxMTozOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogaW5mbG93LmMgKGtpbGxfY29tbWFuZCksIGluZmNtZC5jIChhdHRhY2hfY29tbWFuZCksCisJcmVtb3RlLmMgKHJlbW90ZV9pbnRlcnJ1cHRfdHdpY2UpOiBJbiBtZXNzYWdlcyBmb3IgdGhlIHVzZXIsIGNhbGwgaXQKKwkidGhlIHByb2dyYW0iIG9yICJ0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZCIgbm90ICJ0aGUgaW5mZXJpb3IiLgorCisJKiBocDMwMHV4LW5hdC5jOiBDYXN0IHNlY29uZCBhcmcgdG8gc3VwcGx5X3JlZ2lzdGVyIGNhbGxzLgorCShfaW5pdGlhbGl6ZV9rZXJuZWxfdV9hZGRyLCBnZXRwYWdlc2l6ZSk6IE5ldyBmdW5jdGlvbnMuCisJKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVyXzEpOiBDaGFuZ2UgYXJnIG5hbWUgZnJvbSB2YWx1ZSB0byB2YWwuCisJKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogTWFrZSBhcmcgY29yZV9yZWdfc2l6ZSB1bnNpZ25lZC4KKwlQYXNzIDUgYXJncyB0byBwdHJhY2UuCisJKiBjb25maWcvbTY4ay94bS1ocDMwMGhwdXguaDogRGVmaW5lIEZJVkVfQVJHX1BUUkFDRS4KKwlSZW1vdmUgS0VSTkVMX1VfQUREUiBzdHVmZi4KKwkqIGluZnB0cmFjZS5jIFtGSVZFX0FSR19QVFJBQ0VdOiBQYXNzIDV0aCBhcmcgdG8gcHRyYWNlLgorCSogY29uZmlnL202OGsvaHAzMDBocHV4Lm17dCxofToKKwlNb3ZlIGV4ZWMubyBmcm9tIE5BVERFUEZJTEVTIHRvIFRERVBGSUxFUworCSogY29uZmlnL202OGsvaHAzMDBocHV4Lm10OiBNZW50aW9uIEdBUyByZXF1aXJlbWVudC4gIFJlbW92ZQorCWhwLWluY2x1ZGUgc3R1ZmYuICBBZGQgbTY4ay10ZGVwLm8gdG8gVERFUEZJTEVTLgorCitXZWQgQXByIDI4IDEzOjI3OjU0IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY2gtZXhwLnkgKHl5bGV4KTogRG9uJ3QgU1RSRVEgd2l0aCBzaW1wbGVuYW1lIGlmIGl0IGlzIE5VTEwuCisKK1dlZCBBcHIgMjggMDY6MTE6MzggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9zcGFyYy94bS1zdW40b3M0LmggW19fU1REQ19fXTogRG9uJ3QgdXNlIE1BTExPQ19JTkNPTVBBVElCTEUuCisKK1dlZCBBcHIgMjggMTE6Mzk6MTggMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKKworCSogZG9jL2dkYi50ZXhpbmZvOiBtYWtlIG5vZGUgIlNoZWxsIENvbW1hbmRzIiB1bmNvbmRpdGlvbmFsOworCWRlc2NyaWJlIGBzZXQgZGVtYW5nbGUtc3R5bGUgYXJtJyAobm90IGNmcm9udCk7IAorCW1lbnRpb24gY2FuIHR5cGUgYHEnIHRvIGRpc2NhcmQgb3V0cHV0LCB3aGVuIGdkYiBwYWdlcworCitXZWQgQXByIDI4IDExOjMyOjM5IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogdmFsb3BzLmMgKHNlYXJjaF9zdHJ1Y3RfZmllbGQpOiBGaXggZ2RiIGNvcmUgZHVtcCB3aXRoIGluY29tcGxldGUKKwlzdGFicyBpbmZvLgorCitXZWQgQXByIDI4IDA2OjExOjM4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiByZW1vdGUuYzogQ2hhbmdlIHRpbWVvdXQgdG8gMi4KKwkocmVtb3RlX29wZW4pOiBVc2UgdW5wdXNoX3RhcmdldCBub3QgcmVtb3RlX2Nsb3NlLgorCShyZW1vdGVfcmVzdW1lKTogSWYgc2lnZ25hbCAhPSAwLCBnaXZlIHdhcm5pbmcgbm90IGVycm9yKCkuCisJKHJlbW90ZV93YWl0LCByZW1vdGVfaW50ZXJydXB0LCByZW1vdGVfaW50ZXJydXB0X3R3aWNlKToKKwlJZiB3ZSBnZXQgdHdvIGludGVycnVwdHMsIGxldCB0aGUgdXNlciBnZXQgb3V0IGlmIHRoZXkgd2FudC4KKwkocmVtb3RlX3traWxsLG1vdXJufSk6IE5ldyBmdW5jdGlvbnMuCisJaTM4Ni1zdHViLmMgKGhhbmRsZV9leGNlcHRpb24sIGNhc2UgJ2snKTogRG9uJ3QgQlJFQUtQT0lOVC4KKworV2VkIEFwciAyOCAwOToyMDo1NSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWcvc3BhcmMvc3VuNHNvbDIubWggKFhNX0NMSUJTKTogRGVmaW5lIHRvIGJlIC1sbnNsLgorCitXZWQgQXByIDI4IDA2OjExOjM4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBSZW1vdGUgdGFyZ2V0cyAobW91cm4pOiBDYWxsIHVucHVzaF90YXJnZXQuCisKKwkqIGNvbmZpZy9zcGFyYy94bS1zdW40b3M0Lmg6IERlY2xhcmUgZnJlZSgpIHRvIHJldHVybiBpbnQuCisJUmVtb3ZlIHR3aXN0ZWQgdXNlIG9mIFBBUkFNUy4KKworCSogY29uZmlnL3JzNjAwMC94bS1yczYwMDAuaDogRG9uJ3QgZGVmaW5lIE1BTExPQ19JTkNPTVBBVElCTEUgbm93CisJdGhhdCBhbnNpZGVjbC5oIGFzc3VtZXMgQU5TSSBvbiBBSVguCisKK1R1ZSBBcHIgMjcgMTA6MDE6MzMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIFJFQURNRTogTW92ZSBtb3N0IHN0dWZmIGFib3V0IGhhY2tpbmcgR0RCIHRvIGRvYy9nZGJpbnQudGV4aW5mby4KKwkoS25vd24gYnVncyk6IFJlbW92ZSBBSVggYnVncywgcmV2aXNlIFNQQVJDIHN0cnVjdCBidWcgZGVzY3JpcHRpb24uCisKK1R1ZSBBcHIgMjcgMTM6NDQ6MTkgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBleHBwcmludC5jIChwcmludF9zdWJleHApOiBGaXggYnVnIHdpdGggT1BfU0NPUEUgb3BlcmF0b3Igb3V0cHV0LgorCitUdWUgQXByIDI3IDEwOjAxOjMzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiByZW1vdGUtdnguYyAobmV0X2Nvbm5lY3QpOiBBbGxvdyBudW1lcmljIElQIGFkZHJlc3MgZm9yIGhvc3QuCisKK01vbiBBcHIgMjYgMTc6NTk6MzggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9zaC9zaC5tdCwgY29uZmlnL3NoL3RtLXNoLmgsIHNoLXRkZXAuYzogTmV3IGZpbGVzLgorCitNb24gQXByIDI2IDA3OjEzOjMyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiByczYwMDAtdGRlcC5jIChicmFuY2hfZGVzdCk6IERlYWwgd2l0aCBzdGVwcGluZyB0aHJvdWdoIHN5c3RlbSBjYWxsLgorCisJKiBzeW10YWIuaCwgeGNvZmZyZWFkLmM6IFJldmlzZSBsaW5ldGFibGUgc29ydGluZyBjb21tZW50cy4KKworU3VuIEFwciAyNSAwMjozMjoxNiAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIHZhbG9wcy5jICh2YWx1ZV9jYXN0KTogQSBjYXN0IG1pZ2h0IGFsc28gY2hhbmdlIHRoZSBvYmplY3QKKwlyZXByZXNlbnRhdGlvbiBpbiBDKysuCisJKiBkYnhyZWFkLmMgKGVuZF9wc3ltdGFiKTogQ29weSBzdWJwc3QgcmVhZF9zeW10YWIgZnVuY3Rpb24gZnJvbSBwc3QKKwl0byBnZXQgdGhlIHByb3BlciByZWFkX3N5bXRhYiBmdW5jdGlvbiB3aGVuIGNhbGxlZCBmcm9tIG1pcHNyZWFkLmMuCisJKiBtaXBzcmVhZC5jIChtaXBzY29mZl9wc3ltdGFiX3RvX3N5bXRhYiwgcHN5bXRhYl90b19zeW10YWJfMSk6CisJU2V0IGN1cl9iZmQgaW4gcHN5bXRhYl90b19zeW10YWJfMSBhcyBDVVJCRkQocHN0KSBpcyBpbnZhbGlkCisJZm9yIGR1bW15IHBzeW10YWJzLCBpbmhpYml0IHByb2Nlc3Npbmcgb2YgZHVtbXkgcHN5bXRhYnMuCisKK1NhdCBBcHIgMjQgMTk6NTk6NTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIENoYW5nZXMgZnJvbSAob3IgaW5zcGlyZWQgYnkpIEFNRDoKKwkqIHJlbW90ZS11ZGkuYyAodWRpX2F0dGFjaCk6IEFzc2lnbm1lbnRzIHRvIFNwYWNlIGFuZCBPZmZzZXQgd2VyZQorCXN3aXRjaGVkLCBmaXggaXQuCisJKHVkaV93YWl0KTogTWFrZSBlcnJvciBtZXNzYWdlIChVRElHZXRTdGRvdXQpIG1hdGNoIGVycm9yLgorCSh1ZGlfd2FpdCk6IEhhbmRsZSBVRElTdGRpbk5lZWRlZC4KKwkqIGNvbW1hbmQuYyBbQ0FOVF9GT1JLXTogVXNlIHN5c3RlbSgpLgorCSogdXRpbHMuYyAocHJvbXB0X2Zvcl9jb250aW51ZSk6IEFsbG93IHF1aXQgd2l0aCAncScuCisKKwkqIHNvbGliLmMgKHNvbGliX2FkZCk6IERvbid0IGNhbGwgc3BlY2lhbF9zeW1ib2xfaGFuZGxpbmcgaWYgdGhlcmUKKwl3ZXJlIGVycm9ycyBpbiBzeW1ib2xfYWRkX3N0dWIuICBBbHNvIHNldCBzby0+ZnJvbV90dHkgYmVmb3JlCisJY2FsbGluZyBzeW1ib2xfYWRkX3N0dWIuCisKK0ZyaSBBcHIgMjMgMTY6MTc6MDAgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogTWVyZ2UgaW4gSFBQQS9CU0QgcGF0Y2hlcyBmcm9tIFV0YWg6CisJKiBkZWZzLmg6ICBBZGQgY29uc3QgdG8gMm5kIGFyZyBvZiBwc2lnbmFsIHByb3RvdHlwZS4KKwkqIGhwcGFoLXRkZXAuYzogIFJlbmFtZWQgdG8gaHBwYS10ZGVwLmMgJ2N1eiBpdCdzIGNvbW1vbiBjb2RlIHdpdGgKKwlCU0Qgbm93LgorCSogaHBwYWItY29yZS5jOiAgRGVsZXRlZC4gIE5vIGxvbmdlciB1c2VmdWwuCisJKiBocHBhYi1uYXQuYzogICNpbmNsdWRlIG1vcmUgZmlsZXMuICBVc2UgUFRfV1VSRUdTLCBub3QKKwlQVF9XUklURV9VLgorCSogaHBwYWItdGRlcC5jOiAgRGVsZXRlZC4gIFN1cHBsYW50ZWQgYnkgaHBwYS10ZGVwLmMuCisJKiBjb25maWcvcGEvaHBwYWJzZC5taCAoTkFUREVQRklMRVMpOiAgUmVtb3ZlIGhwcGFiLWNvcmUuby4KKwkqIGNvbmZpZy9wYS9ocHBhYnNkLm10IChUREVQRklMRVMpOiAgaHBwYWItdGRlcC5vID0+IGhwcGEtdGRlcC5vCisJKiBjb25maWcvcGEvaHBwYWhwdXgubXQgKFRERVBGSUxFUyk6ICBocHBhYi10ZGVwLm8gPT4gaHBwYS10ZGVwLm8KKwkqIGNvbmZpZy9wYS94bS1ocHBhYi5oOiAgI2RlZmluZSBTRVRfU1RBQ0tfTElNSVRfSFVHRS4KKworRnJpIEFwciAyMyAxMDozNDowMiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisgICAgICAgICogRml4IHR3byBidWdzIGZvdW5kIGJ5IGRlamEtZ251LiAgT25lIGlzIHRoZSBpbmNvcnJlY3QgcmVwb3J0aW5nCisJb2YgdGhlIFBDIGJlaW5nIGluIGEgc3RhY2sgZHVtbXkgd2hlbiBsb29raW5nIGF0IGEgY29yZSBmaWxlCisJd2l0aG91dCBzeW1ib2xzLiAgVGhlIG90aGVyIGlzIHRoZSBpbmNvcnJlY3QgcGFzc2luZyBvZiBjaGFyCisJYXJndW1lbnRzIGR1cmluZyBleHByZXNzaW9uIGV2YWx1YXRpb24gKGllOiBwIGZvbygnYScsJ2InKSB3b3VsZAorCW1lc3MgdXAgdGhlIHBhc3Npbmcgb2YgaXQncyBhcmdzIGJlY2F1c2UgaXQgd2Fzbid0IGNvZXJjaW5nIHRoZQorCWNoYXIncyB0byBpbnRzKS4KKwkqIGhwcGFoLXRkZXAuYzogIFJlbmFtZSBnbG9iYWwgZnVuY3Rpb25zIHRvIGhhdmUgY29uc2lzdGVudCBocHBhXworCXByZWZpeC4gIE1ha2UgbW9yZSBmdW5jdGlvbnMgc3RhdGljLiAgRHJvcCBocF8gcHJlZml4IGZyb20gc3RhdGljCisJZnVuY3Rpb25zLiAgKGhwcGFfcHVzaF9hcmd1bWVudHMpOiAgQ2FsbCB2YWx1ZV9hcmdfY29lcmNlIHRvIGNhc3QKKwljaGFyIHRvIGludCBhcmdzIGlmIG5lY2Vzc2FyeS4gIChocHBhX2ZpeF9jYWxsX2R1bW15KTogIENyZWF0ZQorCXRoaXMgcm91dGluZSBmcm9tIEZJWF9DQUxMX0RVTU1ZIG1hY3JvIGluIHRtLWhwcGEuaC4KKwkqIGluZmVyaW9yLmggKFBDX0lOX0NBTExfRFVNTVkpOiAgQ2hlY2sgZm9yIGZyYW1lX2FkZHJlc3MgYmVpbmcKKwl2YWxpZCAoaWU6ICE9IDApIGJlZm9yZSBkb2luZyBjb21wYXJpc29uIGFnYWluc3QgUEMuCisJKiB2YWxvcHMuYyAoY2FsbF9mdW5jdGlvbl9ieV9oYW5kKTogIEFkanVzdCBjYWxsIHRvIEZJWF9DQUxMX0RVTU1ZCisJdG8gcmVmbGVjdCBuZXcgYXJndW1lbnRzLgorCSogY29uZmlnL3BhL3RtLWhwcGEuaCAoUE9QX0ZSQU1FLCBQVVNIX0FSR1VNRU5UUyk6ICBVc2UgbmV3IGhwcGFfCisJcHJlZml4IGZvciBmdW5jCW5hbWUuICAoRklYX0NBTExfRFVNTVkpOiAgTW92ZSBjb2RlIGludG8KKwlocHBhaC10ZGVwLmMuCisKKwkqIHRlc3RzdWl0ZS9nZGIudDE2L2dkYm1lLmMsIHRlc3RzdWl0ZS9nZGIudDE3L2dkYm1lLmM6ICBBZGQgY2FsbHMKKwl0byBtYWxsb2MoKSBzbyB0aGF0IHdlIGNhbiB0ZXN0IEdEQiBldmFsIG9mIGR5bmFtaWNhbGx5IGNyZWF0ZWQKKwlhcnJheXMgKGxpa2UgY2hhciBzdHJpbmdzIGluIGBwcmludCAiZm9vIicpLgorCitGcmkgQXByIDIzIDAxOjI4OjE0IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogcHJpbnRjbWQuYyAocHJpbnRfYWRkcmVzc19zeW1ib2xpYyk6IFNlYXJjaCBzeW10YWJzIGFzIHdlbGwgYXMgdGhlCisJbWluaW1hbCBzeW1ib2xzIGZvciBhIG5lYXJieSBzeW1ib2wuCisKK1RodSBBcHIgMjIgMTk6NDQ6MjEgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGNhY29waG9ueS5jeWdudXMuY29tKQorCisJKiBjb2ZmcmVhZC5jOiAgQ29tbWVudCBjaGFuZ2VzIGFyb3VuZCBtaW5pbWFsIHN5bWJvbCByZWNvcmRpbmcuCisKK1RodSBBcHIgMjIgMTY6MjQ6MzYgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb21tYW5kLmM6IGNvbW1lbnQgY2hhbmdlcyBvbmx5LgorCisJKiBtaXBzLXRkZXAuYyAoaGV1cmlzdGljX2ZlbmNlX3Bvc3QpOiBuZXcgc3RhdGljIHZhcmlhYmxlLgorCSAgKGhldXJpc3RpY19wcm9jX3N0YXJ0KTogdXNlIGhldXJpc3RpY19mZW5jZV9wb3N0LCBwcmludCBiZXR0ZXIKKwkgIHdhcm5pbmdzLCBidXQgb25seSBpZiBub3Qgc3RvcF9zb29uX3F1aWV0bHkuCisJICAoX2luaXRpYWxpemVfbWlwc190ZGVwKTogYWRkX3NldF9jbWQgZm9yIGhldXJpc3RpYy1mZW5jZS1wb3N0LiAKKworVGh1IEFwciAyMiAxNDo1MDowNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogc3ltdGFiLmg6IEZpeCBMT0NfUkVGX0FSRyBjb21tZW50LgorCitXZWQgQXByIDIyIDIwOjIxOjMwIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKwkJCSAgYW5kIEppbSBLaW5nZG9uIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHN0YWJzcmVhZC5jIChkZWZpbmVfc3ltYm9sKTogQ29tYmluZSBhICdwJywgJ3InIGFyZyBwYWlyIHRvIGEKKwlMT0NfUkVHUEFSTSBzeW1ib2wuCisJKiBjb25maWcvc3BhcmMvdG0tc3BhcmMuaCAoUkVHX1NUUlVDVF9IQVNfQUREUik6IFJldmlzZSBjb21tZW50cy4KKwlzeW1maWxlLmMgKGNvbXBhcmVfc3ltYm9scyk6IERvbid0IGNoZWNrIGZpcnN0IGNoYXJhY3RlcjsgU1RSQ01QCisJZG9lcyB0aGF0LgorCisJKiBzdGFic3JlYWQuYyAoZGVmaW5lX3N5bWJvbCk6IEdlbmVyYXRlIGEgTE9DX1JFR1BBUk1fQUREUiBmb3IKKwlzdHJ1Y3R1cmVzIHRoYXQgYXJlIHBhc3NlZCBieSBhZGRyZXNzIGluIGEgcmVnaXN0ZXIuCisJKiBzeW10YWIuaCAoZW51bSBhZGRyZXNzX2NsYXNzKTogQWRkIExPQ19SRUdQQVJNX0FERFIuCisJKiBmaW5kdmFyLmMgKHJlYWRfdmFyX3ZhbHVlKSwKKwlwcmludGNtZC5jIChhZGRyZXNzX2luZm8sIHByaW50X2ZyYW1lX2FyZ3MpLAorCXN0YWNrLmMgKHByaW50X2ZyYW1lX2FyZ192YXJzKSwgc3ltbWlzYy5jIChwcmludF97LHBhcnRpYWxffXN5bWJvbCksCisJKiBzeW10YWIuYyAobG9va3VwX2Jsb2NrX3N5bWJvbCk6IERlYWwgd2l0aCBpdC4KKworVGh1IEFwciAyMiAwOTowNzoyNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogb2JqZmlsZXMuaCAob2JqX3NlY3Rpb24pLCBvYmpmaWxlcy5jIChidWlsZF9vYmpmaWxlX3NlY3Rpb25fdGFibGUpOgorCUFkZCBvYmpmaWxlIGZpZWxkLgorCSogb2JqZmlsZXMuYyAoZmluZF9wY19zZWN0aW9uKTogUmV0dXJuIGEgc3RydWN0IG9ial9zZWN0aW9uICouCisJKiBzcGFyYy10ZGVwLmMgKGluX3NvbGliX3RyYW1wb2xpbmUpOiBEZWFsIHdpdGggZmluZF9wY19zZWN0aW9uIHJldHVybi4KKwkqIHN5bWZpbGUuYyAoc3ltc19mcm9tX29iamZpbGUpIFtJQk02MDAwX1RBUkdFVF06CisJRG9uJ3QgdXNlIG9ial9zZWN0aW9uIGhhY2suCisJKiB4Y29mZmV4ZWMgKHZtYXBfc3ltdGFiKTogUmVsb2NhdGUgb2JqX3NlY3Rpb25zLgorCSogcHJpbnRjbWQuYyAoY29udGFpbmluZ19mdW5jdGlvbl9ib3VuZHMpOiBVc2UgZmluZF9wY19zZWN0aW9uLgorCisJKiBzeW10YWIuaDogQ2xlYW4gdXAgU1lNQk9MX1ZBTFVFIGNvbW1lbnRzLgorCitXZWQgQXByIDIxIDE0OjI5OjU3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBzdGFjay5jIChwcmludF9mcmFtZV9hcmdfdmFycyksIHByaW50Y21kLmMgKHByaW50X2ZyYW1lX2FyZ3MpOgorCUV4cGFuZCBjb21tZW50cyBhYm91dCBMT0NfQVJHL0xPQ19MT0NBTCBwYWlycy4KKworCSogY29mZnJlYWQuYyAocmVhZF9jb2ZmX3N5bXRhYik6IFVzZSByZXdpbmQgYmVmb3JlIGZzZWVrLgorCitXZWQgQXByIDIxIDE0OjI0OjE5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBjaC1leHAueTogIFJlbW92ZWQgdW51c2VkIHN0cnVjdHVyZV9wcmltaXRpdmVfdmFsdWUgYW5kIEZJWE1FXzIzLgorCSogTWFrZWZpbGUuaW46ICBBZGQgJChZRkxBR1MpIHdoZW4gdXNpbmcgJChZQUNDKS4KKwkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlIG1lc3NhZ2UgdG8gZXhwZWN0IGNvbmZsaWN0cyBhbmQgdW51c2VkCisJcnVsZXMgaW4gY2gtZXhwLnksIHNpbmNlIHRoZXJlIG5vIGxvbmdlciBhcmUgYW55IHN1Y2guCisKK1dlZCBBcHIgMjEgMTM6Mjc6NTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvOiBmaXhlZCBiYWQgeHJlZnMgKHVuLWluaXRpYWxpemVkIHN0YXRpY3MpCisKK1R1ZSBBcHIgMjAgMDg6NTU6MTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHhjb2ZmZXhlYy5jICh4Y29mZl9yZWxvY2F0ZV9jb3JlKTogSWYgbm8gZXhlYyBmaWxlLCBlcnJvcigpCisJcmF0aGVyIHRoYW4gZHVtcGluZyBjb3JlLgorCisJKiBNYWtlZmlsZS5pbjogQWRkICR7c3JjZGlyfS8gdG8gYWxsIHNvdXJjZSBmaWxlcy4KKwkoYWxsZGVwcy5tYWspOiBBZGQgIiR7c3JjZGlyfS8iIHRvIGZpbGVzIHdoZW4gZ2VuZXJhdGluZyBhbGxkZXBzLm1hay4KKwkoVEFHUyk6IERlYWwgd2l0aCBzcmNkaXIgYW5kIG5ldyBjb25maWcgZGlyZWN0b3J5IHNjaGVtZS4KKwljcmVhdGV0YWdzOiBSZW1vdmUuCisJTWFrZWZpbGUuaW4gKE5PTlNSQyk6IFJlbW92ZSBjcmVhdGV0YWdzLgorCWFsbGRlcHMubWFrOiBVcGRhdGVkLgorCisJKiByczYwMDAtdGRlcC5jOiBEZWxldGUgdW51c2VkIGZ1bmN0aW9uIHByaW50X2ZyYW1lLgorCisJKiBmcmFtZS5oIChzdHJ1Y3QgZnJhbWVfaW5mbyk6IERvYyBmaXggZm9yIG5leHRfZnJhbWUuCisJTmV3IGZpZWxkIHNpZ25hbF9oYW5kbGVyX2NhbGxlci4KKwlibG9ja2ZyYW1lLmMgKGNyZWF0ZV9uZXdfZnJhbWUsIGdldF9wcmV2X2ZyYW1lX2luZm8pLAorCWNvbmZpZy9yczYwMDAvdG0tcnM2MDAwLmggKElOSVRfRVhUUkFfRlJBTUVfSU5GTyk6IFNldCBpdCAobmVlZHMKKwlJTklUX0ZSQU1FX1BDX0ZJUlNUKS4KKwlzdGFjay5jIChwcmludF9mcmFtZV9pbmZvKSwgcnM2MDAwLXRkZXAuYyAocnM2MDAwX2ZyYW1lX2NoYWluKToKKwlDaGVjayBpdC4KKworTW9uIEFwciAxOSAyMjo1MjozMyAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBpcml4NC1uYXQuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiAgU3BlY2lhbCB2ZXJzaW9uIG9mIHRoaXMgZm9yCisJSXJpeCA0LngsIHdoaWNoIHN0b3JlcyByZWdzIGEgYml0IGRpZmZlcmVudGx5IGZyb20gb3RoZXIgL3Byb2MKKwliYXNlZCBzeXN0ZW1zLgorCSogcHJvY2ZzLmMsIGNvcmUtc3ZyNC5jOiAgTW92ZSBmZXRjaF9jb3JlX3JlZ2lzdGVycyBmcm9tIHByb2Nmcy5jCisJdG8gbmV3IGZpbGUgY29yZS1zdnI0LmMuCisJKiBjb25maWcvaTM4Ni9pMzg2c29sMi5taCwgY29uZmlnL2kzODYvaTM4NnY0Lm1oLCBjb25maWcvbTY4ay9hbWl4Lm1oLAorCWNvbmZpZy9pMzg2L25jcjMwMDAubWgsIGNvbmZpZy9zcGFyYy9zdW40c29sMi5taDogIEFkZCBjb3JlLXN2cjQubworCXRvIE5BVERFUEZJTEVTLgorCSogY29uZmlnL21pcHMvaXJpeDQubWg6ICBBZGQgY29yZWxvdy5vIHRvIE5BVERFUEZJTEVTLgorCitNb24gQXByIDE5IDExOjEzOjM0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBpMzg3LXRkZXAuYzogUmVtb3ZlIHVudXNlZCAjaW5jbHVkZXMuCisKKwkqIGNvbmZpZ3VyZS5pbjogTWF0Y2ggaVszNF04Ni0qLXN5c3YzLjIgbm90IGlbMzRdODYtKi1zeXN2MzIuCisKKwkqIGNvbmZpZy9pMzg2L25tLWkzODZ2Lmg6IERlZmluZSBOT19QVFJBQ0VfSC4KKworU3VuIEFwciAxOCAxMDozOTozNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogeGNvZmZyZWFkLmM6IE51a2UgTk9fREVGSU5FX1NZTUJPTCBjb2RlLiAgVGhlcmUgaXMgbm8gZ29pbmcgYmFjay4KKworCSogc3RhYnNyZWFkLmMgKGRlZmluZV9zeW1ib2wpOiAnUicgaXMgc3lub255bSBmb3IgJ1AnLCBub3QgJ3InLgorCXhjb2ZmcmVhZC5jIChwcm9jZXNzX3hjb2ZmX3N5bWJvbCwgY2FzZSBDX1JQU1lNKToKKwlEb24ndCBtdWNrIHdpdGggU1lNQk9MX0NMQVNTLgorCitGcmkgQXByIDE2IDE3OjM4OjMzIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIG11bmNoOiAgRG9uJ3QgdXNlIGhlYWQgY29tbWFuZC4gIEl0IGRvZXNuJ3QgZXhpc3QgZXZlcnl3aGVyZS4KKworRnJpIEFwciAxNiAxNTowNzo1NyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogaW5mbG93LmMgKG5ld190dHkpOiAgUmVtb3ZlIHNwdXJpb3VzICdvJyBjaGFyYWN0ZXIgYXQgZW5kCisJb2YgI2VuZGlmIGxpbmUuCisKK0ZyaSBBcHIgMTYgMTI6Mjc6MTEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBtaXBzLXRkZXAuYyAobWlwc19za2lwX3Byb2xvZ3VlKTogQWx3YXlzIHNraXAgdGhlIHR5cGljYWwgcHJvbG9ndWUKKwlpbnN0cnVjdGlvbnMgYW5kIG5vdGhpbmcgbW9yZS4KKwkqIG1pcHNyZWFkLmMgKGFkZF9saW5lKTogQWRkIGNvbW1lbnQgd2h5IHdlIGhhdmUgdG8gY29tYmluZSBsaW5lIG51bWJlcgorCWVudHJpZXMgZm9yIHRoZSBzYW1lIGxpbmUgbnVtYmVyLgorCitGcmkgQXByIDE2IDA5OjQyOjAzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBzeW10YWIue2MsaH06IERvYyBmaXhlcyAocmVtb3ZlIHN5bXNlZyByZWZlcmVuY2VzLCBsYXN0IHJlbGV2YW50CisJaW4gZ2RiIDIuOCEpLgorCitUaHUgQXByIDE1IDIxOjE2OjU4IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBkZXBlbmQsIGFsbGRlcHMubWFrOiAgVXBkYXRlLCBub3cgdGhhdCBnY2MgLU1NIGJ1ZyBpcyBmaXhlZC4KKworVGh1IEFwciAxNSAxMjozODozOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogc291cmNlLmMgKHNlbGVjdF9zb3VyY2Vfc3ltdGFiKTogQ2xlYW4gdXAgY29tbWVudC4gIEFsc28sIGlmCisJd2UgaGF2ZSBhIGN1cnJlbnRfc291cmNlX3N5bXRhYiwgYW5kIHMgaXMgTlVMTCwgcmV0dXJuIHdpdGhvdXQKKwlkb2luZyBhbnl0aGluZy4KKwl4Y29mZnJlYWQuYyAoeGNvZmZfc3ltZmlsZV9yZWFkKTogRG9uJ3QgY2FsbCBzZWxlY3Rfc291cmNlX3N5bXRhYi4KKwlicmVha3BvaW50LmMgKGJyZWFrcG9pbnRfcmVfc2V0KTogRG9uJ3QgY2FsbCBzZWxlY3Rfc291cmNlX3N5bXRhYi4KKworVGh1IEFwciAxNSAwMjozNzo0OCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY2Fjb3Bob255LmN5Z251cy5jb20pCisKKwkqIGRieHJlYWQuYyAodW5rbm93bl9zeW1jaGFyX2NvbXBsYWludCk6ICBBZGQgbmV3IGNvbXBsYWludC4KKwkqIHN0YWJzcmVhZC5oOiAgRGVjbGFyZSBpdC4KKwkqIHBhcnRpYWwtc3RhYi5oOiAgVXNlIGl0LgorCisJKiB1dGlscy5jIChtYWxsb2NfYm90Y2gpOiAgRG9uJ3QgZm9yd2FyZC1kZWNsYXJlIGlmIE5PX01NQUxMT0MuCisKK1dlZCBBcHIgMTQgMTc6MTI6NTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHN0YWNrLmMgKHByaW50X2ZyYW1lX2luZm8pOiBQcmludCBzcGVjaWFsbHkgaWYgZHVtbXkgZnJhbWUuCisKKwkqIGJyZWFrcG9pbnQuYzogQWRkIGNvbW1lbnRzIHJlZ2FyZGluZyB3aXRoaW5fc2NvcGUgZnV0dXJlIGRpcmVjdGlvbi4KKworCSogVmVyc2lvbiA0LjguMy4KKworCSogeGNvZmZyZWFkLmMgKHJlY29yZF9pbmNsdWRlX3tiZWdpbixlbmR9KTogQ2hhbmdlIGZhdGFsIHRvIGNvbXBsYWluLgorCitXZWQgQXByIDE0IDE0OjAzOjE4IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQorCisJKiBjaC1leHAueTogIEZpeCB0aGlua28gdGhhdCBicm9rZSBwYXJzaW5nIG9mIEZBTFNFLgorCitXZWQgQXByIDE0IDEyOjQ5OjI5IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogc3RhYnNyZWFkLmMgKHJlYWRfbWVtYmVyX2Z1bmN0aW9ucyk6IEluaXRpYWxpemUgZG9tYWluIGZvciBzdHViYmVkCisJbWVtYmVyIGZ1bmN0aW9ucyB0byBhdm9pZCBnZGIgY29yZSBkdW1wcyB3aGVuIHByaW50aW5nIHBvaW50ZXJzCisJdG8gbWVtYmVyIGZ1bmN0aW9ucy4KKwkqIGNwLXZhbHByaW50LmMgKGNwX3ByaW50X2NsYXNzX21ldGhvZCk6IENoZWNrIGZvciBzdHViYmVkIG1lbWJlcgorCWZ1bmN0aW9ucy4KKworVHVlIEFwciAxMyAwODoyODoyNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogZXhwcHJpbnQuYyAocHJpbnRfc3ViZXhwKTogSWYgb3Bjb2RlIG5vdCBmb3VuZCBpbiBvcF9wcmludF90YWIsCisJc3RvcCB3aXRoIGFuIGVycm9yKCkuCisJZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZS4KKworCSogb2JqZmlsZXMuYyAoYnVpbGRfb2JqZmlsZV9zZWN0aW9uX3RhYmxlKTogQ2FzdCByZXR1cm4gdmFsdWUKKwlmcm9tIG9ic3RhY2tfZmluaXNoLgorCitNb24gQXByIDEyIDEwOjUzOjUwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oLCByczYwMDAtdGRlcC5jOiBNb3ZlIEZSQU1FX0NIQUlOCisJdG8gcnM2MDAwX2ZyYW1lX2NoYWluIGFuZCBkZWFsIHdpdGggaXQgaWYgd2UncmUgaW4gYSBzaWduYWwgaGFuZGxlci4KKwkoRlJBTUVfU0FWRURfUEMpOiBVc2UgcnM2MDAwX2ZyYW1lX2NoYWluLgorCisJKiBicmVha3BvaW50LmMgKHdpdGhpbl9zY29wZSk6IE5ldyBmdW5jdGlvbi4KKwkoZW5hYmxlX2JyZWFrcG9pbnQsIHdhdGNocG9pbnRfY2hlY2spOiBVc2UgaXQuCisKKwkqIHNvdXJjZS5jIChvcGVucCk6IEhhbmRsZSAiZXhlYy1maWxlIC4vbHMiIGNvcnJlY3RseS4KKworCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50XzEpOiBVc2Ugd3JhcF9oZXJlIGJlZm9yZSAiYXQiLgorCitTYXQgQXByIDEwIDAxOjMyOjQzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogY2gtZXhwLnk6ICBDbGVhbiB1cCBsZXhpbmcgb2YgaWRlbnRpZmllcnMgYW5kCisJcmVzZXJ2ZWQgd29yZHMuICAoRS5nLiBkb24ndCByZWNvZ25pemUgRkFMU0VYWFggYXMgdGhlCisJa2V5d29yZCBGQUxTRSBmb2xsb3dlZCBieSB0aGUgaWRlbnRpZmllciBYWFguKQorCUFsc28sIGNvbnZlcnQgaWRlbnRpZmllcnMgdG8gbG93ZXIgY2FzZS4KKworRnJpIEFwciAgOSAxNTo1MzoxOSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiByZW1vdGUtbWlwcy5jLCByZW1vdGUtbW9uaXRvci5jLCByZW1vdGUtc3QyMDAwLmM6ICBDb252ZXJ0IHRvCisJbmV3IHNlcmlhbCBpbnRlcmZhY2UuCisKK0ZyaSBBcHIgIDkgMTU6MDE6MTIgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLmMgKHJlbW90ZV9vcGVuKTogIFVzZSBTRVJJQUxfT1BFTiBpbnN0ZWFkIG9mIHNlcmlhbF9vcGVuLgorCShwdXRwa3QsIGdldHBrdCk6ICBVc2UgbmV3IHJldHVybiBjb2RlcyBmb3IgU0VSSUFMX1JFQURDSEFSLgorCSogc2VyLWdvMzIuYzogIFJldHVybiAtMSBvbiBtb3N0IGZhaWx1cmVzLCAwIG9uIG1vc3Qgc3VjY2Vzc2VzLAorCWFuZCB1c2UgbmV3IHJldHVybiBjb2RlcyBmb3IgZ28zMl9yZWFkY2hhcigpLgorCSogc2VyLXVuaXguYzogIERpdHRvLiAgQWxzbywgbW92ZSBlcnJvciBoYW5kbGluZyB1cCB0byBjYWxsZXIgZm9yCisJU0VSSUFMX1NFVEJBVURSQVRFKCkuCisJKiBzZXJpYWwuYyAoc2VyaWFsX29wZW4pOiAgSW50ZXJuYWwgY2FsbCwgbm90IFNFUklBTF9PUEVOIHRvIGdldAorCXRvIHNwZWNpZmljIHJvdXRpbmUuCisJKHNlcmlhbF9jbG9zZSk6ICBOZXcgcm91dGluZSB0byB3cmFwIGFyb3VuZCBkZXZpY2UgY2xvc2Ugcm91dGluZS4KKwlzZXJpYWwuaDogIENsZWFuICYgZG9jdW1lbnQgcmV0dXJuIHZhbHVlcyBtb3JlIGNsZWFybHkuCisKK0ZyaSBBcHIgIDkgMTA6MjA6NTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHJzNjAwMC1waW5zbi5jIChwcmludF9vcGVyYW5kKTogRGVhbCB3aXRoIG5vIG9wZXJhbmQgaW5zdHJ1Y3Rpb25zLgorCisJKiByczYwMDAtcGluc24uYyAocHJpbnRfb3BlcmFuZCwgY2FzZSBMSSk6IFByaW50IGNvbmRpdGlvbiByZWdpc3RlcgorCW9wZXJhbmQgaW4gZGVjaW1hbCByYXRoZXIgdGhhbiB3cm9uZyB0ZXh0dWFsIHZlcnNpb25zLgorCisJKiBwcmludGNtZC5jIChfaW5pdGlhbGl6ZV9wcmludGNtZCk6IENsZWFuIHVwIGRvY3N0cmluZyBmb3IgIngiCisJKG1lbnRpb24gJ3QnLCByZW1vdmUgZmFsc2UgdGhpbmcgYWJvdXQgJ2cnIG9ubHkgZ29vZCB3aXRoICdmJykuCisKKwkqIGJyZWFrcG9pbnQuaDogbW92ZSAic3RydWN0IGJyZWFrcG9pbnQiIGFuZCBmcmllbmRzIHRvIHRvcCBvZgorCWZpbGUgc28gdGhhdCBicHN0YXRfZmluZF9icmVha3BvaW50IHByb3RvdHlwZSB3b3Jrcy4KKworCSogc29saWIuYyAoc3RydWN0IHNvX2xpc3QpOiBBZGQgYmZkIGZpZWxkLgorCShzb2xpYl9tYXBfc2VjdGlvbnMpOiBMZWF2ZSBiZmQgb3BlbiBhbmQgc2NyYXRjaF9wYXRobmFtZSBhbGxvY2F0ZWQuCisJUHV0IHRoZSBiZmQgaW4gYmZkIGZpZWxkIG9mIHRoZSBzb19saXN0LgorCShjbGVhcl9zb2xpYik6IEZyZWUgYmZkIG5hbWUgYW5kIGNsb3NlX2JmZCBvbiB0aGUgYmZkLgorCitGcmkgQXByICA5IDAwOjQ1OjQxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogdmFsYXJpdGguYyAodmFsdWVfc3Vic2NyaXB0KTogIEFkZCBDT0VSQ0VfUkVGLgorCSogY2gtZXhwLnkgKG9wZXJhbmRfNSk6ICBXZSBjYW4gZ2VuZXJhbGl6ZSB0aGUgMm5kIG9wZXJhbmQKKwlvZiBhIHN0cmluZyByZXBldGl0aW9uIG90ICdsaXRlcmFsJyB3aXRob3V0IGFtYmlndWl0eS4KKworVGh1IEFwciAgOCAxMDoxNToxMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5oIChzdHJ1Y3QgYnBzdGF0KTogUmVtb3ZlIG1vbWVudGFyeSBmaWVsZC4KKwlSZW1vdmUgYnBzdGF0X21vbWVudGFyeV9icmVha3BvaW50LiAgVGhpcyB3YXMgYWx3YXlzIGtsdWRneQorCWFuZCBpcyBubyBsb25nZXIgdXNlZC4KKworCSogYnJlYWtwb2ludC5oOiBBZGQgZW51bSBicHN0YXRfd2hhdC4KKwlicmVha3BvaW50LmggKHN0cnVjdCBicHN0YXQpLCBicmVha3BvaW50LmMgKGJwc3RhdF9zdG9wX3N0YXR1cyk6CisJc3RvcCBhbmQgcHJpbnQgZmllbGRzIG9mIGJwc3RhdCBub3cgcGVyLWJyZWFrcG9pbnQsIG5vdCBqdXN0CisJb25lIGZvciB0aGUgd2hvbGUgY2hhaW4uCisJYnJlYWtwb2ludC57YyxofSAoYnBzdGF0X3doYXQpOiBOZXcgZnVuY3Rpb24uCisJYnJlYWtwb2ludC5oOiBSZW1vdmUgYnBzdGF0X3N0b3AgYW5kIGJwc3RhdF9zaG91bGRfcHJpbnQuCisJaW5mcnVuLmM6IFJlcGxhY2Ugc3dpdGNoIChzdG9wX2Jwc3RhdC0+YnJlYWtwb2ludF9hdC0+dHlwZSkKKwl3aXRoIGNhbGwgdG8gYnBzdGF0X3doYXQuCisJUkVBRE1FOiBSZW1vdmUgd2F0Y2hwb2ludC9icmVha3BvaW50IGJ1ZyBmcm9tIGtub3duIGJ1Z3MuCisKKwkqIGJyZWFrcG9pbnQuaDogUHJvdG90eXBlIGJwc3RhdF9maW5kX2JyZWFrcG9pbnQuCisKK1RodSBBcHIgIDggMTY6MDE6MjEgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIHN5bXRhYi5jIChmaW5kX21ldGhvZHMsIGdkYl9tYW5nbGVfbmFtZSk6ICBOb3RlIHRoYXQgZnVuY3Rpb25zCisJYXJlIGcrKyBzcGVjaWZpYy4KKwkqIHN5bXRhYi5oIChWVEJMX0ZOQUREUl9PRkZTRVQsIE9QTkFNRV9QUkVGSVhfUCwgVlRCTF9QUkVGSVhfUCwKKwlERVNUUlVDVE9SX1BSRUZJWF9QKTogIE5vdGUgdGhhdCBtYWNyb3MgYXJlIGcrKyBzcGVjaWZpYy4KKworVGh1IEFwciAgOCAxMjo0NTozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGk5NjAtcGluc24uYyAodGFiZW50KTogQ29waWVkIHN0cnVjdCBkZWZpbml0aW9uIGZyb20KKwlvcGNvZGVzL2k5NjAtZGlzLmMuCisKK1RodSBBcHIgIDggMTA6MzQ6MzcgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBzeW10YWIuaCAoREVTVFJVQ1RPUl9QUkVGSVhfUCk6IE5ldyBtYWNybyB0byBjaGVjayBpZiBwaHlzbmFtZQorCWlzIGEgQysrIGRlc3RydWN0b3IuCisJKiBzeW10YWIuYyAoZ2RiX21hbmdsZV9uYW1lKTogVXNlIGl0LgorCSogc3ltdGFiLmMgKGZpbmRfbWV0aG9kcyk6IERvIG5vdCBhZGQgZGVzdHJ1Y3RvcnMgdG8gY2hvaWNlIGxpc3QKKwlmb3IgY29uc3RydWN0b3JzLgorCSogc3ltdGFiLmMgKGRlY29kZV9saW5lXzEpOiBNYWtlIGJyZWFrcG9pbnRzIG9uIGRlc3RydWN0b3JzIHdvcmsKKwlmb3IgZ2NjLTIueCBhZ2Fpbi4KKworV2VkIEFwciAgNyAxODo0MzowOSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBzZXItZ28zMi5jOiAgTWFrZSBpdCB1c2Ugc2VyaWFsIHBvcnQgbmFtZS4KKwkqIGdvMzIteGRlcC5jOiAgUHV0IGluIGRlZiBmb3Igc3RybHdyLCBuZWVkZWQgYnkgZGlyLm8gaW4gZ28zMiBsaWJjLgorCisJKiBpbmZjbWQuYyAocmVhZF9wYyk6ICBNYWtlIHN1cmUgdGhhdCB3ZSByZWFkIFBDX1JFR05VTSB3aGVuIG5vdAorCWluIGEgc3lzdGVtIGNhbGwhCisKK1dlZCBBcHIgIDcgMTU6NTI6MTEgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgT25seSBjb25maWd1cmUgc3BhcmNsaXRlIHN1YmRpciB3aGVuIHRhcmdldF9jcHUKKwlpcyBzcGFyY2xpdGUuCisKK1dlZCBBcHIgIDcgMTA6MTE6MjIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHhjb2ZmcmVhZC5jIChzdHJ1Y3QgY29mZl9zeW1ib2wpOiBDaGFuZ2UgY19zY2xhc3MgdG8gdW5zaWduZWQgY2hhci4KKwlSZW1vdmUgRklYTUUgY29tbWVudCByZWdhcmRpbmcgdGhpcy4KKworCSogc3ltZmlsZS5oOiBDaGFuZ2UgTlVMTC0+J1wwJyBpbiBjb21tZW50ICh0aGF0IHdhc24ndCBhIHR5cG8pLgorCisJKiB4Y29mZnJlYWQuYyAocmVhZF94Y29mZl9zeW10YWIpOiBVc2UgRV9TWU1OTUxFTi4KKworVHVlIEFwciAgNiAyMjozMDo1OCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCUFkZCBzZWN0aW9uIHRhYmxlIHRvIG9iamZpbGUgc3RydWN0LiAgVXNlIGl0IGZvciBmaW5kX3BjX3NlY3Rpb24uCisJKiBvYmpmaWxlcy5jIChhZGRfdG9fb2JqZmlsZV9zZWN0aW9ucywKKwkgIGJ1aWxkX29iamZpbGVfc2VjdGlvbl90YWJsZSwgZmluZF9wY19zZWN0aW9uKTogbmV3IGZ1bmN0aW9ucy4KKwkgIChhbGxvY2F0ZV9vYmpmaWxlKTogYnVpbGQgc2VjdGlvbiB0YWJsZS4KKwkqIG9iamZpbGVzLmggKHN0cnVjdCBvYmpfc2VjdGlvbik6IG5ldyBzdHJ1Y3R1cmUuCisJICAoc3RydWN0IG9iamZpbGUpOiBhZGQgc2VjdGlvbiB0YWJsZS4KKwkgIChmaW5kX3BjX3NlY3Rpb24pOiBuZXcgcHJvdG90eXBlLgorCSogc29saWIuW2NoXSAoZmluZF9wY19zZWN0aW9uX2Zyb21fc29fbGlzdCk6IHJlbW92ZWQuCisJKiBzcGFyYy10ZGVwLmM6IGluY2x1ZGUgb2JqZmlsZXMuaCBmb3IgZmluZF9wY19zZWN0aW9uLiAgaW5jbHVkZQorCSAgc3ltZmlsZS5oIGZvciBvYmpmaWxlcy5oLgorCSAgKGluX3NvbGliX3RyYW1wb2xpbmUpOiBhZGp1c3RlZCBmb3IgbmV3IGZpbmRfcGNfc2VjdGlvbgorCSAgcHJvdG90eXBlLiAgUmVtb3ZlZCBCQURfUklDSF9IQUNLIGlmZGVmcy4KKwkqIHN5bWZpbGUuYyAoc3ltc19mcm9tX29iamZpbGUpOiBvZmZzZXQgb2JqZmlsZSBzZWN0aW9ucy4KKwkgIChmaW5kX3BjX3NlY3Rpb24pOiByZW1vdmVkLiAgQWxzbyByZW1vdmVkIEJBRF9SSUNIX0hBQ0sgaWZkZWZzLgorCSogc3ltZmlsZS5oIChmaW5kX3BjX3NlY3Rpb24pOiBwcm90b3R5cGUgcmVtb3ZlZC4gIEFsc28gZml4ZWQKKwkgIGNvbW1lbnQgdHlwbyBOVUwgLT4gTlVMTC4KKwkqIHRhcmdldC5bY2hdIChmaW5kX3BjX3NlY3Rpb25fZnJvbV90YXJnZXRzKTogcmVtb3ZlZC4KKwkqIGNvbmZpZy9zcGFyYy90bS1zdW40c29sMi5oIChCQURfUklDSEhfSEFDSyk6IHJlbW92ZWQuCisKK1R1ZSBBcHIgIDYgMjE6NDE6MTMgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogc2VyLWdvMzIuYzogIEZvcm1hdC4gIChnbzMyX29wZW4pOiAgVXNlIHByb3BlciByZXR1cm4gdmFsdWUuCisKKwkqIGNvbmZpZ3VyZS5pbjogIFVuZG8gY29uZGl0aW9uYWwgY29uZmlnZGlycyBoYWNrIGZvciBzcGFyY2xpdGUuCisKK1R1ZSBBcHIgIDYgMTc6MDc6MzcgMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQorCisJKiBzeW10YWIuYyAobGlzdF9zeW1ib2xzKTogV2hlbiBjYWxsIGJyZWFrX2NvbW1hbmQsIHBhc3MgYm90aAorCWZpbGVuYW1lIGFuZCBmdW5jdGlvbiBuYW1lIG5vdCBqdXN0IGZ1bmN0aW9uIG5hbWUuCisKK1R1ZSBBcHIgIDYgMTU6MDA6MDkgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkoQ2hhbmdlcyBhbmQgbmV3IGZpbGVzIHRvIG1ha2UgIm5vbmUiIGEgZnVsbCBmbGVkZ2VkIGNvbmZpZ3VyYXRpb24pCisJKiBjb25maWcvbm9uZS97bm0tbm9uZS5oLCB0bS1ub25lLmgsIHhtLW5vbmUuaH06ICBOZXcgZmlsZXMuCisJQ3VycmVudGx5IG9ubHkgdG0tbm9uZS5oIGhhcyBhbnkgbWVhbmluZ2Z1bCBjb250ZW50cy4KKwkqIGNvbmZpZy9ub25lL25vbmUubWggKE5BVF9GSUxFKTogIFVzZSBubS1ub25lLmgKKwkqIGNvbmZpZy9ub25lL25vbmUubWggKFhNX0ZJTEUpOiAgVXNlIHhtLW5vbmUuaAorCSogY29uZmlnL25vbmUvbm9uZS5tdCAoVE1fRklMRSk6ICBVc2UgdG0tbm9uZS5oCisJKiBNYWtlZmlsZS5pbiAoZGVwZW5kKTogIFJlbW92ZSBjb21tZW50IGFib3V0IHBhcnNlIGVycm9ycyBpbgorCXZhbG9wcy5jLCBpdCBub3cgcGFyc2VzIGNvcnJlY3RseSBhbmQgZ2VuZXJhdGVzIGEgY29ycmVjdCBkZXBlbmQKKwlsaW5lLiAgUmVtb3ZlIGxpbmUgdGhhdCB0b3VjaGVzIHhtLmgsIHRtLmgsIGFuZCBubS5oOyB0aGV5IGFyZQorCW5vdyBsaW5rZWQgdG8gY29uZmlnL25vbmUve3htLW5vbmUuaCwgdG0tbm9uZS5oLCBubS1ub25lLmh9LgorCitUdWUgQXByICA2IDA5OjU0OjI5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiB2YWx1ZXMuYyAoVVNFX1NUUlVDVF9SRVRVUk4pOiBPbmx5IHVzZSBnY2Mgd2llcmRuZXNzIGZvciBnY2MxLgorCisJKiB4Y29mZnJlYWQuYyAocmVhZF94Y29mZl9zeW10YWIpOiBEZWFsIGNvcnJlY3RseSB3aXRoIHN5bWJvbHMgb2YKKwlleGFjdGx5IDggY2hhcmFjdGVycy4KKworVHVlIEFwciAgNiAxMDozMToyNiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46ICBTcGFyY2xpdGUgdXNlcyBzcGFyYyBjb25maWcgZGlyLiAgQWxzbyBoYXMgaXQncworCW93biB0bS0gJiAubXQgZmlsZXMgbm93LiAgQWxzbyBhZGQgc3BhcmNsaXRlIHRvIGNvbmZpZ2RpcnMuCisJKiBnbzMyLXhkZXAuYzogIER1bW15IHJvdXRpbmVzIGZvciBzaWdzZXRtYXNrICYgc3RybHdyLgorCSogY29uZmlnL2kzODYvZ28zMi5taDogIE51bGxpZnkgZGVmIG9mIFRFUk1DQVAuCisJKiBjb25maWcvaTM4Ni94bS1nbzMyLmg6ICBHZXQgcmlkIG9mIHJlZGVmIG9mIEVJTy4KKwkqIGNvbmZpZy9zcGFyYy97c3BhcmNsaXRlLm1oIHRtLXNwYXJjbGl0ZS5ofTogIE5ldyBzcGFyY2xpdGUKKwlzcGVjaWZpYyBjb25maWdzLiAgVmVyeSBzaW1pbGFyIHRvIHN1bjRvczQsIGJ1dCB3aXRob3V0IHNvbGliLgorCSogc3BhcmNsaXRlL3tNYWtlZmlsZS5pbiBjb25maWd1cmUuaW59OiAgRmlyc3QgY3V0IGF0IG1ha2luZyB0aGlzCisJZGlyIGNvbmZpZ2dhYmxlLgorCitUdWUgQXByICA2IDAzOjEwOjQ0IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIHNlci1nbzMyLmM6ICBGaXJzdCBjdXQgYXQgYWRhcHRpbmcgdG8gbmV3IHNlcmlhbCBpbnRlcmZhY2UuCisKK01vbiBBcHIgIDUgMjI6Mjk6NDMgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFNGSUxFUyBPQlMpOiAgQWRkIHNlcmlhbC5bY29dICYgc2VyLWhhcmR3aXJlLltjb10uCisJVGhlc2UgaW1wbGVtZW50IGEgbmV3IHNlcmlhbCBsaW5lIGludGVyZmFjZSBmb3IgdGFsa2luZyB0byByZW1vdGUKKwl0YXJnZXRzLgorCSogY29uZmlndXJlLmluOiAgTGluayBzZXItaGFyZHdpcmUuYyB0byBzZXItdW5peC5jIGZvciBhbGwgaG9zdHMsCisJRVhDRVBUIGdvMzIsIHdoaWNoIGdldHMgc2VyLWdvMzIuYy4KKwkqIHJlbW90ZS5jOiAgVXNlIG5ldyBzZXJpYWwgaW50ZXJmYWNlLiAgTW9yZSByZW1vdGUteHh4J3MgdG8gYmUKKwljb252ZXJ0ZWQgbGF0ZXIuCisJKiBzZXItYnNkLmMsIHNlci10ZXJtaW9zLmM6ICBSZW1vdmVkLgorCSogc2VyaWFsLmM6ICBOZXcuICBJbXBsZW1lbnRzIGNvbW1vbiBvcGVyYXRpb25zIGZvciBhbGwgc2VyaWFsCisJdHlwZXMuCisJKiBzZXItdW5peC5jOiAgTmV3LiAgVW5peCBzcGVjaWZpYyBzZXJpYWwgb3BlcmF0aW9ucyBmb3IgdmFyaW91cworCWZsYXZvcnMgb2YgVW5peCAoUG9zaXgsIFN5c1YsIEJTRCkuCisJKiBzZXJpYWwuaDogIEdlbmVyaWMgc2VyaWFsIGludGVyZmFjZSBkZWZzLgorCSogY29uZmlnL2kzODYvZ28zMi5taCwgY29uZmlnL2kzODYvaTM4NmJzZC5oLAorCWNvbmZpZy9tNjhrL2Fwb2xsbzY4Yi5taCwgY29uZmlnL3NwYXJjL3N1bjRvczQubWg6ICBSZW1vdmUKKwlzZXItYnNkLm8gZnJvbSBYREVQRklMRVMuICBBbGwgdGhlIG1hZ2ljIGlzIG5vdyBoYW5kbGVkIGluCisJY29uZmlndXJlLmluLgorCitNb24gQXByICA1IDIwOjQ4OjU0IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9oODUwMC90bS1oODUwMC5oOiAgQ2xlYW4gdXAgYnJhaW4gZGFtYWdlIGZvdW5kIGJ5IEdDQy4KKworRnJpIEFwciAgMiAwODoyMzoxNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogeGNvZmZyZWFkLmMgKHhjb2ZmX3N5bWZpbGVfb2Zmc2V0cyk6IFVzZSAwIG5vdCBhZGRyIGZvciBvZmZzZXRzLgorCisJKiByczYwMDAtdGRlcC5jIChmcmFtZWxlc3NfZnVuY3Rpb25faW52b2NhdGlvbik6IERvbid0IGV2ZW4gdGhpbmsKKwlhYm91dCBmcmFtZWxlc3NuZXNzIGV4Y2VwdCBvbiB0aGUgaW5uZXJtb3N0IGZyYW1lLgorCisJKiB4Y29mZmV4ZWMuYzogQ2FsbCBmYXRhbCgpIG5vdCBhYm9ydCgpLgorCisJKiBzdGFic3JlYWQuYyAocGF0Y2hfYmxvY2tfc3RhYnMpOiBJZiBzdGFiICYgbm8gc3ltYm9sLCBtYWtlCisJYSBMT0NfT1BUSU1JWkVEX09VVCBzeW1ib2wuCisJc3ltdGFiLmggKGVudW0gYWRkcmVzc19jbGFzcyk6IEFkZCBMT0NfT1BUSU1JWkVEX09VVC4KKwlmaW5kdmFyLmMgKHJlYWRfdmFyX3ZhbHVlKSwgcHJpbnRjbWQuYyAoYWRkcmVzc19pbmZvKSwKKwlzeW1taXNjLmMgKHByaW50X3sscGFydGlhbF99c3ltYm9sKSwgYy1leHAueSAodmFyaWFibGUpLAorCW0yLWV4cC55ICh5eWxleCk6IERlYWwgd2l0aCBpdC4KKwljaC1leHAueSAoeXlsZXgpOiBEZWFsIHdpdGggaXQuCisKK1RodSBBcHIgIDEgMTg6NDM6MDIgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogZmluZHZhci5jICh2YWx1ZV9mcm9tX3JlZ2lzdGVyKTogIEg4NTAwIHNwZWNpZmljLCBjaGVjayB0byBzZWUKKwlpZiB3ZSBhcmUgbG9va2luZyBhdCBzaG9ydCBwb2ludGVyLiAgSWYgc28sIHNraXAgY3JvY2suCisJKiBoODUwMC10ZGVwLmMgKGg4NTAwX2ZyYW1lX2NoYWluKTogIE1hc2sgZG93biB2YWx1ZSBmcm9tCisJcmVhZF9tZW1vcnlfaW50ZWdlcigpIHRvIGF2b2lkIGdldHRpbmcgbWVzc2VkIHVwIGJ5IHNpZ24gZXh0ZW5zaW9uLgorCitUaHUgQXByICAxIDE2OjQ0OjQxIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCSogc3BhcmMtdGRlcC5jIChpbl9zb2xpYl90cmFtcG9saW5lKSwgc3ltZmlsZS5jIChmaW5kX3BjX3NlY3Rpb24pOgorCSAgaWZkZWYgcHJvdGVjdCB1c2luZyBCQURfUklDSF9IQUNLLiAgVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBzb29uLgorCSogY29uZmlnL3NwYXJjL3RtLXN1bjRzb2wyLmggKEJBRF9SSUNIX0hBQ0spOiBkZWZpbmUuCisKK1RodSBBcHIgIDEgMDk6MDE6MzggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIGk5NjAtcGluc24uYywgYTI5ay1waW5zbi5jOiBNdWNoIGFicmlkZ2VkLCBqdXN0IHVzZSBsaWJvcGNvZGVzLmEuCisKKwkqIGNvcmUuYyAoZGlzX2FzbV9wcmludF9hZGRyZXNzKTogTmV3IGZ1bmN0aW9uLgorCisJKiBjb3JlLmMgKGRpc19hc21fcmVhZF9tZW1vcnkpOiBSZWluc3RhdGUgNHRoIGFyZy4gIFRoZSBwcm90b3R5cGUKKwloYXMgYmVlbiBmaXhlZC4KKworVGh1IEFwciAgMSAwOTozNDo0MyAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGJyZWFrcG9pbnQuYyAoYnBzdGF0X3ByaW50LCBicHN0YXRfc3RvcF9zdGF0dXMpOiBDaGFuZ2UgdG8gd2FsayB0aGUKKwllbnRpcmUgYnJlYWtwb2ludCBjaGFpbiBhbmQgcHJpbnQgb25seSB0aGUgZmlyc3QgZW50cnkgdGhhdCBuZWVkcyB0bworCWJlIHByaW50ZWQgYW5kIG5lZWRzIHRvIGJlIHN0b3BwZWQgZm9yLiBGaXhlcyBwcm9ibGVtcyB3aXRoIHByaW50aW5nCisJb2YgbXVsdGlwbGUgYnJlYWtwb2ludHMgd2l0aCBkaWZmZXJlbnQgY29uZGl0aW9ucy4KKwkqIGJyZWFrcG9pbnQuYyAocHJpbnRfaXRfZG9uZSk6IFJlbmFtZWQgZnJvbSBwcmludF9pdF9ub29wIGFzIGl0CisJZWZmZWN0aXZlbHkgc3RvcHMgcHJpbnRpbmcgb2YgdGhlIGJyZWFrcG9pbnQgY2hhaW4uCisJKiBicmVha3BvaW50LmMgKHByaW50X2l0X25vb3ApOiBOZXcgcm91dGluZSB0byBwcmludCBub3RoaW5nCisJZm9yIHRoaXMgYnJlYWtwb2ludCBlbnRyeSBhbmQgZG9udCBzdG9wIHByaW50aW5nLgorCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50X3JlX3NldF9vbmUpOiBtZW50aW9uIHRoZSByZWV2YWx1YXRlZAorCXdhdGNocG9pbnQgb25seSBpZiBpdCBpcyBlbmFibGVkLgorCSogbWlwc3JlYWQuYyAocGFyc2VfcHJvY2VkdXJlKTogQ29ycmVjdCBpbmNvcnJlY3Qgc2V0am1wIHByb2NlZHVyZQorCWRlc2NyaXB0b3IgZnJvbSB0aGUgbGlicmFyeSB0byBtYWtlIGJhY2t0cmFjZXMgdGhyb3VnaCBzZXRqbXAgd29yay4KKwkqIG1pcHNyZWFkLmMgKGZpeHVwX3NpZ3RyYW1wKTogQ29ycmVjdCBwY3JlZyBhbmQgZnJlZ29mZnNldCBmb3IKKwlzaWd0cmFtcC4KKwkqIG1pcHMtdGRlcC5jIChyZWFkX25leHRfZnJhbWVfcmVnKTogUHJvdmlkZSBjb3JyZWN0IHZhbHVlcyBmb3IKKwlhbGwgcmVnaXN0ZXJzIHNhdmVkIHdpdGhpbiBzaWd0cmFtcCwgY2xlYW51cC4KKworV2VkIE1hciAzMSAxMjo1MjoxMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3BhcmMtcGluc24uYzogTXVjaCBhYnJpZGdlZCwganVzdCBjYWxscyB2ZXJzaW9uIGluIGxpYm9wY29kZXMuYS4KKworV2VkIE1hciAzMSAyMToyMzo0MSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCisKKwkqIGNvcmUuYyAoZGlzX2FzbV9yZWFkX21lbW9yeSk6IGRyb3AgZm91cnRoIGFyZyB3aGljaCBjb25mbGljdHMKKwkgIHdpdGggcHJvdG90eXBlIGluIC4uL2luY2x1ZGUvZGlzLWFzbS5oLgorCitXZWQgTWFyIDMxIDEyOjUyOjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb3JlLmMgKGRpc19hc21fe3JlYWRfbWVtb3J5LG1lbW9yeV9lcnJvcn0pOiBOZXcgZnVuY3Rpb25zLgorCW02OGstcGluc24uYywgaDg1MDAtdGRlcC5jLCBpMzg2LXBpbnNuLmMsIG1pcHMtcGluc24uYywgejhrLXRkZXAuYzoKKwlVc2UgcmVhZF9tZW1vcnlfZnVuYyBpbnRlcmZhY2UgdG8gZGlzYXNzZW1ibGVyLgorCitUdWUgTWFyIDMwIDE1OjQ2OjE0IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCVRlYWNoIHNwYXJjIHNvbGFyaXMgdG8gbmV4dCBvdmVyIHNoYXJlZCBsaWJyYXJ5IGZ1bmN0aW9ucy4KKwkqIHNvbGliLltoY10gKGZpbmRfcGNfc2VjdGlvbl9mcm9tX3NvX2xpc3QpOiBuZXcgZnVuY3Rpb24gYW5kCisJICBwcm90b3R5cGUuCisJKiBzcGFyYy10ZGVwLmMgKGluX3NvbGliX3RyYW1wb2xpbmUpOiBuZXcgZnVuY3Rpb24uCisJKiBzeW1maWxlLltoY10gKGZpbmRfcGNfc2VjdGlvbik6IG5ldyBmdW5jdGlvbiBhbmQgcHJvdG90eXBlcy4KKwkqIHRhcmdldC5baGNdIChmaW5kX3BjX3NlY3Rpb25fZnJvbV90YXJnZXRzKTogbmV3IGZ1bmN0aW9uIGFuZAorCSAgcHJvdG90eXBlcy4KKwkqIGNvbmZpZy9zcGFyYy90bS1zdW40c29sMi5oIChJTl9TT0xJQl9UUkFNUE9MSU5FKTogcmVkZWZpbmUgdG8KKwkgIGluX3NvbGliX3RyYW1wb2xpbmUuCisKK1R1ZSBNYXIgMzAgMDg6MDY6MjQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IFJldmlzZSBjb21tZW50LgorCisJKiBjb21tYW5kLmMgKGRvX3NldHNob3dfY29tbWFuZCk6IFVzZSAldSB3aXRoIHZhcl97dSx6fWludGVnZXIuCisKKwkqIGNvbW1hbmQue2MsaH06IE5ldyB2YXJfdHlwZSB2YXJfaW50ZWdlci4KKwltYWluLmM6IFVzZSBpdCBmb3IgaGlzdG9yeV9zaXplLgorCisJKiByczYwMDAtdGRlcC5jLCB4Y29mZmV4ZWMuYywgY29uZmlnL3JzNjAwMC94bS1yczYwMDAuaCwgYnJlYWtwb2ludC5jOgorCUxpbnQgYW5kIGJ5dGUtb3JkZXIgZml4dXBzLgorCisJKiBicmVha3BvaW50LmMgKHByaW50X2l0X25vcm1hbCk6IFJldHVybiAwIGFmdGVyIGhpdHRpbmcgd2F0Y2hwb2ludC4KKworCSogYnJlYWtwb2ludC5oIChicHN0YXQpOiBOZXcgZmllbGQgcHJpbnRfaXQuCisJYnJlYWtwb2ludC5jIChicHN0YXRfcHJpbnQpOiBVc2UgaXQuCisJKHByaW50X2l0X25vcm1hbCk6IE5ldyBmdW5jdGlvbiAoZnJvbSBvbGQgYnBzdGF0X3ByaW50IGNvZGUpLgorCShicHN0YXRfe2FsbG9jLHN0b3Bfc3RhdHVzfSk6IFNldCBwcmludF9pdCBmaWVsZC4KKworCSogYnJlYWtwb2ludC5jIChicHN0YXRfc3RvcF9zdGF0dXMpOiBVc2UgY2F0Y2hfZXJyb3JzIHdoZW4KKwlldmFsdWF0aW5nIHdhdGNocG9pbnQgY29uZGl0aW9uLCB2aWEgbmV3IGZ1bmN0aW9uIHdhdGNocG9pbnRfY2hlY2suCisJQWxzbyBzdG9wIGlmIHdhdGNocG9pbnQgZGlzYWJsZWQgZHVlIHRvIGxlYXZpbmcgaXRzIGJsb2NrLgorCisJKiBmaW5kdmFyLmMgW1JFR19TVFJVQ1RfSEFTX0FERFJdOiBBZGQgY29tbWVudC4KKworVHVlIE1hciAzMCAwMDoxNDozOCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIG1pcHMtcGluc24uYzogQWRkIG1pc3NpbmcgaW5jbHVkZSBvZiBkaXMtYXNtLmguCisKK01vbiBNYXIgMjkgMTU6MDM6MjUgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChjbGVhbiwgZGlzdGNsZWFuLCByZWFsY2xlYW4pOiAgUmVjdXJzaXZlbHkgYXBwbHkKKwl0byBzdWJkaXJzIGZpcnN0LCByYXRoZXIgdGhhbiBsYXN0LiAgVGhpcyBhdm9pZHMsIGZvciBleGFtcGxlLAorCU1ha2VmaWxlIGJlaW5nIHJlbW92ZWQgaW4gYSBwYXJlbnQgZGlyZWN0b3J5IGJlZm9yZSB0aGUgcmVjdXJzaXZlCisJbWFrZSBpcyBydW4uCisKKwkqIGFsbGRlcHMubWFrLCBkZXBlbmQ6ICBVcGRhdGUgZm9yIGJlbG93IGNoYW5nZXMuCisKKwkqIGNvbmZpZy9tNjhrL3RtLW02OGsuaDogIFJlbmFtZWQgZnJvbSBjb25maWcvbTY4ay90bS02OGsuaC4KKwkqIG02OGsve3RtLTNiMS5oLCB0bS1hbHRvcy5oLCB0bS1hbWl4LmgsIHRtLWVzMTgwMC5oLAorCXRtLWhwMzAwYnNkLmgsIHRtLWhwMzAwaHB1eC5oLCB0bS1pc2kuaCwgdG0tbmV3cy5oLCB0bS1vczY4ay5oLAorCXRtLXN0MjAwMC5oLCB0bS1zdW4yLmgsIHRtLXN1bjMuaCwgdG0tdng2OC5ofTogIEluY2x1ZGUgdG0tbTY4ay5oCisJaW5zdGVhZCBvZiB0bS02OGsuaC4KKwkqIE1ha2VmaWxlLmluIChIRklMRVMpOiAgdG0tNjhrLmggcmVuYW1lZCB0byB0bS1tNjhrLmguCisJKiBSRUFETUUsIGEyOWstcGluc24uYywgbTY4ay1waW5zbi5jLCBtNjhrLXN0dWIuYywgcmVtb3RlLXZ4LmMsCisJbTY4ay97YWx0b3MubWgsIGFsdG9zLm10LCBhcG9sbG82OGIubWgsIG5tLWFwb2xsbzY4Yi5oLAorCW5tLWhwMzAwYnNkLmgsIGNvbmZpZy9tNjhrL3htLWFwb2xsbzY4Yi5ofTogIE1hcCAnNjhrJyB0byAnbTY4aycuCisJKiBhMjlrL3RtLWEyOWsuaCwgZG9jL2dkYmludC50ZXhpbmZvOiAgQWNjb3VudCBmb3IgcmVuYW1pbmcgb2YKKwl0bS02OGsuaCB0byB0bS1tNjhrLmguCisJKiBtNjhrL202OGstZnAubXQgKFRNX0ZJTEUpOiAgdG0tNjhrLWZwLmggcmVuYW1lZCB0byB0bS1tNjhrLWZwLmguCisJKiBtNjhrL202OGstbm9mcC5tdCAoVE1fRklMRSk6ICB0bS02OGstbm9mcC5oIHJlbmFtZWQgdG8KKwl0bS1tNjhrLW5vZnAuaC4KKworCSogY29uZmlnL2EyOWsvdG0tYTI5ay5oOiAgUmVuYW1lZCBmcm9tIGNvbmZpZy9hMjlrL3RtLTI5ay5oLgorCSogYTI5ay1waW5zbi5jOiAgUmVuYW1lZCBmcm9tIGFtMjlrLXBpbnNuLmMuCisJKiBhMjlrLXRkZXAuYzogIFJlbmFtZWQgZnJvbSBhbTI5ay10ZGVwLmMuCisJKiByZW1vdGUtZWIuYywgY29uZmlnL2EyOWsvdG0tdWx0cmEzLmg6ICBJbmNsdWRlIHJlbmFtZWQgdG0tYTI5ay5oLgorCSogcmVtb3RlLW1vbml0b3IuYywgcmVtb3RlLXN0MjAwMC5jLCBjb25maWcvYTI5ay97bm0tdWx0cmEzLmgsCisJdG0tYTI5ay5oLCB4bS11bHRyYTMuaH0sIGNvbmZpZy9yb21wL3J0YnNkLm1oLCBkb2MvZ2RiaW52LXMudGV4aSwKKwl0ZXN0c3VpdGUvZ2RiLnQxNS9mdW5jYXJncy5leHAsIHRlc3RzdWl0ZS9nZGIudDE3L2NhbGxmdW5jcy5leHA6CisJTWFwICcyOWsnIHRvICdhMjlrJy4KKwkqIGNvbmZpZy9hMjlrL3thMjlrLWtlcm4ubXQsIGEyOWstdWRpLm10LCBhMjlrLm10LCB1bHRyYTMubXR9CisJKFRERVBGSUxFUyk6ICBVc2UgcmVuYW1lZCBhMjlrLXBpbnNuLm8gYW5kIGEyOWstdGRlcC5vLgorCSogY29uZmlnL2EyOWsve2EyOWstdWRpLm10LCBhMjlrLm10fSAoVE1fRklMRSk6ICBVc2UgcmVuYW1lZAorCXRtLWEyOWsuaC4KKwkqIGNvbmZpZy9hMjlrL2EyOWstdWRpLm10IChNVF9DRkxBR1MpOiAgUmVtb3ZlIFRBUkdFVF9BTTI5SworCWRlZmluZSB0aGF0IGRvZXMgbm90IGFwcGVhciBhbnl3aGVyZSBlbHNlIGluIHRoZSBnZGIgc291cmNlIHRyZWUuCisJKiBkb2MvZ2RiaW5pdC50ZXhpbmZvOiAgRG9jdW1lbnQgcmVuYW1pbmcgb2YgdG0tMjlrLmggdG8gdG0tYTI5ay5oLgorCitNb24gTWFyIDI5IDEzOjU1OjI5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBicmVha3BvaW50LmM6IEFkZCBjb21tZW50cyByZWdhcmRpbmcgYnJlYWtwb2ludF9yZV9zZXQuCisKKwkqIHhjb2ZmcmVhZC5jIChzb3J0X3N5bXMsIGNvbXBhcmVfc3ltYm9scyk6IFJlbW92ZS4KKwkoeGNvZmZfc3ltZmlsZV9yZWFkKTogVXNlIHNvcnRfYWxsX3N5bXRhYl9zeW1zIGZyb20gc3ltZmlsZS5jCisJbm90IG91ciBvd24gc29ydF9zeW1zIChpdCBpcyBpZGVudGljYWwpLgorCisJKiB4Y29mZnJlYWQuYzogTnVrZSBOQU1FU19IQVZFX0RPVCBkZWZpbmUgKG5vdCB1c2VkKS4KKworU3VuIE1hciAyOCAxMToyNDozNyAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGJyZWFrcG9pbnQuYyAoYnJlYWtwb2ludF9yZV9zZXRfb25lKTogRml4IHN0b3JhZ2UgbGVhay4KKwkqIGJyZWFrcG9pbnQuYyAoZW5hYmxlX2JyZWFrcG9pbnQpOiBEb24ndCBlbmFibGUgd2F0Y2hwb2ludCBpZiBpdAorCXdlbnQgb3V0IG9mIHNjb3BlLgorCSogZXhlYy5jIChleGVjX2Nsb3NlKTogRml4IHN0b3JhZ2UgbGVhay4KKwkqIGV4ZWMuYyAoZXhlY19maWxlX2NvbW1hbmQpOiBNYWtlIHN1cmUgdGhhdCBiZmQgZG9lc24ndCByZWFsaWduIHRoZQorCW91dHB1dCBzZWN0aW9ucyB3aGVuIHBhdGNoaW5nIGFuIGV4ZWN1dGFibGUuCisJKiBtaXBzLW5hdC5jIChzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMpOiBVc2UgUkVHSVNURVJfUFRSQUNFX0FERFIKKwl3aGVuIHdyaXRpbmcgYWxsIHJlZ2lzdGVycy4KKwkqIG1pcHMtdGRlcC5jIChtaXBzX3B1c2hfZHVtbXlfZnJhbWUpOiBTYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycworCWF0IHRoZSByaWdodCBvZmZzZXQgaW4gdGhlIGR1bW15IGZyYW1lLgorCSogbWlwc3JlYWQuYyAocHN5bXRhYl90b19zeW10YWJfMSk6IERvIG5vdCBjb21wbGFpbiBmb3Igc3RQcm9jLAorCXN0U3RhdGljUHJvYyBhbmQgc3RFbmQgc3ltYm9scyBhcyB0aGV5IGFyZSBnZW5lcmF0ZWQgYnkgZ2NjLTIueC4KKwkqIG1pcHNyZWFkLmMgKG1pcHNjb2ZmX25ld19pbml0KTogSW5pdGlhbGl6ZSBzdGFic3JlYWQgYW5kIGJ1aWxkc3ltLgorCitGcmkgTWFyIDI2IDE1OjI1OjA1IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoVEFSRklMRVMpOiAgQXZvaWQgdHJhaWxpbmcgYmFja3NsYXNoLgorCitGcmkgTWFyIDI2IDExOjI5OjMwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBicmVha3BvaW50LntjLGh9OiBBZGQgZXhwX3N0cmluZyB0byBzdHJ1Y3QgYnJlYWtwb2ludCBhbmQgdXNlCisJaXQgaW4gYnJlYWtwb2ludF9yZV9zZXQuCisJKiBicmVha3BvaW50LmMgKHdhdGNoX2NvbW1hbmQsIGVuYWJsZV9icmVha3BvaW50KTogRmV0Y2ggbGF6eSB2YWx1ZXMuCisKKwkqIHJzNjAwMC10ZGVwLmMgKHNpbmdsZV9zdGVwKTogTWlzYyBjbGVhbnVwcyAoQ09SRV9BRERSIG5vdCBpbnQsCisJZG9uJ3QgdXNlIHNpemVvZihpbnQpIGZvciB0YXJnZXQgc3R1ZmYsIGV0YykuCisKK1RodSBNYXIgMjUgMTU6MDM6NTMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGFsbGRlcHMubWFrLCBjb25maWd1cmUuaW4sIGk4NjAtYnJlYWsuaCwgaTg2MC1vcGNvZGUuaCwKKwlpODYwLXBpbnNuLmMsIGk4NjAtdGRlcC5jLCBjb25maWcvaTg2MC8qOiAgUmVtb3ZlIGluY29tcGxldGUgaTg2MAorCXN1cHBvcnQgdGhhdCBjYW4ndCBiZSBpbnRlZ3JhdGVkIGFueXdheSBkdWUgdG8gbGFjayBvZiBjbGVhcgorCWF1dGhvcnNoaXAuCisKK1RodSBNYXIgMjUgMTI6MjY6NTAgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogZmluZHZhci5jIChyZWFkX3JlZ2lzdGVyLCB3cml0ZV9yZWdpc3Rlcik6ICBNYWtlIHRoZXNlIGNhcGFibGUKKwlvZiByZWFkaW5nL3dyaXRpbmcgcmVnaXN0ZXJzIHRoYXQgYXJlIHNob3J0ZXIgdGhhbiBSRUdJU1RFUl9UWVBFLgorCSogKHZhbHVlX2Zyb21fcmVnaXN0ZXIpOiAgSW5zdGFsbCBIODUwMCBzcGVjaWZpYyBjb2RlIHRvIHJldHVybgorCXByb3BlciB2YWx1ZSB3aGVuIHJlZ2lzdGVyIGlzIGJlaW5nIHVzZWQgYXMgYSBwb2ludGVyLgorCSogaDg1MDAtdGRlcC5jOiAgUmVtb3ZlIGV4dHJhIGRlZmluZXMgb2YgTlVNX1JFR1MuCisJKGg4NTAwX3NraXBfcHJvbG9ndWUpOiAgVXNlIGNvcnJlY3QgbGVuZ3RocyBmb3IgTElOSyBpbnN0cnVjdGlvbnMuCisJKEZSQU1FX0NIQUlOKTogIENoYW5nZSBuYW1lIHRvIGg4NTAwX2ZyYW1lX2NoYWluLiAgUmV3cml0ZSBjb2RlIHRvCisJY2hhaW4gZnJhbWVzIHByb3Blcmx5IGJ5IGNvbWJpbmluZyBmcmFtZSBwb2ludGVyIHdpdGggVCByZWcuCisJKGluaXRfZXh0cmFfZnJhbWVfaW5mbyk6ICBEZWxldGUuICBJdCdzIG5vdyBhIG1hY3JvLgorCShmcmFtZV9hcmdzX2FkZHJlc3MpOiAgRG9uJ3QgYWRkIFBUUl9TSVpFLiAgU3RhY2sgYXJncyBhcmUgYWxyZWFkeQorCW9mZnNldCBieSB0aGUgY29ycmVjdCBhbW91bnQgb2ZmIG9mIHRoZSBmcmFtZSBwb2ludGVyLgorCShyZWdpc3Rlcl9ieXRlKTogIERlbGV0ZS4gIEl0J3Mgbm93IGEgbWFjcm8uCisJKHJlZ2lzdGVyX3Jhd19zaXplLCByZWdpc3Rlcl92aXJ0dWFsX3NpemUpOiAgRGVsZXRlLiAgUmVwbGFjZWQgYnkKKwljb21tb24gcm91dGluZSBoODUwMF9yZWdpc3Rlcl9zaXplLCBjdXogdGhlcmUncyBubyBkaWZmZXJlbmNlCisJYmV0d2VlbiB0aGUgcmF3ICYgdmlydHVhbCBzaXplcyBvbiB0aGlzIG1hY2hpbmUuCisJKHJlZ2lzdGVyX2NvbnZlcnRfdG9fcmF3LCByZWdpc3Rlcl9jb252ZXJ0X3RvX3ZpcnR1YWwpOiAgRGVsZXRlLAorCWN1eiB0aGVyZSdzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmF3ICYgdmlydHVhbCBmb3Jtcy4KKwlSZXBsYWNlZCBieSBtZW1jcHkgaW4gdG0gZmlsZS4KKwkocmVnaXN0ZXJfdmlydHVhbF90eXBlKTogIFJlbmFtZSB0byBoODUwMF9yZWdpc3Rlcl92aXJ0dWFsX3R5cGUuCisJR2V0IHJpZCBvZiBwb2ludGVyIHBzZXVkby1yZWdzLCB1c2UgX1JFR05VTSB3aXRoIGFsbCByZWcgbmFtZXMuCisJKF9pbml0aWFsaXplX2g4NTAwX3RkZXApOiAgR2V0IHJpZCBvZiBjcm9jayB0byBlbnN1cmUgdGhhdCBHREIgJgorCWVtdWxhdG9yIGhhdmUgc2FtZSByZWcgb2Zmc2V0cy4gIFRoaXMgaXMgYWxsIGhhbmRsZWQgaW4gdGhlCisJc2ltdWxhdG9yIGNvZGUgbm93LgorCShoODUwMF90cmFwcGVkX2ludGVybmFsdmFyKTogIE5ldyByb3V0aW5lIHRvIGRldGVjdCByZWZlcmVuY2VzIHRvCisJY29udmVuaWVuY2UgdmFycyBhY3RpbmcgYXMgcG9pbnRlciBwc2V1ZG8tcmVncy4KKwkoaDg1MDBfdmFsdWVfdHJhcHBlZF9pbnRlcm5hbHZhcik6ICBDb25qdXJlIHVwIHZhbHVlIG9mIHBvaW50ZXIKKwlwc2V1ZG8tcmVncy4KKwkoaDg1MDBfc2V0X3RyYXBwZWRfaW50ZXJuYWx2YXIpOiAgQ29udmVydCBzZXQgdmFsdWUgaW4gcmVhbAorCXJlZ2lzdGVyIHJlZmVyZW5jZXMuCisJaW5mY21kLmMgKHJlYWRfcGMsIHdyaXRlX3BjKTogIEFkZCBoODUwMCBzcGVjaWZpYyBjb2RlIHRvIGhhbmRsZQorCWNvZGUgc2VnbWVudCByZWdpc3Rlci4KKwlpbmZydW4uYyAocHJvY2VlZCk6ICBTaW1wbGlmeS4gIENhbGwgd3JpdGVfcGMgaW5zdGVhZCBvZiBkb2luZyBpdAorCWJ5IGhhbmQuCisJKHdhaXRfZm9yX2luZmVyaW9yKTogIEFkZCBoODUwMCBzcGVjaWZpYyBjb2RlIHRvIGFkZCBzdGFjayBzZWdtZW50CisJd2hlbiByZWFkaW5nIFNQIHJlZ2lzdGVyLgorCXJlbW90ZS1zaW0uYyAoZmV0Y2hfcmVnaXN0ZXIpOiAgU3BhY2luZy4KKwl0bS1oODUwMC5oOiAgI2RlZmluZSBHREJfVEFSR0VUX0lTX0g4NTAwIHRvIG1ha2UgaXQgZWFzaWVyIHRvCisJZGV0ZWN0IGNydWZ0LiAgUmVkbyBhbGwgcmVnaXN0ZXIgbWFuaXB1bGF0aW9uIHN0dWZmLiAgR2V0IHJpZCBvZgorCXBvaW50ZXIgcHNldWRvLXJlZ3MuICAoSU5JVF9FWFRSQV9GUkFNRV9JTkZPKTogIEFkZHMgc3RhY2sgc2VnbWVudAorCXRvIGZyYW1lIHBvaW50ZXIuICAoSVNfVFJBUFBFRF9JTlRFUk5BTFZBTCwKKwlWQUxVRV9PRl9UUkFQUEVEX0lOVEVSTkFMVkFSLCBTRVRfVFJBUFBFRF9JTlRFUk5BTFZBUik6ICBVc2UgdGhlc2UKKwl0byBjcmVhdGUgaW50ZXJuYWwgdmFycyBmb3IgcG9pbnRlciBwc2V1ZG8tcmVncy4KKworVGh1IE1hciAyNSAxMDoxMDoyOCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46ICBOdW1lcm91cyBzbWFsbCBjaGFuZ2VzIHRvIG1hY3JvIGRlZmluaXRpb25zCisJYW5kIHJ1bGVzIGZvciBidWlsZGluZyBnZGIgZGlzdHJpYnV0aW9uIHRyZWUuICBNYW55IG1hY3JvcworCWVsaW1pbmF0ZWQgb3IgbWVyZ2VkLCBhbmQgcnVsZXMgc2ltcGxpZmllZC4KKwkqIGFsbGRlcHMubWFrOiAgVXBkYXRlLgorCSogZGVwZW5kOiAgVXBkYXRlLgorCitXZWQgTWFyIDI0IDEzOjUyOjI5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogcmVjdXJzZSB0aHJvdWdoIFNVQkRJUlMgZm9yIGR2aSB0YXJnZXQgdG9vCisKK1dlZCBNYXIgMjQgMDg6NDg6MzAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIENsZWFuIHVwIHhjb2ZmIHJlbG9jYXRpb24uCisJb2JqZmlsZXMuaCAoc3RydWN0IG9iamZpbGVzKTogQWRkIHNlY3Rpb25fb2Zmc2V0cywgbnVtX3NlY3Rpb25zLgorCXN5bWZpbGUuYyAoc3ltc19mcm9tX29iamZpbGUpLCB4Y29mZnJlYWQuYyAoeGNvZmZfc3ltZmlsZV9vZmZzZXRzKToKKwlTZXQgdGhlbS4KKwlzeW10YWIuaCAoc3RydWN0IGdlbmVyYWxfc3ltYm9sX2luZm8pOiBBZGQgc2VjdGlvbiBmaWVsZC4KKwltaW5zeW1zLmMgKHByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9seyxfYW5kX2luZm99KTogU2V0IGl0LgorCXhjb2ZmcmVhZC5jOiBTZXQgc2VjdGlvbiBmb3Igc3ltYm9scyBhbmQgbXN5bWJvbHMuCisJKHN0cnVjdCBzeW10YWIpOiBBZGQgYmxvY2tfbGluZV9zZWN0aW9uIGZpZWxkLgorCWJ1aWxkc3ltLmMgKGVuZF9zeW10YWIpOiBTZXQgaXQuCisJKGVuZF9zeW10YWIgYW5kIGNhbGxlcnMpOiBBZGQgc2VjdGlvbiBwYXJhbWV0ZXIuCisJb2JqZmlsZXMuYyAob2JqZmlsZV9yZWxvY2F0ZSk6IE5ldyBmdW5jaXRvbi4KKwl4Y29mZmV4ZWMuYyAodm1hcF9zeW10YWIpOiBVc2UgaXQuCisJeGNvZmZzb2xpYi5oIChzdHJ1Y3Qgdm1hcCk6IFJlbW92ZSB1bnVzZWQgZmllbGRzLgorCWNvbmZpZy9yczYwMDAvdG0tcnM2MDAwLmgsIHN0YWNrLmMsIHhjb2ZmZXhlYy5jOiBSZW1vdmUKKwlDT1JFX05FRURTX1JFTE9DQVRJT04sIHN5bXRhYl9yZWxvY2F0ZWQuCisJY29uZmlnL3JzNjAwMC90bS1yczYwMDAuaDogUmVtb3ZlIHVzZSBvZiBsb2FkaW5mb3RleHQuCisJcnM2MDAwLXRkZXAuYzogTWFrZSBsb2FkaW5mb3RleHQgc3RhdGljLgorCWJyZWFrcG9pbnQuYyAoZml4dXBfYnJlYWtwb2ludHMpOiBEb2MgZml4LgorCXN5bXRhYi5oIChzdHJ1Y3Qgc3ltdGFiKSwgY29uZmlnL3JzNjAwMC90bS1yczYwMDAuaCwgYnVpbGRzeW0uYworCShlbmRfc3ltdGFiKTogcHJpbWFyeSBmaWVsZCByZXBsYWNlcyBub25yZWxvYy4KKworVHVlIE1hciAyMyAwMDoxMDo1MyAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogc3ltdGFiLmggKHN0cnVjdCBsaW5ldGFibGVfZW50cnkpOiAgUmVtb3ZlIGNvbmZ1c2luZyBjb21tZW50LgorCitUdWUgTWFyIDIzIDAwOjAxOjIzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsY2hlY2sgdGFyZ2V0CisKK01vbiBNYXIgMjIgMTY6MTc6NTggMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy97YTI5aywgYXJtLCBjb252ZXgsIGdvdWxkLCBoODMwMCwgaTM4NiwgaTg2MCwgaTk2MCwgbTY4aywKKwltODhrLCBtaXBzLCBub25lLCBuczMyaywgcGEsIHB5ciwgcm9tcCwgcnM2MDAwLCBzcGFyYywgdGFob2UsIHZheCwKKwl6OGt9OiAgTmV3IGRpcmVjdG9yaWVzIHRvIGhvbGQgY3B1IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisJTmFtaW5nIGZvbGxvd3MgZ2NjIGNvbnZlbnRpb24uCisJKiBjb25maWcveyoubXQsICoubWh9OiAgQWxsIHRhcmdldCBhbmQgaG9zdCBtYWtlZmlsZSBmcmFnbWVudAorCWNvbmZpZyBmaWxlcyBtb3ZlZCB0byBhbiBhcHByb3ByaWF0ZSBjb25maWcvPGNwdT4gc3ViZGlyZWN0b3J5LgorCSogbm0tKiwgeG0tKiwgdG0tKjogIEFsbCBuYXRpdmUsIGhvc3QsIGFuZCB0YXJnZXQgZmlsZXMsIHdoaWNoCisJZ2V0IGxpbmtlZCB0byBubS5oLCB4bS5oLCBhbmQgdG0uaCByZXNwZWN0aXZlbHkgYnkgY29uZmlndXJlLAorCW1vdmVkIHRvIGFwcHJvcHJpYXRlIGNvbmZpZy88Y3B1PiBzdWJkaXJlY3RvcnkuCisJKiBubS1zeXN2NC5oLCB4bS1zeXN2NC5oLCB0bS1zeXN2NC5oLCB0bS1zdW5vcy5oLCBubS10cmFzaC5oOgorCU5hdGl2ZSwgaG9zdCwgYW5kIHRhcmdldCBmaWxlcyB0aGF0IGFyZSBjb21tb24gYWNyb3NzIG1vcmUgdGhhbgorCW9uZSBjcHUgYXJjaGl0ZWN0dXJlIGFuZCBpbmNsdWRlZCBieSBvbmUgb2YgdGhlIGNvbmZpZ3VyZWQKKwluYXRpdmUsIGhvc3QsIG9yIHRhcmdldCBmaWxlcywgZ2V0IG1vdmVkIHRvIGNvbmZpZyBkaXJlY3RvcnkuCisJKiBNYWtlZmlsZS5pbiAoSU5DTFVERV9DRkxBR1MpOiAgQWRkIC1JJHtzcmNkaXJ9L2NvbmZpZyB0bworCXBpY2sgdXAgbmF0aXZlLCBob3N0LCBvciB0YXJnZXQgaW5jbHVkZSBmaWxlcyBtb3ZlZCB0byBvbmUgb2YKKwl0aGUgY29uZmlnIHN1YmRpcmVjdG9yaWVzLCBhbmQgdGhhdCBhcmUgaW5jbHVkZWQgYnkgb3RoZXIgZmlsZXMuCisJKiBNYWtlZmlsZS5pbiAoYWxsZGVwcy5tYWspOiAgTW9kaWZ5IHRvIGFjY291bnQgZm9yIG5ldyBjb25maWcKKwlkaXJlY3Rvcnkgc3RydWN0dXJlLgorCSogYWxsZGVwcy5tYWssIGRlcGVuZDogIFVwZGF0ZSBmb3IgbmV3IGNvbmZpZyBkaXJlY3Rvcnkgc3RydWN0dXJlLgorCSogY29uZmlnLyovW250eF1tLSouaDogIE1vZGlmeSBhbGwgZmlsZXMgdGhhdCBpbmNsdWRlIG90aGVyCisJW250eF1tLSouaCBmaWxlcyB0byB1c2UgcGF0aCByZWxhdGl2ZSB0byBnZGIvY29uZmlnLiAgSS5FLgorCSJhMjlrL3RtLXVsdHJhMy5oIiBpbmNsdWRlcyAiYTI5ay90bS0yOWsuaCIgcmF0aGVyIHRoYW4ganVzdAorCSJ0bS0yOWsuaCIuCisJKiByZW1vdGUtZWIuYyAodG0tMjlrLmgpOiAgSW5jbHVkZSBhMjlrL3RtLTI5ay5oLgorCSogbWlwc3JlYWQuYyAodG0tbWlwcy5oKTogIEluY2x1ZGUgbWlwcy90bS1taXBzLmguCisJKiBpODYwLXBpbnNuLmMgKHRtLWk4NjAuaCk6ICBJbmNsdWRlIGk4NjAvdG0taTg2MC5oLgorCSogY29uZmlndXJlLmluOiAgRGVmYXVsdCBnZGJfaG9zdF9jcHUgdG8gaG9zdF9jcHUsIGFuZCByZW1hcAorCXRoZSBvbmVzIHdoZXJlIHRoZSBkZWZhdWx0IGlzIG5vdCB1bmlxdWUgb3IgZGlmZmVyZW50IHRoYW4gdGhlCisJY29uZmlnIHN1YmRpcmVjdG9yeSBuYW1lLiAgU2ltaWxhcmx5LCBoYW5kbGUgZ2RiX3RhcmdldF9jcHUuCisJTW9kaWZ5IGNvbmZpZ3VyZS5pbiBhcyBhcHByb3ByaWF0ZSB0byBtYWtlIHVzZSBvZiBnZGJfaG9zdF9jcHUKKwlhbmQgZ2RiX3RhcmdldF9jcHUgdG8gZmluZCBtYWtlZmlsZSBmcmFnbWVudHMgYW5kIG1ha2UgbGlua3MuCisKK01vbiBNYXIgMjIgMTI6MzY6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBtaXBzcmVhZC5jIChjb21wYXJlX2Jsb2Nrcyk6IFNvcnQgYmxvY2tzIHdpdGggdGhlIHNhbWUgc3RhcnQKKwlhZGRyZXNzIGJ5IGRlY3JlYXNpbmcgZW5kaW5nIGFkZHJlc3MuCisKK01vbiBNYXIgMjIgMjA6MzY6MDQgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBtaXBzcmVhZC5jIChwYXJzZV9wcm9jZWR1cmUpOiBTYXZlIGN1cl9mZHIgYWNjcm9zcyBjYWxsIHRvCisJbG9va3VwX3N5bWJvbCBhcyBpdCBtaWdodCBnZXQgY2xvYmJlcmVkIGJ5IHRoZSBjYWxsLgorCisJKiBtaXBzcmVhZC5jIChwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiBVc2UgQUREX1BTWU1CT0xfQUREUl9UT19MSVNULgorCVRoZSBwcmV2aW91cyBjb2RlIGRpZCBub3QgaW5pdGlhbGl6ZSB0aGUgbGFuZ3VhZ2UgZmllbGQgZm9yIHRoZSBwc3ltdGFiCisJZW50cnkuCisKK1NhdCBNYXIgMjAgMDA6MzM6MzkgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGMtZXhwLnkgKHBhcnNlX251bWJlcik6ICBBdm9pZCBzaGlmdCB3YXJuaW5nLgorCSogc2VyaWFsLmggKHN0cnVjdCB0dHlzdGF0ZSk6ICBEZWNsYXJlIGVtcHR5IG9uZSBvbiBET1MuCisKK0ZyaSBNYXIgMTkgMTI6NTk6NTAgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogeG0tc3VuNG9zNC5oOiAgUmV0dXJuIHR5cGUgb2YgZnJlZSgpIHNob3VsZCBiZSB2b2lkLCBub3QgaW50LgorCisJKiB2eC1zaGFyZS92eFdvcmtzLmg6ICBSZW1vdmUgI2RlZiBvZiBOVUxMLgorCitGcmkgTWFyIDE5IDExOjI4OjE4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiB0bS1yczYwMDAuaDogTnVrZSBuby1vcCBTVEFCX1JFR19UT19SRUdOVU0uCisKK0ZyaSBNYXIgMTkgMDc6NDA6MDkgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKKworCSogejhrLXRkZXAuYyAocHJpbnRfaW5zbik6IEluY2x1ZGUgdGhlIG5ldyBkaXMtYXNtIGhlYWRlciBmaWxlLgorCitUaHUgTWFyIDE4IDE0OjI2OjU3IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKKworCSogaWVlZS1mbG9hdC5jOiBNb3ZlZCB0byAuLi9saWJpYmVydHkuCisJKiBpZWVlLWZsb2F0Lmg6IE1vdmVkIHRvIC4uL2luY2x1ZGUuCisJKiBNYWtlZmlsZS5pbjogIFVwZGF0ZSBhY2NvcmRpbmdseS4KKwkqIGkzODYtcGluc24uYyAocHJpbnRfaW5zbiksIG02OGstcGluc24uYyAocHJpbnRfaW5zbik6CisJQ29udmVydCB0byBzdHVicyB0aGF0IGNhbGwgZGlzYXNzZW1ibGVycyBpbiAuLi9vcGNvZGVzLyotZGlzLmMuCisJKiBtNjhrLXRkZXAuYzogIFJlbW92ZWQgZGVmaW5pdGlvbiBvZiBleHRfZm9ybWF0IGV4dF9mb3JtYXRfNjg4ODE7CisJaXQgaXMgbm93IGluIC4uL29wY29kZXMvbTY4ODgxLWV4dC5jLgorCSogbWlwcy10ZGVwLmMgKG1pcHNfc2tpcF9wcm9sb2d1ZSk6ICBUcnkgdG8gc2tpcCBtb3JlIG9mIHRoZQorCXByb2xvZ3VlIChzb21lIGNhbGxlcnMgX2RvXyBjYXJlKS4KKwkqIG1pcHMtcGluc24uYyAocHJpbnRfaW5zbiksIHo4ay10ZGVwLmMgKHByaW50X2luc24pOiAgQ29udmVydCB0bworCW5ldyBpbnRlcmZhY2Ugb2YgLi4vb3Bjb2Rlcy8qLWRpcy5jLiAKKwkqIGNoLWV4cC55OiAgQWRkICNpbmNsdWRlIDxjdHlwZS5oPi4KKworVGh1IE1hciAxOCAxMTo1Nzo0OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogeGNvZmZleGVjLmMgKGV4ZWNfY2xvc2UpOiBEb24ndCBjbG9zZSBleGVjX2JmZCB0d2ljZS4KKworCSogeGNvZmZyZWFkLmMgKGVudGVyX2xpbmVfcmFuZ2UpOiBlbmRhZGRyIGlzIGV4Y2x1c2l2ZSwgbm90IGluY2x1c2l2ZS4KKworV2VkIE1hciAxNyAwOTo0NjozMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogeGNvZmZyZWFkLmMgKGFycmFuZ2VfbGluZXRhYmxlKTogVXNlIHh7bSxyZX1hbGxvYyBub3Qge20scmV9YWxsb2MuCisKK1dlZCBNYXIgMTcgMTE6Mjg6MTEgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIHo4ay10ZGVwLmMgKGV4dHJhY3RfcmV0dXJuX3ZhbHVlLCB3cml0ZV9yZXR1cm5fdmFsdWUsCisJc3RvcmVfc3RydWN0X3JldHVybik6IE5ldyBmdW5jdGlvbnMgZnJvbSBtYWNyb3MgaW4gdG0tejhrLmguCisJCitXZWQgTWFyIDE3IDExOjIzOjA2IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiB2YWxvcHMuYyAodmFsdWVfYXJnX2NvZXJjZSk6ICBBcHBseSB0ZW1wb3JhcnkgcGF0Y2ggdG8KKwlmaXggcHJvYmxlbSB3aXRoIGNvZXJjaW9uIG9mIGFycmF5IGFuZCBmdW5jdGlvbiB0eXBlcyB3aGVuCisJcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBDIGZ1bmN0aW9ucywgcGVuZGluZyBhIG1vcmUgY29tcGxldGUKKwlyZXZpZXcgb2Ygd2hlbiBhbmQgaG93IGNvZXJjaW9uIHNob3VsZCBiZSBkb25lLCBkZXBlbmRpbmcKKwl1cG9uIGNvbnRleHQgYW5kIGxhbmd1YWdlLgorCitXZWQgTWFyIDE3IDA5OjQ2OjMxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiB4Y29mZnJlYWQuYyAoTUlOX1RCVEFCU0laKTogQ2hhbmdlIHRvIDEyLgorCisJKiB4Y29mZnJlYWQuYyAoeGNvZmZfc3ltZmlsZV9yZWFkKTogT25seSByZWFkIHN0cmluZ3RhYiBhbmQKKwlkZWJ1Z3NlYyBpZiB0aGVyZSBhcmUgYSBub24temVybyBudW1iZXIgb2Ygc3ltYm9scy4KKworVHVlIE1hciAxNiAxODowODo0NSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogY29tbWFuZC5jIChzaG93X3VzZXIpOiAgQXZvaWQgZnByaW50Zl9maWx0ZXJlZCBib3RjaCAoQUdBSU4hKS4KKworVHVlIE1hciAxNiAxNToxODoxNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogeGNvZmZleGVjLmMgKGFkZF92bWFwKTogV3JhcCBzeW1ib2wgcmVhZCBpbiBjYXRjaF9lcnJvcnMuCisKKwkqIHhjb2ZmcmVhZC5jIChyZWFkX3N5bWJvbF9saW5lbm8pOiBMb29rIHRvIGVuZCBvZiBzeW1ib2xzIGZvciAuYmYsCisJbm90IGp1c3QgNTAgc3ltYm9scy4KKwkoc3ltdGJsX251bV9zeW1zKTogTmV3IHZhcmlhYmxlLgorCShyZWFkX3hjb2ZmX3N5bXRhYik6IFNldCBpdC4KKwkocmVhZF9zeW1ib2xfbnZhbHVlKTogQ2hlY2sgZm9yIGJhZCBzeW1uby4KKwkocmVhZF9zeW1ib2xfe2xpbmVubyxudmFsdWV9LCBjYWxsZXJzKTogRG9uJ3QgcGFzcyBzeW10YWJsZTsgaXQncworCWFsd2F5cyBzeW10YmwuCisKK1R1ZSBNYXIgMTYgMTA6MDk6MDUgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3JzNjAwMC5taDogIEdldCByaWQgb2YgLURmZF9zZXQ9aW50IGNyb2NrLgorCVRoaXMgaXMgZGVmaW5lZCBpbiBkZWZzLmggaWYgbmVjZXNzYXJ5LgorCSogdngtc2hhcmUvdnhXb3Jrcy5oOiAgUmVtb3ZlICNkZWZzIG9mIG1pbiBhbmQgbWF4LgorCSogdngtc2hhcmUveGRyX2xkLmMsIHZ4LXNoYXJlL3hkcl9wdHJhY2UuYywKKwl2eC1zaGFyZS94ZHJfcmRiLmM6ICBpbmNsdWRlIGRlZnMuaC4KKworRnJpIE1hciAxMiAwOTozMzoyMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogeGNvZmZyZWFkLmMgKHJldHJpZXZlX3RyYWNlYmFja2luZm8pOiBNb3ZlIGFzc2lnbm1lbnQgb3V0CisJb2Ygd2hpbGUgY29uZGl0aW9uLgorCisJKiB4Y29mZnJlYWQuYyAoZW50ZXJfbGluZV9yYW5nZSk6IGNvbXBsYWluKCkgb24gYmFkIGVuZG9mZnNldC4KKwl4Y29mZnJlYWQuYzogRG9jIGZpeGVzLgorCitUdWUgTWFyICA5IDA5OjU2OjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiB0bS1yczYwMDAuaCAoQ09SRV9ORUVEU19SRUxPQ0FUSU9OKTogSnVzdCBjYWxsIHhjb2ZmX3JlbG9jYXRlX2NvcmUuCisJeGNvZmZleGVjLmMgKHhjb2ZmX3JlbG9jYXRlX2NvcmUpOiBOZXcgZnVuY3Rpb24uCisJKHRleHRfYWRqdXN0bWVudCk6IFJlbW92ZWQuCisJKGFkZF92bWFwKTogUmV0dXJuIHRoZSB2bWFwLgorCXJzNjAwMC10ZGVwLmMgKGFkZF90ZXh0X3RvX2xvYWRpbmZvKTogTm8gbG9uZ2VyIHN0YXRpYy4KKworRnJpIE1hciAgNSAwNToyMjo0NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogeGNvZmZzb2xpYi5oOiBBZGQgb2JqZmlsZSBtZW1iZXIgdG8gc3RydWN0IHZtYXAuCisJeGNvZmZ7ZXhlYyxzb2xpYn0uYzogVXNlIGl0LCBub3QgbG9va3VwX29iamZpbGVfYmZkLgorCXhjb2ZmZXhlYy5jIChhZGRfdm1hcCk6IEFsbG9jYXRlIG9iamZpbGVzIGhlcmUuCisKK1N1biBNYXIgMTQgMDI6NTQ6MTUgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwlTdXBwb3J0IDY4MDAwIHNlcmllcyB3aXRob3V0IGZsb2F0aW5nIHBvaW50LgorCisJKiBjb25maWd1cmUuaW4gKG02ODAwMC0qLXthb3V0LGVsZixjb2ZmfSk6ICBOZXcgY29uZmlncy4KKwkqIHRtLTY4ay1ub2ZwLmg6ICBOZXcgZmlsZSwgbGFja3MgNjg4ODEgc3VwcG9ydC4KKwkqIGNvbmZpZy9tNjhrLW5vZnAubXQ6ICBOZXcgZmlsZS4KKworU3VuIE1hciAxNCAwMjozMDowOCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCVJlbW92ZSBhIGZldyByZW1haW5pbmcgdW5kZXJzY29yZS9uby11bmRlcnNjb3JlIHJlbW5hbnRzIGZyb20KKwljb25maWcgZmlsZXMuCisKKwkqIGNvbmZpZy97bTY4ay11bi5tdCwgc3BhcmMtdW4ubXR9OiAgUmVtb3ZlLgorCSogY29uZmlnL202OGstbm91bi5tdDogUmVuYW1lIHRvIG02OGstZnAubXQuCisJKiBjb25maWcvc3BhcmMtbm91bi5tdDogUmVuYW1lIHRvIHNwYXJjLWVtLm10LgorCSogdG0tNjhrLW5vdW4uaCwgdG0tc3BjLW5vdW4uaDogIFJlbW92ZS4KKwkqIHRtLTY4ay11bi5oOiAgUmVuYW1lIHRvIHRtLTY4ay1mcC5oLgorCSogdG0tc3BjLXVuLmg6ICBSZW5hbWUgdG8gdG0tc3BjLWVtLmguCisJKiB0bS1zdW40c29sMi5oOiBDbGVhbnVwLgorCSogY29uZmlndXJlLmluIChtNjhrLSosIHNwYXJjLSogdGFyZ2V0cyk6ICBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCisKK1NhdCBNYXIgMTMgMTQ6NTg6MjIgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIHN5bW1pc2MuYyAoc3RkX2luLCBzdGRfb3V0LCBzdGRfZXJyKTogIE1vdmUgaW5pdGlhbGl6YXRpb25zCisJdG8gcnVudGltZSBjb2RlLCBpbiBjYXNlIHRoZXkgYXJlbid0IGNvbnN0YW50LgorCitGcmkgTWFyIDEyIDE2OjIzOjU0IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBzeW10YWIuYyAoZmluZF9wY19zeW10YWIpOiBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMsIG5vdGFibHkKKwkgIG1pcHMsIGhhdmUgaG9sZXMgaW4gdGhlIGFkZHJlc3MgcmFuZ2VzIG9mIHN5bXRhYnMuICBDaGFuZ2UKKwkgIHRoaXMgYWxnb3JpdGhtIGZyb20gZmlyc3QgaGl0IHRvIHRpZ2h0ZXN0IGZpdC4KKworCSogbWlwcy10ZGVwLmMgKGhldXJpc3RpY19wcm9jX3N0YXJ0KTogaWYgd2Ugd2FsayB0aGUgcGMgaW50byB0aGUKKwkgIGZlbmNlIHBvc3Qgd2l0aG91dCBmaW5kaW5nIHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24sIHRoZW4gcHJpbnQgYQorCSAgd2FybmluZy4KKworVGh1IE1hciAxMSAwOTozMzowMSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogdXRpbHMuYyAoZnB1dHNfZGVtYW5nbGVkLCBmcHJpbnRfc3ltYm9sKTogIFJlbW92ZS4KKwkqIHV0aWxzLmMgKGZwcmludGZfc3ltYm9sX2ZpbHRlcmVkKTogIE5ldyBmdW5jdGlvbiB3aGljaCBjb21iaW5lcworCXRoZSBmdW5jdGlvbmFsaXR5IG9mIGZwdXRzX2RlbWFuZ2xlZCBhbmQgZnByaW50X3N5bWJvbC4gIFVzZXMgYQorCWNhbGxlciBwcm92aWRlZCBsYW5ndWFnZSBwYXJhbWV0ZXIgdG8gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSAKKwlkZW1hbmdsZXIsIGFuZCBjYWxsZXIgcHJvdmlkZWQgYXJncyB0byBwYXNzIHRvIHRoZSBkZW1hbmdsZXIuCisJKiBkZWZzLmggKGVudW0gbGFuZ3VhZ2UpOiAgTW92ZSBmdXJ0aGVyIHVwIGluIGZpbGUgc28gZW51bSBjYW4KKwliZSB1c2VkIGluIHByb3RvdHlwZXMuCisJKiBkZWZzLmggKGZwdXRzX2RlbWFuZ2xlZCwgZnByaW50X3N5bWJvbCk6ICBSZW1vdmUgcHJvdG90eXBlcy4KKwkqIGRlZnMuaCAoZnByaW50Zl9zeW1ib2xfZmlsdGVyZWQpOiAgQWRkIHByb3RvdHlwZS4KKwkqIGMtdHlwZXByaW50LmMgKGNwX3R5cGVfcHJpbnRfbWV0aG9kX2FyZ3MpOiAgUmVwbGFjZSBjYWxscyB0bworCWZwdXRzX2RlbWFuZ2xlZCB3aXRoIGNhbGwgdG8gZnByaW50Zl9zeW1ib2xfZmlsdGVyZWQuCisJKiBjcC12YWxwcmludC5jIChkZW1hbmdsZS5oKTogIEluY2x1ZGUKKwkqIGNwLXZhbHByaW50LmMgKGNwX3ByaW50X3ZhbHVlX2ZpZWxkcyk6ICBSZXBsYWNlIGNhbGxzIHRvCisJZnByaW50X3N5bWJvbCB3aXRoIGNhbGxzIHRvIGZwcmludGZfc3ltYm9sX2ZpbHRlcmVkLgorCSogcHJpbnRjbWQuYyAocHJpbnRfZnJhbWVfYXJncyk6ICBSZXBsYWNlIGNhbGwgdG8gZnByaW50X3N5bWJvbAorCXdpdGggY2FsbCB0byBmcHJpbnRmX3N5bWJvbF9maWx0ZXJlZC4KKwkqIHN0YWNrLmMgKHByaW50X2ZyYW1lX2luZm8pOiAgUmVtb3ZlIG9ic29sZXRlIGNvZGUgc28gd2UgZG9uJ3QKKwloYXZlIHRvIHVwZGF0ZSBmcHV0c19kZW1hbmdsZWQgdXNhZ2UgaW4gaXQuCisJKiBzdGFjay5jIChwcmludF9mcmFtZV9pbmZvLCBmcmFtZV9pbmZvKTogIEFkZCBsYW5ndWFnZSB2YXJpYWJsZQorCXRvIHBhc3MgdG8gZnByaW50Zl9zeW1ib2xfZGVtYW5nbGVkIGFuZCBpbml0aWFsaXplIGl0IGZyb20gdGhlCisJc3ltYm9sJ3MgbGFuZ3VhZ2UuICBSZXBsYWNlIGNhbGxzIHRvIGZwdXRzX2RlbWFuZ2xlZCB3aXRoIGNhbGxzCisJdG8gZnByaW50Zl9zeW1ib2xfZmlsdGVyZWQuCisJKiBzeW10YWIuYyAoZmluZF9tZXRob2RzKTogIFJlcGxhY2UgY2FsbCB0byBmcHV0c19kZW1hbmdsZWQgd2l0aAorCWNhbGwgdG8gZnByaW50Zl9zeW1ib2xfZmlsdGVyZWQuCisJKiBjaC12YWxwcmludC5jIChkZW1hbmdsZS5oKTogIEluY2x1ZGUuCisJKiBjaC12YWxwcmludC5jIChjaGlsbF9wcmludF92YWx1ZV9maWVsZHMpOiAgUmVwbGFjZSBjYWxsIHRvCisJZnByaW50X3N5bWJvbCB3aXRoIGNhbGwgdG8gbmV3IGZwcmludGZfc3ltYm9sX2ZpbHRlcmVkLgorCitXZWQgTWFyIDEwIDE3OjM3OjExIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICBCdW1wIHZlcnNpb24gdG8gNC44LjIuCisKKwkqIG1haW4uYyAoc291cmNlX2NvbW1hbmQpOiAgUmVxdWlyZSBhbiBleHBsaWNpdCBwYXRobmFtZSBvZiBmaWxlCisJdG8gc291cmNlLCBzaW5jZSBwcmV2aW91cyBiZWhhdmlvciBvZiBkZWZhdWx0aW5nIHRvIGdkYiBpbml0IGZpbGUKKwl3YXMgdHJvdWJsZXNvbWUgYW5kIHVuZG9jdW1lbnRlZC4KKwkqIHByaW50Y21kLmMgKGRpc2Fzc2VtYmxlX2NvbW1hbmQpOiAgQWRkIG1pc3NpbmcgJ3t9JyBwYWlyIHRvCisJZWxzZSB3aXRoIHR3byBzdGF0ZW1lbnRzLiAgQnVnIHJlcG9ydGVkIGJ5IFN0ZXBoYW5lIFRzYWNhcworCTxzbHRAaXNvZnQuZnI+LgorCSogc3ltdGFiLmMgKGZpbmRfcGNfbGluZSk6ICBEb24ndCBjb21wbGFpbiBhYm91dCB6ZXJvIGxlbmd0aCBvcgorCW5lZ2F0aXZlIGxlbmd0aCBsaW5lIG51bWJlcnMgZm9yIHRoZSBtb21lbnQsIHNpbmNlIHdlIG1heSBub3Qgb3duCisJdGhlIHRlcm1pbmFsIHdoZW4gY2FsbGVkLCBzdWNoIGFzIHdoZW4gc2luZ2xlIHN0ZXBwaW5nLiAgKEZJWE1FKQorCSogbGFuZ3VhZ2UuaCAoQ0FTVF9JU19DT05WRVJTSU9OKTogIFRydWUgaWYgY3VycmVudCBsYW5ndWFnZSBpcworCUMrKyBhcyB3ZWxsIGFzIEMuICBGaXggZnJvbSBQZXRlciBTY2hhdWVyLgorCSogZW52aXJvbi5jIChnZXRfaW5fZW52aXJvbiwgc2V0X2luX2Vudmlyb24sIHVuc2V0X2luX2Vudmlyb24pOgorCVVzZSBTVFJFUU4gbWFjcm8gcmF0aGVyIHRoYW4gYmFyZSAnIXN0cm5jbXAoKScuCisJKiBlbnZpcm9uLmMgKHVuc2V0X2luX2Vudmlyb24pOiAgQXZvaWQgdXNlIG9mIG1lbWNweSBvbgorCW92ZXJsYXBwaW5nIG1lbW9yeSByZWdpb25zLCBhcyBzdWdnZXN0ZWQgYnkgUGF1bCBFZ2dlcnQKKwk8ZWdnZXJ0QHR3aW5zdW4uY29tPi4KKwkqIGMtZXhwLnkgKCV1bmlvbiBzdHJ1Y3QpOiAgUmVtb3ZlIHVudXNlZCB1bHZhbCBhcyBzdWdnZXN0ZWQKKwlieSBQYXVsIEVnZ2VydCA8ZWdnZXJ0QHR3aW5zdW4uY29tPi4KKworTW9uIE1hciAgOCAxOTowMzowNiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogbWFpbi5jIChnZGJpbml0KTogIE1ha2Ugc3RhdGljLgorCSogbWFpbi5jIChpbmhpYml0X2dkYmluaXQpOiAgTW92ZSB0byBmaWxlIHNjb3BlLgorCSogbWFpbi5jIChtYWluKTogIFJlbW92ZSBsb2NhbCBpbmhpYml0X2dkYmluaXQuCisJKiBtYWluLmMgKHNvdXJjZV9jb21tYW5kKTogIERvbid0IHNvdXJjZSAnLmdkYmluaXQnIGZpbGUgYnkKKwlkZWZhdWx0IGlmIGdkYiBoYXMgYmVlbiB0b2xkIHRvIGlnbm9yZSBpdC4KKworU3VuIE1hciAgNyAyMTo1ODo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChNQUtFT1ZFUlJJREVTKTogRGVmaW5lIHRvIGJlIGVtcHR5IGZvciBHTlUgTWFrZQorCTMuNjMuCisKK0ZyaSBNYXIgIDUgMTc6Mzk6NDUgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGNhY29waG9ueS5jeWdudXMuY29tKQorCisJKiBwcmludGNtZC5jIChwcmludF9hZGRyZXNzX3N5bWJvbGljKTogIE9ubHkgcHJpbnQgaWYgb2Zmc2V0CisJaXMgc2hvcnRlciB0aGFuIG1heF9zeW1ib2xpY19vZmZzZXQuCisJKGluaXRpYWxpemVfcHJpbnRjbWQpOiAgYHNldCBwcmludCBtYXgtc3ltYm9saWMtb2Zmc2V0Jy4KKworCSogYW0yOWstdGRlcC5jIChUQUdXT1JEX1pFUk9fTUFTSyk6ICBOZXcgI2RlZmluZS4KKwkoZXhhbWluZV90YWcpOiAgVXNlIGl0LgorCShyZWFkX3JlZ2lzdGVyX3N0YWNrKTogIE9ubHkgbG9vayBpbiB0aGUgbG9jYWwgcmVnaXN0ZXJzIGZvciBhCisJbWVtb3J5IGFkZHJlc3MgaWYgaXQncyBiZXR3ZWVuIHJmYiBhbmQgcnNwOyBnbyB0byBtZW1vcnkgb3RoZXJ3aXNlLgorCShpbml0aWFsaXplXzI5ayk6ICBGaXggY2FsbF9zY3JhdGNoX2FkZHJlc3MgZG9jLiAgUmVtb3ZlIHJlZ2ludl9jb20uCisJKHJlZ2ludl9jb20pOiAgUmVtb3ZlIGFuY2llbnQga2x1ZGdlIGNvbW1hbmQuCisKK0ZyaSBNYXIgIDUgMTc6MTY6MjYgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiB0bS1pcml4My5oIChaRVJPX1JFR05VTSk6IGNvcHkgdGhpcyBtYWNybyBmcm9tIHRtLW1pcHMuaCBzbyB0aGF0CisJICBpcml4NCB3aWxsIGFnYWluIGNvbXBpbGUuCisKKwkqIHRtLW1pcHMuaCAoR0RCX1RBUkdFVF9JU19NSVBTKTogbm8gbG9uZ2VyIHVzZWQsIG5vdyByZW1vdmVkLgorCisJKiBjb25maWd1cmUuaW46IGFjY2VwdCBtaXBzLXNnaS1pcml4NCogZm9yIGlyaXg0LgorCitGcmkgTWFyICA1IDA3OjQ5OjQ4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGxpc2EuY3lnbnVzLmNvbSkKKworCSogejhrLXRkZXAuYyAocHJpbnRfcmVnaXN0ZXJfaG9vayk6IExpbnQuCisKK1RodSBNYXIgIDQgMTc6NDI6MDMgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwlMaW50IGZpeGVzIGZyb20gUGF1bCBFZ2dlcnQgKGVnZ2VydEB0d2luc3VuLmNvbSk6CisKKwkqIGNvbW1hbmQuYyAoZG9fc2V0c2hvd19jb21tYW5kKTogIHZhcl91aW50ZWdlcnMgYXJlIHVuc2lnbmVkLgorCSogc3BhcmMtdGRlcC5jIChzYXZlX2luc25fb3Bjb2RlcywgcmVzdG9yZV9pbnNuX29wY29kZXMpOiAKKwl1bnNpZ25lZCwgc2luY2UgdGhleSB1c2UgaGV4IHZhbHVlcyB3aXRoIHRoZSBoaWdoIGJpdCBzZXQuCisKK1RodSBNYXIgIDQgMDg6MjI6NTUgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwlGaXhlcyBzdWJtaXR0ZWQgYnkgS2FybCBCZXJyeSAoa2FybEBuZXJtYWwuaHEuaWxlYWYuY29tKToKKwkqIG04OGstcGluc24uYyAoc3ByaW50X2FkZHJlc3MpOiAgVXNlIFNZTUJPTF9OQU1FIG1hY3JvIHRvCisJYWNjZXNzIHN5bWJvbCBuYW1lLiAgCisJKiBtODhrLW5hdC1jIChTWElQX09GRlNFVCwgU05JUF9PRkZTRVQsIFNGSVBfT0ZGU0VUKTogIEVuY2xvc2UKKwltYWNybyBkZWZpbml0aW9ucyBpbiBwYXJlbnRoZXNpcy4KKworCSogZGJ4cmVhZC5jIChkYnhfc3ltZmlsZV9pbml0KTogIENhdGNoIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzCisJbm8gc3RyaW5nIHRhYmxlLCBidXQgdGhlIG9ubHkgd2F5IHdlIGZpbmQgb3V0IGlzIGJ5IHJlYWRpbmcgemVybworCWJ5dGVzIGZyb20gRU9GLgorCitXZWQgTWFyICAzIDE1OjUxOjI4IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBkYnhyZWFkLmMgKGRieF9zeW1maWxlX2luaXQpOiAgTWFrZSBzaXplIG9mIHRoZSBzdHJpbmcgdGFibGUKKwlzaXplIGZpZWxkIGEgZGVmaW5lIChEQlhfU1RSSU5HVEFCX1NJWkVfU0laRSkuICBFbnN1cmUgdGhhdCB0aGUKKwlvZmZzZXQgdG8gdGhlIHN0cmluZyB0YWJsZSBpcyBub256ZXJvIGFuZCBoYW5kbGUgdGhlIG5vbmV4aXN0YW50CisJc3RyaW5nIHRhYmxlIGNhc2UsIHNob3VsZCBpdCBvY2N1ci4gIEVuc3VyZSB0aGF0IHRoZSBzdHJpbmcgdGFibGUKKwlzaXplIHJlYWQgZnJvbSB0aGUgZmlsZSBpcyByZWFzb25hYmxlLCB3aXRoIGEgbWluaW11bSBsb3dlciBib3VuZAorCW9mIERCWF9TVFJJTkdUQUJfU0laRV9TSVpFIGluc3RlYWQgb2YgemVyby4KKworV2VkIE1hciAgMyAwNzoyMzowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBDaGFuZ2VzIHRvIGJ1aWxkIHRlc3RzdWl0ZSBjb3JyZWN0bHkuCisJKEZMQUdTX1RPX1BBU1MpOiBBZGRlZCBDWFggYW5kIENYWEZMQUdTLgorCShDQ19GT1JfVEFSR0VULCBDWFgsIENYWF9GT1JfVEFSR0VUKTogTmV3IHZhcmlhYmxlcy4KKwkoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpOiBOZXcgdmFyaWFibGUuCisJKFNVQkRJUlMpOiBBZGRlZCB0ZXN0c3VpdGUuCisJKGFsbCk6IEJ1aWxkIHRlc3RzdWl0ZSB1c2luZyBUQVJHRVRfRkxBR1NfVE9fUEFTUywgc28gdGhhdAorCXRlc3RzdWl0ZSBpcyBjb21waWxlZCB3aXRoIENDX0ZPUl9UQVJHRVQgcmF0aGVyIHRoYW4gQ0MuCisKK1R1ZSBNYXIgIDIgMTc6NTc6NTYgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGRieHJlYWQuYyAoZGJ4X3N5bWZpbGVfaW5pdCk6ICBGaXggZm9yIG5vbmV4aXN0YW50IHN0cmluZyB0YWJsZSwKKwlyZXBvcnRlZCBieSBteWNyb2Z0QGdudS5haS5taXQuZWR1LgorCisJKFVsdHJpeCAyLjIgc3VwcG9ydCBmcm9tIE1pY2hhZWwgUmVuZGVsbCA8bWljaGFlbEBtZXJjdXJ5LmNzLm11bi5jYT4pCisJKiBjb25maWd1cmUuaW4gKHZheC0qLXVsdHJpeDIqKTogIE5ldyB0cmlwbGV0LgorCSogY29uZmlnL3ZheHVsdDIubWg6ICBOZXcgZmlsZS4KKwkqIHhtLXZheHVsdDIuaDogIE5ldyBmaWxlLgorCisJKiBjLWV4cC55IChwYXJzZV9udW1iZXIpOiAgQ2hhbmdlIGhpZ2hfYml0IHRvIHVuc2lnbmVkLgorCSogZGVtYW5nbGUuYzogIENoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byBjZnJvbnQgdG8gQVJNLCBzaW5jZSB0aGUKKwlhY3R1YWwgYWxnb3JpdGhtIGlzIHRoZSBvbmUgc3BlY2lmaWVkIGluIHRoZSBBbm5vdGF0ZWQgUmVmZXJlbmNlCisJTWFudWFsLiAgVGhpcyB3YXMgY29uZnVzaW5nIHVzZXJzIGludG8gdGhpbmtpbmcgdGhhdCBmdWxsIGNmcm9udAorCXN1cHBvcnQgd2FzIGltcGxlbWVudGVkLgorCSogZHdhcmZyZWFkLmMgKENGUk9OVF9QUk9EVUNFUik6ICBSZW1vdmUsIHdhcyBuZXZlciByZWFsbHkgdXNlZC4KKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKTogIEZvciBTVFJVQ1RPUF9QVFIgcGFzcyB0aGUgYXJnIHR5cGUKKwlkaXJlY3RseSB0byBsb29rdXBfc3RydWN0X2VsdF90eXBlLCB3aGljaCB3aWxsIGRvIHRoZQorCWRlcmVmZXJlbmNpbmcgaXRzZWxmLgorCSogZ2RidHlwZXMuYyAobG9va3VwX3N0cnVjdF9lbHRfdHlwZSk6ICBFeHBhbmQgY29tbWVudHMuICBGaXgKKwlOVUxMIGRlcmVmZXJlbmNpbmcgYnVnIGZvciB1bm5hbWVkIHN0cnVjdHMsIGNvbW1lbnQgb3V0CisJcXVlc3Rpb25hYmxlIGNvZGUuCisJCitNb24gTWFyICAxIDE3OjU0OjQxIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBjb2ZmcmVhZC5jIChwcm9jZXNzX2NvZmZfc3ltYm9sKTogIENoYW5nZSBQQ0MgYXJndW1lbnQgY29ycmVjdGlvbgorCXNvIHRoYXQgaXQgb25seSBoYXBwZW5zIG9uIGJpZy1lbmRpYW4gdGFyZ2V0czsgc28gdGhhdCBpdCBvbmx5CisJaGFwcGVucyBpZiB0aGUgc2hvcnQgb3IgY2hhciBhcmd1bWVudCBpcyBhbGlnbmVkIG9uIGFuIGludAorCWJvdW5kYXJ5OyBhbmQgc28gdGhhdCBpdCBjaGFuZ2VzIHRoZSBsb2NhdGlvbiwgcmF0aGVyIHRoYW4gdGhlCisJdHlwZSwgb2YgdGhlIGFyZ3VtZW50LiAgVGhlc2UgY2hhbmdlcyB0ZW5kIHRvIHBhcmFsbGVsIHNpbWlsYXIKKwkob2xkKSBjaGFuZ2VzIGluIHN0YWJzcmVhZC5jLgorCisJKiBjb2ZmcmVhZC5jIChjb2ZmX3JlYWRfZW51bV90eXBlKTogIFVzZSB0aGUgc3BlY2lmaWVkIHNpemUgZm9yCisJZW51bXMsIGRvbid0IGFzc3VtZSB0aGF0IHRoZXkgYXJlIGludC1zaXplZC4KKworCSogYy12YWxwcmludC5jIChjX3ZhbF9wcmludCk6ICBEb24ndCBhc3N1bWUgZW51bXMgYXJlIHRoZSBzYW1lIGFzCisJaW50cy4KKworCSogY29yZWRlcC5jOiAgSGFuZGxlIE5PX1BUUkFDRV9IIGluIGNvcmVkZXAuYy4gIEZpeCBieSBNaWNoYWVsCisJUmVuZGVsbCwgPG1pY2hhZWxAbWVyY3VyeS5jcy5tdW4uY2E+LgorCitNb24gTWFyICAxIDA5OjI1OjU3IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBsYW5ndWFnZS5oIChsb2NhbF9kZWNpbWFsX2Zvcm1hdF9jdXN0b20pOiAgQWRkIHByb3RvdHlwZS4KKwkqIGxhbmd1YWdlLmMgKGxvY2FsX2RlY2ltYWxfZm9ybWF0X2N1c3RvbSk6ICBBZGQgZnVuY3Rpb24sIGJ1ZworCXJlcG9ydGVkIGJ5IFJvYmVydCBSLiBIZW5yeSAocnJoQHRlcmEuY29tKS4KKworRnJpIEZlYiAyNiAxODozMzoxOCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY2Fjb3Bob255LmN5Z251cy5jb20pCisKKwkqIHhjb2ZmZXhlYy5jICh2bWFwX2xkaW5mbyk6ICBGaXggIi8iIGZvciAnLycgdHlwbywgcmVwb3J0ZWQKKwlieSBKb3NlZiBMZWhlcmJhdWVyLCBqb2VAdGFrZUZpdmUuY28uYXQuCisKK1dlZCBGZWIgMjQgMTk6MTc6MTEgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGNhY29waG9ueS5jeWdudXMuY29tKQorCisJKiBzeW1maWxlLmMgKHN5bXNfZnJvbV9vYmpmaWxlKSwgdG0tMjlrLmgsIHRtLTNiMS5oLCB0bS02OGstdW4uaCwKKwl0bS1hbHRvcy5oLCB0bS1hcm0uaCwgdG0tY29udmV4LmgsIHRtLWVzMTgwMC5oLCB0bS1oODMwMC5oLAorCXRtLWhwMzAwYnNkLmgsIHRtLWhwMzAwaHB1eC5oLCB0bS1ocHBhLmgsIHRtLWkzODZic2QuaCwKKwl0bS1pMzg2di5oLCB0bS1pOTYwLmgsIHRtLWlyaXgzLmgsIHRtLWlzaS5oLCB0bS1saW51eC5oLAorCXRtLW04OGsuaCwgdG0tbWVybGluLmgsIHRtLW1pcHMuaCwgdG0tbmV3cy5oLCB0bS1ucDEuaCwgdG0tcG4uaCwKKwl0bS1weXIuaCwgdG0tcnM2MDAwLmgsIHRtLXNwYy11bi5oLCB0bS1zdW4zODYuaCwgdG0tc3Vub3MuaCwKKwl0bS1zeW1tZXRyeS5oLCB0bS1zeXN2NC5oLCB0bS10YWhvZS5oLCB0bS11bWF4LmgsIHRtLXZheC5oLAorCXRtLXZ4NjguaCwgdG0tejhrLmg6ICBSZW1vdmUgcmVtbmFudHMgb2YgTkFNRVNfSEFWRV9VTkRFUlNDT1JFLgorCitXZWQgRmViIDI0IDA3OjQxOjE1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBzeW10YWIuaCAoU1lNQk9MX0lOSVRfREVNQU5HTEVEX05BTUUpOiAgSW5pdGlhbGl6ZSBjb250ZW50cworCW9mIGRlbWFuZ2xlZCBuYW1lIGZpZWxkcyB0byBOVUxMIGlmIG5vIGRlbWFuZ2xpbmcgZXhpc3RzIGZvcgorCWEgc3ltYm9sLiAgU1lNQk9MX0lOSVRfTEFOR1VBR0VfU1BFQ0lGSUMgZG9lcyB0aGlzIGZvciBuZXcKKwlzeW1ib2xzIGlmIHRoZWlyIGxhbmd1YWdlIGlzIGtub3duIGF0IHRoZSB0aW1lIHRoZXkgYXJlIGNyZWF0ZWQsCisJYnV0IHNvbWV0aW1lcyB0aGUgbGFuZ3VhZ2UgaXMgbm90IGtub3duIHVudGlsIGxhdGVyLgorCisJKiBjaC10eXBlcHJpbnQuYyAoY2hpbGxfcHJpbnRfdHlwZV9iYXNlKTogIE5hbWUgY2hhbmdlZCB0bworCWNoaWxsX3R5cGVfcHJpbnRfYmFzZSB0byBtYXRjaCBwYXR0ZXJuIGZvciBDIGFuZCBDKysgbmFtZXMuCisJKiBjaC10eXBlcHJpbnQuYyAoY2hpbGxfcHJpbnRfdHlwZSk6ICBDaGFuZ2UgImNoYXIiIHRvICJDSEFSIgorCXRvIGJlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciB1c2FnZXMuCisJKiBjaC10eXBlcHJpbnQuYyAoY2hpbGxfdHlwZV9wcmludF9iYXNlKTogIEFkZCBzdXBwb3J0IGZvcgorCXByaW50aW5nIENoaWxsIFNUUlVDVCB0eXBlcy4KKwkqIGNoLXZhbHByaW50LmM6ICBJbmNsdWRlIHZhbHVlcy5oLgorCSogY2gtdmFscHJpbnQuYyAoY2hpbGxfcHJpbnRfdmFsdWVfZmllbGRzKTogIE5ldyBmdW5jdGlvbiBhbmQKKwlwcm90b3R5cGUgZm9yIHByaW50aW5nIENoaWxsIFNUUlVDVCB2YWx1ZXMuCisJKiBjaC12YWxwcmludC5jIChjaGlsbF92YWxfcHJpbnQpOiAgRml4IGNhbGwgdG8gdmFsX3ByaW50X3N0cmluZworCXRoYXQgd2FzIGJlaW5nIGNhbGxlZCB3aXRoIHR3byBhcmdzIGluc3RlYWQgb2YgdGhyZWUuCisJKiBjaC12YWxwcmludC5jIChjaGlsbF92YWxfcHJpbnQpOiAgQ2FsbCBjaGlsbF9wcmludF92YWx1ZV9maWVsZHMKKwl0byBwcmludCBDaGlsbCBTVFJVQ1QgdmFsdWVzLgorCitUdWUgRmViIDIzIDE4OjU4OjExIDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgdGVzdHN1aXRlIHRvIGNvbmZpZ2RpcnMuCisKK1R1ZSBGZWIgMjMgMTE6NDY6MTEgMTk5MyAgTWlrZSBTdHVtcCAgKG1yc0BjeWdudXMuY29tKQorCisJKiBkb2Mvc3RhYnMudGV4aTogVGhlIGB0aGlzJyBwb2ludGVyIGlzIG5vdyBrbm93biBieSB0aGUgbmFtZQorCWB0aGlzJyBpbnN0ZWFkIG9mIGAkdCcuCisKK1R1ZSBGZWIgMjMgMTE6MjE6MzMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGR3YXJmcmVhZC5jIChyZWFkX3RhZ19zdHJpbmdfdHlwZSk6ICBSZXdyaXRlIHRvIGFsbG93IGZvcndhcmQKKwlyZWZlcmVuY2VzIG9mIFRBR19zdHJpbmdfdHlwZSBESUVzIGluIHVzZXIgZGVmaW5lZCB0eXBlcy4KKwkqIGNoLWxhbmcuYyAoY2hpbGxfY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGUpOiAgVHJhY2sgY29tcGlsZXIKKwljaGFuZ2UgdGhhdCBub3cgZW1pdHMgZGVidWdnaW5nIGluZm8gd2l0aCB0aGUgdHlwZSBsb25nIGZvciBDaGlsbAorCWxvbmdzLgorCitNb24gRmViIDIyIDE1OjIxOjU0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLW1pcHMuYzogTmV3IGZpbGU7IGltcGxlbWVudHMgTUlQUyByZW1vdGUgZGVidWdnaW5nCisJcHJvdG9jb2wuCisJKiBjb25maWcvaWR0Lm10OiBOZXcgZmlsZTsgdXNlcyByZW1vdGUtbWlwcy5jCisJKiBjb25maWd1cmUuaW4gKG1pcHMtaWR0LWVjb2ZmKTogTmV3IHRhcmdldDsgdXNlcyBpZHQubXQuCisKKwkqIG1pcHMtdGRlcC5jIChtaXBzX2ZwdSk6IE5ldyB2YXJpYWJsZTsgY29udHJvbHMgdXNlIG9mIE1JUFMKKwlmbG9hdGluZyBwb2ludCBjb3Byb2Nlc3Nvci4KKwkobWlwc19wdXNoX2R1bW15X2ZyYW1lKTogSWYgbm90IG1pcHNfZnB1LCBkb24ndCBzYXZlIGZsb2F0aW5nCisJcG9pbnQgcmVnaXN0ZXJzLgorCShtaXBzX3BvcF9mcmFtZSk6IElmIG5vdCBtaXBzX2ZwdSwgZG9uJ3QgcmVzdG9yZSBmbG9hdGluZyBwb2ludAorCXJlZ2lzdGVycy4KKwkoX2luaXRpYWxpemVfbWlwc190ZGVwKTogTmV3IGZ1bmN0aW9uOyBsZXQgdGhlIHVzZXIgcmVzZXQgbWlwc19mcHUKKwl2YXJpYWJsZS4KKwkqIHRtLW1pcHMuaCAoRVhUUkFDVF9SRVRVUk5fVkFMVUUsIFNUT1JFX1JFVFVSTl9WQUxVRSk6IElmIG5vdAorCW1pcHNfZnB1LCBkb24ndCB1c2UgZnAwIGFzIGZsb2F0aW5nIHBvaW50IHJldHVybiByZWdpc3Rlci4KKwkoRklYX0NBTExfRFVNTVkpOiBJZiBub3QgbWlwc19mcHUsIGRvbid0IHNhdmUgZmxvYXRpbmcgcG9pbnQKKwlyZWdpc3RlcnMuCisKK01vbiBGZWIgMjIgMDc6NTQ6MDMgMTk5MyAgTWlrZSBXZXJuZXIgIChtdHdAcG9zZWlkb24uY3lnbnVzLmNvbSkKKworICAgICAgICAqIGdkYi90ZXN0c3VpdGU6IG1hZGUgbW9kaWZpY2F0aW9ucyB0byB0ZXN0Y2FzZXMsIGV0Yy4sIHRvIGFsbG93CisgICAgICAgIHRoZW0gdG8gd29yayBwcm9wZXJseSAgZ2l2ZW4gdGhlIHJlb3JnYW5pemF0aW9uIG9mIGRlamEtZ251IGFuZCB0aGUKKyAgICAgICAgcmVsb2NhdGlvbiBvZiB0aGUgdGVzdGNhc2VzIGZyb20gZGVqYS1nbnUgdG8gYSAidG9vbCIgc3ViZGlyZWN0b3J5LgorCitTdW4gRmViIDIxIDEwOjU1OjU1IDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIGdkYi90ZXN0c3VpdGU6IEluaXRpYWwgY3JlYXRpb24gb2YgZ2RiL3Rlc3RzdWl0ZS4KKwlNaWdyYXRlZCBkZWphZ251IHRlc3RjYXNlcyBhbmQgc3VwcG9ydCBmaWxlcyBmb3IgdGVzdGluZyBubSB0bworCWdkYi90ZXN0c3VpdGUgZnJvbSBkZWphLWdudS4gIFRoZXNlIGZpbGVzIHdlcmUgbW92ZWQgImFzIGlzIgorCXdpdGggbm8gbW9kaWZpY2F0aW9ucy4JVGhpcyBtaWdyYXRpb24gaXMgcGFydCBvZiBhIG1ham9yIG92ZXJoYXVsCisJb2YgZGVqYWdudS4gIFRoZSBtb2RpZmljYXRpb25zIHRvIHRoZXNlIHRlc3RjYXNlcywgZXRjLiwgd2hpY2gKKwl3aWxsIGFsbG93IHRoZW0gdG8gd29yayB3aXRoIHRoZSBuZXcgdmVyc2lvbiBvZiBkZWphZ251IHdpbGwgYmUKKwltYWRlIGluIGEgZnV0dXJlIHVwZGF0ZS4KKworRnJpIEZlYiAxOSAxODozNjo1NSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogTkVXUzogIEFkZCByZW1pbmRlcnMgZm9yIG5leHQgcmVsZWFzZS4KKworRnJpIEZlYiAxOSAxMDowMTozOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIG1pcHNyZWFkLmMgKHBhcnNlX2xpbmVzKTogQ29ycmVjdCBjaGVjayBmb3IgZmlsZXMgY29tcGlsZWQgd2l0aAorCS1nMS4KKworRnJpIEZlYiAxOSAwNTo1NjoxNSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiAgNC44LjEgdG8gZGlzdGluZ3Vpc2ggbG9jYWwgdmVyc2lvbnMuCisKK0ZyaSBGZWIgMTkgMDE6MzI6NTggMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIEdEQi00LjggcmVsZWFzZSEKKwkqIFJFQURNRSwgTkVXUzogIFVwZGF0ZSBmb3IgcmVsZWFzZS4KKworVGh1IEZlYiAxOCAyMjo0NDo0MCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBhbTI5ay1waW5zbi5jIChwcmludF9pbnNuKTogIE1pbm9yIG5pdHMgd2l0aCBjb25zdC4KKwkqIGFtMjlrLXRkZXAuYzogIE1vcmUgbWlub3Igbml0cyB3aXRoIGFyZyB0eXBlcyBmb3IKKwlzdXBwbHlfcmVnaXN0ZXIsIE5VTEwgdnMuIDAsIHJlYWRfcmVnaXN0ZXJfZ2VuLCAmIHJlZ2ludl9jb20uCisKK1RodSBGZWIgMTggMjI6Mzg6MDMgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGdjYy5wYXRjaDogIFVwZGF0ZSBmb3IgYSBkaWZmZXJlbnQgR0NDIChHKyspIGJ1Zy4KKwkqIG1haW4uYyAocHJpbnRfZ2RiX3ZlcnNpb24pOiAgVXBkYXRlIGNvcHlyaWdodCB5ZWFyIHRvIDE5OTMuCisJKiBubS1ocDMwMGJzZC5oOiAgRGVjaWRlIHdoZXRoZXIgdGhpcyBpcyBCU0QgNC4zIG9yIDQuNCwKKwljb25kaXRpb25hbGl6ZSB0aGlzIGZpbGUgb24gaXQuICBGSVhNRSwgcmlnaHQgd2F5IGlzIHRvIHNwbGl0CisJdGhlc2UgaW50byB0d28gY29uZmlnIGZpbGVzLiAgCisJKEFUVEFDSF9ERVRBQ0gpOiAgRGVmaW5lIGZvciBCU0QgNC40CisJKFBUUkFDRV9BUkdfVFlQRSk6ICBjYWRkcl90IGZvciBCU0QgNC40LCB1bnNldCBmb3IgNC4zLgorCShVX1JFR1NfT0ZGU0VUKTogIFJldmlzZSBmb3IgNC40LgorCShSRUdJU1RFUl9VX0FERFIpOiAgU2VwYXJhdGUgZm9yIDQuNCwgYnV0IGl0IGRvZXNuJ3Qgd29yayB5ZXQuCisJKiB4bS1ocDMwMGJzZC5oOiAgTW92ZSBkZWZpbml0aW9ucyBvZiBVSU5UX01BWCwgSU5UX01BWCwgSU5UX01JTiwKKwlMT05HX01BWCBpbnRvIHRoaXMgZmlsZSB0byBhdm9pZCBjcHAgInJlZGVmaW5pdGlvbiIgd2FybmluZ3MuCisKK1RodSBGZWIgMTggMTY6MTM6MjggMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQorCisJKiBubS1ocDMwMGJzZC5oIChQVFJBQ0VfQVJHM19UWVBFKTogRlNGJ3MgaHAzMDAncyBoYXZlIGludCogbm90CisJICBjYWRkcl90LgorCitUaHUgRmViIDE4IDA0OjEwOjA2IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBjLWxhbmcuYyAoY19wcmludHN0cik6ICBCdWdmaXggZm9yIGxlbmd0aD09MCBjYXNlLgorCisJKiBjLWxhbmcuYyAoY19wcmludHN0cik6ICBJZiBhIEMgc3RyaW5nIGVuZHMgaW4gYSBudWxsLCBkb24ndAorCXByaW50IHRoZSBudWxsLgorCitUaHUgRmViIDE4IDAyOjM5OjIxIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGRlZnMuaCAoU1RSQ01QKTogIE1ha2UgaXQgd29yayBmb3IgdW5zaWduZWQgY2hhcnMuCisKK1RodSBGZWIgMTggMDE6NTY6MDYgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIG5tLWhwMzAwYnNkLmggKEFUVEFDSF9ERVRBQ0gsIFBUUkFDRV9BVFRBQ0gsIFBUUkFDRV9ERVRBQ0gpOiBkZWZpbmUuCisJKiBjb25maWcvaHAzMDBic2QubWggKFJFR0VYLCBSRUdFWDEpOiAgRGVmaW5lLgorCSogbTY4ay1waW5zbi5jIChCUkVBS19VUF9CSUdfREVDTCwgQU5EX09USEVSX1BBUlQpOiAgI2lmIF9fR05VQ19fLAorCWRlZmluZSB0byBrbHVkZ2UgdGhlIGxhcmdlIG9wY29kZSB0YWJsZSBpbnRvIHR3byBzbWFsbGVyIHRhYmxlcywKKwlzaW5jZSBHQ0MgdGFrZSBleHBvbmVudGlhbCBzcGFjZSB0byBidWlsZCB0aGUgdGFibGUuICBMaW50LgorCShOT1BDT0RFUyk6ICBSZW1vdmUsIHVzZSAibnVtb3Bjb2RlcyIgZnJvbSBvcGNvZGUvbTY4ay5oIGluc3RlYWQuCisKK1dlZCBGZWIgMTcgMTk6MjQ6NDAgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIFJvbGwgdG8gNC43LjkuCisJKiB4bS1ocDMwMGJzZC5oOiAgRGVmaW5lIFBTSUdOQUxfSU5fU0lHTkFMX0ggYW5kIHB1dCBhIGNvbXBhdGlibGUKKwlkZWZpbml0aW9uIGhlcmUsIHRvIGhhbmRsZSBib3RoIEJTRCA0LjMgYW5kIDQuNCBzeXN0ZW1zLgorCSogbWlwc3JlYWQuYyAoWk1BR0lDKTogICN1bmRlZiB0byBhdm9pZCBkdXBsaWNhdGUgZGVmaW5lLgorCSogcmVtb3RlLmMgKGFsYXJtKTogIE1vdmUgZGVjbGFyYXRpb24gdG8gZ2xvYmFsIGxldmVsLCBiZWZvcmUgCisJZmlyc3QgcmVmZXJlbmNlIHRvIGl0LgorCSogdG0taTM4NmJzZC5oIChOVU1fUkVHUyk6ICBUaGVyZSBhcmUgb25seSBlbGV2ZW4sIG5vdCB0d2VsdmUuCisJKiBkYnhyZWFkLmMgKHByb2Nlc3Nfb25lX3N5bWJvbCk6ICBDYXN0IHRvIHVuc2lnbmVkIGNoYXIsIG5vdCBpbnQuCisKK1dlZCBGZWIgMTcgMTM6NDA6MjkgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIHJlbW90ZS5jIChyZWFkY2hhcik6IGZvcndhcmQgZGVjbGFyZSBhbGFybSB3aGljaCBvdGhlcndpc2UgbG9va3MKKwkgIGxpa2UgYW4gdW5kZWNsYXJlZCB2YXJpYWJsZSB0byBnY2MuCisKKwkqIGRieHJlYWQuYyAocHJvY2Vzc19vbmVfc3ltYm9sKTogY2FzdCBlbnVtIHZhbHVlIE5fU08gaW50byBpbnQKKwkgIHdoZW4gY29tcGFyaW5nIGFnYWluc3QgYW4gaW50LiAgQXZvaWRzIHN1cGVyZmx1b3VzIHdhcm5pbmcgZnJvbQorCSAgdmF4IHVsdHJpeCA0LjIgY2MuCisKKwkqIGluZmxvdy5jIChzZXRfc2lnaW50X3RyYXApOiBhZGQgY2FzdCB0byBhc3NpZ25tZW50IGZyb20gc2lnbmFsLgorCSAgQXZvaWRzIHN1cGVyZmx1b3VzIHdhcm5pbmdzIGZyb20gc29tZSBzeXN0ZW1zIGFuZC9vciBjb21waWxlcnMKKwkgIChsaWtlIHZheCB1bHRyaXggNC4yLikKKworCSogbGFuZ3VhZ2UuYyAoc3RydWN0IG9wX3ByaW50IHVua19vcF9wcmludF90YWIpOiB1c2UgdGhlIGVudW0KKwkgIHZhbHVlcyByYXRoZXIgbmFrZWQgemVyb3MgYXMgaW5pdGlhbGl6ZXJzLiAgQXZvaWRzIHdhcm5pbmdzIGZyb20KKwkgIHVsdHJpeCB0eXBlIGNvbXBpbGVycy4KKworVHVlIEZlYiAxNiAwMDo1MzoyMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiAgUm9sbCB0byA0LjcuNi4KKwkoU0ZJTEVTX1NVQkRJUik6ICBBZGQgMjlrLXNoYXJlL3VkaV9zb2MuCisJKFNGSUxFU19TVUJTVUJESVIpOiAgTW92ZSAyOWstc2hhcmUvdWRpIGZpbGVzIHRvIHRoaXMgbWFjcm8uCisJKGFsbGRlcHMubWFrKTogIE1ha2UgQUxMREVQRklMRVNfU1VCU1VCRElSIGZvciBmaWxlcyBpbiBzdWIgc3ViIGRpcnMuCisJKEFMTERFUEZJTEVTX1NVQlNVQkRJUik6ICBEZXBlbmQgb24gdGhpcyBmb3IgZGVlcGVyIGRlcCBmaWxlcy4KKwkoSEZJTEVTKTogIFJlbW92ZSBhbGwgbm0tKiBleGNlcHQgbm0tdHJhc2guaC4gIEFkZCBuczMyay1vcGNvZGUuaC4KKwkoZGVwZW5kKTogIEZpeCBidWcgd2hlcmUgbm0tZmlsZXMgaW4gY29uZmlnIGZpbGVzIHdlcmVuJ3Qgbm90aWNlZC4KKwkobWFrZS1wcm90by1nZGItMSk6ICBBdm9pZCBjaGFuZ2luZyBkaXJlY3RvcmllcyB3aGlsZSBidWlsZGluZyBuZXcKKwlwcm90b3R5cGUuICBCdWlsZCBTRklMRVNfU1VCU1VCRElSIHdpdGggbG9uZ2VyIHN5bWxpbmtzLgorCitNb24gRmViIDE1IDIwOjQ4OjA5IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiByZW1vdGUuYzogIEltcHJvdmUgZXJyb3IgcmVjb3ZlcnkuICBBbGxvdyB1c2VyIHRvIGJyZWFrIG91dAorCW9mIGluaXRpYWwgY29ubmVjdGlvbiBhdHRlbXB0IHdpdGggSU5URVJSVVBULiAgVHJlYXQgYSB0aW1lb3V0CisJd2hpbGUgd2FpdGluZyBmb3IgcmVtb3RlIHBhY2tldCBsaWtlIGEgcmV0cnksIHVubGVzcyB0aGUgcmVtb3RlCisJc2lkZSBpcyBhY3RpdmVseSBydW5uaW5nIHVzZXIgY29kZS4gIEZpeCBhIGZldyBsb25nIHByaW50Zl9maWx0ZXJlZCdzLgorCisJKiB4Y29mZnJlYWQuYyAocmVhZF94Y29mZl9zeW10YWIpOiAgRG9uJ3QgdXNlIG51bGwgc3ltYm9sIG5hbWUgZm9yCisJdHJhbXBvbGluZSBzeW1ib2xzLgorCisJKiBidWlsZHN5bS5jIChzdGFydF9zdWJmaWxlKTogIEFsbG93IG51bGwgZmlsZSBuYW1lLgorCitGcmkgRmViIDEyIDE1OjQ2OjQ5IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiB4Y29mZnJlYWQuYyAocHJvY2Vzc194Y29mZl9zeW1ib2wsIHJlYWRfc3ltYm9sX2xpbmVubyk6IGNvbXBsYWluCisJICBleHBlY3RzIGEgcG9pbnRlciB0byBjb21wbGFpbnQgcmF0aGVyIHRoYW4gYSBjb21wbGFpbnQKKwkgIHN0cnVjdHVyZS4KKwkgIChwcm9jZXNzX2xpbmVub3MpOiBmcmVlIHRoZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBzdWJmaWxlIG5hbWUsCisJICB0aGVuIGFsbG9jYXRlIHRoZSBuZXcgb25lIGZyb20gdGhlIGhlYXAuCisKK0ZyaSBGZWIgMTIgMDg6MDY6MDUgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGg4MzAwLXRkZXAuYywgdG0taDgzMDAuaDogdHVybiBvZmYgc29tZSBleHBlcmltZW50YWwgZmVhdHVyZXMKKworVGh1IEZlYiAxMSAwMDo1OTowNyAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogc3RhYnNyZWFkLmMgKGRieF9sb29rdXBfdHlwZSk6ICBIYW5kbGUgbmVnYXRpdmUgdHlwZSBudW1iZXJzLgorCVByZXZpb3VzbHksIHdvdWxkIGJvZ3VzbHkgaW5kZXggb2ZmIHRoZSBib3R0b20gb2YgdHlwZV92ZWN0b3IuCisJKHJzNjAwMF9idWlsdGluX3R5cGUpOiAgQWNjZXB0IHR5cGUgbnVtYmVyIGFzIGFyZ3VtZW50LgorCShyZWFkX3R5cGUsIGNhc2UgJy0nKTogIEhhbmRsZSBuZWdhdGl2ZXMgbGlrZSBhbnkgb3RoZXIgdHlwZSBudW1iZXIuCisKKwkqIHN5bWZpbGUuYyAoZGVkdWNlX2xhbmd1YWdlX2Zyb21fZmlsZW5hbWUpOiAgSGFuZGxlIG51bGwgbmFtZS4KKworCSogbWlwcy10ZGVwLmMgKGlzYV9OQU4pOiAgRml4IGJ5dGUgb3JkZXIgZGVwZW5kZW5jeS4KKwlSZXBvcnRlZCBieSBOb2J1eXVraSBIaWtpY2hpIDxoaWtpY2hpQHNyYS5jby5qcD4sCisJZml4ZWQgYnkgc2F0b0BzbS5zb255LmNvLmpwLgorCisJKiB4Y29mZnJlYWQuYyAocGFybXN5bSk6ICBEb24ndCB1c2UgYW4gaW5pdGlhbGl6ZXIgdG8gc2V0IHVwCisJdGhpcyBzdHJ1Y3Qgc3ltYm9sLiAgU2V0IGl0IHVwIGluIGluaXRpYWxpemVfeGNvZmZyZWFkLgorCShyZWFkX3hjb2ZmX3N5bXRhYiwgeGNvZmZfc3ltZmlsZV9yZWFkKTogIFN1cnJvdW5kIGNvZGUgdGhhdCBvbmx5CisJd29ya3Mgb24gcmVhbCBycy82MDAwIHRhcmdldCB3aXRoICNpZm5kZWYgRkFLSU5HX1JTNjAwMC4KKworV2VkIEZlYiAxMCAyMzo0MjozNyAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogc3RhYnNyZWFkLmMgKHJzNjAwMF9idWlsdGluX3R5cGUpOiAgTW92ZSBmdW5jdGlvbiBmcm9tCisJeGNvZmZyZWFkLmM6YnVpbHRpbl90eXBlLgorCSogeGNvZmZyZWFkLmMgKGJ1aWx0aW5fdHlwZSk6ICBNb3ZlIHRvIHN0YWJzcmVhZC4gIFJlbW92ZQorCUlCTTYwMDBfSE9TVCBkZXBlbmRlbmN5LiAgTW92ZSBtaXNwbGFjZWQgY29tbWVudHMuCisJKHZhcmlvdXMpOiAgQ2hhbmdlIHByaW50ZidzIHRvIGNvbXBsYWludHMuCisJKHBhdGNoX2Jsb2NrX3N0YWJzLCBwcm9jZXNzX3hjb2ZmX3N5bWJvbCBjYXNlIENfREVDTCk6ICBBZGQKKwlvYmpmaWxlIGFyZ3VtZW50IHRvIHJlYWRfdHlwZSBjYWxscyB1bmRlciAjaWYgMC4KKwkocHJvY2Vzc194Y29mZl9zeW1ib2wgY2FzZSBDX1JTWU0pOiAgRml4IHR5cG8gaW4gI2lmZGVmLgorCSogeGNvZmZleGVjLmMgKG1hcF92bWFwKTogIERvbid0IGFsbG9jYXRlIGFuIG9iamZpbGUgZm9yIHRoZSBleGVjX2ZpbGUuCisJKiBNYWtlZmlsZS5pbjogIHhjb2ZmcmVhZC5vIGlzIG5vdCBidWlsdCBieSBkZWZhdWx0LgorCSogeG0tcnM2MDAwLmggKElCTTYwMDBfSE9TVCk6ICBSZW1vdmUuCisJKiBjb25maWcvcnM2MDAwLm1oIChOQVRERVBGSUxFUyk6IHhjb2ZmcmVhZC5vIGlzIG5hdGl2ZSBvbmx5LgorCSogZG9jL2dkYmludC50ZXhpbmZvOiAgRWxpbWluYXRlIElCTTYwMDBfSE9TVCwgZG9jdW1lbnQKKwlJQk02MDAwX1RBUkdFVC4KKworV2VkIEZlYiAxMCAxODozMToyMCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBmaW5kdmFyLmMgKHJlYWRfdmFyX3ZhbHVlKTogIElmIFJFR19TVFJVQ1RfSEFTX0FERFIsIHRoZW4gc2V0CisJVkFMVUVfTFZBTCB0byBiZSBsdmFsX21lbW9yeSBzbyB0aGF0IHdlIGRvbid0IHRyeSB0byBtb2RpZnkgd2lsZAorCXJlZ2lzdGVyIG51bWJlcnMgd2hlbiB1c2VyIHRyaWVzIHRvIG1vZGlmeSBlbGVtZW50cyBpbiBzdHJ1Y3RzCisJcGFzc2VkIGFzIGFyZ3VtZW50cy4KKwkqIGluZmxvdy5jIChjaGlsZF90ZXJtaW5hbF9pbmZvKTogIE1vdmUgYmFubmVyIG91dHNpZGUgb2Ygc3lzdGVtCisJc3BlY2lmaWMgI2lmZGVmcy4KKwkqIHRtLWhwcGEuaCAoUkVHX1NUUlVDVF9IQVNfQUREUik6ICBEZWZpbmUgdGhpcyBmb3IgSFBQQSwgd2hpY2gKKwlwYXNzZXMgc3RydWN0L3VuaW9uIGFyZ3VtZW50cyBieSBhZGRyZXNzLgorCitXZWQgRmViIDEwIDE1OjM0OjQ2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogQmFzZWQgb24gcGF0Y2ggZnJvbSBLZWFuIEpvaG5zdG9uIDxtYXdAbmV0Y29tLmNvbT46CisJKiBubS1pMzg2c2NvNC5oOiBOZXcgZmlsZS4gIExpa2Ugbm0taTM4NnNjby5oLCBidXQgZGVmaW5lCisJQVRUQUNIX0RFVEFDSCwgUFRSQUNFX0FUVEFDSCBhbmQgUFRSQUNFX0RFVEFDSC4KKwkqIGNvbmZpZy9pMzg2c2NvNC5taCAoTkFUX0ZJTEUpOiBVc2Ugbm0taTM4NnNjbzQuaC4KKworVHVlIEZlYiAgOSAyMDowNzoxOCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXVkaS5jIChGUkVFWkVfTU9ERSk6ICBGaXggJiYgZm9yICYgdHlwby4gIEZvdW5kIGFuZAorCWZpeGVkIGJ5IEx5bm4gRC4gU2h1bWFrZXIsIHNodW1ha2VyQHNhaWZyMDAuY2ZzYXQuaG9uZXl3ZWxsLmNvbS4KKworVHVlIEZlYiAgOSAwODoxODowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9pMzg2c2NvNC5taCAoTVVOQ0hfREVGSU5FKTogUGFzcyAtcCB0byBubSB0byBhdm9pZCBidWcgaW4KKwljYyBkZWJ1Z2dpbmcgb3V0cHV0LgorCitUdWUgRmViICA5IDAwOjE5OjI4IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBzdGFic3JlYWQuYyAoZGVmaW5lX3N5bWJvbCk6ICBDb21wbGFpbiBhYm91dCB1bnJlY29nbml6ZWQgbmFtZXMKKwl0aGF0IGJlZ2luIHdpdGggQ1BMVVNfTUFSS0VSIChvZnRlbiAnJCcpLCBidXQgZG9uJ3QgZGllLiAgRml4CisJc3VnZ2VzdGVkIGJ5IGdiQGNzLnB1cmR1ZS5lZHUgKEdlcmFsZCBCYXVtZ2FydG5lcikuCisJKHJlYWRfY3BwX2FiYnJldik6ICBEb24ndCB1c2UgdGhlIGNsYXNzIG5hbWUgYXMgcGFydCBvZiB0aGUKKwl2dGFibGUgcG9pbnRlciBtZW1iZXIgbmFtZSAoX3ZwdHIkKSBpbiAkdmYgYWJicmV2cyBvciB1bnJlY29nbml6ZWQKKwlhYmJyZXZzLiAgSW5zcGlyZWQgYnkgTWlrZSBUaWVtYW5uLgorCShyZWFkX3RpbGRlX2ZpZWxkcyk6ICBDb21tZW50LiAgUmVtb3ZlIGFuY2llbnQgZGVhZCBjb2RlLgorCVJlbW92ZSBlcnJvbmVvdXMgYnV0IG5vbi1kZWFkIGNvZGUuICBTaW1wbGlmeS4gIEFkZCBjb21wbGFpbnRzLgorCShpbiBnZW5lcmFsKTogIFJlbW92ZSBleHRyYW5lb3VzIChwYXJlbnRoZXNlcykgaW4gcmV0dXJuCisJc3RhdGVtZW50cy4KKworRnJpIEZlYiAgNSAxNDowMToyMiAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogY29mZnJlYWQuYyAoY29mZl9sb29rdXBfdHlwZSk6ICBGaXggZmVuY2Vwb3N0IGVycm9yIHJlcG9ydGVkCisJYnkgQXJ0IEJlcmdncmVlbiwgPGFyZ0BvcGFsLmFjYy5jb20+LgorCisJRml4IGxvbmcgZmlsZSBuYW1lIGJ1ZyByZXBvcnRlZCBvbiBTQ08gT3BlbiBEZXNrdG9wIDIuMCBieSBVbGYgTHVuZGUKKwk8VWxmLkx1bmRlQGt2YXRyby5ubz4gYW5kIERhZyBILiBXYW52aWsgPERhZy5ILldhbnZpa0BrdmF0cm8ubm8+OgorCSAgCisJKiBjb2ZmcmVhZC5jIChnZXRmaWxlbmFtZSk6ICBFbGltaW5hdGUgQ09GRl9OT19MT05HX0ZJTEVfTkFNRVMKKwl0ZXN0LCB3aGljaCBpcyBhcHBhcmVudGx5IGxlZnQgb3ZlciBmcm9tIHdoZW4gd2UgdXNlZCBuYXRpdmUKKwlpbmNsdWRlIGZpbGVzIGFuZCBjb3VsZG4ndCBkZXBlbmQgb24gdGhlIG1lbWJlciBuYW1lcyBiZWluZyB0aGVyZS4KKwkqIHRtLTNiMS5oLCB0bS1hbHRvcy5oLCB0bS1pMzg2di5oOiAgRG9uJ3Qgc2V0IGl0LgorCitUaHUgRmViICA0IDEyOjIzOjE1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbWlwc3JlYWQuYzogTWFqb3Igb3ZlcmhhdWwgdG8gdXNlIG5ldyBCRkQgc3ltYm9sIHRhYmxlIHJlYWRpbmcKKwlyb3V0aW5lcy4gIE5vdyBzd2FwcyBpbmZvcm1hdGlvbiBhcyBpdCBpcyBuZWVkZWQsIHJhdGhlciB0aGFuCisJc3dhcHBpbmcgZXZlcnl0aGluZyB3aGVuIHRoZSBmaWxlIGlzIHJlYWQuCisKK1RodSBGZWIgIDQgMDE6NTI6MzYgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChUQVJESVJTKTogIEFkZCBzcGFyY2xpdGUgZGVtbyBkaXIuCisJKCoudGFiLmMpOiAgQ2hhbmdlIGRlcGVuZGVuY3kgb24gTWFrZWZpbGUgdG8gZGVwZW5kIG9uCisJTWFrZWZpbGUuaW4sIG90aGVyd2lzZSBpdCBhbHdheXMgcmVidWlsZHMgYWZ0ZXIgY29uZmlndXJpbmcuCisJRm9yY2Ugb3V0cHV0ICoudGFiLmMgZmlsZSBpbnRvIGN1cnJlbnQgZGlyZWN0b3J5IGV2ZW4gaW4gIm1ha2UiCisJdmVyc2lvbnMgdGhhdCByZXdyaXRlIGRlcGVuZGVudCBmaWxlIG5hbWVzIHVzZWQgaW4gY29tbWFuZCBsaW5lcy4KKworCSogVE9ETzogIFJlbW92ZSBzb21lIHRoaW5ncyB3ZSBkaWQuCisJKiBhbTI5ay1vcGNvZGUuaCwgY29udngtb3Bjb2RlOiAgUmVtb3ZlOyBub3cgaW4gLi4vaW5jbHVkZS9vcGNvZGUuCisJKiBvczY4ay14ZGVwLmM6ICBSZW1vdmU7IHVzZWxlc3MgZmlsZSAob3M2OGsgaXMgYSB0YXJnZXQgb25seSkuCisJKiBjb252ZXgtcGluc24uYzogIFVzZSAuLi9pbmNsdWRlL29wY29kZS9jb252ZXguaC4gIEFkZCBDT05TVC4KKwkqIHN5bXRhYi5oOiAgRWxpbWluYXRlIHVubmFtZWQgdW5pb25zIGFuZCBzdHJ1Y3RzLgorCitXZWQgRmViICAzIDE0OjQ4OjA4IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6ICBSb2xsIHRvIDQuNy41LgorCitUdWUgRmViICAyIDIwOjQ3OjQyIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBicmVha3BvaW50LmMgKGJyZWFrcG9pbnRfcmVfc2V0X29uZSk6ICBIYW5kbGUgd2F0Y2hwb2ludHMgd2hlbgorCXJlLWV2YWx1YXRpbmcgc3ltYm9sIHBvaW50ZXJzLgorCitUdWUgRmViICAyIDE2OjEwOjMxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjLWV4cC55IChsY3VybHksIHJjdXJseSk6ICBOZXcgbm9udGVybWluYWxzLgorCSogYy1leHAueSAoZXhwKTogIFVzZSBsY3VybHkgYW5kIHJjdXJseSBmb3IgYXJyYXlzIGFuZCBVTk9QX01FTVZBTAorCWNvbnN0cnVjdHMuCisJKiBwYXJzZS5jIChmcmVlX2Z1bmNhbGxzKTogIE1vdmVkIHByb3RvdHlwZSBmcm9tIHBhcnNlci1kZWZzLmgsCisJbWFkZSBmdW5jdGlvbiBzdGF0aWMuCisJKiBwYXJzZS5jIChzdHJ1Y3QgZnVuY2FsbCk6ICBNb3ZlZCBzdHJ1Y3QgZGVmIGZyb20gcGFyc2VyLWRlZnMuaC4KKwkqIHBhcnNlLmMgKGZ1bmNhbGxfY2hhaW4pOiAgTW92ZWQgZnJvbSBwYXJzZXItZGVmcy5oLCBtYWRlIHN0YXRpYy4KKwkqIHBhcnNlLmMgKHN0YXJ0X2FyZ2xpc3QpOiAgCisJKiBwYXJzZXItZGVmcy5oIChmcmVlX2Z1bmNhbGxzKTogIE1vdmVkIHByb3RvdHlwZSB0byBwYXJzZS5jLgorCSogcGFyc2VyLWRlZnMuaCAoc3RydWN0IGZ1bmNhbGwpOiAgTW92ZWQgc3RydWN0IGRlZiB0byBwYXJzZS5jLgorCSogcGFyc2VyLWRlZnMuaCAoZnVuY2FsbF9jaGFpbik6ICBNb3ZlZCB0byBwYXJzZS5jLgorCSogcHJpbnRjbWQuYyAocHJpbnRfZnJhbWVfbmFtZWxlc3NfYXJncyk6IEZpeCBwcm90b3R5cGUuCisJKiB0bS1taXBzLmggKHNldHVwX2FyYml0cmFyeV9mcmFtZSk6ICBGaXggcHJvdG90eXBlLgorCSogdG0tc3BhcmMuaCAoc2V0dXBfYXJiaXRyYXJ5X2ZyYW1lKTogIEZpeCBwcm90b3R5cGUuCisJKiB2YWxvcHMuYyAodHlwZWNtcCk6ICBNb3ZlZCBwcm90b3R5cGUgZnJvbSB2YWx1ZXMuaC4KKwkqIHZhbHVlLmggKHR5cGVjbXApOiAgTW92ZWQgcHJvdG90eXBlIHRvIHZhbG9wcy5jLCBtYWRlIHN0YXRpYy4KKwkqIGNoLWV4cC55ICh5eWxleCk6ICBDaGFuZ2Ugd2F5IGNvbnRyb2wgc2VxdWVuY2VzIGFyZSBkaXNhYmxlZC4KKwkKK1R1ZSBGZWIgIDIgMTY6MTE6NDMgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIHRtLW1pcHMuaCwgdG0tc3BhcmMuaDogIEZpeCB0aGlua28gaW4gU0VUVVBfQVJCSVRSQVJZX0ZSQU1FLgorCitUdWUgRmViICAyIDE1OjMwOjMzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbWlwc3JlYWQuYyAodXBncmFkZV90eXBlKTogQnVpbGQgYXJyYXkgdHlwZXMgY29ycmVjdGx5LCB1c2luZworCWNyZWF0ZV9yYW5nZV90eXBlIGFuZCBjcmVhdGVfYXJyYXlfdHlwZS4KKworVHVlIEZlYiAgMiAwMDoxOTowOCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLW5pbmR5LmM6ICBDbGVhbnVwLgorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiAgV2hlbiByb2xsaW5nIGJhY2sgdGhlIFBDIGFmdGVyCisJYSBicmVha3BvaW50LCBjYWxsIHdyaXRlX3BjIHNvIHRoYXQgTlBDIGdldHMgcm9sbGVkIGJhY2sgYXMgd2VsbAorCShmb3IgdGhlIDI5SykuCisKKwkqIGJsb2NrZnJhbWUuYyAoaW5zaWRlX2VudHJ5X2ZpbGUsIGluc2lkZV9tYWluX2Z1bmMsCisJaW5zaWRlX2VudHJ5X2Z1bmMpOiAgUEMgb2YgemVybyBpcyBhbHdheXMgImJvdHRvbSBvZiBzdGFjayIuCisKKwkqIHByaW50Y21kLmMgKHByaW50X2ZyYW1lX2FyZ3MsIHByaW50X2ZyYW1lX25hbWVsZXNzX2FyZ3MpOgorCUxldCBwcmludF9mcmFtZV9uYW1lbGVzc19hcmdzIGRlY2lkZSB3aGV0aGVyIHRoZXJlIGFyZSBhbnksCisJbGF5aW5nIGdyb3VuZHdvcmsgZm9yIHBvc3NpYmx5IGxhdGVyIHByaW50aW5nIDI5SyBhcmdzIGZvcgorCWZ1bmN0aW9ucyB3aGVyZSB3ZSBoYXZlIHRhZyB3b3JkcyBidXQgbm8gc3ltYm9scy4JCisKK01vbiBGZWIgIDEgMTg6MDk6NTggMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGZpeCBHREIgZG9jIHRhcmdldHMgZm9yIG5ldyBkb2Mgc3ViZGlyIHN0cnVjdHVyZQorCitNb24gRmViICAxIDE3OjU2OjQ3IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBzdGFjay5jIChwYXJzZV9mcmFtZV9zcGVjaWZpY2F0aW9uKTogIFBhcnNlIGFzIG1hbnkgYXJndW1lbnRzCisJYXMgdGhlcmUgYXJlICh1cCB0byBNQVhBUkdTKS4gIFBhc3MgYWxsIG9mIHRoZW0gaW4gYXJnYywgYXJndgorCWZvcm1hdCB0byBTRVRVUF9BUkJJVFJBUllfRlJBTUUuICBQdXQgdGhlIGJ1cmRlbiBvZiBjaGVja2luZyBob3cKKwltYW55IHRoZXJlIHdlcmUsIG9udG8gU0VUVVBfQVJCSVRSQVJZX0ZSQU1FLgorCSogdG0tbWlwcy5oLCB0bS1zcGFyYy5oOiAgQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgorCSogbWlwcy10ZGVwLmMsIHNwYXJjLXRkZXAuYzogIERpdHRvLgorCitNb24gRmViICAxIDE3OjE5OjM3IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBocDMwMHV4LW5hdC5jOiAgVXBkYXRlIGNvcHlyaWdodHMuCisJKiBtaXBzcmVhZC5jIChwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiAgQ29tcGxhaW4gYWJvdXQgYmxvY2sKKwlpbmRleGVzIHRoYXQgZ28gYmFja3dhcmRzLiAgRml4IGZyb20gUGV0ZXIgU2NoYXVlci4KKwkqIHN5bWZpbGUuYyAoc3ltc19mcm9tX29iamZpbGUsIHN5bWJvbF9maWxlX2FkZCk6ICBBbGxvdyBhCisJc3ltYm9sLWZpbGUgdGhhdCBoYXMgbm8gbGlua2FnZSBzeW1ib2xzIHRvIGJlIHJlYWQuCisJKiB0bS1yczYwMDAuaCwgeG0tcnM2MDAwLmg6IChTSUdXSU5DSF9IQU5ETEVSIGFuZCBmcmllbmRzKTogIE1vdmUKKwlmcm9tIHRtLSBmaWxlIHRvIHhtLWZpbGUsIHNpbmNlIHRoZXkncmUgaG9zdCBkZXBlbmRlbnQuCisJKiB2YWxhcml0aC5jICh2YWx1ZV9iaW5vcCk6ICBUeXBvLgorCitNb24gRmViICAxIDE2OjE2OjU5IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIHNwYXJjbGl0ZS9hbG9hZC5jOiAgQWRkIGNvcHlsZWZ0LgorCSogc3BhcmNsaXRlL2NydDAuczogIEFkZCBjb21tZW50IGF0IGJlZ2lubmluZy4KKworTW9uIEZlYiAgMSAxNDozNjoxMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXo4ay5jLCB6OGstdGRlcC5jOiBzdXBwb3J0IGZvciB0aGUgWjgwMDEgYW5kIFo4MDAyLgorCSogcGFyc2UuYyAoc3RkX3JlZ3MpOiBPbmx5IGRlY2xhcmUgaWYgTk9fU1REX1JFR1MgaXMgZGVmaW5lZC4KKworU3VuIEphbiAzMSAwNDozMjo0OCAxOTkzICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQHJ0bC5jeWdudXMuY29tKQorCisJKiB2YWx1ZXMuYyAodmFsdWVfaGVhZG9mKTogRml4IHR5cG8gaW4gd2hpY2ggVlRCTCBhbmQgQVJHIHdlcmUKKwliZWluZyBjb25mdXNlZCBmb3Igb25lIGFub3RoZXIuCisKKwkqIHZhbG9wcy5jICh0eXBlY21wKTogTm93IHN0YXRpYy4KKworCSogZ2RidHlwZXMuYyAoZmlsbF9pbl92cHRyX2ZpZWxkbm8pOiBEb24ndCBpZ25vcmUgdGhlIGZpcnN0CisJYmFzZWNsYXNzLS13ZSBkb24ndCBhbHdheXMgaW5oZXJpdCBpdHMgdmlydHVhbCBmdW5jdGlvbiB0YWJsZQorCXBvaW50ZXIuCisKKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKTogSW4gT1BfRlVOQ0FMTCBjYXNlLCBhZGp1c3QgYHRoaXMnCisJcG9pbnRlciBjb3JyZWN0bHkgaW4gY2FzZSB2YWx1ZV9zdHJ1Y3RfZWx0IG1vdmVzIGl0IGFyb3VuZC4KKworCSogdmFsb3BzLmMgKHR5cGVjbXApOiBOb3cgc3RhdGljLiAgQWxzbywgbm93IGdyb2tzIHJlZmVyZW5jZXMKKwliZXR0ZXIuCisKKwkqIGdkYnR5cGVzLmMgKGxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGUpOiBQYXNzIE5PRVJSIGluc3RlYWQgb2YKKwl6ZXJvIG9uIHJlY3Vyc2l2ZSBjYWxsLiAgSWYgTkFNRSBpcyB0aGUgbmFtZSBvZiBUWVBFLCByZXR1cm4gVFlQRS4KKworU2F0IEphbiAzMCAxOTo1NTo1MiAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogaHBwYWgtbmF0LmM6ICBFbGltaW5hdGUgPHN5cy91c2VyLmg+IGFuZCBvdGhlciB1bm5lY2Vzc2FyeSBzdHVmZiwKKwl0byBhdm9pZCAidG9vIG11Y2ggZGVmaW5pbmciIGVycm9yIGZyb20gbmF0aXZlIEMgY29tcGlsZXIgKCEpLgorCisJKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogIEFkZCB0eXBlcHJpbnQuaC4KKwkqIHR5cGVwcmludC5bY2hdOiAgVXBkYXRlIGNvcHlyaWdodHMuCisKK1RodSBKYW4gMjggMTk6MDk6MDIgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgVXBkYXRlIHRvIG1hdGNoIGRvYy8gc3ViZGlyIGNoYW5nZXMuCisKKwkqIGNvbmZpZy9ocDMwMGhwdXgubWg6ICBObyBjcm9zcy1ob3N0IGZpbGUgbmVlZGVkLCBqdXN0IG5hdGl2ZS4KKwkqIGNvbmZpZy9nbzMyLm1oOiAgUmVtb3ZlIG5vbmV4aXN0ZW50ICJuYXRpdmUiIHN1cHBvcnQuCisKKwlNODhLIGZpeGVzIHJlcG9ydGVkIGJ5IENhcmwgR3JlY28sIDxjZ3JlY29AQ3JlaWdodG9uLkVkdT46CisJKiB0bS1tODhrLmggKFJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXKTogIEZpeCB0eXBvLgorCSogbTg4ay10ZGVwLmMgKG5leHRfaW5zbik6ICBMaW50LCBjbGVhbnVwLgorCShzdG9yZV9wYXJtX3dvcmQpOiAgTGludC4KKworCSogUkVBRE1FOiAgRml4IHR5cG8gKHJlcG9ydGVkIGJ5IGthcmxAaHEuaWxlYWYuY29tKS4KKworV2VkIEphbiAyNyAyMTozNDoyMSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZXhwcmVzc2lvbi5oIChCSU5PUF9DT05DQVQpOiBEb2N1bWVudCB1c2UgZm9yIHNlbGYgY29uY2F0ZW5hdGlvbgorCWFuIGludGVncmFsIG51bWJlciBvZiB0aW1lcy4KKwkqIGxhbmd1YWdlLmMgKGJpbm9wX3R5cGVfY2hlY2spOiAgRXh0ZW5kIEJJTk9QX0NPTkNBVCBmb3Igc2VsZgorCWNvbmNhdGVuYXRpb24gY2FzZS4KKwkqIHZhbGFyaXRoLmMgKHZhbHVlX2NvbmNhdCk6ICBSZXdyaXRlIHRvIHN1cHBvcnQgc2VsZgorCWNvbmNhdGVuYXRpb24gYW4gaW50ZWdyYWwgbnVtYmVyIG9mIHRpbWVzLgorCSogTWFrZWZpbGUuaW4gKGNoLWV4cC50YWIuYyk6ICBDaGFuZ2UgImV4cGVjdCIgbWVzc2FnZS4KKwkqIGNoLWV4cC55IChGSVhNRSdzKTogIE1ha2UgYWxsIEZJWE1FIHRva2VucyBkaXN0aW5jdCwgdG8KKwllbGltaW5hdGUgaHVuZHJlZHMgb2Ygc3B1cmlvdXMgc2hpZnQvcmVkdWNlIGFuZCByZWR1Y2UvcmVkdWNlCisJY29uZmxpY3RzIHRoYXQgbWFzayB0aGUgNSByZWFsIG9uZXMuCisJKiBjaC1leHAueSAoU1RSSU5HLCBDT05TVEFOVCwgU0MpOiAgUmVtb3ZlIHVudXNlZCB0b2tlbnMuCisJKiBjaC1leHAueSAoaW50ZWdlcl9saXRlcmFsX2V4cHJlc3Npb24pOiAgUmVtb3ZlIHByb2R1Y3Rpb24sCisJbm8gbG9uZ2VyIHVzZWQuCisKK1RodSBKYW4gMjEgMDk6NTg6MzYgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKTogIEZpeCBPUF9BUlJBWSwgcmVtb3ZlIGNvZGUgdGhhdAorCWltcGxpZWQgdGhhdCAibm8gc2lkZSBlZmZlY3RzIiB3YXMgbm9uZnVuY3Rpb25hbC4KKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKTogIEFkZCBCSU5PUF9DT05DQVQgY2FzZSB0byBkZWFsIHdpdGgKKwljaGFyYWN0ZXIgc3RyaW5nIGFuZCBiaXRzdHJpbmcgY29uY2F0ZW5hdGlvbi4KKwkqIGV4cHByaW50LmMgKGR1bXBfZXhwcmVzc2lvbik6ICBBZGQgY2FzZSBmb3IgQklOT1BfQ09OQ0FULgorCSogZXhwcmVzc2lvbi5oIChleHBfb3Bjb2RlKTogIEFkZCBCSU5PUF9DT05DQVQuCisJKiBnZGJ0eXBlcy5oICh0eXBlX2NvZGUpOiAgQWRkIFRZUEVfQ09ERV9CSVRTVFJJTkcuCisJKiBsYW5ndWFnZS5jIChzdHJpbmdfdHlwZSk6ICBBZGQgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgdHlwZQorCWlzIGEgc3RyaW5nIHR5cGUuCisJKiBsYW5ndWFnZS5jIChiaW5vcF90eXBlX2NoZWNrKTogIEFkZCBjYXNlIGZvciBCSU5PUF9DT05DQVQuCisJKiB2YWxhcml0aC5jICh2YWx1ZV9jb25jYXQpOiAgTmV3IGZ1bmN0aW9uIHRvIGNvbmNhdGVuYXRlIHR3bworCXZhbHVlcywgc3VjaCBhcyBjaGFyYWN0ZXIgc3RyaW5ncyBvciBiaXRzdHJpbmdzLgorCSogdmFsb3BzLmMgKHZhbHVlX3N0cmluZyk6ICBSZW1vdmUgZXJyb3Igc3R1YiBhbmQgaW1wbGVtZW50CisJZnVuY3Rpb24gYm9keS4KKwkqIHZhbHVlLmggKHZhbHVlX2NvbmNhdCk6ICBBZGQgcHJvdG90eXBlLgorCSogY2gtZXhwLnkgKG9wZXJhbmRfMyk6ICBBZGQgYWN0aW9ucyBmb3IgU0xBU0hfU0xBU0ggKC8vKS4KKwkqIGNoLWV4cC55ICh5eWxleCk6ICBSZWNvZ25pemUgU0xBU0hfU0xBU0guCisJKiBjaC1sYW5nLmMgKGNoaWxsX29wX3ByaW50X3RhYik6ICBBZGQgU0xBU0hfU0xBU0ggKC8vKSBhcworCUJJTk9QX0NPTkNBVC4KKworVHVlIEphbiAxOSAxNDoyNjoxNSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogYy1leHAueSAoZXhwKTogIEFkZCBwcm9kdWN0aW9uIHRvIHN1cHBvcnQgZGlyZWN0IGNyZWF0aW9uCisJb2YgYXJyYXkgY29uc3RhbnRzIHVzaW5nIHRoZSBvYnZpb3VzIHN5bnRheC4KKwkqIGMtdmFscHJpbnQuYyAoY192YWxfcHJpbnQpOiAgU2V0IHByaW50ZWQgc3RyaW5nIGxlbmd0aC4KKwkqIGR3YXJmcmVhZC5jIChyZWFkX3RhZ19zdHJpbmdfdHlwZSk6ICBOZXcgcHJvdG90eXBlIGFuZAorCWZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBUQUdfc3RyaW5nX3R5cGUgRElFcy4KKwkqIGR3YXJmcmVhZC5jIChwcm9jZXNzX2RpZXMpOiAgQWRkIGNhc2UgZm9yIFRBR19zdHJpbmdfdHlwZQorCXRoYXQgY2FsbHMgbmV3IHJlYWRfdGFnX3N0cmluZ190eXBlIGZ1bmN0aW9uLgorCSogZXhwcHJpbnQuYyAocHJpbnRfc3ViZXhwKTogIEFkZCBzdXBwb3J0IGZvciBPUF9BUlJBWS4KKwkqIGdkYnR5cGVzLmMgKGNyZWF0ZV9yYW5nZV90eXBlLCBjcmVhdGVfYXJyYXlfdHlwZSk6ICBJbmhlcml0CisJb2JqZmlsZSBmcm9tIHRoZSBpbmRleCB0eXBlLgorCSogY2gtdHlwZXByaW50LmMgKGNoaWxsX3ByaW50X3R5cGUpOiAgQWRkIGNhc2UgZm9yCisJVFlQRV9DT0RFX1NUUklORy4KKwkqIGNoLXZhbHByaW50LmMgKGNoaWxsX3ZhbF9wcmludCk6ICBGaXggY2FzZSBmb3IKKwlUWVBFX0NPREVfU1RSSU5HLgorCitNb24gSmFuIDE4IDExOjU4OjQ1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogbWlwc3JlYWQuYyAoQ09ERV9NQVNLLCBNSVBTX0lTX1NUQUIsIE1JUFNfTUFSS19TVEFCLAorCU1JUFNfVU5NQVJLX1NUQUIsIFNUQUJTX1NZTUJPTFMpOiBSZW1vdmVkOyBub3cgaW4KKwlpbmNsdWRlL2NvZmYvbWlwcy5oLgorCitGcmkgSmFuIDE1IDIwOjI2OjUwIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjLWV4cC55IChleHA6U1RSSU5HKTogIENvbnZlcnQgQyBzdHJpbmdzIGludG8gYXJyYXktb2YtY2hhcgorCWNvbnN0YW50cyB3aXRoIGFuIGV4cGxpY2l0IG51bGwgYnl0ZSB0ZXJtaW5hdG9yLiAgT1BfU1RSSU5HIGlzCisJbm93IHVzZWQgZm9yIHJlYWwgc3RyaW5nIHR5cGVzLgorCSogYy1sYW5nLmMgKGJ1aWx0aW5fdHlwZV8qKTogIE1vdmUgZGVjbGFyYXRpb25zIHRvIGxhbmcuYyBzaW5jZQorCXRoZXkgYXJlIHVzZWQgYnkgYWxsIGxhbmd1YWdlcy4KKwkqIGMtbGFuZy5jIChfaW5pdGlhbGl6ZV9jX2xhbmd1YWdlKTogIE1vdmUgaW5pdGlhbGl6YXRpb25zIG9mIAorCWJ1aWx0aW5fdHlwZV8qIHRvIGxhbmcuYy4KKwkqIGMtdHlwZXByaW50LmMgKGNfdHlwZV9wcmludF92YXJzcGVjX3ByZWZpeCwKKwljX3R5cGVfcHJpbnRfdmFyc3BlY19zdWZmaXgpOiAgVFlQRV9DT0RFX1BBU0NBTF9BUlJBWSByZW5hbWVkCisJdG8gVFlQRV9DT0RFX1NUUklORy4KKwkqIGMtdmFscHJpbnQuYyAoY192YWxfcHJpbnQpOiAgQ2hhbmdlIHRoZSB3YXkgY2hhcmFjdGVyIGFycmF5cworCWFyZSBwcmludGVkIGFzIHN0cmluZ3MgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgc3RyaW5ncworCWFyZSBwcmludGVkIHdoZW4gcG9pbnRlci10by1jaGFyIHR5cGVzIGFyZSBkZXJlZmVyZW5jZWQuCisJUmVtb3ZlIHRlc3Qgb2YgcHJpbnRfbWF4IGJlZm9yZSBjYWxsaW5nIHZhbF9wcmludF9zdHJpbmcsIHdoaWNoCisJbm93IGRvZXMgaXQncyBvd24gdGVzdC4KKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKTogIEFkZCBjYXNlIGZvciBPUF9BUlJBWS4KKwkqIGV4cHByaW50LmMgKHByaW50X3N1YmV4cCwgZHVtcF9leHByZXNzaW9uKTogIEFkZCBjYXNlIGZvciBPUF9BUlJBWS4KKwkqIGV4cHJlc3Npb24uaCAoZW51bSBleHBfb3Bjb2RlKTogIEFkZCBPUF9BUlJBWSBhbmQgZG9jdW1lbnQuCisJKiBnZGJ0eXBlcy5jIChidWlsdGluX3R5cGVfKik6ICBBZGQgZGVjbGFyYXRpb25zIG1vdmVkIGZyb20KKwljLWxhbmcuYy4KKwkqIGdkYnR5cGVzLmMgKGNyZWF0ZV9zdHJpbmdfdHlwZSk6ICBOZXcgZnVuY3Rpb24gdG8gY3JlYXRlIHJlYWwKKwlzdHJpbmcgdHlwZXMuCisJKiBnZGJ0eXBlcy5jIChyZWN1cnNpdmVfZHVtcF90eXBlKTogIFRZUEVfQ09ERV9QQVNDQUxfQVJSQVkKKwlyZW5hbWVkIHRvIFRZUEVfQ09ERV9TVFJJTkcuCisJKiBnZGJ0eXBlcy5jIChfaW5pdGlhbGl6ZV9nZGJ0eXBlcyk6ICBBZGQgaW5pdGlhbGl6YXRpb25zIG9mCisJYnVpbHRpbl90eXBlXyogdHlwZXMgbW92ZWQgZnJvbSBjLWxhbmcuYy4KKwkqIGdkYnR5cGVzLmggKGVudW0gdHlwZV9jb2RlKTogIFRZUEVfQ09ERV9QQVNDQUxfQVJSQVkgcmVuYW1lZAorCXRvIFRZUEVfQ09ERV9TVFJJTkcuCisJKiBnZGJ0eXBlcy5oIChidWlsdGluX3R5cGVfc3RyaW5nKTogIEFkZCBleHRlcm4gZGVjbGFyYXRpb24uCisJKiBnZGJ0eXBlcy5oIChjcmVhdGVfc3RyaW5nX3R5cGUpOiAgQWRkIHByb3RvdHlwZS4KKwkqIG0yLWxhbmcuYyAobTJfY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGUpOiAgVFlQRV9DT0RFX1BBU0NBTF9BUlJBWQorCXJlbmFtZWQgdG8gVFlQRV9DT0RFX1NUUklORy4KKwkqIG04OGstdGRlcC5jIChwdXNoZWRfc2l6ZSk6ICBUWVBFX0NPREVfUEFTQ0FMX0FSUkFZIHJlbmFtZWQgdG8KKwlUWVBFX0NPREVfU1RSSU5HLgorCSogbWlwc3JlYWQuYyAoX2luaXRpYWxpemVfbWlwc3JlYWQpOiAgVFlQRV9DT0RFX1BBU0NBTF9BUlJBWQorCXJlbmFtZWQgdG8gVFlQRV9DT0RFX1NUUklORy4KKwkqIHBhcnNlLmMgKGxlbmd0aF9vZl9zdWJleHAsIHByZWZpeGlmeV9zdWJleHApOiAgQWRkIGNhc2UgZm9yCisJT1BfQVJSQVkuCisJKiBwcmludGNtZC5jIChwcmludF9mb3JtYXR0ZWQpOiAgUmVjb2duaXplIFRZUEVfQ09ERV9TVFJJTkcuCisJKiB0eXBlcHJpbnQuYyAocHJpbnRfdHlwZV9zY2FsYXIpOiAgVFlQRV9DT0RFX1BBU0NBTF9BUlJBWSByZW5hbWVkCisJdG8gVFlQRV9DT0RFX1NUUklORy4KKwkqIHZhbG9wcy5jIChhbGxvY2F0ZV9zcGFjZV9pbl9pbmZlcmlvcik6ICBOZXcgZnVuY3Rpb24gYW5kCisJcHJvdG90eXBlLCB1c2luZyBjb2RlIHJpcHBlZCBvdXQgb2YgdmFsdWVfc3RyaW5nLgorCSogdmFsb3BzLmMgKHZhbHVlX3N0cmluZyk6ICBSZXdyaXR0ZW4gdG8gdXNlIG5ldyBmdW5jdGlvbgorCWFsbG9jYXRlX3NwYWNlX2luX2luZmVyaW9yLCBidXQgdGVtcG9yYXJpbHkgZGlzYWJsZWQgdW50aWwgc29tZQorCW90aGVyIHN1cHBvcnQgaXMgaW4gcGxhY2UuCisJKiB2YWxvcHMuYyAodmFsdWVfYXJyYXkpOiAgTmV3IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhcnJheSBjb25zdGFudHMuCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnRfc3RyaW5nKTogIEFkZCBjb21tZW50IHRvIGRvY3VtZW50IHVzZSwgCisJY29tcGxldGUgcmV3cml0ZSB0byBmaXggc2V2ZXJhbCBzbWFsbCBidWdsZXRzLgorCSogdmFsdWUuaCAodmFsdWVfYXJyYXkpOiAgQWRkIHByb3RvdHlwZS4KKwkqIHZhbHVlLmggKHZhbF9wcmludF9zdHJpbmcpOiAgQ2hhbmdlIHByb3RvdHlwZSB0byBtYXRjaCByZXdyaXRlLgorCSogY2gtdmFscHJpbnQuYyAoY2hpbGxfdmFsX3ByaW50KTogIEFkZCBjYXNlIGZvciBUWVBFX0NPREVfU1RSSU5HLgorCSogY2gtZXhwLnkgKG1hdGNoX2NoYXJhY3Rlcl9saXRlcmFsKTogIERpc2FibGUgcmVjb2duaXRpb24gb2YgCisJY29udHJvbCBzZXF1ZW5jZSBmb3JtIG9mIGNoYXJhY3RlciBsaXRlcmFscyBhbmQgZG9jdW1lbnQgd2h5LgorCitUaHUgSmFuIDE0IDE1OjQ4OjEyIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIG5pbmR5LXNoYXJlL25pbmR5LmM6ICBBZGQgY29tbWVudHMgdG8gI2VuZGlmJ3MgdG8gY2xhcmlmeQorCWdyb3VwaW5nLgorCisJKiBocHBhLXBpbnNuLmMgKHByaW50X2luc24pOiAgVXNlIHJlYWRfbWVtb3J5X2ludGVnZXIsIGluc3RlYWQgb2YKKwlyZWFkX21lbW9yeSB0byBnZXQgYnl0ZSBvcmRlciByaWdodC4KKwkqIGhwcGFoLXRkZXAuYyAoZmluZF91bndpbmRfaW5mbyk6ICBEb24ndCByZWFkIGluIHVud2luZCBpbmZvCisJYW55bW9yZS4gIFRoaXMgaXMgZG9uZSBpbiBwYXJlYWQuYyBub3cuICBXZSBleHBlY3QgdW53aW5kIGluZm8KKwl0byBoYW5nIG9mZiBvZiBvYmpmaWxlcywgYW5kIHNlYXJjaCBhbGwgb2YgdGhlIG9iamZpbGVzIHdoZW4gdW50aWwKKwl3ZSBmaW5kIGEgbWF0Y2guCisJKiAoc2tpcF90cmFtcG9saW5lX2NvZGUpOiAgQ2FzdCBhcmcgdG8gdGFyZ2V0X3JlYWRfbWVtb3J5LgorCSogb2JqZmlsZXMuaCAoc3RydWN0IG9iamZpbGUpOiAgQWRkIG5ldyBmaWVsZCBvYmpfcHJpdmF0ZSB0byBob2xkCisJcGVyIG9iamVjdCBmaWxlIHByaXZhdGUgZGF0YSAodW53aW5kIGluZm8gaW4gdGhpcyBjYXNlKS4KKwkqIHBhcmVhZC5jIChyZWFkX3Vud2luZF9pbmZvKTogIE5ldyByb3V0aW5lIHRvIHJlYWQgdW53aW5kIGluZm8KKwlmb3IgdGhlIG9iamZpbGUuICBUaGlzIGRhdGEgaXMgaHVuZyBvZmYgb2Ygb2JqX3ByaXZhdGUuCisJKiB0bS1ocHBhLmg6ICBEZWZpbmUgc3RydWN0IG9ial91bndpbmRfaW5mbywgdG8gaG9sZCBwb2ludGVycyB0bworCXRoZSB1bndpbmQgaW5mbyBmb3IgdGhpcyBvYmpmaWxlLiAgQWxzbyBkZWZpbmUgT0JKX1VOV0lORF9JTkZPIHRvCisJbWFrZSB0aGlzIGVhc2llciB0byBhY2Nlc3MuCisKK1dlZCBKYW4gMTMgMjA6NDk6NTkgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGMtdmFscHJpbnQuYyAoY3BfcHJpbnRfY2xhc3NfbWVtYmVyKTogIEFkZCBleHRlcm4gZGVjbC4KKwkqIGMtdmFscHJpbnQuYyAoY192YWxfcHJpbnQpOiAgRXh0cmFjdCBjb2RlIGZvciBwcmludGluZyBtZXRob2RzCisJYW5kIG1vdmUgaXQgdG8gY3BfcHJpbnRfY2xhc3NfbWV0aG9kIGluIGNwLXZhbHByaW50LmMuCisJKiBjLXZhbHByaW50LmMgKGNfdmFsX3ByaW50KTogIEV4dHJhY3QgY29kZSB0byBwcmludCBzdHJpbmdzIGFuZAorCW1vdmUgaXQgdG8gdmFsX3ByaW50X3N0cmluZyBpbiB2YWxwcmludC5jLgorCSogY3AtdmFscHJpbnQuYyAoY3BfcHJpbnRfY2xhc3NfbWV0aG9kKTogIE5ldyBmdW5jdGlvbiB1c2luZworCWNvZGUgZXh0cmFjdGVkIGZyb20gY192YWxfcHJpbnQuCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnRfc3RyaW5nKTogIE5ldyBmdW5jdGlvbiB1c2luZyBjb2RlCisJZXh0cmFjdGVkIGZyb20gY192YWxfcHJpbnQuCisJKiB2YWx1ZS5oICh2YWxfcHJpbnRfc3RyaW5nKTogIEFkZCBwcm90b3R5cGUuCisJKiBjaC1leHAueSAoQ0hBUkFDVEVSX1NUUklOR19MSVRFUkFMKTogIFNldCBjb3JyZWN0IHRva2VuIHR5cGUuCisJKiBjaC1leHAueSAobGl0ZXJhbCk6ICBBZGQgYWN0aW9uIGZvciBDSEFSQUNURVJfU1RSSU5HX0xJVEVSQUwuCisJKiBjaC1leHAueSAodGVtcGJ1ZiwgdGVtcGJ1ZnNpemUsIHRlbXBidWZpbmRleCwgR1JPV0JZX01JTl9TSVpFLAorCUNIRUNLQlVGLCBncm93YnVmX2J5X3NpemUpOiAgTmV3IHZhcmlhYmxlcywgbWFjcm9zLCBhbmQgc3VwcG9ydAorCWZ1bmN0aW9ucyBmb3IgaW1wbGVtZW50aW5nIGEgZHluYW1pY2FsbHkgZXhwYW5kYWJsZSB0ZW1wIGJ1ZmZlci4KKwkqIGNoLWV4cC55IChtYXRjaF9zdHJpbmdfbGl0ZXJhbCk6ICBOZXcgbGV4ZXIgZnVuY3Rpb24uCisJKiBjaC1leHAueSAobWF0Y2hfYml0c3RyaW5nX2xpdGVyYWwpOiAgRHluYW1pYyBidWZmZXIgY29kZQorCXJlbW92ZWQgYW5kIHJlcGxhY2VkIHdpdGggbmV3IENIRUNLQlVGIG1hY3JvLgorCSogY2gtZXhwLnkgKHl5bGV4KTogIENhbGwgbWF0Y2hfc3RyaW5nX2xpdGVyYWwgd2hlbiBhcHByb3ByaWF0ZS4KKwkqIGNoLXZhbHByaW50LmMgKGNoX3ZhbF9wcmludCk6ICBBZGQgY29kZSBmb3IgVFlQRV9DT0RFX1BUUi4KKworU2F0IEphbiAgOSAxOTo1OTozMyAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIEFkZCBpbmZvIGZvciBwYXJlYWQuby4KKwkqIGNvbmZpZy9ocHBhaHB1eC5taDogIEFkZCBwYXJlYWQubyB0byBOQVRERVBGSUxFUy4KKworCSogYmxvY2tmcmFtZS5jIChmcmFtZWxlc3NfbG9va19mb3JfcHJvbG9ndWUpOiAgQ29ycmVjdCB0aGUKKwljb21tZW50LgorCSogZ2RidHlwZXMuaCwgZ2RidHlwZXMuYzogIFVzZSBjb25zdCBpbiBkZWNsIG9mCisJY3BsdXNfc3RydWN0X2RlZmF1bHQsIG5vdyB0aGF0IHBhLWdhcyBhc3NlbWJsZXIgaGFzIGJlZW4gZml4ZWQuCisJKiBocHBhaC1uYXQuYzogIEZvcm1hdHRpbmcuCisJKiBocHBhaC10ZGVwLmM6ICBSZW1vdmUgbG90cyBvZiB1c2VsZXNzIGV4dGVybnMgZm9yIHZhcmlhYmxlcyB3ZQorCWRvbid0IHVzZS4KKwkqIChmaW5kX3Vud2luZF9lbnRyeSk6ICBTcGVlZCB1cCBieSB1c2luZyBiaW5hcnkgc2VhcmNoLCBhbmQgYSBvbmUKKwllbnRyeSBjYWNoZS4KKwkqIChycF9zYXZlZCk6ICBOZXcgcm91dGluZSB0byBzZWUgd2hhdCB1bndpbmQgaW5mbyBzYXlzIGFib3V0IFJQCisJYmVpbmcgc2F2ZWQgb24gdGhlIHN0YWNrIGZyYW1lLgorCSogKGZyYW1lX3NhdmVkX3BjKTogIExvb2sgZm9yIHByb2xvZ3VlIHRvIHNlZSBpZiB3ZSBuZWVkIHRvCisJZXhhbWluZSB0aGUgc3RhY2sgZm9yIHRoZSBzYXZlZCBSUCBvciBub3QuCisJKiAoaW5pdF9leHRyYV9mcmFtZV9pbmZvKTogIENoZWNrIGZvciBwcm9sb2d1ZSwgaW5zdGVhZCBvZgorCWZyYW1lc2l6ZSB0byBkZXRlcm1pbmUgaWYgd2UgYXJlIGZyYW1lbGVzcyBvciBub3QuCisJKiAoZnJhbWVfY2hhaW5fdmFsaWQpOiAgU3RvcCBiYWNrdHJhY2VzIHdoZW4gd2UgcnVuIGludG8gX3N0YXJ0LgorCSogKHB1c2hfZHVtbXlfZnJhbWUpOiAgUmVmb3JtYXQgdG8gbWFrZSBtb3JlIHJlYWRhYmxlLgorCSogKGZpbmRfZHVtbXlfZnJhbWVfcmVncyk6ICBkaXR0by4KKwkqIChocF9wb3BfZnJhbWUpOiAgZGl0dG8uCisJKiAoaHBfcmVzdG9yZV9wY19xdWV1ZSk6ICBzbWFsbCBjbGVhbnVwLgorCSogKGhwX3B1c2hfYXJndW1lbnRzKTogIGRpdHRvLgorCSogKHBhX2RvX3JlZ2lzdGVyc19pbmZvKTogIGRpdHRvLgorCSogKHNraXBfcHJvbG9ndWUpOiAgTmV3IHJvdXRpbmUgY3JlYXRlZCBmcm9tIFNLSVBfUFJPTE9HVUUgbWFjcm8uCisJKiB0bS1ocHBhLmg6ICBNb3ZlIGNvbnRlbnRzIG9mIFNLSVBfUFJPTE9HVUUgaW50byBocHBhaC10ZGVwLmMuCisJKiBEZWZpbmUgRlJBTUVfQ0hBSU5fVkFMSUQuCisJKiBUdXJuIG9uIEJFTElFVkVfUENDX1BST01PVElPTiBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgY2hhciBhcmdzCisJcGFzc2VkIHRvIGZ1bmN0aW9ucy4KKworCSogcGFyZWFkLmMgKHBhX3N5bXRhYl9yZWFkKTogIFVzZSBuZXcgYmZkIGNvbnZlbnRpb25zIGZvcgorCWFjY2Vzc2luZyBsaW5rZXIgc3ltYm9sIHRhYmxlLgorCSogKHBhX3N5bWZpbGVfaW5pdCk6ICBBY2Nlc3MgZW1iZWRkZWQgU1RBQiBpbmZvIHZpYSBCRkQgc2VjdGlvbgorCW1lY2hhbmlzbSBhbmQgcmVsYXRlZCBtYWNyb3MuCisKKworU2F0IEphbiAgOSAxOTozMTo0MyAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBzcGFyYy1zdHViLmM6ICBVc2UgYSBzZXBlcmF0ZSBzdGFjayBmb3Igb3VyIHRyYXBzLgorCSogSGFuZGxlIHJlY3Vyc2l2ZSB0cmFwcy4KKwkqIFJlbW92ZSBhbGwgdHJhcCBpbml0IGNvZGUuICBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYnkgdGhlCisJZW52aXJvbm1lbnQuCisJKiAoc2V0X21lbV9mYXVsdF90cmFwKTogIENhbGwgZXhjZXB0aW9uSGFuZGxlcigpIHRvIHNldHVwIHRoaXMKKwl0cmFwLgorCSogKGhhbmRsZV9leGNlcHRpb24pOiAgU2VlIGlmIHdlIGFyZSBhdCBicmVha2luc3QsIGlmIHNvLCB0aGVuCisJYWR2YW5jZSBQQyBzcCB0aGF0IHVzZXJzIGNhbiBqdXN0IHN0ZXAgb3V0IG9mIGJyZWFrcG9pbnQoKS4KKwkqIChjYXNlICdHJyk6ICBEb24ndCBsZXQgR0RCIGhhY2sgQ1dQLiAgQWxzbywgY29weSBzYXZlZCByZWdzIHRvCisJbmV3IHBsYWNlIGlmIFNQIGhhcyBjaGFuZ2VkLgorCSogKGNhc2UgJ3MnKTogIEdldCByaWQgb2YgdGhpcywgd2UgY2FuJ3QgZG8gaXQgeWV0LgorCSogKGNhc2UgJ3QnKTogIE5ldyBjb21tYW5kIHRvIHRlc3QgYW55IG9sZCByYW5kb20gZmVhdHVyZS4KKwkqIChjYXNlICdyJyk6ICBOZXcgY29tbWFuZCB0byByZXNldCB0aGUgc3lzdGVtLgorCSogKGJyZWFrcG9pbnQpOiAgQWRkIGxhYmVsIHRvIGJyZWFrcG9pbnQgdHJhcCBpbnN0cnVjdGlvbiBzbyB0aGF0CisJaGFuZGxlX2V4Y2VwdGlvbigpIGNhbiBkZXRlY3Qgd2hlcmUgd2UgYXJlIGFuZCBnZXQgcGFzdCB0aGUKKwlicmVha3BvaW50IHRyaXZpYWxseS4KKworVGh1IEphbiAgNyAxMzozMzowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIG1pcHMtcGluc24uYzogQWN0dWFsIHdvcmsgbm93IGRvbmUgYnkgb3Bjb2Rlcy9taXBzLWRpcy5jLgorCitUaHUgSmFuICA3IDA5OjIxOjUxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiByZWNvZ25pc2UgYWxsIHNwYXJjbGl0ZSB2YXJpYW50cworCitXZWQgSmFuICA2IDEwOjE0OjUxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBzeW1maWxlLmM6IElmIE9fQklOQVJZIGlzbid0IGRlZmluZWQsIHNldCBpdCB0byAwLCBjYWxsIG9wZW5wIGZvcgorCWJpbmFyeSBmaWxlcyBvcmluZyBpbiB0aGUgcmlnaHQgYml0LgorCisJKiBtYWluLmMsIHNvdXJjZS5jLCBzdGF0ZS5jLCBzeW1taXNjLmM6IHVzZSBtYWNyb3MgZGVmaW5lZCBpbgorCWZvcGVuLXtiaW58Ym90aH0gd2hlbiBmb3BlbmluZyBmaWxlcy4KKworV2VkIEphbiAgNiAwODoxOToxMSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZGVmcy5oIChIT1NUX0NIQVJfQklUKTogIE5ldyBtYWNybywgZGVmYXVsdHMgdG8gZWl0aGVyIENIQVJfQklUCisJZnJvbSBhIGNvbmZpZ3VyYXRpb24gZmlsZSAodHlwaWNhbGx5IGluY2x1ZGluZyA8bGltaXRzLmg+KSwgb3IgdG8KKwlUQVJHRVRfQ0hBUl9CSVQgaWYgQ0hBUl9CSVQgaXMgbm90IGRlZmluZWQuCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cCk6ICBVc2UgbmV3IEJZVEVTX1RPX0VYUF9FTEVNIG1hY3JvLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiAgQWRkIGNhc2UgZm9yIE9QX0JJVFNUUklORy4KKwkqIGV4cHByaW50LmMgKHByaW50X3N1YmV4cCk6ICBVc2UgbmV3IEJZVEVTX1RPX0VYUF9FTEVNIG1hY3JvLgorCSogZXhwcHJpdG4uYyAocHJpbnRfc3ViZXhwLCBkdW1wX2V4cHJlc3Npb24pOiAgQWRkIGNhc2UgZm9yCisJT1BfQklUU1RSSU5HLgorCSogZXhwcmVzc2lvbi5oIChPUF9CSVRTVFJJTkcpOiAgTmV3IGV4cHJlc3Npb24gZWxlbWVudCB0eXBlIGZvcgorCXBhY2tlZCBiaXRzdHJpbmdzLgorCSogZXhwcmVzc2lvbi5oIChFWFBfRUxFTV9UT19CWVRFUywgQllURVNfVE9fRVhQX0VMRU0pOiAgTmV3CisJbWFjcm9zIHRvIGNvbnZlcnQgYmV0d2VlbiBudW1iZXIgb2YgZXhwcmVzc2lvbiBlbGVtZW50cyBhbmQgYnl0ZXMKKwl0byBzdG9yZSB0aGF0IG1hbnkgZWxlbWVudHMuCisJKiBpOTYwLXRkZXAuYyAobGVhZnByb2NfcmV0dXJuKTogIFVzZSBuZXcgbWFjcm9zIHRvIGFjY2VzcworCW1pbmltYWwgc3ltYm9sIG5hbWUgYW5kIGFkZHJlc3MgZmllbGRzLgorCSogbTg4ay1waW5zbi5jIChzcHJpbnRfYWRkcmVzcyk6ICBVc2UgbmV3IG1hY3JvcyB0byBhY2Nlc3MKKwltaW5pbWFsIHN5bWJvbCBuYW1lIGFuZCBhZGRyZXNzIGZpZWxkcy4KKwkqIG5pbmR5LXRkZXAuYyAobmluZHlfZnJhbWVfY2hhaW5fdmFsaWQpOiAgVXNlIG5ldyBtYWNybyB0byBhY2Nlc3MKKwltaW5pbWFsIHN5bWJvbCBhZGRyZXNzIGZpZWxkLgorCSogcGFyc2UuYyAod3JpdGVfZXhwX2VsdCwgd3JpdGVfZXhwX3N0cmluZywgcHJlZml4aWZ5X2V4cHJlc3Npb24sCisJcGFyc2VfZXhwXzEpOiAgVXNlIG5ldyBFWFBfRUxFTV9UT19CWVRFUyBtYWNyby4KKwkqIHBhcnNlLmMgKHdyaXRlX2V4cF9zdHJpbmcsIGxlbmd0aF9vZl9zdWJleHAsIHByZWZpeGlmeV9leHByZXNzaW9uKToKKwlVc2UgbmV3IEJZVEVTX1RPX0VYUF9FTEVNIG1hY3JvLgorCSogcGFyc2UuYyAod3JpdGVfZXhwX2JpdHN0cmluZyk6ICBOZXcgZnVuY3Rpb24gdG8gd3JpdGUgcGFja2VkCisJYml0c3RyaW5ncyBpbnRvIHRoZSBleHByZXNzaW9uIGVsZW1lbnQgdmVjdG9yLgorCSogcGFyc2UuYyAobGVuZ3RoX29mX3N1YmV4cCwgcHJlZml4aWZ5X3N1YmV4cCk6ICBBZGQgY2FzZSBmb3IKKwlPUF9CSVRTVFJJTkcuCisJKiBwYXJzZXItZGVmcy5oIChzdHJ1Y3Qgc3Rva2VuKTogIERvY3VtZW50IHRoYXQgaXQgaXMgdXNlZCBmb3IKKwlPUF9CSVRTVFJJTkcgYXMgd2VsbCBhcyBPUF9TVFJJTkcuCisJKiBwYXJzZXItZGVmcy5oICh3cml0ZV9leHBfYml0c3RyaW5nKTogIEFkZCBwcm90b3R5cGUuCisJKiBjaC1leHAueSAoQklUX1NUUklOR19MSVRFUkFMKTogIENoYW5nZSB0b2tlbiB0eXBlIHRvIHN2YWwuCisJKiBjaC1leHAueSAoTlVNLCBQUkVELCBTVUNDLCBBQlMsIENBUkQsIE1BWCwgTUlOLCBTSVpFLCBVUFBFUiwKKwlMT1dFUiwgTEVOR1RIKTogIE5ldyB0b2tlbnMgZm9yIGtleXdvcmRzLgorCSogY2gtZXhwLnkgKGNoaWxsX3ZhbHVlX2J1aWx0X2luX3JvdXRpbmVfY2FsbCwgbW9kZV9hcmd1bWVudCwgCisJdXBwZXJfbG93ZXJfYXJndW1lbnQsIGxlbmd0aF9hcmd1bWVudCwgYXJyYXlfbW9kZV9uYW1lLAorCXN0cmluZ19tb2RlX25hbWUsIHZhcmlhbnRfc3RydWN0dXJlX21vZGVfbmFtZSk6ICBOZXcgbm9uLXRlcm1pbmFscworCWFuZCBwcm9kdWN0aW9ucy4KKwkqIGNoLWV4cC55IChsaXRlcmFsKTogIFVzZWZ1bCBwcm9kdWN0aW9uIGZvciBCSVRfU1RSSU5HX0xJVEVSQUwuCisJKiBjaC1leHAueSAobWF0Y2hfYml0c3RyaW5nX2xpdGVyYWwpOiAgTmV3IGxleGVyIHN1cHBvcnQgZnVuY3Rpb24KKwl0byByZWNvZ25pemUgYml0c3RyaW5nIGxpdGVyYWxzLgorCSogY2gtZXhwLnkgKHRva2VudGFiNik6ICBOZXcgdG9rZW4gdGFibGUgZm9yIDYgY2hhcmFjdGVyIGtleXdvcmRzLgorCSogY2gtZXhwLnkgKHRva2VudGFiNSk6ICBBZGQgTE9XRVIsIFVQUEVSLgorCSogY2gtZXhwLnkgKHRva2VudGFiNCk6ICBBZGQgUFJFRCwgU1VDQywgQ0FSRCwgU0laRS4KKwkqIGNoLWV4cC55ICh0b2tlbnRhYjMpOiAgQWRkIE5VTSwgQUJTLCBNSU4sIE1BWC4KKwkqIGNoLWV4cC55ICh5eWxleCk6ICBDaGVjayB0b2tlbnRhYjYuCisJKiBjaC1leHAueSAoeXlsZXgpOiAgQ2FsbCBtYXRjaF9iaXRzdHJpbmdfbGl0ZXJhbC4KKworTW9uIEphbiAgNCAxNjo1NDoxOCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogeGNvZmZleGVjLmMgKHZtYXBfc3ltdGFiKTogIFVzZSBuZXcgbWFjcm9zIHRvIGFjY2VzcyBtaW5pbWFsCisJc3ltYm9sIG5hbWUgYW5kIHZhbHVlIGZpZWxkcy4KKworCSogYy1leHAueSAoeXlsZXgpOiAgTWFrZSBzdGF0aWMsIHRvIG1hdGNoIHByb3RvdHlwZSBhbmQgb3RoZXIKKwk8bGFuZz4tZXhwLnkgZmlsZXMuCisKKwkqIGV4cHJlc3Npb24uaCAoZXhwX29wY29kZSk6ICBBZGQgQklOT1BfTU9ELgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiAgSGFuZGxlIG5ldyBCSU5PUF9NT0QuCisJKiBleHBwcmludC5jIChkdW1wX2V4cHJlc3Npb24pOiAgSGFuZGxlIG5ldyBCSU5PUF9NT0QuCisJKiBsYW5ndWFnZS5jIChiaW5vcF90eXBlX2NoZWNrKTogIEhhbmRsZSBuZXcgQklOT1BfTU9ELgorCSogbWFpbi5jIChmbG9hdF9oYW5kbGVyKTogIFJlLWVuYWJsZSBmbG9hdCBoYW5kbGVyIHdoZW4gaGl0LgorCSogdmFsYXJpdGguYyAobGFuZ3VhZ2UuaCk6ICBJbmNsdWRlLCBuZWVkIGN1cnJlbnRfbGFuZ3VhZ2UuCisJKiB2YWxhcml0aC5jIChUUlVOQ0FUSU9OX1RPV0FSRFNfWkVSTyk6ICBEZWZpbmUgZGVmYXVsdCBtYWNybworCWZvciBpbnRlZ2VyIGRpdmlkZSB0cnVuY2F0ZXMgdG93YXJkcyB6ZXJvIGZvciBuZWdhdGl2ZSByZXN1bHRzLgorCSogdmFsYXJpdGguYyAodmFsdWVfeF9iaW5vcCk6ICBIYW5kbGUgQklOT1BfTU9EIGlmIHNlZW4uCisJKiB2YWxhcml0aC5jICh2YWx1ZV9iaW5vcCk6ICBBbGxvdyBhcml0aG1ldGljIG9wZXJhdGlvbnMgb24KKwlUWVBFX0NPREVfQ0hBUiB2YXJpYWJsZXMuICBBZGQgY2FzZSB0byBoYW5kbGUgbmV3IEJJTk9QX01PRC4KKwkqIGNoLWV4cC55IChvcGVyYW5kXzQpOiAgQWRkIHVzZWZ1bCBhY3Rpb25zIGZvciBNT0QgYW5kIFJFTS4KKwkqIGNoLWV4cC55ICh0b2tlbnRhYjMpOiAgQWRkIE1PRCBhbmQgUkVNLgorCSogY2gtZXhwLnkgKHl5bGV4KTogIFNldCBpbm5lcm1vc3RfYmxvY2sgZm9yIHN5bWJvbHMgZm91bmQKKwlpbiBsb2NhbCBzY29wZXMuICBSZXR1cm4gTE9DQVRJT05fTkFNRSBmb3IgbG9jYWwgc3ltYm9scy4KKwkqIGNoLWxhbmcuYyAoY2hpbGxfb3BfcHJpbnRfdGFiKTogIEZpeCBNT0QgZW50cnkgdG8gdXNlCisJQklOT1BfTU9EIGluc3RlYWQgb2YgQklOT1BfUkVNLiAgQWRkIFJFTSBlbnRyeSwgdXNpbmcgQklOT1BfUkVNLgorCitNb24gSmFuICA0IDA3OjM1OjMxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHdhaGluaS5jeWdudXMuY29tKQorCisJKiBjb21tYW5kLmMgKHNoZWxsX2VzY2FwZSwgbWFrZV9jb21tYW5kLCBfaW5pdGlhbGl6ZV9jb21tYW5kKToKKwlkb24ndCBjcmVhdGUgb3IgdXNlIGZvcmsgaWYgQ0FOVF9GT1JLIGlzIGRlZmluZWQuCisJKiBzZXJpYWwuaCwgc2VyLWdvMzIuYzogbm93IGNvbXBpbGVzLCBidXQgInRoZSBvYnZpb3VzIHByb2JsZW1zIG9mCisJY29kZSB3cml0dGVuIGZvciB0aGUgSUJNIFBDIiByZW1haW4uCisJKiB4bS1nbzMyLmg6IGRlZmluZSBDQU5UX0ZPUksKKworU3VuIEphbiAgMyAxNDoyNDo1NiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXNpbS5jOiBmaXJzdCBhdHRlbXB0IGF0IGdlbmVyYWwgc2ltdWxhdG9yIGludGVyZmFjZQorCSogcmVtb3RlLWhtcy5jOiB3aGl0ZXNwYWNlCisJKiBoODMwMC10ZGVwLmM6IChoODMwMF9za2lwX3Byb2xvZ3VlLCBleGFtaW5lX3Byb2xvZ3VlKToKKwl1bmRlcnN0YW5kIG5ldyBzdGFjayBsYXlvdXQuIChwcmludF9yZWdpc3Rlcl9ob29rKTogcHJpbnQgY2NyCisJcmVnaXN0ZXIgaW4gYSBmYW5jeSB3YXkuCisKK1N1biBKYW4gIDMgMTQ6MTY6MTAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGV2YWwuYyAobGFuZ3VhZ2UuaCk6IEluY2x1ZGUuCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cF93aXRoX2NvZXJjaW9uKTogIE9ubHkgY29lcmNlIGFycmF5cworCXRvIHBvaW50ZXIgdHlwZXMgd2hlbiB0aGUgY3VycmVudCBsYW5ndWFnZSBpcyBDLiAgSXQgbG9zZXMgZm9yCisJb3RoZXIgbGFuZ3VhZ2VzIHdoZW4gdGhlIGxvd2VyIGluZGV4IGJvdW5kIGlzIG5vbnplcm8uCisJKiB2YWxhcml0aC5jICh2YWx1ZV9zdWJzY3JpcHQpOiAgVGFrZSBhcnJheSBsb3dlciBib3VuZHMgaW50bworCWFjY291bnQgd2hlbiBwZXJmb3JtaW5nIHN1YnNjcmlwdGluZyBvcGVyYXRpb25zLgorCSogdmFsb3BzLmMgKHZhbHVlX2NvZXJjZV9hcnJheSk6ICBBZGQgY29tbWVudCBkZXNjcmliaW5nIHdoeQorCWFycmF5cyB3aXRoIG5vbnplcm8gbG93ZXIgYm91bmRzIGFyZSBkZWFsdCB3aXRoIGluIHZhbHVlX3N1YnNjcmlwdCwKKwlyYXRoZXIgdGhhbiBpbiB2YWx1ZV9jb2VyY2VfYXJyYXkuCisKK1NhdCBKYW4gIDIgMTI6MTY6NDEgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNoLWV4cC55IChGTE9BVF9MSVRFUkFMKTogIEFkZCB0b2tlbi4KKwkqIGNoLWV4cC55IChsaXRlcmFsKTogIEFkZCBGTE9BVF9MSVRFUkFMLgorCSogY2gtZXhwLnkgKG1hdGNoX2Zsb2F0X2xpdGVyYWwpOiAgTmV3IGxleGVyIHJvdXRpbmUuCisJKiBjaC1leHAueSAoY29udmVydF9mbG9hdCk6ICBSZW1vdmUuCisJKiBjaC1leHAueSAoeXlsZXgpOiAgQ2FsbCBtYXRjaF9mbG9hdF9saXRlcmFsLgorCSogY2gtZXhwLnkgKHl5bGV4KTogIE1hdGNoIHNpbmdsZSAnLicgYWZ0ZXIgdHJ5aW5nCisJdG8gbWF0Y2ggZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHMuCisKKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKTogIEFkZCBjYXNlIE1VTFRJX1NVQlNDUklQVC4KKwkqIGV4cHByaW50LmMgKHByaW50X3N1YmV4cCk6ICBSZW5hbWUgQklOT1BfTVVMVElfU1VCU0NSSVBUIHRvCisJTVVMVElfU1VCU0NSSVBULgorCSogZXhwcHJpbnQuYyAoZHVtcF9leHByZXNzaW9uKTogIE5ldyBmdW5jdGlvbiBmb3IgZHVtcGluZworCWV4cHJlc3Npb24gdmVjdG9ycyBkdXJpbmcgZ2RiIGRlYnVnZ2luZy4KKwkqIGV4cHJlc3Npb24uaCAoQklOT1BfTVVMVElfU1VCU0NSSVBUKTogIE5hbWUgY2hhbmdlZCB0bworCU1VTFRJX1NVQlNDUklQVCBhbmQgbW92ZWQgb3V0IG9mIEJJTk9QIHJhbmdlLgorCSogZXhwcmVzc2lvbi5oIChEVU1QX0VYUFJFU1NJT04pOiAgTmV3IG1hY3JvIHRoYXQgY2FsbHMKKwlkdW1wX2V4cHJlc3Npb24gaWYgREVCVUdfRVhQUkVTU0lPTlMgaXMgZGVmaW5lZC4KKwkqIG0yLWV4cC55IChCSU5PUF9NVUxUSV9TVUJTQ1JJUFQpOiAgQ2hhbmdlZCB0byBNVUxUSV9TVUJTQ1JJUFQuCisJKiBwYXJzZS5jIChsZW5ndGhfb2Zfc3ViZXhwLCBwcmVmaXhpZnlfc3ViZXhwKTogIENoYW5nZQorCUJJTk9QX01VTFRJX1NVQlNDUklQVCB0byBNVUxUSV9TVUJTQ1JJUFQuCisJKiBwYXJzZS5jIChwYXJzZV9leHBfMSk6ICBDYWxsIERVTVBfRVhQUkVTU0lPTiBiZWZvcmUgYW5kIGFmdGVyCisJcHJlZml4aWZ5J2luZyB0aGUgZXhwcmVzc2lvbi4KKwkqIHByaW50Y21kLmMgKHByaW50X2NvbW1hbmRfMSk6ICBBZGQgY29tbWVudC4KKwkqIGNoLWV4cC55IChleHByZXNzaW9uX2xpc3QpOiAgQWRkIHVzZWZ1bCBhY3Rpb25zLgorCSogY2gtZXhwLnkgKHZhbHVlX2FycmF5X2VsZW1lbnQpOiAgQWRkIHVzZWZ1bCBhY3Rpb25zLgorCSogY2gtZXhwLnkgKGFycmF5X3ByaW1pdGl2ZV92YWx1ZSk6ICBBZGQgcHJvZHVjdGlvbi4KKwkqIGNoLWV4cC55ICh5eWxleCk6ICBSZWNvZ25pemUgJywnIGFzIGEgdG9rZW4uCisKK0ZyaSBKYW4gIDEgMTg6MjI6MDIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogcGFzcyBwcmVmaXggYW5kIGV4ZWNfcHJlZml4IHZpYSBGTEFHU19UT19QQVNTLAorCVBPU0lYaXplIHRoZSByZWN1cnNpdmUgbWFrZXMgKG1ha2UgW3ZhcmlhYmxlIGFzc2lnbm1lbnRzXSB0YXJnZXR7c30pCisKK0ZyaSBKYW4gIDEgMTE6NTY6MjMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIHRtLXN1bjRzb2wyLmggKENQTFVTX01BUktFUik6ICBSZW1vdmUsIG5vdyBzZXQgaW4gdG0tc3lzdjQuaC4KKwkqIHRtLXN5c3Y0LmggKENQTFVTX01BUktFUik6ICBCeSBkZWZhdWx0LCBnKysgdXNlcyAnLicgYXMgdGhlCisJQ1BMVVNfTUFSS0VSIGZvciBhbGwgU1ZSNCBzeXN0ZW1zLCBzbyBmb2xsb3cgc3VpdC4KKwkqIGRlZnMuaCAoc3RyZHVwX2RlbWFuZ2xlZCk6ICBSZW1vdmUgcHJvdG90eXBlLgorCSogZHdhcmZyZWFkLmMgKGVudW1fdHlwZSwgc3ludGhlc2l6ZV90eXBlZGVmKTogIFVzZSBuZXcgbWFjcm8KKwlTWU1CT0xfSU5JVF9MQU5HVUFHRV9TUEVDSUZJQy4KKwkqIGR3YXJmcmVhZC5jIChuZXdfc3ltYm9sKTogIFVzZSBTWU1CT0xfSU5JVF9ERU1BTkdMRURfTkFNRS4KKwkqIG1pbnN5bXMuYyAoaW5zdGFsbF9taW5pbWFsX3N5bWJvbHMsIHByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9sLAorCXByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9sX2FuZF9pbmZvKTogIFVzZSBuZXcgbWFjcm8KKwlTWU1CT0xfSU5JVF9MQU5HVUFHRV9TUEVDSUZJQy4KKwkqIG1pbnN5bXMuYyAoaW5zdGFsbF9taW5pbWFsX3N5bWJvbHMpOiAgVXNlIG5ldyBtYWNybworCVNZTUJPTF9JTklUX0RFTUFOR0xFRF9OQU1FLgorCSogc3RhYnNyZWFkLmMgKGRlZmluZV9zeW1ib2wpOiAgVXNlIG5ldyBtYWNybworCVNZTUJPTF9JTklUX0RFTUFOR0xFRF9OQU1FLgorCSogc3ltZmlsZS5jIChhZGRfcHN5bWJvbF90b19saXN0LCBhZGRfcHN5bWJvbF9hZGRyX3RvX2xpc3QpOgorCVVzZSBuZXcgbWFjcm8gU1lNQk9MX0lOSVRfREVNQU5HTEVEX05BTUUuCisJKiBzeW1maWxlLmggKEFERF9QU1lNQk9MX1ZUX1RPX0xJU1QpOiAgVXNlIG5ldyBtYWNybworCVNZTUJPTF9JTklUX0RFTUFOR0xFRF9OQU1FLgorCSogc3ltbWlzYy5jIChkdW1wX21zeW1ib2xzLCBkdW1wX3N5bXRhYiwgcHJpbnRfcGFydGlhbF9zeW1ib2wpOgorCVNZTUJPTF9ERU1BTkdMRURfTkFNRSBub3cgdGVzdHMgbGFuZ3VhZ2UgaXRzZWxmLgorCSogc3ltdGFiLmMgKENPTVBMRVRJT05fTElTVF9BRERfU1lNQk9MKTogIFNZTUJPTF9ERU1BTkdMRURfTkFNRQorCW5vdyB0ZXN0cyBsYW5ndWFnZSBpdHNlbGYuCisJKiBzeW10YWIuaCAoU1lNQk9MX0NQTFVTX0RFTUFOR0xFRF9OQU1FKTogIE5ldyBtYWNybyB0aGF0IGRvZXMKKwl3aGF0IFNZTUJPTF9ERU1BTkdMRURfTkFNRSB1c2VkIHRvIGRvLCBkaXJlY3RseSBhY2Nlc3MgdGhlIEMrKworCW1hbmdsZWQgbmFtZSBtZW1iZXIgaW4gdGhlIGxhbmd1YWdlIGRlcGVuZGVudCBwb3J0aW9uIG9mIGEgc3ltYm9sLgorCSogc3ltdGFiLmggKFNZTUJPTF9ERU1BTkdMRURfTkFNRSk6ICBOZXcgbWFjcm8gdGhhdCByZXR1cm5zIHRoZQorCW1hbmdsZWQgbmFtZSBtZW1iZXIgYXBwcm9wcmlhdGUgZm9yIGEgc3ltYm9sJ3MgbGFuZ3VhZ2UuCisJKiBzeW10YWIuaCAoU1lNQk9MX1NPVVJDRV9OQU1FLCBTWU1CT0xfTElOS0FHRV9OQU1FLAorCVNZTUJPTF9NQVRDSEVTX05BTUUsIFNZTUJPTF9NQVRDSEVTX1JFR0VYUCk6CisJU1lNQk9MX0RFTUFOR0xFRF9OQU1FIG5vdyB0ZXN0cyBsYW5ndWFnZSBpdHNlbGYuCisJKiBzeW10YWIuaCAoU1lNQk9MX0lOSVRfTEFOR1VBR0VfU1BFQ0lGSUMpOiAgTmV3IG1hY3JvIHRoYXQKKwlpbml0aWFsaXplcyBsYW5ndWFnZSBkZXBlbmRlbnQgcG9ydGlvbiBvZiBzeW1ib2wuCisJKiBzeW10YWIuaCAoU1lNQk9MX0lOSVRfREVNQU5HTEVEX05BTUUpOiAgTmV3IG1hY3JvIHRoYXQKKwlkZW1hbmdsZXMgYW5kIGNhY2hlcyB0aGUgZGVtYW5nbGVkIGZvcm0gb2Ygc3ltYm9sIG5hbWVzLgorCSogdXRpbHMuYyAoZnB1dHNfZGVtYW5nbGVkLCBmcHJpbnRfc3ltYm9sKTogIFVzZSBjdXJyZW50IGxhbmd1YWdlCisJdG8gc2VsZWN0IGFuIGFwcHJvcHJpYXRlIGRlbWFuZ2xpbmcgYWxnb3JpdGhtLgorCSogdXRpbHMuYyAoc3RyZHVwX2RlbWFuZ2xlZCk6ICBSZW1vdmUsIG5vIGxvbmdlciB1c2VkLgorCSogc3ltdGFiLmggKFNZTUJPTF9DSElMTF9ERU1BTkdMRURfTkFNRSk6ICBOZXcgbWFjcm8gdGhhdCBkaXJlY3RseQorCWFjY2VzcyB0aGUgQ2hpbGwgbWFuZ2xlZCBuYW1lIG1lbWJlciBpbiB0aGUgbGFuZ3VhZ2UgZGVwZW5kZW50CisJcG9ydGlvbiBvZiBhIHN5bWJvbC4KKwkqIGNoLWxhbmcuYyAoY2hpbGxfZGVtYW5nbGUpOiAgTmV3IGZ1bmN0aW9uLCBzaW1wbGUgZGVtYW5nbGVyLgorCSogZGVmcy5oIChjaGlsbF9kZW1hbmdsZSk6ICBBZGQgcHJvdG90eXBlLgorCSogc3ltdGFiLmggKGxhbmd1YWdlX2RlcGVuZGVudF9pbmZvKTogIEFkZCBzdHJ1Y3QgZm9yIENoaWxsLgkKKworRm9yIG9sZGVyIGNoYW5nZXMgc2VlIENoYW5nZUxvZy05MgorDAorTG9jYWwgVmFyaWFibGVzOgorbW9kZTogaW5kZW50ZWQtdGV4dAorbGVmdC1tYXJnaW46IDgKK2ZpbGwtY29sdW1uOiA3NAordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvZ2RiL0NoYW5nZUxvZy05NCBiL2dkYi9DaGFuZ2VMb2ctOTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY5MWFjZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9DaGFuZ2VMb2ctOTQKQEAgLTAsMCArMSw1NzA1IEBACitGcmkgRGVjIDMwIDE3OjU4OjU1IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9tNjhrL3RtLWVzdC5oOiAgUmVtb3ZlIGNydWZ0LgorCisKK1RodSBEZWMgMjkgMjI6NDA6MDAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIEFsbG93IHVwIHRvIDEwIHdoaXRlc3BhY2Ugc2VwYXJhdGVkIGFyZ3VtZW50cyB0byB1c2VyIGRlZmluZWQKKwljb21tYW5kcy4KKwkqIHRvcC5jIChzdHJ1Y3QgdXNlcl9hcmdzKTogU3RydWN0dXJlIGZvciBob2xkaW5nIGFyZ3VtZW50cyB0bworCXVzZXIgZGVmaW5lZCBjb21tYW5kcy4KKwkocHJpbnRfY29tbWFuZF9saW5lKTogRGVsZXRlIHVudXNlZCAidG1wX2NoYWluIiB2YXJpYWJsZS4gIENsZWFuCisJdXAgZmxvdyBjb250cm9sIGJ5IGhhdmluZyBjYXNlcyBleGl0IGluIHRoZSBzYW1lIG1hbm5lci4KKwlCZWZvcmUgZXhlY3V0aW5nIGEgY29tbWFuZCBvciBldmFsdWF0aW5nIGFuIGV4cHJlc3Npb24sIHN1YnN0aXR1dGUKKwl0aGUgY3VycmVudCAkYXJnMC4uJGFyZzkgdmFsdWVzIGlmIHRoZSBjb21tYW5kL2V4cHJlc3Npb24gdXNlcyB0aGVtLgorCShhcmdfY2xlYW51cCk6IE5ldyBmdW5jdGlvbi4KKwkoc2V0dXBfdXNlcl9hcmdzLCBsb2NhdGVfYXJnLCBpbnNlcnRfYXJncyk6IExpa2V3aXNlLgorCShleGVjdXRlX3VzZXJfY29tbWFuZCk6IEFsbG93IGFyZ3VtZW50cyB0byB1c2VyIGRlZmluZWQgY29tbWFuZHMuCisKKwkqIEFsbG93IGlmL3doaWxlIGNvbW1hbmRzIHRvIGJlIHVzZWQgd2l0aGluIGEgYnJlYWtwb2ludCBjb21tYW5kCisJbGlzdC4KKwkqIGJyZWFrcG9pbnQuYyAoYnBzdGF0X2RvX2FjdGlvbnMpOiBDYWxsIGV4ZWN1dGVfY29udHJvbF9jb21tYW5kCisJcmF0aGVyIHRoYW4gZXhlY3V0ZV9jb21tYW5kIChwYXNzZXMgZW50aXJlIGNvbW1hbmQgc3RydWN0dXJlIHJhdGhlcgorCXRoYW4ganVzdCB0aGUgY29tbWFuZCBsaW5lIHRleHQpLgorCShicmVha3BvaW50XzEpOiBVc2UgInByaW50X2NvbW1hbmRfbGluZSIgdG8gcHJpbnQgYSBicmVha3BvaW50CisJY29tbWFuZCBsaW5lIChpbmNsdWRpbmcgY29udHJvbCBzdHJ1Y3R1cmVzKS4KKwkqIGdkYmNtZC5oIChleGVjdXRlX2NvbnRyb2xfY29tbWFuZCk6IFByb3ZpZGUgZXh0ZXJuIGRlY2wuCisJKHByaW50X2NvbW1hbmRfbGluZSk6IExpa2V3aXNlLgorCSogdG9wLmMgKGV4ZWN1dGVfY29udHJvbF9jb21tYW5kKTogTm8gbG9uZ2VyIHN0YXRpYy4KKwkocHJpbnRfY29tbWFuZF9saW5lKTogTmV3IGZ1bmN0aW9uIHRvIHJlY3Vyc2l2ZWx5IHByaW50IGEgY29tbWFuZAorCWxpbmUsIGluY2x1ZGluZyBjb250cm9sIHN0cnVjdHVyZXMuCisKK1RodSBEZWMgMjkgMTg6MTg6MzEgMTk5NCAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgorCisJKiBocHBhLXRkZXAuYyAocGFfcHJpbnRfcmVnaXN0ZXJzKTogRXh0cmFjdCByZWdpc3RlciB2YWx1ZXMgc3RvcmVkCisJaW4gYmlnIGVuZGlhbiBmb3JtYXQgb24gYmlnIGFuZCBsaXR0bGUgZW5kaWFuIGhvc3RzLgorCisJKiBhcnJheS1yb20uYzogU3VwcG9ydCBmb3IgQXJyYXkgVGVjaCBMU0kzM2sgYmFzZWQgUkFJRCBkaXNrCisJY29udHJvbGxlciBib2FyZC4KKwkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplICJtaXBzKi0qLWVjb2ZmKiIgcmF0aGVyIHRoYW4KKwkibWlwcyotaWR0LWVjb2ZmKiIgc28gaXQnbGwgd29yayBmb3IgdGhlIExTSTMzay4KKworCSogbW9uaXRvci5bY2hdLCBvcDUwLXJvbS5jLCByb202OGstcm9tLmMsIHc4OWstcm9tLmM6IEFkZCBzdXBwb3J0CisJdG8gbW9uaXRvciBjb25maWcgc3RydWN0dXJlIGZvciBzdXBwb3J0ZWQgYmF1ZCByYXRlcyBmb3IgYSB0YXJnZXQKKwlhbmQgdmFyaWFibGUgc3RvcCBiaXRzLgorCSogbW9uaXRvci5jIChtb25pdG9yX2ZldGNoX3JlZ2lzdGVyKTogU3RvcmUgcmVnaXN0ZXIgdmFsdWVzIGluIGJpZworCWVuZGlhbiBmb3JtYXQgb24gYW55IGhvc3QuCisKK1dlZCBEZWMgMjggMTk6Mjc6MjIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGEtdGRlcC5jIChocHBhX2ZpeF9jYWxsX2R1bW15KTogUHJlZmVyIGltcG9ydCBzdHVicyBvdmVyCisJZXhwb3J0IHN0dWJzIGFuZCBhY3R1YWwgc2hhcmVkIGxpYnJhcnkgZnVuY3Rpb25zIHNvIHRoYXQgbGF6eQorCWJpbmRpbmcgd29ya3MgY29ycmVjdGx5LiAgVHJ5IGJvdGggX19kX3BsdF9jYWxsIGFuZCBfX2djY19wbHRfY2FsbAorCXRyYW1wb2xpbmVzIGZvciBjYWxsaW5nIGltcG9ydCBzdHVicy4KKworV2VkIERlYyAyOCAxNToyOTowMiAxOTk0ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGEyOWstdGRlcC5jIChwb3BfZnJhbWUpOiBGaXggYSB2YXJpYWJsZSBuYW1lLgorCitXZWQgRGVjIDI4IDEyOjIxOjM5IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBocHBhLXRkZXAuYyAocHVzaF9kdW1teV9mcmFtZSk6IFJlZmluZSBjb2RlIHRvIGRldGVybWluZSB3aGF0CisJc3BhY2UgSUQgdG8gcGxhY2UgaW4gdGhlIHN0YWNrICYgaW5mX3N0YXR1cyBzdHJ1Y3R1cmUuCisJKGhwcGFfcG9wX2ZyYW1lKTogRG9uJ3Qgd2FsayB0aHJvdWdoIHRyYW1wb2xpbmUgY29kZSBpZiBwb3BwaW5nIGEKKwljYWxsIGR1bW15IGZyYW1lLgorCShocHBhX2ZpeF9jYWxsX2R1bW15KTogQ2FsbCB0aGUgc3RhY2sgZHVtbXkgZGlyZWN0bHkgaWYgdGhlCisJY3VycmVudCBQQyBpcyBpbiBhIHNoYXJlZCBsaWJyYXJ5LgorCisJKiBocHBhLXRkZXAuYyAocHVzaF9kdW1teV9mcmFtZSk6IFJldHVybiB0eXBlIGlzIHZvaWQuICBDbGVhcgorCWluX3N5c2NhbGwgYml0IGluIGZsYWdzLiAgRG9uJ3QgZGVwZW5kIG9uIHRoZSBQQyBxdWV1ZSByZWdpc3RlcnMKKwl3aGVuIGluX3N5c2NhbGwgaXMgc2V0LCB0aGV5J3JlIG5vdCB2YWxpZC4KKwkqIGNvbmZpZy9wYS90bS1ocHBhLmggKFBVU0hfRFVNTVlfRlJBTUUpOiBQYXNzIGluZl9zdGF0dXMgZG93biB0bworCXB1c2hfZHVtbXlfZnJhbWUuCisJKFNSNF9SRUdOVU0pOiBEZWZpbmUuCisKKwkqIGhwcGEtdGRlcC5jOiBNaXNjLiBsaW50IGNoYW5nZXMuCisKK1R1ZSBEZWMgMjcgMTI6MzI6NDMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGJyZWFrcG9pbnQuYyAod2F0Y2hwb2ludF9jaGVjayk6IERvbid0IGJvdGhlciByZXN0b3JpbmcgdGhlCisJInNlbGVjdGVkIiBmcmFtZSBhbnltb3JlLCBpdCdzIG5vdCBuZWNlc3NhcnkuICBJbml0aWFsaXplIHRoZQorCWZyYW1lIGNhY2hlIGJlZm9yZSB0cnlpbmcgdG8gZmluZCB0aGUgY3VycmVudCBmcmFtZSBpbiB0aGUgZnJhbWUKKwljaGFpbi4KKworCSogc29tc29saWIuYyAoc29tX3NvbGliX2FkZCk6IFJldHVybiB3aXRob3V0IGxvYWRpbmcgYW55IHNoYXJlZAorCWxpYnJhcmllcyBpZiBzeW1maWxlX29iamZpbGUgaXMgTlVMTC4KKwkoc29tX3NvbGliX2NyZWF0ZV9pbmZlcmlvcl9ob29rKTogTGlrZXdpc2UuCisKK0ZyaSBEZWMgMjMgMTc6MDM6MTMgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLWVzdC5jOiAgTmV3IGZpbGUgc3VwcG9ydHMgRVNULTMwMCBDUFUzMiBiYWNrZ3JvdW5kIAorCW1vZGUgSUNFLgorCSogcmVtb3RlLXV0aWxzLmMgKHNyX2NvbSk6ICBDYWxsIHJlZ2lzdGVyc19jaGFuZ2VkLgorCSogY29uZmlndXJlLmluIChtNjgqLSotZXN0Kik6ICBOZXcgY29uZmlndXJhdGlvbi4KKwkqIGNvbmZpZy9tNjhrL3RtLWVzdC5oOiAgTmV3IGZpbGUuCisKK0ZyaSBEZWMgMjMgMTY6MTg6NTAgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKENMSUJTKTogIFB1dCBMSUJJQkVSVFkgbGFzdC4KKworVGh1IERlYyAyMiAwOToyNzoxNiAxOTk0ICBKaW0gS2luZ2RvbiAgPGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbT4KKworCSogc2VyLXRjcC5jICh0Y3Bfb3Blbik6IENhc3QgdG8gc3RydWN0IHNvY2thZGRyIHdoZW4gcGFzc2luZyB0bworCWZ1bmN0aW9uIHdoaWNoIGV4cGVjdHMgdGhhdC4KKworVGh1IERlYyAyMiAxMzoyNTozMyAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcnRsLmN5Z251cy5jb20pCisKKwkqIG5sbS9nZGJzZXJ2ZS5jLCBubG0vcHBjLmMsIG5sbS9wcGMuaDogRG9uJ3QgdHJ5IHRvIHVzZQorCSAgQUxURVJOQVRFX01FTV9GVU5DUy4KKworV2VkIERlYyAyMSAxNDowMDoyNiAxOTk0ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+CisKKwkqIG1vbml0b3IuYzogTm93IHN1cHBvcnRzIHhtb2RlbSBhcyBhIHJlbW90ZWxvYWRwcm90b2NvbC4KKworVHVlIERlYyAyMCAyMzowMToxNyAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBjb25maWcvbWlwcy94bS1pcml4NC5oLCBjb25maWcvbWlwcy94bS1pcml4NS5oOiAgI2RlZmluZQorCV9CU0RfQ09NUEFUIHRvIGdldCByZWxpYWJsZSBzaWduYWwgaGFuZGxpbmcuCisKK1R1ZSBEZWMgMjAgMTE6NDQ6MjggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHNwYXJjLXRkZXAuYywgYTI5ay10ZGVwLmMsIGZpbmR2YXIuYyAoZ2V0X3NhdmVkX3JlZ2lzdGVyKToKKwlpZiAhdGFyZ2V0X2hhc19yZWdpc3RlcnMsIGNhbGwgZXJyb3IoKS4KKworCSogdmFsdWUuaDogUmVtb3ZlIG9ic29sZXRlIGNvbW1lbnRzIGFib3V0IEZSQU1FIHZzIHN0cnVjdAorCWZyYW1lX2luZm8gKi4KKworCitTdW4gRGVjIDE4IDExOjUyOjU4IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogc3BhcmMtdGRlcC5jIChzcGFyY19wb3BfZnJhbWUpOiAgUmVtb3ZlIGVycm9uZW91cyBleHRyYSBhcmd1bWVudAorCXRvIHdyaXRlX3JlZ2lzdGVyLgorCitTYXQgRGVjIDE3IDEzOjIzOjIxIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiB0bS1zcGFyYy5jIChFWFRSQV9GUkFNRV9JTkZPKTogTmV3IGZpZWxkIHNwX29mZnNldC4KKwkqIHNwYXJjLXRkZXAuYyAoc3BhcmNfaW5pdF9leHRyYV9mcmFtZV9pbmZvKTogU2V0IGl0LgorCShleGFtaW5lX3Byb2xvZ3VlLCBzcGFyY19pbml0X2V4dHJhX2ZyYW1lX2luZm8pOiBVc2UgLT5mcmFtZSBwbHVzCisJLT5zcF9vZmZzZXQgdG8gY29tcHV0ZSB0aGUgYWRkcmVzcyBzb21ldGhpbmcgaXMgc2F2ZWQgYXQsIG5vdAorCS0+Ym90dG9tLgorCisJKiBzcGFyYy10ZGVwLmMgKGdldF9zYXZlZF9yZWdpc3Rlcik6IE5ldyBmdW5jdGlvbi4KKwkqIHRtLXNwYXJjLmg6IERlZmluZSBHRVRfU0FWRURfUkVHSVNURVI7IGRvbid0IGRlZmluZQorCUZSQU1FX0ZJTkRfU0FWRURfUkVHUywgSEFWRV9SRUdJU1RFUl9XSU5ET1dTIG9yIFJFR0lTVEVSX0lOX1dJTkRPV19QLgorCSogc3RhY2suYyAoZnJhbWVfaW5mbyk6IEFkZCBjb21tZW50IGFib3V0IHdoYXQgdG8gZG8gaWYKKwlGUkFNRV9GSU5EX1NBVkVEX1JFR1MgaXMgbm90IGRlZmluZWQuCisKKwkqIHNwYXJjLXRkZXAuYyAoc3BhcmNfaW5pdF9leHRyYV9mcmFtZV9pbmZvKTogU2V0IC0+ZnJhbWUgZmllbGQKKwloZXJlLiAgR2V0IGl0IHJpZ2h0IGZvciBmbGF0IGZyYW1lcy4KKwkqIHNwYXJjLXRkZXAuYyAoc3BhcmNfZnJhbWVfY2hhaW4pOiBJbnN0ZWFkIG9mIHJldHVybmluZworCW1lYW5pbmdmdWwgdmFsdWUgZm9yIC0+ZnJhbWUgZmllbGQsIGp1c3QgcmV0dXJuIGR1bW15IHZhbHVlLgorCVRoaXMgY2hhbmdlIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBvbGQgY29kZSBkaWRuJ3QgZGVhbCB3aXRoIG1peGVkCisJZmxhdCBhbmQgbm9uLWZsYXQgZnJhbWVzLgorCisJKiBzcGFyYy10ZGVwLmMgKHNwYXJjX3BvcF9mcmFtZSk6IFdyaXRlIFNQX1JFR05VTSBmcm9tCisJZnJhbWUtPmZyYW1lLCBkb24ndCBnbyB0aHJvdWdoIHNhdmVkIHJlZ3MgZm9yIHRoaXMuCisKKwkqIHNwYXJjLXRkZXAuYzogTW92ZSBndXRzIG9mIHNraXBfcHJvbG9ndWUgdG8gbmV3IGZ1bmN0aW9uCisJZXhhbWluZV9wcm9sb2d1ZS4gIENoZWNrIGZvciBmbGF0IHByb2xvZ3VlIGFuZCBzZXQgaXNfZmxhdC4KKwlQcm92aWRlIHRoZSBjYWxsZXIgd2l0aCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBpcyBzYXZlZCB3aGVyZQorCWlmIGRlc2lyZWQuCisJKHNraXBfcHJvbG9ndWUsIHNwYXJjX2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyk6IENhbGwgZXhhbWluZV9wcm9sb2d1ZS4KKworCSogc3BhcmMtdGRlcC5jOiBSZXBsYWNlIHVuaW9uIHNwYXJjX2luc25fbGF5b3V0IGFuZCBhbm9ueW1vdXMKKwl1bmlvbiBpbiBpc2FubnVsbGVkLCB3aGljaCB3b24ndCB3b3JrIG9uIGEgbGl0dGxlLWVuZGlhbiBob3N0LAorCXdpdGggWF8qIG1hY3Jvcy4KKworCSogc3BhcmMtdGRlcC5jIChzcGFyY19mcmFtZV9zYXZlZF9wYyk6IElmIGFkZHIgPT0gMCwgdGhlIHNhdmVkIFBDCisJaXMgc3RpbGwgaW4gJW83LgorCisJKiBjb25maWcvc3BhcmMvdG0tc3BhcmMuaDogRGVmaW5lIElOSVRfRlJBTUVfUEMgYW5kCisJSU5JVF9GUkFNRV9QQ19GSVJTVC4KKwkqIGJsb2NrZnJhbWUuYyAoZ2V0X3ByZXZfZnJhbWVfaW5mbyk6IE1vZGlmeSBjb21tZW50cyByZWdhcmRpbmcKKwlJTklUX0ZSQU1FX1BDX0ZJUlNUIGFuZCB0aGUgc3BhcmMuCisKKwkqIHNwYXJjLXRkZXAuYyAoc2luZ2xlX3N0ZXApOiBVc2UgNCBub3Qgc2l6ZW9mIChsb25nKSBmb3Igc2l6ZSBvZgorCWluc3RydWN0aW9uLiAKKworU2F0IERlYyAxNyAwMjozMzozNyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGMtdHlwZXByaW50LmMgKGNfdHlwZV9wcmludF9iYXNlKTogIFVzZSBgc2hvdycgb2YgLTEgdG8gcHJpbnQKKwl0aGUgcmV0dXJuIHR5cGUgb2YgbWV0aG9kcyB0byBhdm9pZCBpbmZpbml0ZSBsb29wcyB3aXRoIGFub255bW91cworCXR5cGVzLgorCSogdmFsb3BzLmMgKHNlYXJjaF9zdHJ1Y3RfZmllbGQpOiAgSGFuZGxlIGFub255bW91cyB1bmlvbnMuCisKKwkqIHNwYXJjLXRkZXAuYyAoc3Vub3M0X3NraXBfdHJhbXBvbGluZV9jb2RlKTogIE5ldyBmdW5jdGlvbgorCXRvIGNvcnJlY3RseSBoYW5kbGUgc3RlcHMgaW50byAtZyBjb21waWxlZCBQSUMgb2JqZWN0cyBpbiB0aGUKKwltYWluIGV4ZWN1dGFibGUuCisJKiBjb25maWcvc3BhcmMvdG0tc3VuNG9zNC5oIChTS0lQX1RSQU1QT0xJTkVfQ09ERSk6CisJUmVkZWZpbmUgdG8gdXNlIHN1bm9zNF9za2lwX3RyYW1wb2xpbmVfY29kZS4KKworCSogZHdhcmZyZWFkLmMgKERXQVJGX1JFR19UT19SRUdOVU0pOiAgUHJvdmlkZSBhIGRlZmF1bHQgbWFwcGluZworCWZyb20gRFdBUkYgdG8gR0RCIHJlZ2lzdGVyIG51bWJlcmluZy4KKwkqIGR3YXJmcmVhZC5jIChsb2N2YWwpOiAgVXNlIERXQVJGX1JFR19UT19SRUdOVU0gdG8gbWFwIHRoZQorCXJlZ2lzdGVyIHZhbHVlLgorCSogY29uZmlnL21pcHMvdG0tbWlwc3Y0LmggKERXQVJGX1JFR19UT19SRUdOVU0pOiAgRGVmaW5lLgorCitGcmkgRGVjIDE2IDEwOjU2OjI5IDE5OTQgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKHVuaW5zdGFsbCk6IHRyYW5zZm9ybSBmaWxlIG5hbWVzLgorCitUaHUgRGVjIDE1IDE2OjU1OjM1IDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogZGVmcy5oOiBJbmNsdWRlIHByb2dyZXNzLmguCisJKFFVSVQpOiBDYWxsIFBST0dSRVNTLgorCSogbWFpbi5jIChtYWluKTogQ2FsbCBTVEFSVF9QUk9HUkVTUyBhbmQgRU5EX1BST0dSRVNTLCBicmVhaworCXVzYWdlIG1lc3NhZ2UgaW50byBzaG9ydGVyIHN0cmluZ3MuCisJKiBzb3VyY2UuYzogIENoYW5nZSBsb25nIGNvbW1hbmQgaGVscCBzdHJpbmdzIGludG8gY29uY2F0cyBvZgorCXNob3J0ZXIgb25lcywgZm9yIHBpY2t5IEFOU0kgY29tcGlsZXJzLgorCisJKiB0b3AuYyAoY29tbWFuZF9sb29wKTogRm9yIHNwYWNlIHVzYWdlIGRpc3BsYXksIHNob3cgYm90aAorICAgICAgICBhYnNvbHV0ZSBzaXplIGFuZCB0aGUgY2hhbmdlIGZyb20gYmVmb3JlIGNvbW1hbmQgZXhlY3V0aW9uLgorCitUaHUgRGVjIDE1IDE2OjQwOjEwIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGRlZnMuaCwgbWFpbi5jIChnZGJfZnB1dHMpLCB0b3AuYzogQWRkIHN0cmVhbSBhcmcgdG8KKwlmcHV0c191bmZpbHRlcmVkX2hvb2suCisJKiBkZWZzLmgsIHRvcC5jLCB1dGlscy5jIChlcnJvcik6IEFkZCBlcnJvcl9ob29rLgorCitUdWUgRGVjIDEzIDE1OjE1OjMzIDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogYnJlYWtwb2ludC5jLCBpbmZydW4uYywgcHJpbnRjbWQuYzogQ2hhbmdlIGxvbmcgY29tbWFuZCBoZWxwCisgICAgICAgIHN0cmluZ3MgaW50byBjb25jYXRzIG9mIHNob3J0ZXIgb25lcywgZm9yIHBpY2t5IEFOU0kgY29tcGlsZXJzLgorCitNb24gRGVjIDEyIDE3OjA4OjAyIDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCVNwYXJjIGZsYXQgcmVnaXN0ZXIgd2luZG93IHN1cHBvcnQuCisJKiBzcGFyYy10ZGVwLmMgKHNwYXJjX2luc25fbGF5b3V0KTogTmV3IHVuaW9uLCBkZWZpbmVzIGxheW91dCBvZgorICAgICAgICBpbnN0cnVjdGlvbnMgc3ltYm9saWNhbGx5ICh1c2VkIHRvIGJlIGxvY2FsIHRvIHNraXBfcHJvbG9ndWUpLgorCShzcGFyY19pbml0X2V4dHJhX2ZyYW1lX2luZm8pOiBOZXcgZnVuY3Rpb24uCisJKHNwYXJjX2ZyYW1lX2NoYWluKTogQWRkIGZsYXQgY2FzZXMgdGhyb3VnaG91dC4KKwkoc2tpcF9wcm9sb2d1ZSk6IEFkZCByZWNvZ25pdGlvbiBvZiBmbGF0IHByb2xvZ3Vlcy4KKwkoc3BhcmNfZnJhbWVfZmluZF9zYXZlZF9yZWdzKTogQWRkIGZsYXQgY2FzZXMuCisJKHNwYXJjX3BvcF9mcmFtZSk6IERpdHRvLgorCSogY29uZmlnL3NwYXJjL3RtLXNwYXJjLmggKEVYVFJBX0ZSQU1FX0lORk8pOiBOZXcgc2xvdHMuCisJKElOSVRfRVhUUkFfRlJBTUVfSU5GTyk6IENhbGwgc3BhcmNfaW5pdF9leHRyYV9mcmFtZV9pbmZvLgorCShQUklOVF9FWFRSQV9GUkFNRV9JTkZPKTogRGVmaW5lLgorCisKK01vbiBEZWMgMTIgMTM6MDY6NTkgMTk5NCAgSmltIEtpbmdkb24gIDxraW5nZG9uQGRlbmViLmN5Z251cy5jb20+CisKKwkqIGYtbGFuZy5jOiBSZW1vdmUgZHVwbGljYXRlIGRlY2xhcmF0aW9uIG9mCisJYnVpbHRpbl90eXBlX2ZfaW50ZWdlciwgYW5kIG9ubHkgaW5jbHVkZSBpdCBpbiB0aGUgZl9idWlsdGluX3R5cGVzCisJb25jZS4KKworCSogc29tcmVhZC5jIChzb21fc3ltZmlsZV9yZWFkKTogSnVzdCBhc3NpZ24gdG8gb2JqZmlsZS0+b2JqX3ByaXZhdGUsCisJbm90IE9CSl9VTldJTkRfSU5GTy4gIEFzc2lnbmluZyB0byBhIGNhc3QgaXMgYSBHQ0MtaXNtIHdoaWNoCisJdGhlIEhQIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZS4KKworCitGcmkgRGVjICA5IDE1OjUwOjA1IDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLmMgKHJlbW90ZV93YWl0KTogUGFzcyBzdHJpbmcgaW5zdGVhZCBvZiBjaGFyIHRvIHN0cmNweS4KKworRnJpIERlYyAgOSAwNDo0MzoxNyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2Ric2VydmVyL2xvdy1seW54LmMgKG15d2FpdCk6IFJlbW92ZSBkZWJ1Z2dpbmcgcHJpbnRmLgorCitUaHUgRGVjICA4IDE1OjA3OjI5IDE5OTQgIEppbSBLaW5nZG9uICA8a2luZ2RvbkBkZW5lYi5jeWdudXMuY29tPgorCisJKiBmcmFtZS5oOiBSZXN0b3JlIHByZS1Ob3YgMyBjb21tZW50cyBhYm91dCBGUkFNRV9GUCB3aXRoIG1pbm9yCisJY2hhbmdlcy4gIFRoZXkgYXJlIGNvcnJlY3QsIHVubGlrZSB0aGUgcG9zdC1Ob3YgMyBjb21tZW50CisJKEZSQU1FX0ZQIGRvZXNuJ3QgaGF2ZSBhbnkgbWFjaGluZS1pbmRlcGVuZGVudCByZWxhdGlvbnNoaXAgd2l0aAorCUZQX1JFR05VTSBvciBhbnkgb3RoZXIgc3VjaCBub3Rpb24gb2YgYSAiZnJhbWUgcG9pbnRlciIpLgorCitXZWQgRGVjICA3IDE0OjUwOjU0IDE5OTQgIEppbSBLaW5nZG9uICA8a2luZ2RvbkBkZW5lYi5jeWdudXMuY29tPgorCisJKiBnZGJzZXJ2ZXIvcmVtb3RlLXV0aWxzLmMgKHdyaXRlX29rKTogV3JpdGUgIk9LIiwgbm90ICJPayIsIHRvCisJbWF0Y2ggc3R1YnMgYW5kIHByb3RvY29sIHNwZWMuCisJKiBnZGJzZXJ2ZXIvcmVtb3RlLXV0aWxzLmMgKHJlbW90ZV9vcGVuKTogQ2FzdCB0byBzdHJ1Y3Qgc29ja2FkZHIKKwl3aGVuIHBhc3NpbmcgdG8gZnVuY3Rpb24gd2hpY2ggZXhwZWN0cyB0aGF0LgorCisJVGhlIGZvbGxvd2luZyBjaGFuZ2VzIGFyZW4ndCBxdWl0ZSBlbm91Z2ggdG8gbWFrZSB0aGluZ3Mgd29yayB3aXRoCisJTHlueE9TIChhcHByZW50bHkga2VybmVsIHByb2JsZW1zKS4KKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IFdoZW4gcmVzdW1pbmcgbmV3IHRocmVhZCwgcGFzcyBwaWQKKwlub3QgLTEgZm9yIHJlbW90ZSBjYXNlLgorCSogdGhyZWFkLmMgKGluZm9fdGhyZWFkc19jb21tYW5kKTogR2l2ZSBlcnJvciBpZiAhdGFyZ2V0X2hhc19zdGFjay4gCisJKiBpbmZydW4uYyAoc3RhcnRfcmVtb3RlKTogQ2FsbCBpbml0X3RocmVhZF9saXN0LgorCSogdGhyZWFkLmMgKGluZm9fdGhyZWFkc19jb21tYW5kKTogRG9uJ3QgY2FsbCBraWxsIGZvciByZW1vdGUKKwlkZWJ1Z2dpbmcgdGFyZ2V0LgorCSogdGFyZ2V0LmMgKG5vcm1hbF9waWRfdG9fc3RyKTogUHJpbnQgInRocmVhZCIgbm90ICJwcm9jZXNzIiBmb3IKKwlyZW1vdGUuCisJKiByZW1vdGUuYywgZ2Ric2VydmVyLyo6IEFkZCAnSCcsICdTJywgYW5kICdDJyByZXF1ZXN0cywgJ1gnCisJcmVzcG9uc2UsIGFuZCBgdGhyZWFkJyBwYXJ0IG9mICdUJyByZXNwb25zZS4KKwkqIGdkYnNlcnZlci8qOiBJZiBwcm9ncmFtIGV4aXRzLCBzZW5kIHBhY2tldCB0byBHREIgYmVmb3JlCisJZXhpdGluZy4gIEhhbmRsZSB0ZXJtaW5hdGlvbiB3aXRoIGEgc2lnbmFsIHRoZSBzYW1lIGFzIGV4aXRpbmcKKwl3aXRoIGFuIGV4aXRzdGF0dXMuCisJKiByZW1vdGUuYzogRG9uJ3QgdHJ5IHRvIGtpbGwgcHJvZ3JhbSBhZnRlciBnZXR0aW5nIGFuICdYJworCXJlc3BvbnNlLgorCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogQWRkIGNvbW1lbnQgYWJvdXQga2lsbCB2ZXJzdXMgbW91cm4uCisKK1RodSBEZWMgIDggMTI6Mzc6MzggMTk5NCAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgorCisJKiBjb25maWcvcGEvdG0tcHJvLmggdG0taHBwYXAuaCwgaHBwYXByby5tdDogUmVuYW1lIHRtLWhwcGFwLmggdG8KKwl0bS1wcm8uaC4KKworV2VkIERlYyAgNyAxODoyMjo1OSAxOTk0ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHNvdXJjZS5jOiBWYXJpb3VzIGNvc21ldGljIGNoYW5nZXMuCisJKGZvcndhcmRfc2VhcmNoX2NvbW1hbmQpOiBIYW5kbGUgdmVyeSBsb25nIHNvdXJjZSBsaW5lcyBjb3JyZWN0bHkuCisKK1dlZCBEZWMgIDcgMTM6MjE6NDcgMTk5NCAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgorCisJKiBocHBhLXRkZXAuYzogVXNlIEdEQl9UQVJHRVRfSVNfUEFfRUxGIHNvIFNPTSB0YXJnZXQgc3VwcG9ydCB3aWxsCisJc3RvcCBiZWluZyBsaW5rZWQgaW4uCisKKwkqIGNvbmZpZy9wYS90bS1ocHBhcC5oOiBOZXcgZmlsZS4gU2V0IEdEQl9UQVJHRVRfSVNfUEFfRUxGLAorCW90aGVyd2lzZSBpdCBsb29rcyBsaWtlIEJTRC1FTEYuCisKK01vbiBEZWMgIDUgMjE6NDM6NTIgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogaW5mdGFyZy5jOiBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gdG8gZ2V0IGRlZiBvZiBwaWRfdC4KKworRnJpIERlYyAgMiAxNTowMzowNyAxOTk0ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHNvbGliLmMgKGF1dG9fc29saWJfYWRkX2F0X3N0YXJ0dXApOiBOZXcgZ2xvYmFsLgorCShzb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vayk6IENhbGwgc29saWJfYWRkIG9ubHkgaWYKKwlhdXRvX3NvbGliX2FkZF9hdF9zdGFydHVwIGlzIG5vbnplcm8uCisJKF9pbml0aWFsaXplX3NvbGliKTogTmV3IGNvbW1hbmQgInNldCBhdXRvLXNvbGliLWFkZCIuCisKK0ZyaSBEZWMgIDIgMTI6NTI6MDQgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBwYXJzZS5jIChtc3ltYm9sX2FkZHJfdHlwZSk6ICBSZXBsYWNlZCBieQorCWxvb2t1cF9wb2ludGVyX3R5cGUgKGJ1aWx0aW5fdHlwZV92b2lkKS4KKworCSogcHJpbnRjbWQuYyAoX2luaXRpYWxpemVfcHJpbnRjbWQpOiAgR2l2ZSBleGFtaW5lXypfdHlwZQorCWEgbmFtZSBmb3IgYHB0eXBlICRfJy4KKworRnJpIERlYyAgMiAxMjo1MjowNCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogcHJpbnRjbWQuYyAocHJpbnRfZm9ybWF0dGVkKTogQ2FsbCB2YWxfcHJpbnRfc3RyaW5nIGRpcmVjdGx5LAorCXJhdGhlciB0aGFuIHZpYSB2YWx1ZV9wcmludC4KKworV2VkIE5vdiAzMCAyMjoyNzoyNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tc29saWIuYyAoc29tX3NvbGliX2dldF9nb3RfYnlfcGMpOiBOZXcgZnVuY3Rpb24uCisJKiBzb21zb2xpYi5oIChzb21fc29saWJfZ2V0X2dvdF9ieV9wYyk6IEFkZCBleHRlcm4gZGVjbC4KKwkqIGhwcGEtdGRlcC5jIChocHBhX2ZpeF9jYWxsX2R1bW15KTogSGFuZGxlIGNhc2Ugd2hlcmUgRlVOIGlzIHRoZQorCWZ1bmN0aW9uJ3MgZXhwb3J0IHN0dWIgb3IgcmVhbCBhZGRyZXNzIGluIGEgc2hhcmVkIGxpYnJhcnkuCisKK1R1ZSBOb3YgMjkgMTM6NDA6MjUgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWcvaTM4Ni9uYnNkLm1oIChSRUdFWCwgUkVHRVgxKTogTm8gbG9uZ2VyIGRlZmluZS4KKworCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLWZyZWVic2QqKTogTmV3IGNvbmZpZ3VyYXRpb24uCisJKiBjb25maWcvaTM4Ni97ZmJzZC5taCxmYnNkLm10LG5tLWZic2QuaH06IE5ldyBmaWxlcy4KKworVHVlIE5vdiAyOSAxMjoyMzoyNSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIHRvcC5jIChyZWFkX25leHRfbGluZSk6IFBhc3MgYW5ub3RhdGlvbiBzdWZmaXggImNvbW1hbmRzIgorCWluc3RlYWQgb2YgImNvbW1hbmQiLCBtYXRjaGVzIGRvY3VtZW50YXRpb24uCisKK01vbiBOb3YgMjggMTQ6NTM6MjEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBjb25maWcvYTI5ay90bS1hMjlrLmggKHNldHVwX2FyYml0cmFyeV9mcmFtZSk6IFJlcGxhY2UKKwlGUkFNRV9BRERSIHdpdGggQ09SRV9BRERSIGluIHByb3RvdHlwZS4KKworCSogdG9wLmMgKGNvbW1hbmRfbGluZV9pbnB1dCk6IElmIGFubm90YXRpb24gc3VmZml4IGlzIE5VTEwsCisJcmVwbGFjZSBpdCB3aXRoIGFuIGVtcHR5IHN0cmluZy4KKwkocmVhZF9uZXh0X2xpbmUpOiBQYXNzICJjb21tYW5kIiBhcyBhbm5vdGF0aW9uIHN1ZmZpeCB0bworCWNvbW1hbmRfbGluZV9pbnB1dC4KKworTW9uIE5vdiAyOCAxMTowMzoxNCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9yczYwMDAvdG0tcnM2MDAwLmggKHNldHBncnApOiBtb3ZlIGRlZm4gZnJvbSBoZXJlLi4uCisJKiBjb25maWcvcnM2MDAwL3htLXJzNjAwMC5oOiAuLi50byBoZXJlLgorCisKK0ZyaSBOb3YgMjUgMjE6MjY6MDIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHRtLWhwcGEuaCAoc2tpcF90cmFtcG9saW5lX2NvZGUpOiBBZGQgZXh0ZXJuIGRlY2wuCisJKiBocHBhLXRkZXAuYyAoaHBwYV9wb3BfZnJhbWUpOiBTaWxlbnRseSByZXN0YXJ0IHRoZSBpbmZlcmlvciBhbmQKKwlhbGxvdyBpdCB0byBleGVjdXRlIGFueSByZXR1cm4gcGF0aCB0cmFtcG9saW5lIGNvZGUuICBTdG9wIHRoZQorCWluZmVyaW9yIGFuZCBnaXZlIHRoZSB1c2VyIGNvbnRyb2wgd2hlbiB0aGUgdHJhbXBvbGluZSBoYXMKKwlmaW5pc2hlZCBleGVjdXRpbmcuCisJKGluX3NvbGliX2NhbGxfdHJhbXBvbGluZSk6IEhhbmRsZSBleHBvcnQgc3R1YnMgd2hpY2ggYWxzbyBwZXJmb3JtCisJcGFyYW1ldGVyIHJlbG9jYXRpb25zLgorCShpbl9zb2xpYl9yZXR1cm5fdHJhbXBvbGluZSk6IExpa2V3aXNlLgorCitGcmkgTm92IDI1IDEzOjM3OjEwIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY29mZnJlYWQuYywgc3ltZmlsZS5oIChjb2ZmX2dldGZpbGVuYW1lKTogIE1ha2UgaXQgc3RhdGljIGFnYWluLgorCSogeGNvZmZyZWFkLmMgKGNvZmZfZ2V0ZmlsZW5hbWUpOiAgVXNlIGEgc3RhdGljIGNvcHkgZnJvbQorCWNvZmZyZWFkLmMsIG1vZGlmaWVkIGZvciBhY2Nlc3NpbmcgdGhlIHN0YXRpYyB4Y29mZiBzdHJ0YmwuCisKK0ZyaSBOb3YgMjUgMDA6NTE6MDUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGEtdGRlcC5jIChpbl9zb2xpYl9jYWxsX3RyYW1wb2xpbmUpOiBSZWNvZ25pemUgY2FsbHMgdGhyb3VnaAorCV9zcjRleHBvcnQgYW5kICQkZHluY2FsbCBhcyB0cmFtcG9saW5lcy4gIExpa2V3aXNlIGZvciBsb25nLWNhbGwKKwlzdHVicyBhbmQgcGFyYW1ldGVyIHJlbG9jYXRpb24gc3R1YnMuCisJKGluX3NvbGliX3JldHVybl90cmFtcG9saW5lKTogUmVjb2duaXplIGEgcmV0dXJuIHRyYW1wb2xpbmUgZm9yCisJcmV0dXJuIHZhbHVlIHJlbG9jYXRpb24gc3R1YnMuCisKKwkqIGhwcmVhZC5jOiBJbmNsdWRlIGhwLXN5bXRhYi5oIGluc3RlYWQgb2YgaHB1eC1zeW10YWIuaC4KKwlWYXJpb3VzIG5hbWUgY2hhbmdlcyB0byBtYXRjaCB0aG9zZSB1c2VkIGJ5IGhwLXN5bXRhYi5oLgorCitUaHUgTm92IDI0IDAwOjM5OjI3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBibG9ja2ZyYW1lLmMgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbik6IEluaGliaXQgbXN0X3RyYW1wb2xpbmUKKwlzeW1ib2wgc3BlY2lhbCBoYW5kbGluZyB3aGVuIElOSElCSVRfU1VOU09MSUJfVFJBTlNGRVJfVEFCTEVfSEFDSworCWlzIGRlZmluZWQuCisJKiBpbmZydW4uYyAoSU5fU09MSUJfQ0FMTF9UUkFNUE9MSU5FKTogUmVuYW1lZCBmcm9tCisJSU5fU09MSUJfVFJBTVBPTElORS4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCisJKElOX1NPTElCX1JFVFVSTl9UUkFNUE9MSU5FKTogUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb24uCisJKHdhaXRfZm9yX2luZmVyaW9yKTogSGFuZGxlIHNpbmdsZSBzdGVwcGluZyB0aHJvdWdoIHRyYW1wb2xpbmVzIG9uCisJcmV0dXJuIHBhdGhzIGZyb20gc2hhcmVkIGxpYnJhcmllcy4KKwkqIGNvbmZpZy9wYS90bS1ocHBhLmggKElOX1NPTElCX0NBTExfVFJBTVBPTElORSk6IFVzZQorCWluX3NvbGliX2NhbGxfdHJhbXBvbGluZS4KKwkoSU5fU09MSUJfUkVUVVJOX1RSQU1QT0xJTkUpOiBVc2UgaW5fc29saWJfcmV0dXJuX3RyYW1wb2xpbmUuCisJKElOSElCSVRfU1VOU09MSUJfVFJBTlNGRVJfVEFCTEVfSEFDSyk6IERlZmluZS4KKwkqIGhwcGEtdGRlcC5jIChpbl9zb2xpYl9jYWxsX3RyYW1wb2xpbmUpOiBOZXcgZnVuY3Rpb24uCisJKGluX3NvbGliX3JldHVybl90cmFtcG9saW5lKTogTmV3IGZ1bmN0aW9uLgkKKworV2VkIE5vdiAyMyAyMTo0MzowMyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiB0bS1oODMwMC5oIChSRU1PVEVfQlJFQUtQT0lOVCk6IERlZmluZS4KKwkqIGg4MzAwLXRkZXAuYyAoaDgzMDBfcG9wX2ZyYW1lKTogUmVtb3ZlIHJlZHVuZGFudCBjYWxsLgorCisJKiByZW1vdGUtZTcwMDAuYyAoSEFSRF9CUkVBS1BPSU5UUyk6IFJlZW5hYmxlLgorCShCQ19CUkVBS1BPSU5UUyk6IERpc2FibGUuCisJKiBzaC10ZGVwLmMgKHByaW50X2luc24pOiBDb3BlIHdpdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzLgorCSogc2gvc2gubXQ6IFVzZSBsaWJzaW0uYQorCSogc2gvdG0tc2guaCAoVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRSk6IE5ldworCShCUkVBS1BPSU5UKTogQ2hhbmdlZCB0byBiZSBieXRlb3JkZXIgaW5kZXBlbmRlbnQuCisKK1R1ZSBOb3YgMjIgMTk6MTM6MzkgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJTWFpbnRlbmFuY2UgY29tbWFuZHMgdG8gcmVwb3J0IHRpbWUgYW5kIHNwYWNlIHVzYWdlLgorCSogbWFpbi5jIChkaXNwbGF5X3RpbWUsIGRpc3BsYXlfc3BhY2UpOiBOZXcgZ2xvYmFscy4KKwkobWFpbik6IEFkZCBhcmd1bWVudCAtLXN0YXRpc3RpY3MgdG8gZW5hYmxlIHJlcG9ydGluZywgZGlzcGxheQorCXRpbWUgYW5kIHNwYWNlIGFmdGVyIHN0YXJ0dXAgaXMgZG9uZS4KKwkqIG1haW50LmMgKG1haW50ZW5hbmNlX3RpbWVfZGlzcGxheSwgbWFpbnRlbmFuY2Vfc3BhY2VfZGlzcGxheSk6CisJTmV3IGNvbW1hbmRzLgorCSogdG9wLmMgKGNvbW1hbmRfbG9vcCk6IERpc3BsYXkgdGltZSBhbmQgc3BhY2UgYWZ0ZXIgY29tbWFuZAorCWV4ZWN1dGlvbi4KKworCSogdG9wLmMgKHByZV9pbml0X3VpX2hvb2spOiBOZXcgZ2xvYmFsLgorCShnZGJfaW5pdCk6IElmIHByZV9pbml0X3VpX2hvb2sgc2V0LCBjYWxsIGJlZm9yZSBhbGwgb3RoZXIgaW5pdC4KKworVHVlIE5vdiAyMiAxMDoyNTo1OSAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQorCisJKiBhMjlrLXRkZXAuYyAoZXhhbWluZV90YWcpOiBGaXggYSBidWcgaW4gc3RhY2sgZnJhbWUgc2l6ZS4KKworU2F0IE5vdiAxOSAwMzoxMDo1MSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNvbmZpZy9pMzg2L2kzODZzb2wyLm1oOiAgUmVlbmFibGUgY29yZSBmaWxlIHN1cHBvcnQuCisKKwkqIHN5bWZpbGUuYyAoZGVkdWNlX2xhbmd1YWdlX2Zyb21fZmlsZW5hbWUpOiAgVHJlYXQgLmMrKyBhcyBhCisJQysrIGV4dGVuc2lvbi4KKworCSogdmFsb3BzLmMgKGRlc3RydWN0b3JfbmFtZV9wKTogIERvIG5vdCBjb21wYXJlIHRoZSB0ZW1wbGF0ZQorCXBhcnQgZm9yIHRlbXBsYXRlIGNsYXNzZXMuCisKK0ZyaSBOb3YgMTggMTQ6NTU6NTkgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBkZWZzLmgsIGluZmNtZC5jIChyZWdfbmFtZXMpOiBEb24ndCBkZWNsYXJlIGFzIGNvbnN0YW50LgorCSogcmVtb3RlLW1pcHMuYyAobWlwc19vcGVuKTogUmVhZCBhbmQgc2V0IHRoZSBwcm9jZXNzb3IgdHlwZS4KKwkqIG1pcHMtdGRlcC5jIChtaXBzX3NldF9wcm9jZXNzb3JfdHlwZSk6IEFsd2F5cyByZXR1cm4gYW4gaW50LgorCitGcmkgTm92IDE4IDEwOjM4OjEyIDE5OTQgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogbmxtL2FscGhhLmMgKHN0cnRvbCk6IFJlbW92ZSwgaXQgaXMgcHJvdmlkZWQgYnkgTmV0V2FyZSBDIGxpYnJhcnkuCisJKiBubG0vZ2Ric2VydmUuZGVmIChzdHJ0b2wpOiBBZGQgdG8gaW1wb3J0IGxpc3QuCisJKiBubG0vZmFrZV9haW8uYzogUmVtb3ZlIGZpbGUsIG5vIGxvbmdlciB1c2VkLgorCisJKiBNYWtlZmlsZS5pbiAoTERfRk9SX1RBUkdFVCwgTkxNQ09OVl9GT1JfVEFSR0VUKTogUmVtb3ZlLgorCSogbmxtL01ha2VmaWxlLmluIChnZGJzZXJ2ZS5PKTogTGluayB3aXRoICR7Q0NfRk9SX1RBUkdFVH0uCisJKExEX0ZPUl9UQVJHRVQpOiBSZW1vdmUuCisKK1RodSBOb3YgMTcgMjI6MDk6NTAgMTk5NCAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgorCisJKiBtb25pdG9yLmgsIG1vbml0b3IuYywgdzg5ay1yb20uYywgb3A1MG4tcm9tLmMsIGlkcC1yb20uYzogQWRkCisJc3VwcG9ydAlmb3IgdHdvIHZhcmlhYmxlcyB1c2VkIHRvIGNvbnRyb2wgdGhlIGxvYWQgcHJvdG9jb2wgYW5kCisJY29udmVyc2lvbiB0eXBlLgorCitUaHUgTm92IDE3IDE3OjUxOjEyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCVN1cHBvcnQgZm9yIGRpZmZlcmVudCBNSVBTIElEVCBwcm9jZXNzb3IgbW9kZWxzLgorCSogbWlwcy10ZGVwLmMgKG1pcHNfcHJvY2Vzc29yX3R5cGUsIHRtcF9taXBzX3Byb2Nlc3Nvcl90eXBlLAorCW1pcHNfZ2VuZXJpY19yZWdfbmFtZXMsIG1pcHNfcjMwNDFfcmVnX25hbWVzLAorCW1pcHNfcjMwNTFfcmVnX25hbWVzLCBtaXBzX3IzMDgxX3JlZ19uYW1lcywKKwltaXBzX3Byb2Nlc3Nvcl90eXBlX3RhYmxlKTogTmV3CWdsb2JhbHMuCisJKG1pcHNfZG9fcmVnaXN0ZXJzX2luZm8pOiBEb24ndCBkaXNwbGF5IHJlZ2lzdGVyIGlmIG5hbWUgaXMgZW1wdHkuCisJKG1pcHNfc2V0X3Byb2Nlc3Nvcl90eXBlX2NvbW1hbmQpOiBOZXcgY29tbWFuZC4KKwkobWlwc19zaG93X3Byb2Nlc3Nvcl90eXBlX2NvbW1hbmQpOiBOZXcgY29tbWFuZC4KKwkobWlwc19zZXRfcHJvY2Vzc29yX3R5cGUpOiBOZXcgZnVuY3Rpb24uCisJKG1pcHNfcmVhZF9wcm9jZXNzb3JfdHlwZSk6IE5ldyBmdW5jdGlvbi4KKwkqIGNvbmZpZy9taXBzL3RtLWlkdC5oIChERUZBVUxUX01JUFNfVFlQRSk6IE5ldyBtYWNyby4KKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaCAoREVGQVVMVF9NSVBTX1RZUEUpOiBOZXcgbWFjcm8uCisJKE5VTV9SRUdTKTogSW5jcmVhc2UgdG8gYWNjb3VudCBmb3IgYWxsIENQMCByZWdpc3RlcnMuCisJKFJFR0lTVEVSX05BTUVTKTogQWRkIGVtcHR5IG5hbWVzIGZvciBDUDAgcmVnaXN0ZXJzLgorCShGSVJTVF9FTUJFRF9SRUdOVU0sIExBU1RfRU1CRURfUkVHTlVNKTogQWRqdXN0LgorCShQUklEX1JFR05VTSk6IE5ldyBtYWNyby4KKworV2VkIE5vdiAxNiAxNjo0MTo1MiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIFJFQURNRTogQWRkIHdhcm5pbmcgYWJvdXQgdGVybWNhcCBpbiBVbHRyaXggYW5kIE9TRi8xLgorCitXZWQgTm92IDE2IDE1OjI4OjI5IDE5OTQgIFJvYiBTYXZveWUgIChyb2JAY3lnbnVzLmNvbSkKKworCisJKiBocHBhLXRkZXAuYzogUmVtb3ZlIGluY2x1ZGluZyBzeXMvZGlyLmggZnJvbSBhIHRhcmdldCBmaWxlLgorCitXZWQgTm92IDE2IDEwOjMxOjI3IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BjeWdudXMuY29tKQorCisJKiBjb25maWcvcG93ZXJwYy9nZGJzZXJ2ZS5tdCAoVERFUEZJTEVTKTogUmVtb3ZlIGZha2VfYWlvLm8uCisKKwkqIG5sbS9nZGJzZXJ2ZS5jOiBJbmNsdWRlIDxud3R5cGVzLmg+IGJlZm9yZSBvdGhlciBOZXRXYXJlIGhlYWRlcnMuCisJKiBubG0vcHBjLmM6IExpa2V3aXNlLiAKKworCSogbmxtL3BwYy5jIChzdHJ0b2wpOiBSZW1vdmUsIGl0IGlzIHByb3ZpZGVkIGJ5IE5ldFdhcmUgQyBMaWJyYXJ5LgorCShTdG9wQmVsbCk6IE5ldyBmdW5jdGlvbiAoc3R1YmJlZCBvdXQpLgorCitXZWQgTm92IDE2IDAwOjEyOjIxIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBocHBhLXRkZXAuYyAoc2tpcF90cmFtcG9saW5lX2NvZGUpOiBIYW5kbGUgc2hhcmVkIGxpYnJhcnkgaW1wb3J0CisJdHJhbXBvbGluZXMuCisKK1R1ZSBOb3YgMTUgMTY6MTg6NTIgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKKworCSogYy1leHAueSAoeXlsZXgpOiBGaXggYSBidWcgaW4gdGVtcGxhdGUgc2Nhbm5pbmcuCisKK1R1ZSBOb3YgMTUgMTQ6MjU6NDcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBpMzg2LXN0dWIuYywgbTY4ay1zdHViLmMsIHNwYXJjLXN0dWIuYywgc3BhcmNsLXN0dWIuYzogTWFzayBvdXQKKwl0aGUgdG9wIGJpdCByZXR1cm5lZCBieSBnZXREZWJ1Z0NoYXIuCisKK1R1ZSBOb3YgMTUgMDE6MDM6NTYgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBzbGlwa25vdC5jeWdudXMuY29tKQorCisJKiBvcDUwLXJvbS5jLCB3ODlrLXJvbS5jLCBtb25pdG9yLmM6IE1vZGlmeSB0byB1c3IgdHdvIHZhcmlhYmxlcworCXRvIHNldCByZW1vdGUgbG9hZCB0eXBlIGFuZCBwcm90b2NvbC4KKwkqIHJvbTY4ay1yb20uYzogQWRkIHRvX3N0b3AgaW4gdGFyZ2V0X29wcy4KKworCitTYXQgTm92IDEyIDIxOjU1OjQ3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb21zb2xpYi5jOiBBZGQgVE9ETyBsaXN0LgorCShzb21fc29saWJfYWRkKTogSW1tZWRpYXRlbHkgcmV0dXJuIGlmICRTSExJQl9JTkZPJCBzZWN0aW9ucyBkb2VzCisJbm90IGV4aXN0IG9yIGhhcyBzaXplIHplcm8uICBTbGlnaHRseSBzaW1wbGlmeSBlcnJvciBoYW5kbGluZy4KKwlLZWVwIGFuIGludGVybmFsIGxpc3Qgb2YgYWxsIHRoZSBsb2FkZWQgc2hhcmVkIGxpYnJhcmllcyBhbmQKKwl2YXJpb3VzIHRpZGJpdHMgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvYWRlZCBzaGFyZWQgbGlicmFyaWVzLgorCUJ1aWxkIHNlY3Rpb24gdGFibGVzIGZvciBlYWNoIGxvYWRlZCBzaGFyZWQgbGlicmFyeSBhbmQgYWRkIHRob3NlCisJdGFibGVzIHRvIHRoZSBjb3JlIHRhcmdldCBpZiBuZWNlc3NhcnkuCisJKHNvbV9zb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vayk6IEZvcmNlIHJlLXJlYWRpbmcgb2Ygc2hhcmVkCisJbGlicmFyaWVzIGF0IGV4ZWMgdGltZS4KKwkoc29tX3NoYXJlZGxpYnJhcnlfaW5mb19jb21tYW5kKTogTmV3IGZ1bmN0aW9uIGZvciBkdW1waW5nCisJaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnRseSBsb2FkZWQgc2hhcmVkIGxpYnJhcmllcy4KKwkoX2luaXRpYWxpemVfc29tX3NvbGliKTogTmV3IGZ1bmN0aW9uLgorCitTYXQgTm92IDEyIDAyOjI2OjUwIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogTWFrZWZpbGUuaW4gKGNvcHlpbmcubywgZi1leHAudGFiLm8sIGRweDItbmF0Lm8sIGRzdHJlYWQubywKKwlpMzg2YWl4LW5hdC5vLCBpMzg2bTMtbmF0Lm8sIGlyaXg1LW5hdC5vLCBseW54LW5hdC5vLCBtMy1uYXQubywKKwltaXBzbTMtbmF0Lm8sIG5zMzJrbTMtbmF0Lm8sIHJlbW90ZS1lNzAwMC5vLCByZW1vdGUtb3M5ay5vKToKKwlBZGQgZGVwZW5kZW5jaWVzLgorCShjb3B5aW5nLm8sIG9zOWtyZWFkLm8sIHJlbW90ZS5vKTogIFVwZGF0ZSBkZXBlbmRlbmNpZXMuCisKKwkqIHZhbGFyaXRoLmMgKHZhbHVlX3N1Yik6ICBXaGVuIHN1YnRyYWN0aW5nIHBvaW50ZXJzLCBvbmx5CisJY2hlY2sgZm9yIGEgbWF0Y2ggb2YgdGhlIHBvaW50ZWQgdG8gZWxlbWVudCBsZW5ndGhzLgorCUNhc3QgZWxlbWVudCBsZW5ndGggdG8gTE9OR0VTVCB0byBvYnRhaW4gYSBzaWduZWQgcmVzdWx0IGZvcgorCXBvaW50ZXIgc3VidHJhY3Rpb25zLgorCitGcmkgTm92IDExIDEwOjUxOjA3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjaC1leHAueSAoeXlsZXgpOiBGaXggb2ZmLWJ5LW9uZSBlcnJvciB3aGVuIGNvbnZlcnRpbmcgc3RyaW5nIHRvCisJbG93ZXJjYXNlLiAgTnVsbCB0ZXJtaW5hdGUgbmV3IHN0cmluZy4KKworCSogaHBwYS10ZGVwLmMgKHJwX3NhdmVkKTogSGFuZGxlIElNUE9SVCBzdHVicyB0b28uCisKKwkqIHNvbXNvbGliLmMgKHNvbV9zb2xpYl9hZGQpOiBDaGVjayB0aGUgdmFsdWUgb2YgX19kbGRfZmxhZ3MsIGlmCisJaXQgaW5kaWNhdGVzIF9fZGxkX2xpc3QgaXMgbm90IHZhbGlkIHJldHVybiBhbiBlcnJvci4gIElmIGl0CisJaW5kaWNhdGVzIHRoYXQgbGlicmFyaWVzIHdlcmUgbm90IG1hcHBlZCBwcml2YXRlbHksIGlzc3VlIGEKKwl3YXJuaW5nLgorCitUaHUgTm92IDEwIDIzOjE3OjQ1IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogc3ltZmlsZS5jIChzeW1zX2Zyb21fb2JqZmlsZSk6IE9ubHkgY2FsbCBmaW5kX2xvd2VzdF9zZWN0aW9uIGlmCisJbm8gIi50ZXh0IiBzZWN0aW9uIGV4aXN0cy4KKworVGh1IE5vdiAxMCAxNToxNjoyMSAxOTk0ICBSb2IgU2F2b3llICA8cm9iQHJ0bC5jeWdudXMuY29tPgorCisJKiByb202OGstcm9tLmM6IE5ldyBmaWxlLiBSZXBsYWNlcyB0aGUgb2xkIHJlbW90ZS1tb24uYyBhbmQgdXNlcworCXRoZSBuZXcgZ2VuZXJpYyBST00gaW50ZXJmYWNlIGluIG1vbml0b3IuYy4KKwkqIGNvbmZpZy9tNjhrL21vbml0b3IubXQ6IFVzZSBuZXcgUk9NIHN1cHBvcnQuCisJKiBtb25pdG9yLmM6IEFkZCBzdXBwb3J0IGZvciB4bW9kZW0gZG93bmxvYWQgcHJvdG9jb2wuCisKK1dlZCBOb3YgIDkgMTg6NDY6MjQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBmaW5kdmFyLmMgKGZpbmRfc2F2ZWRfcmVnaXN0ZXIpOiBGaXggYSBmcmFtZSB2YXJpYWJsZSBuYW1lLgorCSogaW5mY21kLmMgKGZpbmlzaF9jb21tYW5kKTogRGl0dG8uCisKK1R1ZSBOb3YgIDggMTM6MjA6MTQgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIFRPRE86IFJlbW92ZSAiV2F0Y2hwb2ludHMgc2VlbSBub3QgZW50aXJlbHkgcmVsaWFibGUsIHRob3VnaAorCXRoZXkgaGF2ZW4ndCBmYWlsZWQgbWUgcmVjZW50bHkuIiBpdGVtLS10aGlzIG9sZCAoNC42IGF0IGxlYXN0KQorCWl0ZW0gaXMgdG9vIHZhZ3VlIHRvIGJlIHVzZWZ1bCAoc29tZSB3YXRjaHBvaW50IGJ1Z3MgaGF2ZSBiZWVuCisJZml4ZWQgc2luY2UgdGhlbikuCisJKiBUT0RPOiBBZGQgZXhwbGFuYXRpb24gb2YgIlJQQyBpbnRlcmZhY2UiIGl0ZW0uCisKK01vbiBOb3YgIDcgMjI6MjU6MjEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGEtdGRlcC5jIChyZWFkX3Vud2luZF9pbmZvKTogVXNlICJ0ZXh0X29mZnNldCIgZm9yIGxpbmtlcgorCXN0dWIgdW53aW5kIGRlc2NyaXB0b3JzIHRvby4KKworCSogRW5hYmxlIGJhY2t0cmFjaW5nIGZyb20gaW5zaWRlIGEgU09NIHNoYXJlZCBsaWJyYXJ5IGJhY2sgaW50bworCXVzZXIgY29kZS4KKwkqIGhwcGEtdGRlcC5jIChpbnRlcm5hbGl6ZV91bndpbmRzKTogQWNjZXB0IGFuZCB1c2UgbmV3CisJInRleHRfb2Zmc2V0IiBhcmd1bWVudCBmb3IgZHluYW1pYyByZWxvY2F0aW9uIG9mCisJcmVnaW9uX3tzdGFydCxlbmR9IGZpZWxkcyBpbiB0aGUgdW53aW5kIGRlc2NyaXB0b3IuCisJKHJlYWRfdW53aW5kX2luZm8pOiBQYXNzIHRleHRfb2Zmc2V0IHRvIGludGVybmFsaXplIHVud2luZHMuCisKK01vbiBOb3YgIDcgMTQ6MzQ6NDIgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIG0zLW5hdC5jOiBSZW1vdmUgY29tbWVudHMgYWJvdXQgYXJiaXRyYXJ5IGxpbWl0IGluCisJcHJpbnRmX2ZpbHRlcmVkOyB0aGF0IGxpbWl0IGlzIGdvbmUuCisKK01vbiBOb3YgIDcgMDA6Mjc6MTYgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIEJlZ2lubmluZ3Mgb2YgU09NIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuICBCcmVha3BvaW50cyBhbmQKKwlzaW5nbGUgZnJhbWUgYmFja3RyYWNpbmcgd2l0aGluIHRoZSBsaWJyYXJ5IG9ubHkuICBPbmx5IHdvcmtzIHdoZW4KKwl1c2luZyB0aGUgSFBVWCA5IGR5bmFtaWMgbGlua2VyLiAgTW9yZSBmdW5jdGlvbmFsaXR5IHRvIGJlIGFkZGVkCisJc29vbi4KKworCSogc29tc29saWIuYywgc29tc29saWIuaDogTmV3IGZpbGVzLgorCSogTWFrZWZpbGUuaW4gKEhGSUxFU19OT19TUkNESVIpOiBBZGQgc29tc29saWIuaAorCShBTExERVBGSUxFUyk6IEFkZCBzb21zb2xpYi5jLgorCShzb21zb2xpYi5vKTogQWRkIHNvbWUgZGVwZW5kZW5jaWVzLgorCSogc29tcmVhZC5jIChzb21fc3ltdGFiX3JlYWQpOiBBY2NlcHQgbXVsdGlwbGUgc2VjdGlvbiBvZmZzZXRzLgorCUFsbCBjYWxsZXJzIGNoYW5nZWQuICBBZGp1c3QgYWxsIHRleHQgc3ltYm9scyB3aXRoIHRoZSBmaXJzdAorCXNlY3Rpb24gb2Zmc2V0LgorCSogc3ltZmlsZS5jIChmaW5kX2xvd2VzdF9zZWN0aW9uKTogRW5hYmxlIHRoaXMgZnVuY3Rpb24uICBBZGQgc29tZQorCXRpZS1icmVha2luZyBsb2dpYyB3aGVuIHNlY3Rpb25zIGhhdmUgdGhlIHNhbWUgdm1hLgorCShzeW1zX2Zyb21fb2JqZmlsZSk6IFVzZSBmaW5kX2xvd2VzdF9zZWN0aW9uIHJhdGhlciB0aGFuIGxvb2tpbmcKKwlmb3IgIi50ZXh0IiBieSBuYW1lLiAgUmVsYXggd2FybmluZyB0byBvbmx5IHdhcm4gaWYgdGhlIGxvd2VzdAorCXNlY3Rpb24gaXMgbm90IGEgY29kZSBzZWN0aW9uLgorCSogY29uZmlnL3BhL3tocHBhYnNkLm1oLCBocHBhaHB1eC5taH0gKE5BVERFUEZJTEVTKTogQWRkIHNvbXNvbGliLm8KKwkqIGNvbmZpZy9wYS97bm0taHBwYWIuaCwgbm0taHBwYWguaH06IEluY2x1ZGUgc29tc29saWIuaC4KKwkKK1N1biBOb3YgIDYgMTI6NTQ6NTQgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHBhcnRpYWwtc3RhYi5oIChOX1RFWFQpOiBQdXQgYmFjayBHREJfVEFSR0VUX0lTX0hQUEEga2x1ZGdlLAorCWl0IGlzIHN0aWxsIG5lZWRlZCBmb3IgR0NDLTIuNiBjb21waWxlZCBjb2RlLgorCSogVE9ETyAoR0RCX1RBUkdFVF9JU19IUFBBKTogTm90ZSB0aGlzIGtsdWRnZSBjYW4gYmUgbnVrZWQKKwlzb21ldGltZSBhZnRlciBHQ0MtMi43IGhhcyBiZWVuIHJlbGVhc2VkLgorCisJKiBocHBhLXRkZXAuYyAoZnJhbWVfc2F2ZWRfcGMpOiBNYXNrIG9mZiBsb3cgdHdvIGJpdHMgd2hlbgorCXJldHJpZXZpbmcgdGhlIFBDIGZyb20gYSBzaWduYWwgaGFuZGxlciBjYWxsZXIuICBGaXggdGhpbmtvCisJaW4gU3RhbidzIGxhc3QgY2hhbmdlICgiZnJhbWUiLCBzaG91bGQgaGF2ZSBiZWVuICJmcmFtZS0+bmV4dCIpLgorCUlmIHRoZSBuZXh0IGZyYW1lIGlzIGEgc2lnbmFsIGhhbmRsZXIgY2FsbGVyIGFuZCBpdCdzIGEgc3lzdGVtCisJY2FsbCB3aGljaCBoYXMgZW50ZXJlZCB0aGUga2VybmVsICgoUFNXICYgMHgyKSAhPSAwKSwgdGhlbiB0aGUKKwlzYXZlZCBwYyBpcyBpbiAlcjIgaW5zdGVhZCBvZiAlcjMxLgorCQorRnJpIE5vdiAgNCAyMzo0NzowNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHBwYS10ZGVwLmMgKGhwcGFfZnJhbWVfZmluZF9zYXZlZF9yZWdzKTogQ2hhbmdlICJmcmFtZSIgdG8KKwkiZnJhbWVfaW5mbyIgdGhyb3VnaG91dC4KKworRnJpIE5vdiAgNCAxNjoyNjo1OSAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQorCisJKiBzcGFyY2wtc3R1Yi5jOiBnZXQgcmlkIG9mIGRlZnMuaC4KKworRnJpIE5vdiAgNCAxMzoxMTo1NCAxOTk0ICBKaW0gS2luZ2RvbiAgPGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbT4KKworCSogZ2Ric2VydmVyL01ha2VmaWxlLmluIChNTUFMTE9DX0NGTEFHUyk6IEFkZCAtSSR7TU1BTExPQ19ESVJ9LgorCUNvcnJlY3QgZGVmaW5pdGlvbiBvZiBNTUFMTE9DX0RJUiB0byByZWZsZWN0IGZhY3QgdGhpcyBpcworCWdkYi9nZGJzZXJ2ZXIvTWFrZWZpbGUuaW4sIG5vdCBnZGIvTWFrZWZpbGUuaW4uCisKKwkqIGdkYnNlcnZlci9zZXJ2ZXIuYyAobWFpbik6IEFmdGVyIHdlIGtpbGwgdGhlIGluZmVyaW9yIGluCisJcmVzcG9uc2UgdG8gYSAnaycgcmVxdWVzdCwgZXhpdC4KKworCSogcmVtb3RlLmMgKHJlbW90ZV9raWxsKTogVXNlIGNhdGNoX2Vycm9ycyB3aGVuIGNhbGxpbmcgcHV0cGt0LgorCShwdXRwa3QpOiBSZXR1cm4gaW50LCBub3Qgdm9pZCwgdG8gbWF0Y2ggY2F0Y2hfZXJyb3JzIGNhbGxpbmcKKwljb252ZW50aW9uLgorCitGcmkgTm92ICA0IDEwOjUyOjM4IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogcnM2MDAwLXRkZXAuYyAocG9wX2ZyYW1lKTogQ29ycmVjdCBhIHZhcmlhYmxlIG5hbWUuCisKK0ZyaSBOb3YgIDQgMDU6NDM6MzUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIFRPRE86IFJlLXdyaXRlIGl0ZW0gYWJvdXQgU0lHSU5UIGhhbmRsaW5nIHRvIHJlZmxlY3QgdGhlIGZhY3QKKwl0aGF0IHRhcmdldF9zdG9wIG5vdyBleGlzdHMuCisKK1RodSBOb3YgIDMgMTU6MTk6MTcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJUmVwbGFjZSB1c2VsZXNzIEZSQU1FLCBGUkFNRV9BRERSIHR5cGVzIHdpdGggc3RydWN0IGZyYW1lX2luZm8gKgorCWFuZCBDT1JFX0FERFIsIHJlc3BlY3RpdmVseS4KKwkqIGZyYW1lLmggKEZSQU1FLCBGUkFNRV9JTkZPX0lELCBGUkFNRV9BRERSKTogUmVtb3ZlLgorCSogYmxvY2tmcmFtZS5jIChnZXRfZnJhbWVfaW5mbyk6IFJlbW92ZS4KKwkqIGEyOWstdGRlcC5jLCBhbHBoYS10ZGVwLmMsIGJsb2NrZnJhbWUuYywgYnJlYWtwb2ludC5jLAorCWJyZWFrcG9pbnQuaCwgZW5lcmdpemUuYywgZmluZHZhci5jLCBnb3VsZC1waW5zbi5jLAorCWg4MzAwLXRkZXAuYywgaDg1MDAtdGRlcC5jLCBocHBhLXRkZXAuYywgaTM4Ni10ZGVwLmMsIGk5NjAtdGRlcC5jLAorCWluZmNtZC5jLCBpbmZlcmlvci5oLCBpbmZydW4uYywgbTY4ay10ZGVwLmMsIG04OGstdGRlcC5jLAorCW1pcHMtdGRlcC5jLCBuaW5keS10ZGVwLmMsIHByaW50Y21kLmMsIHB5ci10ZGVwLmMsIHJzNjAwMC10ZGVwLmMsCisJc2gtdGRlcC5jLCBzcGFyYy10ZGVwLmMsIHN0YWNrLmMsIHZhbG9wcy5jLCB6OGstdGRlcC5jLAorCWNvbmZpZy9hMjlrL3RtLWEyOWsuaCwgY29uZmlnL2FscGhhL3RtLWFscGhhLmgsCisJY29uZmlnL2dvdWxkL3RtLXBuLmgsIGNvbmZpZy9oODMwMC90bS1oODMwMC5oLAorCWNvbmZpZy9oODUwMC90bS1oODUwMC5oLCBjb25maWcvbWlwcy90bS1taXBzLmgsCisJY29uZmlnL25zMzJrL3RtLW1lcmxpbi5oLCBjb25maWcvbnMzMmsvdG0tdW1heC5oLAorCWNvbmZpZy9weXIvdG0tcHlyLmgsIGNvbmZpZy9zcGFyYy90bS1zcGFyYy5oKTogUmVwbGFjZSBGUkFNRSB3aXRoCisJc3RydWN0IGZyYW1lX2luZm8gKiBldmVyeXdoZXJlLCByZXBsYWNlIEZSQU1FX0FERFIgd2l0aCBDT1JFX0FERFIsCisJcmVuYW1lIHZhcmlhYmxlcyBjb25zaXN0ZW50bHkgKHVzaW5nIGBmcmFtZScgb3IgYGZpJyksIHJlbW92ZQorCWNhbGxzIHRvIGdldF9mcmFtZV9pbmZvIGFuZCBGUkFNRV9JTkZPX0lELCByZW1vdmUgY29tbWVudHMgYWJvdXQKKwlGUkFNRSBhbmQgRlJBTUVfQUREUiBjcnVmdGluZXNzLgorCitUaHUgTm92ICAzIDE0OjI1OjI0IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGNvcmVsb3cuYywgZXhlYy5jLCBpbmZ0YXJnLmMsIG0zLW5hdC5jLCBvcDUwLXJvbS5jLCBwcm9jZnMuYywKKwlyZW1vdGUtYWRhcHQuYywgcmVtb3RlLWU3MDAwLmMsIHJlbW90ZS1lYi5jLCByZW1vdGUtZXMuYywKKwlyZW1vdGUtaG1zLmMsIHJlbW90ZS1taXBzLmMsIHJlbW90ZS1tbS5jLCByZW1vdGUtbW9uLmMsCisJcmVtb3RlLW5pbmR5LmMsIHJlbW90ZS1vczlrLmMsIHJlbW90ZS1wYS5jLCByZW1vdGUtc2ltLmMsCisJcmVtb3RlLXN0LmMsIHJlbW90ZS11ZGkuYywgcmVtb3RlLXZ4LmMsIHJlbW90ZS16OGsuYywgcmVtb3RlLmMsCisJdzg5ay1yb20uYywgdGFyZ2V0LmMsIHRhcmdldC5oOiAgQWRkIHN1cHBvcnQgZm9yIHRhcmdldF9zdG9wKCkuCisKK1RodSBOb3YgIDMgMDE6MjM6NDUgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBvc2Zzb2xpYi5jIChzb2xpYl9tYXBfc2VjdGlvbnMsIGZpcnN0X2xpbmtfbWFwX21lbWJlciwKKwluZXh0X2xpbmtfbWFwX21lbWJlciwgeGZlcl9saW5rX21hcF9tZW1iZXIpOiAgUmV0cmlldmUgYW5kIHVzZQorCXNoYXJlZCBsaWJyYXJ5IHJlbG9jYXRpb24gb2Zmc2V0IGZyb20gcnVudGltZSBsb2FkZXIgc3RydWN0dXJlcy4KKwlVc2UgbGlieHByb2MuYSByb3V0aW5lcyB0byBnZXQgYSB3b3JraW5nIHZlcnNpb24gaWYKKwlVU0VfTERSX1JPVVRJTkVTIGlzIGRlZmluZWQuCisJKiBSRUFETUU6ICBSZW1vdmUgaXRlbSBhYm91dCBzaGFyZWQgbGlicmFyeSByZWxvY2F0aW9uIGZvcgorCUFscGhhIE9TRi8xLgorCitXZWQgTm92ICAyIDE1OjA1OjM5IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCisKKwkqIGMtZXhwLnkgKHl5bGV4KTogc2NhbiB0ZW1wbGF0ZSBuYW1lcywgYW5kIHNjYW4gbmVzdGVkIGNsYXNzCisJbmFtZXMuCisKK1dlZCBOb3YgIDIgMTE6MDE6NTUgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQorCisJKiBubG0vTWFrZWZpbGUuaW46IGluc3RhbGwgZ2Ric2VydmUubmxtLgorCisKK1R1ZSBOb3YgIDEgMTM6MDA6NDYgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjLXZhbHByaW50LmMgKGNfdmFsdWVfcHJpbnQpOiAgQ2hlY2sgZm9yIHBsYWluIGxpdGVyYWwgYGNoYXInCisJdGFyZ2V0IHR5cGUgd2hlbiBzdXBwcmVzc2luZyBgKGNoYXIgKiknIG91dHB1dCBmb3Igc3RyaW5ncy4KKworTW9uIE9jdCAzMSAxOToxOTo1MSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGNvZmZyZWFkLmMgKGNvZmZfc3ltZmlsZV9pbml0KTogUmVtb3ZlIHVudXNlZCBsb2NhbCBhYmZkLgorCSogdXRpbHMuYyBbTk9fTU1BTExPQ10gKG1tYWxsb2MsIG1yZWFsbG9jKTogRGVmaW5lIGFuZCB1c2Ugc2l6ZV90CisJaW5zdGVhZCBvZiBsb25nLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1tYWxsb2MuaC4KKworU2F0IE9jdCAyOSAwMjo0MDo0MCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIHRvcC5jIChsaW5lX2NvbXBsZXRpb25fZnVuY3Rpb24pOiAgUmVuYW1lZCBmcm9tCisJc3ltYm9sX2NvbXBsZXRpb25fZnVuY3Rpb24sIHRha2VzIHRoZSBsaW5lIGJ1ZmZlciBhbmQgdGhlCisJcG9pbnQgaW4gdGhlIGxpbmUgYnVmZmVyIGFzIGFkZGl0aW9uYWwgYXJndW1lbnRzLgorCShyZWFkbGluZV9saW5lX2NvbXBsZXRpb25fZnVuY3Rpb24pOiAgTmV3IGZ1bmN0aW9uLCBpbnRlcmZhY2UKKwliZXR3ZWVuIHJlYWRsaW5lIGFuZCBsaW5lX2NvbXBsZXRpb25fZnVuY3Rpb24uCisJKGluaXRfbWFpbik6ICBVc2UgaXQuCisJKGNvbXBsZXRlX2NvbW1hbmQpOiAgVXNlIGxpbmVfY29tcGxldGlvbl9mdW5jdGlvbiBpbnN0ZWFkIG9mCisJYWJ1c2luZyBybF9saW5lX2J1ZmZlci4gRnJlZSBjb21wbGV0aW9uIHN0cmluZ3MgYWZ0ZXIgcHJpbnRpbmcKKwl0aGVtLgorCSogc3ltdGFiLmMgKGNvbXBsZXRpb25fbGlzdF9hZGRfbmFtZSk6ICBSZWNoZWNrIGZvciBkdXBsaWNhdGVzCisJaWYgd2UgaW50ZW5kIHRvIGFkZCBhIG1vZGlmaWVkIHN5bWJvbC4KKworCSogZ2RidHlwZXMuaCAoY3BsdXNfc3RydWN0X3R5cGUpOiAgbmZuX2ZpZWxkc190b3RhbCBubyBsb25nZXIKKwlpbmNsdWRlcyB0aGUgbnVtYmVyIG9mIG1ldGhvZHMgZnJvbSB0aGUgYmFzZWNsYXNzZXMuCisJKiBzdGFic3JlYWQuYyAoYXR0YWNoX2ZuX2ZpZWxkc190b190eXBlKTogIE5vIGxvbmdlciBhZGQgdGhlCisJbnVtYmVyIG9mIG1ldGhvZHMgZnJvbSB0aGUgYmFzZWNsYXNzZXMgdG8gVFlQRV9ORk5fRklFTERTX1RPVEFMLAorCXRoZSBiYXNlY2xhc3MgdHlwZSBtaWdodCBub3QgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgZmlsbGVkIGluIHlldC4KKwkqIHN5bXRhYi5jICh0b3RhbF9udW1iZXJfb2ZfbWV0aG9kcyk6ICBOZXcgZnVuY3Rpb24gdG8gY29tcHV0ZQorCXRoZSB0b3RhbCBudW1iZXIgb2YgbWV0aG9kcyBmb3IgYSB0eXBlLCBpbmNsdWRpbmcgdGhlIG1ldGhvZHMKKwlmcm9tIGJhc2VjbGFzc2VzLgorCShkZWNvZGVfbGluZV8xKTogIFVzZSBpdCBpbnN0ZWFkIG9mIFRZUEVfTkZOX0ZJRUxEU19UT1RBTCB0bworCWFsbG9jYXRlIHRoZSBzeW1ib2wgYXJyYXkgZm9yIGZpbmRfbWV0aG9kcy4KKworCSogc3RhYnNyZWFkLmMgKHNjYW5fZmlsZV9nbG9iYWxzKTogIEFkZCBkZWZhdWx0IGNhc2UgdG8gbWluaW1hbAorCXN5bWJvbCB0eXBlIHN3aXRjaCwgdG8gYXZvaWQgZ2NjIC1XYWxsIHdhcm5pbmdzLgorCisJKiBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oIChJTklUX0VYVFJBX0ZSQU1FX0lORk8pOgorCURvbid0IHRlc3QgZm9yIHplcm8gYmFja2NoYWluIHBvaW50ZXIgdG8gcmVjb2duaXplIGEgc2lnbmFsCisJaGFuZGxlciBmcmFtZSwgaWYgcmVhZCgpIGdldHMgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwsIHRoZQorCWJhY2tjaGFpbiB3aWxsIGJlIG5vbiB6ZXJvLgorCShTSUdfRlJBTUVfRlBfT0ZGU0VUKTogIE1vdmUgdG8gaGVyZSBmcm9tIHJzNjAwMC10ZGVwLmMsCisJaW1wcm92ZSBjb21tZW50LgorCShTSUdfRlJBTUVfUENfT0ZGU0VUKTogIE5ldyBkZWZpbml0aW9uLgorCShGUkFNRV9TQVZFRF9QQyk6ICBSZXR1cm4gc2F2ZWQgcGMgZnJvbSBzaWdjb250ZXh0IGlmIHRoaXMKKwlpcyBhIHNpZ25hbCBoYW5kbGVyIGZyYW1lLgorCSogcnM2MDAwLXRkZXAuYyAoZnVuY3Rpb25fZnJhbWVfaW5mbyk6ICBEbyBub3QgZXJyb3Igb3V0CisJaWYgd2UgY2FuJ3QgYWNjZXNzIHRoZSBpbnN0cnVjdGlvbnMuCisKKwkqIGNvbmZpZy9yczYwMDAvdG0tcnM2MDAwLmggKENPTlZFUlRfRlJPTV9GVU5DX1BUUl9BRERSKToKKwlOZXcgZGVmaW5pdGlvbiB0byBnZXQgdGhlIGZ1bmN0aW9uIGFkZHJlc3MgZnJvbSBhIGZ1bmN0aW9uIHBvaW50ZXIuCisJKiB2YWxvcHMuYyAoZmluZF9mdW5jdGlvbl9hZGRyKTogIFVzZSBpdCB3aGVuIGNhbGxpbmcgYSB1c2VyCisJZnVuY3Rpb24gdGhyb3VnaCBhIGZ1bmN0aW9uIHBvaW50ZXIuCisKK0ZyaSBPY3QgMjggMTY6MTY6NTIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoTU1BTExPQ19ESVIpOiBOZXcgZGVmaW5pdGlvbi4KKwkoTU1BTExPQyk6IFVzZSBNTUFMTE9DX0RJUi4KKwkoTU1BTExPQ19DRkxBR1MpOiBMb29rIGluIE1NQUxMT0NfRElSIGZvciBtbWFsbG9jLmguCisJKE9QQ09ERVMpOiBSZW1vdmUgZ3JhdHVpdG91cyAiLi8iLgorCSogZGVmcy5oIChtbWFsbG9jLmgpOiBJbmNsdWRlLgorCShtbWFsbG9jLCBtcmVhbGxvYywgZXRjKTogUmVtb3ZlIGRlY2xzLgorCShjcGx1c19kZW1hbmdsZSwgY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogUmVtb3ZlIGRlY2xzLgorCitXZWQgT2N0IDI2IDE1OjQxOjA3IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGRlZnMuaCwgbWFpbi5jLCB0b3AuYzogIENoYW5nZSBzZW5zZSBhbmQgbmFtZSBvZgorCW5vX3dpbmRvd3MgdmFyaWFibGUuICBOb3cgY2FsbGVkIHVzZV93aW5kb3dzLCBhbmQgZGVmYXVsdHMgdG8gb2ZmCisJKGZvciBjb21wYXRpYmlsaXR5KS4KKworV2VkIE9jdCAyNiAxMjoyMDo1MyAxOTk0ICBKaW0gS2luZ2RvbiAgPGtpbmdkb25AY3lnbnVzLmNvbT4KKworCSogY29mZnJlYWQuYyAoY29mZl9zeW10YWJfcmVhZCk6IElmIHdlIGdldCB0aGUgYWRkcmVzcyBmcm9tCisJdGFyZ2V0X2xvb2t1cF9zeW1ib2wsIHNldCB0aGUgc2VjdGlvbiB0byAtMiBub3QgU0VDVF9PRkZfQlNTLgorCShjb2ZmX3N5bXRhYl9yZWFkKTogU2V0IHZhbHVlIGFuZCBzZWN0aW9uIG9mIHN5bWJvbCB0aGF0CisJcHJvY2Vzc19jb2ZmX3N5bWJvbCByZXR1cm5zLgorCitUdWUgT2N0IDI1IDA5OjUzOjA0IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2kzODYvdG0tbmJzZC5oOiBFbmFibGUgbG9uZ2ptcCBzdXBwb3J0LgorCitTYXQgT2N0IDIyIDAzOjQxOjEzIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogdmFsYXJpdGguYyAodmFsdWVfYmlub3ApOiAgVGFrZSBjYXJlIG9mIEFOU0kgYHZhbHVlIHByZXNlcnZpbmcnCisJcnVsZSwgd2hpY2ggd2FzIG5vdCBhZGRyZXNzZWQgYnkgdGhlIHByZXZpb3VzIGNoYW5nZS4KKworCSogcnM2MDAwLXRkZXAuYyAoc2tpcF9wcm9sb2d1ZSk6ICBIYW5kbGUgYG1yIHIzMSxyMScsIHdoaWNoIGlzCisJZ2VuZXJhdGVkIGJ5IGdjYy0yLjYsIGFzIGEgc3lub255bSBmb3IgYG9yaWwgcjMxLHIxLDAnLgorCisJKiBUT0RPOiAgUmVtb3ZlIGl0ZW0gYWJvdXQgUlMvNjAwMCBzaGFyZWQgbGlicmFyaWVzLgorCitUaHUgT2N0IDIwIDE3OjM1OjQ1IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGRlZnMuaCwgaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKSwgdG9wLmM6ICBDYWxsCisJdGFyZ2V0X3dhaXRfaG9vayB0byBhbGxvdyBHVUkgdG8gaGFuZGxlIGJsb2NraW5nIGZvciBpbmZlcmlvci4gIENhbGwKKwljYWxsX2NvbW1hbmRfaG9vayBpbiBleGVjdXRlX2NvbW1hbmQgdG8gcHJvdmlkZSBtZWFucyBmb3Igd3JhcHBpbmcKKwljb21tYW5kcyB3aXRoIEdVSSBzdGF0ZSBjaGFuZ2UgdXBkYXRlcy4KKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogIE1ha2Ugc3VyZQorCXRocm91Z2hfc2lndHJhbXBfYnJlYWtwb2ludCBpcyBub24tbnVsbCBiZWZvcmUgZGVsZXRpbmcuCisKK1RodSBPY3QgMjAgMTA6MjY6NDMgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQorCisJKiBjb25maWcvcG93ZXJwYy9wcGMtbncubXQgKFRERVBGSUxFUyk6IFJlbW92ZWQgZXhlYy5vLgorCitUaHUgT2N0IDIwIDA2OjU2OjA3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoY29mZnJlYWQubyk6IERlcGVuZCBvbiB0YXJnZXQuaC4KKwkocmVtb3RlLXZ4Lm8pOiBEZXBlbmQgb24gZ2RiLXN0YWJzLmggb2JqZmlsZXMuaCBzeW1maWxlLmggJChiZmRfaCkuCisKK1dlZCBPY3QgMTkgMjI6NDk6MzEgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIFRPRE86IEZpeCB0eXBvLgorCitXZWQgT2N0IDE5IDExOjMyOjE1IDE5OTQgIEppbSBLaW5nZG9uICA8a2luZ2RvbkBjeWdudXMuY29tPgorCisJKiBvYmpmaWxlcy5jIChvYmpmaWxlX3JlbG9jYXRlKTogV2hlbiByZWxvY2F0aW5nIC0+c2VjdGlvbnMsIHVzZQorCW9iamZpbGUgbm90IHN5bWZpbGVfb2JqZmlsZS4KKworCSogc3ltdGFiLmgsIG1pbnN5bXMuYyAobWluc3ltc19zb3J0KTogTmV3IGZ1bmN0aW9uLgorCSogb2JqZmlsZXMuYyAob2JqZmlsZV9yZWxvY2F0ZSk6IENhbGwgaXQuCisKKwkqIHJlbW90ZS12eC5jICh2eF9hZGRfc3ltYm9scyk6IENhbGwgYnJlYWtwb2ludF9yZV9zZXQuCisKKwkqIG9iamZpbGVzLmMsIG9iamZpbGVzLmggKG9iamZpbGVfdG9fZnJvbnQpOiBOZXcgZnVuY3Rpb24uCisJKiByZW1vdGUtdnguYyAodnhfYWRkX3N5bWJvbHMpOiBDYWxsIGl0LgorCisJKiBjb2ZmcmVhZC5jIChjb2ZmX3N5bXRhYl9yZWFkKTogSGFuZGxlIGNvbW1vbiBzeW1ib2xzIHRoZSBzYW1lCisJd2F5IHRoYXQgcGFydGlhbC1zdGFiLmggZG9lcy4KKworV2VkIE9jdCAxOSAyMTowNjoxMiAxOTk0ICBSb2IgU2F2b3llICAocm9iQGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBocHBhLXRkZXAuYzogUmVtb3ZlIGluY2x1ZGUgZmlsZXMgYS5vdXQuaCwgaW9jdGwuaCwgYW5kCisJbWFjaGluZS9wc2wuaC4gVGhlc2UgYXJlIGhvc3QgZmlsZXMuCisKK1dlZCBPY3QgMTkgMTU6MTM6NTEgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIG9iamZpbGVzLmggKHN0cnVjdCBvYmpmaWxlKTogRml4IGNvbW1lbnQtLW1pbmltYWxfc3ltYm9sX2NvdW50CisJZG9lcyAqbm90KiBpbmNsdWRlIHRoZSB0ZXJtaW5hdGluZyBOVUxMIG1zeW1ib2wuCisKK1R1ZSBPY3QgMTggMjA6NTM6MjkgMTk5NCAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgorCisJKiBtb25pdG9yLmMgKG1vbml0b3JfbG9hZF9zcmVjLG1vbml0b3JfbWFrZV9zcmVjKTogQWRkIGFuIGFzcmVjb3JkCisJbG9hZGVyIHRoYXQgcmVhZHMgZmlsZXMgdXNpbmcgQkZEIGFuZCBjb252ZXJ0cyBpdCBvbiB0aGUgZmx5LgorCitNb24gT2N0IDE3IDE4OjUyOjA2IDE5OTQgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KKworCSogbW9uaXRvci5jIChzZXRfbG9hZHR5cGVfY29tbWFuZCk6IEZpeGVkIHNvIGl0IGRvZXNuJ3QgY29yZSBkdW1wLgorCSogbW9uaXRvci5jIChtb25pdG9yX2xvYWQpOiBjaGVjayB0aGUgbG9hZCB0eXBlIGFuZCBsb2FkIHRoZSBmaWxlCisJYWNjb3JkaW5nbHkuIERlZmF1bHQgdG8gZ3JfbG9hZF9pbWFnZSgpLgorCSogbW9uaXRvci5jIChtb25pdG9yX2xvYWRfYXNjaWlfc3JlYyk6IExvYWQgYW4gYXNjaWkgZmlsZSBpbgorCXNyZWNvcmQgZm9ybWF0IGJ5IGRvd25sb2FkaW5nIHRvIHRoZSBtb25pdG9yLgorCSogdzg5ay1yb20uYywgb3A1MG4tcm9tLmM6IHNldCBzdXBwb3J0ZWQgbG9hZCB0eXBlcy4KKworTW9uIE9jdCAxNyAxMDoyOTowOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEFMTERFUEZJTEVTKTogUmVtb3ZlIHhjb2ZmZXhlYy5jLgorCSogTWFrZWZpbGUuaW46IFJlbW92ZSB4Y29mZmV4ZWMubyBydWxlLgorCisJKiBleGVjLmMgKGV4ZWNfZmlsZV9jb21tYW5kKTogQWRkIGNvbW1lbnQuCisKKwlGaXggZGF0YSBhbmQgYnNzIHJlbG9jYXRpb24gZm9yIFZ4V29ya3MgNS4xOgorCSogcmVtb3RlLXZ4LmMgKHZ4X2FkZF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLgorCSh2eF9sb2FkX2NvbW1hbmQsIGFkZF9zeW1ib2xfc3R1Yik6IENhbGwgaXQgaW5zdGVhZCBvZgorCXN5bWJvbF9maWxlX2FkZC4KKwkodnhfd2FpdCk6IFJlbW92ZSBjb21tZW50IHdoaWNoIHdhcyB3cm9uZyB0byB1c2VsZXNzLgorCSogcmVtb3RlLXZ4LmM6IFJlaW5kZW50IG11Y2ggb2YgZmlsZS4KKwkqIGNvZmZyZWFkLmMgKGNzX3RvX3NlY3Rpb24sIGZpbmRfdGFyZ19zZWMpOiBOZXcgZnVuY3Rpb25zLgorCShwcm9jZXNzX2NvZmZfc3ltYm9sKTogU2V0IFNZTUJPTF9TRUNUSU9OIHRvIHJlc3VsdAorCWZyb20gY3NfdG9fc2VjdGlvbi4KKwkoY29mZl9zeW10YWJfcmVhZCk6IENhbGwgY3NfdG9fc2VjdGlvbiBhbmQgZGVhbCB3aXRoIHJlc3VsdAorCXJhdGhlciB0aGFuIGFzc3VtaW5nIHNlY3Rpb25zIGFyZSBpbiBhIGNlcnRhaW4gb3JkZXIuICBEZWFsIHdpdGgKKwlCU1MuCisJKiBjb2ZmcmVhZC5jOiBSZW1vdmUgdGV4dF9iZmRfc2NudW0gdmFyaWFibGUuCisKK1NhdCBPY3QgMTUgMTY6NTU6NDggMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBjb3JlbG93LmM6IEZvcm1hdCB0byBzdGFuZGFyZC4KKwkoY29yZV9jbG9zZSk6IFVzZSBuYW1lIGluc3RlYWQgb2YgYmZkX2ZpbGVuYW1lLgorCitGcmkgT2N0IDE0IDEwOjI5OjA4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBleGVjLmMgKG1hcF92bWFwKTogQ2FzdCByZXR1cm4gZnJvbSB4bWFsbG9jIHRvIGl0cyBwcm9wZXIgdHlwZSwKKwlub3QgdG8gUFRSLgorCisJKiBzeW1maWxlLmMgKHJlcmVhZF9zeW1ib2xzKTogSW5jbHVkZSBiZmRfZXJybXNnIHN0cmluZyBpbiBlcnJvcgorCW1lc3NhZ2UgaWYgYmZkX2Nsb3NlIGZhaWxzLgorCSogZXhlYy5jIChleGVjX2Nsb3NlKSwgc29saWIuYyAoY2xlYXJfc29saWIpLCBjb3JlbG93LmMKKwkoY29yZV9jbG9zZSksIG9iamZpbGVzLmMgKGZyZWVfb2JqZmlsZSksIGlyaXg1LW5hdC5jCisJKGNsZWFyX3NvbGliKSwgb3Nmc29saWIuYyAoY2xlYXJfc29saWIpLCByZW1vdGUtdXRpbHMuYworCShncl9sb2FkX2ltYWdlKTogQ2hlY2sgZm9yIGVycm9ycyBmcm9tIGJmZF9jbG9zZS4KKwkqIHNvbGliLmMgKGxvb2tfZm9yX2Jhc2UpLCByZW1vdGUtdXRpbHMuYyAoZ3JfbG9hZF9pbWFnZSksCisJcmVtb3RlLXVkaS5jIChkb3dubG9hZCksIGNvcmVsb3cuYyAoY29yZV9vcGVuKSwgc3ltZmlsZS5jCisJKHN5bWZpbGVfYmZkX29wZW4pLCBzeW1maWxlLmMgKGdlbmVyaWNfbG9hZCk6IEFkZCBjb21tZW50CisJcmVnYXJkaW5nIGVycm9yIGZyb20gYmZkX2Nsb3NlLgorCSogcmVtb3RlLXVkaS5jIChkb3dubG9hZCksIHJlbW90ZS11dGlscy5jIChncl9sb2FkX2ltYWdlKTogQWRkCisJY29tbWVudCBhYm91dCBib2d1cyBoYW5kbGluZyBvZiBlcnJvcnMgZnJvbSBiZmRfb3BlbnIuCisJKiBleGVjLmMgKGV4ZWNfY2xvc2UpOiBBZGQgY29tbWVudCByZWdhcmRpbmcgbWVtb3J5IGxlYWsgYW5kCisJZGFuZ2xpbmcgcmVmZXJlbmNlIHRvIHZwLT5uYW1lLgorCitTYXQgT2N0IDE1IDAzOjQzOjAwIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiAgTWFrZSBmbnB0ciBhIExPTkdFU1QgaW5zdGVhZAorCW9mIHVzaW5nIGxvbmdlc3RfdG9faW50LgorCisJKiBpbmZjbWQuYyAocnVuX3N0YWNrX2R1bW15KTogIFJlaW5zdGF0ZSBzZXRfY3VycmVudF9mcmFtZSBjYWxsLAorCW1pcHMgYW5kIGFscGhhIHRhcmdldHMgbmVlZCB0aGUgcmVhbCBicmVha3BvaW50IHBjIGZvcgorCWNyZWF0aW5nIHRoZSBicmVha3BvaW50IGZyYW1lLgorCisJKiBzdGFjay5jIChyZXR1cm5fY29tbWFuZCk6ICBDYXN0IHJldHVybiB2YWx1ZSB0byB0aGUgcmV0dXJuCisJdHlwZSBvZiB0aGUgZnVuY3Rpb24gZnJvbSB3aGljaCB3ZSByZXR1cm4uCisJKiB2YWx1ZXMuYyAoc2V0X3JldHVybl92YWx1ZSk6ICBQYXNzIFZBTFVFX0NPTlRFTlRTIHVubW9kaWZpZWQKKwl0byBTVE9SRV9SRVRVUk5fVkFMVUUuCisKKwkqIHN5bXRhYi5jIChsb29rdXBfc3ltYm9sKTogIFJlbW92ZSBzZWFyY2ggZm9yIGBzdGF0aWMgbWFuZ2xlZAorCXN5bWJvbHMnLCB0aGUgc2VhcmNoIGZvciBgc3RhdGljIHN5bWJvbHMnIGFscmVhZHkgbG9va3MgZm9yCisJbWFuZ2xlZCBhbmQgZGVtYW5nbGVkIHN5bWJvbHMgdmlhIGxvb2t1cF9ibG9ja19zeW1ib2wuCisKKwkqIHZhbGFyaXRoLmMgKHZhbHVlX2Jpbm9wKTogIFVzZSBBTlNJIEMgYXJpdGhtZXRpYyBjb252ZXJzaW9ucworCXdoZW4gcGVyZm9ybWluZyBpbnRlZ3JhbCBldmFsdWF0aW9ucywgaW1wbGVtZW50IEJJTk9QX0VRVUFMIGFuZAorCUJJTk9QX0xFU1MuCisJKHZhbHVlX2VxdWFsLCB2YWx1ZV9sZXNzKTogIFVzZSB2YWx1ZV9iaW5vcCB0byBwZXJmb3JtIHRoZQorCWNvbXBhcmlzb24gaWYgYm90aCBvcGVyYW5kcyBoYXZlIFRZUEVfQ09ERV9JTlQuCisKKwkqIHJzNjAwMC10ZGVwLmMgKHBvcF9mcmFtZSk6ICBNYWtlIHN1cmUgYWxsIHJlZ2lzdGVycyBhcmUgdmFsaWQsCisJYXMgdGhleSBhcmUgd3JpdHRlbiBiYWNrIGxhdGVyLiBIYW5kbGUgc3AgcmVzdG9yZSBmb3IgZnJhbWVsZXNzCisJZnVuY3Rpb25zLiBVc2UgZmRhdGEubm9zYXZlZHBjIGluc3RlYWQgb2YgZmRhdGEuZnJhbWVsZXNzIHRvCisJZGV0ZXJtaW5lIGlmIHRoZSBwYyBoYXMgYmVlbiBzYXZlZC4KKwkoZnVuY3Rpb25fZnJhbWVfaW5mbyk6ICBIYW5kbGUgYG1yIHIzMSxyMScsIHdoaWNoIGlzIGdlbmVyYXRlZCBieQorCWdjYy0yLjYsIGFzIGEgc3lub255bSBmb3IgYG9yaWwgcjMxLHIxLDAnLgorCShza2lwX3RyYW1wb2xpbmVfY29kZSk6ICBIYW5kbGUgc2hhcmVkIGxpYnJhcnkgdHJhbXBvbGluZXMuCisJKiB4Y29mZnJlYWQuYyAocmVhZF94Y29mZl9zeW10YWJzKTogIFJlY29yZCBYTUNfR0wgc3ltYm9scyB3aXRoCisJdGhlaXIgcmVhbCBuYW1lLiBFbmFibGVzIHNldHRpbmcgb2YgYnJlYWtwb2ludHMgaW4gc2hhcmVkIGxpYnJhcmllcworCWJlZm9yZSB0aGUgZXhlY3V0YWJsZSBpcyBydW4uCisKK0ZyaSBPY3QgMTQgMTk6Mzk6NDcgMTk5NCAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgorCisJKiBtb25pdG9yLmgsIHJlbW90ZS1tb24uYzogSGFjayB1cCB0byBzbyB0aGUgb2xkIFJPTSBtb25pdG9yCisJaW50ZXJmYWNlIGNvZGUgc3RpbGwgd29ya3Mgd2l0aCB0aGUgbmV3IFJPTSBtb25pdG9yCisJc3RydWN0dXJlcy4gRmFrZSBvdXQgYSBjb3VwbGUgb2YgZmllbGRzLgorCitGcmkgT2N0IDE0IDE0OjU0OjM3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogaDg1MDAtdGRlcC5jICh0YXJnZXRfcmVhZF9zcCwgdGFyZ2V0X3dyaXRlX3NwLCB0YXJnZXRfcmVhZF9wYywKKwl0YXJnZXRfd3JpdGVfcGMsIHRhcmdldF9yZWFkX2ZwLCB0YXJnZXRfd3JpdGVfZnApOiBSZW5hbWUgdG8KKwloODUwMF9yZWFkX3NwLCBldGMuCisJKGg4NTAwX3JlYWRfcGMsIGg4NTAwX3dyaXRlX3BjKTogQWRkIHBpZCBhcmd1bWVudC4KKwkqIGNvbmZpZy9oODUwMC90bS1oODUwMC5oIChUQVJHRVRfUkVBRF9TUCwgVEFSR0VUX1dSSVRFX1NQLAorCVRBUkdFVF9SRUFEX1BDLCBUQVJHRVRfV1JJVEVfUEMsIFRBUkdFVF9SRUFEX0ZQLCBUQVJHRVRfV1JJVEVfRlApOgorCUNoYW5nZSB0byBtYXRjaCBmdW5jdGlvbnMgYWJvdmUuCisKK1RodSBPY3QgMTMgMTM6MjQ6MjkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE5FV1M6IEFkZCBpdGVtIGFib3V0IGlmIGFuZCB3aGlsZS4KKworCSogLmdkYmluaXQ6IFJlc3RvcmUgYGVuZCc7IGl0IHdhcyBub3QgZXhjZXNzLiAgUmVpbmRlbnQKKwlsaXN0LW9iamZpbGVzIHRvIG1ha2UgdGhpcyBjbGVhci4gIENvbW1lbnQgb3V0IGFsbCBvZgorCWxpc3Qtb2JqZmlsZXMgYmVjYXVzZSBvbGQgZ2RiJ3MgY2hva2Ugb24gaXQuCisKK1dlZCBPY3QgMTIgMjM6MTk6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBjb25maWcvbWlwcy90bS1iaWdtaXBzNjQuaDogSnVzdCBkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVIgYW5kCisJaW5jbHVkZSB0bS1taXBzNjQuaC4KKworV2VkIE9jdCAxMiAxODowMjoxNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChBTk5PVEFURV9PQlMpOiBOZXcgZGVmaW5pdGlvbi4KKwkoQ09NTU9OX09CUyk6IEFkZCBleGVjLm8uCisJKGFubm90YXRlLm8pOiBSZW1vdmUgZXh0cmEgY29tcGlsZSBydWxlLgorCSogY29uZmlnLyovKi5taCwgY29uZmlnLyovKi5tdDogUmVtb3ZlIGV4ZWMubyBmcm9tICpERVBGSUxFUyBsaXN0cworCWV2ZXJ5d2hlcmUuCisKKyAJKiAuZ2RiaW5pdDogUmVtb3ZlIGV4Y2VzcyBgZW5kJy4KKworCSogZXhlYy5jOiBNZXJnZSBpbiBSUzYwMDAgc3VwcG9ydCBmcm9tIHhjb2ZmZXhlYy5jLgorCShzeW1maWxlLmgsIG9iamZpbGVzLmgsIHhjb2Zmc29saWIuaCk6IEluY2x1ZGUuCisJKHZtYXApOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgorCShleGVjX2Nsb3NlKTogQ2xvc2UgYW5kIGZyZWUgb2JqZWN0cyBpbiB2bWFwIGNoYWluLgorCShleGVjX2ZpbGVfY29tbWFuZCkgW0lCTTYwMDBfVEFSR0VUXTogU2V0IHVwIGluaXRpYWwgdm1hcC4KKwkoYmZkc2VjX3RvX3ZtYXAsIG1hcF92bWFwKTogTW92ZWQgaGVyZSBmcm9tIHhjb2ZmZXhlYy5jLgorCShleGVjX2ZpbGVzX2luZm8pOiBQcmludCB2bWFwIGluZm9ybWF0aW9uLgorCSogeGNvZmZleGVjLmM6IFJlbW92ZS4KKwkqIGNvbmZpZy9yczYwMDAvcnM2MDAwLm10LCBjb25maWcvcnM2MDAwL3JzNjAwMGx5bngubXQKKwkoVERFUEZJTEVTKTogVXNlIGV4ZWMubyBpbnN0ZWFkIG9mIHhjb2ZmZXhlYy5vLgorCSogVE9ETzogUmVtb3ZlIHBlcnRpbmVudCBpdGVtcy4KKworV2VkIE9jdCAxMiAxMDowODoxOSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogcGFydGlhbC1zdGFiLmggKE5fVEVYVCk6IERlbGV0ZSBHREJfVEFSR0VUX0lTX0hQUEEga2x1ZGdlOyB0aGV5CisJYXJlIG5vIGxvbmdlciBuZWVkZWQgYXMgb2YgZ2NjLTIuNi4wLgorCitUdWUgT2N0IDExIDE1OjUxOjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogbHlueC1uYXQuYyAoY2hpbGRfd2FpdCk6IENvcnJlY3QgaGFuZGxpbmcgb2YgYnl0ZSByZXZlcnNlZCBTUEFSQworICAgICAgICBMeW54IHdhaXQgc3RhdHVzLgorCShmZXRjaF9jb3JlX3JlZ2lzdGVycyk6IERvbid0IHRyeSB0byBmZXRjaCBhIHJlZ2lzdGVyIGlmCisJcmVnbWFwIG1hcHMgaXQgdG8gLTEuCisJKiBzcGFyYy10ZGVwLmMgKHNwYXJjX2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyk6IFVzZSBGUkFNRV9TQVZFRF9JMAorCWFuZCBGUkFNRV9TQVZFRF9MMCB3aGVuIHNldHRpbmcgc2F2ZWRfcmVnc19hZGRyLiAgU1BBUkMgTHlueAorCXN0b3JlcyB0aGUgcmVnaXN0ZXJzIGluIGEgd2VpcmQgb3JkZXIuCisKK1NhdCBPY3QgIDggMjA6NTk6MTMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGJsb2NrZnJhbWUuYyAocmVpbml0X2ZyYW1lX2NhY2hlKTogUmVpbnN0YXRlIHNlbGVjdF9mcmFtZSBjYWxsCisJaWYgaW5mZXJpb3JfcGlkIGlzIG5vbnplcm8uCisKK1NhdCBPY3QgIDggMDQ6Mjc6MjEgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJU3BlZWQgdXAgR0RCIHN0YXJ0dXAgdGltZSBieSBub3QgZGVtYW5nbGluZyBwYXJ0aWFsIHN5bWJvbHMuCisJKiBzeW1maWxlLmggKEFERF9QU1lNQk9MX1ZUX1RPX0xJU1QpLAorCXN5bWZpbGUuYyAoYWRkX3BzeW1ib2xfdG9fbGlzdCwgYWRkX3BzeW1ib2xfYWRkcl90b19saXN0KToKKwlObyBsb25nZXIgZGVtYW5nbGUgcGFydGlhbCBzeW1ib2xzLgorCSogc3ltdGFiLmMgKGxvb2t1cF9zeW1ib2wsIGxpc3Rfc3ltYm9scyk6IEhhbmRsZSBtYW5nbGVkCisJdmFyaWFibGVzLCBlLmcuIEMrKyBzdGF0aWMgbWVtYmVycywgdmlhIHRoZSBtaW5pbWFsIHN5bWJvbHMuCisKKwlIYW5kbGUgcmVvcmRlcmVkIGZ1bmN0aW9ucyBpbiBhbiBvYmpmaWxlLCBmb3IgSXJpeCA1LjIgc2hhcmVkCisJbGlicmFyaWVzLgorCSogb2JqZmlsZXMuaCAoT0JKRl9SRU9SREVSRUQpOiAgTmV3IGJpdCBpbiB0aGUgb2JqZmlsZSBmbGFncywKKwlzZXQgaWYgdGhlIGZ1bmN0aW9ucyBpbiBhbiBvYmpmaWxlIGFyZSByZW9yZGVyZWQuCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6ICBEZXRlY3QgcmVvcmRlcmVkCisJZnVuY3Rpb25zIGluIGFuIG9iamZpbGUuCisJKiBzeW10YWIuYyAoZmluZF9wY19wc3ltdGFiLCBmaW5kX3BjX3N5bXRhYik6ICBVc2UgZXhwZW5zaXZlCisJbG9va3VwIGFsZ29yaXRobSBpZiB0aGUgZnVuY3Rpb25zIGluIHRoZSBvYmpmaWxlIGFyZSByZW9yZGVyZWQuCisKKwkqIHhjb2ZmZXhlYy5jIChleGVjX2Nsb3NlKTogIElmIHRoZSBjdXJyZW50IHRhcmdldCBoYXMgYSBjb3B5CisJb2YgdGhlIGV4ZWNfb3BzIHNlY3Rpb25zLCByZWZsZWN0IHRoZSBmcmVlaW5nIG9mIHRoZSBzZWN0aW9ucworCWluIGN1cnJlbnRfdGFyZ2V0LgorCisJKiB2YWxvcHMuYyAoY2FsbF9mdW5jdGlvbl9ieV9oYW5kKTogIFVzZSBgc2l6ZW9mIGR1bW15MScsIG5vdAorCWBzaXplb2YgZHVtbXknLCBmb3IgY29uc3RydWN0aW5nIHRoZSBjYWxsIGR1bW15IGNvZGUuCisKKwkqIGNvbmZpZy9zcGFyYy90bS1zcGFyYy5oOiAgQWRkIFBBUkFNUyBkZWNsYXJhdGlvbnMgdG8gYWxsCisJZnVuY3Rpb24gZGVjbGFyYXRpb25zLgorCSogc3BhcmMtdGRlcC5jIChzcGFyY19wb3BfZnJhbWUpOiAgQ2FzdCByZXN1bHQgb2YKKwlyZWFkX21lbW9yeV9pbnRlZ2VyIHRvIENPUkVfQUREUiB3aGVuIHBhc3NpbmcgaXQgdG8gUENfQURKVVNULgorCisJKiBpcml4NS1uYXQuYyAoZW5hYmxlX2JyZWFrKTogIFNldCBicmVha3BvaW50IGF0IHRoZSBlbnRyeSBwb2ludAorCW9mIHRoZSBleGVjdXRhYmxlLCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgbWFpbiByZXNpZGVzIGluIGEKKwlzaGFyZWQgbGlicmFyeS4KKwkqIGlyaXg1LW5hdC5jIChzb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vayk6ICBSZXNldCBzdG9wX3Nvb25fcXVpZXRseQorCWFmdGVyIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbCByZWFkaW5nLCB0byBnZXQgcmlkIG9mIGEgd2FybmluZyBmcm9tCisJaGV1cmlzdGljX3Byb2Nfc3RhcnQgaWYgdGhlIHN0YXJ0dXAgY29kZSBoYXMgbm8gc3ltYm9saWMgZGVidWcgaW5mby4KKworCSogYnJlYWtwb2ludC5oIChzdHJ1Y3QgYnJlYWtwb2ludCk6ICBBZGQgbmV3IGZpZWxkcyBsYW5ndWFnZQorCWFuZCBpbnB1dF9yYWRpeCwgdG8gZW5hYmxlIGJyZWFrcG9pbnQgcmVzZXR0aW5nIHdpdGggdGhlCisJcHJvcGVyIGxhbmd1YWdlIGFuZCByYWRpeC4KKwkqIGJyZWFrcG9pbnQuYyAoc2V0X3Jhd19icmVha3BvaW50KTogIEluaXRpYWxpemUgdGhlbS4KKwkoYnJlYWtwb2ludF9yZV9zZXRfb25lKTogIFVzZSB0aGVtIHdoZW4gcmVzZXR0aW5nIHRoZSBicmVha3BvaW50LgorCShicmVha3BvaW50X3JlX3NldCk6ICBQcmVzZXJ2ZSBjdXJyZW50IGxhbmd1YWdlIGFuZCBpbnB1dF9yYWRpeAorCWFjcm9zcyBicmVha3BvaW50X3JlX3NldF9vbmUgY2FsbHMuCisKKwkqIHN5bXRhYi5jIChkZWNvZGVfbGluZV8xKTogIERvIG5vdCBidWlsZCBhIGNhbm9uaWNhbCBsaW5lCisJc3BlY2lmaWNhdGlvbiBmb3IgYCpleHByJyBsaW5lIHNwZWNpZmljYXRpb25zLgorCisJKiBicmVha3BvaW50LmggKGJwc3RhdF9zdG9wX3N0YXR1cyk6ICBGaXggcHJvdG90eXBlIGRlY2xhcmF0aW9uLgorCitGcmkgT2N0ICA3IDA4OjQ4OjE4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJVGhlIHBvaW50IG9mIHRoZXNlIGNoYW5nZXMgaXMgdG8gYXZvaWQgcmVhZGluZyB0aGUgZnJhbWUgcG9pbnRlcgorCWFuZCBzdGFjayBwb2ludGVyIGR1cmluZyBzdGVwcGluZywgdG8gc3BlZWQgdGhpbmdzIHVwLgorCUEuICBDaGFuZ2VzIHRvIG5vdCBzZWxlY3QgYSBmcmFtZSB1bnRpbCB3ZSBuZWVkIGEgc2VsZWN0ZWQgZnJhbWU6CisJICAgICogYmxvY2tmcmFtZS5jIChmbHVzaF9jYWNoZWRfZnJhbWVzKTogQ2FsbCBzZWxlY3RfZnJhbWUgKE5VTEwsIC0xKS4KKwkgICAgKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBNb3ZlIGNhbGwgdG8gc2VsZWN0X2ZyYW1lIGJhY2sgdG8KKwkgICAgbm9ybWFsX3N0b3AuICBUaGlzIHJldmVydHMgYSBjaGFuZ2Ugb2YgMTMgQXByIDk0IChpdCBzYXlzIEplZmYKKwkgICAgTGF3LCBidXQgdGhlIGNoYW5nZSB3YXMgbXkgaWRlYSk7IHRoZSBvbmx5IHJlYXNvbiBmb3IgdGhhdCBjaGFuZ2UKKwkgICAgd2FzIHNvIHdlIGNvdWxkIHNhdmUgYW5kIHJlc3RvcmUgdGhlIHNlbGVjdGVkIGZyYW1lIGluCisJICAgIHdhaXRfZm9yX2luZmVyaW9yLCBhbmQgbm93IHRoYXQgZmx1c2hfY2FjaGVkIGZyYW1lcyBjbGVhcnMgdGhlCisJICAgIHNlbGVjdGVkIGZyYW1lLCB0aGF0IHNob3VsZCB3b3JrIE9LIG5vdy4KKwlCLiAgQ2hhbmdlcyB0byBub3QgY3JlYXRlIGEgY3VycmVudF9mcmFtZSB1bnRpbCB3ZSBuZWVkIG9uZToKKwkgICAgKiBibG9ja2ZyYW1lLmMgKGdldF9jdXJyZW50X2ZyYW1lKTogSWYgY3VycmVudF9mcmFtZSBpcyBOVUxMLCB0cnkKKwkgICAgdG8gY3JlYXRlIGFuIGlubmVybW9zdCBmcmFtZS4KKwkgICAgKiBzcGFyYy10ZGVwLmMgKHNwYXJjX3BvcF9mcmFtZSksIGluZmNtZC5jIChydW4tc3RhY2tfZHVtbXkpLAorCSAgICBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpLCB0aHJlYWQuYyAodGhyZWFkX3N3aXRjaCksCisJICAgIGNvbnZleC10ZGVwLmMgKHNldF90aHJlYWRfY29tbWFuZCksIGEyOWstdGRlcC5jIChwb3BfZnJhbWUpLAorCSAgICBhbHBoYS10ZGVwLmMgKGFscGhhX3BvcF9mcmFtZSksIGNvbnZleC14ZGVwLmMgKGNvcmVfZmlsZV9jb21tYW5kKSwKKwkgICAgaDgzMDAtdGRlcC5jIChoODMwMF9wb3BfZnJhbWUpLCBoODUwMC10ZGVwLmMgKGg4MzAwX3BvcF9mcmFtZSksCisJICAgIGhwcGEtdGRlcC5jIChocHBhX3BvcF9mcmFtZSksIGkzODYtdGRlcC5jIChpMzg2X3BvcF9mcmFtZSksCisJICAgIGk5NjAtdGRlcC5jIChwb3BfZnJhbWUpLCBtNjhrLXRkZXAuYworCSAgICAobTY4a19wb3BfZnJhbWUpLCBtaXBzLXRkZXAuYyAobWlwc19wb3BfZnJhbWUpLCByczYwMDAtdGRlcC5jCisJICAgIChwdXNoX2R1bW15X2ZyYW1lLCBwb3BfZHVtbXlfZnJhbWUsIHBvcF9mcmFtZSksIHNoLXRkZXAuYworCSAgICAocG9wX2ZyYW1lKSwgY29uZmlnL2FybS90bS1hcm0uaCAoUE9QX0ZSQU1FKSwKKwkgICAgY29uZmlnL2NvbnZleC90bS1jb252ZXguaCAoUE9QX0ZSQU1FKSwgY29uZmlnL2dvdWxkL3RtLXBuLmgKKwkgICAgKFBPUF9GUkFNRSksIGNvbmZpZy9uczMyay90bS1tZXJsaW4uaCAoUE9QX0ZSQU1FKSwKKwkgICAgY29uZmlnL25zMzJrL3RtLXVtYXguaCAoUE9QX0ZSQU1FKSwgY29uZmlnL3RhaG9lL3RtLXRhaG9lLmgKKwkgICAgKFBPUF9GUkFNRSksIGNvbmZpZy92YXgvdG0tdmF4LmggKFBPUF9GUkFNRSk6IERvbid0CisJICAgIGNhbGwgY3JlYXRlX25ld19mcmFtZS4KKwkgICAgKiBjb3JlbG93LmMgKGNvcmVfb3BlbiksIGFsdG9zLXhkZXAuYyAoY29yZV9maWxlX2NvbW1hbmQpLAorCSAgICBhcm0teGRlcC5jIChjb3JlX2ZpbGVfY29tbWFuZCksIGdvdWxkLXhkZXAuYyAoY29yZV9maWxlX2NvbW1hbmQpLAorCSAgICBtMy1uYXQuYyAoc2VsZWN0X3RocmVhZCksIHN1bjM4Ni1uYXQuYyAoY29yZV9maWxlX2NvbW1hbmQpLAorCSAgICB1bWF4LXhkZXAuYyAoY29yZV9maWxlX2NvbW1hbmQpOiBEb24ndCBjYWxsIGNyZWF0ZV9uZXdfZnJhbWU7IGRvCisJICAgIGNhbGwgZmx1c2hfY2FjaGVkX2ZyYW1lcy4KKwkgICAgKiBibG9ja2ZyYW1lLmMgKHJlaW5pdF9mcmFtZV9jYWNoZSk6IERvbid0IGNhbGwgY3JlYXRlX25ld19mcmFtZQorCSAgICBvciBzZWxlY3RfZnJhbWUuCisJQy4gIENoYW5nZXMgdG8gZ2V0IHJpZCBvZiBzdG9wX2ZyYW1lX2FkZHJlc3MgYW5kIGluc3RlYWQgb25seQorCWZldGNoIHRoZSBmcmFtZSBwb2ludGVyIHdoZW4gd2UgbmVlZCBpdC4KKwkgICAgKiBicmVha3BvaW50LmMgKGJwc3RhdF9zdG9wX3N0YXR1cyk6IFJlbW92ZSBhcmd1bWVudAorCSAgICBmcmFtZV9hZGRyZXNzOyB1c2UgRlJBTUVfRlAgKGdldF9jdXJyZW50X2ZyYW1lICgpKS4KKwkgICAgKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBEb24ndCBwYXNzIGZyYW1lIHBvaW50ZXIgdG8KKwkgICAgYnBzdGF0X3N0b3Bfc3RhdHVzLgorCSAgICAqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IFVzZSBGUkFNRV9GUCAoZ2V0X2N1cnJlbnRfZnJhbWUKKwkgICAgKCkpIGluc3RlYWQgb2Ygc3RvcF9mcmFtZV9hZGRyZXNzLgorCSAgICAqIGluZnJ1bi5jIChzYXZlX2luZmVyaW9yX3N0YXR1cywgcmVzdG9yZV9pbmZlcmlvcl9zdGF0dXMpLAorCSAgICBpbmZlcmlvci5oIChzdHJ1Y3QgaW5mZXJpb3Jfc3RhdHVzKTogRG9uJ3Qgc2F2ZSBhbmQgcmVzdG9yZQorCSAgICBzdG9wX2ZyYW1lX2FkZHJlc3MuCisJICAgICogaW5mZXJpb3IuaCwgaW5mY21kLmMsIHRocmVhZC5jICh0aHJlYWRfc3dpdGNoKSwgbTMtbmF0LmMKKwkgICAgKHNlbGVjdF90aHJlYWQpOiBSZW1vdmUgc3RvcF9mcmFtZV9hZGRyZXNzIGFuZCB1c2VzIHRoZXJlb2YuCisJRC4gIFNhbWUgdGhpbmcgZm9yIHRoZSBzdGFjayBwb2ludGVyLgorCSAgICAqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IFJlbW92ZSBzdG9wX3NwIGFuZCByZXBsYWNlCisJICAgIHVzZXMgdGhlcmVvZiB3aXRoIHJlYWRfc3AgKCkuCisJRS4gIENoYW5nZSB0byBlbGltaW5hdGUgb25lIG5hc3R5IGxpdHRsZSBzcG90IHdoZXJlIHdlIHdlcmUKKwl3YW50aW5nIHRvIGtub3cgdGhlIGZyYW1lIHBvaW50ZXIgZnJvbSBiZWZvcmUgdGhlIGN1cnJlbnQgc3RlcAorCShpZGVhIGZyb20gR0RCIDMuNSwgd2hpY2ggc2F2ZWQgbXkgYXNzLCBiZWNhdXNlIG15IG90aGVyIGlkZWFzIG9mCisJaG93IHRvIGZpeCBpdCB3ZXJlIHZlcnkgYmFyb3F1ZSkuCisJICAgICogaW5mcnVuLmM6IFJlbW92ZSBwcmV2X2ZyYW1lX2FkZHJlc3MuCisJICAgICogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yLCBzdGVwX292ZXJfZnVuY3Rpb24pOiBVc2UKKwkgICAgc3RlcF9mcmFtZV9hZGRyZXNzIGluc3RlYWQgb2YgcHJldl9mcmFtZV9hZGRyZXNzLgorCUYuICBTYW1lIGJhc2ljIGlkZWEgZm9yIHRoZSBzdGFjayBwb2ludGVyLgorCSAgICAqIGluZmVyaW9yLmgsIGluZmNtZC5jOiBOZXcgdmFyaWFibGUgc3RlcF9zcC4KKwkgICAgKiBpbmZjbWQuYyAoc3RlcF8xLCB1bnRpbF9uZXh0X2NvbW1hbmQpOiBTZXQgaXQuCisJICAgICogaW5mcnVuLmM6IFJlbW92ZSBwcmV2X3NwIGFuZCByZXBsYWNlIHVzZXMgYnkgc3RlcF9zcC4KKwkgICAgKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBJZiB3ZSBnZXQgb3V0IG9mIHRoZSBzdGVwCisJICAgIHJhbmdlLCB0aGVuIHNldCBzdGVwX3NwIHRvIHRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIgYmVmb3JlIHdlCisJICAgIHN0YXJ0IGdvaW5nIGFnYWluLgorCitGcmkgT2N0ICA3IDEyOjE3OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogdG9wLmMgKHRhcmdldF9ieXRlX29yZGVyX2F1dG8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShzZXRfZW5kaWFuKTogTWVudGlvbiB0aGF0IGBgYXV0bycnIGlzIHBlcm1pdHRlZC4KKwkoc2V0X2VuZGlhbl9hdXRvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoc2hvd19lbmRpYW4pOiBDaGFuZ2UgbWVzc2FnZSBiYXNlZCBvbiB0YXJnZXRfYnl0ZV9vcmRlcl9hdXRvLgorCShzZXRfZW5kaWFuX2Zyb21fZmlsZSk6IE5ldyBmdW5jdGlvbi4KKwkoaW5pdF9tYWluKTogQWRkIGNvbW1hbmQgYGBhdXRvJycgdG8gZW5kaWFubGlzdC4KKwkqIGV4ZWMuYyAoZXhlY19maWxlX2NvbW1hbmQpOiBDYWxsIHNldF9lbmRpYW5fZnJvbV9maWxlLgorCSogZGVmcy5oIChzZXRfZW5kaWFuX2Zyb21fZmlsZSk6IERlY2xhcmUuCisKK1RodSBPY3QgIDYgMTg6MTA6NDEgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQorCisJKiBubG0vaTM4Ni5jIChmbHVzaF9pX2NhY2hlKTogTmV3IGZ1bmN0aW9uLCBkb2VzIG5vdGhpbmcuCisJKGZyYW1lX3RvX3JlZ2lzdGVycywgcmVnaXN0ZXJzX3RvX2ZyYW1lLCBzZXRfc3RlcF90cmFwcywKKwljbGVhcl9zdGVwX3RyYXBzLCBkb19zdGF0dXMpOiBNYWtlIG5vbi1zdGF0aWMuCisKK1RodSBPY3QgIDYgMTI6MjY6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgorCisJKiBjb25maWcvbWlwcy90bS1taXBzLmggKEdEQl9UQVJHRVRfSVNfTUlQUzY0KTogSWYgbm90IGFscmVhZHkKKwlkZWZpbmVkLCBkZWZpbmUgYXMgMC4KKwkoRklYX0NBTExfRFVNTVkpOiBSZXdyaXRlIHRvIHJlbW92ZSBwcmVzdW1wdGlvbiB0aGF0IGhvc3QgYW5kCisJdGFyZ2V0IGFyZSBzaW1pbGFyLgorCSogY29uZmlnL21pcHMvdG0taWR0LmggKFRBUkdFVF9CWVRFX09SREVSX1NFTEVDVEFCTEUpOiBEZWZpbmUuCisJKiBjb25maWcvbWlwcy90bS1pZHRsLmggKFRBUkdFVF9CWVRFX09SREVSX1NFTEVDVEFCTEUpOiBEZWZpbmUuCisJKiBjb25maWcvbWlwcy90bS1pZHQ2NC5oIChUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFKTogRGVmaW5lLgorCShCUkVBS1BPSU5UKTogUmVtb3ZlIGRlZmluaXRpb24uCisJKiBjb25maWcvbWlwcy90bS1pZHRsNjQuaCAoVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRSk6IERlZmluZS4KKwkoQlJFQUtQT0lOVCk6IFJlbW92ZSBkZWZpbml0aW9uLgorCSogY29uZmlnL21pcHMvdG0tbWlwczY0LmggKEdEQl9UQVJHRVRfSVNfTUlQUzY0KTogRGVmaW5lIHdpdGggYQorCXZhbHVlIG9mIDEsIHJhdGhlciB0aGFuIHdpdGhvdXQgYSB2YWx1ZS4KKwkqIGNvbmZpZy9taXBzL3RtLWJpZ21pcHM2NC5oIChHREJfVEFSR0VUX0lTX01JUFM2NCk6IExpa2V3aXNlLgorCSogbWlwcy10ZGVwLmM6IFJld3JpdGUgdXNlcyBvZiBHREJfVEFSR0VUX0lTX01JUFM2NCB0byBzd2l0Y2ggYXQKKwlydW4gdGltZSByYXRoZXIgdGhhbiBhdCBjb21waWxlIHRpbWUuCisKKwkqIHJlbW90ZS1taXBzLmMgKGJyZWFrX2luc24pOiBSZW1vdmUuCisJKEJSRUFLX0lOU04sIEJSRUFLX0lOU05fU0laRSk6IERlZmluZS4KKwkobWlwc19pbnNlcnRfYnJlYWtwb2ludCk6IFVzZSBCUkVBS19JTlNOLCBub3QgYnJlYWtfaW5zbi4KKwkobWlwc19yZW1vdmVfYnJlYWtwb2ludCk6IExpa2V3aXNlLgorCisJKiBkZWZzLmg6IElmIFRBUkdFVF9CWVRFX09SREVSX1NFTEVDVEFCTEUgaXMgZGVmaW5lZCBieSB0bS5oLAorCWRlZmluZSBUQVJHRVRfQllURV9PUkRFUiBhcyB0YXJnZXRfYnl0ZV9vcmRlciwgYW5kIGRlY2xhcmUKKwl0YXJnZXRfYnl0ZV9vcmRlciBhcyBhbiBleHRlcm4gaW50LCBhbmQgZGVmaW5lIEJJVFNfQklHX0VORElBTiBhcworCWEgdGVzdCBvZiBUQVJHRVRfQllURV9PUkRFUi4KKwkqIHRvcC5jOiBTZXZlcmFsIGFkZGl0aW9ucyBpZiBUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFIGlzCisJZGVmaW5lZDoKKwkoZW5kaWFubGlzdCwgdGFyZ2V0X2J5dGVfb3JkZXIpOiBOZXcgdmFyaWFibGVzLgorCShzZXRfZW5kaWFuLCBzZXRfZW5kaWFuX2JpZywgc2V0X2VuZGlhbl9saXR0bGUpOiBOZXcgZnVuY3Rpb25zLgorCShzaG93X2VuZGlhbik6IE5ldyBmdW5jdGlvbi4KKwkoaW5pdF9jbWRfbGlzdHMpOiBJbml0aWFsaXplIGVuZGlhbmxpc3QuCisJKGluaXRfbWFpbik6IEFkZCBjb21tYW5kcyBgYHNldCBlbmRpYW4gYmlnJycsIGBgc2V0IGVuZGlhbgorCWxpdHRsZScnLCBhbmQgYGBzaG93IGVuZGlhbicnLgorCSogYTI5ay1waW5zbi5jOiBSZXdyaXRlIHVzZXMgb2YgVEFSR0VUX0JZVEVfT1JERVIgYW5kCisJQklUU19CSUdfRU5ESUFOIHRvIHN3aXRjaCBhdCBydW4gdGltZSByYXRoZXIgdGhhbiBhdCBjb21waWxlIHRpbWUuCisJKiBjb2ZmcmVhZC5jLCBkd2FyZnJlYWQuYywgZmluZHZhci5jLCBtaXBzLXRkZXAuYzogTGlrZXdpc2UuCisJKiByZW1vdGUtb3M5ay5jLCBzdGFic3JlYWQuYywgdmFsYXJpdGguYywgdmFscHJpbnQuYzogTGlrZXdpc2UuCisJKiB2YWx1ZXMuYzogTGlrZXdpc2UuCisKK1dlZCBPY3QgIDUgMTE6NDE6MjQgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQorCisJKiBubG0vY29uZmlndXJlLmluOiAke2dkYl9ob3N0X2NwdX0gZGVmYXVsdHMgdG8gJHtob3N0X2NwdX0uCisKKwkqIG5sbS9NYWtlZmlsZS5pbjogR2V0IHJpZCBvZiBOV0lOQ0xVREVTLgorCSogY29uZmlnL3thbHBoYSxwb3dlcnBjfS9nZGJzZXJ2ZS5tdDogUmVtb3ZlIE5XSU5DTFVERVMuCisJICBVc2VyIHNob3VsZCBub3cgY29uZmlndXJlIHdpdGggLS13aXRoLWhlYWRlcnMuCisKK01vbiBPY3QgIDMgMDc6NDg6MzQgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYnNlcnZlci9zZXJ2ZXIuYyAobWFpbik6IFNpbGVudGx5IGFjY2VwdCBhbGwgdW5yZWNvZ25pemVkCisJcmVxdWVzdHMgYW5kIHNlbmQgYmFjayBhIHplcm8gbGVuZ3RoIGFja25vd2xlZGdlLiAgVGhhdCBpcyB3aGF0CisJKi1zdHViLmMgZG8gYW5kIGlzIHdoYXQgcmVtb3RlLmMgZXhwZWN0cy4KKworTW9uIE9jdCAgMyAwNToxMTo0NyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNvcmVsb3cuYyAoY29yZV9vcGVuKTogIENvcHkgdGhlIG1vZGlmaWVkIHRvX3NlY3Rpb25zX2VuZAorCXZlY3RvciBmcm9tIGN1cnJlbnRfdGFyZ2V0IHRvIGNvcmVfb3BzIHRvby4KKworCSogZ2Ric2VydmVyL3NlcnZlci5jIChtYWluKTogIFNpbGVudGx5IGFjY2VwdCBxdWVyeSByZXF1ZXN0cworCWFuZCBzZW5kIGJhY2sgYSB6ZXJvIGxlbmd0aCBhY2tub3dsZWRnZS4KKworRnJpIFNlcCAzMCAxNzoxNzoyMSAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCisKKyAgICAgICAgKiBubG0vTWFrZWZpbGUuaW46IERvbid0IGRlZmluZSBOV0lOQ0xVREVTLgorICAgICAgICAqIGNvbmZpZy97YWxwaGEscG93ZXJwY30vZ2Ric2VydmUubXQ6IGRlZmluZSBOV0lOQ0xVREVTLgorCitGcmkgU2VwIDMwIDE1OjU5OjU1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGJzZXJ2ZXIvbG93LWx5bnguYyAoY3JlYXRlX2luZmVyaW9yKTogUGFzcyBhbGwgNCBhcmdzIHRvIHB0cmFjZS4KKworRnJpIFNlcCAzMCAwNjo0Mjo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGx5bngtbmF0LmMgKGNoaWxkX3dhaXQpOiBVc2Ugc3RhdHVzLndfc3RhdHVzLCBub3Qgc3RhdHVzLCBpbgorCWFyaXRobWV0aWMuICBzdGF0dXMgaXMgYSBgdW5pb24gd2FpdCcuCisKKwkqIGNvbmZpZy9ubS1seW54LmggKFBUUkFDRV9BUkczX1RZUEUpOiBEZWZpbmUgdG8gaW50LCBub3QgY2hhciAqLgorCisJKiBseW54LW5hdC5jIChjaGlsZF93YWl0KTogUGFzcyBmb3VydGggYXJndW1lbnQgdG8gcHRyYWNlLgorCitUaHUgU2VwIDI5IDA4OjIyOjI3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiB4Y29mZnJlYWQuYyAocmVhZF94Y29mZl9zeW10YWIpOiBGaXggY29tbWVudCBmb3IgeWVzdGVyZGF5J3MgY2hhbmdlLgorCitXZWQgU2VwIDI4IDE3OjQ4OjE4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb2ZmcmVhZC5jIChjb21wbGV0ZV9zeW10YWIpOiBJZiBsYXN0X3NvdXJjZV9maWxlIGlzIHNldCB1cG9uCisJZW50cnksIGZyZWUgaXQuCisKK1dlZCBTZXAgMjggMDg6NTk6MTQgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHhjb2ZmcmVhZC5jIChyZWFkX3hjb2ZmX3N5bXRhYiwgY2FzZSBDX0ZJTEUpOgorCVNldCBtYWluX2F1eCBiZWZvcmUgdXNpbmcgaXQuCisKKwkqIHhjb2ZmZXhlYy5jIChleGVjX2Nsb3NlKTogSWYgcXVpdHRpbmcsIGRvbid0IGNhbGwgY2xlYXJfc3ltdGFiX3VzZXJzLgorCisJKiB4Y29mZnJlYWQuYyAocmVhZF94Y29mZl9zeW10YWIpOiBQcm9jZXNzIFhUWV9MRCBzeW1ib2xzIHdlIHdlcmUKKwlpZ25vcmluZyBiZWZvcmUuICBCdXQgY29udGludWUgdG8gaWdub3JlIFhNQ19EUy4KKworV2VkIFNlcCAyOCAwMDozNToyMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHByZWFkLmMgKGhwcmVhZF9yZWFkX2FycmF5X3R5cGUpOiBEbyBub3QgY2hhbmdlIHRoZSB0eXBlIGNvZGUKKwl0byBUWVBFX0NPREVfUFRSIGZvciAiY2hhciBmb29bXSIuICBKdXN0IG1ha2UgaXQgYSB6ZXJvIGxlbmd0aAorCWFycmF5IHR5cGUuCisKKwkqIGhwcmVhZC5jIChocHJlYWRfdHlwZV90cmFuc2xhdGUpOiBIYW5kbGUgVF9VTlNfTE9ORyB0eXBlcyB3aXRoCisJbGVuZ3RocyBvdGhlciB0aGFuIDMyYml0cyAoSFAgQyA5LjY5IHJlcHJlc2VudHMgYW4gInVuc2lnbmVkIGNoYXIiCisJYXMgYW4gVF9VTlNfTE9ORyB3aXRoIGxlbmd0aCA4KS4KKworCSogaHByZWFkLmMgKHN0cnVjdCBocHJlYWRfc3ltZmlsZV9pbmZvKTogRGVsZXRlIGhhdmVfbW9kdWxlIGZpZWxkCisJYW5kIGFjY2Vzc29yIG1hY3JvLiAgTWlub3IgaW5kZW50YXRpb24gZml4LgorCShocHJlYWRfYnVpbGRfcHN5bXRhYnMsIGNhc2UgS19NT0RVTEUpOiAgT25seSBzdGFydCBhIG5ldyBwc3ltdGFiCisJYW5kIHJlc2V0IHN0YXRlIHZhcmlhYmxlcyBoYXZlX25hbWUgJiB0ZXh0aGlnaCBpZiBwc3QgaXMgTlVMTC4KKwkoaHByZWFkX2J1aWxkX3BzeW10YWJzLCBjYXNlIEtfU1JDRklMRSk6IE9ubHkgcmVzZXQgdGhlIG5hbWUgb2YgYQorCXBhcnRpYWwgc3ltYm9sIHRhYmxlIGlmIHBzdCBpcyBub24tTlVMTC4gIElmIHBzdCBpcyBOVUxMLCB0aGVuCisJc3RhcnQgYSBuZXcgcHN5bXRhYi4KKwkoaHByZWFkX3Byb2Nlc3Nfb25lX2RlYnVnX3N5bWJvbCwgY2FzZSBLX01PRFVMRSk6IE5vdyBlbXB0eS4KKwkoaHByZWFkX3Byb2Nlc3Nfb25lX2RlYnVnX3N5bWJvbCwgY2FzZSBLX1NSQ0ZJTEUpOiBTaW1wbGlmeSBhbmQKKwljb3JyZWN0IGhhbmRsaW5nIG9mIHN1YmZpbGVzLgorCitNb24gU2VwIDI2IDAyOjU5OjAwIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZGVmcy5oIChtaXNjX2NvbW1hbmRfdHlwZSk6ICBSZW1vdmUgdHJhaWxpbmcgY29tbWEgZnJvbQorCWVudW1lcmF0b3IgbGlzdC4KKworU3VuIFNlcCAyNSAyMzoxOTo1OCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHBwYS10ZGVwLmMgKGZyYW1lX3NhdmVkX3BjKTogRml4IHRoaW5rbyBpbiBjb2RlIHRvIGRpZyBzYXZlZCBwYworCW91dCBvZiBhbiBpbnRlcnJ1cHQgZnJhbWUuCisKK1N1biBTZXAgMjUgMTI6NTA6MTcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBpbmZjbWQuYyAoZG9fcmVnaXN0ZXJzX2luZm8pIFtJTlZBTElEX0ZMT0FUXTogT25seSB1c2UgaWYKKwlkZWZpbmVkLgorCSogdmFsdWVzLmMgKHVucGFja19kb3VibGUpIFtJTlZBTElEX0ZMT0FUXTogRGl0dG8uCisJKiBtaXBzLXRkZXAuYyAobWlwc19wcmludF9yZWdpc3Rlcik6IERvbid0IHRlc3QgZmxvYXQgdmFsaWRpdHkuCisJKiBjb25maWcvYTI5ay90bS1hMjlrLmgsIGNvbmZpZy9hbHBoYS90bS1hbHBoYS5oLAorCWNvbmZpZy9hcm0vdG0tYXJtLmgsIGNvbmZpZy9jb252ZXgvdG0tY29udmV4LmgsCisJY29uZmlnL2g4MzAwL3RtLWg4MzAwLmgsIGNvbmZpZy9oODUwMC90bS1oODUwMC5oLAorCWNvbmZpZy9pMzg2L3RtLWkzODZ2LmgsIGNvbmZpZy9pMzg2L3RtLXN1bjM4Ni5oLAorCWNvbmZpZy9pOTYwL3RtLWk5NjAuaCwgY29uZmlnL202OGsvdG0tbTY4ay5oLAorCWNvbmZpZy9tODhrL3RtLW04OGsuaCwgY29uZmlnL21pcHMvdG0tbWlwcy5oLAorCWNvbmZpZy9uczMyay90bS1tZXJsaW4uaCwgY29uZmlnL25zMzJrL3RtLW5ic2QuaCwKKwljb25maWcvbnMzMmsvdG0tbnMzMmttMy5oLCBjb25maWcvbnMzMmsvdG0tdW1heC5oLAorCWNvbmZpZy9wYS90bS1ocHBhLmgsIGNvbmZpZy9weXIvdG0tcHlyLmgsCisJY29uZmlnL3JzNjAwMC90bS1yczYwMDAuaCwgY29uZmlnL3NoL3RtLXNoLmgsCisJY29uZmlnL3NwYXJjL3RtLXNwYXJjLmgsIGNvbmZpZy96OGsvdG0tejhrLmggKElOVkFMSURfRkxPQVQpOgorCVJlbW92ZSBkZWZpbml0aW9uLgorCitTdW4gU2VwIDI1IDA2OjA3OjM3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBUT0RPOiBSZW1vdmUgaXRlbSBhYm91dCBhZGRpbmcgZ2VuZXJhbCBtdWx0aS10aHJlYWRlZCBzdHVmZjsKKwl0aGlzIGlzIGRvbmUuCisJUmVtb3ZlIGl0ZW0gYWJvdXQgc3BlY2lmeWluZyBhcmJpdHJhcnkgbG9jYXRpb25zIG9mIHN0YWNrIGZyYW1lcworCSh0aGlzIHdvcmtzIG9uIHNvbWUgbWFjaGluZXMpLgorCVJlbW92ZSBpdGVtIGFib3V0IGRlYnVnZ2luZyBmdW5jdGlvbnMgd2l0aG91dCBhIGZyYW1lIHBvaW50ZXIKKwkodGhpcyB3b3JrcyBvbiBzb21lIG1hY2hpbmVzKS4KKwlSZW1vdmUgaXRlbSBhYm91dCByZS13cml0aW5nIG1hY3JvcyB3aGljaCBoYW5kbGUgZnJhbWUgY2hhaW5pbmcgYW5kCisJZnJhbWVsZXNzIGZ1bmN0aW9ucy4gIFRoZXkgaGF2ZSBiZWVuIHJlLXdyaXR0ZW4gYXQgbGVhc3Qgb25jZQorCXNpbmNlIHRoYXQgaXRlbSB3YXMgd3JpdHRlbi4KKwlSZW1vdmUgaXRlbSBhYm91dCBnZGIgY2F0Y2hpbmcgU0lHSU5UIHdoZW4gYXR0YWNoZWQ7IHRoaXMgaXMgZG9uZS4KKwlSZW1vdmUgaXRlbSBhYm91dCBoYXZpbmcgbGlzdF9jb21tYW5kIG5vdCByZWFkIHN5bWJvbHMtLXdoeSBib3RoZXI/CisKK1NhdCBTZXAgMjQgMTc6NDA6MTAgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBUT0RPOiBBcHBlbmQgY29udGVudHMgb2YgUHJvamVjdHMgZmlsZS4KKwkqIFByb2plY3RzOiBSZW1vdmUuCisKK1NhdCBTZXAgMjQgMDE6NDc6MjUgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb3JlbG93LmMgKGFkZF9zb2xpYl9zdHViKTogIFJlbW92ZSBjb3B5aW5nIG9mIHRvX3NlY3Rpb25zLAorCXBhc3MgY3VycmVudF90YXJnZXQgdG8gU09MSUJfQURELiBUaGUgU2VwIDEwIGNoYW5nZSBmYWlsZWQKKwlpZiBTT0xJQl9BREQgZXJyb3JlZCBvdXQsIG9yIGlmIFNPTElCX0FERCB3YXMgdHJ5aW5nIHRvIGFjY2VzcworCXRhcmdldCBtZW1vcnkuCisJKiBjb3JlbG93LmMgKGNvcmVfb3Blbik6ICBBZnRlciByZWFkaW5nIHRoZSBzaGFyZWQgbGlicmFyaWVzLAorCWNvcHkgdGhlIG1vZGlmaWVkIHRvX3NlY3Rpb25zIHZlY3RvciBmcm9tIGN1cnJlbnRfdGFyZ2V0IHRvCisJY29yZV9vcHMsIHNvIHRoYXQgY29yZV9jbG9zZSBjYW4gZnJlZSBpdCBsYXRlci4KKwkqIGNvbmZpZy9yczYwMDAvbm0tcnM2MDAwLmgsIHJzNjAwMC1uYXQuYyAoeGNvZmZfcmVsb2NhdGVfY29yZSk6CisJUGFzcyBkb3duIHRhcmdldCBwYXJhbWV0ZXIgZnJvbSBTT0xJQl9BREQgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mCisJZGlyZWN0bHkgYWNjZXNzaW5nIGNvcmVfb3BzLgorCitGcmkgU2VwIDIzIDE0OjU4OjQ5IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BydGwuY3lnbnVzLmNvbSkKKworCSogc29saWIuYzogKkJTRCBzeXN0ZW1zIG5lZWQgPGEub3V0Lmg+IHRvIGJlIGluY2x1ZGVkIGJlZm9yZQorCSAgPGxpbmsuaD4uCisKKwkqIGkzODZiLW5hdC5jOiBBZGQgaTM4Nl9mbG9hdF9pbmZvKCksIGV0Yy4KKwkqIGNvbmZpZy9pMzg2L25tLW5ic2QuaDogI2RlZmluZSBGTE9BVF9JTkZPLgorCisJKiBjb25maWcvbm0tbmJzZC5oOiBOZXcgZmlsZSwgZm9yIGdlbmVyaWMgTmV0QlNEIG5hdGl2ZSBzdXBwb3J0LgorCSogY29uZmlnL2kzODYvbm0tbmJzZC5oOiBVc2UgaXQuCisJKiBjb25maWcvc3BhcmMvbm0tbmJzZC5oOiBVc2UgaXQuCisJKiBjb25maWcvbnMzMmsvbm0tbmJzZC5oOiBVc2UgaXQuCisKKwkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLW5ldGJzZCk6IFVzZSBjb25maWcvaTM4Ni9uYnNkLm1baHRdLgorCSAgKG5zMzJrLSotbmV0YnNkKTogVXNlIGNvbmZpZy9uczMyay9uYnNkLm1baHRdLgorCSogY29uZmlnL2kzODYve25ic2QubWgsbmJzZC5tdCxubS1uYnNkLmgsdG0tbmJzZC5oLHhtLW5ic2QuaH06CisJICBOZXcgZmlsZXMsIHN1cHBvcnQgZm9yIE5ldEJTRC9pMzg2LgorCSogY29uZmlnL25zMzJrL3tuYnNkLm1oLG5ic2QubWgsbm0tbmJzZC5oLHRtLW5ic2QuaCx4bS1uYnNkLmh9OgorICAgICAJICBOZXcgZmlsZXMsIHN1cHBvcnQgZm9yIE5ldEJTRC9uczMyay4KKworVHVlIFNlcCAyMCAxMTozNDoyNyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogLmdkYmluaXQ6IEFkZCBsaXN0LW9iamZpbGVzIGNvbW1hbmQuCisKKwkqIFRPRE86IFJld29yZCBpdGVtIHJlZ2FyZGluZyBOT19TVERfUkVHUy4KKworCSogY29mZnJlYWQuYyAocmVjb3JkX21pbmltYWxfc3ltYm9sLCBjb2ZmX3JlYWRfZW51bV90eXBlLAorCWNvZmZfcmVhZF9zdHJ1Y3RfdHlwZSk6IEFsbG9jYXRlIG9uIHN5bWJvbF9vYnN0YWNrLCBub3QgZGlyZWN0bHkKKwl2aWEgbWFsbG9jL3NhdmVzdHJpbmcuCisKK1R1ZSBTZXAgMjAgMTU6NDI6MDIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBUT0RPOiBBZGQgbW9yZSBpdGVtcy4KKwkqIHRlc3RzOiBSZW1vdmUgdGhlIGRpcmVjdG9yeSBhbmQgYWxsIG9mIGl0cyAob2Jzb2xldGUpIGNvbnRlbnRzLgorCitUdWUgU2VwIDIwIDExOjM0OjI3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb2ZmcmVhZC5jIChpbml0X3N0cmluZ3RhYik6IFdoZW4gY29weWluZyBsZW5ndGggdG8gc3RyaW5ndGFiLAorCXVzZSB0YXJnZXQgZm9ybWF0LCBub3QgaG9zdCBmb3JtYXQsIHNpbmNlIHRoYXQgaXMgd2hhdCB0aGUgcmVzdCBvZgorCXRoZSBjb2RlIGFzc3VtZXMuCisKK01vbiBTZXAgMTkgMTU6NDg6MTAgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogUmVtb3ZlZCBwcmVsdWRlLm8sIGkzODYtbmxtc3R1Yi5vLCBubG1zdHViLm8sCisJICBubG1zdHViLm5sbSwgYW5kIG5sbXN0dWIgdGFyZ2V0cy4gIFJlbW92ZWQgTldTT1VSQ0UgYW5kCisJICBOV0lOQ0xVREVTIGRlZmluaXRpb25zLgorCSogaTM4Ni1ubG1zdHViLmM6IFJlbW92ZWQuCisKK01vbiBTZXAgMTkgMDc6NDg6MzYgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X2R5bmFtaWNfc3ltdGFiKTogQ2FzdCBiZmRfYXN5bWJvbF9uYW1lIHRvCisJY2hhciAqIChmcm9tIGNvbnN0IGNoYXIgKikgYmVmb3JlIGFzc2lnbmluZy4gIERvbid0IHNhdmUgc3RyaW5nIHdlCisJcGFzcyB0byByZWNvcmRfbWluaW1hbF9zeW1ib2wgKGl0IGFscmVhZHkgc2F2ZXMgaXQpLgorCisKK1NhdCBTZXAgMTcgMDI6MjY6NTggMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjcC12YWxwcmludC5jIChzdGF0aWNfZmllbGRfcHJpbnQpOiAgTmV3IHZhcmlhYmxlLCBjb250cm9scworCXByaW50aW5nIG9mIHN0YXRpYyBtZW1iZXJzLgorCShfaW5pdGlhbGl6ZV9jcF92YWxwcmludCk6ICBOZXcgcHJpbnQgc2V0IHN1YmNvbW1hbmQKKwkic3RhdGljLW1lbWJlcnMiLiBUdXJuIG9uIHByaW50aW5nIG9mIHN0YXRpYyBtZW1iZXJzIGJ5IGRlZmF1bHQuCisJKGNwX3ByaW50X3ZhbHVlX2ZpZWxkcyk6ICBQcmludCBzdGF0aWMgbWVtYmVycyBpZiBuZWNlc3NhcnkuCisKKwkqIHNvbGliLmM6ICBSZW1vdmUgaW5jbHVzaW9uIG9mIGxpYmVsZi5oIGFuZCBlbGYvbWlwcy5oLgorCShlbGZfbG9jYXRlX2Jhc2UpOiAgVXNlIG9ubHkgc3RhbmRhcmQgQkZEIGZ1bmN0aW9ucyB0byBjb2xsZWN0CisJaW5mb3JtYXRpb24gYWJvdXQgdGhlIC5keW5hbWljIHNlY3Rpb24uIENoZWNrIGZvciBEVF9NSVBTX1JMRF9NQVAKKwl0YWcgb25seSBpZiBpdCBnb3QgZGVmaW5lZCB2aWEgdGhlIGluY2x1c2lvbiBvZiA8bGluay5oPi4KKworCSogZi1leHAueTogIFdyaXRlIGJsb2NrIGZvciBPUF9WQVJfVkFMVUUuCisJKiBmLXZhbHByaW50LmMgKGluZm9fY29tbW9uX2NvbW1hbmQpOiAgSGFuZGxlIGBpbmZvIGNvbW1vbicKKwl3aXRob3V0IGFuIGFyZ3VtZW50IGNvcnJlY3RseS4KKworCSogYy10eXBlcHJpbnQuYyAoY190eXBlX3ByaW50X2Jhc2UpOiAgSGFuZGxlIHRlbXBsYXRlIGNvbnN0cnVjdG9ycy4KKwkqIHN5bXRhYi5jIChnZGJfbWFuZ2xlX25hbWUpOiAgSGFuZGxlIHRlbXBsYXRlIG1ldGhvZCBtYW5nbGluZywKKwlnZXQgcmlkIG9mIEdDQ19NQU5HTEVfQlVHIGNvZGUsIHdoaWNoIG9ubHkgYXBwbGllZCB0byBnY2MtMi4yLjIuCisKK0ZyaSBTZXAgMTYgMTY6MDY6MDggMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIGdkYnR5cGVzLmggKFRZUEVfSU5ERVhfVFlQRSk6ICBOZXcgbWFjcm8uCisJKiBjaC10eXBlcHJpbnQuYywgY2gtdmFscHJpbnQuYzogIFVzZSBUWVBFX0lOREVYX1RZUEUuCisJKiBjaC12YWxwcmludC5jIChjaGlsbF92YWxfcHJpbnQpOiAgUGFzcyBpbmRleCB0eXBlIGRpcmVjdGx5CisJKGluc3RlYWQgb2YgaXRzIFRZUEVfVEFSR0VUX1RZUEUpIHRvIHByaW50X3R5cGVfc2NhbGFyLgorCSogc3RhYnNyZWFkLmMgKHJlYWRfdHlwZSk6ICBEb24ndCBzZXQgVFlQRV9GTEFHX1RBUkdFVF9TVFVCCisJaWYgdGhlIGluZGV4IHR5cGUgaXMgYSBzdHViLgorCitGcmkgU2VwIDE2IDE3OjE4OjQ0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2kzODYve2kzODZhaXgubWgsIGkzODZic2QubWgsIGkzODZseW54Lm1oLCBpMzg2c2NvLm1oLAorCWkzODZzY280Lm1oLCBpMzg2c29sMi5taCwgaTM4NnYubWgsIGkzODZ2MzIubWgsIGkzODZ2NC5taCwKKwluY3IzMDAwLm1oLCBwdHgubWgsIHB0eDQubWh9LCBjb25maWcvbTY4ay97YWx0b3MubWgsIGFwb2xsbzY4di5taCwKKwlkZWx0YTY4Lm1oLCBkcHgyLm1oLCBocDMwMGJzZC5taCwgaHAzMDBocHV4Lm1oLCBtNjhrbHlueC5taCwKKwltNjhrdjQubWh9LCBjb25maWcvbTg4ay97ZGVsdGE4OC5taCwgZGVsdGE4OHY0Lm1ofSwKKwljb25maWcvbWlwcy9yaXNjb3MubWgsIGNvbmZpZy9wYS9ocHBhaHB1eC5taCwKKwljb25maWcvcnM2MDAwL3JzNjAwMGx5bngubWgsIGNvbmZpZy9zcGFyYy97c3BhcmNseW54Lm1oLAorCXN1bjRzb2wyLm1ofSwgY29uZmlnL3RhaG9lL3RhaG9lLm1oLCBjb25maWcvdmF4L3t2YXhic2QubWgsCisJdmF4dWx0Lm1oLCB2YXh1bHQyLm1ofSAoUkVHRVgsIFJFR0VYMSwgU1lTVl9ERUZJTkUpOiBObyBsb25nZXIKKwlkZWZpbmUuCisJKiBjb25maWcvaTM4Ni9pMzg2c2NvNC5taCAoTVVOQ0hfREVGSU5FKTogTm8gbG9uZ2VyIGRlZmluZS4KKworRnJpIFNlcCAxNiAxNTo0MDozNCAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBkZWZzLmggKFFVSVQpOiAgQ2FsbCBpbnRlcmFjdGl2ZV9ob29rIHRvIGFsbG93IEdVSSB0byBpbnRlcnJ1cHQuCisJQWxzbywgYWRkIGRlY2wgZm9yIHN5bXRhYl90b19maWxlbmFtZS4KKwkqIHNvdXJjZS5jIChzeW10YWJfdG9fZmlsZW5hbWUpOiAgTmV3LiAgUmV0dXJucyB0aGUgZmlsZQorCWFzc29jaWF0ZWQgd2l0aCBhIHN5bXRhYi4KKwkqIHRvcC5jOiAgRGVmaW5lIGludGVyYWN0aXZlX2hvb2suICBDYWxsZWQgZHVyaW5nIFFVSVQgdG8gYW5pbWF0ZQorCXRoZSBHVUkuCisKK0ZyaSBTZXAgMTYgMDA6MTQ6NDAgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIHN0YWJzcmVhZC5jIChyZWFkX3R5cGUpOiAgSGFuZGxlIHN0dWIgdHlwZXMgZm9yIGJpdHN0cmluZ3MuCisJKiBzdGFic3JlYWQuYyAocmVhZF9hcnJheV90eXBlKTogIENoZWNrIGZvciBzdHViIGRvbWFpbiB0eXBlCisJdXNpbmcgVFlQRV9GTEFHX1NUVUIsIG5vdCBpdHMgbGVuZ3RoLgorCSogZ2RidHlwZXMuYyAoY3JlYXRlX3NldF90eXBlKTogIEhhbmRsZSBhIHN0dWIgZG9tYWluIHR5cGUuCisKKwkqIGNoLWV4cC55OiAgR2V0IHJpZCBvZiBzb21lIGV4dHJhIG5vbi10ZXJtaW5hbHMsIGFuZCBtb3ZlCisJdGhlaXIgcnVsZXMgaW50byBwcmltaXRpdmVfdmFsdWUuCisJKiBwYXJzZXItZGVmcy5oOiAgQWRkIGNvbW1lbnQgYWJvdXQgdW5hcnkgcG9zdGZpeCBvcGVyYXRvcnMuCisJKiBjaC1sYW5nLmMgKGNoaWxsX29wX3ByaW50X3RhYik6ICBBZGQgJy0+JywgcG9zdGZpeCBhbmQgcHJlZml4LgorCSogZXhwcHJpbnQuYyAocHJpbnRfc3ViZXhwKTogIFJlY29nbml6ZSB1bmFyeSBwb3N0Zml4IG9wZXJhdG9yLgorCitXZWQgU2VwIDE0IDE4OjI3OjQyIDE5OTQgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQorCisgICAgICAgICogcmVtb3RlLWhtcy5jOiB1c2UgcmVtb3RlX2RlYnVnIGluc3RlYWQgb2YgaG1zX3NpbGVudCB0b2dnbGUuCisgICAgICAgIEFkZCB3YXJuaW5ncyBhYm91dCBkZXByZWNpYXRpb24gb2YgYHNub29wJyBjbWQuCisKK1dlZCBTZXAgMTQgMTg6MTg6NTggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLWhtcy5jIChobXNfcmVhZF9pbmZlcmlvcl9tZW1vcnkpOiAgQ29wZSB3aGVuCisJdGFyZ2V0IHNlbmRzIGJvdGggXHIgYW5kIFxuLgorCitXZWQgU2VwIDE0IDE3OjE0OjU3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLW1pcHMuYyAobWlwc19lcnJvcik6IFBsYWNlIE5PUkVUVVJOIG1hY3JvIGNvcnJlY3RseS4KKwkqIFRPRE86IEFkZCBpdGVtIGFib3V0IFNUQVJUX0lORkVSSU9SX1RSQVBTX0VYUEVDVEVELgorCitXZWQgU2VwIDE0IDE0OjI2OjIxIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiB4Y29mZnJlYWQuYyAocmVhZF94Y29mZl9zeW10YWIpOiBGaXggb2Jzb2xldGUgY29tbWVudCBhYm91dAorCW1zdF9zb2xpYl90cmFtcG9saW5lLgorCisJKiBmLXZhbHByaW50LmMgKGZfdmFsX3ByaW50KTogQ2hhbmdlIGNhc3Qgb2YgdmFsYWRkciBmcm9tCisJQ09SRV9BRERSICogdG8gY2hhciAqKiwgc2luY2UgdGhhdCBpcyBob3cgaXQgaXMgdXNlZC4KKworCSogZGJ4cmVhZC5jIChyZWFkX2RieF9keW5hbWljX3N5bXRhYik6IFNhdmUgY29weSBvZiBzeW1ib2wgbmFtZXMKKwl1c2luZyBvYnNhdmVzdHJpbmcsIGFuZCBwYXNzIHRoYXQgdG8gcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2wuCisJSGF2aW5nIHRoZSBvYmpmaWxlIHBvaW50IHRvIGJmZF9hc3ltYm9sX25hbWUgZGlyZWN0bHkgZG9lc24ndCB3b3JrCisJaWYgd2Ugc2F2ZSBhbmQgcmVzdG9yZSBhIG1hcHBlZCBzeW1ib2wgZmlsZS4KKworCitUdWUgU2VwIDEzIDE4OjIzOjI2IDE5OTQgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKKworCSogdzg5ay1yb20uYywgb3A1MC1yb20uYywgbW9uaXRvci5jLCBjb25maWcvcGEvaHBwYXByby5tdDogTmV3IGZpbGVzCisJdG8gYWRkIGEgZ2VuZXJpYyBST00gbW9uaXRvciBpbnRlcmZhY2UsIGFuZCBzdXBwb3J0IGZpbGUgZm9yIHRoZQorCVdpbkJvbmQgVzg5SyBhbmQgdGhlIE9raSBPUDUwTiBQQSBiYXNlZCB0YXJnZXQgYm9hcmRzLgorCisKK1N1biBTZXAgMTEgMjI6MzQ6NTcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy9wYS90bS1ocHBhLmggKFJFR0lTVEVSX05BTUVTKTogVXNlIHIyNi1yMjMgZm9yIGFyZzAtYXJnMy4KKworU3VuIFNlcCAxMSAwNDozNjo0NyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGlyaXg1LW5hdC5jLCBvc2Zzb2xpYi5jLCBzb2xpYi5jIChzb2xpYl9hZGQpOiAgU2ltcGxpZnkgbGFzdAorCWNoYW5nZSBieSByZXBsYWNpbmcgYHN5bWJvbHNfYWRkZWQnIHdpdGggYHNvX2xhc3QnLgorCSogbWRlYnVncmVhZC5jIChwYXJzZV9leHRlcm5hbCwgcGFyc2VfcGFydGlhbF9zeW1ib2xzKTogIElnbm9yZQorCWdsb2JhbCBjb21tb24gc3ltYm9scywgdGhleSB3aWxsIGJlIHJlc29sdmVkIGJ5IHRoZSBydW50aW1lIGxvYWRlci4KKwkqIG1kZWJ1Z3JlYWQuYyAocGFyc2Vfc3ltYm9sLCBwYXJzZV9wYXJ0aWFsX3N5bWJvbHMsIGNyb3NzX3JlZik6CisJSGFuZGxlIHNjU0NvbW1vbiBsaWtlIHNjQ29tbW9uIHN5bWJvbHMuCisKK1NhdCBTZXAgMTAgMDE6NDM6MjggMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb3JlbG93LmMgKGFkZF9zb2xpYl9zdHViKTogIENvcHkgdG9fc2VjdGlvbnMgY2hhbmdlcyBmcm9tCisJY29yZV9vcHMgdG8gY3VycmVudF90YXJnZXQgYWZ0ZXIgYWRkaW5nIHRoZSBzaGFyZWQgbGlicmFyaWVzLgorCSogcGFydGlhbC1zdGFiLmggKE5fRVhDTCksIGRieHJlYWQuYyAoYWRkX29sZF9oZWFkZXJfZmlsZSwKKwlmaW5kX2NvcnJlc3BvbmRpbmdfYmluY2xfcHN5bXRhYik6ICBDaGFuZ2UgYHJlcGVhdGVkIGhlYWRlciBub3Qgc2VlbicKKwllcnJvciB0byBhIGNvbXBsYWludCwgc2ltcGxpZnkgY29tcGxhaW50LgorCSogcHJvY2ZzLmMgKHNpZ25hbG5hbWUsIGVycm5vbmFtZSk6ICBNYWtlIGBuYW1lJyBjb25zdC4KKwkqIHN5bWZpbGUuYyAocmVyZWFkX3N5bWJvbHMpOiAgVXNlIGZpbGVuYW1lIGZyb20gb2xkIEJGRCB0bworCXJlb3BlbiB0aGUgb2JqZmlsZS4KKwkqIHZhbHVlcy5jIChyZWNvcmRfbGF0ZXN0X3ZhbHVlKTogIERvbid0IHJlY29yZCB2YWx1ZSBpbiB0aGUKKwloaXN0b3J5IGNoYWluIHVudGlsIHdlIGFyZSBzdXJlIHRoZXJlIHdvbid0IGJlIGFuIGVycm9yLgorCitGcmkgU2VwICA5IDE1OjUyOjA5IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKKworCSogbmxtL01ha2VmaWxlLmluOiByZW1vdmUgTU1BTExPQywgUkVBRExJTkUsIFRFUk1DQVAsIGFuZCBvdGhlcgorCSAgY3J1ZnQuCisKKwkqIGNvbmZpZy9pMzg2L2dkYnNlcnZlLm10OiBOZXcgZmlsZSwgZGVmcyBmb3IgaTM4NiBubG0gc3R1Yi4KKworVGh1IFNlcCAgOCAxNzoxNDo0MyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiByZW1vdGUuYyAoZnJvbWhleCk6IE1ha2UgZXJyb3IgbW9yZSBleHBsaWNpdC4KKwkocmVhZF9mcmFtZSk6IERvbid0IHByaW50IGJhZCBjaGVja3N1bSBpbmZvcm1hdGlvbiB1bmxlc3MKKwlyZW1vdGVfZGVidWdnaW5nLiAgRG9uJ3QgdXNlIHJlcGVhdCBjb3VudCB1bmxlc3MgaXQncyA+IDAuCisJKiByZW1vdGUtZTcwMDAuYyAoZXhwZWN0KTogV2hlbiBlY2hvaW5nLCBpZ25vcmUgbXVsdGlwbGUgbmV3bGluZXMuCisJKGU3MDAwX2luc2VydF9icmVha3BvaW50LCBlNzAwMF9yZW1vdmVfYnJlYWtwb2ludCwgdGFyZ2V0X29wcyk6CisJT3B0aW9uYWxseSBjb3BlIHdpdGggQkMgc3R5bGUgYnJlYWtwb2ludHMuICAKKwkoZTcwMDBfY29tbWFuZCk6ICBBZnRlciBjb21tYW5kIHNlbmQgZGlyZWN0bHkgdG8gdGhlIEU3MDAwIG1hcmsKKwlyZWdpc3RlcnMgYXMgY2hhbmdlZC4gCisJKHdoeV9zdG9wLCBlNzAwMF93YWl0OiBVbmRlcnN0YW5kIEJDIHN0eWxlIHN0b3AgY29uZGl0aW9uLgorCSogc2gtdGRlcC5jIChzaF9za2lwX3Byb2xvZ3VlKTogIFVuZGVyc3RhbmQgbW9yZSBjb21wbGljYXRlZAorCXNlcXVlbmNlcy4gIChmcmFtZV9maW5kX3NhdmVkX3JlZ3MpOiBMaWtld2lzZS4KKwkqIGNvbmZpZy9oODUwMC90bS1oODUwMC5oICh0YXJnZXRfd3JpdGVfcGMsIFRBUkdFVF9XUklURV9QQyk6CisJSGFuZGxlIGV4dHJhIGFyZy4KKwkqIGNvbmZpZy9pMzg2L3htLWdvMzIuaCAoR0RCSU5JVF9GSUxFTkFNRSk6IFNldCB0byBnZGIuaW5pLgorCShtb3JlIHdvcmsgaGVyZSB0byBjb21lKQorCSogY29uZmlnL3NoL3RtLXNoLmggKEVYVFJBX0ZSQU1FX0lORk8pOiBBZGQgZl9vZmZzZXQgYW5kIGxlYWZfZnVuY3Rpb24KKwlmaWVsZHMuCisKK1RodSBTZXAgIDggMTY6MTU6MzQgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHJ0bC5jeWdudXMuY29tKQorCisJKiBzcGFyY2xpdGUvTWFrZWZpbGUuaW46IEFzc29ydGVkIHN0dWZmIG5lZWRlZCBmb3IgZWxvYWQuCisKKwkqIHNwYXJjbGl0ZS9lbG9hZC5jOiBNZXJnZSBpbiBjb21tYW5kIGxpbmUgYXJndW1lbnQgcGFyc2luZyBhbmQKKwkgIGVycm9yIG1lc3NhZ2UgaGFuZGxpbmcgaW1wcm92ZW1lbnRzIG9yaWduYWxseSBtYWRlIHRvIGFsb2FkLmMuCisKK1dlZCBTZXAgIDcgMjM6MjQ6NTAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGRlZnMuaCAoZW51bSBtaXNjX2NvbW1hbmRfdHlwZSwgY29tbWFuZF9jb250cm9sX3R5cGUpOiBFbnVtcworCWZvciBkZXNjcmliaW5nIHRoZSBjb21tYW5kIGFuZCBjb250cm9sIHR5cGVzLgorCShzdHJ1Y3QgY29tbWFuZF9saW5lKTogQWRkIG5ldyBmaWVsZHMgdG8ga2VlcCB0cmFjayBvZiB0aGUgY29tbWFuZAorCXR5cGUgYW5kIGJvZHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21tYW5kLgorCSogdG9wLmM6IEluY2x1ZGUgdmFsdWUuaC4gIERlbGV0ZSB3aGl0ZXNwYWNlIGF0IHRoZSBlbmQgb2YgbGluZXMuCisJKGJ1aWxkX2NvbW1hbmRfbGluZSwgZ2V0X2NvbW1hbmRfbGluZSk6IE5ldyBmdW5jdGlvbnMuCisJKGV4ZWN1dGVfY29udHJvbF9jb21tYW5kLCB3aGlsZV9jb21tYW5kLCBpZl9jb21tYW5kKTogTGlrZXdpc2UuCisJKHJlYWxsb2NfYm9keV9saXN0LCByZWFkX25leHRfbGluZSk6IExpa2V3aXNlLgorCShyZWN1cnNlX3JlYWRfY29udHJvbF9zdHJ1Y3R1cmUpOiBMaWtld2lzZS4KKwkoZXhlY3V0ZV91c2VyX2NvbW1hbmQpOiBDYWxsIGV4ZWN1dGVfY29udHJvbF9jb21tYW5kLgorCShyZWFkX2NvbW1hbmRfbGluZXMpOiBTaW1wbGlmeSBieSBjYWxsaW5nIHJlYWRfbmV4dF9saW5lLCBjYWxsCisJcmVhZF9jb250cm9sX3N0cnVjdHVyZSBmb3IgImlmIiBhbmQgIndoaWxlIiBjb21tYW5kcy4KKwkoZnJlZV9jb21tYW5kX2xpbmVzKTogRnJlZSBuZXcgZmllbGRzIGluIHRoZSBjb21tYW5kIHN0cnVjdHVyZS4KKwkoZGVmaW5lX2NvbW1hbmQpOiBSZXNldCBjb250cm9sX2xldmVsIHRvIHplcm8uCisJKGluaXRfbWFpbik6IEluc3RhbGwgY29tbWFuZCBoYW5kbGVycyBmb3IgImlmIiBhbmQgIndoaWxlIiBjb21tYW5kcy4KKworVHVlIFNlcCAgNiAxNjoyNDowNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkgKiBjLXR5cGVwcmludC5jIChjX3R5cGVfcHJpbnRfdmFyc3BlY19wcmVmaXgsCisJIGNfdHlwZV9wcmludF92YXJzcGVjX3N1ZmZpeCk6IEFkZCBjYXNlcyBmb3IgRm9ydHJhbiB0eXBlIGNvZGVzLgorCSAqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKTogRm9yIE9QX0FSUkFZIGV4cHJlc3Npb25zIGluIEZvcnRyYW4sCisJIGNhbGwgZjc3X3ZhbHVlX2xpdGVyYWxfc3RyaW5nIGluc3RlYWQuCisJICogZl9leHAueTogSW5jbHVkZSA8c3RyaW5nLmg+LCBtb3ZlIGluY2x1ZGUgb2YgcGFyc2VyLWRlZnMuaC4KKwkgKHBhcnNlX251bWJlcik6IFRyYW5zbGF0ZSAnZCcgZmxvYXRzIHRvICdlJyBzbyBhdG9mKCkgd29ya3MuIAorCSAoeXlsZXgpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KKwkgKiBmLWxhbmcuYzogSW5jbHVkZSA8c3RyaW5nLmg+LgorCSAoZ2V0X2JmX2Zvcl9mY24pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgorCSAqIGYtdHlwZXByaW50LmMgKGZfdHlwZV9wcmludF92YXJzcGVjX3ByZWZpeCwKKwkgZl90eXBlX3ByaW50X3ZhcnNwZWNfc3VmZml4KTogUmVtb3ZlIHVudXNlZAorCSB2YXJpYWJsZXMsIGFkZCBjYXNlcyB0byBzd2l0Y2ggc3RhdGVtZW50cy4KKwkgKGZfdHlwZV9wcmludF9iYXNlKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCisJICogZi12YWxwcmludC5jIChnZGJjb3JlLmgsIGNvbW1hbmQuaCk6IEluY2x1ZGUuCisJIChmNzdfZ2V0X2R5bmFtaWNfbG93ZXJib3VuZCwgZjc3X2dldF9keW5hbWljX3VwcGVyYm91bmQpOgorCSBDYWxsIHJlYWRfbWVtb3J5X2ludGVnZXIgd2l0aCBjb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMuCisJIChmNzdfZ2V0X2R5bmFtaWNfdXBwZXJib3VuZCk6IENhbGwgZjc3X2dldF9keW5hbWljX2xvd2VyYm91bmQKKwkgd2l0aCBjb3JyZWN0IGFyZ3VtZW50IHR5cGUuCisJIChmNzdfcHJpbnRfYXJyYXkpOiBSZW1vdmVkIHVudXNlZCBhcnJheSBhcnJheV9zaXplX2FycmF5LgorCSAoZl92YWxfcHJpbnQpOiBEb24ndCB1c2UgYSBDT1JFX0FERFIgYXMgYSBjaGFyICouCisJICogdmFsb3BzLmMgKHZhbHVlX2Nhc3QpOiBIYW5kbGUgQ09NUExFWCBhbmQgQk9PTCB0eXBlcy4KKwkgKHZhbHVlX2Fzc2lnbik6IEhhbmRsZSBGb3J0cmFuIGxpdGVyYWwgc3RyaW5nIGFuZCBjb21wbGV4IHZhbHVlcy4KKwkgKGY3N19jYXN0X2ludG9fY29tcGxleCwgZjc3X2Fzc2lnbl9mcm9tX2xpdGVyYWxfc3RyaW5nLAorCSBmNzdfYXNzaWduX2Zyb21fbGl0ZXJhbF9jb21wbGV4KTogTmV3IGZ1bmN0aW9ucy4KKworTW9uIFNlcCAgNSAxNDo0Njo0MSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogY2gtdHlwZXByaW50LmMgKGNoaWxsX3R5cGVfcHJpbnRfYmFzZSk6ICBNYWtlIFRZUEVfQ09ERV9SQU5HRQorCWNhc2UgbW9yZSByb2J1c3QuCisKK1N1biBTZXAgIDQgMTY6MDY6MzQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBpOTYwLXRkZXAuYyAoc2lnbmFsLmgpOiBEb24ndCBpbmNsdWRlLgorCisJKiBjeHV4LW5hdC5jICh0YXJnZXRfaXNfbTg4MTEwKTogUmVtb3ZlIGRlZmluaXRpb24uCisKKwkqIGNvbmZpZ3VyZS5pbiAoY29uZmlnL25tLWVtcHR5LmgpOiBJZiBjcm9zcyBvbmx5LCB1c2UgaW5zdGVhZAorCW9mIGNvbmZpZy9ubS10cmFzaC5oLgorCSogY29uZmlnL25tLXRyYXNoLmg6IFJlbW92ZS4KKwkqIGNvbmZpZy9ubS1lbXB0eS5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZy9pMzg2L25tLW0zLmg6IE5ldyBmaWxlLCBpbmNsdWRlcyBjb25maWcvbm0tbTMuaC4KKwkqIGNvbmZpZy9taXBzL25tLW0zLmg6IE5ldyBmaWxlLCBpbmNsdWRlcyBjb25maWcvbm0tbTMuaC4KKwkqIGNvbmZpZy9tNjhrL25tLXN5c3Y0Lmg6IE5ldyBmaWxlLCBpbmNsdWRlcyBjb25maWcvbm0tc3lzdjQuaC4KKwkqIGNvbmZpZy9taXBzL25tLXN5c3Y0Lmg6IE5ldyBmaWxlLCBpbmNsdWRlcyBjb25maWcvbm0tc3lzdjQuaC4KKwkqIGNvbmZpZy9zcGFyYy9ubS1zeXN2NC5oOiBOZXcgZmlsZSwgaW5jbHVkZXMgY29uZmlnL25tLXN5c3Y0LmguCisKKworRnJpIFNlcCAgMiAxNzozNTo1NSAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogTm8gbG9uZ2VyIGxvb2sgZm9yIG5tLCB0bSwgYW5kIHhtIGhlYWRlcnMgaW4KKwkgIGNvbmZpZy88aGVhZGVyPjsgdGhleSBhcmUgYWx3YXlzIGluIGNvbmZpZy88Y3B1Pi88aGVhZGVyPi4KKworRnJpIFNlcCAgMiAxNjo0MDowMyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIG9iamZpbGVzLmMgKGFsbG9jYXRlX29iamZpbGUpOiBBZGQgdGhlIG5ld2x5LWNyZWF0ZWQgb2JqZmlsZSB0bworCXRoZSBlbmQgb2YgdGhlIGxpc3Qgb2Ygb2JqZmlsZXMsIGluc3RlYWQgb2YgYXQgdGhlIGJlZ2lubmluZy4KKworCSogeGNvZmZyZWFkLmMgKGFsbG9jYXRlX2luY2x1ZGVfZW50cnkpOiBOZXcgZnVuY3Rpb24sIGFic3RyYWN0ZWQKKwlmcm9tIGNvZGUgaW4gcmVjb3JkX2luY2x1ZGVfYmVnaW4uCisJKHJlY29yZF9pbmNsdWRlX2JlZ2luLCByZWNvcmRfaW5jbHVkZV9lbmQpOiBDYWxsIGl0LgorCisJKiBibG9ja2ZyYW1lLmMgKHJlaW5pdF9mcmFtZV9jYWNoZSk6IFRlc3QgaW5mZXJpb3JfcGlkIGluc3RlYWQgb2YKKwl0YXJnZXRfaGFzX3N0YWNrIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGNyZWF0ZSBhIHJlYWwgc3RhY2sgZnJhbWUKKwlmb3IgdGhlIGNhY2hlLgorCisJKiBjb2ZmcmVhZC5jIChwcm9jZXNzX2NvZmZfc3ltYm9sKSBbQ1hVWF9UQVJHRVRdOiBJZ25vcmUgdmVuZG9yCisJc2VjdGlvbi4KKwkqIGNvbmZpZy9tODhrL3RtLWN4dXguaCAoQ1hVWF9UQVJHRVQpOiBEZWZpbmUuCisKKwkqIGg4MzAwLXRkZXAuYzogSW5jbHVkZSAiZGlzLWFzbS5oIiBpbnN0ZWFkIG9mIDxkaXMtYXNtLmg+LgorCitGcmkgU2VwICAyIDA5OjUxOjQ2IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BjeWdudXMuY29tKQorCisJKiBjb25maWcvc3BhcmMvdG0tbmJzZC5oOiBBZGQgI2RlZmluZXMgdG8gbWFwIE5ldEJTRCBzdHJ1Y3QgYW5kCisJICBmaWVsZCBuYW1lcyBpbnRvIHdoYXQgaXMgZXhwZWN0ZWQgYnkgc3BhcmMtbmF0LmMuCisKK1RodSBTZXAgIDEgMTc6MzI6NTQgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIGMtdHlwZXByaW50LmMgKGNfdHlwZWRlZl9wcmludCk6ICBBZGQgbWlzc2luZyBDaGlsbCBzdXBwb3J0LgorCitUaHUgU2VwICAxIDE1OjQxOjIxIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIHJzNjAwMC1waW5zbi5jIChwcmludF9pbnNuKTogIFVzZSBwb3dlcnBjIGRpc2Fzc2VtYmxlciB3aGVuCisJZG9pbmcgUG93ZXIgUEMuCisJKiBjb25maWcvcG93ZXJwYy90bS1wcGMtbncuaDogIERlZmluZSBHREJfVEFSR0VUX1BPV0VSUEMuCisKKwkqIGNvbmZpZy9pMzg2L2kzODZseW54Lm1oLCBjb25maWcvbTY4ay9tNjhrbHlueC5taCwKKwljb25maWcvcnM2MDAwL3JzNjAwMGx5bngubWgsIGNvbmZpZy9zcGFyYy9zcGFyY2x5bngubWg6ICBFbmFibGUKKwlzZXItdGNwLgorCisJKiBubG0vTWFrZWZpbGUuaW46ICBHZXQgcmlkIG9mIE5XU09VUkNFLgorCSogbmxtL2FscGhhLWlvLlMgKGluVnRpLCBvdXRWdGkpOiAgUmVtb3ZlIGV4dHJhbmVvdXMgbGRoYSdzLgorCSogbmxtL2dkYnNlcnZlLm86ICBBZGQgZHVtbXkgX19tYWluIHJvdXRpbmUuCisJKiBubG0vZ2Ric2VydmUuZGVmOiAgVHVybiBvbiBkZWJ1Zy4KKworVGh1IFNlcCAgMSAxMjozNjozOSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3htLW5ic2QuaDogRG9uJ3QgZGVmaW5lIFNFVF9TVEFDS19MSU1JVF9IVUdFOyBpdCBpcyBvYnNvbGV0ZS4KKworVGh1IFNlcCAgMSAxMTowMTo0MCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcnRsLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy90bS1uYnNkLmg6IE5ldyBmaWxlLCBzdXBwb3J0IGZvciBhbGwgTmV0QlNEIHRhcmdldHMuCisJKiBjb25maWcveG0tbmJzZC5oOiBmaXggdHlwby4KKwkqIGNvbmZpZy9zcGFyYy97bm0sdG0seG19LW5ic2QuaDogTmV3IGZpbGVzLCByZW5hbWVkIGZyb20KKwkgIHtubSx0bSx4bX0tc3BhcmNuYnNkLmggdG8gY29uZm9ybSB0byBwcmVmZXJlZCBmaWxlIG5hbWluZworCSAgY29udmVudGlvbnMuCisJKiBjb25maWd1cmUuaW46IChzcGFyYy0qLW5ldGJzZCk6IHVzZSBjb25maWcvc3BhcmMvbmJzZC5tW2h0XS4KKworV2VkIEF1ZyAzMSAxNDo0MDozMyAxOTk0ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiByZW1vdGUtdWRpLmMgKHVkaV9yZWFkX2luZmVyaW9yX21lbW9yeSx1ZGlfd3JpdGVfaW5mZXJpb3JfbWVtb3J5KTogCisJY2hhbmdlIHR5cGVvIGluIGVycm9yIG1zZyAoYGluZmVycmlvcicgLT4gYGluZmVyaW9yJykuCisKK1dlZCBBdWcgMzEgMDk6MTc6MDIgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIGluZmxvdy5jIChzZXRfc2lnaW50X3RyYXAsIGNsZWFyX3NpZ2ludF90cmFwKTogQ2hlY2sgZm9yCisJYXR0YWNoX2ZsYWcgKHRoaXMgY2hlY2sgd2FzIHBlcmZvcm1lZCBieSB0aGUgY2FsbGVycykuICBBbHNvIGNoZWNrCisJaW5mZXJpb3JfdGhpc3J1bl90ZXJtaW5hbC4KKwkqIGluZnRhcmcuYyAoY2hpbGRfd2FpdCksIGx5bngtbmF0LmMgKGNoaWxkX3dhaXQpLAorCXByb2Nmcy5jICh3YWl0X2ZkKSwgc3ltbS1uYXQuYyAoY2hpbGRfd2FpdCk6IERvbid0IGNoZWNrCisJYXR0YWNoX2ZsYWcgaW4gZGVjaWRpbmcgd2hldGhlciB0byBjYWxsIHNldF9zaWdpbnRfdHJhcCBhbmQKKwljbGVhcl9zaWdpbnRfdHJhcC4gCisKKwkqIHZhbHVlLmggKHN0cnVjdCB2YWx1ZSk6IENoYW5nZSBsaXRlcmFsX2RhdGEgZnJvbSBQVFIgdG8gY2hhciAqLAorCXNpbmNlIHRoYXQgaXMgdGhlIHdheSBpdCBpcyB1c2VkLgorCitUdWUgQXVnIDMwIDIxOjU2OjU0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb21yZWFkLmMgKHNvbV9zeW1maWxlX3JlYWQpOiBGb3JjZSB1bndpbmRzIHRvIGJlIHJlLXJlYWQgYWZ0ZXIKKwlyZWFkaW5nIGluIGEgbmV3IHBhcnRpYWwgc3ltYm9sIHRhYmxlLgorCitUdWUgQXVnIDMwIDEzOjE0OjE2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2g4NTAwL3RtLTg1MDAuaCAoRE9OVF9VU0VfUkVNT1RFKTogUmVtb3ZlIGRlZmluaXRpb24sCisJYW4gb2Jzb2xldGUgY29uZGl0aW9uYWwuCisJKiBjb25maWcvcGEvdG0taHBwYS5oIChCUkVBS1BPSU5UKSBbS0VSTkVMREVCVUddOiBSZW1vdmUgdXNlLAorCWFuIG9ic29sZXRlIGNvbmRpdGlvbmFsLgorCSogY29uZmlnL3JzNjAwMC9yczYwMDAubWgsIGNvbmZpZy9yczYwMDAvcnM2MDAwLm10OiBDbGVhbiB1cAorCWNvbW1lbnRzLgorCitNb24gQXVnIDI5IDE0OjM5OjQyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKG5zMzJrLW9wY29kZS5oKTogUmVtb3ZlIHJlZmVyZW5jZS4KKwkobnMzMmstcGluc24ubyk6IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCisJKiBuczMyay1vcGNvZGUuaDogUmVtb3ZlIGZpbGUuCisJKiBuczMyay1waW5zbi5jIChwcmludF9pbnNuKTogQ2FsbCB2ZXJzaW9uIGluIGxpYm9wY29kZXMsIHJlbW92ZQorCWFsbCBvdGhlciBjb2RlIGluIHRoaXMgZmlsZS4gCisKK01vbiBBdWcgMjkgMTI6MDQ6MDcgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogbmxtL2NvbmZpZ3VyZS5pbjogIFN0b3AgdXNpbmcgY3B1LmMuICBQdXQgaXQgaW4gVERFUEZJTEVTIGluc3RlYWQuCisJKiBjb25maWcvYWxwaGEvZ2Ric2VydmUubXQgKFRERVBGSUxFUyk6ICBSZW1vdmUgYWxwaGEtcGF0Y2guby4KKworCSogbmxtL01ha2VmaWxlLmluOiAgQWRkIHJ1bGUgZm9yIC5TLm8uCisJKiBubG0vYWlvLmg6ICBQcm90ZWN0IGZyb20gbXVsdGlwbGUgaW5jbHVzaW9ucy4KKwkqIG5sbS9hbHBoYS1pby5TOiAgUmVtb3ZlIGV2ZXJ5dGhpbmcgd2UgZG9uJ3QgbmVlZC4KKwkqIG5sbS97YWxwaGEtcGF0Y2guYywgYWxwaGEtcGF0Y2guaCwgYWxwaGEtdWFydC5jLCBhbHBoYS11YXJ0Lmh9OgorCVJlbW92ZSwgbm8gbG9uZ2VyIG5lZWRlZC4KKwkqIG5sbS9hbHBoYS5jOiAgTWVyZ2UgaW4gbG90cyBvZiBzdHVmZiBmcm9tIHByZXZpb3VzIGZpbGVzLgorCSogbmxtL2FscGhhLmg6ICBEb24ndCAjaW5jbHVkZSBhbHBoYS1wYXRjaC5oLiAgTWFrZQorCWJyZWFrcG9pbnRfaW5zbiBleHRlcm4uCisJKiBNb3ZlIHN0dWZmIGZyb20gYWxwaGEtcGF0Y2guaCBpbnRvIGhlcmUuCisKKwkqIGNvbmZpZy9hbHBoYS9nZGJzZXJ2ZS5tdCAoVERFUEZJTEVTKTogIEdldCByaWQgb2YgYWxwaGEtdWFydC5vLgorCitNb24gQXVnIDI5IDExOjM0OjM0IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBhbm5vdGF0ZS5jIChhbm5vdGF0ZV9zdGFydGluZyk6IEZsdXNoIG91dHB1dC4KKworU2F0IEF1ZyAyNyAyMzozMjo0MyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIHN5bWZpbGUuYyAoc3ltYm9sX2ZpbGVfYWRkKTogIE1vdmUgcmVpbml0X2ZyYW1lX2NhY2hlIGNhbGwgdG8KKwl0aGUgY2FsbGVycyBvZiBzeW1ib2xfZmlsZV9hZGQuIEdldHMgcmlkIG9mIGhldXJpc3RpYyBmZW5jZS1wb3N0CisJd2FybmluZ3Mgb24gbWlwcyBhbmQgYWxwaGEgdGFyZ2V0cyB3aGVuIHRoZSBQQyByZXNpZGVzIGluIGEgc2hhcmVkCisJbGlicmFyeSB3aGljaCBpcyBub3QgeWV0IHJlYWQgaW4uCisJKiBjb2ZmLXNvbGliLmMgKGNvZmZfc29saWJfYWRkKSwgY3h1eC1uYXQuYyAoYWRkX3NoYXJlZF9zeW1ib2xfZmlsZXMpLAorCWlyaXg1LW5hdC5jIChzb2xpYl9hZGQpLCBvc2Zzb2xpYi5jIChzb2xpYl9hZGQpLAorCXJlbW90ZS12eC5jICh2eF9vcGVuKSwgc29saWIuYyAoc29saWJfYWRkKToKKwlBZGQgY2FsbCB0byByZWluaXRfZnJhbWVfY2FjaGUgYWZ0ZXIgYWxsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIHJlYWQgaW4uCisJKiByZW1vdGUtdWRpLmMgKHVkaV9sb2FkKSwgcmVtb3RlLXZ4LmMgKHZ4X2xvYWRfY29tbWFuZCksCisJc3ltZmlsZS5jIChzeW1ib2xfZmlsZV9jb21tYW5kLCBhZGRfc3ltYm9sX2ZpbGVfY29tbWFuZCk6CisJQWRkIGNhbGwgdG8gcmVpbml0X2ZyYW1lX2NhY2hlIGFmdGVyIHN5bWJvbF9maWxlX2FkZC4KKworV2VkIEF1ZyAyNCAxNzo0NToxNCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3htLW5ic2QuaDogTmV3IGZpbGUsIHN1cHBvcnQgZm9yIGFsbCBOZXRCU0QgcG9ydHMuCisJKiBjb25maWcvc3BhcmMve25tLXNwYXJjbmJzZC5oLHRtLXNwYXJjbmJzZC5oLHhtLXNwYXJjbmJzZC5oLAorCSAgc3BhcmNuYnNkLm1oLHNwYXJjbmJzZC5tdH06IE5ldyBmaWxlcywgc3VwcG9ydCBmb3IgTmV0QlNEL3NwYXJjLgorCSogY29uZmlndXJlLmluOiBBZGQgc3BhcmMtKi1uZXRic2QgdGFyZ2V0LgorCitXZWQgQXVnIDI0IDEzOjE3OjM0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXZ4LmMgKHZ4X2F0dGFjaCk6IEludGVycHJldCB0aGUgY29tbWFuZCBhcmd1bWVudCBhcyBhbgorCXVuc2lnbmVkIGxvbmcuCisKK1dlZCBBdWcgMjQgMTM6MDg6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IENoYW5nZSBpWzM0XTg2IHRvIGlbMzQ1XTg2LgorCSogbmxtL2NvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCisJKiBnZGJzZXJ2ZXIvY29uZmlndXJlLmluOiBMaWtld2lzZS4KKworV2VkIEF1ZyAyNCAwOTo0MTowOSAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChpMzg2LSotbmV0d2FyZSk6IEF1dG9tYXRpY2FsbHkgY29uZmlndXJlIG5sbQorCSAgc3ViZGlyLgorCitUdWUgQXVnIDIzIDE3OjUxOjEzIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BjeWdudXMuY29tKQorCisJKiBubG0vZ2Ric2VydmUuYzogY29uZGl0aW9uYWxpemUgaGVhZGVyIGZpbGUgaW5jbHVzaW9uIGZvciBlaXRoZXIKKwkgIE5ldFdhcmUgNC4wIG9yIFBJTiB0YXJnZXRzLgorCSogbmxtL2kzODYuYzogaW5jbHVkZSBhcHByb3ByaWF0ZSBoZWFkZXIgZmlsZXMuCisJKiBubG0vcHJlbHVkZS5jOiBkZWZpbmUgVEVSTUlOQVRFX0JZX1VOTE9BRCBmb3IgTmV0V2FyZSA0LjAKKwkgIHRhcmdldHMuCisKK1R1ZSBBdWcgMjMgMTY6NTQ6MTYgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogbmxtL3BwYy5jIChzZXRfc3RlcF90cmFwcyBjbGVhcl9zdGVwX3RyYXBzKTogIENsZWFudXBzLgorCSogbmxtL2dkYnNlcnZlLmRlZjogIEF1dG9sb2FkIGNsaWIuCisKK1R1ZSBBdWcgMjMgMTI6MDU6MTkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIGJyZWFrcG9pbnQuYyAoY29uZGl0aW9uX2NvbW1hbmQpOiBDYWxsIGJyZWFrcG9pbnRzX2NoYW5nZWQuCisKKwkqIGdkYnR5cGVzLmg6IERlY2xhcmUgZjc3X2NyZWF0ZV9saXRlcmFsX3N0cmluZ190eXBlIGFuZAorCWY3N19jcmVhdGVfbGl0ZXJhbF9jb21wbGV4X3R5cGUuCisJKiB2YWxvcHMuYyAoZjc3X3ZhbHVlX2xpdGVyYWxfc3RyaW5nLCBmNzdfdmFsdWVfc3Vic3RyaW5nLAorCWY3N192YWx1ZV9saXRlcmFsX2NvbXBsZXgpOiBVc2UgeG1hbGxvYyBub3QgbWFsbG9jLgorCSogdmFsb3BzLmMgKGY3N192YWx1ZV9saXRlcmFsX3N0cmluZywgZjc3X3ZhbHVlX3N1YnN0cmluZyk6CisJTWFrZSBhZGRyIGNoYXIgKiBub3QgQ09SRV9BRERSLgorCSogdmFsdWUuaCAoc3RydWN0IHZhbHVlKTogQWRkIG5ldyBmaWVsZCBsaXRlcmFsX2RhdGEgb2YgYWxpZ25lciB1bmlvbi4KKwkoVkFMVUVfTElURVJBTF9EQVRBKTogVXNlIGl0LgorCSogZi1sYW5nLmg6IERlY2xhcmUgZmluZF9jb21tb25fZm9yX2Z1bmN0aW9uLgorCSogdmFsdWUuaCwgdmFsb3BzLmM6IFNwbGl0IFZBTFVFX1NVQlNUUklOR19TVEFSVCBpbnRvIG1lbWFkZHIgYW5kCisJbXlhZGRyIGZpZWxkcyBvZiBhIHVuaW9uLiAgRG9uJ3Qgb3ZlcmxvYWQgaXQgd2l0aCB0aGUgZnJhbWUgZmllbGQKKwkobm90IHN1cmUgdGhpcyBpcyBuZWNlc3Nhcnk7IEknbSBub3Qgc3VyZSB3aGF0IGx2YWxfKiBjb2RlcworCVZBTFVFX1NVQlNUUklOR18qIGNhbiBiZSB1c2VkIHdpdGgpLgorCitNb24gQXVnIDIyIDExOjQ1OjAxIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2EyOWsve2EyOWsta2Vybi5tdCxhMjlrLXVkaS5tdCxhMjlrLm10LHVsdHJhMy5taCwKKwl1bHRyYTMubXR9OiBDbGVhbiB1cCBjb21tZW50cywgcmVtb3ZlIG5vLWxvbmdlci11c2VkIGRlZmluaXRpb25zLgorCisJKiByczYwMDAtbmF0LmM6IEluY2x1ZGUgbGliYmZkLmggYWdhaW4sIG5lZWRlZCB1bnRpbCByZWZlcmVuY2UKKwl0byBiZmRfY2FjaGVfbG9va3VwIGlzIGNsZWFuZWQgb3V0LgorCisJKiBjb25maWcvaTM4Ni9saW51eC5taCAoWE1fQ0xJQlMpOiBBZGQgLWxtLgorCitNb24gQXVnIDIyIDEwOjQyOjE1IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwlXb3JrIHRvIHJlZHVjZSB0aGUgaW50ZXJydXB0cy1vZmYgZHVyYXRpb24gd2hlbiBydW5uaW5nIGluIERPUy4KKwkqIHNlci1nbzMyLmM6ICAoZG9zX2FzeW5jX3JlYWR5KTogU2VlIGlmIGFueXRoaW5nIGlzIGluIHRoZSBidWZmZXIuCisJKGRvc19hc3luY19yeCk6IHJld3JpdGUgdG8gdW5wYWNrIGFzIG1hbnkgY2hhcmFjdGVycyBmcm9tIHRoZQorCWFzeW5jdHNyIGFzIHBvc3NpYmxlIGludG8gYSBsb2NhbCBidWZmZXIuCisJCitGcmkgQXVnIDE5IDE0OjU1OjQ1IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCUluaXRpYWwgRm9ydHJhbiBsYW5ndWFnZSBzdXBwb3J0LCBhZGFwdGVkIGZyb20gd29yayBieSBGYXJvb3EgQnV0dAorCShmbWJ1dHRAZW5nYWdlLnNwcy5tb3QuY29tKS4KKwkqIE1ha2VmaWxlLmluOiBBZGQgRm9ydHJhbi1yZWxhdGVkIGZpbGVzIGFuZCBkZXBlbmRlbmNpZXMuCisJKiBkZWZzLmggKGxhbmd1YWdlX2ZvcnRyYW4pOiBOZXcgbGFuZ3VhZ2UgZW51bS4KKwkqIGxhbmd1YWdlLmggKF9MQU5HX2ZvcnRyYW4pOiBEZWZpbmUuCisJKE1BWF9GT1JUUkFOX0RJTVMpOiBEZWZpbmUuCisJKiBleHByZXNzaW9uLmg6IFJlZm9ybWF0IHRvIHN0YW5kYXJkLgorCShNVUxUSV9GNzdfU1VCU0NSSVBULCBPUF9GNzdfVU5ERVRFUk1JTkVEX0FSR0xJU1QsCisJT1BfRjc3X0xJVEVSQUxfQ09NUExFWCwgT1BfRjc3X1NVQlNUUik6IE5ldyBleHByZXNzaW9uIG9wY29kZXMuCisJKiBnZGJ0eXBlcy5oIChUWVBFX0NPREVfQ09NUExFWCwgVFlQRV9DT0RFX0xJVEVSQUxfQ09NUExFWCwKKwlUWVBFX0NPREVfTElURVJBTF9TVFJJTkcpOiBOZXcgdHlwZSBjb2Rlcy4KKwkodHlwZSk6IE5ldyBmaWVsZHMgdXBwZXJfYm91bmRfdHlwZSBhbmQgbG93ZXJfYm91bmRfdHlwZS4KKwkoVFlQRV9BUlJBWV9VUFBFUl9CT1VORF9UWVBFLCBUWVBFX0FSUkFZX0xPV0VSX0JPVU5EX1RZUEUsCisJVFlQRV9BUlJBWV9VUFBFUl9CT1VORF9WQUxVRSwgVFlQRV9BUlJBWV9MT1dFUl9CT1VORF9WQUxVRSk6IE5ldworCW1hY3Jvcy4KKwkoYnVpbHRpbl90eXBlX2ZfY2hhcmFjdGVyLCBldGMpOiBEZWNsYXJlLgorCSogdmFsdWUuaCAoVkFMVUVfTElURVJBTF9EQVRBLCBWQUxVRV9TVUJTVFJJTkdfU1RBUlQpOiBEZWZpbmUuCisJKiBmLWV4cC55OiBOZXcgZmlsZSwgRm9ydHJhbiBleHByZXNzaW9uIGdyYW1tYXIuCisJKiBmLWxhbmcuYzogTmV3IGZpbGUsIEZvcnRyYW4gbGFuZ3VhZ2Ugc3VwcG9ydCBmdW5jdGlvbnMuCisJKiBmLWxhbmcuaDogTmV3IGZpbGUsIEZvcnRyYW4gbGFuZ3VhZ2Ugc3VwcG9ydCBkZWNsYXJhdGlvbnMuCisJKiBmLXR5cGVwcmludC5jOiBOZXcgZmlsZSwgRm9ydHJhbiB0eXBlIHByaW50aW5nLgorCSogZi12YWxwcmludC5jOiBOZXcgZmlsZSwgRm9ydHJhbiB2YWx1ZSBwcmludGluZy4KKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKTogQWRkIGNvZGUgZm9yIG5ldyBleHByZXNzaW9uIG9wY29kZXMsCisJZml4IHdvcmRpbmcgb2YgZXJyb3IgbWVzc2FnZS4KKwkqIGdkYnR5cGVzLmMgKGY3N19jcmVhdGVfbGl0ZXJhbF9jb21wbGV4X3R5cGUsCisJZjc3X2NyZWF0ZV9saXRlcmFsX3N0cmluZ190eXBlKTogTmV3IGZ1bmN0aW9ucy4KKwkqIGxhbmd1YWdlLmMgKHNldF9sYW5ndWFnZV9jb21tYW5kKTogQWRkIEZvcnRyYW4gaW5mby4KKwkoY2FsY19mNzdfYXJyYXlfZGltcyk6IE5ldyBmdW5jdGlvbi4KKwkqIHBhcnNlLmMgKGxlbmd0aF9vZl9zdWJleHAsIHByZWZpeGlmeV9zdWJleHApOiBBZGQgY2FzZXMgZm9yIG5ldworCWV4cHJlc3Npb24gb3Bjb2Rlcy4KKwkqIHN5bWZpbGUuYyAoZGVkdWNlX2xhbmd1YWdlX2Zyb21fZmlsZW5hbWUpOiBSZWNvZ25pemUgLmYgYW5kIC5GCisJYXMgRm9ydHJhbiBzb3VyY2UgZmlsZXMuCisJKiB2YWxvcHMuYyAoZjc3X3ZhbHVlX2xpdGVyYWxfc3RyaW5nLCBmNzdfdmFsdWVfc3Vic3RyaW5nLAorCWY3N192YWx1ZV9saXRlcmFsX2NvbXBsZXgpOiBOZXcgZnVuY3Rpb25zLgorCitGcmkgQXVnIDE5IDEzOjM1OjAxIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogYy10eXBlcHJpbnQuYyAoY19wcmludF90eXBlKTogIEFzc3VtZSBkZW1hbmdsZWQgYXJndW1lbnRzCisJaWYgYSAnKCcgaXMgZm91bmQgaW4gdmFyc3RyaW5nLCBsb29raW5nIGZvciAnKScgYXQgdGhlIGVuZCBvZgorCXZhcnN0cmluZyBkaWQgZmFpbCB3aXRoIGRlbWFuZ2xlZCBjb25zdCBtZW1iZXIgZnVuY3Rpb25zLCB3aGljaAorCWhhdmUgYSB0cmFpbGluZyBgY29uc3QnLgorCSogcmVtb3RlLmMgKGdldF9vZmZzZXRzLCBwdXRwa3QpOiAgQ2hhbmdlIHRvIGBjaGFyJyBidWZmZXJzLAorCXRvIGF2b2lkIGVycm9ycyB3aGVuIGNvbXBpbGluZyB3aXRoIERFQyBjODkuCisJKHJlbW90ZV93YWl0KTogIENhc3QgdG8gYGNoYXIgKicgYmVmb3JlIHBhc3NpbmcgYnVmZmVyIHRvCisJZnB1dHNfZmlsdGVyZWQsIHRvIGF2b2lkIGVycm9ycyB3aGVuIGNvbXBpbGluZyB3aXRoIERFQyBjODkuCisJKHJlbW90ZV93YWl0KTogIERvIG5vdCByZXR1cm4gaW5mZXJpb3JfcGlkIGJ5IGRlZmF1bHQsIHRoaXMKKwlzdGF0ZW1lbnQgaXMgbmV2ZXIgcmVhY2hlZCwgd2hpY2ggY2F1c2VzIHdhcm5pbmdzIGZyb20gc29tZQorCWNvbXBpbGVycy4KKwkqIHN0YWJzcmVhZC5jIChzY2FuX2ZpbGVfZ2xvYmFscyk6ICBJZ25vcmUgc3RhdGljIG1pbmltYWwgc3ltYm9scy4KKwkqIHN5bWZpbGUuYyAobG9hZF9jb21tYW5kKTogIElmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50LCB0cnkKKwl0byBnZXQgdGhlIGZpbGVuYW1lIGZyb20gdGhlIGV4ZWN1dGFibGUgZmlsZS4KKwkoZ2VuZXJpY19sb2FkKTogIFJlbW92ZSBjaGVjayBmb3IgTlVMTCBmaWxlbmFtZSwgaXQgaXMgZG9uZQorCWluIGxvYWRfY29tbWFuZCBub3cuCisKK0ZyaSBBdWcgMTkgMTA6MzY6MTUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIE1ha2VmaWxlLmluIChBTExERVBGSUxFUyk6IEFkZCBocHJlYWQuYy4KKwkoaHByZWFkLm8pOiBBZGQgZGVwZW5kZW5jaWVzLgorCisJKiBzb21yZWFkLmM6IERvIG5vdCBpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIi4gIFNPTSBoYXMgbm90aGluZyB0bworCWRvIHdpdGggYS5vdXQuCisJKEJZVEVTX0lOX1dPUkQpOiBEZWxldGUuCisJKHNvbV9zeW1maWxlX3JlYWQpOiBDYWxsIGhwcmVhZF9idWlsZF9wc3ltdGFicyB0byBidWlsZCBhbnkKKwltaW5pbWFsIHN5bWJvbHMgYmFzZWQgb24gdGhlIEhQIEMgbmF0aXZlIGRlYnVnIHN5bWJvbHMuCisJKHNvbV9zeW1maWxlX2ZpbmlzaCk6IENhbGwgaHByZWFkX3N5bWZpbGVfZmluaXNoLgorCShzb21fc3ltZmlsZV9pbml0KTogQ2FsbCBocHJlYWRfc3ltZmlsZV9pbml0LgorCSogY29uZmlnL3BhL3RtLWhwcGEuaCAoSFBSRUFEX0FESlVTVF9TVEFDS19BRERSRVNTKTogRGVmaW5lLgorCSogaHBwYS10ZGVwLmMgKGhwcmVhZF9hZGp1c3Rfc3RhY2tfYWRkcmVzcyk6IE5ldyBmdW5jdGlvbi4KKworCSogY29uZmlnL3BhL2hwcGFic2QubWggKE5BVERFUEZJTEVTKTogQWRkIGhwcmVhZC5vCisJKiBjb25maWcvcGEvaHBwYWhwdXgubWggKE5BVERFUEZJTEVTKTogTGlrZXdpc2UuCisJKiBocHJlYWQuYzogTmV3IGZpbGUuCisKK0ZyaSBBdWcgMTkgMDA6NDA6NTUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGEtdGRlcC5jIChza2lwX3RyYW1wb2xpbmVfY29kZSk6IFJldmVydCBpbmNvcnJlY3QgY2hhbmdlCisJZnJvbSBKdW5lIDIsIDE5OTQgKHdoYXQgd2FzIEkgdGhpbmtpbmc/IT8pLiAgRml4IGl0IHJpZ2h0IHRoaXMKKwl0aW1lLgorCitUaHUgQXVnIDE4IDE3OjAxOjM1IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BydGwuY3lnbnVzLmNvbSkKKworCSogbmxtL2kzODYuYywgbmxtL2kzODYuaDogTmV3IGZpbGVzIHRoYXQgY29udGFpbiBpMzg2IHNwZWNpZmljIGNvZGUuCisKK1RodSBBdWcgMTggMTQ6Mzk6NDYgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBSRUFETUU6IEdyYW1tYXIgaW1wcm92ZW1lbnRzLCBjbGFyaWZpY2F0aW9ucywgdXBkYXRlcy4KKworV2VkIEF1ZyAxNyAyMzowODo1MyAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpOiAgUGFzcyBkb3duIExEX0ZPUl9UQVJHRVQgYW5kCisJTkxNQ09OVl9GT1JfVEFSR0VULiAgKFNVQkRJUlMpOiAgQWRkIG5sbSB0YXJnZXQuCisJKiBjb25maWd1cmUuaW4gKHBvd2VycGMtKi1uZXR3YXJlKik6ICBBdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZSBubG0KKwlzdWJkaXIuCisJKiBubG0vTWFrZWZpbGUuaW46ICBBZGQge0NDIE5MTUNPTlYgTER9X0ZPUl9UQVJHRVQuICBSZW1vdmUgYWxwaGEKKwlzcGVjaWZpYyBzdHVmZi4gIE1ha2UgdGhpbmdzIG1vcmUgY29uZmlndXJhYmxlLgorCSogbmxtL2NvbmZpZ3VyZS5pbjogIEFkZCBwb3dlcnBjLSotbmV0d2FyZSogdGFyZ2V0LiAgVXNlCisJZ2Ric2VydmUubXQvY3B1LmMvY3B1LmggZm9yIHRhcmdldCBzdHVmZi4gIEdldCByaWQgb2YgdG0veG0vbm0uaAorCWZpbGVzLgorCSogbmxtL2dkYnNlcnZlLmM6ICBNb3ZlIEFscGhhIHNwZWNpZmljIHN0dWZmIGludG8gb3RoZXIgZmlsZXMuCisJUmVtb3ZlIGxvdHMgb2YgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHN0dWZmLgorCSogbmxtL2dkYnNlcnZlLmRlZjogIEFkZCBuZXcgaW1wb3J0cy4KKwkqIG5sbS9wcGMuYywgbmxtL3BwYy5oOiAgTmV3IGZpbGVzIHRoYXQgY29udGFpbiBQb3dlclBDIHNwZWNpZmljIGNvZGUuCisJKiBubG0vcHJlbHVkZS5jOiAgRG9uJ3QgaW5jbHVkZSBsaWJob29rcy5oLCBnZXQgcmlkIG9mIGNhbGwgdG8KKwlyZWdpc3RlciBsaWJyYXJ5LgorCSogbmxtL3ByZWx1ZGUubzogIFdoYXQgd2FzIHRoaXMgZG9pbmcgaGVyZT8KKwkqIGNvbmZpZy9hbHBoYS9nZGJzZXJ2ZS5tdDogIERlZnMgZm9yIGFscGhhIG5sbSBzdHViLgorCSogY29uZmlnL3Bvd2VycGMvZ2Ric2VydmUubXQ6IERlZnMgZm9yIFBvd2VyUEMgbmxtIHN0dWIuCisJKiBjb25maWcvcG93ZXJwYy9wcGMtbncubXQ6ICBEZWZzIGZvciBQb3dlclBDIHRhcmdldCBmb3IgR0RCLgorCSogY29uZmlnL3Bvd2VycGMvdG0tcHBjLW53Lmg6ICBEaXR0by4KKworCSogbmxtc3R1Yi5kZWY6ICBOZXcgZmlsZSwgY29udGFpbnMgaW1wb3J0cyBmb3IgMzg2IG5sbSBzdHViLgorCitXZWQgQXVnIDE3IDIzOjE3OjMzIDE5OTQgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXBhLmM6IE5ldyBmaWxlIGZvciBIUFBBIGVtYmVkZGVkIHN1cHBvcnQuIEN1cnJlbnRseSBpdCdzCisJYSBjb3B5IG9mIHJlbW90ZS5jLgorCSogY29uZmlnL3BhL2hwcGFic2QubXQsaHBwYWhwdXgubXQsaHBwYW9zZi5tdDogVXNlciByZW1vdGUtcGEuYy4KKworV2VkIEF1ZyAxNyAxMzoxOTo1MiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9tNjhrL3RtLWRlbHRhNjguaCAoRVhUUkFDVF9SRVRVUk5fVkFMVUUsCisJU1RPUkVfUkVUVVJOX1ZBTFVFKTogRGVmaW5lIHRvIHVzZSAlYTAgZm9yIHBvaW50ZXJzLgorCitXZWQgQXVnIDE3IDA3OjQzOjA2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiByZW1vdGUtbWlwcy5jOiBSZW1vdmUgdW51c2VkIGRlY2xhcmF0aW9uIG9mIG1pcHNfbG9hZC4KKworVHVlIEF1ZyAxNiAxNjo0NTozNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGNvZmZyZWFkLmM6IEdlbmVyYWwgY2xlYW51cCwgYW5kIHN1cHBvcnQgZm9yIHNlY3Rpb24gb2Zmc2V0cy4KKwkodGltZS5oLCBzeXMvdHlwZXMuaCwgbGliYmZkLmgpOiBEb24ndCBpbmNsdWRlLgorCShjdXJfc3JjX3N0YXJ0X2FkZHIsIGN1cl9zcmNfZW5kX2FkZHIpOiBSZW5hbWUgdG8KKwljdXJyZW50X3NvdXJjZV9zdGFydF9hZGRyLCBjdXJyZW50X3NvdXJjZV9lbmRfYWRkci4KKwkobmxpc3Rfc3RyZWFtX2dsb2JhbCk6IFJlbW92ZS4KKwkobmxpc3RfYmZkX2dsb2JhbCk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCisJKGNvZmZfc3ltZmlsZV9yZWFkKTogUmVtb3ZlIGNvZGUgdGhhdCBnZXRzIGFuZCB1c2VzIGZpbGVubygpCisJZGlyZWN0bHkuCisJKHJlYWRfY29mZl9zeW10YWIsIGVudGVyX2xpbmVub3MsIHByb2Nlc3NfY29mZl9zeW1ib2wpOiBBZGQKKwlzZWN0aW9uX29mZnNldHMgcGFyYW1ldGVyLCBhZGQgdGV4dC9kYXRhIHNlY3Rpb24gb2Zmc2V0IHRvCisJYXBwcm9wcmlhdGUgc3ltYm9scycgdmFsdWVzLgorCShyZWFkX29uZV9zeW0pOiBVc2UgYmZkX3JlYWQgaW5zdGVhZCBvZiBmcmVhZC4KKwkoaW5pdF9zdHJpbmd0YWIsIGluaXRfbGluZW5vKTogQ2hhbmdlIGZpcnN0IHBhcmFtZXRlciB0byBhIGJmZCwKKwl1c2UgYmZkIHJvdXRpbmVzIGluc3RlYWQgb2YgcmF3IEkvTy4KKworVHVlIEF1ZyAxNiAxNToyNDowMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3ltdGFiLmMgKGRlY29kZV9saW5lXzEpOiBJZiBmdW5maXJzdGxpbmUgYW5kIHdlIGdldCBhCisJbm9uLUxPQ19CTE9DSyBzeW1ib2wgKGUuZy4gdmFyaWFibGUgb3IgdHlwZSksIHRoZW4gZXJyb3IoKS4KKworCSogTWFrZWZpbGUuaW4gKFRBUkZJTEVTLCBOT05TUkMsIFNGSUxFU19TVEFORCwgU0ZJTEVTX0tHREIpOgorCVJlbW92ZTsgdW51c2VkLgorCShUQUdGSUxFU19OT19TUkNESVIpOiBSZW1vdmUgQUxMUEFSQU0uCisJKEhGSUxFU19OT19TUkNESVIpOiBSZW1vdmUgYWxsIGZpbGVzIGluIGNvbmZpZyBzdWItZGlyZWN0b3J5LgorCShUQUdTKTogQWxzbyBwYXNzIHJlc3VsdCBvZiBmaW5kIG9uIGNvbmZpZyBzdWItZGlyZWN0b3J5IHRvIGV0YWdzLgorCShBTExQQVJBTSk6IFJlbW92ZTsgbm93IHVudXNlZC4KKworU3VuIEF1ZyAxNCAxMzowNToyNiAxOTk0ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiAgQnVtcCB0byA0LjEzLjEKKwkqIE5FV1MsIFJFQURNRTogIFVwZGF0ZSB0byBtYXRjaCBnZGIgNC4xMyByZWxlYXNlIHZlcnNpb24uCisKK1NhdCBBdWcgMTMgMDg6MjI6NTAgMTk5NCAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwlIYXJyaXMgQ1gvVVggc3VwcG9ydCwgZnJvbSBCb2IgUnVzayAocnJ1c2tAbWFpbC5jc2QuaGFycmlzLmNvbSkuCisJKiBjeHV4LW5hdC5jOiAgUmVtb3ZlIGRhbmdsaW5nICNlbHNlIGJsb2NrLgorCShtODhrX2hhcnJpc19jb3JlX3JlZ2lzdGVyX2FkZHIpOiAgTmV3IGZ1bmN0aW9uLgorCisJKiBlbnZpcm9uLmMgKGluaXRfZW52aXJvbik6ICBJZiBubyBlbnZpcm9ubWVudCwgZG8gbm90aGluZy4KKworRnJpIEF1ZyAxMiAxOTozMDo1MyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHByZWFkLmM6IERlbGV0ZSByZXN0IG9mIFRPRE8gbGlzdC4gIERvIG5vdCBpbmNsdWRlICJsaWJiZmQuaCIsCisJPHRpbWUuaD4sIDxzeXMvdHlwZXMuaD4sICJkZW1hbmdsZS5oIiwgPHN5cy9maWxlLmg+LAorCSJleHByZXNzaW9uLmgiLCAibGFuZ3VhZ2UuaCIsICJnZGJ0eXBlcy5oIiwgImRlbWFuZ2xlaCIuCisJTW92ZSBhbGwgZ2xvYmFsIHZhcmlhYmxlcyBpbnRvIHRoZSBwcml2YXRlIHN5bWJvbCB0YWJsZSBzdHJ1Y3R1cmUKKwlhbmQgYWRkIGFjY2Vzc29yIG1hY3Jvcy4gIFVwZGF0ZSBzb21lIGNvbW1lbnRzLgorCShocHJlYWRfYnVpbGRfcHN5bXRhYnMpOiBEZWxldGUgZGJzdWJjX2FkZHIsIHdlIGRvbid0IG5lZWQgaXQuCisJKGhwcmVhZF9lbmRfcHN5bXRhYik6IE5ldyBmdW5jdGlvbiB0byBlbmQgYSBwYXJ0aWFsIHN5bWJvbCB0YWJsZSwKKwlhbGwgY2FsbGVycyBjaGFuZ2VkIChubyBtb3JlIGJvZ3VzIHNoYXJpbmcgd2l0aCBkYnhyZWFkLmMpLgorCitGcmkgQXVnIDEyIDE1OjUyOjM3IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIHJlbW90ZS5jIChyZW1vdGVfd2FpdCk6ICBSZXR1cm4gaW5mZXJpb3JfcGlkIGluc3RlYWQgb2YgMCBmb3IKKwlgV2AgbWVzc2FnZS4KKworRnJpIEF1ZyAxMiAxMTo0NzoxMCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCisKKwkqIHNwYXJjbGl0ZS9hbG9hZC5jIChzeXNfZXJyb3IsIGVycm9yKTogVXNlIHZmcHJpbnRmIGZvciB2YXJpYWJsZQorCSAgYXJndW1lbnQgbGlzdHMuCisKK1RodSBBdWcgMTEgMDQ6MDY6NDIgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogZGVmcy5oIChjb25jYXQsIGJhc2VuYW1lLCBidWlsZGFyZ3YsIGZyZWVhcmd2LCBzdHJlcnJubywgc3Ryc2lnbm8sCisJZXJybm9fbWF4LCBzaWdub19tYXgsIHN0cnRvZXJybm8sIHN0cnRvc2lnbm8pOiAgRGVsZXRlLgorCUluY2x1ZGUgImxpYmliZXJ0eS5oIiBpbnN0ZWFkLgorCitXZWQgQXVnIDEwIDEzOjIzOjQ3IDE5OTQgIFJpY2sgU2xhZGtleSAgKGpyc0B3b3JsZC5zdGQuY29tKQorCisJKiBpMzg2di1uYXQuYyAoaTM4Nl9pbnNlcnRfbm9uYWxpZ25lZF93YXRjaHBvaW50KToKKwlhZGQgYWRkaXRpb25hbCBhcmd1bWVudCBzcGVjaWZ5aW5nIHJhdyBhZGRyZXNzIHRvIHBlcm1pdAorCXByb3BlciByZWxlYXNlIG9mIGRlYnVnIHJlZ2lzdGVycy4KKwkoaTM4Nl9pbnNlcnRfd2F0Y2hwb2ludCwgaTM4Nl9pbnNlcnRfYWxpZ25lZF93YXRjaHBvaW50KToKKwljaGFuZ2UgYWxsIGNhbGxlcnMuCisKK1dlZCBBdWcgMTAgMTY6MTM6NDUgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogZGVmcy5oLCB0b3AuYzogIFVzZSBgZXh0ZXJuJyBpbiBkZWNsYXJhdGlvbnMgb2YgR1VJIGhvb2tzLCBhbmQKKwlkZWZpbmUgdGhlbSBpbiB0b3AuYy4gIEFkZCBjb21tZW50cyB0byB0aGUgaG9va3MuCisKK1dlZCBBdWcgMTAgMTU6NTc6NDMgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXNpbS5jIChnZGJzaW1fb3BzKTogU2V0IGB0b19pbnNlcnRfYnJlYWtwb2ludCcgYW5kCisJYHRvX3JlbW92ZV9icmVha3BvaW50JyBmaWVsZHMuCisKK1dlZCBBdWcgMTAgMTU6NDY6MDMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGluZmNtZC5jIChydW5fY29tbWFuZCk6IFJlbW92ZSBjb21tZW50IHN1Z2dlc3RpbmcgdXNpbmcKKwl0YXJnZXRfaGFzX2V4ZWN1dGlvbiBpbnN0ZWFkIG9mIGluZmVyaW9yX3BpZC4KKworV2VkIEF1ZyAxMCAxMDozMzoyMCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQorCisJKiByZW1vdGUtbWlwcy5jIChtaXBzX29wZW4pOiBhZGQgY29kZSB0byBoYW5kbGUgYmF1ZCByYXRlLgorCitUdWUgQXVnICA5IDA5OjQ0OjQyIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBDYWxsIHRhcmdldF9yZXN1bWUoKSB1cG9uCisJZGV0ZWN0aW9uIG9mIG5ldyBwcm9jZXNzZXMuCisKKwkqIHByb2Nmcy5jIChjcmVhdGVfcHJvY2luZm8pOiAgUmV0dXJuIHBvaW50ZXIgdG8gbmV3IHByb2NpbmZvCisJc3RydWN0dXJlLgorCSogKGRvX2RldGFjaCk6ICBTcGFjaW5nICYgZm9ybWF0dGluZyBjbGVhbnVwLgorCSogKHByb2Nmc193YWl0KTogIE1vdmUgd2FpdF9hZ2FpbiBsYWJlbCB0byBlbnN1cmUgdGhhdCB3ZSByZWFsbHkKKwl3YWl0IGFnYWluLiAgT24gZXhpdCBmcm9tIGZvcmssIHJlbGVhc2UgbmV3IGNoaWxkIGZyb20gZ2RicycKKwljbHV0Y2hlcy4KKwkqIChwcm9jZnNfc2V0X3Nwcm9jX3RyYXApOiAgRW5hYmxlIHRyYXBwaW5nIG9mIGZvcmsgYW5kIHZmb3JrLgorCitNb24gQXVnIDA4IDE1OjM0OjEzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBocHJlYWQuYyAoaHByZWFkX3Byb2Nlc3Nfb25lX2RlYnVnX3N5bWJvbCk6IEZpeCBibG9jayBzY29waW5nCisJcHJvYmxlbSAobG9zaW5nIGxvY2FsdmFycyBvbiB0aGUgY2xvc2UtYnJhY2UgaW5zdGVhZCBvZiBhZnRlcgorCXRoZSBjbG9zZSBicmFjZSkuCisKK01vbiBBdWcgIDggMTU6MDk6MzIgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQorCisJKiBpMzg2LW5sbXN0dWIuYyAoaGFuZGxlX2V4Y2VwdGlvbik6IFdhaXQgdW50aWwgdGhlIHRocmVhZCBoYXMKKwkgIGJlZW4gc3RhcnRlZCBiZWZvcmUga2lsbGluZyB0aGUgTkxNIGJ5IHBvaW50aW5nIHRoZSBQQyBhdAorCSAgX2V4aXQoKS4KKworU2F0IEF1ZyAgNiAyMjoyNzozMCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNvbmZpZy9taXBzL3RtLWlyaXg1LmggKElOX1NJR1RSQU1QKTogIFJlZGVmaW5lIGZvciBJcml4IDUsCisJSXJpeCA1IGhhcyBhIHN0YW5kYXJkIF9zaWd0cmFtcCBzaWduYWwgaGFuZGxlci4KKwkqIGlyaXg1LW5hdC5jIChzb2xpYl9hZGQpOiAgR2V0IHJpZCBvZiBzaWd0cmFtcF9hZGRyZXNzIGhhbmRsaW5nLAorCWl0IGlzIG5vdCBuZWVkZWQgZm9yIGEgc3RhbmRhcmQgX3NpZ3RyYW1wIHNpZ25hbCBoYW5kbGVyLgorCUFkZCBzaGFyZWQgbGlicmFyeSBzZWN0aW9ucyB0byB0aGUgc2VjdGlvbiB0YWJsZSBvZiB0aGUgdGFyZ2V0CisJYmVmb3JlIGFkZGluZyB0aGUgc3ltYm9scy4KKwkqIG1pcHMtdGRlcC5jIChtaXBzX3NraXBfcHJvbG9ndWUpOiAgRG8gbm90IHNraXAgbG9hZCBpbW1lZGlhdGUKKwlpbnN0cnVjdGlvbnMgdGhhdCBkbyBub3QgcHJlcGFyZSBhIHN0YWNrIGFkanVzdG1lbnQuCisJKiByZWdleC5jIChTSUdOX0VYVEVORF9DSEFSKTogIFVwZGF0ZSB0byBlbWFjcy0xOS4yNSBkZWZpbml0aW9uLAorCXdoaWNoIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIG9uIG1hY2hpbmVzIHdoZXJlIGBjaGFyJyBpcyB1bnNpZ25lZC4KKworRnJpIEF1ZyAgNSAxNzo1MDo1OSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiByZW1vdGUuYyAocmVtb3RlX29wZW4pOiAgTW92ZSBzZXR0aW5nIG9mIGluZmVyaW9yX3BpZCBwcmlvciB0bworCWNhbGwgdG8gcmVtb3RlX3N0YXJ0X3JlbW90ZS4gIEFsc28gdXNlIHVuaXF1ZSB2YWx1ZSBmb3IgcGlkIHRvCisJYXZvaWQgY29uZnVzaW9uIHdpdGggcmVhZF9yZWdpc3Rlcl9waWQgJiBmcmllbmRzLgorCSogKHJlbW90ZV93YWl0KTogIFJldHVybiBpbmZlcmlvcl9waWQgaW5zdGVhZCBvZiAwIGluIGFsbCBjYXNlcy4KKworRnJpIEF1ZyAgNSAxMjoyMzowMiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGR3YXJmcmVhZC5jIChiZmQuaCk6IERvbid0IGluY2x1ZGUuCisKK0ZyaSBBdWcgIDUgMDk6MDg6MzQgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQorCisJKiBpMzg2LW5sbXN0dWIuYyAoaGFuZGxlX2V4Y2VwdGlvbik6IFBvaW50IHRoZSBQQyBhdCBfZXhpdCgpIHRvCisJICBraWxsIHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkLiAgS2lsbE1lKCksIHRoZSB1bmRvY3VtZW50ZWQKKwkgIGNhbGwgaW50ZW5kZWQgZm9yIHRoaXMgcHVycG9zZSwgY2F1c2VzIHRoZSBzZXJ2ZXIgdG8gaGFuZy4KKworVGh1IEF1ZyAgNCAxNjoyNjowNiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiByZW1vdGUuYyAocmVhZF9mcmFtZSk6IENhbGN1bGF0ZSBydW4gbGVuZ3RoIGVuY29kZWQgY2hlY2tzdW0KKwljb3JyZWN0bHkuCisJKiBjb25maWcvc2gvc3R1Yi5jOiBOZXcgZmlsZS4KKworVGh1IEF1ZyAgNCAxNDozNDoxMiAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiB0YXJnZXQuYyAoZmluZF9kZWZhdWx0X3J1bl90YXJnZXQpOiAgTWFrZSBzdXJlIHRvX2Nhbl9ydW4gaXMgc2V0CisJYmVmb3JlIGNhbGxpbmcgaXQuCisKK1RodSBBdWcgIDQgMTE6NDY6MjcgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIFRPRE86IFJlbW92ZSBub3RlIGFib3V0IGZhc3Qgd2F0Y2hwb2ludHMgYW5kIHJlbW92ZSBvYnNvbGV0ZQorCU1hY2ggc3R1ZmYuCisKK1RodSBBdWcgIDQgMTE6MDg6MDMgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBjb25maWcvaTM4Ni94bS1pMzg2djQuaCwgY29uZmlnL202OGsveG0tbTY4a3Y0LmgsCisJY29uZmlnL3NwYXJjL3htLXN1bjRzb2wyLmggKE5PUkVUVVJOKTogRG9uJ3QgZGVmaW5lLgorCSogY29uZmlnL204OGsvdG0tY3h1eC5oIChBUkNIX05VTV9SRUdTKTogVW5kZWZpbmUgYmVmb3JlIGRlZmluaW5nLgorCitUaHUgQXVnICA0IDEwOjI2OjM2IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQHJ0bC5jeWdudXMuY29tKQorCisJKiB0YXJnZXQuYyAoYWRkX3RhcmdldCk6ICBEb24ndCBjYWxsIGNsZWFuX3RhcmdldCBvbiB0YXJnZXQKKwl2ZWN0b3JzIGFueW1vcmUuCisJKiAodW5wdXNoX3RhcmdldCk6ICBUZXN0IGZvciB0b19jbG9zZSBiZWluZyBzZXQgYmVmb3JlIGNhbGxpbmcuCisJKiAodGFyZ2V0X3hmZXJfbWVtb3J5LCB0YXJnZXRfaW5mbyk6ICBDaGVjayBmb3IgdG9faGFzX21lbW9yeQorCWJlZm9yZSBwbGF5aW5nIHdpdGggbWVtb3J5LgorCisJKiByZW1vdGUuYyAocmVtb3RlX29wZW4pOiAgU2V0IGluZmVyaW9yX3BpZCB0byBtYWtlIGtpbGwgY29tbWFuZAorCWhhcHB5LgorCSogaW5mbG93LmMgKGtpbGxfY29tbWFuZCk6ICBSZXZlcnQgY2hhbmdlIG9mIEF1ZyAyLiAgVXNlCisJaW5mZXJpb3JfcGlkIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHByaW50IG91dCAiVGhlIHByb2dyYW0gaXMgbm90CisJYmVpbmcgcnVuLiIgbWVzc2FnZS4KKworVGh1IEF1ZyAgNCAwNzo1NTowNCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2kzODYvaTM4Nm0zLm1oIChOQVRfQ0xJQlMpOiBBZGQgLWxtYWNoaWQgYW5kIC1sbmV0bmFtZS4KKwkqIG0zLW5hdC5jLCBjb25maWcvbm0tbTMuaDogI2lmIDAgUkVRVUVTVF9RVUlUIHN0dWZmLgorCSogbTMtbmF0LmM6IFBhc3MgYXJndW1lbnQgdG8gcmV0dXJuX3RvX3RvcF9sZXZlbC4KKwlEZWNsYXJlIG0zX2tpbGxfaW5mZXJpb3IgYmVmb3JlIHVzZS4KKwkocG9ydF9jaGFpbl9pbnNlcnQpOiBJbiAiY2FuJ3QgaGFwcGVuIiBjYXNlLCBhYm9ydCByYXRoZXIgdGhhbgorCXNldHRpbmcgYG1pZCcgdG8gbGFyZ2UgZGVjaW1hbCBjb25zdGFudCAod2hpY2ggZ2NjIHdhcm5zIGFib3V0KS4KKwkoZ2V0X3RocmVhZF9uYW1lKTogVXNlIGNhc3QgdG8gY29udmVydCBjb25zdCBjaGFyICogdG8gY2hhciAqLgorCShhZGRfbWFjaF9zcGVjaWZpY19jb21tYW5kcyk6ICNpZiAwICJ0aHJlYWQgYnJlYWsiIGNvbW1hbmQuCisJKG0zX3RyYWNlX2hpbSk6IENhbGwgcHVzaF90YXJnZXQuCisJKG1hY2hfcmVhbGx5X3dhaXQpOiBOZXcgYXJndW1lbnQgcGlkOyByZW1vdmUgdW51c2VkCisJdmFyaWFibGUgcGlkLgorCShpbnRlcmNlcHRfZXhlY19jYWxscyk6IENhbGwgdGFyZ2V0X3Rlcm1pbmFsX2luaXQgYW5kCisJdGFyZ2V0X3Rlcm1pbmFsX2luZmVyaW9yIG9uY2UgdGhlIGNoaWxkIGV4ZWNzLgorCSogaW5mcnVuLmMgKHByb2NlZWQpOiBQYXNzIGFyZ3VtZW50IHRvIFBSRVBBUkVfVE9fUFJPQ0VFRC4KKworV2VkIEF1ZyAgMyAyMjo0MToxMyAxOTk0ICBUb20gTG9yZCAgKGxvcmRAeDEuY3lnbnVzLmNvbSkKKworCSogcHJvY2ZzLmMgKHByb2Nmc19tb3Vybl9pbmZlcmlvcik6IGRvbid0IGRlcmVmZXJlbmNlIHRoZQorCXByb2NpbmZvIHBvaW50ZXIgYWZ0ZXIgaXQgaGFzIGJlZW4gZnJlZWQuCisKK1dlZCBBdWcgIDMgMTI6MDU6MTMgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBicmVha3BvaW50LmMgKGJyZWFrcG9pbnRfMSk6IEltcHJvdmUgcGx1cmFsaXphdGlvbiBpbiBkaXNwbGF5CisJb2YgYnJlYWtwb2ludCBoaXQgY291bnRzLgorCisJKiBsYW5ndWFnZS5oIChzdHJ1Y3QgbGFuZ3VhZ2VfZGVmbik6IFJlbW92ZSB1bnVzZWQgZmllbGQKKwlsYV9sb25nZXN0X2Zsb2F0LgorCShsb25nZXN0X2Zsb2F0KTogUmVtb3ZlLCBubyBsb25nZXIgdXNlZC4KKwkqIGxhbmd1YWdlLmMgKHVua25vd25fbGFuZ3VhZ2VfZGVmbiwgYXV0b19sYW5ndWFnZV9kZWZuLAorCWxvY2FsX2xhbmd1YWdlX2RlZm4pOiBSZW1vdmUgaW5pdCBvZiBsYV9sb25nZXN0X2Zsb2F0IGZpZWxkLgorCSogYy1sYW5nLmMgKGNfbGFuZ3VhZ2VfZGVmbiwgY3BsdXNfbGFuZ3VhZ2VfZGVmbiwKKwlhc21fbGFuZ3VhZ2VfZGVmbik6IERpdHRvLgorCSogY2gtbGFuZy5jIChjaGlsbF9sYW5ndWFnZV9kZWZuKTogRGl0dG8uCisJKiBtMi1sYW5nLmMgKG0yX2xhbmd1YWdlX2RlZm4pOiBEaXR0by4KKworVHVlIEF1ZyAgMiAxMDo1ODozNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGRlZnMuaCAoYmZkX3JlYWQsIGJmZF9zZWVrKTogUmVtb3ZlIGRlY2xhcmF0aW9ucy4KKwkqIG9zOWtyZWFkLmMsIHJzNjAwMC1uYXQuYyAobGliYmZkLmgpOiBEb24ndCBpbmNsdWRlLgorCitUdWUgQXVnICAyIDA5OjUwOjUwIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKKworCSogaW5mbG93LmMgKGtpbGxfY29tbWFuZCk6IEZpeCBhIGJ1ZyB3aGljaCBwcmV2ZW50ZWQgdGFyZ2V0CisJICBwcm9ncmFtcyB0byBiZSBraWxsZWQuCisKK01vbiBBdWcgIDEgMTg6NDg6NDcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBkZWZzLmg6IENoYW5nZSB0d28tbGluZSBkZWNsYXJhdGlvbnMgdG8gb25lLWxpbmUgZm9ybS4KKwkoTk9SRVRVUk4pOiBEZWZpbmUgYXMgInZvbGF0aWxlIiBvbmx5IGZvciBvbGRlciBHQ0NzLgorCShBVFRSX05PUkVUVVJOKTogRGVmaW5lIGZvciBuZXdlciBHQ0NzLgorCSogcHJvY2ZzLmMgKHByb2NfaW5pdF9mYWlsZWQpOiBBZGQgQVRUUl9OT1JFVFVSTiB0byBkZWNsYXJhdGlvbi4KKworTW9uIEF1ZyAgMSAxNjo0MzoyNCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jIChtZW50aW9uKSwgbWFpbi5jIChmcHV0c191bmZpbHRlcmVkKTogQWRkIGNvbW1lbnRzLgorCSogYnJlYWtwb2ludC5jIChkZWxldGVfYnJlYWtwb2ludCwgZW5hYmxlX2JyZWFrcG9pbnQsCisJZGlzYWJsZV9icmVha3BvaW50KTogRG9uJ3QgY2FsbCBicmVha3BvaW50c19jaGFuZ2VkOyBpdCBpcyBub3cKKwljYWxsZWQgdmlhIHRoZSAqX2JyZWFrcG9pbnRfaG9vayBmdW5jdGlvbnMuCisJKiBhbm5vdGF0ZS5jIChfaW5pdGlhbGl6ZV9hbm5vdGF0ZSwgYnJlYWtwb2ludF9jaGFuZ2VkKTogTmV3IGZ1bmN0aW9ucy4KKworTW9uIEF1ZyAgMSAxMzozODowNCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQorCisJKiBzdGFic3JlYWQuYyAocmVhZF90eXBlKTogRml4IGEgYnVnIGluIGVudW0gc2l6ZSBjYWxjdWxhdGlvbi4KKworTW9uIEF1ZyAgMSAwMTozNjoxMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHBwYS10ZGVwLmMgKGNvbXBhcmVfdW53aW5kX2VudHJpZXMpOiBBZGQgImNvbnN0IiB0byBib3RoCisJYXJndW1lbnQgdHlwZXMgdG8gc2h1dCB1cCBHQ0MuCisKKwkqIGhwcGEtdGRlcC5jIChzYXZlZF9wY19hZnRlcl9jYWxsKTogSWYgdGhlIHNhdmVkIFBDIGlzIGluIGEKKwlsaW5rZXIgc3R1YiwgdGhlbiByZXR1cm4gdGhlIGFkZHJlc3MgdGhlIHN0dWIgd2lsbCByZXR1cm4gdG8uCisJKGZyYW1lX3NhdmVkX3BjKTogQ29ycmVjdGx5IHJlc3RhcnQgdGhlIHNlYXJjaCBmb3IgdGhlIHNhdmVkCisJcGMgd2hlbiBhIGxpbmtlciBzdHViIGlzIGVuY291bnRlcmVkLgorCisJKiBocHBhLXRkZXAuYyAoaW5zdF9zYXZlc19ncik6IEhhbmRsZSAxNiBhbmQgOCBiaXQgaW5zdHJ1Y3Rpb24KKwlyZWdpc3RlciBzdG9yZXMgZW1pdHRlZCBieSB0aGUgdmVyc2lvbiA5IEhQIGNvbXBpbGVycy4KKwkoaW5zdF9zYXZlc19mcik6IFJlbGF4IHRlc3QgZm9yIGEgc3BlY2lmaWMgYmFzZSByZWdpc3RlciAoJXIxKTsKKwl0aGlzIGF2b2lkcyBsb3Npbmcgd2l0aCB0aGUgdmVyc2lvbiA5IEhQIGNvbXBpbGVycy4KKwkoc2tpcF9wcm9sb2d1ZSk6IFRyeSB0byBza2lwIGFyZ3VtZW50IHN0b3JlcyBlbWl0dGVkIGJ5IHRoZSBIUAorCWNvbXBpbGVycy4gIEl0J3Mgbm90IHBlcmZlY3QsIGJ1dCBpdCdzIGJldHRlciB0aGFuIGJlZm9yZS4KKworRnJpIEp1bCAyOSAyMzoyMDozMCAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBmaW5kdmFyLmMgKHdyaXRlX3BjIHdyaXRlX3BjX3BpZCk6ICBSZW1vdmUgY2FzdHMgdG8gbG9uZyB3aGVuCisJY2FsbGluZyB3cml0ZV9yZWdpc3Rlcl9waWQuCisJKiAod3JpdGVfcmVnaXN0ZXJfcGlkKTogIEFkZCBwcm90b3R5cGUuCisKK0ZyaSBKdWwgMjkgMjE6NTY6MjMgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLmMgKHJlYWRfZnJhbWUpOiAgU3BsaXQgcmVhZGNoYXIvY2hlY2tzdW0gY2FsY3VsYXRpb24gaW50bworCXR3byBwYXJ0cyBzaW5jZSBldmFsdWF0aW9uIG9yZGVyIGlzIHVuZGVmaW5lZC4KKworRnJpIEp1bCAyOSAxMzo0NjowOCAxOTk0ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworICAgICAgICBGcm9tIEtldmluIEEuIEJ1ZXR0bmVyIChrZXZAY3Vqby5nZWcubW90LmNvbSkuCisJKiBNYWtlZmlsZS5pbiAoY29yZWRlcC5vKTogIEFkZCBpbmZlcmlvci5oIGFzIGRlcGVuZGVuY3kuCisJKiBpbmZsb3cuYzogIEFkZCBGX1NFVE9XTiB0byBsaXN0IG9mIGRlZmluZXMgdG8gY2hlY2sKKwlhcm91bmQgY29kZSB0aGF0IHVzZXMgRl9TRVRPV04uCisKK0ZyaSBKdWwgMjkgMDk6NTk6MDUgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCwgQ1hYX0ZPUl9UQVJHRVQpOiBJZiB1c2luZyBuZXdsaWIsCisJICBzZXQgdGhlIC1MIGFuZCAtQiBkaXJlY3RvcnkgcHJlZml4ZXMgc28gd2UgY2FuIGxpbmsgd2l0aCBpdC4KKworVGh1IEp1bCAyOCAxNDozNzozNiAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoSU5TVEFMTEVEX0xJQlMsIENMSUJTLCBERVBGSUxFUyk6ICBBZGQgc3VwcG9ydCBmb3IKKwktLWVuYWJsZS14eHggY29uZmlndXJlIG9wdGlvbiBieSBhZGRpbmcgRU5BQkxFX3tDTElCUyBERVBGSUxFU30KKwl3aGVyZSBhcHByb3ByaWF0ZS4KKworCSogR2VuZXJhbCBoYWNrZXJ5IHRvIHN1cHBvcnQgYWx0ZXJuYXRlIHVzZXItaW50ZXJmYWNlLgorCSogYnJlYWtwb2ludC5jIChtZW50aW9uLCBkZWxldGVfYnJlYWtwb2ludCwgZW5hYmxlX2JyZWFrcG9pbnQsCisJZGlzYWJsZV9icmVha3BvaW50KTogIENhbGwgaG9va3MgZm9yIGFsdGVybmF0ZSB1c2VyLWludGVyZmFjZS4KKwkqIGRlZnMuaDogIEFkZCBkZWNsYXJhdGlvbnMgZm9yIGFsdGVybmF0ZSB1c2VyLWludGVyZmFjZSBob29rcy4KKwkqIG1haW4uYyAobWFpbik6ICBBZGQgLS1udyAoYW5kIC0tbm93aW5kb3dzKSBvcHRpb25zIHRvIGRpc2FibGUKKwl0aGUgR1VJLgorCSogKG5lYXIgY2FsbCB0byBjb21tYW5kX2xvb3ApOiAgQ2FsbCBjb21tYW5kX2xvb3BfaG9vayBpZiBzZXQuCisJKiAoZnB1dHNfdW5maWx0ZXJlZCk6ICBDYWxsIGZwdXRzX3VuZmlsdGVyZWRfaG9vayBpZiBzZXQuCisJKiBzdGFjay5jOiAgQ2FsbCBwcmludF9mcmFtZV9pbmZvX2xpc3RpbmdfaG9vayBpZiBzZXQuCisJKiB0b3AuYyAoZ2RiX2luaXQpOiAgSW5pdGlhbGl6ZSB0YXJnZXRzLmMgYW5kIHV0aWxzLmMgcHJpb3IgdG8KKwlvdGhlciBmaWxlcyB0byBtYWtlIHN1cmUgdGhhdCBjYWxscyB0byBlcnJvciBhbmQgd2FybmluZyB3aWxsCisJd29yay4gIENhbGwgaW5pdF91aV9ob29rIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZS4KKwkqIHV0aWxzLmMgKHF1ZXJ5KTogIENhbGwgcXVlcnlfaG9vayBpZiBzZXQuCisJKiAoZ2RiX2ZsdXNoKTogIENhbGwgZmx1c2hfaG9vayBpZiBzZXQuCisJKiBDaGFuZ2UgX2luaXRpYWxpemVfdXRpbHMgdG8gaW5pdGlhbGl6ZV91dGlscyBjdXogd2UgZG9uJ3QgdXNlCisJYXV0b21hdGljIGluaXRpYWxpemF0aW9uIG9mIHV0aWxzLmMgYW55bW9yZS4KKworCisJKiByZW1vdGUuYzogIEdldCByaWQgb2YgI2lmZGVmIERPTlRfVVNFX1JFTU9URS4gIEl0J3Mgbm8gbG9uZ2VyCisJbmVjZXNzYXJ5LgorCitUaHUgSnVsIDI4IDE0OjUyOjAxIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQsIENYWF9GT1JfVEFSR0VUKTogVXNlIG5ld2xpYiBpZiBpdCBpcworCSAgdGhlcmUgYW5kIHdlIGFyZSB1c2luZyB0aGUgZ2NjIGZyb20gdGhlIHRyZWUuCisJICAoTERfRk9SX1RBUkdFVCk6IExvb2sgZm9yIGxkIGluIC4uL2xkL2xkLm5ldy4KKworVGh1IEp1bCAyOCAxMDo0MzozNiAxOTk0ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGFubm90YXRlLm8pOiAgQWRkIGRlcGVuZGVuY2llcy4KKworV2VkIEp1bCAyNyAxNDozNDo0MiAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCisKKwkqIHNwYXJjbGl0ZS9hbG9hZC5jOiBBZGRlZCBuZXcgLXEgKHF1aWV0KSBvcHRpb24uCisJICByZXR1cm4gMCBleGl0IHN0YXR1cyBpZiBmaWxlIHdhcyBzdWNjZXNzZnVsbHkgZG93bmxvYWRlZC4KKworCSogbmxtL2dkYnNlcnZlLmM6IG1lcmdlIGluIGNvbW1hbmQgbGluZSBhcmd1bWVudCBwYXJzaW5nIGNoYW5nZXMKKwkgIGFuZCBidWcgZml4ZXMgbWFkZSB0byBpMzg2LW5sbXN0dWIuYy4KKworCSogaTM4Ni1ubG1zdHViLmM6IFRoZSByZXR1cm5MZW5ndGggZmllbGQgbXVzdCBiZSBpbml0aWFsaXplZAorCSAgYmVmb3JlIHBvcnRDb25maWcgaXMgcGFzc2VkIHRvIEFJT0dldFBvcnRDb25maWd1cmF0aW9uLgorCSAgQ29tcGFyZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHdpdGggc3RybmljbXAoKTsgYXJncyBhcmUKKwkgIGNhc2UgaW5zZW5zaXRpdmUgb24gbmV0d2FyZS4KKworV2VkIEp1bCAyNyAwOToyNDoxOSAxOTk0ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6ICBBZGQgZGVmaW5pdGlvbi4KKwkoZGlzdHN0dWZmKTogIEFkZCBmb3IgbmV3IGRpc3RyaWJ1dGlvbiBzdXBwb3J0LgorCShnZGIudGFyLlosIG1ha2UtcHJvdG8tZ2RiLmRpciwgc2V0dXAtdG8tZGlzdCwKKwlnZGItJChWRVJTSU9OKS50YXIuWiwgbWFrZS1wcm90by1nZGItMSwgbWFrZS1wcm90by10ZXN0c3VpdGUuZGlyKToKKwlSZW1vdmUgb2xkIGRpc3RyaWJ1dGlvbiBidWlsZGluZyBydWxlcywgbm93IHVzZXMgc3RhbmRhcmQKKwlkaXN0cmlidXRpb24gc3VwcG9ydCBpbiBwYXJlbnQgZGlyZWN0b3J5IE1ha2VmaWxlLmluLgorCitUdWUgSnVsIDI2IDE0OjE1OjUzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiB0YXJnZXQuYyAocHVzaF90YXJnZXQpOiBDYXN0IHJlc3VsdCBmcm9tIHhtYWxsb2MuCisKK1R1ZSBKdWwgMjYgMTg6MjA6NDYgMTk5NCAgUGF1bCBGbGluZGVycyAgKHB0ZkBzbWVlKQorCisJKiBlbGZyZWFkLmMgKGVsZl9zeW10YWJfcmVhZCk6IERpc2NhcmQgY29tcGlsZXIgbGFiZWxzIGdlbmVyYXRlZAorCWJ5IHRoZSBTb2xhcmlzIDIuMS9JbnRlbCBTdW5Qcm8gY29tcGlsZXIuCisKK01vbiBKdWwgMjUgMTg6MTk6MjQgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogdGFyZ2V0LmMgKG5vbWVtb3J5KTogIEZpeCBwcm90b3R5cGUgYW5kIHJvdXRpbmUgdG8gdGFrZSBjb3JyZWN0CisJYXJncy4KKworTW9uIEp1bCAyNSAxNTozODoyMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogUmVtb3ZlIGxpYmdkYi1maWxlcy4KKworTW9uIEp1bCAyNSAxMTo1MDo1NyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGNvcmVkZXAuYzogSW5jbHVkZSBpbmZlcmlvci5oLgorCitNb24gSnVsIDI1IDExOjM2OjAyIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKKworCSogaTM4Ni1ubG1zdHViLmM6IEFkZCBzdXBwb3J0IGZvciBOT0RFLCBQT1JUIGFuZCBCQVVEIGNvbW1hbmQKKwkgIGxpbmUgYXJndW1lbnRzLgorCitTYXQgSnVsIDIzIDE0OjM2OjA5IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogc3ltZmlsZS5jIChkZWR1Y2VfbGFuZ3VhZ2VfZnJvbV9maWxlbmFtZSk6IFJlY29nbml6ZSAuUyBhcyBhc20sCisJLmNwIGFzIEMrKywgYWxwaGFiZXRpemUgYmV0dGVyLgorCisJKiBicmVha3BvaW50LmMgKGlnbm9yZSwgY29uZGl0aW9uKTogTW92ZSB1c2FnZSBub3RlIGludG8gYm9keSBvZgorCWhlbHAgdGV4dCwgc28gZmlyc3QgbGluZSBjYW4gYmUgb25lLWxpbmUgc3VtbWFyeS4KKworU2F0IEp1bCAyMyAwMDo1ODoxNSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiB0YXJnZXQuYyAodW5wdXNoX3RhcmdldCk6ICBGaXggaGFuZGxpbmcgb2YgcmVtb3ZhbCBvZiB0b3AgdGFyZ2V0LgorCitGcmkgSnVsIDIyIDE3OjMwOjM5IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBBZGQgc3R1ZmYgdG8gYnVpbGQgbmxtc3R1Yi4KKwkqIEFkZCBydWxlIGZvciBhbm5vdGF0ZS5vIHRvIGtlZXAgU3VuIG1ha2UgaGFwcHkuCisJKiBjb25maWd1cmUuaW46ICBBZGQgY29uZmlnIGZvciBwb3dlcnBjL05ldHdhcmUuCisKKwkqIHBhcnRpYWwtc3RhYi5oIChuZWFyIE5fU08pOiAgRG9uJ3QgY2FsbCBTVEFSVF9QU1lNVEFCIHdpdGggbnVsbAorCWZpbGVuYW1lLiAgVGhpcyBzcGVlZHMgdXAgaGFuZGxpbmcgb2YgdHJhaWxpbmcgTl9TTyBzdGFicyAodGhleQorCW1hcmsgdGhlIGVuZCBvZiBhIC5vIGZpbGUpLgorCisJKiB0YXJnZXQuYywgdGFyZ2V0Lmg6ICBDaGFuZ2UgdGhlIHdheSBwdXNoaW5nIGFuZCBwb3BwaW5nIG9mCisJdGFyZ2V0cyB3b3JrIHRvIHN1cHBvcnQgdGFyZ2V0IG92ZXJsYXlzIGFuZCBpbmhlcml0YW5jZS4KKwkqIGNvcmVsb3cuYywgaHBwYS10ZGVwLmMsIGluZmxvdy5jLCByZW1vdGUtbmluZHkuYywgdXRpbHMuYzoKKwlGaXh1cCByZWZlcmVuY2VzIHRvIGN1cnJlbnRfdGFyZ2V0LCBkdWUgdG8gcHJldmlvdXMgY2hhbmdlcy4KKworCSogY29uZmlnL2kzODYvdG0taTM4Nm53Lmg6ICBFbmFibGUgbG9uZ2ptcCBzdXBwb3J0LiAgTW9yZSB3b3JrIGlzCisJbmVlZGVkIHRvIGdldCB0aGUgYWRkcmVzcyBvZiBsb25nam1wIG91dCBvZiB0aGUgdGFyZ2V0LgorCitUdWUgSnVsIDE5IDEzOjI1OjA2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogbWFpbi5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KKworTW9uIEp1bCAxOCAxNTozMjoxNyAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQorCisJKiByZW1vdGUtbWlwcy5jIChtaXBzX3JlYWRjaGFyKTogRml4IGEgYnVnIGluIGNoZWNraW5nIDxJRFQ+CisJcHJvbXB0LgorCitNb24gSnVsIDE4IDE0OjI2OjM1IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogc29saWIuYyAobG9va19mb3JfYmFzZSk6IERvbid0IGRlcmVmIGV4ZWNfYmZkIGlmIE5VTEwuCisKK1N1biBKdWwgMTcgMTU6Mzg6MzYgMTk5NCAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogIEJ1bXAgdG8gNC4xMi40LgorCitTdW4gSnVsIDE3IDEyOjIwOjM1IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCUhhcnJpcyBDWC9VWCBzdXBwb3J0LCBmcm9tIEJvYiBSdXNrIChycnVza0BtYWlsLmNzZC5oYXJyaXMuY29tKS4KKwkqIGNvbmZpZ3VyZS5pbiAobTg4Ki1oYXJyaXMtY3h1eCopOiBOZXcgY29uZmlndXJhdGlvbi4KKwkqIGN4dXgtbmF0LmMsIGNvbmZpZy9tODhrL2N4dXgubWgsIGNvbmZpZy9tODhrL2N4dXgubXQsCisJY29uZmlnL204OGsveG0tY3h1eC5oLCBjb25maWcvbTg4ay90bS1jeHV4LmgsIGNvbmZpZy9tODhrL25tLWN4dXguaDoKKwlOZXcgZmlsZXMuCisJKiBjb25maWcvbTg4ay90bS1tODhrLmg6IEFkZCBjb21tZW50IGFib3V0IEhhcnJpcyBPUy4KKwkoVEFSR0VUX1dSSVRFX1BDKTogUGFzcyBwaWQgdGhyb3VnaCB0byByZWdpc3RlciB3cml0ZXJzLgorCisJKiBjb25maWd1cmUuaW4gKG02OCopOiBQdXQgdmVuZG9yLW9ubHktc3BlY2lmaWVkIGhvc3QgY29uZmlncworCWFmdGVyIHZlbmRvci1hbmQtb3Mtc3BlY2lmaWVkIGNvbmZpZ3MuCisJKG02OCotYXRhcmktc3lzdjQqLCBtNjgqLWNibS1zeXN2NCopOiBSZXBsYWNlIHdpdGggbTY4Ki0qLXN5c3Y0LgorCisJKiBjb25maWcvbTg4ay9kZWx0YTg4Lm1oIChNVU5DSF9ERUZJTkUpOiBSZW1vdmUuCisJKiBjb25maWcvbTg4ay9kZWx0YTg4Lm10LCBjb25maWcvbTg4ay9kZWx0YTg4djQubWg6IEZvcm1hdAorCWNvbnNpc3RlbnRseS4KKworU2F0IEp1bCAxNiAyMzozOToxNyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGVsZnJlYWQuYyAoZWxmX3N5bXRhYl9yZWFkKTogIEhhbmRsZSBlcnJvciByZXR1cm4gZnJvbQorCWJmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgZ3JhY2VmdWxseS4KKworU2F0IEp1bCAxNiAxNDo0MzoxNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGluZmVyaW9yLmggKEFSQ0hfTlVNX1JFR1MpOiBOZXcgbWFjcm8sIGFjdHVhbCBudW1iZXIgb2YKKwlyZWdpc3RlcnMgaW4gdXNlIGJ5IHRoZSBpbmZlcmlvci4KKwkqIGNvcmVkZXAuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMsIHJlZ2lzdGVyX2FkZHIpOiBVc2UgaXQuCisJKiBmaW5kdmFyLmMgKHJlZ2lzdGVyc19jaGFuZ2VkLCByZWdpc3RlcnNfZmV0Y2hlZCwKKwlyZWFkX3JlZ2lzdGVyX2J5dGVzKTogRGl0dG8uCisJKiBpbmZjbWQuYyAoZG9fcmVnaXN0ZXJzX2luZm8sIHJlZ2lzdGVyc19pbmZvKTogRGl0dG8uCisJKiBpbmZwdHJhY2UuYyAoZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzLAorCXN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6IERpdHRvLgorCSogc3RhY2suYyAoZnJhbWVfaW5mbyk6IERpdHRvLgorCisJKiBjb3JlZGVwLmMgKENPUkVfUkVHSVNURVJfQUREUik6IE5ldyBtYWNyby4KKwkoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiBVc2UgaXQuCisKKwkqIGJyZWFrcG9pbnQuYyAoaWdub3JlLCBjb25kaXRpb24pOiBBZGQgdXNhZ2Ugbm90ZXMgdG8gaGVscCBzdHJpbmdzLgorCSogc3ltZmlsZS5jIChhZGQtc3ltYm9sLWZpbGUpOiBBZGQgdXNhZ2Ugbm90ZSB0byBoZWxwIHN0cmluZy4KKwkoYWRkX3NoYXJlZF9zeW1ib2xfZmlsZXNfY29tbWFuZCk6IE5ldyBjb21tYW5kLgorCisJZ2NjIC1XYWxsIGxpbnQuCisJKiBpbmZlcmlvci5oIChyZWFkX3BjX3BpZCk6IERlY2xhcmUuCisJKiBicmVha3BvaW50LmMgKHdhdGNocG9pbnRfY2hlY2spOiBDYWNoZSBicmVha3BvaW50IGluIGxvY2FsCisJdmFyaWFibGUgYiwgcmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBvdGhlcl90eXBlX3VzZWQuCisJKiBtYWluLmMgKGluZmVyaW9yLmgsIGNhbGwtY21kcy5oKTogSW5jbHVkZS4KKwkoZ2RiX2luaXQpOiBEZWNsYXJlLgorCSogcmVtb3RlLmMgKHJlbW90ZV93YWl0KTogUmV0dXJuIDAgYnkgZGVmYXVsdC4KKworRnJpIEp1bCAxNSAxNjo0MzozMyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwlTdG9wIHByaW50aW5nIGF0IG51bGwgY2hhciBvcHRpb24sIGZyb20gT2xpdmVyIE1leWVyCisJKG9tZXllckBpMy5pbmZvcm1hdGlrLnJ3dGgtYWFjaGVuLmRlKS4KKwkqIHZhbHByaW50LmgsIHZhbHByaW50LmMgKHN0b3BfcHJpbnRfYXRfbnVsbCk6IE5ldyBnbG9iYWwuCisJKiB2YWxwcmludC5jIChfaW5pdGlhbGl6ZV92YWxwcmludCk6IE5ldyBwcmludCBzZXQgc3ViY29tbWFuZAorCSJudWxsLXN0b3AiLgorCSogYy12YWxwcmludC5jIChjX3ZhbF9wcmludCk6IElmIHN0b3BfcHJpbnRfYXRfbnVsbCBpcyBvbiwgYW5kCisJcHJpbnRpbmcgYSBjaGFyCWFycmF5LCBhZGp1c3QgdGhlIG51bWJlciBvZiBjaGFycyB0byBwcmludC4KKworRnJpIEp1bCAxNSAxNDozMzo0MCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKyAgICAgICAgRnJvbSBLZXZpbiBBLiBCdWV0dG5lciAoa2V2QGN1am8uZ2VnLm1vdC5jb20pLgorCSogbTg4ay10ZGVwLmMgKGV4YW1pbmVfcHJvbG9ndWUpOiBNb2RpZmllZCB0byBoYW5kbGUgcHJvbG9ndWVzIGZvcgorCXBpYyBjb2RlIGluIGFkZGl0aW9uIHRvIHByb2xvZ3VlcyB3aGVyZSBhbiBpbnN0cnVjdGlvbiBmcm9tIHRoZQorCXByb2xvZ3VlIGdldHMgbW92ZWQgaW50byB0aGUgZGVsYXkgc2xvdCBvZiBhIGJyYW5jaCBpbnN0cnVjdGlvbgorCWltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgcHJvbG9ndWUuICBBIHRhYmxlIG9mIHBvdGVudGlhbCBwcm9sb2d1ZQorCWluc3RydWN0aW9ucyAocHJvbG9ndWVfaW5zbl90YmwpIGlzIG5vdyB1c2VkIGZvciBwaWNraW5nIGFwYXJ0IGEKKwlmdW5jdGlvbiBwcm9sb2d1ZS4KKwkoZnJhbWVfZmluZF9zYXZlZF9yZWdzKTogQ2hhbmdlZCB0aGUgd2F5IGluIHdoaWNoIGxpbWl0IGdldHMgc2V0CisJc28gdGhhdCB0aGUgZGVsYXkgc2xvdCBvZiBicmFuY2ggaW5zdHJ1Y3Rpb25zIGltbWVkaWF0ZWx5CisJZm9sbG93aW5nIHRoZSBwcm9sb2d1ZSBnZXRzIGV4YW1pbmVkLgorCShwdXNoZWRfc2l6ZSwgc3RvcmVfcGFybV93b3JkLCBzdG9yZV9wYXJtLCBwdXNoX3BhcmFtZXRlcnMsCisJY29sbGVjdF9yZXR1cm5lZF92YWx1ZSk6ICBEZWxldGVkLgorCitGcmkgSnVsIDE1IDAxOjA2OjAwIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogIEhhbmRsZSBzdGVwcGluZyBpbnRvIGxlYWYKKwlmdW5jdGlvbnMgd2hvc2UgcHJvbG9ndWUgY29uc2lzdHMgb2YgZ3AgbG9hZGluZyBjb2RlIG9ubHkuCisKK1RodSBKdWwgMTQgMTQ6MjI6MTIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBkYnhyZWFkLmM6IERvbid0IGluY2x1ZGUgbGliYmZkLmguCisJKiBkd2FyZnJlYWQuYywgZWxmcmVhZC5jIHNvbXJlYWQuYzogRG9uJ3QgaW5jbHVkZSBsaWJiZmQuaCwKKwk8dGltZS5oPiwgb3IgPHN5cy90eXBlcy5oPi4KKwkqIGVsZnJlYWQuYyAoZWxmX3N5bWZpbGVfcmVhZCk6IFVzZSBvbmx5IHN0YW5kYXJkIEJGRCBmdW5jdGlvbnMgdG8KKwljb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGFiIGFuZCBzdGFiIHN0cmluZyBzZWN0aW9ucy4KKworVGh1IEp1bCAxNCAxMzoxNzozOSAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAeDEuY3lnbnVzLmNvbSkKKworCSogc3RhYnNyZWFkLmMgKHJlYWRfaHVnZV9udW1iZXIpOiBoYW5kbGUgbGFyZ2UgdW5zaWduZWQgbnVtYmVyCisJZm9yIHN0YWJzIGdlbmVyYXRlZCBieSBvczlrIEMgY29tcGlsZXIuCisKK1dlZCBKdWwgMTMgMTg6NTg6MTUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJQnJlYWtwb2ludCBoaXQgY291bnRzLCBmcm9tIEJvYiBSdXNrIChycnVza0BtYWlsLmNzZC5oYXJyaXMuY29tKS4KKwkqIGJyZWFrcG9pbnQuaCAoaGl0X2NvdW50KTogTmV3IGJyZWFrcG9pbnQgZmllbGQuCisJKiBicmVha3BvaW50LmMgKHNob3dfYnJlYWtwb2ludF9oaXRfY291bnRzKTogTmV3IHZhcmlhYmxlLgorCShjbGVhcl9icmVha3BvaW50X2hpdF9jb3VudHMpOiBOZXcgZnVuY3Rpb24uCisJKGJwc3RhdF9zdG9wX3N0YXR1cyk6IEluY3JlbWVudCB0aGUgaGl0IGNvdW50LgorCShicmVha3BvaW50XzEpOiBEaXNwbGF5IHRoZSBoaXQgY291bnQuCisJKiBpbmZjbWQuYyAocnVuX2NvbW1hbmQpOiBSZXNldCBicmVha3BvaW50IGhpdCBjb3VudHMuCisJKiB0YXJnZXQuYyAoZ2VuZXJpY19tb3Vybl9pbmZlcmlvcik6IERvbid0IGNsZWFyIGlnbm9yZSBjb3VudHMgaWYKKwlkaXNwbGF5aW5nIGhpdCBjb3VudHMuCisJCitUdWUgSnVsIDEyIDEyOjIzOjE1IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZWxmcmVhZC5jIChlbGZfc3ltZmlsZV9yZWFkKTogIFVuY29uZGl0aW9uYWxseSBhZGQgZHluYW1pYworCXN5bWJvbHMgZm9yIGFsbCBzeW1ib2wgZmlsZXMuICBNYWtlcyBza2lwcGluZyBvdmVyIHRoZQorCXRyYW1wb2xpbmUgY29kZSB3b3JrIHdoZW4gc3RlcHBpbmcgZnJvbSBhIGZ1bmN0aW9uIGluIGEgc2hhcmVkCisJbGlicmFyeSBpbnRvIGEgZnVuY3Rpb24gaW4gYSBkaWZmZXJlbnQgc2hhcmVkIGxpYnJhcnkgZm9yIElyaXggNS4KKwlPdGhlciBFTEYgdGFyZ2V0cyBkbyBub3QgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gaW4gdGhlaXIKKwlkeW5hbWljIHN5bWJvbCB0YWJsZXMgdG8gbWFrZSB0aGlzIHdvcmsuCisJKGVsZl9zeW10YWJfcmVhZCk6ICBSZWxvY2F0ZSBtc3Rfc29saWJfdHJhbXBvbGluZSBhZGRyZXNzLgorCitNb24gSnVsIDExIDE2OjM4OjQ5IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCUF0YXJpIHN1cHBvcnQsIGZyb20gVXdlIFNlaW1ldCAoc2VpbWV0QGNoZW1pZS51bmkta2wuZGUpLgorCSogY29uZmlndXJlLmluIChtNjgqLWF0YXJpLXN5c3Y0Kik6IE5ldyBjb25maWd1cmF0aW9uLgorCShtNjgqLWNibS1zeXN2NCopOiBVc2UgbTY4a3Y0IGluc3RlYWQgb2YgYW1peC4KKwkqIG02OGstdGRlcC5jIChSX1BTKTogRGVmaW5lIGFzIFJfU1IgaWYgbmVjZXNzYXJ5LgorCSogY29uZmlnL202OGsvbTY4a3Y0Lm1oLCBjb25maWcvbTY4ay9tNjhrdjQubXQsCisJY29uZmlnL202OGsvdG0tbTY4a3Y0LmgsIGNvbmZpZy9tNjhrL3htLW02OGt2NC5oOiBOZXcgZmlsZXMuCisJKiBjb25maWcvbTY4ay9hbWl4Lm1oLCBjb25maWcvbTY4ay9hbWl4Lm10LAorCWNvbmZpZy9tNjhrL3RtLWFtaXguaCwgY29uZmlnL202OGsveG0tYW1peC5oOiBSZW1vdmVkLCBzdXBlcnNlZGVkCisJYnkgbTY4a3Y0IGZpbGVzLgorCitTYXQgSnVsICA5IDE2OjI4OjQzIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogc3ltdGFiLmMgKGZpbmRfZnVuY3Rpb25fc3RhcnRfc2FsKTogIE5ldyBmdW5jdGlvbiB0byBmaW5kCisJdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24gZnJvbSBhIGZ1bmN0aW9uIHN5bWJvbC4KKwkoZGVjb2RlX2xpbmVfMSwgZGVjb2RlX2xpbmVfMik6ICBVc2UgaXQgaW5zdGVhZCBvZiBvcGVuIGNvZGVkCisJcGFydGlhbCBjb3BpZXMgb2YgdGhlIGNvZGUuCisJKGxpc3Rfc3ltYm9scyk6ICBRdW90ZSBzeW1ib2wgbmFtZSBiZWZvcmUgcGFzc2luZyBpdCB0bworCWJyZWFrX2NvbW1hbmQgdG8gZW5hYmxlIHByb3BlciBoYW5kbGluZyBvZiBtYW5nbGVkIHN5bWJvbHMuCisKK1dlZCBKdWwgIDYgMjA6MjI6MDcgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIGNoLWV4cC55IChtYXRjaF9zaW1wbGVfbmFtZV9zdHJpbmcpOiAgRG9uJ3QgbG93ZXItY2FzZSBoZXJlLgorCSogY2gtZXhwLnkgKHl5bGV4KTogIEZpcnN0IHRyeSBuYW1lIGxvb2t1cCB1c2luZyBleGFjdCBuYW1lCisJdHlwZWQgYnkgdXNlcjsgIGlmIHRoYXQgZmFpbHMsIHRyeSBsb3dlci1jYXNlZCBuYW1lLgorCitXZWQgSnVsIDA2IDEyOjM5OjA3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBocHJlYWQuYzogTW9yZSBjbGVhbnVwcy4gIERlbGV0ZSBsb3RzIG9mIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisJUmVtb3ZlIHNvbWUgaXRlbXMgZnJvbSB0aGUgVE9ETyBsaXN0IGFuZCBub3RlcyB0aHJvdWdob3V0IGNvZGUKKwlmb3IgdGhpbmdzIHdoaWNoIG5lZWQgZml4aW5nLiAgQWRkIG1vcmUgY29tbWVudHMuCisJRG9jdW1lbnQgYm9ndXMgc3RydWN0IHN5bWxvYyBzaGFyaW5nIHdpdGggZGJ4cmVhZC5jLiAgRGVsZXRlIG1vcmUKKwl1c2VsZXNzIHZhcmlhYmxlcy4gIEFkZCBtb3JlIFBBUkFNIHByb3RvdHlwZXMuICBGaXh1cCBtb3JlCisJaW5kZW50aW9uIHByb2JsZW1zIHRoYXQgaGF2ZSBjcmVwdCBpbi4KKwkoU0VUX05BTUVTVFJJTkcpOiBBY2NlcHQgbmV3IG5hbWVwIGFuZCBvYmpmaWxlIGFyZ3VtZW50cyBzbyB0aGF0CisJaXQgZG9lc24ndCBkZXBlbmQgb24gdGhlIHZhcmlhYmxlIG5hbWVzIG9uIHRoZSBwcm9jZWR1cmVzIGl0J3MKKwl1c2VkIGZyb20uICAKKwkoaHByZWFkX3N5bWZpbGVfaW5pdCk6IERlbGV0ZSBpbmNvcnJlY3QgY2hlY2tzIGZvciBib2d1cyBzaXplcyBvZgorCXRoZSBkZWJ1ZyBzZWN0aW9ucy4KKworV2VkIEp1bCAgNiAwMDo0ODo1NyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGRieHJlYWQuYywgZWxmcmVhZC5jLCBtaXBzcmVhZC5jLCBubG1yZWFkLmMsIG9zOWtyZWFkLmM6CisJTW92ZSAibm8gZGVidWdnaW5nIHN5bWJvbHMgZm91bmQiIHRlc3QgdG8gc3ltZmlsZS5jLgorCSogc3ltZmlsZS5jIChzeW1zX2Zyb21fb2JqZmlsZSwgcmVyZWFkX3N5bWJvbHMpOiAgQWRkCisJIm5vIGRlYnVnZ2luZyBzeW1ib2xzIGZvdW5kIiB0ZXN0LgorCSogY29mZnJlYWQuYyAoaW5pdF9zdHJpbmd0YWIpOiAgSGFuZGxlIHN0cmlwcGVkIGZpbGVzIHdpdGggYQorCXN0cmluZ3RhYiBvZmZzZXQgb2YgemVybyBncmFjZWZ1bGx5LgorCSogb3Nmc29saWIuYyAoc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiAgVXNlIERZTkFNSUMgZmxhZyBmcm9tCisJQkZEIGluc3RlYWQgb2Ygc3RvcF9wYyBoZXVyaXN0aWMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEgZHluYW1pY2FsbHkKKwlsaW5rZWQgb2JqZWN0IGZpbGUuCisJKiBwcm9jZnMuYyAod2FpdF9mZCk6ICBIYW5kbGUgRU5PRU5UIGVycm9yIHJldHVybiBmcm9tIFBJT0NXU1RPUAorCWlvY3RsLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkLgorCitNb24gSnVsIDA0IDE5OjQ4OjAzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBocHJlYWQuYyAoaHByZWFkX3N5bWZpbGVfaW5pdCk6IE1ha2Ugc3VyZSB0byBpbml0aWFsaXplIGFsbCB0aGUKKwlwcml2YXRlIGRhdGEgdG8gemVyby4gIE5vdCBoYXZpbmcgYW55IEhQIEMgZGVidWcgc3ltYm9scyBpcyBub3QgYW4KKwllcnJvci4gIEp1c3QgcmV0dXJuLgorCitNb24gSnVsICA0IDE5OjI4OjU2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBocHBhLXRkZXAuYyAocmVhZF91bndpbmRfaW5mbyk6IEVMRiB1bndpbmQgaW5mb3JtYXRpb24gaXMgaW4gdGhlCisJLlBBUklTQy51bndpbmQgc2VjdGlvbiBub3cuCisKK01vbiBKdWwgIDQgMTc6MDY6MjYgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBicmVha3BvaW50LmMgKG1lbnRpb24pOiBBbHdheXMgc2hvdyBicmVha3BvaW50IGFkZHJlc3MgaWYgbm8KKwlzb3VyY2UgZmlsZS4KKworU2F0IEp1bCAgMiAwMTo1MTozMyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIHNvbGliLmMgKGJmZF9sb29rdXBfc3ltYm9sLCBsb29rX2Zvcl9iYXNlKTogIFJlaW5zdGF0ZSB0byByZWVuYWJsZQorCWhhbmRsaW5nIG9mIHNoYXJlZCBsaWJyYXJpZXMgZm9yIG5vbi1FTEYgZXhlY3V0YWJsZXMsIGJ1dCBvbmx5IGlmCisJSEFORExFX1NWUjRfRVhFQ19FTVVMQVRPUlMgaXMgZGVmaW5lZC4KKwkobG9jYXRlX2Jhc2UpOiAgVHJ5IHRvIGZpbmQgZGVidWdfYmFzZSBpbiB0aGUgZHluYW1pYyBsaW5rZXIKKwlmb3Igbm9uLUVMRiBleGVjdXRhYmxlcyBpZiBIQU5ETEVfU1ZSNF9FWEVDX0VNVUxBVE9SUyBpcyBkZWZpbmVkLgorCSogY29uZmlnL3NwYXJjL3RtLXN1bjRzb2wyLmggKEhBTkRMRV9TVlI0X0VYRUNfRU1VTEFUT1JTKToKKwlEZWZpbmUgdG8gZW5hYmxlIGhhbmRsaW5nIG9mIHNoYXJlZCBsaWJyYXJpZXMgZm9yIGEub3V0IGV4ZWN1dGFibGVzLAorCXJ1biB1bmRlciBTb2xhcmlzIEJDUC4KKworRnJpIEp1bCAwMSAxOTo1MDoyMSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHByZWFkLmM6IENoYW5nZSBjb250cmlidXRpb24gbm90aWNlIHRvIHRoZSBDeWdudXMvVXRhaCBhZ3JlZWQKKwl1cG9uIG5vdGljZS4gIERlbGV0ZSBzb21lIHN0dWZmIGZyb20gdGhlIFRPRE8gbGlzdC4gIFJld29yaworCW1hbnkgY29tbWVudHMgdG8gYmUgY2xlYXJlci4gIE1ham9yIGNsZWFudXBzLiAgQ29uc2lzdGVudGx5CisJdXNlICJocHJlYWRfIiBwcmVmaXguICBEZWxldGUgdW5uZWNlc3NhcnkgbWFjcm9zLCBzdHJ1Y3R1cmVzCisJdmFyaWFibGVzLCBmaWVscywgZnVuY3Rpb25zIGFuZCAjaWYgMCBjb2RlLiAgTWFyayBjb2RlIHdoaWNoCisJc3RpbGwgbmVlZHMgdG8gYmUgY2xlYW5lZCB1cC4gIFBBUkFNaXplIGFuZCBtYWtlIG1vc3QgZnVuY3Rpb25zCisJc3RhdGljLiBGaXggZXJyb3IgY2hlY2tpbmcgd2hlbiByZWFkaW5nIGluIHRoZSBkZWJ1ZyBzZWN0aW9uCisJY29udGVudHMuICBObyBtb3JlIG1pbmltYWwgc3ltYm9sIHRhYmxlIGhhbmRsaW5nIGluIHRoaXMgY29kZSEKKworVGh1IEp1biAzMCAxMzo1OToyMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogUHJpbnQgIlByb2dyYW0gZXhpdGVkIG5vcm1hbGx5IgorCXJlZ2FyZGxlc3Mgb2YgYmF0Y2hfbW9kZS4KKwkqIGRlZnMuaCwgdG9wLmMgKGJhdGNoX21vZGUpOiBSZW1vdmVkLgorCitXZWQgSnVuIDI5IDE4OjUzOjM2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGRjYWNoZV9oKTogUmVtb3ZlIHJlZHVuZGFudCBkZWZpbml0aW9uLgorCShpbml0LmMpOiBBZGQgYSBjb21tZW50LgorCSh0b3AuYyk6IFJlbW92ZSBleHBsaWNpdCBjb21waWxlIGFjdGlvbi4KKwkqIGJyZWFrcG9pbnQuYyAobWVudGlvbik6IFNoYXJlIGNvZGUgaW5kaWNhdGluZyBsb2NhdGlvbiBvZgorCWJyZWFrL3dhdGNocG9pbnRzLCBkb24ndCBwcmludCBhZGRyZXNzIGlmIGFkZHJlc3NwcmludCBpcyBvZmYuCisJKiBicmVha3BvaW50LmMsIGMtdHlwZXByaW50LmMsIGMtdmFscHJpbnQuYywgZW5lcmdpemUuYywgc3ltdGFiLmgKKwkoZGVtYW5nbGUpOiBSZW1vdmUgcmVkdW5kYW50IGRlY2xhcmF0aW9ucy4KKwkqIGV2YWwuYzogUmVtb3ZlIHJlZHVuZGFudCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCisJKiBvYmpmaWxlcy5oOiBDb3NtZXRpYyBhbmQgZ3JhbW1hdGljYWwgaW1wcm92ZW1lbnRzLgorCSogVE9ETzogVmFyaW91cyB1cGRhdGVzLgorCisJKiByZW1vdGUtbWlwcy5jOiBSZXBsYWNlIGFsbCBcciBjaGFycyB3aXRoIFwwMTUuCisJKG1pcHNfcmVjZWl2ZV9oZWFkZXIpOiBEaXNwbGF5IGNvbnRyb2wgY2hhcmFjdGVycyByZWFkYWJseS4KKwkobWlwc194ZmVyX21lbW9yeSk6IEFkZCBhIHNpbXBsZSBwcm9ncmVzcyBkaXNwbGF5LgorCitXZWQgSnVuIDI5IDEzOjExOjQ1IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGNpcmRhbi5jeWdudXMuY29tKQorCisJKiByZW1vdGUtZTcwMDAuYyAoZTcwMDBfb3Blbik6IERvbid0IHRyeSBhIHRjcCBvcGVuIGlmIHdlJ3JlCisJdXNpbmcgZ28zMi4KKwkqIHJlbW90ZS1obXMuYyAoZmx1c2gpOiBOZXcgZnVuY3Rpb24uCisJKGV4cGVjdCk6IEdldCBlZGdlIGNhc2UgcmlnaHQuCisJKGhtc19yZWFkX2luZmVyaW9yX21lbW9yeSk6IEJlIG1vcmUgdG9sZXJhbnQgb2YgbGluZSBub2lzZS4KKworVHVlIEp1biAyOCAxNDoxNzowMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBVc2UgaTM4Nm0zLm1oIGFuZCBpMzg2bTMubXQgYXMgbmFtZXMgb2YgaG9zdCBhbmQKKwl0YXJnZXQgZmlsZXMsIG5vdCBub24tZXhpc3RlbnQgbWFjaDMubWggYW5kIG1hY2gzLm10LgorCitXZWQgSnVuIDI5IDAwOjI2OjE3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZGJ4cmVhZC5jIChkYnhfc3ltZmlsZV9yZWFkKTogIFVuY29uZGl0aW9uYWxseSBhZGQgZHluYW1pYworCXN5bWJvbHMgZm9yIGFsbCBzeW1ib2wgZmlsZXMuICBNYWtlcyBza2lwcGluZyBvdmVyIHRoZQorCXRyYW1wb2xpbmUgY29kZSB3b3JrIHdoZW4gc3RlcHBpbmcgZnJvbSBhIGZ1bmN0aW9uIGluIGEgc2hhcmVkCisJbGlicmFyeSBpbnRvIGEgZnVuY3Rpb24gaW4gYSBkaWZmZXJlbnQgc2hhcmVkIGxpYnJhcnkuCisJKHJlYWRfZGJ4X2R5bmFtaWNfc3ltdGFiKTogIFJlbG9jYXRlIG1zdF9zb2xpYl90cmFtcG9saW5lIGFkZHJlc3MuCisKK1R1ZSBKdW4gMjggMTU6Mjg6MDEgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogZGJ4cmVhZC5jLCBwYXJ0aWFsLXN0YWIuaCAobmVhciBOX1NPKTogIFNPIHN0YWJzIHdpdGggYmxhbmsKKwluYW1lcyBtZWFuIGVuZCBvZiAubyBmaWxlLgorCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogIENsZWFuIHVwIG11bHRpLXRocmVhZCBsb2dpYyBuZWFyCisJdG9wIG9mIHJvdXRpbmUuICBIYW5kbGUgbmV3IHRocmVhZCBub3RpZmljYXRpb24gY2xlYW5seS4KKwkqIGx5bngtbmF0LmMgKGNoaWxkX3dhaXQpOiAgR2VuZXJhbCBjbGVhbnVwcywgaGFuZGxlIG5ldyBMeW54T1MKKwl0aHJlYWQgbm90aWZpY2F0aW9uIHNjaGVtZS4KKwkqIChjaGlsZF9yZXN1bWUpOiAgR2VuZXJhbCBjbGVhbnVwcywgaGFuZGxlIHJlc3VtcHRpb24gb2YgYWxsCisJdGhyZWFkcyBwcm9wZXJseS4KKworTW9uIEp1biAyNyAwOTo1NzoyMyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogc2VyLWdvMzIuYzogUmV3cml0ZSB0byBydW4gdW5kZXIgd2luZG93cy4KKwkqIHNlci1lN2twYy5jOiBOZXcgZmlsZSB0byBzdXBwb3J0IHRoZSBFNzAwMCB3aXRoIHRoZSBQQyBJU0EKKwlidXMgaW50ZXJmYWNlLgorCSogc2VyaWFsLmMgKHNlcmlhbF9vcGVuKTogTm90aWNlIGRldmljZSAicGMiLgorCSogcmVtb3RlLWU3MDAwLmM6IEZpeCBjb3B5cmlnaHQgZGF0ZS4KKwkoZXhwZWN0KTogQ29tcGFyZSBcbiBhbmQgXHIgdGhlIHNhbWUuCisJKGU3MDAwX29wZW4pOiBBbGxvdyBwYyBhcyBhIHNlcmlhbCBwb3J0CisJKiBzaC9zaC5tdDogQWRkIHNlci1lN2twYy4KKwkqIGg4MzAwL2g4MzAwaG1zLm10OiBBZGQgc2VyLWU3a3BjLgorCSogbWFpbi5jIChwcm9jX3dhaXQpOiBEb24ndCB3YWl0IGlmIHVzaW5nIGdvMzIuCisKK01vbiBKdW4gMjcgMDA6MzU6NTEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbXJlYWQuYzogU2ltcGxpZnkgYnkgdXNpbmcgc3RhYnNlY3RfYnVpbGRfcHN5bXRhYnMuCisJKiBkYnhyZWFkLmMgKHN0YWJzZWN0X2J1aWxkX3BzeW10YWJzKTogTmV3IGFyZ3VtZW50ICJ0ZXh0X25hbWUiCisJY29ycmVzcG9uZGluZyB0byB0aGUgbmFtZSBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgQWxsIHJlZmVyZW5jZXMKKwljaGFuZ2VkLgorCShzb21zdGFiX2J1aWxkX3BzeW10YWJzKTogRGVsZXRlIGZ1bmN0aW9uLCBubyBsb25nZXIgbmVlZGVkLgorCitTdW4gSnVuIDI2IDIzOjU0OjA4IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb21yZWFkLmM6IFJlbmFtZWQgZnJvbSBwYXJlYWQuYy4gIENoYW5nZWQgZnVuY3Rpb24gbmFtZXMgYW5kCisJY29tbWVudHMgdG8gcmVmbGVjdCB0aGF0IHRoaXMgZmlsZSBkZWFscyB3aXRoIFNPTSAoYW4gb2JqZWN0IGZpbGUKKwlmb3JtYXQpLCByYXRoZXIgdGhhbiB0aGUgUEEgKGEgY3B1KS4KKwkoTWFrZWZpbGUuaW4pOiBDaGFuZWQgYXBwcm9wcmlhdGVseS4KKwkoY29uZmlnL3BhL2hwcGFic2QubWgsIGNvbmZpZy9wYS9ocHBhaHB1eC5taCk6IExpa2V3aXNlLgorCSogZGJ4cmVhZC5jIChzb21zdGFiX2J1aWxkX3BzeW10YWJzKTogUmVuYW1lZCBmcm9tCisJcGFzdGFiX2J1aWxkX3BzeW10YWJzLgorCitGcmkgSnVuIDI0IDA4OjE1OjQyIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY29yZS1zb2wyLmM6ICBOZXcgZmlsZSB0byBoYW5kbGUgRUxGIGFuZCBCQ1AgY29yZSBmaWxlIGZsYXZvdXJzLgorCSogY29uZmlnL3NwYXJjL3N1bjRzb2wyLm1oIChOQVRERVBGSUxFUyk6ICBVc2UgaXQgaW5zdGVhZCBvZgorCWNvcmUtc3ZyNC4KKwkqIE1ha2VmaWxlLmluOiAgVXBkYXRlZCBmb3IgY29yZS1zb2wyLmMuCisJKiBSRUFETUU6ICBBZGQgbm90ZXMgYWJvdXQgU1BBUkN3b3JrcyBjYyB1bmRlciBTb2xhcmlzIDIueCwKKwlmcm9tIENhc3BlciBILlMuIERpayAoY2FzcGVyQGZ3aS51dmEubmwpLgorCSogY29uZmlnL21pcHMveG0tbWFrZXZhLmg6ICBSZW1vdmVkLCBubyBsb25nZXIgbmVjZXNzYXJ5LgorCSogTWFrZWZpbGUuaW4sIGNvbmZpZy9taXBzL3htLWlyaXgzLmgsIGNvbmZpZy9taXBzL3htLWlyaXg1LmgsCisJY29uZmlnL21pcHMveG0tbWlwcy5oLCBjb25maWcvbWlwcy94bS1uZXdzLW1pcHMuaCwKKwljb25maWcvbWlwcy94bS1yaXNjb3MuaDogIFJlbW92ZSByZWZlcmVuY2VzIHRvIHhtLW1ha2V2YS5oCisKK1dlZCBKdW4gMjIgMTc6NDg6MjEgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYmEuZWw6IFB1dCBwcm9ncmFtIGlucHV0IGFuZCBvdXRwdXQgaW4gYSBzZXBhcmF0ZSBidWZmZXIuCisKK1dlZCBKdW4gMjIgMTY6NTQ6MTUgMTk5NCAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGVuZXJnaXplLXBhdGNoZXMsIG1haW4uYyAobWFpbiksIHRvcC5jIChnZGJfaW5pdCwgcHdkX2NvbW1hbmQpLAorCXRvcC5oOiBDaGFuZ2UgYWxsIG9jY3VyYW5jZXMgb2YgZGlyYnVmIHRvIGdkYl9kaXJidWYuICBDb2xsaWRlcworCXdpdGggZ2xvYmFsIHZhcmlhYmxlIG9mIHNhbWUgbmFtZSBpbiBsaWJuc2wuc28gb24gVW5peFdhcmUuCisKK1dlZCBKdW4gMjIgMTQ6NDA6NTIgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKKworCSogc3ltdGFiLmMgKGRlY29kZV9saW5lXzEpOiBmaXggYSBidWcgaW4gZGVhbGluZyB3aXRoICc8PicKKwllbWJlZGRlZCBpbiB0ZW1wbGF0ZSBuYW1lLgorCitUdWUgSnVuIDIxIDE0OjA2OjQ2IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9pMzg2L25tLWxpbnV4Lmg6IGNoYW5nZSBjYWxsaW5nIGNvbnZlbnRpb24gb2YgCisJVEFSR0VUX0NBTl9VU0VfSEFSRFdBUkVfV0FUQ0hQT0lOVCgpIGFuZAorCXRhcmdldF9pbnNlcnRfd2F0Y2hwb2ludCgpIGFuZAorCXRhcmdldF9yZW1vdmVfd2F0Y2hwb2ludCgpLgorCisJKiBjb25maWcvbWlwcy90bS1taXBzNjQuaDogZGVmaW5lIEZPUkNFX0xPTkdfTE9ORyB0byBmb3JjZSBMT05HRVNUCisJdG8gYmUgbG9uZyBsb25nIGluIGdkYi4KKwkqIGNvbmZpZy9taXBzL3RtLWJpZ21pcHMuaDogZGl0dG8uCisKK01vbiBKdW4gMjAgMjM6NTQ6MzcgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjLWxhbmcuYyAoYXNtX2xhbmd1YWdlX2RlZm4pOiAgTmV3IGRlZmluaXRpb25zIGZvciBsYW5ndWFnZV9hc20sCisJbW9zdGx5IGNvcGllZCBmcm9tIGNfbGFuZ3VhZ2VfZGVmbiwgdG8gYXZvaWQgd2FybmluZ3Mgd2hlbgorCXN3aXRjaGluZyBiZXR3ZWVuIGMgYW5kIGFzbSBzdGFjayBmcmFtZXMuCisKK01vbiBKdW4gMjAgMTM6NTE6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3N5bWJvbCk6IERvbid0IGNhbGwgZWNvZmZfc3dhcF90aXJfaW4gb3IKKwllY29mZl9zd2FwX3JuZHhfaW4gZGlyZWN0bHk7IHVzZSB0aGUgZGVidWdfc3dhcCBwb2ludGVyIGluc3RlYWQuCisJKHVwZ3JhZGVfdHlwZSwgaGFuZGxlX3BzeW1ib2xfZW51bWVyYXRvcnMpOiBMaWtld2lzZS4KKwkoaGFzX29wYXF1ZV94cmVmLCBjcm9zc19yZWYpOiBMaWtld2lzZS4KKwkoZWxmbWRlYnVnX2J1aWxkX3BzeW10YWJzKTogQ2FsbCBzd2FwLT5yZWFkX2RlYnVnX2luZm8gdG8gcmVhZAorCWRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZG9pbmcgaXQgaGVyZS4KKwkqIG1pcHNyZWFkLmMgKG1pcHNjb2ZmX3N5bWZpbGVfcmVhZCk6IENhbGwgcmVhZF9kZWJ1Z19pbmZvIGVudHJ5CisJcG9pbnQgaW4gZWNvZmZfZGVidWdfc3dhcCBiYWNrZW5kIHN0cnVjdHVyZSwgcmF0aGVyIHRoYW4gY2FsbGluZworCWVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8gZGlyZWN0bHkuCisKK0ZyaSBKdW4gMTcgMjA6NTg6NTggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGJyZWFrcG9pbnQuYzogSW5jbHVkZSBhbm5vdGF0ZS5oLiAgQ2FsbCBhbm5vdGF0ZV9maWVsZCByYXRoZXIKKwl0aGFuIHByaW50aW5nIGFubm90YXRpb24gZGlyZWN0bHkuCisKKwkqIG1haW4uYzogSW5jbHVkZSBzdHJpbmcuaC4KKworVGh1IEp1biAxNiAxNDo0MTozNyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGZvcmstY2hpbGQuYyAoc3RhcnR1cF9pbmZlcmlvcikgW1NUQVJUVVBfSU5GRVJJT1JdOiBJZiBkZWZpbmVkLAorCWNhbGwgaXQgaW5zdGVhZCBvZiBkb2luZyBub3JtYWwgbG9vcC4KKwkqIGluZmNtZC5jIChhdHRhY2hfY29tbWFuZCk6IERvbid0IGNhbGwgd2FpdF9mb3JfaW5mZXJpb3IgaWYKKwlydW5uaW5nCU1hY2ggMy4KKwkqIGluZnJ1bi5jIChwcm9jZWVkKSBbUFJFUEFSRV9UT19QUk9DRUVEXTogSWYgZGVmaW5lZCwgY2FsbAorCWhvb2sgdGhhdCBjYW4gZGVjaWRlIHdoZXRoZXIgdG8gc3RlcCBvdmVyIHRoZSBuZXh0IGJyZWFrcG9pbnQuCisJKiB1dGlscy5jICh3cmFwX2hlcmUpOiBBYm9ydCBpZiB3cmFwX2J1ZmZlciBub3QgYWxsb2NhdGVkLgorCShyZXF1ZXN0X3F1aXQpIFtSRVFVRVNUX1FVSVRdOiBJZiBkZWZpbmVkLCBjYWxsIGl0IGluc3RlYWQgb2YKKwlkb2luZyBub3JtYWwgcXVpdC4KKworCSogY29uZmlndXJlLmluOiBJbXByb3ZlIHNvcnRpbmcvZm9ybWF0dGluZyBvZiBob3N0cyBhbmQgdGFyZ2V0cy4KKwkoaVszNF04Ni0qLW1hY2gzKiwgaVszNF04Ni0qLW9zZjFtayosIG1pcHMtKi1tYWNoMyosCisJbTg4Ki0qLW1hY2gzKiwgbnMzMmstKi1tYWNoMyopOiBSZWNvZ25pemUuCisJKiBNYWtlZmlsZS5pbiAoc3RvcC1nZGIpOiBOZXcgdGFyZ2V0LgorCSogc3RvcC1nZGIuYzogTmV3IGZpbGUsIHV0aWxpdHkgdG8gZ2V0IGF0dGVudGlvbiBvZiB3YWl0aW5nIEdEQnMKKwlpbiBNYWNoIDMuCisKK1dlZCBKdW4gMTUgMDA6NDE6MDMgMTk5NCAgVG9tIExvcmQgIChsb3JkQHJ0bC5jeWdudXMuY29tKQorCisJKiB0b3AuYyAoZ2RiX2luaXQpOiBJbml0IGN1cnJlbnRfZGlyZWN0b3J5IGluIGdkYl9pbml0LiAgUHJvYmFibHkKKwl0aGUgaWRlbnRpY2FsIGluaXRpYWxpemF0aW9uIGNhbiBiZSBkZWxldGVkIGZyb20gbWFpbi5jLCBidXQgaQorCWhhdmVuJ3QgZG9uZSBzbyBqdXN0IGluIGNhc2UuCisKK1R1ZSBKdW4gMTQgMTc6MjQ6NDEgMTk5NCAgVG9tIExvcmQgIChsb3JkQHgxLmN5Z251cy5jb20pCisKKwkqIGdkYmEuZWw6IEFkZGVkIG1lbnUgd2luZG93cyBhbmQgc2xpZ2h0bHkgaW1wcm92ZWQgd2luZG93CisJaGFuZGxpbmcgdG8gZ2RiYS5lbC4gIEZpeGVkIG51bWVyb3VzIG1pbm9yIGJ1Z3MgdGhhdCB3ZXJlIGNhdXNpbmcKKwllbWFjcyBhbmQgZ2RiIHRvIGZhbGwgb3V0IG9mIHN5bmMuCisKK1R1ZSBKdW4gMTQgMTY6MTg6NDQgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jOiBhbm5vdGF0ZSBjaGFuZ2VzIGxvc3QgYXQgbWVyZ2UsIHB1dCBiYWNrIGluLgorCitNb24gSnVuIDEzIDE3OjI4OjUwIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2kzODYvaTM4NnNjby5taCwgaTM4NnNjbzQubWggKFhERVBGSUxFUyk6IFJlbW92ZQorCWkzODctdGRlcC5vLgorCitTdW4gSnVuIDEyIDAzOjUxOjUyIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY29uZmlnL202OGsvZHB4Mi5taCAoTkFUREVQRklMRVMpOiAgUmVtb3ZlIGR1cGxpY2F0ZSBpbmNsdXNpb24KKwlvZiBpbmZ0YXJnLm8uCisJKiBjb25maWcvbTY4ay90bS1kcHgyLmggKENBTk5PVF9TVE9SRV9SRUdJU1RFUik6ICBEZWZpbmUgdG8gaW5oaWJpdAorCXdyaXRpbmcgb2YgZmxvYXRpbmcgcmVnaXN0ZXJzLCB0aGUgZHB4MiBrZXJuZWwgZGlzYWxsb3dzIGl0LgorCSogaXJpeDUtbmF0LmMgKExNX0FERFIpOiAgVGhlIGxvYWRlZCBhZGRyZXNzIG9mIHRoZSBzaGFyZWQgbGlicmFyeQorCWlzIGNvbnRhaW5lZCBpbiBvX3ByYXcuCisJKiBpcml4NS1uYXQuYyAoc29saWJfbWFwX3NlY3Rpb25zKTogIEFkanVzdCBzZWN0aW9ucyBieSB0aGUKKwlkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGxvYWRlZCBhZGRyZXNzIGFuZCB0aGUgcHJlbGlua2VkIGFkZHJlc3MuCisJKiBpcml4NS1uYXQuYyAoc29saWJfYWRkcmVzcyk6ICBVc2UgTE1fQUREUiBmb3IgdGhlIGxvYWRlZCBzdGFydAorCWFkZHJlc3MuCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3N5bWJvbCk6ICBEbyBub3QgcmVsb2NhdGUgc3RFbmQvc2NUZXh0CisJc3ltYm9scywgdGhlaXIgdmFsdWUgaXMgYWJzb2x1dGUuCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6ICBIYW5kbGUgSXJpeCA1LjIgc2hhcmVkCisJbGlicmFyaWVzIGZoLT5hZHIgZmllbGRzIG9mIHplcm8uIFJlbG9jYXRlIG1pbmltYWwgc3ltYm9sIHZhbHVlcworCXVwb24gcmVhZGluLiBSZWxvY2F0ZSBub24tc3RhYnMgc3ltYm9scyB1cG9uIHJlYWRpbi4KKwkqIG1kZWJ1Z3JlYWQuYyAocHN5bXRhYl90b19zeW10YWJfMSk6ICBVc2UgcHN0LT50ZXh0bG93IGZvciB0aGUKKwlzdGFydCBhZGRyZXNzIG9mIHRoZSBvdXRlcm1vc3QgYmxvY2suCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX2xpbmVzLCBwYXJzZV9wcm9jZWR1cmUpOiAgUGFzcyBpbiBwc3QKKwlpbnN0ZWFkIG9mIHNlY3Rpb25fb2Zmc2V0cyBhbmQgdXNlIHJlbG9jYXRlZCBwc3QtPnRleHRsb3cgZm9yCisJbGluZSBudW1iZXIgYW5kIHByb2NlZHVyZSBhZGRyZXNzIHJlbG9jYXRpb25zLgorCisJRnJvbSBnbW9ATWljcm9Vbml0eS5jb20gKEd1aWxsZXJtbyBBLiBMb3lvbGEpOgorCSogbWRlYnVncmVhZC5jIChwYXJzZV9zeW1ib2wsIHBhcnNlX3BhcnRpYWxfc3ltYm9scywgY3Jvc3NfcmVmKToKKwlIYW5kbGUgU0dJIElyaXg1IHN0SW5kaXJlY3Qgc3ltYm9sIHR5cGUuCisKK0ZyaSBKdW4gMTAgMTQ6NTI6NTYgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jOiBmaXggYSBzeW50YXggZXJyb3IgbmF0aXZlIGNjIGRvZXMgbm90IGxpa2UuCisKKwkqIE1ha2VmaWxlLmluOiBjaGFuZ2Ugc3BhcmNsaXRlLXRkZXAuYyB0byBzcGFyY2wtdGRlcC5jLgorCSogc3BhcmNsaXRlL01ha2VmaWxlLmluOiBkaXR0by4KKwkqIHNwYXJjbC10ZHBlLmM6IGNoYW5nZSBmaWxlIG5hbWUgYmVjYXVzZSBmaXJzdCA4IGNoYXJzIGhhcyB0byBiZSAKKwl1bmlxdWUuCisJKiBzcGFyY2wtc3R1Yi5jOiBkaXR0by4KKworCSogc3BhcmNsaXRlL01ha2VmaWxlLmluOiBmaXggSU5DTFVERV9DRkxBR1MgdG8gaGF2ZSB7c3JjZGlyfS8uLi9jb25maWcuCisKK0ZyaSBKdW4gMTAgMTA6Mzg6MTUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGEtdGRlcC5jICh0YXJnZXRfcmVhZF9wYywgdGFyZ2V0X3dyaXRlX3BjKTogQWNjZXB0IChhbmQKKwlpZ25vcmUpIGEgUElEIGFyZ3VtZW50LgorCShocHBhX3BvcF9mcmFtZSk6IFBhc3MgYSBQSUQgdG8gdGFyZ2V0X3dyaXRlX3BjLgorCSogY29uZmlnL3BhL3RtLWhwcGEuaCAoVEFSR0VUX1JFQURfUEMsIFRBUkdFVF9XUklURV9QQyk6IEFjY2VwdAorCWFuZCBwYXNzIHRocm91Z2ggYSBQSUQgYXJndW1lbnQuCisJKHRhcmdldF9yZWFkX3BjLCB0YXJnZXRfd3JpdGVfcGMpOiBVcGRhdGUgcHJvdG90eXBlcy4KKworVGh1IEp1biAgOSAxODoxMDo0NCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkIG5ldyBmaWxlIHNwYXJjbGl0ZS10ZGVwLmMuCisJKiBzcGFyY2xpdGUvTWFrZWZpbGUuaW46IGFkZCBuZXcgZmlsZSBzcGFyY2xpdGUtc3R1Yi5jLgorCSogc3BhcmNsaXRlL2h3X2JyZWFrcG9pbnQubm90ZTogbm90ZSBmb3IgU1BBUkNsaXRlIGhhcmR3YXJlIGJyZWFwb2ludAorCXN1cHBvcnQuCisJKiBjb25maWcvc3BhcmMvc3BhcmNsaXRlLm10OiBhZGQgc3BhcmNsaXRlLXRkZXAuby4KKwkqIGNvbmZpZy9zcGFyYy90bS1zcGFyY2xpdGUuaDogYWRkIGhhcmR3YXJlIGJyZWFrcG9pbnRzIHN1cHBvcnQgCisJZGVmaWluZXMgYW5kIGNvZGUuCisJKiBzcGFyY2xpdGUtdGRlcC5jOiBuZXcgZmlsZSwgY29udGFpbnMgaGFyZHdhcmUgYnJlYWtwb2ludCBzdXBwb3J0CisJY29kZS4KKwkqIHNwYXJjbGl0ZS1zdHViLmM6IG5ldyBmaWxlLCBzdHViIGNvZGUgdGhhdCBhZGQgc3VwcG9ydCBoYXJkd2FyZQorCWJyZWFrcG9pbnQgc3VwcG9ydC4KKwkqIGJyZWFrcG9pbnQuYzogYWRkIGhhcmR3YXJlIGJyZWFrcG9pbnQgc3VwcG9ydC4KKwkqIGJyZWFrcG9pbnQuaDogYWRkIG5ldyBicmVha3BvaW50IHR5cGUgdG8gc3VwcG9ydCBoYXJkd2FyZQorCWJyZWFrcG9pbnQuCisJKiBjb25maWcvbWlwcy9ubS1pcml4NC5oOiBjaGFuZ2UgaW50ZXJmYWNlIGZvciB0YXJnZXQgZGVwZW5kZW50CisJY29kZSBzdXBwb3J0aW5nIHdhdGNoIHBvaW50LgorCSogY29uZmlnL3BhL25tLWhwcGFiLmg6IGNoYW5nZSBpbnRlcmZhY2UgZm9yIHRhcmdldCBkZXBlbmRlbnQKKwljb2RlIHN1cHBvcnRpbmcgd2F0Y2ggcG9pbnQuCisKK1RodSBKdW4gIDkgMTQ6NTk6NTggMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLW9zOWsuYyAocm9tYnVmX2NvbW1hbmQpOiBmaXggYSBidWcgYWNjZXB0aW5nIHJvbWJ1ZworCW91dHB1dC4KKwkqIHN0YWJzcmVhZC5jIChyZWFkX3N0cnVjdF9maWVsZHMpOiBvczlrIG5lc3RlZCBzdHJ1Y3R1cmUgZG9lcyBub3QKKwloYXZlIHRlcm1pbmF0aW5nICc7JywgaW5zdGVhZCBpdCBqdXN0IGdldCB0byAnLCcgYW5kIGJpdCBwb3NpdGlvbgorCWFuZCBsZW5ndGguCisKK1dlZCBKdW4gIDggMjM6MjA6NDUgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogbmxtcmVhZC5jIChubG1fc3ltdGFiX3JlYWQpOiAgQ2xlYW4gdXAgYSBiaXQuCisJKiAobmxtX3N5bWZpbGVfcmVhZCk6ICBSZWNvcmQgYm91bmRzIG9mIG1haW4oKSBzbyB0aGF0IGJhY2t0cmFjZQorCWNvbW1hbmQgd2lsbCBrbm93IHdoZXJlIHRvIHN0b3AuCisJKiBvYmpmaWxlcy5jIChvYmpmaWxlX3JlbG9jYXRlKTogIFJlbG9jYXRlIGVudHJ5IHBvaW50L2Z1bmMgaW5mbworCWZvciBiYWNrdHJhY2UgYXMgd2VsbC4KKwkqIG9iamZpbGVzLmg6ICBEZWZpbmUgdmFsdWVzIGZvciBpbnZhbGlkIFBDcyBmb3IgZW50cnkgcG9pbnQgaW5mby4KKwkqIHN5bWZpbGUuYyAoaW5pdF9lbnRyeV9wb2ludF9pbmZvKTogIEluaXRpYWxpemUgaW52YWxpZCB2YWx1ZXMKKwl3aXRoIGFmb3JlbWVudGlvbmVkIG1hY3Jvcy4KKwkqIGNvbmZpZy9hbHBoYS90bS1hbHBoYW53Lmg6ICBUdXJuIG9uIEZSQU1FX0NIQUlOX1ZBTElEX0FMVEVSTkFURQorCXRvIGNhdXNlIGJhY2t0cmFjZSB0byBzdG9wIHdoZW4gaXQgZ2V0cyBiYWNrIHRvIG1haW4oKS4KKwkqIGNvbmZpZy9pMzg2L3RtLWkzODZudy5oOiAgRGl0dG8uCisKK1NhdCBKdW4gIDQgMTg6MTc6MDMgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwlGaXggdmFsdWVfcHJpbnQsIHdoaWNoIHVzZWQgdG8gYmUgb3N0ZW5zaWJseSBsYW5ndWFnZS1pbmRlcGVuZGVudCwKKwlidXQgd291bGQgcHJpbnQgcG9pbnRlcnMgYW5kIGFycmF5cyBpbiBDIHN5bnRheC4gIEluc3RlYWQsIGNhbGwKKwlhIGxhbmd1YWdlLXNwZWNpZmljIGZ1bmN0aW9uLgorCSogbGFuZ3VhZ2UuaCAoc3RydWN0IGxhbmd1YWdlX2RlZm4pOiAgTmV3IGZ1bmN0aW9uYWwgZmllbGQKKwlsYV92YWx1ZV9wcmludC4KKwkoTEFfVkFMVUVfUFJJTlQpOiAgTmV3IG1hY3JvLgorCSogbGFuZ3VhZ2UuYyAodW5rX2xhbmdfdmFsdWVfcHJpbnQpOiAgTmV3IHN0dWIvZHVtbXkgZnVuY3Rpb24uCisJKHVua25vd25fbGFuZ3VhZ2VfZGVmbiwgYXV0b19sYW5ndWFnZV9kZWZuLCBsb2NhbF9sYW5ndWFnZV9kZWZuKToKKwlVc2UgaXQuCisJKiBjLXZhbHByaW50LmMgKGNfdmFsdWVfcHJpbnQpOiAgTmV3IGZ1bmN0aW9uLCB3aXRoIGNvZGUgbW92ZWQgZnJvbToKKwkqIHZhbHByaW50LmMgKHZhbHVlX3ByaW50KTogIC4uLiBoZXJlLiAgTm93IGp1c3QgaW52b2tlCisJTEFfVkFMVUVfUFJJTlQgdG8gZG8gbGFuZ3VhZ2Utc3BlY2lmaWMgc3R1ZmYuCisJKiB2YWxwcmludC5jICh2YWx1ZV9wcmludF9hcnJheV9lbGVtZW50cyk6ICBNYWtlIG5vbi1zdGF0aWMuCisJKiBjLWxhbmcuYyAoY19sYW5ndWFnZV9kZWZuLCBjcGx1c19sYW5ndWFnZV9kZWZuKTogIEFkZAorCWNfdmFsdWVfcHJpbnQgaW4gdGhlIGxhX3ZhbHVlX3ByaW50IGZpZWxkLgorCSogbTItbGFuZy5jIChtMl9sYW5ndWFnZV9kZWZuKTogIExpa2V3aXNlLgorCSogY2gtbGFuZy5jIChjaGlsbF9sYW5ndWFnZV9kZWZuKTogIEJ1dCBoZXJlIHVzZSBjaGlsbF92YWx1ZV9wcmludC4KKwkqIGNoLXZhbHByaW50LmMgKGNoaWxsX3ZhbF9wcmludCk6ICBQcmludCBudWxsIHBvaW50ZXIgYXMgTlVMTC4KKwkqIGNoLXZhbHByaW50LmMgKGNoaWxsX3ZhbHVlX3ByaW50KTogIE5ldyBmdW5jdGlvbiwgYmFzZWQgb24KKwljX3ZhbHVlX3ByaW50LCBidXQgdXNlIENoaWxsICJsb29rIGFuZCBmZWVsLiIKKwkqIGMtbGFuZy5oIChjX3ZhbHVlX3ByaW50KTogIE5ldyBwcm90b3R5cGUuCisJKiBjaC1sYW5nLmggKGNoaWxsX3ZhbHVlX3ByaW50KTogIE5ldyBwcm90b3R5cGUuCisJKiB2YWx1ZS5oICh2YWx1ZV9wcmludF9hcnJheV9lbGVtZW50cyk6ICBOZXcgcHJvdG90eXBlLgorCisJKiBjaC12YWxwcmludC5jIChjaGlsbF92YWxfcHJpbnQsIGNhc2UgVFlQRV9DT0RFX0JJVFNUUklORworCWFuZCBjYXNlIFRZUEVfQ09ERV9TRVQpOiAgQ2hlY2sgdGhhdCB0aGUgZWxlbWVudCB0eXBlIGlzbid0IGEgc3R1Yi4KKworRnJpIEp1biAgMyAwOToxNTowMCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbWFpbi5jOiBNb3ZlIGVudGlyZSBmaWxlIGV4Y2VwdCBmb3IgI2lmbmRlZiBNQUlOX09WRVJSSURFIGNvZGUKKwl0byBuZXcgZmlsZSB0b3AuYy4gIE1ha2UgdGhpbmdzIGV4dGVybiBpbnN0ZWFkIG9mIHN0YXRpYyBhbmQKKwlzaW1pbGFyIHJlYXJyYW5nZW1lbnRzIHRvIGRlYWwgd2l0aCB0aGlzLgorCSogdG9wLmg6IE5ldyBmaWxlLgorCSogdXRpbHMuYzogTW92ZSBmcHV0c191bmZpbHRlcmVkIHRvIG1haW4uYy4gIFJlbW92ZSAKKwlGUFVUU19VTkZJTFRFUkVEX09WRVJSSURFIGlmbmRlZi4KKwkqIE1ha2VmaWxlLmluOiBDaGFuZ2Ugc28gdGhhdCBnZGIgdXNlcyBtYWluLmMsIHV0aWxzLmMsIGFuZCB0b3AuYywKKwlhbmQgbGliZ2RiIHVzZXMgdXRpbHMuYyBhbmQgdG9wLmMuCisKK1RodSBKdW4gIDIgMjM6MTk6MTAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGEtdGRlcC5jIChza2lwX3RyYW1wb2xpbmVfY29kZSk6IEZpeCB0eXBvLgorCitUaHUgSnVuICAyIDE4OjA5OjU5IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQorCisJKiBjaC12YWxwcmludC5jIChjaGlsbF92YWxfcHJpbnRfYXJyYXlfZWxlbWVudHMpOiAgTmV3IGZ1bmN0aW9uLgorCUEgQ2hpbGwgdmVyc2lvbiBvZiB2YWxfcHJpbnRfYXJyYXlfZWxlbWVudHMsIGl0IHByaW50cyB0aGUKKwlhcnJheSBpbmRleCBsYWJlbHMsIGluIGFkZGl0aW9ucyBvdCB0aGUgYXJyYXkgZWxlbWVudCB2YWx1ZXMuCisJKGNoaWxsX3ZhbF9wcmludCk6ICBVc2UgdGhlIG5ldyBmdW5jdGlvbi4KKworVGh1IEp1biAgMiAwODo1MDowMCAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46ICBBZGQgbmxtIHN1YmRpciB0byBjb25maWdkaXJzIGZvciBhbHBoYS0qLW5ldHdhcmUKKwl0YXJnZXQuCisJKiBkZWZzLmggKGVudW0gbGFuZ3VhZ2UpOiAgQWRkIGxhbmd1YWdlX2FzbS4KKwkqIGZpbmR2YXIuYyAocmVhZF9yZWdpc3Rlcl9ieXRlcyByZWFkX3JlZ2lzdGVyX2dlbgorCXdyaXRlX3JlZ2lzdGVyX2J5dGVzIHJlYWRfcmVnaXN0ZXIgcmVhZF9yZWdpc3Rlcl9waWQKKwl3cml0ZV9yZWdpc3RlciB3cml0ZV9yZWdpc3Rlcl9waWQgc3VwcGx5X3JlZ2lzdGVyKTogIE1vdmUgbXVsdGktCisJdGhyZWFkIGhhbmRsaW5nIGRvd24gaW50byB0aGVzZSByb3V0aW5lcy4gIENyZWF0ZSBYWFhfcGlkIHJvdXRpbmVzCisJdGhhdCBhbGxvdyByZWdpc3RlciByZWZlcmVuY2VzIHRvIHNwZWNpZnkgdGhlIHBpZC4KKwkqIGZpbmR2YXIuYyBpbmZjbWQuYyAocmVhZF9wYyByZWFkX3BjX3BpZCB3cml0ZV9wYyB3cml0ZV9wY19waWQKKwlyZWFkX3NwIHdyaXRlX3NwIHJlYWRfZnAgd3JpdGVfZnApOiAgTW92ZSB0aGVzZSByb3V0aW5lcyBmcm9tCisJaW5mY21kIHRvIGZpbmR2YXIgdG8gY2VudHJhbGl6ZSB0aGUgd2hvbGUgbWVzcy4KKwkqIGkzODYtbmxtc3R1Yi5jOiAgUG9ydGFiaWxpdHkgZml4ZXMuCisJKiBpbmZwdHJhY2UuYyAoY2hpbGRfcmVzdW1lKTogIENvbmRpdGlvbmFsaXplIHRvIGFsbG93IG90aGVyIG5hdGl2ZXMKKwl0byBvdmVycmlkZSBpdC4gIFJlbW92ZSBQSURHRVQgZ3ViYmlzaCwgaXQncyBubyBsb25nZXIgbmVjZXNzYXJ5LgorCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogIFB1dCByZWdpc3RlcnNfY2hhbmdlZCgpIGJlZm9yZQorCXRhcmdldF93YWl0KCkgdG8gc3BlZWQgdXAgcmVtb3RlIGRlYnVnZ2luZy4KKwkqIFJlcGxhY2UgY29kZSB0aGF0IHJlYWRzIHJlZ2lzdGVycyBmcm9tIG90aGVyIHRocmVhZHMgd2l0aCBtdWNoCisJbmljZXIgbG9va2luZyBuZXcgZnVuY3Rpb24gY2FsbHMgKHNlZSBjaGFuZ2VzIHRvIGZpbmR2YXIuYykuCisJKiBEb24ndCBza2lwIHByb2xvZ3VlcyBpZiBkZWJ1Z2dpbmcgYXNzZW1ibHkgc291cmNlLgorCSogbHlueC1uYXQuYyAoY2hpbGRfcmVzdW1lKTogIEx5bnggbm93IG5lZWRzIGl0J3Mgb3duIHZlcnNpb24gb2YKKwljaGlsZF9yZXN1bWUgdG8gaGFuZGxlIG11bHRpLXRocmVhZCBkZWJ1Z2dpbmcgcHJvcGVybHkuCisJKiByZW1vdGUuYzogIEFkZCBPIHJlc3BvbnNlIHRvIGdldCBjb25zb2xlIG91dHB1dCBmcm9tIHRhcmdldC4KKwkqIChyZWFkY2hhcik6IEFkZCB0aW1lb3V0IHBhcmFtZXRlci4gIEhhbmRsZSBTRVJJQUxfRU9GIGFuZAorCVNFUklBTF9FUlJPUiBoZXJlIHRvIHNpbXBsaWZ5IGNhbGxlcnMuCisJKiBDaGFuZ2Ugc3RhdGljIHZhciB0aW1lb3V0IHRvIHJlbW90ZV90aW1lb3V0LgorCSogKGZyb21oZXgpOiAgUmVtb3ZlIHVubmVjZXNzYXJ5IHJldHVybiAtMSBhdCBlbmQgb2Ygcm91dGluZS4KKwkqIChyZW1vdGVfd2FpdCk6ICBUdXJuIHRoaXMgaW50byBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgQWRkCisJc3VwcG9ydCBmb3IgTyByZXNwb25zZS4KKwkqIChwdXRwa3QpOiAgUmVtb3ZlIHVubmVjZXNzYXJ5IGhhbmRsaW5nIG9mIFNFUklBTF9FT0YvRVJST1IuCisJKiAoZ2V0cGt0KTogIFNwbGl0IGdldHBrdCBpbnRvIHR3byBwYXJ0cy4gIHJlYWRfZnJhbWUgZGVhbHMgd2l0aAorCWFsbCBmb3JtYXR0aW5nIGlzc3VlcywgcnVuLWxlbmd0aCBlbmNvZGluZywgYW5kIGZyYW1pbmcuICBnZXRwa3QKKwlub3cgaGFuZGxlcyBlcnJvciByZWNvdmVyeSwgYW5kIGZyYW1lIGRldGVjdGlvbi4KKwkqIHNlci10Y3AuYyAodGNwX3JlYWRjaGFyKTogIEhhbmRsZSBFSU5UUiBmcm9tIHJlYWQoKS4KKwkqIHNlci11bml4LmMgKGhhcmR3aXJlX3Jhdyk6ICBTZXQgQ0xPQ0FMIHNvIHRoYXQgd2UgaWdub3JlIG1vZGVtCisJY29udHJvbC4gIChoYXJkd2lyZV9yZWFkY2hhcik6ICBIYW5kbGUgRUlOVFIgZnJvbSByZWFkKCkuCisJKiBzeW1maWxlLmMgKGRlZHVjZV9sYW5ndWFnZV9mcm9tX2ZpbGVuYW1lKTogIEFkZCBzdXBwb3J0IGZvciAucworCWZpbGVzLgorCSogY29uZmlnL25tLWx5bnguaDogIERlZmluZSBDSElMRF9XQUlUIHNvIHRoYXQgbHlueC1uYXQuYyBjYW4KKwlvdmVycmlkZSBpbmZwdHJhY2UncyBjaGlsZF93YWl0LgorCSogY29uZmlnL3JzNjAwMC9yczYwMDBseW54Lm1oOiAgVXNlIHhtLXJzNjAwMGx5LmggJiBubS1yczYwMDBseS5oCisJaW5zdGVhZCBvZiBYWFhseW54LmguCisJKiBjb25maWcvcnM2MDAwL3JzNjAwMGx5bngubXQ6ICBVc2UgdG0tcnM2MDAwbHkuaCBpbnN0ZWFkIG9mCisJdG0tcnM2MDAwbHlueC5oLgorCSogbmxtL2dkYnNlcnZlLmM6ICBQb3J0YWJpbGl0eSBmaXhlcy4KKworVHVlIE1heSAzMSAyMDozNTo0NCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaW5mdGFyZy5jIChjaGlsZF93YWl0KTogQ2FsbCBwcm9jX3dhaXQsIG5vdCB3YWl0LgorCShjaGlsZF9tb3Vybl9pbmZlcmlvcik6IENhbGwgcHJvY19yZW1vdmVfZm9yZWlnbi4KKwkqIG1haW4uYyAoZ2RiX2luaXQpOiBDYWxsIGluaXRfcHJvYy4KKwkqIG1haW4uYzogUHJvdmlkZSBkdW1teSB2ZXJzaW9ucyBvZiBpbml0X3Byb2MsIHByb2Nfd2FpdCwgYW5kCisJcHJvY19yZW1vdmVfZm9yZWlnbiBmb3IgdGhlIGdkYiBjYXNlICh0aGUgbGliZ2RiIGNhc2UgcHJvdmlkZXMgaXRzCisJb3duIHZlcnNpb25zIG9mIHRoZXNlIGZ1bmN0aW9ucykuCisJKiBNYWtlZmlsZS5pbiAobGliZ2RiLWZpbGVzKTogQWRkIGxpYnByb2MuYS4KKworV2VkIEp1biAgMSAxMTowODo1MiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwlIYXJkd2FyZSB3YXRjaHBvaW50cyBmb3IgTGludXgsIGZyb20gUmljayBTbGFka2V5CisJKGpyc0B3b3JsZC5zdGQuY29tKS4KKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcikgW0hBVkVfQ09OVElOVUFCTEVfV0FUQ0hQT0lOVF06IEFkZAorCW5ldyBoYXJkd2FyZSBicmVha3BvaW50IHJlY292ZXJ5IG1ldGhvZC4KKwkqIGkzODZ2LW5hdC5jIChpMzg2X2luc2VydF93YXRjaHBvaW50LAorCWkzODZfaW5zZXJ0X25vbmFsaWduZWRfd2F0Y2hwb2ludCwgaTM4Nl9yZW1vdmVfd2F0Y2hwb2ludCwKKwlpMzg2X3N0b3BwZWRfYnlfd2F0Y2hwb2ludCkgW1RBUkdFVF9DQU5fVVNFX0hBUldBUkVfV0FUQ0hQT0lOVF06CisJTmV3IGZ1bmN0aW9ucyB0byBzdXBwb3J0IHRoZSAzODYgaGFyZHdhcmUgZGVidWdnaW5nIHJlZ2lzdGVycy4KKwkqIGNvbmZpZy9pMzg2L25tLWxpbnV4LmggKFRBUkdFVF9DQU5fVVNFX0hBUkRXQVJFX1dBVENIUE9JTlQsCisJSEFWRV9DT05USU5VQUJMRV9XQVRDSFBPSU5ULCBTVE9QUEVEX0JZX1dBVENIUE9JTlQsCisJdGFyZ2V0X2luc2VydF93YXRjaHBvaW50LCB0YXJnZXRfcmVtb3ZlX3dhdGNocG9pbnQpOiBEZWZpbmUgdGhlc2UKKwltYWNyb3MgdG8gdXNlIHRoZSBoYXJkd2FyZSBkZWJ1Z2dpbmcgZnVuY3Rpb25zIGluIGkzODZ2LW5hdC5jLgorCitXZWQgTWF5IDI1IDE3OjA2OjE1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogUmVwbGFjZSBsaWJnZGIuYSB3aXRoIGxpYmdkYi1maWxlcy4gIE1ha2UgImFsbCIKKwlidWlsZCBpdC4KKworVGh1IE1heSAxOSAwOTo1NjoyMCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogdGFyZ2V0LmMsIHRhcmdldC5oOiBOZXcgdmFyaWFibGVzIHRhcmdldF9hY3Rpdml0eV9mdW5jdGlvbiBhbmQKKwl0YXJnZXRfYWN0aXZpdHlfZmQuCisJKiBpbmZsb3cuYywgaW5mZXJpb3IuaDogTmV3IGZ1bmN0aW9ucyBzZXRfc2lnaW9fdHJhcCBhbmQKKwljbGVhcl9zaWdpb190cmFwLgorCSogaW5mdGFyZy5jIChjaGlsZF93YWl0KSwgcHJvY2ZzLmMgKHdhaXRfZmQpOiBDYWxsIHRoZW0uCisKK1dlZCBNYXkgMTggMTM6MDE6NTUgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXNpbS5oIChzaW1fdmVyYm9zZSk6IERlbGV0ZS4KKwlEb2N1bWVudCBjYWxsYmFja3MgbmVlZGVkLgorCShzaW1fKik6IENoYW5nZSByZXN1bHQgdG8gdm9pZCB3aGVyZSB0aGVyZSBpc24ndCBvbmUuCisJKHNpbV9vcGVuKTogQ2xhcmlmeSBhcmd1bWVudCBhbmQgZXJyb3IgcmVzcG9uc2UuCisJKHNpbV9jbG9zZSk6IERlY2xhcmUuCisJKHNpbV9sb2FkKTogQ2hhbmdlIGJmZF9oYW5kbGUgYXJndW1lbnQgdG8gZmlsZSBuYW1lLiAgQ2xhcmlmeSByZXN1bHQuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBSZW5hbWVkIGZyb20gc2ltX3NldF9hcmdzLgorCShzaW1fc2V0X3BjKTogRGVsZXRlLgorCShzaW1faW5mbyk6IERlbGV0ZSBwcmludGZfZm4gYXJndW1lbnQuCisJKiByZW1vdGUtc2ltLmMgKGdkYnNpbV9raWxsKTogQWRkIGNvbW1lbnQgZGVzY3JpYmluZyBwdXJwb3NlLgorCShnZGJzaW1fbG9hZCk6IFRyeSBzaW1fbG9hZCBmaXJzdC4KKwkoZ2Ric2ltX2NyZWF0ZV9pbmZlcmlvcik6IENhbGwgc2ltX2NyZWF0ZV9pbmZlcmlvci4KKwkoZ2Ric2ltX29wZW4pOiBIYW5kbGUgYXJncyA9PSBOVUxMLiAgVXBkYXRlIGNhbGwgdG8gc2ltX29wZW4uCisJKGdkYnNpbV9jbG9zZSk6IENhbGwgc2ltX2Nsb3NlLgorCShnZGJzaW1fZmlsZXNfaW5mbyk6IFVwZGF0ZSBjYWxsIHRvIHNpbV9pbmZvLgorCShnZGJzaW1fb3BzKTogUmVhbGlnbiBjb21tZW50cy4KKworCSogcHJpbnRjbWQuYyAoZGVjb2RlX2Zvcm1hdCk6IEFsbG93IFRBUkdFVF9QVFJfQklUIHRvIGJlIG5vbi1jb25zdGFudC4KKworVHVlIE1heSAxNyAxNjo0NToyMCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIHhjb2ZmcmVhZC5jIChyZWFkX3hjb2ZmX3N5bXRhYik6IEZvciBDX0ZJTEUgc3ltYm9scywgb25seSB1c2UKKwl0aGUgYXV4ZW50IGlmIHRoZSBzeW1ib2wncyBuYW1lIGlzICIuZmlsZSIuICBGcm9tIERhdmlkIEVkZWxzb2huIAorCTxjMWRqZUB3YXRzb24uaWJtLmNvbT4uCisKK1R1ZSBNYXkgMTcgMTE6MDg6MjIgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGJyZWFrcG9pbnQuYyAoYnJlYWtwb2ludF8xKTogRml4IHR5cG8uCisKKwkqIGFubm90YXRlLmMgKGFubm90YXRlX2ZpZWxkX2VuZCk6IEZpeCB0eXBvLgorCisJKiBNYWtlZmlsZS5pbjogTW92ZSBhbm5vdGF0ZS5vIGZyb20gQ09NTU9OX09CUyB0byBPQlMuCisKKwkqIE1ha2VmaWxlLmluIChUU1NUQVJUKTogUmVtb3ZlOyBubyBsb25nZXIgdXNlZC4KKworCSogdXRpbHMuYyAodmZwcmludGZfbWF5YmVfZmlsdGVyZWQsIHZmcHJpbnRmX3VuZmlsdGVyZWQpOiBDYWxsCisJZnB1dHNfdW5maWx0ZXJlZCBhbmQgZXhpdCBkaXJlY3RseSwgcmF0aGVyIHRoYW4gZmF0YWwuICBUaGUgbGF0dGVyCisJY2FsbHMgdmZwcmludGZfdW5maWx0ZXJlZCEKKworCSogZ2RidHlwZXMuaCwgZ2RidHlwZXMuYyAoY2FuX2RlcmVmZXJlbmNlKTogTmV3IGZ1bmN0aW9uLgorCSogdmFsdWUuaCwgcHJpbnRjbWQuYyAocHJpbnRfdmFsdWVfZmxhZ3MpOiBNb3ZlIGZyb20gaGVyZS4uLgorCSogYW5ub3RhdGUuYzogLi4udG8gaGVyZSwgYW5kIG1ha2UgaXQgdXNlIGNhbl9kZXJlZmVyZW5jZS4KKworU2F0IE1heSAxNCAxNToxMzo1MiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGluZmxvdy5jIChqb2JfY29udHJvbCwgYXR0YWNoX2ZsYWcsIGdlbmVyaWNfbW91cm5faW5mZXJpb3IpOgorCVJlbW92ZSwgbmVlZGVkIGZvciBib3RoIG5hdGl2ZSBhbmQgY3Jvc3MuCisJKiB0YXJnZXQuYyAoYXR0YWNoX2ZsYWcsIGdlbmVyaWNfbW91cm5faW5mZXJpb3IpOiBQdXQgaGVyZS4KKwkqIHV0aWxzLmMgKGpvYl9jb250cm9sKTogUHV0IGhlcmUuCisJKHRlcm1pbmFsLmgpOiBEb24ndCBpbmNsdWRlIGFueW1vcmUuCisKK1NhdCBNYXkgMTQgMDk6MTE6NDQgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHNvdXJjZS5jIChmaW5kX3NvdXJjZV9saW5lcyk6IEFsd2F5cyB1c2UgY29kZSB0aGF0IHdhcyAjaWZkZWYKKwlCUk9LRU5fTEFSR0VfQUxMT0NBLiAgRG8gdGhlIGNsZWFudXAgYmVmb3JlIHJldHVybmluZywgcmF0aGVyIHRoYW4KKwlsZWF2aW5nIGl0IG9uIHRoZSBjaGFpbi4gIFJlaW5kZW50IG11Y2ggb2YgdGhpcyBmdW5jdGlvbi4KKwkqIGNvbmZpZy9zcGFyYy97eG0tc3VuNHNvbDIuaCx4bS1zdW40b3M0Lmh9LAorCWNvbmZpZy9pMzg2L3t4bS1zdW4zODYuaCx4bS1pMzg2bTMuaCx4bS1pMzg2bWFjaC5ofSwKKwljb25maWcvbTY4ay97c3VuM29zNC5oLHhtLW5ld3MuaCx4bS1ocDMwMGhwdXguaH0sCisJY29uZmlnL25zMzJrL3htLW5zMzJrbTMuaDogUmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvCisJQlJPS0VOX0xBUkdFX0FMTE9DQTsgd2l0aCB0aGUgYWJvdmUgY2hhbmdlIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCisJKiBtYWluLmMsIGZvcmstY2hpbGQuYywgbWFueSBjb25maWcgZmlsZXM6IFJlbW92ZSBhbGwKKwlTRVRfU1RBQ0tfTElNSVRfSFVHRSBjb2RlOyB3aXRoIHRoZSBhYm92ZSBjaGFuZ2VzIGl0IHNob3VsZCBubworCWxvbmdlciBiZSBuZWVkZWQuCisKKwkqIHN5bXRhYi5jIChsb29rdXBfcGFydGlhbF9zeW1ib2wpOiBVc2UgaWYgYW5kIGFib3J0LCBub3QgYXNzZXJ0LgorCVRoaXMgYXZvaWRzIF9fZXByaW50ZiB0cm91Ymxlcy4KKworRnJpIE1heSAxMyAwODoxMDoyMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbWFpbi5jIChtYWluKTogU3Vycm91bmQgaW4gI2lmbmRlZiBNQUlOX09WRVJSSURFLiAgTW92ZQorCWluaXRpYWxpemF0aW9uIGNvZGUgd2hpY2ggbmVlZHMgdG8gYmUgY2FsbGVkIGV2ZW4gaWYgd2UgYnlwYXNzIHRoZQorCWNvbW1hbmQgbGluZSBzdHVmZiBpbnRvIGdkYl9pbml0LgorCSogdXRpbHMuYyAoZnB1dHNfdW5maWx0ZXJlZCk6IFN1cnJvdW5kIGluICNpZm5kZWYKKwlGUFVUU19VTkZJTFRFUkVEX09WRVJSSURFLgorCSogTWFrZWZpbGUuaW4gKGxpYmdkYi5hKTogTmV3IHRhcmdldC4KKworCSogdXRpbHMuYzogUmVhcnJhbmdlIEkvTyBzdHVmZiBhIGJpdCBzbyB0aGF0IGFsbCBvdXRwdXQgZ29lcworCXRocm91Z2ggZnB1dHNfdW5maWx0ZXJlZC4gIFVzZSB2YXNwcmludGY7IHJlbW92ZXMgYXJiaXRyYXJ5IGxpbWl0CisJd2hpY2ggbWFkZSAlcyBub3Qgd29yayB3aXRoIGFyYml0cmFyaWx5IGxhcmdlIHN0cmluZ3MuCisJKiBwcmludGNtZC5jIChwcmludGZfY29tbWFuZCk6IFVzZSBwcmludGZfZmlsdGVyZWQsIG5vdAorCXByaW50Zl91bmZpbHRlcmVkIGFuZCBwcmludGYsIG5vdyB0aGF0IGFyYml0cmFyeSBsaW1pdCBpcyBnb25lLgorCisJZ2NjIC1XYWxsIGxpbnQ6CisJKiBicmVha3BvaW50LmMgKHdhdGNocG9pbnRfY2hlY2spOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGIuCisJKiBzdGFjay5jIChwcmludF9mcmFtZV9pbmZvKTogTW92ZSBzcCBhbmQgYnVmIGluc2lkZSAjaWYuCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIHBwLAorCW1hbmdsZV9wdHIsIHB0ciwgYW5kIG1hbmdsZV90c3RyLgorCSogdmFsYXJpdGguYyAodmFsdWVfeF9iaW5vcCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIG1hbmdsZV90c3RyCisJYW5kIG1hbmdsZV9wdHIuCisJKiBzeW10YWIuYyAobG9va3VwX3N5bXRhYik6IFB1dCB2YXJpYWJsZSBjb3B5IGluc2lkZSAjaWYuCisJKGRlY29kZV9saW5lXzEpOiBQdXQgdmFyaWFibGUgcTEgaW5zaWRlICNpZiAwLgorCSogdGFyZ2V0Lmg6IERlY2xhcmUgdGFyZ2V0X2xpbmsuCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcyBzaWduYW1lLgorCSogcmVtb3RlLmMgKHJlbW90ZV9yZXN1bWUpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIG5hbWUuCisJKiBjLWV4cC55IChwYXJzZV9udW1iZXIpOiBQYXJlbnRoZXNpemUgb3BlcmFuZCBvZiBzaGlmdC4KKwkqIGRieHJlYWQuYyAocmVjb3JkX21pbmltYWxfc3ltYm9sKTogUGFyZW50aGVzaXplIG9wZXJhbmQgb2YgJiYKKwkodGhpcyBpcyBhIHNlbWFudGljIGNoYW5nZSwgdGhlIHdhcm5pbmcgc2VlbXMgdG8gaGF2ZSBkZXRlY3RlZCBhIGJ1ZykuCisJKiBkYnhyZWFkLmMgKGVuZF9wc3ltdGFiKTogTW92ZSB2YXJpYWJsZSBwMSBpbnNpZGUgI2lmLgorCSogY29mZnJlYWQuYzogTW92ZSB2YXJpYWJsZSB0ZW1wdHlwZSBpbnNpZGUgI2lmLgorCSogY2gtdHlwZXByaW50LmMgKGNoaWxsX3R5cGVfcHJpbnRfYmFzZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKwluYW1lLgorCSogY2gtdmFscHJpbnQuYzogI2luY2x1ZGUgdHlwZXByaW50LmggYW5kIGNoLWxhbmcuaC4KKwkoY2hpbGxfdmFsX3ByaW50KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBpbl9yYW5nZS4KKwkoY2hpbGxfdmFsX3ByaW50KTogUmVtb3ZlIHN0YXRlbWVudCAibGVuZ3RoID4gVFlQRV9MRU5HVEggKHR5cGUpOyIuCisJKGNoaWxsX3ZhbF9wcmludCk6IEFkZCBkZWZhdWx0IGNhc2UgZm9yIHN3aXRjaC4KKwkqIHN0YWJzcmVhZC5oOiBEZWNsYXJlIHN0YWJzZWN0X2J1aWxkX3BzeW10YWJzLgorCSogb3M5a3JlYWQuYyAocmVhZF9taW5pbWFsX3N5bWJvbHMpOiBNYWtlIHRoaXMgcmV0dXJuIHZvaWQuCisJKG9zOWtfc3ltZmlsZV9yZWFkKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMgc3RiX2V4aXN0IGFuZCB2YWwuCisJKG9zOWtfc3ltZmlsZV9pbml0KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSB2YWwuCisJKGZpbGxfc3ltKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBpZC4KKwkocmVhZF9vczlrX3BzeW10YWIpOiBQdXQgdmFyaWFibGUgYmFja190byBpbnNpZGUgI2lmIDAuICBSZW1vdmUKKwl1bnVzZWQgdmFyaWFibGUgbnNsLgorCVJlbW92ZSB1bnVzZWQgdmFyaWFibGUgc3ltZmlsZV9iZmQuCisJI2lmIDAgdW51c2VkIHZhcmlhYmxlcyBsYnJhY191bm1hdGNoZWRfY29tcGxhaW50IGFuZAorCWxicmFjX21pc21hdGNoX2NvbXBsYWludC4KKwlSZW1vdmUgZGVjbGFyYXRpb24gZm9yIG5vbi1leGlzdGVudCBmdW5jdGlvbiBvczlrX25leHRfc3ltYm9sX3RleHQuCisKKwkqIGFubm90YXRlLmMsIGFubm90YXRlLmg6IE5ldyBmaWxlcywgY29udGFpbmluZyBhIGZ1bmN0aW9uIGZvcgorCWVhY2ggYW5ub3RhdGlvbiB3aGljaCBvdXRwdXRzIGl0LgorCSogTW92ZSBicmVha3BvaW50c19jaGFuZ2VkIGZyb20gYnJlYWtwb2ludC5jIHRvIGFubm90YXRlLmMuCisJKiBicmVha3BvaW50LmMsIGJsb2NrZnJhbWUuYywgaW5mcnVuLmMsIGNwLXZhbHByaW50LmMsIG1haW4uYywKKwlwcmludGNtZC5jLCBzb3VyY2UuYywgc3RhY2suYywgdXRpbHMuYywgdmFscHJpbnQuYzoKKwlVc2UgYW5ub3RhdGUuYyBmdW5jdGlvbnMgdG8gb3V0cHV0IGFubm90YXRpb25zLgorCSogTWFrZWZpbGUuaW4gKE9CUyk6IEFkZCBhbm5vdGF0ZS5vLgorCitUaHUgTWF5IDEyIDEwOjQ2OjI3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBocHBhLXRkZXAuYyAocmVhZF91bndpbmRfaW5mbyk6IE1ha2Ugc3VyZSBlbGZfdW53aW5kX3NpemUgYW5kCisJZWxmX3Vud2luZF9lbnRyaWVzIGFyZSBhbHdheXMgaW5pdGlhbGl6ZWQuCisKKwkqIGhwcGEtdGRlcC5jIChza2lwX3RyYW1wb2xpbmVfY29kZSk6IEhhbmRsZSBhcmd1bWVudCByZWxvY2F0aW9uCisJc3R1YnMgd2hpY2ggcmV0dXJuIGRpcmVjdGx5IHRvIHRoZSBjYWxsZXIgcmF0aGVyIHRoYW4gdG8gdGhlIHN0dWIKKwlpdHNlbGYuCisKK1dlZCBNYXkgMTEgMjA6MTE6NTEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBjLWV4cC55ICh5eWVycm9yKTogRGlzcGxheSBhIG1vcmUgaW5mb3JtYXRpdmUgZXJyb3IgbWVzc2FnZS4KKwkqIGNoLWV4cC55ICh5eWVycm9yKTogRGl0dG8sIGRvbid0IHVzZSBnbG9iYWwgeXljaGFyLgorCSogbTItZXhwLnkgKHl5ZXJyb3IpOiBEaXR0by4KKworVHVlIE1heSAxMCAxMTo1Nzo1MyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGluZmxvdy5jIChqb2JfY29udHJvbCk6IE1vdmUgZGVmaW5pdGlvbiB0byBmcm9udCBvZiBmaWxlLgorCitUdWUgTWF5IDEwIDE0OjQyOjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogbWFpbnQuYyAocHJpbnRfc2VjdGlvbl90YWJsZSk6IFJlbmFtZSBTRUNfU0hBUkVEX0xJQlJBUlkgdG8KKwlTRUNfQ09GRl9TSEFSRURfTElCUkFSWSB0byBtYXRjaCBjb3JyZXNwb25kaW5nIGNoYW5nZSBpbiBiZmQuCisKK0ZyaSBNYXkgIDYgMTM6MzA6MjIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoa2RiKTogUmVtb3ZlIG9sZCBpbml0LmMgY3JlYXRpb24gY29tbWFuZHMuCisJKiBjb25maWd1cmUuaW4gKHNwYXJjbGl0ZSk6IE1hdGNoIG9uIHNwYXJjbGl0ZSouCisJKiBzcGFyY2xpdGUvYWxvYWQuYyAobWFpbik6IE9ubHkgY2hhbmdlIHNlY3Rpb24gYWRkcmVzc2VzIGZvcgorCWEub3V0IGZvcm1hdCBvYmplY3QgZmlsZXMuCisKK0ZyaSBNYXkgIDYgMTM6MjQ6MDQgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2kzODYvZ28zMi5taDogRGVmaW5lIENDLgorCitGcmkgTWF5ICA2IDExOjU2OjU0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogZ2Ric2VydmVyL01ha2VmaWxlLmluOiBSZW1vdmUgaXJyZWxldmFudCBkZWZpbml0aW9ucyBhbmQKKwljb21tZW50cyBpbmhlcml0ZWQgZnJvbSB0aGUgZ2RiIE1ha2VmaWxlLgorCShCRkRfRElSLCBCRkQsIEJGRF9TUkMsIEJGRF9DRkxBR1MpOiBBZGQgZnJvbSBnZGIgTWFrZWZpbGUuCisJKFZFUlNJT04pOiBVcGRhdGUgdG8gNC4xMi4zLgorCShnZGJzZXJ2ZXIpOiBSZW1vdmUgYW55IGV4aXN0aW5nIGV4ZWN1dGFibGUgZmlyc3QuCisJKGRpc3RjbGVhbiwgcmVhbGNsZWFuKTogUmVtb3ZlIG5tLmguCisJKiBnZGJzZXJ2ZXIvbG93LWx5bnguYzogQWRkIFNwYXJjIEx5bnggc3VwcG9ydC4KKwkqIGdkYnNlcnZlci9sb3ctc3BhcmMuYywgZ2Ric2VydmVyL2xvdy1zdW4zLmMgKHN5cy93YWl0LmgpOgorCURvbid0IHVzZSBhYnNvbHV0ZSBwYXRobmFtZS4KKworVGh1IE1heSAgNSAxMjowMDoyMiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIHJzNjAwMC1uYXQuYyAodm1hcF9sZGluZm8pOiBEb24ndCBmYWlsIGlmIGZzdGF0IHJldHVybnMgYW4KKwllcnJvci4KKworV2VkIE1heSAgNCAwNjo1NjowMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaW5mcnVuLmMgKHByb2NlZWQsIG5vcm1hbF9zdG9wLCB3YWl0X2Zvcl9pbmZlcmlvciksIGJyZWFrcG9pbnQuYworCShwcmludF9pdF9ub3JtYWwpOiBBZGQgYW5ub3RhdGlvbnMgZm9yIHRoZSBpbmZlcmlvciBzdGFydGluZyBhbmQKKwlzdG9wcGluZywgYW5kIGZvciBhbGwgdGhlIHZhcmlvdXMgbWVzc2FnZXMgcmVsYXRlZCB0byBob3cgaXQKKwlzdG9wcGVkLgorCisJKiBwcmludGNtZC5jIChkb19vbmVfZGlzcGxheSk6IEFubm90YXRlLgorCSogc3RhY2suYyAocHJpbnRfZnJhbWVfaW5mbyk6IEFubm90YXRlIHByaW50aW5nIG9mIHN0YWNrIGZyYW1lcy4KKworV2VkIE1heSAgNCAxODoxNTo1MSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiByZW1vdGUuYyAoZ2V0X29mZnNldHMpOiAgSGFuZGxlIGNhc2Ugd2hlcmUgc3R1YiBkb2Vzbid0IHN1cHBvcnQKKwlxT2Zmc2V0cyBtZXNzYWdlLgorCitXZWQgTWF5ICA0IDE1OjMwOjM5IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQorCisJQWRkIHBhcnRpYWwgc3VwcG9ydCBmb3IgZysrIGNvZGUgY29tcGlsZWQgd2l0aCAtZnZ0YWJsZS10aHVua3MuCisJKiBjLXZhbHByaW50LmMgKGNfdmFsX3ByaW50KTogIEFkZCB2dGJscHJpbnQgc3VwcG9ydAorCXdoZW4gdXNpbmcgdGh1bmtzLgorCSogY3AtdmFscHJpbnQuYyAoY3BfaXNfdnRibF9tZW1iZXIpOiAgQSB2dGFibGUgY2FuIGJlIGFuIGFycmF5IG9mCisJcG9pbnRlcnMgKGlmIHVzaW5nIHRodW5rcykgYXMgd2VsbCBhcyBhcnJheSBvZiBzdHJ1Y3RzIChvdGhlcndpc2UpLgorCSogY3AtdmFscHJpbnQuYyAodnRibF9wdHJfbmFtZV9vbGQsIHZ0YmxfcHRyX25hbWUpOiAgTW92ZSB0byBnbG9iYWwKKwlsZXZlbCwgYW5kIG1ha2UgdGhlIGxhdHRlciBub24tc3RhdGljIChzbyBkZWZpbmVfc3ltYm9sIGNhbiB1c2UgaXQpLgorCSogc3RhYnNyZWFkLmMgKGRlZmluZV9zeW1ib2wpOiAgSWYgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZCBpcyBhCisJcG9pbnRlciB0eXBlIG5hbWVkICJfX3Z0YmxfcHRyX3R5cGUiLCBzZXQgdGhlIFRZUEVfTkFNRSB0byB0aGF0IG5hbWUuCisJKiBzeW10YWIuaCAoVlRCTF9QUkVGSVhfUCk6ICBBbGxvdyAiX1ZUIiBhcyB3ZWxsIGFzICJfdnQiLgorCSogdmFsdWVzLmMgKHZhbHVlX3ZpcnR1YWxfZm5fZmllbGQpOiAgSGFuZGxlIHRodW5rcy4KKwkqIHZhbHVlcy5jICh2YWx1ZV9oZWFkb2YpOiAgTWlub3IgZWZmaWNpZW5jeSBoYWNrLgorCSogdmFsdWVzLmMgKHZhbHVlX2hlYWRvZik6ICAgSW5jb21wbGV0ZSB0aHVuayBzdXBwb3J0LiAgRklYTUUuCisKK1dlZCBNYXkgIDQgMDY6NTY6MDMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHZhbHByaW50LmMgKHByaW50X2xvbmdlc3QpOiBDbGFyaWZ5IGNvbW1lbnQgYWJvdXQgdXNlX2xvY2FsLgorCSogcHJpbnRjbWQuYywgZGVmcy5oIChwcmludF9hZGRyZXNzX251bWVyaWMpLCBjYWxsZXJzIGluCisJc3ltbWlzYy5jLCBzeW1maWxlLmMsIHN0YWNrLmMsIHNvdXJjZS5jLCByZW1vdGUuYywgaW5mY21kLmMsCisJY3AtdmFscHJpbnQuYywgY29yZS5jLCBjaC12YWxwcmludC5jLCBjLXZhbHByaW50LmMsIGJyZWFrcG9pbnQuYywKKwlleGVjLmM6IE5ldyBhcmd1bWVudCB1c2VfbG9jYWwuCisJKiBzb3VyY2UuYyAoaWRlbnRpZnlfc291cmNlX2xpbmUpOiBVc2UgZmlsdGVyZWQgb3V0cHV0LiAgVXNlCisJcHJpbnRfYWRkcmVzc19udW1lcmljLiAKKworCSogY29yZS5jIChtZW1vcnlfZXJyb3IpLCBzeW10YWIuYyAoY3BsdXNwbHVzX2hpbnQsIGRlY29kZV9saW5lXzEpLAorCWxhbmd1YWdlLmMgKHR5cGVfZXJyb3IsIHJhbmdlX2Vycm9yKTogVXNlIGZpbHRlcmVkIG91dHB1dC4KKwkqIHV0aWxzLmMgKGVycm9yX2JlZ2luKTogVXBkYXRlIGNvbW1lbnQgdG8gdGVsbCBwZW9wbGUgdG8gdXNlCisJZmlsdGVyZWQgb3V0cHV0LgorCisJKiBNYWtlZmlsZS5pbiAoSEZJTEVTX1dJVEhfU1JDRElSKTogTGlzdCBiZmQuaC4KKwkoSEZJTEVTX05PX1NSQ0RJUik6IExpc3QgZ2RiY29yZS5oIG5vdCBnZGJjb3JlX2gsIHNvIGFzIG5vdCB0byBnZXQKKwliZmQuaC4KKworVHVlIE1heSAgMyAwNzo0MTozMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogcHJvY2ZzLmMgKHByb2Nmc193YWl0KTogUmVpbnN0YXRlIGNvZGUgd2hpY2ggZGVkdWNlcyB0aGUgc2lnbmFsCisJZnJvbSB0aGUgZmF1bHQsICNpZm5kZWYgRkFVTFRFRF9VU0VfU0lHSU5GTy4KKwkqIGNvbmZpZy9zcGFyYy90bS1zdW40c29sMi5oOiBEZWZpbmUgRkFVTFRFRF9VU0VfU0lHSU5GTy4KKworRnJpIEFwciAyOSAxODoxNTowNCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50XzEpOiBBbm5vdGF0ZSBlYWNoIGZpZWxkIG9mIHRoZSBoZWFkZXJzLgorCUV4cGxpY2l0bHkgYW5ub3RhdGUgZWFjaCByZWNvcmQuCisKK0ZyaSBBcHIgMjkgMTU6NTY6MTggMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiB4Y29mZmV4ZWMuYzogUmVmb3JtYXQgdG8gc3RhbmRhcmRzIGFuZCBsaW50LgorCShsYW5ndWFnZS5oKTogSW5jbHVkZS4KKwkoZXhlY19jbG9zZSk6IERlY2xhcmUgYXJnICJxdWl0dGluZyIuCisJKGZpbGVfY29tbWFuZCk6IERlY2xhcmUgYXJnICJmcm9tX3R0eSIuCisJKG1hcF92bWFwKTogQ2FzdCB4bWFsbG9jIHJlc3VsdCB0byBQVFIuCisJKiByczYwMDAtbmF0LmM6IFJlZm9ybWF0IHRvIHN0YW5kYXJkcyBhbmQgbGludC4KKwkoZXhlY19vbmVfZHVtbXlfaW5zbik6IFVzZSBjaGFyIGFycmF5IGZvciBzYXZlZCBpbnN0cnVjdGlvbi4KKwkoZml4dXBfYnJlYWtwb2ludHMpOiBEZWNsYXJlLgorCSh2bWFwX2xkaW5mbyk6IEJlIG1vcmUgaW5mb3JtYXRpdmUgaW4gZmF0YWwgZXJyb3IgbWVzc2FnZXMuCisJKHhjb2ZmX3JlbG9jYXRlX3N5bXRhYik6IERlZmluZSB0byByZXR1cm4gdm9pZC4KKwkqIHhjb2Zmc29saWIuaDogUmVmb3JtYXQgdG8gc3RhbmRhcmRzLCBpbXByb3ZlIGNvbW1lbnRzLgorCSogY29uZmlnL3JzNjAwMC9ubS1yczYwMDAuaCAoeGNvZmZfcmVsb2NhdGVfc3ltdGFiKTogRGVjbGFyZS4KKworVGh1IEFwciAyOCAwODo0MDo1NiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogdXRpbHMuYywgZGVmcy5oIChlcnJvcl9iZWdpbik6IE5ldyBmdW5jdGlvbi4KKwkocXVpdCk6IFByaW50IGFubm90YXRpb24gYmVmb3JlIHByaW50aW5nIHRoZSBlcnJvciBtZXNzYWdlLgorCSogbWFpbi5jIChyZXR1cm5fdG9fdG9wX2xldmVsKTogUHJpbnQgYW5ub3RhdGlvbiBiZWZvcmUgZG9pbmcgdGhlCisJbG9uZ2ptcC4KKwkqIHN5bXRhYi5jIChkZWNvZGVfbGluZV8xKTogQ2FsbCBlcnJvciBub3Qgd2FybmluZyBhbmQgdGhlbgorCXJldHVybl90b190b3BfbGV2ZWwuICBDYWxsIGVycm9yX2JlZ2luIGFuZCBwcmludGZfdW5maWx0ZXJlZAorCXJhdGhlciBjYWxsaW5nIHdhcm5pbmcgKGJlZm9yZSBjYWxscyB0byByZXR1cm5fdG9fdG9wX2xldmVsKS4KKwkqIGNvcmUuYyAobWVtb3J5X2Vycm9yKTogVXNlIGVycm9yX2JlZ2luLCBwcmludGZfdW5maWx0ZXJlZCwKKwlwcmludF9hZGRyZXNzX251bWVyaWMgYW5kIHJldHVybl90b190b3BfbGV2ZWwgaW5zdGVhZCBvZiBlcnJvci4KKwlDbGVhbnMgdXAgYSBGSVhNRS0zMng2NC4KKwkqIGxhbmd1YWdlLmMgKHR5cGVfZXJyb3IsIHJhbmdlX2Vycm9yKTogQ2FsbCBlcnJvcl9iZWdpbgorCW5vdCBqdXN0IHRhcmdldF90ZXJtaW5hbF9vdXJzLgorCisJKiBkYnhyZWFkLmMgKHN0YWJzZWN0X2J1aWxkX3BzeW10YWJzKTogQXNzaWduIHRvIHN5bV9zdGFiX2luZm8KKwlkaXJlY3RseSwgcmF0aGVyIHRoYW4gdmlhIERCWF9TWU1GSUxFX0lORk8uICBBIGNhc3Qgb24gdGhlIGxlZnQKKwlzaWRlIG9mIGFuIGFzc2lnbm1lbnQgaXMgbm9uLXBvcnRhYmxlLgorCisJKiB1dGlscy5jIChxdWVyeSk6IENoYW5nZSBzeW50YXggb2YgcXVlcnkgYW5ub3RhdGlvbnMgdG8gYmUKKwljb25zaXN0ZW50IHdpdGggb3RoZXIgaW5wdXQgYW5ub3RhdGlvbnMuCisJKHByb21wdF9mb3JfY29udGludWUpOiBMaWtld2lzZSBmb3IgcHJvbXB0LWZvci1jb250aW51ZSBhbm5vdGF0aW9uLgorCitUaHUgQXByIDI4IDAxOjIwOjM5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogbWRlYnVncmVhZC5jIChwc3ltdGFiX3RvX3N5bXRhYl8xKTogIERvIG5vdCBjYWxsIHNvcnRfYmxvY2tzCisJZm9yIHN0YWJzIHN5bXRhYnMuCisJKiBtaXBzLXRkZXAuYyAobWlwc19za2lwX3Byb2xvZ3VlKTogIEhhbmRsZSBwcm9sb2d1ZXMgZm9yIGZ1bmN0aW9ucworCXRoYXQgaGF2ZSBhIHN0YWNrIGZyYW1lIHNpemUgb2YgMzJrIG9yIGxhcmdlciAoZnJvbSBQYXVsIEZsaW5kZXJzKS4KKwlSZW1vdmUgI2lmIDAnZCBjb2RlLgorCitXZWQgQXByIDI3IDE2OjMzOjUxIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogbHlueC1uYXQuYyAoQ0FOTk9UX1NUT1JFX1JFR0lTVEVSKTogQWRkIGEgZmFsbGJhY2sgZGVmaW5pdGlvbgorCWZvciBMeW54IHBsYXRmb3JtcyB0aGF0IG5lZWQgaXQuCisJKiBjb25maWcvbm0tbHlueC5oIChfX0xZTlhPUyk6IERlZmluZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgorCitXZWQgQXByIDI3IDE2OjAxOjM3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBwcm9jZnMuYyAocHJvY2ZzX3dhaXQpOiBVc2UgdGhlIHNpZ25hbCBmcm9tIHRoZSBwcl9pbmZvIHJhdGhlcgorCXRoYW4gdHJ5aW5nIHRvIGRlZHVjZSBpdCBmcm9tIHRoZSBmYXVsdC4KKworV2VkIEFwciAyNyAxMjoyMjo0NiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQorCisJKiBwcmludGNtZC5jIChwcmludF9hZGRyZXNzX3N5bWJvbGljKTogSW5pdGlhbGl6ZSBuYW1lIHRvIGVtcHR5CisJc3RyaW5nIHRvIGF2b2lkIGNvcmUgZHVtcCBpZiBsb29rdXAgZmFpbHMuCisJKiByZW1vdGUtZTcwMDAuYyAocHJpbnRmX2U3MDAwZGVidWcpOiBFcnJvciBpZiB0YXJnZXQgbm90IG9wZW4uCisKK1R1ZSBBcHIgMjYgMjI6NDU6MjQgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogaTM4Ni1ubG1zdHViLmM6ICBVcGRhdGUgdG8gYmUgbW9yZSBpbiBsaW5lIHdpdGggUElOIHN0dWIuCisJKiBubG0vZ2Ric2VydmUuYyAocHV0RGVidWdDaGFyKTogIEluc3RhbGwgYnVnIGZpeCBmcm9tIGkzODYtbmxtc3R1Yi4KKwkqIChoZXgybWVtKTogIEluaXQgcHRyLgorCSogR2VuZXJhbCBjbGVhbnVwcyB0byB1c2UgQ29uc29sZVByaW50Ziwgc3RhbmRhcmQgcHJvbG9ndWVzLCBldGMuLi4KKworVHVlIEFwciAyNiAxMDoyMzowNCAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBpMzg2LW5sbXN0dWIuYzogIE1vcmUgY2hhbmdlcyB0byBiZSBjb21wYXRpYmxlIHdpdGggcmVtb3RlLmMuCisKKwkqIGRieHJlYWQuYzogIE1vdmUgYSBidW5jaCBvZiBzdHJuY21wcyBvdXQgb2YgcHJvY2Vzc19vbmVfc3ltYm9sCisJaW50byAodGhlIGZhciBsZXNzIGZyZXF1ZW50bHkgY2FsbGVkKSBkYnhfc3ltZmlsZV9yZWFkLgorCisJKiBpMzg2LW5sbXN0dWIuYzogIEFuIGludGVyaW0gdmVyc2lvbiB0aWxsIHdlIGdldCBQSU4gZm9yIHRoZSB4ODYuCisKK1R1ZSBBcHIgMjYgMDk6NTA6NDUgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogZGJ4cmVhZC5jIChyZWNvcmRfbWluaW1hbF9zeW1ib2wpOiAgUmVjb3JkIHRoZSBzZWN0aW9uCisJYXNzb2NpYXRlZCB3aXRoIHRoZSBzeW1ib2wgdG8gbWFrZSBkeW5tYWljIHJlbG9jYXRpb24gd29yay4KKwkqIChkYnhfc3ltZmlsZV9yZWFkLCBwcm9jZXNzX29uZV9zeW1ib2wpOiAgRml4ZXMgdG8gd29yayBhcm91bmQKKwlTb2xhcmlzIGJyYWluLWRhbWFnZSB3aGljaCBkb24ndCBhcHBseSB0byByZWxvY2F0YWJsZSBvYmplY3QKKwlmaWxlcy4KKwkqIChzdGFic2VjdF9idWlsZF9wc3ltdGFicyk6ICBOZXcgcm91dGluZSB0byByZWFkIHN0YWJzIG91dCBvZiBhbgorCWFyYml0cmFyaWx5IG5hbWVkIHNlY3Rpb24uCisJKiBubG1yZWFkLmMgKG5sbV9zeW10YWJfcmVhZCk6ICBSZWFkIEFMTCBzeW1zIGZyb20gdGhlIE5MTSwgbm90IGp1c3QKKwlnbG9iYWxzLgorCSogKG5sbV9zeW1maWxlX3JlYWQpOiAgQ2FsbCBzdGFic2VjdF9idWlsZF9wc3ltdGFicyB0byByZWFkIHRoZQorCXN0YWJzIG91dCBvZiB0aGUgbmxtLgorCSogcGFydGlhbC1zdGFicy5oIChjYXNlcyAnZicgJiAnRicpOiAgRml4ZXMgdG8gd29yayBhcm91bmQgU29sYXJpcworCWJyYWluLWRhbWFnZSB3aGljaCBkb24ndCBhcHBseSB0byByZWxvY2F0YWJsZSBvYmplY3QgZmlsZXMuCisJKiByZW1vdGUuYyAocHV0cGt0KTogIEltcHJvdmUgZXJyb3IgcmVwb3J0aW5nIGFuZCBlcnJvciBoYW5kbGluZy4KKwkqIChnZXRfb2Zmc2V0cyk6ICBUZW1wb3Jhcnkga2x1ZGdlIHRvIGZvcmNlIGRhdGEgJiBic3Mgc2VjdGlvbnMgdG8KKwloYXZlIHRoZSBzYW1lIHJlbG9jYXRpb24uCisJKiBzdGFic3JlYWQuYyAoZGVmaW5lX3N5bWJvbCwgc2Nhbl9maWxlX2dsb2JhbHMpOiAgUmVjb3JkIHNlY3Rpb24KKwlpbmZvIGluIHN5bS4KKworU2F0IEFwciAyMyAxOTowNTo1MiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50XzEpOiBBbm5vdGF0ZSBlYWNoIGZpZWxkIG9mIG91dHB1dC4gIEFkZAorCUZJWE1FLTMyeDY0IGNvbW1lbnQuCisKK0ZyaSBBcHIgMjIgMTY6NDM6NTQgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IE1vdmUgY2FsbCB0byBmbHVzaF9jYWNoZWRfZnJhbWVzCisJdG8gYWZ0ZXIgY2FsbCB0byB0YXJnZXRfd2FpdC4gIFRoaXMgbWVhbnMgdGhhdCBmbHVzaF9jYWNoZWRfZnJhbWVzCisJY2FuIGNhbGwgdGFyZ2V0X3Rlcm1pbmFsX291cnMgaWYgaXQgd2FudHMgdG8uCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpIFtIQVZFX05PTlNURVBQQUJMRV9XQVRDSFBPSU5UXTogQWRkCisJY29tbWVudCBhYm91dCB3aHkgdGhlIGNvZGUgaXMgZHViaW91cy4KKworCSogc3RhYnNyZWFkLmMgKHJlYWRfdHlwZSk6IENhbGwgcmVhZF90eXBlLCBub3Qgbm9uZXhpc3RlbnQKKwlvczlrX3JlYWRfdHlwZS4KKworRnJpIEFwciAyMiAxNDoyNTozNiAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQorCisJKiByZW1vdGUtb3M5ay5jIChyb21idWdfZmV0Y2hfcmVnaXN0ZXJzKTogc2V0IHRyYWNlIG1vZGUKKwljb3JyZWN0bHkuCisJKiByZW1vdGUtb3M5ay5jIChyb21idWdfcmVhZF9pbmZlcmlvcl9tZW1vcnkpOiBjYWNoZSBkYXRhIGluCisJYnVmZmVyLgorCSogb3M5a3JlYWQsYyAocmVhZF9vczlrX3BzeW10YWIpOiBwcm9jZXNzIGZpbGUgc3ltYm9sIHRvIHRydW5jYXRlCisJZXh0cmEgaW5mby4KKwkqIG9zOWtyZWFkLmMgKG9zOWtfcmVhZF9vZmlsZV9zeW10YWIpOiBwcm9wZXIgY2FzdGluZyBvZiBhcmdzCisJcGFzc2VkIHRvIHByb2Nlc3Nfb25lX3N5bWJvbC4KKwkqIHN0YWJzcmVhZC5jIChyZWFkX3R5cGUpOiBwcm9jZXNzIG9zOWsgZnVuY3RpbyBwcm90b3R5cGUuCisKK0ZyaSBBcHIgMjIgMTE6Mjc6MzkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHNvbGliLmMgKHN5bWJvbF9hZGRfc3R1Yik6IElmIHNvLT50ZXh0c2VjdGlvbiBpcyBOVUxMLCBkb24ndAorCWR1bXAgY29yZS4KKworVGh1IEFwciAyMSAwNzo0NTo0OSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogdXRpbHMuYyAocHJvbXB0X2Zvcl9jb250aW51ZSk6IEFubm90YXRlIHByb21wdC4KKwkocXVlcnkpOiBBbm5vdGF0ZSBxdWVyeS4KKwkqIHByaW50Y21kLmMgKHByaW50X2ZyYW1lX2FyZ3MpOiBDaGFuZ2Ugc3ludGF4IG9mIGFyZ3VtZW50CisJYW5ub3RhdGlvbiB0byBtYWtlIG5hbWUgYW5kIHZhbHVlIHBhcnQgb2YgYSBzaW5nbGUgZ3JvdXAgb2YKKwlhbm5vdGF0aW9ucywgbm90IHR3byBzZXBhcmF0ZSBncm91cHMuCisJKiBjcC12YWxwcmludC5jIChjcF9wcmludF92YWx1ZV9maWVsZHMpOiBMaWtld2lzZSBmb3IgZmllbGRzLgorCSogdmFscHJpbnQuYyAodmFsX3ByaW50X2FycmF5X2VsZW1lbnRzKTogQ2hhbmdlIHN5bnRheCBvZgorCWFubm90YXRpb24gdG8gYmUgbW9yZSBjb25jaXNlLgorCSogbWFpbi5jLCBkZWZzLmggKGNvbW1hbmRfbGluZV9pbnB1dCk6IE5ldyBhcmd1bWVudCB0ZWxscyB3aGF0CisJc3RyaW5nIHRvIGluY2x1ZGUgaW4gdGhlIGFubm90YXRpb25zLgorCSogc3ltdGFiLmMgKGRlY29kZV9saW5lXzIpLCBtYWluLmMgKHJlYWRfY29tbWFuZF9saW5lcywKKwljb21tYW5kX2xvb3ApOiBDaGFuZ2UgY2FsbGVycy4KKworCSogYnJlYWtwb2ludC5jICh3YXRjaF9jb21tYW5kKTogVXNlIChDT1JFX0FERFIpMCwgbm90IE5VTEwsIGZvcgorCXRhcmdldCBudWxsIHBvaW50ZXIuCisJKiBibG9ja2ZyYW1lLmMgKGZpbmRfZnJhbWVfYWRkcl9pbl9mcmFtZV9jaGFpbik6IExpa2V3aXNlLgorCisJKiBwcmludGNtZC5jIChvdXRwdXRfY29tbWFuZCk6IEFubm90YXRlIHRoaW5ncyB3ZSBwcmludCBoZXJlIHRvby4KKwkqIHByaW50Y21kLmMgKHByaW50X2NvbW1hbmRfMSk6IEFkZCAidmFsdWUtaGlzdG9yeS12YWx1ZSIgYW5ub3RhdGlvbi4KKwkqIE1vdmUgZGVjbGFyYXRpb24gb2YgcHJpbnRfdmFsdWVfZmxhZ3MgZnJvbSBkZWZzLmggdG8gdmFsdWUuaC4KKwkqIG1haW4uYyAoY29tbWFuZF9saW5lX2lucHV0KTogQ2FsbCB3cmFwX2hlcmUgYXMgd2VsbCBhcyBnZGJfZmx1c2guCisKK1RodSBBcHIgMjEgMDk6Mjk6MzcgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X2R5bmFtaWNfc3ltdGFiKTogIFJlaW5zdGFsbCBzdXBwb3J0IGZvciBzdW4zLAorCUJGRCBoYW5kbGVzIHN1bjMgZHluYW1pYyByZWxvY2F0aW9ucyBub3cuCisJKiBlbGZyZWFkLmMgKGVsZl9zeW10YWJfcmVhZCwgZWxmX3N5bWZpbGVfcmVhZCk6ICBIYW5kbGUgZHluYW1pYworCXN5bWJvbCB0YWJsZS4KKworV2VkIEFwciAyMCAxOTo0MToyMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogcHJpbnRjbWQuYyAocHJpbnRfY29tbWFuZF8xKTogQW5ub3RhdGUgdGhlIHRvcC1sZXZlbCBleHByZXNzaW9ucworCXRoYXQgd2UgcHJpbnQuCisJKHByaW50X2ZyYW1lX2FyZ3MpOiBBbm5vdGF0ZSBlYWNoIGFyZ3VtZW50LgorCSogcHJpbnRjbWQuYywgZGVmcy5oIChwcmludF92YWx1ZV9mbGFncyk6IE5ldyBmdW5jdGlvbi4KKwkqIGNwLXZhbHByaW50LmMgKGNwX3ByaW50X3ZhbHVlX2ZpZWxkcyk6IEFubm90YXRlIGVhY2ggZmllbGQuCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnRfYXJyYXlfZWxlbWVudHMpOiBBbm5vdGF0ZSBlYWNoIGFycmF5IGVsZW1lbnQuCisKK1dlZCBBcHIgMjAgMTM6MTg6NDEgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBmaW5kdmFyLmMgKHJlYWRfdmFyX3ZhbHVlKTogIEhhbmRsZSBMT0NfUkVQQVJNX0FERFIgY2FzZSBjb3JyZWN0bHksCisJdGhlIHJlZ2lzdGVyIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgdHlwZSwgbm90IHRoZSB0eXBlIGl0c2VsZi4KKworTW9uIEFwciAxMSAxMDo0NDozNSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogbWFpbi5jIChtYWluKTogQWNjZXB0IC0tYW5ub3RhdGU9TiBvcHRpb24gYW5kIG1ha2UgLS1mdWxsbmFtZQorCXRoZSBzYW1lIGFzIC0tYW5ub3RhdGU9MS4KKwkoY29tbWFuZF9saW5lX2lucHV0KTogUHJpbnQgYW5ub3RhdGF0aW9uIGJlZm9yZSBhbmQgYWZ0ZXIgcHJvbXB0LgorCSogYmxvY2tmcmFtZS5jIChmbHVzaF9jYWNoZWRfZnJhbWVzKTogUHJpbnQgYW5ub3RhdGlvbi4KKwkqIFJlbmFtZSBmcmFtZV9maWxlX2Z1bGxfbmFtZSB0byBhbm5vdGF0aW9uX2xldmVsIGFuZCBtb3ZlIGl0IGZyb20KKwlzeW10YWIuaCB0byBkZWZzLmguCisJKiBzb3VyY2UuYyAoaWRlbnRpZnlfc291cmNlX2xpbmUpOiBJZiBhbm5vdGF0aW9uX2xldmVsID4gMSwKKwljaGFuZ2Ugb3V0cHV0IGZvcm1hdC4KKwkqIGJyZWFrcG9pbnQuYzogUHJpbnQgYW5ub3RhdGlvbiB3aGVuZXZlciBhIGJyZWFrcG9pbnQgY2hhbmdlcy4KKwkqIG1haW4uYzogTmV3IHZhcmlhYmxlIHNlcnZlcl9jb21tYW5kLgorCShjb21tYW5kX2xpbmVfaW5wdXQpOiBQYXJzZSAic2VydmVyICIgYW5kIHNldCBzZXJ2ZXJfY29tbWFuZC4KKwkoZG9udF9yZXBlYXQpOiBDaGVjayBzZXJ2ZXJfY29tbWFuZC4KKworV2VkIEFwciAyMCAwODozNzoxNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogeGNvZmZyZWFkLmMgKHhjb2ZmX25leHRfc3ltYm9sX3RleHQpOiBEb24ndCByZXR1cm4gYmVmb3JlCisJdXBkYXRpbmcgcmF3X3N5bWJvbCBhbmQgc3ltbnVtLiAgUmV0dXJuIGEgdmFsdWUgaW4gdGhlIGNhc2Ugd2hlcmUKKwl3ZSBjb21wbGFpbmVkLgorCisJKiBkc3RyZWFkLmMsIGNvZmZyZWFkLmM6IERvbid0IGRlZmluZSBwZW5kaW5nX2Jsb2NrczsgYnVpbGRzeW0uYworCXRha2VzIGNhcmUgb2YgaXQuCisJKiBwYXJzZS5jOiBEb24ndCBkZWZpbmUgYmxvY2tfZm91bmQ7IGl0IGlzIGRlZmluZWQgaW4gc3ltdGFiLmMuCisJKiBwYXJzZXItZGVmcy5oOiBBZGQgY29tbWVudCByZWdhcmRpbmcgYmxvY2tfZm91bmQuCisKK1R1ZSBBcHIgMTkgMDk6NDY6MDUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGEtdGRlcC5jIChpbnRlcm5hbGl6ZV91bndpbmRfaW5mbyk6IERlbGV0ZSB1bnVzZWQgaW5kZXhwCisJYXJndW1lbnQuCisKK01vbiBBcHIgMTggMTM6MTg6NTYgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X2R5bmFtaWNfc3ltdGFiKTogIFJlbG9jYXRlIEJGRCBzeW1ib2xzIGJ5CisJc2VjdGlvbiB2bWEuIERvIG5vdCByZWFkIGR5bmFtaWMgcmVsb2NzIGZvciBzdW4zIGV4ZWN1dGFibGVzIHRvCisJYXZvaWQgQkZEIGFzc2VydGlvbiBtZXNzYWdlLgorCitNb24gQXByIDE4IDEwOjA4OjA3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBubS1ocHBhYi5oIChLRVJORUxfVV9BRERSKTogRGVmaW5lLgorCShGSVZFX0FSR19QVFJBQ0UpOiBMaWtld2lzZS4KKwkoQ0FOTk9UX1NUT1JFX1JFR0lTVEVSKTogTGlrZXdpc2UuCisJKiBubS1ocHBhaC5oIChLRVJORUxfVV9BRERSKTogRGVmaW5lLgorCShGSVZFX0FSR19QVFJBQ0UpOiBMaWtld2lzZS4KKwkoQ0FOTk9UX1NUT1JFX1JFR0lTVEVSKTogTGlrZXdpc2UuCisJKE5FRURfVEVYVF9TVEFSVF9FTkQpOiBMaWtld2lzZS4KKworCSogdG0taHBwYWguaCAoTkVFRF9URVhUX1NUQVJUX0VORCk6IERlbGV0ZSBkZWZpbml0aW9uLgorCSogeG0taHBwYWguaCAoS0VSTkVMX1VfQUREUik6IERlbGV0ZSBkZWZpbml0aW9uLgorCShGSVZFX0FSR19QVFJBQ0UpOiBMaWtld2lzZS4KKwkqIHhtLWhwcGFiLmggKEtFUk5FTF9VX0FERFIpOiBEZWxldGUgZGVmaW5pdGlvbi4KKwkoRklWRV9BUkdfUFRSQUNFKTogTGlrZXdpc2UuCisKKwkqIGhwcGEtdGRlcC5jIChyZWFkX3Vud2luZF9pbmZvKTogTWFrZSBzdGF0aWMuCisJKHJlc3RvcmVfcGNfcXVldWUpOiBJbmRpcmVjdCB0aHJvdWdoIHRoZSB0YXJnZXQgdmVjdG9yIHRvCisJcmVsb2FkIHRoZSByZWdpc3RlciBzdGF0ZS4KKworU2F0IEFwciAxNiAyMjoyMDo1MSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogcGFyZWFkLmMgKGNvbXBhcmVfdW53aW5kX2VudHJpZXMpOiBEZWxldGUgZnVuY3Rpb24uICBJdCdzIGJlZW4KKwltb3ZlZCBpbnRvIGhwcGEtdGRlcC5jLgorCShyZWFkX3Vud2luZF9pbmZvKTogTGlrZXdpc2UuCisJKHBhX3N5bWZpbGVfcmVhZCk6IE5vIGxvbmdlciBjYWxsIHJlYWRfdW53aW5kX2luZm8uICBUaGUgdW53aW5kCisJdGFibGVzIHdpbGwgYmUgcmVhZCBpbiBhcyB0aGV5IGFyZSBuZWVkZWQuCisKKwkqIGhwcGEtdGRlcC5jIChjb21wYXJlX3Vud2luZF9lbnRyaWVzKTogTmV3IGZ1bmN0aW9uLgorCShyZWFkX3Vud2luZF9pbmZvLCBpbnRlcm5hbGl6ZV91bndpbmRzKTogTGlrZXdpc2UuCisJKGZpbmRfdW53aW5kX2VudHJ5KTogUmVhZCBpbiB1bndpbmQgaW5mb3JtYXRpb24gb24gZGVtYW5kLgorCitGcmkgQXByIDE1IDExOjUzOjQ2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogc291cmNlLmMgKERJUk5BTUVfU0VQQVJBVE9SKTogTmV3IG1hY3JvLCByZXBsYWNlcyBhbGwgcmVmZXJlbmNlcworCXRvIDogaW4gc2VhcmNoIHBhdGggcHJvY2Vzc2luZy4KKwkqIGRlZnMuaCAocXNvcnQpOiBSZW5hbWUgYXJndW1lbnQgaW4gcHJvdG90eXBlLgorCSogc3ltdGFiLmggKFNBWU1CT0xfVkFMVUUpOiBSZW5hbWUgdmFsdWUgZmllbGQsIGF2b2lkcyBidWdzIGluCisJc29tZSBjb21waWxlcnMuCisJKiBicmVha3BvaW50LmMsIGV4ZWMuYywgbWRlYnVncmVhZC5jLCBtaXBzcmVhZC5jLCB4Y29mZmV4ZWMuYworCShmYWxzZSk6IEVsaW1pbmF0ZSB1c2FnZXMuCisKK0ZyaSBBcHIgMTUgMTE6MzU6MTkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKKworCSogaDg1MDAtdGRlcC5jIChpbml0aWFsaXplX2g4NTAwX3RkZXAsIGxhcmdlX2NvbW1hbmQpOgorCUFsbCByZWZlcmVuY2VzIHRvIHZhbHVlIGNoYW5nZWQgdG8gdmFsdWVfcHRybGFnZV9jb21tYW5kIGlzIG5vdworCWNhbGxlZCBiaWdfY29tbWFuZC4KKwlBbGwgcmVmZXJlbmNlcyB0byB2YWx1ZSBjaGFuZ2VkIHRvIHZhbHVlX3B0ci4KKwkqIHJlbW90ZS1lNzAwMC5jIChlNzAwMF93YWl0KTogVXNlIHRhcmdldF93YWl0c3RhdHVzIGFuZCBTRVRTVE9QCisJKiByZW1vdGUtaG1zLmMgKGhtc193YWl0KTogVGltZW91dCBhZnRlciBmaXZlIHNlY29uZHMuCisJKiBzZXItZ28zMi5jIChkb3Nhc3luY19yZWFkKTogUG9sbCBpZiB0aW1lb3V0IDwgMC4KKwkqIGNvbmZpZy90bS90bS1oODUwMC5oIChCRUZPUkVfTUFJTl9MT09QX0hPT0spOiBEZWxldGVkLgorCSogY29uZmlnL3NoL3RtLXNoLmggKEJSRUFLUE9JTlQpOiBJcyBub3cgc2xlZXAgb3Bjb2RlLgorCitUaHUgQXByIDE0IDA3OjAxOjU2IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBwcm9jZnMuYyAocHJvY2ZzX3dhaXQpOiBQcm90ZWN0IHdhdGNocG9pbnQgY29kZSB3aXRoIGFwcHJvcHJpYXRlCisJI2lmZGVmcy4KKwkocHJvY2ZzX3NldF93YXRjaHBvaW50LCBwcm9jZnNfc3RvcHBlZF9ieV93YXRjaHBvaW50KTogTGlrZXdpc2UuCisKK1dlZCBBcHIgMTMgMTQ6NTI6NDYgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGJyZWFrcG9pbnQuaCAoZW51bSBicHR5cGUpOiBBZGQgYnBfaGFyZHdhcmVfd2F0Y2hwb2ludCBhbmQKKwlicF93YXRjaHBvaW50X3Njb3BlIGJyZWFrcG9pbnRzLgorCShzdHJ1Y3QgYnJlYWtwb2ludCk6IEFkZCB2YWxfY2hhaW4gYW5kIHJlbGF0ZWRfYnJlYWtwb2ludCBmaWVsZHMKKwlmb3IgdXNlIGJ5IHdhdGNocG9pbnRzLgorCisJKiBicmVha3BvaW50LmMgKHdpdGhpbl9zY29wZSk6IERlbGV0ZS4gIE5vIGxvbmdlciB1c2VkLgorCShUQVJHRVRfQ0FOX1VTRV9IQVJEV0FSRV9XQVRDSFBPSU5UKTogUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb24uCisJKHRhcmdldF97cmVtb3ZlLGluc2VydH1fd2F0Y2hwb2ludCk6IExpa2V3aXNlLgorCShjYW5fdXNlX2hhcmR3YXJlX3dhdGNocG9pbnQpOiBOZXcgZnVuY3Rpb24uCisJKHJlbW92ZV9icmVha3BvaW50KTogTmV3IGZ1bmN0aW9uIHRvIHJlbW92ZSBhIHNpbmdsZSBicmVha3BvaW50CisJb3IgaGFyZHdhcmUgd2F0Y2hwb2ludC4KKwkoaW5zZXJ0X2JyZWFrcG9pbnRzKTogSGFuZGxlIGluc2VydGlvbiBvZiBoYXJkd2FyZSB3YXRjaHBvaW50cy4KKwlTdG9yZSBhIGNvcHkgb2YgdGhlIHZhbHVlIGNoYWluIGRlcml2ZWQgZnJvbSB0aGUgd2F0Y2hwb2ludAorCWV4cHJlc3Npb24uCisJKHJlbW92ZV9icmVha3BvaW50cyk6IFNpbXBsaWZ5IGJ5IHVzaW5nIHJlbW92ZV9icmVha3BvaW50LgorCShkZWxldGVfYnJlYWtwb2ludCk6IExpa2V3aXNlLgorCSh3YXRjaHBvaW50X2NoZWNrKTogRGVsZXRlIHRoZSB3YXRjaHBvaW50IGFuZCB3YXRjaHBvaW50IHNjb3BlCisJYnJlYWtwb2ludHMgd2hlbiB0aGUgd2F0Y2hwb2ludCBnb2VzIG91dCBvZiBzY29wZS4gIFNhdmUgJiByZXN0b3JlCisJdGhlIGN1cnJlbnQgZnJhbWUgYWZ0ZXIgY2hlY2tpbmcgd2F0Y2hwb2ludHMuCisJKGJyZWFrcG9pbnRfaW5pdF9pbmZlcmlvcik6IExpa2V3aXNlIChyZXN0YXJ0aW5nIHRoZSBwcm9ncmFtCisJbWFrZXMgYWxsIGxvY2FsIHdhdGNocG9pbnRzIGdvIG91dCBvZiBzY29wZSkuCisJKGJwc3RhdF9zdG9wX3N0YXR1cyk6IEhhbmRsZSBoYXJkd2FyZSB3YXRjaHBvaW50cyBtdWNoIGxpa2Ugbm9ybWFsCisJd2F0Y2hwb2ludHMuIERlbGV0ZSB0aGUgd2F0Y2hwb2ludCBhbmQgd2F0Y2hwb2ludCBzY29wZSBicmVha3BvaW50CisJd2hlbiB0aGUgd2F0Y2hwb2ludCBnb2VzIG91dCBvZiBzY29wZS4gIFJlbW92ZSBhbmQgcmVpbnNlcnQgYWxsCisJYnJlYWtwb2ludHMgYmVmb3JlIHJldHVybmluZyBpZiB3ZSBzdG9wcGVkIHdoZW4gYSBoYXJkd2FyZSB3YXRjaHBvaW50CisJZmlyZWQuCisJKHdhdGNoX2NvbW1hbmQpOiBVc2UgYSBoYXJkd2FyZSB3YXRjaHBvaW50IHdoZW4gcG9zc2libGUuICBJZgorCXdhdGNoaW5nIGEgbG9jYWwgZXhwcmVzc2lvbiwgYnVpbGQgYSBzY29wZSBicmVha3BvaW50IHRvby4KKwkobWFwX2JyZWFrcG9pbnRfbnVtYmVycyk6IEFsc28gY2FsbCBnaXZlbiBmdW5jdGlvbiBmb3IgYW55CisJcmVsYXRlZCBicmVha3BvaW50cy4KKwkoZGlzYWJsZV9icmVha3BvaW50KTogTmV2ZXIgZGlzYWJsZSBhIHNjb3BlIGJyZWFrcG9pbnQuCisJKGVuYWJsZV9icmVha3BvaW50KTogSGFuZGxlIGhhcmR3YXJlIGJyZWFrcG9pbnRzIG11Y2ggbGlrZSBub3JtYWwKKwlicmVha3BvaW50cywgYnV0IHJlY29tcHV0ZSB0aGUgd2F0Y2hwb2ludF9zY29wZSBicmVha3BvaW50J3MKKwlmcmFtZSBhbmQgYWRkcmVzcyAgKGlmIHdlIGhhdmUgYW4gYXNzb2NpYXRlZCBzY29wZSBicmVha3BvaW50KS4KKwkocmVhZF9tZW1vcnlfbm9icHQpOiBIYW5kbGUgaGFyZHdhcmUgd2F0Y2hwb2ludHMgbGlrZSBub3JtYWwgCisJd2F0Y2hwb2ludHMuICBXaGVuIG5lY2Vzc2FyeSBoYW5kbGUgd2F0Y2hwb2ludF9zY29wZSBicmVha3BvaW50cy4KKwkocHJpbnRfaXRfbm9ybWFsLCBicHN0YXRfd2hhdCwgYnJlYWtwb2ludF8xLCBtZW50aW9uKTogTGlrZXdpc2UuCisJKGNsZWFyX2NvbW1hbmQsIGJyZWFrcG9pbnRfcmVfc2V0X29uZSwgZW5hYmxlX2NvbW1hbmQpOiBMaWtld2lzZS4KKwkoZGlzYWJsZV9jb21tYW5kKTogTGlrZXdpc2UuCisKKwkqIGJsb2NrZnJhbWUuYyAoZmluZF9mcmFtZV9hZGRyX2luX2ZyYW1lX2NoYWluKTogTmV3IGZ1bmN0aW9uLgorCUV4dGVybiBwcm90b3R5cGUgYWRkZWQgdG8gZnJhbWUuaAorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBTZXQgY3VycmVudF9mcmFtZSBhbmQgc2VsZWN0CisJYSBmcmFtZSBiZWZvcmUgY2hlY2tpbmcgaWYgd2Ugc3RvcHBlZCBkdWUgdG8gYSBoYXJkYXJlIHdhdGNocG9pbnQKKwlmaXJpbmcuICBIYW5kbGUgc3RlcHBpbmcgb3ZlciBoYXJkd2FyZSB3YXRjaHBvaW50cy4KKwkobm9ybWFsX3N0b3ApOiBSZW1vdmUgdW5uZWNlc3NhcnkgY2FsbCB0byBzZWxlY3RfZnJhbWUuCisKKwkqIHZhbHVlLmggKHZhbHVlX3JlbGVhc2VfdG9fbWFyayk6IERlY2xhcmUuCisJKiB2YWx1ZXMuYyAodmFsdWVfcmVsZWFzZV90b19tYXJrKTogTmV3IGZ1bmN0aW9uLgorCisJKiBwcm9jZnMuYyAocHJvY2ZzX3dhaXQpOiBBZGQgY2FzZXMgZm9yIGhhcmR3YXJlIHdhdGNocG9pbnRzLgorCShwcm9jZnNfc2V0X3dhdGNocG9pbnQsIHByb2Nmc19zdG9wcGVkX2J5X3dhdGNocG9pbnQpOiBOZXcgZnVuY3Rpb25zLgorCisJKiBocHBhYi1uYXQuYyAoaHBwYV9zZXRfd2F0Y2hwb2ludCk6IE5ldyBmdW5jdGlvbi4KKworCSogY29uZmlnL3BhL25tLWhwcGFiLmggKFNUT1BQRURfQllfV0FUQ0hQT0lOVCk6IERlZmluZS4KKwkoSEFWRV9TVEVQUEFCTEVfV0FUQ0hQT0lOVCk6IERlZmluZS4KKwkoVEFSR0VUX0NBTl9VU0VfSEFSRFdBUkVfV0FUQ0hQT0lOVCk6IERlZmluZS4KKwkodGFyZ2V0X3tpbnNlcnQsZGVsZXRlfV93YXRjaHBvaW50KTogRGVmaW5lLgorCisJKiBjb25maWcvbWlwcy9ubS1pcml4NC5oIChUQVJHRVRfQ0FOX1VTRV9IQVJEV0FSRV9XQVRDSFBPSU5UKTogRGVmaW5lLgorCShTVE9QUEVEX0JZX1dBVENIUE9JTlQsIEhBVkVfTk9OU1RFUFBBQkxFX1dBVENIUE9JTlQpOiBMaWtld2lzZS4KKwkodGFyZ2V0X3tpbnNlcnQscmVtb3ZlfV93YXRjaHBvaW50KTogTGlrZXdpc2UuCisKK01vbiBBcHIgMTEgMTk6MjE6MjcgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogeGNvZmZyZWFkLmMgKHJlYWRfeGNvZmZfc3ltdGFiKTogIElnbm9yZSBzeW1ib2xzIG9mIGNsYXNzIENfRVhULAorCXNtdHlwIFhUWV9MRCwgc2NsYXNzIFhNQ19EUyAoZXh0ZXJuYWwgZGF0YSBzZWdtZW50IGxhYmVsKS4gIFRoZXkKKwlvZnRlbiBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIGRlYnVnIHN5bWJvbHMgZm9yIGZ1bmN0aW9ucywgYW5kCisJY29uZnVzZSBsb29rdXBfc3ltYm9sKCkuCisKK01vbiBBcHIgMTEgMTA6NDQ6MzUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS5jOiBBcm91bmQgcmVkZWZpbml0aW9uIG9mIFBCVUZTSVpFLCBhZGp1c3Qgd2hpdGVzcGFjZS4KKwkqIGNvbmZpZy9wYS90bS1ocHBhLmggKFJFR0lTVEVSX0JZVEVTKTogVXNlIDQgcmF0aGVyIHRoYW4KKwlSRUdJU1RFUl9SQVdfU0laRSAoMSkuCisJVG9nZXRoZXIgdGhlc2UgY2hhbmdlcyB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBIUCdzIGNvbXBpbGVyLiAgQm90aAorCXNlZW0gdG8gYmUgbmVjZXNzYXJ5LgorCitNb24gQXByIDExIDA5OjE4OjI0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBwYXJlYWQuYyAocGFfc3ltdGFiX3JlYWQpOiBIYW5kbGUgU1RfU1RVQiBzeW1ib2xzIGFuZCBzeW1ib2xzCisJd2l0aCBzY29wZSBTU19FWFRFUk5BTC4gIFNUX0VOVFJZIHN5bWJvbHMgaW4gZHluYW1pYyBleGVjdXRhYmxlcworCWFyZSB0eXBlIG1zdF9zb2xpYl90cmFtcG9saW5lLgorCitGcmkgQXByICA4IDE3OjE0OjM3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvbTY4ay9lczE4MDAubXQ6IENoYW5nZSBjb21tZW50cy4KKworRnJpIEFwciAgOCAxNzoxNDozNyAxOTk0ICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9tNjhrL21vbml0b3IubXQgKFRERVBGSUxFUyk6IERvbid0IGluY2x1ZGUgcmVtb3RlLWVzLm8uCisKK0ZyaSBBcHIgIDggMTU6MzU6MzAgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogbHlueC1uYXQuYzogIFJlc3RvcmUgcmVnbWFwIHN0cnVjdHVyZSBmb3IgU1BBUkMuICBJdCdzIG5lZWRlZAorCWZvciBjb3JlIGZpbGVzLgorCitGcmkgQXByICA4IDE0OjUzOjM1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQorCisJKiB2YWx1ZXMuYyAodW5wYWNrX2xvbmcpOiBSZW1vdmUgb2Jzb2xldGUgY29tbWVudCBhYm91dCB1c2luZyBhCisJc3dpdGNoIHN0YXRlbWVudC4KKworCSogc3ltZmlsZS5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogQWRkIGNvbW1lbnRzIGFib3V0IGNvbW1hbmQgc3ludGF4LgorCitUaHUgQXByICA3IDE3OjI1OjIxIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKwkJCSAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIGluZnJ1bi5jIChJTl9TT0xJQl9UUkFNUE9MSU5FKTogIENvcnJlY3QgY29tbWVudCwgdHJhbXBvbGluZXMKKwlhcmUgaW4gdGhlIC5wbHQgc2VjdGlvbi4KKwkqIG1pbnN5bXMuYyAobG9va3VwX3NvbGliX3RyYW1wb2xpbmVfc3ltYm9sX2J5X3BjLAorCWZpbmRfc29saWJfdHJhbXBvbGluZV90YXJnZXQpOiAgTmV3IGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcKKwlzdGVwcGluZyBpbnRvIC1nIGNvbXBpbGVkIHNoYXJlZCBsaWJyYXJpZXMuCisJKiBzeW10YWIuaCAobG9va3VwX3NvbGliX3RyYW1wb2xpbmVfc3ltYm9sX2J5X3BjLAorCWZpbmRfc29saWJfdHJhbXBvbGluZV90YXJnZXQpOiAgQWRkIHByb3RvdHlwZXMuCisJKiBjb25maWcvdG0tc3Vub3MuaCAoSU5fU09MSUJfVFJBTVBPTElORSwgU0tJUF9UUkFNUE9MSU5FX0NPREUpOgorCURlZmluZSB0byBoYW5kbGUgc3RlcHBpbmcgaW50byAgLWcgY29tcGlsZWQgc2hhcmVkIGxpYnJhcmllcy4KKwkqIGNvbmZpZy90bS1zeXN2NC5oIChTS0lQX1RSQU1QT0xJTkVfQ09ERSk6ICBEZWZpbmUgdG8gaGFuZGxlCisJc3RlcHBpbmcgaW50byAgLWcgY29tcGlsZWQgc2hhcmVkIGxpYnJhcmllcy4KKworVGh1IEFwciAgNyAxNzoyMjo1NCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNvbmZpZ3VyZS5pbjogIEFkZCBtaXBzLSotc3lzdjQqIHN1cHBvcnQuCisJKiBjb25maWcvbWlwcy9taXBzdjQubWgsIGNvbmZpZy9taXBzL21pcHN2NC5tdCwKKwljb25maWcvbWlwcy90bS1taXBzdjQuaCwgY29uZmlnL21pcHMveG0tbWlwc3Y0LmgsIG1pcHN2NC1uYXQuYzoKKwlOZXcgZmlsZXMgZm9yIE1JUFMgU1ZSNCBzdXBwb3J0LgorCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgZm9yIG5ldyBtaXBzdjQgZmlsZXMuCisJKiBhbHBoYS10ZGVwLmMgKGhldXJpc3RpY19wcm9jX2Rlc2MsIGZpbmRfcHJvY19kZXNjKTogIFVzZQorCXJlYWRfbmV4dF9mcmFtZV9yZWcgdG8gb2J0YWluIHRoZSBmcmFtZSByZWxhdGl2ZSBzdGFjayBwb2ludGVyLgorCSogbWlwcy10ZGVwLmMgKGhldXJpc3RpY19wcm9jX2Rlc2MpOiAgVXNlIHJlYWRfbmV4dF9mcmFtZV9yZWcgdG8KKwlvYnRhaW4gdGhlIGZyYW1lIHJlbGF0aXZlIHN0YWNrIHBvaW50ZXIuCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3BhcnRpYWxfc3ltYm9scywgcHN5bXRhYl90b19zeW10YWIxKToKKwlIYW5kbGUgc3RTdGF0aWMgYW5kIHN0U3RhdGljUHJvYyBzeW1ib2xzIGluIHN0YWJzLWluLWVjb2ZmIG91dHB1dAorCWJ5IGVudGVyaW5nIHRoZW0gaW50byB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGUuCisJKiBwcmludGNtZC5jIChwcmludF9zY2FsYXJfZm9ybWF0dGVkKTogIERvIG5vdCB0cnkgdG8gdW5wYWNrIHRvCisJYSBsb25nIGZvciBmbG9hdCBmb3JtYXRzLgorCSogc29saWIuYzogIEluY2x1ZGUgImVsZi9taXBzLmgiIG9ubHkgaWYgRFRfTUlQU19STERfTUFQIGRvZXMgbm90CisJZ2V0IGRlZmluZWQgaW4gPGxpbmsuaD4uCisJKiBzb2xpYi5jIChzb2xpYl9hZGQpOiAgQWRkIHNoYXJlZCBsaWJyYXJ5IHNlY3Rpb25zIHRvIHRoZSBzZWN0aW9uCisJdGFibGUgb2YgdGhlIHRhcmdldCBiZWZvcmUgYWRkaW5nIHRoZSBzeW1ib2xzLgorCSogcGFydGlhbC1zdGFiLmg6ICBSZWxvY2F0ZSBzdGF0aWMgYW5kIGdsb2JhbCBmdW5jdGlvbnMuCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X3N5bXRhYik6ICBSZW1vdmUgdW51c2VkIHZhcmlhYmxlCisJZW5kX29mX3RleHRfYWRkcmVzcy4gIFJlbG9jYXRlIHRleHRfYWRkciB3aGVuIHBhc3NpbmcgaXQKKwl0byBlbmRfcHN5bXRhYi4KKworCUZvciBBbHBoYSBPU0YvMSB0YXJnZXRzLCBlbmFibGUgZ2RiIHRvIHNldCBicmVha3BvaW50cyBpbiBzaGFyZWQKKwlsaWJyYXJ5IGZ1bmN0aW9ucyBiZWZvcmUgdGhlIGV4ZWN1dGFibGUgaXMgcnVuLiBSZXRyaWV2ZSBkeW5hbWljCisJc3ltYm9scyBmcm9tIHN0cmlwcGVkIGV4ZWN1dGFibGVzLgorCSogbWlwc3JlYWQuYyAocmVhZF9hbHBoYWNvZmZfZHluYW1pY19zeW10YWIpOiAgTmV3IGZ1bmN0aW9uLgorCSogbWlwc3JlYWQuYyAobWlwc2NvZmZfc3ltZmlsZV9yZWFkKTogIFVzZSBpdC4gSXNzdWUgd2FybmluZyBtZXNzYWdlCisJaWYgbm8gZGVidWdnaW5nIHN5bWJvbHMgd2VyZSBmb3VuZC4KKwkqIGFscGhhLXRkZXAuYyAoYWxwaGFfc2tpcF9wcm9sb2d1ZSk6ICBTaWxlbnRseSByZXR1cm4gdGhlIHVuYWx0ZXJlZAorCXBjIGlmIG1lbW9yeSBhdCB0aGUgcGMgaXMgbm90IGFjY2Vzc2libGUgYW5kIEdEQl9UQVJHRVRfSEFTX1NIQVJFRF9MSUJTCisJaXMgZGVmaW5lZC4KKwkqIGNvbmZpZy9hbHBoYS9ubS1hbHBoYS5oIChHREJfVEFSR0VUX0hBU19TSEFSRURfTElCUyk6ICBEZWZpbmUsCisJT1NGLzEgaGFzIHNoYXJlZCBsaWJyYXJpZXMuCisKK1RodSBBcHIgIDcgMTU6MTE6MTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X2R5bmFtaWNfc3ltdGFiKTogQWRqdXN0IGZvciByZWNlbnQgY2hhbmdlcworCXRvIEJGRCBoYW5kbGluZyBvZiBkeW5hbWljIHN5bWJvbHMuCisKK1R1ZSBBcHIgIDUgMTU6Mjk6MjUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGEtdGRlcC5jIChocHBhX2ZpeF9jYWxsX2R1bW15KTogSWYgRlVOIGlzIGEgcHJvY2VkdXJlIGxhYmVsLAorCXRoZW4gZ2V0cyBpdHMgcmVhbCBhZGRyZXNzIGludG8gRlVOIGFuZCBpdHMgR09UL0RQIHZhbHVlIGludG8gJXIxOS4KKworCSogdG0taHBwYS5oIChDQUxMX0RVTU1ZKTogVXNlICVyMjAsIG5vdCAlcjE5IGFzIGEgdGVtcG9yYXJ5LgorCisJKiBocHBhLXRkZXAuYyAoZnJhbWVsZXNzX2Z1bmN0aW9uX2ludm9jYXRpb24pOiBJZiBubyB1bndpbmQKKwlkZXNjcmlwdG9yIHdhcyBmb3VuZCwgdGhlbiBhc3N1bWUgdGhpcyB3YXMgbm90IGEgZnJhbWVsZXNzCisJZnVuY3Rpb24gaW52b2NhdGlvbi4KKwkoZnJhbWVfc2F2ZWRfcGMpOiBJZiB0aGUgc2F2ZWQgUEMgaXMgaW4gYSBsaW5rZXIgc3R1YiwgdGhlbgorCXJldHVybiB0aGUgcmV0dXJuIGFkZHJlc3Mgd2hpY2ggdGhlIGxpbmtlciBzdHViIHdpbGwgcmV0dXJuIHRvLgorCisgICAgICAgICogeG0taHBwYWIuaDogTmV2ZXIgZGVmaW5lIFVTRy4KKyAgICAgICAgKiB4bS1ocHBhaC5oOiBBbHdheXMgZGVmaW5lIFVTRy4KKworVHVlIEFwciAgNSAxMjo1ODo0NyAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogdmFsdWVzLmMgKHVucGFja19sb25nLCB2YWx1ZV9mcm9tX2xvbmdlc3QpLAorCXZhbGFyaXRoLmMgKHZhbHVlX2Jpbm9wKTogIEFsbG93IFRZUEVfQ09ERV9SQU5HRS4KKworRnJpIEFwciAgMSAxNDowNDozNCAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogc3ltZmlsZS5jIChkZWR1Y2VfbGFuZ3VhZ2VfZnJvbV9maWxlbmFtZSk6IC5jcHAgaXMgYSBDKysgZXh0ZW5zaW9uLgorCitGcmkgQXByICAxIDAwOjQ0OjAwIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCUZvciBTVlI0IHRhcmdldHMsIGVuYWJsZSBnZGIgdG8gc2V0IGJyZWFrcG9pbnRzIGluIHNoYXJlZAorCWxpYnJhcnkgZnVuY3Rpb25zIGJlZm9yZSB0aGUgZXhlY3V0YWJsZSBpcyBydW4uCisJKiBlbGZyZWFkLmMgKGVsZl9zeW10YWJfcmVhZCk6ICBIYW5kbGUgc3ltYm9scyBmb3Igc2hhcmVkIGxpYnJhcnkKKwlmdW5jdGlvbnMuCisJKiBzcGFyYy10ZGVwLmMgKGluX3NvbGliX3RyYW1wb2xpbmUpOiAgUmVuYW1lZCB0byBpbl9wbHRfc2VjdGlvbgorCWFuZCBtb3ZlZCB0byBvYmpmaWxlcy5jLgorCSogb2JqZmlsZXMuYyAoaW5fcGx0X3NlY3Rpb24pOiAgTW92ZWQgdG8gaGVyZSBmcm9tIHNwYXJjLXRkZXAuCisJKiBjb25maWcvdG0tc3lzdjQuaCAoSU5fU09MSUJfVFJBTVBPTElORSk6ICBVc2UgbmV3IGluX3BsdF9zZWN0aW9uLgorCSogY29uZmlnL3NwYXJjL3RtLXN1bjRzb2wyLmggKElOX1NPTElCX1RSQU1QT0xJTkUpOiAgUmVtb3ZlZCwKKwl0aGUgbmV3IGdlbmVyaWMgZGVmaW5pdGlvbiBmcm9tIHRtLXN5c3Y0Lmggd29ya3MgZm9yIFNvbGFyaXMuCisKK1dlZCBNYXIgMzAgMTY6MTQ6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiBlbGZyZWFkLmMgKGVsZl9zeW10YWJfcmVhZCk6IENoYW5nZSBzdG9yYWdlX25lZWRlZCwKKwludW1iZXJfb2Zfc3ltYm9scyBhbmQgaSB0byBsb25nLiAgUmVuYW1lIGdldF9zeW10YWJfdXBwZXJfYm91bmQgdG8KKwliZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZC4gIENoZWNrIGZvciBlcnJvcnMgZnJvbQorCWJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZCBiZmRfY2Fub25pY2FsaXplX3N5bXRhYi4KKwkqIG5sbXJlYWQuYyAobmxtX3N5bXRhYl9yZWFkKTogU2FtZSBjaGFuZ2VzLgorCitXZWQgTWFyIDMwIDExOjQzOjI5IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiB4Y29mZnJlYWQuYyAoeGNvZmZfbmV4dF9zeW1ib2xfdGV4dCk6IE5ldyBmdW5jdGlvbi4KKwkocmVhZF94Y29mZl9zeW10YWIpOiBTZXQgbmV4dF9zeW1ib2xfdGV4dF9mdW5jIHRvIGl0LgorCU1vdmUgcmF3X3N5bWJvbCBvdXRzaWRlIG9mIHJlYWRfeGNvZmZfc3ltdGFiLgorCisJKiByZW1vdGUuYyAoZ2V0cGt0KTogUmVtb3ZlIHVudXNlZCAib3V0IiBsYWJlbC4KKworV2VkIE1hciAzMCAwOToxNTo0MiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogYnJlYWtwb2ludC5jIChwcmludF9pdF9ub3JtYWwpOiBBbGxvdyBHREIgdG8gbm90aWZ5IHRoZSB1c2VyCisJYWJvdXQgbW9yZSB0aGFuIG9uZSB3YXRjaHBvaW50IGJlaW5nIHRyaWdnZXJlZC4KKworV2VkIE1hciAzMCAwODoyNDoxOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL202OGsvdG0tZHB4Mi5oOiBJbmNsdWRlIHRtLW02OGsuaCBub3Qgbm9uZXhpc3RlbnQgdG0tNjhrLmguCisKK1dlZCBNYXIgMzAgMDA6MzE6NDkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBibG9ja2ZyYW1lLmMgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbik6ICBtc3RfZmlsZV90ZXh0CisJc3ltYm9scyBkbyBub3QgbGl2ZSBpbiB0aGUgc2hhcmVkIGxpYnJhcnkgdHJhbnNmZXIgdGFibGUuCisJKiBjaC1leHAueSAoZGVjb2RlX2ludGVnZXJfdmFsdWUsIG1hdGNoX2NoYXJhY3Rlcl9saXRlcmFsLAorCW1hdGNoX2JpdHN0cmluZ19saXRlcmFsKTogIEd1YXJkIHRvbG93ZXIgY2FsbHMgd2l0aCBpc3VwcGVyLAorCXRvbG93ZXIgb24gb2xkIEJTRCBzeXN0ZW1zIGJsaW5kbHkgc3VidHJhY3RzIGEgY29uc3RhbnQuCisJKiBkYnhyZWFkLmMgKHJlYWRfb2ZpbGVfc3ltdGFiKTogIENoZWNrIGZvciBfX2dudV9jb21waWxlZF8qIGFzCisJd2VsbCB3aGVuIGRldGVybWluaW5nIHRoZSBwcm9kdWNlciBvZiB0aGUgb2JqZWN0IGZpbGUuCisJKiBtZGVidWdyZWFkLmMgKGhhc19vcGFxdWVfeHJlZik6ICBOZXcgZnVuY3Rpb24gdG8gY2hlY2sgZm9yCisJY3Jvc3MgcmVmZXJlbmNlIHRvIGFuIG9wYXF1ZSBhZ2dyZWdhdGUuCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3N5bWJvbCwgcGFyc2VfcGFydGlhbF9zeW1ib2xzKTogIERvIG5vdAorCWVudGVyIHR5cGVkZWZzIHRvIG9wYXF1ZSBhZ2dyZWdhdGVzIGludG8gdGhlIHN5bWJvbCB0YWJsZXMuCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX2V4dGVybmFsKTogIFJlbW92ZSBza2lwX3Byb2NlZHVyZXMgYXJndW1lbnQsCisJaXQgaGFzIGFsd2F5cyBiZWVuIDEuICBSZW1vdmUgY29kZSB0aGF0IGhhbmRsZWQgc3RQcm9jIHN5bWJvbHMsCisJaXQgd2FzIG5ldmVyIGV4ZWN1dGVkIGFuZCB3YXMgd3JvbmcsIGFzIHRoZSBpbmRleCBvZiBhCisJc3RQcm9jIHN5bWJvbCBwb2ludHMgdG8gdGhlIGxvY2FsIHN5bWJvbCB0YWJsZSBhbmQgbm90IHRvIHRoZQorCWF1eGlsaWFyeSBzeW1ib2wgaW5mby4gVXBkYXRlIGNhbGxlci4KKwkqIG1kZWJ1Z3JlYWQuYyAocGFyc2VfcGFydGlhbF9zeW1ib2xzKTogIERvIG5vdCBlbnRlciBleHRlcm5hbAorCXN0UHJvYyBzeW1ib2xzIGludG8gdGhlIHBhcnRpYWwgc3ltYm9sIHRhYmxlLCB0aGV5IGFyZSBhbHJlYWR5CisJZW50ZXJlZCBpbnRvIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZS4KKwkqIGNvbmZpZy9pMzg2L3RtLXN5bW1ldHJ5Lmg6ICBDbGVhbiB1cCwgaXQgaXMgbm93IG9ubHkgdXNlZCBmb3IgRHluaXguCisJUmVtb3ZlIGFsbCBjb25kaXRpb25hbHMgYW5kIGRlZmluaXRpb25zIGZvciBwdHguCisJSTM4Nl9SRUdOT19UT19TWU1NRVRSWSBtb3ZlZCB0byBoZXJlIGZyb20gc3ltbS10ZGVwLmMuCisJRml4IGFkZHJlc3NlcyBvZiBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgaW4gUkVHSVNURVJfVV9BRERSLgorCVNUT1JFX1NUUlVDVF9SRVRVUk4gbm93IGhhbmRsZXMgY2MgYW5kIGdjYyBjb252ZW50aW9ucy4KKwlGUkFNRV9DSEFJTiwgRlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT04sIEZSQU1FX1NBVkVEX1BDLAorCUlOX1NJR1RSQU1QLCBTSUdDT05URVhUX1BDX09GRlNFVCBkZWZpbmVkIHRvIG1ha2UgYmFja3RyYWNpbmcgdGhyb3VnaAorCXNpZ25hbCB0cmFtcG9saW5lIGNvZGUgd29yay4KKwkqIGNvbmZpZy9pMzg2L3htLXN5bW1ldHJ5Lmg6ICBDbGVhbiB1cCwgaXQgaXMgbm93IG9ubHkgdXNlZCBmb3IgRHluaXguCisJUmVtb3ZlIGFsbCBjb25kaXRpb25hbHMgYW5kIGRlZmluaXRpb25zIGZvciBwdHguCisJUmVtb3ZlIEtEQiBkZWZpbml0aW9ucy4KKwkqIHN5bW0tbmF0LmMgKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBGZXRjaCByZWdpc3RlcnMgYmVmb3JlCisJc3RvcmluZyB0aGVtIHRvIG9idGFpbiB2YWxpZCBmbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVycy4KKwlTdG9yZSBmcHUgcmVnaXN0ZXJzLgorCSogc3ltbS1uYXQuYyAocHJpbnRfMTE2N19jb250cm9sX3dvcmQpOiAgRHluaXggMy4xLjEgZGVmaW5lcworCUZQQV9QQ1JfQ0NfQzAgYW5kIEZQQV9QQ1JfQ0NfQzEsIGF2b2lkIGR1cGxpY2F0ZSBjYXNlIHZhbHVlLgorCSogc3ltbS1uYXQuYyAoZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzLCBjaGlsZF94ZmVyX21lbW9yeSk6CisJRml4IHR5cG9zLgorCSogc3ltbS1uYXQuYyAoY2hpbGRfcmVzdW1lKTogIFVwZGF0ZSB0eXBlIG9mIGBzaWduYWwnIHBhcmFtZXRlci4KKwkqIHN5bW0tdGRlcC5jIChJMzg2X1JFR05PX1RPX1NZTU1FVFJZKTogIE1vdmVkIHRvIHRtLXN5bW1ldHJ5LmguCisKK1R1ZSBNYXIgMjkgMjM6MDE6MzMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGEtdGRlcC5jIChocHBhX2ZpeF9jYWxsX2R1bW15KTogVXNlIGFuIGFsdGVybmF0ZSBtZXRob2QgZm9yCisJY2FsbGluZyBpbXBvcnQgc3R1YnMgZm9yIGZ1bmN0aW9ucyBpbiBzaGFyZWQgbGlicmFyaWVzLgorCitUdWUgTWFyIDI5IDIxOjE0OjA0IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQorCisJKiBjaC1leHAueTogIEltcGxlbWVudCBTSVpFKG1vZGVfbmFtZSkgYW5kIFNJWkUoZXhwcmVzc2lvbikuCisKKwkqIGNoLWxhbmcuYyAoY2hpbGxfaXNfdmFyeWluZ19zdHJ1Y3QpOiAgTWFnaWMgc3RyaW5nIGlzCisJd2FzICI8dmFyX2xlbmd0aD4iIGlzIG5vdyAiX192YXJfbGVuZ3RoIiAobW9yZSBwb3J0YWJsZSkuCisKK1R1ZSBNYXIgMjkgMTk6NDE6MzQgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS5jIChnZXRwa3QpOiBJZiB3ZSBnZXQgYSB0aW1lb3V0LCBhY3R1YWxseSByZXRyeSByYXRoZXIKKwl0aGFuIGp1c3QgZ2l2aW5nIHVwIHRoZSBmaXJzdCB0aW1lIGl0IGhhcHBlbnMuCisJKiByZW1vdGUuYzogRG9jdW1lbnQgc2VxdWVuY2UgbnVtYmVycy4KKwkocmVtb3RlX3N0b3JlX3JlZ2lzdGVycyk6IENoYW5nZSBzeW50YXggb2YgJ1AnIHJlcXVlc3Qgc28gdGhhdCBpdAorCW5ldmVyIGxvb2tzIGxpa2UgYSBzZXF1ZW5jZSBudW1iZXIuCisKK1R1ZSBNYXIgMjkgMTY6MDY6MDEgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKKworCSogb3M5a3JlYWQuYyAocmVjb3JkX21pbmltYWxfc3ltYm9sKTogYWRkIHNlY3Rpb25fb2Zmc2V0IHRvCisJcmVsb2NhdGUgbWluaW1hbCBzeW1ib2wgdGFibGUuCisJKiBvczlrcmVhZC5jIChyZWFkX21pbmltYWxfc3ltYm9scyk6IGRpdHRvLgorCSogb3M5a3JlYWQuYyAob3M5a19zeW1maWxlX2luaXQpOiBpbmNyZWFzZSBzaXplIG9mIGRiZyBhbmQgc3RiCisJZmlsZSBuYW1lcy4KKwkqIG9zOWtyZWFkLmMgKHJlYWRfb3M5a19wc3ltdGFiKTogaWYgdGhlcmUncyBubyBkYmcgZmlsZSwganVzdAorCXJldHVybi4gQWxzbyBpZiBmaWxlIGFkZHIgaXMgMCBsZWF2ZSBpdCAwLCBub3QgdG8gcmVsb2NhdGUuCisJKiByZW1vdGUtb3M5ay5jIChfaW5pdGlhbGl6ZV9yZW1vdGVfb3M5ayk6IGFkZCAnc2V0IHJlbW90ZXhvbicsCisJJ3NldCByZW1vdGV4b2ZmJyBhbmQgJ3NldCByZW1vdGVsb2cnIGNvbW1hbmRzLgorCitUdWUgTWFyIDI5IDEyOjM4OjQ1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiByZW1vdGUuYyAocmVtb3RlX3N0b3JlX3JlZ2lzdGVycyk6IEFkZCAnUCcgcmVxdWVzdCB0byBzZXQgYW4KKwlpbmRpdmlkdWFsIHJlZ2lzdGVyLgorCShyZW1vdGVfd3JpdGVfYnl0ZXMsIHJlbW90ZV9yZWFkX2J5dGVzKTogVXNlICVseCwgbm90ICV4LCB0byBwcmludAorCWEgdGFyZ2V0IGFkZHJlc3MuCisKK1NhdCBNYXIgMjYgMDc6MDU6MTggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9zcGFyYy90bS1zcGFyYy5oOiBEZWZpbmUgVVNFX1JFR0lTVEVSX05PVF9BUkcuCisJKiBzdGFic3JlYWQgKGRlZmluZV9zeW1ib2wpOiBJZiBVU0VfUkVHSVNURVJfTk9UX0FSRywgZ28gYmFjayB0bworCWNvbWJpbmluZyBhbGwgJ3AnIGFuZCAncicgcGFpcnMgaW50byBhIExPQ19SRUdQQVJNLgorCisJKiBjb21tYW5kLmMgKGRvX3NldHNob3dfY29tbWFuZCwgY2FzZSB2YXJfc3RyaW5nKTogTmV2ZXIgYWRkIGEKKwlzcGFjZSB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisJKiBORVdTOiBEb2N1bWVudCB0aGlzIGNoYW5nZS4KKwkqIC5nZGJpbml0OiBBZGQgYSBzcGFjZSB0byB0aGUgInNldCBwcm9tcHQiIGNvbW1hbmQuCisKK0ZyaSBNYXIgMjUgMTI6NDA6NDEgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqICBtMy1uYXQuYywgaTM4Nm0zLW5hdC5jLCBjb25maWcvaTM4Ni9pMzg2bTMubWg6IE1hbnkgbWlub3IKKwljaGFuZ2VzIHRvIG1ha2UgaXQgY29tcGlsZSAoaXQgZG9lc24ndCBsaW5rIHlldCkuCisKKwkqIGJ1aWxkc3ltLmMgKHN0YXJ0X3N1YmZpbGUsIHBhdGNoX3N1YmZpbGVfbmFtZXMpLCBkZW1hbmdsZS5jCisJKHNldF9kZW1hbmdsaW5nX3N0eWxlLCBzZXRfZGVtYW5nbGluZ19jb21tYW5kKTogVXNlIHNhdmVzdHJpbmcgbm90CisJc3RyZHVwLiAgV2Ugd2VyZSBub3QgZGVhbGluZyBwcm9wZXJseSB3aXRoIGEgTlVMTCByZXR1cm4gZnJvbQorCXN0cmR1cCwgYW5kIHdlcmUgbm90IGRlY2xhcmluZyBzdHJkdXAgKHRoZSBzeXN0ZW0gaGVhZGVyIG1heSBvcgorCW1heSBub3QgaGF2ZSBpdCkuCisKKwkqIHZhbHByaW50LmMgKHZhbF9wcmludCk6IFJlbW92ZSBpbmFjY3VyYXRlIGNvbW1lbnQgYWJvdXQgd2hhdAorCXR5cGVzIGNhbiBiZSBzdHViIHR5cGVzLgorCisJKiBjb25maWcvaTM4Ni9wdHgubWggKFhERVBGSUxFUyk6IEFkZCBjb3JlZGVwLm8uICBEZWxldGUgaW5mcHRyYWNlLm8uCisJKiBzeW1tLW5hdC5jIChjaGlsZF93YWl0LCBfaW5pdGlhbGl6ZV9zeW1tX25hdCwga2lsbF9pbmZlcmlvcik6CisJU3VwcGx5IGFsdGVybmF0ZSB2ZXJzaW9uIGlmIEFUVEFDSF9ERVRBQ0ggaXMgbm90IGRlZmluZWQuCisJKiBwdHg0LW5hdC5jLCBjb25maWcvaTM4Ni97bm0tcHR4NC5oLCBwdHg0Lm1oLCBwdHgubXQsIHB0eDQubXQsCisJdG0tcHR4LmgsIHRtLXB0eDQuaCwgeG0tcHR4LmgsIHhtLXB0eDQuaH06IE5ldyBmaWxlcy4KKwkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGlbMzRdODYtc2VxdWVudC1zeXN2NCogaG9zdC4KKworRnJpIE1hciAyNSAxMDoxNDowMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHBwYS10ZGVwLmMgKHNraXBfcHJvbG9ndWUpOiBEbyBub3RoaW5nIGlmIG5vdCBhdCB0aGUgYmVnaW5uaW5nCisJb2YgYSBmdW5jdGlvbi4KKwkoc2tpcF90cmFtcG9saW5lX2NvZGUpOiBSZXdyaXRlIGFuZCBhZGQgc3VwcG9ydCBmb3IgYXJndW1lbnQKKwlyZWxvY2F0aW9uIHN0dWJzIHN0dWJzLCBpbXBvcnQvZXhwb3J0IHN0dWJzLCBjYWxscyB0aHJvdWdoCisJIl9zcjRleHBvcnQiIGFuZCBjYXNjYWRlZCB0cmFtcG9saW5lcy4KKworCSogaHBwYS10ZGVwLmMgKHNraXBfcHJvbG9ndWUpOiBSZXR1cm4gInBjIiBub3QgemVybworCWlmIG5vIHVud2luZCBkZXNjcmlwdG9yIGlzIGZvdW5kLgorCisJKiB0bS1ocHBhLmggKE5VTV9SRUdTKTogQnVtcCB0byAxMjggcmVnaXN0ZXJzLgorCShSRUdJU1RFUl9OQU1FUyk6IEFkZCBlbnRyaWVzIGZvciAicmlnaHQtaGFsZiIgb2YgRlAgcmVnaXN0ZXJzLgorCShSRUdJU1RFUl9SQVdfU0laRSwgTUFYX1JFR0lTVEVSX1JBV19TSVpFKTogRG8gbm90IHRyZWF0IEZQIHJlZ3MKKwlkaWZmZXJlbnRseS4gIEFsbCByZWdpc3RlcnMgYXJlIGZvdXIgYnl0ZXMuCisJKFJFR0lTVEVSX0JZVEVTLCBSRUdJU1RFUl9CWVRFKTogU2ltcGxpZnkgbm93IHRoYXQgYWxsIHJlZ2lzdGVycyBhcmUKKwl0aGUgc2FtZSBzaXplLgorCShSRUdJU1RFUl9WSVJUVUFMX1RZUEUpOiBVc2UgYnVpbHRpbl90eXBlX2Zsb2F0IGZvciBhbGwgRlAgcmVncy4KKworCSogaHBwYS10ZGVwLmMgKHBhX3ByaW50X2ZwX3JlZyk6IFVwZGF0ZSB0byBwcmludCBldmVuIG51bWJlcmVkIEZQCisJcmVnaXN0ZXJzIGFzIGJvdGggc2luZ2xlIGFuZCBkb3VibGUgdmFsdWVzIChmZXRjaGluZyAybmQgMzJiaXQgaGFsZgorCWFzIG5lY2Vzc2FyeSkuICBBbm5vdGF0ZSBlYWNoIHJlZ2lzdGVyIHByaW50ZWQgd2l0aCBpdHMgcHJlY2lzaW9uLgorCisJKiBwYXJlYWQuYyAocmVhZF91bndpbmRfaW5mbyk6IEZpeCBvZmYtYnktb25lIGVycm9yLgorCitGcmkgTWFyIDI1IDA4OjMzOjI4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBtYWluLmMgKGNvbXBsZXRlX2NvbW1hbmQpOiBEZWFsIHdpdGggaXQgaWYgYXJnIGlzIE5VTEwuCisKK1RodSBNYXIgMjQgMDc6MTI6MDkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaCAoU0VUVVBfQVJCSVRSQVJZX0ZSQU1FKTogUmV2aXNlIGNvbW1lbnQKKwlyZWdhcmRpbmcgdXNpbmcgdGhlIFBDLS11c2luZyB0aGUgUEMgaXMgbmVjZXNzYXJ5IGFuZCBhbGwgdGhlCisJRklYTUUgY29tbWVudHMgaW4gdGhlIHdvcmxkIHdvbid0IG1ha2UgaXQgZ28gYXdheS4KKworCSogdmFsb3BzLmMgKHZhbHVlX2F0LCB2YWx1ZV9hdF9sYXp5KTogR2l2ZSBlcnJvciBpZiB3ZSBkZXJlZmVyZW5jZQorCWEgcG9pbnRlciB0byB2b2lkLgorCSogZ2RidHlwZXMuaDogRml4IGNvbW1lbnRzIHJlZ2FyZGluZyBUWVBFX0NPREVfVk9JRC4KKwkqIHN0YWJzcmVhZC5jOiBVc2UgMSwgbm90IDAsIGZvciBUWVBFX0xFTkdUSCBvZiB2b2lkIHR5cGVzLgorCisJKiBzdGFic3JlYWQuYyAocGF0Y2hfYmxvY2tfc3RhYnMpOiBBZGQgY29tbWVudCBhYm91dCB3aGF0IGhhcHBlbnMKKwlpZiB0aGUgZGVmaW5pdGlvbiBpcyBpbiBhbm90aGVyIGNvbXBpbGF0aW9uIHVuaXQgZnJvbSB0aGUgc3RhYi4KKworCSogZGJ4cmVhZC5jIChlbmRfcHN5bXRhYik6IEFkZCBjb21tZW50IGFib3V0IGVtcHR5IHBzeW10YWJzLgorCitXZWQgTWFyIDIzIDA3OjUwOjMzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBtYWluLmMgKGNvbXBsZXRlX2NvbW1hbmQpOiBOZXcgY29tbWFuZCwgZnJvbSBSaWNrIFNsYWRrZXkKKwk8anJzQHdvcmxkLnN0ZC5jb20+LgorCShzeW1ib2xfY29tcGxldGlvbl9mdW5jdGlvbik6IERvbid0IGRlY2xhcmUgcmxfcG9pbnQgYW5kCisJcmxfbGluZV9idWZmZXI7IHRoZXkgYXJlIG5vdyBkZWNsYXJlZCBpbiByZWFkbGluZS5oLgorCShzaG93X2NvbW1hbmRzKTogRG9uJ3QgZGVjbGFyZSBoaXN0b3J5X2Jhc2U7IGl0IGlzIGRlY2xhcmVkIGluCisJaGlzdG9yeS5oLgorCSogY29tbWFuZC5jIChsb29rdXBfY21kKTogRG9uJ3QgZGVsZXRlIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisJUmV2ZXJ0cyBjaGFuZ2Ugb2YgMTQgTWF5IDE5ODkuCisKK1dlZCBNYXIgMjMgMTY6MTQ6NTIgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogbWluc3ltcy5jIChwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbCk6ICBNb3ZlIHNlY3Rpb24gZGVkdWN0aW9uCisJY29kZSBmcm9tIHByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9sX2FuZF9pbmZvKCkgdG8gaGVyZS4gIENhbGxlcnMKKwlvZiB0aGUgbGF0dGVyIGNhbiBsZWdpdGltYXRlbHkgc3VwcGx5IGEgc2VjdGlvbiBudW1iZXIgb2YgLTEuCisKK1dlZCBNYXIgMjMgMDc6NTA6MzMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYnR5cGVzLmgsIGdkYnR5cGVzLmM6IEFkZCBjb21tZW50cyByZWdhcmRpbmcgd2hldGhlciBzdGF0aWMKKwltZW1iZXIgZnVuY3Rpb25zIGhhdmUgYW4gZWxlbWVudCBpbiBhcmdzIGZvciBhIChub25leGlzdGVudCkgdGhpcworCXBvaW50ZXIuCisKK1R1ZSBNYXIgMjIgMjA6MTI6NTMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZy9wYS90bS1ocHBhby5oIChOT19QQ19TUEFDRV9RVUVVRV9SRVNUT1JFKTogRGVmaW5lLgorCisJKiBocHBhLXRkZXAuYyAoaHBwYV9wb3BfZnJhbWUpOiBEbyBub3QgcmVzdG9yZSB0aGUgUEMgc3BhY2UKKwlxdWV1ZSBpZiBOT19QQ19TUEFDRV9RVUVVRV9SRVNUT1JFIGlzIGRlZmluZWQuCisKKwkqIHN0YWJzcmVhZC5jIChSRUdfU1RSVUNUX0hBU19BRERSKTogQWNjZXB0IGFkZGl0aW9uYWwgYXJndW1lbnQKKwlmb3IgdGhlIHN0cnVjdHVyZSdzIHR5cGUuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgorCisJKiB2YWxvcHMuYyAoY2FsbF9mdW5jdGlvbl9ieV9oYW5kKTogQ2hlY2sgUkVHX1NUUlVDVF9IQVNfQUREUgorCWZvciBlYWNoIHN0cnVjdHVyZSBhcmd1bWVudCByYXRoZXIgdGhhbiBhc3N1bWluZyBpdCdzIGVpdGhlcgorCXRydWUgb3IgZmFsc2UgZm9yIGFsbCBzdHJ1Y3R1cmUgYXJndW1lbnRzLgorCisJKiBjb25maWcvcGEvdG0taHBwYS5oIChSRUdfU1RSVUNUX0hBU19BRERSKTogRGVwZW5kIG9ubHkKKwlvbiB0aGUgbGVuZ3RoIHN0cnVjdHVyZSBwYXNzZWQsIG5vdCB0aGUgY29tcGlsZXIgdXNlZC4KKworCSogY29uZmlnL3NwYXJjL3RtLXNwYXJjLmggKFJFR19TVFJVQ1RfSEFTX0FERFIpOiBBY2NlcHQgYWRkaXRpb25hbAorCWFyZ3VtZW50IGZvciB0aGUgc3RydWN0dXJlJ3MgdHlwZS4KKworVHVlIE1hciAyMiAxNToyODozMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogdmFsdWVzLmMgKHNldF9pbnRlcm5hbHZhcik6IERvbid0IHNldCB2YXItPnZhbHVlIHVudGlsIHdlIGFyZQorCXN1cmUgdGhlcmUgd29uJ3QgYmUgYW4gZXJyb3IoKS4KKworCSogcmVtb3RlLmMgKGdldF9vZmZzZXRzKTogUmVpbnN0YXRlIGNvbW1lbnQgd2hpY2ggd2FzIGluCisJcmVtb3RlX3dhaXQgYWJvdXQgdXNlIG9mIFNFQ1RfT0ZGX1RFWFQgYW5kIHNvIG9uLgorCitNb24gTWFyIDIxIDEzOjExOjMwIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogc3ltbWlzYy5jIChtYWludGVuYW5jZV9jaGVja19zeW10YWJzKTogIE5ldyBmdW5jdGlvbiB0byBjaGVjaworCWNvbnNpc3RlbmN5IG9mIHBzeW10YWJzIGFuZCBzeW10YWJzLgorCSogc3ltdGFiLmggKG1haW50ZW5hbmNlX2NoZWNrX3N5bXRhYnMpOiAgQWRkIHByb3RvdHlwZS4KKwkqIG1haW50LmM6ICBBZGQgbmV3IGBtYWludCBjaGVjay1zeW10YWJzJyBjb21tYW5kLgorCSogY29uZmlnL2kzODYvdG0taTM4NmFpeC5oLCBjb25maWcvaTM4Ni90bS1zdW4zODYuaCwKKwljb25maWcvaTM4Ni90bS1zeW1tZXRyeS5oIChSRUdJU1RFUl9DT05WRVJUX1RPX1JBVyk6ICBGaXggdHlwby4KKwkqIGNvbmZpZy9pMzg2L3RtLXN5bW1ldHJ5Lmg6ICBNYWtlIGNvbW1lbnQgaW5zaWRlICNpZiAwIGEgcmVhbAorCWNvbW1lbnQuCisJKiBjb25maWcvaTM4Ni90bS1zeW1tZXRyeS5oIChTVE9SRV9TVFJVQ1RfUkVUVVJOKTogIENhc3QgYXJndW1lbnQKKwl0byB3cml0ZV9tZW1vcnkgdG8gYXZvaWQgd2FybmluZ3MgZnJvbSBnY2MuCisJKiBjb25maWcvaTM4Ni94bS1zeW1tZXRyeS5oOiAgQWRkIG1pc3NpbmcgI2VuZGlmLgorCSogY29uZmlnL2kzODYvbm0tc3ltbWV0cnkuaCAoTk9fUFRSQUNFX0gpOiAgQWRkIGZvciBEeW5peC4KKwkqIGNvbmZpZy9pMzg2L3N5bW1ldHJ5Lm10IChUREVQRklMRVMpOiAgQWRkIGkzODYtdGRlcC5vLgorCSogY29uZmlnL2kzODYvc3ltbWV0cnkubWggKE5BVF9GSUxFLCBOQVRERVBGSUxFUyk6ICBBZGQuCisKK01vbiBNYXIgMjEgMTE6NTA6MjggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGEtdGRlcC5jIChocHBhX2ZpeF9jYWxsX2R1bW15KTogVXNlIHZhbHVlX3B0ci4KKwkoaHBwYV9wdXNoX2FyZ3VtZW50cyk6IExpa2V3aXNlLgorCitNb24gTWFyIDIxIDExOjAyOjUxIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGFscGhhLXRkZXAuYzogIEdvYnMgb2YgY2hhbmdlcyAobWFueSBpbXBvcnRlZCBmcm9tIG1pcHMtdGRlcCkgdG8KKwlpbXByb3ZlIHJlbW90ZSBkZWJ1Z2dpbmcgZWZmaWNpZW5jeS4gIEFsc28gZml4ZWQgcHJvYmxlbXMgd2l0aAorCWRvaW5nIGZ1bmN0aW9uIGNhbGxzIGZvciBwcm9ncmFtcyB3aXRoIG5vIGVudHJ5IHBvaW50cy4KKwkqIGluZmNtZC5jIChydW5fc3RhY2tfZHVtbXkpOiAgVXNlIENBTExfRFVNTVlfQUREUkVTUyBpbnN0ZWFkIG9mCisJZW50cnlfcG9pbnRfYWRkcmVzcy4KKwkqIGluZmVyaW9yLmggKFBDX0lOX0NBTExfRFVNTVkpOiAgZGl0dG8uCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3N5bWJvbCwgcGFyc2VfcHJvY2VkdXJlLCBwYXJzZV9leHRlcm5hbCwKKwlwYXJzZV9saW5lcyk6ICBQYXNzIHNlY3Rpb25fb2Zmc2V0cyBpbmZvIHRvIHRoZXNlIHJvdXRpbmVzIHNvIHRoYXQKKwl3ZSBjYW4gcmVsb2NhdGUgc3ltYm9sIHRhYmxlIGVudHJpZXMgdXBvbiByZWFkaW4uCisJKiAocHN5bXRhYl90b19zeW10YWJfMSk6ICBTZXQgc3ltdGFiLT5wcmltYXJ5IHRvIHRlbGwKKwlvYmpmaWxlX3JlbG9jYXRlIHRvIGRvIHJlbG9jYXRpb25zIGZvciBvdXIgc3ltYm9scy4KKwkqIChlY29mZl9yZWxvY2F0ZV9lZmkpOiAgTmV3IHJvdXRpbmUgdG8gcmVsb2NhdGUgYWRyIGZpZWxkIG9mIFBEUnMKKwkod2hpY2ggaGFuZyBvZmYgb2YgdGhlIHN5bWJvbCB0YWJsZSkuCisJKiBVc2UgcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2xzX2FuZF9pbmZvIGluc3RlYWQgb2YKKwlwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbHMgdG8gc3VwcGx5IHNlY3Rpb24gaW5mbyB0byBtYWtlIG1pbmltYWwKKwlzeW1ib2wgcmVsb2NhdGlvbnMgd29yay4KKwkqIG1pbnN5bXMuYyAocHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2xzX2FuZF9pbmZvKTogIElmIHNlY3Rpb24gaXMKKwktMSwgdHJ5IHRvIGRlZHVjZSBpdCBmcm9tIG1zX3R5cGUuCisJKiBvYmpmaWxlcy5jIChvYmpmaWxlX3JlbG9jYXRlKTogIFVzZSBBTExfT0JKRklMRV9TWU1UQUJTIHdoZXJlCisJYXBwcm9wcmlhdGUuICBIYW5kbGUgcmVsb2NhdGlvbiBvZiBNSVBTX0VGSSBzeW1ib2xzIHNwZWNpYWwuIEFsc28sCisJYWRkIGNvZGUgdG8gcmVsb2NhdGUgb2JqZmlsZS0+c2VjdGlvbnMgZGF0YSBzdHJ1Y3R1cmUuCisJKiByZW1vdGUuYyAoZ2V0X29mZnNldHMpOiAgVXNlIG5ldyBwcm90b2NvbCBtZXNzYWdlIHRvIGFjcXVpcmUKKwlzZWN0aW9uIG9mZnNldHMgZnJvbSB0aGUgdGFyZ2V0LgorCSogKHJlbW90ZV93YWl0KTogIEdldCByaWQgb2YgcmVsb2NhdGlvbiBzdHVmZi4gIFRoYXQncyBhbGwgaGFuZGxlZAorCWJ5IG9iamZpbGVfcmVsb2NhdGUgbm93LgorCSogY29uZmlnL2FscGhhL2FscGhhLW53Lm10IChUTV9GSUxFKTogIFVzZSB0bS1hbHBoYW53LmguCisJKiBjb25maWcvYWxwaGEvdG0tYWxwaGEuaDogIERlZmluZSBDQUxMX0RVTU1ZX0FERFJFU1MsIGFuZAorCVZNX01JTl9BRERSRVNTLgorCSogY29uZmlnL2FscGhhL3RtLWFscGhhbncuaDogIERFQ1JfUENfQUZURVJfQlJFQUs9MCwgVk1fTUlOX0FERFJFU1M9MC4KKworTW9uIE1hciAyMSAxMDowOTowNiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHByZWFkLmMgKF9pbml0aWFsaXplX2hwdXhyZWFkKTogRG9uJ3QgY2FsbCBhZGRfc3ltdGFiX2ZucyBpZgorCUhQUkVBRCBpcyBub3QgZGVmaW5lZC4KKworU3VuIE1hciAyMCAxNToyMTo1NyAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGN5Z251cy5jb20pCisKKwkqIHNwYXJjLXRkZXAuYyAoc3BhcmNfZnJhbWVfZmluZF9zYXZlX3JlZ3MpOiBVc2UgUkVHSVNURVJfUkFXX1NJWkUKKwlpbnN0ZWFkIG9mIDQuCisJKiBzcDY0LXRkZXAuYyAodGFyZ2V0X3B0cl9iaXQsIHNldF90YXJnZXRfcHRyX2JpdCk6IERlbGV0ZWQsCisJY2FuIG5vIGxvbmdlciBzZXQgdGhpcyBhdCBydW4gdGltZS4KKwkqIGNvbmZpZy9zcGFyYy9zcDY0Lm10IChTSU1GSUxFUyk6IFVzZSByZW1vdGUtc2ltLm8gbm93LgorCShUTV9DTElCUyk6IERlZmluZSB0byAtbG0sIHRoZSBzaW11bGF0b3IgdXNlcyB0aGUgc3FydCgpIGZ1bmN0aW9uLgorCSogY29uZmlnL3NwYXJjL3RtLXNwNjQuaCAoRlBTX1JFR05VTSwgQ1BTX1JFR05VTSk6IERlZmluZSAoc28KKwlzcGFyYy10ZGVwLmMgY29tcGlsZXMpLgorCShUQVJHRVRfUFRSX0JJVCk6IE11c3QgYmUgYSBjb25zdGFudCBub3csIGZpeCBhdCA2NC4KKworU2F0IE1hciAxOSAwODo1MToxMiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL202OGsve2Npc2NvLm10LHRtLWNpc2NvLmh9OiBOZXcgZmlsZXMuCisJKiBNYWtlZmlsZS5pbiAoQUxMUEFSQU0sIEFMTENPTkZJRyk6IEFkZCB0aGVtLgorCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgbTY4Ki1jaXNjbyotKi4KKworCSogTWFrZWZpbGUuaW4gKFRBR1MpOiBVc2UgdmFyaWFibGVzIGRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZworCWZpbmQsIHRvIGxvY2F0ZSBUTV9GSUxFLCBYTV9GSUxFLCBhbmQgTkFUX0ZJTEUuICBUaGlzIGlzIGZhc3RlcgorCWFuZCBtZWFucyB0aGF0IHRoZXNlIGZpbGVuYW1lcyBubyBsb25nZXIgbmVlZCBiZSB1bmlxdWUgYWNyb3NzIGFsbAorCXRoZSBjb25maWcvKiBkaXJlY3Rvcmllcy4KKwkqIGNvbmZpZ3VyZS5pbjogUHV0IHRoZSBjb25maWcvKi8gaW50byBUTV9GSUxFLCBldGMuCisKKwkqIG02OGstc3R1Yi5jIChjb21wdXRlU2lnbmFsKTogUmV0dXJuIFNJR0ZQRSwgbm90IFNJR1VSRywgZm9yIGNoaworCWFuZCB0cmFwdiBleGNlcHRpb25zLgorCisJKiB0YXJnZXQuaCAoc3RydWN0IHNlY3Rpb25fdGFibGUpLCBvYmpmaWxlcy5oIChzdHJ1Y3Qgb2JqX3NlY3Rpb24pOgorCUNoYW5nZSBuYW1lIG9mIGZpZWxkIHNlY19wdHIgdG8gdGhlX2JmZF9zZWN0aW9uLiAgTW9yZSBtbmVtb25pYworCWFuZCBhdm9pZHMgdGhlIChzb3J0IG9mLCBmb3IgdGhlIHB0eCBjb21waWxlcikgbmFtZSBjbGFzaCB3aXRoCisJdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuCisJKiBleGVjLmMsIHhjb2ZmZXhlYy5jLCBzcGFyYy10ZGVwLmMsIHJzNjAwMC1uYXQuYywgb3Nmc29saWIuYywKKwlzb2xpYi5jLCBpcml4NS1uYXQuYywgb2JqZmlsZXMuYywgcmVtb3RlLmM6IENoYW5nZSB1c2Vycy4KKworCSogdXRpbHMuYzogSW5jbHVkZSByZWFkbGluZS5oLgorCSogTWFrZWZpbGUuaW4gKHV0aWxzLm8pOiBBZGQgZGVwZW5kZW5jeS4KKworCSogcmVtb3RlLmMgKGdldHBrdCk6IEFkZCBzdXBwb3J0IGZvciBydW4tbGVuZ3RoIGVuY29kaW5nLgorCitGcmkgTWFyIDE4IDE5OjExOjE1IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwkqIHV0aWxzLmMgKHByb21wdF9mb3JfY29udGludWUpOiBDYWxsIHJlYWRsaW5lLCBub3QgZ2RiX3JlYWRsaW5lLgorCitGcmkgTWFyIDE4IDEwOjI1OjU1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBkc3RyZWFkLmMgKHJlY29yZF9taW5pbWFsX3N5bWJvbCk6IE5ldyBhcmcgb2JqZmlsZS4gIFBhc3MgaXQgdG8KKwlwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbC4KKwlDYWxsZXJzOiBQYXNzIGl0LgorCisJKiByZWdleC5jIChFWFRFTkRfQlVGRkVSKTogQWRqdXN0IHBvaW50ZXJzIHdpdGhpbiBidWZmZXIgYnkKKwljb21wdXRpbmcgdGhlaXIgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBvbGQgYnVmZmVyIGFuZCBhZGRpbmcKKwl0byB0aGUgbmV3IGJ1ZmZlciwgcmF0aGVyIHRoYW4gYnkgYXNzdW1pbmcgd2UgY2FuIGFkZCB0aGUKKwlkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG9sZCBidWZmZXIgYW5kIHRoZSBuZXcgYnVmZmVyIChpdCBtaWdodCBub3QKKwlmaXQgaW4gYW4gaW50KS4gIE1lcmdlIGluIGNvc21ldGljIGRpZmZlcmVuY2VzIGZyb20gZW1hY3MgcmVnZXguYworCXZlcnNpb24gb2YgdGhpcyBtYWNyby4KKworV2VkIE1hciAxNiAxNToyODo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsLW9ubHkpOiBGaXggdXNlIG9mIHByb2dyYW1fdHJhbnNmb3JtX25hbWUuCisKK1dlZCBNYXIgMTYgMDc6MTg6NDMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHByaW50Y21kLmM6IFJlbW92ZSAic2V0IHByaW50IGZhc3Qtc3ltYm9saWMtYWRkciBvZmYiIGNvbW1hbmQuCisJVGhlIGJ1ZyB3aGljaCBpdCB3b3JrZWQgYXJvdW5kIHdhcyBmaXhlZCBvbiAyNSBGZWIgOTQgaW4gY29mZnJlYWQuYywKKwlzbyBJJ20gbnVraW5nIHRoZSBjb21tYW5kLgorCSogc3ltdGFiLmMgKGZpbmRfYWRkcl9zeW1ib2wpOiBDb21tZW50IG91dCwgbm8gbG9uZ2VyIHVzZWQuCisKKwkqIG1haW4uYyAobWFpbik6IERvbid0IGluaXRfc291cmNlX3BhdGggZm9yIHRoZSAtY2QgYXJndW1lbnQuICBOb3cKKwl0aGF0IHNvdXJjZV9wYXRoIGRvZXNuJ3QgY29udGFpbiB0aGUgY3VycmVudF9kaXJlY3RvcnkgZnJvbSB3aGVuCisJR0RCIHN0YXJ0ZWQgdXAsIGluaXRfc291cmNlX3BhdGggaXMgbm8gbG9uZ2VyIHVzZWZ1bCAoYW5kIGlzCisJaGFybWZ1bCBiZWNhdXNlIGl0IGNsb2JiZXJzIGEgc291cmNlX3BhdGggc2V0IGluICRIT01FLy5nZGJpbml0KS4KKworCSogVE9ETzogUmVtb3ZlIGl0ZW0gYWJvdXQgbGluZSBudW1iZXJzIGJlaW5nIG9mZi4gIEl0IGlzIHVzZWxlc3MKKwlhbmQgY29uZnVzaW5nIHdpdGhvdXQgYSByZXByb2R1Y2libGUgdGVzdCBjYXNlIChpdCBtZW50aW9ucworCXByb2NlZWQoKSwgYnV0IEkgd2FzIGFibGUgdG8gc3RlcCB0aHJvdWdoIHByb2NlZWQgd2l0aG91dCB0cm91YmxlKS4KKworVHVlIE1hciAxNSAxMzozOToyMyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwlGb3IgU3Vub3MgNC54IHRhcmdldHMsIGVuYWJsZSBnZGIgdG8gc2V0IGJyZWFrcG9pbnRzIGluIHNoYXJlZAorCWxpYnJhcnkgZnVuY3Rpb25zIGJlZm9yZSB0aGUgZXhlY3V0YWJsZSBpcyBydW4uIFJldHJpZXZlIGR5bmFtaWMKKwlzeW1ib2xzIGZyb20gc3RyaXBwZWQgZXhlY3V0YWJsZXMuCisJKiBzeW10YWIuaCAobWluaW1hbF9zeW1ib2xfdHlwZSk6ICBBZGQgbXN0X3NvbGliX3RyYW1wb2xpbmUgdHlwZS4KKwkqIHBhcnNlLmMgKHdyaXRlX2V4cF9tc3ltYm9sKSwgc3ltbWlzYy5jIChkdW1wX21zeW1ib2xzKSwKKwlzeW10YWIuYyAobGlzdF9zeW1ib2xzKTogIEhhbmRsZSBtc3Rfc29saWJfdHJhbXBvbGluZS4KKwkqIG1pbnN5bXMuYyAobG9va3VwX21pbmltYWxfc3ltYm9sKTogIEhhbmRsZSBtc3Rfc29saWJfdHJhbXBvbGluZQorCWZvciBhbGwgdGFyZ2V0cywgcmVtb3ZlIElCTTYwMDBfVEFSR0VUIGRlcGVuZGVuY2llcy4KKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfZHluYW1pY19zeW10YWIpOiAgTmV3IGZ1bmN0aW9uLgorCSogZGJ4cmVhZC5jIChkYnhfc3ltZmlsZV9yZWFkKTogIFVzZSBpdC4KKwkqIGRieHJlYWQuYyAoU0VUX05BTUVTVFJJTkcpOiAgU2V0IG5hbWVzdHJpbmcgdG8KKwkiPGJhZCBzdHJpbmcgdGFibGUgaW5kZXg+IiBpbnN0ZWFkIG9mICJmb28iIGlmIHRoZSBzdHJpbmcgaW5kZXggaXMKKwljb3JydXB0LgorCSogeGNvZmZyZWFkLmMgKHJlYWRfeGNvZmZfc3ltdGFiKTogIFVzZSBtc3Rfc29saWJfdHJhbXBvbGluZSBpbnN0ZWFkCisJb2YgbXN0X3Vua25vd24uCisJKiBzeW10YWIuYyAobGlzdF9zeW1ib2xzKTogIFRha2UgZnJvbV90dHkgYXMgcGFyYW1ldGVyIGFuZCBwYXNzIGl0CisJdG8gYnJlYWtfY29tbWFuZC4gSGFuZGxlIG1zdF9maWxlXyogbWluaW1hbCBzeW1ib2wgdHlwZXMuCisJKiBjb25maWcvaTM4Ni90bS1pMzg2YnNkLmg6IEdpdmUganVzdCBtYWNybyBuYW1lLCBub3QgYXJncywgdG8gI3VuZGVmLgorCitUdWUgTWFyIDE1IDExOjQwOjQzIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCisKKwkqIGMtZXhwLnkoeXlsZXgpOiBmaXggcG90ZW50aWFsIG1lbW9yeSBvdmVyZmxvdy4KKworVHVlIE1hciAxNSAxMDozMzoyOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZW52aXJvbi5jIChzZXRfaW5fZW52aXJvbik6IEVsaW1pbmF0ZSBzcGVjaWFsIGhhbmRsaW5nIG9mIFBBVEggYW5kCisJR05VVEFSR0VULgorCSogcHV0ZW52LmM6IFJlbW92ZWQsIGNvbmZsaWN0cyB3aXRoIHN5c3RlbSBkZWNsYXJhdGlvbiBvZgorCXB1dGVudiBvbiBSUy82MDAwIHJ1bm5pbmcgQUlYIDMuMi41LCBhbmQgYWJvdmUgY2hhbmdlIG1ha2VzIGl0CisJdW5uZWNlc3NhcnkuIAorCSogTWFrZWZpbGUuaW46IENoYW5nZSBhY2NvcmRpbmdseS4KKwkqIHByb2Nmcy5jIChwcm9jZnNfY3JlYXRlX2luZmVyaW9yKTogQ2hhbmdlIGNvbW1lbnQgYWNjb3JkaW5nbHkuCisKK1R1ZSBNYXIgMTUgMTA6MDU6MjcgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHJzNjAwMC10ZGVwLmM6IENoYW5nZSB2YWx1ZSB0byB2YWx1ZV9wdHIuCisKK1N1biBNYXIgMTMgMTc6MTk6MDMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcmVhZC5jIChyZWFkX2hwdXhfc3ltdGFiOiBDb3JyZWN0bHkgZGV0ZXJtaW5lIHRoZSBuYW1lc3BhY2UKKwlhbmQgYWRkcmVzcyBjbGFzcyBvZiBTVkFSLCBEVkFSLCBUWVBFREVGLCBUQUdERUYsIENPTlNULCBhbmQKKwlNRU1FTlVNIHN5bWJvbHMuICBEbyBub3QgaW5jbHVkZSBmdW5jdGlvbi1zY29wZWQgdmFyaWFibGVzIGluCisJdGhlIHBhcnRpYWwgc3ltYm9sIHRhYmxlLgorCitTdW4gTWFyIDEzIDA5OjQ1OjUxIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBpMzg2bTMtbmF0LmM6IEluY2x1ZGUgZmxvYXRmb3JtYXQuaC4KKwkoZ2V0X2kzODdfc3RhdGUpOiBVc2UgbWVtc2V0IG5vdCBiemVyby4KKworCSogVmVyc2lvbiA0LjEyLjMuCisKKwkqIE1ha2VmaWxlLmluOiBFbmFibGUgY29tbWVudGVkIG91dCBnZXRvcHRfaCwgYmZkX2gsIGV0Yy4gIENoYW5nZQorCWllZWUtZmxvYXQuaCB0byBmbG9hdGZvcm1hdC5oLgorCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnRfc3RyaW5nKTogSWdub3JlIGVycm9yIGlmIHRoZSBlcnJvcgorCWhhcHBlbmVkIGFmdGVyIGEgdGVybWluYXRpbmcgJ1wwJy4KKworCSogYy12YWxwcmludC5jIChjX3ZhbF9wcmludCk6IE5ldmVyIGFkZCAxIHRvIHJldHVybiB2YWx1ZSBmcm9tCisJdmFsX3ByaW50X3N0cmluZzsganVzdCByZXR1cm4gd2hhdCBpdCByZXR1cm5zLgorCisJKiB0YXJnZXQuaCAoZW51bSB0YXJnZXRfc2lnbmFsKTogQWRkIFRBUkdFVF9TSUdOQUxfRklSU1QsIGZvcgorCWxvb3BpbmcgdGhyb3VnaCBhbGwgb2YgdGhlIGVudW1zLgorCSogaW5mcnVuLmMgKHNpZ25hbHNfaW5mbyk6IFVzZSBpdC4KKworRnJpIE1hciAxMSAwODowODo1MCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbWFpbi5jIChtYWluKTogV2hlbiBwcmludGluZyB3YXJuaW5nIGFib3V0IGJhZCBiYXVkIHJhdGUsIGRvbid0CisJdXNlIHdhcm5pbmcoKTsgaXQgcmVsaWVzIG9uIGN1cnJlbnRfdGFyZ2V0IHdoaWNoIGlzbid0IHNldCB1cCB5ZXQuCisKKwkqIGJyZWFrcG9pbnQuYyAoX2luaXRpYWxpemVfYnJlYWtwb2ludCk6IFVwZGF0ZSBkb2NzdHJpbmcgZm9yCisJdGJyZWFrIHRvIG1hdGNoIHdoYXQgdGhlIGNvZGUgYWN0dWFsbHkgZG9lcy4gIERvbid0IG1lbnRpb24gdGJyZWFrCisJaW4gZG9jc3RyaW5ncyBmb3IgImVuYWJsZSBvbmNlIiBvciAiZW5hYmxlIGJyZWFrcG9pbnRzIG9uY2UiLgorCitUaHUgTWFyIDEwIDA4OjUyOjM4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzeW1maWxlLmggKEFERF9QU1lNQk9MX1ZUX1RPX0xJU1QpOiBEb24ndCBwdXQgYSBzZW1pY29sb24gYWZ0ZXIKKwl3aGlsZSAoMCkuICBUaGF0IGRlZmVhdHMgdGhlIHdob2xlIHB1cnBvc2Ugb2YgdXNpbmcgZG8gLiAuIC4gd2hpbGUgKDApLgorCSogbWRlYnVncmVhZC5jIChwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiBEb24ndCB1c2UgPzogZXhwcmVzc2lvbiBhcworCWxpc3QgZm9yIEFERF9QU1lNQk9MX1RPX0xJU1Q7IHRoZSBtYWNybyB0YWtlcyBpdHMgYWRkcmVzcyBhbmQKKwl1c2luZyBhID86IGV4cHJlc3Npb24gYXMgYW4gbHZhbHVlIGlzIG5vdCBwb3J0YWJsZS4KKworCSogc3RhYnNyZWFkLmMgKGRlZmluZV9zeW1ib2wpOiBJZiBSRUdfU1RSVUNUX0hBU19BRERSLCBhbHNvCisJY29udmVydCBhIExPQ19BUkcgdG8gYSBMT0NfUkVGX0FSRy4gIFVwZGF0ZSBjb2RlIHdoaWNoIGNvbWJpbmVzCisJJ3AnIGFuZCAncicgc3ltYm9sIGRlc2NyaXB0b3JzIGludG8gYSBzaW5nbGUgc3ltYm9sIHRvIGxvb2sgZm9yIGEKKwlMT0NfUkVGX0FSRy4KKwkqIFJFQURNRSwgY29uZmlnL3NwYXJjL3RtLXNwYXJjLmg6IFVwZGF0ZSBjb21tZW50cy4KKworV2VkIE1hciAgOSAyMTo0MzoyNCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIG1kZWJ1Z3JlYWQuYyAocGFyc2VfdHlwZSk6ICBEbyBub3QgY29tcGxhaW4gZm9yIHR5cGVzIHdpdGgKKwlhbiBgaW5kZXhOaWwnIGF1eCBpbmRleCwgdGhlc2UgYXJlIHNpbXBseSB1bmRlZmluZWQgdHlwZXMuCisJUmVtb3ZlIGluZGV4TmlsIGNoZWNrIGZyb20gY2FsbGVyIG9mIHBhcnNlX3R5cGUuCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6ICBEbyBub3QgZW50ZXIKKwlzdEdsb2JhbCwgc2NDb21tb24gc3ltYm9scyBpbnRvIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZSwgdGhlaXIKKwl2YWx1ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgY29tbW9uLCBub3QgaXRzIGFkZHJlc3MuCisJSGFuZGxlIHNjSW5pdCwgc2NGaW5pLCBzY1BEYXRhIGFuZCBzY1hEYXRhIHNlY3Rpb25zLgorCVVzZSBtaW5pbWFsIHN5bWJvbCB0eXBlIG1zdF9maWxlXyogZm9yIHN0TGFiZWwgc3ltYm9scywgaW5zdGVhZCBvZgorCW1zdF8qLgorCUVudGVyIHN0UHJvYyBzeW1ib2xzIGludG8gdGhlIGdsb2JhbF9wc3ltYm9scyBsaXN0IG9uY2UsIG5vdCBpbnRvCisJdGhlIHN0YXRpY19wc3ltYm9sc19saXN0LgorCUdldCByaWQgb2YgZHVtbXkgcHN5bXRhYiBpZiBpdCBpcyBlbXB0eSwgdG8gYWxsb3cgcHJvcGVyIGRldGVjdGlvbgorCW9mIHN0cmlwcGVkIGV4ZWN1dGFibGVzLgorCSogbWRlYnVncmVhZC5jIChjcm9zc19yZWYpOiAgQWxsb3cgY3Jvc3MgcmVmZXJlbmNlcyB0byBGb3J0cmFuCisJY29tbW9uIGJsb2Nrcy4KKworV2VkIE1hciAgOSAxNToyMzoxOSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnNyZWFkLmMgKGNvbW1vbl9ibG9ja19lbmQsIGZpeF9jb21tb25fYmxvY2spOiBTdGFzaCB0aGUKKwlzdHJ1Y3QgcGVuZGluZyAqIGluIHRoZSBTWU1CT0xfVFlQRSwgbm90IHRoZSBTWU1CT0xfTkFNRVNQQUNFLCBzbworCWFzIHRvIG5vdCBhc3N1bWUgdGhhdCBhIHBvaW50ZXIgZml0cyBpbiBhbiBlbnVtLgorCitXZWQgTWFyICA5IDE4OjU2OjM2IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCisKKwkqIG9zOWtyZWFkLmMgKGZpbGxfc3ltKTogY2hlY2sgY29tcGlsZXIgdmVyaW9uIG51bWJlciBmb3IgcHJlLQorCVVsdHJhQyBjb21waWxlci4KKwkqIG9zOWtyZWFkLmMgKG9zOWtfcHJvY2Vzc19vbmVfc3ltYm9sKTogYWRkcmVzcyBvZiBzeW1ib2wgaXMKKwlyZWxhdGl2ZSB0byBzZWN0aW9uIG5vdCBtb2R1bGUuCisJKiBzdGFic3JlYWQuYyAoZGVmaW5lX3N5bWJvbCk6IGFkZCBzeW1ib2wgdHlwZSAncycgYXMgbG9jYWwKKwlzeW1ib2wgZm9yIG9zOWsuCisJKiByZW1vdGUtb3M5ay5jOiBhZGQgY29tbWFuZCAnc2V0IG1vbml0b3JfbG9nJyB0byB0dXJuIG9uIG9yIG9mZgorCW1vbml0b3IgbG9nZ2luZy4KKwkqIHJlbW90ZS1vczlrLmM6IGZpeCBidWcgaW4gZGVsZXRlIGJyZWFrcG9pbnQsIHNpbmdsZSBzdGVwIHRyYWNlLgorCSogcmVtb3RlLW9zOWsuYzogZml4IGJ1ZyBpbiAnc2V0IHJlbW90ZWJhdWQnIGZ1bmN0aW9uLgorCSogcmVtb3RlLW9zOWsuYyAocm9tYnVnX2xpbmspOiBtaW5pbWl6ZSBjaGVja2luZyBzbyB0byBpbXByb3ZlCisJc3BlZWQuCisJKiBzeW1maWxlLmMgKHN5bWJvbF9maWxlX2NvbW1hbmQpOiBjaGVjayBpZiBmYWlsZWQgdG8gbGluaywgYWxzbyBtYWtlCisJdGhlIGNvbW1hbmQgYmUgYWJsZSB0byBhY2NlcHQgbW9yZSB0aGFuIG9uZSBmaWxlbmFtZXMuCisJKiB0YXJnZXQuYyAodGFyZ2V0X2xpbmspOiBjaGVjayBpZiBmYWlsZWQgdG8gbGluayB3aXRoIHJvbWJ1Zy4KKwkqIGNvbmZpZy9pMzg2L3RtLWkzODZvczlrLmggOiBhZGQgI2RlZmluZSBERUNSX1BDX0FGVEVSX0JSRUFLIDAuCisKK1dlZCBNYXIgIDkgMTU6MjM6MTkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS1lcy5jIChlczE4MDBfY2hpbGRfb3BzKTogRG9uJ3QgZGVjbGFyZSBpdCBzdGF0aWMuCisKK1R1ZSBNYXIgIDggMTE6NDI6MzkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9pMzg2L3RtLWkzODZ2NC5oOiBHaXZlIGp1c3QgbWFjcm8gbmFtZSwgbm90IGFyZ3MsIHRvICN1bmRlZi4KKworVHVlIE1hciAgOCAwNjo1NjoxMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZGJ4cmVhZC5jOiBOZXcgdmFyaWFibGUgbG93ZXN0X3RleHRfYWRkcmVzcy4KKwkocmVjb3JkX21pbmltYWxfc3ltYm9sLCByZWFkX2RieF9zeW10YWIpOiBTZXQgaXQuCisJKHJlYWRfZGJ4X3N5bXRhYik6IFVzZSBsb3dlc3RfdGV4dF9hZGRyZXNzICsgdGV4dF9zaXplIGluc3RlYWQgb2YKKwllbmRfb2ZfdGV4dF9hZGRyZXNzLgorCSogY29uZmlnL2dvdWxkL3RtLXBuLmg6IEFkZCBjb21tZW50IHJlZ2FyZGluZyBFTkRfT0ZfVEVYVF9ERUZBVUxULgorCisJKiBkYnhyZWFkLmMgKGVuZF9wc3ltdGFiKTogUmVtb3ZlIG9sZCBhbmQgY29tbWVudGVkIG91dAorCWNhcHBpbmdfZ2xvYmFsIGFuZCBjYXBwaW5nX3N0YXRpYy4gIEZpeCBjb21tZW50cyByZWdhcmRpbmcKKwlOX1NPX0FERFJFU1NfTUFZQkVfTUlTU0lORyB0byBtYXRjaCB0aGUgcmVhbCBuYW1lIG9mIHRoZSBtYWNyby4KKworCSogcGFyc2VyLWRlZnMuaDogQWRkICJleHRlcm4iIHRvIHN0YXJ0IG9mIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBzbworCXdlIGRvbid0IGVuZCB1cCB3aXRoIGNvbW1vbnMuCisJKiBwYXJzZS5jOiBEZWZpbmUgdGhlc2UgdmFyaWFibGVzLgorCisJKiBpcml4NS1uYXQuYyAoZmluZF9zb2xpYik6IENhc3Qgb19wYXRoIHRvIENPUkVfQUREUiB3aGVuIHVzaW5nIGl0CisJYXMgb25lLgorCitNb24gTWFyICA3IDEzOjAwOjUwIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBhbHBoYS10ZGVwLmM6IENoYW5nZSB2YWx1ZSB0byB2YWx1ZV9wdHIuCisKK1N1biBNYXIgIDYgMTc6MzY6NTMgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBzb2xpYi5jIChlbGZfbG9jYXRlX2Jhc2UpOiAgTmV3IGZ1bmN0aW9uIHRvIGxvY2F0ZSB0aGUgYWRkcmVzcworCW9mIHRoZSBkeW5hbWljIGxpbmtlcidzIHJ1bnRpbWUgc3RydWN0dXJlIGluIHRoZSBkeW5hbWljIGluZm8gc2VjdGlvbi4KKwkqIHNvbGliLmMgKGxvY2F0ZV9iYXNlKTogIFVzZSBpdCBpbnN0ZWFkIG9mIGl0ZXJhdGluZyBvdmVyIHRoZSBsaXN0CisJb2YgbWFwcGVkIGFkZHJlc3Mgc2VnbWVudHMuCisJKiBzb2xpYi5jIChsb29rX2Zvcl9iYXNlLCBiZmRfbG9va3VwX3N5bWJvbCk6ICBSZW1vdmVkLCBubyBsb25nZXIKKwluZWNlc3NhcnkuCisKK0ZyaSBNYXIgIDQgMDk6NTA6NDcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGEtdGRlcC5jIChwY19pbl9saW5rZXJfc3R1Yik6IE1vdmUgZGVjbCB0byBiZWdpbm5pbmcgb2YgZmlsZS4KKwkocGNfaW5faW50ZXJydXB0X2hhbmRsZXIpOiBOZXcgZnVuY3Rpb24uICBBbHNvIGFkZCBQQVJBTSBkZWNsLgorCShmaW5kX3Byb2NfZnJhbWVzaXplKTogRGVhbCB3aXRoIEhQVVggc2V0dGluZyBTQVZFX1NQIGJpdCBmb3IKKwlzaWduYWwgdHJhbXBvbGluZSBhbmQgaW50ZXJydXB0IHJvdXRpbmVzLgorCShmcmFtZV9zYXZlZF9wYyk6IEhhbmRsZSBzaWduYWwgdHJhbXBvbGluZXMgYW5kIGludGVycnVwdCByb3V0aW5lcy4KKwkoZnJhbWVfY2hhaW4sIGZyYW1lX2NoYWluX3ZhbGlkKTogTGlrZXdpc2UuCisJKGhwcGFfZnJhbWVfZmluZF9zYXZlZF9yZWdzKTogTGlrZXdpc2UuICBBbHNvIGRlYWwgd2l0aCBzcGVjaWFsCisJc2F2ZWQgcmVncyBjb252ZW50aW9uIGZvciBTUC4KKwkKKwkqIHRtLWhwcGFbYmhvXS5oOiBGUkFNRV9GSU5EX1NBVkVEX1BDX0lOX1NJR1RSQU1QKTogRGVmaW5lLgorCShGUkFNRV9CQVNFX0JFRk9SRV9TSUdUUkFNUCk6IERlZmluZS4KKwkoRlJBTUVfRklORF9TQVZFRF9SRUdTX0lOX1NJR1RSQU1QKTogRGVmaW5lLgorCisJKiB0bS1ocHBhaC5oIChJTl9TSUdUUkFNUCk6IERlZmluZS4KKworVGh1IE1hciAgMyAxMjo0MToxNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogY2gtZXhwLnkgKG1hdGNoX3NpbXBsZV9uYW1lX3N0cmluZyk6IEFjY2VwdCAnXycgYXMgd2VsbCBhcyBhbgorCWFscGhhYmV0aWMgY2hhcmFjdGVyIGFzIHRoZSBzdGFydCBvZiBhIG5hbWUuCisKKwkqIHNwYXJjbGl0ZS9NYWtlZmlsZS5pbiAoYWxsIGluc3RhbGwpOiBCdWlsZCBhbmQgaW5zdGFsbCBhbG9hZC4KKworCSogY29uZmlndXJlLmluOiBBY2NlcHQgaVszNF04Ni0qLSpzeXN2MzIgYmVjYXVzZSB0aGF0IGlzIHdoYXQKKwljb25maWcuZ3Vlc3MgYW5kIGNvbmZpZy5zdWIgcHJvZHVjZS4KKworCSogbWlwcy10ZGVwLmM6IENoYW5nZSB2YWx1ZSB0byB2YWx1ZV9wdHIuCisKK1dlZCBNYXIgIDIgMDk6MTc6NTUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGJyZWFrcG9pbnQuYywgYnJlYWtwb2ludC5oLCBjLXZhbHByaW50LmMsIGNoLXZhbHByaW50LmMsCisJY3AtdmFscHJpbnQuYywgZXZhbC5jLCBleHBwcmludC5jLCBmaW5kdmFyLmMsIGxhbmd1YWdlLmMsCisJb2JqZmlsZXMuaCwgaW5mY21kLmMsIHByaW50Y21kLmMsIHN0YWNrLmMsIHR5cGVwcmludC5jLAorCXZhbGFyaXRoLmMsIHZhbG9wcy5jLCB2YWxwcmludC5jLCB2YWx1ZS5oLCB2YWx1ZXMuYzogUmVwbGFjZQorCXZhbHVlIHdpdGggdmFsdWVfcHRyLiAgVGhpcyBpcyBmb3IgdGhlIHB0eCBjb21waWxlci4KKwkqIG9iamZpbGVzLmgsIHRhcmdldC5oOiBEb24ndCBkZWNsYXJlIGEgInNlY19wdHIiIGZpZWxkIHVzaW5nIGEKKwkic2VjX3B0ciIgdHlwZWRlZi4KKwkqIHN5bW0tbmF0LmM6IEFkZCBhIGJ1bmNoIG9mIHN0dWZmIGZvciBzeW1tZXRyeSdzIHB0cmFjZSBzdHVmZi4KKwkjaWYgMCBpMzg2X2Zsb2F0X2luZm8uCisJKiBzeW1tLXRkZXAuYyAocm91bmQpOiBSZW1vdmUuICBBbHNvIHJlbW92ZSBzZ3R0eWIuCisJKiBzeW1tLXRkZXAuYzogUmVtb3ZlIGxvdHMgb2Ygc3R1ZmYgd2hpY2ggZHVwbGljYXRlcyBzdHVmZiBmcm9tCisJaTM4Ni10ZGVwLmMuICBSZW1vdmUgcmVnaXN0ZXJfYWRkciBhbmQgcHR4X2NvZmZfcmVnbm9fdG9fZ2RiLgorCSogaTM4Ni10ZGVwLmMgKGkzODZfZnJhbWVfZmluZF9zYXZlZF9yZWdzKTogUHV0IGluCisJSTM4Nl9SRUdOT19UT19TWU1NRVRSWSBjaGVjayBpbiBjYXNlIGl0IGlzIG5lZWRlZCBmb3IgRHluaXgKKwlzb21lZGF5LgorCSogY29uZmlnL2kzODYvbm0tc3ltbWV0cnkuaDogQ2hhbmdlIEtFUk5FTF9VX0FERFIuICBNb3ZlCisJc3R1ZmYgZnJvbSBQVFJBQ0VfUkVBRF9SRUdTLCBQVFJBQ0VfV1JJVEVfUkVHUyBtYWNyb3MgdG8KKwlzeW1tLW5hdC5jLiAgRGVmaW5lIENISUxEX1dBSVQgYW5kIGRlY2xhcmUgY2hpbGRfd2FpdCgpLgorCSogY29uZmlnL2kzODYvdG0tc3ltbWV0cnkuaDogUmVtb3ZlIGNhbGwgZnVuY3Rpb24gc3R1ZmY7IHN0dWZmIGluCisJdG0taTM4NnYuaCBpcyBhcHBhcmVudGx5IE9LLgorCSogY29uZmlnL2kzODYveG0tc3ltbWV0cnkuaCBbX1NFUVVFTlRfXTogRGVmaW5lIEhBVkVfVEVSTUlPUyBub3QKKwlIQVZFX1RFUk1JTy4gIERlZmluZSBNRU1fRk5TX0RFQ0xBUkVELCBORUVEX1BPU0lYX1NFVFBHSUQsIGFuZAorCVVTRV9PX05PQ1RUWS4KKworV2VkIE1hciAgMiAxMTozMTowOCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIG9zZnNvbGliLmMgKHhmZXJfbGlua19tYXBfbWVtYmVyKTogVXBkYXRlIHRvIHVzZSBuZXcKKwl0YXJnZXRfcmVhZF9zdHJpbmcgaW50ZXJmYWNlLgorCitXZWQgTWFyICAyIDA5OjE3OjU1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBJbiBjaGVja2luZworCXJlbW92ZV9icmVha3BvaW50c19vbl9mb2xsb3dpbmdfc3RlcCwgY2hlY2sKKwl0aHJvdWdoX3NpZ3RyYW1wX2JyZWFrcG9pbnQgYXMgd2VsbCBhcyBzdGVwX3Jlc3VtZV9icmVha3BvaW50LgorCitUdWUgTWFyICAxIDE2OjIyOjU2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBvczlrcmVhZC5jIChvczlrX3Byb2Nlc3Nfb25lX3N5bWJvbCk6IFJlbmFtZQorCVZBUklBQkxFU19JTlNJREVfQkxPQ0sgdG8gT1M5S19WQVJJQUJMRVNfSU5TSURFX0JMT0NLLgorCSogc3ltZmlsZS5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogQ2hlY2sgZm9yIChDT1JFX0FERFIpLTEsIG5vdAorCShDT1JFX0FERFIpMCwgZnJvbSB0YXJnZXRfbGluaywgc2luY2UgdGhhdCBpcyB3aGF0IGl0IHVzZXMuCisJUHJvY2VzcyBuYW1lIGF0IGVuZCwgbm90IGR1cmluZyBwYXJzaW5nIChsaWtlIHdlIGRpZCBiZWZvcmUgS3VuZydzCisJY2hhbmdlKSwgc28gdGhhdCAtcmVhZG5vdyBhbmQgLW1hcHBlZCBjYW4gYXBwZWFyIGFueXdoZXJlLgorCU1ha2UgdGV4dF9yZWxvY2F0aW9uIGEgbG9jYWwgdmFyaWFibGUuCisJKiBjb25maWcvaTM4Ni9pMzg2b3M5ay5tdDogRml4IGNvbW1lbnQuCisJKiBNYWtlZmlsZS5pbiAoQUxMREVQRklMRVMpOiBBZGQgcmVtb3RlLW9zOWsuYy4KKwkqIG9zOWtyZWFkLmM6IFB1dCAiY29tbWVudHMiIGFmdGVyICNlbmRpZiBpbnNpZGUgLyogKi8uCisJKiBzdGFic3JlYWQuaDogQWRkIG9zOWtfc3RhYnMgdmFyaWFibGUuCisJKiBzdGFic3JlYWQuYyAoc3RhcnRfc3RhYnMpLCBvczlrcmVhZC5jIChvczlrX3Byb2Nlc3Nfb25lX3N5bWJvbCk6CisJU2V0IGl0LgorCSogc3RhYnNyZWFkLmMgKGRlZmluZV9zeW1ib2wpOiBJZiBvczlrX3N0YWJzLCBwdXQgYSAnVicgc3ltYm9sCisJZGVzY3JpcHRvciBpbiBnbG9iYWxfc3ltYm9scyBub3QgbG9jYWxfc3ltYm9scy4KKwkocmVhZF90eXBlKTogSWYgb3M5a19zdGFicywgYWNjZXB0ICdjJywgJ2knLCBhbmQgJ2InIHR5cGUKKwlkZXNjcmlwdG9ycy4KKwkocmVhZF90eXBlKTogSWYgb3M5a19zdGFicywgYWNjZXB0IGZ1bmN0aW9uIHBhcmFtZXRlcnMgYWZ0ZXIgJ2YnCisJdHlwZSBkZXNjcmlwdG9yLgorCShyZWFkX2FycmF5X3R5cGUpOiBJZiBvczlrX3N0YWJzLCBkb24ndCBleHBlY3QgaW5kZXggdHlwZSBhbmQKKwlleHBlY3QgbG93ZXIgYW5kIHVwcGVyIHRvIGJlIHNlcGFyYXRlZCBieSAnLCcgbm90ICc7Jy4KKwkocmVhZF9lbnVtX3R5cGUpOiBJZiBvczlrX3N0YWJzLCByZWFkIGEgbnVtYmVyIGJlZm9yZSB0aGUgZmlyc3QKKwllbnVtZXJhdGlvbiBjb25zdGFudC4KKwkob3M5a19pbml0X3R5cGVfdmVjdG9yKTogTmV3IGZ1bmN0aW9uLgorCShkYnhfbG9va3VwX3R5cGUpOiBDYWxsIGl0IHdoZW4gc3RhcnRpbmcgbmV3IHR5cGUgdmVjdG9yLgorCSogY29uZmlnL2kzODYvdG0taTM4Nm9zOWsuaDogRGVmaW5lIEJFTElFVkVfUENDX1BST01PVElPTi4KKwkqIChvczlrX3Byb2Nlc3Nfb25lX3N5bWJvbCk6IENhbGwgZGVmaW5lX3N5bWJvbCBub3Qgb3M5a19kZWZpbmVfc3ltYm9sLgorCSogb3M5a3N0YWIuYzogUmVtb3ZlZC4KKwkqIE1ha2VmaWxlLmluOiBVcGRhdGUgYWNjb3JkaW5nbHkuCisJKiBvYmpmaWxlcy5jIChvYmpmaWxlX3JlbG9jYXRlX2RhdGEpOiBSZW1vdmVkLgorCSogcmVtb3RlLW9zOWsuYyAocm9tYnVnX3dhaXQpOiBDYWxsIG9iamZpbGVfcmVsb2NhdGUKKwlub3Qgb2JqZmlsZV9yZWxvY2F0ZV9kYXRhLgorCSogb2JqZmlsZXMuaCwgb2JqZmlsZXMuYzogUmVtb3ZlIGZpbmRfcGNfb2JqZmlsZS4KKwkqIHJlbW90ZS1vczlrLmMgKHJvbWJ1Z193YWl0KTogQ2FsbCBmaW5kX3BjX3NlY3Rpb24gbm90CisJZmluZF9wY19vYmpmaWxlLgorCSogbWFpbi5jIChxdWl0X2NvbW1hbmQpOiBDaGVjayBpbmZlcmlvcl9waWQ7IHJldmVydCBLdW5nIGNoYW5nZS4KKwkqIHJlbW90ZS1vczlrLmMgKHJvbWJ1Z19jcmVhdGVfaW5mZXJpb3IpOiBTZXQgaW5mZXJpb3JfcGlkLgorCitUdWUgTWFyICAxIDE0OjU2OjE0IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCisKKwkqIG9zOWtyZWFkLmM6IE5ldyBmaWxlIHRvIHJlYWQgb3M5MDAwIHN0eWxlIHN5bWJvIHRhYmxlLgorCSogb3M5a3N0YWIuYzogbmV3IGZpbGUgdG8gcmVhZCBvczkwMDAgc3R5bGUgc3RhYnMuCisJKiByZW1vdGUtb3M5ay5jOiByZW1vdGUgcHJvdG9jb2wgdGFsa2luZyB0byBvczkwMDAgcm9tYnVnIG1vbml0b3IuCisJKiBvYmpmaWxlcy5jIChmaW5kX3BjX29iamZpbGUpOiBuZXcgZnVuY3Rpb24gdG8gc2VhcmNoIG9iamZpbGUKKwlmcm9tIHBjLgorCSogb2JqZmlsZXMuYyAob2JqZmlsZV9yZWxvY2F0ZV9kYXRhKTogbmV3IGZ1bmN0aW9uIHRvIHJlbG9jYXRlCisJZGF0YSBzeW1ib2xzIGluIHN5bWJvbCB0YWJsZS4KKwkqIG9iamZpbGVzLmg6IEFkZCB0d28gYXV4IGZpZWxkcyBpbiBzdHJ1Y3Qgb2JqZmlsZSB0byBoYW5kbGUKKwltdWx0aXBsZSBzeW1ib2wgdGFibGUgZmlsZXMgc2l0dWF0aW9uIGxpa2UgaW4gb3M5MDAwLgorCSogc3ltZmlsZS5jOiBDaGFuZ2Ugc28gJ3N5bWJvbC1maWxlJyBjb21tYW5kIGNhbiBoYW5kbGUgbXVsdGlwbGUKKwlmaWxlcy4gQWxzbyBjYWxsIHRhcmdldF9saW5rKCkgdG8gZ2V0IHJlbG9jYXRpb24gaW5mb3MuCisJKiB0YXJnZXQuYyAodGFyZ2V0X2xpbmspOiBuZXcgZnVuY3Rpb24gdG8gZ2V0IHJlbG9jYXRpb24gaW5mbyB3aGVuCisJYSBzeW1ib2wgZmlsZSBpcyByZXF1ZXN0ZWQgdG8gbG9hZC4KKwkqIG1haW4uYyAocXVpdF9jb21tYW5kKTogdGFrZSBvdXQgJ2luZmVyaW9yX3BpZCAhPSAwJyBjb25kaXRpb24sCisJYmVjYXVzZSBpbiBjcm9zcyBtb2RlIHRoZXJlJ3Mgbm8gaW5mZXJpb3IgcGlkLCBiaXQgdGhleSBuZWVkIHRvCisJYmUgZGV0YWNoZWQuCisJTWFrZWZpbGUuaW46IGFkZCBvczlrcmVhZC5jIG9zOWtzdGFiLmMgYW5kIC5vJ3MuCisJY29uZmlndXJlLmluOiBhZGQgaTM4Nm9zOWsgdGFyZ2V0LgorCWNvbmZpZy9pMzg2L2kzODZvczlrLm10OiBuZXcgYWRkLgorCWNvbmZpZy9pMzg2L3RtLWkzODZvczlrLmg6IG5ldyBhZGQuCisKK1R1ZSBNYXIgIDEgMTM6MTY6MTAgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb25maWcvc3BhcmMvdG0tc3VuNHNvbDIuaCAoSU5fU0lHVFJBTVApOiAgSGFuZGxlIHVjYnNpZ3ZlY2hhbmRsZXIuCisJKiBzcGFyYy10ZGVwLmMgKHNwYXJjX2ZyYW1lX3NhdmVkX3BjKTogIEhhbmRsZSB1Y2JzaWd2ZWNoYW5kbGVyLgorCitUdWUgTWFyICAxIDExOjU0OjExIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQorCisJKiB0YXJnZXQuYywgdGFyZ2V0LmggKHRhcmdldF9yZWFkX3N0cmluZyk6IFByb3ZpZGUgZXJyb3IgZGV0ZWN0aW9uIHRvCisJY2FsbGVyLiAgUHV0IHN0cmluZyBpbiBtYWxsb2MnZCBzcGFjZSwgc28gY2FsbGVyIG5lZWQgbm90IGltcG9zZQorCWFyYml0cmFyeSBsaW1pdHMuCisJKiBzb2xpYi5jIChmaW5kX3NvbGliKTogVXBkYXRlIHRvIHVzZSBuZXcgaW50ZXJmYWNlLgorCSogaXJpeDUtbmF0LmMgKGZpbmRfc29saWIpOiBSZWFkIG9fcGF0aCBmcm9tIGluZmVyaW9yCisJKGNsZWFyX3NvbGliKTogRnJlZSBzdG9yYWdlIGZvciBvX3BhdGguCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnRfc3RyaW5nKTogQWRkIGNvbW1lbnRzLgorCitNb24gRmViIDI4IDIzOjU0OjM5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogc3ltdGFiLmMgKGRlY29kZV9saW5lXzEpOiAgSGFuZGxlIHRoZSBjYXNlIHdoZW4gc2tpcF9xdW90ZWQgZG9lcyBub3QKKwlhZHZhbmNlIGBwJy4KKworTW9uIEZlYiAyOCAxMjo0MDo0NiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogdmFsdWUuaCAoc3RydWN0IHZhbHVlKTogQWRkIG1vZGlmaWFibGUgZmllbGQuCisJKiB2YWx1ZXMuYyAoYWxsb2NhdGVfdmFsdWUsIHJlY29yZF9sYXRlc3RfdmFsdWUsIHZhbHVlX2NvcHkpOiBTZXQgaXQuCisJKHJlY29yZF9sYXRlc3RfdmFsdWUpOiBEb24ndCBtZXNzIHdpdGggVkFMVUVfTFZBTCBvZiB2YWx1ZS4KKwkqIHZhbG9wcy5jICh2YWx1ZV9hc3NpZ24pOiBDaGVjayBpdC4gIFJld29yZCBleGlzdGluZyBlcnJvcgorCW1lc3NhZ2Ugb24gbm90X2x2YWwuCisKKwkqIG1pcHMtdGRlcC5jIChtaXBzX3N0ZXBfc2tpcHNfZGVsYXkpLCBjb25maWcvbWlwcy90bS1taXBzLmgKKwkoU1RFUF9TS0lQU19ERUxBWSk6IEFkZGVkLgorCSogaW5mcnVuLmMgKHByb2NlZWQpIFtTVEVQX1NLSVBTX0RFTEFZXTogQ2hlY2sgZm9yIGEgYnJlYWtwb2ludCBpbgorCXRoZSBkZWxheSBzbG90LgorCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnRfc3RyaW5nKTogSWYgZXJyY29kZSBpcyBzZXQsIGFsd2F5cyBwcmludAorCWFuIGVycm9yLCByZWdhcmRsZXNzIG9mIGZvcmNlX2VsbGlwc2lzLiAgSW4gdGhlIG5vbi1FSU8gY2FzZSwKKwlqdXN0IHByaW50IHRoZSBlcnJvciBtZXNzYWdlIHJhdGhlciB0aGFuIGNhbGxpbmcgZXJyb3IoKS4gIERvbid0CisJYWNjZXNzICooYnVmcHRyLTEpIGlmIGJ1ZnB0ciBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIuCisJV2hlbiBsb29raW5nIGZvciAnXDAnLCBkb24ndCBpbmNyZW1lbnQgYnVmcHRyIGFuZCBhZGRyIGlmIGJ1ZnB0cgorCXN0YXJ0ZWQgb3V0IGFscmVhZHkgYXQgbGltaXQuICBJZiBhbiBlcnJvciBoYXBwZW5zIG9uIGZldGNoaW5nIHRoZQorCWZpcnN0IGNoYXJhY3RlciwgZG9uJ3QgcHJpbnQgdGhlIHN0cmluZy4KKworU3VuIEZlYiAyNyAyMTowNTowNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL202OGsvdG0tYXBvbGxvNjhiLmg6IFJlbW92ZSBIQVZFXzY4ODgxIGRlZmluZTsgaXQgaXMKKwlvYnNvbGV0ZS4gCisKKwkqIGkzODctdGRlcC5jLCBpMzg2LXRkZXAuYyBpMzg2di1uYXQuYywgaTM4NmFpeC1uYXQuYywKKwlpMzg2bTMtbmF0LmMsIGNvbmZpZy9tNjhrL3RtLW02OGsuaCwgaTk2MC10ZGVwLmMKKwljb25maWcvaTk2MC90bS1pOTYwLmgsIHJlbW90ZS1uaW5keS5jLCBjb25maWcvbTg4ay90bS1tODhrLmgsCisJbTg4ay10ZGVwLmM6IFVzZSBmbG9hdGZvcm1hdC5oIGluc3RlYWQgb2YgaWVlZS1mbG9hdC5oLgorCSogc3BhcmMtdGRlcC5jOiBSZW1vdmUgbm93LW9ic29sZXRlIGllZWUtZmxvYXQuaCBzdHVmZgorCSogZmluZHZhci5jOiBVcGRhdGUgY29tbWVudCByZWdhcmRpbmcgaWVlZS1mbG9hdC5oLgorCitTdW4gRmViIDI3IDIxOjM5OjQ4IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY29uZmlnL2kzODYvdG0taTM4NnY0LmggKEkzODZWNF9TSUdUUkFNUF9TQVZFRF9QQywgSU5fU0lHVFJBTVAsCisJRlJBTUVfQ0hBSU4sIEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OLCBGUkFNRV9TQVZFRF9QQyk6CisJRGVmaW5lIHRvIG1ha2UgYmFja3RyYWNpbmcgdGhyb3VnaCB0aGUgdmFyaW91cyBzaWd0cmFtcCBoYW5kbGVycworCXdvcmsuCisJKiBpMzg2LXRkZXAuYyAoaTM4NnY0X3NpZ3RyYW1wX3NhdmVkX3BjKTogIE5ldyByb3V0aW5lIHRvIGZldGNoCisJdGhlIHNhdmVkIHBjIGZyb20gdWNvbnRleHQgb24gdGhlIHN0YWNrIGZvciBTVlI0IHNpZ25hbCBoYW5kbGluZy4KKworRnJpIEZlYiAyNSAwOTo0MToxMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLmMsIHJlbW90ZS1tb24uYywgcmVtb3RlLXV0aWxzLmMsIHJlbW90ZS11dGlscy5oLAorCXRhcmdldC5oLCByZW1vdGUtZXMuYywgcmVtb3RlLW5pbmR5LmM6IERvbid0IHNldCBiYXVkIHJhdGUgaWYKKwliYXVkX3JhdGUgaXMgLTEuICBSZW1vdmUgc3JfZ2V0X2JhdWRfcmF0ZSBhbmQgc3Jfc2V0X2JhdWRfcmF0ZTsKKwlqdXN0IHVzZSB0aGUgZ2xvYmFsIHZhcmlhYmxlIGl0c2VsZi4gIFdoZW4gcHJpbnRpbmcgYmF1ZCByYXRlLAorCWRvbid0IHByaW50IGEgYmF1ZCByYXRlIGlmIGJhdWRfcmF0ZSBpcyAtMS4KKworCSogY29mZnJlYWQuYyAocmVhZF9jb2ZmX3N5bXRhYik6IFBhc3MgbXN0X2ZpbGVfKiB0bworCXJlY29yZF9taW5pbWFsX3N5bWJvbCBmb3IgQ19TVEFUIHN5bWJvbHMuICBQdXQgQ19FWFQgYW5kIENfU1RBVAorCXN5bWJvbHMgaW4gdGhlIG1pbmltYWwgc3ltYm9scyByZWdhcmRsZXNzIG9mIFNEQl9UWVBFLgorCitUaHUgRmViIDI0IDA4OjMwOjMzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBicmVha3BvaW50LmggKGVudW0gYnB0eXBlKTogTmV3IHR5cGUgYnBfdGhyb3VnaF9zaWd0cmFtcC4KKwkoYnBzdGF0X3doYXRfbWFpbl9hY3Rpb24pOiBOZXcgY29kZSBCUFNUQVRfV0hBVF9USFJPVUdIX1NJR1RSQU1QLgorCSogYnJlYWtwb2ludC5jIChicHN0YXRfd2hhdCk6IFJldHVybiBCUFNUQVRfV0hBVF9USFJPVUdIX1NJR1RSQU1QCisJaWYgd2UgaGl0IGEgYnBfdGhyb3VnaF9zaWd0cmFtcCBicmVha3BvaW50LiAgUmVtb3ZlIGtsdWRnZSB3aGljaAorCWlnbm9yZWQgYnMtPnN0b3AgZm9yIGEgYnBfc3RlcF9yZXN1bWUgYnJlYWtwb2ludC4KKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IE1ha2UgYSB0aHJvdWdoX3NpZ3RyYW1wX2JyZWFrcG9pbnQKKwl3aGljaCBwZXJmb3JtcyBvbmUgKHRoZSBjaGVja19zaWd0cmFtcDIgb25lKSBvZiB0aGUgZnVuY3Rpb25zCisJd2hpY2ggaGFkIGJlZW4gaGFuZGxlZCBieSB0aGUgc3RlcF9yZXN1bWVfYnJlYWtwb2ludC4gIEZvciBlYWNoCisJdXNlIG9mIHRoZSBzdGVwX3Jlc3VtZV9icmVha3BvaW50LCBtYWtlIGl0IHN0aWxsIHVzZSB0aGUKKwlzdGVwX3Jlc3VtZV9icmVha3BvaW50LCB1c2UgdGhlIHRocm91Z2hfc2lndHJhbXBfYnJlYWtwb2ludCwgb3IKKwlvcGVyYXRlIG9uIGJvdGguCisJRGVhbCB3aXRoIEJQU1RBVF9XSEFUX1RIUk9VR0hfU0lHVFJBTVAgcmV0dXJuIGZyb20gYnBzdGF0X3doYXQuCisJV2hlbiBzZXR0aW5nIHRoZSBmcmFtZSBhZGRyZXNzIG9mIHRoZSBzdGVwIHJlc3VtZSBicmVha3BvaW50LCBzZXQKKwlpdCB0byB0aGUgYWRkcmVzcyBmb3IgZnJhbWUgKmJlZm9yZSogdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gaXMKKwlleGVjdXRlZCwgbm90IGFmdGVyLgorCisJKiBtaXBzLXRkZXAuYyAobWlwc19wcmludF9yZWdpc3Rlcik6IFByaW50IGludGVnZXJzIHVzaW5nCisJcHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCByYXRoZXIgdGhhbiBkdXBsaWNhdGluZyBhbGwgdGhlCisJQ0NfSEFTX0xPTkdfTE9ORyBhbmQgc28gb24uCisJKG1pcHNfcHVzaF9kdW1teV9mcmFtZSk6IFVzZSByZWFkX3JlZ2lzdGVyX2dlbiByYXRoZXIgdGhhbiB1c2luZworCXJlYWRfcmVnaXN0ZXIgYW5kIHRoZW4gcHV0dGluZyBpdCBiYWNrIGluIHRhcmdldCBmb3JtYXQgd2l0aAorCXN0b3JlX3Vuc2lnbmVkX2ludGVnZXIuICBJZiByZWdpc3RlcnMgYXJlIG1vcmUgdGhhbiA0IGJ5dGVzLCBnaXZlCisJYW4gZXJyb3IgcmF0aGVyIHRoYW4gaGF2ZSBzb21lIHJlZ2lzdGVycyBvdmVyd3JpdGUgb3RoZXIKKwlyZWdpc3RlcnMuCisJI2lmIDAgdW51c2VkIGluY2x1ZGUgb2Ygb3Bjb2RlL21pcHMuaC4KKworCSogc3ltZmlsZS5oOiBEb24ndCBkZWNsYXJlIGFyZ3VtZW50cyBmb3IgY29mZl9nZXRmaWxlbmFtZS4KKworCSogZGVmcy5oOiBSZXZlcnQgS3VuZyBjaGFuZ2UgcmVnYXJkaW5nIEZPUkNFX0xPTkdfTE9ORy4KKworVGh1IEZlYiAyNCAwODowNjo1MiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlndXJlLmluIChocHBhKi0qLW9zZiopOiBOZXcgY29uZmlndXJhdGlvbi4KKwkqIGNvbmZpZy9wYS9ocHBhb3NmLm10OiBOZXcgdGFyZ2V0IG1ha2VmaWxlIGZyYWdtZW50LgorCSogY29uZmlnL3BhL3RtLWhwcGFvLmg6IE5ldyB0YXJnZXQgaW5jbHVkZSBmaWxlLgorCitUaHUgRmViIDI0IDA0OjI5OjE5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZXhlYy5jIChwcmludF9zZWN0aW9uX2luZm8pOiAgUHJpbnQgZW50cnkgcG9pbnQgZm9yIGV4ZWNfYmZkIG9ubHkuCisJKiBzZXItdW5peC5jICh3YWl0X2Zvcik6ICBGaXggdHlwbyBpbiBIQVZFX1RFUk1JTyBjYXNlLgorCSogZHdhcmZyZWFkLmM6ICBSZW1vdmUgc2Vjb25kIGluY2x1c2lvbiBvZiA8c3lzL3R5cGVzLmg+LCB3aGljaAorCWNhdXNlcyBwcm9ibGVtcyBpZiA8c3lzL3R5cGVzLmg+IGhhcyBubyBtdWx0aXBsZSBpbmNsdXNpb24gcHJvdGVjdGlvbi4KKworV2VkIEZlYiAyMyAxNjoyODo1NSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiB0bS1ocHBhLmggKENBTExfRFVNTVkpOiBBZGQgdHdvIE5PUCBpbnN0cnVjdGlvbnMgdG8gdGhlIGVuZCBvZgorCXRoZSBjYWxsIGR1bW15IHRvIGF2b2lkIGtlcm5lbCBidWdzIGluIEhQVVgsIEJTRCwgYW5kIE9TRjEuCisJKENBTExfRFVNTVlfTEVOR1RIKTogQ2hhbmdlZCBhY2NvcmRpbmdseS4KKworV2VkIEZlYiAyMyAxNjoyMToyNSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBzcGFyYy1zdHViLmMgKHRyYXBfbG93KTogIE1ha2UgdHJhcCBoYW5kbGVyIHdvcmsgZm9yIGFyYml0cmFyeQorCW51bWJlcnMgb2YgcmVnaXN0ZXIgd2luZG93cy4KKworCSogc3BhcmNsaXRlL2hlbGxvLmM6ICBBZGQgZmFjdG9yaWFsIGZ1bmN0aW9uIGZvciB0ZXN0aW5nLgorCSogc2FsaWIuYzogIFVzZSBtYWNyb3MgaW5zdGVhZCBvZiBjb25zdGFudHMgZm9yIEkvTyBhZGRyZXNzZXMgdG8KKwltYWtlIDkzMSBzdXBwb3J0IGVhc2llci4KKwkqIHNwYXJjbGl0ZS5oOiAgQ2hhbmdlIGNvbnN0cmFpbnQgZm9yIExPQyB0byAickoiIHRvIGZvcmNlIHVzZSBvZgorCXJlZ2lzdGVyIGluIHN0YS9sZGEgaW5zdHJ1Y3Rpb25zLgorCitXZWQgRmViIDIzIDEwOjM5OjE4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBydGwuY3lnbnVzLmNvbSkKKworCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpOiBTZXQKKwlibG9ja19hZGRyZXNzX2Z1bmN0aW9uX3JlbGF0aXZlIGZvciBDT0ZGIGxpa2Ugd2UgZG8gZm9yIEVMRiBhbmQgU09NLgorCitTYXQgRmViIDE5IDAzOjE3OjMyIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogbWRlYnVncmVhZC5jIChuZXdfcHN5bXRhYik6ICBQYXNzIGluIHNlY3Rpb25fb2Zmc2V0cyBhbmQgc2V0CisJdGhlbSBpbiB0aGUgcHN0LgorCSogbWRlYnVncmVhZC5jIChoYW5kbGVfcHN5bWJvbF9lbnVtZXJhdG9ycyk6ICBOZXcgZnVuY3Rpb24gdG8gZW50ZXIKKwl0aGUgZW51bWVyYXRvcnMgb2YgYW4gZWNvZmYgZW51bSBpbnRvIHRoZSBwYXJ0aWFsIHN5bWJvbCB0YWJsZS4KKwkqIG1kZWJ1Z3JlYWQuYyAocGFyc2VfcGFydGlhbF9zeW1ib2xzKTogIENhbGwgaXQuCisJKiBzeW1maWxlLmMgKHJlcmVhZF9zeW1ib2xzKTogIEluaXRpYWxpemUgb2JqZmlsZS0+Kl9wc3ltYm9scy5uZXh0LgorCSogc3ltbWlzYy5jIChkdW1wX3BzeW10YWIpOiAgRml4IHR5cG8sIGNsZWFuIHVwIG91dHB1dCBvZiBzZWN0aW9uCisJb2Zmc2V0cy4gQ2FzdCBwc3ltdGFiLT5yZWFkX3N5bXRhYiB0byBQVFIgYmVmb3JlIHBhc3NpbmcgaXQgdG8KKwlnZGJfcHJpbnRfYWRkcmVzcy4KKwkqIGkzODYtdGRlcC5jIChpMzg2X3NraXBfcHJvbG9ndWUpOiAgU2tpcCBvdmVyIGluc3RydWN0aW9ucyB0aGF0CisJc2V0IHVwIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHBvaW50ZXIgaW4gcGljIGNvbXBpbGVkIGNvZGUuCisJKiBjb25maWcvbWlwcy90bS1taXBzLmggKEZJWF9DQUxMX0RVTU1ZKTogIEZvciBiaWcgZW5kaWFuIHRhcmdldHMsCisJZXJyb3IoKSBvbiBUWVBFX0NPREVfRkxUIGFyZ3VtZW50cyB3aG9zZSBzaXplIGlzIGdyZWF0ZXIgdGhhbiA4LAorCXN3YXAgYWxsIG90aGVyIFRZUEVfQ09ERV9GTFQgYXJndW1lbnRzIGFzIG1pcHNfcHVzaF9hcmd1bWVudHMKKwllbnN1cmVzIHRoYXQgZmxvYXRzIGFyZSBwcm9tb3RlZCB0byBkb3VibGVzIGJlZm9yZSB0aGV5IGFyZSBwdXNoZWQKKwlvbiB0aGUgc3RhY2suCisKK0ZyaSBGZWIgMTggMjM6MTI6NTkgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogc3BhcmNsaXRlL01ha2VmaWxlLmluLCBzcGFyY2xpdGUvc2FsaWIuYywgc3BhcmNsaXRlL3NwYXJjbGl0ZS5oOgorCUZpeHVwIGNhY2hlX29uIGFuZCBmbHVzaF9pX2NhY2hlIHNvIHRoYXQgdGhleSB3b3JrIGZvciBib3RoIHRoZQorCTkzMCBhbmQgOTMyIHByb2Nlc3NvcnMuICBSZXdyaXRlIG1vc3QgbG93IGxldmVsIGZ1bmNzICh1YXJ0CisJYWNjZXNzICYgY2FjaGUgc3R1ZmYpIHRvIHVzZSBuZXcgQVNJIGFjY2VzcyBtYWNyb3MgaW4gc3BhcmNsaXRlLmguCisJQWxzbyBtYWtlIGl0IGVhc3kgdG8gYWNjZXNzIHNlY29uZCBzZXJpYWwgcG9ydC4KKworRnJpIEZlYiAxOCAyMjoxNzozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIGhwMzAwdXgtbmF0LmM6IERvbid0IGluY2xvdWRlIDxzeXMvZGlyLmg+LCA8c3lzL2lvY3RsLmg+LCBvcgorCTxzeXMvc3RhdC5oPjsgbm90IG5lZWRlZC4KKworRnJpIEZlYiAxOCAwODoyNjoyOSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhY2suYyAocHJpbnRfZnJhbWVfaW5mbyk6IEluICJwYXRob2xvZ2ljYWwiIGNhc2UsIGRvbid0CisJZGlzdHJ1c3QgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLgorCitGcmkgRmViIDE4IDE2OjUxOjE0IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCisKKwkqIG1pcHMtdGRlcC5jIChtaXBzX3ByaW50X3JlZ2lzdGVyKTogaGFuZGxlIDY0IGJpdHMgcmVnaXN0ZXIuCisJKiB2YWxwcmludC5jIChwcmludF9sb25nZXN0KTogZml4IGEgYnVnIGluIHByaW50aW5nIDY0IGJpdHMgdmFsdWUuCisKK0ZyaSBGZWIgMTggMDg6MjY6MjkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIFZlcnNpb24gNC4xMi4yLgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvIHRoZSBzZWQgZm9yIHByb2dyYW1fdHJhbnNmb3JtX25hbWUKKwlvdXJzZWx2ZXMgaW5zdGVhZCBvZiB3b3JyeWluZyBhYm91dCBJTlNUQUxMX1hGT1JNLiAgVGhpcyBlbmFibGVzCisJdXNlcnMgdG8gb3ZlcnJpZGUgSU5TVEFMTF9QUk9HUkFNIGluIHRoZSBzdGFuZGFyZCB3YXkuCisKKwkqIE1ha2VmaWxlLmluIChjLWV4cC50YWIubywgY2gtZXhwLnRhYi5vLCBtMi1leHAudGFiLm8pOiBEb24ndAorCWRlcGVuZCBvbiBNYWtlZmlsZS5pbi4KKworCSogZGVmcy5oLCB2YWxwcmludC5jOiBNYWtlIGxvbmdlc3RfdG9faW50IGEgZnVuY3Rpb24gbm90IGEgbWFjcm8uCisJT25seSB0ZXN0IGFnYWluc3QgSU5UX01JTiBpZiBhIExPTkdFU1QgaXMgYmlnZ2VyIHRoYW4gYW4gaW50LgorCisJKiBSRUFETUU6IENoYW5nZSBHaG9zdFNjcmlwdCB0byBHaG9zdHNjcmlwdC4KKworRnJpIEZlYiAxOCAwNzozMDo1NSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3JzNjAwMC97dG0tcnM2MDAwbHlueC5oLG5tLXJzNjAwMGx5bnguaCx4bS1yczYwMDBseW54Lmh9OgorCVJlbmFtZSB0byB0bS1yczYwMDBseS5oLCBubS1yczYwMDBseS5oLCB4bS1yczYwMDBseS5oIGZvciAxNAorCWNoYXJhY3RlciBmaWxlIG5hbWVzLgorCSogTWFrZWZpbGUuaW4gKEFMTFBBUkFNKTogQWRkIHRoZXNlIGZpbGVzLgorCisJKiBjb25maWcvbWlwcy9saXR0bGVtaXBzNjQubXQ6IFJlbmFtZSB0byBtaXBzZWw2NC5tdCBmb3IgMTQKKwljaGFyYWN0ZXIgZmlsZSBuYW1lcy4KKwkqIE1ha2VmaWxlLmluOiBBZGQgS3VuZydzIG5ldyBtaXBzNjQgZmlsZXMuCisKK1RodSBGZWIgMTcgMTc6MjU6NDcgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBhZGQgbWlwczY0LSotZWxmLCBtaXBzNjQtKi1lY29mZiwgbWlwczY0ZWwtKi1lbGYsCisJbWlwczY0ZWwtKi1lY29mZiBhbmQgbWlwczY0LWJpZy0qLgorCSogZGVmcy5oOiBnZXQgcmlkIG9mIEZPUkNFX0xPTkdfTE9ORy4KKwkqIG1pcHMtdGRlcC5jIChtaXBzX2ZpbmRfc2F2ZWRfcmVncyk6IGFkZCBzZCBhbmQgc2RjMSBpbnN0cnVjdGlvbgorCXBhcnNpbmcuIENoYW5nZSByZWdpc3RlciBzaXplIHRvIGJlIE1JUFNfUkVHU0laRS4KKworVGh1IEZlYiAxNyAwOTozMDoyMiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGNvcmVsb3cuYywgZXhlYy5jLCBpcml4NS1uYXQuYywgbWlwc3JlYWQuYywgb2JqZmlsZXMuYywgCisJb3Nmc29saWIuYywgcnM2MDAwLW5hdC5jLCBzb2xpYi5jLCBzeW1maWxlLmMsIHV0aWxzLmMsIAorCXhjb2ZmZXhlYy5jOiBVc2UgYmZkX2dldF9lcnJvciBhbmQgYmZkX3NldF9lcnJvciBhbmQgbmV3IGVycm9yIG5hbWVzLgorCitGcmkgRmViIDExIDIxOjQ3OjI0IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHNwaGFnbnVtLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS1obXMuYyAocmVhZGNoYXIsIGhtc19vcGVuLCBobXNfZmV0Y2hfcmVnaXN0ZXIpOiBNYWRlIG1vcmUgcm9idXN0LgorCShyZW1vdmVfY29tbWFuZHMsIGFkZF9jb21tYW5kcyk6IEFkZC9yZW1vdmUgaG1zLWRyYWluIHdoZW4gdGFyZ2V0CisJaXMgY29ubmVjdGVkLgorCitGcmkgRmViIDExIDE2OjExOjM4IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIEFkZCBMeW54L3JzNjAwMCBzdXBwb3J0LgorCSogbHlueC1uYXQuYzogIENsZWFuIHVwIHNvbWUgU3BhcmMgc3R1ZmYuICBDbGVhbiB1cCBwdHJhY2UgZXJyb3IKKwltZXNzYWdlcy4gIEFkZCByczYwMDAgc3VwcG9ydC4gIERvbid0IHRyeSB0byBtb2RpZnkgdW53cml0YWJsZQorCXJlZ2lzdGVycy4KKwkqIHJzNjAwMC1uYXQuYzogIE1vdmUgbG90cyBvZiBuYXRpdmUgZGVwZW5kZW50IHN0dWZmIChsaWtlIGNvcmUKKwlmaWxlIHN1cHBvcnQpIGZyb20gcnM2MDAwLXRkZXAuYyAmIHhjb2ZmZXhlYy5jIHRvIGhlcmUuCisJKiByczYwMDAtdGRlcC5jOiAgTW92ZSBuYXRpdmUgZGVwZW5kZW50IHN0dWZmIHRvIG5hdC5jLgorCSogeGNvZmZleGVjLmM6ICBNb3ZlIG5hdGl2ZSBkZXBlbmRlbnQgc3R1ZmYgdG8gbmF0LmMuCisJKiBjb25maWcvcnM2MDAwL25tLXJzNjAwMC5oOiAgTW92ZSBkZWZzIG9mIFNPTElCXyogbWFjcm9zIHRvIGhlcmUKKwlmcm9tIHRtCWZpbGUuCisJKiBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oOiAgUmVtb3ZlIGRlZnMgb2YgU09MSUJfKiBmdW5jcywgY3V6IHRoZXkncmUKKwlyZWFsbHkgbmF0aXZlLgorCSogY29uZmlnL3JzNjAwMC90bS1yczYwMDBseW54LmgsIGNvbmZpZy9yczYwMDAveG0tcnM2MDAwbHlueC5oOgorCU5ldyBmaWxlcyB0byBzdXBwb3J0IEx5bngvcnM2MDAwLgorCitUdWUgRmViICA4IDAwOjMyOjI4IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogUkVBRE1FOiAgUmVtb3ZlIG5vdGUgYWJvdXQgZ2NjIHdhcm5pbmdzIG9uIGFscGhhLCB0aGVzZSBzaG91bGQgYmUKKwlnb25lIG5vdy4KKwkqIGMtZXhwLnksIGNoLWV4cC55LCBjb3JlLmMsIGNvcmVsb3cuYywgZXZhbC5jLCBmb3JrLWNoaWxkLmMsIAorCW0yLWV4cC55LCBtaW5zeW1zLmMsIG5sbXJlYWQuYywgcGFyc2UuYywgcHV0ZW52LmMsIHJlZ2V4LmMKKwlyZW1vdGUtdXRpbHMuYywgc3RhYnNyZWFkLmM6ICBJbmNsdWRlIDxzdHJpbmcuaD4uCisJKiByZWdleC5jOiAgSW5jbHVkZSAiZGVmcy5oIiwgY2hhbmdlIHJlX2NvbXAgYXJndW1lbnQgdG8gY29uc3QgY2hhciAqLgorCSogaW5mcHRyYWNlLmMgKGZldGNoX3JlZ2lzdGVyLCBzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMpOiAgQ2hhbmdlCisJcmVnYWRkciB0byB0eXBlIENPUkVfQUREUi4KKwkqIGNvbmZpZy9hbHBoYS9hbHBoYS1udy5tdCwgY29uZmlnL2FscGhhL2FscGhhLW9zZjEubXQgKE1UX0NGTEFHUyk6CisJUmVtb3ZlLCBubyBsb25nZXIgbmVjZXNzYXJ5IG5vdyB0aGF0IHdlIHVzZSBiZmRfdm1hIGZvciBhIENPUkVfQUREUi4KKworTW9uIEZlYiAgNyAwOToyMToxNyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3ltdGFiLmg6IEFsd2F5cyBkZWZpbmUgQllURV9CSVRGSUVMRCB0byBub3RoaW5nLgorCitNb24gRmViICA3IDA4OjQ0OjE3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBjb25maWcvbTY4ay97bTY4ay1lbS5tdCx0bS1tNjhrLWVtLmh9OiBSZW1vdmU7IG5vIGxvbmdlciB1c2VkLgorCSogY29uZmlndXJlLmluOiBSZW1vdmUgY29tbWVudCBhYm91dCBtNjhrLWVtLm10LgorCSogTWFrZWZpbGUuaW46IFJlbW92ZSByZWZlcmVuY2VzLgorCitNb24gRmViICA3IDA4OjIyOjQyIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBkZWZzLmggW0JGRDY0XTogVXNlIEJGRF9IT1NUXzY0X0JJVCwgbm90IG5vbmV4aXN0ZW50CisJQkZEX0hPU1RfNjRfVFlQRS4KKworU3VuIEZlYiAgNiAxNTo1NjowOSAxOTk0ICBKZWZmIExhdyAgKGxhd0B3aWxkLmNzLnV0YWguZWR1KQorCisJKiBocHJlYWQuYyAoaHB1eF9zeW1maWxlX2luaXQpOiBVc2Ugb2JqX3NvbV8qIHJhdGhlciB0aGFuIG9ial8qIHRvCisJYWNjZXNzIEJGRCBwcml2YXRlIGRhdGEuICBTZWFyY2ggZm9yIHRoZSAiJFRFWFQkIiBzcGFjZSByYXRoZXIKKwl0aGFuICIudGV4dCIuCisJKGhwcGFfc3ltX2Zucyk6IEFkZCBiZmQgdGFyZ2V0IGZsYXZvdXIgdG8gaW5pdGlhbGl6ZXIuCisKK1N1biBGZWIgIDYgMDY6NTU6MTUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHRhcmdldC5jICh0YXJnZXRfcHJlb3Blbik6IElmIHRhcmdldF9raWxsIGRvZXNuJ3QgcmVtb3ZlIHRoZQorCXRhcmdldCBmcm9tIHRoZSBzdGFjaywgdXNlIHBvcF90YXJnZXQgdG8gZG8gaXQuCisKKwkqIGNvZmZyZWFkLmMgKHByb2Nlc3NfY29mZl9zeW1ib2wsIGNhc2UgQ19UUERFRik6IERvbid0IHNldCBuYW1lCisJb2YgVFlQRV9DT0RFX1BUUiBvciBUWVBFX0NPREVfRlVOQyB0eXBlcy4gIFRoaXMgcGFyYWxsZWxzIHNpbWlsYXIKKwljaGFuZ2VzIHRvIHN0YWJzcmVhZC5jIGZyb20gc3VtbWVyIDE5OTMuCisKKwkqIHJlbW90ZS11ZGkuYyAodWRpX2ZpbGVzX2luZm8pOiBJZiBwcm9nX25hbWUgaXMgTlVMTCwganVzdCBza2lwCisJcHJpbnRpbmcgdGhlIHByb2dyYW0sIHJhdGhlciB0aGFuIHBhc3NpbmcgTlVMTCB0byBwcmludGYuCisJKHVkaV9kZXRhY2gpOiBTZXQgdWRpX3Nlc3Npb25faWQgdG8gLTEgc28gdGhhdCB1ZGlfY2xvc2UgZG9lc24ndAorCXRyeSB0byBjYWxsIFVESURpc2Nvbm5lY3QgYWdhaW4uICBQcmludCBiZXR0ZXIgbWVzc2FnZS4KKwkodWRpX2tpbGwpOiBKdXN0IGNhbGwgVURJRGlzY29ubmVjdCBvdXJzZWx2ZXMsIHJhdGhlciB0aGFuIGRvaW5nCisJaXQgdmlhIHVkaV9jbG9zZS4KKwkodWRpX2NyZWF0ZV9pbmZlcmlvcik6IElmIHVkaV9zZXNzaW9uX2lkIGlzIG5lZ2F0aXZlLCBvcGVuIGEgbmV3CisJVElQIHJhdGhlciB0aGFuIGdpdmluZyBhbiBlcnJvci4KKworCSogY29uZmlnL21pcHMvbWlwc20zLm1oLCBjb25maWcvaTM4Ni9pMzg2bTMubWgsCisJY29uZmlnL25zMzJrL25zMzJrbTMubWg6IERlZmluZSBOQVRfRklMRS4KKwkqIGNvbmZpZy9ubS1tMy5oOiBDaGFuZ2UgZ3VhcmQgZnJvbSBfT1NfTUFDSDNfSF8gYW5kIF9PU19NQUNIM19ICisJKGl0IHdhcyBpbmNvbnNpc3RlbnQgYW5kIG5hbWVzcGFjZS13cm9uZykgdG8gTk1fTTNfSC4KKwkqIG0zLW5hdC5jIChtYWNoX3JlYWxseV93YWl0KTogQ2hhbmdlIHBhcmFtZXRlciBuYW1lIHRvIG91cnN0YXR1cy4KKwkobTNfb3Blbik6IE5ldyBmdW5jdGlvbi4KKwkobTNfb3BzKTogVXNlIGl0LgorCSogVE9ETzogVXBkYXRlIE1hY2ggc2VjdGlvbi4KKworCSogTWFrZWZpbGUuaW46IFJlbW92ZSAicmFwcCIgc3R1ZmY7IGl0IGlzIHN1cGVyc2VkZWQgYnkgZ2Ric2VydmVyLgorCitTdW4gRmViICA2IDEzOjI2OjIxIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQorCisJKiBwcmludGNtZC5jIChwcmludGZfY29tbWFuZCk6ICBBZGQgbWlzc2luZyBzaW5nbGUtbGV0dGVyCisJYmFja3NsYXNoLWVzY2FwZSBzZXF1ZW5jZXMsIGFuZCBpbXByb3ZlIGVycm9yIG1lc3NhZ2UuCisKK1N1biBGZWIgIDYgMDY6NTU6MTUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvcmVsb3cuYyAoc29saWJfYWRkX3N0dWIsIGNvcmVfb3Blbik6IFBhc3MgYWRkcmVzcyBvZiBmcm9tX3R0eQorCXJhdGhlciB0aGFuIHRyeWluZyB0byBzaG92ZSBhbiBpbnQgaW50byBhIHBvaW50ZXIgYW5kIGJhY2sgb3V0CisJYWdhaW4uICBUaGlzIGF2b2lkcyBjb21waWxlciB3YXJuaW5ncy4KKworCSogZGVmcy5oIChhbGxvY2EpOiBEZWNsYXJlIGFzIHZvaWQgKiwgbm90IGNoYXIgKiwgb24gaHB1eC4KKwlEb24ndCBwcm90b3R5cGUgaXQsIGp1c3QgZGVjbGFyZSB0aGUgcmV0dXJuIHR5cGUuCisKK1N1biBGZWIgIDYgMDM6MjU6NDEgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb25maWcvaTM4Ni90bS1zdW4zODYuaCwgY29uZmlnL2kzODYvdG0tc3ltbWV0cnkuaAorCShSRUdJU1RFUl9DT05WRVJUX1RPX1JBVyk6ICBBZGQgbWlzc2luZyBiYWNrc2xhc2guCisKK1NhdCBGZWIgIDUgMDg6MDM6NDEgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS1taXBzLmMgKG1pcHNfZmV0Y2hfcmVnaXN0ZXJzKTogSWYgcmVnbm8gaXMgRlBfUkVHTlVNIG9yCisJWkVST19SRUdOVU0sIGp1c3QgcmVhZCBpdCBhcyB6ZXJvIHdpdGhvdXQgdGFsa2luZyB0byB0aGUgYm9hcmQuCisKKwkqIGNvbmZpZy9pMzg2L3RtLWkzODZhaXguaCAoUkVHSVNURVJfQ09OVkVSVF9UT19SQVcpOiBBZGQgbWlzc2luZworCWJhY2tzbGFzaC4KKwkqIGkzODYtdGRlcC5jIChpMzg2X2V4dHJhY3RfcmV0dXJuX3ZhbHVlKTogUGFzcyBUWVBFX0xFTkdUSCAodHlwZSkKKwl0byBzdG9yZV9mbG9hdGluZywgbm90IG5vbmV4aXN0ZW50IHZhcmlhYmxlIGxlbi4KKworCSogcmVtb3RlLW1pcHMuYyAobWlwc19pbnNlcnRfYnJlYWtwb2ludCwgbWlwc19yZW1vdmVfYnJlYWtwb2ludCk6CisJTmV3IGZ1bmN0aW9ucy4KKwkobWlwc19zdG9yZV93b3JkKTogQ2hhbmdlIGNhbGxpbmcgY29udmVudGlvbiB0byByZXR1cm4gZXJyb3JzLCBhbmQKKwl0byBwcm92aWRlIG9sZCBjb250ZW50cyBpZiB0aGUgY2FsbGVyIHdhbnRzIGl0LgorCShtaXBzX3hmZXJfbWVtb3J5KTogRGVhbCB3aXRoIGVycm9ycyBmcm9tIG1pcHNfc3RvcmVfd29yZC4KKwkqIGNvbmZpZy9taXBzL3RtLWlkdC5oLCBjb25maWcvbWlwcy90bS1pZHRsLmg6IFJlbW92ZSBCUkVBS1BPSU5UCisJZGVmaW5lIG5vdyB0aGF0IHJlbW90ZS1taXBzLmMgZG9lc24ndCB1c2UgQlJFQUtQT0lOVC4KKworCSogcmVtb3RlLW1pcHMuYyAobWlwc19jcmVhdGVfaW5mZXJpb3IpOiBDYWxsIHdhcm5pbmcgaWYgYXJndW1lbnRzCisJc3BlY2lmaWVkLCBhbmQgdGhlbiBleGVjdXRlICJzZXQgYXJncyIgY29tbWFuZC4gIENhbGwgZXJyb3IsIG5vdAorCW1pcHNfZXJyb3IsIGlmIGV4ZWN1dGFibGUgZmlsZSBub3Qgc3BlY2lmaWVkLgorCisJKiByZW1vdGUtZTcwMDAuYzogUmVwbGFjZSAic25vb3AiIGNvbW1hbmQgKGU3MDAwX25vZWNobykgd2l0aAorCXJlbW90ZV9kZWJ1Zy4KKworCSogY29uZmlnL3JzNjAwMC90bS1yczYwMDAuaCAoU1RPUkVfU1RSVUNUX1JFVFVSTik6IERvbid0IGNhc3QKKwl0byB1bnNpZ25lZCBpbnQuCisKK1NhdCBGZWIgIDUgMDU6Mjc6MDUgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiB2YWx1ZS5oIChwcmludF9sb25nZXN0KTogIFJlbmFtZSAidmFsdWUiIHRvICJ2YWwiIGluIHByb3RvdHlwZQorCWRlY2xhcmF0aW9uIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgZG9uJ3QgbGlrZSBhcmd1bWVudHMgd2hvc2UKKwluYW1lcyBhcmUgdGhlIHNhbWUgYXMgdHlwZXMuCisJKiByZW1vdGUuYyAocmVtb3RlX3hmZXJfbWVtb3J5KTogIENhc3QgIm15YWRkciIgdG8gdW5zaWduZWQgY2hhciAqCisJYmVmb3JlIHBhc3NpbmcgaXQgdG8gcmVtb3RlXypfYnl0ZXMuCisKK0ZyaSBGZWIgIDQgMTU6NTM6MTggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKKworCSogaDg1MDAtdGRlcC5jIChzYXZlZF9wY19hZnRlcl9jYWxsKTogVGhlIHNpemUgb2YgdGhlCisJcGMgaXMgbWVtb3J5IG1vZGVsIGRlcGVuZGVudC4gKHNlZ21lbnRlZF9jb21tYW5kLAorCXVuc2VnbWVudGVkX2NvbW1hbmQsIF9pbml0aWFsaXplX2g4NTAwX3RkZXApOiBOZXcgY29tbWFuZHMgdG8KKwljaGFuZ2UgbWVtb3J5IG1vZGVsLgorCSogcmVtb3RlLWU3MDAwLmMgKF9pbml0aWFsaXplX3JlbW90ZV9lNzAwMCk6IENoYW5nZSBuYW1lIG9mIHNub29wCisJY29tbWFuZC4KKwkqIHJlbW90ZS1obXMuYyAoaG1zX2xvYWQpOiBSZW1vdmUgYnJlYWtwb2ludHMgd2hlbiBsb2FkZWQuCisJKGhtc193YWl0KTogVXNlIG5ldyBzdGF0dXMgc3RydWN0dXJlCisJKGhtc19vcGVuKTogUHVzaCB0aGUgdGFyZ2V0IGhlcmUuIChobXNfYmVmb3JlX21haW5fbG9vcCk6IE5vdAorCWhlcmUuICAoc3VwcGx5X3ZhbCwgaG1zX2ZldGNoX3JlZ2lzdGVyLCBobXNfc3RvcmVfcmVnaXN0ZXIpOiAgQ29wZQorCXdpdGggSDgvNTAwIG5hbWVzIHRvby4gKGhtc19mZXRjaF9yZWdpc3Rlcik6IFRha2Ugb3V0IFJFR0lTVEVSX1RZUEUuCisJKiBzaC10ZGVwLmMgKHNob3dfcmVncywgaW5pdGlhbGl6ZV9zaF90ZGVwKTogTmV3IGNvbW1hbmQgdG8gcHJpbnQKKwlhbGwgcmVnaXN0ZXJzIGluIGEgY29tcGFjdCB3YXkuCisKK0ZyaSBGZWIgIDQgMDc6NDE6MTMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9yczYwMDAvdG0tcnM2MDAwLmg6IERlY2xhcmUgcnM2MDAwX3N0cnVjdF9yZXR1cm5fYWRkcmVzcworCWFzIENPUkVfQUREUiB0byBtYXRjaCBkZWZpbml0aW9uIGluIHJzNjAwMC10ZGVwLmMuCisKK0ZyaSBGZWIgIDQgMDE6MTQ6MjAgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBkd2FyZnJlYWQuYyAocHJvY2Vzc19kaWVzKTogIFNraXAgbmVzdGVkIFRBR19jb21waWxlX3VuaXQgRElFcy4KKwkqIGR3YXJmcmVhZC5jIChhZGRfcGFydGlhbF9zeW1ib2wpOiAgRG8gbm90IGVudGVyIG9wYXF1ZSBhZ2dyZWdhdGUKKwlkZWZpbml0aW9ucyBpbnRvIHRoZSBwc3ltdGFiLgorCitUaHUgRmViICAzIDEyOjM4OjU4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBtNjhrLXN0dWIuYzogVHJlYXQgbWM2ODMzMiBsaWtlIG1jNjgwMjAgbW9zdCBwbGFjZXMuICBQcm92aWRlCisJYSBzcGVjaWFsIGV4Y2VwdGlvblNpemUgZm9yIHRoZSA2ODMzMi4KKworCSogcmVtb3RlLXVkaS5jICh1ZGlfYXR0YWNoKTogSWYgbm8gYXJndW1lbnRzLCBwcmludCBlcnJvci4KKworVGh1IEZlYiAgMyAxNzozNDowNSAxOTk0ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiAgQnVtcCB0byA0LjEyLjEKKwkqIE5FV1MsIFJFQURNRTogIFVwZGF0ZSB0byBtYXRjaCA0LjEyIHJlbGVhc2UuCisKK1RodSBGZWIgIDMgMTI6Mzg6NTggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbW1hbmQuYyAoZW1wdHlfc2Z1bmMpOiBOZXcgZnVuY3Rpb24uCisJKGFkZF9zZXRfY21kKTogVXNlIGl0IGluc3RlYWQgb2Ygbm90X2p1c3RfaGVscF9jbGFzc19jb21tYW5kLgorCShub3RfanVzdF9oZWxwX2NsYXNzX2NvbW1hbmQpOiBDaGFuZ2UgY2FsbGluZyBjb252ZW50aW9uIGJhY2sgdG8KKwl3aGF0IGl0IHdhcyBiZWZvcmUgeWVzdGVyZGF5J3MgY2hhbmdlLgorCisJKiBzdGFic3JlYWQuYyAocmVhZF9zdW5fYnVpbHRpbl90eXBlKTogU2tpcCB0aGUgc2VtaWNvbG9uIGF0IHRoZSBlbmQKKwlvZiB0aGUgdHlwZSBpZiBwcmVzZW50LgorCitXZWQgRmViICAyIDExOjE2OjQ1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBwcmludGNtZC5jIChkZWNvZGVfZm9ybWF0KTogRG9uJ3QgYmxpdGhlbHkgc2V0IHRoZSBzaXplIGZvcgorCWFuIGFkZHJlc3MgdG8gJ3cnLiAgTWFrZSBpdCAnZycgb3IgJ2gnLCBkZXBlbmRpbmcgb24gVEFSR0VUX1BUUl9CSVQuCisKKwkqIGRlZnMuaDogSnVzdCB0eXBlZGVmIENPUkVfQUREUiB0byBiZmRfdm1hLiAgSW5jbHVkZSBiZmQuaC4KKwlJZiBCRkQ2NCwgbWFrZSBhIExPTkdFU1QgYSBCRkRfSE9TVF82NF9CSVQuCisJKiBkZWZzLmggKGxvbmdlc3RfdG9faW50KTogRG9uJ3QgZGVwZW5kIG9uIENDX0hBU19MT05HX0xPTkc7IGluc3RlYWQKKwlhbHdheXMganVzdCBjaGVjayBhZ2FpbnN0IElOVF9NSU4gYW5kIElOVF9NQVggKHRoaXMgYWxzbyBmaXhlcyB0aGluZ3MKKwlpZiBzaXplb2YgKGxvbmcpID4gc2l6ZW9mIChpbnQpLCBlLmcuIEFscGhhKS4KKwkqIGNvbmZpZy9wYS90bS1ocHBhLmgsIGNvbmZpZy9pMzg2L3N1bjM4Ni5oLCBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oOgorCURvbid0IGRlZmluZSBMT05HRVNUIG9yIEJVSUxUSU5fVFlQRV9MT05HRVNULgorCSogZ2RidHlwZXMuaDogUmVtb3ZlIEJVSUxUSU5fVFlQRV9MT05HRVNUIGFuZAorCUJVSUxUSU5fVFlQRV9VTlNJR05FRF9MT05HRVNULgorCSogbGFuZ3VhZ2UuaCwgYy1sYW5nLmMsIGNoLWxhbmcuYywgbTItbGFuZy5jLCBsYW5ndWFnZS5jOiBSZW1vdmUKKwlsb25nZXN0X2ludCBhbmQgbG9uZ2VzdF91bnNpZ25lZF9pbnQuCisJKiB2YWx1ZS5oIChzdHJ1Y3QgdmFsdWUpOiBKdXN0IGFsaWduIHRvIExPTkdFU1QsIHJhdGhlciB0aGFuIHdvcnJ5aW5nCisJYWJvdXQgQ0NfSEFTX0xPTkdfTE9ORy4KKwkqIHZhbGFyaXRoLmMgKHZhbHVlX2Jpbm9wKTogRmlndXJlIG91dCB0eXBlIG91cnNlbGYgYmFzZWQgb24KKwlzaXplb2YgKExPTkdFU1QpIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gQlVJTFRJTl9UWVBFX0xPTkdFU1QuICBUaGUKKwlwb2ludCBpcyB0aGF0IHdlIGRvbid0IGRlcGVuZCBvbiBDQ19IQVNfTE9OR19MT05HIGFueW1vcmUuCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnRfdHlwZV9jb2RlX2ludCk6IEp1c3QgY2FsbAorCWV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciBkaXJlY3RseSwgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaAorCXVucGFja19sb25nLgorCSogcHJpbnRjbWQuYyAoZGVjb2RlX2Zvcm1hdCk6IFJlbW92ZSBjb2RlIHdoaWNoIHdvdWxkIHNvbWV0aW1lcworCWNoYW5nZSAnZycgc2l6ZSB0byAndycgZm9yIGludGVnZXJzLiAgcHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCBoYW5kbGVzCisJcHJpbnRpbmcgaHVnZSBpbnRlZ2VycyB3ZWxsIGVub3VnaCwgdGhhbmsgeW91LgorCisJKiBjb21tYW5kLmMgKGFkZF9zZXRfY21kLCBub3RfanVzdF9oZWxwX2NsYXNzX2NvbW1hbmQpOiBDaGFuZ2UKKwl0byBtYWtlIHRoaXMgdGhlIHNmdW5jLCBub3QgY2Z1bmMsIHNpbmNlIHRoYXQgaXMgaG93IHdlIGNhbGwgaXQuCisJKiBjb21tYW5kLmg6IENvbW1lbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHNmdW5jIGFuZCBjZnVuYy4KKwkqIGRlbWFuZ2xlLmMgKHNldF9kZW1hbmdsaW5nX2NvbW1hbmQpOiBBZGQgdGhpcmQgYXJnIHNpbmNlIHRoYXQKKwlpcyBob3cgaXQgaXMgY2FsbGVkLgorCShfaW5pdGlhbGl6ZV9kZW1hbmdsZXIpOiBVc2Ugc2Z1bmMsIG5vdCBjZnVuYywgZm9yCisJc2V0X2RlbWFuZ2xpbmdfY29tbWFuZCwgc2luY2UgdGhhdCBpcyBob3cgaXQgaXMgY2FsbGVkLgorCVJlbW92ZSBzaG93X2RlbWFuZ2xpbmdfY29tbWFuZDsgaXQgaGFzIG5vIGVmZmVjdC4KKworCSogY29tbWFuZC5jIChzaGVsbF9lc2NhcGUpOiBSZXBvcnQgZXJyb3JzIGNvcnJlY3RseSAod2l0aCBlcnJvcgorCW1lc3NhZ2UgZnJvbSBzdHJlcnJvcikuCisKK1dlZCBGZWIgIDIgMTQ6MzU6NDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiB4Y29mZnJlYWQuYyAocmVhZF94Y29mZl9zeW10YWIpOiBDaGFuZ2UgQ1NFQ1RfTEVOIHRvIHVzZQorCXhfc2NubGVuLmwgcmF0aGVyIHRoYW4geF9zY25sZW4gdG8gbWF0Y2ggY29ycmVzcG9uZGluZyBjaGFuZ2UgaW4KKwljb2ZmL2ludGVybmFsLmguCisKK1dlZCBGZWIgIDIgMTE6MTY6NDUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYnR5cGVzLmgsIGNoLXR5cGVwcmludC5jLCBjaC12YWxwcmludC5jOgorCUNoYW5nZSBjb21tZW50cyByZWdhcmRpbmcgVFlQRV9DT0RFX0JPT0wuCisJKiBsYW5ndWFnZS5jIChib29sZWFuX3R5cGUpOiBBbHdheXMgcmV0dXJuIDEgZm9yIFRZUEVfQ09ERV9CT09MLAorCXJlZ2FyZGxlc3Mgb2YgdGhlIGxhbmd1YWdlLgorCSh2YWx1ZV90cnVlKTogSnVzdCBjYWxsIHZhbHVlX2xvZ2ljYWxfbm90IHJlZ2FyZGxlc3Mgb2YgbGFuZ3VhZ2UuCisJKiBjb2ZmcmVhZC5jIChjb2ZmX3JlYWRfZW51bV90eXBlKSwgc3RhYnNyZWFkLmMgKHJlYWRfZW51bV90eXBlKToKKwlSZW1vdmUgI2lmIDAnZCBjb2RlIHdoaWNoIG1ha2VzIHNvbWUgZW51bXMgVFlQRV9DT0RFX0JPT0wuCisJKiBsYW5ndWFnZS5oOiBJbXByb3ZlIGNvbW1lbnQgZm9yIGxhX2J1aWx0aW5fdHlwZV92ZWN0b3IuCisJKiBtMi1sYW5nLmMgKF9pbml0aWFsaXplX20yX2xhbmd1YWdlKTogRG9uJ3QgYWRkIGFueSBmaWVsZHMgdG8KKwlidWlsdGluX3R5cGVfbTJfYm9vbC4KKworVHVlIEZlYiAgMSAxNzoxMzozMiAxOTk0ICBLZXZpbiBCdWV0dG5lciAoa2V2QGN1am8uZ2VnLm1vdC5jb20pCisKKwkqIGNvbmZpZy9tODhrL3t0bS1kZWx0YTg4LmgsdG0tZGVsdGE4OHY0Lmh9LCBtODhrLXRkZXAuYzoKKwlEZWZpbmUgSU5fU0lHVFJBTVAgYW5kIGJhY2t0cmFjZSBjb3JyZWN0bHkgdGhyb3VnaCBzaWduYWwgaGFuZGxlcnMuCisKK1R1ZSBGZWIgIDEgMjI6MTM6MjUgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBwcm9jZnMuYyAod2FpdF9mZCk6ICBIYW5kbGUgRUlOVFIgZXJyb3IgcmV0dXJuIGZyb20gUElPQ1dTVE9QIGlvY3RsCisJYnkgcmVzdGFydGluZyB0aGUgaW9jdGwuCisKK1R1ZSBGZWIgIDEgMTY6MTY6MjUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHRhcmdldC5oICh0YXJnZXRfd2FpdCk6IEFkZCBjb21tZW50IGFib3V0IGNhbGxpbmcKKwlyZXR1cm5fdG9fdG9wX2xldmVsLgorCitUdWUgRmViICAxIDEyOjIxOjAwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29mZnJlYWQuYyAocmVhZF9vbmVfc3ltKTogYmZkX2NvZmZfc3dhcF9hdXhfaW4gbm93IHRha2VzCisJYWRkaXRpb25hbCBhcmd1bWVudHMuCisJKiB4Y29mZnJlYWQuYyAocmVhZF94Y29mZl9zeW10YWIsIHJlYWRfc3ltYm9sX2xpbmVubyk6IExpa2V3aXNlLgorCitNb24gSmFuIDMxIDE2OjEwOjQxIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIHNwYXJjLXN0dWIuYzogIFJlbW92ZSB1bm5lY2Vzc2FyeSAjaW5jbHVkZSBvZiBtZW1vcnkuaC4KKworTW9uIEphbiAzMSAxMjoxMjozNCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbWlwcy10ZGVwLmM6IFJlbW92ZSBjb2RlIHdoaWNoIHNldHMgc2F2ZWRfcmVncyBmcm9tCisJaW5pdF9leHRyYV9mcmFtZV9pbmZvIGFuZCBwdXQgaXQgaW4gbmV3IGZ1bmN0aW9uIG1pcHNfZmluZF9zYXZlZF9yZWdzLgorCShSRUFEX0ZSQU1FX1JFRyk6IFJlbW92ZSBtYWNybyBhbmQgcmVwbGFjZSB1c2VzIHdpdGggdGhlIGV4cGFuc2lvbi4KKwkqIG1pcHMtdGRlcC5jLCBjb25maWcvbWlwcy90bS1taXBzLmg6IFdoZW4gZXhhbWluaW5nIC0+c2F2ZWRfcmVncywKKwljaGVjayBpZiBpdCBpcyBOVUxMIGFuZCBjYWxsIG1pcHNfZmluZF9zYXZlZF9yZWdzIGlmIHNvLgorCisJKiByZW1vdGUtbWlwcy5jOiBVc2UgdW5maWx0ZXJlZCwgbm90IGZpbHRlcmVkLCBvdXRwdXQgbW9zdCBwbGFjZXMuCisKKwkqIGJsb2NrZnJhbWUuYyAoZ2V0X3ByZXZfZnJhbWVfaW5mbyk6IERldGVjdCBhbmQgc3RvcCBhbiBpbmZpbml0ZQorCWJhY2t0cmFjZS4gIFJldmlzZSBjb21tZW50cy4KKworTW9uIEphbiAzMSAwOTo0MDozMyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIG1kZWJ1Z3JlYWQuYyAocGFyc2VfcHJvY2VkdXJlKTogIFJlbW92ZSBfc2lndHJhbXAga2x1ZGdlcyBmb3IKKwlhbHBoYSBhbmQgaXJpeC4gVGhlIF9zaWd0cmFtcCBjYXNlIGhhcyB0byBiZSBoYW5kbGVkIHByb3Blcmx5CisJaW4gdGhlIHRkZXAgZmlsZXMgaWYgd2UgaGF2ZSBubyBlY29mZiBkZWJ1Z2dpbmcgaW5mby4KKwkqIGFscGhhLXRkZXAuYyAoYWxwaGFfZnJhbWVfc2F2ZWRfcGMsIGFscGhhX2ZyYW1lX2NoYWluKSwKKwltaXBzLXRkZXAuYyAobWlwc19mcmFtZV9zYXZlZF9wYyk6ICBIYW5kbGUgc2lnbmFsIGhhbmRsZXIgZnJhbWVzCisJd2l0aG91dCBQQ19SRUdOVU0ga2x1ZGdlLgorCSogbWRlYnVncmVhZC5jIChmaXh1cF9zaWd0cmFtcCksIG1pcHMtdGRlcC5jIChyZWFkX25leHRfZnJhbWVfcmVnKToKKwlDbGVhbiB1cCBoYW5kbGluZyBvZiBtaXBzIHNpZ3RyYW1wIGZyYW1lcywgaW1wcm92ZSBjb21tZW50cy4KKworU2F0IEphbiAyOSAyMzoyNTo1NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogcGFyZWFkLmMgKHJlYWRfdW53aW5kX2luZm8pOiBGaXggdHlwby4KKworCSogcGFyZWFkLmMgKHBhX3N5bXRhYl9yZWFkKTogVXBkYXRlIHRoZSAiY2hlY2tfc3RyYW5nZV9uYW1lcyIKKwlmaWx0ZXIgdG8gbWF0Y2ggR0NDJ3MgY3VycmVudCBvdXRwdXQuICBGaWx0ZXIgb3V0IHNlY3Rpb24gc3ltYm9scworCSh3aGljaCB0aGUgSFAgbGlua2VyIHNvbWV0aW1lcyBwdXRzIGluIHRoZSB3cm9uZyBwbGFjZSkuCisKK1NhdCBKYW4gMjkgMDc6NDQ6NTkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIHNlcmlhbC5oIChTRVJJQUxfU0VUX1RUWV9TVEFURSk6IENvbW1lbnQgcmV0dXJuIHZhbHVlLgorCisJKiBNYWtlZmlsZS5pbiAoVEFHUyk6IEp1c3QgZWNobyBvbmUgbGluZSwgcmF0aGVyIHRoYW4gdGhlIHdob2xlIHRoaW5nLgorCisJKiBNYWtlZmlsZS5pbjogUmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIHNwYXJjbHktbmF0LmMuCisKKwkqIE1ha2VmaWxlLmluIChIRklMRVNfTk9fU1JDRElSKTogSW5jbHVkZSBkY2FjaGUuaCByZW1vdGUtdXRpbHMuaAorCXJlbW90ZS1zaW0uaCBkaXJlY3RseSwgcmF0aGVyIHRoYW4gdmlhICQocmVtb3RlX3V0aWxzX2gpLiAgVGhpcyBhdm9pZHMKKwlkdXBsaWNhdGluZyBzZXJpYWwuaCBhbmQgdGFyZ2V0LmguCisKKwkqIE1ha2VmaWxlLmluOiBEb24ndCBzZXQgTV9JTlNUQUxMIGFuZCBNX1VOSU5TVEFMTC4gIFRoZXNlIHZhcmlhYmxlcworCWFyZSBub3QgdXNlZCBhbnl3aGVyZSAoYSA1IE9jdCAxOTkzIGNoYW5nZSByZW1vdmVkIHRoZSB1c2VzKS4KKworCSogY29uZmlnL202OGsvbW9uaXRvci5tdCAoVERFUEZJTEUpOiBBZGQgcmVtb3RlLWVzLm8uCisJKiBjb25maWcvbTY4ay9lczE4MDAubXQ6IEFkZCBjb21tZW50LgorCSogcmVtb3RlLWVzLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHVwZGF0ZSB0byBjdXJyZW50IGNvbnZlbnRpb25zLgorCisJKiBzZXItdW5peC5jICh3YWl0X2ZvciwgaGFyZHdpcmVfcmVhZGNoYXIpIFtIQVZFX1RFUk1JTywgSEFWRV9URVJNSU9TXToKKwlJZiB0aGUgdGltZW91dCBpcyB0b28gYmlnIHRvIGZpdCBpbiBjX2NjW1ZUSU1FXSwgdGhlbiBkbyBtdWx0aXBsZSByZWFkcworCXRvIGFjaGlldmUgdGhlIGRlc2lyZWQgdGltZW91dC4KKwkqIHNlcmlhbC5oIChzZXJpYWxfdCk6IEFkZCBmaWVsZCB0aW1lb3V0X3JlbWFpbmluZy4KKworRnJpIEphbiAyOCAwODo0NTowMiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogYy1leHAueSAoeXlsZXgpOiBSZWVuYWJsZSBuZXN0ZWQgdHlwZSBjb2RlLgorCitGcmkgSmFuIDI4IDE1OjQwOjMzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBhMjlrLXRkZXAuYyAoZXhhbWluZV90YWcpOiBBZGQgY29tbWVudCByZWdhcmRpbmcgYXJnY291bnQuCisKKwkqIHJlbW90ZS1taXBzLmMgKG1pcHNfb3BzKTogRml4IGRvY3N0cmluZy4KKworCSogcmVtb3RlLWJ1Zy5jIChidWdfb3BzKTogUmVtb3ZlIHNwdXJpb3VzIG5ld2xpbmUgZnJvbSBkb2NzdHJpbmcuCisKKwkqIGNvbmZpZy9tNjhrL3RtLW1vbml0b3IuaDogQ2hhbmdlcyB0byBicmluZyB0aGlzIGludG8gYWNjb3JkYW5jZQorCXdpdGggdGhlIG9sZCB0bS1tNjhrLWVtLmg6CisJKEdEQklOSVRfRklMRU5BTUUsIERFRkFVTFRfUFJPTVBUKTogUmVtb3ZlLgorCShIQVZFXzY4ODgxKTogRG9uJ3QgdW5kZWZpbmU7IEhBVkVfNjg4ODEgaXMgb2Jzb2xldGUuCisJKFJFR0lTVEVSX05BTUVTKTogRG9uJ3QgbXVjayB3aXRoIGl0OyB3aGF0IHRtLW02OGsuaCBoYXMgaXMgZmluZS4KKwlBZGQgRklYTUUgcmVnYXJkaW5nIEdFVF9MT05HSk1QX1RBUkdFVC4KKworCSogcmVtb3RlLXVkaS5jICh1ZGlfY2xvc2UsIHVkaV9kZXRhY2gsIHVkaV9raWxsKTogQWRkIGNvbW1lbnRzLgorCSogaW5mcHRyYWNlLmMgKGtpbGxfaW5mZXJpb3IpOiBBZGQgY29tbWVudHMuCisJKiBtYWluLmMgKHF1aXRfY29tbWFuZCk6IENhbGwgdGFyZ2V0X2Nsb3NlIGFmdGVyIHdlIGtpbGwgb3IKKwlkZXRhY2guCisJKiByZW1vdGUtdWRpLmMgKHVkaV9jbG9zZSk6IERvbid0IGVycm9yKCkgaWYgUVVJVFRJTkcuCisKK0ZyaSBKYW4gMjggMTE6NTU6NTIgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IE1ha2UgbTY4ay1jb2ZmIGFuZCBhb3V0IGFkZCBtb25pdG9yIHN1cHBvcnQgaW4KKwlhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgc2VyaWFsIHN1cHBvcnQuCisKK0ZyaSBKYW4gMjggMDg6NDU6MDIgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIG1kZWJ1Z3JlYWQuYyAocHN5bXRhYl90b19zeW10YWJfMSk6IERvbid0IGNvbXBsYWluIG9uIHN0TGFiZWwgd2l0aAorCWluZGV4IGluZGV4TmlsLgorCitGcmkgSmFuIDI4IDEwOjQwOjM0IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWcvcGEvdG0taHBwYS5oOiBEZWZpbmUgbWFjcm8gU01BU0hfVEVYVF9BRERSRVNTLgorCSogZWxmcmVhZC5jIChyZWNvcmRfbWluaW1hbF9zeW1ib2xfYW5kX2luZm8pLAorCWR3YXJmcmVhZC5jIChwcm9jZXNzX2RpZXMpLCBwYXJlYWQuYyAocGFfc3ltdGFiX3JlYWQpOiBVc2UgaXQuCisKK1RodSBKYW4gMjcgMTU6MTI6MjMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGkzODYtc3R1Yi5jOiBBZGQgIi50ZXh0IiByaWdodCBiZWZvcmUgIm1lbV9mYXVsdDoiLgorCisJKiBtYWluLmMgKGJhdWRfcmF0ZSk6IEFkZCBGSVhNRSBjb21tZW50IGFib3V0IHByaW50aW5nIC0xIHZhbHVlLgorCisJKiByZW1vdGUtdXRpbHMuYyAodXNhZ2UpOiBGaXggbWVzc2FnZSB0byBiZSBhY2N1cmF0ZSBhbmQgY29uZm9ybQorCW1vcmUgY2xvc2VseSB0byBub3JtYWwgY29udmVudGlvbnMuCisKKwkqIHJlbW90ZS11dGlscy5jIChncl9maWxlc19pbmZvKTogSGF2ZSB0aGUgZXhlY19iZmQgdGVzdCBjb250cm9sCisJd2hldGhlciB0byBzaG93IGluZm9ybWF0aW9uIGFib3V0IGV4ZWNfYmZkLCBhbmQgbm90IGNvbnRyb2wgd2hldGhlcgorCXRvIHNob3cgaW5mb3JtYXRpb24gYWJvdXQgZGV2aWNlIGFuZCBzcGVlZC4KKworCSogcmVtb3RlLXV0aWxzLmMgKGdyX29wZW4pOiBJZiBzcl9nZXRfZGV2aWNlIHJldHVybnMgTlVMTCwgZ2l2ZQorCXVzYWdlIG1lc3NhZ2UsIGRvbid0IGR1bXAgY29yZS4KKworCSogcmVtb3RlLWJ1Zy5jIChidWdfd3JpdGVfbWVtb3J5KTogVXNlIGFsbG9jYSwgbm90IEdDQyBleHRlbnNpb24KKwlmb3IgdmFyaWFibGUgc2l6ZSBhcnJheS4KKwkoYnVnX2ZldGNoX3JlZ2lzdGVyLCBidWdfc3RvcmVfcmVnaXN0ZXIpOiBSZW5hbWUgInZhbHVlIiB0bworCSJmcHJlZ19idWYiIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgZG9uJ3QgbGlrZSB2YXJpYWJsZXMgd2hvc2UKKwluYW1lcyBhcmUgdGhlIHNhbWUgYXMgdHlwZXMuCisJKGJ1Z19zdG9yZV9yZWdpc3Rlcik6IFVzZSBhIGNhc3Qgd2hlbiBjb252ZXJ0aW5nIGNoYXIgKiB0bworCXVuc2lnbmVkIGNoYXIgKi4KKworCSogc3ltbWlzYy5jIChtYWludGVuYW5jZV9wcmludF9zeW1ib2xzKTogRG9uJ3QgcmVmZXIgdG8gdGhlIG5hbWUKKwlvZiB0aGUgY29tbWFuZCBpbiBlcnJvciBtZXNzYWdlICh0aGUgdGV4dCB3YXMgcmVmZXJyaW5nIHRvIHRoZSBvbGQKKwluYW1lIG9mIHRoZSBjb21tYW5kKS4KKworCSogc3ltbWlzYy5jIChkdW1wX3N5bXRhYik6IEZpeCBhcmdzIHRvIGZwcmludGZfZmlsdGVyZWQuCisKKwkqIGMtdHlwZXByaW50LmMgKGNfdHlwZV9wcmludF9iYXNlKTogSGF2ZSBTSE9XID09IDAgbWVhbiB0byBwcmludAorCWZ1bGwgZGV0YWlscyBvbiBzdHJ1Y3R1cmUgZWxlbWVudHMgd2l0aG91dCBuYW1lcy4gIFRoaXMgcGFydGlhbGx5CisJcmV2ZXJ0cyB0aGUgY2hhbmdlcyBvZiAxIEp1bCAxOTkzIGFuZCAzMSBBdWcgMTk5MzsgSSB0aGluayB0aGlzIGFzcGVjdAorCW9mIHRob3NlIGNoYW5nZXMgd2FzIGFjY2lkZW50YWwuCisKKwkqIHN0YWNrLmMgKHBhcnNlX2ZyYW1lX3NwZWNpZmljYXRpb24pOiBJZiBTRVRVUF9BUkJJVFJBUllfRlJBTUUgaXMKKwlkZWZpbmVkLCBtYWtlIGl0IGFuIGVycm9yIHRvIHNwZWNpZnkgYSBzaW5nbGUgYXJndW1lbnQgd2hpY2ggaXMgbm90CisJYSBmcmFtZSBudW1iZXIuCisKKwkqIE1ha2VmaWxlLmluICh2ZXJzaW9uLmMpLCBtYWluLmMgKHByaW50X2dkYl92ZXJzaW9uKTogVXNlCisJaG9zdF9hbGlhcyBhbmQgdGFyZ2V0X2FsaWFzLCBub3QgaG9zdF9jYW5vbmljYWwgYW5kCisJdGFyZ2V0X2Nhbm9uaWNhbCwgdG8gcHJpbnQgY29uZmlndXJhdGlvbi4KKworV2VkIEphbiAyNiAxMDo1NzoyMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogcGFyc2UuYyAod3JpdGVfZXhwX21zeW1ib2wpOiBVc2UgbmV3IHR5cGUgbXN5bWJvbF9hZGRyX3R5cGUgaW5zdGVhZAorCW9mIGJ1aWx0aW5fdHlwZV9sb25nLiAgSXQgaXMgbmVjZXNzYXJ5IHRvIGdldCBhIHR5cGUgd2hpY2ggaXMKKwlUQVJHRVRfUFRSX0JJVCBiaXRzIGluIHNpemU7IGJ1aWx0aW5fdHlwZV9sb25nIG1pZ2h0IG5vdCBiZSBiaWcgZW5vdWdoLgorCisJRml4IG1hbnkgc2lucyB3aGljaCB3aWxsIGNvbWUgdXAgaW4gMzIgYml0IHggNjQgYml0IEdEQiwgYW5kCisJdmFyaW91cyBtaXNjZWxsYW5lb3VzIHRoaW5ncyBkaXNjb3ZlcmVkIGluIHRoZSBwcm9jZXNzOgorCSogcHJpbnRjbWQuYywgZGVmcy5oIChwcmludF9hZGRyZXNzX251bWVyaWMpOiBOZXcgZnVuY3Rpb24uCisJKiBjLXZhbHByaW50LmMgKGNfdmFsX3ByaW50KSwgY2gtdmFscHJpbnQuYyAoY2hpbGxfdmFsX3ByaW50KQorCWJyZWFrcG9pbnQuYyAoZGVzY3JpYmVfb3RoZXJfYnJlYWtwb2ludHMsIGJyZWFrcG9pbnRfMSwgbWVudGlvbiksCisJY3AtdmFscHJpbnQuYyAoY3BsdXNfcHJpbnRfdmFsdWUpLCBpbmZjbWQuYyAoanVtcF9jb21tYW5kKSwKKwlwcmludGNtZC5jLCBzdGFjay5jLCBzeW1maWxlLmMsIHN5bW1pc2MuYywgdmFscHJpbnQuYzoKKwlVc2UgaXQuCisJKiB1dGlscy5jLCBkZWZzLmggKGdkYl9wcmludF9hZGRyZXNzKTogTmV3IGZ1bmN0aW9uLgorCSogZXhwcHJpbnQgKGR1bXBfZXhwcmVzc2lvbiksIGdkYnR5cGVzLmg6IFVzZSBpdC4KKwkqIGJyZWFrcG9pbnQuYyAoZGVzY3JpYmVfb3RoZXJfYnJlYWtwb2ludHMpLAorCXN5bW1pc2MuYyAoZHVtcF9zeW10YWIsIHByaW50X3N5bWJvbCk6CisJVXNlIGZpbHRlcmVkIG5vdCB1bmZpbHRlcmVkIEkvTy4KKwkocmVtb3ZlX2JyZWFrcG9pbnRzKTogUmVtb3ZlIEJSRUFLUE9JTlRfREVCVUcgY29kZS4gIE1pZ2h0IGFzIHdlbGwKKwlqdXN0IHJ1biBnZGIgdW5kZXIgYSBkZWJ1Z2dlciBmb3IgdGhpcyAoYW5kIGl0IGhhZCBwcm9ibGVtcyB3aXRoCisJcHJpbnRpbmcgYWRkcmVzc2VzLCBob3cgdG8gcHJpbnQgYi0+c2hhZG93LCBldGMuKS4KKwkqIGJ1aWxkc3ltLmMgKG1ha2VfYmxvY2t2ZWN0b3IpLCBjb3JlLmMgKG1lbW9yeV9lcnJvciksCisJZXhlYy5jIChwcmludF9zZWN0aW9uX2luZm8pLCBtYWludC5jIChwcmludF9zZWN0aW9uX3RhYmxlKSwKKwltZGVidWdyZWFkLmMgKHBhcnNlX3Byb2NlZHVyZSksIHNvbGliLmMsIHNvdXJjZS5jLCBzeW1maWxlLmMsCisJc3ltbWlzYy5jLCBzeW10YWIuYywgdmFsb3BzLmMsIHZhbHByaW50LmMsIHhjb2ZmZXhlYy5jOgorCUFkZCBjb21tZW50cyBzYXlpbmcgY29kZSBpcyBicm9rZW4uICBNYXJrZWQgd2l0aCAiRklYTUUtMzJ4NjQiLgorCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpLCBwYXJ0aWFsLXN0YWIuaCAoZGVmYXVsdCksCisJcmVtb3RlLXZ4LmMgKHZ4X3J1bl9maWxlc19pbmZvKToKKwlEb24ndCBjYXN0IGludCBiZWluZyBwYXNzZWQgdG8gbG9jYWxfaGV4X3N0cmluZy4KKwkqIHN5bW1pc2MuYyAocHJpbnRfc3ltYm9sKTogRG9uJ3QgY2FzdCBsb25nIGJlaW5nIHBhc3NlZCB0byAlbHguCisJKiBzeW10YWIuaCAoZ2VuZXJhbF9zeW1ib2xfaW5mbyk6IEFkZCBjb21tZW50IGFib3V0IFNZTUJPTF9WQUxVRQorCW9ubHkgYmVpbmcgYSBsb25nLgorCSogc3ltbWlzYy5jIChwcmludF9zeW1ib2wpOiBQcmludCAib2Zmc2V0IiBpbiBtZXNzYWdlIGZvciBMT0NfQVJHCisJYW5kIExPQ19MT0NBTC4KKwkqIHByaW50Y21kLmMgKHByaW50X2FkZHJlc3MpOiBSZW1vdmUgI2lmIDAgY29kZSB3aXRoIEFERFJfQklUU19SRU1PVkUuCisJKiBzb3VyY2UuYzogSW5jbHVkZSA8c3lzL3R5cGVzLmg+IHJlZ2FyZGxlc3Mgb2YgVVNHLgorCitUdWUgSmFuIDI1IDEyOjU4OjI2IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogdmFsb3BzLmMgKHZhbHVlX2Fzc2lnbik6ICBTZXQgYHR5cGUnIGFmdGVyIGNvZXJjaW5nIHRvdmFsLgorCSogYy12YWxwcmludC5jIChjX3ZhbF9wcmludCksIGNoLXZhbHByaW50LmMgKGNoaWxsX3ZhbF9wcmludCk6CisJVXNlIGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciB0byBnZXQgdGhlIGFkZHJlc3Mgb2YgYSByZWZlcmVuY2UuCisKK1R1ZSBKYW4gMjUgMTE6MzE6NTMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzcmVhZC5jIChTVEFCU19DT05USU5VRSwgZXJyb3JfdHlwZSksIHBhcnRpYWwtc3RhYi5oOgorCUFJWCBjYW4gdXNlID8gaW5zdGVhZCBvZiBcIGZvciBjb250aW51YXRpb24uICBEZWFsIHdpdGggaXQuCisKKwkqIHBhcmVhZC5jIChyZWFkX3Vud2luZF9pbmZvKTogSnVzdCBhc3NpZ24gdG8gb2JqZmlsZS0+b2JqX3ByaXZhdGUsCisJbm90IE9CSl9VTldJTkRfSU5GTy4gIEFzc2lnbmluZyB0byBhIGNhc3QgaXMgYSBHQ0MtaXNtIHdoaWNoCisJdGhlIEhQIGNvbXBpbGVyIGluIEFOU0kgbW9kZSBkb2Vzbid0IGxpa2UuCisKKwkqIG1haW4uYzogV2hlbiBkZWZhdWx0aW5nIEhBVkVfU0lHU0VUTUFTSyBiYXNlZCBvbiBVU0csIGp1c3QgZG8gaXQKKwliYXNlZCBvbiBVU0csIHJhdGhlciB0aGFuIGRlZmluaW5nIEhBVkVfU0lHU0VUTUFTSyB0byBhbgorCWV4cHJlc3Npb24gY29udGFpbmluZyBkZWZpbmVkLiAgSGF2aW5nIGEgbWFjcm8gdXNlZCBpbiAjaWYgZXhwYW5kCisJdG8gYW4gZXhwcmVzc2lvbiBjb250YWluaW5nICJkZWZpbmVkIiBpcyB1bmRlZmluZWQgYWNjb3JkaW5nIHRvCisJQU5TSSwgYW5kIHRoZSBIUCBjb21waWxlciBpbiBBTlNJIG1vZGUgZG9lc24ndCBkbyB3aGF0IHdlIHdhbnRlZAorCWl0IHRvLgorCitNb24gSmFuIDI0IDIwOjUxOjI5IDE5OTQgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBzcGFyYy1uYXQuYyAoZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzLCBzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMpOgorCUNsZWFuIHVwIHRoZSBjaGFuZ2VzIG9mIDExIEphbiwgYXMgcmVjb21tZW5kZWQgYnkgUGV0ZXIgU2NoYXVlci4KKworRnJpIEphbiAyMSAxOToxMDo0NCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogY2gtZXhwLnkgKG1hdGNoX3N0cmluZ19saXRlcmFsKTogIEFsbG93IGEgemVyby1sZW5ndGggc3RyaW5nLgorCSogY2gtbGFuZy5jIChjaGlsbF9wcmludHN0cik6ICBEb24ndCBwcmludCB6ZXJvLWxlbmd0aCBzdHJpbmcgZnVubnkuCisKK1NhdCBKYW4gMjIgMTc6MDg6NDggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGkzODZhaXgtbmF0LmMgKGkzODZfZmxvYXRfaW5mbyk6IFJldmVyc2Ugb3JkZXIgb2YgcmVnaXN0ZXJzIGJlZm9yZQorCXBhc3NpbmcgdGhlbSB0byBwcmludF8zODdfc3RhdHVzLgorCShwcmludF8zODdfc3RhdHVzKTogRG9uJ3Qgc3VidHJhY3QgdG9wIGZyb20gNyBiZWZvcmUgdXNpbmcgaXQuCisJKiBpMzg3LXRkZXAuYzogUmVtb3ZlIGNvbW1lbnQgYWJvdXQgQUlYIHdhbnRpbmcgInRvcCIgc3VidHJhY3RlZAorCWZyb20gNzsgdGhlIGFib3ZlIGV4cGxhaW5zIGl0LgorCitTYXQgSmFuIDIyIDIwOjI1OjExIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogbWlwcy10ZGVwLmMgKGluaXRfZXh0cmFfZnJhbWVfaW5mbyk6ICBVc2UgZnJhbWUgcmVsYXRpdmUgc3RhY2sKKwlwb2ludGVyIHZhbHVlIHdoZW4gZml4aW5nIHVwIHRoZSBmcmFtZSBhdCB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbi4KKworU2F0IEphbiAyMiAxMjoyOToxMyAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBseW54LW5hdC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6ICBMb2FkIHRoZSBJICYgTCByZWdzIGZvciB0aGUKKwlTcGFyYyBmcm9tIHRoZSBzdGFjay4KKworU2F0IEphbiAyMiAwODozMDo0MiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLW1pcHMuYyAobWlwc19pbml0aWFsaXplKTogQ2xlYXIgbWlwc19pbml0aWFsaXppbmcgdmlhCisJY2xlYW51cCBjaGFpbiwgbm90IGRpcmVjdGx5LgorCisJKiBzZXItdW5peC5jICh3YWl0X2ZvcikgW0hBVkVfVEVSTUlPLCBIQVZFX1RFUk1JT1NdOiBNYWtlIGEgdGltZW91dAorCW9mIC0xIG1lYW4gZm9yZXZlciwgbGlrZSBpbiB0aGUgSEFWRV9TR1RUWSBjYXNlLiAgV2FybiBpZiB3ZSBhcmUKKwltdW5naW5nIHRoZSB0aW1lb3V0IGR1ZSB0byB0aGUgbGltaXRlZCByYW5nZSBvZiBjX2NjW1ZUSU1FXS4KKworCSogZm9yay1jaGlsZC5jLCBpbmZlcmlvci5oIChmb3JrX2luZmVyaW9yKTogTmV3IGFyZ3VtZW50IHNoZWxsX2ZpbGUuCisJKiBwcm9jZnMuYyAocHJvY2ZzX2NyZWF0ZV9pbmZlcmlvciksIGluZnRhcmcuYyAoY2hpbGRfY3JlYXRlX2luZmVyaW9yKSwKKwltMy1uYXQuYyAobTNfY3JlYXRlX2luZmVyaW9yKTogUGFzcyBpdC4KKwkqIHByb2Nmcy5jOiBSZW1vdmUgcHRyYWNlIGZ1bmN0aW9uLiAgSXQgd2FzIGRlY2xhcmVkIGluIGEgd2F5IHdoaWNoCisJY29uZmxpY3RlZCB3aXRoIHRoZSBwcm90b3R5cGUgaW4gdW5pc3RkLmggb24gU29sYXJpcy4KKworU2F0IEphbiAyMiAwMTozNzo0MCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIHNwYXJjLXRkZXAuYyAoZnJhbWVfc2F2ZWRfcGMpOiAgR2V0IHRoZSBwYyBmcm9tIHRoZSBzYXZlZCBwYworCWluIHRoZSBzaWdjb250ZXh0IGlmIGl0IGlzIGEgc2lnbmFsIHRyYW1wb2xpbmUgZnJhbWUuCisJKiBjb25maWcvc3BhcmMvdG0tc3VuNHNvbDIuaCAoSU5fU0lHVFJBTVAsIFNJR0NPTlRFWFRfUENfT0ZGU0VUKToKKwlEZWZpbmUgZm9yIFNvbGFyaXMyLgorCitTYXQgSmFuIDIyIDAwOjM0OjQ3IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIHNwYXJjLXRkZXAuYywgbHlueC1uYXQuYywgY29uZmlnL3NwYXJjL3RtLXNwYXJjLmgsCisJY29uZmlnL3NwYXJjL3RtLXNwYXJjbHlueC5oOiAgTW92ZSBkZWZzIG9mIEZSQU1FX1NBVkVEX0kwL0wwIHRvCisJdG0tc3BhcmMuaCBzbyB0aGV5IGNhbiBiZSBvdmVycmlkZGVuIGlmIG5lY2Vzc2FyeS4KKworRnJpIEphbiAyMSAxNzo0OToyOCAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBseW54LW5hdC5jOiAgQWRkIFNwYXJjIHN1cHBvcnQuCisJKiBzcGFyY2x5LW5hdC5jOiAgUmVtb3ZlLiAgSXQncyB1c2VsZXNzLgorCSogY29uZmlnL3NwYXJjL25tLXNwYXJjbHlueC5oOiAgUmV3cml0ZS4KKwkqIGNvbmZpZy9zcGFyYy9zcGFyY2x5bngubWggKE5BVERFUEZJTEVTKTogIFJlcGxhY2Ugc3BhcmNseS1uYXQubworCXdpdGggbHlueC1uYXQubworCSogY29uZmlnL3NwYXJjL3RtLXNwYXJjbHlueC5oOiAgUmV3cml0ZS4KKworRnJpIEphbiAyMSAxOTowODo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHJzNjAwMC1waW5zbi5jOiBVc2UgdGhlIG5ldyBkaXNhc3NlbWJsZXIgaW4gdGhlIG9wY29kZXMKKwlkaXJlY3RvcnkuICBPbGQgY29kZSB3YXMgZGlzY2FyZGVkLCBzaW5jZSB0aGUgbmV3IG9wY29kZSB0YWJsZSBoYXMKKwlhIGRpZmZlcmVudCBmb3JtYXQuCisKK0ZyaSBKYW4gMjEgMTQ6Mjg6MzAgMTk5NCAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChyZWFsY2xlYW4pOiAgUmVtb3ZlIGluZm8gZmlsZXMgcGVyIG1ha2Utc3Rkcy50ZXhpLgorCitGcmkgSmFuIDIxIDEyOjQ3OjUzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBkYnhyZWFkLmMgKGVuZF9wc3ltdGFiKTogT25seSBwYXRjaCBwc3ltdGFiIHRleHRsb3cgYW5kIHRleHRoaWdoCisJaWYgTl9TT19BRERSRVNTX01BWUJFX01JU1NJTkcgaXMgZGVmaW5lZC4KKwkqIGNvbmZpZy9zcGFyYy90bS1zdW40c29sMi5oOiBEZWZpbmUgaXQuCisKK1RodSBKYW4gMjAgMTU6MDQ6MjQgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBwcmludGNtZC5jIChwcmludF9hZGRyZXNzX3N5bWJvbGljKTogIFVuY29uZGl0aW9uYWxseSB1c2UgbXN5bWJvbAorCWlmIHdlIGRpZCBub3QgZmluZCBhIHN5bWJvbC4KKworRnJpIEphbiAyMSAwODoyMDoxOCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaW5mcHRyYWNlLmMgKGNoaWxkX3hmZXJfbWVtb3J5KTogT25seSB1c2UgaWYgQ0hJTERfWEZFUl9NRU1PUlkKKwlpcyBub3QgZGVmaW5lZC4KKworCSogaHBwYWItbmF0LmMgKGNhbGxfcHRyYWNlKTogRGVsZXRlIHJlZHVuZGFudCBmdW5jdGlvbi4KKwkoa2lsbF9pbmZlcmlvciwgYXR0YWNoLCBkZXRhY2gsIGNoaWxkX3Jlc3VtZSk6IExpa2V3aXNlLgorCShjaGlsZF94ZmVyX21lbW9yeSk6IExpa2V3aXNlLgorCisJKiBocHBhaC1uYXQuYyAoY2FsbF9wdHJhY2UpOiBEZWxldGUgcmVkdW5kYW50IGZ1bmN0aW9uLgorCShraWxsX2luZmVyaW9yLCBhdHRhY2gsIGRldGFjaCwgY2hpbGRfcmVzdW1lKTogTGlrZXdpc2UuCisKKwkqIGNvbmZpZy9wYS9ocHBhYnNkLm1oIChOQVRERVBGSUxFUyk6IEFkZCBpbmZwdHJhY2Uuby4KKworCSogY29uZmlnL3BhL2hwcGFocHV4Lm1oIChOQVRERVBGSUxFUyk6IEFkZCBpbmZwdHJhY2Uuby4KKworCSogY29uZmlnL3BhL25tLWhwcGFiLmggKEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUyk6IERlZmluZS4KKworCSogY29uZmlnL3BhL25tLWhwcGFoLmggKEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUyk6IGRlZmluZS4KKwkoQ0hJTERfWEZFUl9NRU1PUlkpOiBEZWZpbmUuCisJKFBUXyopOiBEZWZpbmUgc28gdGhhdCBnZW5lcmljIGluZnB0cmFjZS5jIGNvZGUgY2FuIGJlIHVzZWQuCisKK0ZyaSBKYW4gMjEgMDk6MjM6MzMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHhjb2ZmcmVhZC5jICh4Y29mZl9zeW1maWxlX3JlYWQpOiBNYWtlIHNlY29uZCBwYXJhbWV0ZXIgYQorCXN0cnVjdCBzZWN0aW9uX29mZnNldHMgKiwgbm90IGEgKG5vbmV4aXN0ZW50KSBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXQgKi4KKworCSogeGNvZmZyZWFkLmMgKHJlYWRfeGNvZmZfc3ltdGFiKTogTWFrZSBtYWluX2F1eCBqdXN0IGEgdW5pb24KKwlpbnRlcm5hbF94Y29mZl9zeW10YWIsIG5vdCBhbiBhcnJheSBvZiBvbmUgb2YgdGhlbS4gIENoYW5nZSBsb3RzIG9mCisJIm1haW5fYXV4IiB0byAiJm1haW5fYXV4IiBhbmQgc28gb24uCisKKwkqIGNvZmZyZWFkLmMsIHhjb2ZmcmVhZC5jOiBJbmNsdWRlIDxjb2ZmL2ludGVybmFsLmg+CisJYmVmb3JlICJzeW1maWxlLmgiLgorCitUaHUgSmFuIDIwIDE3OjMwOjU1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb2ZmcmVhZC5jIChjb2ZmX2dldGZpbGVuYW1lKTogTWFrZSBpdCBub3Qgc3RhdGljLgorCisJKiB4Y29mZnJlYWQuYyAocmVhZF94Y29mZl9zeW10YWIpOiBjb21wbGFpbigpIG5vdCBhYm9ydCgpLgorCisJKiB4Y29mZnJlYWQuYyAoc3RydWN0IGNvZmZfc3ltYm9sKTogUmVuYW1lIGNfbnN5bXMgdG8gY19uYXV4IChyZW1vdmVzCisJYSBjb21wbGV0ZWx5IGdyYXR1aXRvdXMgZGlmZmVyZW5jZSBiZXR3ZWVuIHhjb2ZmcmVhZC5jIGFuZCBjb2ZmcmVhZC5jKS4KKworV2VkIEphbiAxOSAxNTowOTo0NCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogRG9uJ3Qgc2V0IGZyYW1lIGZvcgorCXN0ZXBfcmVzdW1lX2JyZWFrcG9pbnQgZm9yIElOX1NJR1RSQU1QIGNhc2VzLgorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpLCBicmVha3BvaW50LmggKHN0cnVjdCBicHN0YXRfd2hhdCksCisJYnJlYWtwb2ludC5jIChicHN0YXRfd2hhdCk6IE1vdmUgc3RlcF9yZXN1bWUgZnJvbSBpdHMgb3duIGZpZWxkIG9mCisJdGhlIHN0cnVjdCBicHN0YXRfd2hhdCBpbnRvIHRoZSBtYWluX2FjdGlvbi4gIE1ha2UgaXQgb3ZlcnJpZGUKKwlvdGhlciBicmVha3BvaW50cy4gIFRoaXMgaXMgYSBjb25zZXJ2YXRpdmUgY2hhbmdlIGluIHRoZSBzZW5zZQorCXRoYXQgYmVmb3JlIHRoZSBzdGVwIHJlc3VtZSBicmVha3BvaW50IHdhcyBhIGJyZWFrcG9pbnQuYworCWJyZWFrcG9pbnQsIGhpdHRpbmcgdGhlIHN0ZXAgcmVzdW1lIGJyZWFrcG9pbnQgb3ZlcnJvZGUgZXZlbgorCWNhbGxpbmcgYnBzdGF0X3N0b3Bfc3RhdHVzLgorCitXZWQgSmFuIDE5IDEyOjQwOjI1IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogaW5mcnVuLmMgKG5vcm1hbF9zdG9wKTogIFNldCBzdG9wX3BjIGFmdGVyIHBvcHBpbmcgdGhlIGR1bW15IGZyYW1lCisJaW4gY2FzZSBleGVjdXRpb24gd2FzIHN0b3BwZWQgaW4gdGhlIGNhbGxlZCBmdW5jdGlvbi4KKwkqIHN0YWNrLmMgKHByaW50X2ZyYW1lX2luZm8sIGZyYW1lX2luZm8pOiAgSWYgYmFja3RyYWNpbmcgdGhyb3VnaAorCWEgY2FsbCBkdW1teSwgaGFuZGxlIHRoZSBzdGFydGluZyBzb3VyY2UgbGluZSBudW1iZXIgb24gYSBsaW5lCisJYm91bmRhcnkgbGlrZSBiYWNrdHJhY2luZyB0aHJvdWdoIHNpZ3RyYW1wLgorCSogc3BhcmMtdGRlcC5jIChzcGFyY19mcmFtZV9maW5kX3NhdmVkX3JlZ3MpOiAgR2V0IGZyYW1lIGFkZHJlc3MKKwlmb3IgY2FsbCBkdW1teSBmcmFtZSByaWdodC4gIFJlbW92ZSBvbGQgdGVzdCBmb3IgZHVtbXkgZnJhbWUsCisJaXQgaGFzIGJlZW4gdW51c2VkIGF0IGxlYXN0IHNpbmNlIGdkYi0zLjUuCisJKiBzcGFyYy10ZGVwLmMgKHNwYXJjX3B1c2hfZHVtbXlfZnJhbWUpOiAgU2V0IHJldHVybiBhZGRyZXNzIHJlZ2lzdGVyCisJb2YgdGhlIGR1bW15IGZyYW1lLgorCitUdWUgSmFuIDE4IDE2OjE2OjM1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBpbmZjbWQuYyAoc2lnbmFsX2NvbW1hbmQpOiBBY2NlcHQgMCBhcyBsZWdpdGltYXRlIHNpZ25hbCBudW1iZXIuCisKK1R1ZSBKYW4gMTggMTQ6MDk6MjUgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBpbmZydW4uYyAoc2lnbmFsc19pbmZvKSwgdGFyZ2V0LmMgKHRhcmdldF9zaWduYWxfZnJvbV9uYW1lKToKKwlVc2UgdWdseSBjYXN0cyB0byBhdm9pZCBlbnVtdmFyIDwgZW51bXZhciBvciBlbnVtdmFyKysuCisKK01vbiBKYW4gMTcgMjI6MDA6MTUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHNlci11bml4LmMgKGhhcmR3aXJlX25vZmx1c2hfc2V0X3R0eV9zdGF0ZSk6IERvbid0IG11Y2sgd2l0aCBJQ0FOT04uCisJKiBpbmZsb3cuYyAodGVybWluYWxfb3Vyc18xKTogV2hlbiBkaXNjdXNzaW5nIGhvdyB0byBkZWFsIHdpdGggdGhlCisJdHR5IHN0YXRlLCBtYWtlIG5vdGUgb2YgcXVlcnkoKSBhcyB3ZWxsIGFzIHJlYWRsaW5lLgorCisJKiBpbmZydW4uYyAoX2luaXRpYWxpemVfaW5mcnVuKTogQWRkIFRBUkdFVF9TSUdOQUxfUE9MTCB0byBsaXN0IG9mCisJc2lnbmFscyBmb3Igd2hpY2ggc3RvcCBhbmQgcHJpbnQgYXJlIGNsZWFyZWQgYnkgZGVmYXVsdC4KKworTW9uIEphbiAxNyAyMDowMDo1MSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29uZmlnL3BhL3RtLWhwcGEuaCAodW53aW5kX3RhYmxlX2VudHJ5KTogVXNlIG9uZSBvZiB0aGUKKwlyZXNlcnZlZCBmaWVsZHMgdG8gaG9sZCBhIHN0dWIgdW53aW5kIGVudHJ5IHR5cGUuICBGaXggdHlwby4KKwkoc3R1Yl91bndpbmRfZW50cnkpOiBOZXcgc3RydWN0dXJlIGZvciByYXcgc3R1YiB1bndpbmQgZW50cmllcy4KKwkoc3R1Yl91bndpbmRfdHlwZXMpOiBUaGUgdHlwZXMgb2Ygc3R1YnMgd2UgbWF5IGVuY291bnRlci4KKwkoVU5XSU5EX0VOVFJZX1NJWkUsIFNUVUJfVU5XSU5EX0VOVFJZX1NJWkUpOiBOZXcgZGVmaW5lcy4KKwkqIGhwcGEtdGRlcC5jIChycF9zYXZlZCk6IFVzZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHByb3ZpZGVkCisJYnkgbGlua2VyIHN0dWIgdW53aW5kIGRlc2NyaXB0b3JzLgorCShmcmFtZWxlc3NfZnVuY3Rpb25faW52b2NhdGlvbik6IExpa2V3aXNlLgorCShmcmFtZV9jaGFpbl92YWxpZCk6IExpa2V3aXNlLgorCSogcGFyZWFkLmMgKGNvbXBhcmVfdW53aW5kX2VudHJpZXMpOiBOZXcgZnVuY3Rpb24gZm9yIHNvcnRpbmcKKwl1bndpbmQgdGFibGUgZW50cmllcy4KKwkocmVhZF91bndpbmRfaW5mbyk6IFJld3JpdGUgdG8gcmVtb3ZlIGRlcGVuZGVuY3kgb24gaG9zdCBlbmRpYW5uZXNzLgorCVJlYWQgaW4gZGF0YSBmcm9tIHRoZSAkVU5XSU5EX0VORCQgc3Vic3BhY2Ugd2hpY2ggY29udGFpbnMgbGlua2VyCisJc3R1YiB1bndpbmQgZGVzY3JpcHRvcnMuICBNZXJnZSB0aGF0IGRhdGEgaW50byB0aGUgYmFzaWMgdW53aW5kCisJdGFibGUuCisKKwkqIGhwcGFiLW5hdC5jIChfaW5pdGlhbGl6ZV9rZXJuZWxfdV9hZGRyKTogRGVsZXRlIHVud2FudGVkIGZ1bmN0aW9ucy4KKworTW9uIEphbiAxNyAyMjowMDoxNSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogeGNvZmZyZWFkLmMgKHJlYWRfeGNvZmZfc3ltdGFiLCBjYXNlIENfRklMRSk6IEFjY2VwdCB0aGUgbmFtZQorCWZyb20gZWl0aGVyIHRoZSBzeW1ib2wgbmFtZSBvciB0aGUgYXV4ZW50LgorCSogY29mZnJlYWQuYywgc3ltZmlsZS5oIChjb2ZmX2dldGZpbGVuYW1lKTogUmVuYW1lZCBmcm9tIGdldGZpbGVuYW1lLAorCW5vIGxvbmdlciBzdGF0aWMuCisKK01vbiBKYW4gMTcgMTM6MzU6MDEgMTk5NCAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChBTExQQVJBTSk6ICBDaGFuZ2UgaXJpeDUuaCB0byBubS1pcml4NS5oLgorCitNb24gSmFuIDE3IDEyOjM1OjQyIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogUkVBRE1FOiAgVXBkYXRlIG5vdGVzIGZvciBhbHBoYSBwb3J0LgorCitNb24gSmFuIDE3IDExOjE1OjU3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBpOTYwLXRkZXAuYyAoaTk2MF9mYXVsdF90b19zaWduYWwpOiBSZXR1cm4gVEFSR0VUX1NJR05BTF9JTEwKKwlmb3Igb3BlcmF0aW9uIGZhdWx0LCBjb25zdHJhaW50IGZhdWx0LCBhbmQgdHlwZSBmYXVsdC4KKworU3VuIEphbiAxNiAxMjo0NjowMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGluaXQuYyk6IEFkZCBjb21tZW50IGV4cGxhaW5pbmcgZm9ybWF0dGluZyBjb252ZW50aW9ucy4KKworCSogYy1leHAueSAocGFyc2VfbnVtYmVyKTogQXNzaWduIHRvIHRlbXBvcmFyeSBiZXR3ZWVuIHRoZSByaWdodAorCXNoaWZ0cywgdG8gd29yayBhcm91bmQgYSBidWcgaW4gdGhlIFNDTyBjb21waWxlci4KKworCSogTWFrZWZpbGUuaW4gKEFMTENPTkZJRywgQUxMUEFSQU0sIEFMTERFUEZJTEVTLCBIRklMRVNfTk9fU1JDRElSKToKKwlBZGQgdmFyaW91cyBmaWxlcyB3aGljaCB3ZXJlIGFkZGVkIHRvIEdEQiByZWNlbnRseS4KKworCSogeGNvZmZyZWFkLmMgKHByb2Nlc3NfeGNvZmZfc3ltYm9sKTogT25seSBjaGFuZ2UgJ1YnIHRvICdTJyBpZiBub3QKKwl3aXRoaW5fZnVuY3Rpb24uCisKKwkqIE1ha2VmaWxlLmluOiBBZGQgbW9zdGx5Y2xlYW4gdGFyZ2V0LgorCitTYXQgSmFuIDE1IDEwOjIwOjEzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBWZXJzaW9uIDQuMTEuNC4KKworU2F0IEphbiAxNSAxODoyNzozNCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogbWFpbi5jIChzaG93X2NvbW1hbmRzKTogIE1ha2UgcmV0dXJuIHR5cGUgb2YgZXh0ZXJuCisJaGlzdG9yeV9nZXQgYmUgSElTVF9FTlRSWSwgcmF0aGVyIHRoYW4gc3RydWN0IF9oaXN0X2VudHJ5LgorCShUaGUgbGF0dGVyIGxvc2VzIHdpdGggdGhlIHVwY29taW5nIG1lcmdlZCByZWFkbGluZS4pCisKK1NhdCBKYW4gMTUgMTA6MjA6MTMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIG1pbnN5bXMuYyAocHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2xfYW5kX2luZm8pOiBNYWtlIHRlbXBzdHJpbmcKKwljb25zdCBjaGFyICosIG5vdCBjaGFyICouCisKKwkqIHN5bXRhYi5oIChzdHJ1Y3Qgc3ltYm9sKTogTWFrZSBzZWN0aW9uIHNob3J0LCBub3QgdW5zaWduZWQgc2hvcnQuCisKKwkqIHN5bXRhYi5jIChsb29rdXBfc3ltYm9sKTogQWRkIGNvbW1lbnQgYWJvdXQgUVVJVCBoZXJlLgorCisJKiB1dGlscy5jIChmcHV0c191bmZpbHRlcmVkKTogQ2FsbCBmcHV0cywgbm90IGZwdXRzX21heWJlX2ZpbHRlcmVkLgorCisJKiBjLWV4cC55IChwYXJzZV9udW1iZXIpOiBDaGVjayBmb3Igb3ZlcmZsb3cgcmVnYXJkbGVzcyBvZiByYW5nZQorCWNoZWNraW5nLiAgRml4IG92ZXJmbG93IGNoZWNrIHRvIHVzZSB1bnNpZ25lZCBMT05HRVNULCBub3QKKwl1bnNpZ25lZCBpbnQuCisKKwkqIGMtZXhwLnkgKHBhcnNlX251bWJlcik6IE1ha2UgaXQgc28gdGhhdCBpbnRlZ2VyIGNvbnN0YW50cyBhcmUKKwlidWlsdGluX3R5cGVfbG9uZ19sb25nIGlmIGJ1aWx0aW5fdHlwZV9sb25nIGlzbid0IGJpZyBlbm91Z2ggb3IgaWYKKwlhbiAiTEwiIHN1ZmZpeCBpcyB1c2VkLiAgUHJvcGVybHkgaGFuZGxlICJVTCIgb3IgIkxVIiBzdWZmaXhlcy4KKworCSogYy10eXBlcHJpbnQuYyAoY190eXBlX3ByaW50X3ZhcnNwZWNfc3VmZml4LCBjYXNlIFRZUEVfQ09ERV9GVU5DKToKKwlQcmludCBvdXIgIigpIiBmaXJzdCwgdGhlbiByZWN1cnNlIGZvciB0aGUgdGFyZ2V0IHR5cGUuCisKK0ZyaSBKYW4gMTQgMjE6NTU6MzkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS11ZGkuYyAodWRpX2NyZWF0ZV9pbmZlcmlvcik6IFF1b3RlIGVtcHR5IGV4ZWNmaWxlIGFyZ3VtZW50LgorCisJKiBnZGJzZXJ2ZXIvbG93LWx5bnguYzogSW5jbHVkZSA8c3lzL3dhaXQuaD4gbm90ICIvdXNyL2luY2x1ZGUvd2FpdC5oIi4KKworRnJpIEphbiAxNCAxNDoxNzowNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogdXRpbHMuYyAocmVxdWVzdF9xdWl0KTogUmUtZXN0YWJsaXNoIHNpZ25hbCBoYW5kbGVyIHJlZ2FyZGxlc3MKKwlvZiBVU0cuCisKKwkqIGNvbmZpZy9taXBzL3htLWlyaXg0Lmg6IERlZmluZSBIQVZFX1RFUk1JT1MuCisKK0ZyaSBKYW4gMTQgMjE6NTU6MzkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGk5NjAtdGRlcC5jOiBJbmNsdWRlIHRhcmdldC5oLgorCitGcmkgSmFuIDE0IDE3OjEyOjI4IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogbHlueC1uYXQuYyAoc3lzL3dhaXQuaCk6IERvbid0IHVzZSBhYnNvbHV0ZSBwYXRobmFtZS4KKworRnJpIEphbiAxNCAxMTowNjoxMCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogbHlueC1uYXQuYyAoY2hpbGRfd2FpdCk6IEZpeCB0aGlua29zIGluIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cworCWNoYW5nZXMgKHN0YXR1cyAtPiBvdXJzdGF0dXM7IGRlY2xhcmUgc3RhdHVzLCBldGMuKS4KKwkqIGNvbmZpZy9ubS1seW54Lmg6IEZpeCBjaGlsZF93YWl0IHByb3RvdHlwZSBhbmQgaW5jbHVkZSB0YXJnZXQuaC4KKworRnJpIEphbiAxNCAxNDoxNzowNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKEFMTFBBUkFNKTogQWRkIGNvbmZpZy9ubS1seW54LmguCisKK0ZyaSBKYW4gMTQgMTE6NDk6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQorCisJKiByZW1vdGUtbWlwcy5jIChtaXBzX3JlcXVlc3QsIG1pcHNfd2FpdCk6IENvcnJlY3QgcHJvdG90eXBlcy4KKworRnJpIEphbiAxNCAxMTozNzoxNyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2kzODYveG0tbGludXguaDogRGVmaW5lIEhBVkVfVEVSTUlPUy4KKworRnJpIEphbiAxNCAwMTowNDozNiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNvbmZpZy9hbHBoYS90bS1hbHBoYS5oIChDQUxMX0RVTU1ZKTogIEltcHJvdmUgY29tbWVudC4KKworVGh1IEphbiAxMyAxMDozMjozOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXZ4LmMgKHZ4X3dhaXQpOiBPbmx5IGNhbGwgaTk2MF9mYXVsdF90b19zaWduYWwgaWYgSTgwOTYwCisJaXMgZGVmaW5lZC4gIE90aGVyd2lzZSBqdXN0IHJlcG9ydCBUQVJHRVRfU0lHTkFMX1VOS05PV04uCisKKwkqIG1pcHMtdGRlcC5jIChtaXBzX3B1c2hfYXJndW1lbnRzKTogQnl0ZXN3YXAgc3RydWN0X2FkZHIgYmVmb3JlCisJd3JpdGluZyBpdC4KKworCUFkZCBzZWFyY2ggdG8gdGFyZ2V0IHZlY3RvciAoI2lmIDAnZCB1bnRpbCBhZnRlciA0LjEyKToKKwkqIHRhcmdldC5oICh0b19zZWFyY2gsIHRhcmdldF9zZWFyY2gpOiBBZGQuCisJKiBnZGJjb3JlLmgsIGNvcmUuYyAoZ2VuZXJpY19zZWFyY2gpOiBBZGQuCisJKiByZW1vdGUuYyAocmVtb3RlX3NlYXJjaCk6IEFkZC4KKwkqIGEyOWstdGRlcC5jIChpbml0X2ZyYW1lX2luZm8pOiBVc2UgdGFyZ2V0X3NlYXJjaCB0byBmaW5kIHRyYWNlYmFjaworCXRhZy4KKworCSogcHJpbnRjbWQuYyAocHJpbnRfYWRkcmVzc19zeW1ib2xpYyk6IElmIHNldCBwcmludCBmYXN0LXN5bWJvbGljLWFkZHIKKwlpcyBvbiwgY2FsbCBmaW5kX3BjX2Z1bmN0aW9uIHJhdGhlciB0aGFuIHJlbHlpbmcganVzdCBvbiB0aGUgbWluaW1hbAorCXN5bWJvbHMgKHByb2JhYmx5IG9ubHkgbWF0dGVycyBmb3Igc3ltYm9sIHJlYWRlcnMgd2hpY2ggZG9uJ3QgcHV0CisJc3RhdGljcyBpbiB0aGUgbWluaW1hbCBzeW1ib2xzLCBidXQgY2hhbmdpbmcgdGhpcyBzdHJpa2VzIG1lIGFzCisJbm90IGNvbnNlcnZhdGl2ZSBlbm91Z2gpLgorCUluaXRpYWxpemUgbmFtZV9sb2NhdGlvbiBpbiBhbGwgY2FzZXMuCisJSWYgbm8gc3ltYm9sIGFuZCBubyBtc3ltYm9sLCBkb24ndCBwcmludCBhbnl0aGluZyBzeW1ib2xpYy4KKworCSogYTI5ay10ZGVwLmMgKHB1c2hfZHVtbXlfZnJhbWUpOiBBZGQgY29tbWVudCBhYm91dCBzYXZpbmcgbHIwLgorCitXZWQgSmFuIDEyIDIwOjUzOjE2IDE5OTQgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBwcmludGNtZC5jIChwcmludF9hZGRyZXNzX3N5bWJvbGljKTogIE1ha2UgaXQgc2VhcmNoIHRoZQorCXN5bXRhYnMgZm9yIHZhcmlhYmxlcyBhcyB3ZWxsIGFzIGZ1bmN0aW9ucy4gIEFkZCBgc2V0IHByaW50CisJZmFzdC1zeW1ib2xpYy1hZGRyJyBhbmQgZGVmYXVsdCBpdCB0byBmYXN0ICh0aGUgb2xkIHdheSkuCisJUHJpbnQgbGluZSBudW1iZXJzIGZvciBkYXRhIGl0ZW1zIGFzIHdlbGwgYXMgZnVuY3Rpb25zLgorCisJKiBzeW10YWIuYyAoZmluZF9hZGRyX3N5bWJvbCk6ICBSZXR1cm4gdGhlIHN5bXRhYiBhbmQgdGhlIHN5bWJvbAorCWFkZHJlc3MsIGlmIGEgc3ltYm9sIGlzIGZvdW5kICh0YWtlIHR3byBtb3JlIGFyZ3MgcG9pbnRpbmcgdG8KKwl3aGVyZSB0byBzdG9yZSB0aGVzZSByZXN1bHRzKS4KKworCSogc3ltdGFiLmggKGZpbmRfYWRkcl9zeW1ib2wpOiAgQWRkIHByb3RvdHlwZS4KKworV2VkIEphbiAxMiAxOTozMjoxMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogb2JqZmlsZXMuaDogRml4IGNvbW1lbnRzIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCB0aGUgcGhyYXNlCisJInRvcCBvZiBzdGFjayIgYWx3YXlzIHJlZmVycyB0byB3aGVyZSB0aGUgcHVzaGluZyBhbmQgcG9wcGluZyB0YWtlcworCXBsYWNlLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgYXQgdGhlIGhpZ2hlc3Qgb3IgbG93ZXN0IGFkZHJlc3MuCisKK1dlZCBKYW4gMTIgMTM6MjM6MzcgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3N5bWJvbCk6ICBEbyBub3Qgc2V0IFRZUEVfVEFHX05BTUUgZm9yCisJY29tcGlsZXIgZ2VuZXJhdGVkIHRhZyBuYW1lcy4KKwkqIG1kZWJ1Z3JlYWQuYyAocGFyc2VfdHlwZSk6ICBIYW5kbGUgY3Jvc3MgcmVmZXJlbmNlcyB0byBxdWFsaWZpZWQKKwlhZ2dyZWdhdGUgdHlwZXMuCisJKiB2YWxvcHMuYyAodmFsdWVfc3RydWN0X2VsdCk6ICBJbXByb3ZlIGVycm9yIG1lc3NhZ2UgaWYgdGhlCisJYWRkcmVzcyBvZiBhIG1ldGhvZCBpcyByZXF1ZXN0ZWQgZnJvbSBhbiBvYmplY3QgaW5zdGFuY2UuCisJKiB2YWxvcHMuYyAoc2VhcmNoX3N0cnVjdF9tZXRob2QpOiAgTWFrZSBuYW1lX21hdGNoZWQgbm9uLXN0YXRpYworCXRvIGdldCBpdCBpbml0aWFsaXplZCBjb3JyZWN0bHkuCisJKiBjb25maWcvaTM4Ni9ubS1pMzg2c2NvLmggKENBTk5PVF9TVE9SRV9SRUdJU1RFUik6ICBEZWZpbmUgdG8KKwlleGNsdWRlIHNlZ21lbnQgcmVnaXN0ZXIgd2hpY2ggYXJlIG5vdCB3cml0YWJsZSBvbiBuZXdlciBTQ08gdmVyc2lvbnMuCisKK1dlZCBKYW4gMTIgMTQ6NDQ6NDUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdvMzIteGRlcC5jOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9uIHVlcnJvci4KKwkoc2lnc2V0bWFzayk6IERlY2xhcmUgcmV0dXJuIHR5cGUuICBEZWNsYXJlIGFyZ3VtZW50ICh0byBtYXRjaCB0aGUKKwl3YXkgaXQgaXMgY2FsbGVkKS4gIEV4cGxpY2l0bHkgcmV0dXJuIDAuCisKK1dlZCBKYW4gMTIgMDE6NDQ6MjUgMTk5NCAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIHN5bXRhYi5oIChzdHJ1Y3Qgc3ltYm9sLCBnZW5lcmFsX3N5bWJvbF9pbmZvLCBtaW5pbWFsX3N5bWJvbCwKKwlwYXJ0aWFsX3N5bWJvbCk6ICBTaHJpbmsgdGhlIHN0b3JhZ2Ugc2l6ZXMgb2Ygc3ltYm9scywgYnkgbWFraW5nCisJZW51bXMgaW50byAxLWJ5dGUgYml0ZmllbGRzIHdoZW4gY29tcGlsZWQgX19HTlVDX18sIG1vdmluZyBhbGwgdGhlCisJZW51bXMgYW5kIHNtYWxsIGludHMgdG8gdGhlIGVuZCBvZiBlYWNoIHN0cnVjdCB0byBpbXByb3ZlCisJYWxpZ25tZW50LCBhbmQgc3dpdGNoaW5nIHRoZSBzZWN0aW9uIG51bWJlciBmcm9tIGludCB0byB1bnNpZ25lZAorCXNob3J0LgorCitXZWQgSmFuIDEyIDAwOjE2OjI2IDE5OTQgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBzeW10YWIuYyAoZmluZF9hZGRyX3N5bWJvbCk6ICBOZXcgcm91dGluZSB0aGF0IHdpbGwgZmluZCB0aGUgbmVhcmVzdAorCXN5bWJvbCBhc3NvY2lhdGVkIHdpdGggYW4gYWRkcmVzcy4gIEl0IGRvZXMgc28gYnkgZXhoYXVzdGl2ZQorCXNlYXJjaCBvZiB0aGUgc3ltdGFicywgc28gaXQncyBzbG93IGJ1dCBjb21wbGV0ZS4KKworVHVlIEphbiAxMSAyMzo1NzozMCAxOTk0ICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogY29mZnJlYWQuYyAocmVhZF9jb2ZmX3N5bXRhYik6ICBTZXQgUEMgYm91bmRzIG9mIF9nbG9iYWxzXyBzeW10YWIKKwl0byBbMCwwXSByYXRoZXIgdGhhbiBbMCwgZW5kIG9mIGZpcnN0IHNvdXJjZSBmaWxlXS4gIFRoaXMgYXZvaWRzCisJcHJvYmxlbXMgd2l0aCBvdGhlciBwYXJ0cyBvZiBHREIgbG9va2luZyBmb3IgbGluZXRhYmxlcyBpbiB0aGUKKwlfZ2xvYmFsc18gc3ltdGFiLiAgRWxpbWluYXRlIHZhcmlhYmxlcyBudW1fb2JqZWN0X2ZpbGVzIGFuZAorCWZpcnN0X29iamVjdF9maWxlX2VuZC4KKworVHVlIEphbiAxMSAwMDo1Mzo0NiAxOTk0ICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogYTI5ay10ZGVwLmMgKGluaXRfZnJhbWVfaW5mbyk6ICBDYXN0IG51bGwgYXJnIHRvIGV4YW1pbmVfdGFnLgorCShwb3BfZnJhbWUpOiAgUmVzdG9yZSBQQzIgYW5kIExSMCBmcm9tIGR1bW15IGZyYW1lcy4KKwkocHVzaF9kdW1teV9mcmFtZSk6ICBTYXZlIFBDMiBhbmQgTFIwIGludG8gZHVtbXkgZnJhbWVzLgorCShzZXR1cF9hcmJpdHJhcnlfZnJhbWUpOiAgSGFuZGxlIDMgYXJncyBhbmQgc2V0IHVwIHJlYWwgZnJhbWVzLgorCSogY29uZmlnL2EyOWsvdG0tYTI5ay5oIChGUkFNRV9OVU1fQVJHUyk6ICBVcGRhdGUgY29tbWVudHMuCisJKERVTU1ZX0ZSQU1FX1JTSVpFKTogIEFkZCAyIGxvbmd3b3JkcyBmb3IgUEMyIGFuZCBMUjAuCisJKFNFVFVQX0FSQklUUkFSWV9GUkFNRSk6ICBEZWZpbmUuCisKK1R1ZSBKYW4gMTEgMDY6NTk6MTAgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGluZnJ1bi5jLCBjb25maWcvbWlwcy90bS1pcml4NS5oOiBSZW1vdmUgI2lmIDAnZCBBVF9GVU5DVElPTl9TVEFSVC4KKworVHVlIEphbiAxMSAxNDoyNzowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS11ZGkuYyAodWRpX3Jlc3VtZSk6IENvcnJlY3QgcHJvdG90eXBlLgorCitUdWUgSmFuIDExIDExOjEwOjMwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisgICAgICAgICogY29uZmlnL3BhL3RtLWhwcGEuaCAoRlJBTUVfRklORF9TQVZFRF9SRUdTKTogQ2FsbAorCWhwcGFfZnJhbWVfZmluZF9zYXZlZF9yZWdzLgorCSogaHBwYS10ZGVwLmMgKGRpZ19mcF9mcm9tX3N0YWNrKTogRGVsZXRlIGZ1bmN0aW9uLgorCShwcm9sb2d1ZV9pbnN0X2FkanVzdF9zcCk6IE5ldyBmdW5jdGlvbi4KKwkoaXNfYnJhbmNoLCBpbnN0X3NhdmVzX2dyLCBpbnN0X3NhdmVzX2ZyKTogTmV3IGZ1bmN0aW9ucy4KKwkoc2tpcF9wcm9sb2d1ZSk6IENvbXBsZXRlbHkgcmV3cml0ZSB0byB1c2UgdW53aW5kIGluZm9ybWF0aW9uLgorCShocHBhX2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyk6IExpa2V3aXNlLgorCitUdWUgSmFuIDExIDA2OjU5OjEwIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQorCisJKiByZW1vdGUtbWlwcy5jIChtaXBzX3dhaXQpOiBVc2UgbmV3IGZ1bmN0aW9uIG1pcHNfc2lnbmFsX2Zyb21fcHJvdG9jb2wKKwl0byBjb252ZXJ0IGEgc2lnbmFsIG51bWJlciB3aXRoIGFwcHJvcHJpYXRlIGJvdW5kcyBjaGVja2luZy4KKworCSogcmVtb3RlLW1pcHMuYyAobWlwc193YWl0KTogRml4IHR5cG9zICgweDE3NyAtPiAwMTc3LCAweDM3NyAtPiAwMzc3KS4KKworVHVlIEphbiAxMSAwMDo1Mzo0NiAxOTk0ICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogc3RhY2suYyAoZnJhbWVfaW5mbyk6ICBJZiBGUkFNRV9GSU5EX1NBVkVEX1JFR1MgaXNuJ3QgZGVmaW5lZCwKKwlwcmludCBhIG5ld2xpbmUgdG8gZW5kIHRoZSBkaXNwbGF5IGFueXdheS4KKworCSogc3BhcmMtdGRlcC5jIChzcGFyY19wb3BfZnJhbWUpOiAgUG9wIHRoZSBmc3IgYW5kIGNzciAoZmxvYXQgYW5kCisJY29wcm9jZXNzb3Igc3RhdHVzIHJlZ3MpIHdoZW4gcG9wcGluZyBhIGZyYW1lLiAgVGhpcyBmaXhlcyAKKwlmbG9hdCBleGNlcHRpb25zIHRoYXQgb2NjdXIgYWZ0ZXIgY2FsbGluZyBpbmZlcmlvciBmdW5jdGlvbnMuCisKKwkqIHNwYXJjLW5hdC5jIChmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMsIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyk6CisJUmVhZCBhbmQgd3JpdGUgdGhlIGZzciAoZmxvYXQgc3RhdHVzIHJlZ2lzdGVyKSB0by9mcm9tIHRoZSBjaGlsZAorCXByb2Nlc3MgYWxvbmcgd2l0aCB0aGUgZmxvYXQgcmVncy4gIFJlbW92ZSBQZXRlciBTY2hhdWVyJ3MgY2hhbmdlCisJb2YgTWF5IDI0ICc5Mywgd2hpY2ggaGFzIGhpZ2hlciBvdmVyaGVhZCBhbmQgZG9lc24ndCBzb2x2ZSB0aGUKKwlyZWFsIHByb2JsZW0gKHdoaWNoIHdhcyB0aGF0IEZTUiB3YXNuJ3QgYmVpbmcgc2V0KS4KKworTW9uIEphbiAxMCAyMzoxNjo0MiAxOTk0ICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogYTI5ay10ZGVwLmMgKGV4YW1pbmVfcHJvbG9ndWUpOiAgRG9uJ3Qgd29ycnkgaWYgdGhlIEFTR0VRCisJc3RhY2sgb3ZlcmZsb3cgY2hlY2sgaXNuJ3QgcmlnaHQgYWZ0ZXIgdGhlIHJlZ2lzdGVyIHN0YWNrCisJYWRqdXN0bWVudCBpbnN0cnVjdGlvbi4gIE1ldGF3YXJlIFIyLjN1IGNvbXBpbGVyIG1vdmVzIG90aGVyCisJdGhpbmdzIGluIGZyb250IG9mIGl0LiAgVGhpcyBmaXggaXNuJ3QgcGVyZmVjdCBidXQgaXMgd2hhdCdzCisJcnVubmluZy4KKworTW9uIEphbiAxMCAyMDowODoyMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogYy12YWxwcmludC5jIChjX3ZhbF9wcmludCk6IFRyZWF0IFRZUEVfQ09ERV9SQU5HRSBsaWtlIFRZUEVfQ09ERV9JTlQuCisKKwkqIGNvbmZpZy9hbHBoYS9hbHBoYS1uZXR3YXJlLm10OiBSZW5hbWUgdG8gYWxwaGEtbncubXQgZm9yIDE0CisJY2hhcmFjdGVyIGZpbGVuYW1lcy4KKwkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGFjY29yZGluZ2x5LgorCitNb24gSmFuIDEwIDE1OjQ4OjM2IDE5OTQgIFRvbSBMb3JkICAobG9yZEBydGwuY3lnbnVzLmNvbSkKKworCSogbTY4ay1zdHViLmMsIHNwYXJjLXN0dWIuYzogcmVtb3ZlZCBzcHVyaW91cyBpbnRyb2R1Y3Rpb24gb2YgCisJX2ZpbHRlcmVkIGlvIHJvdXRpbmVzIGZyb20gdGhlc2UgdHdvIGZpbGVzLgorCitGcmkgSmFuICA3IDEyOjQyOjQ1IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY29uZmlnL2kzODYvdG0taTM4NnYuaCwgY29uZmlnL202OGsvdG0tbTY4ay5oLCBjb25maWcvbWlwcy90bS1taXBzLmgsCisJY29uZmlnL3ZheC90bS12YXguaCAoQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVCk6ICBEZWZpbmUuCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3N5bWJvbCk6ICBIYW5kbGUgZW51bSBzaC50eXBlIHByb2R1Y2VkIGJ5CisJREVDIGM4OS4gCisJKiBtZGVidWdyZWFkLmMgKGFkZF9saW5lKTogIEhhbmRsZSB6ZXJvIGxpbmVub3MgcHJvZHVjZWQgYnkgREVDIGM4OS4KKworRnJpIEphbiAgNyAxMjo1NToyNSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogdXRpbHMuYyAocHJpbnRfc3lzX2Vycm1zZyk6IENhbGwgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KSBiZWZvcmUKKwlwcmludGluZyB0byBnZGJfc3RkZXJyLgorCisJKiByZW1vdGUtdWRpLmMgKHVkaV9raWxsKTogRG9uJ3QgY2xvc2UgdGhlIGNvbm5lY3Rpb24sIGp1c3Qgc2V0CisJaW5mZXJpb3JfcGlkIHRvIHplcm8uCisJKHVkaV9tb3Vybik6IENhbGwgcmVtb3ZlX2JyZWFrcG9pbnRzLgorCisJKiByZW1vdGUtdWRpLmM6IFJlbW92ZSBvYnNvbGV0ZSBuZWVkX2FydGlmaWNpYWxfdHJhcHMgY29tbWVudC4KKworCSogaTM4NmItbmF0LmMgKHNyZWdtYXApOiBJZiBzRUFYLCBldGMuLCBub3QgZGVmaW5lZCwgdXNlIHRFQVgsIGV0Yy4KKworVGh1IEphbiAgNiAwNzoxNzo1MyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogc3ltdGFiLmMgKGxvb2t1cF9zeW1ib2wpOiBEb24ndCB0cnkgYWRkaW5nIC5jIHRvIHRoZSBuYW1lLgorCisJKiByZW1vdGUtYnVnLmM6IEF0IHRoZSBzdGFydCBvZiBlYWNoIHNlY3Rpb24sIHJlc2V0IHNyZWNfZnJhbWUKKwliYWNrIHRvIDE2MC4KKworCSogdGFyZ2V0Lmg6IEFkZCBUQVJHRVRfV0FJVEtJTkRfTE9BREVEIGFuZCBUQVJHRVRfV0FJVEtJTkRfU1BVUklPVVMuCisJKiB0YXJnZXQuYyAoc3RvcmVfd2FpdHN0YXR1cyk6IEFkZCBDSElMRF9TUEVDSUFMX1dBSVRTVEFUVVMgaG9vay4KKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IFJlcGxhY2UgU0lHVFJBUF9TVE9QX0FGVEVSX0xPQUQgd2l0aAorCWNvZGUgd2hpY2ggbG9va3MgZm9yIHRob3NlIHR3byB3YWl0a2luZHMuICBVc2Ugc3dpdGNoIHN0YXRlbWVudC4KKwkqIGNvbmZpZy9yczYwMDAvdG0tcnM2MDAwLmg6IFJlcGxhY2UgU0lHVFJBUF9TVE9QX0FGVEVSX0xPQUQgd2l0aAorCUNISUxEX1NQRUNJQUxfV0FJVFNUQVRVUy4KKworCSogcHJvY2ZzLmMgKHByb2Nmc193YWl0KTogRml4IGFyZ3VtZW50IG5hbWUgdG8gbWF0Y2ggNCBKYW4gY2hhbmdlcy4KKwkqIE1vdmUgdGFyZ2V0X3NpZ25hbF9mcm9tX2hvc3QsIHRhcmdldF9zaWduYWxfdG9faG9zdCwgYW5kCisJc3RvcmVfd2FpdHN0YXR1cyBmcm9tIGluZnRhcmcuYyB0byB0YXJnZXQuYy4gIHByb2NmcyBuZWVkcyB0aGVtLgorCSogdGFyZ2V0LmM6IEluY2x1ZGUgIndhaXQuaCIgYW5kIDxzaWduYWwuaD4uCisJKiB0YXJnZXQuaCwgaW5mcnVuLmMgKHByb2NlZWQpLCBwcm9jZWVkIGNhbGxlcnM6IFBhc3MgbmV3IGNvZGUKKwlUQVJHRVRfU0lHTkFMX0RFRkFVTFQgaW5zdGVhZCBvZiAtMS4gIFRoaXMgYXZvaWRzIHByb2JsZW1zIHdpdGgKKwllbnVtcyBiZWluZyB0cmVhdGVkIGFzIHVuc2lnbmVkIGFuZCBpcyBjbGVhbmVyLgorCSogaW5mcnVuLmMgKHNpZ25hbHNfaW5mbyk6IERvbid0IHByaW50IFRBUkdFVF9TSUdOQUxfREVGQVVMVCBvcgorCVRBUkdFVF9TSUdOQUxfMC4KKwkqIGluZmNtZC5jIChzaWduYWxfY29tbWFuZCksIGluZnJ1bi5jIChzaWduYWxzX2luZm8pOgorCURvbid0IGFsbG93IHVzZXIgdG8gc3BlY2lmeSBudW1lcmljIGVxdWl2YWxlbnQgb2YKKwlUQVJHRVRfU0lHTkFMX0RFRkFVTFQuCisKK1R1ZSBKYW4gIDQgMTU6MzQ6MzYgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2FscGhhL2FscGhhLW5ldHdhcmUubXQ6ICBOZXcgdGFyZ2V0IHN1cHBvcnQgZm9yIEFscGhhCisJcnVubmluZyBOZXR3YXJlLgorCSogY29uZmlndXJlLmluOiAgQWRkIGFscGhhLSotbmV0d2FyZSogdGFyZ2V0LgorCitUdWUgSmFuICA0IDE0OjUxOjM1IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLW1pcHMuYyAobWlwc193YWl0KTogRml4IHJlZiB0byBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRC4KKworVHVlIEphbiAgNCAwOTo0NzoxNCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogdGFyZ2V0Lmg6IEFkZCBlbnVtIHRhcmdldF93YWl0a2luZCwgZW51bSB0YXJnZXRfc2lnbmFsLCBhbmQKKwlzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMuICBDaGFuZ2Ugc3RhdHVzIGFyZ3VtZW50IHRvIHRhcmdldF93YWl0IHRvCisJYmUgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICogaW5zdGVhZCBvZiBpbnQgKi4KKwkqIHRhcmdldC5oLCBpbmZydW4uYywgYWxsIHRhcmdldHM6IENoYW5nZSB0eXBlIG9mIHNpZ25hbCBhcmd1bWVudHMKKwl0byByZXN1bWUoKSwgcHJvY2VlZCgpLCBhbmQgdGFyZ2V0X3Jlc3VtZSgpIGZyb20gaW50IHRvIGVudW0KKwl0YXJnZXRfc2lnbmFsLgorCSogQWxsIHRhcmdldHMgKCpfd2FpdCwgKl9yZXN1bWUpOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCisJKiBpbmZjbWQuYyAocHJvZ3JhbV9pbmZvLCBzaWduYWxfY29tbWFuZCksIHRocm91Z2hvdXQgaW5mcnVuLmMsIAorCSogZm9yay1jaGlsZC5jLCBzb2xpYi5jLCBocHBhLXRkZXAuYywgb3Nmc29saWIuYzogVXNlIHRoaXMgc3R1ZmYuCisJKiBjb252ZXgteGRlcC5jLCBjb252ZXgtdGRlcC5jOiBBZGQgRklYTUUncyAoZ2V0dGluZyB0aGUgQ29udmV4CisJc2lnbmFsIGNvZGUgc3R1ZmYgcmlnaHQgd2l0aCB0aGUgbmV3IHNpZ25hbHMgd291bGQgYmUgbm9uLXRyaXZpYWwpLgorCSogaW5mZXJpb3IuaCAoc3RvcF9zaWduYWwpOiBNYWtlIGl0IGVudW0gdGFyZ2V0X3NpZ25hbCBub3QgaW50LgorCSogdGFyZ2V0LmMsIHRhcmdldC5oICh0YXJnZXRfc2lnbmFsX3RvX3N0cmluZywgdGFyZ2V0X3NpZ25hbF90b19uYW1lLAorCXRhcmdldF9zaWduYWxfZnJvbV9uYW1lKTogTmV3IGZ1bmN0aW9ucy4KKwkqIGluZnRhcmcuYywgdGFyZ2V0LmggKHRhcmdldF9zaWduYWxfdG9faG9zdCwgdGFyZ2V0X3NpZ25hbF9mcm9tX2hvc3QsCisJc3RvcmVfd2FpdHN0YXR1cyk6IE5ldyBmdW5jdGlvbnMuCisJKiBwcm9jZnMuYyAocHJvY2ZzX25vdGljZV9zaWduYWxzKTogVXNlIHRoZW0uCisJKiBpOTYwLXRkZXAuYyAoaTk2MF9mYXVsdF90b19zaWduYWwpOiBOZXcgZnVuY3Rpb24sIHRvIHJlcGxhY2UKKwlwcmludF9mYXVsdC4KKwkqIGNvbmZpZy9pOTYwL3RtLWk5NjAuaDogRG9uJ3QgZGVmaW5lIFBSSU5UX1JBTkRPTV9TSUdOQUwuCisKKwkqIG9iamZpbGVzLmMgKGJ1aWxkX29iamZpbGVfc2VjdGlvbl90YWJsZSk6IERvbid0IGFib3J0KCkgaWYKKwlvYmpmaWxlLT5zZWN0aW9ucyBpcyBhbHJlYWR5IHNldC4KKworCSogb2JqZmlsZXMuYyAoYWRkX3RvX29iamZpbGVfc2VjdGlvbnMpOiBDaGVjayBTRUNfQUxMT0Mgbm90IFNFQ19MT0FECisJdG8gbWF0Y2ggcmVjZW50IGNoYW5nZSB0byBleGVjLmMuCisKKwkqIFZlcnNpb24gNC4xMS4zLgorCisJKiBtYWluLmMgKHByaW50X2dkYl92ZXJzaW9uKTogQ2hhbmdlIHllYXIgdG8gMTk5NC4KKworCSogQ2hhbmdlTG9nLCBDaGFuZ2VMb2ctOTM6IFNwbGl0IENoYW5nZUxvZyBhdCAxOTk0LgorCSogTWFrZWZpbGUuaW4gKE5PTlNSQyk6IEFkZCBDaGFuZ2VMb2ctOTMuCisKK01vbiBKYW4gIDMgMTE6NTc6MjkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzcmVhZC5jIChyZWFkX3R5cGUpOiBBbGxvdyBkZWZpbmluZyBzZXZlcmFsIHR5cGUgbnVtYmVycworCWF0IG9uY2UgKGUuZy4gIigxLDIpPSgzLDQpPSIuLi4pLgorCisJKiBzdGFic3JlYWQuYyAocmVhZF9lbnVtX3R5cGUpOiBVc2UgVEFSR0VUX0lOVF9CSVQgbm90IHNpemVvZiAoaW50KS4KKworCSogYnJlYWtwb2ludC5jIChmcmFtZV9pbl9kdW1teSk6IENoZWNrIFBDIGFzIHdlbGwgYXMgZnJhbWUuCisKK01vbiBKYW4gIDMgMDI6NDc6MDMgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBtZGVidWdyZWFkLmMgKHBzeW10YWJfdG9fc3ltdGFiXzEpOiAgT25seSBwYXNzIE5fU1RBQiBzeW1ib2xzCisJdG8gcHJvY2Vzc19vbmVfc3ltYm9sLgorCSogc3ltdGFiLmMgKGZpbmRfcGNfcHN5bWJvbCk6ICBTZWFyY2ggZ2xvYmFsX3BzeW1ib2xzIGFzIHdlbGwgdG8KKwlhdm9pZCBjYWNoaW5nIGEgYmFkIGVuZGFkZHIgaW4gZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uLgorCitTdW4gSmFuICAyIDIxOjQxOjE3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWcvbTY4ay90bS1zdW4zLmg6IERvbid0IGRlZmluZSBCRUxJRVZFX1BDQ19QUk9NT1RJT04uCisKK1NhdCBKYW4gIDEgMDQ6MzU6MjMgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiAgRG8gbm90IHN0ZXAgb3Igc3RlcCByZXN1bWUgcGFzdAorCXRoZSBlbmQgb2YgYSBvbmUtbGluZSBmdW5jdGlvbiB3ZSBqdXN0IHN0ZXBwZWQgaW50by4KKworRm9yIG9sZGVyIGNoYW5nZXMgc2VlIENoYW5nZUxvZy05MworDAorTG9jYWwgVmFyaWFibGVzOgorbW9kZTogaW5kZW50ZWQtdGV4dAorbGVmdC1tYXJnaW46IDgKK2ZpbGwtY29sdW1uOiA3NAordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvZ2RiL0NoYW5nZUxvZy05NSBiL2dkYi9DaGFuZ2VMb2ctOTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI2NWJlOAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9DaGFuZ2VMb2ctOTUKQEAgLTAsMCArMSw0OTE1IEBACitGcmkgRGVjIDI5IDE2OjMwOjU4IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogc3ltZmlsZS5jIChmaW5kX3N5bV9mbnMpOiBBZGQgUG93ZXJNYWMgdG8geGNvZmYgZmlsZSByZWNvZ25pdGlvbgorCWtsdWRnZS4KKworRnJpIERlYyAyMiAxMTowNTo1OSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoZ2RiX2hvc3QpOiBBZGQgc3VwcG9ydCBmb3IgREcvVVggcnVubmluZyBvbiB4ODYgYXMKKwlhIGhvc3QuCisgIAkoYWxsIHg4NiB0YXJnZXRzIGFuZCBob3N0cyk6IEFkZCBzdXBwb3J0IGZvciBwZW50aXVtLXBybyBtYWNoaW5lcy4KKworCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCisJKiBjb25maWcvaTM4Ni9pMzg2ZGd1eC5taDogTmV3IGZpbGUgZm9yIERHL1VYIHJ1bm5pbmcgb24geDg2IGhvc3QuCisKK1RodSBEZWMgMjEgMTk6MDk6MjAgMTk5NSAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLWFycmF5LmMgKGFycmF5X3dhaXQpOiBQb2xsIHRoZSBrZXlib2FyZCBhbG9uZyB3aXRoIHRoZQorCXNlcmlhbCBwb3J0IHNvIHVzZXJzIGNhbiB0cHllIGF0IHRoZSB0YXJnZXQgd2hpbGUgdGhlaXIKKwlhcHBsaWNhdGlvbiBpcyBydW5uaW5nLgorCitUaHUgRGVjIDIxIDExOjU4OjUyIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKHBwY2J1Zy1yb20ubywgc3JlYy5vKTogQWRkIGRlcGVuZGVuY2llcy4KKworCSogbW9uaXRvci5jIChtb25pdG9yX2RlYnVnKTogVGFrZSBwcmVmaXgsIGFuZCBzdWZmaXggYXJndW1lbnRzLgorCVByaW50IHRyYWlsaW5nIG5ld2xpbmUgYWZ0ZXIgdGhlIHN1ZmZpeC4KKwkobW9uaXRvcl9wcmludGZ7LF9ub2VjaG99KTogQ2hhbmdlIG1vbml0b3JfZGVidWcgY2FsbHMuCisJKG1vbml0b3JfcHJpbnRmKTogQ2FsbCBtb25pdG9yX2V4cGVjdCBpbnN0ZWFkIG9mIHRyeWluZyB0byBkbyB0aGUKKwlleHBlY3QgcHJvY2Vzc2luZyBsb2NhbGx5IHNvIHRoYXQgaWYgdGhlcmUgaXMgZXh0cmEganVuaywgaXQKKwlkb2Vzbid0IGhhbmcgdGhpbmdzIHVwLgorCShyZWFkY2hhcik6IElmIE1PX0hBTkRMRV9OTCBpcyBzZXQsIGhhbmRsZSBcclxuIHBhaXJzIGFuZCBjb252ZXJ0CisJdGhlbSB0byBhIHNpbmdsZSBcci4gIFVzZSBtb25pdG9yX2RlYnVnIHRvIHByaW50IG91dCBieXRlIHJlYWQuCisKKwkqIG1vbml0b3IuaCAoTU9fSEFORExFX05MKTogQWRkIG5ldyBmbGFnLgorCisJKiBwcGNidWctcm9tLmMgKHBwY2J1Z19vcHN7MSwyfSk6IFNwbGl0IGludG8gdHdvIG9wcywgb25lIHRoYXQKKwl1c2VzIGxvIDAgdG8gbG9hZCwgYW5kIHRoZSBvdGhlciB0aGF0IHVzZXMgbG8gMS4gIFNldCBmbGFnCisJTU9fSEFORExFX05MLgorCShwcGNidWdfb3BlbnswLDF9KTogQ2xvbmUgYW5kIHNwbGl0IHRvIGhhbmRsZSBwcGNidWdfb3BzezEsMn0uCisJKF9pbml0aWFsaXplX3BwY2J1Z19yb20pOiBTZXQgdXAgYm90aCBwcGNidWdfb3BlbnswLDF9LgorCitXZWQgRGVjIDIwIDEwOjU0OjQxIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBkZWZzLmg6IERlbGV0ZSBleHRyYW5lb3VzIHdoaXRlc3BhY2UgYXQgZW5kIG9mIGZpbGUuCisJKiBzeW1maWxlLmg6IE1vdmUgI2luY2x1ZGUgb2YgZGVtYW5nbGUuaCBvdXRzaWRlIGNvbmRpdGlvbmFsLgorCSogb2JqZmlsZXMuaCAoc3RydWN0IG9ianN0YXRzLCBPQkpTVEFULCBPQkpTVEFUUyk6IE5ldyBzdHJ1Y3QgYW5kCisgCW1hY3JvcyB0byBob2xkIHBlci1vYmpmaWxlIHN0YXRpc3RpY3MgZm9yIGludGVybmFsCisgCWluc3RydW1lbnRhdGlvbi4KKwkoc3RydWN0IG9iamZpbGUpOiBBZGQgT0JKU1RBVFMgbWVtYmVyLCB3aGljaCBpcyBvcHRpb25hbC4KKwkqIGJ1aWxkc3ltLmggKG5leHRfc3ltYm9sX3RleHRfZnVuYyk6IE5vdyB0YWtlcyBvYmpmaWxlIGFyZ3VtZW50LgorCUFsc28gdXBkYXRlIGNvcHlyaWdodCB0byAxOTk1LgorCSogZGJ4cmVhZC5jIChkYnhfbmV4dF9zeW1ib2xfdGV4dCk6IE5vdyB0YWtlcyBvYmpmaWxlIGFyZ3VtZW50LgorCShkYnhfc3ltZmlsZV9pbml0LCBjb2Zmc3RhYl9idWlsZF9wc3ltdGFicywgZWxmc3RhYl9idWlsZF9wc3ltdGFicywKKwlzdGFic2VjdF9idWlsZF9wc3ltdGFicyk6IEFjY3VtdWxhdGUgc3RyaW5nIHRhYmxlIHNpemUuCisJKGRieF9uZXh0X3N5bWJvbF90ZXh0LCByZWFkX2RieF9zeW10YWIsIHJlYWRfb2ZpbGVfc3ltdGFiKToKKwlBY2N1bXVsYXRlIG51bWJlciBvZiBzdGFicyBzeW1ib2xzIHJlYWQuIAkKKwkqIGR3YXJmcmVhZC5jIChuZXdfc3ltYm9sLCBzeW10aGVzaXplX3R5cGVkZWYpOgorCUFjY3VtdWxhdGUgbnVtYmVyIG9mIGZ1bGwgc3ltYm9scyBjcmVhdGVkLgorCSogZ2RidHlwZXMuYyAoYWxsb2NfdHlwZSk6IEFjY3VtdWxhdGUgbnVtYmVyIG9mIHR5cGVzLgorCSogbWFpbnQuYyAobWFpbnRlbmFuY2VfcHJpbnRfc3RhdGlzdGljcyk6IE5ldyBmdW5jdGlvbi4KKwkqIG1kZWJ1Z3JlYWQuYyAobWRlYnVnX25leHRfc3ltYm9sX3RleHQpOiBOb3cgdGFrZXMgb2JqZmlsZQorIAlhcmd1bWVudC4KKwkqIG1pbnN5bXMuYyAocHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2xfYW5kX2luZm8pOiBBY2N1bXVsYXRlCisJbnVtYmVyIG9mIG1pbmltYWwgc3ltYm9scyByZWFkLgorCSogb3M5a3JlYWQuYyAocmVhZF9vczlrX3BzeW10YWIpOiBuZXh0X3N5bWJvbF90ZXh0IHRha2VzIG9iamZpbGUKKyAJYXJnLgorCSogcGFydGlhbC1zdGFiLmg6IG5leHRfc3ltYm9sX3RleHQgdGFrZXMgb2JqZmlsZSBhcmcuCisJKiBzdGFic3JlYWQuYyAoZXJyb3JfdHlwZSwgU1RBQlNfQ09OVElOVUUpOiBOb3cgdGFrZXMgb2JqZmlsZSBhcmcKKwlhbmQgdXNlcyBpdCB0byBjYWxsIG5leHRfc3ltYm9sX3RleHQuCisJKiBzeW1maWxlLmMgKGFkZF9wc3ltYm9sX3RvX2xpc3QsIGFkZF9wc3ltYm9sX2FkZHJfdG9fbGlzdCk6CisJQWNjdW11bGF0ZSBudW1iZXIgb2YgcGFydGlhbCBzeW1ib2xzIGNyZWF0ZWQuCisJKiBzeW1maWxlLmggKEFERF9QU1lNQk9MX1ZUX1RPX0xJU1QpOiBBY2N1bXVsYXRlIG51bWJlciBvZiBwYXJ0aWFsCisJc3ltYm9scyBjcmVhdGVkLgorCSogc3ltbWlzYy5jIChwcmludF9vYmpmaWxlX3N0YXRpc3RpY3MpOiBQcmludCB0aGUgcGVyLW9iamZpbGUKKwlpbnRlcm5hbCBpbnN0cnVtZW50YXRpb24gc3RhdGlzdGljcyBnYXRoZXJlZC4KKwkqIHhjb2ZmcmVhZC5jICh4Y29mZl9uZXh0X3N5bWJvbF90ZXh0KTogTm93IHRha2VzIG9iamZpbGUgYXJndW1lbnQuCisKK0ZyaSBEZWMgMTUgMTY6MTU6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB0b3AuYyAoc2V0X2VuZGlhbl9mcm9tX2ZpbGUpOiBVc2UgbmV3IGJmZF9iaWdfZW5kaWFuIG1hY3JvLgorCitGcmkgRGVjIDE1IDEyOjIxOjEwIDE5OTUgIFJheW1vbmQgSm91ICA8cmpvdUBtZXhpY2FuLmN5Z251cy5jb20+CisKKwkqIG1wdy1tYWtlLnNlZDogQWRkIHF1b3RlcyB0byBSSW5jbHVkZXMgcmVmZXJlbmNlLiAKKworRnJpIERlYyAxNSAxMzoxODo1NSAxOTk1ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1hcnJheS5jOiBSZW1vdmUgYm9ndXMgc2V0dGluZyBvZiBiYXVkcmF0ZSB0byA0ODAwLiBUaGVpcgorCWhhcmR3YXJlIGhhcyByZWFsIFVBUlRTIG5vdy4KKworTW9uIERlYyAxMSAxODoxOToxNiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwYy0qLW1hY29zKik6IE5ldyB0YXJnZXQgY29uZmlndXJhdGlvbi4KKwkqIGNvbmZpZ3VyZTogVXBkYXRlLgorCSogY29uZmlnL3Bvd2VycGMvbWFjb3MubWgsIGNvbmZpZy9wb3dlcnBjL21hY29zLm10LAorIAljb25maWcvcG93ZXJwYy9ubS1tYWNvcy5oLCBjb25maWcvcG93ZXJwYy90bS1tYWNvcy5oLCBtYWMtbmF0LmM6CisgCU5ldyBmaWxlcywgbmF0aXZlIFBvd2VyTWFjIGRlYnVnZ2luZyBzdXBwb3J0LgorCSogTWFrZWZpbGUuaW4gKG1hYy1uYXQubyk6IEFkZCBidWlsZCBydWxlLgorCSogbXB3LWNvbmZpZy5pbiAoZW5hYmxlX2NmbGFncyk6IEFkZCBzdXBwb3J0LgorCShtNjhrLWFwcGxlLW1hY29zLCBwb3dlcnBjLWFwcGxlLW1hY29zKTogRml4IG5hdGRlcGZpbGVzIHRvCisJbGlzdCBvYmplY3QgZmlsZSBpbnN0ZWFkIG9mIHNvdXJjZSBmaWxlLgorCSogbXB3LW1ha2Uuc2VkIChARU5BQkxFX0NGTEFHU0ApOiBEb24ndCBlZGl0IG91dCwgcmVwbGFjZSB3aXRoCisJdmFsdWUgb2YgdmFyaWFibGUuCisJKGluc3RhbGwsIGluc3RhbGwtb25seSk6IEVkaXQgTVBXLXNwZWNpZmljIGluc3RhbGxhdGlvbiBpbnRvCisJcGxhY2Ugb2YgVW5peCBzaGVsbCBjb2RlLgorCSogbWFjLWdkYi5yOiBGaXggdmVyc2lvbiByZXNvdXJjZXMgdG8gdXNlIHN5bWJvbGljIHZlcnNpb24gc3RyaW5ncy4KKwkoY2ZyZyk6IE5ldyByZXNvdXJjZSwgY29kZSBmcmFnbWVudCBmb3IgUG93ZXJNYWMuCisKK01vbiBEZWMgMTEgMTQ6MTM6MDMgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGFtaWdhbGliLmNvbT4KKworCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpOiBXaGVuIGxvb2tpbmcgYXQgdGhlIG5leHQKKwltaW5pbWFsIHN5bWJvbCwgY2hlY2sgZm9yIGVuZCBvZiB0aGUgbWluaW1hbCBzeW1ib2wgYXJyYXkKKyAJKHN5bWJvbCB3aXRoIE5VTEwgcG9pbnRlciBmb3IgbmFtZSkgYmVmb3JlIGRlcmVmZXJlbmNpbmcgaXQuCisKK01vbiBEZWMgMTEgMTU6NTY6NTUgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3RydWN0X3R1cGxlKTogIEZpeCB0aGlua28uCisKK01vbiBEZWMgMTEgMDY6NTI6MDIgMTk5NSAgV2lsZnJpZWQgTW9zZXIgIDxtb3NlckBydGwuY3lnbnVzLmNvbT4KKworCSogY2gtdHlwZXByaW50LmMgKGNoaWxsX3R5cGVfcHJpbnRfYmFzZSk6IFNsaWdodGx5IGNoYW5nZSBvZiBwcmludGluZworCW9mIHZhcmlhbnQgc3RydWN0dXJlcy4KKworTW9uIERlYyAxMSAwMDozNjowMSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogdmFsb3BzLmMgKHZhbHVlX2Nhc3QpOiAgSGFuZGxlIGNhc3RzIHRvIGFuZCBmcm9tIFRZUEVfQ09ERV9DSEFSLgorCSogY2gtZXhwLmMgKG1hdGNoX2ludGVnZXJfbGl0ZXJhbCk6ICBGaXggbG9uZyBsb25nIHN1cHBvcnQuCisJKiBnZGJ0eXBlcy5jIChnZXRfZGlzY3JldGVfYm91bmRzKTogIE1ha2UgVFlQRV9MRU5HVEggKHR5cGUpID09CisJc2l6ZW9mIChMT05HRVNUKSBjYXNlIHdvcmsgT0suCisKK0ZyaSBEZWMgIDggMjE6MDI6MjQgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvZmZyZWFkLmMsIGRieHJlYWQuYywgZHN0cmVhZC5jLCBvYmpmaWxlcy5jLCBvczlrcmVhZC5jLAorCXN5bWZpbGUuYywgc3ltdGFiLmM6ICBVc2UgIm9ic3RhY2suaCIgcmF0aGVyIHRoYW4gPG9ic3RhY2suaD4uCisKK1dlZCBEZWMgIDYgMTY6MTY6MTggMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS1taXBzLmMgKG1pcHNfcmVjZWl2ZV9oZWFkZXIpOiAgQWxsb3cgbWlwc19zeW5fZ2FyYmFnZSB0byBiZQorCXVzZXItc2V0dGFibGUgKHZpYSBzZXQgc3luLWdhcmJhZ2UtbGltaXQpLiAgU2V0dGluZyBpdCB0byAtMSBtYWtlcworCWl0IHVubGltaXRlZC4KKworVHVlIERlYyAgNSAxODozMzo0MyAxOTk1ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+CisKKwkqIGdkYnR5cGVzLmMgKGNoZWNrX3N0dWJfbWV0aG9kKTogTWFrZSBzdXJlIHdlIGdldCBiYWNrIGEgZnVuY3Rpb24KKwlzdHJpbmcgaW4gdGhlIGRlbWFuZ2xlZCBuYW1lIGJlZm9yZSB3ZSB0cnkgdG8gdXNlIGl0LgorCitUdWUgRGVjICA1IDE4OjA4OjI5IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIG1vbml0b3IuYyAobW9uaXRvcl9leHBlY3RfcmVnZXhwKTogIE1ha2Ugc3RhdGljLCBhZGQgcHJvdG90eXBlLgorCSogKG1vbml0b3JfcmVhZF9tZW1vcnlfc2luZ2xlKTogIENhbGwgbW9uaXRvcl9leHBlY3RfcmVnZXhwIHdpdGgKKwlwb2ludGVyIHRvIGdldG1lbV9yZXNwX2RlbGltX3BhdHRlcm4sIG5vdCBlbnRpcmUgc3RydWN0LgorCitUdWUgRGVjICA1IDE1OjUxOjI1IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogYy1sYW5nLmggKGNfb3BfcHJpbnRfdGFiKTogRG9uJ3QgZGVjbGFyZSwgc29tZSBjb21waWxlcnMKKwljb25zaWRlciBpbGxlZ2FsIGlmIHN0cnVjdHVyZSBub3QgZGVmaW5lZCwgYW5kIG9ubHkgdXNlZAorCWluIGMtbGFuZy5jIGFueXdheS4KKworU3VuIERlYyAgMyAxMjozMTowMyAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHBfc3RhbmRhcmQgY2FzZSk6ICBGaXggdHlwby4KKworU3VuIERlYyAgMyAxMTo1OToyMSAxOTk1ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BjeWdudXMuY29tPgorCisJKiBjaC1leHAuYyAocGFyc2VfbmFtZWRfcmVjb3JkX2VsZW1lbnQpOiBBdm9pZCBhZ2dyZWdyYXRlCisJaW5pdGlhbGl6YXRpb25zIGZvciBhdXRvbWF0aWMgdmFyaWFibGVzLgorCisJKiBocHBhLXRkZXAuYyAoaHBwYV9hbGlnbm9mKTogRml4IHR5cG8gaW4gbGFzdCBjaGFuZ2UuCisKK1NhdCBEZWMgIDIgMTk6MzI6NTcgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHN5bWZpbGUuYyAoZ2xvYmFsX3BzeW1ib2xzLCBzdGF0aWNfcHN5bWJvbHMpOiAgUmVtb3ZlLCB1bnVzZWQuCisKK1NhdCBEZWMgIDIgMDM6MDI6MjEgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBhbHBoYS10ZGVwLmMgKGhldXJpc3RpY19wcm9jX2Rlc2MpOiAgQWRkIGhldXJpc3RpYyB0bworCWRldGVybWluZSB0aGUgcmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIsIG5lZWRlZCBmb3IgT1NGLzEtMy4yQy4KKwkqIGNvbmZpZy9hbHBoYS90bS1hbHBoYS5oIChUN19SRUdOVU0sIFQ5X1JFR05VTSk6ICBEZWZpbmUuCisKK0ZyaSBEZWMgIDEgMDc6MjM6NTcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBwcGNidWctcm9tLmMgKHBwY2J1Z19jbWRzKTogVHVybiBvbiBNT19HRVRNRU1fUkVBRF9TSU5HTEUKKwliZWNhdXNlIFBQQ2J1ZyBkaXNwbGF5cyB0aGUgbWVtb3J5IGFzIGNoYXJhY3RlcnMgYXMgd2VsbCBhcyBoZXguCisJRml4IGdldG1lbS9zZXRtZW0gY29tbWFuZHMuCisKKwkqIHNyZWMuYyAobG9hZF9zcmVjKTogRml4IG9mZiBieSBvbmUgdHlwbyBpbiBsYXN0IHN1Ym1pc3Npb24uCisKKwkqIHJzNjAwMC10ZGVwLmMgKHB1c2hfYXJndW1lbnRzKTogRml4IHR5cG8uCisKK1RodSBOb3YgMzAgMjM6NTQ6MTcgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIGxhbmd1YWdlLmMgKGxhbmdfYm9vbF90eXBlKSwgbGFuZ3VhZ2UuaDogIE5ldyBmdW5jdGlvbi4KKwkqIGxhbmd1YWdlLmggKExBX0JPT0xfVFlQRSk6ICBOZXcgbWFjcm8uCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cF9zdGFuZGFyZCkgIFVzZSBMQV9CT09MX1RZUEUgaW5zdGVhZAorCW9mIGJ1aWx0aW5fdHlwZV9pbnQgd2hlcmUgYXBwcm9wcmlhdGUsCisJKiB2YWxhcml0aC5jICh2YWx1ZV9zdWJzY3JpcHQpOiAgTGlrZXdpc2UuCisKKwkqIHZhbG9wcy5jICh2YWx1ZV9zbGljZSk6ICBJbXBsZW1lbnQgKHZhbHVlKSBiaXRzdHJpbmcgc2xpY2VzLgorCSogdmFscHJpbnQuYyAodmFsX3ByaW50KTogIElmIFRZUEVfTEVOR1RIIGlzIHplcm8sIGRvbid0IGF1dG9tYXRpY2FsbHkKKwlwcmludCAiPGluY29tcGxldGUgdHlwZT4iIC0gQ2hpbGwgaGFzIHplcm8tbGVuZ3RoIChzdHJpbmcpIHR5cGVzLgorCisJKiBnZGJ0eXBlcy5jIChjaGVja19zdHViX3R5cGUpOiAgUmVtb3ZlZDsgIG5vIGxvbmdlcyBuZWVkZWQuCisJKiBjaC1leHAuYyAoZXhwZWN0LCBwYXJzZV9jYWxsKTogIFR3ZWFrIGVycm9yIG1lc3NhZ2VzLgorCitXZWQgTm92IDI5IDEzOjM1OjE4IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBzY20tdmFscHJpbnQuYyAoc2NtX2lzeW1uYW1lcyk6ICBSZW1vdmUgIiNAIiBwcmVmaXguCisJKHNjbV9zY212YWxfcHJpbnQpOiAgRG8gbm90IHByaW50ICIjQCIgcHJlZml4LgorCisJKiBnZGJ0eXBlcy5oIChlbnVtIHR5cGVfY29kZSk6ICBBZGRlZCBUWVBFX0NPREVfVFlQRURFRi4KKwkoY2hlY2tfdHlwZWRlZik6ICBOZXcgcHJvdG90eXBlLgorCShDSEVDS19UWVBFREVGKTogIE5ldyBtYWNyby4KKwkoVFlQRV9EVU1NWV9SQU5HRSk6ICBSZW1vdmVkLgorCSogZ2RidHlwZXMuYyAoZ2V0X2Rpc2NyZXRlX2JvdW5kcyk6ICBGaXggcGFyZW4gZXJyb3I7IG1ha2UgbW9yZSByb2J1c3QuCisJKGNyZWF0ZV9hcnJheV90eXBlKTogIERvbid0IGZvcmNlX3RvX3JhbmdlX3R5cGU7ICB1c2VycyBvZiB0aGUKKwlhcnJheSBhcmUgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIG5vbi1yYW5nZSBpbmRleCB0eXBlcy4KKwkoY3JlYXRlX3NldF90eXBlKTogIExpa2V3aXNlLgorCShmb3JjZV90b19yYW5nZV90eXBlKTogIFJlbW92ZWQuCisJKGNoZWNrX3R5cGVkZWYpOiAgTmV3IGZ1bmN0aW9uIGhhbmRsZXMgc3R1YiB0eXBlcyBhbmQgdHlwZWRlZnMuCisJKGNoZWNrX3N0dWJfdHlwZSk6ICBKdXN0IGNhbGwgY2hlY2tfdHlwZWRlZi4gKFRvIGJlIHJlbW92ZWQuKQorCShyZWN1cnNpdmVfZHVtcF90eXBlKTogIEhhbmRsZSBUWVBFX0NPREVfVFlQRURFRi4KKwkqIGNoLWxhbmcuYyAodHlwZV9sb3dlcl91cHBlcik6ICBVc2UgZ2V0X2Rpc2NyZXRlX2JvdW5kcy4KKwkoZXZhbHVhdGVfc3ViZXhwX2NoaWxsKTogIEhhbmRsZSBzdHJpbmcgcmVwZXRpdGlvbi4KKwlSZS1hcnJhbmdlIHRvIGhhbmRsZSBFVkFMX0FWT0lEX1NJREVfRUZGRUNUUyBiZXR0ZXIuCisJKiBjaC10eXBlcHJpbnQuYyAoY2hpbGxfdHlwZV9wcmludF9iYXNlKTogIEhhbmRsZSBUWVBFX0NPREVfVFlQRURFRi4KKwlQYXNzIHNob3c9MCBpbiByZWN1cnNpdmUgY2FsbHMgdmFyaW91cyBwbGFjZXMuCisJKGNhc2UgVFlQRV9DT0RFX0FSUkFZKTogIERvbid0IHJlcXVpcmUgaW5kZXggdHlwZSB0byBoYXZlCisJVFlQRV9DT0RFX1JBTkdFLgorCShjYXNlIFRZUEVfQ09ERV9SQU5HRSk6ICBEb24ndCBuZWVkIHRvIHN1cHBvcnQgVFlQRV9EVU1NWV9SQU5HRS4KKwkqIGdkYnR5cGVzLmMsIGNoLWxhbmcuYywgY2gtdHlwZXByaW50LmMgKG51bWVyb3VzIHBsYWNlcyk6CisJQWRkIGNoZWNrX3R5cGVkZWYvQ0hFQ0tfVFlQRURFRiBhcyBuZWVkZWQuCisKKwkqIGNoLWV4cC55OiAgUmVwbGFjZWQgYnkgLi4uCisJKiBjaC1leHAuYzogIE5ldyBmaWxlLiAgVXNlIHJlY3Vyc2l2ZS1kZXNjZW50LgorCVJlY29nbml6ZSBsYWJlbGxlZCBhcnJheSB0dXBsZXMgYW5kIHBvd2Vyc2V0IHJhbmdlcy4KKwkqIE1ha2VmaWxlLmluOiAgVXBkYXRlIGZvciBubyBsb25nZXIgdXNpbmcgeWFjYyBmb3IgY2gtZXhwLgorCisJKiBjLWxhbmcuYzogIE1ha2UgdmFyaW91cyBmdW5jdGlvbnMgbm9uLXN0YXRpYy4KKwkqIGMtbGFuZy5oOiAgQWRkIGJ1bmNoZXMgb2YgcHJvdG90eXBlcy4KKwkqIGNwLXZhbHByaW50LmMgKGNwX3ByaW50X3ZhbHVlX2ZpZWxkcyk6ICBBbHNvIHRha2UgYWRkcmVzcy4KKwkoY3BfcHJpbnRfdmFsdWUpOiAgTGlrZXdpc2UuICBVc2UgYmFzZWxjYXNzX29mZnNldC4KKwkqIHN0YWJzcmVhZC5jIChjdXJyZW50X3N5bWJvbCk6ICBOZXcgc3RhdGljIHZhcmlhYmxlLgorCSh0eXBlX3N5bm9ueW1fbmFtZSk6ICBSZW1vdmUuCisJKHJlYWRfdHlwZSk6ICBJZiBjb3B5aW5nLCBtYWtlIGNvcHkgYmUgYSBUWVBFX0NPREVfVFlQRURFRi4KKwkocmVhZF9hcnJheV90eXBlKTogIERvbid0IG5lZWQgdG8gaGFuZGxlIHVuZGVmaW5lZCBlbGVtZW50IHR5cGUgaGVyZS4KKwkoY2xlYW51cF91bmRlZmluZWRfdHlwZXMpOiAgRGl0dG8uCisJKHJlYWRfcmFuZ2VfdHlwZSk6ICBMb29rIGZvciBDaGlsbCByYW5nZXMuCisJKiB2YWxvcHMuYyAodmFsdWVfYXNzaWduKTogIEZpeCBjYXNlIGx2YWxfaW50ZXJuYWx2YXIgLSBkb24ndCB0cnkKKwl0byBhc3NpZ24gaW50byBvbGQgdmFsdWUgKHdoaWNoIG1pZ2h0IGJlIHRvbyBzbWFsbCEpLgorCSh2YWx1ZV9jb2VyY2VfYXJyYXkpOiAgTm8gbG9uZ2VyIG5lZWQgc3BlY2lhbCBWQUxVRV9SRVBFQVRFRCBoYW5kbGluZy4KKwkodmFsdWVfYXJnX2NvZXJjZSk6ICBDbGVhbmVyIGFycmF5LT5wb2ludGVyIGRlY2F5IG1lY2hhbmlzbS4KKwkoc2VhcmNoX3N0cnVjdF9maWVsZCk6ICBVc2UgYmFzZWNsYXNzX29mZnNldCByYXRoZXIgdGhhbgorCWJhc2VjbGFzc19hZGRyLgorCSh2YWx1ZV9zbGljZSk6ICBVc2UgZ2V0X2Rpc2NyZXRlX2JvdW5kcy4KKwkqIHZhbHVlLmggKENPRVJDRV9WQVJZSU5HX0FSUkFZKTogIFRha2UgdHlwZSBhcmd1bW50IGFzIHdlbGwuCisJKiB2YWx1ZXMuYyAoYmFzZWNsYXNzX29mZnNldCk6ICBDaGFuZ2UgcGFyYW1ldGVyIGludGVyZmFjZS4KKwkoYmFzZWNsYXNzX2FkZHIpOiAgUmVtb3ZlZC4KKwkqIGMtdHlwZXByaW50LmMsIGMtdmFscHJpbnQuYywgY2gtdmFscHJpbnQuYywgdmFsdWVzLmMsIHZhbG9wcy5jOgorCUFkZCBjaGVja190eXBlZGVmL0NIRUNLX1RZUEVERUYgYXMgbmVlZGVkLgorCisJKiBhbHBoYS10ZGVwLmMsIGMtZXhwLnksIGg4NTAwLXRkZXAuYywgZi1leHAueSwgZi12YWxwcmludC5jLAorCWZpbmR2YXIuYywgaHBwYS10ZGVwLmMsIGluZmNtZC5jLCBsYW5ndWFnZS5jLCBwcmludGNtZC5jLAorIAlyczYwMDAtdGRlcC5jLCBzeW1taXNjLmMsIHN5bXRhYi5jLCBtZGVidWdyZWFkLmM6CisJQWRkIGNoZWNrX3R5cGVkZWYvQ0hFQ0tfVFlQRURFRiBhcyBuZWVkZWQuCisKKwkqIGYtdHlwZXByaW50LmMsIHZhbGFyaXRoLmMsIHZhbHByaW50LmMsIHR5cGVwcmludC5jLCBldmFsLmM6CisJQWRkIGNoZWNrX3R5cGVkZWYvQ0hFQ0tfVFlQRURFRiBhcyBuZWVkZWQuCisJKiBmLXR5cGVwcmludC5jOiAgVmFyaW91cyBjbGVhbmluZyB1cC4KKwkqIHZhbGFyaXRoLmMgKHZhbHVlX3N1YnNjcmlwdCk6ICBBbHNvIHN1YnNjcmlwdCBiaXRzdHJpbmdzIChmb3IgQ2hpbGwpLgorCSogdHlwZXByaW50LmMgKHByaW50X3R5cGVfc2NhbGFyKTogIEFsc28gc3VwcG9ydCBUWVBFX0NPREVfUkFOR0UuCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cF9zdGFuZGFyZCBjYXNlIE9QX0FSUkFZKTogIEltcGxlbWVudAorCXN1cHBvcnQgZm9yIGxhYmVsbGVkIGFycmF5IHR1cGxlcyBhbmQgcmFuZ2VzIGluIHBvd2Vyc2V0IHR1cGxlcy4KKwkoaW5pdF9hcnJheV9lbGVtZW50KTogIE5ldyBmdW5jdGlvbi4KKwkKKwkqIHRvcC5jIChjb21tYW5kX2xpbmVfaW5wdXQpOiAgT25seSBzdHJpcCBvdXQgYW4gaW5pdGlhbCAjLWNvbW1lbnQuCisJTG9va2luZyBmb3IgaW50ZXJuYWwgY29tbWVudHMgaXMgbGFuZ3VhZ2Utc3BlY2lmaWMgKGJyZWFrcyBTY2hlbWUpLgorCQorCSogZXhwcmVzc2lvbi5oIChlbnVtIGV4cF9vcGNvZGUpOiAgQWRkIEJJTk9QX1JBTkdFLgorCSogZXhwcHJpbnQuYyAoZHVtcF9leHByZXNzaW9uKTogIFN1cHBvcnQgQklOT1BfUkFOR0UuCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cF9zdGFuZGFyZCk6ICBIYW5kbGUgQklOT1BfUkFOR0UgKGFzIGVycm9yKS4KKwkoY2FzZSBNVUxUSV9TVUJTQ1JJUFQpOiAgRml4IGJyb2tlbiBmNzcgdmFsdWUtPmludCBhZCBob2MgY29udmVyc2lvbi4KKwkqIGNoLWxhbmcuYyAoY2hpbGxfb3BfcHJpbnRfdGFiKTogIFN1cHBvcnQgQklOT1BfUkFOR0UuCisJKGV2YWx1YXRlX3N1YmV4cF9jaGlsbCk6ICBFcnJvciBvbiBCSU5PUF9DT01NQS4KKworCSogTWFrZWZpbGUuaW46ICBDbGVhbiB1cCBzbyBkb2Mgc3R1ZmYgc3RheXMgaW4gZG9jIHN1Yi1kaXIuCisKK1dlZCBOb3YgMjkgMTY6Mzk6NTAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBtb25pdG9yLmMgKG1vbml0b3JfZGVidWcpOiBOZXcgZnVuY3Rpb24gdG8gcHJpbnQgbW9uaXRvciBkZWJ1ZworCW91dHB1dCBpbiBwcmludGFibGUgZmFzaGlvbi4KKwkobW9uaXRvcl9wcmludGZ7LF9ub2VjaG99KTogQ2FsbCBtb25pdG9yX2RlYnVnIGluc3RlYWQgb2YKKwlmcHV0c191bmZpbHRlcmVkLgorCisJKiBzcmVjLmMgKGxvYWRfc3JlYyk6IFdoZW4gcHJpbnRpbmcgc3JlYyBkZWJ1ZyBpbmZvcm1hdGlvbiwgZG8gbm90CisJcHJpbnQgdGhlIGNhcnJpYWdlIHJldHVybiBkaXJlY3RseSwgaW5zdGVhZCBwcmludCBcXHIgZm9sbG93ZWQgYnkKKwlhIG5ld2xpbmUuCisKK1R1ZSBOb3YgMjggMTU6MjU6MjggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKHRhcmdldF9zdWJkaXIpOiBEZWZpbmUuCisJKENDX0ZPUl9UQVJHRVQsIENYWF9GT1JfVEFSR0VUKTogVXNlIGl0IHRvIGZpbmQgdGFyZ2V0IGxpYnJhcmllcy4KKwkqIGNvbmZpZ3VyZS5pbiAoWF9DRkxBR1MpOiBGaXggdHlwby4KKwkodGFyZ2V0X3N1YmRpcik6IFNldCB0byAiJHt0YXJnZXRfYWxpYXN9LyIgaWYgY3Jvc3MuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCisJKiBkYnhyZWFkLmMgKGRieF9zeW1maWxlX3JlYWQpOiBTZXQgYmxvY2tfYWRkcmVzc19mdW5jdGlvbl9yZWxhdGl2ZQorCWZvciBgcGUnIGZvcm1hdCBmaWxlcy4KKworVHVlIE5vdiAyOCAxMToxNzo0NyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogbWFnaWMuaDogIFJlbmFtZWQgdG8gZ21hZ2ljLmggdG8gYXZvaWQgPG1hZ2ljLmg+IGNvbmZsaWN0LgorCSogbWFnaWMuYzogIFJlbmFtZWQgdG8gZ21hZ2ljLmMgaW4gc3ltcGF0aHkuCisJKiBldmFsLmMsIGdtYWdpYy5jLCBjb25maWcvdG0tbWFnaWMuaDoKKyAJSW5jbHVkZSAiZ21hZ2ljLmgiIHJhdGhlciB0aGFuICJtYWdpYy5oIi4KKworU2F0IE5vdiAyNSAwMjo1NjozOCAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIG1kZWJ1Z3JlYWQuYyAoaGFuZGxlX3BzeW1ib2xfZW51bWVyYXRvcnMsIHBhcnNlX3N5bWJvbCk6CisJUmVjb2duaXplIGVudW1zIGZyb20gYWxwaGEgY2MgLW1pZ3JhdGUuCisJKHVwZ3JhZGVfdHlwZSk6ICBQYXNzIGNvcnJlY3QgZmQgdG8gcGFyc2Vfc3ltYm9sIHdoZW4gcGFyc2luZworCXRoZSBpbmRleCB0eXBlIG9mIGFuIGFycmF5LgorCShwYXJzZV9wcm9jZWR1cmUsIHBhcnNlX2xpbmVzLCBwc3ltdGFiX3RvX3N5bXRhYl8xKTogIEhhbmRsZQorCXVuc29ydGVkIHByb2NlZHVyZSBkZXNjcmlwdG9ycyBmcm9tIElyaXggNS54IGFuZCBBbHBoYSBPU0YvMS0zLngKKwlzaGFyZWQgbGlicmFyaWVzLiBVc2UgQ09SRV9BRERSIGluc3RlYWQgb2YgYHVuc2lnbmVkIGxvbmcnIGluCisJcHJvY2VkdXJlIGRlc2NyaXB0b3IgYWRkcmVzcyBjb21wdXRhdGlvbnMuCisKKwkqIHN5bXRhYi5jIChkZWNvZGVfbGluZV8xKTogIFByZXZlbnQgYWNjaWRlbnRhbCBzdHJjaHIgbWF0Y2gKKwlvZiBhIG51bGwgY2hhcmFjdGVyIHdpdGggdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyIG9mCisJZ2RiX2NvbXBsZXRlcl9xdW90ZV9jaGFyYWN0ZXJzLgorCShjcGx1c3BsdXNfaGludCk6ICBNYWtlIHN1cmUgdGhhdCBvbmx5IGEgc2luZ2xlIHF1b3RlIGlzIHByaW50ZWQKKwlpbiB0aGUgaGludCBtZXNzYWdlLgorCitGcmkgTm92IDI0IDE2OjE3OjAxIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogdG9wLmMgKHJlY3Vyc2VfcmVhZF9jb250cm9sX3N0cnVjdHVyZSk6IERvbid0IG1ha2UgY2xlYW51cHMKKwloZXJlLiAgQ2FsbGVycyBoYW5kbGUgdGhhdCBjb3JyZWN0bHkuCisKK1R1ZSBOb3YgMjEgMTU6MTY6MzQgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQHJ0bC5jeWdudXMuY29tPgorCisJKiBjb25maWcvbTY4ay94bS1ocDMwMGhwdXguaDogRGVmaW5lIE1NQVBfQkFTRV9BRERSRVNTIGFuZCBNTUFQX0lOQ1JFTUVOVC4KKwlBbHNvIGZvcmNlIEhBVkVfTU1BUCB0byBiZSBkZWZpbmVkIHNpbmNlIGF1dG9jb25mIGlzIGN1cnJlbnRseSBicm9rZW4KKwlmb3IgZGV0ZWN0aW5nIGEgd29ya2luZyBtbWFwIHVuZGVyIGhwdXguCisJKiBjb25maWcvcGEveG0taHBwYWguaCAoTU1BUF9CQVNFX0FERFJFU1MpOiBUd2VhayBNTUFQX0JBU0VfQUREUkVTUworCXRvIGEgYmV0dGVyIHZhbHVlIHN1Z2dlc3RlZCBieSBKZWZmcmV5IEEgTGF3IChsYXdAY3lnbnVzLmNvbSkuCisKK1R1ZSBOb3YgMjEgMDg6NDg6NTggMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9wYS94bS1ocHBhaC5oOiBEZWZpbmUgTU1BUF9CQVNFX0FERFJFU1MgYW5kIE1NQVBfSU5DUkVNRU5ULgorCUFsc28gZm9yY2UgSEFWRV9NTUFQIHRvIGJlIGRlZmluZWQgc2luY2UgYXV0b2NvbmYgaXMgY3VycmVudGx5IGJyb2tlbgorCWZvciBkZXRlY3RpbmcgYSB3b3JraW5nIG1tYXAgdW5kZXIgaHB1eC4KKwkqIG9iamZpbGVzLmMgKG1hcF90b19hZGRyZXNzKTogSGF2ZSBnZGIgcHJpbnQgYSB3YXJuaW5nIHdoZW4gaXQKKwlpcyBjb21waWxlZCB3aXRoIEhBVkVfTU1BUCBidXQgd2l0aG91dCBib3RoIE1NQVBfQkFTRV9BRERSRVNTIGFuZAorIAlNTUFQX0lOQ1JFTUVOVCBkZWZpbmVkICh0aHVzIG1ha2luZyBpdCBhcHBlYXIgbW1hcCBkb2Vzbid0IHdvcmspLgorCitNb24gTm92IDIwIDE0OjEzOjUzIDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBBZGQgc3VwcG9ydCBmb3IgZHluYW1pYyBmdW5jdGlvbgorCXRyYW1wb2xpbmVzLiAgVGhlc2UgYXJlIHBpZWNlcyBvZiBjb2RlIGJldHdlZW4gdGhlIGNhbGxlciBhbmQgdGhlCisJY2FsbGVlIHRoYXQgZmlndXJlIG91dCB0aGUgYWRkcmVzcyBvZiB0aGUgY2FsbGVlJ3MgY29kZSBhdCBydW4KKwl0aW1lLiAgVXBvbiBlbnRyeSwgd2UgY2FuJ3QgZmlndXJlIG91dCB0aGUgY2FsbGVlJ3MgYWRkcmVzcywgc28gd2UKKwlzZXQgYSBicmVha3BvaW50IHdpdGhpbiB0aGUgdHJhbXBvbGluZSB3aGVyZSB0aGUgYWRkcmVzcyB3aWxsIGJlCisJa25vd24sIGFuZCBjb250aW51ZSB0aGUgdGFyZ2V0LiAgT25jZSB3ZSBoaXQgdGhlIGJyZWFrcG9pbnQsIHdlCisJYnJlYWsgYXQgdGhlIGNhbGxlZSdzIGFkZHJlc3MgYW5kIHByb2NlZWQgYXMgdXN1YWwuCisKK01vbiBOb3YgMjAgMTE6MTI6MzQgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIG9iamZpbGVzLmMgKGFsbG9jYXRlX29iamZpbGUpOiBDaGFuZ2Ugd2FybmluZyBtZXNzYWdlIGFib3V0IG1hcHBlZAorCXN5bWJvbCB0YWJsZXMgc28gdGhhdCBpdCBpcyBvYnZpb3VzIHRoYXQgdGhleSBhcmUgbm90IHN1cHBvcnRlZCBvbgorCXRoaXMgcGFydGljdWxhciBtYWNoaW5lIHJhdGhlciB0aGFuIGltcGx5aW5nIHRoZXkgYXJlIG5vdCBzdXBwb3J0ZWQKKwlhdCBhbGwgaW4gdGhpcyB2ZXJzaW9uIG9mIGdkYi4KKworU3VuIE5vdiAxOSAwNToyMDo1MyAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGlyaXg1LW5hdC5jLCBvc2Zzb2xpYi5jIChzb2xpYl9hZGRyZXNzKTogIFJldHVybiB0aGUgbmFtZSBvZiB0aGUKKwljb250YWluaW5nIHNvbGliLgorCSogc3RhY2suYyAocHJpbnRfZnJhbWVfaW5mbyk6ICBVc2UgbWluaW1hbCBzeW1ib2wgb25seSBpZgorCWZpLT5wYyBpcyBpbiBhIGtub3duIHNlY3Rpb24uCisKK1NhdCBOb3YgMTggMTE6MTk6MzUgMTk5NSAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAY2h1cmNoeS5nbnUuYWkubWl0LmVkdT4KKworCSogc29saWIuYyAoc29saWJfYWRkcmVzcyk6IFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmluZyBzb2xpYi4KKwkqIHNvbGliLmggKFBDX1NPTElCKTogTmV3IG1hY3JvOyBkZWZpbmUgdXNpbmcgc29saWJfYWRkcmVzcy4KKwkqIHN0YWNrLmMgKHByaW50X2ZyYW1lX2luZm8pIFtQQ19TT0xJQl06IElmIG5vIGZ1bmN0aW9uIG5hbWUsIHRyeQorCVBDX1NPTElCIG9uIHRoZSBQQyB2YWx1ZS4KKworU2F0IE5vdiAxOCAwNDowOTozMSAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGFubm90YXRlLmMgKGFubm90YXRlX3NvdXJjZSwgYW5ub3RhdGVfZnJhbWVfYmVnaW4pOiAgSXNzdWUKKwlgMHgnIHByZWZpeCBmb3IgdGhlIHBjIHZhbHVlLCB0byByZW1haW4gY29uc2lzdGVudCB3aXRoIHByZXZpb3VzCisJR0RCIHZlcnNpb25zLgorCisJKiBibG9ja2ZyYW1lLmMgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiksIGNvbmZpZy9wYS90bS1ocHBhLmg6CisJUmVtb3ZlIFN1biBzaGFyZWQgbGlicmFyeSB0cmFuc2ZlciBoYWNrIGFuZAorCUlOSElCSVRfU1VOU09MSUJfVFJBTlNGRVJfVEFCTEVfSEFDSywgaXQgaXMgb2Jzb2xldGVkIGJ5IHRoZQorCW1zdF9zb2xpYl90cmFtcG9saW5lIG1pbmltYWwgc3ltYm9scy4KKworCSogYmxvY2tmcmFtZS5jIChpbnNpZGVfbWFpbl9mdW5jKTogIENoZWNrIG1haW5fZnVuY18qcGMgYWdhaW5zdAorCUlOVkFMSURfRU5UUllfKlBDLCBub3QgemVyby4KKwkqIHN5bWZpbGUuYyAoaW5pdF9lbnRyeV9wb2ludF9pbmZvKTogIEluaXRpYWxpemUgZWkuKnBjIHdpdGgKKwlJTlZBTElEX0VOVFJZXypQQy4KKwkqIG1pcHNyZWFkLmMgKG1pcHNjb2ZmX3N5bWZpbGVfcmVhZCk6ICBJZiB0aGUgZW50cnlfZmlsZSBib3VuZHMKKwlhcmUgc3RpbGwgdW5rbm93biBhZnRlciBwcm9jZXNzaW5nIHRoZSBwYXJ0aWFsIHN5bWJvbHMsIHRoZW4gdHJ5CisJdG8gc2V0IHRoZW0gZnJvbSB0aGUgbWluaW1hbCBzeW1ib2xzLgorCisJKiBpbmZjbWQuYyAocmVnaXN0ZXJzX2luZm8pOiAgRXJyb3Igb3V0IGlmIHNlbGVjdGVkX2ZyYW1lIGlzIE5VTEwuCisJKiBzdGFjay5jIChyZXR1cm5fY29tbWFuZCk6ICBTZWxlY3QgbmV3IGN1cnJlbnQgZnJhbWUgc2lsZW50bHkgaWYKKwlub3QgaW50ZXJhY3RpdmUuCisKKwkqIG1pcHNyZWFkLmMgKHJlYWRfYWxwaGFjb2ZmX2R5bmFtaWNfc3ltdGFiKTogIElnbm9yZSBhZGRpdGlvbmFsCisJRFRfTUlQU19MT0NBTF9HT1ROTyBhbmQgRFRfTUlQU19HT1RTWU0gZW50cmllcy4KKworCSogaXJpeDUtbmF0LmMgKHNvbGliX2NyZWF0ZV9pbmZlcmlvcl9ob29rKTogIENhbGwgc29saWJfYWRkIG9ubHkKKwlpZiBhdXRvX3NvbGliX2FkZF9hdF9zdGFydHVwIGlzIG5vbnplcm8uCisJKF9pbml0aWFsaXplX3NvbGliKTogIEFkZCAic2V0IGF1dG8tc29saWItYWRkIiBjb21tYW5kLgorCSogb3Nmc29saWIuYyAoc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiAgQ2FsbCBzb2xpYl9hZGQgb25seQorCWlmIGF1dG9fc29saWJfYWRkX2F0X3N0YXJ0dXAgaXMgbm9uemVyby4KKwkoX2luaXRpYWxpemVfc29saWIpOiAgQWRkICJzZXQgYXV0by1zb2xpYi1hZGQiIGNvbW1hbmQuCisKK1dlZCBOb3YgMTUgMTc6MTI6MDQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiB1dGlscy5jOiBEb24ndCBpbmNsdWRlIHN5cy9pb2N0bC5oIGV0YyBpZiBNUFcgaXMgaG9zdC4KKworVHVlIE5vdiAxNCAxNzoxNjo0NiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWcvYXJtL3RtLWFybS5oIChBRERJVElPTkFMX1JFR0lTVEVSX05BTUVTKTogRml4IHI1LgorCShGUkFNRV9TQVZFRF9QQyk6IE1pbm9yIGNsZWFuIHVwLgorCitUdWUgTm92IDE0IDE0OjUxOjA1IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIG1vbml0b3IuYyAobW9uaXRvcl9sb2FkX3NyZWMgbW9uaXRvcl9tYWtlX3NyZWMpOiAgTW92ZSBhbGwKKwlTLXJlY29yZCBkb3dubG9hZCBjb2RlIGludG8gc3JlYy5jLgorCSogc3JlYy5jIHNyZWMuaDogIE5ldyBmaWxlcy4gIENvbnRhaW4gUy1yZWNvcmQgbG9hZGluZyByb3V0aW5lcworCWZvcm1lcmx5IGluIG1vbml0b3IuYy4KKwkqIHNlcmlhbC5jIHNlcmlhbC5oOiAgTmV3IHJvdXRpbmUganVzdCBsaWtlIGZwcmludGYsIGJ1dCB1c2VzCisJc2VyaWFsX3QgaW5zdGVhZCBvZiBGSUxFICouCisJKiBzaC10ZGVwLmMgKGZyYW1lX2ZpbmRfc2F2ZWRfcmVncyBpbml0X2V4dHJhX2ZyYW1lX2luZm8pOgorCURvbid0IGFkZCBmb3VyIHRvIHNhdmVkIHBjIChtYWtlcyB0aGluZ3MgbWF0Y2ggbWFudWFsKS4gIEFsc28sIGZpeAorCWJ1ZyB3aGVyZSB3ZSBkaWRuJ3QgZ2V0IHBjIGZyb20gc3RhY2sgZnJhbWUgY29ycmVjdGx5LgorCSogY29uZmlnL3NoL3RtLXNoLmggKFNBVkVEX1BDX0FGVEVSX0NBTEwpOiAgRG9uJ3QgYWRkIGZvdXIgdG8KKwlzYXZlZCBwYy4gIFJlYWwgaGFyZHdhcmUgZG9lcyB0aGlzIGZvciB5b3UuCisJKiBzaDMtcm9tLmMgKHNoM19sb2FkKTogIE5ldyByb3V0aW5lLiAgU2V0cyB1cCBmb3IgZG93bmxvYWQgdGhlbgorCWNhbGxzIGdlbmVyaWMgUy1yZWNvcmQgbG9hZGVyLgorCSogY29uZmlnL2g4MzAwL2g4MzAwLm10LCBjb25maWcvaDg1MDAvaDg1MDAubXQsCisJY29uZmlnL202OGsvbW9uaXRvci5tdCwgY29uZmlnL3BhL2hwcGFwcm8ubXQsIGNvbmZpZy9zaC9zaC5tdDoKKwlBZGQgc3JlYy5vIHRvIFRERVBGSUxFUy4KKworVHVlIE5vdiAxNCAxNTo1NzozNiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHBwY2J1Zy1yb20uYzogTmV3IGZpbGUgdG8gc3VwcG9ydCB0aGUgTW90b3JvbGEgUFBDQlVHIG1vbml0b3IKKwlmb3IgUG93ZXJQQydzLgorCisJKiBjb25maWcvcG93ZXJwYy9wcGN7LGxlfS17ZWFiaSxzaW19Lm10IChUREVQRklMRVMpOiBJbmNsdWRlCisJcHBjYnVnLXJvbS5vLCBtb25pdG9yLm8sIGFuZCBzcmVjLm8KKworCSogY29uZmlnL2kzODYvbGludXgubXQgKFhERVBGSUxFUyk6IEluY2x1ZGUgc2VyLXRjcC5vLgorCitNb24gTm92IDEzIDEzOjEyOjQ2IDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogcGFydGlhbC1zdGFiLmg6IFJlbW92ZSBHREJfVEFSR0VUX0lTX0hQUEEga2x1ZGdlLgorCitGcmkgTm92IDEwIDEzOjA4OjU0IDE5OTUgIEplZmYgTGF3ICAobGF3QGthaGx1YS5jcy51dGFoLmVkdSkKKworCSogdGVybWluYWwuaCAoSEFWRV9TR1RUWSk6IEZpeCB0eXBvLgorCitUaHUgTm92ICA5IDE3OjM0OjAxIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChnZGJfdGFyZ2V0KTogQnVpbGQgaW4gdGhlIHNpbXVsYXRvciBmb3IgYWxsCisJUG93ZXJQQyBlYWJpIHRhcmdldHMsIG5vdCBqdXN0IGVhYmlzaW0sIHByb3ZpZGluZworCS0tZW5hYmxlLXNpbS1wb3dlcnBjIGlzIHVzZWQsIG9yIHRoZSBob3N0IGNvbXBpbGVyIGlzIEdDQy4KKworVGh1IE5vdiAgOSAxNDowNDowNSAxOTk1ICBSYXltb25kIEpvdSAgKHJqb3VAbWV4aWNhbi5jeWdudXMuY29tKQorCisJKiBtcHctY29uZmlnLmluOiBBZGQgdmFyaWFibGUgd2l0aCBuYW1lcyBvZiBTSU9XIGxpYnJhcmllcy4KKwkqIG1wdy1tYWtlLnNlZDogQWRkIGFuIGFjdGlvbiB0byBidWlsZCBTSU9XZ2RiLgorCitXZWQgTm92ICA4IDE5OjI1OjIyIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbXB3LW1ha2Uuc2VkOiBFZGl0IEBFTkFCTEVfQ0ZMQUdTQCBvdXQsIG1wdy1jb25maWd1cmUgY2FuCisJYWRkIGJhY2sgaW4gaWYgbmVjZXNzYXJ5LgorCitXZWQgTm92ICA4IDE1OjU5OjUyIDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQHBhc2FuZGEuY3lnbnVzLmNvLnVrPgorCisJKiBjb25maWcvbWlwcy92cjQzMDAubXQ6IEFkZGVkIHNpbXVsYXRvciB0byBkZWZhdWx0IFZSNDMwMCBidWlsZC4KKworVHVlIE5vdiAgNyAxNjowMjoyNSAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiByZW1vdGUtbWlwcy5jIChtaXBzX2luaXRpYWxpemUpOiAgRml4IGJyYWluIGRhbWFnZSBmb3VuZCBieQorCUphbWllLiAgQmFzaWNhbGx5IGhhZCBjYXNlIHN0YXRlbWVudCBpbiB0aGUgd3JvbmcgcGxhY2UuLi4KKwkqIChtaXBzX2xvYWQpOiAgUmVtb3ZlIHVubmVjZXNzYXJ5IGBkYiB0dHkwJyBjb21tYW5kLiAgSXQncyBhbGwKKwloYW5kbGVkIGJ5IG1pcHNfaW5pdGlhbGl6ZSBub3cuCisKK1R1ZSBOb3YgIDcgMTI6NTk6MTQgMTk5NSAgUmF5bW9uZCBKb3UgIDxyam91QG1leGljYW4uY3lnbnVzLmNvbT4KKworCSogbWFjLWdkYi5yOiBBZGRlZCAjaWZkZWYgTWFjZ2RiLgorCitUdWUgTm92ICA3IDE0OjU5OjUxIDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQHBhc2FuZGEuY3lnbnVzLmNvLnVrPgorCisJKiByZW1vdGUtbWlwcy5jIChtaXBzX2luaXRpYWxpemUpOiBVcGRhdGVkIHRvIHRhbGsgdG8gVlI0MzAwIFJJU1EKKyAJbW9uaXRvciBib2FyZC4KKworTW9uIE5vdiAgNiAxMTo0NDoxMSAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBwYXNhbmRhLmN5Z251cy5jby51az4KKworCSogY29uZmlnL21pcHMve3RtLXZyNDMwMC5oIHRtLXZyNDMwMGVsLmh9IChUQVJHRVRfTU9OSVRPUl9QUk9NUFQpOgorIAlDaGFuZ2UgaW50byByZWFsIHN0cmluZ3MuCisKKwkqIHJlbW90ZS1zaW0uYyAoZ2Ric2ltX29wZW4pOiBNb3ZlZCBzaW1fb3BlbigpIGNhbGwgdG8gYWZ0ZXIKKyAJY2FsbGJhY2sgaW5pdGlhbGlzYXRpb24uCisKK1N1biBOb3YgIDUgMDA6MDc6NTIgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKyAgICAgICAgKiBjb25maWd1cmUuaW4gKEFDX0NIRUNLX0hFQURFUlMpOiBhZGQgc3RkZGVmLmguCisKK0ZyaSBOb3YgIDMgMTI6MzA6NDMgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChDT01NT05fT0JTKTogVXNlIGNvcmVmaWxlLm8gcmF0aGVyIHRoYW4gY29yZS5vCisJKiBjb3JlLmM6ICBSZW5hbWUgdG8gY29yZWZpbGUuYy4KKwkqIGNvbmZpZy9weXIvdG0tcHlyLmgsIHVtYXgteGRlcC5jLCBzdW4zODYtbmF0LmMsIHB5ci14ZGVwLmMsCisJTWFrZWZpbGUuaW4gKFNGSUxFUyksIGdvdWxkLXhkZXAuYywgY29yZWRlcC5jLCBhcm10ZGVwLmMsCisgCWFybS14ZGVwLmMsIGFsdG9zLXhkZXAuYzogQ2hhbmdlIGNvcmUuYyByZWZlcmVuY2VzIHRvIGNvcmVmaWxlLmMuCisKKyAJRnJvbSBHcmFoYW0gU3RvbmV5IDxncmV5aGFtQHJlc2VhcmNoLmNhbm9uLm96LmF1Pi4KKwkqIE1ha2VmaWxlLmluIChyZW1vdGUtYXJyYXkubyk6ICBBZGQgcnVsZSB0byBidWlsZC4KKwkoQUxMREVQRklMRVMpOiBBZGQgcmVtb3RlLWFycmF5LmMKKwkqIHJlbW90ZS1hcnJheS5jIChiYXVkX3JhdGUpOiAgUmVtb3ZlIHVubmVjZXNzYXJ5IGRlY2xhcmF0aW9uLgorCShiYXVkcmF0ZSk6ICBSZW1vdmUuCisJKGFycmF5X2ZpbGVzX2luZm8pOiAgUHJpbnQgZ2xvYmFsIGJhdWRfcmF0ZSBub3QgYmF1ZHJhdGUuCisKK1NhdCBOb3YgIDQgMTA6MjE6NTggMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKElOVEVSTkFMX0NGTEFHUyk6ICBBZGQgRU5BQkxFX0NGTEFHUy4KKwkqIGZvcmstY2hpbGQuYyAoZm9ya19pbmZlcmlvcik6ICBBZGQgY2FsbCB0bworCVRBUkdFVF9DUkVBVEVfSU5GRVJJT1JfSE9PSyB0byBhbGxvdyB0YXJnZXQgc3BlY2lmaWMgY29kZSB0byBnZXQKKwljb250cm9sIGp1c3QgYmVmb3JlIHRoZSBuZXcgcHJvY2VzcyBleGVjdXRlcyBpdCdzIGZpcnN0IGluc3RydWN0aW9uLgorCSogcmVtb3RlLW1pcHMuYyAobWlwc19pbml0aWFsaXplKTogIENsZWFudXAgYSBiaXQuICBEb24ndCB0cnkgdG8KKwlyZWNlaXZlIGEgcGFja2V0IGF0IGZpcnN0LiAgVGhpcyBzcGVlZHMgdXAgaW5pdGlhbGl6YXRpb24gYSBsb3QuCisJVXNlIFRBUkdFVF9NT05JVE9SX1BST01QVCBpbnN0ZWFkIG9mICI8SURUPiIuCisJKGNvbW1vbl9icmVha3BvaW50KTogIFVzZSBycmVzcG9uc2UgaW5zdGVhZCBvZiByZXJyZmxnIHRvIGluc3BlY3QKKwllcnJvciBjb2RlLgorCSogc3ltZmlsZS5jIChzeW1zX2Zyb21fb2JqZmlsZSByZXJlYWRfc3ltYm9scyk6ICBDYWxsCisJVEFSR0VUX1NZTUZJTEVfUE9TVFJFQUQgdG8gYWxsb3cgdGFyZ2V0IHNwZWNpZmljIGNvZGUgdG8gZ2V0CisJY29udHJvbCBhZnRlciByZWFkaW5nIG5ldyBzeW1ib2xzLgorCSogdGFyZ2V0Lmg6ICBOZXcgbWFjcm9zIFRBUkdFVF9TWU1GSUxFX1BPU1RSRUFELCBhbmQKKwlUQVJHRVRfQ1JFQVRFX0lORkVSSU9SX0hPT0suICBTZWUgYWJvdmUgZm9yIGRlc2NyaXB0aW9ucy4KKwkqIGNvbmZpZy9taXBzL3tpcml4NS5taCBubS1pcml4NS5ofTogIERlbGV0ZSBubS1pcml4NS5oLiAgTWFrZQorCU5BVF9GSUxFIHBvaW50IGRpcmVjdGx5IGF0IC4uL25tLXN5c3Y0LmguCisJKiBjb25maWcvbWlwcy97bWlwc20zLm1oIG5tLW0zLmh9OiAgRGVsZXRlIG5tLW0zLmguICBNYWtlCisJTkFUX0ZJTEUgcG9pbnQgZGlyZWN0bHkgYXQgLi4vbm0tbTMuaC4KKwkqIGNvbmZpZy9taXBzL3ttaXBzdjQubWggbm0tc3lzdjQuaH06ICBEZWxldGUgbm0tc3lzdjQuaC4gIE1ha2UKKwlOQVRfRklMRSBwb2ludCBkaXJlY3RseSBhdCAuLi9ubS1zeXN2NC5oLgorCSogY29uZmlnL21pcHMvbm0tbWlwcy5oOiAgSW1wcm92ZSBjb21tZW50IGF0IHRvcCBvZiBmaWxlLgorCSogY29uZmlnL21pcHMvdG0tbWlwcy5oIChUQVJHRVRfTU9OSVRPUl9QUk9NUFQpOiAgQ2hhbmdlCisJZGVmaW5pdGlvbiBpbnRvIGEgcHJvcGVyIHN0cmluZy4KKworV2VkIE5vdiAgMSAyMDoxODowOCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2kzODYvdG0taTM4Ni5oOiBOZXcgZmlsZSBjb250YWluaW5nIGdlbmVyaWMgaSo4NiB0YXJnZXQKKwlkZWZpbml0aW9ucy4KKwkoVEFSR0VUX0JZVEVfT1JERVIpOiBNb3ZlZCBoZXJlIGZyb20gdG0taTM4NnYuaC4KKwkoSUVFRV9GTE9BVCk6IE1vdmVkIGhlcmUgZnJvbSB0bS1pMzg2di5oLgorCShTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCk6IERlZmluZSBkZWZhdWx0IGFzIDIuCisJKEZVTkNUSU9OX1NUQVJUX09GRlNFVCk6IE1vdmVkIGhlcmUgZnJvbSB0bS1pMzg2di5oLgorCShTS0lQX1BST0xPR1VFKTogTW92ZWQgaGVyZSBmcm9tIHRtLWkzODZ2LmguCisJKFNBVkVEX1BDX0FGVEVSX0NBTEwpOiBNb3ZlZCBoZXJlIGZyb20gdG0taTM4NnYuaC4KKwkoSU5ORVJfVEhBTik6IE1vdmVkIGhlcmUgZnJvbSB0bS1pMzg2di5oLgorCShCUkVBS1BPSU5UKTogTW92ZWQgaGVyZSBmcm9tIHRtLWkzODZ2LmguCisJKERFQ1JfUENfQUZURVJfQlJFQUspOiBNb3ZlZCBoZXJlIGZyb20gdG0taTM4NnYuaC4KKwkoQUJPVVRfVE9fUkVUVVJOKTogTW92ZWQgaGVyZSBmcm9tIHRtLWkzODZ2LmguCisJKFJFR0lTVEVSX1NJWkUpOiBNb3ZlZCBoZXJlIGZyb20gdG0taTM4NnYuaC4KKwkoTlVNX1JFR1MpOiBNb3ZlZCBoZXJlIGZyb20gdG0taTM4NnYuaC4KKwkoUkVHSVNURVJfTkFNRVMpOiBNb3ZlZCBoZXJlIGZyb20gdG0taTM4NnYuaC4KKwkoRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyk6IE1vdmVkIGhlcmUgZnJvbSB0bS1pMzg2di5oLgorCShGUF9SRUdOVU0pOiBNb3ZlZCBoZXJlIGZyb20gdG0taTM4NnYuaC4KKwkoU1BfUkVHTlVNKTogTW92ZWQgaGVyZSBmcm9tIHRtLWkzODZ2LmguCisJKFBDX1JFR05VTSk6IE1vdmVkIGhlcmUgZnJvbSB0bS1pMzg2di5oLgorCShQU19SRUdOVU0pOiBNb3ZlZCBoZXJlIGZyb20gdG0taTM4NnYuaC4KKwkoRlAwX1JFR05VTSk6ICBNb3ZlZCBoZXJlIGZyb20gdG0taTM4NmFpeC5oLgorCShGUENfUkVHTlVNKTogIE1vdmVkIGhlcmUgZnJvbSB0bS1zdW4zODYuaC4KKwkoUkVHSVNURVJfQllURVMpOiAgTW92ZWQgaGVyZSBmcm9tIHRtLWkzODZhaXguaC4KKwkoUkVHSVNURVJfQllURSk6IE1vdmVkIGhlcmUgZnJvbSB0bS1pMzg2YWl4LmguCisJKFJFR0lTVEVSX1JBV19TSVpFKTogTW92ZWQgaGVyZSBmcm9tIHRtLWkzODZhaXguaC4KKwkoTUFYX1JFR0lTVEVSX1JBV19TSVpFKTogTW92ZWQgaGVyZSBmcm9tIHRtLWkzODZhaXguaC4KKwkoUkVHSVNURVJfVklSVFVBTF9TSVpFKTogTW92ZWQgaGVyZSBmcm9tIHRtLWkzODZhaXguaC4KKwkoTUFYX1JFR0lTVEVSX1ZJUlRVQUxfU0laRSk6IE1vdmVkIGhlcmUgZnJvbSB0bS1pMzg2YWl4LmguCisJKEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKTogTW92ZWQgaGVyZSBmcm9tIHRtLWkzODZhaXguaC4KKwkoU1RPUkVfUkVUVVJOX1ZBTFVFKTogIE1vdmVkIGhlcmUgZnJvbSB0bS1pMzg2YWl4LmguCisJKFJFR0lTVEVSX1ZJUlRVQUxfVFlQRSk6IE1vdmVkIGhlcmUgZnJvbSB0bS1pMzg2di5oLgorCShTVE9SRV9TVFJVQ1RfUkVUVVJOKTogTW92ZWQgaGVyZSBmcm9tIHRtLWkzODZ2LmguCisJKEZSQU1FX0NIQUlOKTogTW92ZWQgaGVyZSBmcm9tIHRtLWkzODZ2NC5oLgorCShGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTik6IE1vdmVkIGhlcmUgZnJvbSB0bS1pMzg2djQuaC4KKwkoRlJBTUVfU0FWRURfUEMpOiBNb3ZlZCBoZXJlIGZyb20gdG0taTM4Nm9zOWsuaAorCShGUkFNRV9BUkdTX0FERFJFU1MpOiBNb3ZlZCBoZXJlIGZyb20gdG0taTM4NnYuaC4KKwkoRlJBTUVfTE9DQUxTX0FERFJFU1MpOiBNb3ZlZCBoZXJlIGZyb20gdG0taTM4NnYuaC4KKwkoRlJBTUVfTlVNX0FSR1MpOiBNb3ZlZCBoZXJlIGZyb20gdG0taTM4NnN1bi5oLgorCShGUkFNRV9BUkdTX1NLSVApOiBNb3ZlZCBoZXJlIGZyb20gdG0taTM4NnYuaC4KKwkoRlJBTUVfRklORF9TQVZFRF9SRUdTKTogTW92ZWQgaGVyZSBmcm9tIHRtLWkzODZ2LmguCisJKFBVU0hfRFVNTVlfRlJBTUUpOiBNb3ZlZCBoZXJlIGZyb20gdG0taTM4NnYuaC4KKwkoUE9QX0ZSQU1FKTogTW92ZWQgaGVyZSBmcm9tIHRtLWkzODZ2LmguCisJKENBTExfRFVNTVksIENBTExfRFVNTVlfTEVOR1RILCBDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCwgCisJQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVCwgRklYX0NBTExfRFVNTVkpOiBNb3ZlZCBoZXJlIGZyb20KKwl0bS1pMzg2di5oCisJKHByaW50XzM4N19jb250cm9sX3dvcmQsIHByaW50XzM4N19zdGF0dXNfd29yZCk6IERlY2xhcmUgcHJvdG90eXBlcy4KKwkoc3RydWN0IGZyYW1lX2luZm8sIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzKTogRm9yd2FyZCBkZWNscyBmb3IKKwlwcm90b3R5cGVzLgorCShTUF9BUkcwKTogTW92ZWQgaGVyZSBmcm9tIHRtLWkzODZ2LmguCisKKwkqIGNvbmZpZy9pMzg2L3RtLWkzODZ2Lmg6CisJKGkzODYvdG0taTM4Ni5oKTogSW5jbHVkZS4KKwkoVEFSR0VUX0JZVEVfT1JERVIpOiBSZW1vdmUuCisJKElFRUVfRkxPQVQpOiBSZW1vdmUuCisJKFNUQVJUX0lORkVSSU9SX1RSQVBTX0VYUEVDVEVEKTogVW5kZWYgYmVmb3JlIHJlZGVmaW5lIHRvIDQuCisJKEZVTkNUSU9OX1NUQVJUX09GRlNFVCk6IFJlbW92ZS4KKwkoU0tJUF9QUk9MT0dVRSk6IFJlbW92ZS4KKwkoaTM4Nl9za2lwX3Byb2xvZ3VlKTogUmVtb3ZlIHByb3RvdHlwZS4KKwkoU0FWRURfUENfQUZURVJfQ0FMTCk6IFJlbW92ZS4KKwkoSU5ORVJfVEhBTik6IFJlbW92ZS4KKwkoQlJFQUtQT0lOVCk6IFJlbW92ZS4KKwkoREVDUl9QQ19BRlRFUl9CUkVBSyk6IFJlbW92ZS4KKwkoQUJPVVRfVE9fUkVUVVJOKTogUmVtb3ZlLgorCShSRUdJU1RFUl9TSVpFKTogUmVtb3ZlLgorCShOVU1fUkVHUyk6IFVuZGVmIGJlZm9yZSByZWRlZmluZSB0byAxNiAobm8gRlAgc3VwcG9ydCkuCisJKFJFR0lTVEVSX05BTUVTKTogVW5kZWYgYmVmb3JlIHJlZGVmaW5lLgorCShGUF9SRUdOVU0sIFNQX1JFR05VTSwgUENfUkVHTlVNLCBQU19SRUdOVU0pOiBSZW1vdmUuCisJKFJFR0lTVEVSX0JZVEVTKTogVW5kZWYgYmVmb3JlIHJlZGVmaW5lLgorCShSRUdJU1RFUl9CWVRFKTogVW5kZWYgYmVmb3JlIHJlZGVmaW5lLgorCShSRUdJU1RFUl9SQVdfU0laRSk6IFVuZGVmIGJlZm9yZSByZWRlZmluZS4KKwkoUkVHSVNURVJfVklSVFVBTF9TSVpFKTogVW5kZWYgYmVmb3JlIHJlZGVmaW5lLgorCShNQVhfUkVHSVNURVJfUkFXX1NJWkUpOiBVbmRlZiBiZWZvcmUgcmVkZWZpbmUuCisJKE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUpOiBVbmRlZiBiZWZvcmUgcmVkZWZpbmUuCisJKFJFR0lTVEVSX1ZJUlRVQUxfVFlQRSk6IFVuZGVmIGJlZm9yZSByZWRlZmluZS4KKwkoU1RPUkVfU1RSVUNUX1JFVFVSTik6IFVuZGVmIGJlZm9yZSByZWRlZmluZS4KKwkoRVhUUkFDVF9SRVRVUk5fVkFMVUUpOiBVbmRlZiBiZWZvcmUgcmVkZWZpbmUuCisJKFNUT1JFX1JFVFVSTl9WQUxVRSk6IFVuZGVmIGJlZm9yZSByZWRlZmluZS4KKwkoRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyk6IFJlbW92ZS4KKwkoRlJBTUVfQ0hBSU4pOiBVbmRlZiBiZWZvcmUgcmVkZWZpbmUuCisJKEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OKTogVW5kZWYgYmVmb3JlIHJlZGVmaW5lLgorCShGUkFNRV9TQVZFRF9QQyk6IFVuZGVmIGJlZm9yZSByZWRlZmluZS4KKwkoRlJBTUVfQVJHU19BRERSRVNTKTogUmVtb3ZlLgorCShGUkFNRV9MT0NBTFNfQUREUkVTUyk6IFJlbW92ZS4KKwkoRlJBTUVfTlVNX0FSR1MpOiBVbmRlZiBiZWZvcmUgcmVkZWZpbmUuCisJKEZSQU1FX0FSR1NfU0tJUCk6IFJlbW92ZS4KKwkoRlJBTUVfRklORF9TQVZFRF9SRUdTKTogUmVtb3ZlLgorCShQVVNIX0RVTU1ZX0ZSQU1FKTogUmVtb3ZlLgorCShQT1BfRlJBTUUpOiBSZW1vdmUuCisJKENBTExfRFVNTVkpOiBSZW1vdmUuCisJKENBTExfRFVNTVlfTEVOR1RIKTogUmVtb3ZlLgorCShDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCk6IFJlbW92ZS4KKwkoQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVCk6IFJlbW92ZQorCShGSVhfQ0FMTF9EVU1NWSk6IFJlbW92ZS4KKwkocHJpbnRfMzg3X2NvbnRyb2xfd29yZCk6IFJlbW92ZS4KKwkocHJpbnRfMzg3X3N0YXR1c193b3JkKTogUmVtb3ZlLgorCShTUF9BUkcwKTogUmVtb3ZlLgorCisJKiBjb25maWcvaTM4Ni90bS1zeW1tZXRyeS5oOiAKKwkoVE1fU1lNTUVUUllfSCk6IEVuY2xvc2UgZmlsZSBpbiB0ZXN0IGZvciBkZWZpbmUgJiBkZWZpbmUgaWYgbmVlZGVkLgorCShTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCk6IE1vdmUgdG8gYWZ0ZXIgaW5jbHVzaW9uIG9mCisJdG0taTM4NnY0Lmggb3IgdG0taTM4NnYuaCwgI3VuZGVmLCBhbmQgI2RlZmluZSBiYWNrIHRvIDIuCisJKERFQ1JfUENfQUZURVJfQlJFQUspOiBNb3ZlIHRvIGFmdGVyIGluY2x1c2lvbiBvZiB0bS1pMzg2djQuaAorCW9yIHRtLWkzODZ2LmgsICN1bmRlZiwgYW5kICNkZWZpbmUgdG8gMC4KKwkoTUFYX1JFR0lTVEVSX1JBV19TSVpFKTogUmVtb3ZlLgorCShGUkFNRV9DSEFJTik6IFJlbW92ZS4KKwkoRlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT04pOiBSZW1vdmUuCisJKEZSQU1FX1NBVkVEX1BDKTogUmVtb3ZlLgorCShwcmludF8zODdfY29udHJvbF93b3JkLCBwcmludF8zODdfc3RhdHVzX3dvcmQpOiBSZW1vdmUgcHJvdG90eXBlcy4KKworCSogY29uZmlnL2kzODYvdG0tcHR4Lmg6IAorCShUTV9QVFhfSCk6IEVuY2xvc2UgZmlsZSBpbiB0ZXN0IGZvciBkZWZpbmUgJiBkZWZpbmUgaWYgbmVlZGVkLgorCShTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCk6IE1vdmUgdG8gYWZ0ZXIgaW5jbHVzaW9uIG9mCisJdG0taTM4NnY0Lmggb3IgdG0taTM4NnYuaCwgI3VuZGVmLCBhbmQgI2RlZmluZSBiYWNrIHRvIDIuCisJKERFQ1JfUENfQUZURVJfQlJFQUspOiBNb3ZlIHRvIGFmdGVyIGluY2x1c2lvbiBvZiB0bS1pMzg2djQuaAorCW9yIHRtLWkzODZ2LmgsICN1bmRlZiwgYW5kICNkZWZpbmUgdG8gMC4KKwkoU0RCX1JFR19UT19SRUdOVU0pOiAgUmVtb3ZlIG9ic29sZXRlIGNvbW1lbnRlZCBvdXQgZGVmaW5lLgorCShwcmludF8zODdfY29udHJvbF93b3JkLCBwcmludF8zODdfc3RhdHVzX3dvcmQpOiBSZW1vdmUgcHJvdG90eXBlcy4KKworCSogY29uZmlnL2kzODYvdG0tbGludXguaDoKKwkoVE1fTElOVVhfSCk6IEVuY2xvc2UgZmlsZSBpbiB0ZXN0IGZvciBkZWZpbmUgJiBkZWZpbmUgaWYgbmVlZGVkLgorCShpMzg2L3RtLWkzODYuaCk6IEluY2x1ZGUgaW5zdGVhZCBvZiB0bS1pMzg2di5oLgorCShTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCk6IFJlbW92ZS4KKworCSogY29uZmlnL2kzODYvdG0taTM4NnY0Lmg6IAorCShUTV9JMzg2VjRfSCk6IEVuY2xvc2UgZmlsZSBpbiB0ZXN0IGZvciBkZWZpbmUgJiBkZWZpbmUgaWYgbmVlZGVkLgorCShpMzg2L3RtLWkzODYuaCk6IEluY2x1ZGUgaW5zdGVhZCBvZiB0bS1pMzg2di5oLgorCShTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCk6IFJlbW92ZS4KKwkoRlJBTUVfQ0hBSU4pOiAgTW92ZWQgdG8gdG0taTM4Ni5oLgorCShGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTik6IE1vdmVkIHRvIHRtLWkzODYuaC4KKwkoRlJBTUVfU0FWRURfUEMpOiBSZW1vdmUuCisJKHNpZ3RyYW1wX3NhdmVkX3BjKTogIERlZmluZSBhcyBpMzg2djRfc2lndHJhbXBfc2F2ZWRfcGMuCisJKEZSQU1FX05VTV9BUkdTKTogUmVtb3ZlLgorCisJKiBjb25maWcvaTM4Ni90bS1pMzg2b3M5ay5oOiAKKwkoVE1fSTM4Nk9TOUtfSCk6IEVuY2xvc2UgZmlsZSBpbiB0ZXN0IGZvciBkZWZpbmUgJiBkZWZpbmUgaWYgbmVlZGVkLgorCShpMzg2L3RtLWkzODYuaCk6IEluY2x1ZGUgaW5zdGVhZCBvZiB0bS1pMzg2di5oLgorCShTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCk6IFJlbW92ZS4KKwkoTlVNX1JFR1MpOiAgVW5kZWZpbmUgYmVmb3JlIHJlZGVmaW5pbmcuCisJKEZSQU1FX0NIQUlOKTogUmVtb3ZlLgorCShGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTik6IFJlbW92ZS4KKwkoRlJBTUVfU0FWRURfUEMpOiBNb3ZlIHRvIHRtLWkzODYuaC4KKworCSogY29uZmlnL2kzODYvdG0taTM4Nm53Lmg6IAorCShUTV9JMzg2TldfSCk6IEVuY2xvc2UgZmlsZSBpbiB0ZXN0IGZvciBkZWZpbmUgJiBkZWZpbmUgaWYgbmVlZGVkLgorCShpMzg2L3RtLWkzODYuaCk6IEluY2x1ZGUgaW5zdGVhZCBvZiB0bS1pMzg2di5oLgorCShTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCk6IFJlbW92ZS4KKworCSogY29uZmlnL2kzODYvdG0taTM4NmJzZC5oOgorCShUTV9JMzg2QlNEX0gpOiBFbmNsb3NlIGZpbGUgaW4gdGVzdCBmb3IgZGVmaW5lICYgZGVmaW5lIGlmIG5lZWRlZC4KKwkoaTM4Ni90bS1pMzg2LmgpOiBJbmNsdWRlIGluc3RlYWQgb2YgdG0taTM4NnYuaC4KKwkoU1RBUlRfSU5GRVJJT1JfVFJBUFNfRVhQRUNURUQpOiBSZW1vdmUuCisJKEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OKTogUmVtb3ZlLgorCShGUkFNRV9TQVZFRF9QQyk6IFJlbW92ZS4KKworCSogY29uZmlnL2kzODYvdG0taTM4NmFpeC5oOgorCShpMzg2L3RtLWkzODYuaCk6IEluY2x1ZGUgaW5zdGVhZCBvZiB0bS1pMzg2di5oLgorCShTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCk6IFJlbW92ZS4KKwkoRlBfUkVHTlVNKTogUmVtb3ZlLgorCShTUF9SRUdOVU0pOiBSZW1vdmUuCisJKFBDX1JFR05VTSk6IFJlbW92ZS4KKwkoUFNfUkVHTlVNKTogUmVtb3ZlLgorCShGUDBfUkVHTlVNKTogIE1vdmVkIHRvIHRtLWkzODYuaC4KKwkoTlVNX1JFR1MpOiBSZW1vdmUuCisJKFJFR0lTVEVSX05BTUVTKTogUmVtb3ZlLgorCShSRUdJU1RFUl9CWVRFUyk6IE1vdmVkIHRvIHRtLWkzODYuaC4KKwkoUkVHSVNURVJfQllURSk6IE1vdmVkIHRvIHRtLWkzODYuaC4KKwkoUkVHSVNURVJfUkFXX1NJWkUpOiBNb3ZlZCB0byB0bS1pMzg2LmguCisJKE1BWF9SRUdJU1RFUl9SQVdfU0laRSk6IE1vdmVkIHRvIHRtLWkzODYuaC4KKwkoUkVHSVNURVJfVklSVFVBTF9TSVpFKTogTW92ZWQgdG8gdG0taTM4Ni5oLgorCShSRUdJU1RFUl9WSVJUVUFMX1RZUEUpOiBSZW1vdmVkLgorCShFWFRSQUNUX1JFVFVSTl9WQUxVRSk6IE1vdmVkIHRvIHRtLWkzODYuaC4KKwkoU1RPUkVfUkVUVVJOX1ZBTFVFKTogIE1vdmVkIHRvIHRtLWkzODYuaC4KKworCSogY29uZmlnL2kzODYvdG0tc3VuMzg2Lmg6CisJKFRNX1NVTjM4Nl9IKTogRW5jbG9zZSBmaWxlIGluIHRlc3QgZm9yIGRlZmluZSAmIGRlZmluZSBpZiBuZWVkZWQuCisJKGkzODYvdG0taTM4Ni5oKTogSW5jbHVkZS4KKwkoVEFSR0VUX0JZVEVfT1JERVIpOiBSZW1vdmUuCisJKEZVTkNUSU9OX1NUQVJUX09GRlNFVCk6IFJlbW92ZS4KKwkoU0tJUF9QUk9MT0dVRSk6IFJlbW92ZS4KKwkoU0FWRURfUENfQUZURVJfQ0FMTCk6IFJlbW92ZS4KKwkoSU5ORVJfVEhBTik6IFJlbW92ZS4KKwkoQlJFQUtQT0lOVCk6IFJlbW92ZS4KKwkoREVDUl9QQ19BRlRFUl9CUkVBSyk6IFJlbW92ZS4KKwkoQUJPVVRfVE9fUkVUVVJOKTogUmVtb3ZlLgorCShSRUdJU1RFUl9TSVpFKTogUmVtb3ZlLgorCShOVU1fUkVHUyk6IFVuZGVmaW5lIGJlZm9yZSBkZWZpbmluZy4KKwkoUkVHSVNURVJfTkFNRVMpOiBVbmRlZmluZSBiZWZvcmUgcmVkZWZpbmluZy4KKwkoUkVHSVNURVJfQllURVMpOiBVbmRlZmluZSBiZWZvcmUgcmVkZWZpbmluZy4KKwkoUkVHSVNURVJfQllURSk6IFVuZGVmaW5lIGJlZm9yZSBkZWZpbmluZy4KKwkoRlBfUkVHTlVNKTogVW5kZWZpbmUgYmVmb3JlIGRlZmluaW5nLgorCShQQ19SRUdOVU0pOiBVbmRlZmluZSBiZWZvcmUgZGVmaW5pbmcuCisJKEZQQ19SRUdOVU0pOiAgVW5kZWZpbmUgYmVmb3JlIGRlZmluaW5nLgorCShSRUdJU1RFUl9SQVdfU0laRSk6ICBVbmRlZmluZSBiZWZvcmUgZGVmaW5pbmcuCisJKEZSQU1FX0NIQUlOKTogVW5kZWZpbmUgYmVmb3JlIGRlZmluaW5nLgorCShGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTik6IFVuZGVmaW5lIGJlZm9yZSBkZWZpbmluZy4KKwkoRlJBTUVfU0FWRURfUEMpOiBVbmRlZmluZSBiZWZvcmUgZGVmaW5pbmcuCisJKEZSQU1FX05VTV9BUkdTKTogTW92ZWQgdG8gdG0taTM4Ni5oLgorCShNQVhfUkVHSVNURVJfUkFXX1NJWkUpOiBSZW1vdmUuCisJKE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUpOiBSZW1vdmUuCisJKFNUT1JFX1NUUlVDVF9SRVRVUk4pOiBSZW1vdmUuCisJKEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MpOiBSZW1vdmUuCisJKEZSQU1FX0FSR1NfQUREUkVTUyk6IFJlbW92ZS4KKwkoRlJBTUVfTE9DQUxTX0FERFJFU1MpOiBSZW1vdmUuCisJKEZSQU1FX05VTV9BUkdTKTogVW5kZWZpbmUgYmVmb3JlIGRlZmluaW5nLgorCShGUkFNRV9BUkdTX1NLSVApOiBSZW1vdmUuCisJKEZSQU1FX0ZJTkRfU0FWRURfUkVHUyk6IFJlbW92ZS4KKwkoUFVTSF9EVU1NWV9GUkFNRSk6IFJlbW92ZS4KKwkoUE9QX0ZSQU1FKTogUmVtb3ZlLgorCShDQUxMX0RVTU1ZLCBDQUxMX0RVTU1ZX0xFTkdUSCwgQ0FMTF9EVU1NWV9TVEFSVF9PRkZTRVQpOiBSZW1vdmUuCisJKHN0cnVjdCBmcmFtZV9pbmZvLCBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyk6IFJlbW92ZSBmb3J3YXJkIGRlY2xzCisJZm9yIHByb3RvdHlwZXMuCisKKwkqIGNvbmZpZy9pMzg2L3RtLWkzODZseW54LmggKGkzODYvdG0taTM4Ni5oKTogSW5jbHVkZSBpbnN0ZWFkIG9mCisJdG0taTM4NnYuaC4KKwkqIGNvbmZpZy9pMzg2L3RtLWkzODZtMy5oIChpMzg2L3RtLWkzODYuaCk6IEluY2x1ZGUgaW5zdGVhZCBvZgorIAl0bS1pMzg2di5oLgorCisJKiBpMzg2LXRkZXAuYyAoaTM4Nl9leHRyYWN0X3JldHVybl92YWx1ZSk6ICBNYWtlIGZ1bmN0aW9uIHZpc2libGUKKwlmb3IgYWxsIGkzODYgdGFyZ2V0cywgYnV0IG9ubHkgYXNzdW1lIGZsb2F0aW5nIHBvaW50IHZhbHVlcyByZXR1cm5lZAorCWluIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBmb3IgSTM4Nl9BSVhfVEFSR0VULgorCisJKiBpMzg2di1uYXQuYyAoaTM4Nl9yZWdpc3Rlcl91X2FkZHIpOiAgRW5hYmxlIGNvZGUgdG8gbG9jYXRlCisJZmxvYXRpbmcgcG9pbnQgcmVncyBpbiB1c2VyIHN0cnVjdC4KKwkKK1dlZCBOb3YgIDEgMTU6MzI6NTcgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGJyZWFrcG9pbnQuYyAoYnJlYWtwb2ludF9yZV9zZXQpOiBGaXggdHlwbyBpbiBjb21tZW50LgorCSogc3ltdGFiLmMgKGluX3Byb2xvZ3VlKTogRG9jdW1lbnQgZnVuY19zdGFydCBhbmQgd2hlbiBpdCBpcyB6ZXJvCisJZG9uJ3QgY2FsbCBTS0lQX1BST0xPR1VFICh3aGljaCB0eXBpY2FsbHkgbGVhZHMgdW5jb25kaXRpb25hbGx5IHRvCisJYW4gZXJyb3Igd2hlbiB3ZSB0cnkgdG8gYWNjZXNzIGEgcHJvbG9ndWUgYXQgYWRkcmVzcyAwKS4KKworVHVlIE9jdCAzMSAxMzowMToxNSAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZWxmcmVhZC5jOiBJbmNsdWRlIGVsZi1iZmQuaCByYXRoZXIgdGhhbiBsaWJlbGYuaC4KKworVHVlIE9jdCAzMSAxMDo0Mjo0MiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiB3aW4zMi1uYXQuYyAoeGxhdGVfZXhjZXB0aW9uKTogVHJlYXQgYSBzdGFjayBvdmVyZmxvdyBsaWtlIGEgU0VHVi4KKworU3VuIE9jdCAyOSAxMToyMjowNSAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogbW9uaXRvci5jOiBJbmNsdWRlIGdudS1yZWdleC5oIHJhdGhlciB0aGFuIHN5c3RlbSByZWdleC5oLgorCitTYXQgT2N0IDI4IDIzOjUxOjQ4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGRlZnMuaDogVGVzdCBvbiBuYW1lIF9fV0lOMzJfXyByYXRoZXIgdGhhbiBXSU4zMi4KKwkqIGluZmxvdy5jIChuZXdfdHR5KTogTGlrZXdpc2UKKwkqIHRlcm1pbmFsLmg6IExpa2V3aXNlLgorCSogdXRpbHMuYyAoaW5pdGlhbGl6ZV91dGlscyk6IExpa2V3aXNlLgorCSogd2luMzItbmF0LmMgKGNoaWxkX2NyZWF0ZV9pbmZlcmlyb3IpOiBQcmludCBlcnJvciBjb2RlIHdoZW4gZmFpbGluZy4KKwkqIGNvbmZpZy9pMzg2L3dpbjMyLm1oIChYTV9DTElCUyk6IE5lZWQgLWxrZXJuZWwzMi4KKwkKK1NhdCBPY3QgMjggMDQ6NTI6MzYgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBzeW10YWIuaCAoZW51bSBhZGRyZXNzX2NsYXNzKTogIEFkZCBMT0NfVU5SRVNPTFZFRCBmb3IKKwlhIGxvY2F0aW9uIHdob3NlIGFkZHJlc3MgaGFzIHRvIGJlIHJlc29sdmVkIHZpYSB0aGUgbWluaW1hbAorCXN5bWJvbCB0YWJsZS4KKwkqIGJ1aWxkc3ltLmMgKGZpbmlzaF9ibG9jayksIGZpbmR2YXIuYyAoc3ltYm9sX3JlYWRfbmVlZHNfZnJhbWUsCisJcmVhZF92YXJfdmFsdWUpLCBwcmludGNtZC5jIChhZGRyZXNzX2luZm8pLAorCXN5bW1pc2MuYyAocHJpbnRfc3ltYm9sLCBwcmludF9wYXJ0aWFsX3N5bWJvbCk6ICBIYW5kbGUKKwlMT0NfVU5SRVNPTFZFRC4KKwkqIHN0YWJzcmVhZC5jIChzY2FuX2ZpbGVfZ2xvYmFscyk6ICBDaGFuZ2UgdW5yZXNvbHZlZCBMT0NfU1RBVElDCisJc3ltYm9scyB0byBMT0NfVU5SRVNPTFZFRC4gUmVtb3ZlIHJ0X2NvbW1vbl9vYmpmaWxlIGxvb2t1cAorCWtsdWRnZSwgZ2xvYmFsIGNvbW1vbiBzeW1ib2xzIGFyZSBub3cgaGFuZGxlZCBieSBMT0NfVU5SRVNPTFZFRC4KKwkoc2Nhbl9maWxlX2dsb2JhbHNfMSk6ICBNb3ZlIGNvZGUgYmFjayB0byBzY2FuX2ZpbGVfZ2xvYmFscywKKwlkZWxldGUuCisKK0ZyaSBPY3QgMjcgMDk6NTQ6MDcgMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50X3JlX3NldCk6ICAjaWZkZWYgR0VUX0xPTkdKTVBfVEFSR0VUCisJYXJvdW5kIGNhbGxzIHRvIGNyZWF0ZV9sb25nam1wX2JyZWFrcG9pbnQuICBXaHkgaW5zdGFsbCB0aGUKKwlicmVha3BvaW50cyBpZiB3ZSBjYW4ndCBmaW5kIHRoZSBsb25nam1wIHRhcmdldD8KKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBDbGVhbnVwIGNvbW1lbnRzIG5lYXIgY2FsbCB0ZXN0LgorCSogcmVtb3RlLW1pcHMuYzogIEZpeGVkIGEgYnVuY2ggb2YgcHJvdG90eXBlcyB0byBhdm9pZCBjaGFyL2ludAorCWNvbXBsYWludCBmcm9tIHBpY2t5IGNvbXBpbGVycy4gIEFkZCBjb21tZW50IHRvIG1pcHNfZXhwZWN0LgorCVJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiBzcl9nZXRfZGVidWcgd2l0aCByZW1vdGVfZGVidWcuCisJKiAobWlwc19yZWFkY2hhcik6ICBEb24ndCBqYW0gaW5pdCBzdHJpbmcgdG8gbW9uaXRvci4KKwltaXBzX2luaXRpYWxpemUoKSBoYW5kbGVzIHRoYXQuCisJKiAobWlwc19yZWNlaXZlX2hlYWRlcik6ICBQcmludCBiZXR0ZXIgbWVzc2FnZSB3aGVuIHdlIGdldCB0b28KKwltdWNoIGdhcmJhZ2UuCisJKiAobWlwc19yZXF1ZXN0KTogIEFsbG93IGNhbGxlciB0byBwYXNzIGluIGJ1ZmYgdG8gYWxsb3cgdGhlbSB0bworCWFuYWx5emUgdGhlIHJldHVybmVkIG1lc3NhZ2UuCisJKiAobWlwc19pbml0aWFsaXplKTogIFJlLWRvIGluaXRpYWxpemF0aW9uIHRvIHRyeSBzZW5kaW5nIGEgQlJFQUssCisJYSBeQywgYW5kIHRoZW4gYSBkb3dubG9hZCBlc2NhcGUgc2VxdWVuY2UuICBDbGVhbnVwIHByb3RvY29sCisJc3RhcnR1cC4gIEVsaW1pbmF0ZSBzbGVlcHMuICBDbGVhciBicmVha3BvaW50cyAoaWYgdXNpbmcgbW9uaXRvcgorCWJyZWFrcG9pbnRzKS4gIFJlLWluaXQgZnJhbWUuCisJKiAobWlwc19kZXRhY2gpOiAgQ2xvc2UgZG93biB0YXJnZXQuCisJKiAobWlwc193YWl0KTogSGFuZGxlIHJldHVybiBzdGF0dXMgd2l0aCByZWdpc3RlcnMsIG9yIGJyZWFrcG9pbnQKKyAJKiBzdHVmZi4KKwkqIChtaXBzX2tpbGwpOiAgQWRkIF5DIGhhbmRsaW5nLgorCSogKG1pcHNfaW5zZXJ0X2JyZWFrcG9pbnQgbWlwc19yZW1vdmVfYnJlYWtwb2ludCk6ICBDYWxsIG5ldworCWJyZWFrcG9pbnQgc3R1ZmYgaWYgZW5hYmxlZC4KKwkqIChjYWxjdWxhdGVfbWFzayByZW1vdGVfbWlwc19zZXRfd2F0Y2hwb2ludAorCXJlbW90ZV9taXBzX3JlbW92ZV93YXRjaHBvaW50IHJlbW90ZV9taXBzX3N0b3BwZWRfYnlfd2F0Y2hwb2ludCk6CisJSGFyZHdhcmUgd2F0Y2hwb2ludC9icmVha3BvaW50IHN0dWZmLgorCSogKGNvbW1vbl9icmVha3BvaW50KTogIENvbW1vbiBjb2RlIGZvciBuZXcgbW9uaXRvciBicmVha3BvaW50IGNvbW1hbmRzLgorCSogKG1pcHNfbG9hZCk6ICBEb24ndCB1c2UgYHByb21wdCcuICBJdCdzIGEgZ2xvYmFsIHZhcmlhYmxlLgorCSogdG9wLmMgKGRvbnRfcmVwZWF0X2NvbW1hbmQpOiAgTmV3IGNvbW1hbmQgZm9yIHVzZSBpbgorCXVzZXItZGVmaW5lZCBjb21tYW5kcyB0byBzdXBwcmVzcyBhdXRvLXJlcGVhdCAoYnkgaGl0dGluIHJldHVybiBrZXkpLgorCSogdmFsb3BzLmM6ICBBZGQgc3RhcnQgb2YgYXV0byBmdW5jdGlvbi1jYWxsIGFiYW5kb25tZW50IGNhcGFiaWxpdHkuCisKK1RodSBPY3QgMjYgMjI6MDI6MjcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctY29uZmlnLmluOiBBZGQgc3VwcG9ydCBmb3IgUG93ZXJNYWMgaG9zdCwgYWRkIGJlZ2lubmluZ3MKKwlvZiBuYXRpdmUgc3VwcG9ydC4KKwkqIG1wdy1tYWtlLnNlZDogRGlzYWJsZSBzdWJkaXIgcmVjdXJzaW9uLCBlZGl0IG91dCB1c2VsZXNzIHJ1bGUuCisJKiBtYWMteGRlcC5jIChWYWx1ZXMuaCk6IERvbid0IGluY2x1ZGUuCisJKEdlc3RhbHRFcXUuaCk6IEluY2x1ZGUgR2VzdGFsdC5oIGluc3RlYWQuCisJKGRvX21vdXNlX2Rvd24pOiBDb21tZW50IG91dCBjb250cm9sIHRyYWNraW5nLCBuZWVkcyB0byBiZQorCXVwZGF0ZWQgdG8gdXNlIFVQUCBiZWZvcmUgd2lsbCB3b3JrIG9uIFBvd2VyTWFjLgorCSogY29uZmlnL3htLW1wdy5oOiBOZXcgZmlsZSwgYWxsLU1hYyBob3N0IHN1cHBvcnQuCisJKiBjb25maWcvbTY4ay94bS1tcHcuaDogTW92ZSBtb3N0IGRlZmluaXRpb25zIGludG8gZ2VuZXJpYyBNYWMKKwlzdXBwb3J0LgorCSogY29uZmlnL3Bvd2VycGMveG0tbXB3Lmg6IE5ldyBmaWxlLCBQb3dlck1hYyBob3N0IHN1cHBvcnQuCisJCitUaHUgT2N0IDI2IDE1OjIxOjMyIDE5OTUgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KKworCSogcmVnZXguaDogUmVuYW1lZCB0byBnbnUtcmVnZXguaC4KKwkqIHJlZ2V4LmM6IFJlbmFtZWQgdG8gZ251LXJlZ2V4LmMuCisJKiBNYWtlZmlsZS5pbiAoUE9TU0xJQlMpOiBSZWZlciB0byBnbnUtcmVnZXguaCBhbmQgZ251LXJlZ2V4LmMuCisJKFJFR0VYLCBSRUdFWDEpOiBDaGFuZ2UgdG8gZ251LXJlZ2V4Lm8gaW5zdGVhZCBvZiByZWdleC5vLgorCShyZWdleC5vKTogUmVuYW1lZCB0byBnbnUtcmVnZXgubzsgcmVmZXIgdG8gZ251LXJlZ2V4LmMuCisJKGlyaXg1LW5hdC5vLCBvc2Zzb2xpYi5vLCBnbnUtcmVnZXgubywgc29saWIubywgc291cmNlLm8sIHN5bXRhYi5vKToKKwlMaWtld2lzZS4KKwkqIGlyaXg1LW5hdC5jLCBvc2Zzb2xpYi5jLCBnbnUtcmVnZXguYywgc29saWIuYywgc291cmNlLmMsIHN5bXRhYi5jKToKKwlJbmNsdWRlICJnbnUtcmVnZXguaCIgaW5zdGVhZCBvZiAicmVnZXguaCIuCisJKiBhbHBoYS10ZGVwLmMgKGluX3Byb2xvZ3VlKTogUmVuYW1lIHRvIGFscGhhX2luX3Byb2xvZ3VlLCB0bworCWF2b2lkIGNvbmZsaWN0cyB3aXRoIHN5bXRhYi5oLgorCitUdWUgT2N0IDI0IDE4OjMwOjE4IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBjb25maWcvcGEvaHBwYWhwdXgubWg6IFJlbW92ZSBoYXJkY29kaW5nIG9mIFggbG9jYXRpb25zLgorCSogTWFrZWZpbGUuaW46IFVzZSBYMTFfQ0ZMQUdTLCBYMTFfTERGTEFHUyBhbmQgWDExX0xJQlMuCisJKiBjb25maWd1cmUuaW46IExpbmsgWCBzdGF0aWNhbGx5IG9uIFNvbGFyaXMsIFN1bk9TIGFuZCBIUFVYLgorCitUdWUgT2N0IDI0IDEyOjI2OjE0IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIG1vbml0b3IuYyAobW9uaXRvcl9leHBlY3RfcmVnZXhwKTogU2FtZSBhcyBtb25pdG9yX2V4cGVjdCwgYnV0CisgCXdpdGggdGhlIG9idmlvdXMgZXh0ZW5zaW9uLgorCShtb25pdG9yX3JlYWRfbWVtb3J5X3NpbmdsZSk6IFVzZSByZWdleHAgZm9yIGdldG1lbS5yZXNwX2RlbGltCisgCWJlY2F1c2Ugb2YgcGFyc2luZyBhbWJpZ3VpdGllcyBjYXVzZWQgYnkgY2VydGFpbiBtb25pdG9ycy4KKwkobW9uaXRvcl9yZWFkX21lbW9yeSk6IFVzZSBuZXcgcmVnZXhwIHN0dWZmIHRvIHBhcnNlCisgCWdldG1lbS5yZXNwX2RlbGltLgorCSogbW9uaXRvci5oIChzdHJ1Y3QgbWVtcndfY21kLT5yZXNwX2RlbGltKTogRG9jdW1lbnQgdGhpcyBhcyBhCisgCXJlZ2V4cC4KKwkqIHNoMy1yb20uYzogIEZpbmlzaCBvZmYgdGFibGUuICBVc2UgbmV3IHJlZ2V4cCBjYXBhYmlsaXR5IGZvcgorCWdldG1lbSBjb21tYW5kcy4KKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogIERpc2FibGUgcXVlc3Rpb25hYmxlIGNvZGUgbmVhcgorCXRoZSBzdGVwIHJhbmdlIHRlc3QuICBSZXBsYWNlIGNhbGwgZGV0ZWN0aW9uIHRlc3Qgd2l0aCBtdWNoCisJc2ltcGxlciAoYW5kIG1vcmUgZWZmaWNpZW50KSB0ZXN0IHRoYXQgZG9lc24ndCByZXF1aXJlIHByb2xvZ3VlCisJZXhhbWluYXRpb24gKGFzIG9mdGVuKS4KKwkqIHN5bXRhYi5jIHN5bXRhYi5oIChpbl9wcm9sb2d1ZSk6ICBOZXcgZnVuY3Rpb24gdGhhdCBpbmRpY2F0ZXMKKwl3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgaW4gYSBmdW5jdGlvbiBwcm9sb2d1ZS4gIFRoaXMgdXNlcyB0aGUKKwlzeW1ib2wgdGFibGUsIGFuZCB0aGVuIGZhbGxzIGJhY2sgdG8gcHJvbG9ndWUgZXhhbWluYXRpb24gaWYgdGhhdAorCWZhaWxzLiAgSXQncyBtdWNoIG1vcmUgZWZmaWNpZW50IGZvciByZW1vdGUgZGVidWdnaW5nIGJlY2F1c2UgaXQKKwlhdm9pZHMgZXhhbWluaW5nIG1lbW9yeSwgd2hpY2ggaXMgdmVyeSBzbG93LiAgVGhpcyBpcyB1c2VkIGluCisJd2FpdF9mb3JfaW5mZXJpb3IgdG8gZGV0ZXJtaW5lIGlmIHdlJ3ZlIG1hZGUgYSBmdW5jdGlvbiBjYWxsIHRoYXQKKwluZWVkcyB0byBiZSBza2lwcGVkIG92ZXIgKGZvciBuZXh0L25leHRpKS4KKwkqIG1pcHMtdGRlcC5jIChhZnRlcl9wcm9sb2d1ZSk6ICBOZXcgZnVuY3Rpb24sIHJldHVybnMgdGhlIFBDCisJYWZ0ZXIgdGhlIHByb2xvZ3VlLiAgVXNlcyBQRFJzIGFuZCB0aGUgc3ltYm9sIHRhYmxlLgorCShtaXBzX2ZpbmRfc2F2ZWRfcmVncyk6ICBVc2UgaW5fcHJvbG9ndWUoKSB0byBhdm9pZCBjb3N0bHkKKwlwcm9sb2d1ZSBleGFtaW5hdGlvbiBpZiBwb3NzaWJsZS4KKwkobWlwc19za2lwX3Byb2xvZ3VlKTogIFVzZSBhZnRlcl9wcm9sb2d1ZSgpIGlmIHBvc3NpYmxlIHRvIGF2b2lkCisJY29zdGx5IHByb2xvZ3VlIGV4YW1pbmF0aW9uLgorCitNb24gT2N0IDIzIDE2OjAzOjMzIDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQHBhc2FuZGEuY3lnbnVzLmNvLnVrPgorCisJKiBjb25maWd1cmUuaW4gKGNvbmZpZ2RpcnMpOiBBZGRlZCBzdXBwb3J0IGZvciB0aGUgVlI0MzAwIGRlZmF1bHQKKyAJYnVpbGRzIChtaXBzNjQqdnI0MzAwKmVsLSotZWxmKiwgbWlwczY0KnZyNDMwMCotKi1lbGYqKS4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworCSogcmVtb3RlLW1pcHMuYyAobWlwc19sb2FkKTogVXBkYXRlZCB0aGUgcHJvbXB0IHNwb3R0aW5nIGNvZGUgdG8KKyAJbWFrZSB1c2Ugb2YgdGhlIFRBUkdFVF9NT05JVE9SX1BST01QVCBtYW5pZmVzdC4KKworU2F0IE9jdCAyMSAwNjoxMTo0OSAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGFscGhhLXRkZXAuYywgbWlwcy10ZGVwLmMgKGluaXRfZXh0cmFfZnJhbWVfaW5mbyk6CisJRG8gbm90IHNldCBzYXZlZCByZWdpc3RlcnMgZnJvbSBoZXVyaXN0aWNzIGZvciBhIHNpZ3RyYW1wIGZyYW1lLgorCisJKiBkd2FyZnJlYWQuYyAoZW51bV90eXBlKTogIERldGVybWluZSBzaWduZWRuZXNzIG9mIGVudW0gdHlwZQorCWZyb20gZW51bWVyYXRvcnMuCisKKwkqIG1pcHMtdGRlcC5jOiAgSW5jbHVkZSBnZGJfc3RyaW5nLmgsIGdjYyAtV2FsbCBsaW50LgorCisJKiByczYwMDAtbmF0LmMgKHhjb2ZmX3JlbG9jYXRlX2NvcmUpOiAgRml4IHR5cG8uCisKKwkqIHZhbG9wcy5jICh2YWx1ZV9yZXBlYXQpOiAgRml4IGxlbmd0aCBvZiBtZW1vcnkgdHJhbnNmZXIgdG8KKwltYXRjaCByZWNlbnQgYWxsb2NhdGVfcmVwZWF0X3ZhbHVlIGNoYW5nZS4KKworVGh1IE9jdCAxOSAxOTowNDozNSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogZ2RidHlwZXMuYyAoZ2V0X2Rpc2NyZXRlX2JvdW5kcyk6ICBGaXggdHlwby4KKworVGh1IE9jdCAxOSAxMjoxNTozNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGRlZnMuaCAoU0VFS19TRVQsIFNFRUtfQ1VSKTogQWRkIGRlZmF1bHQgZGVmaW5pdGlvbnMuCisJKiBkYnhyZWFkLmMsIG1kZWJ1Z3JlYWQuYywgb3M5a3JlYWQuYyAoU0VFS19TRVQsIFNFRUtfQ1VSKToKKwlSZW1vdmUgZGVmYXVsdCBkZWZpbml0aW9ucy4KKworCSogTWFrZWZpbGUuaW4gKENDLUxEKTogUmVuYW1lIHRvIENDX0xELCBzbyBNUFcgeGZvcm0gd29ya3MuCisJKE1NQUxMT0NfU1JDKTogRGVmaW5lLgorCShNTUFMTE9DX0NGTEFHUyk6IFVzZS4KKwkoc2VyLW1hYy5vKTogQWRkIHJ1bGUuCisJKiBkd2FyZnJlYWQuYywgc29tcmVhZC5jLCB1bHRyYTMtbmF0LmMsIHhjb2ZmcmVhZC5jOiBSZXBsYWNlIExfU0VUCisgCXdpdGggU0VFS19TRVQgaW4gYWxsIGNhbGxzIHRvIGJmZF9zZWVrLgorCSogc2NtLXRhZ3MuaCAoc2NtX3RhZ3MpOiBSZW1vdmUgZXhjZXNzIGNvbW1hLgorCisJKiBtcHctY29uZmlnLmluOiBBZGFwdCB0byB3b3JrIHdpdGggYXV0b2NvbmYnZWQgY29uZmlndXJ5OworCWJ1aWxkIGNvbmZpZy5oLCBhZGQgZW1wdHkgZGVmaW5pdGlvbnMgdG8gbWsudG1wLgorCShwb3dlcnBjLWFwcGxlLW1hY29zKTogTWFrZSBpdCB3b3JrLgorCSogbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgc2VkIGNvbW1hbmRzIHRvIHRyYW5zbGF0ZSBVbml4IG1ha2VmaWxlCisJaW50byBNUFcgc3ludGF4LgorCSogbXB3LW1ha2UuaW46IFJlbW92ZS4KKwkqIG1hYy1nZGIucjogTmV3IGZpbGUsIHdhcyBtYWNnZGIuciwgcmVuYW1lZCBmb3IgY29uc2lzdGVuY3kKKwl3aXRoIG90aGVyIHRvb2xzLCBub3cgaW5jbHVkZXMgY2ZyZyByZXNvdXJjZS4KKwkqIG1hY2dkYi5yOiBSZW1vdmUuCisJKiBjb25maWcvbTY4ay94bS1tcHcuaDogUmVtb3ZlIG1vc3Qgb2YgY29udGVudHMsIHJlcGxhY2Ugd2l0aAorCWluY2x1ZGUgb2YgaW5jbHVkZS9tcHcvbXB3LmguCisKK1R1ZSBPY3QgMTcgMTA6Mzg6NTMgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBocHBhLXRkZXAuYyAoZnJhbWVfY2hhaW4pOiBGaXggbW9yZSBvYnNjdXJlIHByb2JsZW1zIGNhdXNlZAorCWJ5IHN5c3RlbSBjYWxscyB0aGF0IGNvcmUgZHVtcCBwcm9jZXNzZXMgd2l0aG91dCBzYXZpbmcgYWxsCisJdGhlIHJlZ2lzdGVyIHN0YXRlLgorCisJKiBjb25maWcvcGEvaHBwYWhwdXgubXQgKFhERVBGSUxFUyk6IFJlbW92ZSBib2d1cyBkZWZpbml0aW9uLgorCSogY29uZmlnL3BhL2hwcGFwcm8ubXQgKFhERVBGSUxFUyk6IExpa2V3aXNlLgorCitUdWUgT2N0IDE3IDA4OjA0OjI2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBydGwuY3lnbnVzLmNvbT4KKworCSogTkVXUzogRml4IHR5cG8uCisKK01vbiBPY3QgMTYgMTg6MjQ6MDMgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBjb25maWcvc2gvdG0tc2guaCAoUkVHSVNURVJfVklSVFVBTF9UWVBFKTogUmV0dXJuIGJ1aWx0aW5fdHlwZV9mbG9hdAorCWZvciBGUCByZWdpc3RlcnMuCisJKFJFR0lTVEVSX05BTUVTKTogQWRkIEZQIHJlZ2lzdGVyIG5hbWVzLiAgUmVtb3ZlIHRpY2tzLCBzdGFsbHMsIGN5Y2xlcywKKwlpbnN0cywgcGxyLCBhbmQgdGxyLgorCShOVU1fUkVHUywgTlVNX1JFQUxSRUdTKTogSW5jcmVhc2UgZnJvbSAyMyB0byA0MS4KKwkoRlBVTF9SRUdOVU0sIEZQMF9SRUdOVU0pOiBOZXcgbWFjcm9zLgorCitNb24gT2N0IDE2IDExOjI3OjA2IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIHJlbW90ZS1taXBzLmM6ICBBZGQgc3VwcG9ydCBmb3Igc3BlZWR5IChhYm91dCAxMHggZmFzdGVyKQorCWRvd25sb2Fkcy4KKworCSogcmVtb3RlLWFycmF5LmM6ICBNb3ZlIGJhdWRfcmF0ZSBpbml0aWFsaXphdGlvbiBmcm9tCisJX2luaXRpYWxpemVfYXJyYXkgdG8gYXJyYXlfb3Blbi4gIEl0IHdhcyBmb3JjaW5nIHRoZSBiYXVkIHJhdGUgb2YKKwlhbGwgdGFyZ2V0cyB0byBiZSA0ODAwIGJhdWQhICBTZWVtcyBsaWtlIEkndmUgZml4ZWQgdGhpcyBiZWZvcmUuLi4KKwkqIGNvbmZpZy9taXBzL2lkdC5tdCAoVERFUEZJTEVTKTogIFJlbW92ZSByZW1vdGUtYXJyYXkuby4gIFRoaXMKKwloYXMgKm5vdGhpbmcqIHRvIGRvIHdpdGggSURUISEhCisKKworCSogTWFrZWZpbGUuaW4gc2gzLXJvbS5jIGNvbmZpZy9zaC9zaC5tdCBjb25maWcvc2gvdG0tc2guaDogIEFkZAorCXNoMyBtb25pdG9yIHN1cHBvcnQuCisJKiBtb25pdG9yLmM6ICBDbGVhbnVwIHJlZ2V4cCBjb21waWxhdGlvbiBzdHVmZiB0byBtYWtlIGl0IGVhc2llcgorCXRvIHVzZSBzZXZlcmFsIHJlZ2V4cHMuCisJKiBtb25pdG9yLmg6ICBHZXQgcmlkIG9mIHN0cnVjdCByb21fY21kX2RhdGEuICBJdCdzIG5vIGxvbmdlciB1c2VkLgorCSogY29uZmlnL202OGsvdG0tbW9uaXRvci5oOiAgRG9uJ3QgcmVkZWZpbmUgTlVNX1JFR1MgaGVyZS4gIEl0IGp1c3QKKwljYXVzZXMgR0RCIHRvIGNyYXNoLgorCisJKiBzcGFyY2wtdGRlcC5jOiAgQ2xlYW51cCBzZXJpYWwgZXJyb3IgaGFuZGxpbmcuCisKK1N1biBPY3QgMTUgMTY6MTk6MjcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiByczYwMDAtdGRlcC5jOiBEb24ndCBpbmNsdWRlIGEub3V0LmgsIGltcHJvdmUgc29tZSBmb3JtYXR0aW5nLgorCitGcmkgT2N0IDEzIDE1OjI3OjQ5IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGRjYWNoZS5jOiAgQ2hhbmdlIGRlZmF1bHQgdmFsdWUgb2YgcmVtb3RlY2FjaGUgdG8gb2ZmLiAgSXQganVzdAorCXNjcmV3cyB1cCB0b28gbWFueSB0YXJnZXRzLgorCSogc3BhcmNsLXN0dWIuYzogIEFkZCBwcm90b3R5cGVzIHRvIG1hbnkgZm9yd2FyZCBkZWNscy4KKwkqIENyZWF0ZSBwcml2YXRlIGNvcGllcyBvZiBzdHJsZW4sIHN0cmNweSwgYW5kIG1lbWNweSB0byBwcmV2ZW50CisJY2hhb3Mgd2hlbiB1c2VyIHN0ZXBzIGludG8gdGhlbS4KKwkqICh0cmFwX2xvdyBoYW5kbGVfZXhjZXB0aW9uKTogIENsZWFuIHVwIERTVSBzdXBwb3J0IGNvZGUKKwkoaGFyZHdhcmUgYnJlYWtwb2ludHMpLiAgTW92ZSBsb3RzIG9mIHN0dWZmIGZyb20gYXNtLWxhbmQgdG8KKwlDLWxhbmQgKG1ha2UgaXQgbXVjaCBlYXNpZXIgdG8gI2lmZGVmIGlmIG5lY2Vzc2FyeSkuICBBbHNvLCB1c2UKKwl0cmFwIDI1NSB0byBnZXQgaW50byBicmVhayBtb2RlIGluc3RlYWQgb2YgZG9pbmcgYSBEU1UgcmVnaXN0ZXIKKwl3cml0ZSwgd2hpY2ggbWF5IHRyYXNoIHRoZSByZWdpc3Rlci4KKwkqIChwdXRwYWNrZXQpOiAgRG9uJ3QgY2hlY2sgcmV0dXJuIHZhbHVlIG9mIHB1dERlYnVnQ2hhci4gIEl0CisJcmV0dXJucyB2b2lkLi4uCisKK0ZyaSBPY3QgMTMgMTQ6MTY6MTcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLXNpbS5oOiBBbHdheXMgaW5jbHVkZSBjYWxsYmFjay5oLgorCShzaW1fc2V0X2NhbGxiYWNrcyk6IE5ldyBkZWNsYXJhdGlvbi4KKworRnJpIE9jdCAxMyAxMDo1Nzo0MCAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNvbXNvbGliLmMgKHNvbV9zb2xpYl9hZGQpOiBKdXN0IGdpdmUgYSB3YXJuaW5nIGlmIGEgZmlsZQorCW1lbnRpb25lZCBpbiB0aGUgZGxkX2xpc3QgY2FuJ3QgYmUgZm91bmQuCisJKiBjb25maWcvcGEvdG0taHBwYWguaCAoRlJBTUVfU0FWRURfUENfSU5fU0lHVFJBTVApOiBEaWcgb3V0CisJdGhlIFBDIGZyb20gdGhlIFBDIHF1ZXVlcyByYXRoZXIgdGhhbiAlcjMxLgorCitUaHUgT2N0IDEyIDEzOjM2OjE1IDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29yZWxvdy5jIChjb3JlX29wZW4pOiBEb24ndCB1cGRhdGUgdGhlIHRvX3NlY3Rpb25zIGFuZAorCXRvX3NlY3Rpb25zX2VuZCBmaWVsZHMgaW4gY29yZV9vcHMgaGVyZS4gIEl0J3MgdG9vIGxhdGUuCisJKiBpcml4NS1uYXQuYyAoc29saWJfYWRkKTogVXBkYXRlIHRoZSB0b19zZWN0aW9ucyBhbmQKKwl0b19zZWN0aW9uc19lbmQgZmllbGRzIGluIGNvcmVfb3BzIGhlcmUgaWYgbmVlZGVkLgorCSogb3Nmc29saWIuYyAoc29saWJfYWRkKTogTGlrZXdpc2UuCisJKiByczYwMDAtbmF0LmMgKHhjb2ZmX3JlbG9jYXRlX2NvcmUpOiBMaWtld2lzZS4KKwkqIHNvbGliLmMgKHNvbGliX2FkZCk6IExpa2V3aXNlLgorCSogc29tc29saWIuYyAoc29saWJfYWRkKTogTGlrZXdpc2UuCisKK1dlZCBPY3QgMTEgMTc6MjU6NTkgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQHJ0bC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IEJ1bXAgdmVyc2lvbiB0byA0LjE1LjEKKworVHVlIE9jdCAxMCAxNToyNjozOSAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBWZXJzaW9uIDQuMTUgcmVsZWFzZWQuCisJKiBSRUFETUU6IFVwZGF0ZWQgZm9yIHZlcnNpb24gNC4xNS4KKwkqIE5FV1M6IFVwZGF0ZWQgZm9yIDQuMTUgcmVsZWFzZS4KKwkKK1R1ZSBPY3QgMTAgMTM6MTg6NTAgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogIEFkZCBBQ19QUk9HX1lBQ0MKKwkqIGNvbmZpZ3VyZTogIFJlZ2VuZXJhdGUKKwkqIE1ha2VmaWxlLmluIChCSVNPTik6ICBSZW1vdmUgbWFjcm8gZGVmaW5pdGlvbi4KKwkoWUFDQyk6ICBTZXQgZnJvbSBhdXRvY29uZmlnLgorCShGTEFHU19UT19QQVNTKTogIFJlbW92ZSBCSVNPTi4KKwkoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpOiAgUmVtb3ZlIEJJU09OLgorCQorVHVlIE9jdCAxMCAxMjoyNToxMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiB3aW4zMi1uYXQuYyAoY2hpbGRfY3JlYXRlX2luZmVyaW9yKTogUGFzcyBhcmd2IGNvcnJlY3RseS4KKwkqIE1ha2VmaWxlLmluICh3aW4zMi1uYXQubyk6IEFkZCBkZXBlbmRlbmNpZXMuCisKK01vbiBPY3QgIDkgMTQ6MzY6MjkgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogTkVXUzogIEFkZCBpbmZvcm1hdGlvbiBhYm91dCB3aW4zMiBhbmQgYXJtIGNvZGUuCisJKiB3aW4zMi1uYXQuYzogUmVuYW1lZCBmcm9tIHdpbjMyLmMuCisJKiBjb25maWcvaTM4Ni93aW4zMi5taDogUmVuYW1lZCBmcm9tIGNvbmZpZy9pMzg2L2kzODZ3aW4zMi5taC4KKwkqIGNvbmZpZy9pMzg2L3dpbjMyLm10OiBSZW5hbWVkIGZyb20gY29uZmlnL2kzODYvaTM4NndpbjMyLm10LgorCSogY29uZmlnL2kzODYvdG0td2luMzIuaDogUmVuYW1lZCBmcm9tIGNvbmZpZy9pMzg2L3RtLWkzODZ3aW4zMi5oLgorCSogY29uZmlnL2kzODYveG0td2luMzIuaDogUmVuYW1lZCBmcm9tIGNvbmZpZy9pMzg2L3htLWkzODZ3aW4zMi5oLgorCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLXdpbjMyKTogVXBkYXRlZCB0byBjb3BlIHdpdGggZmlsZW5hbWUKKwljaGFuZ2VzLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4JCisKK1N1biBPY3QgIDggMTg6MDE6MDQgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIGNoLWV4cC55ICh5eWxleCk6ICBBbHNvIGxvb2sgZm9yICckJyBmb2xsb3dpbmcgJyQnLgorCitTYXQgT2N0ICA3IDIyOjUyOjQyIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY2gtZXhwLnkgKHl5bGV4KTogRml4IHR5cG8uCisKK0ZyaSBPY3QgIDYgMTE6NTY6NDkgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmMgKGdkYnNpbV9vcGVuKTogUHV0IGNhbGxiYWNrIGluaXRpYWxpemF0aW9ucyBoZXJlLgorCShfaW5pdGFsaXplX3JlbW90ZV9zaW0pOiBOb3QgaGVyZS4KKworRnJpIE9jdCAgNiAxNzowODo0OSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHRvcC5jIChleGVjdXRlX2NvbnRyb2xfY29tbWFuZCk6IFVzZSAwLzEgaW5zdGVhZCBvZiBCRkQncworCXRydWUvZmFsc2UuCisKK0ZyaSBPY3QgIDYgMTQ6NDM6MTkgMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogc3BhcmNsLXN0dWIuYzogIEluY2x1ZGUgc3BhcmNsaXRlLmggdG8gZ2V0IGFjY2VzcyB0byByZWdpc3RlcgorCWZvbmRsaW5nIG1hY3Jvcy4KKwkqICh0cmFwX2xvdyk6ICBTYXZlIGFuZCByZXN0b3JlIEZQIHJlZ3MgaWYgbmVjZXNzYXJ5LiAgQWxzbywgY2xlYW4KKwl1cCBzYXZlIGFuZCByZXN0b3JlIG9mIGRlYnVnIHVuaXQgcmVncy4KKwkqIChoYXJkX3RyYXBfaW5mbyk6ICBBZGQgbW9yZSBhcmNoaXRlY3R1cmFsbHkgZGVmaW5lZCB0cmFwcy4KKwkqIChzZXRfZGVidWdfdHJhcHMpOiAgT25seSBzZXQgRlAgZGlzYWJsZWQgdHJhcCBpZiBGUCBpcyBkaXNhYmxlZC4KKwkqIChnZXRfaW5fYnJlYWtfbW9kZSk6ICBDbGVhbiB1cC4gIEdldCByaWQgb2YgY2FsbHMgdG8KKwlzZXRfaHdfYnJlYWtwb2ludF90cmFwKCkuICBBbHNvLCB1c2Ugd3JpdGVfYXNpIG1hY3JvLgorCSogKGhhbmRsZV9leGNlcHRpb24pOiAgQ2xlYW4gdXAgYGcnIGFuZCBgRycgY29tbWFuZHMuICBBZGQgYFAnCisJY29tbWFuZC4KKwkqIChod19icmVha3BvaW50KTogIFdoeSB3YXMgdGhpcyBoZXJlIT8gIEl0J3MgZ29uZSBub3cuLi4KKworRnJpIE9jdCAgNiAxMTo1Njo0OSAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+CisKKwkqIGNhbGxiYWNrLmMgKGZkYmFkKTogRml4IHR5cG8gaW4gY29tbWVudC4KKwkob3NfY2xvc2UsIG9zX2lzYXR0eSwgb3NfbHNlZWssIG9zX3JlYWQsIG9zX3dyaXRlKTogVXNlIGlmCisgCXN0YXRlbWVudHMgcmF0aGVyIHRoYW4gfHwgdG8gZ2V0IGNvcnJlY3QgcmV0dXJuIHZhbHVlLgorCShvc193cml0ZV9zdGRvdXQpOiBQYXNzIG1pc3NpbmcgZmlyc3QgYXJndW1lbnQgdG8gb3Nfd3JpdGUuCisJKiByZW1vdGUtc2ltLmM6IEluY2x1ZGUgY2FsbGJhY2suaC4KKwkoX2luaXRpYWxpemVfcmVtb3RlX3NpbSk6IENhbGwgc2ltX3NldF9jYWxsYmFja3MgYW5kIHRoZW4KKyAJaW5pdGlhbGl6ZSB0aGUgY2FsbGJhY2tzLgorCitUaHUgT2N0ICA1IDE3OjI4OjA5IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiB2YWx1ZXMuYyAoYWxsb2NhdGVfcmVwZWF0X3ZhbHVlKTogIEFsbG9jYXRlIGFuIGFycmF5IHR5cGUsIGFuZAorCWEgdmFsdWUgb2YgdGhhdCB0eXBlOyB1c2UgdGhhdCBpbnN0ZWFkIG9mIHNldHRpbmcgVkFMVUVfUkVQRUFURUQuCisJKiB2YWx1ZS5oIChzdHJ1Y3QgdmFsdWUpOiAgUmVtb3ZlIGZpZWxkcyByZXBldGl0aW9ucyBhbmQgcmVwZWF0ZWQuCisJKFZBTFVFX1JFUEVBVEVELCBWQUxVRV9SRVBFVElUSU9OUyk6ICBSZW1vdmVkLCBubyBsb25nZXIgdXNlZC4KKwkqIGMtdmFscHJpbnQuYywgY2gtdmFscHJpbnQuYywgZXZhbC5jLCBwcmludGNtZC5jLCB2YWxvcHMuYywKKwl2YWx1ZS5oLCB2YWx1ZXMuYzogU2ltcGxpZnksIHNpbmNlIG5vdyBWQUxVRV9SRVBFQVRFRCBpcyBuZXZlcgorIAl1c2VkLgorCSogdmFscHJpbnQuYyAodmFsdWVfcHJpbnRfYXJyYXlfZWxlbWVuKTogUmVtb3ZlZCBuZXZlci11c2VkCisgCWZ1bmN0aW9uLgorCQorVGh1IE9jdCAgNSAxNToxNDozNiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogcGFyc2UuYyAod3JpdGVfZG9sbGFyX3ZhcmlhYmxlKTogIE5ldyBmdW5jdGlvbi4KKworCSogYy1leHAueSAoeXlsZXgpOiBSZXBsYWNlIGNvZGUgZm9yIHJlY29nbml6aW5nICckJworIAlwc2V1ZG8tdmFyaWFibGVzIHdpdGggYSBjYWxsIHRvIHdyaXRlX2RvbGxhcl92YXJpYWJsZS4KKwlTaW1wbGlmeSBncmFtbWFyIGNvcnJlc3BvbmRpbmdseS4KKwkqIGYtZXhwLnk6ICBMaWtld2lzZS4KKwkqIG0yLWV4cC55OiAgTGlrZXdpc2UuCisJKiBjaC1leHAueTogIExpa2V3aXNlLiAgKFJlbW92ZSBmdW5jdGlvbiBtYXRjaF9kb2xsYXJfdG9rZW5zLikKKwkqIHNjbS1leHAuYyAoc2NtX2xyZWFkcik6IENhbGwgd3JpdGVfZG9sbGFyX3ZhcmlhYmxlIHRvIGhhbmRsZSAnJCcuCisKK1RodSBPY3QgIDUgMTM6Mjc6MzAgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogd2luMzIuYzogTmV3IGZpbGU7IHN1cHBvcnQgZm9yIGRlYnVnZ2luZyBvbiB3aW5kb3dzIE5ULgorCSogY29uZmlndXJlLmluOiAoaVszNDVdODYtKi13aW4zMik6IE5ldyB0YXJnZXQuCisJKiBjb25maWd1cmU6IFJlZ25lcmF0ZWQuCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cF9zdGFuZGFyZCk6IFJlbW92ZSB1bnVzZWQgbmFtZS4KKwkqIHNlcmlhbC5jIChnZGJfc3RyaW5nLmgpOiBJbmNsdWRlLgorCSogc291cmNlLmMgKHZhbHVlLmgpOiBJbmNsdWRlLgorCSogY29uZmlnL2kzODYvaTM4NndpbjMyLm1oIChYREVQRklMRVMpOiBBZGQgd2luMzIubworCSogY29uZmlnL2kzODYvaTM4NndpbjMyLm10OiBOZXcuCisJKiBjb25maWcvaTM4Ni90bS1pMzg2d2luMzIuaDogTmV3LgorCitXZWQgT2N0ICA0IDE4OjQxOjM0IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBleHByZXNzaW9uLmggKGVudW0gZXhwX2NvZGUpOiAgQWRkZWQgT1BfTkFNRS4KKwkqIGV4cHByaW50LmMgKHByaW50X3N1YmV4cCk6ICBBZGQgT1BfTkFNRSBzdXBwb3J0LgorCSogcGFyc2UuYyAobGVuZ3RoX29mX3N1YmV4cCwgcHJlZml4aWZ5X3N1YmV4cCk6ICBMaWtld2lzZS4KKwkqIHNjbS1sYW5nLmMgKHNjbV91bnBhY2ssIGluX2V2YWxfYywgc2NtX2xvb2t1cF9uYW1lKTogIG5ldyBmdW5jdGlvbi4KKwkqIHNjbS1sYW5nLmg6ICBEZWNsYXJlIGJ1aWx0aW5fdHlwZV9zY207ICBvdGhlciBtaW5vciB0d2Vha3MuCisJKiB2YWx1ZXMuYyAodW5wYWNrX2xvbmcpOiAgSWYgdHlwZSBpcyBTQ00sIGNhbGwgc2NtX3VucGFjay4KKwkqIHNjbS12YWxwcmludC5jIChzY21fdmFsX3ByaW50KTogIFVzZSBleHRyYWN0X3NpZ25lZF9pbnRlZ2VyLAorCWluc3RlYWQgdW5wYWNrX2xvbmcKKwkqIHNjbS1sYW5nLmM6IE1vcmUgU2NoZW1lIGV4cHJlc3Npb24gcGFyc2luZyBmcm9tIGhlcmUgLi4uCisJKiBzY20tZXhwLmM6ICAuLi4gdG8gaGVyZS4gIE5ldyBmaWxlLgorCUFsc28sIHByb3ZpZGUgZm9yIGdkYiB0byBldmFsdWF0ZSBzaW1wbGUgY29uc3RhbnRzIGFuZCBuYW1lcy4uCQorCSogTWFrZWZpbGUuaW46ICBOb3RlIG5ldyBzY20tZXhwLntjLG99LgorCQorV2VkIE9jdCAgNCAxNzoyMzowMyAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogZ2RidHlwZXMuYyAoZ2V0X2Rpc2NyZXRlX2JvdW5kcyk6ICBOZXcgZnVuY3Rpb24uCisJKGZvcmNlX3RvX3JhbmdlX3R5cGUpOiAgVXNlIGdldF9kaXNjcmV0ZV9ib3VuZHMuCisJKiBnZGJ0eXBlcy5oIChnZXRfZGlzY3JldGVfYm91bmRzKTogIEFkZCBkZWNsYXJhdGlvbi4KKwkqIHZhbGFyaXRoLmMgKHZhbHVlX2JpdF9pbmRleCk6ICBHZW5lcmFsaXplIHRvIHVzZSBnZXRfZGlzY3JldGVfYm91bmRzLgorCSogY2gtdmFscHJpbnQuYyAoY2hpbGxfdmFsX3ByaW50KTogIE1ha2UgKHBvd2VyKXNldHMgYW5kIGJpdHN0cmluZworCXN1cHBvcnQgdXNlIGdldF9kaXNjcmV0ZV9ib3VuZHMgYW5kIGdlbmVyYWxseSBiZSBtb3JlIHJvYnVzdC4KKworVHVlIE9jdCAgMyAxNjo1NDo1NiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1ucm9tLmMgKG5yb21fb3BzKTogQWRkIHZhbHVlIGZvciB0b190aHJlYWRfYWxpdmUsCisJYWRkIGNvbW1lbnRzIG5hbWluZyBzbG90cy4KKworTW9uIE9jdCAgMiAyMTo0NTo0NCAxOTk1ICBKZWZmIExhdyAgKGxhd0BodXJsKQorCisJKiB0b3AuYyAoYnVpbGRfY29tbWFuZF9saW5lKTogRGVtYW5kIGFyZ3VtZW50cyBmb3IgaWYvd2hpbGUKKwljb21tYW5kcy4KKworTW9uIE9jdCAgMiAxMzowODowMSAxOTk1ICBKYXNvbiBNb2xlbmRhICAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChYMTFfQ0ZMQUdTKTogU2V0IG9ubHkgdG8gQFhfSU5DRElSQC4KKworU2F0IFNlcCAzMCAxNjoxMzozNiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogc2NtLWxhbmcuYzogIE1vdmVkIFNjaGVtZSB2YWx1ZSBwcmludGluZyBjb2RlIHRvIC4uLgorCSogc2NtLXZhbHByaW50LmM6ICAuLi4gdGhpcyBuZXcgZmlsZS4KKwlBbHNvIG1ham9yIGltcHJvdmVtZW50cyBpbiBzdXBwb3J0IGZvciBwcmludGluZyBTQ00gdmFsdWVzLgorCSogc2NtLWxhbmcuaDogIE5ldyBmaWxlLgorCSogc2NtLXRhZ3MuaDogIE5ldyBmaWxlLgorCSogTWFrZWZpbGUuaW46ICBOb3RlIG5ldyBzY20tdmFscHJpbnQue2Msb30uCisKK1NhdCBTZXAgMzAgMDk6MzU6MDIgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogWF9JTkNESVIgYW5kIFhfTElCRElSIGFkZGVkLgorCSogTWFrZWZpbGUuaW46IEBYX0lOQ0RJUkAgYW5kIEBYX0xJQkRJUkAgYWRkZWQuCisJKiBjb25maWd1cmU6IFJlZ25lcmF0ZWQuCisKK0ZyaSBTZXAgMjkgMDI6MTA6MDUgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2FybS90bS1hcm0uaCAoRlJBTUVfQ0hBSU4sIEZSQU1FX0NIQUlOX1ZBTElEKToKKwlBbnkgcGMgPiBMT1dFU1RQQyBpcyBvay4KKworCSogcmVtb3RlLXJkcC5jIChyZHBfaW5pdCk6IFRha2Ugb3V0IHZhcmlhYmxlIGJhdWQgcmF0ZSBzdHVmZi4KKwkocmVtb3RlX3JkcF9kZXRhdGNoKTogRGVsZXRlLgorCSogYnJlYWtwb2ludC5jIChjdHlwZS5oKTogRG9uJ3QgaW5jbHVkZSB0d2ljZS4KKworCSogTWFrZWZpbGUuaW4gKHJlbW90ZS1yZHAubyk6IERvZXNuJ3QgbmVlZCByZW1vdGUtcmRwLmgKKwkqIGNhbGxiYWNrLmMgKG9zX3ByaW50Zl9maWx0ZXJlZCk6IGZpeCBwcm90b3MuCisJKiBkZWZzLmggKHB1dHNfZmlsdGVyZWQsIHB1dHNfdW5maWx0ZXJlZAorCVt2fGZ8XXByaW50Zl9bdW5dZmlsdGVyZWQpOiBNYWtlIGZvcm1hdCBhcmcgY29uc3QuCisJKiByZW1vdGUtcmRwLmMgKHJkcF9pbml0KTogQXR0ZXB0IHRvIHN5bmMgYXQgZGlmZmVyZW50CisJYmF1ZHJhdGVzLgorCSogdXRpbHMuYyAocHV0c19maWx0ZXJlZCwgcHV0c191bmZpbHRlcmVkCisJW3Z8ZnxdcHJpbnRmX1t1bl1maWx0ZXJlZCk6IERlZmluZSBwcm90b3R5cGVzIHdpdGgKKwljb25zdCBpbiB0aGUgcmlnaHQgcGxhY2UuCisKK1RodSBTZXAgMjggMTc6NDM6MzkgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIGRlZnMuaCAoZW51bSBsYW5ndWFnZSk6ICBBZGQgbGFuZ3VhZ2Vfc2NtLgorCSogZXhwcmVzc2lvbi5oIChlbnVtIGV4cF9jb2RlKTogIEFkZGVkIE9QX0VYUFJTVFJJTkcuCisJKiBzY20tbGFuZy5jOiAgUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgR3VpbGUgL1NDTSBkaWFsZWN0IG9mIFNjaGVtZS4KKwkqIGV4cHByaW50LmMgKHByaW50X3N1YmV4cCk6ICBBZGQgT1BfRVhQUlNUUklORyBzdXBwb3J0LgorCSogcGFyc2UuYyAobGVuZ3RoX29mX3N1YmV4cCwgcHJlZml4aWZ5X3N1YmV4cCk6ICBMaWtld2lzZS4KKwkqIHZhbG9wcy5jIChmaW5kX2Z1bmN0aW9uX2luX2luZmVyaW9yKTogIE5ldyBmdW5jdGlvbi4KKwkodmFsdWVfYWxsb2NhdGVfc3BhY2VfaW5faW5mZXJpb3IpOiAgTmV3IGZ1bmN0aW9uLgorCShhbGxvY2F0ZV9zcGFjZV9pbl9pbmZlcmlvcik6ICBSZWRlZmluZSB1c2luZyBwcmV2aW91cyBmdW5jdGlvbi4KKwkqIE1ha2VmaWxlLmluIChTRklMRVMpOiAgQWRkIHNjbS1sYW5nLmMuCisJKENPTU1PTl9PQlMpOiAgQWRkIHNjbS1sYW5nLm8KKworVGh1IFNlcCAyOCAxNDozMjoxMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBjYWxsYmFjay5bY2hdOiBOZXcgZmlsZXMuCisJKiByZW1vdGUtcmRwLmM6IFN1cHBvcnQgZm9yIHRoZSBBUk0gUkRQIG1vbml0b3IuCisJKiBNYWtlZmlsZTogVXBkYXRlLgorCSogYXJtLXRkZXAuYyAoYXJtX290aGVybmFtZXMpOiBOZXcuCisJKF9pbml0aWFsaXplX2FybV90ZGVwKTogaW5zdGFsbCAnb3RoZXJuYW1lcycgY29tbWFuZC4KKwkoYXJtX251bGxpZmllZF9pbnNuLCBzaGlmdGVkX3JlZ192YWwsIGFybV9nZXRfbmV4dF9wYyk6IE5ldy4KKwkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIHRlcm1pb3MuaCwgdGVybWlvLmggYW5kIHNndHR5LmguCisJKGlbMzQ1XTg2LSotd2luMzIqKTogTmV3IGhvc3QuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogaW5mbG93LmM6IENsZWFuIHVwIGluY2x1c2lvbnMuCisJKiBtYWluLmMgKG1haW4pOiBDaGVjayBmb3IgV0lOR0RCLCBub3QgV0lOMzIuCisJKiBwcmludGNtZC5jIChkb19leGFtaW5lKTogUHV0IFFVSVQgdGVzdCBpbiBsb29wLgorCSogcmVtb3RlLWhtcy5jIChlNzAwMF9sb2FkKTogRGVsZXRlLgorCShobXNfb3BzKTogUG9pbnQgdG8gZ2VuZXJpY19sb2FkIGluc3RlYWQuCisJKiByZW1vdGUtaG1zLmMgKGhtc19vcHMpOiBQb2ludCB0byBnZW5lcmljX2xvYWQuCisJKiByZW1vdGUtc2ltLmMgKHNpbV9jYWxsYmFja193cml0ZV9zdGRvdXQpOiBCZWNvbWVzCisJZ2Ric2ltX3dyaXRlX3N0ZG91dC4KKwkoZ2Ric2ltX2xvYWQpOiBDYWxsIGdlbmVyaWNfbG9hZC4KKwkqIHJlbW90ZS11dGlscy5jIChncl9sb2FkX2ltYWdlKTogRGVsZXRlLgorCSogc2VyLXVuaXguYyAodGVybWluYWwuaCk6IEluY2x1ZGUgaW5zdGVhZCBvZiBoYXZpZworCW93biAjaWYgdHJlZS4KKwkoaGFyZHdpcmVfZmx1c2hfaW5wdXQpOiBSZXNldCBpbnB1dCBidWZmZXIgdG9vLgorCSogc291cmNlLmMgKG9wZW5wKTogSWYgV0lOMzIgdGhlbiBvcGVuIGZpbGUgaW4gYmluYXJ5IG1vZGUuCisJKiB0ZXJtaW5hbC5oOiBDb25maWd1cmUgSU8gbWVjaGFuaXNtIHVzaW5nIGF1dG9jb25mIGRlZmluZXMgaWYKKyAJYXZhaWxhYmxlIGFuZCBub3Qgb3ZlcnJpZGVuLgorCSogdXRpbHMuYyAocXVpdCwgcG9sbHF1aXQsIG5vdGljZV9xdWl0KTogV0lOMzIgY2hlY2sgYmVjb21lcworIAlXSU5HREIgY2hlY2suCisKKwkqIGNvbmZpZy9hcm0vYXJtLm10IChUREVQRklMRVMpOiBBZGQgcmVtb3RlLXJkcC5vLgorCSogY29uZmlnL2FybS90bS1hcm0uaCAoVEFSR0VUX0JZVEVfT1JERVIpOiBiZWNvbWVzCisJVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRS4KKwkoQUREUl9CSVRTX1JFTU9WRSk6IE5ldy4KKwkoT1JJR0lOQUxfUkVHSVNURVJfTkFNRVMsIEFERElUSU9OQUxfUkVHSVNURVJfTkFNRVMpOiBOZXcuCisJKElOU1RfeHgpOiBOZXcuCisJKEZSQU1FX0ZJTkRfU0FWRURfUkVHUyk6IFBhc3MgdGhlIHJpZ2h0IGFyZ3VtZW50LgorCShhcm1fZ2V0X25leHRfcGMpOiBEZWNsYXJlLgorCitXZWQgU2VwIDI3IDEwOjE0OjM2IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiB2YWxvcHMuYyAoc2VhcmNoX3N0cnVjdF9maWVsZCk6ICBBbHNvIGFsbG93ICJlbHNlIiBhcyBhIHZhcmlhbnQKKwluYW1lLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdHJ1Y3RfdHVwbGUpOiAgTmV3IGZ1bmN0aW9uLiAgVXNlZCB0byBldmFsdWF0ZQorCXN0cnVjdHVyZSB0dXBsZXMuICBOb3cgYWxzbyBoYW5kbGVzIENoaWxsIHZhcmlhbnQgcmVjb3Jkcy4KKwkoZ2V0X2xhYmVsKTogIE5ldyBmdW5jdGlvbiwgdXNlZCBieSBldmFsdWF0ZV9zdHJ1Y3RfdHVwbGUuCisJKGV2YWx1YXRlX3N1YmV4cF9zdGFuZGFyZCBjYXNlIE9QX0FSUkFZKTogIFVzZSBldmFsdWF0ZV9zdHJ1Y3RfdHVwbGUuCisJKGV2YWx1YXRlX2xhYmVsZWRfZmllbGRfaW5pdCk6ICBSZW1vdmVkLgorCisJKiB2YWxvcHMuYyAoc2VhcmNoX3N0cnVjdF9maWVsZCk6ICBHZW5lcmFsaXplIHRvIHdvcmsgd2l0aCBDaGlsbAorCXZhcmlhbnQgcmVjb3Jkcy4KKworU2F0IFNlcCAyMyAwMToyMjoyMyAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIG1kZWJ1Z3JlYWQuYyAocGFyc2VfcGFydGlhbF9zeW1ib2xzKTogIFJlc2V0IGluY2x1ZGVzX3VzZWQKKwlhbmQgZGVwZW5kZW5jaWVzX3VzZWQgYWZ0ZXIgZmluaXNoaW5nIHRoZSBwYXJ0aWFsIHN5bWJvbCB0YWJsZS4KKworCSogcnM2MDAwLXRkZXAuYyAocHVzaF9kdW1teV9mcmFtZSk6ICBIYW5kbGUgbHJfb2Zmc2V0IG9mIHplcm8KKwljb3JyZWN0bHkuCisKKwkqIHJzNjAwMC1uYXQuYyAoeGNvZmZfcmVsb2NhdGVfY29yZSk6ICBEb24ndCByZWxvY2F0ZSBkYXRhCisJYWRkcmVzc2VzIGZvciB0aGUgbWFpbiBvYmpmaWxlIGlmIERPTlRfUkVMT0NBVEVfU1lNRklMRV9PQkpGSUxFCisJaXMgZGVmaW5lZC4KKwkqIHhjb2ZmcmVhZC5jOiAgZ2NjIC1XYWxsIGxpbnQuIFJlbW92ZSB0cmFjZWJhY2sgdGFibGUgcmVhZGluZworCWNvZGUuIFRoZSBleGlzdGluZyBjb2RlIHRyaWVkIHRvIGFkZCBwYXJhbWV0ZXIgaW5mb3JtYXRpb24gZm9yCisJZnVuY3Rpb25zIGNvbXBpbGVkIHdpdGhvdXQgLWcsIHdoaWNoIGNhbm5vdCBiZSBkb25lIHByb3Blcmx5CisJZm9yIG9wdGltaXplZCBjb2RlIGFuZCBwcm9kdWNlZCBtaXNsZWFkaW5nIHBhcmFtZXRlciBkaXNwbGF5cy4KKwkoZWZfY29tcGxhaW50LCBlYl9jb21wbGFpbnQpOiAgTWFrZSBhIGxvY2FsIHN0YXRpYyBjb3B5IHRvIGF2b2lkCisJZGVwZW5kZW5jeSBvbiBjb2ZmcmVhZC5jLgorCShyZWFkX3hjb2ZmX3N5bXRhYiwgcHJvY2Vzc194Y29mZl9zeW1ib2wsIHNjYW5feGNvZmZfc3ltdGFiKToKKwlFbnRlciBDX0VYVC9DX0hJREVYVCBzeW1ib2xzIGludG8gdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlIG9ubHkuCisJKHJlYWRfeGNvZmZfc3ltdGFiKTogIElnbm9yZSBDX1NUQVQgc2VjdGlvbiBhdXhpbGlhcnkgZW50cnkKKwlzeW1ib2xzLiBDb21wbGFpbiBhYm91dCB1bm1hdGNoZWQgLmVmIGFuZCAuZWIgc3ltYm9scyBpbnN0ZWFkIG9mCisJc2VnZmF1bHRpbmcuCisJKHByb2Nlc3NfeGNvZmZfc3ltYm9sKTogIERldGVybWluZSB2YWx1ZSBvZiBDX0dTWU0gc3ltYm9scyB2aWEKKwl0aGUgZ2xvYmFsX3N5bV9jaGFpbiBtZWNoYW5pc20gaW4gc3RhYnNyZWFkLmMuCisJKHhjb2ZmX25ld19pbml0KTogIENhbGwgc3RhYnNyZWFkX25ld19pbml0IGFuZCBidWlsZHN5bV9uZXdfaW5pdC4KKwkoaW5pdF9zdHJpbmdfdGFiKTogIEluaXRpYWxpemUgbGVuZ3RoIGZpZWxkIGJ5dGVzIGluIHRoZSBzdHJ0YmwuCisJKHNjYW5feGNvZmZfc3ltdGFiKTogIFNraXAgc3ltYm9scyB0aGF0IHN0YXJ0IHdpdGggYCQnIG9yIGAuJCcuCisJU2V0IGZpcnN0X2Z1bl9saW5lX29mZnNldCBmb3Igc3ltYm9scyB3aXRoIHR3byBhdXhlbnRzIG9ubHkuCisKK1dlZCBTZXAgMjAgMjE6MDY6MzUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIG9wNTAtcm9tLmMgKG9wNTBuX2NtZHMpOiBTZW5kICIuXHIiIGFmdGVyIHRoZSBpbnRlcnJ1cHQKKwljaGFyYWN0ZXIuCisKK1dlZCBTZXAgMjAgMTM6MTI6NTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQsIHN5bm9ueW0gZm9yCisJcmVhbGNsZWFuLiAgQWRkIEdOVSBzdGFuZGFyZCBtYWludGFpbmVyLWNsZWFuIGVjaG9zLgorCSogZ2Ric2VydmVyL01ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldCwgc3lub255bQorCWZvciByZWFsY2xlYW4uCisJKiBubG0vTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBMaWtld2lzZS4KKworV2VkIFNlcCAyMCAwODoxNjowMyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBkZWZzLmggKHhtYWxsb2MsIHhyZWFsbG9jKTogRGVsZXRlLCB0aGV5J3JlIGRlY2xhcmVkIGluIGxpYmliZXJ0eS5oLgorCShHRVRFTlZfUFJPVklERUQsIEZDTE9TRV9QUk9WSURFRCk6IE5ldy4KKwkqIGRvYy9nZGJpbnQudGV4aW5mbyAoR0VURU5WX1BST1ZJREVELCBGQ0xPU0VfUFJPVklERUQpOiBEb2N1bWVudC4KKwkqIHJlbW90ZS1zaW0uW2NoXSAoc2ltX2NhbGxiYWNrX3dyaXRlX3N0ZG91dCk6IE5ldy4KKworVHVlIFNlcCAxOSAxNToyODo1OCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogZ2RidHlwZXMuYyAoY3JlYXRlX3NldF90eXBlKTogIFNldCBUWVBFX0xFTkdUSCBpbiBieXRlcywgbm90IGJpdHMuCisJKiB2YWxvcHMuYyAodmFsdWVfYml0c3RyaW5nKTogIFRZUEVfTEVOR1RIIGlzIGJ5dGVzLCBub3QgYml0cy4KKworCSogZ2RidHlwZXMuYyAoZm9yY2VfdG9fcmFuZ2VfdHlwZSk6ICBDYWxjdWxhdGUgdXBwZXIgbGltaXQgb2YKKwlUWVBFX0NPREVfQ0hBUiBkZXBlbmRpbmcgb24gVFlQRV9MRU5HVEggKGluc3RlYWQgb2YganVzdCB1c2luZyAyNTUpLgorCitNb24gU2VwIDE4IDAxOjQzOjQyIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb21zb2xpYi5jIChhdXRvX3NvbGliX2FkZF9hdF9zdGFydHVwKTogRGVsZXRlIGRlZmluaXRpb24uICBObworCWxvbmdlciBuZWVkZWQuCisKK1NhdCBTZXAgMTYgMTM6MjM6MzYgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb25maWcvbWlwcy90bS1taXBzLmggKFVOVVNFRF9SRUdOVU0pOiAgRGVmaW5lLgorCSogbWlwc3Y0LW5hdC5jIChzdXBwbHlfZ3JlZ3NldCk6ICBGaWxsIFVOVVNFRF9SRUdOVU0gcmVnaXN0ZXIKKwl3aXRoIHplcm8uCisKK1RodSBTZXAgMTQgMTc6MzU6MjQgMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXNpbS5jIChnZGJzaW1fY3JlYXRlX2luZmVyaW9yKTogIEJhY2sgb3V0IGNoYW5nZSB0aGF0CisJYnJva2UgYWxsIHNpbXVsYXRvciBjb25maWd1cmF0aW9ucyBleGNlcHQgdGhlIHJzNjAwMC4KKworVGh1IFNlcCAxNCAxNDo0NDo1OSAxOTk1ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KKworCSogbW9uaXRvci5jIChtb25pdG9yX2V4cGVjdCk6IERpc2NhcmQgTlVMTCBjaGFyYWN0ZXJzLgorCitUaHUgU2VwIDE0IDE0OjEyOjMwIDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+CisKKwkqIGluZmNtZC5jOiBBZGQgZXh0ZXJuIGRlY2xhcmF0aW9uIGZvciBhdXRvX3NvbGliX2FkZF9hdF9zdGFydHVwLgorCitXZWQgU2VwIDEzIDEzOjMzOjU4IDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+CisKKwkqIHN5bWZpbGUuYzogTW92ZSBnbG9iYWwgdmFyaWFibGUgYXV0b19zb2xpYl9hZGRfYXRfc3RhcnR1cCBmcm9tCisJc29saWIuYyB0byBzeW1maWxlLmMuCisJKiBzb2xpYi5jOiBkaXR0by4KKwkqIHN5bWZpbGUuaDogQWRkIGV4dGVybiBkZWNsYXJhdGlvbiBvZiB0aGUgYWJvdmUgbWVudGlvbmVkIHZhcmlhYmxlLgorCSogaW5mY21kLmM6IFRha2Ugb3V0IGV4dGVybiBkZWNsYXJhdGlvbiwgc2luY2UgaXQncyBpbiBzeW1maWxlLmguCisKK1RodSBTZXAgMTQgMTI6Mzk6MzUgMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogY29mZnJlYWQuYyAoY29mZl9zeW10YWJfcmVhZCk6ICBDb21wbGFpbiBhYm91dCB1bm1hdGNoZWQgLmVmIGFuZAorCS5lYiBzeW1ib2xzIGluc3RlYWQgb2Ygc2VnZmF1bHRpbmcuCisKK1dlZCBTZXAgMTMgMTM6MzM6NTggMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KKworCSogc3RhYnNyZWFkLmMgKHJlYWRfb25lX3N0cnVjdF9maWVsZCk6IFVzZSBzdWJmaWxlIGxhbmd1YWdlIGluc3RlYWQgb2YKKwlnbG9iYWwgbGFuZ3VhZ2UuIEltcHJvdmUgZWZmaWNpZW5jeS4KKworV2VkIFNlcCAxMyAwODo0NTowMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BmYXN0LmNzLnV0YWguZWR1KQorCisJKiBzb21zb2xpYi5jIChhdXRvX3NvbGliX2FkZF9hdF9zdGFydHVwKTogRGVmaW5lIG5ldyBnbG9iYWwgdmFyaWFibGUuCisJKHNvbV9zb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vayk6IERvbid0IGFkZCBsaWJyYXJpZXMgaWYKKwlhdXRvX3NvbGliX2FkZF9hdF9zdGFydHVwIGlzIHplcm8uCisJKF9pbml0aWFsaXplX3NvbV9zb2xpYik6IEFkZCBjb21tYW5kIHRvIHRvZ2dsZQorCWF1dG9fc29saWJfYWRkX2F0X3N0YXJ0dXAuCisKK1R1ZSBTZXAgMTIgMTk6Mzc6MjQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIG1vbml0b3IuYyAobW9uaXRvcl9tYWtlX3NyZWMpOiBGaXggdGhpbmtvcyBpbiBjb21wdXRhdGlvbgorCW9mIGFkZHJfc2l6ZS4KKworVHVlIFNlcCAxMiAxNTo0NjoxOCAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAbWV4aWNhbi5jeWdudXMuY29tPgorCisJKiBzdGFic3JlYWQuYyAocmVhZF9vbmVfc3RydWN0X2ZpZWxkKTogQWRkIGEgcGF0Y2ggdG8gaGFuZGxlIGNmcm9udAorCWdlbmVyYXRlZCBzdGFicyB0aGF0IGVhY2ggZmllbGQgaXMgaW4gZnVsbCBtYW5nbGVkIG5hbWUuCisKKwkqIHN0YWJzcmVhZC5jOiBUbyBpbmNsdWRlIGxhbmd1YWdlLmggYW5kIGV4cHJlc3Npb24uaCBmb3IgdGhlIHJlYXNvbgorCWFib3ZlLgorCQorCSogaW5mY21kLmMgKGF0dGFjaF9jb21tYW5kKTogQWRkIHNvbGlicyBvbmx5IHdoZW4KKwlhdXRvX3NvbGliX2FkZF9hdF9zdGFydHVwIGlzIHNldC4KKworTW9uIFNlcCAxMSAxNzoyMjozNSAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogTkVXUzogIEFkZCBpbmZvcm1hdGlvbiBhYm91dCByZW1vdGUgdGFyZ2V0IGNhY2hpbmcuCisKK1N1biBTZXAgMTAgMTU6MzY6MjEgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGRlZnMuaDogT25seSBpbmNsdWRlIG1tYWxsb2MuaCBpZiBOT19NTUFMTE9DIGlzIG5vdAorCWRlZmluZWQuCisKK1N1biBTZXAgMTAgMTA6MjQ6NDggMTk5NSAgTWljaGFlbCBUaWVtYW5uICA8dGllbWFubkBheG9uLmN5Z251cy5jb20+CisKKwkqIHRtLXBwYy1lYWJpLmggKFBDX0lOX0NBTExfRFVNTVkpOiBSZWRlZmluZSB0aGlzIHRvIHdvcmsgd2l0aCB0aGUKKwlzaW11bGF0b3IuICBGSVhNRS4KKworCSogcnM2MDAwLXRkZXAuYyAocHVzaF9kdW1teV9mcmFtZSk6IENhbGN1bGF0ZSB0aGUgY29ycmVjdCBsaW5rCisJcmVnaXN0ZXIgb2Zmc2V0IGZyb20gdGhlIGN1cnJlbnQgZnJhbWUgKGRvbid0IGFzc3VtZSBpdCBpcyBhbHdheXMgOCkuCisJKHB1c2hfZHVtbXlfZnJhbWUpOiBBZGQgY29tbWVudCBhYm91dCBoYXZpbmcgb25seSA0MDk2IGJ5dGVzIG9mCisJc3RhY2sgc3BhY2UgaW4gdGhlIHNpbXVsYXRvciAoYnkgZGVmYXVsdCkuCisKKwkqIHJlbW90ZS1zaW0uYyAoZ2Ric2ltX2NyZWF0ZV9pbmZlcmlvcik6IENhbGwKKwlgYWRkX3RleHRfdG9fbG9hZGluZm8nIHNvIHRoYXQgZ2RiIGNhbiBmaW5kIFRPQyBlbnRyaWVzIHdoZW4KKwljYWxsaW5nIGZ1bmN0aW9ucyBpbiB0aGUgaW5mZXJpb3IuCisKK1N1biBTZXAgMTAgMDk6MDA6MjggMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBzcGFyYy10ZGVwLmMgKGZpbGxfZnByZWdzZXQpOiAgRml4IGluY29ycmVjdCBGUF9NQVhfUkVHTlVNCisJc3Vic3RpdHV0aW9uLgorCShzdXBwbHlfZnByZWdzZXQpOiAgVXNlIEZQX01BWF9SRUdOVU0uCisKK1NhdCBTZXAgIDkgMDg6MjE6NTIgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBzdGFic3JlYWQuYyAocmVhZF9lbnVtX3R5cGUpOiAgRXhpdCBsb29wIGZvciBwdXR0aW5nIHBlbmRpbmcKKwllbnVtIHN5bWJvbHMgaW50byB0aGUgZW51bSB0eXBlIGNvcnJlY3RseSBpZiB3ZSBoYWQgbm8gcGVuZGluZworCXN5bWJvbHMgb24gZW50cnkgdG8gcmVhZF9lbnVtX3R5cGUuCisKK0ZyaSBTZXAgIDggMTI6NTc6NDEgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KKworCSogaW5mZXJpb3IuaDogQWRkIGV4dGVybiBkZWNsYXJhdGlvbiBvZiBpbmZlcmlvcl9lbnZpcm9uLgorCSogc29saWIuYyAoc29saWJfbWFwX3NlY3Rpb25zKTogVG8gZ2V0IGluZmVyaW9yJ3MgZW52IGluc3RlYWQgb2YKKwlnZGIncyBmb3IgTERfTElCUkFSWV9QQVRILCBzYW1lIGZvciBQQVRILgorCQorCSogc29saWIuYyAoc29saWJfbWFwX3NlY3Rpb25zKTogQ29weSBmdWxsIHBhdGggbmFtZSBpbnRvIHNvX2xpc3QKKwlzdHJ1Y3R1cmUgc28gdGhhdCBzeW1ib2xfZmlsZV9hZGQgY2FuIGZpbmQgaXQuCisKK1R1ZSBTZXAgIDUgMTc6NDc6NTMgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3NwYXJjL3RtLXNwNjQuaCAoUkVHSVNURVJfUkFXX1NJWkUpOiBMb3dlciAzMiBmcCByZWdzCisJaGF2ZSBzaXplIDQuCisJKFJFR0lTVEVSX1ZJUlRVQUxfU0laRSk6IExpa2V3aXNlLgorCShSRUdJU1RFUl9WSVJUVUFMX1RZUEUpOiBMb3dlciAzMiBmcCByZWdzIGhhdmUgdHlwZSBmbG9hdC4KKwlVcHBlciAzMiBmcCByZWdzIGhhdmUgdHlwZSBkb3VibGUuCisJKiBzcGFyYy10ZGVwLmMgKE5VTV9TUEFSQ19GUFJFR1MpOiBSZXBsYWNlIHdpdGgKKwkoRlBfUkVHSVNURVJfQllURVMpOiB0aGlzLCBhbmQgdXBkYXRlIGFsbCB1c2VzLgorCShGUF9NQVhfUkVHTlVNKTogRGVmaW5lIGlmIG5vdCBhbHJlYWR5LgorCShnZXRfc2F2ZWRfcmVnaXN0ZXIpOiBIYW5kbGUgbmV3IHNwYXJjNjQgZnAgcmVncy4KKwkoc3BhcmNfZnJhbWVfZmluZF9zYXZlZF9yZWdzKTogTGlrZXdpc2UuCisJKHNwYXJjX3ByaW50X3JlZ2lzdGVyX2hvb2spOiBPbmx5IHByaW50IGZwIHJlZ3MgPCAzMiBhcyBkb3VibGVzLgorCUFkZCBjb2RlIHRvIGhhbmRsZSBsb25nIGRvdWJsZXMgd2hlbiBnZGIgZG9lcy4KKwkoX2luaXRpYWxpemVfc3BhcmNfdGRlcCk6IFVzZSBwcmludF9pbnNuX3NwYXJjNjQgaWYgc3BhcmM2NC4KKworU2F0IFNlcCAgMiAwNjo0MToyNiAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNvbmZpZ3VyZS5pbjogIEV4cGxpY2l0bHkgYGV4aXQgMCcgZm9yIGJyb2tlbiBzaGVsbHMuCisJKiBjb25maWd1cmU6ICBSZWJ1aWx0LgorCisJKiBzeW10YWIuYyAobGlzdF9zeW1ib2xzKTogIEFkZCBtaXNzaW5nIGJsYW5rIGFmdGVyCisJYDxmdW5jdGlvbiwgbm8gZGVidWcgaW5mbz4nIG91dHB1dC4KKworCSogdmFsb3BzLmMgKHZhbHVlX2Fzc2lnbik6ICBIYW5kbGUgdHJ1bmNhdGlvbiB3aGVuIGFzc2lnbmluZworCXRvIGJpdGZpZWxkcy4gVXNlIHZhbHVlX2NvcHkgdG8gY29uc3RydWN0IHRoZSByZXR1cm4gdmFsdWUKKwlmcm9tIHRvdmFsLgorCSogdmFsdWVzLmMgKHZhbHVlX2NvcHkpOiAgQ29weSBWQUxVRV9GUkFNRSBhbmQgVkFMVUVfT1BUSU1JWkVEX09VVC4KKworRnJpIFNlcCAgMSAwODoyNTo1MCAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBiZWF1dHkuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlIChtaXBzNjQqdnI0MzAwKi0qLWVsZik6IFN1cHBvcnQgYWRkZWQuCisJKiByZW1vdGUtbWlwcy5jIChtaXBzX3JlYWRjaGFyKTogQ2hhbmdlIHRvIGFsbG93IGJ1aWxkLXRpbWUgcHJvbXB0CisgCXN0cmluZy4KKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaDogQWRkZWQgVEFSR0VUX01PTklUT1JfUFJPTVBULgorCSogY29uZmlnL21pcHMve3ZyNDMwMC5tdCwgdnI0MzAwZWwubXQsIHRtLXZyNDMwMC5oLAorIAl0bS12cjQzMDBlbC5ofTogQWRkZWQuCisKK1RodSBBdWcgMzEgMTI6NDg6MDQgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBjb25maWcvc2gvc2gubXQgKFNJTSk6IEFkZCAtbG0uCisKK1dlZCBBdWcgMzAgMTg6MTA6NTcgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KKworCSogcm1vdGUtbmluZHkuYyAobm9uX2RsZSwgbmlkeV9yZXN1bWUsIG5pbmR5X3dhaXQpOiBDaGFuZ2VzIHRvIAorCWNvbmZvcm0gdG8gR05VIGNvZGluZyBzdGFuZGFyZHMuCisKKwkqIHNvbGliLmMgKG1hdGNoX21haW4pOiBNb2RpZnkgdG8gZm9sbG93IEdOVSBjb2RpbmcgY29udmVudGlvbnMuCisKK01vbiBBdWcgMjggMTc6MDc6MjYgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQGxpc2EuY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLmMgKHJlbW90ZV93YWl0KTogUmV2ZXJ0IDE5IEp1bHkgbXkgY2hhbmdlIHdoaWNoIHNob3VsZCBiZQorCWN1c3RvbWVyIHNwZWNpZmljLgorCitTYXQgQXVnIDI2IDAwOjI2OjExIDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogbWRlYnVncmVhZC5jIChwYXJzZV9zeW1ib2wpOiAgSGFuZGxlIHNoLnZhbHVlIG9mIHplcm8gZm9yIGVudW1zLgorCURldGVybWluZSBzaWduZWRuZXNzIG9mIGVudW0gdHlwZSBmcm9tIGVudW1lcmF0b3JzLgorCShwYXJzZV90eXBlKTogIEhhbmRsZSBidEluZGlyZWN0IHR5cGVzLCBoYW5kbGUgZkJpdGZpZWxkIGZvcgorCXNvbWUgbm9uLW1lbWJlciB0eXBlcy4KKwkodXBncmFkZV90eXBlKTogIFVzZSBUWVBFX0ZMQUdfVEFSR0VUX1NUVUIgZm9yIGFycmF5cyB3aXRoCisJdW5rbm93biBsZW5ndGguCisJKGNyb3NzX3JlZik6ICBIYW5kbGUgc3RJbmRpcmVjdCBmb3J3YXJkIHJlZmVyZW5jZSB0byBidFR5cGVkZWYuCisKKwkqIHN0YWJzcmVhZC5jIChyZWFkX2VudW1fdHlwZSk6ICBEZXRlcm1pbmUgc2lnbmVkbmVzcyBvZiBlbnVtCisJdHlwZSBmcm9tIGVudW1lcmF0b3JzLgorCisJKiB0b3AuYyAoZXhlY3V0ZV9jb21tYW5kKTogIFJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20KKwljb21tYW5kIGFyZ3VtZW50cywgZXhjZXB0IGZvciBgc2V0JyBhbmQgYGNvbXBsZXRlJyBjb21tYW5kcy4KKwkodmFsaWRhdGVfY29tbmFtZSk6ICBBbGxvdyB1bmRlcnNjb3JlcyBpbiB1c2VyIGRlZmluZWQgY29tbWFuZAorCW5hbWVzLgorCisJKiB2YWx1ZXMuYyAobW9kaWZ5X2ZpZWxkKTogIENoYW5nZSBgVmFsdWUgZG9lcyBub3QgZml0IGluICVkIGJpdHMnCisJZXJyb3IgdG8gYSB3YXJuaW5nLiBFeGNsdWRlIHNpZ24gZXh0ZW5zaW9uIGJpdHMgb2YgbmVnYXRpdmUgZmllbGQKKwl2YWx1ZXMgZnJvbSBmaXQgY2hlY2suCisKK0ZyaSBBdWcgMjUgMTE6MzE6MjkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHBvd2VycGMqLSotZWFiaXNpbSopOiBPbmx5IGxpbmsgaW4gdGhlIHNpbXVsYXRvcgorCWlmIHRoZSB0YXJnZXQgaXMgcG93ZXJwY3ssbGV9LSotZWFiaXNpbSosIHNpbmNlIHRoZSBzaW11bGF0b3IKKwluZWVkcyBHQ0MgdG8gYnVpbGQuCisJKiBjb25maWcvcG93ZXJwYy9wcGN7LGxlfS1zaW0ubXQ6IENsb25lZCBmcm9tIHBwY3ssbGV9LWVhYmkubXQuCisJKiBjb25maWcvcG93ZXJwYy9wcGN7LGxlfS1lYWJpLm10OiBSZW1vdmUgc2ltdWxhdG9yIHN1cHBvcnQuCisJKiBjb25maWcvcG93ZXJwYy90bS1wcGN7LGxlfS1zaW0ubXQ6IEluY2x1ZGUgdG0tcHBjeyxsZX0tc2ltLmguCisKK1dlZCBBdWcgMjMgMTY6NTU6MzUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvcG93ZXJwYy9wcGN7LGxlfS1lYWJpLm10IChTSU1fT0JKUywgU0lNKTogTGluayBpbiB0aGUKKwlQb3dlclBDIHNpbXVsYXRvci4KKworVHVlIEF1ZyAyMiAwMjowMDo0NyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogdG0taHBwYS5oIChFWFRSQUNUX1JFVFVSTl9WQUxVRSk6IEZpeCBmb3IgRlAgdmFsdWVzLgorCisJKiB0bS1ocHBhLmggKFNUT1JFX1JFVFVSTl9WQUxVRSk6IEZpeCB0byB3b3JrIHdpdGggLW1zb2Z0LWZsb2F0CisJY2FsbGluZyBjb252ZW50aW9ucyB0b28uICBVc2UgdGhlIFRZUEUgb2YgdGhlIHJldHVybiB2YWx1ZSwgbm90CisJaXRzIGxlbmd0aCB0byBkZXRlcm1pbmUgaWYgaXQgc2hvdWxkIGFsc28gYmUgY29waWVkIGludG8gdGhlCisJZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLgorCisJKiB0bS1ocHBhLmggKFBST0xPR1VFX0ZJUlNUTElORV9PVkVSTEFQKTogRGVsZXRlLiAgQ2F1c2VzIG1vcmUKKwlwcm9ibGVtcyB0aGFuIGl0IGZpeGVzLgorCSogaHBwYS10ZGVwLmMgKHNraXBfcHJvbG9ndWUpOiBJZiB3ZSBleGl0IHRoZSBtYWluIGxvb3Agd2l0aG91dAorCWZpbmRpbmcgYWxsIHRoZSByZWdpc3RlciBzYXZlcywgcmV0cnkgYWdhaW4gd2l0aG91dCBsb29raW5nIGZvcgorCXRoZSByZWdpc3RlcnMgd2UgY291bGQgbm90IGZpbmQgdGhlIGZpcnN0IHRpbWUuCisKK01vbiBBdWcgMjEgMjM6Mzk6NTYgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGEtdGRlcC5jIChmcmFtZV9jaGFpbl92YWxpZCk6IEhhbmRsZSBzeXN0ZW1zIHdoZXJlICIkU1RBUlQkIgorCWNhbGxzICJtYWluIiBkaXJlY3RseS4KKwkoc2tpcF9wcm9sb2d1ZSk6IEFsd2F5cyBhc3N1bWUgYXJndW1lbnRzIHdlcmUgc2F2ZWQgaW50byB0aGUgc3RhY2sKKwlzaW5jZSBHQ0Mgd2lsbCBkbyBzbyB3aXRob3V0IHNldHRpbmcgdGhlIG1hZ2ljIEFyZ3NfU2F2ZWQgYml0IGluCisJdGhlIHVud2luZCBkZXNjcmlwdG9yLgorCitNb24gQXVnIDIxIDExOjQ5OjE3IDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS11ZGkuYyAodWRpX3dhaXQpOiBNYXNrIG9mZiBoaWdoIGJpdHMgb2Ygc3RvcCByZWFzb24uCisJKiByZW1vdGUtdWRpLmMgKGZldGNoX3JlZ2lzdGVyKTogRm9yIHVuZmV0Y2hhYmxlIHJlZ3MsIHByZXRlbmQgaXQncworCWRvbmUuIEZpeCBhIGJ1Zy4KKworTW9uIEF1ZyAyMSAwMDo0NToxNyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBSZW1vdmUgImJyb2tlbnNlZCIgaGFjaywgdW5uZWNlc3Nhcnkgbm93CisJdGhhdCB3ZSdyZSB1c2luZyBhdXRvY29uZi4KKwkodW5pbnN0YWxsKTogTGlrZXdpc2UuCisKKworU2F0IEF1ZyAxOSAwMToxOTozNCAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYnR5cGVzLmMgKHJlY3Vyc2l2ZV9kdW1wX3R5cGUpOiAgQWRkIGRvbnRfcHJpbnRfdHlwZV9vYnN0YWNrCisJdG8gaW5oaWJpdCBpbmZpbml0ZSByZWN1cnNpb24gd2hlbiBwcmludGluZyBhZ2dyZWdhdGUgdHlwZXMuCisKK0ZyaSBBdWcgMTggMTc6NDg6NTUgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogZGNhY2hlLmMgKGRjYWNoZV93cml0ZV9saW5lKTogV3JpdGUgZGlydHkgbGluZXMgcmlnaHQuCisKK0ZyaSBBdWcgMTggMDY6MjY6NTYgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBzcGFyYy10ZGVwLmMgKGlzYnJhbmNoKTogIEZpeCB0eXBvIHdoaWNoIGNhdXNlZCB3cm9uZworCXRhcmdldCBhZGRyZXNzZXMgZm9yIGFubnVsbGVkIGJyYW5jaGVzLgorCitXZWQgQXVnIDE2IDIxOjU0OjM5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvcGEvdG0taHBwYS5oIChQUk9MT0dVRV9GSVJTVExJTkVfT1ZFUkxBUCk6IERlZmluZS4KKworVHVlIEF1ZyAxNSAwNzo1MToyMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiByZW1vdGUuYyAocmVtb3RlX3dyaXRlX2J5dGVzKTogQ2hvcCB1cCBsYXJnZSB0cmFuc2ZlcnMuCisKK01vbiBBdWcgMTQgMTc6NTY6MzYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBnY2MucGF0Y2g6IFJlbW92ZSwgcmVsZXZhbnQgb25seSB0byBsb25nLWFnbyB2ZXJzaW9ucyBvZiBHQ0MuCisKK01vbiBBdWcgMTQgMTM6NDM6MDEgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3NwYXJjL3RtLXNwYXJjbGl0ZS5oOiBEZWZpbmUgRlJBTUVfQ0hBSU5fVkFMSURfQUxURVJOQVRFLgorCSogYmxvY2tmcmFtZS5jIChpbnNpZGVfbWFpbl9mdW5jKTogSWYgbWFpbiBmdW5jIGFkZHIgcmFuZ2Ugbm90IHNldCwKKwl0cnkgdG8gc2V0IGl0IG5vdy4KKworU2F0IEF1ZyAxMiAxNTozNDo1NCAxOTk1ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3Bvd2VycGMveG0tYWl4LmggKEZJVkVfQVJHX1BUUkFDRSk6IERlZmluZS4KKwkqIGNvbmZpZy9yczYwMDAveG0tcnM2MDAwLmggKEZJVkVfQVJHX1BUUkFDRSk6IExpa2V3aXNlLgorCisJKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBhaXg0IHNwZWNpYWxseSBhcyBzb21lIGFzcGVjdHMKKwlvZiBhaXg0IG5lZWQgZGlmZmVyZW50IGhhbmRsaW5nIHRoYW4gYWl4My4KKwkqIGNvbmZpZ3VyZTogVXBkYXRlZC4KKwkqIGNvbmZpZy9wb3dlcnBjL3thaXg0Lm1oLGFpeDQubXQsdG0tcHBjLWFpeDQuaH06IE5ldyBmaWxlcworCXNwZWNpZmljIHRvIGFpeDQgc3VwcG9ydCBvbiB0aGUgcG93ZXIgcGMuCisJKiBjb25maWcvcG93ZXJwYy90bS1wcGMtYWl4LmggKERPTlRfUkVMT0NBVEVfU1lNRklMRV9PQkpGSUxFKTogRG8KKwlub3QgZGVmaW5lZC4gIFRoZSBhaXg0IHNwZWNpZmljIHRhcmdldCBmaWxlcyB3aWxsIGRvIHRoYXQuCisJKiBjb25maWcvcnM2MDAwL3thaXg0LG1oLGFpeDQsbXQsdG0tcnM2MDAwLWFpeDQuaH06IE5ldyBmaWxlcworCXNwZWNpZmljIHRvIGFpeDQgc3VwcG9ydCBvbiB0aGUgcnM2MDAwLgorCisJKiBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oIChDT05WRVJUX0ZST01fRlVOQ19QVFJfQUREUik6IERvbid0CisJZG8gdGhlIGNvbnZlcnNpb24gaWYgdGhlIHBvaW50ZXIgaXMgbm90IGEgbWFnaWMgYWl4IGZ1bmN0aW9uCisJcG9pbnRlci4KKwkqIHJzNjAwMC10ZGVwLmM6IEluY2x1ZGUgb2JqZmlsZXMuaCBhbmQgc3ltdGFiLmguCisgCShpc19tYWdpY19mdW5jdGlvbl9wb2ludGVyKTogTmV3IGZ1bmN0aW9uLgorCisJKiByczYwMDAtdGRlcC5jIChza2lwX3Byb2xvZ3VlKTogUmVmaW5lIGNoZWNrIGZvciBmcmFtZWxlc3MKKwlmdW5jdGlvbnMuICBIYW5kbGUgYiAuKzQgZW1pdHRlZCBieSBhaXg0IGNvbXBpbGVycy4gIE9ubHkKKwlhbGxvdyBvbmUgbG9hZCBvZiBhIG1pbmltYWwgdG9jIHBvaW50ZXIuICBIYW5kbGUgYWl4NCBjb21waWxlcidzCisJY29kZSBmb3IgYWxsb2NhLgorCisJKiByczYwMDAtdGRlcC5jIChmaW5kX3RvY19hZGRyZXNzKTogUmVwb3J0IGFuIGVycm9yIGlmIG5vIHRvYyB3YXMKKwlmb3VuZCByYXRoZXIgdGhhbiBwb3NzaWJseSBjb3JlIGR1bXBpbmcuCisKKwkqIHBhcnRpYWwtc3RhYi5oOiBIYW5kbGUgZXh0cmEgZmllbGQgZ2VuZXJhdGVkIGJ5IHRoZSBhaXg0IGNvbXBpbGVyCisJZm9yIGVudW1lcmF0aW9ucy4KKwkqIHN0YWJzcmVhZC5jIChyZWFkX2VudW1fdHlwZSk6IExpa2V3aXNlLgorCitTYXQgQXVnIDEyIDAzOjE4OjA0IDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogcnM2MDAwLXRkZXAuYyAoZXh0cmFjdF9yZXR1cm5fdmFsdWUpOiAgRml4IHJldHVybmluZyBvZiB2YWx1ZXMKKwl3aG9zZSBsZW5ndGggaXMgbGVzcyB0aGFuIHRoZSByZWdpc3RlciBzaXplIGZvciBiaWcgZW5kaWFuIHRhcmdldHMuCisKK0ZyaSBBdWcgMTEgMTM6MDQ6MzIgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KKworCSogc3ltdGFiLmMgKGxpc3Rfc3ltYm9scyk6IGlmIGJyZWFrIGNvbW1hbmQgc2V0IGJyZWFrcG9pbnQgb24KKwltYXRjaGVkIHN5bWJvbC4KKworV2VkIEF1ZyAgOSAxODo1OTowNSAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZGVmcy5oIChzdHJjaHIsIHN0cnJjaHIsIHN0cnN0ciwgc3RydG9rLCBzdHJlcnJvcik6IEVuY2xvc2UgaW4KKwkjaWZuZGVmcyB0byBwcm90ZWN0IGFnYWluc3QgcHJldmlvdXMgZGVmaW5pdGlvbnMgYXMgbWFjcm9zLgorCitXZWQgQXVnICA5IDE0OjUxOjM2IDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+CisKKwkqIHhjb2ZmcmVhZC5jICh4Y29mZl9zeW1maWxlX29mZnNldCk6IFJldmVydCBhbiB1bndhbnRlZCBjaGFuZ2UKKwl0aGF0IGdvdCBpbiBhY2NpZGVudGFsbHkgd2l0aCBBdWcgMSBjaGFuZ2UuCisKK1NhdCBBdWcgIDUgMDk6MDc6MjggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKyAKKyAJKiByZW1vdGUtaG1zLmMgKGhtc19jbWRzKTogR2V0IHJlZyB0ZXJtIHJpZ2h0LgorCSogbW9uaXRvci5jIChtb25pdG9yX2ZldGNoX3JlZ2lzdGVyKTogIElmIHdlIHNlZQorCWEgbm9uLWhleCBkaWdpdCwganVzdCBzdG9wIHJlYWRpbmcuICAKKyAJKiByZW1vdGUuYyAocmVtb3RlX3dhaXQpOiBDaGFuZ2Ugd2F5ICRPIGlzIGhhbmRsZWQuCisgCitXZWQgQXVnICA5IDExOjQyOjM2IDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgorCisJICogY29uZmlndXJlLmluIChwb3dlcnBjLSotYWl4Kik6IFJlY29nbml6ZSBhcyBhIG5ldyBnZGIgaG9zdAorCSBhbmQgdGFyZ2V0LgorCSAocG93ZXJwYy0qLWVhYmkqKTogRG9uJ3Qgc2V0IGNvbmZpZ2RpcnMuCisJIChwb3dlcnBjbGUtKi1lYWJpKik6IExpa2V3aXNlLgorCSAqIGNvbmZpZ3VyZTogVXBkYXRlZC4KKwkgKiByczYwMDAtbmF0LmMgKHZtYXBfbGRpbmZvKTogRG9uJ3QgcmVsb2NhdGUgZGF0YSBhZGRyZXNzZXMKKwkgZm9yIHRoZSBtYWluIG9iamZpbGUgaWYgRE9OVF9SRUxPQ0FURV9TWU1GSUxFX09CSkZJTEUgaXMKKwkgZGVmaW5lZC4KKwkgKiBjb25maWcvcG93ZXJwYy97YWl4Lm1oLGFpeC5taH06IEhvc3QgYW5kIHRhcmdldCBtYWtlZmlsZSBmcmFnbWVudHMKKwkgZm9yIHBvd2VycGMgcnVubmluZyBhaXg0LgorCSAqIGNvbmZpZy9wb3dlcnBjL3tubS1haXguaCwgdG0tcHBjLWFpeC5oLCB4bS1haXguaH06IE5hdGl2ZSwgdGFyZ2V0CisJIGFuZCBob3N0IGluY2x1ZGUgZmlsZXMgZm9yIHBvd2VycGMgcnVubmluZyBhaXg0LgorCitXZWQgQXVnICA5IDA4OjExOjQ1IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BjeWdudXMuY29tPgorCisJKiB0b3AuYyAodGFyZ2V0X291dHB1dF9ob29rKTogUmVhbGx5IG1ha2UgaXQgbWF0Y2ggZGVmcy5oIChjaGFyICoKKwlpcyBub3QgdGhlIHNhbWUgYXMgdW5zaWduZWQgY2hhciAqKS4KKworVHVlIEF1ZyAgOCAxNToxMzowNSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChDWFhfRk9SX1RBUkdFVCk6IERvbid0IHVzZSAke3Jvb3RtZX0vLi4vZ2NjL3hnY2MKKwl1bmxlc3MgaXQgaXMgcHJlc2VudC4KKworVHVlIEF1ZyAgOCAxMDo1MDoxNSAxOTk1ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KKworCSogdG9wLmMgKHRhcmdldF9vdXRwdXRfaG9vayk6IE1ha2UgZGVjbGFyYXRpb24gbWF0Y2ggdGhlIG9uZQorCWluIGRlZnMuaC4KKworCSogc3ltZmlsZS5jIChhZGRfcHN5bWJvbF90b19saXN0KTogSW5pdGlhbGl6ZSBTWU1CT0xfU0VDVElPTi4KKwkoYWRkX3BzeW1ib2xfYWRkcl90b19saXN0KTogTGlrZXdpc2UuCisJKiBzeW1maWxlLmggKEFERF9QU1lNQk9MX1ZUX1RPX0xJU1QpOiBMaWtld2lzZS4KKworTW9uIEF1ZyAgNyAxNTozNDoyOSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiB0b3AuYyAodGFyZ2V0X291dHB1dF9ob29rKTogTmV3IGRlZmluaXRpb24uCisJKiBzdGFjay5jIChnZGJfc3RyaW5nLmgpOiBJbmNsdWRlIGFmdGVyIGRlZnMuaAorCSogZGVmcy5oICh0YXJnZXRfb3V0cHV0X2hvb2spOiBOZXcgZGVjbGFyYXRpb24uCisJKiBzb3VyY2UuYyAobW9kX3BhdGgpOiBGaXggV2luMzIgXCBoYW5kbGluZy4KKworU3VuIEF1ZyAgNiAyMjoxNDoyNSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHBwYS10ZGVwLmMgKGZyYW1lX3NhdmVkX3BjKTogRG9uJ3QgdHJ5IHRvIGRpZyBhIHJldHVybiBwb2ludGVyCisJb3V0IG9mIGEgbG9uZyBicmFuY2ggc3R1Yi4KKworRnJpIEF1ZyAgNCAxMzozNzozMSAxOTk1ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KKworCSogeGNvZmZyZWFkLmMgKHByb2Nlc3NfbGluZW5vcyk6IEZpeCB0eXBvIGluIGxhc3QgY2hhbmdlLgorCitUaHUgQXVnICAzIDIyOjAxOjI2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBydGwuY3lnbnVzLmNvbT4KKworCSogY2gtZXhwLnkgKHdyaXRlX2xvd2VyX3VwcGVyX3ZhbHVlKTogIEFkZCBwcm90b3R5cGUgc28gYmlzb24KKwlnZW5lcmF0ZWQgcGFyc2VyIHdpbGwgaW5zZXJ0IHByb3RvdHlwZSBiZWZvcmUgZmlyc3QgZnVuYyB1c2FnZS4KKwlCaXNvbiBhbmQgYnlhY2Mgb3JkZXIgdGhlIG91dHB1dCBzZWN0aW9ucyBkaWZmZXJlbnRseS4gIEFsc28KKwltYWtlIGZ1bmN0aW9uIHN0YXRpYy4KKworVGh1IEF1ZyAgMyAxMDo0NTozNyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogVXBkYXRlIGFsbCBGU0YgYWRkcmVzc2VzIGV4Y2VwdCB0aG9zZSBpbiBDT1BZSU5HKiBmaWxlcy4KKworVGh1IEF1ZyAgMyAwMTozODo0NSAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNvbmZpZy9hbHBoYS90bS1hbHBoYS5oIChFWFRSQV9GUkFNRV9JTkZPKTogIEFkZCBwY19yZWcgZmllbGQuCisJKFNLSVBfVFJBTVBPTElORV9DT0RFKTogIERlZmluZS4KKwkqIGFscGhhLXRkZXAuYyAoYWxwaGFfZnJhbWVfc2F2ZWRfcGMpOiAgVXNlIHBjX3JlZyBmaWVsZCBmcm9tCisJZnJhbWUgdG8gZmluZCB0aGUgc2F2ZWQgcGMgcmVnaXN0ZXIuCisJKGFscGhhX3NhdmVkX3BjX2FmdGVyX2NhbGwpOiAgU2tpcCBvdmVyIHNoYXJlZCBsaWJyYXJ5IHRyYW1wb2xpbmUKKwliZWZvcmUgdHJ5aW5nIHRvIGZpbmQgdGhlIHNhdmVkIHBjIHJlZ2lzdGVyLgorCShmaW5kX3Byb2NfZGVzYyk6ICBDb3B5IFBST0NfUENfUkVHIGZyb20gZm91bmQgcHJvY19kZXNjCisJdG8gaGV1cmlzdGljIHByb2NfZGVzYy4KKwkoaW5pdF9leHRyYV9mcmFtZV9pbmZvKTogIEluaXRpYWxpemUgcGNfcmVnIGZpZWxkIGluIGZyYW1lLgorCitXZWQgQXVnICAyIDE4OjAwOjM2IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChtNjgqLWVzdC0qKTogVXNlIG1vbml0b3IgdGFyZ2V0IGNvbmZpZy4KKwkqIGNvbmZpZ3VyZTogVXBkYXRlLgorCSogY29uZmlnL202OGsvZXN0Lm10LCBjb25maWcvbTY4ay90bS1lc3QuaDogRGVsZXRlLgorCSogY29uZmlnL202OGsvbW9uaXRvci5tdCwgY29uZmlnL202OGsvdG0tbW9uaXRvci5oOiBGaXggY29tbWVudHMuCisKK1R1ZSBBdWcgIDEgMjI6NTI6NTMgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogQnVtcCB0byA0LjE0LjIKKworVHVlIEF1ZyAgMSAxNjowNDozNiAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAbWV4aWNhbi5jeWdudXMuY29tPgorCisJKiB4Y29mZnJlYWQuYyAocHJvY2Vzc19saW5lbm9zKTogVGhlIHZhbHVlIGluIGluY2x1ZGUgZmlsZSBzeW1ib2wKKwlzaG91bGQgcG9pbnQgdG8gbGluZSBudW1iZXIgdGFibGUuIEN1cnJlbnRseSB0aGlzIHZhbHVlIGlzIG5vdAorCXNldCBjb3JyZWN0bHkgYnkgQUlYIGxkLiBBIGZpeCB0byBnZXQgYXJvdW5kIHRoaXMgYnVnLgorCitUdWUgQXVnICAxIDExOjQ0OjUzIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDaGVjayBmb3Igd29ya2luZyBtbWFwLCBhbnNpIGhlYWRlcnMsIHN0cmluZy5oLAorCXN0cmluZ3MuaCwgYW5kIG1lbW9yeS5oLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworCSogZ2RiX3N0YXQuaDogTmV3IGZpbGUsICJwb3J0YWJsZSIgPHN5cy9zdGF0Lmg+LgorCSogZ2RiX3N0cmluZy5oOiBOZXcgZmlsZSwgInBvcnRhYmxlIiA8c3RyaW5nLmg+LgorCisJKiBhbHRvcy14ZGVwLmMsIGFybS10ZGVwLmMsIGFybS14ZGVwLmMsIGNvbnZleC10ZGVwLmMsCisJY29udmV4LXhkZXAuYywgY29yZWRlcC5jLCBjeHV4LW5hdC5jLCBkYnhyZWFkLmMsIGV4ZWMuYywKKwlnb3VsZC14ZGVwLmMsIGhwcGEtdGRlcC5jLCBpMzg2YWl4LW5hdC5jLCBpMzg2Yi1uYXQuYywKKwlpMzg2bWFjaC1uYXQuYywgaTM4NnYtbmF0LmMsIGluZnB0cmFjZS5jLCBtODhrLW5hdC5jLCBtYWluLmMsCisJbWRlYnVncmVhZC5jLCBvYmpmaWxlcy5jLCBvczlrcmVhZC5jLCBwcm9jZnMuYywgcHlyLXhkZXAuYywKKwlyczYwMDAtbmF0LmMsIHNvdXJjZS5jLCBzdGFuZGFsb25lLmMsIHN0dWZmLmMsIHN1bjM4Ni1uYXQuYywKKwlzeW1maWxlLmMsIHN5bW0tbmF0LmMsIHN5bW0tdGRlcC5jLCBzeW10YWIuYywgdG9wLmMsIHVsdHJhMy1uYXQuYywKKwl1bHRyYTMteGRlcC5jLCB1bWF4LXhkZXAuYywgeGNvZmZyZWFkLmM6IEluY2x1ZGUgImdkYl9zdGF0LmgiCisJaW5zdGVhZCBvZiA8c3lzL3N0YXQuaD4uCisKKwkqIGFscGhhLXRkZXAuYywgYnJlYWtwb2ludC5jLCBidWlsZHN5bS5jLCBjLXR5cGVwcmludC5jLAorCWNoLXR5cGVwcmludC5jLCBjb2ZmcmVhZC5jLCBjb21tYW5kLmMsIGNvcmUtc29sMi5jLCBjb3JlLXN2cjQuYywKKwljb3JlLmMsIGNvcmVsb3cuYywgY3AtdmFscHJpbnQuYywgZGJ4cmVhZC5jLCBkY2FjaGUuYywgZGVtYW5nbGUuYywKKwlkcHgyLW5hdC5jLCBkc3RyZWFkLmMsIGR3YXJmcmVhZC5jLCBlbGZyZWFkLmMsIGVudmlyb24uYywgZXZhbC5jLAorCWV4ZWMuYywgZi1sYW5nLmMsIGYtdHlwZXByaW50LmMsIGYtdmFscHJpbnQuYywgZmluZHZhci5jLAorCWZvcmstY2hpbGQuYywgZ2RidHlwZXMuYywgaHByZWFkLmMsIGkzODYtdGRlcC5jLCBpbmZjbWQuYywKKwlpbmZsb3cuYywgaW5mcHRyYWNlLmMsIGluZnJ1bi5jLCBpcml4NS1uYXQuYywgbGFuZ3VhZ2UuYywKKwltMi10eXBlcHJpbnQuYywgbWFpbi5jLCBtZGVidWdyZWFkLmMsIG1pbnN5bXMuYywgbWlwc3JlYWQuYywKKwltb25pdG9yLmMsIG5sbXJlYWQuYywgb2JqZmlsZXMuYywgb3M5a3JlYWQuYywgb3Nmc29saWIuYywgcGFyc2UuYywKKwlwcmludGNtZC5jLCBwcm9jZnMuYywgcmVnZXguYywgcmVtb3RlLWFkYXB0LmMsCisJcmVtb3RlLWFycmF5LmMsIHJlbW90ZS1idWcuYywgcmVtb3RlLWU3MDAwLmMsIHJlbW90ZS1lYi5jLAorCXJlbW90ZS1lcy5jLCByZW1vdGUtaG1zLmMsIHJlbW90ZS1tbS5jLCByZW1vdGUtb3M5ay5jLAorCXJlbW90ZS1wYS5jLCByZW1vdGUtc2ltLmMsIHJlbW90ZS1zdC5jLCByZW1vdGUtdWRpLmMsCisJcmVtb3RlLXV0aWxzLmMsIHJlbW90ZS12eC5jLCByZW1vdGUtdngyOWsuYywgcmVtb3RlLXZ4NjguYywKKwlyZW1vdGUtdng5NjAuYywgcmVtb3RlLXZ4bWlwcy5jLCByZW1vdGUtdnhzcGFyYy5jLCByZW1vdGUuYywKKwlzb2xpYi5jLCBzb21yZWFkLmMsIHNvdXJjZS5jLCBzdGFic3JlYWQuYywgc3RhY2suYywgc3ltZmlsZS5jLAorCXN5bW1pc2MuYywgc3ltdGFiLmMsIHRhcmdldC5jLCB0b3AuYywgdHlwZXByaW50LmMsIHV0aWxzLmMsCisJdmFsYXJpdGguYywgdmFsb3BzLmMsIHZhbHByaW50LmMsIHZhbHVlcy5jLCB4Y29mZnJlYWQuYzogSW5jbHVkZQorCSJnZGJfc3RyaW5nLmgiIGluc3RlYWQgb2YgPHN0cmluZy5oPi4KKworCSogY29uZmlnL3htLXN5c3Y0LmgsIGkzODYveG0tcHR4LmgsIG02OGsveG0tc3VuM29zNC5oLAorCXNwYXJjL3htLXN1bjRvczQuaCAoSEFWRV9NTUFQKTogUmVtb3ZlZC4KKworCSogY29uZmlnL3htLWx5bnguaCwgY29uZmlnL2kzODYveG0tcHR4LmgsCisJY29uZmlnL202OGsvbm0tYXBvbGxvNjhiLmgsIGNvbmZpZy9tNjhrL3htLWhwMzAwaHB1eC5oLAorCWNvbmZpZy9taXBzL3htLWlyaXgzLmgsIGNvbmZpZy9taXBzL3htLW1pcHMuaCwKKwljb25maWcvbWlwcy94bS1uZXdzLW1pcHMuaCwgY29uZmlnL21pcHMveG0tcmlzY29zLmgsCisJY29uZmlnL3BhL2hwcGFoLmgsIGNvbmZpZy9yczYwMDAveG0tcnM2MDAwLmgsCisJY29uZmlnL3NwYXJjL3htLXN1bjRvczQuaCwgY29uZmlnL3NwYXJjL3htLXN1bjRzb2wyLmgsCisJY29uZmlnL3ZheC94bS12YXhic2QuaCwgY29uZmlnL3ZheC94bS12YXh1bHQuaCwKKwljb25maWcvdmF4L3htLXZheHVsdDIuaCAoTUVNX0ZOU19ERUNMQVJFRCk6IFJlbW92ZWQuCisJKiBjb25maWcvbWlwcy94bS1pcml4My5oLCBjb25maWcvbWlwcy94bS1taXBzLmgsCisJY29uZmlnL3BhL3htLWhwcGFoLmggKG1lbWNweSwgbWVtc2V0KTogUmVtb3ZlZCBkZWNsYXJhdGlvbnMuCisKK1R1ZSBBdWcgIDEgMDI6MDg6MzAgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBtaXBzLXRkZXAuYyAobWlwc19leHRyYWN0X3JldHVybl92YWx1ZSk6ICBGaXggcmV0dXJuaW5nIG9mCisJdmFsdWVzIHdob3NlIGxlbmd0aCBpcyBsZXNzIHRoYW4gdGhlIHJlZ2lzdGVyIHNpemUgZm9yIGJpZyBlbmRpYW4KKwl0YXJnZXRzLgorCSogYWxwaGEtdGRlcC5jIChhbHBoYV9leHRyYWN0X3JldHVybl92YWx1ZSwKKwlhbHBoYV9zdG9yZV9yZXR1cm5fdmFsdWUpOiAgVXNlIGFscGhhX2NvbnZlcnRfcmVnaXN0ZXJfdG9fKgorCXRvIGhhbmRsZSBmdW5jdGlvbnMgcmV0dXJuaW5nICJmbG9hdCIgY29ycmVjdGx5LgorCitNb24gSnVsIDMxIDE5OjEyOjQ4IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogaDg1MDAtdGRlcC5jOiBHZW5lcmFsIGxpbnRpbmcgYW5kIGNsZWFudXAuCisJKG9wY29kZXMvaDg1MDAtb3BjLmgpOiBEb24ndCBpbmNsdWRlLgorCShjb2RlX3NpemUsIGRhdGFfc2l6ZSk6IE1ha2Ugc3RhdGljLgorCShmcmFtZV9sb2NhbHNfYWRkcmVzcywgZnJhbWVfYXJnc19hZGRyZXNzKTogUmVtb3ZlLgorCShoODMwMF9wb3BfZnJhbWUpOiBSZW5hbWUgdG8gaDg1MDBfcG9wX2ZyYW1lLgorCShiaWdfY29tbWFuZCwgbWVkaXVtX2NvbW1hbmQsIGNvbXBhY3RfY29tbWFuZCwgc21hbGxfY29tbWFuZCk6CisJRGVmaW5lIGFzIHJlZ3VsYXIgZnVuY3Rpb25zIHJhdGhlciB0aGFuIHdpdGggbWFjcm8gdHJpY2tlcnkuCisJKHRtX3ByaW50X2luc24pOiBTZXQgdG8gY29ycmVjdCBkaXNhc3NlbWJsZXIgZnVuY3Rpb24uCisJKiBjb25maWcvaDg1MDAvdG0taDg1MDAuaDogTWlub3IgY2xlYW51cCwgYWRkIHByb3RvdHlwZXMuCisJKEFCT1VUX1RPX1JFVFVSTik6ICNpZiAwIG91dC4KKwkoRlJBTUVfQVJHU19BRERSRVNTLCBGUkFNRV9MT0NBTFNfQUREUkVTUyk6IFVzZSB1c3VhbCBkZWZpbmUuCisJKEdEQl9UQVJHRVRfSVNfSDg1MDApOiBSZW1vdmUgZHVwbGljYXRlCWRlZmluaXRpb24uCisJKHJlZ29mZik6IFJlbW92ZSwgbmV2ZXIgdXNlZC4KKwkqIGNvbmZpZy9oODUwMC9oODUwMC5tdCAoVERFUEZJTEVTKTogQWRkIG1vbml0b3Iuby4KKworTW9uIEp1bCAzMSAxNDozMjozMCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIHVuaXN0ZC5oLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworCSogY29tbWFuZC5jLCBjcC12YWxwcmludC5jLCBmb3JrLWNoaWxkLmMsIGkzODYtdGRlcC5jLAorCWkzODZiLW5hdC5jLCBpbmZsb3cuYywgbWFpbi5jLCBtYWludC5jLCBvYmpmaWxlcy5jLCBzb2xpYi5jLAorCXNvdXJjZS5jLCBzdGFjay5jLCBzeW1maWxlLmMsIHRvcC5jLCB1dGlscy5jOiBJbmNsdWRlIHN0cmluZ3MuaAorCWFuZC9vciB1bmlzdGQuaCB0byBicmluZyBwcm90b3R5cGVzIGludG8gc2NvcGUuCisKK1N1biBKdWwgMzAgMDE6NDA6MTEgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiByczYwMDAtdGRlcC5jIChmcmFtZV9zYXZlZF9wYyk6ICBDaGVjayBmb3Igc2lnbmFsIGhhbmRsZXIgY2FsbGVyCisJYmVmb3JlIHRyeWluZyB0byBkZXRlcm1pbmUgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4KKwkoc2tpcF9wcm9sb2d1ZSk6ICBTa2lwIHN1YnJvdXRpbmUgY2FsbCB3aGljaCBtaWdodCBzYXZlIHRoZQorCWZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBvbmx5IGlmIGl0IGlzIHdpdGhpbiB0aGUgZmlyc3QgdGhyZWUKKwlpbnN0cnVjdGlvbnMuCisJUmVpbnN0YXRlIHNldHRpbmcgb2YgYWxsb2NhX3JlZyBpZiBzZXR1cCBvZiBhIGdjYyBmcmFtZSBwb2ludGVyCisJaXMgZm91bmQuCisJKGZyYW1lX2dldF9jYWNoZV9mc3IpOiAgVXNlIG5ldyBmaWVsZHMgaW4gcnM2MDAwX2ZyYW1lZGF0YS4KKworU2F0IEp1bCAyOSAxNDo0MzozNSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHNwYXJjbGl0ZTogUmVtb3ZlZCBzdWJkaXJlY3RvcnkuICBhbG9hZCBhbmQgZWxvYWQgYXJlIG5vdyBpbgorCXV0aWxzL3NwYXJjbGl0ZSwgbG93LWxldmVsIGxpYnJhcnkgaXMgaW4gbGliZ2xvc3MuCisJKiBjb25maWd1cmUuaW4gKHNwYXJjbGl0ZSopOiBEb24ndCBjb25maWd1cmUgc3BhcmNsaXRlIHN1YmRpci4KKwkqIGNvbmZpZ3VyZTogVXBkYXRlLgorCSogTWFrZWZpbGUuaW4gKFRBUkRJUlMpOiBSZW1vdmUsIG5vIGxvbmdlciB1c2VkLgorCitTYXQgSnVsIDI5IDAxOjQ1OjU2IDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogcHJvY2ZzLmMgKHVuY29uZGl0aW9uYWxseV9raWxsX2luZmVyaW9yKTogIENsZWFyIGN1cnJlbnQgc2lnbmFsCisJaWYgUFJPQ0ZTX05FRURfQ0xFQVJfQ1VSU0lHX0ZPUl9LSUxMIGlzIGRlZmluZWQuCisJKiBjb25maWcvYWxwaGEvbm0tb3NmMy5oIChQUk9DRlNfTkVFRF9DTEVBUl9DVVJTSUdfRk9SX0tJTEwpOiAgRGVmaW5lLgorCisJKiBhbHBoYS10ZGVwLmM6ICBNb3ZlIHNpZ3RyYW1wIGhhbmRsaW5nIG9mIHNhdmVkIHJlZ2lzdGVycyBmcm9tCisJcmVhZF9uZXh0X2ZyYW1lX3JlZyB0byBhbHBoYV9maW5kX3NhdmVkX3JlZ3MsIGhhbmRsZSBzYXZlZAorCWZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycy4KKwkqIG1pcHMtdGRlcC5jOiAgTW92ZSBzaWd0cmFtcCBoYW5kbGluZyBvZiBzYXZlZCByZWdpc3RlcnMgZnJvbQorCXJlYWRfbmV4dF9mcmFtZV9yZWcgdG8gbWlwc19maW5kX3NhdmVkX3JlZ3MsIGhhbmRsZSBzYXZlZAorCWZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycy4KKwkqIGNvbmZpZy9taXBzL3RtLWlyaXgzLmgsIGNvbmZpZy9taXBzL3RtLWlyaXg1LmgsCisJY29uZmlnL21pcHMvdG0tbWlwc3Y0LmggKFNJR0ZSQU1FX0ZQUkVHU0FWRV9PRkYpOiAgRGVmaW5lLiAKKworCSogc3BhcmMtdGRlcC5jIChzcGFyY19wY19hZGp1c3QpOiAgRml4IGNoZWNrIGZvciBgdW5pbXAnCisJaW5zdHJ1Y3Rpb24gdG8gaGFuZGxlIGZ1bmN0aW9ucyByZXR1cm5pbmcgc3RydWN0dXJlcyB3aXRoCisJbGFyZ2Ugc2l6ZXMgcHJvcGVybHkuCisKK0ZyaSBKdWwgMjggMTE6NTA6MTcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLCBjb25maWd1cmUuaW4gKHo4ay0qLXNpbSk6IGRlbGV0ZWQuCisKK1RodSBKdWwgMjcgMTI6NDk6MjggMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+CisKKwkqIGx5bngtbmF0LmMgKGNoaWxkX3dhaXQpOiBIYW5kbGUgdGhyZWFkcyBleGl0aW5nLgorCitUaHUgSnVsIDI3IDA3OjQ3OjUwIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiByczYwMDAtdGRlcC5jIChza2lwX3Byb2xvZ3VlKTogRG9uJ3QgYXNzdW1lIHRoZSB1cGRhdGUgc3RhY2sKKwlpbnN0cnVjdGlvbiBpcyB0aGUgbGFzdCBpbiB0aGUgcHJvbG9ndWUsIHNpbmNlIHhsYyBzdG9yZXMgdGhlIGxyCisJYWZ0ZXIgdGhlIHN0YWNrIHVwZGF0ZS4gIE1ha2Ugc3VyZSBvZmZzZXQgaXMgY29ycmVjdCBzaWduIGZvcgorCWxhcmdlIGZyYW1lcy4KKwkoZnJhbWVfc2F2ZWRfcGMpOiBNb3ZlIHRlc3QgZm9yIHNpZ25hbCBiZWZvcmUgZnJhbWVsZXNzLgorCisJKiBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oIChERUZBVUxUX0xSX1NBVkUpOiBEZWZpbmUuCisJKiBjb25maWcvcG93ZXJwYy90bS1wcGMtZWFiaS5oIChERUZBVUxUX0xSX1NBVkUpOiBSZWRlZmluZS4KKworVGh1IEp1bCAyNyAwMToyMjowOCAxOTk1ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KKworCSogaHBwYS10ZGVwLmMgKGhwcGFfZml4X2NhbGxfZHVtbXkpOiBSZXdyaXRlIGNvZGUgZm9yIGNhbGxpbmcKKwlpbnRvIHNoYXJlZCBsaWJyYXJpZXMuCisKK1dlZCBKdWwgMjYgMjM6MzM6MzQgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9yczYwMDAvdG0tcnM2MDAwLmggKHJzNjAwMF9mcmFtZWRhdGEpOiBBZGQgb2Zmc2V0cyB0aGUKKwlncHJzLCBmcHJzLCBsciwgYW5kIGNyIGlzIHN0b3JlZCBhdC4KKwkoRlJBTUVfRklORF9TQVZFRF9SRUdTKTogVXNlIG5ldyBmaWVsZHMgaW4gcnM2MDAwX2ZyYW1lZGF0YS4KKwkoZnVuY3Rpb25fZnJhbWVfaW5mbyk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KKwkoU0tJUF9QUk9MT0dVRSk6IFNraXBfcHJvbG9ndWUgaXMgbm93IHBhc3NlZCBhIHJzNjAwMF9mcmFtZWRhdGEKKwlzdHJ1Y3R1cmUgdG8gZmlsbCBpbi4KKwkoRlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT04pOiBGdW5jdGlvbiBub3cgbG9uZ2VyIHRha2VzIGEKKwlzZWNvbmQgYXJndW1lbnQuCisJKEZSQU1FX1NBVkVEX1BDKTogQ2FsbCBmcmFtZV9zYXZlZF9wYy4KKworCSogcnM2MDAwLXRkZXAuYyAoc2tpcF9wcm9sb2d1ZSk6IFJlY29nbml6ZSBWLjQgcHJvbG9ndWVzIGFzIHdlbGwKKwlhcyBBSVggc3R5bGUuICBGaWxsIGluIHJzNjAwMF9mcmFtZWRhdGEgc3RydWN0dXJlLiAgUmVtZW1iZXIgd2hlcmUKKwl0aGUgZ3BycywgZnBycywgY3IsIGFuZCBsciBhcmUgc2F2ZWQuCisJKHBvcF9mcmFtZSk6IFVzZSBza2lwX3Byb2xvZ3VlLCBub3QgZnVuY3Rpb25fZnJhbWVfaW5mbywgYW5kIHVzZQorCW5ldyByczYwMDBfZnJhbWVkYXRhIGZpZWxkcy4KKwkoZnVuY3Rpb25fZnJhbWVfaW5mbyk6IEZ1bmN0aW9uIGRlbGV0ZWQuCisJKGZyYW1lbGVzc19mdW5jdGlvbl9pbnZvY2F0aW9uKTogU2VwYXJhdGUgZnJhbWVfc2F2ZWRfcGMgc3VwcG9ydAorCXRvIG5ldyBmdW5jdGlvbi4gIFJlY29nbml6ZSBWLjQgZnJhbWVzLgorCShmcmFtZV9zYXZlZF9wYyk6IE5ldyBmdW5jdGlvbi4KKwkoZnJhbWVfZ2V0X2NhY2hlX2Zzcik6IFVzZSBza2lwX3Byb2xvZ3VlLCBub3QgZnVuY3Rpb25fZnJhbWVfaW5mby4KKwkoZnJhbWVfaW5pdGlhbF9zdGFja19hZGRyZXNzKTogRGl0dG8uCisKK1dlZCBKdWwgMjYgMDE6MDA6MzcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHJlbW90ZS5jOiAgQWRkIGRvY3VtZW50YXRpb24gZm9yIGV4dGVuZGVkIHByb3RvY29sIG9wZXJhdGlvbnMKKwlhbmQgZm9yIHRocmVhZF9hbGl2ZSBjaGFuZ2UgZnJvbSBhIGNvdXBsZSB3ZWVrcyBhZ28uCisJKGV4dGVuZGVkX3JlbW90ZV9vcHMpOiBEZWNsYXJlIGFuZCBkZWZpbmUgYSBuZXcgdGFyZ2V0IHZlY3RvcgorCWZvciB0aGUgZXh0ZW5kZWQgcmVtb3RlIHByb3RvY29sLgorCShleHRlbmRlZF9yZW1vdGVfcmVzdGFydCk6IE5ldyBmdW5jdGlvbiB0byByZXN0YXJ0IHRoZSByZW1vdGUKKwlzZXJ2ZXIgJiBwcm9jZXNzLgorCShyZW1vdGVfb3Blbik6IEp1c3QgYSBzdHViIHJvdXRpbmUuCisJKGV4dGVuZGVkX3JlbW90ZV9vcGVuKTogTmV3IGZ1bmN0aW9uIHRvIHN0YXJ0IGEgcmVtb3RlIHNlc3Npb24KKwl1c2luZyB0aGUgZXh0ZW5kZWQgZ2RiIHJlbW90ZSBwcm90b2NvbC4KKwkocmVtb3RlX29wZW5fMSk6IE5ldyBmdW5jdGlvbiBjb250YWluaW5nIGNvZGUgY29tbW9uIHRvIGJvdGgKKwlyZW1vdGVfb3BlbiBhbmQgZXh0ZW5kZWRfcmVtb3RlX29wZW4uCisJKHJlbW90ZV9tb3VybiwgZXh0ZW5kZWRfcmVtb3RlX21vdXJuLCByZW1vdGVfbW91cm5fMSk6IFNpbWlsYXJseS4KKwkoZXh0ZW5kZWRfcmVtb3RlX2NyZWF0ZV9pbmZlcmlvcik6IE5ldyBmdW5jdGlvbiBmb3IgdGhlIGV4dGVuZGVkCisJcmVtb3RlIHRhcmdldC4KKwkoaW5pdGlhbGl6ZV9yZW1vdGUpOiBBZGQgdGhlIGV4dGVuZGVkX3JlbW90ZV9vcHMgdGFyZ2V0IHZlY3Rvci4KKwkqIGdkYnNlcnZlci9zZXJ2ZXIuYyAobWFpbiwgY2FzZSAnIScpOiBTZXQgZXh0ZW5kZWRfcHJvdG9jb2wuCisJKG1haW4sIGNhc2UgJ2snKTogSWYgdGhlIGV4dGVuZGVkIHByb3RvY29sIGlzIGluIHVzZSwga2lsbCB0aGUKKwlpbmZlcmlvciB0aGVuIHN0YXJ0IGEgbmV3IG9uZS4KKwkobWFpbiwgY2FzZSAnUicpOiBOZXcgY29tbWFuZCB0byByZXN0YXJ0IHRoZSByZW1vdGUgc2VydmVyIGFuZAorCWluZmVyaW9yIHByb2Nlc3MuICBPbmx5IHN1cHBvcnRlZCB3aGVuIHVzaW5nIHRoZSBleHRlbmRlZAorCXByb3RvY29sLgorCShtYWluLCBzZXJ2ZXIgbG9vcCk6IElmIHRoZSBpbmZlcmlvciB0ZXJtaW5hdGVzIHdoaWxlIHVzaW5nIHRoZQorCWV4dGVuZGVkIHByb3RvY29sIHRoZW4gc3RhcnQgYSBuZXcgb25lLiAgSWYgZ2V0cGt0IGZhaWxzIHdoZW4KKwl1c2luZyB0aGUgZXh0ZW5kZWQgcHJvdG9jb2wgdGhlbiBleGl0LgorCitUdWUgSnVsIDI1IDExOjQzOjQ0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbWRlYnVncmVhZC5jIChwc3ltdGFiX3RvX3N5bXRhYl8xKTogUmVsb2NhdGUgZW5jb2RlZCBzdGFiCisJbGluZSBudW1iZXJzIHVzaW5nIHRoZSBwc3ltdGFiJ3Mgc2VjdGlvbiBvZmZzZXRzLgorCitUdWUgSnVsIDI1IDEwOjQzOjI3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3JzNjAwMC90bS1yczYwMDAuaCAocnM2MDAwX2ZyYW1lZGF0YSk6IFJlbmFtZSBmcm9tCisJYWl4X2ZyYW1lZGF0YS4gIENoYW5nZSBhbGwgdXNlcy4KKwkqIHJzNjAwMC10ZGVwLmM6IENoYW5nZSBhbGwgYWl4X2ZyYW1lZGF0YSAtPiByczYwMDBfZnJhbWVkYXRhLgkKKworU2F0IEp1bCAyMiAyMzo0NDoxOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZGVmcy5oIChBVFRSX0ZPUk1BVCk6IERpc2FibGUgaWYgQU5TSV9QUk9UT1RZUEVTIGlzIG5vdCBkZWZpbmVkLgorCitGcmkgSnVsIDIxIDE2OjUwOjI4IDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgorCisJKiBseW54LW5hdC5jIChjaGlsZF90aHJlYWRfYWxpdmUpOiBOZXcgZnVuY3Rpb24uICBTb21laG93IEkKKwlmb3Jnb3QgdG8gY2hlY2sgdGhpcyBpbiB3aXRoIGFsbCB0aGUgb3RoZXIgdGhyZWFkX2FsaXZlIGNoYW5nZXMuCisKK1RodSBKdWwgMjAgMjI6MjI6MzQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbXJlYWQuYyAoc29tX3N5bXRhYl9yZWFkKTogQWRkIHVuc2F0aXNmaWVkIGNvbW1vbiBzeW1ib2xzIHRvCisJdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlLiAgQWxsIGNvbW1vbiBzeW1ib2xzIGFyZSAidW5zYXRpc2ZpZWQiCisJd2hlbiAtRSBpcyBwYXNzZWQgdG8gdGhlIGxpbmtlci4KKworVGh1IEp1bCAyMCAxNTowNDo1NyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogdG9wLmMgKHNob3dfZW5kaWFuKTogQ2FzdCBmaXJzdCBhcmcgb2YgcHJpbnRmX3VuZmlsdGVyZWQgdG8KKwljb3JyZWN0IHR5cGUgb2YgImNoYXIgKiIuCisKK1RodSBKdWwgMjAgMTQ6MTg6NTEgMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+CisKKwkqIGx5bngtbmF0LmMgKGNoaWxkX3dhaXQpOiBBIHRocmVhZF9pZCBvZiB6ZXJvIGZyb20gd2FpdCBhcHBhcmVudGx5CisJbWVhbnMgdGhlIHByb2Nlc3MgaXMgc2luZ2xlIHRocmVhZGVkLCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gYWRkCisJaXQgdG8gdGhlIHRocmVhZCBsaXN0LiAgSGFuZGxlIGNhc2Ugd2hlcmUgbXVsdGktdGhyZWFkZWQgcHJvY2VzcworCXJldmVydHMgYmFjayB0byBhIHNpbmdsZS10aHJlYWRlZCBwcm9jZXNzLgorCisJKiBnZGJzZXJ2ZXIvbG93LWhwcGFic2QuYzogUmVtb3ZlIGVycm9yIGRlY2xhcmF0aW9uLgorCSogZ2Ric2VydmVyL2xvdy1zcGFyYy5jOiBMaWtld2lzZS4KKwkqIGdkYnNlcnZlci9sb3ctc3VuMy5jOiBMaWtld2lzZS4KKwkqIGdkYnNlcnZlci9zZXJ2ZXIuaDogUmVtb3ZlIGVycm9yIGFuZCBmYXRhbCBkZWNsYXJhdGlvbi4KKwkqIGdkYnNlcnZlci91dGlscy5jIChlcnJvcik6IFVwZGF0ZSB0byBiZSBjb21wYXRhYmxlIHdpdGggcmVjZW50CisJY2hhbmdlcyBpbiBkZWZzLmguCisJKGZhdGFsKTogTGlrZXdpc2UuCisKK1dlZCBKdWwgMTkgMjI6NDI6NDMgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb25maWcvbTY4ay90bS1tNjhrdjQuaCAoRFdBUkZfUkVHX1RPX1JFR05VTSk6ICBEZWZpbmUgdG8KKwljb3JyZWN0bHkgbWFwIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBudW1iZXJzLgorCisJKiBkd2FyZnJlYWQuYyAobG9jdmFsLCBuZXdfc3ltYm9sKTogIEhhbmRsZSB2YXJpYWJsZXMgdGhhdCBhcmUKKwlvcHRpbWl6ZWQgb3V0LgorCisJKiBtZGVidWdyZWFkLmM6ICBSZXBsYWNlIGFsbCB1c2VzIG9mIGJ1aWx0aW5fdHlwZV8qIHdpdGgKKwltZGVidWdfdHlwZV8qLiBEZWZpbmUgYW5kIGluaXRpYWxpemUgbWRlYnVnX3R5cGVfKi4KKworCSogc2VyaWFsLmggKHNlcmlhbF9jbG9zZSk6ICBBZGQgYWRkaXRpb25hbCBhcmd1bWVudCBgcmVhbGx5X2Nsb3NlJy4KKwkoU0VSSUFMX0NMT1NFKTogIFVwZGF0ZSBzZXJpYWxfY2xvc2UgY2FsbCBhY2NvcmRpbmdseS4KKwkoU0VSSUFMX1VOX0ZET1BFTik6ICBVc2Ugc2VyaWFsX2Nsb3NlIHRvIGhhbmRsZSByZWZjbnQgcHJvcGVybHkuCisJKiBzZXJpYWwuYyAoc2VyaWFsX2Nsb3NlKTogIEhhbmRsZSBgcmVhbGx5X2Nsb3NlJy4KKwkqIHNlcmlhbC5oIChzY2JfYmFzZSk6ICBNb3ZlZCB0byBzZXJpYWwuYywgbWFkZSBzdGF0aWMuCisKKwkqIHZhbG9wcy5jICh2YWx1ZV9hZGRyKTogIERvbid0IGNvZXJjZSBhcnJheXMuCisJKHR5cGVjbXApOiAgQ29lcmNlIGFycmF5cyBpbnN0ZWFkIG9mIGNhbGxpbmcgdmFsdWVfYWRkciBpZiBuZWNlc3NhcnkuCisKK1dlZCBKdWwgMTkgMTg6MTk6MjggMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJRnJvbSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspOgorCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogU2V0IHRoZSBjb252ZW5pZW5jZSB2YXJpYWJsZQorCSRfZXhpdGNvZGUgdG8gdGhlIHRlcm1pbmF0aW9uIGNvZGUgb2YgdGhlIGluZmVyaW9yLgorCSogdG9wLmMgKHF1aXRfY29tbWFuZCk6IEFjY2VwdCBvcHRpb25hbCBleHByZXNzaW9uIHRvIHVzZQorCWFzIHBhcmFtZXRlciB0byBleGl0KCkuCisKK1dlZCBKdWwgMTkgMTM6MTU6MzIgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLmMgKHJlbW90ZV93YWl0KTogV2hlbiBnZXR0aW5nIHJlZ2lzdGVycywgY2hlY2sgZW5kaWFuZXNzIGFuZAorCWRvIGNvbnZlcnNpb24gaWYgbmVjZXNzYXJ5LgorCitUdWUgSnVsIDE4IDAwOjQxOjMxIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnZGJzZXJ2ZXIvbG93LWhwcGFic2QuYzogTmV3IGZpbGUuCisJKiBnZGJzZXJ2ZXIvTWFrZWZpbGUuaW4gKFNGSUxFUyk6IEFkZCBsb3ctaHBwYWJzZC5jLgorCSogY29uZmlnL3BhL2hwcGFic2QubWggKFhERVBGSUxFUyk6IEFkZCBzZXItdGNwLm8uCisJKEdEQlNFUlZFUl9ERVBGSUxFUyk6IEFkZCBsb3ctaHBwYWJzZC5vLgorCSogY29uZmlnL3BhL2hwcGFvc2YubWg6IExpa2V3aXNlLgorCitNb24gSnVsIDE3IDIxOjM1OjE4IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBkYWNoZS5jIChzdHJ1Y3QgZGNhY2hlX2Jsb2NrKTogQ2hhbmdlIGRhdGEgbWVtYmVyIGZyb20gdW5zaWduZWQKKwljaGFyIHRvIGNoYXIsIHNpbmNlIGV2ZXJ5dGhpbmcgcGFzc2VkIGluIGFuZCBvdXQgb2YgZGNhY2hlIGlzIGNoYXIKKwlvciBjYXN0ZWQgdG8gYXBwcm9wcmlhdGUgdHlwZSBhbnl3YXkuCisJKGRjYWNoZV9hbGxvYyk6ICBNb3ZlIGFzc2lnbm1lbnQgb2YgZGIgb3V0IG9mIHRlc3QgYW5kIGNvbWJpbmUKKwlzZXBhcmF0ZSB0ZXN0cyBpbnRvIGlmLWVsc2UuCisJKGRjYWNoZV9wZWVrX2J5dGUpOiAgQ2hhbmdlIHB0ciBmcm9tIHVuc2lnbmVkIGNoYXIqIHRvIGNoYXIqLgorCShkY2FjaGVfcGVla19ieXRlKTogIFJlbW92ZSBub3cgdW5uZWNlc3NhcnkgY2FzdCBpbiByZWFkX21lbW9yeSBjYWxsLgorCShkY2FjaGVfcGVlayk6ICBDaGFuZ2UgY2FzdCBvZiBpbmNvbWluZyBkYXRhIGFyZy4KKwkoZGNhY2hlX3Bva2UpOiAgQ2hhbmdlIGNhc3Qgb2YgYWRkciBvZiBpbmNvbWluZyBkYXRhIGFyZy4JCisJKGRjYWNoZV9pbmZvKTogIE1hc2sgZGF0YSBwYXNzZWQgdG8gcHJpbnRmX2ZpbHRlcmVkIHRvIGxzYnl0ZSBvbmx5LgorCShkY2FjaGVfaW5mbyk6ICBDaGFuZ2UgcHJpbnRmX2ZpbHRlcmVkIGFyZyBmcm9tICIlIDJ4IiB0byAiICUyeCIuCisJKiB0YXJnZXQuYyAoZGVidWdfdG9fdGhyZWFkX2FsaXZlKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGludCBhbmQKKwlyZXR1cm4gemVybywgZm9yIHR5cGUgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyICpfdGhyZWFkX2FsaXZlCisJZnVuY3MuCisJKGNsZWFudXBfdGFyZ2V0KTogQ2hhbmdlIGNhc3Qgb2YgaWdub3JlIGZ1bmN0aW9uIHRvIG1hdGNoIHR5cGUgb2YgdGhlCisJdG9fdGhyZWFkX2FsaXZlIG1lbWJlci4KKwkqIGRlZnMuaCAoZXJyb3JfaG9vayk6IEFkZCBBVFRSX05PUkVUVVJOLgorCSogZGVmcy5oIChOT1JFVFVSTiwgQVRUUl9OT1JFVFVSTik6IFN3aXRjaCBmcm9tIHZvbGF0aWxlIHRvCisJX19hdHRyaWJ1dGVfXyBtZXRob2Qgd2l0aCBnY2MgMi43LCB0byBhdm9pZCBnY2MgMi42LjMgYnVnLgorCSogcmVtb3RlLmMgKHJlbW90ZV93YWl0KTogQ2FzdCBmaXJzdCBhcmcgdG8gc3RydG9sLCBzdHJjaHIsIGFuZAorCXN0cm5jbXAgdG8gImNvbnN0IGNoYXIgKiIgZnJvbSAidW5zaWduZWQgY2hhciAqIi4KKwkocmVtb3RlX3dhaXQpOiAgQ2FzdCBhcmcgdG8gcHV0cGt0IGFuZCBzdHJjcHkgZnJvbSAidW5zaWduZWQgY2hhciAqIgorCXRvICJjaGFyICoiLgorCShyZW1vdGVfd2FpdCk6ICBDaGFuZ2UgcHJpbnRmIGZvcm1hdCBmb3IgbG9uZyBhcmcgZnJvbSAiJWQiIHRvICIlbGQiLgorCShnZXRwa3QpOiAgUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAiYnAiLgorCShyZW1vdGVfZmV0Y2hfd29yZCwgcmVtb3RlX3N0b3JlX3dvcmQpOiAgSWZkZWYgb3V0IGFwcGFyZW50bHkgdW51c2VkCisJZnVuY3Rpb25zLgorCSogYnJlYWtwb2ludC5jICh3YXRjaHBvaW50X2NoZWNrKTogIFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlcworCSJzYXZlZF9sZXZlbCIgYW5kICJzYXZlZF9mcmFtZSIuCisJKiB2YWxvcHMuYyAodmFsdWVfYXJnX2NvZXJjZSk6ICBBZGQgb3RoZXIgZW51bSBUWVBFX0NPREVfKiBhbmQKKwlkZWZhdWx0IGNhc2VzIHRvIHN3aXRjaCBmb3IgY29tcGxldGVuZXNzLgorCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogIEVuY2xvc2UgImhhdmVfd2FpdGVkIiBsYWJlbAorCWluICNpZmRlZiB0aGF0IG1hdGNoZXMgdGhlIG9uZSBpbiB3aGljaCBpdCBpcyByZWZlcmVuY2VkLgorCSogc2VyLXVuaXguYyAoaGFyZHdpcmVfbm9mbHVzaF9zZXRfdHR5X3N0YXRlKTogIEVuY2xvc2Ugb3RoZXJ3aXNlCisJdW51c2VkIHZhcmlhYmxlICJzdGF0ZSIgaW4gI2lmZGVmIHRoYXQgbWF0Y2hlcyBvbmUgaW4gd2hpY2ggaXQgaXMKKwlyZWZlcmVuY2VkLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHBfc3RhbmRhcmQpOiAgUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAidmFyIi4KKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwX3N0YW5kYXJkKTogIFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKwkidG1wX3N5bWJvbCIuCisJKiB2YWxhcml0aC5jICh2YWx1ZV9zdWJzY3JpcHQpOiAgUmVtb3ZlIHVudXNlZCB2YXJpYWJsZQorCSJsb3dlcmJvdW5kIiwgd2hpY2ggaXMgcmVkZWNsYXJlZCBpbiBhIG5lc3RlZCBzY29wZSBwcmlvciB0byB1c2UuCisJKiBwcmludGNtZC5jIChwcmludF9mcmFtZV9uYW1lbGVzc19hcmdzKTogIFVzZSAiJWxkIiB0byBwcmludCBsb25nCisJYXJnLCBub3QgIiVkIi4KKwkqIHttZW0tYnJlYWsuYywgcmVtb3RlLXBhLmMsIHJlbW90ZS5jLCBzYWJlci5zdXBwcmVzc306CisJUmVtb3ZlIHVudXNlZCBzdGF0aWMgdmFyICJjaGVja19icmVha19pbnNuX3NpemUiLgorCSogYnVpbGRzeW0uYyAoZmluaXNoX2Jsb2NrKTogIEFkZCBvdGhlciBlbnVtIExPQ18qIGFuZCBkZWZhdWx0CisJY2FzZXMgdG8gc3dpdGNoIGZvciBjb21wbGV0ZW5lc3MuCisJY2gtbGFuZy5jICh0eXBlX2xvd2VyX3VwcGVyKTogIFJlbW92ZWQgdW51c2VkIGxhYmVsICJyZXRyeSIuCisJQWRkIG90aGVyIGVudW0gVFlQRV8qIGFuZCBkZWZhdWx0IGNhc2VzIHRvIHN3aXRjaCBmb3IgY29tcGxldGVuZXNzLgorCSogZi10eXBlcHJpbnQuYyAoZl90eXBlX3ByaW50X2FyZ3MpOiAgSWZkZWYgb3V0IHVudXNlZCBmdW5jdGlvbgorCXRoYXQgbWF5IGJlIHVzZWQgc29tZWRheSB3aGVuIEZvcnRyYW4gc3VwcG9ydCBpcyBjb21wbGV0ZS4KKwkqIGNoLXZhbHByaW50LmMgKGNoaWxsX3ByaW50X3R5cGVfc2NhbGFyKTogIEFkZCBvdGhlciBlbnVtCisJVFlQRV8qIGFuZCBkZWZhdWx0IGNhc2VzIHRvIHN3aXRjaCBmb3IgY29tcGxldGVuZXNzLgorCShjaGlsbF92YWxfcHJpbnQpOiAgUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXIgImhpZ2hfYm91bmQiIHRoYXQKKwlpcyByZWRlY2xhcmVkIGluIGEgbmVzdGVkIHNjb3BlIHByaW9yIHRvIHVzZS4KKwkoY2hpbGxfdmFyX3ByaW50KTogIFVzZSAiJWxkIiB0byBwcmludCBsb25nIGFyZywgbm90ICIlZCIuCisJKiByZWdleC5jIChyZV9jb21waWxlX2Zhc3RtYXAsIHJlX21hdGNoXzIpOiAgQWRkIHJlbWFpbmluZyBlbnVtCisJdHlwZXMgYW5kIGRlZmF1bHQgdG8gc3dpdGNoZXMgZm9yIGNvbXBsZXRlbmVzcy4KKwkqIG1pbnN5bXMuYyAobG9va3VwX21pbmltYWxfc3ltYm9sX3RleHQpOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlCisJInRyYW1wb2xpbmVfc3ltYm9sIi4KKwkocHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2xfYW5kX2luZm8pOiAgUmV0dXJuIE5VTEwgcmF0aGVyIHRoYW4KKwl0cmFzaC4KKwkqIGVsZnJlYWQuYyAoZWxmX3N5bXRhYl9yZWFkKTogIERvbid0IGRlcmVmZXJlbmNlIE5VTEwgcmV0dXJucyBmcm9tCisJcmVjb3JkX21pbmltYWxfc3ltYm9sX2FuZF9pbmZvLgorCSogZi1sYW5nLmMgKHNhdmVkX2Z1bmN0aW9uX2xpc3RfZW5kKTogIElmZGVmIG91dCB1bnVzZWQgdmFyaWFibGUKKwl0aGF0IG1heSBiZSB1c2VkIHNvbWVkYXkuCisJKiBmLXZhbHByaW50LmMgKGZfdmFsX3ByaW50KTogIFJlbW92ZSB1bnVzZWQgbG9jYWwgInN0cmFkZHIiLgorCQorTW9uIEp1bCAxNyAxMzowODowMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN0YWJzcmVhZC5oIChzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2xpc3QpOiBEZWZpbmUuCisJKGNvZmZzdGFiX2J1aWxkX3BzeW10YWJzKTogUmVtb3ZlIHN0YWJvZmYgYW5kIHN0YWJzaXplIHBhcmFtZXRlcnMuCisJQWRkIHRleHRhZGRyLCB0ZXh0c2l6ZSwgYW5kIHN0YWJzIHBhcmFtZXRlcnMuCisJKiBnZGItc3RhYnMuaCAoc3RydWN0IGRieF9zeW1maWxlX2luZm8pOiBSZW1vdmUgdGV4dF9zZWN0IGZpZWxkLgorCUFkZCB0ZXh0X2FkZHIgYW5kIHRleHRfc2l6ZSBmaWVsZHMuCisJKERCWF9URVhUX1NFQ1QpOiBEb24ndCBkZWZpbmUuCisJKERCWF9URVhUX0FERFIsIERCWF9URVhUX1NJWkUpOiBEZWZpbmUuCisJKiBjb2ZmcmVhZC5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KKwkoc3RydWN0IGNvZmZfc3ltZmlsZV9pbmZvKTogUmVtb3ZlIHN0YWJzZWN0IGFuZCBzdGFiaW5kZXhzZWN0CisJZmllbGRzLiAgQWRkIHRleHRhZGRyLCB0ZXh0c2l6ZSwgYW5kIHN0YWJzZWN0cyBmaWVsZHMuCisJKGNvZmZfbG9jYXRlX3NlY3Rpb25zKTogUmVjb3JkIHRoZSBhZGRyZXNzIG9mIHRoZSAudGV4dCBzZWN0aW9uLAorCWFuZCB0b3RhbCB0aGUgc2l6ZXMgb2YgYWxsIHNlY3Rpb25zIHdpdGggbmFtZXMgYmVnaW5uaW5nIHdpdGgKKwkiLnRleHQiLiAgRG9uJ3QgYm90aGVyIHRvIHJlY29yZCBhIC5zdGFiLmluZGV4IHNlY3Rpb24gKENPRkYKKwlkb2Vzbid0IHVzZSB0aGVtKS4gIE1ha2UgYSBsaW5rZWQgbGlzdCBvZiBhbGwgc2VjdGlvbnMgd2l0aCBuYW1lcworCWJlZ2lubmluZyB3aXRoICIuc3RhYiIuCisJKGNvZmZfc3ltZmlsZV9yZWFkKTogQWRqdXN0IGNhbGwgdG8gY29mZnN0YWJfYnVpbGRfcHN5bXRhYnMgZm9yCisJbmV3IHBhcmFtZXRlcnMuCisJKiBkYnhyZWFkLmMgKGRieF9zeW1maWxlX3JlYWQpOiBVc2UgREJYX1RFWFRfQUREUiBhbmQKKwlEQlhfVEVYVF9TSVpFLCByYXRoZXIgdGhhbiBnZXR0aW5nIGJvdGggZnJvbSBEQlhfVEVYVF9TRUNULgorCShkYnhfc3ltZmlsZV9pbml0KTogU2V0IERCWF9URVhUX0FERFIgYW5kIERCWF9URVhUX1NJWkUsIG5vdAorCURCWF9URVhUX1NFQ1QuCisJKGVsZnN0YWJfYnVpbGRfcHN5bXRhYnMpOiBMaWtld2lzZS4KKwkoc3RhYnNlY3RfYnVpbGRfcHN5bXRhYnMpOiBMaWtld2lzZS4KKwkoc3ltYnVmX3NlY3Rpb25zLCBzeW1idWZfbGVmdCwgc3ltYnVmX3JlYWQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KKwkoZmlsbF9zeW1idWYpOiBJZiBzeW1idWZfc2VjdGlvbnMgaXMgbm90IE5VTEwsIHJlYWQgc3ltYm9scyBmcm9tCisJbXVsdGlwbGUgc2VjdGlvbnMuCisJKGNvZmZzdGFiX2J1aWxkX3BzeW10YWJzKTogUmVtb3ZlIHN0YWJvZmZzZXQgYW5kIHN0YWJzaXplCisJcGFyYW1ldGVycy4gIEFkZCB0ZXh0YWRkciwgdGV4dHNpemUsIGFuZCBzdGFic2VjdHMgcGFyYW1ldGVycy4KKwlTZXQgREJYX1RFWFRfQUREUiBhbmQgREJYX1RFWFRfU0laRSwgbm90IERCWF9URVhUX1NFQ1QuICBIYW5kbGUKKwltdWx0aXBsZSBzdGFicyBzZWN0aW9ucy4KKwkqIG9zOWtyZWFkLmMgKG9zOWtfc3ltZmlsZV9yZWFkKTogIFVzZSBEQlhfVEVYVF9BRERSIGFuZAorCURCWF9URVhUX1NJWkUsIHJhdGhlciB0aGFuIGdldHRpbmcgYm90aCBmcm9tIERCWF9URVhUX1NFQ1QuCisJKG9zOWtfc3ltZmlsZV9pbml0KTogU2V0IERCWF9URVhUX0FERFIgYW5kIERCWF9URVhUX1NJWkUsIG5vdAorCURCWF9URVhUX1NFQ1QuCisKKwkqIHJlbW90ZS12eC5jICh2eF9vcHMsIHZ4X3J1bl9vcHMpOiBJbml0aWFsaXplIG5ldyB0b190aHJlYWRfYWxpdmUKKwlmaWVsZC4KKworU2F0IEp1bCAxNSAwMTowMjo1MyAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNvbmZpZy9hbHBoYS9hbHBoYS1vc2YzLm1oLCBjb25maWcvYWxwaGEvbm0tb3NmMy5oOiAgTmV3IGZpbGVzCisJZm9yIE9TRi8xLTMueCBwcm9jZnMgc3VwcG9ydC4KKwkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEtZGVjLW9zZik6ICBVc2UgdGhlbSB3aGVuIGNvbmZpZ3VyaW5nCisJZm9yIE9TRi8xLTMueC4KKwkqIGNvbmZpZ3VyZTogIFVwZGF0ZWQuCisJKiB0YXJnZXQuYzogIEluY2x1ZGUgPHN0cmluZy5oPi4KKworRnJpIEp1bCAxNCAxNjoxNjo1NiAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IFVzZSBvbmUgdmFyaWFibGUsIGZyYWdzLCB0byBob2xkCisJcGF0aG5hbWVzIG9mIG1ha2VmaWxlIGZyYWdtZW50cy4KKwkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZWQuCisKK0ZyaSBKdWwgMTQgMDk6NDk6NDcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHByb2Nmcy5jIChwcm9jZnNfb3BzKTogRml4IHR5cG8gaW4gbGFzdCBjaGFuZ2UuCisKK1RodSBKdWwgMTMgMTM6NDI6MzggMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+CisKKwkqIGluZnRhcmcuYyAoY2hpbGRfdGhyZWFkX2FsaXZlKTogTmV3IGZ1bmN0aW9uIHRvIHNlZSBpZiBhCisJcGFydGljdWxhciB0aHJlYWQgaXMgc3RpbGwgcnVubmluZy4KKwkoY2hpbGRfb3BzKTogQWRkIGNoaWxkX3RocmVhZF9hbGl2ZSBlbnRyeS4KKwkqIHJlbW90ZS5jIChyZW1vdGVfdGhyZWFkX2FsaXZlKTogTmV3IGZ1bmN0aW9uIHRvIHNlZSBpZiBhCisJcGFydGljdWxhciB0aHJlYWQgaXMgc3RpbGwgYWxpdmUuCisJKHJlbW90ZV9vcHMpOiBBZGQgcmVtb3RlX3RocmVhZF9hbGl2ZS4KKwkqIHRhcmdldC5jIChkdW1teV90YXJnZXQpOiBBZGQgZHVtbXkgZW50cnkgZm9yIHRocmVhZF9hbGl2ZS4KKwkoY2xlYW51cF90YXJnZXQpOiBkZV9mYXVsdCB0aHJlYWRfYWxpdmUgdG9vLgorCSh1cGRhdGVfY3VycmVudF90YXJnZXQpOiBJTkhFUklUIHRocmVhZF9hbGl2ZSB0b28uCisJKGRlYnVnX3RvX3RocmVhZF9hbGl2ZSk6IE5ldyBmdW5jdGlvbi4KKwkoc2V0dXBfdGFyZ2V0X2RlYnVnKTogQWRkIGRlYnVnX3RvX3RocmVhZF9hbGl2ZS4KKwkqIHRhcmdldC5oIChzdHJ1Y3QgdGFyZ2V0X29wcyk6IEFkZCB0b190aHJlYWRfYWxpdmUuCisJKHRhcmdldF90aHJlYWRfYWxpdmUpOiBEZWZpbmUuCisJKiB0aHJlYWQuYyAoaW5mb190aHJlYWRzX2NvbW1hbmQpOiBEb24ndCBjYWxsIGtpbGw7IHVzZQorCXRhcmdldF90aHJlYWRfYWxpdmUgaW5zdGVhZC4KKwkqIGNvbmZpZy9ubS1seW54LmggKENISUxEX1RIUkVBRF9BTElWRSk6IERlZmluZS4KKwkqIGdkYnNlcnZlci9sb3ctbHlueC5jIChteXRocmVhZF9hbGl2ZSk6IE5ldyBmdW5jdGlvbi4KKwkobXl3YWl0KTogRG9uJ3QgcmVzdGFydCBhbnkgdGhyZWFkcyBhZnRlciBhIG5ldyB0aHJlYWQgbm90aWZpY2F0aW9uLAorCWxldCB0aGUgZ2VuZXJpYyBjb2RlIGhhbmRsZSBpdC4KKwkqIGdkYnNlcnZlci9sb3ctc3BhcmMuYyAobXl0aHJlYWRfYWxpdmUpOiBEdW1teSB2ZXJzaW9uLgorCSogZ2Ric2VydmVyL2xvdy1zdW4zLmMgKG15dGhyZWFkX2FsaXZlKTogTGlrZXdpc2UuCisJKiBnZGJzZXJ2ZXIvc2VydmVyLmMgKG1haW4pOiBIYW5kbGUgdGhyZWFkX2FsaXZlIHJlcXVlc3RzLgorCSogZ2Ric2VydmVyL3NlcnZlci5oIChteXRocmVhZF9hbGl2ZSk6IERlY2xhcmUuCisJKiBjb3JlbG93LmMgKGNvcmVfb3BzKTogQWRkIGR1bW15IGVudHJ5IGZvciB0aHJlYWRfYWxpdmUuCisJKiBleGVjLmMgKGV4ZWNfb3BzKTogTGlrZXdpc2UuCisJKiBtMy1uYXQuYyAobTNfb3BzKTogTGlrZXdpc2UuCisJKiBtb25pdG9yLmMgKG1vbml0b3Jfb3BzKTogTGlrZXdpc2UuCisJKiBwcm9jZnMuYyAocHJvY2ZzX29wcyk6IExpa2V3aXNlLgorCSogcmVtb3RlLWFycmF5LmMgKGFycmF5X29wcyk6IExpa2V3aXNlLgorCSogcmVtb3RlLWU3MDAwLmMgKGU3MDAwX29wcyk6IExpa2V3aXNlLgorCSogcmVtb3RlLWVzLmMgKGVzMTgwMF9vcHMsIGVzMTgwMF9jaGlsZF9vcHMpOiBMaWtld2lzZS4KKwkqIHJlbW90ZS1taXBzLmMgKG1pcHNfb3BzKTogTGlrZXdpc2UuCisJKiByZW1vdGUtcGEuYyAocmVtb3RlX2hwcHJvX29wcyk6IExpa2V3aXNlLgorCSogcmVtb3RlLXNpbS5jIChnZGJzaW1fb3BzKTogTGlrZXdpc2UuCisJKiBzcGFyY2wtdGRlcC5jIChzcGFyY2xpdGVfb3BzKTogTGlrZXdpc2UuCisKK1R1ZSBKdWwgMTEgMTE6MTU6NTUgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQHJ0bC5jeWdudXMuY29tPgorCisJKiBzb2xpYi5jOiBBZGQgX0RZTkFNSUNfX01HQyBiYXNlIHN5bWJvbCBmb3IgTWVudG9yIEdyYXBoaWNzIEluYy4KKwkqIHNvbGliLmMgKG1hdGNoX21haW4pOiBOZXcgZnVuY3Rpb24gZm9yIGNoZWNraW5nIG5hbWUgb2YgbWFpbi4KKwkqIHNvbGliLmMgKHNvbGliX2FkZCk6IE5vdCB0byBhZGQgaWYgc29saWIgbWF0Y2ggbWFpbi4KKworRnJpIEp1bCAgNyAxNDo0MTo1NiAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAcnRsLmN5Z251cy5jb20+CisKKwkqIGVsZnJlYWQuYyAoZWxmX3N5bXRhYl9yZWFkKTogRml4IGEgYnVnIGlnbm9yaW5nIGNvbXBpbGVyCisJZ2VuZXJhdGVkIGludGVybmFsIGxhYmVscyAoJExNLi4uKS4KKworV2VkIEp1bCAgNSAxMTozODozNiAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAcnRsLmN5Z251cy5jb20+CisKKwkqIGRlZnMuaDogaWYgX19HTzMyX18gb3IgV0lOMzIgdGhlIGRpcmVjdG9yeSBzZXBhcmF0aW5nIHN5bWJvbCBzaG91bGQKKwliZSAnXCcgbm90ICcvJy4KKworCSogcmVtb3RlLW5pbmR5IChuaW5keV93YWl0KTogVXNlIGluZmluaXRlIHRpbWVvdXQgcmVhZGluZyBhZnRlcgorCWVzYWNwZSBjaGFyYWN0ZXIuCisKK1R1ZSBKdWwgIDQgMTA6MzA6MjIgMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+CisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IFdoZW4gc3dpdGNoaW5nIGZyb20gb25lIHRocmVhZCB0bworCWFub3RoZXIsIHNhdmUgaW5mcnVuJ3Mgc3RhdGUgZm9yIHRoZSBvbGQgdGhyZWFkIGFuZCBsb2FkIGluZnJ1bidzCisJcHJldmlvdXMgc3RhdGUgZm9yIHRoZSBuZXcgdGhyZWFkLgorCSogdGhyZWFkLmMgKHN0cnVjdCB0aHJlYWRfaW5mbyk6IEFkZCBuZXcgZmllbGRzIGZvciB0aHJlYWQgc3BlY2lmaWMKKwlzdGF0ZSBzYXZlZC9yZXN0b3JlZCBpbiBpbmZydW4uYy4KKwkoYWRkX3RocmVhZCk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KKwkobG9hZF9pbmZydW5fc3RhdGUpOiBOZXcgZnVuY3Rpb24uCisJKHNhdmVfaW5mcnVuX3N0YXRlKTogTmV3IGZ1bmN0aW9uLgorCSogdGhyZWFkLmggKGxvYWRfaW5mcnVuX3N0YXRlKTogUHJvdmlkZSBleHRlcm5hbCBkZWNsLgorCShzYXZlX2luZnJ1bl9zdGF0ZSk6IExpa2V3aXNlLgorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBXaGVuIHdlIGhpdCBhIGJyZWFrcG9pbnQgZm9yIHRoZQorCXdyb25nIHRocmVhZCwgbWFrZSBzdXJlIHRvIHdyaXRlIHRoZSBmaXhlZCBQQyB2YWx1ZSBpbnRvIHRoZSB0aHJlYWQKKwl0aGF0IHN0b3BwZWQuICBSZXN0YXJ0IGFsbCB0aHJlYWRzIGFmdGVyIHNpbmdsZSBzdGVwcGluZyBvdmVyIGEKKwlicmVha3BvaW50IGZvciBhIGRpZmZlcmVudCB0aHJlYWQuCisJKiBicmVha3BvaW50LmMgKHNldF9tb21lbnRhcnlfYnJlYWtwb2ludCk6IE1ha2UgbW9tZW50YXJ5CisJYnJlYWtwb2ludHMgdGhyZWFkIHNwZWNpZmljIGluIGEgbXVsdGktdGhyZWFkZWQgcHJvZ3JhbS4KKwkqIGx5bngtbmF0LmMgKGNoaWxkX3Jlc3VtZSk6IEFkZCBzb21lIGNvbW1lbnRzLiAgQ29ycmVjdGx5CisJY2hvb3NlIGJldHdlZW4gdGhlIHNpbmdsZSBhbmQgbXVsdGktdGhyZWFkZWQgc3RlcCBhbmQgY29udGludWUKKwlwdHJhY2UgY2FsbHMuCisKK0ZyaSBKdW4gMzAgMTY6MTU6MzYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWcvaDgzMDAvaDgzMDAubXQ6IFJlbmFtZWQgZnJvbSBoODMwMGhtcy5tdC4KKwkqIGNvbmZpZy9oODUwMC9oODUwMC5tdDogUmVuYW1lZCBmcm9tIGg4NTAwaG1zLm10LgorCSogY29uZmlnL3o4ay96OGsubXQ6IFJlbmFtZWQgZnJvbSB6OGtzaW0ubXQuCisJKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjogVXBkYXRlIHRvIHJlZmxlY3QgcmVuYW1pbmdzLgorCisJKiByZW1vdGUtc2ltLmMgKHNpbSk6IE5ldyBjb21tYW5kLCBwYXNzZXMgY29tbWFuZHMgdG8gc2ltdWxhdG9yLgorCShzaW11bGF0b3JfY29tbWFuZCk6IE5ldyBmdW5jdGlvbi4KKwkoZ2Ric2ltX29wcyk6IENsZWFuIHVwLgorCSogcmVtb3RlLXNpbS5oIChzaW1fZG9fY29tbWFuZCk6IERlY2xhcmUuCisJKiBzaC10ZGVwLmMgKG1lbW9yeV9zaXplKTogUmVtb3ZlIGNvbW1hbmQuCisKKwkqIE1ha2VmaWxlLmluIChTSU0sIFNJTV9PQlMpOiBOZXcgdmFyaWFibGVzLgorCShDTElCUywgQ0RFUFMpOiBBZGQgdmFsdWUgb2YgU0lNLgorCShERVBGSUxFUyk6IEFkZCB2YWx1ZSBvZiBTSU1fT0JTCisKKwkqIGNvbmZpZy9hcm0vYXJtLm10LCBjb25maWcvaDgzMDAvaDgzMDAubXQsIGNvbmZpZy9oODUwMC9oODUwMC5tdCwKKwljb25maWcvc2gvc2gubXQsIGNvbmZpZy9zcGFyYy9zcDY0c2ltLm10LCBjb25maWcvdzY1L3c2NS5tdCwKKwljb25maWcvejhrL3o4ay5tdDogUmVtb3ZlIHNpbXVsYXRvciBmaWxlcyBmcm9tIFRERVBGSUxFUywKKwlkZWZpbmUgaW4gU0lNX09CUyBhbmQgU0lNLgorCWNvbmZpZy9zcGFyYy9zcDY0c2ltLm10IChTSU1GSUxFUyk6IFJlbW92ZS4KKworCSogcmVtb3RlLXo4ay5jOiBSZW1vdmUsIHdhcyBzdXBlcnNlZGVkIGJ5IHJlbW90ZS1zaW0uYworCSogTWFrZWZpbGUuaW4sIG1wdy1tYWtlLmluOiBSZW1vdmUgcmVmZXJlbmNlcyB0byByZW1vdGUtejhrLmMuCisKK1N1biBKdW4gMjUgMTU6MzA6NDMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGN5Z251cy5jb20+CisKKwkqIHJlbW90ZS5jIChyZW1vdGVfcmVhZF9ieXRlcywgcmVtb3RlX3dyaXRlX2J5dGVzKTogU2Vjb25kIGFyZworCXNob3VsZCBiZSBjaGFyICosIG5vdCB1bnNpZ25lZCBjaGFyICouCisJKiBkY2FjaGUuaCAobWVteGZlcmZ1bmMpOiBEaXR0by4KKwkqIG1vbml0b3IuYyAobW9uaXRvcl93cml0ZV9tZW1vcnksIG1vbml0b3JfcmVhZF9tZW1vcnlfc2luZ2xlKToKKwlEaXR0by4KKwkobW9uaXRvcl9tYWtlX3NyZWMpOiBMZXQgY29tcGlsZXIgZmlndXJlIHNpemUgb2YgaGV4dGFiLgorCitTYXQgSnVuIDI0IDE5OjI3OjM3IDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgorCisJKiBseW54LW5hdC5jIChjaGlsZF93YWl0KTogRG9uJ3QgcmVzdGFydCBuZXcgdGhyZWFkcyBhbmQgbG9vcAorCXRvIHRoZSB0b3Agb2YgY2hpbGRfd2FpdDsgbGV0IHRoZSBtYWNoaW5lIGluZGVwZW5kZW50IGNvZGUgaW4KKwl3YWl0X2Zvcl9pbmZlcmlvciBkZWFsIHdpdGggbmV3IHRocmVhZCBub3RpZmljYXRpb25zLgorCitGcmkgSnVuIDIzIDExOjUxOjU4IDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1uaW5keSAobmluZHlfbG9hZCk6IFB1dCBpbiB0YXJnZXQgc3BlY2lmaWMgbG9hZCwgaXQncyAKKwkyMCB0aW1lcyBmYXN0ZXIuCisKK1RodSBKdW4gMjIgMjA6MjE6NTkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiB1dGlscy5jIChlcnJvcik6IE1vdmUgbG9jYWwgYGFyZ3MnIG91dHNpZGUgY29uZGl0aW9uYWwsCisJbW92ZSBsb2NhbCBgc3RyaW5nMScgaW5zaWRlLCBkZWNsYXJlIGZ1bmN0aW9uIGFzIHZvaWQgaWYKKwlub24tQU5TSSBjb21waWxlciwgZGVyZWZlcmVuY2UgZXJyb3JfaG9vayB3aGVuIGNhbGxpbmcuCisKKwkqIG1hYy14ZGVwLmMgKHN0ZGFyZy5oKTogRG9uJ3QgaW5jbHVkZS4KKworVGh1IEp1biAyMiAxMzoxMjozMyAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAbWV4aWNhbi5jeWdudXMuY29tPgorCisJKiByZW1vdGUtbmluZHkuYyAobmluZHlfd2FpdCk6IENoYW5nZSB0aW1lb3V0IGluIFNFUklBTF9SRUFEQ0hBUi4KKworV2VkIEp1biAyMSAxMzoyNDo0MSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHBwYW0zLW5hdC5jOiBDaGFuZ2UgSFA4MDBfVEhSRUFEX1NUQVRFIHRvIFRSQUNFX0ZMQVZPUiBhbmQKKwlIUDgwMF9USFJFQURfU1RBVEVfQ09VTlQgdG8gVFJBQ0VfRkxBVk9SX1NJWkUuCisKK1dlZCBKdW4gMjEgMDU6NTc6NTYgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogbW9uaXRvci5jOiBUdXJuIG9uIGNhY2hpbmcuCisJKG1vbml0b3JfcHJpbnRmKTogSWYgYSBeQyB3YXMgc2VudCwgZG9uJ3QgZXhwZWN0IHRvIHNlZSBpdHMKKwllY2hvLgorCShtb25pdG9yX29wZW4pOiBFbmFibGUgY2FjaGluZy4KKwkobW9uaXRvcl9yZXN1bWUsIG1vbml0b3JfbG9hZCk6IEZsdXNoIGNhY2hlLgorCShtb25pdG9yX3hmZXJfbWVtb3J5KTogQ2FsbCBjYWNoZSByb3V0aW5lLgorCShtb25pdG9yX2R1bXBfcmVncyk6IE5ldy4KKwkobW9uaXRvcl9mZXRjaF9yZWdpc3RlcnMpOiAgSWYgbW9uaXRvcl9kdW1wX3JlZ3MgYXZhaWxhYmxlCisJdGhlbiB1c2UgaXQuCisJKG1vbml0b3JfbG9hZCk6IERvbid0IHJlZiBleGVjX2JmZCBpZiBpdCdzIE5VTEwuCisJKG1vbml0b3JfbG9hZF9zcmVjKTogVXNlIG5ldyBtb25pdG9yX21ha2Vfc3JlYyBjYWxsaW5nIGNvbnZlbnRpb24uCisJKG1vbml0b3JfbWFrZV9zcmVjKTogUmV3cml0ZSB0byBjb3BlIHdpdGggdHdvLCB0aHJlZSBhbmQgZm91ciBieXRlCisJYWRkcmVzc2VzLgorCSogcmVtb3RlLWhtcy5jIChobXNfY21kcyk6IEluaXRpYWx6ZSBlbmQtb2YtY29tbWFuZCBkZWxpbS4KKwkqIGRjYWNoZS5oLCBkY2FjaGUuaDogUmV3cml0dGVuLgorCSogcmVtb3RlLmM6IFJlZW5hYmxlIGNhY2hpbmcuCisJKGdldHBrdCk6IFJlZHVjZSBNQVhfVFJJRVMgdG8gMy4KKwkocmVtb3RlX3hmZXJfbWVtb3J5KTogVXNlIGRjYWNoZV94ZmVyX21lbW9yeS4KKwkqIGRlZnMuaCAoZXJyb3JfaG9vayk6IE5ldy4KKwkqIHRvcC5jIChlcnJvcl9ob29rKTogTmV3IGRlZmluaXRpb24uCisJKiB1dGlscy5jIChlcnJvcik6IFVzZSBlcnJvcl9ob29rIGlmIGluaXRpYWxpemVkLgorCSogc3BhcmNsLXRkZXAuYyAoSEFWRV9TT0NLRVRTKTogRG9uJ3QgZGVmaW5lIGlmIEdPMzIgb3IgV0lOMzIuIFVzZSAKKwlIQVZFX1NPQ0tFVFMgaW4gcGxhY2Ugb2YgI2lmbmRlZiBHTzMyLgorCitUdWUgSnVuIDIwIDIyOjE3OjQ0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvcGEvdG0taHBwYS5oIChQU1dfKik6IERlZmluZSBwcm9jZXNzb3Igc3RhdHVzIHdvcmQgbWFza3MuCisJKElOU1RSVUNUSU9OX05VTExJRklFRCk6IEFsbG93IHNwZWNpZmljIHRhcmdldHMgdG8gb3ZlcnJpZGUuCisJKiBjb25maWcvcGEvdG0taHBwYW8uaCAoSU5TVFJVQ1RJT05fTlVMTElGSUVEKTogRGVmaW5lIHRvIHdvcmsKKwlhcm91bmQgbG9zaW5nIG1hY2gga2VybmVsIGJlaGF2aW9yLgorCitUdWUgSnVuIDIwIDEyOjAzOjM2IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbW9uaXRvci5jIChtb25pdG9yX3dhaXQpOiBEb24ndCB1c2UgdGhlIHdhdGNoZG9nIHRpbWVvdXQKKwlpZiBpdHMgdmFsdWUgaXMgMC4KKwkqIHc4OWstcm9tLmMgKHc4OWtfb3Blbik6IERlZmluZSB0byBiZSBzdGF0aWMuCisKKworU2F0IEp1biAxNyAxMDoxNzoxNiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tc29saWIuYyAoc29tX3NvbGliX2FkZCk6IFZhbGlkYXRlIHJlZ2V4cCBhcmd1bWVudC4KKwlEb24ndCBhc3N1bWUgdGhlIGZpcnN0IGVudHJ5IG9uIGRsZCdzIGxpYnJhcnkgbGlzdCBpcyB0aGUgbWFpbgorCXByb2dyYW0uICBEb24ndCBsb2FkIHRoZSBzYW1lIGxpYnJhcnkgbW9yZSB0aGFuIG9uY2UgYW5kIGRvbid0CisJY29uc2lkZXIgdGhlIG1haW4gcHJvZ3JhbSBhIHNoYXJlZCBsaWJyYXJ5LgorCShzb21fc29saWJfc2hhcmVkbGlicmFyeV9jb21tYW5kKTogTmV3IGZ1bmN0aW9uCisJKF9pbml0aWFsaXplX3NvbV9zb2xpYik6IEFkZCAic2hhcmVkbGlicmFyeSIgY29tbWFuZC4KKworVGh1IEp1biAxNSAxNDo1NDo1OCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGFycmF5LXJvbS5jOiBSZW1vdmUsIG5vIGxvbmdlciB1c2VkLgorCisJKiByZW1vdGUtaG1zLmMgKGhtc19vcGVuKTogTWFrZSBzdGF0aWMuCisKKwkqIG1wdy1jb25maWcuaW4gKE1hY1NlcmlhbC5oKTogQ29weSBmcm9tIHZlcnNpb24gaW4ge0NJbmNsdWRlc30sCisJbm90IHtNUFd9SW50ZXJmYWNlczpDSW5jbHVkZXMuCisJKiBzZXItbWFjLmMgKG1hY19iYXVkX3JhdGVfdGFibGUpOiBGaXggdmFsdWUgZm9yIDM4NDAwIGJhdWQuCisKK1dlZCBKdW4gMTQgMTQ6Mjc6MDcgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIGNoLWV4cC55OiAgUmVtb3ZlIGxvdHMgb2YgdW5zdXBwb3J0ZWQgcHJvZHVjdGlvbnMgYW5kIG5hbWVzLgorCUFkZCBzdXBwb3J0IGZvciBJRi1leHByZXNzaW9ucywgT1JJRiwgQU5ESUYsIE5VTSwgYW5kIEFERFIuCisKK1R1ZSBKdW4gMTMgMjE6NDA6MTEgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIHBhcnNlci1kZWZzLmggKGVudW0gcHJlY2VkZW5jZSk6ICBBZGRlZCBQUkVDX0JVSUxUSU5fRlVOQ1RJT04uCisJKiBleHByZXNzaW9uLmggKGVudW0gZXhwX29wY29kZSk6ICBBZGRlZCBVTk9QX0xPV0VSLCBVTk9QX1VQUEVSLAorCVVOVVBfTEVOR1RILgorCSogZXhwcHJpbnQuYyAoZHVtcF9leHByZXNzaW9uKTogIEhhbmRsZSB0aGUgbmV3IGV4cF9vcGNvZGVzLgorCShwcmludF9zdWJleHApOiAgSGFuZGxlIFBSRUNfQlVJTFRJTl9GVU5DVElPTi4KKwkocHJpbnRfc2ltcGxlX20yX2Z1bmMpOiAgUmVtb3ZlZC4KKwkocHJpbnRfc3ViZXhwKTogIFJlbW92ZSBzdXBwb3J0IGZvciBNb2R1bGEyIGJ1aWx0aW4gZnVuY3Rpb25zLgorCSogbTItbGFuZy5jIChtMl9vcF9wcmludF90YWIpOiAgQWRkIHN1cHBvcnQgZm9yIGJ1aWx0aW4gZnVuY3Rpb25zLgorCSogY2gtZXhwLnk6ICBQYXJzZSBMT1dFUiwgVVBQRVIsIGFuZCBMRU5HVEggYnVpbHRpbnMuCisJKHdyaXRlX2xvd2VyX3VwcGVyX3ZhbHVlKTogIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBMT1dFUiBhbmQgVVBQRVIuCisJKHVwcGVyX2xvd2VyX2FyZ3VtZW50LCBsZW5ndGhfYXJndW1lbnQpOiAgUmVtb3ZlZCBub24tdGVybWluYWxzLgorCSogY2gtbGFuZy5jIChjaGlsbF9vcF9wcmludF90YWIpOiAgRW50cmllcyBmb3IgVVBQRVIsIExPV0VSLCBMRU5HVEguCisJKHR5cGVfbG93ZXJfdXBwZXIpOiAgTmV3IGZ1bmN0aW9uLiAgQ2FsY3VsYXRlIExPV0VSL1VQUEVSIG9mIHR5cGUuCisJKHZhbHVlX2NoaWxsX2xlbmd0aCk6ICBOZXcgZnVuY3Rpb24uICBDYWxjYWxhdGUgTEVOR1RIIG9mIEFSUkFZL1NUUklORy4KKwkoZXZhbHVhdGVfc3ViZXhwX2NoaWxsKTogIEhhbmRsZSBVTk9QX0xPV0VSLCBVTk9QX1VQUEVSLCBVTk9QX0xFTkdUSC4KKworTW9uIEp1biAxMiAxMjo0ODoxMyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwlXaW5kb3dzIHN1cHBvcnQgYml0cyBmcm9tIFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4uCisJKiBkZWZzLmg6IERvbid0IGRlY2xhcmUgc3RyY2hyIGFuZCBmcmllbmRzIGlmIFdJTjMyLgorCShESVJOQU1FX1NFUEFSQVRPUik6IE1vdmUgaGVyZSBmcm9tIHNvdXJjZS5jLgorCShTTEFTSF9QLCBTTEFTSF9DSEFSLCBTTEFTSF9TVFJJTkcsIFJPT1RFRF9QKTogTmV3IG1hY3JvcywKKwlzeW1ib2xpYyBkZWZpbml0aW9ucyBmb3IgZmlsZW5hbWUgYml0cy4KKwkqIHRvcC5jIChjZF9jb21tYW5kKTogVXNlIHRoZXNlLgorCSogc291cmNlLmMgKG1vZF9wYXRoLCBvcGVucCk6IERpdHRvLgorCSogdGVybWluYWwuaDogRGlzYWJsZSB0ZXJtaW8vc2d0dHkgZGVmaW5pdGlvbnMgaWYgV0lOMzIuCisJKiBmaW5kdmFyLmMgKHJlZ2lzdGVyc19jaGFuZ2VkKTogQ2FsbCByZWdpc3RlcnNfY2hhbmdlZF9ob29rCisJaWYgaXQgaXMgZGVmaW5lZC4KKworTW9uIEp1biAxMiAxMjoyMjowNSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4sIHJlYWxjbGVhbik6IFJlbW92ZSBjb25maWcuY2FjaGUgYW5kCisJICBjb25maWcubG9nLgorCitNb24gSnVuIDEyIDAwOjIxOjU5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzb21zb2xpYi5jOiBJbmNsdWRlIGdkYi1zdGFicy5oLgorCShzb21fc29saWJfc2VjdGlvbl9vZmZzZXRzKTogVXNlIFNFQ1RfT0ZGX1hYWCByYXRoZXIgdGhhbiAwLCAxLAorCWV0Yy4gIEluaXRpYWxpemUgb2Zmc2V0cyBmb3IgUk9EQVRBICYgQlNTIHRvby4KKworU2F0IEp1biAxMCAxNzo1OToxMSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHBwYS10ZGVwLmMgKGZyYW1lX2NoYWluKTogVHJ5IHRvIGNvbXBlbnNhdGUgZm9yIGluY29tcGxldGUKKwlyZWdpc3RlciBpbmZvcm1hdGlvbiBpbiBjb3JlIGZpbGVzIHdoZW4gYmFja3RyYWNpbmcuCisKK0ZyaSBKdW4gIDkgMTQ6NTE6MzggMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLW5yb20uYzogIFJlbW92ZSBldmVyeXRoaW5nIGJ1dCBkb3dubG9hZCBjb2RlLiAgTW9yZQorCWNsZWFudXBzLgorCitUaHUgSnVuICA4IDE1OjA2OjAwIDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGRlZnMuaCBtYWludC5jIG1vbml0b3IuYyByZW1vdGUtbWlwcy5jIHJlbW90ZS5jOiAgQWRkIHN1cHBvcnQKKwlmb3IgYHdhdGNoZG9nJyB2YXJpYWJsZS4gIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIHB1dCBhbiB1cHBlcgorCWxpbWl0IG9uIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0IEdEQiB3aWxsIHdhaXQgZm9yIHRoZSB0YXJnZXQgdG8KKwlyZXR1cm4gZnJvbSBhIHN0ZXAgb3IgY29udGludWUgb3BlcmF0aW9uLiAgVGhpcyB3aWxsIHByaW1hcmlseSBiZQorCXVzZWQgZm9yIHRoZSB0ZXN0c3VpdGUsIHdoZXJlIGl0IGlzIGRpZmZpY3VsdCB0byBjb21lIHVwIHdpdGggYQorCXJlYXNvbmFibGUgdGltZW91dCBmb3IgdGhpbmdzIGxpa2UgZnVuY3Rpb24gY2FsbHMsIHdoaWNoIGNhbiB0YWtlCisJYXMgbG9uZyBhcyB0aHJlZSBtaW51dGVzIHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcy4gIElmIHRoZQorCXdhdGNoZG9nIHRpbWVyIGV4cGlyZXMsIEdEQiB3aWxsIGdlbmVyYXRlIGFuIGVycm9yIHRoYXQgbG9va3MgbGlrZQorCWBXYXRjaGRvZyBoYXMgZXhwaXJlZC4nLCBhbmQgd2lsbCBkZXRhY2ggZnJvbSB0aGUgdGFyZ2V0LgorCisJKiByZW1vdGUtbWlwcy5jIChtaXBzX29wZW4pOiAgU2V0dXAgaW5pdGlhbCBmcmFtZSBmcm9tIHRhcmdldC4KKwlQcmludCBpdCBvdXQgc28gdGhhdCB1c2VyIGlzIHRvbGQgd2hlcmUgdGhlIHByb2dyYW0gaXMgc3RvcHBlZAorCXdoZW4gdGhleSBhdHRhY2guCisKKwkqIHJlbW90ZS1ucm9tLmM6ICBMb2FkcyBvZiBjbGVhbnVwcy4gIFVzZSBzZXJpYWwgY29kZSB0byBvcGVuCisJbmV0d29yayBjb25uZWN0aW9ucy4gIFVzZSBleHBlY3QoKSB0byB3YWl0IGZvciByZXNwb25zZSB0bworCWRvd25sb2FkIGNvbW1hbmQuCisKKwkqIHNlci10Y3AuYyAodGNwX29wZW4pOiAgUmV0cnkgY29ubmVjdGlvbiBpZiB3ZSBnZXQgRUNPTk5SRUZVU0VELgorCisJKiBzZXJpYWwuYyBzZXJpYWwuaCAoc2VyaWFsX29wZW4gc2VyaWFsX2Zkb3BlbiBzZXJpYWxfY2xvc2UpOgorCUFsbG93IHVzZXJzIHRvIG9wZW4gdGhlIHNhbWUgZGV2aWNlIG11bHRpcGxlIHRpbWVzLiAgVGhleSBhbGwgZ2V0CisJdG8gc2hhcmUgdGhlIHNhbWUgc2VyaWFsX3QuICBUaGlzIGlzIGFib3V0IHRoZSBvbmx5IHdheSB0byBoYXZlCisJbXVsdGlwbGUgYWN0aXZlIHRhcmdldHMgdXNlIHRoZSBzYW1lIGRldmljZSAoZm9yIGRvd25sb2FkIGFuZAorCWRlYnVnKS4KKworCSogc3BhcmNsLXRkZXAuYzogIEtlZXAgI2luY2x1ZGUgPHVuaXN0ZC5oPiBhd2F5IGZyb20gR08zMi4KKworCSogdGFyZ2V0LmM6ICBBZGQgYHRhcmdldGRlYnVnJyB2YXJpYWJsZS4gIElmIHRoaXMgaXMgbm9uLXplcm8sCisJdGhlbiBhIHNwZWNpYWwgdGFyZ2V0IGlzIHB1dCBhdCB0aGUgdG9wIG9mIHRoZSB0YXJnZXQgc3RhY2sgd2hpY2gKKwl3aWxsIGNhdXNlIGFsbCBjYWxscyB0aHJvdWdoIHRoZSB0YXJnZXQgdmVjdG9yIHRvIGhhdmUgdGhlaXIgYXJncworCWFuZCByZXN1bHRzIHByaW50ZWQgb3V0LgorCitXZWQgSnVuICA3IDE3OjQwOjM3IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBjaC1leHAueTogSGFuZGxlIDxwcmltaXRpdmVfdmFsdWU+ICItPiIgPG1vZGVuYW1lPi4KKworV2VkIEp1biAgNyAxNzo0NjozMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIG1lbS1icmVhay5jIChMSVRUTEVfQlJFQUtQT0lOVCk6IElmIEJSRUFLUE9JTlQgYW5kCisJe0xJVFRMRSxCSUd9X0JSRUFLUE9JTlQgYXJlIGFsbCBkZWZpbmVkLCBkb24ndCByZWRlZmluZS4KKwkoQklHX0JSRUFLUE9JTlQpOiBEaXR0by4KKworCSogY29uZmlnL3JzNjAwMC90bS1yczYwMDAuaCAoQlJFQUtQT0lOVCk6IERlZmluZSBhcyBlaXRoZXIKKwlCSUdfQlJFQUtQT0lOVCBvciBMSVRUTEVfQlJFQUtQT0lOVCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldCBieXRlCisJb3JkZXIuCisKK1dlZCBKdW4gIDcgMTI6NDE6NDIgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbXNvbGliLmMgKHNvbV9zb2xpYl9zZWN0aW9uX29mZnNldHMpOiBIYW5kbGUgcmVsYXRpdmUgcGF0aG5hbWVzLgorCisJKiBocHBhLXRkZXAuYyAoZnJhbWVfc2F2ZWRfcGMpOiBIYW5kbGUgYmFja3RyYWNpbmcgdGhyb3VnaCBzaWduYWwKKwloYW5kbGVyIGluIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcy4KKworVHVlIEp1biAgNiAxMDo0NDoyNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwlGcm9tIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisJKiByczYwMDAtdGRlcC5jIChzaW5nbGVfc3RlcCk6IEhhbmRsZSBib3RoIGxpdHRsZSBhbmQgYmlnIGVuZGlhbgorCWJyZWFrcG9pbnRzLgorCShnZGJfcHJpbnRfaW5zbl9wb3dlcnBjKTogRGVhbCB3aXRoIGRpc2Fzc2VtYmxpbmcgYm90aCBsaXR0bGUgYW5kCisJYmlnIGVuZGlhbiBQb3dlclBDIHN5c3RlbXMuCisJKF9pbml0aWFsaXplX3JzNjAwMF90ZGVwKTogVXNlIGdkYl9wcmludF9pbnNuX3Bvd2VycGMgdG8gaGFuZGxlCisJZGlzYXNzZW1ibHksIHJhdGhlciB0aGF0IGFzc3VtaW5nIGJpZyBlbmRpYW4gb3JkZXIuCisKKwkqIGNvbmZpZy9yczYwMDAvdG0tcnM2MDAwLmggKEJSRUFLUE9JTlQpOiBEZWxldGUuCisJKEJJR19CUkVBS1BPSU5UKTogRGVmaW5lLCBiaWcgZW5kaWFuIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uCisJKExJVFRMRV9CUkVBS1BPSU5UKTogRGVmaW5lLCBsaXR0bGUgZW5kaWFuIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uCisKK1NhdCBKdW4gIDMgMDE6NTQ6NTYgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBSRUFETUU6ICBBZGQgbm90ZSBhYm91dCBVbml4d2FyZSAyLnguCisKKwkqIGRieHJlYWQuYyAocHJvY2Vzc19vbmVfc3ltYm9sKTogIENoZWNrIGZvciBleGFjdCBzeW1ib2wgbmFtZQorCW1hdGNoIHdoZW4gZml4aW5nIHVwIE5fR1NZTSBhbmQgTl9TVFNZTSBzeW1ib2xzIGZyb20gU3VuIGFjYy4KKworCSogdmFscHJpbnQuYyAodmFsdWVfcHJpbnRfYXJyYXlfZWxlbWVudHMpOiAgVXNlCisJZnByaW50Zl9maWx0ZXJlZCB0byBwdXQgb3V0IGA8cmVwZWF0cyAldSB0aW1lcz4nLAorCWZyb20gc2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlIChBbmRyZWFzIFNjaHdhYikuCisKKwkqIHZhbHVlLmggKHN0cnVjdCB2YWx1ZSk6ICBDaGFuZ2UgYHJlcGV0aXRpb25zJyBmaWVsZCBmcm9tCisJYHNob3J0JyB0byBgaW50JyB0eXBlLgorCitGcmkgSnVuICAyIDExOjE3OjIzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGFyYy10ZGVwLmMgKGFyY19iZmRfbWFjaF90eXBlKTogTmV3IHN0YXRpYyBnbG9iYWwuCisJKGNvZGVzdHJlYW1fZmlsbCk6IEhhbmRsZSBieXRlIG9yZGVyIGRpZmZlcmVuY2VzLgorCShzZXR1cF9wcm9sb2d1ZV9zY2FuKTogRG9uJ3QgcmVhZCBzdGRhcmcgZnVuY3Rpb24ncyAic3ViIHNwLHNwLE4iLgorCShhcmNfZ2V0X2ZyYW1lX3NldHVwKTogUmVhZCBpdCBoZXJlLgorCShhcmNfZnJhbWVfc2F2ZWRfcGMpOiBBbmQgaGVyZS4KKwkoYXJjX3ByaW50X2luc24pOiBOZXcgZnVuY3Rpb24uCisJKGFyY19zZXRfY3B1X3R5cGUpOiBTZXQgYXJjX2JmZF9tYWNoX3R5cGUuICBEb24ndCBzZXQgdG1fcHJpbnRfaW5zbi4KKwkoX2luaXRpYWxpemVfYXJjX3RkZXApOiBTZXQgdG1fcHJpbnRfaW5zbiB0byBhcmNfcHJpbnRfaW5zbi4KKworV2VkIE1heSAzMSAxMjowNDowMSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIG5sbS97Y29uZmlndXJlLmluLCBNYWtlZmlsZS5pbn06IENvbnZlcnRlZCB0byB1c2UgYXV0b2NvbmYuCisJKiBubG0vY29uZmlndXJlOiBOZXcgZmlsZSwgZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYgMi4zLgorCisJKiBubG0vY29uZmlndXJlLmluOiBVc2Ugc2VkIGluc3RlYWQgb2YgYXdrIHRvIGdldCB0aGUgdmFsdWUgb2YKKwkgIGNwdWZpbGUuICBBd2sgaXMgbm90IGEgdXRpbGl0eSByZXF1aXJlZCBieSB0aGUgR05VIGNvZGluZworCSAgc3RhbmRhcmRzLiAgVGhpcyBjaGFuZ2UgYWxzbyBmaXhlcyB0aGUgcmlnaWQgd2hpdGVzcGFjZQorCSAgcmVxdWlyZW1lbnRzIHRoYXQgd2VyZSByZXF1aXJlZCBmb3IgYXdrLgorCisJKiBzcGFyY2xpdGUvYWxvYWQuYzogVXNlIGEgZmlsZSBkZXNjcmlwdG9yIGluc3RlYWQgb2YgYSBzdGRpbworCSAgc3RyZWFtIGZvciBpL28gd2l0aCB0YXJnZXQgYm9hcmQuCisJICBVc2UgI2Vycm9yIGlmIEhBVkVfVEVSTUlPUyBpcyBub3QgZGVmaW5lZC4KKworCSogc3BhcmNsaXRlL3tNYWtlZmlsZS5pbiwgY29uZmlndXJlLmlufTogQ29udmVydGVkIHRvIHVzZQorCSAgYXV0b2NvbmYuCisJKiBzcGFyY2xpdGUvY29uZmlndXJlOiBOZXcgZmlsZSwgZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYgMi4zLgorCitTdW4gTWF5IDI4IDIzOjEwOjA3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBkZWZzLmg6IEluY2x1ZGUgZWl0aGVyIHZhcmFyZ3MuaCBvciBzdGRhcmcuaCAoZm9yIHZhX2xpc3QpLgorCUZpeCBzdHVwaWQgdGhpbmtvIGluIGxhc3QgY2hhbmdlICgiLi4uIiAtPiAidmFfbGlzdCIpLgorCisJKiBkZWZzLmggKHZwcmludGZfZmlsdGVyZWQgZGVjbGFyYXRpb24pOiBBZGQgUEFSQU1TIHByb3RvdHlwZTsKKwlnY2MtMi41IGNob2tlcyBvbiBmb3JtYXQgYXR0cmlidXRlcyBmb3IgdW5wcm90b3R5cGVkIGZ1bmN0aW9ucy4KKwkodmZwcmludGZfZmlsdGVyZWQgZGVjbGFyYXRpb24pOiBMaWtld2lzZS4KKwkodnByaW50Zl91bmZpbHRlcmVkIGRlY2xhcmF0aW9uKTogTGlrZXdpc2UuCisJKHZmcHJpbnRmX3VuZmlsdGVyZWQpLiBMaWtld2lzZS4KKworU2F0IE1heSAyNyAyMzo1NDoxNyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogVXNlIHNlZCBpbnN0ZWFkIG9mIGF3ayB0byBnZXQgdGhlIHZhbHVlcyBvZgorCSAgaG9zdGZpbGUsIHRhcmdldGZpbGUgYW5kIG5hdGl2ZWZpbGUuICBBd2sgaXMgbm90IGEgdXRpbGl0eQorCSAgcmVxdWlyZWQgYnkgdGhlIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLiAgVGhpcyBjaGFuZ2UgYWxzbyAKKwkgIGZpeGVzIHRoZSByaWdpZCB3aGl0ZXNwYWNlIHJlcXVpcmVtZW50cyB0aGF0IHdlcmUgcmVxdWlyZWQKKwkgIGZvciBhd2suCisJKiBjb25maWd1cmU6IHJlZ2VuZXJhdGVkLgorCitTYXQgTWF5IDI3IDE2OjI0OjA0IDE5OTUgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgIDxhbmdlbGFAY2lyZGFuLmN5Z251cy5jb20+CisKKyAgICAgICAgKiBzcGFyY2xpdGUve01ha2VmaWxlLGNvbmZpZ3VyZX0uaW46IEFkZCBob29rcyBmb3IgYnVpbGRpbmcgd2l0aAorICAgICAgICAtbHNvY2tldCAmIC1sbnNsIGZvciBzb2xhcmlzMi4gIERvbid0IGJ1aWxkIGFsb2FkL2Vsb2FkIGZvciBET1MuCisKK1RodSBNYXkgMjUgMTI6NDY6MzcgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYnNlcnZlci9yZW1vdGUtdXRpbHMuYyAocHJlcGFyZV9yZXN1bWVfcmVwbHkpOiBBZGQgRklYTUUKKwljb21tZW50IHJlZ2FyZGluZyBzaWduYWwgbnVtYmVyaW5nLgorCitXZWQgTWF5IDI0IDE1OjQ5OjQ3IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGFybS10ZGVwLmMgKF9pbml0aWFsaXplX2FybV90ZGVwKTogVXNlIHByaW50X2luc25fbGl0dGxlX2FybQorCW5vdy4KKworCSogYXJtLXRkZXAuYyAoY29udmVydF9mcm9tX2V4dGVuZGVkLCBjb252ZXJ0X3RvX2V4dGVuZGVkKToKKwlOZXcuCisJKiBjb2ZmcmVhZC5jIChlbnRlcl9saW5lbm9zKTogUmV0dXJuIGlmIGxpbmV0YWIgMC4KKwkqIGNvbmZpZy9hcm0vYXJtLm10IChUREVQRklMRVMpOiBBZGQgc2ltdWxhdG9yIHN1cHBvcnQuCisJKiBjb25maWcvYXJtL3RtLWFybS5oIChGUkFNRV9GSU5EX1NBVkVEX1JFR1MpOiBGaXggcHJvdG90eXBlcy4KKworTW9uIE1heSAyMiAxOTozNzoyMSAxOTk1ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9pZHQubXQ6IHJlcGxhY2UgbW9uaXRvciBhbmQgYXJyYXktcm9tIHdpdGggdGhlIG5ldworCXJlbW90ZS1hcnJheS4KKworTW9uIE1heSAyMiAxNTozODoyNSAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiByZW1vdGUtbmluZHkuYzogIEluc3RhbGwgS3VuZyBwYXRjaCBmb3IgUFIgNjgyMC4gIEkgaGF2ZSBubyBpZGVhCisJd2hhdCB0aGlzIGRvZXMuLi4KKworCSogYnJlYWtwb2ludC5jOiAgTW92ZSBkZWZhdWx0cyBvZiB3YXRjaHBvaW50IHJlbGF0ZWQgbWFjcm9zIGludG8KKwl0YXJnZXQuaC4KKwkqIHRhcmdldC5oOiAgTWFjcm9zIGZyb20gYnJlYWtwb2ludC5jLiAgQ29uZGl0aW9uYWxpemUgYmFzZWQgb24KKwlUQVJHRVRfSEFTX0hBUkRXQVJFX1dBVENIUE9JTlRTLgorCSogaTM4NnYtbmF0LmMgcHJvY2ZzLmM6ICBVc2UgVEFSR0VUX0hBU19IQVJEV0FSRV9XQVRDSFBPSU5UUworCWluc3RlYWQgb2YgVEFSR0VUX0NBTl9VU0VfSEFSRFdBUkVfV0FUQ0hQT0lOVCB0byBlbmFibGUgd2F0Y2hwb2ludAorCWNvZGUuCisJKiBjb25maWcvaTM4Ni9ubS1saW51eC5oLCBjb25maWcvbWlwcy9ubS1pcml4NC5oLAorCWNvbmZpZy9wYS9ubS1ocHBhYi5oLCBjb25maWcvc3BhcmMvdG0tc3BhcmNsaXRlLmg6ICAjZGVmaW5lCisJVEFSR0VUX0hBU19IQVJEV0FSRV9XQVRDSFBPSU5UUyB0byBlbmFibGUgd2F0Y2hwb2ludCBjb2RlLgorCitNb24gTWF5IDIyIDA2OjQ3OjMwIDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBicmVha3BvaW50LmMsIHRhcmdldC5oOiBNb3ZlIGRlZmF1bHRzIG9mIHdhdGNocG9pbnQgcmVsYXRlZAorCW1hY3JvcyBiYWNrIHRvIGJyZWFrcG9pbnQuYy4gIFJlcXVpcmVkIHRvIGdldCBHREIgY29tcGlsaW5nCisJb24gU29sYXJpcyBhZ2Fpbi4KKworRnJpIE1heSAxOSAxNDo0OTozNyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIGRlZnMuaCAoQVRUUl9GT1JNQVQpOiBOZXcgbWFjcm8sIGV4cGFuZHMgdG8gZ2NjJ3MgZm9ybWF0CisJICBhdHRyaWJ1dGUgd2hlbiBjb21waWxlZCBieSBnY2MuICAKKwkqIGRlZnMuaCwgbGFuZ3VhZ2UuaCwgbW9uaXRvci5oOiBDaGFuZ2VkIG1hbnkgZnVuY3Rpb24KKwkgIGRlY2xhcmF0aW9ucyB0byB1c2UgQVRUUl9GT1JNQVQuCisKKwkqIGJyZWFrcG9pbnQuYyAoZGVsZXRlX2NvbW1hbmQpOyBzb3VyY2UuYyAoZGlyZWN0b3J5X2NvbW1hbmQpOworCSAgdG9wLmMgKGRlZmluZV9jb21tYW5kKTogQ2hhbmdlZCBjYWxsIHRvIHF1ZXJ5KCkgdGhhdCBoYWQgdG9vCisJICBtYW55IGFyZ3VtZW50cy4KKwkqIHByaW50Y21kLmMgKGFkZHJlc3NfaW5mbyk6IENoYW5nZWQgY2FsbCB0byBwcmludGZfZmlsdGVyZWQoKQorCSAgdGhhdCBoYWQgdG9vIG1hbnkgYXJndW1lbnRzLgorCitGcmkgTWF5IDE5IDA5OjUyOjA3IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBNb3ZlIGFzc2lnbm1lbnRzIHRvIHN0b3Bfc2lnbmFsCisJYW5kIHN0b3BfcGMsIGFuZCBTVE9QUEVEX0JZX1dBVENIUE9JTlQgY29kZSwgYmFjayB3aGVyZSB0aGV5CisJd2VyZS0tYWZ0ZXIgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgb24gdy5raW5kLiAgWW91IGNhbid0IHJlYWQgdGhlCisJcmVnaXN0ZXJzIG9mIGFuIGluZmVyaW9yIHdoaWNoIGhhcyBleGl0ZWQuICBVc2UgYSBnb3RvIGluIHRoZQorCVNUT1BQRURfQllfV0FUQ0hQT0lOVCBjb2RlLgorCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogUmVpbnN0YXRlCisJSEFWRV9TVEVQUEFCTEVfV0FUQ0hQT0lOVCBhbmQgSEFWRV9DT05USU5VQUJMRV9XQVRDSFBPSU5UIGNvZGUuCisKK0ZyaSBNYXkgMTkgMDY6MTU6NDAgMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGRlbmViLmN5Z251cy5jb20+CisKKwkqIHV0aWxzLmMsIGNvbXBsYWludHMuYywgbGFuZ3VhZ2UuYywgbW9uaXRvci5jLCByZW1vdGUtYXJyYXkuYywKKwlyZW1vdGUtbWlwcy5jLCByZW1vdGUtb3M5ay5jLCByZW1vdGUtc3QuYzogQ29uZGl0aW9uYWxpemUgdXNlIG9mCisJc3RkYXJnIHJhdGhlciB0aGFuIHZhcmFyZ3Mgb24gQU5TSV9QUk9UT1RZUEVTIG5vdCBfX1NURENfXzsgaXQKKwltdXN0IG1hdGNoIHRoZSBkZWZpbml0aW9uIG9mIFBBUkFNUy4KKworVGh1IE1heSAxOCAxNTo1ODo0NiAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIHV0aWxzLmMgKGZwcmludGZfZmlsdGVyZWQsIGZwcmludGZfdW5maWx0ZXJlZCwgZnByaW50ZmlfZmlsdGVyZWQsCisJICBwcmludGZfZmlsdGVyZWQsIHByaW50Zl91bmZpbHRlcmVkLCBwcmludGZpX2ZpbHRlcmVkLCBxdWVyeSwgd2FybmluZywKKwkgIGVycm9yLCBmYXRhbCwgZmF0YWxfZHVtcF9jb3JlKTogVXNlIHN0ZGFyZy5oIG1hY3JvcyB3aGVuIGNvbXBpbGluZyAKKwkgIHdpdGggYW4gQU5TSSBjb21waWxlci4KKwkqIGNvbXBsYWludHMuYyAoY29tcGxhaW4pOiBMaWtld2lzZS4KKwkqIGxhbmd1YWdlLmMgKHR5cGVfZXJyb3IsIHJhbmdlX2Vycm9yKTogTGlrZXdpc2UuCisJKiBtb25pdG9yLmMgKG1vbml0b3JfcHJpbnRmLCBtb25pdG9yX3ByaW50Zl9ub2VjaG8pOiBMaWtld2lzZS4KKwkqIHJlbW90ZS1hcnJheS5jIChwcmludGZfbW9uaXRvciwgZGVidWdsb2dzKTogTGlrZXdpc2UuCisJKiByZW1vdGUtbWlwcy5jIChtaXBzX2Vycm9yKTogTGlrZXdpc2UuCisJKiByZW1vdGUtb3M5ay5jIChwcmludGZfbW9uaXRvcik6IExpa2V3aXNlLgorCSogcmVtb3RlLXN0LmMgKHByaW50Zl9zdGRlYnVnKTogTGlrZXdpc2UuCisKKwkqIGRlZnMuaCwgY29tcGxhaW50cy5oLCBsYW5ndWFnZS5oLCBtb25pdG9yLmg6IEFkZCBwcm90b3R5cGVzIHRvCisJICBtYXRjaCBhYm92ZSBjaGFuZ2VzLgorCisJKiBwcmludGNtZC5jOiBSZW1vdmUgdW5lZWRlZCAjaW5jbHVkZSA8dmFyYXJncy5oPi4KKwkqIHJlbW90ZS1lNzAwMC5jOiBMaWtld2lzZS4KKworCSogZi10eXBlcHJpbnQuYyAoZl90eXBlX3ByaW50X2Jhc2UpOiBGaXggdHlwbyBmb3VuZCBieSBhYm92ZQorCSAgY2hhbmdlcy4KKworV2VkIE1heSAxNyAxMToyMTozMiAxOTk1ICBKaW0gS2luZ2RvbiAgPGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKHhjb2ZmcmVhZC5vKTogRGVwZW5kIG9uIHBhcnRpYWwtc3RhYi5oLgorCisJKiB4Y29mZnNvbGliLmMgKHNoYXJlZGxpYnJhcnlfY29tbWFuZCk6IE5ldyBjb21tYW5kLgorCSogeGNvZmZzb2xpYi5jIChzb2xpYl9pbmZvKTogQ2FsbCB4Y29mZl9yZWxvY2F0ZV9zeW10YWIuCisJKiB4Y29mZnNvbGliLmM6IE1pc2NlbGxhbmVvdXMgY2xlYW51cHMuCisKKwkqIHBhcnRpYWwtc3RhYi5oOiBJZ25vcmUgc3ltYm9sIGRlc2NyaXB0b3IgJy0nIChmb3IgbG9jYWwKKwl2YXJpYWJsZXMgd2l0aCBuZWdhdGl2ZSB0eXBlIG51bWJlcnMpIHdpdGhvdXQgY29tcGxhaW50LgorCisJKiByczYwMDAtbmF0LmMgKHZtYXBfbGRpbmZvKTogVXNlIGJmZF9zdGF0IHJhdGhlciB0aGFuIG91ciBvd24KKwlsb2NhbCBlbXVsYXRpb24gdGhlcmVvZi4gIFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgb3N0YXJ0LgorCitXZWQgTWF5IDE3IDE1OjU1OjUzIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGNvbmZpZy5zdGF0dXMpOiBjaGFuZ2VkIHRhcmdldCBzbyB0aGF0CisJICBjb25maWcuc3RhdHVzIC0tcmVjaGVjayBpcyBleGVjdXRlZCBpZiBjb25maWd1cmUgc2NyaXB0IGNoYW5nZXMuCisKKwkqIG1vbml0b3IuYyAobW9uaXRvcl9wcmludGYpOiBDaGFuZ2VkIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGluCisJICBlcnJvciBtZXNzYWdlIHRvIHdvcmsgd2l0aCBwcmUtYW5zaSBjb21waWxlcnMuCisJICAobW9uaXRvcl9sb2FkX3NyZWMpOiByZWR1Y2VkIGxlbmd0aCBvZiBzLXJlY29yZHMgZnJvbSAxMjggdG8gMzIKKwkgIGJ5dGVzIHNvIGRvd25sb2FkIGlzIG1vcmUgcmVsaWFibGUgd2l0aCB0aGUgcm9tNjhrIG1vbml0b3IuCisKKwkqIHJvbTY4ay1yb20uYzogQWRkZWQgdHJhaWxpbmcgc3BhY2UgdG8gcHJvbXB0IHN0cmluZy4KKworCSogY29uZmlnL2kzODYveG0taTM4NnNjby5oIChIQVZFX1NUUlNUUik6IFJlbW92ZWQuCisJKiBjb25maWcvaTM4Ni94bS1nbzMyLmgsIG1zd2luL3htLmggKFNZU19TSUdMSVNUX01JU1NJTkcpOgorCSAgUmVtb3ZlZC4KKwkqIGRlZnMuaCwgY29uZmlnL3t4bS1seW54LmgsIHhtLW5ic2QuaH0sCisJICBjb25maWcvaTM4Ni97eG0taTM4NmJzZC5oLCB4bS1saW51eC5ofSwKKwkgIGNvbmZpZy9tNjhrL3htLWhwMzAwYnNkLmgsIGNvbmZpZy9taXBzL3htLWlyaXg0LmgsCisJICBjb25maWcvbnMzMmsveG0tbnMzMmttMy5oLCBkb2MvZ2RiaW50LnRleGluZm8KKwkgIChQU0lHTkFMX0lOX1NJR05BTF9IKTogUmVtb3ZlZC4KKworVHVlIE1heSAxNiAxMzoxNjowNiAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IEFkZGVkIGNvbmZpZy5zdGF0dXMgdG8gZGVwZW5kZW5jeSBsaXN0LgorCisJKiBjb25maWd1cmUuaW46IEFkZGVkIElOSVQtQ01EUyBhcmd1bWVudCB0byBBQ19PVVRQVVQgd2hpY2ggc2V0cworCSAgZ2RiX2hvc3RfY3B1LCBnZGJfdGFyZ2V0X2NwdSBhbmQgbmF0aXZlZmlsZS4KKwkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZWQuCisKK01vbiBNYXkgMTUgMjM6NTA6NTEgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3N5bWJvbCk6ICBEbyBub3QgcmVsb2NhdGUgc3RCbG9jay9zY1RleHQKKwlzeW1ib2xzLCB0aGVpciB2YWx1ZSBpcyB0aGUgZGlzcGxhY2VtZW50IGZyb20gdGhlIHByb2NlZHVyZSBhZGRyZXNzLgorCSogdG9wLmMgKGluaXRfbWFpbik6ICBBZGQgbWlzc2luZyBuZXdsaW5lcyB0byBoZWxwIHN0cmluZ3MgZm9yCisJYGlmJyBhbmQgYHdoaWxlJyBjb21tYW5kcywgZml4IGhlbHAgc3RyaW5nIGZvciBgc2hvdyBjb21tYW5kcycuCisKK01vbiBNYXkgMTUgMTg6Mzc6NTYgMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jOiAgTW92ZSBkZWZhdWx0cyBvZiB3YXRjaHBvaW50IHJlbGF0ZWQgbWFjcm9zIGludG8KKwl0YXJnZXQuaC4gIFVzZSBCUF9URU1QRkxBRyBhbmQgQlBfSEFSRFdBUkVGTEFHIGluc3RlYWQgb2YKKwljb25zdGFudHMuCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiAgRW5oYW5jZSBjb21tZW50IG5lYXIKKwlTVE9QUEVEX0JZX1dBVENIUE9JTlQuCisJKiB0YXJnZXQuaDogIE1hY3JvcyBmcm9tIGJyZWFrcG9pbnQuYy4KKworTW9uIE1heSAxNSAxNzoxMTozOCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9pMzg2L3tpMzg2c29sMi5taCwgaTM4NnY0Lm1oLCBuY3IzMDAwLm1ofSwKKwkgIGNvbmZpZy9tNjhrL202OGt2NC5taCwgY29uZmlnL21pcHMve2lyaXg0Lm1oLCBpcml4NS5taCwKKwkgIG1pcHN2NC5taH0sIGNvbmZpZy9zcGFyYy9zdW40c28yLm1oIChJTlNUQUxMKTogUmVtb3ZlZCwgZmlndXJlZAorCSAgb3V0IGJ5IGF1dG9jb25mLgorCSogY29uZmlnL2Fwb2xsbzY4di5taCAoUkFOTElCKTogUmVtb3ZlZCwgZmlndXJlZCBvdXQgYnkgYXV0b2NvbmYuCisKKwkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IENvbnZlcnRlZCB0byB1c2UgYXV0b2NvbmYKKwkqIGFjbG9jYWwubTQ6IE5ldyBmaWxlLCBsb2NhbCBhdXRvY29uZiBtYWNybyBkZWZpbml0aW9ucy4KKwkqIGNvbmZpZ3VyZTogTmV3IGZpbGUsIGdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuMy4KKworTW9uIE1heSAxNSAxNDo0Njo0MSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS5jIChyZW1vdGVfa2lsbCk6IEFkZCBwcm90b3R5cGUuCisJKiBjcHUzMmJ1Zy1yb20uYyAoY3B1MzJidWdfb3Blbik6IFByb3Blcmx5IGRlZmluZSBhcyBzdGF0aWMuCisJKiBjb25maWcvaDgzMDAvaDgzMDBobXMubXQgKFRERVBGSUxFUyk6IEFkZCBtb25pdG9yLm8uCisKK01vbiBNYXkgMTUgMTI6MTI6MzQgMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogc3BhcmNsaXRlL3NhbGliLmMgKHdpbl9vdmYgd2luX3VuZik6ICBNYWtlIHdpbmRvdyBzaXplIGNvbnN0YW50CisJaW50byBhIHZhcmlhYmxlIChfX1dJTlNJWkUpIHNvIHRoYXQgaXQgY2FuIGJlIGNvbnRyb2xsZWQgdmlhIHRoZQorCS5oIGZpbGUuCisJKiBzcGFyY2xpdGUvc3BhcmNsaXRlLmg6ICBBZGQgU0w5MzMgI2lmZGVmIHRvIHNldCBfX1dJTlNJWkUgdG8gNgorCWZvciB0aGUgOTMzIGJvYXJkLgorCisJKiBpbmZydW4uYzogIEFkZCAjaWZkZWYgSFBfT1NfQlVHIHRvIGFsbCByZWZlcmVuY2VzIHRvCisJdHJhcF9leHBlY3RlZF9hZnRlcl9jb250aW51ZS4KKwkqICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBGaXggZm9yIHJlbW90ZSB3YXRjaHBvaW50cy4gIERvbid0IHRyeSB0bworCWluc2VydCBicmVha3BvaW50cyB3aGlsZSB0YXJnZXQgaXMgcnVubmluZyAodGhpcyBvbmx5IHdvcmtzIG9uCisJKnNvbWUqIG5hdGl2ZSB0YXJnZXRzKS4gIFRoaXMgbWF5IGFsc28gc3BlZWQgdXAgbmF0aXZlIHdhdGNocG9pbnRzCisJY29uc2lkZXJhYmx5LgorCitTYXQgTWF5IDEzIDEzOjU1OjA0IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBkd2FyZnJlYWQuYyAoc3RydWN0IGR3ZmluZm8pLCBkYnhyZWFkLmMgKHN0cnVjdCBzeW1sb2MpLAorCW1kZWJ1Z3JlYWQuYyAoc3RydWN0IHN5bWxvYyksIGhwcmVhZC5jIChzdHJ1Y3Qgc3ltbG9jKSwKKwl4Y29mZnJlYWQuYyAoc3RydWN0IHN5bWxvYyk6IEZpeCBpbmFjY3VyYXRlIGNvbW1lbnQgaW50cm9kdWNlZAorCTIwIEFwciAxOTk1LgorCitTYXQgTWF5IDEzIDEzOjM0OjE4IDE5OTUgIEppbSBLaW5nZG9uICA8a2luZ2RvbkBkZW5lYi5jeWdudXMuY29tPgorCisJKiByczYwMDAtdGRlcC5jIChmaW5kX3RvY19hZGRyZXNzKTogUmV2aXNlIGNvbW1lbnQuCisJKiBzeW1maWxlLmMsIHN5bWZpbGUuaCAoaW5pdF9wc3ltYm9sX2xpc3QpOiBOZXcgZnVuY3Rpb247CisJY29uc29saWRhdGUgZHVwbGljYXRlZCBjb3BpZXMgZnJvbSBvczlrcmVhZC5jLCBkYnhyZWFkLmMKKwlhbmQgZHdhcmZyZWFkLmMuCisJKiBkZWZzLmg6IERlY2xhcmUgaW5mb192ZXJib3NlLgorCSogeGNvZmZyZWFkLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHN1cHBvcnQgcHN5bXRhYnMuCisKK0ZyaSBNYXkgMTIgMTM6NDg6NDEgMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGNwdTMyYnVnLXJvbS5jIHJlbW90ZS1lc3QuYyByb202OGstcm9tLmM6ICBVcGRhdGUgbGluZV90ZXJtIGVsZW1lbnQuCisKK0ZyaSBNYXkgMTIgMDY6Mzk6MzAgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHBhcnRpYWwtc3RhYi5oOiBFeHBhbmQgY29tbWVudHMuCisKK1RodSBNYXkgMTEgMTk6MDE6MzcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIFN1cHBvcnQgZGVidWdnaW5nIHVzaW5nIG5hdGl2ZSBNQUNIIHByaW1pdGl2ZXMgb24gaHBwYSotKi1vc2YqLgorCSogY29uZmlndXJlLmluOiBocHBhKi0qLW9zZiogIT0gaHBwYSotKi1ic2QqIGFueW1vcmUuCisJKiBjb25maWcvcGEvaHBwYW9zZi5taDogTmV3IGZpbGUuCisJKiBjb25maWcvcGEvbm0taHBwYW8uaDogTGlrZXdpc2UuCisJKiBocHBhbTMtbmF0LmM6IExpa2V3aXNlLgorCSogY29uZmlnL3BhL3RtLWhwcGFvLmggKFBTV19TUyk6IERlZmluZSBmb3Igc2luZ2xlLXN0ZXBwaW5nLgorCShNQUNISU5FX0NQUk9DXypfT0ZGU0VUKTogRGVmaW5lLgorCShUUkFDRV8qKTogRGVmaW5lLgorCShTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCk6IERlbGV0ZSBkZWZpbml0aW9uLgorCitXZWQgTWF5IDEwIDE4OjU5OjI2IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBocHBhLXRkZXAuYyAocmVhZF91bndpbmRfaW5mbyk6ICBDb3NtZXRpYyBjbGVhbnVwLgorCSogKHVud2luZF9jb21tYW5kKTogIENsZWFuIGl0IHVwIGFuZCBtYWtlIGl0IHByaW50IHRoaW5ncyBvdXQKKwluaWNlci4KKwkqIG1vbml0b3IuYzogIEFkZCBeQyBoYW5kbGluZyBjYXBhYmlsaXR5IChtb3N0bHkgcmlwcGVkIG9mZiBmcm9tCisJcmVtb3RlLmMpLgorCSogKG1vbml0b3JfcHJpbnRmKTogIE1ha2UgaXQgY2hlY2sgdGhlIGNvbW1hbmQgZWNoby4KKwkqIChtb25pdG9yX3ByaW50Zl9ub2VjaG8pOiAgU2ltaWxhciB0byBhYm92ZSwgYnV0IGRvZXNuJ3QgY2hlY2sKKwlmb3IgZWNoby4KKwkqIChtb25pdG9yX3N0b3ApOiAgTm8gbG9uZ2VyIHdhaXRzIGZvciBwcm9tcHQuICBUaGF0IGlzIHRoZSBqb2Igb2YKKwl0aGUgY2FsbGVyLiAgVGhpcyBtYWtlcyB0aGluZ3Mgd29yayBtdWNoIGJldHRlciBmb3IgbW9uaXRvcl93YWl0LAorCXdoaWNoIHdhaXRzIGZvciB0aGUgcHJvbXB0IGl0c2VsZi4KKwkqIChtb25pdG9yX29wZW4pOiAgRGVhbCB3aXRoIG5ldyBtb25pdG9yX3N0b3Agc2VtYW50aWNzLiAgQWxzbywKKwlmbHVzaCBpbnB1dCBhZnRlciBzZW5kaW5nIGluaXQgc3RyaW5ncyB0byBnZXQgcmlkIG9mIGp1bmsgdGhhdCBtYXkKKwliZSBvdXRwdXQuICBBbHNvLCBkb24ndCBhbHdheXMgc2VuZCBcciB0byByZW1vdGUuICBVc2UKKwltb25pdG9yX29wcy0+bGluZV90ZXJtIGN1eiBwcm9wZXIgY2hhcmFjdGVyIGlzbid0IGFsd2F5cyBcci4KKwkqIChtb25pdG9yX2ZldGNoX3JlZ2lzdGVyKTogIFN3aXRjaCB0byBjb21wbGV0ZWx5IGRpZmZlcmVudAorCWFsZ29yaXRobSB0byBkZWFsIHdpdGggbGFtZS1hc3MgbW9uaXRvcnMgd2hpY2ggcHV0IHNwYWNlcyBpbiB0aGUKKwltaWRkbGUgb2YgbnVtYmVycywgYW5kIHByb21wdCB3aXRoIGEgc3BhY2UhISEhIQorCSogKG1vbml0b3JfcmVhZF9tZW1vcnlfc2luZ2xlKTogIE5ldyByb3V0aW5lIHRvIGJlIHVzZWQgd2l0aAorCW1vbml0b3JzIHRoYXQgY2FuIG9ubHkgcmV0dXJuIG9uZSBieXRlL3Nob3J0L2xvbmcgYXQgYSB0aW1lLiAgVGhpcworCWlzIHNlbGVjdGVkIHZpYSBNT19HRVRNRU1fUkVBRF9TSU5HTEUuCisJKiAobW9uaXRvcl9sb2FkX3NyZWMpOiAgVXNlIG1vbml0b3JfcHJpbnRmX25vZWNobyBmb3Igc2VuZGluZyBTCisJcmVjb3Jkcy4gIE1vc3QgdGFyZ2V0cyBkb24ndCBlY2hvIHRoZW0uCisJKiAobW9uaXRvci5oKTogIEdldCByaWQgb2YgY21kX2RlbGltLiAgQWRkIGxpbmVfZGVsaW0uCisJKiBvcDUwbi1yb20uYyAob3A1MG5fY21kcyk6ICBGaWxsIGl0IHVwLiAgTWFrZSBpdCB3b3JrLgorCSogdzg5ay1yb20uYzogIENoYW5nZSBhbGwgZW9scyBmcm9tIFxyIHRvIFxuLiAgQ2hhbmdlIGxvYWRfcmVzcCB0bworCV5RIHRvIHByZXZlbnQgZXJyb3IgbWVzc2FnZS4KKwkqIGNvbmZpZy9wYS90bS1ocHBhLmggKENBTExfRFVNTVkgKGZvciBocHBybykpOiAgIEFkZCBzcGVjaWFsCisJaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgYXQgZW5kIHRvIG1ha2UgcmVzdG9yZV9wY19xdWV1ZSBoYXBweS4KKworV2VkIE1heSAxMCAxNTo1OTowMCAxOTk1ICBUb3Jiam9ybiBHcmFubHVuZCAgPHRlZ2VAYWRkZXIuY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLWVzdC5jIChlc3Rfb3Blbik6IE1ha2Ugc3RhdGljIHRvIG1hdGNoIHByb3RvdHlwZS4KKworVHVlIE1heSAgOSAxNjo1ODo1MCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBzdXBwb3J0LgorCSogY29uZmlnL3Bvd2VycGMvcHBjbGUtZWFiaS5tdDogTmV3IGZpbGUgZm9yIGxpdHRsZSBlbmRpYW4gUG93ZXJQQworCXN1cHBvcnQuCisJKiBjb25maWcvcG93ZXJwYy90bS1wcGNsZS1lYWJpLmg6IGRpdHRvLgorCitNb24gTWF5ICA4IDEyOjExOjM4IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogbmxtL2NvbmZpZ3VyZS5pbiAoZ2RiX2hvc3QsIGdkYl9ob3N0X2NwdSwgZ2RiX3RhcmdldCk6IFJlbW92ZWQuCisJICBUaGVzZSB2YXJpYWJsZXMgbm90IHVzZWQuCisKKwkqIGNvbmZpZy9tNjhrL21vbml0b3IubXQgKFRERVBGSUxFUyk6IEFkZGVkIGNwdTMyYnVnLXJvbS5vLgorCitXZWQgTWF5ICAzIDE3OjU0OjQ3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbW9uaXRvci5jIChtb25pdG9yX2NvbW1hbmQpOiBEb24ndCB1c2UgUFJPTVBUIHVudGlsIG1vbml0b3IKKwl0YXJnZXQgaXMga25vd24gdG8gYmUgb3Blbi4KKwkobW9uaXRvcl9tYWtlX3NyZWMpOiBEb24ndCBkZWZpbmUgc2l6ZSBvZiBoZXh0YWIuCisKK1R1ZSBNYXkgIDIgMTg6MzI6MjQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLW5ldHJvbSk6IE5ldyBjb25maWd1cmF0aW9uIG9wdGlvbi4KKwkqIE1ha2VmaWxlLmluIChSRU1PVEVfT0JTKTogUmVuYW1lIGZyb20gUkVNT1RFX08sIGFwcGVuZAorCXZhbHVlIG9mIE5FVFJPTV9PQlMuCisJKE5FVFJPTV9PQlMpOiBOZXcgdmFyaWFibGUuCisJKiByZW1vdGUtbnJvbS5jOiBOZXcgZmlsZSwgTmV0Uk9NIHRhcmdldCBzdXBwb3J0LgorCSogY29uZmlnL2EyOWsvYTI5ay11ZGkubXQsIGNvbmZpZy9pOTYwL3Z4d29ya3M5NjAubXQ6IFVzZQorCVJFTU9URV9PQlMgaW5zdGVhZCBvZiBSRU1PVEVfTy4KKwkqIGNvbmZpZy9hcmMvYXJjLm10OiBEaXR0by4KKworRnJpIEFwciAyOCAyMzozMDowMCAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBhcnJheS1yb20uYyAoX2luaXRpYWxpemVfYXJyYXkgYXJyYXlfb3Blbik6ICBNb3ZlIGJhdWRfcmF0ZQorCWluaXRpYWxpemF0aW9uIGZyb20gX2luaXR4eHggdG8gYXJyYXlfb3BlbiB0byBmaXggYnVnIHdpdGgKKwlvdmVycmlkaW5nIC1iIGNvbW1hbmQgbGluZSBvcHRpb24uCisKK1RodSBBcHIgMjcgMjA6Mjk6MzQgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFJVTlRFU1QpOiBGaXggcmVmZXJlbmNlIG9mIGBzcmNkaXInLgorCitXZWQgQXByIDI2IDE5OjAxOjA4IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisgCisgCSogcmVtb3RlLWhtcy5jOiBSZXdyaXRlIHRvIHVzZSBuZXcgbW9uaXRvciBjb252ZW50aW9ucy4KKworVHVlIEFwciAyNSAxMToyNzoxNCAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZGJ4cmVhZC5jOiBBZGQgY29tbWVudCBleHBsYWluaW5nIGxvd2VzdF90ZXh0X2FkZHJlc3MuCisJQWRkIGNvbW1lbnQgcmVnYXJkaW5nIHN0cmluZ3RhYl9nbG9iYWwgYW5kIHBzeW10YWJzLgorCitTYXQgQXByIDIyIDAxOjI2OjI5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBjb25maWcvcGEvdG0taHBwYS5oIChFWFRSQUNUX1NUUlVDVF9WQUxVRV9BRERSRVNTKTogRml4LgorCisJKiBjb25maWcvcGEvdG0taHBwYS5oIChFWFRSQUNUX1JFVFVSTl9WQUxVRSk6IFJld3JpdGUgdG8gY29ycmVjdGx5CisJaGFuZGxlICJzaG9ydCIsICJpbnQiIGFuZCBzbWFsbCBzdHJ1Y3R1cmVzIHJldHVybmVkIGluIHJlZ2lzdGVycy4gCisKK0ZyaSBBcHIgMjEgMTI6NTc6NTMgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KKworCSogbWluc3ltcy5jOiBhZGQgbmV3IGZ1bmN0aW9uIGxvb2t1cF9taW5pbWFsX3N5bWJvbF90ZXh0LCB0byBsb29rCisJZm9yIHRleHQgc3ltYm9sIG9ubHkuCisJKiBicmVha3BvaW50LmMgKGNyZWF0ZV9sb25nam1wX2JyZWFrcG9pbnQpOiBjYWxsCisJbG9va3VwX21pbmltYWxfc3ltYm9sX3RleHQgaW5zdGVhZCBvZiBsb29rdXBfbWluaW1hbF9zeW1ib2wuCisJKiBzeW10YWIuaDogYWRkIGxvb2t1cF9taW5pbWFsX3N5bWJvbF90ZXh0IHByb3RvdHlwZS4KKworRnJpIEFwciAyMSAxMjowMzo0NCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHNoLXRkZXAuYyAoc2gtb3BjLmgpOiBEb24ndCBpbmNsdWRlLgorCShnZGJjb3JlLmgpOiBJbmNsdWRlLgorCShmcmFtZV9maW5kX3NhdmVkX3JlZ3MpOiBSZW1vdmUgdW51c2VkIGxvY2FsLgorCitUaHUgQXByIDIwIDEwOjEyOjIxIDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBkd2FyZnJlYWQuYyAoc3RydWN0IGR3ZmluZm8pLCBkYnhyZWFkLmMgKHN0cnVjdCBzeW1sb2MpLAorCW1kZWJ1Z3JlYWQuYyAoc3RydWN0IHN5bWxvYyksIGhwcmVhZC5jIChzdHJ1Y3Qgc3ltbG9jKTogQ2xlYW4KKwl1cCBjb21tZW50cy4KKworV2VkIEFwciAxOSAxNjo1ODoxMSAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogaHBwYS10ZGVwLmMgKGRlcG9zaXRfMTcpOiAgTmV3IHJvdXRpbmUgdG8gZGVwb3NpdCAxNyBiaXQKKwljb25zdGFudHMgaW50byBQQSBpbnN0cnVjdGlvbnMuCisJKiBQdXQgI2lmZGVmcyBhcm91bmQgYWxsIHNpZ25hbCBoYW5kbGluZyBjb2RlLiAgTm90IGdlbmVyYWxseQorCW5lZWRlZCBmb3IgZW1iZWRkZWQgYm9hcmRzLgorCSogKGhwcGFfZml4X2NhbGxfZHVtbXkpOiAgUGFyYW1ldGVyaXplIG9mZnNldHMgaW50byBjYWxsIGR1bW15IHRvCisJYWxsb3cgZGlmZmVyZW50IGR1bW15cyB0byBiZSB1c2VkIGJ5IHRoaXMgY29kZS4gIFVzZQorCUlOU1RSVUNUSU9OX1NJWkUgaW5zdGVhZCBvZiBSRUdJU1RFUl9TSVpFIGZvciB0aGluZ3MuCisJQ29uZGl0aW9uYWxpemUgc2V0dXAgb2YgX3NyNGV4cG9ydCBmaXh1cC4gIEltcHJvdmUgY29tbWVudHMuCisJKiBjb25maWcvcGEvdG0taHBwYS5oOiAgRGVmaW5lIElOU1RSVUNUSU9OX1NJWkUuICBVc2UgYSBkaWZmZXJlbnQKKwljYWxsIGR1bW15IGlmIFBBX0xFVkVMXzAgaXMgZGVmaW5lZC4gIEJldHRlciBjb21tZW50cyBmb3IgY2FsbAorCWR1bW15cy4gIERlZmluZSBvZmZzZXRzIGZvciBMRElML0xETyBpbnN0cnVjdGlvbnMgd2hpY2ggbG9hZAorCWZ1bmN0aW9uIGFkZHJlc3Nlcy4KKwkqIGNvbmZpZy9wYS90bS1wcm8uaDogIEdldCByaWQgb2Ygc2lnbmFsIGhhbmRsaW5nIHN0dWZmLiAgRGVmaW5lCisJUEFfTEVWRUxfMCB0byBkaXNhYmxlIG11Y2tpbmcgd2l0aCBzcGFjZSByZWdzIGFuZCBzdWNoLgorCitNb24gQXByIDE3IDE1OjM3OjA4IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBjcHUzMmJ1Zy1yb20uYyBtb25pdG9yLmggb3A1MC1yb20uYyByZW1vdGUtZXN0LmMgcm9tNjhrLXJvbS5jCisJdzg5ay1yb20uYzogIFJlbW92ZSBsb2FkdHlwZXMsIGxvYWRwcm90b3MgYW5kIGJhdWRyYXRlcy4KKwkqIG9wNTAtcm9tLmM6ICBGaXggY29weXJpZ2h0cyBhbmQgYWRkIGxvYWQgcm91dGluZSB0byBvcDUwbl9jbWRzLgorCSogcm9tNjhrLXJvbS5jIChfaW5pdGlhbGl6ZV9yb202OGspOiAgRG9uJ3Qgc2V0IGJhdWQgcmF0ZS4KKwkqIHc4OWstcm9tLmM6ICBGaXggY29weXJpZ2h0cy4KKworU3VuIEFwciAxNiAxNDowMDo1NSAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogbW9uaXRvci5jOiAgTW92ZSBhbGwgeG1vZGVtIHN0dWZmIGludG8geG1vZGVtLltjaF0uICBSZW1vdmUKKwl1bm5lY2Vzc2FyeSByZW1vdGVsb2FkcHJvdG9jb2wgYW5kIHJlbW90ZWxvYWR0eXBlIHN1cHBvcnQuCisJKiAoZXhwZWN0IGV4cGVjdF9wcm9tcHQpOiAgQ2hhbmdlIG5hbWVzIHRvIG1vbml0b3JfZXhwZWN0IGFuZAorCW1vbml0b3JfZXhwZWN0X3Byb21wdC4gIE1ha2UgdGhlbSBnbG9iYWwuCisJKiAocHJpbnRmX21vbml0b3IpOiAgQ2hhbmdlIG5hbWUgdG8gbW9uaXRvcl9wcmludGYuICBNYWtlIGdsb2JhbC4KKwkqIChtb25pdG9yX3JlYWRfbWVtb3J5KTogIEZsdXNoIGNvbW1hbmQgZWNobyB0byBhdm9pZCBwYXJzaW5nCisJYW1iaWd1aXR5IHdpdGggQ1BVMzJCdWcgbW9uaXRvci4KKwkqIChtb25pdG9yX2xvYWQpOiAgUmVtb3ZlIHJlbW90ZWxvYWRwcm90b2NvbCBhbmQgcmVtb3RlbG9hZHR5cGUKKwlzdXBwb3J0LiAgQ2FsbCB0YXJnZXRfb3BzLT5sb2FkX3JvdXRpbmUsIGRlZmF1bHQgdG8KKwltb25pdG9yX2xvYWRfc3JlYy4KKwkqIChtb25pdG9yX2xvYWRfc3JlYyk6ICBSZW1vdmUgZXZlcnl0aGluZyBidXQgUy1yZWNvcmQgc3VwcG9ydC4KKwkqIG1vbml0b3IuaCAobW9uaXRvcl9vcHMpOiAgQWRkIGxvYWRfcm91dGluZSB0byBwcm92aWRlIG1vbml0b3IKKwlzcGVjaWZpYyBkb3dubG9hZCBjYXBhYmlsaXR5LgorCSogcmVtb3RlLWVzdC5jOiAgQ2xlYW4gdXAgY29weXJpZ2h0cyBhbmQgY29tbWVudHMuCisJKiB3ODlrLXJvbS5jOiAgVXNlIG5ldyB4bW9kZW0gc3VwcG9ydC4KKwkqIHhtb2RlbS5jIHhtb2RlbS5oOiAgTmV3IGZpbGVzIHRvIHN1cHBvcnQgeG1vZGVtIGRvd25sb2Fkcy4KKwkqIHJvbTY4ay1yb20uYyByZW1vdGUtZXN0LmM6ICBGaXggY29weXJpZ2h0cywgYWRkIGxvYWRfcm91dGluZQorCWVudHJ5IHRvIG1vbml0b3Jfb3BzLgorCSogY3B1MzJidWctcm9tLmM6ICBOZXcgZmlsZSB0byBzdXBwb3J0IE1vdG8gQkNDIGRlYnVnZ2Vycy4KKwkqIGNvbmZpZy9tNjhrL2VzdC5tdCAoVERFUEZJTEVTKTogIEFkZCBjcHUzMmJ1Zy5vLgorCSogY29uZmlnL3BhL2hwcGFwcm8ubXQgKFRERVBGSUxFUyk6ICBBZGQgeG1vZGVtLm8uCisKK1NhdCBBcHIgMTUgMTg6MDA6MTUgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHJlbS1tdWx0aS5zaGFyOiBSZW1vdmVkOyBzdXBlcmNlZGVkIGJ5IGdkYnNlcnZlci4KKworRnJpIEFwciAxNCAxMjoxMDoyNCAxOTk1ICBKaW0gS2luZ2RvbiAgPGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbT4KKworCSogeGNvZmZyZWFkLmMgKHhjb2ZmX3N5bV9mbnMpOiBSZXZpc2UgY29tbWVudCBhYm91dCBtZXJnaW5nIHRoaXMKKwl3aXRoIGNvZmZyZWFkLmMuCisKKwkqIGJyZWFrcG9pbnQuYyAoZml4dXBfYnJlYWtwb2ludHMpOiBSZW1vdmVkLgorCSogcnM2MDAwLW5hdC5jICh2bWFwX3N5bXRhYik6IERvbid0IGNhbGwgZml4dXBfYnJlYWtwb2ludHMuCisJKHZtYXBfbGRpbmZvLCB4Y29mZl9yZWxvY2F0ZV9jb3JlKTogQ2FsbCBicmVha3BvaW50X3JlX3NldC4KKworCSogY29mZnJlYWQuYyAoY29mZl9zeW1maWxlX29mZnNldHMpOiBBbGxvY2F0ZSBTRUNUX09GRl9NQVgKKwlzZWN0aW9ucywgbm90IGp1c3QgU0VDVF9PRkZfTUFYLTEuCisKKwkqIHJzNjAwMC1uYXQuYyAodm1hcF9zeW10YWIpLCB4Y29mZnJlYWQuYzogUmUtZG8gc2VjdGlvbiBvZmZzZXRzCisJdG8gYmUgaW5kZXhlZCBieSBTRUNUX09GRl8qIGluc3RlYWQgb2YgeGNvZmYgc2VjdGlvbiBudW1iZXJzLgorCSogb2JqZmlsZXMuYywgcmVtb3RlLmM6IFJlbW92ZSBjb21tZW50cyByZWdhcmRpbmcgU0VDVF9PRkZfKi4KKwkqIHN5bXRhYi5oOiBSZXZpc2UgY29tbWVudCBhYm91dCBibG9ja19saW5lX3NlY3Rpb24uCisJKiByczYwMDAtbmF0LmMgKHZtYXBfc3ltdGFiKTogRG9uJ3QgcmVsb2NhdGUgb2JqZmlsZS0+c2VjdGlvbnMuCisKK1NhdCBBcHIgMTUgMTQ6MTU6MTQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctbWFrZS5pbiAoaW5pdC5jKTogRG9uJ3QgdHJ5IHRvIGRvIHN5bWJvbGljIHtvfSBpbiBzZWQKKwljb21tYW5kLCBub3QgYWxsb3dlZCBieSBzb21lIHZlcnNpb24gb2YgTVBXIE1ha2UuCisJKiBzZXItbWFjLmMgKG1hYy1zZXRiYXVkcmF0ZSk6IE1ha2UgaXQgYWN0dWFsbHkgc2V0IGJhdWQgcmF0ZXMuCisKK1NhdCBBcHIgMTUgMTQ6MDU6MDkgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGFscGhhLXRkZXAuYyAoYWxwaGFfcHVzaF9hcmd1bWVudHMpOiBGaXggdHlwbyAoVFlQRV9WQUxVRSAtPgorCVZBTFVFX1RZUEUpLiAgRG8gdGhlIGNhc3QgZm9yIFRZUEVfQ09ERV9CT09MLCBUWVBFX0NPREVfQ0hBUiwKKwlUWVBFX0NPREVfRU5VTSwgYW5kIFRZUEVfQ09ERV9SQU5HRSBhcyB3ZWxsIGFzIFRZUEVfQ09ERV9JTlQuCisKK1NhdCBBcHIgMTUgMTQ6MDQ6MzIgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGN5Z251cy5jb20+CisKKwkqIGFscGhhLXRkZXAuYyAoYWxwaGFfcHVzaF9hcmd1bWVudHMpOiBPbmx5IGNhc3QgdG8gbG9uZyBmb3IKKwlUWVBFX0NPREVfSU5ULgorCisKK1RodSBBcHIgMTMgMTY6MTc6MDQgMTk5NSAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgorCisJKiByZW1vdGUtYXJyYXkuYzogTmV3IGZpbGUgZm9yIEFycmF5IFRlY2ggTFNJMzNrIGJhc2VkIGNvbnRyb2xsZXIKKwlib2FyZC4KKworVGh1IEFwciAxMyAxMjoyMzozMSAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAcnRsLmN5Z251cy5jb20+CisKKwkqIGEyOWstdGRlcC5jIChnZXRfbG9uZ2ptcF90YXJnZXQpOiBSZXBsYWNlIFNXQVBfVEFSR0VUX0FORF9IT1NUIHdpdGgKKwlleHRyYWN0X2FkZHJlc3MuCisJKiByZW1vdGUtdnhzcGFyYy5jOiBOZXcgZmlsZSwgcHJlbGltaW5hcnkgY2hlY2sgaW4sIHRoaXMgY29uZmlndXJhdGlvbgorCW5vdCBzdXBwb3J0ZWQgeWV0LiAKKwkqIHJlbW90ZS12eG1pcHMuYzogZGl0dG8uCisKK1RodSBBcHIgMTMgMTI6MTA6MTQgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiByczYwMDAtdGRlcC5jICh4Y29mZl9hZGRfdG9jX3RvX2xvYWRpbmZvKTogRG9uJ3QgdXNlIGEgcHJvdG90eXBlCisJdG8gZGVjbGFyZSB0aGUgZnVuY3Rpb24uCisKK1dlZCBBcHIgMTIgMTY6NDA6MjAgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtb25pdG9yLmggKGluaXRfbW9uaXRvcl9vcHMpOiBEZWNsYXJlLgorCSogcm9tNjhrLXJvbS5jOiBDbGFyaWZ5IHNvbWUgY29tbWVudHMuCisJKHJvbTY4a19vcGVuKTogRGVmaW5lIGFzIHN0YXRpYywgdG8gbWF0Y2ggZGVjbC4KKworV2VkIEFwciAxMiAxNjozNjo0NCAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLmdkYjogTmV3IGZpbGUuCisJKiAuZ2RiaW5pdDogTW92ZSBsaXN0LW9iamZpbGVzIHRvIGdkYi5nZGIuCisKKwkqIHZhbHVlcy5jIChzZXRfaW50ZXJuYWx2YXIpOiBTZXQgbW9kaWZpYWJsZSBmbGFnIG9mIG5ld3ZhbC4KKworV2VkIEFwciAxMiAxNDozNDozMSAxOTk1ICBKaW0gS2luZ2RvbiAgPGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbT4KKworCSogeGNvZmZyZWFkLmM6IENhbGwgY29tcGxhaW4oKSByYXRoZXIgdGhhbiBlcnJvcigpIG9yIHByaW50aW5nIGEKKwl3YXJuaW5nLgorCitXZWQgQXByIDEyIDA4OjE1OjI3IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGFyYy10ZGVwLmM6ICNpbmNsdWRlICJnZGJjbWQuaCIuCisJKGNvZGVzdHJlYW1fc2Vlayk6IFBhc3MgQ09SRV9BRERSLgorCShhcmNfY3B1X3R5cGUsIHRtcF9hcmNfY3B1X3R5cGUsIGFyY19jcHVfdHlwZV90YWJsZSk6IE5ldyBnbG9iYWxzLgorCShkZWJ1Z19waXBlbGluZV9wKTogTGlrZXdpc2UuCisJKFhfLi4uKTogSW5zdHJ1Y3Rpb24gZmllbGQgYWNjZXNzIG1hY3Jvcy4KKwkoQlVJTERfSU5TTik6IERlZmluZS4KKwkoY29kZXN0cmVhbV90ZWxsKTogQWxsb3cgZm9yIHN0cmVhbSBlbGVtZW50cyA+IDEgYnl0ZS4KKwkoY29kZXN0cmVhbV9maWxsKTogTGlrZXdpc2UuCisJKHNldHVwX3Byb2xvZ3VlX3NjYW4pOiBOZXcgZnVuY3Rpb24uCisJKGFyY19nZXRfZnJhbWVfc2V0dXApOiBDYWxsIGl0LiAgVXBkYXRlIHRvIGN1cnJlbnQgc3BlYworCXJlZ2FyZGluZyBwcm9sb2d1ZXMuICBVc2UgQlVJTERfSU5TTi4KKwkoc2tpcF9wcm9sb2d1ZSk6IE5ldyBhcmd1bWVudCBgZnJhbWVsZXNzX3AnLiAgVXNlIEJVSUxEX0lOU04uCisJKGFyY19mcmFtZV9zYXZlZF9wYyk6IE5ldyBmdW5jdGlvbi4KKwkoZnJhbWVfZmluZF9zYXZlZF9yZWdzKTogVXNlIEJVSUxEX0lOU04uCisJKGdldF9pbnNuX3R5cGUsIHNpbmdsZV9zdGVwKTogTmV3IGZ1bmN0aW9ucy4KKwkob25lX3N0ZXBwZWQpOiBOZXcgZ2xvYmFsLgorCShhcmNfc2V0X2NwdV90eXBlX2NvbW1hbmQsIGFyY19zaG93X2NwdV90eXBlX2NvbW1hbmQpOiBOZXcgZnVuY3Rpb25zLgorCShhcmNfc2V0X2NwdV90eXBlKTogTmV3IGZ1bmN0aW9uLgorCShfaW5pdGlhbGl6ZV9hcmNfdGRlcCk6IERlZmluZSBuZXcgYHNldCcgY29tbWFuZHMgYGNwdScsCisJYGRpc3BsYXlwaXBlbGluZScsIGFuZCBgZGVidWdwaXBlbGluZScuCisJKiBhcmMvdG0tYXJjLmggKFRBUkdFVF9CWVRFX09SREVSKTogRGVsZXRlLgorCShUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFKTogRGVmaW5lLgorCShERUZBVUxUX0FSQ19DUFVfVFlQRSk6IERlZmluZS4KKwkoU0tJUF9QUk9MT0dVRV9GUkFNRUxFU1NfUCk6IERlZmluZS4KKwkoQlJFQUtQT0lOVCk6IERlbGV0ZS4KKwkoQklHX0JSRUFLUE9JTlQsIExJVFRMRV9CUkVBS1BPSU5UKTogRGVmaW5lLgorCShERUNSX1BDX0FGVEVSX0JSRUFLKTogQ2hhbmdlIHRvIDguCisJKE5PX1NJTkdMRV9TVEVQKTogRGVmaW5lLgorCShBUkNfUENfVE9fUkVBTF9BRERSRVNTKTogRGVmaW5lLgorCShTQVZFRF9QQ19BRlRFUl9DQUxMKTogVXNlIGl0LgorCShOVU1fUkVHUywgUkVHSVNURVJfQllURVMpOiBGaXguCisJKEZSQU1FX1NBVkVEX1BDKTogQ2FsbCBhcmNfZnJhbWVfc2F2ZWRfcGMuCisJKEZSQU1FX0xPQ0FMU19BRERSRVNTKTogRml4LgorCitUdWUgQXByIDExIDE2OjQyOjM3IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiB0b3AuYywgdXRpbHMuYywgZGVmcy5oOiBSZW1vdmUgZXJyb3JfaG9vay4gIEl0IGlzIGN1cnJlbnRseQorCXVudXNlZCBhbmQgd291bGQgbmVlZCB0byBob29rIGludG8gZXJyb3JfYmVnaW4oKS9yZXR1cm5fdG9fdG9wX2xldmVsKCksCisJaW5zdGVhZCBvZiBlcnJvcigpLCBpZiBpdCB3ZXJlIHRvIGJlIHVzZWQuCisKK1R1ZSBBcHIgMTEgMTM6NDY6MjUgMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGRlbmViLmN5Z251cy5jb20+CisKKwkqIHV0aWxzLmMsIGRlZnMuaCAod2FybmluZ19iZWdpbik6IFJlbmFtZWQgZnJvbSB3YXJuaW5nX3NldHVwLCBmb3IKKwljb25zaXN0ZW5jeSB3aXRoIGVycm9yX2JlZ2luLiAgQWxzbyBwcmludCB3YXJuaW5nX3ByZV9wcmludC4KKwlEb2N1bWVudCBpdCBiZXR0ZXIuCisJKiB1dGlscy5jICh3YXJuaW5nKTogVXNlIGl0LgorCSogdXRpbHMuYyAoZXJyb3JfYmVnaW4pOiBEb2MgZml4LgorCSogcnM2MDAwLW5hdC5jICh2bWFwX2xkaW5mbyk6IElmIHdlIGRvbid0IGZpbmQgbGRpbmZvIGZvciB0aGUKKwlzeW1maWxlX29iamZpbGUsIG51a2UgaXQuCisKK1R1ZSBBcHIgMTEgMDk6MzU6MjAgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHByaW50Y21kLmMgKHByaW50X2FkZHJlc3NfbnVtZXJpYyk6IFBhc3MgdXNlX2xvY2FsIHRvCisJcHJpbnRfbG9uZ2VzdCwgcmF0aGVyIHRoYW4gYWx3YXlzIHBhc3NpbmcgMS4KKworCSogbmxtL01ha2VmaWxlLmluOiBSZW1vdmUgY29tbWVudHMgZGlzY3Vzc2luZyBtdW5jaC4KKworCitNb24gQXByIDEwIDE4OjMxOjU3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKwkKKwlNZXJnZSBpbiBzdXBwb3J0IGZvciBNYWMgTVBXIGFzIGEgaG9zdC4KKwkoT2xkIGNoYW5nZSBkZXNjcmlwdGlvbnMgcmV0YWluZWQgZm9yIGluZm9ybWF0aW9uYWwgdmFsdWUuKQorCisJKiBtcHctY29uZmlnLmluIChpMzg2LXVua25vd24tZ28zMik6IENoYW5nZSBmcm9tIGFvdXQuCisJKHNoLWhpdGFjaGktaG1zKTogTmV3IHRhcmdldC4KKwkqIG1wdy1tYWtlLmluIChCSVNPTik6IFVzZSBieWFjYyBpbnN0ZWFkIG9mIGJpc29uLgorCShWRVJTSU9OKTogQnVtcCB0byA0LjE0LjEuCisJKCotcGluc24uKik6IFJlbW92ZSBtZW50aW9ucyBldmVyeXdoZXJlLgorCShhbGwpOiBEb24ndCBidWlsZCBNYWNHREIuCisJKGdkYiwgU2lvd0dEQik6IERlcGVuZCBvbiBWZXJzaW9uLnIuCisJKFZlcnNpb24ucik6IEdlbmVyYXRlIGZyb20gdmVyc2lvbiBpbmZvLgorCSogbWFpbi5jIChtYWluKTogUGFzcyBwcm9ncmFtIG5hbWUgdG8gU1RBUlRfUFJPR1JFU1MsIEVORF9QUk9HUkVTUy4KKwkobWFpbikgW01QV106IFJlbW92ZSBkZWJ1Z2dpbmcgaG9vay4KKwkqIG1hYy14ZGVwLmMgKGRlYnVnX29wZW5wKTogTmV3IGZsYWcuCisJKG1hY19pbml0KTogU2V0IGZsYWcgaWYgZW52IHZhcmlhYmxlIGRlZmluZWQuCisJKiBzZXItbWFjLmMgKG1hY19vcGVuKTogQ2xhcmlmeSBlcnJvciBtZXNzYWdlLgorCShtYWNfcmVhZGNoYXIpOiBDYWxsIFBST0dSRVNTIHdoaWxlIGxvb3BpbmcuCisJKG1hY193cml0ZSk6IENhbGwgc2xlZXAgaW5zdGVhZCBvZiBzZWNfc2xlZXAuCisJKHNlY19zbGVlcCk6IFJlbW92ZS4KKwkqIHNvdXJjZS5jIChvcGVucCkgW01QV106IE9ubHkgcHJpbnQgZGVidWdnaW5nIGluZm8gaWYgZGVidWdnaW5nLgorCSogdXRpbHMuYyAocXVlcnkpIFtNUFddOiBDbGFyaWZ5IHRoYXQgYmVoYXZpb3IgaXMgYSBidWcuCisKKwkqIG1wdy1tYWtlLmluIChpbml0LmMpOiBVc2Ugb3Blbi1icmFjZSBpbnN0ZWFkIG9mIG1wdy1vcGVuLWJyYWNlLgorCisJKiBtYWluLmMsIHNvdXJjZS5jOiBSZW1vdmUgaGFja3MgdGhhdCByZXBsYWNlIGxvbmcgc3RyaW5ncworCXdpdGggc2hvcnRlciBvbmVzLCBub3cgc29sdmVkIHBvcnRhYmx5LgorCisJKiBjb25maWcvbTY4ay94bS1tcHcuaCAoc3Bpbi5oKTogSW5jbHVkZS4KKwkoQUxNT1NUX1NUREMpOiBPbmx5IGRlZmluZSBpZiBNUFdfQy4KKwkqIGNvbmZpZy9tNjhrL3RtLW1hYy5oOiBOZXcgZmlsZSwgTWFjIHRhcmdldCBkZWZpbml0aW9ucy4KKworCSogbXB3LWNvbmZpZy5pbiAobTY4ay1hcHBsZS1tYWNvcywgcHBjLWFwcGxlLW1hY29zLAorICAgICAgICBpMzg2LXVua25vd24tYW91dCk6IE5ldyB0YXJnZXRzLgorCShtay50bXApOiBBZGQgKkRFUEZJTEVTIGRlZmluaXRpb25zLgorCSogbXB3LW1ha2UuaW46IFJlbW92ZSBnQyBydWxlcywgY2xlYW4gdXAgZGVmaW5pdGlvbnMgZm9yIG90aGVyCisgICAgICAgIGluY2x1ZGUgZmlsZXMsIGJ1bXAgdmVyc2lvbiwgZml4IGJvZ3VzIFwgdGhhdCBzaG91bGQgYmUgXE9wdGlvbi1kLgorCShpbml0LmMpOiBCdWlsZCBjb3JyZWN0bHkuCisKKwkqIG1wdy1tYWtlLmluIChIRklMRVNfTk9fU1JDRElSKTogQWRkIHNvbXNvbGliLmgKKwkoQUxMREVQRklMRVMpOiBBZGQgc29tc29saWIuYy4KKwkoc29tc29saWIubyk6IEFkZCBzb21lIGRlcGVuZGVuY2llcy4KKworCSogbXB3LWNvbmZpZy5pbjogVXNlIG5tLWVtcHR5LmggaWYgaG9zdCBpcyBub3QgdGFyZ2V0LgorCSh4ZGVwZmlsZXMpOiBBZGQgbWFjLXhkZXAuYy5vLgorCSh4bV9maWxlKTogUmVtb3ZlLgorCSogbXB3LW1ha2UuaW46IEFkZCBGb3J0cmFuIGZpbGVzLgorCShYREVQRklMRVMpOiBSZW1vdmUuCisKKwkqIG1wdy1jb25maWcuaW4gKE1hY1NlcmlhbC5oKTogRHVwbGljYXRlIGZyb20gc3RhbmRhcmQgU2VyaWFsLmguCisJKiBzZXItbWFjLmMgKE1hY1NlcmlhbC5oKTogSW5jbHVkZSBpbnN0ZWFkIG9mIFNlcmlhbC5oLgorCisJKiBtcHctbWFrZS5pbjogVXNlIHtzfSBpbnN0ZWFkIG9mIHtzcmNkaXJ9IGV2ZXJ5d2hlcmUuCisJKGJpbmRpciwgbGliZGlyKTogUmVtb3ZlIGV4dHJhIGNvbG9uLgorCShzb3VyY2UuYyk6IENvbXBpbGUgd2l0aCBDIGluc3RlYWQgb2YgZ0MuCisJKGMtZXhwLnRhYi5jLCBjaC1leHAudGFiLmMsIG0yLWV4cC50YWIuYyk6IEFkZCB7b30uCisJKGluc3RhbGwtb25seSk6IERvbid0IGluc3RhbGwgTWFjR0RCLgorCSogc291cmNlLmMgKG9wZW5wKSBbTVBXXTogQWRkIGEgZGVidWdnaW5nIGRpc3BsYXkuCisJKG9wZW5fc291cmNlX2ZpbGUpIFtNUFddOiBVc2UgTVBXIGJhc2VuYW1lIGZpbmRlcnMuCisJW01QV19DXTogQnJpZWZlciB2ZXJzaW9ucyBvZiBoZWxwIGZvciBsaW5lIGFuZCBsaXN0IGNvbW1hbmRzLgorCisJKiBtcHctbWFrZS5pbjogQ2hhbmdlIHJlZmVyZW5jZXMgZnJvbSBwYXJlYWQuYyB0byBzb21yZWFkLmMKKworCSogbXB3LW1ha2UuaW4gKFZFUlNJT04pOiBVcGRhdGUgdG8gNC4xMi4zLgorCShTaW93R0RCKTogTmV3IHRhcmdldCwgR0RCIHVzaW5nIFNJT1cgbGlicmFyeS4KKwkoaW5pdC1uZXcuYyk6IE5ldyB0YXJnZXQsIGF0dGVtcHQgdG8gZ2VuZXJhdGUgaW5pdC5jIGZyb20gc291cmNlcy4KKwkobWFpbi5jLm8sIHRvcC5jLm8pOiBQdXQgZWFjaCBpbiBpdHMgb3duIHNlZ21lbnQuCisJKiBtYWluLmMgKG1haW4pIFtNUFddOiBBbHdheXMgY2FsbCBtYWNfaW5pdC4KKwkqIHV0aWxzLmMgKHF1ZXJ5KSBbTVBXXTogQWx3YXlzIHJldHVybiAieWVzIiBpZiBpbiBNYWNHREIsIG91dHB1dAorCWFuIGV4dHJhIG5ld2xpbmUgb3RoZXJ3aXNlLgorCSogbWFjLXhkZXAuYzogTW9yZSBjb21tZW50cyBpbiB2YXJpb3VzIHBsYWNlcywgcmVtb3ZlIGp1bmsuCisJKG1hY19pbml0KTogQWRkIHRlc3RzIGZvciBNUFcgYW5kIFNJT1cuCisJKHVzZV93bmUsIGhhc19jb2xvcl9xZCk6IFJlbmFtZWQuCisJKHVzZV9jb2xvcl9xZCk6IE5ldyB2YXJpYWJsZS4KKwkoZ3Jvd193aW5kb3cpOiBPbmx5IGRvIGNvbnNvbGUgcmVzaXppbmcgdG8gY29uc29sZSB3aW5kb3csCisJY2FsbCByZXNpemVfY29uc29sZV93aW5kb3cuCisJKHpvb21fd2luZG93KTogQ2FsbCByZXNpemVfY29uc29sZV93aW5kb3cuCisJKHJlc2l6ZV9jb25zb2xlX3dpbmRvdywgc2Nyb2xsX3RleHQpOiBOZXcgZnVuY3Rpb25zLgorCShhZGp1c3RfY29uc29sZV9zaXplcyk6IEFsd2F5cyBhbGlnbiB2aWV3cmVjdCB0byBldmVuIG11bHRpcGxlcyBvZgorCXRleHQgbGluZXMuCisJKGFkanVzdF9jb25zb2xlX3RleHQpOiBBbHdheXMgc2Nyb2xsIGJ5IHdob2xlIGxpbmVzLgorCShoYWNrZWRfdmZwcmludGYsIGhhY2tlZF9wdXRzLCBoYWNrZWRfZnB1dGMsIGhhY2tlZF9wdXRjKTogRm9yY2UgYQorCXJlY2FsY3VsYXRpb24gb2Ygc2Nyb2xsIHBvc2l0aW9ucyBpZiBhIG5ld2xpbmUgd2FzIG91dHB1dC4KKwkoaGFja2VkX2ZmbHVzaCk6IFNpbWlsYXJseSwgZm9yIGZsdXNoaW5nLgorCShoYWNrZWRfZmdldGMpOiBOZXcgZnVuY3Rpb24sIGFib3J0cyBpZiBjYWxsZWQgaW4gTWFjR0RCLgorCSogc2VyLW1hYy5jIChtYWNfcmVhZGNoYXIpOiBSZW5hbWUgc3RhcnR0aW1lIHRvIHN0YXJ0X3RpbWUsCisJcmVtb3ZlIGRlYnVnZ2luZyBwcmludGYuCisJKG1hY193cml0ZSk6IFNsZWVwIG9uIGZpcnN0IDQgd3JpdGVzLgorCShzZWNfc2xlZXApOiBOZXcgZnVuY3Rpb24sIHdvcmtzIGxpa2Ugc3RhbmRhcmQgc2xlZXAuCisJKiBtYWNnZGIucjogQWRqdXN0IHBvc2l0aW9uaW5nIGFuZCBjb250ZW50cyBvZiBBYm91dCBib3guCisJU2V0IG1pbmltdW0gc2l6ZSB0byAyMDAwSywgcHJlZmVycmVkIHNpemUgdG8gNTAwMEsuCisJKiBjb25maWcvbTY4ay94bS1tcHcuaCAoZmdldGMpOiBEZWZpbmUgYXMgYSBtYWNyby4KKworCSogbXB3LW1ha2UuaW4gKC5jLm8sIC5nYy5vKTogUHJlZml4IHNlZ21lbnQgbmFtZXMgd2l0aCBnZGJfLgorCSh0b3AuYy5vLCBhbm5vdGF0ZS5jLm8pOiBBZGQgYnVpbGQgcnVsZXMuCisJKiBtYWNnZGIuciAoU3lzVHlwZXMucik6IEluY2x1ZGUuCisJKCd2ZXJzJyk6IE5ldyByZXNvdXJjZSwgdmVyc2lvbiBpbmZvLgorCShtRmlsZSwgbUVkaXQsIG1EZWJ1Zyk6IEVuYWJsZSBhbGwgbWVudSBpdGVtcy4KKwkobURlYnVnKTogQWRkIGtleSBlcXVpdmFsZW50cyBmb3IgY29udGludWUsIHN0ZXAsIG5leHQuCisJKHdDb25zb2xlKTogQWRkIHpvb20gYW5kIGNsb3NlIGJveGVzIHRvIHdpbmRvdy4KKwkqIG1hYy14ZGVwLmMgKG5ld19jb25zb2xlX3dpbmRvdyk6IE5ldyBmdW5jdGlvbiwgY29kZSB0YWtlbiBmcm9tCisJbWFjX2luaXQuCisJKG1hY19jb21tYW5kX2xvb3ApOiBVc2UgR2V0Q2FyZXRUaW1lIGZvciB3YWl0IGludGVydmFsLCBjYWxsCisJZG9faWRsZSBvbiBudWxsIGV2ZW50cy4KKwkoZG9faWRsZSk6IE5ldyBmdW5jdGlvbi4KKwkoem9vbV93aW5kb3cpOiBJbXBsZW1lbnQgem9vbWluZy4KKwkodl9zY3JvbGxfcHJvYyk6IE5ldyBmdW5jdGlvbiwgaGFuZGxlcyB2ZXJ0aWNhbCBzY3JvbGxpbmcuCisJKGFjdGl2YXRlX3dpbmRvdyk6IERvIGFjdGl2YXRpb24gb2YgY29uc29sZSB3aW5kb3cuCisJKGRvX21lbnVfY29tbWFuZCk6IEltcGxlbWVudCBpdGVtcyBvZiBmaWxlLCBlZGl0LCBhbmQgZGVidWcgbWVudXMuCisJKGRvX2tleWJvYXJkX2NvbW1hbmQpOiBGaXggY29tbWFuZCBleHRyYWN0aW9uLgorCShhZGp1c3RfY29uc29sZV9zaXplcywgYWRqdXN0X2NvbnNvbGVfdGV4dCk6IE5ldyBmdW5jdGlvbnMuCisJKGhhY2tlZF9mcHJpbnRmLCBoYWNrZWRfdmZwcmludGYsIGhhY2tlZF9mcHV0cywgaGFja2VkX2ZwdXRjLAorCWhhY2tlZF9wdXRjKTogRG9uJ3QgY2FsbCBkcmF3X2NvbnNvbGUuCisJKiBzZXItbWFjLmMgKG1hY19vcGVuKTogQWRkIGFuIGVycm9yIG1lc3NhZ2UgZm9yIGludmFsaWQgcG9ydHMuCisJKGZpcnN0X21hY193cml0ZSk6IE5ldyBnbG9iYWwuCisJKG1hY193cml0ZSk6IFVzZSBmaXJzdF9tYWNfd3JpdGUgdG8gc2xlZXAgb24gZmlyc3Qgc2V2ZXJhbCB3cml0ZXMuCisKKwkqIG1wdy1tYWtlLmluIChJTkNMVURFX0NGTEFHUyk6IEFkZCByZWFkbGluZSBzb3VyY2UgZGlyLgorCShSRUFETElORV9DRkxBR1MsIFJFQURMSU5FX1NSQywgUkVBRExJTkVfRElSKTogVW5jb21tZW50LgorCShUU09CUyk6IERvbid0IGNvbXBpbGUgaW5mbG93LmMuCisJKGFsbCwgaW5zdGFsbCk6IEFkZCBNYWNHREIuCisJKiBtYWluLmMgKG1haW4pOiBEbyBNYWMtc3BlY2lmaWMgaW5pdCBhbmQgY29tbWFuZCBsb29wIGlmIGEKKwlzdGFuZGFsb25lIGFwcCwgc2tpcCBmdWxsIG9wdGlvbiBoZWxwIG1lc3NhZ2UgaWYgY29tcGlsaW5nCisJd2l0aCBNUFcgQy4KKwkoZ2RiX3JlYWRsaW5lKTogSWYgTVBXLCBhZGQgYSBuZXdsaW5lIGFmdGVyIHRoZSAoZ2RiKSBwcm9tcHQuCisJKiB1dGlscy5jIChfaW5pdGlhbGl6ZV91dGlscyk6IElmIE1QVywgZG9uJ3QgdHJ5IHRvIHVzZSB0ZXJtY2FwIHRvCisJY29tcHV0ZSB0aGUgd2luZG93IHNpemUuCisJKiBjb25maWcvbTY4ay94bS1tcHcuaCAocHJpbnRmLCBmcHJpbnRmLCBmcHV0cywgZnB1dGMsIHB1dGMsCisJZmZsdXNoKTogRGVmaW5lIGFzIG1hY3JvcyB0aGF0IGV4cGFuZCBpbnRvIGhhY2tlZF8uLi4gdmVyc2lvbnMuCisJKFN0YW5kQWxvbmUsIG1hY19hcHApOiBEZWNsYXJlLgorCSogbWFjZ2RiLnIgKFNJWkUpOiBTZXQgdGhlIGRlZmF1bHQgcGFydGl0aW9uIHRvIDQwMDBLLgorCSogbWFjLXhkZXAuYyAocmVhZGxpbmUuaCwgaGlzdG9yeS5oKTogSW5jbHVkZS4KKwkodGVybWluYWwuaCk6IERvbid0IGluY2x1ZGUuCisJKG1hY19hcHApOiBEZWZpbmUuCisJKGdkYl9oYXNfYV90ZXJtaW5hbCk6IERlZmluZSBNYWMtc3BlY2lmaWMgdmVyc2lvbi4KKwkoZG9fa2V5Ym9hcmRfY29tbWFuZCk6IFNpbXBsaWZ5IHNlYXJjaCBmb3IgY29tbWFuZCBzdHJpbmcuCisJKHJlYWRsaW5lKTogRGVmaW5lIGFzIGdkYl9yZWFkbGluZS4KKwlBZGQgb3RoZXIgaGlzdG9yeS9yZWFkbGluZSBzdHVicyB0byBtYWtlIG1haW4gZ2RiIGxpbmsuCisJKGhhY2tlZF9mcHJpbnRmLCBoYWNrZWRfcHJpbnRmLCBoYWNrZWRfdmZwcmludGYsIGhhY2tlZF9mcHV0cywKKwloYWNrZWRfZnB1dGMsIGhhY2tlZF9mZmx1c2gpOiBOZXcgZnVuY3Rpb25zLCBpbnRlcmNlcHQgb3V0cHV0IHRvCisJc3Rkb3V0IGFuZCBzdGRlcnIsIHNlbmQgdG8gY29uc29sZSB3aW5kb3cuCisKKwkqIG1wdy1tYWtlLmluIChNYWNHREIpOiBOZXcgdGFyZ2V0LCBzdGFuZGFsb25lIE1hYy1ob3N0ZWQgZ2RiLgorCShYREVQRklMRVMpOiBEZWZpbmUuCisJKG1haW4uYy5vKTogQ29tcGlsZSB3aXRoIGdDIGluc3RlYWQgb2YgQy4KKwkqIG1hYy1kZWZzLmg6IE5ldyBmaWxlLCBtZW51IGV0YyBkZWZpbml0aW9ucyBzaGFyZWQgYmV0d2VlbgorCUMgYW5kIFJleiBmaWxlcy4KKwkqIG1hY2dkYi5yOiBOZXcgZmlsZSwgUmV6IChyZXNvdXJjZSBjb21waWxlcikgcmVzb3VyY2UKKwlkZWZpbml0aW9ucy4KKwkqIG1hYy14ZGVwLmM6IE5ldyBmaWxlLCBNYWMgaG9zdCBpbnRlcmZhY2UgY29kZS4KKwkqIGNvbmZpZy9tNjhrL3htLW1wdy5oIChQQVRITkFNRV9TRVBBUkFUT1IpOiBSZW5hbWUgdG8KKwlESVJOQU1FX1NFUEFSQVRPUi4KKwkoUEFUSE5BTUVfU0VQQVJBVE9SX1NUUklORyk6IFJlbW92ZS4KKwkoU0lHUVVJVCwgU0lHSFVQKTogRGVmaW5lLgorCShmaWxlbm8sIFJfT0spOiBEZWZpbmUuCisKKwkqIG1wdy1jb25maWcuaW46IE5ldyBmaWxlLCBNUFcgY29uZmlndXJhdGlvbiBmcmFnbWVudC4KKwkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIG1ha2VmaWxlIGZyYWdtZW50LgorCSogY29uZmlnL202OGsveG0tbXB3Lmg6IE5ldyBmaWxlLCBNUFcgaG9zdCBkZWZpbml0aW9ucy4KKwkqIHNlci1tYWMuYzogTmV3IGZpbGUsIE1hYyBzZXJpYWwgaW50ZXJmYWNlLgorCitNb24gQXByIDEwIDE2OjQ3OjU3IDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+CisKKwkqIHZhbHByaW50LmMgKHByaW50X2xvbmdlc3QpOiBGaXggYSBzeW50YXggZXJyb3IgaW4gI2lmZGVmIAorCVBSSU5URl9IQVNfTE9OR19MT05HLgorCisJKiBjb25maWcvbWlwcy94bS1pcml4NS5oOiB0dXJuIG9uIENDX0hBU19MT05HX0xPTkcgYW5kIAorCVBSSU5URl9IQVNfTE9OR19MT05HLgorCSogY29uZmlnL21pcHMvdG0taXJpeDUuaDogdHVybiBvbiBGT1JDRV9MT05HX0xPTkcuCisKK1NhdCBBcHIgIDggMDI6NDc6NDUgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3N5bWJvbCk6ICBVc2UgbmV3IHZhcmlhYmxlIAorCW5vZGVidWdfdmFyX3N5bWJvbF90eXBlIGFzIHR5cGUgb2YgdmFyaWFibGVzIHdoaWNoIGRvbid0IGhhdmUgYW55CisJZWNvZmYgZGVidWcgaW5mbyBhc3NvY2lhdGVkIHdpdGggdGhlbS4KKwkocGFyc2Vfc3ltYm9sLCBwYXJzZV9wcm9jZWR1cmUpOiAgVXNlIGhldXJpc3RpY3MgdG8gZGV0ZXJtaW5lIGlmCisJZnVuY3Rpb25zIHdlcmUgY29tcGlsZWQgd2l0aG91dCBkZWJ1Z2dpbmcgaW5mbyBhbmQgY2hhbmdlIHRoZWlyCisJdHlwZSB0byBub2RlYnVnX2Z1bmN0aW9uX3N5bWJvbF90eXBlLgorCShfaW5pdGlhbGl6ZV9tZGVidWdyZWFkKTogIEluaXRpYWxpemUgbm9kZWJ1Z18qX3N5bWJvbF90eXBlLgorCisJKiBzb3VyY2UuYyAobGluZV9pbmZvKTogIENsZWFyIHNhbC5wYyBmb3IgYGluZm8gbGluZScgd2l0aG91dAorCWFyZ3VtZW50cy4KKworRnJpIEFwciAgNyAxNzo0MzowMSAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogbW9uaXRvci5jOiAgbWFrZV94bW9kZW1fcGFja2V0IGFuZCBwcmludF94bW9kZW1fcGFja2V0IGdvIGF3YXkuCisJc2VuZF94bW9kZW1fcGFja2V0IHNob3dzIHVwIHRvIGRvIHRoZSBvYnZpb3VzLiAgTG90cyBvZiBmaXhlcyB0bworCXhtb2RlbSBkb3dubG9hZHMgaW5jbHVkaW5nIHJlc2V0dGluZyBvZiBibG9jayBudW1iZXIgYXQgc3RhcnQgb2YKKwluZXcgdHJhbnNmZXJzLCBmaXggZm9yIGJ1ZmZlciBvdmVycnVuIHByb2JsZW0sIGFkZGl0aW9uIG9mIENSQworCWdlbmVyYXRpb24gY29kZS4KKwkqIChtb25pdG9yX29wZW4pOiAgbG9hZHR5cGVfc3RyIGFuZCBsb2FkcHJvdG9fc3RyIG5vdyBkZWZhdWx0IHRvCisJZmlyc3QgZW50cnkgaW4gbW9uaXRvcl9vcHMtPmxvYWR0eXBlcy4KKwkqIChtb25pdG9yX3dhaXQpOiAgTGVuZ3RoZW4gcmVnaXN0ZXIgZHVtcCBidWYsIGJlY2F1c2Ugb2YgdmVyYm9zZQorCVdpbmJvbmQgbW9uaXRvci4KKwkqIChtb25pdG9yX2ZldGNoX3JlZ2lzdGVyKTogIFJlcG9ydCB1bmltcGxlbWVudGVkIHJlZ2lzdGVycyBhcyAwLgorCSogKG1vbml0b3JfcmVhZF9tZW1vcnkpOiAgT25seSBkbyAxNiBieXRlIGFsaWduZWQgdHJhbnNmZXJzCisJYmVjYXVzZSBvZiBmb3JtYXR0aW5nIHdlaXJkbmVzcyB3aXRoIHRoZSBXaW5ib25kIG1vbml0b3IuICBBbHNvLAorCWlnbm9yZSBub24taGV4LCBub24td2hpdGVzcGFjZSBmb3JtYXR0aW5nIGJldHdlZW4gYnl0ZXMgKHNhbWUKKwltb25pdG9yKS4KKwkqIChtb25pdG9yX2xvYWQpOiAgQ2xlYW4gdXAgbG9naWMuCisJKiAobW9uaXRvcl9sb2FkX3NyZWMpOiAgUmUtZG8geG1vZGVtIHN1cHBvcnQuICBNb3ZlIGxvdHMgb2YgaXQKKwlpbnRvIHNlbmRfeG1vZGVtX3BhY2tldC4KKwkqIChnZXRhY2tuYWspOiAgR2V0IHJpZCBvZiBwb2xscyBhbmQgdGltZW91dHMuICBIYW5kbGUgQ1JDCisJcmVxdWVzdHMgZnJvbSByZWNlaXZlci4KKwkqIChtb25pdG9yX21ha2Vfc3JlYyk6ICBFZmZpY2llbmN5IGltcHJvdmVtZW50cy4gIERvbid0IGNhbGwKKwlzcHJpbnRmIHRvIG91dHB1dCB0d28gZGlnaXQgaGV4IG51bWJlcnMuCisJKiAoY3JjaW5pdCwgZG9jcmMpOiAgTmV3LCBDUkMtMTYgc3VwcG9ydCByb3V0aW5lcy4KKwkqIChzZW5kX3htb2RlbV9wYWNrZXQpOiAgTmV3IHJvdXRpbmUgdG8gZ2VuZXJhdGUgZWl0aGVyIENSQy0xNiBvcgorCWNoZWNrc3VtbWVkIHhtb2RlbSBwYWNrZXRzLgorCisJKiByZW1vdGUtZXN0LmMgKGVzdF9sb2FkdHlwZXMpLCByb202OGstcm9tLmMgKHJvbTY4a19sb2FkdHlwZXMpOgorCVJlZHVjZSB0YWJsZXMgZG93biB0byBvbmx5IHRoZSBsb2FkIHR5cGVzIHN1cHBvcnRlZCBieSBlYWNoCisJbW9uaXRvci4KKworCSogdzg5ay1yb20uYyAgKHc4OWtfc3VwcGx5X3JlZ2lzdGVyKTogIFBhcnNlcyBvdXRwdXQgb2YgV2luYm9uZAorCXJlZ2lzdGVyIGR1bXBzLgorCSogKHc4OWtfbG9hZHR5cGVzLCB3ODlrX2xvYWRwcm90b3MpOiAgUmVkdWNlIHRvIGp1c3Qgc3JlYy94bW9kZW0uCisJKiAodzg5a19jbWRzKTogIEFkZCBjbGVhciBhbGwgYnJlYWtwb2ludHMsIG1lbW9yeSBmaWxsLCBhbmQgZHVtcAorCXJlZ2lzdGVycyBjb21tYW5kcy4KKworCSogY29uZmlnL3BhL3RtLWhwcGEuaDogIERlZmluZSBsb3RzIHJlZ2lzdGVyIG9mZnNldHMgbmVlZGVkIGJ5CisJdzg5ay1yb20uYy4KKworCitUaHUgQXByICA2IDE3OjAwOjQ2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFgxMV9JTkNMVURFUyk6IERlZmluZSBhcyBlbXB0eS4KKwkoWDExX0NGTEFHUyk6IERlZmluZSBhcyBpbmNsdWRpbmcgJChYMTFfSU5DTFVERVMpLgorCShYMTFfTElCX1NXSVRDSEVTKTogRGVmaW5lIGFzIGVtcHR5LgorCShYMTFfTElCUyk6IERlZmluZSBhcyAtbFgxMS4KKworCitXZWQgQXByICA1IDE5OjU3OjM4IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBtaXBzLXRkZXAuYyAobWlwc19wcmludF9yZWdpc3Rlcik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKwlvdXJfdHlwZSBhbmQgY2FsbCB0byBpbml0X3R5cGUuICBGaXhlcyBtZW1vcnkgbGVhay4gIFJlaW5kZW50IGZ1bmN0aW9uLgorCisJKiBtaXBzLXRkZXAuYyAobWlwc19wcmludF9yZWdpc3RlciksIGZpbmR2YXIuYworCSh3cml0ZV9yZWdpc3Rlcl9ieXRlcyk6IE1ha2UgYnVmZmVyIGNoYXJbXSBpbnN0ZWFkIG9mIHVuc2lnbmVkCisJY2hhcltdLgorCitNb24gQXByICAzIDE5OjI4OjE0IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiB0b3AuYywgdXRpbHMuYywgbWFpbi5jLCBkZWZzLmg6IFJlcGxhY2UgZXJyb3JfcHJlX3ByaW50IHdpdGggdHdvCisJdmFyaWFibGVzOiBlcnJvcl9wcmVfcHJpbnQgKGZvciBSRVRVUk5fRVJST1IpIGFuZCBxdWl0X3ByZV9wcmludAorCShmb3IgUkVUVVJOX1FVSVQpLiAgRml4ZXMgYSBidWcgd2hlcmVieSB0eXBpbmcgXkMgKGUuZy4gaW4gIm1haW50CisJcHJpbnQgc3ltIikgY291bGQgb3V0cHV0IGV4dHJhbmVvdXMgc3R1ZmYuCisJKiBvYmpmaWxlcy5jOiBEb24ndCBkZWNsYXJlIGVycm9yX3ByZV9wcmludDsgZGVmcy5oIGRvZXMgaXQuCisKK01vbiBBcHIgIDMgMTM6NDg6MjggMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIG1vbml0b3IuaDogIEFkZCBNT19HRVRNRU1fTkVFRFNfUkFOR0UgZmxhZy4KKwkqIG1vbml0b3IuYyAobW9uaXRvcl9yZWFkX21lbW9yeSk6ICBVc2UgcHJldmlvdXNseSBtZW50aW9uZWQgZmxhZworCXRvIHNlbmQgcHJvcGVyIGZvcm1hdCBtZW1vcnkgZXhhbWluZSBjb21tYW5kcyB0byB0aGUgdzg5ayBtb25pdG9yLgorCUFsc28sIHRyeSB0byBoYW5kbGUgYml6YXJyZSBmb3JtYXQgb2YgbWVtb3J5IGR1bXAuLi4KKworCSogb3A1MC1yb20uYyB3ODlrLXJvbS5jOiAgVXBkYXRlIHRvIG5ldyBtb25pdG9yLltjaF0gY29udmVudGlvbnMuCisKK1NhdCBBcHIgIDEgMDM6MjI6MjAgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBkYnhyZWFkLmMgKHByb2Nlc3Nfb25lX3N5bWJvbCkgW1NPRlVOX0FERFJFU1NfTUFZQkVfTUlTU0lOR106CisJSGFuZGxlIHJlbG9jYXRlZCBzeW1ib2wgYWRkcmVzcy4KKwkqIHBhcnRpYWwtc3RhYi5oLCBjYXNlIE5fU08sIFNPRlVOX0FERFJFU1NfTUFZQkVfTUlTU0lORzoKKwlEbyBub3QgcmVsb2NhdGUgYSB6ZXJvIGFkZHJlc3MuCisKK1RodSBNYXIgMzAgMTk6NDY6MzYgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9hMjlrL3RtLWEyOWsuaDogTnVrZSBvYnNvbGV0ZSBkZWZpbmUgQ09OVFJPTF9FTkRfQUREUjsgaXQKKwlpcyBub3doZXJlIHVzZWQuCisKKwkqIHN0YWJzcmVhZC5jIChyZWFkX3JhbmdlX3R5cGUpOiBSZW1vdmUgRklYTUUgY29tbWVudCBhYm91dAorCXR5cGUtaWQgKEkgcHJlc3VtZSB0aGlzIG1lYW50IGEgbnVtYmVyIGZvbGxvd2VkIGJ5ID0gZm9sbG93ZWQgYnkgYQorCXR5cGUpIHZlcnN1cyB0eXBlIG51bWJlcjsgUGVyIGZpeGVkIGl0LgorCitXZWQgTWFyIDI5IDA5OjU2OjA0IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IHNwYXJjLSotc3Vub3M1KiBpcyBzYW1lIGFzIHNwYXJjLSotc29sYXJpczIqLgorCitXZWQgTWFyIDI5IDE4OjMwOjAzIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLWU3MDAwLmMgKHdoeV9zdG9wKTogQWRkIG5ldyBraW5kcyBvZiBzdHJpbmdzIHRvIGV4cGVjdAorCWZyb20gdGhlIGVtdWxhdG9yLgorCShlNzAwMF93YWl0KTogQWRkIGludGVycHJldGF0aW9ucyBmb3IgbW9yZSBzdG9wIHJlYXNvbnMsCisJaW5jbHVkaW5nIHdhcm5pbmdzIGZvciB3cml0ZSBwcm90ZWN0IGFuZCBjeWNsZSBhZGRyZXNzIGVycm9ycy4KKworV2VkIE1hciAyOSAxNzowOToyOSAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBtb25pdG9yLmMgbW9uaXRvci5oIHJlbW90ZS1lc3QuYyByb202OGstcm9tLmM6ICBBZGQgc3RhcnQgb2YKKwlzdXBwb3J0IGZvciBpbnRlcnJ1cHRpbmcgdGFyZ2V0LgorCSogbW9uaXRvci5jIChtb25pdG9yX29wZW4pOiAgU2VuZCBzdG9wIGNvbW1hbmQgYmVmb3JlIGRvaW5nCisJYW55dGhpbmcgZWxzZS4KKwkqIChtb25pdG9yX2xvYWRfc3JlYyk6ICBGaXggcmVjb3JkIHNpemUgY2FsY3VsYXRpb24gdG8gcHJldmVudCBlbmQKKwlvZiBzZWdtZW50IGZyb20gZ2V0dGluZyB0cmFzaGVkLgorCSogcm9tNjhrLXJvbS5jOiAgVXBkYXRlIHRvIGxhdGVzdCB2ZXJzaW9uIG9mIHN0cnVjdCBtb25pdG9yX29wcy4KKwkqIGNvbmZpZy9zcGFyYy90bS1zcGFyYy5oIChGSVhfQ0FMTF9EVU1NWSk6ICBGaXggYnl0ZS1vcmRlcgorCXByb2JsZW1zLiAgTWFrZXMgRE9TIGhvc3RlZCBmdW5jdGlvbiBjYWxsaW5nIHdvcmsuCisJKiBzcGFyY2xpdGUvY3J0MC5zOiAgRGVmaW5lIF9zdGFydCB0byBtYWtlIENPRkYgaGFwcHkuCisKK1dlZCBNYXIgMjkgMDk6MTE6NTEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBkZWZzLmggKGF0b2YpOiBEb24ndCBwcm92aWRlIGFuIGV4dGVybmFsIGRlY2xhcmF0aW9uIGlmIGF0b2YgaXMKKwlhIG1hY3JvLgorCitXZWQgTWFyIDI5IDAwOjAxOjA3IDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogcnM2MDAwLXRkZXAuYyAoc2tpcF9wcm9sb2d1ZSk6ICBTa2lwIHNhdmluZyBvZiBMUiBhbmQgQ1IgaW4KKwl0aGUgc3RhY2sgZnJhbWUsIGZpeCB0eXBvcyBpbiBgc3QgcngsTlVNKHIxKScgYW5kIGBzdHUgcjEsTlVNKHIxKScKKwl0ZXN0cy4KKworVHVlIE1hciAyOCAxNzowNDowNCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogZ2RidHlwZXMuYyAoY3JlYXRlX3JhbmdlX3R5cGUpOiAgSWYgaW5kZXh0eXBlIGhhcyBUWVBFX0ZMQUdfU1RVQgorCXNldCwgc2V0IFRZUEVfRkxBR19UQVJHRVRfU1RVQi4KKwkoY2hlY2tfc3R1Yl90eXBlKTogIFJlY2FsY3VsYXRlIFRZUEVfTEVOR1RIIGZvciByYW5nZSB0eXBlLgorCSogc3RhYnNyZWFkLmMgKHJlYWRfcmFuZ2VfdHlwZSk6ICBJZiBpbmRleCB0eXBlIG51bWJlciBpcyBmb2xsb3dlZAorCWJ5ICc9JywgYmFjayB1cCwgY2FsbCByZWFkX3R5cGUuIGFuZCBhc3N1bWUgd2UgaGF2ZSBhIHRydWUgcmFuZ2UuCisJKiBnZGJ0eXBlcy5oIChUWVBFX0ZMQUdfVEFSR0VUX1NUVUIpOiAgVXBkYXRlIGNvbW1lbnQuCisKK01vbiBNYXIgMjcgMjI6NTE6NTQgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBhbHBoYS1uYXQuYywgaXJpeDQtbmF0LmMsIGlyaXg1LW5hdC5jLCBtaXBzdjQtbmF0LmMsCisJc3BhcmMtdGRlcC5jIChzdXBwbHlfZ3JlZ3NldCwgc3VwcGx5X2ZwcmVnc2V0KTogIEZpbGwgaW5hY2Nlc3NpYmxlCisJcmVnaXN0ZXJzIHdpdGggemVybyB0byBoYW5kbGUgcmVjZW50IHJlYWRfcmVnaXN0ZXJfYnl0ZXMgY2hhbmdlLgorCSogaXJpeDQtbmF0LmMsIGlyaXg1LW5hdC5jLCBtaXBzdjQtbmF0LmMgKHN1cHBseV9ncmVnc2V0LAorCWZpbGxfZ3JlZ3NldCk6ICBGaXggaGFuZGxpbmcgb2YgQ0FVU0VfUkVHTlVNLgorCSogbWlwcy1uYXQuYyAoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogIEhhbmRsZSB1bndyaXRhYmxlCisJcmVnaXN0ZXJzIHdoZW4gc3RvcmluZyBhIHNpbmdsZSByZWdpc3Rlci4KKwkqIGNvbmZpZy9taXBzL3RtLWlyaXgzLmggKENBVVNFX1JFR05VTSwgQkFEVkFERFJfUkVHTlVNKToKKwlGaXggZGVmaW5pdGlvbnMuCisKKwkqIG1kZWJ1Z3JlYWQuYyAocGFyc2Vfc3ltYm9sLCBwc3ltdGFiX3RvX3N5bXRhYl8xKTogIENsZWFyCisJYWxsb2NhdGVkIG1pcHNfZXh0cmFfZnVuY19pbmZvLCBpZiB0aGUgZGVidWcgaW5mbyBpcyBjb3JydXB0LAorCXRoZSBQRFIgdG8gZmlsbCBpdCBpbiBtaWdodCBiZSBtaXNzaW5nLgorCitNb24gTWFyIDI3IDE0OjQzOjAwIDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+CisKKwkqIHZ4LXNoYXJlL3JlZ1BhY2tldC5oOiBhIG5ldyBmaWxlIGludGVyZmFjaW5nIHdpdGggdnh3b3Jrcy4KKworU3VuIE1hciAyNiAxMzoyMjo0NyAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jIChicHN0YXRfZG9fYWN0aW9ucyk6IE9uY2Ugd2UndmUgZXhlY3V0ZWQgdGhlCisJY29tbWFuZHMsIHNldCBicy0+Y29tbWFuZHMgdG8gTlVMTC4KKworU2F0IE1hciAyNSAwMToxNjoxMCAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGJ1aWxkc3ltLmMgKHBhdGNoX3N1YmZpbGVfbmFtZSk6ICBVcGRhdGUgbGFzdF9zb3VyY2VfZmlsZQorCXdpdGggdGhlIHJlYWwgc291cmNlIGZpbGUgbmFtZS4KKwkqIGRieHJlYWQuYyAoZW5kX3BzeW10YWIpOiAgSGFuZGxlIHN0YXRpYyBmdW5jdGlvbnMgaW4gdGhlCisJU09GVU5fQUREUkVTU19NQVlCRV9NSVNTSU5HIGNhc2UgYnkgcGFzc2luZyBwc3QtPmZpbGVuYW1lCisJdG8gbG9va3VwX21pbmltYWxfc3ltYm9sLgorCShwcm9jZXNzX29uZV9zeW1ib2wpOiAgSWdub3JlIGV4dHJhIG91dGVybW9zdCBjb250ZXh0IGZyb20KKwlTdW5QUk8gY2MgYW5kIGFjYy4KKwkqIHN0YWJzcmVhZC5jIChkZWZpbmVfc3ltYm9sKTogIERvIG5vdCBjb21wbGFpbiBmb3IgU3VuUFJPCisJc3RhdGljIHZhcmlhYmxlIGVuY29kaW5nIGlmIFNUQVRJQ19UUkFOU0ZPUk1fTkFNRSBpcyBkZWZpbmVkLgorCSogc3BhcmMtdGRlcC5jLCBjb25maWcvc3BhcmMvdG0tc3VuNHNvbDIuaAorCShzdW5wcm9fc3RhdGljX3RyYW5zZm9ybV9uYW1lKTogIFJlbmFtZWQgZnJvbQorCXNvbGFyaXNfc3RhdGljX3RyYW5zZm9ybV9uYW1lLgorCSogY29uZmlnL3NwYXJjL3RtLXN1bjRvczQuaCAoU1RBVElDX1RSQU5TRk9STV9OQU1FKToKKwlEZWZpbmUgdG8gc3VucHJvX3N0YXRpY190cmFuc2Zvcm1fbmFtZSBmb3IgYWNjIDMuMCBjb21waWxlZAorCWV4ZWN1dGFibGVzLgorCSogcHJvY2ZzLmMsIGNvbmZpZy9hbHBoYS9ubS1vc2YyLmggKFBST0NGU19ET05UX1RSQUNFX0ZBVUxUUyk6CisJUmVuYW1lZCBmcm9tIFBST0NGU19ET05UX1RSQUNFX0lGQVVMVCwgZG9uJ3QgdHJhY2UgYW55IGZhdWx0cworCWlmIGRlZmluZWQuCisJKiBwcm9jZnMuYyAoaW5mb19wcm9jX3NpZ2luZm8pOiAgQ2FzdCBzaXAtPnNpX2FkZHIgdG8KKwlgdW5zaWduZWQgbG9uZycgYW5kIHVzZSBgbHgnIGZvcm1hdCBmb3IgcHJpbnRpbmcgaXQuCisKK0ZyaSBNYXIgMjQgMTU6NDU6NDIgMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgTW92ZSB0ZXN0IGZvciBtNjgqLWVzdC0qIGJlZm9yZSBtNjgqLSotY29mZiouCisJKiBmaW5kdmFyLmM6ICBNb3ZlIGRlZmF1bHQgZGVmIG9mIENBTk5PVF9TVE9SRV9SRUdJU1RFUiBjbG9zZXIgdG8KKwl0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb2RlLgorCSogKHdyaXRlX3JlZ2lzdGVyX2dlbik6ICBOZXcgcm91dGluZS4gIEFuYWxvZ291cyB0bworCXJlYWRfcmVnaXN0ZXJfZ2VuLgorCSogKHdyaXRlX3JlZ2lzdGVyX2J5dGVzKTogIEFub3RoZXIgcmV3cml0ZSEgIE1ha2UgaXQgc21hcnRlciBhYm91dAorCW5vdCB1cGRhdGluZyByZWdzIHdpdGggdGhlIHNhbWUgdmFsdWUuCisJKiBtb25pdG9yLmMgKHByaW50Zl9tb25pdG9yIHJlYWRjaGFyKTogIFVzZSBzdGRlcnIgaW5zdGVhZCBvZgorCXN0ZG91dCB0byBvdXRwdXQgZGVidWcgaW5mby4gIEFsc28gY2xlYW51cCByZWFkY2hhciBhIGxpdHRsZS4KKwkqIChleHBlY3QpOiAgTWFrZSBzdXJlIHRoYXQgZXhjZXNzaXZlIHJlc3BvbnNlcyBhcmUgbnVsbAorCXRlcm1pbmF0ZWQuCisJKiAobW9uaXRvcl9vcGVuKTogIENoZWNrIGZvciBtYWdpYyBudW1iZXIgaW4gbW9uaXRvcl9vcHMgc3RydWN0LgorCUFsbG93IG11bHRpcGxlIGNvbW1hbmRzIGFzIGluaXQgc3RyaW5ncy4gIEFsc28sIGNsZWFyIGFsbAorCWJyZWFrcG9pbnRzLgorCSogKG1vbml0b3JfcmVzdW1lIG1vbml0b3Jfd2FpdCk6ICBTZW5kIGEgY29tbWFuZCB0byBkdW1wIGFsbCB0aGUKKwlyZWdzIGZvciB0aG9zZSB0YXJnZXRzIHdoaWNoIGRvbid0IGRvIHNvIHdoZW4gd2FraW5nIHVwIGFmdGVyIGEKKwljb250aW51ZSBjb21tYW5kLgorCSogKG1vbml0b3Jfd2FpdCk6ICBIYW5kbGUgZXhjZXNzaXZlIHJlc3BvbnNlIG91dHB1dCBiZXR0ZXIuCisJKiAobW9uaXRvcl93cml0ZV9tZW1vcnkpOiAgVXNlIGJsb2NrIGZpbGwsIHdvcmQsIGFuZCBsb25nIHdvcmQKKwljb21tYW5kcyAoaWYgdGhleSBleGlzdCkgdG8gd3JpdGUgbWVtb3J5IG1vcmUgZWZmaWNpZW50bHkuCisJKiBHZW5lcmFsIGNsZWFudXBzIHRvIHVzZSBmbGFnIGJpdHMgaW5zdGVhZCBvZiBpbmRpdmlkdWFsIGZsYWcKKwl3b3JkcyBpbiBtb25pdG9yX29wcyBzdHJ1Y3QuCisJKiAobW9uaXRvcl9jb21tYW5kKTogIFJldHVybiBvdXRwdXQgZnJvbSBjb21tYW5kLgorCSogKG1vbml0b3JfbG9hZF9zcmVjKTogIEFsbG9jYXRlIGJ1ZmZlciBvbmx5IG9uY2UuICBVc2UgYWxsb2NhLgorCVdhaXQgZm9yIGxvYWQgcmVzcG9uc2Ugc3RyaW5nIGluc3RlYWQgb2YgdXNpbmcgYSB0aW1lb3V0IHRvIHN0YXJ0CisJc2VuZGluZyBTLXJlY29yZHMuICBGaXggYnVnIHdoZXJlIHZhbHVlIG9mIHNyZWNfZnJhbWUgc2hyaW5rcy4gIElmCisJaGFzaG1hcmsgaXMgc2V0LCBwcmludCBgLScgZm9yIHJldHJhbnNtaXNzaW9ucy4gIEdlbmVyYWwgY2xlYW51cHMuCisJKiAobW9uaXRvcl9tYWtlX3NyZWMpOiAgR2V0IHJpZCBvZiBTLXJlY29yZCBkZWZhdWx0IHR5cGUga2x1ZGdlLgorCSogbW9uaXRvci5oOiAgVXNlIHNlcGVyYXRlIHN0cnVjdCBmb3IgbWVtb3J5IGFuZCByZWdpc3RlcgorCXJlYWQvd3JpdGUgY29tbWFuZHMuICBNZW1vcnkgY29tbWFuZHMgY2FuIGNvbWUgaW4gYnl0ZSwgd29yZCwKKwlsb25nLCBhbmQgbG9uZ2xvbmcgZm9ybXMuCisJKiAobW9uaXRvcl9vcHMpOiAgQ2hhbmdlIGxvdHMgb2YgZmllbGRzLiAgR2VuZXJhbGl6ZSBzb21lIHN0dWZmLgorCVB1dCBhbGwgZmxhZ3MgaW50byBmbGFncyB3b3JkLiAgQWxsb3cgaW5pdCB0byBiZSBhIGxpc3Qgb2YgY29tbWFuZHMuCisJQWRkIGNvbW1hbmQgZm9yIGNsZWFyaW5nIGFsbCBicmVha3BvaW50cywgYmxvY2sgZmlsbCwgZHVtcGluZyBhbGwKKwlyZWdpc3RlcnMuCisJKiByZW1vdGUtZXN0LmM6ICBSZXdyaXRlIHRvIHVzZSBuZXcgbW9uaXRvciBjb252ZW50aW9ucy4KKwkqIGNvbmZpZy9tNjhrL2VzdC5tdCAoVERFUEZJTEVTKTogIEFkZCBtb25pdG9yLm8uCisJKiBjb25maWcvbTY4ay90bS1lc3QuaDogIFNldCBOVU1fUkVHUyB0byAxOC4KKwkqIHRlc3RzdWl0ZS9nZGIuYmFzZS9icmVhay5leHA6ICBMb3RzIG9mIGNsZWFudXBzLiAgVXNlIGdkYl90ZXN0CisJbW9yZSB0aG9yb3VnaGx5LgorCitUaHUgTWFyIDIzIDIzOjIwOjAwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisgICAgICAgICogc29tc29saWIuYyAoc29tX3NvbGliX2FkZCk6IEhhbmRsZSBjYXNlIHdoZXJlIGEgc2hhcmVkIGxpYnJhcnkKKyAgICAgICAgcmVmZXJlbmNlZCBieSBhIGNvcmUgZmlsZSBoYXMgc2VjdGlvbnMgd2l0aG91dCB0aGUgU0VDX0FMTE9DIGJpdAorICAgICAgICBzZXQgKGVnIHN0YWJzIHNlY3Rpb25zKS4KKworVGh1IE1hciAyMyAxNTowNzowOCAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jIChicHN0YXRfZG9fYWN0aW9ucyk6IEZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGJwc3RhdAorCWNoYWluLCBkbyBhbGwgdGhlIGNvbW1hbmRzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IHJ1biB0aGUKKwlpbmZlcmlvci4KKworV2VkIE1hciAyMiAxOToxNzowNiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGN5Z251cy5jb20+CisKKwkqIG1lbS1icmVhay5jIChMSVRUTEVfQlJFQUtQT0lOVCwgQklHX0JSRUFLUE9JTlQpOiBEZWZpbmUgYXMKKwlCUkVBS1BPSU5UIGlmIG1vbm8tZW5kaWFuLgorCShicmVha19pbnNuKTogRGVsZXRlZC4KKwkoYmlnX2JyZWFrX2luc24sIGxpdHRsZV9icmVha19pbnNuKTogRGVmaW5lLgorCShtZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQpOiBIYW5kbGUgYmktZW5kaWFuIGNwdXMuCisJKEJSRUFLUE9JTlRfTEVOKTogRGVmaW5lLgorCShtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQpOiBVc2UgaXQuCisJKG1lbW9yeV9icmVha3BvaW50X3NpemUpOiBMaWtld2lzZS4KKworVHVlIE1hciAyMSAxNzowMzoxNyAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAbWV4aWNhbi5jeWdudXMuY29tPgorCisJKiBzcGFyYy1zdHViLmM6IGFkZCBub3AgYWZ0ZXIgJ2JnIGdvb2Rfd2ltJy4KKwkqIHNwYXJjbC1zdHViLmM6IGRpdHRvLgorCitUdWUgTWFyIDIxIDEzOjM0OjEyIDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBpbmZydW4uYyAoaGFuZGxlX2NvbW1hbmQpOiBEb24ndCBwcmludCBUQVJHRVRfU0lHTkFMXzAsCisJVEFSR0VUX1NJR05BTF9VTktOT1dOLCBvciBUQVJHRVRfU0lHTkFMX0RFRkFVTFQuCisKK01vbiBNYXIgMjAgMTA6MDk6NTkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcGFiLW5hdC5jIChzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMpOiBTeW5jIHdpdGggSFBVWCB2ZXJzaW9uLgorCitNb24gTWFyIDIwIDA3OjM0OjQ4IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGhwcGFoLW5hdC5jIChzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMpOiAgTW92ZSBjaGVjayBmb3IKKwlDQU5OT1RfU1RPUkVfUkVHSVNURVIgdG8gYSBiZXR0ZXIgcGxhY2UuICBGaXhlcyBwdHJhY2UgSS9PIGVycm9ycworCWZvdW5kIGJ5IHRlc3Qgc3VpdGUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLCB3aGljaCBhdHRlbXB0cyB0byB3cml0ZQorCXVud3JpdGFibGUgcmVnaXN0ZXJzLgorCitTYXQgTWFyIDE4IDAyOjAyOjI0IDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogbWRlYnVncmVhZC5jIChwYXJzZV9zeW1ib2wpOiAgSWYgZmluaXNoaW5nIGEgZnVuY3Rpb24gd2l0aG91dAorCWtub3duIHBhcmFtZXRlciB0eXBlIGluZm8sIHNldCB0aGF0IGZyb20gcGFyYW1ldGVyIHN5bWJvbHMuCisJUmVtb3ZlIGNvbW1lbnRlZC1vdXQgYWRkX3BhcmFtX3RvX3R5cGUgc3VwcG9ydC4KKworVGh1IE1hciAxNiAxNjozODowMyAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogeGNvZmZyZWFkLmMgKHByb2Nlc3NfbGluZW5vcyk6IE1ha2Ugc3VyZSBmaWxlbmFtZSB3ZSBwYXNzIHRvCisJc3RhcnRfc3ViZmlsZSB3aWxsIGNhdXNlIGRlZHVjZV9sYW5ndWFnZV9mcm9tX2ZpbGVuYW1lIHRvIHJldHVybgorCXRoZSBjb3JyZWN0IHRoaW5nLiAgUmVpbmRlbnQgZnVuY3Rpb24gdG8gR05VIHN0YW5kYXJkcy4KKworVGh1IE1hciAxNiAxNTo1NDowMCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIG5sbS9nZGJzZXJ2ZS5jIChoYW5kbGVfZXhjZXB0aW9uKTogI2lmIG91dCBjYWxsIHRvIFN0b3BCZWxsLAorCSAgYXMgaXQgaXMgbm90IGF2YWlsYWJsZSBvbiBOZXRXYXJlIDMgb3IgUElOLgorCSogbmxtL3BwYy5jIChTdG9wQmVsbCk6IFJlbW92ZWQuCisKK1RodSBNYXIgMTYgMTI6MTQ6NDEgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHhjb2ZmcmVhZC5jIChyZWFkX3hjb2ZmX3N5bXRhYik6IFdoZW4gY3JlYXRpbmcgYSBkdW1teSBwYXJhbWV0ZXIKKwlpbmZlcnJlZCBmcm9tIHRoZSB0cmFjZWJhY2sgdGFncywgZ2l2ZSBpdHMgdHlwZSB0aGUgbmFtZQorCSI8bm9uLWZsb2F0IHBhcmFtZXRlcj4iLgorCisJKiBzdGFic3JlYWQuYyAocnM2MDAwX2J1aWx0aW5fdHlwZSk6IFJlY29nbml6ZSB0eXBlcyAtMzEgdG8gLTM0LgorCitXZWQgTWFyIDE1IDE1OjA5OjI5IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGZpbmR2YXIuYyAocmVhZF9yZWdpc3Rlcl9ieXRlcyB3cml0ZV9yZWdpc3Rlcl9ieXRlcyk6ICBNYWtlCisJdGhlc2Ugcm91dGluZXMgbXVjaCBzbWFydGVyIGFib3V0IHVwZGF0aW5nIHJlZ2lzdGVycyBmcm9tIHRoZQorCXRhcmdldCwgb25seSBkb2luZyBzbyB3aGVuIGFic29sdXRlbHkgbmVjZXNzYXJ5LiAgVGhpcyByZWFsbHkKKwlzcGVlZHMgdXAgcmVnaXN0ZXIgbW9kaWZpY2F0aW9uIG9uIHNvbWUgcmVtb3RlIHRhcmdldHMuCisKKwkqIG1vbml0b3IuYzogIE1vcmUgY2xlYW51cHMuICBHZXQgcmlkIG9mIG1vbml0b3JfbG9hZF9hc2NpaV9zcmVjLgorCUJGRCBtYWtlcyB0aGlzIHVubmVjZXNzYXJ5LiAgTG90cyBvZiBkZWJ1Z2dpbmcgc3BlZWR1cHMuCisJKiAoZXhwZWN0KTogIE5VTEwgdGVybWluYXRlIHJldHVybiBzdHJpbmcuCisJKiAobW9uaXRvcl9vcGVuCW1vbml0b3Jfc3VwcGx5X3JlZ2lzdGVyIHBhcnNlX3JlZ2lzdGVyX2R1bXAKKwltb25pdG9yX3dhaXQgbW9uaXRvcl9mZXRjaF9yZWdpc3Rlcik6ICBTd2l0Y2ggdG8gdXNpbmcgR05VIHJlZ2V4cAorCWxpYnJhcnkgdG8gcGFyc2UgbXVsdGktcmVnaXN0ZXIgZGlzcGxheXMuCisJKiAobW9uaXRvcl9yZWFkX21lbW9yeSk6IFJlYWQgbXVsdGlwbGUgYnl0ZXMgKHVwIHRvIDE2KSBhdCBvbmNlLgorCSogKG1vbml0b3JfY3JlYXRlX2luZmVyaW9yKTogIENhbGwgY2xlYXJfcHJvY2VlZF9zdGF0dXMgdG8gbWFrZSBydW4KKwljb21tYW5kIG5vdGljZSBmaXJzdCBicmVha3BvaW50LgorCSogKG1vbml0b3JfbG9hZCk6ICBDbGVhbiB1cC4gIFJlc2V0IGluZmVyaW9yX3BpZCwgc2V0IHBjIHRvIHN0YXJ0CisJYWRkcmVzcyBhbmQgcmVzZXQgc3ltYm9sIHRhYmxlIHN0dWZmIHRvIG1ha2UgbG9hZHMgcHV0IHRoaW5ncyBpbnRvCisJYSBmcmVzaCBzdGF0ZS4KKwkqIChtb25pdG9yX2xvYWRfc3JlYyk6ICBMb3dlciBzbGVlcCB0aW1lIHRvIDEgc2Vjb25kLgorCisJKiBtb25pdG9yLmggKHN0cnVjdCBtb25pdG9yX29wcyk6ICBBZGQgcmVnaXN0ZXJfcGF0dGVybiBhbmQKKwlzdXBwbHlfcmVnaXN0ZXIgdG8gbW9uaXRvcl9vcHMuCisKKwkqIHJvbTY4ay1yb20uYzogIEFkZCBuZXcgc3VwcG9ydCBmb3IgaGFuZGxpbmcgcmVnaXN0ZXIgZHVtcHMuCisJKiBjb25maWcvbTY4ay90bS1tNjhrLmg6ICBEZWZpbmUgRDBfUkVHTlVNIGFuZCBBMF9SRUdOVU0gZm9yIHJlZ2lzdGVyCisJZHVtcCBoYW5kbGluZy4KKworV2VkIE1hciAxNSAxNToxODoyNyAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogdXRpbHMuYywgZGVmcy5oIChwdXRjaGFyX3VuZmlsdGVyZWQsIGZwdXRjX3VuZmlsdGVyZWQpOiBNYWtlCisJYXJndW1lbnQgYmUgYW4gaW50LCBub3QgYSBjaGFyLiAgVXNpbmcgYSBwcm90b3R5cGUgZm9sbG93ZWQgYnkgYW4KKwlvbGQtc3R5bGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBhIGNhc2Ugd2hlcmUgYW4gYXJndW1lbnQgaXMKKwl3aWRlbmVkIGlzIGEgR0NDLWlzbSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBuYXRpdmUgQUlYIGNvbXBpbGVyLgorCitXZWQgTWFyIDE1IDEyOjIyOjM1IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogbmxtc3R1Yi5kZWY6IFJlbW92ZWQsIHRoaXMgd2FzIG1vdmVkIHRvIG5sbS9nZGJzZXJ2ZS5kZWYgCisJICBsb25nIGFnby4KKworCSogY29uZmlndXJlLmluIChhbHBoYS0qLW5ldHdhcmUqKTogUmVtb3ZlZCBjb25maWd1cmF0aW9uLgorCSogY29uZmlnL2FscGhhL3thbHBoYS1udy5tdCwgZ2Ric2VydmUubXQsIHRtLWFscGhhbncuaH06IFJlbW92ZWQuCisJKiBubG0ve1JFQURNRS1BTFBIQS1ORVRXQVJFLCBhaW8uaCwgYWxwaGEtaW8uUywgYWxwaGEtcmVnZGVmLmgsCisJICBhbHBoYS5jLCBhbHBoYS5oLCBhbHRkZWJ1Zy5ofTogUmVtb3ZlZC4KKworCSogbmxtL2dkYnNlcnZlLmMgKG1haW4pOiBBZGQgc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBCT0FSRD0KKwkgIGFyZ3VtZW50LCBkZXByZWNhdGUgTk9ERT0uCisKK1dlZCBNYXIgMTUgMTA6NTg6MjYgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGMtZXhwLnkgKHl5bGV4KTogTWFrZSBhbiBlbXB0eSBjaGFyYWN0ZXIgY29uc3RhbnQgYW4gZXJyb3IuCisKK1R1ZSBNYXIgMTQgMTU6MDA6NTQgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIHZhbG9wcy5jICh2YWx1ZV9hcmdfY29lcmNlKTogIERvIHBvc3NpYmxlIHZhbHVlX2NvZXJjZV9hcnJheQorCWJlZm9yZSBkZXRlcm1pbmluZyB0eXBlIGFyZ3VtZW50IHRvIHZhbHVlX2Nhc3QuCisKK1R1ZSBNYXIgMTQgMTA6NDE6NDEgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLWVzLmM6IFJlcGxhY2UgaWdub3JlIHdpdGggMC4KKworVHVlIE1hciAxNCAwNTo1MjozNiAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogdmFsb3BzLmMgKHZhbHVlX3JlcGVhdCksIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwX3N0YW5kYXJkKToKKwlJZiBWQUxVRV9SRVBFQVRFRCBpcyBhbHJlYWR5IHNldCwganVzdCBlcnJvciBvdXQuCisKKwkqIHZhbG9wcy5jICh2YWx1ZV9jYXN0LCB2YWx1ZV9zbGljZSksIHBhcnNlLmMgKGZvbGxvd190eXBlcyk6IEFkZAorCUZJWE1FLXR5cGUtYWxsb2NhdGlvbiBjb21tZW50cy4KKworCSogZ2RidHlwZXMuaCAoc3RydWN0IHR5cGUpOiBGaXggY29tbWVudCBhYm91dCB3aGF0IHVuaXRzIHRoZQorCVRZUEVfTEVOR1RIIGlzIGluLgorCitNb24gTWFyIDEzIDE4OjI3OjI1IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogY2gtdmFscHJpbnQuYyAoYW5ub3RhdGUuaCk6IEluY2x1ZGUuCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cF9zdGFuZGFyZCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCisJKGNhbGNfZjc3X2FycmF5X2RpbXMpOiBBZGQgcGFyZW5zIHRvIGV4cHJlc3Npb24uCisJKiBmLWV4cC55ICh5eWxleCk6IEFkZCBwYXJlbnMgdG8gZXhwcmVzc2lvbiwgcmVtb3ZlIHVudXNlZCBsYWJlbC4KKwkqIGYtbGFuZy5oIChjYWxjX2Y3N19hcnJheV9kaW1zKTogRGVjbGFyZS4KKwkqIGYtdmFscHJpbnQuYyAoZl92YWxfcHJpbnQpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KKworTW9uIE1hciAxMyAxNToyNTo0NyAxOTk1ICBKaW0gS2luZ2RvbiAgPGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbT4KKworCSogYWxwaGEtdGRlcC5jIChmaW5kX3Byb2NfZGVzYyk6IElmIHBkci5mcmFtZXJlZyBmaWVsZCBpcyAtMSwgZG9uJ3QKKwl1c2UgdGhlIFBEUiwganVzdCBleGFtaW5lIHByb2xvZ3VlcyBpbnN0ZWFkLgorCitGcmkgTWFyIDEwIDE2OjEzOjE4IDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9hcmMvdG0tYXJjLmg6IENoYW5nZSBhcmMgcmVnaXN0ZXIgbmFtZXMuCisKK0ZyaSBNYXIgMTAgMDI6NDk6NDAgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJRml4IHByb2JsZW1zIHdpdGggaW5maW5pdGUgcmVjdXJzaW9uIHdoZW4gcHJpbnRpbmcgYSBjbGFzcworCXRoYXQgY29udGFpbnMgYSBzdGF0aWMgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzLgorCSogY3AtdmFscHJpbnQuYyAoZG9udF9wcmludF92Yl9vYnN0YWNrKTogIFJlbmFtZWQgZnJvbQorCWRvbnRfcHJpbnRfb2JzdGFjaywgbWFkZSBzdGF0aWMuCisJKGRvbnRfcHJpbnRfc3RhdG1lbV9vYnN0YWNrKTogIE5ldyBvYnN0YWNrLCBjb250cm9scyBwcmludGluZworCW9mIHN0YXRpYyBtZW1iZXIgY2xhc3Nlcy4KKwkoX2luaXRpYWxpemVfY3BfdmFscHJpbnQpOiAgSW5pdGlhbGl6ZSBpdC4KKwkoY3BfcHJpbnRfc3RhdGljX2ZpZWxkKTogIE5ldyBmdW5jdGlvbiwgaGFuZGxlcyBwcmludGluZyBvZgorCXN0YXRpYyBtZW1iZXJzLgorCShjcF9wcmludF92YWx1ZV9maWVsZHMpOiAgTmV3IHBhcmFtZXRlciBkb250X3ByaW50X3N0YXRtZW0gdG8KKwloYW5kbGUgcmVjdXJzaXZlIHByaW50aW5nIG9mIHN0YXRpYyBtZW1iZXIgY2xhc3NlcywgdXNlCisJY3BfcHJpbnRfc3RhdGljX2ZpZWxkIHRvIGhhbmRsZSBwcmludGluZyBvZiBzdGF0aWMgbWVtYmVycy4KKwkqIGMtdmFscHJpbnQuYyAoY3BfcHJpbnRfdmFsdWVfZmllbGRzKTogIFVwZGF0ZSBwcm90b3R5cGUgYW5kCisJY2FsbCB0byBpbmNsdWRlIGFkZGl0aW9uYWwgZG9udF9wcmludF9zdGF0bWVtIHBhcmFtZXRlci4KKwkqIGMtdmFscHJpbnQuYywgZi12YWxwcmludC5jIChkb250X3ByaW50X29ic3RhY2spOiAgUmVtb3ZlIHVudXNlZAorCWV4dGVybiBkZWNsYXJhdGlvbi4KKworCSogYWxwaGEtdGRlcC5jLCBmaW5kdmFyLmMsIGluZnB0cmFjZS5jOiAgSW5jbHVkZSA8c3RyaW5nLmg+LgorCisJKiBjb25maWcvYWxwaGEvdG0tYWxwaGEuaCAoRlJBTUVfRklORF9TQVZFRF9SRUdTKTogIENhbGwKKwlhbHBoYV9maW5kX3NhdmVkX3JlZ3MgaWYgZmktPnNhdmVkX3JlZ3MgaXMgc3RpbGwgTlVMTC4KKworCSogZWxmcmVhZC5jIChlbGZfc3ltdGFiX3JlYWQpOiAgRW5zdXJlIHRoYXQgdGhlIGZpbGVuYW1lIGZpZWxkCisJb2YgYSBtaW5zeW0gaXMgbm9uZW1wdHkuIElnbm9yZSBzb2xpYiB0cmFtcG9saW5lIHN5bWJvbHMgZnJvbQorCXRoZSBtYWluIHN5bWJvbCB0YWJsZSwgdGhleSBtaWdodCBoYXZlIGEgYm9ndXMgdmFsdWUuCisKKwkqIHByb2Nmcy5jIChzZXRfcHJvY19zaWdpbmZvKSwgY29uZmlnL2FscGhhL2FscGhhLW9zZjIubWg6CisJRml4IHR5cG9zIGluIGNvbW1lbnRzLgorCitUaHUgTWFyICA5IDE3OjE5OjQ3IDE5OTUgIEppbSBLaW5nZG9uICA8a2luZ2RvbkBkZW5lYi5jeWdudXMuY29tPgorCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3N5bWJvbCwgcHN5bXRhYl90b19zeW10YWJfMSk6IEluaXRpYWxpemUKKwlwZHIuZnJhbWVyZWcgZmllbGQgb2YgTUlQU19FRklfU1lNQk9MX05BTUUgc3ltYm9sIHRvIC0xLiAgVGhhdCB3YXkKKwl3ZSBrbm93IHdoZXRoZXIgdGhlIFBEUiBldmVyIGdvdCBzZXQuCisJKiBtaXBzLXRkZXAuYyAoZmluZF9wcm9jX2Rlc2MpOiBJZiBwZHIuZnJhbWVyZWcgZmllbGQgaXMgLTEsIGRvbid0CisJdXNlIHRoZSBQRFIsIGp1c3QgZXhhbWluZSBwcm9sb2d1ZXMgaW5zdGVhZC4KKworV2VkIE1hciAgOCAyMzozNToxMCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc29tc29saWIuYyAoc29tX3NvbGliX3NlY3Rpb25fb2Zmc2V0cyk6IEdldCBvZmZzZXQgb2YgdGV4dAorCXNlY3Rpb24gcmlnaHQuIAorCitXZWQgTWFyICA4IDE2OjEyOjIxIDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKworCSogc291cmNlLmMgKGZvcndhcmRfc2VhcmNoX2NvbW1hbmQgcmV2ZXJzZV9zZWFyY2hfY29tbWFuZCk6ICBTZXQKKwljb252ZW5pZW5jZSB2YXJpYWJsZSAkXyB0byBiZSB0aGUgbGluZSAjIG9mIHRoZSBtYXRjaC4KKwkqIHN5bXRhYi5jIChkZWNvZGVfbGluZV8xKTogIEFsbG93IGNvbnZlbmllbmNlIHZhcmlhYmxlcyB0byBiZQorCXVzZWQgaW4gbGluZSBzcGVjcyAoZm9yIGJyZWFrcG9pbnRzIGFuZCBzdWNoKS4KKworV2VkIE1hciAgOCAxMjo1MTowMCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogQnVtcCB0byA0LjE0LjEuCisJKiBORVdTLCBSRUFETUU6IFVwZGF0ZSBmb3IgNC4xNC4KKwkqIGkzODZ2LW5hdC5jIChpMzg2X2luc2VydF9hbGlnbmVkX3dhdGNocG9pbnQpOiBGaXggZGVjbGFyYXRpb24uCisJKGkzODZfaW5zZXJ0X25vbmFsaWduZWRfd2F0Y2hwb2ludCk6IENhbGwgYWxpZ25lZCBpbnN0ZWFkIG9mCisJZ2VuZXJpYyB3YXRjaHBvaW50IGluc2VydGlvbi4KKworVHVlIE1hciAgNyAxOToyNjoxMCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogdmFsb3BzLmMgKHZhbHVlX3NsaWNlKTogIERvIENPRVJDRV9WQVJZSU5HX0FSUkFZLgorCitUdWUgTWFyICA3IDAwOjIzOjQ3IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIG1vbml0b3IuYywgYXJyYXktcm9tLmMsIG1vbml0b3IuaCwgcm9tNjhrLXJvbS5jOiAgTW92ZSB0YXJnZXRfb3BzCisJaW50byBtb25pdG9yLmMuCisJKiBtb25pdG9yLmMgKG1vbml0b3JfY3JlYXRlX2luZmVyaW9yKTogIEFsbG93IHJ1biBjb21tYW5kIHRvIHN0YXJ0CisJcHJvZ3JhbS4KKworCSogbW9uaXRvci5jIChtb25pdG9yX2xvYWQpOiAgU2V0IFBDIHRvIHN0YXJ0IGFkZHJlc3Mgd2hlbiBkb25lCisJbG9hZGluZy4KKworCSogYXJyYXktcm9tLmMsIG1vbml0b3IuaCwgcm9tNjhrLXJvbS5jOiAgQ2xlYW4gdXAgdGFyZ2V0X29wcy4KKwlSZW1vdmUgcmVmIHRvIG1vbml0b3JfY3JlYXRlX2luZmVyaW9yLgorCisJKiBtb25pdG9yLmM6ICBNb3JlIGdlbmVyYWwgY2xlYW51cHMuICBBZGQgcHJvdG90eXBlcywgcmVtb3ZlCisJdW51c2VkIHJvdXRpbmVzLiAgRml4IGJ1ZyB3aXRoIHdyb25nIG51bWJlciBvZiBhcmdzIHRvIGVycm9yKCkuCisKKwkqIG1haW4uYyAobWFpbik6ICBEb24ndCBzdGFydCB1cCBHVUkgd2hlbiBydW5uaW5nIHVuZGVyIGdkYiBtb2RlCisJaW4gZW1hY3MuCisKKwkqIE1ha2VmaWxlLmluOiAgQWRkIHJ1bGVzIGZvciBtb25pdG9yLm8gYW5kIHJvbTY4ay1yb20ubyB0byBtYWtlCisJU3VuIG1ha2UgKHdpdGggVlBBVEgpIHdvcmsuLi4KKworCSogbW9uaXRvci5jLCBtb25pdG9yLmgsIHJvbTY4ay1yb20uYzogIFNlcmlvdXMgY2xlYW51cCB0byBtYWtlIElEUAorCShyb202OGspIHRhcmdldCB3b3JrIHJpZ2h0LgorCSogYXJyYXktcm9tLmMsIG9wNTAtcm9tLmMsIHc4OWstcm9tLmM6ICBQYXJ0aWFsIHVwZGF0ZXMgdG8gbmV3CisJbW9uaXRvci5jIGludGVyZmFjZS4gIE1vcmUgd29yayBuZWVkcyB0byBiZSBkb25lIGhlcmUuCisJKiBjb25maWcvbTY4ay90bS1tb25pdG9yLmg6ICBDaGFuZ2UgREVDUl9QQ19BRlRFUl9CUkVBSyB0byAwIHRvCisJbWF0Y2ggdGhlIElEUCBtb25pdG9yLiAgQWxzbywgc2V0IE5VTV9SRUdTIHRvIDE4IGN1eiB0aGVyZSdzIG5vCisJZmxvYXRpbmctcG9pbnQgZm9yIHRoaXMgY2FyZC4KKworCSogc2VyaWFsLmgsIHNlci1nbzMyLmMsIHNlci1tYWMuYywgc2VyLXRjcC5jLCBzZXItdW5peC5jOiBBZGQKKyAJU0VSSUFMX1NFVFNUT1BCSVRTIHRvIHNldCB0aGUgbnVtYmVyIG9mIHN0b3BiaXRzIChuZWVkZWQgZm9yIElEUAorIAlib2FyZD8hPyE/KS4KKworCSogZGVmcy5oLCB1dGlscy5jLCByZW1vdGUtaG1zLmMsIHJlbW90ZS1wYS5jLCByZW1vdGUuYzogIEZpeCBkZWZzCisJYW5kIHVzYWdlIG9mIGZwdXRjX3VuZmlsdGVyZWQgYW5kIHB1dGNoYXJfdW5maWx0ZXJlZC4gIEVsaW1pbmF0ZQorCXB1dGNfdW5maWx0ZXJlZCAoaXQncyBzdXBlcmZsdW91cykuCisKKwkqIGNvbW1hbmQuaCwgY29tbWFuZC5jLCB0b3AuYzogIEFkZCB2YXJfZW51bSBjb21tYW5kIHR5cGUuICBJdCdzCisJbGlrZSB2YXJfc3RyaW5nIGJ1dCBhbGxvd3Mgb25seSBvbmx5IG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MuCisKK01vbiBNYXIgIDYgMTU6MDM6NTkgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHZhbG9wcy5jICh2YWx1ZV9jYXN0KTogRG9uJ3QgdXNlIGJhY2tzbGFzaCBuZXdsaW5lLS1wcmUtQU5TSQorCWNvbXBpbGVycyAoc3VjaCBhcyBTdW5PUzQgL2Jpbi9jYykgZG9uJ3QgZ2VuZXJhbGx5IHN1cHBvcnQgaXQKKwlleGNlcHQgaW4gc29tZSBjb250ZXh0cy4KKworRnJpIE1hciAgMyAxNzo0Mjo0OCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogdmFsb3BzLmMgKHZhbHVlX2Nhc3QpOiAgQ2hlY2sgZm9yIGNhc3QgdG8gYXJyYXkgdHlwZSAqYmVmb3JlKgorCXdlIGNvZXJjZSBhcnJheSB0byBwb2ludGVyIChpbiBjYXNlIGFyZzIgaXMgYWxyZWFkeSBhcnJheSkuCisKKwkqIHZhbG9wcy5jIChjYWxsX2Z1bmN0aW9uX2J5X2hhbmQpOiAgU2V0IHVzaW5nX2djYyB0byAyIGlmIHVzaW5nCisJZ2NjMi4gIE5lZWRlZCBmb3IgUkVHX1NUUlVDVF9IQVNfQUREUiB0byB3b3JrIG9uIHNwYXJjLgorCUFsc28gY2hlY2sgUkVHX1NUUlVDVF9IQVNfQUREUiBmb3IgdW5pb24sIGFycmF5IGFuZCBzdHJpbmcgdHlwZXMuCisKKwkqIHZhbG9wcy5jIChjYWxsX2Z1bmN0aW9uX2J5X2hhbmQpOiAgUmUtYXJyYW5nZSBjb2RlIGZvciBwdXNoaW5nCisJcGFyYW1hdGVycyBvbiB0aGUgc3RhY2sgc28gd2UgY2FuIGRvIGJldHRlciBTVEFDS19BTElHTi4KKworCSogdmFsb3BzLmMgKGNhbGxfZnVuY3Rpb25fYnlfaGFuZCk6ICBDYWxsIGVycm9yIGlmIHRoZSBudW1iZXIKKwlvZiBhcmd1bWVudHMgaXMgZmV3ZXIgdGhhbiBwYXJhbWV0ZXIgdHlwZXMgaW4gZnVuY3Rpb24gdHlwZS4KKworRnJpIE1hciAgMyAxNzoxMzowNSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzcGFyYy10ZGVwLmMgKHNwYXJjX2V4dHJhY3Rfc3RydWN0X3ZhbHVlX2FkZHJlc3MpOiBNb3ZlCisJc3BhcmM2NCBzdXBwb3J0IHRvIGhlcmUuCisJKHNwYXJjNjRfZXh0cmFjdF9zdHJ1Y3RfdmFsdWVfYWRkcmVzcyk6IERlbGV0ZWQuCisJKGR1bXBfY2NyZWcpOiBBZGQgYSBwcm90b3R5cGUgc28gbG9uZyBsb25nIGFyZyAtPiBpbnQuCisJKiBzcGFyYy90bS1zcDY0LmggKFVTRV9TVFJVQ1RfQ09OVkVOVElPTik6IERlZmluZS4KKwkoRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyk6IERlbGV0ZS4KKworRnJpIE1hciAgMyAxNToxMjoxMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogaHByZWFkLmMgKGhwcmVhZF9yZWNvcmRfbGluZXMpOiBOZXcgYXJndW1lbnQgIm9mZnNldCIuICBBbGwKKwljYWxsZXJzIGNoYW5nZWQuICBVc2UgaXQgdG8gaGFuZGxlIGR5bmFtaWMgYWRkcmVzcyByZWxvY2F0aW9uLgorCShocHJlYWRfYnVpbGRfcHN5bXRhYnMpOiBBZGp1c3QgdGV4dGhpZ2ggYXMgd2UgcmVhZCBlYWNoIGZ1bmN0aW9uCisJZGVidWcgc3ltYm9sLiAgRml4IGNvbXB1dGF0aW9uIG9mIHRleHRoaWdoLgorCShocHJlYWRfcmVhZF9zdWJyYW5nZV90eXBlKTogV29yayBhcm91bmQgbWFjcm8gYnVncyBpbiBIUCdzCisJY29tcGlsZXJzLgorCShocHJlYWRfcHJvY2Vzc19vbmVfZGVidWdfc3ltYm9sKTogQ29ycmVjdGx5IG1hcCBzb3VyY2UgbGluZXMuCisKKwkqIHNvbXJlYWQuYyAoY2hlY2tfc3RyYW5nZV9uYW1lcyk6IEZpbHRlciBuYW1lcyBlbWl0dGVkIGJ5IHRoZSBIUAorCWNvbXBpbGVyIHdoZW4gZ2VuZXJhdGluZyBQSUMgY29kZS4KKworCSogdmFsb3BzLmMgKHZhbHVlX3N0cnVjdF9lbHRfZm9yX3JlZmVyZW5jZSk6IFdvcmsgYXJvdW5kIG1hY3JvCisJYnVncyBpbiBIUCdzIGNvbXBpbGVycy4KKwkqIGMtZXhwLnkgKGJsb2NrKTogTGlrZXdpc2UuCisKK0ZyaSBNYXIgIDMgMTI6Mjc6MjggMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGRlbmViLmN5Z251cy5jb20+CisKKwkqIHJzNjAwMC10ZGVwLmMgKHB1c2hfZHVtbXlfZnJhbWUpOiBGaXggb3JkZXIgb2YgYXJndW1lbnRzIHRvCisJc3RvcmVfYWRkcmVzcy4KKworCSogdXRpbHMuYyBbX0FJWF06IEluY2x1ZGUgc3RkZGVmLmggaW5zdGVhZCBvZiAjZGVmaW5pbmcgc2l6ZV90LgorCitGcmkgTWFyICAzIDEyOjMzOjI0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogcnM2MDAwLXRkZXAuYyAoc2tpcF9wcm9sb2d1ZSk6IFNraXAgbXVsdGlwbGUgc3RvcmVzIG9mIHRoZSBzYXZlZAorCXJlZ2lzdGVycyB0aGF0IEdDQyBlbWl0cyBvbiB0aGUgUG93ZXJQQyBieSBkZWZhdWx0IGluIGFkZGl0aW9uIHRvCisJdGhlIHN0b3JlIG11bHRpcGxlIGluc3RydWN0aW9uIHVzZWQgb24gdGhlIFBvd2VyIHNlcmllcy4KKworRnJpIE1hciAgMyAwMDo1NDo1OCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzcGFyYy10ZGVwLmMgKGRlY29kZV9hc2kpOiBOZXcgZnVuY3Rpb24uCisJKHNwYXJjX3ByaW50X3JlZ2lzdGVyX2hvb2spOiBQcmV0dHkgcHJpbnQgbW9yZSB2OSByZWdpc3RlcnMuCisJKiBzcGFyYy90bS1zcDY0LmggKFJFR0lTVEVSX05BTUVTKTogRml4IHNvbWUgdHlwb3MuCisKK1RodSBNYXIgIDIgMjI6MjA6MjIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZHdhcmZyZWFkLmMgKHN0cnVjdCBkaWVpbmZvKTogVXNlIENPUkVfQUREUiBmb3IgYXRfe2xvdyxoaWdofV9wYy4KKwkodGFyZ2V0X3RvX2hvc3QpOiBDaGFuZ2UgcmVzdWx0IHR5cGUgdG8gQ09SRV9BRERSLgorCitUaHUgTWFyICAyIDE1OjEzOjA0IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiByczYwMDAtdGRlcC5jOiBGaXggYnl0ZS1zd2FwcGluZyBzaW5zLgorCitUaHUgTWFyICAyIDE2OjQ4OjQ1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiByczYwMDAtdGRlcC5jIChicmFuY2hfZGVzdCk6IE1pbm9yIGNvZGUgY2xlYW51cCwgZG9uJ3Qgc2hhcmUKKwljb2RlIGJldHdlZW4gYnJhbmNoIHVuY29uZGl0aW9uYWwgYW5kIGJyYW5jaCBjb25kaXRpb25hbCBjYXNlcy4KKworV2VkIE1hciAgMSAwOTo0MToyNiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJVmFyaW91cyBjaGFuZ2VzIGZvciBzcGFyYzY0LgorCSogc3BhcmMtdGRlcC5jIChOVU1fU1BBUkNfRlBSRUdTKTogRGVmaW5lLgorCShTUEFSQ19JTlRSRUdfU0laRSk6IERlZmluZS4KKwkoKik6IFVzZSBTUEFSQ19JTlRSRUdfU0laRSBpbnN0ZWFkIG9mIFJFR0lTVEVSX1JBV19TSVpFIChpbnRyZWcpCisJd2hlcmUgYXBwcm9wcmlhdGUuCisJKGVudW0gYnJhbmNoX3R5cGUpOiBOZXcgdmFsdWUgYGRvbmVfcmV0cnknLgorCShpc2JyYW5jaCk6IFJlbmFtZWQgZnJvbSBpc2FubnVsbGVkLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KKwlTdXBwb3J0IG5ldyBzcGFyYzY0IGJyYW5jaCBpbnNucy4KKwkoc2luZ2xlX3N0ZXApOiBIYW5kbGUgZG9uZV9yZXRyeS4KKwkoc3BhcmNfZXh0cmFjdF9zdHJ1Y3RfdmFsdWVfYWRkcmVzcyk6IERvbid0IGFzc3VtZSA0IGJ5dGUgcmVncy4KKwkoZ2V0X3NhdmVkX3JlZ2lzdGVyKTogTGlrZXdpc2UuCisJKHNwYXJjX3B1c2hfZHVtbXlfZnJhbWUpOiBMaWtld2lzZS4KKwkoc3BhcmNfZnJhbWVfZmluZF9zYXZlZF9yZWdzKTogTGlrZXdpc2UuCisJKHNwYXJjX3BvcF9mcmFtZSk6IExpa2V3aXNlLiAgRG9uJ3QgcmVmZXIgdG8gRlBTX1JFR05VTSwgQ1BTX1JFR05VTSwKKwlvciBQU19SRUdOVU0gaWYgbm90IHNwYXJjNjQuICBzcGFyYzY0IGhhcyA2NCBmcCByZWdzLgorCShzcGFyYzY0X2V4dHJhY3Rfc3RydWN0X3ZhbHVlX2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24uCisJKGR1bXBfY2NyZWcsIHNwYXJjX3ByaW50X3JlZ2lzdGVyX2hvb2spOiBMaWtld2lzZS4KKwkqIHNwNjQtdGRlcC5jOiBEZWxldGVkLgorCSogc3BhcmMvdG0tc3A2NC5oIChHREJfVEFSR0VUX0lTX1NQQVJDNjQpOiBEZWZpbmUuCisJKE5VTV9SRUdTKTogUmVkdWNlIGJ5IDIsIGNsZS90bGUgYXJlIGluIHRoZSBwc3RhdGUgcmVnLgorCShDQ19IQVNfTE9OR19MT05HKTogRGVmaW5lLgorCShSRUdJU1RFUl9OQU1FUyk6IERlbGV0ZSBjbGUvdGxlIGFuZCByZW9yZ2FuaXplLgorCShQU19SRUdOVU0sIEZQU19SRUdOVU0sIENQU19SRUdOVU0pOiBEZWxldGUsIHRoZXkncmUgaWZkZWYnZCBvdXQgb2YKKwlzcGFyYy10ZGVwLmMgbm93LgorCShSRUdJU1RFUl9CWVRFUyk6IFVwZGF0ZS4KKwkoUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMLCBSRUdJU1RFUl9DT05WRVJUX1RPX1JBVyk6IERlbGV0ZS4KKwkoRVhUUkFDVF9SRVRVUk5fVkFMVUUpOiBEZWxldGUuICBVc2UgZGVmaW5pdGlvbiBpbiB0bS1zcGFyYy5oLgorCShOT19TSU5HTEVfU1RFUCk6IExpa2V3aXNlLgorCSogc3BhcmMvdG0tc3BhcmMuaCAoRVhUUkFDVF9WQUxVRV9SRVRVUk4pOiBEb24ndCBhc3N1bWUgNCBieXRlIHJlZ3MuCisJKiBzcGFyYy9zcDY0Lm10OiBNb3ZlIHNpbXVsYXRvciBzdXBwb3J0IC4uLgorCSogc3BhcmMvc3A2NHNpbS5tdDogLi4uIHRvIGhlcmUuCisKK1dlZCBNYXIgIDEgMTM6MTQ6NDIgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLXZ4OTYwLmM6IG5ldyBmaWxlIGZvciB0YXJnZXQgc3BlY2lmaWMgcmVnaXN0ZXIgcGFja2FnaW5nLgorCSogcmVtb3RlLXZ4NjguYzogZGl0dG8uCisJKiBjb25maWcvaTk2MC92eHdvcmtzOTYwLm10OiBhZGQgcmVtb3RlLXZ4OTYwLm8uCisJKiBjb25maWcvbTY4ay92eHdvcmtzNjgubXQ6IGFkZCByZW1vdGUtdng2OC5vLgorCitXZWQgTWFyICAxIDEzOjQyOjQ5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLmMgKHJlbW90ZV93YWl0KTogTWFrZSBjYWxscyB0byBzdHJ0b2wgYmUgdHlwZSBjb3JyZWN0IGJ5CisJcGFzc2luZyB0aGUgYWRkcmVzcyBvZiBhIGNoYXIgKiBwb2ludGVyIGluc3RlYWQgb2YgYW4gdW5zaWduZWQKKwljaGFyICouCisKKwkqIHJzNjAwMC10ZGVwLmMgKHB1c2hfZHVtbXlfZnJhbWUpOiBDYXN0IHNwIHRvIGNoYXIgKiB3aGVuIGNhbGxpbmcKKwl3cml0ZV9tZW1vcnkgdG8gbWFrZSB0aGluZ3MgdHlwZSBjb3JyZWN0LgorCitXZWQgTWFyICAxIDEyOjE3OjMxIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjaC1leHAueSwgYy1leHAueSwgZi1leHAueSwgbTItZXhwLnkgKHl5IGRlZmluZXMpOiBTdXBwb3J0IHRoZQorCXN0YW5kYXJkIExpbnV4IHlhY2MgYnkgYWRkaW5nIG1vcmUgbmFtZXMgdG8gYmUgcmVkZWZpbmVkIHdpdGggYQorCXByZWZpeC4KKworVHVlIEZlYiAyOCAyMjo1NTo0NyAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogaHBwYS10ZGVwLmMgKHBhX3ByaW50X3JlZ2lzdGVycyksIG1vbml0b3IuYzogVXNlCisJZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIGFuZCBmcmllbmRzLCBub3QgU1dBUF9UQVJHRVRfQU5EX0hPU1QuCisJKiBkZWZzLmgsIGZpbmR2YXIuYzogTW92ZSBTV0FQX1RBUkdFVF9BTkRfSE9TVCBiYWNrIHRvIGZpbmR2YXIuYy4KKwlSZW5hbWUgaXQgdG8gU1dBUF9GTE9BVElORyB0byBtYWtlIGl0IGNsZWFyIGl0IGlzIG5vIGxvbmdlciBmb3IKKwlpbnRlZ2Vycy4KKworVHVlIEZlYiAyOCAxNDozODozOSAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAbWV4aWNhbi5jeWdudXMuY29tPgorCisJKiBkZWZzLmggKFNXQVBfVEFSR0VUX0FORF9IT1NUKTogY2hlY2sgZW5kaWFuZXNzIGF0IHJ1bnRpbWUgbm90CisJY29tcGlsZSB0aW1lLgorCSogYXJjLXRkZXAuYyAoX2luaXRpYWxpemVfYXJjX3RkZXApOiBzZXQgdG1fcHJpbnRfaW5zbiBhY2NvcmRpbmcgdG8gCisJcHJvY2Vzc29yLgorCisJKiB2eC1zaGFyZS9wdHJhY2UuaDogbWVyZ2UgaW4gV1JTIG5ldyBwdHJhY2UgcmVxdWVzdHMuCisKKwkqIGRlZnMuaDogZml4IGEgc3ludGF4IGVycm9yLgorCisJKiBhMjlrLXRkZXAuYyAoZ2V0X2xvbmdqbXBfdGFyZ2V0KTogYWRkIHRoaXMgZnVuY3Rpb24sIGZyb20gV1JTLgorCSogcmVtb3RlLXZ4LmM6IG1vdmUgcmVhZF9yZWdpc3RlciBhbmQgd3JpdGVfcmVnaXN0ZXIgb3V0IHRvIAorCXRhcmdldCBzcGVjaWZpYyBmaWxlcy4KKwkqIHJlbW90ZS12eDI5ay5jIChnZXRfZnBfY29udG5ldHMpOiBhZGQgdGhpcyBmdW5jdGlvbiwgZnJvbSBXUlMuCisKKwkqIGRlZnMuaDogZGVmaW5lIFNXQVBfVEFSR0VUX0FORF9IT1NUIG1hY3JvLgorCSogZmluZHZhci5jLCBtb25pdG9yLmMsIGhwcGEtdGRlcC5jOiByZW1vdmUgZGVmaW5pdGlvbiBvZgorCVNXQVBfVEFSR0VUX0FORF9IT1NULgorCitUdWUgRmViIDI4IDA4OjMxOjQwIDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBhbHBoYS10ZGVwLmMgKGZpbmRfcHJvY19kZXNjKTogT25seSBhdHRlbXB0IHRvIHNldAorCVBST0NfTE9DQUxPRkYgKGZvdW5kX2hldXJpc3RpYykgaWYgZm91bmRfaGV1cmlzdGljIGlzIG5vbi1OVUxMLgorCitNb24gRmViIDI3IDExOjU2OjMyIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbW9uaXRvci5jOiBHZW5lcmFsIGdjYyAtV2FsbCBsaW50IGNsZWFudXAgYW5kIHJlZm9ybWF0LgorCShtb25pdG9yX2NvbW1hbmQpOiBJZiBubyBhcmdzLCBzZW5kIGFuIGVtcHR5IGNvbW1hbmQuCisKK1RodSBGZWIgMjMgMjE6MDc6MjUgMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogbW9uaXRvci5jIChtb25pdG9yX2xvYWRfYXNjaWlfc3JlYyk6ICBBZGQgYSBvbmUgc2Vjb25kIHNsZWVwCisJYWZ0ZXIgc2VuZCBMT0FEX0NNRCB0byBwcmV2ZW50IGxvc3Mgb2YgZmlyc3QgUy1yZWNvcmQuCisKK1R1ZSBGZWIgMjEgMjA6NDg6NDIgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIHZhbG9wcy5jIChjYWxsX2Z1bmN0aW9uX2J5X2hhbmQpOiAgU2V0IHVzaW5nX2djYyB0byAyIGlmIGdjYy0yLgorCUNhbGwgZXJyb3IgaWYgdG9vIGZldyBhcmd1bWVudHMuCisJSWYgUkVHX1NUUlVDVF9IQVNfQUREUiAoc3RydWN0cyBwYXNzZWQgYnkgaW52aXNpYmxlIHJlZmVyZW5jZSksCisJY29weSBhbmQgY29udmVydCB0byByZWZlcmVuY2UgKmJlZm9yZSogd2UgY2FsY3VsYXRlIGFsaWdubWVudC4KKwlBbHNvLCBtYWtlIHN1cmUgc3RydWN0cyBhbGxvY2F0ZWQgZm9yIHJldHVybiB2YWx1ZXMgYW5kIGludmlzaWJsZQorCXJlZmVyZW5jZSBkb24ndCB2aW9sYXRlIFNUQUNLX0FMSUdOLgorCitUdWUgRmViIDIxIDIzOjI5OjU5IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBydGwuY3lnbnVzLmNvbT4KKworCSogY2gtZXhwLnkgKGV4cHJlc3Npb25fY29udmVyc2lvbik6ICBSZWNvZ25pemUgJ0FSUkFZICgpIFRZUEUgKEVYUFIpJworCShzYW1lIGFzIEMncyAnKFRZUEVbXSlFWFBSJykKKworVHVlIEZlYiAyMSAxMTo0NzoyNiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHRvcC5jIChwcmludF9nZGJfdmVyc2lvbik6IFVwZGF0ZSB0aGUgeWVhci4KKworU3VuIEZlYiAxOSAxNDozMTo1NyAxOTk1ICBKaW0gS2luZ2RvbiAgPGtpbmdkb25AcnRsLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VULCBDWFhfRk9SX1RBUkdFVCk6IExvb2sgZm9yIG5ld2xpYiBpbgorCWAuLicgbm90IGluIGAuLi8uLicuCisKK1N1biBGZWIgMTkgMTE6MDU6MjggMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBwcm9jZnMuYyAodW5jb25kaXRpb25hbGx5X2tpbGxfaW5mZXJpb3IpOiAgRG9uJ3QgaXNzdWUgYSBQSU9DS0lMTAorCWluIGFkZGl0aW9uIHRvIGEgUElPQ1NTSUcgdG8ga2lsbCB0aGUgaW5mZXJpb3IuCisKK1RodSBGZWIgMTYgMTU6MDY6MTIgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIHBhcnNlLmMgKGZvbGxvd190eXBlcyk6ICBHaXZlbiAoVFlQRVtdKSAoaS5lLiB3aXRoIG5vIGxlbmd0aCksCisJY3JlYXRlIGEgMC1sZW5ndGggYXJyYXkgdHlwZSwgYW5kIHNldCBCT1VORF9DQU5OT1RfQkVfREVURVJNSU5FRC4KKwkqIHZhbG9wcy5jICh2YWx1ZV9jYXN0KTogIElmIGEgY2FzdCBsaWtlIChUWVBFW10pVkFMVUUgKGkuZS4gYXJyYXkKKwlvZiB1bmtub3duIGxlbmd0aCkgdXNlIHNpemVvZihWQUxVRSkvc2l6ZW9mKFRZUEUpIGFzIHRoZSBsZW5ndGguCisJKiBjLXR5cGVwcmludC5jIChjX3R5cGVfcHJpbnRfdmFyc3BlY19zdWZmaXgpOiAgSWYgYXJyYXkgbGVuZ3RoCisJaXMgMCwgcHJpbnQgaXQsIGJ1dCBub3QgaWYgdXBwZXJfYm91bmQgaXMgQk9VTkRfQ0FOTk9UX0JFX0RFVEVSTUlORUQuCisKK1RodSBGZWIgMTYgMTY6MDY6NTAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBkY2FjaGUuYyAoaW5zcXVlLCByZW1xdWUpOiBSZXdyaXRlIExpbnV4IHN1cHBvcnQuCisKK1dlZCBGZWIgMTUgMTI6MzM6MjAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvcG93ZXJwYy90bS1wcGMtZWFiaS5oIChURVhUX1NFR01FTlRfQkFTRSk6IERlZmluZSBhcyAxLgorCisJKiBkY2FjaGUuYyAoaW5zcXVlLCByZW1xdWUpOiBJZiBjb21waWxpbmcgaW4gc3RhbmRhcmQgQyBvbiBMaW51eCwKKwlwcm90ZWN0IGluc3F1ZSBhbmQgcmVtcXVlIHdpdGggbWFjcm9zIHRvIGNhc3QgdGhlIHBvaW50ZXIKKwlhcmd1bWVudHMgdG8gdGhlIHByb3BlciB0eXBlLgorCitUdWUgRmViIDE0IDE3OjE2OjQxIDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGFubm90YXRlLmMsIGJyZWFrcG9pbnQuYywgZGVmcy5oLCB0b3AuYzogIFJlcGxhY2UKKwllbmFibGUvZGlzYWJsZV9icmVha3BvaW50X2hvb2sgd2l0aCBtb2RpZnlfYnJlYWtwb2ludF9ob29rLgorCitUdWUgRmViIDE0IDE2OjU4OjA3IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBleHByZXNzaW9uLmg6IE1vdmUgZGVjbGFyYXRpb24gb2YgZXZhbHVhdGVfc3ViZXhwX3dpdGhfY29lcmNpb24KKwlmcm9tIGhlcmUuLi4KKwkqIHZhbHVlLmg6IC4uLnRvIGhlcmUuCisJKiBleHByZXNzaW9uLmg6IERvbid0IGluY2x1ZGUgdmFsdWUuaAorCitUdWUgRmViIDE0IDExOjQ2OjA3IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBleHByZXNzaW9uLmg6IE1vdmUgaW5jbHVkZSBvZiB2YWx1ZS5oIHVudGlsIGFmdGVyIGRlY2xhcmF0aW9uIG9mCisJZW51bSBleHBfb3Bjb2RlLgorCitTdW4gRmViIDEyIDEzOjQ3OjMwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLWU3MDAwLmM6IENvbXByZWhlbnNpdmUgY2xlYW51cDsgcmVtb3ZhbCBvZiBkZWFkIGNvZGUsCisJc2ltcGxpZnkgY29kZSwgZGVjbGFyZSB0aGluZ3MsIGZvcm1hdCB0byBzdGFuZGFyZHMuCisJKGluZmVyaW9yLmgsIHZhbHVlLmgsIGNvbW1hbmQuaCwgcmVtb3RlLXV0aWxzLmgpOiBJbmNsdWRlLgorCShlNzAwMF9sb2dpbik6IFJlbmFtZSB0byBlNzAwMF9sb2dpbl9jb21tYW5kLgorCShlNzAwMF9mdHApOiBSZW5hbWUgdG8gZTcwMDBfZnRwX2NvbW1hbmQuCisJKGU3MDAwX2RyYWluKTogUmVuYW1lIHRvIGU3MDAwX2RyYWluX2NvbW1hbmQuCisKKwkqIGlyaXg1LW5hdC5jIChzdHJpbmcuaCk6IEluY2x1ZGUgbmVhciBiZWdpbm5pbmcgb2YgZmlsZS4KKworU3VuIEZlYiAxMiAxMjozNjozOCAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogdmFsb3BzLmMgKHZhbHVlX2FyZ19jb2VyY2UpOiBVc2UgVkFMVUVfVFlQRSBub3QgU1lNQk9MX1RZUEUgb24KKwlhcmcsIGl0IGlzIGEgdmFsdWUgbm90IGEgc3ltYm9sLgorCisJZ2NjIC1XYWxsIGxpbnQ6CisJKiBldmFsLmM6IE1vdmUgZGVjbGFyYXRpb24gb2YgZXZhbHVhdGVfc3ViZXhwX3dpdGhfY29lcmNpb24gZnJvbSBoZXJlLi4KKwkqIGV4cHJlc3Npb24uaDogLi50byBoZXJlLgorCSogZXhwcmVzc2lvbi5oOiBJbmNsdWRlIHZhbHVlLmguCisJKiBjaC1sYW5nLmMgKGV2YWx1YXRlX3N1YmV4cF9jaGlsbCk6IEFkZCBkZWZhdWx0IGNhc2UgaW4gc3dpdGNoLgorCitTdW4gRmViIDEyIDExOjAzOjQ3IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBsYW5ndWFnZS5oIChzdHJ1Y3QgbGFuZ3VhZ2VfZGVmbik6ICBOZXcgZmllbGQgZXZhbHVhdGVfZXhwLgorCSogYy1sYW5nLmMgKGNfbGFuZ3VhZ2VfZGVmbiwgY3BsdXNfbGFuZ3VhZ2VfZGVmbiwgYXNtX2xhbmdhdWdlX2RlZm4pLAorCWYtbGFuZy5jIChmX2xhbmd1YWdlX2RlZm4pLCBsYW5ndWFnZS5jICh1bmtub3duX2xhbmd1YWdlX2RlZm4sCisJYXV0b19sYW5ndWFnZV9kZWZuLCBsb2NhbF9sYW5ndWFnZV9kZWZuKSwgbTItbGFuZy5jIChtMl9sYW5ndWFnZV9kZWZuKToKKwlTZXQgZXZhbHVhdGVfZXhwIHRvIGV2YWx1YXRlX3N1YmV4cF9zdGFuZGFyZC4KKwkqIGNoLWxhbmcuYyAoZXZhbHVhdGVfc3ViZXhwX2NoaWxsKTogIE5ldyBmdW5jdGlvbi4gIENoaWxsLXNwZWNpZmljCisJc3VwcG9ydCBmb3IgTVVMVElfU1VCU0NSSVBULgorCShjaGlsbF9sYW5ndWFnZV9kZWZuKTogIFNldCBldmFsdWF0ZV9leHAgdG8gZXZhbHVhdGVfc3ViZXhwX2NoaWxsLgorCSogZXZhbC5jIChlbnVtIG5vc2lkZSk6ICBNb3ZlIGZyb20gaGVyZSAuLi4uCisJKiBleHByZXNzaW9uLmggKGVudW0gbm9zaWRlKTogIC4uLiB0byBoZXJlLgorCShldmFsdWF0ZV9zdWJleHBfc3RhbmRhcmQpOiAgTmV3IHByb3RvdHlwZS4KKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKTogIFJlbmFtZWQgdG8gZXZhbHVhdGVfc3ViZXhwX3N0YW5kYXJkLgorCVJlbW92ZWQgbG8tbG9uZ2VyLW5lZWRlZCB0ZXN0IGZvciBjaGlsbF92YXJ5aW5nX3R5cGUuCisJKGV2YWx1YXRlX3N1YmV4cCk6ICBOZXcuICBDYWxscyBleHAtPmxhbmd1YWdlX2RlZm4tPmV2YWx1YXRlX2V4cC4KKworCSogY2gtZXhwLnkgKG1heWJlX2V4cHJlc3Npb25fbGlzdCk6ICBOZXcgbm9uLXRlcm1pbmFsLgorCShwcmltaXRpdmVfdmFsdWUpOiAgQWxsb3cgZW1wdHkgcGFyYW1ldGVyIGxpc3QuCisKK1N1biBGZWIgMTIgMTA6MDI6MTYgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGN5Z251cy5jb20+CisKKwkqIGJ1aWxkc3ltLmMgKGZpbmlzaF9ibG9jayk6ICBJZiBmaW5pc2hpbmcgYSBmdW5jdGlvbiB3aXRob3V0IGtub3duCisJcGFyYW1ldGVyIHR5cGUgaW5mbywgc2V0IHRoYXQgZnJvbSBwYXJhbWV0ZXIgc3ltYm9scy4KKwkqIGMtdHlwZXByaW50LmMgKGNfdHlwZV9wcmludF92YXJzcGVjX3N1ZmZpeCk6ICBGb3IgVFlQRV9DT0RFX0ZVTkMsCisJcHJpbnQgcGFyYW1ldGVyIHR5cGVzLCBpZiBhdmFpbGFibGUuCisJKiBjaC10eXBlcHJpbnQuYyAoY2hpbGxfdHlwZV9wcmludF9iYXNlKTogIExpa2V3aXNlLgorCisJKiBnZGJ0eXBlcy5oIChzdHJ1Y3QgdHlwZSk6ICBSZW1vdmUgZnVuY3Rpb24gdHlwZSBmaWVsZC4KKwkoVFlQRV9GVU5DVElPTl9UWVBFKTogIFJlbW92ZSBtYWNyby4gIFdlIGNhbid0IGFzIHNpbXBseSByZS11c2UKKwlmdW5jdGlvbiB0eXBlcyBub3cgdGhhdCB3ZSdyZSBhbHNvIHN0b3JpbmcgcGFyYW1ldGVyIHR5cGVzLgorCUFuZCB0aGUgcGF5b2ZmIGlzIG11Y2ggbGVzcy4KKwkqIGdkYnR5cGVzLmMgKG1ha2VfZnVuY3Rpb25fdHlwZSk6ICBEb24ndCB1c2Uvc2V0IFRZUEVfRlVOQ1RJT05fVFlQRS4KKwkocmVjdXJzaXZlX2R1bXBfdHlwZSk6ICBEb24ndCBwcmludCBUWVBFX0ZVTkNUSU9OX1RZUEUuCisJKiBkd2FyZnJlYWQuYyAocmVhZF9zdWJyb3V0aW5lX3R5cGUpOiAgRG9uJ3Qgc2V0IFRZUEVfRlVOQ1RJT05fVFlQRS4KKworCSogdmFsb3BzLmMgKHZhbHVlX2FyZ19jb2VyY2UpOiAgTm93IHRha2VzIHBhcmFtX3R5cGUgYXJndW1lbnQuCisJKGNhbGxfZnVuY3Rpb25fYnlfaGFuZCk6ICBDb252ZXJ0IGFyZ3VtZW50cyB3aXRoIHZhbHVlX2FyZ19jb2VyY2UKKwllYXJseSwgYW5kIG92ZXJ3cml0ZSBvcmlnaW5hbCBhcmdzIHdpdGggY29udmVydGVkIGFyZ3MuCisJTm8gbG9uZ2VyIG5lZWQgbXVsdGlwbGUgY2FsbHMgdG8gdmFsdWVfYXJnX2NvZXJjZS4KKwkodmFsdWVfYXJnX3B1c2gpOiAgUmVtb3ZlZC4KKwkqIGhwcGEtdGRlcC5jIChocHBhX3B1c2hfYXJndW1lbnRzKTogIE5vIGxvbmdlciBjYWxsIHZhbHVlX2FyZ19jb2VyY2UuCisJKiBtaXBzLXRkZXAuYyAobWlwc19wdXNoX2FyZ3VtZW50cyk6ICBMaWtld2lzZS4KKwkqIGFscGhhLXRkZXAuYyAoYWxwaGFfcHVzaF9hcmd1bWVudHMpOiAgTGlrZXdpc2UuCisJKiByczYwMDAtdGRlcC5jIChwdXNoX2FyZ3VtZW50cywgcmFuX291dF9vZl9yZWdpc3RlcnNfZm9yX2FyZ3VtZW50cyk6CisJTGlrZXdpc2UuCisJKiB2YWx1ZS5oICh2YWx1ZV9hcmdfY29lcmNlKTogIFJlbW92ZSBkZWNsYXJhdGlvbi4gIChJdCdzIG5vdyBzdGF0aWMuKQorCisJKiB2YWxvcHMuYyAodmFsdWVfY2FzdCk6ICBEbyBDT0VSQ0VfVkFSWUlOR19BUlJBWSBhZnRlciBDT0VSQ0VfUkVGLgorCisJKiBzeW10YWIuYyAoYWRkX3BhcmFtX3RvX3R5cGUpOiAgUmVtb3ZlIChjb21tZW50ZWQtb3V0KSBmdW5jdGlvbiwKKwlzaW5jZSB0aGF0IGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gcmUtd3JpdHRlbi4KKwkqIGNvZmZyZWFkLmM6ICBSZW1vdmUgY29tbWVudGVkLW91dCBhZGRfcGFyYW1fdG9fdHlwZSBzdXBwb3J0LgorCSogbWRlYnVncmVhZC5jIChwYXJzZV9zeW1ib2wpOiAgTGlrZXdpc2UuCisJKiBzdGFic3JlYWQuYyAoZGVmaW5lX3N5bWJvbCk6ICBMaWtld2lzZS4KKworU3VuIEZlYiAxMiAwOTowMzo0NyAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYnVpbGRzeW0uYyAoc3RhcnRfc3ViZmlsZSk6IFNldCBsYW5ndWFnZSBmb3IgZjJjIGxpa2UgZm9yIGNmcm9udC4KKworVGh1IEZlYiAgOSAyMDoyMDoxMSAxOTk1ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+CisKKwkqIG9wNTBuLXJvbS5jOiBBZGQgdGhlIGNvbnRyb2wgcmVnaXN0ZXJzLgorCitUaHUgRmViICA5IDE1OjQ2OjM5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKENMSUJTKTogQWRkICQoTElCSUJFUlRZKSBiZWZvcmUsIGluIGFkZGl0aW9uIHRvCisJYWZ0ZXIsIGFueSBob3N0L3RhcmdldC9uYXRpdmUgbGlicmFyaWVzLgorCSogZGNhY2hlLmMgKGluc3F1ZSwgcmVtcXVlKTogUmVtb3ZlIGRlY2xhcmF0aW9ucy4KKwkqIGdkYnR5cGVzLmggKHR5cGVfY29kZSk6IFJlbW92ZSB0cmFpbGluZyBjb21tYS4KKworCUZyb20gUGV0ZXIgU2NoYXVlcjoKKwkqIHhjb2ZmcmVhZC5jIChyZWFkX3hjb2ZmX3N5bXRhYikgW0NfSElERVhUXTogTW92ZSAjaWZkZWYKKwlTVEFUSUNfTk9ERUJVR19WQVJTIGluc2lkZSBjYXNlLgorCitUaHUgRmViICA5IDA3OjQzOjQxIDE5OTUgIEppbSBLaW5nZG9uICA8a2luZ2RvbkBkZW5lYi5jeWdudXMuY29tPgorCisJKiBjb25maWcvc3BhcmMvdG0tc3VuNHNvbDIuaDogRGVmaW5lIFNUQVRJQ19UUkFOU0ZPUk1fTkFNRS4KKwkqIHBhcnRpYWwtc3RhYi5oOiBDYWxsIGl0LgorCSogc3RhYnNyZWFkLmMgKGRlZmluZV9zeW1ib2wpIFtTVEFUSUNfVFJBTlNGT1JNX05BTUVdOiBDYWxsCisJU1RBVElDX1RSQU5TRk9STV9OQU1FIHRvIGdldCB0aGUgbmFtZSBhbmQgdXNlIG1pbmltYWwgc3ltYm9scyB0bworCWdldCB0aGUgYWRkcmVzcy4KKwkqIHNwYXJjLXRkZXAuYyAoc29sYXJpc19zdGF0aWNfdHJhbnNmb3JtX25hbWUpOiBOZXcgZnVuY3Rpb24uCisKK1RodSBGZWIgIDkgMTI6MDk6MDkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIHNvbXJlYWQuYyAoc29tX3N5bXRhYl9yZWFkKTogSGFuZGxlIGR5bmFtaWMgcmVsb2NhdGlvbiBmb3IgYm90aAorCXRleHQgYW5kIGRhdGEgc3ltYm9scy4KKwkoc29tX3N5bWZpbGVfb2Zmc2V0cyk6IElmIG9iamZpbGUgaXMgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBnZXQKKwl0ZXh0IGFuZCBkYXRhIG9mZnNldHMgZnJvbSB0aGUgc2hhcmVkIGxpYnJhcnkgc3RydWN0dXJlcy4KKwkqIHNvbXNvbGliLmMgKHNvbV9zb2xpYl9hZGQpOiBDb3B5IHRoZSBiZmQgcG9pbnRlciBmcm9tIHRoZQorCW9iamZpbGUgcmF0aGVyIHRoYW4gcmVvcGVuaW5nIHRoZSBmaWxlIGFnYWluLgorCShzb21fc29saWJfc2VjdGlvbl9vZmZzZXRzKTogTmV3IGZ1bmN0aW9uLgorCSogc29tc29saWIuaCAoc29tX3NvbGliX3NlY3Rpb25fb2Zmc2V0cyk6IERlY2xhcmUuCisKK1dlZCBGZWIgIDggMjA6MzI6MTggMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGRlbmViLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9zcGFyYy90bS1zdW40c29sMi5oLCBkYnhyZWFkLmM6IFJlbmFtZQorCU5fU09fQUREUkVTU19NQVlCRV9NSVNTSU5HIHRvIFNPRlVOX0FERFJFU1NfTUFZQkVfTUlTU0lORy4KKwkqIHN5bXRhYi5oIChtaW5pbWFsX3N5bWJvbCkgW1NPRlVOX0FERFJFU1NfTUFZQkVfTUlTU0lOR106IEFkZAorCWZpbGVuYW1lIGZpZWxkLgorCSogZWxmcmVhZC5jIChyZWNvcmRfbWluaW1hbF9zeW1ib2xfYW5kX2luZm8pLAorCW1pbnN5bXMuYywgc3ltdGFiLmggKHByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9sX2FuZF9pbmZvKTogUmV0dXJuCisJbmV3bHkgY3JlYXRlZCBzeW1ib2wuCisJKiBlbGZyZWFkLmMgKGVsZl9zeW10YWJfcmVhZCkgW1NPRlVOX0FERFJFU1NfTUFZQkVfTUlTU0lOR106CisJU2V0IGZpbGVuYW1lIGZpZWxkIG9mIG1pbmltYWwgc3ltYm9sLgorCSogc3ltbWlzYy5jIChkdW1wX21zeW1ib2xzKSBbU09GVU5fQUREUkVTU19NQVlCRV9NSVNTSU5HXToKKwlQcmludCBmaWxlbmFtZSBmaWVsZC4KKwkqIG1pbnN5bXMuYywgc3ltdGFiLmggKGxvb2t1cF9taW5pbWFsX3N5bWJvbCk6IE5ldyBhcmcgc2ZpbGUuCisJKiBzeW1tLXRkZXAuYywgc29tc29saWIuYywgaHBwYS10ZGVwLmMsIGMtZXhwLnksIGYtZXhwLnksCisJbTItZXhwLnksIG5pbmR5LXRkZXAuYywgbTMtbmF0LmMsIGlyaXg1LW5hdC5jLCBocHJlYWQuYywKKwlvczlrcmVhZC5jLCBicmVha3BvaW50LmMsIGFscGhhLXRkZXAuYywgdmFsb3BzLmMsIHN5bXRhYi5jLAorCXByaW50Y21kLmMsIGRieHJlYWQuYzogQ2hhbmdlIGNhbGxlcnMgdG8gcGFzcyBOVUxMIGZvciBzZmlsZS4KKwkqIGRieHJlYWQuYyAocHJvY2Vzc19vbmVfc3ltYm9sKSBbU09GVU5fQUREUkVTU19NQVlCRV9NSVNTSU5HXToKKwlGaW5kIGFkZHJlc3Mgb2YgZnVuY3Rpb24gZnJvbSBtaW5pbWFsIHN5bWJvbHMuCisJKiBwYXJ0aWFsLXN0YWIuaCwgY2FzZSAnZicsICdGJzogQ2FsbCBmaW5kX3N0YWJfZnVuY3Rpb25fYWRkcgorCWluc3RlYWQgb2YgZ2V0dGluZyBwc3QtPnRleHRsb3cgZnJvbSB0aGUgc3RhYi4KKwkqIG1pbnN5bXMuYyAoZmluZF9zdGFiX2Z1bmN0aW9uX2FkZHIpOiBOZXcgZnVuY3Rpb24uCisKK1dlZCBGZWIgIDggMTk6MTk6NTYgMTk5NSAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgorCisJKiBtb25pdG9yLmM6IEZpeCBzbyBhbGwgdGhlIG91dHB1dCBzaG93cyB1cCBpbiB0aGUgR1VJIGNvbW1hbmQKKwl3aW5kb3cuCisKK01vbiBGZWIgIDYgMTg6NTA6NTkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBpMzg2LXRkZXAuYyAoX2luaXRpYWxpemVfaTM4Nl90ZGVwKTogUHV0IHZvaWQgZGVjbCBvbiBzZXBhcmF0ZQorICAgICAgICBsaW5lLCBzbyBpbml0LmMgZ2VuZXJhdGlvbiB3b3JrcyBjb3JyZWN0bHkuCisJKiBhcmMtdGRlcC5jIChfaW5pdGlhbGl6ZV9hcmNfdGRlcCk6IERpdHRvLgorCitNb24gRmViICA2IDE0OjQ0OjM2IDE5OTUgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL21pcHMvaWR0Lm10OiBBZGQgc3VwcG9ydCBmb3IgdGhlIGxzaTMzayB0YXJnZXQuCisJKiBjb25maWcvc3BhcmMvc3VuNHNvbDIubWg6IEFkZCBzdXBwb3J0IGZvciBzZXItdGNwLgorCSogYXJyYXktcm9tLmM6IEZpbmlzaCB0aGUgcmVzdCBvZiB0aGUgc3VwcG9ydCBjb21tYW5kcyBuZWVkZWQgYnkKKwlHREIuCisJKiBtaXBzLXRkZXAuYzogQWRkIExTSTMzayByZWdpc3RlciBuYW1lcyBhbmQgcHJvY2Vzc29yIHR5cGUuCisKK1NhdCBGZWIgIDQgMTM6Mjk6NTIgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWcvbTY4ay9lc3QubXQgKFRERVBGSUxFUyk6IFJlbW92ZSBtNjhrLXBpbnNuLm8uCisKK0ZyaSBGZWIgIDMgMTE6MTk6MjAgMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogY29yZS5jIChkaXNfYXNtX3JlYWRfbWVtb3J5KSwgZGVmcy5oLCB0b3AuYzogR2V0IHJpZCBvZgorCWRpc19hc21fcmVhZF9tZW1vcnlfaG9vay4gIFdlIGNhbiBub3cgY2FsbCB0aGUgZGlzYXNzZW1ibGVycworCWRpcmVjdGx5IGFuZCBoYXZlIG5vIG5lZWQgZm9yIHRoaXMgaG9vayBhbnltb3JlLgorCSogZGVmcy5oLCBwcmludGNtZC5jOiBNYWtlIHByaW50X2luc24gYmUgc3RhdGljLgorCisJKiBzZXItZ28zMi5jIChkb3NfY29taXNyKTogIE1ha2UgdGhpcyA4IGJpdCBjbGVhbi4KKwkqIChkb3Nfb3BlbiBkb3NfY2xvc2UpOiAgQWxsb3cgbXVsdGlwbGUgb3BlbnMgdG8gdGhlIHNhbWUgZGV2aWNlLgorCVVzZSBhIHJlZiBjb3VudCB0byBwcmV2ZW50IHVud2FudGVkIGRlYWxsb2NhdGlvbnMuCisJKiBzcGFyY2wtdGRlcC5jOiAgUHV0ICNpZmRlZnMgYXJvdW5kIGFsbCBzb2NrZXQgc3R1ZmYgdG8gbWFrZSBHTzMyCisJaGFwcHkuCisJKiAoc3BhcmNsaXRlX29wcyk6ICBTd2l0Y2ggdG8gZG93bmxvYWRfc3RyYXR1bS4KKwkqIHRhcmdldC5oIChlbnVtIHN0cmF0YSk6ICBNb3ZlIGRvd25sb2FkX3N0cmF0dW0gYmVmb3JlCisJcHJvY2Vzc19zdHJhdHVtIHNvIHRoYXQgZXhlY3V0YWJsZSB0YXJnZXRzIGdldCBwdXNoZWQgb24gdG9wIG9mCisJZG93bmxvYWQgdGFyZ2V0cy4KKworVGh1IEZlYiAgMiAxOTowMjo0NSAxOTk1ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+CisKKwkqIGFycmF5LXJvbS5jOiBSZW1vdmUgdGhlIG5vbiBHREIgcmVtb3RlIHByb3RvY29sIGNvbmZpZyBzdHVmZi4KKworCSogbW9uaXRvci5jOiBBbGwgcmVhZGluZy93cml0aW5nIGZ1bmN0aW9ucyBmb3IgbWVtb3J5IGFuZAorCXJlZ2lzdGVycyB3b3JrLgorCitUaHUgRmViICAyIDE2OjExOjA0IDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9hcmMvYXJjLm10OiBuZXcgdGFyZ2V0IG1ha2VmaWxlIGZvciBhcmMgcHJvY2Vzc29yLgorCSogY29uZmlnL2FyYy90bS1hcmMuaDogbmV3IHRhcmdldCBoZWFkZXIgZm9yIGFyYyBwcm9jZXNzb3IuCisJKiBjb25maWcvYXJjL2dvMzIubWg6IG5ldyBnbzMyIGhvc3QgbWFrZWZpbGUgZm9yIGFyYyBwcm9jZXNzb3IuCisJKiBjb25maWcvYXJjL3htLWdvMzIuaDogbmV3IGdvMzIgaG9zdCBoZWFkZXIgZm9yIGFyYyBwcm9jZXNzb3IuCisJKiBhcmMtdGRlcC5jOiBuZXcgdGFyZ2V0IGRlcGVuZGVudCBjb2RlcyBmb3IgYXJjIHByb2Nlc3Nvci4KKworVGh1IEZlYiAgMiAxMzo1ODo0MCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogQnVtcCB0byA0LjEzLjIuCisKK1RodSBGZWIgIDIgMDc6Mjc6NTYgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwlGaXggY29tcGlsZXIgd2FybmluZ3M6CisJKiByZW1vdGUtZTcwMDAuYyAocHJpbnRmX2U3MDAwZGVidWcpOiBSZW5hbWUgdG8gcHV0c19lNzAwMGRlYnVnCisJYW5kIGhhdmUgdGhlIGNhbGxlciBkbyB0aGUgc3ByaW50Zi4gIFNhdmVzIHVzIGZyb20gdmFyYXJncyBoZWxsLgorCShub3JtYWwpOiBEZWZpbmUgYmVmb3JlIHVzZS4KKwkqIHJlbW90ZS1lNzAwMC5jOiBSZWluZGVudCBhIGZldyB0aGluZ3MuCisKK1dlZCBGZWIgIDEgMjE6MTY6NDIgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIGYtdHlwZXByaW50LmMgKGZfdHlwZV9wcmludF92YXJzcGVjX3N1ZmZpeCk6ICBQcmludCBhcnJheSBpbmRleAorCXJhbmdlcyBpbiByZXZlcnNlIG9yZGVyLgorCSogZi12YWxwcmludC5jIChmNzdfY3JlYXRlX2FycmF5cHJpbnRfb2Zmc2V0X3RibCk6ICBGaXggY2FsY3VsYXRpb24uCisKKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3Vic2NyaXB0KTogIERvbid0IGNhbGwgdmFsdWVfc3Vic2NyaXB0LCBzaW5jZQorCWl0IGFkanVzdHMgZm9yIGxvd2VyIGJvdW5kIGFuZCBlbmZvcmNlcyByYW5nZXMuCisKKwkqIGV4cHJlc3Npb24uaCAoZXhwX2NvZGUpOiAgUmVtb3ZlIE1VTFRJX0Y3N19TVUJTQ1JJUFQsIE9QX0Y3N19TVUJTVFIuCisJKiBldmFsLmMsIHBhcnNlLmM6ICBSZW1vdmVkIHVzZXMgb2YgcmVtb3ZlZCBvcGNvZGVzLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiAgQ2xlYW4gdXAgaGFuZGxpbmcgb2YKKwlPUF9VTkRFVEVSTUlORURfQVJHTElTVCAobm8gYmFja3RyYWNraW5nLCBtb3JlIGdlbmVyYWwpLgorCisJKiBmLXZhbHByaW50LmMgKGZfdmFsX3ByaW50KTogIFByaW50IFRZUEVfQ09ERV9TVFJJTkcgdXNpbmcKKwlMQV9QUklOVF9TVFJJTkcsIGFuZCBub3QgdmFsX3ByaW50X3N0cmluZyAod2hpY2ggcmVhZHMgZnJvbSBpbmZlcmlvcikuCisKKwkqIGNoLWxhbmcuYyAoY2hpbGxfaXNfdmFyeWluZ19zdHJ1Y3QpLCBjaC1sYW5nLmg6ICBSZW12ZSBmdW5jdGlvbgorCWR1cGxpY2F0ZSBmdW5jdGlvbiBtYWRlIHJlZHVuZGFudCBieSBjaGlsbF92YXJ5aW5nX3R5cGUuCisKKwlSZS13cml0ZSBvZiBmNzcgc3RyaW5nIGFuZCBjb21wbGV4IG51bWJlciBzdXBwb3J0OgorCisJKiBsYW5ndWFnZS5oIChzdHJ1Y3QgbGFuZ3VhZ2VfZGVmbik6ICBOZXcgZmllbGRzIHN0cmluZ19sb3dlcl9ib3VuZAorCWFuZCBzdHJpbmdfY2hhcl90eXBlLgorCSogYy1sYW5nLmMgKGNfbGFuZ3VhZ2VfZGVmbiwgY3BsdXNfbGFuZ3VhZ2VfZGVmbiwgYXNtX2xhbmd1YWdlX2RlZm4pLAorCWxhbmd1YWdlLmMgKHVua25vd25fbGFuZ3VhZ2VfZGVmbiwgYXV0b19sYW5ndWFnZV9kZWZuLAorCWxvY2FsX2xhbmd1YWdlX2RlZm4pLCBtMi1sYW5nLmMgKG0yX2xhbmd1YWdlX2RlZm4pLCBmLWxhbmcuYworCShmX2xhbmd1YWdlX2RlZm4pLCBjaC1sYW5nLmMgKGNoaWxsX2xhbmd1YWdlX2RlZm4pOiAgU2V0IG5ldyBmaWVsZHMuCisJKiBnZGJ0eXBlcy5jIChjcmVhdGVfc3RyaW5nX3R5cGUpOiAgVXNlIG5ldyBzdHJpbmdfY2hhcl90eXBlIGZpZWxkLgorCSogdmFsb3BzLmMgKHZhbHVlX3N0cmluZyk6ICBVc2UgbmV3IHN0cmluZ19sb3dlcl9ib3VuZCBmaWVsZC4KKworCSogZGVmcy5oIChUQVJHRVRfQ09NUExFWF9CSVQsIFRBUkdFVF9ET1VCTEVfQ09NUExFWF9CSVQpOiAgUmVtb3ZlZC4KKwkqIGYtbGFuZy5jIChmX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlLCBfaW5pdGlhbGl6ZV9mX2xhbmd1YWdlKSwKKwltMi1sYW5nLmMgKG0yX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlKSwKKwlnZGJ0eXBlcy5jIChfaW5pdGlhbGl6ZV9nZGJ0eXBlcyk6ICBTZXQgVFlQRV9UQVJHRVRfVFlQRSBvZiBjb21wbGV4CisJdHlwZXMuICBTZXQgdGhlaXIgVFlQRV9DT0RFcyB0byBUWVBFX0NPREVfQ09NUExFWC4KKwkqIG1kZWJ1Z3JlYWQuYyAobWRlYnVnX3R5cGVfY29tcGxleCwgbWRlYnVnX3R5cGVfZG91YmxlX2NvbXBsZXgpOgorCVJlbW92ZWQuICBVc2UgYnVpbHRpbl90eXBlX2NvbXBsZXggYW5kIGJ1aWx0aW5fdHlwZV9kb3VibGVfY29tcGxleC4KKworCSogZ2RidHlwZXMuaCAoZW51bSB0eXBlX2NvZGUpOiAgUmVtb3ZlZCBUWVBFX0NPREVfTElURVJBTF9TVFJJTkcKKwlhbmQgVFlQRV9DT0RFX0xJVEVSQUxfQ09NUExFWC4KKwkqIGMtdHlwZXByaW50LmMsIGYtdHlwZXByaW50LmMsIGYtdmFscHJpbnQuYywgZXZhbC5jOiAgUmVtb3ZlZCB1c2VzIG9mCisJVFlQRV9DT0RFX0xJVEVSQUxfU1RSSU5HIGFuZCBUWVBFX0NPREVfTElURVJBTF9DT01QTEVYLgorCSogZ2RidHlwZXMuYywgZ2RidHlwZXMuaCAoZjc3X2NyZWF0ZV9saXRlcmFsX2NvbXBsZXhfdHlwZSwKKwlmNzdfY3JlYXRlX2xpdGVyYWxfc3RyaW5nX3R5cGUpOiAgUmVtb3ZlZC4KKwkqIHZhbHVlLmggKFZBTFVFX0xJVEVSQUxfREFUQSwgVkFMVUVfU1VCU1RSSU5HX01FTUFERFIsCisJVkFMVUVfU1VCU1RSSU5HX01ZQUREUik6ICBSZW1vdmVkLgorCisJKiBleHByZXNzaW9uLmggKGVudW0gZXhwX29wY29kZSk6ICBSZW5hbWUgT1BfRjc3X0xJVEVSQUxfQ09NUExFWCB0bworCU9QX0NPTVBMRVguCisJKiBwYXJzZS5jOiAgVXBkYXRlIGFjY29yZGluZ2x5LgorCisJKiBmLXZhbHByaW50LmMgKGY3N19wcmludF9jbXBseCk6ICBSZW1vdmVkLgorCShmX3ZhbF9wcmludCBjYXNlIFRZUEVfQ09ERV9DT01QTEVYKTogIFJlLXdyaXRlIHRvIHVzZSBwcmludF9mbG9hdGluZy4KKworCSogZi1leHAueSAoU1RSSU5HX0xJVEVSQUwpOiAgVXNlIE9QX1NUUklORyBpbnN0ZWFkIG9mIE9QX0FSUkFZLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiAgRm9yIGNhc2UgT1BfQVJSQVksIGRvbid0IGNhbGwKKwlmNzdfdmFsdWVfbGl0ZXJhbF9zdHJpbmcuCisJKiB2YWxvcHMuYywgdmFsdWUuaCAoZjc3X3ZhbHVlX2xpdGVyYWxfc3RyaW5nLCBmNzdfdmFsdWVfc3Vic3RyaW5nLAorCWY3N19hc3NpZ25fZnJvbV9saXRlcmFsX3N0cmluZywgZjc3X2Fzc2lnbl9mcm9tX2xpdGVyYWxfY29tcGxleCk6CisJUmVtb3ZlZC4KKwkodmFsdWVfYXNzaWduKTogIE5vIGxvbmdlciBuZWVkIHRvIGhhbmRsZSBsaXRlcmFsIHR5cGVzLgorCSogdmFsb3BzLmMgKGY3N192YWx1ZV9saXRlcmFsX2NvbXBsZXgpLCB2YWx1ZS5oOiAgUmUtd3JpdHRlbiBhbmQKKwlyZW5hbWVkIHRvIHZhbHVlX2xpdGVyYWxfY29tcGxleC4gIExhc3QgYXJnIGlzIG5vdyBhIChjb21wbGV4KSB0eXBlLgorCSogdmFsb3BzLmMgKGY3N19jYXN0X2ludG9fY29tcGxleCk6ICBSZS13cml0dGVuIGFuZCByZW5hbWVkIHRvCisJY2FzdF9pbnRvX2NvbXBsZXguCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cCk6ICBVcGRhdGUgYWNjb3JkaW5nbHkuCisKKwkqIGNoLXZhbHByaW50LmMgKGNoaWxsX3ZhbF9wcmludCk6ICBPbiBUWVBFX0NPREVfU1RSSU5HLCBkb24ndAorCXByaW50IGFkZHJlc3MgZm9yIG5vbi0ncyctZm9ybWF0cy4KKwkqIGNoLXR5cGVwcmludC5jLCBjaC12YWxwcmludC5jOiAgVXNlIGNoaWxsX3ZhcnlpbmdfdHlwZSBpbnN0ZWFkCisJb2YgY2hpbGxfaXNfdmFyeWluZ19zdHJ1Y3QuCisKK1dlZCBGZWIgIDEgMTM6Mjc6MzMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJZ2NjIC1XYWxsIGxpbnQuCisJKiBhbHBoYS10ZGVwLmMgKGFscGhhX2luX2xlbmllbnRfcHJvbG9ndWUpOiBDb21tZW50IG91dC4KKwkoYWZ0ZXJfcHJvbG9ndWUpOiBSZW1vdmUgdW51c2VkIGxvY2FsIGIuCisJKiBwcm9jZnMuYyAodGhyZWFkLmgpOiBJbmNsdWRlLgorCShwcl9mbGFnX3RhYmxlLCBwcl93aHlfdGFibGUsIGZhdWx0c190YWJsZSwgc2lnaW5mb190YWJsZSk6IFVzZQorCW5lc3RlZCBicmFjZXMgaW4gaW5pdGlhbGl6ZXIuCisJKiB0b3AuYyAoaW5pdGlhbGl6ZV90YXJnZXRzLCBpbml0aWFsaXplX3V0aWxzKTogRGVjbGFyZS4KKwkobG9jYXRlX2FyZywgaW5zZXJ0X2FyZ3MpOiBBZGQgcGFyZW5zIGFyb3VuZCB0ZXN0ZWQgYXNzaWdubWVudHMuCisJKiByZW1vdGUtdXRpbHMuYyAoc3Jfc2Nhbl9hcmdzKTogUmVtb3ZlIGRlY2wgb2Ygc3RydG9sLgorCSogcmVtb3RlLmMgKHRocmVhZC5oKTogSW5jbHVkZS4KKwkocmVtb3RlX3dhaXQpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHAyLgorCSogc3BhcmMtdGRlcC5jIChmaWxsX2dyZWdzZXQsIGZpbGxfZnByZWdzZXQpOiBSZW1vdmUgZGVjbHMgb2YKKwlyZWdpc3RlcnMgYXJyYXkuCisKKwlkZWZzLmggKHN0ZGxpYi5oKTogSW5jbHVkZS4KKwkoZXhpdCwgcGVycm9yLCBhdG9pLCBxc29ydCwgbWVtY3B5LCBtZW1jbXApOiBEb24ndCBkZWNsYXJlLgorCShmY2xvc2UsIGF0b2YsIG1hbGxvYywgcmVhbGxvYywgZnJlZSwgc3RyY2hyLCBzdHJyY2hyLCBzdHJzdHIsCisJc3RydG9rLAlzdHJlcnJvcik6IERvbid0IHNwZWNpZnkgcGFyYW1ldGVyIHR5cGVzIGluIGRlY2xhcmF0aW9uLgorCitXZWQgRmViICAxIDEyOjIzOjU3IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBjaC1leHAueSAodmFsdWVfc3RyaW5nX2VsZW1lbnQsIHN0cmluZ19wcmltaXRpdmVfdmFsdWUsCisJc3RhcnRfZWxlbWVudCwgbGVmdF9lbGVtZW50LCByaWdodF9lbGVtZW50LCBzbGljZV9zaXplLAorCWxvd2VyX2VsZW1lbnQsIHVwcGVyX2VsZW1lbnQsIGZpcnN0X2VsZW1lbnQpOiAgUmVtb3ZlZC4KKwkodmFsdWVfc3RyaW5nX3NsaWNlLCB2YWx1ZV9hcnJheV9zbGljZSk6ICBSZXBsYWNlZCBieSAuLi4KKwkoc2xpY2UpOiAgTmV3IG5vbi10ZXJtaW5hbCwgd2l0aCB3b3JraW5nIHNsaWNlIHN1cHBvcnQuCisJKHByaW1pdGl2ZV92YWx1ZV9scGFyZW4sIHJwYXJlbik6ICBOZXcgbm9uLXRlcm1pbmFscy4KKwkobWF5YmVfdHVwbGVfZWxlbWVudHMpOiAgTmV3IG5vbi10ZXJtaW5hbCwgdG8gYWxsb3cgZW1wdHkgdHVwbGVzLgorCShpZHRva2VudGFiKTogIEFkZGVkICJ1cCIuCisKKwkqIHZhbHVlLmggKENPRVJDRV9WQVJZSU5HX0FSUkFZKTogIE5ldyBtYWNyby4KKwkqIHZhbGFyaXRoLmMgKHZhbHVlX3N1YnNjcmlwdCk6ICBVc2UgaXQuCisJKiB2YWxvcHMuYyAodmFsdWVfY2FzdCk6ICBMaWtld2lzZS4gIEFsc28sIGRvIG5vdGhpbmcgaWYgYWxyZWFkeQorCWNvcnJlY3QgdHlwZSwgYW5kIGFsbG93IGNvbnZlcnRpbmcgZnJvbS90byByYW5nZSB0by9mcm9tIHNjYWxhci4KKworCSogdmFsb3BzLmMsIHZhbHVlLmggKHZhcnlpbmdfdG9fc2xpY2UsIHZhbHVlX3NsaWNlKTogIE5ldyBmdW5jdGlvbnMuCisJKiBldmFsLmMgKE9QX0FSUkFZKTogIEFkZCBjYXN0IGZvciBhcnJheSBlbGVtZW50LgorCSogZXhwcmVzc2lvbi5oIChURVJOT1BfU0xJQ0UsIFRFUk5PUF9TTElDRV9DT1VOVCk6ICBOZXcgZXhwX29wY29kZXMuCisJKiB2YWxvcHMuYyAoY2hpbGxfdmFyeWluZ190eXBlKTogIE1vdmVkIGZ1bmN0aW9uIGZycCwgaGVyZSAuLi4KKwkqIGdkYnR5cGVzLmMgKGNoaWxsX3ZhcnlpbmdfdHlwZSksIGdkYnR5cGVzLmg6IC4uLiB0byBoZXJlLgorCSogcGFyc2UuYyAobGVuZ3RoX29mX3N1YmV4cCwgcHJlZml4aWZ5X3N1YmV4cCk6ICBBZGQgc3VwcG9ydAorCWZvciBURVJOT1BfU0xJQ0UsIFRFUk5PUF9TTElDRV9DT1VOVC4KKwkqIGV4cHByaW50LmMgKHByaW50X3N1YmV4cCwgZHVtcF9leHByZXNzaW9uKTogIExpa2V3aXNlLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHApOiAgTGlrZXdpc2UuCisKKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwIGNhc2UgTVVMVElfU1VCU0NSSVBUKTogIERvbid0IGNhbGwKKwl2YWx1ZV94X2Jpbm9wIG9uIGEgQ2hpbGwgdmFyeWluZyBzdHJpbmcuCisKK1R1ZSBKYW4gMzEgMTM6NTE6NTMgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9tNjhrL21vbml0b3IubXQsCisJY29uZmlnL3BhL3tocHBhYnNkLm10LGhwcGFocHV4Lm10LGhwcGFvc2YubXQsaHBwYXByby5tdH06IFB1dAorCWRlcGZpbGVzIGluIFRERVBGSUxFUyBub3QgUkVNT1RFX08uCisKK1R1ZSBKYW4gMzEgMTE6MTQ6NDQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+CisKKwlGcm9tIG5pZ2VsQGFsZ29yLmNvLnVrLgorCSogc2VyLWdvMzIuYyAoZG9zX2Nsb3NlKTogRG9uJ3QgY3Jhc2ggaWYgc2NiIG51bGwuCisJKGRvc19zZW5kYnJlYWspOiBOZXcgZnVuY3Rpb24uCisJKGRvc19vcHMpOiBQb2ludCB0byBkb3Nfc2VuZGJyZWFrLgorCShkb3NfaW5mbyk6IENhbGN1bGF0ZSBDT00gbnVtYmVyIGNvcnJlY3RseS4KKworVHVlIEphbiAzMSAwOTo0MDoxMSAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogeGNvZmZyZWFkLmMgKHByb2Nlc3NfeGNvZmZfc3ltYm9sKTogVXNlIG5ldyB2YXJpYWJsZXMKKwlmdW5jX3N5bWJvbF90eXBlIGFuZCB2YXJfc3ltYm9sX3R5cGUgYXMgdHlwZSBvZiBmdW5jdGlvbnMgYW5kCisJdmFyaWFibGVzIHdoaWNoIGRvbid0IGhhdmUgYW55IHN0YWJzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgorCVJlaW5kZW50IG1vc3Qgb2YgZnVuY3Rpb24uCisJKF9pbml0aWFsaXplX3hjb2ZmcmVhZCk6IEluaXRpYWxpemUgKl9zeW1ib2xfdHlwZS4KKworCSogeGNvZmZyZWFkLmMgKHJlYWRfeGNvZmZfc3ltdGFiKTogUmVpbmRlbnQgbW9zdCBvZiBmdW5jdGlvbi4KKwlQdXQgQ19ISURFWFQgc3ltYm9scyBpbiB0aGUgbWluaW1hbCBzeW1ib2xzLCByYXRoZXIgdGhhbiBpZ25vcmluZworCXRoZW0gKHRoaXMgcGFydCBjb21tZW50ZWQgb3V0IGFzIEkgZGlkbid0IHF1aXRlIGdldCBpdCB0byB3b3JrKS4KKwkoY3NfdG9fc2VjdGlvbiwgZmluZF90YXJnX3NlYyk6IE5ldyBmdW5jdGlvbnMsIHRvIHN1cHBvcnQgYWJvdmUgY29kZS4KKwkqIHhjb2ZmcmVhZC5jIChSRUNPUkRfTUlOSU1BTF9TWU1CT0wpOiBPbmx5IHNraXAgJy4nIGlmIGl0IGlzCisJYWN0dWFsbHkgcHJlc2VudC4KKworTW9uIEphbiAzMCAxNzozNDoyNCAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCSogc3BhcmNsLXRkZXAuYzogIEFkZCBgc3BhcmNsaXRlJyB0YXJnZXQgZm9yIGRvaW5nIHNlcmlhbCBhbmQgdWRwCisJZG93bmxvYWRzIHRvIFNQQVJDbGl0ZSBkZW1vIGJvYXJkcy4KKworU3VuIEphbiAyOSAwOTo0MzoyMiAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLmMsIHJlbW90ZS1wYS5jOiBSZW1vdmUgI2lmIDAnZCBpY2FjaGUgY29kZS4gIEl0IGhhcyBoYWQKKwlubyBob3BlIG9mIHdvcmtpbmcgYXMgaXMgZm9yIGEgbG9uZyB0aW1lIChpbiBwYXJ0aWN1bGFyLCBzaGVicycgMjcKKwlKYW4gOTUgY2hhbmdlIGNvbmZ1c2VzIHRoZSBpc3N1ZSBmdXJ0aGVyLS10YXJnZXRfcmVhZF9tZW1vcnkgYW5kCisJeGZlcl9jb3JlX2ZpbGUgZG8gKm5vdCogZG8gdGhlIHNhbWUgdGhpbmcgaW4gdGhpcyBjb250ZXh0KS4KKwlSZXZpc2UgY29tbWVudC4KKworU2F0IEphbiAyOCAxMzo0MDo0NiAxOTk1IFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZWxmcmVhZC5jIChlbGZfc3ltdGFiX3JlYWQpOiAgRG8gbm90IHRlc3QgQlNGX0dMT0JBTCBmb3IKKwlwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBzeW1ib2xzLCBpdCBpcyBubyBsb25nZXIgc2V0IGR1ZSB0byB0aGUKKwlKYW4gNiBCRkQgY2hhbmdlIGluIGJmZC9lbGZjb2RlLmguCisKK0ZyaSBKYW4gMjcgMTc6MDg6MDYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiB0b3AuYyAodXNlX3dpbmRvd3MpOiBDbGFyaWZ5IGNvbW1lbnRzLgorCisJKiBjb252ZXgtdGRlcC5jICh4ZmVyX2NvcmVfZmlsZSk6IENvbW1lbnQgb3V0LgorCSogY29uZmlnL2NvbnZleC90bS1jb252ZXguaCAoWEZFUl9DT1JFX0ZJTEUpOiBSZW1vdmUuCisJKiByZW1vdGUuYywgcmVtb3RlLXBhLmMgKHJlbW90ZV9mZXRjaF93b3JkKTogQ2hhbmdlIHhmZXJfY29yZV9maWxlCisgICAgICAgIHJlZmVyZW5jZXMgdG8gdGFyZ2V0X3JlYWRfbWVtb3J5LgorCSogZ2RiY29yZS5oICh4ZmVyX2NvcmVfZmlsZSwgY29yZV9vcGVuLCBjb3JlX2RldGFjaCk6IFJlbW92ZQorCWRlY2xhcmF0aW9ucy4KKwkqIGNvcmVsb3cuYyAoY29yZV9vcGVuLCBjb3JlX2RldGFjaCk6IE1ha2Ugc3RhdGljLgorCisJKiBhcm0tdGRlcC5jOiBNYWtlIGl0IGNvbXBpbGUuCisJKGV4ZWNfZmlsZV9jb21tYW5kLCB4ZmVyX2NvcmVfZmlsZSk6IENvbW1lbnQgb3V0LgorCShhcm1fcHJpbnRfaW5zbik6IFJlbW92ZSwgbm93IGluIGxpYm9wY29kZXMuCisJKHNraXBfcHJvbG9ndWUpOiBDb21tZW50IG91dCBtb3N0IG9mIGJvZHkuCisJKGFybV9mcmFtZV9maW5kX3NhdmVkX3JlZ3MpOiBNb3ZlIGhlcmUgZnJvbSB0bS1hcm0uaC4KKwkoX2luaXRpYWxpemVfYXJtX3RkZXApOiBTZXQgdG1fcHJpbnRfaW5zbi4KKwkqIGNvbmZpZy9hcm0vdG0tYXJtLmg6IFJlbW92ZSBvbGQgcmVmcyB0byBmaXJzdF9vYmplY3RfZmlsZV9lbmQuCisJKFhGRVJfQ09SRV9GSUxFKTogUmVtb3ZlLgorCShGUkFNRV9GSU5EX1NBVkVEX1JFR1MpOiBDYWxsIGFybV9mcmFtZV9maW5kX3NhdmVkX3JlZ3MuCisJCitGcmkgSmFuIDI3IDA4OjQ4OjI4IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoQ0hJTExfTElCKTogRGVmaW5lIGFzIGluIHRlc3RzdWl0ZS9NYWtlZmlsZS5pbi4KKworVGh1IEphbiAyNiAxODoyNDo0MSAxOTk1ICBKaW0gS2luZ2RvbiAgPGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbT4KKworCSogc3ltdGFiLmMgKGZpbmRfcGNfbGluZSk6IFdoZW4gc3VidHJhY3Rpbmcgb25lIHRvIGdldCBhIGxpbmUKKwludW1iZXIsIG1ha2Ugc3VyZSBub3QgdG8gZW5kIHVwIHdpdGggemVyby4KKworCSogcmVtb3RlLXZ4LmM6IFJldmVydCBhbGwgb2YgS3VuZydzIGNoYW5nZXMgb2YgMTYgSmFuLiAgVGhlCisJcHJvYmxlbXMgd2l0aCB0aG9zZSBjaGFuZ2VzIHdlcmUgKGEpIHRoZSBmaWxlIGRpZG4ndCBjb21waWxlLCAoYikKKwl0aGV5IGNoYW5nZWQgbWVtc2V0IHRvIGJ6ZXJvLS1tZW1zZXQgaXMgY29ycmVjdCwgKGMpIHRoZXkgdG9vayBvdXQKKwljb2RlIHRvIGRlYWwgd2l0aCBib2FyZHMgbGFja2luZyBmbG9hdGluZyBwb2ludCwgKGQpIHdobyBrbm93cworCXdoYXQgSSBkaWRuJ3QgZGlzY292ZXIgaW4gYSBxdWljayByZWFkLgorCitUaHUgSmFuIDI2IDE3OjMyOjU0IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIHNwYXJjbC10ZGVwLmM6ICBDbGVhbiB1cCBmb3JtYXR0aW5nIGFuZCBpbmRlbnRhdGlvbi4KKworVGh1IEphbiAyNiAxMDo0OTo1OSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KKworCSogcmVtb3RlLWhtcy5jIChobXNfb3BzKTogQ2hhbmdlIHJlZiBvZiBocl9sb2FkX2ltYWdlCisJdG8gZ3JfbG9hZF9pbWFnZS4KKwkoZGNhY2hlX2ZsdXNoLCBkY2FjaGVfaGl0LCBkY2FjaGVfdmFsdWUsIGRjYWNoZV9mZXRjaCwKKwlkY2FjaGVfcG9rZSwgZGNhY2hlX2luaXQpOiAgRGVsZXRlZC4KKwkoaG1zX29wZW4sIGhtc19yZXN1bWUsIGhtc19mZXRjaF93b3JkLCBobXNfc3RvcmVfd29yZCk6CisJVXNlIGRjYWNoZSByb3V0aW5lcyBwcm92aWRlZCBieSByZW1vdGUtdXRpbC5oCisKK1RodSBKYW4gMjYgMTI6MDg6MzEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIHBvd2VycGMtKi1lYWJpLgorCisJKiBwb3dlcnBjL3RtLXBwYy1lYWJpLmgsIHBvd2VycGMvcGNjLWVhYmkubXQ6IE5ldyBmaWxlcyBmb3IKKwlQb3dlclBDIHN1cHBvcnQuCisKK1dlZCBKYW4gMjUgMTg6MTM6MTQgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIGxhbmd1YWdlLmggKHN0cnVjdCBsYW5ndWFnZV9kZWZuKTogIE5ldyBmaWVsZCBjX3N0eWxlX2FycmF5cy4KKwkqIGxhbmd1YWdlLmMgKHVua25vd25fbGFuZ3VhZ2VfZGVmbiwgYXV0b19sYW5ndWFnZV9kZWZuLAorCWxvY2FsX2xhbmd1YWdlX2RlZm4pLCBjLWxhbmcuYyAoY19sYW5ndWFnZV9kZWZuLCBjcGx1c19sYW5ndWFnZV9kZWZuLAorCWFzbV9sYW5ndWFnZV9kZWZuKTogIFNldCBjX3N0eWxlX2FycmF5cyB0byB0cnVlLgorCSogbTItbGFuZy5jIChtMl9sYW5ndWFnZV9kZWZuKSwgY2gtbGFuZy5jIChjaGlsbF9sYW5ndWFnZV9kZWZuKSwKKwlmLWxhbmcuYyAoZl9sYW5ndWFnZV9kZWZuKTogIFNldCBjX3N0eWxlX2FycmF5cyB0byBmYWxzZS4KKwkqIHZhbG9wcy5jICh2YWx1ZV9zdHJpbmcpOiAgSWYgY19zdHlsZV9hcnJheSBpcyBub3Qgc2V0LAorCWFsbG9jYXRlIHN0cmluZyBpbiBnZGIgKG5vdCBpbmZlcmlvcikgdXNpbmcgYWxsb2NhdGVfdmFsdWUuCisKKwkqIHZhbHVlLmggKENPRVJDRV9BUlJBWSksIHZhbG9wcy5jICh2YWx1ZV9hZGRyLCB2YWx1ZV9hcmdfY29lcmNlKToKKwlPbmx5IGNhbGwgdmFsdWVfY29lcmNlX2FycmF5IGlmIGN1cnJlbnRfbGFuZ3VhZ2UtPmNfc3R5bGVfYXJyYXlzLgorCSogdmFsdWVzLmM6ICBBZGQgI2luY2x1ZGUgImxhbmd1YWdlLmgiLiAgKE5lZWRlZCBmb3IgQ09FUkNFX0FSUkFZLikKKworCSogdmFsb3BzLmMgKGNoaWxsX3ZhcnlpbmdfdHlwZSk6ICBOZXcgcHJlZGljYXRlLgorCSogdmFsb3BzLmMgKHZhbHVlX2Nhc3QpOiAgU3VwcG9ydCBhc3NpZ25pbmcgYSBmaXhlZCBzdHJpbmcgb3IgYXJyYXkKKwl0byBhIHZhcmlhYmxlIHN0cmluZy9hcnJheSBzdHJ1Y3R1cmUuCisKKwkqIHZhbGFyaXRoLmMgKHZhbHVlX3N1YnNjcmlwdGVkX3J2YWx1ZSk6ICBFeHRyYSBwYXJhbWV0ZXIgbG93ZXJib3VuZC4KKwlDaGVjayBpbmRleD49bG93ZXJib3VuZCwgYW5kIHRoZW4gYWRkIGxvd2VyYm91bmQgdG8gaW5kZXggaGVyZSwKKwlpbnN0ZWFkIG9mIGluIGNhbGxlci4gIEdlbmVyYWxpemUgdG8gYXJiaXRyYXJ5IGx2YWxfdHlwZXMuCisJKHZhbHVlX3N1YnNjcmlwdCk6ICBVc2UgZW5oYW5jZWQgdmFsdWVfc3Vic2NyaXB0ZWRfcnZhbHVlIGlmCisJY19zdHlsZV9hcnJheXMgaXMgZmFsc2UgKGFuZCBpbmRleCBpcyBpbiByYW5nZSkuCisKKworV2VkIEphbiAyNSAxODoxMzoxNCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHAgY2FzZSBPUF9BUlJBWSk6ICBGaXggY2FsbHMgdG8gbWVtc2V0OgorCVRZUEVfTEVOR1RIIGlzIGxlbmd0aCBpbiBieXRlcywgbm90IGJpdHMuCisKK1dlZCBKYW4gMjUgMDg6MTk6MzUgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGluZnJ1bi5jIChwcm9jZWVkKTogRmx1c2ggc3Rkb3V0IGJlZm9yZSByZXN1bWluZyBpbmZlcmlvci4KKwkqIGluZmNtZC5jIChzdGVwXzEpLCBhbm5vdGF0ZS5jIChhbm5vdGF0ZV9zdGFydGluZyk6CisJRG9uJ3QgYm90aGVyIHRvIGZsdXNoIGhlcmUuCisKK1dlZCBKYW4gMjUgMDE6MTE6MjEgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGhwcmVhZC5jIChocHJlYWRfcHJvY2Vzc19vbmVfZGVidWdfc3ltYm9sKTogRml4IGxpbmVzIGdhcmJsZWQKKwlieSBhbiBpbGwtYWR2aXNlZCBnbG9iYWwgc2VhcmNoIGFuZCByZXBsYWNlLgorCitNb24gSmFuIDIzIDEzOjExOjQ2IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJQWRkIHN1cHBvcnQgZm9yIENoaWxsIGJpdHN0cmluZyBsaXRlcmFscyAoZS5oLiBIJ0ZGMDAnKS4KKwkqIGNoLWV4cC55IChtYXRjaF9iaXRzdHJpbmdfbGl0ZXJhbCk6ICBGaXggZm9yIHByb3BlciBlbmRpYW5uZXNzLgorCSogZXhwcHJpbnQuYyAocHJpbnRfc3ViZXhwKTogIERvbid0IGNhbGwgZXJyb3Igb24gT1BfQklUU1RSSU5HLAorCWp1c3QgcHJpbnQgQic8dW5pbWxlbWVudGVkPicuCisJKiBnZGJ0eXBlcy5jIChjcmVhdGVfc2V0X3R5cGUpOiAgRml4IGJ1ZyBpbiBsZW5ndGggY2FsY3VsYXRpb24uCisJKiB2YWxvcHMuYywgdmFsdWUuaCAodmFsdWVfYml0c3RyaW5nKTogIE5ldyBmdW5jdGlvbi4KKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKTogIEltcGxlbWVudCBzdXBwb3J0IGZvciBPUF9CSVRTVFJJTkcuCisKKwkqIGNoLXR5cGVwcmludC5jIChjaGlsbF90eXBlX3ByaW50X2Jhc2UpOiBGb3IgVFlQRV9DT0RFX0ZVTkMsCisJY2hlY2sgdGhhdCByZXR1cm4gdHlwZSBpcyBub24tdm9pZCwgYW5kIHByaW50IGluIHByb3BlciBDaGlsbCBzeW50YXguCisKK01vbiBKYW4gMjMgMTI6MjA6MzQgMTk5NSAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gcmVtb3RlLW1vbi5jLgorCSogcmVtb3RlLW1vbi5jOiByZW1vdmUuIFJlcGxhY2VkIGJ5IHJvbTY4ay1yb20uYy4KKwkqIHJvbTY4ay1yb20uYzogU3VwcG9ydCBmb3IgUm9tNjhrIG1vbml0b3IuCisKK01vbiBKYW4gMjMgMTA6NTA6NTcgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChDSElMTF9GT1JfVEFSR0VUKTogVXBkYXRlIC1MIGFyZ3VtZW50IHRvIHBvaW50IHRvCisJZ2NjL2NoL3J1bnRpbWUgbm90IGNoaWxscnQsIHNpbmNlIHRoYXQgaXMgd2hlcmUgdGhlIGNoaWxsIHJ1bnRpbWUKKwlsaXZlcyBub3cuCisKK01vbiBKYW4gMjMgMDA6MDY6NTcgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+CisKKwkqIHJlbW90ZS1obXMuYyAoaG1zX2xvYWQpOiBEZWxldGUuCisJKHRhcmdldF9vcHMpOiBVc2UgaHJfbG9hZF9pbWFnZS4KKworCSogcmVtb3RlLWU3MDAwLmMsIHJlbW90ZS16OGsuYywgcmVtb3RlLW5pbmR5LmMgKHRhcmdldF9vcHMpOgorICAgICAgICBEZWZpbmUgbWVtb3J5X2luc2VydC9yZW1vdmVfYnJlYWtwb2ludC4KKwkqIHhtLWdvMzIuaDogUmVtb3ZlIHJlZHVuZGFudCBTSUdzLgorCQorVGh1IEphbiAxOSAyMDoyNjo1OCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KKworCSogc2VyLWdvMzIuYzogUmV3cml0dGVuIGJ5IG5pZ2VsQGFsZ29yLmNvLnVrLgorCitGcmkgSmFuIDIwIDE1OjIzOjU1IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBleHByZXNzaW9uLmggKE9QX0xBQkVMRUQpOiAgTmV3IG9wZXJhdG9yLCBmb3IgQ2hpbGwKKwlsYWJlbGVkIHN0cnVjdHJlIHR1cGxlcy4KKwkqIGNoLWV4cC55ICh0dXBsZV9lbGVtZW50LCBuYW1lZF9yZWNvcmRfZWxlbWVudCwgdHVwbGVfZWxlbWVudHMpOgorCU5ldyBub24tdGVybWluYWxzLCB0byBoYW5kbGUgbGFiZWxlZCBzdHJ1Y3R1cmUgdHVwbGVzLgorCSh0dXBsZSk6ICBSZS1kZWZpbmUgdXNpbmcgdHVwbGVfZWxlbWVudHMuCisJKiBldmFsLmMgKGV2YWx1YXRlX2xhYmVsZWRfZmllbGRfaW5pdCk6ICBOZXcgZnVuY3Rpb24sIHRvIGhhbmRsZQorCWluaXRpYWxpemF0aW9uIG9mIHN0cnVjdHVyZSBmaWVsZHMsIHBvc3NpYmx5IHVzaW5nIE9QX0xBQkVMRUQuCisJKGV2YWx1YXRlX3N1YmV4cCk6ICBVc2UgaXQuCisJKiBleHBwcmludC5jIChwcmludF9zdWJleHAgY2FzZSk6ICBGb3IgT1BfQVJSQVksIHVzZSBDaGlsbCBzeW50YXgKKwlmb3IgQ2hpbGwuICBIYW5kbGVkIE9QX0xBQkVMRUQuCisJKiBwYXJzZS5jIChsZW5ndGhfb2Zfc3ViZXhwLCBwcmVmaXhpZnlfc3ViZXhwKTogIEhhbmRsZSBPUF9MQUJFTEVELgorCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cCk6ICBIYW5kbGUgQ2hpbGwgUG93ZXJzZXQgdHVwbGVzLgorCSogdmFsYXJpdGguYyAodmFsdWVfYml0X2luZGV4KTogIEp1c3QgdHJlYXQgYml0c3RyaW5nIGFzIHJlcHJlc2VudGVkCisJYnkgYW4gYXJyYXkgb2YgYnl0ZXMuICBBbGlnbm1lbnQgaXMgaGFuZGxlZCBieSBjb21waWxlci4gCisKK1dlZCBKYW4gMTggMTk6MDA6MjkgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBoODMwMC10ZGVwLmMgKGdkYl9wcmludF9pbnNuX2g4MzAwKTogRml4IHR5cG8gKCZpbmZvIC0+IGluZm8pLgorCSogc2gtdGRlcC5jIChnZGJfcHJpbnRfaW5zbl9zaCk6IERpdHRvLgorCitXZWQgSmFuIDE4IDExOjI1OjQzIDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1vczlrLmMgKHJvbWJ1Z19vcGVuKTogRml4IGEgYnVnIGluIGV4Y2VwdGlvbiBoYW5kbGluZworCWNvbW1hbmQuCisJKiByZW1vdGUtb3M5ay5jIChyb21idWdfd3JpdGVfaW5mZXJpb3JfbWVtb3J5KTogcmVzZXQgYnVmZmVyIGFmdGVyCisJd3JpdGUuCisKK1R1ZSBKYW4gMTcgMDk6NDg6MzggMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGxpb3RoLmN5Z251cy5jb20+CisKKwkqIHBhcnNlLmMgKF9pbml0aWFsaXplX3BhcnNlKTogSW1wcm92ZSB3b3JkaW5nIG9mIG5hbWVzIG9mCisJbXN5bV8qX3N5bWJvbF90eXBlLgorCitUdWUgSmFuIDE3IDE0OjAwOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL21pcHMvdG0tbWlwcy5oIChlbnVtIG1pcHNfZnB1X3R5cGUpOiBOZXcgZW51bS4KKwkobWlwc19mcHUpOiBDaGFuZ2UgdHlwZSB0byBlbnVtIG1pcHNfZnB1X3R5cGUuCisJKEZJWF9DQUxMX0RVTU1ZKTogSGFuZGxlIG1pcHNfZnB1ID09IE1JUFNfRlBVX1NJTkdMRS4KKwkqIG1pcHMtdGRlcC5jIChtaXBzX2ZwdSk6IENoYW5nZSB0eXBlIHRvIGVudW0gbWlwc19mcHVfdHlwZS4KKwlEb24ndCBpbml0aWFsaXplLgorCShtaXBzX2ZwdV9zdHJpbmcpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShtaXBzX3B1c2hfZHVtbXlfZnJhbWUpOiBIYW5kbGUgbWlwc19mcHUgPT0gTUlQU19GUFVfU0lOR0xFLgorCShtaXBzX3BvcF9mcmFtZSk6IExpa2V3aXNlLgorCShtaXBzX2V4dHJhY3RfcmV0dXJuX3ZhbHVlKTogTGlrZXdpc2UuCisJKG1pcHNfc3RvcmVfcmV0dXJuX3ZhbHVlKTogTGlrZXdpc2UuCisJKG1pcHNfc2V0X2ZwdV9jb21tYW5kKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkobWlwc19zaG93X2ZwdV9jb21tYW5kKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoX2luaXRpYWxpemVfbWlwc190ZGVwKTogQ2hhbmdlIGhhbmRsaW5nIG9mIHNldC9zaG93IG1pcHNmcHUuCisKK1R1ZSBKYW4gMTcgMDk6NDg6MzggMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGxpb3RoLmN5Z251cy5jb20+CisKKwkqIGEyOWstdGRlcC5jIChnZGJfcHJpbnRfaW5zbl9hMjlrKTogRml4IHR5cG8gKCZpbmZvIC0+IGluZm8pLgorCisJKiBwYXJzZS5jICh3cml0ZV9leHBfbXN5bWJvbCk6IFVzZSBuZXcgdmFyaWFibGVzCisJbXN5bV8qX3N5bWJvbF90eXBlIGFzIHR5cGUgb2YgbXN5bWJvbCBleHByZXNzaW9uLgorCShfaW5pdGlhbGl6ZV9wYXJzZSk6IEluaXRpYWxpemUgdGhlbS4KKworTW9uIEphbiAxNiAxODoxMTowMyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwlHZW5lcmFsIGNsZWFudXAgYW5kIHNpbXBsaWNhdGlvbiBvZiBkaXNhc3NlbWJsZXIgaW50ZXJmYWNlLgorCSogYTI5ay1waW5zbi5jLCBhcm0tcGluc24uYywgY29udmV4LXBpbnNuLmMsIGdvdWxkLXBpbnNuLmMsCisgICAgICAgIGhwcGEtcGluc24uYywgaTM4Ni1waW5zbi5jLCBpOTYwLXBpbnNuLmMsIG02OGstcGluc24uYywKKyAgICAgICAgbTg4ay1waW5zbi5jLCBtaXBzLXBpbnNuLmMsIG5zMzJrLXBpbnNuLmMsIHB5ci1waW5zbi5jLAorICAgICAgICByczYwMDAtcGluc24uYywgc3BhcmMtcGluc24uYywgdGFob2UtcGluc24uYywgdmF4LXBpbnNuLmM6IFJlbW92ZS4KKwkqIGdvdWxkLXRkZXAuYywgbnMzMmstdGRlcC5jLCB0YWhvZS10ZGVwLmMsIHZheC10ZGVwLmM6IE5ldyBmaWxlcywKKwloYWQgYmVlbiAtcGluc24uYyBmaWxlcy4KKwkqIE1ha2VmaWxlLmluIChBTExERVBGSUxFUyk6IFJlbW92ZSByZW1vdmVkIGZpbGVzLgorCShhMjlrLXBpbnNuLm8sIGFybS1waW5zbi5vLCBjb252ZXgtcGluc24ubywgZ291bGQtcGluc24ubywKKyAgICAgICAgaHBwYS1waW5zbi5vLCBpMzg2LXBpbnNuLm8sIGk5NjAtcGluc24ubywgbTY4ay1waW5zbi5vLAorICAgICAgICBtODhrLXBpbnNuLm8sIG1pcHMtcGluc24ubywgbnMzMmstcGluc24ubywgcHlyLXBpbnNuLm8sCisgICAgICAgIHJzNjAwMC1waW5zbi5vLCBzcGFyYy1waW5zbi5vLCB0YWhvZS1waW5zbi5vLCB2YXgtcGluc24ubyk6CisgICAgICAgIFJlbW92ZSBjb21waWxlIGFjdGlvbnMuCisJKiBhcm0tdGRlcC5vLCBnb3VsZC10ZGVwLm8sIG5zMzJrLXRkZXAubywgdGFob2UtdGRlcC5vLAorCXZheC10ZGVwLm86IEFkZCBjb21waWxlIGFjdGlvbnMuCisJKiBkZWZzLmggKHRtX3ByaW50X2luc24pOiBOZXcgZ2xvYmFsLgorCSogYTI5ay10ZGVwLmMgKGdkYl9wcmludF9pbnNuX2EyOWspOiBOZXcgZnVuY3Rpb24uCisJKF9pbml0aWFsaXplX2EyOWtfdGRlcCk6IFJlbmFtZSBmcm9tIF9pbml0aWFsaXplXzI5aywKKwlzZXQgdG1fcHJpbnRfaW5zbi4KKwkqIGFscGhhLXRkZXAuYyAocHJpbnRfaW5zbik6IFJlbW92ZS4KKwkoX2luaXRpYWxpemVfYWxwaGFfdGRlcCk6IFNldCB0bV9wcmludF9pbnNuLgorCSogYXJtLXRkZXAuYyAoYXJtX3ByaW50X2luc24pOiBOZXcgZnVuY3Rpb24sIHdhcyBwcmludF9pbnNuCisJaW4gYXJtLXBpbnNuLmMuCisJKiBjb252ZXgtdGRlcC5jIChjb252ZXhfcHJpbnRfaW5zbik6IE5ldyBmdW5jdGlvbiwgd2FzIHByaW50X2luc24KKwlpbiBjb252ZXgtcGluc24uYy4KKwkqIGg4MzAwLXRkZXAuYyAocHJpbnRfaW5zbik6IFJlbW92ZS4KKwkoZ2RiX3ByaW50X2luc25faDgzMDApOiBOZXcgZnVuY3Rpb24uCisJKF9pbml0aWFsaXplX2g4MzAwX3RkZXApOiBOZXcgZnVuY3Rpb24uCisJKiBoODUwMC10ZGVwLmMgKHByaW50X2luc24pOiBSZW1vdmUuCisJKF9pbml0aWFsaXplX2g4NTAwX3RkZXApOiBOZXcgZnVuY3Rpb24uCisJKiBocHBhLXRkZXAuYyAoX2luaXRpYWxpemVfaHBwYV90ZGVwKTogU2V0IHRtX3ByaW50X2luc24uCisJKiBpMzg2LXRkZXAuYyAoX2luaXRpYWxpemVfaTM4Nl90ZGVwKTogTmV3IGZ1bmN0aW9uLgorCSogaTk2MC10ZGVwLmMgKG1lbSwgbmV4dF9pbnNuKTogTmV3IGZ1bmN0aW9ucywgd2VyZSBpbgorCWk5NjAtcGluc24uYy4KKwkoX2luaXRpYWxpemVfaTk2MF90ZGVwKTogU2V0IHRtX3ByaW50X2luc24uCisJKiBtNjhrLXRkZXAuYyAoX2luaXRpYWxpemVfbTY4a190ZGVwKTogTmV3IGZ1bmN0aW9uLgorCSogbTg4ay10ZGVwLmMgKF9pbml0aWFsaXplX204OGtfdGRlcCk6IE5ldyBmdW5jdGlvbi4KKwkqIG1pcHMtdGRlcC5jIChnZGJfcHJpbnRfaW5zbl9taXBzKTogTmV3IGZ1bmN0aW9uLgorCShfaW5pdGlhbGl6ZV9taXBzX3RkZXApOiBTZXQgdG1fcHJpbnRfaW5zbi4KKwkqIHB5ci10ZGVwLmMgKHB5cl9wcmludF9pbnNuKTogTmV3IGZ1bmN0aW9uLCB3YXMgcHJpbnRfaW5zbgorCWluIHB5ci1waW5zbi5jLgorCSogcnM2MDAwLXRkZXAuYyAoX2luaXRpYWxpemVfcnM2MDAwX3RkZXApOiBOZXcgZnVuY3Rpb24uCisJKiBzaC10ZGVwLmMgKHByaW50X2luc24pOiBSZW1vdmUuCisJKGdkYl9wcmludF9pbnNuX3NoKTogTmV3IGZ1bmN0aW9uLgorCShfaW5pdGlhbGl6ZV9zaF90ZGVwKTogU2V0IHRtX3ByaW50X2luc24uCisJKiBzcGFyYy10ZGVwLmMgKF9pbml0aWFsaXplX3NwYXJjX3RkZXApOiBOZXcgZnVuY3Rpb24uCisJKiB3NjUtdGRlcC5jIChwcmludF9pbnNuKTogUmVtb3ZlLgorCShfaW5pdGlhbGl6ZV93NjVfdGRlcCk6IE5ldyBmdW5jdGlvbi4KKwkqIHo4ay10ZGVwLmMgKHByaW50X2luc24pOiBSZW1vdmUuCisJKGdkYl9wcmludF9pbnNuX3o4ayk6IE5ldyBmdW5jdGlvbi4KKwkoX2luaXRpYWxpemVfejhrX3RkZXApOiBTZXQgdG1fcHJpbnRfaW5zbi4KKwkqIHByaW50Y21kLmMgKHByaW50X2luc24pOiBOZXcgZnVuY3Rpb24sIGdlbmVyaWMgZGlzYXNzZW1ibGVyLgorCSogY29uZmlnLyovKi5tdCAoVERFUEZJTEVTKTogUmVtb3ZlIHJlZnMgdG8gKi1waW5zbi5vLgorCitNb24gSmFuIDE2IDE1OjQzOjI5IDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBhZGQgbmV3IGZpbGVzIHJlbW90ZS12eDI5ay5jLCBjb25maWcvYTI5ay90bS12eDI5ay5oLAorCWFuZCBjb25maWcvYTI5ay92eDI5ay5tdC4KKwkqIGNvbmZpZ3VyZS5pbjogYWRkIG5ldyBjb25maWd1cmF0aW9uIGEyOWstKi12eHdvcmtzLgorCSogcmVtb3RlLXZ4MjlrLmM6IG5ldyBmaWxlIG1lcmdlZCBmcm9tIFdSUy4KKwkqIHJlbW90ZS12eC5jOiBtZXJnZSBjaGFuZ2VzIGZyb20gV1JTLgorCSogY29uZmlnL2EyOWsvdngyOWsubXQ6IG5ldyBmaWxlIGZvciBuZXcgY29uZmlndXJhdGlvbi4KKwkqIGNvbmZpZy9hMjlrL3RtLXZ4MjlrLmg6IG5ldyBoZWFkZXIgZmlsZSBmb3IgbmV3Y29uZmlndXJhdGlvbi4KKworU3VuIEphbiAxNSAxNDozNjoxOSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KKworCSogYnJlYWtwb2ludC5oIChkaXNhYmxlX2JyZWFrcG9pbnQsIGVuYWJsZV9icmVha3BvaW50KToKKwlOZXcgZGVjbGFyYXRpb25zLgorCShlbnVtIGJwZGlzcCk6IENoYW5nZSBuYW1lIG9mICdkZWxldGUnIG1lbWJlciB0byAnZGVsJy4KKwkoc3RydWN0IGJwc3RhdCk6IENoYW5nZWQgbmFtZSB0byAnYnBzdGF0cycuCisJKiBicmVha3BvaW50LmMgKGRpc2FibGVfYnJlYWtwb2ludCwgZW5hYmxlX2JyZWFrcG9pbnQsCisJYnJlYWtwb2ludF9jaGFpbik6IE1hZGUgZ2xvYmFsbHkgdmlzaWJsZS4KKwkoYnBzdGF0X3N0b3Bfc3RhdHVzKTogVXNlIG5ldyBuYW1lIGZvciBicHN0YXQuCisJKGJyZWFrX2NvbW1hbmRfMSwgd2F0Y2hfY29tbWFuZF8xLCBjYXRjaF9jb21tYW5kXzEsCisJYnJlYWtwb2ludF9hdXRvX2RlbGV0ZSwgZGVuYWJsZV9kZWxldGVfYnJlYWtwb2ludCk6IFVzZSAnZGVsJworCWluc3RlYWQgb2YgJ2RlbGV0ZScuCisJKHNldF9icmVha3BvaW50X3NhbCk6IE5ldyBmdW5jdGlvbi4KKwkqIGRlZnMuaCAocmVnaXN0ZXJzX2NoYW5nZWRfaG9vayk6IE5ldyBkZWNsYXJhdGlvbi4KKwkqIGluZmNtZC5jIChydW5fc3RhY2tfZHVtbXkpOiAnZGVsZXRlJyBpcyBub3cgJ2RlbCcuCisJKiBpbmZsb3cuYyAobmV3X3R0eSk6IFRyZWF0IFdJTjMyIGluIHNhbWUgd2F5IGFzIF9fR08zMl9fCQorCSogbWFpbi5jIChtYWluKTogRG9uJ3Qgc2NhbiBvcHRpb25zIHdoZW4gaW4gV0lOMzIgYW5kIGV4aXQKKwl3aXRob3V0IGVudGVyaW5nIG1haW4gbG9vcC4KKwkqIG0yLWV4cC55IChtMl9lbHgpOiBNZW1iZXIgJ2NsYXNzJyBpcyBub3cgJ2FjbGFzcycuCisJKiBzeW10YWIuaCAoc3RydWN0IHN5bWJvbCwgc3RydWN0IHBhcnRpYWxfc3ltYm9sKTogQ2hhbmdlZCBuYW1lIG9mCisJbWVtYmVyICdjbGFzcycgdG8gJ2FjbGFzcycuIAorCShTWU1CT0xfQ0xBU1MsIFBTWU1CT0xfQ0xBU1MpOiBSZWZsZWN0IGNoYW5nZS4KKwkqIHRvcC5jIChyZWdpc3RlcnNfY2hhbmdlZF9ob29rKTogTmV3IGRlZmluaXRpb24uCisJKiB1dGlscy5jIChxdWl0LCBub3RpY2VfcXVpdCwgaW5pdGlhbGl6ZV91dGlscyk6IFRyZWF0ZSBXSU4zMgorCWluIHNhbWUgd2F5IGFzIF9fR08zMl9fLgorCSogdmFsdWUuaCAoY190eXBlZGVmX3ByaW50KTogUmVuYW1lICduZXcnIGFyZ3VtZW50LgorCisJKiB3NjUtdGRlcC5jLCBjb25maWcvdG0tdzY1LmgsIGNvbmZpZy93NjUubXQ6IE5ldyBmaWxlcy4KKwkqIGNvbmZpZ3VyZS5pbjogU3VwcHBydCBmb3IgdzY1LAorCisKK1NhdCBKYW4gMTQgMTE6MTg6MTEgMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGxpb3RoLmN5Z251cy5jb20+CisKKwkqIGluZmNtZC5jIChzaWduYWxfY29tbWFuZCk6IEZvciAic2lnbmFsIDAiLCBwYXNzIChDT1JFX0FERFIpLTEsCisJbm90IHN0b3BfcGMsIHRvIHByb2NlZWQuCisKKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwKTogQ2xlYXIgZXhwZWN0X3R5cGUgZXhjZXB0IGZvciBDKysgYW5kIENISUxMLgorCitGcmkgSmFuIDEzIDE3OjUyOjU3IDE5OTUgIEppbSBLaW5nZG9uICA8a2luZ2RvbkBsaW90aC5jeWdudXMuY29tPgorCisJKiBpbmZjbWQuYyAoc2lnbmFsX2NvbW1hbmQpOiBBY2NlcHQgInNpZ25hbCAwIjsgdGhlIGNoYW5nZSB0byBub3QKKwlhY2NlcHQgaXQgd2FzIGFjY2lkZW50YWwuICAiaGFuZGxlIDAiIGFuZCAiaW5mbyBzaWduYWwgMCIgcmVtYWluCisJaWxsZWdhbCwgdGhvdWdoLgorCitGcmkgSmFuIDEzIDE1OjE5OjAxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGFsbCk6IERvbid0IG1ha2UgbGliZ2RiLWZpbGVzLgorCShsaWJnZGIpOiBOZXcgYWN0aW9uLCBtYWtlcyBsaWJnZGItZmlsZXMuCisKK1RodSBKYW4gMTIgMjE6MjM6MjUgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIHN0YWJzcmVhZC5jIChyZWFkX2VudW1fdHlwZSk6ICBXaGVuIHBlbmRpbmcgZW51bSBzeW1ib2xzIGFyZQorCXB1dCBpbnRvIHRoZSBlbnVtIHR5cGUsIHRoZXkgbXVzdCBiZSBpbnNlcnRlZCBpbiAiYmFja3dhcmRzCisJb3JkZXIsIGluIGNhc2Ugd2UndmUgb3ZlcmZsb3dlZCBhIHN0cnVjdCBwZW5kaW5nIGJ1ZmZlci4KKworCitUaHUgSmFuIDEyIDA5OjMzOjI0IDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogUkVBRE1FOiAgQWRkIG5vdGUgYWJvdXQgU1BBUkN3b3JrcyBjYyByZWxlYXNlIDMuMCBhbmQgaGlnaGVyLgorCisJQWRkIHByb2NmcyBzdXBwb3J0IGZvciBBbHBoYSBPU0YvMS0yLnguCisJKiBjb25maWcvYWxwaGEvbm0tb3NmLmg6ICBSZW5hbWVkIGZyb20gbm0tYWxwaGEuaCwgZ2VuZXJpYworCU9TRi8xIG5hdGl2ZSBzdXBwb3J0LgorCSogY29uZmlnL2FscGhhL2FscGhhLW9zZjEubWggKE5BVF9GSUxFKTogIENoYW5nZWQgYWNjb3JkaW5nbHkuCisJKE1VTkNIX0RFRklORSk6ICBSZW1vdmVkLgorCSogY29uZmlnL2FscGhhL2FscGhhLW9zZjIubWgsIGNvbmZpZy9hbHBoYS9ubS1vc2YyLmg6ICBOZXcgZmlsZXMKKwlmb3IgcHJvY2ZzIHN1cHBvcnQuCisJKiBjb25maWd1cmUuaW4gKGFscGhhLWRlYy1vc2YqKTogIFVzZSBhbHBoYS1vc2YyLm1oIGZvciBPU0YvMQorCXJlbGVhc2UgMi54IGFuZCBoaWdoZXIsIGVsc2UgYWxwaGEtb3NmMS5taCwgYXMgdGhlIHByb2NmcyBzdXBwb3J0CisJaW4gcmVsZWFzZSAxLnggaXMgaW5jb21wbGV0ZS4KKwkqIE1ha2VmaWxlLmluIChBTExDT05GSUcpOiAgQWRkIGNvbmZpZy9hbHBoYS9hbHBoYS1vc2YyLm1oLgorCSogYWxwaGEtbmF0LmMgKHN1cHBseV9ncmVnc2V0LCBmaWxsX2dyZWdzZXQsIHN1cHBseV9mcGdyZWdzZXQsCisJZmlsbF9mcGdyZWdzZXQpOiAgTmV3IHJvdXRpbmVzIGZvciBwcm9jZnMgc3VwcG9ydC4KKwkqIGluZnRhcmcuYyAoX2luaXRpYWxpemVfaW5mdGFyZyk6ICBEb24ndCBhZGQgcHRyYWNlIHN1cHBvcnQKKwlpZiB3ZSBoYXZlIGFuIG9wdGlvbmFsIHByb2NmcyBhbmQgL3Byb2MgaXMgYWNjZXNzaWJsZS4KKwkqIHByb2Nmcy5jOiAgSW5jbHVkZSBzeXMvZmF1bHQuaCBhbmQgc3lzL3N5c2NhbGwuaCBiZWZvcmUKKwlpbmNsdWRpbmcgc3lzL3Byb2Nmcy5oLgorCSh1bmNvbmRpdGlvbmFsbHlfa2lsbF9pbmZlcmlvcik6ICBJZiBQUk9DRlNfTkVFRF9QSU9DU1NJR19GT1JfS0lMTAorCWlzIGRlZmluZWQsIGFkZGl0aW9uYWxseSBwZXJmb3JtIGEgUElPQ1NTSUcgdG8gcmVhbGx5IHRlcm1pbmF0ZQorCXRoZSBpbmZlcmlvci4KKwkoY3JlYXRlX3Byb2NpbmZvKTogIEFsd2F5cyByZXR1cm4gYSByZXN1bHQuCisJKGNyZWF0ZV9wcm9jaW5mbywgZG9fYXR0YWNoKTogIERvbid0IHRyYWNlIFRfSUZBVUxUIGZhdWx0cyBpZgorCVBST0NGU19ET05UX1RSQUNFX0lGQVVMVCBpcyBkZWZpbmVkLgorCShwcm9jZnNfaW5pdF9pbmZlcmlvcik6ICBVc2UgU1RBUlRfSU5GRVJJT1JfVFJBUFNfRVhQRUNURUQgYXMKKwlhcmd1bWVudCB0byBzdGFydHVwX2luZmVyaW9yIGlmIGl0IGlzIGRlZmluZWQuCisJKHByb2Nfc2V0X2V4ZWNfdHJhcCk6ICBJZiBQSU9DU1NQQ0FDVCBpcyBkZWZpbmVkLCB1c2UgaXQgaW5zdGVhZAorCW9mIHRyYWNpbmcgZXhpdHMgZnJvbSBleGVjIHN5c3RlbSBjYWxscy4gTmVlZGVkIGZvciB0aGUgdXNlciBsZXZlbAorCWxvYWRlciB1bmRlciBBbHBoYSBPU0YvMS4KKwkoZG9fZGV0YWNoKTogIENsZWFyIGFueSBwZW5kaW5nIHNpZ25hbCBpZiB3ZSB3YW50IHRvIGRldGFjaCBmcm9tCisJYSBwcm9jZXNzIHdpdGhvdXQgYSBzaWduYWwuCisJKHNldF9wcm9jX3NpZ2luZm8pOiAgSWYgUFJPQ0ZTX0RPTlRfUElPQ1NTSUdfQ1VSU0lHIGlzIGRlZmluZWQsCisJZG9uJ3QgaXNzdWUgYSBQSU9DU1NJRyBpZiBwcl9jdXJzaWcgYWxyZWFkeSBjb250YWlucyB0aGUgc2lnbmFsIHdlCisJaW50ZW5kIHRvIHNldC4KKwkoaW5mb19wcm9jX3NpZ25hbHMpOiAgSWYgUFJPQ0ZTX1NJR1BFTkRfT0ZGU0VUIGlzIGRlZmluZWQsIHRoZQorCXBlbmRpbmcgc2lnbmFscyBhcmUgbnVtYmVyZWQgZnJvbSAxIGluc3RlYWQgb2YgMC4KKwkoaW5mb19wcm9jX21hcHBpbmdzKTogIEluY3JlYXNlIHNpemUgb2Ygb3V0cHV0IGZvcm1hdCBmb3IgYWRkcmVzc2VzCisJaWYgQkZEX0hPU1RfNjRfQklUIGlzIGRlZmluZWQuCisJKHByb2Nmc19zdG9wKTogIFJlbmFtZWQgZnJvbSBjaGlsZF9zdG9wLgorCShfaW5pdGlhbGl6ZV9wcm9jZnMpOiAgRG9uJ3QgYWRkIHByb2NmcyBzdXBwb3J0IGlmIHdlIGhhdmUgYW4KKwlvcHRpb25hbCBwcm9jZnMgYW5kIC9wcm9jIGlzIG5vdCBhY2Nlc3NpYmxlLgorCisKK1dlZCBKYW4gMTEgMTc6NTM6MjYgMTk5NSAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgorCisJKiBhcnJheS1yb20uYzogQWRkIHN1cHBvcnQgZm9yIG1vc3QgY29tbWFuZHMuCisJCisJKiBtb25pdG9yLmM6IEFkZCBHREIgcmVtb3RlIHByb3RvY29sIGZvciB0aGUgaHlicmlkIGVudmlyb25tZW50IG9uCisJdGhlIEFycmF5IGJvYXJkLiAKKworV2VkIEphbiAxMSAwMDo0NDowMSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogY29tbWFuZC5jIChzaG93X3VzZXJfMSk6IFVzZSBwcmludF9jb21tYW5kX2xpbmUgdG8gc2hvdyBhIHVzZXIKKwlkZWZpbmVkIGNvbW1hbmQgKGluY2x1ZGluZyBjb250cm9sIHN0cnVjdHVyZXMpLgorCisJKiB0b3AuYyAoaW5pdF9tYWluKTogQ2hhbmdlIGRvY3VtZW50YXRpb24gZm9yIHVzZXIgZGVmaW5lZAorCWNvbW1hbmRzIHRvIGluZGljYXRlIHRoZXkgbWF5IGFjY2VwdCB1cCB0byB0ZW4gYXJndW1lbnRzLgorCitUdWUgSmFuIDEwIDE2OjIyOjQxIDE5OTUgIEppbSBLaW5nZG9uICA8a2luZ2RvbkBsaW90aC5jeWdudXMuY29tPgorCisJKiBtaXBzLXRkZXAuYyAobWlwc19za2lwX3Byb2xvZ3VlKTogQWNjZXB0IG9yIGFzIHdlbGwgYXMgYWRkdSBmb3IKKwlgbW92ZSAkczgsICRzcCcgaW5zdHJ1Y3Rpb24uCisKK1N1biBKYW4gIDggMTI6NDU6MzQgMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGRlbmViLmN5Z251cy5jb20+CisKKwkqIHRhcmdldC5jLCB0YXJnZXQuaCAodGFyZ2V0X3NpZ25hbF9mcm9tX2NvbW1hbmQpOiBOZXcgZnVuY3Rpb24uCisJKiBpbmZydW4uYyAoaGFuZGxlX2NvbW1hbmQsIHNpZ25hbHNfaW5mbyksIGluZmNtZC5jCisJKHNpZ25hbF9jb21tYW5kKTogVXNlIGl0LgorCSogaW5mcnVuLmMsIGluZmNtZC5jOiBVcGRhdGUgZG9jc3RyaW5ncyBmb3IgdGhlc2UgY29tbWFuZHMuCisKKwkqIHRhcmdldC5oIChlbnVtIHRhcmdldF9zaWduYWwpLCB0YXJnZXQuYyAoc2lnbmFscyksIHRhcmdldC5jCisJKHRhcmdldF9zaWduYWxfZnJvbV9ob3N0LCB0YXJnZXRfc2lnbmFsX3RvX2hvc3QpOiBBZGQKKwlUQVJHRVRfU0lHTkFMX1JFQUxUSU1FXyogYW5kIFRBUkdFVF9TSUdOQUxfUFJJTyBmb3IgbHlueC4KKwkqIGNvbmZpZy90bS1seW54Lmg6IERlZmluZSBzaWduYWwgbnVtYmVycyBmb3IgcmVhbHRpbWUgZXZlbnRzLgorCitTYXQgSmFuICA3IDA3OjIzOjUzIDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpOiAgSGFuZGxlIE5fRlVOIHN5bWJvbHMKKwlmb3IgU3VuIGFjYyAzLjAgdW5kZXIgU3VuT1M0LgorCisJQ2hhbmdlcyB0byBpbXByb3ZlIGhhbmRsaW5nIG9mIHJ1bnRpbWUgY29tbW9uIHN5bWJvbHMKKwl1bmRlciBTdW5PUzQuCisJKiBtaW5zeW1zLmMgKGdldF9zeW1ib2xfbGVhZGluZ19jaGFyKTogIE5ldyByb3V0aW5lIHRvIGRldGVybWluZQorCXRoZSBsZWFkaW5nIHN5bWJvbCBjaGFyYWN0ZXIgZm9yIGFuIG9iamZpbGUuCisJKHByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9sX2FuZF9pbmZvLCBpbnN0YWxsX21pbmltYWxfc3ltYm9scyk6CisJVXNlIGl0LgorCSogb2JqZmlsZXMuaCAocnRfY29tbW9uX29iamZpbGUpOiAgTmV3IGdsb2JhbCwgcG9pbnRzIHRvIG9iamZpbGUKKwljb250YWluaW5nIHRoZSBydW50aW1lIGNvbW1vbiBtaW5pbWFsIHN5bWJvbHMuCisJKiBvYmpmaWxlcy5jIChmcmVlX29iamZpbGUpOiAgTWFyayBydF9jb21tb25fb2JqZmlsZSBhcworCXVuYWxsb2NhdGVkIGJlZm9yZSBmcmVlaW5nIGl0LgorCSogc29saWIuYyAoYWxsb2NhdGVfcnRfY29tbW9uX29iamZpbGUpOiAgTmV3IHJvdXRpbmUgdG8gYWxsb2NhdGUKKwlhbiBvYmpmaWxlIGZvciB0aGUgcnVudGltZSBjb21tb24gbWluaW1hbCBzeW1ib2xzLgorCShzb2xpYl9hZGRfY29tbW9uX3N5bWJvbHMpOiAgQWxsb2NhdGUgYW4gb2JqZmlsZSBmb3IgdGhlIHJ1bnRpbWUKKwljb21tb24gc3ltYm9scyBpZiBuZWNlc3NhcnkgYW5kIHB1dCBjb21tb24gc3ltYm9scyBpbnRvIGl0LgorCUNsZWFuIHVwIGNvZGUgYW5kIGNvbW1lbnRzLgorCShzb2xpYl9hZGQsIHNwZWNpYWxfc3ltYm9sX2hhbmRsaW5nKTogIENsZWFudXAgY29tbWVudHMgcmVnYXJkaW5nCisJcnVudGltZSBjb21tb24gc3ltYm9scy4KKwkqIHN0YWJzcmVhZC5jIChzY2FuX2ZpbGVfZ2xvYmFsc18xKTogIE5ldyByb3V0aW5lLCBjb250YWlucworCW9sZCBzY2FuX2ZpbGVfZ2xvYmFscyBjb2RlLiBDaGVja3MgaWYgdGhlcmUgYXJlIGFueSB1bnJlc29sdmVkCisJZ2xvYmFsIHN5bWJvbHMgYmVmb3JlIHN0YXJ0aW5nIHRoZSBleHBlbnNpdmUgbWluaW1hbCBzeW1ib2wgdGFibGUKKwlzZWFyY2guCisJKHNjYW5fZmlsZV9nbG9iYWxzKTogIE5vdyBjYWxscyBzY2FuX2ZpbGVfZ2xvYmFsc18xIGZvciB0aGUgcGFzc2VkCisJb2JqZmlsZSBhbmQgZXZlbnR1YWxseSBmb3IgdGhlIHJ1bnRpbWUgY29tbW9uIG9iamZpbGUuIENvbXBsYWlucworCWFib3V0IGFueSB1bnJlc29sdmVkIGdsb2JhbCBzeW1ib2xzIGFuZCByZW1vdmVzIHRoZW0gZnJvbSB0aGUKKwlnbG9iYWwgc3ltYm9sIGNoYWluIHRvIGF2b2lkIGRhbmdsaW5nIHBvaW50ZXJzIGludG8gdGhlIHN5bWJvbAorCXRhYmxlIGlmIHRoZSBzeW1ib2wgdGFibGUgaXMgcmVyZWFkLgorCitUaHUgSmFuICA1IDE3OjM4OjI5IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsX29ubHkgdW5pbnN0YWxsKTogIEluZGVudCBmb3IgY2xhcml0eS4KKworCSogY29yZS5jIChkaXNfYXNtX3JlYWRfbWVtb3J5KTogIEFkZCBjYWxsIHRvCisJZGlzX2FzbV9yZWFkX21lbW9yeV9ob29rIHRvIHByb3ZpZGUgYWx0ZXJuYXRlIHdheSBmb3IgZGlzYXNzZW1ibGVyCisJdG8gcmVhZCBtZW1vcnkuCisKKwkqIGRlZnMuaDogIFByb3RlY3QgZnJvbSBtdWx0aXBsZSBpbmNsdXNpb24uICBBZGQgZGVjbCBmb3IKKwlkaXNfYXNtX3JlYWRfbWVtb3J5X2hvb2suCisKKwkqIHRvcC5jOiAgTWFrZSB3aW5kb3cgc3RhcnR1cCBiZSB0aGUgZGVmYXVsdC4KKwkqIEFkZCBkaXNfYXNtX3JlYWRfbWVtb3J5X2hvb2suCisKKworVGh1IEphbiAgNSAwMToxNjo0MCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogc3RhYnNyZWFkLmMgKGRlZmluZV9zeW1ib2wpOiBIYW5kbGUgYGEnIHN5bWJvbCB0eXBlIHVzZWQgZm9yCisJcmVmZXJlbmNlIHBhcmFtZXRlciBwYXNzZWQgaW4gYSByZWdpc3Rlci4KKworCitXZWQgSmFuICA0IDEyOjI3OjI5IDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BtZXhpY2FuLmN5Z251cy5jb20+CisKKwkqIGRlZnMuaDogbW92ZSBpbmNsdWRlIHRtLmggdXAsIHNvIHRoYXQgdGhlIHR5cGUgTE9OR0VTVCBjYW4KKwlhbHNvIGJhc2VkIG9uIHRoZSB0YXJnZXQgcmVxdWlyZW1lbnQgdG8gZGV0ZXJtaW5lLiBJbiB0aGlzIGNhc2UKKwl0YXJnZXQgbWlwczY0LgorCisJKiByZW1vdGUtb3M5ay5jIChyb21idWdfb3Blbik6IGNhdGNoIGV4Y2VwdGlvbiBlIGluIHJvbWJ1Zy4KKwkqIHJlbW90ZS1vczlrLmMgKHJvbWJ1Z193YWl0KTogcHJpbnQgbWVzc2FnZSBiZWZvcmUgcmVnaXN0ZXIgZGlzcGxheQorCWZyb20gcm9tYnVnLgorCitXZWQgSmFuICA0IDA5OjE4OjI3IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiB0b3AuYyAobG9jYXRlX2FyZyk6IENhbGwgc3RyY2hyIG5vdCBpbmRleC4KKworVHVlIEphbiAgMyAxNjo1MjowMyAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogY2gtZXhwLnkgKGxpdGVyYWwpOiAgUmVjb2duaXplIE5VTEwuCisJKHR1cGxlKTogIFBhcnNlIHNpbXBsZSB1bmxhYmVsbGVkIHR1cGxlcy4KKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwIGNhc2UgT1BfQVJSQVkpOiAgVXNlIGV4cGVjdF90eXBlIHRvCisJZXZhbHVhdGUgYnJhY2UtaW5pdGlhbGl6ZXItZXhwcmVzc2lvbnMgZGVwZW5kaW5nIG9uIGNvbnRleHQuCisJKGV2YWx1YXRlX3N1YmV4cCBjYXNlIFVOT1BfQ0FTVCk6ICBQYXNzIHRoZSB0YXJnZXQgdHlwZSBhcworCWV4cGVjdGVkIHR5cGUgd2hlbiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uLgorCisJKiBjaC10eXBlcHJpbnQuYyAoY2hpbGxfdHlwZV9wcmludF9iYXNlKTogIEdldCBuYW1lcyBvZiBQVFIgYW5kCisJQk9PTCBmcm9tIFRZUEVfTkFNRS4KKwkqIGNoLXZhbHByaW50LmMgKGNoaWxsX3ByaW50X3R5cGVfc2NhbGFyKTogIE5ldyBmdW5jdGlvbiwgdG8gaGFuZGxlCisJVFlQRV9DT0RFX1JBTkdFIGJldHRlciB0aGFuIHByaW50X3R5cGVfc2NhbGFyIGRvZXMuCisJKGNoaWxsX3ZhbF9wcmludF9hcnJheV9lbGVtZW50cyk6ICBVc2UgYWJvdmUgbmV3IGZ1bmN0aW9uLgorCitNb24gSmFuICAyIDE1OjAyOjUxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLXVkaS5jICh1ZGlfbG9hZCk6IFRlbGwgc3ltYm9sX2ZpbGVfYWRkIHRoYXQgdGhlCisJcHJvZ3JhbSBiZWluZyBsb2FkZWQgaXMgdGhlIG1haW4gcHJvZ3JhbS4KKworRm9yIG9sZGVyIGNoYW5nZXMgc2VlIENoYW5nZUxvZy05NAorDAorTG9jYWwgVmFyaWFibGVzOgorbW9kZTogaW5kZW50ZWQtdGV4dAorbGVmdC1tYXJnaW46IDgKK2ZpbGwtY29sdW1uOiA3NAordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvZ2RiL0NoYW5nZUxvZy05NiBiL2dkYi9DaGFuZ2VMb2ctOTYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwYjQyNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9DaGFuZ2VMb2ctOTYKQEAgLTAsMCArMSw1MTE2IEBACitUdWUgRGVjIDMxIDE1OjE5OjMyIDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBjb25maWcvbW4xMDMwMC90bS1tbjEwMzAwLmg6IG1vcmUgc21hbGwgcmVnaXN0ZXIgZml4ZXMKKworVHVlIERlYyAzMSAwNjo1MTo0MyAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9pMzg2L3htLXdpbmRvd3MuaDogVW5kbyBwcmV2aW91cyBjaGFuZ2UgdG8gU0lHVFJBUAorCWFuZCBTSUdRVUlUIHZhbHVlczsgaXQgbWVzc2VkIHVwIG5vbi1NSVBTIHRhcmdldHMuCisJKiBjb25maWcvbWlwcy90bS1taXBzLmg6IFVuZGVmaW5lIEJSRUFLUE9JTlQsIHJlcGxhY2UKKwl3aXRoIHNlcGFyYXRlIExJVFRMRV9CUkVBS1BPSU5UIGFuZCBCSUdfQlJFQUtQT0lOVCBkZWZpbml0aW9uczsKKwl0aGlzIGZpeGVzIHByb2JsZW0gd2l0aCBzZXR0aW5nIGJyZWFrcG9pbnRzIGluIGxpdHRsZS1lbmRpYW4KKwlwcm9ncmFtcyBpbiB0aGUgc2ltdWxhdG9yLgorCitNb24gRGVjIDMwIDAwOjE0OjA2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmMgKGdkYnNpbV9vcGVuX3ApOiBOZXcgc3RhdGljIGxvY2FsLgorCShnZGJzaW1fb3Blbik6IENhbGwgdW5wdXNoX3RhcmdldCBpZiBzaW0gb3Blbi4gIFNldCBnZGJzaW1fb3Blbl9wLgorCShnZGJzaW1fY2xvc2UpOiBPbmx5IGNhbGwgc2ltX2Nsb3NlIGlmIHNpbSBvcGVuLiAgUmVzZXQgZ2Ric2ltX29wZW5fcC4KKworU3VuIERlYyAyOSAwOToxNTowMyAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9pMzg2L3htLXdpbmRvd3MuaDogTWFrZSBTSUdUUkFQIGFuZCBTSUdRVUlUIGNvbnNpc3RlbnQKKwl3aXRoIHNpbS9taXBzL3N1cHBvcnQuaC4KKworRnJpIERlYyAyNyAxNDo1Mzo0MCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHY4NTAtdGRlcC5jIChzdHJ1Y3QgcGlmc3IpOiBBZGQgY3VyX2ZyYW1lb2Zmc2V0IGZpZWxkLgorCSh2ODUwX3NjYW5fcHJvbG9ndWUpOiBBZGQgZGVidWcgY29kZSAjaWZkZWYnZWQgREVCVUcuICBTdXBwb3J0IG5ldworCWNvbXBpbGVyIHByb2xvZ3VlcyB1c2luZyByZWdpc3RlciBzYXZlIGZ1bmN0aW9ucyBhbmQgc2hvcnQgc3RvcmUKKwlpbnN0cnVjdGlvbnMuICBBZGQgc3VwcG9ydCBmb3IgZnVuY3Rpb25zIHdpdGggbGFyZ2Ugc3RhY2sgZnJhbWVzLgorCisJKiBjb25maWcvdjg1MC90bS12bTg1MC5oICh7UjAsUjEsUjEyLEVQfV9SRUdOVU1TKTogTmV3IHJlZ2lzdGVyCisJbnVtYmVyIGRlZmludGlpb25zIGZvciByMCwgcjEsIHIxMiwgZXAuCisJKFNBVkV7MSwyLDN9X3tTVEFSVCxFTkR9X1JFR05VTSk6IFJlZ2lzdGVyIG51bWJlciBkZWZpbml0aW9ucyBmb3IKKwl0aGUgMyBzZXRzIG9mIHNhdmVkIHJlZ2lzdGVycy4KKworVGh1IERlYyAyNiAxOTo1Njo1NSAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIHZhbHByaW50LmMgKHByaW50X2xvbmdlc3QpOiBEb24ndCBsb3NlIHVwcGVyIGJpdHMKKwlvZiA2NC1iaXQgdmFsdWVzIG9uIFdpbmRvd3MuCisJKiBjb25maWcvaTM4Ni94bS13aW5kb3dzLmg6IExlYXZlIENDX0hBU19MT05HX0xPTkcgZGVmaW5lZCwKKwl1bmRlZmluZSBQUklOVEZfSEFTX0xPTkdfTE9ORywgc28gdGhhdCA2NC1iaXQgdmFsdWVzIHdpbGwKKwliZSBwcmludGVkIHdpdGhvdXQgbG9zcyBvZiB1cHBlciBiaXRzLgorCitUaHUgRGVjIDI2IDE1OjE1OjIxIDE5OTYgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9zcGFyYy90bS1zcGFyY2xldC5oOiBtYWtlIHJlZ2lzdGVycyBBU1IxNSwgQVNSMTkgaW52aXNpYmxlCisgICAgICAgICAgKHRoZXkncmUgbm90IHVzZWZ1bCwgeW91IGNhbid0IGNoYW5nZSwgd3JpdGUgb3IgZXZlbiByZWFkIHRoZW0pCisJCitUaHUgRGVjIDI2IDE1OjIwOjQ4IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWcvcGEvaHBwYWhwdXgubWggKFRFUk1DQVApOiBBbHdheXMgbGluayB0byBsaWJjIGJlZm9yZQorCWxpYmN1cnNlcywgdG8gYXZvaWQgcGlja2luZyB1cCBicm9rZW4gc2VsZWN0KCkgZnJvbSBsaWJjdXJzZXMKKwlvbiBzb21lIHZlcnNpb25zIG9mIEhQVVguCisKK1RodSBEZWMgMjYgMTU6MTQ6NDEgMTk5NiAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKwkKKwkqIHNwYXJjbGV0LXJvbS5jOiBSZW1vdmUgaW5jbHVkZXMgb2YgVW5peCBzeXN0ZW0gZmlsZXMuCisJICBBZGQgZnVuY3Rpb24gInNwYXJjbGV0X3N1cHBseV9yZWdpc3RlciIgc28gdGhhdCBwYXJzZV9yZWdpc3Rlcl9kdW1wCisJICB3aWxsIG5vdCBzZWctZmF1bHQgYnkgY2FsbGluZyBhIG51bGwgZnVuY3Rpb24gcG9pbnRlci4KKwkgIFJlbW92ZSBYTU9ERU0gc3VwcG9ydCAodW5maW5pc2hlZCB3b3JrPykuCisJICBSZW1vdmUgZmxhZyAiTU9fSEFORExFX05MIiwgc28gbW9uaXRvcidzIG91dHB1dCBjYW4gYmUgcmVhZCBieSBodW1hbnMuCisJICBBZGQgZmlsbCBjb21tYW5kLgorCSAgUmVtb3ZlIGNvbG9uIGZyb20gZ2V0cmVnLnJlc3BfZGVsaW0gc28gUFNSIHJlZ2lzdGVyIHdpbGwgd29yay4KKwkgIFJlbW92ZSBwb2ludGVyIHRvIHNwYXJjbGV0X2xvYWQgKGRvd25sb2FkaW5nIFNSRUMncyBkb2Vzbid0IHdvcmspLgorCSAgTnVsbCBvdXQgbG9jYWwgcmVnaXN0ZXIgbmFtZXMgZm9yICVnMCwgYWxsICVjYyBhbmQgYWxsICVhc3IgcmVncywKKwkgIHNpbmNlIHRoZSBtb25pdG9yIGNhbid0IHJlcG9ydCB0aGVtLiAgV2lsbCByZXR1cm4gemVybyBpbnN0ZWFkLgorCSogc3BhcmNsZXQtc3R1Yi5jOiBOZXcgLS0gcmVtb3RlIHByb3RvY29sIHN1cHBvcnQgZm9yIHNwYXJjbGV0IENQVS4KKwkqIGNvbmZpZy9zcGFyYy90bS1zcGFyY2xldC5oOiBSZS1hcnJhbmdlIFJFR0lTVEVSX05BTUVTOgorCSAgQWRkIGJhY2sgJWcwIGFuZCAlcHNyLCBhZGQgJWNjIGNvcHJvY2Vzc29yIHJlZ3MsIGFkZCAlYXNyIHJlZ3MuCisJICBBZGp1c3QgTlVNX1JFR1MgYW5kIFJFR0lTVEVSX0JZVEVTIGFjY29yZGluZ2x5CisKK1R1ZSBEZWMgMjQgMTA6Mjc6MzcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiByZW1vdGUtZTcwMDAuYyAod2FudF9oODMwMGgsIHdhbnRfbm9wY19oODMwMGgpOiBSZW5hbWVkCisJZnJvbSB3YW50IGFuZCB3YW50X25vcGMuCisJKHdhbnRfaDgzMDBzLCB3YW50X25vcGNfaDgzMDBzKTogTmV3IHZhcmlhYmxlcyBmb3IgSDgvUyByZWdpc3RlcgorCWxpc3RzLgorCShlNzAwMF9mZXRjaF9yZWdpc3RlcnMpOiBVc2UgSDgvMzAwSCBvciBIOC9TIHJlZ2lzdGVyIGxpc3Qgc3RyaW5nCisJYXMgbmVlZGVkLgorCShlNzAwMF93YWl0KTogTGlrZXdpc2UuCisKK01vbiBEZWMgMjMgMDI6MjU6NTggMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBtaXBzLXRkZXAuYyAobWlwc19maW5kX3NhdmVkX3JlZ3MpOiAgSWYgYSBmcmFtZSBoYXMgYmVlbgorCWludGVycnVwdGVkIGJ5IGEgc2lnbmFsLCBmaWd1cmUgb3V0IHdoZXRoZXIgdGhlIHJlZ2lzdGVycyB0aGF0CisJdGhlIHByb2NfZGVzYyBjbGFpbXMgYXJlIHNhdmVkIGhhdmUgYmVlbiBzYXZlZCB5ZXQuCisJKG1pcHNfcHVzaF9kdW1teV9mcmFtZSk6ICBXcml0ZSBkdW1teSBmcmFtZSByZWdpc3RlciBhZnRlciBhbGwKKwlyZWdpc3RlcnMgaGF2ZSBiZWVuIHNhdmVkIGluIHRoZSBkdW1teSBmcmFtZS4gVXBkYXRlIGNvbW1lbnRzCisJdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IHdlIGFyZSBub3cgdXNpbmcgYW4gQVRfRU5UUllfUE9JTlQKKwljYWxsIGR1bW15LgorCitTdW4gRGVjIDIyIDE1OjUyOjI1IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBkMTB2LXRkZXAuYyAoZDEwdl9za2lwX3Byb2xvZ3VlKTogUFIxMTI4Ny4gIEZpeCBwcm9ibGVtIHdoZXJlCisJc29tZSBicmVha3BvaW50cyB3ZXJlbid0IGJlaW5nIHNldC4KKworU2F0IERlYyAyMSAxMjo1Nzo1OSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaCAoUENfSU5fQ0FMTF9EVU1NWSk6ICBSZW1vdmVkLCB0aGUgZGVmYXVsdAorCWRlZmluaXRpb24gaW4gaW5mZXJpb3IuaCBpcyBzdWZmaWNpZW50LgorCSogbWlwcy10ZGVwLmMgKG1pcHNfcGNfaW5fY2FsbF9kdW1teSk6ICBEaXR0by4KKwkobWlwc19wdXNoX2FyZ3VtZW50cyk6ICBNYWtlIHN1cmUgdGhhdCB0aGUgc3RhY2sgaXMgYWxpZ25lZCB0byBhCisJbXVsdGlwbGUgb2YgOCBhZnRlciB0aGUgYXJndW1lbnRzIGFyZSBwdXNoZWQuCisJU3RydWN0dXJlcyBhcmUgYWx3YXlzIHBhc3NlZCBieSB2YWx1ZSBpbiB0aGUgb2xkIEFCSS4KKwlBZGp1c3QgYXJndW1lbnQgcmVnaXN0ZXIgdmFsdWUgb24gYmlnIGVuZGlhbiB0YXJnZXRzIHdoZW4gcGFzc2luZworCWEgdmFsdWUgd2hvc2UgbGVuZ3RoIGlzIGxlc3MgdGhhbiB0aGUgcmVnaXN0ZXIgc2l6ZS4KKwlXcml0ZSBzdGFjayBhcmd1bWVudHMgd2l0aCBhIHNpbmdsZSB3cml0ZV9tZW1vcnkgY2FsbC4KKwkobWlwc19wb3BfZnJhbWUpOiAgVXNlIGZyYW1lX3NhdmVkX3JlZ3MgaW5zdGVhZCBvZiBwcm9jX2Rlc2MgdG8KKwlkZWNpZGUgd2hpY2ggcmVnaXN0ZXJzIGhhdmUgdG8gYmUgcmVzdG9yZWQuCisKKwkqIGlyaXg1LW5hdC5jIChmaWxsX2dyZWdzZXQpOiAgU2lnbiBleHRlbmQgcmVnaXN0ZXJzIGJlZm9yZQorCWZpbGxpbmcgaW4gdGhlIGdyZWdzZXQgc3RydWN0dXJlLgorCitGcmkgRGVjIDIwIDExOjA2OjAzIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIG1zd2luL2dlbm1ha2VzOiAgRG9uJ3QgZGVmaW5lIF9ERUJVRy4gIFRoaXMgYnJlYWtzIHdpbmdkYi4KKworVGh1IERlYyAxOSAxOTo0Mjo0NCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHY4NTAtdGRlcC5jICh2ODUwX3NjYW5fcHJvbG9ndWUpOiBEZWFsIHdpdGggLW1lcCBzaG9ydGluZworCXJlZ2lzdGVyIHNhdmVzIGJ5IHVzaW5nIHRoZSBlcCByZWdpc3Rlci4KKworVGh1IERlYyAxOSAxNTo1NzoxNiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBtMzJyLXRkZXAuYyAobTMycl9mcmFtZV9maW5kX3NhdmVkX3JlZ3MpOiBGaXggdGhpbmtvIGluIGFyZyBkZWYuCisKK1RodSBEZWMgMTkgMDk6Mzg6NTYgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiB2YWx1ZXMuYyAodW5wYWNrX2RvdWJsZSk6IE1ha2UgaXQgY29tcGlsZSB3aXRoIE1TVkMrKyAyLnguCisJKiByZW1vdGUtbWlwcy5jIChTX0lST1RIKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkIGJ5IHN0YXQuaCwgZS5nLgorCXdoZW4gdXNpbmcgTVNWQysrLgorCShjb21tb25fb3Blbik6IEZpeCBoZWxwIHN0cmluZy4KKworV2VkIERlYyAxOCAyMzowMTozMiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1tYWtlLnNlZDogVXNlIE5ld0ZvbGRlclJlY3Vyc2l2ZSBmb3IgaW5zdGFsbGF0aW9uLgorCitTYXQgRGVjIDE0IDIwOjUwOjAxIDE5OTYgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogbWlwcy10ZGVwLmMgKG1pcHNfcHVzaF9hcmd1bWVudHMpOiBIYW5kbGUgZmxvYXRpbmcgcG9pbnQgYXJncy4KKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaCAoRklYX0NBTExfRFVNTVkpOiBEZWZpbmUgdG8gc2V0IHVwICQyNQorCWNvcnJlY3RseSBmb3IgUElDIG9uIElyaXggNS4KKworU2F0IERlYyAxNCAwOTo1MjozMCAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGkzODYtdGRlcC5jIChpMzg2X2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyk6ICBIYW5kbGUgemVybyByZXR1cm4KKwlmcm9tIGdldF9wY19mdW5jdGlvbl9zdGFydCBncmFjZWZ1bGx5LgorCitTYXQgRGVjIDE0IDAwOjQzOjU3IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogYy1leHAueSAocXVhbGlmaWVkX25hbWUpOiAgUmVwbGFjZSBleHBsaWNpdCBjaGVjayBmb3IgdmFsaWQKKwlkZXN0cnVjdG9yIG5hbWUgd2l0aCBjYWxsIHRvIGRlc3RydWN0b3JfbmFtZV9wLgorCisJKiBjLWxhbmcuaCwgYy10eXBlcHJpbnQuYyAoY3BfdHlwZV9wcmludF9tZXRob2RfYXJncyk6ICBSZW1vdmVkLAorCW5vIGxvbmdlciBuZWVkZWQuCisKKwkqIGMtdHlwZXByaW50LmMgKGNfdHlwZV9wcmludF92YXJzcGVjX3ByZWZpeCwgY190eXBlX3ByaW50X2Jhc2UpOgorCVJlcGxhY2UgcmVtYWluaW5nIGZwcmludGZfdW5maWx0ZXJlZCBjYWxscyB3aXRoIHRoZWlyIGZpbHRlcmVkIHZhcmlhbnQuCisJKGNfdHlwZV9wcmludF9iYXNlKTogIERvIG5vdCBwcmludCByZXR1cm4gdHlwZSBmb3IgZGVzdHJ1Y3RvcnMgZnJvbQorCXRlbXBsYXRlIGNsYXNzZXMuCisJUmVwbGFjZSBjcF90eXBlX3ByaW50X21ldGhvZF9hcmdzIHdpdGggY3BsdXNfZGVtYW5nbGUgY2FsbCB0byBnZXQKKwljb25zaXN0ZW50IHR5cGUgb3V0cHV0IGZvciBzdHViYmVkIGFuZCB1bnN0dWJiZWQgbWV0aG9kcy4KKworCSogY3AtdmFscHJpbnQuYyAoY3BfcHJpbnRfY2xhc3NfbWV0aG9kKTogIFJlcGxhY2UKKwljcF90eXBlX3ByaW50X21ldGhvZF9hcmdzIHdpdGggY3BsdXNfZGVtYW5nbGUgY2FsbCB0byBnZXQgY29uc2lzdGVudAorCXR5cGUgb3V0cHV0IGZvciBzdHViYmVkIGFuZCB1bnN0dWJiZWQgbWV0aG9kcy4KKworCSogZ2RidHlwZXMuYywgZ2RidHlwZXMuaCAoZ2V0X2Rlc3RydWN0b3JfZm5fZmllbGQpOiAgTmV3IGZ1bmN0aW9uCisJdG8gZmluZCB0aGUgZGVzdHJ1Y3RvciBmaWVsZCBpbmRpY2VzIGZvciBhIHR5cGUuCisKKwkqIGdkYnR5cGVzLmggKHN0cnVjdCB0eXBlKTogIENsYXJpZnkgY29tbWVudHMgZm9yIHZwdHJfYmFzZXR5cGUKKwlhbmQgYXJnX3R5cGVzIGZpZWxkcy4KKwkoc3RydWN0IGZuX2ZpZWxkKTogIFJlbW92ZSBhcmdzIGZpZWxkLCBubyBsb25nZXIgdXNlZC4KKworCSogc3ltdGFiLmMgKGRlY29kZV9saW5lXzEpLCB2YWxvcHMuYyAodmFsdWVfc3RydWN0X2VsdCwKKwljaGVja19maWVsZF9pbik6ICBVc2UgZ2V0X2Rlc3RydWN0b3JfZm5fZmllbGQgdG8gZmluZCB0aGUgZGVzdHJ1Y3RvcgorCWZpZWxkIGluZGljZXMgaW5zdGVhZCBvZiBhc3N1bWluZyB0aGF0IHRoZSBjb21waWxlciBwYXNzZXMgdGhlIG1lbWJlcgorCWZ1bmN0aW9uIGZpZWxkcyBpbiBhIHNwZWNpZmljIG9yZGVyLgorCisJKiBzeW10YWIuYyAoZmluZF9tZXRob2RzKTogIFBhc3MgTlVMTCBpbnN0ZWFkIG9mIFNZTUJPTF9CTE9DS19WQUxVRQorCXRvIGxvb2t1cF9zeW1ib2wuCisJKGxpc3Rfc3ltYm9sKTogIFJlcGxhY2UgY3BfdHlwZV9wcmludF9tZXRob2RfYXJncyB3aXRoIGNwbHVzX2RlbWFuZ2xlCisJY2FsbCBpbiB6YXBwZWQgb3V0IGNvZGUgYW5kIGV4cGxhaW4gd2h5IHRoaXMgY29kZSBpcyB6YXBwZWQgb3V0LgorCitUaHUgRGVjIDEyIDEzOjI5OjE0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3Bvd2VycGMvcHBjeyxsZX0tc2ltLm10IChTSU0pOiBBZGQgdGhlIHNpbXVsYXRvciBjb21tb24KKwlsaWJyYXJ5IC4uL3NpbS9jb21tb24vbGliY29tbW9uLmEuCisKK1dlZCBEZWMgMTEgMTE6MTU6MDggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbW9uaXRvci5jIChtb25pdG9yX2xvYWQpOiBBZGQgc3VwcG9ydCBmb3IgbG9hZCBhZGRyZXNzIGFyZ3VtZW50LgorCSogZHNyZWMuYzogI2luY2x1ZGUgPHRpbWUuaD4uCisJKGxvYWRfc3JlYyk6IE5ldyBhcmd1bWVudCBsb2FkX29mZnNldC4gIFByaW50IGRvd25sb2FkIHN0YXRzLgorCSogc3JlYy5oIChsb2FkX3NyZWMpOiBVcGRhdGUgcHJvdG90eXBlLgorCSogc2gzLXJvbS5jIChzaDNfbG9hZCk6IFVwZGF0ZSBjYWxsIHRvIGxvYWRfc3JlYy4KKworTW9uIERlYyAgOSAxNzozNDowNSAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBjb25maWcvbW4xMDMwMC90bS1tbjEwMzAwLmg6IG1vcmUgc21hbGwgcmVnaXN0ZXIgZml4ZXMKKwkqIG1uMTAzMDAtdGRlcC5jOiBmaWxsZWQgaW4gZnJvbSBhbm90aGVyIHRhcmdldAorCitNb24gRGVjICA5IDE3OjEyOjE5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIG1vbml0b3IuYyAobW9uaXRvcl9pbnNlcnRfYnJlYWtwb2ludCk6IEhhbmRsZSBiaS1lbmRpYW4gbWFjaGluZXMuCisKK01vbiBEZWMgIDkgMTU6NTg6NTEgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBjb25maWcvbWlwcy90bS1taXBzLmg6IEdldCByaWQgb2YgY2FsbC1kdW1teSBjb2RlLgorCU1pbm9yIGNoYW5nZXMgdG8gbWFrZSBwcmUtQU5TSSBjb21waWxlcnMgaGFwcHkuCisJKiBtaXBzLXRkZXAuYzogTWlub3IgY2hhbmdlcyB0byBtYWtlIHByZS1BTlNJIGNvbXBpbGVycyBoYXBweS4KKwkobWlwc19wdXNoX2FyZ3VtZW50cyk6IFJld3JpdGUgdG8gcGFydGlhbGx5IHN1cHBvcnQgRUFCSS4KKwkobWlwc19wY19pbl9jYWxsX2R1bW15KTogTmV3IGZ1bmN0aW9uLgorCSogaW5mY21kLmM6IEluY2x1ZGUgc3ltZmlsZS5oIHRvIGdldCBwcm90b3R5cGUgb2YgZW50cnlfcG9pbnRfYWRkcmVzcywKKwl3aGljaCBmaXhlcyA2NC1iaXQgc2lnbiBleHRlbnNpb24gYnVnIG9uIE1JUFMuCisKK01vbiBEZWMgIDkgMDA6MTQ6NDkgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL21uMTAzMDAvdG0tbW4xMDMwMC5oOiBmaXggcmVnaXN0ZXIgbmFtZXMKKwkqIG1uMTAzMDAtdGRlcC5jOiBuZXcgc2tlbGV0b24gdGRlcCBmb3IgbW4xMDMwMAorCitTdW4gRGVjICA4IDE4OjAyOjU3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zaW0uaDogVXBkYXRlIHNvbWUgY29tbWVudHMuCisJKiByZW1vdGUtc2ltLmMgKGdkYl9vc19lcnJvcik6IE5ldyBmdW5jdGlvbi4KKwkoaW5pdF9jYWxsYmFja3MpOiBGaXggaW5pdGlhbGl6aW5nIG9mIGdkYl9jYWxsYmFjay4gIEFkZCBnZGJfb3NfZXJyb3IuCisJKGdkYl9vc19wcmludGZfZmlsdGVyZWQpOiBVc2UgZ2RiX3N0ZG91dCwgbm90IHN0ZG91dC4KKworU3VuIERlYyAgOCAwMDozNjozMSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGlyaXg1LW5hdC5jIChzdXBwbHlfZ3JlZ3NldCwgZmlsbF9ncmVnc2V0KTogIEhhbmRsZSBncmVnc2V0cworCWZyb20gTzMyIGFuZCBOMzIgQUJJLgorCSh4ZmVyX2xpbmtfbWFwX21lbWJlcik6ICBXb3JrIGFyb3VuZCBwcm9ibGVtIHdpdGggYWxpZ25tZW50cworCWluIHN0cnVjdCBvYmogd2hlbiBjb21waWxpbmcgR0RCIHVuZGVyIE4zMiBBQkkuCisKK1RodSBEZWMgIDUgMjM6MzA6NDQgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBkMTB2LXRkZXAuYzogQWRkIHN1cHBvcnQgZm9yIGV4YW1pbmF0aW9uIGFuZCBpbnRlcnByZXRhdGlvbgorCW9mIGluc3RydWN0aW9uIHRyYWNlIGJ1ZmZlci4KKwkodHJhY2UsIHVudHJhY2UsIGluZm8gdHJhY2UsIHRkaXNhc3NlbWJsZSk6IE5ldyBjb21tYW5kcy4KKworVGh1IERlYyAgNSAxNDowNjoyMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWcvc3BhcmMvdG0tc3BhcmNsZXQuaCAoVEFSR0VUX0JZVEVfT1JERVIpOiBVbmRlZi4KKwkoVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRSk6IERlZmluZS4KKwkoQlJFQUtQT0lOVCk6IFVuZGVmLgorCSh7QklHLExJVFRMRX1fQlJFQUtQT0lOVCk6IERlZmluZS4KKwkoVE1fUFJJTlRfSU5TTl9NQUNIKTogUmVkZWZpbmUgZm9yIHNwYXJjbGV0LgorCitXZWQgRGVjICA0IDE2OjM0OjA1IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9tbjEwMzAwL21uMTAzMDAubXQsIGNvbmZpZy9tbjEwMzAwL3RtLW1uMTAzMDAuaDogTmV3LgorCitUdWUgRGVjICAzIDEzOjAyOjA4IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBuaW5lbW9vbnMuY29tPgorCisJKiBpbmZwdHJhY2UuYyAoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogTW92ZSBzb21lIGNvbW1vbiBjb2RlIG91dAorCXRvIHN0b3JlX3JlZ2lzdGVyLCBsaWtlIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAmIGZldGNoX3JlZ2lzdGVyLgorCShzdG9yZV9yZWdpc3Rlcik6IE5ldyBmdW5jdGlvbiwgZnJvbSBzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMuCisJKGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycywgZmV0Y2hfcmVnaXN0ZXIpOiBNaW5vciBjb2RlIHR3ZWFrcyB0bworCW1ha2Uge2ZldGNoLHN0b3JlfV9pbmZlcmlvcl9yZWdpc3RlcnMgYW5kIHtmZXRjaCxzdG9yZX1fcmVnaXN0ZXIKKwlyb3V0aW5lcyBhcyBzaW1pbGFyIGluIHN0cnVjdHVyZSBhcyBwb3NzaWJsZS4KKwkoZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzLCBzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMpOiBFbGltaW5hdGUKKwlsb2NhbCB2YXJpYWJsZSBudW1yZWdzIGFuZCBqdXN0IHVzZSBBUkNIX05VTV9SRUdTIGRpcmVjdGx5LgorCQorVHVlIERlYyAgMyAxMTozODoxNCAxOTk2ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBibG9ja2ZyYW1lLmM6IGFkZCBtYWNybyBVU0VfR0VORVJJQ19EVU1NWV9GUkFNRVMgdG8gZW5hYmxlL2Rpc2FibGUKKwkgIGNvZGUgZm9yIGdlbmVyaWMgY2FsbF9kdW1teSBmcmFtZXMuCisJKiBjb25maWcvaDgzMDAvdG0taDgzMDAuaDogdHVybiBvbiBVU0VfR0VORVJJQ19EVU1NWV9GUkFNRVMKKwkqIGNvbmZpZy9tMzJyL3RtLW0zMnIuaDogRGl0dG8uCisJKiBjb25maWcvc2gvdG0tc2guaDogRGl0dG8uCisJKiBjb25maWcvdjg1MC90bS12ODUwLmg6IERpdHRvLgorCitTdW4gRGVjICAxIDAwOjQxOjQ3IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogdmF4LXRkZXAuYyAodmF4X3ByaW50X2luc24sIHByaW50X2luc25fYXJnKTogIFVzZSBpbmZvIGZ1bmN0aW9ucworCWZvciBwcmludGluZy4gRnJvbSBWYWxlcml5IFVzaGFrb3YgPHV3ZUBwdGMuc3BidS5ydT4uCisKK1N1biBEZWMgIDEgMDA6NDA6NDYgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworICAgICAgICAqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBuZXcgbW4xMDMwMCBlbnRyeS4KKworU3VuIERlYyAgMSAwMDoxODo1OSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwlBZGQgc3VwcG9ydCBmb3IgSXJpeCA2LjIgbmF0aXZlIE8zMiBhbmQgTjMyIEFCSS4KKworCSogY29uZmlnLmluLCBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZTogIENoZWNrIGZvciA8b2JqbGlzdC5oPi4KKwkqIGNvbmZpZ3VyZS50Z3Q6ICBIYW5kbGUgbWlwcyotc2dpLWlyaXg2KiBsaWtlIGlyaXg1IGZvciBub3cuCisKKwkqIGNwLXZhbHByaW50LmMgKGNwX3ByaW50X3ZhbHVlX2ZpZWxkcyk6ICBVc2UgU1lNQk9MX1ZBTFVFX0FERFJFU1MKKwlpbnN0ZWFkIG9mIFNZTUJPTF9CTE9DS19WQUxVRSB0byBnZXQgdGhlIGFkZHJlc3Mgb2YgYSBzdGF0aWMgbWVtYmVyLgorCisJKiBkd2FyZjJyZWFkLmM6ICBUdXJuIHdhcm5pbmdzIGFuZCByZWNvdmVyYWJsZSBlcnJvcnMgaW50byBjb21wbGFpbnRzLAorCWFkZCBuZXcgY29tcGxhaW50cyB3aGVyZSBhcHByb3ByaWF0ZS4KKwlnY2MgLVdhbGwgY2xlYW51cC4KKwkoc3RydWN0IGxpbmVfaGVhZCk6ICBDaGFuZ2UgbGluZV9iYXNlIGZyb20gY2hhciB0byBpbnQgdG8gYXZvaWQKKwlwcm9ibGVtcyB3aXRoIGNvbXBpbGVycyB3aG9zZSBwbGFpbiBjaGFyIGlzIHJlcHJlc2VudGVkIGJ5IGFuCisJdW5zaWduZWQgY2hhci4KKwkoc3RydWN0IHBhcnRpYWxfZGllX2luZm8pOiAgQWRkIGlzX2RlY2xhcmF0aW9uIGZpZWxkLgorCShkd2FyZjJfdG1wX29ic3RhY2spOiAgTmV3IG9ic3RhY2sgZm9yIGFsbG9jYXRpbmcgdGVtcG9yYXJ5IHN0b3JhZ2UKKwl1c2VkIGR1cmluZyBzeW1ib2wgcmVhZGluZy4KKwkoY3VfaGVhZGVyX29mZnNldCk6ICBOZXcgdmFyaWFibGUgZm9yIHJlc29sdmluZyByZWxhdGl2ZSByZWZlcmVuY2UKKwlkaWVzLgorCShvcHRpbWl6ZWRfb3V0LCBiYXNlcmVnLCBpc2xvY2FsLCBmcmFtZV9iYXNlX3JlZywgZnJhbWVfYmFzZV9vZmZzZXQpOgorCU5ldyBpbnRlcmZhY2UgdmFyaWFibGVzIGZvciBkZWNvZGVfbG9jZGVzYy4KKwkoc3RydWN0IGR3YXJmMl9waW5mbyk6ICBOZXcgc3RydWN0dXJlIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4KKwlwc3ltdGFiIGFuZCBzeW10YWIgcmVhZGluZywgcGFzc2VkIHZpYSBwc3QtPnJlYWRfc3ltdGFiX3ByaXZhdGUuCisJKGR3YXJmMl9oYXNfaW5mbywgZHdhcmYyX2J1aWxkX3BzeW10YWJzKTogIEFjY2VwdCBvYmplY3RzIGZpbGVzCisJd2l0aG91dCBsaW5lIG51bWJlciBzZWN0aW9ucy4KKwkoZHdhcmYyX2J1aWxkX3BzeW10YWJzX2hhcmQpOiAgSW5pdGlhbGl6ZSB0ZW1wb3Jhcnkgb2JzdGFjaworCWZvciBzeW1ib2wgcmVhZGluZy4KKwlBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBwc3QtPnJlYWRfc3ltdGFiX3ByaXZhdGUuCisJUmVsb2NhdGUgcHN0LT50ZXh0bG93IGFuZCBwc3QtPnRleHRoaWdoIHdpdGggYmFzZWFkZHIuCisJKHNjYW5fcGFydGlhbF9zeW1ib2xzKTogIERvIG5vdCBhZGQgRFdfQVRfZGVjbGFyYXRpb24gc3ltYm9scworCXRvIHRoZSBwYXJ0aWFsIHN5bWJvbCB0YWJsZS4KKwlBZGQgZmlsZSBzY29wZSBlbnVtZXJhdG9yIHN5bWJvbHMgdG8gdGhlIHBhcnRpYWwgc3ltYm9sIHRhYmxlLgorCUZpeCB0eXBvIGluIGhpZ2hwYyBjb21wdXRhdGlvbi4KKwlJZiB3ZSBkaWRuJ3QgZmluZCBhIGxvd3BjLCBzZXQgaXQgdG8gaGlnaHBjIHRvIGF2b2lkIGNvbXBsYWludHMKKwlmcm9tIGBtYWludCBjaGVjay4KKwkoYWRkX3BhcnRpYWxfc3ltYm9sKTogIFJlbG9jYXRlIHN5bWJvbCB2YWx1ZXMgd2l0aCBiYXNlYWRkci4KKwlBZGQgc3RhdGljIERXX1RBR19zdWJwcm9ncmFtIGFuZCBEV19UQUdfdmFyaWFibGUgc3ltYm9scyB0byB0aGUKKwltaW5pbWFsIHN5bWJvbCB0YWJsZS4KKyAgICAgICAgT2J0YWluIHN5bWJvbCB2YWx1ZXMgZm9yIERXX1RBR192YXJpYWJsZSBzeW1ib2xzIGZyb20gdGhlIGxvY2F0aW9uCisJZGVzY3JpcHRvciwgc2tpcCBzeW1ib2xzIHdpdGggbWlzc2luZyBsb2NhdGlvbiBkZXNjaXB0b3JzLgorCVNraXAgc3ltYm9scyBmb3IgYWdncmVnYXRlIHR5cGVzIHdpdGhvdXQgY2hpbGRyZW4uCisJSGFuZGxlIGVudW1lcmF0b3Igc3ltYm9scy4KKwkoZHdhcmYyX3BzeW10YWJfdG9fc3ltdGFiKTogIElzc3VlIHN5bWJvbCByZWFkaW5nIG1lc3NhZ2UgaWYgdmVyYm9zZS4KKwkocHN5bXRhYl90b19zeW10YWJfMSk6ICBTZXQgbG9jYWwgdmFyaWFibGVzIGZyb20KKwlwc3QtPnJlYWRfc3ltdGFiX3ByaXZhdGUsIHNldCBjdV9oZWFkZXJfb2Zmc2V0IGFuZCBiYXNlYWRkci4KKwlJbml0aWFsaXplIHRlbXBvcmFyeSBvYnN0YWNrIGZvciBzeW1ib2wgcmVhZGluZywgaW5pdGlhbGl6ZQorCWJ1aWxkc3ltIGFuZCBhZGQgYSBjbGVhbnVwIHRvIHJlYWxseV9mcmVlX3BlbmRpbmdzLgorCVJlbG9jYXRlIGhpZ2hwYyB3aXRoIGJhc2VhZGRyIHdoZW4gY2FsbGluZyBlbmRfc3ltdGFiLgorCUlmIHRoZSBjb21waWxhdGlvbiBpcyBmcm9tIGEgQyBmaWxlIGdlbmVyYXRlZCBieSBsYW5ndWFnZQorCXByZXByb2Nlc3NvcnMsIGRvIG5vdCBzZXQgdGhlIHN5bXRhYiBsYW5ndWFnZSBpZiBpdCB3YXMgYWxyZWFkeQorCWRlZHVjZWQgYnkgc3RhcnRfc3ViZmlsZS4KKwlSZW1vdmVkIHZlcmJvc2Ugc29ydGluZyBzeW1ib2wgdGFibGUgbWVzc2FnZS4KKwkocHJvY2Vzc19kaWUpOiAgSGFuZGxlIERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGUgYW5kCisJRFdfVEFHX3JlZmVyZW5jZV90eXBlLgorCVVzZSByZWFkX3N1YnJvdXRpbmVfdHlwZSB0byBnZXQgdGhlIGZ1bmN0aW9uIHR5cGUgZm9yCisJRFdfVEFHX3N1YnByb2dyYW0gYmVmb3JlIGNhbGxpbmcgcmVhZF9mdW5jX3Njb3BlLgorCShyZWFkX2ZpbGVfc2NvcGUpOiAgSW5pdGlhbGl6ZSBmaWxlIG5hbWUgdG8gPHVua25vd24+LCBzdGFydF9zdWJmaWxlCisJZXhwZWN0cyBhIG5vbi1OVUxMIG5hbWUuCisJSWYgd2UgZGlkbid0IGZpbmQgYSBsb3dwYywgc2V0IGl0IHRvIGhpZ2hwYyB0byBhdm9pZCBjb21wbGFpbnRzCisJZnJvbSBmaW5pc2hfc3ltYm9sLgorCVJlbG9jYXRlIGxvd3BjIGFuZCBoaWdocGMgd2l0aCBiYXNlYWRkci4KKwlHZXQgcmlkIG9mIElyaXg2LjIgbmF0aXZlIGNjIGNvbXBpbGUgbWFjaGluZSBwcmVmaXggaW4gY29tcF9kaXIuCisJWmVybyBvdXQgZnR5cGVzIGZvciBlYWNoIG5ldyBjb21waWxhdGlvbiB1bml0IChtYXkgYmUgZGlmZmVyZW50CisJbGFuZ3VhZ2Ugb3IgZGlmZmVyZW50IG9iamZpbGUpLgorCUFjY2VwdCBjb21waWxhdGlvbiB1bml0cyB3aXRob3V0IGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLCBwYXNzCisJY29tcF9kaXIgdG8gZGVjb2RlX2xpbmVzLgorCShyZWFkX2Z1bmNfc2NvcGUpOiAgSW5pdGlhbGl6ZSBmdW5jdGlvbiBuYW1lIHRvIDx1bmtub3duPiB0byBhdm9pZAorCWNvcmUgZHVtcHMgd2hlbiBEV19BVF9uYW1lIGlzIG1pc3NpbmcuCisJUmVsb2NhdGUgbG93cGMgYW5kIGhpZ2hwYyB3aXRoIGJhc2VhZGRyLgorCUhhbmRsZSBEV19BVF9mcmFtZV9iYXNlLCBrZWVwIHJlc3VsdCBmb3IgRFdfT1BfZmJyZWcgb3BlcmF0aW9ucy4KKwlQYXNzIGZ1bmN0aW9uIHR5cGUgdG8gbmV3X3N5bWJvbC4KKwkocmVhZF9sZXhpY2FsX2Jsb2NrX3Njb3BlKTogIFJlbG9jYXRlIGxvd3BjIGFuZCBoaWdocGMgd2l0aCBiYXNlYWRkci4KKwkocmVhZF9zdHJ1Y3R1cmVfc2NvcGUpOiAgU2V0IFRZUEVfVEFHX05BTUUsIG5vdCBUWVBFX05BTUUuCisJSGFuZGxlIERXX1RBR19jbGFzc190eXBlLgorCUNvcHkgZmllbGRzIHRvIHR5cGVfb2JzdGFjaywgcmVsZWFzZSB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgZmllbGRzLgorCURvbid0IGFkZCBzeW1ib2wgaWYgZGllIGlzIGEgc3R1YiBkaWUgYW5kIGhhcyBubyBjaGlsZHJlbi4KKwlIYW5kbGUgQysrIHN0YXRpYyBtZW1iZXIgZmllbGRzLgorCShyZWFkX2VudW1lcmF0aW9uKTogIFNldCBUWVBFX1RBR19OQU1FLCBub3QgVFlQRV9OQU1FLgorCUNvcHkgZmllbGRzIHRvIHR5cGVfb2JzdGFjaywgcmVsZWFzZSB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgZmllbGRzLgorCUxldCBuZXdfc3ltYm9sIGhhbmRsZSB0aGUgc3ltYm9sIGNyZWF0aW9uIGZvciBlbnVtZXJhdG9ycworCWluc3RlYWQgb2YgaGFuZGNyYWZ0aW5nIGEgc3ltYm9sLgorCURldGVybWluZSBzaWduZWRuZXNzIG9mIGVudW0gdHlwZSBmcm9tIGVudW1lcmF0b3JzLgorCShkd2FyZl9yZWFkX2FycmF5X3R5cGUpOiAgSGFuZGxlIHZhcmlhYmxlIGxlbmd0aCBhcnJheXMuCisJVXNlIGxvb2t1cF9wb2ludGVyX3R5cGUgaW5zdGVhZCBvZiBoYW5kY3JhZnRpbmcgYSB0eXBlLgorCUNyZWF0ZSBhcnJheSB0eXBlIG9ubHkgaWYgYSBEV19UQUdfc3VicmFuZ2VfdHlwZSB3YXMgZm91bmQuCisJKHJlYWRfdGFnX3BvaW50ZXJfdHlwZSwgcmVhZF90YWdfcmVmZXJlbmNlX3R5cGUpOgorCVVzZSBsb29rdXBfcG9pbnRlcl90eXBlIGFuZCBsb29rdXBfcmVmZXJlbmNlX3R5cGUgaW5zdGVhZAorCW9mIGhhbmRjcmFmdGluZyBhIHR5cGUuCisJKHJlYWRfdGFnX3B0cl90b19tZW1iZXJfdHlwZSk6ICBOZXcgZnVuY3Rpb24gdG8gaGFuZGxlIAorCURXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGUuCisJKHJlYWRfc3Vicm91dGluZV90eXBlKTogIEhhbmRsZSBwYXJhbWV0ZXIgZGllcy4KKwlVc2UgbG9va3VwX2Z1bmN0aW9uX3R5cGUgaW5zdGVhZCBvZiBoYW5kY3JhZnRpbmcgYSB0eXBlLgorCShyZWFkX3R5cGVkZWYpOiAgQWxsb2NhdGUgYSBUWVBFX0NPREVfVFlQRURFRiB0eXBlIGZvciB0aGUgdHlwZWRlZi4KKwkocmVhZF9iYXNlX3R5cGUpOiAgSWYgdGhlIHR5cGUgaGFzIGEgbmFtZSwgdXNlIGluaXRfdHlwZSB0byBjcmVhdGUKKwlhIG5ldyB0eXBlIGluc3RlYWQgb2Ygc2Vjb25kIGd1ZXNzaW5nIGEgZnVuZGFtZW50YWwgdHlwZS4KKwkocmVhZF9jb21wX3VuaXQpOiAgUmVzZXQgZGllIHJlZmVyZW5jZSB0YWJsZSBiZWZvcmUgYnVpbGRpbmcKKwlhIG5ldyBvbmUuCisJKGR3YXJmMl9yZWFkX3NlY3Rpb24pOiAgUmVhZCBzZWN0aW9uIGNvbnRlbnRzIGludG8gcHN5bWJvbF9vYnN0YWNrLgorCShkd2FyZjJfcmVhZF9hYmJyZXZzKTogIEhhbmRsZSB1bnRlcm1pbmF0ZWQgYWJicmV2aWF0aW9ucworCWZvciBhIGNvbXBpbGUgdW5pdCBncmFjZWZ1bGx5LgorCShyZWFkX3BhcnRpYWxfZGllKTogIFplcm8gcGFydGlhbCBkaWUgYmVmb3JlIHJlYWRpbmcgaXRzIGluZm8uCisJSGFuZGxlIERXX0FUX2RlY2xhcmF0aW9uLgorCUZpeCB0eXBvIGluIGhhbmRsaW5nIG9mIERXX0ZPUk1fYmxvY2s0LgorCShyZWFkX2Z1bGxfZGllKTogIEZpeCB0eXBvIGluIGhhbmRsaW5nIG9mIERXX0ZPUk1fYmxvY2s0LgorCShyZWFkXzFfc2lnbmVkX2J5dGUsIHJlYWRfMl9zaWduZWRfYnl0ZXMsIHJlYWRfNF9zaWduZWRfYnl0ZXMpOgorCU5ldyByb3V0aW5lcyB0byBnZXQgc2lnbmVkIHZhbHVlcyBmcm9tIGEgYnVmZmVyLgorCShyZWFkX25fYnl0ZXMsIHJlYWRfc3RyaW5nKTogIEFsbG9jYXRlIHN0b3JhZ2UgZnJvbSB0aGUgdGVtcG9yYXJ5CisJb2JzdGFjay4gSWYgdGhlIGhvc3QgY2hhciBzaXplIHBlcm1pdHMgaXQsIHJldHVybiBwb2ludGVyCisJdG8gYnVmZmVyIGluc3RlYWQgb2YgYWxsb2NhdGluZyBzdG9yYWdlLgorCShzZXRfY3VfbGFuZ3VhZ2UpOiAgSGFuZGxlIERXX0xBTkdfTWlwc19Bc3NlbWJsZXIuCisJKGR3YXJmX2F0dHIpOiAgUmV0dXJuIE5VTEwgaWYgcmVmZXJlbmNlIGRpZSBmb3IgRFdfQVRfc3BlY2lmaWNhdGlvbgorCW9yIERXX0FUX2Fic3RyYWN0X29yaWdpbiBkaWUgaXMgbm90IGZvdW5kLgorCShyZWNvcmRfbWluaW1hbF9zeW1ib2wpOiAgUmVtb3ZlZCwgcmVwbGFjZWQgd2l0aCBhIGRpcmVjdCBjYWxsIHRvCisJcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2wsIGl0IG5vdyBoYW5kbGVzIHNhdmluZyB0aGUgc3RyaW5nIGl0c2VsZi4KKwkoY29udmVydF9sb2NkZXNjKTogIFJlbW92ZWQsIHBhcnRpYWwgc3ltdGFiIHJlYWRpbmcgbm93IHVzZXMKKwlkZWNvZGVfbG9jZGVzYy4KKwkoZHdhcmZfYXR0cik6ICBVc2UgZHdhcmYyX2dldF9yZWZfZGllX29mZnNldCB0byBnZXQgdGhlIGFic29sdXRlCisJb2Zmc2V0IGZvciB0aGUgZGllIHJlZmVyZW5jZS4KKwkoZHdhcmZfZGVjb2RlX2xpbmVzKTogIENvbXBsYWluIGlmIHRoZSBsaW5lIHNlY3Rpb24gaW5mbyBpcyBtaXNzaW5nLgorCVVzZSByZWFkXzFfc2lnbmVkX2J5dGUgdG8gZXh0cmFjdCBsaC5saW5lX2Jhc2UgdG8gYXZvaWQKKyAgICAgICAgcHJvYmxlbXMgd2l0aCBjb21waWxlcnMgd2hvc2UgcGxhaW4gY2hhciBpcyByZXByZXNlbnRlZCBieSBhbgorICAgICAgICB1bnNpZ25lZCBjaGFyLgorCUFkZCBjbGVhbnVwcyBmb3IgYWxsb2NhdGVkIHRlbXBvcmFyeSBzdG9yYWdlLgorCVN0YXJ0IGEgc3ViZmlsZSBmb3IgdGhlIGZpcnN0IGZpbGUgaW4gdGhlIHN0YXRlIG1hY2hpbmUuCisJRml4IG9mZiBieSBvbmUgcHJvYmxlbSB3aXRoIGRpcnMuZGlycyBhY2Nlc3MuCisJVXNlIGNvbXBfZGlyIHdoZW4gZGlyZWN0b3J5IGluZGV4IGlzIDAuCisJU3VwcG9ydCBtdWx0aXBsZSBzZXF1ZW5jZXMgKGZyb20gSmFzb24gTWVycmlsbCA8amFzb25AY3lnbnVzLmNvbT4pLgorCShkd2FyZjJfc3RhcnRfc3ViZmlsZSk6ICBUcnkgdG8ga2VlcCBsaW5lIG51bWJlcnMgZnJvbSBpZGVudGljYWwKKwlhYnNvbHV0ZSBhbmQgcmVsYXRpdmUgZmlsZSBuYW1lcyBpbiBhIGNvbW1vbiBzdWJmaWxlLgorCShuZXdfc3ltYm9sKTogIEFsbG9jYXRlIHN5bWJvbCBhbmQgc3ltYm9sIG5hbWUgb24gdGhlIHN5bWJvbF9vYnN0YWNrLgorCVNldCBTWU1CT0xfTElORSBmcm9tIERXX0FUX2RlY2xfbGluZSBpZiBwcmVzZW50LgorCVNldCBTWU1CT0xfVFlQRSBmcm9tIHBhc3NlZCB0eXBlIGlmIG5vdCBOVUxMLgorCUNoYW5nZSBEV19UQUdfdmFyaWFibGUgc3ltYm9sIHR5cGVzIHdpdGggbWlzc2luZyB0eXBlIGVudHJpZXMKKwl0byBhIHNlbnNpYmxlIHR5cGUuCisJSGFuZGxlIG9wdGltaXplZF9vdXQsIG9mZnJlZyBhbmQgaXNsb2NhbCBzdG9yYWdlIGNsYXNzZXMuCisJQWRkIGV4dGVybmFsIHN5bWJvbHMgd2l0aCB0eXBlIGluZm9ybWF0aW9uIHdob3NlIGFkZHJlc3MgaXNuJ3QKKwlrbm93biBhcyBMT0NfVU5SRVNPTFZFRCBzeW1ib2xzLgorCVN5bnRoZXNpemUgdHlwZWRlZnMgZm9yIEMrKyBjbGFzc2VzLCBzdHJ1Y3RzLCB1bmlvbnMgYW5kIGVudW1lcmF0aW9ucy4KKwlIYW5kbGUgRFdfVEFHX2VudW1lcmF0b3Igc3ltYm9scywgY29tcGxhaW4gZm9yIHVucmVjb2duaXplZAorCXN5bWJvbCB0YWdzLgorCShkaWVfdHlwZSk6ICBBIG1pc3NpbmcgRFdfQVRfdHlwZSByZXByZXNlbnRzIGEgdm9pZCB0eXBlLgorCVVzZSBkd2FyZjJfZ2V0X3JlZl9kaWVfb2Zmc2V0IHRvIGdldCB0aGUgYWJzb2x1dGUgb2Zmc2V0IGZvcgorCXRoZSBkaWUgcmVmZXJlbmNlLgorCShkaWVfY29udGFpbmluZ190eXBlKTogIE5ldyBmdW5jdGlvbiB0byBidWlsZCB0eXBlIGZyb20KKwlEV19BVF9jb250YWluaW5nX3R5cGUgYXR0cmlidXQuCisJKHJlYWRfdHlwZV9kaWUpOiAgSGFuZGxlIERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGUuCisJVHJlYXQgRFdfVEFHX3N1YnByb2dyYW0gbGlrZSBEV19UQUdfc3Vicm91dGluZV90eXBlLgorCShkd2FyZl9iYXNlX3R5cGUpOiAgRml4IHR5cG8gd2l0aCBjcmVhdGlvbiBvZiBGVF9VTlNJR05FRF9TSE9SVAorCWZ1bmRhbWVudGFsIHR5cGUuCisJKGNyZWF0ZV9uYW1lKTogIFJlbW92ZWQsIHN5bWJvbCBuYW1lIGFsbG9jYXRpb24gaXMgbm93IGRvbmUKKwlpbiBuZXdfc3ltYm9sLgorCShkdW1wX2RpZSk6ICBVc2UgcHJpbnRfYWRkcmVzc19udW1lcmljIHRvIHByaW50IGEgQ09SRV9BRERSLgorCShkd2FyZjJfZW1wdHlfZGllX3JlZl90YWJsZSk6ICBOZXcgZnVuY3Rpb24gdG8gY2xlYXIgdGhlIGRpZQorCXJlZmVyZW5jZSB0YWJsZS4KKwkoZHdhcmYyX2dldF9yZWZfZGllX29mZnNldCk6ICBOZXcgZnVuY3Rpb24gdG8gZ2V0IHRoZSBhYnNvbHV0ZQorCWRpZSBvZmZzZXQgZnJvbSBhIGRpZSByZWZlcmVuY2UgYXR0cmlidXRlLgorCShkZWNvZGVfbG9jZGVzYyk6ICBDb21wbGV0ZSByZXdyaXRlIHVzaW5nIGEgc3RhY2ssIGNvZGUgbW9zdGx5CisJYm9ycm93ZWQgZnJvbSBkd2FyZnJlYWQuYzpsb2N2YWwuCisJKGR3YXJmX2FsbG9jX3R5cGUpOiAgUmVtb3ZlZCwgcmVwbGFjZWQgYnkgZGlyZWN0IGNhbGxzIHRvIGFsbG9jX3R5cGUuCisJKGR3YXJmX2FsbG9jX2Jsb2NrKTogIEFsbG9jYXRlIGJsb2NrIG9uIHRlbXBvcmFyeSBvYnN0YWNrLgorCisJKiBlbGZyZWFkLmMgKGVsZl9zeW10YWJfcmVhZCk6ICBXaGVuIGhhbmRsaW5nIElyaXggZHluYW1pYyBzeW1ib2xzLAorCXNraXAgc2VjdGlvbiBuYW1lIHN5bWJvbHMgYW5kIHJlbG9jYXRlIGFsbCBvdGhlcnMuCisJKGVsZl9zeW1maWxlX3JlYWQpOiAgQnVpbGQgZHdhcmYyIHBzeW10YWIgZXZlbiBpZiBvZmZzZXQgaXMgbm9uLXplcm8uCisKKwkqIGlyaXg1LW5hdC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6ICBIYW5kbGUgY29yZV9yZWdfc2VjdAorCWZyb20gTjMyIGV4ZWN1dGFibGVzLiBDYWxsIHJlZ2lzdGVyc19mZXRjaGVkIGFmdGVyIGV4dHJhY3RpbmcKKwl0aGUgcmVnaXN0ZXJzLgorCShvYmpfbGlzdF92YXJpYW50LCBzdHJ1Y3QgbGlua19tYXAsIExNX09GRlNFVCwgTE1fQUREUik6ICBOZXcKKwlkZWZpbml0aW9ucyB0byBlbmFibGUgc3VwcG9ydCBvZiBPMzIgYW5kIE4zMiBmb3JtYXQgb2JqbGlzdHMuCisJKHN0cnVjdCBzb19saXN0KTogIE5ldyBtZW1iZXJzIG9mZnNldCwgc29fbmFtZSBhbmQgbG1zdGFydCB0bworCWVsaW1pbmF0ZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgb2JqbGlzdCBmb3JtYXQgdXNlZC4KKwkoc29saWJfbWFwX3NlY3Rpb25zLCBzeW1ib2xfYWRkX3N0dWIsIHNvbGliX2FkZCwKKwlpbmZvX3NoYXJlZGxpYnJhcnlfY29tbWFuZCwgc29saWJfYWRkcmVzcywgY2xlYXJfc29saWIpOiAgVXNlCisJc29fbmFtZSBhbmQgTE1fT0ZGU0VULgorCShmaXJzdF9saW5rX21hcF9tZW1iZXIpOiAgUmV3cml0ZSB0byBlbmFibGUgc3VwcG9ydCBvZiBPMzIgYW5kIE4zMgorCWZvcm1hdCBvYmpsaXN0cy4KKwkobmV4dF9saW5rX21hcF9tZW1iZXIsIHhmZXJfbGlua19tYXBfbWVtYmVyKTogIE5ldyBmdW5jdGlvbnMgdG8KKwlzdXBwb3J0IE8zMiBhbmQgTjMyIGZvcm1hdCBvYmpsaXN0cy4KKwkoZmluZF9zb2xpYik6ICBVc2UgZmlyc3RfbGlua19tYXBfbWVtYmVyLCBuZXh0X2xpbmtfbWFwX21lbWJlciBhbmQKKwl4ZmVyX2xpbmtfbWFwX21lbWJlci4KKwkoc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiAgVXNlIFRBUkdFVF9TSUdOQUxfKiBpbnN0ZWFkIG9mCisJaG9zdCBzaWduYWwgbnVtYmVycy4KKworCSogbWRlYnVncmVhZC5jIChwYXJzZV9wYXJ0aWFsX3N5bWJvbHMsIGhhbmRsZV9wc3ltYm9sX2VudW1lcmF0b3JzKToKKwlQYXNzIENPUkVfQUREUiB2YXJpYW50IHRvIGFkZF9wc3ltYm9sX3RvX2xpc3QuCisKKwkqIG1pcHMtdGRlcC5jIChoZXVyaXN0aWNfcHJvY19kZXNjKTogIFN0b3AgZXhhbWluaW5nIHRoZSBwcm9sb2d1ZQorCWlmIHdlIGVuY291bnRlciBhIHBvc2l0aXZlIHN0YWNrIGFkanVzdG1lbnQuIEhhbmRsZSBgbW92ZSAkMzAsJHNwJy4KKwlIYW5kbGUgYHNkIHJlZyxvZmZzZXQoJHNwKScgZm9yIDMyIGJpdCBBQklzLgorCisJKiBzeW1taXNjLmMgKGR1bXBfbXN5bWJvbHMsIHByaW50X3BhcnRpYWxfc3ltYm9scyk6ICBVc2UKKwlwcmludF9hZGRyZXNzX251bWVyaWMgdG8gcHJpbnQgYSBTWU1CT0xfVkFMVUVfQUREUkVTUy4KKwkoZHVtcF9zeW10YWIpOiAgUHJpbnQgY29tcGlsYXRpb24gZGlyZWN0b3J5IGlmIGl0IGlzIG5vdCBOVUxMLgorCisJKiB2YWxvcHMuYyAoc2VhcmNoX3N0cnVjdF9maWVsZCwgdmFsdWVfc3RydWN0X2VsdF9mb3JfcmVmZXJlbmNlKToKKwlVc2UgU1lNQk9MX1ZBTFVFX0FERFJFU1MgaW5zdGVhZCBvZiBTWU1CT0xfQkxPQ0tfVkFMVUUgdG8gZ2V0IHRoZQorCWFkZHJlc3Mgb2YgYSBzdGF0aWMgbWVtYmVyLgorCitUaHUgTm92IDI4IDAwOjQ2OjI0IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogdmF4LXRkZXAuYyAodmF4X3ByaW50X2luc24pOiAgTWFkZSBzdGF0aWMsIG1vZGlmaWVkIHRvIHRha2UKKwlkaXNhc3NlbWJsZV9pbmZvIGFzIHBhcmFtZXRlci4KKwkoX2luaXRpYWxpemVfdmF4X3RkZXApOiAgTmV3IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdG1fcHJpbnRfaW5zbgorCXRvIHZheF9wcmludF9pbnNuLgorCitXZWQgTm92IDI3IDExOjI5OjA2IDE5OTYgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIGJsb2NrZnJhbWUuYzogUmVtb3ZlIG9sZC1zdHlsZSBDQUxMX0RVTU1ZIGNvZGUuCisJKiBoODMwMC10ZGVwLmMsIGNvbmZpZy9oODMwMC90bS1oODMwMC5oOiBEaXR0by4KKwkqIG0zMnItdGRlcC5jLCBjb25maWcvbTMyci90bS1tMzJyLmg6IERpdHRvLgorCSogc2gtdGRlcC5jLCBjb25maWcvc2gvdG0tc2guaDogRGl0dG8uCisJKiB2ODUwLXRkZXAuYywgY29uZmlnL3Y4NTAvdG0tdjg1MC5oOiBEaXR0by4KKwkKK1dlZCBOb3YgMjcgMTA6MzI6MTQgMTk5NiAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogYnJlYWtwb2ludC5jOiBERUxFVEUgY29tbWFuZCB3aWxsIG5vdCBkZWxldGUgQ0FMTF9EVU1NWSBicmVha3BvaW50LgorCSogYmxvY2tmcmFtZS5jOiBBZGQgdGFyZ2V0LWluZGVwZW5kYW50IHN1cHBvcnQgZm9yIG1hbmFnaW5nCisJCQlDQUxMX0RVTU1ZIGZyYW1lcyBvbiB0aGUgaG9zdCBzaWRlLgorCSogZnJhbWUuaDogICAgICBEZWNsYXJhdGlvbnMgZm9yIGdlbmVyaWMgQ0FMTF9EVU1NWSBmcmFtZSBzdXBwb3J0LgorCSogaDgzMDAtdGRlcC5jOiBBZGQgdGFyZ2V0IGZ1bmN0aW9uIGNhbGxzIHVzaW5nIGdlbmVyaWMgZnJhbWUgc3VwcG9ydC4KKwkqIGNvbmZpZy9oODMwMC90bS1oODMwMC5oOiBjb25maWcgZm9yIGdlbmVyaWMgdGFyZ2V0IGZ1bmN0aW9uIGNhbGxzLgorCSogbTMyci10ZGVwLmM6ICBBZGQgdGFyZ2V0IGZ1bmN0aW9uIGNhbGxzIHVzaW5nIGdlbmVyaWMgZnJhbWUgc3VwcG9ydC4KKwkqIGNvbmZpZy9tMzJyL3RtLW0zMnIuaDogICBjb25maWcgZm9yIGdlbmVyaWMgdGFyZ2V0IGZ1bmN0aW9uIGNhbGxzLgorCSogc2gtdGRlcC5jOiAgICBBZGQgdGFyZ2V0IGZ1bmN0aW9uIGNhbGxzIHVzaW5nIGdlbmVyaWMgZnJhbWUgc3VwcG9ydC4KKwkqIGNvbmZpZy9zaC90bS1zaC5oOiAgICAgICBjb25maWcgZm9yIGdlbmVyaWMgdGFyZ2V0IGZ1bmN0aW9uIGNhbGxzLgorCSogdjg1MC10ZGVwLmM6ICBBZGQgdGFyZ2V0IGZ1bmN0aW9uIGNhbGxzIHVzaW5nIGdlbmVyaWMgZnJhbWUgc3VwcG9ydC4KKwkqIGNvbmZpZy92ODUwL3RtLXY4NTAuaDogICBjb25maWcgZm9yIGdlbmVyaWMgdGFyZ2V0IGZ1bmN0aW9uIGNhbGxzLgorCSogdmFsb3BzLmM6ICAgICBBREQgUFVTSF9SRVRVUk5fQUREUkVTUyBzbyB0aGF0IGl0IGRvZXNuJ3QgaGF2ZSB0byBiZQorCQkJZG9uZSBieSBQVVNIX0FSR1VNRU5UUyB3aGVuIHRoZXJlJ3Mgbm8gQ0FMTF9EVU1NWS4KKworVHVlIE5vdiAyNiAxOToyMTozNSAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaCAoQUREUl9CSVRTX1JFTU9WRSwgVEFSR0VUX1JFQURfU1ApOiBEZWZpbmUuCisJKG1pcHNfYWRkcl9iaXRzX3JlbW92ZSk6IERlY2xhcmUuCisJKiBtaXBzLXRkZXAuYyAobWlwc19wdXNoX2R1bW15X2ZyYW1lKTogRml4IGhldXJpc3RpYy1mZW5jZS1wb3N0CisJZXJyb3JzIHdoZW4gaGl0dGluZyBicmVha3BvaW50cyBkdXJpbmcgaW5mZXJpb3IgZnVuY3Rpb24gY2FsbHMKKwlpbiA2NC1iaXQgcHJvZ3JhbXMuCisJKGZpeF9zaWduX2V4dGVuc2lvbik6IE1ha2UgcHVibGljLCByZW5hbWUgdG8gbWlwc19hZGRyX2JpdHNfcmVtb3ZlLgorCSogdXRpbHMuYyAocGFkZHJfbnosIHByZWdfbnopOiBOZXcgZnVuY3Rpb25zLCBzaW1pbGFyIHRvIAorCXBhZGRyIGFuZCBwcmVnIGJ1dCBkb24ndCBwcmludCBsZWFkaW5nIHplcm9lcy4KKwkqIGRlZnMuaCAocGFkZHJfbnosIHByZWdfbnopOiBEZWNsYXJlLgorCSogcmVtb3RlLW1pcHMuYzogVXNlIHBhZGRyX256IGluc3RlYWQgb2YgcGFkZHIgdGhyb3VnaG91dAorCXRvIHJlZHVjZSBwYWNrZXQgc2l6ZS4KKwkocG1vbl9lbmRfZG93bmxvYWQpOiBJbXByb3ZlIHRpbWVvdXQgZXJyb3IgaGFuZGxpbmcuCisKK1R1ZSBOb3YgMjYgMTc6MjE6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLgorCitNb24gTm92IDI1IDEzOjE3OjE2IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBuaW5lbW9vbnMuY29tPgorCisJRnJvbTogUGF1bCBFZ2dlcnQgPGVnZ2VydEB0d2luc3VuLmNvbT4KKwkqIHJlbW90ZS1idWcuYyAod2FpdF9zdHJpbmdzKTogQXZvaWQgY3JlYXRpbmcgYSB0cmlncmFwaC4KKworRnJpIE5vdiAyMiAxNTo1NToyMiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogdmFsb3BzLmMgKHZhbHVlX2F0LCB2YWx1ZV9mZXRjaF9sYXp5KTogUHV0IGluIEQxMFYgY2FsbCAKKwl0byBmaXggdXAgYWRkcmVzcyBwb2ludGVycy4KKwkqIHZhbHVlcy5jICh2YWx1ZV9mcm9tX2xvbmdlc3QpOiBSZW1vdmVkIHByZXZpb3VzIGQxMHYgY2hhbmdlcy4KKwkqIGNvbmZpZy9kMTB2L3RtLWQxMHYuaCAoVEFSR0VUX1BUUl9CSVQpOiBDaGFuZ2UgdG8gNCBieXRlcy4KKwkKK0ZyaSBOb3YgMjIgMTA6MDY6MTkgMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb25maWcvaTM4Ni9ubS1pMzg2djQuaCAoTE9TSU5HX1BPTEwpOiAgRGVmaW5lLCBuZWVkZWQgZm9yCisJVW5peHdhcmUgMS4xLjIuCisKK1RodSBOb3YgMjEgMTk6MTM6NTggMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBtaXBzLXRkZXAuYzogUmVwbGFjZSBoYXJkLWNvZGVkIGNvbnN0YW50cyB3aXRoIE1JUFNfSU5TVExFTi4KKwkoY29tbW9uX2JyZWFrcG9pbnQpOiBVc2UgcGFkZHIgaW5zdGVhZCBvZiAleCB0byBwcmludCA2NC1iaXQgdmFsdWVzLgorCShoZXVyaXN0aWNfcHJvY19kZXNjKTogQWRkIHRlc3RzIGZvciA2NC1iaXQgaW5zdHJ1Y3Rpb25zLgorCShpbml0X2V4dHJhX2ZyYW1lX2luZm8sIG1pcHNfcHVzaF9hcmd1bWVudHMpOiBSZWNvZ25pemUgYWRkaXRpb25hbAorCXJlZ2lzdGVycyBmb3IgRUFCSS4KKwkqIHJlbW90ZS1taXBzLmM6IEV4dGVuZCBEREIgdGFyZ2V0IHRvIGFsbG93IFRGVFAgZG93bmxvYWRzLgorCSogY29uZmlnL21pcHMvdG0tbWlwcy5oIChNSVBTX0xBU1RfQVJHX1JFR05VTSwgTUlQU19OVU1fQVJHX1JFR1MpOgorCURlZmluZS4KKworV2VkIE5vdiAyMCAxOTowOToxNiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogaW5mY21kLmMgKGRvX3JlZ2lzdGVyc19pbmZvKTogQ2FsbCB2YWxfcHJpbnQgd2l0aCB0aGUKKwl2aXJ0dWFsIGJ1ZiBpbnN0ZWFkIG9mIHRoZSByYXcgYnVmLiAgTmVlZGVkIGZvciBSRUdJU1RFUl9DT05WRVJUIAorCXRvIHdvcmsgd2l0aCBub24tZmxvYXRpbmcgcG9pbnQgcmVncy4KKworCSogZDEwdi10ZGVwLmMgKGQxMHZfc2tpcF9wcm9sb2d1ZSk6IElmIHdlIGhhdmUgbGluZSBkZWJ1Z2dpbmcgCisJaW5mb3JtYXRpb24sIHRoZW4gdGhlIGVuZCBvZiB0aGUgcHJvbG9ndWUgc2hvdWxkIHRoZSBmaXJzdCAKKwlhc3NlbWJseSBpbnN0cnVjdGlvbiBvZiB0aGUgZmlyc3Qgc291cmNlIGxpbmUuCisJCisJKiB2YWx1ZXMuYyAodmFsdWVfZnJvbV9sb25nZXN0KTogUHV0IGluIEQxMFYgY2FsbCB0byAKKwlmaXggdXAgYWRkcmVzcyBwb2ludGVycy4KKworCSogY29uZmlnL2QxMHYvdG0tZDEwdi5oIChSRUdJU1RFUl9WSVJUVUFMX1NJWkUpOiBNb2RpZmllZC4KKwkoUkVHSVNURVJfVklSVFVBTF9UWVBFKTogTW9kaWZpZWQgZm9yIFBDX1JFR05VTSBhbmQgU1BfUkVHTlVNLgorCShSRUdJU1RFUl9DT05WRVJUSUJMRSk6IE1ha2UgUEMgYW5kIFNQIGNvbnZlcnRpYmxlLgorCShSRUdJU1RFUl9DT05WRVJUX1RPX1ZJUlRVQUwpOiBEZWZpbmUuCisJKFJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXKTogRGVmaW5lLgorCShEMTBWX01BS0VfREFERFIpOiBEZWZpbmUuCisJKEQxMFZfTUFLRV9JQUREUik6IERlZmluZS4KKworV2VkIE5vdiAyMCAxNjoxNToxNSAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlnL2kzODYvY3lnd2luMzIubWg6IGFkZCBNTUFMTE9DX0NGTEFHUyA9IC1JJChNTUFMTE9DX1NSQykKKyAgICAgICAgLURNTUNIRUNLX0ZPUkNFPTEgc28gbWVtb3J5IGNoZWNrcyBhcmUgbG9hZGVkIGZvciBjeWd3aW4zMiBnZGIKKworV2VkIE5vdiAyMCAwMDo0MzowOSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjYWxsYmFjay5oOiBEZWxldGUsIG1vdmVkIHRvIC4uL2luY2x1ZGUuCisJKiBjYWxsYmFjay5jOiBEZWxldGUsIG1vdmVkIHRvIC4uL3NpbS9jb21tb24uCisJKiBNYWtlZmlsZS5pbiAoU0ZJTEVTLENPTU1PTl9PQkpTKTogRGVsZXRlIGNhbGxiYWNrLltjb10uCisJKGNhbGxiYWNrLm8pOiBEZWxldGUgcnVsZS4KKwkqIHJlbW90ZS1zaW0uaDogTm8gbG9uZ2VyIGluY2x1ZGUgY2FsbGJhY2suaC4KKwkoc2ltX2NhbGxiYWNrX3dyaXRlX3N0ZG91dCk6IERlbGV0ZSBwcm90b3R5cGUuCisJKiByZW1vdGUtc2ltLmMgKGluaXRfY2FsbGJhY2tzLGVuZF9jYWxsYmFja3MpOiBOZXcgZnVuY3Rpb25zLgorCShnZGJfb3Nfd3JpdGVfc3Rkb3V0LCBnZGJfb3NfcHJpbnRmX2ZpbHRlcmVkKTogTmV3IGZ1bmN0aW9ucy4KKwkoZ2RiX2NhbGxiYWNrLCBjYWxsYmFja3NfaW5pdGlhbGl6ZWQpOiBOZXcgc3RhdGljIGdsb2JhbHMuCisJKGdkYnNpbV9vcGVuKTogQ2FsbCBpbml0X2NhbGxiYWNrcy4KKwkoZ2Ric2ltX2Nsb3NlKTogQ2FsbCBlbmRfY2FsbGJhY2tzLgorCShzaW11bGF0b3JfY29tbWFuZCk6IENhbGwgaW5pdF9jYWxsYmFja3MuCisKKwkqIGNvbmZpZy9oODMwMC9oODMwMC5tdCAoU0lNKTogQ2hhbmdlIHRvIC4uL3NpbS9oODMwMC9saWJzaW0uYS4KKwkqIGNvbmZpZy9oODUwMC9oODUwMC5tdCAoU0lNKTogQ2hhbmdlIHRvIC4uL3NpbS9oODUwMC9saWJzaW0uYS4KKworTW9uIE5vdiAxOCAxNTo1ODowNSAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaCAoRklYX0NBTExfRFVNTVkpOiBDaGFuZ2UgdW5zaWduZWQgTE9OR0VTVAorCXRvIFVMT05HRVNULgorCitGcmkgTm92IDE1IDE1OjM0OjE4IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJRnJvbSBQZXRlciBTY2hhdWVyIDxQZXRlci5TY2hhdWVyQFJlZ2VudC5FLVRlY2huaWsuVFUtTXVlbmNoZW4uREU+CisJKiBwcm9jZnMuYyAod2FpdF9mZCk6ICBIYW5kbGUgRUlOVFIgZXJyb3IgcmV0dXJuIGZyb20gcG9sbAorICAgICAgICBieSByZXN0YXJ0aW5nIHRoZSBwb2xsLgorCSogZGVmcy5oIChQSURHRVQpOiBEZWZpbmUgYSBkZWZhdWx0IHZlcnNpb24gdGhhdCBqdXN0CisJcmV0dXJucyBpdHMgYXJndW1lbnQgdW5jaGFuZ2VkLgorCSogaW5mbG93LmMgKHRlcm1pbmFsX2luaXRfaW5mZXJpb3IpOiBFbGltaW5hdGUgI2lmZGVmCisJb2YgUElER0VUIGFuZCBmb2xkIGJvdGggYWx0ZXJuYXRpdmVzIGludG8gY29tbW9uIGNvZGUuCisJKHBhc3Nfc2lnbmFsKTogVXNlIFBJREdFVCBmb3IgcGlkIHBhc3NlZCB0byBraWxsKCkuCisKK1RodSBOb3YgMTQgMTU6NTQ6MjAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiB1dGlscy5jIChwYWRkcixwcmVnKTogVXNlIGEgc3RhdGljIHZhcmlhYmxlIGluaXRpYWxpemVkIHRvIDMyCisJaW5zdGVhZCBvZiBkb2luZyBhZGRyPj4zMiB0byBlbGltaW5hdGUgYSB3YXJuaW5nIHByb2R1Y2VkIGJ5IEdDQworCW9uIDMyLWJpdCBzeXN0ZW1zLgorCisJKiBjb25maWcvZDEwdi90bS1kMTB2LmggKFVMT05HRVNUKTogRGVmaW5lLgorCitUdWUgTm92IDEyIDEyOjI1OjI3IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KKworCSogYy10eXBlcHJpbnQuYyAoY3BfdHlwZV9wcmludF9tZXRob2RfYXJncyk6IFBhc3MgLTEgZm9yIHNob3cgaW4KKwlyZWN1cnNpdmUgY2FsbCB0byB0eXBlX3ByaW50LgorCQorVHVlIE5vdiAxMiAxMjoxODoyOSAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+CisKKwkqIGRlZnMuaCAoVUxPTkdFU1QpOiBOZXcgbWFjcm8uCisJKiBhbHBoYS10ZGVwLmMsIGJyZWFrcG9pbnQuYywgYy1leHAueSwgY2gtZXhwLmMsIGNvbnZleC14ZGVwLmMsCisJY29yZWZpbGUuYywgZGVmcy5oLCBmLWV4cC55LCBmaW5kdmFyLmMsIGdkYmNvcmUuaCwgbTItZXhwLnksCisJbTg4ay10ZGVwLmMsIHByaW50Y21kLmMsIHJlbW90ZS1obXMuYywgcmVtb3RlLW1pcHMuYywgc3BhcmMtdGRlcC5jLAorCXZhbGFyaXRoLmMsIHZhbG9wcy5jLCB2YWx1ZXMuYywgY29uZmlnL2dvdWxkL3RtLW5wMS5oLAorCWNvbmZpZy9taXBzL3RtLW1pcHMuaCwgbXN3aW4vcHJlYnVpbHQvZ2RiL2NleHB0YWIuYywKKwltc3dpbi9wcmVidWlsdC9nZGIvZmV4cHRhYi5jLCBtc3dpbi9wcmVidWlsdC9nZGIvbTJleHB0YWIuYzoKKyAJQ2hhbmdlIGFsbCBvY2N1cmFuY2VzIG9mIHVuc2lnbmVkIExPTkdFU1QgdG8gVUxPTkdFU1QuCisKKwkqIGNvbmZpZ3VyZS5ob3N0IChtaXBzLXNnaS1pcml4Nik6IEFkZC4KKwkKK1R1ZSBOb3YgMTIgMTI6MTY6NDAgMTk5NiAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogc2gtdGRlcC5jOiBBZGQgZnVuY3Rpb25hbGl0eSBmb3IgdGFyZ2V0IGZ1bmN0aW9uIGNhbGxzLgorCSogY29uZmlnL3NoL3RtLXNoLmg6IEFkZCBzdXBwb3J0IGZvciB0YXJnZXQgZnVuY3Rpb24gY2FsbHMuCisKK1R1ZSBOb3YgMTIgMTI6MDY6NTggMTk5NiAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKwkgCisJKiBtMzJyLXRkZXAuYzogQWRkIGZ1bmN0aW9uYWxpdHkgZm9yIHRhcmdldCBmdW5jdGlvbiBjYWxscy4KKwkqIHZhbG9wcy5jOiAgICBTbWFsbCBjaGFuZ2UgdG8gc3VwcG9ydCB0YXJnZXQgZnVuY3Rpb24gY2FsbHMuCisJKiBjb25maWcvbTMyci90bS1tMzJyLmg6IEFkZCBzdXBwb3J0IGZvciB0YXJnZXQgZnVuY3Rpb24gY2FsbHMuCisJIAorTW9uIE5vdiAxMSAxNzoxNTo1OSAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBkZWZzLmg6IE1vZGlmeSBOb3YgMTEgMTI6NTk6MDAgY2hhbmdlIHNvIF9NU0NfVkVSIGlzIGNoZWNrZWQKKwlpbnN0ZWFkIG9mIF9XSU4zMi4KKwkqIHdpbjMyLW5hdC5jOiBGaXggTm92IDExIDEyOjU5OjAwIGNoYW5nZSAod2luZG93cy5oIHNob3VsZAorCWJlIGluY2x1ZGVkIGluc3RlYWQgb2Ygd2luZGVmcy5oIGZvciBjb21waWxlcnMgb3RoZXIgdGhhbgorCVZDKyspLgorCSogbXN3aW4vd2luZGVmcy5oOiBSZW1vdmUgXk1zIGFuZCBjaGFuZ2UgQysrIHN0eWxlIGNvbW1lbnRzCisJdG8gQyBzdHlsZSBjb21tZW50cy4KKworTW9uIE5vdiAxMSAxNDozMjozOCAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIHV0aWxzLmMgKGdldF9jZWxsKTogRml4IG9mZi1ieS1vbmUgYnVnLgorCSogbWlwcy10ZGVwLmMgKGdldF9mcmFtZV9wb2ludGVyLCBmaXhfc2lnbl9leHRlbnNpb24pOgorCU5ldyBmdW5jdGlvbnMgdG8gY29uc29saWRhdGUgY29tbW9uIGNvZGUuCisJKG1pcHNfZnJhbWVfY2hhaW4sIGluaXRfZXh0cmFfZnJhbWVfaW5mbyk6IFVzZSBuZXcgZnVuY3Rpb25zCisJdG8gZml4IHByb2JsZW1zIHdpdGggYmFja3RyYWNlIGFuZCBmaW5pc2ggY29tbWFuZHMgb24gZGRiIGJvYXJkLgorCitNb24gTm92IDExIDEyOjU5OjAwIDE5OTYgIERhd24gUGVyY2hpayA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgorCisJKiBtaXBzLXRkZXAuYywgcmVtb3RlLW1pcHMuYywgdmFsdWVzLmMsIG1kZWJ1Z3JlYWQuYywKKwljb25maWcvbWlwcy90bS1taXBzLmg6IEFkZC9maXggYnVncyBmb3IgNjQtYml0IG1pcHMgc3VwcG9ydC4KKwkqIGRlZnMuaDogQ2xlYW51cDsgYWRkIHByb3RvdHlwZXMuCisJKiBjb3JlZmlsZS5jOiBDaGFuZ2UgRklYTUUgI2lmZGVmCisJKiB3aW4zMi1uYXQuYzogSW5jbHVkZSB3aW5kZWZzIGluc3RlYWQgb2Ygd2luZG93cy5oLgorCSogdXRpbHMuYzogQWRkIHJvdXRpbmVzIGZvciBwcmludGluZyBhZGRyZXNzZXMgYW5kIHJlZ2lzdGVycyAKKwliYXNlZCBvbiB0eXBlIHNpemUuCisKK1NhdCBOb3YgIDkgMDE6MDU6MTAgMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBhbHBoYS10ZGVwLmMgKGhldXJpc3RpY19wcm9jX2Rlc2MpOiAgU3RvcCBleGFtaW5pbmcgdGhlIHByb2xvZ3VlCisJaWYgd2UgZW5jb3VudGVyIGEgcG9zaXRpdmUgc3RhY2sgYWRqdXN0bWVudC4gCisJKGZpbmRfcHJvY19kZXNjKTogIElmIGhldXJpc3RpY19mZW5jZV9wb3N0IGlzIG5vbi16ZXJvLCB1c2UKKwloZXVyaXN0aWNfcHJvY19zdGFydCB0byBkZXRlcm1pbmUgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24gYmVmb3JlCisJY2FsbGluZyBoZXVyaXN0aWNfcHJvY19kZXNjLgorCisJKiBjb2ZmcmVhZC5jIChjb2ZmX3N5bXRhYl9yZWFkKTogIENoYW5nZSBtaW5pbWFsIHN5bWJvbCB0eXBlcworCWZvciBDX0xBQkVMIHN5bWJvbHMgZnJvbSBtc3RfKiB0byBtc3RfZmlsZV8qLgorCisJKiBjb25maWcvbTY4ay9zdW4zb3M0Lm1oIChNTUFMTE9DX0NGTEFHUyk6IERlZmluZSBNTUNIRUNLX0ZPUkNFIHRvIDEuCisKKwkqIGNvbmZpZ3VyZS5pbjogIEhhbmRsZSBlcnJvciBtZXNzYWdlIGZyb20gc3VuMyBuYXRpdmUgbGQgd2hlbgorCWNvbmZpZ3VyaW5nIEhMREZMQUdTLgorCSogY29uZmlndXJlOiAgUmVnZW5lcmF0ZWQgd2l0aCBhdXRvY29uZi4KKworCSogYy12YWxwcmludC5jIChjX3ZhbHVlX3ByaW50KTogIEFkanVzdCB2YWx1ZSBhZGRyZXNzIGJ5IFZBTFVFX09GRlNFVC4KKwkqIGNwLXZhbHByaW50LmMgKGNwX3ByaW50X3ZhbHVlKTogIFByZXZlbnQgZ2RiIGNyYXNoZXMgYnkgbWFraW5nIHN1cmUKKwl0aGF0IHRoZSB2aXJ0dWFsIGJhc2UgcG9pbnRlciBmcm9tIGFuIHVzZXIgb2JqZWN0IHN0aWxsIHBvaW50cyB0bworCWFjY2Vzc2libGUgbWVtb3J5LgorCisJKiBkYnhyZWFkLmMgKGRieF9zeW1maWxlX2luaXQpOiAgSW5pdGlhbGl6ZSBzeW1fc3RhYl9pbmZvIHRvCisJY2xlYXIgdGhlIHJlY2VudGx5IGFkZGVkIGhlYWRlcl9maWxlcyBmaWVsZHMuCisJKGRieF9zeW1maWxlX2ZpbmlzaCk6ICBGcmVlIGhmaWxlc1tpXS52ZWN0b3IgdG8gYXZvaWQgc3RvcmFnZSBsZWFrLgorCitGcmkgTm92ICA4IDE0OjMwOjIzIDE5OTYgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy90bS1zaC5oOiBBZGRlZCBhIG1pc3NpbmcgY29tbWEgaW4gbWlkZGxlIG9mCisgCVJFR0lTVEVSX05BTUVTIGxpc3QuCisKK0ZyaSBOb3YgIDggMTI6Mjk6NTEgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtb25pdG9yLmM6IEZpeCBzb21lIGZvcm1hdHRpbmcgYW5kIGNvbW1lbnRzLgorCisJKiByZW1vdGUtc2ltLmMgKHNpbXVsYXRvcl9jb21tYW5kKTogU2V0IHVwIGNhbGxiYWNrcyBiZWZvcmUKKwllbnRlcmluZyB0aGUgc2ltdWxhdG9yLgorCitUaHUgTm92ICA3IDE1OjE5OjA4IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBkMTB2LXRkZXAuYzogRml4IHNvbWUgcHJvYmxlbXMgd2l0aCBpbmZlcmlvciBmdW5jdGlvbiBjYWxscy4KKwkqIGNvbmZpZy9kMTB2L3RtLWQxMHYuaCAoRVhUUkFfRlJBTUVfSU5GTyk6IENoYW5nZSBkdW1teSB0byBiZQorCWEgcG9pbnRlciB0byB0aGUgZHVtbXkncyBzdGFjayBpbnN0ZWFkIG9mIGp1c3QgYSBmbGFnLgorCQorVHVlIE5vdiAgNSAxMDoyMTowMiAxOTk2ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBtMzJyLXRkZXAuYzogSW1wcm92ZWQgZnJhbWVfY2hhaW4gYW5kIGZuIHByb2xvZ3VlIGFuYWx5c2lzLgorCSogY29uZmlnL3RtLW0zMnIuaDogQWRkIGZyYW1lc2l6ZSBhbmQgcmVnaXN0ZXIgdG8gZXh0cmFfZnJhbWVfaW5mby4KKworVHVlIE5vdiAgNSAxMDowODowNyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBtc3dpbi9nZGJ3aW4uaDogIFJlbW92ZSBib2d1cyBkZWZpbml0aW9uIG9mIENPUkVfQUREUi4KKwkqIG1zd2luL3NyY3dpbi5jcHAgKENTcmNTY3JvbGwxOjpDU3JjU2Nyb2xsMSk6ICBJbml0aWFsaXplIGRlcHRoCisJdG8gZml4IGRpdmlkZS1ieS16ZXJvIHByb2JsZW0gd2l0aCBjbGlja2luZyBvbiBzb3VyY2Ugd2luZG93LgorCitNb24gTm92ICA0IDAwOjQ4OjM3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIG1zd2luL3JlY29yZGl0OiAgRml4IHByb2JsZW0gd2l0aCBhYnNvbHV0ZSBwYXRocy4KKwkqIG1zd2luL3JlY29yZGl0OiAgRml4IHByb2JsZW0gd2l0aCByZWxhdGl2ZSBwYXRocy4KKworU3VuIE5vdiAgMyAxODowNjo0MiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBtc3dpbi97TWFrZWZpbGUuaW4gY29uZmlndXJlIGNvbmZpZ3VyZS5pbn06ICBOZXcgZmlsZXMgZm9yCisJY29uZmlndXJpbmcgd2luZ2RiIHVuZGVyIFVuaXguCisKK1NhdCBOb3YgIDIgMDM6NTQ6MTMgMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBpcml4NS1uYXQuYywgb3Nmc29saWIuYywgc29saWIuYyAoc3ltYm9sX2FkZF9zdHViKTogIEhhbmRsZQorCW1pc3Npbmcgb3IgemVyby1zaXplZCAudGV4dCBzZWN0aW9ucyBwcm9wZXJseS4KKwkqIG1kZWJ1Z3JlYWQuYzogIEhhbmRsZSBzY1JDb25zdCBhbmQgc2NTVW5kZWZpbmVkIHN0b3JhZ2UgY2xhc3Nlcy4KKwkqIHN0YWJzcmVhZC5jIChzY2FuX2ZpbGVfZ2xvYmFscyk6ICBUcnkgdG8gcmVzb2x2ZSBzeW1ib2xzCisJZm9yIHNoYXJlZCBsaWJyYXJpZXMgZnJvbSB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGUgb2YgdGhlIG1haW4KKwlleGVjdXRhYmxlIGZpcnN0LgorCitGcmkgTm92ICAxIDEzOjU5OjI4IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBkMTB2LXRkZXAuYywgY29uZmlnL2QxMHYvdG0tZDEwdi5oOiAgTWFqb3IgZml4ZXMgdG8gc3VwcG9ydAorCWluZmVyaW9yIGZ1bmN0aW9uIGNhbGxzIGFuZCBwcm9wZXIgc3RhY2sgYmFja3RyYWNpbmcgb24gRDEwVi1FVkEKKwlib2FyZC4KKworRnJpIE5vdiAgMSAxMDo1MDo1MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9wb3dlcnBjL2xpbnV4Lm1oIChOQVRERVBGSUxFUyk6IEZpeCB1cCB0aGluZ3Mgc28gdGhhdCBpdAorCWxpbmtzLgorCShHREJTRVJWRVJfREVQRklMRVMsVEVSTUNBUCk6IERpdHRvLgorCisJKiBtb25pdG9yLmMgKGRldl9uYW1lLHRhcmdfb3BzKTogTW92ZSBzdGF0aWMgdmFyaWFibGVzIGJlZm9yZQorCWZpcnN0IHVzZSwgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCisKK1RodSBPY3QgMzEgMTY6Mzc6MTcgMTk5NiAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogbTMyci10ZGVwLmM6IEltcHJvdmVkIGZyYW1lX2NoYWluIGFuZCBmbiBwcm9sb2d1ZSBhbmFseXNpcy4KKwkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBlbnRyeSBmb3IgbTMyciB0YXJnZXQuCisJKiBtb25pdG9yLmg6ICAgQWRkIGEgZmxhZyB0byB0ZWxsIG1vbml0b3Jfc3RvcmVfcmVnaXN0ZXIgdG8gdXNlCisJCQkodmFsLCByZWdubykgaW5zdGVhZCBvZiAocmVnbm8sIHZhbCkuCisJKiBtb25pdG9yLmM6ICAgTWFrZSBtb25pdG9yX3N0b3JlX3JlZ2lzdGVyIGhvbm9yIHRoZSBhYm92ZSBmbGFnLgorCQkJTWFrZSBtb25pdG9yX2V4cCBpZ25vcmUgREMxL0RDMyBmb3IgbTMyci4KKwkJCUluY3JlYXNlIGJ1ZiBzaXplIGluIG1vbml0b3JfZHVtcF9yZWdzLgorCitXZWQgT2N0IDMwIDE4OjE0OjE0IDE5OTYgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIG0zMnItdGRlcC5jLCBtMzJyLXJvbS5jOiBOZXcgZmlsZXMuCisJKiBjb25maWcvbTMyci9tMzJyLm10OiBOZXcgZmlsZS4KKwkqIGNvbmZpZy9tMzJyL3RtLW0zMnIuaDogTmV3IGZpbGUuCisKK1R1ZSBPY3QgMjkgMTY6NTY6MDEgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2kzODYveG0tY3lnd2luMzIuaDoKKwkqIGNvbmZpZy9wb3dlcnBjL3htLWN5Z3dpbjMyLmg6CisJYWRkICNkZWZpbmUgTFNFRUtfTk9UX0xJTkVBUiBzbyBzb3VyY2UgbGluZXMgYXJlbid0IHVuZXhwZWN0ZWRseQorCXRydW5jYXRlZC4KKworVHVlIE9jdCAyOSAxODozNjo0MyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9wb3dlcnBjL3RtLXBwYy1lYWJpLmggKFRBUkdFVF9CWVRFX09SREVSX1NFTEVDVEFCTEUpOgorCURlZmluZS4KKworVHVlIE9jdCAyOSAxNDo1OToyMCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIFRPRE86IEFkZCBpdGVtIHN1Z2dlc3RpbmcgYW4gImluZm8gYmZkIiBjb21tYW5kLgorCitUdWUgT2N0IDI5IDEyOjQ4OjA0IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBkMTB2LXRkZXAuYzogU25hcHNob3QgdGhhdCBzdXBwb3J0cyBEMTBWLUVWQSBib2FyZC4KKyAJCisJKiBjb25maWcvZDEwdi90bS1kMTB2LmggKFJFR0lTVEVSX05BTUVTKTogQWRkIGltYXAwLGltYXAxLGRtYXAuCisJKFRBUkdFVF9SRUFEX0ZQLFRBUkdFVF9XUklURV9GUCk6IERlZmluZS4gCisJCitNb24gT2N0IDI4IDE3OjM0OjI0IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIG1zd2luL2dlbm1ha2VzIG1zd2luL3JlY29yZGl0OiAgTmV3IHNjcmlwdHMgdG8gZ2VuZXJhdGUgbWFrZQorCWZpbGVzIGZvciBNU1ZDLgorCitTdW4gT2N0IDI3IDIwOjE4OjA0IDE5OTYgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL21pcHMve3RtLXZyNTAwMC5oLHRtLXZyNTAwMGVsLmgsdnI1MDAwLm10LHZyNTAwMGVsLm10fToKKwlOZXcgZmlsZXMuCisJKiBjb25maWd1cmUudGd0OiBNb2RpZnkgY2FzZXMgZm9yIHZyNTAwMCB0byB1c2UgbmV3IGZpbGVzLgorCitTYXQgT2N0IDI2IDA3OjE1OjE0IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY29uZmlnL2FscGhhL2FscGhhLW9zZjMubWggKFhNX0NMSUJTKTogIEFkZCAtbG0gZm9yIE9TRi8xLTQuMC4KKworCSogcHJvY2ZzLmMgKHByb2Nfc2V0X2V4ZWNfdHJhcCk6ICBVbmRlciBBbHBoYSBPU0YvMS00LjAsIHRyYWNpbmcKKwl0aGUgZW50cnkgdG8gdGhlIGV4aXQgc3lzdGVtIGNhbGwgdG8gZGV0ZWN0IHRlcm1pbmF0aW9uIG9mIHRoZQorCWluZmVyaW9yIHN0b3BwZWQgd29ya2luZy4gVHJhY2UgdGVybWluYXRpb24gb2YgdGhlIGluZmVyaW9yIHZpYQorCVBSRlNfU1RPUFRFUk0gaW5zdGVhZC4KKwkocHJvY2ZzX2luaXRfaW5mZXJpb3IpOiAgRG8gbm90IHRyYWNlIGVudHJ5IHRvIGV4aXQgc3lzdGVtIGNhbGwKKwlpZiBQSU9DU1NQQ0FDVCBpcyBkZWZpbmVkLgorCShwcm9jZnNfd2FpdCk6ICBIYW5kbGUgUFJfREVBRCBldmVudCwgd2hpY2ggc2lnbmFscyB0aGUgdGVybWluYXRpb24KKwlvZiB0aGUgaW5mZXJpb3IgaWYgUFJGU19TVE9QVEVSTSBpcyBzZXQuCisKKwkqIG1kZWJ1Z3JlYWQuYyAocGFyc2VfcGFydGlhbF9zeW1ib2xzKTogIElnbm9yZSBzdE5pbCBzZWN0aW9uCisJc3RhcnQgYWRkcmVzcyBzeW1ib2xzLgorCisJKiBzcGFyYy10ZGVwLmMgKGdldF9zYXZlZF9yZWdpc3Rlcik6ICBHZXQgc2F2ZWQgUEMgZnJvbSB0aGUKKwlmcmFtZSBpbmZvIGlmIG5vdCBpbiBpbm5lcm1vc3QgZnJhbWUuCisKK1RodSBPY3QgMjQgMTA6NTE6NDUgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBkYnhyZWFkLmMgKHByb2Nlc3Nfb25lX3N5bWJvbCk6IEludGVycHJldCBlbmQtb2YtZnVuY3Rpb24KKwltYXJrZXJzIGNvcnJlY3RseTsgdGhpcyBmaXhlcyBwcm9ibGVtIG9uIFZyNTAwMCB3aGVyZSBhbGwKKwlmdW5jdGlvbnMgaW4gYSBtb2R1bGUgaGFkIHRoZSBzYW1lIGFkZHJlc3MuCisJKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZS50Z3QsIGNvbmZpZ3VyZS5ob3N0LCBnZGJzZXJ2ZXIvY29uZmlndXJlLmluOgorCUNvcnJlY3QJZm9yIHBjLWxpbnV4LWdudSBwcm9ibGVtIGluIGNvbmZpZy5ndWVzcy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworVGh1IE9jdCAyNCAxMDowNjo1OCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBkYnhyZWFkLmM6ICBEb24ndCBzd2FwIHN5bWJvbHMgaW4gcGxhY2UsIHNpbmNlIGludGVybmFsIGFuZAorCWV4dGVybmFsIGZvcm1zIG1heSBoYXZlIGRpZmZlcmVudCBzaXplcy4gIERvbid0IGFzc3VtZSB0aGF0IGFuCisJaW50ZXJuYWxfbmxpc3QgaGFzIHRoZSBzYW1lIGxheW91dCBhcyBhbiBleHRlcm5hbF9ubGlzdC4gIENyZWF0ZQorCXN5bWJvbCBmb3Igbl9zdHJ4IGVsZW1lbnQgc28gdG8gaGlkZSBzcGVjaWZpY3Mgb2Ygbmxpc3QgZnJvbQorCXBhcnRpYWwtc3RhYi5oLiAKKwkqIHBhcnRpYWwtc3RhYi5oOiAgRG9uJ3QgcmVmZXJlbmNlIGRieHJlYWQgc3ltYm9scyBkaXJlY3RseS4gIFVzZQorCUNVUl9TWU1CT0xfU1RSWCBpbnN0ZWFkLgorCSogY29uZmlnL2kzODYveG0td2luZG93cy5oOiAgRGVmaW5lIFNJR1FVSVQgYW5kIFNJR1RSQVAuCisKKwkqIGNvbmZpZy92ODUwL3RtLXY4NTAuaDogIERlZmluZSBQU19SRUdOVU0gYW5kIFRBUkdFVF9WODUwIGZvcgorCU1TVkMgYnVpbGRzLgorCSogbXN3aW4vZ2Rid2luLmMgKHJlZ19vcmRlcik6ICBEZWZpbmUgcmVnaXN0ZXIgb3JkZXIgZm9yIFY4NTAuCisJKiBtc3dpbi9ndWkuY3BwIChDR3VpQXBwOjpJbml0SW5zdGFuY2UpOiAgRGVmaW5lIHRhcmdldCBuYW1lIGZvcgorCVY4NTAuCisJKiBtc3dpbi9yZWdkb2MuaDogIERlZmluZSBNQVhSRUdTIGZvciBWODUwLgorCitUdWUgT2N0IDIyIDE2OjI4OjIwIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIHY4NTAtdGRlcC5jIChzY2FuX3Byb2xvZ3VlKTogIENoYW5nZXMgdG8gZGVhbCB3aXRoIHNjaGVkdWxlZAorCXByb2xvZ3VlcyBjb3JyZWN0bHkuICBGaXJzdCwgcHJvbG9ndWUgZW5kIGlzIG5vdyBkZWZpbmVkIGJ5CisJcHJlc2VuY2Ugb2YgYSBicmFuY2gsIGp1bXAgb3IgY2FsbCBpbnNuLiAgU2Vjb25kLCBjYW4gbm8gbG9uZ2VyCisJZml4IGZyYW1lIG9mZnNldHMgYmVjYXVzZSB3ZSBtYXkgbm90IGtub3cgdGhlIG9mZnNldCB1bnRpbCBhZnRlciBhCisJcmVnaXN0ZXIgaGFzIGJlZW4gc2F2ZWQuCisJKiAodjg1MF9pbml0X2V4dHJhX2ZyYW1lX2luZm8pOiAgRml4dXAgZnJhbWUgb2Zmc2V0cyBoZXJlIGJlY2F1c2UKKwl3ZSBoYXZlIGFsbCB0aGUgaW5mbyBhdCB0aGlzIHRpbWUuCisJKiAodjg1MF9mcmFtZV9jaGFpbik6ICBVc2UgbmV3IGNhbGxpbmcgY29udmVudGlvbiBmb3Igc2Nhbl9wcm9sb2d1ZS4KKworVHVlIE9jdCAyMiAxMDoyNToyOSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogZDEwdi10ZGVwLmMsIGNvbmZpZy9kMTB2L3RtLWQxMHYuaDogQ2hhbmdlcyB0byBhbGxvdyBzdGFjaworIAliYWNrdHJhY2VzIGFuZCBpbmZlcmlvciBmdW5jdGlvbiBjYWxscy4KKworVHVlIE9jdCAyMiAxMDozMjo0NiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1tYWtlLnNlZDogVXBkYXRlIGluaXQuYyBlZGl0aW5nIHRvIHdvcmsgd2l0aCBPY3QgOCBjaGFuZ2UuCisJKEBITERGTEFHU0ApOiBBbHdheXMgZWRpdCBvdXQuCisKK01vbiBPY3QgMjEgMTg6MTc6MDggMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6IEZpeCA2NC1iaXQKKwlzaWduLWV4dGVuc2lvbiBwcm9ibGVtcyBpbiBjYWxjdWxhdGluZyBwc3ltdGFiIGFkZHJlc3Nlcy4KKwkqIGJ1aWxkc3ltLmMgKGVuZF9zeW10YWIpOiBVc2UgbWFjcm8gdG8gcG9wIGNvbnRleHQuCisKK01vbiBPY3QgMjEgMTQ6NDA6NTAgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogdjg1MC10ZGVwLmM6ICBDbGVhbnVwIGxvdHMgb2YgdGhpbmdzLiAgQWRkIG1hbnkgY29tbWVudHMuCisKKwkqIHY4NTAtdGRlcC5jICh2ODUwX2luaXRfZXh0cmFfZnJhbWVfaW5mbyB2ODUwX2ZyYW1lX2NoYWluKTogIEZpeAorCXNpZ24gYnVncyB3aXRoIHNjYW5uaW5nIHByb2xvZ3Vlcy4gIEdldCBhIGxpdHRsZSBzbWFydGVyIGFib3V0CisJY2FsY3VsYXRpbmcgdGhlIGxlbmd0aCBvZiB1bmludGVyZXN0aW5nIGluc3RydWN0aW9ucy4KKworTW9uIE9jdCAyMSAxNDowMTozOCAxOTk2ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiB0b3AuYzogQWRkIG5ldyBjb21tYW5kcyAic2V0IGFubm90YXRlIiBhbmQgInNob3cgYW5ub3RhdGUiLgorCQorU3VuIE9jdCAyMCAwNDozODozOSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNvcmVsb3cuYyAoY29yZV9jbG9zZSk6ICBDbGVhciBpbmZlcmlvcl9waWQgb25seSBpZiB0aGVyZSBpcworCWFuIG9wZW4gY29yZV9iZmQuCisKKwkqIGNwLXZhbHByaW50LmMgKGNwX3ByaW50X3ZhbHVlX2ZpZWxkcyk6ICBQYXNzIGNvcnJlY3QgYWRkcmVzcworCXRvIHZhbF9wcmludCwgbm90IDAuCisKKwlGcm9tIEFuZHJlYXMgU2Nod2FiIChzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGUpOgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHBfc3RhbmRhcmQpIFtjYXNlIEJJTk9QX1JFUEVBVF06IENoYXNlCisJdHlwZWRlZnMgYmVmb3JlIGNoZWNraW5nIGZvciBpbnRlZ3JhbCB0eXBlIG9mIHJpZ2h0IG9wZXJhbmQuCisKK0ZyaSBPY3QgMTggMTc6MjY6MjIgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3N5bWJvbCk6IEZpeCBjcmFzaCB3aGVuIG1hbGxvYyBoYXMKKwlubyB0eXBlIGluZm8gYW5kIHZvaWQgdHlwZSBoYXMgbm8gYXNzb2NpYXRlZCBwb2ludGVyIHR5cGUuCisKK1RodSBPY3QgMTcgMTg6MTg6MjAgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaG9zdDogTmV3IGZpbGUsIGhvc3QgY29uZmlndXJhdGlvbiBtYXBwaW5nLgorCSogY29uZmlndXJlLnRndDogTmV3IGZpbGUsIHRhcmdldCBjb25maWd1cmF0aW9uIG1hcHBpbmcuCisJKiBjb25maWd1cmUuaW46IFJlbW92ZSBob3N0IGFuZCB0YXJnZXQgbWFwcGluZy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworV2VkIE9jdCAxNiAxNzo0NjowMyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGJyZWFrcG9pbnQuYyAobXVzdF9zaGlmdF9pbnN0X3JlZ3MpOiBOZXcgZ2xvYmFsLgorCShicHN0YXRfc3RvcF9zdGF0dXMpOiBDaGFuZ2UgI2lmIHVzZXMgb2YgREVDUl9QQ19BRlRFUl9CUkVBSyBpbnRvCisJZXF1aXZhbGVudCBleHByZXNzaW9uIHVzZXMuCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBEaXR0by4KKworV2VkIE9jdCAxNiAwMTo1Mzo0MyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiB2ODUwLXRkZXAuYyAodjg1MF9wdXNoX2FyZ3VtZW50cyk6ICBVc2Ugc3ltYm9saWMgbmFtZXMgZm9yIGFyZworCXJlZ2lzdGVycy4KKwkqIGNvbmZpZy92ODUwL3RtLXY4NTAuaDogIENoYW5nZSBGUCB0byAyOS4gIERlZmluZSBhcmcgcmVncy4KKworVHVlIE9jdCAxNSAxNjozMDowNyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoaW5pdC5jKTogIERvbid0IHVzZSAtcyBvcHRpb24gd2l0aCBncmVwLiAgSXQgbWVhbnMKKwlzb21ldGhpbmcgZGlmZmVyZW50IHVuZGVyIERpZ2l0YWwgVW5peC4KKworCSogYnVpbGRzeW0uYyAoZmluaXNoX2Jsb2NrKTogIFRyZWF0IExPQ19CQVNFUkVHX0FSRyBhbmQKKwlMT0NfTE9DQUxfQVJHIGFzIGFyZ3VtZW50cyBzbyB0aGF0IEdEQiB3aWxsIGtub3cgYWJvdXQgZnVuY3Rpb24KKwlhcmdzIGRlY2xhcmVkIHRoaXMgd2F5LiAgTW9zdGx5IGFmZmVjdHMgZHdhcmYuCisJKiBkd2FyZnJlYWQuYyAoZGVjb2RlX2RpZV90eXBlKTogIENoYW5nZSBkZWZhdWx0IHR5cGUgZnJvbSBpbnQgdG8KKwl2b2lkLiAgVGhpcyBhbGxvd3MgR0RCIHRvIHJlY29nbml6ZSB2b2lkIGZ1bmN0aW9ucy4KKwkqIChuZXdfc3ltYm9sKTogIElmIEFUX1BST1RPVFlQRUQgaXMgcHJlc2VudCwgc2V0IGEgZmxhZyBpbiB0aGUKKwl0eXBlIHN0cnVjdHVyZS4KKwkqIGZpbmR2YXIuYyAoZXh0cmFjdF9mbG9hdGluZyBzdG9yZV9mbG9hdGluZyk6ICBDbGVhbiB1cCBjb21tZW50cworCXRvIHJlZmxlY3QgcmVhbGl0eS4KKwkqIGdkYnR5cGVzLmg6ICBBZGQgVFlQRV9GTEFHX1BST1RPVFlQRUQgc28gdGhhdCB3ZSBjYW4gdGVsbCBpZiBhCisJZnVuY3Rpb24gaGFzIGEgcHJvdG90eXBlLiAgQ3VycmVudGx5LCBvbmx5IGR3YXJmIHN1cHBvcnRzIHRoaXMuCisJKiB1dGlscy5jIChmbG9hdGZvcm1hdF9mcm9tX2RvdWJsZXN0KTogIEZpeCBsb2dpYyBlcnJvciB3aXRoCisJY29udmVydGluZyBmcm9tIGRvdWJsZSB0byBmbG9hdC4gIChJdCB3YXNuJ3Qgc2hpZnRpbmcgbWFudF9sb25nIGlmCisJaXQgaGFkIGEgaGlkZGVuIGJpdC4pCisJKiB2ODUwLXRkZXAuYzogIEFkZCBzdXBwb3J0IGZvciBmdW5jdGlvbiBjYWxsaW5nLiAgRml4IHNvbWUKKwlwcm9ibGVtcyB3aXRoIGRlYnVnZ2luZyBjb2RlIHcvbyBkZWJ1ZyBzeW1ib2xzLgorCSogY29uZmlnL3Y4NTAvdG0tdjg1MC5oOiAgRGl0dG8uCisKK1R1ZSBPY3QgMTUgMTg6MTk6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB1dGlscy5jOiBBbHdheXMgZW5zdXJlIHRoYXQgc2l6ZV90IGlzIGRlZmluZWQuICBDaGVjaworCUhBVkVfU1REREVGX0ggcmF0aGVyIHRoYW4gX19TVERDX18KKwkoeG1hbGxvYywgeHJlYWxsb2MpOiBVc2Ugc2l6ZV90IHJhdGhlciB0aGFuIGxvbmcuCisKK1R1ZSBPY3QgMTUgMTQ6MjQ6MTkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9wb3dlcnBjL3RtLXBwYy1lYWJpLmg6IFVuZGVmaW5lIE5PX1NJTkdMRV9TVEVQIHNvIHRhcmdldHMKKwljYW4gdXNlIHNpbmdsZS1zdGVwIGNvbW1hbmRzLgorCitTdW4gT2N0IDEzIDExOjM4OjI1IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogc3RhYnNyZWFkLmMgKGRlZmluZV9zeW1ib2wpOiAgSWYgUkVHX1NUUlVDVF9IQVNfQUREUiBpcyBub24temVybywKKwlmb2xsb3cgdHlwZWRlZnMgYmVmb3JlIGNoZWNraW5nIFRZUEVfQ09ERSBmb3Igc3RydWN0dXJlcyBhbmQgdW5pb25zLgorCitGcmkgT2N0IDExIDE1OjQzOjU0IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGZyYW1lLmg6ICBNb3ZlIGRlZmluaXRpb24gb2Ygc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgdG8gYmVmb3JlCisJc3RydWN0IGZyYW1lIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gdXNlIGZyYW1lX3NhdmVkX3JlZ3MgaW4KKwlFWFRSQV9GUkFNRV9JTkZPIG1hY3JvLgorCisJKiB2ODUwLXRkZXAuYyBjb25maWcvdjg1MC90bS12ODUwLmg6ICBMb3RzYSBuZXcgZnVuY3Rpb25zIGFuZAorCW1hY3JvcyB0byBtYWtlIGZyYW1lIG9wZXJhdGlvbnMgKHN1Y2ggYXMgYmFja3RyYWNlKSB3b3JrLgorCitGcmkgT2N0IDExIDE0OjIzOjUwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBkYnhyZWFkLmMgKHByb2Nlc3Nfb25lX3N5bWJvbCk6IENoZWNrIGZvciBudWxsIHN0cmluZyBkaXJlY3RseQorCXJhdGhlciB0aGFuIHVzaW5nIHN0cmNtcCBhZ2FpbnN0ICIiLgorCSogcGFydGlhbC1zdGFiLmg6IERpdHRvLgorCitGcmkgT2N0IDExIDEyOjE4OjMyIDE5OTYgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogZ2Ric2VydmVyL3tnZGJyZXBsYXkuYyxsb3ctbGludXguYyxyZW1vdGUtdXRpbHMuYyx1dGlscy5jfToKKwlNYWtlIGl0IGNvbXBpbGUgb24gTGludXggYW5kIGVsaW1pbmF0ZSBzb21lIHdhcm5pbmdzLgorCitUaHUgT2N0IDEwIDE2OjMyOjA4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbml0LmMpOiAgRml4dXAgZmluYWwgc2VkIHNjcmlwdCB0byB3b3JrIGFyb3VuZAorCUxpbnV4IGJ1ZyB3aXRoIGBwJyBvcGVyYXRvci4KKworV2VkIE9jdCAgOSAxODowMjo0OCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1taXBzLmM6IFVzZSB0aGUgY29ycmVjdCBuYW1lIGV2ZXJ5d2hlcmUgKEREQikgZm9yIE5FQydzCisgCVZSNDMwMCB0YXJnZXQuCisJKGRkYl9vcHMsIHBtb25fb3BzKTogRml4IHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZ3MuCisKK1dlZCBPY3QgIDkgMDc6NDI6NDQgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGluaXQuYyk6ICBSZXRybyBIUFVYIGdyZXAgbGFja3MgLWggb3B0aW9uLiAgU3RyaXAKKwlmaWxlbmFtZXMgd2l0aCBzZWQgaW5zdGVhZC4KKworVHVlIE9jdCAgOCAxNTo1OTo0NCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBkZWZzLmg6ICBSZW1vdmUgZGVjbHMgb2YgeG1hbGxvYyBhbmQgeHJlYWxsb2MuICBUaGVyZSBpcyBhCisJY29uZmxpY3RpbmcgZGVmaW5pdGlvbiBpbiBsaWJpYmVydHkuaC4KKworVHVlIE9jdCAgOCAxMTo0NzoxMyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZGJ4cmVhZC5jIChkYnhfc3ltZmlsZV9yZWFkKTogQ2FsbCBmcmVlX3BlbmRpbmdfYmxvY2tzIHJhdGhlcgorCXRoYW4gcG9raW5nIGdsb2JhbCB2YXJpYWJsZSAod2hpY2ggaXMgbm93IHN0YXRpYykuCisJKiBocHJlYWQuYyAoaHByZWFkX2J1aWxkX3BzeW10YWJzKTogRGl0dG8uCisJKiBvczlrcmVhZC5jIChvczlrX3N5bWZpbGVfcmVhZCk6IERpdHRvLgorCSogeGNvZmZyZWFkLmMgKHhjb2ZmX2luaXRpYWxfc2Nhbik6IERpdHRvLgorCisJKiBidWlsZHN5bS5oIChmcmVlX3BlbmRpbmdfYmxvY2tzKTogRGVjbGFyZSBoZXJlLgorCShwZW5kaW5nX2Jsb2Nrcyk6IFJlbW92ZSBkZWNsYXJhdGlvbiBvZiBnbG9iYWwgc3ltYm9sLgorCShmcmVlX3BlbmRpbmdzKTogUmVtb3ZlIGRlY2xhcmF0aW9uIG9mIGdsb2JhbCBzeW1ib2wuCisJKG1ha2VfYmxvY2t2ZWN0b3IpOiBEZWNsYXJlIGhlcmUuCisJKHJlY29yZF9wZW5kaW5nX2Jsb2NrKTogRGVjbGFyZSBoZXJlLgorCQorCSogZHN0cmVhZC5jIChtYWtlX2Jsb2NrdmVjdG9yKTogUmVtb3ZlIHN0YXRpYyBjb3B5IHRoYXQgd2FzIG9sZAorCWNsb25lIG9mIHZlcnNpb24gaW4gYnVpbGRzeW0uYy4KKwkocHJvY2Vzc19kc3RfYmxvY2spOiBDYWxsIHJlY29yZF9wZW5kaW5nX2Jsb2NrIHJhdGhlciB0aGFuIGRvaW5nCisJaXQgYnkgaGFuZC4KKwkocmVhZF9kc3Rfc3ltdGFiKTogRGl0dG8uCisKKwkqIGJ1aWxkc3ltLmMgKG1ha2VfYmxvY2t2ZWN0b3IpOiBNYWtlIGdsb2JhbCByYXRoZXIgdGhhbiBzdGF0aWMsCisJKHJlY29yZF9wZW5kaW5nX2Jsb2NrKTogTmV3IGZ1bmN0aW9uLCBjb2RlIG1vdmVkIGZyb20gZmluaXNoX2Jsb2NrLgorCShmaW5pc2hfYmxvY2spOiBVc2UgcmVjb3JkX3BlbmRpbmdfYmxvY2suCisJKGZyZWVfcGVuZGluZ19ibG9ja3MpOiBOZXcgZnVuY3Rpb24uCisJKHJlYWxseV9mcmVlX3BlbmRpbmdzKTogQ2FsbCBmcmVlX3BlbmRpbmdfYmxvY2tzLgorCShwZW5kaW5nX2Jsb2Nrcyk6IE1ha2Ugc3RhdGljIGluc3RlYWQgb2YgZ2xvYmFsLgorCShmcmVlX3BlbmRpbmdzKTogTWFrZSBzdGF0aWMgaW5zdGVhZCBvZiBnbG9iYWwuCisJCitUdWUgT2N0ICA4IDA5OjAzOjIyIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9pMzg2L3dpbmRvd3MubWggY29uZmlnL2kzODYveG0td2luZG93cy5oOjogIE5ldyBjb25maWcKKwlmaWxlcyB0byBzdXBwb3J0IGJ1aWxkaW5nIFdpbmdkYiAoYnVpbHQgdW5kZXIgTWljcm9zb2Z0IGJ1aWxkCisJZW52aXJvbm1lbnQpLgorCisJKiBNYWtlZmlsZS5pbjogIEFkZCBydWxlIGZvciBocHV4LXRocmVhZC5vIChuZWVkcyBzcGVjaWFsIGhlYWRlcgorCWZpbGVzKS4KKwkqIChTVUJESVJTKTogIFJlbW92ZSBtc3dpbi4KKwkqIENoYW5nZSBwcm9jZWR1cmUgZm9yIGNyZWF0aW5nIGluaXQuYy4gIFNwZWVkcyB0aGluZ3MgdXAgcXVpdGUgYQorCWJpdC4KKwkqIGNvbmZpZy5pbiBjb25maWd1cmUgY29uZmlndXJlLmluOiAgQ2hlY2sgZm9yIHNlbGVjdCwgcG9sbC4KKwkqIENoZWNrIGZvciBPU0YgaGVhZGVyIGZpbGVzIGJlZm9yZSBpbmNsdWRpbmcgaHB1eC10aHJlYWQuby4KKwkqIERvbid0IGNvbmZpZ3VyZSBkb2Mgb3IgdGVzdHN1aXRlIHdoZW4gYnVpbGRpbmcgdW5kZXIgTVNWQy4KKwkqIGZpbmR2YXIuYyB2YWx1ZS5oIChyZWFkX3JlZ2lzdGVyX3BpZCB3cml0ZV9yZWdpc3Rlcl9waWQpOiAgTWFrZQorCWdsb2JhbC4gIE5lZWRlZCBmb3IgaHBwYS10ZGVwLmMuCisJKiAoc3VwcGx5X3JlZ2lzdGVyKTogIERvbid0IHNldCBwaWQgdG8gaW5mZXJpb3JfcGlkIHdoZW4gc3VwcGx5aW5nCisJcmVnaXN0ZXJzLgorCSogaHBwYS10ZGVwLmMgKHNhdmVkX3BjX2FmdGVyX2NhbGwpOiAgZnJhbWVfc2F2ZWRfcGMgLT4KKwlGUkFNRV9TQVZFRF9QQy4KKwkqIChmcmFtZV9zYXZlZF9wYyk6ICBDaGFuZ2UgbmFtZSB0byBocHBhX2ZyYW1lX3NhdmVkX3BjLgorCSogKGhwcGFfcG9wX2ZyYW1lKTogIERvbid0IHVzZSBhIHBpZCBvZiAwIHdpdGggdGFyZ2V0X3dyaXRlX3BjLgorCVVzZSB3cml0ZV9wYyBpbnN0ZWFkLCB3aGljaCB1c2VzIHRoZSBjb3JyZWN0IHBpZC4KKwkqICh0YXJnZXRfcmVhZF9wYyB0YXJnZXRfd3JpdGVfcGMpOiAgVXNlIHJlYWQvd3JpdGVfcmVnaXN0ZXJfcGlkCisJaW5zdGVhZCBvZiByZWFkL3dyaXRlX3JlZ2lzdGVyIHRvIHByZXNlcnZlIHRoZSBwaWQgcGFzc2VkIGluLgorCSogaW5mdGFyZy5jIChjaGlsZF9jYW5fcnVuKTogIEFkZCBmbGFnIGNoaWxkX3N1cHByZXNzX3J1biB0byBhbGxvdworCWhwdXgtdGhyZWFkcy5jIHRvIG92ZXJyaWRlIHRoaXMgYXMgYSBydW5uYWJsZSB0YXJnZXQuCisJKiBjb25maWcvcGEvbm0taHBwYWguaDogIERlZmluZSB0YXJnZXRfbmV3X29iamZpbGUgYW5kCisJdGFyZ2V0X3BpZF90b19zdHIuCisJKiBjb25maWcvcGEvdG0taHBwYS5oIChGUkFNRV9TQVZFRF9QQyk6ICBVc2UgaHBwYV9mcmFtZV9zYXZlZF9wYworCWluc3RlYWQgb2YgZnJhbWVfc2F2ZWRfcGMuCisJKiBjb25maWcvbTY4ay90bS1tNjhrLmg6ICBEZWZpbmUgVEFSR0VUX002OEsgZm9yIFdpbmdkYi4KKwkqIGNvbmZpZy9tNjhrL3RtLW1vbml0b3IuaDogIFVzZSBGUkFNRV9DSEFJTl9WQUxJRF9BTFRFUk5BVEUsIHNpbmNlCisJd2UgY2FuJ3QgZWFzaWx5IGRldGVybWluZSB0aGUgc3RhcnQgZmlsZSBib3VuZHMgd2l0aCBFTEYuCisJKiBjb25maWcvbWlwcy90bS1taXBzLmg6ICBEZWZpbmUgVEFSR0VUX01JUFMgZm9yIFdpbmdkYi4KKwkqIGhwdXgtdGhyZWFkLmM6ICBOZXcgZmlsZSBmb3IgSFBVWC9PU0YgdGhyZWFkIHN1cHBvcnQuCisJKiBvc2Ytc2hhcmUve1JFQURNRSBBVDM4Ni9jbWFfdGhyZWFkX2lvLmggSFA4MDAvY21hX3RocmVhZF9pby5oCisJUklPUy9jbWFfdGhyZWFkX2lvLmggY21hX2F0dHIuaCBjbWFfZGViX2NvcmUuaCBjbWFfZGVidWdfY2xpZW50LmgKKwljbWFfZXJyb3JzLmggY21hX2hhbmRsZS5oIGNtYV9pbml0LmggY21hX2xpc3QuaCBjbWFfbXV0ZXguaAorCWNtYV9zY2hlZC5oIGNtYV9zZW1hcGhvcmVfZGVmcy5oIGNtYV9zZXF1ZW5jZS5oIGNtYV9zdGFjay5oCisJY21hX3N0YWNrX2ludC5oIGNtYV90Y2JfZGVmcy5oIGNtYV91dGlsLmh9OiAgTmV3IGZpbGVzIGZvciBPU0YKKwl0aHJlYWQgc3VwcG9ydC4KKworU3VuIE9jdCAgNiAxNTo0ODowOSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogYnVpbGRzeW0uYyAoZmluaXNoX2Jsb2NrKTogQ2hhbmdlIGlubmVyYmxvY2tfYW5vbl9jb21wbGFpbnQgdG8KKwlwcmludCB0aGUgYWRkcmVzc2VzIGFzIHBhcnQgb2YgdGhlIGNvbXBsYWludC4gIEFkZCBhIGNvbXBsYWludCBmb3IKKwljYXNlcyB3aGVyZSB0aGUgYmxvY2sgZW5kIGFkZHJlc3MgaXMgc21hbGxlciB0aGFuIHRoZSBibG9jayBzdGFydAorCWFkZHJlc3MsIGluIGNhc2UgYW55IHN1Y2ggY29uZGl0aW9ucyBzbGlwIHRocm91Z2ggb3VyIGZpeHVwIG1lY2hhbmlzbS4KKwkqIHN5bW1pc2MuYyAoZHVtcF9zeW10YWIpOiBPbmx5IHByaW50IGJsb2NrdmVjdG9yIGZvciBwcmltYXJ5CisgCXN5bXRhYnMsIHRvIGF2b2lkIG1hc3NpdmUgZHVwbGljYXRpb24gb2Ygb3V0cHV0IGR1ZSB0byBzZWNvbmRhcnkKKyAJc3ltdGFicyB0aGF0IHBvaW50IHRvIHNhbWUgYmxvY2t2ZWN0b3IuICBBbHNvIGRvIHNvbWUgbWlub3IgCisJZm9ybWF0dGluZyB0d2Vha3MuCisKK01vbiBPY3QgIDcgMTA6NDI6MzIgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGRlbmViLmN5Z251cy5jb20+CisKKwlSZXBsYWNlIGhlYWRlcl9maWxlcyBnbG9iYWwgYnkgcGVyLW9iamZpbGUgZmllbGQuCisJKiBnZGItc3RhYnMuaCAoc3RydWN0IGRieF9zeW1maWxlX2luZm8pOiAgQWRkIGZpZWxkcyBoZWFkZXJfZmlsZXMsCisJbl9oZWFkZXJfZmlsZXMsIG5fYWxsb2NhdGVkX2hlYWRlcl9maWxlcy4KKwkqIHN0YWJzcmVhZC5oIChoZWFkZXJfZmlsZXMsIG5faGVhZGVyX2ZpbGVzLCBuX2FsbG9jYXRlZF9oZWFkZXJfZmlsZXMpOgorCVJlcGxhY2UgZXh0ZXJucyBieSBtYWNyb3MgSEVBREVSX0ZJTEVTLCBOX0hFQURFUl9GSUxFUywgYW5kCisJTl9BTExPQ0FURURfSEVBREVSX0ZJTEVTLgorCSogZGJ4cmVhZC5jIChkYnhfc3ltZmlsZV9maW5pc2gpOiAgRnJlZSBIRUFERVJfRklMRVMuCisJKGZyZWVfaGVhZGVyX2ZpbGVzLCBpbml0X2hlYWRlci1maWxlcyk6ICBEb24ndCBmcmVlL2luaXQgaGVhZGVyZmlsZXMuCisJKHZhcmlvdXMgZnVuY3Rpb25zKTogIFVzZSBtYWNyb3MgaW5zdGVhZCBvZiBoZWFkZXJfZmlsZXMgZ2xvYmFscy4KKwkqIHN0YWJzcmVhZC5jICh2YXJpb3VzIGZ1bmN0aW9ucyk6ICBMaWtld2lzZS4KKworU3VuIE9jdCAgNiAyMjo0MzowNiAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+CisKKwkqIGR3YXJmMnJlYWQuYyAocmVhZF90YWdfcmVmZXJlbmNlX3R5cGUpOiBOZXcgZm4uCisJKHJlYWRfdHlwZV9kaWUpOiBDYWxsIGl0LgorCShkd2FyZl9hdHRyKTogQWxzbyBsb29rIGluIHRoZSBESUVzIHJlZmVycmVkIHRvIGJ5IHNwZWNpZmljYXRpb24KKyAJb3IgYWJzdHJhY3Rfb3JpZ2luIGF0dHJpYnV0ZXMuCisKK1dlZCBPY3QgIDIgMjI6MDc6MTYgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGluZmVyaW9yLmggKElOX1NJR1RSQU1QKTogUGFzcyBwYyB0byBTSUdUUkFNUF9TVEFSVCBhbmQKKwlTSUdUUkFNUF9FTkQuCisJKiBjb25maWcvaTM4Ni90bS1pMzg2b3M5ay5oIChTSUdUUkFNUF9TVEFSVCwgU0lHVFJBTVBfRU5EKTogCisJRGVmaW5lIHdpdGggZHVtbXkgcGMgYXJnLgorCSogY29uZmlnL202OGsvdG0tbmJzZC5oOiBEaXR0by4KKwkqIGRvYy9nZGJpbnQudGV4aW5mbzogRG9jdW1lbnQgdGhhdCBTSUdUUkFNUF9TVEFSVCBhbmQKKwlTSUdUUkFNUF9FTkQgYXJlIG1hY3JvcyB0aGF0IHRha2UgYW4gc2luZ2xlIGFyZ3VtZW50LgorCitNb24gU2VwIDMwIDIwOjAyOjQ1IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBkZWZzLmg6IFJlbW92ZSBkZWZpbmUgb2YgUFJJVkFURV9YTUFMTE9DLgorCitNb24gU2VwIDMwIDE1OjM5OjI4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy92ODUwL3RtLXY4NTAuaDogIFVzZSBkaXN0aW5jdCByZWdpc3RlciBmb3IgUEMsIG5vdCBFSVBDLgorCitNb24gU2VwIDMwIDExOjE2OjM0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogdG9wLmMgKGV4ZWN1dGVfY29udHJvbF9jb21tYW5kKTogIEZyZWUgdmFsdWVzIGZyb20gd2hpbGVfY29udHJvbAorCWFuZCBpZl9jb250cm9sIGNvbmRpdGlvbnMgYWZ0ZXIgZXZhbHVhdGlvbiB0byBhdm9pZCBzdG9yYWdlIGxlYWtzLgorCUZyb20gUGV0ZXIgU2NoYXVlci4KKyAKK0ZyaSBTZXAgMjcgMTc6NDM6MDYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlIGNvbmZpZ3VyZS5pbjogIFJlY29nbml6ZSB2ODUwIHRhcmdldC4KKwkqIHY4NTAtdGRlcC5jOiAgTmV3IGZpbGUsIE5FQyBWODUwIHRhcmdldCBzdXBwb3J0LgorCSogY29uZmlnL3Y4NTAve3Y4NTAubXQgdG0tdjg1MC5ofTogIE5ldyBmaWxlcyBmb3IgTkVDIFY4NTAgc3VwcG9ydC4KKworRnJpIFNlcCAyNyAxNDo0ODoxNSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBVcGRhdGUgY3VycmVudF9saW5lIGFuZAorCWN1cnJlbnRfc3ltdGFiIHdoZW4gc3RlcHBpbmcgY29udGludWVzIGluIHRoZSBtaWRkbGUgb2YgYSBuZXcgbGluZS4KKworRnJpIFNlcCAyNyAxMDoyNTozMCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogdG9wLmMgKHByaW50X2dkYl92ZXJzaW9uKTogUmV3cm90ZSB0byBjb21wbHkgd2l0aCBuZXcgR05VIGNvZGluZworCXN0YW5kYXJkcyBmb3IgdGhlIC0tdmVyc2lvbiBvcHRpb24uCisJKHByaW50X2dudV9hZHZlcnRpc2VtZW50KTogUmVtb3ZlLCBub3cgcGFydCBvZiBwcmludF9nZGJfdmVyc2lvbi4KKwkoc2hvd192ZXJzaW9uKTogUmVtb3ZlIGNhbGwgdG8gcHJpbnRfZ251X2FkdmVydGlzZW1lbnQuCisJKiB0b3AuaCAocHJpbnRfZ251X2FkdmVydGlzZW1lbnQpOiBSZW1vdmUgcHJvdG90eXBlLgorCSogbWFpbi5jIChwcmludF9nZGJfaGVscCk6IE1vdmUgaGVscCB0byBzdGF0aWMgZnVuY3Rpb24gYW5kCisJYWRkIHByb3RvdHlwZS4KKwkobWFpbik6IENhbGwgcHJpbnRfZ2RiX2hlbHAgcmF0aGVyIHRoYW4gaW5saW5pbmcgaXQuCisJKG1haW4pOiBSZW1vdmUgY2FsbCB0byBwcmludF9nbnVfYWR2ZXJ0aXNlbWVudC4KKwkKK0ZyaSBTZXAgMjcgMTM6MzI6NTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvZDEwdi90bS1kMTB2LmggKFRBUkdFVF97SU5ULFBUUn1fQklUKTogRGVmaW5lLgorCShUQVJHRVRfeyxMT05HX31ET1VCTEVfQklUKTogRGl0dG8uCisKK1RodSBTZXAgMjYgMjM6MTA6MjYgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4sIGNvbmZpZy9pMzg2L3RtLWxpbnV4Lmg6IEZpeCBjb25maWd1cmUKKwlwcm9ibGVtIG9uIG9sZGVyIExpbnV4IHN5c3RlbXMgdGhhdCBwcmV2ZW50ZWQgY29yZSBmaWxlcworCWZyb20gYmVpbmcgcmVjb2duaXplZC4KKworV2VkIFNlcCAyNSAxODozMTozMyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGRidWctcm9tLmM6IE5ldyBmaWxlLCBzdXBwb3J0IGZvciBNb3Rvcm9sYSdzIGRCVUcgbW9uaXRvci4KKwkqIGNvbmZpZy9tNjhrL21vbml0b3IubXQgKFRERVBGSUxFUyk6IEFkZCBpdC4KKwkqIE5FV1M6IE1lbnRpb24gaXQuCisKK01vbiBTZXAgMjMgMTY6MTM6NTAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9kMTB2L3RtLWQxMHYuaCAoU0FWRURfUENfQUZURVJfQ0FMTCk6IEZpeGVkLiAgCisJTm93IHNpbmdsZS1zdGVwcyBjb3JyZWN0bHkuCisJKiBkMTB2LXRkZXAuYyAoZDEwdl9wb3BfZnJhbWUpOiBGaXhlZC4KKworRnJpIFNlcCAyMCAxNjoxMDo1OCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9zaC90bS1zaC5oIChSRUdJU1RFUl9OQU1FUyk6IE1vdmUgZnAgcmVnaXN0ZXJzIHRvCisJYmUgY29uc2lzdGVudCB3aXRoIEdDQy4KKwkoRlBVTF9SRUdOVU0sIGV0Yyk6IFJlbnVtYmVyIHRvIG1hdGNoIGxpc3QgY2hhbmdlcy4KKwkoQUREUl9CSVRTX1JFTU9WRSk6IERlbGV0ZS4KKwkqIHNoLXRkZXAuYyAoc2hfcmVnX25hbWVzLCBzaDNfcmVnX25hbWVzLCBzaDNlX3JlZ19uYW1lcyk6CisJUmVhcnJhbmdlIHRvIG1hdGNoIFJFR0lTVEVSX05BTUVTLgorCSogc2gzLXJvbS5jIChzaDNfcmVnbmFtZXMsIHNoM2VfcmVnbmFtZXMpOiBEaXR0by4KKworVGh1IFNlcCAxOSAxNjoxOTowMSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogZDEwdi10ZGVwLmM6ICBTdGFjayBjaGFpbiBzaG91bGQgd29yayBub3cuIAorCitUdWUgU2VwIDE3IDE4OjQ2OjU3IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBkMTB2LXRkZXAuYywgY29uZmlnL2QxMHYvdG0tZDEwdi5oOiBTbmFwc2hvdC4gCisKK1R1ZSBTZXAgMTcgMTI6MjA6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZCBjYXNlcyBmb3IgTUlQUyA1MDAwIGxpa2UgTUlQUyA0MzAwLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitUdWUgU2VwIDE3IDEyOjA5OjAwIDE5OTYgIERhd24gUGVyY2hpayA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgorCisJKiBzZXItZTdrcGMuYzogQWRkZWQgd2luZ2RiIHN1cHBvcnQgZm9yIHRhcmdldCBlNzAwMHBjLgorCitUdWUgU2VwIDE3IDEwOjU2OjUyIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KKworCSogcmVtb3RlLW1pcHMuYyAocG1vbl93YWl0KTogRERCIFBNT04gZG9lcyBub3QgcmVxdWlyZSBmb3JjZWQKKyAJcmUtZW50cnkgYmFjayBpbnRvIGRlYnVnIG1vZGUuCisKK01vbiBTZXAgMTYgMTQ6MzI6NTggMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgorCisJKiByZW1vdGUtbWlwcy5jIChtaXBzX2xvYWQpOiBFbnN1cmUgdGhhdCB0aGUgUEMgaXMgZXhwbGljaXRseQorIAlsb2FkZWQgYWZ0ZXIgYSBsb2FkIHRvIGEgRERCIFBNT04gc3lzdGVtLgorIAkKK0ZyaSBTZXAgMTMgMTI6MDI6MzkgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChJTlRFUk5BTF9MREZMQUdTKTogQWRkIEBITERGTEFHU0AgdG8gbGlzdC4KKwkoSExERU5WKTogU2V0IHRvIEBITERFTlZALgorCShnZGIpOiBQcmVmaXggbGluayBjb21tYW5kIGxpbmUgd2l0aCAkKEhMREVOVikuCisJKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IHRvIHRlc3QgZm9yIC0tZW5hYmxlLXNoYXJlZCBhbmQKKwlnZW5lcmF0ZSBhcHByb3ByaWF0ZSB2YWx1ZXMgZm9yIEhMREZMQUdTIGFuZCBITERFTlYuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYuCisKK1N1biBTZXAgIDggMTU6MjY6MjcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGFscGhhLW5hdC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6IE1hdGNoIFNlcCA0IGdkYmNvcmUuaCBwcm90b3R5cGUKKwljaGFuZ2UgZm9yIGNvcmVfcmVhZF9yZWdpc3RlcnMgaW4gc3RydWN0IGNvcmVfZm5zLgorCSogY29yZS1yZWdzZXQuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiBEaXR0byAmIGFkZCBwcm90b3R5cGUuCisJKiBjb3JlLXNvbDIuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiBEaXR0byAmIGFkZCBwcm90b3R5cGUuCisJKiBpMzg2YWl4LW5hdC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6IERpdHRvICYgYWRkIHByb3RvdHlwZS4KKwkqIGkzODZiLW5hdC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6IERpdHRvLgorCSogaTM4Nm1hY2gtbmF0LmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogRGl0dG8gJiBhZGQgcHJvdG90eXBlLgorCSogaXJpeDQtbmF0LmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogRGl0dG8uCisJKiBpcml4NS1uYXQuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiBEaXR0by4KKwkqIGx5bngtbmF0LmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogRGl0dG8gJiBhZGQgcHJvdG90eXBlLgorCSogbTY4a25ic2QtbmF0LmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogRGl0dG8uCisJKiBtaXBzLW5hdC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6IERpdHRvICYgYWRkIHByb3RvdHlwZS4KKwkqIHJzNjAwMC1uYXQuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiBEaXR0by4KKwkqIHNwYXJjLW5hdC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6IERpdHRvLgorCSogc3VuMy1uYXQuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiBEaXR0byAmIGFkZCBwcm90b3R5cGUuCisJKiB1bHRyYTMtbmF0LmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogRGl0dG8gJiBhZGQgcHJvdG90eXBlLgorCisJKiBhbHBoYS1uYXQuYyAocmVnaXN0ZXJfYWRkcik6IE1hdGNoIFNlcCA0IGdkYmNvcmUuaCBwcm90b3R5cGUgY2hhbmdlLgorCSogZGVsdGE2OC1uYXQuYyAocmVnaXN0ZXJfYWRkcik6IERpdHRvLgorCSogZ2Ric2VydmVyL2xvdy1saW51eC5jIChyZWdpc3Rlcl9hZGRyKTogRGl0dG8uCisJKiBnZGJzZXJ2ZXIvbG93LWhwcGFic2QuYyAocmVnaXN0ZXJfYWRkcik6IERpdHRvLgorCSogaTM4Nm0zLW5hdC5jIChyZWdpc3Rlcl9hZGRyKTogRGl0dG8uCisJKiBtaXBzLW5hdC5jIChyZWdpc3Rlcl9hZGRyKTogRGl0dG8uCisJKiB1bHRyYTMtbmF0LmMgKHJlZ2lzdGVyX2FkZHIpOiBEaXR0by4KKworU3VuIFNlcCAgOCAxNToxNDowMCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBibG9ja2ZyYW1lLmMgKGluc2lkZV9tYWluX2Z1bmMpOiAgQ2xlYW51cCBzbGlnaHRseS4gIE1vdmUKKwltYWluc3ltIGRlZiBpbnRvIHRoZSBibG9jayBpdCdzIHVzZWQgaW4uCisJKiBjb25maWd1cmUuaW4gY29uZmlndXJlOiAgQWxsb3cgTkFUREVQRklMRVMgdG8gYmUgcmVjb2duaXplZCBpbgorCS5taCBmaWxlcyByZWdhcmRsZXNzIG9mIHdoaXRlc3BhY2UuCisKKwkqIGNwdTMyYnVnLXJvbS5jIChjcHUzMmJ1Z19jbWRzKTogIENoYW5nZSBsb2FkX3Jlc3BvbnNlIHN0cmluZyB0bworCWtlZXAgZG93bmxvYWRzIGZyb20gaGFuZ2luZy4KKworCSogcmVtb3RlLXdpZ2dsZXIuYzogIEFkZCBzdXBwb3J0IGZvciBmbGFzaCB1cGdyYWRlcy4KKwkqICh3aWdnbGVyX2Vycm9yKTogIEZpeCBtZXNzYWdlIGZvcm1hdC4gIEFkZCBuZXcgZXJyb3IgY29kZS4KKwkqICh3aWdnbGVyX3dyaXRlX2J5ZXRzKTogIEVycm9yIGNvZGUgaXMgaGV4LiAgUmVwb3J0IGVycm9ycyB3aXRoCisJcHJvcGVyIHJvdXRpbmUgbmFtZS4KKwkqICh3aWdnbGVyX3JlYWRfYnlldHMpOiAgUmVwb3J0IGVycm9ycyB3aXRoIHByb3BlciByb3V0aW5lIG5hbWUuCisJKiAoZ2V0X3BhY2tldCk6ICBBZGQgc3VwcG9ydCBmb3IgbmV3IGZsYXNoIGNvbW1hbmRzLgorCSogKHdpZ2dsZXJfbG9hZCk6ICBDYWxsIGNsZWFyX3N5bXRhYl91c2VycygpIHRvIHJlc2V0IHRoaW5ncworCXByb3Blcmx5IGFmdGVyIGRvd25sb2FkLgorCSogKGZsYXNoX3hmZXJfbWVtb3J5IGJkbV91cGRhdGVfZmxhc2hfY29tbWFuZCk6ICBOZXcgZnVueHRpb25zIHRvCisJc3VwcG9ydCBmbGFzaCB1cGdyYWRlcyBmb3IgV2lnZ2xlci4KKwkqIChfaW5pdGlhbGl6ZV9yZW1vdGVfd2lnZ2xlcik6ICBBZGQgYGJkbSB1cGRhdGUtZmxhc2gnIGNvbW1hbmQuCisKK0ZyaSBTZXAgIDYgMTM6MTQ6MTMgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogc2VyLXRjcC5jOiBkb24ndCBpbmNsdWRlIG5ldGluZXQvdGNwLmggaWYgX19DWUdXSU4zMl9fCisKK1RodSBTZXAgIDUgMTc6MDU6MTMgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2kzODYvY3lnd2luMzIubWg6CisJKiBjb25maWcvcG93ZXJwYy9jeWd3aW4zMi5taDogYnVpbGQgc2VyLXRjcC5vIGZvciBib3RoIGhvc3RzCisKK1RodSBTZXAgIDUgMTI6MDk6MTMgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGRlbmViLmN5Z251cy5jb20+CisKKwkqIHZhbHVlLmggKENPRVJDRV9SRUYpOiAgRml4IHByZXZpb3VzIGNoYW5nZS4KKwkoQ09FUkNFX0VOVU0pOiAgQWRkIGEgY2hlY2tfdHlwZWRlZiAgKHRoaXMgaXMgdGhlIHJlYWwgZml4KS4KKworVGh1IFNlcCAgNSAwMzoyODozMCAxOTk2ICBXaWxmcmllZCBNb3NlciAgPG1vc2VyQHJ0bC5jeWdudXMuY29tPgorCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cF9zdGFuZGFyZCk6IEluIGNhc2Ugb2YgT1BfQVJSQVk6IG1ha2UgYQorCWJldHRlciBjaGVjayBvZiBhcnJheSBib3VuZGFyaWVzLgorCitUaHUgU2VwICA1IDAxOjI5OjQyIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZTogIFVwZGF0ZSBhY2xvY2FsLm00IGFuZCByZS1ydW4gYXV0b2NvbmYgdG8gZ2V0IGNvcnJlY3QKKwlkZWZzIGZvciBCRkQgc3R1ZmYuCisJKiByZW1vdGUtd2lnZ2xlci5jICh3aWdnbGVyX2Vycm9yKTogIEVycm9yIGNvZGVzIGFyZSBoZXguICBBbHNvLAorCWZpeCBkZWZhdWx0IG1lc3NhZ2UgZ2VuZXJhdGlvbi4KKworV2VkIFNlcCAgNCAxNzoyODo0MCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIEFkZCBtc3dpbiB0byBTVUJESVJTLiAgQWRkIHJ1bGVzIGZvcgorCW1zd2luL2xpYndpbmdkYi5hIGFuZCByZW1vdGUtd2lnZ2xlci5vLgorCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50X2hlcmVfcCk6ICBDbGVhbiB1cCBicCBlbmFibGVkIHRlc3QuCisJKiAoYnJlYWtwb2ludF9pbnNlcnRlZF9oZXJlX3ApOiAgTmV3IGZ1bmMsIGp1c3QgbGlrZQorCWJyZWFrcG9pbnRfaGVyZV9wLCBleGNlcHQgaXQncyBob25lc3QuICBIb25lc3RseS4KKwkqIGJyZWFrcG9pbnQuaDogIFByb3RvIGZvciBhYm92ZS4KKwkqIGNvbmZpZ3VyZSBjb25maWd1cmUuaW46ICBBZGQgbXN3aW4gdG8gY29uZmlnZGlycyBpZiBob3N0IGlzCisJaVszNDU2XTg2LSotd2luZG93cy4KKwkqIGNvcmUtYW91dC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyByZWdpc3Rlcl9hZGRyKSBnZGJjb3JlLmg6CisJQ2hhbmdlIGFsbCB2YXJzIHRoYXQgY2FuIGNvbnRhaW4gYWRkcmVzc2VzIHRvIHR5cGUgQ09SRV9BRERSLgorCSogZmluZHZhci5jIChzdXBwbHlfcmVnaXN0ZXIpOiAgQWxsb3cgdmFsIHRvIGJlIE5VTEwuICBUaGlzIG1lYW5zCisJdGhhdCByZWdubyBpcyB1bnN1cHBvcnRlZC4KKwkqIChyZWFkX3BjIHJlYWRfcGNfcGlkIHdyaXRlX3BjIHdyaXRlX3BjX3BpZCk6ICBNYWtlIG5vbi1waWQgZm9ybXMKKwlqdXN0IGNhbGwgcGlkIGZvcm1zIHdpdGggaW5mZXJpb3JfcGlkIHNvIHRoYXQgdGhlcmUncyBvbmx5IG9uY2UKKwlwbGFjZSB0byBoYWNrIFBDJ3MgYW5kIHN1Y2guCisJKiBpbmZydW4uYyAocHJvY2VlZCk6ICBEb24ndCBza2lwIGJyZWFrcG9pbnRzIGlmIHVzZXIgY2hhbmdlZCBQQy4KKwkqIHJlbW90ZS13aWdnbGVyLmM6ICBOZXcgZmlsZS4gIFN1cHBvcnQgZm9yIEJETSBpbnRlcmZhY2UgZnJvbQorCU1hY3JhaWdvciBTeXN0ZW1zLgorCSogc2VyaWFsLmM6ICBFbmhhbmNlIHNlcmlhbCBsb2dnaW5nIGNhcGFiaWxpdHkuICBBZGQgaGV4IGFuZCBvY3RhbAorCW91dHB1dCBtb2RlcyAoc2V0IHJlbW90ZWxvZ2Jhc2Uge2hleHxvY3RhbHxhc2NpaX0uICBBbHNvIGxvZworCWJyZWFrcywgdGltZW91dHMsIGVycm9ycywgYW5kIGVvZnMuCisJKiBzZXJpYWwuaDogIFJlZGVmaW5lIFNFUklBTF9TRU5EX0JSRUFLIHRvIGdvIHRocm91Z2ggYSB3cmFwcGVyCisJZnVuY3Rpb24gc28gdGhhdCB3ZSBjYW4gbG9nIGJyZWFrcy4gIERvbid0IGV4cG9ydCBzZXJpYWxfbG9nZmlsZQorCW9yIHNlcmlhbF9sb2dmcC4KKwkqIHRvcC5jIChleGVjdXRlX2NvbW1hbmQpOiAgRG9uJ3QgdGVzdCBmb3Igc2VyaWFsX2xvZ2ZwIGhlcmUuCisJSnVzdCBjYWxsIHNlcmlhbF9sb2dfY29tYW5kLCBhbmQgbGV0IHNlcmlhbC5jIHNvcnQgaXQgb3V0LgorCSogdmFsb3BzLmMgKHZhbHVlX29mX3ZhcmlhYmxlKTogIERvbid0IGF0dGVtcHQgdG8gZXN0YWJsaXNoIGZyYW1lcworCWZvciBzdGF0aWMgYW5kIGdsb2JhbCB2YXJpYWJsZXMuICBUaGlzIG1ha2VzIHRoaW5ncyB3b3JrIGEgYml0CisJYmV0dGVyIGlmIHRoZSBzdGFjayBvciBmcmFtZSBwb2ludGVyIGlzIHRyYXNoZWQuCisJKiBjb25maWcvbTY4ay9tb25pdG9yLm10IChUREVQRklMRVMpOiAgQWRkIHJlbW90ZS13aWdnbGVyLm8uCisJKiBjb25maWcvbTY4ay90bS1tNjhrLmg6ICBEZWZpbmUgU1RBQ0tfQUxJR04uICBDUFUzMiBjYW4ndCBoYWNrCisJbWlzYWxpZ25lZCBzdGFja3MgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgorCitXZWQgU2VwICA0IDEzOjA2OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogdGVybWluYWwuaDogRG9uJ3QgdXNlICNlbGlmLgorCitXZWQgU2VwICA0IDA2OjQ5OjM1IDE5OTYgIFdpbGZyaWVkIE1vc2VyICA8bW9zZXJAcnRsLmN5Z251cy5jb20+CisKKwkqIGNoLWV4cC5jIChwYXJzZV90dXBsZV9lbGVtZW50KTogQWxsb3cgKCopOiBmb3IgYXJyYXkgdHVwbGVzCisJaWYgd2UgaGF2ZSBhIHR5cGUuCisKKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwX3N0YW5kYXJkKTogSW4gY2FzZSBvZiBPUF9BUlJBWToKKwljaGVjayBudW1iZXIgb2YgYXJncyBhZ2FpbnN0IGJvdW5kcyBvZiBhcnJheSB0byBhdm9pZAorCW1lbW9yeSBjb3JydXB0aW9uLgorCisJKiB2YWx1ZS5oIChDT0VSQ0VfUkVGKTogRG8gYSBDSEVDS19UWVBFREVGIGluIGNhc2Ugd2UgZ2V0CisJYSBUWVBFX0NPREVfVFlQRURFRi4KKworRnJpIEF1ZyAzMCAxNTowNzoxNCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIHJlbW90ZS1taXBzLmM6IFByb3ZpZGUgc3VwcG9ydCBmb3IgRERCVlI0MzAwIHRhcmdldCBib2FyZC4KKwkoZGRiX29wZW4sIGRkYl9vcHMpOiBBZGRlZC4KKwkobWlwc19tb25pdG9yX3R5cGUpOiBNT05fRERCIEFkZGVkLgorCShtaXBzX2VudGVyX2RlYnVnLCBtaXBzX2V4aXRfZGVidWcsIG1pcHNfaW5pdGlhbGl6ZSwKKyAJbWlwc19mZXRjaF9yZWdpc3RlcnMsIGNvbW1vbl9icmVha3BvaW50LCBtaXBzX2xvYWQsCisgCV9pbml0aWFsaXplX3JlbW90ZV9taXBzKTogVXBkYXRlZC4KKworVGh1IEF1ZyAyOSAxNzowMDoxOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIG5sbS9jb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotKik6IFJlY29nbml6ZSBpNjg2IGZvciBwZW50aXVtIHByby4KKwkqIG5sbS9jb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKwkqIGdkYnNlcnZlci9jb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotKik6IFJlY29nbml6ZSBpNjg2IGZvcgorCXBlbnRpdW0gcHJvLgorCitXZWQgQXVnIDI4IDEzOjExOjE1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBJZiBDWV9BQ19QQVRIX1RDTENPTkZJRyBjYW4ndCBmaW5kIFRDTCwgZG9uJ3QgcnVuCisJQ1lfQUNfTE9BRF9UQ0xDT05GSUcuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1R1ZSBBdWcgMjcgMTI6NDA6NDAgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IEluaXRpYWxpemUgc3RvcF9mdW5jX2VuZCBiZWZvcmUgY2FsbGluZworCWZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbi4KKworVHVlIEF1ZyAyNyAxMDoxNzozNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSBhZ2Fpbi4KKworVHVlIEF1ZyAyNyAwNDoyNTowOCAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlndXJlLmluOiB3b3JrIGFyb3VuZCBob3N0X2FsaWFzIGNvbmZpZ3VyZSBidWcuCisgICAgICAgIEFDX0NBTk9OSUNBTF9IT1NUIGlzIGNhbGxlZCB0d2ljZSAoZmlyc3QgYnkgQUNfQ0hFQ0tfVE9PTAorICAgICAgICBhbmQgc2Vjb25kIGJ5IEFDX0NBTk9OSUNBTF9TWVNURU0pLiAgVGhlIHNlY29uZCBjbG9iYmVycyB0aGUKKyAgICAgICAgcHJldmlvdXMgc2V0dGluZy4gIENpcmN1bXZlbnRpbmcgYnkgbW92aW5nIHRoZSBzZWNvbmQgY2hlY2sKKyAgICAgICAgdG8gYmVmb3JlIHRoZSBmaXJzdC4KKwkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZWQKKworTW9uIEF1ZyAyNiAxODozNjo1NCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2QxMHYvZDEwdi5tdDogTmV3IGZpbGUuCisJKiBjb25maWcvZDEwdi90bS1kMTB2Lmg6IE5ldyBmaWxlLgkKKwkqIGNvbmZpZ3VyZS5pbjogTmV3IHRhcmdldCBEMTBWLgkgCisJKiBkMTB2LXRkZXAuYzogTmV3IGZpbGUuIAorCitTdW4gQXVnIDI1IDAwOjA5OjQ3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBydGwuY3lnbnVzLmNvbT4KKworCSogcnM2MDAwLXRkZXAuYzogRml4IHR5cG8gaW4gY29tbWVudC4KKwkqIHZhbG9wcy5jIChjYWxsX2Z1bmN0aW9uX2J5X2hhbmQpOiBTZXQgdXNpbmdfZ2NjIHRvIDIKKwlmb3IgY29kZSBjb21waWxlZCB3aXRob3V0IC1nLCBwZXIgY29tbWVudCBpbiBjb2RlLgorCSogY29uZmlnL2EyOWsvdG0tYTI5ay5oIChTVEFDS19BTElHTik6IEFkZCBjb21tZW50LgorCSogY29uZmlnL3NwYXJjL3RtLXNwYXJjLmggKFNUQUNLX0FMSUdOKTogQWRkIGNvbW1lbnQuCisJKiBjb25maWcvc3BhcmMvdG0tc3A2NC5oIChTVEFDS19BTElHTik6IEFkZCBjb21tZW50LgorCSogY29uZmlnL3B5ci90bS1weXIuaCAoU1RBQ0tfQUxJR04pOiBBZGQgY29tbWVudC4KKwkqIGNvbmZpZy9tODhrL3RtLW04OGsuaCAoU1RBQ0tfQUxJR04pOiBBZGQgY29tbWVudC4KKwkqIGNvbmZpZy9wYS90bS1ocHBhLmggKFBVU0hfQVJHVU1FTlRTKTogRW5jbG9zZSBhcmdzIGluICgpJ3MuCisJKFNUQUNLX0FMSUdOKTogQWRkIGNvbW1lbnQsIG1vdmUgdG8gYmUgd2l0aCBvdGhlciBhc3NvY2lhdGVkCisgCW1hY3JvcywgYW5kIGRvY3VtZW50LgorCSogY29uZmlnL21pcHMvdG0tbWlwcy5oIChQVVNIX0FSR1VNRU5UUyk6IEVuY2xvc2UgYXJncyBpbiAoKSdzLgorCShTVEFDS19BTElHTik6IFJlbW92ZSBjb21wbGV0ZWx5LCBoYW5kbGVkIGJ5IFBVU0hfQVJHVU1FTlRTLgorCSogY29uZmlnL2FscGhhL3RtLWFscGhhLmggKFBVU0hfQVJHVU1FTlRTKTogRW5jbG9zZSBhcmdzIGluICgpJ3MuCisJKiBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oIChTVEFDS19BTElHTik6IFJlbW92ZSBjb21wbGV0ZWx5LAorCWhhbmRsZWQgYnkgUFVTSF9BUkdVTUVOVFMuCisJKFBVU0hfQVJHVU1FTlRTKTogRW5jbG9zZSBhcmdzIGluICgpJ3MuCisJCitGcmkgQXVnIDIzIDEzOjU1OjA1IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogIFRyeSB0byByZWVuYWJsZSBzaGFyZWQgbGlicmFyeQorCWJyZWFrcG9pbnRzIGV2ZW4gaWYgYXV0b19zb2xpYl9sb2FkIGlzIG5vdCBzZXQuCisKK1dlZCBBdWcgMjEgMTY6MzE6MjcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHZhbHByaW50LmMgKHByaW50X2xvbmdlc3QpOiBUZXN0IGZvciBDQ19IQVNfTE9OR19MT05HIGFzIHdlbGwgYXMKKwlQUklOVEZfSEFTX0xPTkdfTE9ORy4KKwkqIGV4cHByaW50LmMgKGR1bXBfZXhwcmVzc2lvbik6IERpdHRvLgorCSogY29uZmlndXJlLmluOiBGaXggY2hlY2sgZm9yIGxvbmcgbG9uZyBzdXBwb3J0IGluIGNvbXBpbGVyIHRvCisJdXNlIGEgZnVuY3Rpb24gYm9keSwgbm90IGEgbmVzdGVkIGZ1bmN0aW9uLgorCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYuCisJCitUdWUgQXVnIDIwIDE3OjU5OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNDogSW5jbHVkZSAuLi9iZmQvYWNsb2NhbC5tNC4KKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHN0ZGxpYi5oIHRvIEFDX0NIRUNLX0hFQURFUlMuICBDYWxsCisJQkZEX05FRURfREVDTEFSQVRJT04gb24gbWFsbG9jLCByZWFsbG9jLCBhbmQgZnJlZS4KKwkqIGFjY29uZmlnLmg6IEFkZCBORUVEX0RFQ0xBUkFUSU9OX01BTExPQywKKwlORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MsIGFuZCBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUuCisJKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KKwkqIGRlZnMuaDogSW5jbHVkZSA8c3RkZGVmLmg+IGFuZCA8c3RkbGliLmg+IGJhc2VkIG9uIEhBVkVfKl9ICisJcmF0aGVyIHRoYW4gX19TVERDX18uICBPbmx5IGRlY2xhcmUgbWFsbG9jLCByZWFsbG9jLCBhbmQgZnJlZSBpZgorCU5FRURfREVDTEFSQVRJT05fKiBpcyBkZWZpbmVkLgorCitUdWUgQXVnIDIwIDE1OjM3OjAzIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBzb2xpYi5jIChfaW5pdGlhbGl6ZV9zb2xpYik6IEFkZCBtaXNzaW5nICdcJyBjaGFycyBhdCBlbmRzIG9mCisgCXN0cmluZ3MgdGhhdCBjb250aW51ZSBvbiBuZXh0IGxpbmUuCisJKGVuYWJsZV9icmVhayk6IFJlcGxhY2UgInJldHVybiAwIiB3aXRoIHNldHRpbmcgc3VjY2VzcyB0byB6ZXJvCisgCWFuZCBsZXR0aW5nIG5vcm1hbCByZXR1cm4gaGFuZGxlIHRoZSByZXR1cm4uCisKK1NhdCBBdWcgMTcgMTQ6MTY6MjMgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIG1pcHMtdGRlcC5jIChtaXBzX3B1c2hfYXJndW1lbnRzKTogTWFrZSBzdXJlIHNwIGFuZCBzdHJ1Y3RfYWRkcgorCWFyZSBwcm9wZXJseSBhbGlnbmVkLgorCitGcmkgQXVnIDE2IDE3OjU0OjI2IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogcnM2MDAwLXRkZXAuYyAocnM2MDAwX2ZpeF9jYWxsX2R1bW15KTogQWRkIGZ1bGwgc2V0IG9mIGFyZ3VtZW50cy4KKwkqIGNvbmZpZy9yczYwMDAvdG0tcnM2MDAwLmggKEZJWF9DQUxMX0RVTU1ZKTogUGFzcyBhbGwgYXJndW1lbnRzCisJdG8gZnVuY3Rpb24sIGRlY2xhcmUgZnVuY3Rpb24gY29ycmVjdGx5LgorCitGcmkgQXVnIDE2IDE3OjI0OjM1IDE5OTYgIERhd24gUGVyY2hpayA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgorCisgICAgICAgICogc3ltdGFiLmg6IGNoYW5nZWQgbmFtZXNwYWNlIHRvIF9uYW1lc3BhY2UgZm9yIGNvbXBpbGluZyB1bmRlciAKKwlNRkMgdjQuMC4KKworRnJpIEF1ZyAxNiAxMzo1MjoyMSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1tYWtlLnNlZDogVXBkYXRlIGZvciB2YXJpb3VzIHJlY2VudCBjaGFuZ2VzLCBhZGQgc29tZQorCWNvbW1lbnRzLgorCitGcmkgQXVnIDE2IDE1OjQ3OjM2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3JzNjAwMC90bS1yczYwMDAuaCAoRklYX0NBTExfRFVNTVkpOiBDYXN0IGFyZ3MgdG8gYmUgYW4KKwlpbnRlZ2VyIGZvciB0eXBlIGNvcnJlY3RuZXNzLgorCitGcmkgQXVnIDE2IDE1OjE1OjM3IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KKworCSogY29uZmlnL21pcHMve3ZyNDMwMC5tdCwgdnI0MzAwZWwubXR9IChTSU0pOiBBZGQgLWxtIHdoZW4KKyAJc2ltdWxhdG9yIGlzIGluY2x1ZGVkLgorCitUaHUgQXVnIDE1IDEzOjQ0OjEzIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBmaW5kdmFyLmMgKHdyaXRlX3JlZ2lzdGVyX3BpZCk6IE9ubHkgbmVlZGVkIHdoZW4gVEFSR0VUX1dSSVRFX1BDCisJaXMgbm90IGRlZmluZWQuCisJKHJlYWRfcmVnaXN0ZXJfcGlkKTogT25seSBuZWVkZWQgd2hlbiBUQVJHRVRfUkVBRF9QQyBpcyBub3QKKwlkZWZpbmVkLgorCSogaHBwYS10ZGVwLmMgKGZyYW1lX3NhdmVkX3BjKTogUmVtb3ZlIHByb3RvdHlwZS4KKwkqIGluZnB0cmFjZS5jICh1ZG90X2luZm8pOiBQcm90b3R5cGUgd2hlbiBDSElMRF9YRkVSX01FTU9SWSBpcworCW5vdCBkZWZpbmVkLgorCSogY29uZmlnL3htLWFpeDQuaCAoYWl4X3Jlc2l6ZXdpbmRvdyk6IENvbnZlcnQgb2xkIHN0eWxlIGRlY2wKKwl0byBwcm90b3R5cGUuCisJKiB4Y29mZnNvbGliLmMgKGNvbW1hbmQuaCk6IEluY2x1ZGUgZm9yIG5lZWRlZCBwcm90b3R5cGVzLgorCitXZWQgQXVnIDE0IDE3OjU0OjE5IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9pMzg2L2N5Z3dpbjMyLm1oOiBTZXQgTkFUX0ZJTEUgdG8gbm0tZW1wdHkuaCB0byBtYWtlCisJbmF0aXZlIHdvcmsuCisKK1dlZCBBdWcgMTQgMDI6MDM6NDIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwlGcm9tIEJsYWlyIE1hY0ludHlyZSA8Ym1AY3MuY29sdW1iaWEuZWR1PjoKKwkqIGhwcGEtdGRlcC5jIChocHBhX2ZpeF9jYWxsX2R1bW15KTogVXNlIE1TWU1CT0xfVFlQRSByYXRoZXIKKwl0aGFuIFNZTUJPTF9UWVBFIG9uIG1zeW1ib2xzLgorCSogc29tc29saWIuYyAoc29tX3NvbGliX2NyZWF0ZV9pbmZlcmlvcl9ob29rKTogRGl0dG8uCisKKwkqIE1ha2VmaWxlLmluIChpbml0LmMpOiAgR2VuZXJhdGUgd2l0aCBwcm90b3R5cGVzLgorCisJKiBjb25maWcvcGEvdG0taHBwYS5oIChmcmFtZV9zYXZlZF9wYyk6IEFkZCBwcm90b3R5cGUuCisJKiBjb25maWcvcnM2MDAwL3htLXJzNjAwMC5oIChhaXhfcmVzaXpld2luZG93KTogRGl0dG8uCisJKiBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oIChmcmFtZV9pbml0aWFsX3N0YWNrX2FkZHJlc3MpOiBEaXR0by4KKwkocGNfbG9hZF9zZWdtZW50X25hbWUpOiBEaXR0by4KKwkocG9wX2ZyYW1lKTogRGl0dG8uCisJKGV4dHJhY3RfcmV0dXJuX3ZhbHVlKTogRGl0dG8uCisJKGlzX21hZ2ljX2Z1bmN0aW9uX3BvaW50ZXIpOiBEaXR0by4KKwkocHVzaF9kdW1teV9mcmFtZSk6IERpdHRvLgorCShmaXhfY2FsbF9kdW1teSk6IERpdHRvLgorCShwdXNoX2FyZ3VtZW50cyk6IERpdHRvLgorCShza2lwX3RyYW1wb2xpbmVfY29kZSk6IERpdHRvLgorCShhaXhfcHJvY2Vzc19saW5lbm9zKTogRGl0dG8uCisKKwkqIGNvbmZpZy9tNjhrL3RtLWNpc2NvLmggKGdldF9sb25nam1wX3RhcmdldCk6IEFkZCBwcm90b3R5cGUuCisJKiBjb25maWcvbTY4ay90bS1lczE4MDAuaDogRGl0dG8uCisJKiBjb25maWcvbTY4ay90bS12eDY4Lmg6IERpdHRvLgorCSogY29uZmlnL202OGsvdG0tc3VuMy5oOiBEaXR0by4KKwkqIGNvbmZpZy9tNjhrL3RtLW02OGt2NC5oOiBEaXR0by4KKworVHVlIEF1ZyAxMyAyMzowNDozNiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL21pcHMvbm0tbWlwcy5oIChnZXRfbG9uZ2ptcF90YXJnZXQpOiBBZGQgcHJvdG90eXBlLgorCSogY29uZmlnL21pcHMvbm0taXJpeDMuaCAoZ2V0X2xvbmdqbXBfdGFyZ2V0KTogQWRkIHByb3RvdHlwZS4KKwkqIHJlbW90ZS1taXBzLmMgKG1pcHNfcmVhZF9wcm9jZXNzb3JfdHlwZSk6IFJlbW92ZSBwcm90b3R5cGUuCisJKiBtaXBzLXRkZXAuYyAoZ2RiX3ByaW50X2luc25fbWlwcyk6IEFkZCBwcm90b3R5cGUgYW5kIG1ha2Ugc3RhdGljLgorCSogaXJpeDUtbmF0LmMgKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogQWRkIHByb3RvdHlwZS4KKworTW9uIEF1ZyAxMiAyMToyMzo0NCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLXBhLmMgKGJvb3RfYm9hcmQpOiBBZGQgZHVtbXkgcGFyYW1zIHRvIG1ha2UgdHlwZSBjb21wYXRpYmxlCisgCWZvciBwYXNzaW5nIHRvIGFkZF9jb20uCisJKiBzY20tZXhwLmMgKHNjbV9scmVhZHIpOiBFbnN1cmUgc3ZhbHVlIGlzIG5vdCB1c2VkIHVuaW5pdGlhbGl6ZWQuCisJKiBidWlsZHN5bS5jIChjb21wYXJlX2xpbmVfbnVtYmVycyk6IENoYW5nZSBmdW5jdGlvbiB0byBtYXRjaAorCXByb3RvdHlwZSBhbmQgYWxzbyB3aGF0IHFzb3J0IGV4cGVjdHMuCisKK01vbiBBdWcgMTIgMTk6MTk6MDAgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiByZW1vdGUuYzogTWFrZSByZW1vdGVfd3JpdGVfc2l6ZSBwdWJsaWMuCisJKiBzaC10ZGVwLmMgKF9pbml0aWFsaXplX3NoX3RkZXApOiBTZXQgcmVtb3RlX3dyaXRlX3NpemUgdG8gMzAwCisJdG8gcHJldmVudCBwYWNrZXQgZXJyb3JzIHdpdGggc29tZSB2ZXJzaW9ucyBvZiBDTU9OLgorCitNb24gQXVnIDEyIDE2OjIwOjU4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGRlZnMuaDogIERlZmluZSBDT05TVF9QVFIgYXMgYmxhbmsgaWYgY29tcGlsaW5nIHdpdGggTWljcm9zb2Z0CisJQywgZWxzZSBpdCdzIGBjb25zdCcuCisJKiBjLWxhbmcuYyBjLWxhbmcuaCBjaC1sYW5nLmMgZi1sYW5nLmMgbGFuZ3VhZ2UuYyBtMi1sYW5nLmMKKwlzY20tbGFuZy5jOiBNaWNyb3NvZnQgQyBjYW4ndCBoYWNrIGNvbnN0IHBvaW50ZXJzLiAgVXNlIENPTlNUX1BUUgorCW1hY3JvIGluc3RlYWQuCisJKiBjb25maWd1cmUgY29uZmlndXJlLmluIGRlZnMuaDogIFVzZSBBQ19DX0NPTlNUIHRvIGZpZ3VyZSBvdXQgaWYKKwl0aGUgY29tcGlsZXIgc3VwcG9ydHMgY29uc3QuICBHZXRzIHJpZCBvZiBzb21lIGNydWZ0IGluIGRlZnMuaC4KKwkqIGR3YXJmMnJlYWQuYzogIDxzdHJpbmcuaD4gLT4gImdkYl9zdHJpbmcuaCIKKwkqIHJlbW90ZS1zaW0uYzogIEFkZCBwcm90b3R5cGVzLiAgRml4IGNhbGwgdG8gZ2Ric2ltX2tpbGwuCisJKiBzcGFyY2wtdGRlcC5jIChkb3dubG9hZCk6ICBBZGQgcHJvdG90eXBlcyB0byB3cml0ZV9yb3V0aW5lIGFuZAorCXN0YXJ0X3JvdXRpbmUgYXJncy4KKworCSogbXN3aW4vZ2Rid2luLmM6ICBEb24ndCBpbmNsdWRlIGJvdGggdmFyYXJncy5oIEFORCBzdGRhcmcuaC4gIEdldAorCXJpZCBvZiB2YXJhcmdzLmggIEluY2x1ZGUgc3RyaW5nLmguCisJKiAoZ2Rid2luX3VwZGF0ZSBnZGJ3aW5fZnB1dHMgcmVnc19jaGFuZ2VkX2YgYnB0X2NoYW5nZWRfZgorCXVwZGF0ZSk6ICBGaXggcHJvdG90eXBlcywgZml4IGNhbGxzLgorCSogKHVwZGF0ZSk6ICBSZXR1cm4gdmFsdWUgZm9yIGNhdGNoX2Vycm9ycy4KKwkqIChydW5fZXhlY3V0ZV9jb21tYW5kIHRvZ2RiX2NvbW1hbmRfZnJvbV90dHkgdG9nZGJfY29tbWFuZCk6CisJQ2xlYW51cCBjYXRjaGluZyBvZiBlcnJvcnMgZnJvbSBjYWxscyB0byBleGVjdXRlX2NvbW1hbmQuICBBbHNvLAorCWR1cCBjb21tYW5kIHN0cmluZyB0byBhdm9pZCBtb2RpZnlpbmcgY29uc3Qgc3RyaW5ncy4KKwkqICh0b2dkYl9icmVha2luZm9faV9pbml0IHRvZ2RiX2JyZWFraW5mb19pX25leHQpOiAgVXNlIDAgaW5zdGVhZAorCW9mIE5VTEwgd2hlbiBzZWUgaWYgYi0+YWRkcmVzcyBpc24ndCBzZXQuCisJKiAoYmlfZGlzYWJsZV9icHQgYmlfZW5hYmxlX2JwdCBiaV9kZWxldGVfYWxsCisJYmlfZGVsZXRlX2JyZWFrcG9pbnQpOiAgQWRkIGFyZyB0byBjYWxscyB0byB1cGRhdGUuCisJKiAoZ3VpX2NvbW1hbmQpOiAgQWRkIHByb3RvdHlwZS4KKwkqIChtc3dpbl9xdWVyeSk6ICBGaXggcHJvdG90eXBlLgorCSogKF9pbml0aWFsaXplX2dkYndpbik6ICBEdXAgc3RyaW5nIHRvIGF2b2lkIG1vZGlmeWluZyBjb25zdC4KKwkqIChpbmZvX3BhdGggdG9nZGJfZ2V0X2luZm9fcGF0aCk6ICBSZW1vdmUgY29uc3QgZnJvbSBkZWNscyBjdXoKKwl0aGlzIGNhbid0IGJlIGNvbnN0IChpdCBwb2ludHMgYXQgbWFsbG9jJ2VkIG1lbW9yeSkuCisJKiAodG9nZGJfc2VhcmNocGF0aCk6ICBSZW1vdmUgY29uc3QgZnJvbSBwYXRoLiAgRHVwIHN0cmluZyB0bworCWF2b2lkIG1vZGlmeWluZyBjb25zdCBzdHJpbmdzLgorCSogcmluZGV4IC0+IHN0cnJjaHIuCisJKiAoZ2Rid2luX2xpc3Rfc3ltYm9scyk6ICBSZWdleHAgcGFyYW0gaXMgY29uc3QuCisJKiBGaXggbG90cyBvZiByZWZzIHRvIHBzeW10YWJzIHRvIGRlcmVmIGNvcnJlY3QgcG9pbnRlcnMuCisJKiAodG9nZGJfc2V0X2JyZWFrcG9pbnRfc2FsKTogIENhbGwgc2V0X2JyZWFrcG9pbnRfc2FsIHdpdGggc2FsLAorCW5vdCAmc2FsLgorCSogbXN3aW4vZ2Rid2luLmggKHRvZ2RiX3NlYXJjaHBhdGggdG9nZGJfZ2V0X2luZm9fcGF0aAorCXRvZ2V0X3NldF9pbmZvX3BhdGgpOiAgRml4IHByb3RvdHlwZXMgdG8gbWF0Y2ggcmVhbGl0eS4KKwkqIG1zd2luL2d1aS5jcHA6ICBEZWZpbmUgX2JlZ2ludGhyZWFkZXggYW5kIF9lbmR0aHJlYWRleCByb3V0aW5lcworCXdpdGggcHJvcGVyIHByb3RvdHlwZXMuCisJKiBtc3dpbi9pZmFjZS5jcHAgKGdkYndpbl9mcHV0cyk6ICBEZWZpbmUgd2l0aCBjb3JyZWN0IG51bWJlciBvZiBhcmdzLgorCSogbXN3aW4vc2VyLXdpbjMycy5jOiAgRml4IGRlZnMgb2YgbWluIGFuZCBtYXguCisJKiBtc3dpbi9zZXJkbGwzMi5jIChPcGVuQ29tbTE2KTogIE1ha2UgY2JJblF1ZXVlIGFuZCBjYk91dFF1ZXVlIGJlCisJVVNIT1JULgorCSogKFdyaXRlQ29tbTE2KTogIENoYW5nZSBscEJ1ZyBmcm9tIExQVk9JRCB0byBMUENTVFIuCisJKiBtc3dpbi9zZXJkbGwzMi5oOiAgRml4IHByb3RvdHlwZXMgZm9yIE9wZW5Db21tMTYgYW5kIFdyaXRlQ29tbTE2LgorCitTdW4gQXVnIDExIDIwOjU0OjE2IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIG1haW4uYyAobWFpbik6ICBNYWtlIHN1cmUgY29tbWFuZCBsb29wIGlzIHVzZWQgd2l0aCBjeWd3aW4zMi4KKwkqIHRlcm1pbmFsLmg6ICBBbGxvdyBjeWd3aW4zMiB0byB1c2UgdGVybWlvcy5oLgorCitGcmkgQXVnICA5IDEyOjQyOjQ5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc29tcmVhZC5jIChzb21fc3ltdGFiX3JlYWQpOiBIYW5kbGUgc2Vjb25kYXJ5IGRlZmluaXRpb24KKwlzeW1ib2xzIChha2Egd2VhayBzeW1ib2xzKS4KKworCSogY29uZmlnL3RtLWhwcGEuaCAoRVhUUkFDVF9SRVRVUk5fVkFMVUUpOiBGaXggdGhpbmtvIGluCisJbGFzdCBjaGFuZ2UuCisKK1RodSBBdWcgIDggMTA6MTI6MzYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogc3ltZmlsZS5jIChzeW1maWxlX2JmZF9vcGVuKTogIENoYW5nZSBpZmRlZiBmcm9tIF9fV0lOMzJfXyB0bworCV9XSU4zMi4KKworCSogc29tcmVhZC5jOiAgUmVhcnJhbmdlIG9yZGVyIG9mIGluY2x1ZGVzIHRvIGZpeCB3YXJuaW5ncyB1bmRlcgorCWhwdXgtMTAuMTAuICBBbHNvIGRvbid0IGluY2x1ZGUgc3lzL2ZpbGUuaC4KKworV2VkIEF1ZyAgNyAyMTo0NTo1MiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBkYnhyZWFkLmM6ICBEb24ndCBpbmNsdWRlIHBhcmFtLmggb3Igc3lzL2ZpbGUuaC4KKwkqIChkYnhfc3ltZmlsZV9yZWFkKTogIERldGVybWluZSBzeW1maWxlX3JlbG9jYXRhYmxlIGZyb20gYmZkCisJZmxhZ3MgaW5zdGVhZCBvZiBmaWxlIGV4dGVuc2lvbi4gIEFsc28gY2xlYW4gdXAgYSBsaXR0bGUgYml0LgorCitXZWQgQXVnICA3IDE3OjE4OjM3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGR3YXJmMnJlYWQuYyBkd2FyZnJlYWQuYyBleGVjLmMgaW5mY21kLmMgaW5mcnVuLmMgbWFpbi5jCisJbWRlYnVncmVhZC5jIG9zOWtyZWFkLmMgc291cmNlLmMgdG9wLmMgdXRpbHMuYzogIERvbid0CisJaW5jbHVkZSBwYXJhbS5oIG9yIHN5cy9maWxlLmggKG9yIHVuaXN0ZC5oIGluIHNvbWUgY2FzZXMpLgorCSogZGVmcy5oIGV4ZWMuYyBpbmZsb3cuYyByZW1vdGUtYXJyYXkuYyByZW1vdGUtZTcwMDAuYworCXNwYXJjbC10ZGVwLmMgdGVybWluYWwuaCB1dGlscy5jOiAgUmVwbGFjZSBhbGwgb2NjdXJhbmNlcyBvZgorCV9fV0lOMzJfXywgV0lOR0RCLCBXSU4zMiwgZXRjLi4uIHdpdGggX1dJTjMyLgorCSogbWFpbi5jOiAgUmVtb3ZlICNpZm5kZWYgV0lOR0RCIGFyb3VuZCBvcHRpb24gcHJvY2Vzc2luZy4gIEZpeAorCWJ1ZyB3aXRoIHBhc3NpbmcgYXJnYz09MCBhbmQgYXJndj09TlVMTCB0byBnZXRvcHQuCisJKiAobWFpbikgUmVtb3ZlIGNhbGxzIHRvIGFjY2VzcygpIGJlZm9yZSBzb3VyY2VfY29tbWFuZC4gIExldAorCXNvdXJlX2NvbW1hbmQgaGFuZGxlIGFjY2VzcyBlcnJvcnMuCisJKiBtYWludC5jIChtYWludGVuYW5jZV9kdW1wX21lKTogICNpZmRlZiBvdXQgZm9yIF9XSU4zMi4KKwkqIHN5bXRhYi5jIChvcGVyYXRvcl9jaGFycyk6ICBNYWtlIHRoaXMgZ2xvYmFsIGZvciB3aW5nZGIuCisJKiB0b3AuYyAoZGlzY29ubmVjdCk6ICAjaWZkZWYgb3V0IGZvciBfV0lOMzIuCisJKiAoc291cmNlX2NvbW1hbmQpOiAgSWYgZ290IGFuIGVycm9yIGFuZCBmcm9tX3R0eSwgdGhlbiBjYWxsIHByaW50CisJZXJyb3IsIGVsc2UganVzdCByZXR1cm4gcXVpZXRseS4KKwkqIHV0aWxzLmMgKGZhdGFsX2R1bXBfY29yZSk6ICBDYW4ndCBraWxsIG91cnNlbHZlcyB1bmRlciB3aW5kb3dzLgorCUp1c3QgZXhpdC4KKwkqIChwb2xscXVpdCBub3RpY2VfcXVpdCk6ICAjaWZkZWYgb3V0IHN0dWZmIHRoYXQgZG9lc24ndCBleGlzdAorCXVuZGVyIHdpbmRvd3MuIAorCitXZWQgQXVnICA3IDA5OjU5OjE5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3BhL3RtLWhwcGEuaCAoRVhUUkFDVF9SRVRVUk5fVkFMVUUpOiBUd2VhayBmb3IKKwlzdHJ1Y3R1cmVzID4gNCBieXRlcyBpbiBzaXplLgorCisJKiB2YWxvcHMuYyAoY2FsbF9mdW5jdGlvbl9ieV9oYW5kKTogSGFuZGxlIGFsaWduaW5nIHN0YWNrcyB0aGF0CisJZ3JvdyB1cCBjb3JyZWN0bHkuCisJKiBjb25maWcvcGEvdG0taHBwYS5oIChVU0VfU1RSVUNUX0NPTlZFTlRJT04pOiBEZWZpbmUuCisJKFNUQUNLX0FMSUdOKTogRGVmaW5lLgorCSogaHBwYS10ZGVwLmMgKGhwcGFfYWxpZ25vZik6IERvbid0IGRlbWFuZCBhIG1pbnVtaW0gdHdvIGJ5dGUKKwlhbGlnbm1lbnQgb24gc3RydWN0cy91bmlvbnMuCisJCitTdW4gQXVnICA0IDE2OjIyOjQyIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWcvcG93ZXJwYy9ubS1haXguaCAoUFRSQUNFX0FSRzNfVFlQRSk6IERlZmluZSB0byAiaW50ICoiLAorCXdoaWNoIGlzIHRoZSBkb2N1bWVudGVkIHR5cGUgdW5kZXIgYXQgbGVhc3QgQUlYIDMgYW5kIEFJWCA0LgorCQorU2F0IEF1ZyAgMyAwNDowMjo0NiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2FscGhhL2FscGhhLW9zZjMubWggKFhNX0ZJTEUpOiBDaGFuZ2UgZnJvbSB4bS1hbHBoYS5oIHRvCisJeG0tYWxwaGFvc2YuaC4KKwkoTU1BTExPQ19DRkxBR1MpOiBEZWZpbmUgTk9fTU1DSEVDSyB0byBub3QgaW5zdGFsbCBjb25zaXN0ZW5jeQorCWNoZWNrcy4KKworVGh1IEF1ZyAgMSAxMDoxMTozNCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL21pcHMvdG0tbWlwcy5oIChUTV9NSVBTX0gpOiBFbmNsb3NlIGZpbGUgY29udGVudHMgaW4KKwl0aGlzLCBkZWZpbmUgd2hlbiBjb250ZW50cyBhcmUgaW5jbHVkZWQuCisJKG1pcHNfcmVhZF9wcm9jZXNzb3JfdHlwZSk6IEFkZCBwcm90b3R5cGUuCisJKiBjb25maWcvbWlwcy94bS1taXBzLmg6IFJlbW92ZSBzdHJkdXAgZGVjbCwgbm93IGluIGdkYl9zdHJpbmcuaAorCSogbWRlYnVncmVhZC5jIChlY29mZl9yZWxvY2F0ZV9lZmkpOiBBZGQgcHJvdG90eXBlLgorCShmaXh1cF9zaWd0cmFtcCk6IE9ubHkgbmVlZGVkIHdoZW4gVE1fTUlQU19IIGlzIGRlZmluZWQuCisKK1dlZCBKdWwgMzEgMjA6MjE6MjQgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHJzNjAwMC1uYXQuYyAoYWRkX3ZtYXApOiBSZXR1cm4gMCB0byBjYWxsZXIgcmF0aGVyIHRoYW4gcmFuZG9tIHZhbHVlLgorCSh2bWFwX2xkaW5mbyk6IEVuc3VyZSBnb3RfZXhlY19maWxlIGlzIG5vdCB1c2VkIHVuaW5pdGlhbGl6ZWQuCisJKGZldGNoX2NvcmVfcmVnaXN0ZXJzKTogQWRkIHByb3RvdHlwZS4KKwkodm1hcF9zeW10YWIpOiBEaXR0by4KKwkob2JqZmlsZV9zeW1ib2xfYWRkKTogRGl0dG8uCisJKGFkZF92bWFwKTogRGl0dG8uCisJKHZtYXBfbGRpbmZvKTogRGl0dG8uCisJKHZtYXBfZXhlYyk6IERpdHRvLgorCitUdWUgSnVsIDMwIDE3OjU3OjQ2IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogc3RhYnNyZWFkLmMgKGdldF9zdWJzdHJpbmcpOiBEZWNsYXJlIHNlY29uZCBhcmcgYXMgaW50LgorCisJKiByZW1vdGUtZXMuYzogSW5jbHVkZSBnZGJfc3RyaW5nLmggYWZ0ZXIgZGVmcy5oLgorCitNb24gSnVsIDI5IDIxOjEzOjIwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiByczYwMDAtdGRlcC5jIChwdXNoX2FyZ3VtZW50cyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgInBjIi4KKwkoYnJhbmNoX2Rlc3QpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlICJvZmZzZXQiLgorCShwb3BfZHVtbXlfZnJhbWUpOiBBZGQgcHJvdG90eXBlIGFuZCBtYWtlIHN0YXRpYy4KKwkocHVzaF9hcmd1bWVudHMpOiBHdWFyZCBhZ2FpbnN0IHVzaW5nIGxlbiB1bmluaXRpYWxpemVkLgorCShwdXNoX2FyZ3VtZW50cyk6IEd1YXJkIGFnYWluc3QgdXNpbmcgYXJnIHVuaW5pdGlhbGl6ZWQuCisJKGZyYW1lX3NhdmVkX3BjKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAiZnJhbWVsZXNzIi4KKwkoZnJlZV9sb2FkaW5mbyk6IElmZGVmIG91dCB1bnVzZWQgZnVuY3Rpb24uCisKKwkqIHhjb2ZmcmVhZC5jIChjb21wYXJlX2x0ZSk6IENoYW5nZSBwcm90b3R5cGUgYW5kIGZ1bmN0aW9uIHRvCisJYmUgY29ycmVjdCB0eXBlIGZvciBwYXNzaW5nIHRvIHFzb3J0LgorCShhZGRfc3RhYl90b19saXN0KTogSWZkZWYgb3V0IHVudXNlZCBmdW5jdGlvbiBhbmQgcHJvdG90eXBlLgorCShjb21wYXJlX2x0ZSk6IEFkZCBwcm90b3R5cGUKKwkoYXJyYW5nZV9saW5ldGFibGUpOiBEaXR0by4KKwkocmVjb3JkX2luY2x1ZGVfYmVnaW4pOiBEaXR0by4KKwkocmVjb3JkX2luY2x1ZGVfZW5kKTogRGl0dG8uCisJKHByb2Nlc3NfbGluZW5vcyk6IERpdHRvLgorCSh4Y29mZl9uZXh0X3N5bWJvbF90ZXh0KTogRGl0dG8uCisJKHNjYW5feGNvZmZfc3ltdGFiKTogRGl0dG8uCisJKHhjb2ZmX2luaXRpYWxfc2Nhbik6IERpdHRvLgorCisJKiBtaXBzLXRkZXAuYyAobWlwc19yZWFkX3Byb2Nlc3Nvcl90eXBlKTogQWRkIHBhcmVucyBhcm91bmQKKwliaXR3aXNlLWFuZCBvcGVyYW5kcyBpbiBjb21wYXJpc29uOyBwcmV2aW91cyBleHByZXNzaW9uIGFsd2F5cworCWV2YWx1YXRlZCB0byAwIGJlY2F1c2Ugb2YgZXF1YWxpdHkgY29tcGFyaXNvbiBvZiB0d28gY29uc3RhbnRzLgorCisJKiByczYwMDAtdGRlcC5jIChza2lwX3Byb2xvZ3VlKTogQWRkIG1pc3NpbmcgcGFyZW5zIGFyb3VuZAorCW9wZXJhbmRzIG9mIGxvZ2ljYWwtb3Igc28gdGhhdCBmaXJzdCBvcGVyYW5kIGRvZXMgbm90IGJpbmQKKwl0byBwcmV2aW91cyBsb2dpY2FsLWFuZC4KKworCSogY29uZmlndXJlLmluOiBFeHBhbmQgImxvbmcgbG9uZyIgdGVzdCB0byBpbmNsdWRlIGNvZGUgdGhhdCB0cmlnZ2VycworCWtub3duIHByb2JsZW0gb24gSFBVWCB3aXRoIG5hdGl2ZSBjb21waWxlci4KKwkoY29uZmlndXJlKTogUmVnZW5lcmF0ZWQuCisKK01vbiBKdWwgMjkgMTg6MTI6MjcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzb21zb2xpYi5jIChzb21fc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiBEb24ndAorCXdhcm4gaWYgX19kX3BpZCBjYW4ndCBiZSBmb3VuZC4KKworU3VuIEp1bCAyOCAxMDo0NjozOSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL21pcHMvdG0tbWlwcy5oIChzdHJ1Y3QgZnJhbWVfaW5mbyk6IEZvcndhcmQgZGVjbC4KKwkoc3RydWN0IHR5cGUpOiBEaXR0by4KKwkoc3RydWN0IHZhbHVlKTogRGl0dG8uCisKKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaCAoc2lndHJhbXBfYWRkcmVzcyk6IE1vdmUgZXh0ZXJuIGRlY2wKKyAJZnJvbSBtaXBzLXRkZXAuYyB0byBoZXJlLgorCShzaWd0cmFtcF9lbmQpOiBEaXR0by4KKwkoZml4dXBfc2lndHJhbXApOiBEaXR0by4KKworCSogY29uZmlnL21pcHMvdG0tbWlwcy5oIChpbml0X2V4dHJhX2ZyYW1lX2luZm8pOiBBZGQgcHJvdG90eXBlLgorCShtaXBzX2ZyYW1lX2NoYWluKTogRGl0dG8uCisJKG1pcHNfc3RlcF9za2lwc19kZWxheSk6IERpdHRvLgorCShtaXBzX2ZyYW1lX3NhdmVkX3BjKTogRGl0dG8uCisJKG1pcHNfZmluZF9zYXZlZF9yZWdzKTogRGl0dG8uCisJKG1pcHNfZnJhbWVfbnVtX2FyZ3MpOiBEaXR0by4KKwkobWlwc19wb3BfZnJhbWUpOiBEaXR0by4KKwkobWlwc19leHRyYWN0X3JldHVybl92YWx1ZSk6IERpdHRvLgorCShtaXBzX3N0b3JlX3JldHVybl92YWx1ZSk6IERpdHRvLgorCShtaXBzX3B1c2hfZHVtbXlfZnJhbWUpOiBEaXR0by4KKwkobWlwc19wdXNoX2FyZ3VtZW50cyk6IERpdHRvLgorCShtaXBzX2RvX3JlZ2lzdGVyc19pbmZvKTogRGl0dG8uCisJKGVjb2ZmX3JlbG9jYXRlX2VmaSk6IERpdHRvLgorCShlY29mZl9yZWxvY2F0ZV9lZmkpOiBEaXR0by4KKwkqIGlyaXg0LW5hdC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6IEFkZCBwcm90b3R5cGUuCisJKiBtaXBzLXRkZXAuYyAocmVhZF9uZXh0X2ZyYW1lX3JlZyk6IEFkZCBwcm90b3R5cGUKKwkoaGV1cmlzdGljX3Byb2Nfc3RhcnQpOiBEaXR0by4KKwkoaGV1cmlzdGljX3Byb2NfZGVzYyk6IERpdHRvLgorCShtaXBzX3ByaW50X3JlZ2lzdGVyKTogRGl0dG8uCisJKiBjb25maWcvbWlwcy9ubS1pcml4NS5oIChwcm9jZnNfc2V0X3dhdGNocG9pbnQpOiBBZGQgcHJvdG90eXBlLgorCShwcm9jZnNfc3RvcHBlZF9ieV93YXRjaHBvaW50KTogRGl0dG8uCisJKiBjb25maWcvbWlwcy9ubS1pcml4NC5oIChwcm9jZnNfc2V0X3dhdGNocG9pbnQpOiBBZGQgcHJvdG90eXBlLgorCShwcm9jZnNfc3RvcHBlZF9ieV93YXRjaHBvaW50KTogRGl0dG8uCisJKiBjb25maWcvYWxwaGEvdG0tYWxwaGEuaCAoZWNvZmZfcmVsb2NhdGVfZWZpKTogQWRkIHByb3RvdHlwZS4KKwkoc3RydWN0IHN5bWJvbCk6IEFkZCBmb3J3YXJkIGRlY2wgZm9yIHByb3RvdHlwZS4KKworCSogYnJlYWtwb2ludC5jIChpbnRlcm5hbF9icmVha3BvaW50X251bWJlcik6IE9ubHkgbmVlZGVkIGlmCisJR0VUX0xPTkdKTVBfVEFSR0VUIG9yIFNPTElCX0FERCBpcyBkZWZpbmVkLgorCisJKiBvYmpmaWxlcy5jIChlY29mZl9yZWxvY2F0ZV9lZmkpOiBSZW1vdmUgcHJvdG90eXBlLgorCitTYXQgSnVsIDI3IDE3OjQ3OjM1IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZCB0ZXN0IGZvciAibG9uZyBsb25nIiBzdXBwb3J0LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYuCisJKiBhY2NvbmZpZy5oOiBBZGQgQ0NfSEFTX0xPTkdfTE9ORworCSogY29uZmlnLmluOiBSZWdlbmVyYXRlIHdpdGggYXV0b2hlYWRlci4KKwkqIGNvbmZpZy9taXBzL3RtLW1pcHM2NC5oIChGT1JDRV9MT05HX0xPTkcpOiBSZW1vdmUKKwkqIGNvbmZpZy9zcGFyYy90bS1zcDY0LmggKENDX0hBU19MT05HX0xPTkcpOiBSZW1vdmUuCisJKiBjb25maWcvbWlwcy90bS12cjQzMDBlbC5oIChDQ19IQVNfTE9OR19MT05HKTogUmVtb3ZlLgorCSogY29uZmlnL21pcHMvdG0tdnI0MzAwLmggKENDX0hBU19MT05HX0xPTkcpOiBSZW1vdmUuCisJKiBjb25maWcvbWlwcy94bS1pcml4NS5oIChDQ19IQVNfTE9OR19MT05HKTogUmVtb3ZlCisJKFBSSU5URl9IQVNfTE9OR19MT05HKTogUmVtb3ZlLgorCShGT1JDRV9MT05HX0xPTkcpOiBSZW1vdmUuCisJKiBjb25maWcvcG93ZXJwYy94bS1haXguaCAoVUlOVF9NQVgpOiBVbmRlZiBhbmQgdXNlIGdkYidzIHZlcnNpb24uCisJKiBjb25maWcvY29udmV4L3htLWNvbnZleC5oIChDQ19IQVNfTE9OR19MT05HKTogUmVtb3ZlCisJKFBSSU5URl9IQVNfTE9OR19MT05HKTogUmVtb3ZlLgorCSogY29uZmlnL3htLW5ic2QuaCAoQ0NfSEFTX0xPTkdfTE9ORyk6IFJlbW92ZS4KKwkoUFJJTlRGX0hBU19MT05HX0xPTkcpOiBSZW1vdmUuCisJKiBjb25maWcvcGEvdG0taHBwYS5oIChHRVRfRklFTEQpOiBQdXQgcGFyZW5zIGFyb3VuZAorCXN1YnRyYWN0aW9uIGluc2lkZSBzaGlmdC4gIFB1dCBwYXJlbnMgYXJvdW5kIHN1YnRyYWN0aW9uCisJaW4gb3BlcmFuZCBvZiBiaXR3aXNlIGFuZC4KKwkoc3RydWN0IGZyYW1lX2luZm8pOiBGb3J3YXJkIGRlY2xhcmUKKyAJaWYgX19TVERDX18gZGVmaW5lZC4KKwkoZnJhbWVfc2F2ZWRfcmVncyk6IERpdHRvLgorCShzdHJ1Y3QgdmFsdWUpOiBEaXR0by4KKwkoc3RydWN0IHR5cGUpOiBEaXR0by4KKwkoc3RydWN0IGluZmVyaW9yX3N0YXR1cyk6IERpdHRvLgkKKwkoaW5pdF9leHRyYV9mcmFtZV9pbmZvKTogQWRkIHByb3RvdHlwZS4KKwkoc2tpcF9wcm9sb2d1ZSk6IERpdHRvLgorCShmcmFtZWxlc3NfZnVuY3Rpb25faW52b2NhdGlvbik6IERpdHRvLgorCShmcmFtZV9jaGFpbik6IERpdHRvLgorCShmcmFtZV9jaGFpbl92YWxpZCk6IERpdHRvLgorCShzYXZlZF9wY19hZnRlcl9jYWxsKTogRGl0dG8uCisJKGhwcGFfZml4X2NhbGxfZHVtbXkpOiBEaXR0by4JCisJKGhwcGFfcHVzaF9hcmd1bWVudHMpOiBEaXR0by4KKwkocGFfZG9fcmVnaXN0ZXJzX2luZm8pOiBEaXR0by4KKwkoaW5fc29saWJfY2FsbF90cmFtcG9saW5lKTogRGl0dG8uCisJKGluX3NvbGliX3JldHVybl90cmFtcG9saW5lKTogRGl0dG8uCisJKHB1c2hfZHVtbXlfZnJhbWUpOiBEaXR0by4KKwkqIGNvbnZleC10ZGVwLmMgKGRlY291dCk6IFVzZSBwcmludF9sb25nZXN0IHJhdGhlciB0aGFuCisJZnByaW50Zl9maWx0ZXJlZC4KKwkqIGRlZnMuaDogUmVtb3ZlIHVzZSBvZiBGT1JDRV9MT05HX0xPTkcgYW5kIF9fR05VQ19fIHRvIHNldAorCUNDX0hBU19MT05HX0xPTkcuCisJKElOVF9NSU4pOiBGaXggc28gaXQgd29ya3MgY29ycmVjdGx5IHdoZW4gYXNzaWduZWQgdG8gYSBsb25nIGxvbmcuCisJKiB2YWxwcmludC5jIChsb25nZXN0X3RvX2ludCk6IFJld3JpdGUgdG8gcmVtb3ZlIGRlcGVuZGVuY2UKKwlvbiBJTlRfTUlOIGFuZCBJTlRfTUFYLgorCShwcmludF9sb25nZXN0KTogUmV3cml0ZSB0aGUgY29kZSB0aGF0IGZhbGxzIGJhY2sgdG8gc3ludGhlc2l6ZWQKKwloZXggb3V0cHV0IHdoZW4gTE9OR0VTVCB2YWx1ZSBpcyBub3QgcmVwcmVzZW50YWJsZSBhcyBpbiBhIGxvbmcgYW5kCisgCXByaW50ZiBkb2Vzbid0IHN1cHBvcnQgcHJpbnRpbmcgbG9uZyBsb25ncy4KKwkqIGNoLXZhbHByaW50LmMgKGNoaWxsX3ZhbF9wcmludCk6IENhc3QgMm5kIGFyZyBvZgorCWNoaWxsX3ByaW50X3R5cGVfc2NhbGFyIHRvIExPTkdFU1QuCisJY2hpbGxfcHJpbnRfdHlwZV9zY2FsYXIpOiBNYWtlIHN0YXRpYyBhbmQgYWRkIHByb3RvdHlwZS4KKwkqIGhwcGEtdGRlcC5jIChnZXRfZmllbGQpOiBJZmRlZiBvdXQgdW51c2VkIGZ1bmN0aW9uLgorCShzZXRfZmllbGQpOiBEaXR0by4KKwkoZXh0cmFjdF8zKTogRGl0dG8uCisJKGV4dHJhY3RfNV9zdG9yZSk6IERpdHRvLgorCShleHRyYWN0XzExKTogRGl0dG8uCisJKGV4dHJhY3RfMTIpOiBEaXR0by4KKwkoZGVwb3NpdF8xNyk6IERpdHRvLgorCShleHRyYWN0XzE0KTogQ29udmVydCB0byBzdGF0aWMgYW5kIGFkZCBwcm90b3R5cGUuCisJKGRlcG9zaXRfMTQpOiBEaXR0by4KKwkoZXh0cmFjdF8yMSk6IERpdHRvLgorCShkZXBvc2l0XzIxKTogRGl0dG8uCisJKGV4dHJhY3RfMTcpOiBEaXR0by4KKwkoZXh0cmFjdF81cl9zdG9yZSk6IERpdHRvLgorCShleHRyYWN0XzVSX3N0b3JlKTogRGl0dG8uCisJKGV4dHJhY3RfNV9sb2FkKTogRGl0dG8uCisJKGZpbmRfcHJvY19mcmFtZXNpemUpOiBEaXR0by4KKwkoZmluZF9kdW1teV9mcmFtZV9yZWdzKTogRGl0dG8uCisJKHNpZ25fZXh0ZW5kKTogRGl0dG8uCisJKGZpbmRfdW53aW5kX2VudHJ5KTogQWRkIHByb3RvdHlwZS4KKwkoZmluZF9yZXR1cm5fcmVnbnVtKTogRGl0dG8uCisJKHVud2luZF9jb21tYW5kKTogRGl0dG8uCisJKGZpbmRfZHVtbXlfZnJhbWVfcmVncyk6IEFkZCBwYXJlbnMgYXJvdW5kIHN1YnRyYWN0aW9uIGluIG9wZXJhbmQKKwlvZiBiaXR3aXNlLWFuZC4KKwkoc2tpcF9wcm9sb2d1ZSk6IEFkZCBwYXJlbnMgYXJvdW5kIG9wZXJhbmRzIG9mIGxvZ2ljYWwtYW5kIGluc2lkZQorCW9wZXJhbmQgb2YgbG9naWNhbC1vci4KKwkoc2lnbl9leHRlbmQpOiBBZGQgcGFyZW5zIGFyb3VuZCBvcGVyYW5kcyBvZiBzdWJ0cmFjdGlvbiBpbnNpZGUKKwlvcGVyYW5kIG9mIHNoaWZ0LgorCShsb3dfc2lnbl9leHRlbmQpOiBEaXR0by4KKwkqIHRvcC5jIChmaWxlbmFtZV9jb21wbGV0ZXIpOiBDb252ZXJ0IG9sZCBzdHlsZSBkZWNsIG9mCisJZmlsZW5hbWVfY29tcGxldGlvbl9mdW5jdGlvbiBpbnRvIHByb3RvdHlwZS4KKwkqIGYtbGFuZy5jIChwYXRjaF9jb21tb25fZW50cmllcyk6IElmZGVmIG91dCB1bnVzZWQgZnVuY3Rpb24uCisJKiBzdGFic3JlYWQuYyAocmVhZF9jZnJvbnRfYmFzZWNsYXNzZXMpOiBSZW1vdmUgdW51c2VkIGxvY2FsCisJdmFyaWFibGUgIm1zZ19ub3Rlcm0iLgorCShyZXNvbHZlX2Nmcm9udF9jb250aW51YXRpb24pOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlICJmaXAiLgorCShyZWFkX3R5cGUpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHh0eXBlbnVtcy4KKwkocmVhZF9jZnJvbnRfc3RhdGljX2ZpZWxkcyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgImkiLgorCShyZWFkX2Nmcm9udF9zdGF0aWNfZmllbGRzKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAibmZpZWxkcyIuCisJKHJlYWRfY2Zyb250X21lbWJlcl9mdW5jdGlvbnMpOiBBZGQgbWlzc2luZyBjb21tZW50IHRlcm1pbmF0b3IuCisJKHJlYWRfY2Zyb250X3N0YXRpY19maWVsZHMpOiBSZXR1cm4gMSByYXRoZXIgdGhhbiByYW5kb20gdmFsdWUuCisJKHJlYWRfY2Zyb250X2Jhc2VjbGFzc2VzKTogRGl0dG8uCisJKHJlYWRfY2Zyb250X2Jhc2VjbGFzc2VzKTogRGl0dG8uCisJKHJlYWRfY2Zyb250X2Jhc2VjbGFzc2VzKTogRGl0dG8uCisJKiBzb21zb2xpYi5jIChzb21fc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiBSZW1vdmUgdW51c2VkCisJdmFyaWFibGUgInUiLgorCShzb21fc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlCisJc2hhZG93X2NvbnRlbnRzLgorCShsYW5ndWFnZS5oKTogQWRkIGZvciBuZWVkZWQgcHJvdG90eXBlcy4KKwkoc29tX3NvbGliX3NoYXJlZGxpYnJhcnlfY29tbWFuZCk6IEFkZCBwcm90b3R5cGUuCisJKiBocHJlYWQuYzogKGhwcmVhZF9yZWFkX2FycmF5X3R5cGUpOiBBZGQgcHJvdG90eXBlLgorCSogc29tcmVhZC5jIChocHJlYWRfYnVpbGRfcHlzbXRhYnMpOiBBZGQgcHJvdG90eXBlLgorCShocHJlYWRfc3ltZmlsZV9maW5pc2gpOiBEaXR0by4KKwkoaHByZWFkX3N5bWZpbGVfaW5pdCk6IERpdHRvLgorCSogaHBwYWgtbmF0LmMgKGZldGNoX3JlZ2lzdGVyKTogQ29udmVydCBvbGQgc3R5bGUgZGVjbAorCXRvIHByb3RvdHlwZS4KKwkoZ2RiY29yZS5oKTogSW5jbHVkZSBmb3IgbmVlZGVkIHByb3RvdHlwZXMuCisJKGZldGNoX3JlZ2lzdGVyKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAibWVzcyIuCisJKiByZW1vdGUtcGEuYyAoZ2V0X29mZnNldHMpOiBJZmRlZiBvdXQgdW51c2VkIGZ1bmN0aW9uLgorCShyZW1vdGVfc3RhcnRfcmVtb3RlKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAidGltZW91dCIuCisJKGJvb3RfYm9hcmQpOiBBZGQgcHJvdG90eXBlLgorCShyZWFhZF9mcmFtZSk6IEFkZCBwcm90b3R5cGUuCisJKGdldHBrdCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgImJwIi4KKwkocmVtb3RlX2tpbGwpOiBBZGQgcHJvdG90eXBlLgorCShyZW1vdGVfbW91cm4pOiBBZGQgcHJvdG90eXBlLgorCShyZW1vdGVfaW5zZXJ0X2JyZWFrcG9pbnQpOiBBZGQgcHJvdG90eXBlLgorCShyZW1vdGVfcmVtb3ZlX2JyZWFrcG9pbnQpOiBBZGQgcHJvdG90eXBlLgorCSogdmFsb3BzLmMgKHZhbHVlX3B1c2gpOiBPbmx5IHVzZSBpZiBQVVNIX0FSR1VNRU5UUyBpcyBub3QgZGVmaW5lZC4KKwkqIGluZmNtZC5jIChkb19yZWdpc3RlcnNfaW5mbyk6IE9ubHkgbmVlZCBwcm90b3R5cGUgaWYKKwlET19SRUdJU1RFUlNfSU5GTyBpcyBub3QgZGVmaW5lZC4KKwkoYnJlYWtwb2ludF9hdXRvX2RlbGV0ZV9jb250ZW50cyk6IE9ubHkgbmVlZCBpZgorCUNBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQgaXMgZGVmaW5lZC4KKworU2F0IEp1bCAyNyAwODo0OTo0OSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogeGNvZmZyZWFkLmMgKHhjb2ZmX2VuZF9wc3ltdGFiKTogQWRkIHRleHRsb3dfbm90X3NldCBwYXJhbWV0ZXIuCisJKEVORF9QU1lNVEFCKTogRGl0dG8uCisJKHNjYW5feGNvZmZfc3ltdGFiKTogQ2FsbCB4Y29mZl9lbmRfcHN5bXRhYiB3aXRoIHRleHRsb3dfbm90X3NldC4KKworRnJpIEp1bCAyNiAxNDowNzozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHByaW50Y21kLmMgKF9pbml0aWFsaXplX3ByaW50Y21kKTogSW5pdGlhbGl6ZQorCXRtX3ByaW50X2luc25faW5mby5mbGF2b3VyLgorCitUaHUgSnVsIDI1IDE5OjQxOjMxIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoc2NtLXZhbHByaW50Lm8pOiBEZXBlbmRzIHVwb24gZ2RiY29yZV9oLgorCShhcm0tdGRlcC5vKTogRGl0dG8uCisJKGRjYWNoZS5vKTogRGl0dG8uCisJKGkzODZseS10ZGVwLm8pOiBEaXR0by4KKwkoaTk2MC10ZGVwLm8pOiBEaXR0by4KKwkobTY4ay10ZGVwLm8pOiBEaXR0by4KKwkobmluZHktdGRlcC5vKTogRGl0dG8uCisJKHNjbS1sYW5nLm8pOiBEaXR0by4KKwkodzY1LXRkZXAubyk6IERpdHRvLgorCSh6OGstdGRlcC5vKTogRGl0dG8uCisJKG02OGstdGRlcC5vKTogRGVwZW5kcyB1cG9uIHZhbHVlX2ggYW5kIGdkYl9zdHJpbmcuaAorCShtMi12YWxwcmludC5vKTogRGVwZW5kcyB1cG9uIG0yLWxhbmcuaC4KKwkoc3BhcmMtdGRlcC5vKTogRGVwZW5kcyB1cG9uIGdkYl9zdHJpbmcuaAorCSh2YWxwcmludC5vKTogRGVwZW5kcyB1cG9uIHZhbHByaW50LmgKKwkKKwkqIHJlbW90ZS1lNzAwMC5jIChub3RpY2VfcXVpdCk6IFJlbW92ZSBwcm90b3R5cGUuCisJKiB0b3AuYyAoaW5pdGlhbGl6ZV90YXJnZXRzKTogUmVtb3ZlIHByb3RvdHlwZSwgbm93IGluIHRhcmdldC5oLgorCSogc3RhYnNyZWFkLmMgKHJlc29sdmVfY2Zyb250X2NvbnRpbnVhdGlvbik6IFJlbW92ZSBwcm90b3R5cGUuCisJKiBkYnhyZWFkLmMgKHJlc29sdmVfY2Zyb250X2NvbnRpbnVhdGlvbik6IFJlbW92ZSBwcm90b3R5cGUuCisJKiBzeW1maWxlLmggKHNldF9kZW1hbmdsaW5nX3N0eWxlKTogUmVtb3ZlIHByb3RvdHlwZS4KKwkqIGNvbmZpZy90bS1zeXN2NC5oIChpbl9wbHRfc2VjdGlvbik6IFJlbW92ZSBwcm90b3R5cGUsIGluIG9iamZpbGVzLmguCisJKiBjb25maWcvc3BhcmMvdG0tc3BhcmMuaCAoc2luZ2xlX3N0ZXApOiBSZW1vdmUgZXh0ZXJuIGRlY2wsIG5vdyBpbgorIAl0YXJnZXQuaC4KKwkqIGNvbmZpZy9hcmMvdG0tYXJjLmggKG9uZV9zdGVwcGVkLCBzaW5nbGVfc3RlcCk6IFJlbW92ZSBleHRlcm4gZGVjbHMsCisgCW5vdyBpbiB0YXJnZXQuaC4KKwkqIHNlci11bml4LmMgKGhhcmR3aXJlX3Jlc3RvcmUpOiBSZW1vdmUgb2Jzb2xldGUgcHJvdG90eXBlLgorCSogc3BhcmMtdGRlcC5jIChzaW5nbGVfc3RlcCk6IFJlbW92ZSBmb3J3YXJkIGRlY2wgb2YgaXNicmFuY2guCisJKiBzY20tbGFuZy5jIChmaW5kX2Z1bmN0aW9uX2luX2luZmVyaW9yKTogUmVtb3ZlIHByb3RvdHlwZS4KKwkodmFsdWVfYWxsb2NhdGVfc3BhY2VfaW5faW5mZXJpb3IpOiBEaXR0by4KKwkqIGluZnJ1bi5jICh3cml0ZV9wY19waWQpOiBSZW1vdmUgcHJvdG90eXBlLCBub3cgaW4gaW5mZXJpb3IuaC4KKwkqIGRlZnMuaCAoc3RyY2hyKTogUmVtb3ZlIGRlY2xhcmF0aW9ucywgdGhleSBhcmUgZGVjbGFyZWQgaW4KKyAJZ2RiX3N0cmluZy5oIGFsc28uCisJKHN0cnJjaHIpOiBEaXR0by4KKyAJKHN0cnN0cik6IERpdHRvLgorIAkoc3RydG9rKTogRGl0dG8uCisgCShzdHJlcnJvcik6IERpdHRvLgorCSogZi12YWxwcmludC5jIChmNzdfcHJpbnRfYXJyYXlfMSk6IFJlbW92ZSBleHRyYSBhcmcgdGhhdCB3YXMgYmVpbmcKKwlwYXNzZWQgdG8gZjc3X3ByaW50X2FycmF5XzEuCisJKiBnZGJ0eXBlcy5jIChhZGRfbmFtZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIGxlbnN0cmxlbiBhbmQgbGVuc3RyLgorCSogc2NtLWV4cC5jIChzY21faXN0cjJpbnQpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlICJqIi4KKwkoc2NtX3BhcnNlKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAic3RyIi4KKwkqIGhwMzAwdXgtbmF0LmMgKHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVyKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZQorIAkiYnVmIi4KKwkoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogUmVtb3ZlIHVubmVjZXNzYXJ5IGRlY2wgInJlZ2lzdGVycyIuCisJKiBtNjhrLXRkZXAuYyAobTY4a19wb3BfZnJhbWUpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlICJmaSIuCisJKiBzY20tbGFuZy5jIChzY21fZ2V0X2ZpZWxkKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAidmFsIi4KKwkoc2NtX2xvb2t1cF9uYW1lKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAic3ltdmFsIi4KKwkqIG9iamZpbGVzLmMgKG1hcF90b19maWxlKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSAidGVtcGZkIi4KKwkqIHByb2Nmcy5jIChkb19hdHRhY2gsIGRvX2RldGFjaCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgInJlc3VsdCIuCisJKGxhc3RfcmVzdW1lX3BpZCk6IFJlbW92ZSB1bnVzZWQgc3RhdGljIHZhcmlhYmxlLgorCSogYWxwaGEtdGRlcC5jIChhbHBoYV9saW51eF9zaWd0cmFtcF9vZmZzZXQpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlCisJInJlcyIuCisJKiBvYmpmaWxlcy5jIChtYXBfdG9fYWRkcmVzcyk6IFJlbW92ZSB1bnVzZWQgZnVuY3Rpb24uCisJKiBmLXZhbHByaW50LmMgKHByaW50X21heCk6IFJlbW92ZSBleHRyYW5lb3VzIGV4dGVybiBkZWNsLAorIAlpbiB2YWxwcmludC5oLgorCShjYWxjX2Y3N19hcnJheV9kaW1zKTogUmVtb3ZlIGV4dHJhbmVvdXMgcHJvdG90eXBlLCBpbiBmLWxhbmcuaC4KKwkqIGNoLWV4cC5jICh3cml0ZV9sb3dlcl91cHBlcl92YWx1ZSk6IFJlbW92ZSBwcm90b3R5cGUgZm9yCisJdHlwZV9sb3dlcl91cHBlci4KKworCSogZ2RidHlwZXMuYyAoY2Zyb250X21hbmdsZV9uYW1lKTogI2lmZGVmIG91dCB1bnVzZWQgZnVuY3Rpb24uCisJKiBjaC1leHAuYyAocGFyc2VfbW9kZV9jYWxsKTogRGl0dG8uCisJKiBmLXZhbHByaW50LmMgKHRoZXJlX2lzX2FfdmlzaWJsZV9jb21tb25fbmFtZWQpOiBEaXR0by4KKwkqIGYtbGFuZy5jIChjbGVhcl9mdW5jdGlvbl9saXN0KTogRGl0dG8uCisJKGdldF9iZl9mb3JfZmNuKTogRGl0dG8uCisgCShjbGVhcl9iZl9saXN0KTogRGl0dG8uCisgCShhZGRfY29tbW9uX2Jsb2NrKTogRGl0dG8uCisJKHBhdGNoX2FsbF9jb21tb25zX2J5X25hbWUpOiBEaXR0by4KKyAJKGZpbmRfZmlyc3RfY29tbW9uX25hbWVkKTogRGl0dG8uCisgCShhZGRfY29tbW9uX2VudHJ5KTogRGl0dG8uCisJKGFsbG9jYXRlX3NhdmVkX2Z1bmN0aW9uX25vZGUpOiBEaXR0by4KKyAJKGFsbG9jYXRlX3NhdmVkX2JmX25vZGUpOiBEaXR0by4KKwkoYWxsb2NhdGVfY29tbW9uX2VudHJ5X25vZGUpOiBEaXR0by4KKwkoYWxsb2NhdGVfc2F2ZWRfZjc3X2NvbW1vbl9ub2RlKTogRGl0dG8uCisJCisJKiBhcm0tdGRlcC5jIChnZGJjb3JlLmgpOiBJbmNsdWRlIGZvciBuZWNlc3NhcnkgcHJvdG90eXBlcy4KKwkqIGRjYWNoZS5jIChnZGJjb3JlLmgpOiBEaXR0by4KKwkqIGkzODZseS10ZGVwLmMgKGdkYmNvcmUuaCk6IERpdHRvLgorCSogaTk2MC10ZGVwLmMgKGdkYmNvcmUuaCk6IERpdHRvLgorCSogbTItdmFscHJpbnQuYyAobTItbGFuZy5oKTogRGl0dG8uCisJKiBtNjhrLXRkZXAuYyAoZ2RiY29yZS5oKTogRGl0dG8uCisJKHZhbHVlLmgpOiBEaXR0by4KKwkoZ2RiX3N0cmluZy5oKTogRGl0dG8uCisJKiBuaW5keS10ZGVwLmMgKGdkYmNvcmUuaCk6IERpdHRvLgorCSogc2NtLWxhbmcuYyAoZ2RiY29yZS5oKTogRGl0dG8uCisJKiBzY20tdmFscHJpbnQuYyAoZ2RiY29yZS5oKTogRGl0dG8uCisJKiB3NjUtdGRlcC5jIChnZGJjb3JlLmgpOiBEaXR0by4KKwkqIHo4ay10ZGVwLmMgKGdkYmNvcmUuaCk6IERpdHRvLgorCSogc3BhcmMtdGRlcC5jIChnZGJfc3RyaW5nLmgpOiBJbmNsdWRlLgorCSogdmFscHJpbnQuYyAodmFscHJpbnQuaCk6IEluY2x1ZGUuCisKKwkqIGNvbmZpZy94bS1seW54Lmg6IFJlbW92ZSBwYXJ0IG9mIGNvbW1lbnQgYWJvdXQgSU5UX01JTgorCXJlZGVmaW5lZCB3YXJuaW5ncyBmcm9tIGRlZnMuaCwgc2luY2UgSU5UX01JTiBkZWZpbmUgaW4KKwlkZWZzLmggaXMgbm93IHByb3RlY3RlZCBieSAjaWZuZGVmIElOVF9NSU4uCisJKiBjb25maWcvaTM4Ni94bS1pMzg2YnNkLmg6IERpdHRvLgorCSogY29uZmlnL202OGsveG0taHAzMDBic2QuaDogRGl0dG8uCisJKiBjb25maWcvbTY4ay94bS1uZXdzLmg6IERpdHRvLgorCisJKiBjb25maWcvcGEveG0taHBwYWguaCAoSU5UX01JTik6IFJlbW92ZSBib2d1cyBJTlRfTUlOCisJZGVmaW5pdGlvbiBhcyAweDgwMDAwMDAwLiAgVGhlIG1hY3JvIGluIGRlZnMuaCBpcyBiZXR0ZXIuCisJKiBjb25maWcvaTM4Ni94bS1pMzg2bTMuaCAoSU5UX01JTik6IERpdHRvLgorCSogY29uZmlnL2kzODYveG0taTM4Nm1hY2guaCAoSU5UX01JTik6IERpdHRvLgorCSogY29uZmlnL25zMzJrL3htLW5zMzJrbTMuaCAoSU5UX01JTik6IERpdHRvLgorCSogY29uZmlnL3BhL3htLWhwcGFiLmg6IERpdHRvLgorCisJKiBjb3JlLWFvdXQuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiBBZGQgcHJvdG90eXBlLgorCSogaHAzMDB1eC1uYXQuYyAoZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXIpOiBEaXR0by4KKwkoc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJfMSk6IERpdHRvLgorCShzdG9yZV9pbmZlcmlvcl9yZWdpc3Rlcik6IERpdHRvLgorCSogY29uZmlnL202OGsvdG0tbTY4ay5oIChmaW5kX3NhdmVkX3JlZ3MpOiBEaXR0by4KKwkqc2NtLXZhbHByaW50LmMgKGNfdmFsX3ByaW50KTogRGl0dG8uCisJKiBwcm9jZnMuYyAoYWRkX2ZkKTogRGl0dG8uCisJKHJlbW92ZV9mZCk6IERpdHRvLgorCSh3YWl0X2ZkKTogRGl0dG8uCisJKHNpZ2NvZGVuYW1lKTogRGl0dG8uCisJKHNpZ2NvZGVkZXNjKTogRGl0dG8uCisJKHByb2Nmc19raWxsX2luZmVyaW9yKTogRGl0dG8uCisJKHByb2Nmc194ZmVyX21lbW9yeSk6IERpdHRvLgorIAkocHJvY2ZzX3N0b3JlX3JlZ2lzdGVycyk6IERpdHRvLgorCShjcmVhdGVfcHJvY2luZm8pOiBEaXR0by4KKyAJKHByb2Nmc19pbml0X2luZmVyaW9yKTogRGl0dG8uCisgCShwcm9jX3NldF9leGVjX3RyYXApOiBEaXR0by4KKwkocHJvY2ZzX2F0dGFjaCk6IERpdHRvLgorIAkocHJvY2ZzX2RldGFjaCk6IERpdHRvLgorIAkocHJvY2ZzX3ByZXBhcmVfdG9fc3RvcmUpOiBEaXR0by4KKwkocHJvY2ZzX2ZpbGVzX2luZm8pOiBEaXR0by4KKyAJKHByb2Nmc19vcGVuKTogRGl0dG8uCisgCShwcm9jZnNfd2FpdCk6IERpdHRvLgorIAkocHJvY2ZzX2ZldGNoX3JlZ2lzdGVycyk6IERpdHRvLgorCShwcm9jZnNfbW91cm5faW5mZXJpb3IpOiBEaXR0by4KKyAJKHByb2Nmc19jYW5fcnVuKTogRGl0dG8uCisgCShwcm9jZnNfdGhyZWFkX2FsaXZlKTogRGl0dG8uCisJKHByb2Nmc19zdG9wKTogRGl0dG8uCisJKiBhbHBoYS1uYXQuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiBEaXR0by4KKwkqIGNvbmZpZy9hbHBoYS90bS1hbHBoYS5oIChhbHBoYV9vc2Zfc2tpcF9zaWd0cmFtcF9mcmFtZSk6IERpdHRvLgorCSogb2JqZmlsZXMuYyAoZWNvZmZfcmVsb2NhdGVfZWZpKTogRGl0dG8uCisJKiBpbmZsb3cuYyAocGFzc19zaWduYWwpOiBEaXR0by4KKwkoaGFuZGxlX3NpZ2lvKTogRGl0dG8uCisJKiBhbm5vdGF0ZS5jIChicmVha3BvaW50X2NoYW5nZWQpOiBEaXR0by4KKwkqIGNhbGxiYWNrLmMgKHdyYXApOiBEaXR0by4KKwkoZmRiYWQpOiBEaXR0by4KKyAJKGZkbWFwKTogRGl0dG8uCisJKiB1dGlscy5jIChtYWxsb2NfYm90Y2gpOiBEaXR0by4KKwkoZnB1dHNfbWF5YmVfZmlsdGVyZWQpOiBEaXR0by4KKwkodmZwcmludGZfbWF5YmVfZmlsdGVyZWQpOiBEaXR0by4KKwkqIGRlZnMuaCAobm90aWNlX3F1aXQpOiBEaXR0by4KKwkqIGRlZnMuaCAoeG1hbGxvYywgeHJlYWxsb2MpOiBEaXR0by4KKwkqIHRvcC5jIChzdG9wX3NpZyk6IERpdHRvLgorCShpbml0X3NpZ25hbHMpOiBEaXR0by4KKyAJKHVzZXJfZGVmaW5lZF9jb21tYW5kKTogRGl0dG8uCisgCShzb3VyY2VfY2xlYW51cF9saW5lcyk6IERpdHRvLgorCShkb250X3JlcGVhdF9jb21tYW5kKTogRGl0dG8uCisJKHNlcmlhbF9sb2dfY29tbWFuZCk6IERpdHRvLgorCShkaXNjb25uZWN0KTogRGl0dG8uCisJKiB0YXJnZXQuaCAoaW5pdGlhbGl6ZV90YXJnZXRzKTogRGl0dG8uCisJKiBvczlrcmVhZC5jIChyZWFkX21pbmltYWxfc3ltYm9scyk6IERpdHRvLgorCSogbWRlYnVncmVhZC5jIChtZGVidWdfcHN5bXRhYl90b19zeW10YWIpOiBEaXR0by4KKwkoZmRyX25hbWUpOiBEaXR0by4KKyAJKHB1c2hfcGFyc2Vfc3RhY2spOiBEaXR0by4KKwkocG9wX3BhcnNlX3N0YWNrKTogRGl0dG8uCisgCShpc19wZW5kaW5nX3N5bWJvbCk6IERpdHRvLgorIAkoYWRkX3BlbmRpbmcpOiBEaXR0by4KKwkqIHNlcmlhbC5jIChzZXJpYWxfbG9nY2hhcik6IERpdHRvLgorCShzZXJpYWxfaW50ZXJmYWNlX2xvb2t1cCk6IERpdHRvLgorCSogc2VyaWFsLmggKHNlcmlhbF9sb2dfY29tbWFuZCk6IERpdHRvLgorCSogZi12YWxwcmludC5jIChpbmZvX2NvbW1vbl9jb21tYW5kKTogRGl0dG8uCisJKiBnZGJ0eXBlcy5oIChwcmludF90eXBlX3NjYWxhcik6IERpdHRvLgorCSogc2NtLXZhbHByaW50LmMgKHNjbV9zY21saXN0X3ByaW50KTogRGl0dG8uCisJKHNjbV9pcHJ1ayk6IERpdHRvLgorCSogc2NtLWxhbmcuYyAoc2NtX3ByaW50c3RyKTogRGl0dG8uCisJKGluX2V2YWxfYyk6IERpdHRvLgorIAkoZXZhbHVhdGVfc3ViZXhwX3NjbSk6IERpdHRvLgorCSogc2NtLWV4cC5jIChzY21fcmVhZF90b2tlbik6IERpdHRvLgorCShzY21fc2tpcF93cyk6IERpdHRvLgorIAkoc2NtX2xyZWFkcGFyZW4pOiBEaXR0by4KKwkqIG0yLWxhbmcuYyAoZW1pdF9jaGFyKTogRGl0dG8uCisJKG0yX3ByaW50Y2hhcik6IERpdHRvLgorIAkobTJfcHJpbnRzdHIpOiBEaXR0by4KKwkobTJfY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGUpOiBEaXR0by4KKwkqIGYtbGFuZy5jIChlbWl0X2NoYXIpOiBEaXR0by4KKwkoZl9wcmludGNoYXIpOiBEaXR0by4KKyAJKGZfcHJpbnRzdHIpOiBEaXR0by4KKwkoZl9jcmVhdGVfZnVuZGFtZW50YWxfdHlwZSk6IERpdHRvLgorCSogY2gtbGFuZy5jIChjaGlsbF9wcmludGNoYXIpOiBEaXR0by4KKwkoY2hpbGxfcHJpbnRzdHIpOiBEaXR0by4KKwkoY2hpbGxfY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGUpOiBEaXR0by4KKyAJKHZhbHVlX2NoaWxsX2xlbmd0aCk6IERpdHRvLgorIAkodmFsdWVfY2hpbGxfY2FyZCk6IERpdHRvLgorCSh2YWx1ZV9jaGlsbF9tYXhfbWluKTogRGl0dG8uCisgCShldmFsdWF0ZV9zdWJleHBfY2hpbGwpOiBEaXR0by4KKwkqIGNoLWV4cC5jIChQRUVLX1RPS0VOKTogRGl0dG8uCisJKHBlZWtfdG9rZW5fKTogRGl0dG8uCisgCShmb3J3YXJkX3Rva2VuXyk6IERpdHRvLgorIAkocGFyc2VfY2FzZV9sYWJlbCk6IERpdHRvLgorCShwYXJzZV9vcHRfdW50eXBlZF9leHByKTogRGl0dG8uCisgCShwYXJzZV91bmFyeV9jYWxsKTogRGl0dG8uCisgCShwYXJzZV9jYWxsKTogRGl0dG8uCisJKHBhcnNlX25hbWVkX3JlY29yZF9lbGVtZW50KTogRGl0dG8uCisgCShwYXJzZV90dXBsZV9lbGVtZW50KTogRGl0dG8uCisJKHBhcnNlX29wdF9lbGVtZW50X2xpc3QpOiBEaXR0by4KKyAJKHBhcnNlX3R1cGxlKTogRGl0dG8uCisgCShwYXJzZV9wcmltdmFsKTogRGl0dG8uCisgCShwYXJzZV9vcGVyYW5kNik6IERpdHRvLgorCShwYXJzZV9vcGVyYW5kNSk6IERpdHRvLgorIAkocGFyc2Vfb3BlcmFuZDQpOiBEaXR0by4KKyAJKHBhcnNlX29wZXJhbmQzKTogRGl0dG8uCisgCShwYXJzZV9vcGVyYW5kMik6IERpdHRvLgorCShwYXJzZV9vcGVyYW5kMSk6IERpdHRvLgorIAkocGFyc2Vfb3BlcmFuZDApOiBEaXR0by4KKyAJKHBhcnNlX2V4cHIpOiBEaXR0by4KKyAJKHBhcnNlX3RoZW5fYWx0ZXJuYXRpdmUpOiBEaXR0by4KKwkocGFyc2VfZWxzZV9hbHRlcm5hdGl2ZSk6IERpdHRvLgorIAkocGFyc2VfaWZfZXhwcmVzc2lvbik6IERpdHRvLgorIAkocGFyc2VfdW50eXBlZF9leHByKTogRGl0dG8uCisJKGdyb3didWZfYnlfc2l6ZSk6IERpdHRvLgorIAkobWF0Y2hfc2ltcGxlX25hbWVfc3RyaW5nKTogRGl0dG8uCisgCShkZWNvZGVfaW50ZWdlcl92YWx1ZSk6IERpdHRvLgorCShkZWNvZGVfaW50ZWdlcl9saXRlcmFsKTogRGl0dG8uCisgCShtYXRjaF9mbG9hdF9saXRlcmFsKTogRGl0dG8uCisgCShtYXRjaF9mbG9hdF9saXRlcmFsKTogRGl0dG8uCisJKG1hdGNoX3N0cmluZ19saXRlcmFsKTogRGl0dG8uCisgCShtYXRjaF9jaGFyYWN0ZXJfbGl0ZXJhbCk6IERpdHRvLgorIAkobWF0Y2hfaW50ZWdlcl9saXRlcmFsKTogRGl0dG8uCisJKG1hdGNoX2JpdHN0cmluZ19saXRlcmFsKTogRGl0dG8uCisgCSh3cml0ZV9sb3dlcl91cHBlcl92YWx1ZSk6IERpdHRvLgorCSogY2gtbGFuZy5oICh0eXBlX2xvd2VyX3VwcGVyKTogRGl0dG8uCisJKiBjLWxhbmcuYyAoZW1pdF9jaGFyKTogRGl0dG8uCisJKiBkd2FyZnJlYWQuYyAoZnJlZV91dHlwZXMpOiBEaXR0by4KKwkqIHN0YWJzcmVhZC5oIChyZXNvbHZlX2Nmcm9udF9jb250aW51YXRpb24pOiBEaXR0by4KKwkqIHN0YWJzcmVhZC5jIChnZXRfc3Vic3RyaW5nKTogRGl0dG8uCisJKHJlYWRfb25lX3N0cnVjdF9maWVsZCk6IERpdHRvLgorCSogc3RhYnNyZWFkLmggKHByb2Nlc3NfbGF0ZXIpOiBEaXR0by4KKwkqIGRlbWFuZ2xlLmMgKHNldF9kZW1hbmdsaW5nX2NvbW1hbmQpOiBEaXR0by4KKwkqIGRlZnMuaCAoc2V0X2RlbWFuZ2xpbmdfc3R5bGUpOiBEaXR0by4KKwkqIG1haW50LmMgKG1haW50ZW5hbmNlX2luZm9fY29tbWFuZCk6IERpdHRvLgorCShwcmludF9zZWN0aW9uX3RhYmxlKTogRGl0dG8uCisJKG1haW50ZW5hbmNlX2luZm9fc2VjdGlvbnMpOiBEaXR0by4KKyAJKG1haW50ZW5hbmNlX3ByaW50X2NvbW1hbmQpOiBEaXR0by4KKwkqIHN5bXRhYi5oIChtYWludGVuYW5jZV9wcmludF9zdGF0aXN0aWNzKTogRGl0dG8uCisJKiBvYmpmaWxlcy5oIChpbl9wbHRfc2VjdGlvbik6IERpdHRvLgorCSogb2JqZmlsZXMuYyAoYWRkX3RvX29iamZpbGVfc2VjdGlvbnMpOiBEaXR0by4KKwkqIGJjYWNoZS5jIChoYXNoKTogRGl0dG8uCisJKGxvb2t1cF9jYWNoZSk6IERpdHRvLgorCSogZXhlYy5jIChiZmRzZWNfdG9fdm1hcCk6IERpdHRvLgorCShpZ25vcmUpOiBEaXR0by4KKwkqIGYtZXhwLnkgKGdyb3didWZfYnlfc2l6ZSwgbWF0Y2hfc3RyaW5nX2xpdGVyYWwpOiBEaXR0by4KKwkqIGxhbmd1YWdlLmMgKHVua19sYW5nX3ByaW50Y2hhcik6IERpdHRvLgorCSh1bmtfbGFuZ19wcmludHN0cik6IERpdHRvLgorCSh1bmtfbGFuZ19jcmVhdGVfZnVuZGFtZW50YWxfdHlwZSk6IERpdHRvLgorIAkodW5rX2xhbmdfcHJpbnRfdHlwZSk6IERpdHRvLgorCSh1bmtfbGFuZ192YWxfcHJpbnQpOiBEaXR0by4KKyAJKHVua19sYW5nX3ZhbHVlX3ByaW50KTogRGl0dG8uCisJKiB0YXJnZXQuYyAodXBkYXRlX2N1cnJlbnRfdGFyZ2V0KTogRGl0dG8uCisJKGRlYnVnX3RvX29wZW4pOiBEaXR0by4KKyAJKGRlYnVnX3RvX2Nsb3NlKTogRGl0dG8uCisJKGRlYnVnX3RvX2F0dGFjaCk6IERpdHRvLgorIAkoZGVidWdfdG9fZGV0YWNoKTogRGl0dG8uCisgCShkZWJ1Z190b19yZXN1bWUpOiBEaXR0by4KKyAJKGRlYnVnX3RvX3dhaXQpOiBEaXR0by4KKwkoZGVidWdfdG9fZmV0Y2hfcmVnaXN0ZXJzKTogRGl0dG8uCisgCShkZWJ1Z190b19zdG9yZV9yZWdpc3RlcnMpOiBEaXR0by4KKyAJKGRlYnVnX3RvX3ByZXBhcmVfdG9fc3RvcmUpOiBEaXR0by4KKyAJKGRlYnVnX3RvX3hmZXJfbWVtb3J5KTogRGl0dG8uCisgCShkZWJ1Z190b19maWxlc19pbmZvKTogRGl0dG8uCisgCShkZWJ1Z190b19pbnNlcnRfYnJlYWtwb2ludCk6IERpdHRvLgorCShkZWJ1Z190b19yZW1vdmVfYnJlYWtwb2ludCk6IERpdHRvLgorIAkoZGVidWdfdG9fdGVybWluYWxfaW5pdCk6IERpdHRvLgorCShkZWJ1Z190b190ZXJtaW5hbF9pbmZlcmlvcik6IERpdHRvLgorIAkoZGVidWdfdG9fdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0KTogRGl0dG8uCisJKGRlYnVnX3RvX3Rlcm1pbmFsX291cnMpOiBEaXR0by4KKyAJKGRlYnVnX3RvX3Rlcm1pbmFsX2luZm8pOiBEaXR0by4KKyAJKGRlYnVnX3RvX2tpbGwpOiBEaXR0by4KKwkoZGVidWdfdG9fbG9hZCk6IERpdHRvLgorIAkoZGVidWdfdG9fbG9va3VwX3N5bWJvbCk6IERpdHRvLgorIAkoZGVidWdfdG9fY3JlYXRlX2luZmVyaW9yKTogRGl0dG8uCisJKGRlYnVnX3RvX21vdXJuX2luZmVyaW9yKTogRGl0dG8uCisgCShkZWJ1Z190b19jYW5fcnVuKTogRGl0dG8uCisgCShkZWJ1Z190b19ub3RpY2Vfc2lnbmFscyk6IERpdHRvLgorCShkZWJ1Z190b190aHJlYWRfYWxpdmUpOiBEaXR0by4KKyAJKGRlYnVnX3RvX3N0b3ApOiBEaXR0by4KKwkqIGJyZWFrcG9pbnQuaCAoc2V0X2JyZWFrcG9pbnRfc2FsKTogRGl0dG8uCisJKiByZW1vdGUtdXRpbHMuYyAodXNhZ2UpOiBEaXR0by4KKwkqIHJlbW90ZS5jIChzZXRfdGhyZWFkKTogRGl0dG8uCisJKHJlbW90ZV90aHJlYWRfYWxpdmUpOiBEaXR0by4KKwkoZ2V0X29mZnNldHMpOiBEaXR0by4KKwkocmVhZF9mcmFtZSk6IERpdHRvLgorCShyZW1vdGVfaW5zZXJ0X2JyZWFrcG9pbnQpOiBEaXR0by4KKwkocmVtb3RlX3JlbW92ZV9icmVha3BvaW50KTogRGl0dG8uCisJKiBzcGFyYy1uYXQuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiBEaXR0by4KKwkqIGNvcmVsb3cuYyAoYWRkX3RvX3RocmVhZF9saXN0KTogRGl0dG8uCisJKGlnbm9yZSk6IERpdHRvLgorCSogaW5mdGFyZy5jIChwcm9jX3dhaXQpOiBEaXR0by4KKwkqIGluZnB0cmFjZS5jICh1ZG90X2luZm8pOiBEaXR0by4KKwkoZmV0Y2hfcmVnaXN0ZXIpOiBEaXR0by4KKwkqIHNlci11bml4LmMgKGhhcmR3aXJlX25vZmx1c2hfc2V0X3R0eV9zdGF0ZSk6IERpdHRvLgorCShoYXJkd2lyZV9wcmludF90dHlfc3RhdGUpOiBEaXR0by4KKwkoaGFyZHdpcmVfZmx1c2hfb3V0cHV0KTogRGl0dG8uCisJKGhhcmR3aXJlX2ZsdXNoX2lucHV0KTogRGl0dG8uCisJKGhhcmR3aXJlX3NlbmRfYnJlYWspOiBEaXR0by4KKwkoaGFyZHdpcmVfc2V0c3RvcGJpdHMpOiBEaXR0by4KKwkqIHNlci10Y3AuYyAodGNwX3JldHVybl8wKTogRGl0dG8uCisJKHRjcF9ub2ZsdXNoX3NldF90dHlfc3RhdGUpOiBEaXR0by4KKwkodGNwX3ByaW50X3R0eV9zdGF0ZSk6IERpdHRvLgorCSogc29saWIuYyAobWF0Y2hfbWFpbik6IERpdHRvLgorCSogZ2RidHlwZXMuYyAocHJpbnRfYml0X3ZlY3Rvcik6IERpdHRvLgorCShwcmludF9hcmdfdHlwZXMpOiBEaXR0by4KKwkoZHVtcF9mbl9maWVsZGxpc3RzKTogRGl0dG8uCisJKHByaW50X2NwbHVzX3N0dWZmKTogRGl0dG8uCisJKiBzeW1maWxlLmggKGVudHJ5X3BvaW50X2FkZHJlc3MpOiBEaXR0by4KKwkqIHN5bWZpbGUuYyAoZGVjcmVtZW50X3JlYWRpbmdfc3ltdGFiKTogRGl0dG8uCisJKiB2YWxvcHMuYyAodmFsdWVfYXJnX2NvZXJjZSk6IERpdHRvLgorCSogdmFsdWUuaCAoZmluZF9mdW5jdGlvbl9pbl9pbmZlcmlvcik6IERpdHRvLgorCSh2YWx1ZV9hbGxvY2F0ZV9zcGFjZV9pbl9pbmZlcmlvcik6IERpdHRvLgorCSogdmFsdWVzLmMgKHZiX21hdGNoKTogRGl0dG8uCisJKiB0aHJlYWQuYyAoaW5mb190aHJlYWRfY29tbWFuZCk6IERpdHRvLgorCShyZXN0b3JlX2N1cnJlbnRfdGhyZWFkKTogRGl0dG8uCisJKHRocmVhZF9hcHBseV9hbGxfY29tbWFuZCk6IERpdHRvLgorCSh0aHJlYWRfYXBwbHlfY29tbWFuZCk6IERpdHRvLgorCSogaW5mZXJpb3IuaCAod3JpdGVfcGNfcGlkKTogRGl0dG8uCisJKiBpbmZydW4uYyAoZGVsZXRlX2JyZWFrcG9pbnRfY3VycmVudF9jb250ZW50cyk6IERpdHRvLgorCSogYnJlYWtwb2ludC5jIChwcmludF9pdF9ub3JtYWwpOiBEaXR0by4KKwkod2F0Y2hwb2ludF9jaGVjayk6IERpdHRvLgorCShwcmludF9pdF9kb25lKTogRGl0dG8uCisJKHByaW50X2l0X25vb3ApOiBEaXR0by4KKwkobWFpbnRlbmFuY2VfaW5mb19icmVha3BvaW50cyk6IERpdHRvLgorCShjcmVhdGVfbG9uZ2ptcF9icmVha3BvaW50KTogRGl0dG8uCisJKGhicmVha19jb21tYW5kKTogRGl0dG8uCisJKHRoYnJlYWtfY29tbWFuZCk6IERpdHRvLgorCSh3YXRjaF9jb21tbmRfMSk6IERpdHRvLgorCShyd2F0Y2hfY29tbWFuZCk6IERpdHRvLgorCShhd2F0Y2hfY29tbWFuZCk6IERpdHRvLgorCShkb19lbmFibGVfYnJlYWtwb2ludCk6IERpdHRvLgorCSogY2gtdmFscHJpbnQuYyAoY2hpbGxfdmFsX3ByaW50X2FycmF5X2VsZW1lbnRzKTogRGl0dG8uCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cCk6IERpdHRvLgorCShnZXRfbGFiZWwpOiBEaXR0by4KKwkoZXZhbHVhdGVfc3RydWN0X3R1cGxlKTogRGl0dG8uCisJKiBldmFsLmMgKGluaXRfYXJyYXlfZWxlbWVudCk6IERpdHRvLgorCisJKiBhbHBoYS10ZGVwLmMgKHB1c2hfc2lndHJhbXBfZGVzYyk6IEFkZCBwcm90b3R5cGUgYW5kIG1ha2Ugc3RhdGljLgorCSogYnJlYWtwb2ludC5jIChod19icmVha3BvaW50X3VzZWRfY291bnQpOiBEaXR0by4KKwkoaHdfd2F0Y2hwb2ludF91c2VkX2NvdW50KTogRGl0dG8uCisJKiBmaW5kdmFyLmMgKHdyaXRlX3JlZ2lzdGVyX2dlbik6IERpdHRvLgorCShyZWFkX3JlZ2lzdGVyX3BpZCk6IERpdHRvLgorCSogc3ltdGFiLmMgKGNwbHVzcGx1c19oaW50KTogRGl0dG8uCisJKiBpbmZjbWQuYyAoYnJlYWtwb2ludF9hdXRvX2RlbGV0ZV9jb250ZW50cyk6IERpdHRvLgorCSogY2gtdmFscHJpbnQuYyAoY2hpbGxfcHJpbnRfdHlwZV9zY2FsYXIpOiBEaXR0by4KKwkqIGdkYnR5cGVzLmMgKGFkZF9uYW1lKTogRGl0dG8uCisJKGFkZF9tYW5nbGVkX3R5cGUpOiBEaXR0by4KKwkoY2Zyb250X21hbmdsZV9uYW1lKTogRGl0dG8uCisJKiBzcGFyYy10ZGVwLmMgKGlzYnJhbmNoKTogRGl0dG8uCisJKiBpbmZ0YXJnLmMgKGNoaWxkX3N0b3ApOiBEaXR0by4KKwkqIHdpbjMyLW5hdC5jIChjaGlsZF9zdG9wKTogRGl0dG8uCisJKiBtYWMtbmF0LmMgKGNoaWxkX3N0b3ApOiBEaXR0by4KKwkqIHJlbW90ZS11dGlscy5jIChzcl9jb20pOiBEaXR0by4KKwkqIGRieHJlYWQuYyAocHJvY2Vzc19ub3cpOiBEaXR0by4KKwkqIGNoLWV4cC5jIChyZXF1aXJlKTogRGl0dG8uCisJKGNoZWNrX3Rva2VuKTogRGl0dG8uCisJKGV4cGVjdCk6IERpdHRvLgorCShwYXJzZV9tb2RlX2NhbGwpOiBEaXR0by4KKwkocGFyc2VfbW9kZV9vcl9ub3JtYWxfY2FsbCk6IERpdHRvLgorCSogc2NtLWxhbmcuYyAoc2NtX2xvb2t1cF9uYW1lKTogRGl0dG8KKwkqIGYtbGFuZy5jIChhbGxvY2F0ZV9zYXZlZF9iZl9ub2RlKTogRGl0dG8uCisJKGFsbG9jYXRlX3NhdmVkX2Z1bmN0aW9uX25vZGUpOiBEaXR0by4KKwkoYWxsb2NhdGVfc2F2ZWRfZjc3X2NvbW1vbl9ub2RlKTogRGl0dG8uCisgCShhbGxvY2F0ZV9jb21tb25fZW50cnlfbm9kZSk6IERpdHRvLgorCShhZGRfY29tbW9uX2Jsb2NrKTogRGl0dG8uCisgCShhZGRfY29tbW9uX2VudHJ5KTogRGl0dG8uCisgCShmaW5kX2ZpcnN0X2NvbW1vbl9uYW1lZCk6IERpdHRvLgorCShwYXRjaF9jb21tb25fZW50cmllcyk6IERpdHRvLgorIAkocGF0Y2hfYWxsX2NvbW1vbnNfYnlfbmFtZSk6IERpdHRvLgorIAkoY2xlYXJfYmZfbGlzdCk6IERpdHRvLgorCShnZXRfYmZfZm9yX2Zjbik6IERpdHRvLgorIAkoY2xlYXJfZnVuY3Rpb25fbGlzdCk6ICBEaXR0by4KKwkqIHNjbS1leHAuYyAoc2NtX2lzdHIyaW50KTogRGl0dG8uCisJKHNjbV9pc3RyaW5nMm51bWJlcik6IERpdHRvLgorCSogc2NtLXZhbHByaW50LmMgKHNjbV9pbmZlcmlvcl9wcmludCk6IERpdHRvLgorCSogZi10eXBlcHJpbnQuYyAocHJpbnRfZXF1aXZhbGVudF9mNzdfZmxvYXRfdHlwZSk6IERpdHRvLgorCSogZi12YWxwcmludC5jIChmNzdfZ2V0X2R5bmFtaWNfbGVuZ3RoX29mX2FnZ3JlZ2F0ZSk6IERpdHRvLgorCShmNzdfY3JlYXRlX2FycmF5cHJpbnRfb2Zmc2V0X3RibCk6IERpdHRvLgorIAkoZjc3X3ByaW50X2FycmF5XzEpOiBEaXR0by4KKyAJKGY3N19wcmludF9hcnJheSk6IERpdHRvLgorCShsaXN0X2FsbF92aXNpYmxlX2NvbW1vbnMpOiBEaXR0by4KKyAJKHRoZXJlX2lzX2FfdmlzaWJsZV9jb21tb25fbmFtZWQpOiBEaXR0by4KKwkqIG1kZWJ1Z3JlYWQuYyAoZWNvZmZfcmVsb2NhdGVfZWZpKTogRGl0dG8uCisJKiBjYWxsYmFjay5jIChvc19jbG9zZSk6IERpdHRvLgorCShvc19nZXRfZXJybm8pOiBEaXR0by4KKyAJKG9zX2lzYXR0eSk6IERpdHRvLgorIAkob3NfbHNlZWspOiBEaXR0by4KKyAJKG9zX29wZW4pOiBEaXR0by4KKwkob3NfcmVhZCk6IERpdHRvLgorIAkob3NfcmVhZF9zdGRpbik6IERpdHRvLgorIAkob3Nfd3JpdGUpOiBEaXR0by4KKyAJKG9zX3dyaXRlX3N0ZG91dCk6IERpdHRvLgorIAkob3NfcmVuYW1lKTogRGl0dG8uCisJKG9zX3N5c3RlbSk6IERpdHRvLgorIAkob3NfdGltZSk6IERpdHRvLgorIAkob3NfdW5saW5rKTogRGl0dG8uCisgCShvc19zaHV0ZG93bik6IERpdHRvLgorIAkob3NfaW5pdCk6IERpdHRvLgorCShvc19wcmludGZfZmlsdGVyZWQpOiBEaXR0by4KKworCSogc2NtLWxhbmcuaCAoc2NtX3BhcnNlKTogQ2hhbmdlIG9sZCBzdHlsZSBkZWNsIHRvIHByb3RvdHlwZS4KKwkqIGNvbmZpZy9hbHBoYS90bS1hbHBoYWxpbnV4LmggKGFscGhhX2xpbnV4X3NpZ3RyYW1wX29mZnNldCk6IERpdHRvLgorCSogdG9wLmMgKGluaXRfcHJvYyk6IERpdHRvLgorCShxdWVyeV9ob29rKTogRGl0dG8uCisJKGVycm9yX2hvb2spOiBEaXR0by4KKwkqIGYtbGFuZy5jIChjX3ZhbHVlX3ByaW50KTogRGl0dG8uCisJKiBjaC1leHAuYyAocGFyc2VfZXhwcmVzc2lvbik6IERpdHRvLgorCShwYXJzZV9wcmltdmFsKTogRGl0dG8uCisgCShwYXJzZV91bnR5cGVkX2V4cHIpOiBEaXR0by4KKwkocGFyc2Vfb3B0X3VudHlwZWRfZXhwcik6IERpdHRvLgorIAkoY2hfbGV4KTogRGl0dG8uCisJKiBjb25maWcvc3BhcmMvdG0tc3BhcmMuaCAoc3BhcmNfaW5pdF9leHRyYV9mcmFtZV9pbmZvKTogRGl0dG8uCisJKHNwYXJjX2ZyYW1lX3NhdmVkX3BjKTogRGl0dG8uCisJKHNwYXJjX3B1c2hfZHVtbXlfZnJhbWUpOiBEaXR0by4KKwkoc3BhcmNfcG9wX2ZyYW1lKTogRGl0dG8uCisJKiBkZWZzLmggKGZjbG9zZSk6IERpdHRvLgorCShhdG9mKTogRGl0dG8uCisgCShlcnJvcl9ob29rKTogRGl0dG8uCisKKwkqIGFyYy10ZGVwLmMgKHNpbmdsZV9zdGVwKTogQ2hhbmdlIGFyZyB0byB0eXBlICJlbnVtIHRhcmdldF9zaWduYWwiLgorCSogcnM2MDAwLXRkZXAuYyAoc2luZ2xlX3N0ZXApOiBEaXR0by4KKwkqIHNwYXJjLXRkZXAuYyAoc2luZ2xlX3N0ZXApOiBEaXR0by4KKworCSogYnJlYWtwb2ludC5jIChjbGVhbnVwX2V4ZWN1dGluZ19icmVha3BvaW50cyk6IENoYW5nZSB1bnVzZWQgYXJnIHR5cGUKKwl0byBQVFIgd2hpY2ggaXMgd2hhdCBtYWtlX2NsZWFudXAgZXhwZWN0cy4KKwkqIHV0aWxzLmMgKG51bGxfY2xlYW51cCk6IENoYW5nZSBhcmcgdHlwZSB0byBQVFIuCisJKiBkZWZzLmggKG51bGxfY2xlYW51cCk6IENoYW5nZSBwcm90b3R5cGUgdG8gbWF0Y2ggYWN0dWFsIGZ1bmN0aW9uLgorCSogY29uZmlnL3NwYXJjL3RtLXNwYXJjLmggKHN0cnVjdCBmcmFtZV9pbmZvKTogTW92ZSBmb3J3YXJkIGRlY2wuCisJKiBjaC12YWxwcmludC5jIChjaGlsbF92YWxfcHJpbnQpOiBDYXN0IDJuZCBhcmcgb2YKKwljaGlsbF9wcmludF90eXBlX3NjYWxhciB0byBMT05HRVNULgorCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogSGF2ZSBlbXB0eSBzd2l0Y2ggY2FzZSBmb3IKKwlCUFNUQVRfV0hBVF9DSEVDS19TSExJQlMgd2hlbiBTT0xJQl9BREQgaXMgbm90IGRlZmluZWQuCisJKHN0b3Bfb25fc29saWJfZXZlbnRzKTogT25seSBuZWVkZWQgaWYgU09MSUJfQUREIGlzIGRlZmluZWQuCisJKiBpbmZjbWQuYyAoYXR0YWNoX2NvbW1hbmQpOiBPbmx5IG5lZWQgYXV0b19zb2xpYl9hZGQgaWYgU09MSUJfQURECisJaXMgZGVmaW5lZC4KKwkqIHN5bWZpbGUuYyAoZ2VuZXJpY19sb2FkKTogU2NhbiBsb25nIGludCB1c2luZyBhIGxvbmcgaW50IHNwZWMsCisJbm90IGFuIGludCBzcGVjLgorCSogaW5mcHRyYWNlLmMgKHVkb3RfaW5mbyk6IE9ubHkgbmVlZCBsb2NhbCB2YXJpYWJsZXMgaWYJS0VSTkVMX1VfU0laRQorIAlpcyBkZWZpbmVkLgorCShmZXRjaF9yZWdpc3Rlcik6IE9ubHkgbmVlZCBmdW5jdGlvbiBpZiBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMgaXMKKyAJbm90IGRlZmluZWQuCisJKiBpbmZsb3cuYyAoaGFuZGxlX3NpZ2lvKTogT25seSBuZWVkIHByb3RvdHlwZSB3aGVuIHRoZSBhY3R1YWwKKwlmdW5jdGlvbiBpcyBjb21waWxlZCBpbi4KKwkqIHZhbHByaW50LmMgKGxvbmdlc3RfdG9faW50KTogRXhwYW5kIGVycm9yIG1lc3NhZ2UgdG8gYmUKKwlzZXBhcmF0ZSBtZXNzYWdlcyBmb3IgYXJncyBsYXJnZXIgdGhhbiBsYXJnZXN0IHNpZ25lZCBpbnQKKwlhbmQgYXJncyBzbWFsbGVyIHRoYW4gc21hbGxlc3Qgc2lnbmVkIGludC4KKwkqIHZhbHByaW50LmMgKHByaW50X2xvbmdlc3QpOiBGaXggcHJvYmxlbXMgd2l0aCBzdXBwb3J0IGZvciBjYXNlCisJd2hlcmUgY29tcGlsZXIgc3VwcG9ydHMgdHlwZSAibG9uZyBsb25nIiBidXQgdGhlIHJ1bnRpbWUgZG9lc24ndAorCXN1cHBvcnQgcHJpbnRpbmcgdGhlbSB3aXRoICIlbGwiLgorCSogc2NtLXZhbHByaW50LmMgKHNjbV9zY21saXN0X3ByaW50LCBzY21fc2NtdmFsX3ByaW50KTogQ2hhbmdlCisgCXJldHVybiB0eXBlcyB0byB2b2lkIHNpbmNlIHdlIGRvbid0IGFjdHVhbGx5IHJldHVybiBhbnl0aGluZworIAltZWFuaW5nZnVsIGFuZCBjYWxsZWVzIGlnbm9yZSB0aGUgdmFsdWVzIGFueXdheS4KKwkqIHByb2Nmcy5jIChtb2RpZnlfaW5oZXJpdF9vbl9mb3JrX2ZsYWcpOiBFbmNsb3NlIHByX2ZsYWdzIGluIFBJT0NTRVQKKwlpZmRlZi4KKwkobW9kaWZ5X3J1bl9vbl9sYXN0X2Nsb3NlX2ZsYWcpOiBEaXR0by4KKwkod2FpdF9mZCk6IEVuY2xvc2UgbG9jYWwgdmFyaWFibGVzICJudW1fZmRzIiBhbmQgImkiIExPU0lOR19QT0xMCisJaWZkZWYKKwkqIGFscGhhLXRkZXAuYyAocHVzaF9zaWd0cmFtcF9kZXNjKTogUmV0dXJuIHByb2NfZGVzYyByYXRoZXIgdGhhbgorIAlyYW5kb20gdmFsdWUuCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBFbnN1cmUgcmFuZG9tX3NpZ25hbCBpcyBub3QgdXNlZAorCXVuaW5pdGlhbGl6ZWQuCisJKiB2YWxvcHMuYyAoY2FsbF9mdW5jdGlvbl9ieV9oYW5kKTogRW5zdXJlIHN0cnVjdF9hZGRyIGlzIG5vdCB1c2VkCisJdW5pbml0aWFsaXplZC4KKwkqIGJyZWFrcG9pbnQuYyAod2F0Y2hfY29tbWFuZF8xKTogRW5zdXJlIHByZXZfZnJhbWUgaXMgbm90IHVzZWQKKwl1bmluaXRpYWxpemVkLgorCSogdXRpbHMuYyAodmZwcmludGZfbWF5YmVfZmlsdGVyZWQpOiBDaGFuZ2Ugc2Vjb25kIGFyZyBmcm9tICJjaGFyICoiCisJdG8gImNvbnN0IGNoYXIgKiIuCisJKiBpbmZwdHJhY2UuYyAodWRvdF9pbmZvKTogQWRkIHR3byBkdW1teSBhcmdzIHNvIHRoYXQgdGhlIHR5cGUgaXMKKwljb3JyZWN0IGZvciBwYXNzaW5nIHRvIGFkZF9pbmZvLgorCSogZi1sYW5nLmMgKHNhdmVkX2Zjbik6IE1vdmUgZGVjbCB0byBoZWFkIG9mIGZpbGUgc28gaXQgY2FuIGJlIHVzZWQKKyAJaW4gcHJvdG90eXBlcy4KKyAJKHNhdmVkX2JmX3N5bW51bSk6IERpdHRvLgorIAkoU0FWRURfRlVOQ1RJT04pOiBEaXR0by4KKwkoU0FWRURfRlVOQ1RJT05fUFRSKTogRGl0dG8uCisgCShTQVZFRF9CRik6IERpdHRvLgorIAkoU0FWRURfQkZfUFRSKTogRGl0dG8uCisJKiBjaC1leHAuYyAocGFyc2VfbmFtZWRfcmVjb3JkX2VsZW1lbnQpOiBCdWlsZCBlcnJvciBtZXNzYWdlIGluCisJdGVtcG9yYXJ5IGJ1ZmZlciBiZWZvcmUgcGFzc2luZyBpdCB0byBleHBlY3QsIHJhdGhlciB0aGFuIHBhc3NpbmcKKwl3cm9uZyBudW1iZXIgb2YgYXJncyB0byBleHBlY3QuCisJKiBkZW1hbmdsZS5jIChzZXRfZGVtYW5nbGluZ19zdHlsZSk6IENhbGwgc2V0X2RlbWFuZ2xpbmdfY29tbWFuZCB3aXRoCisJY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzLgorCSogaW5mZXJpb3IuaCAodGVybWluYWxfaW5pdF9pbmZlcmlvcl93aXRoX3BncnApOiBDaGFuZ2UgYXJnIHR5cGUgdG8KKwlpbnQgdG8gbWF0Y2ggYWN0dWFsIGZ1bmN0aW9uLgorCShvc19pc2F0dHkpOiBDYWxsIGZkbWFwIHdpdGggcmlnaHQgbnVtYmVyIG9mIGFyZ3VtZW50cywgd2FzIG1pc3NpbmcKKwl0aGUgaG9zdF9jYWxsYmFjayogYXJnLgorCSogdGFyZ2V0LmMgKGNsZWFudXBfdGFyZ2V0KTogUHJvdG90eXBlIGFsbCBmdW5jdGlvbnMgY2FzdHMuCisJKiB0YXJnZXQuaCAob25lX3N0ZXBwZWQsIHNpbmdsZV9zdGVwKTogRGVjbGFyZSBoZXJlIGFuZCBjb252ZXJ0CisJc2luZ2xlX3N0ZXAgdG8gcHJvdG90eXBlLgorCSogaW5mcnVuLmMgKG9uZV9zdGVwcGVkLCBzaW5nbGVfc3RlcCk6IERvbid0IGRlY2xhcmUgZXh0ZXJucworCWhlcmUsIHRoZXkgaGF2ZSBtb3ZlZCB0byB0YXJnZXQuaC4KKyAJKiBldmFsLmMgKGluaXRfYXJyYXlfZWxlbWVudCk6IERlY2xhcmUgcHJldmlvdXNseSB1bmRlY2xhcmVkCisJbGFzdCB0d28gYXJncyBhcyBMT05HRVNULgorCSogZGNhY2hlLmMgKGRjYWNoZV94ZmVyX21lbW9yeSk6ICBDaGFuZ2UgeGZ1bmMgZGVjbHMgdG8gcHJvdG90eXBlIGZvcm0uCisKK1RodSBKdWwgMjUgMTY6MTE6NTQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZHNyZWMuYyAobG9hZF9zcmVjKTogUHJvdGVjdCBBTlNJIHN0eWxlIGZ1bmN0aW9uIHBhcm1zIHdpdGggUEFSQU1TLgorCitNb24gSnVsIDIyIDE4OjEzOjI3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChvczlrcmVhZC5vKTogIFJlbW92ZSBkZXBlbmRlbmN5IG9uIHBhcnRpYWwtc3RhYi5oLgorCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIgZW5kX3BzeW10YWIpLCBwYXJ0aWFsLXN0YWIuaDogIERvbid0CisJdXNlIHBhcnRpYWxfc3ltdGFiLT50ZXh0bG93PT0wIGFzIGEgZmxhZywgYXMgMCBpcyBhIGxlZ2l0aW1hdGUKKwl0ZXh0IGFkZHJlc3MuICBVc2UgYSBzZXBlcmF0ZSBmbGFnICh0ZXh0bG93X25vdF9zZXQpIGluc3RlYWQuCisJVGhpcyBtYWtlcyBzdGFicyBpbiBFTEYgLm8gZmlsZXMgd29yayBhIGxvdCBiZXR0ZXIuCisJKiBtZGVidWdyZWFkLmMgeGNvZmZyZWFkLmM6ICBEZWZpbmUgdGV4dGxvd19ub3Rfc2V0IGZvcgorCXBhcnRpYWwtc3RhYi5oLgorCSogc3RhYnNyZWFkLmggKGVuZF9wc3ltdGFiKTogIEFkZCB0ZXh0bG93X25vdF9zZXQgYXJnIHRvIHByb3RvdHlwZS4KKworU2F0IEp1bCAyMCAxMDo0MTowNiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZHdhcmYycmVhZC5jIChzdHJ1Y3QgZmlsZW5hbWVzKTogQ2hhbmdlIGludGVybmFsICJzdHJ1Y3QgZmlsZSIKKwl0byAic3RydWN0IGZpbGVpbmZvIiB0byBhdm9pZCBjb25mbGljdCB3aXRoICJzdHJ1Y3QgZmlsZSIgaW4KKwk8c3lzL2ZpbGUuaD4gb24gSFBVWCBhbmQgU29sYXJpcy4KKworRnJpIEp1bCAxOSAxNDowNTo1NyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGR3YXJmMnJlYWQuYzogTmV3IGZpbGUsIERXQVJGIDIgcmVhZGVyIG9yaWdpbmFsbHkgY29udHJpYnV0ZWQgYnkKKwlCcmVudCBCZW5zb24sIHdpdGggYWRkaXRpb25zIGJ5IEdhcnkgRnVuY2sgYW5kIEplcnJ5IEtyZXVzY2hlci4KKwkqIE1ha2VmaWxlLmluIChDT01NT05fT0JTKTogQWRkIGR3YXJmMnJlYWQuby4KKwkoU0ZJTEVTKTogQWRkIGR3YXJmMnJlYWQuYy4KKwkoZHdhcmYycmVhZC5vKTogQWRkIGJ1aWxkIHJ1bGUuCisJKiBzeW1maWxlLmggKGR3YXJmMl9oYXNfaW5mbywgZHdhcmYyX2J1aWxkX3BzeW10YWJzKTogRGVjbGFyZQorCWV4cG9ydGVkIGZ1bmN0aW9ucy4KKwkqIGVsZnJlYWQuYyAoZWxmX3N5bWZpbGVfcmVhZCk6IENhbGwgdGhlbS4KKwkoZWxmX3N5bXRhYl9yZWFkKSBbSEFSUklTX1RBUkdFVF06IFNraXAgc29tZSBzcGVjaWFsIHN5bWJvbHMuCisKK1RodSBKdWwgMTggMDE6MjI6MDEgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogc3ltZmlsZS5jIChzeW1maWxlX2JmZF9vcGVuKTogCisJKiBleGVjLmMgKGV4ZWNfZmlsZV9jb21tYW5kKTogZm9yIF9fR08zMl9fIGFuZCBfX1dJTjMyX18gc3lzdGVtcywKKwlmcmVlIHRoZSB1c2VyIGZyb20gaGF2aW5nIHRvIHR5cGUgdGhlIC5leGUgZXh0ZW5zaW9uLgorCitXZWQgSnVsIDE3IDA2OjU0OjUwIDE5OTYgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogbW9uOTYwLXJvbS5jOiBTaG9ydGVuIHRoZSBtb245NjBfaW5pdHMgc3RyaW5nIHRvIGEgc2luZ2xlCisJY2FycmlhZ2UgcmV0dXJuOyB0aGlzIHByZXZlbnRzIGEgaGFuZyBvbiBjb25uZWN0aW5nIGltbWVkaWF0ZWx5CisJYWZ0ZXIgcG93ZXJ1cCwgd2hlbiBNT045NjAgaXMgYXR0ZW1wdGluZyBhdXRvYmF1ZCBkZXRlY3Rpb24uCisKK1R1ZSBKdWwgMTYgMjM6NDc6MDQgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBhMjlrLXRkZXAuYyAoZ2V0X3NhdmVkX3JlZ2lzdGVyKTogQWxsb3cgUEMgdG8gYmUgbW9kaWZpZWQKKwl3aGVuIGlubmVybW9zdCBmcmFtZSBpcyBzZWxlY3RlZCwgYnV0IG5vdCBpbiBvdXRlciBmcmFtZXMuCisKK1R1ZSBKdWwgMTYgMjM6Mzc6MjUgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogY29tbWFuZC5jIChkb19zZXRzaG93X2NvbW1hbmQpOiAgRG9uJ3Qgc2VnZmF1bHQgd2hlbiBzaG93aW5nCisJdmFyX3N0cmluZyBhbmQgdmFyX3N0cmluZ19ub2VzY2FwZSB2YXJzIHRoYXQgYXJlIE5VTEwuCisKK01vbiBKdWwgMTUgMTY6NTU6NDggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogd2luMzItbmF0LmMgKGhhbmRsZV9sb2FkX2RsbCk6IGRvc19wYXRoX3RvX3VuaXhfcGF0aCByZW5hbWVkIHRvCisJY3lnd2luMzJfY29udl90b19wb3NpeF9wYXRoLgorCShjaGlsZF9jcmVhdGVfaW5mZXJpb3IpOiB1bml4X3BhdGhfdG9fZG9zX3BhdGggcmVuYW1lZCB0bworCWN5Z3dpbjMyX2NvbnZfdG9fd2luMzJfcGF0aC4gIFJld3JpdGUgY29kZSB0byB0cmFuc2xhdGUgUEFUSC4KKworTW9uIEp1bCAxNSAxNjo0NDowNSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBkZWZzLmggcHJpbnRjbWQuYzogIENyZWF0ZSBnbG9iYWwgZGlzYXNzZW1ibGVfaW5mbyBzdHJ1Y3R1cmUKKwl0bV9wcmludF9pbnNuX2luZm8uCisJKiBpMzg2LXRkZXAuYyAoc2V0X2Fzc2VtYmx5X2xhbmd1YWdlX2NvbW1hbmQpOiAgc2V0CisJdG1fcHJpbnRfaW5zbl9pbmZvLm1hY2ggdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGZvciAzODYgb3IgODA4NgorCWRpc2Fzc2VtYmx5LgorCSogcHJpbnRjbWQuYyAocHJpbnRfaW5zbik6ICBNb3ZlIGluaXQgb2YgZGlzYXNzZW1ibGVyX2luZm8gdG8KKwlfaW5pdGlhbGl6ZV9wcmludGNtZC4gIFNldCBlbmRpYW4gZm9yIGRpc2Fzc2VtYmxlciBoZXJlLgorCSogc3BhcmMtdGRlcC5jOiAgU2V0IHRtX3ByaW50X2luc25faW5mby5tYWNoIGFzIGFwcHJvcHJpYXRlIHRvCisJc2VsZWN0IHNwYXJjL3NwYXJjbGl0ZS4KKwkqIGNvbmZpZy9zcGFyYy97dG0tc3BhcmMuaCB0bS1zcGFyY2xpdGUuaH06ICBHZXQgcmlkIG9mCisJVE1fUFJJTlRfSU5TTi4gIFNldCBUTV9QUklOVF9JTlNOX01BQ0ggdG8KKwliZmRfbWFjaF9zcGFyYy9iZmRfbWFjaF9zcGFyY19zcGFyY2xpdGUuCisKK0ZyaSBKdWwgMTIgMTk6MDQ6MzIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGhwcmVhZC5jIChocHJlYWRfbG9va3VwX3R5cGUpOiBVc2UgeG1tYWxsb2MveG1yZWFsbG9jIHJhdGhlcgorCXRoYW4geG1hbGxvYy94cmVhbGxvYy4KKworRnJpIEp1bCAxMiAxNzo1OTo0NyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogb2JqZmlsZXMuYyAobWFwX3RvX2ZpbGUpOiBFcnJvciByZXR1cm4gZnJvbSBtbWFsbG9jX2ZpbmRiYXNlIGlzCisJYSBOVUxMIHBvaW50ZXIsIG5vdCBhIC0xLgorCitGcmkgSnVsIDEyIDEwOjE2OjI0IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGkzODYtdGRlcC5jIChzZXRfYXNzZW1ibHlfbGFuZ3VhZ2VfY29tbWFuZCk6ICBOZXcgcm91dGluZSB0bworCXNlbGVjdCBiZXR3ZWVuIGkzODYgYW5kIGk4MDg2IGluc3RydWN0aW9uIHNldHMgZm9yIGRpc2Fzc2VtYmx5LgorCU5ldyBjb21tYW5kIGBzZXQgYXNzZW1ibHktbGFuZ3VhZ2Uge2kzODYgaTgwODZ9Jy4KKworVGh1IEp1bCAxMSAyMToxMzoyMSAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIG1vbml0b3IuYyAobW9uaXRvcl93cml0ZV9tZW1vcnksIG1vbml0b3JfcmVhZF9tZW1vcnlfc2luZ2xlKToKKwlEaXNhYmxlIHVzZSBvZiAibG9uZyBsb25nIiBtZW1vcnkgcmVhZC93cml0ZSBjb21tYW5kczsgY2FuJ3QKKwl1c2UgdGhlbSBiZWNhdXNlIHdlIGhvbGQgdGhlIHZhbHVlcyB0byByZWFkL3dyaXRlIGluIGFuIGludAorCXZhcmlhYmxlLCBhbmQgYmVjYXVzZSBzdHJ0b3VsIGZhaWxzIG9uIHZhbHVlcyB0aGF0IGV4Y2VlZCB0aGUKKwlzaXplIG9mIGEgbG9uZy4gIFRoaXMgZml4ZXMgYnJlYWtwb2ludCBwcm9ibGVtcyBvbiBNT045NjAuCisKK1RodSBKdWwgMTEgMTE6Mzk6MzEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9tNjhrL3htLWhwMzAwaHB1eC5oIChIQVZFX01NQVApOiBSZW1vdmUgZGVmaW5pdGlvbi4KKwkqIGNvbmZpZy9wYS94bS1ocHBhaC5oIChIQVZFX01NQVApOiBEaXR0by4KKworV2VkIEp1bCAxMCAxNjo1NDo0MSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKE1NQUxMT0NfQ0ZMQUdTKTogRWxpbWluYXRlIGludGVybWVkaWF0ZSBNTUFMTE9DX0RJU0FCTEUKKwlhbmQgTU1BTExPQ19DSEVDSyBtYWNyb3MsIGFuZCBhZGQgY29tbWVudCBpbmRpY2F0aW5nIGhvdyBob3N0IGRlcGVuZGVudAorCW1ha2VmaWxlIGZyYWdtZW50IHNob3VsZCBtb2RpZnkgTU1BTExPQ19DRkxBR1MgdG8gbm90IHVzZSBtbWFsbG9jLCBvcgorCXRvIHVzZSBpdCBidXQgdG8gbm90IGRvIGhlYXAgY29ycnVwdGlvbiBjaGVja2luZy4KKwkqIGdkYnNlcnZlci9NYWtlZmlsZS5pbjogRGl0dG8uCisJKiB1dGlscy5jIChpbml0X21hbGxvYyk6IFJlcGxhY2Ugd2FybmluZygpIHVzZSB3aXRoIGRpcmVjdCBjYWxsIG9mCisJZnByaW50Zl91bmZpbHRlcmVkLCBzaW5jZSBjdXJyZW50X3RhcmdldCBoYXMgbm90IHlldCBiZWVuIHNldCBhbmQgdGh1cworIAl3ZSBjYW5ub3QgdXNlIHdhcm5pbmcoKS4gIElmIHdlIHRyeSB0byB1c2UgbW1jaGVjayBhbmQgaXQgZmFpbHMsCisJc3VnZ2VzdCB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiBuZWVkcyBOT19NTUNIRUNLIG9yIE1NQ0hFQ0tfRk9SQ0UKKyAJZGVmaW5lZC4gIE90aGVyIHNtYWxsIG1tYWxsb2MgcmVsYXRlZCBjbGVhbnVwcy4KKwkqIGNvbmZpZy9zcGFyYy9zdW40b3M0Lm1oIChNTUFMTE9DX0NGTEFHUyk6IERlZmluZSBNTUNIRUNLX0ZPUkNFIHRvIDEuCisJKiBjb25maWcvYWxwaGEvYWxwaGEtb3NmMi5taCAoTU1BTExPQ19DRkxBR1MpOiBTZXQgdG8gLUROT19NTUNIRUNLLgorCisJKiBjb25maWcvc3BhcmMveG0tc3VuNG9zNC5oIChNTUFQX0JBU0VfQUREUkVTUywgTU1BUF9JTkNSRU1FTlQpOgorCSogY29uZmlnL2kzODYveG0taTM4NnY0LmggKE1NQVBfQkFTRV9BRERSRVNTLCBNTUFQX0lOQ1JFTUVOVCk6IAorCSogY29uZmlnL2kzODYveG0tbGludXguaCAoTU1BUF9CQVNFX0FERFJFU1MsIE1NQVBfSU5DUkVNRU5UKToKKwkqIGNvbmZpZy9tNjhrL3htLWhwMzAwaHB1eC5oIChNTUFQX0JBU0VfQUREUkVTUywgTU1BUF9JTkNSRU1FTlQpOgorCSogY29uZmlnL202OGsveG0tbTY4a3Y0LmggKE1NQVBfQkFTRV9BRERSRVNTLCBNTUFQX0lOQ1JFTUVOVCk7CisJKiBjb25maWcvbTY4ay94bS1zdW4zb3M0LmggKE1NQVBfQkFTRV9BRERSRVNTLCBNTUFQX0lOQ1JFTUVOVCk6CisJKiBjb25maWcvcGEveG0taHBwYWguaCAoTU1BUF9CQVNFX0FERFJFU1MsIE1NQVBfSU5DUkVNRU5UKToKKwkqIGNvbmZpZy9zcGFyYy94bS1zdW40c29sMi5oIChNTUFQX0JBU0VfQUREUkVTUywgTU1BUF9JTkNSRU1FTlQpOgorCVJlbW92ZSBvYnNvbGV0ZSBkZWZpbmVzLgorCisJKiBjb25maWcvYWxwaGEvYWxwaGEtbGludXgubWggKE1NQUxMT0NfRElTQUJMRSk6CisJKiBjb25maWcvYWxwaGEvYWxwaGEtb3NmMS5taCAoTU1BTExPQ19ESVNBQkxFKToKKwkqIGNvbmZpZy9yczYwMDAvcnM2MDAwLm1oIChNTUFMTE9DX0RJU0FCTEUpOgorCSogY29uZmlnL3JzNjAwMC9haXg0Lm1oIChNTUFMTE9DX0RJU0FCTEUpOgorCSogY29uZmlnL3Bvd2VycGMvYWl4NC5taCAoTU1BTExPQ19ESVNBQkxFKToKKwkqIGNvbmZpZy9wb3dlcnBjL2FpeC5taCAoTU1BTExPQ19ESVNBQkxFKToKKwkqIGNvbmZpZy9uczMyay9uczMya20zLm1oIChNTUFMTE9DX0RJU0FCTEUpOgorCSogY29uZmlnL21pcHMvbWlwc20zLm1oIChNTUFMTE9DX0RJU0FCTEUpOgorCSogY29uZmlnL21pcHMvZGVjc3RhdGlvbi5taCAoTU1BTExPQ19ESVNBQkxFKToKKwkqIGNvbmZpZy9tODhrL2N4dXgubWggKE1NQUxMT0NfRElTQUJMRSk6CisJKiBjb25maWcvaTM4Ni9pMzg2bWsubWggKE1NQUxMT0NfRElTQUJMRSk6CisJKiBjb25maWcvaTM4Ni9pMzg2bTMubWggKE1NQUxMT0NfRElTQUJMRSk6CisJKiBjb25maWcvaTM4Ni9pMzg2Z251Lm1oIChNTUFMTE9DX0RJU0FCTEUpOgorCVVzZSBNTUFMTE9DX0NGTEFHUyBpbnN0ZWFkLgorCitUdWUgSnVsICA5IDIyOjQxOjEyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaDgzMDAtdGRlcC5jOiBSZW1vdmUgc29tZSBvdXRkYXRlZCBjb21tZW50cy4KKwkoaDgzMDBfc2tpcF9wcm9sb2d1ZSk6IFJld29yayB0byBiZSBtb3JlIGNvcnJlY3QgZm9yIHRoZSBIOC8zMDBILgorCUhhbmRsZSBzdG0ubCBpbnNucyBmb3IgdGhlIEg4L1MuCisJKGV4YW1pbmVfcHJvbG9ndWUpOiBMaWtld2lzZS4KKworVHVlIEp1bCAgOSAxNjo0ODo1NSAxOTk2ICBSYXltb25kIEpvdSAgPHJqb3VAbWV4aWNhbi5jeWdudXMuY29tPgorCisJKiBzZXItbWFjLmMgKG1hY19jbG9zZSk6IENoYW5nZSBhIHR5cG8gU2V0U2V0QnVmIHRvIFNlclNldEJ1Zi4KKworTW9uIEp1bCAwOCAwODo1MDozOSAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIG1vbjk2MC1yb20uYyAobW9uOTYwX29wZW4pOiBBZGQgZmxvYXRpbmcgcG9pbnQgZGV0ZWN0aW9uIHRvCisJcHJldmVudCBoYW5nIG9uIG5vbi1GUFUgcHJvY2Vzc29ycyAoUFIgOTc3NSkuCisJKG1vbjk2MF9jbWRzKTogU3dhcCBzZXRtZW0uY21kdyBhbmQgc2V0bWVtLmNtZGwgdG8gZml4IHByb2JsZW0KKwlzZXR0aW5nIGJyZWFrcG9pbnRzIGFuZCBpbXByb3ZlIGxvYWRpbmcgc3BlZWQuCisKK1N1biBKdWwgIDcgMTQ6NTc6MzQgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvZmZyZWFkLmMgKHJlY29yZF9taW5pbWFsX3N5bWJvbCk6IERvbid0IHByZXNhdmUgbmFtZSBzdHJpbmcKKwlvbiBzeW1ib2xfb2JzdGFjayBiZWZvcmUgcGFzc2luZyB0byBwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbC4KKwlJdCBub3cgaGFuZGxlcyBzYXZpbmcgdGhlIHN0cmluZyBpdHNlbGYuCisJKiBkYnhyZWFkLmMgKHJlYWRfZGJ4X2R5bmFtaWNfc3ltdGFiKTogRGl0dG8uCisJKiBtaXBzcmVhZC5jIChyZWFkX2FscGhhY29mZl9keW5hbWljX3N5bXRhYik6IERpdHRvLgorCSogb3M5a3JlYWQuYyAocmVjb3JkX21pbmltYWxfc3ltYm9sKTogRGl0dG8uCisJKiBzb2xpYi5jIChzb2xpYl9hZGRfY29tbW9uX3N5bWJvbHMpOiBEaXR0by4KKworCSogY29mZnJlYWQuYyAoY29mZl9zeW10YWJfcmVhZCk6IERvbid0IHByZXNhdmUgbmFtZSBzdHJpbmcgb24KKwlzeW1ib2xfb2JzdGFjayBiZWZvcmUgcGFzc2luZyB0byBwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbF9hbmRfaW5mby4KKwlJdCBub3cgaGFuZGxlcyBzYXZpbmcgdGhlIHN0cmluZyBpdHNlbGYuCisJKiBkYnhyZWFkLmMgKHJlY29yZF9taW5pbWFsX3N5bWJvbCk6IERpdHRvLgorCSogZWxmcmVhZC5jIChyZWNvcmRfbWluaW1hbF9zeW1ib2xfYW5kX2luZm8pOiBEaXR0by4KKwkKKwkqIGRzdHJlYWQuYyAocmVjb3JkX21pbmltYWxfc3ltYm9sKTogUmVtb3ZlIHN0YXRpYyBmdW5jdGlvbiB0aGF0IGp1c3QKKwljYWxsZWQgcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2wgd2l0aCB0aGUgc2FtZSBhcmdzIChhZnRlciBjaGFuZ2UgdG8KKyAJcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2wgdG8gZG8gaXQncyBvd24gbmFtZSBzdHJpbmcgc2F2ZXMpLgorCSogbmxtcmVhZC5jIChyZWNvcmRfbWluaW1hbF9zeW1ib2wpOiBEaXR0by4KKwkqIHNvbXJlYWQuYyAocmVjb3JkX21pbmltYWxfc3ltYm9sKTogRGl0dG8uCisKKwkqIGhwcmVhZC5jIChocHJlYWRfcmVhZF9lbnVtX3R5cGUpOiBTYXZlIHN5bWJvbCBuYW1lIG9uIHN5bWJvbCBvYnN0YWNrLgorCShocHJlYWRfcmVhZF9mdW5jdGlvbl90eXBlKTogRGl0dG8uCisJKGhwcmVhZF9wcm9jZXNzX29uZV9kZWJ1Z19zeW1ib2wpOiBEaXR0by4KKwkqIG1kZWJ1Z3JlYWQuYyAocGFyc2Vfc3ltYm9sKTogRGl0dG8uCisJKG5ld19zeW1ib2wpOiBEaXR0by4KKwkqIG1pbnN5bXMuYyAocHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2xfYW5kX2luZm8pOiBEaXR0by4KKworCSogY29mZnJlYWQuYyAocHJvY2Vzc19jb2ZmX3N5bWJvbCk6IFVzZSBvYnNhdmVzdHJpbmcgdG8gc2F2ZQorCVNZTUJPTF9OQU1FLCByYXRoZXIgdGhhbiBvYnN0YWNrX2NvcHkwLgorCSogZHN0cmVhZC5jIChjcmVhdGVfbmV3X3N5bWJvbCk6IERpdHRvCisJKiBzeW1maWxlLmMgKG9iY29uY2F0KTogRGl0dG8uCisJKiBzdGFic3JlYWQuYyAocGF0Y2hfYmxvY2tfc3RhYnMpOiBEaXR0by4KKwkqIHhjb2ZmcmVhZC5jIChTWU1OQU1FX0FMTE9DKTogRGl0dG8uCisKKwkqIHN5bWZpbGUuYyAob2JzYXZlc3RyaW5nKTogVXBkYXRlIGNvbW1lbnRzCisJKiBzb2xpYi5jIChzb2xpYl9hZGRfY29tbW9uX3N5bWJvbHMpOiBSZW1vdmUgbG9jYWwgdmFyIG9yaWduYW1lLgorCitXZWQgSnVsICAzIDE1OjU2OjA4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZTogIFJlLWJ1aWxkIHdpdGggYXV0b2NvbmYtMi4xMC4KKworCSogc3BhcmNsLXRkZXAuYyAoX2luaXRpYWxpemVfc3BhcmNfdGRlcCkgY29uZmlnL3NwYXJjL3RtLXNwYXJjLmgsCisJY29uZmlnL3NwYXJjL3RtLXNwYXJjbGl0ZS5oOiAgSW5pdGlhbGl6ZSB0bV9wcmludF9pbnNuIGZyb20KKwlUTV9QUklOVF9JTlNOLCB3aGljaCBjb21lcyBmcm9tIHRoZSB0bSBmaWxlLgorCitUdWUgSnVsIDAyIDIxOjQxOjIwIDE5OTYgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogY29mZnJlYWQuYywgZGJ4cmVhZC5jLCBlbGZyZWFkLmMsIG1pcHNyZWFkLmMsIG5sbXJlYWQuYywgCisJb3M5a3JlYWQuYzogUmVwbGFjZSBpZGVudGljYWwgc3ltX29mZnNldHMgZnVuY3Rpb25zIHdpdGgKKwlkZWZhdWx0X3N5bWZpbGVfb2Zmc2V0cy4KKwkqIHNvbXJlYWQuYyAoc29tX3N5bWZpbGVfb2Zmc2V0cyk6IFVzZSBuZXcgU0laRU9GX1NFQ1RJT05fT0ZGU0VUUworCW1hY3JvIHRvIGFsbG9jYXRlIHNlY3Rpb25fb2Zmc2V0cy4KKwkqIHN5bWZpbGUuYyAoZGVmYXVsdF9zeW1maWxlX29mZnNldHMpOiBOZXcgZnVuY3Rpb24uCisJKiBzeW1maWxlLmg6IERlY2xhcmUgZGVmYXVsdF9zeW1maWxlX29mZnNldHMuCisJKiBzeW10YWIuaDogRGVmaW5lIFNJWkVPRl9TRUNUSU9OX09GRlNFVFMgbWFjcm8gdG8KKwlzaW1wbGlmeSBhbGxvY2F0aW9uIG9mIHNlY3Rpb25fb2Zmc2V0cy4KKworVHVlIEp1biAxMSAxMjowMjo1NSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoSU5URVJOQUxfTERGTEFHUyk6ICBBZGQgaW4gZmxhZ3MgZnJvbSBjb25maWd1cmUuCisJKiBjb25maWd1cmUgY29uZmlndXJlLmluOiAgT25seSBtYWtlIHNvbC10aHJlYWQubyBmb3IgbmF0aXZlLgorCUFsc28sIHN3aXRjaCB0byBkbG9wZW5lZCBsaWJ0aHJlYWRfZGIuc28uMS4KKwkqIHNvbC10aHJlYWQuYzogIFN3aXRjaCB0byB1c2luZyBkbG9wZW4gdG8gZ2V0IHRoZSB0aHJlYWRfZGIKKwlsaWJyYXJ5LgorCitUaHUgSnVuIDEzIDE2OjUzOjI1IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluOiAgQ2hhbmdlIHRlc3QgZm9yIGxpYnRocmVhZF9kYiB0byBvbmx5CisJd29yayBmb3IgY29uZmlncyB3aGVyZSBidWlsZC9ob3N0L3RhcmdldCBhcmUgdGhlIHNhbWUuCisKK1R1ZSBKdWwgIDIgMTU6MDQ6MjAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvcG93ZXJwYy97bGludXgubWgseG0tbGludXguaH06IE5ldyBmaWxlcywgZm9yIExpbnV4IG9uCisJUG93ZXJQQy4KKworCSogY29uZmlndXJlLmluIChwb3dlcnBjLSotbGludXgpOiBBZGQgTGludXgsIFN5c3RlbSBWLCBhbmQgRUxGCisJc3VwcG9ydC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworTW9uIEp1bCAgMSAxMzowMDo0MyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwlGcm9tIFJheW1vbmQgSm91ICA8cmpvdUBtZXhpY2FuLmN5Z251cy5jb20+OgorICAgICAgICAqIG1wdy1tYWtlLnNlZDogQWRkIGxpbmVzIHRvIHdoYWNrIG91dCBhdXRvY29uZiBob29rCisgICAgICAgIEBDT05GSUdfTERGTEFHU0AuCisKK01vbiBKdWwgMDEgMTE6MDc6MTUgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiByZW1vdGUtZTcwMDAuYyAoZTcwMDBfc3RvcCk6IE5ldyBmdW5jdGlvbi4KKworRnJpIEp1biAyOCAwNjozNDoxOSAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluOiBBZGQgdGFyZ2V0IHNwYXJjbGV0LgorCSogbW9uaXRvci5oLCBtb25pdG9yLmM6IEFkZGVkIG1vbml0b3IgZmxhZ3MgTU9fTk9fRUNIT19PTl9TRVRNRU0KKyAJKGRvbid0IGV4cGVjdCBlY2hvIG9uIHNldG1lbSBjb21tYW5kKSwgTU9fUlVOX0ZJUlNUX1RJTUUgKGlmCisgCWNvbW1hbmQgdG8gc3RhcnQgcHJvY2VzcyBydW5uaW5nIG9uIHRhcmdldCBpcyBkaWZmZXJlbnQgZnJvbSBvbmUKKyAJdG8gY29udGludWUgZXhlY3V0aW9uKSwgTU9fSEVYX1BSRUZJWCAoaWYgYWRkcmVzc2VzIGZyb20gbW9uaXRvcgorIAloYXZlIGEgIjB4IiBwcmVmaXgpLgorCSogbW9uaXRvci5jLCBwYXJzZS5jLCBzcGFyYy10ZGVwLmM6IERvbid0IHJlcXVpcmUgc3RyaW5ncyBpbiB0aGUKKyAJcmVnaXN0ZXJzIGFycmF5LiAgVGhpcyBpcyB0byBhbGxvdyBOVUxMcyB0byBiZSBwbGFjZSBob2xkZXJzIGluCisgCXRoZSB0bS0qLmggZmlsZSBzbyB0aGF0IG9ubHkgbWlub3IgY2hhbmdlcyBhcmUgbmVlZGVkIHdoZW4gYSBuZXcKKyAJcHJvY2Vzc29yIGlzIGludHJvZHVjZWQgKGVnLCBvbmUgd2l0aG91dCBmbG9hdGluZyBwb2ludCkuCisJKiBzcGFyYy10ZGVwLmM6IENvbmRpdGlvbmFsbHkgcmVtb3ZlIGRlcGVuZGFuY2llcyBvbiBmbG9hdGluZworIAlwb2ludC4KKyAgCSogc3BhcmNsZXQtcm9tLmMsIGNvbmZpZy9zcGFyYy9zcGFyY2xldC5tdCwKKyAJY29uZmlnL3NwYXJjL3RtLXNwYXJjbGV0Lmg6IE5ldyBmaWxlcyBmb3IgdGFyZ2V0IHNwYXJjbGV0LgorCSogc3ltZmlsZS5jIChsb2FkX2NvbW1hbmQpOiBBZGQgb3B0aW9uIGZvciAybmQgcGFyYW1ldGVyOyBhIGxvYWQKKyAJb2Zmc2V0IGFkZGVkIHRvIHRoZSB2bWEgb2YgZWFjaCBzZWN0aW9uLgorCitGcmkgSnVuIDI4IDA1OjM5OjE5IDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KKworICAgICAgICAqIG1haW4uYyAobWFpbik6IEFkZCBvcHRpb24gImwiIGZvciBzZXR0aW5nIHJlbW90ZV90aW1lb3V0LgorCitGcmkgSnVuIDI4IDA1OjI1OjE4IDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KKworICAgICAgICAqIHJlbW90ZS1lNzAwMC5jLCByZW1vdGUuYywgdGFyZ2V0LmgsIHRvcC5jOiBBZGQgc2V0IG9wdGlvbgorIAkicmVtb3RlX3RpbWVvdXQiIGZvciBzZXR0aW5nIHJlbW90ZV90aW1lb3V0LiAgQWRkIHNldCBvcHRpb24KKyAJInVzZV9oYXJkX2JyZWFrcG9pbnRzIiBmb3Igc2V0dGluZyBoYXJkd2FyZSAudnMuIG1lbW9yeQorIAlicmVha3BvaW50cy4KKworRnJpIEp1biAyOCAwNDozMjoxOCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+CisKKyAgICAgICAgKiByZW1vdGUtZTcwMDAuYyAoZTcwMDBfcGFyc2VfZGV2aWNlKTogTmV3IGZ1bmN0aW9uLgorCUFkZCBvcHRpb24gInRjcF9yZW1vdGUiIHRvIHRhcmdldCBjb21tYW5kIGlmIHVzaW5nIAorCXRjcCB0byBjb25uZWN0IHRvIGEgcmVtb3RlIGhvc3Qgd2hpY2ggaXMgdGhlbiBjb25uZWN0ZWQgCisJdmlhIHNlcmlhbCBwb3J0IHRvIHRoZSBlNzAwMCAoZm9yIGV4YW1wb2xlLCBhIHBvcnQgbWFzdGVyKS4KKwkoZTcwMDBfb3Blbik6IENoYW5nZSB0byBjYWxsIGU3MDAwX3BhcnNlX2RldmljZS4KKworRnJpIEp1biAyOCAwMzo0NzoxNyAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+CisKKwkqIG1vbml0b3IuYyAobW9uaXRvcl9kZWJ1Zyk6IEZpeCByZW1vdGVkZWJ1ZyBidWZmZXJpbmcuCisKK1RodSBKdW4gMjcgMTg6MjQ6MTcgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWcvaTM4Ni9jeWd3aW4zMi5taCwgY29uZmlnL3Bvd2VycGMvY3lnd2luMzIubWgKKwkoTkFUREVQRklMRVMpOiBBZGQgYSBzcGFjZS4KKworV2VkIEp1biAyNiAwNjowNTozOSAxOTk2ICBXaWxmcmllZCBNb3NlciAgPG1vc2VyQHJ0bC5jeWdudXMuY29tPgorCisJKiBnZGJ0eXBlcy5jIChjcmVhdGVfYXJyYXlfdHlwZSk6IElmIFRZUEVfTEVOR1RIIChyZXN1bHRfdHlwZSkKKwlpcyB6ZXJvLCBzZXQgVFlQRV9GTEFHX1RBUkdFVF9TVFVCIHRvIGZvcmNlIHJlZXZhbHVhdGlvbiBvZiB0aGUgdHlwZS4KKworCSogY2gtZXhwLmMgKGNhbGN1bGF0ZV9hcnJheV9sZW5ndGgpOiBGdW5jdGlvbiByZW1vdmVkLgorCitUdWUgSnVuIDI1IDE3OjQxOjA2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiByZW1vdGUtZTcwMDAuYyAoZTcwMDBfcmVhZF9pbmZlcmlvcl9tZW1vcnlfbGFyZ2UpOiBOZXcgZnVuY3Rpb24uCisJKGU3MDAwX3hmZXJfaW5mZXJpb3JfbWVtb3J5KTogQ2FsbCBpdC4KKworVHVlIEp1biAyNSAyMzoxNDowNyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQorCisJKiBnZGIvZ2Ric2VydmVyL01ha2VmaWxlLmluIChkb2NkaXIpOiBSZW1vdmVkLgorCitUdWUgSnVuIDI1IDIyOjA1OjM4IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKwkqIE1ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyKToKKwlVc2UgYXV0b2NvbmYgc2V0IHZhbHVlcy4KKwkoZG9jZGlyKTogUmVtb3ZlZC4KKwkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KKwkqIG5sbS9NYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgCisJaW5jbHVkZWRpcik6IFVzZSBhdXRvY29uZiBzZXQgdmFsdWVzLgorCShkb2NkaXIpOiBSZW1vdmVkLgorCSogbmxtL2NvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KKwkqIG5sbS9jb25maWd1cmU6IFJlYnVpbHQuCisgICAgICAgICogZ2RiL2dkYnNlcnZlci9NYWtlZmlsZS5pbiAoZGF0YWRpcik6IFNldCB0byAkKHByZWZpeCkvc2hhcmUuCisKK01vbiBKdW4gMjQgMDk6NTY6MTQgMTk5NiAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCisKKwkqIHN0YWJzcmVhZC5jIChyZWFkX2Nmcm9udF9tZW1iZXJfZnVuY3Rpb25zKTogYWRkIHR5cGUKKworU3VuIEp1biAyMyAyMzo0MDo0OCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiB3aW4zMi1uYXQuYzogI2luY2x1ZGUgPHVuaXN0ZC5oPi4KKwkodW5peF9wYXRoc190b19kb3NfcGF0aHMsIGRvc19wYXRoc190b191bml4X3BhdGhzKTogRGVsZXRlLgorCShjaGlsZF9jcmVhdGVfaW5mZXJpb3IpOiBDb252ZXJ0IG9ubHkgZW52IHZhciBQQVRIIHRvIHdpbjMyIHN0eWxlLgorCShzZXRfcGF0aHN0eWxlX2Rvcyk6IERlbGV0ZS4KKwkoX2luaXRpYWxpemVfaW5mdGFyZyk6IERlbGV0ZSBkb3MtcGF0aC1zdHlsZSBjb21tYW5kLgorCitUaHUgSnVuIDIwIDEzOjQyOjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogUmV2aXNlIHNvbC10aHJlYWQubyB0ZXN0LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworCSogc291cmNlLmMgKGZpbmRfc291cmNlX2xpbmVzKTogUmVhc3NpZ24gc2l6ZSB0byByZXN1bHQgb2YgcmVhZC4KKworVHVlIEp1biAxOCAxNjoyNTo1NCAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KKworCSogaDgzMDAtZGVwLmMgKGdkYl9wcmludF9pbnNuX2g4MzAwKTogSGFuZGxlIHRoZSBIOC9TLgorCShoODMwMF9jb21tYW5kKTogTGlrZXdpc2UuCisJKHNldF9tYWNoaW5lKTogTGlrZXdpc2UuCisJKHNldF9tYWNoaW5lX2hvb2spOiBMaWtld2lzZS4KKwkoX2luaXRpYWxpemVfaDgzMDBtKTogTGlrZXdpc2UuCisKKwkqIGNvbmZpZy9oODMwMC90bS1oODMwMC5oIChoODMwMHNtb2RlKTogRGVjbGFyZS4KKworU3VuIEp1biAxNiAxNToyMTo1MSAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KKworCSogc29tc29saWIuYyAoc29tX3NvbGliX2NyZWF0ZV9pbmZlcmlvcl9ob29rKTogSGFuZGxlIHRyYWNraW5nCisJb2Ygc2hsX2xvYWQgY2FsbHMgZm9yIGhwdXgxMC4KKworVGh1IEp1biAxMyAxMToxNjoxMCAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QHRoZXB1Yi5jeWdudXMuY29tPgorCisJKiBjb25maWcuaW46IFJlZ2VuZXJhdGVkLgorCSogYWNjb25maWcuaCAoSEFWRV9USFJFQURfREJfTElCKTogQWRkZWQgZW50cnkuCisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBhY2xvY2FsLm00IChDWV9BQ19QQVRIX1RDTEgsIENZX0FDX1BBVEhfVEtIKTogVXNlIG9kZCBuYW1lcyB0bworCWF2b2lkIG5hbWUgY2xhc2hlcyB3aXRoIFN1bk9TIGhlYWRlcnMuCisKK1R1ZSBKdW4gMTEgMTk6NTI6NTAgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwlGcm9tIE1pY2hhZWwgU255ZGVyIDxNaWNoYWVsX1NueWRlckBuZXh0LmNvbT46CisJKiBiY2FjaGUuYyAocHJpbnRfYmNhY2hlX3N0YXRpc3RpY3MpOiBBdm9pZCBkaXZpZGUtYnktemVybworCWV4Y2VwdGlvbiBpZiBvbmUgb3IgbW9yZSBvYmpmaWxlIGhhcyBubyBzeW1ib2xzLCBzdWNoIGFzIHdoZW4KKwlhIGR5bmFtaWMgbGlicmFyeSBoYXMgYmVlbiBzdHJpcHBlZC4KKworVHVlIEp1biAxMSAxMjowMjo1NSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoSU5URVJOQUxfTERGTEFHUyk6ICBBZGQgaW4gZmxhZ3MgZnJvbSBjb25maWd1cmUuCisJKiBjb25maWd1cmUgY29uZmlndXJlLmluOiAgT25seSBtYWtlIHNvbC10aHJlYWQubyBmb3IgbmF0aXZlLgorCUFsc28sIHN3aXRjaCB0byBkbG9wZW5lZCBsaWJ0aHJlYWRfZGIuc28uMS4KKwkqIHNvbC10aHJlYWQuYzogIFN3aXRjaCB0byB1c2luZyBkbG9wZW4gdG8gZ2V0IHRoZSB0aHJlYWRfZGIKKwlsaWJyYXJ5LgorCitNb24gSnVuIDEwIDE0OjE3OjE5IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWcvc3BhcmMve3htLXN1bjRzb2wyLmgseG0tc3VuNG9zNC5ofSAoTU1BUF9CQVNFX0FERFJFU1MpOgorIAlDaGFuZ2UgZnJvbSAweEUwMDAwMDAwIHRvIDB4QzAwMDAwMDAuCisKK1RodSBKdW4gIDYgMTc6MTA6MzIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvcG93ZXJwYy94bS1zb2xhcmlzLmg6IEluaXRpYWwgdmVyc2lvbiBvZiBzdXBwb3J0IGZvcgorCVNvbGFyaXMgb24gUG93ZXJQQy4KKworV2VkIEp1biAgNSAwMTo1Mjo1NyAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKyAJKiBjb25maWd1cmUuaW4gKGNvbmZpZ2RpcnMpOiBGb3JjZSA0MTAwIGJ1aWxkcyB0byB1c2UgNDMwMCBHREIKKyAgCXRhcmdldC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworCSogY29uZmlnL21pcHMvdnI0MzAwZWwubXQgKFNJTV9PQlMpOiBJbmNsdWRlIHNpbXVsYXRvciBpbgorIAlsaXR0bGUtZW5kaWFuIGJ1aWxkcy4KKwkKK01vbiBKdW4gIDMgMTE6NDg6MjkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBpbmZ0YXJnLmMgKGNoaWxkX3RocmVhZF9hbGl2ZSk6IFByb3RlY3QgZGVjbGFyYXRpb24gd2l0aAorCSNpZm5kZWYgQ0hJTERfVEhSRUFEX0FMSVZFLgorCisJKiBzb3VyY2UuYyAoZmluZF9zb3VyY2VfbGluZXMpOiBDaGVjayB0aGUgdGltZSBvbiB0aGUgc3ltdGFiJ3MgYmZkIGlmCisJaXQgZXhpc3RzLCBlbHNlIGNoZWNrIHRoZSB0aW1lIG9uIHRoZSBleGVjX2JmZC4KKworVGh1IE1heSAzMCAwOTo0MzoxNyAxOTk2ICBNYXJrIEFsZXhhbmRlciA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogZHNyZWMuYyAobWFrZV9zcmVjKTogIEZpeCBjYWxjdWxhdGlvbiBvZiBhZGRyZXNzIHNpemUKKwl0byBhbGxvdyBhZGRyZXNzZXMgbGVzcyB0aGFuIDB4MTAwLgorCitUaHUgTWF5IDMwIDA0OjI0OjA5IDE5OTYgIFdpbGZyaWVkIE1vc2VyICA8bW9zZXJAcnRsLmN5Z251cy5jb20+CisKKwkqIGNoLWV4cC5jIChjaF9sZXgpOiBJbiBjYXNlIG9mIExPQ19UWVBFREVGIGNhbGwgY2FsY3VsYXRlX2FycmF5X2xlbmd0aC4KKworVHVlIE1heSAyOCAxNjoxNTo0NyAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiByZW1vdGUtbWlwcy5jOiBjYW5ub3QgdXNlIEVJTlZBTCBmb3IgYnJlYWtwb2ludCB0ZXN0IHNpbmNlCisJaXRzIHZhbHVlIHZhcmllcyBmb3IgZGlmZmVyZW50IGhvc3RzIChlLmcuIGdvMzIncyBpcyAxOSwgd2hpbGUKKwlzdW5vcyBpcyAyMikuICBDaGFuZ2VkIHRvIGhhcmRjb2RlZCAyMiBzaW5jZSB0aGF0IGlzIHdoYXQgdGhlCisJbWlwcyBib2FyZHMgcmV0dXJuLgorCitUdWUgTWF5IDI4IDExOjE0OjU4IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBhY2xvY2FsLm00IChDWV9BQ19QQVRIX1RDTEgpOiBEb24ndCB1c2UgQUNfVFJZX1JVTi4KKwkoQ1lfQUNfUEFUSF9US0gpOiBEb24ndCB1c2UgQUNfVFJZX1JVTi4KKworU3VuIE1heSAyNiAxNjo1NjozNSAxOTk2ICBNaWxlcyBCYWRlciAgPG1pbGVzQGdudS5haS5taXQuZWR1PgorCisJKiBzb2xpYi5jIChzb2xpYl9hYnNvbHV0ZV9wcmVmaXgsIHNvbGliX3NlYXJjaF9wYXRoKTogTmV3IHZhcmlhYmxlcy4KKwkoX2luaXRpYWxpemVfc29saWIpOiBBZGQgc2V0L3Nob3cgY29tbWFuZHMgZm9yIHRob3NlIHZhcmlhYmxlcy4KKwkoc29saWJfbWFwX3NlY3Rpb25zKTogSW1wbGVtZW50IHNlYXJjaGluZyB1c2luZyB0aGVtLgorCitTdW4gTWF5IDI2IDE0OjE0OjQ5IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJQ2hhbmdlcyBmcm9tOiBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgorCisJKiBORVdTOiAgQWRkIEFscGhhIExpbnV4IGFzIGEgbmV3IG5hdGl2ZSBjb25maWd1cmF0aW9uLgorCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3N5bWJvbCk6IFdoZW4gd2UgZmluZCBhIG1hbGxvYygpIHN5bWJvbCB3aXRoCisgCXJldHVybiB0eXBlIFZPSUQsIGFzc3VtZSBubyBkZWJ1Z2dpbmcgaW5mbyBpcyBhdmFpbGFibGUgZm9yIHRoYXQKKyAJb2JqZWN0IGZpbGUgYW5kIHBhdGNoIHRoZSByZXR1cm4gdmFsdWUgaW50byBWT0lEICouICBPdGhlcndpc2UsCisJb3BlcmF0aW9ucyByZXF1aXJpbmcgYW4gaW1wbGljaXQgY2FsbCB0byBtYWxsb2MoKSB3aWxsIGZhaWwuCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IFRoZSBjcml0ZXJpb24gdG8gZGV0ZWN0IGVudGVyaW5nIGEKKyAJc2lndHJhbXAgaGFuZGxlciBpcyBub3c6IChhKSB0aGUgY3VycmVudCBwYyBpcyBpbnNpZGUgYSBzaWd0cmFtcAorIAloYW5kbGVyLCAoYikgdGhlIHByZXZpb3VzIHBjIGlzIG5vdCBpbiBhIHNpZ3RyYW1wIGhhbmRsZXIsIGFuZCAoYykKKyAJdGhlIGN1cnJlbnQgc3RhY2sgcG9pbnRlciBpcyAiaW5uZXIiIHRoYW4gdGhlIG9sZCBvbmUuICBDb25kaXRpb24KKwkoYykgaXMgbmV3IHRvIGF2b2lkIG1pc3Rha2luZyBhIHJldHVybiBmcm9tIGEgc2lnbmFsIGhhbmRsZXIgaW50bworIAlzaWd0cmFtcCBhcyBhIG5ldyBzaWd0cmFtcCBpbnZvY2F0aW9uLgorCisJKiBkY2FjaGUuYyAoc3RydWN0IGRjYWNoZV9ibG9jayk6IERlY2xhcmUgYWRkciBhcyBDT1JFX0FERFIuICBBbgorIAlpbnQgbWF5IG5vdCBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgYW4gYWRkcmVzcy4KKwkoZGNhY2hlX2hpdCk6IERpdHRvLgorCShkY2FjaGVfcGVla19ieXRlKTogRml4IGluZGVudGF0aW9uLgorCisJKiBjb25maWd1cmUuaW4gKGFscGhhLSotbGludXgqKTogQWRkIHRhcmdldC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZAorCisJKiBjb25maWcvYWxwaGEvdG0tYWxwaGEuaCAoUFJPQ19ERVNDX0lTX0RZTl9TSUdUUkFNUCk6IE5ldyBtYWNyby4KKwkoU0VUX1BST0NfREVTQ19JU19EWU5fU0lHVFJBTVApOiBEaXR0by4KKwkoRFlOQU1JQ19TSUdUUkFNUF9PRkZTRVQpOiBEaXR0by4KKwkoU0lHQ09OVEVYVF9BRERSKTogRGl0dG8uCisJKEZSQU1FX1BBU1RfU0lHVFJBTVBfRlJBTUUpOiBEaXR0by4KKworCSogY29uZmlnL2FscGhhL2FscGhhLWxpbnV4Lm1oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZy9hbHBoYS9hbHBoYS1saW51eC5tdDogRGl0dG8uCisJKiBjb25maWcvYWxwaGEvbm0tbGludXguaDogRGl0dG8uCisJKiBjb25maWcvYWxwaGEvdG0tYWxwaGFsaW51eC5oOiBEaXR0by4KKwkqIGNvbmZpZy9hbHBoYS94bS1hbHBoYWxpbnV4Lmg6IERpdHRvLgorCSogY29uZmlnL2FscGhhL3htLWFscGhhb3NmLmg6IFJlbmFtZWQgZnJvbSB4bS1hbHBoYS5oLgorCSogY29uZmlnL2FscGhhL2FscGhhLW9zZjEubWggKFhNX0ZJTEUpOiBDaGFuZ2UgZnJvbSB4bS1hbHBoYS5oIHRvCisgCXhtLWFscGhhb3NmLmguCisJKiBjb25maWcvYWxwaGEvYWxwaGEtb3NmMi5taDogRGl0dG8uCisKKwkqIGJsb2NrZnJhbWUuYyAoZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uKTogUGFzcyBQQyB0bworIAlTSUdUUkFNUF9TVEFSVCBhbmQgU0lHVFJBTVBfRU5EIG1hY3JvcyBmb3IgdGhlIGJlbmVmaXQgb2Ygc3lzdGVtcworIAl0aGF0IGRldGVjdCBzaWd0cmFtcCBjb2RlIHZpYSBkZXNpZ25hdGVkIGNvZGUgc2VxdWVuY2VzIChhcyBpcyB0aGUKKyAJY2FzZSBmb3IgTGludXgvQWxwaGEsIGZvciBleGFtcGxlKS4KKwkKKwkqIGNvbmZpZy9pMzg2L3RtLWkzODZic2QuaDogQ2hhbmdlIFNJR1RSQU1QX1NUQVJUIGFuZCBTSUdUUkFNUF9FTkQKKwl0byBpZ25vcmUgbmV3IFBDIGFyZ3VtZW50LgorCSogY29uZmlnL202OGsvdG0taHAzMDBic2QuaDogRGl0dG8uCisJKiBjb25maWcvdmF4L3RtLXZheC5oOiBEaXR0by4KKworCSogYWxwaGEtdGRlcC5jIChhbHBoYV9saW51eF9zaWd0cmFtcF9vZmZzZXQpOiBOZXcgZnVuY3Rpb24uCisJKGFscGhhX29zZl9za2lwX3NpZ3RyYW1wX2ZyYW1lKTogRGl0dG8uCisJKHB1c2hfc2lndHJhbXBfZGVzYyk6IERpdHRvLgorCShhbHBoYV9maW5kX3NhdmVkX3JlZ3MpOiBVc2UgU0lHQ09OVEVYVF9BRERSIG1hY3JvIHRvIGV4dHJhY3QKKyAJc2lnY29udGV4dCBhZGRyZXNzIGZyb20gZnJhbWUuCisJKGFscGhhX3NhdmVkX3BjX2FmdGVyX2NhbGwpOiBXaGVuIGluIHNpZ3RyYW1wLCB1c2UKKyAJYWxwaGFfZnJhbWVfc2F2ZWRfcGMoKSBpbnN0ZWFkIG9mIHJlYWQtcmVnaXN0ZXIoKS4KKwkoYWZ0ZXJfcHJvbG9ndWUpOiBXaGVuIGluc2lkZSBhIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBzaWd0cmFtcAorIAlmdW5jdGlvbiwgdGhlcmUgaXMgbm8gcHJvbG9ndWUsIHNvIHJldHVybiBhZGRyZXNzIG9mIGZpcnN0CisgCWluc3RydWN0aW9uLgorCShhbHBoYV9pbl9wcm9sb2d1ZSk6IEZpeCB0eXBvIGluIGNvbW1lbnQuCisJKGZpbmRfcHJvY19kZXNjKTogVXNlIG1hY3JvIERZTkFNSUNfU0lHVFJBTVBfT0ZGU0VUIHRvIGRldGVybWluZQorIAl3aGV0aGVyIHdlJ3JlIGluc2lkZSBhIGR5bmFtaWNhbHkgZ2VuZXJhdGVkIHNpZ3RyYW1wIGZ1bmN0aW9uLiAgSWYKKyAJc28sIGNyZWF0ZSBhbmQgcHVzaCBhbmQgYXBwcm9wcmlhdGUgcHJvY2VkdXJlIGRlc2NyaXB0b3IuCisJKGFscGhhX2ZyYW1lX2NoYWluKTogVXNlIG1hY3JvIEZSQU1FX1BBU1RfU0lHVFJBTVBfRlJBTUUgdG8gb2J0YWluCisgCXRoZSBmcmFtZSBwYXN0IGEgc2lndHJhbXAgZnJhbWUgKGlmIHRoZSBjdXJyZW50IGZyYW1lIGlzIGluZGVlZCBhCisgCXNpZ3RyYW1wIGZ1bmN0aW9uKS4KKwkoaW5pdF9leHRyYV9mcmFtZV9pbmZvKTogRG9uJ3QgcmVhZCBuZXh0IGZyYW1lIHJlZ2lzdGVyIG9mZiBvZgorIAlzdGFjay1wb2ludGVyIHdoZW4gaW5zaWRlIGEgZHluYW1pY2NhbHkgZ2VuZXJhdGVkIHNpZ3RyYW1wLgorCShhbHBoYV9wb3BfZnJhbWUpOiBBbHNvIHVubGluayBhbmQgZGVzdHJveSBwcm9jZWR1cmUgZGVzY3JpcHRvcnMKKyAJY3JlYXRlZCBmb3IgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIHNpZ3RyYW1wIGZ1bmN0aW9ucy4KKworCSogYWxwaGEtbmF0LmM6IFdoZW4gY29tcGlsaW5nIHVuZGVyIExpbnV4LCBpbmNsdWRlIDxhc20vcmVnLmg+IGFuZAorIAk8YWxwaGEvcHRyYWNlLmg+IGluc3RlYWQgb2YgPG1hY2hpbmUvcmVnLmg+CisKK1R1ZSBKdWwgIDIgMTM6NTg6MTAgMTk5NiAgTWlsZXMgQmFkZXIgIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KKworCSogZ251LW5hdC5jIChpbmZfdmFsaWRhdGVfdGFza19zYyk6CisJR2l2ZSB0ZXJtaW5hbCB0byBnZGIgd2hpbGUgYXNraW5nIHF1ZXN0aW9uLgorCShpbmZfcmVzdW1lKTogRG9uJ3QgdmFsaWRhdGUgdGhlIHRhc2sgc3VzcGVuZC1jb3VudCB3aGlsZSBleGVjaW5nLgorCitUaHUgSnVuIDEzIDExOjA0OjUyIDE5OTYgIE1pbGVzIEJhZGVyICA8bWlsZXNAZ251LmFpLm1pdC5lZHU+CisKKwkqIGdudS1uYXQuYyAoaW5mX3ZhbGlkYXRlX3Rhc2tfc2MpOiBRdWVyeSB1c2VyIGJlZm9yZSBjbGVhcmluZyBhbnkKKwlhZGRpdGlvbmFsIHN1c3BlbmQgY291bnQuCisJKFNfcHJvY193YWl0X3JlcGx5LCBnbnVfYXR0YWNoKTogRG9uJ3QgY2FsbCBpbmZfdmFsaWRhdGVfdGFza19zYy4KKwkoaW5mX3Jlc3VtZSk6IENhbGwgaW5mX3ZhbGlkYXRlX3Rhc2tfc2MgaGVyZS4KKwkoZ251X3Jlc3VtZSk6IENhbGwgaW5mX3VwZGF0ZV9wcm9jcyB0byBlbnN1cmUgbm90aWNpbmcgbmV3IHRocmVhZHMuCisKK0ZyaSBKdW4gIDcgMTc6MDA6NDMgMTk5NiAgTWlsZXMgQmFkZXIgIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KKworCSogZ251LW5hdC5jIChnbnVfY3JlYXRlX2luZmVyaW9yOiBhdHRhY2hfdG9fY2hpbGQpOiBSZXR1cm4gUElELgorCitUaHUgTWF5IDIzIDE1OjEzOjU2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaDgzMDAtdGRlcC5jIChJU19QVVNIKTogUmVmaW5lLgorCShJU19NT1ZFX0ZQLCBJU19NT1ZfU1BfRlApOiBBY2NlcHQgSDgvMzAwSCB2YXJhaW50cy4KKwkoSVNfU1VCNF9TUCwgSVNfU1VCTF9TUCk6IE5ldyBtYWNyb3MuCisJKGg4MzAwX3NraXBfcHJvbG9ndWUpOiBIYW5kbGUgSDgvMzAwSCBwcm9sb2d1ZSBjb2RlIHNlcXVlbmNlcy4KKwkoZXhhbWluZV9wcm9sb2d1ZSk6IEhhbmRsZSBhZGRyZXNzZXMgZnJvbSAweDAxMDAwMCB0byAweGZmZmZmZgorCXdoZW4gaW4gSDgvMzAwSCBtb2RlLiAgR2V0IHRoZSByZXR1cm4gcG9pbnRlcidzIGFkZHJlc3MgY29ycmVjdGx5CisJZm9yIHRoZSBIOC8zMDBILiAgSGFuZGxlIEg4LzMwMEggcHJvbG91Z2UgY29kZSBzZXF1ZW5jZXMuCisKKwkqIHN5bWZpbGUuYyAoZ2VuZXJpY19sb2FkKTogUHJpbnQgdGhlIHN0YXJ0aW5nIGFkZHJlc3MKKwlvZiB0aGUgZmlsZSBqdXN0IGxvYWRlZC4KKworVGh1IE1heSAyMyAxMjowOTo1MiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1wdy1tYWtlLnNlZDogRWRpdCBAVEhSRUFEX0RCX09CU0Agb3V0IG9mIG1ha2VmaWxlLgorCitUdWUgTWF5IDIxIDExOjUzOjU2IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogYnJlYWtwb2ludC5jIChicHN0YXRfZG9fYWN0aW9ucyk6ICBBdm9pZCBlbmRsZXNzIHJlY3Vyc2lvbgorCWlmIGEgYHNvdXJjZScgY29tbWFuZCBpcyBjb250YWluZWQgaW4gYnMtPmNvbW1hbmRzLgorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiAgVXBkYXRlIHN0ZXBfZnJhbWVfYWRkcmVzcyB3aGVuCisJc3RlcHBpbmcgaW50byBhIG5ldyBsaW5lLgorCisJRnJvbSBzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGUgKEFuZHJlYXMgU2Nod2FiKToKKwkqIGJyZWFrcG9pbnQuYyAoYnJlYWtwb2ludF8xKTogIEFkZCBzaGxpYl9kaXNhYmxlZCBjYXNlIHRvCisJYnBlbmFibGVzIGFycmF5LgorCitNb24gTWF5IDIwIDIyOjUyOjAwIDE5OTYgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogZHNyZWMuYyAobG9hZF9zcmVjKTogQWRkIFdBSVRBQ0sgcGFyYW1ldGVyLCBmb3IgbWFjaGluZXMKKwlsaWtlIEVTVCB2aXNpb25JQ0UgdGhhdCBzZW5kIGJhY2sgYW4gQUNLIGFmdGVyIGVhY2ggUy1yZWNvcmQuCisJKiBtb25pdG9yLmMgKG1vbml0b3Jfd2FpdF9zcmVjX2Fjayk6IE5ldyBmdW5jdGlvbi4KKwkobW9uaXRvcl9sb2FkKTogUGFzcyBtb25pdG9yX3dhaXRfc3JlY19hY2sgdG8gbG9hZF9zcmVjCisJaWYgdGhlIG1vbml0b3IncyBNT19TUkVDX0FDSyBmbGFnIGlzIHNldC4KKwkqIG1vbml0b3IuaDogRGVmaW5lIE1PX1NSRUNfQUNLIGZsYWcuCisJKiByZW1vdGUtZXN0LmMgKGVzdF9jbWRzKTogQWRkIE1PX1NSRUNfQUNLIGZsYWcuCisJKiBzaDMtcm9tLmMgKHNoM19sb2FkKTogQWNjb21vZGF0ZSBjaGFuZ2UgaW4gbG9hZF9zcmVjIHByb3RvdHlwZS4KKwkqIHNyZWMuaDogQWRkIFdBSVRBQ0sgcGFyYW1ldGVyIHRvIGxvYWRfc3JlYyBwcm90b3R5cGUuCisKK1N1biBNYXkgMTkgMjE6MjI6MDAgMTk5NiAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGw+CisKKwkqIGNvbmZpZy9zcGFyYy9zcGFyY2xpdGUubXQ6IEFkZCB0aGUgc3BhcmMgc2ltdWxhdG9yLgorCitTdW4gTWF5IDE5IDE2OjQ5OjM3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBkZWZzLmggKHJlYWRfY29tbWFuZF9saW5lcywgcXVlcnlfaG9vayk6IFVwZGF0ZSBwcm90b3R5cGVzLgorCShyZWFkbGluZV9iZWdpbl9ob29rLCByZWFkbGluZV9ob29rLCByZWFkbGluZV9lbmRfaG9vayk6IERlY2xhcmUuCisJKiBicmVha3BvaW50LmMgKGNvbW1hbmRzX2NvbW1hbmQpOiBCdWlsZCBtZXNzYWdlIGluIHRlbXBvcmFyeSBidWZmZXIKKwlhbmQgcGFzcyB0aGF0LCBhcyB3ZWxsIGFzIHR0eSBjb250cm9sIGZsYWcsIHRvIHJlYWRfY29tbWFuZF9saW5lcy4KKwkqIHRvcC5jIChyZWFkbGluZV9iZWdpbl9ob29rLCByZWFkbGluZV9ob29rLCByZWFkbGluZV9lbmRfaG9vayk6CisJRGVmaW5lIGhlcmUuCisJKGNvbW1hbmRfbG9vcCk6IENoZWNrIGZvciBub24tTlVMTCBpbnN0cmVhbSBiZWZvcmUgbG9vcGluZy4KKwkoY29tbWFuZF9saW5lX2lucHV0KTogVXNlIHJlYWRsaW5lX2hvb2sgd2hlbiBhcHByb3ByaWF0ZSwgdG8gZ2V0CisJdXNlciBpbnB1dCBmcm9tIGEgR1VJIHdpbmRvdy4KKwkocmVhZF9uZXh0X2xpbmUpOiBBbHNvIGJ1aWxkIHByb21wdCBpZiBnZXR0aW5nIHVzZXIgaW5wdXQgZnJvbSBhIEdVSS4KKwkocmVjdXJzZV9yZWFkX2NvbnRyb2xfc3RydWN0dXJlKTogRml4IHR5cG8gaW4gY29tbWVudC4KKwkocmVhZF9jb21tYW5kX2xpbmVzKTogVXNlIHBhc3NlZCBpbiBwcm9tcHQgYW5kIHR0eSBmbGFnIHRvIGRlY2lkZSBob3cKKwl0byBidWlsZCBtZXNzYWdlLiAgVXNlIHJlYWRsaW5lX2JlZ2luX2hvb2sgd2hlbiBhcHByb3ByaWF0ZSwgdG8gc2V0CisJdXAgYSBHVUkgaW50ZXJhY3Rpb24gd2luZG93LiAgSnVzdCByZXR1cm4gaGVhZCwgd2hldGhlciBOVUxMIG9yIG5vdCwKKwlhZnRlciB1c2luZyByZWFkbGluZV9lbmRfaG9vayB0byBjb21wbGV0ZSBHVUkgaW50ZXJhY3Rpb24uCisJKGRlZmluZV9jb21tYW5kLCBkb2N1bWVudF9jb21tYW5kKTogQnVpbGQgbWVzc2FnZSBpbiBhIHRlbXBvcmFyeQorCWJ1ZmZlciBhbmQgcGFzcyBpdCB0byByZWFkX2NvbW1hbmRfbGluZXMsIGFsb25nIHdpdGggdHR5IGZsYWcuCisKKworU2F0IE1heSAxOCAwMjo0Mzo1OCAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGJsb2NrZnJhbWUuYyAoZnJhbWVsZXNzX2xvb2tfZm9yX3Byb2xvZ3VlKToKKwlBZGQgRlVOQ1RJT05fU1RBUlRfT0ZGU0VUIG9ubHkgaWYgZnVuY19zdGFydCBpcyBub24temVyby4KKwkqIG1pbnN5bXMuYyAobG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjKTogIFJldHVybiBOVUxMIGlmCisJcGMgaXMgbm90IGluIGEga25vd24gc2VjdGlvbi4KKwkqIHN0YWNrLmMgKHByaW50X2ZyYW1lX2luZm8pOiAgUmVtb3ZlIGNoZWNrIGZvciBmaS0+cGMgaW4ga25vd24KKwlzZWN0aW9uLCBub3cgaGFuZGxlZCBieSBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGMuCisKKworRnJpIE1heSAxNyAxMzozMTowNCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHNoLXN0dWIuYzogTmV3IGZpbGUsIHdhcyBjb25maWcvc2gvc3R1Yi5jLgorCisKK1dlZCBNYXkgMTUgMDg6MjU6MTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiB0b3AuYyAocmVhZF9uZXh0X2xpbmUpOiBGaXggdGhpbmtvcy4gIEZyb20gRG9ubiBTZWVsZXkuCisKKwkqIGNvZmZyZWFkLmMgKGNvZmZfc3ltdGFiX3JlYWQpOiBIYW5kbGUgQ19MQUJFTCBzeW1ib2xzIGxpa2UKKwlDX1NUQVQgc3ltYm9scy4KKwkqIGg4MzAwLXRkZXAuYyAoaDgzMDBfcG9wX2ZyYW1lKTogUmVzZXQgJHNwIGFuZCAkcGMgY29ycmVjdGx5LgorCUZsdXNoIGNhY2hlZCBmcmFtZXMganVzdCBiZWZvcmUgZXhpdGluZy4KKwkqIHJlbW90ZS1zaW0uYyAoZ2Ric2ltX3Jlc3VtZSk6IENvbXBsYWluIGlmIHRoZSBwcm9ncmFtIGlzbid0CisJYmVpbmcgcnVuLgorCSogY29uZmlnL2g4MzAwL3RtLWg4MzAwLmggKEJFTElFVkVfUENDX1BST01PVElPTik6IERlZmluZS4KKworVHVlIE1heSAxNCAxODowNToxNiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBwcm9jZnMuYyAocHJvY2ZzX3RocmVhZF9hbGl2ZSBwcm9jZnNfc3RvcCk6ICBNYWtlIHN0YXRpYy4KKwkocHJvY2ZzX3BpZF90b19zdHIpOiAgTmV3IHJvdXRpbmUgdG8gcHJpbnQgb3V0IHRocmVhZCBpZCdzIGluIGFuCisJaW50ZWxsaWdpYmxlIG1hbm5lci4KKwkqIHNvbC10aHJlYWQuYyAoc29sX3RocmVhZF9mZXRjaF9yZWdpc3RlcnMpOiAgUmUtb3JkZXIgbWFubmVyIGluCisJd2hpY2ggc3VwcGx5X3JlZ2lzdGVyIGlzIGNhbGxlZCB0byBmaXggYnVnIHdpdGggd3JpdGluZworCWluZGl2aWR1YWwgcmVncy4KKwkqIGNvbmZpZy9zcGFyYy90bS1zdW40c29sMi5oOiAgRGVmaW5lIGRlZmF1bHQgZm9yCisJdGFyZ2V0X3BpZF90b19zdHIgaW4gY2FzZSBob3N0IGxhY2tzIGxpYnRocmVhZF9kYi4KKworTW9uIE1heSAxMyAyMzo1MzozMCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiBjb25maWcuaW4gY29uZmlndXJlIGNvbmZpZ3VyZS5pbgorCWNvbmZpZy9zcGFyYy9ubS1zdW40c29sMi5oIGNvbmZpZy9zcGFyYy9zdW40c29sMi5taAorCWNvbmZpZy9zcGFyYy90bS1zdW40c29sMi5oOiAgVXNlIGF1dG9jb25mIHRvIGNvbmZpZyBTb2xhcmlzIHRocmVhZAorCWFuZCBwdGhyZWFkIHN1cHBvcnQsIHNpbmNlIHByZS0yLjUgc3lzdGVtcyBkb24ndCBjb21lIHdpdGgKKwlsaWJ0aHJlYWRfZGIuc28uMS4KKworCSogcHJvY2ZzLmMgKGluZm9fcHJvYyk6ICBVc2UgaW50IGluc3RlYWQgb2YgaWRfdC4gIE9sZCB2ZXJzaW9ucyBvZgorCUlyaXggZG9uJ3Qgc2VlbSB0byBkZWZpbmUgdGhpcy4KKworTW9uIE1heSAxMyAxNzo0MDo1OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHRvcC5jIChleGVjdXRlX2NvbnRyb2xfY29tbWFuZCwgY2FzZSB3aGlsZV9jb250cm9sKTogQWxsb3cKKwlhIHdoaWxlIGNvbW1hbmQgdG8gYmUgaW50ZXJydXB0ZWQuCisKK01vbiBNYXkgMTMgMTY6MTc6MzYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogc29sLXRocmVhZC5jOiAgTW9yZSBjbGVhbnVwLCBhZGQgY29tbWVudHMuCisJKHNvbF90aHJlYWRfcmVzdW1lKTogIFByZXZlbnQgcGVvcGxlIGZyb20gdHJ5aW5nIHRvIHN0ZXAKKwlpbmFjdGl2ZSB0aHJlYWRzLgorCShzb2xfdGhyZWFkX3dhaXQgc29sX3RocmVhZF9mZXRjaF9yZWdpc3RlcnMKKwlzb2xfdGhyZWFkX3N0b3JlX3JlZ2lzdGVycyk6ICBSZW1vdmUgdW5uZWNlc3NhcnkgY2hlY2sgZm9yCisJc29sX3RocmVhZF9hY3RpdmUuICBUaGVzZSByb3V0aW5lcyB3b24ndCBnZXQgY2FsbGVkIHVubGVzcyB0aHJlYWRzCisJYXJlIGFjdGl2ZS4KKworTW9uIE1heSAxMyAxMToyOTozNyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwlTSDMtRSBzdXBwb3J0IGZyb20gQWxsYW4gVGFqaWkgPGF0YWppaUBobXNpLmNvbT46CisJKiBzaC10ZGVwLmMgKHNoX3JlZ19uYW1lcywgc2gzX3JlZ19uYW1lcyk6IEFkZCBlbXB0eSBuYW1lcyBmb3IKKwlmbG9hdCByZWdpc3RlcnMuCisJKHNoM2VfcmVnX25hbWVzKTogTmV3IHJlZ2lzdGVyIG5hbWUgYXJyYXkuCisJKHNoX3Byb2Nlc3Nvcl90eXBlX3RhYmxlKTogQWRkIHNoM2UgcHJvY2Vzc29yIHR5cGUuCisJKiBjb25maWcvc2gvdG0tc2guaCAoUkVHSVNURVJfVklSVFVBTF9UWVBFKTogRml4IHRlc3QuCisJKFJFR0lTVEVSX05BTUVTLCBOVU1fUkVHUywgTlVNX1JFQUxSRUdTLCBldGMpOiBBZGp1c3QgZm9yCisJZnVsbCBzZXQgb2YgcmVnaXN0ZXJzLgorCSogcmVtb3RlLWU3MDAwLmMgKHdhbnRfc2gzLCB3YW50X3NoM19ub3BjKTogTmV3IGdsb2JhbHMuCisJKGU3MDAwX2ZldGNoX3JlZ2lzdGVycywgZTcwMDBfd2FpdCk6IFVzZSB0aGVtLgorCSogc2gzLXJvbS5jIChzaDNfcmVnbmFtZXMpOiBBZGQgZmxvYXQgcmVnaXN0ZXJzLgorCShzaDNlX2NtZHMsIHNoM2Vfb3BzKTogTmV3IGdsb2JhbHMuCisJKHNoM2Vfb3Blbik6IE5ldyBmdW5jdGlvbi4KKwkoX2luaXRpYWxpemVfc2gzX3JvbSk6IFJlbmFtZSBmcm9tIF9pbml0aWFsaXplX3NoMywgc2V0IHVwCisJc2gzZSB0YXJnZXQgdmVjdG9yLgorCitGcmkgTWF5IDEwIDE1OjUzOjM4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGxpc2EuY3lnbnVzLmNvbSkKKworCSogc29sLXRocmVhZC5jOiAgQ2xlYW51cC4gIGdjYyAtV2FsbCBmaXhlcy4gIEFkZCBwcm90b3R5cGVzLgorCVByaW50IG91dCBtZXNzYWdlcyBpbnN0ZWFkIG9mIGNvZGVzIGZvciB0aHJlYWRfZGIgZXJyb3JzLiAgTWFrZQorCWFjY2VzcyBtYWNyb3MgZm9yIHRocmVhZCBhbmQgbHdwIG1hbmlwdWxhdGlvbi4gIE1ha2UgY2xlYW51cHMgdG8KKwlmaXh1cCBpbmZlcmlvcl9waWQgaW4gY2FzZSBvZiBlcnJvcnMuCisKK1RodSBNYXkgIDkgMTk6MDY6MDIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGFjbG9jYWwubTQ6IFJlbW92ZSB1bnVzZWQgZGVmaW5pdGlvbiBvZiBBQ19DX0NST1NTLgorCSogY29uZmlndXJlLmluOiBBZGQgcG93ZXJwY2xlLSotc29sYXJpcyogaG9zdCBhbmQgdGFyZ2V0IGNvbmZpZworCXNvIEFwcmlsIDMwdGggY2hhbmdlIGRvZXMgbm90IGdldCBsb3N0IG5leHQgdGltZSBjb25maWd1cmUgaXMKKwlyZWJ1aWx0LgorCitUaHUgTWF5ICA5IDE0OjEzOjA4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluLCBicmVha3BvaW50LmMsIGNvcmVsb3cuYywgZm9yay1jaGlsZC5jLCBpbmZsb3cuYywKKwlpbmZydW4uYywgbWFjLW5hdC5jLCBwcm9jZnMuYywgcmVtb3RlLmMsIHNvbC10aHJlYWQuYywgdGhyZWFkLmMsCisJd2luMzItbmF0LmMsIGNvbmZpZy9ubS1seW54Lmg6ICBSZW5hbWUgdGhyZWFkLmggdG8gZ2RidGhyZWFkLmggdG8KKwlhdm9pZCBjb25mbGljdCB3aXRoIFNvbGFyaXMgL3Vzci9pbmNsdWRlL3RocmVhZC5oLgorCitUaHUgTWF5ICA5IDEyOjMzOjMyIDE5OTYgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+CisKKwkqIGFidWctcm9tLmM6IENvbmZpZyBmaWxlIGZvciB0aGUgb2xkZXIgc3R5bGUgQUJ1ZyBtb25pdG9yIHRoYXQKKwlydW5zIG9uIHRoZSBtdm1lMTN4IGJvYXJkcy4KKwkqIGNvbmZpZy9tNjhrL21vbml0b3IubXQ6IEFkZCBhYnVnIHN1cHBvcnQgZm9yIG02OGsgY3Jvc3MKKwlkZWJ1Z2dpbmcuCisKK1dlZCBNYXkgIDggMjA6MzM6MjQgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGluZmNtZC5jIChkb19yZWdpc3RlcnNfaW5mbyk6ICBBbHdheXMgcHJpbnQgdGhlIHJhdyBmbG9hdGluZworCXBvaW50IHZhbHVlJ3MgYnl0ZXMgaW4gYmlnIGVuZGlhbiBvcmRlciwgc28gdGhlIHRoZSBsZWZ0bW9zdCBiaXQKKwlpcyB0aGUgbW9zdCBzaWduaWZpY2FudC4KKwkqIGJyZWFrcG9pbnQuYyAoY2xlYXJfbW9tZW50YXJ5X2JyZWFrcG9pbnRzKTogUmVtb3ZlIGRlYWQgY29kZQorCXRoYXQgaXMgcmVmZXJlbmNlZCBub3doZXJlIGVsc2UuCisJKHNldF9icmVha3BvaW50KTogRGl0dG8uCisJKGRvX2VuYWJsZV9icmVha3BvaW50KTogQ3JlYXRlZCBmcm9tIGVuYWJsZV9vbmNlX2JyZWFrcG9pbnQKKwl3aXRoIGEgY291cGxlIG9mIGNoYW5nZXMuCisJKGVuYWJsZV9icmVha3BvaW50KTogQ2FsbCBkb19lbmFibGVfYnJlYWtwb2ludCB3aXRoIGFuIGFwcHJvcHJpYXRlCisJYnBkaXNwIGVudW0gdmFsdWUgdG8gc2V0IGRpc3Bvc2l0aW9uIG9mIGJyZWFrcG9pbnQuCisJKGVuYWJsZV9vbmNlX2JyZWFrcG9pbnQpOiBEaXR0by4KKwkoZW5hYmxlX2RlbGV0ZV9icmVha3BvaW50KTogRGl0dG8uCisJKiBicmVha3BvaW50LmggKGNsZWFyX21vbWVudGFyeV9icmVha3BvaW50cyk6IFJlbW92ZSBwcm90b3R5cGUuCisJKiBzeW10YWIuYyAoZmluZF9wY19saW5lKTogSW1wcm92ZSBjb21tZW50cy4KKwkqIHhjb2ZmcmVhZC5jOiBEaXR0by4KKworVHVlIE1heSAgNyAxODozNzowNiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHRhcmdldC5jIChkZWJ1Z190b194ZmVyX21lbW9yeSk6IEluc2VydCBsaW5lIGJyZWFrcyB3aGVuCisJZHVtcGluZyB0aGUgbWVtb3J5IGJsb2NrLgorCitNb24gTWF5ICA2IDEzOjUyOjUyIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGZvcmstY2hpbGQuYyAoZm9ya19pbmZlcmlvciksIGluZmVyaW9yLmg6ICBpbml0X3RyYWNlX2Z1biBub3cKKwlyZXR1cm5zIGEgcG9zc2libHkgbW9kaWZpZWQgcGlkLgorCSogaW5mdGFyZy5jIChwdHJhY2VfaGltKTogIE5vdyByZXR1cm5zIHBpZDsKKwkqIG0zLW5hdC5jIChtM190cmFjZV9oaW0pOiAgTm93IHJldHVybnMgcGlkOworCSogaW5mY21kLmMgKHJ1bl9jb21tYW5kKTogIE1pbm9yIGNsZWFudXAuCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiAgQWRkIGFub3RoZXIgY2hlY2sgZm9yIG9uZV9zdGVwcGVkCisJbmVhciB3aGVyZSB3ZSByZWFkIHRoZSBwYyB0byBhdm9pZCBlcnJvbmVvdXNseSBzZXR0aW5nCisJcmFuZG9tX3NpZ25hbCBmb3IgbXVsdGktdGhyZWFkZWQgc3VwcG9ydC4KKwkqIHByb2Nmcy5jOiAgQWRkIHN1cHBvcnQgZm9yIFNvbGFyaXMgTFdQcy4gIFJlbW92ZSBkZWYgb2YKKwlMT1NJTkdfUE9MTC4gIE1hbnkgY2xlYW51cHMuLi4gIFNldmVyYWwgd29ya2Fyb3VuZHMgZm9yIFNvbGFyaXMKKwlsb3NzYWdlLiAgU3lzdGVtIGNhbGwgZW50cnkgYW5kIGV4aXQgYXJlIG5vdyBoYW5kbGVkIGJ5CisJZHluYW1pY2FsbHkgcmVnaXN0ZXJlZCBoYW5kbGVycy4KKwkqIChzeXNjYWxsbmFtZSk6ICBEb24ndCBiYXJmIHdoZW4gaGFuZGVkIGFuIHVua25vd24gc3lzY2FsbAorCW51bWJlci4KKwkqIChpbmZvX3Byb2Nfc3lzY2FsbHMpOiAgRGl0dG8uCisJKiBzb2wtdGhyZWFkLmM6ICBOZXcgZmlsZS4gIEltcGxlbWVudHMgU29sYXJpcyB0aHJlYWQgc3VwcG9ydC4KKwkqIHN5bWZpbGUuYyAoc3ltYm9sX2ZpbGVfYWRkKTogIEFkZCBjYWxsIHRvIHRhcmdldF9uZXdfb2JqZmlsZSB0bworCW5vdGlmeSB0YXJnZXQtZGVwZW5kZW50IGNvZGUgYWJvdXQgbmV3IHN5bWJvbCB0YWJsZXMuCisJKiAoY2xlYXJfc3ltdGFiX3VzZXJzKTogIENhbGwgdGFyZ2V0X25ld19vYmpmaWxlIHRvIG5vdGlmeSBpdCBvZgorCXRoZSByZW1vdmFsIG9mIGFsbCBzeW1ib2wgdGFibGVzLgorCSogdGFyZ2V0LmMgKHB1c2hfdGFyZ2V0KTogIE1ha2Ugc3VyZSB0aGF0IHRvX2Nsb3NlIGlzIG5vbi16ZXJvCisJYmVmb3JlIGNhbGxpbmcgaXQuCisJKiB0YXJnZXQuaCAodGFyZ2V0X25ld19vYmpmaWxlKTogIFByb3ZpZGUgZGVmYXVsdC4JCisJKiBjb25maWcvYWxwaGEvbm0tb3NmMi5oOiAgRGVmaW5lIExPU0lOR19QT0xMIGJlY2F1c2UgdGhpcyB2ZXJzaW9uCisJb2YgT1NGIGNhbid0IGhhY2sgdXNpbmcgcG9sbCB3aXRoIC9wcm9jLgorCSogY29uZmlnL3NwYXJjL25tLXN1bjRzb2wyLmggKHRhcmdldF9uZXdfb2JqZmlsZSk6ICBEZWZpbmUgdG8gYmUKKwlzb2wtdGhyZWFkLW5ldy1vYmpmaWxlLgorCSogY29uZmlnL3NwYXJjL3N1bjRzb2wyLm1oOiAgQWRkIHNvbC10aHJlYWQubyB0byBOQVRERUZGSUxFUywgYW5kCisJYWRkIGxpYnRocmVhZF9kYi5zby4xIHRvIE5BVF9DTElCUy4KKwkqIGNvbmZpZy9zcGFyYy90bS1zdW40c29sMi5oOiAgRGVmaW5lIFBJREdFVCwgVElER0VULCBhbmQKKwl0YXJnZXRfcGlkX3RvX3N0ci4KKworU2F0IE1heSAgNCAwMjoxMzozNCAxOTk2ICBOIFNyaW4gS3VtYXIgIDxuc3JpbkB3aXBpbmZvLnNvZnQubmV0PgorCisJKiBwcm9jZnMuYyAocmVtb3ZlX2ZkKTogIEZpeCBjb3B5IG9mIGZkcyB0byBmaWxsIGhvbGUgbGVmdCBhZnRlcgorCXJlbW92YWwgb2YgdGhlIHJlcXVlc3RlZCBmZC4KKworTW9uIE1heSAgNiAwNzo1Mjo0OCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHJzNjAwMC10ZGVwLmMgKF9pbml0aWFsaXplX3JzNjAwMF90ZGVwKTogRG9uJ3QgZG8gWENPRkYgc3BlY2lmaWMKKwlob29rcyB1bmRlciBFTEYuCisKKwkqIGNvbmZpZy9wb3dlcnBjL3RtLXBwYy1lYWJpLmg6IERlZmluZSBFTEZfT0JKRUNUX0ZPUk1BVC4KKworVGh1IE1heSAgMiAxMjo0NjoxNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwlGcm9tIFBldGVyIFNjaGF1ZXI6CisJKiBicmVha3BvaW50LmggKGVudW0gYnBkaXNwKTogIEFkZCBkZWxfYXRfbmV4dF9zdG9wLgorCSogYnJlYWtwb2ludC5jIChpbnNlcnRfYnJlYWtwb2ludHMsIHdhdGNocG9pbnRfY2hlY2ssCisJYnBzdGF0X3N0b3Bfc3RhdHVzKTogIEF2b2lkIGJhZCByZWZlcmVuY2VzIHRvIG1lbW9yeSBmcmVlZCB2aWEKKwlkZWxldGVfYnJlYWtwb2ludCBvbiB3YXRjaHBvaW50cyBnb2luZyBvdXQgb2Ygc2NvcGUuCisJRG8gbm90IGRlbGV0ZSB0aGVzZSB3YXRjaHBvaW50cywgZGlzYWJsZSB0aGVtIGFuZCBjaGFuZ2UgdGhlaXIKKwlkaXNwb3NpdGlvbiB0byBkZWxfYXRfbmV4dF9zdG9wIGluc3RlYWQuCisJKGJyZWFrcG9pbnRfYXV0b19kZWxldGUpOiAgRGVsZXRlIGFsbCBicmVha3BvaW50cyB3aG9zZSBkaXNwb3NpdGlvbgorCWlzIGRlbF9hdF9uZXh0X3N0b3AuCisJKGJyZWFrcG9pbnRfaW5pdF9pbmZlcmlvcik6ICBVc2Ugc3dpdGNoIHRvIGF2b2lkIHJlZmVyZW5jZSB0bworCWFscmVhZHkgZGVsZXRlZCBicmVha3BvaW50LgorCitXZWQgTWF5ICAxIDE3OjI5OjE4IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAocnM2MDAwLW5hdC5vKTogRGVwZW5kIG9uIHhjb2Zmc29saWIuaC4KKwkqIGNvbmZpZy9yczYwMDAvcnM2MDAwLm1oIChOQVRERVBGSUxFUyk6IE1vdmUgeGNvZmZyZWFkLm8gLi4uCisJKiBjb25maWcvcnM2MDAwL3JzNjAwMC5tdCAoVERFUEZJTEVTKTogLi4uIHRvIGhlcmUuCisJKiB4Y29mZnNvbGliLmMgKHhjb2ZmX3JlbG9jYXRlX3N5bXRhYl9ob29rKTogRGVmaW5lIGFuZCBpbml0aWFsaXplLgorCShzb2xpYl9pbmZvKTogQ2FsbCB4Y29mZl9yZWxvY2F0ZV9zeW10YWIgdmlhIHRoZSBob29rLgorCShzaGFyZWRsaWJyYXJ5X2NvbW1hbmQpOiBEaXR0by4KKwkqIHhjb2ZmcmVhZC5jOiBSZW1vdmUgYWxsIEZBS0lOR19SUzYwMDAgY29tbWVudHMgYW5kIGRlZmluZXMuCisJKHhjb2ZmX2FkZF90b2NfdG9fbG9hZGluZm9faG9vayk6IERlZmluZSBhbmQgaW5pdGlhbGl6ZSBoZXJlLgorCSh4Y29mZl9pbml0X2xvYWRpbmZvX2hvb2spOiBEZWZpbmUgYW5kIGluaXRpYWxpemUgaGVyZS4KKwkoc2Nhbl94Y29mZl9zeW10YWIpOiBDYWxsIHhjb2ZmX2FkZF90b2NfdG9fbG9hZGluZm8gdmlhIHRoZSBob29rLgorCSh4Y29mZl9pbml0aWFsX3NjYW4pOiBDYWxsIHhjb2ZmX2luaXRfbG9hZGluZm8gdmlhIHRoZSBob29rLgorCSogeGNvZmZzb2xpYi5oICh4Y29mZl9yZWxvY2F0ZV9zeW10YWJfaG9vayk6IERlY2xhcmUgZXh0ZXJuIGZ1bmMuCisJKiByczYwMDAtdGRlcC5jIChfaW5pdGlhbGl6ZV9yczYwMDBfdGRlcCk6IEFkZCBpbml0aWFsaXphdGlvbnMKKwlvZiB4Y29mZl9hZGRfdG9jX3RvX2xvYWRpbmZvX2hvb2sgYW5kIHhjb2ZmX2luaXRfbG9hZGluZm9faG9vay4KKwkqIHJzNjAwMC1uYXQuYyAoX2luaXRpYWxpemVfY29yZV9yczYwMDApOiBBZGQgaW5pdGlhbGl6YXRpb24KKwlvZiB4Y29mZl9yZWxvY2F0ZV9zeW10YWJfaG9vay4KKworVHVlIEFwciAzMCAxMzoyMjowMiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZSAocG93ZXJwY2xlLSotc29sYXJpcyopOiBBZGQgU29sYXJpcyBzdXBwb3J0LgorCisJKiBjb25maWcvcG93ZXJwYy97c29sYXJpcy5tW2h0XSx0bS1zb2xhcmlzLmh9OiBOZXcgZmlsZXMgZm9yCisJU29sYXJpcyBzdXBwb3J0LgorCitNb24gQXByIDI5IDE2OjE3OjMxIDE5OTYgIERhd24gUGVyY2hpayA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBjLXZhbHByaW50LmMgKGNfdmFsX3ByaW50KTogRml4IHByaW50aW5nIGZvciBhcnJheXMgZGVmaW5lZCAKKwl3aXRoIDAgbGVuZ3RoLgorCitTdW4gQXByIDI4IDE1OjA4OjA1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCVN1cHBvcnQgZm9yIGJpLWVuZGlhbiByZW1vdGUgYnJlYWtwb2ludHMuCisJKiByZW1vdGUuYyAoYmlnX2JyZWFrX2luc24sIGxpdHRsZV9icmVha19pbnNuKTogTmV3IGdsb2JhbHMuCisJKGJyZWFrX2luc24pOiBSZW1vdmUuCisJKHJlbW90ZV9pbnNlcnRfYnJlYWtwb2ludCwgcmVtb3RlX3JlbW92ZV9icmVha3BvaW50KTogVXNlIG93bgorCWNvZGUgaWYgUkVNT1RFX0JSRUFLUE9JTlQgZGVmaW5lZCwgb3RoZXJ3aXNlIGNhbGwgbWVtb3J5CisJYnJlYWtwb2ludCBmdW5jdGlvbnMuCisJKiBjb25maWcvc2gvdG0tc2guaCAoUkVNT1RFX0JSRUFLUE9JTlQpOiBSZW1vdmUuCisJKEJJR19SRU1PVEVfQlJFQUtQT0lOVCwgTElUVExFX1JFTU9URV9CUkVBS1BPSU5UKTogRGVmaW5lLgorCisJKiBtb245NjAtcm9tLmMgKG1vbjk2MF9jbWRzKTogUmVtb3ZlIGZvcndhcmQgZGVjbC4KKwkobW9uOTYwX2xvYWQpOiBVc2UgY3VycmVudF9tb25pdG9yIGluc3RlYWQgb2YgbW9uOTYwX2NtZHMuCisJKG1vbjk2MF9yZWduYW1lcyk6IFJlbW92ZSBiYWNrc2xhc2hlcyBmcm9tIGxpbmUgZW5kcy4KKwkoX2luaXRpYWxpemVfbW9uOTYwKTogRml4IGRvY3VtZW50YXRpb24gc3RyaW5nLgorCitTdW4gQXByIDI4IDEyOjEwOjM1IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBzeW1maWxlLmggKHBzeW1ib2xfYWxsb2NhdGlvbl9saXN0KTogIEV4cGFuZCBjb21tZW50cyB3aGljaAorCWRlc2NyaWJlIHRoZSBwc3ltYm9sIGFsbG9jYXRpb24gbGlzdCBhbmQgaG93IGVhY2ggZmllbGQgaXMKKwl1c2VkLgorCitTdW4gQXByIDI4IDAzOjQ0OjMwIDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogYnJlYWtwb2ludC5jIChkZWxldGVfYnJlYWtwb2ludCk6ICBGaXggYnB0LT52YWwsIGJwdC0+ZXhwCisJc3RvcmFnZSBsZWFrcy4KKwkoYnJlYWtwb2ludF9yZV9zZXRfb25lKTogIEZpeCBiLT5leHAsIGItPnZhbCwgYi0+Y29uZCBzdG9yYWdlIGxlYWtzLgorCisJKiBpbmZjbWQuYyAocnVuX2NvbW1hbmQpLCBzb2xpYi5jIChsb2NhdGVfYmFzZSk6ICBDaGVjayBmb3IKKwl0YXJnZXRfaGFzX2V4ZWN1dGlvbiBpbiBhZGRpdGlvbiB0byBpbmZlcmlvcl9waWQsIGEgY29yZSBmaWxlCisJZnJvbSBhIHRocmVhZGVkIHByb2dyYW0gaXMgeWllbGRpbmcgYSBub24temVybyBpbmZlcmlvcl9waWQuCisKKwkqIHNwYXJjLXRkZXAuYyAoZ2V0X3NhdmVkX3JlZ2lzdGVyKTogIEhhbmRsZSB3aW5kb3cgcmVnaXN0ZXJzCisJaW4gYSBkdW1teSBmcmFtZSBjb3JyZWN0bHkuCisKK1NhdCBBcHIgMjcgMjA6Mzg6MzIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChDTElCUyk6IE1vdmUgJChNTUFMTE9DKSBwYXN0IGFsbCBvdGhlciBsaWJzLAorCXNvIHRoYXQgYW55dGhpbmcgdGhhdCB3YW50cyBhbiBhbGxvY2F0aW9uIGZ1bmN0aW9uIG5vdCB5ZXQgcHVsbGVkCisJaW4sIHdpbGwgZ2V0IGl0IGZyb20gbW1hbGxvYyByYXRoZXIgdGhhbiBhIHN5c3RlbSBsaWJyYXJ5LgorCSogTWFrZWZpbGUuaW4gKElOU1RBTExFRF9MSUJTKTogUmVvcmRlciB0byBtYXRjaCBvcmRlciBvZiBDTElCUywKKwl0byBhdm9pZCBzdXJwcmlzaW5nIHJlc3VsdHMgd2hlbiB1c2VkLgorCitTYXQgQXByIDI3IDAwOjEyOjA1IDE5OTYgIERhd24gUGVyY2hpayAgKGRhd25AY3lnbnVzLmNvbSkKKworCSogc3RhYnNyZWFkLmM6IENoYW5nZXMgYW5kIGJ1ZyBmaXhlcyBmb3IgY2Zyb250IHN1cHBvcnQuCisJRml4IGJ1ZyBmb3IgY2xhc3MgZGF0YSBtZW1iZXJzLgorCUZpeCBwYXJzaW5nIGJ1ZyB3aGVuIG5vIGJhc2UgY2xhc3NlcyBleGlzdC4KKwlGaXggbWVtb3J5IGJ1ZyAtIGFsbG9jYXRlIHNwYWNlIGZvciBjcGx1c3BsdXMgc3BlY2lmaWMgaW5mby4KKwlBZGQgc3VwcG9ydCBmb3Igc3RhdGljIGRhdGEuCisJQWRkIHByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuCisJRW5oYW5jZSBjb21tZW50cyB0byBzaG93IHdoYXQgZWFjaCBmdW5jdGlvbiBleHBlY3RzIHRvIHBhcnNlLgorCUNsZWFudXAgY29kZS4KKwkqIHN0YWJzcmVhZC5jKHJlc29sdmVfY29udCksZGJ4cmVhZC5jKHJlc29sdmVfY29udCk6IFJlbmFtZSAKKwlmdW5jdGlvbiB0byByZXNvbHZlX2Nmcm9udF9jb250aW51YXRpb24uCisKK0ZyaSBBcHIgMjYgMjM6NTg6MjYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBDYWxsIHJlZ2lzdGVyc19jaGFuZ2VkIHdoZW4KKwlyZXN0YXJ0aW5nIHRoZSBpbmZlcmlvciB0byBnZXQgb3ZlciBhIG51bGxpZmllZCBpbnN0cnVjdGlvbi4KKwkKK1R1ZSBBcHIgMjQgMTI6MTI6NTUgMTk5NiAgRGF3biBQZXJjaGlrIChkYXduQGN5Z251cy5jb20pCisKKwkqIGRieHJlYWQuYyxzdGFic3JlYWQuYyxnZGJ0eXBlcy5jLHBhcnRpYWwtc3RhYi5oLHZhbG9wcy5jOiAKKwlBZGQgbmV3IHN1cHBvcnQgZm9yIHBhcnNpbmcgY2Zyb250IHN0YWJzLgorCitXZWQgQXByIDI0IDAwOjMyOjU1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogTW92ZSAiaGF2ZV93YWl0ZWQiIGxhYmVsCisJb3V0c2lkZSBvZiAjaWZkZWYgY29uZGl0aW9uYWxzLiAgRG9uJ3QgdHJhc2ggdGhlIHdhaXQgc3RhdHVzCisJaWYgd2UgZ2V0IGEgc2lnbmFsIGFuZCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBpcyBudWxsaWZpZWQuCisKK01vbiBBcHIgMjIgMjA6MTc6MDEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogQnVtcCB2ZXJzaW9uIG51bWJlciB0byA0LjE2LjEuCisJKiBORVdTOiBVcGRhdGUgZm9yIDQuMTYgcmVsZWFzZS4KKworTW9uIEFwciAyMiAxNjozMjoyOSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1vbml0b3IuaDogQ2xlYW4gdXAgY29tbWVudCBmb3JtYXR0aW5nLgorCShjdXJyZW50X21vbml0b3IpOiBSZW1vdmUgZGVjbC4KKwkoTE9BRFRZUEVTLCBMT0FEUFJPVE9TLCBJTklUX0NNRCwgZXRjKTogUmVtb3ZlIGRlZmluaXRpb25zLgorCShwdXNoX21vbml0b3IsIFNSRUNfU0laRSk6IFJlbW92ZS4KKwkqIG1vbml0b3IuYzogRXhwYW5kIG9sZCBtYWNybyBpbnRvIGN1cnJlbnRfbW9uaXRvciBkZXJlZnMKKwlldmVyeXdoZXJlLgorCSogcmVtb3RlLW9zOWsuYyAoY3VycmVudF9tb25pdG9yKTogUmVtb3ZlIGRlZmluaXRpb24uCisKK01vbiBBcHIgMjIgMTQ6NTQ6NDUgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBzdXBlcmJhbGwuY3lnbnVzLmNvbT4KKworCSogY29yZWZpbGUuYyAoc3BlY2lmeV9leGVjX2ZpbGVfaG9vayk6IEFsbG93IGFyYml0cmFyeSBudW1iZXIgb2YKKyAJaG9va3MuCisJKGNhbGxfZXh0cmFfZXhlY19maWxlX2hvb2tzKTogTmV3IGZ1bmN0aW9uLgorCSogaDgzMDAtdGRlcC5jOiBMaW50OyBhZGQgLmggZmlsZXMgdG8gcHJvdmlkZSBtaXNzaW5nIGRlY2xhcmF0aW9ucywKKwlyZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KKwkoc2V0X21hY2hpbmVfaG9vayk6IE5ldyBmdW5jdGlvbi4KKwkoX2luaXRpYWxpemVfaDgzMDBtKTogSW5pdGlhbGl6ZSBpdC4KKworRnJpIEFwciAxOSAxNTowMzo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1taXBzLmMgKGVuY29kaW5nKTogRG9uJ3Qgc3BlY2lmeSBzaXplLCB0byBhdm9pZCBidWcgaW4KKwlTdW5PUyBuYXRpdmUgY29tcGlsZXIuCisKK1RodSBBcHIgMTggMTg6NDY6NTcgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtb25pdG9yLmM6IFVzZSBpbnQgcmF0aGVyIHRoYW4gTE9OR0VTVCBmb3IgdmFsdWVzLCBzaW5jZQorCXRoZSBmb3JtYXR0aW5nIHN0cmluZ3MgYXJlIG5vdCBwcmVwYXJlZCB0byBhY2NlcHQgbG9uZyBsb25ncy4KKworV2VkIEFwciAxNyAyMDoxNzoyNyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBhcm0tdGRlcC5jIChpbml0aWFsaXplX2FybV90ZGVwKTogTWFrZSBhcGNzMzIgYSBgemludGVnZXInLgorCitUdWUgQXByIDE2IDE3OjM4OjIzIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvcmVsb3cuYyAoYWRkX3RvX3RocmVhZF9saXN0KTogIE1ha2Ugc3VyZSByZWdfc2VjdCBpcyBub24tbnVsbAorCWJlZm9yZSBkZS1yZWZlcmVuY2luZyBpdC4gIFByZXZlbnRzIGRlcmVmIG9mIE5VTEwgcG9pbnRlciBpZiBjb3JlCisJZmlsZSBsYWNrcyAucmVnIHNlY3Rpb24uCisJKiBkZWZzLmg6ICBSZW5hbWUgZmxvYXRmb3JtYXRfe3RvIGZyb219X2xvbmdfZG91YmxlIHRvCisJZmxvYXRmb3JtYXRfe3RvIGZyb219X2RvdWJsZXN0LiAgR2V0IHJpZCBvZiBGTE9BVEZPUk1BVF97VE8KKwlGUk9NfS4uLiBtYWNyb3MuCisJKiBmaW5kdmFyLmMgKGV4dHJhY3RfZmxvYXRpbmcgc3RvcmVfZmxvYXRpbmcpOiAgQ2hhbmdlIGFsbCByZWZzIHRvCisJRkxPQVRGT1JNQVRfe0ZST00gVE99Li4uIHRvIGZsb2F0Zm9ybWF0X3tmcm9tIHRvfV9kb3VibGVzdC4KKwkqIHV0aWxzLmM6ICBDaGFuZ2UgZmxvYXRmb3JtYXRfe3RvIGZyb219X2xvbmdfZG91YmxlIHRvCisJZmxvYXRmb3JtYXRfe3RvIGZyb219X2RvdWJsZXN0IGN1eiB0aGUgbmV3IHJvdXRpbmVzIHdpbGwgdXNlCisJd2hhdGV2ZXIgc2l6ZSAoZG91YmxlIG9yIGxvbmcgZG91YmxlKSBpcyBhcHByb3ByaWF0ZS4KKwkqIGNvbmZpZy9pOTYwL3RtLWk5NjAuaCAoUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMCisJUkVHSVNURVJfQ09OVkVSVF9UT19SQVcpOiAgQ2hhbmdlIEZMT0FURk9STUFULi4uIG1hY3JvcyB0bworCWZsb2F0Zm9ybWF0Li4uIHJvdXRpbmUgY2FsbHMuCisKK01vbiBBcHIgMTUgMTY6MzQ6MTEgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIHN0YWJzcmVhZC5jIChyZWFkX3R5cGUpOiAgTW92ZSBoYW5kbGluZyBvZiAnQCcgZnJvbSB0eXBlCisJbnVtYmVyIGhhbmRsaW5nIHRvIGhhbmRsaW5nIG9mIHR5cGVzIHByb3BlciAoYXMgZW1pdHRlZCBieSBnY2MhKS4KKwlGb3IgdHlwZWRlZnMsIGFsbG9jYXRlIHRoZSB0eXBlZGVmIHR5cGUgYmVmb3JlIHJlYWRpbmcgaXRzCisJZGVmaW5pdGlvbiwgdG8gcHJvcGVybHkgaGFuZGxpbmcgcmVjdXJzaXZlIHR5cGVzLgorCitNb24gQXByIDE1IDExOjE5OjI2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY2gtZXhwLmMgKGNhbGN1bGF0ZV9hcnJheV9sZW5ndGgpOiBGaXggcHJvdG90eXBlLgorCitTYXQgQXByIDEzIDE0OjIxOjE2IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS1uaW5keS5jIChuaW5keV9vcGVuKTogIEFjcXVpcmUgbW9yZSB0YXJnZXQgc3RhdGUgc28gdGhhdAorCXVzZXIgY2FuIGF0dGFjaCB0byBhIHByZXZpb3VzbHkgcnVubmluZyBwcm9ncmFtLgorCSogKG5pbmR5X2ZldGNoX3JlZ2lzdGVycyBuaW5keV9zdG9yZV9yZWdpc3RlcnMpOiAgR2V0IHJpZCBvZiBmcAorCWNvbnZlcnNpb24gY29kZS4gIFRoYXQncyBhbGwgaGFuZGxlZCBpbiB7ZXh0cmFjdCBzdG9yZX1fZmxvYXRpbmcKKwlub3cuCisJKiB1dGlscy5jIChmbG9hdGZvcm1hdF90b19kb3VibGUpOiAgRG9uJ3QgYmlhcyBleHBvbmVudCB3aGVuCisJaGFuZGxpbmcgemVybydzLCBkZW5vcm1zIG9yIE5hTnMuCisJKiBjb25maWcvaTk2MC90bS1pOTYwLmggKFJFR0lTVEVSX0NPTlZFUlRfVE9fVklSVFVBTAorCVJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXKTogIENoYW5nZSB0byB1c2luZyBET1VCTFNUIGFuZAorCUZMT0FURk9STUFUX1RPL0ZST01fRE9VQkxFU1QgbWFjcm9zLgorCSogY29uZmlnL2k5NjAvdG0tbmluZHk5NjAuaDogIFVuZGVmaW5lCisJUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMLCBSRUdJU1RFUl9DT05WRVJUX1RPX1JBVywgYW5kCisJUkVHSVNURVJfQ09OVkVSVElCTEUuICBUaGVzZSBhcmUgbm8gbG9uZ2VyIG5lY2Vzc2FyeSBub3cgdGhhdCBhbGwKKwl0aGUgbWFnaWMgaGFwcGVucyBpbiBleHRyYWN0L3N0b3JlX2Zsb2F0aW5nLgorCitTYXQgQXByIDEzIDAyOjU4OjAyIDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHBfc3RhbmRhcmQpOiAgUmVwb3J0IGVycm9yIHdoZW4gYXR0ZW1wdGluZyB0bworCWV2YWx1YXRlIHN1YnNjcmlwdHMgZm9yIHR5cGVzIHdoaWNoIGNhbm5vdCBiZSBzdWJzY3JpcHRlZC4KKworCSogdmFsYXJpdGguYyAodmFsdWVfeF9iaW5vcCwgdmFsdWVfeF91bm9wKTogIEFkZCBub3NpZGUgcGFyYW1ldGVyLgorCVJldHVybiBhIHplcm8gdmFsdWUgd2l0aCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1lbWJlciBmdW5jdGlvbgorCWlmIG5vc2lkZSBpcyBFVkFMX0FWT0lEX1NJREVfRUZGRUNUUyBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhlIG1lbWJlcgorCWZ1bmN0aW9uLgorCSogdmFsdWVzLmggKHZhbHVlX3hfYmlub3AsIHZhbHVlX3hfdW5vcCk6ICBVcGRhdGUgcHJvdG90eXBlcworCWFjY29yZGluZ2x5LgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHBfc3RhbmRhcmQpOiAgVXBkYXRlIGFsbCBjYWxsZXJzIG9mCisJdmFsdWVfeF9iaW5vcCwgdmFsdWVfeF91bm9wIGFjY29yZGluZ2x5LgorCisJKiB2YWxhcml0aC5jICh2YWx1ZV9uZWcsIHZhbHVlX2NvbXBsZW1lbnQpOiAgUGVyZm9ybSBBTlNJIEMvQysrCisJaW50ZWdyYWwgcHJvbW90aW9uIG9uIG9wZXJhbmRzLgorCitGcmkgQXByIDEyIDEzOjE5OjI3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBSRUFETUU6IFVwZGF0ZSBmb3IgNC4xNiByZWxlYXNlLgorCSogY29uZmlndXJlLmluIChBQ19DSEVDS19GVU5DUyk6IEFsc28gY2hlY2sgZm9yIHNicmsuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZi4KKwkqIGNvbmZpZy5pbjogUmVnZW5lcmF0ZSB3aXRoIGF1dG9oZWFkZXIuCisJKiBtYWluLmMgKG1haW4pOiBPbmx5IHVzZSBzYnJrKCkgd2hlbiBIQVZFX1NCUksgaXMgZGVmaW5lZC4KKwkqIHRvcC5jIChjb21tYW5kX2xvb3ApOiBEaXR0by4KKworRnJpIEFwciAxMiAwOTo0NToyOSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBkZWZzLmg6ICBEZWZpbmUgVEFSR0VUX3tGTE9BVCBET1VCTEUgTE9OR19ET1VCTEV9X0ZPUk1BVAorCWRlZmF1bHRzIGZvciBiaS1lbmRpYW4gdGFyZ2V0cy4gIFJlcGxhY2UgZnVuY3Rpb24gcG9pbnRlcnMgZm9yCisJZmxvYXRmb3JtYXQgcm91dGluZXMgd2l0aCBtYWNyb3MuICBObyBuZWVkIGZvciB0aGVzZSB0byBiZSBydW50aW1lCisJc2VsZWN0YWJsZS4KKwkqIGZpbmR2YXIuYzogIEdldCByaWQgb2YgZmxvYXRmb3JtYXQgZnVuY3Rpb24gcG9pbnRlcnMuICBVc2UKKwltYWNyb3MgaW4gZXh0cmFjdF9mbG9hdGluZyBhbmQgc3RvcmVfZmxvYXRpbmcuCisJKiByZW1vdGUtbmluZHkuYyAobmluZHlfZmV0Y2hfcmVnaXN0ZXJzIG5pbmR5X3N0b3JlX3JlZ2lzdGVycyk6CisJVXNlIGZsb2F0Zm9ybWF0IG1hY3Jvcy4KKworVGh1IEFwciAxMSAyMToyODowMiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCUZyb206IE1pbGVzIEJhZGVyICA8bWlsZXNAZ251LmFpLm1pdC5lZHU+CisJKiBjb25maWd1cmUuaW4gKEFDX0NIRUNLX0hFQURFUlMpOiBjaGVjayBmb3IgZW5kaWFuLmguCisJVXNlIEFDX0NIRUNLX1RPT0wgdG8gZmluZCBBUiAmIFJBTkxJQi4gIEFkZCBBQ19QUk9HX0FXSy4KKwlBZGQgaG9zdCAmIHRhcmdldCBjYXNlcyBmb3IgaVszNDVdODYtKi1nbnUqLgorCSogY29uZmlnLmluOiBSZWdlbmVyYXRlIHdpdGggYXV0b2hlYWRlci4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mLgorCSogTWFrZWZpbGUuaW4gKEFSLCBBV0spOiBTZXQgZnJvbSBjb3JyZXNwb25kaW5nIGF1dG9jb25mIHN1YnN0cy4KKwkoaW5pdC5jKTogRG9uJ3Qgc2NhbiBtaWctZ2VuZXJhdGVkIGZpbGVzLgorCSogZGVmcy5oIChlbmRpYW4uaCk6IEluY2x1ZGUgaWYgSEFWRV9FTkRJQU5fSCBkZWZpbmVkLgorCSogY29uZmlnL25tLW0zLmggKEFUVEFDSF9OT19XQUlUKTogRGVmaW5lLgorCSogaW5mY21kLmMgKGF0dGFjaF9jb21tYW5kKTogVXNlICIjaWZuZGVmIEFUVEFDSF9OT19XQUlUIgorIAlyYXRoZXIgdGhhbiAiI2lmbmRlZiBNQUNIIi4KKworVGh1IEFwciAxMSAxODo0OTo0MiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS5jIChyZW1vdGV3cml0ZXNpemUpOiBOZXcgR0RCIHZhcmlhYmxlLCBjb250cm9scyBzaXplCisJb2YgbWVtb3J5IHBhY2tldHMgc2VudCB0byB0aGUgdGFyZ2V0LgorCitUaHUgQXByIDExIDEzOjQ3OjUyIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGRjYWNoZS5jOiAgQWRkIHByb3RvdHlwZXMuICBNYWtlIG1hbnkgZnVuY3Rpb25zIHN0YXRpYy4KKwkqIChkY2FjaGVfcGVlayBkY2FjaGVfZmV0Y2ggZGNhY2hlX3Bva2UpOiAgTWFrZSBkY2FjaGVfZmV0Y2ggYW5kCisJZGNhY2hlX3Bva2UgY2FsbCBkY2FjaGVfeGZlcl9tZW1vcnkgZGlyZWN0bHkgaW4gb3JkZXIgdG8gZml4CisJcHJvYmxlbXMgd2l0aCB0dXJuaW5nIG9mZiBkY2FjaGUuICBkY2FjaGVfcGVlayBpcyBub3cgdW5uZWNlc3NhcnksCisJc28gaXQgZ29lcyBhd2F5LgorCisJKiBkZWZzLmg6ICBEZWZpbmUgbmV3IG1hY3JvcyBIT1NUX3tGTE9BVCBET1VCTEUJTE9OR19ET1VCTEV9X0ZPUk1BVCAKKwlhbmQgVEFSR0VUX3tGTE9BVCBET1VCTEUgTE9OR19ET1VCTEV9X0ZPUk1BVCB0byBzcGVjaWZ5IGEgcG9pbnRlcgorCXRvIGEgc3RydWN0IGZsb2F0Zm9ybWF0LiAgVGhpcyBhbGxvd3MgZm9yIGJldHRlciBoYW5kbGluZyBvZgorCXRhcmdldHMgd2hvc2UgZmxvYXRpbmcgcG9pbnQgZm9ybWF0cyBkaWZmZXIgZnJvbSB0aGUgaG9zdCBieSBtb3JlCisJdGhhbiBqdXN0IGJ5dGUgb3JkZXIuCisJKiAoZmxvYXRmb3JtYXRfdG9fbG9uZ19kb3VibGUgZmxvYXRmb3JtYXRfZnJvbV9sb25nX2RvdWJsZSk6CisJUHJvdG90eXBlcyBmb3IgbmV3IGZ1bmN0aW9ucyBpbiB1dGlscy5jLgorCSogKGZsb2F0Zm9ybWF0X3RvX2RvdWJsZXN0IGZsb2F0Zm9ybWF0X2Zyb21fZG91Ymxlc3QpOiAgUHJvdG90eXBlcworCWZvciBwb2ludGVycyB0byBmbG9hdGluZyBwb2ludCBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gIFRoZSBhY3R1YWwKKwlmdW5jdGlvbiB1c2VzIGVpdGhlciBkb3VibGUgb3IgbG9uZyBkb3VibGUgaWYgdGhlIGhvc3Qgc3VwcG9ydHMgaXQuCisJKiBmaW5kdmFyLmMgKGZsb2F0Zm9ybWF0X3RvX2RvdWJsZXN0IGZsb2F0Zm9ybWF0X2Zyb21fZG91Ymxlc3QpOgorCUluaXRpYWxpemUgdG8gcG9pbnQgYXQgY29ycmVjdCBmdW5jdGlvbiBkZXBlbmRpbmcgb24gSEFWRV9MT05HX0RPVUJMRS4KKwkqIChleHRyYWN0X2Zsb2F0aW5nIHN0b3JlX2Zsb2F0aW5nKTogIFJld3JpdGUuICBOb3csIGlmIGhvc3QgZnAKKwlmb3JtYXQgaXMgdGhlIHNhbWUgYXMgdGhlIHRhcmdldCwgd2UganVzdCBkbyBhIGNvcHkuICBPdGhlcndpc2UsCisJd2UgY2FsbCBmbG9hdGZvcm1hdF97dG8gZnJvbX1fZG91Ymxlc3QuCisJKiByZW1vdGUtbmluZHkuYyAobmluZHlfeGZlcl9pbmZlcmlvcl9tZW1vcnkpOiAgQ2hhbmdlIHBhcmFtCisJYHdyaXRlJyB0byBgc2hvdWxkX3dyaXRlJy4KKwkqIHV0aWxzLmMgKGZsb2F0Zm9ybWF0X3RvX2xvbmdfZG91YmxlCisJZmxvYXRmb3JtYXRfZnJvbV9sb25nX2RvdWJsZSk6ICBOZXcgcm91dGluZXMgdGhhdCBpbXBsZW1lbnQgbG9uZworCWRvdWJsZSB2ZXJzaW9ucyBvZiBmdW5jdGlvbnMgaW4gbGliaWJlcnR5L2Zsb2F0Zm9ybWF0LmMuCisJKiBjb25maWcvaTk2MC90bS1pOTYwLmggKFRBUkdFVF9MT05HX0RPVUJMRV9GT1JNQVQpOiAgRGVmaW5lIHRoaXMgZm9yCisJaTk2MCBleHRlbmRlZCByZWFsICg4MCBiaXQpIG51bWJlcnMuCisJKiBuaW5keS1zaGFyZS9uaW5keS5jIChuaW5NZW1HZXQgbmluTWVtUHV0KTogIFJldHVybiBudW1iZXIgb2YgYnl0ZXMKKwlhY3R1YWxseSByZWFkIG9yIHdyaXR0ZW4uCisKK1dlZCBBcHIgMTAgMDI6NTY6MDYgMTk5NiAgV2lsZnJpZWQgTW9zZXIgIDxtb3NlckBydGwuY3lnbnVzLmNvbT4KKworCSogY2gtdmFscHJpbnQuYyAoY2hpbGxfdmFsX3ByaW50KTogUmVtb3ZlIGNhbGwgdG8gY2FsY3VsYXRlX2FycmF5X2xlbmd0aC4KKwkoY2FsY3VsYXRlX2FycmF5X2xlbmd0aCk6IE1vdmUgZnVuY3Rpb24gZnJvbSBoZXJlIC4uLgorCisJKiBjaC1leHAuYyAoY2FsY3VsYXRlX2FycmF5X2xlbmd0aCk6IC4uLiB0byBoZXJlLgorCShwYXJzZV9wcmltdmFsKTogSWYgd2UgaGF2ZSBhIHN5bWJvbCB3aXRoIGFuIGFycmF5IHR5cGUKKwlhbmQgdGhlIGxlbmd0aCBpcyAwLCBjYWxsIGNhbGN1bGF0ZV9hcnJheV9sZW5ndGguCisKK1R1ZSBBcHIgIDkgMDE6MjM6MDUgMTk5NiAgV2lsZnJpZWQgTW9zZXIgIDxtb3NlckBydGwuY3lnbnVzLmNvbT4KKworCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHBfc3RhbmRhcmQpOiBJbiBjYXNlIG9mIFRZUEVfQ09ERV9TRVQ6CisJQWRkIHNvbWUgY2hlY2tzIGZvciBwb3dlcnNldCBjb21wYXRpYmlsaXR5LgorCisJKiB2YWxvcHMuYyAodmFsdWVfc2xpY2UpOiBVc2UgbG93Ym91bmQgaW5zdGVhZCBvZiBsb3dlcmJvdW5kIGZvcgorCWNhbGwgdG8gc2xpY2VfcmFuZ2VfdHlwZSB0byBnZXQgY29ycmVjdCBib3VuZHMuCisKK01vbiBBcHIgIDggMTI6NTM6NTYgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChzY20tZXhwLm8sIHNjbS1sYW5nLm8sIHNjbS12YWxwcmludC5vKTogQWRkIHRhcmdldHMgYW5kCisJZGVwZW5kZW5jaWVzLgorCSogc2NtLWxhbmcuYyAoZ2RiX3N0cmluZy5oKTogSW5jbHVkZS4KKwkqIG9iamZpbGVzLmMgKGFkZF90b19vYmpmaWxlX3NlY3Rpb25zKTogQ2FzdCBzZWNvbmQgYXJnIG9mIG9ic3RhY2tfZ3JvdworCWNhbGwgdG8gY29ycmVjdCB0eXBlIChjaGFyICopLgorCSogY3AtdmFscHJpbnQuYyAoY3BfcHJpbnRfc3RhdGljX2ZpZWxkKTogRGl0dG8uCisJKiBzb21zb2xpYi5jIChzb21fc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiBBZGQgYSBkZWNsYXJhdGlvbgorCWZvciBleHRlcm5hbCBmaW5kX3Vud2luZF9lbnRyeSBmdW5jdGlvbiAoZnJvbSBocHBhLXRkZXAuYykuCisJKiByZW1vdGUtcGEuYyAocmVtb3RlX3dyaXRlX2J5dGVzLCByZW1vdGVfcmVhZF9ieXRlcyk6IENoYW5nZQorCXR5cGUgb2Ygc2Vjb25kIGFyZyB0byAiY2hhciAqIiB0byBiZSB0eXBlIGNvbXBhdGlibGUgd2l0aAorCWRjYWNoZS4KKwkocmVtb3RlX3dhaXQpOiBDYXN0IHNlY29uZCBhcmcgdG8gc3RydG9sIHRvIGNvcnJlY3QgdHlwZS4KKwkqIGhwcGEtdGRlcC5jIChjb21wYXJlX3Vud2luZF9lbnRyaWVzKTogQ2hhbmdlIGFyZ3VtZW50IHR5cGVzIHRvCisJImNvbnN0IHZvaWQgKiIgdG8gYmUgdHlwZSBjb21wYXRpYmxlIHdpdGggcXNvcnQsIGFuZCB0aGVuCisJYXNzaWduIHRvIGxvY2FsIGFyZ3MgcHJpb3IgdG8gdXNlLgorCitNb24gQXByICA4IDE1OjM1OjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaW5mcHRyYWNlLmMgKGtpbGxfaW5mZXJpb3IpOiBSZW1vdmUgY2FsbCB0byAia2lsbCI7IHVwZGF0ZQorCWNvbW1lbnRzLgorCitNb24gQXByICA4IDE0OjA1OjA3IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1lNzAwMC5jOiBkb24ndCBhcHBlbmQgOjIzIHRvIHRhcmdldCBwb3J0IGlmIF9fV0lOMzJfXworCWlzIGRlZmluZWQgKGl0J3MgV2luR0RCKS4KKworU3VuIEFwciAgNyAyMjozNDoyOSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCUZyb206IE1pbGVzIEJhZGVyICA8bWlsZXNAZ251LmFpLm1pdC5lZHU+CisJKiBnbnUtbmF0LmMsIGdudS1uYXQuaCwgbXNnLmRlZnMsIGV4Y19yZXF1ZXN0LmRlZnMsIGkzODZnbnUtbmF0LmMsCisJbXNnX3JlcGx5LmRlZnMsIG5vdGlmeS5kZWZzLCBwcm9jZXNzX3JlcGx5LmRlZnMsIHJlcGx5X21pZ19oYWNrLmF3aywKKwljb25maWcvbm0tZ251LmgsIGNvbmZpZy9pMzg2L3tpMzg2Z251Lm1oLCBpMzg2Z251Lm10LCBubS1nbnUuaCwKKwltLWkzODZnbnUuaCwgeG0taTM4NmdudS5ofTogTmV3IGZpbGVzIGZvciBHTlUgaHVyZC4KKworU3VuIEFwciAgNyAxMzozMjo0MSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChjYXNlIGhvc3QpOiBBZGQgaTM4NnNjbzUgaG9zdC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkKKwlGcm9tOiBSb2JlcnQgTGlwZSA8cm9iZXJ0bEBkZ2lpLmNvbT4KKwlBZGQgc3VwcG9ydCBmb3IgU0NPIE9wZW5TZXJ2ZXIgNSAoYS5rLmEuIDMuMnY1KikgIFRoaXMKKwl0YXJnZXQgaXMgYW4gU1ZSMy4yIHdpdGggQ09GRiwgRUxGLCBhbmQgc2hhcmVkIGxpYmVzLCBidXQKKwlubyAvcHJvYy4KKwkqIGNvbmZpZy9pMzg2L2kzODZzY281Lm1oOiAgTmV3IGZpbGUuCisJKiBjb25maWcvaTM4Ni9ubS1pMzg2c2NvNS5oOiAgTmV3IGZpbGUuCisKK1NhdCBBcHIgIDYgMDg6NTU6MjIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGJjYWNoZS5jIChiY2FjaGUpOiBXaGVuIHNpemUgb2YgY2h1bmsgdG8gY2FjaGUgaXMgZXhhY3RseSBlcXVhbCB0bworIAlCQ0FDSEVfTUFYTEVOR1RILCBzdGFzaCBjaHVuayBhcyB1bmlxdWUgY29weS4KKworU2F0IEFwciAgNiAwMDo0NjoyNiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogc3ltZmlsZS5jIChJTkxJTkVfQUREX1BTWU1CT0wpOiBSZW1vdmUgaWZkZWYuCisJKGFkZF9wc3ltYm9sX3RvX2xpc3QpOiBBZGQgYW4gYXJnIGZvciBwYXNzaW5nIENPUkVfQUREUiB2YWx1ZXMgYW5kCisJdXNlIGl0LCByYXRoZXIgdGhhbiBjYWxsaW5nIGFkZF9wc3ltYm9sX2FkZHJfdG9fbGlzdC4KKwkoYWRkX3BzeW1ib2xfYWRkcl90b19saXN0KTogRGVsZXRlLgorCShhZGRfcHN5bWJvbF90b19saXN0KTogTWFrZSBwc3ltYm9sIHN0YXRpYyB0byBhdm9pZCByYW5kb20gZGF0YSBpbgorCWdhcHMgZHVlIHRvIGFsaWdubWVudCBvZiBzdHJ1Y3R1cmUgbWVtYmVycy4KKwkqIHN5bWZpbGUuaCAoSU5MSU5FX0FERF9QU1lNQk9MLCBBRERfUFNZTUJPTF9UT19MSVNULAorIAlBRERfUFNZTUJPTF9BRERSX1RPX0xJU1QpOiBSZW1vdmUuICBSZWFsIHdvcmxkIHRlc3RzIHNob3cgbm8KKwlwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgYnkgaW5saW5pbmcgdmlhIGNvbXBsaWNhdGVkIG1hY3JvcyBhbmQKKwl0aGV5IGp1c3QgbWFrZSBnZGIgbGFyZ2VyIGFuZCBoYXJkZXIgdG8gbWFpbnRhaW4uCisJKiBkd2FyZnJlYWQuYyAoYWRkX2VudW1fcHN5bWJvbCk6IFJlcGxhY2UgQUREX1BTWU1CT0xfVE9fTElTVAorCWFuZC9vciBBRERfUFNZTUJPTF9BRERSX1RPX0xJU1QgbWFjcm8ocykgd2l0aCBjYWxsIHRvCisJYWRkX3BzeW1ib2xfdG9fbGlzdCB3aXRoIGFwcHJvcHJpYXRlIGxvbmcgb3IgQ09SRV9BRERSIGFyZ3MuCisJKGFkZF9wYXJ0aWFsX3N5bWJvbCk6IERpdHRvLgorCSogcGFydGlhbC1zdGFiLmg6IERpdHRvLgorCSogb3M5a3JlYWQuYyAocmVhZF9vczlrX3BzeW10YWIpOiBEaXR0bworCSogbWRlYnVncmVhZC5jIChwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiBEaXR0by4KKwkoaGFuZGxlX3BzeW1ib2xfZW51bWVyYXRvcnMpOiBEaXR0by4KKwkoZGVtYW5nbGUuaCk6IEluY2x1ZGUuCisJKiBocHJlYWQuYyAoaHByZWFkX2J1aWxkX3BzeW10YWJzKTogRGl0dG8uCisJKGhwcmVhZF9idWlsZF9wc3ltdGFicyk6IERpdHRvLgorCShkZW1hbmdsZS5oKTogSW5jbHVkZQorCitUaHUgQXByICA0IDIwOjE2OjU1IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBzZXRwZ2lkIGZ1bmN0aW9uLgorCSogY29uZmlnLmluOiBSZWdlbmVyYXRlIHdpdGggYXV0b2hlYWRlci4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mLgorCSogaW5mbG93LmMgKF9pbml0aWFsaXplX2luZmxvdyk6IE9ubHkgdHJ5IHRvIHVzZSBfU0NfSk9CX0NPTlRST0wKKwlpZiBpdCBpcyBhY3R1YWxseSBkZWZpbmVkLgorCShnZGJfc2V0cGdpZCk6IFVzZSBIQVZFX1NFVFBHSUQuCisJKiBjaC1leHAuYzogQ2hhbmdlIGluY2x1ZGUgb2YgPHN0cmluZy5oPiB0byAiZ2RiX3N0cmluZy5oIi4KKwkqIGMtZXhwLnksIGYtZXhwLnksIG0yLWV4cC55OiBEaXR0by4KKwkqIGMtZXhwLnksIHNlcmlhbC5jOiBJbmNsdWRlIDxjdHlwZS5oPi4KKwkqIGNvbmZpZy9tNjhrL25tLW5ld3MuaDogQWRkIHR5cGVkZWYgZm9yIHBpZF90IHdoaWNoIGlzCisJYXBwYXJlbnRseSBtaXNzaW5nIGZyb20gPHN5cy90eXBlcy5oPi4gIEVuY2xvc2UgZW50aXJlCisJZmlsZSBpbiBOTV9ORVdTX0ggaWZuZGVmIGFuZCBkZWZpbmUgd2hlbiBpbmNsdWRlZC4KKwkqIGNvbmZpZy9taXBzL25tLW5ld3MtbWlwcy5oOiBEaXR0by4KKwkqIGNvbmZpZy9tNjhrL3RtLW02OGsuaCAoUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMLAorCVJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXKTogQ2hhbmdlIG5hbWUgb2YgdGVtcG9yYXJ5IHZhcmlhYmxlLgorCitUaHUgQXByICA0IDE5OjA0OjE4IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogYXJtLXhkZXAuYzogTW92ZSBuYXRpdmUtc3BlY2lmaWMgY29kZSB0byBoZXJlIGZyb20gYXJtLXRkZXAuYy4KKwkqIGFybS10ZGVwLmMgKGFybV9hcGNzXzMyKTogTmV3IGdsb2JhbC4KKwkoYXJtX2FkZHJfYml0c19yZW1vdmUsIGFybV9zYXZlZF9wY19hZnRlcl9jYWxsLAorIAlhcm1fcHVzaF9kdW1teV9mcmFtZSwgYXJtX3BvcF9mcmFtZSk6IE5ldyBmdW5jdGlvbnMuCisJKGFybV9za2lwX3Byb2xvZ3VlKTogVXBkYXRlZCB2ZXJzaW9uIGZyb20gUmljaGFyZCBFYXJuc2hhdy4KKwkoX2luaXRpYWxpemVfYXJtX3RkZXApOiBBZGQgc2V0L3Nob3cgImFwY3MzMiIuCisJKiBjb25maWcvYXJtL3RtLWFybS5oIChBRERSX0JJVFNfUkVNT1ZFKTogQ2FsbAorCWFybV9hZGRyX2JpdHNfcmVtb3ZlLgorCShTQVZFRF9QQ19BRlRFUl9DQUxMKTogQ2FsbCBhcm1fc2F2ZWRfcGNfYWZ0ZXJfY2FsbC4KKwkoZnJhbWVfZmluZF9zYXZlZF9yZWdzKTogRGVjbGFyZSBwcm9wZXJseS4KKwkoUFVTSF9EVU1NWV9GUkFNRSk6IENhbGwgYXJtX3B1c2hfZHVtbXlfZnJhbWUuCisJKFBPUF9GUkFNRSk6IENhbGwgYXJtX3BvcF9mcmFtZSwgdXNlIEFERFJfQklUU19SRU1PVkUgaW5zdGVhZCBvZgorCWV4cGxpY2l0IG1hc2suCisJKiBjb25maWcvYXJtL25tLWFybS5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZy9hcm0veG0tYXJtLmggKEtFUk5FTF9VX0FERFIsIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUyk6CisJTW92ZSBkZWZpbml0aW9ucyB0byBubS1hcm0uaC4KKwkqIGNvbmZpZy9hcm0vYXJtLm1oIChOQVRfRklMRSk6IERlZmluZS4KKworCSogc3ltZmlsZS5jIChnZW5lcmljX2xvYWQpOiBJbml0aWFsaXplIGRhdGFfY291bnQgcHJvcGVybHkuCisKK1RodSBBcHIgIDQgMTc6MTc6NTMgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHN5bW1pc2MuYyAocHJpbnRfb2JqZmlsZV9zdGF0aXN0aWNzKTogUHJpbnQgbWVtb3J5IHVzZWQgYnkKKwlwc3ltYm9sIGNhY2hlIG9ic3RhY2suCisKK1RodSBBcHIgIDQgMTU6NDM6MDcgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBzeW1maWxlLmMgKHJlcG9ydF90cmFuc2Zlcl9wZXJmb3JtYW5jZSk6IE5ldyBmdW5jdGlvbi4KKwkoZ2VuZXJpY19sb2FkKTogQ2FsbCBpdCB0byByZXBvcnQgdHJhbnNmZXIgcmF0ZS4KKwkqIHJlbW90ZS1lNzAwMC5jIChlNzAwMF9sb2FkKTogRGl0dG8uCisKK01vbiBBcHIgIDEgMTY6MzE6MDAgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctbWFrZS5zZWQ6IENoYW5nZSByZWZlcmVuY2VzIHRvIGNvbmZpZy5oIHRvIGJlIGluIG9iamRpciwKKwllZGl0IG91dCBydWxlcyB0byByZWJ1aWxkIGNvbmZpZy5oLgorCitNb24gQXByICAxIDA4OjMyOjIzIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBocHBhLXRkZXAuYyAoaHBwYV9wb3BfZnJhbWUpOiBDYWxsIGNsZWFyX3Byb2NlZWRfc3RhdHVzIGJlZm9yZQorCXByb2NlZWRpbmcuCisKK1N1biBNYXIgMzEgMTY6MTU6NDMgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGhwcGFoLW5hdC5jIChzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMsIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycywKKwlmZXRjaF9yZWdpc3RlciwgY2hpbGRfeGZlcl9tZW1vcnkpOiBVc2UgY2FsbF9wdHJhY2UgZnVuY3Rpb24gc3VwcGxpZWQKKwlieSBpbmZwdHJhY2UuYyByYXRoZXIgdGhhbiBjYWxsaW5nIHB0cmFjZSBkaXJlY3RseS4KKworU3VuIE1hciAzMSAxNTozOTowMCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1vbjk2MC1yb20uYzogQ2xlYW51cHMgYW5kIGVsaW1pbmF0aW9uIG9mIHVudXNlZCBjb2RlLAorCWNsYXJpZnkgZG9jdW1lbnRhdGlvbiBzdHJpbmcuCisJKG1vbjk2MF9zZXJpYWwsIG1vbjk2MF90dHluYW1lKTogUmVtb3ZlLgorCSogY29uZmlnL2k5NjAvdG0tbW9uOTYwLmggKEFERElUSU9OQUxfT1BUSU9OUywKKwlBRERJVElPTkFMX09QVElPTl9DQVNFUywgQURESVRJT05BTF9PUFRJT05fSEVMUCk6IFJlbW92ZS4KKworU2F0IE1hciAzMCAxMTowMDoyMiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDaGVjayB3aGV0aGVyIHByaW50ZiBmYW1pbHkgc3VwcG9ydHMgcHJpbnRpbmcKKwlsb25nIGRvdWJsZXMgb3Igbm90IGFuZCBkZWZpbmUgUFJJTlRGX0hBU19MT05HX0RPVUJMRSBpZiBzby4KKwkqIGFjY29uZmlnLmg6IFByb3ZpZGUgZGVmYXVsdCB1bmRlZiBmb3IgUFJJTlRGX0hBU19MT05HX0RPVUJMRS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIHZhbHByaW50LmMgKHByaW50X2Zsb2F0aW5nKTogVXNlIFBSSU5URl9IQVNfTE9OR19ET1VCTEUuCisJKiBjLWV4cC55IChwYXJzZV9udW1iZXIpOiBVc2UgUFJJTlRGX0hBU19MT05HX0RPVUJMRS4KKwkqIGNvbmZpZ3VyZS5pbjogRml4IGhhdmVfZ3JlZ3NldCBhbmQgaGF2ZV9mcHJlZ3NldCBhdXRvY29uZgorCXZhcmlhYmxlIG5hbWVzIHNvIHRoYXQgdGhleSBtYXRjaCB0aGUgcGF0dGVybiByZXF1aXJlZCB0bworCWNhY2hlIHRoZW0uCisKK0ZyaSBNYXIgMjkgMjE6Mzk6NTYgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvcmUtYW91dC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6IENhc3QgY29yZV9yZWdfc2l6ZSB0byBpbnQKKwliZWZvcmUgdGVzdGluZyBhZ2FpbnN0IHJlZ19wdHIuCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cF9zdGFuZGFyZCk6IENhc3QgdHlwZSBvZgorCVRZUEVfRk5fRklFTERfVk9GRlNFVCB0byBpbnQuCisJKiBmaW5kdmFyLmMgKGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIsIGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciwKKwlleHRyYWN0X2xvbmdfdW5zaWduZWRfaW50ZWdlcik6IENhc3QgdHlwZSBvZiBzaXplb2YgdG8gaW50LgorCSogdmFsdWVzLmMgKHVucGFja19maWVsZF9hc19sb25nLCBtb2RpZnlfZmllbGQpOiBEaXR0by4KKwkqIHZhbG9wcy5jICh2YWx1ZV9hc3NpZ24sIGNhbGxfZnVuY3Rpb25fYnlfaGFuZCk6IERpdHRvLgorCSogaW5mY21kLmMgKGRvX3JlZ2lzdGVyc19pbmZvKTogRGl0dG8uCisJKiBzZXItdGNwLmMgKHRjcF9vcGVuKTogRGl0dG8uCisJKiByZW1vdGUuYyAocHV0cGt0KTogRGl0dG8uCisJKiBkY2FjaGUuYyAoZGNhY2hlX3BlZWspOiBEaXR0by4KKwkqIGRjYWNoZS5jIChkY2FjaGVfcG9rZSk6IERpdHRvLgorCSogbTItZXhwLnkgKHl5bGV4KTogRGl0dG8uCisJKiBnbnUtcmVnZXguYyAocmVfbWF0Y2hfMik6IERpdHRvLgorCSogZi1sYW5nLmMgKEFERF9CRl9TWU1OVU0sIHNhdmVkX2JmX2xpc3RfZW5kLCB0bXBfYmZfcHRyKTogSWZkZWYKKwlvdXQgdW51c2VkIG1hY3JvIGRlZmluaXRpb24gYW5kIHZhcmlhYmxlcy4KKwkqIGluZnRhcmcuYyAocHJvY193YWl0KTogTW92ZSBmcm9tIG1haW4uYyB0byBoZXJlLCBhbmQgbWFrZSBzdGF0aWMuCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnRfc3RyaW5nKTogQ2hhbmdlIGJ1ZnNpemUgZnJvbSBpbnQgdG8gdW5zaWduZWQuCisJKiBtYWluLmMgKHdhaXQuaCk6IEluY2x1ZGUuCisJKiB0b3AuYyAoY29tbWFuZF9saW5lX2lucHV0KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAiYyIuCisJKiBmLXR5cGVwcmludC5jIChmX3R5cGVfcHJpbnRfdmFyc3BlY19wcmVmaXgpOiBBZGQgbWlzc2luZyBlbnVtCisJdmFsdWUgVFlQRV9DT0RFX1RZUEVERUYgdG8gc3dpdGNoIHN0YXRlbWVudC4KKwkoZl90eXBlX3ByaW50X3ZhcnNwZWNfc3VmZml4KTogQWRkIG1pc3NpbmcgZW51bSB2YWx1ZQorCVRZUEVfQ09ERV9UWVBFREVGIHRvIHN3aXRjaCBzdGF0ZW1lbnQuCisJKiBjaC1leHAuYyAocGFyc2VfcHJpbXZhbCk6IEFkZCByZW1haW5pbmcgZW51bWVyYXRpb24gdmFsdWVzIHRvCisJc3dpdGNoIHN0YXRlbWVudCwgd2l0aCBubyBzcGVjaWZpYyBhY3Rpb24uCisJKGNoX2xleCk6IEFkZCBMT0NfVU5SRVNPTFZFRCBpbiBzd2l0Y2ggc3RhdGVtZW50LgorCShwdXNoYmFja190b2tlbik6IElmZGVmIG91dCwgc2luY2UgY29kZSB1c2luZyBpdCBpcyBpZmRlZidkIG91dC4KKwkqIHN0YWJzcmVhZC5jIChjbGVhbnVwX3VuZGVmaW5lZF90eXBlcyk6IFJlbW92ZSB1bnVzZWQgbGFiZWwKKwkiYmFkdHlwZSIuCisJKiBvYmpmaWxlcy5oIChwcmludF9zeW1ib2xfYmNhY2hlX3N0YXRpc3RpY3MpOiBBZGQgcHJvdG90eXBlLgorCSogbWFpbnQuYyAob2JqZmlsZXMuaCk6IEluY2x1ZGUuCisJKG1haW50ZW5hbmNlX3ByaW50X3N0YXRpc3RpY3MpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlICJ0ZW1wIi4KKwkqIG1pbnN5bXMuYyAobG9va3VwX21pbmltYWxfc3ltYm9sX3NvbGliX3RyYW1wb2xpbmUpOiBSZW1vdmUKKwl1bnVzZWQgdmFyaWFibGUgImZvdW5kX2ZpbGVfc3ltYm9sIi4KKwkqIG0yLWV4cC55ICh5eWxleCk6IEFkZCBMT0NfVU5SRVNPTFZFRCBjYXNlIHRvIHN3aXRjaC4KKwkqIGxhbmd1YWdlLmMgKGxhbmdfYm9vbF90eXBlKTogVXNlIGV4aXN0aW5nIGZ1bmN0aW9uIGxvY2FsIHR5cGUKKwl2YXJpYWJsZSByYXRoZXIgdGhhbiBjcmVhdGUgYmxvY2sgbG9jYWwgdmFyaWFibGVzLgorCSogc29saWIuYyAoZGlzYWJsZV9icmVhayk6IEVuY2xvc2UgaW4gaWZuZGVmIFNWUjRfU0hBUkVEX0xJQlMuCisJKiBpbmZwdHJhY2UuYyAod2FpdC5oLCBjb21tYW5kLmgpOiBJbmNsdWRlLgorCSogc2VyLXRjcC5jIChnZGJfc3RyaW5nLmgpOiBJbmNsdWRlCisJKiBpMzg2LXRkZXAuYyAoY29kZXN0cmVhbV9zZWVrKTogQ2hhbmdlICJwbGFjZSIgdG8gQ09SRV9BRERSLgorCShpMzg2X2dldF9mcmFtZV9zZXR1cCk6IENoYW5nZSAicGMiIGZyb20gaW50IHRvIENPUkVfQUREUi4KKwkqIGNvbW1hbmQuYyAoY29tcGxldGVfb25fZW51bSk6IE1ha2UgYXNzaWdubWVudCB1c2VkIGFzIHRydXRoIHZhbHVlCisJZXhwbGljdGx5IGNoZWNrIGFnYWluc3QgTlVMTC4KKwkod2FpdC5oKTogSW5jbHVkZS4KKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IElmZGVmIG91dCBwcm9sb2d1ZV9wYyBzaW5jZSBjb2RlCisJdGhhdCB1c2VzIGl0IGlzIGlmZGVmJ2Qgb3V0LgorCSogcGFyc2VyLWRlZnMuaDogQWRkIHByb3RvdHlwZSBmb3Igd3JpdGVfZG9sbGFyX3ZhcmlhYmxlLgorCSogaW5mcnVuLmM6IEFkZCBwcm90b3R5cGUgZm9yIHdyaXRlX3BjX3BpZC4KKwkqIGJyZWFrcG9pbnQuaDogQWRkIHByb3RvdHlwZSBmb3IgcmVfZW5hYmxlX2JyZWFrcG9pbnRzX2luX3NobGlicy4KKwkqIHN5bW1pc2MuYyAoYmNhY2hlLmgpOiBJbmNsdWRlLgorCSogYmNhY2hlLmg6IEFkZCBwcm90b3R5cGUgZm9yIHByaW50X2JjYWNoZV9zdGF0aXN0aWNzLgorCSogc3ltZmlsZS5jOiBJbmNsdWRlIDx0aW1lLmg+LgorCSogcHJpbnRjbWQuYyAocHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCk6IENoYW5nZSBsZW4gdG8gdW5zaWduZWQgaW50LgorCSogdmFsYXJpdGguYyAodmFsdWVfZXF1YWwpOiBDYXN0IHJlc3VsdCBvZiBUWVBFX0xFTkdUSCB0byBpbnQuCisJKiB2YWxhcml0aC5jICh2YWx1ZV9iaW5vcCk6IENoYW5nZSByZXN1bHRfbGVuLCBwcm9tb3RlZF9sZW4xLAorIAlhbmQgcHJvbW90ZWRfbGVuMiB0byB1bnNpZ25lZCBpbnQuCisJKiB2YWxhcml0aC5jICh2YWx1ZV9zdWJzY3JpcHRlZF9ydmFsdWUpOiBDaGFuZ2UgZWx0X29mZnMgYW5kCisgCWVsdF9zaXplIHRvIHVuc2lnbmVkIGludC4KKwkqIHZhbG9wcy5jICh2YWx1ZV9hcnJheSk6IENoYW5nZSB0eXBlbGVuZ3RoIHRvIHVuc2lnbmVkIGludC4KKwkoZGVzdHJ1Y3Rvcl9uYW1lX3ApOiBDaGFuZ2UgbGVuIHRvIHVuc2lnbmVkIGludC4KKwkqIHNjbS1sYW5nLmggKHNjbV9wYXJzZSk6IEFkZCBwcm90b3R5cGUgZm9yIHNjbV91bnBhY2suCisJKiBzeW1maWxlLmMgKGRlY3JlbWVudF9yZWFkaW5nX3N5bXRhYik6IENoYW5nZSByZXR1cm4gdHlwZSB0byB2b2lkLgorCSogdmFsYXJpdGguYyAodmFsdWVfc3Vic2NyaXB0KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAid29yZCIuCisJKHZhbHVlX3N1YnNjcmlwdCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgInRpbnQiLgorCSogdmFsb3BzLmMgKGF1dG9fYWJhbmRvbik6IElmZGVmIG91dCwgc2luY2UgY29kZSB1c2luZyBpdCBpcyBhbHNvCisJaWZkZWYnZCBvdXQuCisJKiBldmFsLmMgKGluaXRfYXJyYXlfZWxlbWVudCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgInZhbCIuCisJKiBNYWtlZmlsZS5pbiAodmFsdWVzLm8pOiBEZXBlbmRzIG9uIHNjbS1sYW5nLmguCisJKGNvbW1hbmQubyk6IERlcGVuZHMgdXBvbiB3YWl0X2guCisJKHNlci10Y3Aubyk6IERlcGVuZHMgdXBvbiBnZGJfc3RyaW5nLmguCisJKGluZnB0cmFjZS5vKTogRGVwZW5kcyB1cG9uIHdhaXRfaCBhbmQgY29tbWFuZF9oLgorCShtYWludC5vKTogRGVwZW5kcyBvbiBvYmpmaWxlcy5oIGFuZCBzeW1maWxlLmguCisJKiB2YWx1ZXMuYyAoYWxsb2NhdGVfcmVwZWF0X3ZhbHVlKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZQorCSJlbGVtZW50X3R5cGUiLgorCShzY20tbGFuZy5oKTogSW5jbHVkZS4KKwkqIGJyZWFrcG9pbnQuYyAoY3JlYXRlX2xvbmdqbXBfYnJlYWtwb2ludCk6IEVuY2xvc2UgaW4KKwlHRVRfTE9OR0pNUF9UQVJHRVQgZGVmaW5lLCB1bnVzZWQgb3RoZXJ3aXNlLgorCSogY29uZmlnL2kzODYvbm0tbGludXguaDogQWRkIHByb3RvdHlwZXMgZm9yIGkzODZfaW5zZXJ0X3dhdGNocG9pbnQsCisJaTM4Nl9yZW1vdmVfd2F0Y2hwb2ludCBhbmQgaTM4Nl9zdG9wcGVkX2J5X3dhdGNocG9pbnQuCisJCitUaHUgTWFyIDI4IDEyOjUzOjE5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoc3BhcmM2NC0qLXNvbGFyaXMyKik6IERlbGV0ZS4KKwlTdGljayB3aXRoIHNwYXJjLSotc29sYXJpczIqLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworVGh1IE1hciAyOCAwNjo1MToyNiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogdmFsb3BzLmMgKHZhbHVlX2Fzc2lnbik6IE1ha2UgY29weSBvZiBpbnRlcm5hbCB2YXJpYWJsZSB2YWx1ZQorCWJlZm9yZSByZXR1cm5pbmcgaXQgYXMgYSBuZXcgdmFsdWUsIHNpbmNlIGl0IGlzIG93bmVkIGJ5IHRoZSAKKwlpbnRlcm5hbCB2YXJpYWJsZSBhbmQgd2lsbCBiZSBmcmVlZCBhbG9uZyB3aXRoIGl0LgorCitXZWQgTWFyIDI3IDA4OjM2OjE3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogRnJvbSBQZXRlciBTY2hhdWVyLgorCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50X3JlX3NldF9vbmUpOiAgS2VlcCB0ZW1wb3JhcnkKKwlicmVha3BvaW50cyBicF91bnRpbCwgYnBfZmluaXNoLCBicF93YXRjaHBvaW50X2NvcGUsIGJwX2NhbGxfZHVtbXkKKwlhbmQgYnBfc3RlcF9yZXN1bWUgaW4gY2FzZSBicmVha3BvaW50X3JlX3NldF9vbmUgaXMgY2FsbGVkIGR1ZQorCXRvIGEgc3RlcCBvdmVyIGEgZGxvcGVuIGNhbGwuCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiAgQWx3YXlzIHJlbW92ZSBicmVha3BvaW50cyBmcm9tCisJaW5mZXJpb3IgaW4gQlBTVEFUX1dIQVRfQ0hFQ0tfU0hMSUJTIGNhc2UuCisKK1R1ZSBNYXIgMjYgMTM6MTU6MzIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaCAoQ09FUkNFX0ZMT0FUX1RPX0RPVUJMRSk6IE9ubHkgcHJlZmVyCisJbm9uLXByb3RvdHlwZWQgY2FzZSBvdmVyIHByb3RvdHlwZWQgY2FzZSBmb3IgQy4KKwkqIGNvbmZpZy9wYS90bS1ocHBhLmggKENPRVJDRV9GTE9BVF9UT19ET1VCTEUpOiAgRGl0dG8uCisKK1NhdCBNYXIgMjMgMTc6MjQ6MjggMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIG9zOWtyZWFkLmMgKG9zOWtfcHJvY2Vzc19vbmVfc3ltYm9sKTogTm90ZSBub25wb3J0YWJsZQorCWFzc3VtcHRpb24gdGhhdCBhbiBpbnQgY2FuIGhvbGQgYSBjaGFyICouCisKKwkqIGJjYWNoZS5oIChzdHJ1Y3QgaGFzaGxpbmspOiBXcmFwIGRhdGFbXSBpbnNpZGUgdW5pb24gd2l0aAorCWRvdWJsZSB0byBmb3JjZSBsb25nZXN0IGFsaWdubWVudC4KKwkoQkNBQ0hFX0RBVEEpOiBOZXcgbWFjcm8gdG8gYWNjZXNzIGRhdGFbXS4KKwkoQkNBQ0hFX0FMSUdOTUVOVCk6IE5ldyBtYWNybyB0byBnZXQgb2Zmc2V0IHRvIGRhdGFbXS4KKwkqIGJjYWNoZS5jIChsb29rdXBfY2FjaGUsIGJjYWNoZSk6IFVzZSBCQ0FDSEVfREFUQSB0byBnZXQKKyAJYWRkcmVzcyBvZiBjYWNoZWQgZGF0YS4gIFVzZSBCQ0FDSEVfQUxJR05NRU5UIHRvIGNvbXB1dGUKKwlhbW91bnQgb2Ygc3BhY2UgdG8gYWxsb2NhdGUgZm9yIGVhY2ggaGFzaGxpbmsgc3RydWN0LgorCitTYXQgTWFyIDIzIDEyOjE0OjAyIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjaC1sYW5nLmMgKGV2YWx1YXRlX3N1YmV4cF9jaGlsbCk6IEZpeCB0eXBvLgorCitUaHUgTWFyIDIxIDA4OjI3OjE5IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IEJ1bXAgdmVyc2lvbiB0byA0LjE1LjMKKworVGh1IE1hciAyMSAxMDo1Njo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5pbjogUmVuYW1lIGZyb20gY29uZmlnLmguaW4uCisJKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUiB3aXRoIGNvbmZpZy5oOmNvbmZpZy5pbi4KKwlDaGFuZ2UgQ09ORklHX0hFQURFUlMgdGVzdCBpbiBBQ19PVVRQVVQgYWNjb3JkaW5nbHkuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBNYWtlZmlsZS5pbiAoc3RhbXAtaCk6IERlcGVuZCB1cG9uIGNvbmZpZy5pbiwgbm90IGNvbmZpZy5oLmluLgorCVNldCBDT05GSUdfSEVBREVSUyB0byBjb25maWcuaDpjb25maWcuaW4uCisKK1R1ZSBNYXIgMTkgMTI6NDc6NTEgMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBwYXJ0aWFsLXN0YWIuaCAoY2FzZSBOX0VORE0pOiAgRmluaXNoIGN1cnJlbnQgcGFydGlhbCBzeW1ib2wKKwl0YWJsZSBmb3IgU29sYXJpcyAyIGNjLgorCitUdWUgTWFyIDE5IDEwOjM5OjE1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogcnM2MDAwLW5hdC5jIChleGVjX29uZV9kdW1teV9pbnNuKTogRG9uJ3QgY2xvYmJlciB0aGUKKwlQQyBpbiB0aGUgcmVnaXN0ZXJzIGFycmF5LiAgRnJvbSBQZXRlciBTY2hhdWVyLgorCitNb24gTWFyIDE4IDEzOjQ3OjA5IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBzeW1maWxlLmMgKHJlcmVhZF9zeW1ib2xzKTogUmVpbml0aWFsaXplIGJjYWNoZSBzdHJ1Y3QKKwltZW1iZXJzIHRvIHplcm8gdXNpbmcgbWVtc2V0LiAgQWxzbyB1c2UgbWVtc2V0IHRvIHJlaW5pdAorCWdsb2JhbF9wc3ltYm9scyBhbmQgc3RhdGljX3BzeW1ib2xzLCByYXRoZXIgdGhhbiBleHBsaWNpdGx5CisJcmVzZXR0aW5nIGVhY2ggc3RydWN0dXJlIG1lbWJlci4KKworU2F0IE1hciAxNiAxOTo0NzozNiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBBZGQgZnJhZ21lbnQgdG8gY3JlYXRlIHN0YW1wLWguCisJCisJRnJvbSBQZXRlciBTY2hhdWVyIDxQZXRlci5TY2hhdWVyQFJlZ2VudC5FLVRlY2huaWsuVFUtTXVlbmNoZW4uREU+CisJKiBjb25maWd1cmUuaW4gKEFDX0NIRUNLX0hFQURFUlMpOiAgQ2hlY2sgZm9yIGxpbmsuaC4KKwkqIGNvbmZpZ3VyZTogIFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZi4KKwkqIGNvbmZpZy5oLmluOiAgUmVnZW5lcmF0ZSB3aXRoIGF1dG9oZWFkZXIuCisJKiBjb25maWcvaTM4Ni9ubS1saW51eC5oOiAgSW5jbHVkZSBzb2xpYi5oIG9ubHkgaWYgSEFWRV9MSU5LX0gKKwlpcyBkZWZpbmVkLgorCSogc29saWIuYzogIEV4Y2x1ZGUgbW9zdCBvZiB0aGUgY29kZSBpZiBIQVZFX0xJTktfSCBpcyBub3QgZGVmaW5lZC4KKwkqIGNvbmZpZy9pMzg2L2xpbnV4Lm1oOiAgUmVpbnN0YXRlIFhNX0NMSUJTLCBpdCBpcyBuZWVkZWQgZm9yCisJb2xkZXIgYS5vdXQgYmFzZWQgc3lzdGVtcy4KKworU2F0IE1hciAxNiAxNjo0NTo0MyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnLmguaW46IE5ldyBmaWxlLgorCSogYWNjb25maWcuaDogTmV3IGZpbGUsIGZvciBhdXRvaGVhZGVyLgorCSogY29uZmlndXJlLmluIChBQ19DT05GSUdfSEVBREVSKTogQWRkLCBnZW5lcmF0ZSBjb25maWcuaC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIE1ha2VmaWxlLmluIChkZWZzX2gpOiBBZGQgY29uZmlnLmgKKwkoZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5oIGFuZCBzdGFtcC1oIGR1cmluZyBkaXN0Y2xlYW4uCisJKGNvbmZpZy5oLCBzdGFtcC1oKTogTmV3IHRhcmdldHMgdG8gcmVtYWtlIGNvbmZpZy5oIHdoZW4gbmVjZXNzYXJ5LgorCSogZGVmcy5oIChjb25maWcuaCk6IEluY2x1ZGUgYmVmb3JlIGFueSBvdGhlciBpbmNsdWRlcyBvciBkZWZpbmVzLgorCSogaTM4Ni10ZGVwLmMgKGdkYl9zdHJpbmcuaCk6IE1vdmUgaW5jbHVkZSBhZnRlciBpbmNsdWRlIG9mIGRlZnMuaC4KKwkqIGkzODZ2NC1uYXQuYyAoZGVmcy5oKTogSW5jbHVkZSBiZWZvcmUgdGVzdGluZyBIQVZFX1NZU19QUk9DRlNfSC4KKworU2F0IE1hciAxNiAxNDo1NToyNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCUZyb20gUGV0ZXIgU2NoYXVlciA8UGV0ZXIuU2NoYXVlckBSZWdlbnQuRS1UZWNobmlrLlRVLU11ZW5jaGVuLkRFPgorCSogTWFrZWZpbGUuaW4gKElOU1RBTExFRF9MSUJTKTogIE1ha2Ugc3VyZSB0aGF0IEBMSUJTQCB3aWxsIG5vdAorCXJlc3VsdCBpbiBhbiBlbXB0eSBsaW5lLCB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBuYXRpdmUgVWx0cml4IDQuNAorCWFuZCBPU0YvMS0zLjJDIG1ha2UuCisKK1NhdCBNYXIgMTYgMTM6MzM6MTcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGdkYnNlcnZlciB0byBjb25maWdkaXJzIHVuZGVyIGxpbnV4LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCQorRnJpIE1hciAxNSAxMjowNjo1OCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9pMzg2L25tLW5ic2QuaCAoRkxPQVRfSU5GTyk6IENvbW1lbnQgb3V0LgorCSogY29uZmlnL2kzODYvdG0tbmJzZC5oIChOVU1fUkVHUyk6IERlZmluZS4KKworVGh1IE1hciAxNCAxMDozMToxOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNvbGliLmMgKHNvbGliX2JyZWFrX25hbWVzKTogQWRkIF9yX2RlYnVnX3N0YXRlIGZvcgorCXZhbmlsbGEgU1ZSNCBpbXBsZW1lbnRhdGlvbnMuICBGcm9tIFBldGVyIFNjaGF1ZXIuCisKK01vbiBNYXIgMTEgMTQ6MjQ6NTcgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgorCisJKiBtb245NjAtcm9tLmM6IE5ldyBmaWxlOyBzdXBwb3J0IG1vbjk2MCByb20gbW9uaXRvciBvbiBpOTYwLgorCSogbW9uaXRvci5jIChtb25pdG9yX2RlYnVnKTogQ2hhbmdlIHJlbW90ZWRlYnVnIHRvIGJ1ZmZlciBzdHJpbmdzLgorCSogbW9uaXRvci5jIChtb25pdG9yX29wZW4pOiBBZGQgdGVzdCBmb3IgZmxhZyBNT19OT19FQ0hPX09OX09QRU4gYmVmb3JlCisJZXBlY3RpbmcgcHJvbXB0IGFuZCBlY2hvIGR1cmluZyBvcGVuLgorCSogbW9uaXRvci5jIChtb25pdG9yX3N0b3ApOiBBZGQgdGVzdCBmb3IgZmxhZyBNT19TRU5EX0JSRUFLX09OX09QRU4gdG8gCisJZGV0ZXJtaW5lIGlmIGJyZWFrIHNob3VsZCBiZSBzZW50IGFzIHN0b3AgY29tbWFuZC4KKwkqIG1vbml0b3IuaDogQWRkIGZsYWdzIE1PX05PX0VDSE9fT05fT1BFTiBhbmQgTU9fU0VORF9CUkVBS19PTl9PUEVOLgorCSogaTk2MC10ZGVwLmMgKG1vbjk2MF9mcmFtZV9jaGFpbl92YWxpZCk6IE5ldyBmdW5jdGlvbiBmb3IgZ2V0dGluZyAKKwlzdGFjayBmcmFtZSBvbiBtb245NjAuCisJKiBNYWtlZmlsZS5pbjogQWRkIG1vbjk2MCBmaWxlcy4KKwkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlZCBpOTYwLSotY29mZiogYW5kIGk5NjAtKi1lbGYqIHRvIHRhcmdldCBtb245NjA7CisgCWFkZGVkIGk5NjAtbmluZHktY29mZiogYW5kIGk5NjAtbmluZHktZWxmKiBmb3IgdGFyZ2V0IG5pbmR5LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKwkqIGNvbmZpZy9pOTYwL21vbjk2MC5tdCwgY29uZmlnL2k5NjAvdG0tbW9uOTYwLmg6IE5ldyBmaWxlczsgCisJc3VwcG9ydCBtb245NjAgcm9tIG1vbml0b3Igb24gaTk2MC4KKworTW9uIE1hciAxMSAxMTowMjo0NyAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJV2l0aCBNaWNoYWVsIFNueWRlcjoKKwkqIGkzODYtdGRlcC5jIChza2lwX3RyYW1wb2xpbmVfY29kZSk6IEZpeCBzdHJuY21wIGxlbmd0aC4KKwkqIHdpbjMyLW5hdC5jIChDSEVDSywgREVCVUcqLCBkZWJ1Z18qKTogTmV3LgorCShoYW5kbGVfbG9hZF9kbGwpOiBEb24ndCByZWxvYWQgc3ltYm9scy4KKwkoaGFuZGxlX2V4Y2VwdGlvbik6ICBVc2UgdGhlIERFQlVHXyogbmFtZXMuCisJKGNoaWxkX3dhaXQpOiBBZGQgREVCVUdfKiBjb2RlLgorCShfaW5pdGlhbGl6ZV9pbmZ0YXJnKTogQWRkIG5ldyBjb21tYW5kcyB0byBzZXQgZGVidWdfIG5hbWVzLgorCitNb24gTWFyIDExIDA5OjE5OjU4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogRnJvbSBQZXRlciBTY2hhdWVyOgorCSogYnJlYWtwb2ludC5jIChpbnNlcnRfYnJlYWtwb2ludHMpOiBVc2UgQUxMX0JSRUFLUE9JTlRTX1NBRkUuCisJKGJwc3RhdF9zdG9wX3N0YXR1cyk6IExpa2V3aXNlLgorCShyZW1vdmVfc29saWJfZXZlbnRfYnJlYWtwb2ludHMpOiBMaWtld2lzZS4KKwkoY2xlYXJfbW9tZW50YXJ5X2JyZWFrcG9pbnRzKTogTGlrZXdpc2UuCisJKHJlX2VuYWJsZV9icmVha3BvaW50c19pbl9zaGxpYnMpOiBEb24ndCByZWVuYWJsZSBhIGJyZWFrcG9pbnQKKwlpZiB3ZSBzdGlsbCBjYW4ndCByZWFkIHRoZSBtZW1vcnkgZm9yIHRoYXQgYnJlYWtwb2ludC4KKwkobWVudGlvbik6IEFkZCBicF9zaGxpYl9ldmVudCBjYXNlIHRvIGtlZXAgZ2NjIHF1aWV0LgorCQorRnJpIE1hciAgOCAxMjowODoxMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGJyZWFrcG9pbnQuaCAoZW51bSBlbmFibGUpOiBOZXcgZW51bSBzaGxpYl9kaXNhYmxlZCBmb3IKKwlzaGFyZWQgbGlicmFyeSBicmVha3BvaW50cyB0aGF0IGhhdmUgYmVlbiB0ZW1wb3JhcmlseSBkaXNhYmxlZC4KKwkqIGJyZWFrcG9pbnQuYzogSGFuZGxlIHRlbXBvcmFyaWx5IGRpc2FibGVkIHNoYXJlZCBsaWJyYXJ5CisJYnJlYWtwb2ludHMgbGlrZSBkaXNhYmxlZCBicmVha3BvaW50cyBpbiBtb3N0IHBsYWNlcy4KKwkoaW5zZXJ0X2JyZWFrcG9pbnRzKTogVXNlIHNobGliX2Rpc2FibGVkIHRvIGluZGljYXRlCisJdGhhdCBhbiB1bnNldHRhYmxlIGJyZWFrcG9pbnQgaXMgb25seSB0ZW1wb3JhcmlseSBkaXNhYmxlZC4KKwkocmVfZW5hYmxlX2JyZWFrcG9pbnRzX2luX3NobGlicyk6IE5ldyBmdW5jdGlvbi4KKwkqIGNvcmVsb3cuYyAoc29saWJfYWRkX3N0dWIpOiBBZnRlciBhZGRpbmcgc2hhcmVkIGxpYnJhcmllcywKKwl0cnkgdG8gcmVlbmFibGUgYW55IHRlbXBvcmFyaWx5IGRpc2FibGVkIGJyZWFrcG9pbnRzLgorCSogaW5mY21kLmMgKGF0dGFjaF9jb21tYW5kKTogTGlrZXdpc2UuCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBMaWtld2lzZS4KKworRnJpIE1hciAgOCAxMTo0MToyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGRlZnMuaCAoZXh0cmFjdF9sb25nX3Vuc2lnbmVkX2ludGVnZXIpOiBEZWNsYXJlLgorCSogZmluZHZhci5jIChleHRyYWN0X2xvbmdfdW5zaWduZWRfaW50ZWdlcik6IE5ldyBmdW5jdGlvbi4KKwkqIHByaW50Y21kLmMgKHByaW50X3NjYWxhcl9mb3JtYXR0ZWQpOiBVc2UgaXQuCisJKiB2YWxwcmludC5jICh2YWxfcHJpbnRfdHlwZV9jb2RlX2ludCk6IExpa2V3aXNlLgorCitUaHUgTWFyICA3IDE3OjQwOjUwIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogaW5mY21kLmMgKGRvX3JlZ2lzdGVyc19pbmZvKTogSWdub3JlIGFub255bW91cyByZWdpc3RlcnMuCisJKiBzaC10ZGVwLmMgKHNldCBwcm9jZXNzb3IpOiBOZXcgY29tbWFuZCB0byBzZXQgc3BlY2lmaWMKKwlwcm9jZXNzb3IgdHlwZS4KKwkoc2hfcmVnX25hbWVzLCBzaDNfcmVnX25hbWVzKTogQXJyYXlzIG9mIHJlZ2lzdGVyIG5hbWVzIGZvcgorCVNIIGFuZCBTSDMgcHJvY2Vzc29ycy4KKwkoc2hfc2V0X3Byb2Nlc3Nvcl90eXBlKTogTmV3IGZ1bmN0aW9uLgorCSogc2gzLXJvbS5jIChzaDNfb3Blbik6IENhbGwgaXQuCisJKHNoM19yZWduYW1lKTogQWRkIG5hbWVzIG9mIGFsbCB0aGUgYmFuayByZWdpc3RlcnMuCisJKHNoM19zdXBwbHlfcmVnaXN0ZXIpOiBDbGVhbiB1cCBmb3JtYXR0aW5nLgorCSogY29uZmlnL3NoL3RtLXNoLmggKE5VTV9SRUdTLCBOVU1fUkVBTFJFR1MpOiBJbmNyZWFzZSB0byBpbmNsdWRlCisgCWJhbmsgcmVnaXN0ZXJzLgorCShSRUdJU1RFUl9OQU1FUyk6IEFkZCBuYW1lcyBvZiBiYW5rIHJlZ2lzdGVycy4KKwkoRlAxNV9SRUdOVU0pOiBEZWZpbmUuCisJKFJFR0lTVEVSX1ZJUlRVQUxfVFlQRSk6IFVzZSBpdC4KKwkqIG1vbml0b3IuYzogQ2xlYW4gdXAgc29tZSBjb21tZW50cy4KKworVGh1IE1hciAgNyAxMjowOTo1MSAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIGkzODZiLW5hdC5jOiBSZXZlcnQgcGFydCBvZiBNYXIgNSBjaGFuZ2UuICBGcmVlQlNEIGNvbGxhcHNlZCB0aGUKKyAJcyogYW5kIHQqIHN5bWJvbHMgdG9vLgorCitUaHUgTWFyICA3IDE1OjE4OjUxIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KKworCSogc3ltZmlsZS5jIChnZW5lcmljX2xvYWQpOiBBdm9pZCBkaXZpc2lvbiBieSB6ZXJvLgorCitXZWQgTWFyICA2IDE3OjU3OjU5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jIChiZmRfbG9va3VwX3N5bWJvbCk6IFByb3ZpZGUgZm9yIGFsbCBTVlI0IHN5c3RlbXMsCisJbm90IGp1c3QgdGhvc2Ugd2l0aCBIQU5ETEVfU1ZSNF9FWEVDX0VNVUxBVE9SUy4KKworCUZyb20gUGV0ZXIgU2NoYXVlcjoKKwkqIGJyZWFrcG9pbnQuYyAoaW50ZXJuYWxfYnJlYWtwb2ludF9udW1iZXIpOiBNb3ZlIHRvIGZpbGUgc2NvcGUuCisJKGNyZWF0ZV9zb2xpYl9ldmVudF9icmVha3BvaW50KTogVXNlIGFuIGludGVybmFsIGJyZWFrcG9pbnQgbnVtYmVyLgorCitXZWQgTWFyICA2IDAwOjMyOjQ0IDE5OTYgIFdpbGZyaWVkIE1vc2VyICA8bW9zZXJAcnRsLmN5Z251cy5jb20+CisKKwkqIHZhbGFyaXRoLmMgKHZhbHVlX2luKTogQ2hhbmdlIGJ1aWx0aW5fdHlwZV9jaGlsbF9ib29sIHRvCisJTEFfQk9PTF9UWVBFLgorCitUdWUgTWFyICA1IDIzOjQ4OjM2IDE5OTYgIFdpbGZyaWVkIE1vc2VyICA8bW9zZXJAcnRsLmN5Z251cy5jb20+CisKKwkqIGNoLWV4cC5jIChwYXJzZV9wcmltdmFsKTogSGFuZGxlIENBUkQsIE1BWCwgTUlOLgorCShtYXRjaF9zdHJpbmdfbGl0ZXJhbCk6IEhhbmRsZSBjb250cm9sIHNlcXVlbmNlLgorCShtYXRjaF9jaGFyYWN0ZXJfbGl0ZXJhbCk6IERldG8uCisKKwkqIGNoLWxhbmcuYyAoY2hpbGxfcHJpbnRjaGFyKTogQ2hhbmdlIGZvcm1hdGluZyBvZiBub25wcmludGFibGUKKwljaGFyYWN0ZXJzIGZyb20gQyd4eCcgdG8gXihudW0pLgorCShjaGlsbF9wcmludHN0cik6IERldG8uCisJKHZhbHVlX2NoaWxsX2NhcmQsIHZhbHVlX2NoaWxsX21heF9taW4pOiBOZXcgZnVuY3Rpb25zIHRvIHByb2Nlc3MKKwlDaGlsbCdzIENBUkQsIE1BWCwgTUlOLgorCShldmFsdWF0ZV9zdWJleHBfY2hpbGwpOiBQcm9jZXNzIFVOT1BfQ0FSRCwgVU5PUF9DSE1BWCwgVU5PUF9DSE1JTi4KKworCSogZXhwcmVzc2lvbi5oIChleHBfb3Bjb2RlKTogQWRkIFVOT1BfQ0FSRCwgVU5PUF9DSE1BWCwgVU5PUF9DSE1JTgorCWZvciBDaGlsbCdzIENBUkQsIE1BWCwgTUlOLgorCisJKiB2YWxhcml0aC5jICh2YWx1ZV9pbik6IEFkZCBwcm9jZXNzaW5nIG9mIFRZUEVfQ09ERV9SQU5HRQorCWFuZCBjaGFuZ2UgcmV0dXJuIHR5cGUgZnJvbSBidWlsdGluX3R5cGVfaW50IHRvCisJYnVpbHRpbl90eXBlX2NoaWxsX2Jvb2wuCisKK1R1ZSBNYXIgIDUgMTg6NTQ6MDQgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWcvbm0tbmJzZC5oIChsaW5rX29iamVjdCwgbG9fbmFtZSwgZXRjKTogTW92ZSB0byBoZXJlCisgCWZyb20gY29uZmlnL25tLW5ic2QuaC4KKwkqIGNvbmZpZy9zcGFyYy9ubS1uYnNkLmggKHJlZ3MsIGZwX3N0YXR1cywgZXRjKTogTW92ZSB0byBoZXJlCisJZnJvbSBjb25maWcvc3BhcmMvdG0tbmJzZC5oLgorCisJKiBjb25maWcvbTY4ay9ubS1ocDMwMGhwdXguaCAoRklWRV9BUkdfUFRSQUNFKTogRGVmaW5lIGhlcmUKKwlpbnN0ZWFkIG9mIGluIGNvbmZpZy9tNjhrL3htLWhwMzAwaHB1eC5oLgorCitUdWUgTWFyICA1IDEyOjA1OjM1IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogaTM4NmItbmF0LmMsIG02OGtuYnNkLW5hdC5jIChmZXRjaF9jb3JlX3JlZ2lzdGVycyk6IFByb3ZpZGUKKyAJaW1wbGVtZW50YXRpb24gZm9yIE5ldEJTRCBzeXN0ZW1zLgorCitNb24gTWFyICA0IDIzOjQ0OjE2IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiB2YWxhcml0aC5jIChiaW5vcF91c2VyX2RlZmluZWRfcCk6ICBSZXR1cm4gMCBmb3IgQklOT1BfQ09OQ0FULgorCSh2YWx1ZV9jb25jYXQpOiAgSGFuZGxlIHZhcnlpbmcgc3RyaW5ncyAoYWRkIENPRVJDRV9WQVJZSU5HX0FSUkFZKS4KKworCSogY2gtbGFuZy5jIChldmFsdWF0ZV9zdWJleHBfY2hpbGwgY2FzZSBNVUxUSV9TVUJTQ1JJUFQpOiAgRXJyb3IKKwlpZiAiZnVuY3Rpb24iIGlzIHBvaW50ZXIgdG8gbm9uLWZ1bmN0aW9uLgorCitNb24gTWFyICA0IDE3OjQ3OjAzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogdG9wLmMgKHByaW50X2dkYl92ZXJzaW9uKTogVXBkYXRlIGNvcHlyaWdodCB5ZWFyLgorCitNb24gTWFyICA0IDE0OjQ0OjU0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCUZyb20gUGV0ZXIgU2NoYXVlcjoKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IFJlbW92ZSBicmVha3BvaW50cyBhbmQKKwlzd2l0Y2ggdGVybWluYWwgc2V0dGluZ3MgYmVmb3JlIGNhbGxpbmcgU09MSUJfQURELgorCSogc29saWIuYyAoZW5hYmxlX2JyZWFrLCBTVlI0IHZhcmlhbnQpOiBEb24ndCBtYXAgaW4gc3ltYm9scworCWZvciB0aGUgZHluYW1pYyBsaW5rZXIsIHRoZSBuYW1lc3BhY2UgcG9sbHV0aW9uIGNhdXNlcyByZWFsCisJcHJvYmxlbXMuCisKK1N1biBNYXIgIDMgMTc6MTg6NTcgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgorCisJKiByZW1vdGUtbWlwcy5jIChjb21tb25fYnJlYWtwb2ludCk6IEV4cGxpY2l0bHkgdGVybWluYXRlIHRoZQorIAlyZXR1cm5lZCBidWZmZXIuCisKK1dlZCBGZWIgMjggMjI6MzI6MTggMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJRnJvbSBXaWxmcmllZCBNb3NlciA8d2lsZnJpZWQubW9zZXJAYXV0LmFsY2F0ZWwuYXQ+OgorCSogcmVtb3RlLmMgKHJlbW90ZV9kZXRhY2gpOiBTZW5kIGEgY29tbWFuZCAnRCcgdG8gdGhlIHRhcmdldAorCXdoZW4gZGV0YWNoaW5nLCB1cGRhdGUgdGhlIGZ1bmN0aW9uJ3MgY29tbWVudHMuCisKK1RodSBKdW4gIDYgMTY6MTE6MzggMTk5NiAgTWlsZXMgQmFkZXIgIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KKworCSogZ251LW5hdC5jICh0aHJlYWRfY21kX2xpc3QpOiBOZXcgZGVjbGFyYXRpb24uCisJKHBhcnNlX2ludF9hcmcpOiBOZXcgZnVuY3Rpb24uCisKK1dlZCBKdW4gIDUgMTc6Mjg6MDQgMTk5NiAgTWlsZXMgQmFkZXIgIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KKworCSogZ251LW5hdC5oIChzdHJ1Y3QgcHJvYyk6IEFkZCBERVRBQ0hfU0MgZmllbGQuCisJKiBnbnUtbmF0LmMgKG1ha2VfcHJvYyk6IFNldCBERVRBQ0hfU0MuCisJKHN0cnVjdCBpbmYpOiBBZGQgREVUQUNIX1NDICYgREVGQVVMVF9USFJFQURfREVUQUNIX1NDIGZpZWxkcy4KKwkobWFrZV9pbmYpOiBTZXQgREVUQUNIX1NDICYgREVGQVVMVF9USFJFQURfREVUQUNIX1NDIGZpZWxkcy4KKwkoYWRkX3RocmVhZF9jb21tYW5kcyk6IEFkZCBzZXQvc2hvdyBmb3IgZGV0YWNoLXN1c3BlbmQtY291bnQuCisJQWRkIHRha2VvdmVyLXN1c3BlbmQtY291bnQgY21kLgorCShpbmZfZGV0YWNoKTogU2V0IHN1c3BlbmQgY291bnRzIHRvIHRoZSBkZXRhY2ggU0MsIG5vdCAwLgorCShzZXRfdGhyZWFkX2RldGFjaF9zY19jbWQsIHNob3dfdGhyZWFkX2RldGFjaF9zY19jbWQsCisJc2V0X3Rhc2tfZGV0YWNoX3NjX2NtZCwgc2hvd190YXNrX2RldGFjaF9zY19jbWQsCisJc2V0X3RocmVhZF9kZWZhdWx0X3RocmVhZF9kZXRhY2hfc2NfY21kLAorCXNob3dfdGhyZWFkX2RlZmF1bHRfdGhyZWFkX2RldGFjaF9zY19jbWQpOiBOZXcgZnVuY3Rpb25zLgorCShzaG93X3Rhc2tfY21kKTogQWxzbyBzaG93IGRldGFjaC1zdXNwZW5kLWNvdW50IHZhbHVlcy4KKwkodGhyZWFkX3Rha2VvdmVyX3NjX2NtZCk6IE5ldyBmdW5jdGlvbi4KKworRnJpIE1heSAzMSAxNjo0OToyNCAxOTk2ICBNaWxlcyBCYWRlciAgPG1pbGVzQGdudS5haS5taXQuZWR1PgorCisJKiBnbnUtbmF0LmMgKHNob3dfdGhyZWFkX3J1bl9jbWQpOiBBY3R1YWxseSBwcmludCBzdGF0ZS4KKworVGh1IE1heSAzMCAxMDo0Nzo1NiAxOTk2ICBNaWxlcyBCYWRlciAgPG1pbGVzQGdudS5haS5taXQuZWR1PgorCisJKiBnbnUtbmF0LmMgKGluZl9zaWduYWwpOiBNYWtlIHVuZm9yd2FyZGFibGUgZXhjZXB0aW9ucyBhbiBlcnJvci4KKworVHVlIE1heSAyOCAxNzowNjozNiAxOTk2ICBNaWxlcyBCYWRlciAgPG1pbGVzQGdudS5haS5taXQuZWR1PgorCisJKiBnbnUtbmF0LmMgKGluZl92YWxpZGF0ZV9zdG9wcGVkKTogcHJvY19nZXRwcm9jaW5mbyB0YWtlcyBhCisJcG9pbnRlciB0byB0aGUgZmxhZ3Mgbm93LCBub3QgdGhlIGZsYWdzIHRoZW1zZWx2ZXMuCisKK01vbiBNYXkgMjcgMTM6MzE6MTcgMTk5NiAgTWlsZXMgQmFkZXIgIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KKworCSogZ251LW5hdC5jIChnbnVfd2FpdCk6IFByaW50IGRlYnVnZ2luZyBtc2dzIGZvciBwZW5kaW5nIGV4ZWNzLgorCShnbnVfY3JlYXRlX2luZmVyaW9yKTogQ2hlY2sgcmV0dXJuIGZyb20gcHRyYWNlLgorCitTdW4gTWF5IDI2IDE2OjU2OjM1IDE5OTYgIE1pbGVzIEJhZGVyICA8bWlsZXNAZ251LmFpLm1pdC5lZHU+CisKKwkqIGdudS1uYXQuaCAoc3RydWN0IHByb2MpOiBBZGQgREVBRCBmaWVsZC4KKwkqIGdudS1uYXQuYyAobWFrZV9wcm9jKTogSW5pdGlhbGl6ZSBERUFELgorCShpbmZfc2V0X3RyYWNlZCwgaW5mX3ZhbGlkYXRlX3Rhc2tfc2MsIGluZl92YWxpZGF0ZV9wcm9jczogRnJvYiBpdC4KKwkoZ251X3dhaXQpOiBPbmx5IGFib3J0IGZvciAwIHRocmVhZHMgaWYgdGhlIHRhc2sgaXNuJ3QgZGVhZC4KKworU2F0IE1heSAyNSAxNzowNjowNSAxOTk2ICBNaWxlcyBCYWRlciAgPG1pbGVzQGdudS5haS5taXQuZWR1PgorCisJKiBnbnUtbmF0LmMgKGluZl9zaWduYWwpOiBQYXNzIFNJR0NPREUgd2hlbiBwb3N0aW5nIGEgc2lnbmFsLgorCitXZWQgTWF5IDIyIDE4OjQ0OjI4IDE5OTYgIE1pbGVzIEJhZGVyICA8bWlsZXNAZ251LmFpLm1pdC5lZHU+CisKKwkqIGdudS1uYXQuYyAoU19wcm9jX3dhaXRfcmVwbHkpOiBBZGQgU0lHQ09ERSBhcmd1bWVudC4KKwkoaW5mX3NldF90cmFjZWQpOiBPbmx5IGdpdmUgbm8tc2lnbmFsLXRocmVhZCBlcnJvciBtZXNzYWdlIGlmCisJdHVybmluZyAqb24qIHRyYWNpbmcuCisKK1dlZCBNYXkgMTUgMTM6MDM6MTYgMTk5NiAgTWlsZXMgQmFkZXIgIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KKworCSogZ251LW5hdC5jIChpbmZfdmFsaWRhdGVfcHJvY3MpOiBJZiBJTkYgaGFzIG5vIHRocmVhZHMsIGFsd2F5cworCXNldCBpbmYtPnRocmVhZHNfdXBfdG9fZGF0ZSB0byAwLgorCShpbmZfc2lnbmFsKTogUGFzcyBpbiBuZXcgU0lHQ09ERSBhcmd1bWVudCB0byBtc2dfc2lnX3Bvc3RfdW50cmFjZWQuCisJKGdudV93YWl0KTogUGFzcyBpbiBuZXcgVElNRU9VVCBhcmcgdG8gaW50ZXJydXB0X29wZXJhdGlvbi4KKwkocHJvY191cGRhdGVfc2MpOiBDYXN0IHRocmVhZCBzdGF0ZSBhcmcgdG8gdGhyZWFkX3NldF9zdGF0ZS4KKwkocHJvY19nZXRfc3RhdGUpOiBDYXN0IHRocmVhZCBzdGF0ZSBhcmcgdG8gdGhyZWFkX2dldF9zdGF0ZS4KKwkoaW5mX3ZhbGlkYXRlX3Rhc2tfc2MpOiBDYXN0IHRhc2tfYmFzaWNfaW5mbyBhcmcgdG8gdGFza19pbmZvLgorCSogaTM4NmdudS1uYXQuYyAoZ251X2ZldGNoX3JlZ2lzdGVycywgZ251X3N0b3JlX3JlZ2lzdGVycyk6IENhbGwKKwlpbmZfdXBkYXRlX3Byb2NzIGJlZm9yZSB3ZSBsb29rdXAgdGhlIHRocmVhZC4KKwkqIGNvbmZpZy9pMzg2L2kzODZnbnUubWggKE1IX0NGTEFHUyk6IE5ldyB2YXJpYWJsZS4KKworVHVlIE1heSAgNyAxNzo1MjozMyAxOTk2ICBNaWxlcyBCYWRlciAgPG1pbGVzQGdudS5haS5taXQuZWR1PgorCisJKiBnbnUtbmF0LmMgKGdudV9raWxsX2luZmVyaW9yKTogVXNlIGluZl9zZXRfdGFzayB0byBjbGVhciB0aGUgdGFzay4KKworTW9uIE1heSAgNiAxOTowNjo0OSAxOTk2ICBNaWxlcyBCYWRlciAgPG1pbGVzQGdudS5haS5taXQuZWR1PgorCisJKiBnbnUtbmF0LmMgKGluZl9zZXRfdHJhY2VkKTogVXNlIG1zZ19zZXRfaW5pdF9pbnQgd2l0aAorCUlOSVRfVFJBQ0VNQVNLIGluc3RlYWQgb2Ygc2V0dGluZyB0aGUgZXhlYyBmbGFncy4KKworRnJpIE1heSAgMyAxOToxMDo1NyAxOTk2ICBNaWxlcyBCYWRlciAgPG1pbGVzQGdudS5haS5taXQuZWR1PgorCisJKiBnbnUtbmF0LmMgKGluZl92YWxpZGF0ZV9wcm9jcyk6IERvbid0IGNsZWFyIElORi0+dGFzayBpZiB3ZSBmaW5kCisJdGhlIHRhc2sncyBkaWVkLCBzbyBvdGhlcnMgaGF2ZSBhIGNoYW5jZSBhdCBpdC4KKwkoZ251X3Jlc3VtZSk6IFdoZW4gc2luZ2xlLXN0ZXBwaW5nIGEgc2luZ2xlIHRocmVhZCwgZ2l2ZW4gYW4gZXJyb3IKKwlpZiB0aGVyZSBpcyBubyBzdWNoIHRocmVhZC4gIFdoZW4gc2luZ2xlLXN0ZXBwaW5nIG9uZSBidXQgcnVubmluZworCXRoZSBvdGhlcnMsIGp1c3QgZ2l2ZW4gYSB3YXJuaW5nIGFuZCBzdGlsbCBydW4gYWxsIHRoZSB0aHJlYWRzLgorCShnbnVfd2FpdCk6IElmIHRoZXJlIHNlZW0gdG8gYmUgbm8gdGhyZWFkcywgbG9vayBoYXJkZXIsIGFuZAorCXNpZ25hbCBhbiBlcnJvciBpZiB0aGVyZSByZWFsbHkgYXJlbid0IGFueS4KKwkoZ251X2F0dGFjaCk6IFJlc2V0IHRocmVhZCBudW1iZXJpbmcgdG8gMC4KKworCSogaTM4NmdudS1uYXQuYyAoZ251X2ZldGNoX3JlZ2lzdGVycywgZ251X3N0b3JlX3JlZ2lzdGVycyk6IEdpdmUKKwl0aHJlYWQgbmFtZSBpbiB3YXJuaW5nIG1lc3NhZ2VzLgorCisJKiBnbnUtbmF0LmMgKGFjdGl2ZV9pbmYpOiBOZXcgZnVuY3Rpb24uCisJKHNob3dfc2lnX3RocmVhZF9jbWQsIHNob3dfc3RvcHBlZF9jbWQpOiBVc2UgaXQuCisJKGluZm9fcG9ydF9yaWdodHMsIGluZm9fc2VuZF9yaWdodHNfY21kLCBpbmZvX3BvcnRfc2V0c19jbWQsCisJaW5mb19yZWN2X3JpZ2h0c19jbWQsIGluZm9fcG9ydF9yaWdodHNfY21kLCBpbmZvX3BvcnRfcmlnaHRzX2NtZCk6CisJTmV3IGZ1bmN0aW9ucy4KKwkoYWRkX3Rhc2tfY29tbWFuZHMpOiBBZGQgbmV3IHBvcnQtcmlnaHQgaW5mbyBjb21tYW5kcy4KKworRnJpIEFwciAyNiAyMDo0MjoxNiAxOTk2ICBNaWxlcyBCYWRlciAgPG1pbGVzQGdudS5haS5taXQuZWR1PgorCisJKiBnbnUtbmF0LmMgKGdudV93YWl0KTogSW5zdGVhZCBvZiBfaHVyZF9pbnRyX3JwY19tYWNoX21zZywganVzdAorCXVzZSBtYWNoX21zZyB3aXRoIE1BQ0hfUkNWX0lOVEVSUlVQVC4KKwkoc2V0X25vbmludmFzaXZlX2NtZCk6IE5ldyBmdW5jdGlvbi4KKwkoYWRkX3Rhc2tfY29tbWFuZHMpOiBBZGQgY29tbWFuZCBlbnRyeSBmb3IgYHNldCBub25pbnZhc2l2ZScuCisKK01vbiBNYXIgIDQgMTQ6MTI6MDIgMTk5NiAgTWlsZXMgQmFkZXIgIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KKworCSogZ251LW5hdC5jIChnbnVfcmVhZF9pbmZlcmlvcik6IFVzZSBodXJkX3NhZmVfbWVtbW92ZSwgbm90IHNhZmVfYmNvcHkuCisJKHNhZmVfYmNvcHkpOiBGdW5jdGlvbiByZW1vdmVkLgorCitNb24gRGVjICA0IDE0OjE4OjI2IDE5OTUgIE1pbGVzIEJhZGVyICA8bWlsZXNAZ251LmFpLm1pdC5lZHU+CisKKwkqIGdudS1uYXQuYyAocHJvY191cGRhdGVfc2MpOiBBc3NlcnQgb25seSB0aHJlYWRzIGNhbiBoYXZlIHN0YXRlLgorCShtYWtlX3Byb2MpOiBJbml0aWFsaXplIHN0YXRlX3ZhbGlkICYgc3RhdGVfY2hhbmdlZCBmaWVsZHMuCisKK1R1ZSBOb3YgMjggMTc6NTE6MjEgMTk5NSAgTWlsZXMgQmFkZXIgIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KKworCSogcmVwbHlfbWlnX2hhY2suYXdrOiBOZXcgZmlsZS4KKworVHVlIE5vdiAxNCAxNDozMTowMyAxOTk1ICBNaWxlcyBCYWRlciAgPG1pbGVzQGdudS5haS5taXQuZWR1PgorCisJKiBicmVha3BvaW50LmMgKGJyZWFrcG9pbnRfMSk6IFByaW50IGJyZWFrcG9pbnQgdGhyZWFkIGZpZWxkLgorCisJKiBseW54LW5hdC5jIChjaGlsZF93YWl0KTogUmV0dXJuIFRBUkdFVF9XQUlUS0lORF9TUFVSSU9VUyBmb3IgbmV3CisJdGhyZWFkcy4KKworTW9uIE5vdiAxMyAxODozMDo1MyAxOTk1ICBNaWxlcyBCYWRlciAgPG1pbGVzQGdudS5haS5taXQuZWR1PgorCisJKiB0YXJnZXQuYyAoZGVidWdfdG9fY2hlY2tfdGhyZWFkcyk6IE5ldyBmdW5jdGlvbi4KKworCSogaW5mbG93LmMgKHRlcm1pbmFsX2luaXRfaW5mZXJpb3Jfd2l0aF9wZ3JwKTogTmV3IGZ1bmN0aW9uLgorCSh0ZXJtaW5hbF9pbml0X2luZmVyaW9yKTogQ2FsbCB0ZXJtaW5hbF9pbml0X2luZmVyaW9yX3dpdGhfcGdycC4KKwkqIGluZmVyaW9yLmggKHRlcm1pbmFsX2luaXRfaW5mZXJpb3Jfd2l0aF9wZ3JwKTogTmV3IGRlY2xhcmF0aW9uLAorCWJ1dCBvbmx5IGlmIFBST0NFU1NfR1JPVVBfVFlQRSBpcyBkZWZpbmVkLgorCitNb24gTm92ICA2IDE2OjQyOjA5IDE5OTUgIE1pbGVzIEJhZGVyICA8bWlsZXNAZ251LmFpLm1pdC5lZHU+CisKKwkqIHRhcmdldC5jIChkZWJ1Z190b190aHJlYWRfYWxpdmUpOiBQYXNzIHRocm91Z2ggdGhlIHJldHVybiB2YWx1ZS4KKworVGh1IE5vdiAgMiAxODowNTowMCAxOTk1ICBNaWxlcyBCYWRlciAgPG1pbGVzQGdudS5haS5taXQuZWR1PgorCisJKiB0YXJnZXQuYyAoc2lnbmFscywgdGFyZ2V0X3NpZ25hbF9mcm9tX2hvc3QsIHRhcmdldF9zaWduYWxfdG9faG9zdCk6IAorCUFkZCBtYWNoIGV4Y2VwdGlvbnMuCisJKiB0YXJnZXQuaCAoZW51bSB0YXJnZXRfc2lnbmFsKTogQWRkIG1hY2ggZXhjZXB0aW9ucy4KKworTW9uIE9jdCAzMCAxNjo0MTowNCAxOTk1ICBNaWxlcyBCYWRlciAgPG1pbGVzQGdudS5haS5taXQuZWR1PgorCisJKiBnbnUtbmF0LmM6IE5ldyBmaWxlOiBnbnUgbmF0aXZlIGJhY2tlbmQuCisJKiBpMzg2Z251LW5hdC5jOiBOZXcgZmlsZTogaTM4Ni1zcGVjaWZpYyBwYXJ0IG9mIGdudSBuYXRpdmUgYmFja2VuZC4KKwkqIGdudS1uYXQuaDogTmV3IGZpbGUuCisJKiBjb25maWcvbm0tZ251Lmg6IE5ldyBmaWxlLgorCSogY29uZmlnL3RtLWkzODZnbnUuaDogTmV3IGZpbGUuCisJKiBjb25maWcveG0taTM4NmdudS5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZy9pMzg2L2kzODZnbnUubWg6IE5ldyBmaWxlLgorCSogY29uZmlnL2kzODYvaTM4NmdudS5tdDogTmV3IGZpbGUuCisKK1dlZCBGZWIgMjggMTU6NTA6MTIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogQnVtcCB2ZXJzaW9uIHRvIDQuMTUuMiB0byBlc3RhYmxpc2gKKwliYXNlbGluZSBmb3IgZ2RiIDQuMTYgcmVyZWxlYXNlIHRlc3RpbmcuCisKK1dlZCBGZWIgMjggMTM6MzI6MDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzb21zb2xpYi5jIChzb21fc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiBCZWZvcmUgcmV0dXJuaW5nCisJY2FsbCBjbGVhcl9zeW10YWJfdXNlcnMuCisKK1R1ZSBGZWIgMjcgMDA6MDQ6NDYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLWU3MDAwLmMgKGU3MDAwX29wZW4pOiAgRGVsZXRlIGFsbCBicmVha3BvaW50cyB3aGVuCisJY29ubmVjdGluZyB0byBlNzAwMC4gIENoYW5nZSBjb25uZWN0IG1lc3NhZ2UgdG8gYWxsb3cgdXNlIG9mCisJbW9uaXRvci5leHAgaW4gdGVzdCBzdWl0ZS4KKwkqIChlNzAwMF9sb2FkKTogIFByaW50IHRyYW5zZmVyIHJhdGUgb2YgZG93bmxvYWQuCisJKiBzeW1maWxlLmMgKGdlbmVyaWNfbG9hZCk6ICBQcmludCB0cmFuc2ZlciByYXRlIG9mIGRvd25sb2FkLgorCitTdW4gRmViIDI1IDEzOjU4OjMzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChtaXBzKi0qLXZ4d29ya3MqKTogTmV3IGNvbmZpZy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKKwkqIGNvbmZpZy9taXBzL3Z4bWlwcy5tdCwgY29uZmlnL21pcHMvdG0tdnhtaXBzLmg6IE5ldyBmaWxlcy4KKwkqIHJlbW90ZS12eG1pcHMuYyAodnhfY29udmVydF90b192aXJ0dWFsLCB2eF9jb252ZXJ0X2Zyb21fdmlydHVhbCk6CisJUmVtb3ZlLCBuZXZlciB1c2VkLgorCitTYXQgRmViIDI0IDEyOjMwOjI4IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogcGFydGlhbC1zdGFiLmggKGNhc2UgTl9GVU4pOiAgRnVuY3Rpb24gc3ltYm9scyBnZW5lcmF0ZWQKKwlieSBTUEFSQ3dvcmtzIGNjIGhhdmUgYSBtZWFuaW5nbGVzcyB6ZXJvIHZhbHVlLCBkbyBub3QgdXBkYXRlCisJcHN0LT50ZXh0bG93IGlmIHRoZSBmdW5jdGlvbiBzeW1ib2wgdmFsdWUgaXMgemVyby4gCisKKwkqIHN0YWJzcmVhZC5jIChkZWZpbmVfc3ltYm9sKTogIEluaXRpYWxpemUgU1lNQk9MX1RZUEUgZmllbGQKKwlmb3IgZnVuY3Rpb24gcHJvdG90eXBlIGRlY2xhcmF0aW9uIHN5bWJvbHMuCisKK0ZyaSBGZWIgMjMgMjI6MzM6MDQgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLWU3MDAwLmMgKGU3MDAwX2xvYWQpOiAgTmV3IHJvdXRpbmUgdG8gZG93bmxvYWQgdmlhIHRoZQorCW5ldHdvcmsuCisJKiAoZTcwMDBfd2FpdCk6ICBEb24ndCBiYWNrdXAgUEMgd2hlbiB3ZSBoaXQgYSBicmVha3BvaW50LgorCUFwcGFyYW50bHkgbmV3IHNoMiBwb2RzIGdldCB0aGlzIHJpZ2h0Li4uCisJKiAoZTcwMDBfb3BzKTogIEFkZCBjYWxsIHRvIGU3MDAwX2xvYWQuCisKK1RodSBGZWIgMjIgMDA6NTI6NDIgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBjb25maWcvbTY4ay97bmJzZC5taCxuYnNkLm10LG5tLW5ic2QuaCx0bS1uYnNkLmgseG0tbmJzZC5ofSwKKwltNjhrbmJzZC1uYXQuYzogTmV3IGZpbGVzLCBzdXBwb3J0IGZvciBOZXRCU0QvbTY4ay4KKworCSogY29uZmlndXJlLmluIChtNjhrLSotbmV0YnNkKik6IE5ldyBjb25maWcuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitXZWQgRmViIDIxIDE5OjAwOjIxIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBzdGFuZGFsb25lLmMgKG9wZW4sIF9pbml0aWFsaXplX3N0YW5kYWxvbmUpOiBGaXggb2J2aW91cyB0eXBvcworCXJlcG9ydGVkIGJ5IE1hcnRpbiBQb29sIDxtYXJ0aW5AY2l0ci51cS5vei5hdT4uCisKK1dlZCBGZWIgMjEgMTQ6MjQ6MDQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzb2xpYi5jIChzb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vayk6IEZpeCB0aGlua28uCisKK1R1ZSBGZWIgMjAgMjM6NTk6MTkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzb2xpYi5jIChzb2xpYl9icmVha19uYW1lcyk6IERlZmluZSBmb3IgU29sYXJpcyBhbmQgTGludXguCisJKGVuYWJsZV9icmVhayk6IEZvciBTVlI0IHN5c3RlbXMsIGZpcnN0IHRyeSB0byB1c2UgdGhlIGRlYnVnZ2VyCisJaW50ZXJmYWNlcyBpbiB0aGUgZHluYW1pYyBsaW5rZXIgdG8gdHJhY2sgc2hhcmVkIGxpYnJhcnkgZXZlbnRzCisJYXMgdGhleSBoYXBwZW4sIHRoZW4gZmFsbCBiYWNrIHRvIEJLUFRfQVRfU1lNQk9MIGNvZGUuICBDb252ZXJ0CisJQktQVF9BVF9TWU1CT0wgY29kZSB0byB1c2Ugc2hhcmVkIGxpYnJhcnkgZXZlbnQgYnJlYWtwb2ludHMuCisJKHNvbGliX2NyZWF0ZV9pbmZlcmlvcl9ob29rKTogU2ltcGxpZnkgQktQVF9BVF9TWU1CT0wgY29kZSwKKwlpdCBubyBsb25nZXIgbmVlZHMgdG8gcmVzdGFydC93YWl0IG9uIHRoZSBpbmZlcmlvci4KKwkqIHN5bWZpbGUuYyAoZmluZF9sb3dlc3Rfc2VjdGlvbik6IE5vIGxvbmdlciBzdGF0aWMuCisJKiBzeW1maWxlLmggKGZpbmRfbG93ZXN0X3NlY3Rpb24pOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCisKK1R1ZSBGZWIgMjAgMTg6NTQ6MDggMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHZhbG9wcy5jIChDT0VSQ0VfRkxPQVRfVE9fRE9VQkxFKTogRGVmaW5lIGRlZmF1bHQgdmFsdWUuCisJKHZhbHVlX2FyZ19jb2VyY2UpOiBVc2UgQ09FUkNFX0ZMT0FUX1RPX0RPVUJMRS4KKwkqIGNvbmZpZy9hbHBoYS90bS1hbHBoYS5oIChDT0VSQ0VfRkxPQVRfVE9fRE9VQkxFKTogRGVmaW5lIHRvIDEuCisJKiBjb25maWcvbWlwcy90bS1taXBzLmg6IERpdHRvLgorCSogY29uZmlnL3BhL3RtLWhwcGEuaDogRGl0dG8uCisJKiBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oOiBEaXR0by4KKwkqIGNvbmZpZy9zcGFyYy90bS1zcGFyYy5oOiBEaXR0by4KKwkKK1R1ZSBGZWIgMjAgMTc6MzI6MDUgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBjb25maWcve2kzODYsbnMzMmt9L25ic2QubWggKE5BVERFUEZJTEVTKTogUmVtb3ZlIGNvcmUtYW91dC5vLgorCisJKiBjb25maWcvbm0tbmJzZC5oIChGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMpOiBEZWZpbmVkLgorCSogY29uZmlnL3htLW5ic2QuaCAoQ0NfSEFTX0xPTkdfTE9ORywgUFJJTlRGX0hBU19MT05HX0xPTkcpOgorCSNpZmRlZidkIG91dCBkZWZpbml0aW9ucyAtLS0gIENhdXNlcyBzZXJpb3VzIGdkYiBmYWlsdXJlcyBvbiAKKwl0aGUgaTM4Ni4gIE5lZWQgdG8gaW52ZXN0aWdhdGUgZnVydGhlciBiZWZvcmUgZW5hYmxpbmcuCisKKwkqIGkzODZiLW5hdC5jIChmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMsIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycywKKwlmZXRjaF9jb3JlX3JlZ2lzdGVycyk6IE5ldyBmdW5jdGlvbnMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlZmluZWQKKwlpZiBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMgaXMgc2V0LiAgUmVnaXN0ZXJzIGFyZSBmZXRjaGVkL3N0b3JlZAorCXdpdGggcHRyYWNlIFBUX0dFVFJFR1MvUFRfU0VUUkVHUy4KKworVHVlIEZlYiAyMCAxNjo1NTowNiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBmaW5kdmFyLmMgKGV4dHJhY3RfZmxvYXRpbmcgc3RvcmVfZmxvYXRpbmcpOiAgUmVwbGFjZSBgbG9uZworCWRvdWJsZScgd2l0aCBgRE9VQkxFU1QnLgorCitNb24gRmViIDE5IDE1OjI1OjUxIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3htLW5ic2QuaCAoQ0NfSEFTX0xPTkdfTE9ORywgUFJJTlRGX0hBU19MT05HX0xPTkcpOgorIAlEZWZpbmUuCisKK01vbiBGZWIgMTkgMTA6MzI6MDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzeW10YWIuaCAobG9vdXBfbWluaW1hbF9zeW1ib2xfc29saWJfdHJhbXBvbGluZSk6IERlY2xhcmUuCisKKwkqIGJyZWFrcG9pbnQuaCAocmVtb3ZlX3NvbGliX2V2ZW50X2JyZWFrcG9pbnRzKTogRGVjbGFyZS4KKwkqIGJyZWFrcG9pbnQuYyAocmVtb3ZlX3NvbGliX2V2ZW50X2JyZWFrcG9pbnRzKTogTmV3IGZ1bmN0aW9uLgorCSogc29tc29saWIuYyAoc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiBSZW1vdmUgYWxsIHNvbGliIGV2ZW50CisJYnJlYWtwb2ludHMgYmVmb3JlIGluc2VydGluZyBhbnkgbmV3IG9uZXMuICBVc2UgYSBzb2xpYiBldmVudAorCWJyZWFrcG9pbnQgZm9yIHRoZSBicmVha3BvaW50IGF0ICJfc3RhcnQiLgorCVJlbW92ZSBleHRyYW5lb3VzICJcbiIgZnJvbSBjYWxscyB0byB3YXJuaW5nLiAgCisJCisJKiBicmVha3BvaW50LmMgKGJyZWFrcG9pbnRfMSk6IEFkZCBtaXNzaW5nICJzaWd0cmFtcCIgdG8gYnB0eXBlcworCW5hbWUgYXJyYXkuCisJCitNb24gRmViIDE5IDAxOjA5OjMyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY3lnbnVzLmNvbT4KKworCSogZHdhcmZyZWFkLmMgKGFkZF9wYXJ0aWFsX3N5bWJvbCk6IFVzZSBBRERfUFNZTUJPTF9BRERSX1RPX0xJU1QKKwlmb3IgQ09SRV9BRERSIHZhbHVlcy4KKwkobmV3X3N5bWJvbCk6IFVzZSBTWU1CT0xfVkFMVUVfQUREUkVTUyBmb3IgQ09SRV9BRERSIHZhbHVlcy4KKwkqIHN5bWZpbGUuaCAoYWRkX3BzeW1ib2xfeyxhZGRyfXRvX2xpc3QpOiBBZGQgcHJvdG90eXBlcy4KKworU3VuIEZlYiAxOCAxNDozNzoxMyAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIG1pcHNyZWFkLmMgKG1pcHNjb2ZmX3N5bWZpbGVfcmVhZCk6ICBVbmNvbmRpdGlvbmFsbHkgYWRkCisJYWxwaGEgY29mZiBkeW5hbWljIHN5bWJvbHMgZm9yIGFsbCBzeW1ib2wgZmlsZXMuICBNYWtlcyBza2lwcGluZworCW92ZXIgdGhlIHRyYW1wb2xpbmUgY29kZSB3b3JrIHdoZW4gc3RlcHBpbmcgZnJvbSBhIGZ1bmN0aW9uIGluIGEKKwlzaGFyZWQgbGlicmFyeSBpbnRvIGEgZnVuY3Rpb24gaW4gYSBkaWZmZXJlbnQgc2hhcmVkIGxpYnJhcnkuCisKK1N1biBGZWIgMTggMDk6Mjc6MTAgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3NwYXJjL3RtLXNwYXJjLmg6ICBEZWZpbmUgUFNfRkxBR19DQVJSWS4gIERlZmluZQorCVJFVFVSTl9WQUxVRV9PTl9TVEFDSyB0byByZXR1cm4gbG9uZyBkb3VibGVzIG9uIHRoZSBzdGFjay4KKworU2F0IEZlYiAxNyAxNjozMzoxMSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGNoLWV4cC5vKTogQWRkIGRlcGVuZGVuY2llcy4KKwkodmFyaW91cyk6IEFkZCBnZGJfc3RyaW5nLmggdG8gZGVwZW5kZW5jaWVzIHRoYXQgbmVlZCBpdC4KKworU2F0IEZlYiAxNyAwODo1Nzo1MCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogc3ltbWlzYy5jIChwcmludF9zeW1ib2xfYmNhY2hlX3N0YXRpc3RpY3MpOiBVcGRhdGUgZGVzY3JpcHRpb24gZm9yCisJcHJpbnRpbmcgYnl0ZSBjYWNoZSBzdGF0aXN0aWNzLgorCitUaHUgRmViIDE2IDE2OjAyOjAzIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIEFkZCBuYXRpdmUgc3VwcG9ydCBmb3IgbG9uZyBkb3VibGUgZGF0YSB0eXBlLgorCSogYy1leHAueSAoJXVuaW9uKTogIENoYW5nZSBkdmFsIHRvIHR5cGVkX3ZhbF9mbG9hdC4gIFVzZSBET1VCTEVTVAorCXRvIHN0b3JlIGFjdHVhbCBkYXRhLiAgQ2hhbmdlIHR5cGVzIG9mIElOVCBhbmQgRkxPQVQgdG9rZW5zIHRvCisJdHlwZWRfdmFsX2ludCBhbmQgdHlwZWRfdmFsX2Zsb2F0IHJlc3BlY3RpdmVseS4gIENyZWF0ZSBuZXcgdG9rZW4KKwlET1VCTEVfS0VZV09SRCB0byBzcGVjaWZ5IHRoZSBzdHJpbmcgYGRvdWJsZScuICBNYWtlIHByb2R1Y3Rpb24KKwlmb3IgRkxPQVQgdXNlIHR5cGUgZGV0ZXJtaW5lZCBieSBwYXJzZV9udW1iZXIuICBBZGQgcHJvZHVjdGlvbiBmb3IKKwkibG9uZyBkb3VibGUiIGRhdGEgdHlwZS4KKwkqIChwYXJzZV9udW1iZXIpOiAgVXNlIHNzY2FuZiB0byBwYXJzZSBudW1iZXJzIGFzIGZsb2F0LCBkb3VibGUgb3IKKwlsb25nIGRvdWJsZSBkZXBlbmRpbmcgdXBvbiB0aGUgdHlwZSBvZiB0eXBlZF92YWxfZmxvYXQuZHZhbC4gIEFsc28KKwlhbGxvdyB1c2VyIHRvIHNwZWNpZnkgYGYnIG9yIGBsJyBzdWZmaXggdG8gZXhwbGljaXRseSBzcGVjaWZ5CisJZmxvYXQgb3IgbG9uZyBkb3VibGUgY29uc3RhbnRzLiAgQ2hhbmdlIHR5cGVkX3ZhbCB0bworCXR5cGVkX3ZhbF9pbnQuCisJKiAoeXlsZXgpOiAgQ2hhbmdlIHR5cGVkX3ZhbCB0byB0eXBlZF92YWxfaW50LiAgQWxzbywgc2NhbiBmb3IKKwkiZG91YmxlIiBrZXl3b3JkLgorCSogY29mZnJlYWQuYyAoZGVjb2RlX2Jhc2VfdHlwZSk6ICBBZGQgc3VwcG9ydCBmb3IgVF9MTkdEQkwgYmFzaWMKKwl0eXBlLgorCSogY29uZmlndXJlLCBjb25maWd1cmUuaW46ICBBZGQgY2hlY2sgZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQgaW4KKwl0aGUgaG9zdCBjb21waWxlci4KKwkqIGRlZnMuaDogIERlZmluZSBET1VCTEVTVCBhcHByb3ByaWF0bHkgZGVwZW5kaW5nIG9uIHdoZXRoZXIKKwlIQVZFX0xPTkdfRE9VQkxFIChmcm9tIGF1dG9jb25mKSBpcyBkZWZpbmVkLiAgQWxzbywgZml4IHByb3RvdHlwZXMKKwlmb3IgZnVuY3Rpb25zIHRoYXQgaGFuZGxlIHRoaXMgdHlwZS4KKwkqIGV4cHJlc3Npb24uaCAodW5pb24gZXhwX2VsZW1lbnQpOiAgZG91YmxlY29uc3QgaXMgbm93IHR5cGUKKwlET1VCTEVTVC4KKwkqIG0yLWV4cC55IGYtZXhwLnkgKCV1bmlvbik6ICBkdmFsIGJlY29tZXMgdHlwZSBET1VCTEVTVC4KKwkqIGZpbmR2YXIuYyAoZXh0cmFjdF9mbG9hdGluZyk6ICBNYWtlIHJldHVybiB2YWx1ZSBiZSBET1VCTEVTVC4KKwlBbHNvLCBhZGQgc3VwcG9ydCBmb3IgbnVtYmVycyB3aXRoIHNpemUgb2YgbG9uZyBkb3VibGUuCisJKiAoc3RvcmVfZmxvYXRpbmcpOiAgQXJnIGB2YWwnIGlzIG5vdyB0eXBlIERPVUJMRVNULiAgSGFuZGxlIGFsbAorCWZsb2F0aW5nIHR5cGVzLgorCSogcGFyc2VyLWRlZnMuaCBwYXJzZS5jICh3cml0ZV9leHBfZWx0X2RibGNzdCk6ICBBcmcgZXhwZWx0IGlzIG5vdworCURPVUJMRVNULgorCSogdmFsYXJpdGguYyAodmFsdWVfYmlub3ApOiAgQ2hhbmdlIHRlbXAgdmFyaWFibGVzIHYxLCB2MiBhbmQgdiB0bworCXR5cGUgRE9VQkxFU1QuICBDb2VyY2UgdHlwZSBvZiByZXN1bHQgdG8gbG9uZyBkb3VibGUgaWYgZWl0aGVyIG9wCisJd2FzIG9mIHRoYXQgdHlwZS4KKwkqIHZhbG9wcy5jICh2YWx1ZV9hcmdfY29lcmNlKTogIElmIGFyZ3VtZW50IHR5cGUgaXMgYmlnZ2VyIHRoYW4KKwlkb3VibGUsIGNvZXJjZSB0byBsb25nIGRvdWJsZS4KKwkqIChjYWxsX2Z1bmN0aW9uX2J5X2hhbmQpOiAgSWYgUkVHX1NUUlVDVF9IQVNfQUREUiBpcyBkZWZpbmVkLCBhbmQKKwlhcmcgdHlwZSBpcyBmbG9hdCBhbmQgPiA4IGJ5dGVzLCB0aGVuIHVzZSBwb2ludGVyLXRvLW9iamVjdAorCWNhbGxpbmcgY29udmVudGlvbnMuCisJKiB2YWxwcmludC5jIChwcmludF9mbG9hdGluZyk6ICBBcmcgZG91YiBpcyBub3cgdHlwZSBET1VCTEVTVC4KKwlVc2UgYXBwcm9wcmlhdGUgZm9ybWF0IGFuZCBwcmVjaXNpb24gdG8gcHJpbnQgb3V0IGZsb2F0aW5nIHBvaW50CisJdmFsdWVzLgorCSogdmFsdWUuaDogIEZpeHVwIHByb3RvdHlwZXMgZm9yIHZhbHVlX2FzX2RvdWJsZSwKKwl2YWx1ZV9mcm9tX2RvdWJsZSwgYW5kIHVucGFja19kb3VibGUgdG8gdXNlIERPVUJMRVNULgorCSogdmFsdWVzLmMgKHJlY29yZF9sYXRlc3RfdmFsdWUpOiAgUmVtb3ZlIGNoZWNrIGZvciBpbnZhbGlkCisJZmxvYXRzLiAgQWxsb3cgaGlzdG9yeSB0byBzdG9yZSB0aGVtIHNvIHRoYXQgcGVvcGxlIG1heSBleGFtaW5lCisJdGhlbSBpbiBoZXggaWYgdGhleSB3YW50LgorCSogKHZhbHVlX2FzX2RvdWJsZSB1bnBhY2tfZG91YmxlKTogIENoYW5nZSByZXR1cm4gdmFsdWUgdG8gRE9VQkxFU1QuCisJKiAodmFsdWVfZnJvbV9kb3VibGUpOiAgQXJnIGBudW0nIGlzIG5vdyBET1VCTEVTVC4KKwkqICh1c2luZ19zdHJ1Y3RfcmV0dXJuKTogIFVzZSBSRVRVUk5fVkFMVUVfT05fU1RBQ0sgbWFjcm8gKHRhcmdldAorCXNwZWNpZmljKSB0byBleHBlY3QgY2VydGFpbiB0eXBlcyB0byBhbHdheXMgYmUgcmV0dXJuZWQgb24gdGhlIHN0YWNrLgorCitGcmkgRmViIDE2IDE0OjAwOjU0IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBiY2FjaGUuYywgYmNhY2hlLmg6IE5ldyBmaWxlcyB0byBpbXBsZW1lbnQgYSBieXRlIGNhY2hlLgorCSogTWFrZWZpbGUuaW4gKFNGSUxFUyk6IEFkZCBiY2FjaGUuYy4KKwkoc3ltdGFiX2gpOiBBZGQgYmNhY2hlLmguCisJKEhGSUxFU19OT19TUkNESVIpOiBhZGQgYmNhY2hlLmgKKwkoQ09NTU9OX09CSlMpOiBBZGQgYmNhY2hlLm8KKwkoYmNhY2hlLm8pOiBOZXcgdGFyZ2V0LgorCSogZGJ4cmVhZC5jIChzdGFydF9wc3ltdGFiKTogTWFrZSBnbG9iYWxfc3ltcyAmIHN0YXRpY19zeW1zCisgCXR5cGUgInBhcnRpYWxfc3ltYm9sICoqIi4KKwkqIGhwcmVhZC5jIChocHJlYWRfc3RhcnRfc3ltdGFiKTogIERpdHRvLgorCSogb3M5a3JlYWQuYyAob3M5a19zdGFydF9wc3ltdGFiKTogIERpdHRvLgorCSogc3RhYnNyZWFkLmggKHN0YXJ0X3BzeW10YWIpOiAgRGl0dG8uCisJKiB7c3ltZmlsZS5jLCBzeW1maWxlLmh9IChzdGFydF9wc3ltdGFiX2NvbW1vbik6ICBEaXR0by4KKwkqIG1haW50LmMgKG1haW50ZW5hbmNlX3ByaW50X3N0YXRpc3RpY3MpOiBDYWxsCisgCXByaW50X3N5bWJvbF9iY2FjaGVfc3RhdGlzdGljcy4KKwkqIG9iamZpbGVzLmMgKGFsbG9jYXRlX29iamZpbGUpOiBJbml0aWFsaXplIHBzeW1ib2wgYmNhY2hlIG1hbGxvYworCWFuZCBmcmVlIHBvaW50ZXJzLgorCSogc29saWIuYyAoYWxsb2NhdGVfcnRfY29tbW9uX29iamZpbGUpOiBEaXR0by4KKwkqIHN5bWZpbGUuYyAocmVyZWFkX3N5bWJvbHMpOiAgRGl0dG8uCisJKGZyZWVfb2JqZmlsZSk6IEZyZWUgcHN5bWJvbCBiY2FjaGUgd2hlbiBvYmpmaWxlIGlzIGZyZWVkLgkKKwkob2JqZmlsZV9yZWxvY2F0ZSk6IFVzZSBuZXcgaW5kaXJlY3QgcHN5bWJvbCBwb2ludGVycy4KKwkqIG9iamZpbGVzLmggKHN0cnVjdCBvYmpmaWxlKTogQWRkIHBzeW1ib2wgY2FjaGUuCisJKiBzeW1maWxlLmMgKGNvbXBhcmVfcHN5bWJvbHMpOiBOb3cgcGFzc2VkIHBvaW50ZXJzIHRvIHBvaW50ZXJzIHRvCisJcHN5bWJvbHMuCisJKHJlcmVhZF9zeW1ib2xzKTogRnJlZSBwc3ltYm9sIGJjYWNoZSB3aGVuIGZyZWVpbmcgb3RoZXIgb2JqZmlsZQorCXJlc291cmNlcy4KKwkoYWRkX3BzeW1ib2xfdG9fbGlzdCwgYWRkX3BzeW1ib2xfYWRkcl90b19saXN0KTogSW5pdGlhbGl6ZSBuZXcKKwlwc3ltYm9sIHVzaW5nIHRoZSBwc3ltYm9sIGJjYWNoZS4KKwkoaW5pdF9wc3ltYm9sX2xpc3QpOiBQc3ltYm9sIGxpc3RzIG5vdyBjb250YWluIHBvaW50ZXJzIHJhdGhlciB0aGFuCisJdGhlIGFjdHVhbCBwc3ltYm9scy4KKwkqIHN5bWZpbGUuaCAocHN5bWJvbF9hbGxvY2F0aW9uX2xpc3QpOiBQc3ltYm9sIGxpc3RzIG5vdyBkeW5hbWljYWxseQorCWdyb3duIGFycmF5cyBvZiBwb2ludGVycy4KKwkoQUREX1BTWU1CT0xfVlRfVE9fTElTVCk6IEluaXRpYWxpemUgbmV3IHN5bWJvbCB1c2luZyB0aGUgcHN5bWJvbAorCWJjYWNoZS4KKwkqIHN5bW1pc2MuYyAocHJpbnRfcGFydGlhbF9zeW1ib2xzKTogTm93IHRha2VzIHBvaW50ZXIgdG8gcG9pbnRlcgorCXRvIHBhcnRpYWwgc3ltYm9sLgorCShwcmludF9zeW1ib2xfYmNhY2hlX3N0YXRpc3RpY3MpOiBOZXcgZnVuY3Rpb24gdG8gcHJpbnQgcGVyIG9iamZpbGUKKyAJYmNhY2hlIHN0YXRpc3RpY3MuCisJKHByaW50X3BhcnRpYWxfc3ltYm9sLCBwcmludF9wYXJ0aWFsX3N5bWJvbHMsCisgCW1haW50ZW5hbmNlX2NoZWNrX3N5bXRhYnMsIGV4dGVuZF9wc3ltYm9sX2xpc3QpOgorIAlBY2NvdW50IGZvciBjaGFuZ2UgdG8gcG9pbnRlciB0byBwb2ludGVyIHRvIHBhcnRpYWwgc3ltYm9sLgorCSogc3ltdGFiLmMgKGZpbmRfcGNfcHN5bWJvbCwgbG9va3VwX3BhcnRpYWxfc3ltYm9sLCBkZWNvZGVfbGluZV8yLAorCW1ha2Vfc3ltYm9sX2NvbXBsZXRpb25fbGlzdCk6IAorIAlBY2NvdW50IGZvciBjaGFuZ2UgdG8gcG9pbnRlciB0byBwb2ludGVyIHRvIHBhcnRpYWwgc3ltYm9sLgorCSogc3ltdGFiLmggKGJjYWNoZS5oKTogSW5jbHVkZS4KKwkqIHhjb2ZmcmVhZC5jICh4Y29mZl9zdGFydF9wc3ltdGFiKTogTWFrZSBnbG9iYWxfc3ltcyAmIHN0YXRpY19zeW1zCisgCXR5cGUgInBhcnRpYWxfc3ltYm9sICoqIi4KKworRnJpIEZlYiAxNiAxMDowMjozNCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZHdhcmZyZWFkLmMgKGZyZWVfdXR5cGVzKTogTmV3IGZ1bmN0aW9uLgorCShyZWFkX2ZpbGVfc2NvcGUpOiBDYWxsIGZyZWVfdXR5cGVzIGFzIGNsZWFudXAsCXJhdGhlciB0aGFuIGp1c3QKKyAJZnJlZWluZyB0aGUgdXR5cGVzIHBvaW50ZXIuCisKK1RodSBGZWIgMTUgMjE6NDA6NTIgMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBkZW1hbmdsZS5jIChpc19jcGx1c19tYXJrZXIpOiAgTmV3IGZ1bmN0aW9uLCBjaGVja3MgaWYgYQorCWNoYXJhY3RlciBpcyBvbmUgb2YgdGhlIGNvbW1vbmx5IHVzZWQgQysrIG1hcmtlciBjaGFyYWN0ZXJzLgorCSogZGVmcy5oIChpc19jcGx1c19tYXJrZXIpOiAgQWRkIHByb3RvdHlwZS4KKwkqIGMtdHlwZXByaW50LmMgKGNfdHlwZV9wcmludF9iYXNlKSwgY2gtbGFuZy5jIChjaGlsbF9kZW1hbmdsZSksCisJY3AtdmFscHJpbnQuYyAoY3BfcHJpbnRfY2xhc3NfbWV0aG9kKSwgbWRlYnVncmVhZC5jIChwYXJzZV9zeW1ib2wpLAorCXN0YWJzcmVhZC5jIChkZWZpbmVfc3ltYm9sLCByZWFkX21lbWJlcl9mdW5jdGlvbnMsIHJlYWRfc3RydWN0X2ZpZWxkcyksCisJc3ltdGFiLmggKE9QTkFNRV9QUkVGSVhfUCwgVlRCTF9QUkVGSVhfUCwgREVTVFJVQ1RPUl9QUkVGSVhfUCksCisJdmFsdWVzLmMgKHZiX21hdGNoKTogIFVzZSBpc19jcGx1c19tYXJrZXIgaW5zdGVhZCBvZiBjb21wYXJpc29uCisJd2l0aCBDUExVU19NQVJLRVIuCisKK1RodSBGZWIgMTUgMTg6MDg6MTMgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHN5bWZpbGUuaCAoSU5MSU5FX0FERF9QU1lNQk9MKTogRGVmYXVsdCB0aGlzIHRvIDAgYW5kIHBvc3NpYmx5CisJZGVsZXRlIGVudGlyZWx5IHNvbWVkYXkuCisKK1RodSBGZWIgMTUgMTU6MjU6MzQgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBtcHctbWFrZS5zZWQ6IEVkaXQgb3V0IG1ha2VmaWxlIHJlYnVpbGQgcnVsZS4KKwkoaG9zdF9hbGlhcywgdGFyZ2V0X2FsaWFzKTogQ29tbWVudCBvdXQgaW5zdGVhZCBvZiBkZWxldGluZy4KKwkoQExJQlNAKTogRWRpdCBvdXQgcmVmZXJlbmNlcy4KKworVHVlIEZlYiAxMyAyMjo1Njo0NiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogc3ltZmlsZS5jIChhZGRfcHN5bWJvbF90b19saXN0LCBhZGRfcHN5bWJvbF9hZGRyX3RvX2xpc3QpOgorIAlVc2Ugbl9wc3ltcyBpbiBPQkpTVEFULCBub3QgcHN5bXMuCisKK01vbiBGZWIgMTIgMTU6NTk6MzEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoc3BhcmNsZXQtKi1hb3V0Kik6IE5ldyBjb25maWcuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitNb24gRmViIDEyIDE0OjE3OjUyIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBzb21zb2xpYi5jIChzb21fc29saWJfYWRkKTogVXNlIHhtYWxsb2MgcmF0aGVyIHRoYW4gYmFyZQorCXVuY2hlY2tlZCBjYWxsIHRvIG1hbGxvYy4KKwkqIHJlbW90ZS1taXBzLmMgKHBtb25fbG9hZF9mYXN0KTogZGl0dG8uCisJKiByZW1vdGUtbW0uYyAobW1fb3Blbik6IGRpdHRvLgorCSogaHByZWFkLmMgKGhwcmVhZF9sb29rdXBfdHlwZSk6IGRpdHRvLgorCSogcmVtb3RlLWFkYXB0LmMgKGFkYXB0X29wZW4pOiBkaXR0by4KKworTW9uIEZlYiAxMiAxMzoxMTozMiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZi1sYW5nLmMgKGFsbG9jYXRlX3NhdmVkX2JmX25vZGUsIGFsbG9jYXRlX3NhdmVkX2Z1bmN0aW9uX25vZGUsCisJYWxsb2NhdGVfc2F2ZWRfZjc3X2NvbW1vbl9ub2RlLCBhbGxvY2F0ZV9jb21tb25fZW50cnlfbm9kZSwKKwlhZGRfY29tbW9uX2Jsb2NrKTogVXNlIHhtYWxsb2MgcmF0aGVyIHRoYW4gbWFsbG9jLCBzb21lIG9mIHdoaWNoCisJd2VyZSB1bmNoZWNrZWQuCisJKiBnbnUtcmVnZXguYzogQXQgc2FtZSBwb2ludCBhcyBvdGhlciBnZGIgc3BlY2lmaWMgY2hhbmdlcworCSN1bmRlZiBtYWxsb2MgYW5kIHRoZW4gI2RlZmluZSBpdCB0byB4bWFsbG9jLgorCSogY2gtZXhwLmMgKGdyb3didWZfYnlfc2l6ZSk6IFVzZSB4bWFsbG9jL3hyZWFsbG9jIHJhdGhlciB0aGFuCisJYmFyZSB1bmNoZWNrZWQgY2FsbHMgdG8gbWFsbG9jL3JlYWxsb2MuCisJKiBzdGFic3JlYWQuYyAoZGJ4X2xvb2t1cF90eXBlKTogVXNlIHhtYWxsb2MgcmF0aGVyIHRoYW4gYmFyZQorIAl1bmNoZWNrZWQgY2FsbCB0byBtYWxsb2MuCisKK1dlZCBGZWIgIDcgMTE6MzE6MjYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogc3ltdGFiLmMgKGdkYl9tYW5nbGVfbmFtZSk6ICBDaGFuZ2Ugb3BuYW1lIHZhciB0byBiZSBjb25zdCB0bworCW1hdGNoIHJldHVybiB2YWwgb2YgY3BsdXNfbWFuZ2xlX25hbWUuCisJKiBpOTYwLXRkZXAuYzogIENoYW5nZSBhcmcgdHlwZXMgb2YgbmV4dF9pbnNuIHRvIG1hdGNoIGNhbGxlcnMuCisKK1dlZCBGZWIgIDcgMDc6MzQ6MjQgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9pMzg2L2xpbnV4Lm1oIChYTV9DTElCUywgR0RCU0VSVkVSX0xJQlMpOiAgUmVtb3ZlLiAgVGhlc2UKKwlhcHBhcmVudGx5IGFyZW4ndCBuZWVkZWQgaW4gYW55IHJlYXNvbmFibHkgcmVjZW50IHZlcnNpb24gb2YKKwlsaW51eC4KKworVHVlIEZlYiAgNiAyMTozNzowMyAxOTk2ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogc3RhYnNyZWFkLmMgKHJlYWRfcmFuZ2VfdHlwZSk6ICBJZiAhc2VsZi1zdWJyYW5nZSBhbmQgbGFuZ3VhZ2UKKwlpcyBDaGlsbCwgYXNzdW1lIGEgdHJ1ZSByYW5nZS4gIElmIGEgdHJ1ZV9yYW5nZSBpcyBhIHN1Yl9zdWJyYW5nZSwKKwl1c2UgYnVpbHRpbl90eXBlX2ludCBmb3IgaW5kZXhfdHlwZS4KKworVHVlIEZlYiAgNiAxODozODo1MSAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAc2xhdmUuY3lnbnVzLmNvbT4KKworCSogbmluZHktc2hhcmUvbmluZHkuYyAoc2F5KTogVXNlIHN0ZGFyZy5oIG1hY3JvcyB3aGVuIGNvbXBpbGluZworICAgICAgICB3aXRoIGFuIEFOU0kgY29tcGlsZXIuCisKK01vbiBGZWIgIDUgMTg6MjQ6MjggMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCUZyb20gTWljaGFlbF9TbnlkZXJATmVYVC5DT00gKE1pY2hhZWwgU255ZGVyKToKKwkqIHZhbG9wcy5jICh2YWx1ZV9hcmdfY29lcmNlKTogQ29lcmNlIGZsb2F0IHRvIGRvdWJsZSwgdW5sZXNzIHRoZQorIAlmdW5jdGlvbiBwcm90b3R5cGUgc3BlY2lmaWVzIGZsb2F0LgorCQorTW9uIEZlYiAgNSAwOTo1MTo1NSAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZS5jeWdudXMuY29tPgorCisJKiBsYW5ndWFnZS5jIChzZXRfbGFuZ3VhZ2VfY29tbWFuZCk6IFVzZSBsYW5ndWFnZXMgdGFibGUgd2hlbgorCXByaW50aW5nIGF2YWlsYWJsZSBsYW5ndWFnZXMuCisKK1NhdCBGZWIgIDMgMTI6MjI6MDUgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwlGaXggcHJvYmxlbXMgcmVwb3J0ZWQgYnkgSGFucyBWZXJrdWlsIChoYW5zQHd5c3QuaG9iYnkubmwpOgorCSogY29tbWFuZC5jIChhZGRfY21kKTogIEFkZCBtaXNzaW5nIGluaXRpYWxpemF0aW9uIGZvciBlbnVtcyBtZW1iZXIuCisJUmVvcmRlciBtZW1iZXJzIHRvIG1hdGNoIHN0cnVjdHVyZSBkZWNsYXJhdGlvbiB0byBtYWtlIGl0IGVhc2llciB0bworCXRlbGwgd2hlbiBvbmUgaXMgbWlzc2luZy4KKwkqIGV4ZWMuYyAoZXhlY19maWxlX2NvbW1hbmQpOiBGaXggcHJvYmxlbSB3aGVyZSBmaWxlbmFtZSBpbiBtYWxsb2MnZAorIAltZW1vcnkgaXMgcmVmZXJlbmNlZCBhZnRlciBiZWluZyBmcmVlZC4KKworU2F0IEZlYiAgMyAwMzoyNjoyMSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGR3YXJmcmVhZC5jIChyZWFkX2Z1bmNfc2NvcGUpOiAgQXZvaWQgR0RCIGNvcmUgZHVtcHMgaWYKKwlBVF9uYW1lIHRhZyBpcyBtaXNzaW5nLgorCisJKiBwcm9jZnMuYyAocHJvY2ZzX3N0b3BwZWRfYnlfd2F0Y2hwb2ludCk6ICBGaXggbG9naWMgd2hlbgorCUZMVFdBVENIIGFuZCBGTFRLV0FUQ0ggYXJlIGRlZmluZWQuCisKKwkqIHJlbW90ZS5jIChyZW1vdGVfcmVhZF9ieXRlcyk6ICBBZHZhbmNlIG1lbWFkZHIgZm9yIHRyYW5zZmVycywKKwlyZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIGZvciBwYXJ0aWFsIHJlYWRzLgorCisJKiB0b3AuYyAoaW5pdF9zaWduYWxzKTogIFJlc2V0IFNJR1RSQVAgdG8gU0lHX0RGTC4KKworRnJpIEZlYiAgMiAxMzo0MDo1MCAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiB3aW4zMi1uYXQuYyAobWFwcGluZ3MpOiBBZGQgcHBjIHJlZ2lzdGVycy4KKwkoY2hpbGRfcmVzdW1lKTogVHVybiBvZmYgc3RlcCBmb3IgcHBjLgorCitUaHUgRmViICAxIDEwOjI5OjMxIDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9wb3dlcnBjLyhjeWd3aW4zMi5taCwgY3lnd2luMzIubXQsIHRtLWN5Z3dpbjMyLmgsCisJeG0tY3lnd2luMzIuaCk6IE5ldy4KKwkqIGNvbmZpZy9pMzg2Lygqd2luMzIqKTogQmVjb21lcyAqY3lnd2luMzIqLgorCSogY29uZmlndXJlLmluIChpWzM0NTZdODYtKi13aW4zMiopOiBCZWNvbWVzIGlbMzQ1Nl04Ni0qLWN5Z3dpbjMyLgorCShwb3dlcnBjbGUtKi1jeWd3aW4zMik6IE5ldy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIHdpbjMyLW5hdC5jICAoY2hpbGRfY3JlYXRlX2luZmVyaW9yKTogQ2FsbCBDcmVhdGVQcm9jZXNzCisJd2l0aCB0aGUgcmlnaHQgcHJvZ3JhbSBhcmcuCisKK1RodSBGZWIgIDEgMTE6MDE6MTAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvcGEvdG0taHBwYS5oIChTT0ZUX0ZMT0FUKTogUHJvdmlkZSBhIGRlZmF1bHQgZGVmaW5pdGlvbi4KKworV2VkIEphbiAzMSAxOTowMToyOCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogc2VyaWFsLmM6IENoYW5nZSBmcHV0Yy9mcHV0cy9mcHJpbnRmIHRvIF91bmZpbHRlcmVkIGZvcm1zLgorCitXZWQgSmFuIDMxIDE4OjM2OjI3IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3NwYXJjL3htLXN1bjRvczQuaCAoSEFWRV9URVJNSU9TKTogUmVtb3ZlLgorCisJKiBjb25maWcvc3BhcmMveG0tc3BhcmMuaCAoSEFWRV9XQUlUX1NUUlVDVCk6IFJlbW92ZSwgbmV2ZXIgdXNlZC4KKworCSogY29uZmlnL2kzODYvbm0taTM4Nm1hY2guaCAoQ0hJTERfUFJFUEFSRV9UT19TVE9SRSk6IE1vdmUgdG8KKwloZXJlIGZyb20gY29uZmlnL2kzODYveG0taTM4Nm1hY2guaCwgZml4IG5hbWUuCisJKiBjb25maWcvaTM4Ni9ubS1zdW4zODYuaDogRGl0dG8sIGZyb20gY29uZmlnL2kzODYveG0tc3VuMzg2LmguCisJKiBjb25maWcvaTM4Ni9ubS1wdHg0LmggKENISUxEX1BSRVBBUkVfVE9fU1RPUkUpOiBNb3ZlIHRvCisJaGVyZSBmcm9tIGNvbmZpZy9pMzg2L3htLXB0eDQuaC4KKwkqIGNvbmZpZy9pMzg2L25tLXB0eDQuaDogRGl0dG8sCWZyb20gY29uZmlnL2kzODYveG0tcHR4LmguCisJKiBjb25maWcvaTM4Ni9ubS1zeW1tZXRyeS5oOiBEaXR0bywgZnJvbSBjb25maWcvaTM4Ni94bS1zeW1tZXRyeS5oLgorCSogY29uZmlnL202OGsvbm0tc3VuMy5oOiBEaXR0bywgZnJvbSBjb25maWcvbTY4ay94bS1zdW4zLmguCisJKiBjb25maWcvc3BhcmMvbm0tbmJzZC5oOiBEaXR0bywgZnJvbSBjb25maWcvc3BhcmMveG0tbmJzZC5oLgorCSogY29uZmlnL3NwYXJjL25tLXN1bjRvczQ6IERpdHRvLCBmcm9tIGNvbmZpZy9zcGFyYy94bS1zcGFyYy5oLgorCisJKiBjb25maWcvc3BhcmMvbm0tc3VuNHNvbDIuaDogTmV3IGZpbGUsIHJlbmFtZWQgZnJvbSBubS1zeXN2NC5oLgorCShQUlNWQUREUl9CUk9LRU4pOiBNb3ZlIGhlcmUgZnJvbSB4bS1zdW40c29sMi5oLgorCSogY29uZmlnL3NwYXJjL3N1bjRzb2wyLm1oIChOQVRfRklMRSk6IFVwZGF0ZS4KKworV2VkIEphbiAzMSAxNzoyMDoyNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9wYS90bS1ocHBhLmggKEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKTogSGFuZGxlIHNvZnR3YXJlCisJZmxvYXRpbmcgcG9pbnQgY29ycmVjdGx5LgorCShTVE9SRV9SRVRVUk5fVkFMVUUpOiBMaWtld2lzZS4KKwkqIGNvbmZpZy9wYS90bS1wcm8uaCAoU09GVF9GTE9BVCk6IGRlZmluZS4KKworV2VkIEphbiAzMSAxMzozNDo1MiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2kzODYveG0tbGludXguaCAoTU1BUF9CQVNFX0FERFJFU1MsIE1NQVBfSU5DUkVNRU5UKTogCisJRGVmaW5lIHRvIHdoYXQgc2hvdWxkIGJlIHJlYXNvbmFibGUgdmFsdWVzLiAgSG93ZXZlciwgYXBwYXJlbnRseQorCWEgYnVnIGluIGxpbnV4IG1tYXAgcHJldmVudHMgbWFwcGVkIHN5bWJvbCB0YWJsZXMgZnJvbSB3b3JraW5nLgorCitUdWUgSmFuIDMwIDE4OjI2OjE5IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBkZWZzLmggKGVycm5vLmg+OiAgTW92ZSAjaW5jbHVkZSBjbG9zZXIgdG8gaGVhZCBvZiBmaWxlIHRvIHNvbHZlCisJb2JzY3VyZSBwcm9ibGVtIHdpdGggc3lzdGVtcyB0aGF0IGRlY2xhcmUgcGVycm9yIHdpdGggY29uc3QgYXJnLCBpbgorIAlib3RoIGVycm5vLmggYW5kIHN0ZGlvLmgsIGFuZCBjb25zdCBpcyBkZWZpbmVkIGF3YXkgYnkgaW50ZXJ2ZW5pbmcKKyAJbG9jYWwgaW5jbHVkZS4KKworVHVlIEphbiAzMCAxNTo0MToxMCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCUZyb20gSm9uIFJlZXZlcyA8cmVldmVzQHprMy5kZWMuY29tPjoKKwkqIGkzODYtc3R1Yi5jIChnZXRwYWNrZXQpOiBDaGFuZ2UgZnByaW50ZiBzdHJlYW0gZnJvbSAiZ2RiIiB0byBzdGRlcnIuCisJKG1lbV9mYXVsdF9yb3V0aW5lKTogRml4IG1pc3BsYWNlZCB2b2xhdGlsZSB0eXBlIHF1YWxpZmllciBpbiBkZWNsLgorCitNb24gSmFuIDI5IDE5OjA1OjU4IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogTWFrZSBhbGwtZG9jOyBkaXN0c3R1ZmYgdGFyZ2V0IGRvZXMgbm90CisJZXhpc3QgaW4gZG9jL01ha2VmaWxlLmluLgorCitNb24gSmFuIDI5IDE4OjQ0OjU3IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL204OGsveG0tY3h1eC5oIChCUF9ISVRfQ09VTlQpOiBSZW1vdmUsIG5ldmVyIHVzZWQuCisKK01vbiBKYW4gMjkgMDA6MTA6MzUgMTk5NiAgV2lsZnJpZWQgTW9zZXIgIDxtb3NlckBydGwuY3lnbnVzLmNvbT4KKworCSogY2gtdmFscHJpbnQuYyAoY2FsY3VsYXRlX2FycmF5X2xlbmd0aCk6IE5ldyBmdW5jdGlvbiB0bworIAlkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiBhbiBhcnJheSB0eXBlLgorCShjaGlsbF92YWxfcHJpbnQgKGNhc2UgVFlQRV9DT0RFX0FSUkFZKSk6IElmIHRoZSBsZW5ndGggb2YgYW4KKwlhcnJheSB0eXBlIGlzIHplcm8sIGNhbGwgY2FsY3VsYXRlX2FycmF5X2xlbmd0aC4KKworCSogZ2RidHlwZXMuYyAoZ2V0X2Rpc2NyZXRlX2JvdW5kcyAoY2FzZSBUWVBFX0NPREVfRU5VTSkpOiBUaGUKKyAJdmFsdWVzIG1heSBub3QgYmUgc29ydGVkLiBTY2FuIGFsbCBlbnRyaWVzIGFuZCBzZXQgdGhlIHJlYWwgbG93ZXIKKyAJYW5kIHVwcGVyIGJvdW5kLgorCitTdW4gSmFuIDI4IDE1OjUwOjQyIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWcveG0tbGludXguaDogTW92ZSBpbmNsdWRlIG9mIHNvbGliLmggYW5kICNkZWZpbmUgb2YKKwlTVlI0X1NIQVJFRF9MSUJTIGZyb20gaGVyZSAuLi4KKwkqIGNvbmZpZy9ubS1saW51eC5oOiAuLi50byBoZXJlLgorCitTYXQgSmFuIDI3IDEwOjM0OjA1IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKEFDX0NIRUNLX0hFQURFUlMpOiBDaGVjayBmb3Igc3lzL3Byb2Nmcy5oLgorCUFsc28gY2hlY2sgZm9yIGdyZWdzZXRfdCBhbmQgZnByZWdzZXRfdCB0eXBlcy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIGNvcmUtcmVnc2V0LmMgKHN5cy9wcm9jZnMuaCk6IE9ubHkgaW5jbHVkZSBpZiBIQVZFX1NZU19QUk9DRlNfSAorIAlpcyBkZWZpbmVkLgorCShmZXRjaF9jb3JlX3JlZ2lzdGVycyk6IFR1cm4gaW50byBzdHViIHVubGVzcyBib3RoIEhBVkVfR1JFR1NFVF9UCisgCWFuZCBIQVZFX0ZQUkVHU0VUX1QgYXJlIGRlZmluZWQuICBUaGVzZSBjaGFuZ2VzIGFsbG93IHN5c3RlbXMKKyAJbGlrZSBsaW51eCB0aGF0IGFyZSBtaWdyYXRpbmcgdG8gL3Byb2Mgc3VwcG9ydCB0byB1c2UgYSBzaW5nbGUKKyAJY29uZmlndXJhdGlvbiBmb3IgYm90aCBuZXcgYW5kIG9sZCB2ZXJzaW9ucy4KKworCSogY29uZmlnL2kzODYvbGludXgubXQ6IE5vdGUgdGhhdCB0aGlzIGlzIG5vdyBmb3IgYm90aCBhLm91dCBhbmQKKwlFTEYgc3lzdGVtcy4KKwkqIGNvbmZpZy9pMzg2L2xpbnV4Lm1oIChOQVRERVBGSUxFUyk6IEFkZCBzb2xpYi5vLCBjb3JlLXJlZ3NldC5vLAorCWkzODZ2NC1uYXQubworCSogY29uZmlnL2kzODYvdG0tbGludXguaCAodG0tc3lzdjQuaCk6IEluY2x1ZGUuCisJKiBjb25maWcvaTM4Ni94bS1saW51eC5oIChzb2xpYi5oKTogSW5jbHVkZQorCShTVlI0X1NIQVJFRF9MSUJTKTogRGVmaW5lLgorCSogaTM4NnY0LW5hdC5jOiBPbmx5IGNvbXBpbGUgaWYgSEFWRV9TWVNfUFJPQ0ZTX0ggaXMgZGVmaW5lZC4KKwkoc3VwcGx5X2dyZWdzZXQsIGZpbGxfZ3JlZ3NldCk6IENvbXBpbGUgaWYgSEFWRV9HUkVHU0VUX1QgZGVmaW5lZC4KKwkoc3VwcGx5X2ZwcmVnc2V0LCBmaWxsX2ZwcmVnc2V0KTogQ29tcGlsZSBpZiBIQVZFX0ZQUkVHU0VUX1QKKyAJZGVmaW5lZC4KKworRnJpIEphbiAyNiAxMzo0ODoxNCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9zcGFyYy94bS1zcGFyYy5oIChORVdfU1VOX0NPUkUpOiBSZW1vdmUsIG5ldmVyIHVzZWQuCisJKiBjb25maWcvaTM4Ni94bS1zdW4zODYuaDogRGl0dG8uCisJKiBjb25maWcvbTY4ay94bS1zdW4yLmgsIGNvbmZpZy9tNjhrL3htLXN1bjMuaDogRGl0dG8uCisKK1RodSBKYW4gMjUgMTY6MDU6NTMgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGUuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKElOU1RBTExFRF9MSUJTLCBDTElCUyk6IEluY2x1ZGUgQExJQlNALgorCitUaHUgSmFuIDI1IDA5OjIyOjE1IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwlGcm9tIEdyZWcgTWNHYXJ5ICA8Z2ttQGdudS5haS5taXQuZWR1PjoKKwkqIGRjYWNoZS5jIChkY2FjaGVfcGVlaywgZGNhY2hlX3Bva2UpOiBBZHZhbmNlIGFkZHIgZm9yCisJbXVsdGktYnl0ZSBJL08uCisKK1RodSBKYW4gMjUgMTM6MDg6NTEgMTk5NiAgRG91ZyBFdmFucyAoZGplQGN5Z251cy5jb20pCisKKwkqIGluZnJ1bi5jIChub3JtYWxfc3RvcCk6IEZpeCB0ZXN0IGZvciBzaGFyZWQgbGlicmFyeSBldmVudC4KKworVGh1IEphbiAyNSAwMzoyNjozOCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChzcGFyYzY0LSotKik6IEFkZCBkZWZhdWx0IGhvc3QgY29uZmlndXJhdGlvbi4KKwkoc3BhcmM2NC0qLXNvbGFyaXMyKik6IEFkZCB0YXJnZXQgY29uZmlndXJhdGlvbi4KKwkoc3BhcmM2NC0qLXNvbGFyaXMyKiBob3N0KTogTGluayBzdGF0aWNhbGx5IGlmIEdDQyB1c2VkLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKwkqIHNwYXJjL3NwNjRzb2wyLm10OiBOZXcgZmlsZS4KKworV2VkIEphbiAyNCAyMjozMTozNyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFJVTlRFU1QpOiBzcmNkaXIgcmVuYW1lZCB0byByb290c3JjLgorCitXZWQgSmFuIDI0IDE1OjQyOjI0IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChsaW50KTogQ2xvc2UgYmFja3F1b3Rlcy4KKworV2VkIEphbiAyNCAxMzoxOToxMCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogTkVXUzogTWFrZSBub3RlIG9mIG5ldyByZWNvcmQgYW5kIHJlcGxheSBmZWF0dXJlIGZvcgorCXJlbW90ZSBkZWJ1ZyBzZXNzaW9ucy4KKwkqIHNlcmlhbC5jIChnZGJjbWQuaCk6IEluY2x1ZGUuCisJKHNlcmlhbF9sb2dmaWxlLCBzZXJpYWxfbG9nZnAsIHNlcmlhbF9yZWFkaW5nLCBzZXJpYWxfd3JpdGluZyk6CisgCURlZmluZSBoZXJlLCBmb3IgcmVtb3RlIGRlYnVnIHNlc3Npb24gbG9nZ2luZy4KKwkoc2VyaWFsX2xvZ19jb21tYW5kLCBzZXJpYWxfbG9nY2hhciwgc2VyaWFsX3dyaXRlLCBzZXJpYWxfcmVhZGNoYXIpOgorCU5ldyBmdW5jdGlvbnMgZm9yIHJlbW90ZSBkZWJ1ZyBzZXNzaW9uIGxvZ2dpbmcuCisJKHNlcmlhbF9vcGVuKTogT3BlbiByZW1vdGUgZGVidWcgc2Vzc2lvbiBsb2cgZmlsZSB3aGVuIG5lZWRlZC4KKwkoc2VyaWFsX2Nsb3NlKTogQ2xvc2UgcmVtb3RlIGRlYnVnIHNlc3Npb24gbG9nIGZpbGUgd2hlbiBuZWVkZWQuCisJKF9pbml0aWFsaXplX3NlcmlhbCk6IEFkZCBzZXQvc2hvdyBjb21tYW5kcyBmb3IgbmFtZSBvZiByZW1vdGUKKwlkZWJ1ZyBzZXNzaW9uIGxvZyBmaWxlLgorCSogc2VyaWFsLmggKHNlcmlhbF9yZWFkY2hhcik6IERlY2xhcmUKKwkoU0VSSUFMX1JFQURDSEFSKTogQ2FsbCBzZXJpYWxfcmVhZGNoYXIoKS4KKwkoU0VSSUFMX1dSSVRFKTogQ2FsbCBzZXJpYWxfd3JpdGUoKS4KKwkoc2VyaWFsX2Nsb3NlKTogRGVjbGFyZSBhcyBleHRlcm4uCisJKHNlcmlhbF9sb2dmaWxlLCBzZXJpYWxfbG9nZnApOiBEZWNsYXJlLgorCSogdG9wLmMgKGV4ZWN1dGVfY29tbWFuZCk6IERlY2xhcmUgc2VyaWFsX2xvZ2ZwLiAgTG9nIHVzZXIgY29tbWFuZAorCWluIHJlbW90ZSBkZWJ1ZyBzZXNzaW9uIGxvZyBpZiBsb2cgZmlsZSBpcyBvcGVuLgorCSogcmVtb3RlLWFycmF5LmMgKGFycmF5X3dhaXQpOiAjaWZkZWYgb3V0IGVjaG8gdG8gZ2RiX3N0ZG91dC4KKwkoYXJyYXlfcmVhZF9pbmZlcmlvcl9tZW1vcnkpOiBSZXdyaXRlIHRvIGZpeCBtZW1vcnkgb3ZlcndyaXRlIGJ1Zy4KKwkqIHJlbW90ZS1hcnJheS5jIChTUkVDX1NJWkUpOiBSZW1vdmUsIGR1cGxpY2F0ZXMgZGVmaW5lIGluCisJbW9uaXRvci5oLgorCSogcmVtb3RlLWFycmF5LmMgKGhleGNoYXJzLCBoZXgybWVtKTogIFJlbW92ZSwgdW51c2VkLgorCSogZ2Ric2VydmVyL2xvdy1saW51eC5jIChzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMpOiBSZW1vdmUKKwl1bm5lY2Vzc2FyeSBleHRlcm4gZGVjbGFyYXRpb24gb2YgcmVnaXN0ZXJzW10uCisJKiBnZGJzZXJ2ZXIvTWFrZWZpbGUuaW4gKGFsbCk6IEFkZCBnZGJyZXBsYXkuCisJKiBnZGJzZXJ2ZXIvZ2RicmVwbGF5LmM6IE5ldyBmaWxlLgorCSogZ2Ric2VydmVyL1JFQURNRTogR2l2ZSBleGFtcGxlIG9mIHJlY29yZGluZyBhIHJlbW90ZQorCWRlYnVnIHNlc3Npb24gd2l0aCBnZGIgYW5kIHRoZW4gcmVwbGF5aW5nIGl0IHdpdGggZ2RicmVwbGF5LgorCQorVHVlIEphbiAyMyAxODowMjozNSAxOTk2ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogc3RhYnNyZWFkLmMgKHJzNjAwMF9idWlsdGluX3R5cGUpOiAgTWFrZSBib29sIHR5cGUgdW5zaWduZWQuCisJKHJlYWRfb25lX3N0cnVjdF9maWVsZCk6ICBTdXBwb3J0IGJvb2xlYW4gYml0ZmllbGRzLgorCSogYy12YWxwcmludC5jIChjX3ZhbF9wcmludCk6IFByaW50IGJvb2xlYW5zIHByb3Blcmx5LgorCitUdWUgSmFuIDIzIDE4OjU0OjA5IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLXZ4c3BhcmMuYyAodnhfY29udmVydF90b192aXJ0dWFsLCB2eF9jb252ZXJ0X2Zyb21fdmlydHVhbCk6CisJUmVtb3ZlLCBuZXZlciB1c2VkLgorCSogY29uZmlnL3NwYXJjL3Z4c3BhcmMubXQgKFRERVBGSUxFUyk6IEFkZCByZW1vdGUtdnhzcGFyYy5vLgorCitUdWUgSmFuIDIzIDE0OjM2OjA1IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBjaC1leHAuYyAocGFyc2VfdHVwbGUpOiAgRXJyb3IgaWYgaW52YWxpZCBtb2RlLgorCisJKiB2YWx1ZS5oIChDT0VSQ0VfQVJSQVkpOiAgRG9uJ3QgY29lcmNlIGVudW1zLgorCShDT0VSQ0VfRU5VTSk6ICBEb24ndCBDT0VSQ0VfUkVGLgorCShDT0VSQ0VfTlVNQkVSKTogIE5ldyBtYWNybyAoc2FtZSBhcyBDT0VSQ0VfQVJSQVkgdGhlbiBDT0VSQ0VfRU5VTSkuCisJKiB2YWxvcHMuYyAodmFsdWVfYXNzaWduKTogIE9ubHkgZG8gQ09FUkNFX0FSUkFZIGlmIGludGVybmFsdmFyIChsZXQKKyAJdmFsdWVfY2FzdCBoYW5kbGUgaXQgb3RoZXJ3aXNlKTsgZG8gKm5vdCogQ09FUkNFX0VOVU0gZWl0aGVyIHdheS4KKwkqIHZhbGFyaXRoLmM6ICBVc2UgQ09FUkNFX05VTUJFUiBpbnN0ZWFkIG9kIENPRVJFQ19BUlJBWS4KKwlBZGQgQ09FUkNFX1JFRiBiZWZvcmUgQ09FUkNFX0VOVU0uCisJKiB2YWx1ZXMuYyAodmFsdWVfYXNfbG9uZyk6ICBTaW1wbGlmeS4KKworCSogdmFsb3BzLmMgKHZhbHVlX2FycmF5KTogIENyZWF0ZSBpbnRlcm5hbHZhciBpZiAhY19zdHlsZV9hcnJheXMuCisKKwkqIGxhbmd1YWdlLmMgKGxhbmdfYm9vbF90eXBlKTogIEFkZCBGb3J0cmFuIHN1cHBvcnQuCisJKiBldmFsLmMgKE9QX0JPT0wpOiAgVXNlIExBX0JPT0xfVFlQRS4KKworVHVlIEphbiAyMyAxMzowODoyNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHN5bWZpbGUuYyAoYXV0b19zb2xpYl9hZGQpOiBSZW5hbWVkIGZyb20gYXV0b19zb2xpYl9hZGRfYXRfc3RhcnR1cC4KKwlBbGwgcmVmZXJlbmNlcyBjaGFuZ2VkLgorCSogYnJlYWtwb2ludC5jIChicHN0YXRfd2hhdCk6IEFkZCBzaGxpYl9ldmVudCB0byB0aGUgY2xhc3MgdHlwZXMuCisJVXBkYXRlIHN0YXRlIHRhYmxlLiAgUmVmb3JtYXQgc28gdGhhdCBpdCdzIHN0aWxsIHJlYWRhYmxlLgorCVdoZW4gd2UgaGl0IHRoZSBzaGxpYl9ldmVudCBicmVha3BvaW50LCBzZXQgdGhlIGNhbHNzIG9mIHNobGliX2V2ZW50LgorCShicmVha3BvaW50XzEpOiBBZGQgInNobGliIGV2ZW50cyIgYXMgYSBicmVha3BvaW50IHR5cGUuCisJUHJpbnQgdGhlIHNobGliX2V2ZW50IGJyZWFrcG9pbnQgbGlrZSBvdGhlciBicmVha3BvaW50cy4KKwkoY3JlYXRlX3NvbGliX2V2ZW50X2JyZWFrcG9pbnQpOiBOZXcgZnVuY3Rpb24uCisJKGJyZWFrcG9pbnRfcmVfc2V0X29uZSk6IEhhbmRsZSBzb2xpYl9ldmVudCBicmVha3BvaW50cy4KKwkqIGJyZWFrcG9pbnQuaCAoZW51bSBieXR5cGUpOiBBZGQgYnBfc2hsaWJfZXZlbnQgYnJlYWtwb2ludCB0eXBlLgorCShlbnVtIGJwc3RhdF93aGF0X21haW5fYWN0aW9uKTogQWRkIEJQU1RBVF9XSEFUX0NIRUNLX1NITElCUworCWFjdGlvbi4KKwkoY3JlYXRlX3NvbGliX2V2ZW50X2JyZWFrcG9pbnQpOiBEZWNsYXJlLgorCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogSGFuZGxlIENIRUNLX1NITElCUyBicHN0YXQuCisJKG5vcm1hbF9zdG9wKTogSW5mb3JtIHRoZSB1c2VyIHdoZW4gdGhlIGluZmVyaW9yIHN0b3BlZCBkdWUKKwl0byBhIHNoYXJlZCBsaWJyYXJ5IGV2ZW50LgorCShfaW5pdGlhbGl6ZV9pbmZydW4pOiBBZGQgbmV3IHNldC9zaG93IHZhcmlhYmxlICJzdG9wLW9uLXNvbGliLWV2ZW50cyIKKwl0byBjb250cm9sIHdoZXRoZXIgb3Igbm90IGdkYiBjb250aW51ZXMgdGhlIGluZmVyaW9yIG9yIHN0b3BzIGl0IHdoZW4KKwlhIHNoYXJlZCBsaWJyYXJ5IGV2ZW50IG9jY3Vycy4KKwkqIG1pbnN5bXMuYyAobG9va3VwX21pbmltYWxfc3ltYm9sX3NvbGliX3RyYW1wb2xpbmUpOiBOZXcgZnVuY3Rpb24uCisJKiBzb21zb2xpYi5jIChUT0RPIGxpc3QpOiBVcGRhdGUuCisJKHNvbV9zb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vayk6IEFycmFuZ2UgZm9yIGdkYiB0byBiZSBub3RpZmllZAorCXdoZW4gc2lnbmlmaWNhbnQgc2hhcmVkIGxpYnJhcnkgZXZlbnRzIG9jY3VyLgorCSogaHBwYS10ZGVwLmMgKGZpbmRfdW53aW5kX2VudHJ5KTogTm8gbG9uZ2VyIHN0YXRpYy4KKworVHVlIEphbiAyMyAwOTowMDo0OCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogcHJpbnRjbWQuYyAocHJpbnRfaW5zbik6IFBhc3MgZnByaW50Zl91bmZpbHRlcmVkIHRvCisgCUlOSVRfRElTQVNTRU1CTEVfSU5GTy4KKworTW9uIEphbiAyMiAxNjo1OTo0MCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS5jIChyZW1vdGVicmVhayk6IE5ldyBHREIgdmFyaWFibGUuCisJKHJlbW90ZV9icmVhayk6IE5ldyBnbG9iYWwuCisJKHJlbW90ZV9pbnRlcnJ1cHQpOiBTZW5kIGEgYnJlYWsgaW5zdGVhZCBvZiBeQyBpZiByZW1vdGVfYnJlYWsuCisJKiBORVdTOiBEZXNjcmliZSB0aGUgbmV3IHZhcmlhYmxlLgorCitNb24gSmFuIDIyIDE2OjI0OjExIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBzcGFyYy10ZGVwLmMgKF9pbml0aWFsaXplX3NwYXJjX3RkZXApOiBBbHdheXMgdXNlIHByaW50X2luc25fc3BhcmMuCisKK0ZyaSBKYW4gMTkgMDc6MTk6MzggMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGhwMzAwdXgtbmF0LmMgKGdldHBhZ2VzaXplKTogUmVtb3ZlIHVudXNlZCBmdW5jdGlvbgorIAlmZXRjaF9jb3JlX3JlZ2lzdGVycy4KKwkoaHAzMDB1eF9jb3JlX2Zucyk6ICBSZW1vdmUsIGlzIHVudXNlZC4KKwkoX2luaXRpYWxpemVfY29yZV9ocDMwMHV4KTogIFJlbW92ZSwgaXMgdW51c2VkLgorCShnZGJjb3JlLmgpOiAgUmVtb3ZlICNpbmNsdWRlLCBubyBsb25nZXIgbmVlZGVkLgorCQorRnJpIEphbiAxOSAwMDo1OTo1MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHJzNjAwMC1uYXQuYyAoZXhlY19vbmVfZHVtbXlfaW5zbik6IFJld29yayB0byBhdm9pZAorCXB0cmFjZSBidWcgaW4gYWl4NC4xLjMgb24gdGhlIHJzNjAwMC4KKworV2VkIEphbiAxNyAxMzoyMjoyNyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1obXMuYyAoaG1zX29wcyk6IEFkZCB2YWx1ZSBmb3IgdG9fdGhyZWFkX2FsaXZlLgorCSogcmVtb3RlLW5pbmR5LmMgKG5pbmR5X29wcyk6IERpdHRvLgorCSogcmVtb3RlLXVkaS5jICh1ZGlfb3BzKTogRGl0dG8uCisKK1R1ZSBKYW4gMTYgMTg6MDA6MzUgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgorCisJKiByZW1vdGUtbWlwcy5jIChwbW9uX29wbiwgcG1vbl93YWl0LCBwbW9uX21ha2ViNjQsIHBtb25femVyb3NldCwKKyAJcG1vbl9jaGVja3NldCwgcG1vbl9tYWtlX2Zhc3RyZWMsIHBtb25fY2hlY2tfYWNrLAorCXBtb25fbG9hZF9mYXN0KTogTmV3IGZ1bmN0aW9ucy4gU3VwcG9ydCBmb3IgdGhlIFBNT04gbW9uaXRvciB3b3JsZC4KKwkoY29tbW9uX29wZW4pOiBOZXcgZnVuY3Rpb24gdG8gbWVyZ2Ugc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1vbml0b3JzLgorCShtaXBzX29wZW4pOiBVc2UgY29tbW9uX29wZW4oKS4KKwkobWlwc19zZW5kX2NvbW1hbmQpOiBOZXcgZnVuY3Rpb24uCisJKG1pcHNfc2VuZF9wYWNrZXQpOiBTY2FuIG91dC1vZi1zZXF1ZW5jZSBwYWNrZXRzLgorCShtaXBzX2VudGVyX2RlYnVnLCBtaXBzX2V4aXRfZGVidWcpOiBOZXcgZnVuY3Rpb25zLgorCShwbW9uX29wcyk6IE5ldyB0YXJnZXQgZGVmaW5pdGlvbiBzdHJ1Y3R1cmUuCisJCitUdWUgSmFuIDE2IDExOjIyOjU4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChDTElCUyk6ICBBZGQgTElCUyB0byBhbGxvdyBsaWJyYXJpZXMgdG8gYmUKKwlzcGVjaWZpZWQgb24gdGhlIG1ha2UgY29tbWFuZCBsaW5lICh2aWEgbWFrZSBMSUJTPXh4eCkuCisKKworRnJpIEphbiAxMiAyMTo0MTo1OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHN5bXRhYi5jIChmaW5kX3BjX3N5bXRhYik6IERvbid0IGxvc2UgaWYgT0JKRl9SRU9SREVSRUQKKwlpcyBzZXQgYnV0IHRoZXJlIGFyZSBubyBwc3ltdGFicy4KKworRnJpIEphbiAxMiAxNTo1NjoxMiAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBkc3JlYy5jIChsb2FkX3NyZWMpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgorCSogbW9uaXRvci5jIChtb25pdG9yX2V4cGVjdCk6IERvbid0IGV4cGVjdCBhIF5DIHRvIGVjaG8uCisJKiBzZXJpYWwuYyAoc2VyaWFsX29wZW4pOiBBZGQgcGFyYWxsZWwgaW50ZXJmYWNlLgorCSogc2gzLXJvbS5jIChwYXJhbGxlbCwgcGFyYWxsZWxfaW5fdXNlKTogTmV3LgorCShzaDNfbG9hZCk6IElmIHBhcmFsbGVsX2luX3VzZSwgZG93bmxvYWQgdGhvdWdoIHRoZQorCXBhcmFsbGVsIHBvcnQuCisJKHNoM19vcGVuKTogT3BlbiBwYXJhbGxlbCBwb3J0IGlmIHNwZWNpZmllZC4KKwkoc2gzX2Nsb3NlKTogTmV3IGZ1bmN0aW9uLgorCShfaW5pdGl0YWxpemVfc2gzKTogQWRkIHNoM19jbG9zZSBob29rIGFuZCBkb2N1bWVudGF0aW9uLgorCSogbW9uaXRvci5jIChtb25pdG9yX2Nsb3NlKTogRXhwb3J0LgorCSogbW9uaXRvci5oIChtb25pdG9yX2Nsb3NlKTogQWRkIHByb3RvdHlwZS4KKworRnJpIEphbiAxMiAxMzoxMTo0MiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwlGcm9tIFdpbGZyaWVkIE1vc2VyIDx3aWxmcmllZC5tb3NlckBhdXQuYWxjYXRlbC5hdD46CisJKiByZW1vdGUuYyAocmVtb3RldGltZW91dCk6IE5ldyBHREIgdmFyaWFibGUsIHVzZSB0byBzZXQgdGhlCisJcmVtb3RlIHRpbWVvdXQgZm9yIHJlYWRpbmcuCisKK0ZyaSBKYW4gMTIgMDc6MTQ6MjcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGx5bngtbmF0LmMsIGlyaXg0LW5hdC5jLCBzcGFyYy1uYXQuYzogSW5jbHVkZSBnZGJjb3JlLmgKKwl0byBnZXQgInN0cnVjdCBjb3JlX2ZucyIgZGVmaW5lZC4KKwkqIE1ha2VmaWxlLmluIChseW54LW5hdC5vLCBpcml4NC1uYXQubywgc3BhcmMtbmF0Lm8pOgorIAlBcmUgZGVwZW5kZW50IHVwb24gZ2RiY29yZV9oLgorCitUaHUgSmFuIDExIDIzOjEzOjI0IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBjeWdudXMuY29tPgorCisJKiBzeW1maWxlLmMgKGRlY3JlbWVudF9yZWFkaW5nX3N5bXRhYik6ICBOZXcgZnVuY3Rpb24uCisJKiBzeW1maWxlLmMsIHN5bXRhYi5oIChjdXJyZW50bHlfcmVhZGluZ19zeW10YWIpOiAgTmV3IHZhcmlhYmxlLgorCSogc3ltZmlsZS5jIChwc3ltdGFiX3RvX3N5bXRhYik6ICBBZGp1c3QgY3VycmVudGx5X3JlYWRpbmdfc3ltdGFiLgorCSogZ2RidHlwZXMuYyAoY2hlY2tfdHlwZWRlZik6ICBEb24ndCBjYWxsIGxvb2t1cF9zeW1ib2wgaWYKKwljdXJyZW50bHlfcmVhZGluZ19zeW10YWIgKHNpbmNlIHRoYXQgY291bGQgaW5maW5pdGVseSByZWN1cnNlKS4KKworVGh1IEphbiAxMSAxNzoyMToyNSAxOTk2ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogc3RhYnNyZWFkLmMgKHJlYWRfc3RydWN0X3R5cGUpOiAgVHJpdmlhbCBzaW1wbGlmaWNhdGlvbi4KKworCSogc3RhYnNyZWFkLmMgKGRlZmluZS1zeW1ib2wpOiAgVXNlIGludmlzaWJsZSByZWZlcmVuY2VzCisJZm9yIFRZUEVfQ09ERV9TRVQgYW5kIFRZUEVfQ09ERV9CSVRTVFJJTkcgdG9vLgorCSogdmFsb3BzLmMgKGNhbGxfZnVuY3Rpb25fYnlfaGFuZCk6ICBMaWtld2lzZS4KKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwX3N0YW5kYXJkKTogIFdoZW4ga25vd24sIHVzZSB0aGUgZm9ybWFsCisJcGFyYW1ldGVyIHR5cGUgYXMgdGhlIGV4cGVjdGVkIHR5cGUgd2hlbiBldmFsdWF0aW5nIGFyZyBleHByZXNzaW9ucy4KKwkqIGNoLWxhbmcuYyAoZXZhbHVhdGVfc3ViZXhwX2NoaWxsKTogIExpa2V3aXNlIChmb3IgTVVMVElfU1VCU0NSSVBUKS4KKworVGh1IEphbiAxMSAxMDowODoxNCAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZS5jeWdudXMuY29tPgorCisJKiBtYWluLmMgKG1haW4pOiBEaXNhYmxlIHdpbmRvdyBpbnRlcmZhY2UgaWYgLS1oZWxwIG9yIC0tdmVyc2lvbgorCXNwZWNpZmllZC4KKworV2VkIEphbiAxMCAxNjowODo0OSAxOTk2ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlOiBSZWNvZ25pemUgcnM2MDAwLSotYWl4NCouCisJKiBjb25maWcvcG93ZXJwYy94bS1haXguaDogUmVkdWNlIHRvIGluY2x1ZGUgInhtLWFpeDQuaCIuCisJKiBjb25maWcvcnM2MDAwL2FpeDQubWggKFhNX0ZJTEUpOiBQb2ludCB0byB4bS1haXg0LmguCisJKiBjb25maWcvcnM2MDAwL3htLWFpeDQuaDogTmV3IGZpbGUuCisJKiBjb25maWcveG0tYWl4NC5oOiBOZXcgZmlsZS4KKworV2VkIEphbiAxMCAxMToyNTozNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCUZyb20gV2lsZnJpZWQgTW9zZXIgPHdpbGZyaWVkLm1vc2VyQGF1dC5hbGNhdGVsLmF0PjoKKwkqIGdkYnNlcnZlci9sb3ctbGludXguYzogTmV3IGZpbGUuCisJKiByZW1vdGUuYyAocmVtb3RlX3JlYWRfYnl0ZXMpOiBGaXggYWJvcnRzIG9uIGxhcmdlciBwYWNrZXRzLgorCisJKiBjb25maWcvaTM4Ni9saW51eC5taCAoR0RCU0VSVkVSX0RFUEZJTEVTLCBHREJTRVJWRVJfTElCUyk6CisJRGVmaW5lLgorCSogc3RhYnNyZWFkLmMgKGRlZmluZV9zeW1ib2wpOiBJZiByZWdpc3RlciB2YWx1ZSBpcyB0b28gbGFyZ2UsCisJdGVsbCB3aGF0IGl0IGlzIGFuZCB3aGF0IG1heCBpcy4KKworVHVlIEphbiAgOSAwOTozMzo1MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGhwcmVhZC5jIChocHJlYWRfYnVpbGRfcHN5bXRhYnMpOiBGaW5pc2ggSmFuIDR0aCAKKwllbnVtIG5hbWVzcGFjZSAtPiBlbnVtX25hbWVzcGFjZSBjaGFuZ2UuCisKK1R1ZSBKYW4gIDkgMDQ6NDQ6NDcgMTk5NiAgV2lsZnJpZWQgTW9zZXIgIDxtb3NlckBydGwuY3lnbnVzLmNvbT4KKworCSogY2gtZXhwLmMgKHBhcnNlX3ByaW12YWwpOiBJbiBjYXNlIEFSUkFZLCBhZGQgbWlzc2luZworCUZPUldBUkRfVE9LRU4gKCkuCisKK01vbiBKYW4gIDggMTM6Mjk6MzQgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiByZW1vdGUtbWlwcy5jIChtaXBzX3JlY2VpdmVfaGVhZGVyKTogUmVjb2duaXplIFwwMTIgaW5zdGVhZAorCW9mIFxuLCBidXQgd3JpdGUgXG4gd2hlbiBwcm9ncmFtIHNlbmRzIGEgXDAxMi4KKwkqIHNlci1tYWMuYyAobWFjX2lucHV0X2J1ZmZlcik6IEluY3JlYXNlIHNpemUgb2YgYnVmZmVyLgorCitNb24gSmFuICA4IDEyOjAwOjQwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaW5mcHRyYWNlLmMgKGluaXRpYWxpemVfaW5mcHRyYWNlKTogTW92ZSBmdW5jdGlvbiBvdXQgb2YKKwkjaWZkZWYgY29uZGl0aW9uYWw7IHB1dCBjb2RlIHdpdGhpbiB0aGUgZnVuY3Rpb24gaW5zaWRlIGFuCisJI2lmZGVmIGNvbmRpdGlvbmFsLgorCisJKiBidWlsZHN5bS5jIChlbmRfc3ltdGFiKTogUmVtb3ZlIHNvcnRfcGVuZGluZyBhbmQgc29ydF9saW5ldmVjCisJYXJndW1lbnRzLiAgU29ydGluZyBpcyBub3cgZGVwZW5kZW50IG9uIE9CSkZfUkVPUkRFUkVELiAgQWxsCisJY2FsbGVycy9yZWZlcmVuY2VzIGNoYW5nZWQuCisJKiBkYnhyZWFkLmMgKHJlYWRfb2ZpbGVfc3ltdGFiKTogQ29ycmVjdGx5IGRldGVybWluZSB2YWx1ZSBmb3IKKwlsYXN0X3NvdXJjZV9zdGFydF9hZGRyIGZvciByZW9yZGVyZWQgZXhlY3V0YWJsZXMuCisJKHByb2Nlc3Nfb25lX3N5bWJvbCk6IEhhbmRsZSBOX0ZVTiB3aXRoIG5vIG5hbWUgYXMgYW4gZW5kIG9mCisJZnVuY3Rpb24gbWFya2VyLgorCSogcGFydGlhbC1zdGFiLmggKGNhc2UgTl9GTiwgTl9URVhUKTogRG9uJ3QgYXNzdW1lIENVUl9TWU1CT0xfVkFMVUUKKwlpcyB0aGUgaGlnaCB0ZXh0IGFkZHJlc3MgZm9yIGEgcHN5bXRhYi4KKwkoY2FzZSBOX1NPKTogTGlrZXdpc2UuCisJKGNhc2UgTl9GVU4pOiBIYW5kbGUgTl9GVU4gd2l0aCBubyBuYW1lIGFzIGFuIGVuZCBvZiBmdW5jdGlvbgorCW1hcmtlci4KKwkqIG1pbnN5bXMuYyAobG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjKTogRXhhbWluZSBhbGwgc3ltYm9scworCWF0IHRoZSBzYW1lIGFkZHJlc3MgcmF0aGVyIHRoYW4gYSByYW5kb20gc3Vic2V0IG9mIHRoZW0uCisJKiBjb2ZmcmVhZC5jIChjb2ZmX3N5bWZpbGVfaW5pdCk6IFNldCBPQkpGX1JFT1JERVJFRC4KKwkqIGVsZnJlYWQuYyAoZWxmX3N5bWZpbGVfaW5pdCk6IFNpbWlsYXJseS4KKwkqIHNvbXJlYWQuYyAoc29tX3N5bWZpbGVfaW5pdCk6IFNpbWlsYXJseS4KKwkqIHhjb2ZmcmVhZC5jICh4Y29mZl9zeW1maWxlX2luaXQpOiBTaW1pbGFybHkuCisKK0ZyaSBKYW4gIDUgMTc6NDY6MDEgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogc3RhY2suYyAocHJpbnRfc3RhY2tfZnJhbWUgcHJpbnRfZnJhbWVfaW5mbykgc3ltbWlzYy5jCisJKGR1bXBfc3ltdGFiKTogIENoYW5nZSBSRVRVUk5fTUFTS19FUlJPUiB0byBSRVRVUk5fTUFTS19BTEwgc28KKwl0aGF0IGNhdGNoX2Vycm9ycyBkb2Vzbid0IGdldCBibGluZHNpZGVkIGJ5IFFVSVQgYW5kIGxvc2UgdGhlCisJY2xlYW51cCBjaGFpbi4gIFRoaXMgZml4ZXMgYSBwcm9ibGVtIHdoZXJlIF5DIHdoaWxlIGluIGEKKwl1c2VyLWRlZmluZWQgY29tbWFuZCBzb21ldGltZXMgbGVhdmVzIGluc3RyZWFtIE5VTEwgYW5kIGNhdXNlcyBhCisJc2VnZmF1bHQgaW4gY29tbWFuZF9sb29wLgorCitGcmkgSmFuICA1IDEzOjU5OjE2IDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluLCBjb25maWd1cmU6IEFkZCBgLWxkbCAtbHcnIGZvciBTb2xhcmlzIGxpbmtpbmcuCisKK0ZyaSBKYW4gIDUgMTI6MDI6MDAgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3NoL3NoLm10LCBjb25maWcvcG93ZXJwYy8qLm10LCBjb25maWcvcGEvaHBwYXByby5tdCwKKwljb25maWcvbTY4ay9tb25pdG9yLm10LCBjb25maWcvaDg1MDAvaDg1MDAubXQsIGNvbmZpZy9oODMwMC9oODMwMC5tdDoKKwlzcmVjLm8gcmVuYW1lZCB0byBkc3JlYy5vLgorCitUaHUgSmFuICA0IDE2OjA0OjU0IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGJyZWFrcG9pbnQuYyAocmVtb3ZlX2JyZWFrcG9pbnQpOiAgQ2hhbmdlIGVycm9yIHRvIHdhcm5pbmcgc28KKwl0aGF0IGhhcmR3YXJlIHdhdGNocG9pbnQgcmVtb3ZhbCBwcm9ibGVtcyB3b24ndCBsZWF2ZSBicmVha3BvaW50CisJdHJhcHMgaW4gdGhlIHRhcmdldC4KKwkqIHJlbW90ZS1lNzAwMC5jIChlNzAwMF9pbnNlcnRfYnJlYWtwb2ludCwKKwllNzAwMF9yZW1vdmVfYnJlYWtwb2ludCk6ICBVc2UgZTcwMDAgYmFzZWQgYnJlYWtwb2ludHMsIG5vdCBtZW1vcnkKKwlicmVha3BvaW50cy4KKwkqIChlNzAwMF93YWl0KTogIEFkanVzdCBQQyBiYWNrIGJ5IHR3byB3aGVuIHdlIHNlZSBhIGJyZWFrcG9pbnQgdG8KKwljb21wZW5zYXRlIGZvciBlNzAwMCBtYWxhZGp1c3RtZW50LgorCSogc3BhcmNsLXRkZXAuYyAoc3BhcmNsaXRlX2NoZWNrX3dhdGNoX3Jlc291cmNlcyk6ICBGaXggbG9naWMgYnVnCisJd2hpY2ggcHJldmVudGVkIGhhcmR3YXJlIHdhdGNocG9pbnRzIGZyb20gd29ya2luZy4KKworVGh1IEphbiAgNCAxMDo0NDoxNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogaW5mcHRyYWNlLmMgKHVkb3RfaW5mbyk6IE5ldyBmdW5jdGlvbi4KKwkoUFRfKik6IERlZmluZSBlYWNoIGluZGl2aWR1YWxseSBpZiB0aGF0IG9uZSBpcyBub3QgZGVmaW5lZC4KKwkqIHJzNjAwMC1uYXQuYyAoa2VybmVsX3Vfc2l6ZSk6IE5ldyBmdW5jdGlvbgorCUluY2x1ZGUgPHN5cy91c2VyLmg+IGZvciAic3RydWN0IHVzZXIiCisJKiBhbHBoYS1uYXQuYyAoa2VybmVsX3Vfc2l6ZSk6IE5ldyBmdW5jdGlvbi4KKwlJbmNsdWRlIDxzeXMvdXNlci5oPiBmb3IgInN0cnVjdCB1c2VyIgorCSogc3BhcmMtbmF0LmMgKGtlcm5lbF91X3NpemUpOiBOZXcgZnVuY3Rpb24uCisJSW5jbHVkZSA8c3lzL3VzZXIuaD4gZm9yICJzdHJ1Y3QgdXNlciIKKwkqIGkzODZiLW5hdC5jIChrZXJuZWxfdV9zaXplKTogTmV3IGZ1bmN0aW9uLgorCSogaTM4NnYtbmF0LmMgKGtlcm5lbF91X3NpemUpOiBOZXcgZnVuY3Rpb24uCisJKiBjb25maWcvaTM4Ni9ubS1mYnNkLmggKEtFUk5FTF9VX1NJWkUpOiBEZWZpbmUuCisJKGtlcm5lbF91X3NpemUpOiBEZWNsYXJlLgorCSogY29uZmlnL2kzODYvbm0tbGludXguaCAoS0VSTkVMX1VfU0laRSk6IERlZmluZS4KKwkoa2VybmVsX3Vfc2l6ZSk6IERlY2xhcmUuCisJKiBjb25maWcvc3BhcmMvbm0tc3VuNG9zNC5oIChLRVJORUxfVV9TSVpFKTogRGVmaW5lLgorCShrZXJuZWxfdV9zaXplKTogRGVjbGFyZS4KKwkqIGNvbmZpZy9hbHBoYS9ubS1vc2YyLmggKEtFUk5FTF9VX1NJWkUpOiBEZWZpbmUuCisJKGtlcm5lbF91X3NpemUpOiBEZWNsYXJlLgorCSogY29uZmlnL3JzNjAwMC9ubS1yczYwMDAuaCAoS0VSTkVMX1VfU0laRSk6IERlZmluZS4KKwkoa2VybmVsX3Vfc2l6ZSk6IERlY2xhcmUuCisKK1RodSBKYW4gIDQgMTE6MDA6MDEgMTk5NiAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogbWRlYnVncmVhZC5jIChteWxvb2t1cF9zeW1ib2wpOiBlbnVtIG5hbWVzcGFjZSBiZWNvbWVzCisJZW51bV9uYW1lc3BhY2UgCXR5cGUuCisJKiBzeW1maWxlLmMgKGFkZF9wc3ltYm9sX3RvX2xpc3QpCisJKGFkZF9wc3ltYm9sX2FkZHJfdG9fbGlzdCk6IERpdHRvLgorCSogc3ltdGFiLmMgKGxvb2t1cF9wYXJ0aWFsX3N5bWJvbCk6IERpdHRvLgorCShsb29rdXBfc3ltYm9sKTogRGl0dG8uCisJKGxvb2t1cF9ibG9ja19zeW1ib2wpOiBEaXR0by4JCisJKiB3aW4zMi1uYXQuYyAoaGFuZGxlX2xvYWRfZGxsKTogVXNlIGluY29taW5nIGRsbCBiYXNlLgorCShjaGlsZF93YWl0KTogQ2F0Y2ggRExMIGxvYWQgZXJyb3JzLgorCShjcmVhdGVfY2hpbGRfaW5mZXJpb3IpOiBUcmFuc2xhdGVkIGJldHdlZW4gcGF0aHMgY29ycmVjdGx5LgorCitXZWQgSmFuICAzIDIzOjEzOjUzIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBpMzg2djQtbmF0LmMgKHN1cHBseV9ncmVnc2V0LCBmaWxsX2dyZWdzZXQpOiBTdWJ0cmFjdCBOVU1fRlJFR1MKKyAJZnJvbSBOVU1fUkVHUyB0byBnZXQgbnVtYmVyIG9mIGdlbmVyYWwgcmVnaXN0ZXJzIHRoYXQgd2UgY2FyZSBhYm91dC4KKwkqIGNvbmZpZy9pMzg2L3RtLWkzODYuaCAoUkVHSVNURVJfQllURVMpOiBEZWZpbmUgaW4gdGVybXMKKwlvZiBudW1iZXIgb2YgZ2VuZXJhbCByZWdzIGFuZCBudW1iZXIgb2YgZmxvYXRpbmcgcG9pbnQgcmVncy4KKworV2VkIEphbiAgMyAxOTo0OTo1NCAxOTk2ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBjb25maWcvaTM4Ni90bS13aW4zMi5oIChJTl9TT0xJQl9DQUxMX1RSQU1QT0xJTkUpOiBOZXcuCisJKFNLSVBfVFJBTVBPTElORV9DT0RFKTogTmV3LgorCSogY29uZmlnL2kzODYveG0td2luMzIuaCAoQ0FOVF9GT1JLKTogRGVsZXRlZC4KKwkoU0xBU0gqKSBDaGFuZ2VkIHRvIHVzZSB1bml4IHN0eWxlIHNsYXNoLgorCSogc3ltdGFiLmggKG5hbWVzcGFjZSBlbnVtKTogYmVjb21lcyB0eXBlZGVmIHRvIGF2b2lkIG5hbWVzcGFjZQorCWNvbGxpc2lvbiBpbiBDKysuIAorCSogaW5mY21kLmMgKHBhdGhfY29tbWFuZCk6IFVzZSBlbXB0eSBzdHJpbmcgaWYgUEFUSCBuYW1lIG5vdCBzZXQuCisJKiBpMzg2LXRkZXAuYyAoc2tpcF90cmFtcG9saW5lX2NvZGUpOiBOZXcgZnVuY3Rpb24uCisJKiBzcmVjLmM6IFJlbmFtZWQgZHNyZWMuYyB0byBhdm9pZCBmaWxlbmFtZSBjb2xsaXNpb24uCisJKiBNYWtlZmlsZS5pbjogQ29wZSB3aXRoIHJlbmFtaW5nLgorCQorV2VkIEphbiAgMyAxMzowOTowNCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogc3ltbWlzYy5jIChwcmludF9vYmpmaWxlX3N0YXRpc3RpY3MpOiBQcmludCBtZW1vcnkgdXNlIHN0YXRpc3RpY3MKKwlmb3Igb2JqZmlsZSBwc3ltYm9sLCBzeW1ib2wsIGFuZCB0eXBlIG9ic3RhY2tzLgorCitUdWUgSmFuICAyIDEzOjQxOjE0IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL21pcHMvbm0taXJpeDUuaDogUmVzdG9yZS4KKwkoVEFSR0VUX0hBU19IQVJEV0FSRV9XQVRDSFBPSU5UUywgZXRjKTogRGVmaW5lIGFzIGZvciBJcml4IDQ7CisJZnJvbSBMZWUgSXZlcnNvbiA8bGVlaUBhaS5zcmkuY29tPi4KKwkqIGNvbmZpZy9taXBzL2lyaXg1Lm1oIChOQVRfRklMRSk6IFVzZSBubS1pcml4NS5oLgorCSogY29uZmlnL21pcHMvaXJpeFszNDVdLm1oIChNVU5DSF9ERUZJTkUpOiBSZW1vdmUuCisKK0ZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTUKKwwKK0xvY2FsIFZhcmlhYmxlczoKK21vZGU6IGNoYW5nZS1sb2cKK2xlZnQtbWFyZ2luOiA4CitmaWxsLWNvbHVtbjogNzQKK3ZlcnNpb24tY29udHJvbDogbmV2ZXIKK0VuZDoKZGlmZiAtLWdpdCBhL2dkYi9DaGFuZ2VMb2ctOTcgYi9nZGIvQ2hhbmdlTG9nLTk3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOWE5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvQ2hhbmdlTG9nLTk3CkBAIC0wLDAgKzEsMjg1NSBAQAorV2VkIERlYyAzMSAxMTo0Mzo1MyAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGRzcmVjLmMgKGxvYWRfc3JlYyk6IENoZWNrIHJlbW90ZWRlYnVnIGZsYWcgd2hlbiBwcmludGluZworCWRlYnVnIGluZm8uCisKK1dlZCBEZWMgMzEgMTA6MzM6MTUgMTk5NyAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+CisKKwkqIGJyZWFrcG9pbnQuYyAoYnJlYWtwb2ludF9yZV9zZXQpOiBhZGQgX3NpZ2xvbmdqbXAgdG8gbGlzdCBvZgorCWxvbmdqbXAgYnJlYWtwb2ludHMuCisKK01vbiBEZWMgMjkgMjE6MjU6MzQgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBkdmUzOTAwLXJvbS5jOiBOZXcgZmlsZSB0byBzdXBwb3J0IERlbnNhbiBEVkUtUjM5MDAvMjAgYm9hcmQuCisJKiBtb25pdG9yLmMgKG1vbml0b3JfZGVidWcpOiBNb3ZlIHRvIHV0aWxzLmMsIHJlbmFtZSB0byBwdXRzX2RlYnVnLgorCShtb25pdG9yX3dyaXRlX21lbW9yeSwgbW9uaXRvcl9yZWFkX21lbW9yeSwgbW9uaXRvcl9pbnNlcnRfYnJlYWtwb2ludCwKKwltb25pdG9yX3JlbW92ZV9icmVha3BvaW50KTogUmVtb3ZlIHVzZWxlc3MgYWRkcmVzcyBiaXRzIGlmIGN1cnJlbnQKKwltb25pdG9yIGhhcyBNT19BRERSX0JJVFNfUkVNT1ZFIGZsYWcuCisJKiBtb25pdG9yLmggKE1PX0FERFJfQklUU19SRU1PVkUpOiBEZWZpbmUuCisJKiB1dGlscy5jIChwdXRzX2RlYnVnKTogRm9ybWVybHkgbW9uaXRvcl9kZWJ1ZyBmcm9tIG1vbml0b3IuYzsKKwltb3ZlIGhlcmUgYW5kIG1ha2UgcHVibGljLiAgQWRkIGJldHRlciBzdXBwb3J0IGZvciBjYXJyaWFnZSByZXR1cm5zLgorCSogZGVmcy5oIChwdXRzX2RlYnVnKTogRGVjbGFyZS4KKwkqIGRzcmVjLmMgKGxvYWRfc3JlYyk6IFVzZSBwdXRzX2RlYnVnIHRvIHByaW50IHJlbW90ZWRlYnVnIGluZm9ybWF0aW9uLgorCU91dHB1dCBoZWFkZXIgcmVjb3JkIGNvcnJlY3RseS4KKwkobWFrZV9zcmVjKTogT3V0cHV0IGEgaGVhZGVyIHJlY29yZCBpbnN0ZWFkIG9mIGEgdGVybWluYXRpb24gcmVjb3JkCisJaWYgc2VjdCBpcyBub24tTlVMTCAodmFsdWUgaXMgaWdub3JlZCksIGJ1dCBhYmZkIGlzIE5VTEwuCisJKiBjb25maWcvbWlwcy90bS10eDM5LmggKERFRkFVTFRfTUlQU19UWVBFKTogUmVtb3ZlIGRlZmluaXRpb24uCisJKFJFR0lTVEVSX05BTUVTKTogRGVmaW5lIHRvIGFkZCBSMzkwMC1zcGVjaWZpYyByZWdpc3RlcnMuCisJKiBjb25maWcvbWlwcy90bS10eDM5bC5oOiBEaXR0by4KKwkqIGNvbmZpZy9taXBzL3R4MzkubXQgKFRERVBGSUxFUyk6IEFkZCBkdmUzOTAwLXJvbS5vIGFuZCBzdXBwb3J0IGZpbGVzLgorCSogY29uZmlnL21pcHMvdHgzOWwubXQ6IERpdHRvLgorCitXZWQgRGVjIDI0IDEyOjQ4OjQ4IDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogZHNyZWMuYzogQ29zbWV0aWMgaW1wcm92ZW1lbnRzLgorCShtYWtlLXNyZWMpOiBDaGFuZ2UgaW5kZXhpbmcgb2YgZm9ybWF0IGFuZCBjb2RlIHRhYmxlcyB0bworCXJlbW92ZSBjb25mdXNpbmcgZW1wdHkgZW50cmllcy4KKworTW9uIERlYyAyMiAyMTo1MTo1MyAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1taXBzLmMgKF9pbml0aWFsaXplX3JlbW90ZV9taXBzKTogRml4IEREQiBkb2Mgc3RyaW5nLgorCitTdW4gRGVjIDIxIDE3OjAwOjA2IDE5OTcgIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJKiBkMzB2LXRkZXAuYyAoZDMwdl9mcmFtZV9maW5kX3NhdmVkX3JlZ3MpOiBzcGxpdCBtb3N0IG9mCisJZnVuY3Rpb24gb2ZmIGludG8gZDMwdl9mcmFtZV9maW5kX3NhdmVkX3JlZ3Nfb2Zmc2V0czsKKwkoZDMwdl9mcmFtZV9maW5kX3NhdmVkX3JlZ3Nfb2Zmc2V0cyk6IG5ldyBmdW5jdGlvbi4gIEdvdAorCWJhY2t0cmFjZSB3b3JraW5nIHdoZW4gY2FsbGluZyBmcm9tIGZyYW1lZnVsbCAodW5vcHRpbWl6ZWQpCisJcm91dGluZXMgKC5lLmcsIG1haW4pIGludG8gZnJhbWVsZXNzIChvcHRpbWl6ZWQpIHJvdXRpbmVzCisJKGUuZy4sIHByaW50ZikuCisKK0ZyaSBEZWMgMTkgMDk6NDk6NDkgMTk5NyAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+CisKKwkqIGQzMHYtdGRlcC5jIChkMzB2X2ZyYW1lX2NoYWluKTogdGVzdCBlbmRfb2Zfc3RhY2sKKwkoZDMwdl9mcmFtZV9maW5kX3NhdmVkX3JlZ3MpOiBzZXQgaXQuCisJKiBjb25maWcvZDMwdi90bS1kMzB2Lmg6IGltcHJvdmVkIEZSQU1FX0NIQUlOX1ZBTElECisKK1RodSBEZWMgMTggMTI6MzQ6MjggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJRnJvbSBHYXZpbiBLb2NoIDxnYXZpbkBjeWdudXMuY29tPjogbWlwcy10ZGVwLmMKKyAJKiAobWlwc19wdXNoX2FyZ3VtZW50cyk6IEZvciBiaWctZW5kaWFuIHNob3J0cyBhbmQgY2hhcidzIHN0b3JlIGF0CisgCSogdGhlIGNvcnJlY3QgbG9jYXRpb24uCisKK1RodSBEZWMgMTggMDA6MjY6NDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6IERlbGV0ZSBjaGVjayB0aGF0IHN5bWJvbHMKKyAJZm9yIGZpbGUgbm90IGFscmVhZHkgbG9hZGVkLiAgRGlkIG5vdCB3b3JrIHdoZW4gYW4gaW5jbHVkZSBmaWxlCisgCXdhcyBpbnZvbHZlZC4KKworV2VkIERlYyAxNyAxMDo0MzowNCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGVsZnJlYWQuYyAoZWxmX3N5bWZpbGVfcmVhZCk6IFNpbmNlIHRoZSBwYXJ0aWFsIHN5bWJvbCB0YWJsZSBpcworIAlzZWFyY2hlZCBsYXN0IGluIGZpcnN0LCBpbnNlcnQgbWRlYnVnIG9yIFhDT0ZGIGluZm8gaW50byB0aGUKKyAJcGFydGlhbCBzeW1ib2wgdGFibGUgYmVmb3JlIGFueSBEV0FSRjIgaW5mby4KKworVGh1IERlYyAxOCAwMDowMDo0OCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHN5bWZpbGUuYyAoaW5pdF9wc3ltYm9sX2xpc3QpOiBIYW5kbGUgaW5pdCB3aXRoIHplcm8gZWxlbWVudHMuCisKKwkqIGVsZnJlYWQuYyAoZWxmX3N5bWZpbGVfcmVhZCk6IElmIGBtYWlubGluZScsIGNsZWFyIHBzeW1ib2wgdGFibGUKKyAJdXNpbmcgaW5pdF9wc3ltYm9sX2xpc3QgMC4gIEZvciBidWlsZF9wc3ltdGFicyBmdW5jdGlvbnMsIHBhc3MKKyAJbWFpbmxpbmU9PTAgc28gdGhhdCBwc3ltYm9sX2xpc3QgaXNuJ3QgcmUtaW5pdGlhbGl6ZWQuCisKKwkqIHN5bWZpbGUuYyAoZGlzY2FyZF9wc3ltdGFiKTogTmV3IGZ1bmN0aW9uLCBjb3JyZWN0bHkgdW5saW5rIGFuCisgCWVtcHR5IHBzeW10YWIgZnJvbSBhbiBvYmplY3QgZmlsZS4KKwkqIGRieHJlYWQuYyAoZW5kX3BzeW10YWIpOiBDYWxsIGRpc2NhcmRfcHN5bXRhYi4KKwkqIHhjb2ZmcmVhZC5jICh4Y29mZl9lbmRfcHN5bXRhYik6IERpdHRvLgorCSogaHByZWFkLmMgKGhwcmVhZF9lbmRfcHN5bXRhYik6ICBEaXR0by4KKwkqIG9zOWtyZWFkLmMgKG9zOWtfZW5kX3BzeW10YWIpOiAgRGl0dG8uCisKK1dlZCBEZWMgMTcgMTA6NDc6MDUgMTk5NyAgTWljaGFlbCBTbnlkZXIgIChtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbSkKKworCSogdHJhY2Vwb2ludC5jIChzZXRfcmF3X3RyYWNlcG9pbnQpOiBpbml0aWFsaXplIGFkZHJfc3RyaW5nCisJdG8gTlVMTDsgKHRyYWNlX2FjdGlvbnNfY29tbWFuZCk6IGNhbGwgcmVhZGxpbmVfYmVnaW5faG9vayBvbmx5CisJaWYgZnJvbV90dHkgaXMgdHJ1ZS4KKworVHVlIERlYyAxNiAyMDowNTo0OCAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS50Z3Q6IENoYW5nZSBsaXR0bGUtZW5kaWFuIHR4MzkgdGFyZ2V0IG5hbWUgdG8gdHgzOWwuCisKK1R1ZSBEZWMgMTYgMTE6MjQ6MzAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiByZW1vdGUtc2ltLmMgKGdkYnNpbV9vcGVuKTogVXNlICItLWFyY2hpdGVjdHVyZSIgaW5zdGVhZCBvZgorCWFtYmlnaW91cyBzaG9ydCBmb3JtLgorCQorVHVlIERlYyAxNiAxMDoyOToxNiAxOTk3ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KKworCSogZDMwdi10ZGVwLmMgKGQzMHZfZnJhbWVfY2hhaW4pOiBkb24ndCBvciBpbiBETUVNX1NUQVJUIHRvCisJRlBfUkVHTlVNIHZhbHVlIGJlZm9yZSByZXR1cm47IChwcm9sb2d1ZV9maW5kX3JlZ3MpOiB0d28gc2V0cworCW9mIG9mZnNldHMgLS0gZnJhbWUgcG9pbnRlciBhbmQgc3RhY2sgcG9pbnRlciwgbm90IGp1c3Qgb25lIHRoYXQKKwl0cmllcyB0byBkbyBkb3VibGUgZHV0eTsgKGQzMHZfZnJhbWVfZmluZF9zYXZlZF9yZWdzKTogc3RvcCBvbmNlCisJd2UgaGl0IHBjIChpbiBjYXNlIHdlJ3JlIHN0b3BwZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcHJvbG9ndWUpCisJYW5kIGltcHJvdmUgaGFuZGxpbmcgb2YgZnJhbWVsZXNzIHByb2xvZ3VlczsgKGQzMHZfcHVzaF9hcmd1bWVudHMpOgorCSpBTEwqIGFyZ3VtZW50cyBnbyBvbiB0aGUgc3RhY2sgdW50aWwgd2UgcnVuIG91dCBvZiBhcmdzIHJlZ2lzdGVycywKKwlmb3JjZSBzcCB0byBiZSA4IGJ5dGUgYWxpZ25lZC4KKworCSogY29uZmlnL3RtLWQzMHYuaCAoRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyk6IGZpeCwgaXQncyByMiwKKwlub3QgcjA7IChGUkFNRV9DSEFJTl9WQUxJRCk6IGhhbmRsZSB1c2Ugb2YgZXh0ZXJuYWwgbWVtb3J5OworCShTVEFDS19BTElHTik6IGRlZmluZS4KKworTW9uIERlYyAxNSAxNToxMzo1NyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zaW0uYyAoZ2Ric2ltX3dhaXQpOiBXaGVuIEhBVkVfU0lHQUNUSU9OIGFuZCBTQV9SRVNUQVJUCisgCWludGFsbCBjbnRybC1jIGhhbmRsZXIgd2l0aCBTQV9SRVNUQVJUIGNsZWFyLiAgT24gQlNEIHN5c3RlbXMgdGhpcworIAlzdG9wcyByZWFkIHN5c2NhbGxzJ3MgYmVpbmcgcmVzdGFydGVkLgorCisJKiBjb25maWd1cmUuaW4gKGNvbmZpZ2RpcnMpOiBDaGVjayBmb3Igc2lnYWN0aW9uLgorCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKworTW9uIERlYyAxNSAxMTozODo1MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGR3YXJmMnJlYWQuYzogRnJvbSBjaGFuZ2UgcHJvcG9zZWQgYnkgR2F2aW4gS29jaC4KKyAJKGFkZHJlc3Nfc2lnbmlmaWNhbnRfc2l6ZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisgCShkd2FyZjJfYnVpbGRfcHN5bXRhYnNfaGFyZCk6IENoZWNrIGNvbnNpc3RlbmN5IGJldHdlZW4KKyAJYGFkZHJlc3Nfc2l6ZScgYW5kIGBhZGRyZXNzX3NpZ25pZmljYW50X3NpemUnLgorCShyZWFkX2FkZHJlc3MpOiBNQVNLIG91dCBhbGwgYnV0IHRoZSBzaWduaWZpY2FudCBiaXRzLCBhcworIAlkZXRlcm1pbmVkIGJ5IGBhZGRyZXNzX3NpZ25pZmljYW50X3NpemUnLCBvZiBhbnkgYWRkcmVzc2VzLgorCShlbGYtYmZkLmgpOiBJbmNsdWRlLgorCShkd2FyZjJfYnVpbGRfcHN5bXRhYnNfaGFyZCk6IFNldCBgYWRkcmVzc19zaWduaWZpY2FudF9zaXplJworIAlhY2NvcmRpbmcgdG8gdGhlIGFyY2hfc2l6ZSBvZiB0aGUgZWxmIG9iamVjdCBmaWxlLgorCitUaHUgRGVjIDExIDEzOjQwOjQ2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZHdhcmYycmVhZC5jIChkd2FyZl9kZWNvZGVfbGluZXMpOiBDaGFuZ2UgdHlwZSBvZiBhZGRyZXNzIHRvCisgCUNPUkVfQUREUi4KKworVGh1IERlYyAxMSAxNDoyODowMSAxOTk3ICBNaWNoYWVsIFNueWRlciAgKG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tKQorCisJKiB0cmFjZXBvaW50LmMgKHRyYWNlX2ZpbmRfY29tbWFuZCk6IGRvbid0IGVycm9yIGlmIGdvaW5nCisJYmFja3dhcmRzIHRocnUgdGhlIHRyYWNlIGJ1ZmZlciBpbiBhIGxvb3AuCisJKiAoc3RydWN0IHRyYWNlcG9pbnQpOiBkZWxldGUgdW51c2VkIGZpZWxkLgorCitXZWQgRGVjIDEwIDE3OjU3OjAwIDE5OTcgIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJKiBkMzB2LXRkZXAuYyA6IGRvbid0IGJ1cnkgbG90cyBvZiBtYWdpYyBudW1iZXJzIGluIHRoZSBjb2RlCisJaW5zdGVhZCB1c2UgZGVmaW5lcyBmb3IgdGhlIG9wY29kZXMgYW5kIG9wY29kZSBtYXNrczsgdXBkYXRlCisJdG8gdXNlIGFjdHVhbCBkMzB2IHBhdHRlcm5zOyBmaXggcmVnaXN0ZXIgc2l6ZXMgdG8gYmUgNCBieXRlcworCW5vdCAyIGJ5dGVzOyBpbXByb3ZlIHByb2xvZ3VlIHRlc3Rpbmcgbm93IHRoYXQgd2UgaGF2ZSBhIEMKKwljb21waWxlcjsgZml4IHN0YWNrIGZyYW1lIGhhbmRsaW5nIGVub3VnaCB0byBnZXQgYmFja3RyYWNlcworCXdvcmtpbmc7IGluaXRpYWwgY2hhbmdlcyB0byBwdXNoIGFuZCBwb3AgZnJhbWVzIChzbyB0aGF0IGdkYgorCWNhbiBjYWxsIGZ1bmN0aW9ucyBpbiB0aGUgaW5mZXJpb3IpLgorCisJKiBjb25maWcvZDMwdi90bS1kMzB2Lmg6IHVwZGF0ZSBETUVNX1NUQVJULCBJTUVNX1NUQVJULCBhbmQKKwlTVEFDS19TVEFSVDsgY2hhbmdlIEZSX1JFR05VTSB0byA2MSAod2FzIDExKS4gIFJlZm9ybWF0IGNvbW1lbnQKKwlhYm91dCBEVU1NWSBGUkFNRVMgc28gdGhhdCBpdCBpcyByZWFkYWJsZS4gIEZpeCBTQVZFRF9QQ19BRlRFUl9GUkFNRQorCW1hY3JvLgorCitXZWQgRGVjIDEwIDE3OjQxOjA3IDE5OTcgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCSogY2gtdmFscHJpbnQuYyAoY2hpbGxfdmFsX3ByaW50KTogVG8gYXZvaWQgc2VnZmF1bHRzLCBkb24ndCBwcmludAorIAlhIHN0cmluZyB3aG9zZSBkeW5hbWljIGxlbmd0aCBpcyBsb25nZXIgdGhhbiBpdHMgc3RhdGljIGxlbmd0aC4KKworV2VkIERlYyAxMCAxNTo1NDowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGR3YXJmMnJlYWQuYyAoZHdhcmYyX2J1aWxkX3BzeW10YWJzX2hhcmQpOiBDaGVjaworIAljdV9oZWFkZXIubGVuZ3RoIGlzIHdpdGhpbiBkd2FyZl9pbmZvX2J1ZmZlciBub3QKKyAJZHdhcmZfYWJicmV2X2J1ZmZlci4KKwkKK01vbiBEZWMgIDggMTQ6Mjg6NDkgMTk5NyAgTWljaGFlbCBTbnlkZXIgIChtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbSkKKworCSogdHJhY2Vwb2ludC5jIChtZW1yYW5nZV9zb3J0bWVyZ2UpOiBhbGxvdyBmb3IgbWVtcmFuZ2VzIAorCXRoYXQgb3ZlcmxhcC4gIChjb2xsZWN0X3BzZXVkb2NvbW1hbmQgZXRjLikgY2xlYW51cCBkZWNscy4KKworRnJpIERlYyAgNSAwOToyMjozNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWcvdjg1MC90bS12ODUwLmggKEJSRUFLUE9JTlQpOiBSZXZlcnRlZCBiYWNrIHRvIG9sZCB2YWx1ZS4uLgorCitUaHUgRGVjICA0IDA5OjMwOjIyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy92ODUwL3RtLXY4NTAuaCAoQlJFQUtQT0lOVCk6IENoYW5nZWQgdG8gbWF0Y2ggbmV3IHZhbHVlLgorCitXZWQgRGVjICAzIDEyOjQ0OjE1IDE5OTcgIEtlaXRoIFNlaXR6ICA8a2VpdGhzQG9uaW9ucy5jeWdudXMuY29tPgorCisJKiB0cmFjZXBvaW50LmM6IEFkZCBkZWNsYXJhdGlvbiBmb3IgeF9jb21tYW5kLgorCisJKiBwcmludGNtZC5jICh4X2NvbW1hbmQpOiBSZW1vdmUgc3RhdGljIGRlY2xhcmF0aW9uLgorCitXZWQgRGVjICAzIDEyOjAwOjQyIDE5OTcgIE1pY2hhZWwgU255ZGVyICAobXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20pCisKKwkqIHRyYWNlcG9pbnQuYyAoZmluaXNoX3RmaW5kX2NvbW1hbmQpOiBjYWxsIGRvX2Rpc3BsYXkgc28gdGhhdAorCWF1dG8tZGlzcGxheXMgYXJlIHVwZGF0ZWQgYnkgdGZpbmQuICBBbHNvLCBrZWVwIHRyYWNrIG9mIGZyYW1lCisJYW5kIGN1cnJlbnQtZnVuY3Rpb24gc28gdGhhdCB0ZmluZCBiZWhhdmVzIGxpa2Ugc3RlcHBpbmcgKG9ubHkKKwlzaG93IHRoZSBzdGFjayBmcmFtZSBpZiB3ZSBzdGVwIGludG8gYSBuZXcgZnVuY3Rpb24gb3IgcmV0dXJuKS4KKworV2VkIERlYyAgMyAxNDoxNDo1OCAxOTk3ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KKworCSogc29sLXRocmVhZC5jOiBhZGRpdGlvbmFsIHN1cHBvcnQgZm9yIGRlYnVnZ2luZyB0aHJlYWRlZCBjb3JlCisJZmlsZXMgb24gc29sYXJpczsgcHJldmlvdXNseSBvbmx5IGtlcm5lbCB0aHJlYWRzIHdlcmUgZm91bmQgLS0KKwl1c2VyIHRocmVhZHMgZ2VuZXJhdGVkIGVycm9ycy4KKwkqIGNvcmVsb3cuYzogZG9uJ3QgcmVnaXN0ZXIgY29yZV9vcHMgYXMgYSB0YXJnZXQgaWYKKwljb3Jlb3BzX3N1cHByZXNzX3RhcmdldCBpcyB0cnVlIChzZXQgYnkgc29sLXRocmVhZC5jKS4KKworVHVlIERlYyAgMiAxNDo1MzowOSAxOTk3ICBNaWNoYWVsIFNueWRlciAgKG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tKQorCisJKiB0cmFjZXBvaW50LmM6IG1ha2UgInRkdW1wIiBjb21tYW5kIGhhbmRsZSBsaXRlcmFsIG1lbXJhbmdlcy4KKworVHVlIERlYyAgMiAxMTozNDo0OCAxOTk3ICBNaWNoYWVsIFNueWRlciAgKG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tKQorCisJKiB0cmFjZXBvaW50LmM6IHVzZSAibG9va3VwX2NtZCIgdG8gcGFyc2UgYWN0aW9ucyBjb21tYW5kcworCSh0aHVzIGFsbG93aW5nIHVuYW1iaWd1b3VzIHByZWZpeGVzIGFuZCBhbGlhc2VzKS4KKworVHVlIERlYyAgMiAxMDoxNTo1NyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0OiBBZGQgc3VwcG9ydCBmb3IgVGh1bWIgdGFyZ2V0LgorCitUdWUgRGVjICAyIDEwOjE0OjE1IDE5OTcgIE1pY2hhZWwgU255ZGVyICAobXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20pCisKKwkqIHRyYWNlcG9pbnQuYzogbW92ZSBwcm90b3R5cGUgb2YgdmFsaWRhdGVfYWN0aW9ubGluZSgpLCBhbmQKKwltYWtlIGl0IGNvbnNpc3RlbnQgd2l0aCB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24uCisKK1RodSBOb3YgMjcgMDk6MDc6MTggMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluICh0cmFjZXBvaW50X2gpOiBOZXcgbWFjcm8gZm9yIHRyYWNlcG9pbnQuaAorCWluY2x1ZGVzLgorCSh0cmFjZXBvaW50Lm8pOiBBZGQgcnVsZSB0byBidWlsZC4KKworV2VkIE5vdiAyNiAyMjo1OTowNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHJlbW90ZS1zaW0uYyAoZ2Ric2ltX2NudHJsX2MpOiBMb3NlIEFOU0kgcHJvdG90eXBlLgorCisJKiB0cmFjZXBvaW50LmMgKHNldF9yYXdfdHJhY2Vwb2ludCk6IGZpeCB0eXBvCisKK1dlZCBOb3YgMjYgMTE6MzM6MDkgMTk5NyAgS2VpdGggU2VpdHogIDxrZWl0aHNAb25pb25zLmN5Z251cy5jb20+CisKKwkqIHRyYWNlcG9pbnQuYyAoc2V0X3Jhd190cmFjZXBvaW50KTogTWFrZSBzdXJlIHRoZXJlJ3MgYSB0cmFpbGluZworIAlzbGFzaCBvbiB0aGUgZGlyZWN0b3J5IG5hbWUuCisKKwkqIHRvcC5jIChnZXRfcHJvbXB0KTogTmV3IGZ1bmN0aW9uLgorCSogdG9wLmg6IERlY2xhcmUgaXQuCisKK1dlZCBOb3YgMjYgMDk6NTk6NDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBkd2FyZjJyZWFkLmMgKHN0cnVjdCBjb21wX3VuaXRfaGVhZCk6IENoYW5nZSBsZW5ndGggYW5kCisgCWFiYnJldl9vZmZzZXQgZmllbGRzIHRvIHVuc2lnbmVkIGludC4KKwkoZHdhcmYyX2J1aWxkX3BzeW10YWJzX2hhcmQpOiBWZXJpZnkgbGVuZ3RoIGFuZCBvZmZzZXQgcmVhZCBmcm9tCisgCS5kZWJ1Z19pbmZvIHNlY3Rpb24uCisKK01vbiBOb3YgMjQgMTk6MzY6MzQgMTk5NyAgTWljaGFlbCBTbnlkZXIgIChtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbSkKKworCSogdHJhY2Vwb2ludC5jLCB0cmFjZXBvaW50Lmg6IG5ldyBtb2R1bGUsIGltcGxlbWVudHMgdHJhY2luZywKKwl3aGljaCBpcyBhIG5ldyBmdW5jdGlvbmFsaXR5IHNvbWV3aGF0IGxpa2UgYnJlYWtwb2ludHMgZXhjZXB0CisJdGhhdCBhIHRyYWNlcG9pbnQgc3RvcHMgdGhlIGluZmVyaW9yIG9ubHkgbG9uZyBlbm91Z2ggdG8gY29sbGVjdAorCWFuZCBjYWNoZSBzZWxlY3RlZCBidWZmZXJzIGFuZCBtZW1vcnkgbG9jYXRpb25zLCB0aGVuIGFsbG93cyAKKwl0aGUgaW5mZXJpb3IgdG8gY29udGludWU7IHRoZSBjYWNoZWQgdHJhY2UgZGF0YSBjYW4gdGhlbiBiZSAKKwlleGFtaW5lZCBsYXRlci4KKworTW9uIE5vdiAyNCAxNDoxNzowMiAxOTk3ICBNaWNoYWVsIFNueWRlciAgKG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tKQorCisJKiBpbmZjbWQuYzogZXhwb3J0IHJlZ2lzdGVyc19pbmZvLCBmb3IgdXNlIGJ5IG90aGVyIG1vZHVsZXMuCisJKiBwcmludGNtZC5jOiBleHBvcnQgb3V0cHV0X2NvbW1hbmQsIGZvciB1c2UgYnkgb3RoZXIgbW9kdWxlcy4KKwkqIHN0YWNrLmM6IGV4cG9ydCBsb2NhbHNfaW5mbyBhbmQgYXJnc19pbmZvLCBmb3IgdXNlIGJ5IG90aGVyIG1vZHVsZXMuCisJKiByZW1vdGUuYzogZXhwb3J0IGdldHBrdCwgcHV0cGt0LCBhbmQgZnJvbWhleCBmb3IgZXh0ZXJuYWwgdXNlLgorCSAgTWFrZSBmcm9taGV4IGNhc2UtaW5zZW5zYXRpdmUuICBOZXcgZnVuY3Rpb24gInJlbW90ZV9jb25zb2xlX291dHB1dCIKKwkgIGFic3RyYWN0cyB0aGUgYWNjZXB0YW5jZSBvZiAiTyIgcGFja2V0cyBmcm9tIHRhcmdldC4KKwkgIE1ha2UgYWxsICJyZW1vdGVkZWJ1ZyIgb3V0cHV0IGdvIHRvIHN0ZG91dCwgbm90IHN0ZGVyci4KKworTW9uIE5vdiAyNCAwODo1OToyOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHZhbHByaW50LmMgKHByaW50X2xvbmdlc3QpOiBXaGVuIENDIGhhcyBsb25nIGxvbmcgYnV0IHByaW50ZgorIAlkb2Vzbid0LCBwcmludCBkZWNpbWFsIHZhbHVlIGFzIHRocmVlIHBhcnRzLgorCisJKiBjb25maWcvaTM4Ni90bS1mYnNkLmg6IE5ldyBmaWxlLgorCSogY29uZmlnL2kzODYvZmJzZC5tdCAoVE1fRklMRSk6IENoYW5nZSB0byB0bS1mYnNkLmguCisKKwkqIGNvbmZpZy9pMzg2L25tLWZic2QuaCAoRkxPQVRfSU5GTyk6IE1vdmUgZGVmaW5pdGlvbiBmcm9tIGhlcmUuCisgCSogY29uZmlnL2kzODYvdG0tZmJzZC5oIChGTE9BVF9JTkZPKTogVG8gaGVyZS4KKworCSogY29uZmlndXJlLmluIChQUklOVEZfSEFTX0xPTkdfTE9ORyk6IENoZWNrIGZ1bGwgZnVuY3Rpb25hbGl0eSBvZgorIAklbGwgZm9ybWF0IHNwZWNpZmllci4KKwkoU0NBTkZfSEFTX0xPTkdfRE9VQkxFKTogQ2hlY2sgdGhlIHNjYW5mIGZhbWlseSBmb3Igc3VwcG9ydCBvZgorIAlsb25nIGRvdWJsZSB1c2luZyAlTGcuCisJKiBhY2NvbmZpZy5oOiBQcm92aWRlIGRlZmF1bHQgdW5kZWYgZm9yIFNDQU5GX0hBU19MT05HX0RPVUJMRS4KKwkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCisJCisJKiBjLWV4cC55IChwYXJzZV9udW1iZXIpOiBVc2Ugc3NjYW5mICVMZyB3aGVuIGhvc3QgaGFzCisgCVNDQU5GX0hBU19MT05HX0RPVUJMRSBub3QgUFJJTlRGX0hBU19MT05HX0RPVUJMRQorCitTdW4gTm92IDIzIDE3OjEyOjU4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogcHJpbnRjbWQuYyAocHJpbnRfaW5zbik6IFNldCB0aGUgbWFjaGluZSB0eXBlIGlmIGtub3duLgorCisJKiBpMzg2LXRkZXAuYyAoX2luaXRpYWxpemVfaTM4Nl90ZGVwKTogRGVsZXRlICJzZXQKKyAJYXNzZW1ibHktbGFuZ3VhZ2UiIGNvbW1hbmQuICBSZXBsYWNlZCBieSBnZW5lcmljICJzZXQKKyAJYXJjaGl0ZWN0dXJlIi4gU2V0IGluaXRpYWwgbWFjaGluZSB1c2luZyBiZmRfbG9va3VwX2FyY2guCisKK0ZyaSBOb3YgMjEgMTk6NDM6MjMgMTk5NyAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgorCisJKiB2YWxvcHMuYyAoY2FsbF9mdW5jdGlvbl9ieV9oYW5kKTogSWYgdGhlIGZ1bmN0aW9uIGhhcyBhCisJcHJvdG90eXBlLCBjb252ZXJ0IGl0cyBhcmd1bWVudHMgYXMgaWYgYnkgYXNzaWdubWVudC4gIE90aGVyd2lzZSwKKwlkbyB0aGUgdXN1YWwgcHJvbW90aW9ucy4gCisJKiBzdGFic3JlYWQuYyAoZGVmaW5lX3N5bWJvbCk6IFNldCB0aGUgVFlQRV9GTEFHX1BST1RPVFlQRUQgZmxhZworIAlvbiBmdW5jdGlvbnMnIHR5cGVzIHdoZW4gd2UgY2FuOyBhbGwgQysrIGZ1bmN0aW9ucyBzaG91bGQgZ2V0IGl0LAorCWFuZCBpZiB0aGUgU3VuLXN0eWxlIHByb3RvdHlwZSBub3RhdGlvbiBpcyBpbiB0aGUgc3RhYnMsIHdlIGNhbgorCW5vdGljZSB0aGF0LgorCitGcmkgTm92IDIxIDEyOjIwOjE2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNCAoQU1fQ1lHV0lOMzIsIEFNX0VYRUVYVCk6IFJlbW92ZS4gIFRoZXkgYXJlIGFscmVhZHkKKyAJZGVmaW5lZCBieSB0aGUgaW5jbHVzaW9uIG9mIC4uL2JmZC9hY2xvY2FsLm00LgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitGcmkgTm92IDIxIDEwOjUyOjM5IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoU0hFTEwpOiBSZWFsbHkgZG8gdGhlIGNoYW5nZS4KKworRnJpIE5vdiAyMSAwMjoxOTo1NyAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogYWxzbyByZXZlcnQgU0hFTEwgY2hhbmdlIHVudGlsIGNvbmZpZ3VyeQorCWNoYW5nZXMgd29yaworCitUaHUgTm92IDIwIDE2OjM1OjEzIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNwYXJjLXRkZXAuYyAoc3BhcmNfcGNfYWRqdXN0KTogRG9uJ3QgYXNzdW1lIHNpemVvZiAobG9uZykgPT0gNC4KKworVGh1IE5vdiAyMCAwNDoxMToyNyAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00OiBhZGQgRVhFRVhUIHNldHRpbmcgcnVsZQorCSogY29uZmlndXJlLmluOiBjYWxsIGl0CisJKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKKwkqIE1ha2VmaWxlLmluOiBwZXBwZXIgd2l0aCBFWEVFWFRzIGluIGFwcHJvcHJpYXRlIHBsYWNlcywKKwlzZXQgU0hFTEwgPSBAU0hFTExAIGZvciB0aG9zZSBsYW1lIGhvc3RzIHRoYXQgZG9uJ3QgaGF2ZSBhIC9iaW4vc2gKKwlGb3Igc29tZSByZWFzb24sIEVYRUVYVCBpc24ndCBnZXR0aW5nIHN1YnN0dXR1dGVkIGluIGNvcnJlY3RseQorCXNvIGZvciBub3csIHNldCBFWEVFWFQgdG8gZW1wdHkgc3RyaW5nCisKK01vbiBOb3YgMTcgMTU6MzU6MDYgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKHJlbW90ZS1zaW0ubyk6IERlcGVuZCBvbiAkKElOQ0xVREVfRElSKS9jYWxsYmFjay5oLgorCitGcmkgTm92IDE0IDEzOjA0OjM0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSoganYtZXhwLnkgKGNvcHlfZXhwLCBpbnNlcnRfZXhwKTogQXZvaWQgQU5TSSBwcm90b3R5cGVzLgorCitUaHUgTm92IDEzIDA5OjQ3OjM1IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBkMzB2LXRkZXAuYyAoZDMwdl9wcmludF9mbGFncyk6IEZ1bmN0aW9uIHRvIHByaW50IHRoZSBkMzB2IGZsYWdzCisJaW4gYSBodW1hbiByZWFkYWJsZSBmb3JtYXQuCisJKHByaW50X2ZsYWdzX2NvbW1hbmQpOiBDb21tYW5kIHdyYXBwZXIgdG8gY2FsbCBkMzB2X3ByaW50X2ZsYWdzLgorCShkMzB2X2RvX3JlZ2lzdGVyc19pbmZvKTogV2hlbiBwcmludGluZyBvdXQgYWxsIG9mIHRoZSByZWdpc3RlcnMsCisJcHJpbnQgb3V0IHRoZSBmbGFnIHZhbHVlcyBpbiBhIGh1bWFuIHJlYWRhYmxlIGZhc2hpb24uCisJKF9pbml0aWFsaXplX2QzMHZfdGRlcCk6IEFkZCBpbmZvIGZsYWdzIGNvbW1hbmQgdG8gcHJpbnQgdGhlCisJZmxhZ3MuCisKKwkqIGNvbmZpZy9kMzB2L3RtLWQzMHYuaCAoUFNXXyopOiBBZGQgbWFjcm9zIGZvciBlYWNoIG9mIHRoZSBQU1cKKwliaXRzIHRoYXQgYXJlIGRlZmluZWQuCisKK1dlZCBOb3YgMTIgMTQ6NTg6MzkgMTk5NyAgSmVmZiBIb2xjb21iICA8amVmZmhAY3lnbnVzLmNvbT4KKworCSogc3ltZmlsZS5jIChnZW5lcmljX2xvYWQpOiBIYW5kbGUgY2FuY2VsIGZyb20gdGhlCisJdWlfbG9hZF9wcm9ncmVzc19ob29rIHJvdXRpbmUuCisJKiBkc3JlYy5jIChsb2FkX3NyZWMpOiBIYW5kbGUgY2FuY2VsIGZyb20gdGhlCisJdWlfbG9hZF9wcm9ncmVzc19ob29rIHJvdXRpbmUuCisKK01vbiBOb3YgMTAgMTU6MTM6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB2YWxwcmludC5jIChwcmludF9sb25nZXN0KTogVGhlIGIsIGgsIHcsIGFuZCBnIGZvcm1hdCBzcGVjaWZpZXJzCisgCXByaW50IHVuc2lnbmVkIHZhbHVlcy4KKworTW9uIE5vdiAxMCAwMjowMjo0OSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KKworCSogdG9wLmMgKHF1aXRfY29uZmlybSk6IENoYW5nZSBleGl0IG1lc3NhZ2UuCisKK1R1ZSBOb3YgIDQgMTY6NTI6NTAgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2kzODYvY3lnd2luMzIubWg6IGJlY2F1c2UgY3lnd2luLmRsbCBjYWxscyBtYWxsb2MvcmVhbGxvYworCXRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZW52aXJvbiBzcGFjZSwgZ2RiIGNhbm5vdCB1c2UgbWVtb3J5CisJY2hlY2tzIC0tIHNldCAtRE5PX01NQ0hFQ0sKKworVHVlIE5vdiAgNCAxMzo1MDo1OSAxOTk3ICBKaW0gQmxhbmR5ICA8amltYkBzZW5kYWkuY3lnbnVzLmNvbT4KKworCSoganYtZXhwLnkgKEFycmF5QWNjZXNzKTogSW1wbGVtZW50IE5hbWUgWyBFeHByZXNzaW9uIF07IGNoZWNrIHRoZQorIAljb2RlIHRvIHNlZSB3aHkgdGhpcyBpcyBub3QgdHJpdmlhbC4KKwkoY29weV9leHAsIGluc2VydF9leHApOiBOZXcgZnVuY3Rpb25zLgorCQorRnJpIE9jdCAyNCAxNzoyNDowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+CisKKwkqIGR3YXJmMnJlYWQuYyAoZHdhcmYyX2J1aWxkX3BzeW10YWJzX2hhcmQpOiBIYW5kbGUgdGhlIGNhc2UKKwl3aGVyZSBhIGNvbXBpbGF0aW9uIHVuaXQgZGllIGhhcyBubyBjaGlsZHJlbiAoRFdfVEFHX2NvbXBpbGVfdW5pdAorCWhhcyBEV19jaGlsZHJlbl9ubykuCisJKHNjYW5fcGFydGlhbF9zeW1ib2xzKTogQWRkIGNvbW1lbnQgZm9yIG5lc3RpbmdfbGV2ZWwuCisKK1dlZCBPY3QgMjkgMTU6NTM6MjQgMTk5NyAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+CisKKwkqIHNvbGliLmMgKHNvbGliX2JyZWFrX25hbWVzKTogYWRkIGVudHJ5IGZvciBTb2xhcmlzIDIuNiBydW4KKyAJdGltZSBsaW5rZXIuICBGcm9tIENhc3BlciBEaWsgdmlhIFBldGVyIFNjaGF1ZXIuCisKK1R1ZSBPY3QgMjggMTc6MzE6NDcgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoY29uZmlnZGlyKTogQWRkICAtbGNvbWRsZzMyIGFuZCAtbGFkdmFwaTMyCisJdG8gV0lOMzJMSUJTLgorCisJKiBjb25maWd1cmU6IFJlYnVpbGQKKworRnJpIE9jdCAyNCAxNjo0ODoyMSAxOTk3ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KKworCSogc29sLXRocmVhZC5jIChzb2xfZmluZF9uZXdfdGhyZWFkc19jYWxsYmFjaywKKwlzb2xfZmluZF9uZXdfdGhyZWFkcyk6IE5ldyBmdW5jdGlvbnMuCisJKiBjb25maWcvc3BhcmMvbm0tc3VuNHNvbDIuaCAoRklORF9ORVdfVEhSRUFEUyk6IE5ldyBtYWNybywgaW52b2tlCisJc29sX2ZpbmRfbmV3X3RocmVhZHMuCisJKiB0aHJlYWQuYyAoaW5mb190aHJlYWRzX2NvbW1hbmQpOiBpbnZva2UgRklORF9ORVdfVEhSRUFEUyBpZiBpdAorCWlzIGRlZmluZWQuCisKK1RodSBPY3QgMjMgMTY6MTY6MDQgMTk5NyAgSmVmZiBMYXcgIChsYXdAZmFzdC5jcy51dGFoLmVkdSkKKworCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpOiBQdXQgYmFjayBpbml0aWFsaXphdGlvbgorCW9mIGEgdmFyaWFibGUgbG9zdCBkdXJpbmcgbGFzdCBjaGFuZ2UuICBEb24ndCBwZXJmb3JtCisJYXNzaWdubWVudCBpbnNpZGUgY29uZGl0aW9uYWxzLgorCSogc3RhYnNyZWFkLmMgKHN5bWJvbF9yZWZlcmVuY2VfZGVmaW5lZCk6IFJldHVybiAtMSBmb3IgZXJyb3Ivbm90CisJZm91bmQuICBBbGwgY2FsbGVycyBjaGFuZ2VkIGFwcHJvcHJpYXRlbHkuCisJKGRlZmluZV9zeW1ib2wpOiBEb24ndCBwZXJmb3JtIGFzc2lnbm1lbnQgaW5zaWRlIGNvbmRpdGlvbmFscy4KKworV2VkIE9jdCAyMiAxMzowNDo1MiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1kZWJ1Z3JlYWQuYyAocHN5bXRhYl90b19zeW10YWJfMSk6IEhhbmRsZSBuZXcgbGl2ZSByYW5nZSBzdGFicworCWVudHJpZXMuCisKKwkqIGRieHJlYWQuYzogTW9yZSBjb21tZW50IGNsZWFudXBzLgorCSogc3RhYnNyZWFkLmM6IEZpeCB2YXJpb3VzIHZpb2xhdGlvbnMgb2YgdGhlIEdOVSBjb2RpbmcgYW5kCisJZm9ybWF0dGluZyBzdGFuZGFyZHMuICBVcGRhdGUvYWRkIGNvbW1lbnRzIHRvIG1ha2UgY29kZSBjbGVhcmVyLgorCShyZXNvbHZlX3JlZmVyZW5jZSk6IERlbGV0ZSB1bnVzZWQgZnVuY3Rpb24uCisJKHJlZl9zZWFyY2hfdmFsKTogUmVtb3ZlIGZ1bmN0aW9uLiAgSXQgZGlkbid0IGJlbG9uZyBpbiBzdGFic3JlYWQuYworCShyZXNvbHZlX2xpdmVfcmFuZ2UpOiBObyBsb25nZXIgcmV0dXJucyBhIHZhbHVlLiAgRG8gbm90IGFkZCBpdAorCXRvIHRoZSBsaXZlIHJhbmdlIGxpc3QgdW50aWwgdGhlIGVudGlyZSByYW5nZSBzdGFiIGhhcyBiZWVuIHBhcnNlZC4KKwkoZ2V0X3N1YnN0cmluZyk6IFJlbW92ZSBkdXBsaWNhdGUgZGVjbGFyYXRpb24uCisJKHJlc29sdmVfc3ltYm9sX3JlZmVyZW5jZSk6IE5vdyBzdGF0aWMuICBSZW1vdmUgdW5uZWNlc3NhcnkgY29kZQorCXRvIGRlYWwgd2l0aCBjbGVhbnVwcy4KKwkocmVmX2FkZCk6IFVzZSB4cmVhbGxvYyBpbnN0ZWEgb2YgcmVhbGxvYy4KKwkocHJvY2Vzc19yZWZlcmVuY2UpOiBSZW9yZ2FuaXplIHNsaWdodGx5IHRvIG1ha2UgY2xlYXJlci4KKwkqIHN0YWJzcmVhZC5oIChyZXNvbHZlX3N5bWJvbF9yZWZlcmVuY2UpOiBSZW1vdmUgZGVjbGFyYXRpb24uCisJKHJlc29sdmVfcmVmZXJlbmNlKTogTGlrZXdpc2UuCisJKiBzeW10YWIuYyAoZmluZF9hY3RpdmVfYWxpYXMpOiBOZXcgZnVuY3Rpb24uCisJKGxvb2t1cF9ibG9ja19zeW1ib2wpOiBVc2UgZmluZF9hY3RpdmVfYWxpYXMuCisJKiBzeW10YWIuaCAoc3RydWN0IHJhbmdlX2xpc3QpOiBGaXggZGFuZ2xpbmcgc3RydWN0IGxpdmVfcmFuZ2UKKwlyZWZlcmVuY2UuCisJKHJlZl9zZWFyY2hfdmFsKTogUmVtb3ZlIGRlY2wuCisKKwkqIHN5bXRhYi5oIChzdHJ1Y3QgcmFuZ2VfbGlzdCk6IFJlbmFtZWQgZnJvbSBzdHJ1Y3QgbGl2ZV9yYW5nZS4KKwkoc3RydWN0IHN5bWJvbCk6IFJlbW92ZSBzdHJ1Y3QgbGl2ZV9yYW5nZV9pbmZvIHN1YnN0cnVjdC4KKwlCcmluZyB0aGUgYWxpYXMgbGlzdCBhbmQgcmFuZ2UgbGlzdCBmaWVsZHMgdXAgdG8gdGhlIHRvcGxldmVsCisJYXMgImFsaWFzZXMiIGFuZCAicmFuZ2VzIi4KKwkoU1lNQk9MX0FMSUFTRVMsIFNZTUJPTF9SQU5HRVMpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCisJKFNZTUJPTF9SQU5HRV9TVEFSVCwgU1lNQk9MX1JBTkdFX0VORCwgU1lNQk9MX1JBTkdFX05FWFQpOiBEZWxldGUuCisJKiBzdGFic3JlYWQuYzogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgorCisJKiBkYnhyZWFkLmM6IEZpeCB2YXJpb3VzIHZpb2xhdGlvbnMgb2YgdGhlIEdOVSBjb2RpbmcgYW5kCisJZm9ybWF0dGluZyBzdGFuZGFyZHMuICBVcGRhdGUvYWRkIGNvbW1lbnRzIHRvIG1ha2UgY29kZQorCWNsZWFyZXIuCisJKHByb2Nlc3NfbGF0ZXIpOiBVc2UgeHJlYWxsb2MgaW5zdGVhZCBvZiByZWFsbG9jLiAgCisKKwkqIHN5bXRhYi5jOiBJbmNsdWRlIGluZmVyaW9yLmguCisKK1R1ZSBPY3QgMjEgMTQ6MTU6MjYgMTk5NyAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGN5Z251cy5jb20+CisKKwkqIGNoLWV4cC5jOiAgUmVuYW1lIEZJRUxEX05BTUUgdG8gRE9UX0ZJRUxEX05BTUUgKHRvIGF2b2lkIGNvbmZsaWN0KS4KKworRnJpIE9jdCAxNyAxMzoyMjowMiAxOTk3ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGluZmNtZC5jOiBJbXByb3ZlIGdyYW1tYXIgb2YgInNldCBhcmdzIiBoZWxwLgorCitUaHUgT2N0IDE2IDE1OjAzOjU4IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiByZW1vdGUtc2RzLmMgKHNkc19sb2FkKTogUHJvcGVybHkgZGVjbGFyZSBhcyBzdGF0aWMuCisKK1dlZCBPY3QgMTUgMTA6Mjc6MTQgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3NwYXJjL3RtLXNwYXJjLmggKEZJWF9DQUxMX0RVTU1ZKTogTWFzayBvZmYgZGlzcGxhY2VtZW50CisJdG8gMzAgYml0cyBpbiBjYWxsIGluc24gdG8gaGFuZGxlIC0tZW5hYmxlLTY0LWJpdC1iZmQuCisJKFNUT1JFX1NUUlVDVF9SRVRVUk4pOiBDaGFuZ2UgdG8gaGFuZGxlIC0tZW5hYmxlLTY0LWJpdC1iZmQuCisKK1R1ZSBPY3QgMTQgMjI6MTM6MjcgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBzdGFic3JlYWQuYzogTWFrZSByZWZfbWFwIGVudHJpZXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLgorCitUaHUgT2N0ICA5IDEyOjM3OjU3IDE5OTcgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIHByaW50Y21kLmMgKHByaW50X2FkZHJlc3Nfc3ltYm9saWMsIGFkZHJlc3NfaW5mbyk6IE1hc2sKKyAJdGFyZ2V0LXNwZWNpZmljIGZsYWcgYml0cyBmcm9tIFBDLCBmb3IgbW9yZSBhZXN0aGV0aWMgZGlzYXNzZW1ibHkuCisgIAkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaDogQWRkZWQgUEMgbWFza2luZyBmb3IgTUlQUyBmYW1pbHkKKyAJKGVzcGVjaWFsbHkgdGhlIE1JUFMxNikuCisKK1NhdCBPY3QgIDQgMTg6NDU6NDQgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiByZW1vdGUtbWlwcy5jIChtaXBzLWluaXRpYWxpemUpOiBXb3JrIGFyb3VuZCBmbGFraW5lc3MgaW4KKwlzb21lIHZlcnNpb25zIG9mIFBNT04gYWZ0ZXIgbG9hZGluZyBhIHByb2dyYW0uCisKK0ZyaSBPY3QgIDMgMTU6NDk6MTggMTk5NyAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGN5Z251cy5jb20+CisKKwkqIGMtbGFuZy5oLCBjcC12YWxwcmludC5jIChzdGF0aWNfZmllbGRfcHJpbnQpOiAgTWFrZSBub24tc3RhdGljLgorCSogcGFyc2UuYywgcGFyc2VyLWRlZnMuaCAobGVuZ3RoX29mX3N1YmV4cCk6ICBNYWtlIG5vbi1zdGF0aWMuCisJKiBqdi1leHAueSAoRmllbGRBY2Nlc3MpOiAgSGFuZGxlIGRvbGxhci1WQVJJQUJMRSBhcyBwcmltYXJ5LgorCShBcnJheUFjY2Vzcyk6ICBMaWtld2lzZS4gIEFsc28gcmVtb3ZlIHdhcm5pbmdzLgorCShDYXN0RXhwcmVzc2lvbik6ICBJbXBsZW1lbnQgKHR5cGVuYW1lKSBVbmFyeUV4cHJlc3Npb24uCisJKHB1c2hfcXVhbGlmaWVkX2V4cHJlc3Npb25fbmFtZSk6ICBGaXggc21hbGwgYnVnLgorCSoganYtbGFuZy5jOiAgVXNlIFRZUEVfVEFHX05BTUUsIG5vdCBUWVBFX05BTUUgZm9yIGNsYXNzIG5hbWVzLgorIAkoX2luaXRpYWxpemVfamF2ZV9sYW5ndWFnZSk6ICBGaXggdHlwbyAoamF2ZSAtPiBqYXZhKS4KKwkoamF2YV9sYW5ndWFnZSk6ICBKYXZhIGRvZXMgKm5vdCogaGF2ZSBDLXN0eWxlIGFycmF5cy4KKwkoamF2YV9jbGFzc19mcm9tX29iamVjdCk6ICBNYWtlIG1vcmUgZ2VuZXJhbCAoYW5kIGNvbXBsaWNhdGVkKS4KKwkoamF2YV9saW5rX2NsYXNzX3R5cGUpOiAgRml4IHR5cG8gInN1cGVyIiAtPiAiY2xhc3MiLiAgSGFuZGxlIGFycmF5cy4KKwkoamF2YV9lbWl0X2NoYXIsIGphdmFfcHJpbnRjaGFyKTogIE5ldyBmdW5jdGlvbi4KKwkoZXZhbHVhdGVfc3ViZXhwX2phdmEgY2FzZSBCSU5PUF9TVUJTQ1JJUFQpOiAgSGFuZGxlIEphdmEgYXJyYXlzLgorCSoganYtdmFscHJpbnQuYyAoamF2YV92YWx1ZV9wcmludCk6ICBJbXBsZW1lbnQgcHJpbnRpbmcgb2YgSmF2YSBhcnJheXMuCisJKGphdmFfcHJpbnRfdmFsdWVfZmllbGRzKTogIE5ldyBmdW5jdGlvbi4KKwkoamF2YV92YWxfcHJpbnQpOiAgQmV0dGVyIHByaW50aW5nIG9mIFRZUEVfQ09ERV9DSEFSLCBUWVBFX0NPREVfU1RSVUNULgorCitGcmkgT2N0ICAzIDA5OjUyOjI2IDE5OTcgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL21pcHMvdG0tbWlwcy5oIChNQUtFX01TWU1CT0xfU1BFQ0lBTCk6IEZvcmNlIE1JUFMxNgorCWFkZHJlc3NlcyB0byBiZSBvZGQuCisJKE1JUFNfRlBVX1NJTkdMRV9SRUdTSVpFLCBNSVBTX0ZQVV9ET1VCTEVfUkVHU0laRSk6IERlZmluZS4KKwkqIG1pcHMtdGRlcC5jIChtaXBzX2V4dHJhY3RfcmV0dXJuX3ZhbHVlKTogRG91YmxlcyBhcmVuJ3QKKwlyZXR1cm5lZCBpbiBGUDAgaWYgRlAgcmVnaXN0ZXJzIGFyZSBzaW5nbGUtcHJlY2lzaW9uIG9ubHkuCisKK01vbiBTZXAgMjkgMjM6MDM6MDMgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBtaXBzLXRkZXAuYyAoc2V0X3JlZ19vZmZzZXQpOiBOZXcgZnVuY3Rpb24uCisJKG1pcHMxNl9oZXVyaXN0aWNfcHJvY19kZXNjKTogQ2FsY3VsYXRlIG9mZnNldHMgb2YgcmVnaXN0ZXJzCisJc2F2ZWQgYnkgZW50cnkgcHNldWRvLW9wIGFmdGVyIHJlc3Qgb2YgcHJvbG9ndWUgaGFzIGJlZW4gcmVhZC4KKwlVc2Ugc2V0X3JlZ19vZmZzZXQgdG8gaWdub3JlIGFsbCBidXQgdGhlIGZpcnN0IHNhdmUgb2YgYSBnaXZlbgorCXJlZ2lzdGVyLgorCShtaXBzMzJfaGV1cmlzdGljX3Byb2NfZGVzYyk6IEluaXRpYWxpemUgZnJhbWUgYWRqdXN0bWVudCB2YWx1ZS4KKwkqIHJlbW90ZS1zaW0uYyAoZ2Ric2ltX3N0b3JlX3JlZ2lzdGVyKTogRG9uJ3QgdXBkYXRlIHJlZ2lzdGVycworCXRoYXQgaGF2ZSBhIG51bGwgb3IgZW1wdHkgbmFtZS4KKwkqIGZpbmR2YXIuYyAocmVhZF9yZWdpc3Rlcl9ieXRlcyk6IERvbid0IGZldGNoIHJlZ2lzdGVycworCXRoYXQgaGF2ZSBhIG51bGwgb3IgZW1wdHkgbmFtZS4KKworVHVlIFNlcCAzMCAxMzozNTo1NCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaCAoTlVNX1JFR1MpOiBEZWZpbmUgY29uZGl0aW9uYWxseS4KKwkoUkVHSVNURVJfTkFNRVMpOiBEaXR0by4KKworRnJpIFNlcCAyNiAyMTowODoyMiAxOTk3ICBLZWl0aCBTZWl0eiAgPGtlaXRoc0BwaXp6YS5jeWdudXMuY29tPgorCisJKiBkc3JlYy5jIChsb2FkX3NyZWMpOiBhZGQgdWlfbG9hZF9wcm9ncmVzc19ob29rIHRvIAorCWRpc3BsYXkgc29tZSBmZWVkYmFjayB0byB1c2VyCisKKwkqIHN5bWZpbGUuYyAoZ2VuZXJpY19sb2FkKTogYWRkIHVpX2xvYWRfcHJvZ3Jlc3NfaG9vayB0bworCWRpc3BsYXkgc29tZSBmZWVkYmFjayB0byB1c2VyCisKK0ZyaSBTZXAgMjYgMTc6MzI6MjIgMTk5NyAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBlcm4uY3lnbnVzLmNvbSkKKworCSogY29tbWFuZC5jIChhZGRfY21kLCBhZGRfc2hvd19mcm9tX3NldCk6IEluc2VydCBuZXcgY29tbWFuZHMgaW4KKwlhbHBoYWJldGljYWwgb3JkZXIuCisKK0ZyaSBTZXAgMjYgMTI6MjI6MDAgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBjb25maWcvbWlwcy10bS1taXBzLmggKG1pcHNfZXh0cmFfZnVuY19pbmZvKTogTmV3IGZyYW1lX2FkanVzdAorCW1lbWJlciBmb3Igc3RvcmluZyBvZmZzZXQgb2YgTUlQUzE2IGZyYW1lIHBvaW50ZXIgZnJvbSBTUC4KKwkqIG1pcHMtdGRlcC5jOiBVc2UgUkFfUkVHTlVNIGluc3RlYWQgb2YgaGFyZGNvZGVkIDMxIHRocm91Z2hvdXQuCisJKFBST0NfRlJBTUVfQURKVVNUKTogRGVmaW5lLgorCShtaXBzMTZfaGV1cmlzdGljX3Byb2NfZGVzYyk6IFN0b3JlIGZyYW1lIHBvaW50ZXIgYWRqdXN0bWVudCB2YWx1ZS4KKwkoZ2V0X2ZyYW1lX3BvaW50ZXIpOiBVc2UgZnJhbWUgcG9pbnRlciBhZGp1c3RtZW50IHZhbHVlIHdoZW4KKwljYWxjdWxhdGluZyBmcmFtZSBhZGRyZXNzLgorCSogcmVtb3RlLXNpbS5jIChnZGJzaW1fZmV0Y2hfcmVnaXN0ZXIpOiBEb24ndCBmZXRjaCByZWdpc3RlcnMKKwl0aGF0IGhhdmUgYSBudWxsIG9yIGVtcHR5IG5hbWUuCisKK0ZyaSBTZXAgMjYgMTI6NDA6NTEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtaXBzLXRkZXAuYyAoX2luaXRpYWxpemVfbWlwc190ZGVwKTogQWxsb3cgdGFyZ2V0IGZpbGVzIHRvCisJb3ZlcnJpZGUgZGVmYXVsdCBGUFUgdHlwZS4KKworRnJpIFNlcCAyNiAxMDozMzo1NCAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS50Z3QgKHY4NTAtKi0qKTogbmVjbXNnLmxpYiBpbnN0ZWFkIG9mIHY4NTAubGliLgorCitXZWQgU2VwIDI0IDE0OjAyOjA5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3Y4NTAvdG0tdjg1MC5oIChCUkVBS1BPSU5UKTogVXNlIDEgd29yZCBESVZIIGluc24gd2l0aAorIAlSUlJSUj0wIGZvciBzaW11bGF0b3IgYnJlYWtwb2ludC4gUHJldmlvdXMgYnJlYWtwb2ludCBpbnNuIHdhcyB0d28KKyAJd29yZHMuCisKK1RodSBTZXAgMTggMTU6MDc6NDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzZXItZTdrcGMuYyAoZ2V0X2RzX2Jhc2UpOiBPbmx5IHVzZSB1bmRlciBXaW5kb3dzLgorCSh3aW5kb3dzLmgpOiBJbmNsdWRlIHdoZW4gYW55IF9XSU4zMiBob3N0LgorCitXZWQgU2VwIDI0IDE4OjEyOjQ3IDE5OTcgIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgorCisJKiBUaGUgZm9sbG93aW5nIGJsb2NrIG9mIGNoYW5nZXMgYWRkIHN1cHBvcnQgZm9yIGRlYnVnZ2luZyBhc3NlbWJseQorCXNvdXJjZSBmaWxlcy4KKwkqIGJyZWFrcG9pbnQuYyAocmVzb2x2ZV9zYWxfcGMpOiAgUHJldmVudCBjcmFzaCB3aGVuIHBjIGlzbid0CisJYXNzb2NpYXRlZCB3aXRoIGEgZnVuY3Rpb24uCisJKiBidWlsZHN5bS5jIChyZWNvcmRfbGluZSBzdGFydF9zeW10YWIgZW5kX3N5bXRhYik6ICBEb24ndCBkZWxldGUKKwlzeW10YWJzIHdoaWNoIG9ubHkgaGF2ZSBsaW5lIG51bWJlcnMgKGJ1dCBubyBvdGhlciBkZWJ1ZyBzeW1ib2xzKS4KKwkqIGRieHJlYWQuYyAocmVhZF9kYnhfc3ltdGFiIGVuZF9wc3ltdGFiKTogIERpdHRvLgorCisJKiByZW1vdGUtc2ltLmM6ICBOZXcgZnVuY3Rpb25zIGdkYnNpbV9pbnNlcnQvcmVtb3ZlX2JyZWFrcG9pbnQuICBVc2UKKwlpbnRyaW5zaWMgc2ltdWxhdG9yIGJyZWFrcG9pbnRzIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGRvIGl0IHRoZQorIAloYXJkIHdheS4KKworCSogY29uZmlndXJlLnRndDogIEFkZCBkMzB2LgorCSogZDMwdi10ZGVwLmM6ICBOZXcgZmlsZS4KKwkqIGNvbmZpZy9kMzB2L2QzMHYubXQsIGNvbmZpZy9kMzB2L3RtLWQzMHYuaDogIE5ldyBmaWxlcy4KKworVHVlIFNlcCAyMyAxMToyNDoxMyAxOTk3ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChBTExDT05GSUcpOiBSZW1vdmUsIGluYWNjdXJhdGUgYW5kIG5ldmVyIHVzZWQuCisKK1R1ZSBTZXAgMjMgMDA6MDg6MTggMTk5NyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBtaXBzLXRkZXAuYyAobWlwc19wdXNoX2FyZ3VtZW50cyk6ICBUd2VhayBhbGlnbm1lbnQgb2YgcmVnaXN0ZXIKKwl2YWx1ZSBpZiB0aGUgcmVtYWluaW5nIGxlbmd0aCBvZiBhIG5vbi1pbnRlZ3JhbCBhcmd1bWVudCBpcyBzbWFsbGVyCisJdGhhbiB0aGUgcmVnaXN0ZXIgc2l6ZSBmb3IgYmlnLWVuZGlhbiBub24tRUFCSSBtb2RlLgorCisJKiByczYwMDAtdGRlcC5jIChicmFuY2hfZGVzdCk6ICBIYW5kbGUgcmV0dXJuIGZyb20gc2lnbmFsCisJaGFuZGxlciBmdW5jdGlvbiB2aWEgc2lncmV0dXJuIGtlcm5lbCBjYWxsLgorCitNb24gU2VwIDIyIDE1OjMyOjA2IDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KKworCSogc3RhYnNyZWFkLmgsIHN5bXRhYi5oLCBkYnhyZWFkLmMsIHN5bXRhYi5jLCBzdGFic3JlYWQuYzoKKwlGaXggcHJvdG90eXBlcy4gIFJlbW92ZSBmdW5jdGlvbiBzY29wZWQgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgorCitGcmkgU2VwIDE5IDE4OjUxOjI2IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2kzODYvd2luZG93cy5taCAoWERFUEZJTEVTKTogbmVlZCB0byBsaXN0IHNvbWUgZmlsZXMKKyAJZXhwbGljaXRseSwgZm9yIG9kZCByZWFzb25zLgorCitUdWUgU2VwIDE2IDIwOjAwOjA1IDE5OTcgIFBlciBCb3RobmVyICA8Ym90aG5lckBjeWdudXMuY29tPgorCisJKiBqdi1leHAueSAocHVzaF9maWVsZG5hbWVzKTogIE5ldywgdG8gaGFuZGxlIEVYUC5GSUVMRDEuLi4uRklFTEROLgorCShwdXNoX2V4cHJlc3Npb25fbmFtZSk6ICBOZXcsIHRvIGhhbmRsZSBleHByZXNzaW9uIG5hbWVzLgorCShwdXNoX3F1YWxpZmllZF9leHByZXNzaW9uX25hbWUpOiAgTmV3LCBmb3IgcXVhbGlmaWVkIGV4cHJlc3Npb24gbmFtZXMuCisJKHBhcnNlX251bWJlcik6ICBGaXggYnVncyBpbiBwYXJzaW5nIG9mIG5vbi1kZWNpbWFsIGludGVnZXJzLgorCSoganYtbGFuZy5oLCBqdi1sYW5nLmMgKGphdmFfZGVtYW5nbGVfdHlwZV9zaWduYXR1cmUpOiAgTmV3LgorCSoganYtbGFuZy5jICh0eXBlX2Zyb21fY2xhc3MpOiAgSnVzdCB1c2UgbmFtZSB3aXRoIGphdmFfbG9va3VwX2NsYXNzLgorCShqYXZhX2xpbmtfY2xhc3NfdHlwZSk6ICBBZGQgZHVtbXkgImNsYXNzIiBmaWVsZC4KKwkoamF2YV9sb29rdXBfdHlwZSk6ICBOZXcuCisJKGV2YWx1YXRlX3N1YmV4cF9qYXZhIGNhc2UgU1RSVUNUT1BfU1RSVUNUKTogIEZvcmNlIHRvIGFkZHJlc3MuCisJKiBqdi10eXBlcHJpbnQuYyAoamF2YV90eXBlX3ByaW50X2Jhc2UpOiAgRG9uJ3QgcHJpbnQgImNsYXNzIiBmaWVsZC4KKwlVc2UgamF2YV9kZW1hbmdsZV90eXBlX3NpZ25hdHVyZSB0byBwcmludCBhcnJheSBjbGFzcyB0eXBlcy4KKwkqIGp2LXZhbHByaW50LmMgKGphdmFfdmFsdWVfcHJpbnQpOiAgUHJlbGltaW5hcnkgYXJyYXkgc3VwcG9ydC4KKwlQcmludCBwb2ludGVyIGFzIFRZUEVASEVYQUREUiwgaW5zdGVhZCBvZiAoVFlQRSkweEhFWEFERFIuCisJKGphdmFfdmFsX3ByaW50KTogIE1vdmUgY2hlY2sgZm9yIG9iamVjdCB0eXBlIHRvIGphdmFfdmFsdWVfcHJpbnQuCisJQ2hlY2sgZm9yIG51bGwuICBQcmludCBwb2ludGVyIGFzIEBIRVhBRERSLCBub3QgMHhIRVhBRERSLgorCisJKiB2YWxvcHMuYyAoc2VhcmNoX3N0cnVjdF9maWVsZCk6ICBTZWFyY2ggYmFzZXNjbGFzc2VzIGluCisJYXNjZW5kaW5nLCBub3QgZGVzY2VuZGluZyBvcmRlci4gIEhhY2sgdG8gYXZvaWQgdmlydHVhbCBiYXNlY2xhc3MKKwlib3RjaCBmb3IgSmF2YSBpbnRlcmZhY2VzLgorCitUdWUgU2VwIDE2IDE5OjU2OjIzIDE5OTcgIFBlciBCb3RobmVyICA8Ym90aG5lckBjeWdudXMuY29tPgorCisJKiB1dGlsLmMgKHJ1bl9jbGVhbnVwX2NoYWluLCBtYWtlX3J1bl9jbGVhbnVwLCBkb19ydW5fY2xlYW51cHMpOgorCU5ldyBjbGVhbnVwIGNsZWFuIGZvciBjbGVhbnVwcyB0byBiZSBydW4gd2hlbiBhdCBlYWNoICdydW4nIGNvbW1hbmQuCisJKiBpbmZjbWQuYyAocnVuX2NvbW1hbmQpOiAgQ2FsbCBkb19ydW5fY2xlYW51cHMuCisKKwkqIHNvbGliLmMgKGZpbmRfc29saWIpOiAgUmVnaXN0ZXIgY2xlYW51cCB0byBjYWxsIGNsZWFyX3NvbGliCisJb24gYSBuZXcgJ3J1bicgY29tbWFuZC4KKwkoc3ltYm9sX2FkZF9zdHViKTogIEZpcnN0IGxvb2sgZm9yIGV4aXN0aW5nIG9iamZpbGUgd2l0aCBzYW1lIG5hbWUuCisKK1R1ZSBTZXAgMTYgMTY6MDA6MDEgMTk5NyAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiByZW1vdGUtc2RzLmMgKHNkc19sb2FkKTogTmV3IGZ1bmN0aW9uLgorCShzZHNfb3BzKTogVXNlIGl0LgorCShzZHNfb3Blbik6IERvbid0IHNldCBpbmZlcmlvcl9waWQgeWV0LgorCShzZHNfa2lsbCk6IFJlbW92ZSBjb250ZW50cy4KKwkoc2RzX2NyZWF0ZV9pbmZlcmlvcik6IFJld3JpdGUgdG8gd29yayBtb3JlIGxpa2UgbW9uaXRvcgorIAlpbnRlcmZhY2VzLgorCShzZHNfcmVzdGFydCk6IFJlbW92ZSwgbm8gbG9uZ2VyIHVzZWQuCisKKwkqIG1vbml0b3IuaCAoTU9fU1JFQ19BQ0tfUExVUywgTU9fU1JFQ19BQ0tfUk9UQVRFKTogTmV3IGZsYWdzLgorCSogbW9uaXRvci5jIChtb25pdG9yX3dhaXRfc3JlY19hY2spOiBBZGQgRElOSzMyLXNwZWNpZmljIGFjayBjb2RlLgorCSogZHNyZWMuYyAobG9hZF9zcmVjKTogQWx3YXlzIHdyaXRlIGEgaGVhZGVyIFMtcmVjb3JkLgorCSogZGluazMyLXJvbS5jIChkaW5rMzJfcmVnbmFtZXMpOiBGaXggdGhlIG5hbWVzIG9mIGZsb2F0IHJlZ2lzdGVycy4KKwkoZGluazMyX2NtZHMpOiBTZXQgdG8gdXNlIFMtcmVjb3JkIGRvd25sb2FkaW5nIHdpdGggYWNrcy4KKwkqIHJlbW90ZS1lc3QuYyAoZXN0X2NtZHMpOiBBZGQgTU9fU1JFQ19BQ0tfUExVUyBmbGFnLgorCitUdWUgU2VwIDE2IDEwOjA4OjI3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3Y4NTAvdG0tdjg1MC5oIChCUkVBS1BPSU5UKTogU2V0IHRvIGEgdHJ1ZWx5IGlsbGVnYWwKKyAJaW5zdHJ1Y3Rpb24uCisKKwkqIGV4ZWMuYyAoZXhlY19maWxlX2NvbW1hbmQpOiBDYWxsIHNldF9hcmNoaXRlY3R1cmVfZnJvbV9maWxlLgorCitNb24gU2VwIDE1IDEzOjAxOjIyIDE5OTcgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogZGJ4cmVhZC5jIChNU1lNQk9MX1NJWkUpOiBOZXcgbWFjcm8uCisJKGVuZF9wc3ltdGFiKTogVXNlIE1TWU1CT0xfU0laRSB0byBleHRyYWN0IHNpemUgZnJvbSBtaW5pbWFsIHN5bWJvbC4KKwkqIGVsZnJlYWQuYyAoZWxmX3N5bXRhYl9yZWFkKTogSWYgRUxGIHN5bWJvbCBpcyAic3BlY2lhbCIsCisJc3VjaCBhcyBhIE1JUFMxNiBmdW5jdGlvbiwgbWFyayBtaW5pbWFsIHN5bWJvbCBhcyBzcGVjaWFsIHRvby4KKwkqIG1pcHMtdGRlcC5jIChwY19pc19taXBzMTYpOiBOZXcgZnVuY3Rpb24gdG8gY2hlY2sgd2hldGhlcgorCWEgZnVuY3Rpb24gaXMgTUlQUzE2IGJ5IGxvb2tpbmcgYXQgdGhlIG1pbmltYWwgc3ltYm9sLiAgVXNlCisJcGNfaXNfbWlwczE2IHRocm91Z2hvdXQgaW5zdGVhZCBvZiBJU19NSVBTMTZfQUREUiBtYWNyby4KKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaCAoU1lNQk9MX0lTX1NQRUNJQUwsIE1BS0VfTVNZTUJPTF9TUEVDSUFMLAorCU1TWU1CT0xfSVNfU1BFQ0lBTCwgTVNZTUJPTF9TSVpFKTogTmV3IGZ1bmN0aW9ucyBmb3Igc2V0dGluZy90ZXN0aW5nCisJInNwZWNpYWwiIE1JUFMxNiBiaXQgaW4gRUxGIGFuZCBtaW5pbWFsIHN5bWJvbHMuCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6IERvbid0IGNvbnN0cnVjdCBhIHBhcnRpYWwKKwlzeW1ib2wgdGFibGUgZm9yIGEgZmlsZSB0aGF0IGFscmVhZHkgaGFzIG9uZS4KKworU2F0IFNlcCAxMyAwODozMjoxMyAxOTk3ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIG1kZWJ1Z3JlYWQuYyAocGFyc2Vfc3ltYm9sLCBoYW5kbGVfcHN5bWJvbF9lbnVtZXJhdG9ycyk6ICBIYW5kbGUKKwl5ZXQgYW5vdGhlciB2YXJpYW50IG9mIGVudW1lcmF0b3IgZGVidWdnaW5nIGluZm8sIHVzZWQgYnkgRFUgNC4wCisJbmF0aXZlIGNjLgorCitUdWUgU2VwICA5IDIwOjQ3OjIzIDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2kzODYvd2luZG93cy5taCAoWERFUEZJTEVTKTogcmVkdWNlIHRvIGxpYndpbmdkYi5hLgorICAJb3RoZXJ3aXNlIGxpbmsgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nLgorCitUdWUgU2VwICA5IDE3OjQxOjQxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc3ltdGFiLmMsIGRieHJlYWQuYywgc3RhYnNyZWFkLmM6IEZpeCB1cCBBTlNJLUMgaXNtcy4gIEZpeAorCXNvbWUgZm9ybWF0dGluZyBwcm9ibGVtcy4KKworTW9uIFNlcCAgOCAxNjo0NTo1MSAxOTk3ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBjeWdudXMuY29tPgorCisJKiBzZXItZTdrcGMuYzogIERvbid0IGluY2x1ZGUgdzMyc3V0LmguICBXZSBubyBsb25nZXIgdXNlIHRoZSBVVAorCW1lY2hhbmlzbS4gIFJlbW92ZSBwcm90b3R5cGVzIGZvciBkb3NfYXN5bmNfKiBmdW5jdGlvbnMuICBUaGV5IGRvbid0CisJZXhpc3QgYW55bW9yZS4KKworTW9uIFNlcCAgOCAxMjo0ODo1MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHRvcC5jIChxdWl0X2NvbmZpcm0sIHF1aXRfZm9yY2UpOiBOZXcgZnVuY3Rpb25zLCBicm9rZW4gb3V0IG9mCisJcXVpdF9jb21tYW5kLgorCShxdWl0X2NvbW1hbmQpOiBKdXN0IGNhbGwgcXVpdF9jb25maXJtIGFuZCBxdWl0X2ZvcmNlLgorCSogdG9wLmggKHF1aXRfY29uZmlybSwgcXVpdF9mb3JjZSk6IERlY2xhcmUuCisKK1N1biBTZXAgIDcgMTc6MjY6MzAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBkYnhyZWFkLmMsIGJ1aWxkc3ltLmMsIHN5bXRhYi5jLCBzdGFic3JlYWQuYzogQWRkIHN1cHBvcnQgZm9yIAorCXJlYWRpbmcgc3RhYnMgZXh0ZW5zaW9ucyBmb3IgbGl2ZSByYW5nZSBpbmZvcm1hdGlvbi4KKwkqIHN0YWJzcmVhZC5oLCBwYXJ0aWFsLXN0YWIuaDogQWRkIHByb3RvdHlwZXMgZm9yIG5ldyBmdW5jdGlvbnMuCisJKiBzeW10YWIuaDogQWRkIHN0cnVjdHVyZSBmb3Igc3RvcmluZyBsaXZlIHJhbmdlIGluZm9ybWF0aW9uLgorCitXZWQgU2VwICAzIDE2OjM5OjM5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogdG9wLmMgKHNldF9hcmNoKTogTmV3IGZ1bmN0aW9uLCB1cGRhdGUgdGFyZ2V0X2FyY2hpdGVjdHVyZS4KKwkKKwkqIGRlZnMuaCwgdG9wLmMgKHNldF9hcmNoaXRlY3R1cmVfZnJvbV9hcmNoX21hY2gpOiBSZXBsYWNlCisgCXNldF9hcmNoaXRlY3R1cmUsIHRha2VzIHRoZSBhcmNoIGFuZCBtYWNoaW5lIGFzIGFyZ3VtZW50cy4KKworCSogc2gzLXJvbS5jIChzaDNlX29wZW4pOiBVcGRhdGUuCisJKHNoM19vcGVuKTogRGl0dG8uCisKK1R1ZSBTZXAgIDIgMTI6MDA6NDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiByZW1vdGUtZTcwMDAuYyAoZTcwMDBfZmV0Y2hfcmVnaXN0ZXJzKTogRml4IHR5cG8sIHN0cmF5IHBhcmVuLgorCShlNzAwMF93YWl0KTogRGl0dG8uCisKK01vbiBTZXAgIDEgMTE6MjE6MDMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiB0b3AuYyAoaW5pdF9tYWluKTogQWRkIGBgc2V0IHByb2Nlc3NvcicnIGFzIGFuIGFsaWFzIGZvciBgYHNldAorIAlhcmNoaXRlY3R1cmUnJy4KKworU2F0IEF1ZyAzMCAxMzo0NDo0OCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3NwYXJjL3NwYXJjbGl0ZS5tdDogUmVtb3ZlZCBzaW11bGF0b3IgcmVmZXJlbmNlcyAoZXJjMzIKKyAJaGFzIGJlZW4gZGlzYWJsZWQpLgorCitUaHUgQXVnIDI4IDEwOjIwOjA0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLWU3MDAwLmMgKGU3MDAwX2ZldGNoX3JlZ2lzdGVycyk6IENoZWNrCisgCXRhcmdldF9hcmNoaXRlY3R1cmUgaW5zdGVhZCBvZiBzaF9wcm9jZXNzb3JfdHlwZS4KKwkoZTcwMDBfd2FpdCk6IERpdHRvLgorCisJKiBjb25maWcvc2gvdG0tc2guaCAoc2hfc2V0X3Byb2Nlc3Nvcl90eXBlKTogRGVsZXRlIHByb3RvdHlwZS4KKworCSogc2gzLXJvbS5jIChzaDNfb3Blbik6IENhbGwgc2V0X2FyY2hpdGVjdHVyZSBub3QKKyAJc2hfc2V0X3Byb2Nlc3Nvcl90eXBlLgorCShzaDNlX29wZW4pOiBEaXR0by4KKworCSogc2gtdGRlcC5jIChzaF9zaG93X3Byb2Nlc3Nvcl90eXBlX2NvbW1hbmQpOiBEZWxldGUuCisJKHNoX3NldF9wcm9jZXNzb3JfdHlwZV9jb21tYW5kKTogRGVsZXRlLgorCShzaF90YXJnZXRfYXJjaGl0ZWN0dXJlX2hvb2spOiBSZW5hbWUgZnJvbSBzaF9zZXRfcHJvY2Vzc29yX3R5cGUsCisgCXVzZSBBUCB0byBkZXRlcm1pbmUgYXJjaGl0ZWN0dXJlLgorCShzaF9zaG93X3JlZ3MpOiBVc2UgYmZkX21hY2hfc2gqIHR5cGVzLgorCisJKiByZW1vdGUtc2ltLmMgKGdkYnNpbV9vcGVuKTogUGFzcyAtLWFyY2g9WFhYIHRvIHNpbXVsYXRvciB3aGVuCisgCWFyY2hpdGVjdHVyZSB3YXMgc3BlY2lmaWVkIGV4cGxpY2l0bHkuCisKKwkqIGRlZnMuaCAodGFyZ2V0X2FyY2hpdGVjdHVyZSwgdGFyZ2V0X2FyY2hpdGVjdHVyZV9hdXRvLAorIAlzZXRfYXJjaGl0ZWN0dXJlLCBzZXRfYXJjaGl0ZWN0dXJlX2Zyb21fZmlsZSk6IERlY2xhcmUuCisJKHRhcmdldF9hcmNoaXRlY3R1cmVfaG9vayk6IEFsbG93IHRhcmdldHMgdG8gYmUgbm90aWZpZWQgb2Ygc2V0CisgCWFyY2ggY29tbWFuZHMuCisJCisJKiB0b3AuYyAoaW5pdF9tYWluKTogQWRkIHNldC9zaG93L2luZm8gYXJjaGl0ZWN0dXJlIGNvbW1hbmRzLgorICAJKHNldF9hcmNoaXRlY3R1cmUsIHNob3dfYXJjaGl0ZWN0dXJlLCBpbmZvX2FyY2hpdGVjdHVyZSk6IE5ldworIAlmdW5jdGlvbnMsIHBhcnNlIHNhbWUuCisJKHNldF9hcmNoaXRlY3R1cmVfZnJvbV9maWxlKTogTmV3IGZ1bmN0aW9uLCBkZXRlcm1pbmUgYXJjaCBmcm9tCisgCUJGRC4KKwkKK1R1ZSBBdWcgMjYgMTc6MTM6NDMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmMgKGdkYnNpbV9vcGVuKTogT25seSBwYXNzIGVuZGlhbm5lc3MgdG8gc2ltX29wZW4KKyAJd2hlbiBzZXQgZXhwbGljaXRseS4gIFByZXBlbmQgZW5kaWFubmVzcyBhcmcgc28gdGhhdCBpdCBjYW4gYmUKKyAJb3ZlcnJpZGRlbi4KKworCSogZGVmcy5oLCB0b3AuYyAodGFyZ2V0X2J5dGVfb3JkZXJfYXV0byk6IE1ha2UgZ2xvYmFsIHdoZW4KKyAJYnl0ZW9yZGVyIGlzIHNlbGVjdGFibGUuCisKK1R1ZSBBdWcgMjYgMTU6MTk6NTYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmMgKGdkYnNpbV9jcmVhdGVfaW5mZXJpb3IpOiBQYXNzIGV4ZWNfYmZkIGludG8KKyAJc2ltX2NyZWF0ZV9pbmZlcmlvci4KKwkoZ2Ric2ltX2NyZWF0ZV9pbmZlcmlvcik6IFBhc3MgLTEgdG8gcHJvY2VlZCwgc2ltX2NyZWF0ZV9pbmZlcmlvcgorIAloYXMgYWxyZWFkeSBzZXQgdGhlIFBDLgorCShnZGJzaW1fY3JlYXRlX2luZmVyaW9yKTogQWxsb3cgZXhlY19maWxlIHRvIGJlIE5VTEwsIG1ha2UgIk5vCisgCWV4ZWMgZmlsZSIgYSB3YXJuaW5nLiAgRGl0dG8gZm9yICJObyBwcm9ncmFtIGxvYWRlZCIuCisKK01vbiBBdWcgMjUgMTc6MDg6MDEgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworICAgICAgICAqIG9jZC5jOiByZXZlcnQgU3VuIGNoYW5nZSAtLSBlbmFibGUgbG9nIGZpbGUgaGFuZGxpbmcKKworTW9uIEF1ZyAyNSAxMjoyMTo0NiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zaW0uYyAoZ2Ric2ltX29wZW4pOiBQYXNzIGV4ZWNfYmZkIHRvIHNpbV9vcGVuIGNhbGwuCisKK1N1biBBdWcgMjQgMjE6MTY6NTkgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworICAgICAgICAqIG9jZC5jOiBjb21tZW50IG91dCBzZWN0aW9ucyB0aGF0IGNyZWF0ZSBhbmQgZmx1c2ggd2lnZ2xlcnMubG9nCisgICAgICAgIGxvZyBmaWxlIHdoZW4gdXNpbmcgdGhlIHdpZ2dsZXIuCisKK1RodSBBdWcgMjEgMTY6MTg6MDggMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworICAgICAgICAqIGNvbmZpZy9wb3dlcnBjL3BwYy1lYWJpLm10OgorICAgICAgICAqIGNvbmZpZy9wb3dlcnBjL3BwYy1zaW0ubXQ6CisgICAgICAgICogY29uZmlnL3Bvd2VycGMvcHBjbGUtZWFiaS5tdDoKKyAgICAgICAgKiBjb25maWcvcG93ZXJwYy9wcGNsZS1zaW0ubXQ6IHNlci1vY2QuYyBuZWVkcyB0byBiZSBiZWZvcmUKKyAgICAgICAgb3RoZXIgb2NkLXJlbGF0ZWQgZmlsZXMgaW4gVERFUEZJTEVTCisKK1RodSBBdWcgMjEgMTQ6NTY6MDQgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworICAgICAgICAqIHBwYy1iZG0uYyAoYmRtX3BwY193YWl0KTogc3RvcCBwcmludGZpbmcgZWNyLCBkZXIKKyAgICAgICAgKiBvY2QuYzogaW5pdGlhbGl6ZSByZW1vdGVfdGltZW91dAorICAgICAgICAob2NkX3dhaXQpOiB3aGlsZSBsb29waW5nLCBjYWxsIG9jZF9kb19jb21tYW5kIHdpdGggT0NEX0FZVCAKKyAgICAgICAgKG9jZF9nZXRfcGFja2V0KTogcmVtb3ZlIGZpbmRfcGFja2V0IGdvdG8uICBJZiB0aGVyZSBpc24ndAorICAgICAgICBhbiAweDU1IGF0IHRoZSBzdGFydCwgc29tZXRoaW5nIGlzIHF1aXRlIHdyb25nIHNvIGVycm9yIG91dAorICAgICAgICBpbnN0ZWFkIG9mIGFkdmFuY2luZyBpbiB0aGUgcGFja2V0IGFuZCB0cnlpbmcgYWdhaW4uICBJZiBjaGVja3N1bQorICAgICAgICBpcyBpbnZhbGlkLCBwcmludCBlcnJvciBtZXNzYWdlIGluc3RlYWQgb2YgdHJ5aW5nIGFnYWluLgorICAgICAgICAqIHNlci1vY2QuYyAob2NkX3JlYWRjaGFyKTogZXJyb3IgaWYgd2UgYXR0ZW1wdCB0byByZWFkIHBhc3QKKyAgICAgICAgdGhlIGVuZCBvZiB0aGUgZnJvbV93aWdnbGVyX2J1ZmZlci4KKworCitXZWQgQXVnIDIwIDE0OjA4OjM5IDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogZGluazMyLXJvbS5jOiBEb24ndCB1c2UgIm1mIiBjb21tYW5kIHRvIGZpbGwsIGlzIHRvbyBwaWNreQorCWFib3V0IGFsaWdubWVudC4KKworCitUdWUgQXVnIDE5IDA4OjQxOjM2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBvYmpmaWxlcy5jIChvYmpmaWxlX3JlbG9jYXRlKTogQWRkIGNhbGwgdG8gYnJlYWtwb2ludF9yZV9zZXQKKwlhZnRlciByZWxvY2F0aW9ucyBhcmUgY29tcGxldGUuCisJKiByZW1vdGUtdnguYyAodnhfYWRkX3N5bWJvbHMpOiBSZW1vdmUgY2FsbCB0byBicmVha3BvaW50X3JlX3NldCwKKwl0aGlzIGlzIG5vdyBkb25lIGluIG9iamZpbGVfcmVsb2NhdGUuCisKK01vbiBBdWcgMTggMTc6Mjk6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiB3aW4zMi1uYXQuYyAoaGFuZGxlX2V4Y2VwdGlvbik6IFJldHVybiBhIHZhbHVlIGluZGljYXRpbmcKKyAJd2hldGhlciB0aGUgZXhjZXB0aW9uIHdhcyBoYW5kbGVkLiAgRG9uJ3QgaGFuZGxlIHJhbmRvbSBleGNlcHRpb25zCisJdGhlIGZpcnN0IHRpbWUgYXJvdW5kLCBzbyB0aGF0IHN0cnVjdHVyZWQgZXhjZXB0aW9uIGhhbmRsaW5nCisJd29ya3MuCisJKGNoaWxkX3dhaXQpOiBDaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIGhhbmRsZV9leGNlcHRpb24uICBTZXQgdGhlCisJY29udGludWVfc3RhdHVzIGFyZ3VtZW50IHRvIENvbnRpbnVlRGVidWdFdmVudCBhY2NvcmRpbmdseS4KKworTW9uIEF1ZyAxOCAxMToxNDoxNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0OiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KKworU3VuIEF1ZyAxNyAyMDozMTo1NyAxOTk3ICBNaWNoYWVsIFNueWRlciAgKG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tKQorCisJKiBtMzJyLXN0dWIuYzogZml4IHR5cG8KKworU3VuIEF1ZyAxNyAxNzozMzozNCAxOTk3ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zZHMuYzogUmVtb3ZlIHVudXNlZCByZW1uYW50cyBvZiByZW1vdGUuYy4KKwkodG9iNjQpOiBSZXR1cm4gdGhlIHJlc3VsdCBsZW5ndGguCisJKHNkc19pbnRlcnJ1cHQpOiBTZW5kIGEgc3RvcCBtZXNzYWdlLgorCShzZHNfd2FpdCk6IEFkZCBkZWJ1ZyBvdXRwdXQgZm9yIHNpZ25hbCBpbnRlcnByZXRhdGlvbiwgZmxhZworCXRoYXQgc2lnbmFsIHdhcyBkdWUgdG8gYSB0cmFwLgorCShzZHNfZmV0Y2hfcmVnaXN0ZXJzKTogRmlsbCB0aGUgcmVnaXN0ZXJzIGFycmF5IGNvcnJlY3RseSBmb3IKKyAJUG93ZXJQQy4KKwkoc2RzX3N0b3JlX3JlZ2lzdGVycyk6IEdldCB0aGUgcmlnaHQgdmFsdWVzIGZyb20gcmVnaXN0ZXJzIGFycmF5LgorCShwdXRtZXNzYWdlKTogVHdlYWsgbGVuZ3RoIGhhbmRsaW5nIHNvIGNoZWNrc3VtIGNvbWVzIG91dCByaWdodC4KKwkoc2RzX2luc2VydF9icmVha3BvaW50LCBzZHNfcmVtb3ZlX2JyZWFrcG9pbnQpOiBEbyBjb3JyZWN0bHkuCisKK0ZyaSBBdWcgMTUgMjA6NTM6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoaW5pdC5jKTogRG9uJ3QgdXNlIHhhcmdzLgorCitGcmkgQXVnIDE1IDEzOjU5OjM3IDE5OTcgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogIEFkZCB0aGUgc3ltYm9scyBmb3IgYW55CisJbmV3bHkgbG9hZGVkIG9iamVjdHMgdXBvbiBhIFRBUkdFVF9XQUlUS0lORF9MT0FERUQgZXZlbnQuCisKKwlSZXdyaXRlIGNvZGUgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgVE9DIGFkZHJlc3MgZm9yIGNhbGxpbmcgZnVuY3Rpb25zCisJaW4gdGhlIGluZmVyaW9yIHVuZGVyIEFJWC4KKwkqIHJzNjAwMC1uYXQuYyAoZmluZF90b2NfYWRkcmVzcyk6ICBOZXcgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lCisJdGhlIHJlcXVpcmVkIFRPQyBhZGRyZXNzIGZyb20gYSBmdW5jdGlvbiBhZGRyZXNzLgorCShfaW5pdGlhbGl6ZV9jb3JlX3JzNjAwMCk6ICBTZXQgdXAgZmluZF90b2NfYWRkcmVzc19ob29rIHRvIHBvaW50CisJdG8gZmluZF90b2NfYWRkcmVzcy4KKwkoeGNvZmZfcmVsb2NhdGVfc3ltdGFiLCB4Y29mZl9yZWxvY2F0ZV9jb3JlKTogIFJlbW92ZQorCWFkZF90ZXh0X3RvX2xvYWRpbmZvIGNhbGxzLgorCShleGVjX29uZV9kdW1teV9pbnNuKTogIENoYW5nZSBwaWQgYW5kIHN0YXR1cyB0byBpbnQgdG8gZ2V0IHJpZCBvZgorCWNvbXBpbGVyIHdhcm5pbmdzLgorCSh4Y29mZl9yZWxvY2F0ZV9zeW10YWIpOiAgQ2FzdCBsZGkgdG8gYGludCAqJyB3aGVuIHBhc3NpbmcgaXQgdG8KKwlwdHJhY2UgdG8gZ2V0IHJpZCBvZiBjb21waWxlciB3YXJuaW5ncy4KKwkqIHJzNjAwMC10ZGVwLmM6ICBBZGQgZGVmaW5pdGlvbiBmb3IgZmluZF90b2NfYWRkcmVzc19ob29rLgorCShyczYwMDBfZml4X2NhbGxfZHVtbXkpOiAgSWYgZmluZF90b2NfYWRkcmVzc19ob29rIGlzIG5vbiB6ZXJvLAorCXBhdGNoIFRPQyBhZGRyZXNzIGxvYWQgY29kZSBpbiB0aGUgY2FsbCBkdW1teSB3aXRoIHRoZSB2YWx1ZQorCXJldHVybmVkIGZyb20gZmluZF90b2NfYWRkcmVzc19ob29rLgorCShzdHJ1Y3QgbG9hZGluZm8sIGxvYWRpbmZvLCBsb2FkaW5mb2xlbiwKKwlsb2FkaW5mb3RleHRpbmRleCwgeGNvZmZfaW5pdF9sb2FkaW5mbywgZnJlZV9sb2FkaW5mbywKKwl4Y29mZl9hZGRfdG9jX3RvX2xvYWRpbmZvLCBhZGRfdGV4dF90b19sb2FkaW5mbywgZmluZF90b2NfYWRkcmVzcyk6CisJUmVtb3ZlLgorCShfaW5pdGlhbGl6ZV9yczYwMDBfdGRlcCk6ICBSZW1vdmUgaW5pdGlhbGl6YXRpb24gb2YKKwljb2ZmX2FkZF90b2NfdG9fbG9hZGluZm9faG9vayBhbmQgeGNvZmZfaW5pdF9sb2FkaW5mb19ob29rLgorCSogeGNvZmZyZWFkLmMgKGNvZmZfYWRkX3RvY190b19sb2FkaW5mb19ob29rLAorCXhjb2ZmX2luaXRfbG9hZGluZm9faG9vayk6ICBSZW1vdmUuCisJKHN0cnVjdCBjb2ZmX3N5bWZpbGVfaW5mbyk6ICBBZGQgdG9jX29mZnNldCBmaWVsZC4KKwkoc2Nhbl94Y29mZl9zeW10YWIpOiAgUmVjb3JkIHRvY19vZmZzZXQgdmFsdWUgaW4gdG9jX29mZnNldCBmaWVsZAorCWluc3RlYWQgb2YgY2FsbGluZyB4Y29mZl9hZGRfdG9jX3RvX2xvYWRpbmZvX2hvb2suCisJKGdldF90b2Nfb2Zmc2V0KTogIE5ldyBmdW5jdGlvbiB0byByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZQorCXRvY19vZmZzZXQgZmllbGQgZm9yIGFuIG9iamVjdCBmaWxlLgorCSh4Y29mZl9pbml0aWFsX3NjYW4pOiAgUmVtb3ZlIGNhbGwgb2YgeGNvZmZfaW5pdF9sb2FkaW5mb19ob29rLgorCSogeGNvZmZzb2xpYi5oIChhZGRfdGV4dF90b19sb2FkaW5mbyk6ICBSZW1vdmUgZGVjbGFyYXRpb24uCisJKiBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oOiAgQWRkIGRlY2xhcmF0aW9ucyBmb3IKKwlmaW5kX3RvY19hZGRyZXNzX2hvb2sgYW5kIGdldF90b2Nfb2Zmc2V0LgorCitXZWQgQXVnIDEzIDE5OjMxOjI4IDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLXNkcy5jOiBOZXcgZmlsZSwgaW50ZXJmYWNlIHRvIFNEUy1jb21wYXRpYmxlIG1vbml0b3JzLgorCSogTWFrZWZpbGUuaW4gKHJlbW90ZS1zZHMubyk6IEFkZCBidWlsZCBydWxlLgorCSogY29uZmlnL3Bvd2VycGMvcHBjLWVhYmkubXQsIGNvbmZpZy9wb3dlcnBjL3BwYy1zaW0ubXQKKyAJKFRERVBGSUxFUyk6IEFkZCByZW1vdGUtc2RzLm8uCisKK1R1ZSBBdWcgMTIgMTQ6Mzc6MTggMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogb2NkLmMgKG9jZF93YWl0KTogbG9vcCB1bnRpbCB3ZSdyZSBpbiBCRE0gbW9kZSBpbnN0ZWFkIG9mCisJYXNzdW1pbmcgY29udHJvbCBoYXMgcmV0dXJuZWQgdG8gR0RCLgorCitNb24gQXVnIDExIDE5OjE2OjA0IDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogZGluazMyLXJvbS5jOiBOZXcgZmlsZSwgc3VwcG9ydCBmb3IgRElOSzMyIG1vbml0b3IuCisJKiBNYWtlZmlsZS5pbiAoZGluazMyLXJvbS5vKTogQWRkIGJ1aWxkIHJ1bGUuCisJKiBjb25maWcvcG93ZXJwYy9wcGMtZWFiaS5tdCwgY29uZmlnL3Bvd2VycGMvcHBjLXNpbS5tdAorIAkoVERFUEZJTEVTKTogQWRkIGRpbmszMi1yb20uby4KKwkqIG1vbml0b3IuaCAoTU9fMzJfUkVHU19QQUlSRUQsIE1PX1NFVFJFR19JTlRFUkFDVElWRSwKKyAJTU9fU0VUTUVNX0lOVEVSQUNUSVZFLCBNT19HRVRNRU1fMTZfQk9VTkRBUlksCisgCU1PX0NMUl9CUkVBS18xX0JBU0VEKTogTmV3IG1vbml0b3IgaW50ZXJmYWNlIGZsYWdzLgorCSogbW9uaXRvci5jOiBVc2UgdGhlbS4KKwkobW9uaXRvcl9zdG9yZV9yZWdpc3Rlcik6IFVzZSBzZXRyZWcudGVybSBpZiBkZWZpbmVkLgorCShtb25pdG9yX2luc2VydF9icmVha3BvaW50LCBtb25pdG9yX3JlbW92ZV9icmVha3BvaW50KTogTm90aWNlCisJaWYgc2V0X2JyZWFrIGFuZCBjbHJfYnJlYWsgZmllbGRzIGFyZSBlbXB0eS4KKworTW9uIEF1ZyAxMSAxNjoyMjozNiAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBvY2QuYyAob2NkX2luc2VydF9icmVha3BvaW50LCBvY2RfcmVtb3ZlX2JyZWFrcG9pbnQpOiBNYWNybworCUJETV9CUkVBS1BPSU5UIGFscmVhZHkgaGFzIGJyYWNlcyBhcm91bmQgaXQsIHJlbW92ZSBlcnJvbmVvdXMgb25lcy4KKwkqIHNlci1vY2QuYyAob2NkX3dyaXRlKTogQ29uZGl0aW9uYWxpemUgb24gX1dJTjMyIGluc3RlYWQgb2YKKwlfX0NZR1dJTjMyX18uCisJKiBjb25maWcvcG93ZXJwYy90bS1wcGMtZWFiaS5oOiBSZW1vdmUgQkRNX05VTV9SRUdTLCBCRE1fUkVHTUFQCisJKiBwcGMtYmRtLmM6IG1vdmUgQkRNX05VTV9SRUdTLCBCRE1fUkVHTUFQIGhlcmUgZnJvbSB0bS5oIGZpbGUsCisJZmlsbCBpbiBkb2MgZmllbGRzIG9mIGJkbV9wcGNfb3BzLgorCShiZG1fcHBjX2ZldGNoX3JlZ2lzdGVycyk6IERvbid0IGFzayBmb3IgaW52YWxpZCByZWdpc3RlcnMgc3VjaAorCWFzIHRoZSBNUSBvciBmbG9hdGluZyBwb2ludCByZWdzIG5vdCBwcmVzZW50IG9uIHBwYyA4eHggYm9hcmRzLgorCShiZG1fcHBjX3N0b3JlX3JlZ2lzdGVycyk6IERvbid0IHdyaXRlIHRob3NlIHNhbWUgaW52YWxpZCByZWdpc3RlcnMuCisJKiBjb25maWcvaTM4Ni9jeWd3aW4zMi5taDogU3RvcCBpbmNsdWRpbmcgb2NkLm8gc2VyLW9jZC5vLgorCSogY29uZmlnL3Bvd2VycGMvcHBjLWVhYmkubXQ6CisJKiBjb25maWcvcG93ZXJwYy9wcGNsZS1lYWJpLm10OgorCSogY29uZmlnL3Bvd2VycGMvcHBjLXNpbS5tdDoKKwkqIGNvbmZpZy9wb3dlcnBjL3BwY2xlLXNpbS5tdDogSW5jbHVkZSBzZXItb2NkLm8uCisKK01vbiBBdWcgMTEgMTY6MDg6NTIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGZyYW1lLmggKGVudW0gbHZhbF90eXBlKTogQ29uZGl0aW9uYWxpemUgb24gX19HTlVDX18KKyAJaW5zdGVhZCBvZiBfX1NURENfXy4KKworU3VuIEF1ZyAxMCAxOTowODoyNiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHV0aWxzLmMgKGVycm9yKTogRml4IHJldHVybiB0eXBlIGZvciAhQU5TSV9QUk9UT1RZUEVTLgorCitTdW4gQXVnIDEwIDE2OjQ5OjA5IDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIG9jZC5jOiBtb3ZlIG9jZF93cml0ZV9ieXRlcyBwcm90byB0byBvY2QuaCBzaW5jZSBpdCBpcyB1c2VkCisJYnkgcHBjLWJkbS5jLCB1c2UgT0NEX0xPR19GSUxFIHRvIGhlbHAgZGVidWdnaW5nLCBkZWZpbmUKKwlCRE1fQlJFQUtQT0lOVCBpZiBub3QgZGVmaW5lZCBpbiB0bS5oCisJKG9jZF9lcnJvcik6IGFkZCBuZXcgZXJyb3IgY2FzZXMKKwkob2NkX3N0YXJ0X3JlbW90ZSk6IHNlbmQgdGhlIE9DRF9JTklUIGNvbW1hbmQgYmVmb3JlCisJT0NEX0FZVCBhbmQgT0NEX0dFVF9WRVJTSU9OIGNhbGxzLCA4MCB3YXMgY29ycmVjdCBzcGVlZCBhZnRlciBhbGwKKwkob2NkX3dyaXRlX2J5dGVzKTogbm8gbG9uZ2VyIHN0YXRpYworCShvY2RfaW5zZXJ0X2JyZWFrcG9pbnQpOiBubyBsb25nZXIgc3RhdGljCisJKG9jZF9yZW1vdmVfYnJlYWtwb2ludCk6IG5ldworCSogb2NkLmg6IGFkZCBwcm90b3MgZm9yIG9jZF93cml0ZV9ieXRlcywgb2NkX2luc2VydF9icmVha3BvaW50LAorCWFuZCBvY2RfcmVtb3ZlX2JyZWFrcG9pbnQKKwkqIHBwYy1iZG0uYzogY2hhbmdlIGJkbV9wcGNfb3BzIHNvIHdlIGNhbGwgb2NkX2luc2VydF9icmVha3BvaW50CisJYW5kIG9jZF9yZW1vdmVfYnJlYWtwb2ludCBpbnN0ZWFkIG9mIG1lbW9yeV9pbnNlcnRfYnJlYWtwb2ludAorCWFuZCBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQuCisgCShiZG1fcHBjX29wZW4pOiBhZnRlciBjYWxsaW5nIG9jZF9vcGVuLCBtb2RpZnkgREVSCisJcmVnaXN0ZXIgc28gaW50ZXJydXB0cyB3aWxsIGRyb3AgdXMgaW50byBkZWJ1Z2dpbmcgbW9kZSwgZmluYWxseQorCWRpc2FibGUgdGhlIHdhdGNoZG9nIHRpbWVyIG9uIHRoZSBib2FyZCBzbyB3ZSBkb24ndCBsZWF2ZSBCRE0KKwltb2RlIHVuZXhwZWN0ZWRseS4KKworU2F0IEF1ZyAgOSAwMTo1MDoxNCAxOTk3ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIHZhbHVlcy5jICh2YWx1ZV9wcmltaXRpdmVfZmllbGQpOiAgQWNjb3VudCBmb3Igb2Zmc2V0IHdoZW4KKwlleHRyYWN0aW5nIHRoZSB2YWx1ZSBvZiBhIGJpdGZpZWxkLgorCUZyb20gUGF1bCBIaWxmaW5nZXIgPGhpbGZpbmdyQENTLkJlcmtlbGV5LkVEVT4uCisKK0ZyaSBBdWcgIDggMjE6MzU6NDQgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBnZGJzZXJ2ZXIvdXRpbHMuYyAoZXJyb3IpOiBDaGFuZ2UgcHJvdG90eXBlIHRvIG1hdGNoIGRlZnMuaC4KKwkqIGdkYnNlcnZlci9sb3ctc2ltLmM6IENoYW5nZSBzaW11bGF0b3IgY2FsbHMgdG8gdXNlIG5ldyBpbnRlcmZhY2UuCisJKiByZW1vdGUuYyAocmVtb3RlX3dyaXRlX2J5dGVzKTogSW5jbHVkZSAnJCcgYXQgc3RhcnQgb2YgcGFja2V0CisJYW5kIGNoZWNrc3VtIGF0IGVuZCBvZiBwYWNrZXQgaW4gb3ZlcmhlYWQgY2FsY3VsYXRpb24uCisKK0ZyaSBBdWcgIDggMTU6NTk6MjQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzZXItb2NkLmM6IElmIF9XSU4zMiwgaW5jbHVkZSA8d2luZG93cy5oPi4KKwkoZGxsX2RvX2NvbW1hbmQpOiBOZXcgc3RhdGljIHZhcmlhYmxlIGlmIF9XSU4zMi4KKwkob2NkX29wZW4pOiBTZXQgZGxsX2RvX2NvbW1hbmQgaWYgX1dJTjMyLgorCShvY2Rfd3JpdGUpOiBVc2UgZGxsX2RvX2NvbW1hbmQgcmF0aGVyIHRoYW4gZG9fY29tbWFuZC4KKwkqIGNvbmZpZy9pMzg2L2N5Z3dpbjMyLm1oIChYREVQRklMRVMpOiBSZW1vdmUgbGlid2lnZ2xlcnMuYS4KKwkoQkRNX0RMTE5BTUUsIEJETV9MSUJOQU1FLCBCRE1fREVGRklMRSk6IERvbid0IGRlZmluZS4KKwkoJChCRE1fTElCTkFNRSkpOiBSZW1vdmUgdGFyZ2V0LgorCSogd2lnZ2xlcnMuZGVmOiBSZW1vdmUuCisKKwkqIGNvbmZpZy9pMzg2L2N5Z3dpbjMyLm1oICgkKEJETV9MSUJOQU1FKSk6IFJlbmFtZSB0YXJnZXQgZnJvbQorCWxpYndpZ2dsZXJzLmRlZi4KKwkobGlid2lnZ2xlcnMuYSk6IFJlbW92ZSB0YXJnZXQuCisKK0ZyaSBBdWcgIDggMTM6MTE6MDEgMTk5NyAgTWlrZSBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9wb3dlcnBjL3BwY3ssbGV9LXtlYWJpLHNpbX0ubXQgKFRERVBGSUxFUyk6IE1ha2Ugc3VyZQorCXBwYy1iZG0ubyBhbmQgb2NkLm8gYXJlIHVzZWQgZm9yIGFsbCBwb3dlcnBjLWVhYmkgdGFyZ2V0cy4KKworVGh1IEF1ZyAgNyAxOTo0MDo1MiAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJQ2hhbmdlcyB0byBPQ0Qgc3VwcG9ydCB0byBzdXBwb3J0IHdpZ2dsZXIgYm94IGFzIHdlbGwgYXMKKwl0YXJnZXQgYm94ZXM6CisJKiBvY2QuYzogY2hhbmdlIHNwZWVkIGluIGluaXQgY29tbWFuZCB0byAwIGZyb20gODAsCisJYWRkICh0ZW1wb3JhcnkpIGxvZ2dpbmcgY29tbWFuZHMgdG8gaGVscCBkZWJ1Z2dpbmcsCisJKG9jZF9vcGVuKTogaWYgInRhcmdldCBvY2Qgd2lnZ2xlciBscHQiIHRoZW4gdXNlIHNwZWNpYWwKKwlzZXItb2NkLmMgc2VyaWFsIGludGVyZmFjZSB3aGljaCBjb21tdW5pY2F0ZXMgd2l0aCBXaWdnbGVycy5kbGwsCisJb3RoZXJ3aXNlICgidGFyZ2V0IG9jZCA8Zm9vPiIpIGRvIGFzIHdlIGRpZCBiZWZvcmUKKwkob2NkX2dldF9wYWNrZXQpOiBhZGQgT0NEX0xPR19GSUxFIGFuZCBPQ0RfU0VUX0NPTk5FQ1RJT04gdG8KKwlzd2l0Y2ggb2Yga25vd24gY29tbWFuZHMgb2YgbGVuIDAKKwkqIG9jZC5oOiBhZGQgT0NEX0xPR19GSUxFCisJKiBzZXJpYWwuYyAoc2VyaWFsX29wZW4pOiBkbyBzZXJpYWxfaW50ZXJmYWNlX2xvb2t1cCBvbiBvY2QKKwlpbiB0aGUgY2FzZSBvZiBvY2QKKwkqIHNlci1vY2QuYzogYWRkIGJ1ZmZlciB0byBjb250YWluIHJlc3BvbnNlcyBmcm9tIHNlbmRpbmcgYQorCWNvbW1hbmQgdG8gdGhlIFdpZ2dsZXJzLmRsbC4KKwkob2NkX3JlYWRjaGFyKTogcmV0dXJuIGN1cnIgY2hhciBmcm9tIGJ1ZmZlciBhbmQgaW5jcmVtZW50IHB0cgorCShvY2Rfd3JpdGUpOiBzZW5kIGJ1ZmZlciB0byBXaWdnbGVycy5kbGwsIHN0b3JpbmcgcmVzcG9uc2UgaW4KKwlyZXR1cm4gYnVmZmVyIGFuZCBpbml0aWFsaXppbmcgY3VyciBsb2NhdGlvbiBwdHIgdG8gc3RhcnQgb2YKKwlidWZmZXIuCisKK1RodSBBdWcgIDcgMTM6Mzk6MzEgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogb2NkLmg6IGFkZCBPQ0RfU0VUX0NPTk5FQ1RJT04KKwkqIG9jZC5jOiByZW5hbWUgImRvX2NvbW1hbmQiIHRvICJvY2RfZG9fY29tbWFuZCIgCisKK1RodSBBdWcgIDcgMTM6MDk6MTcgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCU5vbWVuY2xhdHVyZSBjaGFuZ2UuICBCRE0gaXMgYSBzcGVjaWZpYyB0eXBlIG9mIE9DRAorCShPbiBDaGlwIERlYnVnZ2luZykuICBXaWdnbGVyIGlzIHRoZSBwYXJhbGxlbCBwb3J0IGJveCBjb250cm9sbGVkCisJYnkgV2lnZ2xlcnMuZGxsLiAgVGhlIGZhc3RlciB0YXJnZXQgYm94IGZyb20gTWFjcmFpZ29yIFN5c3RlbXMKKwlpcyBub3QgYSB3aWdnbGVyLiAgCisJKiBvY2QuYzoKKwkqIG9jZC5oOgorCSogcHBjLWJkbS5jOgorCSogc2VyLW9jZC5jOgorCVJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiAid2lnZ2xlcl8iIHdpdGggIm9jZF8iIGFuZCBjaGFuZ2UgbW9zdCBvdGhlcgorCWluc3RhbmNlcyBvZiAid2lnZ2xlciIgdG8gIm9jZCIgb3IgIm9jZCBkZXZpY2UiIGRlcGVuZGluZyBvbiBjb250ZXh0LgorCSogY29uZmlnL202OGsvbW9uaXRvci5tdDogcmVtb3ZlIHJlbW90ZS13aWdnbGVyLm8gZnJvbSBUREVQRklMRVMKKwl1bnRpbCBPQ0Qgd2l0aCB0aGF0IHRhcmdldCBpcyBzdXBwb3J0ZWQgYWdhaW4uCisKK1dlZCBBdWcgIDYgMTY6MTU6MzEgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IGFkZCBETExUT09MID0gQERMTFRPT0xALCBwYXNzIG9uIERMTFRPT0wgdG8KKwlzdWIgbWFrZXMsIGNoYW5nZSBjbGVhbiBydWxlIHRvIGFsc28gcmVtb3ZlICouYSB0byByZW1vdmUKKwlsaWJ3aWdnbGVycy5hLCBpbiBkZXBlbmRlbmNpZXM6IGFkZCBwcGMtYmRtLm8gb2NkLm8gc2VyLW9jZC5vIGFuZAorCXJlbW92ZSByZW1vdGUtd2lnZ2xlci5vCisJKiBjb25maWd1cmUuaW46IGFkZCBETExUT09MIHN1cHBvcnQKKwkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQorCSogd2lnZ2xlcnMuZGVmOiBuZXcgZmlsZSBmb3IgaW1wb3J0cyBmb3Igd2lnZ2xlcnMuZGxsCisJKiBzZXItb2NkLmM6IG5ldyBmaWxlIHdoaWNoIGlzIGxheWVyIGJldHdlZW4gb2NkLmMgYW5kIGVpdGhlciB0aGUKKwl3aWdnbGVycy5kbGwgb3IgdGhlIHRhcmdldCBib3gsIG9ubHkgc3R1YiBzbyBmYXIKKwkqIGNvbmZpZy9wb3dlcnBjL3BwYy1lYWJpLm10OiBhZGQgcHBjLWJkbS5vIHRvIFRERVBGSUxFUworCSogY29uZmlnL3Bvd2VycGMvcHBjLXNpbS5tdDogYWRkIHBwYy1iZG0ubyB0byBUREVQRklMRVMKKwkqIGNvbmZpZy9pMzg2L2N5Z3dpbjMyLm1oOiBhZGQgb2NkLm8gc2VyLW9jZC5vIGxpYndpZ2dsZXJzLmEKKwl0byBYREVQRklMRVMsIGFkZCBydWxlcyB0byBidWlsZCBsaWJ3aWdnbGVycy5hCisKKwljaGVja2luZyBpbiBjaGFuZ2VzIG9mIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGN5Z251cy5jb20+OgorCSogcmVtb3RlLXdpZ2dsZXIuYzogZGVsZXRlCisJKiBvY2QuYzogbmV3LCB3YXMgcmVtb3RlLXdpZ2dsZXIuYworCWFsd2F5cyBpbmNsdWRlIHN5cy90eXBlcy5oLCBpbmNsdWRlIG9jZC5oLCBtb3ZlIFdJR0dMRVIKKwljb21tYW5kcyBhbmQgbWFueSB3aWdnbGVyIHByb3RvdHlwZXMgdG8gb2NkLmgsIG1ha2Ugd2lnZ2xlcl9kZXNjCisJc3RhdGljLCBzdG9wIG1ha2luZyBsb2NhbCB3aWdnbGVyIGZ1bmN0aW9ucyBzdGF0aWMsCisJZGVmaW5lIHdyaXRlX21lbV9jb21tYW5kIGZvciB3aWdnbGVyX3dyaXRlX2J5dGVzCisJKHdpZ2dsZXJfc3RhcnRfcmVtb3RlKTogc3RvcCBoYXJkY29kaW5nIHRoZSB0YXJnZXQgdHlwZSwKKwlpbnN0ZWFkIHNldCBhbmQgdXNlIGEgdGFyZ2V0X3R5cGUgdmFyaWFibGUuCisJKHdpZ2dsZXJfb3Blbik6IGFkZCBuZXcgdGFyZ2V0X3R5cGUgYW5kIG9wcyBhcmdzCisJKHdpZ2dsZXJfd2FpdCk6IG5vdyBubyBsb25nZXIgdGFrZXMgcGlkIGFuZCB0YXJnZXRfc3RhdHVzIGFzIGFyZ3MsCisJc3RvcCB0cnlpbmcgdG8gc2V0IHRhcmdldF9zdGF0dXMgc3RydWN0LCByZW1vdmUgQkdORCBpbnNuCisJY2hlY2tzCisJKHJlYWRfYmRtX3JlZ2lzdGVycyk6IHJlbmFtZWQgdG8gd2lnZ2xlcl9yZWFkX2JkbV9yZWdpc3RlcnMJCisJKHdpZ2dsZXJfcmVhZF9iZG1fcmVnaXN0ZXJzKTogbnVtcmVncyBhcmcgY2hhbmdlZCB0byByZWdsZW4gYXJnLAorCXJlbW92ZSBwa3RsZW4gY2hlY2ssIHNldCByZWdsZW4gaW5zdGVhZCBvZiBudW1yZWdzIAorCShkdW1wX2FsbF9iZG1fcmVncyk6IGRlbGV0ZQorCSh3aWdnbGVyX2ZldGNoX3JlZ2lzdGVycyk6IGRlbGV0ZQorCSh3aWdnbGVyX3ByZXBhcmVfdG9fc3RvcmUpOiBub3cganVzdCBhbiBlbXB0eSBmdW5jdGlvbgorCSh3aWdnbGVyX3N0b3JlX3JlZ2lzdGVycyk6IGRlbGV0ZQorCSh3aWdnbGVyX3JlYWRfYmRtX3JlZ2lzdGVyKTogbmV3CisJKHdpZ2dsZXJfd3JpdGVfYmRtX3JlZ2lzdGVycyk6IG5ldworCSh3aWdnbGVyX3dyaXRlX2JkbV9yZWdpc3Rlcik6IG5ldworCSh3aWdnbGVyX3dyaXRlX2J5dGVzKTogdXNlIHdyaXRlX21lbV9jb21tYW5kIHZhcmlhYmxlIGluc3RlYWQgb2YKKwlXSUdHTEVSX1dSSVRFX01FTQorCShnZXRfcGFja2V0KTogcmVuYW1lZCB0byB3aWdnbGVyX2dldF9wYWNrZXQsIGNoYW5nZSByZWZzIHRocm91Z2hvdXQKKwkocHV0X3BhY2tldCk6IHJlbmFtZWQgdG8gd2lnZ2xlcl9wdXRfcGFja2V0LCBjaGFuZ2UgcmVmcyB0aHJvdWdob3V0CisJKHdpZ2dsZXJfZ2V0X3BhY2tldCk6IGFkZCBicmVhayB0byBkZWZhdWx0IGNhc2Ugb2Ygc3dpdGNoLAorCWNoYW5nZSBsZW5ndGggb2YgV0lHR0xFUl9HRVRfVkVSU0lPTiBsZW4gdG8gMTAgZnJvbSA0IHRvIG1hdGNoCisJc3BlY3MKKwkod2lnZ2xlcl9tb3Vybik6IHVucHVzaF90YXJnZXQgd2l0aCBjdXJyZW50X29wcywgbm90ICZ3aWdnbGVyX29wcworCShmbGFzaF94ZmVyX21lbW9yeSk6IGRlbGV0ZQorCShub29wX3N0b3JlX3JlZ2lzdGVycyk6IG5ldyBwbGFjZWhvbGRlciByZXBsYWNlbWVudCBmb3IKKwl0YXJnZXRfc3RvcmVfcmVnaXN0ZXJzKCkgd2hpY2ggcHJldmVudHMgZ2VuZXJpY19sb2FkIGZyb20gdHJ5aW5nIHRvCisJc2V0IHVwIHRoZSBQQy4KKwkoYmRtX3VwZGF0ZV9mbGFzaF9jb21tYW5kKTogYWRkIHN0b3JlX3JlZ2lzdGVyc190bXAgdmFyaWFibGUsCisJbWFrZSBoYW5kbGluZyBvZiB3aWdnbGVyX29wcyBtb3JlIGdlbmVyaWMgLS0gZGVmaW5lIHdpZ2dsZXJfb3BzCisJaW4gYSB0YXJnZXQtc3BlY2lmaWMgZmlsZSBpbnN0ZWFkIChzdWNoIGFzIHBwYy1iZG0uYyBpbiB0aGUgY2FzZQorCW9mIHRoZSBwcGMpLCB1c2UgY3VycmVudF90YXJnZXQgdG8gZGVhbCB3aXRoIHJlZ2lzdGVycyBhZ2FpbgorCW1ha2luZyB0aGlzIGZpbGUgbGVzcyB0YXJnZXQtc3BlY2lmaWMuCisJKGJkbV9yZWFkX3JlZ2lzdGVyX2NvbW1hbmQpOiBuZXcKKwkoX2luaXRpYWxpemVfcmVtb3RlX3dpZ2dsZXIpOiBzdG9wIGRvaW5nIGFkZF90YXJnZXQgKCZ3aWdnbGVyX29wcyksCisJY29tbWVudCBvdXQgYWRkX2NtZCAoInJlYWQtcmVnaXN0ZXIiLCAuLi4pCisJKiBvY2QuaDogbmV3LCBjb250YWlucyBjb21tb24gd2lnZ2xlciBwcm90b3R5cGVzLCBjb21tYW5kIGRlZmluaXRpb25zCisJKiBwcGMtYmRtLmM6IGZpbGUgZm9yIHBwYy1zcGVjaWZpYyBPQ0QgY29kZSwgaW5jbHVkaW5nIHRhcmdldF9vcHMKKwlzdHJ1Y3R1cmUgZm9yIHBwYyBiZG0KKwkoYmRtX3BwY19vcGVuKTogbmV3CisJKGJkbV9wcGNfd2FpdCk6IG5ldworCShiZG1fcHBjX2ZldGNoX3JlZ2lzdGVycyk6IG5ldworCShiZG1fcHBjX3N0b3JlX3JlZ2lzdGVyc186IG5ldworCShfaW5pdGlhbGl6ZV9iZG1fcHBjKTogbmV3CisJKiBjb25maWcvcG93ZXJwYy90bS1wcGMtZWFiaS5oOiBhZGQgbmVjZXNzYXJ5IENQVTMyIEJETSBkZWZpbmVzCisKK1dlZCBBdWcgIDYgMDA6MjQ6MDggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBocHJlYWQuYyAoaHByZWFkX3JlYWRfc3RydWN0X3R5cGUpOiBVc2UgYWNjZXNzb3IgbWFjcm9zIHJhdGhlcgorCXRoYW4gZGlyZWN0bHkgbXVja2luZyBhcm91bmQgd2l0aCBkYXRhIHN0cnVjdHVyZXMuCisKK1R1ZSBBdWcgIDUgMTM6Mzc6MTQgMTk5NyAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGN5Z251cy5jb20+CisKKwkqIGdkYnR5cGVzLmg6ICBSZS1pbnRlcnByZXQgc3RydWN0IGZpZWxkLiAgU3VwcHBvcnQgYWRkcmVzcyBvZiBzdGF0aWMuCisJQWRkIGEgYnVuY2ggb2YgbWFjcm9zLgorCSogY29mZnJlYWQuYywgZHdhcmYycmVhZC5jLCBkd2FyZnJlYWQuYywgbWRlYnVncmVhZC5jLCBzdGFic3JlYWQuYzoKKwlVcGRhdGUgdG8gdXNlIG5ldyBtYWNyb3MuCisJKiBjb2ZmcmVhZC5jLCBocHJlYWQuYywgc3RhYnNyZWFkLmM6ICBSZW1vdmUgYnVndXMgVFlQRV9GSUVMRF9WQUxVRS4KKwkqIHZhbHVlLmgsIHZhbHVlcy5jICh2YWx1ZV9zdGF0aWNfZmllbGQpOiAgTmV3IGZ1bmN0aW9uLgorCSogY3AtdmFscHJpbnQuYywgdmFsb3BzLmM6ICBNb2RpZnkgdG8gdXNlIHZhbHVlX3N0YXRpY19maWVsZC4KKworCSoganYtbGFuZy5jIChnZXRfamF2YV91dGY4X25hbWUpOiAgUmUtd3JpdGUgc28gaXQgd29ya3Mgd2l0aAorCWltcGxpZWQgKG1pc3NpbmcpIGRhdGEgZmllbGQsIGFzIGRlZmluZWQgYnkgY2MxamF2YS4KKwkoamF2YV9saW5rX2NsYXNzX3R5cGUpOiAgVHlwZSBsZW5ndGggYW5kIGZpZWxkIG9mZnNldCAoaW4gaW50ZXJpb3IpCisJbm93IGluY2x1ZGVzIG9iamVjdCBoZWFkZXIuICBHZXQgc3RhdGljIGZpZWxkcyB3b3JraW5nLgorCSoganYtbGFuZy5oIChKQVZBX09CSkVDVF9TSVpFKTogIFVwZGF0ZSBmb3IgY2hhbmdlIGluIEthZmZlLgorCSoganYtdHlwZXByaW50LmMgKGphdmFfdHlwZV9wcmludF9kZXJpdmF0aW9uX2luZm8sCisJamF2YV90eXBlX3ByaW50X2Jhc2UpOiAgTmV3IGZ1bmN0aW9ucywgZm9yIGJldHRlciBKYXZhIG91dHB1dC4KKwkqIGp2LXZhbHByaW50LmM6ICBTdGFydCB0byBzdXBwb3J0IEphdmEtc3BlY2lmaWMgb3V0cHV0LgorCitTdW4gQXVnICAzIDA4OjE4OjA5IDE5OTcgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogYy12YWxwcmludC5jIChjX3ZhbF9wcmludCk6ICBVc2UgZXh0cmFjdF9hZGRyZXNzIHRvIHJldHJpZXZlCisJdGhlIGFkZHJlc3Mgb2YgdGhlIHZpcnR1YWwgZnVuY3Rpb24uCisJRnJvbSBQZXRlciBCbG9lY2hlciAoUGV0ZXIuQmxvZWNoZXJAZWVkbi5lcmljc3Nvbi5zZSkuCisKKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwX3N0YW5kYXJkKSwgdmFsYXJpdGguYyAodmFsdWVfeF91bm9wKToKKwlIYW5kbGUgQysrIG9wZXJhdG9yICouCisKK0ZyaSBBdWcgIDEgMTU6MjE6NDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBjeWd3aW4zMiBlbnZpcm9ubWVudC4gIERlZmluZSBhbmQKKwlzdWJzdGl0dXRlIFdJTjMyTElCUyBhbmQgV0lOMzJMREFQUC4gIEFsd2F5cyBzZXQgY29uZmlnZGlyIHRvCisJdW5peDsgc2V0dGluZyBpdCB0byB3aW4gd2FzIGZvciBhbiBvbGQgVGNsL1RrIGNvbmZpZ3VyYXRpb24KKwlzY2hlbWUuCisJKiBNYWtlZmlsZS5pbiAoVEtfQ0ZMQUdTKTogQWRkIEBUS19CVUlMRF9JTkNMVURFU0AuCisJKFdJTjMyTERBUFAsIFdJTjMyTElCUyk6IERlZmluZS4KKwkoQ0xJQlMpOiBBZGQgJChXSU4zMkxJQlMpLgorCShnZGIpOiBVc2UgJChXSU4zMkxEQVBQKS4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworVGh1IEp1bCAzMSAxNTo0MDoxOSAxOTk3ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAY3lnbnVzLmNvbT4KKworCSogc3ltdGFiLmggKFNZTUJPTF9JTklUX0xBTkdVQUdFX1NQRUNJRklDLCBTWU1CT0xfSU5JVF9ERU1BTkdMRURfTkFNRSwKKwlTWU1CT0xfREVNQU5HTEVEX05BTUUpOiAgQWRkIGRlbWFuZ2xpbmcgc3VwcG9ydCBmb3IgSmF2YS4KKwkqIHV0aWxzLmMgKGZwcmludGZfc3ltYm9sX2ZpbHRlcmVkKTogIEhhbmRsZSBsYW5ndWFnZV9qYXZhLgorCisJKiBzeW10YWIuYyAoZGVjb2RlX2xpbmVfMSk6ICBIYW5kbGUgSmF2YS1zdHlsZSBwYWNrYWdlLmNsYXNzLm1ldGhvZC4KKworV2VkIEp1bCAzMCAxNDowNDoxOCAxOTk3ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAY3lnbnVzLmNvbT4KKworCSogamF2YS0qOiAgUmVuYW1lZCB0byBqdi0qLCB0byBtYWtlIGZpdCB3aXRoaW4gMTQgY2hhcmFjdGVycy4KKwkqIGp2LWxhbmcuaCAoamF2YV90eXBlX3ByaW50KTogIEFkZGVkIGRlY2xhcmF0aW9uLgorCSoganYtdHlwZXByaW50LmM6ICBOZXcgZmlsZS4gIFByb3ZpZGVzIGphdmFfcHJpbnRfdHlwZS4KKwkqIGp2LWxhbmcuYyAoamF2YV9saW5rX2NsYXNzX3R5cGUpOiAgTmV3IGZ1bmN0aW9uLgorCShqYXZhX2xhbmd1YWdlX2RlZm4pOiAgUmVwbGFjZSBjX3ByaW50X3R5cGUgYnkgamF2YV9wcmludF90eXBlLgorCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgYWNjb3JkaW5nbHkuCisKK1R1ZSBKdWwgMjkgMTA6MTI6NDQgMTk5NyAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoaW5pdC5jKTogZXhjZXB0IHNvbWUgbXN3aW4gZmlsZXMgZG8gbmVlZCB0byBiZQorIAlzY2FubmVkLiAgb2ggd2VsbC4KKworTW9uIEp1bCAyOCAxNDowNDozOSAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChpbml0LmMpOiBkb24ndCB0cnkgdG8gc2NhbiBtc3dpbiBmb3IgX2luaXRpYWxpemUKKyAJZnVuY3MuICAoZ2VuZXJhdGVzIG1pc2xlYWRpbmcgZXJyb3IgbWVzc2FnZSBiZWNhdXNlIGZpbGVzIGhhdmUKKyAJLmNwcCBzdWZmaXgsIG5vdCAuYyBzdWZmaXgpCisKK01vbiBKdWwgMjggMTM6Mjc6MjEgMTk5NyAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgorCisJKiBzZXItZTdrcGMuYzogPHczMnN1dC5oPiAtPiAibXN3aW4vdzMyc3V0LmgiCisKK01vbiBKdWwgMjggMDI6NTQ6MzEgMTk5NyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiB4Y29mZnJlYWQuYyAoY29mZl9nZXRmaWxlbmFtZSk6ICBEbyBub3Qgc3RyaXAgZGlyZWN0b3J5IGNvbXBvbmVudAorCW9mIGZpbGVuYW1lLgorCitGcmkgSnVsIDI1IDE1OjE2OjE1IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KKworCSogbW9uOTYwLXJvbS5jOiByZW1vdmVkIHVudXNlZCAjaW5jbHVkZXM7IG5vIGlvY3RsLmggaW4gV2luZG93cy4KKwkqIG5pbmR5LXNoYXJlL3R0eWZsdXNoLmM6IGZpbmQgc2xlZXAoKSBmb3IgX01TQ19WRVIuCisJKiByZW1vdGUtYXJyYXkuYzogI2luY2x1ZGUgPGN0eXBlLmg+IGZvciBpc2FzY2lpKCkuCisJKiB1dGlscy5jIChub3RpY2VfcXVpdCxwb2xscXVpdCk6IGNsZWFudXAuICBfV0lOMzIgLT4gX01TQ19WRVIuCisKK0ZyaSBKdWwgMjUgMTY6NDg6MTggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiB0b3AuYyAoZXhlY3V0ZV9jb21tYW5kKTogRm9yY2UgY2xlYW51cCBvZiBhbGxvY2EgYXJlYXMuCisJKiBmaW5kdmFyLmMgKHJlZ2lzdGVyc19jaGFuZ2VkKTogTGlrZXdpc2UuCisKK0ZyaSBKdWwgMjUgMTU6Mzc6MTUgMTk5NyAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AY3lnbnVzLmNvbT4KKworCSogdjg1MGljZS5jOiAgSW5jbHVkZSA8d2luZG93cy5oPi4gIFN1cHBvcnQgbmV3IHY4NTAgRExMIGludGVyZmFjZS4KKwkqIEFkZCBkZWZzIGZvciB0YXJnZXQgc3RhdHVzLgorCitUdWUgSnVsIDIyIDEyOjExOjQ4IDE5OTcgIE1pY2hhZWwgU255ZGVyICAobXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taXBzL3RtLW1pcHM2NC5oOiBsb25ncywgbG9uZyBsb25ncywgYW5kIHBvaW50ZXJzCisJYXJlIGFsbCA2NCBiaXRzIG9uIEVBQkkgbWlwcyB0YXJnZXRzLgorCitUaHUgSnVsIDE3IDExOjM4OjQ2IDE5OTcgIE1pY2hhZWwgU255ZGVyICAobXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20pCisKKwkqIHBhcnRpYWwtc3RhYi5oIChjYXNlIE5fQklOQ0wpOiBkZXRlY3QgbWlzc2luZyBwYXJ0aWFsIHN5bXRhYi4KKwkqIGRieHJlYWQuYzogQWRkIGEgY29tcGxhaW50IGZvciBOX0JJTkNMIHdpdGhvdXQgYSBjb3JyZXNwb25kaW5nCisJcGFydGlhbCBzeW10YWIuICBSZW1vdmUgZWFybGllciBjaGFuZ2Ugb2YgNS8yNy85Ny4KKworV2VkIEp1bCAxNiAxMDozODowMyAxOTk3ICBNaWNoYWVsIFNueWRlciAgKG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tKQorCisJKiBzb2wtdGhyZWFkLmMgKHNvbF90aHJlYWRfW3N0b3JlLCBmZXRjaF1fcmVnaXN0ZXJzKTogaWYgCisJaW5mZXJpb3JfcGlkIGlzIGFuIExXUCByYXRoZXIgdGhhbiBhIFNvbGFyaXMgdGhyZWFkLCBsZXQKKwlwcm9jZnMgaGFuZGxlIHRoZSByZXF1ZXN0LgorCShyd19jb21tb24sIHNvbF90aHJlYWRfeGZlcl9tZW1vcnkpOiBwcm9jZnNfeGZlcl9tZW1vcnkgd2lsbAorCW9ubHkgd29yayBpZiBpbmZlcmlvcl9waWQgcG9pbnRzIHRvIGFuIExXUCAocmF0aGVyIHRoYW4gYSAKKwlTb2xhcmlzIHRocmVhZCkuICBVc2UgcHJvY2ZzX2ZpcnN0X2F2YWlsYWJsZSB0byBmaW5kIGEgZ29vZCBMV1AuCisJKGluZm9fc29sdGhyZWFkcyk6IGFkZGVkIGEgbWFpbnRlbmFuY2UgY29tbWFuZCB0byBsaXN0IGFsbCAKKwlrbm93biBTb2xhcmlzIHRocmVhZHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMuCisJKiBtaXBzLXRkZXAuYyAobWlwc19kb19yZWdpc3RlcnNfaW5mbyk6IENvbXBsZXRlbHkgY2hhbmdlZCB0aGUKKwlvdXRwdXQgZm9ybWF0IHRvIGJlIG5lYXQgYW5kIGNvbHVtbmFyLiAgQWRkZWQgdGhlIGhlbHBlciBmdW5jcworCWRvX2ZwX3JlZ2lzdGVyX3JvdyBhbmQgZG9fZ3BfcmVnaXN0ZXJfcm93LiAgQWxzbyBzbWFsbCBtb2RzIHRvCisJbWlwc19wcmludF9yZWdpc3Rlciwgd2hpY2ggaXMgc3RpbGwgdXNlZCB0byBwcmludCBhIHNpbmdsZSByZWcuCisKK01vbiBKdWwgMTQgMTg6MDI6NTMgMTk5NyAgTWljaGFlbCBTbnlkZXIgIChtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbSkKKworCSogcHJvY2ZzLmMgKHdhaXRfZmQpOiBIYW5kbGUgYW4gZmQgdGhhdCBoYXMgImh1bmcgdXAiIG9yIAorCW90aGVyd2lzZSB0ZXJtaW5hdGVkIChTb2xhcmlzIHRocmVhZHMpLgorCitUaHUgSnVsIDEwIDAwOjAyOjQxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBjeWdudXMuY29tPgorCisJKiBkZWZzLmggKGluaXRfdWlfaG9vayk6IENoYW5nZSBwcm90b3R5cGUgdG8gYWNjZXB0IG9uZSBhcmcuCisJKiBtYWluLmMgKGdkYl9pbml0KTogQ2hhbmdlIHByb3RvdHlwZSB0byBhY2NlcHQgb25lIGFyZy4KKwkqIHRvcC5jIChnZGJfaW5pdCk6IEFjY2VwdHMgb25lIGFyZ3VtZW50IHdoaWNoIGl0IHVzZXMgdG8KKwljYWxsICgqaW5pdF91aV9ob29rKS4KKworRnJpIEp1bCAgNCAxNDo0OTozMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHNvdXJjZS5jIChPUEVOX01PREUsIEZET1BFTl9NT0RFKTogRGVmaW5lOyB2YWx1ZSBkZXBlbmRzIHVwb24KKwl3aGV0aGVyIENSTEZfU09VUkNFX0ZJTEVTIGlzIGRlZmluZWQuCisJKG9wZW5fc291cmNlX2ZpbGUpOiBVc2UgT1BFTl9NT0RFIHdpdGggb3BlbiBhbmQgb3BlbnAuCisJKHByaW50X3NvdXJjZV9saW5lcyk6IFVzZSBGRE9QRU5fTU9ERSB3aXRoIGZkb3Blbi4gIElmCisJQ1JMRl9TT1VSQ0VfRklMRVMgaXMgZGVmaW5lZCwgaWdub3JlIFxyIGNoYXJhY3RlcnMuCisJKGZvcndhcmRfc2VhcmNoX2NvbW1hbmQpOiBVc2UgRkRPUEVOX01PREUgd2l0aCBmZG9wZW4uCisJKHJldmVyc2Vfc2VhcmNoX2NvbW1hbmQpOiBMaWtld2lzZS4KKwkqIGNvbmZpZy9pMzg2L3htLWN5Z3dpbjMyLmggKENSTEZfU09VUkNFX0ZJTEVTKTogRGVmaW5lLgorCShMU0VFS19OT1RfTElORUFSKTogRG9uJ3QgZGVmaW5lLgorCitUaHUgSnVsICAzIDE3OjQxOjQ2IDE5OTcgIE1pY2hhZWwgU255ZGVyICAobXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20pCisKKwkqIG1pcHMtdGRlcC5jIChtaXBzX2V4dHJhY3RfcmV0dXJuX3ZhbHVlKTogYWxpZ24gNC1ieXRlIGZsb2F0CisJcmV0dXJuIHZhbHVlcyB3aXRoaW4gdGhlIDgtYnl0ZSBGUCByZWdpc3Rlci4KKworVGh1IEp1bCAgMyAxMzo0ODoxMSAxOTk3ICBNaWNoYWVsIFNueWRlciAgKG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tKQorCisJKiBtaXBzLXRkZXAuYyAobWlwc19wdXNoX2FyZ3VtZW50cyk6IGRvbid0IGxlZnQtYWRqdXN0IDMyLWJpdAorCWludGVnZXJzIGluIDY0LWJpdCByZWdpc3RlciBwYXJhbWV0ZXJzIGJlZm9yZSBmdW5jdGlvbiBjYWxscy4KKworTW9uIEp1biAzMCAxNzo1NDo1MSAxOTk3ICBNaWNoYWVsIFNueWRlciAgKG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tKQorCisJKiBtaXBzLXRkZXAuYyAobWlwc19wdXNoX2FyZ3VtZW50cyk6IHNwZWNpYWwtY2FzZSBoYW5kbGluZyBmb3IKKwlvZGQtc2l6ZWQgc3RydWN0IHBhcmFtZXRlcnMgcGFzc2VkIGluIHJlZ2lzdGVycyAvIG9uIHN0YWNrLgorCitNb24gSnVuIDMwIDE1OjMwOjM4IDE5OTcgIE1pY2hhZWwgU255ZGVyICAobXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20pCisKKwkqIG1pcHMtdGRlcC5jIChtaXBzX3B1c2hfYXJndW1lbnRzKTogdHdlYWsgYWxpZ25tZW50IG9mIHNtYWxsCisJc3RydWN0cyBwYXNzZWQgaW4gcmVnaXN0ZXJzIGZvciBsaXR0bGUtZW5kaWFuIG5vbi1FQUJJIG1vZGUuCisKK01vbiBKdW4gMzAgMTM6MDU6MzkgMTk5NyAgTWljaGFlbCBTbnlkZXIgIChtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbSkKKworCSogYnJlYWtwb2ludC5jIChmcmFtZV9pbl9kdW1teSk6IHVzZSBnZW5lcmljIGR1bW15IGlmIGF2YWlsYWJsZS4KKwkgIChjaGVja19kdXBsaWNhdGVzLCBjbGVhcl9jb21tYW5kKTogY29tcGFyZSBzZWN0aW9ucyBvbmx5IGlmCisJICBkb2luZyBvdmVybGF5IGRlYnVnZ2luZy4KKworRnJpIEp1biAyNyAyMzowMzo1MyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAbmluZW1vb25zLmNvbT4KKworCSogYnVpbGRzeW0uaCAoc3RydWN0IHN1YmZpbGUpOiBBZGQgZGVidWdmb3JtYXQgbWVtYmVyLgorCShyZWNvcmRfZGVidWdmb3JtYXQpOiBEZWNsYXJlIGdsb2JhbCBmdW5jdGlvbi4KKwkqIGJ1aWxkc3ltLmMgKHN0YXJ0X3N1YmZpbGUpOiBJbml0aWFsaXplIGRlYnVnZm9ybWF0IG1lbWJlcgorCXRvIE5VTEwuCisJKHJlY29yZF9kZWJ1Z2Zvcm1hdCk6IE5ldyBmdW5jdGlvbiB0byByZWNvcmQgdGhlIGZvcm1hdC4KKwkoZW5kX3N5bXRhYik6IENvcHkgZm9ybWF0IGludG8gc3ltdGFiIGRlYnVnZm9ybWF0IG1lbWJlci4KKwkoZW5kX3N5bXRhYik6IEZyZWUgc3ViZmlsZSBkZWJ1Z2Zvcm1hdCBtZW1iZXIuCisJKiBzeW1taXNjLmMgKGZyZWVfc3ltdGFiKTogRnJlZSBkZWJ1Z2Zvcm1hdCB3aGVuIGZyZWVpbmcKKwlzeW10YWIuCisJKiBzeW1maWxlLmMgKGFsbG9jYXRlX3N5bXRhYik6IEluaXRpYWxpemUgdGhlIG5ldyBkZWJ1Z2Zvcm1hdAorCW1lbWJlciBmb3IgbmV3IHN5bXRhYnMuCisJKiBzeW10YWIuaCAoc3RydWN0IHN5bXRhYik6IEFkZCBkZWJ1Z2Zvcm1hdCBtZW1iZXIuCisJKiBzb3VyY2UuYyAoc291cmNlX2luZm8pOiBQcmludCB0aGUgZGVidWcgZm9ybWF0LgorCisJKiBvczlrcmVhZC5jIChvczlrX3Byb2Nlc3Nfb25lX3N5bWJvbCk6IENhbGwgcmVjb3JkX2RlYnVnZm9ybWF0CisJd2l0aCAiT1M5Ii4KKwkqIGhwcmVhZC5jIChocHJlYWRfZXhwYW5kX3N5bXRhYik6IENhbGwgcmVjb3JkX2RlYnVnZm9ybWF0CisJd2l0aCAiSFAiLgorCShocHJlYWRfcHJvY2Vzc19vbmVfZGVidWdfc3ltYm9sKTogRGl0dG8uCisJKiBkYnhyZWFkLmMgKHByb2Nlc3Nfb25lX3N5bWJvbCk6IENhbGwgcmVjb3JkX2RlYnVnZm9ybWF0CisJd2l0aCAic3RhYnMiLgorCSogY29mZnJlYWQuYyAoY29mZl9zdGFydF9zeW10YWIpOiBDYWxsIHJlY29yZF9kZWJ1Z2Zvcm1hdAorCXdpdGggIkNPRkYiLgorCSogeGNvZmZyZWFkLmMgKHJlYWRfeGNvZmZfc3ltdGFiKTogQ2FsbCByZWNvcmRfZGVidWdmb3JtYXQKKwl3aXRoICJYQ09GRiIuCisJKiBkd2FyZnJlYWQuYyAocmVhZF9maWxlX3Njb3BlKTogQ2FsbCByZWNvcmRfZGVidWdmb3JtYXQKKwl3aXRoICJEV0FSRiAxIi4KKwkqIGR3YXJmMnJlYWQuYyAocmVhZF9maWxlX3Njb3BlKTogQ2FsbCByZWNvcmRfZGVidWdmb3JtYXQKKwl3aXRoICJEV0FSRiAyIi4KKwkqIGRzdHJlYWQuYyAoZHN0X2VuZF9zeW10YWIpOiBTZXQgZGVidWdmb3JtYXQgdG8gYmUKKwkiQXBvbGxvIERTVCIuCisJKiBtZGVidWdyZWFkLmMgKG5ld19zeW10YWIpOiBTZXQgZGVidWdmb3JtYXQgdG8gYmUgIkVDT0ZGIi4KKworRnJpIEp1biAyNyAyMTowNTo0NSAxOTk3ICBNaWNoYWVsIFNueWRlciAgKG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tKQorCisJKiBtaXBzLXRkZXAuYyAobWlwc19wdXNoX2FyZ3VtZW50cyk6IGhhbmRsZSBhbGlnbm1lbnQgb2YKKwlpbnRlZ2VyIGFuZCBzdHJ1Y3QgYXJncyBvbiBzdGFjayBmb3IgbWlwczY0IGJpZy1lbmRpYW4uCisKK0ZyaSBKdW4gMjcgMTk6MTk6MTIgMTk5NyAgTWljaGFlbCBTbnlkZXIgIChtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21pcHMvdG0tbWlwcy5oIChVU0VfU1RSVUNUX0NPTlZFTlRJT04pOiBNSVBTX0VBQkkgcmV0dXJucworCXN0cnVjdHMgaW4gYSByZWdpc3RlciB3aGVyZXZlciBwb3NzaWJsZS4KKwkqIG1pcHMtdGRlcC5jIChtaXBzX2V4dHJhY3RfcmV0dXJuX3ZhbHVlKTogaGFuZGxlIHN0cnVjdHMuCisJKG1pcHNfc3RvcmVfcmV0dXJuX3ZhbHVlKTogaGFuZGxlIHZhbHVlcyBzbWFsbGVyIHRoYW4gTUlQU19SRUdTSVpFCisJKGluY2x1ZGluZyBzdHJ1Y3RzLCBpZiBnZGIgZXZlciBhbGxvd3MgaXQpLgorCitGcmkgSnVuIDIwIDE3OjU4OjM0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBzaC10ZGVwLmMgKHNoX3NraXBfcHJvbG9ndWUpOiBBbHNvIHJlY29nbml6ZSBmbW92IGluc25zLgorCShzaF9mcmFtZV9maW5kX3NhdmVkX3JlZ3MpOiBSZWNvZ25pemUgZm1vdiBpbnNucyBhbmQgYWRqdXN0CisJc3RhY2sgcHVzaCBjb3VudCBhY2NvcmRpbmdseS4KKwkqIHNoLXRkZXAuYyAoSVNfRk1PViwgRlBTQ1JfU1opOiBOZXcgZGVmaW5lcworCitUaHUgSnVuIDE5IDA4OjE4OjQ4IDE5OTcgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogdXRpbHMuYyAoZmxvYXRmb3JtYXRfZnJvbV9kb3VibGVzdCk6IEltcHJvdmUgdGVzdCBmb3IgaW5maW5pdHkuCisKK1dlZCBKdW4gMTggMTM6NDc6NTIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGR3YXJmcmVhZC5jIChpc3JlZywgb3B0aW1pemVkX291dCwgb2ZmcmVnLCBiYXNlcmVnKTogTW92ZQorCWdsb2JhbCB2YXJpYWJsZXMgaW50byB0aGUgc3RydWN0IGRpZWluZm8gc3RydWN0dXJlLgorCShsb2N2YWwpOiBQYXNzIHBvaW50ZXIgdG8gYSBkaWVpbmZvIHN0cnVjdCByYXRoZXIgdGhhbiBhCisJcG9pbnRlciB0byB0aGUgcmF3IGxvY2F0aW9uIGluZm9ybWF0aW9uLiAgQ2hhbmdlIHByb3RvdHlwZS4KKwlTZXQgaXNyZWcsIG9wdGltaXplZF9vdXQsIG9mZnJlZyBhbmQgYmFzZXJlZyBhcyBhcHByb3ByaWF0ZS4KKwkoc3RydWN0X3R5cGUpOiBDYWxsIGxvY3ZhbCB3aXRoIGRpZWluZm8gc3RydWN0IHBvaW50ZXIuCisJKG5ld19zeW1ib2wpOiBEaXR0by4KKwkobmV3X3N5bWJvbCk6IENhbGwgbG9jdmFsIGFuZCBzYXZlIGxvY2F0aW9uIGJlZm9yZSB0ZXN0aW5nCisJdGhlIHZhbHVlcyBvZiB0aGUgbmV3IGRpZWluZm8gc3RydWN0IGZsYWdzLCBzZXQgYnkgbG9jdmFsLgorCitUdWUgSnVuIDE3IDEzOjMwOjEyIDE5OTcgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogcHJvY2ZzLmMgKHByb2Nfc2V0X2V4ZWNfdHJhcCwgcHJvY2ZzX2luaXRfaW5mZXJpb3IsIHByb2Nmc193YWl0LAorCXVuY29uZGl0aW9uYWxseV9raWxsX2luZmVyaW9yKTogIFVuZG8gT2N0IDI2IDE5OTYgYW5kIEFwciAyNiAxOTk3CisJY2hhbmdlcyB0byB0cmFjZSBQUkZTX1NUT1BURVJNIGFuZCBoYW5kbGUgUFJfREVBRC4KKwlUaGVzZSBjaGFuZ2VzIHRyaWVkIHRvIHdvcmsgYXJvdW5kIGEgcHJvYmxlbSB3aXRoIGFuIGVhcmx5IERVIDQuMAorCXJlbGVhc2UsIGJ1dCB0aGV5IHRyaWdnZXIgc3VidGxlIHRpbWluZyBkZXBlbmRlbnQga2VybmVsIGJ1Z3MKKwlpbiBvbGRlciBPU0YvMSByZWxlYXNlcy4KKworVHVlIEp1biAxNyAwNjo1Mjo0NyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZHdhcmZyZWFkLmMgKG5ld19zeW1ib2wpOiBVc2UgU1lNQk9MX1ZBTFVFX0FERFJFU1MsIGluc3RlYWQgb2YKKwlTWU1CT0xfVkFMVUUsIHRvIHNldCB0aGUgdmFsdWUgb2YgTE9DX1NUQVRJQyBzeW1ib2xzLgorCitNb24gSnVuIDE2IDE4OjM4OjI4IDE5OTcgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogTWFyayByZWdpc3RlcnMgYXMgaW52YWxpZCB3aGVuCisJc3RlcHBpbmcgb3ZlciBhbiBpbnN0cnVjdGlvbiB0aGF0IHRyaWdnZXJlZCBhIHdhdGNocG9pbnQuCisJKiByZW1vdGUtbWlwcy5jOiBOdW1lcm91cyBjaGFuZ2VzIHRvIHN1cHBvcnQgaGFyZHdhcmUgYnJlYWtwb2ludHMKKwlhbmQgd2F0Y2hwb2ludHMgb24gTFNJIE1pbmlSSVNDIGFuZCBUaW55UklTQyBib2FyZHMuCisJKiBtaXBzLXRkZXAuYzogTW92ZSBNSVBTMTYtcmVsYXRlZCBtYWNyb3MgdG8gY29uZmlnL21pcHMvdG0tbWlwcy5oLgorCShtaXBzX2JyZWFrcG9pbnRfZnJvbV9wYyk6IEFjY291bnQgZm9yIGRpZmZlcmVudCBicmVha3BvaW50CisJaW5zdHJ1Y3Rpb25zIHVzZWQgYnkgUE1PTiBhbmQgSURUIG1vbml0b3IuCisJKiBjb25maWcvbWlwcy90bS1lbWJlZC5oOiBFbmFibGUgaGFyZHdhcmUgYnJlYWtwb2ludHMgb24gZW1iZWRkZWQKKwlNSVBTIHRhcmdldHMuCisJKiBjb25maWcvbWlwcy90bS1taXBzLmg6IERlZmluZSBicmVha3BvaW50IGluc3RydWN0aW9ucyBmb3IKKwlQTU9OIGFuZCBJRFQgbW9uaXRvci4gIE1vdmUgTUlQUzE2LXJlbGF0ZWQgbWFjcm9zIGhlcmUgZnJvbQorCW1pcHMtdGRlcC5jLgorCQorRnJpIEp1biAxMyAxMzo0NDo0NyAxOTk3ICBNaWNoYWVsIFNueWRlciAgKG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tKQorCisJKiBjb25maWcvbWlwcy90bS10eDM5W2xdLmgsIHR4MzlbbF0ubXQ6IGNoYW5nZSByMzkwMCB0YXJnZXQgdG8gdHgzOS4KKworRnJpIEp1biAxMyAxNDoxNDoxMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAzMDAtdGRlcC5jIChtbjEwMzAwX2FuYWx5emVfcHJvbG9ndWUpOiBGaXggc29tZSBjb21tZW50cy4KKwlBZGQgbWlzc2luZyByZXR1cm4gc3RhdGVtZW50cyBhZnRlciBmaW5kaW5nIGFuICJhZGQgaW1tezE2LDMyfSxzcCIKKwlpbnN0cnVjdGlvbi4KKwkobW4xMDMwMF9mcmFtZV9jaGFpbik6IEFkZCBpbiBzaXplIG9mIG91ciByZWdpc3RlciBzYXZlIGFyZWEgdG8gZmluZAorCW91ciBjYWxsZXIncyBmcmFtZSBpZiBvdXIgY2FsbGVyIGRvZXMgbm90IGhhdmUgYSBmcmFtZSBwb2ludGVyLgorCitGcmkgSnVuIDEzIDEyOjU1OjQ5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHN5bWZpbGUuYyAoZ2VuZXJpY19sb2FkKTogQ2hlY2sgcmV0dXJuIGNvZGUgb2YgdGFyZ2V0X3dyaXRlX21lbW9yeS4KKworRnJpIEp1biAxMyAxMDoyODowOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2kzODYvbm0tbGludXguaDogRW5hYmxlIHByb3RvdHlwZXMgdGhhdCB3ZXJlICNpZmRlZiBvdXQuCisJKiBjb25maWcvdG0tc3lzdjQuaCAoaW5fcGx0X3NlY3Rpb24pOiBBZGQgcHJvdG90eXBlLgorCisJKiBtYWludC5jIChtYWludGVuYW5jZV90cmFuc2xhdGVfYWRkcmVzcyk6IEF2b2lkIGFzc2lnbm1lbnQKKwlpbnNpZGUgaWYsIHBlciBHTlUgY29kaW5nIHN0YW5kYXJkcy4KKwkqIHN5bWZpbGUuYyAoc2ltcGxlX3JlYWRfb3ZlcmxheV90YWJsZSk6IEF2b2lkIGFzc2lnbm1lbnRzIGluc2lkZSBpZiwgCisJcGVyIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLgorCisJKiBtb25pdG9yLmMgKHBhcnNlX3JlZ2lzdGVyX2R1bXApOiBJcyByZWFsbHkgYSB2b2lkIGZ1bmN0aW9uLgorCUFkZCBwcm90b3R5cGUuCisJKG1vbml0b3JfcmVhZF9tZW1vcnkpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlICJuYW1lIi4KKwkobW9uaXRvcl9yZWFkX21lbW9yeSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgInJlZ2J1ZiIuCisJKG1vbml0b3Jfb3Blbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgImkiLgorCShnZXRfaGV4X3dvcmQpOiBBcHBhcmVudGx5IHVudXNlZCwgI2lmIGF3YXkgZm9yIG5vdy4KKwkoZnJvbV9oZXgpOiBEaXR0by4KKworCSogaTM4NnY0LW5hdC5jIChzdXBwbHlfZnByZWdzZXQpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlICJyZWdpIi4KKwkoZmlsbF9mcHJlZ3NldCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzICJyZWdpIiwgInRvIiwgImZyb20iIGFuZAorCSJyZWdpc3RlcnMiLgorCisJKiByZW1vdGUtZTcwMDAuYyAoY3R5cGUuaCk6IEluY2x1ZGUuCisJKGU3MDAwX2luc2VydF9icmVha3BvaW50KTogI2lmIGF3YXkgdW51c2VkIGFyZyB1c2VkIGJ5IHVudXNlZCBleHByLgorCSogZnJhbWUuaCAoZ2VuZXJpY19nZXRfc2F2ZWRfcmVnaXN0ZXIpOiBBZGQgcHJvdG90eXBlLgorCShlbnVtIGx2YWxfdHlwZSk6IEFkZCBwYXJ0aWFsIGZvcndhcmQgZGVjbC4KKwkqIGRzcmVjLmMgKG1ha2Vfc3JlYyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgInR5cGVfY29kZSIuCisJKiByZW1vdGUtc2ltLmMgKGdkYnNpbV93YWl0KTogSGFuZGxlIHNpbV9ydW5uaW5nIGFuZCBzaW1fcG9sbGluZworCWNhc2VzIGJ5IGp1c3QgaWdub3JpbmcgdGhlbS4KKwkoY29tbWFuZC5oKTogSW5jbHVkZS4KKworCSogamF2YS1leHAueSAocGFyc2VfbnVtYmVyKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAidW5zaWduZWRfcCIuCisJKiBqYXZhLWxhbmcuYyAoZ2RiY29yZS5oKTogSW5jbHVkZSBmb3IgcHJvdG90eXBlcy4KKwkodHlwZV9mcm9tX2NsYXNzKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAiZnR5cGUiLgorCSh0eXBlX2Zyb21fY2xhc3MpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlICJuYW1lX2xlbmd0aCIuCisJKGV2YWx1YXRlX3N1YmV4cF9qYXZhKTogQWRkIGRlZmF1bHQgY2FzZSB0byBoYW5kbGUgcmVtYWluaW5nCisJZW51bWVyYXRpb25zLgorCSogamF2YS12YWxwcmludC5jIChjLWxhbmcuaCk6IEluY2x1ZGUgZm9yIHByb3RvdHlwZXMuCisKKwkqIHN5bWZpbGUuYyAoc2ltcGxlX3JlYWRfb3ZlcmxheV9yZWdpb25fdGFibGUpOiAjaWYgYXdheQorCXVudXNlZCBmdW5jdGlvbi4KKwkoc2ltcGxlX2ZyZWVfb3ZlcmxheV9yZWdpb25fdGFibGUpOiBEaXR0by4KKwkob3ZlcmxheV9pc19tYXBwZWQpOiBBZGQgZGVmYXVsdCBjYXNlIHRvIHN3aXRjaC4KKwkoc2ltcGxlX3JlYWRfb3ZlcmxheV9yZWdpb25fdGFibGUpOiBEaXR0by4KKwkoc2ltcGxlX3JlYWRfb3ZlcmxheV9yZWdpb25fdGFibGUpOiBBZGQgcHJvdG90eXBlLgorCisJKiBzeW10YWIuYyAoZml4dXBfc3ltYm9sX3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkIG1zeW0gdmFyaWFibGUuCisJKGZpeHVwX3BzeW1ib2xfc2VjdGlvbik6IERpdHRvLgorCShmaW5kX3BjX3NlY3Rfc3ltdGFiKTogTWFrZSBkaXN0YW5jZSBhIENPUkVfQUREUi4KKworCSogdXRpbHMuYzogQWRkIGNvbW1lbnQgYWJvdXQgdF9hZGRyIGJlaW5nIGVpdGhlciB1bnNpZ25lZCBsb25nIG9yCisJdW5zaWduZWQgbG9uZyBsb25nLgorCShwYWRkcik6IENoYW5nZSBmb3JtYXRzIHRvIG1hdGNoIGFjdHVhbCB0eXBlcyBhcmdzIGFyZSBjYXN0IHRvLgorCShwcmVnKTogRGl0dG8uCisJKHBhZGRyX256KTogRGl0dG8uCisJKHByZWdfbnopOiBEaXR0by4KKworCSogZGVmcy5oIChwZXJyb3Jfd2l0aF9uYW1lKTogSXMgYSBOT1JFVFVSTiBmdW5jdGlvbi4KKwkqIHV0aWxzLmMgKHBlcnJvcl93aXRoX25hbWUpOiBJcyBhIE5PUkVUVVJOIGZ1bmN0aW9uLgorCShlcnJvcik6IElzIE5PUkVUVVJOIGluZGVwZW5kZW50bHkgb2YgQU5TSV9QUk9UT1RZUEVTLgorCisJKiBzeW10YWIuYyAoZml4dXBfc3ltYm9sX3NlY3Rpb24pOiBSZW1vdmUgcHJvdG90eXBlLgorCSogc3ltdGFiLmg6IChmaXh1cF9zeW1ib2xfc2VjdGlvbik6IEFkZCBwcm90b3R5cGUuCisJKiBtMzJyLXJvbS5jIChyZXBvcnRfdHJhbnNmZXJfcGVyZm9ybWFuY2UpOiBBZGQgcHJvdG90eXBlLgorCSogc3BhcmNsZXQtcm9tLmM6IERpdHRvLgorCSogZHNyZWMuYzogRGl0dG8uCisKKwkqIGMtZXhwLnkgKHBhcnNlX251bWJlcik6IENhc3QgYXJncyB0byBmbG9hdCogb3IgZG91YmxlKiBhcworCWFwcHJvcHJpYXRlIGZvciBjb252ZXJzaW9uIGZvcm1hdC4KKwkqIGphdmEtZXhwLnkgKHBhcnNlX251bWJlcik6IERpdHRvLgorCisJKiBNYWtlZmlsZS5pbiAoYy1leHAudGFiLmMpOiBSZW1vdmUgI2xpbmUgbGluZXMgdGhhdCByZWZlcgorCXRvIG5vbmV4aXN0YW50IHkudGFiLmMgZmlsZS4KKwkoamF2YS1leHAudGFiLmMpOiBEaXR0by4KKwkoZi1leHAudGFiLmMpOiBEaXR0by4KKwkobTItZXhwLnRhYi5jKTogRGl0dG8uCisKKwkqIHNoLXRkZXAuYyAoc3ltZmlsZS5oKTogSW5jbHVkZS4KKwkoZ2RiX3N0cmluZy5oKTogSW5jbHVkZS4KKwkoc2hfZml4X2NhbGxfZHVtbXkpOiBJZmRlZiBhd2F5LCBjdXJyZW50bHkgdW51c2VkLgorCSogY29uZmlnL3NoL3RtLXNoLmggKHBvcF9mcmFtZSk6IEFkZCBwcm90b3R5cGUuCisJKiBjb25maWcvc2gvdG0tc2guaCAoc2hfc2V0X3Byb2Nlc3Nvcl90eXBlKTogQWRkIHByb3RvdHlwZS4KKworU2F0IEp1biAgNyAwMjozNDoxOSAxOTk3ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwX2Zvcl9zaXplb2YpOiAgSGFuZGxlIGRlcmVmZXJlbmNpbmcKKwlvZiBub24tcG9pbnRlciB2YWx1ZXMuCisKKwkqIHN5bXRhYi5jIChnZGJfbWFuZ2xlX25hbWUpOiAgSW1wcm92ZSBtYW5nbGluZyBvZiBuZXN0ZWQgdHlwZXMsCisJdGhlaXIgcGh5c2ljYWwgbmFtZXMgYWxyZWFkeSBpbmNsdWRlIHRoZSBjbGFzcyBuYW1lLgorCisJKiB2YWxvcHMuYyAodmFsdWVfY2FzdCk6ICBIYW5kbGUgdXBjYXN0IG9mIGEgY2xhc3MgcG9pbnRlci4KKworCUZyb20gQW5kcmVhcyBTY2h3YWIgKHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZSk6CisJKiBjb3JlbG93LmMgKGdldF9jb3JlX3JlZ2lzdGVycyk6ICBNYWtlIHNlY25hbWUgYmlnIGVub3VnaC4KKworRnJpIEp1biAgNiAxNDo0MzoyMyAxOTk3ICBLZWl0aCBTZWl0eiAgPGtlaXRoc0BwaXp6YS5jeWdudXMuY29tPgorCisJKiBjb25maWcvc2gvdG0tc2guaDogYWRkIGRlZmluZSBmb3IgRlBTQ1JfUkVHTlVNCisJKiBzaC10ZGVwLmMgKHNoX3Nob3dfcmVncyk6IHByaW50IG91dCBhbGwgcmVnaXN0ZXJzIGZvcgorCXRoZSBjdXJyZW50IHByb2Nlc3NvcgorCQorRnJpIEp1biAgNiAxMzowMTo1NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zaW0uYyAoZ2Ric2ltX2tpbGwpOiBSZW1vdmUgY2FsbCB0byBkZXByZWNpYXRlZCBmdW5jdGlvbgorIAlzaW1fa2lsbC4KKworVGh1IEp1biAgNSAxMTozOTowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlGaXhlcyBmb3IgcmVjZW50IGNvcnJlY3Rpb24gdG8gUEUgZm9ybWF0OgorCSogY29mZnJlYWQuYyAocGVfZmlsZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKHN0cnVjdCBmaW5kX3Rhcmdfc2VjX2FyZyk6IENoYW5nZSByZXN1bHRwIGZyb20gcG9pbnRlciB0byBpbnQgdG8KKwlwb2ludGVyIHRvIHBvaW50ZXIgdG8gYXNlY3Rpb24uCisJKGZpbmRfdGFyZ19zZWMpOiBKdXN0IHN0b3JlIHRoZSBzZWN0aW9uIGluIGFyZ3MtPnJlc3VsdHAsIG5vdCB0aGUKKwlzZWN0aW9uIG9mZnNldCB2YWx1ZS4KKwkoY3NfdG9fc2VjdGlvbik6IENvbXB1dGUgdGhlIHNlY3Rpb24gb2Zmc2V0IHZhbHVlIGZyb20gdGhlCisJc2VjdGlvbi4KKwkoY3Nfc2VjdGlvbl9hZGRyZXNzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoY29mZl9zeW1maWxlX3JlYWQpOiBTZXQgcGVfZmlsZS4KKwkocmVhZF9vbmVfc3ltKTogV2hlbiByZWFkaW5nIGEgUEUgZmlsZSwgYWRqdXN0IHRoZSBzeW1ib2wgdmFsdWUgdG8KKwlpbmNsdWRlIHRoZSBzZWN0aW9uIGFkZHJlc3MgaWYgdGhlIHN5bWJvbCBoYXMgYW4gYXBwcm9wcmlhdGUKKwlzdG9yYWdlIGNsYXNzLgorCitUdWUgSnVuICAzIDE2OjI0OjQ2IDE5OTcgIE1pY2hhZWwgU255ZGVyICAobXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS50Z3Q6IGFkZCBtaXBzcjM5MDAtZWxmIHRhcmdldAorCSogY29uZmlnL21pcHMvcjM5MDAubXQgcjM5MDBsLm10IHRtLXIzOTAwLmggdG0tcjM5MDBsLmg6IGRpdHRvCisKK1R1ZSBNYXkgMjcgMTA6MzQ6MTEgMTk5NyAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogZGJ4cmVhZC5jOiBDaGVjayBtYWxsb2MncyByZXR1cm4gZm9yIG51bGwsIHByZXZlbnQgc2Vndi4KKworRnJpIE1heSAyMyAxNDo0NTowMiAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogaW5mY21kLmMgKGp1bXBfY29tbWFuZCk6IERvbid0IHRyeSB0byBkZXJlZmVyZW5jZSBzZm4gaWYgaXQncworIAlOVUxMLgorCitGcmkgTWF5IDIzIDEzOjUxOjU3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogdG9wLmMgKGluaXRfY21kX2xpc3RzKTogQWx3YXlzIGluaXRpYWxpemUgZW5kaWFubGlzdC4KKwkoaW5pdF9tYWluKTogQWx3YXlzIGRlZmluZSBlbmRpYW4gY29tbWFuZHMuCisJKHNldF9lbmRpYW5fYmlnKTogSXNzdWUgd2FybmluZyBpZiBlbmRpYW4gbm90IHNlbGVjdGFibGUuCisJKHNldF9lbmRpYW5fbGl0dGxlKTogRGl0dG8uCisJKHNldF9lbmRpYW5fYXV0byk6IERpdHRvLgorCitUaHUgTWF5IDIyIDExOjUzOjIxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLXNpbS5jIChzaW11bGF0b3JfY29tbWFuZCk6IFJlc3RyaWN0IGFjY2VzcyB0byB0aGUKKyAJc2ltdWxhdG9yIHRvIHBlcmlvZHMgd2hlbiB0aGUgc2ltdWxhdG9yIGlzIG9wZW4uCisKK1dlZCBNYXkgMjEgMTY6MDM6MjUgMTk5NyAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogcHJvY2ZzLmMgKGluaXRfcHJvY2luZm8pOiBuZXcgZnVuY3Rpb24sIGFic3RyYWN0cyBzb21lIGNvZGUKKwlzaGFyZWQgYnkgY3JlYXRlX3Byb2NpbmZvIGFuZCBkb19hdHRhY2g7IAorCShwcm9jZnNfc2V0X2luZmVyaW9yX3N5c2NhbGxfdHJhcHMpOiBuZXcgZnVuY3Rpb24sIGFic3RyYWN0cworCXNvbWUgY29kZSBuZWVkZWQgYnkgcHJvY2ZzX2luaXRfaW5mZXJpb3IsIGRvX2F0dGFjaCwgYW5kIAorCXByb2Nmc19sd3BfY3JlYXRpb25faGFuZGxlcjsgKHByb2Nmc19maXJzdF9hdmFpbGFibGUpOiBuZXcKKwlmdW5jdGlvbiwgZmluZCBhbnkgTFdQIHRoYXQncyBydW5uYWJsZTsgKHByb2Nmc190aHJlYWRfYWxpdmUpOgorCXJlcGxhY2Ugc3R1YiBmdW5jdGlvbiB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb247IAorCShwcm9jZnNfbHdwX2NyZWF0aW9uX2hhbmRsZXIpOiBmaXggYnVnIHN0YXJ0aW5nIG5ldyBjaGlsZCAKKwl0aHJlYWRzOyAoaW5mb19wcm9jKTogYnVnIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMgZm9yIHRoZSAKKwkiSU5GTyBQUk9DRVNTRVMiIGNvbW1hbmQ7IChjbG9zZV9wcm9jaW5mb19maWxlKTogY2FsbCBuZXcKKwlmdW5jdGlvbiAiZGVsZXRlX3RocmVhZCIgdG8gY2xlYW51cCBHREIncyB0aHJlYWQgZGF0YWJhc2U7CisJKHByb2NfaW5pdF9mYWlsZWQpOiBhZGQgbmV3IGFyZ3VtZW50ICJraWxsIiwgdG8gY29udHJvbCB3aGV0aGVyCisJcHJvY2VzcyBpcyBraWxsZWQgKHNvIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHNoYXJlZCBieSAKKwljcmVhdGVfcHJvY2luZm8gYW5kIGRvX2F0dGFjaCk7IChwcm9jZnNfZXhpdF9oYW5kbGVyKTogaGFuZGxlCisJZXhpdCBmcm9tIGFuIGF0dGFjaGVkIHByb2Nlc3MsIGFuZCBjbGVhbnVwIHByb2NpbmZvIGhhbmRsZXMKKwl3aGVuIHRoZSBwcm9jZXNzIGV4aXRzOyAocHJvY2ZzX3Jlc3VtZSwgcHJvY2ZzX3dhaXQpOiBjbGVhbnVwCisJYWZ0ZXIgYSB0aHJlYWQgd2hlbiBpdCBleGl0czsgKGRvX2F0dGFjaCwgZG9fZGV0YWNoKTogaGFuZGxlCisJYXR0YWNoZWQgcHJvY2Vzc2VzIHdpdGggbXVsdGlwbGUgdGhyZWFkczsgcGx1cyBzb21lIGdlbmVyYWwgCisJaW1wcm92ZW1lbnRzIGluIHRoZSBkaWFnbm9zdGljIG91dHB1dC4KKwkqIHNvbC10aHJlYWQuYyAoc29sX3RocmVhZF9hbGl2ZSk6IHJlcGxhY2Ugc3R1YiB3aXRoIHJlYWwKKwlpbXBsZW1lbnRhdGlvbjsgKHRocmVhZF90b19sd3AsIGx3cF90b190aHJlYWQpOiBlbmhhbmNlIHRvIAorCWhhbmRsZSB0aHJlYWRzIHRoYXQgbWF5IGhhdmUgZXhpdGVkOyAoc29sX3RocmVhZF9hdHRhY2gpOiBhZGQKKwlzdGFydHVwIHNldHVwIHN0dWZmOyAoc29sX3RocmVhZF9kZXRhY2gpOiBhZGQgdW5wdXNoX3RhcmdldAorCWNhbGw7IChzb2xfdGhyZWFkX21vdXJuX2luZmVyaW9yKTogYWRkIHVucHVzaF90YXJnZXQgY2FsbDsKKwkoc29sX3RocmVhZF93YWl0LCBzb2xfdGhyZWFkX3Jlc3VtZSk6IGVuaGFuY2UgdG8gZGVhbCB3aXRoCisJdGhyZWFkIGV4aXQgY2xlYW5seTsgKHNvbF90aHJlYWRfbmV3X29iamZpbGUsIAorCXNvbF90aHJlYWRfcGlkX3RvX3N0cik6IGRldGVjdCB1bnN1Y2Nlc3NmdWwgc3RhcnR1cCBhbmQgCisJZG9uJ3QgY3Jhc2g7IHBsdXMgc29tZSBnZW5lcmFsIGNsZWFudXAuCisJKiB0aHJlYWQuYyAoZGVsZXRlX3RocmVhZCk6IG5ldyBmdW5jdGlvbiwgYWxsb3dzIHRhcmdldHMgdG8gCisJbm90aWZ5IGdkYiB3aGVuIGEgdGhyZWFkIGlzIG5vIGxvbmdlciB2YWxpZC4KKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IGRvbid0IHRyeSB0byBkZXRlY3QgYSBuZXcKKwl0aHJlYWQgb24gcmVjZWl2aW5nIGEgVEFSR0VUX0VYSVRFRCBldmVudC4KKwkKK1R1ZSBNYXkgMjAgMDk6MzI6MDIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmMgKGdkYnNpbV9vcGVuKTogUGFzcyBjYWxsYmFjayBzdHJ1Y3QuCisJKGluaXRfY2FsbGJhY2tzKTogUmVtb3ZlIGNhbGwgdG8gc2ltX3NldF9jYWxsYmFja3MuCisKK1RodSBNYXkgMTUgMDc6NTY6NTAgMTk5NyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oIChTSUdfRlJBTUVfTFJfT0ZGU0VUKTogIERlZmluZS4KKwkqIHJzNjAwMC10ZGVwLmMgKGZyYW1lbGVzc19mdW5jdGlvbl9pbnZvY2F0aW9uKTogIE1hcmsgZnJhbWVzCisJd2l0aCBhIHplcm8gUEMgYXMgZnJhbWVsZXNzIHRvIGltcHJvdmUgYmFja3RyYWNlcyBmcm9tIGNvcmUgZHVtcHMKKwljYXVzZWQgYnkgZGVyZWZlcmVuY2luZyBhIE5VTEwgZnVuY3Rpb24gcG9pbnRlci4KKwkoZnJhbWVsZXNzX2Z1bmN0aW9uX2ludm9jYXRpb24sIGZyYW1lX3NhdmVkX3BjLCByczYwMDBfZnJhbWVfY2hhaW4pOgorCUhhbmRsZSBmcmFtZWxlc3MgZnVuY3Rpb25zIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLgorCisJKiBzcGFyYy10ZGVwLmMgKHNwYXJjX2luaXRfZXh0cmFfZnJhbWVfaW5mbywgc3BhcmNfZnJhbWVfc2F2ZWRfcGMpOgorCUhhbmRsZSBmcmFtZWxlc3MgZnVuY3Rpb25zIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLgorCitXZWQgTWF5IDE0IDA4OjU4OjU1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDIwMC10ZGVwLmMgKG1uMTAyMDBfYW5hbHl6ZV9wcm9sb2d1ZSk6IFVwZGF0ZSBwcm9sb2d1ZSBjb21tZW50cworCXRvIHJlZmxlY3QgY3VycmVudCByZWFsaXR5LiAgR3Jvc3MgYXR0ZW1wdCBhdCBoYW5kbGluZyBvdXQgb2YKKwlsaW5lIHByb2xvZ3Vlcy4KKworCSogbW4xMDIwMC10ZGVwLmMgKG1uMTAyMDBfc2tpcF9wcm9sb2d1ZSk6IERvbid0IGxvb2sgYXQgdGhlIGRlYnVnCisJc3ltYm9scyB0byBmaW5kIHRoZSBlbmQgb2YgdGhlIHByb2xvZ3VlLgorCSogbW4xMDMwMC10ZGVwLmMgKG1uMTAzMDBfc2tpcF9wcm9sb2d1ZSk6IExpa2V3aXNlLgorCitUaHUgTWF5ICA4IDA4OjQyOjQ3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChBQ19UWVBFX1NJR05BTCk6IEFkZAorCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKwkqIHJlbW90ZS1zaW0uYzogU2lnbmFsIHJldHVybnMgUkVUU0lHVFlQRS4KKwkKK1dlZCBNYXkgIDcgMjA6MDU6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiB0YXJnZXQuaCAodGFyZ2V0X3N0b3ApOiBEcm9wIGFyZ3VtZW50IHNvIGl0IGNhbiBiZSB0ZXN0ZWQgZm9yCisgCU5VTEwuCisKK1NhdCBNYXkgIDMgMjA6NTE6NDggMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiB1dGlscy5jIChmbG9hdGZvcm1hdF9mcm9tX2RvdWJsZXN0KTogSGFuZGxlIGluZmluaXR5IHByb3Blcmx5LgorCitUaHUgTWF5ICAxIDExOjQ0OjQ2IDE5OTcgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIEZpbmFsaXplIG1lcmdlIGZyb20gSHVyZCBmb2xrLiAgCisJICAgIE1vbiBPY3QgMzAgMTY6NDE6MDQgMTk5NSAgTWlsZXMgQmFkZXIgIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KKwkgICAgKiB0aHJlYWQuYyAodGhyZWFkX2FwcGx5X2NvbW1hbmQsIHRocmVhZF9hcHBseV9hbGxfY29tbWFuZCwKKwkgICAgdGhyZWFkX2NvbW1hbmQpOiBNYWtlIHN1cmUgVFAgaXMgYWxpdmUuCisJICAgICh0aHJlYWRfYWxpdmUpOiBOZXcgZnVuY3Rpb24uCisJICAgIFR1ZSBOb3YgMTQgMTQ6MzE6MDMgMTk5NSAgTWlsZXMgQmFkZXIgIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KKwkgICAgKiBpbmZydW4uYyAoc2lnX3ByaW50X2luZm8pOiBEZWFsIGJldHRlciB3aXRoIGxvbmcgc2lnbmFsIG5hbWVzLgorCSAgICBXZWQgTm92IDIyIDE1OjIzOjM1IDE5OTUgIE1pbGVzIEJhZGVyICA8bWlsZXNAZ251LmFpLm1pdC5lZHU+CisJICAgICogdGhyZWFkLmMgKHRocmVhZF9pZF90b19waWQpOiBOZXcgZnVuY3Rpb24uCisJICAgIEZyaSBEZWMgIDEgMTM6MjU6MjUgMTk5NSAgTWlsZXMgQmFkZXIgIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KKwkgICAgKiBnbnUtbmF0LmM6IChzZXRfdGhyZWFkX2NtZF9saXN0LCBzaG93X3RocmVhZF9jbWRfbGlzdCwKKwkgICAgc2V0X3RocmVhZF9kZWZhdWx0X2NtZF9saXN0LCBzaG93X3RocmVhZF9kZWZhdWx0X2NtZF9saXN0KTogCisJICAgIE5ldyB2YXJpYWJsZXMuICAoc2V0X3RocmVhZF9jbWQsIHNob3dfdGhyZWFkX2NtZCwgCisJICAgIHNldF90aHJlYWRfZGVmYXVsdF9jbWQsIHNob3dfdGhyZWFkX2RlZmF1bHRfY21kKTogTmV3IGZ1bmN0aW9ucy4KKwkgICAgRnJpIEFwciAxOCAxNToyMDoxNiAxOTk3ICBNaWxlcyBCYWRlciAgPG1pbGVzQGdudS5haS5taXQuZWR1PgorCSAgICAqIGdudS1uYXQuYyAoaW5mX3N0YXJ0dXApOiByZW1vdmUgVEFTSyBwYXJhbWV0ZXIuIAorCSAgICAoaW5mX3NldF90YXNrKTogcmVwbGFjZSB3aXRoIG5ldyBmdW5jdGlvbiAoaW5mX3NldF9waWQpLiAgCisJICAqIGdkYnRocmVhZC5oOiBBZGQgZXh0ZXJuIGRlY2wgZm9yIHRocmVhZF9jbWRfbGlzdC4KKwkKK1RodSBNYXkgIDEgMDI6Mjg6MjEgMTk5NyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBwcmludGNtZC5jIChkaXNhc3NlbWJsZV9jb21tYW5kKTogIEFkanVzdCBsb3cgZnVuY3Rpb24gYm91bmQKKwlieSBGVU5DVElPTl9TVEFSVF9PRkZTRVQuCisKK01vbiBBcHIgMjggMjE6MjU6MzIgMTk5NyAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IEFkZCBydWxlIGZvciBnbnUtbmF0Lm8gYW5kIGkzODZnbnUtbmF0Lm8gKEdudSBIdXJkKQorCSogY29uZmlnL2kzODYvaTM4NmdudS5taDogcmVtb3ZlIHJ1bGVzIGZvciBbaTM4Nl1nbnUtbmF0Lm8sIG5vdyAKKwlpbiBNYWtlZmlsZS5pbiAoYXMgZm9yIG90aGVyIHRhcmdldHMpOyBhZGQgTkFUREVQRklMRSBjb3JlbG93Lm8gdG8gCisJc2F0aXNmeSBzeW1ib2wgZGVwZW5kYW5jeSBpbiBzb2xpYi5jIChjb3JlX29wcykuCisJKiB0YXJnZXQuW2NoXSBjb25kaXRpb25hbGl6ZSBNYWNoLXNwZWNpZmljIHNpZ25hbHMgc28gdGhhdCB0aGV5CisJd29uJ3Qgc2hvdyB1cCBpbiBub24tTWFjaCBnZGIncyEKKwkqIHRocmVhZC5jOiBjaGFuZ2UgbmFtZSBvZiBzdGF0aWMgZnVuY3Rpb24gInRocmVhZF9zd2l0Y2giIHRvIAorCSJzd2l0Y2hfdG9fdGhyZWFkIiwgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBNYWNoIGdsb2JhbCBzeW1ib2w7IAorCW1vdmUgdGhyZWFkX2NtZF9saXN0IHRvIGdsb2JhbCBzY29wZSBzbyB0YXJnZXRzIGNhbiBhZGQgdGhlaXIgCisJb3duIHRocmVhZCBjb21tYW5kcy4KKwkqIGluZnJ1bi5jOiBzaWdfcHJpbnRfaW5mbzogYWxsb3cgZm9yIGxvbmcgc2lnbmFsIG5hbWVzLgorCSogZ251LW5hdC5bY2hdOiB0aWR5aW5nIHVwIGNvbW1lbnRzLgorCSogZ251LW5hdC5jOiByZW1vdmUgY2FsbHMgdG8gcHJ1bmVfdGhyZWFkcyBhbmQgcmVudW1iZXJfdGhyZWFkczsgCisJZ251X3dhaXQgbXVzdCBub3QgcmV0dXJuIC0xIHdoZW4gaW5mZXJpb3IgZXhpdHM7IAorCWF0dGFjaF90b19jaGlsZCB3aWxsIG1vZGlmeSBpbmZlcmlvcl9waWQgaW4gYSB3YXkgdGhhdCBhbGxvd3MKKwlmb3JrX2luZmVyaW9yIHRvIHJlbWFpbiB1bmNoYW5nZWQ7IHJlbW92ZSBleHRyYSBhcmcgZnJvbSAKKwlzdGFydHVwX2luZmVyaW9yOyBtb3ZlIE1hY2ggdGhyZWFkIGNvbW1hbmRzIGhlcmUgZnJvbSB0aHJlYWQuYy4KKworTW9uIEFwciAyOCAxODoyMToyMCAxOTk3ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBzeW10YWIuYzogZGVjb2RlX2xpbmVfMSwgcmVwbGFjZSB0aGUgYXNzaWdubWVudCB0byAKKwl2YWx1ZXMuc2Fsc1swXS5wYyB3aGljaCBJIGFjY2lkZW50YWxseSBsZWZ0IG91dCBvbiA0LzMvOTcuCisKK01vbiBBcHIgMjggMTc6Mjc6NDAgMTk5NyAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogYy1leHAueTogbWFrZSBwYXJzZV9udW1iZXIgcmVqZWN0ICIxMjNERUFEQkVFRiIuCisJKGZpeCBieSBCb2IgTWFuc29uKS4KKwkqIGphdmEtZXhwLnk6IERpdHRvLgorCSogdG9wLmM6IGNoYW5nZSAidG8gZW5hYmxlIHRvIGVuYWJsZSIgdG8gInRvIGVuYWJsZSIgaW4gYSBjb3VwbGUKKwlvZiBoZWxwIHN0cmluZ3MuCisKK01vbiBBcHIgMjggMDk6MDE6NTkgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBicmVha3BvaW50LmMgKHJlbW92ZV9icmVha3BvaW50KTogUGFzcyBjb3JyZWN0IHR5cGUgdG8KKwl0YXJnZXRfcmVtb3ZlX3dhdGNocG9pbnQuCisJKiB0YXJnZXQuaDogSW1wcm92ZSBjb21tZW50IGZvciB0YXJnZXRfe3JlbW92ZSxpbnNlcnR9X2JyZWFrcG9pbnQuCisKK1NhdCBBcHIgMjYgMDM6Mzg6MDIgMTk5NyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBhbHBoYS10ZGVwLmMgKGhldXJpc3RpY19wcm9jX2Rlc2MpOiAgSW5jcmVhc2Ugc2VhcmNoIGxpbWl0CisJZm9yIHJldHVybiBhZGRyZXNzIHJlZ2lzdGVyLCBoYW5kbGUgYHJldCcgaW5zdHJ1Y3Rpb24uCisKKwkqIGNvcmVsb3cuYyAoZ2V0X2NvcmVfcmVnaXN0ZXJzKTogIEluaXRpYWxpemUgY2YuCisKKwkqIHByb2Nmcy5jOiAgTWlub3IgY2hhbmdlcyB0byBtYWtlIHByZS1BTlNJIGNvbXBpbGVycyBoYXBweS4KKwkocHJvY2ZzX25vdGljZV9zaWduYWxzKTogIENvcHkgdHJhY2VkIHNpZ25hbCBzZXQgYmFjayB0bworCXBpLT5wcnJ1bi5wcl90cmFjZS4KKwkodW5jb25kaXRpb25hbGx5X2tpbGxfaW5mZXJpb3IpOiAgSWYgUFJfREVBRCBpcyBkZWZpbmVkLAorCXJlcnVuIGluZmVyaW9yIGFmdGVyIGtpbGxpbmcgaXQuCisKK0ZyaSBBcHIgMjUgMDA6MTA6MTggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvbW4xMDMwMC90bS1tbjEwMzAwLmggKEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MpOiBUaGUKKwlzdHJ1Y3R1cmUgdmFsdWUgYWRkcmVzcyBpcyBmb3VuZCBpbiAkYTAgbm93LgorCSogY29uZmlnL21uMTAyMDAvdG0tbW4xMDIwMC5oIChFWFRSQUNUX1NUUlVDVF9WQUxVRV9BRERSRVNTKTogTGlrZXdpc2UuCisKK1RodSBBcHIgMjQgMTM6MzE6MTAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWcvbW4xMDMwMC90bS1tbjEwMzAwLmggKFNUT1JFX1JFVFVSTl9WQUxVRSk6IFBvaW50ZXJzIGFyZQorCXJldHVybmVkIGluICRhMC4KKwkoRVhUUkFDVF9SRVRVUk5fVkFMVUUpOiBMaWtld2lzZS4KKworCSogbW4xMDMwMC10ZGVwLmMgKG1uMTAzMDBfYW5hbHl6ZV9wcm9sb2d1ZSk6IENoZWNrIGZvciBhIHJldHVybgorCWluc24gYXQgInBjIiwgbm90ICJmaS0+cGMiLgorCitXZWQgQXByIDIzIDExOjE4OjQ1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21uMTAyMDAvdG0tbW4xMDIwMC5oIChTVE9SRV9SRVRVUk5fVkFMVUUpOiBQb2ludGVycyBhcmUKKwlyZXR1cm5lZCBpbiAkYTAuCisJKEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKTogTGlrZXdpc2UuCisKK1R1ZSBBcHIgMjIgMTE6NTg6MTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9hcm0vdG0tYXJtLmggKFRBUkdFVF9ET1VCTEVfRk9STUFUKTogRGVmaW5lIHRvIHVzZQorCWZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZWJ5dGVfYmlnd29yZCBmb3IgbGl0dGxlIGVuZGlhbgorCXRhcmdldCBieXRlIG9yZGVyLgorCSogdXRpbHMuYyAoZmxvYXRmb3JtYXRfdG9fZG91Ymxlc3QpOiBDcmVhdGUgbG9jYWwgcHJlc3dhcHBlZAorCWNvcHkgb2YgaW5wdXQgZm9yIGZsb2F0Zm9ybWF0X2xpdHRsZWJ5dGVfYmlnd29yZCBmb3JtYXRzLgorCShnZXRfZmllbGQsIHB1dF9maWVsZCk6IFRyZWF0IGZsb2F0Zm9ybWF0X2xpdHRsZWJ5dGVfYmlnd29yZAorCXRoZSBzYW1lIGFzIGZsb2F0Zm9ybWF0X2xpdHRsZS4KKwkoZmxvYXRmb3JtYXRfZnJvbV9kb3VibGVzdCk6IFBvc3Rzd2FwIG91dHB1dCB3b3JkcyBmb3IKKwl0aGUgZmxvYXRmb3JtYXRfbGl0dGxlYnl0ZV9iaWd3b3JkcyBmb3JtYXQuCisKK1R1ZSBBcHIgMjIgMDk6MDI6MTAgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2FscGhhL2FscGhhLW9zZjMubWggY29uZmlnL2kzODYve2kzODZnbnUgbGludXh9Lm1oCisJY29uZmlnL21pcHMve2VtYmVkIGVtYmVkNjQgZW1iZWRsIGVtYmVkbDY0IHZyNDMwMCB2cjQzMDBlbCB2cjUwMDAKKwl2cjUwMDBlbH0ubXQgY29uZmlnL3Bvd2VycGMve2FpeCBhaXg0fS5taCBjb25maWcvcnM2MDAwL3thaXgKKwlhaXg0fS5taCBjb25maWcvc2gvc2gubXQgY29uZmlnL3NwYXJjL3NwNjRzaW0ubXQ6CisJY29uZmlnL3Y4NTAvdjg1MC5tdDoKKwlSZW1vdmUgLWxtLiAgVGhhdCdzIG5vdyBoYW5kbGVkIGJ5IGNvbmZpZ3VyZS4KKworCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiAgQWRkIGRpc3RjbGVhbiB0byBkZXBlbmRlbmNpZXMuCisJUmVtb3ZlIGR1cGxpY2F0ZSBybSdzIG9mIGZpbGVzLgorCitNb24gQXByIDIxIDA5OjQ5OjI1IDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS1wYS5jOiAgUmVtb3ZlLiAgSXQncyBicm9rZW4gYW5kIG5vIGxvbmdlciBuZWNlc3NhcnkuCisKKwlTYXQgQXByIDE5IDExOjU2OjEwIDE5OTcgIFBlciBCb3RobmVyICA8Ym90aG5lckBkZW5lYi5jeWdudXMuY29tPgorCisJKiBqYXZhLWV4cC55OiAgQ29tYmluZSBUUlVFIGFuZCBGQUxTRSBpbnRvIEJPT0xFQU5fTElURVJBTC4KKwkoQXZvaWRzIG5hbWUgY2xhc2ggd2l0aCBicm9rZW4gQUlYIGhlYWRlciBmaWxlcy4pCisKK1NhdCBBcHIgMTkgMDE6NDk6MzcgMTk5NyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBzZXJpYWwuYyAoc2VyaWFsX2xvZ19jb21tYW5kKTogIEZpeCBmcHV0c191bmZpbHRlcmVkIGNhbGxzLgorCisJKiBjb25maWcvcG93ZXJwYy90bS1wcGMtYWl4NC5oLCBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC1haXg0LmgKKwkoRE9OVF9SRUxPQ0FURV9TWU1GSUxFX09CSkZJTEUpOiAgUmVtb3ZlZC4KKwkqIHhjb2Zmc29saWIuaCAoc3RydWN0IHZtYXApOiAgQWRkIG5ldyBtZW1iZXJzIHR2bWEsIHRvZmZzIGFuZCBkdm1hLAorCXJlbW92ZSB0YWRqLgorCSogZXhlYy5jIChiZmRzZWNfdG9fdm1hcCk6ICBJbml0aWFsaXplIG5ldyB2bWFwIG1lbWJlcnMsIGluaXRpYWxpemUKKwl0c3RhcnQgYW5kIGRzdGFydCB3aXRoIHNlY3Rpb24gVk1BLgorCSogcnM2MDAwLW5hdC5jICh2bWFwX3N5bXRhYik6ICBSZWxvY2F0ZSByZWxhdGl2ZSB0byB0aGUgVk1BIGluIHRoZQorCW9iamVjdCBmaWxlLgorCSh2bWFwX2xkaW5mbywgeGNvZmZfcmVsb2NhdGVfY29yZSk6ICBBZGp1c3QgdHN0YXJ0IGJ5IHNlY3Rpb24gb2Zmc2V0CisJb2YgdGhlIHRleHQgc2VjdGlvbiwgcmVtb3ZlIERPTlRfUkVMT0NBVEVfU1lNRklMRV9PQkpGSUxFIGhhY2suCisJKHZtYXBfZXhlYyk6ICBSZWxvY2F0ZSByZWxhdGl2ZSB0byB0aGUgVk1BIGluIHRoZSBvYmplY3QgZmlsZSwKKwlyZWxvY2F0ZSAuYnNzIHNlY3Rpb24gYXMgd2VsbC4KKwkoeGNvZmZfcmVsb2NhdGVfY29yZSk6ICBObyBsb25nZXIgYWRqdXN0IHNlY3Rpb24gYWRkcmVzc2VzIGJ5IFZNQS4KKwkqIHJzNjAwMC10ZGVwLmMgKGZpbmRfdG9jX2FkZHJlc3MpOiAgQ2hhbmdlIHR5cGUgb2YgdG9jYmFzZQorCXRvIENPUkVfQUREUi4KKwkqIHhjb2ZmcmVhZC5jIChzZWNudW1fdG9fYmZkX3NlY3Rpb24pOiAgTmV3IHJvdXRpbmUgdG8gZ2V0CisJQkZEIHNlY3Rpb24gZnJvbSBDUyBzZWN0aW9uIG51bWJlci4KKwkoc2Nhbl94Y29mZl9zeW10YWIpOiAgTWFrZSB0b2Nfb2Zmc2V0IHNlY3Rpb24gcmVsYXRpdmUuCisKKwkqIHN5bXRhYi5jICh0b3RhbF9udW1iZXJfb2ZfbWV0aG9kcyk6ICBBdm9pZCBjb3JlIGR1bXAgaWYKKwliYXNlY2xhc3MgdHlwZSBpcyBzdGlsbCB1bmRlZmluZWQuCisKK0ZyaSBBcHIgMTggMTc6MjU6MTAgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFNVQkRJUlMpOiAgQWRkIG1zd2luIHNvIHRoYXQgbWFrZSBjbGVhbnVwIGNsZWFucyB1cAorCXRoYXQgZGlyZWN0b3J5LgorCSogZGVmcy5oIHV0aWxzLmMgKGVycm9yIHdhcm5pbmcpOiAgTWFrZSBtZXNzYWdlIGJlIGNvbnN0LgorCSogbWFpbi5jIChmcHV0c191bmZpbHRlcmVkKTogIE9ubHkgc2VuZCBnZGJfc3Rkb3V0IGFuZCBnZGJfc3RkZXJyCisJdG8gaG9vay4gIE90aGVyd2lzZSBzZW5kIGl0IHRvIGZwdXRzLgorCSogbW9uaXRvci5jIG1vbml0b3IuaCAobW9uaXRvcl9nZXRfZGV2X25hbWUpOiAgTmV3IGZ1bmN0aW9uLiAgRG9lcworCXRoZSBvYnZpb3VzLgorCSogcmVtb3RlLWU3MDAwLmM6ICBSZW1vdmUgZGVidWdpZnkgc3R1ZmYuICBDaGFuZ2UgcHJpbnRmLCBmcHJpbnRmCisJdG8gX2ZpbHRlcmVkIGZvcm1zIHRvIG1ha2Ugb3V0cHV0IGFwcGVhciBpbiBHVUlzLiAgUmVwbGFjZSBhbGwKKwl1c2VzIG9mIFNFUklBTF9SRUFEQ0hBUiB3aXRoIHJlYWRjaGFyLCB3aGljaCBoYXMgYmV0dGVyIGVycm9yCisJY2hlY2tpbmcuCisJKiAoZTcwMDBfcGFyc2VfZGV2aWNlKTogIEFkZCBwcm90b3R5cGUuCisJKHJlYWRjaGFyKTogIEltcHJvdmUgZG9jLiAgSGFuZGxlIHJhbmRvbSBzZXJpYWwgZXJyb3JzLgorCShleHBlY3QpOiAgRGlzYWJsZSBub3RpY2VfcXVpdCBjb2RlLiAgSXQncyBidXN0ZWQuICBSZW1vdmUKKwlzZXJpYWwgZXJyb3IgaGFuZGxpbmcgKGl0J3Mgbm93IGhhbmRsZWQgaW4gcmVhZGNoYXIpLiAgUmVtb3ZlCisJcmVtb3RlX2RlYnVnIGVjaG9pbmcuICBUaGF0J3MgaGFuZGxlZCBpbiByZWFkY2hhciBhcyB3ZWxsLgorCShlNzAwMF9wYXJzZV9kZXZpY2UpOiAgUmVtb3ZlIHNlcmlhbF9mbGFnIGFyZy4gIEl0J3Mgbm90CisJbmVjZXNzYXJ5LgorCShlNzAwMF9vcGVuKTogIFNwbGl0IGludG8gdHdvIHBpZWNlcy4gIFNlY29uZCBwYXJ0IGlzCisJZTcwMDBfc3RhcnRfcmVtb3RlLCBhbmQgaXMgZXJyb3IgcHJvdGVjdGVkLiAgTm93LCB3aGVuIHdlIGNvbm5lY3QKKwl0byB0aGUgdGFyZ2V0LCB3ZSBzZXR1cCB0aGUgaW5pdGlhbCBmcmFtZSBhbmQgcmVnaXN0ZXJzIHNvIHRoYXQKKwl0aGUgdXNlciBnZXRzIGFuIGltbWVkaWF0ZSBpbmRpY2F0aW9uIG9mIHdoZXJlIHRoZSB0YXJnZXQgaXMuCisJKGdjaCk6ICBSZW1vdmUgZGVidWcgb3V0cHV0LiAgVGhhdCdzIGhhbmRsZWQgYnkgcmVhZGNoYXIuCisJKGU3MDAwX3JlYWRfaW5mZXJpb3JfbWVtb3J5KTogIEhhbmRsZSBlcnJvcnMgYmV0dGVyLgorCShfaW5pdGlhbGl6ZV9yZW1vdGVfZTcwMDApOiAgR2V0IHJpZCBvZiBgPHh4eD4nIHRoaW5ncyBmcm9tCisJY29tbWFuZCBuYW1lcy4gIFRoZXkgc2hvdyB1cCB3aGVuIGRvaW5nIGNvbXBsZXRpb24gYW5kIGNvbmZ1c2UKKwl0aGluZ3MgaG9ycmlibHkuCisJKiBzZXItZTdrcGMuYzogR2V0IHJpZCBvZiB0aGUgRExMJ3Mgc2luY2Ugd2UgY2FuIGFjY2VzcyB0aGUgZGV2aWNlCisgCWRpcmVjdGx5IGZyb20gV2luMzJzIGFuZCBXaW45NS4gIEdldCByaWQgb2YgZGVidWdpZnkgY3J1ZC4KKwkqIHNlcmlhbC5jOiAgUmVtb3ZlIGRlYnVnaWZ5IGNydWZ0LgorCSogKHNlcmlhbF9sb2djaGFyIHNlcmlhbF9sb2dfY29tbWFuZCBzZXJpYWxfd3JpdGUgc2VyaWFsX3JlYWRjaGFyCisJc2VyaWFsX3NlbmRfYnJlYWsgc2VyaWFsX2Nsb3NlKTogIE1lcmdlIGNvbW1vbiBmdW5jdGlvbmFsaXR5IGludG8KKwlzZXJpYWxfbG9nY2hhci4gIENsZWFuIHVwIHJlc3Qgb2Ygcm91dGluZXMuCisJKiBzcGFyY2xldC1yb20uYzogIERpc2VtYm93ZWwuICBMZWF2ZSBvbmx5IGRvd25sb2FkIHJvdXRpbmUuCisJRG93bmxvYWQgcm91dGluZSBub3cgc3dpdGNoZXMgdG8gcmVtb3RlIHRhcmdldCBhdXRvbWF0aWNhbGx5LgorCSogdG9wLmMgKGRpc2Nvbm5lY3QpOiAgT25seSBkZWZpbmUgaWYgU0lHSFVQIGlzIGRlZmluZWQuICBDbGVhbnMKKwl1cCBNU1ZDL1dpbjMyIHByb2JsZW0uCisJKiB1dGlscy5jIChnZGJfZmx1c2gpOiAgRG9uJ3QgY2FsbCBob29rIHVubGVzcyBpdCdzIGZvciBnZGJfc3Rkb3V0CisJb3IgZ2RiX3N0ZGVyci4KKwkqIGNvbmZpZy9zaC90bS1zaC5oOiAgRGVmaW5lIFRBUkdFVF9TSCBmb3IgV2luR0RCLgorCSogY29uZmlnL3NwYXJjL3RtLXNwYXJjbGV0Lmg6ICBSZW1vdmUgb3ZlcnJpZGUgZm9yIHByb21wdC4KKworRnJpIEFwciAxOCAxMzozODoxOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmMgKGdkYnNpbV9vcGVuKTogT25seSBwYXNzIC1FIHRvIHNpbV9vcGVuIGlmCisJVEFSR0VUX0JZVEUgT1JERVJfU0VMRUNUQUJMRS4KKworRnJpIEFwciAxOCAxNjo1Mjo0MSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zaW0uYyAoaW5pdF9jYWxsYmFja3MpOiBJbml0aWFsaXplIHBvbGxfcXVpdCBhbmQgbWFnaWMKKyAJZmllbGRzIG9mIGdkYl9jYWxsYmFjay4KKwkoZ2Ric2ltX3N0b3ApOiBBZGQgZ2Ric2ltX3N0b3AgdG8gbGlzdCBvZiBzdXBwb3J0ZWQgY2xpZW50CisgCW9wZXJhdGlvbnMuCisJKGdkYnNpbV93YWl0LCBnZGJzaW1fcmVzdW1lKTogTW92ZSBjYWxsIHRvIHNpbV9yZXN1bWUgaW50bworIAlzaW1fd2FpdCB3aGVyZSBnZGIgaXMgaW4gYSBwb3NpdGlvbiB0byBoYW5kbGUgYSBsb25nIHJ1bm5pbmcKKyAJZnVuY3Rpb24uCisJKGdkYnNpbV9jbnRybF9jKTogTmV3IGZ1bmN0aW9uLiAgV3JhcCB0aGUgc2ltX3Jlc3VtZSBjYWxsIGluIGEKKyAJU0lHSU5UIGhhbmRsZXIuCisJKGdkYl9vc19wb2xsX3F1aXQpOiBOZXcgZnVuY3Rpb24uIENoZWNrIGZvciBhIHF1aXQgcGVuZGluZyBvbiB0aGUKKyAJY29uc29sZS4KKworVGh1IEFwciAxNyAxNDozMDowNCAxOTk3ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbT4KKworCSogb2JqZmlsZXMuYyAoYWxsb2NhdGVfb2JqZmlsZSk6ICBBbGxvdyBOVUxMIGJmZCBhcmd1bWVudC4KKwkqIGRlZnMuaCAoZW51bSBsYW5ndWFnZSk6ICBBZGQgbGFuZ3VhZ2VfamF2YS4KKwkqIGphdmEtZXhwLnksIGphdmEtbGFuZy5jLCBqYXZhLWxhbmcuaCwgamF2YS12YWxwcmludC5jOiAgTmV3IGZpbGVzLgorCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgZm9yIG5ldyBmaWxlcy4KKwkqIHN5bWZpbGUuYyAoZGVkdWNlX2xhbmd1YWdlX2Zyb21fZmlsZW5hbWUpOiAgUmVjb2duaXplIC5qYXZhLgorCitUaHUgQXByIDE3IDAyOjIwOjIzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIG0zMnItc3R1Yi5jIChzdGFzaF9yZWdpc3RlcnMpOiBSZXdyaXRlLgorCShyZXN0b3JlX3JlZ2lzdGVycyk6IFJlbmFtZWQgdG8gcmVzdG9yZV9hbmRfcmV0dXJuLgorCShjbGVhbnVwX3N0YXNoKTogTmV3IGZ1bmN0aW9uLgorCShwcm9jZXNzX2V4Y2VwdGlvbik6IE5ldyBmdW5jdGlvbi4KKwkoX2NhdGNoRXhjZXB0aW9uKik6IFJld3JpdGUuCisKKwkqIHJlbW90ZS1zaW0uYyAoZ2Ric2ltX2xvYWQpOiBVcGRhdGUgY2FsbCB0byBzaW1fbG9hZC4KKwkoZ2Ric2ltX2NyZWF0ZV9pbmZlcmlvcik6IE5vIGxvbmdlciBwYXNzIHN0YXJ0X2FkZHJlc3MgdG8KKwlzaW1fY3JlYXRlX2luZmVyaW9yLgorCShnZGJzaW1fb3Blbik6IFBhc3MgZW5kaWFuIGluZGljYXRvciBhcyBhcmcuCisKK1R1ZSBBcHIgMTUgMTU6MzE6MDkgMTk5NyAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiByZW1vdGUuYyAoZ2V0X29mZnNldHMpOiBEb24ndCB1c2Ugc2NhbmYgZm9yIGludGVycHJldGluZworCXJlc3BvbnNlIHRvIHFPZmZzZXRzLgorCitUdWUgQXByIDE1IDE0OjUxOjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2Ric2VydmVyL01ha2VmaWxlLmluIChJTlNUQUxMX1hGT1JNKTogUmVtb3ZlLgorCShJTlNUQUxMX1hGT1JNMSk6IFJlbW92ZS4KKwkoaW5zdGFsbC1vbmx5KTogVXNlICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkgZGlyZWN0bHksIHJhdGhlcgorCXRoYW4gdXNpbmcgJChJTlNUQUxMX1hGT1JNKSBhbmQgJChJTlNUQUxMX1hGT1JNMSkuCisJKHVuaW5zdGFsbCk6IFRyYW5zZm9ybSBuYW1lLgorCitNb24gQXByIDE0IDE3OjA2OjI3IDE5OTcgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLW1pcHMuYyAobWlwc19sb2FkKTogRW5zdXJlIHRoYXQgUEMgZ2V0cyB1cGRhdGVkCisJYWZ0ZXIgYSBsb2FkIG9uIExTSSB0YXJnZXQuCisKK01vbiBBcHIgMTQgMTU6NTQ6NTEgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAcGl6emEuY3lnbnVzLmNvbT4KKworCSogcHJvY2ZzLmMgKG5vdGljZV9zaWduYWxzKTogZml4IHR5cG8KKworTW9uIEFwciAxNCAxNjoyNToxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdkYnNlcnZlci9NYWtlZmlsZS5pbiAoSU5TVEFMTCk6IENoYW5nZSBpbnN0YWxsLnNoIHRvCisJaW5zdGFsbC1zaC4KKworTW9uIEFwciAxNCAxMTo1NToyNyAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBwaXp6YS5jeWdudXMuY29tPgorCisJKiBjb25maWcvaTM4Ni9jeWd3aW4zMi5taDogcmVtb3ZlIC1sa2VybmVsMzIgZnJvbSBYTV9DTElCUworCXNpbmNlIGdjYyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIGl0CisKK1RodSBBcHIgMTAgMTM6MjA6NTMgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogcHJvY2ZzLmM6IFN1YnN0YW50aWFsIChidXQgaW5jb21wbGV0ZSkgY2hhbmdlcyB0byBzdXBwb3J0CisJc3lzdjQuMm1wIHByb2NmcyBhcyBpbXBsZW1lbnRlZCBpbiBVbml4V2FyZSAyLjEuICBUaGUgcHJvY2luZm8KKwlzdHJ1Y3Qgbm93IGhhcyBzdWJzdHJ1Y3RzIGxpa2Ugc3RydWN0IGZsdF9jdGwgaW5zdGVhZCBvZgorCWp1c3QgYSBmbHRzZXRfdCBhbmQgaGFzIGEgY3RsX2ZkLCBzdGF0dXNfZmQsIGFzX2ZkLCBhbmQKKwltYXBfZmQgaW5zdGVhZCBvZiBhIHNpbmdsZSBmZC4gIE5vbi1zeXN2NC4ybXAgcHJvY2ZzIG1vZGVscworCXN0aWxsIGhhdmUgdGhlIHN0cnVjdHMgYW5kIG11bHRpcGxlIGZkcywgYnV0IGRvbid0IHVzZSB0aGUKKwllbnRpcmUgc3RydWN0IGFuZCB0aGUgZm91ciBmZHMgYWxsIHBvaW50IHRvIHRoZSBzYW1lIHRoaW5nLgorCVdlIHVzZSBQUk9DRlNfVVNFX1JFQURfV1JJVEUgdG8gZGVjaWRlIHdoZXRoZXIgdG8gdGFsayB0bworCXByb2NmcyB3aXRoIHJlYWRzL3dyaXRlcyBvciB1c2UgaW9jdGwgaW5zdGVhZC4gIFdlIHVzZQorCUhBVkVfTVVMVElQTEVfUFJPQ19GRFMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgcHJvY2ZzIHJlYWxseSBoYXMKKwltdWx0aXBsZSBmZHMgb3Igbm90LiAgUFJPQ19OQU1FX0ZNVCBpcyBzcGxpdCBvdXQgaW50bworCUNUTF9QUk9DX05BTUVfRk1ULCBBU19QUk9DX05BTUVfRk1ULCBNQVBfUFJPQ19OQU1FX0ZNVCwgCisJU1RBVFVTX1BST0NfTkFNRV9GTVQuCisJCisJKHByb2Nmc19ub3RpY2Vfc2lnbmFscyk6IG5vdyBhIG5lY2Vzc2FyeSB3cmFwcGVyIGFyb3VuZAorCShub3RpY2Vfc2lnbmFscyk6IHdoaWNoIGFyZSB0aGUgbmV3IGd1dHMgZm9yIG5vdGljaW5nIHNpZ25hbHMKKwkob3Blbl9wcm9jX2ZpbGUpOiBnZXRzIGEgbmV3IGZsYWcgYXJnIHVzZWQgaW4gc3lzdjQuMm1wIHRvCisJZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRvIGF0dGVtcHQgdG8gb3BlbiB0aGUgY3RsX2ZkLgorCShwcm9jZnNfcmVhZF9zdGF0dXMpOiBuZXcgbG9jYWwgZnVuY3Rpb24sIHJlYWRzIHByb2NmcyBzdGF0dXMKKwkocHJvY2ZzX3dyaXRlX3Bjd3N0b3ApOiBuZXcgbG9jYWwgZnVuY3Rpb24sIHdyaXRlcyBhIFBDV1NUT1AKKwkocHJvY2ZzX3dyaXRlX3Bja2lsbCk6IG5ldyBsb2NhbCBmdW5jdGlvbiwgd3JpdGVzIGEgUENLSUxMCisJKHVuY29uZGl0aW9uYWxseV9raWxsX2luZmVyaW9yKTogcmVtb3ZlIHNpZ25vIHNpbmNlIHdlIG5vdworCWp1c3QgY2FsbCBwcm9jZnNfd3JpdGVfcGNraWxsKCkuCisJKHByb2Nmc194ZmVyX21lbW9yeSk6IGNhbGwgbHNlZWsgd2l0aCBTRUVLX1NFVCByYXRoZXIgdGhhbiAwCQorCShwcm9jX2l0ZXJhdGVfb3Zlcl9tYXBwaW5ncyk6IHRoZSB3aG9sZSBmdW5jdGlvbiBpcyBpZmRlZmVkCisJb24gVU5JWFdBUkUgdG8ga2VlcCB0aGluZ3MgcmVhZGFibGUuCisJCisJRXhwYW5kZWQgdGhlIHN5c2NhbGxfdGFibGUgdG8gaW5jbHVkZSBuZXcgcG90ZW50aWFsIHN5c3Y0LjJtcAorCW1lbWJlcnMuICBOb3RlIHRoYXQgYWxsIGlmZGVmcyBvZiBVTklYV0FSRSBzaG91bGQgYmUgZWxpbWluYXRlZAorCWlmIHBvc3NpYmxlIG9yIHJlbmFtZWQgdG8gZGVzY3JpYmUgd2hhdCdzIGJlaW5nIHNlbGVjdGVkIGZvciBhCisJYml0IGJldHRlci4gIFN5c3Y0LjJtcCBhbmQgSVJJWCBib3RoIGhhdmUgU1lTX3Nwcm9jIHNvIHRoZQorCUlSSVggc3BlY2lmaWMgY29kZSBub3cgYWxzbyBjaGVja3MgaXQncyBub3QgVU5JWFdBUkUuCisKKwkqIGNvbmZpZy9pMzg2L3RtLWkzODZ2NDJtcC5oOiBhbHNvIGRlZmluZSBIQVZFX1BTVEFUVVNfVCwKKwlIQVZFX05PX1BSUlVOX1QsIFBST0NGU19VU0VfUkVBRF9XUklURSwgYW5kIFVOSVhXQVJFCisJKiBjb25maWcvbWlwcy9ubS1pcml4NC5oOiBzZXQgQ1RMX1BST0NfTkFNRV9GTVQgZXQgYWwgdG8KKwkiL2RlYnVnLyVkIiBhcyBQUk9DX05BTUVfRk1UIHVzZWQgdG8gYmUKKworV2VkIEFwciAgOSAxMTozNjoxNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAzMDAtdGRlcC5jOiBBbG1vc3QgY29tcGxldGVseSByZXdyaXR0ZW4gYmFzZWQgb24gbW4xMDIwMAorCXBvcnQuCisJKiBjb25maWcvbW4xMDMwMC90bS1tbjEwMzAwLmg6IExpa2V3aXNlLgorCitUdWUgQXByICA4IDEwOjQ1OjI0IDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9wYS97aHBwYWJzZC5tdCBocHBhaHB1eC5tdCBocHBhb3NmLm10fTogIFJlbW92ZQorCXJlbW90ZS1wYS5vIGZyb20gVERFUEZJTEVTLiAgTm9ib2R5IHVzZXMgaXQsIGFuZCBiZXNpZGVzLCBpdCdzIGEKKwlsb3VzeSBvdXQtb2YtZGF0ZSBjbG9uZSBvZiByZW1vdGUuYy4KKworRnJpIEFwciAgNCAwODoyMToyMSAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiByZW1vdGUuYzogIEZpeCBwcm9ibGVtcyByZWFsaXplZCB3aGlsZSBzaG93ZXJpbmcuCisJKiAoaGV4bnVtbGVuKTogIEFkZCBwcm90b3R5cGUuICBVc2UgbWF4LCBub3QgbWluLgorCSogKHJlbW90ZV93cml0ZV9ieXRlcyByZW1vdGVfcmVhZF9ieXRlcyk6ICBGaXggbWF4IHBhY2tldCBzaXplCisJY2FsY3VsYXRpb25zIHRvIHByb3Blcmx5IGFjY291bnQgZm9yIHBhY2tldCBvdmVyaGVhZC4gIEFsc28gaGFuZGxlCisJKHByb2JhYmx5IHJhcmUpIGNhc2Ugd2hlcmUgcmVtb3RlX3JlZ2lzdGVyX2J1Zl9zaXplIGlzbid0IHNldC4KKworCSogcmVtb3RlLmM6ICBGaXggZG9jIGZvciBgQycgYW5kIGBTJyBjb21tYW5kcyB0byBpbmRpY2F0ZSBmdWxsCisJYWRkcmVzcy4KKwkqIChyZW1vdGVfb3BzIGV4dGVuZGVkX3JlbW90ZV9vcHMgcmVtb3RlX2Rlc2MgcmVtb3RlX3dyaXRlX3NpemUpOgorCU1ha2Ugc3RhdGljLgorCSogKHJlbW90ZV9mZXRjaF9yZWdpc3RlcnMgcmVtb3RlX3dyaXRlX2J5dGVzIHJlbW90ZV9yZWFkX2J5dGVzKToKKwlSZWNvcmQgc2l6ZSBvZiByZXNwb25zZSB0byBmZXRjaCByZWdpc3RlcnMgY29tbWFuZCwgdXNlIHRoaXMgdG8KKwlsaW1pdCBzaXplIG9mIG1lbW9yeSByZWFkIGFuZCB3cml0ZSBjb21tYW5kcy4KKwkqIChwdXNoX3JlbW90ZV90YXJnZXQpOiAgTmV3IGZ1bmN0aW9uIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gaGF2ZQorCWFub3RoZXIgdGFyZ2V0IHN3aXRjaCB0byB0aGUgcmVtb3RlIHRhcmdldC4KKwkqIHRhcmdldC5oOiAgQWRkIHByb3RvdHlwZSBmb3IgcHVzaF9yZW1vdGVfdGFyZ2V0LgorCSogc2gtdGRlcC5jIChzaF9mcmFtZV9maW5kX3NhdmVkX3JlZ3MpOiAgRml4IHNpZ24gZXh0ZW5zaW9uIGJ1Z3MKKwlmb3IgaG9zdHMgd2hpY2ggZGVmYXVsdCB0byB1bnNpZ25lZCBjaGFycyAoc3VjaCBhcyBTR0kncykuCisJKiAoX2luaXRpYWxpemVfc2hfdGRlcCk6ICBEb24ndCBzZXQgcmVtb3RlX3dyaXRlX3NpemUuICBJdCdzIG5vdworCWhhbmRsZWQgYXV0b21hdGljYWxseSBpbiByZW1vdGUuYy4KKworVGh1IEFwciAgMyAxNToxMDozMCAxOTk3ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBibG9ja2ZyYW1lLmM6IGJsb2NrdmVjdG9yX2Zvcl9wY19zZWN0KCksIGJsb2NrX2Zvcl9wY19zZWN0KCksIAorCWZpbmRfcGNfc2VjdF9mdW5jdGlvbigpLCBmaW5kX3BjX3NlY3RfcGFydGlhbF9mdW5jdGlvbigpOiBuZXcgCisJZnVuY3Rpb25zIGZvciBkZWJ1Z2dpbmcgb3ZlcmxheXM7IHBjIHdpdGhvdXQgc2VjdGlvbiBpcyBhbWJpZ3VvdXMuCisJKiBicmVha3BvaW50LltjaF06IGFkZCBzZWN0aW9uIHBvaW50ZXIgdG8gYnJlYWtwb2ludCBzdHJ1Y3Q7CisJYWRkIHNlY3Rpb24gYXJndW1lbnQgdG8gY2hlY2tfZHVwbGljYXRlcygpOyBjaGVjayBzZWN0aW9uIGFzIHdlbGwKKwlhcyBwYyBpbiBbYnJlYWtwb2ludF9oZXJlX3AoKSwgYnJlYWtwb2ludF9pbnNlcnRlZF9oZXJlX3AoKSwKKwlicmVha3BvaW50X3RocmVhZF9tYXRjaCgpLCBicHN0YXRfc3RvcF9zdGF0dXMoKV07ICAKKwlhZGQgc2VjdGlvbiBhcmd1bWVudCB0byBkZXNjcmliZV9vdGhlcl9icmVha3BvaW50cygpOyAKKwl1c2UgSU5JVF9TQUwoKSBtYWNybyB0byB6ZXJvLW91dCBuZXcgc2FsIHN0cnVjdHVyZXM7IAorCW1ha2UgcmVzb2x2ZV9zYWxfcGMoKSBmaXggdXAgdGhlIHNhbCdzIHNlY3Rpb24gYXMgd2VsbCBhcyBpdHMgcGM7IAorCW1hdGNoIG9uIHNlY3Rpb24gKyBwYyBpbiBjbGVhcl9jb21tYW5kKCkgYW5kIGRlbGV0ZV9icmVha3BvaW50KCk7IAorCWFjY291bnQgZm9yIG92ZXJsYXkgc2VjdGlvbnMgaW4gaW5zZXJ0X2JyZWFrcG9pbnRzKCksIAorCXJlbW92ZV9icmVha3BvaW50KCkgYW5kIGJyZWFrcG9pbnRfcmVfc2V0X29uZSgpOworCWFsbCB0aGlzIHRvIHN1cHBvcnQgb3ZlcmxheXMgd2hlcmUgYSBQQyBpcyBub3QgdW5pcXVlLgorCSogZXhlYy5jOiBjaGFuZ2UgeGZlcl9tZW1vcnkoKSB0byBoYW5kbGUgb3ZlcmxheSBzZWN0aW9ucy4KKwkqIGZpbmR2YXIuYzogY2hhbmdlIHJlYWRfdmFyX3ZhbHVlKCkgdG8gaGFuZGxlIG92ZXJsYXkgc2VjdGlvbnMuCisJKiBmcmFtZS5oOiBkZWNsYXJhdGlvbiBmb3IgYmxvY2tfZm9yX3BjX3NlY3QoKSBbYmxvY2tmcmFtZS5jXS4KKwkqIGluZmNtZC5jOiBqdW1wX2NvbW1hbmQoKSB3YXJucyBhZ2FpbnN0IGp1bXBpbmcgaW50byBhbiBvdmVybGF5CisJdGhhdCdzIG5vdCBpbiBtZW1vcnkuICBBbHNvIHVzZSBJTklUX1NBTCgpIHRvIGluaXRpYWxpemUgc2Fscy4KKwkqIGluZnJ1bi5jOiB3YWl0X2Zvcl9pbmZlcmlvcigpIHNldHMgYSBmbGFnIHRvIGludmFsaWRhdGUgY2FjaGVkCisJb3ZlcmxheSBzdGF0ZSBpbmZvcm1hdGlvbjsgQWxzbyB1c2UgSU5JVF9TQUwoKSB0byBpbml0IHNhbHMuCisJKiBtMzJyLXJvbS5jOiBtb2RpZnkgbG9hZCByb3V0aW5lcyB0byB1c2UgTE1BIGluc3RlYWQgb2YgVk1BLgorCSogbTMyci1zdHViLmM6IG1hc2sgZXhpdCB2YWx1ZSBkb3duIHRvIDggYml0czsgc2NyZWVuIG91dCBhbnkKKwltZW1vcnkgcmVhZC93cml0ZXMgaW4gdGhlIHJhbmdlIDYwMDAwMCB0byBhMDAwMDAsIGFuZCBmZjY4MDAwMAorCXRvIGZmODAwMDAwIChoYW5ncyBiZWNhdXNlIG5vdGhpbmcgaXMgbWFwcGVkIHRoZXJlKTsgZml4IHN0cmNweSgpLgorCSogbWFpbnQuYzogbWFpbnRlbmFuY2UgY29tbWFuZCAidHJhbnNsYXRlLWFkZHJlc3MiIHN1cHBvcnRzIG92ZXJsYXlzLgorCSogbWluc3ltcy5jOiBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGNfc2VjdCgpIHN1cHBvcnRzIG92ZXJsYXlzLgorCSogb2JqZmlsZXMuW2NoXTogYWRkIG92bHlfbWFwcGVkIGZpZWxkIHRvIHRoZSBvYmpfc2VjdGlvbiBzdHJ1Y3Q7CisJdGhpcyBjb25zdGl0dXRlcyBnZGIncyBpbnRlcm5hbCBvdmVybGF5IG1hcHBpbmcgdGFibGUuICBBZGQgbWFjcm8KKwlBTExfT0JKU0VDVElPTlMoKSB0byBsb29wIHRocnUgdGhlIG9ial9zdHJ1Y3RzIGFuZCBsb29rIGF0IG92ZXJsYXlzLgorCUFkZCBmdW5jdGlvbiBmaW5kX3BjX3NlY3Rfc2VjdGlvbigpLgorCSogcHJpbnRjbWQuYzogbW9kaWZ5IHByaW50X2FkZHJlc3Nfc3ltYm9saWMoKSB3aXRoIG92ZXJsYXkgc21hcnRzOworCW1vZGlmeSBhZGRyZXNzX2luZm8oKSB3aXRoIG92ZXJsYXkgc21hcnRzOyBhZGQgZnVuY3Rpb24gc3ltX2luZm8oKSAKKwl0byBzdXBwb3J0IHRoZSBJTkZPIFNZTUJPTCBjb21tYW5kICh0cmFuc2xhdGUgYWRkcmVzcyB0byBzeW1ib2wocykpOworCW1vZGlmeSBkaXNhc3NlbWJsZV9jb21tYW5kKCkgdG8gd29yayBvbiB1bm1hcHBlZCBvdmVybGF5cy4KKwkqIHNvdXJjZS5jOiB1c2UgSU5JVF9TQUwoKSB0byBpbml0aWFsaXplIHNhbHMuCisJKiBzeW1maWxlLltjaF06IGNoYW5nZSBnZW5lcmljX2xvYWQoKSB0byB1c2Ugc2VjdGlvbidzIExNQSBhZGRyZXNzCisJaW5zdGVhZCBvZiBWTUEgYWRkcmVzcywgZm9yIG92ZXJsYXkgc2VjdGlvbnMuCisJQWRkIG51bWVyb3VzIGZ1bmN0aW9ucyBmb3IgZmluZGluZyBhIFBDJ3Mgc2VjdGlvbiAvIG92ZXJsYXksIAorCXRyYW5zbGF0aW5nIGJldHdlZW4gVk1BIGFuZCBMTUEgYWRkcmVzcyByYW5nZXMsIGRldGVybWluaW5nIGlmIGFuCisJb3ZlcmxheSBzZWN0aW9uIGlzIG1hcHBlZCwgZXRjLiAgQWRkIHNldmVyYWwgdXNlciBjb21tYW5kcyBmb3IKKwlvdmVybGF5IGRlYnVnZ2luZy4gIEFkZCBzdXBwb3J0IGZvciBhICJnZW5lcmljIiBmb3JtIG9mIGF1dG9tYXRpY2FsbHkKKwlyZWFkaW5nIG92ZXJsYXkgbWFwcGluZyBpbmZvIGZyb20gdGhlIGluZmVyaW9yIChiYXNlZCBvbiB0aGUgZGVmYXVsdAorCShzaW1wbGUpIG92ZXJsYXkgbWFuYWdlciB3aGljaCBDeWdudXMgcHJvdmlkZXMgYXMgYW4gZXhhbXBsZSkuCisJKiBzeW10YWIuW2NoXTogYWRkIGZ1bmN0aW9ucyBmaW5kX3BjX3NlY3Rfc3ltdGFiKCksIAorCWZpbmRfcGNfc2VjdF9wc3ltdGFiKCksIGZpbmRfcGNfc2VjdF9wc3ltYm9sKCksIGZpbmRfcGNfc2VjdF9saW5lKCkKKwlmb3IgbG9va3VwOyBtb2RpZnkgbG9va3VwX3N5bWJvbCBhbmQgZGVjb2RlX2xpbmVfMSgpIHRvIHVzZSB0aGVtOworCW1vZGlmeSBmaW5kX2Z1bmN0aW9uX3N0YXJ0X3NhbCgpIHRvIGFjY291bnQgZm9yIG92ZXJsYXkgc2VjdGlvbnM7CisJYWRkIG1hY3JvIElOSVRfU0FMKCkgZm9yIGluaXRpYWxpemluZyBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lLgorCSogdGFyZ2V0LmM6IGZpeCBhIGNvbW1lbnQgaW4gdGhlIGRlY2xhcmF0aW9uIG9mIHRhcmdldF9vcHMuCisKK1RodSBBcHIgIDMgMTA6MzE6MTIgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBtaXBzLXRkZXAuYyAobWlwc19pbl9jYWxsX3N0dWIsIG1pcHNfaW5fcmV0dXJuX3N0dWIsCisJbWlwc19za2lwX3N0dWIsIG1pcHNfaWdub3JlX2hlbHBlcik6IE5ldyBmdW5jdGlvbnMgZm9yIGRlYWxpbmcKKwl3aXRoIE1JUFMxNiBjYWxsL3JldHVybiB0aHVua3MuCisJKG1pcHNfaW5pdF9mcmFtZV9wY19maXJzdCk6IE5ldyBmdW5jdGlvbiB0byBpbXBsZW1lbnQKKwlJTklUX0ZSQU1FX1BDX0ZJUlNUIG1hY3JvOyBpbmNsdWRlcyBjb2RlIGZyb20gb2xkIG1hY3JvIHBsdXMKKwluZXcgY29kZSB0byBza2lwIG92ZXIgTUlQUzE2IHRodW5rcy4KKwkobWlwc19mcmFtZV9jaGFpbik6IFNraXAgb3ZlciBNSVBTMTYgdGh1bmtzLgorCSogY29uZmlnL21pcHMvdG0tbWlwcy5oIChtaXBzX2luX2NhbGxfc3R1YiwgbWlwc19pbl9yZXR1cm5fc3R1YiwKKwltaXBzX3NraXBfc3R1YiwgbWlwc19pZ25vcmVfaGVscGVyKTogRGVjbGFyZS4KKwkoSU5fU09MSUJfQ0FMTF9UUkFNUE9MSU5FLCBJTl9TT0xJQl9SRVRVUk5fVFJBTVBPTElORSwKKwlTS0lQX1RSQU1QT0xJTkVfQ09ERSwgSUdOT1JFX0hFTFBFUl9DQUxMKTogTmV3IG1hY3JvcyB0aGF0IGludm9rZQorCXRoZSBhYm92ZSBmdW5jdGlvbnMuCisJKElOSVRfRlJBTUVfUENfRklSU1QpOiBDaGFuZ2UgdG8gaW52b2tlIG1pcHNfaW5pdF9mcmFtZV9wYy4KKwkobWlwc19pbml0X2ZyYW1lX3BjKTogRGVjbGFyZS4KKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IFVzZSBuZXcgSUdOT1JFX0hFTFBFUl9DQUxMIG1hY3JvCisJdG8gZGVjaWRlIGlmIGNlcnRhaW4gbGlicmFyeSBmdW5jdGlvbiBjYWxscyBzaG91bGQgYmUgaWdub3JlZC4KKworV2VkIEFwciAgMiAxNDoxNjo1MSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmMgKGdkYnNpbV9vcGVuKTogQ2hlY2sgcmV0dXJuIGNvZGUgZnJvbSBzaW1fb3Blbi4KKwlVcGRhdGUgY2FsbCB0byBzaW1fb3BlbiAobmV3IGFyZyBTSU1fT1BFTl9ERUJVRykuCisKK01vbiBNYXIgMzEgMTQ6NTU6NTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnZGJpbml0LmluOiBOZXcgZmlsZS4KKwkqIC5nZGJpbml0OiBSZW1vdmUuCisJKiBjb25maWd1cmUuaW46IEdlbmVyYXRlIC5nZGJpbml0IGZyb20gZ2RiaW5pdC5pbi4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworU2F0IE1hciAyOSAxMzo1NzoyMCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogQ09QWUlORzogSW5zdGFsbCBuZXcgdmVyc2lvbiBvZiBmaWxlIGZyb20gRlNGLgorCSogY29weWluZy5jIChzaG93X2NvcHlpbmdfY29tbWFuZCk6IFVwZGF0ZSBGU0YgYWRkcmVzcy4KKworRnJpIE1hciAyOCAxODozMzo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgLmdkYmluaXQuCisKK0ZyaSBNYXIgMjggMTU6Mzg6MDQgMTk5NyAgTWlrZSBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zaW0uYyAoZ2RiX29zX3ssZX12cHJpbnRmX2ZpbHRlcmVkKTogQ2hhbmdlIHN0ZGFyZyB0eXBlCisJdG8gdmFfbGlzdCBmcm9tIHZvaWQgKiwgc2luY2UgdmFfbGlzdCBtaWdodCBub3QgYmUgYSBwb2ludGVyCisJdHlwZS4KKworVGh1IE1hciAyNyAxNDoyMTo0NiAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1taXBzLmM6IENsZWFuIHVwIGNvbW1lbnQgYW5kIGV4dHJhbmVvdXMgc2VtaWNvbG9uCisJZm9yIG1pcHNfbW9uaXRvcl9wcm9tcHQgdmFyaWFibGUuCisKK1RodSBNYXIgMjcgMTI6NDY6NTggMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiByZW1vdGUtbWlwcy5jOiBBZGQgYHNldCBtb25pdG9yLXByb21wdCcgY29tbWFuZC4KKworV2VkIE1hciAyNiAwNjo0Nzo0NCAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwlGaXggZnJvbSBQZXRlciBTY2hhdWVyOgorCSogbWRlYnVncmVhZC5jIChwYXJzZV9wcm9jZWR1cmUpOiBTZXQgYWRkcmVzcyBvZiBwcm9jZWR1cmUgdG8KKwlibG9jayBzdGFydDsgdGhpcyBmaXhlcyBwcm9ibGVtcyB3aXRoIHNoYXJlZCBsaWJyYXJpZXMgaW50cm9kdWNlZAorCWJ5IGNoYW5nZSBvZiBNYXIgMjEuCisKK01vbiBNYXIgMjQgMTk6NDM6MTYgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogc3ltdGFiLmMgKGZpbmRfcGNfc3ltdGFiKTogY2hhbmdlIHRvIHN1cHBvcnQgdGhlIGNhc2UKKwl3aGVyZSB0aGUgb2JqZmlsZSBpcyByZW9yZGVyZWQgYW5kIGNvbnRhaW5zIGJvdGggY29mZiBhbmQKKwlzdGFicyBkZWJ1Z2dpbmcgaW5mbyAoY29udGludWUgb24gaWYgYSBwc3ltdGFiIGlzbid0IGZvdW5kKS4KKworU3VuIE1hciAyMyAxNjoxOToyMCAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwlGaXhlcyBmcm9tIFBldGVyIFNjaGF1ZXI6CisJKiBjb25maWcvbWlwcy90bS1taXBzLmggKFJFR0lTVEVSX0NPTlZFUlRfVE9fVFlQRSwKKwlSRUdJU1RFUl9DT05WRVJUX0ZST01fVFlQRSk6IFN3YXAgd29yZHMgaWYgdGFyZ2V0LCBub3QgaG9zdCwKKwlpcyBiaWctZW5kaWFuIGFuZCBpZiByZWdpc3RlcnMgYXJlIDMyIGJpdHMuCisJKiBtaXBzLXRkZXAuYyAobWlwc19wcmludF9yZWdpc3RlciwgbWlwc19leHRyYWN0X3JldHVybl92YWx1ZSwKKwltaXBzX3N0b3JlX3JldHVybl92YWx1ZSk6IEZpeCBmbG9hdGluZy1wb2ludCB3b3JkLW9yZGVyIHByb2JsZW1zIG9uCisJbGl0dGxlLWVuZGlhbiB0YXJnZXRzIGludHJvZHVjZWQgYnkgY2hhbmdlcyBvZiBNYXIgMjEuCisKK1N1biBNYXIgMjMgMTU6NDM6MjcgMTk5NyAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiByZW1vdGUuYyAodGFyZ2V0X3Jlc3VtZV9ob29rLCB0YXJnZXRfd2FpdF9sb29wX2hvb2spOiBOZXcKKyAJZ2xvYmFscy4KKyAJKHJlbW90ZV9yZXN1bWUsIHJlbW90ZV93YWl0KTogVXNlIHRoZW0uCisJKiBkMTB2LXRkZXAuYzogU2V0IHRoZSBhYm92ZSBob29rcy4KKwkodHJhY2Vzb3VyY2UpOiBOZXcgR0RCIHZhcmlhYmxlLCBjb250cm9scyBzb3VyY2UgZGlzcGxheSBpbgorIAl0cmFjZXMuCisJKGRpc3BsYXlfdHJhY2UpOiBGaW5kIGFuZCBkaXNwbGF5IHNvdXJjZSBsaW5lIGlmIHJlcXVlc3RlZC4KKwkodHJhY2VfaW5mbyk6IE1lbnRpb24gZW1wdHkgdHJhY2UgYnVmZmVyIGlmIGFwcHJvcHJpYXRlLgorCSh0ZGlzYXNzZW1ibGVfY29tbWFuZCk6IFJvYnVzdGlmeSBhcmd1bWVudCBoYW5kbGluZy4KKworCSogY29uZmlndXJlLmhvc3Q6IFJlbW92ZSBleHRyYSBib2d1cyBMaW51eCBjYXNlLgorCitTYXQgTWFyIDIyIDE2OjQxOjM1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmMgKHNpbXVsYXRvcl9jb21tYW5kKTogQWRkIGNvbW1lbnQgYWJvdXQgZGVhbGluZyB3aXRoCisJTlVMTCBvciBlbXB0eSBhcmdzLgorCitTYXQgTWFyIDIyIDAyOjQ4OjExIDE5OTcgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogYy1leHAueSAoeXlsZXgpOiAgSGFuZGxlIG5lc3RlZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdHMuCisJKiBzeW10YWIuYyAoZGVjb2RlX2xpbmVfMik6ICBGaXggdGVzdCBmb3IgdmFsaWQgY2hvaWNlIG51bWJlci4KKworRnJpIE1hciAyMSAxOToxMDowNSAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIG1pcHMtdGRlcC5jIChtaXBzX3B1c2hfYXJndW1lbnRzKTogT24gbm9uLUVBQkkgYXJjaGl0ZWN0dXJlcywKKwljb3B5IGZpcnN0IHR3byBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMgdG8gZ2VuZXJhbCByZWdpc3RlcnMsIHNvIHRoYXQKKwlNSVBTMTYgZnVuY3Rpb25zIHdpbGwgcmVjZWl2ZSB0aGUgYXJndW1lbnRzIGNvcnJlY3RseS4KKwkobWlwc19wcmludF9yZWdpc3Rlcik6IFByaW50IGRvdWJsZSByZWdpc3RlcnMgY29ycmVjdGx5IG9uCisJbGl0dGxlLWVuZGlhbiBob3N0cy4KKwkobWlwc19leHRyYWN0X3JldHVybl92YWx1ZSk6IFJldHVybiBkb3VibGUgdmFsdWVzIGNvcnJlY3RseQorCW9uIGxpdHRsZS1lbmRpYW4gaG9zdHMuCisKKwkqIG1kZWJ1Z3JlYWQuYyAocGFyc2VfcHJvY2VkdXJlKTogQWRqdXN0IGFkZHJlc3Mgb2YgcHJvY2VkdXJlIHJlbGF0aXZlCisJdG8gYWRkcmVzcyBpbiBmaWxlIGRlc2NyaXB0b3IgcmVjb3JkOyB0aGlzIGFjY291bnRzIGZvciBjb25zdGFudAorCXN0cmluZ3MgdGhhdCBtYXkgcHJlY2VkZSBmdW5jdGlvbnMgaW4gdGhlIHRleHQgc2VjdGlvbi4gIFJlbW92ZQorCW5vdy11c2VsZXNzIGxvd2VzdF9wZHJfYWRkciBmcm9tIGFyZ3VtZW50IGxpc3QgYW5kIGFsbCBjYWxscy4KKworRnJpIE1hciAyMSAxNTozNjoyNSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndCAocG93ZXJwYyote2VhYmksbGludXgsc3lzdixlbGZ9Kik6IERldGVybWluZQorCXdoZXRoZXIgdGhlIHNpbXVsYXRvciB3aWxsIGJlIGJ1aWx0IGJ5IHdoZXRoZXIgdGhlIE1ha2VmaWxlIGluIHRoZQorCXNpbXVsYXRvciBkaXJlY3Rvcnkgd2FzIGJ1aWx0LgorCisJKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLXNpbS1wb3dlcnBjKTogRGVsZXRlIHN3aXRjaC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworVGh1IE1hciAyMCAyMDo1MjowNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAyMDAtdGRlcC5jIChtbjEwMjAwX2FuYWx5emVfcHJvbG9ndWUpOiBMb29rIGZvciBzYXZlIG9mICJhMSIKKwlpbiB0aGUgcHJvbG9ndWUgdG9vLgorCisJKiByZW1vdGUtc2ltLmMgKGdkYl9vc192cHJpbnRmX2ZpbHRlcmVkKTogRml4IHRvIHdvcmsgd2l0aCBub24tQU5TSQorCWNvbXBpbGVycy4KKwkoZ2RiX29zX2V2cHJpbnRmX2ZpbHRlcmVkKTogU2ltaWxhcmx5LgorCQorV2VkIE1hciAxOSAxNjoxMzoyMiAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBwaXp6YS5jeWdudXMuY29tPgorCisJTmV3IFVuaXhXYXJlIDIuMSBjb25maWd1cmF0aW9uCisJKiBjb25maWcvaTM4Ni9pMzg2djQybXAubXQ6IG5ldworCSogY29uZmlnL2kzODYvaTM4NnY0Mm1wLm1oOiBuZXcKKwkqIGNvbmZpZy9pMzg2L3RtLWkzODZ2NDJtcC5oOiBuZXcKKwkqIGNvbmZpZy9pMzg2L25tLWkzODZ2NDJtcC5oOiBuZXcKKwkqIGNvbmZpZ3VyZS50Z3Q6IGFkZGVkIG5ldyBlbnRyaWVzCisJKiBjb25maWd1cmUuaG9zdDogYWRkZWQgbmV3IGVudHJpZXMKKworTW9uIE1hciAxNyAxNzo1MjowMCAxOTk3ICBKLlQuIENvbmtsaW4gIDxqdGNAY3lnbnVzLmNvbT4KKworCSogZHNyZWMuYyAobG9hZF9zcmVjKTogUHJpbnQgbGVhZGluZyB6ZXJvZXMgd2hlbiBwcmludGluZyBzZWN0aW9uCisgCWFkZHJlc3Nlcy4KKworTW9uIE1hciAxNyAxNTowMDoxNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLXNpbS5oOiBEZWxldGUgLSBtb3ZlZCB0byAuLi9pbmNsdWRlL3JlbW90ZS1zaW0uaC4KKyAJCisJKiBNYWtlZmlsZS5pbiAocmVtb3RlX3V0aWxzX2gpOiBVcGRhdGUgcGF0aCB0byByZW1vdGUtc2ltLmguCisKK0ZyaSBNYXIgIDcgMjA6NTU6MjggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zaW0uYyAoZmx1c2hfc3Rkb3V0LCB3cml0ZV9zdGRlcnIsIGZsdXNoX3N0ZGVyciwKKyAJdnByaW50Zl9maWx0ZXJlZCwgZXZwcmludGZfZmlsdGVyZWQpOiBDYWxsYmFja3MgdGhhdCBhY2NlcHQKKyAJdmFyYXJncy4KKwkKK1NhdCBNYXIgMTUgMDA6NTA6NDYgMTk5NyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBicmVha3BvaW50LmMgKGluc2VydF9icmVha3BvaW50cywgd2F0Y2hwb2ludF9jaGVjaywKKwlicHN0YXRfc3RvcF9zdGF0dXMpOiAgRG8gbm90IGRpc2FibGUgd2F0Y2hwb2ludHMgZ29pbmcgb3V0IG9mIHNjb3BlLgorCShpbnNlcnRfYnJlYWtwb2ludHMpOiAgTWFrZSBzdXJlIHRoYXQgdGhlIGN1cnJlbnQgZnJhbWUgaXMgdmFsaWQKKwliZWZvcmUgY2FsbGluZyBmaW5kX2ZyYW1lX2FkZHJfaW5fZnJhbWVfY2hhaW4uCisKKwkqIHRvcC5jIChzZXR1cF91c2VyX2FyZ3MpOiAgSGFuZGxlIHF1b3RlcyBhbmQgYmFja3NsYXNoZXMuCisJKHByaW50X2dkYl92ZXJzaW9uKTogIFVwZGF0ZSBjb3B5cmlnaHQgeWVhci4KKworRnJpIE1hciAxNCAxNTo0NDowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChlbGZyZWFkLm8pOiBEZXBlbmQgdXBvbiBlbGYtYmZkLmggYW5kIGVsZi9taXBzLmguCisKK1RodSBNYXIgMTMgMjI6NTE6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiB1dGlscy5jIChwb2xscXVpdCwgbm90aWNlX3F1aXQpOiBJZiBfV0lOMzIsIGxpbWl0IHRlc3QgZm9yCisJY250bC1DIHRvIHdpbmdkYi4KKwkoaW5pdGlhbGl6ZV91dGlscyk6IElmIF9XSU4zMiwgZG9uJ3QgY2FsbCBTY3JlZW5Sb3dzIGFuZCBTY3JlZW5Db2xzIAorCWV4Y2VwdCB1bmRlciB3aW5nZGIuICAoQ29udHJpYnV0ZWQgYnkgTWFydGluIEh1bnQpLgorCitUaHUgTWFyIDEzIDEyOjQwOjQ5IDE5OTcgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKwkqIGNvbmZpZ3VyZS5pbjogUnVuIEFDX0NPTkZJR19BVVhfRElSIGJlZm9yZSBBQ19DQU5PTklDQUxfU1lTVEVNLgorCitUaHUgTWFyIDEzIDExOjAwOjIyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zaW0uaCAoc2ltX3N0YXRlLCBTSU1fREVTQyk6IE5ldyB0eXBlcy4KKwkoc2ltX29wZW4pOiBSZXR1cm4gYSBgZGVzY3JpcHRvcicgYXMgcmVzdWx0LgorCSgqKTogTmV3IGFyZ3VtZW50IG9mIGRlc2NyaXB0b3IgcmVzdWx0IGZyb20gc2ltX29wZW4uCisJKiByZW1vdGUtc2ltLmMgKGdkYnNpbV9kZXNjKTogUmVuYW1lZCBmcm9tIGdkYnNpbV9vcGVuX3AuCisJKGdkYnNpbV9vcGVuKTogUmVjb3JkIHJlc3VsdCBvZiBzaW1fb3BlbiBpbiBnZGJzaW1fZGVzYy4KKwlQYXNzIGFyZ3YgbGlzdCB0byBzaW1fb3BlbiwgYXJndlswXSA9IHBzZXVkbyBwcm9ncmFtIG5hbWUuCisJKCopOiBQYXNzIGdkYnNpbV9kZXNjIHRvIHNpbV9mb28gZm5zLgorCitXZWQgTWFyIDEyIDE0OjQwOjA2IDE5OTcgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogY29uZmlnLmluOiBSZWdlbmVyYXRlZC4KKworCSogYWNjb25maWcuaCAoU1RBUlRfSU5GRVJJT1JfVFJBUFNfRVhQRUNURUQsIHN5c19xdW90YWN0bCwKKwlIQVZFX0hQVVhfVEhSRUFEX1NVUFBPUlQpOiBEZWZpbmUuCisKK1R1ZSBNYXIgMTEgMDc6MjU6MjcgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJRmlyc3QgY3V0IGF0IHN1cHBvcnRpbmcgc2ltdWxhdG9ycyBpbiBnZGJzZXJ2ZXI6CisKKwkqIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluOiBBbGxvdyBnZGJzZXJ2ZXIgdG8gYmUgY29uZmlndXJlZAorCWZvciBjcm9zcy10YXJnZXQgZW52aXJvbm1lbnRzLgorCSogZ2Ric2VydmVyL01ha2VmaWxlLmluOiBBZGQgc2ltdWxhdG9yIHN1cHBvcnQuCisJKiBnZGJzZXJ2ZXIvY29uZmlndXJlLmluOiBFbGltaW5hdGUgYXNzdW1wdGlvbiB0aGF0IGhvc3QgPT0gdGFyZ2V0LgorCVNpbXBsaWZ5IHVzaW5nIGdkYi9jb25maWd1cmUudGd0IGFuZCBnZGIvY29uZmlndXJlLmhvc3QuCisJRml4IG90aGVyIG1pbm9yIGNvbmZpZ3VyYXRpb24gZXJyb3JzLgorCSogZ2Ric2VydmVyL2xvdy1zcGFyYy5jOiBGaXggY29tcGlsZSBlcnJvci4KKwkqIGdkYnNlcnZlci9yZW1vdGUtdXRpbHMuYzogRWxpbWluYXRlIGFzc3VtcHRpb24gdGhhdCByZWdpc3RlcnMKKwlhbmQgYWRkcmVzc2VzIGFyZSBmb3VyIGJ5dGVzLiAgRml4IG1pbm9yIGNvbXBpbGUgZXJyb3JzIGFuZCB3YXJuaW5ncy4KKwkqIGdkYnNlcnZlci9zZXJ2ZXIuYzogUmV3cml0ZSBudW1lcm91cyBpbnN0YW5jZXMgb2YgaWRlbnRpY2FsIGNvZGUKKwlmb3Igc3RhcnRpbmcgaW5mZXJpb3IgcHJvY2Vzc2VzIHRvIGNhbGwgbmV3IGZ1bmN0aW9uIHN0YXJ0X2luZmVyaW9yLgorCUVsaW1pbmF0ZSBhc3N1bXB0aW9uIHRoYXQgcmVnaXN0ZXJzIGFuZCBhZGRyZXNzZXMgYXJlIGZvdXIgYnl0ZXMuCisJKiBnZGJzZXJ2ZXIvc2VydmVyLmg6IEFkZCBtaXNzaW5nIHByb3RvdHlwZXMgdG8gZWxpbWluYXRlIGNvbXBpbGVyCisJd2FybmluZ3MuCisJKiBnZGJzZXJ2ZXIvbG93LXNpbS5jOiBOZXcgZmlsZSB0byBtYXRlIGdkYnNlcnZlciB3aXRoIHNpbXVsYXRvcnMuCisJKiBjb25maWcvbWlwcy92cjUwMDAubXQ6IEFkZCBWcjUwMDAgc2ltdWxhdG9yIHN1cHBvcnQgdG8gZ2Ric2VydmVyLgorCSogY29uZmlnL2kzODYvbGludXgubWg6IEVsaW1pbmF0ZSBnZGJzZXJ2ZXIgc3VwcG9ydCBhcyBhIGZpcnN0IHN0ZXAKKwlpbiBtb3Zpbmcgc3VjaCBzdXBwb3J0IGZyb20gaG9zdCB0byB0YXJnZXQgbWFrZWZpbGUgZnJhZ21lbnRzLgorCSogY29uZmlnL2kzODYvbGludXgubXQ6IE1vdmUgZ2Ric2VydmVyIHN1cHBvcnQgaGVyZSBmcm9tIGxpbnV4Lm1oLgorCitNb24gTWFyIDEwIDEyOjI3OjQ3IDE5OTcgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIHN5bXRhYi5oIChJTklUX1NBTCk6IE5ldyBtYWNybyB0byBpbml0aWFsaXplIHN5bXRhYl9hbmRfbGluZSwgCisJdG8gaW5zdXJlIGNvbnNpc3RhbnQgaW5pdGlhbGl6YXRpb24gb2YgdW51c2VkIGZpZWxkcyB0byB6ZXJvLgorCSogc3ltdGFiLmM6IHJlcGxhY2UgaW5pdGlhbGl6YXRpb25zIG9mIHNhbHMgd2l0aCBuZXcgbWFjcm8gSU5JVF9TQUwuCisJKiBicmVha3BvaW50LmM6IGRpdHRvLgorCSogaW5mcnVuLmM6IGRpdHRvLgorCSogaW5mY21kLmM6IGRpdHRvLgorCSogc291cmNlLmM6IGFkZCBjYWxsIHRvIElOSVRfU0FMIG1hY3JvLgorCitTYXQgTWFyICA4IDAwOjE2OjM3IDE5OTcgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogc3BhcmMtdGRlcC5jIChpc2JyYW5jaCk6ICBBbHdheXMgaGFuZGxlIHY5IGJyYW5jaCBpbnN0cnVjdGlvbnMsCisJdGhleSBtaWdodCBnZXQgdXNlZCBvbiAzMiBiaXQgdGFyZ2V0cyBhcyB3ZWxsLgorCitXZWQgTWFyICA1IDE5OjM0OjA5IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiByZW1vdGUtbWlwcy5jIChtaXBzX2V4aXRfZGVidWcpOiBTb21lIElEVCBib2FyZHMgZG9uJ3QKKwlzZW5kIHRoZSBmdWxsIGV4aXQgc3RyaW5nLgorCitXZWQgTWFyICA1IDEyOjU5OjI3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDIwMC10ZGVwLmMgKG1uMTAyMDBfcHVzaF9hcmd1bWVudHMpOiBIYW5kbGUgbmV3IGNhbGxpbmcKKwljb252ZW50aW9ucy4KKwkobW4xMDIwMF9zdG9yZV9zdHJ1Y3RfcmV0dXJuKTogTGlrZXdpc2UuCisKK1R1ZSBNYXIgIDQgMTA6MzE6MDIgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBtaXBzLXRkZXAuYyAobWlwc19mZXRjaF9pbnN0cnVjdGlvbik6IE5ldyBmdW5jdGlvbjsgcmVwbGFjZQorCWNvbW1vbiBjb2RlIHRocm91Z2hvdXQgd2l0aCBjYWxscyB0byBpdC4KKwkobWlwc19maW5kX3NhdmVkX3JlZ3MpOiBFeGFtaW5lIE1JUFMxNiBlbnRyeSBpbnN0cnVjdGlvbiB0byBkZXRlcm1pbmUKKwljb3JyZWN0IHNhdmVkIGFkZHJlc3NlcyBvZiAkczAgYW5kICRzMS4KKwkobWlwc19maW5kX3NhdmVkX3JlZ3MsIG1pcHMxNl9oZXVyaXN0aWNfcHJvY19kZXNjKTogIFVzZSBNSVBTX1JFR1NJWkUKKwlpbnN0ZWFkIG9mIGhhcmRjb2RlZCA0LgorCShtaXBzMTZfc2tpcF9wcm9sb2d1ZSk6IEhhbmRsZSBleHRlbmRlZCBpbnN0cnVjdGlvbnMgY29ycmVjdGx5LgorCitNb24gTWFyICAzIDEyOjI5OjIwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGRlZnMuaCAoTE9OR0VTVCk6IE1vdmUgI2lmbmRlZiBMT05HRVNUIHRvIG91dHNpZGUuCisJVHJ5IEJGRF9IT1NUXzY0X0JJVCBpZiAhIENDX0hBU19MT05HX0xPTkcuCisKK1RodSBGZWIgMjcgMTg6NTQ6MTEgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBtaXBzLXRkZXAuYyAoSVNfTUlQUzE2X0FERFIsIE1BS0VfTUlQUzE2X0FERFIsIFVOTUFLRV9NSVBTMTZfQUREUik6CisJTmV3IG1hY3JvcyBmb3IgdGVzdGluZywgc2V0dGluZywgYW5kIGNsZWFyaW5nIGJpdCAwIG9mIGFkZHJlc3Nlcy4KKwlDaGFuZ2UgbnVtZXJvdXMgYml0cyBvZiBjb2RlIHdoZXJlIGJpdCAwIHdhcyBiZWluZyBtYW5pcHVsYXRlZAorCXRvIHVzZSB0aGVzZSBtYWNyb3MuCisKK1RodSBGZWIgMjcgMTQ6MTI6NDEgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiByZW1vdGUtbWlwcy5jOiBQdXQgYmFjayB0aGUgZm9ybSBmZWVkcy4KKworVGh1IEZlYiAyNyAxMjowNDoyNCAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1taXBzLmM6IFJlbW92ZSBmb3JtIGZlZWRzICheTCkgZnJvbSBzb3VyY2UuCisJKG1pcHNfaW5pdGlhbGl6ZSk6IExTSSBQTU9OIGRvZXNuJ3Qgc3VwcG9ydCAnc2V0IHJlZ3NpemUnIGNvbW1hbmQuCisJKHBtb25fd2FpdCk6IERvbid0IG5lZWQgdG8gZXhpdCBhbmQgcmUtZW50ZXIgZGVidWcgbW9kZSBvbiBMU0kKKwlQTU9OIGFmdGVyIGEgY29udGludWU7IGl0IGNhdXNlcyB0YXJnZXQgcHJvZ3JhbSBtaXNiZWhhdmlvci4KKwkobWlwc19mZXRjaF9yZWdpc3Rlcik6IERvbid0IGZldGNoIHVuc3VwcG9ydGVkIHJlZ2lzdGVyczsgdGhpcworCWN1dHMgZG93biBvbiB3YXN0ZWQgc2VyaWFsIHRyYWZmaWMuCisKK1RodSBGZWIgMjcgMDk6Mzg6MTYgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIGNvbmZpZ3VyZSAoSFBVWC9PU0YgdGhyZWFkIHN1cHBvcnQpOiAgRW5hYmxlIHRoaXMKKwlvbmx5IHdoZW4gcnVubmluZyBHQ0MsIHNpbmNlIEhQJ3MgdGhyZWFkIGhlYWRlciBmaWxlcyB1c2UgQU5TSSBDCisJd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSB0aGVpciBkZWZhdWx0IGNvbXBpbGVyLgorCisJKiBjb25maWd1cmUuaG9zdCAoaVszNDU2XTg2LSotd2luZG93cyk6ICBEaXNhYmxlIGxvbmcgbG9uZworCXN1cHBvcnQgZm9yIFdpbkdEQi4gIEFkZCBtc3dpbiB0byBjb25maWdkaXJzLgorCSogY29uZmlndXJlLmluIGNvbmZpZ3VyZTogIE1vdmUgY2FsbHMgdG8gY29uZmlndXJlLmhvc3QgYW5kCisJY29uZmlndXJlLnRndCB0byB0aGUgdG9wIG9mIGNvbmZpZ3VyZS5pbiB0byBhbGxvdyB0aGVtIHRvIHNldAorCWNvbmZpZyB2YXJpYWJsZXMgYmVmb3JlIHRoZXkgYXJlIHJlZmVyZW5jZWQuCisKK1R1ZSBGZWIgMjUgMjA6MjE6NTIgMTk5NyAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0IChtaXBzKi0qLWxuZXdzKik6IE5ldyB0YXJnZXQuCisKK01vbiBGZWIgMjQgMTY6MzU6MDAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMjAwLXRkZXAuYyAobW4xMDIwMF9hbmFseXplX3Byb2xvZ3VlKTogRG9uJ3QgZml4IGZpLT5mcmFtZQorCWlmIHdlJ3JlIG5vdCB0aGUgaW5uZXJtb3N0IGZyYW1lLiAgRml4IG1pbm9yIHR5cG9zLgorCitTYXQgRmViIDIyIDAzOjM5OjUwIDE5OTcgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogc3RhYnNyZWFkLmMgKHJlYWRfdHlwZSk6ICBGaXggaGFuZGxpbmcgb2YgdGVtcGxhdGUgbmFtZXMKKwl3aXRoIHRlbXBsYXRlIHBhcmFtZXRlcnMgY29udGFpbmluZyBgOjonLgorCisJKiB2YWxvcHMuYyAoc2VhcmNoX3N0cnVjdF9maWVsZCwgc2VhcmNoX3N0cnVjdF9tZXRob2QpOgorCVBhc3MgY29ycmVjdCB2YWxhZGRyIHBhcmFtZXRlciB0byBiYXNlY2xhc3Nfb2Zmc2V0LgorCVByZXZlbnQgZ2RiIGNyYXNoZXMgYnkgbWFraW5nIHN1cmUgdGhhdCB0aGUgdmlydHVhbCBiYXNlIHBvaW50ZXIKKwlmcm9tIGFuIHVzZXIgb2JqZWN0IHN0aWxsIHBvaW50cyB0byBhY2Nlc3NpYmxlIG1lbW9yeS4KKworVHVlIEZlYiAxOCAxMzozNjozNCAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIG1haW50LmM6IEVsaW1pbmF0ZSAtV2FsbCB3YXJuaW5ncyBieSBpbmNsdWRpbmcgc29tZSBoZWFkZXIgZmlsZXMuCisKK1R1ZSBGZWIgMTggMTM6MDY6MzAgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmMgKGluaXRfY2FsbGJhY2tzKTogVW5kbyBwcmV2aW91cyBjaGFuZ2UuCisKK1R1ZSBGZWIgMTggMTE6MTM6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBtYWludC5jOiBGaXggZGVyZWZlcmVuY2Ugb2YgcG9pbnRlci4KKwkqIHJlbW90ZS1zaW0uYzogRml4IHJlZmVyZW5jZSBvZiBzdHJ1Y3R1cmUgbWVtYmVyICJsYXN0X2Vycm9yIi4KKwkqIGRlYnVnaWZ5LmM6IEluY2x1ZGUgY29uZmlnLmggdG8gZ2V0IEFOU0kgZGVmaW5pdGlvbnMuCisKK1NhdCBGZWIgMTUgMTc6NDM6NDYgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXZ4LmMgKHZ4X2F0dGFjaCk6IFJlbW92ZSBjb2RlIGFkZGVkIGJ5IGt1bmcuICBJdCBtYWRlIG5vCisgCXNlbnNlLgorCitGcmkgRmViIDE0IDEzOjAwOjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogbWFpbi5jIChwcmludF9nZGJfaGVscCk6IE1ha2Ugc3RhdGljIHRvIG1hdGNoIGRlY2xhcmF0aW9uLgorCitUaHUgRmViIDEzIDE4OjE4OjE4IDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLWU3MDAwLmMsIHNlci1lN2twYy5jLCBzZXJpYWwuYzogUmVtb3ZlIC8vIGNvbW1lbnRzLgorCitXZWQgRmViIDEyIDE1OjU4OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KKworCSogZGVidWdpZnkuYywgZGVidWdpZnkuaDogTWFrZSBzYWZlIGZvciBub24tYW5zaSBjb21waWxlcnMuCisKK1dlZCBGZWIgMTIgMTU6MzA6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBkZWZzLmg6IEZpeCBwcm90b3R5cGVzIGZvciBuZXcgY2xlYW51cCBmdW5jdGlvbnMuCisKK1dlZCBGZWIgMTIgMTU6MDg6NDcgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBkZWJ1Z2lmeS5jLCBkZWJ1Z2lmeS5oOiBGaXggZm9yIGdlbmVyYWwgZ251IHVzZS4gIFJlbW92ZSBDKysgCisJY29tbWVudCwgYWRkIFBBUkFNUywgYWRkIGxpY2Vuc2UgaW5mbyBhbmQgZml4IGluZGVudGF0aW9uLgorCitXZWQgRmViIDEyIDE0OjQyOjQ3IDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KKworCSogZGVidWdpZnkuYywgZGVidWdpZnkuaDogTmV3IGZpbGVzLiAgUHJvdmlkZSBjb21tb24gbWFjcm9zCisJZm9yIHdyaXRpbmcgZGVidWcgaW5mbyB0byBhIGxvZyBmaWxlIG9yIHN0ZGlvLgorCitXZWQgRmViIDEyIDAyOjQ0OjM5IDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KKworICAgICAgICAqIGMtdmFscHJpbnQuYyAoY192YWxfcHJpbnQpOiBGaXggcHJpbnRpbmcgZm9yIGFycmF5cyBkZWZpbmVkCisgICAgICAgIHdpdGggMCBsZW5ndGguCisKK1R1ZSBGZWIgMTEgMjI6MjQ6MzkgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBkZWZzLmg6IEZpeCBjbnRsLUMgdG8gcmVhZCBmcm9tIHRoZSBXaW5kb3dzIG1lc3NhZ2UgcXVldWUuCisJQWRkIHByb3RvdHlwZXMgZm9yIG1ha2VfZmluYWxfY2xlYW51cCAoYW5kIHRoZSBvdGhlciBjbGVhbnVwCisJcm91dGluZXMuCisJKiByZW1vdGUtZTcwMDAuYzogRml4IHN5bmMgY29kZSB0byB0aW1lb3V0IGlmIHVuYWJsZSB0byBzeW5jLgorCUNoYW5nZSBzeW5jIGNvZGUgdG8gcmVwb3J0IHN0YXR1cyB3aGlsZSB0cnlpbmcgdG8gc3luYy11cCAKKwl3aXRoIGhhcmR3YXJlLiAgQWRkIGRlYnVnZ2luZyBvdXRwdXQgYW5kIGRvY3VtZW50LgorCSogc2VyLWU3a3BjLmM6IFN3YXAgb3JkZXIgb2YgbGVuICYgb2Zmc2V0IHRvIG1hdGNoIGltcGxlbWVudGF0aW9uLgorCUFkZCBkZWJ1Z2dpbmcgb3V0cHV0IGFuZCBkb2N1bWVudC4KKwkqIHNlcmlhbC5jOiBBZGQgZGVidWdnaW5nIG91dHB1dC4KKwkqIHRvcC5jOiBBZGQgY2FsbCB0byBkb19maW5hbF9jbGVhbnVwcy4KKwlSZW1vdmUgY29uZGl0aW9uYWxzIHByZXZlbnRpbmcgV2luMzIgZnJvbSBnZXR0aW5nIFNJR1FVSVQuCisJKiB1dGlscy5jOiAoKl9jbGVhbnVwKTogTW9kaWZ5IGNsZWFudXAgcm91dGluZXMgdG8gYWNjZXB0IGEgY2xlYW51cAorCWNoYWluIGFzIGEgcGFyYW1ldGVyLiAgRXh0cmFjdCB0aGlzIGdlbmVyaWMgY29kZSBmcm9tIHRoZSBjbGVhbnVwIAorCXJvdXRpbmVzIGludG8gc2VwYXJhdGUgZnVudGlvbnMgKCpfbXlfY2xlYW51cCkuICBLZWVwIG9sZCAKKwlmdW5jdGlvbmFsaXR5IGJ5IHBhc3NpbmcgImNsZWFudXBfY2hhaW4iIHRvIHRoZSBuZXcgZnVudGlvbnMuICAKKwlEZWZpbmUgdGhlIGNsZWFudXAgY2hhaW4gImZpbmFsX2NsZWFudXBfY2hhaW4iIHRvIGJlIGEgY2xlYW51cCAKKwljaGFpbiB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgd2hlbiBnZGIgZXhpdHMuICBBZGQgZnVuY3Rpb25zIAorCSgqX2ZpbmFsX2NsZWFudXApIHRvIG1hdGNoIHRoZSBvcmlnaW5hbCAoKl9jbGVhbnVwKSBmdW5jdGlvbnMuCisJKHBvbGxxdWl0LCBxdWl0LCBub3RpY2VfcXVpdCk6IEZpeCB0byByZWFkIGNudGwtQyBmcm9tIHRoZSAKKwlXaW5kb3dzIG1lc3NhZ2UgcXVldWUuCisKK1R1ZSBGZWIgMTEgMTU6MzY6MzEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbTMyci1yb20uYzogI2luY2x1ZGUgPHN5cy90eXBlcy5oPi4KKwkjaWZkZWYgb3V0IG5ldyBsb2FkIHN1cHBvcnQgaWYgd2luZ2RiLgorCSogbTMyci90bS1tMzJyLmggKFRBUkdFVF9NMzJSKTogRGVmaW5lLCBmb3Igd2luZ2RiLgorCitUdWUgRmViIDExIDEyOjI4OjA5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCisJKiBjb25maWcvbW4xMDIwMC90bS1tbjEwMjAwLmggKFNUT1JFX1NUUlVDVF9SRVRVUk4pOiBGaXguCisJKiBtbjEwMjAwLXRkZXAuYyAobW4xMDIwMF9zdG9yZV9zdHJ1Y3RfcmV0dXJuKTogTmV3IGZ1bmN0aW9uLgorCisJKiBjb25maWcvbW4xMDIwMC90bS1tbjEwMjAwLmggKEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKTogRml4IGNhc2Ugd2hlbgorCWV4dHJhY3RpbmcgYSByZXR1cm4gdmFsdWUgZnJvbSBhIHJlZ2lzdGVyIHBhaXIuCisKKwkqIG1uMTAyMDAtdGRlcC5jIChtbjEwMjAwX3B1c2hfYXJndW1lbnRzKTogU3RhY2sgb25seSBuZWVkcyB0bworCWJlIHR3byBieXRlIGFsaWduZWQuICBSb3VuZCBhcmd1bWVudCBzaXplcyB1cCB0byB0d28gYnl0ZSBib3VuZGFyeS4KKwlXcml0ZSBvdXQgYXJncyBpbiB0d28gYnl0ZSBodW5rcy4KKwkobW4xMDIwMF9wdXNoX3JldHVybl9hZGRyZXNzKTogSW1wbGVtZW50LgorCSogY29uZmlnL21uMTAyMDAvdG0tbW4xMDIwMC5oIChFWFRSQUNUX1JFVFVSTl9WQUxVRSk6IEFib3J0IGZvcgorCXN0cnVjdHVyZXMgPiA4IGJ5dGVzICh0ZW1wb3JhcnkpLgorCShTVE9SRV9SRVRVUk5fVkFMVUUpOiBMaWtld2lzZS4KKwkoQ0FMTF9EVU1NWSk6IE5vIGxvbmdlciB1bmRlZmluZS4KKwkoVVNFX1NUUlVDVF9DT05WRU5USU9OKTogVXNlIGZvciBhcmdzID4gOCBieXRlcy4KKwkoUkVHX1NUUlVDVF9IQVNfQUREUik6IERlZmluZS4KKwkKK01vbiBGZWIgMTAgMTg6MzU6NTUgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBtaXBzLXRkZXAuYyAobm9uX2hldXJpc3RpY19wcm9jX2Rlc2MpOiBOZXcgZnVuY3Rpb24uCisJKGZpbmRfcHJvY19kZXNjKTogTW92ZSBub24taGV1cmlzdGljIHByb2Mgc2VhcmNoIGNvZGUgaW50byBzZXBhcmF0ZQorCWZ1bmN0aW9uLgorCShnZGJfcHJpbnRfaW5zbl9taXBzKTogVXNlIG5vbi1oZXVyaXN0aWMgbWV0aG9kIHRvIGZpbmQgcHJvY2VkdXJlCisJZGVzY3JpcHRvciwgdG8gYXZvaWQgcHJvbG9ndWUgZXhhbWluYXRpb24gd2hlbiBkaXNhc3NlbWJsaW5nLgorCSogcmVtb3RlLW1pcHMuYzogQWRkIHN1cHBvcnQgZm9yIG5ldyAibHNpIiB0YXJnZXQgKExTSSBNaW5pUklTQworCWFrYSBNaWNyb01ldGVvciBib2FyZCkuCisJKG1pcHNfZXhpdF9kZWJ1Zyk6IFByZXZlbnQgcHJvdG9jb2wgcmVpbml0aWFsaXphdGlvbiBpZiBhbiBlcnJvcgorCW9jY3VycyB3aGlsZSBleGl0aW5nIGRlYnVnIG1vZGUuCisKK01vbiBGZWIgMTAgMTY6MTE6NTcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMjAwLXRkZXAuYzogUmVtb3ZlIGxvdHMgb2YgZGVidWdnaW5nIHByaW50ZnMsIHVwZGF0ZS9pbXByb3ZlCisJY29tbWVudHMsIGZvcm1hdHRpbmcsIGV0Yy4gIFBsdXMgb3RoZXIgbWlub3IgZml4ZXMgZm9yIHByb2JsZW1zCisJSSBmb3VuZCBkdXJpbmcgbXkgZmlyc3QgcGFzcyBvdmVyIHRoZSBtbjEwMjAwIHBvcnQuCisJKG1uMTAyMDBfYW5hbHl6ZV9wcm9sb2d1ZSk6IE5ldyBmdW5jdGlvbi4KKwkobW4xMDIwMF9mcmFtZV9jaGFpbiwgbW4xMDIwMF9pbml0X2V4dHJhX2ZyYW1lX2luZm8pOiBVc2UgaXQuCisJKiBjb25maWcvbW4xMDIwMC90bS1tbjEwMjAwLmg6IExvdHMgb2YgdXBkYXRlcy9pbXByb3ZlbWVudHMgdG8KKwljb21tZW50cywgZm9ybWF0dGluZywgZXRjLiAgTWlub3IgZml4ZXMgZm9yIHByb2JsZW1zIEkgZm91bmQgZHVyaW5nCisJbXkgZmlyc3QgcGFzcyBvdmVyIHRoZSBtbjEwMjAwIHBvcnQuCisJKFRBUkdFVF8qX0JJVCk6IERlZmluZSBhcHByb3ByaWF0ZWx5IGZvciBpbnRzLCBsb25nIGxvbmdzLCBkb3VibGVzIGFuZAorCXBvaW50ZXJzLgorCShSRUdJU1RFUl9WSVJUVUFMX1RZUEUpOiBEZWZpbmUgYXMgYSBsb25nLgorCShFWFRSQUNUX1JFVFVSTl9WQUxVRSk6IFJld29yayB0byBkZWFsIHdpdGggbG9uZyBpbnRzIGxpdmluZworCWluIHJlZ2lzdGVyIHBhaXJzLgorCShTVE9SRV9SRVRVUk5fVkFMVUUpOiBTaW1pbGFybHkuCisKKwkqIGJsb2NrZnJhbWUuYyAoZ2VuZXJpY19nZXRfc2F2ZWRfcmVncyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKwkiYWRkciIuCisJKiBicmVha3BvaW50LmMgKGZyYW1lX2luX2R1bW15KTogTW92ZSBzdHJ1Y3QgYnJlYWtwb2ludCAqYiBkZWNsCisJaW5zaWRlICNpZmRlZiBDQUxMX0RVTU1ZLgorCSh3YXRjaF9jb21tYW5kXzEpOiBJbml0aWFsaXplIHRhcmdldF9yZXNvdXJjZXNfb2suCisJKiBjb21tYW5kLmMgKGRvX3NldHNob3dfY29tbWFuZCk6IFByb3ZpZGUgZHVtbXkgaW5pdGlhbGl6YXRpb24KKwlmb3IgIm1hdGNoIi4KKwkqIHZhbG9wcy5jIChmaW5kX2Z1bmN0aW9uX2FkZHIpOiBNb3ZlIGZ1bmN0aW9uICYgcHJvdG90eXBlIGluc2lkZQorCSNpZmRlZiBDQUxMX0RVTU1ZLgorCSh2YWx1ZV9hcmdfY29lcmNlKTogU2ltaWxhcmx5LgorCSh2YWx1ZV9vZl92YXJpYWJsZSk6IFByb3ZpZGUgZHVtbXkgaW5pdGlhbGl6YXRpb24gb2YgImZyYW1lIi4KKworTW9uIEZlYiAxMCAwNzo1NDoyNiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogeGNvZmZyZWFkLmMgKFJFQ09SRF9NSU5JTUFMX1NZTUJPTCk6IEFkZCBOVUxMIGFzZWN0aW9uKiBwYXJhbWV0ZXIKKyAJdG8gcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2xfYW5kX2luZm8gY2FsbCB0aGF0IHdhcyBtaXNzZWQgaW4gSmFuIDMKKwljaGFuZ2UuCisJKHNjYW5feGNvZmZfc3ltdGFiKTogRGl0dG8uCisKK1N1biBGZWIgMDkgMDk6MjM6MjYgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiByZW1vdGUtbWlwcy5jIChjb21tb25fYnJlYWtwb2ludCk6IFByZXZlbnQgNjQtYml0IGFkZHJlc3NlcworCWZyb20gYmVpbmcgc2VudCB0byAzMi1iaXQgdGFyZ2V0cyBieSBtYXNraW5nIG9mZiB1cHBlciBiaXRzLgorCSogbWlwcy10ZGVwLmMgKGhldXJpc3RpY19wcm9jX3N0YXJ0KTogTWFzayBvZmYgdXBwZXIgMzIgYml0cworCW9mIFBDIG9uIDMyLWJpdCB0YXJnZXRzLgorCShtaXBzMTZfaGV1cmlzdGljX3Byb2NfZGVzYyk6IFJlY29nbml6ZSAnYWRkaXUgczEsc3AsbicgYXMgYQorCWZyYW1lIHNldHVwIGluc3RydWN0aW9uLgorCShtaXBzMzJfaGV1cmlzdGljX3Byb2NfZGVzYyk6IEZpeCB3YXJuaW5nIGZvdW5kIGJ5IGdjYyAtV2FsbC4KKwkobWlwczE2X3NraXBfcHJvbG9ndWUpOiBSZWNvZ25pemUgJ2FkZGl1IHMxLHNwLG4nIGFzIGEgdmFsaWQKKwlwcm9sb2d1ZSBpbnN0cnVjdGlvbi4gIEZpeCB3YXJuaW5ncyBhbmQgYnVncyBmb3VuZCBieSBnY2MgLVdhbGwuCisJKiBidWlsZHN5bS5jIChmaW5pc2hfYmxvY2spOiBJbXByb3ZlIGhhbmRsaW5nIG9mIG92ZXJsYXBwaW5nIGJsb2NrczsKKwlmaXhlcyBwcm9ibGVtIG9uIE1JUFMxNiBwcmludGluZyBmdW5jdGlvbiBhcmd1bWVudHMuCisKK1NhdCBGZWIgIDggMDE6MTQ6NDMgMTk5NyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBkd2FyZjJyZWFkLmMgKGR3YXJmMl9saW5rYWdlX25hbWUpOiAgTmV3IGZ1bmN0aW9uIHRvIGdldAorCXRoZSBsaW5rYWdlIG5hbWUgb2YgYSBkaWUgZnJvbSBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSBvcgorCURXX0FUX25hbWUuCisJKHJlYWRfZnVuY19zY29wZSwgZHdhcmYyX2FkZF9maWVsZCwgZHdhcmYyX2FkZF9tZW1iZXJfZm4sCisJbmV3X3N5bWJvbCk6ICBVc2UgaXQgaW5zdGVhZCBvZiBhY2Nlc3NpbmcgRFdfQVRfbmFtZS4KKwkocmVhZF9wYXJ0aWFsX2RpZSk6ICBVc2UgRFdfQVRfTUlQU19saW5rYWdlIG5hbWUgYXMgbmFtZSBvZiB0aGUKKwlwYXJ0aWFsIGRpZSBpZiBwcmVzZW50LgorCShkd2FyZjJfYWRkX21lbWJlcl9mbik6ICBNYWtlIGEgY29weSBvZiBwaHlzbmFtZSBvbiB0aGUgdHlwZSBvYnN0YWNrLgorCitGcmkgRmViICA3IDEwOjA2OjIyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogYmxvY2tmcmFtZS5jIChnZW5lcmljX2ZyYW1lX2NoYWluX3ZhbGlkKTogSWYgdGhlIG5ldyBmcmFtZQorCWlzIG5vdCBJTk5FUl9USEFOIHRoZSBvbGQgZnJhbWUsIHRoZW4gaXQncyBub3QgdmFsaWQuCisKK1R1ZSBGZWIgMDQgMDk6MDQ6MzcgMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBtaXBzLXRkZXAuYyAobWlwczE2X2dldF9pbW0pOiBGaXggY2FsY3VsYXRpb24gb2YgZXh0ZW5kZWQgaW1tZWRpYXRlLgorCShtaXBzMTZfaGV1cmlzdGljX3Byb2NfZGVzYyk6IFJlY29nbml6ZSBqYWwoeCkgaW5zdHJ1Y3Rpb24uCisKK01vbiBGZWIgMDMgMTc6NTc6NTggMTk5NyAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBtaXBzLXRkZXAuYyAobWlwczE2X2RlY29kZV9yZWdfc2F2ZSk6IERpc3Rpbmd1aXNoIGJldHdlZW4KKwlzZCBhbmQgc3cgaW5zdHJ1Y3Rpb25zIGNvcnJlY3RseS4KKwkoaGV1cmlzdGljX3Byb2Nfc3RhcnQpOiBBZGQgc3VwcG9ydCBmb3IgTUlQUzE2LgorCShtaXBzMTZfZ2V0X2ltbSwgbWlwczE2X2hldXJpc3RpY19wcm9jX2Rlc2MsCisJbWlwczMyX2hldXJpc3RpY19wcm9jX2Rlc2MpOiBOZXcgaGVscGVyIGZ1bmN0aW9ucyBmb3IKKwloZXVyaXN0aWNfcHJvY19kZXNjLgorCShoZXVyaXN0aWNfcHJvY19kZXNjKTogUmV3cml0ZSBhbmQgcmVvcmdhbml6ZSB0byBzdXBwb3J0IE1JUFMxNi4KKwkobWlwc19wdXNoX2FyZ3VtZW50cyk6IERvbid0IGFsaWduIHNtYWxsIGFyZ3VtZW50cyBpbiBFQUJJLgorCShtaXBzMzJfc2tpcF9wcm9sb2d1ZSk6IEF0dGVtcHQgdG8gc2hyaW5rIGNvZGUgc2l6ZSBhIGxpdHRsZS4KKworTW9uIEZlYiAgMyAxMTowNjowNSAxOTk3ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBtMzJyLXN0dWIuYzogTmV3IC0tIHJlbW90ZSBwcm90b2NvbCBzdXBwb3J0IGZvciBNMzJSIGNwdS4KKwkqIG0zMnItcm9tLmM6ICBTZXZlcmFsIGV4cGVyaW1lbnRzIHdpdGggaW1wcm92ZWQgZG93bmxvYWQgdGltZS4KKworRnJpIEphbiAzMSAwODoyNjozOSAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIG1pcHMtdGRlcC5jIChNSVBTMTZfSU5TVExFTik6IERlZmluZS4KKwkobWlwc19maW5kX3NhdmVkX3JlZ3MpOiBSZXBsYWNlIGhhcmRjb2RlZCAyJ3Mgd2l0aCBNSVBTMTZfSU5TVExFTi4KKwkoaGV1cmlzdGljX3Byb2Nfc3RhcnQpOiBSZWNvZ25pemUgJ2VudHJ5JyBwc2V1ZG8tb3AgYXMgYSBzdGFydAorCW9mIGZ1bmN0aW9uIG9uIE1JUFMxNi4KKwkobWlwczMyX3NraXBfcHJvbG9ndWUsIG1pcHMxNl9za2lwX3Byb2xvZ3VlKTogTmV3IGhlbHBlciBmdW5jdGlvbnMKKwlmb3IgbWlwc19za2lwX3Byb2xvZ3VlLgorCShtaXBzX3NraXBfcHJvbG9ndWUpOiBSZWNvZ25pemUgYm90aCAxNi0gYW5kIDMyLWJpdCBwcm9sb2d1ZXMuCisKK1dlZCBKYW4gMjkgMTI6NDU6NTQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWcvcG93ZXJwYy9wcGN7LGxlfS1zaW0ubXQgKFNJTSk6IFJlbW92ZSB0aGUgbGlicmFyeQorCS4uL3NpbS9jb21tb24vbGliY29tbW9uLmEuCisKK1R1ZSBKYW4gMjggMTU6NTQ6MTMgMTk5NyAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogYmxvY2tmcmFtZS5jOiBmaXggYSBudWxsIHBvaW50ZXIgcmVmIGluIGdlbmVyaWNfZ2V0X3NhdmVkX3JlZ2lzdGVyCisKK1R1ZSBKYW4gMjggMTU6Mzk6NTAgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogbW4xMDIwMC10ZGVwLmMgKG1uMTAyMDBfZnJhbWVfY2hhaW4pOiBHZXQgYmFzaWMgYmFja3RyYWNpbmcKKwl3b3JraW5nLgorCitNb24gSmFuIDI3IDE0OjMxOjUyIDE5OTcgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworRmlyc3Qgc2V0IG9mIGNoYW5nZXMgZm9yIG1pcHMxNjoKKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaCAoTUlQUzE2X0JJR19CUkVBS1BPSU5ULAorCU1JUFMxNl9MSVRUTEVfQlJFQUtQT0lOVCwgQlJFQUtQT0lOVF9GUk9NX1BDKTogRGVmaW5lLgorCShBQk9VVF9UT19SRVRVUk4pOiBDYWxsIG5ldyBmdW5jdGlvbiBtaXBzX2Fib3V0X3RvX3JldHVybi4KKwkobWlwc19icmVha3BvaW50X2Zyb21fcGMsIG1pcHNfYWJvdXRfdG9fcmV0dXJuKTogRGVjbGFyZS4KKwkqIG1lbS1icmVhay5jIChtZW1vcnlfYnJlYWtwb2ludF9mcm9tX3BjKTogTmV3IGZ1bmN0aW9uLgorCShtZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQsIG1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCk6IFVzZQorCW1lbW9yeV9icmVha3BvaW50X2Zyb21fcGMgdG8gZGV0ZXJtaW5lIGJyZWFrcG9pbnQgY29udGVudHMgYW5kIHNpemUuCisJKiB0YXJnZXQuaCAobWVtb3J5X2JyZWFrcG9pbnRfZnJvbV9wYyk6IERlY2xhcmUuCisJKiBtb25pdG9yLmMgKG1vbml0b3JfaW5zZXJ0X2JyZWFrcG9pbnQpOiBVc2UgbWVtb3J5X2JyZWFrcG9pbnRfZnJvbV9wYworCXRvIGRldGVybWluZSBzaXplIG9mIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uCisJKiBtaXBzLXRkZXAuYyAobWlwczMyX2RlY29kZV9yZWdfc2F2ZSwgbWlwczE2X2RlY29kZV9yZWdfc2F2ZSk6CisJTmV3IGhlbHBlciBmdW5jdGlvbnMgZm9yIG1pcHNfZmluZF9zYXZlZF9yZWdzLgorCShtaXBzX2ZpbmRfc2F2ZWRfcmVncyk6IFJlY29nbml6ZSBtaXBzMTYgcHJvbG9ndWVzLgorCShtaXBzX2FkZHJfYml0c19yZW1vdmUpOiBTdHJpcCBvZmYgdXBwZXIgMzIgYml0cyBvZiBhZGRyZXNzCisJd2hlbiB0YXJnZXQgQ1BVIGlzIDMyIGJpdHMgYnV0IENPUkVfQUREUiBpcyA2NCBiaXRzLgorCShtaXBzX3N0ZXBfc2tpcHNfZGVsYXkpOiBObyBicmFuY2ggZGVsYXkgc2xvdCBvbiBtaXBzMTYuCisJKGdkYl9wcmludF9pbnNuX21pcHMpOiBEaXNhc3NlbWJsZSBtaXBzMTYgY29kZS4KKwkobWlwc19icmVha3BvaW50X2Zyb21fcGMsIG1pcHNfYWJvdXRfdG9fcmV0dXJuKTogTmV3IGZ1bmN0aW9ucy4KKworTW9uIEphbiAyNyAxMDozNDowMyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHRtLW1uMTAyMDAuaCAoTlVNX1JFR1MpOiBEZWNyZWFzZSB0byAxMi4KKwkoUkVHSVNURVJfTkFNRVMpOiBFbGltaW5hdGlvbiByZWdpc3RlcnMgbm90IGZvdW5kIG9uIHRoZSBtbjEwMjAwLgorCShQQ19SRUdOVU0sIE1EUl9SRUdOVU0sIFBTV19SRUdOVU0pOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCisJKExJUl9SRUdOVU0sIExBUl9SRUdOVU0pOiBEZWxldGUuICBUaGV5IGRvbid0IGV4aXN0IG9uIHRoZSBtbjEwMjAwLgorCitTYXQgSmFuIDI1IDAwOjA3OjU5IDE5OTcgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZHdhcmYycmVhZC5jOiAgUmVwbGFjZSBpbnRlZ3JhbCB0YWcsIG5hbWUgYW5kIGZvcm0gZmllbGRzIGluCisJaW50ZXJuYWwgc3RydWN0dXJlIGRlZmluaXRpb25zIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZW51bWVyYXRpb24KKwl0eXBlcyBmcm9tIGR3YXJmMi5oLiBBZGQgZGVmYXVsdCBjYXNlcyB0byBzd2l0Y2hlcyBvbiBlbnVtZXJhdGlvbnMKKwl3aGVyZSBhcHByb3ByaWF0ZS4KKwlNYWtlIHF1b3Rpbmcgb2Ygc3RyaW5nIGFyZ3VtZW50cyBpbiBjb21wbGFpbnQgbWVzc2FnZXMgY29uc2lzdGVudC4KKwlDaGVjayBmb3IgTlVMTCByZXR1cm5zIGZyb20gRFdfU1RSSU5HLgorCShzdHJ1Y3QgcGFydGlhbF9kaWVfaW5mbyk6ICBBZGQgc2libGluZyBhbmQgaGFzX3R5cGUgZmllbGRzLCByZW1vdmUKKwl1bnVzZWQgdmFsdWUgZmllbGQuCisJKERXXyopOiAgTW92ZSBhY2Nlc3MgbWFjcm8gZGVmaW5pdGlvbnMgbmVhciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKKwlhdHRyaWJ1dGUgc3RydWN0dXJlLgorCShzdHJ1Y3QgZmllbGRfaW5mbyk6ICBOZXcgc3RydWN0dXJlIHRvIHBhc3MgaW5mb3JtYXRpb24gYWJvdXQgZmllbGRzCisJYW5kIG1lbWJlciBmdW5jdGlvbnMgYmV0d2VlbiBkaWUgcHJvY2Vzc2luZyByb3V0aW5lcy4KKwkoZHdhcmYyX2J1aWxkX3BzeW10YWJzX2hhcmQpOiAgU2V0IGN1X2hlYWRlcl9vZmZzZXQuCisJKHNjYW5fcGFydGlhbF9zeW1ib2xzKTogIERvIG5vdCBlbnRlciBEV19UQUdfc3VicHJvZ3JhbSBkaWVzIGludG8KKwl0aGUgcGFydGlhbCBzeW1ib2wgdGFibGUgaWYgdGhlIERXX0FUXypfcGMgYXR0cmlidXRlcyBhcmUgbWlzc2luZy4KKwlBZGQgZmlsZSBzY29wZSBiYXNlIHR5cGUgZGVmaW5pdGlvbnMgdG8gdGhlIHBhcnRpYWwgc3ltYm9sIHRhYmxlLgorCVNraXAgb3ZlciBjaGlsZCBkaWVzIGlmIHRoZSBkaWUgaGFzIGEgc2libGluZyBhdHRyaWJ1dGUuCisJKGFkZF9wYXJ0aWFsX3N5bWJvbCk6ICBFbnRlciBnbG9iYWwgdmFyaWFibGVzIHdpdGggdHlwZSBhdHRyaWJ1dGVzCisJYW5kIHdpdGhvdXQgbG9jYXRpb24gZGVzY3JpcHRvcnMgaW50byB0aGUgcGFydGlhbCBzeW1ib2wgdGFibGUuCisJU3RvcmUgdmFsdWUgb2YgRFdfVEFHX3ZhcmlhYmxlIGRpZXMgaW4gdGhlIHBhcnRpYWwgc3ltYm9sIHRhYmxlLgorCURvIG5vdCBlbnRlciBnbG9iYWwgdmFyaWFibGVzIGludG8gdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlLgorCUFkZCBiYXNlIHR5cGUgZGVmaW5pdGlvbnMgdG8gdGhlIHBhcnRpYWwgc3ltYm9sIHRhYmxlLgorCShwc3ltdGFiX3RvX3N5bXRhYl8xKTogIFVzZSBkd2FyZjJfZ2V0X3BjX2JvdW5kcyB0byBkZXRlcm1pbmUgaGlnaHBjLgorCShwcm9jZXNzX2RpZSk6ICBNb3ZlIGNoZWNrIGZvciBEV19BVF9sb3dfcGMgdG8gcmVhZF9mdW5jX3Njb3BlLgorCUFkZCBhIHR5cGVkZWYgc3ltYm9sIGZvciBiYXNlIHR5cGUgZGVmaW5pdGlvbnMgdG8gdGhlIHN5bWJvbCB0YWJsZS4KKwlJZ25vcmUgRFdfVEFHX2lubGluZWRfc3Vicm91dGluZSB0YWdzIGZvciBub3cuCisJKHJlYWRfZmlsZV9zY29wZSk6ICBVc2UgZHdhcmYyX2dldF9wY19ib3VuZHMgdG8gZGV0ZXJtaW5lIHBjIGJvdW5kcy4KKwkocmVhZF9mdW5jX3Njb3BlLCByZWFkX2xleGljYWxfYmxvY2tfc2NvcGUpOiAgVXNlIGR3YXJmMl9nZXRfcGNfYm91bmRzCisJdG8gZGV0ZXJtaW5lIHBjIGJvdW5kcywgaWdub3JlIGRpZXMgd2l0aCBpbnZhbGlkIGJvdW5kcy4KKwkoZHdhcmYyX2dldF9wY19ib3VuZHMpOiAgTmV3IHJvdXRpbmUgdG8gZXh0cmFjdCBhbmQgdmFsaWRhdGUgdGhlCisJRFdfQVRfKl9wYyBhdHRyaWJ1dGVzIG9mIGEgZGllLgorCShkd2FyZjJfYWRkX2ZpZWxkLCBkd2FyZjJfYXR0YWNoX2ZpZWxkc190b190eXBlLCBza2lwX21lbWJlcl9mbl9uYW1lLAorCWR3YXJmMl9hZGRfbWVtYmVyX2ZuLCBkd2FyZjJfYXR0YWNoX2ZuX2ZpZWxkc190b190eXBlKToKKwlOZXcgZnVuY3Rpb25zIHRvIGhhbmRsZSBmaWVsZHMgYW5kIG1lbWJlciBmdW5jdGlvbnMuCisJKHJlYWRfc3RydWN0dXJlX3Njb3BlKTogIFJld3JpdHRlbiB0byB1c2UgdGhlbS4KKwkocmVhZF9hcnJheV90eXBlKTogIFJlbmFtZWQgZnJvbSBkd2FyZl9yZWFkX2FycmF5X3R5cGUuCisJRGVmYXVsdCB1cHBlciBhcnJheSBib3VuZCB0byBkZXNjcmliZSBhbiBhcnJheSB3aXRoIHVuc3BlY2lmaWVkCisJbGVuZ3RoLgorCUNyZWF0ZSBhcnJheSB0eXBlcyBpbiBiYWNrd2FyZHMgb3JkZXIsIGFzIGR3YXJmMiBwdXRzIG91dCB0aGUgYXJyYXkKKwlkaW1lbnNpb25zIGZyb20gbGVmdCB0byByaWdodC4KKwkocmVhZF9zdWJyb3V0aW5lX3R5cGUpOiAgSGFuZGxlIERXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzLAorCURXX0FUX2FydGlmaWNpYWwgYW5kIERXX0FUX3Byb3RvdHlwZWQuCisJKHJlYWRfYmFzZV90eXBlKTogIE1ha2UgYW4gdW5zaWduZWQgdHlwZSBmb3IgRFdfQVRFX2Jvb2xlYW4uCisJUGFzcyBvYmpmaWxlIHRvIGR3YXJmX2Jhc2VfdHlwZS4KKwkocmVhZF9wYXJ0aWFsX2RpZSk6ICBVc2UgcmVhZF9hdHRyaWJ1dGUgdG8gcmVhZCBpbiB0aGUgYXR0cmlidXRlcy4KKwlIYW5kbGUgRFdfQVRfc2libGluZyBhbmQgRFdfQVRfdHlwZS4KKwlGb2xsb3cgcmVmZXJlbmNlcyB3aGVuIGRldGVybWluaW5nIERXX0FUX25hbWUgYW5kIERXX0FUX2V4dGVybmFsCisJYXR0cmlidXRlcyBvZiB0aGUgZGllLgorCVZhbGlkYXRlIERXX0FUXypfcGMgYXR0cmlidXRlcy4KKwkocmVhZF9mdWxsX2RpZSk6ICBVc2UgcmVhZF9hdHRyaWJ1dGUgdG8gcmVhZCBpbiB0aGUgYXR0cmlidXRlcy4KKwkocmVhZF9hdHRyaWJ1dGUpOiAgTmV3IGZ1bmN0aW9uIHRvIHJlYWQgYW4gYXR0cmlidXRlIGRlc2NyaWJlZAorCWJ5IGFuIGFiYnJldmlhdGVkIGF0dHJpYnV0ZS4KKwkobmV3X3N5bWJvbCk6ICBSZWxvY2F0ZSBzeW1ib2wgdmFsdWUgZm9yIERXX1RBR19sYWJlbCB3aXRoIGJhc2VhZGRyLgorCURvIG5vdCBzZXQgU1lNQk9MX1ZBTFVFX0FERFJFU1MgZm9yIERXX1RBR19zdWJwcm9ncmFtLAorCVNZTUJPTF9CTE9DS19WQUxVRSBmb3IgdGhlIHN5bWJvbCB3aWxsIGJlIHNldCBsYXRlciBieSBmaW5pc2hfYmxvY2suCisJQ2hhbmdlIHN5bWJvbCBjbGFzcyBmb3IgZ2xvYmFsIHZhcmlhYmxlcyB3aXRoIGEgemVybyB2YWx1ZWQgbG9jYXRpb24KKwlkZXNjcmlwdG9yIHRvIExPQ19VTlJFU09MVkVELgorCUhhbmRsZSBEV19BVF9jb25zdF92YWx1ZSBhdHRyaWJ1dGVzIGZvciBEV19UQUdfdmFyaWFibGUsCisJRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIgYW5kIERXX1RBR19lbnVtZXJhdG9yLgorCUJ1aWxkIGEgdHlwZWRlZiBzeW1ib2wgZm9yIERXX1RBR19iYXNlX3R5cGUuCisJKGR3YXJmMl9jb25zdF92YWx1ZSk6ICBOZXcgcm91dGluZSB0byBjb3B5IGEgY29uc3RhbnQgdmFsdWUgZnJvbSBhbgorCWF0dHJpYnV0ZSB0byBhIHN5bWJvbC4KKwkoZHdhcmZfYmFzZV90eXBlKTogIFVzZSBwYXNzZWQgaW4gb2JqZmlsZSwgbm90IGN1cnJlbnRfb2JqZmlsZQorCXdoZW4gY2FsbGluZyBkd2FyZjJfZnVuZGFtZW50YWxfdHlwZS4KKwkoZHVtcF9kaWUpOiAgVXNlIERXXyogYWNjZXNzb3IgbWFjcm9zIHRvIGFjY2VzcyB2YWx1ZXMgb2YgYXR0cmlidXRlcy4KKwkoZGVjb2RlX2xvY2Rlc2MpOiAgSGFuZGxlIERXX09QX3BsdXNfdWNvbnN0LgorCitXZWQgSmFuIDIyIDAxOjMxOjE2IDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIG1uMTAyMDAtdGRlcC5jOiBOZXcgZmlsZS4KKwkqIGNvbmZpZy9tbjEwMjAwL3RtLW1uMTAyMDAuaDogTmV3LCBSRUdJU1RFUl9TSVpFIGlzIDI0IGJpdHMgbm90IDMyLAorCVNQX1JFR05VTSBhbmQgRlBfUkVHTlVNIGFyZSBkaWZmZXJlbnQsIGFsc28gbm8gbGFyIG9yIGxpci4KKwkqIGNvbmZpZy9tbjEwMjAwL21uMTAyMDAubXQ6IE5ldyBmaWxlLgorCSogY29uZmlndXJlLnRndDogYWRkIG1uMTAyMDAgZW50cnkuCisKK1R1ZSBKYW4gMjEgMTg6MzI6MjMgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AbGlzYS5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gY29uZmlndXJlOiAgQ2hlY2sgaWYgaG9zdCBoYXMgbGliZGwgaWYgZG9pbmcKKwlTb2xhcmlzIHRocmVhZHMuCisKK1R1ZSBKYW4gMjEgMTc6MDM6MjYgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogbW4xMDMwMC10ZGVwLmM6IFdyb3RlL2ZpeGVkIGltcGxlbWVudGF0aW9ucyBvZgorCW1uMTAzMDBfZnJhbWVfY2hhaW4sIG1uMTAzMDBfaW5pdF9leHRyYV9mcmFtZV9pbmZvLAorCW1uMTAzMDBfZnJhbWVfc2F2ZWRfcGMKKwkqIGNvbmZpZy9tbjEwMzAwL3RtLW1uMTAzMDAuaDogUmVkZWZpbmUgSU5JVF9FWFRSQV9GUkFNRV9JTkZPCisJYW5kIElOSVRfRlJBTUVfUEMgbWFjcm9zLgorCitUdWUgSmFuIDIxIDE3OjAxOjIwIDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGxpc2EuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIGNvbmZpZ3VyZTogIENoZWNrIGlmIGhvc3QgaGFzIGxpYm0uICBNYWtlIHN1cmUgd2UKKwlhcmUgdXNpbmcgZ2NjIHdoZW4gdXNpbmcgdGhlIC1leHBvcnQtZHluYW1pYyBvcHRpb24uICBGaXhlcyBhCisJcHJvYmxlbSB3aXRoIGJ1aWxkaW5nIHVuZGVyIFNvbGFyaXMvU3VuUHJvIGNjLgorCitNb24gSmFuIDIwIDEzOjUyOjEzIDE5OTcgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL21pcHMve2VtYmVkLGVtYmVkNjQsZW1iZWRsLGVtYmVkbDY0fS5tdDoKKwlMaW5rIGluIHNpbXVsYXRvciBvbiBNSVBTIGVtYmVkZGVkIHRhcmdldHMuCisKK1NhdCBKYW4gMTggMDI6MzE6MjkgMTk5NyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBibG9ja2ZyYW1lLmMgKGZyYW1lbGVzc19sb29rX2Zvcl9wcm9sb2d1ZSk6ICBNYXJrIGZyYW1lcworCXdpdGggYSB6ZXJvIFBDIGFzIGZyYW1lbGVzcyB0byBpbXByb3ZlIGJhY2t0cmFjZXMgZnJvbSBjb3JlIGR1bXBzCisJY2F1c2VkIGJ5IGRlcmVmZXJlbmNpbmcgYSBOVUxMIGZ1bmN0aW9uIHBvaW50ZXIuCisKK1RodSBKYW4gMTYgMTQ6MTA6NDEgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL21uMTAzMDAvdG0tbW4xMDMwMC5oOiBmaXggQlJFQUtQT0lOVCBkZWZpbml0aW9uLgorCitUdWUgSmFuIDE0IDE2OjAxOjA2IDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIG1uMTAzMDAtdGRlcC5jOiBtYWRlIGEgbG90IG1vcmUgZ2VuZXJpYywgcmlwcGluZyBvdXQgY29kZQorCWZyb20gY29waWVkIHRhcmdldCAobm8gbW9yZSBtbjEwMzAwX3NjYW5fcHJvbG9ndWUsCisJaW5pdF9leHRyYV9mcmFtZV9pbmZvLCBhbmQgbW4xMDMwMF9maXhfY2FsbF9kdW1teSBjYWxscykKKwkqIGNvbmZpZy9tbjEwMzAwL3RtLW1uMTAzMDAuaDogdW5kZWZpbmUgSU5JVF9FWFRSQV9GUkFNRV9JTkZPCisJYW5kIElOSVRfRlJBTUVfUEMgbWFjcm9zCisKK1RodSBKYW4gIDkgMTE6NDQ6NDAgMTk5NyAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogc3BhcmMtdGRlcC5jIChzcGFyY19mcmFtZV9maW5kX3NhdmVkX3JlZ3MpOiBEb24ndCB1c2UgCisJRlBfUkVHSVNURVJfQllURVMgdG8gY29tcHV0ZSBvZmZzZXRzIGludG8gdGhlIHNhdmVkIGZyYW1lLCAKKwlzaW5jZSBpdCBmYWlscyBmb3IgU1BBUkMgdGFyZ2V0cyBjb25maWd1cmVkIHdpdGhvdXQgYW55CisJRlAgcmVncy4gIEluc3RlYWQsIHVzZSBEVU1NWV9TVEFDS19SRUdfQlVGX1NJWkUuICAKKworTW9uIEphbiAgNiAxMToxNToxNCAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBzeW10YWIuYyAoZml4dXBfc3ltYm9sX3NlY3Rpb24pOiAgSGFuZGxlIE5VTEwgc3ltYm9scyB3aXRob3V0CisJY3Jhc2hpbmcuCisKK0ZyaSBKYW4gIDMgMTI6MDg6MTYgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gY29uZmlndXJlIGNvbmZpZ3VyZS5pbjogIFJlbW92ZSBFTkFCTEVfQ0xJQlMsCisJRU5BQkxFX09CUywgYW5kIFRIUkVBRF9EQl9PQlMuICBUaGVzZSBhcmUgY29uc29saWRhdGVkIGludG8gTElCUworCWFuZCBDT05GSUdfT0JTLgorCSogY29uZmlndXJlIGNvbmZpZ3VyZS5pbjogIENsZWFuIHVwIHRlc3QgY2FzZXMgYXJvdW5kIHRocmVhZCBzdXBwb3J0LgorCSogY29uZmlndXJlLnRndCAodjg1MC0qLSopOiAgSW5jbHVkZSB2ODUwaWNlLm8gYW5kIHY4NTAubGliIGlmCisJaG9zdCBpcyBXaW5kb3dzLgorCSogYy12YWxwcmludC5jIGNoLXZhbHByaW50LmMgY3AtdmFscHJpbnQuYyBldmFsLmMgZXhwcHJpbnQuYworCXByaW50Y21kLmMgdmFsb3BzLmMgdmFsdWUuaCB2YWx1ZXMuYzogIEFkZCBiZmRfc2VjdGlvbiBhcmcgdG8KKwl2YWx1ZV9hdCBhbmQgdmFsdWVfYXRfbGF6eS4KKwkqIGNvZmZyZWFkLmMgZGJ4cmVhZC5jIGVsZnJlYWQuYyBtZGVidWdyZWFkLmMgbWluc3ltcy5jIHN5bXRhYi5oOgorCUFkZCBiZmRfc2VjdGlvbiBhcmcgdG8gcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2xfYW5kX2luZm8uCisJKiBjb3JlZmlsZS5jIGdkYmNvcmUuaCBwcmludGNtZC5jIHZhbG9wcy5jOiAgVXNlIHJlYWRfbWVtb3J5X3NlY3Rpb24KKwlpbnN0ZWFkIG9mIHJlYWRfbWVtb3J5LiAgSXQgdGFrZXMgYSBiZmRfc2VjdGlvbiBhcmcuCisJKiBjb2ZmcmVhZC5jIGRieHJlYWQuYyBlbGZyZWFkLmMgZ2RiLXN0YWJzLmggb2JqZmlsZXMuaDogIFJlbW92ZQorCXVubmVjZXNzYXJ5IGNhc3QgZm9yIGFzc2lnbm1lbnQgb2Ygc3RydWN0IGRieF9zeW1maWxlX2luZm8uCisJU3RydWN0IG9iamZpbGUgbm93IHVzZXMgYSByZWFsIHBvaW50ZXIgaW5zdGVhZCBvZiBQVFIgZm9yIHRoaXMKKwllbGVtZW50LgorCSogZGJ4cmVhZC5jIChkYnhfc3ltZmlsZV9pbml0KTogU3Rhc2ggYmZkIHNlY3Rpb24gcG9pbnRlcnMgZm9yCisJdGV4dCwgZGF0YSBhbmQgYnNzIGludG8gZGJ4X3N5bWZpbGVfaW5mby4KKwkqIGV4ZWMuYyAoeGZlcl9tZW1vcnkpOiAgSGFuZGxlIHRyYW5zZmVycyBmb3IgdXNlci1zcGVjaWZpZWQKKwlzZWN0aW9ucy4KKwkqIGZpbmR2YXIuYyAocmVhZF92YXJfdmFsdWUgbG9jYXRlX3Zhcl92YWx1ZSk6ICBDb3B5IGJmZCBzZWN0aW9uCisJZnJvbSB0aGUgc3ltYm9sIHRvIHRoZSB2YWx1ZS4KKwkqIGdkYi1zdGFicy5oOiAgQWRkIHNlY3Rpb24gcG9pbnRlcnMgZm9yIHRleHQsIGRhdGEgYW5kIGJzcworCXNlY3Rpb25zLgorCSogbWFpbnQuYyAodHJhbnNsYXRlIGFkZHJlc3MgY29tbWFuZCk6ICBBZGQgdGVzdCBjb2RlIGZvciBvdmVybGF5CisJYWRkcmVzcyB0cmFuc2xhdGlvbi4KKwkqIHByaW50Y21kLmMgKGRvX2V4YW1pbmUgZG9fb25lX2Rpc3BsYXkpOiAgTm93IHRha2VzIGEgYmZkIHNlY3Rpb24KKwlhcmcuCisJKiAocHJpbnRfZm9ybWF0dGVkIHhfY29tbWFuZCk6ICBSZWNvcmQgY3VycmVudCBzZWN0aW9uIGFsb25nIHdpdGgKKwljdXJyZW50IGFkZHJlc3MgZm9yIHJlcGVhdGVkIGNvbW1hbmRzLgorCSogc3BhcmMtbmF0LmMgKGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyk6ICBDaGFuZ2UKKwl0YXJnZXRfeGZlcl9tZW1vcnkgdG8gdGFyZ2V0X3tyZWFkIHdyaXRlfV9tZW1vcnkgdG8gYWxsb3cgY2hhbmdlcworCXRvIHRhcmdldF94ZmVyX21lbW9yeSBpbnRlcmZhY2UgZm9yIHNlY3Rpb24gaW5mby4KKwkqIHN5bW1pc2MuYyAoZHVtcF9tc3ltYm9scyBwcmludF9zeW1ib2wpOiAgUHJpbnQgc2VjdGlvbgorCWFzc29jYWl0ZWQgd2l0aCBzeW1ib2wuCisJKiBzeW10YWIuYyAoZml4dXBfc3ltYm9sX3NlY3Rpb24pOiAgTmV3IHJvdXRpbmUgdG8KKwlhZGQgc2VjdGlvbiBpbmZvIHRvIHN5bWJvbHMgcmV0dXJuZWQgYnkgbG9va3VwX3N5bWJvbC4KKwkqIHN5bXRhYi5oIChzdHJ1Y3QgZ2VuZXJhbF9zeW1ib2xfaW5mbyk6ICBBZGQgYmZkIHNlY3Rpb24gdG8KKwlzeW1ib2xzLgorCSogdGFyZ2V0LmMgdGFyZ2V0LmggKHRhcmdldF94ZmVyX21lbW9yeSk6ICBBZGQgYmZkIHNlY3Rpb24gdG8KKwlhcmdzLgorCSogKHRhcmdldF9yZWFkX21lbW9yeV9zZWN0aW9uKTogIE5ldyByb3V0aW5lIHRvIHJlYWQgZGF0YSBmcm9tIGEKKwlzcGVjaWZpYyBzZWN0aW9uLgorCSogKHRhcmdldF9tZW1vcnlfYmZkX3NlY3Rpb24pOiAgTmV3IGdsb2JhbCB2YXJpYWJsZSB0byBwYXNzIGJmZAorCXNlY3Rpb24gaW4gdG8gdGFyZ2V0cy4KKwkqIHZhbGFyaXRoLmMgKHZhbHVlX2FkZCB2YWx1ZV9hZGRyIHZhbHVlX2FycmF5KTogIFByZXNlcnZlIGJmZAorCXNlY3Rpb24gd2hlbiBjb21wdXRpbmcgbmV3IHZhbHVlLgorCSogdmFsdWUuaCAoc3RydWN0IHZhbHVlKTogIEFkZCBiZmQgc2VjdGlvbiB0byB2YWx1ZXMuCisJKiB2YWx1ZXMuYyAoYWxsb2NhdGVfdmFsdWUgdmFsdWVfY29weSk6ICBJbml0aWFsaXplL3ByZXNlcnZlIGJmZAorCXNlY3Rpb24uCisJKiAodW5wYWNrX2RvdWJsZSk6ICBDbGVhbiB1cCBfTVNDX1ZFUiBjb25kaXRpb25hbHMgdG8gcmVtb3ZlCisJZHVwbGljYXRlIGNvZGUuCisJKiB2ODUwaWNlLmM6ICBOZXcgbW9kdWxlIHRvIHN1cHBvcnQgY29tbXVuaWNhdGlvbiB3aXRoIE5FQydzCisJUEMtYmFzZWQgSUNFLgorCSogY29uZmlnL3Y4NTAvdG0tdjg1MC5oIChSRUdJU1RFUl9OQU1FUyk6ICBSZXBsYWNlIHNwLCBncCwgZnAsIGFuZAorCWVwIG5hbWVzIHdpdGggcnh4IG5hbWVzLiAgc3AgYW5kIGZwIGFyZSByZW5hbWVkIHZpYSBhIGRpZmZlcmVudAorCW1lY2hhbmlzbS4KKworRnJpIEphbiAgMyAxNDoyMDowNSAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBtbjEwMzAwLXRkZXAuYyAobW4xMDMwMF9wdXNoX2FyZ3VtZW50cyk6IHJld3JvdGUsCisJYWxzbyByZW1vdmVkIGNvZGUgZWxzZXdoZXJlIHRoYXQgbWFkZSB1c2Ugb2YgUlBfUkVHTlVNLgorCSogY29uZmlnL21uMTAzMDAvdG0tbW4xMDMwMC5oOiByaXBwZWQgb3V0IFJQX1JFR05VTSwgVjBfUkVHTlVNLAorCUFSRzBfUkVHTlVNLCBBUkdMQVNUX1JFR05VTSAoYWxsIG5vdCBhcHByb3ByaWF0ZSBmb3IgbW4xMDMwMAorCWFyY2guKSwgcmVkZWZpbmVkIFNBVkVEX1BDX0FGVEVSX0NBTEwsIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFLAorCUVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MsIFNUT1JFX1JFVFVSTl9WQUxVRS4KKworRm9yIG9sZGVyIGNoYW5nZXMgc2VlIENoYW5nZUxvZy05NgorDAorTG9jYWwgVmFyaWFibGVzOgorbW9kZTogaW5kZW50ZWQtdGV4dAorbGVmdC1tYXJnaW46IDgKK2ZpbGwtY29sdW1uOiA3NAordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvZ2RiL0NoYW5nZUxvZy05OCBiL2dkYi9DaGFuZ2VMb2ctOTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxOWI0OQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9DaGFuZ2VMb2ctOTgKQEAgLTAsMCArMSw3MTIyIEBACitUaHUgRGVjIDMxIDE1OjI2OjEzIDE5OTggIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogY29yZWxvdy5jIChjb3JlX29wcyk6IERvbid0IGluaXRpYWxpemUgc3RhdGljYWxseS4KKwkoaW5pdF9jb3JlX29wcyk6IE5ldyBmdW5jdGlvbiwgZmlsbHMgaW4gY29yZV9vcHMuCisJKF9pbml0aWFsaXplX2NvcmVsb3cpOiBVc2UgaXQuCisKK1RodSBEZWMgMzEgMTY6NTQ6MzAgMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+CisKKwlUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGJ5CisJRWxlbmEgWmFubm9uaSA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+CisJRWRpdGggRXBzdGVpbiAgPGVlcHN0ZWluQHNvcGhpYS5jeWdudXMuY29tPgorCURhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJKiBjb25maWcvcGEvdG0taHBwYS5oIChJTlNUUlVDVElPTl9OVUxMSUZJRUQpOiBDaGFuZ2UgdG8gcmVhZAorIAludWxsaWZ5IGluc3RydWN0aW9uIGJpdCBmcm9tIElQU1cgb25seSB3aGVuIHdlIGFyZSBub3QgaW4gYSBzeXN0ZW0KKyAJY2FsbC4KKwkoU1RSQ0FUX1JFR0lTVEVSLCBwYV9kb19zdHJjYXRfcmVnaXN0ZXJzX2luZm8pOiBBZGRpdGlvbmFsCisgCXBhcmFtZXRlciAtLSBwcmVjaXNpb24uCisKKwkqIE1ha2VmaWxlLmluIChCVUlMRF9UVUkpOiBUbyBidWlsZCB0aGUgdHVpLCBvbmx5IHdoZW4gY29uZmlndXJlZAorCXdpdGggLS1lbmFibGUtdHVpLgorCShZTFdSQVApOiBVc2UgeWx3cmFwIHRvIGF2b2lkIHByb2JsZW1zIG9uIHN5c3RlbXMgdy9vIGJpc29uLgorCShnZGIkKEVYRUVYVCkpOiBNYWtlIGl0IGRlcGVuZGVudCBvbiBCVUlMRF9UVUkuCisJKGFsbC10dWkpOiBSZW1vdmUgZGVwZW5kZW5jeSBmcm9tIHBob255IHRhcmdldC4KKwkoYy1leHAudGFiLmMpOiBVc2UgeWx3cmFwIGluc3RlYWQgb2YgYmlzb24uCisJKGp2LWV4cC50YWIuYyk6IERpdHRvLgorCShmLWV4cC50YWIuYyk6IERpdHRvLgorCShtMi1leHAudGFiLmMpOiBEaXR0by4KKworCSogY29uZmlndXJlLmluIChFTkFCTEVfQ0ZMQUdTKTogRGVmaW5lIGFuZCBleHBvcnQgQlVJTERfVFVJLgorCQorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworCSogYy10eXBlcHJpbnQuYyAoY190eXBlX3ByaW50X2Jhc2UpOiBHZXQgdG8gdGhlIG1ldGhvZCBuYW1lIGJ5CisJc2tpcHBpbmcgb3ZlciBhbGwgdGhlIG5hbWVzcGFjZXMsICBjbGFzc2VzIGFuZCAnOjonLgorCisJKiBpbmZjbWQuYyAocnVuX2NvbW1hbmQpOiBPbmx5IGNhbGwgU09MSUJfUkVTVEFSVCBpZiBpdCdzCisJZGVmaW5lZC4KKwkoZGV0YWNoX2NvbW1hbmQpOiBEaXR0by4KKworCSogaW5mcHRyYWNlLmMgKGNhbGxfcHRyYWNlKTogQWRkIHNvbWUgZGVidWdnaW5nIGNvZGUuCisKKwkqIGluZnJ1bi5jIChmb2xsb3dfaW5mZXJpb3JfZm9yayk6IE9ubHkgZGVmaW5lIG9uIEhQLgorCSh3YWl0X2Zvcl9pbmZlcmlvcik6IE9ubHkgY2FsbCBTT0xJQl9JTl9EWU5BTUlDX0xJTktFUiBpZiB3ZSBoYXZlCisJc2hhcmVkIGxpYnJhcmllczsgcmVzdG9yZSB0ZXN0IG9mIElOX1NPTElCX0RZTlNZTV9SRVNPTFZFX0NPREUKKwlyZW1vdmVkIGJ5IEhQLgorCQorCSogTWFrZWZpbGUuaW4gKEFMTERFUEZJTEVTKTogQWRkIHNvbXJlYWQuYywgaHAtcHN5bXRhYi1yZWFkLmMsCisJaHAtc3ltdGFiLXJlYWQuYy4KKwkoU0ZJTEVTKTogUmVtb3ZlIHRoZSBhYm92ZSBmaWxlcworCShDT01NT05fT0JTKTogUmVtb3ZlIHNvbXJlYWQubworCShTRklMRVMpOiBBZGQgdGhlIHR1aSBmaWxlcyB0byB0aGlzLCBzbyB0aGV5IGdldAorCWluY2x1ZGVkIGluIGV0YWdzIHRhYmxlcy4KKwkoYWxsLXR1aSk6IE5ldyBydWxlLCB3aGljaCBkb2VzIGEgcmVjdXJzaXZlIG1ha2UgaW4gdGhlIHR1aQorIAlzdWJkaXIuCisJKGdkYiQoRVhFRVhUKSk6IEFkZCB0dWktYWxsIHRvIHRoZSBsaXN0IG9mCisgCWRlcGVuZGVuY2llcywgYW5kIGFkZCB0dWkvbGlidHVpLmEgdG8gdGhlIGxpbmsgbGlzdC4KKwkodHVpL2xpYnR1aS5hKTogV2hlbiByZWN1cnNpbmcsIHBhc3MgZG93bgorCSR7RkxBR1NfVE9fUEFTU30uICBBbmQgZG9uJ3QgZWNobyB0aGUgbWFrZSBjb21tYW5kLiAgVGhpcyBpcworCWNsb3NlciB0byB3aGF0IHRoZSBvdGhlciByZWN1cnNpb25zIGRvLgorCShIRklMRVNfTk9fU1JDRElSKSBhZGQgaHByZWFkLmguCisJKENPTU1PTl9PQlMpOiBBZGQgaHAtcHN5bXRhYi1yZWFkLm8sIGhwLXN5bXRhYi1yZWFkLm8KKwlBbGxvdyB0aGUgVFVJIGNvZGUgdG8gYmUgY29uZGl0aW9uYWxseSBlbmFibGVkLgorCShUVUlfVEFSR0VULCBUVUlfTElCUkFSWSk6IE5ldyB2YXJpYWJsZXMsIHdob3NlIHZhbHVlcyBhcmUgc2V0IGJ5CisJdGhlIGNvbmZpZ3VyYXRpb24gc2NyaXB0LiAgVGhleSdyZSBzZXQgdG8gdGhlIGVtcHR5IHN0cmluZyB3aGVuCisJdGhlIFRVSSBpc24ndCBlbmFibGVkLgorCShnZGIkKEdEQkVYVCkpOiBVc2UgdGhvc2UsIGluc3RlYWQgb2YgcmVmZXJyaW5nIHRvIHR1aS1hbGwgYW5kCisJdHVpL2xpYnR1aS5hIGRpcmVjdGx5LgorCisJKiBNYWtlZmlsZS5pbjogQXZvaWQgc3B1cmlvdXMgcmVsaW5raW5nLgorCShnZGIkKEVYRUVYVCkpOiBEZXBlbmQgb24gdGhlIGFjdHVhbCB0dWkgbGlicmFyeSwgbm90IG9uIGEKKwlmaWN0aXRpb3VzIHRhcmdldC4gIFNpbmNlIHRoZSBmaWN0aXRpb3VzIHRhcmdldCBuZXZlciBleGlzdGVkLCBtYWtlCisJd291bGQgYWx3YXlzIHJlbGluay4KKwkodHVpL2xpYnR1aS5hKTogUmVuYW1lZCBmcm9tIGFsbC10dWkuICBBbHdheXMgcmVjdXJzZSB0byBtYWtlIHN1cmUKKwl0aGUgbGlicmFyeSBpcyB1cCB0byBkYXRlLgorCShUVUlfVEFSR0VUKTogVmFyaWFibGUgcmVtb3ZlZDsgdGhlcmUncyBubyBuZWVkIGZvciBpdCBhbnkgbW9yZS4KKworCSogTWFrZWZpbGUuaW46IExvb2sgZm9yIHR1aSBpbmNsdWRlIGZpbGVzIGluIHRoZSB0dWkgc291cmNlIGRpci4KKworCSogVXNlIGF1dG9tYWtlJ3MgYGFjbG9jYWwnIHByb2dyYW0gdG8gZ2VuZXJhdGUgYWNsb2NhbC5tNCwgdG8gYWxsb3cKKwl1cyB0byB1c2UgYXV0b21ha2UgbWFjcm9zIGluIGNvbmZpZ3VyZS5pbiB3aXRoIGltcHVuaXR5LgorCisJKiBhY2NvbmZpZy5oOiBBZGQgYW4gZW50cnkgZm9yIHRoZSBgVFVJJyBzeW1ib2wuCisKKwkqIGFjaW5jbHVkZS5tNDogTmV3IGZpbGUsIGNvbnRhaW5pbmcgdGhlIGNvZGUgZnJvbSB0aGUgb2xkCisJYWNsb2NhbC5tNC4gIEluY29ycG9yYXRlIChieSByZWZlcmVuY2UpIC4uL2JmZC9hY2luY2x1ZGUubTQsIG5vdAorCS4uL2JmZC9hY2xvY2FsLm00LCBzaW5jZSB3ZSBvbmx5IHdhbnQgYmZkJ3MgbG9jYWwgbWFjcm9zLgorCisJKiBhY2xvY2FsLm00OiBOb3cgYXV0b21hZ2ljYWxseSBnZW5lcmF0ZWQuICBKdXN0IHJ1biBhY2xvY2FsIQorCQorCSogYW5ub3RhdGUuYyAoYW5ub3RhdGVfY2F0Y2hwb2ludCk6IE5ldyBmdW5jdGlvbi4KKworCSogYW5ub3RhdGUuaDogVGFraW5nIHRoZSBuZXcgaW5jbHVkZXMgKHN5bXRhYi5oIGFuZCBnZGJ0eXBlcy5oKS4KKwlub3QgdGFraW5nIHRoZSBhbnNpYyBDIGJ1aWxkIGZpeC4KKwkoYW5ub3RhdGVfY2F0Y2hwb2ludCk6IERlY2xhcmUuCisKKwkqIGJsb2NrZnJhbWUuYyAoYmxvY2t2ZWN0b3JfZm9yX3BjX3NlY3QpOiBDaGVjayB0aGF0IHRoZSBlbmQgb2YKKyAJdGhlIGJsb2NrIGlzID49IHRvIHRoZSBwYywgbm90IGp1c3QgPi4KKworCSogYnJlYWtwb2ludC5jIChjcmVhdGVfdGVtcF9leGNlcHRpb25fYnJlYWtwb2ludCk6ICNJZiBpdCBvdXQgLS0KKyAJbm90aGluZyBjYWxscyBpdC4KKwkoYnBzdGF0X3N0b3Bfc3RhdHVzKTogRG9uJ3QgY2FsbCBTT0xJQl9IQVZFX0xPQURfRVZFTlQgaWYgaXQncyBub3QKKyAJZGVmaW5lZDsgZG9uJ3QgY2FsbCBTT0xJQl9IQVZFX1VOTE9BRF9FVkVOVCBpZiBpdCdzIG5vdCBkZWZpbmVkLgorCShicHN0YXRfZ2V0X3RyaWdnZXJlZF9jYXRjaHBvaW50cyk6IElmIHdlIGRvbid0IGhhdmUgc2hhcmVkCisgCWxpYnJhcnkgc3VwcG9ydCwgdGhlbiBkb24ndCBjYWxsIFNPTElCX0xPQURFRF9MSUJSQVJZX1BBVEhOQU1FIG5vcgorIAlTT0xJQl9VTkxPQURFRF9MSUJSQVJZX1BBVEhOQU1FLgorCSh3YXRjaF9jb21tYW5kXzEpOiBEb24ndCByZXF1aXJlIGEgcnVuIGJlZm9yZSBhIHdhdGNoIGNvbW1hbmQKKyAJdW5sZXNzIHdlJ3JlIG9uIEhQIFtpdCdzIGFuIEhQIE9TIGJ1Zywgbm90IGEgZ2VuZXJpYyBsaW1pdGF0aW9uXQorCShjYXRjaF9sb2FkX2NvbW1hbmRfMSk6IERvbid0IGRlZmluZSBpZiBubyBzaGFyZWQgbGlicmFyaWVzLgorCShjYXRjaF9jb21tYW5kXzEpOiBEb24ndCBjbGFpbSB0byBzdXBwb3J0IGZvcmsgY2F0Y2hwb2ludHMgdW5sZXNzCisgCUNISUxEX0lOU0VSVF9GT1JLX0NBVENIUE9JTlQgaXMgZGVmaW5lZCwgZG9uJ3QgY2xhaW0gdG8gc3VwcG9ydAorIAl2Zm9yayBjYXRjaHBvaW50cyB1bmxlc3MgQ0hJTERfSU5TRVJUX1ZGT1JLX0NBVENIUE9JTlQgaXMgZGVmaW5lZCwKKyAJZG9uJ3QgY2xhaW4gdG8gc3VwcG9ydCBzaGFyZWQgbGlicmFyeSBsb2FkIGNhdGNocG9pbnRzIGlmIHNoYXJlZAorIAlsaWJyYXJpZXMgYXJlbid0IHN1cHBvcnRlZCwgYW5kIGRvbid0IGNsYWltIHRvIHN1cHBvcnQgZXhlYworIAljYXRjaHBvaW50cyB1bmxlc3MgQ0hJTERfSU5TRVJUX0VYRUNfQ0FUQ0hQT0lOVCBpcyBkZWZpbmVkCisKKwkoYnBzdGF0X2RvX2FjdGlvbnMpOiBJZiB3ZSBqdXN0IHNldCBjbWQgdG8gTlVMTCwgZG9uJ3QgdGhlbiB0cnkgdG8KKyAJc2V0IGl0IHRvIGNtZC0+bmV4dCBhcyB3ZSdsbCBTRUdWLgorCShicHN0YXRfZG9fYWN0aW9ucyk6IFNpbXBsaWZ5IHNpZ25pZmljYW50bHkuICBJdCdzCisJbm93IGFsbW9zdCBhcyBzaW1wbGUgYXMgYmVmb3JlIHRoZSBtZXJnZSBhbmQgaXQgbm8gbG9uZ2VyIGhhcyB0aGUKKwlIUCBidWcgdGhhdCBicmVha3BvaW50IGNvbW1hbmRzIGFyZSBleGVjdXRlZCByZXBlYXRlZGx5LgorCisJKGJyZWFrX2F0X2ZpbmlzaF9jb21tYW5kXzEpOiBSZXdyaXRlIGFuZCBtYWtlIHN1cmUKKyAJc2VsZWN0ZWRfZnJhbWUgcG9pbnRzIHRvIGEgZnJhbWUgYmVmb3JlIHVzaW5nIGl0LiBGaXggc3RyaW5nCisgCXRlcm1pbmF0aW9uIGVycm9yLgorCShicmVha19hdF9maW5pc2hfYXRfZGVwdGhfY29tbWFuZF8xKTogRGl0dG8uCisJCisJKGNhbl91c2VfaHdfd2F0Y2hwb2ludHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgorCShyZWFkX21lbW9yeV9ub2JwdCk6IFRlc3QgZm9yIGJyZWFrcG9pbnQgdHlwZSBicF9ub25lLgorCShpbnNlcnRfYnJlYWtwb2ludHMpOiBUZXN0IGZvciBicmVha3BvaW50IHR5cGUgYnBfY2F0Y2hfZXhlYzsKKwlpbnN1cmUgaGF2ZSBhIGN1cnJlbnQgZnJhbWUgYmVmb3JlIGdldHRpbmcgdGhlIGZyYW1lIGFkZHJlc3MuCisJKHJlbW92ZV9icmVha3BvaW50cyk6IENoZWNrIGZvciBicmVha3BvaW50cyBvZiB0eXBlcyBicF9ub25lLAorCWJwX2NhdGNoX2ZvcmssIGJwX2NhdGNoX3Zmb3JrLCBhbmQgYnBfY2F0Y2hfZXhlYy4KKwkoYnBzdGF0X3N0b3Bfc3RhdHVzKTogRml4IHVwZGF0ZXMgb2YgYi0+aGl0X2NvdW50LgorCShicHN0YXRfaGF2ZV9hY3RpdmVfaHdfd2F0Y2hwb2ludHMpOiBOZXcgZnVuY3Rpb24uCisJKGNyZWF0ZV9leGVjX2V2ZW50X3dhdGNocG9pbnQpOiBOZXcgZnVuY3Rpb24uCisJKHdhdGNoX2NvbW1hbmRfMSk6IFVzZSBjYW5fdXNlX2h3X3dhdGNocG9pbnRzLgorCShjYXRjaF9mb3JrX2NvbW1hbmRfMSk6IENoYW5nZSBuYW1lIG9mIGZ1bmN0aW9uIHRvIGNhbGwgZnJvbQorCXRhcmdldF9jcmVhdGVfY2F0Y2hfKHYpZm9ya19ob29rIHRvIGNyZWF0ZV8odilmb3JrX2V2ZW5fY2F0Y2hwb2ludC4KKwkoZGVsZXRlX2JyZWFrcG9pbnQpOiBUZXN0IGZvciBhbHJlYWR5IGRlbGV0ZWQgYnJlYWtwb2ludHM7IGFkZAorCXN1cHBvcnQgZm9yIGJwX2NhdGNoX2ZvcmssIGJwX2NhdGNoX3Zmb3JrLCBhbmQgYnBfY2F0Y2hfZXhlYworCWJyZWFrcG9pbnRzLgorCShfaW5pdGlhbGl6ZV9icmVha3BvaW50KTogQWRkIGNhbi11c2UtaHctd2F0Y2hwb2ludHMgdG8gbGlzdCBvZgorCXVzZXIgc2V0dGFibGUgZGVidWdnZXIgdmFyaWFibGVzLgorCisJKGNsZWFyX2NvbW1hbmQpOiBXaGVuIHRoZXJlIGlzIG5vIGFyZ3VtZW50CisJdG8gdGhlIGNsZWFyIGNvbW1hbmQsIGRlbGV0ZSBhbGwgYnJlYWtwb2ludHMgdGhhdCBhcmUgaGl0IGF0IAorCWRlZmF1bHQgbGluZS4gVGhpcyB3aWxsIGluY2x1ZGUgYSBicmVha3BvaW50IHdob3NlIGxpbmUgbnVtYmVyCisJZG9lcyBub3QgY29ycmVzcG9uZCB0byB0aGUgZGVmYXVsdCBsaW5lLCBidXQgaGFzIGJlZW4gc2V0IGF0IAorCXRoZSBkZWZhdWx0IGFkZHJlc3MuCisKKwkoZGVsZXRlX2JyZWFrcG9pbnQpOiBEb24ndCBjYWxsIGJwc3RhdF9jbGVhcl9hY3Rpb25zLCBpbnN0ZWFkCisgCWNsZWFyIHRoaW5ncyBleHBsaWNpdGx5OyBpZiBjbGVhcmluZyBicmVha3BvaW50X2F0LCB0aGVuIGFsc28KKyAJY2xlYXIgYW55IGFzc29jaWF0ZWQgYWN0aW9ucyBzbyB0aGF0IGJwc3RhdF9kb19hY3Rpb25zIHdvbid0IHRyeQorIAl0byBleGVjdXRlIHRoZW0uCisJKF9pbml0aWFsaXplX2JyZWFrcG9pbnQpOiBGaXggZnVuY3Rpb24gbmFtZSBmb3IgYnggY29tbWFuZC4KKworCSh0YnJlYWtfY29tbWFuZCk6IFJlbW92ZSBzdGF0aWMgZnJvbSBkZWNsYXJhdGlvbi4KKwkobWFpbnRlbmFuY2VfaW5mb19icmVha3BvaW50cyk6IERpdHRvLgorCisJKHJlYXR0YWNoX2JyZWFrcG9pbnRzKTogTmV3IGZ1bmN0IGRlZmluaXRpb24sIHVzZWQgd2l0aCB3aXRoCisgCWhhcmR3YXJlIHdhdGNocG9pbnRzCisJKGJyZWFrcG9pbnRfMSk6IENoYW5nZSBmb3JtYXQgYW5kIGFkZCBlbnRyaWVzIHRvIGJwdHlwZXNbXQorCShtYWludGVuYW5jZV9pbmZvX2JyZWFrcG9pbnRzKTogRnVuY3Rpb24gaXMgbm8gbG9uZ2VyIHN0YXRpYworCisJKF9pbml0aWFsaXplX2JyZWFrcG9pbnQpOiBSZW1vdmVkIGEgY29tbWVudC4KKwkoZXhjZXB0aW9uX2NhdGNocG9pbnRzX2FyZV9mcmFnaWxlLAorIAlleGNlcHRpb25fc3VwcG9ydF9pbml0aWFsaXplZCk6IERlZmluZS4KKwkoYnJlYWtwb2ludF9oZXJlX3ApOiBGaXhlZCBzeW50YXggZXJyb3IgaW4gY29uZGl0aW9uYWwKKwkoZGlzYWJsZV93YXRjaHBvaW50c19iZWZvcmVfaW50ZXJhY3RpdmVfY2FsbF9zdGFydCk6IEZpeGVkIGNhbGwgdG8KKyAJY2hlY2tfZHVwbGljYXRlcy4gTmVlZCBhIHNlY3Rpb24gcGFyYW1ldGVyLgorCShlbmFibGVfd2F0Y2hwb2ludHNfYWZ0ZXJfaW50ZXJhY3RpdmVfY2FsbF9zdG9wKTogRml4ZWQgY2FsbCB0bworIAljaGVja19kdXBsaWNhdGVzLiBOZWVkIGEgc2VjdGlvbiBwYXJhbWV0ZXIuCisJKGJyZWFrcG9pbnRfcmVfc2V0X29uZSk6IEZpeGVkIGNhbGwgdG8gY2hlY2tfZHVwbGljYXRlcy4gTmVlZCBhCisgCXNlY3Rpb24gcGFyYW1ldGVyLgorCShkZWxldGVfY29tbWFuZCk6IEZpeGVkIHN5bnRheCBlcnJvciBpbiBjb25kaXRpb25hbAorCShicmVha3BvaW50X3JlX3NldCk6IEZpeGVkIHNvbWUgdHlwb3MuCisJCisJKGFyZ3NfZm9yX2NhdGNocG9pbnRfZW5hYmxlKTogTmV3IHR5cGUgZm9yIGhhbmRsaW5nIGV4Y2VwdGlvbnMuCisJKGN1cnJlbnRfZXhjZXB0aW9uX2V2ZW50KTogTmV3IHZhcmlhYmxlIGZvciBoYW5kbGluZyBleGNlcHRpb25zLgorCShpbnNlcnRfYnJlYWtwb2ludHMpOiBDaGVjayBmb3IgYWRkaXRpb25hbCBicmVha3BvaW50IHR5cGVzIC0tCisJYnBfY2F0Y2hfdGhyb3csIGJwX2NhdGNoX2NhdGNoLCBjYWxsX2Rpc2FibGVkLiAgQWxzbywgZG8gc29tZQorCWFkZGl0aW9uYWwgd29yayB0byBoYW5kbGUgYW4gZXhjZXB0aW9uIGNhdGNocG9pbnQuCisJKHJlbW92ZV9icmVha3BvaW50KTogVGhlcmUgYXJlIGFkZGl0aW9uYWwgYnJlYWtwb2ludCB0eXBlcyB0bworIAljaGVjayBmb3I6IEJwX2NhdGNoX3Rocm93LCBicF9jYXRjaF9jYXRjaCwgY2FsbF9kaXNhYmxlZC4gQWxzbyBkbworIAlzb21lIGFkZGl0aW9uYWwgd29yayB0byByZW1vdmUgdGhlIGV4Y2VwdGlvbiBjYXRjaHBvaW50cworCShicmVha3BvaW50X2luaXRfaW5mZXJpb3IpOiBOZXcgaW5wdXQgcGFyYW1ldGVyLiBJZiB0aGVyZSBhcmUKKyAJZXhjZXB0aW9uIGNhdGNocG9pbnRzIGRlbGV0ZSB0aGVtLgorCShicmVha3BvaW50X2hlcmVfcCk6IFRoZXJlIGFyZSBhZGRpdGlvbmFsIGJyZWFrcG9pbnQgZW5hYmxlCisgCXNldHRpbmdzIHRvIGNoZWNrIGZvcjogU2hsaWJfZGlzYWJsZWQsIGNhbGxfZGlzYWJsZWQKKwkoYnJlYWtwb2ludF90aHJlYWRfbWF0Y2gpOiBUaGVyZSBhcmUgYWRkaXRpb25hbCBicmVha3BvaW50IGVuYWJsZQorIAlzZXR0aW5ncyB0byBjaGVjayBmb3I6IENhbGxfZGlzYWJsZWQKKwkoZXBfaXNfY2F0Y2hwb2ludCk6IFRoZXJlIGFyZSBhZGRpdGlvbmFsIGJyZWFrcG9pbnQgdHlwZXMgdG8gY2hlY2sKKyAJZm9yOiBCcF9jYXRjaF90aHJvdywgYnBfY2F0Y2hfY2F0Y2gKKwkoZXBfaXNfZXhjZXB0aW9uX2NhdGNocG9pbnQpOiBOZXcgZnVuY3Rpb24KKwkoYnBzdGF0X2ZpbmRfc3RlcF9yZXN1bWVfYnJlYWtwb2ludCk6IE5ldyBmdW5jdGlvbgorCShicHN0YXRfZG9fYWN0aW9ucyk6IEludHJvZHVjZSBhIGxvY2FsIGNvcHkgb2YgdGhlIGJwc3RhdAorIAlzdHJ1Y3R1cmUuCisJKHByaW50X2l0X25vcm1hbCk6IFRoZXJlIGFyZSBhZGRpdGlvbmFsIGJyZWFrcG9pbnQgdHlwZXMgdG8gY2hlY2sKKyAJZm9yOiBCcF9jYXRjaF90aHJvdywgYnBfY2F0Y2hfY2F0Y2ggQ2hhbmdlaW5nIHRoZSBjb250cm9sCisgCXN0cnVjdHVyZSBhIGJpdCAoYWRkaW5nIGVsc2UgaWZzKSBBZGQgY29kZSB0byBwcmludCBvdXQgaW5mbyBhYm91dAorIAlleGNlcHRpb25zLgorCShicHN0YXRfc3RvcF9zdGF0dXMpOiBUaGVyZSBhcmUgYWRkaXRpb25hbCBicmVha3BvaW50IGVuYWJsZQorIAlzZXR0aW5ncyB0byBjaGVjayBmb3I6IENhbGxfZGlzYWJsZWQuIHRoZXJlIGFyZSBhZGRpdGlvbmFsCisgCWJyZWFrcG9pbnQgdHlwZXMgdG8gY2hhY2sgZm9yOiBCcF9jYXRjaF9jYXRjaCBhbmQgYnBfY2F0Y2hfdGhyb3cuCisgIAlDaGVjayB0byBzZWUgaWYgc3RvcHBlZCBkdWUgdG8gYW4gZXhjZXB0aW9uLiBNaW5vciBmaXhlcyB0byB0aGUKKyAJY2F0Y2hfZXJyb3JzIGNhbGxzLiBNYWtlIHN1cmUgdG8gY291bnQgYWxsIGVuY291bnRlcmVkCisgCWJyZWFrcG9pbnRzLiBUaGVyZSB3YXMgc29tZXRoaW5nIGZ1bmt5IGdvaW5nIG9uIHByZXZpb3VzbHkgd2l0aAorIAl0aGUgY291bnRpbmcuCisJKGJwc3RhdF93aGF0KTogQWRkIGNhc2VzIGZvciBuZXcgYnJlYWtwb2ludCB0eXBlczoKKyAJYnBfY2F0Y2hfY2F0Y2gsIGJwX2NhdGNoX3Rocm93LgorCShicHN0YXRfZ2V0X3RyaWdnZXJlZF9jYXRjaHBvaW50cyk6IENoZWNrIGZvciBuZXcgYnJlYWtwb2ludCB0eXBlcworIAk6IEJwX2NhdGNoX2NhdGNoLCBicCBfY2F0Y2hfdGhyb3cuCisJKGJyZWFrcG9pbnRfMSk6IEFjY291bnQgZm9yIG5ldyBicmVha3BvaW50IHR5cGVzLgorCShkZXNjcmliZV9vdGhlcl9icmVha3BvaW50cyk6IEFjY291bnQgZm9yIG5ldyBicmVha3BvaW50IGVuYWJsZQorIAlzZXR0aW5nIChjYWxsX2Rpc2FibGVkKQorCShjaGVja19kdXBsaWNhdGVzKTogQWNjb3VudCBmb3IgbmV3IGJyZWFrcG9pbnQgZW5hYmxlIHNldHRpbmcKKyAJKGNhbGxfZGlzYWJsZWQpCisJKGRpc2FibGVfYnJlYWtwb2ludHNfaW5fc2hsaWJzKTogTmV3IGZ1bmN0aW9uCisJKGRpc2FibGVfd2F0Y2hwb2ludHNfYmVmb3JlX2ludGVyYWN0aXZlX2NhbGxfc3RhcnQpOiBOZXcgZnVuY3Rpb24KKwkobWVudGlvbik6IEFjY291bnQgZm9yIG5ldyBicmVha3BvaW50IHR5cGVzLgorCShicmVha19jb21tYW5kXzEpOiBTb21lIGFkZGl0aW9uYWwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgUEMuCisJKHdhdGNoX2NvbW1hbmRfMSk6IFNvbWUgZGRpdGlvbmFsIGNoZWNraW5nIHRvIHByZXZlbnQgYSB3YXRjaAorIAliZWZvcmUgYSBydW4gY29tbWFuZC4KKwkoZXBfcGFyc2Vfb3B0aW9uYWxfZmlsZW5hbWUpOiBTaW1wbGlmaWVkIGZvciBsb29wLgorCShjcmVhdGVfZXhjZXB0aW9uX2NhdGNocG9pbnQpOiBOZXcgZnVuY3Rpb24KKwkoY292ZXJfdGFyZ2V0X2VuYWJsZV9leGNlcHRpb25fY2FsbGJhY2spOiBOZXcgZnVuY3Rpb24KKwkoaGFuZGxlX2dudV80XzE2X2NhdGNoX2NvbW1hbmQpOiBUaGlzIHVzZWQgdG8gYmUgdGhjYXRjaF9jb21tYW5kXzEKKyAJZnVuY3Rpb24uZQorCShjcmVhdGVfdGVtcF9leGNlcHRpb25fYnJlYWtwb2ludCk6IE5ldyBmdW5jdGlvbgorCShjYXRjaF9jb21tYW5kXzEpOiBEaWZmZXJzIGZyb20gZ2RiIDQuMTYgYW5kIGdkYiA0LjE3LiBJcyBub3cKKyAJY2FsbGluZyBjYXRjaF9leGNlcHRpb25fY29tbWFuZF8xIHVzaW5nIHRoZSBFWF9FVkVOVF9DQVRDSCBhbmQKKyAJRVhfRVZFTlRfVEhST1cgdmFsdWVzIGFzIHBhcmFtZXRlcnMuCisJKGNsZWFyX2NvbW1hbmQpOiBBZGRpdGlvbmFsIGNvbW1lbnRzCisJKGRlbGV0ZV9icmVha3BvaW50KTogSGFuZGxlIGV4Y2VwdGlvbnMuIENoZWNrIGZvciBhZGRpdGlvbmFsCisgCWJyZWFrcG9pbnQgZW5hYmxlIHNldHRpbmdzOiBTaGxpYl9kaXNhYmxlZCwgY2FsbF9kaXNhYmxlZC4KKwkoZGVsZXRlX2NvbW1hbmQpOiBIcCBmb2xrcyBhcmUgY2xhaW1pbmcgdGhhdCB3ZSBzaG91bGQgbm90IGRlbGV0ZQorIAlzaGxpYl9ldmVudCBicmVha3BvaW50cworCShicmVha3BvaW50X3JlX3NldF9vbmUpOiBNb3ZlZCBjYWxsIHRvIGNoZWNrX2R1cGxpY2F0ZXMuICBBZGQgbmV3CisgCWJyZWFrcG9pbnQgdHlwZXMgdG8gc3dpdGNoIHN0YXRlbWVudC4KKwkoYnJlYWtwb2ludF9yZV9zZXRfdGhyZWFkKTogTmV3IGZ1bmN0aW9uCisJKGVuYWJsZV9jb21tYW5kKTogQWNjb3VudCBmb3IgbmV3IGJyZWFrcG9pbnQgdHlwZXMuCisKKwkoaW5zZXJ0aW9uX3N0YXRlX3QpOiBOZXcgZW51bWVyYXRlZCB0eXBlLgorCShyZW1vdmVfYnJlYWtwb2ludCk6IE5ldyBwYXJhbSBpbiBmdW5jdCBwcm90b3R5cGUuCisJKGluc2VydF9icmVha3BvaW50cyk6IENoZWNrIGZvciBicF9jYXRjaF9mb3JrIGFuZCBicF9jYXRjaF92Zm9yay4KKwkocmVtb3ZlX2JyZWFrcG9pbnRzKTogQ2hhbmdlZCBjYWxsIHRvIHJlbW92ZV9icmVha3BvaW50LgorCShkZXRhY2hfYnJlYWtwb2ludHMpOiBOZXcgZnVuY3Rpb24uCisJKHJlbW92ZV9icmVha3BvaW50KTogTmV3IHBhcmFtZXRlciwgaXMuIEFsc28gY2hhbmdlZCB0aGUKKwl3YXkgYi0+aW5zZXJ0ZWQgaXMgc2V0LgorCShlcF9pc19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uLgorCShlcF9pc19zaGxpYl9jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uLgorCShwcmludF9pdF9ub3JtYWwpOiBDaGVjayBmb3IgYnBfY2F0Y2hfbG9hZCwgYnBfY2F0Y2hfdW5sb2FkLCAKKwlicF9jYXRjaF9mb3JrLCBicF9jYXRjaF92Zm9yaywgYnBfY2F0Y2hfZXhlYy4gQWxzbyBuZXcgY29kZSAKKwl0byBwcmludCBvdXQgY2F0Y2hwb2ludHMgcHJvcGVybHkuCisJKGJwc3RhdF9zdG9wX3N0YXR1cyk6IENoZWNrIGZvciBicF9jYXRjaF9mb3JrLCBicF9jYXRjaF92Zm9yaywKKwlhbmQgYnBfY2F0Y2hfZXhlYy4gQWxzbywgc29tZSBjb2RlIHRvIGNoZWNrIGZvciBjYXRjaGluZyBhIAorCXNoYXJlZCBsaWJyYXJ5IGxvYWQvdW5sb2FkLgorCShicHN0YXRfd2hhdCk6IEFkZGVkIGNhdGNoX3NobGliX2V2ZW50IHRvIGNsYXNzIGVudW1lcmF0aW9uLgorCURlZmluZWQgbmV3IG1hY3JvLCBzaGxyLiBFeHBhbmRlZCB0aGUgYnBzdGF0X3doYXRfbWFpbl9hY3Rpb24KKwl0YWJsZS4gQWRkIGNhc2VzIGZvciBicF9jYXRjaF9sb2FkLCBicF9jYXRjaF91bmxvYWQsIAorCWJwX2NhdGNoX2ZvcmssIGJwX2NhdGNoX3Zmb3JrLCBhbmQgYnBfY2F0Y2hfZXhlYy4KKwkoYnBzdGF0X2dldF90cmlnZ2VyZWRfY2F0Y2hwb2ludHMpOiBOZXcgZnVuY3Rpb24uCisJKGJyZWFrcG9pbnRfMSk6IENoYW5nZXMgdG8gYnB0eXBlcyBkZWZpbml0aW9uLiBBbHNvIGNoZWNrIGZvcgorCWJwX2NhdGNoX2xvYWQsIGJwX2NhdGNoX3VubG9hZCwgYnBfY2F0Y2hfZm9yaywgYnBfY2F0Y2hfdmZvcmssCisJYnBfY2F0Y2hfZXhlYy4gU2ltaWxhciBjaGFuZ2VzIHRvIHRoZSBzd2l0Y2ggc3RhdGVtZW50LgorCShzZXRfcmF3X2JyZWFrcG9pbnQpOiBJbml0aWFsaXplIG5ldyBicmVha3BvaW50IHN0cnVjdHVyZSBmaWVsZHMuCisJZGxsX3BhdGhuYW1lLCB0cmlnZ2VyZWRfZGxsX3BhdGhuYW1lLCBmb3JrZWRfaW5mZXJpb3JfcGlkLAorCWV4ZWNfcGF0aG5hbWUuCisJKGNyZWF0ZV9zb2xpYl9sb2FkX3VubG9hZF9ldmVudF9icmVha3BvaW50KTogTmV3IGZ1bmN0aW9uLgorCShjcmVhdGVfc29saWJfbG9hZF9ldmVudF9icmVha3BvaW50KTogTmV3IGZ1bmN0aW9uLgorCShjcmVhdGVfc29saWJfdW5sb2FkX2V2ZW50X2JyZWFrcG9pbnQpOiBOZXcgZnVuY3Rpb24uCisJKGNyZWF0ZV9mb3JrX3Zmb3JrX2V2ZW50X2NhdGNocG9pbnQpOiBOZXcgZnVuY3Rpb24uCisJKGNyZWF0ZV9mb3JrX2V2ZW50X2NhdGNocG9pbnQpOiBOZXcgZnVuY3Rpb24uCisJKGNyZWF0ZV92Zm9ya19ldmVudF9jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uLgorCShtZW50aW9uKTogTmV3IGNhc2VzIGZvciBicF9jYXRjaF9sb2FkLCBicF9jYXRjaF91bmxvYWQsIAorCWJwX2NhdGNoX2ZvcmssIGJwX2NhdGNoX3Zmb3JrLCBicF9jYXRjaF9leGVjLgorCShlcF9za2lwX2xlYWRpbmdfd2hpdGVzcGFjZSk6IE5ldyBmdW5jdGlvbi4KKwkoZXBfZmluZF9ldmVudF9uYW1lX2VuZCk6IE5ldyBmdW5jdGlvbi4KKwkoZXBfcGFyc2Vfb3B0aW9uYWxfaWZfY2xhdXNlKTogTmV3IGZ1bmN0aW9uLgorCShlcF9wYXJzZV9vcHRpb25hbF9maWxlbmFtZSk6IE5ldyBmdW5jdGlvbi4KKwkoY2F0Y2hfZm9ya19raW5kKTogTmV3IGVudW1lcmF0ZWQgdHlwZS4KKwkoY2F0Y2hfZm9ya19jb21tYW5kXzEpOiBOZXcgZnVuY3Rpb24uCisJKGNhdGNoX2V4ZWNfY29tbWFuZF8xKTogTmV3IGZ1bmN0aW9uLgorCShjYXRjaF9sb2FkX2NvbW1hbmRfMSk6IE5ldyBmdW5jdGlvbi4KKwkoY2F0Y2hfdW5sb2FkX2NvbW1hbmRfMSk6IE5ldyBmdW5jdGlvbi4KKwkoY2F0Y2hfdGhyb3dfY29tbWFuZF8xKTogTmV3IGZ1bmN0aW9uLgorCShjYXRjaF9jb21tYW5kXzEpOiBOb3cgY2FsbHMgY2F0Y2hfdGhyb3dfY29tbWFuZF8xLgorCSh0Y2F0Y2hfY29tbWFuZCk6IE5ldyBmdW5jdGlvbi4KKwkoZGVsZXRlX2JyZWFrcG9pbnQpOiBDaGFuZ2VkIGNhbGwgdG8gcmVtb3ZlX2JyZWFrcG9pbnQuCisJQWxzbyBmcmVlIHRoZSBuZXcgZmllbGRzIGluIHRoZSBicmVha3BvaW50IHN0cnVjdHVyZS4KKwkoYnJlYWtwb2ludF9yZV9zZXRfb25lKTogSGFuZGxlIGJwX2NhdGNoX2xvYWQsIGJwX2NhdGNoX3VubG9hZCwKKwlicF9jYXRjaF9mb3JrLCBicF9jYXRjaF92Zm9yaywgYnBfY2F0Y2hfZXhlYy4KKwkoZGlzYWJsZV9jb21tYW5kKTogSGFuZGxlIGJwX2NhdGNoX2xvYWQsIGJwX2NhdGNoX3VubG9hZCwKKwlicF9jYXRjaF9mb3JrLCBicF9jYXRjaF92Zm9yaywgYnBfY2F0Y2hfZXhlYy4KKwkoZW5hYmxlX2NvbW1hbmQpOiBIYW5kbGUgYnBfY2F0Y2hfbG9hZCwgYnBfY2F0Y2hfdW5sb2FkLAorCWJwX2NhdGNoX2ZvcmssIGJwX2NhdGNoX3Zmb3JrLCBicF9jYXRjaF9leGVjLgorCShfaW5pdGlhbGl6ZV9icmVha3BvaW50KTogQWx0ZXIgYWRkX2NvbSBjYWxsIGZvciBjYXRjaHBvaW50cywKKwlhZGQgYWRkX2NvbSBjYWxsIGZvciB3YXRjaHBvaW50cy4KKworCSogYnJlYWtwb2ludC5oIChlbnVtIGJwdHlwZSk6IE5ldyBlbnRyaWVzIGJwX2NhdGNoX2NhdGNoLAorIAlicF9jYXRjaF90aHJvdywgYW5kIGJwX25vbmUsIGJwX2NhdGNoX2xvYWQsIGJwX2NhdGNoX3VubG9hZCwKKyAJYnBfY2F0Y2hfZm9yaywgYnBfY2F0Y2hfdmZvcmssYnBfY2F0Y2hfZXhlYy4gIEFkZCBkZWNsYXJhdGlvbnMgZm9yCisgCW5ldyBmdW5jdGlvbnMgYnBzdGF0X2hhdmVfYWN0aXZlX2h3X3dhdGNocG9pbnRzIGFuZAorIAljcmVhdGVfZXhlY19ldmVudF9jYXRjaHBvaW50LgorCSh0YnJlYWtfY29tbWFuZCk6IEFkZCBwcm90b3R5cGUuCisJKHVwZGF0ZV9icmVha3BvaW50c19hZnRlcl9leGVjKTogQWRkIHByb3RvdHlwZTsgdXBkYXRlIGNvbW1lbnRzLgorCShyZWF0dGFjaF9icmVha3BvaW50cyk6IE5ldyBmdW5jdCBwcm90b3R5cGUgZGVjbGFyYXRpb24uCisJKGVuYWJsZSk6IE5ldyBlbnVtZXJhdGVkIHZhbHVlIGNhbGxfZGlzYWJsZWQuCisJKGJwc3RhdF9maW5kX3N0ZXBfcmVzdW1lX2JyZWFrcG9pbnQpOiBOZXcgZnVuY3QgZGVjbC4KKwkoaW5mX2NvbnRleHQpOiBOZXcgZW51bWVyYXRlZCB0eXBlLgorCShicmVha3BvaW50X3JlX3NldF90aHJlYWQpOiBOZXcgZnVuY3QgZGVjbC4KKwkoYnJlYWtwb2ludF9pbml0X2luZmVyaW9yKTogTmV3IHBhcmFtZXRlci4KKwkoZGlzYWJsZV93YXRjaHBvaW50c19iZWZvcmVfaW50ZXJhY3RpdmVfY2FsbF9zdGFydCk6IE5ldyBmdW5jdCBkZWNsLgorCShlbmFibGVfd2F0Y2hwb2ludHNfYWZ0ZXJfaW50ZXJhY3RpdmVfY2FsbF9zdG9wKTogTmV3IGZ1bmN0IGRlY2wuCisJKGRpc2FibGVfYnJlYWtwb2ludHNfaW5fc2hsaWJzKTogTmV3IGZ1bmN0IGRlY2wuCisgIAkoc3RydWN0IGJyZWFrcG9pbnQpOiBOZXcgZmllbGRzLCBkbGxfcGF0aG5hbWUsdHJpZ2dlcmVkX2RsbF9wYXRobmFtZSwKKyAJZm9ya2VkX2luZmVyaW9yX3BpZCxleGVjX3BhdGhuYW1lIEJQU1RBVF9XSEFUX0NIRUNLX1NITElCU19SRVNVTUVfRlJPTV9IT09LLgorCShicHN0YXRfZ2V0X3RyaWdnZXJlZF9jYXRjaHBvaW50cyk6IE5ldyBmdW5jdGlvbi4KKwkoZGV0YWNoX2JyZWFrcG9pbnRzKTogTmV3IGZ1bmN0aW9uLgorCShjcmVhdGVfc29saWJfbG9hZF9ldmVudF9icmVha3BvaW50KTogTmV3IGZ1bmN0aW9uLgorCShjcmVhdGVfc29saWJfdW5sb2FkX2V2ZW50X2JyZWFrcG9pbnQpIE5ldyBmdW5jdGlvbi4KKwkoY3JlYXRlX2ZvcmtfZXZlbnRfY2F0Y2hwb2ludCk6IE5ldyBmdW5jdGlvbi4KKwkoY3JlYXRlX3Zmb3JrX2V2ZW50X2NhdGNocG9pbnQpOiBOZXcgZnVuY3Rpb24uCisJKGVwX2lzX2NhdGNocG9pbnQpOiBOZXcgZnVuY3Rpb24uCisJKGVwX2lzX3NobGliX2NhdGNocG9pbnQpIE5ldyBmdW5jdGlvbi4KKyAJKGVudW0gYnBzdGF0X3doYXRfbWFpbl9hY3Rpb24pOiBOZXcgZW50cnkuCisKKwkqIGJ1aWxkc3ltLmMgKGZpbmlzaF9ibG9jayk6IEdldCByaWQgb2YgcHJvY2Vzc2luZ19ocF9jb21waWxhdGlvbjsKKyAJaGFuZGxlIExPQ19JTkRJUkVDVCBjYXNlLiAgU2V0IHRoZSBCTE9DS19HQ0NfQ09NUElMRUQgdG8gdGhlIHJpZ2h0CisgCWNvbXBpbGVyLgorCShwdXNoX2NvbnRleHQpOiBBZGQgc3ltYm9scyBmb3IgcGFyYW1ldGVycyB0byB0aGUgY29udGV4dF9zdGFjay4KKwkobWVyZ2Vfc3ltYm9sX2xpc3RzKTogTmV3IGZ1bmN0aW9uLiBNZXJnZXMgdHdvIHN5bWJvbCBsaXN0cy4KKwkoc3RydWN0IGNvbnRleHRfc3RhY2spOiBBZGQgbmV3IGZpZWxkIHBhcmFtLgorCisJKHByb2Nlc3NpbmdfaHBfY29tcGlsYXRpb24pOiBOZXcgZXh0ZXJuYWwgdmFyLgorCisJKiBjLWV4cC55OiBVc2UgZXh0ZXJuYWwgZmxhZyBocF9zb21fc29tX29iamVjdF9wcmVzZW50IHRvIGRlY2lkZQorIAl3aGV0aGVyIGNvZGUgd2FzIGNvbXBpbGVkIGJ5IEhQJ3MgY29tcGlsZXJzLiAgQWRkIHR3byBuZXcgQysrCisgCXRva2VucyBmb3IgdHJ1ZSBhbmQgZmFsc2UuCisJKHl5bGV4KTogQ2hlY2sgZm9yIHRlbXBsYXRlIG5hbWUgaXMgZG9uZSBkaWZmZXJlbnRseSBmb3IgdGhlCisgCUhQL2FDQyBjb21waWxlciBjYXNlOyBjaGFuZ2Ugc29tZSBvZiB0aGUgdGVtcGxhdGUgcHJvY2Vzc2luZyBjb2RlCisgCWZvciBoYW5kbGluZyBIUCBhQ0MgdGVtcGxhdGVzLgorCisJKiBjLWxhbmcuYyAoY19jcmVhdGVfZnVuZGFtZW50YWxfdHlwZSk6IEFkZGVkIGNhc2UgdG8gaGFuZGxlCisgCXRlbXBsYXRlIGFyZ3MuICBIYW5kbGUgRlRfQk9PTEVBTiB0eXBlLiAgU2V0IG5vIHNpZ24gZmxhZyBmb3IKKyAJRlRfQ0hBUi4KKwkoY3BsdXNfYnVpbHRpbl90eXBlcyk6IE5ldyBzdHJ1Y3R1cmUgZm9yIGMrKyBidWlsdGluIHR5cGVzLgorCShjcGx1c19sYW5ndWFnZV9kZWZuKTogVXNlIGNwbHVzX2J1aWx0aW5fdHlwZXMgaW5zdGVhZCBvZgorIAljX2J1aWx0aW5fdHlwZXMuCisKKwkqIGMtdHlwZXByaW50LmMgKGNfdHlwZV9wcmludF9iYXNlKTogRG9uJ3QgcHJpbnQgJ3ByaXZldGUnIGxhYmVsCisgCWZvciBhIGNsYXNzIGlmIGFsbCBtZW1iZXJzIGFyZSBwcml2YXRlLCBzaW1pbGFybHkgZG9uJ3QgcHJpbnQKKyAJJ3B1YmxpYycgZm9yIGEgc3RydWN0LiAgQWRkIHN1cHBvcnQgZm9yIHNpemVkIGVudW1zIChIUC9hQ0MpLiAgZ2V0CisgCXJpZCBvZiB0aGUgJ3N0YXRpYycga2V5d29yZCBwcmludGVkIGJ5IHRoZSBkZW1hbmdsZXIgZm9yIG1lbWJlcgorIAlmdW5jdGlvbiwgd2hlbiBwcmludGluZyB0aGUgdHlwZSBvZiBhIGNsYXNzLiAnc3RhdGljJyB3aWxsIGJlCisgCWFkZGVkIGJ5IHRoaXMgZnVuY3Rpb24uICBJZiB0aGUgZGVtYW5nbGVkIG5hbWUgaXMgbnVsbCwgYW5kIHRoZQorIAltZXRob2QgaXMgbm90IHN0dWJiZWQsIGdldCB0aGUgc2lnbmF0dXJlIGJ5IGxvb2tpbmcgYXQgdGhlCisgCWluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgc3ltYm9sIHN0cnVjdHVyZS4gIFJlbW92ZSBwcmludGluZyBvZgorIAknY29uc3QnIGFuZCAndm9sYXRpbGUnIGtleXdvcmRzIGZvciBtZXRob2RzLiBUaGlzIGlzIG5vdyB0YWtlbgorIAljYXJlIGFzIHBhcnQgb2YgdGhlIGRlbWFuZ2xlZCBtZW1iZXIgbmFtZXMuCisJKGNwX3R5cGVfcHJpbnRfbWV0aG9kX2FyZ3MpOiBOZXcgZnVuY3Rpb24uIFRvIHByaW50IGEgQysrIG1ldGhvZAorIAlhcmd1bWVudHMgYW5kIG5hbWUgdG8gdGhlIG91dHB1dCBzdHJlYW0uCisKKwkoY190eXBlX3ByaW50X2N2X3F1YWxpZmllcik6IE5ldyBmdW5jdGlvbi4gUHJpbnQgb3V0ICJjb25zdCIgYW5kCisgCSJ2b2xhdGlsZSIgYXR0cmlidXRlcy4KKwkoY190eXBlX3ByaW50X3ZhcnNwZWNfcHJlZml4KTogUHJpbnQgY29uc3Qgb3Igdm9sYXRpbGUgcXVhbGlmaWVycy4KKwkoY190eXBlX3ByaW50X2FyZ3MpOiBQcmludCAndm9pZCcgZm9yIGMrKy4KKwkoY190eXBlX3ByaW50X3ZhcnNwZWNfc3VmZml4KTogUHJpbnQgJ3ZvaWQnIGZvciBhIG5vIGFyZ3VtZW50CisgCWZ1bmN0aW9uLgorCShjX3R5cGVfcHJpbnRfYmFzZSk6IFByaW50IGNvbnN0IG9yIHZvbGF0aWxlIHF1YWxpZmllcnMuICBEbyBub3QKKyAJcHJpbnQgJ3VubmFtZWQgdW5pb24nIGlmIEhQIGFDQyBjb21waWxlciB1c2VkLiAgRGlzdGluZ3Vpc2gKKyAJYmV0d2VlbiBzdHJ1Y3QgYW5kIGNsYXNzIGJhc2VkIG9uIHRoZSBERUNMQVJFRF9UWVBFLiAgSGFuZGxlCisgCUhQL2FDQyBjb21waWxlciBjYXNlIGZvciBub3QgcHJpbnRpbmcgdnRhYmxlLiAgQWRkIFRlbXBsYXRlCisgCXN1cHBvcnQuCisKKwkoY3BfdHlwZV9wcmludF9kZXJpdmF0aW9uX2luZm8pOiBQcmludCBvdXQgJ3Byb3RlY3RlZCcgd2hlbgorIAlhcHByb3ByaWF0ZS4gVGhpcyBhcHBsaWVzIG9ubHkgdG8gSFAncyBjb21waWxlcnMsIG5vdCBnY2MuCisKKwkoY192YWxfcHJpbnQpOiBBZGRlZCBwYXJhbWV0ZXIgZW1iZWRkZWRfb2Zmc2V0LiAgQWRkCisgCWVtYmVkZGVkX29mZnNldCB0byB2YWxhZGRyIGluIGZ1bmN0aW9uIGNhbGxzOyBmaXggY2FsbHMgdG8KKyAJdmFsX3ByaW50IGFuZCBjcF9wcmludF92YWx1ZV9maWVsZHMuICBwcm9jZXNzIFRZUEVfQ09ERV9NRVRIT0QgYXMKKyAJd2VsbC4gIG1vdmVkIGNhbGwgdG8gY2hlY2tfdHlwZWRlZiBvdXQgb2YgY29uZGl0aW9uYWwuICBhZGRlZAorIAllbWJlZGRlZCBvZmZzZXQgcGFyYW0gdG8gdmFsX3ByaW50IGNhbGwuCisKKwkoY192YWx1ZV9wcmludCk6IEFkZCBuZXcgcGFyYW1ldGVyIHRvIGNhbGwgdG8gdmFsX3ByaW50LgorCWhhbmRsZSBwb2ludGVyIHRvIGNsYXNzIGNhc2UuICBBdHRlbXB0IHRvCisgCWRldGVybWluZSB0aGUgcmVhbCB0eXBlIG9mIHRoZSBvYmplY3QgdG8gYmUgcHJpbnRlZC4KKwllbnN1cmUgdGhhdCBjb25zdCBjaGFyICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKgorCWNvbWUgb3V0IHdpdGhvdXQgdGhlIHR5cGUgYnV0IHRoZSB2b2xhdGlsZSB2YXJpYW50cworCWFuZCB0aGUgc2lnbmVkIHZhcmlhbnRzIGRvbid0LgorCisJKiBjb2ZmLXNvbGliLmMgKGNvZmZfc29saWJfYWRkKTogQWRkIHBhcmFtZXRlcnMgdG8gY2FsbAorCXRvIHN5bWJvbF9maWxlX2FkZC4KKworCSogY29mZi1zb2xpYi5oOiAoU29saWJfUkVNT1ZFX0lORkVSSU9SX0hPT0spOiBOZXcgbWFjcm8uIGRlZmluZWQKKyAJdG8gMC4gIGZ1bmN0aW9uYWxpdHkgbm90IGltcGxlbWVudGVkIGZvciBjb2ZmLgorCShTT0xJQl9DUkVBVEVfQ0FUQ0hfTE9BRF9IT09LKTogTmV3IG1hY3JvLCBnZW5lcmF0ZSBlcnJvciBtZXNzYWdlCisgCWZvciBjb2ZmLgorCShTT0xJQl9DUkVBVEVfQ0FUQ0hfVU5MT0FEX0hPT0spOiBEaXR0by4KKwkoU09MSUJfSEFWRV9MT0FEX0VWRU5UKTogRGl0dG8uCisJKFNPTElCX0xPQURFRF9MSUJSQVJZX1BBVEhOQU1FKTogRGl0dG8uCisJKFNPTElCX0hBVkVfVU5MT0FEX0VWRU5UKTogRGl0dG8uCisJKFNPTElCX1VOTE9BREVEX0xJQlJBUllfUEFUSE5BTUUpOiBEaXR0by4KKwkoU09MSUJfSU5fRFlOQU1JQ19MSU5LRVIpOiBEaXR0by4KKwkoU09MSUJfUkVTVEFSVCk6IERpdHRvLgorCisJKiBjb21tYW5kLmMgKGZpbmRfY21kKTogTmV3IGZ1bmN0aW9uLiAgKGxvb2t1cF9jbWRfMSk6IENhbGwgaXQsCisgCWNoYW5nZSBwYXJzaW5nIGlmIHR1aV92ZXJzaW9uIG9yIHhkYl9jb21tYW5kcyBpcyBzZXQuCisgIAkoX2luaXRpYWxpemVfY29tbWFuZCk6IEluc3RhbGwgbmV3IGFsaWFzIGlmIHhkYl9jb21tYW5kcyBpcyBzZXQuCisKKwkqIGNvbXBsYWludHMuaDogQWRkIGlmZGVmLi4uZW5kaWYgcGFpciBhdCBiZWdpbm5pbmcgYW5kIGVuZCBvZiBmaWxlLgorCQorCSogY29uZmlnLmluLCBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCisJKiBjb25maWcvcGEvaHBwYWJzZC5taCAoTkFUREVQRklMRVMpOiBBZGRlZCBuZXcgZmlsZXMgCisJaHAtcHN5bXRhYi1yZWFkLm8gYW5kIGhwLXN5bXRhYi1yZWFkLm8uCisJKiBjb25maWcvcGEvaHBwYWhwdXgubWggKE5BVERFUEZJTEVTKTogRGl0dG8uCisKKwkqIGNvbmZpZy9wYS9ocHBhaHB1eC5taCAoVEVSTUNBUCk6IFVzZSAtbEhjdXJzZXMuCisJKiBjb25maWcvcGEvaHBwYW9zZi5taCAoTkFUREVQRklMRVMpOiBEaXR0by4KKworCSogY29uZmlnL3BhL2hwdXgxMDIwLm1oIChURVJNQ0FQKTogVXNlIC1sSGN1cnNlcy4KKwkoTUhfQ0ZMQUdTKTogTmV3IGZsYWcsIC1EX19IUF9DVVJTRVMsIHRoaXMgZGVmaW5lCisJaXMgdXNlZCBieSBIUCdzIGxpbmtlciB0byBmaW5kIHRoZSBjb3JyZWN0IGN1cnNlcyBsaWJyYXJ5LgorCisJKiBjb25maWcvcGEvaHB1eDEwMjAubWg6IE5ldyBmaWxlLgorCisJKiBjb25maWcvcGEvaHB1eDEwMjAubXQ6IE5ldyBmaWxlLgorCisJKiBjb25maWcvcGEvaHB1eDExMDAubWggKFRFUk1DQVApOiBMaW5rIGFnYWluc3QgLWxjdXJzZXMsIG5vdAorCS1sSGN1cnNlcy4gIFRoZSBsYXR0ZXIgZG9lcyBub3QgY29udGFpbiBtdndhZGRzdHIsIHdzY3JsLCBvcgorCXdzdGJ3bG1rZnp6LgorCisJKiBjb25maWcvcGEvaHB1eDExMDAubWggKFRFUk1DQVApOiBVc2UgLWxIY3Vyc2VzLgorCShNSF9DRkxBR1MpOiBOZXcgZmxhZywgLURfX0hQX0NVUlNFUywgdGhpcyBkZWZpbmUKKwlpcyB1c2VkIGJ5IEhQJ3MgbGlua2VyIHRvIGZpbmQgdGhlIGNvcnJlY3QgY3Vyc2VzIGxpYnJhcnkuCisKKwkqIGNvbmZpZy9wYS9ocHV4MTEwMC5taCAoVEVSTUNBUCk6IFdoZW4gaG9zdGluZyBvbiBocHV4IDExLjAwLCB1c2UKKwktbEhjdXJzZXMgcmF0aGVyIHRoYW4gLWxjdXJzZXMuCisKKwkqIGNvbmZpZy9wYS9ocHV4MTEwMC5taDogTmV3IGZpbGUuCisKKwkqIGNvbmZpZy9wYS9ocHV4MTEwMC5tdDogTmV3IGZpbGUuCisKKwkqIGNvbmZpZy9wYS9ubS1ocHBhaC5oIChDSElMRF9IQVNfU1lTQ0FMTF9FVkVOVCk6IE5ldyBtYWNybworCShDSElMRF9USFJFQURfQUxJVkUpOiBOZXcgbWFjcm8KKwkoU1RPUFBFRF9CWV9XQVRDSFBPSU5UKTogQWRkIGEgY29uZGl0aW9uIHRvIHRoZSBtYWNybywgCisJISBzdGVwcGVkX2FmdGVyX3N0b3BwZWRfYnlfd2F0Y2hwb2ludAorCShUQVJHRVRfRU5BQkxFX0hXX1dBVENIUE9JTlRTKTogTmV3IG1hY3JvCisJKGhwcGFfZW5hYmxlX2h3X3dhdGNocG9pbnRzKTogTmV3IGZ1bmN0IGRlY2wKKwkoVEFSR0VUX0RJU0FCTEVfSFdfV0FUQ0hQT0lOVFMpOiBOZXcgbWFjcm8KKwkoIGhwcGFfZGlzYWJsZV9od193YXRjaHBvaW50cyk6IE5ldyBmdW5jdCBkZWNsCisJICAgICB0aGVzZSBhcmUgZm9yIEhQJ3MgaW1wbGVtZW50YXRpb24gb2YgZmFzdCAKKwl3YXRjaHBvaW50cyAodmlhIHBhZ2UgcHJvdGVjdGlvbikuCisJKHRhcmdldF9waWRfdG9fc3RyKTogTmV3IG1hY3JvLCBjYWxscyBocHBhX3BpZF90b19zdHIKKwkodGFyZ2V0X3RpZF90b19zdHIpOiBOZXcgbWFjcm8sIGNhbGxzIGhwcGFfdGlkX3RvX3N0cgorCisJKiBjb25maWcvcGEvbm0taHBwYWguaCAoQ0hJTERfUE9TVF9XQUlUKTogRGVsZXRlOworCShDSElMRF9DUkVBVEVfQ0FUQ0hfRk9SS19IT09LKTogUmVwbGFjZSB3aXRoCisgCUNISUxEX0lOU0VSVF9GT1JLX0NBVENIUE9JTlQgYW5kIENISUxEX1JFTU9WRV9GT1JLX0NBVENIUE9JTlQuCisJKENISUxEX0NSRUFURV9DQVRDSF9WRk9SS19IT09LKTogUmVwbGFjZSB3aXRoCisgCUNISUxEX0lOU0VSVF9WRk9SS19DQVRDSFBPSU5UIGFuZCBDSElMRF9SRU1PVkVfVkZPUktfQ0FUQ0hQT0lOVC4KKwkoQ0hJTERfQ0FOX0ZPTExPV19WRk9SS19QUklPUl9UT19FWEVDLAorIAlDSElMRF9JTlNFUlRfRVhFQ19DQVRDSFBPSU5ULCBDSElMRF9SRU1PVkVfRVhFQ19DQVRDSFBPSU5ULAorIAlDSElMRF9IQVNfRVhFQ0QsIENISUxEX1JFUE9SVEVEX0VYRUNfRVZFTlRTX1BFUl9FWEVDX0NBTEwsCisgCUNISUxEX1BPU1RfQVRUQUNILCBUQVJHRVRfSEFTX0hBUkRXQVJFX1dBVENIUE9JTlRTLAorCVRBUkdFVF9DQU5fVVNFX0hBUkRXQVJFX1dBVENIUE9JTlQsCisJVEFSR0VUX1JFR0lPTl9TSVpFX09LX0ZPUl9IV19XQVRDSFBPSU5ULAorCVRBUkdFVF9SQU5HRV9QUk9GSVRBQkxFX0ZPUl9IV19XQVRDSFBPSU5ULCBTVE9QUEVEX0JZX1dBVENIUE9JTlQsCisJSEFWRV9OT05TVEVQUEFCTEVfV0FUQ0hQT0lOVCwgdGFyZ2V0X2luc2VydF93YXRjaHBvaW50LAorCXRhcmdldF9yZW1vdGVfd2F0Y2hwb2ludCk6IE5ldyBtYWNyb3MuCisKKwkqIGNvbmZpZy9wYS9ubS1ocHBhaC5oIChDSElMRF9YRkVSX01FTU9SWSk6IFJlaW5zZXJ0IGFjY2lkZW50YWxseQorCWRlbGV0ZWQgZGVmaW5lLgorCisJKiBjb25maWcvcGEvbm0taHBwYWguaDoKKwkoUFJFUEFSRV9UT19QUk9DRUVEKTogRGVmaW5lZCBtYWNybyB0byB1c2UgCisJaHBwYV9wcmVwYXJlX3RvX3Byb2NlZWQuCisJKGhwcGFfcGlkX3RvX3N0cik6IEV4dGVybiBkZWNsLgorCShocHBhX3RpZF90b19zdHIpOiBFeHRlcm4gZGVjbC4KKwkodGFyZ2V0X3BpZF9vcl90aWRfdG9fc3RyKTogTmV3IG1hY3JvIGRlZmluaXRpb24uCisJKGhwcGFfcGlkX29yX3RpZF90b19zdHIpOiBFeHRlcm4gZGVjbC4KKwkoRU5TVVJFX1ZGT1JLSU5HX1BBUkVOVF9SRU1BSU5TX1NUT1BQRUQpOiBOZXcgbWFjcm8gLSBmb3IKKwloYW5kbGluZyBldmVudHMgY2F1c2VkIGJ5IGEgY2FsbCB0byB2Zm9yay4KKwkoaHBwYV9lbnN1cmVfdmZvcmtpbmdfcGFyZW50X3JlbWFpbnNfc3RvcHBlZCk6IEV4dGVybiBkZWNsLgorCShSRVNVTUVfRVhFQ0RfVkZPUktJTkdfQ0hJTERfVE9fR0VUX1BBUkVOVF9WRk9SSyk6IE5ldyBtYWNybyAtCisJZm9yIGhhbmRsaW5nIGV2ZW50cyBjYXVzZWQgYnkgYSBjYWxsIHRvIHZmb3JrLgorCShocHBhX3Jlc3VtZV9leGVjZF92Zm9ya2luZ19jaGlsZF90b19nZXRfcGFyZW50X3Zmb3JrKTogRXh0ZXJuIGRlY2wuCisKKwkqIGNvbmZpZy9wYS9ubS1ocHBhaC5oOiBGaXggUFJFUEFSRV9UT19QUk9DRUVEIG1hY3JvLgorCisJKiBjb25maWcvcGEvbm0taHBwYWguaDogRml4IGZvciBnY2MgY29tcGlsZSBvbiBIUFVYLCBjaGFuZ2UKKyAJUFRfUkRVQVJFQSB0byBQVF9SVUFSRUEuCisKKwkqIGNvbmZpZy9wYS9ubS1ocHBhaC5oOiBJbnRyb2R1Y2VkIGFuIEhQVVhIUFBBIGRlZmluZS4KKwlBIGJpdCBvZiBhIGhhY2sgc28gdGhhdCBJIGNhbiBpZmRlZiBzb21lIGNvZGUgdGhhdCAKKwlvbmx5IHdvcmtzIGZvciB0aGUgSFAgd2lsZGViZWVzdCBkZWJ1Z2dlci4KKworCSogY29uZmlnL3BhL25tLWhwcGFoLmg6IExvdHMgb2YgbmV3IENISUxEXyBkZWZpbmVzOworCXByb2Nlc3NfZXZlbnRfa2luZCBlbnVtLgorCisJKiBjb25maWcvcGEvdG0taHBwYS5oIChCUkVBS1BPSU5UMzIpOiBOZXcgZGVmaW5lLgorCShDQUxMX0RVTU1ZX0hBU19DT01QTEVURUQpOiBOZXcgZGVmaW5lLgorCisJKiBjb25maWcvcGEvdG0taHBwYS5oIChTVEFDS19BTElHTik6IE5ldyBtYWNyby4KKwkoTk9fRVhUUkFfQUxJR05NRU5UX05FRURFRCk6IE5ldyBtYWNyby4KKwkoUENfUkVRVUlSRVNfUlVOX0JFRk9SRV9VU0UpOiBOZXcgbWFjcm8uIAorCShSRUdJU1RFUl9OQU1FUyk6IEZvcm1hdHRpbmcgaW4gZmlsZSBjaGFuZ2VkLgorCShDUjI3X1JFR05VTSk6IEJhc2UgcmVnaXN0ZXIgZm9yIHRocmVhZCBsb2NhbCBzdG9yYWdlLiAKKwkoVVNFX1NUUlVDVF9DT05WRU5USU9OKTogTmV3IG1hY3JvIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIKKwlhIGZ1bmN0aW9uIHJldHVybmluZyBhIHZhbHVlIG9mIHR5cGUgdHlwZSB3aWxsCisJcHV0IGl0IG9uIHRoZSBzdGFjayBvciBpbnRvIHJlZ2lzdGVycyAoYmFzZWQgb24gdGhlIAorCVBBIHJpc2MgY2FsbGluZyBjb252ZW50aW9ucykuCisJKEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKTogRml4ZWQgY2FsY3VsYXRpb24gZm9yIGV4dHJhY3RpbmcgcmV0dXJuIHZhbHVlLgorCShWQUxVRV9SRVRVUk5FRF9GUk9NX1NUQUNLKTogTmV3IG1hY3JvLgorCShUQVJHRVRfUkVBRF9QQyk6IERlY2xhcmVkIHRoZSBmdW5jdGlvbiB1c2VkIGluIHRoZSBkZWZpbml0aW9uLgorCShTS0lQX1RSQU1QT0xJTkVfQ09ERSk6IERlY2xhcmVkIHRoZSBmdW5jdGlvbiB1c2VkIGluIHRoZSBkZWZpbml0aW9uLgorCShUQVJHRVRfV1JJVEVfUEMpOiBEZWNsYXJlZCB0aGUgZnVuY3Rpb24gdXNlZCBpbiB0aGUgZGVmaW5pdGlvbi4KKwkoVEFSR0VUX1JFQURfRlApOiBEZWNsYXJlZCB0aGUgZnVuY3Rpb24gdXNlZCBpbiB0aGUgZGVmaW5pdGlvbi4KKworCSogY29uZmlnL3BhL3RtLWhwcGEuaCAoU1RSQ0FUX1JFR0lTVEVSKTogRGVmaW5lIG1hY3JvIGZvciAKKwlmdXR1cmUgdXNlLgorCShwYV9kb19zdHJjYXRfcmVnaXN0ZXJzX2luZm8pOiBNb3ZlZCBmdW5jdGlvbiBkZWNsIGZyb20KKwlkZWZzLmggdG8gdGhpcyBIUFVYIHNwZWNpZmljIC5oIGZpbGUuCisKKwkqIGNvbmZpZy9wYS90bS1ocHBhLmggKFVTRV9TVFJVQ1RfQ09OVkVOVElPTik6IFR5cGVfTEVOR1RIIHJldHVybnMKKwlieXRlcywgbm90IGJpdHM7IGZpeCBvZmYgYnkgOCBlcnJvci4KKworCSogY29uZmlnL3BhL3RtLWhwcGEuaDogCisJTmV3IGNvbW1lbnQgZm9yIG9ial91bndpbmRfaW5mbyBkZWZpbml0aW9uCisJTmV3IHR5cGVkZWYsIG9ial9wcml2YXRlX3N0cnVjdAorCisJKiBjb25maWcvcGEvdG0taHBwYS5oOiBEZWxldGUgbW9zdCB0YXJnZXRfIG1hY3JvcyAtLSB1c2UgZGVmYXVsdAorCXZlcnNpb25zIGluc3RlYWQ7IHJlbW92ZSBleHRyYW5lb3VzIGNvbW1hIGZyb20gcHJvY193YWl0IG1hY3JvLgorCisJKiBjb25maWcvcGEvdG0taHBwYS5oOiBHZXQgcmlkIG9mIG1hY3JvIEhQX0NPTVBJTEVEX1RBUkdFVC4KKworCSogY29uZmlnL3BhL3RtLWhwcGEuaDogUmVtb3ZlZCByZWRlZmluaXRpb25zIG9mIAorCVVTRV9TVFJVQ1RfQ09OVkVOVElPTiBhbmQgU1RBQ0tfQUxJR04gbWFjcm9zLgorCQorCSogY29uZmlnL3BhL3RtLWhwcGEuaDogU29tZSBuZXcgZGVmaW5pdGlvbnMKKwkgIE5ldyBtYWNyb3M6IEFyZzBfUkVHTlVNLCBBUkcxX1JFR05VTSwgQVJHMl9SRUdOVU0sIEFSRzNfUkVHTlVNLgorCSAgICB0YXJnZXRfcGlkX3RvX2V4ZWNfZmlsZSwgdGFyZ2V0X2Fja25vd2xlZGdlX2ZvcmtlZF9jaGlsZCwKKwkgICAgdGFyZ2V0X2NyZWF0ZV9jYXRjaF9mb3JrX2hvb2ssIHRhcmdldF9jcmVhdGVfY2F0Y2hfdmZvcmtfaG9vaywKKwkgICAgdGFyZ2V0X2hhc19mb3JrZWQsIHRhcmdldF9oYXNfdmZvcmtlZCwgcmVxdWlyZV9hdHRhY2gsIAorCSAgICByZXF1aXJlX2RldGFjaCwgcHJvY193YWl0CisJICBOZXcgZnVuY3QgZGVjbHM6IEhwcGFfcGlkX3RvX2V4ZWNfZmlsZSwKKwkgICAgaHBwYV9hY2tub3dsZWRnZV9mb3JrZWRfY2hpbGQsIGhwcGFfY3JlYXRlX2NhdGNoX2ZvcmtfaG9vaywKKwkgICAgaHBwYV9jcmVhdGVfY2F0Y2hfdmZvcmtfaG9vaywgaHBwYV90YXJnZXRfaGFzX2ZvcmtlZCwgCisJICAgIGhwcGFfdGFyZ2V0X2hhc192Zm9ya2VkLCBocHBhX3JlcXVpcmVfYXR0YWNoLCAKKwkgICAgaHBwYV9yZXF1aXJlX2RldGFjaCwgcHJvY2Vzc193YWl0CisJICAodW53aW5kX3RhYmxlX2VudHJ5KTogQWRkZWQgY29tbWVudHMgdG8gZGVzY3JpYmUgc3RydWN0IGZpZWxkcy4KKworCSogY29uZmlnL3BhL3RtLWhwcGFoLmggKHNvbXNvbGliLmgpOiBJbmNsdWRlIGl0LgorCisJKiBjb25maWcvcGEvdG0taHBwYWguaDogCisJKENISUxEX0VOQUJMRV9FWENFUFRJT05fQ0FMTEJBQ0spOiBOZXcgZGVmaW5lCisJKENISUxEX0dFVF9DVVJSRU5UX0VYQ0VQVElPTl9FVkVOVCk6IE5ldyBkZWZpbmUKKworCSogY29uZmlndXJlLmhvc3QgKGhwcGEtKi1ocHV4MTAuMjAsIGhwcGEtKi1ocHV4MTEuMCopOiBOZXcgY29uZmlncy4KKworCSogY29uZmlndXJlLmluIChBQ19DSEVDS19IRUFERVJTKTogQWRkIGNoZWNrIGZvciB0ZXJtLmguCisJCisJKiBjb25maWd1cmUuaW46IEFkZCBhbiAtLWVuYWJsZS10dWkgYXJndW1lbnQuCisKKwkqIGNvbmZpZ3VyZS5pbjogQ29uc3RydWN0IHR1aS9NYWtlZmlsZSBmcm9tIHR1aS9NYWtlZmlsZS5pbi4KKworCSogY29uZmlndXJlLmluOiBVc2UgQU1fUFJPR19DQ19TVERDLiAgSWYgd2UgaGF2ZSB0aGUgR1VJLCB0aGVuIHdlCisJbmVlZCB0aGlzIHRvIHByb2Nlc3MgbGliZ3VpLmguCisKKwkqIGNvbnZleC10ZGVwLmMgKGRlY291dCk6IENoYW5nZSBGSUxFIHRvIEdEQl9GSUxFLgorCisJKiBjb3JlZmlsZS5jOiBJbmNsdWRlIG9iamZpbGVzLmgsIHN5bWZpbGUuaC4KKwkoY29yZV9maWxlX2NvbW1hbmQpOiBBdHRlbXB0IHRvIGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sCisJZmlsZSBmcm9tIHRoZSBjb3JlIGZpbGUuCisJKHJlYWRfbWVtb3J5X3N0cmluZyk6IE5ldyBmdW5jdGlvbi4KKwkKKwkqIGNvcmVmaWxlLmMgKGNvcmVfZmlsZV9jb21tYW5kKTogVGVtcG9yYXJ5IGhhY2sgdG8gbWFrZSBub24taHB1eAorIAl3b3JrLiBGb3IsIG5vbi1ocHV4LCB0LT50b19jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUgZG9lcyBub3QgaGF2ZSBhCisgCXJlYXNvbmFibGUgdmFsdWUuIE5vIHRhcmdldF9vcHMgdmVjdG9yIG9uIHRoZSBzdGFjayBnaXZlcyBpdCBhCisgCW5vbi16ZXJvIHZhbHVlLiBmaXggbGF0ZXIuCisKKwkqIGNvcmVsb3cuYyAoY29yZV9maWxlX3RvX3N5bV9maWxlKTogQWRkZWQgbmV3IGxvY2FsIHZhcmlhYmxlLAorIAlmYWlsaW5nIGNvbW1hbmQsIGFuZCBkbyBzb21lIGV4cGxpY2l0IHR5cGUgY2FzdGluZ3MuCisJKGNvcmVfb3BzKTogQWRkIHRocmVlIG5ldyBmaWVsZHM6IHRvX2hhc19zeXNjYWxsX2V2ZW50LAorCXRvX2VuYWJsZV9leGNlcHRpb25fY2FsbGJhY2ssIHRvX2dldF9jdXJyZW50X2V4Y2VwdGlvbl9ldmVudC4KKyAJTmVjZXNzYXJ5IHNpbmNlIHdlIHN0aWxsIGhhdmUgb2xkc3R5bGUgaW5pdGlhbGl6YXRpb24gaW4KKwl0aGlzIGZpbGUKKworCSogY29yZWxvdy5jOiBJbmNsdWRlIHVuaXN0ZC5oCisJKGNvcmVfZmlsZV90b19zeW1fZmlsZSk6IE5ldyBmdW5jdGlvbiAKKwkoY29yZV9maWxlX3RocmVhZF9hbGl2ZSk6IE5ldyBmdW5jdGlvbgorCShjb3JlX29wcyk6IEFkZGVkIG5ldyB0YXJnZXQgb3BzIHZlY3RvciBmaWVsZHMuIHNlZSBiZWxvdy4gQW5kCisJICB5ZXMgd2UgZGVmaW5pdGllbHkgbmVlZCB0byBpbml0aWFsaXplIHRoZW0gaGVyZSwgYXMgbG9uZyBhcworCSAgd2UncmUgdXNpbmcgc3RhdGljIGluaXRpYWxpemF0aW9uLgorCisJKiBjeHV4LW5hdC5jIChhZGRfc2hhcmVkX3N5bWJvbF9maWxlcyk6IEFkZGl0b25hbCBwYXJhbXMgZm9yIGNhbGxzCisgCXRvIHN5bWJvbF9maWxlX2FkZC4KKworCSogZGVmcy5oIChnZGJfZmlsZV9pc2F0dHkpOiBOZXcgZnVuY3Rpb24gZGVjbC4KKworCSogZGVmcy5oIChHREJfRklMRSk6IElmIFRVSSBpcyBkZWZpbmVkLCBkZWZpbmUgYSBzdHJ1Y3R1cmUgcmF0aGVyCisgCXRoYW4gbWFraW5nIHRoaXMgYW4gYWxpYXMgZm9yIEZJTEUuCisJKGdkYl9zdGRvdXQsIGdkYl9zdGRlcnIpOiBJZiBUVUkgaXMgZGVmaW5lZCwgdGhlbiBkZWZpbmUgdGhlc2UKKwlhcyBwb2ludGVycyB0byB2YXJpYWJsZXMgb2YgdHlwZSBHREJfRklMRSByYXRoZXIgdGhhbiBtYWtpbmcgdGhlbQorCWJlIGFsaWFzZXMgZm9yIHN0ZG91dCBhbmQgc3RkZXJyLgorCisJKiBkZWZzLmggKFRVSURPKTogQWRkIGRlZmluaXRpb24gY29uZGl0aW9uYWxpemVkIG9uIGRlZmluaXRpb24KKwkob3IgbGFjayB0aGVyZW9mKSBvZiBUVUkuCisKKwkqIGRlZnMuaCAoY29tbWFuZF9jbGFzcyk6IEFkZCB0d28gYWRkaXRpb25hbCB2YWx1ZXMuCisJKHByZWNpc2lvbl90eXBlKTogTmV3IGVudW0uCisKKwkqIGRlZnMuaCAoZ2RiX2ZjbG9zZSk6IEFkZCBkZWNsYXJhdGlvbi4KKworCSogZGVmcy5oIChzdG9yZV9hZGRyZXNzKTogQ2hhbmdlIHByb3RvdHlwZSB0byBtYXRjaCBmdW5jdGlvbi4KKworCSogZGVmcy5oICh0dWlfdmVyc2lvbiwgeGRiX2NvbW1hbmRzLCBkYnhfY29tbWFuZHMpOiBBZGQgZGVjbCdzLgorCisJKiBkZWZzLmggKGdkYl9maWxlX2RlYWxsb2NhdGUpOiBOZXcgZnVuY3Rpb24gZGVjbGFyYXRpb24KKworCSogZGVmcy5oOiAKKwkoc3RyZWFtdHlwZSk6IE5ldyBlbnVtZXJhdGVkIHR5cGUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgorCW91dHB1dCB0byBhIEZJTEUgYW5kIG91dHB1dCB0byBhIGJ1ZmZlci4KKwkodHVpX3N0cmVhbSk6IE5ldyBzdHJ1Y3QgdHlwZSwgbmFtZWQgR0RCX0ZJTEUuIENvbnRhaW5zLAorCSBzdHJlYW10eXBlLCBGSUxFLCBidWZmZXIsIGFuZCBidWZmZXJsZW5ndGggZmllbGRzLgorCShnZGJfc3Rkb3V0KTogT2YgdHlwZSBHREJfRklMRSwgd2lsbCBwYXNzIHRoaXMgYXJvdW5kIGdkYgorCXJhdGhlciB0aGFuIHN0ZG91dC4KKwkoZ2RiX3N0ZGVycik6IE9mIHR5cGUgR0RCX0ZJTEUsIHdpbGwgcGFzcyB0aGlzIGFyb3VuZCBnZGIKKwlyYXRoZXIgdGhhbiBzdGRlcnIuCisJKGZwdXRzX3VuZmlsdGVyZWRfaG9vayk6IENoYW5nZSBzdHJlYW0gcGFyYW1ldGVyIGZyb20gRklMRSB0bworCUdEQl9GSUxFCisJKGZsdXNoX2hvb2spOiBDaGFuZ2Ugc3RyZWFtIHBhcmFtZXRlciBmcm9tIEZJTEUgdG8gR0RCX0ZJTEUKKwkoZ2RiX2ZjbG9zZSk6IEZpeCBkZWNsYXJhdGlvbiBmb3IgZ2RiX2ZjbG9zZTsgcGFyYW1ldGVyIGlzIG5vdyBvZiAKKwl0eXBlIEdEQl9GSUxFICoqCisJKGdkYl9maWxlX2FkanVzdF9zdHJidWYpOiBOZXcgZnVuY3Rpb24gZGVjbGFyYXRpb24uIGZ1bmN0aW9uIGxpdmVzIGluCisJdXRpbHMuYy4KKwkoZ2RiX2ZpbGVfaW5pdF9hc3RyaW5nKTogTmV3IGZ1bmN0aW9uIGRlY2xhcmF0aW9uLiBmdW5jdGlvbiBsaXZlcworCWluIHV0aWxzLmMKKwkoZ2RiX2ZpbGVfZ2V0X3N0cmJ1Zik6IE5ldyBmdW5jdGlvbiBkZWNsYXJhdGlvbi4gZnVuY3Rpb24gbGl2ZXMKKwlpbiB1dGlscy5jCisJCisJKiBkZWZzLmg6IEFkZGl0aW9uYWwgaW5jbHVkZSBmaWxlcyBpbmNsdWRlZCB3aGVuIFRVSSBpcyBkZWZpbmVkLgorCisJKiBkZWZzLmg6IEZ1bmN0IGRlY2wgc291cmNlX2Z1bGxfcGF0aF9vZi4KKworCSogZGVtYW5nbGUuYzogQWRkIEhQX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HLgorCisJKiBkZW1hbmdsZS5jOiBBZGRlZCBuZXcgZGVtYW5nbGluZyBzdHlsZSwgRURHX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HLAorCSAgdG8gdGhlIGRlbWFuZ2xlcnMgc3RydWN0dXJlLiBUaGlzIGlzIGZvciBzdXBwb3J0IG9mIAorCSAgS3VjayAmIEFzc29jLidzIGNoYW5nZXMgZm9yIGRlbWFuZ2xpbmcuCisKKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwX3N0YW5kYXJkKTogQysrIG1lbWJlciBmdW5jdGlvbiBjaGFuZ2VzLgorCisJKiBldmFsLmMgKGV2YWx1YXRlX3N1YmV4cF9zdGFuZGFyZCk6IFZlcmlmeSBUWVBFX1RBUkdFVF9UWVBFIGlzCisJbm9uIE5VTEwgYmVmb3JlIGRlcmVmZXJlbmNpbmcgaXQuCisKKwkqIGV2YWwuYyAoZXZhbHVhdGVfc3ViZXhwX3N0YW5kYXJkKTogV2l0aCBIUC9hQ0MgY29tcGlsZXIgaXQgaXMgbm90IHBvc3NpYmxlCisJdG8gcGVyZm9ybSBpbmZlcmlvciBjYWxscyB2aWEgZnVuY3Rpb24gcG9pbnRlcnMuCisJUmVzb2x2ZSBjYWxscyB0byBvdmVybG9hZGVkIGZ1bmN0aW9ucyB1c2luZyBmaW5kX292ZXJsb2FkX21hdGNoLgorCVdlIGNhbm5vdCBoYW5kbGUgSFAvYUNDIHBvaW50ZXJzIHRvIG1lbWJlciBmdW5jdGlvbnMuCisJRGVhbCB3aXRoIEhQL2FDQyBwb2ludGVycyB0byBtZW1iZXJzIGluIHZhcmlvdXMga2luZCBvZiBleHByZXNzaW9ucy4KKworCSogZi1sYW5nLmMgKGZfcHJpbnRjaGFyKTogQ2hhbmdlIEZJTEUgdG8gR0RCX0ZJTEUuCisJKGZfcHJpbnRzdHIpOiBEaXR0by4KKwkoZW1pdF9jaGFyKTogRGl0dG8uCisKKwkqIGYtbGFuZy5jIChmX3ByaW50c3RyKTogQ2hhbmdlIHN0ZG91dCB0byBnZGJfc3Rkb3V0LgorCQorCSogZi10eXBlcHJpbnQuYyAoZl9wcmludF90eXBlKTogQ2hhbmdlIEZJTEUgdG8gR0RCX0ZJTEUuCisJKGZfdHlwZV9wcmludF92YXJzcGVjX3ByZWZpeCk6IERpdHRvLgorCShmX3R5cGVfcHJpbnRfYXJncyk6IERpdHRvLgorCShmX3R5cGVfcHJpbnRfdmFyc3BlY19zdWZmaXgpOiBEaXR0by4KKwkocHJpbnRfZXF1aXZhbGVudF9mNzdfZmxvYXRfdHlwZSk6IERpdHRvLgorCShmX3R5cGVfcHJpbnRfYmFzZSk6IERpdHRvLgorCisJKiBmaW5kdmFyLmMgKCk6IEhwIHNuYXBzaG90IDMgY2hhbmdlcy4gIChleHRyYWN0X2FkZHJlc3MpOiBDb2VyY2UKKwlyZXR1cm4gdmFsdWUgZnJvbSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgdG8gQ09SRV9BRERSLgorCShzdG9yZV9hZGRyZXNzKTogQ2hhbmdlIHZhbCBmcm9tIENPUkVfQUREUiB0byBMT05HRVNUOyBjaGFuZ2VzIHRvCisJc3VwcG9ydCBtYWNoaW5lcyB3aGVyZSBDT1JFX0FERFIgYW5kIExPTkdFU1QgYXJlIGRpZmZlcmVudCBzaXplcy4KKwkoZ2V0X3NhdmVkX3JlZ2lzdGVyKTogQ29lcmNlIGFyZyB0byBzdG9yZV9hZGRyZXNzIHRvIExPTkdFU1QuCisJKHJlYWRfcmVsYXRpdmVfcmVnaXN0ZXJfcmF3X2J5dGVzKTogQ2FzdCBsYXN0IGFyZyB0bworCXN0b3JlX2FkZHJlc3MgdG8gTE9OR0VTVC4gIChyZWFkX3JlZ2lzdGVyKTogQ2FzdCByZXR1cm4gZnJvbQorCWV4dHJhY3RfYWRkcmVzcyB0byBhIENPUkVfQUREUi4gICh3cml0ZV9yZWdpc3Rlcl9waWQpOiBDaGFuZ2UgdmFsCisJZnJvbSBMT05HRVNUIHRvIENPUkVfQUREUi4gIChyZWFkX3BjX3BpZCk6IFNhdmUgYW5kIHJlc3RvcmUKKwlpbmZlcmlvcl9waWQgaWYgbmVjZXNzYXJ5LiAgKHdyaXRlX3BjX3BpZCk6IERpdHRvLgorCShyZWFkX3Zhcl92YWx1ZSk6IENhc3QgYXJnIHRvIHN0b3JlX2FkZHJlc3MuCisKKwkqIGZpbmR2YXIuYyAocmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXNfZm9yX2ZyYW1lKTogTmV3CisJZnVuY3Rpb24uCisJKHJlYWRfcmVsYXRpdmVfcmVnaXN0ZXJfcmF3X2J5dGVzKTogQ2FsbCBpdC4KKworCSogZmluZHZhci5jIChzeW1ib2xfcmVhZF9uZWVkc19mcmFtZSk6IEhhbmRsZSBMT0NfVEhSRUFEX0xPQ0FMX1NUQVRJQyBhbmQKKwlMT0NfSU5ESVJFQ1QuCisKKwkqIGZvcmstY2hpbGQuYyAoZm9ya19pbmZlcmlvcik6IENoZW5nZSBmaWZ0aCBwYXJhbWV0ZXIgdG8gYmUgYQorCWZ1bmN0aW9uIHJldHVybmluZyB2b2lkLgorCisJKiBmb3JrLWNoaWxkLmMgKGZvcmtfaW5mZXJpb3IpOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlIGYuCisJCisJKiBmb3JrLWNoaWxkLmM6IAorCShTdGFydHVwX1dJVEhfU0hFTEwpOiBOZXcgbWFjcm8gLS0gaW50ZXJpbSBmaXggZm9yIGEgYnVnCisJKGJyZWFrdXBfYXJncyk6IE5ldyBmdW5jdGlvbiAtLSBicmVha3MgdXAgYW4gYXJndW1lbnQgc3RyaW5nIGludG8KKwkgIGFuIGFyZ3VtZW50IHN1aXRhYmxlIGZvciBwYXNzaW5nIGludG8gZXhlY3ZwKCkuCisJKGZvcmtfaW5mZXJpb3IpOiBIYW5kbGluZyBwcm9ibGVtcyB3aXRoIHN0YXJ0aW5nIHVwIGdkYiB3aXRoIGEgc2hlbGwuCisJICAtLSBhZ2FpbiwgdGhpcyBhcHBlYXJzIHRvIGJlIGFuIGludGVyaW0gZml4LgorCisJKiBmb3JrLWNoaWxkLmM6IAorCShmb3JrX2luZmVyaW9yKTogQWRkZWQgYSBjb21tZW50CisJKGNsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IpOiBOZXcgZnVuY3Rpb24uIAorCShzdGFydHVwX2luZmVyaW9yKTogTWlub3IgZm9ybWF0dGluZyBjaGFuZ2VzLgorCQorCSogZm9yay1jaGlsZC5jOiAKKwkoZm9ya19pbmZlcmlvcik6IEhwIGNoYW5nZSBpcyBwcm9ibGVtYXRpYy4gVGhlIC1mIG9wdGlvbiBoYXMgCisJZGlmZmVyZW50IG1lYW5pbmdzIGZvciBkaWZmZXJlbnQgc2hlbGxzLiBJdCBpcyBwYXJ0aWN1bGFybHkgCisJaW5hcHByb3ByaWF0ZSBmb3IgYm91cm5lIHNoZWxscy4KKworCSogZm9yay1jaGlsZC5jOiAKKwkoZm9ya19pbmZlcmlvcik6IEFkZGVkIG5ldyBwYXJhbWV0ZXIsIHByZV90cmFjZV9mdW4uCisJcHJlX3RyYWNlX2Z1biBpcyBhIGZ1bmN0aW9uIHBvaW50ZXIuIEZvciBzb21lIHRhcmdldHMsCisJbGlrZSBIUFVYLCB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHRvIHByZXBhcmUgZm9yIGZvcmtpbmcKKwlhIGNoaWxkLgorCisJKiBmb3JrLWNoaWxkLmM6IAorCShmb3JrX2luZmVyaW9yKTogRml4ZWQgY2FsbCB0byBpbml0X3RyYWNlX2Z1bgorCisJKiBmb3JrLWNoaWxkLmM6IAorCU1vdmVkIGRlZmluaXRpb24gb2YgU1RBUlRVUF9XSVRIX1NIRUxMIHRvIGluZmVyaW9yLmgKKwlBZGRlZCBhIERFQlVHR0lORyBtYWNyby4gQ3VycmVudGx5IHNldCB0byAwLiBNYXkgcmVtb3ZlCisJbGF0ZXIuCisJYnJlYWt1cF9hcmdzOiBBZGQgREVCVUdHSU5HIGlmZGVmcy4gbW9yZSBzb3BoaXN0aWNhdGVkIAorCXBhcnNpbmcgdG8gYnJlYWsgdXAgYXJncy4KKwkoZm9ya19pbmZlcmlvcik6IFJlbmFtZSBrc2hlbGwgdmFyaWFibGUgdG8gc2hlbGwuIG5ldyBsb2NhbAorCXZhcmlhYmxlLCB0cnluYW1lLiBNYWtlIHVzZSBvZiBTVEFSVFVQX1dJVEhfU0hFTEwgbWFjcm8uIAorCU1vcmUgZXJyb3IgcHJvY2Vzc2luZyBpZiBzdGFydGluZyB1cCB3aXRoIGEgc2hlbGwuCisJKHN0YXJ0dXBfaW5mZXJpb3IpOiBEaXN0aW5ndWlzaCBiZXR3ZWVuIHN0YXJ0aW5nIHVwIHdpdGggYSBzaGVsbCAKKwlhbmQgbm90IGRvaW5nIHNvLiAKKworCSogZ2RidGhyZWFkLmg6IAorCURlY2xhcmF0aW9ucyBmb3IgbG9hZF9pbmZydW5fc3RhdGUgYW5kIHNhdmVfaW5mcnVuX3N0YXRlIHRha2UKKwlhbiBhZGRpdGlvbmFsIHBhcmFtZXRlci4KKworCSogZ2RidGhyZWFkLmg6IE5vdGUgdGhhdCBzb21ldGltZSBiZXR3ZWVuIGdkYiA0LjE2IGFuZCA0LjE3LAorCSAgICB0aHJlYWQuaCB3YXMgcmVuYW1lZCBnZGJ0aHJlYWQuaAorCSAgKGxvYWRfaW5mcnVuX3N0YXRlKTogQWRkaXRpb25hbCBwYXJhbWV0ZXJzCisJICAoc3RvcmVfaW5mcnVuX3N0YXRlKTogQWRkaXRpb25hbCBwYXJhbWV0ZXJzCisJCisJKiBnZGJ0aHJlYWQuaDogSW5jbHVkZSBicmVha3BvaW50LmgKKwkKKwkqIGhwLXBzeW10YWItcmVhZC5jIChRVUlDS19MT09LX1VQKTogUmVkZWZpbmUgdG8gYmUgMC4KKwkoaHByZWFkX2J1aWxkX3BzeW10YWJzKTogRGVhbCB3aXRoIGVudW1zLgorCShocHJlYWRfc3RhcnRfcHN5bXRhYik6IEluY2x1ZGUgc2VjdGlvbiBvZmZzZXQuCisJKGhwcmVhZF9lbmRfcHN5bXRhYik6IFRha2UgY2FyZSBvZiBvZmZzZXQuCisJCisJKiBocC1wc3ltdGFiLXJlYWQuYyAoVFJVRSk6IERlZmluZS4KKwkoRkFMU0UpOiBEZWZpbmUuCisJKGZpbGVfZXhpc3RzKTogTmV3IGZ1bmN0aW9uLiBDaGVja3MgZm9yIGV4aXN0YW5jZSBvZiBmaWxlLgorCShocHJlYWRfcHhkYl9uZWVkZWQpOiBSZXdyaXRlLgorCShocHJlYWRfcXVpY2tfdHJhdmVyc2UpOiBVc2UgY29ycmVjdCBkZW1hbmdsaW5nIHN0eWxlLgorCUhhbmRsZSBGNzcgY2FzZS4KKwkoaHByZWFkX2dldF9oZWFkZXIpOiBSZXdyaXRlLgorCShocHJlYWRfZ2V0X3RleHRsb3cpOiBBZGQgc3VwcG9ydCBmb3IgRE9DX0ZVTkNUSU9OLgorCShocHJlYWRfYnVpbGRfcHN5bXRhYnMpOiBNYWtlIHN1cmUgd2UgZG8gdGhlIHJpZ2h0IHRoaW5nCisJZm9yIHB4ZGIgYW5kIEY3Ny4KKworCSogaHAtcHN5bXRhYi1yZWFkLmMgKGhwcmVhZF9weGRiX2NoZWNrKTogQ2hhbmdlIHBhcmVudGhlc2lzIHBvc2l0aW9ucy4KKworCSogaHAtcHN5bXRhYi1yZWFkLmMgKGhwcmVhZF9xdWlja190cmF2ZXJzZSk6IENvbXBhcmUgQ09SRV9BRERSCisJdmFyaWFibGUgZW5kX2FkZHIgdG8gMCBpbnN0YWVkIG9mIE5VTEwgdG8gZ2V0IHJpZiBvZiBnY2Mgd2FybmluZy4KKworCSogaHAtcHN5bXRhYi1yZWFkLmM6IAorCShIcHJlYWRfZ2V0X3RleHRsb3cpOiBBZGRlZCBwYXJhbSB0byBmdW5jdGlvbiAKKwlEZWZpbmVkIGNvbnZlbm5pZW5jZSBtYWNyb3MgYW5kIHNvbWUgZGF0YXR5cGVzIGFuZCB2YXJpYWJsZXMgZm9yIAorCXByb2Nlc3NpbmcgdGhlIHF1aWNrIGxvb2t1cC10YWJsZXMuIExvb2tzIGxpa2UgdGhlIGNvZGUgZXhpc3RlZAorCWJlZm9yZSwgYnV0IGhhcyBiZWVuIG11bmdlZC4KKwkoaHByZWFkX3B4ZGJfbmVlZGVkKTogTWFqb3IgcmVhcnJhbmdlbWVudHMgb2YgY29kZS4gQWRkaXRpb25hbCBsb2NhbAorCXZhcmlhYmxlcy4gQWxzbywgbW9yZSBleHRlbnNpdmUgY2hlY2tpbmcgZm9yIHZhcmlvdXMgc2NlbmFyaW9zOgorCWRlYnVnIGluZm8gZm9yIG9wdGltaXplZCBjb2RlIHZzLiB1bm9wdGltaXplZCBjb2RlLCBweGRiIGhhcyBiZWVuCisgCXJ1biB2cy4gcHhkYiBoYXMgbm90IGJlZW4gcnVuLgorCShWQUxJRF9GSUxFKTogTmV3IG1hY3JvCisJKFZBTElEX01PRFVMRSk6IE5ldyBtYWNybworCShWQUxJRF9QUk9DKTogTmV3IG1hY3JvCisJKFZBTElEX0NMQVNTKTogTmV3IG1hY3JvCisJKEZJTEVfU1RBUlQpOiBOZXcgbWFjcm8KKwkoTU9EVUxFX1NUQVJUKTogTmV3IG1hY3JvCisJKFBST0NfU1RBUlQpOiBOZXcgbWFjcm8KKwkoRklMRV9FTkQpOiBOZXcgbWFjcm8KKwkoTU9EVUxFX0VORCk6IE5ldyBtYWNybworCShQUk9DX0VORCk6IE5ldyBtYWNybworCShGSUxFX0lTWU0pOiBOZXcgbWFjcm8KKwkoTU9EVUxFX0lTWU0pOiBOZXcgbWFjcm8KKwkoUFJPQ19JU1lNKTogTmV3IG1hY3JvCisJKFZBTElEX0NVUlJfRklMRSk6IE5ldyBtYWNybworCShWQUxJRF9DVVJSX01PRFVMRSk6IE5ldyBtYWNybworCShWQUxJRF9DVVJSX1BST0MpOiBOZXcgbWFjcm8KKwkoVkFMSURfQ1VSUl9DTEFTUyk6IE5ldyBtYWNybworCShDVVJSX0ZJTEVfU1RBUlQpOiBOZXcgbWFjcm8KKwkoQ1VSUl9NT0RVTEVfU1RBUlQpOiBOZXcgbWFjcm8KKwkoQ1VSUl9QUk9DX0VORCk6IE5ldyBtYWNybworCShDVVJSX0ZJTEVfSVNZTSk6IE5ldyBtYWNybworCShDVVJSX01PRFVMRV9JU1lNKTogTmV3IG1hY3JvCisJKENVUlJfUFJPQ19JU1lNKTogTmV3IG1hY3JvCisJKFRFTExfT0JKRklMRSk6IE5ldyBtYWNybworCShwc3Rfc3ltc19zdHJ1Y3QpOiBOZXcgdHlwZWRlZiB0byBrZWVwIHRyYWNrIG9mIHRoZSBzdGFydC9lbmQgc3ltYm9sCisJdGFibGUgKExOVFQpIGluZGljZXMgb2YgcHN5bXRhYnMgY3JlYXRlZCBzbyBmYXIuCisJKHBzdF9zeW1zX2NvdW50KTogTmV3IHZhcmlhYmxlCisJKHBzdF9zeW1zX3NpemUpOiBOZXcgdmFyaWFibGUKKwkodG9sZF9vYmpmaWxlKTogTmV3IHZhcmlhYmxlIAorCShpbml0X3BzdF9zeW1zKTogTmV3IGZ1bmN0aW9uLiBzZXRzIHVwIHBzeW10YWIgc3ltYm9sIGluZGV4IHN0dWZmLgorCShjbGVhcl9wc3Rfc3ltcyk6IE5ldyBmdW5jdGlvbi4gY2xlYW4gdXAgcHN5bXRhYiBzeW1ib2wgaW5kZXggc3R1ZmYuCisJKHJlY29yZF9wc3Rfc3ltcyk6IE5ldyBmdW5jdGlvbi4gYWRkIGluZm8gYWJvdXQgbmV3ZXN0IHBzeW10YWIgdG8gc3ltYm9sIAorCWluZGV4IHRhYmxlLgorCShmaW5kX25leHRfcHN0X3N0YXJ0KTogTmV3IGZ1bmN0aW9uLiBGaW5kIGEgc3VpdGFibGUgc3ltYm9sIHRhYmxlIGluZGV4LgorCShmaW5kX25leHRfZmlsZV9pc3ltKTogTmV3IGZ1bmN0aW9uCisJKGZpbmRfbmV4dF9wcm9jX2lzeW0pOiBOZXcgZnVuY3Rpb24KKwkoZmluZF9uZXh0X21vZHVsZV9pc3ltKTogTmV3IGZ1bmN0aW9uCisJKHNjYW5fcHJvY3MpOiBOZXcgZnVuY3Rpb24uIFNjYW4gYW5kIHJlY29yZCBwYXJ0aWFsIHN5bWJvbHMgZm9yIGFsbCAKKwlmdW5jdGlvbnMgc3RhcnRpbmcgZnJvbSBzcGVjaWZpZWQgaW5kZXggYW5kIGluIGEgc3BlY2lmaWVkIGNvZGUgcmFuZ2UuCisJKGhwcmVhZF9xdWlja190cmF2ZXJzZTogTWFqb3IgcmVhcnJhbmdlbWVudCBvZiBjb2RlLiBUaGUgZnVuY3Rpb24KKwlub3cgdXNlcyBhbGwgdGhlIG5pZnR5IG1hY3Jvcy4gVGhlcmUgYXJlIHNvbWUgbmV3IGxvY2FsIHZhcmlhYmxlcy4KKwlDaGVjayBmb3IgRURHX0RFTUFOR0xJTkcgc3R5bGUuIGlmZGVmIG91dCBzb21lIGNvZGUgZm9yIGhhbmRsaW5nIEY3Ny4KKwlQcmV2aW91c2x5LCB0aGUgZnVuY3Rpb24gbG9vcGVkIG92ZXIgYWxsIHRoZSBtb2R1bGVzIGluIHRoZSB0YWJsZS4KKwlOb3csIHRoZSBmdW5jdGlvbiBsb29wcyBvdmVyIGFsbCB0aGUgZmlsZXMsIG1vZHVsZXMsIGFuZCBwcm9jZWR1cmVzLgorCVdpdGggSFAgYUNDIGFuZCBDVFRJLCBpdCBpcyBwb3NzaWJsZSBmb3IgYSBjb21waWxlZCBvYmplY3QgdG8gaGF2ZSBhIAorCWZpbGUgYW5kIG5vIG1vZHVsZS4KKwkoaHByZWFkX2J1aWxkX3BzeW10YWJzKTogQWRkZWQgYSBzZWN0aW9uIG9mIGNvZGUgaWZkZWZlZCBieSAKKwlRVUlDS19MT09LX1VQLiBJdCBjaGVjayB0byBzZWUgd2hldGhlciBvciBub3QgdGhlcmUgYXJlIGFueSBnbG9iYWxzIAorCWluIHRoZSBleGVjdXRhYmxlLiBGaXggbnVtYmVyIG9mIHBhcmFtcyB0byBocHJlYWRfc3RhcnRfcHN5bXRhYiBjYWxsLgorCVNvbWUgY2hhbmdlcyB0byB0aGUgd2F5IEROVFRfVFlQRV9NT0RVTEUgaXMgaGFuZGxlZC4KKwkoaHByZWFkX2dldF90ZXh0bG93KTogQ2hhbmdlIGluIHNpZ25hdHVyZSwgbWlub3IgY29kZSBjaGFuZ2VzLiBUaGUgCisJZnVuY3Rpb24gZmluZHMgdGhlIGxvdyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmllZCBzeW1ib2wuCisJSW4gbG9va2luZyBmb3IgdGhlIGFkZHJlc3MgZm9yIHRoZSBzeW1ib2wgYXZvaWQgZ29pbmcgb2YgdGhlIGVuZCBvZgorCXRoZSBMTlRUIGZpbGUuCisKKwkqIGhwLXBzeW10YWItcmVhZC5jOiBDaGFuZ2UgVFJVRSB0byAxIGFuZCBGQUxTRSB0byAwLiBEbyBzb21lCisgCXJlZm9ybWF0dGluZy4KKworCSogaHAtcHN5bXRhYi1yZWFkLmM6IEluY2x1ZGUgZGVtYW5nbGUuaAorCSh0cmFuc19sYW5nKTogTmV3IGZ1bmN0aW9uIHRvIGxldCBnZGIga25vdyB0aGUgY29ycmVjdCBsYW5ndWFnZS4KKwkoaHByZWFkX3F1aWNrX3RyYXZlcnNlKTogVXNlIEFSTSBzdHlsZSBkZW1hbmdsaW5nLgorCURlbWFuZ2xlIHByb2NlZHVyZXMgbmFtZXMuIAorCVVzZSBnZGIgbGFuZ3VhZ2UgbmFtZXMgaW5zdGVhZCBvZiBocCBsYW5ndWFnZSBuYW1lcy4KKwlBZGQgc3ltYm9sIHRvIGxpc3QgdXNpbmcgaXRzIGRlbWFuZ2xlZCBuYW1lLgorCisJKiBocC1wc3ltdGFiLXJlYWQuYzogTmV3IGZpbGUuCisJKGhwcmVhZF9jYWxsX3B4ZGIpOiBOZXcgZnVuY3Rpb24uIENhbGwgUFhEQiB0byBwcm9jZXNzIG91ciBmaWxlLgorCShocHJlYWRfcHhkYl9jaGVjayk6IE5ldyBmdW5jdGlvbi4gUmV0dXJuIFRSVUUgaWYgdGhlIGZpbGUgbmVlZHMgCisJcHJlLXByb2Nlc3NpbmcgYnkgUFhEQiBhbmQgd2UgaGF2ZSB0aHVzIGNhbGxlZCBQWERCIHRvIGRvIHRoaXMgCisJcHJvY2Vzc2luZyBhbmQgdGhlIGZpbGUgbmVlZHMgdG8gYmUgcmUtbG9hZGVkLgorCShocHJlYWRfcXVpY2tfdHJhdmVyc2UpOiBOZXcgZnVuY3Rpb24uIFRyYXZlcnNlIHRoZSBxdWljayBsb29rLXVwIAorCXRhYmxlcywgYnVpbGRpbmcgYSBzZXQgb2YgcHN5bXRhYnMuCisJKGhwcmVhZF9nZXRfaGVhZGVyKTogTmV3IGZ1bmN0aW9uLiBHZXQgYXBwcm9wcmlhdGUgaGVhZGVyIGZyb20gb2JqCisJZmlsZSwgYmFzZWQgb24gcHhkYiB0eXBlCisJKGhwcmVhZF9zeW1maWxlX2luaXQpOiBObyBjaGFuZ2UgZnJvbSBocHJlYWQuYworCShocHJlYWRfYnVpbGRfcHN5bXRhYnMpOiBJZiB0aGVyZSBhcmUgcXVpY2sgbG9va3VwIHRhYmxlcywgcmVhZCB0aG9zZSwKKyAJdGhlbiBzY2FuIHRoZSBnbG9iYWwgc2VjdGlvbiBMTlRULiBPdGhlcndpc2UsIGp1c3Qgc2NhbiB0aGUgd2hvbGUgTE5UVC4KKwlDaGFuZ2VkOiBBZGQgYSBnbG9iYWwgZnVuY3Rpb24gZW50cnkgdG8gdGhlIGdsb2JhbCBwYXJ0aWFsIHN5bWJvbCBsaXN0LgorCUhhbmRsZSBlbmQgb2Ygc3ltYm9scywgZm9yIFFMVCBjYXNlLgorCUluIGNhc2Ugb2YgVEFHREVGLCBpZiBpdCBpcyBhIGNsYXNzIG9yIGEgdGVtcGxhdGUsIGFkZCB0aGUgbmFtZSB0byB0aGUKKwl2YXJfbmFtZXNwYWNlLCBzbyB0aGF0IGl0IGlzIGtub3duIGFzIGEgdHlwZSBieSBnZGIuCisJSW4gY2FzZSBvZiBDT05TVEFOVCwgYW5kIGl0IGlzIGdsb2JhbCwgYWRkIGl0IHRvIHRoZSBnbG9iYWxzLgorCShocHJlYWRfc3ltZmlsZV9maW5pc2gpOiBObyBjaGFuZ2UgZnJvbSBocHJlYWQuYworCShocHJlYWRfZ2V0X2xudHQpOiBNYWtlIGl0IG5vdCBzdGF0aWMKKwkoaHByZWFkX2dldF9nbnR0KTogTm8gY2hhbmdlIGZyb20gaHByZWFkLmMKKwkoaHByZWFkX2dldF9zbHQpOiBNYWtlIGl0IG5vdCBzdGF0aWMKKwkoaHByZWFkX2dldF90ZXh0bG93KTogTm8gY2hhbmdlIGZyb20gaHByZWFkLmMKKwkoaHByZWFkX3N0YXJ0X3BzeW10YWIpOiBObyBjaGFuZ2UgZnJvbSBocHJlYWQuYworCShocHJlYWRfZW5kX3BzeW10YWIpOiBObyBjaGFuZ2UgZnJvbSBocHJlYWQuYworCisJKiBocC1zeW10YWItcmVhZC5jIChocHJlYWRfZ2V0X3Njb3BlX3N0YXJ0KTogUmVuYW1lZC4gSXQgd2FzCisJaHByZWFkX2dldF9kZXB0aC4KKwkoaHByZWFkX3R5cGVfdHJhbnNsYXRlKTogRGlzdGluZ3Vpc2ggYmV0d2VlbiBzaWduZWQgYW5kIHVuc2lnbmVkIGNoYXIKKwl0eXBlcy4KKwkoaHByZWFkX3BzeW10YWJfdG9fc3ltdGFiKTogU2V0IGZsYWcgZm9yIGhwIGNvbXBpbGF0aW9uLgorCShocHJlYWRfcmVhZF9mdW5jdGlvbl90eXBlKTogQXBwZW5kIHN5bWJvbHMgZm9yIHBhcmFtZXRlcnMgdG8gbG9jYWwgCisJbGlzdCBhcyB3ZWxsIGFzCXRvIHRoZSBnbG9iYWwgbGlzdC4gR2V0IHRoZSBwYXJhbWV0ZXJzIHR5cGVzIGZyb20gdGhlCisJbG9jYWwgbGlzdCBpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgbGlzdC4KKwkoaHByZWFkX3JlYWRfc3RydWN0X3R5cGUpOiBBZGQgbmV3IGZpZWxkIG51bV9mbl9maWVsZHMgdG8gbmV4dF9mbl9maWVsZAorCXN0cnVjdHVyZS4gUmV3cml0ZSBoYW5kbGluZyBvZiB0ZW1wbGF0ZXMKKwkoaHByZWFkX3R5cGVfbG9va3VwKTogQ2hhbmdlIGhhbmRsaW5nIG9mIGRudHRfdHlwZV9tb2RpZmllci4KKwkoaHByZWFkX3Byb2Nlc3Nfb25lX2RlYnVnX3N5bWJvbCk6IENhbGwgaHByZWFkX2dldF9zY29wZV9zdGFydCBpbnN0ZWEKKwlvZiBocHJlYWRfZ2V0X2RlcHRoLiBIYW5kbGUgZW51bSBhcyB3ZWxsLgorCShocHJlYWRfZ2V0X3Njb3BlX2RlcHRoKTogTmV3IGZ1bmN0aW9uLiBHZXQgbmVzdGluZyBkZXB0aCBmb3IgYSAKKwlETlRUIGVudHJ5LgorCisJKiBocC1zeW10YWItcmVhZC5jIChocHJlYWRfcHN5bXRhYl90b19zeW10YWIpOiBTZXQgCisJcHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24gdG8gMC4KKwkKKwkqIGhwLXN5bXRhYi1yZWFkLmMgKGhwcmVhZF9wc3ltdGFiX3RvX3N5bXRhYl8xKTogQ2hhbmdlIHN0ZG91dCB0bworIAlnZGJfc3Rkb3V0OyBjaGFuZ2UgZmZsdXNoIHRvIGdkYl9mbHVzaC4KKwkoaHByZWFkX3BzeW10YWJfdG9fc3ltdGFiKTogQ2hhbmdlIGZmbHVzaCB0byBnZGJfZmx1c2guCisKKwkqIGhwLXN5bXRhYi1yZWFkLmMgKGhwcmVhZF9yZWFkX2VudW1fdHlwZSk6IERlY2xhcmUgdmFyaWFibGUuCisJKGhwcmVhZF9yZWFkX3N0cnVjdF90eXBlKTogRWxpbWluYXRlIHJlZmVyZW5jZXMgCisJdG8gJ2FyZ3MnIG1lbWJlciBvZiBmbl9maWVsZC4KKworCSogaHAtc3ltdGFiLXJlYWQuYyAoaHByZWFkX3JlYWRfc3RydWN0X3R5cGUpOiBBIHN0YXRpYyBtZW1iZXIKKwlpcyBub3cgaW5kaWNhdGVkIGJ5IHRoZSBiaXRzaXplIGZpZWxkLCBub3QgdGhlIGJpdHBvcy4KKwlJbml0aWFsaXplIHBoeXNuYW1lIHRvIGVtcHR5LgorCShmaXhfc3RhdGljX21lbWJlcl9waHlzbmFtZXMpOiBVc2UgbmV3IG1hY3JvcyB0byBkZWFsIHdpdGgKKwlwaHlzbmFtZXMuCisKKwkqIGhwLXN5bXRhYi1yZWFkLmMgKGhwcmVhZF9yZWFkX3N0cnVjdF90eXBlKTogQ2hhbmdlIHJlZmVyZW5jZXMKKwl0byBiaXRwb3MgbWVtYmVyIG9mIHN0cnVjdCBmaWVsZCB0byB1c2UgdGhlIEZJRUxEX0JJVFBPUyBtYWNyby4KKworCSogaHAtc3ltdGFiLXJlYWQuYyAoaHByZWFkX3JlYWRfc3RydWN0X3R5cGUpOiBDb21tZW50IG91dCByZWZlcmVuY2UgdG8KKwlvYnNvbGV0ZSBmaWVsZCBmbl9maWVsZC5hcmdzLgorCUFkZCBzdHJ1Y3QgY29tcGxhaW50IGRlZmluaXRpb25zIGZvciBjb21wbGFpbnRzLgorCShocHJlYWRfcmVhZF9zdHJ1Y3RfdHlwZSk6IENoYW5nZSBjYWxsIHRvIGNvbXBsYWluLgorCShocHJlYWRfcmVhZF9hcnJheV90eXBlKTogQ2hhbmdlIGNhbGwgdG8gY29tcGxhaW4uIAorCShocHJlYWRfdHlwZV9sb29rdXApOiBDaGFuZ2UgY2FsbCB0byBjb21wbGFpbi4KKwkoaHByZWFkX3Byb2Nlc3Nfb25lX2RlYnVnX3N5bWJvbCk6IENoYW5nZSBjYWxscyB0byBjb21wbGFpbi4KKwkoaHByZWFkX3R5cGVfdHJhbnNsYXRlKTogQ2hhbmdlIGNhbGxzIHRvIGNvbXBsYWluLgorCQorCSogaHAtc3ltdGFiLXJlYWQuYyAoaHByZWFkX3JlYWRfc3RydWN0X3R5cGUpOiBNYWtlIHN1cmUgYml0dmVjdG9yCisJaGFzIGJlZW4gYWxsb2NhdGVkIGJlZm9yZSBjYWxsaW5nIGhhc192dGFibGUuCisKKwkqIGhwLXN5bXRhYi1yZWFkLmMgKGhwcmVhZF9yZWFkX3N0cnVjdF90eXBlKTogUmV2ZXJ0IGNoYW5nZSwgCisJanVzdCBjaGVjayBmb3IgdnRhYmxlIHdpdGhvdXQgY2hlY2tpbmcgZm9yIGJpdHZlY3RvcnMgdG9vLgorCisJKiBocC1zeW10YWItcmVhZC5jOiAKKwkoSHByZWFkX2V4cGFuZF9zeW10YWIpOiBDaGFuZ2UgbmFtZSBvZiBsb2NhbCB2YXJpYWJsZSBmcm9tCisJYXRfZW5kX29mX21vZHVsZSB0byBhdF9tb2R1bGVfYm91bmRhcnkuIAorCUFsc28sIGlmIGRlbWFuZ2xpbmcgc3R5bGUgaXMgYWxyZWFkeSBFREcsIGRvIG5vdCByZXNldCBpdCAKKwl0byB0aGUgSFAgZGVtYW5nbGluZyBzdHlsZS4KKwlDaGFuZ2UgYXRfZW5kX29mX21vZHVsZSBwYXJhbSB0byBocHJlYWRfcHJvY2Vzc19vbmVfZGVidWdfc3ltYm9sCisJY2FsbCB0byBhdF9tb2R1bGVfYm91bmRhcnkuCisJTm8gbG9uZ2VyIGJyZWFrIG91dCBvZiBsb29wIHdoZW4gcmVhY2ggZW5kIG9mIG1vZHVsZS4gV2l0aCBDVFRJLAorCXRoZSBjb21waWxlciBjYW4gZ2VuZXJhdGUgZnVuY3Rpb24gc3ltYm9scyB3aGljaCBhcmUgbm90IGluIAorCWFueSBtb2R1bGUuIFR5cGljYWxseSB0aGV5IHNob3cgdXAgYWZ0ZXIgdGhlIGVuZCBvZiBvbmUKKwltb2R1bGUgYW5kIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIG5leHQgbW9kdWxlLgorCShocHJlYWRfcmVhZF9zdHJ1Y3RfdHlwZSk6IENoZWNrIHRoYXQgdGhlIGRlYnVnIGluZm8gZm9yIAorCWEgVEVNUExBVEVfQVJHIGlzIGNvcnJlY3QuCisJKGhwcmVhZF9wcm9jZXNzX29uZV9kZWJ1Z19zeW1ib2wpOiBDaGFuZ2UgbmFtZSBvZiBhdF9lbmRfb2ZfbW9kdWxlX3AKKwlwYXJhbSB0byBhdF9tb2R1bGVfYm91bmRhcnlfcC4gCisJQWxzbyBzZXQgKmF0X21vZHVsZV9ib3VuZGFyeV9wID0gLTEgaWYgbWlzc2luZyBhIG1vZHVsZSBlbmQgYW5kIHNldCAKKwlpdCB0byAxIHdoZW4gZmluaXNoZWQgZXhwYW5kaW5nIHRoZSBkZWJ1ZyBpbmZvLgorCUhhbmRsZSBUTFMgdmFyaWFibGUuCisKKwkqIGhwLXN5bXRhYi1yZWFkLmM6IEluY2x1ZGUgZGVmcy5oLCBzeW10YWIuaCwgZ2RidHlwZXMuaCwgY29tcGxhaW50cy5oLgorCShmaXh1cF9jbGFzcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKGZpeHVwX21ldGhvZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCisJKGhwcmVhZF9nZXRfbG9jYXRpb24pOiBSZXdyaXRlLgorCShocHJlYWRfaGFzX25hbWUpOiBBZGQgY2FzZXMgZm9yIEROVFRfVFlQRV9ET0NfRlVOQ1RJT04gYW5kIAorCUROVFRfVFlQRV9ET0NfTUVNRlVOQworCShocHJlYWRfZXhwYW5kX3N5bXRhYik6IFVzZSBIUCBkZW1hbmdsaW5nIHN0eWxlLiAKKwlTZXQgaHBfc29tX3NvbV9vYmplY3RfcHJlc2VudCB0byAxLgorCShocHJlYWRfdHlwZV90cmFuc2xhdGUpOiBFcnJvciBvdXQgaWYgbm90IGltbWVkaWF0ZS4gSXNzdWUgd2FybmluZworCWlmIHRoZXJlIGlzIGFuIHVuaGFuZGxlZCB0eXBlIGNvZGUuCisJKGVycm9yX2luX2hwcmVhZF90eXBlX3RyYW5zbGF0ZV9jb21wbGFpbnQpOiBSZW1vdmUgdGhpcyBzdHJ1Y3R1cmUuCisJKGhwcmVhZF9yZWFkX2VudW1fdHlwZSk6IERvbid0IGFzc3VtZSBzaXplIG9mIGVudW0gaXMgYWx3YXlzIDQgYnl0ZXMuCisJKGhwcmVhZF9yZWFkX2Z1bmN0aW9uX3R5cGUpOiBBZGQgbmV3IHBhcmFtZXRlciB0byBpbmRpY2F0ZSBhIG5ldyBibG9jay4KKwlEbyBub3QgYWRkIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBzeW1ib2wgbGlzdC4KKwlJZiB0aGUgdHlwZSB3YXMgcmVhZCBpbiBlYXJsaWVyLCBkbyBub3QgbW9kaWZ5IHRoZSB0eXBlIHN0cnVjdHVyZS4KKwlJZiB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcgYmxvY2ssIHNldCB0aGUgbG9jYWwgc3ltYm9sIGxpc3QgdG8gYmUgdGhlCisJcGFyYW0gbGlzdC4KKwlOZWVkIHRvIG1hcmsgdGhpcyB0eXBlIGFzIHByZXByb2Nlc3NlZC4KKwkoaHByZWFkX3JlYWRfZG9jX2Z1bmN0aW9uX3R5cGUpOiBOZXcgZnVuY3Rpb24uIFJlYWQgYW5kIGludGVybmFsaXplIAorCWEgbmF0aXZlIERPQyBmdW5jdGlvbiBkZWJ1ZyBzeW1ib2wuCisJKGhwcmVhZF9yZWFkX3N0cnVjdF90eXBlKTogQSBtZXRob2QgY2FuIGJlIG9mIHR5cGUgZG9jX2Z1bmN0aW9uIGFuZAorCWRvY19tZW1mdW5jIHRvby4KKwlIYW5kbGUgY2FzZSBpbiB3aGljaCBhIG1ldGhvZCBpcyByZWFkIGJlZm9yZSBpdHMgY2xhc3MuIERlYWwgd2l0aCAKKwlpbmNvbXBsZXRlIG1ldGhvZCB0eXBlcy4KKwlIYW5kbGUgY2FzZXMgaW4gd2hpY2ggSFAvYUNDIGNvbXBpbGVyIGNyZWF0ZXMgb3BlcmF0b3IgbmFtZXMgdy9vCisJdGhlICdvcGVyYXRvcicga2V5d29yZC4gUmV3cml0ZSB0aGUgbG9vcCBvdmVyIHRoZSBmaWxlZHMuCisJKGZpeF9zdGF0aWNfbWVtYmVyX3BoeXNuYW1lcyk6IE5ldyBmdW5jdGlvbi4gQWRqdXN0IHRoZSBwaHlzbmFtZXMgZm9yIAorCWVhY2ggc3RhdGljIG1lbWJlci4KKwkoZml4dXBfY2xhc3NfbWV0aG9kX3R5cGUpOiBOZXcgZnVuY3Rpb24uIEZpeC11cCB0aGUgdHlwZSBzdHJ1Y3R1cmUgZm9yIGEgCisJY2xhc3MuCisJKGhwcmVhZF9yZWFkX2FycmF5X3R5cGUpOiBDaGFuZ2UgY29tcGxhaW50IHRvIHdhcm5pbmcuCisJKGhwcmVhZF90eXBlX2xvb2t1cCk6IEFkZCBjYXNlIGZvciBETlRUX1RZUEVfRE9DX0ZVTkNUSU9OLgorCUZvciBzdHJ1Y3R1cmVzL2NsYXNzZXMgc2V0IHN0YXRpYyBtZW1iZXIgdG8gcG9pbnQgdG8gc3RyaW5ncyB3aXRoIGZ1bGwKKwluYW1lcy4KKwlDaGFuZ2UgY2FsbHMgdG8gaHByZWFkX3JlYWRfZnVuY3Rpb25fdHlwZSB0byBwYXNzIGV4dHJhIHBhcmFtZXRlci4KKwkoaHByZWFkX3JlY29yZF9saW5lcyk6IEhhbmRsZSBjYXNlIGZvciBTTFRfTk9STUFMX09GRlNFVC4KKwkoY2xhc3Nfb2YpOiBOZXcgZnVuY3Rpb24uIEdpdmVuIGEgZnVuY3Rpb24gImYiIHdoaWNoIGlzIGEgbWVtYmVyIG9mIGEgY2xhc3MsCisgCWZpbmQgdGhlIGNsYXNzbmFtZSB0aGF0IGl0IGlzIGEgbWVtYmVyIG9mLgorCShocHJlYWRfcHJvY2Vzc19vbmVfZGVidWdfc3ltYm9sKTogRGVhbCB3aXRoIHBvc3NpYmxlIGFsaWFzIGZpZWxkIGZyb20gdGhlCisJc29tIHJlY29yZCBmb3IgdGhlIEZ1bmN0aW9uIG9yIEVudHJ5IHR5cGUuCisJRG8gdGhlIGRlbWFuZ2xpbmcgb3Vyc2VsdmVzIGlmIHRoZSBnZGIgZGVtYW5nbGVyIGZhaWxlZC4KKwlBZGQgc3VwcG9ydCBmb3IgRE9DIGZ1bmN0aW9ucy4KKwlGb3IgZnVuY3Rpb24gdHlwZXMsIGFkZCBwYXJhbWV0ZXJzIHRvIGxvY2FsIGxpc3QuCisJKGhwcmVhZF9nZXRfc2NvcGVfZGVwdGgpOiBNYWtlIHRoaXMgZnVuY3Rpb24gYSBuby1vcC4KKwkoaHByZWFkX2FkanVzdF9iaXRvZmZzZXRzKTogTmV3IGZ1bmN0aW9uLiBBZGp1c3QgdGhlIGJpdG9mZnNldHMgZm9yIGFsbCAKKwlmaWVsZHMgb2YgYW4gYW5vbnltb3VzIHVuaW9uLgorCShocHJlYWRfZ2V0X25leHRfc2tpcF9vdmVyX2Fub25fdW5pb25zKTogTmV3IGZ1bmN0aW9uLiBTa2lwIG92ZXIgYW5vbnltb3VzIAorCXVuaW9ucy4KKworCSogaHAtc3ltdGFiLXJlYWQuYzogSW5jbHVkZSBkZW1hbmdsZS5oCisJKGhwcmVhZF9leHBhbmRfc3ltdGFiKTogRW5zdXJlIHdlIGFyZSB1c2luZyBBUk0tc3R5bGUgZGVtYW5nbGluZy4KKwkoaHByZWFkX3Byb2Nlc3Nfb25lX2RlYnVnX3N5bWJvbCk6IFNldCB0aGUgbWFuZ2xlZCBhbmQgZGVtYW5nbGVkIAorCW5hbWVzIGZvciBmdW5jdGlvbnMuCisJUmVjb3JkIHRoZSBjbGFzcyBuYW1lIHRvIGdlbmVyYXRlIHRoZSBkZW1hbmdsZWQgbmFtZXMgb2YgbWVtYmVyIAorCWZ1bmN0aW9ucy4KKworCSogaHAtc3ltdGFiLXJlYWQuYzogTmV3IGZpbGUuCisJKGhwcmVhZF9nZXRfZGVwdGgpOiBObyBjaGFuZ2UgZnJvbSBocHJlYWQuYworCShocHJlYWRfZ2V0X2xpbmUpOiBObyBjaGFuZ2UgZnJvbSBocHJlYWQuYworCShocHJlYWRfZ2V0X2xvY2F0aW9uKTogTm8gY2hhbmdlIGZyb20gaHByZWFkLmMKKwkoaHByZWFkX2hhc19uYW1lKTogTWFrZSBpdCBub3Qgc3RhdGljLiBSZXR1cm4gMSBmb3IgRE5UVF9UWVBFX0JMT0NLREFUQQorCWFuZCBETlRUX1RZUEVfTUVNRlVOQy4gUmV0dXJuIDAgZm9yIENMQVNTX1NDT1BFLCBSRUZFUkVOQ0UsUFRSTUVNLAorIAlQVFJNRU1GVU5DLCBDTEFTUywgR0VORklFTEQsIFZGVU5DLCBNRU1BQ0NFU1MsIElOSEVSSVRBTkNFLCAKKwlGUklFTkRfQ0xBU1MsIEZSSUVORF9GVU5DLCBNT0RJRklFUiwgT0JKRUNUX0lELCBURU1QTEFURSwgVEVNUExBVEVfQVJHLAorIAlGVU5DX1RFTVBMQVRFLCBMSU5LLgorCShocHJlYWRfcHN5bXRhYl90b19zeW10YWJfMSk6IE5vIGNoYW5nZXMgZnJvbSBocHJlYWQuYworCShocHJlYWRfcHN5bXRhYl90b19zeW10YWIpOiBNYWtlIGl0IGEgc3RhdGljIGZ1bmN0aW9uCisJKGhwcmVhZF9leHBhbmRfc3ltdGFiKTogTW9kaWZpZWQKKwkoaHByZWFkX3R5cGVfdHJhbnNsYXRlKTogSWYgbm90IHR5cGVwLmRudHRpLmltbWVkaWF0ZSBkbyBub3QgYWJvcnQsIAorCWJ1dCBjb21wbGFpbiBhbmQgcmV0dXJuLiBTYW1lIGZvciBkZWZhdWx0IGFjdGlvbi4gSGFuZGxlIG1vcmUgSFBfVFlQRXMuCisJKGhwcmVhZF9sb29rdXBfdHlwZSk6IEluaXRpYWxseSBhbGxvY2F0ZSBhIGNvcnJlY3Qtc2l6ZSB0eXBlLXZlY3Rvci4KKwkoaHByZWFkX2FsbG9jX3R5cGUpOiBSZXNldCB0eXBlX2FkZHIgb25seSBpZiBhIHR5cGUgd2FzIGFsbG9jYXRlZC4KKwkoaHByZWFkX3JlYWRfZW51bV90eXBlKTogSWYgdGhpcyBoYXMgYWxyZWFkeSBhIHR5cGUgYXNzb2NpYXRlZCwgcmV0dXJuLgorCShocHJlYWRfcmVhZF9mdW5jdGlvbl90eXBlKTogRG8gZGlmZmVyZW50IHRoaW5ncyBkZXBlbmRpbmcgb24gd2hldGhlciAKKwlmdW5jdGlvbiBpcyBhIE1FTUZVTkMsIGEgVEVNUExBVEUsIGEgRlVOQ1RJT04gc29tIHJlY29yZC4KKwlEbyBub3QgdXNlIHRoZSBMT0NfUkVHUEFSTV9BRERSIHN5bWJvbCBjbGFzcy4KKwkoaHByZWFkX3JlYWRfc3RydWN0X3R5cGUpOiBIYW5kbGUgY2xhc3NlcyBhbmQgdGVtcGxhdGVzIHRvby4gTWFqb3IgCisJcmV3cml0ZS4KKwkoaHByZWFkX2dldF9udGhfdGVtcGxhdGVfYXJnKTogTmV3IGZ1bmN0aW9uLiAKKwkoaHByZWFkX3JlYWRfdGVtcGxfYXJnX3R5cGUpOiBOZXcgZnVuY3Rpb24uCisJKGhwcmVhZF9yZWFkX3NldF90eXBlKTogTm8gY2hhbmdlIGZyb20gaHByZWFkLmMKKwkoaHByZWFkX3JlYWRfYXJyYXlfdHlwZSk6IE1vZGlmaWVkCisJKGhwcmVhZF9yZWFkX3N1YnJhbmdlX3R5cGUpOiBBZGQgaGFuZGxpbmcgb2YgbW9yZSBETlRUIGVudHJpZXMuCisJYWRkZWQgc3VwcG9ydCBmb3IgdGVtcGxhdGVzLCBjbGFzc2VzLCByZWZlcmVuY2VzLCB2aXJ0dWFsIGZ1bmN0aW9ucy4KKwkoaHByZWFkX3R5cGVfbG9va3VwKTogSGFuZGxlIEROTlRfVFlQRV9NT0RVTEUuCisJKGhwcmVhZF9yZWNvcmRfbGluZXMpOiBObyBjaGFuZ2VzIGZyb20gaHByZWFkLmMKKwkoaHByZWFkX3Byb2Nlc3Nfb25lX2RlYnVnX3N5bWJvbCk6IEhhbmRsZSBXSVRILCBDT01NT04sIAorCUNMQVNTX1NDT1BFLiBFeHBhbmQgVEFHREVGIGNhc2UgdG8gaGFuZGxlIGNsYXNzZXMgYW5kIHRlbXBsYXRlcy4KKworCSogaHBwYS10ZGVwLmMgKHBhX2RvX3N0cmNhdF9yZWdpc3RlcnNfaW5mbyk6IEhhcyBhIG5ldyBwYXJhbWV0ZXIsCisgCXByZWNpc2lvbiwgd2hpY2ggaXMgcGFzc2VkIGludG8gdGhlIGNhbGwgdG8gcGFfc3RyY2F0X2ZwX3JlZyB0bworIAlpbmRpY2F0ZSB3aGV0aGVyIHRvIGRpc3BsYXkgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyB1c2luZworIAlzaW5nbGUgb3IgZG91YmxlIHByZWNlaXNpb24uCisJKHBhX3N0cmNhdF9yZWdpc3RlcnMpOiBJbnRyb2R1Y2UgbG9jYWwgdmFyaWFibGUsIHByZWNpc2lvbiwgYW5kIAorCXBhc3MgaXQgaW50byBjYWxsIHRvIHBhX3N0cmNhdF9mcF9yZWcuCisJKHBhX3N0cmNhdF9mcF9yZWcpOiBNb2RpZmllZCBmdW5jdGlvbi4gTmV3IHBhcmFtZXRlciwgcHJlY2lzaW9uLAorCXVzZWQgYnkgZnVuY3Rpb24gdG8gZGVjaWRlIHdoZXRoZXIgdG8gdXNlIHNpbmdsZSBvciBkb3VibGUKKwlwcmVjaXNpb24uIEFsc28gYWRkZWQgdGhlIGNvZGUgdG8gcHV0IGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZQorCWludG8gYSBidWZmZXIuCisKKwkqIGhwcGEtdGRlcC5jOiBBZGQnbCBpbmNsdWRlcyA8bWFjaGluZS9zYXZlX3N0YXRlLmg+LAorIAk8dW5pc3RkLmg+LCBkZWNsYXJlIHBhX3JlZ2lzdGVyX2xvb2tfYXNpZGUsIGRlZmluZSBpc19wYV8yLgorCShycF9zYXZlZCk6IENoZWNrIGZvciB3aGVyZSB0byByZWFkIHRoZSByZXR1cm4gcG9pbnRlciBmcm9tLgorCShwYV9kb19yZWdpc3RlcnNfaW5mbyk6IEhhbmRsZSBpc19wYV8yLiAocGFfcmVnaXN0ZXJfbG9va19hc2lkZSk6CisgCW5ldyBmdW5jdGlvbi4gKHBhX3ByaW50X3JlZ2lzdGVycyk6IEhhbmRsZSBpc19wYV8yLgorICAJKGluX3NvbGliX2NhbGxfdHJhbXBvbGluZSk6IEhhbmRsZSBhIGNvbXBpbGVyL2xpbmtlciBlcnJvci4KKwkoc2tpcF90cmFtcG9saW5lX2NvZGUpOiBDaGFuZ2VzIHRvIHNvbWUgbWFza3MgdXNlZCBpbiBleGFtaW5pbmcKKwlpbnN0cnVjdGlvbnMuICAoaW5zdF9zYXZlc19mcik6IFRlc3QgZm9yIEZTVFdTIGluc3RydWN0aW9uLgorCShza2lwX3Byb2xvZ3VlKTogUmVuYW1lZCB0byBza2lwX3Byb2xvZ3VlX2hhcmRfd2F5LgorCShhZnRlcl9wcm9sb2d1ZSk6IE5ldyBmdW5jdGlvbi4gIChza2lwX3Byb2xvZ3VlKTogTmV3IGZ1bmN0aW9uLgorCisJKiBocHBhLXRkZXAuYyAoYWZ0ZXJfcHJvbG9ndWUpOiBJZiBmIGlzIE5VTEwsIGRvbid0IGRlcmVmZXJlbmNlCisJaXQuCisKKwkqIGhwcGEtdGRlcC5jIChhZnRlcl9wcm9sb2d1ZSk6IElmIG5vIGRlYnVnIGluZm8sIHJldHVybiB6ZXJvCisJdGVsbGluZyBjYWxsZXIgdGhhdCB3ZSBuZWVkIHRvIGZpbmQgdGhlIGVuZCBvZiB0aGUgcHJvbG9ndWUgdmlhCisJdGhlIGhhcmQgd2F5IChpbnN0cnVjdGlvbiBleGFtaW5hdGlvbikuCisKKwkqIGhwcGEtdGRlcC5jIChmaW5kX3Vud2luZF9lbnRyeSk6IEF2b2lkIGRlcmVmZXJlbmNpbmcgYSBudWxsCisJcG9pbnRlci4KKworCSogaHBwYS10ZGVwLmMgKGhwcGFfcGlkX3RvX2V4ZWNfZmlsZSk6IERlbGV0ZWQgLS0gbm8gbG9uZ2VyIHVzZWQuCisKKwkqIGhwcGEtdGRlcC5jIChocHBhX3ByZXBhcmVfdG9fcHJvY2VlZWQpOiBBZGQgcHJvdG90eXBlLgorCShyZWFkX3Vud2luZF9pbmZvKTogUHVyZWNvdiBjb21tZW50cywgYnVnIGZpeGVzLgorCShmaW5kX3Vud2luZF9lbnRyeSk6IFB1cmVjb3YgY29tbWVudHMsIGJ1ZyBmaXhlcy4KKwkoZmluZF9zdHViX3dpdGhfc2hsX2dldCk6IFB1cmVjb3YgY29tbWVudHMuCisJKGZyYW1lX2NoYWluKTogQWRkaXRpb25hbCBwYXJlbnMuCisJKGhwcGFfcHVzaF9hcmd1bWVudHMpOiBDaGFuZ2VzIHRvIGNvbW1lbnRlZCBvdXQgdmVyc2lvbiBvZiByb3V0aW5lLgorCShocHBhX2ZpeF9jYWxsX2R1bW15KTogUHVyZWNvdiBjb21tZW50cywgZml4IGxvY2F0aW9uIG9mIGVuZC5vLgorCShpbl9zb2xpYl9jYWxsX3RyYW1wb2xpbmUpOiBQdXJlY292IGNvbW1lbnRzLgorCShpbl9zb2xpYl9yZXR1cm5fdHJhbXBvbGluZSk6IFB1cmVjb3YgY29tbWVudHMuCisJKHNldHVwX2RfcGlkX2luX2luZmVyaW9yKTogRml4IGxvY2F0aW9uIG9mIGVuZC5vLgorCShpbml0aWFsaXplX2hwX2N4eF9leGNlcHRpb25fc3VwcG9ydCk6IEZpeCBsb2NhdGlvbiBvZiBlbmQuby4KKwkoY2hpbGRfZW5hYmxlX2V4Y2VwdGlvbl9jYWxsYmFjayk6IFB1cmVjb3YgY29tbWVudHMuCisKKwkqIGhwcGEtdGRlcC5jOiAKKwkoUGFfZG9fc3RyY2F0X3JlZ2lzdGVyc19pbmZvKTogTmV3IHJvdXRpbmUuIGNhbGxlZCBieSAKKwl0dWkvdHVpUmVncy5jOl90dWlSZWdpc3RlckZvcm1hdCB0byBwbGFjZSBhIHJlZ2lzdGVyIG5hbWUgCisJYW5kIHZhbHVlIGludG8gYSBzdHJpbmcgYnVmZmVyLiBJbnRlcmZhY2UgbWF5IGNoYW5nZSBpbgorCWZ1dHVyZS4gQ2hlY2tpbmcgdGhpcyBpbiBzbyB0aGF0IHdlIGhhdmUgc29tZXRoaW5nIAorCWZ1bmN0aW9uYWwgZm9yIEhQLgorCShwYV9zdHJjYXRfcmVnaXN0ZXJzKTogTmV3IHJvdXRpbmUsIGNhbGxlZCBieSAKKwlwYV9kb19zdHJjYXRfcmVnaXN0ZXJzX2luZm8uIERvZXMgc2FtZSB0aGluZyBhcyAKKwlwYV9wcmludF9yZWdpc3RlcnMgZXhjZXB0IGl0IHRha2VzIGEgc3RyZWFtIHBhcmFtZXRlci4gCisJVGhpcyByb3V0aW5lIHNob3VsZCBkaXNhcHBlYXIgaW4gZnV0dXJlLiBDaGVja2luZyBpbgorCXNvIHRoYXQgd2UgaGF2ZSBzb21ldGhpbmcgZnVuY3Rpb25hbCB0byBnaXZlIEhQCisJKHBhX3N0cmNhdF9mcF9yZWcpOiBOZXcgcm91dGluZSwgY2FsbGVkIGJ5IAorCXBhX2RvX3N0cmNhdF9yZWdpc3RlcnNfaW5mbyBhbmQgcGFfc3RydmF0X3JlZ2lzdGVycworCXRvIHBsYWNlIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgbmFtZSBhbmQgdmFsdWUgaW50bworCWEgYnVmZmVyLiBUaGlzIGludGVyZmFjZSBtYXkgY2hhbmdlIGluIGZ1dHVyZS4gCisJQ2hlY2tpbmcgaW4gc28gdGhhdCB3ZSBoYXZlIHNvbWV0aGluZyBmdW5jdGlvbmFsIHRvIGdpdmUgSFAuCisKKwkqIGhwcGEtdGRlcC5jOiAoUGFfcHJpbnRfZnBfcmVnKTogQ2hhbmdlIHByb3RvdHlwZSB0byBtYXRjaCBkZWYnbi4KKwkocGFfcmVnaXN0ZXJfbG9va19hc2lkZSk6IEZpeCBjb21tZW50IGltbWVkaWF0ZWx5IGJlZm9yZSBmdW5jdGlvbi4KKworCSogaHBwYS10ZGVwLmM6IENoYW5nZXMgdG8gYmV0dGVyIHN1cHBvcnQgc3RhY2sgdW53aW5kaW5nLCAKKwkgICAgcmVhZGluZyBhbmQgd3JpdGluZyByZWdpc3RlcnMgZm9yIEhQVVguIFRoZSBIUCBmb2xrcyBoYWQKKwkgICAgYW4gYWR2YW50YWdlIC4uLiBhY2Nlc3MgdG8gYSBydW50aW1lIGFyY2hpdGVjdHVyZSBzcGVjIDstfS4KKwkgIE5ldyBpbmNsdWRlczogUHRyYWNlLmgKKwkgIChpbnRlcm5hbGl6ZV91bndpbmRzKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzIGluIHRhYmxlLgorCSAgKHJlYWRfdW53aW5kX2luZm8pOiBFbnRyaWVzIGluIHRoZSB0YWJsZSBhcmUgbm93IG1vcmUgY29tcGxleAorCSAgICBzdHJ1Y3R1cmVzLiBSZWZlcmVuY2VzIG9mIHRoZSBmb3JtIC4uLi0+dGFibGVbaW5kZXhdLnN0dWJfdHlwZQorCSAgICBhcmUgbm93IC4uLi0+dGFibGVbaW5kZXhdLnN0dWJfdW53aW5kLnN0dWJfdHlwZS4KKwkgIChmaW5kX3Byb2NfZnJhbWVzaXplKTogQWRkZWQgYSBjaGVjayBmb3IgcGMgPT0gMC4KKwkgIChycF9zYXZlZCk6IEVudHJpZXMgaW4gdGhlIHRhYmxlIGFyZSBub3cgbW9yZSBjb21wbGV4CisJICAgIHN0cnVjdHVyZXMuIFJlZmVyZW5jZXMgb2YgdGhlIGZvcm0gLi4uLT50YWJsZVtpbmRleF0uc3R1Yl90eXBlCisJICAgIGFyZSBub3cgLi4uLT50YWJsZVtpbmRleF0uc3R1Yl91bndpbmQuc3R1Yl90eXBlLgorCSAgKGZyYW1lbGVzc19mdW5jdGlvbl9pbnZvY2F0aW9uKTogU3R1Yl90eXBlIGJlY29tZXMKKyAJICAgIHN0dWJfdW53aW5kLnN0dWJfdHlwZQorCSAgKHNhdmVkX3BjX2FmdGVyX2NhbGwpOiBTdHViX3R5cGUgYmVjb21lcyBzdHViX3Vud2luZC5zdHViX3R5cGUKKwkgIChocHBhX2ZyYW1lX3NhdmVkX3BjKTogU3R1Yl90eXBlIGJlY29tZXMgc3R1Yl91bndpbmQuc3R1Yl90eXBlCisJICAoZnJhbWVfY2hhaW5fdmFsaWQpOiBTdHViX3R5cGUgYmVjb21lcyBzdHViX3Vud2luZC5zdHViX3R5cGUKKwkgIChocHBhX2NhbGxfZHVtbXkpOiBTdHViX3R5cGUgYmVjb21lcyBzdHViX3Vud2luZC5zdHViX3R5cGUKKwkgIChwYV9wcmludF9mcF9yZWcpOiBBZGRpdGlvbmFsIHBhcmFtcyB0byBjYWxsIHZhbF9wcmludAorCSAgKGluX3NvbGliX2NhbGxfdHJhbXBvbGluZSk6IFN0dWJfdHlwZSBiZWNvbWVzIHN0dWJfdW53aW5kLnN0dWJfdHlwZQorCSAgKGluX3NvbGliX3JldHVybl90cmFtcG9saW5lKTogU3R1Yl90eXBlIGJlY29tZXMgc3R1Yl91bndpbmQuc3R1Yl90eXAKKwkgIChza2lwX3RyYW1wb2xpbmVfY29kZSk6IEFkZGl0aW9uYWwgY29kZSB0byBoYW5kbGUgZXh0ZXJuYWwKKwkgICAgIGR5bmNhbGxzLiBBbHNvIHN0dWJfdHlwZSBiZWNvbWVzIHN0dWJfdW53aW5kLnN0dWJfdHlwZQorCSAgKGhwcGFfcGlkX3RvX2V4ZWNfZmlsZSk6IE5ldyBmdW5jdC4gRk9yIEhQVVggMTAuMCBhbmQgYmV5b25kIHRoZXJlCisJICAgICBpcyBhbiBleHBsaWNpdCBwdHJhY2UgcmVxdWVzdCBmb3IgZ2V0dGluZyB0aGUgcGF0aG5hbWUgYXNzb2NpYXRlZAorCSAgICAgd2l0aCBhIHByb2Nlc3MgaWQgKHBpZCkuCisJCisJKiBocHBhLXRkZXAuYzogRml4IGZvciBnY2MgY29tcGlsZSBvbiBIUFVYCisJICAoaHBwYV9waWRfdG9fZXhlY19maWxlKTogUmVtb3ZlIHVud2FudGVkIHBhcmFtIGZyb20gCisJICAgICBjYWxsIHRvIGNhbGxfcHRyYWNlLiBOb3RlLCBocHBhX3BpZF90b19leGVjX2ZpbGUgZ29lcworCSAgICAgYXdheSBpbiBzdWJzZXF1ZW50IGhwIHNuYXBzaG90cy4KKworCSogaHBwYS10ZGVwLmM6IEluY2x1ZGUgYmZkLmguCisJaW5jbHVkZSBkbC5oCisJKGFyZ3NfZm9yX2ZpbmRfc3R1Yik6IE5ldyBzdHJ1Y3R1cmUuCisJKGZpbmRfdW53aW5kX2VudHJ5KTogRGVhbCB3aXRoIG51bGwgaW5wdXQgcGMgdmFsdWUuCisJKHJwX3NhdmVkKTogRGl0dG8uCisJRm9yIHRoZSBpbXBvcnQgc3R1YiwgcmV0dXJuIC0yNCBhbHdheXMuCisJKGhwcGFfZnJhbWVfc2F2ZWRfcGMpOiBTYXZlIG9sZCBwYyB2YWx1ZSwgdG8gZGV0ZWN0IHdlIGFyZSBpbiBhIGxvb3AuCisJKGluaXRfZXh0cmFfZnJhbWVfaW5mbyk6IFVzZSBUQVJHRVRfUkVBRF9GUC4KKwkoZnJhbWVfY2hhaW4pOiBJbmNsdWRlIHRocmVhZCBzdXBwb3J0LgorCUlmIHRoZSBjYWxsZXIncyBwYyBpcyB6ZXJvLCB3ZSBsb29zZSBhbmQgcmV0dXJuLCBqdXN0IGxpa2Ugc3RhY2sgYm90dG9tLgorCURpc2FibGUgd2FybmluZyBhYm91dCBiZWluZyB1bmFibGUgdG8gZmluZCB1bndpbmQgaW5mby4KKwkoaHBwYV9wdXNoX2FyZ3VtZW50cyk6IFJld3JpdGUuCisJKGhwcGFfdmFsdWVfcmV0dXJuZWRfZnJvbV9zdGFjayk6IE5ldyBmdW5jdGlvbi4gSGFuZGxlcyByZXR1cm5pbmcgYSB2YWx1ZQorCWxhcmdlciB0aGF0IDY0IGJpdHMsIHN0b3JlZCBvbiB0aGUgc3RhY2suCisJKGZpbmRfc3R1Yl93aXRoX3NobF9nZXQpOiBOZXcgZnVuY3Rpb24uIFRvIGxvb2sgdXAgc3ltYm9scyBpbiBzaGxpYnMuCisJKGNvdmVyX2ZpbmRfc3R1Yl93aXRoX3NobF9nZXQpOiBOZXcgZnVuY3Rpb24uIENvdmVyIHJvdXRpbmUgZm9yIAorCWZpbmRfc3R1Yl93aXRoX3NobF9nZXQgdG8gcGFzcyB0byBjYXRjaF9lcnJvcnMuCisJKGhwcGFfZml4X2NhbGxfZHVtbXkpOiBDb21tZW50IG91dCBvbGQgc3R1YiBtZWNoYW5pc20uIFJld3JpdGUgdXNpbmcgZHluY2FsbC4KKwkodGFyZ2V0X3JlYWRfZnApOiBOZXcgZnVuY3Rpb24uCisJKHBhX2RvX3JlZ2lzdGVyc19pbmZvKTogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIHN0YXJ0IGF0IEZQNC4KKwkocGFfcHJpbnRfcmVnaXN0ZXJzKTogVXNlIEZQNF9SRUdOVU0gaW5zdGVhZCBvZiA3Mi4KKwkoc2tpcF90cmFtcG9saW5lX2NvZGUpOiBEbyBtYWNoaW5lIGluc3RydWN0aW9uIG1hdGNoaW5nIGZvciBQQTIuMC4KKwkoc2V0dXBfZF9waWRfaW5faW5mZXJpb3IpOiBOZXcgZnVuY3Rpb24uIEV4Y2VwdGlvbiBoYW5kbGluZyBzdXBwb3J0LgorCShpbml0aWFsaXplX2hwX2N4eF9leGNlcHRpb25fc3VwcG9ydCk6IERpdHRvLgorCShjaGlsZF9lbmFibGVfZXhjZXB0aW9uX2NhbGxiYWNrKTogRGl0dG8uCisJKGNoaWxkX2dldF9jdXJyZW50X2V4Y2VwdGlvbl9ldmVudCk6IERpdHRvLgorCisJKiBocHBhaC1uYXQuYyAoY2hpbGRfcG9zdF93YWl0LCBjaGlsZF9wb3N0X2ZvbGxvd192Zm9yaywKKyAJY2hpbGRfcG9zdF9mb2xsb3dfaW5mZXJpb3JfYnlfY2xvbmUpOiBOZXcgZnVuY3Rpb25zLgorCisJKiBocHBhaC1uYXQuYyAoY2hpbGRfeGZlcl9tZW1vcnkpOiBNYWtlIHN1cmUgdGhlIGNhbGwgdG8gcHRyYWNlIHJlYWxseQorCWZhaWxzIGJlZm9yZSB3ZSBnaXZlIHVwLgorCShocHBhX3BpZF90b19zdHIpOiBOZXcgZnVuY3Rpb24uIEZvcm1hdCBhIHByb2Nlc3MgaWQuCisJKGhwcGFfdGlkX3RvX3N0cik6IE5ldyBmdW5jdGlvbi4gRm9ybWF0IGEgdGhyZWFkIGlkLiAKKworCSogaHBwYWgtbmF0LmMgKGNoaWxkX3hmZXJfbWVtb3J5KTogVXNlIHhtYWxsb2MsIG5vdCBhbGxvY2EuCisJKGNoaWxkX3Bvc3Rfd2FpdCk6IERlbGV0ZS4KKwkoY2hpbGRfcG9zdF9mb2xsb3dfdmZvcmspOiBEZWxldGUgZGVjbCBvZiBjaGlsZF9vcHM7IGRlbGV0ZQorCWxhcmdlIGNodW5rcyBvZiBmdW5jdGlvbiAtLSBsZXQgaXQgYmUgaGFuZGxlZCBieSB0aGUgbm9ybWFsCisJbWVjaGFuaXNtIHRoYXQgbm90aWNlcyBhbmQgaGFuZGxlcyBleGVjIGV2ZW50cywgaW4gcmVzdW1lKCkuCisKKwkqIGhwcGFoLW5hdC5jIChyZXF1aXJlX25vdGlmaWNhdGlvbl9vZl9leGVjX2V2ZW50cyk6IE5ldyBmdW5jdGlvbjsKKwlqdXN0IG5vdGlmeSBvZiBleGVjIGV2ZW50cywgbm90IGFsbCBldmVudHMsIGFuZCBqdXN0IHRoZSBzcGVjaWZpZWQKKwlwaWQsIGRvbid0IGluY2x1ZGUgaXQncyBjaGlsZHJlbiAoMTAuMjAgdmVyc2lvbikuCisJKGNoaWxkX2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IpOiBDYWxsIG5ldyBmdW5jdGlvbgorCXJlcXVpcmVfbm90aWZpY2F0aW9uX29mX2V4ZWNfZXZlbnRzIGluc3RlYWQgb2YKKwlyZXF1aXJlX25vdGlmaWNhdGlvbl9vZl9ldmVudHMuCisJCisJKiBocHBhaC1uYXQuYyBbIUdEQl9OQVRJVkVfSFBVWF8xMV06IE1vdmUgSFBVWCAxMC54LXNwZWNpZmljCisgCXN1cHBvcnQgY29kZSBoZXJlIGZyb20gaW5mcHRyYWNlLmMuCisKKwkqIGhwcGFoLW5hdC5jOiBSZW1vdmVkICNkZWZpbmUgcHRyYWNlIGNhbGxfcHRyYWNlCisJcmVwbGFjZWQgYWxsIGNhbGxzIHRvIHB0cmFjZSB3aXRoIGNhbGxzIHRvIGNhbGxfcHRyYWNlCisJKHBhcmVudF9hdHRhY2hfYWxsKTogUmVtb3ZlZCBjYWxsIHRvIHB0cmFjZQorCisJKiBocHJlYWQuYyAoaHByZWFkX3BzeW10YWJfdG9fc3ltdGFiXzEpOiBDaGFuZ2UgZmZsdXNoIHRvCisJZ2RiX2ZsdXNoOyBjaGFuZ2Ugc3Rkb3V0IHRvIGdkYl9zdGRvdXQuCisJKGhwcmVhZF9wc3ltdGFiX3RvX3N5bXRhYik6IENoYW5nZSBmZmx1c2ggdG8gZ2RiX2ZsdXNoLgorCQorCSogaHByZWFkLmg6IE5ldyBmaWxlLiBJbmNsdWRlcyBhbGwgaW5jbHVkZXMsIHN0cnVjdCBkZWZzLCBkZWZpbmVzCisgCWZyb20gaHByZWFkLmMuIAorCisJKiBpbmZjbWQuYyAKKwkoYXR0YWNoX2NvbW1hbmQpOiBOZXcgbG9jYWwgdmFyaWFibGUsIGV4ZWNfZmlsZSwgYWRkZWQgY29kZSB0bworIAkgIGRldGVybWluZSBleGVjX2ZpbGUgZnJvbSBwaWQgaWYgZXhlY19maWxlIGlzIG5vdCBhbHJlYWR5IGtub3duLAorCSAgY2FsbCBuZXcgdGFyZ2V0IG9wZXJhdGlvbiwgdGFyZ2V0X3Bvc3RfYXR0YWNoIC0tIGEgbm8tb3AgdW5sZXNzCisJICBvbiBIUFVYSFBQQQorCShkZXRhY2hfY29tbWFuZCk6IEFmdGVyIGRldGFjaGluZywgZG8gYSBTT0xJQl9SRVNUQVJUCisKKwkqIGluZmNtZC5jIChvYmpmaWxlcy5oKTogRml4IHR5cG8gb24gaW5jbHVkZSBsaW5lLgorCisJKiBpbmZjbWQuYyAocnVuX2NvbW1hbmQpOiBPbmx5IGNhbGwgU09MSUJfUkVTVEFSVCBpZiBpdCdzCisJZGVmaW5lZC4KKwkoZGV0YWNoX2NvbW1hbmQpOiBEaXR0by4KKworCSogaW5mY21kLmM6IAorCShydW5fc3RhY2tfZHVtbXkpOiBBZGQgY2FsbHMgdG8gCisJZGlzYWJsZV93YXRjaHBvaW50c19iZWZvcmVfaW50ZXJhY3RpdmVfY2FsbF9zdGFydCBhbmQKKwllbmFibGVfd2F0Y2hwb2ludHNfYWZ0ZXJfaW50ZXJhY3RpdmVfY2FsbF9zdG9wcworCShmaW5pc2hfY29tbWFuZCk6IEFsdGVyIGNvZGUgaGFuZGxpbmcgdGhlIGV2YWx1YXRpb24gYW5kIHByaW50aW5nCisJb2YgdGhlIHRhcmdldCBmdW5jdGlvbidzIHJldHVybiB2YWx1ZS4KKwkoYXR0YWNoX2NvbW1hbmQpOiBXaGVuIGdpdmVuIGEgcGlkLCBidXQgbm8gZXhlYyBmaWxlLCB0cnkgdG8gZGV0ZXJtaW5lCisJdGhlIGV4ZWMgZmlsZSBmcm9tIHRoZSBwcm9jZXNzLiBJZiB0aGUgcHJvY2VzcyBkb2VzIG5vdCByZWNvcmQgYSAKKwlmdWxsIHBhdGggbmFtZSwgdHJ5IHRvIHF1YWxpZnkgdGhlIGZpbGVuYW1lIGFnYWluc3QgdGhlIHNvdXJjZSBwYXRoLgorCShfaW5pdGlhbGl6ZV9pbmZjbWQpOiBBZGQgc29tZSB2ZXJiaWFnZSBhYm91dCBob3cgdG8gdXNlIHRoZSBhdHRhY2ggY29tbWFuZAorCisJKiBpbmZjbWQuYzogCisJSW5jbHVkZSBvYmpmaWxlcy5oCisJKHJ1bl9jb21tYW5kKTogSWYgcHJvZ3JhbSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQsIGFuZCBkZWNpZGUKKwl0byByZXN0YXJ0IGl0LCB0aGVuIGtpbGwgdGhlIHRhcmdldCwgZmx1c2ggdGhlIGNhY2hlcywgCisJY2FsbCBpbml0X3dhaXRfZm9yX2luZmVyaW9yLiBBbHNvIHB1cmdlIG9sZCBzb2xpYiBvYmpmaWxlcy4KKworCSogaW5mY21kLmM6IENoYW5nZWQgY2FsbHMgdG8gdmFsX3ByaW50LCB1c2luZyBhIG5ldyBtYWNybywKKwkgIFNPTElCX1JFU1RBUlQKKwkgIChydW5fY29tbWFuZCk6IENhbGxzIFNPTElCX1JFU1RBUlQKKwkgIChkb19yZWdpc3RlcnNfaW5mbyk6IENoYW5nZWQgY2FsbHMgdG8gdmFsX3ByaW50CisKKwkqIGluZmNtZC5jOiBNYWRlIHRoZSBzeW1maWxlLmggaW5jbHVkZSBwcmVjZWVkIHRoZSAKKwlvYmpmaWxlcy5oIGluY2x1ZGUuIFRoZSBvdGhlciBvcmRlcmluZyBjYXVzZWQgYSAKKwljb21waWxlIHByb2JsZW0gKGluY29tcGxldGVseSBkZWZpbmVkIHR5cGVzKS4KKworCSogaW5mZXJpb3IuaCAoUkVRVUlSRV9ERVRBQ0gpOiBGaXggZGVmYXVsdCBkZWZpbml0aW9uLgorCSogaW5mdGFyZy5jIChjaGlsZF9wb3N0X2F0dGFjaCk6IEZpeCBkZWNsYXJhdGlvbiwgbWFrZSBzdGF0aWMuCisJKHByb2Nfd2FpdCk6IE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KKwkoY2hpbGRfaW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCwgZXRjKTogRml4IHJldHVybiB0eXBlLgorCisJKiBpbmZlcmlvci5oIChTVEFSVFVQX1dJVEhfU0hFTEwpOiBOZXcgZGVmaW5lLgorCShTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCk6IE5ldyBkZWZpbmUKKworCSogaW5mZXJpb3IuaCAoZm9ya19pbmZlcmlvcik6IENoYW5nZSBmaWZ0aCBwYXJhbWV0ZXIgdG8gYmUgYSBmdW5jdGlvbiAKKwlyZXR1cm5pbmcgdm9pZC4gCisKKwkqIGluZmVyaW9yLmggKHByb2Nfd2FpdCk6IERlY2xhcmUuCisKKwkqIGluZmVyaW9yLmg6IAorCSAgKFJlcXVpcmVfQVRUQUNIKTogTmV3IG1hY3JvCisJICAoUkVRVUlSRV9ERVRBQ0gpOiBOZXcgbWFjcm8KKwkgIChkZXRhY2gpOiBEZWZpbml0aW9uIGlzIG5vdyBhbiBleHRlcm4KKwkgIChjbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yKTogTmV3IGRlZmluaXRpb24sIGl0J3MgYWxzbyBhbiBleHRlcm4KKworCSogaW5mZXJpb3IuaDogCisJICAoUmVxdWlyZV9hdHRhY2gpOiBEZWZhdWx0IGRlZmluaXRpb24gZm9yIHJlcXVpcmVfYXR0YWNoIGZ1bmN0CisJICAocmVxdWlyZV9kZXRhY2gpOiBEZWZhdWx0IGRlZmluaXRpb24gZm9yIHJlcXVpcmVfZGV0YWNoIGZ1bmN0CisJICAocHJlX2ZvcmtfaW5mZXJpb3IpOiBOZXcgZnVuY3QgZGVjbCBmb3IgZnVuY3Rpb24gZGVmaW5lZCBpbgorCSAgIGluZnB0cmFjZS5jCisJICAoZm9ya19pbmZlcmlvcik6IE5ldyBwYXJhbWV0ZXIgaW4gZnVuY3QgZGVjbC4KKworCSogaW5mZXJpb3IuaDogCisJICBOZXcgdmFyaWFibGUgZGVjbHM6IEluZmVyaW9yX2lnbm9yaW5nX3N0YXJ0dXBfZXhlY19ldmVudHMsCisJICAgIGluZmVyaW9yX2lnbm9yaW5nX2xlYWRpbmdfZXhlY19ldmVudHMgLS0gdGhlc2UgdmFyaWFibGVzIAorCSAgICBhcmUgdXNlZCB3aGVuIHByb2Nlc3NpbmcgYW4gZXhlYyBjYWxsLgorCSAgKENBTExfRFVNTVlfSEFTX0NPTVBMRVRFRCk6IE5ldyBkZWZhdWx0IG1hY3JvIC0tIGZvciB0YXJnZXRzCisJICAgIHdoZXJlIFBDIGluIGNhbGwgZHVtbXkgaW1wbGllcyB0aGF0IGNhbGwgZHVtbXkgaGFzIAorCSAgICBjb21wbGV0ZWQuIE5vdGUsIHRoYXQgb24gSFBVWCB0aGlzIGluZmVyZW5jZSBkb2VzIG5vdCBob2xkLgorCisJKiBpbmZwdHJhY2UuYworCSAgKHJlcXVpcmVfbm90aWZpY2F0aW9uX29mX2V2ZW50cyk6IE5ldyBmdW5jdGlvbgorCSAgKGNoaWxkX2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IpOiBQcmV2aW91c2x5IG5hbWVkCisJICAgICBocHBhX2Fja25vd2xlZGdlX2ZvcmtlZF9jaGlsZC4gQWxzbyBjYWxsaW5nIAorIAkgICAgIHJlcXVpcmVfbm90aWZpY2F0aW9uX29mX2V2ZW50cyBhbmQgY2xlYXJpbmcgc29tZSBzZW1hcGhvcmUgCisJICAgICB2YXJpYWJsZXMKKwkgIChjaGlsZF9wb3N0X3N0YXJ0dXBfaW5mZXJpb3IpOiBOZXcgZnVuY3Rpb24KKwkgIChjaGlsZF9jcmVhdGVfY2F0Y2hfZm9ya19ob29rKTogUHJldmlvdXNseSBuYW1lZAorCSAgICAgaHBwYV9jcmVhdGVfY2F0Y2hfZm9ya19ob29rCisJICAoY2hpbGRfY3JlYXRlX2NhdGNoX3Zmb3JrX2hvb2spOiBQcmV2aW91c2x5IG5hbWVkCisJICAgICBocHBhX2NyZWF0ZV9jYXRjaF92Zm9ya19ob29rIAorCSAgKGNoaWxkX2hhc19mb3JrZWQpOiBQcmV2aW91c2x5IG5hbWVkIGhwcGFfdGFyZ2V0X2hhc19mb3JrZWQKKwkgIChjaGlsZF9oYXNfdmZvcmtlZCk6IFByZXZpb3VzbHkgbmFtZWQgaHBwYV90YXJnZXRfaGFzX3Zmb3JrZWQKKwkgIChwcm9jZXNzX3dhaXQpOiBDaGFuZ2VkIHRvIGNhbGwgdGFyZ2V0X3Bvc3Rfd2FpdAorCSAgKGF0dGFjaCk6IEFkZCBjYWxsIHRvIHJlcXVpcmVfbm90aWZpY2F0aW9uX29mX2V2ZW50cworCSAgKGNoaWxkX3BpZF90b19leGVjX2ZpbGUpOiBOZXcgZnVuY3Rpb24KKwkgIChocHBhX3JlcXVpcmVfYXR0YWNoKTogTmV3IGxvY2FsIHZhcmlhYmxlLCBwdF9zdGF0dXMKKwkgIChocHBhX2dldF9wcm9jZXNzX2V2ZW50cyk6IE5ldyBmdW5jdGlvbgorCisJKiBpbmZwdHJhY2UuYyAoY2FsbF9wdHJhY2UpOiBTaW1wbGlmeSBjb250cm9sIGZsb3cuCisJKHByb2Nfd2FpdCk6IE1vdmUgaGVyZSBmcm9tIGluZnRhcmcuYywgYWRkIHRhcmdldF9wb3N0X3dhaXQgY2FsbC4KKworCSogaW5mcHRyYWNlLmMgKGNhbGxfcHRyYWNlKTogQWRkIHNvbWUgZGVidWdnaW5nIGNvZGUuCisKKwkqIGluZnB0cmFjZS5jIChjaGlsZF9waWRfdG9fZXhlY19maWxlKTogRGVjbGFyZSB2YXJpYWJsZS4KKworCSogaW5mcHRyYWNlLmMgKGtpbGxfaW5mZXJpb3IpOiBDbGVhbiB1cCBjYWxsIHRvIHByb2Nfd2FpdC4KKworCSogaW5mcHRyYWNlLmM6IAorCShDYWxsX3B0cmFjZSk6IFdoZW4gdGhlIHB0cmFjZSByZXF1ZXN0IGlzIFBUX1NFVFRSQywKKwljYWxsIHB0cmFjZSBhbmQgdGhlbiBjYWxsIHBhcmVudF9hdHRhY2hfYWxsLgorCisJKiBpbmZwdHJhY2UuYzogCisJKENoaWxkX2hhc19zeXNjYWxsX2V2ZW50KTogTmV3IGZ1bmN0aW9uLiBvbmx5IGFwcGxpY2FibGUKKwkoZm9yIG5vdykgb24gSFBVWCAxMC4zMCBhbmQgYmV5b25kIHZpYSB0aGUgdHRyYWNlIGNhbGwuCisJSW4gaW5mcHRyYWNlLmMgdGhlcmUgaXMgYSBkZWZhdWx0IG9wZXJhdGlvbi4KKyAJV2l0aCB0dHJhY2UsIGl0IGlzIHBvc3NpYmxlIHRvIHRlbGwgdGhlIGtlcm5lbCB0bworCW5vdGlmeSB0aGUgZGVidWdnZXIgdGhhdCB0aGUgdGFyZ2V0IHByb2dyYW0gaXMgYWJvdXQgdG8gbWFrZQorCW9yIHJldHVybiBmcm9tIGEgc3lzY2FsbC4KKwkoY2hpbGRfdGhyZWFkX2FsaXZlKTogTmV3IGZ1bmN0aW9uLiBhIGRlZmF1bHQgZnVuY3Rpb24uCisJcHRyYWNlIGRvZXNuJ3Qgc3VwcG9ydCBrZXJuZWwgdGhyZWFkcy4KKwkoaHBwYV9lbmFibGVfcGFnZV9wcm90ZWN0aW9uX2V2ZW50cyk6IERlZnVhbHQgZnVuY3Rpb24KKwkoaHBwYV9kaXNhYmxlX3BhZ2VfcHJvdGVjdGlvbl9ldmVudHMpOiBEZWZhdWx0IGZ1bmN0aW9uCisKKwkqIGluZnB0cmFjZS5jIChjaGlsZF9waWRfdG9fZXhlY19maWxlKTogRml4IG51bWJlciBvZiBwYXJhbXMgdG8KKyAJY2FsX3B0cmFjZSBjYWxsLgorCisJKiBpbmZwdHJhY2UuYyAoaHBwYV9waWRfb3JfdGlkX3RvX3N0cik6IE5ldyBmdW5jdGlvbi4KKwkoaHBwYV9zd2l0Y2hlZF90aHJlYWRzKTogTmV3IGZ1bmN0aW9uLgorCShocHBhX2Vuc3VyZV92Zm9ya2luZ19wYXJlbnRfcmVtYWluc19zdG9wcGVkKTogTmV3IGZ1bmN0aW9uLgorCShocHBhX3Jlc3VtZV9leGVjZF92Zm9ya2luZ19jaGlsZF90b19nZXRfcGFyZW50X3Zmb3JrKTogTmV3IGZ1bmN0aW9uLgorCisJKiBpbmZwdHJhY2UuYzogTW9zdCBvZiB0aGUgY2hhbmdlcyBmb3VuZCBpbiBpbmZwdHJhY2UuYyBzaG91bGQKKwkgICAgYmUgbW92ZWQgdG8gaHBwYWgtbmF0LmMKKwkgIChQVF9WRVJTSU9OKTogQSBuZXcgZGVmaW5lCisJICAoc3RhcnR1cF9zZW1hcGhvcmVfdCk6IEEgbmV3IHN0cnVjdCB0eXBlLiBpdCBpcyB1c2VkIHRvIAorCSAgICBjb29yZGluYXRlIHRoZSBwYXJlbnQgYW5kIGNoaWxkIHByb2Nlc3NlcyBhZnRlciBhIGZvcmsgYW5kIAorCSAgICBiZWZvcmUgYW4gZXhlYyBvbiBIUFVYLgorCSAgKGNhbGxfcHRyYWNlKTogQ2hhbmdlcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgcHRyYWNlCisJICAgIHJlcXVlc3QgaXMgZm9yIHN0YXJ0aW5nIHRoZSB0cmFjaW5nIG9mIHRoZSB0YXJnZXQgcHJvY2Vzcy4KKwkgIChwYXJlbnRfYXR0YWNoX2FsbCk6IE5ldyBmdW5jdC4gdXNlZCBvbiBIUFVYIGZvciBjb29yZGluYXRpbmcKKwkgICAgdGhlIHBhcmVudCBhbmQgY2hpbGQgcHJvY2Vzc2VzIGFmdGVyIGEgZm9yayBhbmQgYmVmb3JlIGFuZCBleGVjLgorCSAgKGhwcGFfYWNrbm93bGVkZ2VfZm9ya2VkX2NoaWxkKTogTmV3IGZ1bmN0LiBwcmFiYWJseSBiZWxvbmdzIAorCSAgICBpbiBocHBhaC1uYXQuYworCSAgKGhwcGFfZW5hYmxlX2NhdGNoX2ZvcmspOiBOZXcgZnVuY3QuIHByb2JhYmx5IGJlbG9uZ3MgaW4gCisJICAgIGhwcGFoLW5hdC5jCisJICAoaHBwYV9kaXNhYmxlX2NhdGNoX2ZvcmspOiBOZXcgZnVuY3QuIHByb2JhYmx5IGJlbG9uZ3MgaW4KKwkgICAgaHBwYWgtbmF0LmMKKwkgIChocHBhX2NyZWF0ZV9jYXRjaF9mb3JrX2hvb2spOiBOZXcgZnVuY3QuIHByb2JhYmx5IGJlbG9uZ3MgaW4gCisJICAgIGhwcGFoLW5hdC5jCisJICAoaHBwYV9lbmFibGVfY2F0Y2hfdmZvcmspOiBOZXcgZnVuY3QuIHByb2JhYmx5IGJlbG9uZ3MgaW4gCisJICAgIGhwcGFoLW5hdC5jCisJICAoaHBwYV9kaXNhYmxlX2NhdGNoX3Zmb3JrKTogTmV3IGZ1bmN0LiBwcm9iYWJseSBiZWxvbmdzIGluCisJICAgIGhwcGFoLW5hdC5jCisJICAoaHBwYV9jcmVhdGVfY2F0Y2hfdmZvcmtfaG9vayk6IE5ldyBmdW5jdC4gcHJvYmFibHkgYmVsb25ncyB0bworCSAgICBocHBhaC1uYXQuYworCSAgKGhwcGFfdGFyZ2V0X2hhc19mb3JrZWQpOiBOZXcgZnVuY3QuIHByb2JhYmx5IGJlbG9uZ3MgaW4gCisJICAgIGhwcGFoLW5hdC5jCisJICAoaHBwYV90YXJnZXRfaGFzX3Zmb3JrZWQpOiBOZXcgZnVuY3QuIHByb2JhYmx5IGJlbG9uZ3MgaW4KKwkgICAgaHBwYWgtbmF0LmMKKwkgIChwcm9jZXNzX3dhaXQpOiBOZXcgZnVuY3QuIGFsc28gaWZkZWZlZCBmb3IgcHJvY193YWl0LgorCSAgKGtpbGxfaW5mZXJpb3IpOiAgQ2FsbCBwcm9jX3dhaXQgcmF0aGVyIHRoYW4gd2FpdC4gdGhpcyBpcyAKKwkgICAgcHJldHR5IGhhY2t5LiAKKwkgIChwcmVfZm9ya19pbmZlcmlvcik6IE5ldyBmdW5jdGlvbi4gdXNlZCBvbmx5IGJ5IEhQVVguCisJICAgIHByb2JhYmx5IHNob3VsZCBiZSBkZWZpbmVkIGVsc2V3aGVyZS4KKworCSogaW5mcnVuLmMgKGZvbGxvd19pbmZlcmlvcl9mb3JrKTogT25seSBkZWZpbmUgb24gSFAuCisJKHdhaXRfZm9yX2luZmVyaW9yKTogT25seSBjYWxsIFNPTElCX0lOX0RZTkFNSUNfTElOS0VSIGlmIHdlIGhhdmUKKwlzaGFyZWQgbGlicmFyaWVzOyByZXN0b3JlIHRlc3Qgb2YgSU5fU09MSUJfRFlOU1lNX1JFU09MVkVfQ09ERQorCXJlbW92ZWQgYnkgSFAuCisKKwkqIGluZnJ1bi5jIChub3JtYWxfc3RvcCk6IEFkZCBhIGNhbGwgdG8gdGhlIFRVSURPIAorCW1hY3JvIGp1c3QgYmVmb3JlIHRoZSBhbm5vdGF0ZV9zdG9wcGVkIGxhYmVsLiBUaGlzCisJdXBkYXRlcyB0aGUgd2luZG93cyBhZnRlciBlYWNoIHByb2dyYW0gc3RvcC4KKworCSogaW5mcnVuLmMgKG5vcm1hbF9zdG9wKTogVmVyaWZ5IHN0b3BfY29tbWFuZCBpcyBub24temVybyBiZWZvcmUKKwlkZXJlZmVyZW5jaW5nIGl0IChpdCB3b24ndCBiZSBzZXQgaWYgZGJ4X2NvbW1hbmRzIGlzIHNldCkuCisKKwkqIGluZnJ1bi5jIChyZXN1bWUpOiBBZGQgI2lmZGVmIEhQUEFIUFVYIGFyb3VuZCBIUFVYLXNwZWNpZmljCisJY29kZS4KKworCSogaW5mcnVuLmMgKHJlc3VtZSk6IEFkZCBtaXNzaW5nIHNlbWljb2xvbi4KKworCSogaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogRml4IHN5bnRheCBlcnJvci4KKworCSogaW5mcnVuLmMgKGZvbGxvd19mb3JrX21vZGVfa2luZF9uYW1lcyk6IFJlbW92ZWQgImJvdGgiIG9wdGlvbi4KKwkoZm9sbG93X2ZvcmspOiBBZGRlZCBwYXJhbWV0ZXJzLiBhZGRpdGlvbmFsIGNvZGUgZm9yIGhhbmRsaW5nCisJZm9sbG93aW5nIG9mIHBhcmVudCwgZm9sbG93aW5nIG9mIGNoaWxkCisJKHJlc3VtZSk6IEFkZGVkIGNvZGUgZm9yIGRlY2lkaW5nIGhvdyB0byByZXN1bWUgaW4gcHJlc2VuY2Ugb2YKKwlmb3JrLiBBZGRpdGlvbmFsIHBhcmFtcyB0byBmb2xsb3dfZm9yayBjYWxsLgorCisJKiBpbmZydW4uYyAoZm9sbG93X2V4ZWMpOiBJZmRlZiBmb3IgSFBVWEhQUEEgZm9yIHRoZSBtb21lbnQsIHRoZQorIAljb2RlIGluIGhlcmUgYXNzdW1lcyB0aGUgZXhpc3RhbmNlIG9mIHRoZSBjaGlsZF9vcHMgdGFyZ2V0CisgCXZlY3Rvci4gVGhpcyBpcyBpbmNvcnJlY3QgZm9yIFNvbGFyaXMuCisKKwkqIGluZnJ1bi5jIChyZXN1bWUpOiBGaXhlZCBpZmRlZnMsIEhQUEFIUFVYIC0+IEhQVVhIUFBBLgorCisJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBGaXhlZCBhIG1hdGNoaW5nIHBhcmVucyBwcm9ibGVtIC0tCisgCW1hdGNoaW5nIGN1cmx5IGJyYWNlIGluc2lkZSBpZmRlZmVkIGNvZGUgd2hpY2ggaXMgbm90IGJlaW5nCisgCWNvbXBpbGVkLiBDaGFuZ2UgbG9jYWwgdmFsaWRGbGFnIHRvIGJlIGFuICdpbnQnIHJhdGhlciB0aGFuIGEKKyAJJ2Jvb2wnIGFuZCBmaXhlZCB0aGUgY29ycmVzcG9uZGluZyBhc3NpZ25tZW50IHN0YXRlbWVudHMuCisKKwkqIGluZnJ1bi5jOiAKKwlUd28gbmV3IGdsb2JhbCB2YXJpYWJsZXM6IEluZmVyaW9yX2lnbm9yaW5nX3N0YXJ0dXBfZXhlY19ldmVudHMgYW5kCisJaW5mZXJpb3JfaWdub3JpbmdfbGVhZGluZ19leGVjX2V2ZW50cy4KKwlOZXcgc3RhdGljIHZhcmlhYmxlczogUGFyZW50X29mX3Zmb3JrX3RyYXBfZXhwZWN0ZWRfYW5kX2lnbm9yYWJsZSwKKwlzdGVwX3Jlc3VtZV9icmVha3BvaW50LCB0aHJvdWdoX3NpZ3RyYW1wX2JyZWFrcG9pbnQsIHBlbmRpbmdfZm9sbG93LAorCWZvbGxvd192Zm9ya193aGVuX2V4ZWMKKwkoZm9sbG93X2luZmVyaW9yX2ZvcmspOiBEb2VzIHdoYXQgZm9sbG93X2ZvcmsgZGlkISAKKwkoZm9sbG93X2ZvcmspOiBJcyBub3cgYSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBmb2xsb3dfaW5mZXJpb3JfZm9yaworCShmb2xsb3dfdmZvcmspOiBJcyBub3cgYSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBmb2xsb3dfaW5mZXJpb3JfZm9yaworCShmb2xsb3dfZXhlYyk6IE5ldyBmdW5jdGlvbiwgaGFuZGxlcyBhbiBleGVjIGV2ZW50LgorCShyZXN1bWUpOiBSZW1vdmUgMyBsb2NhbCB2YXJpYWJsZXM6IENoaWxkX3BpZCwgaGFzX2ZvcmtlZCwgaGFzX3Zmb3JrZWQuCisJbW92ZSBhbmQgZXhwYW5kIGNvZGUgdGhhdCB0cmllcyB0byBmb2xsb3cgYSBmb3JrIChpLmUuIGFsc28gY2hlY2sKKyAJZm9yIHZmb3JrIGFuZCBleGVjCisJKGluaXRfd2FpdF9mb3JfaW5mZXJpb3IpOiBJbml0aWFsaXplIHRoZSBuZXcgc3RydWN0dXJlLCBwZW5kaW5nX2ZvbGxvdworCShkZWxldGVfYnJlYWtwb2ludF9jdXJyZW50X2NvbnRlbnRzKTogV2hlbiBkZWxldGluZyBhbGwgdGhlIGJyZWFrcG9pbnRzIGFsc28gCisJc2V0IHRoZSBicmVha3BvaW50IHN0cnVjdCBwb2ludGVyIHRvIE5VTEwuCisJKHdhaXRfZm9yX2luZmVyaW9yKTogQSBudW1iZXIgb2YgY2hhbmdlcy4KKyAJVGhlIHN0ZXBfcmVzdW1lX2JyZWFrcG9pbnQgYW5kIHRocm91Z2hfc2lndHJhbXBfYnJlYWtwb2ludCBsb2NhbCAKKwl2YXJpYWJsZXMgYXJlIG5vdyB2aXNpYmxlIGluIGVudGlyZSBtb2R1bGUuIAorCUNoYW5nZWQgbmFtZSBvZiB2YXJpYWJsZSBmcm9tIGNoaWxkX2luZmVyaW9yX3BpZCB0byBzYXZlZF9pbmZlcmlvcl9waWQuCisJQWRkZWQgc2V2ZXJhbCBjYXNlcyB0byB0aGUgZXZlbnQgcHJvY2Vzc2luZyBzd2l0Y2ggc3RhdGVtZW50OiAKKwlUYXJnZXRfV0FJVEtJTkRfRk9SS0VELCBUQVJHRVRfV0FJVEtJTkRfVkZPUktFRCwgVEFSR0VUX1dBSVRLSU5EX0VYRUNELgorCUFsc28sIGZvciBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRCwgY2hlY2sgdG8gc2VlIGlmIGV4cGVjdGluZyBhIHRyYXAKKwlmcm9tIHRoZSBwYXJlbnQgb2YgYSB2Zm9yayAoaWdub3JhYmxlKSBvdGhlcndpc2UgYnJlYWsgYXMgdXN1YWwuCisJV2hlbiBkZXRlcm1pbmluZyB0aGUgdmFsdWUgb2YgJ3JhbmRvbV9zaWduYWwnICgwIG9yIDEpLCBubyBsb25nZXIgY2hlY2sgZm9yIAorCWNhdGNocG9pbnRzLiAKKwlXaGVuIGRldGVybWluaW5nIGhvdyB0byBoYW5kbGUgdW5leHBlY3RlZCBzaWduYWxzLCBtdXN0IG5vdyB0YWtlIGludG8KKwlhY2NvdW50IGZvcmssIHZmb3JrLCBhbmQgZXhlYy4KKwlDaGFuZ2UgY2FsbCB0byBQQ19JTl9DQUxMX0RVTU1ZIHRvIGEgY2FsbCB0byBDQUxMX0RVTU1ZX0hBU19DT01QTEVURUQKKwlBdCBzdG9wX3N0ZXBwaW5nIGxhYmVsLCBjaGVjayB0byBzZWUgaWYgc3RvcHBlZCBmb3IgZm9yayBvcgorCXZmb3JrIGV2ZW50LgorCisJKiBpbmZydW4uYzogTmV3IGNvZGUgaXMgcmVsYXRlZCB0byB0aHJlYWRzIGFuZCBmb3JrL3Zmb3JrL2V4ZWMuCisgCU5ldyBzdGF0aWMgdmFyaWFibGU6IFRocmVhZF9zdGVwX25lZWRlZAorCURlbGV0ZWQgc3RhdGljIHZhcmlhYmxlOiBQYXJlbnRfb2ZfdmZvcmtfdHJhcF9leHBlY3RlZF9hbmRfaWdub3JhYmxlCisJQWx0ZXJlZCB0aGUgcGVuZGluZ19mb2xsb3cgYW5kIGZvcmtfZXZlbnQgc3RydWN0cworCShmb2xsb3dfaW5mZXJpb3JfZm9yayk6IEJlZm9yZSBkZXRhY2hpbmcgZnJvbSBjaGlsZCBhbmQgcmVtb3ZpbmcKKwlhbGwgYnJlYWtwb2ludHMgZm9ybSBpdCAtLSBidXQgb25seSBpZiBmb3JraW5nIG9yIGZvbGxvd2luZyAKKyAJdmZvcmtzIGFzIHNvb24gYXMgdGhleSBoYXBwZW4uIEFsc28gcmVzZXQgdGhlIHNvbGliIGluZmVyaW9yIGhvb2suCisJVGhlIHNhbWUga2luZCBvZiBsb2dpYyBhcHBsaWVzIHRvIGhpdHRpbmcgc3RlcF9yZXN1bWVfYnJlYWtwb2ludHMKKwkoY2FsbGluZyBicmVha3BvaW50X3JlX3NldF90aHJlYWQpIGFuZCB0byByZXNldHRpbmcgYW5kIGluc2VydGluZyAKKwlicmVha3BvaW50cy4gCisJKGZvbGxvd19leGVjKTogRm9yd2FyZCBkZWNsCisJKGZvbGxvd192Zm9yayk6IENoZWNrIHRvIHNlZSBpZiBnZGIgZm9sbG93ZWQgdGhlIGNoaWxkLiBJZgorCXRoZSBjaGlsZCBleGVjJ2QgYmVmb3JlIGdkYiBzYXcgdGhlIHBhcmVudCdzIHZmb3JrIGV2ZW50CisJdGhlbiBjYWxsIGZvbGxvd19leGVjLgorCShmb2xsb3dfZXhlYyk6IElmIHRoZSBleGVjIG9jY3VyZWQgYWZ0ZXIgYSB2Zm9yaywgdGhlbiBmb2xsb3cKKwl0aGUgdmZvcmsgYXMgd2VsbC4gRG8gaXQgYmVmb3JlIGZvbGxvd2luZyB0aGUgZXhlYy4KKwlNYWtlIHN1cmUgdG8gdXBkYXRlIGJyZWFrcG9pbnRzIGFmdGVyIGFuZCBleGVjCisJKHJlc3VtZSk6IE5ldyBsb2NhbCB2YXJpYWJsZSwgc2hvdWxkX3Jlc3VtZS4gCisJQ2hhbmdlIHBhcmFtZXRlcnMgaW4gY2FsbHMgdG8gZm9sbG93X2ZvcmssIGZvbGxvd192Zm9yaywgYW5kIAorCWZvbGxvd19leGVjLiBTb21lIGNoYW5nZXMgdG8gdGhlIHdheSB2YXJpb3VzIHBlbmRpbmdfZm9sbG93LmtpbmQKKwlzaXR1YXRpb25zIGFyZSBoYW5kbGVkICh0aGVyZSdzIFRBUkdFVF9XQUlUS0lORF9GT1JLRUQsIAorCVRBUkdFVF9XQUlUS0lORF9WRk9SS0VELCBBUkdFVF9XQUlUS0lORF9FWEVDRC4gU29tZSBhZGRpdGlvbmFsCisJY29uZGl0aW9ucyB0byBjaGVjayBiZWZvcmUgZGVjaWRpbmcgdG8gcmVzdW1lIHRoZSB0YXJnZXQgKGkuZS4KKwlzaG91bGRfcmVzdW1lPTEsIHN0ZXBwaW5nPywgdGhyZWFkX3N0ZXBfbmVlZGVkP2ksIHJlZ3VsYXIgCisJcmVzdW1lPykKKwkocHJvY2VlZCk6IFdoZW4gcHJvY2VlZGVkIGF0IGxvY2F0aW9uIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGJyZWFrcG9pbnQKKwlzZXQgdGhyZWFkX3N0ZXBfbmVlZGVkPTAgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvCisJc2luZ2xlIHN0ZXAgdGhyZWFkIG92ZXIgYnJlYWtwb2ludC4gU09tZSBhZGRpdGlvbmFsIGNoZWNrcyB0byBzZWUKKwlpZiBpdCBpcyBuZWNlc3NhcnkgdG8gc3RlcCB0aHJlYWQgb3ZlciBicmVha3BvaW50LgorCShzdGFydF9yZW1vdGUpOiBSZW1vdmUgY2FsbCB0byBjbGVhcl9wcm9jZWVkX3N0YXR1cy4KKwkoaW5pdF93YWl0X2Zvcl9pbmZlcmlvcik6IEluaXRpYWxpemUgbmV3IGZpZWxkcyBpbiBmb3JrX2V2ZW50CisJc3RydWN0dXJlIGFuZCBhZGQgYSBjYWxsIHRvIGNsZWFyX3Byb2NlZWRfc3RhdHVzLgorCSh3YWl0X2Zvcl9pbmZlcmlvcik6IE5ldyBsb2NhbCB2YXJpYWJsZTogTmV3X3RocmVhZF9ldmVudC4KKwlJbml0aWFsaXplIHRocmVhZF9zdGVwX25lZWRlZCA9IDAuIAorCU1pbm9yIG1hc3NhZ2luZyBvZiBjb25kaXRpb25zIGZvciBhZGRpbmcgYSBuZXcgdGhyZWFkIHRvIHRoZSB0aHJlYWQgbGlzdC4gCisJTm8gbG9uZ2VyIHJlc3VtaW5nIGV4ZWN1dGlvbiBhZnRlciBhZGRpbmcgYSBuZXcgdGhyZWFkLiBMZXQgdXNlciBwbGF5IHdpdGggdGhyZWFkIGZpcnN0LgorCVNvbWUgY2hhbmdlcyBpbiB0aGUgd2F5IFRBUkdFVF9XQUlUS0lORF9GT1JLRUQsIEFSR0VUX1dBSVRLSU5EX1ZGT1JLRUQsCisJVEFSR0VUX1dBSVRLSU5EX0VYRUNEIGFyZSBoYW5kbGVkIC0tIHRoaXMgaXMgYWxsIEhQVVggcmVsYXRlZC4gCisJU2ltcGxpZmllZCBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRCAtLSBIUCBwcmV2aW91c2x5IGhhZCBzb21lCisJbW9yZSBjb21wbGljYXRlZCBjb2RlIGluIGhlcmUuIAorCU1vdmVkIHRoZSBjb2RlIHRvIHJlc3VtZSB0aHJlYWRzIHRvIGFmdGVyIHRoZSBsYXJnZSBjYXNlIHN0YXRlbWVudCB0aGF0IHByb2Nlc3NlcyB0aGUgZXZlbnRzLgorCUFkZGl0aW9uYWwgcHJvY2Vzc2luZyBmb3Igc3RvcF9zaWduYWw9VEFSR0VUX1NJR05BTF9UUkFQLiAKKwlDbGVhbnVwIGNvZGUgYXQgcHJvY2Vzc19ldmVudF9zdG9wX3Rlc3QgbGFiZWwuIAorCVNldCB0aHJlYWRfc3RlcF9uZWVkZWQgd2hlbiBwcm9jZXNzaW5nIGEgQlBTVEFUX1dIQVRfU0lOR0xFLgorCU1pbm9yIG1hc3NhZ2luZyBvZiBmb3JrL3Zmb3JrL2V4ZWMgcGFydCBvZiBzdG9wX3N0ZXBwaW5nIGNvZGUuCisJKG5vcm1hbF9zdG9wKTogTWlub3IgY2hhbmdlcy4gY2FsbGluZyBzaG93X2FuZF9wcmludF9zdGFja19mcmFtZS4KKwkoeGRiX2hhbmRsZV9jb21tYW5kKTogTmV3IGZ1bmN0aW9uCisJKF9pbml0aWFsaXplX2luZnJ1bik6IEhhbmRsZSB4ZGJfY29tbWFuZHMuIGFsc28gaGFuZGxlIGRieCBjb21tYW5kcworCisJKiBpbmZydW4uYzogQ2hhbmdlcyB0byBzdXBwb3J0IGZvbGxvd2luZyBmb3JrcywgYW5kIGhhbmRsaW5nCisJICAgIGNhdGNocG9pbnRzLgorCSAgKGZvbGxvd19mb3JrX21vZGVfa2luZF9uYW1lcyk6IE5ldyBhcnJheQorCSAgKGZvbGxvd19mb3JrKTogTmV3IGZ1bmN0aW9uLiBpbXBsZW1lbnRzIHRoZSBmb2xsb3cgcGFyZW50LAorCSAgICBvciBjaGlsZCBmdW5jdGlvbmFsaXR5LgorIAkgIChyZXN1bWUpOiBBZGRpdGlvbnMgdG8gY2hlY2sgd2hldGhlciB0aGUgdGFyZ2V0IHByb2Nlc3MgCisJICAgIGp1c3QgZm9ya2VkIGFuZCBkZWNpZGUgd2hpY2ggcHJvY2VzcyB0byBmb2xsb3cuCisJICAod2FpdF9mb3JfaW5mZXJpb3IpOiBBZGRpdGlvbmFsIHZhcmlhYmxlcyAoY2hpbGRfaW5mZXJpb3JfcGlkLAorCSAgICAgIHN0ZXBwaW5nX3Rocm91Z2hfc29saWJfYWZ0ZXJfY2F0Y2gsIAorCSAgICAtICBzdGVwcGluZ190aHJvdWdoX3NvbGliX2NhdGNocG9pbnRzLgorCSAgICAtICBBbHRlcmVkIENVUlJFTlRMWV9TVEVQUElORyBtYWNybyB0byBjaGVjayBmb3Igc3RlcHBpbmcgdGhyb3VnaAorCSAgICAgICBhIHNoYXJlZCBsaWJyYXJ5IGFmdGVyIGhpdHRpbmcgYSBjYXRjaHBvaW50LgorCSAgICAtIEFkZCBwYXJhbWV0ZXJzIHRvIHNhdmVfaW5mcnVuX3N0YXRlIGNhbGwKKwkgICAgLSBDaGVjayBmb3IgZm9yayBhbmQgdmZvcmsgd2hlbiBkZWNpZGluZyBpZiBldmVudCBpcyBhIHJhbmRvbQorCSAgICAgICBzaWduYWwKKwkgICAgLSBXaGVuIGNvbnNpZGVyaW5nIHN0b3BzIGR1ZSB0byBicmVha3BvaW50cywgY2hlY2sgZm9yIAorCSAgICAgIEJQU1RBVF9XSEFUX0NIRUNLX1NITElCU19SRVNVTUVfRlJPTV9IT09LCisJICAgIC0gQ2hlY2sgZm9yIHN0b3AgZHVlIHRvIGFuIGV4cGxpY2l0IGNhdGNocG9pbnQKKwkgICAgLSBXaGVuIGNoZWNraW5nIGZvciBzaW5nbGUgc3RlcHBpbmcgZXZlbnQsIGFsc28gY2hlY2sgZm9yCisJICAgICAgc3RlcHBpbmcgdG8gZ2V0IG91dCBvZiBkeW5hbWljIGxpbmtlcidzIGhvb2sgYWZ0ZXIgY2F0Y2hpbmcKKwkgICAgICBhIHNobGliIGV2ZW50CisJICAoaXNfaW50ZXJuYWxfc2hsaWJfZXZlbnRwb2ludCk6IE5ldyBmdW5jdC4gY2hlY2sgdG8gc2VlIGlmIAorCSAgICAgIGV2ZW50IHR5cGUgaXMgYnBfc2hsaWJfZXZlbnQuCisJICAoc3RvcHBlZF9mb3JfaW50ZXJuYWxfc2hsaWJfZXZlbnQpOiBOZXcgZnVuY3QuIGNoZWNrIGZvciBzaGxpYgorCSAgICAgIGV2ZW50cworCSAgKHN0b3BwZWRfZm9yX3NobGliX2NhdGNocG9pbnQpOiBOZXcgZnVuY3QuIGNoZWNrIGZvciBjYXRjaHBvaW50cy4KKwkgIChub3JtYWxfc3RvcCk6IEFkZGl0aW9ucyB0byBjaGVjayBmb3Igc2hsaWIgZXZlbnQKKwkgIChzZXRfZm9sbG93X2ZvcmtfbW9kZV9jb21tYW5kKTogTmV3IGZ1bmN0LiBoYW5kbGVzIHRoZSBuZXcgZm9sbG93CisJICAgICAgZm9yayBjb21tYW5kLgorCSAgKF9pbml0aWFsaXplX2luZnJ1bik6IEFkZGl0aW9ucyBmb3IgZm9sbG93LWZvcmstbW9kZSBjb21tYW5kLgorCisJKiBpbmZydW4uYzogSWZkZWZpbmcgcmVmZXJlbmNlcyB0byAKKwlzd2l0Y2hlZF9mcm9tX2luZmVyaW9yX3BpZCBmb3IgSFBVWEhQUEEuIFRoZXkgZG9uJ3Qgc2VlbSAKKwl1c2VmdWwgZm9yIFNvbGFyaXMgKGkuZS4gbm9uLUhQVVgpCisKKwkqIGluZnJ1bi5jOiBJbmNsdWRlZCB0dWlEYXRhLmggYW5kIHR1aURhdGFXaW4uaCwgaWZkZWZlZCBmb3IgVFVJLgorCUluY2x1ZGVkIHRvcC5oLiBOZXcgc3RhdGljIHZhcmlhYmxlczogU3dpdGNoZWRfZnJvbV9pbmZlcmlvcl9waWQsIAorCW51bWJlcl9vZl90aHJlYWRzX2luX3N5c2NhbGxzLiAKKwkoZm9sbG93X2luZmVyaW9yX2ZvcmspOiBJZiB0aGVyZSBpcyBhIHN0ZXBfcmVzdW1lIGJyZWFrcG9pbnQKKwlleHBsaWNpdGx5IHJlc2V0IHRoZSB0aHJlYWQgbnVtYmVyLiAKKwkocmVzdW1lKTogRm9yIFRBUkdFVF9XQUlUS0lORF9WRk9SS0VELCByZW1vdmVkIGEgY2hlY2sgZm9yIGdldHRpbmcgCisJdGhlIHZmb3JrIGV2ZW50IHRvIHNvb24uCisJKGluaXRfd2FpdF9mb3JfaW5mZXJpb3IpOiBBZGRlZCBwYXJhbWV0ZXIgdG8gY2FsbCB0byAKKwlicmVha3BvaW50X2luaXRfaW5mZXJpb3IuIEluaXRpYWxpemUgbnVtYmVyX29mX3RocmVhZHNfaW5fc3lzY2FsbHMuCisJKHdhaXRfZm9yX2luZmVyaW9yKTogTmV3IGxvY2FsIHZhcmlhYmxlczogUHJldl9zYWwsCisJZW5hYmxlX2h3X3dhdGNocG9pbnRzX2FmdGVyX3dhaXQsIHN0ZXBwaW5nX3Rocm91Z2hfc2lndHJhbXAsCisJc3RlcHBlZF9hZnRlcl9zdG9wcGVkX2J5X3dhdGNocG9pbnQuIEVuYWJsZSB3YXRjaHBvaW50cyBhZnRlciBhIHdhaXQuCisJQWRkZWQgY2FzZXMgZm9yIFRBUkdFVF9XQUlUS0lORF9TWVNDQUxMX0VOVFJZIGFuZCAKKwlUQVJHRVRfV0FJVEtJTkRfU1lTQ0FMTF9SRVRVUk4uCisJRG8gYWRkaXRpb25hbCBwcm9jZXNzaW5nIGlmIHN0b3AgZHVlIHRvIGJyZWFrcG9pbnQsIGJ1dCBicmVha3BvaW50IGlzCisJb25seSB2YWxpZCBmb3IgYSB0aHJlYWQgb3RoZXIgdGhhbiB0aGUgb25lIGN1cnJlbnRseSBydW5uaW5nLiBBZGRpdGlvbmFsCisJcGFyYW1ldGVycyB0byBzYXZlX2luZnJ1bl9zdGF0ZSBhbmQgbG9hZF9pbmZydW5fc3RhdGUuIFNvbWUgYWRkaXRpb25hbAorCXByb2Nlc3NpbmcgZm9yIEJQU1RBVF9XSEFUX1NURVBfUkVTVU1FLiBTb21lIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyB0byAKKwloYW5kbGUgc3RlcHBpbmcgb3ZlciBhIGZ1bmN0aW9uLgorCShub3JtYWxfc3RvcCk6IEFkZGVkIG5vdGlmaWNhdGlvbiBvZiBzd2l0Y2hpbmcgdGhyZWFkcy4gaWZkZWZpbmcgc29tZQorCVRVSSBjaGFuZ2VzIGFuZCBsZWF2aW5nIG91dCBub24tZXNzZW50aWFsIFRVSSBjaGFuZ2VzLgorCShyZXN0b3JlX3NlbGVjdGVkX2ZyYW1lKTogSWZkZWZpbmcgc29tZSBUVUkgY2hhbmdlcworCShyZXN0b3JlX2luZmVyaW9yX3N0YXR1cyk6IElmZGVmaW5nIHNvbWUgVFVJIGNoYW5nZXMKKworCSogaW5mcnVuLmM6IFJlbW92ZWQgdGhlIFRVSSBpZmRlZnMgYW5kIFRVSSBjb2RlLiBBbHNvIHJlbW92ZWQKKwlpbmNsdWRlIGZvciB0b3AuaC4gSFAgaW50cm9kdWNlZCB0aGlzLiBJJ20gdGFraW5nIGl0IG91dC4KKworCSogaW5mdGFyZy5jIChjaGlsZF9kZXRhY2hfZnJvbV9wcm9jZXNzKTogRGVjbGFyZS4KKwkoY2hpbGRfYXR0YWNoX3RvX3Byb2Nlc3MpOiBEZWNsYXJlLgorCShjaGlsZF9zdG9wKTogTWFrZSBzdGF0aWMgdG8gbWF0Y2ggZGVjbGFyYXRpb24uCisKKwkqIGluZnRhcmcuYyAocHRyYWNlX2hpbSk6IENoYW5nZSBwcm90b3R5cGUgYmFjayB0byByZXR1cm4gaW50LiAKKworCSogaW5mdGFyZy5jIChwdHJhY2VfbWUpOiBSZW1vdmUgZGVidWcgb3V0cHV0LCBwYXNzIE5VTEwgdG8KKwlmb3JrX2luZmVyaW9yIGlmIG5vdCBIUFVYLgorCisJKiBpbmZ0YXJnLmM6IAorCSAgKGNoaWxkX3JlcXVpcmVfYXR0YWNoKTogTmV3IGZ1bmN0IHByb3RvdHlwZSBhbmQgZGVmaW5pdGlvbgorCSAgKGNoaWxkX3JlcXVpcmVfZGV0YWNoKTogTmV3IGZ1bmN0IHByb3RvdHlwZSBhbmQgZGVmaW5pdGlvbgorCSAgKHByb2Nfd2FpdCk6IEZ1bmN0IHByb3RvdHlwZSBhbmQgZGVmaW5pdGlvbiBhcmUgZW5jbG9zZWQgYnkKKwkgICAgcHJvY193YWl0IGlmbmRlZgorCSAgKGNoaWxkX2F0dGFjaF90b19wcm9jZXNzKTogTmV3IGZ1bmN0aW9uLCBkb2VzIG1vc3Qgb2YgdGhlIAorCSAgICB3b3JrIHRoYXQgY2hpbGRfYXR0YWNoIHVzZWQgdG8gZG8gYW5kIHNvbWUgYWRkaXRpb25hbCAKKwkgICAgd29yayB0byBkZXRlcm1pbmUgd2hldGhlciBnZGIgaXMgYWxyZWFkeSBhdHRhY2hlZCB0byB0aGUKKwkgICAgdGFyZ2V0IGhvdyB0byByZWFjdC4KKwkgIChjaGlsZF9hdHRhY2gpOiBBbHRlcmVkLiBJdCdzIG5vdyBhIHdyYXBwZXIgZm9yCisJICAgIGNoaWxkX2F0dGFjaF90b19wcm9jZXNzLgorCSAgKGNoaWxkX3JlcXVpcmVfYXR0YWNoKTogTmV3IGZ1bmN0aW9uLCBjYWxsZWQgaWYgc2hvdWxkIGF0dGFjaAorCSAgICBldmVuIHdoZW4gZ2RiIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gdGFyZ2V0LgorCSAgKGNoaWxkX2RldGFjaF9mcm9tX3Byb2Nlc3MpOiBOZXcgZnVuY3Rpb24sIGRvZXMgbW9zdCBvZiB0aGUgCisJICAgIHdvcmsgdGhhdCBjaGlsZF9kZXRhY2ggdXNlZCB0byBkbyBhbmQgc29tZSBhZGRpdGlvbmFsIHdvcmsKKwkgICAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgZ2RiIGlzIGN1cnJlbnRseSBhdHRhY2hlZCB0byB0aGUgdGFyZ2V0LgorCSAgKGNoaWxkX2RldGFjaCk6IEFsdGVyZWQuIEl0J3Mgbm93IGEgd3JhcHBlciBmb3IgCisJICAgIGNoaWxkX2RldGFjaF9mcm9tX3Byb2Nlc3MuCisJICAoY2hpbGRfcmVxdWlyZV9kZXRhY2gpOiBOZXcgZnVuY3Rpb24sIGNhbGxlZCBpZiBzaG91bGQgdHJ5IHRvIAorCSAgICBkZXRhY2ggZXZlbiB3aGVuIGdkYiBpcyBub3QgYXR0YWNoZWQgdG8gdGFyZ2V0LgorCSAgKHB0cmFjZV9oaW0pOiBDYWxscyBhIG5ldyBmdW5jdGlvbiwgdGFyZ2V0X2Fja25vd2xlZGdlX2ZvcmtlZF9jaGlsZC4KKyAJICAgIEN1cnJlbnRseSwgdGFyZ2V0X2Fja25vd2xlZGdlX2ZvcmtlZF9jaGlsZCwgaXMgb25seSBkZWZpbmVkIHRvCisJICAgIGRvIHNvbWV0aGluZyBmb3IgSFBVWC4KKwkgIChjaGlsZF9jcmVhdGVfaW5mZXJpb3IpOiBDaGFuZ2VkIGNhbGwgdG8gZm9ya19pbmZlcmlvci4KKwkgIChjaGlsZF9vcHMpOiBBZGRlZCB0b19yZXF1aXJlX2F0dGFjaCBhbmQgdG9fcmVxdWlyZV9kZXRhY2ggZmllbGRzCisJICAgIHRvIHRoZSBjaGlsZF9vcHMgdGFyZ2V0IG9wcyB2ZWN0b3IuCisKKwkqIGluZnRhcmcuYzogCisJICBTb21lIGhhY2tzIGZvciB0dHJhY2Ugd29yayAKKwkgIChjaGlsZF93YWl0KTogQWRkaXRpb25hbCBsb2NhbCB2YXJpYWJsZXMsIGFkZGl0aW9uYWwgY29kZSBpbgorCSAgICB3aGlsZSBsb29wIHRvIGNoZWNrIGZvcjogUHJvY2VzcyBleGl0ZWQsIHByb2Nlc3MgZm9ya2VkLCAKKwkgICAgcHJvY2VzcyB2Zm9ya2VkLCBwcm9jZXNzIGV4ZWNkCisJICAoY2hpbGRfdGhyZWFkX2FsaXZlKTogSm9obiBCLiBzZWVtcyB0byB0aGluayB0aGF0IHRoZSBraWxsIAorCSAgICBjYWxsIGlzIGluYXBwcm9hcHJpYXRlIGZvciBIUFVYLgorCSAgKGNoaWxkX2F0dGFjaF90b19wcm9jZXNzKTogVXNpbmcgc3RydG9sIHJhdGhlciB0aGFuIGF0b2kuCisJICAgIG5vIGxvbmdlciBjaGVjayBmb3IgY2FzZSB3aGVyZSB0aGVyZSBpcyBubyBrbm93biBleGVjIGZpbGUuCisJICAoY2hpbGRfcG9zdF9hdHRhY2gpOiBOZXcgZnVuY3Rpb24sIGEgZGVmYXVsdCwgYSBuby1vcAorIAkgIChjaGlsZF9pbnNlcnRfZm9ya19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uLCBhIGRlZmF1bHQsIGEgbm8tb3AKKwkgIChjaGlsZF9yZW1vdmVfZm9ya19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uLCBhIGRlZmF1bHQsIGEgbm8tb3AKKwkgIChjaGlsZF9jcmVhdGVfY2F0Y2hfZm9ya19ob29rKTogRGVsZXRlZAorCSAgKGNoaWxkX2NyZWF0ZV9jYXRjaF92Zm9ya19ob29rKTogRGVsZXRlZAorCSAgKGNoaWxkX2luc2VydF92Zm9ya19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uLCBhIGRlZmF1bHQsIGEgbm8tb3AKKwkgIChjaGlsZF9yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludCk6IE5ldyBmdW5jdGlvbiwgYSBkZWZhdWx0LCBhIG5vLW9wCisJICAoY2hpbGRfY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjICk6bmV3IGZ1bmN0aW9uLCBhIGRlZmF1bHQsIAorIAkgICAgIGEgbm8tb3AKKwkgIChjaGlsZF9pbnNlcnRfZXhlY19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uLCBhIGRlZmF1bHQsIGEgbm8tb3AKKwkgIChjaGlsZF9yZW1vdmVfZXhlY19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uLCBhIGRlZmF1bHQsIGEgbm8tb3AKKwkgIChjaGlsZF9oYXNfZXhlY2QpOiBOZXcgZnVuY3Rpb24sIGEgZGVmYXVsdCwgcmV0dXJucyAwCisJICAoY2hpbGRfcmVwb3J0ZWRfZXhlY19ldmVudHNfcGVyX2V4ZWNfY2FsbCk6IE5ldyBmdW5jdGlvbiwgYSAKKyAJICAgICBkZWZhdWx0LCByZXR1cm5zIDEKKwkgIChjaGlsZF9oYXNfZXhpdGVkKTogTmV3IGZ1bmN0aW9uLCBhIGRlZmF1bHQuCisJICAoY2hpbGRfY29yZV9maWxlX3RvX3N5bV9maWxlKTogTmV3IGZ1bmN0aW9uLCBhIGRlZmF1bHQsIHJldHVybnMgTlVMTC4KKwkgIChjaGlsZF9vcHMpOiBJbml0aWFsaXplIG5ldyB0YXJnZXRfb3BzIHZlY3RvciBmaWVsZHMgdG8gdGhlIAorCSAgICAgY2hpbGQqIGZ1bmN0aW9ucy4KKwkqIGluZnB0cmFjZS5jOiAKKwkoQ2FsbF9wdHJhY2UpOiBGb3IgSFBVWCwgaGFuZGxlIGFkZGl0aW9uYWwgcmVxdWVzdHM6IFB0X0NPTlRJTjEsCisJICBQVF9TVEVQMS4KKwkocmVxdWlyZV9ub3RpZmljYXRpb25fb2ZfZXZlbnRzKTogQWRkIHNldmVyYWwgc2lnbmFscyB0byB0aGUKKwkgIHNldCBvZiBldmVudHMgcmVxdWlyaW5nIG5vdGlmaWNhdGlvbjogUHRyYWNlX1NJR05BTCwgCisJICBQVFJBQ0VfRVhFQywgUFRSQUNFX0ZPUkssIFBUUkFDRV9WRk9SSworCShjaGlsZF9hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yKTogVGhpcyBmdW5jdGlvbiBpcyBvbmx5CisJICBkZWZpbmVkIGlmIENISUxEX0FDS05PV0xFREdFX0NSRUFURURfSU5GRVJJT1IgaXMgZGVmaW5lZC4KKwkoY2hpbGRfcG9zdF9zdGFydHVwX2luZmVyaW9yKTogRnVuY3Rpb24gaXMgb25seSBkZWZpbmVkIGlmCisJICBDSElMRF9QT1NUX1NUQVJUVVBfSU5GRVJJT1IgaXMgZGVmaWVuZC4gQWxzbywgbm93IGNhbGwKKyAgCSAgcmVxdWlyZV9ub3RpZmljYXRpb25fb2ZfZXZlbnRzLgorCShjaGlsZF9jcmVhdGVfY2F0Y2hfZm9ya19ob29rKTogRGVsZXRlZAorCShjaGlsZF9jcmVhdGVfY2F0Y2hfdmZvcmtfaG9vayk6IERlbGV0ZWQKKwkoY2hpbGRfaW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCk6IE5ldyBmdW5jdGlvbgorCShjaGlsZF9yZW1vdmVfZm9ya19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uCisJKGNoaWxkX2luc2VydF92Zm9ya19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uCisJKGNoaWxkX3JlbW92ZV92Zm9ya19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uCisJKGNoaWxkX2hhc19mb3JrZWQpOiBOb3cgZW5jbG9zZWQgYnkgYSBDSElMRF9IQVNfRk9SS0VEIGlmZGVmCisJKGNoaWxkX2hhc192Zm9ya2VkKTogTm93IGVuY2xvc2VkIGJ5IENISUxEX0hBU19WRk9SS0VEIGlmZGVmCisJKGNoaWxkX2Nhbl9mb2xsb3dfdmZvcmtfcHJpb3JfdG9fZXhlYyk6IE5ldyBmdW5jdGlvbgorCShjaGlsZF9pbnNlcnRfZXhlY19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uCisJKGF0dGFjaCk6IFJlbW92ZWQgY2FsbCB0byByZXF1aXJlX25vdGlmaWNhdGlvbl9vZl9ldmVudHMgCisJKGNoaWxkX3Bvc3RfYXR0YWNoKTogTmV3IGZ1bmN0aW9uLCBjYWxsIHRvIAorCSAgcmVxdWlyZV9ub3RpZmljYXRpb25fb2ZfZXZlbnRzIG1vdmVkIGhlcmUuCisJKGNoaWxkX3BpZF90b19leGVjX2ZpbGUpOiBOZXcgZW5jbG9zZWQgYnkgQ0hJTERfUElEX1RPX0VYRUNfRklMRSBpZmRlZiAKKwkgIGludHJvZHVjZWQgdGhlIGNvbmNlcHQgb2YgYSBzYXZlZF9pbmZlcmlvcl9waWQKKwkoaHBwYV9yZXF1aXJlX2F0dGFjaCk6IEFkZCBzb21lIGNvZGUgdG8gZGVjaWRlIGlmIGdkYiBpcyBhbHJlYWR5IAorCSAgYXR0YWNoZWQgdG8gcHJvY2Vzcy4gQ2FuIG5vdCBmaWd1cmUgdGhpcyBvdXQgdmlhIGEgcHRyYWNlIGNhbGwuCisJKGhwcGFfaW5zZXJ0X2h3X3dhdGNocG9pbnQpOiBOZXcgZnVuY3Rpb24KKwkoaHBwYV9yZW1vdmVfaHdfd2F0Y2hwb2ludCk6IE5ldyBmdW5jdGlvbgorCisJKiBpbmZ0YXJnLmM6IAorCShjaGlsZF9hdHRhY2hfdG9fcHJvY2Vzcyk6IENoYW5nZSBwb3NpdGlvbiBpbiBmaWxlCisJKGNoaWxkX2RldGFjaF9mcm9tX3Byb2Nlc3MpOiBDaGFuZ2UgcG9zaXRpb24gaW4gZmlsZQorCisJKiBpbmZ0YXJnLmM6IAorCShjaGlsZF9hdHRhY2hfdG9fcHJvY2Vzcyk6IENoYW5nZWQgcGFyYW1ldGVyIHRvIGNoaWxkX3dhaXQgY2FsbAorCisJKiBpbmZ0YXJnLmM6IAorCShjaGlsZF9wb3N0X3dhaXQpOiBOZXcgZnVuY3Rpb24gZGVjbGFyYXRpb24gYW5kIGRlZmluaXRpb24KKwkocHRyYWNlX2hpbSk6CisgCSAgIC0gY2hhbmdlIHJldHVybiB2YWx1ZSB0byBhIHZvaWQuCisJICAgLSBjaGFuZ2UgdGFyZ2V0X2Fja25vd2xlZGdlX2ZvcmtlZF9jaGlsZCBjYWxsIHRvIAorCSAgICAgdGFyZ2V0X2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IKKwkgICAtIGNhbGwgdGFyZ2V0X3Bvc3Rfc3RhcnR1cF9pbmZlcmlvciByYXRoZXIgdGhhbiByZXR1cm5pbmcgcGlkLgorCShjaGlsZF9hdHRhY2hfdG9fcHJvY2Vzcyk6IENoYW5nZSBwYXJhbSBuYW1lLCBmYWlsX2lmX2FscmVhZHlfYXR0YWNoZWQKKwkgIC0+IGFmdGVyX2ZvcmsuCisJICBJbnZlcnQgYSBjb3VwbGUgb2YgaWYtdGhlbi1lbHNlIHN0YXRtZW50cy4KKwkgIFVzZSBSRVFVSVJFX0FUVEFDSCBtYWNybworCSAgKGNoaWxkX2F0dGFjaCk6IENoYW5nZSBwYXJhbXMgaW4gY2hpbGRfYXR0YWNoX3RvX3Byb2Nlc3MgY2FsbAorCSAgKGNoaWxkX3JlcXVpcmVfYXR0YWNoKTogQ2hhbmdlIHBhcmFtcyBpbiBjaGlsZF9hdHRhY2hfdG9fcHJvY2VzcyBjYWxsCisJICAoY2hpbGRfZGV0YWNoX3RvX3Byb2Nlc3MpOiBDaGFuZ2UgcGFyYW0gbmFtZSwgCisJICAgIGZhaWxfaWZfYWxyZWFkeV9hdHRhY2hlZCAtPiBhZnRlcl9mb3JrLgorCSAgSW52ZXJ0IGEgY291cGxlIG9mIGlmLXRoZW4tZWxzZSBzdGF0bWVudHMuCisJICBVc2UgUkVRVUlSRV9ERVRBQ0ggbWFjcm8KKwkgIChjaGlsZF9kZXRhY2gpOiBDaGFuZ2UgcGFyYW1zIGluIGNoaWxkX2RldGFjaF9mcm9tX3Byb2Nlc3MgY2FsbAorCSAgKGNoaWxkX3JlcXVpcmVfZGV0YWNoKTogQ2hhbmdlIHBhcmFtcyBpbiBjaGlsZF9kZXRhY2hfZnJvbV9wcm9jZXNzCisJICAgICBjYWxsCisJICAoY2hpbGRfcG9zdF9zdGFydHVwX2luZmVyaW9yKTogTmV3IGZ1bmN0aW9uCisJICAoY2hpbGRfYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvcik6IE5ldyBmdW5jdGlvbgorCSAgKGNoaWxkX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IpOiBOZXcgZnVuY3Rpb24KKwkgIChjaGlsZF9wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSk6IE5ldyBmdW5jdGlvbgorCSAgKGNoaWxkX2NyZWF0ZV9jYXRjaF9mb3JrX2hvb2spOiBOZXcgZnVuY3Rpb24KKwkgIChjaGlsZF9jcmVhdGVfY2F0Y2hfdmZvcmtfaG9vayk6IE5ldyBmdW5jdGlvbgorCSAgKGNoaWxkX2hhc19mb3JrZWQpOiBOZXcgZnVuY3Rpb24KKwkgIChjaGlsZF9oYXNfdmZvcmtlZCk6IE5ldyBmdW5jdGlvbgorCSAgKGNoaWxkX3Bvc3RfZm9sbG93X3Zmb3JrKTogTmV3IGZ1bmN0aW9uCisJICAoY2hpbGRfc3RvcCk6IE5vIGxvbmdlciBhIHN0YXRpYyBmdW5jdGlvbgorCSAgKGNoaWxkX3BpZF90b19leGVjX2ZpbGUpOiBOZXcgZnVuY3Rpb24KKworCSogaW5mdGFyZy5jOiAKKwkoY2hpbGRfd2FpdCk6IENoaWxkX3BpZCBiZWNvbWVzIHJlbGF0ZWQgcGlkLiByZXR1cm4gcGlkCisJcmF0aGVyIHRoYW4gaW5mZXJpb3JfcGlkLiBDaGFuZ2VzIGFyZSBpbiBjb2RlIGhhbmRsaW5nIGZvcmsKKwlhbmQgdmZvcmsKKworCSogaW5mdGFyZy5jOiAKKwlJbmNsdWRlIGdkYl9zdGF0LmggYW5kIHN5cy91bmlzdGQuaAorCShjaGlsZF93YWl0KTogTmV3IGxvY2FsIHZhcmlhYmxlcy4gQ2hlY2sgZm9yIGxpdmUgdGhyZWFkcy4KKwlDaGVjayBmb3Igc3lzY2FsbCBldmVudHMKKwkoY2hpbGRfdGhyZWFkX2FsaXZlKTogTm8gbG9uZ2VyIGEgc3RhdGljIGZ1bmN0LiAKKwkocHRyYWNlX2hpbSk6IFJlbW92ZSBzb21lIGNvZGUgaW5zZXJ0ZWQgaW4gc25hcDMKKwkoY2hpbGRfY3JlYXRlX2luZmVyaW9yKTogQWRkZWQgYSBidW5jaCBvZiBjb2RlIHRvIGhhbmRsZSBhIAorCWJhZCBpbnRlcmFjdGlvbiBiZXR3ZWVuIHN0YXJ0LXVwLXdpdGgtc2hlbGwgYW5kIHRoZSBIUAorCWNhdGNoLWZvcmsvY2F0Y2gtZXhlYyBsb2dpYy4gSSBhbSBpZmRlZmluZyB0aGlzIGZvciAKKwlIUFVYSFBQQSBmb3Igbm93LgorCShjaGlsZF9oYXNfc3lzY2FsbF9ldmVudCk6IE5ldyBkZWZhdWx0IHRhcmdldF9vcHMgZnVuY3Rpb24KKwkoY2hpbGRfZW5hYmxlX2V4Y2VwdGlvbl9jYWxsYmFjayk6IE5ldyBkZWZhdWx0IHRhcmdldF9vcHMgZnVuY3Rpb24KKwkoY2hpbGRfZ2V0X2N1cnJlbnRfZXhjZXB0aW9uX2V2ZW50KTogTmV3IGRlZmF1bHQgdGFyZ2V0X29wcyBmdW5jdGlvbgorCShjaGlsZF9vcHMpOiAzIG5ldyBmaWVsZHMKKworCSogaW5mdGFyZy5jOiBSZW1vdmUgSFBVWF9TTkFQMSBhbmQgSFBVWF9TTkFQMiBpZmRlZnMKKworCSogaW5mdGFyZy5jOiBSZXZlcnRlZCBwcmV2aW91cyBjaGFuZ2UuCisJCisJKiBpbmZ0dHJhY2UuYyAoaHBwYV9yZW1vdmVfaHdfd2F0Y2hwb2ludCk6IEZpeCBjaGVjayBmb3Igd3JpdGUKKwlhY2Nlc3MgaGFyZHdhcmUgd2F0Y2hwb2ludC4KKworCSogaW5mdHRyYWNlLmMgKHByb2Nfd2FpdCk6IFJlbmFtZSBmcm9tIHByb2Nfd2FpdC4KKworCSogaW5mdHRyYWNlLmMgKHJlcXVpcmVfbm90aWZpY2F0aW9uX29mX2V4ZWNfZXZlbnRzKTogTmV3IGZ1bmN0aW9uOworCWp1c3Qgbm90aWZ5IG9mIGV4ZWMgZXZlbnRzLCBub3QgYWxsIGV2ZW50cywgYW5kIGp1c3QgdGhlIHNwZWNpZmllZAorCXBpZCwgZG9uJ3QgaW5jbHVkZSBpdCdzIGNoaWxkcmVuLgorCShjaGlsZF9hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yKTogQ2FsbCBuZXcgZnVuY3Rpb24KKwlyZXF1aXJlX25vdGlmaWNhdGlvbl9vZl9leGVjX2V2ZW50cyBpbnN0ZWFkIG9mCisJcmVxdWlyZV9ub3RpZmljYXRpb25fb2ZfZXZlbnRzLgorCShjaGlsZF9wb3N0X3N0YXJ0dXBfaW5mZXJpb3IpOiBDYWxsIHJlcXVpcmVfbm90aWZpY2F0aW9uX29mX2V2ZW50cworCisJKiBpbmZ0dHJhY2UuYzogQ2hhbmdlZCBhbGwgcmVmZXJlbmNlcyB0byBib29sZWFuIHRvIGludC4KKwlDaGFuZ2VkIGFsbCByZWZlcmVuY2VzIHRvIFRSVUUgYW5kIEZBTFNFIHRvIDEgYW5kIDAuCisKKwkqIGlyaXg1LW5hdC5jIChzeW1ib2xfYWRkX3N0dWIpOiBBZGQgcGFyYW1zIHRvIGNhbGwgdG8KKyAJc3ltYm9sX2ZpbGVfYWRkLgorCisJKiBqdi1sYW5nLmMgKGdldF9keW5hbWljc19vYmpmaWxlKTogQWRkIDIgbW9yZSBwYXJhbWV0ZXJzIHRvIGNhbGwKKyAJdG8gYWxsb2NhdGVfb2JqZmlsZS4KKworCSogbWFpbi5jIChmcHV0c191bmZpbHRlcmVkKTogQ2hhbmdlcyB0byBwcmV2ZW50IGN1cnNvciBmb3JtCisgCWp1bXBpbmcgYXJvdW5kIGluIHRoZSBUVUkuIEFsdGVyZWQgd2hlcmUgdHVpVGVybVVuc2V0dXAgYW5kCisgCXR1aVRlcm1TZXR1cCBhcmUgY2FsbGVkCisKKwkqIG1haW4uYyAoZnB1dHNfdW5maWx0ZXJlZCk6IENoYW5nZWQgZnVuY3Rpb24gc28gdGhhdCBpdAorCWNoZWNrcyB0byBzZWUgaWYgb3V0cHV0IGlzIHRvIGEgc3RyaW5nIGJ1ZmZlciBvciB0byBhIAorCUZJTEUgc3RyZWFtIGFuZCBkb2VzIHRoZSBjb3JyZWN0IGFjdGlvbiAoaS5lLiBzdHJjYXQgb3IKKwlmcHV0cykuIEZpeGVkIHBhcmFtcyBmb3IgZnB1dHMgY2FsbC4KKworCSogbWFpbi5jIChmcHV0c191bmZpbHRlcmVkKTogRG9uJ3QgdHJ5IHRvIGNhbGwgdGhlIFRVSSdzCisJQ29tbWFuZENoYXJDb3VudCBmdW5jdGlvbnMgd2hlbiB0aGUgVFVJIGlzbid0IGVuYWJsZWQuCisKKwkqIG1haW4uYyAoZnB1dHNfdW5maWx0ZXJlZCk6IENoYW5nZSBGSUxFIHRvIEdEQl9GSUxFLgorCisJKiBtYWluLmMgKG1haW4pOiBJZiB0aGUgdXNlciBnaXZlcyB0aGUgLS12ZXJzaW9uIG9yIC0taGVscCBmbGFncywKKyAJZGlzYWJsZSB0aGUgVFVJLgorCisJKiBtYWluLmMgKHR1aV92ZXJzaW9uLCB4ZGJfY29tbWFuZHMsIGRieF9jb21tYW5kcyk6IE5ldyB2YXJpYWJsZXMuCisgIAkobWFpbik6IE5ldyBjb21tYW5kIGxpbmUgYXJndW1lbnRzIC0tdHVpLCAtLXhkYiwgLS1kYng7IGFkZCBjYWxsCisgCXRvIHR5aUNsZWFuVXAgdmlhIHR1aURvIHRvIG1haW4gbG9vcC4KKwkoZnB1dHNfdW5maWx0ZXJlZCk6IFR1aSByZWxhdGVkIGNoYW5nZXMuCisKKwkqIG1haW4uYzogRGVmaW5lIDIgbmV3IGdsb2JhbCB2YXJpYWJsZXMsIGdkYl9zdGRvdXQgYW5kIGdkYl9zdGRlcnIKKyAJb2YgdHlwZSBHREJfRklMRS4KKyAJKG1haW4pOiBBbGxvY2F0ZSBzcGFjZSBmb3IgYW5kIGluaXRpYWxpemUgZ2RiX3N0ZG91dCBhbmQgZ2RiX3N0ZGluLgorCisJKiBvYmpmaWxlcy5jIChmaW5kX3BjX3NlY3Rfc2VjdGlvbik6IE1ha2UgZW5kIGNvbmRpdGlvbiBiZSBsZXNzCisJdGhhbiBzLT5lbmRhZGRyLCBub3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHMtPmVuZGFkZHIuCisKKwkqIG9iamZpbGVzLmM6IAorCShhbGxvY2F0ZV9vYmpmaWxlKTogMiBuZXcgcGFyYW1ldGVyczogVXNlcl9sb2FkZWQgYW5kIGlzX3NvbGliLgorCVdoZW4gYXBwcm9wcmlhdGUsIHJlY29yZCBpbiB0aGUgb2JqZWN0IGZpbGUgdGhhdCBpdCBpcyB1c2VyIGxvYWRlZC4KKyAJVGhlIHJ1biBjb21tYW5kIGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBwdXJnZSBvYmplY3QgZmlsZQorCWVudHJpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBvbGQgaW5mZXJpb3IgYW5kIGtlZXAgdXNlciBsb2FkZWQgCisJb2JqZWN0IGZpbGVzIGxvYWRlZCB2aWEgdGhlIGFkZC1zeW1ib2wtZmlsZSBjb21tYW5kLgorCShvYmpmaWxlX3B1cmdlX3NvbGlicyk6IE5ldyBmdW5jdGlvbi4gZGVsZXRlcyBhbGwgb2JqZWN0ZmlsZSBlbnRyaWVzCisJdGhhdCBhcmUgbm90IGV4cGxpY2l0bHkgbG9hZGVkIGJ5IHRoZSB1c2VyLgorCQorCSogb2JqZmlsZXMuYzogCisJKG9iamZpbGVfcmVsb2NhdGUpOiBDaGVjayBmb3IgTE9DX0lORElSRUNUCisJKGZpbmRfcGNfc2VjdF9zZWN0aW9uKTogQ2hhbmdlIGNvbmRpdGlvbiBmcm9tIAorCXBjIDwgcy0+ZW5kYWRkciB0byBwYyA8PSBzLT5lbmRhZGRyCisKKwkqIG9iamZpbGVzLmg6IAorCU5ldyB2YXJpYWJsZXM6IFVzZXJfbG9hZGVkIGFuZCBpc19zb2xpYgorCShPQkpGX1NIQVJFRCk6IE5ldyBtYWNyby4gdXNlZCB0byBkaXN0aW5ndWlzaCBvYmpmaWxlIGZvcgorCXNoYXJlZCBsaWJyYXJ5IGZyb20gInZhbmlsbGEiIG9iamZpbGUuCisJKGFsbG9jYXRlX29iamZpbGUpOiBBZGQgbmV3IHBhcmFtZXRlcnMgdG8gZnVuY3Rpb24gZGVjbC4KKwkob2JqZmlsZV9wdXJnZV9zb2xpYnMpOiBOZXcgZnVuY3Rpb24gZGVjbC4KKwkKKwkqIG9iamZpbGVzLmg6IEFkZCBzb21lIHR5cGVkZWZzOiBJbXBvcnRlbnRyeSwgRXhwb3J0RW50cnkuCisJQWRkIHNvbWUgbmV3IHZhcmlhYmxlczogSW1wb3J0X2xpc3QsIGltcG9ydF9saXN0X3NpemUsCisJZXhwb3J0X2xpc3QsIGV4cG9ydF9saXN0X3NpemUKKwkKKwkqIG9zZnNvbGliLmM6IAorCShzeW1ib2xfYWRkX3N0dWIpOiBBZGRlZCBwYXJhbXMgdG8gY2FsbCB0byBzeW1ib2xfZmlsZV9hZGQKKworCSogcGEvaHB1eDEwMjAubWggKE5BVERFUEZJTEVTKTogQWRkIGNvcmVsb3cubywgc3ltYm9sIHRhYmxlIGFuZAorCXNvbGliIGZpbGVzLgorCQorCSogcGEvaHB1eDExMDAubWggKE5BVF9GSUxFKTogVXNlIG5tLWhwcGFoMTEuaC4KKwkoTkFUREVQRklMRVMpOiBBZGQgc3ltYm9sIHRhYmxlIGFuZCBzb2xpYiBmaWxlcy4KKworCSogcGEvbm0taHBwYWgxMS5oOiBOZXcgZmlsZSwgSFBVWDExLW9ubHkgZGVmaW5pdGlvbnMuCisKKwkqIHBhL3RtLWhwcGEuaCAocHJvY193YWl0KTogUmVtb3ZlIGRlY2wgYW5kIG1hY3JvLgorCisJKiBwYXJzZS5jICh3cml0ZV9kb2xsYXJfdmFyaWFibGUpOiBIYW5kbGUgY2FzZXMgaW4gd2hpY2ggdmFyaWFibGVzCisJYmVzaWRlcyB0aGUgZGVidWdnZXIgb25lcyBzdGFydCB3aXRoICQgYW5kICQkLgorCShwYXJzZV9uZXN0ZWRfY2xhc3Nlc19mb3JfaHBhY2MpOiBOZXcgZnVuY3Rpb24uICBQYXJzZSBhIHN0cmluZyB0aGF0IAorCWlzIHBvc3NpYmx5IGEgbmFtZXNwYWNlIC8gbmVzdGVkIGNsYXNzIHNwZWNpZmljYXRpb24uCisJKGZpbmRfdGVtcGxhdGVfbmFtZV9lbmQpOiBOZXcgZnVuY3Rpb24uIAorCisJKiBwcm9jZnMuYzogCisJKHByb2Nmc19pbml0X2luZmVyaW9yKTogUmV0dXJuIHZhbHVlIGlzIG5vdyBhIHZvaWQuCisKKwkqIHByb2Nmcy5jIChwcm9jZnNfb3BzKTogSW5pdGlhbGl6aW5nIG5ldyB0YXJnZXQgb3BzIHZlY3RvciBmaWVsZHMuIHNlZSBsaXN0IGJlbG93LgorCQorCSogcHJvY2ZzLmM6IAorCShwcm9jZnNfb3BzKTogQWRkaW5nIG5ldyB0YXJnZXRfb3BzIHZlY3RvciBmaWVsZHMgYW5kCisJICByZW1vdmluZyBhIGZldy4gc2VlIGxpc3QgYmVsb3cKKworCSogcHJvY2ZzLmM6IEFkZGVkIG5ldyBmaWVsZHMgdG8gcHJvY2ZzX29wcy4gCisJTmVjZXNzYXJ5IHNpbmNlIHdlIHN0aWxsIGhhdmUgb2xkc3R5bGUgaW5pdGlhbGl6YXRpb24gaW4KKwl0aGlzIGZpbGUKKworCSogcHlyLXRkZXAuYyAocHlyX2RvX3JlZ2lzdGVyc19pbmZvKTogQ2hhbmdlIHN0ZG91dCB0byBnZGJfc3Rkb3V0LgorCShmcmFtZV9sb2NhbHNfYWRkcmVzcyk6IENoYW5nZSBzdGRlcnIgdG8gZ2RiX3N0ZGVyci4KKwkoZnJhbWVfYXJnc19hZGRyKTogRGl0dG8uCisKKwkqIHB5ci14ZGVwLmMgKGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyk6IENoYW5nZSBzdGRlcnIgdG8KKwlnZGJfc3RkZXJyLgorCisJKiBzZXJpYWwuYyAoc2VyaWFsX2Nsb3NlKTogQ2FsbCBnZGJfZmNsb3NlLCBub3QgZmNsb3NlIG9uIGEKKwlHREJfRklMRS4KKworCSogc2VyaWFsLmMgKHNlcmlhbF9sb2djaGFyKTogQ2hhbmdlIGNodHlwZSB0byBjaF90eXBlLiAgc2lnaC4KKworCSogc29saWIuYyAobG9va19mb3JfYmFzZSk6IFRoZSBwYXJhbWV0ZXIgdG8gZmlsZSBtdXN0IGJlIAorCW9mIHR5cGUgRklMRSAqLiBTbyBjYXN0IGV4ZWNfYmZkIC0+IGlvc3RyZWFtIGluIHRoZSBjYWxsCisJdG8gZmlsZW5vIGFzIGEgRklMRSAqLCBub3QgYSBHREJfRklMRSAqLiBUaGlzIHdpbGwgd29yayBiZWNhdXNlCisJZXhlY19iZmQgLT4gaW9zdHJlYW0gaXMgZGVjbGFyZWQgYW5kIGdpdmVuIGEgdmFsdWUgaW4gYmRmIGFuZCAKKwliZmQgd2lsbCBjb250aW51ZSB0byB1c2UgRklMRSByYXRoZXIgdGhhbiBHREJfRklMRS4KKworCSogc29saWIuYzogCisJKHNvbGliX2FkZCk6IFJlbW92ZSByZWZlcmVuY2VzIHRvIGV4ZWNfb3BzLgorCisJKiBzb2xpYi5jOiAKKwkoc29saWJfYWRkKTogVXBkYXRlIGV4ZWNfb3BzLnRvX3NlY3Rpb25zCisKKwkqIHNvbGliLmM6IAorCShzeW1ib2xfYWRkX3N0dWIpOiBBZGRlZCBwYXJhbXMgdG8gY2FsbCB0byBzeW1ib2xfZmlsZV9hZGQKKworCSogc29saWIuaDogCisJKFNPTElCX1JFTU9WRV9JTkZFUklPUl9IT09LKTogTmV3IG1hY3JvLiBkZWZpbmVkIHRvIDAuCisJZnVuY3Rpb25hbGl0eSBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgdGFyZ2V0LgorCisJKiBzb2xpYi5oOiBBZGRlZCBtYWNybyBkZWZpbml0aW9ucy4gVGhlc2UgbWFjcm9zIGdlbmVyYXRlCisJICBlcnJvciBtZXNzYWdlcyBmb3Igc29sYXJpcz8/CisJICAoU09MSUJfQ1JFQVRFX0NBVENIX0xPQURfSE9PSykKKwkgIChTT0xJQl9DUkVBVEVfQ0FUQ0hfVU5MT0FEX0hPT0spCisJICAoU09MSUJfSEFWRV9MT0FEX0VWRU5UKQorCSAgKFNPTElCX0xPQURFRF9MSUJSQVJZX1BBVEhOQU1FKQorCSAgKFNPTElCX0hBVkVfVU5MT0FEX0VWRU5UKQorCSAgKFNPTElCX1VOTE9BREVEX0xJQlJBUllfUEFUSE5BTUUpCisJICAoU09MSUJfSU5fRFlOQU1JQ19MSU5LRVIpCisJICAoU09MSUJfUkVTVEFSVCkKKworCSogc29tcmVhZC5jIChpc19pbl9pbXBvcnRfbGlzdCk6IERpdHRvLgorCisJKiBzb21yZWFkLmMgKHNvbV9zeW1maWxlX3JlYWQpOiBBZGRlZCBzb21lIGNvbW1lbnRzCisKKwkqIHNvbXJlYWQuYyAoc29tX3N5bWZpbGVfcmVhZCk6IFJlYWQgaW4gaW1wb3J0IGFuZCBleHBvcnQgbGlzdHMuCisJKHNvbV9zeW10YWJfcmVhZCk6IENoYW5nZSB0ZXN0IGZvciBkeW5hbWljIGV4ZWN1dGFibGUuCisJKGlzX2luX2ltcG9ydF9saXN0KTogTmV3IGZ1bmN0aW9uLiBDaGVjayBpZiBhIGdpdmVuIHN5bWJvbCBuYW1lCisgCWlzIGluIHRoZSBpbXBvcnQgbGlzdC4KKwkoaW5pdF9pbXBvcnRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbi4gUmVhZCBpbiBhbmQgaW5pdGlhbGl6ZSB0aGUgCisJc29tIGltcG9ydCBsaXN0LgorCShpbml0X2V4cG9ydF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLiBSZWFkIGluIGFuZCBpbml0aWFsaXplIHRoZSAKKwlzb20gZXhwb3J0IGxpc3QuCisKKwkqIHNvbXJlYWQuYzogCisJKHNvbV9zeW1maWxlX3JlYWQpOiBGaXggbWlzc2luZyBjb21tZW50IGRlbGltaXRlcnMKKworCSogc29tc29saWIuYyAoRExEX0ZMQUdTX01BUFBSSVZBVEUpOiBOZXcgbWFjcm8uIAorCURlZmluZSBiaXQgb2YgX19kbGRfZmxhZ3MgaW4gSFAtVVggYS5vdXQgZmlsZXMuCisJKERMRF9GTEFHU19IT09LVkFMSUQpOiBEaXR0by4KKwkoRExEX0ZMQUdTX0xJU1RWQUxJRCk6IERpdHRvLgorCShETERfRkxBR1NfQk9SX0VOQUJMRSk6IERpdHRvLgorCShzb21fc29saWJfdG90YWxfc3Rfc2l6ZSk6IEN1bXVsYXRpdmUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgCisJc3ltYm9sIHRhYmxlcyBvZiBhbGwgc2hhcmVkIG9iamVjdHMgb24gdGhlIHNvX2xpc3RfaGVhZCBsaXN0LgorCShzb21fc29saWJfc3Rfc2l6ZV90aHJlc2hob2xkX2V4Y2VlZGVkKTogVGhyZXNob2xkIGZvciBhZGRpbmcgc3ltYm9scworCWZvciBzaGxpYnMuCisJKHNvbV9zb2xpYl9zaXplb2Zfc3ltYm9sX3RhYmxlKTogTmV3IGZ1bmN0aW9uLiBDb21wdXRlcyBzaXplIG9mIAorCXN5bWJvbCB0YWJsZSBmb3IgYSBzaGxpYi4KKwkoc29tX3NvbGliX2xvYWRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbi4gTG9hZCBzeW1ib2xzIGZyb20gc2hsaWIuCisJKHNvbV9zb2xpYl9hZGQpOiBEZXRlY3QgaWYgX19kbGRfbGlzdCBpcyBub3QgdmFsaWQuIAorCVJlY29yZCBtYWluIHByb2dyYW0ncyBzeW1ib2wgdGFibGUgc2l6ZS4KKwlMb2FkIHN5bWJvbHMgaWYgY2FsbGVkIGZyb20gY29tbWFuZCBsaW5lLgorCUtlZXAgdGhyZXNob2xkIGludG8gYWNjb3VudCB3aGVuIGxvYWRpbmcgc2hsaWIgc3ltYm9scy4KKwkoc29tX3NvbGliX2NyZWF0ZV9pbmZlcmlvcl9ob29rKTogVXNlIGRsZF9mbGFncyBtYWNyb3MuCisJKHNvbV9zaGFyZWRsaWJyYXJ5X2luZm9fY29tbWFuZCk6IExldCB1c2VyIGtub3cgaWYgc3ltYm9scyB3ZXJlIAorCW5vdCBsb2FkZWQuCisJKHNvbV9zb2xpYl9yZXN0YXJ0KTogRGlzY2FyZCBhbGwgdGhlIHNobGlicyBkZXNjcmlwdG9ycy4KKwkoX2luaXRpYWxpemVfc29tX3NvbGliKTogQ2hlbmdlIGhlbHAgbWVzc2FnZSBmb3IgYXV0by1zb2xpYi1hZGQKKwljb21tYW5kLgorCVNldCB0aHJlc2hvbGQgZm9yIHN5bWJvbCB0YWJsZSB0byA1MCBtZWdhYnl0ZXMuCisKKwkqIHNvbXNvbGliLmMgKF9pbml0aWFsaXplX3NvbV9zb2xpYik6IEFkZGVkIGNhbGwgdG8gc29tX3NvbGliX3Jlc3RhcnQuCisJKHNvbV9zb2xpYl9yZXN0YXJ0KTogTmV3IGZ1bmN0aW9uCisJKHNvbV9zb2xpYl9pbl9keW5hbWljX2xpbmtlcik6IE5ldyBmdW5jdGlvbgorCShzb21fc29saWJfZGVzaXJlX2R5bmFtaWNfbGlua2VyX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24KKwkoc29tX3NvbGliX3VubG9hZGVkX2xpYnJhcnlfcGF0aG5hbWUpOiBOZXcgZnVuY3Rpb24KKwkoc29tX3NvbGliX2xvYWRlZF9saWJyYXJ5X3BhdGhuYW1lKTogTmV3IGZ1bmN0aW9uCisJKHNvbV9zb2xpYl9saWJyYXJ5X3BhdGhuYW1lKTogTmV3IGZ1bmN0aW9uCisJKHNvbV9zb2xpYl9oYXZlX3VubG9hZF9ldmVudCk6IE5ldyBmdW5jdGlvbgorCShzb21fc29saWJfaGF2ZV9sb2FkX2V2ZW50KTogTmV3IGZ1bmN0aW9uCisJKHNvbV9zb2xpYl9jcmVhdGVfY2F0Y2hfdW5sb2FkX2hvb2spOiBOZXcgZnVuY3Rpb24KKwkoc29tX3NvbGliX2NyZWF0ZV9jYXRjaF9sb2FkX2hvb2spOiBOZXcgZnVuY3Rpb24KKwkoc29tX3NvbGliX2NyZWF0ZV9pbmZlcmlvcl9ob29rKTogUmV3cml0dGVuCisJZGxkX2NhY2hlOiBOZXcgc3RydWN0CisJYWRkcl9hbmRfdW53aW5kX3Q6IE5ldyBzdHJ1Y3QKKwkoZmluZF91bndpbmRfZW50cnkpIGFkZGVkIHByb3RvdHlwZQorCisJKiBzb21zb2xpYi5jIChzb21fc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiBJbnRyb2R1Y2UgbmV3IGxvY2FsCisgCW1zeW1ib2wyIGFuZCBjaGFuZ2Ugc29tZSBtc3ltYm9sJ3MgdG8gbXN5bWJvbDIncyAtLSB3YXMgY2xvYmJlcmluZworIAltc3ltYm9sLCBwYXNzaW5nIGEgTlVMTCB0byBsb29rdXBfbWluaW1hbF9zeW1ib2xfc29saWJfdHJhbXBvbGluZSwKKwlhbmQgdWx0aW1hdGVseSBjb3JlIGR1bXBpbmcgd2l0aCBhIFNFR1YuCisKKwkqIHNvbXNvbGliLmM6IAorCUluY2x1ZGUgYXNzZXJ0LmgKKwkoc29tX3NvbGliX21hcHBlZF9lbnRyeSk6IEFkZGl0aW9uYWwgY29tbWVudHMgZm9yIHRleHRfYWRkciwgCisJdGV4dF9saW5rX2FkZHIsIHRleHRfZW5kLCBhbmQgdHNkX3N0YXJ0X2FkZHIgZmllbGRzLiBDb21tZW50aW5nCisJb3V0IDIgdHNkIGZpZWxkcywgX19kYXRhX3N0YXJ0IGFuZCBfX2RhdGFfZW5kLiAKKwkoc29tX3NvbGliX2FkZF9zb2xpYl9vYmpmaWxlKTogQWRkIHBhcmFtcyB0byBjYWxscyB0byBzeW1ib2xfZmlsZV9hZGQuCisJQWRkIHNvbWUgY29kZSBmb3IgZGlzdGluZ3Vpc2hpbmcgYmV0d2VlbiBhIHNoYXJlZCBsaWJyYXJ5IGFuZCBvdGhlciAKKwlvYmpmaWxlcy4gVGhpcyBhcHBlYXJzIHRvIGJlIGEgcHJlbHVkZSB0byB0aHJlYWQgbG9jYWwgc3RvcmFnZS4JCisJKHNvbV9zb2xpYl9sb2FkX3N5bWJvbHMpOiBDaGFuZ2VzIHRvIHByaW50ZiBzdGF0ZW1lbnQgCisJZW5jbG9zZWQgYnkgU09MSUJfREVCVUcgaWZkZWYuCisJKHNvbV9zb2xpYl9hZGQpOiBDaGFuZ2UgY29tbWVudCB0byBjb3JyZWN0bHkgc3BlY2lmeSBwYXRoCisJdG8gZW5kLm8gLS0gL29wdC9sYW5ndG9vbHMvbGliL2VuZC5vLiBjaGFuZ2VzIHRvIHByaW50ZiBzdGF0ZW1lbnQKKyAJZW5jbG9zZWQgYnkgU09MSUJfREVCVUcgaWZkZWYuCisJUmVtb3ZlZCBzZXZlcmFsIFNPTElCX0RFQlVHIGlmZGVmcyBhbmQgdGhlIGFzc29jaWF0ZWQgcHJpbnRmcy4KKwlBZGQgY29kZSB0byBmaW5kIHRoZSBzdGFydCBhZGRyZXNzIGZvciB0aGUgb2JqZWN0IGZpbGUncyB0aHJlYWQgCisJbG9jYWwgc3RvcmFnZQorCShzb21fc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiBGaXggd2FybmluZyBtZXNzYWdlcyB1c2UgY29ycmVjdAorCXBhdGggdG8gZW5kLm8gLS0gL29wdC9sYW5ndG9vbHMvbGliL2VuZC5vLiBDaGFuZ2UgY29udHJvbCBmbG93LiAKKwlObyBsb25nZXIgdXNlciBlYXJseSByZXR1cm5zIGZyb20gZnVuY3Rpb24gaXMgY2FzZXMgb2YgZXJyb3IuCisJKHJlc2V0X2luZmVyaW9yX3BpZCk6IE5ldyBmdW5jdGlvbgorCShzb21fc29saWJfcmVtb3ZlX2luZmVyaW9yX2hvb2spOiBOZXcgZnVuY3Rpb24KKwkoc29fbGliX3RocmVhZF9zdGFydF9hZGRyKTogTmV3IGZ1bmN0aW9uLiB1c2VkIGZvciB0c2QuCisKKwkqIHNvbXNvbGliLmM6IFJlbW92ZWQgcmVmZXJlbmNlcyB0byBBU1NFUlQgbWFjcm8uCisKKwkqIHNvbXNvbGliLmM6IEFkZCBkZWJ1Z2dpbmcgbWFjcm8uCisJKHN0cnVjdCBzb21fc29saWJfbWFwcGVkX2VudHJ5KTogQWRkIG5ldyBmaWVsZCB0c2Rfc3RhcnRfYWRkci4KKwkoc3RydWN0IHNvX2xpc3QpOiBBZGRlZCBuZXcgZmllbGQgc29saWJfYWRkci4KKwkoc29tX3NvbGliX2FkZF9zb2xpYl9vYmpmaWxlKTogTmV3IGZ1bmN0aW9uLiAKKwkoc29tX3NvbGliX2xvYWRfc3ltYm9scyk6IFJld3JpdHRlbi4KKwkoc29tX3NvbGliX2FkZCk6IE1ha2Ugc3VyZSB3ZSBkb24ndCBsb2FkIHRoZSBzeW1ib2xzIGluIGlmIHRoZSAKKwl0aHJlc2hvbGQgd2FzIGV4Y2VlZGVkLgorCShzb21fc29saWJfZ2V0X3NvbGliX2J5X3BjKTogTmV3IGZ1bmN0aW9uLiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YKKyAJaGFuZGxlIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4KKwkoc29tX3NvbGliX3Jlc3RhcnQpOiBEaXNhYmxlIGJyZWFrcG9pbnRzIGF0IHJlc3RhcnQuCisJKF9pbml0aWFsaXplX3NvbV9zb2xpYik6IFNldCB0aHJlc2hvbGQgdG8gMTAwIG1lZ2FieXRlcy4KKworCSogc29tc29saWIuYzogQWRkIGluY2x1ZGUgb2YgZmNudGwuaCBzbyB0aGF0IE9fUkRPTkxZIGlzIGRlZmluZWQuCisKKwkqIHNvbXNvbGliLmggKERJU0FCTEVfVU5TRVRUQUJMRV9CUkVBSyk6IE5ldyBtYWNyby4KKwkoUENfU09MSUIpOiBOZXcgbWFjcm8uCisKKwkqIHNvbXNvbGliLmg6IAorCShTT0xJQl9DUkVBVEVfQ0FUQ0hfTE9BRF9IT09LKTogRGVmaW5lCisJKFNPTElCX0NSRUFURV9DQVRDSF9VTkxPQURfSE9PSyk6IERlZmluZQorCShTT0xJQl9IQVZFX0xPQURfRVZFTlQpOiBEZWZpbmUKKwkoU09MSUJfTE9BREVEX0xJQlJBUllfUEFUSE5BTUUpOiBEZWZpbmUKKwkoU09MSUJfSEFWRV9VTkxPQURfRVZFTlQpOiBEZWZpbmUKKwkoU09MSUJfVU5MT0FERURfTElCUkFSWV9QQVRITkFNRSk6IERlZmluZQorCShTT0xJQl9JTl9EWU5BTUlDX0xJTktFUik6IERlZmluZQorCShTT0xJQl9SRVNUQVJUKTogRGVmaW5lCisKKwkqIHNvbXNvbGliLmg6IAorCShTT0xJQl9SRU1PVkVfSU5GRVJJT1JfSE9PSyk6IE5ldyBtYWNyby4gZGVmaW5lZCB0byB1c2UgCisJc29tX3NvbGliX3JlbW92ZV9pbmZlcmlvcl9ob29rLgorCisJKiBzb21zb2xpYi5oOiAKKwkoc29tX3NvbGliX2NyZWF0ZV9jYXRjaF9sb2FkX2hvb2spIAorCShzb21fc29saWJfY3JlYXRlX2NhdGNoX3VubG9hZF9ob29rKQorCShzb21fc29saWJfaGF2ZV9sb2FkX2V2ZW50KQorCShzb21fc29saWJfbG9hZGVkX2xpYnJhcnlfcGF0aG5hbWUpCisJKHNvbV9zb2xpYl9oYXZlX3VubG9hZF9ldmVudCkKKwkoc29tX3NvbGliX3VubG9hZGVkX2xpYnJhcnlfcGF0aG5hbWUpCisJKHNvbV9zb2xpYl9pbl9keW5hbWljX2xpbmtlcikKKwlGaXggcHJvdG90eXBlcyB0byB1c2UgdHlwZSBuYW1lcywgbm90IHBhcmFtZXRlciBuYW1lcy4KKworCSogc291cmNlLmMgKGZpbmRfc291cmNlX2xpbmVzKTogTWFrZSBub24gc3RhdGljLgorCShvcGVuX3NvdXJjZV9maWxlKTogRGl0dG8uCisJKHNvdXJjZV9mdWxsX3BhdGhfb2YpOiBOZXcgZnVuY3Rpb24uCisJKHByaW50X3NvdXJjZV9saW5lcyk6IFJlbmFtZSB0byBwcmludF9zb3VyY2VfbGluZXNfYmFzZSBhbmQgbWFrZQorCXN0YXRpYzsgZm9ybWF0dGluZy4KKwkocHJpbnRfc291cmNlX2xpbmVzKTogTmV3IGZ1bmN0aW9uLgorCShmb3J3YXJkX3NlYXJjaF9jb21tYW5kKTogVHVpIGNoYW5nZXMuCisJKHJldmVyc2Vfc2VhcmNoX2NvbW1hbmQpOiBUdWkgY2hhbmdlcy4KKwkoX2luaXRpYWxpemVfc291cmNlKTogQWRkIHhkYiBhbmQgZGJ4IGNvbXBhdGliaWxpdHkgY29tbWFuZHMuCisKKwkqIHNvdXJjZS5jIChsaXN0X2NvbW1hbmQpOiBIYW5kbGUgY2FzZSBvZiBvZGQgbnVtYmVyIG9mIHNvdXJjZSAKKwlsaW5lcyB0byBkaXNwbGF5LgorCisJKiBzb3VyY2UuYzogCisJKHNvdXJjZV9mdWxsX3BhdGhfb2YpOiBOZXcgZnVuY3Rpb24uIGZpbGUgd2FzIG92ZXJsb29rZWQKKwlpbiBtZXJnZSA7LS8uCisJCisJKiBzdGFjay5jIChmdW5jX2NvbW1hbmQpOiBNYWtlIGhpZ2ggYm91bmQgYmUgPCwgbm90IDw9LgorCisJKiBzdGFjay5jIChfaW5pdGlhbGl6ZV9zdGFjayk6IEZvciB0aGUgYmFja3RyYWNlIGNvbW1hbmQsIGRlbGV0ZQorCXRoZSBoZWxwIGxpbmUgYWJvdXQgdXNhZ2UsIHNpbmNlIHRoaXMgaGFzIHRvIGJlIGEgdmFsaWQgaGVscAorCW1lc3NhZ2UgZm9yIHRoZSAnd2hlcmUnIGNvbW1hbmQgdG9vLgorCQorCSogc3RhY2suYyAoY3VycmVudF9mcmFtZV9jb21tYW5kKTogQWRkIGEgY2hlY2sgZm9yIHRoZSAKKwlleGlzdGFuY2Ugb2YgYSBzdGFjay4gSWYgdGhlcmUgaXMgbm8gc3RhY2sgcHJvZHVjZSBhbgorCWVycm9yIG1lc3NhZ2UgYW5kIGV4aXQuCisJCisJKiBzdGFjay5jIChkb3duX3NpbGVudGx5X2Jhc2UsIHVwX3NpbGVudGx5X2Jhc2UsCisgCWFyZ3NfcGx1c19sb2NhbHNfaW5mbywgcHJpbnRfZnJhbWVfaW5mb19iYXNlLAorIAlwcmludF9zdGFja19mcmFtZV9iYXNlLCBwcmludF9zdGFja19mcmFtZV9iYXNlX3N0dWIpOiBEZWNsYXJlLgorCShwcmludF9mcmFtZV9sb2NhbF92YXJzKTogQWRkJ2wgcGFyYW1ldGVyLgorCShwcmludF9zdGFja19mcmFtZV9zdHViKTogTmV3IHZlcnNpb24gY3JlYXRlZCwgb2xkIHZlcnNpb24gcmVuYW1lZAorIAl0byBzaG93X2FuZF9wcmludF9zdGFja19mcmFtZV9iYXNlX3N0dWIuCisJKHByaW50X3N0YWNrX2ZyYW1lX2Jhc2Vfc3R1YiwgcHJpbnRfb25seV9zdGFja19mcmFtZV9zdHViLAorIAlzaG93X2FuZF9wcmludF9zdGFja19mcmFtZSwgcHJpbnRfb25seV9zdGFja19mcmFtZSwKKyAJc3RhY2tfcHVibGlzaF9zdG9wcGVkX3dpdGhfbm9fZnJhbWUsIHByaW50X2ZyYW1lX2luZm8sCisgCXNob3dfc3RhY2tfZnJhbWUsIGJhY2t0cmFjZV9mdWxsX2NvbW1hbmQsIGFyZ3NfcGx1c19sb2NhbHNfaW5mbywKKwlzZWxlY3RfYW5kX3ByaW50X2ZyYW1lLCBzZWxlY3RfYW5kX21heWJlX3ByaW50X2ZyYW1lLAorCWN1cnJlbnRfZnJhbWVfY29tbWFuZCwgZnVuY19jb21tYW5kKTogTmV3IGZ1bmN0aW9ucy4KKwkoYmFja3RyYWNlX2NvbW1hbmQpOiBOZXcgZnVuY3Rpb24sIG9sZCByZW5hbWVkIHRvCisJYmFja3RyYWNlX2NvbW1hbmRfMS4KKwkocHJpbnRfYmxvY2tfZnJhbWVfbG9jYWxzLCBwcmludF9mcmFtZV9sb2NhbF92YXJzKTogQWRkaXRpb25hbAorCXBhcmFtZXRlciwgbnVtYmVyIG9mIHRhYnMuCisJKHVwX3NpbGVudGx5X2NvbW1hbmQpOiBOZXcgZnVuY3Rpb24sIG9sZCByZW5hbWVkIHRvCisJdXBfc2lsZW50bHlfY29tbWFuZF9iYXNlLgorCShkb3duX3NpbGVudGx5X2NvbW1hbmQpOiBOZXcgZnVuY3Rpb24sIG9sZCByZW5hbWVkIHRvCisJZG93bl9zaWxlbnRseV9iYXNlLgorCShfaW5pdGlhbGl6ZV9zdGFjayk6IFJlZ2lzdGVyIG5ldyBjb21tYW5kcyBiYXNlZCBvbiB2YWx1ZXMgb2YKKwl4ZGJfY29tbWFuZHMgYW5kIGRieF9jb21tYW5kcyB2YXJpYWJsZXMuCisJCisJKiBzdGFjay5jIChmdW5jX2NvbW1hbmQpOiBNYWtlIGhpZ2ggYm91bmQgYmUgPCwgbm90IDw9LgorCQorCSogc3RhY2suYyAocGFyc2VfZnJhbWVfc3BlY2lmaWNhdGlvbik6IEZpeCBwcm90b3R5cGUgdG8gbWF0Y2gKKwlmdW5jdGlvbiBkZWZpbml0aW9uLgorCShzaG93X2FuZF9wcmludF9zdGFja19mcmFtZV9zdHViKTogRml4IG5hbWUuCisJKHNlbGVjdF9hbmRfcHJpbnRfZnJhbWUpOiBDaGFuZ2UgdW5jYXVnaHQgdHVpRE8gY2FsbC4KKwkKKwkqIHN0YWNrLmMgKHVwX3NpbGVudF9iYXNlKTogUmVuYW1lIGZyb20gdXBfc2lsZW50bHlfY29tbWFuZF9iYXNlLgorCQorCSogc3ltZmlsZS5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogT25seSBjYWxsIFNPTElCX1JFU1RBUlQgaWYgaXQncworCWRlZmluZWQuCisKKwkqIHN5bWZpbGUuYyAoYWRkX3BzeW1ib2xfd2l0aF9kZW1fbmFtZV90b19saXN0KTogTmV3IGZ1bmN0aW9uLgorCUFkZHMgYSBzeW1ib2wgd2l0aCBhIGxvbmcgdmFsdWUgdG8gYSBwc3ltdGFiLiBEaWZmZXJzIGZyb20gCisJYWRkX3BzeW1ib2xfdG9fbGlzdCBpbiB0YWtpbmcgYm90aCBhIG1hbmdsZWQgYW5kIGEgZGVtYW5nbGVkIG5hbWUuCisJCisJKiBzeW1maWxlLmMgKGNvbXBhcmVfcHN5bWJvbHMpOiBDYWxsIHN0cmNtcCBkaXJlY3RseSwgaW5zdGVhZCBvZgorCXVzaW5nIG1hY3JvLgorCQorCSogc3ltZmlsZS5jIChzeW1ib2xfZmlsZV9hZGQpOiBSZWluZGVudCBwb3J0aW9ucy4KKwkoc3ltYm9sX2ZpbGVfY29tbWFuZCk6IEFkZCBjYWxsIHRvIHR1aURvLgorCQorCSogc3ltZmlsZS5jIChzeW1ib2xfZmlsZV9jb21tYW5kKTogT25seSBjYWxsIFNPTElCX1JFU1RBUlQgaWYgaXQncworCWRlZmluZWQuCisKKwkqIHN5bWZpbGUuYyAoc3ltZmlsZV9iZmRfb3Blbik6IEFkZCBjb2RlIHRvIGNhbGwgUFhEQiBvbiBocHV4LCBpZgorCXRoZSBmaWxlIGhhcyBub3QgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBieSBweGRiLgorCUFkZGVkIGRlZmluZSBVU0VfUFhEQi4KKwkKKwkqIHN5bWZpbGUuYyAoc3ltZmlsZV9iZmRfb3Blbik6IENoYW5nZSBwYXJlbnRoZXNpcyBwb3NpdGlvbmluZworCWFyb3VuZCBjYWxsIHRvIGhwcmVhZF9weGRiX2NoZWNrLgorCQorCSogc3ltZmlsZS5jIChzeW1maWxlX2JmZF9vcGVuKTogTWFrZSBub3Qgc3RhdGljLiAKKwkoUkVTRVRfSFBfVVhfR0xPQkFMUyk6IE5ldyBtYWNyby4gUmVzZXRzIGdsb2JhbHMgd2hlbiBuZXcgc3ltYm9sCisJZmlsZSBsb2FkZWQuCisJKFVTRV9QWERCKTogTm90IG5lZWRlZC4gUmVtb3ZlZC4KKwkoc3ltYm9sX2ZpbGVfYWRkKTogQWRkIEhQIHNwZWNpZmljIGNvZGUgdG8gZGVhbCB3aXRoIHB4ZGIuCisJKHN5bWJvbF9maWxlX2NvbW1hbmQpOiBSZXNldCBIUCBzcGVjaWZpYyBnbG9iYWxzIGlmIG5ldyBzeW1ib2wgZmlsZQorCWxvYWRlZC4KKwkoc3ltZmlsZV9iZmRfb3Blbik6IENvbW1lbnQgb3V0IGNoZWNraW5nIGZvciBweGRiLgorCShyZXJlYWRfc3ltYm9scyk6IFJlc2V0IEhQIHNwZWNpZmljIGdsb2JhbHMuCisJCisJKiBzeW1maWxlLmMgKHN5bWZpbGVfYmZkX29wZW4pOiBVbmNvbW1lbnQgaHB1cyBzcGVjaWZpYyBjb2RlLgorCQorCSogc3ltZmlsZS5jOiAKKwkoc3ltYm9sX2ZpbGVfYWRkKTogQWRkIHVzZXJfbG9hZGVkIGFuZCBpc19zb2xpYiBwYXJhbWV0ZXJzLgorCWZpeGVkIG51bWJlciBvZiBwYXJhbWV0ZXJzIGluIGNhbGwgdG8gYWxsb2NhdGVfb2JqZmlsZQorCShzeW1ib2xfZmlsZV9jb21tYW5kKTogQWRkZWQgY2FsbCB0byBTT0xJQl9SRVNUQVJUIG1hY3JvLgorCWZpeGVkIG51bWJlciBvZiBwYXJhbWV0ZXJzIGluIGNhbGxzIHRvIHN5bWJvbF9maWxlX2FkZC4KKwkoYWRkX3N5bWJvbF9maWxlX2NvbW1hbmQpOiBGaXhlZCBudW1iZXIgb2YgcGFyYW1ldGVycyBpbiBjYWxscyB0byAKKwlzeW1ib2xfZmlsZV9hZGQuCisJCisJKiBzeW1maWxlLmM6IEFkZGVkIHByb3RvdHlwZSBmb3IgaHByZWFkX3B4ZGJfY2hlY2suCisJCisJKiBzeW1maWxlLmM6IENoYW5nZWQgSFBVWF9TTkFQMSBpZmRlZiB0byBIUFVYSFBQQS4gZW5jbG9zZWQgY2FsbHMgdG8gCisJICBSRVNFVF9IUF9VWF9HTE9CQUxTIHdpdGggYW4gSFBVWEhQUEEgaWZkZWYKKwkKKwkqIHN5bWZpbGUuaCAoc3ltZmlsZV9iZmRfb3Blbik6IEFkZCBwcm90cHR5cGUuCisJCisJKiBzeW1maWxlLmg6IEFkZCBwcm90b3R5cGUgZm9yIGFkZF9wc3ltYm9sX3dpdGhfZGVtX25hbWVfdG9fbGlzdC4KKwkKKwkqIHN5bWZpbGUuaDogQ2xhcmlmeSBwdXJwb3NlIG9mIGF1dG9fc29saWJfYWRkLgorCQorCSogc3ltbWlzYy5jIChtYWludGVuYW5jZV9wcmludF9zeW1ib2xzKTogQ2FsbCBnZGJfZmNsb3NlLCBub3QKKwlmY2xvc2Ugb24gYSBHREJfRklMRSogZHVyaW5nIGNsZWFudXAuCisJKG1haW50ZW5hbmNlX3ByaW50X3BzeW1ib2xzKTogQ2FsbCBnZGJfZmNsb3NlLCBub3QgZmNsb3NlIG9uIGEKKwlHREJfRklMRSogZHVyaW5nIGNsZWFudXAuCisJKG1haW50ZW5hbmNlX3ByaW50X21zeW1ib2xzKTogQ2FsbCBnZGJfZmNsb3NlLCBub3QgZmNsb3NlIG9uIGEKKwlHREJfRklMRSogZHVyaW5nIGNsZWFudXAuCisJCisJKiBzeW1taXNjLmMgKG1haW50ZW5hbmNlX3ByaW50X3N5bWJvbHMpOiBHZGJfZmNsb3NlIG5vdyB0YWtlcyBhCisJR0RCX0ZJTEUgKiogcGFyYW1ldGVyLiBGaXggdGhlIGxvY2FsIEdEQl9GSUxFIHZhcmlhYmxlcyBhbmQgdGhlIAorCWNhbGwgdG8gbWFrZV9jbGVhbnVwLgorCShtYWludGVuYW5jZV9wcmludF9wc3ltYm9scyk6IERpdHRvCisJKG1haW50ZW5hbmNlX3ByaW50X21zeW1ib2xzKTogRGl0dG8KKwkKKwkqIHN5bW1pc2MuYyAocHJpbnRfb2JqZmlsZV9zdGF0aXN0aWNzKTogQ2xvc2UgcXVvdGVzIGluIAorCW91dHB1dCBzdHJpbmdzLgorCisJKiBzeW1taXNjLmM6IAorCShQcmludF9zeW1ib2wpOiBBZGQgTE9DX0lORElSRUNUIHRvIHN3aXRjaCBzdGF0ZW1lbnQKKwkocHJpbnRfcGFydGlhbF9zeW1ib2xzKTogQWRkIExPQ19JTkRJUkVDVCB0byBzd2l0Y2ggc3RhdGVtZW50CisKKwkqIHN5bXRhYi5jIChmaW5kX3BjX3NlY3RfcHN5bXRhYik6IEhpZ2ggYm91bmRzIHNob3VsZCBiZSA8LCBub3QgPD0uCisJKGZpbmRfcGNfc2VjdF9zeW10YWIpOiBEaXR0by4KKworCSogc3ltdGFiLmMgKGhwX3NvbV9zb21fb2JqZWN0X3ByZXNlbnQpOiBOZXcgZmxhZyB0byBpbmRpY2F0ZSBIUCAKKwljb21waWxlZCBjb2RlLgorCShmaW5kX3BjX3NlY3RfcHN5bXRhYik6IENoYW5nZSB0ZXN0cyB0byBtYWtlIHN1cmUgd2UgYXJlIGNoZWNraW5nCisJdGhlIHRleHRoaWdoIGFkcmVzcyBhcyB3ZWxsLgorCShsb29rdXBfdHJhbnNwYXJlbnRfdHlwZSk6IE5ldyBmdW5jdGlvbi4gIExvb2sgdXAgYSB0eXBlIG5hbWUKKwlpbiB0aGUgc3RydWN0X25hbWVzcGFjZS4gIFRoZSB0eXBlIHJldHVybmVkIG11c3Qgbm90IGJlIG9wYXF1ZS4KKwkoZmluZF9wY19zZWN0X3N5bXRhYik6IE1ha2Ugc3VyZSB3ZSBjaGVjayB0aGUgYWRkcmVzcyAncGMnIGl0c2VsZiwKKwl0b28uCisJKGZpbmRfYWRkcl9zeW1ib2wpOiBQcmVwYXJlIHRvIGhhbmRsZSBMT0NfSU5ESVJFQ1QgYWRkcmVzcyBjbGFzcywgYnV0CisgCWxlYXZlIGl0IGNvbW1lbnRlZCBvdXQuCisJKGZpbmRfcGNfc2VjdF9saW5lKTogUmV0dXJuIGNvcnJlY3QgaW5mb3JtYXRpb24gaWYgcGMgaXMgaW4gaW1wb3J0CisJb3IgZXhwb3J0IHN0dWIgKHRyYW1wb2xpbmUpLgorCShkZWNvZGVfbGluZV8xKTogU2tpcCB0d28gY2hhcnMsIGlmIHRoZXkgYXJlICckJCcuIExpa2UgZm9yIEhQJ3MKKwkkJGR5bmNhbGwuIEhhbmRsZSBjYXNlcyBpbiB3aGljaCB2YXJhaWJsZSBhbmQgZnVuY3Rpb24gbmFtZXMgY2FuIHN0YXJ0IAorCXdpdGggJC4KKwkob3ZlcmxvYWRfbGlzdF9hZGRfc3ltYm9sKTogSWYgY2Fubm90IGRlbWFuZ2xlIG5hbWUsIHVzZSBpdCBhcyBpcy4KKwlGcmVlIHN0cmluZyBhZnRlciB1c2UuCisJKG1ha2Vfc3ltYm9sX292ZXJsb2FkX2xpc3QpOiBJbml0aWFsaXplIG9sb2FkX25hbWUgdG8gTlVMTCBhbmQgCisJb2xvYWRfbmFtZV9sZW4gdG8gMC4gSWYgZGVtYW5nbGUgbm90IHN1Y2Nlc3NmdWwsIHVzZSBuYW1lIGFzIGl0IGlzLgorCUZyZWUgc3RyaW5nIGFmdGVyIHVzZS4KKworCSogc3ltdGFiLmMgKGxvb2t1cF9zeW1ib2wpOiBDaGFuZ2VkIGNhbGwgdG8gZmluZF9wY19zZWN0X3N5bXRhYiwKKyAJdG8gdGhlIG9yaWdpbmFsIGZpbmRfcGNfc3ltdGFiLCBpbiBIUCBhZGRlZCBmcmFnbWVudC4KKworCSogc3ltdGFiLmMgKGxvb2t1cF9zeW1ib2wpOiBDaGFuZ2UgSFBVWF9TTkFQMSBpZmRlZiB0byBhIEhQVVhIUFBBIGlmZGVmCisKKwkqIHN5bXRhYi5jIChsb29rdXBfc3ltYm9sKTogSWZkZWYgdGhlIHNlYXJjaGluZyBvZiBzeW1ib2wgaW4gdGhlIAorCW1pbmltYWwgc3ltYm9sIHRhYmxlcywgZm9yIGhwdXggd2UgbW92ZSB0aGlzIGNoZWNrIGF0IHRoZSBlbmQgCisJb2YgdGhlIGZ1bmN0aW9uLgorCUJlZm9yZSB3ZSBlcnJvciBvdXQgaWYgc3ltYm9sIGlzIG5vdCBmb3VuZCBpbiB0aGUgc3ltdGFiLCBsb29rIAorCWluIHRoZSBzdGF0aWNzLiAKKwlCZWZvcmUgZXJyb3Jpbmcgb3V0IGlmIHN0YXRpYyBzeW1ib2wgbm90IGZvdW5kIGxvb2sgaW4gdGhlIGdsb2JhbHMuCisKKwkqIHN5bXRhYi5jIChsb29rdXBfc3ltYm9sKTogUmV0dXJuIHN5bWJvbCBhcyBzb29uIGFzIGZvdW5kLgorCShkZWNvZGVfbGluZV8xKTogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGEgY29uZGl0aW9uYWwgYnJlYWsuIFRlbXBvcmFyaWx5CisJcmVtb3ZlIGl0IGZyb20gdGhlIGxpbmUsIHRvIG5vdCBjb25mdXJlIHBlcmVudGhlc2lzIGNoZWNraW5nLgorCUhhbmRsZSBuYW1lc3BhY2VzLgorCShvdmVybG9hZF9saXN0X2FkZF9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uIE92ZXJsb2FkCisJcmVzb2x1dGlvbiBzdXBwb3J0LgorCShtYWtlX3N5bWJvbF9vdmVybG9hZF9saXN0KTogRGl0dG8uCisJCisJKiBzeW10YWIuYzogCisJKGZpbmRfdGVtcGxhdGVfbmFtZV9lbmQpOiBOZXcgcHJvdG90eXBlIGRlY2wuCisJKGxvb2t1cF9zeW1ib2wpOiAgV2hlbiBhIGdsb2JhbCBvciBzdGF0aWMgc3ltYm9sIHNob3dzIHVwIGluIHRoZSAKKwlwc3ltdGFiIHRhYmxlLCBidXQgbm90IHRoZSBzeW10YWIgdGFibGUsIHRlbGwgdGhlIHVzZXIgdGhhdAorCXRoZSBzeW1ib2wgbWF5IGJlIGFuIGlubGluZWQgZnVuY3Rpb24gb3IgYSB0ZW1wbGF0ZSBmdW5jdGlvbiBhbmQKKwlwcm92aWRlIHNvbWUgZ3VpZGFuY2UgdG8gdGhlIHVzZXIgYWJvdXQgaG93IHRvIG1vcmUgZnVsbHkgCisJc3BlY2lmeSB0aGUgc3ltYm9sLgorCShsb29rdXBfdHJhbnNwYXJlbnRfdHlwZSk6ICBXaGVuIGEgZ2xvYmFsIG9yIHN0YXRpYyBzeW1ib2wgc2hvd3MgdXAgCisJaW4gdGhlIHBzeW10YWIgdGFibGUsIGJ1dCBub3QgdGhlIHN5bXRhYiB0YWJsZSwgdGVsbCB0aGUgdXNlciB0aGF0CisJdGhlIHN5bWJvbCBtYXkgYmUgYW4gaW5saW5lZCBmdW5jdGlvbiBvciBhIHRlbXBsYXRlIGZ1bmN0aW9uIGFuZAorCXByb3ZpZGUgc29tZSBndWlkYW5jZSB0byB0aGUgdXNlciBhYm91dCBob3cgdG8gbW9yZSBmdWxseSAKKwlzcGVjaWZ5IHRoZSBzeW1ib2wuIAorCShkZWNvZGVfbGluZV8xKTogSGFuZGxlIHRlbXBsYXRlIGZ1bmN0aW9uIHNwZWNpZmljYXRpb24gd2hlbiBkZWNvZGluZyBhCisJbGluZS4gTWF5IG5lZWQgdG8gYmUgaWZkZWZlZCBmb3IgSFAncyBhQ0M/CisJKF9pbml0aWFsaXplX3N5bXRhYik6IEhhbmRsZSBkYnggY29tbWFuZHMuCisKKwkqIHN5bXRhYi5oIChhZGRyZXNzX2NsYXNzKTogQWRkIG5ldyBhZGRyZXNzIGNhbHNzIGZvciAKKwlMT0NfVEhSRUFEX0xPQ0FMX1NUQVRJQyBhbmQgTE9DX0lORElSRUNULgorCShsb29rdXBfdHJhbnNwYXJlbnRfdHlwZSk6IEFkZCBwcm90b3R5cGUuCisJKGV4Y2VwdGlvbl9ldmVudF9raW5kKTogTmV3IGVudW0gZm9yIGV4Y2VwdGlvbiBjYXRjaHBvaW50cy4KKwkoZXhjZXB0aW9uX2V2ZW50X3JlY29yZCk6IE5ldyBzdHJ1Y3R1cmUgZm9yIGV4Y2VwdGlvbiBjYXRjaHBvaW50cy4KKwkoQ1VSUkVOVF9FWENFUFRJT05fS0lORCk6IE5ldyBtYWNyby4KKwkoQ1VSUkVOVF9FWENFUFRJT05fQ0FUQ0hfU0FMKTogTmV3IG1hY3JvLiAKKwkoQ1VSUkVOVF9FWENFUFRJT05fQ0FUQ0hfTElORSk6IE5ldyBtYWNyby4gCisJKENVUlJFTlRfRVhDRVBUSU9OX0NBVENIX0ZJTEUpOiBOZXcgbWFjcm8uIAorCShDVVJSRU5UX0VYQ0VQVElPTl9DQVRDSF9QQyk6IE5ldyBtYWNyby4gCisJKENVUlJFTlRfRVhDRVBUSU9OX1RIUk9XX1NBTCk6IE5ldyBtYWNyby4gCisJKENVUlJFTlRfRVhDRVBUSU9OX1RIUk9XX0xJTkUpOiBOZXcgbWFjcm8uIAorCShDVVJSRU5UX0VYQ0VQVElPTl9USFJPV19GSUxFKSBuZXcgbWFjcm8uOiAKKwkoQ3VycmVudF9FWENFUFRJT05fVEhST1dfUEMpOiBOZXcgbWFjcm8uIAorCisJKiBzeW10YWIuaChtYWtlX3N5bWJvbF9vdmVybG9hZF9saXN0KTogQWRkIHByb3RvdHlwZS4KKworCSogc3ltdGFiLmg6IAorCShzeW1ib2xfZmlsZV9hZGQpOiBBZGQgbmV3IHBhcmFtcyB0byBmdW5jdGlvbiBkZWNsLgorCisJKiB0YXJnZXQuYyAoY2xlYW51cF90YXJnZXQpOiBDaGFuZ2VkIGNhc3Rpbmcgb2YgZGVmYXVsdCBmdW5jdGlvbnMgZm9yCisJdG9faGFzX2ZvcmtlZCwgdG9faGFzX3Zmb3JrZWQsIHRvX3BpZF90b19leGVjX2ZpbGUgdG8gZ2V0IHJpZCBvZgorCXdhcm5pbmdzLgorCisJKiB0YXJnZXQuYyAoY2xlYW51cF90YXJnZXQpOiBDaGFuZ2VkIHRoZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IKKwkgIHRvX3BpZF90b19leGVjX2ZpbGUgYW5kIHRvX2NvcmVfZmlsZV90b19zeW1fZmlsZQorCisJKiB0YXJnZXQuYyAoY2xlYW51cF90YXJnZXQpOiBGaXhlZCBQQVJBTVMgZm9yIHRvX2hhc19zeXNjYWxsX2V2ZW50CisKKwkqIHRhcmdldC5jIChjbGVhbnVwX3RhcmdldCk6IFN5bnRheCBlcnJvciwgbWlzbWF0Y2hlZCBwYXJhbnRoZXNpcy4KKworCSogdGFyZ2V0LmM6IAorCSAgKERlZmF1bHRfY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvcik6IE5ldyBmdW5jdCBwcm90b3R5cGUgZGVjbGFyYXRpb24KKwkgICAgYW5kIGZ1bmN0aW9uIGRlZmluaXRpb24KKwkgIChkdW1teV90YXJnZXQpOiBNb3JlIHRhcmdldF9vcHMgdmVjdG9yIGNoYW5nZXMgZm9yIEhQVVgKKwkgICAgIG5ldyBmaWVsZHMuIGlmZGVmZWQgZm9yIEhQVVhfU05BUDIuIE5ldyBmaWVsZHMgYXJlCisJICAgICB0b19wb3N0X3dhaXQsIHRvX3Bvc3Rfc3RhcnR1cF9pbmZlcmlvcgorCSAgICAgdG9fYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvciwgdG9fY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciwKKwkgICAgIHRvX3Bvc3RfZm9sbG93X2luZmVyaW9yX2J5X2Nsb25lLCAgdG9fY3JlYXRlX2NhdGNoX2ZvcmtfaG9vaywKKwkgICAgIHRvX2NyZWF0ZV9jYXRjaF92Zm9ya19ob29rLCB0b19oYXNfZm9ya2VkLCB0b19oYXNfdmZvcmtlZCwKKwkgICAgIHRvX3Bvc3RfZm9sbG93X3Zmb3JrLCB0b19waWRfdG9fZXhlY19maWxlCisJICAoZGVfZmF1bHQpOiBBZGQgbmV3IEhQVVggc3BlY2lmaWMgdGFyZ2V0X29wcyBvcGVyYXRpb25zIHRvCisgIAkgICAgIHRoZSBkZV9mYXVsdCBtYWNybworCSAgKElOSEVSSVQpOiBBZGQgbmV3IEhQVVggc3BlY2lmaWMgdGFyZ2V0X29wcyBvcGVyYXRpb25zIHRvIHRoZQorCSAgICAgSU5IRVJJVCBtYWNybworCSAgKGZpbmRfZGVmYXVsdF9jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yKTogTmV3IGZ1bmN0IGRlZmluaXRpb24KKwkgIChkZWJ1Z190b19wb3N0X3dhaXQpOiBOZXcgZnVuY3QKKwkgIChkZWJ1Z190b19wb3N0X3N0YXJ0dXBfaW5mZXJpb3IpOiBOZXcgZnVuY3QKKwkgIChkZWJ1Z190b19hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yKTogTmV3IGZ1bmN0CisJICAoZGVidWdfdG9fY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvcik6IE5ldyBmdW5jdAorCSAgKGRlYnVnX3RvX3Bvc3RfZm9sbG93X2luZmVyaW9yX2J5X2Nsb25lKTogTmV3IGZ1bmN0CisJICAoZGVidWdfdG9fY3JlYXRlX2NhdGNoX2ZvcmtfaG9vayk6IE5ldyBmdW5jdAorCSAgKGRlYnVnX3RvX2NyZWF0ZV9jYXRjaF92Zm9ya19ob29rKTogTmV3IGZ1bmN0CisJICAoZGVidWdfdG9faGFzX2ZvcmtlZCk6IE5ldyBmdW5jdAorCSAgKGRlYnVnX3RvX2hhc192Zm9ya2VkKTogTmV3IGZ1bmN0CisJICAoZGVidWdfdG9fcG9zdF9mb2xsb3dfdmZvcmspOiBOZXcgZnVuY3QKKwkgIChzZXR1cF90YXJnZXRfZGVidWcpOiBJbml0aWFsaXplIG5ldyB0YXJnZXRfb3BzIHZlY3RvciBmaWVsZHMuCisKKwkqIHRhcmdldC5jOiAKKwkoQ2xlYW51cF90YXJnZXQpOiBGaXhlZCB0aGUgcmV0dXJuIHR5cGUgb24gYSBmZXcgb2YgdGhlIAorCSAgZGVmYXVsdCBmdW5jdGlvbiB2YWx1ZXMuCisKKwkqIHRhcmdldC5jOiAKKwkoRHVtbXlfdGFyZ2V0KTogQWRkIDMgbmV3IGZpZWxkcworCShub3N1cHBvcnRfcnVudGltZSk6IE5ldyBmdW5jdGlvbiwgdXNlZCBpbiBjbGVhbnVwX3RhcmdldAorCShjbGVhbnVwX3RhcmdldCk6IENoYW5nZXMgaW4gdGhlIGRlX2ZhdWx0IG1hY3JvLCBib3RoIHRvCisJYWNjb21vZGF0ZSB0aGUgbmV3IHRhcmdldF9vcHMgdmVjdG9yIGZpZWxkcyBhbmQgdG8gdXNlCisJbW9yZSBhY2N1cmF0ZSBkZWZhdWx0IGZ1bmN0aW9ucy4KKwkodXBkYXRlX2N1cnJlbnRfdGFyZ2V0KTogQWRkIG5ldyB0YXJnZXRfb3BzIHZlY3RvciBmaWVsZHMgdG8gdGhlIAorCUlOSEVSSVQgbWFjcm8KKwkoZ2VuZXJpY19tb3Vybl9pbmZlcmlvcik6IFRoZSBjYWxsIHRvIGJyZWFrcG9pbnRfaW5pdF9pbmZlcmlvciBub3cgdGFrZXMgYSAKKwlwYXJhbWV0ZXIKKwkobm9ybWFsX3BpZF90b19zdHIpOiBBZGRpbmcgYSBcMCB0byB0aGUgZW5kIG9mIGJ1Zi4KKwkoZGVidWdfdG9faGFzX3N5c2NhbGxfZXZlbnQpOiBOZXcgZnVuYworCShkZWJ1Z190b19lbmFibGVfZXhjZXB0aW9uX2NhbGxiYWNrKTogTmV3IGZ1bmMKKwkoZGVidWdfdG9fZ2V0X2N1cnJlbnRfZXhjZXB0aW9uX2V2ZW50KTogTmV3IGZ1bmMKKwkoc2V0dXBfdGFyZ2V0X2RlYnVnKTogSW5pdGlhbGl6ZSB0aGUgMyBuZXcgdGFyZ2V0X29wcyB2ZWN0b3IgZmllbGRzCisKKwkqIHRhcmdldC5jOiAKKwkoU3RydWN0IHNpZ25hbHMpOiBGaXggbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggU0lHUkVUUkFDVC4KKworCSogdGFyZ2V0LmM6IAorCSAgKER1bW15X3RhcmdldCk6IEZpeCBzeW50YXggZXJyb3IKKwkgIChjbGVhbnVwX3RhcmdldCk6IENoYW5nZWQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgbmV3IAorCSAgICAgdGFyZ2V0X29wcyB2ZWN0b3IgZmllbGRzLiBIUCBmb2xrcyBpbmFwcHJvcHJpYXRlbHkgc2V0CisJICAgICBtb3N0IG9mIHRoZW0gdG8gbm9wcm9jZXNzKCkuIFRoZXkgc2hvdWxkIGJlIGEgbWl4dHVyZQorCSAgICAgb2YgaWdub3JlKCkgYW5kIHJldHVybl96ZXJvKCkuCisKKwkqIHRhcmdldC5jOiAKKwkoRHVtbXlfdGFyZ2V0KTogQWRkIG5ldyB0YXJnZXRfb3BzIHZlY3RvciBmaWVsZHMgYW5kIHRoZWlyIGluaXRpYWxpemF0aW9ucworCShjbGVhbnVwX3RhcmdldCk6IEFkZGVkIG5ldyBuZXcgdGFyZ2V0X29wcyB2ZWN0b3IgZmllbGRzIHRvIHRoZSBkZV9mYXVsdCAKKwkgIG1hY3JvIGRlZmluaXRpb24uCisJKHVwZGF0ZV9jdXJyZW50X3RhcmdldCk6IEFkZGVkIG5ldyBuZXcgdGFyZ2V0X29wcyB2ZWN0b3IgZmllbGRzIHRvIHRoZSBJTkhFUklUIAorCSAgbWFjcm8gZGVmaW5pdGlvbgorCShyZXR1cm5fb25lKTogTmV3IGZ1bmN0aW9uLCB1c2VkIGJ5IHRoZSBkZV9mYXVsdCBtYWNybworCShkZWJ1Z190b19wb3N0X2F0dGFjaCk6IE5ldyBmdW5jdGlvbgorCShkZWJ1Z190b193YWl0KTogQWRkZWQgbmV3IGNhc2VzOiBUYXJnZXRfV0FJVEtJTkRfRk9SS0VELCBUQVJHRVRfV0FJVEtJTkRfVkZPUktFRCwKKwkgIFRBUkdFVF9XQUlUS0lORF9FWEVDRAorCShkZWJ1Z190b19pbnNlcnRfZm9ya19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uCisJKGRlYnVnX3RvX3JlbW92ZV9mb3JrX2NhdGNocG9pbnQpOiBOZXcgZnVuY3Rpb24KKwkoZGVidWdfdG9faW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQpOiBOZXcgZnVuY3Rpb24gCisJKGRlYnVnX3RvX3JlbW92ZV92Zm9ya19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uCisJKGRlYnVnX3RvX2Nhbl9mb2xsb3dfdmZvcmtfcHJpb3JfdG9fZXhlYyk6IE5ldyBmdW5jdGlvbgorCShkZWJ1Z190b19pbnNlcnRfZXhlY19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uIAorCShkZWJ1Z190b19yZW1vdmVfZXhlY19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uCisJKGRlYnVnX3RvX2NvcmVfZmlsZV90b19zeW1fZmlsZSk6IE5ldyBmdW5jdGlvbgorCShzZXR1cF90YXJnZXRfZGVidWcpOiBHaXZlIG5ldyBmaWVsZHMgaW4gY3VycmVudF90YXJnZXQgdGFyZ2V0X29wcyB2ZWN0b3IgdmFsdWVzLgorCisJKiB0YXJnZXQuYzogSHAgbWVyZ2UsIDQvMTUvOTggc25hcHNob3QKKwkgIFRoZXJlIGFyZSBuZXcgdGFyZ2V0X29wcyBmaWVsZHMgdGhhdCBwZXJ0YWluIG9ubHkKKwkgIHRvIEhQVVguIEFsbCB0aGUgY2hhbmdlcyByZWxhdGUgdG8gdGhpcy4gRmlyc3QsCisJICBuZXcgZmllbGRzIGFyZSBhZGRlZCB0byB0aGUgZHVtbXlfdGFyZ2V0IHRhcmdldF9vcHMKKyAJICB2ZWN0b3I6IFRvX3JlcXVpcmVfYXR0YWNoLCB0b19yZXF1aXJlX2RldGFjaC4KKworCSogdGFyZ2V0LmM6IFJlbW92ZSBIUFVYX1NOQVAxIGFuZCBIUFVYX1NOQVAyIGlmZGVmcworCisJKiB0aHJlYWQuYyAoaW5mb190aHJlYWRzX2NvbW1hbmQpOiBDYWxsIHByaW50X29ubHlfc3RhY2tfZnJhbWUKKwlpbnN0ZWFkIG9mIHByaW50X3N0YWNrX2ZyYW1lLgorCShfaW5pdGlhbGl6ZV90aHJlYWQpOiBNYWtlIHQgYW4gYWxpYXMgZm9yIHRocmVhZCBvbmx5IGlmCisJeGRiX2NvbW1hbmRzIGlzIG5vdCBzZXQuCisKKwkqIHRocmVhZC5jICh0aHJlYWRfY29tbWFuZCk6IElmIG5vIGFyZ3VtZW50cywgZG9uJ3QgZ2VuZXJhdGUgYW4KKwllcnJvciwgaW5zdGVhZCB0ZWxsIHRoZSB1c2VyIHdoaWNoIHRocmVhZCBpcyBjdXJyZW50LgorCShpbmZvX3RocmVhZHNfY29tbWFuZHMpOiBEb24ndCBsb3NlIHRoZSB1c2VycyBwb3NpdGlvbiB3aXRoaW4gdGhlCisJY3VycmVudCB0aHJlYWQgLS0gcmVtZW1iZXIgaXQgYW5kIHRoZW4gcmVzdG9yZSBpdC4KKworCSogdGhyZWFkLmM6IAorCShzdHJ1Y3QgdGhyZWFkX2luZm8pOiBBZGQgc3RlcHBpbmdfdGhyb3VnaF9zaWd0cmFtcCBmaWVsZAorCShhZGRfdGhyZWFkKTogSW5pdGlhbGl6ZSBzdGVwcGluZ190aHJvdWdoX3NpZ3RyYW1wIGZpZWxkCisJKGxvYWRfaW5mcnVuX3N0YXRlKTogQWRkIHN0ZXBwaW5nX3Rocm91Z2hfc2lndHJhbXAgcGFyYW0gYW5kCisJbWFrZSBzdXJlIGl0IGdldHMgYXNzaWduZWQgYSB2YWx1ZS4KKwkoc2F2ZV9pbmZydW5fc3RhdGUpOiBBZGQgc3RlcHBpbmdfdGhyb3VnaF9zaWd0cmFtcCBwYXJhbSBhbmQKKwltYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWUgZ2V0cyBzYXZlZC4KKwkoaW5mb190aHJlYWRzX2NvbW1hbmQpOiBJZmRlZmluZyBzb21lIGxvY2FsIHZhcmlhYmxlcyBhbmQgCisJY29kZSBmb3IgSFBVWEhQUEEuIEhQIGZvbGtzIHdhbnQgcHJpbnQgdGhlIHRpZCByYXRoZXIgdGhhbiBwaWQ/CisJQWxzbywgbG9va3MgbGlrZSB0aGUgSFAgZm9sa3Mgc29sdmVkIHRoZSBzYW1lIHRocmVhZCBzd2l0Y2hpbmcKKwlwcm9ibGVtIHRoYXQgNC4xNyBzb2x2ZXMuIFRha2luZyA0LjE3LgorCShyZXN0b3JlX2N1cnJlbnRfdGhyZWFkKTogUHJpbnQgb3V0IHRoZSBjdXJyZW50IGZyYW1lIGFmdGVyIAorCXN3aXRjaGluZyB0aHJlYWRzLgorCSh0aHJlYWRfYXBwbHlfYWxsX2NvbW1hbmQpOiBJZmRlZmluZyBhIHByaW50IHN0YXRlbWVudCBmb3IKKwlIUFVYSFBQQS4gVGhlIEhQIGZvbGtzIHdhbnQgdG8gcHJpbnQgb3V0IGEgdGlkIHJhdGhlciB0aGFuIHBpZD8KKwkodGhyZWFkX2FwcGx5X2NvbW1hbmQpOiBJZmRlZmluZyBhIHByaW50IHN0YXRlbWVudCBmb3IKKwlIUFVYSFBQQS4gVGhlIEhQIGZvbGtzIHdhbnQgdG8gcHJpbnQgb3V0IGEgdGlkIHJhdGhlciB0aGFuIHBpZD8KKwkodGhyZWFkX2NvbW1hbmQpOiBEZWNpZGVkIG5vdCB0byB0YWtlIEhQIGNoYW5nZS4KKworCSogdGhyZWFkLmM6IEZpeGluZyBnZGIgY29yZSBkdW1wIHByb2JsZW0gY2F1c2luZyBtYW55IHRlc3RzdWl0ZQorCSAgICBmYWlsdXJlcy4KKwkgICAgKGFkZF90aHJlYWQpOiBSZW1vdmUgY2FsbCB0byBicHN0YXRfY2xlYXIsIGluaXRpYWxpemUKKwkgICAgICB0cC0+c3RlcHBpbmdfdGhyb3VnaF9zb2xpYl9jYXRjaHBvaW50cyA9IE5VTEw7CisKKwkqIHRocmVhZC5jOiBDaGFuZ2VzIGZvciBjYXRjaHBvaW50cywgc2hhcmVkIGxpYmFyaWVzLCAKKwkgICh0aHJlYWRfaW5mbyk6IEFkZGl0aW9uYWwgZmllbGRzIGluIHRoZSB0aHJlYWRfaW5mbyBzdHJ1Y3QKKwkgICAgIGZvciBzdGVwcGluZ190aHJvdWdoX3NvbGliX2FmdGVyX2NhdGNoIGFuZCAKKwkgICAgIHN0ZXBwaW5nX3Rocm91Z2hfc29saWJfY2F0Y2hwb2ludHMuCisJICAoYWRkX3RocmVhZCk6IEluaXRpYWxpemUgdGhlIG5ldyB0aHJlYWRfaW5mbyBmaWVsZHMuCisJICAobG9hZF9pbmZydW5fc3RhdGUpOiBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGhhbmRsaW5nCisJICAgICBjYXRjaHBvaW50cyBhbmQgc2hhcmVkIGxpYnJhcmllcy4KKwkgIChzYXZlX2luZnJ1bl9zdGF0ZSk6IEFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgaGFuZGxpbmcKKwkgICAgIGNhdGNocG9pbnRzIGFuZCBzaGFyZWQgbGlicmFyaWVzLgorCisJKiB0b3AuYyAoY29tbWFuZF9sb29wKTogSW5pdGlhbGl6ZSBzcGFjZV9hdF9jbWRfc3RhcnQgdG8gMC4KKwkoc2V0X3Byb21wdCk6IE5ldyBmdW5jdGlvbi4KKwkodG9nZ2xlbGlzdCwgc3RvcGxpc3QpOiBOZXcgY29tbWFuZCBsaXN0cy4KKwkoY29tbWFuZF9sb29wKTogVHVpIGNoYW5nZXMgLS0gcGFyYW5vaWEgdG8gbWFrZSBzdXJlCisJaW5zZXJ0IG1vZGUgaXMgb2ZmIHdoZW4gbm90IGVkaXRpbmcuCisJKHF1aXRfZm9yY2UpOiBDbGVhbiB1cCB0dWkgb24gZXhpdC4KKwkoaW5pdF9tYWluKTogTWFrZSBkZWZpbml0aW9uIG9mIGluZm8gc3RhdHVzIGNvbW1hbmQgZGVwZW5kZW50IHVwb24KKwlkYnggbW9kZSBub3QgYmVpbmcgc2V0LgorCShmcHV0c191bmZpbHRlcmVkX2hvb2spOiBDaGFuZ2VkIHN0cmVhbSBwYXJhbWV0ZXIgZnJvbSBGSUxFIAorCXRvIEdEQl9GSUxFCisJKGZsdXNoX2hvb2spOiBDaGFuZ2VkIHN0cmVhbSBwYXJhbWV0ZXIgZnJvbSBGSUxFIHRvIEdEQl9GSUxFCisKKwkqIHRvcC5oIChzZXRfcHJvbXB0KTogRGVjbGFyZS4KKwkKKwkqIHR5cGVwcmludC5jICh3aGF0aXNfZXhwKTogRGVjaWRlIHJlYWwgcnVudGltZSB0eXBlLiBGb3IgdGhlIHZ0YWJsZQorCWNhc2UuCisKKwkqIHV0aWxzLmMgKHF1ZXJ5KTogQ2hhbmdlcyB0byBwcmV2ZW50IGN1cnNvciBmcm9tIGp1bXBpbmcgYXJvdW5kIGluIHRoZQorCVRVSS4gQ2FsbCB0dWlCdWZmZXJHZXRjIGV4cGxpY2l0bHksIHJhdGhlciB0aGFuIHBhc3NpbmcgaXQgCisJaW50byB0dWlEby4gVGhlIHR1aURvIGZ1bmN0aW9uIGRvZXMgc29tZSBhZGRpdGlvbmFsIHdvcmsKKwl0aGF0IGlzIGluYXBwcm9wcmlhdGUgd2hlbiBoYW5kbGluZyBxdWVyaWVzLiAKKwkoR0RCX0ZJTEVfSVNBVFRZKTogTmV3IG1hY3JvIHRoYXQgdGFrZXMgYSBHREJfRklMRSBwYXJhbSBhbmQgCisJZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBpdCdzIHVzaW5nIGEgdHR5LgorCShnZGJfZmlsZV9pc2F0dHkpOyBjYWxsZWQgYnkgdGhlIEdEQl9GSUxFX0lTQVRUWSBtYWNyby4gRG9lcworCXRoZSBhY3R1YWwgd29yaworCShpbml0X3BhZ2VfaW5mbyk6IENhbGwgR0RCX0ZJTEVfSVNBVFRZIHJhdGhlciB0aGFuIElTQVRUWQorCShwcmludF9zcGFjZXMpOiBGaXggcGFyYW1ldGVyIHRvIGZwdXRjLiBmaXggY2FsbCB0byAKKwlnZGJfZmlsZV9hZGp1c3Rfc3RyYnVmLgorCShnZGJfZmlsZV9pbml0X2FzdHJpbmcpOiBGaXggcGFyYW1ldGVyIHRvIHhtYWxsb2MKKwkoZ2RiX2ZpbGVfZGVhbGxvY2F0ZSk6IE5ldyBmdW5jdGlvbiB0byBkZWFsbG9jYXRlCisJYSBHREJfRklMRSBvYmplY3QgYW5kIHBvc3NpYmx5IGEgc3RyaW5nIGJ1ZmZlcgorCShnZGJfZmlsZV9pbml0X2FzdHJpbmcpOiBJbml0aWFsaXplIGJ1ZmZlciBhcyB0aGUgZW1wdHkKKwlzdHJpbmcuICBJbmRlbnQgR05VIHN0eWxlLgorCShnZGJfZm9wZW4pOiBHZGJfZm9wZW4gaXMgY2FsbGVkIGlmIHRoZSBHREJfRklMRSBvYmplY3QgaXMKKwlhY3R1YWxseSBhZmlsZSByYXRoZXIgdGhhbiBhc3RyaW5nLiBUaGUgcm91dGluZSBub3cgYWxsb2NhdGVzIHNwYWNlCisJZm9yIGEgR0RCX0ZJTEUgb2JqZWN0IGFuZCBpbml0aWFsaXplcyBpdHMgZmllbGRzIGluIGFkZGl0aW9uIHRvIAorCXBlcmZvcm1pbmcgYW4gZm9wZW4uCisJKGdkYl9mbHVzaCk6IEZpeCB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbnRvIGZmbHVzaC4gSXQncyBub3cKKyAJc3RyZWFtLT50c19maWxlc3RyZWFtLgorCShnZGJfZmNsb3NlKTogUGFzcyBpbiBhbiBvYmplY3Qgb2YgdHlwZSBHREJfRklMRSAqKi4gRml4IHBhcmFtZXRlcgorIAl0byBmY2xvc2UuIEl0J3Mgbm93IHRtcHN0cmVhbS0+dHNfZmlsZXN0cmVhbS4gTWFrZSBzdXJlIHRvIGZyZWUKKyAJdGhlIEdEQl9GSUxFIG9iamVjdCBhbmQgc2V0IHRoZSBHREJfRklMRSAqIG9iamVjdCB0byBOVUxMLgorCShnZGJfYWRqdXN0X3N0cmJ1Zik6IE5ldyBmdW5jdGlvbi4gRGV0ZXJtaW5lIGlmIHRoZSBjdXJyZW50CisgCXRzX3N0cmJ1ZiBmaWVsZCBjb250YWlucyBzdWZmaWNpZW50IHNwYWNlIHRvIGNvbmNhdGVuYXRlIGEgc3RyaW5nCisgCW9mIGxlbmd0aCBuIG9uIHRoZSBlbmQuICBJZiBub3QsIHRoZW4gcmVhbGxvY2F0ZSB0aGUgdHNfc3RyYnVmLgorCShwcmludF9zcGFjZXMpOiBDaGVjayB0byBzZWUgaWYgdGhlIEdEQl9GSUxFIGlzIGFmaWxlIG9yCisgCWFzdHJpbmcuIElmIGl0IGlzIGFzdHJpbmcsIHRoZW4gYWRqdXN0IHRoZSBzaXplIG9mIHRoZSB0c19zdHJidWYKKyAJZmllbGQgYW5kIGNvbmNhdGVuYXRlIHRoZSBjb3JyZWN0IG51bWJlciBvZiBzcGFjZXMgb250byB0aGUgZW5kIG9mCisgCXRoZSBidWZmZXIuIE90aGVyd2lzZSBjb250aW51ZSB0byB1c2UgZnB1dGMuCisJKGdkYl9maWxlX2dldF9zdHJidWYpOiBOZXcgZnVuY3Rpb24uIHJldHVybiBhIHB0ciB0byB0aGUgdHNfc3RyYnVmCisgCWZpZWxkIGluIGEgR0RCX0ZJTEUgb2JqZWN0LgorCShnZGJfZmlsZV9pbml0X2FzdHJpbmcpOiBOZXcgZnVuY3Rpb24gdG8gYWxsb2NhdGUgc3BhY2UgZm9yIGFuZAorIAlpbml0aWFsaXplIGEgR0RCX0ZJTEUgb2JqZWN0IHdoZW4gaXQgaXMgYW4gYXN0cmluZy4KKwkoc2V0X3dpZHRoKTogRGVjbGFyZSBpdC4KKwkocGFnaW5hdGlvbl9lbmFibGVkKTogRGVmaW5lIGl0LgorCShxdWVyeSk6IFR1aSBjaGFuZ2VzLgorCShpbml0X3BhZ2VfaW5mbywgc2V0X3dpZHRoKTogTmV3IGZ1bmN0aW9ucy4KKwkoc2V0X3dpZHRoX2NvbW1hbmQpOiBDYWxsIHNldF93aWR0aC4KKwkoX2luaXRpYWxpemVfdXRpbHMpOiBSZXBsYWNlIHRlcm1jYXAgc3R1ZmYgd2l0aCBjYWxsIHRvCisJaW5pdF9wYWdlX2luZm87IGlmIHhkYl9jb21tYW5kcyBzZXQsIGRlZmluZSBhbSBhbmQgc20gY29tbWFuZHM7CisJZGVmaW5lIHBhZ2luYXRpb24gYXMgYSBzZXQvc2hvdyBjb21tYW5kLgorCSh2ZnByaW50Zl9tYXliZV9maWx0ZXJlZCk6IENoYW5nZSBGSUxFIHRvIEdEQl9GSUxFLgorCShmcHV0c19tYXliZV9maWx0ZXJlZCk6IERpdHRvLgorCShwcmludF9zcGFjZXMpOiBEaXR0by4KKwkoZ2RiX3ByaW50Y2hhcik6IERpdHRvLgorCShnZGJfZmx1c2gpOiBEaXR0by4KKwkoZnB1dHNfZmlsdGVyZWQpOiBEaXR0by4KKwkodmZwcmludGZfZmlsdGVyZWQpOiBEaXR0by4KKwkodmZwcmludGZfdW5maWx0ZXJlZCk6IERpdHRvLgorCShmcHJpbnRmX2ZpbHRlcmVkKTogRGl0dG8uCisJKGZwcmludGZfdW5maWx0ZXJlZCk6IERpdHRvLgorCShmcHJpbnRmaV9maWx0ZXJlZCk6IERpdHRvLgorCShwcmludF9zcGFjZXNfZmlsdGVyZWQpOiBEaXR0by4KKwkoZnByaW50Zl9zeW1ib2xfZmlsdGVyZWQpOiBEaXR0by4KKwkoZ2RiX2ZjbG9zZSk6IE5ldyBmdW5jdGlvbi4KKworCSogdmFsb3BzLmMgKGNhbGxfZnVuY3Rpb25fYnlfaGFuZCk6IEFzc2lnbiB0byBwYXJhbV90eXBlIG9ubHkKKwlpZiBmdW5jdGlvbiBoYXMgcGFyYW1ldGVycy4KKworCSogdmFsb3BzLmMgKGNhbGxfZnVuY3Rpb25fYnlfaGFuZCk6IElmZGVmIHRoZQorCUhQX0NPTVBJTEVEX1RBUkdFVCBzdHVmZi4KKwkodmFsdWVfYXJnX2NvZXJjZSk6IERpdHRvLgorCisJKiB2YWxvcHMuYyAoY2FsbF9mdW5jdGlvbl9ieV9oYW5kKTogTWFrZSBzdXJlIHBhcmFtX3R5cGUgaXMgCisJaW5pdGlhbGl6ZWQgdG8gTlVMTC4KKworCSogdmFsb3BzLmMgKGZpbmRfcnRfdmJhc2Vfb2Zmc2V0KTogQWRkIHBhcmFtZXRlciB0byB2YWx1ZV9hdC4KKwkodmFsdWVfcnR0aV90eXBlKTogRGl0dG8uCisJKHZhbHVlX2Z1bGxfb2JqZWN0KTogRGl0dG8uCisKKwkqIHZhbG9wcy5jIChzZWFyY2hfc3RydWN0X2ZpZWxkX2F1eCk6IEZpeGVkIG1pc21hdGNoaW5nIHBhcmVudGhzCisKKwkqIHZhbG9wcy5jIChzZWFyY2hfc3RydWN0X2ZpZWxkX2F1eCk6IE1ha2Ugc3VyZSBUWVBFX1RBR19OQU1FCisJaXMgbm90IG51bGwgYmVmb3JlIGNvcHlpbmcgaXQuIAorCQorCisJKiB2YWxvcHMuYyAoc2VhcmNoX3N0cnVjdF9maWVsZF9hdXgpOiBTZXQgZm91bmRfY2xhc3NfbmFtZSB0byBudWxsCisJaWYgY2xhc3MgaGFzIG5vIG5hbWUgKGFub24gdW5pb25zIGNhc2UpLiBBZGp1c3QgYmFzZV9hZGRyIAorCWNvbXB1dGF0aW9uLgorCisJKiB2YWxvcHMuYyAodmFsdWVfYXJnX2NvZXJjZSk6IENoYW5nZSBmaW5hbCBhcmcgdG8gaW50LgorCisJKiB2YWxvcHMuYyAodmFsdWVfYXJnX2NvZXJjZSk6IFJlbW92ZSB0aGUgY29uZGl0aW9uYWwgb24gSFAKKwljb21waWxlZCB0YXJnZXQsIGZvciBkb2luZyBjb2VyY2lvbiBvZiBmbG9hdCB0byBkb3VibGUuIFJlbW92ZWQKKwl0aGlyZCBwYXJhbWV0ZXIsIHVzaW5nX2djYy4KKwkoY2FsbF9mdW5jdGlvbl9ieV9oYW5kKTogRG8gbm90IHVzZSBIUF9DT01QSUxFRF9UQVJHRVQsIGp1c3QKKwl1c2UgdGhlIGdjY19jb21waWxlZCB2YXJpYWJsZS4KKworCSogdmFsb3BzLmMgKHZhbHVlX2Nhc3QpOiBUYWtlIGNhc2Ugb2YgdGhlIGVuY2xvc2luZ190eXBlIGFuZCAKKwlwb2ludGVyX3RvX29mZnNldCBmaWVsZHMuCisJKHZhbHVlX2F0KTogVXNlIFZBTFVFX0NPTlRFTlRTX0FMTF9SQVcKKwkodmFsdWVfZmV0Y2hfbGF6eSk6IERpdHRvCisJKHZhbHVlX2Fzc2lnbik6IEhhbmRsZSBlbmNsb3NpbmdfdHlwZSwgZW1iZWRkZWRfb2Zmc2V0IGFuZCAKKwlwb2ludGVkX3RvX29mZnNldCBmaWVsZHMuCisJKHZhbHVlX3JlcGVhdCk6IFVzZSBWQUxVRV9DT05URU5UU19BTExfUkFXIGFuZCBWQUxVRV9FTkNMT1NJTkdfVFlQRS4KKwkodmFsdWVfaW5kKTogU2V0IGVuY2xvc2luZ190eXBlIGFuZCBlbWJlZGRlZF9vZmZzZXQgY29ycmVjdGx5LAorCWZvciBhIHBvaW50ZXIgdmFsdWUgYmVpbmcgZGVyZWZlcmVuY2VkLiBUYXJnZXQgbWVtb3J5IGJ5dGVzIAorCWNvcnJlc3BvbmRpbmcgdG8gdGhlIHNpemUgb2YgdGhlIGVuY2xvc2luZyB0eXBlIGFyZSByZXRyZWl2ZWQuCisJKHZhbHVlX2FkZHIpOiBIYW5kbGUgZW5jbG9zaW5nX3R5cGUgYW5kIHBvaW50ZWRfdG9fb2Zmc2V0LgorCSh2YWx1ZV9wdXNoKTogVXNlIFZBTFVFX0NPTlRFTlRTX0FMTCBhbmQgVkFMVUVfRU5DTE9TSU5HX1RZUEUuCisJKHZhbHVlX2FyZ19jb2VyY2UpOiBDb2VyY2UgZmxvYXRzIHRvIGRvdWJsZXMgb25seSBpZiBnY2Mgd2FzIG5vdAorCXVzZWQgdG8gY29tcGlsZSB0aGUgdGFyZ2V0LgorCShjYWxsX2Z1bmN0aW9uX2J5X2hhbmQpOiBIYW5kbGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIGFzIHBhcmFtdGVycy4KKwkodmFsdWVfYXJyYXkpOiBVc2UgVkFMVUVfQ09OVEVOVFNfQUxMIGFuZCBWQUxVRV9FTkNMT1NJTkdfVFlQRS4KKwkoc2VhcmNoX3N0cnVjdF9tZXRob2QpOiBQcm9kdWNlIG1vcmUgaW5mb3JtYXRpdmUgZXJyb3IgbWVzc2FnZS4KKwkoZmluZF9ydF92YmFzZV9vZmZzZXQpOiBEZWFsIHdpdGggbmVnYXRpdmUgb2Zmc2V0cy4KKwkodmFsdWVfZmluZF9vbG9hZF9tZXRob2RfbGlzdCk6IE5ldyBmdW5jdGlvbi4gUmV0dXJuIHRoZSBsaXN0IG9mIAorCW92ZXJsb2FkZWQgbWV0aG9kcyBvZiBhIHNwZWNpZmllZCBuYW1lLgorCShmaW5kX21ldGhvZF9saXN0KTogTmV3IGZ1bmN0aW9uLiBTZWFyY2ggdGhyb3VnaCB0aGUgbWV0aG9kcyBvZiBhbiAKKwlvYmplY3QgKGFuZCBpdHMgYmFzZXMpIHRvIGZpbmQgYSBzcGVjaWZpZWQgbWV0aG9kLgorCSh2YWx1ZV9mdWxsX29iamVjdCk6IE5ldyBmdW5jdGlvbi4gR2l2ZW4gYSB2YWx1ZSwgY2hlY2sgaXRzIHJlYWwgCisJcnVuLXRpbWUgdHlwZS4KKwkodmFsdWVfcnR0aV90YXJnZXRfdHlwZSk6IE5ldyBmdW5jdGlvbi4gR2l2ZW4gYSBwb2ludGVyIHZhbHVlIFYsIGZpbmQgCisJdGhlIHJlYWwgKFJUVEkpIHR5cGUgb2YgdGhlIG9iamVjdCBpdCBwb2ludHMgdG8uCisJKHZhbHVlX3J0dGlfdHlwZSk6IE5ldyBmdW5jdGlvbi4gRmluZCB0aGUgcmVhbCBydW4tdGltZSB0eXBlIG9mIGEgCisJdmFsdWUgdXNpbmcgUlRUSS4KKworCSogdmFsb3BzLmM6IEluY2x1ZGUgZ2RiY21kLmgKKwlTZXQgZ2xvYmFsIG92ZXJsb2FkX3Jlc29sdXRpb24gdG8gMC4KKwkoZmluZF9mdW5jdGlvbl9pbl9pbmZlcmlvcik6IE1vZGlmeSBlcnJvciBtZXNzYWdlLgorCSh2YWx1ZV9hbGxvY2F0ZV9zcGFjZV9pbl9pbmZlcmlvcik6IE1vZGlmeSBlcnJvciBtZXNzYWdlLgorCSh2YWx1ZV9jYXN0KTogRGVhbCB3aXRoIEhQL2FDQyBwZWN1bGlhcml0aWVzLgorCSh2YWx1ZV9vZl92YXJpYWJsZSk6IFVzZSBTWU1CT0xfU09VUkNFX05BTUUgaW5zdGVhZCBvZiBTWU1CT0xfTkFNRS4KKwkodmFsdWVfYWRkcik6IE1vZGlmeSBhZGRyZXNzIHZhbHVlIGJ5IGFkZGluZyB0aGUgZW1iZWRkZWQgb2Zmc2V0LgorCSh2YWx1ZV9pbmQpOiBNb2RpZnkgdGhlIGFkZHJlc3Mgb2YgdGhlIG9iamVjdCBieSB0aGUgcG9pbnRlZF90b19vZmZzZXQuCisJKGNhbGxfZnVuY3Rpb25fYnlfaGFuZCk6IERvIG5vdCBkbyBhbnkgZXh0cmEgYWxpZ25tZW50IGlmIG5vdCBuZWVkZWQuCisJRmV0Y2ggdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBzdGFjayByYXRoZXIgdGhlbiBmcm9tIHRoZSByZWdpc3RlciwgCisJZm9yIHRoZSBocHBhIGFyY2hpdGVjdHVyZS4KKwkoc2VhcmNoX3N0cnVjdF9maWVsZCk6IFJld3JpdHRlbi4gTm93IHRoaXMgZnVuY3Rpb24gdXNlcyAKKwlzZWFyY2hfc3RydWN0X2ZpZWxkX2F1eCB0byBkbyBhbGwgdGhlIHdvcmsuCisJKHNlYXJjaF9zdHJ1Y3RfZmllbGRfYXV4KTogTmV3IGZ1bmN0aW9uLiBUaGlzIGlzIHRoZSBvbGQgCisJc2VhcmNoX3N0cnVjdF9maWVsZCByZXdyaXR0ZW4uCisJKGZpbmRfcnRfdmJhc2Vfb2Zmc2V0KTogR2l2ZSBlcnJvciBpZiB2aXJ0dWFsIHRhYmxlIHBvaW50ZXIgaXMgbm90IGdvb2QuCisJKGZpbmRfb3ZlcmxvYWRfbWF0Y2gpOiBOZXcgZnVuY3Rpb24uIEZpbmQgdGhlIGJlc3QgZnVuY3Rpb24gdGhhdAorCW1hdGNoZXMgb24gdGhlIGFyZ3VtZW50IHR5cGVzIGFjY29yZGluZyB0byB0aGUgb3ZlcmxvYWQgcmVzb2x1dGlvbgorCXJ1bGVzLgorCShfaW5pdGlhbGl6ZV92YWxvcHMpOiBBZGQgbmV3IHNldC9zaG93IGNvbW1hbmQgZm9yIG92ZXJsb2FkLXJlc29sdXRpb24uCisJCisJKiB2YWx1ZS5oIChWQUxVRV9QT0lOVEVEX1RPX09GRlNFVCk6IE5ldyBtYWNyby4KKwlBZGQgZmllbGQgcG9pbnRlZF90b19vZmZzZXQgdG8gdmFsdWUgc3RydWN0dXJlLgorCUFkZCBwcm90b3R5cGVzIGZvciBuZXcgZnVuY3Rpb25zIGluIHZhbG9wcy5jLgorCisJKiB2YWx1ZS5oICh3cml0ZV9yZWdpc3Rlcl9waWQpOiBDaGFuZ2UgcHJvdG90eXBlIHRvIG1hdGNoCisJZnVuY3Rpb24uCisKKwkqIHZhbHVlLmg6IEhwIG1lcmdlLCA0LzE1Lzk4IHNuYXBzaG90CisJICBBZGRlZCBwYXJhbWV0ZXIgdG8gdmFsX3ByaW50IGZ1bmMgZGVjbC4KKwkgIEFkZGVkIG5ldyBtYWNybywgVkFMVUVfRU1CRURERURfT0ZGU0VULCBhbmQKKwkgIG5ldyBmdW5jIGRlY2wsIGZpbmRfcnRfdmJhc2Vfb2Zmc2V0LCBmb3IgQysrCisJICBzdXBwb3J0LgorCQorCSogdmFsdWVzLmMgKGFsbG9jYXRlX3ZhbHVlKTogQWxsb2NhdGUgYWxzbyBmb3IgdmFsdWVfZW1iZWRkZWRfb2Zmc2V0IAorCWFuZCB2YWx1ZV9lbmNsb3NpbmdfdHlwZS4KKwkodmFsdWVfY29weSk6IENvcHkgdmFsdWVfZW1iZWRkZWRfb2Zmc2V0IGFuZCB2YWx1ZV9lbmNsb3NpbmdfdHlwZSB0b28uCisJVXNlIGFsbF9yYXcgaW4gY29weWluZyB0aGUgdmFsdWUgaXRzZWxmLgorCSh2YWx1ZV9wcmltaXRpdmVfZmllbGQpOiBBZGQgaGFuZGxpbmcgb2YgYmFzZSBzdWJvYmplY3RzLgorCisJKiB2YWx1ZXMuYyAodmFsdWVfY29weSk6IENvcHkgdGhlIHBvaW50ZWRfdG9fb2Zmc2V0IGFzIHdlbGwuCisJKGFsbG9jYXRlX3ZhbHVlKTogQWxsb2NhdGUgdGhlIHBvaW50ZWRfdG9fb2Zmc2V0IGFzIHdlbGwuCisJKHZhbHVlX3ZpcnR1YWxfZm5fZmllbGQpOiBSZXdyaXRlLgorCisJKiB2YWx1ZXMuYyAodmFsdWVfcHJpbWl0aXZlX2ZpZWxkKTogQWRqdXN0IGVtYmVkZGVkIG9mZnNldCBhbmQKKwlvZmZzZXQgY2FsY3VsYXRpb24uCisKKwkqIHZhbHVlcy5jICh2YWx1ZV9zdGF0aWNfZmllbGQpOiBUYWtlIGludG8gY29uc2lkZXJhdGlvbiB0aGF0IHN0YXRpYyAKKwlkYXRhIG1lbWJlcnMgY2FuIGJlIG1pbmltYWwgc3ltYm9scyB0b28uCisKKwkqIHZhbHVlcy5jICh2YWx1ZV92aXJ0dWFsX2ZuX2ZpZWxkKTogRml4IGNhbGwgdG8gdmFsdWVfYXQuCisKKwkqIHdpbjMyLW5hdC5jIChoYW5kbGVfbG9hZF9kbGwpOiBBZGRlZCBwYXJhbXMgdG8gY2FsbCB0byBzeW1ib2xfZmlsZV9hZGQuCisKKwlPdGhlciBjaGFuZ2VzIGhhdmUgdG8gZG8gd2l0aCBYREIgY29tcGF0YWJpbGl0eS4gTGVhdmUgb291dAorCWZvciBub3cuCisKKwlkZWZzLmggKHZmcHJpbnRmX2ZpbHRlcmVkKTogQ2hhbmdlIEZJTEUgdG8gR0RCX0ZJTEUgaW4gZGVjbC4KKwkoZnByaW50Zl9maWx0ZXJlZCk6IERpdHRvLgorCShmcHJpbnRmaV9maWx0ZXJlZCk6IERpdHRvLgorCSh2ZnByaW50Zl91bmZpbHRlcmVkKTogRGl0dG8uCisJKGZwcmludGZfdW5maWx0ZXJlZCk6IERpdHRvLgorCisJaW5mY21kLmMgKF9pbml0aWFsaXplX2luZmNtZCk6IElmIHhkYl9jb21tYW5kcyBpcyBzZXQsIG1ha2UgUyBhbgorCWFsaWFzIGZvciBuZXh0IGFuZCBkZWZpbmUgUiwgbHIsIGcuICBEZWZpbmUgZ28uCisJIAorCXB5ci10ZGVwLmMgKHB5cl9wcmludF9pbnNuKTogQ2hhbmdlIEZJTEUgdG8gR0RCX0ZJTEUuCisKKworCSogYnJlYWtwb2ludC5jIChjcmVhdGVfdGVtcF9leGNlcHRpb25fYnJlYWtwb2ludCk6ICNJZiBpdCBvdXQgLS0KKyAJbm90aGluZyBjYWxscyBpdC4KKwkoYnBzdGF0X3N0b3Bfc3RhdHVzKTogRG9uJ3QgY2FsbCBTT0xJQl9IQVZFX0xPQURfRVZFTlQgaWYgaXQncyBub3QKKyAJZGVmaW5lZDsgZG9uJ3QgY2FsbCBTT0xJQl9IQVZFX1VOTE9BRF9FVkVOVCBpZiBpdCdzIG5vdCBkZWZpbmVkLgorCShicHN0YXRfZ2V0X3RyaWdnZXJlZF9jYXRjaHBvaW50cyk6IElmIHdlIGRvbid0IGhhdmUgc2hhcmVkCisgCWxpYnJhcnkgc3VwcG9ydCwgdGhlbiBkb24ndCBjYWxsIFNPTElCX0xPQURFRF9MSUJSQVJZX1BBVEhOQU1FIG5vcgorIAlTT0xJQl9VTkxPQURFRF9MSUJSQVJZX1BBVEhOQU1FLgorCSh3YXRjaF9jb21tYW5kXzEpOiBEb24ndCByZXF1aXJlIGEgcnVuIGJlZm9yZSBhIHdhdGNoIGNvbW1hbmQKKyAJdW5sZXNzIHdlJ3JlIG9uIEhQIFtpdCdzIGFuIEhQIE9TIGJ1Zywgbm90IGEgZ2VuZXJpYyBsaW1pdGF0aW9uXQorCShjYXRjaF9sb2FkX2NvbW1hbmRfMSk6IERvbid0IGRlZmluZSBpZiBubyBzaGFyZWQgbGlicmFyaWVzLgorCShjYXRjaF9jb21tYW5kXzEpOiBEb24ndCBjbGFpbSB0byBzdXBwb3J0IGZvcmsgY2F0Y2hwb2ludHMgdW5sZXNzCisgCUNISUxEX0lOU0VSVF9GT1JLX0NBVENIUE9JTlQgaXMgZGVmaW5lZCwgZG9uJ3QgY2xhaW0gdG8gc3VwcG9ydAorIAl2Zm9yayBjYXRjaHBvaW50cyB1bmxlc3MgQ0hJTERfSU5TRVJUX1ZGT1JLX0NBVENIUE9JTlQgaXMgZGVmaW5lZCwKKyAJZG9uJ3QgY2xhaW4gdG8gc3VwcG9ydCBzaGFyZWQgbGlicmFyeSBsb2FkIGNhdGNocG9pbnRzIGlmIHNoYXJlZAorIAlsaWJyYXJpZXMgYXJlbid0IHN1cHBvcnRlZCwgYW5kIGRvbid0IGNsYWltIHRvIHN1cHBvcnQgZXhlYworIAljYXRjaHBvaW50cyB1bmxlc3MgQ0hJTERfSU5TRVJUX0VYRUNfQ0FUQ0hQT0lOVCBpcyBkZWZpbmVkCisKKwkgIFRoZXJlIGFyZSBuZXcgdGFyZ2V0X29wcyB2ZWN0b3IgZmllbGRzIHRoYXQgcGVydGFpbgorCSAgb25seSB0byBIUFVYLiBBZGRlZCB0aGUgdG9fcmVxdWlyZV9hdHRhY2ggYW5kIAorCSAgdG9fcmVxdWlyZV9kZXRhY2ggZmllbGRzIHRvIGV4ZWNfb3BzLiBUaGVzZSBuZXcKKyAJICBmaWVsZHMgYXJlIGlmZGVmJ2VkIGZvciBIUFVYX1NOQVAxLgorCisJKiBicmVha3BvaW50Lmg6CisJICAgIEZpeCBjb21waWxlIGVycm9yIGluIGVudW0gYnB0eXBlLgorCisJKiBjb2ZmLXNvbGliLmg6CisJICAgIEZpeGVkIGEgbnVtYmVyIG9mIG1hY3JvIGRlZmluaXRpb25zLiBTT0xJQl9MT0FERURfTElCUkFSWV9QQVRITkFNRSwKKwkgICAgU09MSUJfSEFWRV9MT0FEX0VWRU5ULCBTT0xJQl9IQVZFX1VOTE9BRF9FVkVOVCwgCisJICAgIFNPTElCX1VOTE9BREVEX0xJQlJBUllfUEFUSE5BTUUsIFNPTElCX0lOX0RZTkFNSUNfTElOS0VSLiBUaGVzZQorCSAgICBtYWNyb3MgYXJlIG9ubHkgbWVhbmluZ2Z1bCAoZm9yIG5vdykgZm9yIFNPTS4gU28sIGFsbCAKKwkgICAgdGhlIG1hY3JvcyB3ZXJlIGRlZmluZWQgYXMgZXJyb3IoLi4uKSwgYnV0IHdlcmUgdXNlZCBpbgorCSAgICBjb25kaXRpb25zLiBUaGlzIGNhdXNlZCB0aGUgY29tcGlsZSB0byBjcmFwIG91dC4gSSByZWRlZmluZWQgCisJICAgIHRoZXNlIChmb3Igbm93KSB0byBiZSAwLiAKKworCSogcHJvY2ZzLmM6CisJICAgIChwcm9jZnNfY3JlYXRlX2luZmVyaW9yKTogRml4IGNhbGwgdG8gZm9ya19pbmZlcmlvciAtLSBuZWVkIGFub3RoZXIKKwkgICAgICAgcGFyYW1ldGVyLiAKKwkKKwkqIHNvbGliLmg6CisJICAgIEZpeGVkIGEgbnVtYmVyIG9mIG1hY3JvIGRlZmluaXRpb25zLiBTT0xJQl9MT0FERURfTElCUkFSWV9QQVRITkFNRSwKKwkgICAgU09MSUJfSEFWRV9MT0FEX0VWRU5ULCBTT0xJQl9IQVZFX1VOTE9BRF9FVkVOVCwgCisJICAgIFNPTElCX1VOTE9BREVEX0xJQlJBUllfUEFUSE5BTUUsIFNPTElCX0lOX0RZTkFNSUNfTElOS0VSLiBUaGVzZQorCSAgICBtYWNyb3MgYXJlIG9ubHkgbWVhbmluZ2Z1bCAoZm9yIG5vdykgZm9yIFNPTS4gU28sIGFsbCAKKwkgICAgdGhlIG1hY3JvcyB3ZXJlIGRlZmluZWQgYXMgZXJyb3IoLi4uKSwgYnV0IHdlcmUgdXNlZCBpbgorCSAgICBjb25kaXRpb25zLiBUaGlzIGNhdXNlZCB0aGUgY29tcGlsZSB0byBjcmFwIG91dC4gSSByZWRlZmluZWQgCisJICAgIHRoZXNlIChmb3Igbm93KSB0byBiZSAwLiAKKworCSogdmFsb3BzLmM6CisJICAgIChzZWFyY2hfc3RydWN0X2ZpZWxkKTogVW5kZWNsYXJlZCBsb2NhbCB2YXJpYWJsZSwgImFzc2lnbmVkIi4KKwkgICAgKGZpbmRfcnRfdmJhc2Vfb2Zmc2V0KTogRml4ZWQgY2FsbCB0byB2YWx1ZV9hdAorCisJKiB2YWx1ZS5oOiBGaXggc2lnbmF0dXJlIGZvciBmaW5kX3J0X3ZiYXNlX29mZnNldCBmdW5jdCBkZWNsCisgCShtaXNzaW5nIGEgcGFyYW0pCisKK1dlZCBEZWMgMzAgMTc6NDg6MTIgMTk5OCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJRnJvbSBKLlQuIENvbmtsaW4gIDxqdGNAcmVkYmFja25ldHdvcmtzLmNvbT46CisJKiBpMzg2LXN0dWIuYzogRml4IGVycm9yIHN0cmluZyBpbiBsYXN0IGNoYW5nZS4KKworMTk5OC0xMi0zMCAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiB1dGlscy5jOiA8UmVhZGxpbmUvcmVhZGxpbmUuaD4gaW5zdGVhZCBvZiAicmVhZGxpbmUvcmVhZGxpbmUuaCIuCisKKwkqIGNvbmZpZ3VyZS5pbiAoVEVSTV9MSUIpOiBTZWFyY2ggZm9yIHRoZSBhcHByb3ByaWF0ZSB0ZXJtIGxpYnJhcnkKKwlvbiB0aGUgaG9zdCBzeXN0ZW0uCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogTWFrZWZpbGUuaW4gKFRFUk1DQVApOiBTZXQgYmFzZWQgb24gYXV0b2NvbmYgY2hlY2suCisJKiBjb25maWcvKi8qLm1oOiBEb24ndCBvdmVycmlkZSBURVJNQ0FQIHNldHRpbmcuCisKK1dlZCBEZWMgMzAgMTc6MjM6MTQgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiB2YWx1ZS5jICh2YWx1ZV92aXJ0dWFsX2ZuX2ZpZWxkKTogSGFuZGxlIHRoZSBzaXR1YXRpb24gd2hlcmUKKwl2dGJsIGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIGEgcG9pbnRlciB0byBhbiBhcnJheS4KKworTW9uIERlYyAyOCAxNzo0MzozNiAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KKworCVRoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGUgYnkgSmltIEJsYW5keSA8amltYkBjeWdudXMuY29tPiwKKyAJRWRpdGggRXBzdGVpbiA8ZWVwc3RlaW5AY3lnbnVzLmNvbT4sIEVsZW5hIFphbm5vbmkKKyAJPGV6YW5ub25pQGN5Z251cy5jb20+IFN0YW4gU2hlYnMgPHNoZWJzQGN5Z251cy5jb20+LCBhbmQgRGF2aWQKKyAJVGF5bG9yIDx0YXlsb3JAY3lnbnVzLmNvbT4sIGFzIHBhcnQgb2YgdGhlIHByb2plY3QgdG8gbWVyZ2UgaW4KKyAJY2hhbmdlcyBvcmlnaW5hbGx5IG1hZGUgYnkgSFA7IEhQIGRpZCBub3QgY3JlYXRlIENoYW5nZUxvZworIAllbnRyaWVzLgorCisJKiBjLWxhbmcuaCAoY3BfcHJpbnRfdmFsdWVfZmllbGRzKTogVXBkYXRlIHByb3RvdHlwZTsgZml4ZWQKKyAJcHJvdG90eXBlIGRlY2wgZm9yIGNfdmFsX3ByaW50IGZ1bmN0aW9uIC0tIGl0IG5lZWRlZCBhbgorIAllbWJlZGRlZF9vZmZzZXQgcGFyYW07IGZpeGVkIHByb3RvdHlwZSBvZiBjcF9wcmludF92YWx1ZV9maWVsZHMuCisJSW5jbHVkZSB2YWx1ZS5oLgorCShDX0xBTkdfSCk6IERlZmluZS4KKworCSogYy12YWxwcmludC5jIChjX3ZhbF9wcmludCk6IEFkZCBuZXcgcGFyYW1ldGVyIGVtYmVkZGVkX29mZnNldC4KKyAgCUFkZCBlbWJlZGRlZF9vZmZzZXQgdG8gdmFsYWRkciBpbiBmdW5jdGlvbiBjYWxscy4gIGZpeCBjYWxscyB0bworIAl2YWxfcHJpbnQsIGFuZCBjcF9wcmludF92YWx1ZV9maWVsZHMuICBBdHRlbXB0IHRvIGRldGVybWluZSB0aGUKKyAJcmVhbCB0eXBlIG9mIHRoZSBvYmplY3QgdG8gYmUgcHJpbnRlZC4gIGZpeGVkIGNhbGwgdG8KKyAJY3BfcHJpbnRfdmFsdWVfZmllbGRzLiAgcHJvY2VzcyBUWVBFX0NPREVfTUVUSE9EIGFzIHdlbGwuICBtb3ZlZAorIAljYWxsIHRvIGNoZWNrX3R5cGVkZWYgb3V0IG9mIGNvbmRpdGlvbmFsLiAgYWRkIGVtYmVkZGVkIG9mZnNldAorIAlwYXJhbSB0byB2YWxfcHJpbnQgY2FsbC4KKworCShjX3ZhbHVlX3ByaW50KTogQWRkIG5ldyBwYXJhbWV0ZXIgdG8gY2FsbCB0byB2YWxfcHJpbnQuICBIYW5kbGUKKyAJcG9pbnRlciB0byBjbGFzcyBjYXNlLiAgRW5zdXJlIHRoYXQgY29uc3QgY2hhciAqLCBjb25zdCB1bnNpZ25lZAorIAljaGFyICogY29tZSBvdXQgd2l0aG91dCB0aGUgdHlwZSBidXQgdGhlIHZvbGF0aWxlIHZhcmlhbnRzIGFuZCB0aGUKKyAJc2lnbmVkIHZhcmlhbnRzIGRvbid0LgorCQorCSogY2gtbGFuZy5oIChjaGlsbF92YWxfcHJpbnQpOiBBZGQgcGFyYW1ldGVyIHRvIGRlY2wuCisKKwkqIGNoLXZhbHByaW50LmM6IFRoZSB2YXJpb3VzIHByaW50IHJvdXRpbmVzIGhhdmUgYW4gYWRkaXRpb25hbAorIAlwYXJhbWV0ZXIuIEN1cnJlbnRseSwgdGhlIG5ldyBwYXJhbWV0ZXIgaXMgb25seSB1c2VkIHdoZW4gcHJpbnRpbmcKKyAJQysrIGV4cHJlc3Npb25zLiBTbywgaW4gY2gtdmFscHJpbnQuYywgdGhlIG5ldyBwYXJhbWV0ZXIgaXMgYWx3YXlzCisgCTAuICBDaGFuZ2VzIGluIGNhbGxzIHRvIHZhbF9wcmludCwgY2hpbGxfdmFsX3ByaW50LCBjX3ZhbF9wcmludAorIAlBZmZlY3RlZCBmdW5jdGlvbnMgYXJlIGNoaWxsX3ZhbF9wcmludF9hcnJheV9lbGVtZW50cywKKyAJY2hpbGxfdmFsX3ByaW50LCBjaGlsbF9wcmludF92YWx1ZV9maWVsZHMsIGNoaWxsX3ZhbHVlX3ByaW50LgorCisJKiBjcC12YWxwcmludC5jIGFkZCB2dGFibGUgcG9pbnRlcnMgbmFtZXMgZm9yIGFDQyAoSFApIGNvbXBpbGVyLgorIAkoY3BfcHJpbnRfY2xhc3NfbWV0aG9kKTogUHJpbnQgbWVzc2FnZSBmb3IgSFAvYUNDIGNhc2UuCisJKGNwX3ByaW50X2NsYXNzX21lbWJlcik6IEFkZCBjb21tZW50cy4KKwkoY3BfcHJpbnRfdmFsdWUpOiBBZGp1c3QgYWRkcmVzcyBjb21wdXRhdGlvbnMgZm9yIHZpcnR1YWwgYmFzZQorIAljbGFzc2VzLiAgYWRkIG5ldyBwYXJhbWV0ZXIgJ29mZnNldCcuICBGaW5kIGNvcnJlY3Qgb2Zmc2V0IGZvcgorIAliYXNlIGNsYXNzIGluIEhQL2FDQyBjYXNlLiAgQ2hhbmdlIGNhbGwgdG8gY3BfcHJpbnRfdmFsdWVfZmllbGRzCisgCXRvIGhhdmUgZXh0cmEgcGFyLgorCShjcF9wcmludF92YWx1ZV9maWVsZHMpOiBEbyBub3QgcHJpbnQgYWxzbyBpZiB0aGUgb25seSBmaWVsZCBpcworIAl0aGUgdnRhYmxlIHBvaW50ZXIuICBQcmludCBvdXQgdnRhYmxlIHB0ciwgZm9yIEhQL2FDQyBjb21waWxlZAorIAljYXNlLiAgZG8gbm90IHByaW50IGxlYWRpbmcgJz0nIGluIGNhc2Ugb2YgYW5vbnltb3VzIHVuaW9uLCBvcgorIAlzdHJ1Y3QuICBhZGQgbmV3IHBhcmFtZXRlciAnb2Zmc2V0Jy4gIERvIG5vdCBwcmludCB0aGUgdnRhYmxlCisgCXBvaW50ZXIgYXMgYSBtZW1iZXIsIGluIHRoZSBIUCBhQ0MgY2FzZS4gIENoYW5nZWQgY2FsbHMgdG8KKyAJdmFsX3ByaW50IHRvIGhhdmUgZXh0cmEgcGFyYW1ldGVyLgorCShjcF9wcmludF9ocGFjY192aXJ0dWFsX3RhYmxlX2VudHJpZXMpOiBOZXcgZnVuY3Rpb24uIFByaW50IHZ0YWJsZQorIAllbnRyaWVzLCBpbiBIUC9hQ0MgY29tcGlsZWQgY2FzZS4KKwkoY3BfcHJpbnRfc3RhdGljX2ZpZWxkKTogQ2hhbmdlIGNhbGwgdG8gY3BfcHJpbnRfdmFsdWVfZmllbGRzLCBhbmQKKyAJdmFsX3ByaW50LgorCisJKiBkMzB2LXRkZXAuYyAoZDMwdl9wcmludF9yZWdpc3Rlcik6IEFkZCBlbWJlZGRlZF9vZmZzZXQgcGFyYW0KKwl0byB2YWxfcHJpbnQgY2FsbC4KKworCSogZGVmcy5oOiBBZGRpdGlvbmFsIGluY2x1ZGUgZmlsZXMgaW5jbHVkZWQgd2hlbiBUVUkgaXMgZGVmaW5lZC4KKwkoZ2RiX2ZpbGVfaXNhdHR5KTogTmV3IGZ1bmN0aW9uIGRlY2wuCisJKEdEQl9GSUxFKTogSWYgVFVJIGlzIGRlZmluZWQsIGRlZmluZSBhIHN0cnVjdHVyZSByYXRoZXIKKyAJdGhhbiBtYWtpbmcgdGhpcyBhbiBhbGlhcyBmb3IgRklMRS4KKwkoZ2RiX3N0ZG91dCwgZ2RiX3N0ZGVycik6IElmIFRVSSBpcyBkZWZpbmVkLCB0aGVuIGRlZmluZSB0aGVzZQorCWFzIHBvaW50ZXJzIHRvIHZhcmlhYmxlcyBvZiB0eXBlIEdEQl9GSUxFIHJhdGhlciB0aGFuIG1ha2luZyB0aGVtCisJYmUgYWxpYXNlcyBmb3Igc3Rkb3V0IGFuZCBzdGRlcnIuCisJKFRVSURPKTogQWRkIGRlZmluaXRpb24gY29uZGl0aW9uYWxpemVkIG9uIGRlZmluaXRpb24KKwkob3IgbGFjayB0aGVyZW9mKSBvZiBUVUkuCisJKGNvbW1hbmRfY2xhc3MpOiBBZGQgdHdvIGFkZGl0aW9uYWwgdmFsdWVzLgorCShwcmVjaXNpb25fdHlwZSk6IE5ldyBlbnVtLgorCShnZGJfZmNsb3NlKTogQWRkIGRlY2wuCisJKHN0b3JlX2FkZHJlc3MpOiBDaGFuZ2UgcHJvdG90eXBlIHRvIG1hdGNoIGZ1bmN0aW9uLgorCSh0dWlfdmVyc2lvbiwgeGRiX2NvbW1hbmRzLCBkYnhfY29tbWFuZHMpOiBBZGQgZGVjbHMuCisJKGdkYl9maWxlX2RlYWxsb2NhdGUpOiBOZXcgZnVuY3Rpb24gZGVjbAorCShwYV9kb19zdHJjYXRfcmVnaXN0ZXJzX2luZm8pOiBOZXcgZnVuY3Rpb24gZGVjbC4KKwkoc3RyZWFtdHlwZSk6IE5ldyBlbnVtZXJhdGVkIHR5cGUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBvdXRwdXQgdG8KKyAJYSBGSUxFIGFuZCBvdXRwdXQgdG8gYSBidWZmZXIuCisJKHR1aV9zdHJlYW0pOiBOZXcgc3RydWN0IHR5cGUsIG5hbWVkIEdEQl9GSUxFLgorCShnZGJfc3Rkb3V0KTogT2YgdHlwZSBHREJfRklMRSwgd2lsbCBwYXNzIHRoaXMgYXJvdW5kIGdkYiByYXRoZXIKKyAJdGhhbiBzdGRvdXQuCisJKGdkYl9zdGRlcnIpOiBPZiB0eXBlIEdEQl9GSUxFLCB3aWxsIHBhc3MgdGhpcyBhcm91bmQgZ2RiIHJhdGhlcgorIAl0aGFuIHN0ZGVyci4KKwkoZnB1dHNfdW5maWx0ZXJlZF9ob29rKTogQ2hhbmdlIHN0cmVhbSBwYXJhbWV0ZXIgZnJvbSBGSUxFIHRvCisgCUdEQl9GSUxFLgorCShmbHVzaF9ob29rKTogQ2hhbmdlIHN0cmVhbSBwYXJhbWV0ZXIgZnJvbSBGSUxFIHRvIEdEQl9GSUxFLgorCShnZGJfZmNsb3NlKTogRml4IGRlY2wgZm9yIGdkYl9mY2xvc2U7IHBhcmFtZXRlciBpcyBub3cgb2YKKyAJdHlwZSBHREJfRklMRSAqKi4KKwkoZ2RiX2ZpbGVfYWRqdXN0X3N0cmJ1Zik6IE5ldyBmdW5jdGlvbiBkZWNsLiBmdW5jdGlvbiBsaXZlcworIAlpbiB1dGlscy5jLgorCShnZGJfZmlsZV9pbml0X2FzdHJpbmcpOiBOZXcgZnVuY3Rpb24gZGVjbC4gZnVuY3Rpb24gbGl2ZXMKKyAJaW4gdXRpbHMuYy4KKwkoZ2RiX2ZpbGVfZ2V0X3N0cmJ1Zik6IE5ldyBmdW5jdGlvbiBkZWNsLiBmdW5jdGlvbiBsaXZlcyBpbgorIAl1dGlscy5jLgorCShzb3VyY2VfZnVsbF9wYXRoX29mKTogRGVjbGFyZS4KKworCSogZXhlYy5jIChfaW5pdGlhbGl6ZV9leGVjKTogTWFrZSBkZWZpbml0aW9uIG9mIGZpbGUgY29tbWFuZCBiZQorCWRlcGVuZGVudCB1cG9uIGRieF9jb21tYW5kcyBub3QgYmVpbmcgc2V0LgorCShleGVjX2ZpbGVfYXR0YWNoKTogTmV3IGZ1bmN0aW9uLgorCShleGVjX2ZpbGVfY29tbWFuZCk6IENhbGwgaXQuCisJKGV4ZWNfb3BzKTogQWRkIG5ldyB0YXJnZXQgdmVjdG9yIGZpZWxkcy4KKworCSogZi1sYW5nLmggKGZfcHJpbnRfdHlwZSk6IENoYW5nZSBGSUxFIHRvIEdEQl9GSUxFIGluIGRlY2wuCisJKGZfdmFsX3ByaW50KTogRGl0dG8uCisJKGZfdmFsX3ByaW50KTogQWRkIHBhcmFtZXRlciB0byB0aGUgZnVuY3Rpb24gZGVjbC4KKworCSogZi12YWxwcmludC5jIChfaW5pdGlhbGl6ZV9mX3ZhbHByaW50KTogSWYgeGRiX2NvbW1hbmRzIGlzIHNldCwKKwlkZWZpbmUgbGMgY29tbWFuZC4KKwkoZjc3X2NyZWF0ZV9hcnJheXByaW50X29mZnNldF90YmwpOiBDaGFuZ2UgRklMRSB0byBHREJfRklMRS4KKwkoZjc3X3ByaW50X2FycmF5KTogRGl0dG8uCisJKGY3N19wcmludF9hcnJheV8xKTogRGl0dG8uCisJKGZfdmFsX3ByaW50KTogRGl0dG8uCisJKGZfdmFsX3ByaW50KTogQWRkIGEgcGFyYW1ldGVyOyB0aGlzIG5ldyBwYXJhbWV0ZXIgaXMgY3VycmVudGx5CisgCW9ubHkgbm9uLXplcm8gd2hlbiBoYW5kbGluZyBDKysgZXhwcmVzc2lvbnMuICBJbiB0aGlzIGZpbGUgaXRzCisgCXZhbHVlIGlzIGFsd2F5cyAwLiAgY2hhbmdlZCBmZmx1c2ggdG8gZ2RiX2ZsdXNoLgorCisJKiBnbnUtbmF0LmM6IChpbml0X2dudV9vcHMpOiBBZGQgbmV3IHRhcmdldCB2ZWN0b3IgZmllbGRzLgorCShnbnVfY3JlYXRlX2luZmVyaW9yKTogQWRkIHBhcmFtIHRvIGZvcmtfaW5mZXJpb3IgY2FsbC4KKworCSogaHBwYS10ZGVwLmMgKGFmdGVyX3Byb2xvZ3VlKTogSWYgZiBpcyBOVUxMLCBkb24ndCBkZXJlZmVyZW5jZQorIAlpdC4gIGlmIG5vIGRlYnVnIGluZm8sIHJldHVybiB6ZXJvIHRlbGxpbmcgY2FsbGVyIHRoYXQgd2UgbmVlZCB0bworIAlmaW5kIHRoZSBlbmQgb2YgdGhlIHByb2xvZ3VlIHZpYSB0aGUgaGFyZCB3YXkgKGluc3RydWN0aW9uCisgCWV4YW1pbmF0aW9uKS4KKwkoZmluZF91bndpbmRfZW50cnkpOiBBdm9pZCBkZXJlZmVyZW5jaW5nIGEgbnVsbAorCXBvaW50ZXIuCisJKGhwcGFfcGlkX3RvX2V4ZWNfZmlsZSk6IERlbGV0ZWQgLS0gbm8gbG9uZ2VyIHVzZWQuCisJKGhwcGFfcHJlcGFyZV90b19wcm9jZWVlZCk6IEFkZCBwcm90b3R5cGUuCisJKHJlYWRfdW53aW5kX2luZm8pOiBQdXJlY292IGNvbW1lbnRzLCBidWcgZml4ZXMuCisJKGZpbmRfdW53aW5kX2VudHJ5KTogUHVyZWNvdiBjb21tZW50cywgYnVnIGZpeGVzLgorCShmaW5kX3N0dWJfd2l0aF9zaGxfZ2V0KTogUHVyZWNvdiBjb21tZW50cy4KKwkoZnJhbWVfY2hhaW4pOiBBZGRpdGlvbmFsIHBhcmVucy4KKwkoaHBwYV9wdXNoX2FyZ3VtZW50cyk6IENoYW5nZXMgdG8gY29tbWVudGVkIG91dCB2ZXJzaW9uIG9mIHJvdXRpbmUuCisJKGhwcGFfZml4X2NhbGxfZHVtbXkpOiBQdXJlY292IGNvbW1lbnRzLCBmaXggbG9jYXRpb24gb2YgZW5kLm8uCisJKGluX3NvbGliX2NhbGxfdHJhbXBvbGluZSk6IFB1cmVjb3YgY29tbWVudHMuCisJKGluX3NvbGliX3JldHVybl90cmFtcG9saW5lKTogUHVyZWNvdiBjb21tZW50cy4KKwkoc2V0dXBfZF9waWRfaW5faW5mZXJpb3IpOiBGaXggbG9jYXRpb24gb2YgZW5kLm8uCisJKGluaXRpYWxpemVfaHBfY3h4X2V4Y2VwdGlvbl9zdXBwb3J0KTogRml4IGxvY2F0aW9uIG9mIGVuZC5vLgorCShjaGlsZF9lbmFibGVfZXhjZXB0aW9uX2NhbGxiYWNrKTogUHVyZWNvdiBjb21tZW50cy4KKwkocGFfZG9fc3RyY2F0X3JlZ2lzdGVyc19pbmZvKTogSGFzIGEgbmV3IHBhcmFtZXRlciwgcHJlY2lzaW9uLCAKKwl3aGljaCBpcyBwYXNzZWQgaW50byB0aGUgY2FsbCB0byBwYV9zdHJjYXRfZnBfcmVnIHRvIGluZGljYXRlCisJd2hldGhlciB0byBkaXNwbGF5IHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgdXNpbmcgCisJc2luZ2xlIG9yIGRvdWJsZSBwcmVjZWlzaW9uLgorCShwYV9zdHJjYXRfcmVnaXN0ZXJzKTogSW50cm9kdWNlIGxvY2FsIHZhcmlhYmxlLCBwcmVjaXNpb24sIGFuZCAKKwlwYXNzIGl0IGludG8gY2FsbCB0byBwYV9zdHJjYXRfZnBfcmVnLgorCShwYV9zdHJjYXRfZnBfcmVnKTogTW9kaWZpZWQgZnVuY3Rpb24uIE5ldyBwYXJhbWV0ZXIsIHByZWNpc2lvbiwKKwl1c2VkIGJ5IGZ1bmN0aW9uIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHVzZSBzaW5nbGUgb3IgZG91YmxlCisJcHJlY2lzaW9uLiBBbHNvIGFkZCB0aGUgY29kZSB0byBwdXQgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlCisJaW50byBhIGJ1ZmZlci4KKwkocGFfZG9fc3RyY2F0X3JlZ2lzdGVyc19pbmZvKTogTmV3IHJvdXRpbmUuIGNhbGxlZCBieSAKKwl0dWkvdHVpUmVncy5jOl90dWlSZWdpc3RlckZvcm1hdCB0byBwbGFjZSBhIHJlZ2lzdGVyIG5hbWUgCisJYW5kIHZhbHVlIGludG8gYSBzdHJpbmcgYnVmZmVyLiBJbnRlcmZhY2UgbWF5IGNoYW5nZSBpbgorCWZ1dHVyZS4gQ2hlY2tpbmcgdGhpcyBpbiBzbyB0aGF0IHdlIGhhdmUgc29tZXRoaW5nIAorCWZ1bmN0aW9uYWwgZm9yIEhQLgorCShwYV9zdHJjYXRfcmVnaXN0ZXJzKTogTmV3IHJvdXRpbmUsIGNhbGxlZCBieSAKKwlwYV9kb19zdHJjYXRfcmVnaXN0ZXJzX2luZm8uIERvZXMgc2FtZSB0aGluZyBhcyAKKwlwYV9wcmludF9yZWdpc3RlcnMgZXhjZXB0IGl0IHRha2VzIGEgc3RyZWFtIHBhcmFtZXRlci4gCisJVGhpcyByb3V0aW5lIHNob3VsZCBkaXNhcHBlYXIgaW4gZnV0dXJlLiBDaGVja2luZyBpbgorCXNvIHRoYXQgd2UgaGF2ZSBzb21ldGhpbmcgZnVuY3Rpb25hbCB0byBnaXZlIEhQCisJKHBhX3N0cmNhdF9mcF9yZWcpOiBOZXcgcm91dGluZSwgY2FsbGVkIGJ5IAorCXBhX2RvX3N0cmNhdF9yZWdpc3RlcnNfaW5mbyBhbmQgcGFfc3RydmF0X3JlZ2lzdGVycworCXRvIHBsYWNlIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgbmFtZSBhbmQgdmFsdWUgaW50bworCWEgYnVmZmVyLiBUaGlzIGludGVyZmFjZSBtYXkgY2hhbmdlIGluIGZ1dHVyZS4gCisJQ2hlY2tpbmcgaW4gc28gdGhhdCB3ZSBoYXZlIHNvbWV0aGluZyBmdW5jdGlvbmFsIHRvIGdpdmUgSFAuCisJKHBhX3ByaW50X2ZwX3JlZyk6IENoYW5nZSBwcm90b3R5cGUgdG8gbWF0Y2ggZGVmJ24uCisJKHBhX3JlZ2lzdGVyX2xvb2tfYXNpZGUpOiBGaXggY29tbWVudCBpbW1lZGlhdGVseSBiZWZvcmUgZnVuY3Rpb24uCisJQ2hhbmdlcyB0byBiZXR0ZXIgc3VwcG9ydCBzdGFjayB1bndpbmRpbmcsIHJlYWRpbmcgYW5kIHdyaXRpbmcKKyAJcmVnaXN0ZXJzIGZvciBIUFVYLiAgTmV3IGluY2x1ZGVzIHB0cmFjZS5oLCBiZmQuaCwgZGwuaC4KKwkoaW50ZXJuYWxpemVfdW53aW5kcyk6IEluaXRpYWxpemUgbmV3IGZpZWxkcyBpbiB0YWJsZS4KKwkocmVhZF91bndpbmRfaW5mbyk6IEVudHJpZXMgaW4gdGhlIHRhYmxlIGFyZSBub3cgbW9yZSBjb21wbGV4CisgCXN0cnVjdHVyZXMuIFJlZmVyZW5jZXMgb2YgdGhlIGZvcm0gLi4uLT50YWJsZVtpbmRleF0uc3R1Yl90eXBlIGFyZQorIAlub3cgLi4uLT50YWJsZVtpbmRleF0uc3R1Yl91bndpbmQuc3R1Yl90eXBlLgorCShmaW5kX3Byb2NfZnJhbWVzaXplKTogQWRkIGEgY2hlY2sgZm9yIHBjID09IDAuCisJKHJwX3NhdmVkKTogRW50cmllcyBpbiB0aGUgdGFibGUgYXJlIG5vdyBtb3JlIGNvbXBsZXgKKyAJc3RydWN0dXJlcy4gUmVmZXJlbmNlcyBvZiB0aGUgZm9ybSAuLi4tPnRhYmxlW2luZGV4XS5zdHViX3R5cGUgYXJlCisgCW5vdyAuLi4tPnRhYmxlW2luZGV4XS5zdHViX3Vud2luZC5zdHViX3R5cGUuCisJKGZyYW1lbGVzc19mdW5jdGlvbl9pbnZvY2F0aW9uKTogU3R1Yl90eXBlIGJlY29tZXMKKyAJc3R1Yl91bndpbmQuc3R1Yl90eXBlCisJKHNhdmVkX3BjX2FmdGVyX2NhbGwpOiBTdHViX3R5cGUgYmVjb21lcyBzdHViX3Vud2luZC5zdHViX3R5cGUKKwkoaHBwYV9mcmFtZV9zYXZlZF9wYyk6IFN0dWJfdHlwZSBiZWNvbWVzIHN0dWJfdW53aW5kLnN0dWJfdHlwZQorCShmcmFtZV9jaGFpbl92YWxpZCk6IFN0dWJfdHlwZSBiZWNvbWVzIHN0dWJfdW53aW5kLnN0dWJfdHlwZQorCShocHBhX2NhbGxfZHVtbXkpOiBTdHViX3R5cGUgYmVjb21lcyBzdHViX3Vud2luZC5zdHViX3R5cGUKKwkocGFfcHJpbnRfZnBfcmVnKTogQWRkaXRpb25hbCBwYXJhbXMgdG8gY2FsbCB2YWxfcHJpbnQKKwkoaW5fc29saWJfY2FsbF90cmFtcG9saW5lKTogU3R1Yl90eXBlIGJlY29tZXMKKyAJc3R1Yl91bndpbmQuc3R1Yl90eXBlCisJKGluX3NvbGliX3JldHVybl90cmFtcG9saW5lKTogU3R1Yl90eXBlIGJlY29tZXMKKyAJc3R1Yl91bndpbmQuc3R1Yl90eXAKKwkoc2tpcF90cmFtcG9saW5lX2NvZGUpOiBBZGRpdGlvbmFsIGNvZGUgdG8gaGFuZGxlIGV4dGVybmFsCisgCWR5bmNhbGxzLiBBbHNvIHN0dWJfdHlwZSBiZWNvbWVzIHN0dWJfdW53aW5kLnN0dWJfdHlwZQorCShocHBhX3BpZF90b19leGVjX2ZpbGUpOiBOZXcgZnVuY3QuIEZPciBIUFVYIDEwLjAgYW5kIGJleW9uZCB0aGVyZQorIAlpcyBhbiBleHBsaWNpdCBwdHJhY2UgcmVxdWVzdCBmb3IgZ2V0dGluZyB0aGUgcGF0aG5hbWUgYXNzb2NpYXRlZAorIAl3aXRoIGEgcHJvY2VzcyBpZCAocGlkKS4KKwkoaHBwYV9waWRfdG9fZXhlY19maWxlKTogUmVtb3ZlIHVud2FudGVkIHBhcmFtIGZyb20gY2FsbCB0bworIAljYWxsX3B0cmFjZS4KKwkoYXJnc19mb3JfZmluZF9zdHViKTogTmV3IHN0cnVjdHVyZS4KKwkoZmluZF91bndpbmRfZW50cnkpOiBEZWFsIHdpdGggbnVsbCBpbnB1dCBwYyB2YWx1ZS4KKwkocnBfc2F2ZWQpOiBEaXR0by4KKwlGb3IgdGhlIGltcG9ydCBzdHViLCByZXR1cm4gLTI0IGFsd2F5cy4KKwkoaHBwYV9mcmFtZV9zYXZlZF9wYyk6IFNhdmUgb2xkIHBjIHZhbHVlLCB0byBkZXRlY3Qgd2UgYXJlIGluIGEgbG9vcC4KKwkoaW5pdF9leHRyYV9mcmFtZV9pbmZvKTogVXNlIFRBUkdFVF9SRUFEX0ZQLgorCShmcmFtZV9jaGFpbik6IEluY2x1ZGUgdGhyZWFkIHN1cHBvcnQuCisJSWYgdGhlIGNhbGxlcidzIHBjIGlzIHplcm8sIHdlIGxvc2UgYW5kIHJldHVybiwganVzdCBsaWtlIHN0YWNrCisJYm90dG9tLgorCURpc2FibGUgd2FybmluZyBhYm91dCBiZWluZyB1bmFibGUgdG8gZmluZCB1bndpbmQgaW5mby4KKwkoaHBwYV9wdXNoX2FyZ3VtZW50cyk6IFJld3JpdGUuCisJKGhwcGFfdmFsdWVfcmV0dXJuZWRfZnJvbV9zdGFjayk6IE5ldyBmdW5jdGlvbi4gSGFuZGxlcyByZXR1cm5pbmcKKyAJYSB2YWx1ZSBsYXJnZXIgdGhhbiA2NCBiaXRzLCBzdG9yZWQgb24gdGhlIHN0YWNrLgorCShmaW5kX3N0dWJfd2l0aF9zaGxfZ2V0KTogTmV3IGZ1bmN0aW9uLiBUbyBsb29rIHVwIHN5bWJvbHMgaW4gc2hsaWJzLgorCShjb3Zlcl9maW5kX3N0dWJfd2l0aF9zaGxfZ2V0KTogTmV3IGZ1bmN0aW9uLiBDb3ZlciByb3V0aW5lIGZvciAKKwlmaW5kX3N0dWJfd2l0aF9zaGxfZ2V0IHRvIHBhc3MgdG8gY2F0Y2hfZXJyb3JzLgorCShocHBhX2ZpeF9jYWxsX2R1bW15KTogQ29tbWVudCBvdXQgb2xkIHN0dWIgbWVjaGFuaXNtLgorCVJld3JpdGUgdXNpbmcgZHluY2FsbC4KKwkodGFyZ2V0X3JlYWRfZnApOiBOZXcgZnVuY3Rpb24uCisJKHBhX2RvX3JlZ2lzdGVyc19pbmZvKTogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIHN0YXJ0IGF0IEZQNC4KKwkocGFfcHJpbnRfcmVnaXN0ZXJzKTogVXNlIEZQNF9SRUdOVU0gaW5zdGVhZCBvZiA3Mi4KKwkoc2tpcF90cmFtcG9saW5lX2NvZGUpOiBEbyBtYWNoaW5lIGluc3RydWN0aW9uIG1hdGNoaW5nIGZvciBQQTIuMC4KKwkoc2V0dXBfZF9waWRfaW5faW5mZXJpb3IpOiBOZXcgZnVuY3Rpb24uIEV4Y2VwdGlvbiBoYW5kbGluZyBzdXBwb3J0LgorCShpbml0aWFsaXplX2hwX2N4eF9leGNlcHRpb25fc3VwcG9ydCk6IERpdHRvLgorCShjaGlsZF9lbmFibGVfZXhjZXB0aW9uX2NhbGxiYWNrKTogRGl0dG8uCisJKGNoaWxkX2dldF9jdXJyZW50X2V4Y2VwdGlvbl9ldmVudCk6IERpdHRvLgorCisJKiBocHV4LXRocmVhZC5jIChocHV4X3RocmVhZF9vcHMpOiBBZGQgbmV3IHRhcmdldCB2ZWN0b3IgZmllbGRzLgorCisJKiBpbmZjbWQuYzogSW5jbHVkZSBvYmpmaWxlcy5oLgorCShhdHRhY2hfY29tbWFuZCk6IE5ldyBsb2NhbCB2YXJpYWJsZSwgZXhlY19maWxlLCBhZGQgY29kZSB0bworIAlkZXRlcm1pbmUgZXhlY19maWxlIGZyb20gcGlkIGlmIGV4ZWNfZmlsZSBpcyBub3QgYWxyZWFkeSBrbm93biwKKwljYWxsIG5ldyB0YXJnZXQgb3BlcmF0aW9uLCB0YXJnZXRfcG9zdF9hdHRhY2ggLS0gYSBuby1vcCB1bmxlc3MKKwlvbiBIUFVYSFBQQS4KKwkoZGV0YWNoX2NvbW1hbmQpOiBBZnRlciBkZXRhY2hpbmcsIGRvIGEgU09MSUJfUkVTVEFSVC4KKwkob2JqZmlsZXMuaCk6IEZpeCB0eXBvIG9uIGluY2x1ZGUgbGluZS4KKwkocnVuX2NvbW1hbmQpOiBPbmx5IGNhbGwgU09MSUJfUkVTVEFSVCBpZiBpdCdzIGRlZmluZWQuCisJKGRldGFjaF9jb21tYW5kKTogRGl0dG8uCisJKHJ1bl9jb21tYW5kKTogSWYgcHJvZ3JhbSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQsIGFuZCBkZWNpZGUKKwl0byByZXN0YXJ0IGl0LCB0aGUga2lsbCB0aGUgdGFyZ2V0LCBmbHVzaCB0aGUgY2FjaGVzLCAKKwljYWxsIGluaXRfd2FpdF9mb3JfaW5mZXJpb3IuIEFsc28gcHVyZ2Ugb2xkIHNvbGliIG9iamZpbGVzLgorCShydW5fc3RhY2tfZHVtbXkpOiBBZGQgY2FsbHMgdG8KKyAJZGlzYWJsZV93YXRjaHBvaW50c19iZWZvcmVfaW50ZXJhY3RpdmVfY2FsbF9zdGFydCBhbmQKKyAJZW5hYmxlX3dhdGNocG9pbnRzX2FmdGVyX2ludGVyYWN0aXZlX2NhbGxfc3RvcHMuCisJKGZpbmlzaF9jb21tYW5kKTogQWx0ZXIgY29kZSBoYW5kbGluZyB0aGUgZXZhbHVhdGlvbiBhbmQgcHJpbnRpbmcKKyAJb2YgdGhlIHRhcmdldCBmdW5jdGlvbidzIHJldHVybiB2YWx1ZS4KKwkoYXR0YWNoX2NvbW1hbmQpOiBXaGVuIGdpdmVuIGEgcGlkLCBidXQgbm8gZXhlYyBmaWxlLCB0cnkgdG8KKyAJZGV0ZXJtaW5lIHRoZSBleGVjIGZpbGUgZnJvbSB0aGUgcHJvY2Vzcy4gSWYgdGhlIHByb2Nlc3MgZG9lcyBub3QKKyAJcmVjb3JkIGEgZnVsbCBwYXRoIG5hbWUsIHRyeSB0byBxdWFsaWZ5IHRoZSBmaWxlbmFtZSBhZ2FpbnN0IHRoZQorIAlzb3VyY2UgcGF0aC4KKwkoX2luaXRpYWxpemVfaW5mY21kKTogQWRkIHNvbWUgdmVyYmlhZ2UgYWJvdXQgaG93IHRvIHVzZSB0aGUKKyAJYXR0YWNoIGNvbW1hbmQuCisJKGRvX3JlZ2lzdGVyc19pbmZvKTogQ2hhbmdlZCBjYWxscyB0byB2YWxfcHJpbnQKKwltYWRlIHRoZSBzeW1maWxlLmggaW5jbHVkZSBwcmVjZWVkIHRoZSAKKwlvYmpmaWxlcy5oIGluY2x1ZGUuIFRoZSBvdGhlciBvcmRlcmluZyBjYXVzZWQgYSAKKwljb21waWxlIHByb2JsZW0gKGluY29tcGxldGVseSBkZWZpbmVkIHR5cGVzKS4KKworCSogaW5mdGFyZy5jIChjaGlsZF9wb3N0X2F0dGFjaCk6IEZpeCBkZWNsLCBtYWtlIHN0YXRpYy4KKwkocHJvY193YWl0KTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLgorCShjaGlsZF9pbnNlcnRfZm9ya19jYXRjaHBvaW50LCBldGMpOiBGaXggcmV0dXJuIHR5cGUuCisJKGNoaWxkX2RldGFjaF9mcm9tX3Byb2Nlc3MpOiBEZWNsYXJlLgorCShjaGlsZF9hdHRhY2hfdG9fcHJvY2Vzcyk6IERlY2xhcmUuCisJKGNoaWxkX3N0b3ApOiBNYWtlIHN0YXRpYyB0byBtYXRjaCBkZWNsLgorCShwdHJhY2VfaGltKTogQ2hhbmdlIHByb3RvdHlwZSBiYWNrIHRvIHJldHVybiBpbnQuIAorCShwdHJhY2VfbWUpOiBSZW1vdmUgZGVidWcgb3V0cHV0LCBwYXNzIE5VTEwgdG8gZm9ya19pbmZlcmlvciBpZgorIAlub3QgSFBVWC4KKwkocHJvY193YWl0KTogZnVuY3Rpb24gcHJvdG90eXBlIGFuZCBkZWZpbml0aW9uIGFyZSBlbmNsb3NlZCBieQorIAlwcm9jX3dhaXQgaWZuZGVmCisJKGNoaWxkX2F0dGFjaF90b19wcm9jZXNzKTogTmV3IGZ1bmN0aW9uLCBkb2VzIG1vc3Qgb2YgdGhlIHdvcmsKKyAJdGhhdCBjaGlsZF9hdHRhY2ggdXNlZCB0byBkbyBhbmQgc29tZSBhZGRpdGlvbmFsIHdvcmsgdG8gZGV0ZXJtaW5lCisgCXdoZXRoZXIgZ2RiIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gdGhlIHRhcmdldCBob3cgdG8gcmVhY3QuCisJKGNoaWxkX2F0dGFjaCk6IEFsdGVyZWQuIEl0J3Mgbm93IGEgd3JhcHBlciBmb3IKKyAJY2hpbGRfYXR0YWNoX3RvX3Byb2Nlc3MuCisJKGNoaWxkX3JlcXVpcmVfYXR0YWNoKTogTmV3IGZ1bmN0aW9uLCBjYWxsZWQgaWYgc2hvdWxkIGF0dGFjaCBldmVuCisgCXdoZW4gZ2RiIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gdGFyZ2V0LgorCShjaGlsZF9kZXRhY2hfZnJvbV9wcm9jZXNzKTogTmV3IGZ1bmN0aW9uLCBkb2VzIG1vc3Qgb2YgdGhlIHdvcmsKKyAJdGhhdCBjaGlsZF9kZXRhY2ggdXNlZCB0byBkbyBhbmQgc29tZSBhZGRpdGlvbmFsIHdvcmsgdG8gZGV0ZXJtaW5lCisgCXdoZXRoZXIgZ2RiIGlzIGN1cnJlbnRseSBhdHRhY2hlZCB0byB0aGUgdGFyZ2V0LgorCShjaGlsZF9kZXRhY2gpOiBBbHRlcmVkLiBJdCdzIG5vdyBhIHdyYXBwZXIgZm9yCisgCWNoaWxkX2RldGFjaF9mcm9tX3Byb2Nlc3MuCisJKGNoaWxkX3JlcXVpcmVfZGV0YWNoKTogTmV3IGZ1bmN0aW9uLCBjYWxsZWQgaWYgc2hvdWxkIHRyeSB0bworIAlkZXRhY2ggZXZlbiB3aGVuIGdkYiBpcyBub3QgYXR0YWNoZWQgdG8gdGFyZ2V0LgorCShwdHJhY2VfaGltKTogQ2FsbHMgYSBuZXcgZnVuY3Rpb24sCisgCXRhcmdldF9hY2tub3dsZWRnZV9mb3JrZWRfY2hpbGQuICBDdXJyZW50bHksCisgCXRhcmdldF9hY2tub3dsZWRnZV9mb3JrZWRfY2hpbGQsIGlzIG9ubHkgZGVmaW5lZCB0byBkbyBzb21ldGhpbmcKKyAJZm9yIEhQVVguCisJKGNoaWxkX2NyZWF0ZV9pbmZlcmlvcik6IENoYW5nZWQgY2FsbCB0byBmb3JrX2luZmVyaW9yLgorCShjaGlsZF9vcHMpOiBBZGQgdG9fcmVxdWlyZV9hdHRhY2ggYW5kIHRvX3JlcXVpcmVfZGV0YWNoIGZpZWxkcworIAl0byB0aGUgY2hpbGRfb3BzIHRhcmdldCBvcHMgdmVjdG9yLgorCVNvbWUgaGFja3MgZm9yIHR0cmFjZSB3b3JrOgorCShjaGlsZF93YWl0KTogQWRkaXRpb25hbCBsb2NhbCB2YXJpYWJsZXMsIGFkZGl0aW9uYWwgY29kZSBpbgorCXdoaWxlIGxvb3AgdG8gY2hlY2sgZm9yIHByb2Nlc3MgZXhpdGVkLCBwcm9jZXNzIGZvcmtlZCwgCisJcHJvY2VzcyB2Zm9ya2VkLCBwcm9jZXNzIGV4ZWNkLgorCShjaGlsZF90aHJlYWRfYWxpdmUpOiBKb2huIEIuIHNlZW1zIHRvIHRoaW5rIHRoYXQgdGhlIGtpbGwgCisJY2FsbCBpcyBpbmFwcHJvYXByaWF0ZSBmb3IgSFBVWC4KKwkoY2hpbGRfYXR0YWNoX3RvX3Byb2Nlc3MpOiBVc2luZyBzdHJ0b2wgcmF0aGVyIHRoYW4gYXRvaS4KKwlubyBsb25nZXIgY2hlY2sgZm9yIGNhc2Ugd2hlcmUgdGhlcmUgaXMgbm8ga25vd24gZXhlYyBmaWxlLgorCShjaGlsZF9wb3N0X2F0dGFjaCk6IE5ldyBmdW5jdGlvbiwgYSBkZWZhdWx0LCBhIG5vLW9wLgorIAkoY2hpbGRfaW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCk6IE5ldyBmdW5jdGlvbiwgYSBkZWZhdWx0LCBhIG5vLW9wLgorCShjaGlsZF9yZW1vdmVfZm9ya19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uLCBhIGRlZmF1bHQsIGEgbm8tb3AuCisJKGNoaWxkX2luc2VydF92Zm9ya19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uLCBhIGRlZmF1bHQsIGEgbm8tb3AuCisJKGNoaWxkX3JlbW92ZV92Zm9ya19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uLCBhIGRlZmF1bHQsIGEgbm8tb3AuCisJKGNoaWxkX2Nhbl9mb2xsb3dfdmZvcmtfcHJpb3JfdG9fZXhlYyApOm5ldyBmdW5jdGlvbiwgYSBkZWZhdWx0LCAKKyAJYSBuby1vcC4KKwkoY2hpbGRfaW5zZXJ0X2V4ZWNfY2F0Y2hwb2ludCk6IE5ldyBmdW5jdGlvbiwgYSBkZWZhdWx0LCBhIG5vLW9wLgorCShjaGlsZF9yZW1vdmVfZXhlY19jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uLCBhIGRlZmF1bHQsIGEgbm8tb3AuCisJKGNoaWxkX2hhc19leGVjZCk6IE5ldyBmdW5jdGlvbiwgYSBkZWZhdWx0LCByZXR1cm5zIDAuCisJKGNoaWxkX3JlcG9ydGVkX2V4ZWNfZXZlbnRzX3Blcl9leGVjX2NhbGwpOiBOZXcgZnVuY3Rpb24sIGEgCisgCWRlZmF1bHQsIHJldHVybnMgMS4KKwkoY2hpbGRfaGFzX2V4aXRlZCk6IE5ldyBmdW5jdGlvbiwgYSBkZWZhdWx0LgorCShjaGlsZF9jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUpOiBOZXcgZnVuY3Rpb24sIGEgZGVmYXVsdCwgcmV0dXJucyBOVUxMLgorCShjaGlsZF9vcHMpOiBJbml0aWFsaXplIG5ldyB0YXJnZXQgdmVjdG9yIGZpZWxkcy4KKworCSoganYtbGFuZy5oOiAoSmF2YV92YWxfcHJpbnQpOiBBZGQgZW1iZWRkZWRfb2Zmc2V0IHBhcmFtIHRvIGZ1bmMKKyAJZGVjbC4KKworCSoganYtdmFscHJpbnQuYzogQ2hhbmdpbmcgY2FsbHMgdG8gdmFsX3ByaW50IHRvIGFjY29tb2RhdGUgbmV3IHBhcmFtLgorCShqYXZhX3ZhbHVlX3ByaW50KTogQWRkIGVtYmVkZGVkX29mZnNldCBwYXJhbSB0byB2YWxfcHJpbnQgY2FsbAorCShqYXZhX3ByaW50X3ZhbHVlX2ZpZWxkcyk6IEFkZCBlbWJlZGRlZF9vZmZzZXQgcGFyYW0gdG8gdmFsX3ByaW50CisJY2FsbC4KKwkoamF2YV92YWxfcHJpbnQpOiBBZGQgZW1iZWRkZWRfb2Zmc2V0IHBhcmFtLiBhbHRlciBjYWxsIHRvIAorCWNfdmFsX3ByaW50IHRvIGFjY29tb2RhdGUgZW1iZWRkZWRfb2Zmc2V0IHBhcmFtLgorCisJKiBsYW5ndWFnZS5jIChsYW5nX2Jvb2xfdHlwZSk6IFJldHVybiBidWlsdGluX3R5cGVfYm9vbCBpbiBjKysKKwljYXNlLgorCSh1bmtfbGFuZ192YWxfcHJpbnQpOiBBZGQgZW1iZWRkZWRfb2Zmc2V0IHBhcmFtIHRvIAorCXByb3RvdHlwZSBkZWNsIGFuZCBkZWZpbml0aW9uLgorCisJKiBsYW5ndWFnZS5oIChMQV9WQUxfUFJJTlQgbWFjcm8sIGxhX3ZhbF9wcmludCBmdW5jdGlvbiBkZWNsKToKKyAJYWx0ZXJlZCB0byBhY2NvbW9kYXRlIHRoZSBuZXcgcGFyYW1ldGVyIHRvIHRoZSB2YXJpb3VzIHByaW50CisgCWZ1bmN0aW9ucy4KKwkKKwkqIG0yLWxhbmcuaCAobTJfdmFsX3ByaW50KTogQWRkIGEgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbiBkZWNsLgorCisJKiBtMi12YWxwcmludC5jIChtMl92YWxfcHJpbnQpOiBBZGQgYSBwYXJhbWV0ZXIuCisJVGhpcyBwYXJhbWV0ZXIgaXMgY3VycmVudGx5IG9ubHkgdXNlZCB3aGVuIGV2YWx1YXRpbmcgQysrCisgCWV4cHJlc3Npb25zLiBTbywgaXQgaXMgYWx3YXlzIDAgaW4gdGhpcyBmaWxlLgorCisJKiBtMy1uYXQuYyAobTNfY3JlYXRlX2luZmVyaW9yKTogQWRkIHBhcmFtIHRvIGZvcmtfaW5mZXJpb3IgY2FsbAorCShtM19waWRfdG9fZXhlY19maWxlKTogTmV3IGZ1bmN0aW9uCisJKG0zX29wcyk6IEFkZCBuZXcgdGFyZ2V0IHZlY3RvciBmaWVsZHMuCisKKwkqIG1hYy1uYXQuYyAoaW5pdF9jaGlsZF9vcHMpOiBBZGQgbmV3IHRhcmdldCB2ZWN0b3IgZmllbGRzLgorCisJKiBtaXBzLXRkZXAuYzogQ2huYWdlcyB0byBhY2NvbW9kYXRlIGFkZGl0aW9uYWwgcGFyYW1ldGVyCisJdG8gdmFsX3ByaW50LgorCShtaXBzX3ByaW50X3JlZ2lzdGVyKTogQWx0ZXIgY2FsbHMgdG8gdmFsX3ByaW50CisKKwkqIG1vbml0b3IuYyAobW9uaXRvcl93cml0ZSk6IENoYW5nZSBzdGRlcnIgdG8gZ2RiX3N0ZGVyci4KKwkobW9uaXRvcl9yZW1vdmVfYnJlYWtwb2ludCk6IERpdHRvLgorCShpbml0X2Jhc2VfbW9uaXRvcl9vcHMpOiBBZGQgbmV3IHRhcmdldCB2ZWN0b3IgZmllbGRzLgorCisJKiBwcGMtYmRtLmMgKGluaXRfYmRtX3BwY19vcHMpOiBBZGQgbmV3IHRhcmdldCB2ZWN0b3IgZmllbGRzLgorCQorCSogcHJpbnRjbWQuYyAoZG9fZXhhbWluZSk6IFdoZW4gc2F2aW5nIGEgdmFsdWVfcHRyLCByZW1vdmUgaXQgZnJvbQorIAl0aGUgbGlzdCBvZiB2YWx1ZV9wdHIncyB0byBiZSBmcmVlZCBhdXRvbWF0aWNhbGx5OyB3aGVuIGRpc2NhcmRpbmcKKyAJYSBwcmV2aW91c2x5IHNhdmVkIHZhbHVlX3B0ciwgZnJlZSBpdC4KKwkocHJpbnRfZm9ybWF0dGVkKTogVXBkYXRlIGNvbW1lbnRzOyBhZGQgbmV3IGNvbW1lbnRzLgorCShwcmludGZfY29tbWFuZCwgcHJpbnRfaW5zbik6IFB1cmVjb3YgY29tbWVudHMuCisJKF9pbml0aWFsaXplX3ByaW50Y21kKTogQWRkIGFzc2lnbiBhcyBhIGNvbW1hbmQgaWYgZGJ4X2NvbW1hbmRzIGlzCisgCXNldDsgY3JlYXRlIHZhIGFzIGFuIGFsaWFzIGZvciBkaXNhc3NlbWJsZSBpZiB4ZGJfY29tbWFuZHMgaXMgc2V0LgorCShhZGRyZXNzX2luZm8pOiBOZXcgY2FzZXMgTE9DX0lORElSRUNUIGFuZAorIAlMT0NfVEhSRUFEX0xPQ0FMX1NUQVRJQy4KKwkoZGlzcGxheV9jb21tYW5kKTogSWYgdHVpX3ZlcnNpb24gYW5kIGV4cCBzdGFydHMgd2l0aCBhICckJywgdGhlbgorIAlkb24ndCBkaXNwbGF5IGl0IHVubGVzcyB0dWlfdlNldExheW91dFRvIGZhaWxzLgorCShkaXNhc3NlbWJsZV9jb21tYW5kKTogQWRkIHR1aURvIGNhbGxzLgorCShwcmludF9zY2FsYXJfZm9ybWF0dGVkKTogRm9yIGludGVnZXJzIHRoYXQgYXJlIGxvbmcgbG9uZywgY2hlY2sKKyAJdGhlIHByaW50IGZvcm1hdCBhbmQgcHJpbnQgb3V0IGluIGJpbmFyeSBvY3RhbCwgZGVjaW1hbCwgb3IKKyAJaGV4LiBDYWxsIHRoZSBuZXcgcHJpbnRfKl9jaGFycyBmdW5jdGlvbnMgaW4gdmFscHJpbnQuYworCShwcmludF9mcmFtZV9hcmdzKTogQWx0ZXJlZCBjYWxscyB0byB2YWxfcHJpbnQsIHRvIHJlZmxlY3QKKyAJYWRkaXRpb25hbCBwYXJhbWV0ZXIgdG8gdmFsX3ByaW50IChjYXNlIExPQ19CQVNFUkVHX0FSRykuCisKKwkqIHByb2Nmcy5jOiAoUHJvY2ZzX2luaXRfaW5mZXJpb3IpOiBSZXR1cm4gdmFsdWUgaXMgbm93IGEgdm9pZC4KKwkocHJvY2ZzX29wcyk6IEFkZCBuZXcgdGFyZ2V0IHZlY3RvciBmaWVsZHMuCisJKHByb2Nmc19jcmVhdGVfaW5mZXJpb3IpOiBGaXggY2FsbCB0byBmb3JrX2luZmVyaW9yIC0tIG5lZWQgYW5vdGhlcgorCXBhcmFtZXRlci4gCisKKwkqIHJlbW90ZS1hZGFwdC5jIChhZGFwdF9vcGVuKTogQ2hhbmdlIHN0ZGVyciB0byBnZGJfc3RkZXJyLgorCShhZHBhdF9pbnNlcnRfYnJlYWtwb2ludCk6IERpdHRvLgorCShpbml0X2FkYXB0X29wcyk6IEFkZCBuZXcgdGFyZ2V0IHZlY3RvciBmaWVsZHMuCisKKwkqIHJlbW90ZS1hcnJheS5jIChhcnJheV93YWl0KTogQ2hhbmdlIGZmbHVzaCB0byBnZGJfZmx1c2ggYW5kCisgCXN0ZG91dCB0byBnZGJfc3Rkb3V0LgorCShpbml0X2FycmF5X29wcyk6IEFkZCBuZXcgdGFyZ2V0IHZlY3RvciBmaWVsZHMuCisKKwkqIHJlbW90ZS1idWcuYyAoYnVnX2xvYWQpOiBDaGFuZ2UgZmZsdXNoIHRvIGdkYl9mbHVzaDsgc3Rkb3V0IHRvCisgCWdkYl9zdGRvdXQuCisJKGJ1Z193YWl0KTogQ2hhbmdlIHN0ZGVyciB0byBnZGJfc3RkZXJyLgorCShidWdfaW5zZXJ0X2JyZWFrcG9pbnQpOiBEaXR0by4KKwkoaW5pdF9idWdfb3BzKTogQWRkIG5ldyB0YXJnZXQgdmVjdG9yIGZpZWxkcy4KKworCSogcmVtb3RlLWU3MDAwLmMKKwkoaW5pdF9lNzAwMF9vcHMpOiBBZGQgbmV3IHRhcmdldCB2ZWN0b3IgZmllbGRzLgorCSogcmVtb3RlLWViLmMgKGluaXRfZWJfb3BzKTogRGl0dG8uCisJKiByZW1vdGUtZXMuYyAoaW5pdF9lczE4MDBfb3BzKTogRGl0dG8uCisJKGluaXRfZXMxODAwX2NoaWxkX29wcyk6IERpdHRvLgorCSogcmVtb3RlLWVzLmMgKGluaXRfZXMxODAwX29wcyk6IERpdHRvLgorCShpbml0X2VzMTgwMF9jaGlsZF9vcHMpOiBEaXR0by4KKwkqIHJlbW90ZS1obXMuYyAoaW5pdF9obXNfb3BzKTogIERpdHRvLgorCSogcmVtb3RlLWhtcy5jIChpbml0X2htc19vcHMpOiBEaXR0by4KKwkqIHJlbW90ZS1uaW5keS5jIChpbml0X25pbmR5X29wcyk6IERpdHRvLgorCSogcmVtb3RlLW5yb20uYwkoaW5pdF9ucm9tX29wcyk6IERpdHRvLgorCSogcmVtb3RlLW9zOWsuYyAoaW5pdF9yb21idWdfb3BzKTogRGl0dG8uCisJKiByZW1vdGUtcmRwLmMgKGluaXRfcmVtb3RlX3JkcF9vcHMpOiBEaXR0by4KKwkqIHJlbW90ZS1zZHMuYyAoaW5pdF9zZHNfb3BzKTogRGl0dG8uCisJKiByZW1vdGUtc2ltLmMgKGluaXRfZ2Ric2ltX29wcyk6IERpdHRvLgorCSogcmVtb3RlLXN0LmMgKGluaXRfc3QyMDAwX29wcyk6IERpdHRvLgorCSogcmVtb3RlLXVkaS5jIChpbml0X3VkaV9vcHMpOiBEaXR0by4KKwkqIHJlbW90ZS12eC5jIChpbml0X3Z4X29wcyk6IERpdHRvLgorCShpbml0X3Z4X3J1bl9vcHMpOiBEaXR0by4KKwkqIHJlbW90ZS12eC5jOiAoSW5pdF92eF9vcHMpOiBEaXR0by4KKwkoaW5pdF92eF9ydW5fb3BzKTogRGl0dG8uCisKKwkqIHJlbW90ZS1taXBzLmMgKG1pcHNfZ2V0c3RyaW5nKTogQ2hhbmdlIHN0ZGVyciB0byBnZGJfc3RkZXJyLgorCShwbW9uX2luc2VydF9icmVha3BvaW50KTogRGl0dG8uCisJKHBtb25fcmVtb3ZlX2JyZWFrcG9pbnQpOiBEaXR0by4KKwkoY2hlY2tfbHNpX2Vycm9yKTogRGl0dG8uCisJKGNvbW1vbl9icmVha3BvaW50KTogRGl0dG8uCisJKHBtb25fbWFrZWI2NCk6IERpdHRvLgorCisJKiByZW1vdGUtbWlwcy5jIChtaXBzX3hmZXJfbWVtb3J5KTogQ2hhbmdlIGZmbHVzaCB0byBnZGJfZmx1c2g7CisJY2hhbmdlIHN0ZG91dCB0byBnZGJfc3Rkb3V0LgorCisJKiByZW1vdGUtbW0uYyAobW1fb3Blbik6IENoYW5nZSBzdGRlcnIgdG8gZ2RiX3N0ZGVyci4KKwkoaW5pdF9tbV9vcHMpOiBBZGQgbmV3IHRhcmdldCB2ZWN0b3IgZmllbGRzLgorCShtbV9sb2FkKTogRml4ZWQgcGFyYW1zIGluIGNvbW1lbnRlZCBvdXQgY2FsbCB0byBzeW1ib2xfZmlsZV9hZGQuCisKKwkqIHJlbW90ZS1uaW5keS5jIChpbnN0cmVhbSk6IENoYW5nZSBkZWNsIHRvIEZJTEUuCisKKwkqIHJlbW90ZS11ZGkuYyAodWRpX2xvYWQpOiBGaXhlZCBwYXJhbXMgaW4gY2FsbCB0byBzeW1ib2xfZmlsZV9hZGQuCisKKwkqIHJlbW90ZS12eC5jICh2eF9hZGRfc3ltYm9scyk6IEZpeGVkIHBhcmFtcyBpbiBjYWxsIHRvCisgCXN5bWJvbF9maWxlX2FkZC4KKworCSogcmVtb3RlLmMgKGluaXRfcmVtb3RlX29wcyk6IENvc21ldGljIGNoYW5nZSB0byBtYXRjaCBleHBlY3RlZAorCXRlc3Qgb3V0cHV0LgorCisJKiByczYwMDAtbmF0LmMgKGFkZF92bWFwKTogQWRkIHBhcmFtcyB0byBjYWxsIHRvIGFsbG9jYXRlX29iamZpbGUuCisKKwkqIHNjbS1sYW5nLmg6ICBBZGQgcGFyYW1ldGVyIHRvIHNjbV92YWxfcHJpbnQgZnVuY3Rpb24gZGVjbC4KKworCSogc2NtLXZhbHByaW50LmMgKHNjbV9zY212YWxfcHJpbnQpOiBDYXN0IHN2YWx1ZSB0byAoaW50KTsgbmV3CisgCXBhcmFtZXRlci4gIFRoaXMgcGFyYW1ldGVyIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgd2hlbiBldmFsdWF0aW5nCisgCUMrKyBleHByZXNzaW9ucy4gU28sIGl0IGlzIGFsd2F5cyAwIGluIHRoaXMgZmlsZS4KKwkoY192YWxfcHJpbnQpOiBGaXhlZCBwcm90b3R5cGUgZGVjbDsgaXQgbmVlZGVkIGFuIGVtYmVkZGVkX29mZnNldAorIAlwYXJhbS4KKworCSogc29sLXRocmVhZC5jIChzb2xfY29yZV9vcHMpOiBBZGQgbmV3IHRhcmdldCB2ZWN0b3IgZmllbGRzLgorCShzb2xfdGhyZWFkX29wcyk6IERpdHRvLgorCQorCSogc29tc29saWIuYyAoRExEX0ZMQUdTX01BUFBSSVZBVEUpOiBOZXcgbWFjcm8uIAorCURlZmluZSBiaXQgb2YgX19kbGRfZmxhZ3MgaW4gSFAtVVggYS5vdXQgZmlsZXMuCisJKERMRF9GTEFHU19IT09LVkFMSUQpOiBEaXR0by4KKwkoRExEX0ZMQUdTX0xJU1RWQUxJRCk6IERpdHRvLgorCShETERfRkxBR1NfQk9SX0VOQUJMRSk6IERpdHRvLgorCShzb21fc29saWJfdG90YWxfc3Rfc2l6ZSk6IEN1bXVsYXRpdmUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgCisJc3ltYm9sIHRhYmxlcyBvZiBhbGwgc2hhcmVkIG9iamVjdHMgb24gdGhlIHNvX2xpc3RfaGVhZCBsaXN0LgorCShzb21fc29saWJfc3Rfc2l6ZV90aHJlc2hob2xkX2V4Y2VlZGVkKTogVGhyZXNob2xkIGZvciBhZGRpbmcgc3ltYm9scworCWZvciBzaGxpYnMuCisJKHNvbV9zb2xpYl9zaXplb2Zfc3ltYm9sX3RhYmxlKTogTmV3IGZ1bmN0aW9uLiBDb21wdXRlcyBzaXplIG9mIAorCXN5bWJvbCB0YWJsZSBmb3IgYSBzaGxpYi4KKwkoc29tX3NvbGliX2xvYWRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbi4gTG9hZCBzeW1ib2xzIGZyb20gc2hsaWIuCisJKHNvbV9zb2xpYl9hZGQpOiBEZXRlY3QgaWYgX19kbGRfbGlzdCBpcyBub3QgdmFsaWQuIAorCVJlY29yZCBtYWluIHByb2dyYW0ncyBzeW1ib2wgdGFibGUgc2l6ZS4KKwlMb2FkIHN5bWJvbHMgaWYgY2FsbGVkIGZyb20gY29tbWFuZCBsaW5lLgorCUtlZXAgdGhyZXNob2xkIGludG8gYWNjb3VudCB3aGVuIGxvYWRpbmcgc2hsaWIgc3ltYm9scy4KKwkoc29tX3NvbGliX2NyZWF0ZV9pbmZlcmlvcl9ob29rKTogVXNlIGRsZF9mbGFncyBtYWNyb3MuCisJKHNvbV9zaGFyZWRsaWJyYXJ5X2luZm9fY29tbWFuZCk6IExldCB1c2VyIGtub3cgaWYgc3ltYm9scyB3ZXJlIAorCW5vdCBsb2FkZWQuCisJKHNvbV9zb2xpYl9yZXN0YXJ0KTogRGlzY2FyZCBhbGwgdGhlIHNobGlicyBkZXNjcmlwdG9ycy4KKwkoX2luaXRpYWxpemVfc29tX3NvbGliKTogQ2hlbmdlIGhlbHAgbWVzc2FnZSBmb3IgYXV0by1zb2xpYi1hZGQKKwljb21tYW5kLgorCVNldCB0aHJlc2hvbGQgZm9yIHN5bWJvbCB0YWJsZSB0byA1MCBtZWdhYnl0ZXMuCisJKF9pbml0aWFsaXplX3NvbV9zb2xpYik6IEFkZCBjYWxsIHRvIHNvbV9zb2xpYl9yZXN0YXJ0LgorCShzb21fc29saWJfcmVzdGFydCk6IE5ldyBmdW5jdGlvbgorCShzb21fc29saWJfaW5fZHluYW1pY19saW5rZXIpOiBOZXcgZnVuY3Rpb24KKwkoc29tX3NvbGliX2Rlc2lyZV9keW5hbWljX2xpbmtlcl9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uCisJKHNvbV9zb2xpYl91bmxvYWRlZF9saWJyYXJ5X3BhdGhuYW1lKTogTmV3IGZ1bmN0aW9uCisJKHNvbV9zb2xpYl9sb2FkZWRfbGlicmFyeV9wYXRobmFtZSk6IE5ldyBmdW5jdGlvbgorCShzb21fc29saWJfbGlicmFyeV9wYXRobmFtZSk6IE5ldyBmdW5jdGlvbgorCShzb21fc29saWJfaGF2ZV91bmxvYWRfZXZlbnQpOiBOZXcgZnVuY3Rpb24KKwkoc29tX3NvbGliX2hhdmVfbG9hZF9ldmVudCk6IE5ldyBmdW5jdGlvbgorCShzb21fc29saWJfY3JlYXRlX2NhdGNoX3VubG9hZF9ob29rKTogTmV3IGZ1bmN0aW9uCisJKHNvbV9zb2xpYl9jcmVhdGVfY2F0Y2hfbG9hZF9ob29rKTogTmV3IGZ1bmN0aW9uCisJKHNvbV9zb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vayk6IFJld3JpdHRlbgorCWRsZF9jYWNoZTogTmV3IHN0cnVjdAorCWFkZHJfYW5kX3Vud2luZF90OiBOZXcgc3RydWN0CisJKGZpbmRfdW53aW5kX2VudHJ5KSBhZGQgcHJvdG90eXBlCisJSW5jbHVkZSBhc3NlcnQuaCwgcmVtb3ZlIHJlZmVyZW5jZXMgdG8gQVNTRVJUIG1hY3JvLAorCWFkZCBpbmNsdWRlIG9mIGZjbnRsLmggc28gdGhhdCBPX1JET05MWSBpcyBkZWZpbmVkLgorCShzb21fc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiBJbnRyb2R1Y2UgbmV3IGxvY2FsCisgCW1zeW1ib2wyIGFuZCBjaGFuZ2Ugc29tZSBtc3ltYm9sJ3MgdG8gbXN5bWJvbDIncyAtLSB3YXMgY2xvYmJlcmluZworIAltc3ltYm9sLCBwYXNzaW5nIGEgTlVMTCB0byBsb29rdXBfbWluaW1hbF9zeW1ib2xfc29saWJfdHJhbXBvbGluZSwKKwlhbmQgdWx0aW1hdGVseSBjb3JlIGR1bXBpbmcgd2l0aCBhIFNFR1YuCisJKHNvbV9zb2xpYl9tYXBwZWRfZW50cnkpOiBBZGRpdGlvbmFsIGNvbW1lbnRzIGZvciB0ZXh0X2FkZHIsIAorCXRleHRfbGlua19hZGRyLCB0ZXh0X2VuZCwgYW5kIHRzZF9zdGFydF9hZGRyIGZpZWxkcy4gQ29tbWVudGluZworCW91dCAyIHRzZCBmaWVsZHMsIF9fZGF0YV9zdGFydCBhbmQgX19kYXRhX2VuZC4gCisJKHNvbV9zb2xpYl9hZGRfc29saWJfb2JqZmlsZSk6IEFkZCBwYXJhbXMgdG8gY2FsbHMgdG8gc3ltYm9sX2ZpbGVfYWRkLgorCUFkZCBzb21lIGNvZGUgZm9yIGRpc3Rpbmd1aXNoaW5nIGJldHdlZW4gYSBzaGFyZWQgbGlicmFyeSBhbmQgb3RoZXIgCisJb2JqZmlsZXMuIFRoaXMgYXBwZWFycyB0byBiZSBhIHByZWx1ZGUgdG8gdGhyZWFkIGxvY2FsIHN0b3JhZ2UuCQorCShzb21fc29saWJfbG9hZF9zeW1ib2xzKTogQ2hhbmdlcyB0byBwcmludGYgc3RhdGVtZW50IAorCWVuY2xvc2VkIGJ5IFNPTElCX0RFQlVHIGlmZGVmLgorCShzb21fc29saWJfYWRkKTogQ2hhbmdlIGNvbW1lbnQgdG8gY29ycmVjdGx5IHNwZWNpZnkgcGF0aAorCXRvIGVuZC5vIC0tIC9vcHQvbGFuZ3Rvb2xzL2xpYi9lbmQuby4gY2hhbmdlcyB0byBwcmludGYgc3RhdGVtZW50CisgCWVuY2xvc2VkIGJ5IFNPTElCX0RFQlVHIGlmZGVmLgorCVJlbW92ZWQgc2V2ZXJhbCBTT0xJQl9ERUJVRyBpZmRlZnMgYW5kIHRoZSBhc3NvY2lhdGVkIHByaW50ZnMuCisJQWRkIGNvZGUgdG8gZmluZCB0aGUgc3RhcnQgYWRkcmVzcyBmb3IgdGhlIG9iamVjdCBmaWxlJ3MgdGhyZWFkIAorCWxvY2FsIHN0b3JhZ2UKKwkoc29tX3NvbGliX2NyZWF0ZV9pbmZlcmlvcl9ob29rKTogRml4IHdhcm5pbmcgbWVzc2FnZXMgdXNlIGNvcnJlY3QKKwlwYXRoIHRvIGVuZC5vIC0tIC9vcHQvbGFuZ3Rvb2xzL2xpYi9lbmQuby4gQ2hhbmdlIGNvbnRyb2wgZmxvdy4gCisJTm8gbG9uZ2VyIHVzZXIgZWFybHkgcmV0dXJucyBmcm9tIGZ1bmN0aW9uIGlzIGNhc2VzIG9mIGVycm9yLgorCShyZXNldF9pbmZlcmlvcl9waWQpOiBOZXcgZnVuY3Rpb24KKwkoc29tX3NvbGliX3JlbW92ZV9pbmZlcmlvcl9ob29rKTogTmV3IGZ1bmN0aW9uCisJKHNvX2xpYl90aHJlYWRfc3RhcnRfYWRkcik6IE5ldyBmdW5jdGlvbi4gdXNlZCBmb3IgdHNkLgorCShzdHJ1Y3Qgc29tX3NvbGliX21hcHBlZF9lbnRyeSk6IEFkZCBuZXcgZmllbGQgdHNkX3N0YXJ0X2FkZHIuCisJKHN0cnVjdCBzb19saXN0KTogQWRkIG5ldyBmaWVsZCBzb2xpYl9hZGRyLgorCShzb21fc29saWJfYWRkX3NvbGliX29iamZpbGUpOiBOZXcgZnVuY3Rpb24uIAorCShzb21fc29saWJfbG9hZF9zeW1ib2xzKTogUmV3cml0dGVuLgorCShzb21fc29saWJfYWRkKTogTWFrZSBzdXJlIHdlIGRvbid0IGxvYWQgdGhlIHN5bWJvbHMgaW4gaWYgdGhlIAorCXRocmVzaG9sZCB3YXMgZXhjZWVkZWQuCisJKHNvbV9zb2xpYl9nZXRfc29saWJfYnlfcGMpOiBOZXcgZnVuY3Rpb24uIFJldHVybiB0aGUgYWRkcmVzcyBvZgorIAloYW5kbGUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgorCShzb21fc29saWJfcmVzdGFydCk6IERpc2FibGUgYnJlYWtwb2ludHMgYXQgcmVzdGFydC4KKworCSogc3BhcmNsLXRkZXAuYyAoaW5pdF9zcGFyY2xpdGVfb3BzKTogQWRkIG5ldyB0YXJnZXQgdmVjdG9yIGZpZWxkcy4KKworCSogdGFyZ2V0LmMgKGNsZWFudXBfdGFyZ2V0KTogQ2hhbmdlZCBjYXN0aW5nIG9mIGRlZmF1bHQgZnVuY3Rpb25zCisgCWZvciB0b19oYXNfZm9ya2VkLCB0b19oYXNfdmZvcmtlZCwgdG9fcGlkX3RvX2V4ZWNfZmlsZSB0byBnZXQgcmlkCisgCW9mIHdhcm5pbmdzLiAgRml4ZWQgUEFSQU1TIGZvciB0b19oYXNfc3lzY2FsbF9ldmVudC4gIEZpeGVkIHRoZQorIAlyZXR1cm4gdHlwZSBvbiBhIGZldyBvZiB0aGUgZGVmYXVsdCBmdW5jdGlvbiB2YWx1ZXMuCisJKGNsZWFudXBfdGFyZ2V0KTogQ2hhbmdlcyBpbiB0aGUgZGVfZmF1bHQgbWFjcm8sIGJvdGggdG8KKwlhY2NvbW9kYXRlIHRoZSBuZXcgdGFyZ2V0X29wcyB2ZWN0b3IgZmllbGRzIGFuZCB0byB1c2UKKwltb3JlIGFjY3VyYXRlIGRlZmF1bHQgZnVuY3Rpb25zLgorCShkZWJ1Z190b19vcGVuKTogQ2hhbmdlIHN0ZGVyciB0byBnZGJfc3RkZXJyLgorCShkZWJ1Z190b19jbG9zZSk6IERpdHRvLgorCShkZWJ1Z190b19hdHRhY2gpOiBEaXR0by4KKwkoZGVidWdfdG9fcG9zdF9hdHRhY2gpOiBEaXR0by4KKwkoZGVidWdfdG9fcmVxdWlyZV9hdHRhY2gpOiBEaXR0by4KKwkoZGVidWdfdG9fZGV0YWNoKTogRGl0dG8uCisJKGRlYnVnX3RvX3JlcXVpcmVfZGV0YWNoKTogRGl0dG8uCisJKGRlYnVnX3RvX3Jlc3VtZSk6IERpdHRvLgorCShkZWJ1Z190b193YWl0KTogRGl0dG8uCisJKGRlYnVnX3RvX3Bvc3Rfd2FpdCk6IERpdHRvLgorCShkZWJ1Z190b19mZXRjaF9yZWdpc3RlcnMpOiBEaXR0by4KKwkoZGVidWdfdG9fc3RvcmVfcmVnaXN0ZXJzKTogRGl0dG8uCisJKGRlYnVnX3RvX3ByZXBhcmVfdG9fc3RvcmUpOiBEaXR0by4KKwkoZGVidWdfdG9feGZlcl9tZW1vcnkpOiBEaXR0by4KKwkoZGVidWdfdG9fZmlsZXNfaW5mbyk6IERpdHRvLgorCShkZWJ1Z190b19pbnNlcnRfYnJlYWtwb2ludCk6IERpdHRvLgorCShkZWJ1Z190b19yZW1vdmVfYnJlYWtwb2ludCk6IERpdHRvLgorCShkZWJ1Z190b190ZXJtaW5hbF9pbml0KTogRGl0dG8uCisJKGRlYnVnX3RvX3Rlcm1pbmFsX2luZmVyaW9yKTogRGl0dG8uCisJKGRlYnVnX3RvX3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCk6IERpdHRvLgorCShkZWJ1Z190b190ZXJtaW5hbF9vdXJzKTogRGl0dG8uCisJKGRlYnVnX3RvX3Rlcm1pbmFsX2luZm8pOiBEaXR0by4KKwkoZGVidWdfdG9fa2lsbCk6IERpdHRvLgorCShkZWJ1Z190b19sb2FkKTogRGl0dG8uCisJKGRlYnVnX3RvX2xvb2t1cF9zeW1ib2wpOiBEaXR0by4KKwkoZGVidWdfdG9fY3JlYXRlX2luZmVyaW9yKTogRGl0dG8uCisJKGRlYnVnX3RvX3Bvc3Rfc3RhcnR1cF9pbmZlcmlvcik6IERpdHRvLgorCShkZWJ1Z190b19hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yKTogRGl0dG8uCisJKGRlYnVnX3RvX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IpOiBEaXR0by4KKwkoZGVidWdfdG9fcG9zdF9mb2xsb3dfaW5mZXJpb3JfYnlfY2xvbmUpOiBEaXR0by4KKwkoZGVidWdfdG9faW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCk6IERpdHRvLgorCShkZWJ1Z190b19yZW1vdmVfZm9ya19jYXRjaHBvaW50KTogRGl0dG8uCisJKGRlYnVnX3RvX2luc2VydF92Zm9ya19jYXRjaHBvaW50KTogRGl0dG8uCisJKGRlYnVnX3RvX3JlbW92ZV92Zm9ya19jYXRjaHBvaW50KTogRGl0dG8uCisJKGRlYnVnX3RvX2hhc19mb3JrZWQpOiBEaXR0by4KKwkoZGVidWdfdG9faGFzX3Zmb3JrZWQpOiBEaXR0by4KKwkoZGVidWdfdG9fY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjKTogRGl0dG8uCisJKGRlYnVnX3RvX3Bvc3RfZm9sbG93X3Zmb3JrKTogRGl0dG8uCisJKGRlYnVnX3RvX2luc2VydF9leGVjX2NhdGNocG9pbnQpOiBEaXR0by4KKwkoZGVidWdfdG9fcmVtb3ZlX2V4ZWNfY2F0Y2hwb2ludCk6IERpdHRvLgorCShkZWJ1Z190b19oYXNfZXhlY2QpOiBEaXR0by4KKwkoZGVidWdfdG9fcmVwb3J0ZWRfZXhlY19ldmVudHNfcGVyX2V4ZWNfY2FsbCk6IERpdHRvLgorCShkZWJ1Z190b19oYXNfc3lzY2FsbF9ldmVudCk6IERpdHRvLgorCShkZWJ1Z190b19oYXNfZXhpdGVkKTogRGl0dG8uCisJKGRlYnVnX3RvX21vdXJuX2luZmVyaW9yKTogRGl0dG8uCisJKGRlYnVnX3RvX2Nhbl9ydW4pOiBEaXR0by4KKwkoZGVidWdfdG9fbm90aWNlX3NpZ25hbHMpOiBEaXR0by4KKwkoZGVidWdfdG9fdGhyZWFkX2FsaXZlKTogRGl0dG8uCisJKGRlYnVnX3RvX3N0b3ApOiBEaXR0by4KKwkoZGVidWdfdG9fZW5hYmxlX2V4Y2VwdGlvbl9jYWxsYmFjayk6IERpdHRvLgorCShkZWJ1Z190b19nZXRfY3VycmVudF9leGNlcHRpb25fZXZlbnQpOiBEaXR0by4KKwkoZGVidWdfdG9fcGlkX3RvX2V4ZWNfZmlsZSk6IERpdHRvLgorCShkZWJ1Z190b19jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUpOiBEaXR0by4KKwkoZGVmYXVsdF9jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yKTogTmV3IGZ1bmN0aW9uIHByb3RvdHlwZQorIAlkZWNsIGFuZCBmdW5jdGlvbiBkZWZpbml0aW9uLgorCShkdW1teV90YXJnZXQpOiBBZGQgbmV3IHRhcmdldF9vcHMgdmVjdG9yIGZpZWxkcyBhbmQgdGhlaXIKKyAJaW5pdGlhbGl6YXRpb25zLiAgTW9yZSB0YXJnZXRfb3BzIHZlY3RvciBjaGFuZ2VzIGZvciBIUFVYIG5ldworIAlmaWVsZHMuCisJKGRlX2ZhdWx0KTogQWRkIG5ldyBIUFVYIHNwZWNpZmljIHRhcmdldF9vcHMgb3BlcmF0aW9ucyB0byB0aGUKKwlkZV9mYXVsdCBtYWNybworCShJTkhFUklUKTogQWRkIG5ldyBIUFVYIHNwZWNpZmljIHRhcmdldF9vcHMgb3BlcmF0aW9ucy4KKwkoZGVidWdfdG9fcG9zdF93YWl0KTogTmV3IGZ1bmN0aW9uLgorCShkZWJ1Z190b19wb3N0X3N0YXJ0dXBfaW5mZXJpb3IpOiBEaXR0by4KKwkoZGVidWdfdG9fYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvcik6IERpdHRvLgorCShkZWJ1Z190b19jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yKTogRGl0dG8uCisJKGRlYnVnX3RvX3Bvc3RfZm9sbG93X2luZmVyaW9yX2J5X2Nsb25lKTogRGl0dG8uCisJKGRlYnVnX3RvX2NyZWF0ZV9jYXRjaF9mb3JrX2hvb2spOiBEaXR0by4KKwkoZGVidWdfdG9fY3JlYXRlX2NhdGNoX3Zmb3JrX2hvb2spOiBEaXR0by4KKwkoZGVidWdfdG9faGFzX2ZvcmtlZCk6IERpdHRvLgorCShkZWJ1Z190b19oYXNfdmZvcmtlZCk6IERpdHRvLgorCShkZWJ1Z190b19wb3N0X2ZvbGxvd192Zm9yayk6IERpdHRvLgorCShzZXR1cF90YXJnZXRfZGVidWcpOiBJbml0aWFsaXplIG5ldyB0YXJnZXRfb3BzIHZlY3RvciBmaWVsZHMuCisJKG5vc3VwcG9ydF9ydW50aW1lKTogTmV3IGZ1bmN0aW9uLCB1c2VkIGluIGNsZWFudXBfdGFyZ2V0CisJKHVwZGF0ZV9jdXJyZW50X3RhcmdldCk6IEFkZCBuZXcgbmV3IHRhcmdldF9vcHMgdmVjdG9yIGZpZWxkcyB0bworCXRoZSBJTkhFUklUIG1hY3JvIGRlZmluaXRpb24uCisJKGdlbmVyaWNfbW91cm5faW5mZXJpb3IpOiBUaGUgY2FsbCB0byBicmVha3BvaW50X2luaXRfaW5mZXJpb3Igbm93CisgCXRha2VzIGEgcGFyYW1ldGVyLgorCShub3JtYWxfcGlkX3RvX3N0cik6IEFkZCBhIFwwIHRvIHRoZSBlbmQgb2YgYnVmLgorCShkZWJ1Z190b19oYXNfc3lzY2FsbF9ldmVudCk6IE5ldyBmdW5jdGlvbi4KKwkoZGVidWdfdG9fZW5hYmxlX2V4Y2VwdGlvbl9jYWxsYmFjayk6IE5ldyBmdW5jdGlvbi4KKwkoZGVidWdfdG9fZ2V0X2N1cnJlbnRfZXhjZXB0aW9uX2V2ZW50KTogTmV3IGZ1bmN0aW9uLgorCShzZXR1cF90YXJnZXRfZGVidWcpOiBJbml0aWFsaXplIHRoZSAzIG5ldyB0YXJnZXRfb3BzIHZlY3RvciBmaWVsZHMKKwkoc3RydWN0IHNpZ25hbHMpOiBGaXggbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggU0lHUkVUUkFDVC4KKwkocmV0dXJuX29uZSk6IE5ldyBmdW5jdGlvbiwgdXNlZCBieSB0aGUgZGVfZmF1bHQgbWFjcm8KKwkoZGVidWdfdG9fcG9zdF9hdHRhY2gpOiBOZXcgZnVuY3Rpb24uCisJKGRlYnVnX3RvX3dhaXQpOiBBZGQgbmV3IGNhc2VzIFRBUkdFVF9XQUlUS0lORF9GT1JLRUQsCisJVEFSR0VUX1dBSVRLSU5EX1ZGT1JLRUQsIFRBUkdFVF9XQUlUS0lORF9FWEVDRC4KKwkoZGVidWdfdG9faW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCk6IE5ldyBmdW5jdGlvbi4KKwkoZGVidWdfdG9fcmVtb3ZlX2ZvcmtfY2F0Y2hwb2ludCk6IERpdHRvLgorCShkZWJ1Z190b19pbnNlcnRfdmZvcmtfY2F0Y2hwb2ludCk6IERpdHRvLgorCShkZWJ1Z190b19yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludCk6IERpdHRvLgorCShkZWJ1Z190b19jYW5fZm9sbG93X3Zmb3JrX3ByaW9yX3RvX2V4ZWMpOiBEaXR0by4KKwkoZGVidWdfdG9faW5zZXJ0X2V4ZWNfY2F0Y2hwb2ludCk6IERpdHRvLgorCShkZWJ1Z190b19yZW1vdmVfZXhlY19jYXRjaHBvaW50KTogRGl0dG8uCisJKGRlYnVnX3RvX2NvcmVfZmlsZV90b19zeW1fZmlsZSk6IERpdHRvLgorCShzZXR1cF90YXJnZXRfZGVidWcpOiBHaXZlIG5ldyBmaWVsZHMgaW4gY3VycmVudF90YXJnZXQgdGFyZ2V0X29wcworIAl2ZWN0b3IgdmFsdWVzLgorCisJKiB0YXJnZXQuaDogSW5jbHVkZSBzeW10YWIuaC4KKwkodGFyZ2V0X3dhaXRraW5kKTogTmV3IGVudW1lcmF0ZWQgdmFsdWVzCisJVEFSR0VUX1dBSVRLSU5EX1NZU0NBTExfRU5UUlksIFRBUkdFVF9XQUlUS0lORF9TWVNDQUxMX1JFVFVSTiwKKwlUQVJHRVRfV0FJVEtJTkRfRk9SS0VELCBUQVJHRVRfV0FJVEtJTkRfVkZPUktFRCwgCisJVEFSR0VUX1dBSVRLSU5EX0VYRUNELgorCSh0YXJnZXRfd2FpdHN0YXR1cyk6IEFkZCBhIHN5c2NhbGxfaWQgZmllbGQgdG8gc3RydWN0dXJlLgorCShjaGlsZF9oYXNfc3lzY2FsbF9ldmVudCk6IE5ldyBkZWNsLgorCShjaGlsZF90aHJlYWRfYWxpdmUpOiBOZXcgZGVjbC4KKwkodGFyZ2V0X29wcyk6IEFkZCAzIG5ldyBmaWVsZHM6IFRvX2hhc19zeXNjYWxsX2V2ZW50LAorCXRvX2VuYWJsZV9leGNlcHRpb25fY2FsbGJhY2ssIHRvX2dldF9jdXJyZW50X2V4Y2VwdGlvbl9ldmVudCAKKwkodGFyZ2V0X2VuYWJsZV9leGNlcHRpb25fY2FsbGJhY2spOiBOZXcgbWFjcm8uCisJKHRhcmdldF9oYXNfc3lzY2FsbF9ldmVudCk6IE5ldyBtYWNyby4gCisJKHRhcmdldF9nZXRfY3VycmVudF9leGNlcHRpb25fZXZlbnQpOiBOZXcgbWFjcm8uCisJKFRBUkdFVF9ESVNBQkxFX0hXX1dBVENIUE9JTlRTKTogTmV3IG1hY3JvLgorCShUQVJHRVRfRU5BQkxFX0hXX1dBVENIUE9JTlRTKTogTmV3IG1hY3JvLgorCShQQ19SRVFVSVJFU19SVU5fQkVGT1JFX1VTRSk6IE5ldyBtYWNyby4KKwkodGFyZ2V0X3RpZF90b19zdHIpOiBOZXcgbWFjcm8uCisJKHRhcmdldF93YWl0c3RhdHVzKTogQWRkaXRpb25hbCBmaWVsZHMgaW4gc3RydWN0IHRvIGtlZXAgdHJhY2sKKwlvZiBjaGlsZCBwaWQgYW5kIHBhdGhuYW1lIHRvIGV4ZWNkIGZpbGUuCisJKHRhcmdldF9vcHMpOiBBZGQgaW4gdGhlIG5ldyB0YXJnZXRfb3BzIGZ1bmN0aW9uIHBvaW50ZXIgZmllbGRzLgorCU5ldyBtYWNyb3MgdG8gZ28gYWxvbmcgd2l0aCBuZXcgdGFyZ2V0X29wcyBmaWVsZHMuCisJSW4gdGFyZ2V0X3dhaXRzdGF0dXMudmFsdWUsIGNoYW5nZSBuYW1lIG9mIGNoaWxkX3BpZCBmaWVsZCB0bworCXJlbGF0ZWRfcGlkLgorCSh0YXJnZXRfcGlkX29yX3RpZF90b19zdHIpOiBEZWZpbmUgZGVmYXVsdCBtYWNyby4KKwlBZGQgbWlzc2luZyAjZW5kaWYgYWZ0ZXIgUENfUkVRVUlSRVNfUlVOX0JFRk9SRV9VU0UgZGVmaW5pdGlvbgorCShFTlNVUkVfVkZPUktJTkdfUEFSRU5UX1JFTUFJTlNfU1RPUFBFRCk6IERlZmluZSBkZWZhdWx0IG1hY3JvLgorCShSRVNVTUVfRVhFQ0RfVkZPUktJTkdfQ0hJTERfVE9fR0VUX1BBUkVOVF9WRk9SSyk6IERlZmluZSBkZWZhdWx0CisJbWFjcm8uCisJVGhlcmUgYXJlIG5ldyBmdW5jdGlvbiBkZWNscyBmb3IgdG9fcmVxdWlyZV9hdHRhY2gKKwlhbmQgdG9fcmVxdWlyZV9kZXRhY2guIFRoZXJlIGFyZSBhbHNvIG5ldyBtYWNyb3MsIAorCXRhcmdldF9yZXF1aXJlX2F0dGFjaCBhbmQgdGFyZ2V0X3JlcXVpcmVfZGV0YWNoLiBUaGVyZSBhcmUKKwlhbHNvIG5ldyBmdW5jdGlvbiBkZWNscyBmb3IgZmluZF9kZWZhdWx0X3JlcXVpcmVfZGV0YWNoCisJYW5kIGZpbmRfZGVmYXVsdF9yZXF1aXJlX2F0dGFjaC4KKwkodGFyZ2V0X29wcyk6IE5ldyBmaWVsZHMgdG9fcG9zdF93YWl0LCB0b19wb3N0X3N0YXJ0dXBfaW5mZXJpb3IKKyAJdG9fYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvciwgdG9fY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciwKKyAJdG9fcG9zdF9mb2xsb3dfaW5mZXJpb3JfYnlfY2xvbmUsIHRvX2NyZWF0ZV9jYXRjaF9mb3JrX2hvb2ssCisgCXRvX2NyZWF0ZV9jYXRjaF92Zm9ya19ob29rLCB0b19oYXNfZm9ya2VkLCB0b19oYXNfdmZvcmtlZCwKKyAJdG9fcG9zdF9mb2xsb3dfdmZvcmssIHRvX3BpZF90b19leGVjX2ZpbGUuCisJTmV3IGZ1bmN0aW9uIGRlZmluaXRpb25zIGNoaWxkX3BpZF90b19leGVjX2ZpbGUsIGNoaWxkX3Bvc3Rfd2FpdCwKKyAJY2hpbGRfcG9zdF9zdGFydHVwX2luZmVyaW9yLCBjaGlsZF9hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yLAorIAljaGlsZF9jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yLAorIAljaGlsZF9wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSwgY2hpbGRfY3JlYXRlX2NhdGNoX2ZvcmtfaG9vaywKKyAJY2hpbGRfY3JlYXRlX2NhdGNoX3Zmb3JrX2hvb2ssIGNoaWxkX2hhc19mb3JrZWQsCisgCWNoaWxkX2hhc192Zm9ya2VkLCBjaGlsZF9hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yLAorIAljaGlsZF9wb3N0X2ZvbGxvd192Zm9yay4KKwlOZXcgbWFjcm9zIHRhcmdldF9wb3N0X3N0YXJ0dXBfaW5mZXJpb3IsCisgCXRhcmdldF9hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yLAorIAl0YXJnZXRfY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciwKKyAJdGFyZ2V0X3Bvc3RfZm9sbG93X2luZmVyaW9yX2J5X2Nsb25lLAorIAl0YXJnZXRfY3JlYXRlX2NhdGNoX2ZvcmtfaG9vaywgdGFyZ2V0X2NyZWF0ZV9jYXRjaF92Zm9ya19ob29rLAorIAl0YXJnZXRfcGlkX3RvX2V4ZWNfZmlsZS4KKwkoZmluZF9kZWZhdWx0X2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IpOiBOZXcgZnVuY3Rpb24gcHJvdG90eXBlLgorCisKKwkqIHY4NTBpY2UuYyAoaW5pdF84NTBpY2Vfb3BzKTogSW5pdCBuZXcgdGFyZ2V0IHZlY3RvciBmaWVsZHMuCisKKwkqIHZhbHByaW50LmMgKHByaW50X2JpbmFyeV9jaGFycyk6IFByaW50IG91dCBsb25nIGxvbmcgYXMKKwlhIGJpbmFyeSBudW1iZXIuCisJKHByaW50X29jdGFsX2NoYXJzKTogUHJpbnQgb3V0IGxvbmcgbG9uZyBhcyBhbiBvY3RhbCBudW1iZXIKKwkocHJpbnRfZGVjaW1hbF9jaGFycyk6IFByaW50IG91dCBsb25nIGxvbmcgYXMgYSBkZWNpbWFsIG51bWJlcgorCShzdHJjYXRfbG9uZ2VzdCk6IERlZmluZSBpdC4KKwkqIHZhbHByaW50LmM6IEhwIG1lcmdlLCA0LzE1Lzk4IHNuYXBzaG90CisJQWRkIHBhcmFtZXRlciB0byB2YWxfcHJpbnQuIFRoaXMgaXMgdXNlZCBmb3IKKwlldmFsdWF0aW5nIEMrKyBleHByZXNzaW9ucy4gCisJCisJKiB2YWx1ZS5oIChWQUxVRV9QT0lOVEVEX1RPX09GRlNFVCk6IE5ldyBtYWNyby4KKwlBZGQgZmllbGQgcG9pbnRlZF90b19vZmZzZXQgdG8gdmFsdWUgc3RydWN0dXJlLgorCUFkZCBwcm90b3R5cGVzIGZvciBuZXcgZnVuY3Rpb25zIGluIHZhbG9wcy5jLgorCSh3cml0ZV9yZWdpc3Rlcl9waWQpOiBDaGFuZ2UgcHJvdG90eXBlIHRvIG1hdGNoCisgCWZ1bmN0aW9uLgorCSh2YWxfcHJpbnQgZnVuY3Rpb24gZGVjbCk6IEFkZGl0aW9uYWwgcGFyYW1ldGVyLgorICAJKFZBTFVFX0VNQkVEREVEX09GRlNFVCk6IE5ldyBtYWNyby4KKyAJKGZpbmRfcnRfdmJhc2Vfb2Zmc2V0KTogTmV3IGZ1bmN0aW9uIGRlY2wgLS0gZm9yIEMrKyBzdXBwb3J0LgorCitXZWQgRGVjIDIzIDE1OjAzOjQyIDE5OTggIFBlciBCb3RobmVyICA8Ym90aG5lckBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoUkVBRExJTkVfQ0ZMQUdTKTogIFNlYXJjaCAkKFJFQURMSU5FX1NSQykvLi4gcmF0aGVyCisJdGhhbiAkKFJFQURMSU5FX1NSQykgc28gI2luY2x1ZGUgPHJlYWRsaW5lL3JlYWRsaW5lLmg+IHdpbGwgd29yay4KKwkqIHRvcC5jOiAgI2luY2x1ZGUgPHJlYWRsaW5lL2hpc3RvcnkuaD4gaW5zdGVhZCBvZiAiaGlzdG9yeS5oIi4KKwkqIHRyYWNlcG9pbnQuYzogIExpa2V3aXNlLgorCSogbWFjLXhkZXAuYzogIExpa2V3aXNlLgorCitXZWQgRGVjIDIzIDEyOjMyOjAwIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY2hvb2suY3lnbnVzLmNvbT4KKworCSogZGVmcy5oIChUQVJHRVRfRkxPQVRfRk9STUFULCBUQVJHRVRfRE9VQkxFX0ZPUk1BVCk6IERlZmluZSB1c2luZworIAlUQVJHRVRfQllURV9PUkRFUiBhbmQgbm90IHRhcmdldF9ieXRlX29yZGVyLgorCitUdWUgRGVjIDIyIDEwOjUxOjMzIDE5OTggIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2kzODYvY3lnd2luLm1oIChURVJNQ0FQKTogZGVmaW5lLgorIAkoZnJvbSBDaHJpcyBGYXlsb3IsIGNnZkBjeWdudXMuY29tKQorCisJKiB0b3AuYzogc3BlY2lmeSBkaXJlY3RvcnkgbmFtZSBmb3IgaW5jbHVkaW5nIHJlYWRsaW5lLmgKKworCSogdHJhY2Vwb2ludC5jOiBkaXR0by4KKworCSogdXRpbHMuYzogZGl0dG8uCisKK01vbiBEZWMgMjEgMTM6MzA6MzQgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiB2YWx1ZS5jICh2YWx1ZV92aXJ0dWFsX2ZuX2ZpZWxkKTogSGFuZGxlIHRoZSBzaXR1YXRpb24gd2hlcmUKKwl2dGJsIGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIGEgcG9pbnRlciB0byBhbiBhcnJheS4KKworTW9uIERlYyAyMSAxMDozODoxMSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGNob29rPgorCisJKiBtaXBzLXRkZXAuYzogKE1JUFNfREVGQVVMVF9GUFVfVFlQRSk6IERlZmF1bHQgdG8KKyAJTUlQU19GUFVfRE9VQkxFLgorCisxOTk4LTEyLTE3ICBKLlQuIENvbmtsaW4gIDxqdGNAcmVkYmFja25ldHdvcmtzLmNvbT4KKworCSogYmxvY2tmcmFtZS5jIChnZXRfZnJhbWVfc2F2ZWRfcmVncyk6IElmIHRoZSBzYXZlZF9yZWdzX2FkZHIgcHRyCisJaXMgbnVsbCwgZW5zdXJlIHRoYXQgc2F2ZWQgcmVnaXN0ZXJzIGFyZSBjb3BpZWQgZnJvbSB0aGUgbG9jYWwKKwl2YXJpYWJsZSB0aGF0IHdhcyB1c2VkIHRvIG9idGFpbiB0aGVtLgorCitTYXQgRGVjIDE5IDA5OjU1OjA5IDE5OTggIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgorCisJKiBtaXBzLXRkZXAuYyAobWlwczMyX2hldXJpc3RpY19wcm9jX2Rlc2MpOiAgQ2xlYXIgdGVtcF9zYXZlZF9yZWdzCisJb24gcmVzdGFydC4gIEZpeGVzIHByb2JsZW0gd2l0aCBiYWNrdHJhY2luZyB0aHJvdWdoIGZ1bmN0aW9ucyB0aGF0CisJdXNlIHZpcnR1YWwgZnJhbWUgcG9pbnRlcnMuCisKK0ZyaSBEZWMgMTggMTQ6MjM6MzQgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjaG9vaz4KKworCSogbWlwcy10ZGVwLmMgKG1pcHNfcHVzaF9hcmd1bWVudHMpOiBEb24ndCBsZWZ0LXNoaWZ0IHNtYWxsCisgCXN0cnVjdHMgYmVpbmcgcGFzc2VkIGluIGEgcmVnaXN0ZXIgd2hlbiBhbiBPNjQgdGFyZ2V0LgorCisJKiBjb25maWcvbWlwcy90bS1taXBzLmggKGVudW0gbWlwc19mcHVfdHlwZSwgbWlwc19mcHUpOiBNb3ZlIHRvCisgCW1pcHMtdGRlcC5jLgorCisJKiBtaXBzLXRkZXAuYyAobWlwc19mcHVfc3RyaW5nKTogRGVsZXRlIHZhcmlhYmxlLgorCShtaXBzX2ZwdV90eXBlX2F1dG8pOiBOZXcgdmFyaWFibGUuCisJKG1pcHNfZnB1X3R5cGUpOiBSZW5hbWUgbWlwc19mcHUuCisJKF9pbml0aWFsaXplX21pcHNfdGRlcCk6IERlbGV0ZSBpbml0aWFsaXphdGlvbiBvZiBtaXBzX2ZwdSBldC5hbC4KKyAgCVJld3JpdGUgYGBzZXQgbWlwc2ZwdScnIGNvbW1hbmQgc2V0LgorCShzZXRfbWlwc2ZwdV9jb21tYW5kLCBzaG93X21pcHNmcHVfY29tbWFuZCwKKyAJc2V0X21pcHNmcHVfc2luZ2xlX2NvbW1hbmQsIHNldF9taXBzZnB1X2RvdWJsZV9jb21tYW5kLAorIAlzZXRfbWlwc2ZwdV9ub25lX2NvbW1hbmQsIHNldF9taXBzZnB1X2F1dG9fY29tbWFuZCk6IE5ldworIAlmdW5jdGlvbnMsIGhhbmRsZSBjb21tYW5kcy4KKwkobWlwc19wdXNoX2FyZ3VtZW50cywgbWlwc19wdXNoX2R1bW15X2ZyYW1lLCBtaXBzX3BvcF9mcmFtZSwKKyAJbWlwc19leHRyYWN0X3JldHVybl92YWx1ZSk6IFVwZGF0ZS4KKwkKK1RodSBEZWMgMTcgMDI6MTU6NDAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjaG9vay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0IChnZGJfdGFyZ2V0KTogSWRlbnRpZnkgbWlwczY0KnZyNDEwMCotKi1lbGYqIGFzCisgCXZyNDEwMC4KKwkKK1RodSBEZWMgMTcgMDE6MzQ6MzYgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjaG9vaz4KKworCSogZ2RidHlwZXMuYyAoYnVpbGRfZ2RidHlwZXMpOiBOZXcgZnVuY3Rpb24uCisJKF9pbml0aWFsaXplX2dkYnR5cGVzKTogQ2FsbC4KKworV2VkIERlYyAxNiAxMTo0NzowMCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGNob29rPgorCisJKiBnZGJhcmNoLmMgKHNob3dfYXJjaGl0ZWN0dXJlKTogVXNlIFRBUkdFVF9BUkNISVRFQ1RVUkUuCisJKiBnZGJhcmNoLmgsIGdkYmFyY2guYzogRml4IHR5cG8ncy4gVXNlIHN0cnVjdCdzIGluIHByZWZlcmVuY2UgdG8KKyAJdHlwZXMuCisJKiBnZGJhcmNoLmgsIGdkYmFyY2guYyAoZ2RiYXJjaF9kZWJ1Zyk6IEFkZCBgYHNldCBhcmNoZGVidWcnJyB0bworIAljb21tYW5kIHNldC4KKworVHVlIERlYyAxNSAyMzo0Njo0MCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGNob29rPgorCisJKiBjb25maWcvbWlwcy90bS0qLmg6IChUQVJHRVRfQllURV9PUkRFUl9ERUZBVUxULAorIAlUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFX1ApOiBSZXBsYWNlIFRBUkdFVF9CWVRFX09SREVSIGFuZAorIAlUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFLgorCQorMTk5OC0xMi0xNCAgQW50aG9ueSBUaG9tcHNvbiAgIChhdGhvbXBzb0BjYW1icmlkZ2UuYXJtLmNvbSkKKworCSogcmVtb3RlLXJkcC5jIChyZHBfaW5pdCk6IERvbid0IGRpc2NhcmQgZmlyc3QgY2hhcmFjdGVyIG9uIHJlc2V0LgorCSh0cmFuc2xhdGVfb3Blbl9tb2RlKTogRGVmaW5lIHRhYmxlLgorCShleGVjX3N3aSk6IEhhbmRsZSBTV0lfQ2xvY2suICBTV0lfT3BlbiBub3cgaGFuZGxlcyBzdGRpbi9zdGRvdXQuCisJU1dJX1dyaXRlIHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIG5vdCB3cml0dGVuLiAgU1dJX1JlYWQgZG9lcyB0aGUKKwlzYW1lLiAgU1dJX1NlZWsgc2hvdWxkIHJldHVybiBzdWNjZXNzL2ZhaWx1cmUgZmxhZy4gIEZpeCBTV0lfRmxlbi4KKworMTk5OC0xMi0xNCAgSi5ULiBDb25rbGluICA8anRjQHJlZGJhY2tuZXR3b3Jrcy5jb20+CisKKwkqIGNvbmZpZy9pMzg2L25ic2QubWgsIGNvbmZpZy9tNjhrL25ic2QubWgsIGNvbmZpZy9uczMyay9uYnNkLm1oCisJKFhERVBGSUxFUyk6IEFkZCBzZXItdGNwLm8uCisKK01vbiBEZWMgMTQgMTQ6NDY6MTMgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBtb25pdG9yLmMgKG1vbml0b3JfZXhwZWN0LCBtb25pdG9yX3ByaW50Zl9ub2VjaG8sCisgCW1vbml0b3JfcHJpbnRmKTogQWx3YXlzIGNvbXBpbGUgRVhUUkFfUkRFQlVHIGNvZGUuCisJKFJERUJVRyk6IERpdHRvLgorCisJRnJvbSBNaWNoYWVsIE1laXNzbmVyIDxtZWlzc25lckBjeWdudXMuY29tPjoKKwkqIHBwY2J1Zy1yb20uYyAoaW5pdF9wcGNfY21kcyk6IENsZWFudXAgZm9ybWF0dGluZy4KKworMTk5OC0xMi0wOCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIG1vbml0b3IuYyAobW9uaXRvcl9wcmludGFibGVfc3RyaW5nKTogTmV3IGZ1bmN0aW9uIHRvIGNvbnZlcnQgYQorCXN0cmluZyBpbnRvIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uLgorCShtb25pdG9yX2Vycm9yKTogQ2FsbCBlcnJvciBhZnRlciBjb252ZXJ0aW5nIHN0cmluZyBpbnRvIHByaW50YWJsZQorCWZvcm1hdC4KKwkobW9uaXRvcl9wcmludGZ7LF9ub2VjaG99KTogSWYgRVhUUkFfUkRFQlVHIGlzIGRlZmluZWQsIGNvbnZlcnQKKwlzdHJpbmcgaW50byBwcmludGFibGUgZm9ybSBiZWZvcmUgcHJpbnRpbmcuCisJKG1vbml0b3JfZXhwZWN0KTogRGl0dG8uCisJKG1vbml0b3JfcmVhZF9tZW1vcnl7LF9zaW5nbGV9KTogQ2FsbCBtb25pdG9yX2Vycm9yLCBub3QgZXJyb3IuCisJKG1vbml0b3JfcmVhZF9tZW1vcnkpOiBSZXR1cm4gaW1tZWRpYXRlbHkgaWYgbGVuZ3RoIGlzIDAuCisKKwkqIHBwY2J1Zy1yb20uYyAoaW5pdF9wcGNfY21kcyk6IEZpbGwgaW4gZHVtcF9yZWdpc3RlcnMgZmllbGQsCisgCXdoaWNoIGlzIG5vdyByZXF1aXJlZC4KKworTW9uIERlYyAxNCAxMTowMTozOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdkYmFyY2guaCwgZ2RiYXJjaC5jOiBDb25zb2xpZGF0ZSB0aGUgc2VtaS1keW5hbWljIHRhcmdldCBzeXN0ZW0KKyAJZGVwZW5kYW50IEdEQiBwYXJhbWV0ZXJzLgorCShzZXRfZ2RiYXJjaF9mcm9tX2ZpbGUpOiBDb21iaW5lIHNldF9hcmNoaXRlY3R1cmVfZnJvbV9maWxlIGFuZAorIAlzZXRfYnl0ZV9vcmRlcl9mcm9tX2ZpbGUuCisJKiB0b3AuYywgZGVmcy5oLCBwcmludGNtZC5jOiBEZWxldGUgdGhlbSBmcm9tIGhlcmUuCisJKiBNYWtlZmlsZS5pbjogQWRkIGdkYmFyY2guW2NoXS4KKwkqIGV4ZWMuYyAoZXhlY19maWxlX2NvbW1hbmQpOiBDYWxsIHNldF9nZGJhcmNoX2Zyb21fZmlsZS4KKworU3VuIERlYyAxMyAwOTo1Mjo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGRlZnMuaCAoVEFSR0VUX1BSSU5UX0lOU05fSU5GTywgVEFSR0VUX1BSSU5UX0lOU04pOiBEZWZpbmUuCisJKFRBUkdFVF9BUkNISVRFQ1RVUkUsIFRBUkdFVF9BUkNISVRFQ1RVUkVfQVVUTyk6IERlZmluZS4KKwkoVEFSR0VUX0JZVEVfT1JERVJfQVVUTyk6IERlZmluZS4KKwkoVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRV9QKTogUHJvdmlkZSBkZWZhdWx0LiBSZXBsYWNlcworIAlUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFLiBIYW5kbGUgY29tcGF0IGlzc3Vlcy4KKwkoQklUU19CSUdfRU5ESUFOKTogU2ltcGxpZnkuCisJKFRBUkdFVF9GTE9BVF9GT1JNQVQpOiBEaXR0by4KKwkoVEFSR0VUX0RPVUJMRV9GT1JNQVQpOiAKKworCSogcmVtb3RlLWU3MDAwLmMsIHNoLXRkZXAuYywgcHJpbnRjbWQuYywgcmVtb3RlLXNpbS5jLAorIAlyZW1vdGUtcmRpLmMsIHNwYXJjLXRkZXAuYzogVXBkYXRlLgorCQorCSogY29uZmlnL3Bvd2VycGMvdG0tcHBjbGUtZWFiaS5oLCBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oLAorIAljb25maWcvcG93ZXJwYy90bS1wcGMtZWFiaS5oLCBjb25maWcvbW4xMDMwMC90bS1tbjEwMzAwLmg6CisgCUNvbnZlcnQuCisKK1NhdCBEZWMgMTIgMDk6Mjg6MTMgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBmcmFtZS5oIChzdHJ1Y3QgZnJhbWVfaW5mbyk6IEFkZCBDT1JFX0FERFIgKnNhdmVkX3JlZ3MgYW5kCisgCXN0cnVjdCBmcmFtZV9leHRyYV9pbmZvICpleHRyYV9pbmZvLgorCShmcmFtZV9vYnN0YWNrX2FsbG9jLCBmcmFtZV9zYXZlZF9yZWdzX3phbGxvYyk6IFByb3RvdHlwZS4KKwkoU0laRU9GX0ZSQU1FX1NBVkVEX1JFR1MpOiBQcm92aWRlIGRlZmF1bHQuCisJKEZSQU1FX0lOSVRfU0FWRURfUkVHUyk6IFByb3ZpZGUgZGVmYXVsdC4KKwkoc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MpOiBEZXByZWNhdGUuCisJKEVYVFJBX0ZSQU1FX0lORk8pOiBEZXByZWNhdGUuCisJCisJKiBibG9ja2ZyYW1lLmMgKGZyYW1lX29ic3RhY2tfYWxsb2MsIGZyYW1lX3NhdmVkX3JlZ3NfemFsbG9jKTogTmV3CisgCWZ1bmN0aW9uLgorCShnZW5lcmljX2dldF9zYXZlZF9yZWdpc3Rlcik6IFVzZSBGUkFNRV9JTklUX1NBVkVEX1JFR1MgYW5kCisgCWZyYW1lLT5zYXZlZF9yZWdzLgorCShmcmFtZV9jYWNoZV9vYnN0YWNrKTogTWFrZSBzdGF0aWMuCisJKGdldF9mcmFtZV9zYXZlZF9yZWdzKTogRGVwcmVjYXRlLiBDb3B5IHRoZSBzYXZlZCByZWdzIGludG8gdGhlCisgCWZyYW1lIGJ1ZmZlci4KKworCSogc3RhY2suYyAoZnJhbWVfaW5mbyk6IFJld3JpdGUgdXNpbmcgZnJhbWUtPnNhdmVkX3JlZ3MgYW5kCisgCUZSQU1FX0lOSVRfU0FWRURfUkVHUy4KKwkqIGZpbmR2YXIuYyAoZmluZF9zYXZlZF9yZWdpc3Rlcik6IERpdHRvLgorCisJKiBjb25maWcvbW4xMDMwMC90bS1tbjEwMzAwLmggKEVYVFJBX0ZSQU1FX0lORk8pOiBEZWxldGUuCisJKEZSQU1FX0ZJTkRfU0FWRURfUkVHUyk6IFJlcGxhY2Ugd2l0aCBGUkFNRV9JTklUX1NBVkVEX1JFR1MuIE5vLW9wLgorCSogbW4xMDMwMC10ZGVwLmM6IFVwZGF0ZS4KKyAJKGFuYWx5emVfZHVtbXlfZnJhbWUpOiBOZXcgZnVuY3Rpb24uCisJKHN0cnVjdCBmcmFtZV9leHRyYV9pbmZvKTogRGVmaW5lLgorCShtbjEwMzAwX2luaXRfZXh0cmFfZnJhbWVfaW5mbyk6IFVwZGF0ZS4KKwkKKwkqIGNvbmZpZy9yczYwMDAvdG0tcnM2MDAwLmg6IChFWFRSQV9GUkFNRV9JTkZPKTogRGVsZXRlLgorIAkoRlJBTUVfRklORF9TQVZFRF9SRUdTKTogUmVwbGFjZSB3aXRoIEZSQU1FX0lOSVRfU0FWRURfUkVHUy4KKwkoRlJBTUVfQVJHU19BRERSRVNTKTogUmVwbGFjZSB3aXRoIGZ1bmN0aW9uLgorCisJKiByczYwMDAtdGRlcC5jIChmcmFtZV9nZXRfc2F2ZWRfcmVncyk6IFJlbmFtZSBmcm9tCisgCWZyYW1lX2dldF9jYWNoZV9mc3IuCisJKHJzNjAwMF9pbml0X2V4dHJhX2ZyYW1lX2luZm8pOiBOZXcgZnVuY3Rpb24uCisJKHJzNjAwMF9mcmFtZV9pbml0X3NhdmVkX3JlZ3MpOiBDYWxsIGZyYW1lX2dldF9zYXZlZF9yZWdzLgorCShGVU5DVElPTl9TVEFSVF9PRkZTRVQpOiBEZWxldGUgcmVmZXJlbmNlcywgd2FzIFpFUk8uCisJKHJzNjAwMF9mcmFtZV9hcmdzX2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24uCisJKGZyYW1lX2luaXRpYWxfc3RhY2tfYWRkcmVzcyk6IFVwZGF0ZQorCQorCSogY29uZmlnL21pcHMvdG0tbWlwcy5oIChFWFRSQV9GUkFNRV9JTkZPKTogUmVtb3ZlIHNhdmVkX3JlZ3MuCisJKEZSQU1FX0lOSVRfU0FWRURfUkVHUyk6IFJlbmFtZSBGUkFNRV9GSU5EX1NBVkVEX1JFR1MsIHVwZGF0ZS4KKwkqIG1pcHMtdGRlcC5jIChtaXBzX2ZpbmRfc2F2ZWRfcmVncywgcmVhZF9uZXh0X2ZyYW1lX3JlZywKKyAJaW5pdF9leHRyYV9mcmFtZV9pbmZvLCBtaXBzX3BvcF9mcmFtZSk6IFVwZGF0ZS4KKwkqIGNvbmZpZy9hbHBoYS90bS1hbHBoYS5oIChGUkFNRV9JTklUX1NBVkVEX1JFR1MsCisgCUVYVFJBX0ZSQU1FX0lORk8pLCBhbHBoYS10ZGVwLmMgKGFscGhhX2ZpbmRfc2F2ZWRfcmVncywKKyAJYWxwaGFfcG9wX2ZyYW1lLCBpbml0X2V4dHJhX2ZyYW1lX2luZm8pOiBEaXR0by4KKwkKKwkqIGk5NjAtdGRlcC5jLCBtODhrLXRkZXAuYywgaDgzMDAtdGRlcC5jOiBVcGRhdGUuCisJKiBjb25maWcvc3BhcmMvdG0tc3BhcmMuaCwgY29uZmlnL2EyOWsvdG0tYTI5ay5oOiBEZWZpbmUKKyAJRlJBTUVfSU5JVF9TQVZFRF9SRUdTIGFzIG5vLW9wLgorCisJKiB6OGstdGRlcC5jICh6OGtfaW5pdF9mcmFtZV9zYXZlZF9yZWdzKTogUmVuYW1lCisgCWdldF9mcmFtZV9zYXZlZF9yZWdzLgorCShleGFtaW5lX2ZyYW1lLCB6OGtfc2tpcF9wcm9sb2d1ZSk6IFVwZGF0ZS4KKwkqIGNvbmZpZy96OGsvdG0tejhrLmggKEZSQU1FX0lOSVRfU0FWRURfUkVHUyk6IERlZmluZS4KKworMTk5OC0xMi0xMSAgRmVybmFuZG8gTmFzc2VyICA8Zm5hc3NlckB0b3RlbS50by5jeWdudXMuY29tPgorCisJRnJvbSBKLlQuIENvbmtsaW4gIDxqdGNAcmVkYmFja25ldHdvcmtzLmNvbT46CisJKiBpMzg2LXN0dWIuYyAoaGFuZGxlX2V4Y2VwdGlvbik6IEFkZCBzdXBwb3J0IGZvciAnUCcgY29tbWFuZC4KKwkoTlVNUkVHUyk6IE5ldyBtYWNyby4KKworRnJpIERlYyAxMSAwOTowNzowNSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGkzODZiLW5hdC5jOiBJbmNsdWRlICJleHByZXNzaW9uLmgiLgorCisJKiBzeW10YWIuaDogRG9uJ3QgaW5jbHVkZSAiZ251LXJlZ2V4LmgiLgorCQorCSogc29saWIuYyAoc29saWJfYWRkX2NvbW1vbl9zeW1ib2xzKTogQ2FzdCBwYXJhbWV0ZXJzIHBhc3NlZCB0bworIAltYWtlX2NsZWFudXAgdG8gdXNlIHRoZSBuZXcgbWFrZV9jbGVhbnVwX2Z1bmMgdHlwZWRlZi4KKworCSogaW5mdGFyZy5jOiBJbmNsdWRlICJ3YWl0LmgiIGFmdGVyLCByYXRoZXIgdGhhbiBiZWZvcmUsIDx3YWl0Lmg+LgorICAJIndhaXQuaCIgd2FzIGRlZmluaW5nIGFsbCBXSUYqIG1hY3JvJ3MgaW5zdGVhZCBvZiBmaWxsaW5nIGluIHRob3NlCisgCXRoYXQgPHdhaXQuaD4gbWlzc2VkLgorCitGcmkgRGVjIDExIDA5OjUyOjA0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY2hvb2s+CisKKwkqIG1pcHNtMy1uYXQuYywgaHBwYWgtbmF0LmMsIGluZnB0cmFjZS5jLCBpMzg2Z251LW5hdC5jLAorIAlocHBhYi1uYXQuYywgY29yZS1hb3V0LmMsIGFybS14ZGVwLmMsIGFscGhhLW5hdC5jLCBhbHRvcy14ZGVwLmMsCisgCXB5ci14ZGVwLmMsIHJlbW90ZS1zdC5jLCByZW1vdGUtb3M5ay5jLCB0YWhvZS10ZGVwLmMsIHB5ci10ZGVwLmMsCisgCXZheC10ZGVwLmM6IFJlcGxhY2UgcmVnX25hbWUgd2l0aCBSRUdJU1RFUl9OQU1FLgorCitUaHUgRGVjIDEwIDE1OjE5OjQwIDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBieSBKaW0gQmxhbmR5IDxqaW1iQGN5Z251cy5jb20+LAorIAlFZGl0aCBFcHN0ZWluIDxlZXBzdGVpbkBjeWdudXMuY29tPiwgRWxlbmEgWmFubm9uaQorIAk8ZXphbm5vbmlAY3lnbnVzLmNvbT4gU3RhbiBTaGVicyA8c2hlYnNAY3lnbnVzLmNvbT4sIGFuZCBEYXZpZAorIAlUYXlsb3IgPHRheWxvckBjeWdudXMuY29tPiwgYXMgcGFydCBvZiB0aGUgcHJvamVjdCB0byBtZXJnZSBpbgorIAljaGFuZ2VzIG9yaWdpbmFsbHkgbWFkZSBieSBIUDsgSFAgZGlkIG5vdCBjcmVhdGUgQ2hhbmdlTG9nCisgCWVudHJpZXMuCisJCisJKiBhbm5vdGF0ZS5jIChhbm5vdGF0ZV9jYXRjaHBvaW50KTogTmV3IGZ1bmN0aW9uLgorCisJKiBhbm5vdGF0ZS5oIChhbm5vdGF0ZV9jYXRjaHBvaW50KTogZGVjbGFyZSBpdDsgYWRkIG5ldyBpbmNsdWRlcworIAkoc3ltdGFiLmggYW5kIGdkYnR5cGVzLmgpLgorCisJKiBidWlsZHN5bS5oOiBhZGQgZXh0ZXJuYWwgdmFyIHByb2Nlc3NpbmdfaHBfY29tcGlsYXRpb24uCisKKwkqIGNvZmYtc29saWIuaDogCisJKFNPTElCX1JFTU9WRV9JTkZFUklPUl9IT09LKTogbmV3IG1hY3JvLiBkZWZpbmVkIHRvIDAuCisJZnVuY3Rpb25hbGl0eSBub3QgaW1wbGVtZW50ZWQgZm9yIGNvZmYuCisJKFNPTElCX0NSRUFURV9DQVRDSF9MT0FEX0hPT0spOiBOZXcgbWFjcm87IGdlbmVyYXRlIGVycm9yIG1zZyBmb3IgY29mZi4KKwkoU09MSUJfQ1JFQVRFX0NBVENIX1VOTE9BRF9IT09LKTogZGl0dG8uCisJKFNPTElCX0hBVkVfTE9BRF9FVkVOVCk6IGRpdHRvLgorCShTT0xJQl9MT0FERURfTElCUkFSWV9QQVRITkFNRSk6IGRpdHRvLgorCShTT0xJQl9IQVZFX1VOTE9BRF9FVkVOVCk6IGRpdHRvLgorCShTT0xJQl9VTkxPQURFRF9MSUJSQVJZX1BBVEhOQU1FKTogZGl0dG8uCisJKFNPTElCX0lOX0RZTkFNSUNfTElOS0VSKTogZGl0dG8uCisJKFNPTElCX1JFU1RBUlQpOiBkaXR0by4KKworCSogY29tcGxhaW50cy5oOiBhZGQgaWZkZWYuLi5lbmRpZiBwYWlyIGF0IGJlZ2lubmluZyBhbmQgZW5kIG9mIGZpbGUuCisKKwkqIGRzdHJlYWQuYyAoZHN0X3N5bWZpbGVfcmVhZCk6IHRoZSBwYXJhbWV0ZXIgdG8gZmlsZW5vCisJbXVzdCBiZSBvZiB0eXBlIEZJTEUgKi4gU28gY2FzdCBhYmZkLT5pb3N0cmVhbSBpbiB0aGUgCisJY2FsbCB0byBmaWxlbm8gbXVzdCBiZSBjYXN0IGFzIGEgRklMRSAqLCBub3QgYSBHREJfRklMRSAqLgorCVRoaXMgd2lsbCB3b3JrIGJlY2F1c2UgYWJmZC0+aW9zdHJlYW0gaXMgZGVjbGFyZWQgYW5kIAorCWdpdmVuIGEgdmFsdWUgaW4gYmRmIGFuZCBiZmQgd2lsbCBjb250aW51ZSB0byB1c2UgRklMRSAKKwlyYXRoZXIgdGhhbiBHREJfRklMRS4KKworCSogZHdhcmYycmVhZC5jIChkd2FyZl9ib29sX25hbWUpOiBjaGFuZ2UgcGFyYW1ldGVyIGZyb20gYm9vbAorCXRvIG15Ym9vbC4gIHNpZ2guCisKKwkqIGV4cHJlc3Npb24uaDogaW5jbHVkZSBzeW10YWIuaAorCQorCSogZnJhbWUuaCAocHJpbnRfb25seV9zdGFja19mcmFtZSwgc2hvd19zdGFja19mcmFtZSwKKwlzaG93X2ZyYW1lX2luZm8pOiBhZGQgcHJvdG90eXBlcy4KKworCSogZ2RiY21kLmggKHRvZ2dsZWxpc3QsIHN0b3BsaXN0KTogZGVjbGFyZS4KKworCSogZ2RiY29yZS5oIChyZWFkX21lbW9yeV9zdHJpbmcpOiBkZWNsYXJlIGl0LgorCShleGVjX2ZpbGVfYXR0YWNoKTogYWRkIHByb3RvdHlwZS4KKworCSogaW5mbG93LmMgKHRlcm1pbmFsX2lzX291cnMpOiBtYWtlIG5vbiBzdGF0aWMuCisKKwkqIG1pbnN5bXMuYzogbWlub3Igc3BhY2luZyBjaGFuZ2UuCisKKwkqIHBhcnNlci1kZWZzLmggKHBhcnNlX25lc3RlZF9jbGFzc2VzX2Zvcl9ocGFjYyk6IGFkZCBwcm90b3R5cGUuCisJKGZpbmRfdGVtcGxhdGVfbmFtZV9lbmQpOiBhZGQgcHJvdG90eXBlLgorCisJKiBzY20tbGFuZy5jIChzY21fdW5wYWNrKTogY2FzdCBzdmFsdWUgdG8gKGludCkuCisKKwkqIHRvcC5oOiBkZWNsYXJlIGl0LgorCQorCSogdmFscHJpbnQuaCAocHJpbnRfYmluYXJ5X2NoYXJzKTogbmV3IHByb3RvdHlwZSBkZWZpbml0aW9uLgorCShwcmludF9vY3RhbF9jaGFycyk6IG5ldyBwcm90b3R5cGUgZGVmaW5pdGlvbi4KKwkocHJpbnRfZGVjaW1hbF9jaGFycyk6IG5ldyBwcm90b3R5cGUgZGVmaW5pdGlvbi4KKworVGh1IERlYyAxMCAwNzoxNDo1NiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGNob29rPgorCisJKiBjb25maWcvYXJtL3RtLWFybS5oLCBhcm0tdGRlcC5jOiBSZXBsYWNlIFJFR0lTVEVSX05BTUVTIHdpdGgKKyAJUkVHSVNURVJfTkFNRS4KKwkqIG1uMTAzMDAtdGRlcC5jLCBjb25maWcvbW4xMDMwMC90bS1tbjEwMzAwLmg6IERpdHRvLgorCSogc2gtdGRlcC5jLCBjb25maWcvc2gvdG0tc2guaDogRGl0dG8uCisKKwkqIGRlZnMuaCAoUkVHSVNURVJfTkFNRSk6IFByb3ZpZGUgZGVmYXVsdCBmb3Igb2xkIHRhcmdldHMuCisJKiBkZWZzLmgsIGluZmNtZC5jOiBSZW5hbWUgcmVnX25hbWVzIHRvIGdkYl9yZWdpc3Rlcl9uYW1lcy4KKwkKKwkqIHRyYWNlcG9pbnQuYywgdGFyZ2V0LmMsIHBhcnNlLmMsIGluZmNtZC5jLCByZW1vdGUtdWRpLmMsCisgCWV4cHByaW50LmMsIGluZmNtZC5jLCBwcmludGNtZC5jLCBldmFsLmMsIHN0YWNrLmMsIGZpbmR2YXIuYywKKyAJcmVtb3RlLXVkaS5jLCBjb25maWcvYWxwaGEvdG0tYWxwaGEuaCwgcmVtb3RlLXNpbS5jLCBkMzB2LXRkZXAuYywKKyAJY29uZmlnL21pcHMvdG0tbWlwcy5oLCBocHBhLXRkZXAuYzogVXNlIFJFR0lTVEVSX05BTUUuCisKKzE5OTgtMTItMDggIEphbWVzIEUgV2lsc29uICA8d2lsc29uQHdpbHNvbi1wYy5jeWdudXMuY29tPgorCisJKiBjb25maWcvaTk2MC9tb245NjAubXQgKFNJTV9PQkpTLCBTSU0pOiBEZWZpbmUuCisKK1R1ZSBEZWMgIDggMTY6NDk6MjQgMTk5OCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBORVdTOiBBZGQgbWVudGlvbnMgb2YgbmV3bHktYWRkZWQgY29uZmlndXJhdGlvbnMuCisKKzE5OTgtMTItMDggIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AbWFjcWVsLmJlPgorCisgICAgICAgICogY29uZmlnL3htLWFpeDQuaCAoU0lHV0lOQ0hfSEFORExFUik6IEZ1bmN0aW9uIGBhaXhfcmVzaXplX3dpbmRvdycKKyAgICAgICAgbXVzdCBhY2NlcHQgYSBzaWduYWwgbnVtYmVyIGFzIHBhcmFtZXRlci4KKyAgICAgICAgKiBjb25maWcvcnM2MDAwL3htLXJzNjAwMC5oIChTSUdXSU5DSF9IQU5ETEVSKTogRGl0dG8uCisgICAgICAgICogdXRpbHMuYyAoaW5pdGlhbGl6ZV91dGlscyk6IEdpdmUgYSBwYXJhbWV0ZXIgdG8gYFNJR1dJTkNIX0hBTkRMRVInLgorCisgICAgICAgICogaW5mZXJpb3IuaCAocmVnaXN0ZXJfdmFsaWQpOiBWYXJpYWJsZSdzIHR5cGUgaXMgYFNJR05FRCBjaGFyJywgbm90CisgICAgICAgIGBjaGFyJy4KKyAgICAgICAgKiBmaW5kdmFyLmMgKHJlZ2lzdGVyX3ZhbGlkKTogRGl0dG8uCisKKyAgICAgICAgKiBkZWZzLmggKG1ha2VfY2xlYW51cF9mdW5jKTogUHJvdGVjdCBwYXJhbWV0ZXIgbGlzdCBieSBgUEFSQU1TJy4KKyAgICAgICAgKiBnZGJ0aHJlYWQuaCAodW5iaW5kX3RhcmdldF90aHJlYWRfdmVjdG9yKTogTGlrZXdpc2UuIAorCitUdWUgRGVjICA4IDE1OjA5OjQ0IDE5OTggIEVkaXRoIEVwc3RlaW4gIDxlZXBzdGVpbkBzb3BoaWEuY3lnbnVzLmNvbT4KKworICAgICAgICBNZXJnZWQgaW4gbTY4ay1saW51eCBwYXRjaCBmcm9tIEFuZHJlYXMgU2Nod2FiCisgCisgICAgICAgIDE5OTgtMTItMDEgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KKyAKKyAgICAgICAgKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmhvc3QsIGNvbmZpZ3VyZS50Z3Q6IEFkZCBzdXBwb3J0IGZvcgorICAgICAgICBtNjhrLWxpbnV4LgorICAgICAgICAqIGNvbmZpZy9tNjhrL2xpbnV4Lm1oOiBOZXcgZmlsZS4KKyAgICAgICAgKiBjb25maWcvbTY4ay9saW51eC5tdDogTmV3IGZpbGUuCisgICAgICAgICogY29uZmlnL202OGsvbm0tbGludXguaDogTmV3IGZpbGUuCisgICAgICAgICogY29uZmlnL202OGsvdG0tbGludXguaDogTmV3IGZpbGUuCisgICAgICAgICogY29uZmlnL202OGsveG0tbGludXguaDogTmV3IGZpbGUuCisgICAgICAgICogZ2RiL202OGtsaW51eC1uYXQuYzogTmV3IGZpbGUuCisgICAgICAgICogZ2Ric2VydmVyL2xvdy1saW51eC5jOiBBZGQgc3VwcG9ydCBmb3IgbTY4ay1saW51eC4KKyAgICAgICAgKiBnZGIvY29uZmlnL202OGsvdG0tbTY4ay5oIChOVU1fRlJFR1MpOiBOZXcgbWFjcm8uCisKKzE5OTgtMTItMDcgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2kzODYveG0tY3lnd2luLmg6IFJlbW92ZSBSRVFVRVNUX1FVSVQgZGVmaW5pdGlvbi4KKwkqIGNvbmZpZy9wb3dlcnBjL3htLWN5Z3dpbi5oOiBEaXR0by4KKworMTk5OC0xMi0wNyAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgorCisJKiByczYwMDAtdGRlcC5jIChwb3BfZnJhbWUpOiBDb3JyZWN0bHkgZmluZCB0aGUgcmVnaXN0ZXJzIHNhdmVkIGluCisJdGhlIHN0YWNrIGZyYW1lLiAgVGhlaXIgb2Zmc2V0IGZyb20gdGhlIHByZXZpb3VzIHN0YWNrIGZyYW1lIGlzIGluCisJZmRhdGEuZ3ByX29mZnNldCBhbmQgZmRhdGEuZnByX29mZnNldCwgbm90IGZkYXRhLm9mZnNldC4KKwkoZ2RiLmJhc2UvcmV0dXJuLmV4cCkKKwkqIGNvbmZpZy9yczYwMDAvdG0tcnM2MDAwLmg6IERvYyBmaXhlcy4KKworMTk5OC0xMi0wMyAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQorCisgICAgICAgICogbW9uaXRvci5jIChtb25pdG9yX3JlYWRfbWVtb3J5KTogWmVybyBvdXQgcGF0dGVybiBidWZmZXJzCisgICAgICAgIGJlZm9yZSBjYWxsaW5nIHJlX3NlYXJjaC4KKyAgICAgICAgKHBhcnNlX3JlZ2lzdGVyX2R1bXApOiBEaXR0by4KKworVGh1IERlYyAgMyAxMDozNzoyMiBFU1QgMTk5OCAgWmRlbmVrIFJhZG91Y2ggICAocmFkb3VjaEBjeWdudXMuY29tKQorCisJRlIzMCB1cGRhdGVzIC0gc3RpbGwgdmVyeSBwcmVsaW1pbmFyeS4KKwkqIGNvbmZpZ3VyZS50Z3QKKwkqIGZyMzAtdGRlcC5jCisJKiBjb25maWcvZnIzMC90bS1mcjMwLmgKKwkKK1RodSBEZWMgIDMgMTY6MzA6MzUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBheC1nZGIuYzogSW5jbHVkZSB0YXJnZXQuaC4KKworVHVlIERlYyAgMyAxMDo1OTowMCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGF4LWdkYi5jIChfaW5pdGlhbGl6ZV9heF9nZGIpLCBpOTYwLXRkZXAuYyAocG9wX2ZyYW1lKSwKKyAJbW9uaXRvci5jIChmbHVzaF9tb25pdG9yX2RjYWNoZSwgbG9uZ2xvbmdlbmRzd2FwKSwgcmVtb3RlLWFycmF5LmMKKyAJKGhleHdvcmQyYXNjaWkpLCB3ODlrLXJvbS5jIChpbml0X3c4OWtfY21kcyksIHo4ay10ZGVwLmMKKyAJKGluaXRfZnJhbWVfcGMsIGV4dHJhY3RfcmV0dXJuX3ZhbHVlKTogTWFrZSByZXR1cm4gdHlwZSB2b2lkLgorCSogbW9uaXRvci5jIChtb25pdG9yX3dyaXRlX2V2ZW5fYmxvY2spOiBNYWtlIHJldHVybiB0eXBlIGV4cGxpY2l0LgorCShtb25vdG9yX3JlYWRfbWVtb3J5X2Jsb2NrKTogRGVsZXRlIGZ1bmN0aW9uLgorCSogbW9uaXRvci5oOiBVcGRhdGUuCisJKiByZW1vdGUuYyAocmVtb3RlX2dldF90aHJlYWRsaXN0LCByZW1vdGVfdXBkYXRlX3RocmVhZHMpLAorIAlyZW1vdGUtYXJyYXkuYyAoYXJyYXlfZ2V0X3BhY2tldCksIHJlbW90ZS1yZGkuYyAoRmFpbCk6IEFsd2F5cworIAlyZXR1cm4gYSB2YWx1ZS4KKwkqIG0zMnItdGRlcC5jIChtMzJyX2ZpeF9jYWxsX2R1bW15KTogRnJvbSBNaWNoYWVsIFNueWRlciwgdm9pZAorIAlmdW5jdGlvbi4KKwkqIGp2LXZhbHByaW50LmMgKGphdmFfdmFsX3ByaW50KTogRnJvbSBTdHUgR3Jvc3NtYW4uIFJldHVybiAwIGJ5CisgCWRlZmF1bHQuCisJCitXZWQgRGVjICAyIDE1OjExOjM4IDE5OTggIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIHRyYWNlcG9pbnQuYzogTW92ZSBkZWZhdWx0IGRlZmluaXRpb24gb2YgCisJVEFSR0VUX1ZJUlRVQUxfRlJBTUVfUE9JTlRFUiBmcm9tIGhlcmUgdG8gdGFyZ2V0LmguCisJKiB0YXJnZXQuaDogQWRkIGRlZmF1bHQgZGVmaW5pdGlvbiBvZiBUQVJHRVRfVklSVFVBTF9GUkFNRV9QT0lOVEVSLgorCSogYXgtZ2RiLmMgKGdlbl9mcmFtZV9hcmdzX2FkZHJlc3MsIGdlbl9mcmFtZV9sb2NhbHNfYWRkcmVzcyk6CisJdXNlIFRBUkdFVF9WSVJUVUFMX0ZSQU1FX1BPSU5URVIgdG8gZGV0ZXJtaW5lIGZyYW1lIHBvaW50ZXIuCisJKGdlbl90cmFjZV9mb3JfZXhwcik6IG5ldyBhcmd1bWVudCwgYWRkcmVzcyBvZiB0cmFjZXBvaW50LCAKKwlnZXRzIHBhc3NlZCB0byBuZXdfYWdlbnRfZXhwciBhbmQgYWRkZWQgdG8gc3RydWN0IGFnZW50X2V4cHIuCisJKGlzX25vbnRyaXZpYWxfY29udmVyc2lvbik6IGNhbGwgdG8gbmV3X2FnZW50X2V4cHIgbm93IHJlcXVpcmVzCisJYSBkdW1teSBhcmd1bWVudC4gIChhZ2VudF9jb21tYW5kKTogdXNlIGdldF9jdXJyZW50X2ZyYW1lKCkgdG8KKwlnZXQgY3VycmVudCBQQyBzY29wZTsgcGFzcyBpdCB0byBnZW5fdHJhY2VfZm9yX2V4cHIuCisJKiBheC1nZW5lcmFsLmMgKG5ld19hZ2VudF9leHByKTogbmV3IGFyZ3VtZW50LCBhZGRyZXNzIG9mIAorCXRyYWNlcG9pbnQ7IHN0b3JlIGl0IGluIG5ldyBmaWVsZCBvZiBzdHJ1Y3QgYWdlbnRfZXhwci4KKwkqIGF4LmggKHN0cnVjdCBhZ2VudF9leHByKTogYWRkIG5ldyBmaWVsZCBmb3IgdHJhY2Vwb2ludCBhZGRyZXNzLgorCSogYXgtZ2RiLmg6IGNoYW5nZSBwcm90b3R5cGVzIHRvIG1hdGNoIGFib3ZlIGNoYW5nZXMuCisKKwkqIG0zMnItdGRlcC5jIChkZWNvZGVfcHJvbG9ndWUpOiBJZiBubyBicmFuY2ggb3IgcHVzaCBmcCBpcyBmb3VuZCwKKwlidXQgdGhlcmUncyBhIHN0YWNrIGFkanVzdCwgdGhlbiB1c2UgdGhhdCBhcyB0aGUgZW5kIG9mIHByb2xvZ3VlLgorCShtMzJyX3NraXBfcHJvbG9ndWUpOiBkb24ndCBza2lwIHBhc3QgdGhlIGZpcnN0IGxpbmUgaWYgdGhlcmUgaXMgCisJbGluZSBpbmZvLiAgKG0zMnJfdmlydHVhbF9mcmFtZV9wb2ludGVyKTogbmV3IGZ1bmN0aW9uLgorCShtMzJyX2ZpeF9jYWxsX2R1bW15KTogbm8gcmV0dXJuIHZhbHVlIG5lZWRlZC4KKwkKK1R1ZSBEZWMgIDEgMTA6NTk6MDAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBvY2QuYyAocmVtb3RlX3RpbWVvdXQpLCAoQkRNX0JSRUFLUE9JTlQpLCBtb25pdG9yLmMgKHJlYWRjaGFyKSwKKyAJcmVtb3RlLmM6IENsZWFudXAgY2xvc2luZyBvZiBvcGVuIGNvbW1lbnRzLgorCitNb24gTm92IDMwIDE2OjA0OjAzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9mcjMwL3RtLWZyMzAuaCAoSU5ORVJfVEhBTik6IEFkZCBwYXJhbWV0ZXJzLgorCitNb24gTm92IDMwIDExOjE4OjQ4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY2hvb2s+CisKKwkqIGZyYW1lLmggKEZSQU1FX0NIQUlOX1ZBTElEKTogRGVmYXVsdCB0bworIAlkZWZhdWx0X2ZyYW1lX2NoYWluX3ZhbGlkLgorCSogYmxvY2tmcmFtZS5jIChkZWZhdWx0X2ZyYW1lX2NoYWluX3ZhbGlkKTogTmV3IGZ1bmN0aW9uLgorCQorCSogZnJhbWUuaCAoRlJBTUVfQ0hBSU5fVkFMSURfQUxURVJOQVRJVkUpOiBEZWxldGUgcmVmZXJlbmNlcworCSogYmxvY2tmcmFtZS5jIChhbHRlcm5hdGVfZnJhbWVfY2hhaW5fdmFsaWQpOiBOZXcgZnVuY3Rpb24uCisJKiBjb25maWcvbWlwcy90bS1taXBzdjQuaCwgY29uZmlnL204OGsvdG0tZGVsdGE4OHY0LmgsCisgCWNvbmZpZy9tNjhrL3RtLW1vbml0b3IuaCwgY29uZmlnL202OGsvdG0tbTY4a3Y0LmgsCisgCWNvbmZpZy9pMzg2L3RtLWkzODZ2NC5oLCBjb25maWcvaTM4Ni90bS1pMzg2bncuaCwKKyAJY29uZmlnL2g4MzAwL3RtLWg4MzAwLmg6IFVwZGF0ZS4KKworCSogYmxvY2tmcmFtZS5jIChub25udWxsX2ZyYW1lX2NoYWluX3ZhbGlkKTogTmV3IGZ1bmN0aW9uLgorCSogY29uZmlnL202OGsvdG0tb3M2OGsuaCwgY29uZmlnL202OGsvdG0tdng2OC5oLAorIAljb25maWcvbTY4ay90bS1hcG9sbG82OGIuaCwgY29uZmlnL2k5NjAvdG0tdng5NjAuaCwKKyAJY29uZmlnL2FyYy90bS1hcmMuaDogVXBkYXRlIEZSQU1FX0NIQUlOX1ZBTElELgorCisJKiBocHBhLXRkZXAuYyAoZnJhbWVfY2hhaW5fdmFsaWQsIGhwcGFfZnJhbWVfY2hhaW5fdmFsaWQpLAorIAlyZW1vdGUtdngyOWsuYyAoZ2V0X2ZwX2NvbnRlbnRzLCB2eDI5a19mcmFtZV9jaGFpbl92YWxpZCksCisgCWFybS10ZGVwLmMgKGZyYW1lX2NoYWluX3ZhbGlkLCBhcm1fZnJhbWVfY2hhaW5fdmFsaWQpOiBSZW5hbWUKKyAJZnVuY3Rpb25zIHNvIHRoYXQgdGhleSBhcmUgbmFtZSBzcGFjZSBjbGVhbi4KKwkqIGNvbmZpZy9wYS90bS1ocHBhLmgsIGNvbmZpZy9hMjlrL3RtLXZ4MjlrLmgsCisgCWNvbmZpZy9hcm0vdG0tYXJtLmg6IFVwZGF0ZSBGUkFNRV9DSEFJTl9WQUxJRC4KKwkKKwkqIGdvdWxkLXRkZXAuYyAoZ291bGRfZnJhbWVfY2hhaW5fdmFsaWQpLCBkMzB2LXRkZXAuYworIAkoZDMwdl9mcmFtZV9jaGFpbl92YWxpZCksIGQxMHYtdGRlcC5jIChkMTB2X2ZyYW1lX2NoYWluX3ZhbGlkKToKKyAJTmV3IGZ1bmN0aW9ucy4KKwkqIGNvbmZpZy9nb3VsZC90bS1ucDEuaCwgY29uZmlnL2dvdWxkL3RtLXBuLmgsCisgCWNvbmZpZy9kMzB2L3RtLWQzMHYuaCwgY29uZmlnL2QxMHYvdG0tZDEwdi5oOiBVcGRhdGUKKyAJRlJBTUVfQ0hBSU5fVkFMSUQuCisKK1N1biBOb3YgMjkgMTE6MTg6MzcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiB6OGstdGRlcC5jICh6OGtfYWRkcl9iaXRzX3JlbW92ZSksIHc2NS10ZGVwLmMKKyAJKHc2NV9hZGRyX2JpdHNfcmVtb3ZlKSwgaDg1MDAtdGRlcC5jIChoODUwMF9hZGRyX2JpdHNfcmVtb3ZlKSwKKyAJbTg4ay10ZGVwLmMgKG04OGtfYWRkcl9iaXRzX3JlbW92ZSk6IEZ1bmN0aW9uIHRvIGNsZWFuIHVwIGFuCisgCWFkZHJlc3MuCisJKiBjb25maWcvejhrL3RtLXo4ay5oLCBjb25maWcvdzY1L3RtLXc2NS5oLCBjb25maWcvbTg4ay90bS1tODhrLmgsCisgCWNvbmZpZy9oODUwMC90bS1oODUwMC5oOiBEZWZpbmUgQUREUl9CSVRTX1JFTU9WRSB0byBjYWxsIHRhcmdldHMKKyAJY29ycmVzcG9uZGluZyBmdW5jdGlvbi4KKwkqIHo4ay10ZGVwLmMgKHNhdmVkX3BjX2FmdGVyX2NhbGwpOiBVcGRhdGUuCisKK1NhdCBOb3YgMjggMTI6MjQ6MzEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWcvejhrL3RtLXo4ay5oLCBjb25maWcvdzY1L3RtLXc2NS5oLCBjb25maWcvdmF4L3RtLXZheC5oLAorIAljb25maWcvdjg1MC90bS12ODUwLmgsIGNvbmZpZy90YWhvZS90bS10YWhvZS5oLAorIAljb25maWcvc3BhcmMvdG0tc3BhcmMuaCwgY29uZmlnL3NoL3RtLXNoLmgsCisgCWNvbmZpZy9yczYwMDAvdG0tcnM2MDAwLmgsIGNvbmZpZy9weXIvdG0tcHlyLmgsCisgCWNvbmZpZy9wYS90bS1ocHBhLmgsIGNvbmZpZy9uczMyay90bS11bWF4LmgsCisgCWNvbmZpZy9uczMyay90bS1tZXJsaW4uaCwgY29uZmlnL25vbmUvdG0tbm9uZS5oLAorIAljb25maWcvbW4xMDMwMC90bS1tbjEwMzAwLmgsIGNvbmZpZy9tbjEwMjAwL3RtLW1uMTAyMDAuaCwKKyAJY29uZmlnL21pcHMvdG0tbWlwcy5oLCBjb25maWcvbTg4ay90bS1tODhrLmgsCisgCWNvbmZpZy9tNjhrL3RtLW02OGsuaCwgY29uZmlnL20zMnIvdG0tbTMyci5oLAorIAljb25maWcvaTk2MC90bS1pOTYwLmgsIGNvbmZpZy9pMzg2L3RtLWkzODYuaCwKKyAJY29uZmlnL2g4NTAwL3RtLWg4NTAwLmgsIGNvbmZpZy9oODMwMC90bS1oODMwMC5oLAorIAljb25maWcvZ291bGQvdG0tcG4uaCwgY29uZmlnL2dvdWxkL3RtLW5wMS5oLCBjb25maWcvYXJtL3RtLWFybS5oLAorIAljb25maWcvY29udmV4L3RtLWNvbnZleC5oLCBjb25maWcvZDEwdi90bS1kMTB2LmgsCisgCWNvbmZpZy9hbHBoYS90bS1hbHBoYS5oLCBjb25maWcvYTI5ay90bS1hMjlrLmg6IEFkZCBwYXJhbWV0ZXJzIHRvCisgCW1hY3JvIElOTkVSX1RIQU4uCisKKwkqIHZhbG9wcy5jIChwdXNoX3dvcmQsIHZhbHVlX3B1c2gsIGNhbGxfZnVuY3Rpb25fYnlfaGFuZCksCisgCWJyZWFrcG9pbnQuYyAoYnBzdGF0X3N0b3Bfc3RhdHVzKSwgYmxvY2tmcmFtZS5jCisgCShnZW5lcmljX3B1c2hfZHVtbXlfZnJhbWUsIGdlbmVyaWNfZnJhbWVfY2hhaW5fdmFsaWQpLCBpbmZlcmlvci5oCisgCShQQ19JTl9DQUxMX0RVTU1ZKSwgaW5mcnVuLmMgKHdhaXRfZm9yX2luZmVyaW9yKTogVXBkYXRlIHVzZSBvZgorIAlJTk5FUl9USEFOLgorCitGcmkgTm92IDI3IDExOjAwOjI1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY2hvb2s+CisKKwkqIHRhcmdldC5oIChvbmVfc3RlcHBlZCk6IE1vdmUgZ2xvYmFsIGZyb20gaGVyZS4KKwkqIGluZnJ1bi5jIChzaW5nbGVzdGVwX2JyZWFrcG9pbnRzX2luc2VydGVkX3ApOiBUbyBoZXJlLiBSZW5hbWUuCisgIAlNYWtlIHN0YXRpYy4KKwkod2FpdF9mb3JfaW5mZXJpb3IpOiBVcGRhdGUuCisJKHJlc3VtZSk6IFVwZGF0ZS4gU2V0IHZhcmlhYmxlIGFmdGVyIGNhbGwgdG8gU09GVFdBUkVfU0lOR0xFX1NURVAuCisJCisJKiB0YXJnZXQuaCAoTk9fU0lOR0xFX1NURVApOiBSZXBsYWNlIHdpdGggU09GVFdBUkVfU0lOR0xFX1NURVBfUAorIAlhbmQgU09GVFdBUkVfU0lOR0xFX1NURVAuCisJKiBjb25maWcvc3BhcmMvdG0tc3BhcmMuaCwgY29uZmlnL3JzNjAwMC90bS1yczYwMDAuaCwKKyAJY29uZmlnL2FyYy90bS1hcmMuaDogVXBkYXRlLgorCSogcnM2MDAwLXRkZXAuYyAocnM2MDAwX3NvZnR3YXJlX3NpbmdsZV9zdGVwKSwgc3BhcmMtdGRlcC5jCisgCShzcGFyY19zb2Z0d2FyZV9zaW5nbGVfc3RlcCksIGFyYy10ZGVwLmMgKGFyY19zaW5nbGVfc3RlcCk6IE5ldworIAlmdW5jdGlvbnMuIFJlcGxhY2UgZnVuY3Rpb24gc2luZ2xlX3N0ZXAuCisJCisJKiBjb25maWcvbWlwcy90bS1taXBzLmggKFNURVBfU0tJUFNfREVMQVlfUCk6IERlZmluZS4KKwkqIGluZnJ1bi5jIChwcm9jZWVkKTogQ2xlYW51cC4KKworVGh1IE5vdiAyNiAxMToxOToxNSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGFteS5jeWdudXMuY29tPgorCisJKiBjb25maWcvYWxwaGEvdG0tYWxwaGEuaCAoQUJPVVRfVE9fUkVUVVJOKTogUmVwbGFjZSBtYWNyby4KKwkqIGFscGhhLXRkZXAuYyAoYWxwaGFfYWJvdXRfdG9fcmV0dXJuKTogV2l0aCBuZXcgZnVuY3Rpb24uCisJKGhldXJpc3RpY19wcm9jX3N0YXJ0KTogVXBkYXRlLgorCSogY29uZmlnL21pcHMvdG0tbWlwcy5oIChBQk9VVF9UT19SRVRVUk4pLCBtaXBzLXRkZXAuYworIAkoaGV1cmlzdGljX3Byb2Nfc3RhcnQsIG1pcHNfYWJvdXRfdG9fcmV0dXJuKTogRGl0dG8uCisJKiBjb25maWcvbnMzMmsvdG0tbWVybGluLmggKEFCT1VUX1RPX1JFVFVSTiksCisgCWNvbmZpZy9uczMyay90bS11bWF4LmggKEFCT1VUX1RPX1JFVFVSTiksIG5zMzJrLXRkZXAuYworIAkobnMzMmtfYWJvdXRfdG9fcmV0dXJuLCBuczMya19nZXRfZW50ZXJfYWRkcik6IERpdHRvLgorCisJKiBjb25maWcvejhrL3RtLXo4ay5oLCBjb25maWcvdzY1L3RtLXc2NS5oLCBjb25maWcvdmF4L3RtLXZheC5oLAorIAljb25maWcvdGFob2UvdG0tdGFob2UuaCwgY29uZmlnL3NwYXJjL3RtLXNwYXJjLmgsCisgCWNvbmZpZy9zaC90bS1zaC5oLCBjb25maWcvcnM2MDAwL3RtLXJzNjAwMC5oLCBjb25maWcvcHlyL3RtLXB5ci5oLAorIAljb25maWcvcGEvdG0taHBwYS5oLCBjb25maWcvbTg4ay90bS1tODhrLmgsIGNvbmZpZy9tNjhrL3RtLW02OGsuaCwKKyAJY29uZmlnL2k5NjAvdG0taTk2MC5oLCBjb25maWcvaTM4Ni90bS1pMzg2LmgsCisgCWNvbmZpZy9oODUwMC90bS1oODUwMC5oLCBjb25maWcvaDgzMDAvdG0taDgzMDAuaCwKKyAJY29uZmlnL2dvdWxkL3RtLXBuLmgsIGNvbmZpZy9nb3VsZC90bS1ucDEuaCwKKyAJY29uZmlnL2NvbnZleC90bS1jb252ZXguaCwgY29uZmlnL2FybS90bS1hcm0uaCwKKyAJY29uZmlnL2FyYy90bS1hcmMuaCwgY29uZmlnL2EyOWsvdG0tYTI5ay5oOiBEZWxldGUgbWFjcm8KKyAJQUJPVVRfVE9fUkVUVVJOLgorCSogY29uZmlnL3c2NS90bS13NjUuaCAoUlRMLCBSVFMpOiBEZWxldGUgbWFjcm9zLgorCSogaDg1MDAtdGRlcC5jIChhYm91dF90b19yZXR1cm4pOiBEZWxldGUgZnVuY3Rpb24uCisKK1RodSBOb3YgMjYgMTE6MTk6MTUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjaG9vay5jeWdudXMuY29tPgorCisJKiByczYwMDAtdGRlcC5jIChyczYwMDBfYnJlYWtwb2ludF9mcm9tX3BjKTogQ2hhbmdlIGJpZ19icmVha3BvaW50CisgCWFuZCBsaXR0bGVfYnJlYWtwb2ludCB0byBjaGFyW10gZnJvbSBjaGFyKi4KKwkqIHJlbW90ZS1hcnJheS5jIChhcnJheV9pbnNlcnRfYnJlYWtwb2ludCk6IENoYW5nZSBicF9hZGRyIHRvCisgCUNPUkVfQUREUiB0eXBlLgorCitXZWQgTm92IDI1IDAwOjEzOjA2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogdngtc2hhcmUveGRyX2xkLmMgKHhkcl9sZHRhYmwpOiBDYXN0IHNlY29uZCBhcmcgdG8gY2hhcioqCisgCWluc3RlYWQgb2YgY2hhciouCisKKwkqIGNvbmZpZ3VyZS50Z3QgKHY4NTApOiBPbmx5IGJ1aWxkIHY4NTBpY2Ugd2hlbiBjeWd3aW4gYW5kIGd1aS4KKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHBhcmFtZXRlciB0byAtLWVuYWJsZS1idWlsZC13YXJuaW5ncy4KKwkqIGNvbmZpZ3VyZTogUmUtYnVpbGQuCisKKwkqIGMtZXhwLnkgKHBhcnNlX251bWJlcik6IFJld3JpdGUgc2hpZnQgdG8gcGFjaWZ5IEdDQy4KKworCSogY29uZmlnL2k5NjAvdG0taTk2MC5oIChCUkVBS1BPSU5UKTogRGVsZXRlIGRlZmluaXRpb24gLSBzaW1wbHkKKyAJd3JvbmcuCisKKwkqIG1vbml0b3IuYyAoY29tcGlsZV9wYXR0ZXJuKTogTWFrZSB2YWwgY29uc3QgY2hhciouCisJKG1vbml0b3Jfd2FpdF9jbGVhbnVwKTogTWFrZSBvbGRfdGltZW91dCB2b2lkKiwgcG9pbnRpbmcgYXQKKyAJb2xkX3RpbWVvdXQuCisJKG1vbml0b3Jfd2FpdCk6IFVwZGF0ZS4KKworCSogcmVtb3RlLXVkaS5jLCByZW1vdGUtc2ltLmMsIHJlbW90ZS1lNzAwMC5jLCBocHBhLXRkZXAuYywKKyAJcmVtb3RlLW1pcHMuYywgc3BhcmNsLXRkZXAuYywgeGNvZmZyZWFkLmM6IENhc3QgcGFyYW1ldGVycyBwYXNzZWQKKyAJdG8gbWFrZV9jbGVhbnVwIHRvIHVzZSB0aGUgbmV3IG1ha2VfY2xlYW51cF9mdW5jIHR5cGVkZWYuCisKKwkqIGFscGhhLXRkZXAuYyAoTUFTSyk6IFVzZSBMT05HRVNUIHRvIGF2b2lkIGFyaXRobWV0aWMgb3ZlcmZsb3cuCisKKwkqIGNvbmZpZy9hMjlrL3RtLWEyOWsuaCAoVFJBTlNQQVJFTlQpOiBSZW5hbWUgbWFjcm8gdG8KKyAJVFJBTlNQQVJFTlRfRlJBTUUuIEF2b2lkIG5hbWUtc3BhY2UgY2xhc2guCisJKiBhMjlrLXRkZXAuYyAoaW5pdF9mcmFtZV9pbmZvKTogVXBkYXRlLgorCitXZWQgTm92IDI1IDIwOjM3OjAwIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogcnM2MDAwLXRkZXAuYyAocnM2MDAwX2JyZWFrcG9pbnRfZnJvbV9wYyk6IENoYW5nZSBiaWdfYnJlYWtwb2ludAorIAlhbmQgbGl0dGxlX2JyZWFrcG9pbnQgdG8gY2hhcltdIGZyb20gY2hhciouCisJKiBtZW0tYnJlYWsuYyAobWVtb3J5X2luc2VydF9icmVha3BvaW50LAorIAltZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQpOiBQYXNzIGFkZHJlc3Mgb2YgYnBsZW4uCisJKiByZW1vdGUtYXJyYXkuYyAoYXJyYXlfaW5zZXJ0X2JyZWFrcG9pbnQpOiBDaGFuZ2UgYnBfYWRkciB0bworIAlDT1JFX0FERFIgdHlwZS4KKworVHVlIE5vdiAyNCAxNTo0NjozMyAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBjb25maWcvbW4xMDMwMC90bS1tbjEwMzAwLmggKFRBUkdFVF9WSVJUVUFMX0ZSQU1FX1BPSU5URVIpOgorCW5ldyB0YXJnZXQgbWFjcm8uCisJKiBtbjEwMzAwLXRkZXAuYyAobW4xMDMwMF92aXJ0dWFsX2ZyYW1lX3BvaW50ZXIpOiBuZXcgZnVuY3Rpb24uCisJKiB0cmFjZXBvaW50LmMgKGVuY29kZV9hY3Rpb25zKTogVXNlIHRoZSBuZXcgdGFyZ2V0IG1hY3JvIHRvCisJZGV0ZXJtaW5lIHRoZSB2aXJ0dWFsIGZyYW1lIHBvaW50ZXIsIGZvciBjb2xsZWN0aW5nIGxvY2Fscy9hcmdzLgorCShhZGRfbG9jYWxfc3ltYm9scywgY29sbGVjdF9zeW1ib2wpOiBhZGQgYSByZWdpc3Rlci9vZmZzZXQgcGFpciBvZgorCWFyZ3VtZW50cyBzbyB0aGF0IHRoZSB2aXJ0dWFsIGZyYW1lIHBvaW50ZXIgY2FuIGJlIHBhc3NlZCBpbi4KKworMTk5OC0xMS0yNCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgorCisJKiBwcm9jZnMuYyAocHJvY2ZzX3dhaXQpOiBoYW5kbGUgc3lzY2FsbCBldmVudHMgZmlyc3QuCisJCisJKiBwcm9jZnMuYyAoR0RCX0dSRUdTRVRfVFlQRSwgR0RCX0ZQUkVHU0VUX1RZUEUpOiBuZXcgbWFjcm9zLgorCSogY29uZmlnL3NwYXJjL3htLXN1bjRzb2wyLmg6IHVzZSB0aGVtLgorCSogY29yZS1zb2wyLmM6IGRvbid0ICN1bmRlZiBncmVnc2V0X3QgYW5kIGZwcmVnc2V0X3QuCisJKiBzb2wtdGhyZWFkLmM6IGRpdHRvLgorCSogc3BhcmMtdGRlcC5jOiBkaXR0by4KKwkKK1R1ZSBOb3YgMjQgMTQ6MTM6MTAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjaG9vaz4KKworCSogYnJlYWtwb2ludC5jIChtZW1vcnlfYnJlYWtwb2ludF9zaXplKTogRGVsZXRlIGdsb2JhbC4KKwkocmVhZF9tZW1vcnlfbm9icHQpOiBEZXRlcm1pbmUgcmVhbCBicmVha3BvaW50IGFkZHJlc3MgYW5kIHNpemUKKyAJdXNpbmcgQlJFQUtQT0lOVF9GUk9NX1BDLgorCisJKiBkZWZzLmggKGJyZWFrcG9pbnRfZnJvbV9wY19mbik6IEJSRUFLUE9JTlRfRlJPTV9QQyBmdW5jdGlvbgorIAl0ZW1wbGF0ZS4KKwkqIHRhcmdldC5oLCBtZW0tYnJlYWsuYyAobWVtb3J5X2JyZWFrcG9pbnRfZnJvbV9wYyk6CisgCVJld3JpdGUuIEFsd2F5cyBkZWZpbmUuICBSZXR1cm4gTlVMTCB3aGVuIG1lbW9yeSBicmVha3BvaW50cyBhcmUKKyAJbm90IHN1cHBvcnRlZC4KKwkobWVtb3J5X2luc2VydF9icmVha3BvaW50LCBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQpOiBDYWxsCisgCUJSRUFLUE9JTlRfRlJPTV9QQy4KKwkqIHRhcmdldC5oIChCUkVBS1BPSU5UX0ZST01fUEMpOiBQcm92aWRlIGRlZmF1bHQuCisJKiBnZGJpbnQudGV4aW5mbyAoQlJFQUtQT0lOVF9GUk9NX1BDKTogRG9jdW1lbnQuCisKKwkqIGNvbmZpZy9yczYwMDAvdG0tcnM2MDAwLmggKEJSRUFLUE9JTlQpOiBEZWxldGUgbWFjcm8uCisgCShCUkVBS1BPSU5UX0ZST01fUEMpOiBEZWZpbmUuCisgCSh7QklHLExJVFRMRX1fQlJFQUtQT0lOVCk6IE1vdmUgbWFjcm9zIGZyb20gaGVyZS4KKwkqIHJzNjAwMC10ZGVwLmM6IFRvIGhlcmUuCisgCShyczYwMDBfYnJlYWtwb2ludF9mcm9tX3BjKTogTmV3IGZ1bmN0aW9uLgorCisJKiBjb25maWcvbW4xMDMwMC90bS1tbjEwMzAwLmggKEJSRUFLUE9JTlQpOiBEZWxldGUgbWFjcm8uCisgCShCUkVBS1BPSU5UX0ZST01fUEMpOiBEZWZpbmUsIGNhbGwuCisJKiBtbjEwMzAwLXRkZXAuYyAobW4xMDMwMF9icmVha3BvaW50X2Zyb21fcGMpOiBOZXcgZnVuY3Rpb24uCisKKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaCAoe0JJRyxMSVRUTEV9X0JSRUFLUE9JTlQsCisgCUlEVF97QklHLExJVFRMRX1fQlJFQUtQT0lOVCwgUE1PTl97QklHLExJVFRMRX1fQlJFQUtQT0lOVCwKKyAJTUlQUzE2X3tCSUcsTElUVExFfV9CUkVBS1BPSU5UKTogTW92ZSBtYWNyb3MgZnJvbSBoZXJlLgorCSogbWlwcy10ZGVwLmM6IFRvIGhlcmUuCisKKwkqIGNvbmZpZy9hcm0vdG0tYXJtLmggKHtCSUcsTElUVExFfV9CUkVBS1BPSU5UKTogRGVsZXRlIG1hY3Jvcy4KKyAJKHtBUk0sVEhVTUJ9X3tCRSxMRX1fQlJFQUtQT0lOVCk6IE1vdmUgbWFjcm9zIGZyb20gaGVyZS4KKwkqIGFybS10ZGVwLmM6IFRvIGhlcmUuCisJCisJKiByZW1vdGUtYXJyYXkuYyAobWVtb3J5X2JyZWFrcG9pbnRfc2l6ZSk6IERlbGV0ZSB2YXJpYWJsZS4KKwkoYXJyYXlfaW5zZXJ0X2JyZWFrcG9pbnQpOiBPYnRhaW4gYnJlYWtwb2ludCBzaXplIHVzaW5nCisgCUJSRUFLUE9JTlRfRlJPTV9QQy4KKwkqIHJlbW90ZS1zdC5jIChtZW1vcnlfYnJlYWtwb2ludF9zaXplLCBzdDIwMDBfaW5zZXJ0X2JyZWFrcG9pbnQpOgorIAlEaXR0by4KKwkqIHJlbW90ZS1vczlrLmMgKG1lbW9yeV9icmVha3BvaW50X3NpemUsCisgCXJvbWJ1Z19pbnNlcnRfYnJlYWtwb2ludCk6IERpdHRvLgorCSogcmVtb3RlLWU3MDAwLmMgKG1lbW9yeV9icmVha3BvaW50X3NpemUpOiBEaXR0by4KKworTW9uIE5vdiAyMyAxMTozODo0MCAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBzeW1maWxlLmMgKGRlZHVjZV9sYW5ndWFnZV9mcm9tX2ZpbGVuYW1lKTogcmV3cml0ZSBzbyBhcyB0byAKKwl3b3JrIGZyb20gYSB0YWJsZSBvZiBmaWxlbmFtZSBleHRlbnNpb25zLCBtb2RpZmlhYmxlIGJ5IHRoZSB1c2VyLgorCShmaWxlbmFtZV9sYW5ndWFnZV90YWJsZSk6IG5ldyBkYXRhIHN0cnVjdHVyZS4KKwkoc2V0X2V4dF9sYW5nX2NvbW1hbmQpOiBuZXcgZnVuY3Rpb24gZm9yIG5ldyBjb21tYW5kLCAic2V0CisJZXh0ZW5zaW9uLWxhbmd1YWdlIi4gIChpbmZvX2V4dGVuc2lvbl9sYW5ndWFnZV9jb21tYW5kKTogbmV3CisJZnVuY3Rpb24gZm9yIG5ldyBjb21tYW5kICJpbmZvIGV4dGVuc2lvbi1sYW5ndWFnZXMiLgorCShhZGRfZmlsZW5hbWVfbGFuZ3VhZ2UsIGluaXRfZmlsZW5hbWVfbGFuZ3VhZ2VfdGFibGUpOiBuZXcKKwlzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgdGhlIGFib3ZlLgorCSogbGFuZ3VhZ2UuYyAobGFuZ3VhZ2VfZW51bSk6IG5ldyBmdW5jdGlvbi4gIFN1cHBvcnQgZm9yIGFib3ZlLgorCitNb24gTm92IDIzIDEwOjQ3OjU0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY2hvb2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3NoL3RtLXNoLmgsIGNvbmZpZy9tbjEwMjAwL3RtLW1uMTAyMDAuaCwKKyAJY29uZmlnL20zMnIvdG0tbTMyci5oLCBjb25maWcvYXJtL3RtLWFybS5oLCBjb25maWcvaTk2MC90bS1pOTYwLmgsCisgCWNvbmZpZy9nb3VsZC90bS1ucDEuaCwgY29uZmlnL2QxMHYvdG0tZDEwdi5oLAorIAljb25maWcvdjg1MC90bS12ODUwLmgsIGNvbmZpZy9wYS90bS1ocHBhLmgsIGNvbmZpZy9hMjlrL3RtLWEyOWsuaCwKKyAJY29uZmlnL21uMTAzMDAvdG0tbW4xMDMwMC5oLCBjb25maWcvbWlwcy90bS1taXBzLmgKKyAJKFVTRV9TVFJVQ1RfQ09OVkVOVElPTik6IENsZWFudXAsIGRlZmluZSBtYWNybyBhcyBmdW5jdGlvbi4KKwkKKwkqIHNoLXRkZXAuYyAoc2hfdXNlX3N0cnVjdF9jb252ZW50aW9uKSwgbW4xMDIwMC10ZGVwLmMKKyAJKG1uMTAyMDBfdXNlX3N0cnVjdF9jb252ZW50aW9uKSwgaTk2MC10ZGVwLmMKKyAJKGk5NjBfdXNlX3N0cnVjdF9jb252ZW50aW9uKSwgZ291bGQtdGRlcC5jCisgCShnb3VsZF91c2Vfc3RydWN0X2NvbnZlbnRpb24pLCBkMTB2LXRkZXAuYworIAkoZDEwdl91c2Vfc3RydWN0X2NvbnZlbnRpb24pLCB2ODUwLXRkZXAuYworIAkodjg1MF91c2Vfc3RydWN0X2NvbnZlbnRpb24pLCBocHBhLXRkZXAuYworIAkoaHBoYV91c2Vfc3RydWN0X2NvbnZlbnRpb24pLCBtMzJyLXRkZXAuYworIAkobTMycl91c2Vfc3RydWN0X2NvbnZlbnRpb24pLCBhcm0tdGRlcC5jCisgCShhcm1fdXNlX3N0cnVjdF9jb252ZW50aW9uKSwgbW4xMDMwMC10ZGVwLmMKKyAJKG1uMTAzMDBfdXNlX3N0cnVjdF9jb252ZW50aW9uKSwgYTI5ay10ZGVwLmMKKyAJKGEyOWtfdXNlX3N0cnVjdF9jb252ZW50aW9uKSwgbWlwcy10ZGVwLmMKKyAJKG1pcHNfdXNlX3N0cnVjdF9jb252ZW50aW9uKTogTmV3IGZ1bmN0aW9ucworCisJKiB2YWx1ZS5oLCB2YWx1ZXMuYyAoZ2VuZXJpY191c2Vfc3RydWN0X2NvbnZlbnRpb24pOiBOZXcgZnVuY3Rpb24sCisgCXJlcGxhY2UgbWFjcm8uCisJKiB2YWx1ZXMuYyAoVVNFX1NUUlVDVF9DT05WRU5USU9OKTogTWFjcm8gZGVmYXVsdHMgdG8gZnVuY3Rpb24KKyAJZ2VuZXJpY191c2Vfc3RydWN0X2NvbnZlbnRpb24uCisKK1NhdCBOb3YgMjEgMTc6MTU6NDAgMTk5OCAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+CisKKwkqIGJyZWFrcG9pbnQuYyAoYnBzdGF0X3N0b3Bfc3RhdHVzKTogRG8gbm90IGluY3JlbWVudCBoaXRfY291bnQKKwlvZiBicmVha3BvaW50IGlmIGNvbmRpdGlvbiBpcyBub3QgdHJ1ZS4gCisKKwkqIGNvZmZyZWFkLmMgKGNvZmZfc3ltdGFiX3JlYWQpOiBEaXNjYXJkIENfTEFCRUwncyB0aGF0IGFyZSBub3QKKwlmdW5jdGlvbiBlbnRyeSBwb2ludHMsIHRvIGF2b2lkIGdldHRpbmcgdGhlbSBpbiB0aGUgc3RhY2sgZHVtcAorCWluc3RlYWQgb2YgdGhlIGFjdHVhbCBmdW5jdGlvbi4KKworCSogY29uZmlnL202OGsvZGVsdGE2OC5taCAoTkFUX0ZJTEUpOiBVbmRvIDE5OTgtMDgtMTggY2hhbmdlOworIAl3aXRob3V0IE5BVF9GSUxFIGRlZmluaXRpb24sIGNvbmZpZ3VyZSB3aWxsIGFzc3VtZSB0aGF0IEdEQiBjYW5ub3QKKyAJcnVuIG5hdGl2ZS4KKwkqIGNvbmZpZy9tNjhrL25tLWRlbHRhNjguaCAoS0VSTkVMX1VfU0laRSk6IE5ldyBtYWNyby4KKwkqIGRlbHRhNjgtbmF0LmMgKGtlcm5lbF91X3NpemUpOiBOZXcgZnVuY3Rpb24uCisKK0ZyaSBOb3YgMjAgMTA6MTM6MDMgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBidWlsZHN5bS5jIChlbmRfc3ltdGFiKTogQ2xlYW51cCBQUk9DRVNTX0xJTkVOVU1CRVJfSE9PSy4KKworVGh1IE5vdiAxOSAxNToyMTowNCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiByZGktc2hhcmUvaG9zdC5oOiBpZiBjb21waWxpbmcgdW5kZXIgQ3lnd2luLCBtYWtlIHN1cmUgbmV3CisJcHJlcHJvY2Vzc29yIGRlZmluZSBpcyBkZWZpbmVkLiAgRGVmaW5lIGl0IGlmIG5vdC4KKwkqIHJkaS1zaGFyZS9ob3N0Y2hhbi5oOiBkaXR0bworCSogcmRpLXNoYXJlL2FjbG9jYWwubTQ6IHJlZ2VuZXJhdGUKKwkqIHJkaS1zaGFyZS9jb25maWd1cmU6IHJlZ2VuZXJhdGUKKworVGh1IE5vdiAxOSAxNDo0Mzo0NCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IHN3aXRjaCBiYWNrIHRvIGNoZWNraW5nIF9fQ1lHV0lOMzJfXworCSogY29uZmlndXJlOiByZWdlbmVyYXRlCisKK1RodSBOb3YgMTkgMDk6NTM6MDAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBleGVjLmMgKGV4ZWNfZmlsZV9jb21tYW5kKTogQ2xlYW51cC4gUmVwbGFjZSAjaWYKKyAJTkVFRF9URVhUX1NUQVJUX0VORCB3aXRoIGlmKCkuCisJKiBjb25maWcvcGEvbm0taHBwYWguaCAoTkVFRF9URVhUX1NUQVJUX0VORCk6IFJlZGVmaW5lIHRvIGJlIDEuCisJKiBjb25maWcvY29udmV4L3RtLWNvbnZleC5oIChORUVEX1RFWFRfU1RBUlRfRU5EKTogRGl0dG8uCisJKiBjb25maWcvZ291bGQvdG0tbnAxLmggKE5FRURfVEVYVF9TVEFSVF9FTkQpOiBEaXR0by4KKwkqIGNvbmZpZy9hMjlrL3RtLWEyOWsuaCAoTkVFRF9URVhUX1NUQVJUX0VORCk6IERpdHRvLgorCitUaHUgTm92IDE5IDEzOjA2OjIyIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIG1haW4uYzogV2FpdCB1bnRpbCBtb3JlIHRpbWUgaGFzIHBhc3NlZCBiZWZvcmUgY2FsbGluZworCW5ldyBjeWd3aW5fIGZ1bmNzLCByZXZlcnQgYmFjayB0byB0aGUgY3lnd2luMzJfIG9uZXMgZm9yIG5vdy4KKwkqIHdpbjMyLW5hdC5jOiBEaXR0by4KKworV2VkIE5vdiAxOCAxNTowMzoxNyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGNob29rLmN5Z251cy5jb20+CisKKwkqIDI5ay1zaGFyZS91ZGkvdWRpcDJzb2MuYyAoVURJQ29ubmVjdCk6IFJlcGxhY2Ugc3lzX2Vycmxpc3Qgd2l0aAorIAlzdHJlcnJvci4KKworTW9uIE5vdiAxNiAxNDoxNzowNSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBkZWZzLmg6IGlmIGNvbXBpbGluZyB1bmRlciBDeWd3aW4sIGRlZmluZSBfX0NZR1dJTl9fIGlmCisJX19DWUdXSU4zMl9fIGlzIGRlZmluZWQgYW5kIF9fQ1lHV0lOX18gaXNuJ3QgZm9yIGJhY2t3YXJkcworCWNvbXBhdGliaWxpdHkuCisKK0ZyaSBOb3YgMTMgMDA6MTU6MDggMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCUNoYW5nZXMgdG8gYWNjb3VudCBmb3IgbmFtZSBjaGFuZ2UgZnJvbSBjeWd3aW4zMiB0byBjeWd3aW4gYW5kCisJY2xlYW4gdXAgV2luMzItcmVsYXRlZCBpZmRlZnMuCisJCisJKiBjb25maWd1cmUudGd0OiBjaGVjayBmb3IgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyLgorCU5ldyBjeWd3aW4gZ2RiX3RhcmdldCB2YXJpYWJsZSBsb3NlcyB0aGUgIjMyIi4KKwkqIGNvbmZpZ3VyZS5ob3N0OiBjaGVjayBmb3IgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyLgorCU5ldyBjeWd3aW4gZ2RiX2hvc3QgdmFyaWFibGUgbG9zZXMgdGhlICIzMiIuCisJKiBjb25maWd1cmUuaW46IHRlc3QgX19DWUdXSU5fXyBpbnN0ZWFkIG9mIF9fQ1lHV0lOMzJfXywKKwlyZW5hbWUgZ2RiX2N2X29zX2N5Z3dpbjMyIHZhcmlhYmxlIHRvIGRyb3AgdGhlICIzMiIuICBDYWxsCisJQU1fRVhFRVhUIGluc3RlYWQgb2YgQUNfRVhFRVhUIHNpbmNlIHRoYXQgaXNuJ3QgaW4gYSByZWxlYXNlZAorCWF1dG9jb25mIHlldC4KKwkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZS4KKworCSogbWFpbi5jOiBkcm9wICIzMiIgZnJvbSBjeWd3aW5fIGZ1bmNzLCBpbmNsdWRlIHN5cy9jeWd3aW4uaCB3aGVyZQorCWN5Z3dpbiBwYXRoIGNvbnYgcHJvdG9zIGxpdmUsIGluc3RlYWQgb2YgYWRkaW5nIGEgcHJvdG8gaGVyZSBmb3IKKwl0aGVtIGhlcmUuCisgICAgICAgICoge21haW4uYywgc2VyLXRjcC5jLCBzZXItdW5peC5jLCB0b3AuY306IGNoZWNrIF9fQ1lHV0lOX18KKwlpbnN0ZWFkIG9mIF9fQ1lHV0lOMzJfXy4KKwkqIHNvdXJjZS5jOiB0aG91Z2hvdXQsIGNoZWNrIF9XSU4zMiBpbnN0ZWFkIG9mIFdJTjMyLgorCQorCSogY29uZmlnL2kzODYvY3lnd2luMzIubWg6IGRlbGV0ZS4KKwkqIGNvbmZpZy9pMzg2L2N5Z3dpbi5taDogbmV3IGZpbGUsIHdhcyBjeWd3aW4zMi5taC4KKwkqIGNvbmZpZy9pMzg2L2N5Z3dpbjMyLm10OiBkZWxldGUuCisJKiBjb25maWcvaTM4Ni9jeWd3aW4ubXQ6IG5ldyBmaWxlLCB3YXMgY3lnd2luMzIubXQuCisJKiBjb25maWcvaTM4Ni90bS1jeWd3aW4zMi5oOiBkZWxldGUuCisJKiBjb25maWcvaTM4Ni90bS1jeWd3aW4uaDogbmV3IGZpbGUsIHdhcyB0bS1jeWd3aW4zMi5oLgorCSogY29uZmlnL2kzODYveG0tY3lnd2luMzIuaDogZGVsZXRlLgorCSogY29uZmlnL2kzODYveG0tY3lnd2luLmg6IG5ldyBmaWxlLCB3YXMgeG0tY3lnd2luMzIuaC4KKwkqIGNvbmZpZy9pMzg2L3htLXdpbmRvd3MuaDogI2luY2x1ZGUgeG0tY3lnd2luLmggbm93LgorCSogY29uZmlnL3Bvd2VycGMvY3lnd2luMzIubWg6IGRlbGV0ZS4KKwkqIGNvbmZpZy9wb3dlcnBjL2N5Z3dpbi5taDogbmV3IGZpbGUsIHdhcyBjeWd3aW4zMi5taC4KKwkqIGNvbmZpZy9wb3dlcnBjL2N5Z3dpbjMyLm10OiBkZWxldGUuCisJKiBjb25maWcvcG93ZXJwYy9jeWd3aW4ubXQ6IG5ldyBmaWxlLCB3YXMgY3lnd2luMzIubXQuCisJKiBjb25maWcvcG93ZXJwYy90bS1jeWd3aW4zMi5oOiBkZWxldGUuCisJKiBjb25maWcvcG93ZXJwYy90bS1jeWd3aW4uaDogbmV3IGZpbGUsIHdhcyB0bS1jeWd3aW4zMi5oLgorCSogY29uZmlnL3Bvd2VycGMveG0tY3lnd2luMzIuaDogZGVsZXRlLgorCSogY29uZmlnL3Bvd2VycGMveG0tY3lnd2luLmg6IG5ldyBmaWxlLCB3YXMgeG0tY3lnd2luMzIuaC4KKworCSogcmRpLXNoYXJlL2FjbG9jYWwubTQ6IHJlZ2VuZXJhdGUgd2l0aCBhY2xvY2FsLgorCSogcmRpLXNoYXJlL2NvbmZpZ3VyZTogcmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mLgorCSogcmRpLXNoYXJlL3tob3N0LmgsIGhvc3RjaGFuLmMsIGhvc3RjaGFuLmgsIHNlcmRydi5jLCBzZXJwYXJkci5jLAorCXVuaXhjb21tLmN9OiBjaGVjayBfX0NZR1dJTl9fIGluc3RlYWQgb2YgX19DWUdXSU4zMl9fLgorCitUaHUgTm92IDEyIDE3OjE5OjQzIDE5OTggIEpvaG4gTWV0emxlciAgPGptZXR6bGVyQGN5Z251cy5jb20+CisKKyAgICAgICAgKiByZW1vdGUuYyAocmVtb3RlX2dldF90aHJlYWRpbmZvKTogU3VwcG9ydCBmb3IgcmVtb3RlCisgICAgICAgIG11bHRpdGhyZWFkIGRlYnVnZ2luZy4KKyAgICAgICAgKHJlbW90ZV9nZXRfdGhyZWFkbGlzdCk6IGdldCBhIHBhcnRpYWwgbGlzdCBvZiB0aHJlYWRzCisgICAgICAgIChyZW1vdGVfdGhyZWFkbGlzdF9pdGVyYXRvcik6IFN0ZXAgdGhyb3VnaCBhbGwgdGhlIHRocmVhZHMKKyAgICAgICAgKGluaXRfcmVtb3RlX3RocmVhZHRlc3RzKTogT3B0aW9uYWwgYnVpbHRpbiB1bml0IHRlc3QgY29tbWFuZHMuCisKKyAgICAgICAgKiB0aHJlYWQuYyAoYmluZF90YXJnZXRfdGhyZWFkX3ZlY3Rvcik6IEltcGxlbWVudGEgYSBtb3JlIGR5bmFtaWMKKyAgICAgICAgd2F5IG9mIGFjY2Vzc2luZyB0YXJnZXQgc3BlY2lmaWMgdGhyZWFkIGluZm8gZnVuY3Rpb25zIHRoYW4gCisgICAgICAgIEZJTkRfTkVXX1RIUkVBRFMuCisgICAgICAgICh0YXJnZXRfdGhyZWFkX2luZm8pOiBGdW5jdGlvbiB0byBnZXQgZXh0ZW5kZWQgdGhyZWFkIGluZm9ybWF0aW9uLgorCisgICAgICAgICogZ2RidGhyZWFkLmg6IEV4cG9ydCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgY29ycmVzcG9uZGluZyB0bworICAgICAgICBleHRlcm5hbCBkZXRhaWxlZCB0aHJlYWQgaW5mbyByZXNwb25zZS4gVGhpcyBpcyBtb3JlIGxpa2UgYSAncHMnCisgICAgICAgIGNvbW1hbmQgdGhhbiB3aGF0IG1pZ2h0IGJlIGV4cGVjdGVkIG9mIGhvc3QgYmFzZWQgdGhyZWFkcy4gVGhpcworICAgICAgICBpcyBmb3IgZW1iZWRkZWQgc3lzdGVtcy4KKworV2VkIE5vdiAxMSAxNTo0NzowMCAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBwcm9jZnMuYyAocHJvY19zZXRfZXhlY190cmFwKTogZG9uJ3Qgc2V0IFBSX0FTWU5DIG9yIFBSX0ZPUksKKyAgICAgICAgaW4gdGhlIGNoaWxkIHByb2Nlc3MgZm9yIFVuaXhXYXJlIChjYXVzZXMgcHJvY2Vzc2VzIGZvcmtlZCBieSAKKyAgICAgICAgdGhlIGRlYnVnZ2VlIHRvIGhhbmcpLgorCitNb24gTm92ICA5IDEyOjAwOjM2IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2ZyMzAvZnIzMC5tdDogTmV3IGZpbGUuCisJKiBjb25maWcvZnIzMC90bS1mcjMwLmg6IE5ldyBmaWxlLgorCisxOTk4LTExLTA1ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+CisKKwkqIHJlbW90ZS12eC5jIChuZXRfcmVhZF9yZWdpc3RlcnMsIG5ldF93cml0ZV9yZWdpc3RlcnMsIAorCXZ4X3h2ZXJfbWVtb3J5LCB2eF9yZXN1bWUsIHZ4X2F0dGFjaCwgdnhfZGV0YWNoLCB2eF9raWxsKTogCisJQ2hhbmdlIGVycm5vIHRvIGVycm5vX251bS4KKwkqIHZ4LXNoYXJlL3hkcl9wdHJhY2UuYyAoeGRyX3B0cmFjZV9yZXR1cm4pOiBMaWtld2lzZS4KKwkqIHZ4LXNoYXJlL3hkcl9wdHJhY2UuaCAoc3RydWN0IHB0cmFjZV9yZXR1cm4pOiBMaWtld2lzZS4KKworVGh1IE5vdiAgNSAwODo0MTozMyAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgorCisJKiB0b3AuYyAoZ2RiX3JlYWRsaW5lKTogQWxsb3cgQ1JMRiBsaW5lIHRlcm1pbmF0aW9uIG9uIHN5c3RlbXMKKwl3aGljaCBkZWZpbmUgQ1JMRl9TT1VSQ0VfRklMRVMuCisJKiB3aW4zMi1uYXQuYzogMSkgQWRkIHRocmVhZCBzdXBwb3J0LCAyKSBmaXggYWJpbGl0eSB0byBhdHRhY2ggdG8KKwlhIHJ1bm5pbmcgcHJvY2VzcywgYW5kIDMpIGltcGxlbWVudCBsaW1pdGVkIHN1cHBvcnQgZm9yIGN5Z3dpbgorCXNpZ25hbHMuCisJKHRocmVhZF9yZWMpOiBOZXcgZnVuY3Rpb24uCisJKGNoaWxkX2FkZF90aHJlYWQpOiBEaXR0by4KKwkoY2hpbGRfaW5pdF90aHJlYWRfbGlzdCk6IERpdHRvLgorCShjaGlsZF9kZWxldGVfdGhyZWFkKTogRGl0dG8uCisJKGRvX2NoaWxkX2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyk6IERpdHRvLgorCShkb19jaGlsZF9zdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMpOiBEaXR0by4KKwkoaGFuZGxlX291dHB1dF9kZWJ1Z19zdHJpbmcpOiBEaXR0by4KKwkoY2hpbGRfZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzKTogVXNlIGRvXyogZnVuY3Rpb24gdG8gcGVyZm9ybQorCW9wZXJhdGlvbi4KKwkoY2hpbGRfc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKTogRGl0dG8uCisJKGNoaWxkX2NvbnRpbnVlKTogRGl0dG8uCisJKGNoaWxkX3RocmVhZF9hbGl2ZSk6IERpdHRvLgorCShjeWd3aW5fcGlkX3RvX3N0cik6IERpdHRvLgorCShoYW5kbGVfbG9hZF9kbGwpOiBSZW9yZ2FuaXplLCBhZGQgZmlyc3QgYXR0ZW1wdCBhdCByZWFkaW5nCisJZGxsIG5hbWVzIGZyb20gYXR0YWNoZWQgcHJvY2Vzc2VzLiAgQ2hhbmdlIGluZm8gbWVzc2FnZXMgdG8gcHJvdmlkZQorCW1vcmUgaW5mb3JtYXRpb24gd2hlbiBkbGwgaXMgYWxyZWFkeSBsb2FkZWQuCisJKGhhbmRsZV9leGNlcHRpb24pOiBDaGFuZ2VzIG1hbmRhdGVkIGJ5IG5ldyB0aHJlYWQtYXdhcmUgc3RydWN0dXJlcy4KKwkoY2hpbGRfd2FpdCk6IFRyYWNrIHRocmVhZCBjcmVhdGlvbi9kZXN0cnVjdGlvbi4gIEhhbmRsZSBjeWd3aW4KKwlzaWduYWxzLgorCShjaGlsZF9jcmVhdGVfaW5mZXJpb3IpOiBEaXR0by4KKwkoY2hpbGRfcmVzdW1lKTogRGl0dG8uCisJKGNoaWxkX2tpbGxfaW5mZXJpb3IpOiBEaXR0by4gIENsb3NlIGNoaWxkIHByb2Nlc3MgaGFuZGxlIHRvIGF2b2lkIGEKKwloYW5kbGUgbGVhay4KKwkoY2hpbGRfb3BzKTogRmlsbCBvdXQgY2hpbGRfb3BzIGZpZWxkcyB0aGF0IGRlYWwgd2l0aCB0aHJlYWRzLgorCSogY29uZmlnL2kzODYvdG0tY3lnd2luMzIuaDogRGVjbGFyZSBmdW5jdGlvbiBhbmQgbWFjcm8gbmVlZGVkCisJZm9yIGNvbnZlcnRpbmcgYSBjeWd3aW4gInBpZCIgdG8gYSBzdHJpbmcuCisJKiBjb25maWcvaTM4Ni94bS1jeWd3aW4zMi5oOiBkZWZpbmUgSEFWRV9TSUdTRVRNQVNLIGFzIDAgc2luY2UKKwlzaWdzZXRtYXNrIGlzIG5vdCBkZWZpbmVkIGluIGN5Z3dpbi4KKworVGh1IE5vdiAgNSAwODozODoxOCAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgorCisJKiB3aW4zMi1uYXQuYzogUmVtb3ZlIG9ic29sZXRlIFBQQyBjb25kaXRpb25hbHMuCisKK1dlZCBOb3YgIDQgMTg6NDQ6MzEgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUudGd0OiBBZGQgZnIzMC0qLWVsZiouCisKKzE5OTgtMTEtMDMgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KKworCSogYy1leHAueSAocGFyc2VfbnVtYmVyKTogQ2hlY2sgVEFSR0VUX0xPTkdfTE9OR19CSVQgd2hlbiBzZXR0aW5nCisJaGlnaF9iaXQgdG8gYXZvaWQgdW5kZWZpbmVkIG5lZ2F0aXZlIHNoaWZ0LgorCitNb24gTm92ICAyIDE1OjI2OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBjb25maWd1cmUuaW46IENoZWNrIGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMiouCisJKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKKworVGh1IE9jdCAyOSAxMDowNDoyMCAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJW1N1cHBvcnQgZm9yIHRyYWNlIGRlYnVnZ2luZzogcmVnaXN0ZXJzIHRoYXQgd2VyZSBub3QgY29sbGVjdGVkLl0KKwkqIHJlbW90ZS5jIChyZW1vdGVfZmV0Y2hfcmVnaXN0ZXJzKTogYWNjZXB0ICd4eHh4JyBpbiB0aGUgcmVnaXN0ZXIKKwlwYWNrZXQsIHdpdGggdGhlIG1lYW5pbmcgInJlZ2lzdGVyIHZhbHVlIGlzIG5vdCBhdmFpbGFibGUiLgorCVNldCByZWdpc3Rlcl92YWxpZCB0byAtMSwgd2hpY2ggd2lsbCBjb25ub3RlICJubyB2YWx1ZSBhdmFpbGFibGUiLgorCSogZmluZHZhci5jIChyZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyk6IHJldHVybiBmYWlsdXJlIGlmCisJcmVnaXN0ZXJfdmFsaWQgPT0gLTEuICAodmFsdWVfb2ZfcmVnaXN0ZXIpOiByZXR1cm4gZmFpbHVyZSBpZiAKKwlyZWdpc3Rlcl92YWxpZCA9PSAtMS4gIChyZWFkX3Zhcl92YWx1ZSk6IHJldHVybiBlcnJvciBpZiAKKwl2YWx1ZV9vZl9yZWdpc3RlciBmYWlscyBmb3IgYSByZWdpc3RlciB2YXJpYWJsZS4KKwkodmFsdWVfZnJvbV9yZWdpc3Rlcik6IHJldHVybiBmYWlsdXJlIGlmIHJlZ2lzdGVyX3ZhbGlkID09IC0xLgorCSogZXZhbC5jIChldmFsdWF0ZV9zdWJleHBfc3RhbmRhcmQpOiByZXR1cm4gZXJyb3IgaWYgCisJdmFsdWVfb2ZfcmVnaXN0ZXIgZmFpbHMgZm9yIGEgcmVnaXN0ZXIgdXNlZCBpbiBhbiBleHByZXNzaW9uLgorCSogaW5mY21kLmMgKGRvX3JlZ2lzdGVyc19pbmZvKTogZGlzcGxheSAidmFsdWUgbm90IGF2YWlsYWJsZSIKKwlmb3IgcmVnaXN0ZXJzIGZvciB3aGljaCByZWdpc3Rlcl92YWxpZCA9PSAtMS4KKworCSogdHJhY2Vwb2ludC5jIChzZXRfcmF3X3RyYWNlcG9pbnQpOiBqdXN0IHNhdmUgdGhlIGZpbGVuYW1lIGFzIGlzCisJZnJvbSB0aGUgc3ltYm9sIHRhYmxlLCByYXRoZXIgdGhhbiB0cnlpbmcgdG8gcHJlcGVuZCB0aGUgZGlyIG5hbWUuCisJQWxzbyBzYXZlIHRoZSBiZmQgc2VjdGlvbi4gICh0cmFjZXBvaW50c19pbmZvKTogdXNlIHRoZSBzZWN0aW9uCisJd2hlbiBsb29raW5nIHVwIHRoZSBmdW5jdGlvbiBuYW1lLgorCSogdHJhY2Vwb2ludC5oOiBhZGQgc2VjdGlvbiBmaWVsZCB0byB0cmFjZXBvaW50IHN0cnVjdC4KKworV2VkIE9jdCAyOCAwODowMTozOCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIHNwYXJjbC10ZGVwLmMgKHNlbmRfcmVzcCwgc3BhcmNsaXRlX3NlcmlhbF9zdGFydCwKKwlzcGFyY2xpdGVfc2VyaWFsX3dyaXRlKTogVXNlIHJlbW90ZV90aW1lb3V0IGluc3RlYWQgb2YgaGFyZGNvZGVkCisJdHdvIHNlY29uZCB0aW1lb3V0LgorCShkb3dubG9hZCk6IEZpeCBhZGp1c3RtZW50IG9mIGEub3V0IGxvYWQgYWRkcmVzc2VzLgorCitXZWQgT2N0IDI4IDEyOjMyOjU4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1idWlsZC13YXJuaW5ncyk6IEZpbmlzaCByZW5hbWUgZnJvbQorIAktLWVuYWJsZS13YXJuaW5ncy4KKwkoZW5hYmxlLWJ1aWxkLXdhcm5pbmdzKTogQWRkIC1XcG9pbnRlci1hcnRoLCBhbGxvdyA9KiBmb3IKKyAJc2ltL2NvbW1vbiBjb21wYXRpYmlsaXR5LgorCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKworV2VkIE9jdCAyMSAwODo0NDozMCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIDI5ay1zaGFyZS91ZGkvdWRpcDJzb2MuYzogUmVwbGFjZSBzeXNfZXJybGlzdCB3aXRoIHN0cmVycm9yKCkuCisKK1RodSBPY3QgMjIgMDk6NTY6NTUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWcvcnM2MDAwL2FpeDQubWggKE5BVERFUEZJTEVTKTogTW92ZSB4Y29mZnJlYWQubyBmcm9tIGhlcmUuCisJKiBjb25maWcvcnM2MDAwL2FpeDQubXQgKFRERVBGSUxFUyk6IFRvIGhlcmUuCisKK1dlZCBPY3QgMjEgMTA6MDI6MzEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiByZGktc2hhcmUvdW5peGNvbW0uYzogUHJvdmlkZSBkZWZpbml0aW9ucyBvZiBTRVJQT1JUIGFuZCBQQVJQT1JUCisgCW9uIEJTRCBob3N0cy4KKworMTk5OC0xMC0xOSAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKEFNX0VYRUVYVCk6IFVzZSBBQ19FWEVFWFQgaW5zdGVhZC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK1NhdCBPY3QgMTcgMTc6Mzk6MjMgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgorCisJKiBjb3JlLXNvbDIuYzogI2luY2x1ZGUgPHN5cy90eXBlcy5oPiwgZm9yIHNvbDIuNyB3ZWlyZG5lc3MuCisKK0ZyaSBPY3QgMTYgMTU6MzE6MzggMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogbTMyci10ZGVwLmMgKGRlY29kZV9wcm9sb2d1ZSk6IFJldHVybiBmYWlsdXJlIGlmIHdlIHJlYWNoIAorCXRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIHdpdGhvdXQgZmluZGluZyB0aGUgZW5kIG9mIHRoZSBwcm9sb2d1ZS4KKworMTk5OC0xMC0xNiAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBjb21tYW5kLmMgY29weWluZy5jIGNvcHlpbmcuYXdrIGNvcmUtYW91dC5jIGNvcmUtcmVnc2V0LmMKKwkgIGNvcmVsb3cuYyBkY2FjaGUuYyBpMzg2LXRkZXAuYyBpMzg2djQtbmF0LmMgaTM4Ny10ZGVwLmMKKwkgIGluZmNtZC5jIGluZnB0cmFjZS5jIGluZnJ1bi5jIHJlbW90ZS5jIHNvbGliLmMgc3ltZmlsZS5jCisJICBzeW1taXNjLmMgdmFsYXJpdGguYzogQWRkIHByb3RvdHlwZXMuCisKKwkqIGRlZnMuaDogQWRkIHByb3RvdHlwZSBmb3IgdXRpbHMuYzo6ZG9fcnVuX2NsZWFudXBzLgorCisJKiBnZGJ0eXBlcy5jOiBBZGQgcHJvdG90eXBlcy4KKwkobWFrZV9wb2ludGVyX3R5cGUpOiBBZGQgYnJhY2VzIHRvIHJlbW92ZSBuZXN0ZWQgaWYtZWxzZSBhbWJpZ3VpdHkuCisJKG1ha2VfcmVmZXJlbmNlX3R5cGUpOiBEaXR0by4KKworCSogcHJpbnRjbWQuYyAocHJpbnRmX2NvbW1hbmQpOiBJbml0aWFsaXplICdmJyBhbmQgJ3N0cmluZycgYXQgCisJZnVuY3Rpb24gc3RhcnR1cCB0byBzdXBwcmVzcyBwb3NzaWJseS11c2VkLWJlZm9yZS1pbml0aWFsaXplZCB3YXJuaW5nLgorCisJKiByZW1vdGUtdXRpbHMuYzogQWRkIHByb3RvdHlwZXMuCisJKHNyX3BvbGxjaGFyKTogQWRkIGJyYWNlcyB0byByZW1vdmUgbmVzdGVkIGlmLWVsc2UgYW1iaWd1aXR5LgorCisJKiBzZXItdGNwLmM6IEFkZCBwcm90b3R5cGVzLgorCSh3YWl0X2Zvcik6IEFkZCBicmFjZXMgdG8gcmVtb3ZlIG5lc3RlZCBpZi1lbHNlIGFtYmlndWl0eS4KKwkodGNwX3JlYWRjaGFyKTogRGl0dG8uCisKKwkqIHNlci11bml4LmM6IEFkZCBwcm90b3R5cGVzLgorCShnZXRfdHR5X3N0YXRlKTogRG9uJ3QgZGVmaW5lIGVycm5vIGhlcmUuCisJKGhhcmR3aXJlX3JlYWRjaGFyKTogT25seSBkZWZpbmUgJ3QnIGlmIHdlIGFyZSBjb21waWxpbmcgaW4gYSBDeWd3aW4KKwllbnZpcm9ubWVudC4KKworCSogc3ltdGFiLmM6IEFkZCBwcm90b3R5cGVzLgorCShmaW5kX21ldGhvZHMpOiBBZGQgYnJhY2VzIHRvIHJlbW92ZSBuZXN0ZWQgaWYtZWxzZSBhbWJpZ3VpdHkuCisJKHNlYXJjaF9zeW1ib2xzKTogU2V0ICdpJyB0byBhbiBpbml0aWFsIHZhbHVlIHRvIHN1cHByZXNzIGEKKwlwb3NzaWJseS11c2VkLWJlZm9yZS1pbml0aWFsaXplZCB3YXJuaW5nLgorCisJKiB2YWxvcHMuYzogQWRkIHByb3RvdHlwZXMuCisJKHZhbHVlX2Nhc3QpOiBTZXQgJ2VsdHlwZTInIHRvIGFuIGluaXRpYWwgdmFsdWUgdG8gc3VwcHJlc3MgYQorCXBvc3NpYmx5LXVzZWQtYmVmb3JlLWluaXRpYWxpemVkIHdhcm5pbmcuCisJKHZhbHVlX29mX3ZhcmlhYmxlKTogQWRkIGJyYWNlcyB0byByZW1vdmUgbmVzdGVkIGlmLWVsc2UgYW1iaWd1aXR5LgorCSh2YWx1ZV9vZl90aGlzKTogRGl0dG8uCisKKwkqIHZhbHByaW50LmM6IEFkZCBwcm90b3R5cGVzLgorCShwcmludF9mbG9hdGluZyk6IEFkZCBicmFjZXMgdG8gcmVtb3ZlIG5lc3RlZCBpZi1lbHNlIGFtYmlndWl0eS4KKworVGh1IE9jdCAxNSAxOTo1MDo0OCAxOTk4ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHRtLXNwNjQuaCAoU0VUVVBfQVJCSVRSQVJZX0ZSQU1FLCBGUkFNRV9TUEVDSUZJQ0FUSU9OX0RZQURJQyk6CisJUmVtb3ZlLCBuZXZlcm1vcmUgdXNlZC4KKworVGh1IE9jdCAxNSAxNjo1NTowMCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbW1hbmQuYzogSW5jbHVkZSAid2FpdC5oIiBhZnRlciwgcmF0aGVyIHRoYW4gYmVmb3JlLCA8d2FpdC5oPi4KKyAgCSJ3YWl0LmgiIHdhcyBkZWZpbmluZyBhbGwgV0lGKiBtYWNybydzIGluc3RlYWQgb2YgZmlsbGluZyBpbiB0aG9zZQorIAl0aGF0IDx3YWl0Lmg+IG1pc3NlZC4KKworMTk5OC0xMC0xNCAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBkZWZzLmg6IE1vdmUgX2luaXRpYWxpemVfcHJpbnRjbWQsIF9pbml0aWFsaXplX3N0YWNrLAorIAlfaW5pdGlhbGl6ZV9ibG9ja2ZyYW1lIG91dCBvZiBoZXJlIGFuZCBpbiB0byB0aGVpciByZXNwZWN0aXZlIC5jCisgCWZpbGVzLgorCSogYmxvY2tmcmFtZS5jOiBNb3ZlIF9pbml0aWFsaXplX2Jsb2NrZnJhbWUgcHJvdG90eXBlIHRvIGhlcmUuCisJKiBwcmludGNtZC5jOiBNb3ZlIF9pbml0aWFsaXplX3ByaW50Y21kIHByb3RvdHlwZSB0byBoZXJlLgorCSogc3RhY2suYzogTW92ZSBfaW5pdGlhbGl6ZV9zdGFjayBwcm90b3R5cGUgdG8gaGVyZS4KKworCSogc291cmNlLmMsIHN5bXRhYi5oOiBNb3ZlIF9pbml0aWFsaXplX3NvdXJjZSBwcm90b3R5cGUgdG8gdGhlIC5jCisJZmlsZS4KKwkqIHZhbHVlcy5jLCB2YWx1ZS5oOiBNb3ZlIF9pbml0aWFsaXplX3ZhbHVlcyBwcm90b3R5cGUgdG8gdGhlIC5jIGZpbGUuCisJKiBnZGJ0aHJlYWQuaCwgdGhyZWFkLmM6IE1vdmUgX2luaXRpYWxpemVfdGhyZWFkIHByb3RvdHlwZSB0byB0aGUgLmMgCisJZmlsZS4KKwkqIGJyZWFrcG9pbnQuYywgYnJlYWtwb2ludC5oOiBNb3ZlIF9pbml0aWFsaXplX2JyZWFrcG9pbnQgcHJvdG90eXBlIAorICAgICAgICB0byB0aGUgLmMgZmlsZS4KKworCSogYWJ1Zy1yb20uYyBhbHBoYS1uYXQuYyBhbHBoYS10ZGVwLmMgYW5ub3RhdGUuYyBheC1nZGIuYyBiY2FjaGUuYzoKKwlTdGFuZGFyZGl6ZSBjb21tZW50cyBmb3IgdGhlIHByb3RvdHlwZSBzZWN0aW9uIG9mIHRoZXNlIGZpbGVzLgorCisJKiBjb25maWd1cmUuaW46IExvb2sgaW4gbGliYyBmb3Igd2N0eXBlIGJlZm9yZSBsb29raW5nIGZvciBpdCBpbiBsaWJjLgorCitUdWUgT2N0IDEzIDE4OjU2OjUxIDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KKworCSogc29sLXRocmVhZC5jIChwc19wc3RvcCwgZXRjKTogc2ltcGxlIHRlc3QgZm9yIHByb2Nfc2VydmljZS5oCisgCXZlcnNpb24gZGlkbid0IHdvcmsgZm9yIHNvbDIuNjsgcHVzaGVkIGl0IHRvIGF1dG9jb25mLgorCSogY29uZmlndXJlLmluIChnZGJfY3ZfcHJvY19zZXJ2aWNlX2lzX29sZCk6IG5ldyB0ZXN0LgorCSogYWNjb25maWcuaCAoUFJPQ19TRVJWSUNFX0lTX09MRCk6IG5ldyBkZWZpbmUuCisJKiBjb25maWd1cmUsIGNvbmZpZy5pbjogcmVnZW5lcmF0ZS4KKworMTk5OC0xMC0xMyAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBibG9ja2ZyYW1lLmMgKGZpbmRfcGNfc2VjdF9wYXJ0aWFsX2Z1bmN0aW9uKTogQWRkIGJyYWNlcyB0byBhdm9pZAorCXBvc3NpYmxlIG5lc3RlZC1pZiBjb25mdXNpb24uCisJKiBicmVha3BvaW50LmMgKGJyZWFrcG9pbnRfaGVyZV9wKTogRGl0dG8uCisJKGJyZWFrcG9pbnRfaW5zZXJ0ZWRfaGVyZV9wKTogRGl0dG8uCisJKGJyZWFrcG9pbnRfdGhyZWFkX21hdGNoKTogRGl0dG8uCisKKwkqIGdudS1yZWdleC5jOiBEZWZpbmUgX1JFR0VYX1JFX0NPTVAgb25seSBpZiBpdCBpc24ndCBhbHJlYWR5IGRlZmluZWQuCisJKiBnbnUtcmVnZXguaDogRGVmaW5lIF9SRUdFWF9SRV9DT01QIHRvIHBpY2sgdXAgb2xkIGNvbXBhdGFiaWxpdHkgCisJcHJvdG90eXBlcy4KKworCSogc3ltdGFiLmg6IEFkZCBwcm90b3R5cGUgZm9yIF9pbml0aWFsaXplX3NvdXJjZS4KKwkqIHZhbHVlLmg6IEFkZCBwcm90b3R5cGUgZm9yIF9pbml0aWFsaXplX3ZhbHVlLgorCisJKiBkZWZzLmg6IEluY2x1ZGUgc3lzL3R5cGVzLmggb3Igc3RkZGVmLmggdG8gZ2V0IHNpemVfdC4KKwkobWFrZV9jbGVhbnVwKTogQWRkIG1ha2VfY2xlYW51cF9mdW5jIHR5cGVkZWYgYW5kIHN3aXRjaCB0byB1c2luZyAKKyAgICAgICAgYSBwcm90b3R5cGUgZm9yIHRoaXMgZnVuY3Rpb24uCisJKG1mcmVlKTogQWRkIHByb3RvdHlwZXMgZm9yIG1tYWxsb2MsIG1yZWFsbG9jLCBtZnJlZSBpZiB3ZSBhcmVuJ3QKKwl1c2luZyBtbWFsbG9jLgorCisJKiBheC1nZGIuYyBicmVha3BvaW50LmMgY29mZnJlYWQuYyBjb3JlbG93LmMgZGJ4cmVhZC5jCisgCWR3YXJmMnJlYWQuYyBkd2FyZnJlYWQuYyBlbGZyZWFkLmMgZXZhbC5jIGV4ZWMuYyBpbmZjbWQuYyBpbmZydW4uYworIAltaXBzcmVhZC5jIG5sbXJlYWQuYyBvczlrcmVhZC5jIHBhcnNlLmMgcHJpbnRjbWQuYyBzeW1maWxlLmMKKyAJc3ltbWlzYy5jIHN5bXRhYi5jIHRocmVhZC5jIHRvcC5jIHRyYWNlcG9pbnQuYyB0eXBlcHJpbnQuYworIAl2YWxvcHMuYzogQ2FzdCBwYXJhbWV0ZXJzIHBhc3NlZCB0byBtYWtlX2NsZWFudXAgdG8gdXNlIHRoZSBuZXcKKyAJbWFrZV9jbGVhbnVwX2Z1bmMgdHlwZWRlZi4KKworVHVlIE9jdCAxMyAwMDo1MTo0OCAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIHNvbC10aHJlYWQuYyAocHNfcHN0b3AsIGV0Yyk6IGRpZmZlcmVudCBzb2xhcmlzIHZlcnNpb25zIGhhdmUKKyAJc2xpZ2h0bHkgZGlmZmVyZW50IHByb3RvdHlwZXMgaW4gcHJvY19zZXJ2aWNlLmg7IGNvbXBlbnNhdGUuCisKKzE5OTgtMTAtMTIgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKKworICAgICAgICAqIE1ha2VmaWxlLmluIChBV0spOiBVbnVzZWQ7IHJlbW92ZS4KKyAgICAgICAgKiBjb25maWd1cmUuaW46IFJlbW92ZSB1bnVzZWQgYXV0b2NvbmYgY2hlY2tzIGZvciBNSU5JWCwgbWVtY3B5LAorICAgICAgICBwb2xsLCBzZWxlY3QsIHN0cmluZ3MuaC4KKyAgICAgICAgKiBjb25maWcuaW46IFJlZ2VuZXJhdGVkLgorICAgICAgICAqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKKzE5OTgtMTAtMTIgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBDaGVjayBmb3Igc3lzL2RlYnVncmVnLmgsIGFzbS9kZWJ1Z3JlZy5oLgorCSogaTM4NnYtbmF0LmM6IEluY2x1ZGUgYXNtL2RlYnVncmVnLmgsIHN5cy9kZWJ1Z3JlZy5oIGlmIGl0IGlzIG5vdAorCXByZXNlbnQuCisKK1N1biBPY3QgMTEgMTI6MDg6MDcgMTk5OCAgUGV0ZXIgU2NoYXVlciAgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPgorCisJKiBkd2FyZjJyZWFkLmMgKGR3YXJmMl9idWlsZF9wc3ltdGFic19oYXJkKTogIERvIG5vdCBhZGp1c3QgdGhlCisJYWRkcmVzcyByYW5nZSBvZiBhIGNvbXBpbGF0aW9uIHVuaXQgd2l0aG91dCBjaGlsZHJlbi4KKworCSogbWRlYnVncmVhZC5jIChwYXJzZV9wYXJ0aWFsX3N5bWJvbHMpOiAgRml4IGhhbmRsaW5nIG9mIHN0YWJzCisJY29udGludWF0aW9ucywgdXNlIHhtYWxsb2MgYW5kIHhyZWFsbG9jLgorCitGcmkgT2N0ICA5IDE4OjE0OjQzIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogcnM2MDAwLXRkZXAuYzogRG9uJ3QgaW5jbHVkZSB0bS5oIHR3aWNlLgorCisxOTk4LTEwLTA4ICBLZWl0aCBTZWl0eiAgPGtlaXRoc0BjeWdudXMuY29tPgorCisJKiBtYWluLmMgKG1haW4pOiBSZW1vdmUgY2FsbHMgdG8ge3ByZSxwb3N0fV9hZGRfc3ltYm9sX2hvb2tzLgorCVRoZXJlIHNob3VsZCBiZSBzdWZmaWNpZW50IGluZm9ybWF0aW9uL2hvb2tzIG5vdyB0byBlbGltaW5hdGUKKwl0aGlzIGhhY2suCisKKwkqIGV4ZWMuYyAoZmlsZV9jb21tYW5kKTogQWRkIGEgbmV3IGhvb2sgaGVyZSB0byBpbmZvcm0gdWkncworCXdoZW4gdGhlIGV4ZWMgZmlsZSBoYXMgY2hhbmdlZC4gQWRkaW5nIGl0IGhlcmUgYWxsb3dzIHRoZQorCXVpIHRvIGJlIGluZm9ybWVkIGFmdGVyIHN5bWJvbCByZWFkaW5nLgorCisJKiBnZGJjb3JlLmg6IEFkZCBkZWNsYXJhdGlvbiBvZiBmaWxlX2NoYW5nZWRfaG9vay4KKworVGh1IE9jdCAgOCAwODo0MDo0MiAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIHJzNjAwMC10ZGVwLmMgKGdldF9zYXZlZF9yZWdpc3Rlcik6IERlZmluZSBvbmx5IGlmCisJVVNFX0dFTkVSSUNfRFVNTVlfRlJBTUVTIGlzIGRlZmluZWQuCisKKzE5OTgtMTAtMDYgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKKworIAlFbGltaW5hdGUgYSBmZXcgd2FybmluZ3MgZnJvbSB0aGUgY29tcGlsZXIuCisJKiBicmVha3BvaW50Lmg6IEFkZCBwcm90b3R5cGUuCisJKiBicmVha3BvaW50LmMgKGRvX2VuYWJsZV9icmVha3BvaW50KTogY2FzdCBtZW1fY250LCBpIHRvICh2b2lkKS4KKwkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgaWYgc3RyZHVwIGRlY2xhcmF0aW9uIGlzIG5lY2Vzc2FyeS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBkZWZzLmg6IEFkZCBwcm90b3R5cGVzLgorCSogZ2RiX3N0cmluZy5oOiBPbmx5IGRlZmluZSBzdHJkdXAgaWYgbmVjZXNzYXJ5LgorCSogZ2RidGhyZWFkLmg6IEFkZCBwcm90b3R5cGVzLgorCSogcHJpbnRjbWQuYzogQWRkIHByb3RvdHlwdGVzLgorCShkaXNhc3NlbWJsZV9jb21tYW5kKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAnc2VjdGlvbicuCisJKiBzeW10YWIuYzogQWRkIHByb3RvdHlwZXMuCisJKiBzeW10YWIuaDogSW5jbHVkZSBnbnUtcmVnZXguaCwgYWRkIHByb3RvdHlwZS4KKwkqIHRocmVhZC5jOiBBZGQgcHJvdG90eXBlLgorCitNb24gT2N0ICA1IDE5OjQ0OjM5IDE5OTggIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCUZyb20gRGF2aWQgUHVydmVzICA8cHVydmVzQGFwb2dlZS5jb20+OgorCSogc3RhYnNyZWFkLmMgKHJzNjAwMF9idWlsdGluX3R5cGUpOiBDcmVhdGUgYSBjb21wbGV4IGZsb2F0IGluc3RlYWQKKwlvZiBhbiBlcnJvci4KKwkocmVhZF9zdW5fZmxvYXRpbmdfdHlwZSk6IFNpbWlsYXJseS4KKwkocmVhZF9yYW5nZV90eXBlKTogQ3JlYXRlIGEgY29tcGxleCBmbG9hdCBpZiBzZWxmX3N1YnJhbmdlIGlzCisgCXRydWUuCisKK0ZyaSBPY3QgIDIgMTk6NDI6MzEgMTk5OCAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmFieWxvbi01LmN5Z251cy5jb20+CisKKwkqIGMtbGFuZy5jIChlbWl0X2NoYXIgY19wcmludGNoYXIgY19wcmludHN0ciksIGMtbGFuZy5oIChjX3ByaW50c3RyKQorCWNoLWxhbmcuYyAoY2hpbGxfcHJpbnRzdHIgY2hpbGxfcHJpbnRjaGFyKSBjLXZhbHByaW50LmMgKGNfdmFsX3ByaW50KQorCWNoLXZhbHByaW50LmMgKGNoaWxsX3ZhbF9wcmludCkgZXhwcHJpbnQuYyAocHJpbnRfc3ViZXhwKSBmLWxhbmcuYworCShmX3ByaW50c3RyIGZfcHJpbnRjaGFyIGVtaXRfY2hhcikgZi12YWxwcmludC5jIChmX3ZhbF9wcmludCkgCisJanYtbGFuZy5jIChqYXZhX3ByaW50Y2hhciBqYXZhX2VtaXRfY2hhcikganYtdmFscHJpbnQuYyAKKwkoamF2YV92YWx1ZV9wcmludCBqYXZhX3ZhbF9wcmludCkgbGFuZ3VhZ2UuYyAodW5rX2xhbmdfcHJpbnRjaGFyIAorCXVua19sYW5nX3ByaW50c3RyIHVua19sYW5nX2VtaXRfY2hhcikgbGFuZ3VhZ2UuaCAoc3RydWN0IAorCWxhbmd1YWdlX2RlZm4gTEFfUFJJTlRfU1RSSU5HIExBX0VNSVRfQ0hBUikgbTItbGFuZy5jIChtMl9wcmludHN0ciAKKwltMl9wcmludGNoYXIgZW1pdF9jaGFyKSBwcmludGNtZC5jIChwcmludF9mb3JtYXR0ZWQpIHNjbS1sYW5nLmMgCisJKHNjbV9wcmludHN0cikgdmFscHJpbnQuYyAodmFsX3ByaW50X3N0cmluZykgdmFsdWUuaCAKKwkodmFsX3ByaW50X3N0cmluZyk6ICBBZGQgZW1pdF9jaGFyIHJvdXRpbmVzIHRvIGxhbmd1YWdlX2Rlc2Mgc3RydWN0IAorCXRvIGFsbG93IGZpbmVyIGNvbnRyb2wgb3ZlciBsYW5ndWFnZSBzcGVjaWZpYyBjaGFyYWN0ZXIgb3V0cHV0IGlzc3Vlcy4KKyAgCUFkZCBjaGFyYWN0ZXIgd2lkdGggYXJnIHRvIHByaW50c3RyIHJvdXRpbmVzIHRvIGFsbG93IGhhbmRsaW5nIG9mIAorCXdjaGFyX3QvVW5pY29kZSBzdHJpbmdzLiAgRml4IGNfcHJpbnRzdHIgdG8gaGFuZGxlIHdpZGUgY2hhcmFjdGVycy4KKyAgCVN1cHBseSB3aWR0aCBhcmd1bWVudCB0byBMQV9QUklOVF9TVFJJTkcgYW5kIHZhbF9wcmludF9zdHJpbmcuCisKKwkqIGp2LWxhbmcuYyAoamF2YV9vYmplY3RfdHlwZSBkeW5hbWljc19vYmpmaWxlIGphdmFfbGlua19jbGFzc190eXBlCisJZ2V0X2R5bmFtaWNzX29iamZpbGUgZ2V0X2phdmFfb2JqZWN0X3R5cGUpIGp2LWxhbmcuaAorCShnZXRfamF2YV9vYmplY3RfdHlwZSk6ICBNYWtlIGxvdHMgb2YgdGhpbmdzIHN0YXRpYy4KKworCSogZXhwcHJpbnQuYyAoZHVtcF9wcmVmaXhfZXhwcmVzc2lvbiBkdW1wX3N1YmV4cCk6ICBNb3ZlIG9wY29kZSBuYW1lCisJcHJpbnRpbmcgdG8gY29tbW9uIHJvdXRpbmUgKG9wX25hbWUpLgorCSogKGR1bXBfc3ViZXhwKTogIEFkZCBzdXBwb3J0IGZvciBPUF9TQ09QRS4KKworRnJpIE9jdCAgMiAxNjoyNTo1NCAxOTk4ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0NTZdODYtKi13aW5kb3dzKTogUmVtb3ZlLCBubyBsb25nZXIgdXNlZC4KKwkqIG1zd2luOiBSZW1vdmUgZGlyZWN0b3J5LCBubyBsb25nZXIgdXNlZC4KKworRnJpIE9jdCAgMiAxODo1MjoyMCAxOTk4ICBGZXJuYW5kbyBOYXNzZXIgIDxmbmFzc2VyQGN5Z251cy5jb20+CisKKwkqIHNvbC10aHJlYWQuYzogRml4ZWQgcHJvdG90eXBlcyBhbmQgY2FsbHMgdG8gc3VwcGx5X2ZwcmVnc2V0IGFuZAorIAlmaWxsX2ZwcmVnc2V0CisKKzE5OTgtMTAtMDIgIEtlaXRoIFNlaXR6ICA8a2VpdGhzQGN5Z251cy5jb20+CisKKwkqIHJlbW90ZS5jIChyZW1vdGVfaW50ZXJydXB0KTogUmV3cml0ZSB0byB1c2UgcmVtb3RlX3N0b3AuCisJKHJlbW90ZV9pbnRlcnJ1cHRfdHdpY2UpOiBSZW1vdmUuIHJlbW90ZV9zdG9wIG5vdyBoYW5kbGVzIGl0LgorCShyZW1vdGVfc3RvcCk6IE5ldyBmdW5jdGlvbiB3aGljaCBoYW5kbGVzIGludGVycnVwdGluZyB0aGUKKwlyZW1vdGUgdGFyZ2V0IHNvIHRoYXQgQ0xVSSBhbmQgR1VJIHVzZSB0aGUgc2FtZSBjb3JlIGZ1bmN0aW9ucworCXRvIGFjaGlldmUgdGhlIHNhbWUgZ29hbC4KKwkocmVtb3RlX3dhaXQpOiBDaGFuZ2UgdG8gaGFuZGxlIHJlbW90ZV9zdG9wIHByb3Blcmx5LgorCVtpbnRlcnJ1cHRlZF9hbHJlYWR5XTogTmV3IHN0YXRpYyBnbG9iYWwgdG8gaGVscCByZW1vdGVfc3RvcC4KKwlbcmVtb3RlX29wcywgZXh0ZW5kZWRfcmVtb3RlX29wc106IEFkZCByZW1vdGVfc3RvcCBmb3IgdG9fc3RvcCBtZW1iZXIuCisKKwkqIHRhcmdldC5jOiBSZW5hbWUgc3RhdGljIGZ1bmN0aW9uICJpZ25vcmUiIHRvICJ0YXJnZXRfaWdub3JlIiBhbmQKKwlleHBvcnQgaXQgc28gdGhhdCBnZGIgY2FuIGRldGVybWluIGlmIHNvbWUgdGFyZ2V0IHZlY3RvciBtZW1iZXIgaXMKKwlhY3R1YWxseSBub3QgZGVmaW5lZC4gUmVwbGFjZSBhbGwgb2NjdXJhbmNlcyBvZiBpZ25vcmUuCisKKwkqIHRhcmdldC5oOiBFeHBvcnQgdGFyZ2V0X2lnbm9yZS4KKworRnJpIE9jdCAgMiAwMzo1MTo0OCAxOTk4ICBQZXRlciBTY2hhdWVyICA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+CisKKwkqIHRhcmdldC5jICh0YXJnZXRfeGZlcl9tZW1vcnkpOiAgSGFuZGxlIHJlcXVlc3RzIHdpdGggemVybworCXRyYW5zZmVyIGxlbmd0aCByaWdodCBhd2F5LgorCisJKiB2YWx1ZXMuYyAodW5wYWNrX2RvdWJsZSk6ICBTZXQgdXAgY29kZSwgbGVuZ3RoIGFuZCBzaWduZWRuZXNzIG9mCisJdHlwZSBfYWZ0ZXJfIGNoZWNraW5nIGZvciB0eXBlZGVmLgorCitUaHUgT2N0ICAxIDE1OjM5OjI3IEVEVCAxOTk4IEZyYW5rIENoLiBFaWdsZXIgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogYnJlYWtwb2ludC5jIChicHN0YXRfc3RvcF9zdGF0dXMpOiBEbyBub3QgY29uc2lkZXIgYW4KKwl1bnRyaXBwZWQgd2F0Y2hwb2ludCBhcyBhICJoaXQiLgorCitUaHUgT2N0ICAxIDIwOjUyOjM5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZXhlYy5jIChleGVjX2ZpbGVfY29tbWFuZCksIGNvbnZleC10ZGVwLmMgKGV4ZWNfZmlsZV9jb21tYW5kKSwKKyAJYXJtLXhkZXAuYyAoZXhlY19maWxlX2NvbW1hbmQpLCByZW1vdGUtcmRwLmMKKyAJKHJlbW90ZV9yZHBfY3JlYXRlX2luZmVyaW9yKSwgcmVtb3RlLW9zOWsuYworIAkocm9tYnVnX2NyZWF0ZV9pbmZlcmlvciksIHJlbW90ZS1tbS5jIChtbV9jcmVhdGVfaW5mZXJpb3IpLAorIAlyZW1vdGUtZWIuYyAoZWJfY3JlYXRlX2luZmVyaW9yKSwgcmVtb3RlLWVzLmMKKyAJKGVzMTgwMF9jcmVhdGVfaW5mZXJpb3IpLCByZW1vdGUtcmRpLmMgKGFybV9yZGlfY3JlYXRlX2luZmVyaW9yKSwKKyAJcmVtb3RlLXNpbS5jIChnZGJzaW1fY3JlYXRlX2luZmVyaW9yKSwgcmVtb3RlLXV0aWxzLmMKKyAJKGdyX2NyZWF0ZV9pbmZlcmlvciksIHJlbW90ZS1zdC5jIChzdDIwMDBfY3JlYXRlX2luZmVyaW9yKSwKKyAJcmVtb3RlLW5pbmR5LmMgKG5pbmR5X2NyZWF0ZV9pbmZlcmlvciksIHJlbW90ZS1obXMuYworIAkoaG1zX2NyZWF0ZV9pbmZlcmlvciksIHJlbW90ZS1lNzAwMC5jIChlNzAwMF9jcmVhdGVfaW5mZXJpb3IpLAorIAlyZW1vdGUtYXJyYXkuYyAoYXJyYXlfY3JlYXRlX2luZmVyaW9yKSwgcmVtb3RlLWFkYXB0LmMKKyAJKGFkYXB0X2NyZWF0ZV9pbmZlcmlvcik6IFJlcGxhY2UgImV4ZWMiIHdpdGggImV4ZWN1dGFibGUiIGluCisgCW1lc3NhZ2VzLgorCisxOTk4LTA5LTI1ICBLZWl0aCBTZWl0eiAgPGtlaXRoc0BjeWdudXMuY29tPgorCisgICAgICAgICogcmRpLXNoYXJlL3VuaXhjb21tLmM6IElmIHVzaW5nIGN5Z3dpbjMyLCBhbHNvIHVzZSB0aGUgU0VSUE9SVCBhbmQKKyAgICAgICAgUEFSUE9SVCBkZWZpbmVzIGZvciB3aW4zMi4KKyAgICAgICAgKFVuaXhfTWF0Y2hWYWxpZFNlcmlhbERldmljZSk6IEZvciBjeWd3aW4zMiwgdmFsaWQgc2VyaWFsIHBvcnQgbmFtZXMKKyAgICAgICAgc3RhcnQgd2l0aCAiY29tIiwgbm90ICIvZGV2L3R0eSIuCisgICAgICAgIChVbml4X09wZW5TZXJpYWwpOiBEbyBub3QgdXNlIE9fTk9OQkxPQ0sgb24gY3lnd2luMzIuCisKKyAgICAgICAgKiByZGktc2hhcmUvZGV2c3cuYyAoRGV2U1dfQ2xvc2UpOiBGcmVlIHRoZSBkZXZpY2UncyBzdGF0ZSAKKyAgICAgICAgKFN3aXRjaGVyU3RhdGUpIHNvIHRoYXQgdGhlIGRldmljZSBtYXkgYmUgcmVvcGVuZWQuCisKKyAgICAgICAgKiByZW1vdGUtcmRpLmMgKG15d3JpdGVjKTogU2VuZCBhbGwgb3V0cHV0IHRocm91Z2ggZ2RiJ3MgKl91bmZpbHRlcmVkCisgICAgICAgIGZ1bmN0aW9ucywgaWdub3Jpbmcgbm9uLUFTQ0lJIGNoYXJzLCBzbyB0aGF0IG5vbi10dHkgVUkncyBjYW4gc25hcmYKKyAgICAgICAgdGhlIG91dHB1dCBmcm9tIGZwdXRzX2hvb2suCisgICAgICAgIChteXdyaXRlKTogRGl0dG8uCisgICAgICAgIChhcm1fcmRpX29wZW4pOiBTZXQgaW5mZXJpb3JfcGlkLgorICAgICAgICAoYXJtX3JkaV9kZXRhY2gpOiBQb3AgdGhlIHRhcmdldCBvZmYgdGhlIHRhcmdldCBzdGFjayBzbyB0aGF0CisgICAgICAgIHVzZXJzIGNhbiBhdHRhY2ggYW5kIGRldGFjaCBtdWx0aXBsZSB0aW1lcy4KKyAgICAgICAgKGFybV9yZGlfY2xvc2UpOiBDbG9zZSB0aGUgb3BlbmVkIGRldmljZSBhbmQgcmVzZXQgaW5mZXJpb3JfcGlkLCB0b28uCisKKzE5OTgtMDktMjQgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBDaGFuZ2UgLS1lbmFibGUtd2FybmluZ3MgdG8gLS1lbmFibGUtYnVpbGQtd2FybmluZ3MuCisJKiBjb25maWd1cmU6IFVwZGF0ZWQuCisKKzE5OTgtMDktMjQgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChXQVJOX0NGTEFHUyk6IEFkZCAtV21pc3NpbmctcHJvdG90eXBlcy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKKzE5OTgtMDktMjQgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBBZGQgLS1lbmFibGUtd2FybmluZ3MuCisJQWRqdXN0IHdoaXRlc3BhY2Ugb2Ygb3RoZXIgLS13aXRoIGFuZCAtLWVuYWJsZSBvcHRpb25zIHNvIHRoYXQKKwljb25maWd1cmUgLS1oZWxwIGxpbmVzIHVwIGNvcnJlY3RseS4KKwkqIGFjbG9jYWwubTQ6IERpdHRvLgorCSogTWFrZWZpbGUuaW4gKFdBUk5fQ0ZMQUdTKTogQWRkLiAgU2V0IGJ5IGNvbmZpZ3VyZS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK1RodSBTZXAgMjQgMTU6NDQ6MzQgMTk5OCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiByZW1vdGUtcmRpLmM6IEZpeCBmb3JtYXR0aW5nLCByZW1vdmUgc29tZSBjb21tZW50ZWQtb3V0IGNvZGUuCisJKGluaXRfcmRpX29wcyk6IE9taXQgbmVlZGxlc3MgaW5pdGlhbGl6YXRpb25zLgorCitXZWQgU2VwIDIzIDE4OjIxOjAzIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLmMgKHJlbW90ZV9hZGRyZXNzX21hc2tlZCk6IE5ldyBmdW5jdGlvbiAtIG1hc2sgYWRkcmVzcworIAlhY2NvcmRpbmcgdG8gUkVNT1RFX0FERFJFU1NfU0laRS4KKwkocmVtb3RlX2FkZHJlc3Nfc2l6ZSk6IE5ldyBnbG9iYWwuCisJKGhleG51bXN0cik6IE5ldyBmdW5jdGlvbiAtIGNvbnZlcnQgYXJiaXRyYXJ5IHVuc2lnbmVkIHRvIGhleC4KKwkocmVtb3RlX3dyaXRlX2J5dGVzLCByZW1vdGVfcmVhZF9ieXRlcyk6IFVzZSBoZXhudW1zdHIgdG8KKyAJY29uc3RydWN0IHBhY2tldCBhZGRyZXNzLiAgTWFzayBhZGRyZXNzIHdoZW4gbmVjZXNzYXJ5LgorCShfaW5pdGlhbGl6ZV9yZW1vdGUpOiBBZGQgInNldCByZW1vdGVhZGRyZXNzc2l6ZSIgY29tbWFuZCwgc2V0CisgCVJFTU9URV9BRERSRVNTX1NJWkUgdmFyaWFibGUuCisKKwkqIE5FV1M6IFVwZGF0ZS4KKworV2VkIFNlcCAyMyAxODowODo1MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS5jIChfaW5pdGlhbGl6ZV9yZW1vdGUsIHBhY2tldF9jb21tYW5kLCBwcmludF9wYWNrZXQpOgorCVByZXR0eSBwcmludCBjb2RlLgorCitXZWQgU2VwIDIzIDEyOjMyOjU0IDE5OTggICAgPGNhZ25leUBhbXkuY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLmMgKHBhY2tldF9jb21tYW5kKTogVGVzdCBSRU1PVEVfREVTQyB0byBkZXRlcm1pbmUgaWYKKyAJcmVtb3RlIGNvbm5lY3Rpb24gaXMgb3Blbi4KKworVHVlIFNlcCAyMiAyMjoyNzoyNCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwlQYXRjaCBmcm9tIERhd24gUGVyY2hpayA8ZGF3bkBjeWdudXMuY29tPjoKKwkqIHJzNjAwMC10ZGVwLmMgKHBvcF9mcmFtZSk6IEhhbmRsZSBnZW5lcmljIGR1bW15IGZyYW1lcy4KKwkocHVzaF9hcmd1bWVudHMpOiBMaWtld2lzZS4KKwkoZnJhbWVfc2F2ZWRfcGMpOiBMaWtld2lzZS4KKwkocnM2MDAwX2ZyYW1lX2NoYWluKTogTGlrZXdpc2UuCisJKHBwY19wdXNoX3JldHVybl9hZGRyZXNzKTogTmV3IGZ1bmN0aW9uLgorCShnZXRfc2F2ZWRfcmVnaXN0ZXIpOiBOZXcgZnVuY3Rpb24uCisJKiBjb25maWcvcG93ZXJwYy90bS1wcGMtZWFiaS5oOiBBZGQgZ2VuZXJpYyBkdW1teSBmcmFtZSBtYWNyb3MuCisKK01vbiBTZXAgMjEgMTk6Mjk6MzIgMTk5OCAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmFieWxvbi01LmN5Z251cy5jb20+CisKKwkqIGRlZnMuaCB1dGlscy5jIChmcHV0Y19maWx0ZXJlZCk6ICBOZXcgZnVuY3Rpb24uICBEb2VzIHRoZSBvYnZpb3VzLi4uCisJKiBqdi1sYW5nLmMgKGphdmFfcHJpbnRjaGFyKTogIEZpeCBvdXRwdXQgb2YgY2hhcnMgPiAweGZmLiAgRm9sZAorCWphdmFfZW1pdF9jaGFyIGludG8gamF2YV9wcmludGNoYXIuCisJKiBsYW5ndWFnZS5oIChQUklOVF9MSVRFUkFMX0ZPUk0pOiAgUmVmb3JtYXQgZm9yIHJlYWRhYmlsaXR5LgorCitNb24gU2VwIDIxIDE0OjM4OjAzIDE5OTggIENhdGhlcmluZSBNb29yZSA8Y2xtQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9hcm0vdG0tYXJtLmggKCpfQlJFQUtQT0lOVCk6IERlZmluZSBib3RoIGxpdHRsZSBlbmRpYW4KKwlhbmQgYmlnIGVuZGlhbiBicmVha3BvaW50IHBhdHRlcm5zLgorCisJKiBhcm0tdGRlcC5jIChhcm1fYnJlYWtfcG9pbnRfZnJvbV9wYyk6ICBJbnNlcnQgZWl0aGVyIGJpZyBlbmRpYW4KKwlvciBsaXR0bGUgZW5kaWFuIGJyZWFrcG9pbnRzIGRlcGVuZGluZyB1cG9uIHRhcmdldCBieXRlIG9yZGVyLgorCitGcmkgU2VwIDE4IDA3OjUzOjA4IDE5OTggIFBldGVyIFNjaGF1ZXIgIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4KKworCSogc29sLXRocmVhZC5jIChzb2xfdGhyZWFkX25vdGljZV9zaWduYWxzKTogIFVzZSBQSURHRVQgd2hlbgorCXBhc3NpbmcgcGlkIGRvd24gdG8gcHJvY2ZzX25vdGljZV9zaWduYWxzLgorCitXZWQgU2VwIDE2IDE0OjU3OjE0IDE5OTggIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgorCisJKiBzdGFic3JlYWQuYyAocmVzb2x2ZV9zeW1ib2xfcmVmZXJlbmNlKTogIFJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24KKwlmYWlsdXJlLgorCSogKGRlZmluZV9zeW1ib2wpOiAgQ2hlY2sgcmV0dXJuIHZhbHVlIGZyb20gcmVzb2x2ZV9zeW1ib2xfcmVmZXJlbmNlLAorCWFuZCBkcm9wIHN5bWJvbCBpZiBpdCBmYWlscy4KKworVHVlIFNlcCAxNSAxNToyNDoxNiAxOTk4ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBmZW5jZXIuY3lnbnVzLmNvbT4KKworCSogc3RhYnNyZWFkLmM6ICBNYWtlIGFsbCBjb21wbGFpbnRzIHN0YXRpYy4KKwkqIEZpeCBmb3JtYXR0aW5nIG9mIGxpdmUgcmFuZ2Ugc3BsaXR0aW5nIGNvZGUuCisJKiAocmVzb2x2ZV9zeW1ib2xfcmVmZXJlbmNlIGRlZmluZV9zeW1ib2wgcmVzb2x2ZV9saXZlX3JhbmdlKTogIENoYW5nZQorCWVycm9ycyB0byBjb21wbGFpbnRzIHNvIHRoYXQgYmFkIGxpdmUgcmFuZ2Ugc3ltYm9scyB3b24ndCBhYm9ydCB0aGUKKwllbnRpcmUgc3ltYm9sIHRhYmxlLiAgSGFuZGxlIGVycm9ycyBieSBhYm9ydGluZyBqdXN0IHRoZSBjdXJyZW50CisJc3ltYm9sLgorCSogKHJlZl9pbml0KTogIEdvZXMgYXdheS4gIEZvbGRlZCBpbnRvIHJlZl9hZGQoKS4KKwkqIChSRUZfTUFQX1NJWkUpOiAgUHV0IHBhcmVucyBhcm91bmQgcGFyYW1ldGVyIHNvIHRoYXQgYXJncyBsaWtlCisJYDEgKyAyJyBnZXQgaGFuZGxlZCBjb3JyZWN0bHkgKHllcywgdGhpcyB3YXMgYSByZWFsIGJ1ZykuCisJKiAocmVmX2FkZCk6ICBSZW1vdmUgY2hlY2sgZm9yIGFsbG9jYXRpb24gZmFpbHVyZXMuICBOb3QgbmVjZXNzYXJ5CisJd2hlbiB1c2luZyB4cmVhbGxvYygpLiAgRml4IHBvaW50ZXIgYXJpdGhtZXRpYyBwcm9ibGVtIHdoZW4gY2xlYXJpbmcKKwltZW1vcnkuICBUaGlzIGFuZCB0aGUgcHJldmlvdXMgcGF0Y2ggcHJldmVudCByYW5kb20gU0VHVidzIHdoZW4gdGhlcmUKKwlhcmUgbG90cyBvZiBsaXZlIHJhbmdlIHN5bWJvbHMuCisKK1R1ZSBTZXAgMTUgMTQ6MDI6MDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLXJkaS5jOiBQcmV2ZW50IG11bHRpcGxlIGF0dGVtcHRzIHRvIGNsb3NlIHRoZSByZW1vdGUKKwljb25uZWN0aW9uLiAKKworVHVlIFNlcCAxNSAxMDoyNDoxNyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHByaW50Y21kLmMgKGV4YW1pbmVfaV90eXBlKTogTmV3IHN0YXRpYyAtIHR5cGUgZm9yIGluc3RydWN0aW9ucy4KKwkoZG9fZXhhbWluZSk6IEZvciAiaSIgZm9ybWF0LCBzcGVjaWZ5IGV4YW1pbmVfaV90eXBlLgorCShkb19leGFtaW5lKTogQ2FsbCB2YWx1ZV9hdF9sYXp5IGluc3RlYWQgb2YgdmFsdWVfYXQgc28gdGhhdAorIAlleGFtaW5lIGRhdGEgaXMgb25seSBmZXRjaGVkIGlmIGl0IGlzIHVzZWQuCisJKHhfY29tbWFuZCk6IElmIGV4YW1pbmUgZGF0YSB3YXMgbm90IGZldGNoZWQsIHNldCBjb252ZW5pZW5jZQorIAl2YXJpYWJsZSAiX18iIHRvIHZvaWQuCisJKF9pbml0aWFsaXplX3ByaW50Y21kKTogSW5pdGlhbGl6ZSBleGFtaW5lX2lfdHlwZS4KKworU3VuIFNlcCAxMyAwMTozNDo1OSAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisgCSogYmxvY2tmcmFtZS5jIChmaW5kX3BjX3NlY3RfcGFydGlhbF9mdW5jdGlvbik6IHVzZSBiZmQgc2VjdGlvbiAKKwkgIG9mIG1zeW1ib2wgZm9yIGVuZCBvZiBzZWN0aW9uIGNvbXBhcmlzb24uCisKK0ZyaSBTZXAgMTEgMTQ6MDI6NDkgMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogdHJhY2Vwb2ludC5jOiBjbGVhbiB1cCBzZXZlcmFsIHVudXNlZCB2YXJpYWJsZXMgYW5kIHN1Y2guCisKK0ZyaSBTZXAgMTEgMTI6Mzg6MzQgRURUIDE5OTggIFpkZW5layBSYWRvdWNoICAgKHJhZG91Y2hAY3lnbnVzLmNvbSkKKworCSogYXJtLXRkZXAuYyAoYXJtX3B1c2hfYXJndW1lbnRzKTogZml4ZWQgZnJhbWUgY29uc3RydWN0aW9uCisKK1RodSBTZXAgMTAgMjA6NTE6MjMgMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogbW4xMDMwMC10ZGVwLmMgKG1uMTAzMDBfYW5hbHl6ZV9wcm9sb2d1ZSk6IGd1YXJkIGFnYWluc3QgTlVMTC4KKworV2VkIFNlcCAgOSAxOTozNzozNiAxOTk4ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGRieHJlYWQuYyAoSUdOT1JFX1NZTUJPTCk6IFJlbW92ZSBkZWZpbml0aW9uLCBpcyBuZXZlciB1c2VkLgorCSogb3M5a3JlYWQuYzogUmVtb3ZlIGNvbW1lbnQgbWVudGlvbmluZyBJR05PUkVfU1lNQk9MLgorCitXZWQgU2VwICA5IDExOjM5OjA1IDE5OTggIFJvbiBVbnJhdSAgPHJ1bnJhdUBjeWdudXMuY29tPgorCisJKiBibG9ja2ZyYW1lLmMoZmluZF9wY19zZWN0X3BhcnRpYWxfZnVuY3Rpb24pOiBsb29rIGZvciBtaW4gc3ltcyBpbgorCSAgdGhlIHNhbWUgc2VjdGlvbiB3aGVuIHRyeWluZyB0byBndWVzcyB0aGUgZW5kIG9mIGEgZnVuY3Rpb24uCisJKiBzeW1maWxlLmMobGlzdF9vdmVybGF5c19jb21tYW5kKTogdXNlIHByaW50X2FkZHJlc3NfbnVtZXJpYworCSogcmVtb3RlLXNpbS5jOiBleHBvcnQgc2ltdWxhdG9yX2NvbW1hbmQKKworMTk5OC0wOS0wOCAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBicmVha3BvaW50LmMgKGJwc3RhdF9zdG9wX3N0YXR1cyk6ICBEZWNsYXJlIGEgYnAgbWF0Y2ggaWYgdGhlCisJY3VycmVudCBmcCBtYXRjaGVzIHRoZSBicC0+ZnAgT1IgaWYgdGhlIGN1cnJlbnQgZnAgaXMgbGVzcyB0aGFuCisJdGhlIGJwLT5mcCBpZiB3ZSdyZSBsb29raW5nIGF0IGEgYnBfc3RlcF9yZXN1bWUgYnJlYWtwb2ludC4KKworVHVlIFNlcCAgOCAxOTo0Mjo1OCAxOTk4ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHN5bXRhYi5oIChzdHJ1Y3Qgc3ltdGFiKTogUmVtb3ZlIEVYVFJBX1NZTVRBQl9JTkZPIGhvb2ssCisJbm90IGN1cnJlbnRseSB1c2VkLgorCSogc3ltZmlsZS5jIChhbGxvY2F0ZV9zeW10YWIpOiBEZXByZWNhdGUgdXNlIG9mCisJSU5JVF9FWFRSQV9TWU1UQUJfSU5GTyBoZXJlLgorCitGcmkgU2VwICA0IDE1OjMzOjI1IDE5OTggIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogUkVBRE1FOiBVcGRhdGUgcmVtb3RlIGRlYnVnZ2luZyBhbmQgdGVzdHN1aXRlIGluZm8uCisKK1RodSBTZXAgIDMgMTM6NTA6MjAgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBjb25maWcvbW4xMDMwMC90bS1tbjEwMzAwLmggKEZQX1JFR05VTSk6IFJlZGVmaW5lIHRvIGJlIGEKKwlwc2V1ZG8tcmVnaXN0ZXIsIG5vdCB0aGUgc2FtZSBhcyBhMy4KKwkoRDJfUkVHTlVNLCBEM19SRUdOVU0sIEEyX1JFR05VTSwgQTNfUkVHTlVNKTogRGVmaW5lLgorCSogbW4xMDMwMC10ZGVwLmMgKGZpeF9mcmFtZV9wb2ludGVyKTogTmV3IGZ1bmN0aW9uLgorCShzZXRfbW92bV9vZmZzZXRzKTogVXNlIHJlZ2lzdGVyIG51bWJlciBtYWNyb3MgaW5zdGVhZCBvZgorCWhhcmQtY29kZWQgY29uc3RhbnRzLgorCShtbjEwMzAwX2FuYWx5emVfcHJvbG9ndWUpOiBGaXggdG8gaGFuZGxlIHJlZGVmaW5pdGlvbiBvZiBGUF9SRUdOVU0uCisJKG1uMTAzMDBfZnJhbWVfY2hhaW4pOiAgRml4IHRvIGhhbmRsZSByZWRlZmluaXRpb24gb2YgRlBfUkVHTlVNOworCXVzZSByZWdpc3RlciBudW1iZXIgbWFjcm9zIGluc3RlYWQgb2YgaGFyZC1jb2RlZCBjb25zdGFudHM7CisJYWRkIG1pc3NpbmcgcGFyYW1ldGVyIHRvIGNhbGwgb2YgbW4xMDMwMF9hbmFseXplX3Byb2xvZ3VlLgorCShtbjEwMzAwX2ZyYW1lX3NhdmVkX3BjKTogVXNlIHJlZ2lzdGVyIG51bWJlciBtYWNyb3MgaW5zdGVhZCBvZgorCWhhcmQtY29kZWQgY29uc3RhbnRzLgorCitUdWUgU2VwICAxIDEyOjA0OjU3IEVEVCAxOTk4ICBaZGVuZWsgUmFkb3VjaCAgIChyYWRvdWNoQGN5Z251cy5jb20pCisKKwlDaGFuZ2VzIHRvIHN1cHBvcnQvZml4IEFSTS9FTEYgcG9ydC4gIFVzZSBNQUtFX01TWU1CT0xfU1BFQ0lBTCBmb3IKKwlib3RoIEVMRiBhbmQgQ09GRjsKKwkqIGVsZnJlYWQuYyAoZWxmX3N5bXRhYl9yZWFkKTogdXNlIEVMRiBzcGVjaWZpYyBtYWNybworCSogY29mZnJlYWQuYyAoY29mZl9zeW10YWJfcmVhZCk6IHVzZSBDT0ZGX01BS0VfTVNZTUJPTF9TUEVDSUFMKCkKKwkqIGFybS10ZGVwLmM6IHNlcGFyYXRlIENPRkYgYW5kIEVMRiB0aHVtYiBwcm9jZXNzaW5nCisJCQlkaXNhYmxlIC0tbWFwY3MtZmxvYXQgcHJvY2Vzc2luZworCSogZHdhcmYycmVhZC5jOiBEaXNhYmxlZCBidWlsZGluZyBvZiBtaW5pbWFsIHN5bWJvbHMKKwkqIGNvbmZpZy9hcm0vdG0tYXJtLmg6IG5ldyBtYWNyb3MgZm9yIGRpc3Rpbmd1aXNoaW5nIGFybS90aHVtYgorCSogY29uZmlnL21pcHMvdG0tbWlwcy5oOiB1c2UgRUxGIHNwZWNpZmljIG1hY3JvCisKK01vbiBBdWcgMzEgMTU6NDI6MTAgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiB0b3AuYyAoY29udGV4dF9ob29rKTogRGVmaW5lLgorCitUdWUgQXVnIDI1IDEzOjIxOjU4IDE5OTggIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIGF4LWdkYi5jIChnZW5fdmFyX3JlZik6IEFsbG93IGZvciB0eXBlZGVmIHR5cGVzLgorCShnZW5fY2FzdCwgZ2VuX2JpdGZpZWxkX3JlZiwgZ2VuX2V4cHIsIGdlbl9kZXJlZik6IGRpdHRvLgorCitNb24gQXVnIDI0IDE4OjI5OjAzIDE5OTggIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIHRyYWNlcG9pbnQuYyAoY29sbGVjdF9zeW1ib2wpOiBIYW5kbGUgcmVnaXN0ZXIgZG91YmxlcyB0aGF0CisJYXJlIHN0b3JlZCBpbiB0d28gcmVnaXN0ZXJzLgorCitNb24gQXVnIDI0IDE0OjM5OjA4IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogc2gtc3R1Yi5jICh1bmRvU1N0ZXApOiBJbXByb3ZlIGNvbW1lbnQuCisJKiBzcGFyYy10ZGVwLmMgKHNwYXJjX2V4dHJhY3Rfc3RydWN0X3ZhbHVlX2FkZHJlc3MpOiBTaW1wbGlmeSB0byB1c2UKKwlzYW1lIG1ldGhvZCBvbiBib3RoIDMyLWJpdCBhbmQgNjQtYml0IG1hY2hpbmVzLgorCSogc3BhcmNsLXRkZXAuYyAoc3BhcmNsaXRlX2NoZWNrX3dhdGNoX3Jlc291cmNlcyk6IFNpbXVsYXRvciBkb2Vzbid0CisJc3VwcG9ydCBoYXJkd2FyZSBicmVha3BvaW50cy4KKwkqIGNvbmZpZy9zcGFyYy90bS1zcGFyYy5oIChDQUxMX0RVTU1ZKTogSW1wcm92ZSBjb21tZW50cy4KKworMTk5OC0wOC0yMCAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQorCisgICAgICAgICogcmRpLXNoYXJlL01ha2VmaWxlLmFtIChJTkNMVURFUyk6IEZpeCB0eXBlby4KKyAgICAgICAgKiByZGktc2hhcmUvTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgorCisxOTk4LTA4LTE5ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKyAgICAgICAgKiByZGktc2hhcmUvTWFrZWZpbGUuYW06IFVzZSBqdXN0IGBJTkNMVURFUycgbm90IGBsaWJuYW1lX0lOQ0xVREVTJy4KKyAgICAgICAgKiByZGktc2hhcmUvTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGVkLgorCisxOTk4LTA4LTE5ICBLZWl0aCBTZWl0eiAgPGtlaXRoc0BjeWdudXMuY29tPgorCisJKiB2ODUwaWNlLmMgKHY4NTBpY2Vfc3RvcCk6IE5ldyBmdW5jdGlvbiB0byBzdG9wIHRoZSBJQ0UuCisJKHY4NTBpY2VfbG9hZCkgUGFzcyBmaWxlbmFtZSB0byBJQ0UgRExMLgorCShpY2Vfc3RlcGksIGljZV9uZXh0aSwgaWNlX2NvbnQpOiBEbyBub3QgZGlyZWN0bHkgY2FsbCB0aGUgZ2RiCisJY29tbWFuZHMgLS0gbGV0IHRoZSBHVUkgZG8gaXQgc28gdGhhdCBpdCBjYW4gcmV0YWluIGNvbnRyb2wKKwlvZiB0aGUgZGlzcGxheS4KKworV2VkIEF1ZyAxOSAxNTo1Mzo1MiAxOTk4ICBBbnRob255IEdyZWVuICA8Z3JlZW5AaG9zZXIuY3lnbnVzLmNvbT4KKworCSogaTM4NnY0LW5hdC5jOiBJbmNsdWRlIHN5cy9yZWcuaCBpZiBwcmVzZW50LgorCitXZWQgQXVnIDE5IDAzOjA3OjUzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9hbHBoYS9hbHBoYS1saW51eCAoWERFUEZJTEVTKTogQnVpbGQgc2VyLXRjcC4KKworMTk5OC0wOC0xOCAgRmVybmFuZG8gTmFzc2VyICA8Zm5hc3NlckB0b3RlbS50by5jeWdudXMuY29tPgorCisgICAgICAgICogc3ltdGFiLmMgKGRlY29kZV9saW5lXzEpOiBGb3IgbWluaW1hbCBzeW1ib2wsIFNLSVBfUFJPTE9HIHRvCisgICAgICAgIG1ha2Ugc3VyZSB3ZSBzdG9wIGFmdGVyIHRoZSBmcmFtZSBwb2ludGVyIGlzIGxvY2FkZWQgYW5kIGJhY2t0cmFjZQorICAgICAgICBwcmludHMgYW4gYWNjdXJhdGUgc3RhY2suICBDb21wbGVtZW50cyBjaGFuZ2VzIG1hZGUgb24gTW9uIEp1bCAyNworICAgICAgICAxMDo0NTo1NiAxOTk4CisgICAgICAgIChkZWNvZGVfbGluZV8yKTogUmVwbGFjZWQgdGhlIHdoaXRlc3BhY2UgYWZ0ZXIgIj4iIGluIGEgcHJvbXB0CisgICAgICAgIHdoaWNoIGhhcyBiZWVuIHRha2VuIGF3YXkgYnkgY2hhbmdlcyBtYWRlIG9uIFN1biBKdWwgMTkgMDI6MTE6NDUKKyAgICAgICAgMTk5OAorCisxOTk4LTA4LTE4ICBLZWl0aCBTZWl0eiAgPGtlaXRoc0BjeWdudXMuY29tPgorCisJKiBzdGFjay5jOiBEZWZpbmUgbmV3IGhvb2ssIHNlbGVjdGVkX2ZyYW1lX2xldmVsX2NoYW5nZWRfaG9vaywgd2hpY2gKKwl3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgc2VsZWN0ZWQgc3RhY2sgbGV2ZWwgY2hhbmdlcy4KKwkoc2VsZWN0X2ZyYW1lKTogQ2FsbCB0aGUgc2VsZWN0ZWRfZnJhbWVfbGV2ZWxfY2hhbmdlZF9ob29rLgorCitUdWUgQXVnIDE4IDE4OjAzOjQyIDE5OTggIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLXJkaS5jIChhcm1fcmRpX29wZW4pOiBQYXNzIHNlcmlhbCBkZXZpY2UgbmFtZSB0bworIAlBZHBfT3BlbkRldmljZSwgYW5kIGluY2x1ZGUgaXQgaW4gZXJyb3IgcmVwb3J0cy4KKworMTk5OC0wOC0xOCAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IEFkZCBtb3JlIGhlYWRlciBmaWxlcyB0byBBQ19DSEVDS19IRUFERVJTLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworCSogY29tbWFuZC5jOiBJbmNsdWRlIHdhaXQuaCBvciBzeXMvd2FpdC5oIGlmIHByZXNlbnQuCisJKiBpbmZ0YXJnLmM6IERpdHRvLgorCSogY29yZS1hb3V0LmM6IEluY2x1ZGUgcHRyYWNlLmggb3Igc3lzL3B0cmFjZS5oIGlmIHByZXNlbnQsIGJhc2VkCisJb24gYXV0b2NvbmYgdGVzdC4KKwkqIGluZnB0cmFjZS5jOiBEaXR0by4KKworCSogZXhwcHJpbnQuYzogSW5jbHVkZSBjdHlwZS5oIGZvciBpc3ByaW50IHByb3RvdHlwZS4KKwkqIGkzODZhaXgtbmF0LmM6IEluY2x1ZGUgc3lzL3JlZy5oIGlmIGF1dG9jb25mIHNheXMgaXQgaXMgcHJlc2VudC4KKwkqIGkzODZ2LW5hdC5jOiBJbmNsdWRlIHB0cmFjZS5oLCBzeXMvcHRyYWNlLmgsIGFuZCBzeXMvcmVnLmggaWYgCisJcHJlc2VudCwgYmFzZWQgb24gYXV0b2NvbmYgdGVzdC4gIAorCisJKiB1dGlscy5jOiBJbmNsdWRlIGN1cnNlcy5oIGFuZCB0ZXJtLmggaWYgcHJlc2VudC4KKwkocHV0c19kZWJ1Zyk6IENoYW5nZSAnY2FycmlhZ2VfcmV0dXJuJyBsb2NhbCB2YXJpYWJsZSB0byByZXR1cm5fcAorCXRvIGF2b2lkIG5hbWUgY2xhc2guCisKKwkqIGNvbmZpZy9tNjhrL25tLWFwb2xsbzY4Yi5oOiBEb24ndCBkZWZpbmUgUFRSQUNFX0lOX1dST05HX1BMQUNFLAorCWRldGVybWluZSBpdCB3aXRoIGF1dG9jb25mLgorICAgICAgICAqIGNvbmZpZy9pMzg2L25tLWxpbnV4Lmg6IERvbid0IGRlZmluZSBOT19TWVNfUkVHX0gsIGRldGVybWluZSBpdAorICAgICAgICB3aXRoIGF1dG9jb25mLgorCSogY29uZmlnL2kzODYvbm0taTM4NnNjby5oOiBEb24ndCBkZWZpbmUgTk9fUFRSQUNFX0gsIGRldGVybWluZSBpdCAKKwl3aXRoIGF1dG9jb25mLgorCSogY29uZmlnL2kzODYvbm0taTM4NnYuaDogRGl0dG8uCisJKiBjb25maWcvaTM4Ni9ubS1zeW1tZXRyeS5oOiBEaXR0by4KKwkqIGNvbmZpZy9tODhrL3htLWN4dXguaDogRGl0dG8uCisJKiBjb25maWcvbTg4ay94bS1kZ3V4Lmg6IERpdHRvLgorCisJKiBjb25maWcvbTY4ay9kZWx0YTY4Lm1oIChOQVRfRklMRSk6IG5tLWRlbHRhNjguaCBubyBsb25nZXIgbmVjZXNzYXJ5LgorCSogY29uZmlnL202OGsvbm0tZGVsdGE2OC5oOiBSZW1vdmVkLgorCitGcmkgQXVnIDE0IDExOjE0OjAzIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDMwMC10ZGVwLmMgKHNldF9tb3ZtX29mZnNldHMpOiBDaGFuZ2Ugc2Vjb25kIGFyZ3VtZW50IHRvCisJYmUgdGhlIGFjdHVhbCBhcmdzIHRvIG1vdm0gaXRzZWxmLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4gIE9ubHkgc2V0CisJZmktPmZzci5yZWdzW3hdIGlmIHJlZyBYIGlzIHNhdmVkIGJ5IHRoZSBtb3ZtIGluc3RydWN0aW9uLgorCitGcmkgQXVnIDE0IDA0OjE4OjIzIDE5OTggIFBldGVyIFNjaGF1ZXIgIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4KKworCSogc29sLXRocmVhZC5jIChsd3BfdG9fdGhyZWFkKTogIEZpeCBlcnJvciBtZXNzYWdlIGZvciBmYWlsaW5nCisJdGRfdGFfbWFwX2x3cDJ0aHIgY2FsbC4KKwkocHNfbGdldExEVCk6ICBNYXNrIG9mZiB1cHBlciBiaXRzIGluIEdTIHJlZ2lzdGVyIHdoZW4gY29tcGFyaW5nCisJd2l0aCBzZWxlY3Rvci4KKworV2VkIEF1ZyAxMiAxNjozMDowMSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorIAorCSogcmVtb3RlLXNpbS5jIChzaW11bGF0b3JfY29tbWFuZCk6IFJlc2V0IHJlZ2lzdGVyIGNhY2hlIGFmdGVyCisJc2ltdWxhdG9yIGNvbW1hbmQuCisKK1dlZCBBdWcgMTIgMDk6MDA6MjYgMTk5OCAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmFieWxvbi01LmN5Z251cy5jb20+CisKKwkqIGV4cHByaW50LmMgKGR1bXBfcHJlZml4L3Bvc3RmaXhfZXhwcmVzc2lvbik6ICBEb24ndCB0cnkgdG8gcHJpbnQKKwl0eXBlIGV4cHJlc3Npb25zLgorCitUdWUgQXVnIDExIDExOjMzOjI1IDE5OTggIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgorCisJKiBjLXR5cGVwcmludC5jIChjX3ByaW50X3R5cGUpOiAgRG9uJ3QgY3Jhc2ggaWYgdmFyc3RyaW5nIGlzIG51bGwuCisJKiBleHBwcmludC5jIGV4cHJlc3Npb24uaCAoZHVtcF9leHByZXNzaW9uKTogIFJlbmFtZSB0bworCWR1bXBfcHJlZml4X2V4cHJlc3Npb24uIAorCSogUHJpbnQgb3V0IHRoZSBleHByZXNzaW9uIGluIG5vcm1hbCBmb3JtLiAgQ2FsbCBwcmludF9sb25nZXN0CisJaW5zdGVhZCBvZiB0cnlpbmcgdG8gZG8gaXQgb3Vyc2VsdmVzLgorCSogKGR1bXBfcG9zdGZpeF9leHByZXNzaW9uKTogIE5ldyBmdW5jdGlvbiwgcHJpbnRzIG91dCB0aGUgZXhwcmVzc2lvbgorCXdpdGggaW5kZW50YXRpb24gYW5kIGJldHRlciBmb3JtYXR0aW5nIGFuZCBpbnRlcnByZXRhdGlvbi4KKwkqIHBhcnNlLmMgKHBhcnNlX2V4cF8xKTogIFB1dCBjYWxscyB0byBkdW1wIGV4cHJlc3Npb25zIHVuZGVyIGlmZGVmCisJTUFJTlRFTkFOQ0VfQ01EUyBhbmQgZXhwcmVzc2lvbmRlYnVnIHZhcmlhYmxlLgorCitUaHUgQXVnIDYgMTM6MjA6MDIgMTk5OCAgUm9uIFVucmF1ICA8cnVucmF1QGN5Z251cy5jb20+CisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IHVzZSBzdG9wX2Z1bmNfbmFtZSBpbnN0ZWFkIG9mIAorCSAgc3RvcF9mdW5jX3N0YXJ0IHRvIGRlY2lkZSB0aGF0IG5vIGRlYnVnIGluZm8gZXhpc3RzLgorCitUaHUgSnVsIDMwIDEzOjUzOjUwIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogbWlwcy10ZGVwLmMgKG1hc2tfYWRkcmVzc19wKTogTmV3IHZhcmlhYmxlLgorCShtaXBzX2FkZHJfYml0c19yZW1vdmUpOiBUZXN0IG1hc2tfYWRkcmVzc19wIHRvIGRlY2lkZSB3aGV0aGVyCisJdG8gbWFzayBvZmYgdGhlIHVwcGVyIDMyIGJpdHMgb2YgYWRkcmVzc2VzLgorCShfaW5pdGlhbGl6ZV9taXBzX3RkZXApOiBBZGQgY29tbWFuZCB0byBzZXQgbWFza19hZGRyZXNzX3AuCisJKG1pcHNfY2FsbF9kdW1teV9hZGRyZXNzKTogTmV3IGZ1bmN0aW9uLgorCSogY29uZmlnL21pcHMvdG0tbWlwcy5oIChDQUxMX0RVTU1ZX0FERFJFU1MpOiBSZWRlZmluZSB0bworCWNhbGwgbWlwc19jYWxsX2R1bW15X2FkZHJlc3MuCisKKzE5OTgtMDctMjkgIEZlcm5hbmRvIE5hc3NlciAgPGZuYXNzZXJAdG90ZW0udG8uY3lnbnVzLmNvbT4KKworCSogc3ltZmlsZS5jIChhZGRfc3ltYm9sX2ZpbGVfY29tbWFuZCk6IFRlc3QgZm9yIHRoZSBmcm9tX3R0eQorCXBhcmFtZXRlciBhbmQgYXZvaWQgcXVlcnkgd2hlbiBub3QgaW50ZXJhY3RpdmUuCisKK01vbiBKdWwgMjcgMTY6MTE6NDIgMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogdHJhY2Vwb2ludC5jIChyZW1vdGVfc2V0X3RyYW5zcGFyZW50X3Jhbmdlcyk6IG5ldyBmdW5jdGlvbi4KKwlTZW5kIHRoZSBzdGFydCBhbmQgZW5kIGFkZHJlc3NlcyBvZiBhbGwgbG9hZGFibGUgcmVhZC1vbmx5CisJc2VjdGlvbnMgZG93biB0byB0aGUgdHJhY2UgdGFyZ2V0LCBzbyB0aGF0IGl0IGNhbiB0cmVhdCB0aGVtCisJYXMgInRyYW5zcGFyZW50IiAoaWUuIGRvbid0IGNhcmUgaWYgdGhleSB3ZXJlIGNvbGxlY3RlZCBvciBub3QpLgorCitNb24gSnVsIDI3IDE1OjM4OjA3IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogbW4xMDMwMC10ZGVwLmMgKG1uMTAzMDBfYW5hbHl6ZV9wcm9sb2d1ZSk6IFVuZG8gcHJldmlvdXMgZml4CisJZm9yIHNldHRpbmcgZnJhbWUgYWRkcmVzcyBpbiBvcHRpbWl6ZWQgY29kZTsgbWFkZSB1bm5lY2Vzc2FyeQorCWJ5IGNvbXBpbGVyIGZpeGVzLgorCitNb24gSnVsIDI3IDEwOjQ1OjU2IDE5OTggIE1hcnRpbiBNLiBIdW50ICA8aHVudEBjeWdudXMuY29tPgorCisJKiBzeW10YWIuYyAoZGVjb2RlX2xpbmVfMSk6IEZvciBtaW5pbWFsIHN5bWJvbCwgY2FsbCAKKwlmaW5kX3BjX3NlY3RfbGluZSgpIHRvIG1ha2Ugc3VyZSB0aGUgbGluZSBudW1iZXIgZ2V0cyBzZXQgCisJcHJvcGVybHkuCisJKHByaW50X3N5bWJvbF9pbmZvKTogUmVkZWNsYXJlIGZ1bmN0aW9uIHZvaWQuCisKKzE5OTgtMDctMjcgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2QxMHYvdG0tZDEwdi5oIChSRUdJU1RFUl9OQU1FUyk6IHNwIC0+IHIxNS4gIFRoZQorCXN0YWNrIHBvaW50ZXIgZXQgYWwgYXJlIHN5bnRoZXNpemVkIGZyb20gdGhlIFNQX1JFR05VTSAoZXRjKQorCWRlZmluZXMgYW5kIHNob3VsZCBub3QgYmUgbWVudGlvbmVkIGluIFJFR0lTVEVSX05BTUVTLgorCitGcmkgSnVsIDI0IDE0OjQxOjE5IDE5OTggIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIHRyYWNlcG9pbnQuYyAoZW5jb2RlX2FjdGlvbnMpOiBUcmVhdCByZWdpc3RlciBuYW1lcyBhbmQgc2ltcGxlCisJdmFyaWFibGUgbmFtZXMgYXMgc3BlY2lhbCBjYXNlcyBhbmQgZG9uJ3QgY29udmVydCB0aGVtIHRvIGJ5dGUtCisJY29kZXM6IHRoZXNlIHRoaW5ncyBjYW4gYmUgY29sbGVjdGVkIGZhciBtb3JlIGVmZmljaWVudGx5IAorCXdpdGhvdXQgaW52b2tpbmcgdGhlIGJ5dGVjb2RlIGludGVycHJldGVyLgorCitGcmkgSnVsIDI0IDEzOjMyOjQ2IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2kzODYvdG0taTM4Ni5oIChTVE9SRV9TVFJVQ1RfUkVUVVJOKTogTWFrZSBpdAorCXdvcmsgb24gaG9zdHMgb2YgYW55IGVuZGlhbm5lc3MuCisJKiBjb25maWcvaTM4Ni90bS1pMzg2di5oOiBEaXR0by4KKworRnJpIEp1bCAyNCAwNzo0MToxMiAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIG1uMTAzMDAtdGRlcC5jIChzZXRfbW92bV9vZmZzZXRzKTogTmV3IGhlbHBlciBmdW5jdGlvbgorCWZvciBtbjEwMzAwX2FuYWx5emVfcHJvbG9ndWUuCisJKG1uMTAzMDBfYW5hbHl6ZV9wcm9sb2d1ZSk6IFNpbXBsaWZ5IGJ5IGZhY3RvcmluZyBvdXQgY29tbW9uIGNvZGUuCisJRml4IGJ1Z3MgaW4gc2V0dGluZyBmcmFtZSBhZGRyZXNzIGZvciBvcHRpbWl6ZWQgY29kZS4KKwlVc2UgcmVhZF9tZW1vcnlfbm9icHQgaW5zdGVhZCBvZiB0YXJnZXRfcmVhZF9tZW1vcnkuCisKK1RodSBKdWwgMjMgMTc6MDE6MTcgMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogdHJhY2Vwb2ludC5jIChjb2xsZWN0X3N5bWJvbCk6IGhhbmRsZSBMT0NfQVJHIGNhc2UuCisKK1RodSBKdWwgMjMgMTU6MDc6NDAgMTk5OCAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBzcGFyYy10ZGVwLmMgKHNwYXJjX2luaXRfZXh0cmFfZnJhbWVfaW5mbyk6IFJlY29nbml6ZSB3aGVuIHdlJ3JlCisJaW4gYSBmdW5jdGlvbiBwcm9sb2d1ZSBiZWZvcmUgdGhlIFNBVkUgaW5zdHJ1Y3Rpb24uCisJKHNwYXJjX2ZyYW1lX3NhdmVkX3BjKTogRGl0dG8uCisJKiBjb25maWcvc3BhcmMvdG0tc3BhcmMuaCAoRVhUUkFfRlJBTUVfSU5GTyk6IEFkZCBpbl9wcm9sb2d1ZSBmbGFnLgorCitUaHUgSnVsIDIzIDE0OjU4OjA5IDE5OTggIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KKworCSogaTM4Ni10ZGVwLmMgKGkzODZfZ2V0X2ZyYW1lX3NldHVwKTogUmVjb2duaXplIGZ1bmN0aW9uCisJcHJvbG9ndWVzIGluIGNvZGUgY29tcGlsZWQgd2l0aCAtZmNoZWNrLXN0YWNrLgorCitUaHUgSnVsIDIzIDE0OjQ5OjI3IDE5OTggIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLW1pcHMuYyAocmVtb3RlX21pcHNfaW5zZXJ0X2h3X2JyZWFrcG9pbnQsCisJcmVtb3RlX21pcHNfcmVtb3ZlX2h3X2JyZWFrcG9pbnQpOiBOZXcgZnVuY3Rpb25zIGZvciBoYXJkd2FyZQorCWJyZWFrcG9pbnRzIG9uIExTSSB0YXJnZXRzLgorCSogY29uZmlnL21pcHMvdG0tZW1iZWQuaCAodGFyZ2V0X3JlbW92ZV9od19icmVha3BvaW50LAorCXRhcmdldF9pbnNlcnRfaHdfYnJlYWtwb2ludCk6IERlZmluZSB0byBjYWxsCisJcmVtb3RlX21pcHNfaW5zZXJ0X2h3X2JyZWFrcG9pbnQgYW5kIHJlbW90ZV9taXBzX3JlbW92ZV9od19icmVha3BvaW50LAorCXJlc3BlY3RpdmVseS4KKworMTk5OC0wNy0yMSAgRmVybmFuZG8gTmFzc2VyICA8Zm5hc3NlckB0b3RlbS50by5jeWdudXMuY29tPgorCisJKiBzb3VyY2UuYyAocHJpbnRfc291cmNlX2xpbmVzKTogUHJpbnQgIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiCisJanVzdCBvbmNlLgorCShkaXJlY3RvcnlfY29tbWFuZCk6IHNhbWUgYXMgYWJvdmU7IHJlc2V0cyBpZiB1c2VyIGlzc3VlcyBkaXIuCisKK1N1biBKdWwgMTkgMDI6MTE6NDUgMTk5OCAgTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+CisKKwkqIHN5bXRhYi5jIChkZWNvZGVfbGluZV8yKTogSW5zdGVhZCBvZiBwcmludGluZyBhIHByb21wdAorCWFuZCBjYWxsaW5nIGNvbW1hbmRfbGluZV9pbnB1dCgpIHdpdGhvdXQgYSBwcm9tcHQsIGp1c3QKKwljYWxsIGl0IHdpdGggdGhlIHByb3BlciBhcmdzLiAgVGhpcyBtYWtlcyB0aGUgR1VJIHdvcmsgdG9vLgorCitGcmkgSnVsIDE3IDk6MjY6NTAgMTk5OCAgUm9uIFVucmF1ICA8cnVucmF1QGN5Z251cy5jb20+CisKKwkqIGJsb2NrZnJhbWUuYyAoZmluZF9wY19zZWN0X3BhcnRpYWxfZnVuY3Rpb24pOiBhbGxvdyBmb3IgdGhlIHBvc3NpLQorCSAgYmlsaXR5IG9mIG11bHRpcGxlIHN5bWJvbHMgYXQgdGhlIHNhbWUgYWRkcmVzcyB3aGVuIGZpbmRpbmcgaGlnaC4KKwkqIGJyZWFrcG9pbnQuYyAocmVzb2x2ZV9zYWxfcGMpOiBpZiB0aGUgZnVuY3Rpb24gYmFzZWQgc2VjdGlvbiBsb29rdXAKKwkgIGZhaWxzLCB0cnkgZ2V0dGluZyB0aGUgc2VjdGlvbiBmcm9tIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZS4KKwkqIHBhcnNlLmMgKHdyaXRlX2V4cF9tc3ltYm9sKTogdXNlIHN5bWJvbF9vdmVybGF5ZWRfYWRkcmVzcyB0byBnZXQKKwkgIHRoZSBMTUEgb2YgYSBtaW5pbWFsIHN5bWJvbCBpZiB1bm1hcHBlZC4KKwkqIHN5bXRhYi5jIChmaW5kX2xpbmVfc3ltdGFiKTogY2hhbmdlIGludGVyZmFjZSB0byByZXR1cm4gc3ltdGFiIAorCSAgY29udGFpbmluZyB0aGUgYmVzdCBsaW5ldGFibGUgZm91bmQuCisJICAoZGVjb2RlX2xpbmVfMSk6IHVzZSBmaW5kX2xpbmVfc3ltdGFiIHRvIHNldCB2YWwuc3ltdGFiLiBUaGlzIHNob3VsZAorCSAgaW1wcm92ZSBzdXBwb3J0IGZvciBzb3VyY2UgZmlsZXMgd2l0aCBtdWx0aXBsZSBzeW10YWJzLgorCitXZWQgSnVsIDE1IDExOjUxOjMzIDE5OTggIEtlaXRoIFNlaXR6ICA8a2VpdGhzQGN5Z251cy5jb20+CisKKwkqIG1haW4uYyAobWFpbik6IEZpeCB2aW9sYXRpb25zIG9mIEdOVSBjb2Rpbmcgc3RhbmRhcmQuCisKKwkqIGJyZWFrcG9pbnQuYzogRXhwb3J0IGRlbGV0ZV9jb21tYW5kLgorCisJKiBpbmZjbWQuYzogRXhwb3J0IGNvbnRpbnVlX2NvbW1hbmQsIHN0ZXBpX2NvbW1hbmQsIGFuZCBuZXh0aV9jb21tYW5kLgorCisJKiBNYWtlZmlsZS5pbjogQWRkIHRhcmdldCBmb3Igdjg1MGljZS5vLgorCisJKiBjb25maWd1cmUudGd0OiBBZGQgY3lnd2luMzIgZGVwZW5kZW5jaWVzIGZvciB2ODUwIGljZS4KKworV2VkIEp1bCAxNSAxMDo1ODoyOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiB0cmFjZXBvaW50LmMgKHNldF9yYXdfdHJhY2Vwb2ludCk6IENvcGUgd2l0aCBzeW1ib2xzIHRoYXQgZG8gbm90CisJaGF2ZSBhbiBhc3NvY2lhdGVkIGRpcmVjdG9yeS4KKworTW9uIEp1bCAxMyAxNToyMTowNCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIHV0aWxzLmMgKHB1dHNfZGVidWcpOiBEaXNwbGF5IG5vbi1wcmludGFibGUgY2hhcmFjdGVycyBpbiBoZXgKKwlpbnN0ZWFkIG9mIG9jdGFsLgorCitUaHUgSnVsICA5IDE2OjE2OjQ3IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDMwMC10ZGVwLmMgKG1uMTAzMDBfZ2VuZXJpY19yZWdpc3Rlcl9uYW1lcyk6IE5ldyB2YXJpYWJsZS4KKwkoc2V0X21hY2hpbmVfaG9vayk6IE5ldyBmdW5jdGlvbi4gIENvcHkgdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyCisJbmFtZXMgaW50byByZWdfbmFtZXMuCisJKF9pbml0aWFsaXplX21uMTAzMDBfdGRlcCk6IFNldCB1cCB0byBjYWxsIHNldF9tYWNoaW5lX2hvb2suCisJKiB0bS1tbjEwMzAwIChOVU1fUkVHUyk6IEJ1bXAgdG8gMzIuCisJKFJFR0lTVEVSX05BTUVTKTogVXBkYXRlZCBhY2NvcmRpbmdseS4KKworCitUdWUgSnVsIDcgNzo0MDoxMyAxOTk4ICBSb24gVW5yYXUgIDxydW5yYXVAY3lnbnVzLmNvbT4KKworCSogc3ltdGFiLmMgKGZpbmRfcGNfc2VjdF9wc3ltYm9sKTogYWxsb3cgY2FzZSB3aGVyZSB0ZXh0bG93IGlzIDAKKworVGh1IEp1bCAgMiAxNTo1Nzo1OCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBicmVha3BvaW50LmMgKHJlc29sdmVfc2FsX3BjKTogQWNjZXB0IGFic2VuY2Ugb2YgaW5uZXJtb3N0CisJTGV4aWNhbCBibG9jayBmb3IgYnJlYWtwb2ludCByZXNvbHV0aW9uLgorCitUaHUgSnVsIDIgMTA6MjI6MDAgMTk5OCAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBtZGVidWdyZWFkLmMgKHBhcnNlX3BhcnRpYWxfc3ltYm9scyk6IEdvIGFoZWFkIGFuZCByZWFkIHRoZSAubWRlYnVnCisJc2VjdGlvbiwgYnV0IGp1c3QgZG9uJ3QgYWRkIGEgMm5kIG1pbmltYWwgc3ltYm9sIGlmIHRoaXMgaXMgYW4gLm1kZWJ1ZyAKKwlzZWN0aW9uIGluIGFuIEVMRiBmaWxlLgorCisxOTk4LTA3LTAxICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChheC1nZW5lcmFsLm8pOiBEZXBlbmQgb24gJChkZWZzX2gpIHRvby4KKwkoYXhfaCk6IEJvdGhlciB0byBkZWZpbmUgdGhpcy4KKworTW9uIEp1biAyOSAxOTowMToxOCAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBnbnUtcmVnZXguYyAocmVfY29tcCk6IEFkZCBjYXN0IHRvIGNoYXIgKiBiZWZvcmUgZ2V0dGV4dCBjYWxscy4KKworU3VuIEp1biAyOCAxMTozNTo0OCAxOTk4ICBQZXRlciBTY2hhdWVyICA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+CisKKwlJbXByb3ZlIHN1cHBvcnQgZm9yIFN1blBybyBGNzcuCisJKiBkYnhyZWFkLmMgKGVuZF9wc3ltdGFiLCBwcm9jZXNzX29uZV9zeW1ib2wpOiAgSGFuZGxlIG1pbmltYWwKKwlzeW1ib2xzIHdpdGggdHJhaWxpbmcgdW5kZXJzY29yZSBuYW1lcy4KKwkqIG1pbnN5bXMuYyAoZmluZF9zdGFiX2Z1bmN0aW9uX2FkZHIpOiAgRGl0dG8uCisJKiBkYnhyZWFkLmMgKHByb2Nlc3Nfb25lX3N5bWJvbCk6ICBJZ25vcmUgTl9BTElBUyBmb3Igbm93LgorCSogcGFydGlhbC1zdGFiLmggKGNhc2UgTl9BTElBUyk6ICBEaXR0by4KKwkqIHN0YWJzcmVhZC5jIChyZWFkX3N1bl9idWlsdGluX3R5cGUpOiAgSGFuZGxlIGJvb2xlYW4gdHlwZXMuCisKK0ZyaSBKdW4gMjYgMTQ6MDM6MDEgMTk5OCAgS2VpdGggU2VpdHogIDxrZWl0aHNAY3lnbnVzLmNvbT4KKworCSogc3ltdGFiLmggKGVudW0gbmFtZXNwYWNlKTogQWRkIG5ldyBuYW1lc3BhY2VzIEZVTkNUSU9OU19OQU1FU1BBQ0UsCisJVFlQRVNfTkFNRVNQQUNFLCBNRVRIT0RTX05BTUVTUEFDRSwgYW5kIFZBUklBQkxFU19OQU1FU1BBQ0UgdXNlZCBieQorCW5ldyBzZWFyY2hfc3ltYm9scy4KKwlBZGQgcHJvdG90eXBlIGZvciBzZWFyY2hfc3ltYm9scyBhbmQgZnJlZV9zZWFyY2hfc3ltYm9scy4KKworCSogc3ltdGFiLmMgKGxpc3Rfc3ltYm9scyk6IFJld3JpdGUgdG8gdXNlIG5ldyBzZWFyY2hfc3ltYm9scy4KKwkoZmlsZV9tYXRjaGVzKTogTmV3IGhlbHBlciBmdW5jdGlvbiBmb3Igc2VhcmNoX3N5bWJvbHMuCisJKGZyZWVfc2VhcmNoX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24gd2hpY2ggZnJlZXMgZGF0YSByZXR1cm5lZCBmcm9tCisJc2VhcmNoX3N5bWJvbHMuCisJKHByaW50X3N5bWJvbF9pbmZvKTogTmV3IGhlbHBlciBmdW5jdGlvbiB3aGljaCBwcmludHMgaW5mbyBhYm91dCBhCisJbWF0Y2hlZCBzeW1ib2wgdG8gc3Rkb3V0LiBFeHRyYWN0ZWQgZnJvbSBvbGQgbGlzdF9zeW1ib2xzLgorCShwcmludF9tc3ltYm9sX2luZm8pOiBOZXcgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHByaW50cyBpbmZvIGFib3V0CisJYSBtYXRjaGVkIG1zeW1ib2wgdG8gc3Rkb3V0LiBFeHRyYWN0ZWQgZnJvbSBvbGQgbGlzdF9zeW1ib2xzLgorCShzeW10YWJfc3ltYm9sX2luZm8pOiBFeHRyYWN0ZWQgZnJvbSBvbGQgbGlzdF9zeW1ib2xzLgorCSh2YXJpYWJsZXNfaW5mbyk6IFVzZSBzeW10YWJfc3ltYm9sX2luZm8uCisJKGZ1bmN0aW9uc19pbmZvKTogVXNlIHN5bXRhYl9zeW1ib2xfaW5mby4KKwkodHlwZXNfaW5mbyk6IFVzZSBzeW10YWJfc3ltYm9sX2luZm8uCisJKHJicmVha19jb21tYW5kKTogUmV3cml0ZSB0byB1c2UgbmV3IHNlYXJjaF9zeW1ib2xzLgorCitUaHUgSnVuIDI1IDIyOjM4OjMyIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIG1pcHMtdGRlcC5jIChtaXBzX3B1c2hfYXJndW1lbnRzKTogVXNlIDEyOC1iaXQgc3RhY2sgZnJhbWUKKwlhbGlnbm1lbnQgZm9yIGluZmVyaW9yIGNhbGxzLgorCitXZWQgSnVuIDI0IDIzOjE3OjEyIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogbW4xMDIwMC10ZGVwLmMgKG1uMTAyMDBfYW5hbHl6ZV9wcm9sb2d1ZSk6IEZpeCBjYWxjdWxhdGlvbgorCW9mIGpzciB0YXJnZXQgYWRkcmVzcy4KKworVHVlIEp1biAyMyAxOTozNzo0NiAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9tbjEwMjAwL3RtLW1uMTAyMDAuaCAoU0FWRURfUENfQUZURVJfQ0FMTCk6ICBEb24ndAorCXplcm8gdXBwZXIgYnl0ZSBvZiBhZGRyZXNzLgorCitUdWUgSnVuIDIzIDE3OjMyOjI2IDE5OTggIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIHJzNjAwMC10ZGVwLmMgKHBvcF9kdW1teV9mcmFtZSk6IHVzZSBtZW1jcHkuIAorCShwdXNoX2FyZ3VtZW50cyk6IHVzZSBtZW1zZXQuCisJKHZhcmlvdXMgb3RoZXIgcGxhY2VzKTogZml4IHVwIGluZGVudGF0aW9uIGFuZCBsb25nIGxpbmVzLgorCitUdWUgSnVuIDIzIDExOjU4OjM1IDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IHMvbFhleHQvLWxYZXh0LyBmb3IgSmlsbGlhbidzIGNoYW5nZS4KKworVHVlIEp1biAyMyAxMToxNDowNCAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBzb3VyY2UuYyAoZmluZF9zb3VyY2VfbGluZXMpOiBmaXggaW5kZW50YXRpb24uCisKKwkqIGNvbmZpZy9taXBzL3RtLWlyaXg1Lmg6IE1vZGlmeSB0byB3b3JrIGJldHRlciBvbiBpcml4IDYsIGJ5CisJbWFraW5nIEZQIHJlZ2lzdGVycyA4IGJ5dGVzIGluc3RlYWQgb2YgNC4KKwlSRUdJU1RFUl9CWVRFUzogcmVkZWZpbmUuICBSRUdJU1RFUl9CWVRFKCk6IHJlZGVmaW5lLgorCVJFR0lTVEVSX1ZJUlRVQUxfVFlQRTogcmVkZWZpbmUuICBNSVBTX0xBU1RfQVJHX1JFR05VTTogcmVkZWZpbmUuCisJKiBpcml4NS1uYXQuYyAoZmV0Y2hfY29yZV9yZWdpc3RlcnMpOiByZWFkIDggYnl0ZXMgcGVyIEZQIHJlZ2lzdGVyLgorCSogbWlwcy10ZGVwLmMgKEZQX1JFR0lTVEVSX0RPVUJMRSk6IG5ldyBtYWNybyB0byBkaXN0aW5ndWlzaCAKKwl0YXJnZXRzIHdpdGggOC1ieXRlIEZQIHJlZ2lzdGVycyAoZG9uJ3QgdXNlIFRBUkdFVF9NSVBTNjQpLgorCShTVEFDS19BUkdTSVpFKTogbmV3IG1hY3JvLCBob3cgbXVjaCBzcGFjZSBpcyB0YWtlbiB1cCBvbiB0aGUKKwlzdGFjayBmb3IgZWFjaCBmdW5jdGlvbiBhcmd1bWVudCAoZG9uJ3QgdXNlIFRBUkdFVF9NSVBTNjQpLgorCShtaXBzX3B1c2hfYXJndW1lbnRzKTogbW9kaWZ5IGxvZ2ljIHRvIHdvcmsgYmV0dGVyIG9uIElyaXggNgorCShuMzIgQUJJKS4KKworVHVlIEp1biAyMyAxMjoyOTo1MyAxOTk4ICBKaWxsaWFuIFllICA8amlsbGlhbkBjeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlndXJlLmluOiBBZGQgLWxYZXh0IHRvIG1pcHNfZXh0cmFfbGlicworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKyAgIAorU3VuIEp1biAyMSAwOTozMToxMiAxOTk4ICBSb24gVW5yYXUgIChydW5yYXVAY3lnbnVzLmNvbSkKKworCSogc3ltdGFiLmMgKGZpbmRfbGluZV9wYyk6IGFzc3VtZWQgdGhhdCBhIFBDIG9mIDAgaXMgaWxsZWdhbC4KKyAgCUNoYW5nZWQgdG8gcGFzcyBQQyBhcyBhcmcgYW5kIHJldHVybiAxIGlmIHZhbGlkICgwIG90aGVyd2lzZSkuCisJKiBzeW10YWIuaDogQ2hhbmdlIHByb3RvdHlwZSB0byBtYXRjaC4KKwkqIHN5bXRhYi5jIChmaW5kX2xpbmVfcGNfcmFuZ2UpOiBVc2UgbmV3IGludGVyZmFjZS4KKwkqIGJyZWFrcG9pbnQuYyAocmVzb2x2ZV9zYWxfcGMpOiBEaXR0by4KKworV2VkIEp1biAxNyAxNTo1MDowMCAxOTk4ICBSb24gVW5yYXUgIChydW5yYXVAY3lnbnVzLmNvbSkKKworCSogcGFyc2UuYyAodGFyZ2V0X21hcF9uYW1lX3RvX3JlZ2lzdGVyKTogQ2hlY2sgdGFyZ2V0IHNwZWNpZmljIAorCSAgYWxpYXNlcyAqZmlyc3QqIHNvIHRoYXQgaXQgY2FuIG92ZXItcmlkZSBhcmNoaXRlY3R1cmFsIG5hbWVzCisKK1dlZCBKdW4gMTcgMTc6MTM6MzggMTk5OCAgU2FpZCBaaW91YW5pICAoc2FpZHpAcGFyay1zdHJlZXQuY3lnbnVzLmNvbSkKKworCSogcmVtb3RlLXNkcy5jIChzZHNfc3RhcnRfcmVtb3RlKTogRml4IHByaW50ZiBjYWxsLgorCitUdWUgSnVuIDE2IDE2OjMyOjA4IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogbW4xMDIwMC10ZGVwLmMgKG1uMTAyMDBfYW5hbHl6ZV9wcm9sb2d1ZSk6IEZpeCBudWxsIHBvaW50ZXIKKwljcmFzaCB3aGVuIGluICJzdGFydCIuCisKK1R1ZSBKdW4gMTYgMTQ6Mzg6NDAgMTk5OCAgUm9uIFVucmF1ICAocnVucmF1QGN5Z251cy5jb20pCisKKwkqIGRieHJlYWQuYzogcmVzZXQgZnVuY3Rpb25fc3RhcnRfb2Zmc2V0IGFmdGVyIGEgZmluaXNoaW5nIE5fRlVOIAorCSAgaXMgc2Vlbi4KKwkqIHJlbW90ZS1zaW0uYzogYWxsb3cgVEFSR0VUX1JFREVGSU5FX0RFRkFVTFRfT1BTIHRvIG92ZXJyaWRlCisJICB0YXJnZXQgdmVjdG9ycyBhcyBuZWVkZWQuCisKK1N1biBKdW4gMTQgMDg6NDY6MjUgMTk5OCAgUm9uIFVucmF1ICAocnVucmF1QGN5Z251cy5jb20pCisKKwkqIHBhcnRpYWwtc3RhYi5oOiAnRicgYW5kICdmJyB0eXBlIE5fRlVOIHBzeW1ib2xzIHNob3VsZCBwYXNzCisJICBDVVJfU1lNQk9MX1ZBTFVFIGFzIENPUkVfQUREUiBpbnN0ZWFkIG9mIGxvbmcKKwkqIGJ1aWxkc3ltLltjaF06IGV4cG9ydCBwZW5kaW5nX2Jsb2NrcyBsaXN0CisKK1NhdCBKdW4gMTMgMTM6MDI6MzIgMTk5OCAgRGF3biBQZXJjaGlrIChkYXduQGN5Z251cy5jb20pCisKKwkqIHJlbW90ZS5jOiBGaXggcmVtb3RlIGhlbHAgc3RyaW5nIHRvIG1hdGNoIHRoYXQgb2YgaGVscC5leHAuCisKK0ZyaSBKdW4gMTIgMTQ6MjI6NTUgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAoTElCUyk6IEFkZCAtbHcgdG8gdGhlIGxpc3Qgb2YgbGlicmFyaWVzIGlmIG5lZWRlZC4KKworVGh1IEp1biAxMSAxNTowNToxMCAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogYnRvd2MuYzogUmVtb3ZlZC4KKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2VlIGlmIHdlIG5lZWQgdG8gcmVwbGFjZSBidG93YygpLgorCSogTWFrZWZpbGUuaW46IERvbid0IGluY2x1ZGUgTElCT0JKUy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBnbnUtcmVnZXguYyAocmVnZXhfY29tcGlsZSk6IE9ubHkgc3VwcG9ydCBpMThuIFs6Zm9vOl0gaWYKKwl3ZSBoYXZlIGJ0b3djKCkuCisKK1dlZCBKdW4gMTAgMTU6Mzk6MTQgMTk5OCAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmFieWxvbi01LmN5Z251cy5jb20+CisKKwkqIGMtZXhwLnk6ICBGaXggcHJvYmxlbXMgd2l0aCBwYXJzaW5nICInZm9vLmJhcic6OmZ1bmMiLiAgCisJU29tZSBsYW5ndWFnZXMgYWxsb3cgc3ltYm9scyB3aXRoIGRvdHMuCisKKwkqIGdkYnR5cGVzLmMgKGNoZWNrX3N0dWJfbWV0aG9kKTogIENvc21ldGljLiAgVXNlIG1vcmUgZGVzY3JpcHRpdmUKKwluYW1lcyBmb3IgcGFyYW1ldGVycy4KKworCSoganYtZXhwLnk6ICBQYXJzZXIgbm93IGFjY2VwdHMgcHJpbWl0aXZlIHR5cGVzLgorCSogKHBhcnNlX251bWJlcik6ICBVc2UgY29ycmVjdCBpZmRlZiBmb3Igc2NhbmYgbG9uZyBkb3VibGUgc3VwcG9ydC4KKwkqIGp2LWxhbmcuYyAoamF2YV9hcnJheV90eXBlKTogIEluaXRpYWwgY3V0IGF0IGFycmF5IHN1cHBvcnQuCisKKwkqIGxhbmd1YWdlLmMgbGFuZ3VhZ2UuaCAoc2V0X2xhbmd1YWdlKTogIE5vdyByZXR1cm5zIHByZXZpb3VzIGxhbmd1YWdlLgorCisJKiBzeW10YWIuYyAoZmluZF9tZXRob2RzKTogIE1ha2Ugc3RhdGljLiAgQ29zbWV0aWMgY2hhbmdlcywgaW5jbHVkaW5nCisJaW5kZW50YXRpb24sIGFuZCBhZGRpbmcgZGVzY3JpcHRpdmUgY29tbWVudHMuICBNb3ZlIGxvY2FsIHZhcmlhYmxlIAorCWRlZnMgaW50byB0aGUgYmxvY2sgdGhleSBhcmUgdXNlZCBpbi4KKwkqIERvbid0IGNhbGwgY2hlY2tfc3R1Yl9tZXRob2QgYW55IG1vcmUuICBVc2UgZ2RiX21hbmdsZV9uYW1lIHRvCisJZ2VuZXJhdGUgdGhlIGZ1bGwgbWV0aG9kIG5hbWUuICBmaW5kX21ldGhvZCBkb2Vzbid0IG5lZWQgYWxsIHRoZSBvdGhlcgorCWdvb2JsZGVnb29rIHRoYXQgY2hlY2tfc3R1Yl9tZXRob2QgZG9lcy4KKwkqIChnZGJfbWFuZ2xlX25hbWUpOiAgVXNlIG1vcmUgZGVzY3JpcHRpdmUgbmFtZXMgZm9yIHBhcmFtZXRlcnMuICBGaXgKKwljb21tZW50LgorCSogKGxvb2t1cF9wYXJ0aWFsX3N5bWJvbCBsb29rdXBfYmxvY2tfc3ltYm9sKTogIENoZWNrIGZvciBqYXZhIHRvCisJZW5zdXJlIHdlIGNhbiBmaW5kIG1hbmdsZWQgbmFtZXMuCisJKiAoZGVjb2RlX2xpbmVfMSk6ICBNb3ZlIGxvY2FsIHZhcmlhYmxlIGRlZnMgaW50byB0aGUgYmxvY2sgdGhleSBhcmUKKwl1c2VkIGluLiAgKEltcHJvdmVzIGNvZGUgcmVhZGFiaWxpdHkuKQorCitXZWQgSnVuIDEwIDE4OjA0OjM1IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisgCisJKiBnZGJ0eXBlcy5jIChnZXRfZGlzY3JldGVfYm91bmRzKTogQXNzaWduIHVuc2lnbmVkIHR5cGUgZmxhZyBmb3IKKwlhbGwtcG9zaXRpdmUgZW51bS4KKwkoY3JlYXRlX3NldF90eXBlKTogRGl0dG8gZm9yIGFsbC1wb3NpdGl2ZSBzZXQgdmFsdWVzLgorCSogdmFsdWVzLmMgKHVucGFja19maWVsZF9hc19sb25nKTogQ2hlY2sgZm9yIHR5cGVkZWYgaW4gc3RydWN0CisJZmllbGQgdW5wYWNraW5nLgorCitXZWQgSnVuIDEwIDE0OjA2OjA1IDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IEFkZCBzb21lIHRlc3RzIGZvciBnbnUtcmVnZXguYydzIGJlbmVmaXQuCisJU2VlIGlmIGJ0b3djKCkgZnVuY3Rpb24gaXMgcHJvdmlkZWQgaW4gQyBsaWJyYXJ5LgorCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlZ2VuZXJhdGVkLgorCSogTWFrZWZpbGUuaW4gKENMSUJTLCBDREVQUyk6IEFkZCBATElCT0JKU0AgdG8gYnVpbGQgYnRvd2MuYworCWlmIG5lY2Vzc2FyeS4KKwkqIGJ0b3djLmM6IE5ldyBmaWxlLgorCisJKiBnbnUtcmVnZXguYzogUmVvcmRlciB3Y2hhci5oIGFuZCB3Y3R5cGUuaCBpbmNsdWRlcyBmb3IgU29sYXJpcycKKwliZW5lZml0LgorCURyb3AgbmFtZXNwYWNlIHByZXNlcnZpbmcgZGVmaW5lcyBmb3Igbm93LgorCitXZWQgSnVuIDEwIDExOjUzOjQyIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBnbnUtcmVnZXguYzogSW5jbHVkZSAiZ251LXJlZ2V4LmgiLCBub3QgInJlZ2V4LmgiLgorCitXZWQgSnVuIDEwIDExOjM0OjA3IDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBnbnUtcmVnZXguYywgZ251LXJlZ2V4Lmg6IENoYW5nZSBMR1BMIGxpY2Vuc2UgdG8gR1BMIGxpY2Vuc2UKKwl0byBzdGF5IGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiBHREIuCisKK1dlZCBKdW4gMTAgMTE6Mjc6MzkgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIGdudS1yZWdleC5jLCBnbnUtcmVnZXguaDogVXBkYXRlIHRvIGN1cnJlbnQgRlNGIChnbGliYykgdmVyc2lvbnMuCisKK1dlZCBKdW4gMTAgMTA6NTg6MTggMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogcHJpbnRjbWQuYyAoZGlzYXNzZW1ibGVfY29tbWFuZCk6IG1vdmUgb3ZlcmxheSBtYXBwaW5nIGNvZGUKKwkidXAiIGludG8gZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uLgorCSogYmxvY2tmcmFtZS5jIChmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24pOiBhZGp1c3Qgc3RhcnQgYWRkcmVzcworCWFuZCBlbmQgYWRkcmVzcyBmb3Igb3ZlcmxheXMgKG1hcHBlZCB2cy4gdW5tYXBwZWQgYWRkcmVzc2VzKSwKKwlzbyB0aGF0IGFsbCBjYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gbWF5IGJlbmVmaXQuCisJKiBtMzJyLXRkZXAuYyAobTMycl9za2lwX3Byb2xvZ3VlKTogYWRqdXN0IGluZGVudGF0aW9uLgorCitNb24gSnVuICA4IDE2OjA4OjEwIDE5OTggIFJvbiBVbnJhdSAgPHJ1bnJhdUBjeWdudXMuY29tPgorCisJKiBvYmpmaWxlcy5jIChhZGRfdG9fb2JqZmlsZV9zZWN0aW9ucyk6IEFsbCB0YXJnZXRzIHRvIGRlZmluZQorCSAgVEFSR0VUX0tFRVBfU0VDVElPTiB0byBwZXJtaXQgdGhlbSB0byByZXRhaW4gYmZkIHNlY3Rpb25zIHRoYXQKKwkgIEdEQiB3b3VsZCBvdGhlcndpc2UgaGF2ZSBkaXNjYXJkZWQuCisKK0ZyaSBKdW4gIDUgMTM6NTY6MTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZGJ4cmVhZC5jIChyZWFkX2RieF9zeW10YWIpOiBEb24ndCBsb3dlciB0ZXh0aGlnaCBmb3IgbGFzdCBwc3ltdGFiLgorCitUaHUgSnVuICA0IDE4OjM1OjA0IDE5OTggIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLmMgKGluaXRfZXh0ZW5kZWRfcmVtb3RlX29wcyk6IE1ha2UgZXh0ZW5kZWRfcmVtb3RlX29wcworCWJ5IGNvcHlpbmcgZnJvbSByZW1vdGVfb3BzLCBtb3ZlIGl0IGFuZCBpbml0X3JlbW90ZV9vcHMgdG8KKwl1c3VhbCBwbGFjZSBhdCBlbmQgb2YgZmlsZSwgcmVtb3ZlICJ2b2lkIiBmcm9tIGFyZyBsaXN0cy4KKworVGh1IEp1biAgNCAxNzo1MTowNiAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIHNwYXJjLXRkZXAuYyAoc3BhcmNfZml4X2NhbGxfZHVtbXkpOiBCeXRlLXN3YXAgdGhlIGNhbGwgZHVtbXkKKwlvbiBiaS1lbmRpYW4gbWFjaGluZXMuCisJKHNwYXJjX2V4dHJhY3RfcmV0dXJuX3ZhbHVlKTogSGFuZGxlIHZhbHVlcyBzbWFsbGVyIHRoYW4gaW50IG9uCisJbWFjaGluZXMgd2l0aCBsaXR0bGUtZW5kaWFuIGRhdGEuCisJKHNwYXJjX3RhcmdldF9hcmNoaXRlY3R1cmVfaG9vayk6IFNldCBiaV9lbmRpYW4gZmxhZy4KKworVGh1IEp1biAgNCAxMjoxNDo0OCAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBwcmludGNtZC5jIChkaXNhc3NlbWJsZV9jb21tYW5kKTogRml4IG9mZi1ieS1vbmUgZXJyb3IgZm9yCisJZGlzYXNzZW1ibGluZyBmdW5jdGlvbnMgaW4gdW5tYXBwZWQgb3ZlcmxheSBzZWN0aW9ucy4KKworVGh1IEp1biAgNCAxMDoxNTowMyAxOTk4ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS5jOiBtZXJnZWQuCisKKyAgICAgICAgLSBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+CisJKHByaW50X3BhY2tldCwgcmVtb3RlX3BhY2tldF9jb21tYW5kKTogTmV3IGZ1bmN0aW9ucy4KKyAgICAgICAgKF9pbml0aWFsaXplX3JlbW90ZSk6IFJlZ2lzdGVyIHRoZSByZW1vdGUtcGFja2V0IGNvbW1hbmQuCisgICAgICAgIC0gRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+IAorICAgICAgICAoX2luaXRpYWxpemVfcmVtb3RlKTogcmVtb3RlLWNvbXBhcmUgaXMgbm93CisgICAgICAgIGNvbXBhcmUtc2VjdGlvbnMuCisgICAgICAgIC0gRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgorICAgICAgICAgKHJlbW90ZV9jb21wYXJlX2NvbW1hbmQpOiBhZGRlZCB3YXJuaW5nLCBpc3N1ZWQgaW4gY2FzZQorICAgICAgICBvZiBtaXNtYXRjaCBvbmx5LgorCitUaHUgSnVuICA0IDA4OjI1OjM4IDE5OTggIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS5jIChyZW1vdGVfY29tcGFyZV9jb21tYW5kKTogTmV3IGZ1bmN0aW9uLCBuZXcgY29tbWFuZC4KKwlDb21wYXJlIG9iamVjdCBmaWxlIGJpbmFyeSBpbWFnZSB3aXRoIGNvcnJlc3BvbmRpbmcgbWVtb3J5IG9uCisJcmVtb3RlIHRhcmdldC4gIFJlcG9ydCBkaWZmZXJlbmNlcy4KKworVHVlIEp1biAgMiAxOTowNTowNCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIHNwYXJjLXRkZXAuYyAoc3BhcmNfdGFyZ2V0X2FyY2hpdGVjdHVyZV9ob29rKTogU2V0IHRhcmdldAorCWJ5dGUgb3JkZXIgb25seSB3aGVuIGl0J3Mgc2VsZWN0YWJsZS4KKworVHVlIEp1biAgMiAwMjowMTo1NiAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIHNwYXJjLXRkZXAuYyAoc3BhcmNfdGFyZ2V0X2FyY2hpdGVjdHVyZV9ob29rKTogTmV3IGZ1bmN0aW9uIHRvCisJc2V0IGVuZGlhbm5lc3MgYmFzZWQgb24gbWFjaGluZSB0eXBlLgorCShfaW5pdGlhbGl6ZV9zcGFyY190ZGVwKTogSW5pdGlhbGl6ZSB0YXJnZXRfYXJjaGl0ZWN0dXJlX2hvb2suCisJKHNwYXJjX3ByaW50X3JlZ2lzdGVyX2hvb2spOiBQcmludCBQU1IgYW5kIEZQU1IgaW4gZmFuY3kgZm9ybWF0CisJb24gMzItYml0IG1hY2hpbmVzLgorCSogY29uZmlnL3NwYXJjL3RtLXNwYXJjLmggKFBSSU5UX1JFR0lTVEVSX0hPT0spOiBSZWRlZmluZSB0bworCWNhbGwgc3BhcmNfcHJpbnRfcmVnaXN0ZXJfaG9vayBpbnN0ZWFkIG9mIHVzaW5nIGlubGluZSBjb2RlLgorCSogY29uZmlnL3NwYXJjL3RtLXNwNjQuaCAoUFJJTlRfUkVHSVNURVJfSE9PSyk6IFJlbW92ZS4KKworVGh1IE1heSAyOCAxNzoxOToxNCAxOTk4ICBLZWl0aCBTZWl0eiAgPGtlaXRoc0BjeWdudXMuY29tPgorCisJKiBtYWluLmMgKG1haW4pOiBDaGVjayBmb3IgTlVMTCBmcm9tIGdldGVudiBvbiBDWUdXSU4zMi4KKworVGh1IE1heSAyOCAwOTo0MTo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBtb25pdG9yLmMgKG1vbml0b3JfdnNwcmludGYpOiBIYW5kbGUgJSUuICBQYXRjaCBjb3VydGVzeSBvZgorCUZlbGl4IExlZSAoZmxlZUBjeWdudXMuY29tKQorCitUaHUgTWF5IDI4IDAwOjI3OjM1IDE5OTggIFBldGVyIFNjaGF1ZXIgIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4KKworCSogbWlwcy10ZGVwLmMgKG1pcHNfcHVzaF9kdW1teV9mcmFtZSk6ICBGaXggY2FsY3VsYXRpb24gb2YKKwlQUk9DX1JFR19PRkZTRVQgYW5kIFBST0NfRlJFR19PRkZTRVQuCisKK01vbiBBcHIgMjcgMTQ6Mzc6NDkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWcvdjg1MC90bS12ODUwLmggKFJFR0lTVEVSX0JZVEUpOiBGUF9SRUdOVU0gYW5kCisgCUZQX1JBV19SRUdOVU0gdXNlIHRoZSBzYW1lIHJlZ2lzdGVyIGxvY2F0aW9uLgorCisJKiB2ODUwLXRkZXAuYyAodjg1MF9zY2FuX3Byb2xvZ3VlKTogVXNlIEZQX1JBV19SRUdOVU0gaW5zdGVhZCBvZgorIAlGUF9SRUdOVU0uCisJKHY4NTBfZnJhbWVfY2hhaW4pOiBEaXR0by4KKworCSogY29uZmlnL3Y4NTAvdG0tdjg1MC5oIChSRUdJU1RFUl9OQU1FUyk6IEFkZCAiZnAiLgorCShOVU1fUkVHUyk6IFVwZGF0ZS4KKwkoRlBfUkVHTlVNKTogVXBkYXRlLgorCShGUF9SQVdfUkVHTlVNKTogRGVmaW5lLgorCitXZWQgTWF5IDI3IDE0OjIyOjMxIDE5OTggIEtlaXRoIFNlaXR6ICA8a2VpdGhzQGN5Z251cy5jb20+CisKKwkqIG1haW4uYyAobWFpbik6IENvbnZlcnQgdGhlIHBhdGggcmV0dXJuZWQgZnJvbSBnZXRlbnYgdG8gYSBwb3NpeAorCXBhdGggb24gY3lnd2luMzIgaG9zdHMuCisKK01vbiBNYXkgMjUgMTM6MzE6MjcgMTk5OCAgS2VpdGggU2VpdHogIDxrZWl0aHNAY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLmMgKHJlbW90ZV9vcGVuXzEpOiBJZiBhbiBlcnJvciBvY2N1cnMgc3RhcnRpbmcgdGhlIHJlbW90ZSwgCisJcG9wIHRoZSB0YXJnZXQgQU5EIHJldHVybi4KKworU2F0IE1heSAyMyAwMjoyMzowOSAxOTk4ICBQZXRlciBTY2hhdWVyICA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+CisKKwkqIGR3YXJmMnJlYWQuYyAocmVhZF9zdWJyb3V0aW5lX3R5cGUpOiAgU2V0IFRZUEVfRkxBR19QUk9UT1RZUEVECisJb24gQysrIGZ1bmN0aW9ucy4KKwkqIHZhbG9wcy5jICh2YWx1ZV9hcmdfY29lcmNlKTogIEFkZCBuZXcgYXJndW1lbnQgdG8gaW5kaWNhdGUgd2hldGhlcgorCXRoZSBmdW5jdGlvbiBoYXMgYSBwcm90b3R5cGUsIGhhbmRsZSBpbnRlZ2VyIGFuZCBmbG9hdCBwcm9tb3Rpb25zCisJYWNjb3JkaW5nbHkuCisgICAgICAgIChjYWxsX2Z1bmN0aW9uX2J5X2hhbmQpOiAgQWx3YXlzIGNhbGwgdmFsdWVfYXJnX2NvZXJjZSwgcGFzcyBkb3duCisJcHJvdG90eXBlIGluZm9ybWF0aW9uLgorCitGcmkgTWF5IDIyIDEwOjU2OjM2IDE5OTggIEpvaG4gTWV0emxlciAgPGptZXR6bGVyQGN5Z251cy5jb20+CisKKwkqIHJlbW90ZS5jIChfaW5pdGlhbGl6ZV9yZW1vdGUpOiBUeXBvIGV4dGVuZGVkX19yZW1vdGUKKworVGh1IE1heSAyMSAxMzoxNDoyNSAxOTk4ICBKb2huIE1ldHpsZXIgIDxqbWV0emxlckBjeWdudXMuY29tPgorCisJKiBnbnUtbmF0LmMgKGluaXRfZ251X29wcyk6IEluaXRpYWxpemF0aW9uIG9mIHRhcmdldCBvcHMgYnkgYXNzaWdubWVudC4KKwkoX2luaXRpYWxpemVfZ251X25hdCk6IENhbGwgbmV3IGluaXQKKwkqIG1hYy1uYXQuYyAoaW5pdF9jaGlsZF9vcHMpOiBEaXR0by4KKwkoX2luaXRpYWxpemVfbWFjX25hdCk6IERpdHRvLgorCSogbW9uaXRvci5jIChpbml0X2Jhc2VfbW9uaXRvcl9vcHMpOiBEaXR0by4KKwkoX2luaXRpYWxpemVfcmVtb3RlX21vbml0b3JzKTogRGl0dG8uCisJKiBwcGMtYmRtLmMgKGluaXRfYmRtX3BwY19vcHMpOiBEaXR0by4KKwkoX2luaXRpYWxpemVfYmRtX3BwYyk6IERpdHRvLgorCSogcmVtb3RlLWFkYXB0LmMgKGluaXRfYWRhcHRfb3BzKTogRGl0dG8uCisJKF9pbml0aWFsaXplX3JlbW90ZV9hZGFwdCk6IERpdHRvLgorCSogcmVtb3RlLWFycmF5LmMgKGluaXRfYXJyYXlfb3BzKTogRGl0dG8uCisJKF9pbml0aWFsaXplX2FycmF5KTogRGl0dG8uCisJKiByZW1vdGUtYnVnIChpbml0X2J1Z19vcHMpOiBEaXR0by4KKwkoX2luaXRpYWxpemVfcmVtb3RlX2J1Zyk6IERpdHRvLgorCSogcmVtb3RlLWU3MDAwLmMgKGluaXRfZTcwMDBfb3BzKTogRGl0dG8uCisJKF9pbml0aWFsaXplX3JlbW90ZV9lNzAwMCk6IERpdHRvLgorCSogcmVtb3RlLWViLmMgKGluaXRfZWJfb3BzKTogRGl0dG8uCisJKF9pbml0aWFsaXplX3JlbW90ZV9lYik6IERpdHRvLgorCSogcmVtb3RlLWVzLmMgKGluaXRfZXMxODAwX29wcyk6IERpdHRvLgorCShpbml0X2VzMTgwMF9jaGlsZF9vcHMpOiBEaXR0by4KKwkoX2luaXRpYWxpemVfZXMxODAwKTogRGl0dG8uCisJKiByZW1vdGUtaG1zLmMgKGluaXRfaG1zX29wcyk6IERpdHRvLgorCShfaW5pdGlhbGl6ZV9yZW1vdGVfaG1zKTogRGl0dG8uCisJKiByZW1vdGUtbW0uYyAoaW5pdF9tbV9vcHMpOiBEaXR0by4KKwkoX2luaXRpYWxpemVfcmVtb3RlX21tKTogRGl0dG8uCisJKiByZW1vdGUtbmluZHkuYyAoaW5pdF9uaW5keV9vcHMpOiBEaXR0by4KKwkoX2luaXRpYWxpemVfbmluZHkpOiBEaXR0by4KKwkqIHJlbW90ZV9ucm9tLmMgKGluaXRfbnJvbV9vcHMpOiBEaXR0by4KKwkoX2luaXRpYWxpemVfcmVtb3RlX25yb20pOiBEaXR0by4KKwkqIHJlbW90ZS1vczlrIChpbml0X3JvbWJ1Z19vcHMpOiBEaXR0by4KKwkoX2luaXRpYWxpemVfcmVtb3RlX29zOWspOiBEaXR0by4KKwkqIHJlbW90ZS1yZGkuYyAoaW5pdF9yZGlfb3BzKTogRGl0dG8uCisJKF9pbml0aWFsaXplX3JlbW90ZV9yZGkpOiBEaXR0by4KKwkqIHJlbW90ZS1yZHAuYyAoaW5pdF9yZW1vdGVfcmRwX29wcyk6IERpdHRvLgorCShfaW5pdGlhbGl6ZV9yZW1vdGVfcmRwKTogRGl0dG8uCisJKiByZW1vdGUtc2RzLmMgKGluaXRfc2RzX29wcyk6IERpdHRvLgorCShfaW5pdGlhbGl6ZV9yZW1vdGVfc2RzKTogRGl0dG8uCisJKiByZW1vdGUtc2ltLmMgKGluaXRfZ2Ric2ltX29wcyk6IERpdHRvLgorCShfaW5pdGlhbGl6ZV9yZW1vdGVfc2ltKTogRGl0dG8uCisJKiByZW1vdGUtc3QuYyAoaW5pdF9zdDIwMDBfb3BzKTogRGl0dG8uCisJKF9pbml0aWFsaXplX3JlbW90ZV9zdDIwMDApOiBEaXR0by4KKwkqIHJlbW90ZS11ZGkuYyAoaW5pdF91ZGlfb3BzKTogRGl0dG8uCisJKF9pbml0aWFsaXplX3JlbW90ZV91ZGkpOiBEaXR0by4KKwkqIHJlbW90ZS12eC5jIChpbml0X3Z4X29wcyk6IERpdHRvLgorCShpbml0X3Z4X3J1bl9vcHMpOiBEaXR0by4KKwkoX2luaXRpYWxpemVfdngpOiBEaXR0by4KKwkqIHJlbW90ZS5jIChpbml0X3JlbW90ZV9vcHMpOiBEaXR0by4KKwkoaW5pdF9leHRlbmRlZF9yZW1vdGVfb3BzKTogRGl0dG8uCisJKF9pbml0aWFsaXplX3JlbW90ZSk6IERpdHRvLgorCSogc3BhcmNsLXRkZXAuYyAoaW5pdF9zcGFyY2xpdGVfb3BzKTogRGl0dG8uCisJKF9pbml0aWFsaXplX3NwYXJjbF90ZGVwKTogRGl0dG8uCisJKiB2ODUwaWNlLmMgKGluaXRfODUwaWNlX29wcyk6IERpdHRvLgorCShfaW5pdGlhbGl6ZV92ODUwaWNlKTogRGl0dG8uCisJKiB3aW4zMi1uYXQuYyAoaW5pdF9jaGlsZF9vcHMpOiBEaXR0by4KKwkoX2luaXRpYWxpemVfaW5mdGFyZyk6IERpdHRvLgorCisxOTk4LTA1LTIxICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+CisKKwkqIGF4LWdkYi5jIChjb25zdF92YXJfcmVmKTogRG9uJ3QgaGFuZGxlIGZ1bmN0aW9uIG5hbWVzLiAgSSBkb24ndAorCXdhbnQgdG8gaW1wbGVtZW50IGFsbCB0aGUgInVzdWFsIHVuYXJ5IGNvbnZlcnNpb24iIHJ1bGVzIGZvcgorCWNvbnN0YW50cy4KKwkoZ2VuX3VzdWFsX3VuYXJ5KTogVHVybiAiZnVuY3Rpb24iIHZhbHVlcyBpbnRvICJwb2ludGVyIHRvCisJZnVuY3Rpb24iIHZhbHVlcywgaW4gYWNjb3JkYW5jZSB3aXRoIEFOU0kuCisJKGdlbl9kZXJlZik6IERvbid0IGRvIHRoZSB1c3VhbCB1bmFyeSBjb252ZXJzaW9ucyBoZXJlLiAgTGV0IHRoZQorCWNhbGxlciBkbyBpdC4gIE5vdGUgdGhhdCBkZXJlZmVyZW5jaW5nIGEgZnVuY3Rpb24gcG9pbnRlciB5aWVsZHMKKwlhIGZ1bmN0aW9uIGRlc2lnbmF0b3IsIHdoaWNoIHdlIGNhbGwgYW4gcnZhbHVlLCBub3QgYW4gbHZhbHVlLgorCShnZW5fYWRkcmVzc19vZik6IEhhbmRsZSBmdW5jdGlvbnMgc3BlY2lhbGx5LgorCShnZW5fc3RydWN0X3JlZik6IFBlcmZvcm0gdGhlIHVzdWFsIHVuYXJ5IGNvbnZlcnNpb25zIGJlZm9yZQorCWNhbGxpbmcgZ2VuX2RlcmVmLgorCShnZW5fZXhwcik6IEluIGNhc2UgZm9yIHRoZSBwcmVmaXggJyonIG9wZXJhdG9yLCBjYWxsCisJZ2VuX3VzdWFsX3VuYXJ5IG1hbnVhbGx5LgorCitXZWQgTWF5IDIwIDE1OjI5OjQxIDE5OTggIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBtaXBzL3RtLXR4MzkuaCAoTUlQU19ERUZBVUxUX0ZQVV9UWVBFKTogRGVmaW5lZCBhcyBNSVBTX0ZQVV9OT05FLgorCSogbWlwcy90bS10eDM5bC5oOiBTYW1lLgorCitXZWQgTWF5IDIwIDEwOjEyOjExIDE5OTggIEpvaG4gTWV0emxlciAgPGptZXR6bGVyQGN5Z251cy5jb20+CisKKwkqIG0zMnItdGRlcC5jIChkZWNvZGVfcHJvbG9ndWUpOiBIYW5kbGUgZnJhbWVzIGNvbXBpbGVkIHdpdGggLU9zLgorICAgICAgICBTcGxpdCBvdXQgYXMgc2VwYXJhdGUgZnVuY3Rpb24gY2FsbGVkIGJ5IHNraXAgcHJvbG9ndWUgYW5kIHNjYW4KKyAgICAgICAgcHJvbG9ndWUuIG5ldyBmb3JtdWxhIGhhbmRsZXMgb3B0aW1pemF0aW9uIGluIHdoaWNoIHRoZSBwcm9sb2d1ZQorICAgICAgICBpcyBpbnRlcmxlYXZlZCB3aXRoIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbi4gQWxzbyByZWNvZ25pemVzIG5ldworICAgICAgICB2YXJpYXRpb25zIG9mIHByb2xvZ3VlIGVuY29kaW5nLiAgVXNlIG9mIGZyYW1lIHBvaW50ZXIgaXMKKyAgICAgICAgZXNzZW50aWFsIHRvIGRlYnVnZ2luZywgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIKKyAgICAgICAgKG0zMnJfc2tpcF9wcm9sb2d1ZSk6IENhbGwgZGVjb2RlIHByb2xvZ3VlLCBpZ25vcmUgbGluZSBpbmZvCisgICAgICAgIChtMzJyX3NjYW5fcHJvbG9ndWUpOiBDYWxsIGRlY29kZSBwcm9sb2d1ZSwgaWdub3JlIGxpbmUgaW5mby4KKworVHVlIE1heSAxOSAxNzoyMzo1NCAxOTk4ICBKb2huIE1ldHpsZXIgIDxqbWV0emxlckBjeWdudXMuY29tPgorCisJKiB3ODlrLXJvbS5jIChfaW5pdGlhbGl6ZV93ODlrKTogQ2FsbCBuZXcgaW5pdCBmdW5jdGlvbgorCShpbml0X3c4OWtfY21kcyk6IENvbnZlcnQgdG8gZHluYW1pYyBpbml0aWFsaXphdGlvbiBvZiBtb25pdG9yX29wcyAKKyAgICAgICAgZGF0YSBzdHJ1Y3R1cmUgZm9yIGZvcndhcmQgY29tcGF0YWJpbGl0eSB3aXRoIGFkZGl0aW9ucyB0byB0aGUKKyAgICAgICAgZGF0YSBzdHJ1Y3R1cmUuCisJKiBkYnVnLXJvbS5jIChfaW5pdGlhbGl6ZV9kYnVnX3JvbSk6IGRpdHRvCisgICAgICAgIChpbml0X2RidWdfY21kcyk6IGRpdHRvCisJKiBtMzJyLXJvbS5jIChfaW5pdGlhbGl6ZV9tMzJyX3JvbSk6IGRpdHRvCisJKGluaXRfbTMycl9jbWRzKTogZGl0dG8KKworVHVlIE1heSAxOSAxNDo1NDoxMSAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiB0cmFjZXBvaW50LmMgKG1lbXJhbmdlX2NtcCk6IHVzZSBjb25zdCB2b2lkICogYXJncyB0byBhdm9pZAorCUFOU0kgY29tcGlsZXIgd2FybmluZ3MuCisKKzE5OTgtMDUtMTkgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCSogYXgtZ2RiLmMgKGdlbl9mZXRjaCwgZ2VuX3Zhcl9yZWYsIGdlbl9kZXJlZiwgZmluZF9maWVsZCwKKwlnZW5fYml0ZmllbGRfcmVmLCBnZW5fZXhwcik6IENhbGwgZXJyb3IsIG5vdCBhYm9ydC4KKwkqIGF4LWdlbmVyYWwuYyAocmVhZF9jb25zdCwgZ2VuZXJpY19leHQsIGF4X3RyYWNlX3F1aWNrLAorIAlheF9sYWJlbCwgYXhfY29uc3RfZCwgYXhfcmVnLCBheF9wcmludCk6IFNhbWUuCisKKwkqIHRyYWNlcG9pbnQuYzogUmVtb3ZlIHRoZSAkKC4uLikgc3ludGF4IGZvciBtZW1yYW5nZXMuCisJKHZhbGlkYXRlX2FjdGlvbmxpbmUsIGVuY29kZV9hY3Rpb25zLCB0cmFjZV9kdW1wX2NvbW1hbmQpOiBSZW1vdmUKKwljbGF1c2VzIGZvciB0aGUgJCguLi4pIHN5bnRheC4KKwkocGFyc2VfYW5kX2V2YWxfbWVtcmFuZ2UpOiBGdW5jdGlvbiBkZWxldGVkLgorCShfaW5pdGlhbGl6ZV90cmFjZXBvaW50KTogVXBkYXRlIGZ1bmN0aW9uIGRlc2NyaXB0aW9uLiAKKworCSogYXgtZ2RiLmMgKF9pbml0aWFsaXplX2F4X2dkYik6IE1ha2UgdGhlICJhZ2VudCIgY29tbWFuZCBhCisgCXN1YmNvbW1hbmQgb2YgIm1haW50ZW5hbmNlIiwgYXMgaXQgc2hvdWxkIGhhdmUgYmVlbiBmcm9tIHRoZQorCWJlZ2lubmluZy4gICNpbmNsdWRlICJnZGJjbWQuaCIsIHRvIGdldCB0aGUgZGVjbGFyYXRpb24gZm9yCisJbWFpbnRlbmFuY2VsaXN0LgorCSogTWFrZWZpbGUuaW46IERvY3VtZW50IHRoYXQgZGVwZW5kZW5jeS4KKworVHVlIE1heSAxOSAxMjowMDo1OCAxOTk4ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+CisKKwkqIHRyYWNlcG9pbnQuYyAoZ2V0X3RyYWNlcG9pbnRfYnlfbnVtYmVyKTogbmV3IGZ1bmN0aW9uLCB0byBhY2Nlc3MKKwl0cmFjZWZyYW1lX251bWJlciBmb3IgdXNlIG9mIHRoZSBHVUkuCisKKwkqIHRyYWNlcG9pbnQuaDogYWRkZWQgcHJvdG90eXBlIGZvciBnZXRfdHJhY2VmcmFtZV9udW1iZXIuCisKK01vbiBNYXkgMTggMTM6MzQ6MjcgMTk5OCAgS2VpdGggU2VpdHogIDxrZWl0aHNAY3lnbnVzLmNvbT4KKworICAgICAgICAqIGRieHJlYWQuYyAocHJvY2Vzc19vbmVfc3ltYm9sKTogSWYgYmxvY2sgYWRkcmVzc2VzIGFyZSByZWxhdGl2ZSB0bworICAgICAgICBmdW5jdGlvbiBzdGFydCBhZGRyZXNzZXMsIHJlc2V0IGZ1bmN0aW9uX3N0YXJ0X2FkZHJlc3Mgd2hlbmV2ZXIgYSBuZXcKKyAgICAgICAgc291cmNlIGZpbGUgaXMgc2Vlbi4KKworTW9uIE1heSAxOCAxMzowNDoyNyAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiB0cmFjZXBvaW50LmMgKGdldF90cmFjZXBvaW50X2J5X251bWJlcik6IG1ha2Ugc3VyZSB0byBhZHZhbmNlCisJYXJnIHBvaW50ZXIgZXZlbiBpZiB3ZSBmYWlsIHRvIHBhcnNlIGEgdXNlZnVsIG51bWJlci4gIE90aGVyd2lzZSwKKwlzaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBhIGxvb3AsIGl0IG1heSBsb29wIGZvcmV2ZXIhCisJQWxzbyBjaGFuZ2Ugc3RydG9sIGNhbGwgdG8gYWxsb3cgYXJiaXRyYXJ5IHJhZGl4LgorCShtYXBfYXJnc19vdmVyX3RyYWNlcG9pbnRzIChhbmQgb3RoZXIgcGxhY2VzKSk6IGFkZCBRVUlUOyBjYWxsCisJdG8gbG9vcCwgdG8gYWxsb3cgYnJlYWtvdXQgdXNpbmcgY29udHJvbC1DLiAgTm90IGFsbCBsb29wcyB3ZXJlCisJYW5hbHl6ZWQgdG8gbWFrZSBzdXJlIHRoZXkgY291bGQgdGVybWluYXRlIGNsZWFubHksIGJ1dCBldmVuCisJdGVybWluYXRpbmcgd2l0aCBhIG1lc3NlZC11cCB0cmFjZXBvaW50IGxpc3Qgd291bGQgYmUgYmV0dGVyIAorCXRoYW4gbm90IHRlcm1pbmF0aW5nIGF0IGFsbCEKKwkodGR1bXBfY29tbWFuZCk6IGNoZWNrIHRvIHNlZSBpZiB3ZSdyZSBjb25uZWN0ZWQgdG8gYSB0cmFjZS0KKwljYXBhYmxlIHRhcmdldCAoY3VycmVudGx5IG9ubHkgInJlbW90ZSIpIGJlZm9yZSBkb2luZyBhbnl0aGluZyAKKwllbHNlLgorCitTYXQgTWF5IDE2IDIyOjIxOjQ4IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9kMzB2L3RtLWQzMHYuaCAoSU5JVF9GUkFNRV9QQ19GSVJTVCk6IEZpbGwgaW4gUEMgaW50bworIAlmcmFtZSBzdHJ1Y3QgYmVmb3JlIGV4dHJhY3Rpbmcgc2F2ZWQgcmVnaXN0ZXIgb2Zmc2V0cy4KKworRnJpIE1heSAxNSAyMjo0Nzo0NSAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiB0cmFjZXBvaW50LmMgKGVuY29kZV9hY3Rpb25zKTogZml4IHR5cG8gaW4gcHJpbnRmIGZvcm1hdCBzdHJpbmcuCisKKzE5OTgtMDUtMTUgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCUltcGxlbWVudCBhIGZldyBtb3JlIHRyYWNpbmcgb3BlcmF0b3JzOiBeIHwgJiB+ICEKKwkqIGF4LWdkYi5jIChnZW5faW50ZWdyYWxfcHJvbW90aW9ucywgZ2VuX2xvZ2ljYWxfbm90LAorCWdlbl9jb21wbGVtZW50KTogTmV3IGZ1bmN0aW9ucy4KKwkoZ2VuX2Jpbm9wKTogTmV3IGFyZ3VtZW50IE1BWV9DQVJSWSwgaW5kaWNhdGluZyB3aGV0aGVyIHdlIG5lZWQgdG8KKwljb3JyZWN0IHRoZSB1cHBlciBiaXRzIG9mIHRoZSB2YWx1ZSBhZnRlciBwZXJmb3JtaW5nIHRoZQorCW9wZXJhdGlvbi4gIENhbGxlcnMgY2hhbmdlZC4KKwkoZ2VuX2V4cHIpOiBIYW5kbGUgQklOT1BfQklUV0lTRV9BTkQsIEJJTk9QX0JJVFdJU0VfSU9SLCBhbmQKKwlCSU5PUF9CSVRXSVNFX1hPUiBoZXJlIGFzIHdlbGwsIGJ5IGNhbGxpbmcgZ2VuX2Jpbm9wLiAgSGFuZGxlCisJVU5PUF9MT0dJQ0FMX05PVCwgVU5PUF9DT01QTEVNRU5ULgorCisJKiBheC1nZGIuYyAoZ2VuX2NvbnZlcnNpb24pOiBSZXdvcmtlZCB0byBhdm9pZCBzb21lIHVubmVjZXNzYXJ5CisJc2lnbiBleHRlbnNpb24uCisKKwkqIGF4LWdkYi5jIChnZW5fdXN1YWxfYXJpdGhtZXRpYyk6IFJlbmFtZWQgZnJvbSBnZW5fdXN1YWxfYmluYXJ5LAorCXRvIG1hdGNoIHRoZSBBTlNJIEMgc3RhbmRhcmQgYmV0dGVyLiAgQ2FsbGVycyBjaGFuZ2VkLgorCisJKiBheC1nZGIuYyAoZ2VuX3RyYWNlZF9wb3ApOiBBZGQgcHJvdG90eXBlZCBkZWNsYXJhdGlvbi4KKworRnJpIE1heSAxNSAxODoxODozOCAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KKworCSogdHJhY2Vwb2ludC5jIChzdHJpbmdpZnlfY29sbGVjdGlvbnNfbGlzdCk6IHJldHVybiBhIGNvbGxlY3Rpb24KKwlvZiBzdHJpbmdzIHJhdGhlciB0aGFuIGEgc2luZ2xlIHN0cmluZy4KKwkoZnJlZV9hY3Rpb25zX2xpc3QpOiBuZXcgZnVuY3Rpb24uCisJKGVuY29kZV9hY3Rpb25zKTogcHJvY2VzcyBjb2xsZWN0aW9uIG9mIHN0cmluZ3MgcmV0dXJuZWQgYnkKKwlzdHJpbmdpZnlfY29sbGVjdGlvbnNfbGlzdC4KKworMTk5OC0wNS0xNSAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgorCisJKiBheC1nZGIuYyAoZ2VuX3RyYWNlZF9wb3ApOiBOZXcgZnVuY3Rpb24uCisJKGdlbl9leHByKTogQ2FsbCBpdCBmb3IgY29tbWEgb3BlcmF0b3IuCisJKGdlbl90cmFjZV9mb3JfZXhwcik6IENhbGwgaXQsIGluc3RlYWQgb2Ygd3JpdGluZyBpdCBvdXQuCisKKwlBZGQgZmFjaWxpdGllcyBmb3Igc2VuZGluZyBhcmJpdHJhcnkgcGFja2V0cyB0byB0aGUgcmVtb3RlIGFnZW50LgorCVRoZXJlIGFyZSBhIGJ1bmNoIG9mIGltcHJvdmVtZW50cyB0byBtYWtlIChtYWtlIGl0IGdlbmVyaWM7IGhhbmRsZQorCSdPJyByZXBsaWVzIHByb3Blcmx5KSwgYnV0IEkganVzdCB3YW50IHRvIGdldCB0aGlzIG9udG8gdGhlIGJyYW5jaC4KKwkqIHJlbW90ZS5jIChwcmludF9wYWNrZXQsIHJlbW90ZV9wYWNrZXRfY29tbWFuZCk6IE5ldyBmdW5jdGlvbnMuCisJKF9pbml0aWFsaXplX3JlbW90ZSk6IFJlZ2lzdGVyIHRoZSByZW1vdGUtcGFja2V0IGNvbW1hbmQuCisKK1RodSBNYXkgMTQgMTc6NTI6MzEgMTk5OCAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgorCisJKiB0cmFjZXBvaW50LmM6IG1vdmUgYWN0aW9ubGluZV90eXBlIGRlZmluaXRpb24gdG8gdHJhY2Vwb2ludC5oLgorCSh2YWxpZGF0ZV9hY3Rpb25saW5lKTogbWFrZSBub24gc3RhdGljLgorCisJKiB0cmFjZXBvaW50Lmg6IG1vdmUgYWN0aW9saW5lX3R5cGUgZGVmaW5pdGlvbiAgZnJvbSB0cmFjZXBvaW50LmMuCisgICAgICAgICh2YWxpZGF0ZV9hY3Rpb25saW5lKSBtb3ZlZCBwcm90b3R5cGUgZnJvbSB0cmFjZXBvaW50LmMuCisKK1RodSBNYXkgMTQgMTE6NDk6MTggMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+CisKKwkqIHRyYWNlcG9pbnQuYyAodmFsaWRhdGVfYWN0aW9ubGluZSk6IGFkZCBhZGRpdGlvbmFsIGVycm9yCisJY2hlY2tpbmcsIHJlbW92ZSBzb21lIGRlYWQgY29kZS4KKwkoZW5jb2RlX2FjdGlvbnMpOiBhZGRpdGlvbmFsIGNsZWFudXBzLgorCSh0cmFjZV9maW5kX2NvbW1hbmQpOiByZW1vdmUgc29tZSBkZWFkIGNvZGUuCisJKHRyYWNlX2ZpbmRfcGNfY29tbWFuZCk6IGRpdHRvLgorCSh0cmFjZV9maW5kX3RyYWNlcG9pbnRfY29tbWFuZCk6IGRpdHRvLgorCSh0cmFjZV9maW5kX2xpbmVfY29tbWFuZCk6IGRpdHRvLgorCSh0cmFjZV9maW5kX3JhbmdlX2NvbW1hbmQpOiBkaXR0by4KKwkodHJhY2VfZmluZF9vdXRzaWRlX2NvbW1hbmQpOiBkaXR0by4KKworVGh1IE1heSAxNCA1OjUxOjAwIDE5OTggIFJvbiBVbnJhdSAgPHJ1bnJhdUBjeWdudXMuY29tPgorCisJKiBzeW10YWIuYyAoZGVjb2RlX2xpbmVfMSk6IHNldCBzZWN0aW9uIGZvciAiYnJlYWsgKjxhZGRyPiIKKworV2VkIE1heSAxMyAyMDo1ODowMiAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGNvcmVmaWxlLmMgKHJlb3Blbl9leGVjX2ZpbGUpOiBSZW9wZW4gdGhlIGV4ZWMgZmlsZSBpZgorCWl0IGhhcyBjaGFuZ2VkLgorCitXZWQgTWF5IDEzIDE1OjIyOjAyIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogc3BhcmMtdGRlcC5jIChmZXRjaF9pbnN0cnVjdGlvbik6IE5ldyBmdW5jdGlvbi4KKwkoc2luZ2xlX3N0ZXAsIHNwYXJjX2luaXRfZXh0cmFfZnJhbWVfaW5mbywgZXhhbWluZV9wcm9sb2d1ZSk6CisJVXNlIGZldGNoX2luc3RydWN0aW9uIGluc3RlYWQgb2YgcmVhZF9tZW1vcnlfaW50ZWdlcgorCXRvIGVuc3VyZSB0aGF0IGluc3RydWN0aW9ucyBhcmUgYWx3YXlzIHJlYWQgYXMgYmlnLWVuZGlhbi4KKworV2VkIE1heSAxMyAxNDo0MjoyMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0ZVTkNfQUxMT0NBLgorCSogZGVmcy5oOiBDaGVjayBIQVZFX0FMTE9DQV9IIHJhdGhlciB0aGFuIHNwYXJjLiAgQWRkIF9BSVggcHJhZ21hCisJYWxsb2NhLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW4gKGp2LWxhbmcubywganYtdHlwZXByaW50Lm8sIGp2LXZhbHByaW50Lm8pOiBOZXcKKwl0YXJnZXRzLgorCitXZWQgTWF5IDEzIDExOjE5OjA4IDE5OTggIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIHRyYWNlcG9pbnQuYyAodHJhY2VfY29tbWFuZCk6IFJlbW92ZSBvbGQgZGlhZ25vc3RpYyBjb2RlIHRoYXQgd2FzCisJcHJldmVudGluZyB0cmFjZXBvaW50cyBmcm9tIGJlaW5nIGRlZmluZWQgd2l0aCBhIGZ1bGwtcGF0aCBmaWxlbmFtZS4KKworVHVlIE1heSAxMiAxMzoxNzozNSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBzdGFic3JlYWQuYyAocmVhZF9vbmVfc3RydWN0X2ZpZWxkKTogQ2hlY2sgZm9yIHR5cGVkZWYgaW4gdHlwZQorIAl0cmVlIGJlZm9yZSBjbGVhcmluZyBiaXRmaWVsZCBpbmZvcm1hdGlvbi4KKworMTk5OC0wNS0xMSAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgorCisJKiBheC1nZGIuYyAoZ2VuX2Jpbm9wKTogTmV3IGZ1bmN0aW9uLCBiYXNlZCBvbiBnZW5fbXVsLCB0byByZXBsYWNlCisJZ2VuX211bCBhbmQgZ2VuX2RpdiwgYW5kIGhhbmRsZSBgJScgb3AgYXMgd2VsbC4gIENvcnJlY3RseSB0ZXN0cworCXR5cGUgb2YgYXJndW1lbnRzLgorCShnZW5fZXhwcik6IEZhY3RvciBvdXQgY29tbW9uIGNvZGUgaW4gYmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0b3JzLgorCUFkZCBzdXBwb3J0IGZvciBgJScuCisJKGdlbl9tdWwsIGdlbl9kaXYpOiBSZW1vdmVkLgorCitUaHUgTWF5ICA3IDE0OjQ5OjM4IDE5OTggIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBjb25maWcvc3BhcmMvdG0tc3A2NC5oIChDQUxMX0RVTU1ZKTogU3RvcmUgYW5kIHJldHJpZXZlCisJJW8wLSVvNSBhcyA2NC1iaXQgdmFsdWVzOyBjb21wZW5zYXRlIGZvciBzdGFjayBiaWFzLgorCShVU0VfU1RSVUNUX0NPTlZFTlRJT04pOiBXZSBvbmx5IHBhc3MgcG9pbnRlcnMgdG8gc3RydWN0cworCWlmIHRoZXkncmUgbGFyZ2VyIHRoYW4gMzIgYnl0ZXMuCisJKFJFR19TVFJVQ1RfSEFTX0FERFIpOiBEaXR0by4KKworCSogc3BhcmMtdGRlcC5jIChzcGFyY19pbml0X2V4dHJhX2ZyYW1lX2luZm8pOiBVc2UgcmVhZF9zcCgpCisgCWluc3RlYWQgb2YgcmVhZF9yZWdpc3Rlci4gSWYgdGhlIHRhcmdldCBpcyBhIHNwYXJjNjQgYW5kIHRoZSBmcmFtZQorIAlwb2ludGVyIGlzIG9kZCwgY29tcGVuc2F0ZSBmb3IgdGhlIHN0YWNrIGJpYXMuCisJKGdldF9zYXZlZF9yZWdpc3Rlcik6IFVzZSByZWFkX3NwKCkuCisJKERVTU1ZX1NUQUNLX1JFR19CVUZfU0laRSk6IFVzZSBGUF9SRUdJU1RFUl9CWVRFUy4KKwkoc3BhcmNfcHVzaF9kdW1teV9mcmFtZSk6IFVzZSByZWFkX3NwKCkvd3JpdGVfc3AoKS4gT24gc3BhcmM2NCwKKyAJc2F2ZSB0aGUgUEMsIE5QQywgQ0NSLCBGU1IsIEZQUlMsIFkgYW5kIEFTSSByZWdpc3RlcnMuCisJKHNwYXJjX2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyk6IFVzZSByZWFkX3NwKCkuIFJlYWQgdGhlIFBDLCBOUEMsCisgCUNDUiwgRlNSLCBGUFJTLCBZIGFuZCBBU0kgcmVnaXN0ZXJzIGZyb20gdGhlIGZyYW1lLCBpZiBpdCdzIGEKKyAJZHVtbXkgZnJhbWUuCisJKHNwYXJjX3BvcF9mcmFtZSk6IFVzZSB3cml0ZV9zcCgpLiBJZiB0aGUgdGFyZ2V0IGlzIGEgc3BhcmM2NCBhbmQKKyAJdGhlIEZQIGlzIG9kZCwgY29tcGVuc2F0ZSBmb3Igc3RhY2sgYmlhcy4KKwkoc3BhcmNfc3RvcmVfcmV0dXJuX3ZhbHVlKTogUmlnaHQtanVzdGlmeSB0aGUgcmV0dXJuIHZhbHVlIGJlZm9yZQorIAl3cml0aW5nIGl0IHRvICVvMC4KKwkoc3BhcmNfZml4X2NhbGxfZHVtbXkpOiBEb24ndCBOT1Agb3V0IHBhcnQgb2YgdGhlIGNhbGwgZHVtbXkgb24KKyAJc3BhcmM2NC4KKwkoc3BhcmM2NF9yZWFkX3NwLCBzcGFyYzY0X3JlYWRfZnAsIHNwYXJjNjRfd3JpdGVfc3AsCisgCXNwYXJjNjRfd3JpdGVfZnAsIHNwNjRfcHVzaF9hcmd1bWVudHMsCisgCXNwYXJjNjRfZXh0cmFjdF9yZXR1cm5fdmFsdWUpOiBOZXcgZnVuY3Rpb25zIHRvIHN1cHBvcnQgdGhlCisgCXNwYXJjNjQgQUJJLgorCisJKiBkd2FyZnJlYWQuYyAoaGFuZGxlX3Byb2R1Y2VyKTogU2V0IHByb2Nlc3NpbmdfZ2NjX2NvbXBpbGF0aW9uIHRvCisgCXRoZSByaWdodCB2ZXJzaW9uIG51bWJlci4KKworCSogZHdhcmYycmVhZC5jIChyZWFkX2ZpbGVfc2NvcGUpOiBBc3N1bWUgd2UncmUgcHJvY2Vzc2luZworCUdDQzIgb3V0cHV0LgorCitXZWQgTWF5ICA2IDE2OjM0OjAzIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc29tc29saWIuYzogSW5jbHVkZSBnZGJfc3RhdC5oLgorCitNb24gTWF5ICA0IDE4OjM0OjAxIDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJKiBheC1nZGIuYyAoZ2VuX211bCk6IG5ldyBmdW5jdGlvbjsgKGdlbl9kaXYpOiBuZXcgZnVuY3Rpb247CisJKGdlbl9leHByKTogYWRkIHN1cHBvcnQgZm9yICogYW5kIC8gb3BlcmF0b3JzLCBjYWxsIGdlbl9tdWwgYW5kCisJZ2VuX2RpdiBhcyBhcHByb3ByaWF0ZS4KKworTW9uIE1heSAgNCAxNjoyNDoyMiAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGRlZnMuaCAobWFrZV9ydW5fY2xlYW51cCk6IERlY2xhcmUuCisJKiBzb2xpYi5jIChmaW5kX3NvbGliKTogUGFzcyBjb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMgdG8KKwltYWtlX3J1bl9jbGVhbnVwLgorCitNb24gTWF5ICA0IDA3OjA4OjI1IDE5OTggIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIHRyYWNlcG9pbnQuYyAodHJhY2VfYWN0aW9uc19jb21tYW5kKTogYWN0aW9ucyBjb21tYW5kIG11c3Qgc2V0CisJc3RlcF9jb3VudCB0byB6ZXJvIChpbiBjYXNlIHByZXZpb3VzIGFjdGlvbnMgaGF2ZSBzZXQgaXQgYnV0IHRoZQorCW5ldyBzZXQgZG9lcyBub3QpLgorCitTYXQgTWF5ICAyIDA5OjM1OjA3IDE5OTggIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgorCisJKiBvY2QuaDogIEFkZCBuZXcgZmxhZ3MsIGZ1bmN0aW9uIGNvZGVzLCBhbmQgcHJvY2Vzc29yIHR5cGVzIHRvIAorCXN1cHBvcnQgbmV3IFdpZ2dsZXIgY2FwYWJpbGl0aWVzLgorCSogKG9jZF93cml0ZV9ieXRlc19zaXplKTogIE5ldyBmdW5jdGlvbiB0byBhbGxvdyBhdG9taWMgd3JpdGVzIG9mCisgCW1lbW9yeSBpbiBzaXplcyBsYXJnZXIgdGhhbiBhIGJ5dGUuCisKKwkqIHNlci11bml4LmMgKGJhdWR0YWIpOiAgQWRkIDU3NjAwLCAxMTUyMDAsIDIzMDQwMCwgYW5kIDQ2MDgwMCBiYXVkLgorCitGcmkgTWF5ICAxIDE5OjUxOjMyIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIHN0YWJzcmVhZC5jIChyZWFkX29uZV9zdHJ1Y3RfZmllbGQpOiBEbyBub3Qgb3ZlcnJpZGUgc3VwcGxpZWQKKyAJYml0ZmllbGQgc2l6ZSBmb3IgYSByYW5nZSB0eXBlIHZhbHVlLgorCisJKiBnZGJ0eXBlcy5jIChjcmVhdGVfcmFuZ2VfdHlwZSk6IEZvciBhIHJhbmdlIHdpdGggcG9zaXRpdmUgCisJbG93ZXIgbGltaXQsIGRlY2xhcmUgcmFuZ2UgdHlwZSBhcyB1bnNpZ25lZC4KKworRnJpIE1heSAgMSAxMDo1ODozNCAxOTk4ICBKb2huIE1ldHpsZXIgIDxqbWV0emxlckBjeWdudXMuY29tPgorCisJKiBtb25pdG9yLmM6IFR1cm4gb2ZmIGRlYnVnCisKK0ZyaSBNYXkgIDEgMDk6Mjk6NTYgMTk5OCAgUGV0ZXIgU2NoYXVlciAgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPgorCisJKiBicmVha3BvaW50LmMgKGRlbGV0ZV9jb21tYW5kKTogIFNraXAgaW50ZXJuYWwgYnJlYWtwb2ludHMgd2hlbgorCWFsbCBicmVha3BvaW50cyBhcmUgcmVxdWVzdGVkLgorCisJKiBzdGFic3JlYWQuYyAoZGVmaW5lX3N5bWJvbCk6ICBSZWNvcmQgcGFyYW1ldGVyIHR5cGVzIGZyb20gU3VucHJvCisJZnVuY3Rpb24gc3RhYnMgaW4gdGhlIFRZUEVfRklFTERTIG9mIHRoZSBmdW5jdGlvbiB0eXBlLgorCitUaHUgQXByIDMwIDE1OjU5OjU0IDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoY29uZmlnLWNoZWNrLXRhcmdldHMsIGNvbmZpZy1jaGVjay1ob3N0cyk6IFJlbW92ZWQuCisKKzE5OTgtMDQtMzAgIFBhdWwgRWdnZXJ0ICA8ZWdnZXJ0QHR3aW5zdW4uY29tPgorCisgICAgICAgICogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOgorICAgICAgICBEb24ndCBnZXQgYWhlYWQgb2YgeW91cnNlbGYgYW5kIGRlbGV0ZSBNYWtlZmlsZQorICAgICAgICBiZWZvcmUgcnVubmluZyBgbWFrZScuCisgICAgICAgIChsb2NhbC1tYWludGFpbmVyLWNsZWFuLCBkby1tYWludGFpbmVyLWNsZWFuKTogTmV3IHJ1bGVzLgorCitXZWQgQXByIDI5IDE0OjAyOjU5IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJKiBheC1nZGIuYyAoZ2VuX2FkZCk6IHdoZW4gYWRkaW5nIGEgcG9pbnRlciBhbmQgYW4gaW50LCB1c2UKKwl0aGUgc2l6ZSBvZiB0aGUgcG9pbnRlciwgbm90IHRoZSBpbnQgKHR5cG8pIHRvIGRlY2lkZSBob3cKKwl0byBleHRlbmQgdGhlIHJlc3VsdC4KKworV2VkIEFwciAyOSAxMDoyMDo0MCAxOTk4ICBKb2huIE1ldHpsZXIgIDxqbWV0emxlckBjeWdudXMuY29tPgorCisJKiBtb25pdG9yLmg6IERlZmluZWQgYWRkaXRpb25hbCBob29rcyBmb3IgZG1wcmVncywgY29uZmlndXJlX2hvb2tzCisJYW5kIHdhaXRfZmlsdGVyLiBUaGVzZSBhZGRpdGlvbnMgcmVxdWlyZSB0aGF0IGFsbCBST00gbW9uaXRvcgorCWludGVyZmFjZXMgYmUgcmVjb2RlZCB0byBpbml0aWFsaXplIG1vbml0b3Igb3BzIHVzaW5nIGFzc2lnbm1lbnRzCisJcmF0aGVyIHRoYW4gc3RhdGljIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbi4gIEFkZGVkIG5ldyBiaXRzIHRvCisJZmxhZ3MgTU9fRVhBQ1RfRFVNUEFERFIsIE1PX0hBU19CTE9DS1dSSVRFUy4KKworICAgICAgICAqIG1vbml0b3IuYyAoUkRFQlVHKTogQ29uZGl0aW9uYWwgdHJhY2luZyB0aHJvdWdob3V0IHRoZSBmaWxlLgorICAgICAgICAoZnJvbWhleCk6IE5vdyByZWNvZ25pemVkIHVwcGVyIGNzZSBoZXggZGlnaXRzCisgICAgICAgIChtb25pdG9yX3ByaW50Zl9ub2VjaG8pOgorICAgICAgICAobW9uaXRvcl9yZWFkY2hhcik6IFRyYWNpbmcgaW50ZXJmZXJlcyB3aXRoIGlucHV0IHRpbWluZy4KKyAgICAgICAgKG1vbml0b3Jfb3Blbik6IFJlZ2lzdGVyIGRpZmZlcmVudCBtZW1vcnkgd3JpdGUgZnVuY3Rpb25zIHdpdGgKKyAgICAgICAgZGNhY2hlX2luaXQgaWYgTU9fSEFTX0JMT0NLV1JJVEVTLgorICAgICAgICAoZmx1c2hfbW9uaW9yX2RjYWNoZSk6IEFkZGVkIGFzIGFuIGFkZGl0aW9uYWwgdXRpbHR5LgorICAgICAgICAobW9uaXRvci1yZXN1bWUpOiBDYWxsIGNvbnRpbnVlIGhvb2sgaWYgb25lIGhhcyBiZWVuIHN1cHBsaWVkLgorICAgICAgICAobW9uaXRvcl93YWl0X2ZpbHRlcik6IE5ldyBmdW5jdGlvbiBGYWN0b3JlZCBvdXQgb2YgbW9uaXRvciB3YWl0CisgICAgICAgIGFuZCB1c2VkIGlmIGFsdGVybmF0ZSB3YWl0LWZpbHRlciBoYXMgbm90IGJlZW4gcHJvdmlkZWQuCisgICAgICAgIChtb25pdG9yX3dhaXQpOiBjYWxsIGFsdGVybmF0ZSB3YWl0IGZpbHRlciBpZiBwcm92aWRlZC4gIENhbGwKKyAgICAgICAgbW9uaXRvcl9kdW1wX3JlZ3MsIGEgbmV3IGZ1bmN0aW9uIGZhY3RvcmVkIG91dCBmcm9tIGlubGluZSBjb2RlLgorICAgICAgICAobW9uaXRvcl9kdW1wX2Jsb2NrKTogQSBuZXcgZnVuY3Rpb24gdXNlZCBhcyBhIHV0aWxpdHkgd2hlbgorICAgICAgICBtb25pdG9ycyBtdXN0IGR1bXAgc2V2ZXJhbCBibG9ja3Mgb2YgcmVnaXN0ZXJzIHVzaW5nIGRpZmZlcmVudAorICAgICAgICBjb21tYW5kcy4KKyAgICAgICAgKG1vbml0b3JfZHVtcF9yZWdzKTogQ2FsbCBhbHRlcm5hdGUgZnVuY3Rpb24gaWYgcHJvdmlkZWQuIFVzZXMgbmV3CisgICAgICAgIGhvb2sgaW4gbW9uaXRvci5oLgorICAgICAgICAobW9uaXRvcl93cml0ZV9tZW1vcnkpOiBFbmdhZ2UgcHJldmlvdWx5IGFkZGVkIGhvb2sKKyAgICAgICAgTU9fRklMTF9VU0VTX0FERFIuCisgICAgICAgIChtb25pdG9yX3dyaXRlX2V2ZW5fYmxvY2spOiBuZXcgZnVuY3Rpb24gc3VwcG9ydHMgd3JpdGluZyBsb25nCisgICAgICAgIGJsb2NrcyBvZiA0Ynl0ZSB3b3Jkcy4KKyAgICAgICAgKGxvbmdsb25nZW5kc3dhcCk6IG5ldyBpbnRlcm5hbCBmdW5jdGlvbgorICAgICAgICAobW9uaXRvcl93cml0ZV9tZW1vcnlfbG9uZ2xvbmdzKTogbmV3IGZ1bmN0aW9uIHdyaXRlcyBsYXJnZSBibG9ja3MKKyAgICAgICAgdXNpbmcgY29tbWFuZCB0byBlbnRlciBhIGxvbmcgbG9uZy4KKyAgICAgICAgKG1vbml0b3Jfd3JpdGUtbWVtb3J5X2Jsb2NrKTogbmV3IEZ1bmN0aW9uIGZpZ3VyZXMgb3V0IHdoaWNoIGJsb2NrCisgICAgICAgIG1vZCB0byB1c2UuCisgICAgICAgIChtb25pdG9yX3JlYWRfbWVtb3J5KTogQ2FuIG5vdyBoYW5kbGUgZHVtcCBmb3JtYXRzIGluIHdoaWNoIHRoZSBieXRlcyAKKyAgICAgICAgcHJlY2VlZGluZyB0aGUgcmVxdWVzdGVkIGRhdGEgaXMgbm90IHByaW50ZWQuCisKK1R1ZSBBcHIgMjggMTk6NDE6MzMgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiB0cmFjZXBvaW50LmMgKG1lbXJhbmdlX2NtcCk6IEFub3RoZXIgdHlwbyBmaXg7IGBtZW1yYm5nZScgLT4KKwlgbWVtcmFuZ2UnLgorCisJKiB0cmFjZXBvaW50LmMgKG1lbXJhbmdlX2NtcCk6IEZpeGVkIHR5cG8gaW4gZnVuY3Rpb24gaW50cm8uCisKK1R1ZSBBcHIgMjggMTc6NDE6MjAgMTk5OCAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+CisKKyAgICAgICAgKiBzeW1maWxlLmMgKG92ZXJsYXlfYXV0b19jb21tYW5kKTogQWRkIGZvcmdvdHRlbiBwYXJhbWV0ZXIKKyAJZGVmaW5pdGlvbnMuCisgICAgICAgIChvdmVybGF5X21hbnVhbF9jb21tYW5kLCBvdmVybGF5X29mZl9jb21tYW5kKTogTGlrZXdpc2UuCisgICAgICAgIChvdmVybGF5X2xvYWRfY29tbWFuZCk6IExpa2V3aXNlLgorICAgICAgICAqIHRyYWNlcG9pbnQuYyAobWVtcmFuZ2VfY21wKTogUGFyYW1ldGVycyBoYXZlIHR5cGUgdm9pZCAqLCBub3QKKyAgICAgICAgc3RydWN0IG1lbXJhbmdlICouCisKK1R1ZSBBcHIgMjggMTE6MDg6MjUgMTk5OCAgSm9obiBNZXR6bGVyICA8am1ldHpsZXJAY3lnbnVzLmNvbT4KKworCSogcm9tNjhrLXJvbS5jIChfaW5pdGlhbGl6ZV9yb202OGspOiBGaXggdW5yZXNvbHZlZCBpbml0X3JvbV82OGtjbWRzLgorCitNb24gQXByIDI3IDE0OjMyOjIxIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3NwYXJjL3RtLXNwYXJjLmggKENBTExfRFVNTVkpOiBTaG9ydGVuIGl0IGRyYXN0aWNhbGx5LAorCW1ha2UgaXQgd29yayBvbiB0aGUgc2ltdWxhdG9yLgorCShGSVhfQ0FMTF9EVU1NWSk6IENvbnZlcnQgdG8gZnVuY3Rpb24gY2FsbCBpbnN0ZWFkIG9mIGlubGluZSBjb2RlLgorCShzcGFyY19maXhfY2FsbF9kdW1teSk6IERlY2xhcmUuCisJKiBzcGFyYy10ZGVwLmMgKHNwYXJjX2ZpeF9jYWxsX2R1bW15KTogTmV3IGZ1bmN0aW9uLCB0YWtlbiBmcm9tCisJb2xkIEZJWF9DQUxMX0RVTU1ZIG1hY3JvLCB3aXRoIGFkZGl0aW9uYWwgZml4ZXMgZm9yIHNpbXVsYXRvci4KKwkoc3BhcmNfcHVzaF9kdW1teV9mcmFtZSk6IFNldCByZWdpc3RlcnMgZGlmZmVyZW50bHkgb24gc2ltdWxhdG9yCisJdG8gcHJldmVudCBjb3JydXB0ZWQgcmVnaXN0ZXIgd2luZG93IHNhdmUgYXJlYXMuCisKK01vbiBBcHIgMjcgMTM6NDY6NDAgMTk5OCAgSm9obiBNZXR6bGVyICA8am1ldHpsZXJAY3lnbnVzLmNvbT4KKworICAgICAgICAqIHJvbTY4ay1yb20uYyAoX2luaXRpYWxpemVfcm9tNjhrLCBpbml0X3JvbTY4a19jbWRzKToKKyAgICAgICAgQ29udmVydCBhbGwgc3RhdGljIGluaXRpYWxpemF0aW9ucyBvZiBtb25pdG9yIG9wcyBzdHJ1Y3R1cmVzIHRvCisgICAgICAgIGV4ZWN1dGFibGUgaW5pdGlhbGl6YXRpb25zIGluIG9yZGVyIHRoYXQgYWRkaXRpb25zIHRvIHRoZSBkYXRhCisgICAgICAgIHN0cnVjdHVyZSBkZWZpbml0aW9uIGNhbiBtZSBtYWRlIHdpdGhvdXQgcmVwZWF0aW5nIHRoaXMgZWRpdGluZworICAgICAgICBleGVyY2lzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAqIGFidWctcm9tLmMgKF9pbml0aWFsaXplX2FidWdfcm9tLCBpbml0X2FidWctY21kcyk6IERpdHRvLgorICAgICAgICAqIGNwdTMyYnVnLXJvbS5jIChfaW5pdGlhbGl6ZV9jcHUzMmJ1Z19yb20sIGluaXRfY3B1MzJidWdfY21kcyk6IERpdHRvLgorICAgICAgICAqIG1vbjk2MC1yb20uYyAoaW5pdGlhbGl6ZV9tb245NjAsIGluaXRfbW9uOTYwX2NtZHMpOiBEaXR0by4KKyAgICAgICAgKiBvcDUwLXJvbS5jIChpbml0aWFsaXplX29wNTBuLCBpbml0X29wNTBuX2NtZHMpOiBEaXR0by4gICAgICAgCisgICAgICAgICogcHBjYnVnLXJvbS5jIChfaW5pdGlhbGl6ZV9wcGNidWdfcm9tLCBpbml0X3BwY19jbWRzKTogRGl0dG8uCisgICAgICAgICogc2gzLXJvbS5jIChfaW5pdGlhbGl6ZV9zaDNfcm9tLCBpbml0X3NoM19jbWRzKTogRGl0dG8uCisgICAgICAgICogc3BhcmNsZXQtcm9tLmMgKF9pbml0aWFsaXplX3NwYXJjbGV0LCBpbml0X3NwYXJjbGV0X2NtZHMpOiBEaXR0by4KKyAgICAgICAgKiByZW1vdGUtZXN0LmMgKF9pbml0aWFsaXplX2VzdCwgaW5pdF9lc3RfY21kcyk6IERpdHRvLgorICAgICAgICAqIHJlbW90ZS1obXMuYyAoIF9pbml0aWFsaXplX3JlbW90ZV9obXMsIGluaXRfaG1zX2NtZHMpOiBEaXR0by4KKworTW9uIEFwciAyNyAxMDo0MzowNCAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKKworICAgICAgICAqIGdkYl9zdHJpbmcuaCAoc3RyZHVwKTogRG9uJ3Qgc3BlY2lmeSBhcmd1bWVudHMgaW4gcHJvdG90eXBlLgorCitTdW4gQXByIDI2IDA3OjU3OjIxIDE5OTggIFBldGVyIFNjaGF1ZXIgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPgorCisJKiByczYwMDAtbmF0LmMgKHZtYXBfbGRpbmZvKTogIElzc3VlIHdhcm5pbmcgaW5zdGVhZCBvZiBlcnJvciBpZgorCWZzdGF0IG9uIGxkaW5mb19mZCBmYWlscy4gIFVzZSBvYmpmaWxlLT5vYmZkIGluc3RlYWQgb2YgdnAtPmJmZAorCXRvIGNoZWNrIGZvciByZWZlcmVuY2UgdG8gdGhlIHNhbWUgZmlsZS4KKworCSogdGFyZ2V0LmMgKHRhcmdldF9yZWFkX3N0cmluZyk6ICBIYW5kbGUgc3RyaW5nIHRyYW5zZmVycyBhdCB0aGUKKwllbmQgb2YgYSBtZW1vcnkgc2VjdGlvbiBncmFjZWZ1bGx5LgorCitGcmkgQXByIDI0IDE3OjE4OjU2IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBlbmFibGUgRVhFRVhUIHNldHRpbmcKKworRnJpIEFwciAyNCAxMTo1Mzo0OSAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KKworCSogdHJhY2Vwb2ludC5jIChhZGRfbG9jYWxfc3ltYm9scyk6IGNoYW5nZSB0eXBlIG9mIHR5cGUgZnJvbQorCWNoYXIgdG8gaW50IHNvIHRoYXQgdHlwZSBzaG93cyB1cCBhcyAnQScgb3IgJ0wnIG5vdCAwLgorCitUaHUgQXByIDIzIDE2OjM3OjIwIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQorCisgICAgICAgICogUkVBRE1FOiAgTWlub3IgY2hhbmdlcyBmb3IgNC4xNyByZWxlYXNlLgorCitUaHUgQXByIDIzIDE1OjQ0OjM5IDE5OTggIFBlciBCb3RobmVyICA8Ym90aG5lckBjeWdudXMuY29tPgorCisJKiBzeW1maWxlLmMgKGRlZHVjZV9sYW5ndWFnZV9mcm9tX2ZpbGVuYW1lKTogIC5jbGFzcyBpbXBsaWVzIGphdmEuCisKK1RodSBBcHIgMjMgMTI6NTI6MjEgMTk5OCAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+CisKKyAgICAgICAgKiBjb25maWd1cmUuaW4gKHN0cmVycm9yKTogQ2hlY2sgaWYgZnVuY3Rpb24gbXVzdCBiZSBkZWNsYXJlZC4KKyAgICAgICAgKiBhY2NvbmZpZy5oIChORUVEX0RFQ0xBUkFUSU9OX1NUUkVSUk9SKTogTmV3IGRlZmluZSBzbG90LgorICAgICAgICAqIGdkYl9zdHJpbmcuaCAoc3RyZXJyb3IpOiBGdW5jdGlvbiBkZWNsYXJhdGlvbiBpc3N1ZWQgaWYKKyAgICAgICAgTkVFRF9ERUNMQVJBVElPTl9TVFJFUlJPUi4KKyAgICAgICAgKiBjb25maWd1cmUsIGNvbmZpZy5pbjogRmlsZXMgcmVnZW5lcmF0ZWQuCisKK1RodSBBcHIgMjMgMTI6Mjc6NDMgMTk5OCAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+CisKKyAgICAgICAgKiBzeW1maWxlLmMgKHNpbXBsZV9vdmVybGF5X3VwZGF0ZV8xKTogRG8gbm90IHByZWZpeCBhcnJheSBhZGRyZXNzCisgICAgICAgIGJ5IGAmJy4KKyAgICAgICAgKiBiY2FjaGUuaCAoQkNBQ0hFX0RBVEFfQUxJR05NRU5UKTogRGl0dG8uCisgICAgICAgICogdHJhY2Vwb2ludC5jIChlbmNvZGVfYWN0aW9ucyk6IERpdHRvLgorICAgICAgICAqIGxhbmd1YWdlLmMsIGNvbXBsYWludHMuYywgdXRpbHMuYyAodmFyYXJncy5oKTogRG8gbm90IGluY2x1ZGUgdGhhdAorICAgICAgICBmaWxlIGhlcmUsIGl0IGlzIGFscmVhZHkgaW5jbHVkZWQgaW5kaXJlY3RseSBieSBkZWZzLmguCisgICAgICAgICogZGJ4cmVhZC5jIChkYnhfc3ltZmlsZV9pbml0LCBwcm9jZXNzX29uZV9zeW1ib2wpOiBDYXN0IHhtYWxsb2MgcmV0dXJuCisgICAgICAgIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSBwb2ludGVyIHR5cGUuCisgICAgICAgICogdXRpbHMuYyAoZmxvYXRmb3JtYXRfZnJvbV9kb3VibGVzdCk6IERpdHRvLgorICAgICAgICAqIHRyYWNlcG9pbnQuYyAocmVhZF9hY3Rpb25zLCBfaW5pdGlhbGl6ZV90cmFjZXBvaW50KTogRGl0dG8uCisgICAgICAgIChhZGRfbWVtcmFuZ2UpOiBMaWtld2lzZSB3aXRoIHhyZWFsbG9jIHJldHVybiB2YWx1ZS4KKyAgICAgICAgKiBzdGFic3JlYWQuYyAocmVmX2FkZCk6IERpdHRvLgorICAgICAgICAqIGNvZmZyZWFkLmMgKGNvZmZfc3ltZmlsZV9pbml0KTogTGlrZXdpc2UgZm9yIHhtbWFsbG9jIHJldHVybiB2YWx1ZS4KKyAgICAgICAgKiBlbGZyZWFkLmMgKGVsZl9zeW1maWxlX3JlYWQpOiBEaXR0by4KKyAgICAgICAgKiBvczlrcmVhZC5jIChvczlrX3N5bWZpbGVfaW5pdCk6IERpdHRvLgorCitUaHUgQXByIDIzIDAwOjMyOjA4IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogY29uZmlnLmluOiBSZWJ1aWx0LgorCSogYWNjb25maWcuaCAoRU5BQkxFX05MUywgSEFWRV9DQVRHRVRTLCBIQVZFX1NUUENQWSwgSEFWRV9HRVRURVhULAorCUhBVkVfTENfTUVTU0FHRVMpOiBEZWZpbmUuCisKK1dlZCBBcHIgMjIgMTU6Mzg6NTYgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisJKiBjb25maWd1cmUuaW46IENhbGwgQ1lfR05VX0dFVFRFWFQuCisJKiBNYWtlZmlsZS5pbiAodG9wX2J1aWxkZGlyKTogTmV3IG1hY3JvLgorCShJTlRMKTogRGVmaW5lIHRvIEBJTlRMTElCU0AuCisJKElOVExfREVQUyk6IE5ldyBtYWNyby4KKwkoQ0RFUFMpOiBSZWZlcmVuY2UgSU5UTF9ERVBTLCBub3QgSU5UTC4KKworV2VkIEFwciAyMiAxMjo1ODoyMyAxOTk4IFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCUhhbmRsZSBtaXNzaW5nIHNoYXJlZCBsaWJyYXJpZXMgZHVyaW5nIHRoZSBleGFtaW5hdGlvbiBvZiBhIGNvcmUKKwlkdW1wIGdyYWNlZnVsbHkuCisJKiBzb2xpYi5jIChmaW5kX3NvbGliKTogIFVzZSBjYXRjaF9lcnJvcnMgYXJvdW5kIGNhbGwgdG8KKwlzb2xpYl9tYXBfc2VjdGlvbnMuIFVzZSB3YXJuaW5nIGluc3RlYWQgb2YgZXJyb3IgaWYgcmVhZGluZyBvZgorCXRoZSBzaGFyZWQgbGlicmFyeSBuYW1lIGZhaWxzLgorCShzb2xpYl9tYXBfc2VjdGlvbnMpOiAgQ2hhbmdlIHJldHVybiBhbmQgYXJndW1lbnQgdHlwZXMgdG8gbWFrZQorCWl0IGNhbGxhYmxlIGZyb20gY2F0Y2hfZXJyb3JzLgorCShzeW1ib2xfYWRkX3N0dWIpOiAgQXZvaWQgR0RCIGNvcmUgZHVtcCBpZiBzb2xpYi0+YWJmZCBpcyBOVUxMLgorCSogaXJpeDUtbmF0LmMsIG9zZnNvbGliLmMgKHhmZXJfbGlua19tYXBfbWVtYmVyLCBzb2xpYl9tYXBfc2VjdGlvbnMsCisJc3ltYm9sX2FkZF9zdHViKTogIERpdHRvLgorCitXZWQgQXByIDIyIDE0OjM0OjQ5IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoSU5UTCopOiBBZGQgc3VwcG9ydCB0byBsaW5rIGluIHRoZSBpbnRsIGxpYnJhcnksCisJYW5kIHRvIGFkZCAtSSBvcHRpb25zIHRvIGl0cyBzb3VyY2UgYW5kIG9iamVjdCBkaXJlY3Rvcmllcy4KKwkoSU5URVJOQUxfQ0ZMQUdTKTogRGl0dG8uCisJKEN7TElCUyxERVBTfSk6IERpdHRvLgorCitUdWUgQXByIDIxIDExOjIwOjU0IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIG1pcHMtdGRlcC5jIChnZGJfcHJpbnRfaW5zbl9taXBzKTogRGlzYXNzZW1ibGUgTUlQUyBpbnN0cnVjdGlvbnMKKyAJd2l0aCBzdWJ0YXJnZXQtc3BlY2lmaWMgYG1hY2gnLCByYXRoZXIgdGhhbiBmaXhlZCBkZWZhdWx0LgorCSogY29uZmlnL21pcHMvdG0tbWlwcy5oIChUTV9QUklOVF9JTlNOX01BQ0gpOiBOZXcgbWFjcm8sIGRlZmF1bHQKKwlkaXNhc3NlbWJseSBgbWFjaCcuCisKK01vbiBBcHIgMjAgMTU6MzU6MDMgMTk5OCAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+CisKKyAgICAgICAgKiBjb2ZmcmVhZC5jIChkZWNvZGVfYmFzZV90eXBlKTogVHJlYXQgYSBsb25nIGZpZWxkIHdpdGggc2l6ZSBncmVhdGVyCisgICAgICAgIHRoYW4gVEFSR0VUX0xPTkdfQklUIGFzIGxvbmcgbG9uZy4KKyAgICAgICAgKiB2YWx1ZXMuYyAodmFsdWVfZnJvbV9sb25nZXN0KTogUHJpbnQgY29kZSB2YWx1ZSBpbiBlcnJvciBtZXNzYWdlLgorCitNb24gQXByIDIwIDE1OjMyOjIxIDE5OTggICBNYXJrIEtldHRlbmlzICA8a2V0dGVuaXNAcGh5cy51dmEubmw+CisKKyAgICAgICAgKiBnZGIvZ2RiX3N0cmluZy5oIChzdHJkdXApOiBEZWNsYXJlIG9ubHkgaWYgbm90IGRlZmluZWQgYXMgYQorICAgICAgICBtYWNyby4KKworTW9uIEFwciAyMCAxNDoxODo0NSAxOTk4ICBKLiBLZWFuIEpvaG5zdG9uICA8amtqQHNjby5jb20+CisKKyAgICAgICAgKiBwcm9jZnMuYzogQWRkZWQgcmVwbGFjZW1lbnQgbWFjcm9zIGZvciBMV1Agc3R1ZmYuICBGaXhlZCBzdXBwb3J0IAorICAgICAgICBmb3IgVW5peFdhcmUgLyBTVlI0LjJNUCB0YXJnZXRzIGFuZCBhbnkgdGFyZ2V0cyB3aGljaCB1c2UKKyAgICAgICAgbXVsdGktZmlsZSAvcHJvYyBlbnRyaWVzLiAgRml4ZWQgc3VwcG9ydCBmb3IgaGFyZHdhcmUgd2F0Y2hwb2ludHMuCisgICAgICAgICogc29saWIuYzogU0NPIG5lZWRzIHNvbWUgb2YgdGhlIHNhbWUgY29kZSBhcyBTdW5PUy4gQ2hhbmdlCisgICAgICAgIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMuCisKKyAgICAgICAgKiBjb25maWcvaTM4Ni9pMzg2c2NvNS5tdDogTmV3IGZpbGUuCisgICAgICAgICogY29uZmlnL2kzODYvdG0taTM4NnNjbzUuaDogTmV3IGZpbGUuCisgICAgICAgICogY29uZmlnL2kzODYvaTM4NnNjbzUubWggKE5BVERFUEZJTEVTKTogYWRkIGkzODZ2LW5hdC5vLgorICAgICAgICAqIGNvbmZpZy9pMzg2L25tLWkzODZ2NDJtcC5oIAorICAgICAgICAoVEFSR0VUX0hBU19IQVJEV0FSRV9XQVRDSFBPSU5UUyk6IGRlZmluZS4gIAorICAgICAgICBBZGQgb3RoZXIgbWFjcm9zIGZvciBoYXJkd2FyZSBhc3Npc3RlZCB3YXRjaHBvaW50cy4KKyAgICAgICAgKiBjb25maWcvaTM4Ni9ubS1pMzg2c2NvNS5oOiBDb3JyZWN0IGF0dHJpYnV0aW9ucy4KKyAgICAgICAgKFRBUkdFVF9IQVNfSEFSRFdBUkVfV0FUQ0hQT0lOVFMpOiBkZWZpbmUuCisgICAgICAgICogY29uZmlnL2kzODYvbm0tbGludXguaCAodGFyZ2V0X3JlbW90ZV93YXRjaHBvaW50KTogUGFzcworICAgICAgICAndHlwZScgdGhyb3VnaCB0byBpMzg2X2luc2VydF93YXRjaHBvaW50LgorCitNb24gQXByIDIwIDE0OjEyOjMwIDE5OTggUGV0ZXIgU2NoYXVlciAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6IERvbid0IGFkZCBzaWduYWxsZWQgcHJvY2Vzc2VzCisJYXMgbmV3IHRocmVhZHMuCisJKiBwcm9jZnMuYyAod2FpdF9mZCk6IE5vdGUgaWYgTFdQIGhhcyBleGl0ZWQuCisJKHByb2Nmc193YWl0KTogdXNlIEdFVFBJRCB0byBnZXQgcHJvY2VzcyBJRC4KKworU2F0IEFwciAxOCAxNToyMTowNCAxOTk4ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLnRndDogQWRkZWQgc3BhcmM4Nnggc3VwcG9ydC4KKworVGh1IEFwciAxNiAxMzoxMzoyNCAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogcmRpLXNoYXJlL2V0aGVyZHJ2LmMgKEV0aGVybmV0V3JpdGUpOiBVc2Ugc3RyZXJyb3IgdG8gZ2V0CisJZXJyb3Igc3RyaW5nIGlmIGluIGFuIEFOU0kgQy1pc2ggZW52aXJvbm1lbnQuCisKK1dlZCBBcHIgMTUgMTg6NTk6NDggMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBzcGFyYy10ZGVwLmMgKFNQQVJDX0hBU19GUFUpOiBEZWZpbmUuCisJKHNwYXJjX2V4dHJhY3RfcmV0dXJuX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLCByZXF1aXJlZCB0byBoYW5kbGUKKwltYWNoaW5lcyB3aXRob3V0IGZsb2F0aW5nIHBvaW50LgorCShzcGFyY19zdG9yZV9yZXR1cm5fdmFsdWUpOiBEaXR0by4KKwkqIGNvbmZpZy9zcGFyYy90bS1zcGFyYy5oIChFWFRSQUNUX1JFVFVSTl9WQUxVRSk6IENhbGwKKwlzcGFyY19leHRyYWN0X3JldHVybl92YWx1ZSBpbnN0ZWFkIG9mIHVzaW5nIGlubGluZSBjb2RlLgorCShzcGFyY19leHRyYWN0X3JldHVybl92YWx1ZSk6IERlY2xhcmUuCisJKFNUT1JFX1JFVFVSTl9WQUxVRSk6IENhbGwgc3BhcmNfc3RvcmVfcmV0dXJuX3ZhbHVlIGluc3RlYWQKKwlvZiB1c2luZyBpbmxpbmUgY29kZS4KKwkoc3BhcmNfc3RvcmVfcmV0dXJuX3ZhbHVlKTogRGVjbGFyZS4KKworV2VkIEFwciAxNSAxMjoxOTo0MiAxOTk4ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KKworCSogc29saWIuYyAoZW5hYmxlX2JyZWFrKTogT25seSBjYWxsIHdhcm5pbmcgb25jZQorCWluc3RlYWQgb2YgdGhyZWUgdGltZXMuCisKK1R1ZSBBcHIgMTQgMTY6NTI6NTkgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBzcGFyYy10ZGVwLmMgKHNwYXJjX2V4dHJhY3Rfc3RydWN0X3ZhbHVlX2FkZHJlc3MpOiBNYWtlIGl0CisJd29yayBjb3JyZWN0bHkgb24gbGl0dGxlLWVuZGlhbiBob3N0cy4KKwkoc3BhcmNfcHVzaF9hcmd1bWVudHMpOiBOZXcgZnVuY3Rpb24uCisJKGdkYl9wcmludF9pbnNuX3NwYXJjKTogTmV3IGZ1bmN0aW9uLgorCShfaW5pdGlhbGl6ZV9zcGFyY190ZGVwKTogTWFrZSBnZGJfcHJpbnRfaW5zbl9zcGFyYyB0aGUgZGVmYXVsdAorCWRpc2Fzc2VtYmxlciwgc28gdGhhdCBTUEFSQ2xpdGUtc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIHdpbGwKKwliZSByZWNvZ25pemVkLgorCSogc3BhcmNsLXRkZXAuYyAocmVhZGNoYXIpOiBQcmludCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisJKGRlYnVnX3NlcmlhbF93cml0ZSk6IE5ldyBmdW5jdGlvbiwgYSByZXBsYWNlbWVudCBmb3IgU0VSSUFMX1dSSVRFCisJdGhhdCBwcmludHMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgorCSogY29uZmlnL3NwYXJjL3RtLXNwYXJjLmggKFBVU0hfQVJHVU1FTlRTKTogRGVmaW5lLgorCShzcGFyY19wdXNoX2FyZ3VtZW50cyk6IERlY2xhcmUuCisKK1R1ZSBBcHIgMTQgMTU6NDM6NDkgMTk5OCAgSm9obiBNZXR6bGVyICA8am1ldHpsZXJAY3lnbnVzLmNvbT4KKworCSogZ2RiY2ZneHJlZiAoeHJlZl9tZW51KTogQ2FsbCBuZXcgcmVnZXggYW5kIHdpbGQgY2FyZCBzZWFyY2hlcworCU5vdyB5b3UgY2FuIHR5cGUgaW4gYSBzcGVjaWZpYyB0cmlwbGUgbGlrZSBtaXBzNjQtdnI0MzAwLWVsZiBvcgorCXNvbXRoaW5nIGxpa2UgbWlwcyouaAorCSh0cmlwbGVfc2VhcmNoLCB3aWxkY2FyZHNlYXJjaCk6IFRoZSBuZXcgZnVuY3Rpb25zCisKK01vbiBBcHIgMTMgMTY6Mjg6MDcgMTk5OCAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgorCisJKiB1dGlscy5jICh3YXJuaW5nKTogYWRkZWQgY2FsbCB0byB3YXJuaW5nX2hvb2sKKworCSogc291cmNlLmMgKGZpbmRfc291cmNlX2xpbmVzKTogbW9kaWZpZWQgdG8gY2FsbCB3YXJuaW5nIGluIGNhc2UKKwlvZiBzb3VyY2UgdnMuIGV4ZWN1dGFibGUgdGltZSBzdGFtcCBtaXNtYXRjaC4gU2ltcGxpZmllZCBvYmplY3QKKwlmaWxlIGNoZWNrLiBJbml0aWFsaXplZCBtdGltZSB0byAwLgorCisJKiBkZWZzLmg6IGFkZGVkIHdhcm5pbmdfaG9vayBwcm90b3R5cGUKKworCSogdG9wLmM6IGFkZGVkIHdhcm5pbmdfaG9vayBwcm90b3R5cGUuCisKK01vbiBBcHIgMTMgMDk6NTQ6MDggMTk5OCAgS2VpdGggU2VpdHogIDxrZWl0aHNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9zcGFyYy90bS1zdW40b3M0LmggKElTX1NUQVRJQ19UUkFOU0ZPUk1fTkFNRSk6IEFkZCBtaXNzaW5nCisJZGVmaW5pdGlvbi4KKworRnJpIEFwciAxMCAyMjozNjoyOCAxOTk4ICBQZXRlciBTY2hhdWVyIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworICAgICAgICBVcGRhdGUgc3VwcG9ydCBmb3IgeDg2IFNvbGFyaXMgMi4KKyAgICAgICAgKiBjb25maWcvaTM4Ni90bS1pMzg2c29sMi5oLCBubS1pMzg2c29sMi5oOiAgTmV3IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgZmlsZXMgZm9yIHg4NiBTb2xhcmlzIDIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAqIGNvbmZpZy9pMzg2L2kzODZzb2wyLm10LCBpMzg2c29sMi5taDogIFVzZSB0aGVtLiAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICogY29uZmlnL3NwYXJjL3RtLXN1bjRzb2wyLmggKFBST0NGU19HRVRfQ0FSUlkpOiAgTmV3IG1hY3JvLCBleHRyYWN0ICAKKyAgICAgICAgY2FycnkgZmxhZyBmcm9tIGEgZ2l2ZW4gcmVnc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgKElTX1NUQVRJQ19UUkFOU0ZPUk1fTkFNRSk6ICBOZXcgbWFjcm8sIGNoZWNrIGlmIGEgc3ltYm9sIG5hbWUgICAgICAKKyAgICAgICAgaXMgYSBTdW5Qcm8gdHJhbnNmb3JtZWQgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgKiBpMzg2LXRkZXAuYyAoc3VucHJvX3N0YXRpY190cmFuc2Zvcm1fbmFtZSk6ICBOZXcgZnVuY3Rpb24gdG8KKyAgICAgICAgZXh0cmFjdCB0aGUgc291cmNlIG5hbWUgZnJvbSBhIFN1blBybyB0cmFuc2Zvcm1lZCBuYW1lLiAgICAgICAgICAgCisgICAgICAgICogaW5mZXJpb3IuaCAocHJvY2ZzX2ZpcnN0X2F2YWlsYWJsZSwgcHJvY2ZzX2dldF9waWRfZmQpOiAgICAgICAgCisgICAgICAgIEFkZCBwcm90b3R5cGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAqIGluZnJ1bi5jICh3YWl0X2Zvcl9pbmZlcmlvcik6ICBIYW5kbGUgYnJlYWtwb2ludCBoaXQgaW4KKyAgICAgICAgc2lnbmFsIGhhbmRsZXIgd2l0aG91dCBpbnRlcnZlbmluZyBzdG9wIGluIHNpZ3RyYW1wLiAgICAgCisgICAgICAgICogcHJvY2ZzLmMgKHByb2Nmc19sd3BfY3JlYXRpb25faGFuZGxlcik6ICBVc2UgUFJPQ0ZTX0dFVF9DQVJSWQorICAgICAgICBpbnN0ZWFkIG9mIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIHN0YXR1cyByZWdpc3Rlci4gICAgICAgICAgICAgICAKKyAgICAgICAgKHByb2Nmc19nZXRfcGlkX2ZkKTogIE5ldyBmdW5jdGlvbiwgcmV0dXJucyBwcm9jZnMgZmQgZm9yIGEgZ2l2ZW4gcGlkLgorICAgICAgICAqIHNvbC10aHJlYWQuYyAocHNfbGdldExEVCk6ICBOZXcgZnVuY3Rpb24sIHJldHVybnMgTERUIGZvciBhIGdpdmVuICAgCisgICAgICAgIGx3cGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgKHNvbF9maW5kX25ld190aHJlYWRzKTogIEhhbmRsZSBmYWlsZWQgbGlidGhyZWFkX2RiIGluaXRpYWxpemF0aW9uIAorICAgICAgICBncmFjZWZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgKiBzdGFic3JlYWQuYyAoZGVmaW5lX3N5bWJvbCk6ICBVc2UgSVNfU1RBVElDX1RSQU5TRk9STV9OQU1FICAgICAgCisgICAgICAgIHRvIGNoZWNrIGZvciBhIFN1blBybyB0cmFuc2Zvcm1lZCBzeW1ib2wgbmFtZS4gICAgICAgICAgICAgIAorCitGcmkgQXByIDEwIDEwOjM1OjM1IDE5OTggIEpvaG4gTWV0emxlciAgPGptZXR6bGVyQGN5Z251cy5jb20+CisKKwkqIHV0aWxzLmMgKGZtdGhleCk6IEEgZm9ybWF0dGluZyBmdW5jdGlvbiBmb3IgaGV4ZHVtcHMKKworCSogbWlwcy10ZGVwLmMgKHVucGFja19taXBzMTYpOiBGaXhlZCBpbnN0cnVjdGlvbiBkZWNvZGluZywgbG90cyBvZgorIAliaXQgcGF0dGVybiBpbnRlcnByZXRhdGlvbnMuIG1pcHNfZmV0Y2hfaW5zdHJ1Y3Rpb24gZG9lcyBub3Qgd29yaworIAlmb3IgMTYgYml0IGluc3RydWN0aW9ucy4gU29tZSBjb25mdXNpb24gcmVtYWlucyBhYm91dCBzaWduCisgCWV4dGVuc2lvbiBpbiBiYWNrd2FyZCBicmFuY2hlcy4KKwkobWlwczMyX3JlbGF0aXZlX29mZnNldCk6IFNpZ24gZXh0ZW5zaW9uCisJKG1pcHMzMl9uZXh0X3BjKTogTWFqb3IgZGVidWdnaW5nLCBiaXQgcGF0dGVybiBpbnRlcnByZXRhdGlvbgorCShwcmludF91bnBhY2spOiBkZWJ1Z2dpbmcgcHJpbnRmCisJKGZldGNoX21pcHNfMTYpOiBuZXcgZnVudGlvbiwga2V5IG9uIFBDIGxvdyBiaXQsIG5vdCBzeW1ib2wgdGFibGUKKwkobWlwczE2X25leHRfMTYpOiBJbml0aWFsIG1ham9yIGRlYnVnZ2luZyBvZiB0aGlzIGZ1bmN0aW9uLiBMb3RzCisgCW9mIGJpdCBwYXR0ZXJuIG1pc3Rha2VzLgorCShtaXBzX25leHRfcGMpOiBrZXkgb24gbG93IGJpdCBvZiBQQywgbm90IHN5bWJvbCB0YWJsZS4KKwkqIHN5bWZpbGUuYyAoZ2VuZXJpY19sb2FkKTogQWRkZWQgYSBkb3dubG9hZCB2ZXJpZmljYXRpb24gd2hpY2gKKyAJcmVhZHMgYmFjayB0aGUgbG9hZGVkIGNvZGUuIERvd25sb2FkIGNodW5rIHNpemUgaXMgbm93IGEgZGVmaW5lZAorIAltYWNyby4gRml4ZWQgYSBidWcgaW4gd2hpY2ggZG93bmxvYWRpbmcgc2xpcHMgaW50byBsb2FkaW5nIG9uZQorIAlieXRlIGF0IGEgdGltZS4gTG93ZXIgbGV2ZWwgZnVuY3Rpb25zIGluIG1vbml0b3IuYyBjYW4gbG9hZCBsb25nCisgCXNlcXVlbmNlcyBvZiBieXRlcyBhbmQgbWFrZSB1c2Ugb2YgdGhlc2UgZml4dXBzLiAgUmVmZXJlbmNpbmcKKyAJYmZkLXN0YXJ0X2FkZHJlc3MgZGlyZWN0bHkgd2FzIGluY29ycmVjdGx5IGdldHRpbmcgemVybyBmb3Igc3RhcnQuCisKK1RodSBBcHIgIDkgMTk6MjA6MzIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtaXBzLXRkZXAuYyAoZG9fZnBfcmVnaXN0ZXJfcm93KTogVXNlIGFsbG9jYSByYXRoZXIgdGhhbiBhcnJheXMKKwl3aXRoIGR5bmFtaWMgc2l6ZS4KKworV2VkIEFwciAgOCAxOToyMTo0MiAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogdG9wLmMgKHByaW50X2dkYl92ZXJzaW9uKTogUHJpbnQgMTk5OCBub3cuCisKK1dlZCBBcHIgIDggMTY6NTc6MjIgMTk5OCAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+CisKKwkqIHNvdXJjZS5jOiBSZW1vdmUgb2Jzb2xldGUgZGVjbCBvZiBzdHJzdHIoKS4KKworV2VkIEFwciAgOCAxNjo0NzozMyAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogc29saWIuYyAoc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiBSZW1vdmUgVWxyaWNoIERyZXBwZXIncworCXBhdGNoIG9mIE1hcmNoIDIzIDE5OTguCisJKiBicmVha3BvaW50LmMgKGJyZWFrcG9pbnRfcmVfc2V0X29uZSk6IFJlbW92ZSBVbHJpY2ggRHJlcHBlcidzCisJcGF0Y2ggb2YgTWFyY2ggMjMgMTk5OC4KKworU2F0IEFwciAgNCAxMDowNTowMCAxOTk4ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+CisKKwkqIG1kZWJ1Z3JlYWQuYyAocGFyc2VfcGFydGlhbF9zeW1ib2xzKTogSWYgdGhpcyBpcyBhbiAubWRlYnVnIAorCXNlY3Rpb24gaW4gYW4gRUxGIGZpbGUsIG92ZXJyaWRlIGEgc3ltYm9sJ3MgRUNPRkYgc2VjdGlvbiB3aXRoIGl0cyAKKwlFTEYgc2VjdGlvbi4gIEFsc28sIGZpeCBzdGFicyBjb250aW51YXRpb24gd2hlcmUgYSBzdGFicyBzdHJpbmcgCisJY29udGludWVzIGZvciBtb3JlIHRoYW4gb25lIGNvbnRpbnVhdGlvbi4KKworTW9uIEFwciAgNiAwOToxNzo0OCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIG1pcHMtdGRlcC5jIChtaXBzX3B1c2hfYXJndW1lbnRzKTogU3BlY2lmeSBkaW1lbnRpb24gb2YgdmFsYnVmCisgCXVzaW5nIE1BWF9SRUdJU1RFUl9SQVdfU0laRS4KKworU2F0IEFwciAgNCAxMDowNTowMCAxOTk4ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+CisKKwkqIGluZnJ1bi5jOiBGaXggcHJvdG90eXBlIG9mIHNpZ25hbHNfaW5mbyB0byBtYXRjaCBzdGF0aWMgZnVudGlvbi4KKworVGh1IEFwciAgMiAxMjo0Nzo0MSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBzb2wtdGhyZWFkLmMgKHNvbF90aHJlYWRfc3RvcmVfcmVnaXN0ZXJzKTogU2F2ZSAmIHJlc3RvcmUgbmV3CisgCXZhbHVlIG9mIHNpbmdsZSB1cGRhdGVkIHJlZ2lzdGVyIHRvIHByZXZlbnQgYWNjaWRlbnRhbCBjbG9iYmVyaW5nLgorCitXZWQgQXByICAxIDIyOjAxOjA5IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3NwYXJjL3RtLXNwYXJjbGl0ZS5oIChUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFKTogRGVmaW5lLgorCSogY29uZmlnL3NwYXJjL3NwYXJjbGl0ZS5tdDogTGluayBpbiB0aGUgZXJjMzIgc2ltdWxhdG9yLgorCitXZWQgQXByICAxIDE2OjMwOjQ5IDE5OTggIElhbiBEYWxsICA8SWFuLkRhbGxAZHN0by5kZWZlbmNlLmdvdi5hdT4KKworICAgICAgICAqIG5zMzJrLXRkZXAuYyAoZmxpcF9ieXRlcywgbnMzMmtfbG9jYWxjb3VudCwKKyAgICAgICAgbnMzMmtfZ2V0X2VudGVyX2FkZHIsIHNpZ25fZXh0ZW5kKTogUmVzdG9yZSBmdW5jdGlvbnMgbXlzdGVyaW91c2x5CisgICAgICAgIGRlbGV0ZWQuCisKKyAgICAgICAgKiBuczMya25ic2QtbmF0LmM6IE5ldyAoPykgZmlsZSB0byBzdXBwb3J0IGZldGNoaW5nIGFuZCBzdG9yaW5nCisgICAgICAgIHJlZ2lzdGVycyBvbiBOZXRCU0QgaG9zdHMuCisKKyAgICAgICAgKiBuYnNkLm1oIChOQVRERVBGSUxFUyk6IHB1dCBuczMya25ic2QtbmF0Lm8gaW5zdGVhZCBvZgorICAgICAgICBuczMyay1uYXQubworCisgICAgICAgICogbnMzMmttMy1uYXQuYyAocmVnX29mZnNldCk6IEdldCBvcmRlciBvZiBmbG9hdGluZyBwb2ludAorICAgICAgICByZWdpc3RlcnMgY29ycmVjdC4gQWRkIGV4dHJhIDMyMzgyIHJlZ2lzdGVyIG9mZnNldHMuCisgICAgICAgIChSRUdfQUREUkVTUyk6IGRlZmluZSB0byBwb2ludCBhdCBjb3JyZWN0IHBhcnQgb2YgdGhyZWFkCisgICAgICAgIHN0YXRlLiBVc2UgY2FsbHMgdG8gIndhcm5pbmciIGluc3RlYWQgb2YgIm1lc3NhZ2UiLgorCisgICAgICAgICogdG0tbmJzZC5oLCB0bS1uczMya20zLmggKFJFR0lTVEVSX05BTUVTLCBOVU1fUkVHUywKKyAgICAgICAgUkVHSVNURVJfQllURVMsIFJFR0lTVEVSX0JZVEUpOiByZWRlZmluZSBhbGxvd2luZyBmb3IgMzIzODIKKyAgICAgICAgZnB1IHJlZ2lzdGVycy4KKworV2VkIEFwciAgMSAxMzo0MzowNyAxOTk4ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQG1hY3FlbC5iZT4KKworICAgICAgICAqIE5FV1M6IG02OGstbW90b3JvbGEtc3lzdiBob3N0IHN1cHBvcnQgYWRkZWQuCisgICAgICAgICogY29mZnJlYWQuYyAoY29mZl9zdGFydF9zeW10YWIpOiBBY2NlcHQgdGhlIGZpbGVuYW1lIGFzIGFuIGFyZ3VtZW50LAorICAgICAgICBzZXQgaXQgaGVyZS4gIENhbGxlcnMgdXBkYXRlZC4KKworV2VkIEFwciAgMSAyMzoxMzoyMyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9taXBzL3RtLW1pcHMuaCAoUkVHSVNURVJfVklSVFVBTF9UWVBFKTogSGFuZGxlIDMyIGJpdCBTUiwKKyAJRlNSIGFuZCBGSVIgcmVnaXN0ZXJzLgorCShSRUdJU1RFUl9WSVJUVUFMX1NJWkUpOiBDb21wdXRlIHVzaW5nIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRS4KKwkoUkVHSVNURVJfUkFXX1NJWkUpOiBEZWZpbmUgdXNpbmcgUkVHSVNURVJfVklSVFVBTF9TSVpFLgorCisJKiBjb25maWcvbWlwcy90bS1taXBzNjQuaDogRGl0dG8uCisKK1R1ZSBNYXIgMzEgMjE6MzA6MzkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogYXJtLXRkZXAuYyAoZ2RiX3ByaW50X2luc25fYXJtKTogQXR0YWNoIGEgZmFrZSBUaHVtYiBzeW1ib2wKKwl2ZWN0b3IgdG8gdGhlIGluZm8gc3RydWN0dXJlIHdoZW4gZGlzYXNzZW1ibGluZyB0aHVtYgorCWluc3RydWN0aW9ucy4gCisKKwkqIGNvZmZyZWFkLmMgKGNvZmZfc3ltdGFiX3JlYWQsIHJlYWRfb25lX3N5bSwKKwlwcm9jZXNzX2NvZmZfc3ltYm9sKTogIFN1cHBvcnQgVGh1bWIgc3ltYm9sIHR5cGVzLiAKKworCSogZGJ4cmVhZC5jIChwcm9jZXNzX29uZV9zeW1ib2wpOiBDYWxsIFNNQVNIX1RFWFRfQUREUkVTUyAoaWYgaXQKKwlpcyBkZWZpbmVkKSBmb3IgZnVuY3Rpb24gc3ltYm9scy4gIAorCitUdWUgTWFyIDMxIDE2OjM5OjI4IDE5OTggIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIHRyYWNlcG9pbnQuYyAoZ2V0X3RyYWNlcG9pbnRfYnlfbnVtYmVyKTogY2hhbmdlIHdhcm5pbmcgdG8gbm90ZS4KKwkoZGVsZXRlX3RyYWNlX2NvbW1hbmQpOiBzdXBwcmVzcyB5L24gcXVlcnkgaWYgbm8gdHJhY2Vwb2ludHMsIG9yCisJaWYgbm90IGZyb21fdHR5LiAgKHRyYWNlX3Bhc3NfY29tbWFuZCk6IHJlamVjdCBqdW5rIGF0IGVuZCBvZiBhcmdzLgorCShyZWFkX2FjdGlvbnMpOiBhbiBhY3Rpb24gbGlzdCBjb25zaXN0aW5nIG9ubHkgb2YgImVuZCIgaXMgZGlzY2FyZGVkLgorCSh2YWxpZGF0ZV9hY3Rpb25saW5lIChmb3IgY29sbGVjdCBjb21tYW5kKSk6IGFuIGFyZ3VtZW50IGJlZ2lubmluZworCXdpdGggYSBkb2xsYXJfc2lnbiBidXQgbm90IHJlY29nbml6ZWQgYXMgYSBzcGVjaWFsIGFyZ3VtZW50IGlzCisJcGFyc2VkIGxpa2UgYW55IG90aGVyIGV4cHJlc3Npb24gLS0gaWYgaXQgaXNuJ3QgYSByZWdpc3RlciBuYW1lLAorCWl0J3MgcmVqZWN0ZWQuICBBbHNvIHJlamVjdCBhbiBlbXB0eSBhcmd1bWVudCB0byB3aGlsZS1zdGVwcGluZy4KKwkodHJhY2VfZmluZF9jb21tYW5kKTogcmVqZWN0IGEgbmVnYXRpdmUgZnJhbWUgbnVtYmVyIGFyZ3VtZW50LgorCShfaW5pdGlhbGl6ZV90cmFjZXBvaW50KTogc2V0ICR0cmFjZWZyYW1lIGluaXRpYWxseSB0byAtMS4KKworTW9uIE1hciAzMCAxNjo0MjoxMiAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogcmRpLXNoYXJlL01ha2VmaWxlLmFtLCByZGktc2hhcmUvYWNsb2NhbC5tNCwKKwlyZGktc2hhcmUvY29uZmlndXJlOiBOZXcgZmlsZXMuCisJKiByZGktc2hhcmUvY29uZmlndXJlLmluOiAgUmV3cml0dGVuIHRvIGJlIGFuIGF1dG9jb25mIGlucHV0IGZpbGUuCisJKiByZGktc2hhcmUvTWFrZWZpbGUuaW4sIHJkaS1zaGFyZS9jb25maWd1cmU6IEdlbmVyYXRlZCBieSAKKwlhdXRvbWFrZS9hdXRvY29uZi4KKwkqIHJkaS1zaGFyZS9kYmdfaGlmLmgsIGV0aGVyZHJ2LmMsIGhvc3RjaGFuLmM6IFVzZSBhdXRvY29uZiB0ZXN0cworCXRvIGNoZWNrIGVudmlyb25tZW50LgorCitTdW4gTWFyIDI5IDE1OjE3OjE2IDE5OTggIEtlaXRoIFNlaXR6ICA8a2VpdGhzQG9uaW9ucy5jeWdudXMuY29tPgorCisJKiB0cmFjZXBvaW50LmMgKHRyYWNlX3N0YXJ0X2NvbW1hbmQpOiBTZXQgdHJhY2VfcnVubmluZ19wLgorCSh0cmFjZV9zdG9wX2NvbW1hbmQpOiBDbGVhciB0cmFjZV9ydW5uaW5nX3AuCisKK1NhdCBNYXIgMjggMTU6MTk6NDggMTk5OCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBORVdTOiBVcGRhdGUgZm9yIDQuMTcgcmVsZWFzZS4KKworRnJpIE1hciAyNyAxMDoxNTo1MCAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGl0by5jeWdudXMuY29tPgorCisJKiB0cmFjZXBvaW50LmMgKHBhcnNlX2FuZF9ldmFsX21lbXJhbmdlKTogRml4IG1lbW9yeSBsZWFrcy4KKwkoZW5jb2RlX2FjdGlvbnMpOiBVc2UgdGhlIG5ldyBnZW5fdHJhY2VfZm9yX2V4cHIgZnVuY3Rpb24KKwlpbnN0ZWFkIG9mIGV4cHJfdG9fYWRkcmVzc19hbmRfc2l6ZTsgY29sbGVjdCByZWdpc3RlcnMgd2hlbgorCXVzaW5nIGV4cHJlc3Npb25zLiAgKGNsZWFyX2NvbGxlY3Rpb25fbGlzdCk6IEZpeCBtZW1vcnkgbGVhay4KKworMTk5OC0wMy0yNiAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgorCisJKiBheC1nZGIuaCAoZ2VuX3RyYWNlX2Zvcl9leHByKTogQWRkIHByb3RvdHlwZS4KKworVGh1IE1hciAyNiAxNzoyNDoyMyAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KKworCSogdHJhY2Vwb2ludC5jICh2YWxpZGF0ZV9hY3Rpb25saW5lKTogRml4IG1lbW9yeSBsZWFrLgorCShlbmNvZGVfYWN0aW9ucyk6IEZpeCBtZW1vcnkgbGVhay4KKworVGh1IE1hciAyNiAxNjoxNjo1NSAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGl0by5jeWdudXMuY29tPgorCisJKiB0cmFjZXBvaW50LmMgKHRyYWNlX21lbnRpb24pOiBOZXcgZnVuY3Rpb24uCisJKHRyYWNlX2NvbW1hbmQpOiBDYWxsIGl0LgorCisxOTk4LTAzLTI2ICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+CisKKwkqIGF4LWdlbmVyYWwuYyAoYXhfcmVxcyk6IE5ldyBmdW5jdGlvbi4KKwkqIGF4LmggKGVudW0gYWdlbnRfZmxhd3MsIHN0cnVjdCBhZ2VudF9yZXFzKTogTmV3IHR5cGVzLgorCShhZ2VudF9yZXFzKTogTmV3IGV4dGVybiBwcm90b3R5cGUuICBXZWxsLCBhY3R1YWxseSwgdGhpcyB3YXMKKwl0aGVyZSBiZWZvcmUsIGR1ZSB0byBhIHByZW1hdHVyZSBjaGVja2luLgorIAkoc3RydWN0IGFvcF9tYXApOiBBZGQgbmV3IGBkYXRhX3NpemUnIG1lbWJlci4KKwkqIGF4LWdlbmVyYWwuYyAoYW9wX21hcCk6IFN1cHBseSBpdHMgdmFsdWUuCisJKiBheC1nZGIuYyAoYWdlbnRfY29tbWFuZCk6IENhbGwgYXhfcmVxcywgZm9yIHRlc3RpbmcuCisKKwkqIGF4LWdlbmVyYWwuYyAoYXhfcHJpbnQpOiBJZiB3ZSBlbmNvdW50ZXIgYW4gaW52YWxpZCBvcgorCWluY29tcGxldGUgb3Bjb2RlLCBkb24ndCBhYm9ydDsganVzdCBwcmludCBhbiBlcnJvciBtZXNzYWdlLgorCisJKiBheC1nZGIuYzogR2VuZXJhdGUgdHJhY2UgYnl0ZWNvZGVzLCBhcyBhcHByb3ByaWF0ZS4KKwkodHJhY2Vfa2x1ZGdlKTogTmV3IHZhcmlhYmxlLgorCShnZW5fZmV0Y2gsIGdlbl9iaXRmaWVsZF9yZWYpOiBFbWl0IHRyYWNlIGJ5dGVjb2RlcywgaWYgYXNrZWQKKyAJbmljZWx5LgorCShleHByX3RvX2FnZW50KTogQXNrIGZvciBubyB0cmFjZSBieXRlY29kZXMuCisJKGdlbl90cmFjZV9mb3JfZXhwcik6IE5ldyBmdW5jdGlvbi4KKwkoYWdlbnRfY29tbWFuZCk6IENhbGwgaXQsIGFuZCBkaXNwbGF5IHRoZSByZXN1bHQgYXBwcm9wcmlhdGVseSAtLS0KKwlubyBzdHJ1Y3QgYXhzX3ZhbHVlLCBzbyBubyB0eXBlIG9yIGtpbmQgaW5mb3JtYXRpb24uCisKKwkqIGF4LWdkYi5jOiBVc2UgVEFSR0VUX0NIQVJfQklUIHRocm91Z2hvdXQsIG5vdCBIT1NUX0NIQVJfQklULgorCitUaHUgTWFyIDI2IDIyOjI5OjI4IDE5OTggIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KKworICAgICAgICAqIHRyYWNlcG9pbnQuYyAodHJhY2Vfc3RhdHVzX2NvbW1hbmQpOiBSZWNvZ25pemUgYSBib29sZWFuIHJldHVybgorICAgICAgICB2YWx1ZSBmcm9tIHRoZSBzdHViIHRvIGluZGljYXRlIHdoZXRoZXIgdHJhY2UgZXhwZXJpbWVudCBpcworICAgICAgICBydW5uaW5nLiAgRXhwb3J0IHRoaXMgdmFsdWUgYXMgYSBnbG9iYWwgc3RhdGUgdmFyaWFibGUuCisgICAgICAgICh0cmFjZV9ydW5uaW5nX3ApIGZvciB1c2UgYnkgdGhlIEdVSS4gKGZyb20gTWljaGFlbCBTbnlkZXIpCisgICAgICAgICh0cmFjZV9wYXNzX2NvbW1hbmQpIGFkZGVkIGNhbGwgdG8gbW9kaWZ5X3RyYWNlcG9pbnRfaG9vay4KKworICAgICAgICAqIHRyYWNlcG9pbnQuaCBleHBvcnQgdHJhY2VfcnVubmluZ19wLgorCitUaHUgTWFyIDI2IDEzOjA4OjAxIDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJKiB0cmFjZXBvaW50LmMgKHZhbGlkYXRlX2FjdGlvbmxpbmUpOiBkbyBub3QgZXJyb3Igb3V0IGlmCisJZXhwLT5lbHRzWzBdLm9wY29kZSBpcyBub3Qgb24gc2hvcnQgbGluZSAtLSBsZXQKKwlleHByX3RvX2FkZHJlc3NfYW5kX3NpemUgaGFuZGxlIGl0LgorCisxOTk4LTAzLTI2ICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+CisKKwkqIHRyYWNlcG9pbnQuYzogSW5jbHVkZSAiYXguaCIsIG5vdCAiYWdlbnRleHByLmgiLgorCisJKiB0cmFjZXBvaW50LmMgKGVuY29kZV9hY3Rpb25zKTogQ2FsbCBleHByX3RvX2FkZHJlc3NfYW5kX3NpemUsCisJbm90IHNpbXBseSBleHByX3RvX2FnZW50LgorCisJKiBheC1nZW5lcmFsLmM6IENvbW1lbnQgb3V0IGNvZGUgaW4gcHJvZ3Jlc3MsIHNvIGV2ZXJ5b25lIGVsc2UgY2FuCisJYXQgbGVhc3QgY29tcGlsZS4KKworCSogZ2RidHlwZXMuYzogRG9jIGZpeC4KKworCSogYXguaCwgYXgtZ2RiLmgsIGF4LWdlbmVyYWwuYywgYXgtZ2RiLmM6IE5ldyBmaWxlcy4KKwkqIE1ha2VmaWxlLmluIChSRU1PVEVfT0JKUyk6IEFkZCBheC1nZW5lcmFsLm8gYW5kIGF4LWdkYi5vLgorCShTRklMRVMpOiBBZGQgYXgtZ2VuZXJhbC5jLCBheC1nZGIuYy4KKwkoYXhfaCk6IE5ldyB2YXJpYWJsZS4KKwkoYXgtZ2VuZXJhbC5vLCBheC1nZGIubyk6IE5ldyBydWxlcy4KKworCitUdWUgTWFyIDI0IDE2OjIyOjQwIDE5OTggIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJodW5hLmN5Z251cy5jby51az4KKworCSogTWFrZWZpbGUuaW46ICBEZXJpdmUgU0hFTEwgZnJvbSBjb25maWd1cmUuCisJKiBjb25maWcvZDEwdi9kMTB2Lm10IGNvbmZpZy9tMzJyL20zMnIubXQKKwljb25maWcvbW4xMDIwMC9tbjEwMjAwLm10IGNvbmZpZy9tbjEwMzAwL21uMTAzMDAubXQKKwljb25maWcvZDMwdi9kMzB2Lm10OiAgUmVtb3ZlIC1sbSBmcm9tIFNJTS4gIFRoaXMgcHJldmVudHMKKwlkZXBlbmRlbmN5IGNoZWNraW5nIG9mIC1sbSAodW5kZXIgTlQgbmF0aXZlIGJ1aWxkcykuICAoSXQgaXMKKwlhdXRvbWF0aWNhbGx5IGFkZGVkIGJ5IGNvbmZpZ3VyZSBpZiBpdCBleGlzdHMuKQorCSogZG9jL2NvbmZpZ3VyZSBtc3dpbi9jb25maWd1cmUgbmxtL2NvbmZpZ3VyZQorCXRlc3RzdWl0ZS9nZGIuYmFzZS9jb25maWd1cmUgdGVzdHN1aXRlL2dkYi5jKysvY29uZmlndXJlCisJdGVzdHN1aXRlL2dkYi5jaGlsbC9jb25maWd1cmUgdGVzdHN1aXRlL2dkYi5kaXNhc20vY29uZmlndXJlCisJdGVzdHN1aXRlL2dkYi5zdGFicy9jb25maWd1cmUgdGVzdHN1aXRlL2dkYi50aHJlYWRzL2NvbmZpZ3VyZToKKwlSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi4xMi4xIHRvIGZpeCBzaGVsbCBpc3N1ZXMgZm9yIE5UIG5hdGl2ZQorCWJ1aWxkcy4KKworTW9uIE1hciAyMyAxODoxMDo1NyAxOTk4ICBVbHJpY2ggRHJlcHBlciAgKGRyZXBwZXJAY3lnbnVzLmNvbSkKKworCSogc29saWIuYyAoc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiAgUmV3cml0ZSBwcmV2aW91cworCWNoYW5nZSB0byBjaGVjayB0aGUgdHlwZSBvZiBmaWxlIHZpYSBCRkQuCisKK01vbiBNYXIgMjMgMTM6NTI6MjggMTk5OCAgVWxyaWNoIERyZXBwZXIgIChkcmVwcGVyQGN5Z251cy5jb20pIAorIAorCSogYnJlYWtwb2ludC5jIChicmVha3BvaW50X3JlX3NldF9vbmUpOiBUcmVhdCBicF9zaGxpYl9ldmVudHMKKwlsaWtlIGJwX2JyZWFrcG9pbnRzLgorCSogc29saWIuYyAoc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2spOiBSZWxvY2F0ZSBzZWN0aW9uIGFkZHJlc3NlcworCWlmIHRoZSBhbGxlZ2VkIHN0YXJ0IGFkZHJlc3MgZG9lc24ndCBhZ3JlZSB3aXRoIHRoZSBQQy4KKworU2F0IE1hciAyMSAxOTozNDo0OSAxOTk4ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+CisKKwltZXJnZWQgY2hhbmdlcyBmcm9tIEZvdW5kcnkgKGxpc3QgZm9sbG93cyBieSBmaWxlL2F1dGhvcik6CisKKyAgICAgICAgLSBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisgICAgICAgICogTWFrZWZpbGUuaW4gKGdkYnJlcy5vKTogTmV3IHRhcmdldC4KKyAgICAgICAgKFdJTkRSRVMpOiBOZXcgZGVmaW5lLgorICAgICAgICAqIGNvbmZpZ3VyZTogUmVidWlsdC4KKyAgICAgICAgKiBjb25maWd1cmUuaW4gKFdJTkRSRVMpOiBEZWZpbmUuCisgICAgICAgIChDT05GSUdfT0JTKTogSW5jbHVkZSBnZGJyZXMubyBvbiBXaW5kb3dzLgorICAgICAgICAqIGdkYnRvb2wuaWNvOiBOZXcgZmlsZS4KKyAgICAgICAgKiBnZGIucmM6IE5ldyBmaWxlLgorCisgICAgICAgICogc2VyLXVuaXguYworICAgICAgICAtIEtlaXRoIFNlaXR6ICA8a2VpdGhzQG9uaW9ucy5jeWdudXMuY29tPgorICAgICAgICAod2FpdF9mb3IpOiBEb24ndCByZXNldCB0aGUgdGltZW91dF9yZW1haW5pbmcgZm9yIENZR1dJTjMyLAorICAgICAgICBzaW5jZSB3ZSBub3cgZWZmZWN0aXZlbHkgcG9sbCB0aGUgc2VyaWFsIHBvcnQuCisgICAgICAgIERvbid0IHJlc2V0IHRoZSBjdXJyZW50X3RpbWVvdXQsIGVpdGhlciwgc2luY2UgdGhpcyBtZW1iZXIgaXMgdXNlZAorICAgICAgICBieSBoYXJkd2lyZV9yZWFkY2hhciB0byB0cmFjayB0aGUgdGltZW91dCBhbmQgY2FsbCB0aGUgdWlfbG9vcF9ob29rLgorCShoYXJkd2lyZV9yZWFkY2hhcik6IFBvbGwgdGhlIHNlcmlhbCBwb3J0IGZvciBDeWd3aW4zMi4gV2UgdGltZW91dAorIAlldmVyeSBzZWNvbmQsIHVwZGF0ZSB0aGUgVUksIGFuZCBsb29wIGFyb3VuZCBkb2luZyB0aGlzIHVudGlsIHdlCisgCWhhdmUgaGl0IHRoZSByZWFsIHRpbWVvdXQgb3Igd2UgZ2V0IGRhdGEgb3IgYW4gZXJyb3IuIFRoaXMgd2lsbAorIAlhbGxvdyB0aGUgVUkgdG8gc3RheSBhY3RpdmUgd2hpbGUgZ2RiIGlzICJibG9ja2VkIiB0YWxraW5nIHRvIHRoZQorIAl0YXJnZXQuCisgICAgICAgCS0gTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+CisJKHdhaXRfZm9yKTogRG8gcmVzZXQgY3VycmVudF90aW1lb3V0IGJlY2F1c2UgaXQgaXMgb25seSB1c2VkIHRvCisgCWtlZXAgdHJhY2sgb2Ygd2hhdCB0aGUgY3VycmVudCB0aW1lb3V0IGZvciB0aGUgc2NiIGlzLgorCisgICAgICAgICogdG9wLmMKKyAgICAgICAgLSBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KKyAgICAgICAgKHF1aXRfY29uZmlybSk6IENoYW5nZSBleGl0IG1lc3NhZ2UgYWdhaW4KKyAgICAgICAgZm9yIEdVSS4KKyAgICAgICAgKHBjX2NoYW5nZWRfaG9vayk6IEFkZCBwcm90b3R5cGUuCisgICAgICAgIC0gVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorICAgICAgICAocXVpdF9jb25maXJtKTogQWRkZWQgbWlzc2luZyBgZWxzZScuCisgICAgICAgIChxdWl0X2NvbmZpcm0pOiBTcGVjaWFsLWNhc2UgbWVzc2FnZSBpZiBpbml0X3VpX2hvb2sgaXMKKyAgICAgICAgc2V0LgorCisgICAgICAgICogc3ltdGFiLmMKKyAgICAgICAgLSBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KKyAgICAgICAgKGZpbmRfcGNfc2VjdF9saW5lKTogSWYgbm8gc3ltYm9sIGluZm9ybWF0aW9uCisgICAgICAgIGlzIGZvdW5kLCByZXR1cm4gY29ycmVjdCBwYyBhbnl3YXkuCisgICAgICAgIChmaW5kX21ldGhvZHMpOiBDb21tZW50IG91dCBhbiBhcHBhcmVudGx5CisgICAgICAgIGJvZ3VzIGVycm9yIG1lc3NhZ2UgYmVjYXVzZSBpdCBtZXNzZXMgdXAgRm91bmRyeS4KKworICAgICAgICAqIHNlcmlhbC5jCisgICAgICAgIC0gTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+CisgICAgICAgIChfaW5pdGlhbGl6ZV9zZXJpYWwpOiBBZGQgYSBkZXNjcmlwdGlvbiBvZgorICAgICAgICAic2V0IHJlbW90ZWxvZ2Jhc2UiLgorCisgICAgICAgICogZmluZHZhci5jCisgICAgICAgIC0gTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+CisgICAgICAgICh3cml0ZV9yZWdpc3Rlcl9nZW4pOiBBZGQgY2FsbCB0bworICAgICAgICBwY19jaGFuZ2VkX2hvb2sgaWYgdGhlIFBDIGlzIGJlaW5nIGNoYW5nZWQuCisKKyAgICAgICAgKiBkZWZzLmgKKyAgICAgICAgLSBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KKyAgICAgICAgKHBjX2NoYW5nZWRfaG9vayk6IERlZmluZS4KKworICAgICAgICAqIGNvbW1hbmQuYworICAgICAgICAtICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KKyAgICAgICAgKGRvX3NldHNob3dfY29tbWFuZCk6IElmIG5vIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQsCisgICAgICAgIGRvbid0IGR1bXAgY29yZSwgaW5zdGVhZCBwcmludCBvdXQgYW4gZXJyb3IgbWVzc2FnZS4KKworICAgICAgICAqIGJyZWFrcG9pbnQuYworICAgICAgICAtIE1hcnRpbiBNLiBIdW50ICA8aHVudEBjeWdudXMuY29tPgorICAgICAgICBNYWtlIHNldF9yYXdfYnJlYWtwb2ludCwgc2V0X2JyZWFrcG9pbnRfY291bnQsCisgICAgICAgIGFuZCBicmVha3BvaW50X2NvdW50IG5vbi1zdGF0aWMgc28gdGhleSBhcmUgYWNjZXNzaWJsZSBmcm9tCisgICAgICAgIGVsc2V3aGVyZS4KKyAgICAgICAgKGVuYWJsZV9icmVha3BvaW50KTogRW5hYmxlIGJyZWFrcG9pbnQKKyAgICAgICAgd2l0aCBzYW1lIGRpc3Bvc2l0aW9uIGluc3RlYWQgb2YgY2hhbmdpbmcgYWxsIGJyZWFrcG9pbnRzCisgICAgICAgIHRvIGRvbnR0b3VjaC4KKworICAgICAgICAqIGFubm90YXRlLmgKKwktIEtlaXRoIFNlaXR6ICA8a2VpdGhzQG9uaW9ucy5jeWdudXMuY29tPgorICAgICAgICBBZGQgZGVjbGFyYXRpb25zIGZvciBhbm5vdGF0aW9uIGhvb2tzLgorIAorICAgICAgICAqIGFubm90YXRlLmMKKwktIEtlaXRoIFNlaXR6ICA8a2VpdGhzQG9uaW9ucy5jeWdudXMuY29tPgorICAgICAgICBBZGQgaG9va3M6IGFubm90YXRlX3N0YXJ0aW5nX2hvb2ssIGFubm90YXRlX3N0b3BwZWRfaG9vaywKKyAgICAgICAgYW5ub3RhdGVfc2lnbmFsbGVkX2hvb2ssIGFubm90YXRlX2V4aXRlZF9ob29rLgorICAgICAgICAoYW5ub3RhdGVfc3RhcnRpbmcpOiBJZiBob29rIGV4aXN0cywgY2FsbCBpdCBpbnN0ZWFkLgorICAgICAgICAoYW5ub3RhdGVfc3RvcHBlZCk6IElmIGhvb2sgZXhpc3RzLCBjYWxsIGl0IGluc3RlYWQuCisgICAgICAgIChhbm5vdGF0ZV9leGl0ZWQpOiBJZiBob29rIGV4aXN0cywgY2FsbCBpdCBpbnN0ZWFkLgorICAgICAgICAoYW5ub3RhdGVfc2lnbmFsbGVkKTogSWYgaG9vayBleGlzdHMsIGNhbGwgaXQgaW5zdGVhZC4KKworRnJpIE1hciAyMCAxNDo0NTozNiAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBnZGJzZXJ2ZXIvTWFrZWZpbGUuaW46IGFkZCBkZXBlbmRlbmN5IG9uIFhNX0NMSUJTLgorCSogZ2Ric2VydmVyL2xvdy1zaW0uYyAocmVnaXN0ZXJzKSBmb3JjZSBpbnRvIGFsaWdubWVudC4KKwkoY3JlYXRlX2luZmVyaW9yKTogRml4IHR5cG8gb24gbmV3X2FyZ3Y7IGFkZCBhYmZkIGFyZyB0byAKKwlzaW1fb3Blbiwgc2ltX2NyZWF0ZV9pbmZlcmlvci4gIEFkZCByZWdfc2l6ZSBhcmcgdG8gCisJc2ltX2ZldGNoX3JlZ2lzdGVyLCBzaW1fc3RvcmVfcmVnaXN0ZXIuICBNYWtlIHNpbXVsYXRvcgorCXRha2UgYSBzaW5nbGUtc3RlcCB0byBnZXQgaW50byBhIGtub3duIHJ1bm5pbmcgc3RhdGUuCisJKiBnZGJzZXJ2ZXIvZ2RicmVwbGF5LmM6IGluY2x1ZGUgZmNudGwuaCBmb3IgZGVmJ24gb2YgRl9TRVRGTC4KKwkqIGdkYnNlcnZlci9zZXJ2ZXIuYzogQWRkIHJlbW90ZV9kZWJ1ZyB2YXJpYWJsZSB0byBjb250cm9sIAorCWRlYnVnIG91dHB1dC4KKwkqIGdkYnNlcnZlci9zZXJ2ZXIuaDogQWRkIHByb3RvdHlwZXMgZm9yIGVuYWJsZS9kaXNhYmxlX2FzeW5jX2lvLgorCSogZ2Ric2VydmVyL3JlbW90ZS11dGlscy5jOiBhZGQgdmVyYm9zZSBkZWJ1Z2dpbmcgb3V0cHV0IGNvbnRyb2xsZWQgCisJYnkgInJlbW90ZV9kZWJ1ZyIgdmFyaWFibGUuICBBZGQgY2FsbCB0byAiZGlzYWJsZV9hc3luY19pbygpIgorCXRvIGF2b2lkIGJlaW5nIGtpbGxlZCBieSBhc3luYyBTSUdJTyBzaWduYWxzLgorCSogY29uZmlnL20zMnIvbTMyci5tdDogZGVmaW5lIEdEQlNFUlZFUl8oTElCUyBhbmQgREVQRklMRVMpLAorCXNvIHRoYXQgZ2Ric2VydmVyIGNhbiBiZSBidWlsdCB3aXRoIHRoZSBtMzJyIHNpbXVsYXRvci4KKworRnJpIE1hciAyMCAwOTowNDowNiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdkYnR5cGVzLmggKGJ1aWx0aW5fdHlwZV97LHV9aW50ezgsMTYsMzIsNjR9KTogTmV3IGdkYiBidWlsdGluCisgCXR5cGVzLgorCisJKiBnZGJ0eXBlcy5jIChfaW5pdGlhbGl6ZV9nZGJ0eXBlcyk6IEluaXRpYWxpemUgbmV3IHR5cGVzLgorCisJKiBtaXBzLXRkZXAuYyAoZG9fZ3BfcmVnaXN0ZXJfcm93KTogUGFkIHJlZ2lzdGVyIHZhbHVlIHdoZW4gR1AKKyAJcmVnaXN0ZXIgaXMgc21hbGxlciB0aGFuIE1JUFNfUkVHU0laRS4KKworCSogZmluZHZhci5jICh2YWx1ZV9vZl9yZWdpc3Rlcik6IFdoZW4gcmF3IGFuZCB2aXJ0dWFsIHJlZ2lzdGVyCisgCXZhbHVlcyBpZGVudGljYWwsIGNoZWNrIHRoYXQgc2l6ZXMgYXJlIGNvbnNpc3RlbnQuCisKK1RodSBNYXIgMTkgMTE6MzI6MTUgMTk5OCAgTWljaGFlbCBTbnlkZXIgIChtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbSkKKworCSogbWluc3ltcy5jIChjb21wYXJlX21pbmltYWxfc3ltYm9scyk6IElmIGFkZHJlc3NlcyBhcmUgaWRlbnRpY2FsLAorCXRoZW4gY29tcGFyZSBvbiBuYW1lcy4gIFNvcnRlZCBsaXN0IHNob3VsZCBoYXZlIHN5bWJvbHMgd2l0aCAKKwlpZGVudGljYWwgYWRkcmVzc2VzIEFORCBuYW1lcyBhZGphY2VudCwgc28gZHVwcyBjYW4gYmUgZGlzY2FyZGVkLgorCitXZWQgTWFyIDE4IDEyOjUwOjE3IDE5OTggIEplZmYgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHN0YWJzcmVhZC5jIChkZWZpbmVfc3ltYm9sKTogRG9uJ3QgbG9vayBmb3IgJywnIGFzIGEgTFJTCisJaW5kaWNhdG9yLgorCitXZWQgTWFyIDE4IDEwOjM0OjUxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHJkaS1zaGFyZS9ldGhlcmRydi5jOiBTZXQgc3lzX2Vycmxpc3RbXSBhcyBjaGFyICogbm90IGNvbnN0IGNoYXIgKi4KKworRnJpIE1hciAxMyAxNTo0Mzo1MyAxOTk4ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKyAgICAgICAgKiBjb25maWcvbWlwcy94bS1taXBzLmggKENDX0hBU19MT05HX0xPTkcpOiAgVW5kZWZpbmUgZm9yIFVsdHJpeAorICAgICAgICB3aGVuIGNvbXBpbGluZyB3aXRoIG5hdGl2ZSBjYywgdGhlIGNvbXBpbGVyIGhhcyBicm9rZW4gbG9uZyBsb25nCisgICAgICAgIHN1cHBvcnQuCisKK0ZyaSBNYXIgMTMgMTU6Mzc6MDIgMTk5OCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisgICAgICAgICogY29uZmlnL202OGsveG0tc3VuM29zNC5oOiAgUmVtb3ZlIG1hbGxvYyBkZWNsYXJhdGlvbnMsIHRoZXkKKyAgICAgICAgYXJlIGhhbmRsZWQgdmlhIGF1dG9jb25mIG5vdy4KKyAgICAgICAgKiByZW1vdGUuYyAocmVtb3RlX29wcywgZXh0ZW5kZWRfcmVtb3RlX29wcyk6ICBSZXBsYWNlIHN0YXRpYworICAgICAgICBmb3J3YXJkIGRlY2xhcmF0aW9uIGJ5IG1vdmluZyB0aGUgc3RhdGljIGRlZmluaXRpb24gdG8gdGhlIHRvcCBvZgorICAgICAgICB0aGUgZmlsZSwgZm9yIG9sZCBLJlIgY29tcGlsZXJzLgorICAgICAgICAqIHRyYWNlcG9pbnQuYyAoY29sbGVjdF9zeW1ib2wsIHRyYWNlX3N0YXJ0X2NvbW1hbmQpOgorICAgICAgICBSZXBsYWNlIEFOU0kgc3RyaW5nIGNvbmNhdGVuYXRpb24gd2l0aCBLJlIgY29tcGF0aWJsZSBzaW1wbGUgc3RyaW5nLgorCisxOTk4LTAzLTExICBGcmVkIEZpc2ggIDxmbmZAbmluZW1vb25zLmNvbT4KKworCSogc291cmNlLmMgKHNlbGVjdF9zb3VyY2Vfc3ltdGFiKTogRG9uJ3QgcmVhY2ggZXJyb3IgaWYgd2UgaGF2ZQorCWEgY3VycmVudF9zb3VyY2Vfc3ltdGFiIGZyb20gcmVhZGluZyBpbiBwYXJ0aWFsIHN5bWJvbCB0YWJsZS4KKworRnJpIE1hciAgNiAxMzoxMDoyNyAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogdXRpbHMuYyAocXVpdCk6IENhbGwgU0VSSUFMX0RSQUlOX09VVFBVVCByYXRoZXIgdGhhbgorIAlTRVJJQUxfRkxVU0hfT1VUUFVULgorCSogc2VyaWFsLmggKHN0cnVjdCBzZXJpYWxfb3BzKTogQWRkIGRyYWluX291dHB1dCwgcG9pbnRlciB0bworIAlmdW5jdGlvbiB0aGF0IHdhaXRzIGZvciBvdXRwdXQgdG8gZHJhaW4uCisJKFNFUklBTF9EUkFJTl9PVVRQVVQpOiBNYWNybyB0byB3YWl0IGZvciBvdXRwdXQgdG8gZHJhaW4uCisJKiBzZXItdW5peC5jIChoYXJkd2lyZV9kcmFpbl9vdXRwdXQpOiBOZXcgZnVuY3Rpb24gYW5kIHByb3RvdHlwZS4KKworCSogc2VyLXVuaXguYyAoaGFyZHdpcmVfb3BzKTogQWRkIGVudHJ5IGZvciBkcmFpbl9vdXRwdXQgZnVuY3Rpb24uCisJKiBzZXItdGNwLmMgKHRjcF9vcHMpOiBEaXR0by4KKwkqIHNlci1vY2QuYyAob2NkX29wcyk6IERpdHRvLgorCSogc2VyLW1hYy5jIChtYWNfb3BzKTogRGl0dG8uCisJKiBzZXItZ28zMi5jIChkb3Nfb3BzKTogRGl0dG8uCisJKiBzZXItZTdrcGMuYyAoZTcwMDBwY19vcHMpOiBEaXR0by4KKworVGh1IE1hciAgNSAxNjowNzo0MSAxOTk4ICBNaWNoYWVsIFNueWRlciAgKG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tKQorCisJKiBzcGFyY2wtdGRlcC5jOiBmaXggI2VuZGlmIGNvbW1lbnRzCisKK1RodSBNYXIgIDUgMTU6MTA6MzUgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChCSVNPTik6IENvbmZpZ3VyZSBzdWJzdGl0dXRlcyBpbiBAWUFDQ0AsIG5vdCBAQklTT05ALgorCitUaHUgTWFyICA1IDE0OjQyOjQxIDE5OTggIEtlaXRoIFNlaXR6ICA8a2VpdGhzQG9uaW9ucy5jeWdudXMuY29tPgorCisJKiBvY2QuYyAob2NkX29wZW4pOiBJZiB3ZSBmYWlsIG9jZF9zdGFydF9yZW1vdGUsIG1ha2Ugc3VyZSB3ZQorCWVycm9yICgpIHNvIHRoYXQgd2UgYWJvcnQgb3V0IG9mIGJkbV9wcGNfb3Blbi4KKworV2VkIE1hciAgNCAxNjo1Mzo1MiAxOTk4ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KKworCSogc2VyaWFsLmMgKF9pbml0aWFsaXplX3NlcmlhbCk6IEFkZCBhIGRlc2NyaXB0aW9uIG9mIAorCSJzZXQgcmVtb3RlbG9nYmFzZSIuCisKKwkqIGNvbW1hbmQuYyAoZG9fc2V0c2hvd19jb21tYW5kKTogSWYgbm8gYXJndW1lbnRzIGFyZSBzdXBwbGllZCwKKwlkb24ndCBkdW1wIGNvcmUsIGluc3RlYWQgcHJpbnQgb3V0IGFuIGVycm9yIG1lc3NhZ2UuCisKK1dlZCBNYXIgIDQgMDE6Mzk6MDggMTk5OCAgUm9uIFVucmF1ICA8cnVucmF1QGN5Z251cy5jb20+CisKKwkqIGVsZnJlYWQuYyAoZWxmX3N5bXRhYl9yZWFkKTogbWVyZ2UgU1lNQk9MX0lTX1NQRUNJQUwgaW50bworCU1BS0VfTVNZTUJPTF9TUEVDSUFMCisJKiBjb25maWcvbWlwcy90bS1taXBzLmg6IGRpdHRvCisKK1R1ZSBNYXIgIDMgMTc6MTk6MDggMTk5OCAgSm9obiBNZXR6bGVyICA8am1ldHpsZXJAY3lnbnVzLmNvbT4KKworCSogZHdhcmZyZWFkLmMgKHJlYWRfdGFnX3BvaW50ZXJfdHlwZSk6IFBvaW50ZXIgc2l6ZXMgbm93IGNvbWUgZnJvbQorCVRBUkdFVF9QVFJfQklUIHJhdGhlciBmcm9tIHNpemVvZihjaGFyICopIG9uIGhvc3QuCisKK1R1ZSBNYXIgIDMgMTQ6Mzc6MDIgMTk5OCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisgICAgICAgICogYWxwaGEtbmF0LmMgKGZldGNoX29zZl9jb3JlX3JlZ2lzdGVycyk6ICBSZW5hbWVkIGZyb20KKyAgICAgICAgZmV0Y2hfYW91dF9jb3JlX3JlZ2lzdGVycy4KKyAgICAgICAgKGFscGhhX29zZl9jb3JlX2Zucyk6ICBSZW5hbWVkIGZyb20gYWxwaGFfYW91dF9jb3JlX2ZucywgY2hhbmdlCisgICAgICAgIGZsYXZvdXIgdG8gYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIgZm9yIE9TRiBjb3JlIGZpbGVzLgorCitNb24gTWFyICAyIDE3OjQ0OjEzIDE5OTggIE1pY2hhZWwgU255ZGVyICAobXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20pCisKKwkqIGJyZWFrcG9pbnQuYyAoX2luaXRpYWxpemVfYnJlYWtwb2ludCk6IE1ha2UgImVuIiBhbiBhbGlhcworCWZvciAiZW5hYmxlIiAoc28gdGhhdCBpdCBkb2Vzbid0IGNvbmZsaWN0IHdpdGggImVuZCIpLgorCitNb24gTWFyICAyIDE3OjA0OjI1IDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZSAoVkVSU0lPTik6IEJ1bXAgdG8gNC4xNy4xLgorCitNb24gTWFyICAyIDE2OjU5OjE1IDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiByZGktc2hhcmUvZXRoZXJkcnYuYyAoc3lzX2Vycmxpc3QpOiBBZGQgY29ycmVjdCBkZWNsIGZvciBMaW51eC4KKworTW9uIE1hciAgMiAxNjo1MTo0NCAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFlZRklMRVMpOiBSZW1vdmUgaW4gbWFpbnRhaW5lci1jbGVhbiwgbm90IGRpc3RjbGVhbi4KKworTW9uIE1hciAgMiAxNjo0NzoxMSAxOTk4ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQG1hY3FlbC5iZT4KKworICAgICAgICAqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBBZGQgYHJtICQoWVlGSUxFUyknLgorCitNb24gTWFyICAyIDE2OjQ1OjQ4IDE5OTggIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AbWFjcWVsLmJlPgorCisJKiBjb2ZmcmVhZC5jIChjb2ZmX3JlYWRfZW51bV90eXBlKTogU2V0IFRZUEVfRkxBR19VTlNJR05FRCBpZiBlbnVtCisJaXMgdW5zaWduZWQuCisKK1N1biBNYXIgIDIgMTU6MTY6MTMgMTk5OCBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPiAgICAgICAgIAorCisgICAgICAgICogY29uZmlndXJlLmhvc3QsIGNvbmZpZ3VyZS50Z3Q6IEFkZCBzcGFyYy1saW51eC4gICAgICAgICAgICAgICAKKyAgICAgICAgKiBzcGFyYy1uYXQuYzogSW5jbHVkZSA8YXNtL3JlZy5oPiBub3QgPG1hY2hpbmUvcmVnLmg+IGZvciBMaW51eC4KKyAgICAgICAgKiBjb25maWcvc3BhcmMvKmxpbnV4KjogTmV3IGZpbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAKKworTW9uIE1hciAgMiAxMjoxMjo0MSAxOTk4ICBBbnRob255IFRob21wc29uICAgKGF0aG9tcHNvQGNhbWJyaWRnZS5hcm0uY29tKQorCisJKiBhcm0tdGRlcC5jIChnZGJfcHJpbnRfaW5zbl9hcm0pOiBDYWxsIHByaW50X2luc25fYmlnX2FybQorCWlmIHdlJ3JlIGJpZyBlbmRpYW47IGVsc2UgY2FsbCBwcmludF9pbnNuX2xpdHRsZV9hcm0uCisKK01vbiBGZWIgMjQgMTE6MjQ6NTcgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworICAgICAgICAqIE1ha2VmaWxlLmluIChCSVNPTik6IERvbid0IGV2ZW4gcHJldGVuZCB0byB1c2UgeWFjYy4KKyAgICAgICAgKGMtZXhwLnRhYi5vKTogVXNlIGJpc29uIC1vIHRvIHVzZSBhIHVuaXF1ZSBpbnRlcm1lZGlhdGUgZmlsZS4KKyAgICAgICAgKGYtZXhwLnRhYi5vLCBtMi1leHAudGFiLm8pOiBMaWtld2lzZS4KKyAgICAgICAgKGp2LWV4cC50YWIubyk6IExpa2V3aXNlLgorCitUdWUgRmViIDI0IDAzOjMyOjU5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLXNpbS5jIChnZGJzaW1fZmV0Y2hfcmVnaXN0ZXIpOiBEb24ndCBhYm9ydCB3aGVuIHRoZQorIAlyZWdpc3RlciBzaXplIGlzIHdyb25nLgorCitUaHUgRmViIDE5IDE2OjQ5OjQ4IDE5OTggSm9obiBNZXR6bGVyICA8am1ldHpsZXJAY3lnbnVzLmNvbT4KKworCSogdGFyZ2V0LmMgKGRlYnVnX3RvX2ZldGNoX3JlZ2lzdGVycyxkZWJ1Z190b19zdG9yZV9yZWdpc3RlcnMsCisJZGVidWctdG9faW5zZXJ0X2JyZWFrcG9pbnQsZGVidWdfdG9fcmVtb3ZlX2JyZWFrcG9pbnQpOiB0cmFjaW5nCisJNjQgYml0IHRhcmdldHMgY3Jhc2hlZCBsb25nIGxvbmcgcHJpbnRmcy4KKworVHVlIEZlYiAxNyAxNjozNjoyMiAxOTk4ICBNaWNoYWVsIFNueWRlciAgKG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tKQorCisJKiBzeW1maWxlLmMgKHJlYWRfdGFyZ2V0X2ludF9hcnJheSk6IHJlbmFtZSByZWFkX3RhcmdldF9sb25nX2FycmF5CisgICAgICAgIGFuZCBmb3JjZSB0aGUgc2l6ZW9mIGFuIG92bHlfdGFibGUgZWxlbWVudCB0byBzaXplb2YobG9uZyksCisgICAgICAgIGluc3RlYWQgb2Ygc2l6ZW9mKGludCkuCisKK1R1ZSBGZWIgMTcgMTg6MDU6MDUgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLW1pcHMuYyAobWlwc19yZXF1ZXN0KTogVXNlIHVuc2lnbmVkIGxvbmcgZHVyaW5nIHBhcnNpbmcKKyAJcmV0dXJuZWQgdmFsdWUgZnJvbSBtb25pdG9yLCB0byBwcmV2ZW50IGFjY2lkZW50YWwgc2lnbiBleHRlbnNpb24uCisKK1R1ZSBGZWIgMTcgMTQ6Mjg6MzMgMTk5OCAgUGV0ZXIgU2NoYXVlciA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+CisKKyAgICAgICAgKiBhY2NvbmZpZy5oOiBGT1JDRV9NTUNIRUNLIGNoYW5nZWQgdG8gTU1DSEVDS19GT1JDRS4KKyAgICAgICAgKiBjb25maWd1cmUuaW46IERpdHRvLgorICAgICAgICAqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK1R1ZSBGZWIgMTcgMTQ6MDc6MzQgMTk5OCAgUGV0ZXIgU2NoYXVlciA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+CisKKyAgICAgICAgKiBnZGJ0eXBlcy5jIChjaGVja190eXBlZGVmKTogRG8gbm90IHRyeSB0byByZXNvbHZlIHRoZSBsZW5ndGggb2YgICAgICAKKyAgICAgICAgYSB0eXBlIHdoaWNoIGhhcyBUWVBFX0ZMQUdfVEFSR0VUX1NUVUIgc2V0LCBpZiB0aGUgdGFyZ2V0IHR5cGUgaGFzCisgICAgICAgIHNldCBUWVBFX0ZMQUdfVEFSR0VUX1NUVUIgYXMgd2VsbC4KKworVHVlIEZlYiAxNyAxNDozMjoxOCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1zaW0uYyAoZ2Ric2ltX2ZldGNoX3JlZ2lzdGVyLCBnZGJzaW1fc3RvcmVfcmVnaXN0ZXIpOgorIAlQYXNzIHJlZ2lzdGVyIHNpemUgdG8gc2ltX3tmZXRjaCxzdG9yZX1fcmVnaXN0ZXIuICBDaGVjayBuciBvZgorIAlyZWdpc3RlciBieXRlcyB0cmFuc2ZlcmVkIGlzIGNvcnJlY3QuCisKK01vbiBGZWIgMTYgMTQ6MDU6NTQgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiByZW1vdGUtZDEwdi5jIChyZW1vdGVfZDEwdl9vcGVuKTogQ2FsbCBwdXNoX3JlbW90ZV90YXJnZXQKKyAJaW5zdGVhZCBvZiBvcGVuX3JlbW90ZV90YXJnZXQuCisKKwkqIHJlbW90ZS5jIChyZW1vdGVfeGZlcl9tZW1vcnkpOiBVc2UgUkVNT1RFX1RSQU5TTEFURV9YRkVSX0FERFJFU1MKKyAJdG8gdHJhbnNsYXRlIGFkZHIvc2l6ZSB3aGVuIGRlZmluZWQuCisJKG9wZW5fcmVtb3RlX3RhcmdldCk6IERlbGV0ZS4KKworCSogdGFyZ2V0LmggKG9wZW5fcmVtb3RlX3RhcmdldCk6IERlbGV0ZS4KKworCSogY29uZmlnL2QxMHYvdG0tZDEwdi5oIChSRU1PVEVfVFJBTlNMQVRFX1hGRVJfQUREUkVTUyk6IERlZmluZS4KKworTW9uIEZlYiAxNiAxNDowNTo1NCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGQxMHYtdGRlcC5jIChkMTB2X2V4dHJhY3RfcmV0dXJuX3ZhbHVlKTogV2llcmQuICBHQ0Mgd2FudHMgdG8KKyAJcmV0dXJuIG9kZCBzaXplZCByZWdpc3RlciBxdWFudGl0aWVzIHdpdGggb25seSBoYWxmIG9mIHRoZSBmaXJzdAorIAlyZWdpc3RlciB1c2VkIQorCisJKiBjb25maWcvZDEwdi90bS1kMTB2LmggKFVTRV9TVFJVQ1RfQ09OVkVOVElPTik6IFVzZSBzdGFjayB3aGVuCisgCXNpemUgPiA4LgorCitNb24gRmViIDE2IDE0OjA1OjU0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2QxMHYvdG0tZDEwdi5oIChVU0VfU1RSVUNUX0NPTlZFTlRJT04pOiBEZWZpbmUuIFRydWUgd2hlbgorIAlzaXplb2YgdHlwZSA+IDEuCisKK1N1biBGZWIgMTUgMTY6MTA6NTAgMTk5OCAgUm9uIFVucmF1ICAgPHJ1bnJhdUBjeWdudXMuY29tPgorCisJKiBwYXJzZS5jICh3cml0ZV9kb2xsYXJfdmFyaWFibGUpOiBjYWxsIG5ldyBmdW5jdGlvbiAKKwkgIHRhcmdldF9tYXBfbmFtZV90b19yZWdpc3RlciB0byBhbGxvdyB0YXJnZXRzIHRvIGRlZmluZSB0aGVpciBvd24gCisJICByZWdpc3RlciBuYW1lIGFsaWFzZXMuCisJKiBpbmZjbWQuYyAocmVnaXN0ZXJzX2luZm8pOiB1c2UgdGFyZ2V0X21hcF9uYW1lX3RvX3JlZ2lzdGVyIHNvIHRoYXQKKwkgICJwcmludCAkcmVnIiBhbmQgImluZm8gcmVnICRyZWciIHVzZSB0aGUgc2FtZSByZWdpc3RlciBuYW1lIGFsaWFzZXMuCisKK0ZyaSBGZWIgMTMgMTY6NDA6MzAgMTk5OCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWcvaTM4Ni9pMzg2bWsubXQgKE9CSkZPUk1BVFMpOiBEZWxldGUsIG5vIGxvbmdlciB1c2VkLgorCSogY29uZmlnL2kzODYveG0taTM4Nm1rLmg6IEZpeCBhbiBpbmNsdWRlLgorCSogY29uZmlnL3B5ci90bS1weXIuaCAoUENfSU5ORVJfVEhBTik6IFJlbW92ZSwgbmV2ZXIgdXNlZC4KKworVGh1IEZlYiAxMiAxNjoxMjowNyAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiByZW1vdGUtbWlwcy5jIChtaXBzX2VudGVyX2RlYnVnKTogU2xlZXAgYmVmb3JlIHNlbmRpbmcgQ1IgdG8KKyAJbW9uaXRvci4KKwkobWlwc19leGl0X2RlYnVnKTogQWNjZXB0IGFueSB3aGl0ZXNwYWNlIC8gdmVyYmlhZ2UgYmVmb3JlIG1vbml0b3IKKyAJcHJvbXB0IHJlYXBwZWFycy4KKworVGh1IEZlYiAxMiAxODoyNTo0MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGQxMHYtdGRlcC5jIChzaG93X3JlZ3MpOiBBdm9pZCB1c2Ugb2YgJWxseCB3aGVuIHByaW50aW5nIDggYnl0ZQorIAlhY2N1bXVsYXRvcnMuCisKK1RodSBGZWIgMTIgMTc6MTA6MjIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiB2YWxvcHMuYyAodmFsdWVfYXQpOiBGb3IgZDEwdiwgbWFrZSByZWFkIHBvaW50ZXJzIHdpdGgKKyAJcmVhZF90YXJnZXRfdW5zaWduZWRfaW50ZWdlciwga2VlcCBhZGRyZXNzZXMgdW5zaWduZWQuCisJKHZhbHVlX2ZldGNoX2xhenkpOiBEaXR0by4KKworVGh1IEZlYiAxMiAxMjoxNDowMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS1kMTB2LmM6IE5ldyBmaWxlLiAgTGF5ZXIgdGhlIGQxMHYgR0RCLT5yZW1vdGUgbWVtb3J5IG1hcAorIAlvbiB0b3Agb2YgdGhlIHJlbW90ZSBzZXJpYWwgbWVtb3J5IHRyYW5zZmVyIGZ1bmN0aW9ucy4KKworCSogY29uZmlnL2QxMHYvZDEwdi5tdCAoVERFUEZJTEVTKTogQWRkIHJlbW90ZS1kMTB2Lm8KKworCSogTWFrZWZpbGUuaW4gKHJlbW90ZS1kMTB2Lm8pOiBBZGQgZGVwZW5kZW5jaWVzLgorCisJKiByZW1vdGUuYyAocmVtb3RlX29wZW5fMSk6IEFkZCBhcmcgZXh0ZW5kZWRfcCwgZW5nYWdlIGV4dGVuZGVkCisgCXByb3RvY29sIHdoZW4gZXh0ZW5kZWRfcC4KKwkocmVtb3RlX29wZW4sIGV4dGVuZGVkX3JlbW90ZV9vcGVuKTogUGFzcyAhZXh0ZW5kZWRfcCAvCisgCWV4dGVuZGVkX3AgdG8gcmVtb3RlX29wZW5fMS4KKworCSogcmVtb3RlLmMgKG9wZW5fcmVtb3RlX3RhcmdldCksIHRhcmdldC5oOiBOZXcgZnVuY3Rpb24uCisKK1dlZCBGZWIgMTEgMDg6NDE6MTUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWcvaTM4Ni9mYnNkLm1oIChYREVQRklMRVMpOiBBZGQgc2VyLXRjcC5vLgorCitUdWUgRmViIDEwIDE3OjUwOjM3IDE5OTggIEtlaXRoIFNlaXR6ICA8a2VpdGhzQG9uaW9ucy5jeWdudXMuY29tPgorCisJKiB0cmFjZXBvaW50LmMgKHRyYWNlcG9pbnRfb3BlcmF0aW9uKTogQ2FsbCB0aGUgbW9kaWZ5X3RyYWNlcG9pbnRfaG9vaworCWlmIGl0IGV4aXN0cy4KKwlSZW1vdmUgc3RhdGljIGRlY2xhcmF0aW9uIG9mIGZyZWVfYWN0aW9ucy4KKworCSogdHJhY2Vwb2ludC5oOiBBZGQgZGVjbGFyYXRpb24gb2YgZnJlZV9hY3Rpb25zLgorCQkKK1R1ZSBGZWIgMTAgMTI6MTc6MTMgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHN5bXRhYi5jIChkZWNvZGVfbGluZV8xKTogUmV2ZXJ0IGNoYW5nZSB0aGF0IG1pc3Rha2VubHkKKwlyZW1vdmVkIGFzc2lnbm1lbnQgb2Ygc2Fsc1swXS5wYyBmaWVsZC4KKworTW9uIEZlYiAxMCAxMjozNzo0NyAxOTk4ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQG1hY3FlbC5iZT4KKworICAgICAgICAqIG02OGsvdG0tZGVsdGE2OC5oIChFWFRSQUNUX1JFVFVSTl9WQUxVRSk6IFR5cGUgYXJndW1lbnQgZm9yCisgICAgICAgIGBSRUdJU1RFUl9DT05WRVJUX1RPX1ZJUlRVQUwgaXMgYFRZUEUnLCBub3QKKyAgICAgICAgYFJFR0lTVEVSX1ZJUlRVQUxfVFlQRSAoRlAwX1JFR05VTSknOworICAgICAgICAoU1RPUkVfUkVUVVJOX1ZBTFVFKTogRGl0dG8sIGFuZCBvZmZzZXQgZm9yIGB3cml0ZV9yZWdpc3Rlcl9ieXRlcycKKyAgICAgICAgaXMgYFJFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pJywgbm90IGBGUDBfUkVHTlVNJy4KKyAgICAgICAgKEZSQU1FX05VTV9BUkdTKTogTmV3IG1hY3JvLgorICAgICAgICAqIG02OGsvdG0tbmV3cy5oIChFWFRSQUNUX1JFVFVSTl9WQUxVRSwgU1RPUkVfUkVUVVJOX1ZBTFVFKTogRGl0dG8uCisgICAgICAgICogZGVsdGE2OC1uYXQuYyAoY2xlYXJfaW5zbl9jYWNoZSk6IE5ldyBmdW5jdGlvbiwgZm9yZ290dGVuIGluIHByZXZpb3VzCisgICAgICAgIHBhdGNoLgorCitNb24gRmViICA5IDExOjEwOjA2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZDEwdi10ZGVwLmM6IFJlcGxhY2UgcmVmZXJlbmNlcyB0byBJTUVNX0FERFIgYW5kIERNRU1fQUREUiB3aXRoCisgCUQxMFZfTUFLRV9bREldQUREUiBhbmQgRDEwVl9DT05WRVJUX1tJRF1BRERSX1RPX1JBVyBtYWNyb3MuCisKKwkqIGNvbmZpZy9kMTB2L3RtLWQxMHYuaCAoSU1FTV9TVEFSVCk6IE1vdmUgdG8gMHgwMS4uLi4uLgorCShETUVNX1NUQVJUKTogTW92ZSB0byAweDAwLi4uLi4uCisJKFNUQUNLX1NUQVJUKTogTW92ZSB0byAweDAwLi43ZmZlLgorCShEMTBWX01BS0VfSUFERFIsIEQxMFZfTUFLRV9EQUREUik6IFRyYW5zbGF0ZSB1bmNvbmRpdGlvbmFsbHkuCisKKwkqIGQxMHYtdGRlcC5jIChkMTB2X3hsYXRlX2FkZHIpOiBEZWxldGUgZnVuY3Rpb24uCisKK01vbiBGZWIgIDkgMTU6MTA6MjEgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHN5bXRhYi5jIChmaXh1cF9wc3ltYm9sX3NlY3Rpb24pOiBNb3ZlIGZvcndhcmQgZGVjbGFyYXRpb24gdG8KKwl0b3Agb2YgZmlsZSB3aXRoIG90aGVyIHN1Y2ggZGVjbHMuICBNYWtlIGl0IGEgc3RhdGljIGZ1bmN0aW9uLgorCSogc3ltdGFiLmg6IE1pbm9yIGZvcm1hdHRpbmcgdHdlYWtzLgorCitNb24gRmViICA5IDEzOjE0OjEyIDE5OTggIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2EyOWstdWRpLm10LCBjb25maWcvaTk2MC92eHdvcmtzOTYwLm10IChSRU1PVEVfT0JTKToKKyAJUmVtb3ZlIHJlZGVmaW5pdGlvbi4KKwkqIGNvbmZpZy9pOTYwL3RtLWk5NjAuaCAoQlJFQUtQT0lOVCk6IERlZmluZS4KKworTW9uIEZlYiAgOSAxNTozNTozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChpbml0LmMpOiBJZ25vcmUgZXJyb3JzIHdoZW4gbWFraW5nIGluaXQuYy4gIFNlZW1zCisJbmVjZXNzYXJ5IHRvIHdvcmsgYXJvdW5kIGJ1ZyBpbiBTb2xhcmlzIG1ha2UuCisKK1N1biBGZWIgIDYgMDI6NDQ6MjggMTk5OCAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+CisKKyAgICAgICAgKiBtNjhrL3RtLWRlbHRhNjguaCAoQ1BMVVNfTUFSS0VSKTogTWFjcm8gZGVsZXRlZC4KKyAgICAgICAgKEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MpOiBNYWNybyBkZWZpbmVkLgorICAgICAgICAoRVhUUkFDVF9SRVRVUk5fVkFMVUUsIFNUT1JFX1JFVFVSTl9WQUxVRSk6IE1hY3JvcyBtb2RpZmllZAorICAgICAgICBiZWNhdXNlIGZsb2F0aW5nLXBvaW50IHZhbHVlcyByZXR1cm4gdmlhICVmcDAuCisgICAgICAgIChDTEVBUl9JTlNOX0NBQ0hFKTogTmV3IG1hY3JvLgorICAgICAgICAqIG02OGsvdG0tbTY4ay5oIChSRUdJU1RFUl9DT05WRVJUX1RPX1ZJUlRVQUwpOiBNYWNybyBmaXhlZAorICAgICAgICB0byB1c2UgRE9VQkxFU1QuCisgICAgICAgIChSRUdJU1RFUl9DT05WRVJUX1RPX1JBVyk6IERpdHRvLgorICAgICAgICAqIGluZnB0cmFjZS5jIChjaGlsZF94ZmVyX21lbW9yeSk6IElmIENMRUFSX0lOU05fQ0FDSEUgaXMgZGVmaW5lZCwKKyAgICAgICAgY2FsbCBpdCBhZnRlciBoYXZpbmcgd3JpdHRlbiBpbiBjaGlsZCBwcm9jZXNzJ3MgbWVtb3J5LgorICAgICAgICAqIGluZmxvdy5jIChQUk9DRVNTX0dST1VQX1RZUEUpOiBNYWNybyBkZWZpbmVkIGlmIEhBVkVfVEVSTUlPLgorICAgICAgICAoZ2RiX2hhc19hX3Rlcm1pbmFsLCB0ZXJtaW5hbF9vdXJzXzEpOiBGdW5jdGlvbnMgZml4ZWQgZm9yIEhBVkVfVEVSTUlPLgorCitGcmkgRmViICA2IDE2OjE3OjMwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworICAgICAgICAqIGNvbmZpZy9taXBzL3RtLW1pcHM2NC5oIChUQVJHRVRfTE9OR19CSVQpOiBBbGxvdyBmaW5hbCB0YXJnZXQgdG8KKyAgICAgICAgb3ZlcnJpZGUuCisgICAgICAgIChUQVJHRVRfTE9OR19MT05HX0JJVCk6IExpa2V3aXNlLgorICAgICAgICAoVEFSR0VUX1BUUl9CSVQpOiBMaWtld2lzZS4KKworRnJpIEZlYiAgNiAxNzo0MjoyMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9kMTB2L3RtLWQxMHYuaCAoRDEwVl9DT05WRVJUX0lBRERSX1RPX1JBVywKKyAJRDEwVl9DT05WRVJUX0RBRERSX1RPX1JBVyk6IERlZmluZS4KKworCSogZDEwdi10ZGVwLmMgKGQxMHZfcHVzaF9hcmd1bWVudHMpOiBSZS13cml0ZS4gIFBhc3MgYXJndW1lbnRzIGluCisgCXJlZ2lzdGVycywgcmVnYXJkbGVzcyBvZiB0aGVpciBzaXplLCB3aGVuIHRoZXkgZml0LgorCitUaHUgRmViICA1IDEzOjE2OjM2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZDEwdi10ZGVwLmMgKGQxMHZfZXh0cmFjdF9yZXR1cm5fdmFsdWUpOiBGb3IgZnVuY3Rpb24gcG9pbnRlcnMKKwl0cmFuc2xhdGUgYWRkcmVzcyB0byBJTUFQIGFyZWEuCisKKwkqIGNvbmZpZy9kMTB2L3RtLWQxMHYuaCAoRVhUUkFfRlJBTUVfSU5GTyk6IERlbGV0ZSBkdW1teSBmcm9tCisgCXN0cnVjdC4KKwkoUE9QX0ZSQU1FKTogUG9pbnQgYXQgZ2VuZXJpY19wb3BfY3VycmVudF9mcmFtZS4KKworCSogZDEwdi10ZGVwLmMgKGQxMHZfcG9wX2ZyYW1lKTogRGVsZXRlIGNvZGUgaGFuZGxpbmcgZHVtbXkgZnJhbWVzLAorIAloYW5kbGVkIGVhcmxpZXIuCisJKGQxMHZfcHVzaF9yZXR1cm5fYWRkcmVzcyk6IE5ldyBmdW5jdGlvbi4KKwkoZDEwdl9wb3BfZHVtbXlfZnJhbWUpOiBEZWxldGUuCisJKGQxMHZfZml4X2NhbGxfZHVtbXkpOiBEZWxldGUuCisJKGQxMHZfY2FsbF9kdW1teV9hZGRyZXNzKTogRGVsZXRlLgorCisJKiBkMTB2LXRkZXAuYyAoZDEwdl9pbml0X2V4dHJhX2ZyYW1lX2luZm8pOiBDbGVhciBkdW1teSBhbmQKKyAJZnJhbWVsZXNzLgorCisJKiBkMTB2LXRkZXAuYyAoZDEwdl9wdXNoX2FyZ3VtZW50cyk6IEtlZXAgc3RhY2sgd29yZCBhbGlnbmVkLgorCisJKiBjb25maWcvZDEwdi90bS1kMTB2LmggKEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MpOiBFeHRyYWN0CisgCWFkZHJlc3Mgb2Ygc3RydWN0dXJlIGZyb20gZmlyc3QgQVJHMV9SRUdOVU0uCisKKwkqIGQxMHYtdGRlcC5jIChkMTB2X3B1c2hfYXJndW1lbnRzKTogRm9yY2UgNCBieXRlIGFyZ3MgaW50bworIAlldmVuLW9kZCByZWdpc3RlciBwYWlyLiAgU3RvcmUgMSBhbmQgMiBieXRlIGFyZ3MgaW4gcmVnaXN0ZXJzLgorCisJKiB2YWxvcHMuYyAodmFsdWVfZmV0Y2hfbGF6eSk6IEVuc3VyZSB0aGF0IGEgRDEwViBmdW5jdGlvbiBwb2ludGVyCisgCWlzIGZldGNoZWQgaW4gdGhlIGNvcnJlY3QgYnl0ZSBvcmRlci4KKwkodmFsdWVfYXQpOiBEaXR0by4gQWxzbyBlbnN1cmUgZGF0YSBwb2ludGVycyBhcmUgbWFwcGVkIHRvIGRhdGEKKyAJc2VnbWVudC4KKworCSogY29uZmlnL2QxMHYvdG0tZDEwdi5oIChEMTBWX0RBRERSX1AsIEQxMFZfSUFERFJfUCk6IAorCisJKiBkMTB2LXRkZXAuYzogUmVwbGFjZSAyIHdpdGggUkVHSVNURVJfUkFXX1NJWkUuCisJKGQxMHZfcG9wX2ZyYW1lKTogUmVwbGFjZSBSMTMgd2l0aCBMUl9SRUdOVU0uCisJKGQxMHZfcHVzaF9hcmd1bWVudHMpOiBSZXBsYWNlIFIyIHdpdGggQVJHMV9SRUdOVU0uCisJKGQxMHZfcHVzaF9hcmd1bWVudHMpOiBSZXBsYWNlIDYgd2l0aCBBUkdOX1JFR05VTS4KKwkoZDEwdl9leHRyYWN0X3JldHVybl92YWx1ZSk6IEFjY2VzcyByZXR1cm4gdmFsdWUgd2l0aCBSRVQxX1JFR05VTS4KKworCSogY29uZmlnL2QxMHYvdG0tZDEwdi5oIChBUkcxX1JFR05VTSwgQVJHTl9SRUdOVU0sIFJFVDFfUkVHTlVNKToKKyAJRGVmaW5lLgorCShTVE9SRV9SRVRVUk5fVkFMVUUpOiBTcGVjaWZ5IHJldHVybiByZWdpc3RlciB1c2luZyBSRVQxX1JFR05VTS4KKwkoU1RPUkVfU1RSVUNUX1JFVFVSTik6IFNwZWNpZnkgQVJHMV9SRUdOVU0gYXMgdGhlIHN0cnVjdCBwdHIKKyAJbG9jYXRpb24uCisKK1RodSBGZWIgIDUgMTM6MTY6MzYgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBibG9ja2ZyYW1lLmMgKGdlbmVyaWNfcG9wX2R1bW15X2ZyYW1lKTogRmx1c2ggdGhlIGZyYW1lLCBubworIAlsb25nZXIgdmFsaWQuCisKKwkqIGJsb2NrZnJhbWUuYyAoZ2VuZXJpY19wb3BfY3VycmVudF9mcmFtZSksIGZyYW1lcy5oOiBOZXcKKyAJZnVuY3Rpb24uCisKK1RodSBGZWIgIDUgMTc6MTg6MTYgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiByZW1vdGUtc2ltLmMgKGdkYnNpbV9jcmVhdGVfaW5mZXJpb3IpOiBjbGVhcl9wcm9jZWVkX3N0YXR1cworIAliZWZvcmUgL3JlL3N0YXJ0aW5nIHRoZSBzaW11bGF0b3IuCisKK1RodSBGZWIgIDUgMTU6NTU6MzEgMTk5OCAgQy4gTS4gSGVhcmQgKGhlYXJkQHZ2bmV0LmNvbSkKKworICAgICAgICAqIHRvcC5jIChkb19ub3RoaW5nKTogUmVtb3ZlIHNpZ25hbCBoYW5kbGVyIGFmdGVyIHNpZ25hbCBpcyBjYXVnaHQuCisKK1RodSBGZWIgIDUgMTE6NTc6MDYgMTk5OCAgTWljaGFlbCBTbnlkZXIgIChtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbSkKKworCSogdHJhY2Vwb2ludC5jICh0cmFjZXBvaW50X29wZXJhdGlvbik6IGNhbGwgZnJlZV9hY3Rpb25zIGluc3RlYWQKKwlvZiBmcmVlLiAgKGZyZWVfYWN0aW9ucyk6IGVsaW1pbmF0ZSBzb21lIG1lbW9yeSBsZWFrcyBmb3IgYWN0aW9ucy4KKwkodmFsaWRhdGVfYWN0aW9ubGluZSk6IHBhc3Mgc3RyaW5nIGFyZyBieSByZWZlcmVuY2UsIHNvIHdlIGNhbiAKKwljaGFuZ2UgdGhlIHBvaW50ZXIuICBDaGFuZ2UgYWxsIG1lbXJhbmdlIGNvbGxlY3Rpb24gYXJndW1lbnRzIHRvCisJY2Fub25pY2FsIGZvcm0gKGxpdGVyYWwgYWRkcmVzcyBhbmQgc2l6ZSksIHRvIGVuZm9yY2UgZWFybHkKKwlldmFsdWF0aW9uLiAgQWNjZXB0IFVOT1BfTUVNVkFMIChhc3NlbWJseSB2YXJpYWJsZXMpIGZvciAKKwl0cmFjZSBjb2xsZWN0aW9uLiAgKHBhcnNlX2FuZF9ldmFsX21lbXJhbmdlKTogYWNjZXB0IGV4cHJlc3Npb25zCisJZm9yIHRoZSBhZGRyZXNzIGFuZCBzaXplIGZpZWxkcyBvZiBhIG1lbXJhbmdlIChhbmQgZXZhbHVhdGUKKwl0aGVtIGltbWVkaWF0ZWx5KS4gIChzZXZlcmFsIHBsYWNlcyk6IHVzZSAtMSBpbnN0ZWFkIG9mIHplcm8KKwl0byBkaXN0aW5ndWlzaCBhbiBhYnNvbHV0ZSBtZW1yYW5nZSBmcm9tIGEgcmVnaXN0ZXItcmVsYXRpdmUgb25lLgorCShlbmNvZGVfYWN0aW9ucyk6IGFkZCBoYW5kbGluZyBmb3IgVU5PUF9NRU1WQUwgKGFzc2VtYmx5IHZhcmlhYmxlKS4KKworV2VkIEZlYiAgNCAxNzo0MDoyMSAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKKworICAgICAgICAqIE1ha2VmaWxlLmluIChTRklMRVMpOiBhZGQgdHJhY2Vwb2ludC5jLgorICAgICAgICAoTElOVEZJTEVTKTogYWRkIEBDT05GSUdfU1JDU0AuCisgICAgICAgIChTT1VSQ0VTKTogRGl0dG8uCisgICAgICAgICogY29uZmlndXJlLmluIChDT05GSUdfU1JDUyk6IE1pcnJvciB1c2Ugb2YgQ09ORklHX09CUy4KKyAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitUdWUgRmViICAzIDE2OjEyOjMyIDE5OTggIEdvcmRvbiBXLiBSb3NzIChnd3JAbWMuY29tKQorCisJKiBpbmZwdHJhY2UuYyAoY2hpbGRfcmVzdW1lKTogRG9uJ3QgdHJ5IHRvIHN0ZXAgaWYgCisJTk9fU0lOR0xFX1NURVAgaXMgZGVmaW5lZC4KKworTW9uIEZlYiAgMiAxOTowNjoxMyAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBCdW1wIHRvIDQuMTYuMi4KKworTW9uIEZlYiAgMiAxNzoxODoyNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgorCisgICAgICAgICogYWxwaGEtbmF0LmMgKGZldGNoX2FvdXRfY29yZV9yZWdpc3RlcnMpOiBSZW5hbWUgZnJvbQorICAgICAgICBmZXRjaF9jb3JlX3JlZ2lzdGVycy4KKyAgICAgICAgKGZldGNoX2VsZl9jb3JlX3JlZ2lzdGVycyk6IE5ldyBmdW5jdGlvbi4KKyAgICAgICAgKHN1cHBseV9ncmVnc2V0KTogVXNlIEFMUEhBX1JFR1NFVF9CQVNFLgorICAgICAgICAoc3VwcGx5X2ZwcmVnc2V0KTogTGlrZXdpc2UuCisgICAgICAgIChmaWxsX2ZwcmVnc2V0KTogTGlrZXdpc2UuCisgICAgICAgIChhbHBoYV9hb3V0X2NvcmVfZm5zKTogUmVuYW1lIGZyb20gYWxwaGFfY29yZV9mbnMuCisgICAgICAgIChhbHBoYV9lbGZfY29yZV9mbnMpOiBOZXcuCisgICAgICAgICogY29uZmlnL2FscGhhL2FscGhhLWxpbnV4Lm1oIChOQVRERVBGSUxFUyk6IHNvbGliLm8gbm90IG9zZnNvbGliLm8uCisgICAgICAgIERpc2FibGUgTU1BTExPQy4KKyAgICAgICAgKiBjb25maWcvYWxwaGEvbm0tbGludXguaCAoU1ZSNF9TSEFSRURfTElCUyk6IERlZmluZSBpZiBFTEYuCisJKFRBUkdFVF9FTEY2NCk6IExpa2V3aXNlLgorICAgICAgICAoQUxQSEFfUkVHU0VUX0JBU0UpOiBOZXcuCisgICAgICAgICogY29uZmlnL2FscGhhL25tLW9zZi5oIChBTFBIQV9SRUdTRVRfQkFTRSk6IE5ldy4KKyAgICAgICAgKiBjb25maWcvYWxwaGEvdG0tYWxwaGFsaW51eC5oOiBJbmNsdWRlIHRtLXN5c3Y0LmguCisKKyAgICAgICAgKiBzb2xpYi5jIChlbGZfbG9jYXRlX2Jhc2UpOiBBZGQgVEFSR0VUX0VMRjY0IHN1cHBvcnQuCisgICAgICAgIChpbmZvX3NoYXJlZGxpYmFyeV9jb21tYW5kKTogTGlrZXdpc2UuCisKKyAgICAgICAgKiBjb25maWd1cmUuaG9zdDogTWF0Y2ggYWxwaGEqLgorICAgICAgICAqIGNvbmZpZ3VyZS50Z3Q6IExpa2V3aXNlLgorCitGcmkgSmFuIDMwIDE1OjExOjM4IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJQ2hhbmdlcyBieSA8UGV0ZXIuU2NoYXVlckBSZWdlbnQuRS1UZWNobmlrLlRVLU11ZW5jaGVuLkRFPgorCSogaW5mcnVuLmMgKElOX1NPTElCX0RZTlNZTV9SRVNPTFZFX0NPREUpOiBuZXcgbWFjcm8gZm9yIGRldGVjdGluZworIAl3aGV0aGVyIHdlIGFyZSBpbiB0aGUgZHluYW1pYyBzeW1ib2wgcmVzb2x1dGlvbiBjb2RlIAorCSh3YWl0X2Zvcl9pbmZlcmlvcik6IGludm9rZSBpdC4KKwkqIHNvbGliLmMgKGluX3N2cjRfZHluc3ltX3Jlc29sdmVfY29kZSk6IG5ldyBmdW5jdGlvbgorCShlbmFibGVfYnJlYWspOiByZWNvcmQgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZHluYW1pYyBsaW5rZXIKKwl0ZXh0IGFuZCBwbHQgc2VjdGlvbnMgZm9yIHVzZSBpbiBpbl9zdnI0X2R5bnN5bV9yZXNvbHZlX2NvZGUuCisJKiBzb2xpYi5oIChJTl9TT0xJQl9EWU5TWU1fUkVTT0xWRV9DT0RFKTogYWRkIHN2cjQgZGVmaW5pdGlvbjsKKwkoaW5fc3ZyNF9keW5zeW1fcmVzb2x2ZV9jb2RlKTogZGVjbGFyZSBpdC4KKwkqIGNvbmZpZy9ubS1nbnUuaCAoc29saWIuaCk6IG1vdmUgaW5jbHVzaW9uIHRvIGFmdGVyIGRlZmluaXRpb24KKwlvZiBTVlI0X1NIQVJFRF9MSUJTLgorCSogY29uZmlnL25tLXN5c3Y0LmggKHNvbGliLmgpOiBkaXR0by4KKwkqIGNvbmZpZy9pMzg2L25tLWkzODZzY281LmggKHNvbGliLmgpOiBkaXR0by4KKwkqIGNvbmZpZy9pMzg2L25tLWxpbnV4LmggKHNvbGliLmgpOiBkaXR0by4KKwkqIGNvbmZpZy9taXBzL25tLWlyaXg1LmggKElOX1NPTElCX0RZTlNZTV9SRVNPTFZFX0NPREUpOiB1bmRlZmluZS4KKworVGh1IEphbiAyOSAxOTozOTozMSAxOTk4ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGNvZmZyZWFkLmMgKGNvZmZfc3ltdGFiX3JlYWQpIFtTRU1dOiBSZW1vdmUgY29kZSwgbWFjcm8gY2FuCisJbmV2ZXIgYmUgZGVmaW5lZC4KKwkqIGRieHJlYWQuYyAocHJvY2Vzc19vbmVfc3ltYm9sKSBbQkxPQ0tfQUREUkVTU19BQlNPTFVURV06CisJUmVtb3ZlLCBubyBsb25nZXIgbmVlZGVkLgorCSogaHBwYS10ZGVwLmMgKE5fU0VUX01BR0lDKTogUmVtb3ZlLCBubyBsb25nZXIgdXNlZC4KKwkqIGNvbmZpZy9wYS94bS1ocHBhYi5oIChTRUVLX1NFVCwgU0VFS19DVVIsIFNFRUtfRU5EKTogRGl0dG8uCisJKiBjb25maWcvbWlwcy90bS1taXBzbTMuaCAoTlVNRVJJQ19SRUdfTkFNRVMpOiBEaXR0by4KKwkqIGNvbmZpZy9taXBzL21pcHNtMy5tdCAoVERFUEZJTEVTKTogUmVtb3ZlIG1pcHNyZWFkLm8uCisKK1dlZCBKYW4gMjggMTQ6NDY6NTIgMTk5OCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJU3VnZ2VzdGVkIGJ5IENocmlzIFdhbHRlciA8d2FsdGVyQGJ1ZG9lLmJ1LmVkdT46CisJKiBkd2FyZnJlYWQuYyAoc2V0X2N1X2xhbmd1YWdlKTogUmVjb2duaXplIEZvcnRyYW4uCisJKiBkd2FyZjJyZWFkLmMgKHNldF9jdV9sYW5ndWFnZSk6IERpdHRvLgorCShyZWFkX2FycmF5X3R5cGUpOiBGaXggbGFuZ3VhZ2UgdGVzdC4KKworV2VkIEphbiAyOCAxMjo1MTowOCAxOTk4ICBNaWNoYWVsIFNueWRlciAgKG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tKQorIAorICAgICAgICAqIGJsb2NrZnJhbWUuYyAoZ2VuZXJpY19mcmFtZV9jaGFpbl92YWxpZCk6IEEgZnJhbWUgcG9pbnRlciBtYXkKKyAgICAgICAgYmUgdmFsaWQgaWYgaXQgaXMgZXF1YWwgdG8gdGhlIGZyYW1lIHBvaW50ZXIgb2YgaXRzIGNhbGxlciAoaWUuCisgICAgICAgIG5vdCBuZWNlc3NhcmlseSBzdHJpY3RseSBJTk5FUl9USEFOKS4gIEFsbG93cyBmcmFtZWxlc3MgZnVuY3Rpb25zLgorIAorV2VkIEphbiAyOCAxMToyMzoyNSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIG1vbml0b3IuYyAobW9uaXRvcl92c3ByaW50Zik6IE5ldyBmdW5jdGlvbiB0byBoYW5kbGUKKwlwcmludGluZyBvZiBsYXJnZSBhZGRyZXNzZXMgdXNpbmcgJUEgZm9ybWF0IHNwZWNpZmllci4KKwkobW9uaXRvcl9wcmludGZfbm9lY2hvLCBtb25pdG9yX3ByaW50Zik6IFVzZSBtb25pdG9yX3ZzcHJpbnRmCisJaW5zdGVhZCBvZiB2c3ByaW50Zi4KKwkqIGR2ZTM5MDAtcm9tLmMgKF9pbml0aWFsaXplX3IzOTAwX3JvbSk6IFVzZSAlQSBpbnN0ZWFkIG9mICVMeAorCXRvIHByaW50IGFkZHJlc3Nlcy4KKworVHVlIEphbiAyNyAxNjoxNDoyMyAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChDT05GSUdfTERGTEFHUyk6IE9ubHkgYWRkIC1leHBvcnQtZHluYW1pYworCXdoZW4gdXNpbmcgR05VIGxkLgorCitNb24gSmFuIDI2IDE5OjA3OjQ2IDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBjb25maWcvYWxwaGEvdG0tYWxwaGFsaW51eC5oIChhbHBoYV9saW51eF9zaWd0cmFtcF9vZmZzZXQpOgorCUFkZCBjbG9zaW5nIHBhcmVudGhlc2lzLiAgRnJvbSBISiBMdS4KKworTW9uIEphbiAyNiAxNzo1NDo0NSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGR2ZTM5MDAtcm9tLmM6IEltcHJvdmUgcGVyZm9ybWFuY2UgYnkgdXNpbmcgbWVtb3J5IGNvbW1hbmRzCisJdGhhdCBwcmludCBsZXNzIGZsdWZmLiAgTWlub3IgY29zbWV0aWMgY2hhbmdlcy4KKwlFbGltaW5hdGUgY29tcGlsZXIgd2FybmluZ3MuCisKK1NhdCBKYW4gMjQgMjM6NDQ6NDMgMTk5OCAgTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+CisKKwkqIGJyZWFrcG9pbnQuYyAoZW5hYmxlX2JyZWFrcG9pbnQpOiBQcmVzZXJ2ZSBicmVha3BvaW50CisJZGlzcG9zaXRpb24gd2hlbiBlbmFibGluZyBhIGJyZWFrcG9pbnQuCisKKwkqIHN5bXRhYi5jIChmaW5kX3BjX3NlY3RfbGluZSk6IElmIG5vIHN5bWJvbCBpbmZvcm1hdGlvbgorCWlzIGZvdW5kLCByZXR1cm4gY29ycmVjdCBwYyBhbnl3YXkuCisKK0ZyaSBKYW4gMjMgMTc6MjY6MjIgMTk5OCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaG9zdCAoaVszNDU2XTg2LSotb3NmMW1rKiwgbWlwcy0qLW1hY2gzKiwKKwluczMyay0qLW1hY2gzKik6IEZpeCBmaWxlIG5hbWVzLgorCShpWzM0NTZdODYtKi1vczlrLCBtODgqLSotbWFjaDMqLCB3NjUtKi0qKTogUmVtb3ZlIGNvbmZpZworCXJlY29nbml0aW9uLCBubyBzb3VyY2UgZmlsZXMgZm9yIHRoZXNlLgorCSogY29uZmlndXJlLnRndCAocG93ZXJwYy0qLWFpeDQqKTogUmVtb3ZlIGNvbmZpZywgbm93IGlkZW50aWNhbAorCXRvIHBvd2VycGMtKi1haXgqLgorCSogY29uZmlnL3Bvd2VycGMve2FpeDQubWgsYWl4NC5tdCx0bS1wcGMtYWl4NC5ofTogUmVtb3ZlIGZpbGVzLAorCW5vIGxvbmdlciBuZWVkZWQuCisKK0ZyaSBKYW4gMjMgMTY6NDk6NDEgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBtb25pdG9yLmMgKG1vbml0b3Jfd3JpdGUsIG1vbml0b3JfcmVhZGNoYXIpOiBOZXcgZnVuY3Rpb25zLgorCSogbW9uaXRvci5oIChtb25pdG9yX3dyaXRlLCBtb25pdG9yX3JlYWRjaGFyKTogRGVjbGFyZS4KKwkqIGR2ZTM5MDAtcm9tLmM6IEFkZCBzdXBwb3J0IGZvciBmYXN0IGxvYWRpbmcgb24gZXRoZXJuZXQgY29ubmVjdGlvbnMuCisKK0ZyaSBKYW4gMjMgMDc6NDc6MDYgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9kMTB2L3RtLWQxMHYuaCAoQ0FMTF9EVU1NWSk6IERlZmluZSBhcyAieyAwIH0iLgorCShUQVJHRVRfUkVBRF9GUCk6IERlZmluZSB0byBkMTB2X3JlYWRfZnAgcmF0aGVyIHRoYW4gZDEwdl9yZWFkX3NwLgorCShUQVJHRVRfV1JJVEVfRlApOiBEZWZpbmUgdG8gZDEwdl93cml0ZV9mcCByYXRoZXIgdGhhbiBkMTB2X3dyaXRlX3NwLgorCShkMTB2X3dyaXRlX2ZwLCBkMTB2X3JlYWRfZnApOiBBZGQgcHJvdG90eXBlcy4KKwkqIHN5bXRhYi5jIChkZWNvZGVfbGluZV8xKTogUmVtb3ZlIGFzc2lnbm1lbnQgb2Ygc2Fsc1swXS5wYyBmaWVsZC4KKwkqIHN5bWZpbGUuYyAoc2ltcGxlX292ZXJsYXlfdXBkYXRlLCBzaW1wbGVfb3ZlcmxheV91cGRhdGVfMSk6CisJSWdub3JlIHRoZSBzaXplIG9mIG92ZXJsYXkgc2VjdGlvbnMuICBUaGlzIGNoZWNrIGlzIHJlZHVuZGFudCBhbnl3YXkuCisJKiBwcmludGNtZC5jIChwcmludF9mcmFtZV9hcmdzKTogRGl0dG8uCisJKiB2YWxvcHMuYyAodmFsdWVfZmV0Y2hfbGF6eSk6IERpdHRvLgorCSogdmFsdWVzLmMgKHVucGFja19sb25nKTogRGl0dG8uCisJKiBkMTB2LXRkZXAuYyAoZDEwdl9mcmFtZV9jaGFpbiwgZDEwdl9mcmFtZV9maW5kX3NhdmVkX3JlZ3MsCisJZDEwdl9pbml0X2V4dHJhX2ZyYW1lX2luZm8pOiBGaXggc29tZSBtaW5vciBidWdzIHNvIHRoZSBmaW5pc2ggY29tbWFuZAorIAl3b3JrcyBwcm9wZXJseS4KKwkoc2hvd19yZWdzKTogQ2hhbmdlIG51bTEgYW5kIG51bTIgdHlwZXMgZnJvbSAibG9uZyBsb25nIiB0byAiTE9OR0VTVCIuCisJKGQxMHZfcmVhZF9mcCwgZDEwdl93cml0ZV9mcCk6IE5ldyBmdW5jdGlvbnMuCisJKGQxMHZfcHVzaF9hcmd1bWVudHMpOiBSZW1vdmUgdW5uZWVkZWQgYXNzaWducyB0byAidmFsIiBhbmQgImNvbnRlbnRzIi4KKwkoZDEwdl9wdXNoX2FyZ3VtZW50cyk6IEZpeCBmb3IgcG9pbnRlcnMgYW5kIHN0cnVjdHMuCisJKGQxMHZfZXh0cmFjdF9yZXR1cm5fdmFsdWUpOiBGaXggZm9yIHBvaW50ZXJzIGFuZCBjaGFycy4KKworVHVlIEphbiAyMCAxODo1MzoxOCAxOTk4ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS50Z3QgKGkzODYtKi1tYWNoKiwgbTg4Ki0qLW1hY2gzKik6IFJlbW92ZSBjb25maWcKKwlyZWNvZ25pdGlvbiwgbm8gc291cmNlIGZpbGVzIGZvciB0aGVzZSAobm90ZSB0aGF0IHRoZSBpMzg2IE1hY2gKKwljb25maWcgaXMgZm9yIHByZS1NYWNoIDMpLgorCShtaXBzKi0qLW1hY2gzKiwgbnMzMmstKi1tYWNoMyopOiBGaXggZmlsZSBuYW1lcy4KKwkqIGNvbmZpZy9taXBzL21pcHNlbDY0Lm10OiBSZW1vdmUsIG5ldmVyIHJlZmVyZW5jZWQuCisKK01vbiBKYW4gMTkgMTQ6MDE6MjggMTk5OCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiB0b3AuYyAocHJpbnRfZ2RiX3ZlcnNpb24pOiBSZXN0b3JlIHRvIG9yaWdpbmFsIG1lc3NhZ2UuCisKK01vbiBKYW4gMTkgMTM6MzQ6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJRnJvbSBjZ2ZAYmJjLmNvbSAoQ2hyaXMgRmF5bG9yKToKKwkqIHdpbjMyLW5hdC5jIChjaGlsZF9tb3Vybl9pbmZlcmlvcik6IENhbGwgQ29udGludWVEZWJ1Z0V2ZW50IHRvCisJbGV0IHRoZSBjaGlsZCBleGl0LgorCShjaGlsZF9raWxsX2luZmVyaW9yKTogUmVzcG9uZCB0byBhbGwgZGVidWcgZXZlbnRzIGFzIHRoZSBjaGlsZCBpcworCXRlcm1pbmF0aW5nLgorCisJKiBNYWtlZmlsZS5pbiAoYWxsKTogQ2hhbmdlIGdkYiBkZXBlbmRlbmN5IHRvIGdkYiQoRVhFRVhUKS4KKwkodW5pbnN0YWxsKTogQWRkICQoRVhFRVhUKSB0byBmaWxlIG5hbWUgdG8gcmVtb3ZlLgorCShnZGIkKEVYRUVYVCkpOiBSZW5hbWUgdGFyZ2V0IGZyb20gcGxhaW4gZ2RiLgorCShnZGIxJChFWEVFWFQpKTogUmVuYW1lIHRhcmdldCBmcm9tIHBsYWluIGdkYjEuCisJKGNsZWFuLCBtb3N0bHljbGVhbik6IEFkZCAkKEVYRUVYVCkgdG8gYmluYXJ5IG5hbWVzIHRvIHJlbW92ZS4KKworMTk5OC0wMS0xNiAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgorCisJKiB0b3AuYyAocHJpbnRfZ2RiX3ZlcnNpb24pOiBkZWxldGUgc3R1dHRlci4KKworVGh1IEphbiAxNSAxMjoyOToxMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiByZW1vdGUtcmRpLmMgKGFybV9yZGlfb3Blbik6IFBhdGNoIGZyb20gVG9ueS5UaG9tcHNvbkBhcm0uY29tCisJdG8gcHJldmVudCBzcHVyb3VzIGVycm9yIG1lc3NhZ2VzIG9uIG5vbi1JQ0UgdGFyZ2V0cy4KKworV2VkIEphbiAxNCAxOToyNzowMiAxOTk4ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9taXBzL3tyMzkwMC5tdCxyMzkwMGwubXQsdG0tcjM5MDAuaCx0bS1yMzkwMGwuaH06CisJUmVtb3ZlLCBubyBsb25nZXIgdXNlZC4KKworV2VkIEphbiAxNCAxODoxMToyNiAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCVBhdGNoIGZyb20gSmltIFdpbHNvbi4KKwkqIGQzMHYtdGRlcC5jIChkMzB2X2ZyYW1lX2ZpbmRfc2F2ZWRfcmVnc19vZmZzZXRzKTogUHJvcGVybHkKKwlkZWNsYXJlIHZvaWQgZnVuY3Rpb24gYmVmb3JlIHVzZS4KKworCSogY29uZmlnL2QzMHYvdG0tZDMwdi5oIChDQUxMX0RVTU1ZKTogSW5pdGlhbGl6ZSBhcyB7IDAgfSwgbm90IHt9LgorCitUdWUgSmFuIDEzIDE2OjM4OjQ4IDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKC0td2l0aC1tbWFsbG9jKTogQWRkIG5ldyBjb25maWd1cmUgYXJnIHRvIHVzZSB0aGUKKwltbWFsbG9jIHBhY2thZ2UuICBEZWZhdWx0IGlzIHRvIG5vdCB1c2UgaXQuCisJKFNUQVJUX0lORkVSSU9SX1RSQVBTX0VYUEVDVEVEKTogRGVmaW5lIHRvIHRoZSBpbnRlZ2VyIDIsIG5vdAorCXRoZSBzdHJpbmcgIjIiLgorCSogYWNjb25maWcuaCAoVVNFX01NQUxMT0MsIEZPUkNFX01NQ0hFQ0spOiBBZGQgI3VuZGVmLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKwkqIGNvbmZpZy5pbjogUmVnZW5lcmF0ZWQuCisJKiBNYWtlZmlsZS5pbiAoTU1BTExPQ19ESVIsIE1NQUxMT0NfU1JDKTogUmVtb3ZlLgorCShNTUFMTE9DKTogU2V0IHVzaW5nIGNvbmZpZ3VyZS4KKwkoTU1BTExPQ19DRkxBR1MpOiBTZXQgdXNpbmcgY29uZmlndXJlLgorCisJKiBjb25maWcvaTM4Ni90bS1saW51eC5oIChzeXNfcXVvdGFjdGwpOiBEZWZpbmUgdG8gMSByYXRoZXIKKwl0aGFuIGp1c3QgZGVmaW5pbmcgaXQuCisJKiBtcHctbWFrZS5zZWQ6IFVuZGVmaW5lIFVTRV9NTUFMTE9DIHJhdGhlciB0aGFuIGRlZmluaW5nIE5PX01NQUxMT0MuCisJKiB1dGlscy5jIChOT19NTUFMTE9DKTogVXNlIFVTRV9NTUFMTE9DIGluc3RlYWQuCisJKiBvYmpmaWxlcy5jOiBkaXR0by4KKwkqIGRlZnMuaDogZGl0dG8uCisKKwkqIGNvbmZpZy9zcGFyYy9zdW40b3M0Lm1oIChNTUFMTE9DX0NGTEFHUyk6IFJlbW92ZS4KKwkqIGNvbmZpZy9tNjhrL3N1bjNvczQubWggKE1NQUxMT0NfQ0ZMQUdTKTogUmVtb3ZlLgorCSogY29uZmlnL2kzODYvY3lnd2luMzIubWggKE1NQUxMT0NfQ0ZMQUdTKTogUmVtb3ZlLgorCSogY29uZmlnL2FscGhhL2FscGhhLW9zZjMubWggKE1NQUxMT0NfQ0ZMQUdTKTogUmVtb3ZlLgorCSogY29uZmlnL2FscGhhL2FscGhhLW9zZjIubWggKE1NQUxMT0NfQ0ZMQUdTKTogUmVtb3ZlLgorCSogZ2Ric2VydmVyL01ha2VmaWxlLmluIChNTUFMTE9DXyopOiBSZW1vdmUuCisJKiBjb25maWcvcnM2MDAwL3JzNjAwMC5taCAoTU1BTExPQywgTU1BTExPQ19DRkxBR1MpOiBSZW1vdmUuCisJKiBjb25maWcvcnM2MDAwL2FpeDQubWggKE1NQUxMT0MsIE1NQUxMT0NfQ0ZMQUdTKTogUmVtb3ZlLgorCSogY29uZmlnL3Bvd2VycGMvYWl4NC5taCAoTU1BTExPQywgTU1BTExPQ19DRkxBR1MpOiBSZW1vdmUuCisJKiBjb25maWcvcG93ZXJwYy9haXgubWggKE1NQUxMT0MsIE1NQUxMT0NfQ0ZMQUdTKTogUmVtb3ZlLgorCSogY29uZmlnL25zMzJrL25zMzJrbTMubWggKE1NQUxMT0MsIE1NQUxMT0NfQ0ZMQUdTKTogUmVtb3ZlLgorCSogY29uZmlnL21pcHMvbWlwc20zLm1oIChNTUFMTE9DLCBNTUFMTE9DX0NGTEFHUyk6IFJlbW92ZS4KKwkqIGNvbmZpZy9taXBzL2RlY3N0YXRpb24ubWggKE1NQUxMT0MsIE1NQUxMT0NfQ0ZMQUdTKTogUmVtb3ZlLgorCSogY29uZmlnL204OGsvY3h1eC5taCAoTU1BTExPQywgTU1BTExPQ19DRkxBR1MpOiBSZW1vdmUuCisJKiBjb25maWcvaTM4Ni94bS13aW5kb3dzLmggKE5PX01NQUxMT0MsIE5PX01NQ0hFQ0spOiBSZW1vdmUuCisJKiBjb25maWcvaTM4Ni9pMzg2bWsubWggKE1NQUxMT0MsIE1NQUxMT0NfQ0ZMQUdTKTogUmVtb3ZlLgorCSogY29uZmlnL2kzODYvaTM4Nm0zLm1oIChNTUFMTE9DLCBNTUFMTE9DX0NGTEFHUyk6IFJlbW92ZS4KKwkqIGNvbmZpZy9pMzg2L2kzODZnbnUubWggKE1NQUxMT0MsIE1NQUxMT0NfQ0ZMQUdTKTogUmVtb3ZlLgorCSogY29uZmlnL2FscGhhL2FscGhhLW9zZjEubWggKE1NQUxMT0MsIE1NQUxMT0NfQ0ZMQUdTKTogUmVtb3ZlLgorCSogY29uZmlnL2FscGhhL2FscGhhLWxpbnV4Lm1oIChNTUFMTE9DLCBNTUFMTE9DX0NGTEFHUyk6IFJlbW92ZS4KKworTW9uIEphbiAxMiAxMTo0Njo1MSAxOTk4ICBNaWNoYWVsIFNueWRlciAgKG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tKQorCisJKiBjb25maWcvbTY4ay90bS1tNjhrLmggKFJFR0lTVEVSX1ZJUlRVQUxfVFlQRSk6IG1ha2UgQTAgdGhydSBBNworCWRlZmF1bHQgdG8gdm9pZCBwb2ludGVyIHR5cGUgKHNvIHRoYXQgdGhlaXIgZGVmYXVsdCByYWRpeCBpcyBoZXgpLgorCisJKiBzeW10YWIuYzogbW92ZSByYnJlYWtfY29tbWFuZCBmcm9tIG5vX2NsYXNzIHRvIGNsYXNzX2JyZWFrcG9pbnQKKwlzbyBpdCB3aWxsIGJlIGxpc3RlZCB1bmRlciAiaGVscCBicmVha3BvaW50cyIuCisKK1NhdCBKYW4gMTAgMTQ6NTg6MDQgMTk5OCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiByZGktc2hhcmUvaG9zdGNoYW4uYzogUmVtb3ZlIGdldHRpbWVvZmRheSBkZWNsYXJhdGlvbi4KKworVGh1IEphbiAgOCAxMTowMzo1OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiByZW1vdGUtcmRwLmM6IEFwcGxpZWQgcGF0Y2hlcyBzdWJtaXR0ZWQgYnkgVG9ueS5UaG9tcHNvbkBhcm0uY29tCisgCXRvIGltcGxlbWVudCB0aGUgQW5nZWwgcmVtb3RlIGRlYnVnZ2luZyBpbnRlcmZhY2UuCisKKwkqIE1ha2VmaWxlLmluOiBBZGQgYnVpbGQgcnVsZXMgZm9yIHJlbW90ZS1yZGkuYyBhbmQKKwlyZGktc2hhcmUvbGliYW5nc2QuYS4KKworCSogY29uZmlndXJlLnRndDogVXBkYXRlZCBmcm9tIHNvdXJjZSBvbiBicmFuY2guCisJKiBjb25maWcvYXJtL3RtLWFybS5oOiBVcGRhdGVkIGZyb20gc291cmNlIG9uIGJyYW5jaC4KKwkqIGFybS10ZGVwLmM6IFVwZGF0ZWQgZnJvbSBzb3VyY2Ugb24gYnJhbmNoLgorCisJKiByZGktc2hhcmU6IE5ldyBkaXJlY3RvcnksIFJESSBsaWJyYXJ5IGNvbnRyaWJ1dGVkIGJ5IEFSTS4KKworTW9uIEphbiAgNSAyMDoyMTo1OSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIG1vbml0b3IuaCAoTU9fUFJJTlRfUFJPR1JBTV9PVVRQVVQpOiBEZWZpbmUuCisJKiBtb25pdG9yLmMgKG1vbml0b3Jfd2FpdCk6IEVjaG8gcHJvZ3JhbSBvdXRwdXQuCisJKiBkdmUzOTAwLXJvbS5jIChfaW5pdGlhbGl6ZV9yMzkwMF9yb20pOiBSZW1vdmUgTU9fSEFORExFX05MIGZsYWcsCisJYWRkIE1PX1BSSU5UX1BST0dSQU1fT1VUUFVUIGZsYWcuCisKK01vbiBKYW4gIDUgMTg6MjE6MTEgMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+CisKKwkqIHRvcC5oIChIQVZFX1NJR1NFVEpNUCk6IGRlZmluZSBTSUdKTVBfQlVGLCBTSUdTRVRKTVAsIGFuZAorCVNJR0xPTkdKTVAgYXBwcm9wcmlhdGVseSBiYXNlZCBvbiB3aGV0aGVyIEhBVkVfU0lHU0VUSk1QIGlzCisJZGVmaW5lZC4KKwkqIHRvcC5jIChyZXR1cm5fdG9fdG9wX2xldmVsLCBjYXRjaF9lcnJvcnMpOiB1c2UgdGhlIG5ldyBtYWNyb3MKKwkqIG1haW4uYyAoU0VUX1RPUF9MRVZFTCk6IGRpdHRvLgorCSogY29uZmlnL3htLXN5c3Y0LmggKEhBVkVfU0lHU0VUSk1QKTogRGVmaW5lLgorCitGcmkgSmFuICAyIDE4OjQ4OjU4IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEb3VibGUgdXAgYnJhY2tldHMgaW4gc2hlbGwgY2FzZSBwYXR0ZXJuLgorCitGcmkgSmFuICAyIDE3OjA2OjA1IDE5OTggIE1pY2hhZWwgU255ZGVyICAobXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20pCisKKyAgICAgICAgKiB0cmFjZXBvaW50LmMgKGZpbmlzaF90ZmluZF9jb21tYW5kKTogaW1wcm92ZWQgYWxnb3JpdGhtIGZvcgorICAgICAgICBkZWNpZGluZyB3aGVuIHdlJ3ZlICJzdGVwcGVkIiBpbnRvIGEgbmV3IHN0YWNrIGZyYW1lLgorICAgICAgICAobWFwX2FyZ3Nfb3Zlcl90cmFjZXBvaW50cyk6IGxvb3Agb3ZlciB0cmFjZXBvaW50IGxpc3QgInNhZmVseSIsIAorCXNpbmNlIGxpc3QgZWxlbWVudHMgbWF5IGJlIGRlbGV0ZWQgZHVyaW5nIGxvb3AuCisJKHJlYWRfYWN0aW9ucyk6IGFkZCBhY3Rpb25zIHRvIGhpc3RvcnkgbGlzdC4KKworRm9yIG9sZGVyIGNoYW5nZXMgc2VlIENoYW5nZUxvZy05NworDAorTG9jYWwgVmFyaWFibGVzOgorbW9kZTogY2hhbmdlLWxvZworbGVmdC1tYXJnaW46IDgKK2ZpbGwtY29sdW1uOiA3NAordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvZ2RiL01ha2VmaWxlLmluIGIvZ2RiL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNmRmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxNjE5IEBACisjIENvcHlyaWdodCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKKworaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK2JpbmRpciA9IEBiaW5kaXJACitsaWJkaXIgPSBAbGliZGlyQAordG9vbGRpciA9ICQobGliZGlyKS8kKHRhcmdldF9hbGlhcykKKworZGF0YWRpciA9IEBkYXRhZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK21hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQorbWFuMmRpciA9ICQobWFuZGlyKS9tYW4yCittYW4zZGlyID0gJChtYW5kaXIpL21hbjMKK21hbjRkaXIgPSAkKG1hbmRpcikvbWFuNAorbWFuNWRpciA9ICQobWFuZGlyKS9tYW41CittYW42ZGlyID0gJChtYW5kaXIpL21hbjYKK21hbjdkaXIgPSAkKG1hbmRpcikvbWFuNworbWFuOGRpciA9ICQobWFuZGlyKS9tYW44CittYW45ZGlyID0gJChtYW5kaXIpL21hbjkKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKKworIyBUaGlzIGNhbiBiZSByZWZlcmVuY2VkIGJ5IGBJTlRMREVQUycgYXMgY29tcHV0ZWQgYnkgQ1lfR05VX0dFVFRFWFQuCit0b3BfYnVpbGRkaXIgPSAuCisKK1NIRUxMID0gQFNIRUxMQAorRVhFRVhUID0gQEVYRUVYVEAKKworSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACisKK0FSID0gQEFSQAorQVJfRkxBR1MgPSBxdgorUkFOTElCID0gQFJBTkxJQkAKK0RMTFRPT0wgPSBARExMVE9PTEAKK1dJTkRSRVMgPSBAV0lORFJFU0AKKworIyBJZiB0aGUgdXNlciBjb25maWd1cmVkIEdEQiB0byBpbmNsdWRlIHRoZSBUVUksIHRoZSBuYW1lIG9mIHRoZSB0dWkKKyMgbGlicmFyeSBnb2VzIGhlcmUuCitUVUlfTElCUkFSWSA9IEBUVUlfTElCUkFSWUAKKworIyBJZiB0aGUgdXNlciBjb25maWd1cmVkIEdEQiB0byBpbmNsdWRlIHRoZSBUVUksIHRoZSBhbGwtdHVpIAorIyB0YXJnZXQgZ29lcyBoZXJlLgorQlVJTERfVFVJID0gQEJVSUxEX1RVSUAKKworIyBGbGFncyB0aGF0IGRlc2NyaWJlIHdoZXJlIHlvdSBjYW4gZmluZCB0aGUgdGVybWNhcCBsaWJyYXJ5LgorIyBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGluIHRoZSBob3N0IE1ha2VmaWxlIGZyYWdtZW50IGZpbGUuCitURVJNQ0FQID0gQFRFUk1fTElCQAorCisjIElmIHlvdSBhcmUgY29tcGlsaW5nIHdpdGggR0NDLCBtYWtlIHN1cmUgdGhhdCBlaXRoZXIgMSkgWW91IGhhdmUgdGhlCisjIGZpeGVkIGluY2x1ZGUgZmlsZXMgd2hlcmUgR0NDIGNhbiByZWFjaCB0aGVtLCBvciAyKSBZb3UgdXNlIHRoZQorIyAtdHJhZGl0aW9uYWwgZmxhZy4gIE90aGVyd2lzZSB0aGUgaW9jdGwgY2FsbHMgaW4gaW5mbG93LmMKKyMgd2lsbCBiZSBpbmNvcnJlY3RseSBjb21waWxlZC4gIFRoZSAiZml4aW5jbHVkZXMiIHNjcmlwdCBpbiB0aGUgZ2NjCisjIGRpc3RyaWJ1dGlvbiB3aWxsIGZpeCB5b3VyIGluY2x1ZGUgZmlsZXMgdXAuCitDQz1AQ0NACisKKyMgRGlyZWN0b3J5IGNvbnRhaW5pbmcgc291cmNlIGZpbGVzLgorc3JjZGlyID0gQHNyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKKworWUFDQz1AWUFDQ0AKKworWUxXUkFQID0gJChzcmNkaXIpLy4uL3lsd3JhcAorCisjIHdoZXJlIHRvIGZpbmQgbWFrZWluZm8sIHByZWZlcmFibHkgb25lIGRlc2lnbmVkIGZvciB0ZXhpbmZvLTIKK01BS0VJTkZPPW1ha2VpbmZvCisKKyMgU2V0IHRoaXMgdXAgd2l0aCBnY2MgaWYgeW91IGhhdmUgZ251IGxkIGFuZCB0aGUgbG9hZGVyIHdpbGwgcHJpbnQgb3V0CisjIGxpbmUgbnVtYmVycyBmb3IgdW5kZWZpbmVkIHJlZmVyZW5jZXMuCisjQ0NfTEQ9Z2NjIC1zdGF0aWMKK0NDX0xEPSQoQ0MpCisKKyMgV2hlcmUgaXMgb3VyICJpbmNsdWRlIiBkaXJlY3Rvcnk/ICBUeXBpY2FsbHkgJChzcmNkaXIpLy4uL2luY2x1ZGUuCisjIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIGhlYWRlciBmaWxlIGRpcmVjdG9yeSBmb3IgdGhlIGxpYnJhcnkKKyMgcm91dGluZXMgaW4gbGliaWJlcnR5LgorSU5DTFVERV9ESVIgPSAgJChzcmNkaXIpLy4uL2luY2x1ZGUKK0lOQ0xVREVfQ0ZMQUdTID0gLUkkKElOQ0xVREVfRElSKQorCisjIFdoZXJlIGlzIHRoZSAiLWxpYmVydHkiIGxpYnJhcnk/ICBUeXBpY2FsbHkgaW4gLi4vbGliaWJlcnR5LgorTElCSUJFUlRZID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCisKKyMgQ29uZmlndXJlZCBieSB0aGUgLS13aXRoLW1tYWxsb2Mgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KK01NQUxMT0MgPSBATU1BTExPQ0AKK01NQUxMT0NfQ0ZMQUdTID0gQE1NQUxMT0NfQ0ZMQUdTQAorCisjIFdoZXJlIGlzIHRoZSBCRkQgbGlicmFyeT8gIFR5cGljYWxseSBpbiAuLi9iZmQuCitCRkRfRElSID0gLi4vYmZkCitCRkQgPSAkKEJGRF9ESVIpL2xpYmJmZC5hCitCRkRfU1JDID0gJChzcmNkaXIpLyQoQkZEX0RJUikKK0JGRF9DRkxBR1MgPSAtSSQoQkZEX0RJUikgLUkkKEJGRF9TUkMpCisKKyMgV2hlcmUgaXMgdGhlIFJFQURMSU5FIGxpYnJhcnk/ICBUeXBpY2FsbHkgaW4gLi4vcmVhZGxpbmUuCitSRUFETElORV9ESVIgPSAuLi9yZWFkbGluZQorUkVBRExJTkUgPSAkKFJFQURMSU5FX0RJUikvbGlicmVhZGxpbmUuYQorUkVBRExJTkVfU1JDID0gJChzcmNkaXIpLyQoUkVBRExJTkVfRElSKQorUkVBRExJTkVfQ0ZMQUdTID0gLUkkKFJFQURMSU5FX1NSQykvLi4KKworV0FSTl9DRkxBR1MgPSBAV0FSTl9DRkxBR1NACisKKyMgV2hlcmUgaXMgdGhlIElOVEwgbGlicmFyeT8gIFR5cGljYWxseSBpbiAuLi9pbnRsLgorSU5UTF9ESVIgPSAuLi9pbnRsCitJTlRMID0gQElOVExMSUJTQAorSU5UTF9ERVBTID0gQElOVExERVBTQAorSU5UTF9TUkMgPSAkKHNyY2RpcikvJChJTlRMX0RJUikKK0lOVExfQ0ZMQUdTID0gLUkkKElOVExfRElSKSAtSSQoSU5UTF9TUkMpCisKKyMgV2hlcmUgaXMgdGhlIFRVSSBsaWJyYXJ5PyAgVHlwaWNhbGx5IGluIHR1aS8uCitUVUlfRElSPXR1aQorVFVJX1NSQyA9ICQoc3JjZGlyKS8kKFRVSV9ESVIpCitUVUlfQ0ZMQUdTPSAtSSQoVFVJX1NSQykKKworIyBPcGNvZGVzIGN1cnJlbnRseSBsaXZlIGluIG9uZSBvZiB0d28gcGxhY2VzLiAgRWl0aGVyIHRoZXkgYXJlIGluIHRoZQorIyBvcGNvZGUgbGlicmFyeSwgdHlwaWNhbGx5IC4uL29wY29kZXMsIG9yIHRoZXkgYXJlIGluIGEgaGVhZGVyIGZpbGUKKyMgaW4gSU5DTFVERV9ESVIuCisjIFdoZXJlIGlzIHRoZSAiLWxvcGNvZGVzIiBsaWJyYXJ5LCB3aXRoIChzb21lIG9mKSB0aGUgb3Bjb2RlIHRhYmxlcyBhbmQKKyMgZGlzYXNzZW1ibGVycz8KK09QQ09ERVMgPSAuLi9vcGNvZGVzL2xpYm9wY29kZXMuYQorIyBXaGVyZSBhcmUgdGhlIG90aGVyIG9wY29kZSB0YWJsZXMgd2hpY2ggb25seSBoYXZlIGhlYWRlciBmaWxlCisjIHZlcnNpb25zPworT1BfSU5DTFVERSA9ICQoSU5DTFVERV9ESVIpL29wY29kZQorT1BDT0RFU19DRkxBR1MgPSAtSSQoT1BfSU5DTFVERSkKKworIyBUaGUgc2ltdWxhdG9yIGlzIHVzdWFsbHkgbm9uZXhpc3RlbnQ7IHRhcmdldHMgdGhhdCBpbmNsdWRlIG9uZQorIyBzaG91bGQgc2V0IHRoaXMgdG8gbGlzdCBhbGwgdGhlIC5vIG9yIC5hIGZpbGVzIHRvIGJlIGxpbmtlZCBpbi4KK1NJTSA9CisKKworRU5BQkxFX0NGTEFHUz0gQEVOQUJMRV9DRkxBR1NACisKKyMgLUkuIGZvciBjb25maWcgZmlsZXMuCisjIC1JJChzcmNkaXIpIGZvciBnZGIgaW50ZXJuYWwgaGVhZGVycyBhbmQgcG9zc2libHkgZm9yIGdudS1yZWdleC5oIGFsc28uCisjIC1JJChzcmNkaXIpL2NvbmZpZyBmb3IgbW9yZSBnZW5lcmljIGNvbmZpZyBmaWxlcy4KKworIyBJdCBpcyBhbHNvIHBvc3NpYmxlIHRoYXQgeW91IHdpbGwgbmVlZCB0byBhZGQgLUkvdXNyL2luY2x1ZGUvc3lzIGlmCisjIHlvdXIgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBmY250bC5oIGluIC91c3IvaW5jbHVkZSAod2hpY2ggaXMgd2hlcmUgaXQKKyMgc2hvdWxkIGJlIGFjY29yZGluZyB0byBQb3NpeCkuCitERUZTID0gQERFRlNACitHREJfQ0ZMQUdTID0gLUkuIC1JJChzcmNkaXIpIC1JJChzcmNkaXIpL2NvbmZpZyAkKERFRlMpCisKKyMgTXtILFR9X0NGTEFHUywgaWYgZGVmaW5lZCwgaGF2ZSBob3N0LSBhbmQgdGFyZ2V0LWRlcGVuZGVudCBDRkxBR1MKKyMgZnJvbSB0aGUgY29uZmlnIGRpcmVjdG9yeS4KK0dMT0JBTF9DRkxBR1MgPSAkKE1UX0NGTEFHUykgJChNSF9DRkxBR1MpCisjUFJPRklMRV9DRkxBR1MgPSAtcGcKKworIyBDRkxBR1MgaXMgc3BlY2lmaWNhbGx5IHJlc2VydmVkIGZvciBzZXR0aW5nIGZyb20gdGhlIGNvbW1hbmQgbGluZQorIyB3aGVuIHJ1bm5pbmcgbWFrZS4gIEkuRS4gICJtYWtlIENGTEFHUz0tV21pc3NpbmctcHJvdG90eXBlcyIuCitDRkxBR1MgPSAtZworCisjIE5lZWQgdG8gcGFzcyB0aGlzIHRvIHRlc3RzdWl0ZSBmb3IgIm1ha2UgY2hlY2siLiAgUHJvYmFibHkgc2hvdWxkIGJlCisjIGNvbnNpc3RlbnQgd2l0aCB0b3AtbGV2ZWwgTWFrZWZpbGUuaW4gYW5kIGdkYi90ZXN0c3VpdGUvTWFrZWZpbGUuaW4KKyMgc28gIm1ha2UgY2hlY2siIGhhcyB0aGUgc2FtZSByZXN1bHQgbm8gbWF0dGVyIHdoZXJlIGl0IGlzIHJ1bi4KK0NYWEZMQUdTID0gLWcgLU8KKworIyBJTlRFUk5BTF9DRkxBR1MgaXMgdGhlIGFnZ3JlZ2F0ZSBvZiBhbGwgb3RoZXIgKkNGTEFHUyBtYWNyb3MuCitJTlRFUk5BTF9DRkxBR1MgPSAkKENGTEFHUykgJChHTE9CQUxfQ0ZMQUdTKSAkKFBST0ZJTEVfQ0ZMQUdTKSBcCisJJChHREJfQ0ZMQUdTKSAkKE9QQ09ERVNfQ0ZMQUdTKSAkKFJFQURMSU5FX0NGTEFHUykgXAorCSQoQkZEX0NGTEFHUykgJChNTUFMTE9DX0NGTEFHUykgJChJTkNMVURFX0NGTEFHUykgXAorCSQoSU5UTF9DRkxBR1MpICQoVFVJX0NGTEFHUykgJChFTkFCTEVfQ0ZMQUdTKSAkKFdBUk5fQ0ZMQUdTKQorCisjIExERkxBR1MgaXMgc3BlY2lmaWNhbGx5IHJlc2VydmVkIGZvciBzZXR0aW5nIGZyb20gdGhlIGNvbW1hbmQgbGluZQorIyB3aGVuIHJ1bm5pbmcgbWFrZS4KKworIyBQcm9maWxpbmcgb3B0aW9ucyBuZWVkIHRvIGdvIGhlcmUgdG8gd29yay4KKyMgSSB0aGluayBpdCdzIHBlcmZlY3RseSByZWFzb25hYmxlIGZvciBhIHVzZXIgdG8gc2V0IC1wZyBpbiBDRkxBR1MKKyMgYW5kIGhhdmUgaXQgd29yazsgdGhhdCdzIHdoeSBDRkxBR1MgaXMgaGVyZS4KK0lOVEVSTkFMX0xERkxBR1MgPSAkKENGTEFHUykgJChHTE9CQUxfQ0ZMQUdTKSAkKFBST0ZJTEVfQ0ZMQUdTKSAkKExERkxBR1MpIEBDT05GSUdfTERGTEFHU0AgQEhMREZMQUdTQAorSExERU5WID0gQEhMREVOVkAKKworIyBXZSBhcmUgdXNpbmcgb3VyIG93biB2ZXJzaW9uIG9mIFJFR0VYIG5vdyB0byBiZSBjb25zaXN0ZW50IGFjcm9zcworIyBtYWNoaW5lcy4KK1JFR0VYID0gZ251LXJlZ2V4Lm8KK1JFR0VYMSA9IGdudS1yZWdleC5vCisKKyMgSWYgeW91ciBzeXN0ZW0gaXMgbWlzc2luZyBhbGxvY2EoKSwgb3IsIG1vcmUgbGlrZWx5LCBpdCdzIHRoZXJlIGJ1dAorIyBpdCBkb2Vzbid0IHdvcmssIHRoZW4gcmVmZXIgdG8gbGliaWJlcnR5LgorCisjIExpYnJhcmllcyBhbmQgY29ycmVzcG9uZGluZyBkZXBlbmRlbmNpZXMgZm9yIGNvbXBpbGluZyBnZGIuCisjIHtYLFR9TV9DTElCUywgZGVmaW5lZCBpbiAqY29uZmlnIGZpbGVzLCBoYXZlIGhvc3QtIGFuZCB0YXJnZXQtZGVwZW5kZW50IGxpYnMuCisjIFRFUk1DQVAgY29tZXMgYWZ0ZXIgcmVhZGxpbmUsIHNpbmNlIHJlYWRsaW5lIGRlcGVuZHMgb24gaXQuCisjIE1NQUxMT0MgY29tZXMgYWZ0ZXIgYW55dGhpbmcgZWxzZSB0aGF0IG1pZ2h0IHdhbnQgYW4gYWxsb2NhdGlvbiBmdW5jdGlvbi4KKyMgTElCSUJFUlRZIGFwcGVhcnMgdHdpY2Ugb24gcHVycG9zZS4KKyMgSWYgeW91IGhhdmUgdGhlIEN5Z251cyBsaWJyYXJpZXMgaW5zdGFsbGVkLAorIyB5b3UgY2FuIHVzZSAnQ0xJQlM9JChJTlNUQUxMRURfTElCUyknICdDREVQUz0nCitJTlNUQUxMRURfTElCUz0tbGJmZCAtbHJlYWRsaW5lIC1sb3Bjb2RlcyAtbGliZXJ0eSBcCisJJChURVJNQ0FQKSAkKFhNX0NMSUJTKSAkKFRNX0NMSUJTKSAkKE5BVF9DTElCUykgJChHREJUS0xJQlMpIEBMSUJTQCBcCisJLWxtbWFsbG9jIC1saW50bCAtbGliZXJ0eQorQ0xJQlMgPSAkKFNJTSkgJChCRkQpICQoUkVBRExJTkUpICQoT1BDT0RFUykgJChJTlRMKSAkKExJQklCRVJUWSkgXAorCSQoVEVSTUNBUCkgJChYTV9DTElCUykgJChUTV9DTElCUykgJChOQVRfQ0xJQlMpICQoR0RCVEtMSUJTKSBATElCU0AgXAorCSQoTU1BTExPQykgJChMSUJJQkVSVFkpICQoV0lOMzJMSUJTKQorQ0RFUFMgPSAkKFhNX0NERVBTKSAkKFRNX0NERVBTKSAkKE5BVF9DREVQUykgJChTSU0pICQoQkZEKSAkKFJFQURMSU5FKSBcCisJJChPUENPREVTKSAkKE1NQUxMT0MpICQoSU5UTF9ERVBTKSAkKExJQklCRVJUWSkgQENPTkZJR19ERVBTQAorCitBRERfRklMRVMgPSAkKFJFR0VYKSAkKFhNX0FERF9GSUxFUykgJChUTV9BRERfRklMRVMpICQoTkFUX0FERF9GSUxFUykKK0FERF9ERVBTID0gJChSRUdFWDEpICQoWE1fQUREX0ZJTEVTKSAkKFRNX0FERF9GSUxFUykgJChOQVRfQUREX0ZJTEVTKQorCitWRVJTSU9OPTQuMTgKK0RJU1Q9Z2RiCisKK0xJTlQ9L3Vzci81YmluL2xpbnQKK0xJTlRGTEFHUz0gJChCRkRfQ0ZMQUdTKQorCitSVU5URVNUID0gYGlmIFsgLWYgJCR7cm9vdHNyY30vLi4vZGVqYWdudS9ydW50ZXN0IF0gOyB0aGVuIFwKKwkJZWNobyAkJHtyb290c3JjfS8uLi9kZWphZ251L3J1bnRlc3QgOyBlbHNlIGVjaG8gcnVudGVzdDsgXAorCSAgIGZpYAorCitSVU5URVNURkxBR1M9CisKKyMgVGhpcyBpcyBzZXItdW5peC5vIGZvciBhbnkgc3lzdGVtIHdoaWNoIHN1cHBvcnRzIGEgdjcvQlNEL1NZU1YvUE9TSVgKKyMgaW50ZXJmYWNlIHRvIHRoZSBzZXJpYWwgcG9ydC4gIEhvcGVmdWxseSBpZiBnZXQgcG9ydGVkIHRvIE9TLzIsIFZNUywKKyMgZXRjLiwgdGhlbiB0aGVyZSB3aWxsIGJlIChhcyBwYXJ0IG9mIHRoZSBDIGxpYnJhcnkgb3IgcGVyaGFwcyBhcworIyBwYXJ0IG9mIGxpYmliZXJ0eSkgYSBQT1NJWCBpbnRlcmZhY2UuICBCdXQgYXQgbGVhc3QgZm9yIG5vdyB0aGUKKyMgaG9zdC1kZXBlbmRlbnQgbWFrZWZpbGUgZnJhZ21lbnQgbWlnaHQgbmVlZCB0byB1c2Ugc29tZXRoaW5nIGVsc2UKKyMgYmVzaWRlcyBzZXItdW5peC5vCitTRVJfSEFSRFdJUkUgPSBzZXItdW5peC5vCisKKyMgVGhlIGByZW1vdGUnIGRlYnVnZ2luZyB0YXJnZXQgaXMgc3VwcG9ydGVkIGZvciBtb3N0IGFyY2hpdGVjdHVyZXMsCisjIGJ1dCBub3QgYWxsIChlLmcuIDk2MCkKK1JFTU9URV9PQlMgPSByZW1vdGUubyBkY2FjaGUubyByZW1vdGUtdXRpbHMubyB0cmFjZXBvaW50Lm8gYXgtZ2VuZXJhbC5vIGF4LWdkYi5vCisKKyMgVGhpcyBpcyByZW1vdGUtc2ltLm8gaWYgYSBzaW11bGF0b3IgaXMgdG8gYmUgbGlua2VkIGluLgorU0lNX09CUyA9CisKK0FOTk9UQVRFX09CUyA9IGFubm90YXRlLm8KKworIyBIb3N0IGFuZCB0YXJnZXQtZGVwZW5kZW50IG1ha2VmaWxlIGZyYWdtZW50cyBjb21lIGluIGhlcmUuCitAaG9zdF9tYWtlZmlsZV9mcmFnQAorQHRhcmdldF9tYWtlZmlsZV9mcmFnQAorIyBFbmQgb2YgaG9zdCBhbmQgdGFyZ2V0LWRlcGVuZGVudCBtYWtlZmlsZSBmcmFnbWVudHMKKworRkxBR1NfVE9fUEFTUyA9IFwKKwkicHJlZml4PSQocHJlZml4KSIgXAorCSJleGVjX3ByZWZpeD0kKGV4ZWNfcHJlZml4KSIgXAorCSJhZ2FpbnN0PSQoYWdhaW5zdCkiIFwKKwkiQVI9JChBUikiIFwKKwkiQVJfRkxBR1M9JChBUl9GTEFHUykiIFwKKwkiQ0M9JChDQykiIFwKKwkiQ0ZMQUdTPSQoQ0ZMQUdTKSIgXAorCSJDSElMTEZMQUdTPSQoQ0hJTExGTEFHUykiIFwKKwkiQ0hJTEw9JChDSElMTCkiIFwKKwkiQ0hJTExfTElCPSQoQ0hJTExfTElCKSIgXAorCSJDWFg9JChDWFgpIiBcCisJIkNYWEZMQUdTPSQoQ1hYRkxBR1MpIiBcCisJIkRMTFRPT0w9JChETExUT09MKSIgXAorCSJSQU5MSUI9JChSQU5MSUIpIiBcCisJIk1BS0VJTkZPPSQoTUFLRUlORk8pIiBcCisJIklOU1RBTEw9JChJTlNUQUxMKSIgXAorCSJJTlNUQUxMX1BST0dSQU09JChJTlNUQUxMX1BST0dSQU0pIiBcCisJIklOU1RBTExfREFUQT0kKElOU1RBTExfREFUQSkiIFwKKwkiUlVOVEVTVD0kKFJVTlRFU1QpIiBcCisJIlJVTlRFU1RGTEFHUz0kKFJVTlRFU1RGTEFHUykiCisKKyMgRmxhZ3MgdGhhdCB3ZSBwYXNzIHdoZW4gYnVpbGRpbmcgdGhlIHRlc3RzdWl0ZS4KKworIyBlbXB0eSBmb3IgbmF0aXZlLCAkKHRhcmdldF9hbGlhcykvIGZvciBjcm9zcwordGFyZ2V0X3N1YmRpciA9IEB0YXJnZXRfc3ViZGlyQAorCitDQ19GT1JfVEFSR0VUID0gYCBcCisgIGlmIFsgLWYgJCR7cm9vdG1lfS8uLi9nY2MveGdjYyBdIDsgdGhlbiBcCisgICAgaWYgWyAtZiAkJHtyb290bWV9Ly4uLyQodGFyZ2V0X3N1YmRpciluZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAorICAgICAgZWNobyAkJHtyb290bWV9Ly4uL2djYy94Z2NjIC1CJCR7cm9vdG1lfS8uLi9nY2MvIC1pZGlyYWZ0ZXIgJCR7cm9vdG1lfS8kKHRhcmdldF9zdWJkaXIpbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQke3Jvb3RzcmN9Ly4uLyQodGFyZ2V0X3N1YmRpciluZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYyAtQiQke3Jvb3RtZX0vLi4vJCh0YXJnZXRfc3ViZGlyKW5ld2xpYi87IFwKKyAgICBlbHNlIFwKKyAgICAgIGVjaG8gJCR7cm9vdG1lfS8uLi9nY2MveGdjYyAtQiQke3Jvb3RtZX0vLi4vZ2NjLzsgXAorICAgIGZpOyBcCisgIGVsc2UgXAorICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCisgICAgICBlY2hvICQoQ0MpOyBcCisgICAgZWxzZSBcCisgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBnY2MgfCBzZWQgLWUgJycgJCR0OyBcCisgICAgZmk7IFwKKyAgZmlgCisKK0NYWCA9IGdjYworQ1hYX0ZPUl9UQVJHRVQgPSBgIFwKKyAgaWYgWyAtZiAkJHtyb290bWV9Ly4uL2djYy94Z2NjIF0gOyB0aGVuIFwKKyAgICBpZiBbIC1mICQke3Jvb3RtZX0vLi4vJCh0YXJnZXRfc3ViZGlyKW5ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCisgICAgICBlY2hvICQke3Jvb3RtZX0vLi4vZ2NjL3hnY2MgLUIkJHtyb290bWV9Ly4uL2djYy8gLWlkaXJhZnRlciAkJHtyb290bWV9LyQodGFyZ2V0X3N1YmRpciluZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCR7cm9vdHNyY30vLi4vJCh0YXJnZXRfc3ViZGlyKW5ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jIC1CJCR7cm9vdG1lfS8uLi8kKHRhcmdldF9zdWJkaXIpbmV3bGliLzsgXAorICAgIGVsc2UgXAorICAgICAgZWNobyAkJHtyb290bWV9Ly4uL2djYy94Z2NjIC1CJCR7cm9vdG1lfS8uLi9nY2MvOyBcCisgICAgZmk7IFwKKyAgZWxzZSBcCisgICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKKyAgICAgIGVjaG8gJChDWFgpOyBcCisgICAgZWxzZSBcCisgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBnY2MgfCBzZWQgLWUgJycgJCR0OyBcCisgICAgZmk7IFwKKyAgZmlgCisKK0NISUxMRkxBR1MgPSAkKENGTEFHUykKK0NISUxMID0gZ2NjCitDSElMTF9GT1JfVEFSR0VUID0gYCBcCisgIGlmIFsgLWYgJCR7cm9vdG1lfS8uLi9nY2MvTWFrZWZpbGUgXSA7IHRoZW4gXAorICAgIGVjaG8gJCR7cm9vdG1lfS8uLi9nY2MveGdjYyAtQiQke3Jvb3RtZX0vLi4vZ2NjLyAtTCQke3Jvb3RtZX0vLi4vZ2NjL2NoL3J1bnRpbWUvOyBcCisgIGVsc2UgXAorICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCisgICAgICBlY2hvICQoQ0MpOyBcCisgICAgZWxzZSBcCisgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBnY2MgfCBzZWQgLWUgJycgJCR0OyBcCisgICAgZmk7IFwKKyAgZmlgCitDSElMTF9MSUIgPSBgIFwKKyAgaWYgWyAtZiAkJHtyb290bWV9Ly4uL2djYy9jaC9ydW50aW1lL2xpYmNoaWxsLmEgXSA7IHRoZW4gXAorICAgIGVjaG8gJCR7cm9vdG1lfS8uLi9nY2MvY2gvcnVudGltZS9jaGlsbHJ0MC5vIFwKKyAgICAgICQke3Jvb3RtZX0vLi4vZ2NjL2NoL3J1bnRpbWUvbGliY2hpbGwuYTsgXAorICBlbHNlIFwKKyAgICAgIGVjaG8gLWxjaGlsbDsgXAorICBmaWAKKworIyBUaGUgdXNlIG9mICQkKHhfRk9SX1RBUkdFVCkgcmVkdWNlcyB0aGUgY29tbWFuZCBsaW5lIGxlbmd0aCBieSBub3QKKyMgZHVwbGljYXRpbmcgdGhlIGxlbmd0aHkgZGVmaW5pdGlvbi4KK1RBUkdFVF9GTEFHU19UT19QQVNTID0gXAorCSJwcmVmaXg9JChwcmVmaXgpIiBcCisJImV4ZWNfcHJlZml4PSQoZXhlY19wcmVmaXgpIiBcCisJImFnYWluc3Q9JChhZ2FpbnN0KSIgXAorCSdDQz0kJChDQ19GT1JfVEFSR0VUKScgXAorCSJDQ19GT1JfVEFSR0VUPSQoQ0NfRk9SX1RBUkdFVCkiIFwKKwkiQ0ZMQUdTPSQoQ0ZMQUdTKSIgXAorCSJDSElMTEZMQUdTPSQoQ0hJTExGTEFHUykiIFwKKwknQ0hJTEw9JCQoQ0hJTExfRk9SX1RBUkdFVCknIFwKKwkiQ0hJTExfRk9SX1RBUkdFVD0kKENISUxMX0ZPUl9UQVJHRVQpIiBcCisJIkNISUxMX0xJQj0kKENISUxMX0xJQikiIFwKKwknQ1hYPSQkKENYWF9GT1JfVEFSR0VUKScgXAorCSJDWFhfRk9SX1RBUkdFVD0kKENYWF9GT1JfVEFSR0VUKSIgXAorCSJDWFhGTEFHUz0kKENYWEZMQUdTKSIgXAorCSJJTlNUQUxMPSQoSU5TVEFMTCkiIFwKKwkiSU5TVEFMTF9QUk9HUkFNPSQoSU5TVEFMTF9QUk9HUkFNKSIgXAorCSJJTlNUQUxMX0RBVEE9JChJTlNUQUxMX0RBVEEpIiBcCisJIk1BS0VJTkZPPSQoTUFLRUlORk8pIiBcCisJIlJVTlRFU1Q9JChSVU5URVNUKSIgXAorCSJSVU5URVNURkxBR1M9JChSVU5URVNURkxBR1MpIgorCisjIEFsbCBzb3VyY2UgZmlsZXMgdGhhdCBnbyBpbnRvIGxpbmtpbmcgR0RCLgorIyBMaW5rcyBtYWRlIGF0IGNvbmZpZ3VyYXRpb24gdGltZSBzaG91bGQgbm90IGJlIHNwZWNpZmllZCBoZXJlLCBzaW5jZQorIyBTRklMRVMgaXMgdXNlZCBpbiBidWlsZGluZyB0aGUgZGlzdHJpYnV0aW9uIGFyY2hpdmUuCisKK1NGSUxFUyA9IGF4LWdlbmVyYWwuYyBheC1nZGIuYyBiY2FjaGUuYyBibG9ja2ZyYW1lLmMgYnJlYWtwb2ludC5jIFwKKwlidWlsZHN5bS5jIGMtZXhwLnkgYy1sYW5nLmMgYy10eXBlcHJpbnQuYyBjLXZhbHByaW50LmMgXAorCWNoLWV4cC5jIGNoLWxhbmcuYyBjaC10eXBlcHJpbnQuYyBjaC12YWxwcmludC5jIGNvZmZyZWFkLmMgXAorCWNvbW1hbmQuYyBjb21wbGFpbnRzLmMgY29yZWZpbGUuYyBjcC12YWxwcmludC5jIGRieHJlYWQuYyBcCisJZGVtYW5nbGUuYyBkd2FyZnJlYWQuYyBkd2FyZjJyZWFkLmMgZWxmcmVhZC5jIGVudmlyb24uYyBldmFsLmMgXAorCWV4cHByaW50LmMgZi1leHAueSBmLWxhbmcuYyBmLXR5cGVwcmludC5jIGYtdmFscHJpbnQuYyBcCisJZmluZHZhci5jIGdkYmFyY2guYyBnZGJ0eXBlcy5jIGluZmNtZC5jIGluZmxvdy5jIGluZnJ1bi5jIGxhbmd1YWdlLmMgXAorCWp2LWV4cC55IGp2LWxhbmcuYyBqdi12YWxwcmludC5jIGp2LXR5cGVwcmludC5jIFwKKwltMi1leHAueSBtMi1sYW5nLmMgbTItdHlwZXByaW50LmMgbTItdmFscHJpbnQuYyBtYWluLmMgbWFpbnQuYyBcCisJbWVtLWJyZWFrLmMgbWluc3ltcy5jIG1pcHNyZWFkLmMgbmxtcmVhZC5jIG9iamZpbGVzLmMgcGFyc2UuYyBcCisJcHJpbnRjbWQuYyByZW1vdGUuYyByZW1vdGUtbnJvbS5jIHNjbS1leHAuYyBzY20tbGFuZy5jIFwKKwlzY20tdmFscHJpbnQuYyBzb3VyY2UuYyBzdGFic3JlYWQuYyBzdGFjay5jIHN5bWZpbGUuYyBcCisJc3ltbWlzYy5jIHN5bXRhYi5jIHRhcmdldC5jIHRocmVhZC5jIHRvcC5jIHRyYWNlcG9pbnQuYyBcCisJdHlwZXByaW50LmMgdXRpbHMuYyB2YWxhcml0aC5jIHZhbG9wcy5jIHZhbHByaW50LmMgdmFsdWVzLmMgXAorCXNlcmlhbC5jIHNlci11bml4LmMgbWRlYnVncmVhZC5jIG9zOWtyZWFkLmMgXAorCXR1aS90dWkuYyB0dWkvdHVpLmggdHVpL3R1aUNvbW1hbmQuYyB0dWkvdHVpQ29tbWFuZC5oIFwKKwl0dWkvdHVpRGF0YS5jIHR1aS90dWlEYXRhLmggdHVpL3R1aURhdGFXaW4uYyB0dWkvdHVpRGF0YVdpbi5oIFwKKwl0dWkvdHVpRGlzYXNzZW0uYyB0dWkvdHVpRGlzYXNzZW0uaCB0dWkvdHVpR2VuZXJhbFdpbi5jIFwKKwl0dWkvdHVpR2VuZXJhbFdpbi5oIHR1aS90dWlJTy5jIHR1aS90dWlJTy5oIHR1aS90dWlMYXlvdXQuYyBcCisJdHVpL3R1aUxheW91dC5oIHR1aS90dWlSZWdzLmMgdHVpL3R1aVJlZ3MuaCB0dWkvdHVpU291cmNlLmMgXAorCXR1aS90dWlTb3VyY2UuaCB0dWkvdHVpU291cmNlV2luLmMgdHVpL3R1aVNvdXJjZVdpbi5oIFwKKwl0dWkvdHVpU3RhY2suYyB0dWkvdHVpU3RhY2suaCB0dWkvdHVpV2luLmMgdHVpL3R1aVdpbi5oCisKK0xJTlRGSUxFUyA9ICQoU0ZJTEVTKSAkKFlZRklMRVMpIEBDT05GSUdfU1JDU0AgaW5pdC5jCisKKyMgInN5c3RlbSIgaGVhZGVycy4gIFVzaW5nIHRoZXNlIGluIGRlcGVuZGVuY2llcyBpcyBhIHJhdGhlciBwZXJzb25hbAorIyBjaG9pY2UuICgtcmljaCwgc3VtbWVyIDE5OTMpCisjIChXaHkgd291bGQgd2Ugbm90IHdhbnQgdG8gZGVwZW5kIG9uIHRoZW0/ICBJZiBvbmUgb2YgdGhlc2UgY2hhbmdlcyBpbiBhIAorIyBub24tYmluYXJ5LWNvbXBhdGlibGUgd2F5LCBpdCBpcyBhIHJlYWwgcGFpbiB0byByZW1ha2UgdGhlIHJpZ2h0IHN0dWZmCisjIHdpdGhvdXQgdGhlc2UgZGVwZW5kZW5jaWVzIC1raW5nZG9uLCAxMyBNYXIgMTk5NCkKK2dldG9wdF9oID0JJChJTkNMVURFX0RJUikvZ2V0b3B0LmgKK2Zsb2F0Zm9ybWF0X2ggPQkkKElOQ0xVREVfRElSKS9mbG9hdGZvcm1hdC5oCitiZmRfaCA9CQkkKEJGRF9ESVIpL2JmZC5oCit3YWl0X2ggPQkkKElOQ0xVREVfRElSKS93YWl0LmgKK2Rpcy1hc21faCA9CSQoSU5DTFVERV9ESVIpL2Rpcy1hc20uaCAKK3JlbW90ZS1zaW1faCA9CSQoSU5DTFVERV9ESVIpL3JlbW90ZS1zaW0uaAorCitkY2FjaGVfaCA9IGRjYWNoZS5oCityZW1vdGVfdXRpbHNfaCA9ICQoZGNhY2hlX2gpIHNlcmlhbC5oIHRhcmdldC5oIHJlbW90ZS11dGlscy5oICQocmVtb3RlLXNpbV9oKQorCisKK3JlYWRsaW5lX2hlYWRlcnMgPSBcCisJJChSRUFETElORV9TUkMpL2NoYXJkZWZzLmggXAorCSQoUkVBRExJTkVfU1JDKS9oaXN0b3J5LmggXAorCSQoUkVBRExJTkVfU1JDKS9rZXltYXBzLmggXAorCSQoUkVBRExJTkVfU1JDKS9yZWFkbGluZS5oCisKK3VkaWhlYWRlcnMgPSBcCisJJChzcmNkaXIpLzI5ay1zaGFyZS91ZGkvdWRpcHJvYy5oIFwKKwkkKHNyY2RpcikvMjlrLXNoYXJlL3VkaS91ZGlwaGNmZy5oIFwKKwkkKHNyY2RpcikvMjlrLXNoYXJlL3VkaS91ZGlwaHVuaXguaCBcCisJJChzcmNkaXIpLzI5ay1zaGFyZS91ZGkvdWRpcHRjZmcuaCBcCisJJChzcmNkaXIpLzI5ay1zaGFyZS91ZGkvdWRpcHQyOWsuaCBcCisJJChzcmNkaXIpLzI5ay1zaGFyZS91ZGkvdWRpc29jLmgKKworZ2RiY29yZV9oID0JZ2RiY29yZS5oICQoYmZkX2gpCisKK2ZyYW1lX2ggPQlmcmFtZS5oCitzeW10YWJfaCA9CXN5bXRhYi5oIGJjYWNoZS5oCitnZGJ0eXBlc19oID0JZ2RidHlwZXMuaAorZXhwcmVzc2lvbl9oID0JZXhwcmVzc2lvbi5oCit2YWx1ZV9oID0JdmFsdWUuaCAkKHN5bXRhYl9oKSAkKGdkYnR5cGVzX2gpICQoZXhwcmVzc2lvbl9oKQorCiticmVha3BvaW50X2ggPQlicmVha3BvaW50LmggJChmcmFtZV9oKSAkKHZhbHVlX2gpCisKK2NvbW1hbmRfaCA9CWNvbW1hbmQuaAorZ2RiY21kX2ggPQlnZGJjbWQuaCAkKGNvbW1hbmRfaCkKKworZGVmc19oID0JZGVmcy5oIHhtLmggdG0uaCBubS5oIGNvbmZpZy5zdGF0dXMgY29uZmlnLmggZ2RiYXJjaC5oCisKK2luZmVyaW9yX2ggPQlpbmZlcmlvci5oICQoYnJlYWtwb2ludF9oKQordHJhY2Vwb2ludF9oID0JdHJhY2Vwb2ludC5oCitheF9oID0gCQlheC5oCisKKyMgSGVhZGVyIGZpbGVzIHRoYXQgbmVlZCB0byBoYXZlIHNyY2RpciBhZGRlZC4gIE5vdGUgdGhhdCBpbiB0aGUgY2FzZXMKKyMgd2hlcmUgd2UgdXNlIGEgbWFjcm8gbGlrZSAkKGdkYmNtZF9oKSwgdGhpbmdzIGFyZSBjYXJlZnVsbHkgYXJyYW5nZWQKKyMgc28gdGhhdCBlYWNoIC5oIGZpbGUgaXMgbGlzdGVkIGV4YWN0bHkgb25jZSAoTS14IHRhZ3Mtc2VhcmNoIHdvcmtzCisjIHdyb25nIGlmIFRBR1MgaGFzIGZpbGVzIHR3aWNlKS4gIEJlY2F1c2UgdGhpcyBpcyB0cmlja3kgdG8gZ2V0CisjIHJpZ2h0LCBpdCBpcyBwcm9iYWJseSBlYXNpZXN0IGp1c3QgdG8gbGlzdCAuaCBmaWxlcyBoZXJlIGRpcmVjdGx5LgorCitIRklMRVNfTk9fU1JDRElSID0gYmNhY2hlLmggYnVpbGRzeW0uaCBjYWxsLWNtZHMuaCBjb2ZmLXNvbGliLmggZGVmcy5oIFwKKwlkc3QuaCBlbnZpcm9uLmggJChnZGJjbWRfaCkgZ2RiY29yZS5oIFwKKwlnZGItc3RhYnMuaCBocHJlYWQuaCAkKGluZmVyaW9yX2gpIGxhbmd1YWdlLmggbWluaW1vbi5oIG1vbml0b3IuaCBcCisJb2JqZmlsZXMuaCBwYXJzZXItZGVmcy5oIHBhcnRpYWwtc3RhYi5oIHNlcmlhbC5oIHNpZ25hbHMuaCBzb2xpYi5oIFwKKwlzeW1maWxlLmggc3RhYnNyZWFkLmggdGFyZ2V0LmggdGVybWluYWwuaCB0eXBlcHJpbnQuaCB4Y29mZnNvbGliLmggXAorCWMtbGFuZy5oIGNoLWxhbmcuaCBmLWxhbmcuaCBcCisJanYtbGFuZy5oIFwKKwltMi1sYW5nLmggXAorCWNvbXBsYWludHMuaCB2YWxwcmludC5oIFwKKwkyOWstc2hhcmUvdWRpL3VkaWlkcy5oIDI5ay1zaGFyZS91ZGlfc29jIG5pbmR5LXNoYXJlL2Iub3V0LmggXAorCW5pbmR5LXNoYXJlL2Jsb2NrX2lvLmggbmluZHktc2hhcmUvY29mZi5oIFwKKwluaW5keS1zaGFyZS9lbnYuaCBuaW5keS1zaGFyZS9zdG9wLmggXAorCXZ4LXNoYXJlL2RiZ1JwY0xpYi5oIHZ4LXNoYXJlL3B0cmFjZS5oIHZ4LXNoYXJlL3Z4VHlwZXMuaCBcCisJdngtc2hhcmUvdnhXb3Jrcy5oIHZ4LXNoYXJlL3dhaXQuaCB2eC1zaGFyZS94ZHJfbGQuaCBcCisJdngtc2hhcmUveGRyX3B0cmFjZS5oIHZ4LXNoYXJlL3hkcl9yZGIuaCBnZGJ0aHJlYWQuaCBcCisJZGNhY2hlLmggcmVtb3RlLXV0aWxzLmggdG9wLmggc29tc29saWIuaAorCisjIEhlYWRlciBmaWxlcyB0aGF0IGFscmVhZHkgaGF2ZSBzcmNkaXIgaW4gdGhlbSwgb3Igd2hpY2ggYXJlIGluIG9iamRpci4KKworSEZJTEVTX1dJVEhfU1JDRElSID0gJCh1ZGloZWFkZXJzKSAuLi9iZmQvYmZkLmgKKworCisjIEdEQiAiaW5mbyIgZmlsZXMsIHdoaWNoIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGVpciBlbnRpcmV0eQorSU5GT0ZJTEVTID0gZ2RiLmluZm8qCisKK1JFTU9URV9FWEFNUExFUyA9IG02OGstc3R1Yi5jIGkzODYtc3R1Yi5jIHNwYXJjLXN0dWIuYyByZW0tbXVsdGkuc2hhcgorCitQT1NTTElCUyA9IGdudS1yZWdleC5jIGdudS1yZWdleC5oCisKKyMge1gsVCxOQVR9REVQRklMRVMgYXJlIHNvbWV0aGluZyBvZiBhIHBhaW4gaW4gdGhhdCBpdCdzIGhhcmQgdG8KKyMgZGVmYXVsdCB0aGVpciB2YWx1ZXMgdGhlIHdheSB3ZSBkbyBmb3IgU0VSX0hBUkRXSVJFOyBpbiB0aGUgZnV0dXJlCisjIG1heWJlIG11Y2ggb2YgdGhlIHN0dWZmIG5vdyBpbiB7WCxULE5BVH1ERVBGSUxFUyB3aWxsIGdvIGludG8gb3RoZXIKKyMgdmFyaWFibGVzIGFuYWxvZ291cyB0byBTRVJfSEFSRFdJUkUgd2hpY2ggZ2V0IGRlZmF1bHRlZCBpbiB0aGlzCisjIE1ha2VmaWxlLmluCisKK0RFUEZJTEVTID0gJChUREVQRklMRVMpICQoWERFUEZJTEVTKSAkKFNFUl9IQVJEV0lSRSkgJChOQVRERVBGSUxFUykgXAorCSAgICQoUkVNT1RFX09CUykgJChTSU1fT0JTKSBAQ09ORklHX09CU0AKKworU09VUkNFUyA9ICQoU0ZJTEVTKSAkKEFMTERFUEZJTEVTKSAkKFlZRklMRVMpIEBDT05GSUdfU1JDU0AKKyMgRG9uJ3QgaW5jbHVkZSBZWUZJTEVTICgqLnRhYi5jKSBiZWNhdXNlIHdlIGFscmVhZHkgaW5jbHVkZSAqLnkgaW4gU0ZJTEVTLAorIyBhbmQgaXQncyBtb3JlIHVzZWZ1bCB0byBzZWUgaXQgaW4gdGhlIC55IGZpbGUuCitUQUdGSUxFU19OT19TUkNESVIgPSAkKFNGSUxFUykgJChIRklMRVNfTk9fU1JDRElSKSAkKEFMTERFUEZJTEVTKSBcCisJJChQT1NTTElCUykKK1RBR0ZJTEVTX1dJVEhfU1JDRElSID0gJChIRklMRVNfV0lUSF9TUkNESVIpCisKK0NPTU1PTl9PQlMgPSB2ZXJzaW9uLm8gYmxvY2tmcmFtZS5vIGJyZWFrcG9pbnQubyBmaW5kdmFyLm8gc3RhY2subyB0aHJlYWQubyBcCisJc291cmNlLm8gdmFsdWVzLm8gZXZhbC5vIHZhbG9wcy5vIHZhbGFyaXRoLm8gdmFscHJpbnQubyBwcmludGNtZC5vIFwKKwlzeW10YWIubyBzeW1maWxlLm8gc3ltbWlzYy5vIGluZmNtZC5vIGluZnJ1bi5vIGNvbW1hbmQubyBcCisJZXhwcHJpbnQubyBlbnZpcm9uLm8gZ2RiYXJjaC5vIGdkYnR5cGVzLm8gY29weWluZy5vICQoREVQRklMRVMpIFwKKwltZW0tYnJlYWsubyB0YXJnZXQubyBwYXJzZS5vIGxhbmd1YWdlLm8gJChZWU9CSikgYnVpbGRzeW0ubyBcCisJZXhlYy5vIGJjYWNoZS5vIG9iamZpbGVzLm8gbWluc3ltcy5vIG1haW50Lm8gZGVtYW5nbGUubyBcCisJZGJ4cmVhZC5vIGNvZmZyZWFkLm8gZWxmcmVhZC5vIFwKKwlkd2FyZnJlYWQubyBkd2FyZjJyZWFkLm8gbWlwc3JlYWQubyBzdGFic3JlYWQubyBjb3JlZmlsZS5vIFwKKwljLWxhbmcubyBjaC1leHAubyBjaC1sYW5nLm8gZi1sYW5nLm8gXAorCWp2LWxhbmcubyBqdi12YWxwcmludC5vIGp2LXR5cGVwcmludC5vIFwKKwltMi1sYW5nLm8gXAorCXNjbS1leHAubyBzY20tbGFuZy5vIHNjbS12YWxwcmludC5vIGNvbXBsYWludHMubyB0eXBlcHJpbnQubyBcCisJYy10eXBlcHJpbnQubyBjaC10eXBlcHJpbnQubyBmLXR5cGVwcmludC5vIG0yLXR5cGVwcmludC5vIFwKKwljLXZhbHByaW50Lm8gY3AtdmFscHJpbnQubyBjaC12YWxwcmludC5vIGYtdmFscHJpbnQubyBtMi12YWxwcmludC5vIFwKKwlubG1yZWFkLm8gc2VyaWFsLm8gbWRlYnVncmVhZC5vIG9zOWtyZWFkLm8gdG9wLm8gdXRpbHMubworCitPQlMgPSAkKENPTU1PTl9PQlMpICQoQU5OT1RBVEVfT0JTKSBtYWluLm8KKworTElCR0RCX09CUyA9IAorCitUU09CUyA9IGluZmxvdy5vCisKK05UU09CUyA9IHN0YW5kYWxvbmUubworCitOVFNTVEFSVCA9IGtkYi1zdGFydC5vCisKK1NVQkRJUlMgPSBkb2MgXAorCXRlc3RzdWl0ZSBcCisJbmxtCisKKyMgRm9yIG5vdywgc2hvcnRjdXQgdGhlICJjb25maWd1cmUgR0RCIGZvciBmZXdlciBsYW5ndWFnZXMiIHN0dWZmLgorWVlGSUxFUyA9IGMtZXhwLnRhYi5jIFwKKwlqdi1leHAudGFiLmMgXAorCWYtZXhwLnRhYi5jIG0yLWV4cC50YWIuYworWVlPQkogPSBjLWV4cC50YWIubyBcCisJanYtZXhwLnRhYi5vIFwKKwlmLWV4cC50YWIubyBtMi1leHAudGFiLm8KKworIyBUaGluZ3Mgd2hpY2ggbmVlZCB0byBiZSBidWlsdCB3aGVuIG1ha2luZyBhIGRpc3RyaWJ1dGlvbi4KKworRElTVFNUVUZGID0gJChZWUZJTEVTKQorCisjIFByZXZlbnQgU3VuIG1ha2UgZnJvbSBwdXR0aW5nIGluIHRoZSBtYWNoaW5lIHR5cGUuICBTZXR0aW5nCisjIFRBUkdFVF9BUkNIIHRvIG5vdGhpbmcgd29ya3MgZm9yIFN1bk9TIDMsIDQuMCwgYnV0IG5vdCBmb3IgNC4xLgorLmMubzoKKwkkKENDKSAtYyAkKElOVEVSTkFMX0NGTEFHUykgJDwKKworYWxsOiBnZGIkKEVYRUVYVCkKKwlAJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIERPPWFsbCAiRE9ESVJTPWBlY2hvICQoU1VCRElSUykgfCBzZWQgJ3MvdGVzdHN1aXRlLy8nYCIgc3ViZGlyX2RvCisKK2luc3RhbGxjaGVjazoKKworIyBUaGUgY2hlY2sgdGFyZ2V0IGNhbiBub3QgdXNlIHN1YmRpcl9kbywgYmVjYXVzZSBzdWJkaXJfZG8gZG9lcyBub3QKKyMgdXNlIFRBUkdFVF9GTEFHU19UT19QQVNTLgorY2hlY2s6IGZvcmNlCisJQGlmIFsgLWYgdGVzdHN1aXRlL01ha2VmaWxlIF07IHRoZW4gXAorCSAgcm9vdG1lPWBwd2RgOyBleHBvcnQgcm9vdG1lOyBcCisJICByb290c3JjPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCByb290c3JjOyBcCisJICBjZCB0ZXN0c3VpdGU7IFwKKwkgICQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykgY2hlY2s7IFwKKwllbHNlIHRydWU7IGZpCisKK2luZm8gZHZpIGluc3RhbGwtaW5mbyBjbGVhbi1pbmZvOiBmb3JjZQorCUAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgRE89JEAgIkRPRElSUz0kKFNVQkRJUlMpIiBzdWJkaXJfZG8KKworZ2RiLno6Z2RiLjEKKwlucm9mZiAtbWFuICQoc3JjZGlyKS9nZGIuMSB8IGNvbCAtYiA+IGdkYi50IAorCXBhY2sgZ2RiLnQgOyBybSAtZiBnZGIudAorCW12IGdkYi50LnogZ2RiLnoKKworIyBUcmFkaXRpb25hbGx5ICJpbnN0YWxsIiBkZXBlbmRzIG9uICJhbGwiLiAgQnV0IGl0IG1heSBiZSB1c2VmdWwKKyMgbm90IHRvOyBmb3IgZXhhbXBsZSwgaWYgdGhlIHVzZXIgaGFzIG1hZGUgc29tZSB0cml2aWFsIGNoYW5nZSB0byBhIAorIyBzb3VyY2UgZmlsZSBhbmQgZG9lc24ndCBjYXJlIGFib3V0IHJlYnVpbGRpbmcgb3IganVzdCB3YW50cyB0byBzYXZlIHRoZQorIyB0aW1lIGl0IHRha2VzIGZvciBtYWtlIHRvIGNoZWNrIHRoYXQgYWxsIGlzIHVwIHRvIGRhdGUuCisjIGluc3RhbGwtb25seSBpcyBpbnRlbmRlZCB0byBhZGRyZXNzIHRoYXQgbmVlZC4KK2luc3RhbGw6IGFsbCBpbnN0YWxsLW9ubHkKK2luc3RhbGwtb25seToKKwl0cmFuc2Zvcm1lZF9uYW1lPWB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgXAorCQkJICBlY2hvIGdkYiB8IHNlZCAtZSAkJHRgIDsgXAorCQlpZiB0ZXN0ICJ4JCR0cmFuc2Zvcm1lZF9uYW1lIiA9IHg7IHRoZW4gXAorCQkgIHRyYW5zZm9ybWVkX25hbWU9Z2RiIDsgXAorCQllbHNlIFwKKwkJICB0cnVlIDsgXAorCQlmaSA7IFwKKwkJJChJTlNUQUxMX1BST0dSQU0pIGdkYiQoRVhFRVhUKSAkKGJpbmRpcikvJCR0cmFuc2Zvcm1lZF9uYW1lJChFWEVFWFQpIDsgXAorCQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2dkYi4xICQobWFuMWRpcikvJCR0cmFuc2Zvcm1lZF9uYW1lLjEKKwlAJChNQUtFKSBETz1pbnN0YWxsICJET0RJUlM9JChTVUJESVJTKSIgJChGTEFHU19UT19QQVNTKSBzdWJkaXJfZG8gCisKK3VuaW5zdGFsbDogZm9yY2UKKwl0cmFuc2Zvcm1lZF9uYW1lPWB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgXAorCQkJICBlY2hvIGdkYiB8IHNlZCAtZSAkJHRgIDsgXAorCQlpZiB0ZXN0ICJ4JCR0cmFuc2Zvcm1lZF9uYW1lIiA9IHg7IHRoZW4gXAorCQkgIHRyYW5zZm9ybWVkX25hbWU9Z2RiIDsgXAorCQllbHNlIFwKKwkJICB0cnVlIDsgXAorCQlmaSA7IFwKKwkJcm0gLWYgJChiaW5kaXIpLyQkdHJhbnNmb3JtZWRfbmFtZSQoRVhFRVhUKSAkKG1hbjFkaXIpLyQkdHJhbnNmb3JtZWRfbmFtZS4xCisJQCQoTUFLRSkgRE89dW5pbnN0YWxsICJET0RJUlM9JChTVUJESVJTKSIgJChGTEFHU19UT19QQVNTKSBzdWJkaXJfZG8gCisKKyMgV2UgZG8gdGhpcyBieSBncmVwcGluZyB0aHJvdWdoIHNvdXJjZXMuICBJZiB0aGF0IHR1cm5zIG91dCB0byBiZSB0b28gc2xvdywKKyMgbWF5YmUgd2UgY291bGQganVzdCByZXF1aXJlIGV2ZXJ5IC5vIGZpbGUgdG8gaGF2ZSBhbiBpbml0aWFsaXphdGlvbiByb3V0aW5lCisjIG9mIGEgZ2l2ZW4gbmFtZSAocmVtb3RlLXVkaS5vIC0+IF9pbml0aWFsaXplX3JlbW90ZV91ZGksIGV0Yy4pLgorIworIyBGb3JtYXR0aW5nIGNvbnZlbnRpb25zOiAgVGhlIG5hbWUgb2YgdGhlIF9pbml0aWFsaXplXyogcm91dGluZXMgbXVzdCBzdGFydAorIyBpbiBjb2x1bW4gemVybywgYW5kIG11c3Qgbm90IGJlIGluc2lkZSAjaWYuCisjCisjIE5vdGUgdGhhdCB0aGUgc2V0IG9mIGZpbGVzIHdpdGggaW5pdCBmdW5jdGlvbnMgbWlnaHQgY2hhbmdlLCBvciB0aGUgbmFtZXMKKyMgb2YgdGhlIGZ1bmN0aW9ucyBtaWdodCBjaGFuZ2UsIHNvIHRoaXMgZmlsZXMgbmVlZHMgdG8gZGVwZW5kIG9uIGFsbCB0aGUKKyMgb2JqZWN0IGZpbGVzIHRoYXQgd2lsbCBiZSBsaW5rZWQgaW50byBnZGIuCisKK2luaXQuYzogJChPQlMpICQoVFNPQlMpCisJQGVjaG8gTWFraW5nIGluaXQuYworCUBybSAtZiBpbml0LmMtdG1wCisJQGVjaG8gJy8qIERvIG5vdCBtb2RpZnkgdGhpcyBmaWxlLiAgKi8nID5pbml0LmMtdG1wCisJQGVjaG8gJy8qIEl0IGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgTWFrZWZpbGUuICAqLyc+PmluaXQuYy10bXAKKwlAZWNobyAnI2luY2x1ZGUgImFuc2lkZWNsLmgiJyA+PmluaXQuYy10bXAKKwlAZWNobyAnZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV9hbGxfZmlsZXMgUEFSQU1TICgodm9pZCkpOycgPj5pbml0LmMtdG1wCisJQGVjaG8gJ3ZvaWQgaW5pdGlhbGl6ZV9hbGxfZmlsZXMgUEFSQU1TICgodm9pZCkpIHsnID4+aW5pdC5jLXRtcAorCUAtZWNobyAkKE9CUykgJChUU09CUykgfCBcCisJdHIgJyAnICdcMDEyJyB8IFwKKwlzZWQgLWUgJy9eT25pbmR5Lm8vZCcgXAorCSAgICAtZSAnL15uaW5keS5vL2QnIFwKKwkgICAgLWUgJy90dHlmbHVzaC5vL2QnIFwKKwkgICAgLWUgJy94ZHJfbGQuby9kJyBcCisJICAgIC1lICcveGRyX3B0cmFjZS5vL2QnIFwKKwkgICAgLWUgJy94ZHJfcmRiLm8vZCcgXAorCSAgICAtZSAnL3Vkci5vL2QnIFwKKwkgICAgLWUgJy91ZGlwMnNvYy5vL2QnIFwKKwkgICAgLWUgJy91ZGkyZ28zMi5vL2QnIFwKKwkgICAgLWUgJy92ZXJzaW9uLm8vZCcgXAorCSAgICAtZSAnL15bYS16MC05QS1aX10qX1tTVV0uby9kJyBcCisJICAgIC1lICcvW2EtejAtOUEtWl9dKi1leHAudGFiLm8vZCcgXAorCSAgICAtZSAncy9cLm8vLmMvJyBcCisJICAgIC1lICdzfFwoW14gIF1bXiAgICAgXSpcKXwkKHNyY2RpcikvXDF8ZycgfCBcCisJd2hpbGUgcmVhZCBmOyBkbyBncmVwICdeX2luaXRpYWxpemVfW2Etel8wLTlBLVpdKiAqKCcgJCRmIDI+L2Rldi9udWxsOyBkb25lIHwgXAorCXNlZCAtZSAncy9eLio6Ly8nIC1lICdzL15cKFthLXpfMC05QS1aXSpcKS4qLyAge2V4dGVybiB2b2lkIFwxIFBBUkFNUyAoKHZvaWQpKTsgXDEgKCk7fS8nID4+aW5pdC5jLXRtcAorCUBlY2hvICd9JyA+PmluaXQuYy10bXAKKwlAbXYgaW5pdC5jLXRtcCBpbml0LmMKKworLlBSRUNJT1VTOiBpbml0LmMKKworIyBSZW1vdmluZyB0aGUgb2xkIGdkYiBmaXJzdCB3b3JrcyBiZXR0ZXIgaWYgaXQgaXMgcnVubmluZywgYXQgbGVhc3Qgb24gU3VuT1MuCitnZGIkKEVYRUVYVCk6ICQoT0JTKSAkKEJVSUxEX1RVSSkgJChUU09CUykgJChBRERfREVQUykgJChDREVQUykgaW5pdC5vCisJcm0gLWYgZ2RiJChFWEVFWFQpCisJJChITERFTlYpICQoQ0NfTEQpICQoSU5URVJOQUxfTERGTEFHUykgJChXSU4zMkxEQVBQKSAtbyBnZGIkKEVYRUVYVCkgXAorCSAgaW5pdC5vICQoT0JTKSAkKFRTT0JTKSAkKFRVSV9MSUJSQVJZKSAkKEFERF9GSUxFUykgJChDTElCUykgJChMT0FETElCRVMpCisKK25sbToJZm9yY2UKKwlyb290bWU9YHB3ZGA7IGV4cG9ydCByb290bWU7ICQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykgRE89YWxsIERPRElSUz1ubG0gc3ViZGlyX2RvCisKK2xpYmdkYjoJbGliZ2RiLWZpbGVzICQoTElCR0RCX09CUykKKworIyBsaWJwcm9jIGlzIG5vdCBsaXN0ZWQgaGVyZSBiZWNhdXNlIGFsbC1saWJwcm9jIGlzIGEgZGVwZW5kZW5jeSBvZiBhbGwtZ3VpLAorIyBub3QgYWxsLWdkYiwgYW5kIHRodXMgbWlnaHQgYmUgYnVpbHQgYWZ0ZXIgdXMuCitMSUJHREJERVBTPSQoQ09NTU9OX09CUykgJChMSUJHREJfT0JTKSAkKFRTT0JTKSAkKEFERF9ERVBTKSAkKENERVBTKSBpbml0Lm8KKyMgbGlicHJvYyBuZWVkcyB0byBiZSBiZWZvcmUgbGliaWJlcnR5IGZvciBhbGxvY2EuCitMSUJHREJGSUxFUz0kKENPTU1PTl9PQlMpICQoTElCR0RCX09CUykgJChUU09CUykgLi4vbGlicHJvYy9saWJwcm9jLmEgXAorICAkKEFERF9ERVBTKSAkKENERVBTKSBpbml0Lm8KKworbGliZ2RiLWZpbGVzOiAkKExJQkdEQkRFUFMpIE1ha2VmaWxlLmluCisJLXJtIC1mIGxpYmdkYi1maWxlcworCWZvciBpIGluICQoTElCR0RCRklMRVMpOyBkb1wKKwkJZWNobyAkJGkgPj4gbGliZ2RiLWZpbGVzO1wKKwlkb25lCisKK3NhYmVyX2dkYjogJChTRklMRVMpICQoREVQRklMRVMpIGNvcHlpbmcuYyB2ZXJzaW9uLmMKKwkjc2V0b3B0IGxvYWRfZmxhZ3MgJChDRkxBR1MpICQoQkZEX0NGTEFHUykgLURIT1NUX1NZUz1TVU40X1NZUworCSNsb2FkIC4vaW5pdC5jICQoU0ZJTEVTKQorCSN1bmxvYWQgJChzcmNkaXIpL2MtZXhwLnkKKwkjdW5sb2FkICQoc3JjZGlyKS9qdi1leHAueQorCSN1bmxvYWQgJChzcmNkaXIpL20yLWV4cC55CisJI3VubG9hZCB2eC1zaGFyZS8qLmgKKwkjdW5sb2FkIG5pbmR5LXNoYXJlL1tBLVpdKgorCSNsb2FkIGMtZXhwLnRhYi5jCisJI2xvYWQganYtZXhwLnRhYi5jCisJI2xvYWQgbTItZXhwLnRhYi5jCisJI2xvYWQgY29weWluZy5jIHZlcnNpb24uYworCSNsb2FkIC4uL29wY29kZXMvbGlib3Bjb2Rlcy5hCisJI2xvYWQgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCisJI2xvYWQgLi4vYmZkL2xpYmJmZC5hCisJI2xvYWQgLi4vcmVhZGxpbmUvbGlicmVhZGxpbmUuYQorCSNsb2FkIC4uL21tYWxsb2MvbGlibW1hbGxvYy5hCisJI2xvYWQgLi4vaW50bC9saWJpbnRsLmEKKwkjbG9hZCAtbHRlcm1jYXAgCisJI2xvYWQgYGVjaG8gIiAiJChERVBGSUxFUykgfCBzZWQgLWUgJ3MvXC5vLy5jL2cnIC1lICdzLCAsIC4uLyxnJ2AKKwllY2hvICJMb2FkIC5jIGNvcnJlc3BvbmRpbmcgdG86IiAkKERFUEZJTEVTKQorCisKKyMgQSBNYWNoIDMuMCBwcm9ncmFtIHRvIGZvcmNlIGdkYiBiYWNrIHRvIGNvbW1hbmQgbGV2ZWwKKworc3RvcC1nZGI6IHN0b3AtZ2RiLm8KKwkke0NDX0xEfSAkKEdMT0JBTF9DRkxBR1MpICQoTERGTEFHUykgLW8gc3RvcC1nZGIgXAorCXN0b3AtZ2RiLm8gJChDTElCUykgJChMT0FETElCRVMpCisKKyMgVGhpcyBpcyB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcgR0RCLCBiZWNhdXNlIHNvbWUgVW5peCdzIGRvbid0IGxldCB5b3UgcnVuIEdEQgorIyBvbiBpdHNlbGYgd2l0aG91dCBjb3B5aW5nIHRoZSBleGVjdXRhYmxlLiAgU28gIm1ha2UgZ2RiMSIgd2lsbCBtYWtlCisjIGdkYiBhbmQgcHV0IGEgY29weSBpbiBnZGIxLCBhbmQgeW91IGNhbiBydW4gaXQgd2l0aCAiZ2RiIGdkYjEiLgorIyBSZW1vdmluZyBnZGIxIGJlZm9yZSB0aGUgY29weSBpcyB0aGUgcmlnaHQgdGhpbmcgaWYgZ2RiMSBpcyBvcGVuCisjIGluIGFub3RoZXIgcHJvY2Vzcy4KK2dkYjEkKEVYRUVYVCk6IGdkYiQoRVhFRVhUKQorCXJtIC1mIGdkYjEkKEVYRUVYVCkKKwljcCBnZGIkKEVYRUVYVCkgZ2RiMSQoRVhFRVhUKQorCisjIEZJWE1FLiBUaGVzZSBhcmUgbm90IGdlbmVyYXRlZCBieSAibWFrZSBkZXBlbmQiIGJlY2F1c2UgdGhleSBvbmx5IGFyZSB0aGVyZQorIyBmb3Igc29tZSBtYWNoaW5lcy4KKyMgQnV0IHRoZXNlIHJ1bGVzIGRvbid0IGRvIHdoYXQgd2Ugd2FudDsgd2Ugd2FudCB0byBoYWNrIHRoZSBmb28ubzogdG0uaAorIyBkZXBlbmRlbmN5IHRvIGRvIHRoZSByaWdodCB0aGluZy4KK3RtLWlzaS5oIHRtLXN1bjMuaCB0bS1uZXdzLmggdG0taHAzMDBic2QuaCB0bS1hbHRvcy5oOiB0bS1tNjhrLmgKK3RtLWhwMzAwaHB1eC5oIHRtLXN1bjIuaCB0bS0zYjEuaDogdG0tbTY4ay5oCit4bS1uZXdzMTAwMC5oOiB4bS1uZXdzLmgKK3htLWkzODYtc3YzMi5oOiB4bS1pMzg2LmgKK3RtLWkzODZnYXMuaDogdG0taTM4Ni5oCit4bS1zdW40b3M0Lmg6IHhtLXNwYXJjLmgKK3RtLXN1bjRvczQuaDogdG0tc3BhcmMuaAoreG0tdmF4dWx0Lmg6IHhtLXZheC5oCit4bS12YXhic2QuaDogeG0tdmF4LmgKKwora2RiOgkkKE5UU1NUQVJUKSAkKE9CUykgJChOVFNPQlMpICQoQUREX0RFUFMpICQoQ0RFUFMpCisJbGQgLW8ga2RiICQoTlRTU1RBUlQpICQoT0JTKSAkKE5UU09CUykgaW5pdC5vICQoQUREX0ZJTEVTKSBcCisJICAtbGMgJChDTElCUykKKworIyBIYXZlIHRoZSBUVUkgbGlicmFyeSBkZXBlbmQgb24gYSBwaG9ueSB0YXJnZXQsIHNvIHdlJ2xsIGFsd2F5cworIyByZWN1cnNlIGFuZCBtYWtlIHN1cmUgaXQncyB1cCB0byBkYXRlLiAgSWYgaXQgaXMsIHRoZW4gdGhlIGZpbGUgd2lsbAorIyBiZSB1bmNoYW5nZWQsIGFuZCB3ZSB3b24ndCByZWJ1aWxkIGl0LgorIyAuUEhPTlk6IGNoZWNrLXR1aQorYWxsLXR1aTogCisJQChjZCB0dWk7ICR7TUFLRX0gJHtGTEFHU19UT19QQVNTfSBhbGwpCisKKyMgUHV0IHRoZSBwcm9wZXIgbWFjaGluZS1zcGVjaWZpYyBmaWxlcyBmaXJzdCwgc28gTS0uIG9uIGEgbWFjaGluZQorIyBzcGVjaWZpYyByb3V0aW5lIGdldHMgdGhlIG9uZSBmb3IgdGhlIGNvcnJlY3QgbWFjaGluZS4gIChGSVhNRTogdGhvc2UKKyMgZmlsZXMgZ28gaW4gdHdpY2U7IHdlIHNob3VsZCBiZSByZW1vdmluZyB0aGVtIGZyb20gdGhlIG1haW4gbGlzdCkuCisKKyMgVEFHUyBkZXBlbmRzIG9uIGFsbCB0aGUgZmlsZXMgdGhhdCBnbyBpbnRvIGl0IHNvIHlvdSBjYW4gcmVidWlsZCBUQUdTCisjIHdpdGggYG1ha2UgVEFHUycgYW5kIG5vdCBoYXZlIHRvIHNheSBgcm0gVEFHUycgZmlyc3QuCisKK1RBR1M6ICQoVEFHRklMRVNfTk9fU1JDRElSKSAkKFRBR0ZJTEVTX1dJVEhfU1JDRElSKQorCUBlY2hvIE1ha2luZyBUQUdTCisJQGV0YWdzICQoc3JjZGlyKS8kKFRNX0ZJTEUpIFwKKwkgICQoc3JjZGlyKS8kKFhNX0ZJTEUpIFwKKwkgICQoc3JjZGlyKS8kKE5BVF9GSUxFKSBcCisJYChmb3IgaSBpbiAkKERFUEZJTEVTKSAkKFRBR0ZJTEVTX05PX1NSQ0RJUik7IGRvIFwKKwkJZWNobyAkKHNyY2RpcikvJCRpIDsgXAorCWRvbmUgOyBmb3IgaSBpbiAkKFRBR0ZJTEVTX1dJVEhfU1JDRElSKTsgZG8gXAorCQllY2hvICQkaSA7IFwKKwlkb25lKSB8IHNlZCAtZSAncy9cLm8kJC9cLmMvJ2AgXAorCWBmaW5kICQoc3JjZGlyKS9jb25maWcgLW5hbWUgJyouaCcgLXByaW50YAorCit0YWdzOiBUQUdTCisKK2NsZWFuIG1vc3RseWNsZWFuOgorCUAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgRE89Y2xlYW4gIkRPRElSUz0kKFNVQkRJUlMpIiBzdWJkaXJfZG8gCisJcm0gLWYgKi5vICouYSAkKEFERF9GSUxFUykgKn4gaW5pdC5jLXRtcAorCXJtIC1mIGluaXQuYyB2ZXJzaW9uLmMKKwlybSAtZiBnZGIkKEVYRUVYVCkgY29yZSBtYWtlLmxvZyBsaWJnZGItZmlsZXMKKwlybSAtZiBnZGJbMC05XSQoRVhFRVhUKQorCisjIFRoaXMgdXNlZCB0byBkZXBlbmQgb24gYy1leHAudGFiLmMgbTItZXhwLnRhYi5jIFRBR1MKKyMgSSBiZWxpZXZlIHRoaXMgaXMgd3Jvbmc7IHRoZSBtYWtlZmlsZSBzdGFuZGFyZHMgZm9yIGRpc3RjbGVhbiBqdXN0CisjIGRlc2NyaWJlIHJlbW92aW5nIGZpbGVzOyB0aGUgb25seSBzb3J0IG9mICJyZS1jcmVhdGUgYSBkaXN0cmlidXRpb24iCisjIGZ1bmN0aW9uYWxpdHkgZGVzY3JpYmVkIGlzIGlmIHRoZSBkaXN0cmlidXRlZCBmaWxlcyBhcmUgdW5tb2RpZmllZC4KK2Rpc3RjbGVhbjogY2xlYW4KKwlAJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIERPPWRpc3RjbGVhbiAiRE9ESVJTPSQoU1VCRElSUykiIHN1YmRpcl9kbyAKKwlybSAtZiBubS5oIHRtLmggeG0uaCBjb25maWcuc3RhdHVzIGNvbmZpZy5oIHN0YW1wLWggLmdkYmluaXQKKwlybSAtZiB5Lm91dHB1dCB5YWNjLmFjdHMgeWFjYy50bXAgeS50YWIuaAorCXJtIC1mIGNvbmZpZy5sb2cgY29uZmlnLmNhY2hlCisJcm0gLWYgTWFrZWZpbGUKKworbWFpbnRhaW5lci1jbGVhbjogbG9jYWwtbWFpbnRhaW5lci1jbGVhbiBkby1tYWludGFpbmVyLWNsZWFuIGRpc3RjbGVhbgorcmVhbGNsZWFuOiBtYWludGFpbmVyLWNsZWFuCisKK2xvY2FsLW1haW50YWluZXItY2xlYW46CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCisJcm0gLWYgYy1leHAudGFiLmMgXAorCQlqdi1leHAudGFiIFwKKwkJZi1leHAudGFiLmMgbTItZXhwLnRhYi5jCisJcm0gLWYgVEFHUyAkKElORk9GSUxFUykKKwlybSAtZiAkKFlZRklMRVMpCisJcm0gLWYgbm0uaCB0bS5oIHhtLmggY29uZmlnLnN0YXR1cworCitkby1tYWludGFpbmVyLWNsZWFuOgorCUAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgRE89bWFpbnRhaW5lci1jbGVhbiAiRE9ESVJTPSQoU1VCRElSUykiIFwKKwkJc3ViZGlyX2RvCisKK2Rpc3RzdHVmZjogJChESVNUU1RVRkYpCisJY2QgZG9jOyAkKE1BS0UpICQoTUZMQUdTKSBhbGwtZG9jCisKK3N1YmRpcl9kbzogZm9yY2UKKwlAZm9yIGkgaW4gJChET0RJUlMpOyBkbyBcCisJCWlmIFsgLWYgLi8kJGkvTWFrZWZpbGUgXSA7IHRoZW4gXAorCQkJaWYgKGNkIC4vJCRpOyBcCisJCQkJJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpICQoRE8pKSA7IHRoZW4gdHJ1ZSA7IFwKKwkJCWVsc2UgZXhpdCAxIDsgZmkgOyBcCisJCWVsc2UgdHJ1ZSA7IGZpIDsgXAorCWRvbmUKKworTWFrZWZpbGU6IE1ha2VmaWxlLmluIGNvbmZpZy5zdGF0dXMgQGZyYWdzQAorCSQoU0hFTEwpIGNvbmZpZy5zdGF0dXMKKworY29uZmlnLmg6IHN0YW1wLWggOyBAdHJ1ZQorc3RhbXAtaDogY29uZmlnLmluIGNvbmZpZy5zdGF0dXMKKwlDT05GSUdfSEVBREVSUz1jb25maWcuaDpjb25maWcuaW4gJChTSEVMTCkgY29uZmlnLnN0YXR1cworCitjb25maWcuc3RhdHVzOiBjb25maWd1cmUKKwkkKFNIRUxMKSBjb25maWcuc3RhdHVzIC0tcmVjaGVjaworCitmb3JjZToKKworIyBEb2N1bWVudGF0aW9uIQorIyBHREIgUVVJQ0sgUkVGRVJFTkNFIChUZVggZHZpIGZpbGUsIENNIGZvbnRzKQorZG9jL3JlZmNhcmQuZHZpOgorCWNkIGRvYzsgJChNQUtFKSByZWZjYXJkLmR2aSAkKEZMQUdTX1RPX1BBU1MpCisKKyMgR0RCIFFVSUNLIFJFRkVSRU5DRSAoUG9zdFNjcmlwdCBvdXRwdXQsIGNvbW1vbiBQUyBmb250cykKK2RvYy9yZWZjYXJkLnBzOgorCWNkIGRvYzsgJChNQUtFKSByZWZjYXJkLnBzICQoRkxBR1NfVE9fUEFTUykKKworIyBHREIgTUFOVUFMOiBUZVggZHZpIGZpbGUKK2RvYy9nZGIuZHZpOgorCWNkIGRvYzsgJChNQUtFKSBnZGIuZHZpICQoRkxBR1NfVE9fUEFTUykKKworIyBHREIgTUFOVUFMOiBpbmZvIGZpbGUKK2RvYy9nZGIuaW5mbzoKKwljZCBkb2M7ICQoTUFLRSkgZ2RiLmluZm8gJChGTEFHU19UT19QQVNTKQorCisjIE1ha2UgY29weWluZy5jIGZyb20gQ09QWUlORworY29weWluZy5jOiBDT1BZSU5HIGNvcHlpbmcuYXdrCisJYXdrIC1mICQoc3JjZGlyKS9jb3B5aW5nLmF3ayA8ICQoc3JjZGlyKS9DT1BZSU5HID4gY29weWluZy5jCisKK3ZlcnNpb24uYzogTWFrZWZpbGUKKwllY2hvICdjaGFyICp2ZXJzaW9uID0gIiQoVkVSU0lPTikiOycgPnZlcnNpb24uYworCWVjaG8gJ2NoYXIgKmhvc3RfbmFtZSA9ICIkKGhvc3RfYWxpYXMpIjsnID4+IHZlcnNpb24uYworCWVjaG8gJ2NoYXIgKnRhcmdldF9uYW1lID0gIiQodGFyZ2V0X2FsaWFzKSI7JyA+PiB2ZXJzaW9uLmMKKworIyBjLWV4cC50YWIuYyBpcyBnZW5lcmF0ZWQgaW4gb2JqZGlyIGZyb20gYy1leHAueSBpZiBpdCBkb2Vzbid0IGV4aXN0CisjIGluIHNyY2RpciwgdGhlbiBjb21waWxlZCBpbiBvYmpkaXIgdG8gYy1leHAudGFiLm8uCisKKyMgSWYgd2Ugc2FpZCBjLWV4cC50YWIuYyByYXRoZXIgdGhhbiAuL2MtZXhwLnRhYi5jIHNvbWUgbWFrZXMKKyMgd291bGQgc29tZXRpbWVzIHJlLXdyaXRlIGl0IGludG8gJChzcmNkaXIpL2MtZXhwLnRhYi5jLgorCisjIFJlbW92ZSBib2d1cyBkZWNscyBmb3IgbWFsbG9jL3JlYWxsb2MvZnJlZSB3aGljaCBjb25mbGljdCB3aXRoIGV2ZXJ5dGhpbmcKKyMgZWxzZS4gIFN0cmljdGx5IHNwZWFraW5nIGMtZXhwLnRhYi5jIHNob3VsZCB0aGVyZWZvcmUgZGVwZW5kIG9uCisjIE1ha2VmaWxlLmluLCBidXQgdGhhdCB3YXMgYSBwcmV0dHkgYmlnIGFubm95YW5jZS4KK2MtZXhwLnRhYi5vOiBjLWV4cC50YWIuYworYy1leHAudGFiLmM6IGMtZXhwLnkKKwkkKFNIRUxMKSAkKFlMV1JBUCkgIiQoWUFDQykiICQoc3JjZGlyKS9jLWV4cC55ICB5LnRhYi5jIGMtZXhwLnRtcCAtLSAkKFlGTEFHUykgCisJLXNlZCAtZSAnL2V4dGVybi4qbWFsbG9jL2QnIFwKKwkgICAgIC1lICcvZXh0ZXJuLipyZWFsbG9jL2QnIFwKKwkgICAgIC1lICcvZXh0ZXJuLipmcmVlL2QnIFwKKwkgICAgIC1lICcvaW5jbHVkZS4qbWFsbG9jLmgvZCcgXAorCSAgICAgLWUgJ3MvbWFsbG9jL3htYWxsb2MvZycgXAorCSAgICAgLWUgJ3MvcmVhbGxvYy94cmVhbGxvYy9nJyBcCisJICAgICAtZSAnL14jbGluZS4qeS50YWIuYy9kJyBcCisJICA8IGMtZXhwLnRtcCA+IGMtZXhwLm5ldworCS1ybSBjLWV4cC50bXAKKwltdiBjLWV4cC5uZXcgLi9jLWV4cC50YWIuYworCitqdi1leHAudGFiLm86IGp2LWV4cC50YWIuYworanYtZXhwLnRhYi5jOiBqdi1leHAueQorCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJChzcmNkaXIpL2p2LWV4cC55ICB5LnRhYi5jIGp2LWV4cC50bXAgLS0gJChZRkxBR1MpIAorCS1zZWQgLWUgJy9leHRlcm4uKm1hbGxvYy9kJyBcCisJICAgICAtZSAnL2V4dGVybi4qcmVhbGxvYy9kJyBcCisJICAgICAtZSAnL2V4dGVybi4qZnJlZS9kJyBcCisJICAgICAtZSAnL2luY2x1ZGUuKm1hbGxvYy5oL2QnIFwKKwkgICAgIC1lICdzL21hbGxvYy94bWFsbG9jL2cnIFwKKwkgICAgIC1lICdzL3JlYWxsb2MveHJlYWxsb2MvZycgXAorCSAgICAgLWUgJy9eI2xpbmUuKnkudGFiLmMvZCcgXAorCSAgPCBqdi1leHAudG1wID4ganYtZXhwLm5ldworCS1ybSBqdi1leHAudG1wCisJbXYganYtZXhwLm5ldyAuL2p2LWV4cC50YWIuYworCitmLWV4cC50YWIubzogZi1leHAudGFiLmMKK2YtZXhwLnRhYi5jOiBmLWV4cC55IGMtZXhwLnRhYi5jCisJJChTSEVMTCkgJChZTFdSQVApICIkKFlBQ0MpIiAkKHNyY2RpcikvZi1leHAueSAgeS50YWIuYyBmLWV4cC50bXAgLS0gJChZRkxBR1MpIAorCS1zZWQgLWUgJy9leHRlcm4uKm1hbGxvYy9kJyBcCisJICAgICAtZSAnL2V4dGVybi4qcmVhbGxvYy9kJyBcCisJICAgICAtZSAnL2V4dGVybi4qZnJlZS9kJyBcCisJICAgICAtZSAnL2luY2x1ZGUuKm1hbGxvYy5oL2QnIFwKKwkgICAgIC1lICdzL21hbGxvYy94bWFsbG9jL2cnIFwKKwkgICAgIC1lICdzL3JlYWxsb2MveHJlYWxsb2MvZycgXAorCSAgICAgLWUgJy9eI2xpbmUuKnkudGFiLmMvZCcgXAorCSAgPCBmLWV4cC50bXAgPiBmLWV4cC5uZXcKKwktcm0gZi1leHAudG1wCisJbXYgZi1leHAubmV3IC4vZi1leHAudGFiLmMKKworIyBtMi1leHAudGFiLmMgaXMgZ2VuZXJhdGVkIGluIG9iamRpciBmcm9tIG0yLWV4cC55IGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyMgaW4gc3JjZGlyLCB0aGVuIGNvbXBpbGVkIGluIG9iamRpciB0byBtMi1leHAudGFiLm8uCisjIFJlbW92ZSBib2d1cyBkZWNscyBmb3IgbWFsbG9jL3JlYWxsb2MvZnJlZSB3aGljaCBjb25mbGljdCB3aXRoIGV2ZXJ5dGhpbmcKKyMgZWxzZS4KK20yLWV4cC50YWIubzogbTItZXhwLnRhYi5jCittMi1leHAudGFiLmM6IG0yLWV4cC55CisJJChTSEVMTCkgJChZTFdSQVApICIkKFlBQ0MpIiAkKHNyY2RpcikvbTItZXhwLnkgIHkudGFiLmMgbTItZXhwLnRtcCAtLSAkKFlGTEFHUykgCisJLXNlZCAtZSAnL2V4dGVybi4qbWFsbG9jL2QnIFwKKwkgICAgIC1lICcvZXh0ZXJuLipyZWFsbG9jL2QnIFwKKwkgICAgIC1lICcvZXh0ZXJuLipmcmVlL2QnIFwKKwkgICAgIC1lICcvaW5jbHVkZS4qbWFsbG9jLmgvZCcgXAorCSAgICAgLWUgJ3MvbWFsbG9jL3htYWxsb2MvZycgXAorCSAgICAgLWUgJ3MvcmVhbGxvYy94cmVhbGxvYy9nJyBcCisJICAgICAtZSAnL14jbGluZS4qeS50YWIuYy9kJyBcCisJICA8IG0yLWV4cC50bXAgPiBtMi1leHAubmV3CisJLXJtIG0yLWV4cC50bXAKKwltdiBtMi1leHAubmV3IC4vbTItZXhwLnRhYi5jCisKKyMgVGhlc2UgZmlsZXMgYXJlIHVwZGF0ZWQgYXRvbWljYWxseSwgc28gbWFrZSBuZXZlciBoYXMgdG8gcmVtb3ZlIHRoZW0KKy5QUkVDSU9VUzogbTItZXhwLnRhYi5jIGYtZXhwLnRhYi5jIGMtZXhwLnRhYi5jCisuUFJFQ0lPVVM6IGp2LWV4cC50YWIuYworCitsaW50OiAkKExJTlRGSUxFUykKKwkkKExJTlQpICQoSU5DTFVERV9DRkxBR1MpICQoTElOVEZMQUdTKSAkKExJTlRGSUxFUykgXAorCSAgIGBlY2hvICQoREVQRklMRVMpIHwgc2VkICdzL1wubyAvXC5jIC9nJ2AKKworZ2RiLmN4cmVmOiAkKFNGSUxFUykKKwljeHJlZiAtSS4gJChTRklMRVMpID5nZGIuY3hyZWYKKworZm9yY2VfdXBkYXRlOgorCisjIEdOVSBNYWtlIGhhcyBhbiBhbm5veWluZyBoYWJpdCBvZiBwdXR0aW5nICphbGwqIHRoZSBNYWtlZmlsZSB2YXJpYWJsZXMKKyMgaW50byB0aGUgZW52aXJvbm1lbnQsIHVubGVzcyB5b3UgaW5jbHVkZSB0aGlzIHRhcmdldCBhcyBhIGNpcmN1bXZlbnRpb24uCisjIFJ1bW9yIGlzIHRoYXQgdGhpcyB3aWxsIGJlIGZpeGVkIChhbmQgdGhpcyB0YXJnZXQgY2FuIGJlIHJlbW92ZWQpCisjIGluIEdOVSBNYWtlIDQuMC4KKy5OT0VYUE9SVDoKKworIyBHTlUgTWFrZSAzLjYzIGhhcyBhIGRpZmZlcmVudCBwcm9ibGVtOiBpdCBrZWVwcyB0YWNraW5nIGNvbW1hbmQgbGluZQorIyBvdmVycmlkZXMgb250byB0aGUgZGVmaW5pdGlvbiBvZiAkKE1BS0UpLiAgVGhpcyB2YXJpYWJsZSBzZXR0aW5nCisjIHdpbGwgcmVtb3ZlIHRoZW0uCitNQUtFT1ZFUlJJREVTPQorCisjIyBUaGlzIGlzIHVnbHksIGJ1dCBJIGRvbid0IHdhbnQgR05VIG1ha2UgdG8gcHV0IHRoZXNlIHZhcmlhYmxlcyBpbgorIyMgdGhlIGVudmlyb25tZW50LiAgT2xkZXIgbWFrZXMgd2lsbCBzZWUgdGhpcyBhcyBhIHNldCBvZiB0YXJnZXRzCisjIyB3aXRoIG5vIGRlcGVuZGVuY2llcyBhbmQgbm8gYWN0aW9ucy4KK3VuZXhwb3J0IENISUxMRkxBR1MgQ0hJTExfTElCIENISUxMX0ZPUl9UQVJHRVQgOgorCitBTExERVBGSUxFUyA9IDI5ay1zaGFyZS91ZGkvdWRpcDJzb2MuYyAyOWstc2hhcmUvdWRpL3Vkci5jIFwKKwkyOWstc2hhcmUvdWRpL3VkaTJnbzMyLmMgXAorCWEyOWstdGRlcC5jIGE2OHYtbmF0LmMgYWxwaGEtbmF0LmMgYWxwaGEtdGRlcC5jIFwKKwlhbHRvcy14ZGVwLmMgYXJtLWNvbnZlcnQucyBcCisJYXJtLXRkZXAuYyBhcm0teGRlcC5jIGNvZmYtc29saWIuYyBcCisJY29udmV4LXRkZXAuYyBjb252ZXgteGRlcC5jIFwKKwljb3JlLXNvbDIuYyBjb3JlLXJlZ3NldC5jIGNvcmUtYW91dC5jIGNvcmVsb3cuYyBcCisJZGNhY2hlLmMgZGVsdGE2OC1uYXQuYyBkcHgyLW5hdC5jIGRzdHJlYWQuYyBleGVjLmMgZm9yay1jaGlsZC5jIFwKKwlnbzMyLXhkZXAuYyBnb3VsZC10ZGVwLmMgZ291bGQteGRlcC5jIGg4MzAwLXRkZXAuYyBoODUwMC10ZGVwLmMgXAorCWhwMzAwdXgtbmF0LmMgaHBwYS10ZGVwLmMgaHBwYWItbmF0LmMgaHBwYWgtbmF0LmMgXAorICAgICAgICBocC1wc3ltdGFiLXJlYWQuYyBocC1zeW10YWItcmVhZC5jIFwKKwlpMzg2LXRkZXAuYyBpMzg2Yi1uYXQuYyBpMzg2bWFjaC1uYXQuYyBpMzg2di1uYXQuYyBcCisJaTM4NmFpeC1uYXQuYyBpMzg2bTMtbmF0LmMgaTM4NnY0LW5hdC5jIGkzODZseS10ZGVwLmMgXAorCWkzODctdGRlcC5jIFwKKwlpOTYwLXRkZXAuYyBcCisJaW5mcHRyYWNlLmMgaW5mdGFyZy5jIGlyaXg0LW5hdC5jIGlyaXg1LW5hdC5jIGlzaS14ZGVwLmMgXAorCWx5bngtbmF0LmMgbTMtbmF0LmMgXAorCW02OGstdGRlcC5jIFwKKwltODhrLW5hdC5jIG04OGstdGRlcC5jIG1hYy1uYXQuYyBtaXBzLW5hdC5jIFwKKwltaXBzLXRkZXAuYyBtaXBzbTMtbmF0LmMgbWlwc3Y0LW5hdC5jIG5ld3MteGRlcC5jIFwKKwluaW5keS1zaGFyZS9PbmluZHkuYyBuaW5keS1zaGFyZS9uaW5keS5jIFwKKwluaW5keS1zaGFyZS90dHlmbHVzaC5jIG5pbmR5LXRkZXAuYyBcCisJbnMzMmstdGRlcC5jIG5zMzJrbTMtbmF0LmMgb3Nmc29saWIuYyBcCisJc29tcmVhZC5jIHNvbXNvbGliLmMgJChIUFJFQURfU09VUkNFKSBcCisJcHJvY2ZzLmMgcHlyLXRkZXAuYyBweXIteGRlcC5jIFwKKwlyZW1vdGUtYWRhcHQuYyByZW1vdGUtYXJyYXkuYyByZW1vdGUtYnVnLmMgcmVtb3RlLWU3MDAwLmMgcmVtb3RlLWViLmMgXAorCXJlbW90ZS1lcy5jIHJlbW90ZS1obXMuYyByZW1vdGUtbWlwcy5jIFwKKwlyZW1vdGUtbW0uYyByZW1vdGUtbmluZHkuYyByZW1vdGUtb3M5ay5jIHJlbW90ZS1yZHAuYyByZW1vdGUtc2ltLmMgXAorCXJlbW90ZS1zdC5jIHJlbW90ZS11dGlscy5jIGRjYWNoZS5jIFwKKwlyZW1vdGUtdWRpLmMgcmVtb3RlLXZ4LmMgcmVtb3RlLXZ4MjlrLmMgXAorCXJzNjAwMC1uYXQuYyByczYwMDAtdGRlcC5jIFwKKwlzZXItZ28zMi5jIHNlci1vY2QuYyBzZXItdGNwLmMgc2gtdGRlcC5jIHNvbGliLmMgc3BhcmMtbmF0LmMgXAorCXNwYXJjLXRkZXAuYyBzcGFyY2wtdGRlcC5jIHN1bjMtbmF0LmMgc3VuMzg2LW5hdC5jIFwKKwlzeW1tLXRkZXAuYyBzeW1tLW5hdC5jIFwKKwl0YWhvZS10ZGVwLmMgdWx0cmEzLW5hdC5jIHVsdHJhMy14ZGVwLmMgdW1heC14ZGVwLmMgXAorCXZheC10ZGVwLmMgXAorCXZ4LXNoYXJlL3hkcl9sZC5jIHZ4LXNoYXJlL3hkcl9wdHJhY2UuYyB2eC1zaGFyZS94ZHJfcmRiLmMgXAorCXdpbjMyLW5hdC5jIFwKKwl4Y29mZnJlYWQuYyB4Y29mZnNvbGliLmMgejhrLXRkZXAuYworCit1ZGlwMnNvYy5vOiAkKHNyY2RpcikvMjlrLXNoYXJlL3VkaS91ZGlwMnNvYy5jICQodWRpaGVhZGVycykKKwkkKENDKSAtYyAkKElOVEVSTkFMX0NGTEFHUykgJChzcmNkaXIpLzI5ay1zaGFyZS91ZGkvdWRpcDJzb2MuYworCit1ZGkyZ28zMi5vOiAkKHNyY2RpcikvMjlrLXNoYXJlL3VkaS91ZGkyZ28zMi5jICQodWRpaGVhZGVycykKKwkkKENDKSAtYyAkKElOVEVSTkFMX0NGTEFHUykgJChzcmNkaXIpLzI5ay1zaGFyZS91ZGkvdWRpMmdvMzIuYworCit1ZHIubzogJChzcmNkaXIpLzI5ay1zaGFyZS91ZGkvdWRyLmMgJCh1ZGloZWFkZXJzKSAKKwkkKENDKSAtYyAkKElOVEVSTkFMX0NGTEFHUykgJChzcmNkaXIpLzI5ay1zaGFyZS91ZGkvdWRyLmMKKworYTI5ay10ZGVwLm86IGEyOWstdGRlcC5jICQoZ2RiY21kX2gpICQoZ2RiY29yZV9oKSAkKGluZmVyaW9yX2gpICQoZGVmc19oKQorCithNjh2LW5hdC5vOiBhNjh2LW5hdC5jICQoZGVmc19oKSAkKGdkYmNvcmVfaCkgJChpbmZlcmlvcl9oKQorCithbHBoYS1uYXQubzogYWxwaGEtbmF0LmMgJChkZWZzX2gpICQoZ2RiY29yZV9oKSAkKGluZmVyaW9yX2gpIHRhcmdldC5oCisKK2FscGhhLXRkZXAubzogYWxwaGEtdGRlcC5jICQoZGVmc19oKSAkKGdkYmNtZF9oKSAkKGdkYmNvcmVfaCkgXAorCSQoaW5mZXJpb3JfaCkgJChzeW10YWJfaCkgJChkaXMtYXNtLmgpIGdkYl9zdHJpbmcuaAorCithbHRvcy14ZGVwLm86IGFsdG9zLXhkZXAuYyAkKGRlZnNfaCkgJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkKKworYW5ub3RhdGUubzogYW5ub3RhdGUuYyAkKGRlZnNfaCkgYW5ub3RhdGUuaCAkKHZhbHVlX2gpIHRhcmdldC5oICQoZ2RidHlwZXNfaCkKKworYXJtLXRkZXAubzogYXJtLXRkZXAuYyAkKGdkYmNtZF9oKSAkKGdkYmNvcmVfaCkgJChpbmZlcmlvcl9oKSAkKGRlZnNfaCkgXAorCSQoZ2RiY29yZV9oKQorCitiY2FjaGUubzogYmNhY2hlLmMgYmNhY2hlLmggJChkZWZzX2gpCisKK2Jsb2NrZnJhbWUubzogYmxvY2tmcmFtZS5jICQoZGVmc19oKSAkKGdkYmNvcmVfaCkgJChpbmZlcmlvcl9oKSBcCisJb2JqZmlsZXMuaCBzeW1maWxlLmggdGFyZ2V0LmgKKworYnJlYWtwb2ludC5vOiBicmVha3BvaW50LmMgJChkZWZzX2gpICQoZ2RiY21kX2gpICQoZ2RiY29yZV9oKSBcCisJJChpbmZlcmlvcl9oKSBsYW5ndWFnZS5oIHRhcmdldC5oIGdkYnRocmVhZC5oIGdkYl9zdHJpbmcuaAorCitidWlsZHN5bS5vOiBidWlsZHN5bS5jICQoYmZkX2gpIGJ1aWxkc3ltLmggY29tcGxhaW50cy5oICQoZGVmc19oKSBcCisJb2JqZmlsZXMuaCBzeW1maWxlLmggJChzeW10YWJfaCkgZ2RiX3N0cmluZy5oCisKK2MtbGFuZy5vOiBjLWxhbmcuYyBjLWxhbmcuaCAkKGRlZnNfaCkgJChleHByZXNzaW9uX2gpICQoZ2RidHlwZXNfaCkgXAorCWxhbmd1YWdlLmggcGFyc2VyLWRlZnMuaCAkKHN5bXRhYl9oKQorCitjLXR5cGVwcmludC5vOiBjLXR5cGVwcmludC5jIGMtbGFuZy5oICQoZGVmc19oKSAkKGV4cHJlc3Npb25faCkgXAorCSQoZ2RiY21kX2gpICQoZ2RiY29yZV9oKSAkKGdkYnR5cGVzX2gpIGxhbmd1YWdlLmggJChzeW10YWJfaCkgXAorCXRhcmdldC5oIHR5cGVwcmludC5oICQodmFsdWVfaCkgZ2RiX3N0cmluZy5oCisKK2MtdmFscHJpbnQubzogYy12YWxwcmludC5jICQoZGVmc19oKSAkKGV4cHJlc3Npb25faCkgJChnZGJ0eXBlc19oKSBcCisJbGFuZ3VhZ2UuaCAkKHN5bXRhYl9oKSB2YWxwcmludC5oICQodmFsdWVfaCkKKworZi1sYW5nLm86IGYtbGFuZy5jIGYtbGFuZy5oICQoZGVmc19oKSAkKGV4cHJlc3Npb25faCkgJChnZGJ0eXBlc19oKSBcCisJbGFuZ3VhZ2UuaCBwYXJzZXItZGVmcy5oICQoc3ltdGFiX2gpIGdkYl9zdHJpbmcuaAorCitmLXR5cGVwcmludC5vOiBmLXR5cGVwcmludC5jIGYtbGFuZy5oICQoZGVmc19oKSAkKGV4cHJlc3Npb25faCkgXAorCSQoZ2RiY21kX2gpICQoZ2RiY29yZV9oKSAkKGdkYnR5cGVzX2gpIGxhbmd1YWdlLmggJChzeW10YWJfaCkgXAorCXRhcmdldC5oIHR5cGVwcmludC5oICQodmFsdWVfaCkgZ2RiX3N0cmluZy5oCisKK2YtdmFscHJpbnQubzogZi12YWxwcmludC5jICQoZGVmc19oKSAkKGV4cHJlc3Npb25faCkgJChnZGJ0eXBlc19oKSBcCisJbGFuZ3VhZ2UuaCAkKHN5bXRhYl9oKSB2YWxwcmludC5oICQodmFsdWVfaCkgZ2RiX3N0cmluZy5oCisKK2NoLWV4cC5vOiBjaC1leHAuYyBjaC1sYW5nLmggJChkZWZzX2gpIGxhbmd1YWdlLmggcGFyc2VyLWRlZnMuaCAkKGJmZF9oKSBzeW1maWxlLmggb2JqZmlsZXMuaCAkKHZhbHVlX2gpCisKK2NoLWxhbmcubzogY2gtbGFuZy5jIGNoLWxhbmcuaCAkKGRlZnNfaCkgJChleHByZXNzaW9uX2gpICQoZ2RidHlwZXNfaCkgXAorCWxhbmd1YWdlLmggcGFyc2VyLWRlZnMuaCAkKHN5bXRhYl9oKQorCitjaC10eXBlcHJpbnQubzogY2gtdHlwZXByaW50LmMgY2gtbGFuZy5oICQoZGVmc19oKSAkKGV4cHJlc3Npb25faCkgXAorCSQoZ2RiY21kX2gpICQoZ2RiY29yZV9oKSAkKGdkYnR5cGVzX2gpIGxhbmd1YWdlLmggJChzeW10YWJfaCkgXAorCXRhcmdldC5oICQodmFsdWVfaCkgdHlwZXByaW50LmggZ2RiX3N0cmluZy5oCisKK2NoLXZhbHByaW50Lm86IGNoLXZhbHByaW50LmMgJChkZWZzX2gpICQoZXhwcmVzc2lvbl9oKSAkKGdkYnR5cGVzX2gpIFwKKwlsYW5ndWFnZS5oICQoc3ltdGFiX2gpIHZhbHByaW50LmggJCh2YWx1ZV9oKSBjLWxhbmcuaAorCitjb2ZmLXNvbGliLm86IGNvZmYtc29saWIuYyAkKGRlZnNfaCkKKworY29mZnJlYWQubzogY29mZnJlYWQuYyAkKGJmZF9oKSAkKGJyZWFrcG9pbnRfaCkgYnVpbGRzeW0uaCBcCisJY29tcGxhaW50cy5oICQoZGVmc19oKSAkKGV4cHJlc3Npb25faCkgJChnZGJ0eXBlc19oKSBvYmpmaWxlcy5oIFwKKwlzeW1maWxlLmggJChzeW10YWJfaCkgZ2RiLXN0YWJzLmggc3RhYnNyZWFkLmggdGFyZ2V0LmggXAorCWdkYl9zdHJpbmcuaAorCitjb21tYW5kLm86IGNvbW1hbmQuYyAkKGRlZnNfaCkgJChleHByZXNzaW9uX2gpICQoZ2RiY21kX2gpIFwKKwkkKGdkYnR5cGVzX2gpICQoc3ltdGFiX2gpICQodmFsdWVfaCkgZ2RiX3N0cmluZy5oICQod2FpdF9oKQorCitjb21wbGFpbnRzLm86IGNvbXBsYWludHMuYyBjb21wbGFpbnRzLmggJChkZWZzX2gpICQoZ2RiY21kX2gpCisKK2NvbnZleC10ZGVwLm86IGNvbnZleC10ZGVwLmMgJCh3YWl0X2gpICQoZGVmc19oKSAkKGdkYmNtZF9oKSBcCisJJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkKKworY29udmV4LXhkZXAubzogY29udmV4LXhkZXAuYyAkKGRlZnNfaCkgJChnZGJjbWRfaCkgJChnZGJjb3JlX2gpIFwKKwkkKGluZmVyaW9yX2gpCisKK2NvcHlpbmcubzogY29weWluZy5jICQoZGVmc19oKSAkKGdkYmNtZF9oKQorCitjb3JlLWFvdXQubzogY29yZS1hb3V0LmMgJChkZWZzX2gpICQoZ2RiY29yZV9oKSAkKHZhbHVlX2gpICQoaW5mZXJpb3JfaCkKKworY29yZS1zb2wyLm86IGNvcmUtc29sMi5jICQoY29tbWFuZF9oKSAkKGRlZnNfaCkgJChnZGJjb3JlX2gpIFwKKwkkKGluZmVyaW9yX2gpIHRhcmdldC5oIGdkYl9zdHJpbmcuaAorCitjb3JlLXJlZ3NldC5vOiBjb3JlLXJlZ3NldC5jICQoY29tbWFuZF9oKSAkKGRlZnNfaCkgJChnZGJjb3JlX2gpIFwKKwkkKGluZmVyaW9yX2gpIHRhcmdldC5oIGdkYl9zdHJpbmcuaAorCitjb3JlZmlsZS5vOiBjb3JlZmlsZS5jICQoZGlzLWFzbV9oKSAkKGRlZnNfaCkgJChnZGJjbWRfaCkgJChnZGJjb3JlX2gpIFwKKwkkKGluZmVyaW9yX2gpIHRhcmdldC5oIGxhbmd1YWdlLmggZ2RiX3N0cmluZy5oCisKK2NvcmVsb3cubzogY29yZWxvdy5jICQoY29tbWFuZF9oKSAkKGRlZnNfaCkgJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkgXAorCXRhcmdldC5oIGdkYnRocmVhZC5oIGdkYl9zdHJpbmcuaAorCitjcC12YWxwcmludC5vOiBjcC12YWxwcmludC5jICQoZGVmc19oKSAkKGV4cHJlc3Npb25faCkgJChnZGJjbWRfaCkgXAorCSQoZ2RidHlwZXNfaCkgJChzeW10YWJfaCkgJCh2YWx1ZV9oKSBnZGJfc3RyaW5nLmgKKworZGNhY2hlLm86IGRjYWNoZS5jICQoZGNhY2hlX2gpICQoZGVmc19oKSAkKGdkYmNtZF9oKSBnZGJfc3RyaW5nLmggJChnZGJjb3JlX2gpCisKK2RieHJlYWQubzogZGJ4cmVhZC5jICQoYnJlYWtwb2ludF9oKSBidWlsZHN5bS5oICQoY29tbWFuZF9oKSBcCisJY29tcGxhaW50cy5oICQoZGVmc19oKSAkKGV4cHJlc3Npb25faCkgZ2RiLXN0YWJzLmggJChnZGJjb3JlX2gpIFwKKwkkKGdkYnR5cGVzX2gpIGxhbmd1YWdlLmggb2JqZmlsZXMuaCBwYXJ0aWFsLXN0YWIuaCBzdGFic3JlYWQuaCBcCisJc3ltZmlsZS5oICQoc3ltdGFiX2gpIHRhcmdldC5oIGdkYl9zdHJpbmcuaAorCitkZWx0YTY4LW5hdC5vOiBkZWx0YTY4LW5hdC5jICQoZGVmc19oKQorCitkZW1hbmdsZS5vOiBkZW1hbmdsZS5jICQoZGVmc19oKSAkKGdkYmNtZF9oKSBnZGJfc3RyaW5nLmgKKworZGluazMyLXJvbS5vOiBkaW5rMzItcm9tLmMgbW9uaXRvci5oICQoYmZkX2gpICQod2FpdF9oKSAkKGRlZnNfaCkgJChnZGJjbWRfaCkgXAorCSQoaW5mZXJpb3JfaCkgdGFyZ2V0Lmggc2VyaWFsLmggdGVybWluYWwuaAorCitkcHgyLW5hdC5vOiBkcHgyLW5hdC5jICQoZGVmc19oKSAkKGdkYmNvcmVfaCkgZ2RiX3N0cmluZy5oCisKK2RzdHJlYWQubzogZHN0cmVhZC5jIGdkYl9zdHJpbmcuaAorCitkd2FyZnJlYWQubzogZHdhcmZyZWFkLmMgJChiZmRfaCkgYnVpbGRzeW0uaCBjb21wbGFpbnRzLmggJChkZWZzX2gpIFwKKwkkKGV4cHJlc3Npb25faCkgJChnZGJ0eXBlc19oKSBsYW5ndWFnZS5oIG9iamZpbGVzLmggc3ltZmlsZS5oIFwKKwkkKHN5bXRhYl9oKSBnZGJfc3RyaW5nLmgKKworZHdhcmYycmVhZC5vOiBkd2FyZjJyZWFkLmMgJChiZmRfaCkgYnVpbGRzeW0uaCAkKGRlZnNfaCkgXAorCSQoZXhwcmVzc2lvbl9oKSAkKGdkYnR5cGVzX2gpIGxhbmd1YWdlLmggb2JqZmlsZXMuaCBzeW1maWxlLmggXAorCSQoc3ltdGFiX2gpIGdkYl9zdHJpbmcuaAorCitlbGZyZWFkLm86IGVsZnJlYWQuYyAkKGJmZF9oKSBidWlsZHN5bS5oIGNvbXBsYWludHMuaCAkKGRlZnNfaCkgXAorCWdkYi1zdGFicy5oIG9iamZpbGVzLmggc3ltZmlsZS5oICQoc3ltdGFiX2gpIGdkYl9zdHJpbmcuaCBcCisJJChCRkRfU1JDKS9lbGYtYmZkLmggJChJTkNMVURFX0RJUikvZWxmL21pcHMuaAorCitlbnZpcm9uLm86IGVudmlyb24uYyAkKGRlZnNfaCkgZW52aXJvbi5oICQoZ2RiY29yZV9oKSBnZGJfc3RyaW5nLmgKKworZXZhbC5vOiBldmFsLmMgJChiZmRfaCkgJChkZWZzX2gpICQoZXhwcmVzc2lvbl9oKSAkKGZyYW1lX2gpIFwKKwkkKGdkYnR5cGVzX2gpIGxhbmd1YWdlLmggJChzeW10YWJfaCkgdGFyZ2V0LmggJCh2YWx1ZV9oKSBcCisJZ2RiX3N0cmluZy5oCisKK2V4ZWMubzogZXhlYy5jICQoZGVmc19oKSAkKGdkYmNtZF9oKSAkKGdkYmNvcmVfaCkgJChpbmZlcmlvcl9oKSBcCisJdGFyZ2V0LmggbGFuZ3VhZ2UuaCBnZGJfc3RyaW5nLmgKKworZXhwcHJpbnQubzogZXhwcHJpbnQuYyAkKGRlZnNfaCkgJChleHByZXNzaW9uX2gpICQoZ2RidHlwZXNfaCkgXAorCWxhbmd1YWdlLmggcGFyc2VyLWRlZnMuaCAkKHN5bXRhYl9oKSAkKHZhbHVlX2gpCisKK2ZpbmR2YXIubzogZmluZHZhci5jICQoZGVmc19oKSAkKGdkYmNvcmVfaCkgJChpbmZlcmlvcl9oKSB0YXJnZXQuaCBcCisJZ2RiX3N0cmluZy5oCisKK2ZvcmstY2hpbGQubzogZm9yay1jaGlsZC5jICQod2FpdF9oKSAkKGRlZnNfaCkgJChnZGJjb3JlX2gpIFwKKwkkKGluZmVyaW9yX2gpIHRhcmdldC5oIHRlcm1pbmFsLmggZ2RidGhyZWFkLmggZ2RiX3N0cmluZy5oCisKK3RyYWNlcG9pbnQubzogdHJhY2Vwb2ludC5jICQoZGVmc19oKSAkKHN5bXRhYl9oKSAkKGZyYW1lX2gpICQodHJhY2Vwb2ludF9oKSBcCisJJChnZGJ0eXBlc19oKSAkKGV4cHJlc3Npb25faCkgJChnZGJjbWRfaCkgJCh2YWx1ZV9oKSB0YXJnZXQuaCBcCisJbGFuZ3VhZ2UuaCBnZGJfc3RyaW5nLmggJChyZWFkbGluZV9oZWFkZXJzKQorCitnZGJhcmNoLm86IGdkYmFyY2guYyAkKGRlZnNfaCkgJChiZmRfaCkgJChnZGJjbWRfaCkKKworZ2RidHlwZXMubzogZ2RidHlwZXMuYyAkKGJmZF9oKSBjb21wbGFpbnRzLmggJChkZWZzX2gpICQoZXhwcmVzc2lvbl9oKSBcCisJJChnZGJ0eXBlc19oKSBsYW5ndWFnZS5oIG9iamZpbGVzLmggc3ltZmlsZS5oICQoc3ltdGFiX2gpIHRhcmdldC5oIFwKKwkkKHZhbHVlX2gpIGdkYl9zdHJpbmcuaAorCitnbnUtbmF0Lm86IHByb2Nlc3NfcmVwbHlfUy5oIGV4Y19yZXF1ZXN0X1MuaCBub3RpZnlfUy5oIG1zZ19yZXBseV9TLmggXAorCWV4Y19yZXF1ZXN0X1UuaCBtc2dfVS5oIGdudS1uYXQuaAorCitnbzMyLXhkZXAubzogZ28zMi14ZGVwLmMKKworIyBPQlNPTEVURSBnb3VsZC10ZGVwLm86IGdvdWxkLXRkZXAuYyAkKE9QX0lOQ0xVREUpL25wMS5oICQoZGVmc19oKSAkKGZyYW1lX2gpIFwKKyMgT0JTT0xFVEUJJChnZGJjb3JlX2gpICQoc3ltdGFiX2gpCisKKyMgT0JTT0xFVEUgZ291bGQteGRlcC5vOiBnb3VsZC14ZGVwLmMgJChkZWZzX2gpICQoZ2RiY29yZV9oKSAkKGluZmVyaW9yX2gpCisKK2g4MzAwLXRkZXAubzogaDgzMDAtdGRlcC5jICQoZGVmc19oKSAkKGZyYW1lX2gpICQoc3ltdGFiX2gpCisKK2g4NTAwLXRkZXAubzogaDg1MDAtdGRlcC5jICQoYmZkX2gpICQoZGlzLWFzbV9oKSAkKGRlZnNfaCkgXAorCSQoZXhwcmVzc2lvbl9oKSAkKGZyYW1lX2gpICQoZ2RiY21kX2gpICQoZ2RidHlwZXNfaCkgJChzeW10YWJfaCkgXAorCSQodmFsdWVfaCkKKworaHAzMDB1eC1uYXQubzogaHAzMDB1eC1uYXQuYyAkKGRlZnNfaCkgJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkKKworaHBwYS10ZGVwLm86IGhwcGEtdGRlcC5jICQod2FpdF9oKSAkKGRlZnNfaCkgJChnZGJjbWRfaCkgJChnZGJjb3JlX2gpIFwKKwkkKGluZmVyaW9yX2gpIG9iamZpbGVzLmggc3ltZmlsZS5oIHRhcmdldC5oCisKK2hwcGFiLW5hdC5vOiBocHBhYi1uYXQuYyAkKGJmZF9oKSAkKGRlZnNfaCkgJChpbmZlcmlvcl9oKSB0YXJnZXQuaAorCitocHBhaC1uYXQubzogaHBwYWgtbmF0LmMgJChiZmRfaCkgJChkZWZzX2gpICQoaW5mZXJpb3JfaCkgdGFyZ2V0LmgKKworaTM4NmdudS1uYXQubzogZ251LW5hdC5oCisKK2kzODYtdGRlcC5vOiBpMzg2LXRkZXAuYyAkKGRlZnNfaCkgJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkgdGFyZ2V0LmggXAorCWdkYl9zdHJpbmcuaAorCitpMzg2YWl4LW5hdC5vOiBpMzg2YWl4LW5hdC5jICQoZGVmc19oKSAkKGZyYW1lX2gpICQoaW5mZXJpb3JfaCkgXAorCWxhbmd1YWdlLmggJChnZGJjb3JlX2gpICQoZmxvYXRmb3JtYXRfaCkgdGFyZ2V0LmgKKworaTM4NmItbmF0Lm86IGkzODZiLW5hdC5jICQoZGVmc19oKSAKKworaTM4Nmx5LW5hdC5vOiBpMzg2bHktbmF0LmMgJChkZWZzX2gpICQoZnJhbWVfaCkgJChpbmZlcmlvcl9oKSB0YXJnZXQuaAorCitpMzg2bHktdGRlcC5vOiBpMzg2bHktdGRlcC5jICQoZGVmc19oKSAkKGluZmVyaW9yX2gpIHRhcmdldC5oICQoZ2RiY29yZV9oKQorCitpMzg2bTMtbmF0Lm86IGkzODZtMy1uYXQuYyAkKGRlZnNfaCkgJChpbmZlcmlvcl9oKSAkKGZsb2F0Zm9ybWF0X2gpIHRhcmdldC5oCisKK2kzODZtYWNoLW5hdC5vOiBpMzg2bWFjaC1uYXQuYyAkKGRlZnNfaCkgJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkgCisKK2kzODZ2LW5hdC5vOiBpMzg2di1uYXQuYyAkKGZsb2F0Zm9ybWF0X2gpICQoZGVmc19oKSAkKGdkYmNvcmVfaCkgXAorCSQoaW5mZXJpb3JfaCkgbGFuZ3VhZ2UuaCB0YXJnZXQuaAorCitpMzg2djQtbmF0Lm86IGkzODZ2NC1uYXQuYyAkKGRlZnNfaCkKKworaTM4Ny10ZGVwLm86IGkzODctdGRlcC5jICQoZmxvYXRmb3JtYXRfaCkgJChkZWZzX2gpICQoZ2RiY29yZV9oKSBcCisJJChpbmZlcmlvcl9oKSBsYW5ndWFnZS5oCisKK2k5NjAtdGRlcC5vOiBpOTYwLXRkZXAuYyAkKGZsb2F0Zm9ybWF0X2gpICQoZGVmc19oKSAkKGV4cHJlc3Npb25faCkgXAorCSQoZnJhbWVfaCkgJChnZGJ0eXBlc19oKSAkKHN5bXRhYl9oKSAkKHZhbHVlX2gpICQoZ2RiY29yZV9oKQorCitpbmZjbWQubzogaW5mY21kLmMgJChkZWZzX2gpIGVudmlyb24uaCAkKGdkYmNtZF9oKSAkKGdkYmNvcmVfaCkgXAorCSQoaW5mZXJpb3JfaCkgdGFyZ2V0LmggbGFuZ3VhZ2UuaCBnZGJfc3RyaW5nLmgKKworaW5mbG93Lm86IGluZmxvdy5jICQoYmZkX2gpICQoY29tbWFuZF9oKSAkKGRlZnNfaCkgJChpbmZlcmlvcl9oKSBcCisJc2lnbmFscy5oIHRhcmdldC5oIHRlcm1pbmFsLmggZ2RidGhyZWFkLmggZ2RiX3N0cmluZy5oCisKK2luZnB0cmFjZS5vOiBpbmZwdHJhY2UuYyAkKGRlZnNfaCkgJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkgdGFyZ2V0LmggXAorCWdkYl9zdHJpbmcuaCAkKHdhaXRfaCkgJChjb21tYW5kX2gpCisKK2luZnJ1bi5vOiBpbmZydW4uYyAkKHdhaXRfaCkgJChkZWZzX2gpICQoZ2RiY21kX2gpICQoZ2RiY29yZV9oKSBcCisJJChpbmZlcmlvcl9oKSB0YXJnZXQuaCBnZGJ0aHJlYWQuaCBnZGJfc3RyaW5nLmgKKworaW5mdGFyZy5vOiBpbmZ0YXJnLmMgJCh3YWl0X2gpICQoZGVmc19oKSAkKGdkYmNvcmVfaCkgJChpbmZlcmlvcl9oKSBcCisJdGFyZ2V0LmggdGVybWluYWwuaCAkKGNvbW1hbmRfaCkKKworaXJpeDQtbmF0Lm86IGlyaXg0LW5hdC5jICQoZGVmc19oKSAkKGluZmVyaW9yX2gpICQoZ2RiY29yZV9oKQoraXJpeDUtbmF0Lm86IGlyaXg1LW5hdC5jICQoZGVmc19oKSAkKGluZmVyaW9yX2gpICQoZ2RiY29yZV9oKSB0YXJnZXQuaCBcCisJJChzeW10YWJfaCkgc3ltZmlsZS5oIG9iamZpbGVzLmggJChjb21tYW5kX2gpICQoZnJhbWVfaCkgZ251LXJlZ2V4LmggXAorCWxhbmd1YWdlLmggZ2RiX3N0cmluZy5oCisKK2lzaS14ZGVwLm86IGlzaS14ZGVwLmMKKworanYtbGFuZy5vOiBqdi1sYW5nLmMgJChiZmRfaCkgJChkZWZzX2gpICQoc3ltdGFiX2gpICQoZ2RidHlwZXNfaCkgXAorCSQoZXhwcmVzc2lvbl9oKSBwYXJzZXItZGVmcy5oIGxhbmd1YWdlLmggc3ltZmlsZS5oIG9iamZpbGVzLmggXAorCWdkYl9zdHJpbmcuaCAkKHZhbHVlX2gpIGMtbGFuZy5oIGp2LWxhbmcuaCAkKGdkYmNvcmVfaCkKKworanYtdHlwZXByaW50Lm86IGp2LXR5cGVwcmludC5jICQoYmZkX2gpICQoZGVmc19oKSAkKHN5bXRhYl9oKSAkKGdkYnR5cGVzX2gpIFwKKwkkKHZhbHVlX2gpICQoSU5DTFVERV9ESVIpL2RlbWFuZ2xlLmgganYtbGFuZy5oIGdkYl9zdHJpbmcuaCBcCisJdHlwZXByaW50LmgKKworanYtdmFscHJpbnQubzoganYtdmFscHJpbnQuYyAkKGJmZF9oKSAkKGRlZnNfaCkgJChzeW10YWJfaCkgJChnZGJ0eXBlc19oKSBcCisJJChleHByZXNzaW9uX2gpICQodmFsdWVfaCkgJChJTkNMVURFX0RJUikvZGVtYW5nbGUuaCB2YWxwcmludC5oIFwKKwlsYW5ndWFnZS5oIGp2LWxhbmcuaCBjLWxhbmcuaAorCitsYW5ndWFnZS5vOiBsYW5ndWFnZS5jICQoYmZkX2gpICQoZGVmc19oKSAkKGV4cHJlc3Npb25faCkgJChmcmFtZV9oKSBcCisJJChnZGJjbWRfaCkgJChnZGJ0eXBlc19oKSBsYW5ndWFnZS5oIHBhcnNlci1kZWZzLmggJChzeW10YWJfaCkgXAorCXRhcmdldC5oICQodmFsdWVfaCkgZ2RiX3N0cmluZy5oCisKK2x5bngtbmF0Lm86IGx5bngtbmF0LmMgJChkZWZzX2gpICQoZnJhbWVfaCkgJChpbmZlcmlvcl9oKSAkKGdkYmNvcmVfaCkgXAorCXRhcmdldC5oCisKK20yLWxhbmcubzogbTItbGFuZy5jICQoZGVmc19oKSAkKGV4cHJlc3Npb25faCkgJChnZGJ0eXBlc19oKSBcCisJbGFuZ3VhZ2UuaCBtMi1sYW5nLmggcGFyc2VyLWRlZnMuaCAkKHN5bXRhYl9oKQorCittMi10eXBlcHJpbnQubzogbTItdHlwZXByaW50LmMgJChkZWZzX2gpICQoZXhwcmVzc2lvbl9oKSAkKGdkYmNtZF9oKSBcCisJJChnZGJjb3JlX2gpICQoZ2RidHlwZXNfaCkgbGFuZ3VhZ2UuaCBtMi1sYW5nLmggJChzeW10YWJfaCkgdGFyZ2V0LmggXAorCSQodmFsdWVfaCkgZ2RiX3N0cmluZy5oCisKK20yLXZhbHByaW50Lm86IG0yLXZhbHByaW50LmMgJChkZWZzX2gpICQoZ2RidHlwZXNfaCkgJChzeW10YWJfaCkgXAorCXZhbHByaW50LmggbTItbGFuZy5oCisKK20zLW5hdC5vOiBtMy1uYXQuYyAkKGRlZnNfaCkgJChpbmZlcmlvcl9oKSAkKHZhbHVlX2gpIGxhbmd1YWdlLmggdGFyZ2V0LmggXAorCSQod2FpdF9oKSAkKGdkYmNtZF9oKSAkKGdkYmNvcmVfaCkKKworbTY4ay10ZGVwLm86IG02OGstdGRlcC5jICQoZGVmc19oKSAkKGZyYW1lX2gpICQoc3ltdGFiX2gpICQodmFsdWVfaCkgXAorCSQoZ2RiY29yZV9oKSBnZGJfc3RyaW5nLmgKKworbTY4a2x5LW5hdC5vOiBtNjhrbHktbmF0LmMgJChkZWZzX2gpICQoZnJhbWVfaCkgJChpbmZlcmlvcl9oKSB0YXJnZXQuaAorCittNjhrbGludXgtbmF0Lm86IG02OGtsaW51eC1uYXQuYyAkKGRlZnNfaCkgJChmcmFtZV9oKSAkKGluZmVyaW9yX2gpIFwKKwkkKGxhbmd1YWdlX2gpICQoZ2RiY29yZV9oKSAkKGZsb2F0Zm9ybWF0X2gpIHRhcmdldC5oCisKK204OGstbmF0Lm86IG04OGstbmF0LmMgJChkZWZzX2gpICQoZ2RiY29yZV9oKSAkKGluZmVyaW9yX2gpCisKK204OGstdGRlcC5vOiBtODhrLXRkZXAuYyAkKGRlZnNfaCkgJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkKKworbWFjLW5hdC5vOiBtYWMtbmF0LmMgJChkZWZzX2gpIGdkYl9zdHJpbmcuaAorCittYWluLm86IG1haW4uYyB0b3AuaCAkKGRlZnNfaCkgZ2RiX3N0cmluZy5oCisKK21haW50Lm86IG1haW50LmMgJChkZWZzX2gpICQoZ2RiY21kX2gpICQoZ2RidHlwZXNfaCkgJChzeW10YWJfaCkgbGFuZ3VhZ2UuaCBcCisJJChleHByZXNzaW9uX2gpIG9iamZpbGVzLmggc3ltZmlsZS5oCisKK21kZWJ1Z3JlYWQubzogbWRlYnVncmVhZC5jIGJ1aWxkc3ltLmggY29tcGxhaW50cy5oICQoYmZkX2gpICQoZGVmc19oKSBcCisJJChleHByZXNzaW9uX2gpIGdkYi1zdGFicy5oICQoZ2RiY29yZV9oKSAkKGdkYnR5cGVzX2gpIGxhbmd1YWdlLmggXAorCW9iamZpbGVzLmggcGFydGlhbC1zdGFiLmggc3RhYnNyZWFkLmggc3ltZmlsZS5oICQoc3ltdGFiX2gpIFwKKwlnZGJfc3RyaW5nLmgKKworbWlwc20zLW5hdC5vOiBtaXBzbTMtbmF0LmMgJChkZWZzX2gpICQoaW5mZXJpb3JfaCkKKworb3M5a3JlYWQubzogb3M5a3JlYWQuYyBidWlsZHN5bS5oIGNvbXBsYWludHMuaCAkKGJmZF9oKSAkKGRlZnNfaCkgXAorICAgICAgICAkKGV4cHJlc3Npb25faCkgZ2RiLXN0YWJzLmggJChnZGJjb3JlX2gpICQoZ2RidHlwZXNfaCkgbGFuZ3VhZ2UuaCBcCisgICAgICAgIG9iamZpbGVzLmggc3RhYnNyZWFkLmggc3ltZmlsZS5oICQoc3ltdGFiX2gpIFwKKwl0YXJnZXQuaCBnZGJfc3RyaW5nLmgKKworbWVtLWJyZWFrLm86IG1lbS1icmVhay5jICQoZGVmc19oKSAKKworbWluc3ltcy5vOiBtaW5zeW1zLmMgJChiZmRfaCkgJChkZWZzX2gpIG9iamZpbGVzLmggc3ltZmlsZS5oIFwKKwkkKHN5bXRhYl9oKSBnZGJfc3RyaW5nLmgKKworbWlwcy1uYXQubzogbWlwcy1uYXQuYyAkKGRlZnNfaCkgJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkgCisKK21pcHMtdGRlcC5vOiBtaXBzLXRkZXAuYyAkKGRlZnNfaCkgJChnZGJjbWRfaCkgJChnZGJjb3JlX2gpIFwKKwkkKGluZmVyaW9yX2gpIGxhbmd1YWdlLmggb2JqZmlsZXMuaCBzeW1maWxlLmggZ2RiX3N0cmluZy5oCisKK21pcHNyZWFkLm86IG1pcHNyZWFkLmMgYnVpbGRzeW0uaCBjb21wbGFpbnRzLmggJChiZmRfaCkgJChkZWZzX2gpIFwKKwkkKGV4cHJlc3Npb25faCkgZ2RiLXN0YWJzLmggJChnZGJjb3JlX2gpICQoZ2RidHlwZXNfaCkgbGFuZ3VhZ2UuaCBcCisJb2JqZmlsZXMuaCBwYXJ0aWFsLXN0YWIuaCBzdGFic3JlYWQuaCBzeW1maWxlLmggJChzeW10YWJfaCkgXAorCWdkYl9zdHJpbmcuaAorCittaXBzdjQtbmF0Lm86IG1pcHN2NC1uYXQuYyAkKGRlZnNfaCkgJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkgdGFyZ2V0LmgKKworbW9uaXRvci5vOiBtb25pdG9yLmMgbW9uaXRvci5oICQoYmZkX2gpICQod2FpdF9oKSAkKGRlZnNfaCkgJChnZGJjbWRfaCkgXAorCSQoaW5mZXJpb3JfaCkgdGFyZ2V0Lmggc2VyaWFsLmggdGVybWluYWwuaCBnZGJfc3RyaW5nLmgKKworbmV3cy14ZGVwLm86IG5ld3MteGRlcC5jCisKK09uaW5keS5vOiBuaW5keS1zaGFyZS9PbmluZHkuYyAkKHdhaXRfaCkgbmluZHktc2hhcmUvYmxvY2tfaW8uaCBcCisJbmluZHktc2hhcmUvZW52LmgKKwkkKENDKSAtYyAkKElOVEVSTkFMX0NGTEFHUykgJChzcmNkaXIpL25pbmR5LXNoYXJlL09uaW5keS5jCisKK25pbmR5Lm86IG5pbmR5LXNoYXJlL25pbmR5LmMgJCh3YWl0X2gpIG5pbmR5LXNoYXJlL2Jsb2NrX2lvLmggXAorCW5pbmR5LXNoYXJlL2Vudi5oCisJJChDQykgLWMgJChJTlRFUk5BTF9DRkxBR1MpICQoc3JjZGlyKS9uaW5keS1zaGFyZS9uaW5keS5jCisKK25sbXJlYWQubzogbmxtcmVhZC5jICQoYmZkX2gpIGJ1aWxkc3ltLmggY29tcGxhaW50cy5oICQoZGVmc19oKSBcCisJZ2RiLXN0YWJzLmggb2JqZmlsZXMuaCBzeW1maWxlLmggJChzeW10YWJfaCkgc3RhYnNyZWFkLmggXAorCWdkYl9zdHJpbmcuaAorCituczMya20zLW5hdC5vOiBuczMya20zLW5hdC5jICQoZGVmc19oKSAkKGluZmVyaW9yX2gpCisKK3R0eWZsdXNoLm86IG5pbmR5LXNoYXJlL3R0eWZsdXNoLmMKKwkkKENDKSAtYyAkKElOVEVSTkFMX0NGTEFHUykgJChzcmNkaXIpL25pbmR5LXNoYXJlL3R0eWZsdXNoLmMKKworbmluZHktdGRlcC5vOiBuaW5keS10ZGVwLmMgJChkZWZzX2gpICQoZnJhbWVfaCkgJChzeW10YWJfaCkgICQoZ2RiY29yZV9oKQorCituczMyay10ZGVwLm86IG5zMzJrLXRkZXAuYyAkKGJmZF9oKSAkKGRpcy1hc21faCkgJChkZWZzX2gpCisKK29iamZpbGVzLm86IG9iamZpbGVzLmMgJChiZmRfaCkgJChkZWZzX2gpIG9iamZpbGVzLmggc3ltZmlsZS5oIFwKKwkkKHN5bXRhYl9oKSBnZGJfc3RyaW5nLmgKKworb3Nmc29saWIubzogb3Nmc29saWIuYyAkKGNvbW1hbmRfaCkgJChkZWZzX2gpICQoZ2RiY29yZV9oKSAkKGluZmVyaW9yX2gpIFwKKwlvYmpmaWxlcy5oIGdudS1yZWdleC5oIHN5bWZpbGUuaCB0YXJnZXQuaCBsYW5ndWFnZS5oIGdkYl9zdHJpbmcuaAorCitzb21yZWFkLm86IHNvbXJlYWQuYyAkKGJmZF9oKSBidWlsZHN5bS5oIGNvbXBsYWludHMuaCAkKGRlZnNfaCkgXAorCWdkYi1zdGFicy5oIG9iamZpbGVzLmggc3ltZmlsZS5oICQoc3ltdGFiX2gpIGdkYl9zdHJpbmcuaAorCitzb21zb2xpYi5vOiBzb21zb2xpYi5jICQoZGVmc19oKQorCitocHV4LXRocmVhZC5vOiBocHV4LXRocmVhZC5jICQoZGVmc19oKSBnZGJ0aHJlYWQuaCB0YXJnZXQuaCBpbmZlcmlvci5oCisJJChDQykgLWMgJChJTlRFUk5BTF9DRkxBR1MpIC1JJChzcmNkaXIpL29zZi1zaGFyZSBcCisJICAtSSQoc3JjZGlyKS9vc2Ytc2hhcmUvSFA4MDAgLUkvdXNyL2luY2x1ZGUvZGNlICQoc3JjZGlyKS9ocHV4LXRocmVhZC5jCisKKyMgRklYTUUhISEKK2hwcmVhZC5vOiBocHJlYWQuYyAkKGJmZF9oKSBidWlsZHN5bS5oIGNvbXBsYWludHMuaCAkKGRlZnNfaCkgXAorCWdkYi1zdGFicy5oIG9iamZpbGVzLmggc3ltZmlsZS5oICQoc3ltdGFiX2gpIGdkYl9zdHJpbmcuaAorCitocC1wc3ltdGFiLXJlYWQubzogaHAtcHN5bXRhYi1yZWFkLmMgaHByZWFkLmggJChiZmRfaCkgYnVpbGRzeW0uaCBjb21wbGFpbnRzLmggXAorCSQoZGVmc19oKSBnZGItc3RhYnMuaCBvYmpmaWxlcy5oIHN5bWZpbGUuaCAkKHN5bXRhYl9oKSBnZGJfc3RyaW5nLmgKKyAKK2hwLXN5bXRhYi1yZWFkLm86IGhwLXN5bXRhYi1yZWFkLmMgaHByZWFkLmggJChiZmRfaCkgYnVpbGRzeW0uaCBjb21wbGFpbnRzLmggXAorCSQoZGVmc19oKSBnZGItc3RhYnMuaCBvYmpmaWxlcy5oIHN5bWZpbGUuaCAkKHN5bXRhYl9oKSBnZGJfc3RyaW5nLmgKKyMgRU5EIEZJWE1FISEhICAKKworcGFyc2UubzogcGFyc2UuYyAkKGNvbW1hbmRfaCkgJChkZWZzX2gpICQoZXhwcmVzc2lvbl9oKSAkKGZyYW1lX2gpIFwKKwkkKGdkYnR5cGVzX2gpIGxhbmd1YWdlLmggcGFyc2VyLWRlZnMuaCAkKHN5bXRhYl9oKSAkKHZhbHVlX2gpIFwKKwlnZGJfc3RyaW5nLmgKKworcHBjLWJkbS5vOiBwcGMtYmRtLmMgJChkZWZzX2gpICQoZ2RiY29yZV9oKSBnZGJfc3RyaW5nLmggJChmcmFtZV9oKSBcCisJJChpbmZlcmlvcl9oKSAkKGJmZF9oKSBzeW1maWxlLmggdGFyZ2V0LmggJCh3YWl0X2gpICQoZ2RiY21kX2gpIFwKKwlvYmpmaWxlcy5oIGdkYi1zdGFicy5oIHNlcmlhbC5oIG9jZC5oCisKK3BwY2J1Zy1yb20ubzogcHBjYnVnLXJvbS5jIG1vbml0b3IuaCAkKGJmZF9oKSAkKHdhaXRfaCkgJChkZWZzX2gpICQoZ2RiY21kX2gpIFwKKwkkKGluZmVyaW9yX2gpIHRhcmdldC5oIHNlcmlhbC5oIHRlcm1pbmFsLmgKKworcHJpbnRjbWQubzogcHJpbnRjbWQuYyAkKGJyZWFrcG9pbnRfaCkgJChkZWZzX2gpICQoZXhwcmVzc2lvbl9oKSBcCisJJChnZGJjbWRfaCkgJChnZGJjb3JlX2gpICQoZ2RidHlwZXNfaCkgbGFuZ3VhZ2UuaCBvYmpmaWxlcy5oIFwKKwlzeW1maWxlLmggJChzeW10YWJfaCkgdGFyZ2V0LmggZ2RiX3N0cmluZy5oCisKK3Byb2Nmcy5vOiBwcm9jZnMuYyAkKGNvbW1hbmRfaCkgJChkZWZzX2gpICQoZ2RiY29yZV9oKSAkKGluZmVyaW9yX2gpIFwKKwl0YXJnZXQuaCBnZGJfc3RyaW5nLmgKKworcHlyLXRkZXAubzogcHlyLXRkZXAuYyAkKGRlZnNfaCkgCisKK3B5ci14ZGVwLm86IHB5ci14ZGVwLmMgJChkZWZzX2gpICQoZ2RiY29yZV9oKSAkKGluZmVyaW9yX2gpIAorCitnbnUtcmVnZXgubzogZ251LXJlZ2V4LmMgZ251LXJlZ2V4LmggJChkZWZzX2gpIGdkYl9zdHJpbmcuaAorCityZW1vdGUtYWRhcHQubzogcmVtb3RlLWFkYXB0LmMgJCh3YWl0X2gpICQoZGVmc19oKSAkKGdkYmNvcmVfaCkgXAorCSQoaW5mZXJpb3JfaCkgdGFyZ2V0LmggdGVybWluYWwuaCBnZGJfc3RyaW5nLmgKKworcmVtb3RlLWFycmF5Lm86IHJlbW90ZS1hcnJheS5jICQod2FpdF9oKSAkKGRlZnNfaCkgJChnZGJjb3JlX2gpIHRhcmdldC5oIFwKKyAgICAgIGdkYl9zdHJpbmcuaCAkKGNvbW1hbmRfaCkgc2VyaWFsLmggbW9uaXRvci5oICQocmVtb3RlX3V0aWxzX2gpCisKK3JlbW90ZS1yZGkubzogcmVtb3RlLXJkaS5jICQod2FpdF9oKSAkKGRlZnNfaCkgJChnZGJjb3JlX2gpIFwKKwkkKGluZmVyaW9yX2gpIGdkYl9zdHJpbmcuaAorCityZGktc2hhcmUvbGliYW5nc2QuYToJZm9yY2UKKwlAZGlyPXJkaS1zaGFyZTsgXAorCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKKwkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCisJICBzcmNyb290PWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzcmNyb290OyBcCisJICAoY2QgJCR7ZGlyfTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGFsbCk7IFwKKwllbHNlIFwKKwkgIHRydWU7IFwKKwlmaQorCityZW1vdGUtZDEwdi5vOiByZW1vdGUtZDEwdi5jICQoYmZkX2gpICQod2FpdF9oKSAkKGRlZnNfaCkgJChnZGJjbWRfaCkgXAorCSQoaW5mZXJpb3JfaCkgJChyZW1vdGVfdXRpbHNfaCkgc3ltZmlsZS5oIHRlcm1pbmFsLmggZ2RiX3N0cmluZy5oCisKK3JlbW90ZS1yZHAubzogcmVtb3RlLXJkcC5jICQod2FpdF9oKSAkKGRlZnNfaCkgJChnZGJjb3JlX2gpIFwKKwkkKGluZmVyaW9yX2gpIGdkYl9zdHJpbmcuaAorCityZW1vdGUtYnVnLm86IHJlbW90ZS1idWcuYyAkKHdhaXRfaCkgJChkZWZzX2gpICQoZ2RiY29yZV9oKSBcCisJJChpbmZlcmlvcl9oKSB0YXJnZXQuaCB0ZXJtaW5hbC5oICQocmVtb3RlX3V0aWxzX2gpIGdkYl9zdHJpbmcuaAorCityZW1vdGUtZTcwMDAubzogcmVtb3RlLWU3MDAwLmMgJChkZWZzX2gpICQoZ2RiY29yZV9oKSB0YXJnZXQuaCBcCisJJCh3YWl0X2gpIHNlcmlhbC5oIGdkYl9zdHJpbmcuaAorCityZW1vdGUtZWIubzogcmVtb3RlLWViLmMgJCh3YWl0X2gpICQoc3JjZGlyKS9jb25maWcvYTI5ay90bS1hMjlrLmggXAorCSQoZGVmc19oKSAkKGdkYmNvcmVfaCkgJChpbmZlcmlvcl9oKSBzeW1maWxlLmggdGFyZ2V0LmggdGVybWluYWwuaCBcCisJZ2RiX3N0cmluZy5oCisKK3JlbW90ZS1lcy5vOiByZW1vdGUtZXMuYyAkKGJmZF9oKSAkKHdhaXRfaCkgJChjb21tYW5kX2gpICQoZGVmc19oKSBcCisJJChpbmZlcmlvcl9oKSAkKHJlbW90ZV91dGlsc19oKSB0ZXJtaW5hbC5oIGdkYl9zdHJpbmcuaAorCityZW1vdGUtaG1zLm86IHJlbW90ZS1obXMuYyAkKHdhaXRfaCkgJChkZWZzX2gpICQoZ2RiY29yZV9oKSBcCisJJChpbmZlcmlvcl9oKSBzZXJpYWwuaCB0YXJnZXQuaCB0ZXJtaW5hbC5oIGdkYl9zdHJpbmcuaAorCityZW1vdGUtbWlwcy5vOiByZW1vdGUtbWlwcy5jICQod2FpdF9oKSAkKGRlZnNfaCkgJChnZGJjbWRfaCkgXAorCSQoZ2RiY29yZV9oKSAkKGluZmVyaW9yX2gpIHNlcmlhbC5oIHN5bWZpbGUuaCB0YXJnZXQuaAorCityZW1vdGUtbW0ubzogcmVtb3RlLW1tLmMgJChiZmRfaCkgJCh3YWl0X2gpICQoZGVmc19oKSAkKGluZmVyaW9yX2gpIFwKKwltaW5pbW9uLmggdGFyZ2V0LmggdGVybWluYWwuaCBnZGJfc3RyaW5nLmgKKworcmVtb3RlLW5pbmR5Lm86IHJlbW90ZS1uaW5keS5jICQoZmxvYXRmb3JtYXRfaCkgJCh3YWl0X2gpICQoY29tbWFuZF9oKSBcCisJJChkZWZzX2gpICQoZ2RiY29yZV9oKSAkKGluZmVyaW9yX2gpIFwKKwluaW5keS1zaGFyZS9lbnYuaCBuaW5keS1zaGFyZS9zdG9wLmggJChyZW1vdGVfdXRpbHNfaCkgXAorCXN5bWZpbGUuaAorCityZW1vdGUtb3M5ay5vOiByZW1vdGUtb3M5ay5jICQoZGVmc19oKSAkKGdkYmNvcmVfaCkgJCh3YWl0X2gpIFwKKwkkKGNvbW1hbmRfaCkgbW9uaXRvci5oICQocmVtb3RlX3V0aWxzX2gpICQoc3ltdGFiX2gpIHN5bWZpbGUuaCBcCisJb2JqZmlsZXMuaCBnZGItc3RhYnMuaCBnZGJfc3RyaW5nLmgKKworcmVtb3RlLXNkcy5vOiByZW1vdGUtc2RzLmMgJChiZmRfaCkgJCh3YWl0X2gpICQoZGVmc19oKSAkKGdkYmNtZF9oKSBcCisJJChpbmZlcmlvcl9oKSAkKHJlbW90ZV91dGlsc19oKSBzeW1maWxlLmggdGVybWluYWwuaCBnZGJfc3RyaW5nLmgKKworcmVtb3RlLXNpbS5vOiByZW1vdGUtc2ltLmMgJCh3YWl0X2gpICQoZGVmc19oKSAkKGdkYmNvcmVfaCkgXAorCSQoaW5mZXJpb3JfaCkgdGFyZ2V0LmggdGVybWluYWwuaCBnZGJfc3RyaW5nLmggXAorCSQoSU5DTFVERV9ESVIpL2NhbGxiYWNrLmgKKworcmVtb3RlLXN0Lm86IHJlbW90ZS1zdC5jICQod2FpdF9oKSAkKGRlZnNfaCkgJChnZGJjb3JlX2gpIHNlcmlhbC5oIFwKKwl0YXJnZXQuaCBnZGJfc3RyaW5nLmgKKworcmVtb3RlLXVkaS5vOiByZW1vdGUtdWRpLmMgJChiZmRfaCkgJCh3YWl0X2gpICQoZGVmc19oKSAkKGdkYmNtZF9oKSBcCisJJChpbmZlcmlvcl9oKSB0YXJnZXQuaCB0ZXJtaW5hbC5oICQodWRpaGVhZGVycykgZ2RiX3N0cmluZy5oCisKK3JlbW90ZS12eC5vOiByZW1vdGUtdnguYyAkKHdhaXRfaCkgY29tcGxhaW50cy5oICQoZGVmc19oKSAkKGdkYmNtZF9oKSBcCisJJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkgdGFyZ2V0Lmggdngtc2hhcmUvZGJnUnBjTGliLmggXAorCXZ4LXNoYXJlL3B0cmFjZS5oIHZ4LXNoYXJlL3hkcl9sZC5oIHZ4LXNoYXJlL3hkcl9wdHJhY2UuaCBcCisJdngtc2hhcmUveGRyX3JkYi5oIGdkYi1zdGFicy5oIG9iamZpbGVzLmggc3ltZmlsZS5oICQoYmZkX2gpIFwKKwlnZGJfc3RyaW5nLmgKKworcmVtb3RlLXZ4MjlrLm86IHJlbW90ZS12eDI5ay5jICQod2FpdF9oKSBjb21wbGFpbnRzLmggJChkZWZzX2gpICQoZ2RiY21kX2gpIFwKKyAgICAgICAgJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkgdGFyZ2V0Lmggdngtc2hhcmUvZGJnUnBjTGliLmggXAorICAgICAgICB2eC1zaGFyZS9wdHJhY2UuaCB2eC1zaGFyZS94ZHJfbGQuaCB2eC1zaGFyZS94ZHJfcHRyYWNlLmggXAorICAgICAgICB2eC1zaGFyZS94ZHJfcmRiLmggZ2RiX3N0cmluZy5oCisKK29jZC5vOiBvY2QuYyBvY2QuaCAkKGdkYmNvcmVfaCkgZ2RiX3N0cmluZy5oICQoZnJhbWVfaCkgJChpbmZlcmlvcl9oKSBcCisJJChiZmRfaCkgc3ltZmlsZS5oIHRhcmdldC5oICQod2FpdF9oKSAkKGdkYmNtZF9oKSBvYmpmaWxlcy5oIFwKKwlnZGItc3RhYnMuaCAkKGRjYWNoZV9oKSBzZXJpYWwuaAorCityZW1vdGUtdXRpbHMubzogcmVtb3RlLXV0aWxzLmMgJChkZWZzX2gpICQoZ2RiY21kX2gpICQoZ2RiY29yZV9oKSBcCisJJChpbmZlcmlvcl9oKSAkKHJlbW90ZV91dGlsc19oKSBnZGJfc3RyaW5nLmgKKworcmVtb3RlLm86IHJlbW90ZS5jICQoYmZkX2gpICQod2FpdF9oKSAkKGRlZnNfaCkgJChnZGJjbWRfaCkgXAorCSQoaW5mZXJpb3JfaCkgJChyZW1vdGVfdXRpbHNfaCkgc3ltZmlsZS5oIHRlcm1pbmFsLmggZ2RiX3N0cmluZy5oCisKK3JlbW90ZS1ucm9tLm86IHJlbW90ZS1ucm9tLmMgJChiZmRfaCkgJCh3YWl0X2gpICQoZGVmc19oKSAkKGdkYmNtZF9oKSBcCisJJChpbmZlcmlvcl9oKSAkKHJlbW90ZV91dGlsc19oKSBzeW1maWxlLmggdGVybWluYWwuaAorCityb202OGstcm9tLm86IHJvbTY4ay1yb20uYyBtb25pdG9yLmggJChiZmRfaCkgJCh3YWl0X2gpICQoZGVmc19oKSAkKGdkYmNtZF9oKSBcCisJJChpbmZlcmlvcl9oKSB0YXJnZXQuaCBzZXJpYWwuaCB0ZXJtaW5hbC5oCisKK3JzNjAwMC1uYXQubzogcnM2MDAwLW5hdC5jICQoYmZkX2gpICQoZGVmc19oKSAkKGluZmVyaW9yX2gpIHRhcmdldC5oIFwKKwl4Y29mZnNvbGliLmgKKworcnM2MDAwLXRkZXAubzogcnM2MDAwLXRkZXAuYyAkKGRlZnNfaCkgJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkgXAorCXRhcmdldC5oIHhjb2Zmc29saWIuaAorCitzY20tZXhwLm86ICQoZGVmc19oKSAkKHZhbHVlX2gpIHBhcnNlci1kZWZzLmggbGFuZ3VhZ2UuaCBjLWxhbmcuaCBcCisJc2NtLWxhbmcuaCBzY20tdGFncy5oCisKK3NjbS1sYW5nLm86ICQoZGVmc19oKSAkKHZhbHVlX2gpIHBhcnNlci1kZWZzLmggbGFuZ3VhZ2UuaCBjLWxhbmcuaCBcCisJc2NtLWxhbmcuaCBzY20tdGFncy5oIGdkYl9zdHJpbmcuaCAkKGdkYmNvcmVfaCkKKworc2NtLXZhbHByaW50Lm86ICQoZGVmc19oKSAkKHZhbHVlX2gpIHBhcnNlci1kZWZzLmggbGFuZ3VhZ2UuaCAgXAorCXNjbS1sYW5nLmggdmFscHJpbnQuaCAkKGdkYmNvcmVfaCkKKworc2VyLWdvMzIubzogc2VyLWdvMzIuYyAkKGRlZnNfaCkgc2VyaWFsLmggCisKK3Nlci1tYWMubzogc2VyLW1hYy5jICQoZGVmc19oKSBzZXJpYWwuaCBzaWduYWxzLmgKKworc2VyLW9jZC5vOiBzZXItb2NkLmMgJChkZWZzX2gpIHNlcmlhbC5oIHNpZ25hbHMuaCBnZGJfc3RyaW5nLmgKKworc2VyLXRjcC5vOiBzZXItdGNwLmMgJChkZWZzX2gpIHNlcmlhbC5oIHNpZ25hbHMuaCBnZGJfc3RyaW5nLmgKKworc2VyLXVuaXgubzogc2VyLXVuaXguYyAkKGRlZnNfaCkgc2VyaWFsLmggCisKK3NlcmlhbC5vOiBzZXJpYWwuYyAkKGRlZnNfaCkgc2VyaWFsLmggZ2RiX3N0cmluZy5oCisKK3NoLXRkZXAubzogc2gtdGRlcC5jICQoYmZkX2gpICQoZGlzLWFzbV9oKSBcCisJJChzcmNkaXIpLy4uL29wY29kZXMvc2gtb3BjLmggJChkZWZzX2gpICQoZXhwcmVzc2lvbl9oKSAkKGZyYW1lX2gpIFwKKwkkKGdkYmNtZF9oKSAkKGdkYnR5cGVzX2gpICQoc3ltdGFiX2gpICQodmFsdWVfaCkKKworc2gzLXJvbS5vOiBzaDMtcm9tLmMgbW9uaXRvci5oICQoYmZkX2gpICQod2FpdF9oKSAkKGRlZnNfaCkgJChnZGJjbWRfaCkgXAorCSQoaW5mZXJpb3JfaCkgdGFyZ2V0Lmggc2VyaWFsLmggdGVybWluYWwuaAorCittb245NjAtcm9tLm86IG1vbjk2MC1yb20uYyBtb25pdG9yLmggJChiZmRfaCkgJCh3YWl0X2gpICQoZGVmc19oKSAkKGdkYmNtZF9oKSBcCisJJChpbmZlcmlvcl9oKSB0YXJnZXQuaCBzZXJpYWwuaCB0ZXJtaW5hbC5oCisKK3NvbGliLm86IHNvbGliLmMgJChjb21tYW5kX2gpICQoZGVmc19oKSAkKGdkYmNvcmVfaCkgJChpbmZlcmlvcl9oKSBcCisJb2JqZmlsZXMuaCBnbnUtcmVnZXguaCBzeW1maWxlLmggdGFyZ2V0LmggZ2RiX3N0cmluZy5oCisKK3NvdXJjZS5vOiBzb3VyY2UuYyAkKGRlZnNfaCkgJChleHByZXNzaW9uX2gpICQoZnJhbWVfaCkgJChnZGJjbWRfaCkgXAorCSQoZ2RiY29yZV9oKSBsYW5ndWFnZS5oIG9iamZpbGVzLmggZ251LXJlZ2V4Lmggc3ltZmlsZS5oICQoc3ltdGFiX2gpIFwKKwlnZGJfc3RyaW5nLmgKKworc3BhcmMtbmF0Lm86IHNwYXJjLW5hdC5jICQoYmZkX2gpICQoZGVmc19oKSAkKGluZmVyaW9yX2gpICQoZ2RiY29yZV9oKSBcCisJdGFyZ2V0LmgKKworc3BhcmMtdGRlcC5vOiBzcGFyYy10ZGVwLmMgJChmbG9hdGZvcm1hdF9oKSAkKGRlZnNfaCkgJChnZGJjb3JlX2gpIFwKKwkkKGluZmVyaW9yX2gpIG9iamZpbGVzLmggc3ltZmlsZS5oIHRhcmdldC5oIGdkYl9zdHJpbmcuaAorCitzcGFyY2wtdGRlcC5vOiBzcGFyY2wtdGRlcC5jICQoZGVmc19oKSAkKGdkYmNvcmVfaCkgdGFyZ2V0LmgKKworZHNyZWMubzogZHNyZWMuYyAkKGRlZnNfaCkgc3JlYy5oCisKK3N0YWJzcmVhZC5vOiBzdGFic3JlYWQuYyAkKGJmZF9oKSAkKElOQ0xVREVfRElSKS9hb3V0L3N0YWIuZGVmIFwKKwkkKElOQ0xVREVfRElSKS9hb3V0L3N0YWJfZ251LmggYnVpbGRzeW0uaCBjb21wbGFpbnRzLmggJChkZWZzX2gpIFwKKwkkKGdkYnR5cGVzX2gpIG9iamZpbGVzLmggc3RhYnNyZWFkLmggc3ltZmlsZS5oICQoc3ltdGFiX2gpIFwKKwlnZGJfc3RyaW5nLmgKKworc3RhY2subzogc3RhY2suYyAkKGRlZnNfaCkgJChnZGJjbWRfaCkgJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkgXAorCWxhbmd1YWdlLmggdGFyZ2V0LmggZ2RiX3N0cmluZy5oCisKK2F4LWdlbmVyYWwubzogYXgtZ2VuZXJhbC5jICQoYXhfaCkgJChkZWZzX2gpCitheC1nZGIubzogYXgtZ2RiLmMgJChkZWZzX2gpICQoc3ltdGFiX2gpIHN5bWZpbGUuaCAkKGdkYnR5cGVzX2gpIFwKKwkkKHZhbHVlX2gpICQoZXhwcmVzc2lvbl9oKSAkKGNvbW1hbmRfaCkgJChheF9oKSAkKGdkYmNtZF9oKSBheC1nZGIuaAorCitzdW4zLW5hdC5vOiBzdW4zLW5hdC5jICQoZGVmc19oKSAkKGdkYmNvcmVfaCkgJChpbmZlcmlvcl9oKQorCitzdW4zODYtbmF0Lm86IHN1bjM4Ni1uYXQuYyAkKGRlZnNfaCkgJChpbmZlcmlvcl9oKSAkKGdkYmNvcmVfaCkKKworc3ltZmlsZS5vOiBzeW1maWxlLmMgJChicmVha3BvaW50X2gpIGNvbXBsYWludHMuaCAkKGRlZnNfaCkgXAorCSQoZXhwcmVzc2lvbl9oKSAkKGdkYmNtZF9oKSAkKGdkYmNvcmVfaCkgJChnZGJ0eXBlc19oKSBcCisJbGFuZ3VhZ2UuaCBvYmpmaWxlcy5oIHN5bWZpbGUuaCAkKHN5bXRhYl9oKSB0YXJnZXQuaCBcCisJZ2RiX3N0cmluZy5oCisKK3N5bW0tdGRlcC5vOiBzeW1tLXRkZXAuYyAkKGRlZnNfaCkgJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkKKworc3ltbS1uYXQubzogc3ltbS1uYXQuYyAkKGRlZnNfaCkgJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkKKworc3ltbWlzYy5vOiBzeW1taXNjLmMgJChiZmRfaCkgJChicmVha3BvaW50X2gpICQoY29tbWFuZF9oKSAkKGRlZnNfaCkgXAorCSQoZXhwcmVzc2lvbl9oKSAkKGdkYnR5cGVzX2gpIGxhbmd1YWdlLmggb2JqZmlsZXMuaCBzeW1maWxlLmggXAorCSQoc3ltdGFiX2gpIGdkYl9zdHJpbmcuaAorCitzeW10YWIubzogc3ltdGFiLmMgY2FsbC1jbWRzLmggJChkZWZzX2gpICQoZXhwcmVzc2lvbl9oKSAkKGZyYW1lX2gpIFwKKwkkKGdkYmNtZF9oKSAkKGdkYmNvcmVfaCkgJChnZGJ0eXBlc19oKSBsYW5ndWFnZS5oIG9iamZpbGVzLmggXAorCWdudS1yZWdleC5oIHN5bWZpbGUuaCAkKHN5bXRhYl9oKSB0YXJnZXQuaCAkKHZhbHVlX2gpIFwKKwlnZGJfc3RyaW5nLmgKKwordGFob2UtdGRlcC5vOiB0YWhvZS10ZGVwLmMgJChPUF9JTkNMVURFKS90YWhvZS5oICQoZGVmc19oKSBcCisJJChzeW10YWJfaCkKKwordGFyZ2V0Lm86IHRhcmdldC5jICQoYmZkX2gpICQoZGVmc19oKSAkKGdkYmNtZF9oKSAkKGluZmVyaW9yX2gpIFwKKwlvYmpmaWxlcy5oIHN5bWZpbGUuaCB0YXJnZXQuaCBnZGJfc3RyaW5nLmgKKwordGhyZWFkLm86IHRocmVhZC5jICQoZGVmc19oKSBnZGJ0aHJlYWQuaCAkKGdkYmNtZF9oKQorCit0b3AubzogdG9wLmMgdG9wLmggJChiZmRfaCkgJChnZXRvcHRfaCkgJChyZWFkbGluZV9oZWFkZXJzKSBjYWxsLWNtZHMuaCBcCisJJChkZWZzX2gpICQoZ2RiY21kX2gpICQoaW5mZXJpb3JfaCkgbGFuZ3VhZ2UuaCBzaWduYWxzLmggXAorCSQocmVtb3RlX3V0aWxzX2gpIGdkYl9zdHJpbmcuaAorCit0eXBlcHJpbnQubzogdHlwZXByaW50LmMgJChkZWZzX2gpICQoZXhwcmVzc2lvbl9oKSAkKGdkYmNtZF9oKSBcCisJJChnZGJjb3JlX2gpICQoZ2RidHlwZXNfaCkgbGFuZ3VhZ2UuaCAkKHN5bXRhYl9oKSB0YXJnZXQuaCBcCisJJCh2YWx1ZV9oKSBnZGJfc3RyaW5nLmgKKwordWx0cmEzLW5hdC5vOiB1bHRyYTMtbmF0LmMgJChkZWZzX2gpICQoZ2RiY29yZV9oKSAkKGluZmVyaW9yX2gpCisKK3VsdHJhMy14ZGVwLm86IHVsdHJhMy14ZGVwLmMgJChkZWZzX2gpICQoZ2RiY29yZV9oKSAkKGluZmVyaW9yX2gpCisKK3VtYXgteGRlcC5vOiB1bWF4LXhkZXAuYyAkKGRlZnNfaCkgJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkKKwordXRpbHMubzogdXRpbHMuYyAkKGJmZF9oKSAkKGRlZnNfaCkgJChleHByZXNzaW9uX2gpICQoZ2RiY21kX2gpIFwKKwlsYW5ndWFnZS5oIHNpZ25hbHMuaCB0YXJnZXQuaCB0ZXJtaW5hbC5oICQocmVhZGxpbmVfaGVhZGVycykgXAorCWdkYl9zdHJpbmcuaAorCit2YWxhcml0aC5vOiB2YWxhcml0aC5jICQoYmZkX2gpICQoZGVmc19oKSAkKGV4cHJlc3Npb25faCkgXAorCSQoZ2RidHlwZXNfaCkgbGFuZ3VhZ2UuaCAkKHN5bXRhYl9oKSB0YXJnZXQuaCAkKHZhbHVlX2gpIFwKKwlnZGJfc3RyaW5nLmgKKwordmFsb3BzLm86IHZhbG9wcy5jICQoZGVmc19oKSAkKGdkYmNvcmVfaCkgJChpbmZlcmlvcl9oKSB0YXJnZXQuaCBcCisJZ2RiX3N0cmluZy5oCisKK3ZhbHByaW50Lm86IHZhbHByaW50LmMgJChkZWZzX2gpICQoZXhwcmVzc2lvbl9oKSAkKGdkYmNtZF9oKSBcCisJJChnZGJjb3JlX2gpICQoZ2RidHlwZXNfaCkgbGFuZ3VhZ2UuaCAkKHN5bXRhYl9oKSB0YXJnZXQuaCBcCisJJCh2YWx1ZV9oKSBnZGJfc3RyaW5nLmggdmFscHJpbnQuaAorCit2YWx1ZXMubzogdmFsdWVzLmMgJChkZWZzX2gpICQoZXhwcmVzc2lvbl9oKSAkKGZyYW1lX2gpICQoZ2RiY21kX2gpIFwKKwkkKGdkYmNvcmVfaCkgJChnZGJ0eXBlc19oKSAkKHN5bXRhYl9oKSB0YXJnZXQuaCAkKHZhbHVlX2gpIFwKKwlnZGJfc3RyaW5nLmggc2NtLWxhbmcuaAorCit2YXgtdGRlcC5vOiB2YXgtdGRlcC5jICQoT1BfSU5DTFVERSkvdmF4LmggJChkZWZzX2gpICQoc3ltdGFiX2gpCisKK3c2NS10ZGVwLm8gOiB3NjUtdGRlcC5jICQoZ2RiY29yZV9oKQorCit3aW4zMi1uYXQubzogd2luMzItbmF0LmMgJChnZGJjbWRfaCkgJChnZGJjb3JlX2gpICQoaW5mZXJpb3JfaCkgJChkZWZzX2gpIFwKKwlnZGJfc3RyaW5nLmgKKworeGRyX2xkLm86IHZ4LXNoYXJlL3hkcl9sZC5jICQoZGVmc19oKSB2eC1zaGFyZS92eFR5cGVzLmggXAorCXZ4LXNoYXJlL3Z4V29ya3MuaCB2eC1zaGFyZS94ZHJfbGQuaAorCSQoQ0MpIC1jICQoSU5URVJOQUxfQ0ZMQUdTKSAkKHNyY2Rpcikvdngtc2hhcmUveGRyX2xkLmMKKworeGRyX3B0cmFjZS5vOiB2eC1zaGFyZS94ZHJfcHRyYWNlLmMgJChkZWZzX2gpIHZ4LXNoYXJlL3Z4VHlwZXMuaCBcCisJdngtc2hhcmUvdnhXb3Jrcy5oIHZ4LXNoYXJlL3hkcl9wdHJhY2UuaAorCSQoQ0MpIC1jICQoSU5URVJOQUxfQ0ZMQUdTKSAkKHNyY2Rpcikvdngtc2hhcmUveGRyX3B0cmFjZS5jCisKK3hkcl9yZGIubzogdngtc2hhcmUveGRyX3JkYi5jICQoZGVmc19oKSB2eC1zaGFyZS92eFR5cGVzLmggXAorCXZ4LXNoYXJlL3Z4V29ya3MuaCB2eC1zaGFyZS94ZHJfcmRiLmgKKwkkKENDKSAtYyAkKElOVEVSTkFMX0NGTEFHUykgJChzcmNkaXIpL3Z4LXNoYXJlL3hkcl9yZGIuYworCit4Y29mZnJlYWQubzogeGNvZmZyZWFkLmMgJChiZmRfaCkgJChJTkNMVURFX0RJUikvYW91dC9zdGFiLmRlZiBcCisJJChJTkNMVURFX0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DTFVERV9ESVIpL2NvZmYvaW50ZXJuYWwuaCBcCisJJChJTkNMVURFX0RJUikvY29mZi9yczYwMDAuaCAkKEJGRF9TUkMpL2xpYmNvZmYuaCBidWlsZHN5bS5oIFwKKwljb21wbGFpbnRzLmggJChkZWZzX2gpICQoZ2RidHlwZXNfaCkgb2JqZmlsZXMuaCBzdGFic3JlYWQuaCBzeW1maWxlLmggXAorCSQoc3ltdGFiX2gpIHBhcnRpYWwtc3RhYi5oIGdkYl9zdHJpbmcuaAorCit4Y29mZnNvbGliLm86IHhjb2Zmc29saWIuYyAkKGJmZF9oKSAkKGRlZnNfaCkgeGNvZmZzb2xpYi5oCisKK3o4ay10ZGVwLm86IHo4ay10ZGVwLmMgJChiZmRfaCkgJChkaXMtYXNtX2gpICQoZGVmc19oKSAkKGZyYW1lX2gpIFwKKwkkKGdkYmNtZF9oKSAkKGdkYnR5cGVzX2gpICQoc3ltdGFiX2gpICQoZ2RiY29yZV9oKQorCitjLWV4cC50YWIubzogYy1leHAudGFiLmMgYy1sYW5nLmggJChkZWZzX2gpICQoZXhwcmVzc2lvbl9oKSBcCisJJChnZGJ0eXBlc19oKSBsYW5ndWFnZS5oIHBhcnNlci1kZWZzLmggJChzeW10YWJfaCkgJCh2YWx1ZV9oKSBcCisJJChiZmRfaCkgb2JqZmlsZXMuaCBzeW1maWxlLmgKKworanYtZXhwLnRhYi5vOiBqdi1leHAudGFiLmMganYtbGFuZy5oICQoZGVmc19oKSAkKGV4cHJlc3Npb25faCkgXAorCSQoZ2RidHlwZXNfaCkgbGFuZ3VhZ2UuaCBwYXJzZXItZGVmcy5oICQoc3ltdGFiX2gpICQodmFsdWVfaCkgXAorCSQoYmZkX2gpIG9iamZpbGVzLmggc3ltZmlsZS5oCisKK2YtZXhwLnRhYi5vOiBmLWV4cC50YWIuYyBmLWxhbmcuaCAkKGRlZnNfaCkgJChleHByZXNzaW9uX2gpIFwKKwlsYW5ndWFnZS5oIHBhcnNlci1kZWZzLmggJCh2YWx1ZV9oKSAkKGJmZF9oKSBvYmpmaWxlcy5oIHN5bWZpbGUuaAorCittMi1leHAudGFiLm86IG0yLWV4cC50YWIuYyAkKGRlZnNfaCkgJChleHByZXNzaW9uX2gpICQoZ2RidHlwZXNfaCkgXAorCWxhbmd1YWdlLmggbTItbGFuZy5oIHBhcnNlci1kZWZzLmggJChzeW10YWJfaCkgJCh2YWx1ZV9oKSBcCisJJChiZmRfaCkgb2JqZmlsZXMuaCBzeW1maWxlLmgKKworIyMjIGVuZCBvZiB0aGUgZ2RiIE1ha2VmaWxlLmluLgpkaWZmIC0tZ2l0IGEvZ2RiL05FV1MgYi9nZGIvTkVXUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmFhYmEzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL05FV1MKQEAgLTAsMCArMSwxNjExIEBACisJCVdoYXQgaGFzIGNoYW5nZWQgaW4gR0RCPworCSAgICAgKE9yZ2FuaXplZCByZWxlYXNlIGJ5IHJlbGVhc2UpCisKKyoqKiBDaGFuZ2VzIGluIEdEQi00LjE4OgorCisqIE5ldyBuYXRpdmUgY29uZmlndXJhdGlvbnMKKworSFAtVVggMTAuMjAJCQkJCWhwcGEqLSotaHB1eDEwLjIwCitIUC1VWCAxMS54CQkJCQlocHBhKi0qLWhwdXgxMS4wKgorTTY4SyBMaW51eAkJCQkJbTY4Ki0qLWxpbnV4KgorCisqIE5ldyB0YXJnZXRzCisKK0Z1aml0c3UgRlIzMAkJCQkJZnIzMC0qLWVsZioKK0ludGVsIFN0cm9uZ0FSTQkJCQkJc3Ryb25nYXJtLSotKgorTWl0c3ViaXNoaSBEMzBWCQkJCQlkMzB2LSotKgorCisqIE9CU09MRVRFIGNvbmZpZ3VyYXRpb25zCisKK0dvdWxkIFBvd2VyTm9kZSwgTlAxCQkJCW5wMS0qLSosIHBuLSotKgorCitDb25maWd1cmF0aW9ucyB0aGF0IGhhdmUgYmVlbiBkZWNsYXJlZCBvYnNvbGV0ZSB3aWxsIGJlIGNvbW1lbnRlZCBvdXQsCitidXQgdGhlIGNvZGUgd2lsbCBiZSBsZWZ0IGluIHBsYWNlLiAgSWYgdGhlcmUgaXMgbm8gYWN0aXZpdHkgdG8gcmV2aXZlCit0aGVzZSBjb25maWd1cmF0aW9ucyBiZWZvcmUgdGhlIG5leHQgcmVsZWFzZSBvZiBHREIsIHRoZSBzb3VyY2VzIHdpbGwKK2JlIHBlcm1hbmVudGx5IFJFTU9WRUQuCisKKyogQU5TSS9JU08gQworCitBcyBhIGNvbXBhdGliaWxpdHkgZXhwZXJpbWVudCwgR0RCJ3Mgc291cmNlIGZpbGVzIGJ1aWxkc3ltLmggYW5kCitidWlsZHN5bS5jIGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8gcHVyZSBzdGFuZGFyZCBDLCBubyBsb25nZXIKK2NvbnRhaW5pbmcgYW55IEsmUiBjb21wYXRpYmlsaXR5IGNvZGUuICBXZSBiZWxpZXZlIHRoYXQgYWxsIHN5c3RlbXMgaW4KK3VzZSB0b2RheSBlaXRoZXIgY29tZSB3aXRoIGEgc3RhbmRhcmQgQyBjb21waWxlciwgb3IgaGF2ZSBhIEdDQyBwb3J0CithdmFpbGFibGUuICBJZiB0aGlzIGlzIG5vdCB0cnVlLCBwbGVhc2UgcmVwb3J0IHRoZSBhZmZlY3RlZAorY29uZmlndXJhdGlvbiB0byBidWctZ2RiQGdudS5vcmcgaW1tZWRpYXRlbHkuICBTZWUgdGhlIFJFQURNRSBmaWxlIGZvcgoraW5mb3JtYXRpb24gYWJvdXQgZ2V0dGluZyBhIHN0YW5kYXJkIEMgY29tcGlsZXIgaWYgeW91IGRvbid0IGhhdmUgb25lCithbHJlYWR5LgorCisqIFJlYWRsaW5lIDIuMgorCitHREIgbm93IHVzZXMgcmVhZGxpbmUgMi4yLgorCisqIHNldCBleHRlbnNpb24tbGFuZ3VhZ2UKKworWW91IGNhbiBub3cgY29udHJvbCB0aGUgbWFwcGluZyBiZXR3ZWVuIGZpbGVuYW1lIGV4dGVuc2lvbnMgYW5kIHNvdXJjZQorbGFuZ3VhZ2VzIGJ5IHVzaW5nIHRoZSBgc2V0IGV4dGVuc2lvbi1sYW5ndWFnZScgY29tbWFuZC4gIEZvciBpbnN0YW5jZSwKK3lvdSBjYW4gYXNrIEdEQiB0byB0cmVhdCAuYyBmaWxlcyBhcyBDKysgYnkgc2F5aW5nCisJc2V0IGV4dGVuc2lvbi1sYW5ndWFnZSAuYyBjKysKK1RoZSBjb21tYW5kIGBpbmZvIGV4dGVuc2lvbnMnIGxpc3RzIGFsbCBvZiB0aGUgcmVjb2duaXplZCBleHRlbnNpb25zCithbmQgdGhlaXIgYXNzb2NpYXRlZCBsYW5ndWFnZXMuCisKKyogU2V0dGluZyBwcm9jZXNzb3IgdHlwZSBmb3IgUG93ZXJQQyBhbmQgUlMvNjAwMAorCitXaGVuIEdEQiBpcyBjb25maWd1cmVkIGZvciBhIHBvd2VycGMqLSotKiBvciBhbiByczYwMDAqLSotKiB0YXJnZXQsCit5b3UgY2FuIHVzZSB0aGUgYHNldCBwcm9jZXNzb3InIGNvbW1hbmQgdG8gc3BlY2lmeSB3aGF0IHZhcmlhbnQgb2YgdGhlCitQb3dlclBDIGZhbWlseSB5b3UgYXJlIGRlYnVnZ2luZy4gIFRoZSBjb21tYW5kCisKKwlzZXQgcHJvY2Vzc29yIE5BTUUKKworc2V0cyB0aGUgUG93ZXJQQy9SUzYwMDAgdmFyaWFudCB0byBOQU1FLiAgR0RCIGtub3dzIGFib3V0IHRoZQorZm9sbG93aW5nIFBvd2VyUEMgYW5kIFJTNjAwMCB2YXJpYW50czoKKworICBwcGMtdWlzYSAgUG93ZXJQQyBVSVNBIC0gYSBQUEMgcHJvY2Vzc29yIGFzIHZpZXdlZCBieSB1c2VyLWxldmVsIGNvZGUKKyAgcnM2MDAwICAgIElCTSBSUzYwMDAgKCJQT1dFUiIpIGFyY2hpdGVjdHVyZSwgdXNlci1sZXZlbCB2aWV3CisgIDQwMyAgICAgICBJQk0gUG93ZXJQQyA0MDMKKyAgNDAzR0MgICAgIElCTSBQb3dlclBDIDQwM0dDCisgIDUwNSAgICAgICBNb3Rvcm9sYSBQb3dlclBDIDUwNQorICA4NjAgICAgICAgTW90b3JvbGEgUG93ZXJQQyA4NjAgb3IgODUwCisgIDYwMSAgICAgICBNb3Rvcm9sYSBQb3dlclBDIDYwMQorICA2MDIgICAgICAgTW90b3JvbGEgUG93ZXJQQyA2MDIKKyAgNjAzICAgICAgIE1vdG9yb2xhL0lCTSBQb3dlclBDIDYwMyBvciA2MDNlCisgIDYwNCAgICAgICBNb3Rvcm9sYSBQb3dlclBDIDYwNCBvciA2MDRlCisgIDc1MCAgICAgICBNb3Rvcm9sYS9JQk0gUG93ZXJQQyA3NTAgb3IgNzUwCisKK0F0IHRoZSBtb21lbnQsIHRoaXMgY29tbWFuZCBqdXN0IHRlbGxzIEdEQiB3aGF0IHRvIG5hbWUgdGhlCitzcGVjaWFsLXB1cnBvc2UgcHJvY2Vzc29yIHJlZ2lzdGVycy4gIFNpbmNlIGFsbW9zdCBhbGwgdGhlIGFmZmVjdGVkCityZWdpc3RlcnMgYXJlIGluYWNjZXNzaWJsZSB0byB1c2VyLWxldmVsIHByb2dyYW1zLCB0aGlzIGNvbW1hbmQgaXMKK29ubHkgdXNlZnVsIGZvciByZW1vdGUgZGVidWdnaW5nIGluIGl0cyBwcmVzZW50IGZvcm0uCisKKyogSFAtVVggc3VwcG9ydAorCitUaGFua3MgdG8gYSBtYWpvciBjb2RlIGRvbmF0aW9uIGZyb20gSGV3bGV0dC1QYWNrYXJkLCBHREIgbm93IGhhcyBtdWNoCittb3JlIGV4dGVuc2l2ZSBzdXBwb3J0IGZvciBIUC1VWC4gIEFkZGVkIGZlYXR1cmVzIGluY2x1ZGUgc2hhcmVkCitsaWJyYXJ5IHN1cHBvcnQsIGtlcm5lbCB0aHJlYWRzIGFuZCBoYXJkd2FyZSB3YXRjaHBvaW50cyBmb3IgMTEuMDAsCitzdXBwb3J0IGZvciBIUCdzIEFOU0kgQyBhbmQgQysrIGNvbXBpbGVycywgYW5kIGEgY29tcGF0aWJpbGl0eSBtb2RlCitmb3IgeGRiIGFuZCBkYnggY29tbWFuZHMuCisKKyogQ2F0Y2hwb2ludHMKKworSFAncyBkb25hdGlvbiBpbmNsdWRlcyB0aGUgbmV3IGNvbmNlcHQgb2YgY2F0Y2hwb2ludHMsIHdoaWNoIGlzIGEKK2dlbmVyYWxpemF0aW9uIG9mIHRoZSBvbGQgY2F0Y2ggY29tbWFuZC4gIE9uIEhQLVVYLCBpdCBpcyBub3cgcG9zc2libGUKK3RvIGNhdGNoIGV4ZWMsIGZvcmssIGFuZCB2Zm9yaywgYXMgd2VsbCBhcyBsaWJyYXJ5IGxvYWRpbmcuCisKK1RoaXMgbWVhbnMgdGhhdCB0aGUgZXhpc3RpbmcgY2F0Y2ggY29tbWFuZCBoYXMgY2hhbmdlZDsgaXRzIGZpcnN0Cithcmd1bWVudCBub3cgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGNhdGNoIHRvIGJlIHNldCB1cC4gIFNlZSB0aGUKK291dHB1dCBvZiAiaGVscCBjYXRjaCIgZm9yIGEgbGlzdCBvZiBjYXRjaHBvaW50IHR5cGVzLgorCisqIERlYnVnZ2luZyBhY3Jvc3MgZm9ya3MKKworT24gSFAtVVgsIHlvdSBjYW4gY2hvb3NlIHdoaWNoIHByb2Nlc3MgdG8gZGVidWcgd2hlbiBhIGZvcmsoKSBoYXBwZW5zCitpbiB0aGUgaW5mZXJpb3IuCisKKyogVFVJCisKK0hQIGhhcyBkb25hdGVkIGEgY3Vyc2VzLWJhc2VkIHRlcm1pbmFsIHVzZXIgaW50ZXJmYWNlIChUVUkpLiAgVG8gZ2V0CitpdCwgYnVpbGQgd2l0aCAtLWVuYWJsZS10dWkuICBBbHRob3VnaCB0aGlzIGNhbiBiZSBlbmFibGVkIGZvciBhbnkKK2NvbmZpZ3VyYXRpb24sIGF0IHByZXNlbnQgaXQgb25seSB3b3JrcyBmb3IgbmF0aXZlIEhQIGRlYnVnZ2luZy4KKworKiBHREIgcmVtb3RlIHByb3RvY29sIGFkZGl0aW9ucworCitBIG5ldyBwcm90b2NvbCBwYWNrZXQgJ1gnIHRoYXQgd3JpdGVzIGJpbmFyeSBkYXRhIGlzIG5vdyBhdmFpbGFibGUuCitEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHRyeSAnWCcsIHRoZW4gZHJvcCBiYWNrIHRvICdNJyBpZiB0aGUgc3R1YgorZmFpbHMgdG8gcmVzcG9uZC4gIFRoZSBzZXR0YWJsZSB2YXJpYWJsZSBgcmVtb3RlYmluYXJ5ZG93bmxvYWQnCithbGxvd3MgZXhwbGljaXQgY29udHJvbCBvdmVyIHRoZSB1c2Ugb2YgJ1gnLgorCitGb3IgNjQtYml0IHRhcmdldHMsIHRoZSBtZW1vcnkgcGFja2V0cyAoJ00nIGFuZCAnbScpIGNhbiBub3cgY29udGFpbiBhCitmdWxsIDY0LWJpdCBhZGRyZXNzLiAgVGhlIGNvbW1hbmQKKworCXNldCByZW1vdGVhZGRyZXNzc2l6ZSAzMgorCitjYW4gYmUgdXNlZCB0byByZXZlcnQgdG8gdGhlIG9sZCBiZWhhdmlvdXIuICBGb3IgZXhpc3RpbmcgcmVtb3RlIHN0dWJzCit0aGUgY2hhbmdlIHNob3VsZCBub3QgYmUgbm90aWNlZCwgYXMgdGhlIGFkZGl0aW9uYWwgYWRkcmVzcyBpbmZvcm1hdGlvbgord2lsbCBiZSBkaXNjYXJkZWQuCisKK0luIG9yZGVyIHRvIGFzc2lzdCBpbiBkZWJ1Z2dpbmcgc3R1YnMsIHlvdSBtYXkgdXNlIHRoZSBtYWludGVuYW5jZQorY29tbWFuZCBgcGFja2V0JyB0byBzZW5kIGFueSB0ZXh0IHN0cmluZyB0byB0aGUgc3R1Yi4gIEZvciBpbnN0YW5jZSwKKworCW1haW50IHBhY2tldCBoZXl0aGVyZQorCitzZW5kcyB0aGUgcGFja2V0ICIkaGV5dGhlcmUjPGNoZWNrc3VtPiIuICBOb3RlIHRoYXQgaXQgaXMgdmVyeSBlYXN5IHRvCitkaXNydXB0IGEgZGVidWdnaW5nIHNlc3Npb24gYnkgc2VuZGluZyB0aGUgd3JvbmcgcGFja2V0IGF0IHRoZSB3cm9uZwordGltZS4KKworVGhlIGNvbXBhcmUtc2VjdGlvbnMgY29tbWFuZCBhbGxvd3MgeW91IHRvIGNvbXBhcmUgc2VjdGlvbiBkYXRhIG9uIHRoZQordGFyZ2V0IHRvIHdoYXQgaXMgaW4gdGhlIGV4ZWN1dGFibGUgZmlsZSB3aXRob3V0IHVwbG9hZGluZyBvcgorZG93bmxvYWRpbmcsIGJ5IGNvbXBhcmluZyBDUkMgY2hlY2tzdW1zLgorCisqIFRyYWNpbmcgY2FuIGNvbGxlY3QgZ2VuZXJhbCBleHByZXNzaW9ucworCitZb3UgbWF5IG5vdyBjb2xsZWN0IGdlbmVyYWwgZXhwcmVzc2lvbnMgYXQgdHJhY2Vwb2ludHMuICBUaGlzIHJlcXVpcmVzCitmdXJ0aGVyIGFkZGl0aW9ucyB0byB0aGUgdGFyZ2V0LXNpZGUgc3R1Yjsgc2VlIHRyYWNlcG9pbnQuYyBhbmQKK2RvYy9hZ2VudGV4cHIudGV4aSBmb3IgZnVydGhlciBkZXRhaWxzLgorCisqIG1hc2stYWRkcmVzcyB2YXJpYWJsZSBmb3IgTWlwcworCitGb3IgTWlwcyB0YXJnZXRzLCB5b3UgbWF5IGNvbnRyb2wgdGhlIHplcm9pbmcgb2YgdGhlIHVwcGVyIDMyIGJpdHMgb2YKK2EgNjQtYml0IGFkZHJlc3MgYnkgZW50ZXJpbmcgYHNldCBtYXNrLWFkZHJlc3Mgb24nLiAgVGhpcyBpcyBtYWlubHkKK29mIGludGVyZXN0IHRvIHVzZXJzIG9mIGVtYmVkZGVkIFI0eHh4IGFuZCBSNXh4eCBwcm9jZXNzb3JzLgorCisqIEhpZ2hlciBzZXJpYWwgYmF1ZCByYXRlcworCitHREIncyBzZXJpYWwgY29kZSBub3cgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGJhdWQgcmF0ZXMgNTc2MDAsIDExNTIwMCwKKzIzMDQwMCwgYW5kIDQ2MDgwMCBiYXVkLiAgKE5vdGUgdGhhdCB5b3VyIGhvc3Qgc3lzdGVtIG1heSBub3QgYmUgYWJsZQordG8gYWNoaWV2ZSBhbGwgb2YgdGhlc2UgcmF0ZXMuKQorCisqIGk5NjAgc2ltdWxhdG9yCisKK1RoZSBpOTYwIGNvbmZpZ3VyYXRpb24gbm93IGluY2x1ZGVzIGFuIGluaXRpYWwgaW1wbGVtZW50YXRpb24gb2YgYQorYnVpbHRpbiBzaW11bGF0b3IsIGNvbnRyaWJ1dGVkIGJ5IEppbSBXaWxzb24uCisKKworKioqIENoYW5nZXMgaW4gR0RCLTQuMTc6CisKKyogTmV3IG5hdGl2ZSBjb25maWd1cmF0aW9ucworCitBbHBoYSBHTlUvTGludXgJCQkJCWFscGhhKi0qLWxpbnV4KgorVW5peHdhcmUgMi54CQkJCQlpWzM0NTZdODYtdW5peHdhcmUyKgorSXJpeCA2LngJCQkJCW1pcHMqLXNnaS1pcml4NioKK1Bvd2VyUEMgR05VL0xpbnV4CQkJCXBvd2VycGMtKi1saW51eCoKK1Bvd2VyUEMgU29sYXJpcwkJCQkJcG93ZXJwY2xlLSotc29sYXJpcyoKK1NwYXJjIEdOVS9MaW51eAkJCQkJc3BhcmMtKi1saW51eCoKK01vdG9yb2xhIHN5c1Y2OCBSM1Y3LjEJCQkJbTY4ay1tb3Rvcm9sYS1zeXN2CisKKyogTmV3IHRhcmdldHMKKworQXJnb25hdXQgUmlzYyBDaGlwIChBUkMpCQkJYXJjLSotKgorSGl0YWNoaSBIOC8zMDBTCQkJCQloODMwMCotKi0qCitNYXRzdXNoaXRhIE1OMTAyMDAgdy9zaW11bGF0b3IJCQltbjEwMjAwLSotKgorTWF0c3VzaGl0YSBNTjEwMzAwIHcvc2ltdWxhdG9yCQkJbW4xMDMwMC0qLSoKK01JUFMgTkVDIFZSNDEwMAkJCQkJbWlwczY0KnZyNDEwMCp7LGVsfS0qLWVsZioKK01JUFMgTkVDIFZSNTAwMAkJCQkJbWlwczY0KnZyNTAwMCp7LGVsfS0qLWVsZioKK01JUFMgVG9zaGliYSBUWDM5CQkJCW1pcHM2NCp0eDM5KnssZWx9LSotZWxmKgorTWl0c3ViaXNoaSBEMTBWIHcvc2ltdWxhdG9yCQkJZDEwdi0qLSoKK01pdHN1YmlzaGkgTTMyUi9EIHcvc2ltdWxhdG9yCQkJbTMyci0qLWVsZioKK1RzcXdhcmUgU3BhcmNsZXQJCQkJc3BhcmNsZXQtKi0qCitORUMgVjg1MCB3L3NpbXVsYXRvcgkJCQl2ODUwLSotKgorCisqIE5ldyBkZWJ1Z2dpbmcgcHJvdG9jb2xzCisKK0FSTSB3aXRoIFJESSBwcm90b2NvbAkJCQlhcm0qLSotKgorTTY4SyB3aXRoIGRCVUcgbW9uaXRvcgkJCQltNjgqLSote2FvdXQsY29mZixlbGZ9CitEREIgYW5kIExTSSB2YXJpYW50cyBvZiBQTU9OIHByb3RvY29sCQltaXBzKi0qLSoKK1Bvd2VyUEMgd2l0aCBESU5LMzIgbW9uaXRvcgkJCXBvd2VycGN7LGxlfS0qLWVhYmkKK1Bvd2VyUEMgd2l0aCBTRFMgcHJvdG9jb2wJCQlwb3dlcnBjeyxsZX0tKi1lYWJpCitNYWNyYWlnb3IgT0NEIChXaWdnbGVyKSBkZXZpY2VzCQkJcG93ZXJwY3ssbGV9LSotZWFiaQorCisqIERXQVJGIDIKKworQWxsIGNvbmZpZ3VyYXRpb25zIGNhbiBub3cgdW5kZXJzdGFuZCBhbmQgdXNlIHRoZSBEV0FSRiAyIGRlYnVnZ2luZworZm9ybWF0LiAgVGhlIGNob2ljZSBpcyBhdXRvbWF0aWMsIGlmIHRoZSBzeW1ib2wgZmlsZSBjb250YWlucyBEV0FSRiAyCitpbmZvcm1hdGlvbi4KKworKiBKYXZhIGZyb250ZW5kCisKK0dEQiBub3cgaW5jbHVkZXMgYmFzaWMgSmF2YSBsYW5ndWFnZSBzdXBwb3J0LiAgVGhpcyBzdXBwb3J0IGlzCitvbmx5IHVzZWZ1bCB3aXRoIEphdmEgY29tcGlsZXJzIHRoYXQgcHJvZHVjZSBuYXRpdmUgbWFjaGluZSBjb2RlLgorCisqIHNvbGliLWFic29sdXRlLXByZWZpeCBhbmQgc29saWItc2VhcmNoLXBhdGgKKworRm9yIFN1bk9TIGFuZCBTVlI0IHNoYXJlZCBsaWJyYXJpZXMsIHlvdSBtYXkgbm93IHNldCB0aGUgcHJlZml4IGZvcgorbG9hZGluZyBhYnNvbHV0ZSBzaGFyZWQgbGlicmFyeSBzeW1ib2wgZmlsZXMsIGFuZCB0aGUgc2VhcmNoIHBhdGggZm9yCitsb2NhdGluZyBub24tYWJzb2x1dGUgc2hhcmVkIGxpYnJhcnkgc3ltYm9sIGZpbGVzLgorCisqIExpdmUgcmFuZ2Ugc3BsaXR0aW5nCisKK0dEQiBjYW4gbm93IGVmZmVjdGl2ZWx5IGRlYnVnIGNvZGUgZm9yIHdoaWNoIEdDQyBoYXMgcGVyZm9ybWVkIGxpdmUKK3JhbmdlIHNwbGl0dGluZyBhcyBwYXJ0IG9mIGl0cyBvcHRpbWl6YXRpb24uICBTZWUgZ2RiL2RvYy9MUlMgZm9yCittb3JlIGRldGFpbHMgb24gdGhlIGV4cGVjdGVkIGZvcm1hdCBvZiB0aGUgc3RhYnMgaW5mb3JtYXRpb24uCisKKyogSHVyZCBzdXBwb3J0CisKK0dEQidzIHN1cHBvcnQgZm9yIHRoZSBHTlUgSHVyZCwgaW5jbHVkaW5nIHRocmVhZCBkZWJ1Z2dpbmcsIGhhcyBiZWVuCit1cGRhdGVkIHRvIHdvcmsgd2l0aCBjdXJyZW50IHZlcnNpb25zIG9mIHRoZSBIdXJkLgorCisqIEFSTSBUaHVtYiBzdXBwb3J0CisKK0dEQidzIEFSTSB0YXJnZXQgY29uZmlndXJhdGlvbiBub3cgaGFuZGxlcyB0aGUgQVJNN1QgKFRodW1iKSAxNi1iaXQKK2luc3RydWN0aW9uIHNldC4gIEFSTSBHREIgYXV0b21hdGljYWxseSBkZXRlY3RzIHdoZW4gVGh1bWIKK2luc3RydWN0aW9ucyBhcmUgaW4gdXNlLCBhbmQgYWRqdXN0cyBkaXNhc3NlbWJseSBhbmQgYmFja3RyYWNpbmcKK2FjY29yZGluZ2x5LgorCisqIE1JUFMxNiBzdXBwb3J0CisKK0dEQidzIE1JUFMgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zIG5vdyBoYW5kbGUgdGhlIE1JUDE2IDE2LWJpdAoraW5zdHJ1Y3Rpb24gc2V0LgorCisqIE92ZXJsYXkgc3VwcG9ydAorCitHREIgbm93IGluY2x1ZGVzIHN1cHBvcnQgZm9yIG92ZXJsYXlzOyBpZiBhbiBleGVjdXRhYmxlIGhhcyBiZWVuCitsaW5rZWQgc3VjaCB0aGF0IG11bHRpcGxlIHNlY3Rpb25zIGFyZSBiYXNlZCBhdCB0aGUgc2FtZSBhZGRyZXNzLCBHREIKK3dpbGwgZGVjaWRlIHdoaWNoIHNlY3Rpb24gdG8gdXNlIGZvciBzeW1ib2xpYyBpbmZvLiAgWW91IGNhbiBjaG9vc2UgdG8KK2NvbnRyb2wgdGhlIGRlY2lzaW9uIG1hbnVhbGx5LCB1c2luZyBvdmVybGF5IGNvbW1hbmRzLCBvciBpbXBsZW1lbnQKK2FkZGl0aW9uYWwgdGFyZ2V0LXNpZGUgc3VwcG9ydCBhbmQgdXNlICJvdmVybGF5IGxvYWQtdGFyZ2V0IiB0byBicmluZworaW4gdGhlIG92ZXJsYXkgbWFwcGluZy4gIERvICJoZWxwIG92ZXJsYXkiIGZvciBtb3JlIGRldGFpbC4KKworKiBpbmZvIHN5bWJvbAorCitUaGUgY29tbWFuZCAiaW5mbyBzeW1ib2wgPGFkZHJlc3M+IiBkaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dAordGhlIHN5bWJvbCBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCisKKyogVHJhY2Ugc3VwcG9ydAorCitUaGUgc3RhbmRhcmQgcmVtb3RlIHByb3RvY29sIG5vdyBpbmNsdWRlcyBhbiBleHRlbnNpb24gdGhhdCBhbGxvd3MKK2FzeW5jaHJvbm91cyBjb2xsZWN0aW9uIGFuZCBkaXNwbGF5IG9mIHRyYWNlIGRhdGEuICBUaGlzIHJlcXVpcmVzCitleHRlbnNpdmUgc3VwcG9ydCBpbiB0aGUgdGFyZ2V0LXNpZGUgZGVidWdnaW5nIHN0dWIuICBUcmFjaW5nIG1vZGUKK2luY2x1ZGVzIGEgbmV3IGludGVyYWN0aW9uIG1vZGUgaW4gR0RCIGFuZCBuZXcgY29tbWFuZHM6IHNlZSB0aGUKK2ZpbGUgdHJhY2Vwb2ludC5jIGZvciBtb3JlIGRldGFpbHMuCisKKyogTUlQUyBzaW11bGF0b3IKKworQ29uZmlndXJhdGlvbnMgZm9yIGVtYmVkZGVkIE1JUFMgbm93IGluY2x1ZGUgYSBzaW11bGF0b3IgY29udHJpYnV0ZWQKK2J5IEN5Z251cyBTb2x1dGlvbnMuICBUaGUgc2ltdWxhdG9yIHN1cHBvcnRzIHRoZSBpbnN0cnVjdGlvbiBzZXRzCitvZiBtb3N0IE1JUFMgdmFyaWFudHMuCisKKyogU3BhcmMgc2ltdWxhdG9yCisKK1NwYXJjIGNvbmZpZ3VyYXRpb25zIG1heSBub3cgaW5jbHVkZSB0aGUgRVJDMzIgc2ltdWxhdG9yIGNvbnRyaWJ1dGVkCitieSB0aGUgRXVyb3BlYW4gU3BhY2UgQWdlbmN5LiAgVGhlIHNpbXVsYXRvciBpcyBub3QgYnVpbHQgaW50bworU3BhcmMgdGFyZ2V0cyBieSBkZWZhdWx0OyBjb25maWd1cmUgd2l0aCAtLWVuYWJsZS1zaW0gdG8gaW5jbHVkZSBpdC4KKworKiBzZXQgYXJjaGl0ZWN0dXJlCisKK0ZvciB0YXJnZXQgY29uZmlndXJhdGlvbnMgdGhhdCBtYXkgaW5jbHVkZSBtdWx0aXBsZSB2YXJpYW50cyBvZiBhCitiYXNpYyBhcmNoaXRlY3R1cmUgKHN1Y2ggYXMgTUlQUyBhbmQgU0gpLCB5b3UgbWF5IG5vdyBzZXQgdGhlCithcmNoaXRlY3R1cmUgZXhwbGljaXRseS4gICJzZXQgYXJjaCIgc2V0cywgImluZm8gYXJjaCIgbGlzdHMKK3RoZSBwb3NzaWJsZSBhcmNoaXRlY3R1cmVzLgorCisqKiogQ2hhbmdlcyBpbiBHREItNC4xNjoKKworKiBOZXcgbmF0aXZlIGNvbmZpZ3VyYXRpb25zCisKK1dpbmRvd3MgOTUsIHg4NiBXaW5kb3dzIE5UCQkJaVszNDVdODYtKi1jeWd3aW4zMgorTTY4SyBOZXRCU0QJCQkJCW02OGstKi1uZXRic2QqCitQb3dlclBDIEFJWCA0LngJCQkJCXBvd2VycGMtKi1haXgqCitQb3dlclBDIE1hY09TCQkJCQlwb3dlcnBjLSotbWFjb3MqCitQb3dlclBDIFdpbmRvd3MgTlQJCQkJcG93ZXJwY2xlLSotY3lnd2luMzIKK1JTLzYwMDAgQUlYIDQueAkJCQkJcnM2MDAwLSotYWl4NCoKKworKiBOZXcgdGFyZ2V0cworCitBUk0gd2l0aCBSRFAgcHJvdG9jb2wJCQkJYXJtLSotKgorSTk2MCB3aXRoIE1PTjk2MAkJCQlpOTYwLSotY29mZgorTUlQUyBWeFdvcmtzCQkJCQltaXBzKi0qLXZ4d29ya3MqCitNSVBTIFZSNDMwMCB3aXRoIFBNT04JCQkJbWlwczY0KnZyNDMwMHssZWx9LSotZWxmKgorUG93ZXJQQyB3aXRoIFBQQ0JVRyBtb25pdG9yCQkJcG93ZXJwY3ssbGV9LSotZWFiaSoKK0hpdGFjaGkgU0gzCQkJCQlzaC0qLSoKK01hdHJhIFNwYXJjbGV0CQkJCQlzcGFyY2xldC0qLSoKKworKiBQb3dlclBDIHNpbXVsYXRvcgorCitUaGUgcG93ZXJwYy1lYWJpIGNvbmZpZ3VyYXRpb24gbm93IGluY2x1ZGVzIHRoZSBQU0lNIHNpbXVsYXRvciwKK2NvbnRyaWJ1dGVkIGJ5IEFuZHJldyBDYWduZXksIHdpdGggYXNzaXN0YW5jZSBmcm9tIE1pa2UgTWVpc3NuZXIuCitQU0lNIGlzIGEgdmVyeSBlbGFib3JhdGUgbW9kZWwgb2YgdGhlIFBvd2VyUEMsIGluY2x1ZGluZyBub3Qgb25seQorYmFzaWMgaW5zdHJ1Y3Rpb24gc2V0IGV4ZWN1dGlvbiwgYnV0IGFsc28gZGV0YWlscyBvZiBleGVjdXRpb24gdW5pdAorcGVyZm9ybWFuY2UgYW5kIEkvTyBoYXJkd2FyZS4gIFNlZSBzaW0vcHBjL1JFQURNRSBmb3IgbW9yZSBkZXRhaWxzLgorCisqIFNvbGFyaXMgMi41CisKK0dEQiBub3cgd29ya3Mgd2l0aCBTb2xhcmlzIDIuNS4KKworKiBXaW5kb3dzIDk1L05UIG5hdGl2ZQorCitHREIgd2lsbCBub3cgd29yayBhcyBhIG5hdGl2ZSBkZWJ1Z2dlciBvbiBXaW5kb3dzIDk1IGFuZCBXaW5kb3dzIE5ULgorVG8gYnVpbGQgaXQgZnJvbSBzb3VyY2UsIHlvdSBtdXN0IHVzZSB0aGUgImdudS13aW4zMiIgZW52aXJvbm1lbnQsCit3aGljaCB1c2VzIGEgRExMIHRvIGVtdWxhdGUgZW5vdWdoIG9mIFVuaXggdG8gcnVuIHRoZSBHTlUgdG9vbHMuCitGdXJ0aGVyIGluZm9ybWF0aW9uLCBiaW5hcmllcywgYW5kIHNvdXJjZXMgYXJlIGF2YWlsYWJsZSBhdAorZnRwLmN5Z251cy5jb20sIHVuZGVyIHB1Yi9nbnUtd2luMzIuCisKKyogZG9udC1yZXBlYXQgY29tbWFuZAorCitJZiBhIHVzZXItZGVmaW5lZCBjb21tYW5kIGluY2x1ZGVzIHRoZSBjb21tYW5kIGBkb250LXJlcGVhdCcsIHRoZW4gdGhlCitjb21tYW5kIHdpbGwgbm90IGJlIHJlcGVhdGVkIGlmIHRoZSB1c2VyIGp1c3QgdHlwZXMgcmV0dXJuLiAgVGhpcyBpcwordXNlZnVsIGlmIHRoZSBjb21tYW5kIGlzIHRpbWUtY29uc3VtaW5nIHRvIHJ1biwgc28gdGhhdCBhY2NpZGVudGFsCitleHRyYSBrZXlzdHJva2VzIGRvbid0IHJ1biB0aGUgc2FtZSBjb21tYW5kIG1hbnkgdGltZXMuCisKKyogU2VuZCBicmVhayBpbnN0ZWFkIG9mIF5DCisKK1RoZSBzdGFuZGFyZCByZW1vdGUgcHJvdG9jb2wgbm93IGluY2x1ZGVzIGFuIG9wdGlvbiB0byBzZW5kIGEgYnJlYWsKK3JhdGhlciB0aGFuIGEgXkMgdG8gdGhlIHRhcmdldCBpbiBvcmRlciB0byBpbnRlcnJ1cHQgaXQuICBCeSBkZWZhdWx0LAorR0RCIHdpbGwgc2VuZCBeQzsgdG8gc2VuZCBhIGJyZWFrLCBzZXQgdGhlIHZhcmlhYmxlIGByZW1vdGVicmVhaycgdG8gMS4KKworKiBSZW1vdGUgcHJvdG9jb2wgdGltZW91dAorCitUaGUgc3RhbmRhcmQgcmVtb3RlIHByb3RvY29sIGluY2x1ZGVzIGEgbmV3IHZhcmlhYmxlIGByZW1vdGV0aW1lb3V0JwordGhhdCBhbGxvd3MgeW91IHRvIHNldCB0aGUgbnVtYmVyIG9mIHNlY29uZHMgYmVmb3JlIEdEQiBnaXZlcyB1cCB0cnlpbmcKK3RvIHJlYWQgZnJvbSB0aGUgdGFyZ2V0LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMi4KKworKiBBdXRvbWF0aWMgdHJhY2tpbmcgb2YgZHluYW1pYyBvYmplY3QgbG9hZGluZyAoSFBVWCBhbmQgU29sYXJpcyBvbmx5KQorCitCeSBkZWZhdWx0IEdEQiB3aWxsIGF1dG9tYXRpY2FsbHkga2VlcCB0cmFjayBvZiBvYmplY3RzIGFzIHRoZXkgYXJlCitsb2FkZWQgYW5kIHVubG9hZGVkIGJ5IHRoZSBkeW5hbWljIGxpbmtlci4gIEJ5IHVzaW5nIHRoZSBjb21tYW5kIGBzZXQKK3N0b3Atb24tc29saWItZXZlbnRzIDEnIHlvdSBjYW4gYXJyYW5nZSBmb3IgR0RCIHRvIHN0b3AgdGhlIGluZmVyaW9yCit3aGVuIHNoYXJlZCBsaWJyYXJ5IGV2ZW50cyBvY2N1ciwgdGh1cyBhbGxvd2luZyB5b3UgdG8gc2V0IGJyZWFrcG9pbnRzCitpbiBzaGFyZWQgbGlicmFyaWVzIHdoaWNoIGFyZSBleHBsaWNpdGx5IGxvYWRlZCBieSB0aGUgaW5mZXJpb3IuCisKK05vdGUgdGhpcyBmZWF0dXJlIGRvZXMgbm90IHdvcmsgb24gaHB1eDguICBPbiBocHV4OSB5b3UgbXVzdCBsaW5rCisvdXNyL2xpYi9lbmQubyBpbnRvIHlvdXIgcHJvZ3JhbS4gIFRoaXMgZmVhdHVyZSBzaG91bGQgd29yaworYXV0b21hdGljYWxseSBvbiBocHV4MTAuCisKKyogSXJpeCA1LnggaGFyZHdhcmUgd2F0Y2hwb2ludCBzdXBwb3J0CisKK0lyaXggNSBjb25maWd1cmF0aW9ucyBub3cgc3VwcG9ydCB0aGUgdXNlIG9mIGhhcmR3YXJlIHdhdGNocG9pbnRzLgorCisqIE1pcHMgcHJvdG9jb2wgIlNZTiBnYXJiYWdlIGxpbWl0IgorCitXaGVuIGRlYnVnZ2luZyBhIE1pcHMgdGFyZ2V0IHVzaW5nIHRoZSBgdGFyZ2V0IG1pcHMnIHByb3RvY29sLCB5b3UKK21heSBzZXQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgR0RCIHdpbGwgaWdub3JlIGJ5IHNldHRpbmcKK3RoZSBgc3luLWdhcmJhZ2UtbGltaXQnLiAgQSB2YWx1ZSBvZiAtMSBtZWFucyB0aGF0IEdEQiB3aWxsIGlnbm9yZQorZXZlcnkgY2hhcmFjdGVyLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTA1MC4KKworKiBSZWNvcmRpbmcgYW5kIHJlcGxheWluZyByZW1vdGUgZGVidWcgc2Vzc2lvbnMKKworSWYgeW91IHNldCBgcmVtb3RlbG9nZmlsZScgdG8gdGhlIG5hbWUgb2YgYSBmaWxlLCBnZGIgd2lsbCB3cml0ZSB0byBpdAorYSByZWNvcmRpbmcgb2YgYSByZW1vdGUgZGVidWcgc2Vzc2lvbi4gIFRoaXMgcmVjb3JkaW5nIG1heSB0aGVuIGJlCityZXBsYXllZCBiYWNrIHRvIGdkYiB1c2luZyAiZ2RicmVwbGF5Ii4gIFNlZSBnZGJzZXJ2ZXIvUkVBRE1FIGZvcgorZGV0YWlscy4gIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IGhhdmUgYSBwcm9ibGVtIHdpdGggR0RCIHdoaWxlIGRvaW5nCityZW1vdGUgZGVidWdnaW5nOyB5b3UgY2FuIG1ha2UgYSByZWNvcmRpbmcgb2YgdGhlIHNlc3Npb24gYW5kIHNlbmQgaXQKK3RvIHNvbWVvbmUgZWxzZSwgd2hvIGNhbiB0aGVuIHJlY3JlYXRlIHRoZSBwcm9ibGVtLgorCisqIFNwZWVkdXBzIGZvciByZW1vdGUgZGVidWdnaW5nCisKK0dEQiBpbmNsdWRlcyBzcGVlZHVwcyBmb3IgZG93bmxvYWRpbmcgYW5kIHN0ZXBwaW5nIE1JUFMgc3lzdGVtcyB1c2luZwordGhlIElEVCBtb25pdG9yLCBmYXN0IGRvd25sb2FkcyB0byB0aGUgSGl0YWNoaSBTSCBFNzAwMCBlbXVsYXRvciwKK2FuZCBtb3JlIGVmZmljaWVudCBTLXJlY29yZCBkb3dubG9hZGluZy4KKworKiBNZW1vcnkgdXNlIHJlZHVjdGlvbnMgYW5kIHN0YXRpc3RpY3MgY29sbGVjdGlvbgorCitHREIgbm93IHVzZXMgbGVzcyBtZW1vcnkgYW5kIHJlcG9ydHMgc3RhdGlzdGljcyBhYm91dCBtZW1vcnkgdXNhZ2UuCitUcnkgdGhlIGBtYWludCBwcmludCBzdGF0aXN0aWNzJyBjb21tYW5kLCBmb3IgZXhhbXBsZS4KKworKioqIENoYW5nZXMgaW4gR0RCLTQuMTU6CisKKyogUHN5bXRhYnMgZm9yIFhDT0ZGCisKK1RoZSBzeW1ib2wgcmVhZGVyIGZvciBBSVggR0RCIG5vdyB1c2VzIHBhcnRpYWwgc3ltYm9sIHRhYmxlcy4gIFRoaXMKK2NhbiBncmVhdGx5IGltcHJvdmUgc3RhcnR1cCB0aW1lLCBlc3BlY2lhbGx5IGZvciBsYXJnZSBleGVjdXRhYmxlcy4KKworKiBSZW1vdGUgdGFyZ2V0cyB1c2UgY2FjaGluZworCitSZW1vdGUgdGFyZ2V0cyBub3cgdXNlIGEgZGF0YSBjYWNoZSB0byBzcGVlZCB1cCBjb21tdW5pY2F0aW9uIHdpdGggdGhlCityZW1vdGUgc2lkZS4gIFRoZSBkYXRhIGNhY2hlIGNvdWxkIGxlYWQgdG8gaW5jb3JyZWN0IHJlc3VsdHMgYmVjYXVzZQoraXQgZG9lc24ndCBrbm93IGFib3V0IHZvbGF0aWxlIHZhcmlhYmxlcywgdGh1cyBtYWtpbmcgaXQgaW1wb3NzaWJsZSB0bworZGVidWcgdGFyZ2V0cyB3aGljaCB1c2UgbWVtb3J5IG1hcHBlZCBJL08gZGV2aWNlcy4gYHNldCByZW1vdGVjYWNoZQorb2ZmJyB0dXJucyB0aGUgdGhlIGRhdGEgY2FjaGUgb2ZmLgorCisqIFJlbW90ZSB0YXJnZXRzIG1heSBoYXZlIHRocmVhZHMKKworVGhlIHN0YW5kYXJkIHJlbW90ZSBwcm90b2NvbCBub3cgaW5jbHVkZXMgc3VwcG9ydCBmb3IgbXVsdGlwbGUgdGhyZWFkcworaW4gdGhlIHRhcmdldCBzeXN0ZW0sIHVzaW5nIG5ldyBwcm90b2NvbCBjb21tYW5kcyAnSCcgYW5kICdUJy4gIFNlZQorZ2RiL3JlbW90ZS5jIGZvciBkZXRhaWxzLgorCisqIE5ldFJPTSBzdXBwb3J0CisKK0lmIEdEQiBpcyBjb25maWd1cmVkIHdpdGggYC0tZW5hYmxlLW5ldHJvbScsIHRoZW4gaXQgd2lsbCBpbmNsdWRlCitzdXBwb3J0IGZvciB0aGUgTmV0Uk9NIFJPTSBlbXVsYXRvciBmcm9tIFhMTlQgRGVzaWducy4gIFRoZSBOZXRST00KK2FjdHMgYXMgdGhvdWdoIGl0IGlzIGEgYmFuayBvZiBST00gb24gdGhlIHRhcmdldCBib2FyZCwgYnV0IHlvdSBjYW4KK3dyaXRlIGludG8gaXQgb3ZlciB0aGUgbmV0d29yay4gIEdEQidzIHN1cHBvcnQgY29uc2lzdHMgb25seSBvZgorc3VwcG9ydCBmb3IgZmFzdCBsb2FkaW5nIGludG8gdGhlIGVtdWxhdGVkIFJPTTsgdG8gZGVidWcsIHlvdSBtdXN0IHVzZQorYW5vdGhlciBwcm90b2NvbCwgc3VjaCBhcyBzdGFuZGFyZCByZW1vdGUgcHJvdG9jb2wuICBUaGUgdXN1YWwKK3NlcXVlbmNlIGlzIHNvbWV0aGluZyBsaWtlCisKKwl0YXJnZXQgbnJvbSA8bmV0cm9tLWhvc3RuYW1lPgorCWxvYWQgPHByb2c+CisJdGFyZ2V0IHJlbW90ZSA8bmV0cm9tLWhvc3RuYW1lPjoxMjM1CisKKyogTWFjaW50b3NoIGhvc3QKKworR0RCIG5vdyBpbmNsdWRlcyBzdXBwb3J0IGZvciB0aGUgQXBwbGUgTWFjaW50b3NoLCBhcyBhIGhvc3Qgb25seS4gIEl0CittYXkgYmUgcnVuIGFzIGVpdGhlciBhbiBNUFcgdG9vbCBvciBhcyBhIHN0YW5kYWxvbmUgYXBwbGljYXRpb24sIGFuZAoraXQgY2FuIGRlYnVnIHRocm91Z2ggdGhlIHNlcmlhbCBwb3J0LiAgQWxsIHRoZSB1c3VhbCBHREIgY29tbWFuZHMgYXJlCithdmFpbGFibGUsIGJ1dCB0byB0aGUgdGFyZ2V0IGNvbW1hbmQsIHlvdSBtdXN0IHN1cHBseSAic2VyaWFsIiBhcyB0aGUKK2RldmljZSB0eXBlIGluc3RlYWQgb2YgIi9kZXYvdHR5WFgiLiAgU2VlIG1wdy1SRUFETUUgaW4gdGhlIG1haW4KK2RpcmVjdG9yeSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gYnVpbGQuICBUaGUgTVBXIGNvbmZpZ3VyYXRpb24KK3NjcmlwdHMgKi9tcHctY29uZmlnLmluIHN1cHBvcnQgb25seSBhIGZldyB0YXJnZXRzLCBhbmQgb25seSB0aGUKK21pcHMtaWR0LWVjb2ZmIHRhcmdldCBoYXMgYmVlbiB0ZXN0ZWQuCisKKyogQXV0b2NvbmYKKworR0RCIGNvbmZpZ3VyYXRpb24gbm93IHVzZXMgYXV0b2NvbmYuICBUaGlzIGlzIG5vdCB1c2VyLXZpc2libGUsCitidXQgZG9lcyBzaW1wbGlmeSBjb25maWd1cmF0aW9uIGFuZCBidWlsZGluZy4KKworKiBocHV4MTAKKworR0RCIG5vdyBzdXBwb3J0cyBocHV4MTAuCisKKyoqKiBDaGFuZ2VzIGluIEdEQi00LjE0OgorCisqIE5ldyBuYXRpdmUgY29uZmlndXJhdGlvbnMKKworeDg2IEZyZWVCU0QJCQkJCWlbMzQ1XTg2LSotZnJlZWJzZAoreDg2IE5ldEJTRAkJCQkJaVszNDVdODYtKi1uZXRic2QKK05TMzJrIE5ldEJTRAkJCQkJbnMzMmstKi1uZXRic2QKK1NwYXJjIE5ldEJTRAkJCQkJc3BhcmMtKi1uZXRic2QKKworKiBOZXcgdGFyZ2V0cworCitBMjlLIFZ4V29ya3MJCQkJCWEyOWstKi12eHdvcmtzCitIUCBQQSBQUk8gZW1iZWRkZWQgKFdpbkJvbmQgVzg5SyAmIE9raSBPUDUwTikJaHBwYSotKi1wcm8qCitDUFUzMiBFU1QtMzAwIGVtdWxhdG9yCQkJCW02OCotKi1lc3QqCitQb3dlclBDIEVMRgkJCQkJcG93ZXJwYy0qLWVsZgorV0RDIDY1ODE2CQkJCQl3NjUtKi0qCisKKyogQWxwaGEgT1NGLzEgc3VwcG9ydCBmb3IgcHJvY2ZzCisKK0dEQiBub3cgc3VwcG9ydHMgcHJvY2ZzIHVuZGVyIE9TRi8xLTIueCBhbmQgaGlnaGVyLCB3aGljaCBtYWtlcyBpdAorcG9zc2libGUgdG8gYXR0YWNoIHRvIHJ1bm5pbmcgcHJvY2Vzc2VzLiAgQXMgdGhlIG1vdW50aW5nIG9mIHRoZSAvcHJvYworZmlsZXN5c3RlbSBpcyBvcHRpb25hbCBvbiB0aGUgQWxwaGEsIEdEQiBhdXRvbWF0aWNhbGx5IGRldGVybWluZXMKK3RoZSBhdmFpbGFiaWxpdHkgb2YgL3Byb2MgZHVyaW5nIHN0YXJ0dXAuICBUaGlzIGNhbiBsZWFkIHRvIHByb2JsZW1zCitpZiAvcHJvYyBpcyB1bm1vdW50ZWQgYWZ0ZXIgR0RCIGhhcyBiZWVuIHN0YXJ0ZWQuCisKKyogQXJndW1lbnRzIHRvIHVzZXItZGVmaW5lZCBjb21tYW5kcworCitVc2VyIGNvbW1hbmRzIG1heSBhY2NlcHQgdXAgdG8gMTAgYXJndW1lbnRzIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLgorQXJndW1lbnRzIGFyZSBhY2Nlc3NlZCB3aXRoaW4gdGhlIHVzZXIgY29tbWFuZCB2aWEgJGFyZzAuLiRhcmc5LiAgQQordHJpdmlhbCBleGFtcGxlOgorZGVmaW5lIGFkZGVyCisgIHByaW50ICRhcmcwICsgJGFyZzEgKyAkYXJnMgorCitUbyBleGVjdXRlIHRoZSBjb21tYW5kIHVzZToKK2FkZGVyIDEgMiAzCisKK0RlZmluZXMgdGhlIGNvbW1hbmQgImFkZGVyIiB3aGljaCBwcmludHMgdGhlIHN1bSBvZiBpdHMgdGhyZWUgYXJndW1lbnRzLgorTm90ZSB0aGUgYXJndW1lbnRzIGFyZSB0ZXh0IHN1YnN0aXR1dGlvbnMsIHNvIHRoZXkgbWF5IHJlZmVyZW5jZSB2YXJpYWJsZXMsCit1c2UgY29tcGxleCBleHByZXNzaW9ucywgb3IgZXZlbiBwZXJmb3JtIGluZmVyaW9yIGZ1bmN0aW9uIGNhbGxzLgorCisqIE5ldyBgaWYnIGFuZCBgd2hpbGUnIGNvbW1hbmRzCisKK1RoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gd3JpdGUgbW9yZSBzb3BoaXN0aWNhdGVkIHVzZXItZGVmaW5lZAorY29tbWFuZHMuICBCb3RoIGNvbW1hbmRzIHRha2UgYSBzaW5nbGUgYXJndW1lbnQsIHdoaWNoIGlzIHRoZQorZXhwcmVzc2lvbiB0byBldmFsdWF0ZSwgYW5kIG11c3QgYmUgZm9sbG93ZWQgYnkgdGhlIGNvbW1hbmRzIHRvCitleGVjdXRlLCBvbmUgcGVyIGxpbmUsIGlmIHRoZSBleHByZXNzaW9uIGlzIG5vbnplcm8sIHRoZSBsaXN0IGJlaW5nCit0ZXJtaW5hdGVkIGJ5IHRoZSB3b3JkIGBlbmQnLiAgVGhlIGBpZicgY29tbWFuZCBsaXN0IG1heSBpbmNsdWRlIGFuCitgZWxzZScgd29yZCwgd2hpY2ggY2F1c2VzIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQgb25seQoraWYgdGhlIGV4cHJlc3Npb24gaXMgemVyby4KKworKiBGb3J0cmFuIHNvdXJjZSBsYW5ndWFnZSBtb2RlCisKK0dEQiBub3cgaW5jbHVkZXMgcGFydGlhbCBzdXBwb3J0IGZvciBGb3J0cmFuIDc3LiAgSXQgd2lsbCByZWNvZ25pemUKK0ZvcnRyYW4gcHJvZ3JhbXMgYW5kIGNhbiBldmFsdWF0ZSBhIHN1YnNldCBvZiBGb3J0cmFuIGV4cHJlc3Npb25zLCBidXQKK3ZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIG1heSBub3QgYmUgaGFuZGxlZCBjb3JyZWN0bHkuICBHREIgd2lsbCB3b3JrCit3aXRoIEc3NywgYnV0IGRvZXMgbm90IHlldCBrbm93IG11Y2ggYWJvdXQgc3ltYm9scyBlbWl0dGVkIGJ5IG90aGVyCitGb3J0cmFuIGNvbXBpbGVycy4KKworKiBCZXR0ZXIgSFBVWCBzdXBwb3J0CisKK01vc3QgZGVidWdnaW5nIGZhY2lsaXRpZXMgbm93IHdvcmsgb24gZHluYW1pYyBleGVjdXRhYmxlcyBmb3IgSFBQQXMKK3J1bm5pbmcgaHB1eDkgb3IgbGF0ZXIuICBZb3UgY2FuIGF0dGFjaCB0byBydW5uaW5nIGR5bmFtaWNhbGx5IGxpbmtlZAorcHJvY2Vzc2VzLCBidXQgYnkgZGVmYXVsdCB0aGUgZHluYW1pYyBsaWJyYXJpZXMgd2lsbCBiZSByZWFkLW9ubHksIHNvCitmb3IgaW5zdGFuY2UgeW91IHdvbid0IGJlIGFibGUgdG8gcHV0IGJyZWFrcG9pbnRzIGluIHRoZW0uICBUbyBjaGFuZ2UKK3RoYXQgYmVoYXZpb3IgZG8gdGhlIGZvbGxvd2luZyBiZWZvcmUgcnVubmluZyB0aGUgcHJvZ3JhbToKKworCWFkYiAtdyBhLm91dAorCV9fZGxkX2ZsYWdzP1cgMHg1CisJY29udHJvbC1kCisKK1RoaXMgd2lsbCBjYXVzZSB0aGUgbGlicmFyaWVzIHRvIGJlIG1hcHBlZCBwcml2YXRlIGFuZCByZWFkLXdyaXRlLgorVG8gcmV2ZXJ0IHRvIHRoZSBub3JtYWwgYmVoYXZpb3IsIGRvIHRoaXM6CisKKwlhZGIgLXcgYS5vdXQKKwlfX2RsZF9mbGFncz9XIDB4NAorCWNvbnRyb2wtZAorCitZb3UgY2Fubm90IHNldCBicmVha3BvaW50cyBvciBleGFtaW5lIGRhdGEgaW4gdGhlIGxpYnJhcnkgdW50aWwgYWZ0ZXIKK3RoZSBsaWJyYXJ5IGlzIGxvYWRlZCBpZiB0aGUgZnVuY3Rpb24vZGF0YSBzeW1ib2xzIGRvIG5vdCBoYXZlCitleHRlcm5hbCBsaW5rYWdlLgorCitHREIgY2FuIG5vdyBhbHNvIHJlYWQgZGVidWcgc3ltYm9scyBwcm9kdWNlZCBieSB0aGUgSFAgQyBjb21waWxlciBvbgorSFBQQXMgKHNvcnJ5LCBubyBDKyssIEZvcnRyYW4gb3IgNjhrIHN1cHBvcnQpLgorCisqIFRhcmdldCBieXRlIG9yZGVyIG5vdyBkeW5hbWljYWxseSBzZWxlY3RhYmxlCisKK1lvdSBjYW4gY2hvb3NlIHdoaWNoIGJ5dGUgb3JkZXIgdG8gdXNlIHdpdGggYSB0YXJnZXQgc3lzdGVtLCB2aWEgdGhlCitjb21tYW5kcyAic2V0IGVuZGlhbiBiaWciIGFuZCAic2V0IGVuZGlhbiBsaXR0bGUiLCBhbmQgeW91IGNhbiBzZWUgdGhlCitjdXJyZW50IHNldHRpbmcgYnkgdXNpbmcgInNob3cgZW5kaWFuIi4gIFlvdSBjYW4gYWxzbyBnaXZlIHRoZSBjb21tYW5kCisic2V0IGVuZGlhbiBhdXRvIiwgaW4gd2hpY2ggY2FzZSBHREIgd2lsbCB1c2UgdGhlIGJ5dGUgb3JkZXIKK2Fzc29jaWF0ZWQgd2l0aCB0aGUgZXhlY3V0YWJsZS4gIEN1cnJlbnRseSwgb25seSBlbWJlZGRlZCBNSVBTCitjb25maWd1cmF0aW9ucyBzdXBwb3J0IGR5bmFtaWMgc2VsZWN0aW9uIG9mIHRhcmdldCBieXRlIG9yZGVyLgorCisqIE5ldyBET1MgaG9zdCBzZXJpYWwgY29kZQorCitUaGlzIHZlcnNpb24gdXNlcyBEUE1JIGludGVycnVwdHMgdG8gaGFuZGxlIGJ1ZmZlcmVkIEkvTywgc28geW91CitubyBsb25nZXIgbmVlZCB0byBydW4gYXN5bmN0c3Igd2hlbiBkZWJ1Z2dpbmcgYm9hcmRzIGNvbm5lY3RlZCB0bworYSBQQydzIHNlcmlhbCBwb3J0LgorCisqKiogQ2hhbmdlcyBpbiBHREItNC4xMzoKKworKiBOZXcgImNvbXBsZXRlIiBjb21tYW5kCisKK1RoaXMgbGlzdHMgYWxsIHRoZSBwb3NzaWJsZSBjb21wbGV0aW9ucyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxpbmUsIGlmIGl0Cit3ZXJlIHRvIGJlIGdpdmVuIGFzIGEgY29tbWFuZCBpdHNlbGYuICBUaGlzIGlzIGludGVuZGVkIGZvciB1c2UgYnkgZW1hY3MuCisKKyogVHJhaWxpbmcgc3BhY2Ugb3B0aW9uYWwgaW4gcHJvbXB0CisKKyJzZXQgcHJvbXB0IiBubyBsb25nZXIgYWRkcyBhIHNwYWNlIGZvciB5b3UgYWZ0ZXIgdGhlIHByb21wdCB5b3Ugc2V0LiAgVGhpcworYWxsb3dzIHlvdSB0byBzZXQgYSBwcm9tcHQgd2hpY2ggZW5kcyBpbiBhIHNwYWNlIG9yIG9uZSB0aGF0IGRvZXMgbm90LgorCisqIEJyZWFrcG9pbnQgaGl0IGNvdW50cworCisiaW5mbyBicmVhayIgbm93IGRpc3BsYXlzIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYnJlYWtwb2ludAoraGFzIGJlZW4gaGl0LiAgVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpbiBjb25qdW5jdGlvbiB3aXRoICJpZ25vcmUiOyB5b3UKK2NhbiBpZ25vcmUgYSBsYXJnZSBudW1iZXIgb2YgYnJlYWtwb2ludCBoaXRzLCBsb29rIGF0IHRoZSBicmVha3BvaW50IGluZm8KK3RvIHNlZSBob3cgbWFueSB0aW1lcyB0aGUgYnJlYWtwb2ludCB3YXMgaGl0LCB0aGVuIHJ1biBhZ2FpbiwgaWdub3Jpbmcgb25lCitsZXNzIHRoYW4gdGhhdCBudW1iZXIsIGFuZCB0aGlzIHdpbGwgZ2V0IHlvdSBxdWlja2x5IHRvIHRoZSBsYXN0IGhpdCBvZgordGhhdCBicmVha3BvaW50LgorCisqIEFiaWxpdHkgdG8gc3RvcCBwcmludGluZyBhdCBOVUxMIGNoYXJhY3RlcgorCisic2V0IHByaW50IG51bGwtc3RvcCIgd2lsbCBjYXVzZSBHREIgdG8gc3RvcCBwcmludGluZyB0aGUgY2hhcmFjdGVycyBvZgorYW4gYXJyYXkgd2hlbiB0aGUgZmlyc3QgTlVMTCBpcyBlbmNvdW50ZXJlZC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gbGFyZ2UKK2FycmF5cyBhY3R1YWxseSBjb250YWluIG9ubHkgc2hvcnQgc3RyaW5ncy4KKworKiBTaGFyZWQgbGlicmFyeSBicmVha3BvaW50cworCitJbiBTdW5PUyA0LngsIFNWUjQsIGFuZCBBbHBoYSBPU0YvMSBjb25maWd1cmF0aW9ucywgeW91IGNhbiBub3cgc2V0CiticmVha3BvaW50cyBpbiBzaGFyZWQgbGlicmFyaWVzIGJlZm9yZSB0aGUgZXhlY3V0YWJsZSBpcyBydW4uCisKKyogSGFyZHdhcmUgd2F0Y2hwb2ludHMKKworVGhlcmUgaXMgYSBuZXcgaGFyZHdhcmUgYnJlYWtwb2ludCBmb3IgdGhlIHdhdGNoIGNvbW1hbmQgZm9yIHNwYXJjbGl0ZQordGFyZ2V0cy4gIFNlZSBnZGIvc3BhcmNsaXRlL2h3X2JyZWFrcG9pbnQubm90ZS4KKworSGFyZHdhcmUgd2F0Y2hwb2ludHMgYXJlIGFsc28gbm93IHN1cHBvcnRlZCB1bmRlciBMaW51eC4KKyAKKyogQW5ub3RhdGlvbnMKKworQW5ub3RhdGlvbnMgaGF2ZSBiZWVuIGFkZGVkLiAgVGhlc2UgYXJlIGZvciB1c2Ugd2l0aCBncmFwaGljYWwgaW50ZXJmYWNlcywKK2FuZCBhcmUgc3RpbGwgZXhwZXJpbWVudGFsLiAgQ3VycmVudGx5IG9ubHkgZ2RiYS5lbCB1c2VzIHRoZXNlLgorCisqIEltcHJvdmVkIElyaXggNSBzdXBwb3J0CisKK0dEQiBub3cgd29ya3MgcHJvcGVybHkgd2l0aCBJcml4IDUuMi4KKworKiBJbXByb3ZlZCBIUFBBIHN1cHBvcnQKKworR0RCIG5vdyB3b3JrcyBwcm9wZXJseSB3aXRoIHRoZSBsYXRlc3QgR0NDIGFuZCBHQVMuCisKKyogTmV3IG5hdGl2ZSBjb25maWd1cmF0aW9ucworCitTZXF1ZW50IFBUWDQJCQkJaVszNF04Ni1zZXF1ZW50LXB0eDQKK0hQUEEgcnVubmluZyBPU0YvMQkJCWhwcGEqLSotb3NmKgorQXRhcmkgVFQgcnVubmluZyBTVlI0CQkJbTY4Ki0qLXN5c3Y0KgorUlMvNjAwMCBMeW54T1MJCQkJcnM2MDAwLSotbHlueG9zKgorCisqIE5ldyB0YXJnZXRzCisKK09TLzkwMDAJCQkJCWlbMzRdODYtKi1vczlrCitNSVBTIFI0MDAwCQkJCW1pcHM2NCp7LGVsfS0qLXtlY29mZixlbGZ9CitTcGFyYzY0CQkJCQlzcGFyYzY0LSotKgorCisqIEhpdGFjaGkgU0g3MDAwIGFuZCBFNzAwMC1QQyBJQ0Ugc3VwcG9ydAorCitUaGVyZSBpcyBub3cgc3VwcG9ydCBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBIaXRhY2hpIEU3MDAwLVBDIElDRS4KK1RoaXMgaXMgYXZhaWxhYmxlIGF1dG9tYXRpY2FsbHkgd2hlbiBHREIgaXMgY29uZmlndXJlZCBmb3IgdGhlIFNILgorCisqIEZpeGVzCisKK0FzIHVzdWFsLCBhIHZhcmlldHkgb2Ygc21hbGwgZml4ZXMgYW5kIGltcHJvdmVtZW50cywgYm90aCBnZW5lcmljCithbmQgY29uZmlndXJhdGlvbi1zcGVjaWZpYy4gIFNlZSB0aGUgQ2hhbmdlTG9nIGZvciBtb3JlIGRldGFpbC4KKworKioqIENoYW5nZXMgaW4gR0RCLTQuMTI6CisKKyogSXJpeCA1IGlzIG5vdyBzdXBwb3J0ZWQKKworKiBIUFBBIHN1cHBvcnQKKworR0RCLTQuMTIgb24gdGhlIEhQUEEgaGFzIGEgbnVtYmVyIG9mIGNoYW5nZXMgd2hpY2ggbWFrZSBpdCB1bmFibGUKK3RvIGRlYnVnIHRoZSBvdXRwdXQgZnJvbSB0aGUgY3VycmVudGx5IHJlbGVhc2VkIHZlcnNpb25zIG9mIEdDQyBhbmQKK0dBUyAoR0NDIDIuNS44IGFuZCBHQVMtMi4yIG9yIFBBR0FTLTEuMzYpLiAgVW50aWwgdGhlIG5leHQgbWFqb3IgcmVsZWFzZQorb2YgR0NDIGFuZCBHQVMsIHZlcnNpb25zIG9mIHRoZXNlIHRvb2xzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBHREItNC4xMgorY2FuIGJlIHJldHJpZXZlZCB2aWEgYW5vbnltb3VzIGZ0cCBmcm9tIGphZ3Vhci5jcy51dGFoLmVkdTovZGlzdC4KKworCisqKiogQ2hhbmdlcyBpbiBHREItNC4xMToKKworKiBVc2VyIHZpc2libGUgY2hhbmdlczoKKworKiBSZW1vdGUgRGVidWdnaW5nCisKK1RoZSAic2V0IHJlbW90ZWRlYnVnIiBvcHRpb24gaXMgbm93IGNvbnNpc3RlbnQgYmV0d2VlbiB0aGUgbWlwcyByZW1vdGUKK3RhcmdldCwgcmVtb3RlIHRhcmdldHMgdXNpbmcgdGhlIGdkYi1zcGVjaWZpYyBwcm90b2NvbCwgVURJIChBTUQncworZGVidWcgcHJvdG9jb2wgZm9yIHRoZSAyOWspIGFuZCB0aGUgODhrIGJ1ZyBtb25pdG9yLiAgSXQgaXMgbm93IGFuCitpbnRlZ2VyIHNwZWNpZnlpbmcgYSBkZWJ1ZyBsZXZlbCAobm9ybWFsbHkgMCBvciAxLCBidXQgMiBtZWFucyBtb3JlCitkZWJ1Z2dpbmcgaW5mbyBmb3IgdGhlIG1pcHMgdGFyZ2V0KS4KKworKiBERUMgQWxwaGEgbmF0aXZlIHN1cHBvcnQKKworR0RCIG5vdyB3b3JrcyBvbiB0aGUgREVDIEFscGhhLiAgR0NDIDIuNC41IGRvZXMgbm90IHByb2R1Y2UgdXNhYmxlCitkZWJ1ZyBpbmZvLCBidXQgR0RCIHdvcmtzIGZhaXJseSB3ZWxsIHdpdGggdGhlIERFQyBjb21waWxlciBhbmQgc2hvdWxkCit3b3JrIHdpdGggYSBmdXR1cmUgR0NDIHJlbGVhc2UuICBTZWUgdGhlIFJFQURNRSBmaWxlIGZvciBhIGZldworQWxwaGEtc3BlY2lmaWMgbm90ZXMuCisKKyogUHJlbGltaW5hcnkgdGhyZWFkIGltcGxlbWVudGF0aW9uCisKK0dEQiBub3cgaGFzIHByZWxpbWluYXJ5IHRocmVhZCBzdXBwb3J0IGZvciBib3RoIFNHSS9Jcml4IGFuZCBMeW54T1MuCisKKyogTHlueE9TIG5hdGl2ZSBhbmQgdGFyZ2V0IHN1cHBvcnQgZm9yIDM4NgorCitUaGlzIHJlbGVhc2UgaGFzIGJlZW4gaG9zdGVkIG9uIEx5bnhPUyAyLjIsIGFuZCBhbHNvIGNhbiBiZSBjb25maWd1cmVkCit0byByZW1vdGVseSBkZWJ1ZyBwcm9ncmFtcyBydW5uaW5nIHVuZGVyIEx5bnhPUyAoc2VlIGdkYi9nZGJzZXJ2ZXIvUkVBRE1FCitmb3IgZGV0YWlscykuCisKKyogSW1wcm92ZW1lbnRzIGluIEMrKyBtYW5nbGluZy9kZW1hbmdsaW5nLgorCitUaGlzIHJlbGVhc2UgaGFzIG11Y2ggYmV0dGVyIGcrKyBkZWJ1Z2dpbmcsIHNwZWNpZmljYWxseSBpbiBuYW1lIAorbWFuZ2xpbmcvZGVtYW5nbGluZywgdmlydHVhbCBmdW5jdGlvbiBjYWxscywgcHJpbnQgdmlydHVhbCB0YWJsZSwKK2NhbGwgbWV0aG9kcywgLi4uZXRjLgorCisqKiogQ2hhbmdlcyBpbiBHREItNC4xMDoKKworICogVXNlciB2aXNpYmxlIGNoYW5nZXM6CisKK1JlbW90ZSBkZWJ1Z2dpbmcgdXNpbmcgdGhlIEdEQi1zcGVjaWZpYyAoYHRhcmdldCByZW1vdGUnKSBwcm90b2NvbCBub3cKK3N1cHBvcnRzIHRoZSBgbG9hZCcgY29tbWFuZC4gIFRoaXMgaXMgb25seSB1c2VmdWwgaWYgeW91IGhhdmUgc29tZQorb3RoZXIgd2F5IG9mIGdldHRpbmcgdGhlIHN0dWIgdG8gdGhlIHRhcmdldCBzeXN0ZW0sIGFuZCB5b3UgY2FuIHB1dCBpdAorc29tZXdoZXJlIGluIG1lbW9yeSB3aGVyZSBpdCB3b24ndCBnZXQgY2xvYmJlcmVkIGJ5IHRoZSBkb3dubG9hZC4KKworRmlsZW5hbWUgY29tcGxldGlvbiBub3cgd29ya3MuCisKK1doZW4gcnVuIHVuZGVyIGVtYWNzIG1vZGUsIHRoZSAiaW5mbyBsaW5lIiBjb21tYW5kIG5vdyBjYXVzZXMgdGhlCithcnJvdyB0byBwb2ludCB0byB0aGUgbGluZSBzcGVjaWZpZWQuICBBbHNvLCAiaW5mbyBsaW5lIiBwcmludHMKK2FkZHJlc3NlcyBpbiBzeW1ib2xpYyBmb3JtIChhcyB3ZWxsIGFzIGhleCkuCisKK0FsbCB2eHdvcmtzIGJhc2VkIHRhcmdldHMgbm93IHN1cHBvcnQgYSB1c2VyIHNldHRhYmxlIG9wdGlvbiwgY2FsbGVkCit2eHdvcmtzLXRpbWVvdXQuICBUaGlzIG9wdGlvbiByZXByZXNlbnRzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBnZGIKK3Nob3VsZCB3YWl0IGZvciByZXNwb25zZXMgdG8gcnBjJ3MuICBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZgoreW91ciB2eHdvcmtzIHRhcmdldCBpcywgcGVyaGFwcywgYSBzbG93IHNvZnR3YXJlIHNpbXVsYXRvciBvciBoYXBwZW5zCit0byBiZSBvbiB0aGUgZmFyIHNpZGUgb2YgYSB0aGluIG5ldHdvcmsgbGluZS4KKworICogREVDIGFscGhhIHN1cHBvcnQKKworVGhpcyByZWxlYXNlIGNvbnRhaW5zIHN1cHBvcnQgZm9yIHVzaW5nIGEgREVDIGFscGhhIGFzIGEgR0RCIGhvc3QgZm9yCitjcm9zcyBkZWJ1Z2dpbmcuICBOYXRpdmUgYWxwaGEgZGVidWdnaW5nIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgorCisKKyoqKiBDaGFuZ2VzIGluIEdEQi00Ljk6CisKKyAqIFRlc3RzdWl0ZQorCitUaGlzIGlzIHRoZSBmaXJzdCBHREIgcmVsZWFzZSB3aGljaCBpcyBhY2NvbXBhbmllZCBieSBhIG1hdGNoaW5nIHRlc3RzdWl0ZS4KK1RoZSB0ZXN0c3VpdGUgcmVxdWlyZXMgaW5zdGFsbGF0aW9uIG9mIGRlamFnbnUsIHdoaWNoIHNob3VsZCBiZSBhdmFpbGFibGUKK3ZpYSBmdHAgZnJvbSBtb3N0IHNpdGVzIHRoYXQgY2FycnkgR05VIHNvZnR3YXJlLgorCisgKiBDKysgZGVtYW5nbGluZworCisnQ2Zyb250JyBzdHlsZSBkZW1hbmdsaW5nIGhhcyBoYWQgaXRzIG5hbWUgY2hhbmdlZCB0byAnQVJNJyBzdHlsZSwgdG8KK2VtcGhhc2l6ZSB0aGF0IGl0IHdhcyB3cml0dGVuIGZyb20gdGhlIHNwZWNpZmljYXRpb25zIGluIHRoZSBDKysgQW5ub3RhdGVkCitSZWZlcmVuY2UgTWFudWFsLCBub3QgbmVjZXNzYXJpbHkgdG8gYmUgY29tcGF0aWJsZSB3aXRoIEFUJlQgY2Zyb250LiAgRGVzcGl0ZQorZGlzY2xhaW1lcnMsIGl0IHN0aWxsIGdlbmVyYXRlZCB0b28gbXVjaCBjb25mdXNpb24gd2l0aCB1c2VycyBhdHRlbXB0aW5nIHRvCit1c2UgZ2RiIHdpdGggQVQmVCBjZnJvbnQuCisKKyAqIFNpbXVsYXRvcnMKKworR0RCIG5vdyB1c2VzIGEgc3RhbmRhcmQgcmVtb3RlIGludGVyZmFjZSB0byBhIHNpbXVsYXRvciBsaWJyYXJ5LgorU28gZmFyLCB0aGUgbGlicmFyeSBjb250YWlucyBzaW11bGF0b3JzIGZvciB0aGUgWmlsb2cgWjgwMDEvMiwgdGhlCitIaXRhY2hpIEg4LzMwMCwgSDgvNTAwIGFuZCBTdXBlci1ILgorCisgKiBOZXcgdGFyZ2V0cyBzdXBwb3J0ZWQKKworSDgvMzAwIHNpbXVsYXRvciAJCQloODMwMC1oaXRhY2hpLWhtcyBvciBoODMwMGhtcworSDgvNTAwIHNpbXVsYXRvciAJCQloODUwMC1oaXRhY2hpLWhtcyBvciBoODUwMGhtcworU0ggc2ltdWxhdG9yCQkJCXNoLWhpdGFjaGktaG1zICAgIG9yIHNoCitaODAwMCBzaW11bGF0b3IJCSAgCQl6OGstemlsb2ctbm9uZSAJICBvciB6OGtzaW0KK0lEVCBNSVBTIGJvYXJkIG92ZXIgc2VyaWFsIGxpbmUJCW1pcHMtaWR0LWVjb2ZmCisKK0Nyb3NzLWRlYnVnZ2luZyB0byBHTzMyIHRhcmdldHMgaXMgc3VwcG9ydGVkLiAgSXQgcmVxdWlyZXMgYSBjdXN0b20KK3ZlcnNpb24gb2YgdGhlIGkzODYtc3R1Yi5jIG1vZHVsZSB3aGljaCBpcyBpbnRlZ3JhdGVkIHdpdGggdGhlIAorR08zMiBtZW1vcnkgZXh0ZW5kZXIuCisKKyAqIE5ldyByZW1vdGUgcHJvdG9jb2xzCisKK01JUFMgcmVtb3RlIGRlYnVnZ2luZyBwcm90b2NvbC4KKworICogTmV3IHNvdXJjZSBsYW5ndWFnZXMgc3VwcG9ydGVkCisKK1RoaXMgdmVyc2lvbiBpbmNsdWRlcyBwcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBDaGlsbCwgYSBQYXNjYWwgbGlrZSBsYW5ndWFnZQordXNlZCBieSB0ZWxlY29tbXVuaWNhdGlvbnMgY29tcGFuaWVzLiAgQ2hpbGwgc3VwcG9ydCBpcyBhbHNvIGJlaW5nIGludGVncmF0ZWQKK2ludG8gdGhlIEdOVSBjb21waWxlciwgYnV0IHdlIGRvbid0IGtub3cgd2hlbiBpdCB3aWxsIGJlIHB1YmxpY2FsbHkgYXZhaWxhYmxlLgorCisKKyoqKiBDaGFuZ2VzIGluIEdEQi00Ljg6CisKKyAqIEhQIFByZWNpc2lvbiBBcmNoaXRlY3R1cmUgc3VwcG9ydGVkCisKK0dEQiBub3cgc3VwcG9ydHMgSFAgUEEtUklTQyBtYWNoaW5lcyBydW5uaW5nIEhQVVguICBBIHByZWxpbWluYXJ5Cit2ZXJzaW9uIG9mIHRoaXMgc3VwcG9ydCB3YXMgYXZhaWxhYmxlIGFzIGEgc2V0IG9mIHBhdGNoZXMgZnJvbSB0aGUKK1VuaXZlcnNpdHkgb2YgVXRhaC4gIEdEQiBkb2VzIG5vdCBzdXBwb3J0IGRlYnVnZ2luZyBvZiBwcm9ncmFtcworY29tcGlsZWQgd2l0aCB0aGUgSFAgY29tcGlsZXIsIGJlY2F1c2UgSFAgd2lsbCBub3QgZG9jdW1lbnQgdGhlaXIgZmlsZQorZm9ybWF0LiAgSW5zdGVhZCwgeW91IG11c3QgdXNlIEdDQyAodmVyc2lvbiAyLjMuMiBvciBsYXRlcikgYW5kIFBBLUdBUworKGFzIGF2YWlsYWJsZSBmcm9tIGphZ3Vhci5jcy51dGFoLmVkdTovZGlzdC9wYS1nYXMudTQudGFyLlopLgorCitNYW55IHByb2JsZW1zIGluIHRoZSBwcmVsaW1pbmFyeSB2ZXJzaW9uIGhhdmUgYmVlbiBmaXhlZC4KKworICogRmFzdGVyIGFuZCBiZXR0ZXIgZGVtYW5nbGluZworCitXZSBoYXZlIGltcHJvdmVkIHRlbXBsYXRlIGRlbWFuZ2xpbmcgYW5kIGZpeGVkIG51bWVyb3VzIGJ1Z3MgaW4gdGhlIEdOVSBzdHlsZQorZGVtYW5nbGVyLiAgSXQgY2FuIG5vdyBoYW5kbGUgdHlwZSBtb2RpZmllcnMgc3VjaCBhcyBgc3RhdGljJyBvciBgY29uc3QnLiAgV2lkZQorY2hhcmFjdGVyIHR5cGVzICh3Y2hhcl90KSBhcmUgbm93IHN1cHBvcnRlZC4gIERlbWFuZ2xpbmcgb2YgZWFjaCBzeW1ib2wgaXMgbm93Citvbmx5IGRvbmUgb25jZSwgYW5kIGlzIGNhY2hlZCB3aGVuIHRoZSBzeW1ib2wgdGFibGUgZm9yIGEgZmlsZSBpcyByZWFkIGluLgorVGhpcyByZXN1bHRzIGluIGEgc21hbGwgaW5jcmVhc2UgaW4gbWVtb3J5IHVzYWdlIGZvciBDIHByb2dyYW1zLCBhIG1vZGVyYXRlCitpbmNyZWFzZSBpbiBtZW1vcnkgdXNhZ2UgZm9yIEMrKyBwcm9ncmFtcywgYW5kIGEgZmFudGFzdGljIHNwZWVkdXAgaW4KK3N5bWJvbCBsb29rdXBzLgorCitgQ2Zyb250JyBzdHlsZSBkZW1hbmdsaW5nIHN0aWxsIGRvZXNuJ3Qgd29yayB3aXRoIEFUJlQgY2Zyb250LiAgSXQgd2FzIHdyaXR0ZW4KK2Zyb20gdGhlIHNwZWNpZmljYXRpb25zIGluIHRoZSBBbm5vdGF0ZWQgUmVmZXJlbmNlIE1hbnVhbCwgd2hpY2ggQVQmVCdzCitjb21waWxlciBkb2VzIG5vdCBhY3R1YWxseSBpbXBsZW1lbnQuCisKKyAqIEcrKyBtdWx0aXBsZSBpbmhlcml0YW5jZSBjb21waWxlciBwcm9ibGVtCisKK0luIHRoZSAyLjMuMiByZWxlYXNlIG9mIGdjYy9nKyssIGhvdyB0aGUgY29tcGlsZXIgcmVzb2x2ZXMgbXVsdGlwbGUKK2luaGVyaXRhbmNlIGxhdHRpY2VzIHdhcyByZXdvcmtlZCB0byBwcm9wZXJseSBkaXNjb3ZlciBhbWJpZ3VpdGllcy4gIFdlCityZWNlbnRseSBmb3VuZCBhbiBleGFtcGxlIHdoaWNoIGNhdXNlcyB0aGlzIG5ldyBhbGdvcml0aG0gdG8gZmFpbCBpbiBhCit2ZXJ5IHN1YnRsZSB3YXksIHByb2R1Y2luZyBiYWQgZGVidWcgaW5mb3JtYXRpb24gZm9yIHRob3NlIGNsYXNzZXMuCitUaGUgZmlsZSAnZ2NjLnBhdGNoJyAoaW4gdGhpcyBkaXJlY3RvcnkpIGNhbiBiZSBhcHBsaWVkIHRvIGdjYyB0bworY2lyY3VtdmVudCB0aGUgcHJvYmxlbS4gIEEgZnV0dXJlIEdDQyByZWxlYXNlIHdpbGwgY29udGFpbiBhIGNvbXBsZXRlCitmaXguCisKK1RoZSBwcmV2aW91cyBHKysgZGVidWcgaW5mbyBwcm9ibGVtIChtZW50aW9uZWQgYmVsb3cgZm9yIHRoZSBnZGItNC43CityZWxlYXNlKSBpcyBmaXhlZCBpbiBnY2MgdmVyc2lvbiAyLjMuMi4KKworICogSW1wcm92ZWQgY29uZmlndXJlIHNjcmlwdAorCitUaGUgYGNvbmZpZ3VyZScgc2NyaXB0IHdpbGwgbm93IGF0dGVtcHQgdG8gZ3Vlc3MgeW91ciBzeXN0ZW0gdHlwZSBpZgoreW91IGRvbid0IHN1cHBseSBhIGhvc3Qgc3lzdGVtIHR5cGUuICBUaGUgb2xkIHNjaGVtZSBvZiBzdXBwbHlpbmcgYQoraG9zdCBzeXN0ZW0gdHJpcGxldCBpcyBwcmVmZXJhYmxlIG92ZXIgdXNpbmcgdGhpcy4gIEFsbCB0aGUgbWFnaWMgaXMKK2RvbmUgaW4gdGhlIG5ldyBgY29uZmlnLmd1ZXNzJyBzY3JpcHQuICBFeGFtaW5lIGl0IGZvciBkZXRhaWxzLgorCitXZSBoYXZlIGFsc28gYnJvdWdodCBvdXIgY29uZmlndXJlIHNjcmlwdCBtdWNoIG1vcmUgaW4gbGluZSB3aXRoIHRoZSBGU0YncwordmVyc2lvbi4gIEl0IG5vdyBzdXBwb3J0cyB0aGUgLS13aXRoLXh4eCBvcHRpb25zLiAgSW4gcGFydGljdWxhciwKK2AtLXdpdGgtbWluaW1hbC1iZmQnIGNhbiBiZSB1c2VkIHRvIG1ha2UgdGhlIEdEQiBiaW5hcnkgaW1hZ2Ugc21hbGxlci4KK1RoZSByZXN1bHRpbmcgR0RCIHdpbGwgbm90IGJlIGFibGUgdG8gcmVhZCBhcmJpdHJhcnkgb2JqZWN0IGZpbGUgZm9ybWF0cyAtLQorb25seSB0aGUgZm9ybWF0IGBgZXhwZWN0ZWQnJyB0byBiZSB1c2VkIG9uIHRoZSBjb25maWd1cmVkIHRhcmdldCBzeXN0ZW0uCitXZSBob3BlIHRvIG1ha2UgdGhpcyB0aGUgZGVmYXVsdCBpbiBhIGZ1dHVyZSByZWxlYXNlLgorCisgKiBEb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cworCitUaGVyZSdzIG5ldyBpbnRlcm5hbCBkb2N1bWVudGF0aW9uIG9uIGhvdyB0byBtb2RpZnkgR0RCLCBhbmQgaG93IHRvCitwcm9kdWNlIGNsZWFuIGNoYW5nZXMgdG8gdGhlIGNvZGUuICBXZSBpbXBsb3JlIHBlb3BsZSB0byByZWFkIGl0CitiZWZvcmUgc3VibWl0dGluZyBjaGFuZ2VzLgorCitUaGUgR0RCIG1hbnVhbCB1c2VzIG5ldywgc2V4eSBUZXhpbmZvIGNvbmRpdGlvbmFscywgcmF0aGVyIHRoYW4gYXJjYW5lCitNNCBtYWNyb3MuICBUaGUgbmV3IHRleGluZm8udGV4IGlzIHByb3ZpZGVkIGluIHRoaXMgcmVsZWFzZS4gIFByZS1idWlsdAorYGluZm8nIGZpbGVzIGFyZSBhbHNvIHByb3ZpZGVkLiAgVG8gYnVpbGQgYGluZm8nIGZpbGVzIGZyb20gc2NyYXRjaCwKK3lvdSB3aWxsIG5lZWQgdGhlIGxhdGVzdCBgbWFrZWluZm8nIHJlbGVhc2UsIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlIGluCithIGZ1dHVyZSB0ZXhpbmZvLVguWSByZWxlYXNlLgorCisqTk9URSogIFRoZSBuZXcgdGV4aW5mby50ZXggY2FuIGNhdXNlIG9sZCB2ZXJzaW9ucyBvZiBUZVggdG8gaGFuZy4KK1dlJ3JlIG5vdCBzdXJlIGV4YWN0bHkgd2hpY2ggdmVyc2lvbnMgaGF2ZSB0aGlzIHByb2JsZW0sIGJ1dCBpdCBoYXMKK2JlZW4gc2VlbiBpbiAzLjAuICBXZSBoaWdobHkgcmVjb21tZW5kIHVwZ3JhZGluZyB0byBUZVggdmVyc2lvbiAzLjE0MQorb3IgYmV0dGVyLiAgSWYgdGhhdCBpc24ndCBwb3NzaWJsZSwgdGhlcmUgaXMgYSBwYXRjaCBpbgorYHRleGluZm8vdGV4M3BhdGNoJyB0aGF0IHdpbGwgbW9kaWZ5IGB0ZXhpbmZvL3RleGluZm8udGV4JyB0byB3b3JrCithcm91bmQgdGhpcyBwcm9ibGVtLgorCisgKiBOZXcgZmVhdHVyZXMKKworR0RCIG5vdyBzdXBwb3J0cyBhcnJheSBjb25zdGFudHMgdGhhdCBjYW4gYmUgdXNlZCBpbiBleHByZXNzaW9ucyB0eXBlZCBpbiBieQordGhlIHVzZXIuICBUaGUgc3ludGF4IGlzIGB7ZWxlbWVudCwgZWxlbWVudCwgLi4ufScuICBJZTogeW91IGNhbiBub3cgdHlwZQorYHByaW50IHsxLCAyLCAzfScsIGFuZCBpdCB3aWxsIGJ1aWxkIHVwIGFuIGFycmF5IGluIG1lbW9yeSBtYWxsb2MnZCBpbgordGhlIHRhcmdldCBwcm9ncmFtLgorCitUaGUgbmV3IGRpcmVjdG9yeSBgZ2RiL3NwYXJjbGl0ZScgY29udGFpbnMgYSBwcm9ncmFtIHRoYXQgZGVtb25zdHJhdGVzCitob3cgdGhlIHNwYXJjLXN0dWIuYyByZW1vdGUgc3R1YiBydW5zIG9uIGEgRnVqaXRzdSBTUEFSQ2xpdGUgcHJvY2Vzc29yLgorCisgKiBOZXcgbmF0aXZlIGhvc3RzIHN1cHBvcnRlZAorCitIUC9QQS1SSVNDIHVuZGVyIEhQVVggdXNpbmcgR05VIHRvb2xzCWhwcGExLjEtaHAtaHB1eAorMzg2IENQVXMgcnVubmluZyBTQ08gVW5peCAzLjJ2NAkJaTM4Ni11bmtub3duLXNjbzMuMnY0CisKKyAqIE5ldyB0YXJnZXRzIHN1cHBvcnRlZAorCitBTUQgMjlrIGZhbWlseSB2aWEgVURJCQkJYTI5ay1hbWQtdWRpICBvciAgdWRpMjlrCisKKyAqIE5ldyBmaWxlIGZvcm1hdHMgc3VwcG9ydGVkCisKK0JGRCBub3cgc3VwcG9ydHMgcmVhZGluZyBIUC9QQS1SSVNDIGV4ZWN1dGFibGVzIChTT00gZmlsZSBmb3JtYXQ/KSwKK0hQVVggY29yZSBmaWxlcywgYW5kIFNDTyAzLjJ2MiBjb3JlIGZpbGVzLgorCisgKiBNYWpvciBidWcgZml4ZXMKKworQXR0YWNoaW5nIHRvIHByb2Nlc3NlcyBub3cgd29ya3MgYWdhaW47IHRoYW5rcyBmb3IgdGhlIG1hbnkgYnVnIHJlcG9ydHMuCisKK1dlIGhhdmUgYWxzbyBzdG9tcGVkIG9uIGEgYnVuY2ggb2YgY29yZSBkdW1wcyBjYXVzZWQgYnkKK3ByaW50Zl9maWx0ZXJlZCgiJXMiKSBwcm9ibGVtcy4KKworV2UgZWxpbWluYXRlZCBhIGNvcHlyaWdodCBwcm9ibGVtIG9uIHRoZSBycGMgYW5kIHB0cmFjZSBoZWFkZXIgZmlsZXMKK2ZvciBWeFdvcmtzLCB3aGljaCB3YXMgZGlzY292ZXJlZCBhdCB0aGUgbGFzdCBtaW51dGUgZHVyaW5nIHRoZSA0LjcKK3JlbGVhc2UuICBZb3Ugc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGJ1aWxkIGEgVnhXb3JrcyBHREIuCisKK1lvdSBjYW4gbm93IGludGVycnVwdCBnZGIgd2hpbGUgYW4gYXR0YWNoZWQgcHJvY2VzcyBpcyBydW5uaW5nLiAgVGhpcword2lsbCBjYXVzZSB0aGUgYXR0YWNoZWQgcHJvY2VzcyB0byBzdG9wLCBhbmQgZ2l2ZSBjb250cm9sIGJhY2sgdG8gR0RCLgorCitXZSBmaXhlZCBwcm9ibGVtcyBjYXVzZWQgYnkgdXNpbmcgdG9vIG1hbnkgZmlsZSBkZXNjcmlwdG9ycworZm9yIHJlYWRpbmcgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcyBhbmQgbGlicmFyaWVzLiAgVGhpcyB3YXMKK2VzcGVjaWFsbHkgYSBwcm9ibGVtIGZvciBwcm9ncmFtcyB0aGF0IHVzZWQgbWFueSAofjEwMCkgc2hhcmVkCitsaWJyYXJpZXMuCisKK1RoZSBgc3RlcCcgY29tbWFuZCBub3cgb25seSBlbnRlcnMgYSBzdWJyb3V0aW5lIGlmIHRoZXJlIGlzIGxpbmUgbnVtYmVyCitpbmZvcm1hdGlvbiBmb3IgdGhlIHN1YnJvdXRpbmUuICBPdGhlcndpc2UgaXQgYWN0cyBsaWtlIHRoZSBgbmV4dCcKK2NvbW1hbmQuICBQcmV2aW91c2x5LCBgc3RlcCcgd291bGQgZW50ZXIgc3Vicm91dGluZXMgaWYgdGhlcmUgd2FzCithbnkgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSByb3V0aW5lLiAgVGhpcyBhdm9pZHMgcHJvYmxlbXMKK3doZW4gdXNpbmcgYGNjIC1nMScgb24gTUlQUyBtYWNoaW5lcy4KKworICogSW50ZXJuYWwgaW1wcm92ZW1lbnRzCisKK0dEQidzIGludGVybmFsIGludGVyZmFjZXMgaGF2ZSBiZWVuIGltcHJvdmVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHN1cHBvcnQKK2RlYnVnZ2luZyBvZiBtdWx0aXBsZSBsYW5ndWFnZXMgaW4gdGhlIGZ1dHVyZS4KKworR0RCIG5vdyB1c2VzIGEgY29tbW9uIHN0cnVjdHVyZSBmb3Igc3ltYm9sIGluZm9ybWF0aW9uIGludGVybmFsbHkuCitNaW5pbWFsIHN5bWJvbHMgKGRlcml2ZWQgZnJvbSBsaW5rYWdlIHN5bWJvbHMgaW4gb2JqZWN0IGZpbGVzKSwgcGFydGlhbAorc3ltYm9scyAoZnJvbSBhIHF1aWNrIHNjYW4gb2YgZGVidWcgaW5mb3JtYXRpb24pLCBhbmQgZnVsbCBzeW1ib2xzCitjb250YWluIGEgY29tbW9uIHN1YnNldCBvZiBpbmZvcm1hdGlvbiwgbWFraW5nIGl0IGVhc2llciB0byB3cml0ZQorc2hhcmVkIGNvZGUgdGhhdCBoYW5kbGVzIGFueSBvZiB0aGVtLgorCisgKiBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMKKworV2Ugbm93IGFjY2VwdCAtLXNpbGVudCBhcyBhbiBhbGlhcyBmb3IgLS1xdWlldC4KKworICogTW1hbGxvYyBsaWNlbnNpbmcKKworVGhlIG1lbW9yeS1tYXBwZWQtbWFsbG9jIGxpYnJhcnkgaXMgbm93IGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgTGlicmFyeQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworKioqIENoYW5nZXMgaW4gR0RCLTQuNzoKKworICogSG9zdC9uYXRpdmUvdGFyZ2V0IHNwbGl0CisKK0dEQiBoYXMgaGFkIHNvbWUgbWFqb3IgaW50ZXJuYWwgc3VyZ2VyeSB0byB1bnRhbmdsZSB0aGUgc3VwcG9ydCBmb3IKK2hvc3RzIGFuZCByZW1vdGUgdGFyZ2V0cy4gIE5vdywgd2hlbiB5b3UgY29uZmlndXJlIEdEQiBmb3IgYSByZW1vdGUKK3RhcmdldCwgaXQgd2lsbCBubyBsb25nZXIgbG9hZCBpbiBhbGwgb2YgdGhlIHN1cHBvcnQgZm9yIGRlYnVnZ2luZworbG9jYWwgcHJvZ3JhbXMgb24gdGhlIGhvc3QuICBXaGVuIGZ1bGx5IGNvbXBsZXRlZCBhbmQgdGVzdGVkLCB0aGlzIHdpbGwKK2Vuc3VyZSB0aGF0IGFyYml0cmFyeSBob3N0L3RhcmdldCBjb21iaW5hdGlvbnMgYXJlIHBvc3NpYmxlLgorCitUaGUgcHJpbWFyeSBjb25jZXB0dWFsIHNoaWZ0IGlzIHRvIHNlcGFyYXRlIHRoZSBub24tcG9ydGFibGUgY29kZSBpbgorR0RCIGludG8gdGhyZWUgY2F0ZWdvcmllcy4gIEhvc3Qgc3BlY2lmaWMgY29kZSBpcyByZXF1aXJlZCBhbnkgdGltZSBHREIKK2lzIGNvbXBpbGVkIG9uIHRoYXQgaG9zdCwgcmVnYXJkbGVzcyBvZiB0aGUgdGFyZ2V0LiAgVGFyZ2V0IHNwZWNpZmljCitjb2RlIHJlbGF0ZXMgdG8gdGhlIHBlY3VsaWFyaXRpZXMgb2YgdGhlIHRhcmdldCwgYnV0IGNhbiBiZSBjb21waWxlZCBvbgorYW55IGhvc3QuICBOYXRpdmUgc3BlY2lmaWMgY29kZSBpcyBldmVyeXRoaW5nIGVsc2U6ICBpdCBjYW4gb25seSBiZQorYnVpbHQgd2hlbiB0aGUgaG9zdCBhbmQgdGFyZ2V0IGFyZSB0aGUgc2FtZSBzeXN0ZW0uICBDaGlsZCBwcm9jZXNzCitoYW5kbGluZyBhbmQgY29yZSBmaWxlIHN1cHBvcnQgYXJlIHR3byBjb21tb24gYG5hdGl2ZScgZXhhbXBsZXMuCisKK0dEQidzIHVzZSBvZiAvcHJvYyBmb3IgY29udHJvbGxpbmcgVW5peCBjaGlsZCBwcm9jZXNzZXMgaXMgbm93IGNsZWFuZXIuCitJdCBoYXMgYmVlbiBzcGxpdCBvdXQgaW50byBhIHNpbmdsZSBtb2R1bGUgdW5kZXIgdGhlIGB0YXJnZXRfb3BzJyB2ZWN0b3IsCitwbHVzIHR3byBuYXRpdmUtZGVwZW5kZW50IGZ1bmN0aW9ucyBmb3IgZWFjaCBzeXN0ZW0gdGhhdCB1c2VzIC9wcm9jLgorCisgKiBOZXcgaG9zdHMgc3VwcG9ydGVkCisKK0hQL0Fwb2xsbyA2OGsgKHVuZGVyIHRoZSBCU0QgZG9tYWluKQltNjhrLWFwb2xsby1ic2QgIG9yICBhcG9sbG82OGJzZAorMzg2IENQVXMgcnVubmluZyB2YXJpb3VzIEJTRCBwb3J0cwlpMzg2LXVua25vd24tYnNkICBvciAgMzg2YnNkCiszODYgQ1BVcyBydW5uaW5nIFNDTyBVbml4CQlpMzg2LXVua25vd24tc2Nvc3lzdjMyMiAgb3IgIGkzODZzY28KKworICogTmV3IHRhcmdldHMgc3VwcG9ydGVkCisKK0Z1aml0c3UgU1BBUkNsaXRlIAkJCXNwYXJjbGl0ZS1mdWppdHN1LW5vbmUgIG9yICBzcGFyY2xpdGUKKzY4MDMwIGFuZCBDUFUzMgkJCQltNjgwMzAtKi0qLCBtNjgzMzItKi0qCisKKyAqIE5ldyBuYXRpdmUgaG9zdHMgc3VwcG9ydGVkCisKKzM4NiBDUFVzIHJ1bm5pbmcgdmFyaW91cyBCU0QgcG9ydHMJaTM4Ni11bmtub3duLWJzZCAgb3IgIDM4NmJzZAorICAgICgzODZic2QgaXMgbm90IHdlbGwgdGVzdGVkIHlldCkKKzM4NiBDUFVzIHJ1bm5pbmcgU0NPIFVuaXgJCWkzODYtdW5rbm93bi1zY29zeXN2MzIyICBvciAgc2NvCisKKyAqIE5ldyBmaWxlIGZvcm1hdHMgc3VwcG9ydGVkCisKK0JGRCBub3cgc3VwcG9ydHMgQ09GRiBmaWxlcyBmb3IgdGhlIFppbG9nIFo4MDAwIG1pY3JvcHJvY2Vzc29yLiAgSXQKK3N1cHBvcnRzIHJlYWRpbmcgb2YgYGEub3V0LmFkb2JlJyBvYmplY3QgZmlsZXMsIHdoaWNoIGFyZSBhbiBhLm91dAorZm9ybWF0IGV4dGVuZGVkIHdpdGggbWluaW1hbCBpbmZvcm1hdGlvbiBhYm91dCBtdWx0aXBsZSBzZWN0aW9ucy4KKworICogTmV3IGNvbW1hbmRzCisKK2BzaG93IGNvcHlpbmcnIGlzIHRoZSBzYW1lIGFzIHRoZSBvbGQgYGluZm8gY29weWluZycuCitgc2hvdyB3YXJyYW50eScgaXMgdGhlIHNhbWUgYXMgYGluZm8gd2FycmFudGVlJy4KK1RoZXNlIHdlcmUgcmVuYW1lZCBmb3IgY29uc2lzdGVuY3kuICBUaGUgb2xkIGNvbW1hbmRzIGNvbnRpbnVlIHRvIHdvcmsuCisKK2BpbmZvIGhhbmRsZScgaXMgYSBuZXcgYWxpYXMgZm9yIGBpbmZvIHNpZ25hbHMnLgorCitZb3UgY2FuIG5vdyBkZWZpbmUgcHJlLWNvbW1hbmQgaG9va3MsIHdoaWNoIGF0dGFjaCBhcmJpdHJhcnkgY29tbWFuZAorc2NyaXB0cyB0byBhbnkgY29tbWFuZC4gIFRoZSBjb21tYW5kcyBpbiB0aGUgaG9vayB3aWxsIGJlIGV4ZWN1dGVkCitwcmlvciB0byB0aGUgdXNlcidzIGNvbW1hbmQuICBZb3UgY2FuIGFsc28gY3JlYXRlIGEgaG9vayB3aGljaCB3aWxsIGJlCitleGVjdXRlZCB3aGVuZXZlciB0aGUgcHJvZ3JhbSBzdG9wcy4gIFNlZSBnZGIudGV4aW5mby4KKworICogQysrIGltcHJvdmVtZW50cworCitXZSBub3cgZGVhbCB3aXRoIENmcm9udCBzdHlsZSBuYW1lIG1hbmdsaW5nLCBhbmQgY2FuIGV2ZW4gZXh0cmFjdCB0eXBlCitpbmZvIGZyb20gbWFuZ2xlZCBzeW1ib2xzLiAgR0RCIGNhbiBhdXRvbWF0aWNhbGx5IGZpZ3VyZSBvdXQgd2hpY2gKK3N5bWJvbCBtYW5nbGluZyBzdHlsZSB5b3VyIEMrKyBjb21waWxlciB1c2VzLgorCitDYWxsaW5nIG9mIG1ldGhvZHMgYW5kIHZpcnR1YWwgZnVuY3Rpb25zIGhhcyBiZWVuIGltcHJvdmVkIGFzIHdlbGwuCisKKyAqIE1ham9yIGJ1ZyBmaXhlcworCitUaGUgY3Jhc2ggdGhhdCBvY2N1cmVkIHdoZW4gZGVidWdnaW5nIFN1biBBbnNpLUMgY29tcGlsZWQgYmluYXJpZXMgaXMKK2ZpeGVkLiAgVGhpcyB3YXMgZHVlIHRvIG1pc2hhbmRsaW5nIG9mIHRoZSBleHRyYSBOX1NPIHN0YWJzIG91dHB1dAorYnkgdGhlIGNvbXBpbGVyLgorCitXZSBhbHNvIGZpbmFsbHkgZ290IFVsdHJpeCA0LjIgcnVubmluZyBpbiBob3VzZSwgYW5kIGZpeGVkIGNvcmUgZmlsZQorc3VwcG9ydCwgd2l0aCBoZWxwIGZyb20gYSBkb3plbiBwZW9wbGUgb24gdGhlIG5ldC4KKworSm9obiBNLiBGYXJyZWxsIGRpc2NvdmVyZWQgdGhhdCB0aGUgcmVhc29uIHRoYXQgc2luZ2xlLXN0ZXBwaW5nIHdhcyBzbworc2xvdyBvbiBhbGwgb2YgdGhlIE1pcHMgYmFzZWQgcGxhdGZvcm1zIChwcmltYXJpbHkgU0dJIGFuZCBERUMpIHdhcwordGhhdCB3ZSB3ZXJlIHRyeWluZyB0byBkZW1hbmdsZSBhbmQgbG9va3VwIGEgc3ltYm9sIHVzZWQgZm9yIGludGVybmFsCitwdXJwb3NlcyBvbiBldmVyeSBpbnN0cnVjdGlvbiB0aGF0IHdhcyBiZWluZyBzdGVwcGVkIHRocm91Z2guICBDaGFuZ2luZwordGhlIG5hbWUgb2YgdGhhdCBzeW1ib2wgc28gdGhhdCBpdCBjb3VsZG4ndCBiZSBtaXN0YWtlbiBmb3IgYSBDKysKK21hbmdsZWQgc3ltYm9sIHNwZWQgdGhpbmdzIHVwIGEgZ3JlYXQgZGVhbC4KKworUmljaCBQaXhsZXkgc3BlZCB1cCBzeW1ib2wgbG9va3VwcyBpbiBnZW5lcmFsIGJ5IGdldHRpbmcgbXVjaCBzbWFydGVyCithYm91dCB3aGVuIEMrKyBzeW1ib2wgbWFuZ2xpbmcgaXMgbmVjZXNzYXJ5LiAgVGhpcyBzaG91bGQgbWFrZSBzeW1ib2wKK2NvbXBsZXRpb24gKFRBQiBvbiB0aGUgY29tbWFuZCBsaW5lKSBtdWNoIGZhc3Rlci4gIEl0J3Mgbm90IGFzIGZhc3QgYXMKK3dlJ2QgbGlrZSwgYnV0IGl0J3Mgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbiBnZGItNC42LgorCisgKiBBTUQgMjlrIHN1cHBvcnQKKworQSBuZXcgdXNlciBjb250cm9sbGFibGUgdmFyaWFibGUgJ2NhbGxfc2NyYXRjaF9hZGRyZXNzJyBjYW4KK3NwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIGEgc2NyYXRjaCBhcmVhIHRvIGJlIHVzZWQgd2hlbiBHREIKK2NhbGxzIGEgZnVuY3Rpb24gaW4gdGhlIHRhcmdldC4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlCit1c3VhbCBtZXRob2Qgb2YgcHV0dGluZyB0aGUgc2NyYXRjaCBhcmVhIG9uIHRoZSBzdGFjayBkb2VzIG5vdCB3b3JrCitpbiBzeXN0ZW1zIHRoYXQgaGF2ZSBzZXBhcmF0ZSBpbnN0cnVjdGlvbiBhbmQgZGF0YSBzcGFjZXMuCisKK1dlIGludGVncmF0ZWQgY2hhbmdlcyB0byBzdXBwb3J0IHRoZSAyOWsgVURJIChVbml2ZXJzYWwgRGVidWdnZXIKK0ludGVyZmFjZSksIGJ1dCBkaXNjb3ZlcmVkIGF0IHRoZSBsYXN0IG1pbnV0ZSB0aGF0IHdlIGRpZG4ndCBoYXZlIGFsbAorb2YgdGhlIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBwYXBlcndvcmsuICBXZSBhcmUgd29ya2luZyB3aXRoIEFNRCB0bworcmVzb2x2ZSB0aGlzLCBhbmQgaG9wZSB0byBoYXZlIGl0IGF2YWlsYWJsZSBzb29uLgorCisgKiBSZW1vdGUgaW50ZXJmYWNlcworCitXZSBoYXZlIHNwZWQgdXAgdGhlIHJlbW90ZSBzZXJpYWwgbGluZSBwcm90b2NvbCwgZXNwZWNpYWxseSBmb3IgdGFyZ2V0cword2l0aCBsb3RzIG9mIHJlZ2lzdGVycy4gIEl0IG5vdyBzdXBwb3J0cyBhIG5ldyBgZXhwZWRpdGVkIHN0YXR1cycgKCdUJykKK21lc3NhZ2Ugd2hpY2ggY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIGV4aXN0aW5nICdTJyBzdGF0dXMgbWVzc2FnZS4KK1RoaXMgYWxsb3dzIHRoZSByZW1vdGUgc3R1YiB0byBzZW5kIG9ubHkgdGhlIHJlZ2lzdGVycyB0aGF0IEdEQgorbmVlZHMgdG8gbWFrZSBhIHF1aWNrIGRlY2lzaW9uIGFib3V0IHNpbmdsZS1zdGVwcGluZyBvciBjb25kaXRpb25hbAorYnJlYWtwb2ludHMsIGVsaW1pbmF0aW5nIHRoZSBuZWVkIHRvIGZldGNoIHRoZSBlbnRpcmUgcmVnaXN0ZXIgc2V0IGZvcgorZWFjaCBpbnN0cnVjdGlvbiBiZWluZyBzdGVwcGVkIHRocm91Z2guCisKK1RoZSBHREIgcmVtb3RlIHNlcmlhbCBwcm90b2NvbCBub3cgaW1wbGVtZW50cyBhIHdyaXRlLXRocm91Z2ggY2FjaGUgZm9yCityZWdpc3RlcnMsIG9ubHkgcmUtcmVhZGluZyB0aGUgcmVnaXN0ZXJzIGlmIHRoZSB0YXJnZXQgaGFzIHJ1bi4KKworVGhlcmUgaXMgYWxzbyBhIG5ldyByZW1vdGUgc2VyaWFsIHN0dWIgZm9yIFNQQVJDIHByb2Nlc3NvcnMuICBZb3UgY2FuCitmaW5kIGl0IGluIGdkYi00LjcvZ2RiL3NwYXJjLXN0dWIuYy4gIFRoaXMgd2FzIHdyaXR0ZW4gdG8gc3VwcG9ydCB0aGUKK0Z1aml0c3UgU1BBUkNsaXRlIHByb2Nlc3NvciwgYnV0IHdpbGwgcnVuIG9uIGFueSBzdGFuZC1hbG9uZSBTUEFSQworcHJvY2Vzc29yIHdpdGggYSBzZXJpYWwgcG9ydC4KKworICogQ29uZmlndXJhdGlvbgorCitDb25maWd1cmUuaW4gZmlsZXMgaGF2ZSBiZWNvbWUgbXVjaCBlYXNpZXIgdG8gcmVhZCBhbmQgbW9kaWZ5LiAgQSBuZXcKK2B0YWJsZSBkcml2ZW4nIGZvcm1hdCBtYWtlcyBpdCBtb3JlIG9idmlvdXMgd2hhdCBjb25maWd1cmF0aW9ucyBhcmUKK3N1cHBvcnRlZCwgYW5kIHdoYXQgZmlsZXMgZWFjaCBvbmUgdXNlcy4KKworICogTGlicmFyeSBjaGFuZ2VzCisKK1RoZXJlIGlzIGEgbmV3IG9wY29kZXMgbGlicmFyeSB3aGljaCB3aWxsIGV2ZW50dWFsbHkgY29udGFpbiBhbGwgb2YgdGhlCitkaXNhc3NlbWJseSByb3V0aW5lcyBhbmQgb3Bjb2RlIHRhYmxlcy4gIEF0IHByZXNlbnQsIGl0IG9ubHkgY29udGFpbnMKK1NwYXJjIGFuZCBaODAwMCByb3V0aW5lcy4gIFRoaXMgd2lsbCBhbGxvdyB0aGUgYXNzZW1ibGVyLCBkZWJ1Z2dlciwgYW5kCitkaXNhc3NlbWJsZXIgKGJpbnV0aWxzL29iamR1bXApIHRvIHNoYXJlIHRoZXNlIHJvdXRpbmVzLgorCitUaGUgbGliaWJlcnR5IGxpYnJhcnkgaXMgbm93IGNvcHlsZWZ0ZWQgdW5kZXIgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlLiAgVGhpcyBhbGxvd3MgbW9yZSBsaWJlcmFsIHVzZSwgYW5kIHdhcyBkb25lIHNvIGxpYmcrKworY2FuIHVzZSBpdC4gIFRoaXMgbWFrZXMgbm8gZGlmZmVyZW5jZSB0byBHREIsIHNpbmNlIHRoZSBMaWJyYXJ5IExpY2Vuc2UKK2dyYW50cyBhbGwgdGhlIHJpZ2h0cyBmcm9tIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgKiBEb2N1bWVudGF0aW9uCisKK1RoZSBmaWxlIGdkYi00LjcvZ2RiL2RvYy9zdGFicy50ZXhpbmZvIGlzIGEgKHJlbGF0aXZlbHkpIGNvbXBsZXRlCityZWZlcmVuY2UgdG8gdGhlIHN0YWJzIHN5bWJvbCBpbmZvIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgSXQgaXMgKGFzIGZhcgorYXMgd2Uga25vdykgdGhlIG9ubHkgcHVibGlzaGVkIGRvY3VtZW50IG9uIHRoaXMgZmFzY2luYXRpbmcgdG9waWMuICBXZQorZW5jb3VyYWdlIHlvdSB0byByZWFkIGl0LCBjb21wYXJlIGl0IHRvIHRoZSBzdGFicyBpbmZvcm1hdGlvbiBvbiB5b3VyCitzeXN0ZW0sIGFuZCBzZW5kIGltcHJvdmVtZW50cyBvbiB0aGUgZG9jdW1lbnQgaW4gZ2VuZXJhbCAodG8KK2J1Zy1nZGJAcHJlcC5haS5taXQuZWR1KS4KKworQW5kLCBvZiBjb3Vyc2UsIG1hbnkgYnVncyBoYXZlIGJlZW4gZml4ZWQuCisKKworKioqIENoYW5nZXMgaW4gR0RCLTQuNjoKKworICogQmV0dGVyIHN1cHBvcnQgZm9yIEMrKyBmdW5jdGlvbiBuYW1lcworCitHREIgbm93IGFjY2VwdHMgYXMgaW5wdXQgdGhlICJkZW1hbmdsZWQgZm9ybSIgb2YgQysrIG92ZXJsb2FkZWQgZnVuY3Rpb24KK25hbWVzIGFuZCBtZW1iZXIgZnVuY3Rpb24gbmFtZXMsIGFuZCBjYW4gZG8gY29tbWFuZCBjb21wbGV0aW9uIG9uIHN1Y2ggbmFtZXMKKyh1c2luZyBUQUIsIFRBQi1UQUIsIGFuZCBFU0MtPykuICBUaGUgbmFtZXMgaGF2ZSB0byBiZSBxdW90ZWQgd2l0aCBhIHBhaXIgb2YKK3NpbmdsZSBxdW90ZXMuICBFeGFtcGxlcyBhcmUgJ2Z1bmMgKGludCwgbG9uZyknIGFuZCAnb2JqOjpvcGVyYXRvcj09KG9iaiYpJy4KK01ha2UgdXNlIG9mIGNvbW1hbmQgY29tcGxldGlvbiwgaXQgaXMgeW91ciBmcmllbmQuCisKK0dEQiBhbHNvIG5vdyBhY2NlcHRzIGEgdmFyaWV0eSBvZiBDKysgbWFuZ2xlZCBzeW1ib2wgZm9ybWF0cy4gIFRoZXkgYXJlCit0aGUgR05VIGcrKyBzdHlsZSwgdGhlIENmcm9udCAoQVJNKSBzdHlsZSwgYW5kIHRoZSBMdWNpZCAobGNjKSBzdHlsZS4KK1lvdSBjYW4gdGVsbCBHREIgd2hpY2ggZm9ybWF0IHRvIHVzZSBieSBkb2luZyBhICdzZXQgZGVtYW5nbGUtc3R5bGUge2dudSwKK2x1Y2lkLCBjZnJvbnQsIGF1dG99Jy4gICdnbnUnIGlzIHRoZSBkZWZhdWx0LiAgRG8gYSAnc2V0IGRlbWFuZ2xlLXN0eWxlIGZvbycKK2ZvciB0aGUgbGlzdCBvZiBmb3JtYXRzLgorCisgKiBHKysgc3ltYm9sIG1hbmdsaW5nIHByb2JsZW0KKworUmVjZW50IHZlcnNpb25zIG9mIGdjYyBoYXZlIGEgYnVnIGluIGhvdyB0aGV5IGVtaXQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvcgorQysrIG1ldGhvZHMgKHdoZW4gdXNpbmcgZGJ4LXN0eWxlIHN0YWJzKS4gIFRoZSBmaWxlICdnY2MucGF0Y2gnIChpbiB0aGlzCitkaXJlY3RvcnkpIGNhbiBiZSBhcHBsaWVkIHRvIGdjYyB0byBmaXggdGhlIHByb2JsZW0uICBBbHRlcm5hdGl2ZWx5LCBpZiB5b3UKK2Nhbid0IGZpeCBnY2MsIHlvdSBjYW4gI2RlZmluZSBHQ0NfTUFOR0xFX0JVRyB3aGVuIGNvbXBsaW5nIGdkYi9zeW10YWIuYy4gVGhlCit1c3VhbCBzeW1wdG9tIGlzIGRpZmZpY3VsdHkgd2l0aCBzZXR0aW5nIGJyZWFrcG9pbnRzIG9uIG1ldGhvZHMuICBHREIgY29tcGxhaW5zCithYm91dCB0aGUgbWV0aG9kIGJlaW5nIG5vbi1leGlzdGVudC4gIChXZSBiZWxpZXZlIHRoYXQgdmVyc2lvbiAyLjIuMiBvZiBHQ0MgaGFzCit0aGlzIHByb2JsZW0uKQorCisgKiBOZXcgJ21haW50ZW5hbmNlJyBjb21tYW5kCisKK0FsbCBvZiB0aGUgY29tbWFuZHMgcmVsYXRlZCB0byBoYWNraW5nIEdEQiBpbnRlcm5hbHMgaGF2ZSBiZWVuIG1vdmVkIG91dCBvZgordGhlIG1haW4gY29tbWFuZCBzZXQsIGFuZCBub3cgbGl2ZSBiZWhpbmQgdGhlICdtYWludGVuYW5jZScgY29tbWFuZC4gIFRoaXMKK2NhbiBhbHNvIGJlIGFiYnJldmlhdGVkIGFzICdtdCcuICBUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlOgorCisJZHVtcC1tZSAtPgkJbWFpbnRlbmFuY2UgZHVtcC1tZQorCWluZm8gYWxsLWJyZWFrcG9pbnRzIC0+CW1haW50ZW5hbmNlIGluZm8gYnJlYWtwb2ludHMKKwlwcmludG1zeW1zIC0+CQltYWludGVuYW5jZSBwcmludCBtc3ltcworCXByaW50b2JqZmlsZXMgLT4JbWFpbnRlbmFuY2UgcHJpbnQgb2JqZmlsZXMKKwlwcmludHBzeW1zIC0+CQltYWludGVuYW5jZSBwcmludCBwc3ltYm9scworCXByaW50c3ltcyAtPgkJbWFpbnRlbmFuY2UgcHJpbnQgc3ltYm9scworCitUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSBuZXc6CisKKwltYWludGVuYW5jZSBkZW1hbmdsZQlDYWxsIGludGVybmFsIEdEQiBkZW1hbmdsZXIgcm91dGluZSB0bworCQkJCWRlbWFuZ2xlIGEgQysrIGxpbmsgbmFtZSBhbmQgcHJpbnRzIHRoZSByZXN1bHQuCisJbWFpbnRlbmFuY2UgcHJpbnQgdHlwZQlQcmludCBhIHR5cGUgY2hhaW4gZm9yIGEgZ2l2ZW4gc3ltYm9sCisKKyAqIENoYW5nZSB0byAuZ2RiaW5pdCBmaWxlIHByb2Nlc3NpbmcKKworV2Ugbm93IHJlYWQgdGhlICRIT01FLy5nZGJpbml0IGZpbGUgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIGFyZ3YgYXJndW1lbnRzCisoZS5nLiByZWFkaW5nIHN5bWJvbCBmaWxlcyBvciBjb3JlIGZpbGVzKS4gIFRoaXMgYWxsb3dzIGdsb2JhbCBwYXJhbWV0ZXJzIHRvCitiZSBzZXQsIHdoaWNoIHdpbGwgYXBwbHkgZHVyaW5nIHRoZSBzeW1ib2wgcmVhZGluZy4gIFRoZSAuLy5nZGJpbml0IGlzIHN0aWxsCityZWFkIGFmdGVyIGFyZ3YgcHJvY2Vzc2luZy4KKworICogTmV3IGhvc3RzIHN1cHBvcnRlZAorCitTb2xhcmlzLTIuMCAhISEJCQkJc3BhcmMtc3VuLXNvbGFyaXMyICBvciAgc3VuNHNvbDIKKworTGludXggc3VwcG9ydAkJCQlpMzg2LXVua25vd24tbGludXggIG9yICBsaW51eAorCitXZSBhcmUgYWxzbyBpbmNsdWRpbmcgY29kZSB0byBzdXBwb3J0IHRoZSBIUC9QQSBydW5uaW5nIEJTRCBhbmQgSFBVWC4gIFRoaXMKK2lzIGFsbW9zdCBndWFyYW50ZWVkIG5vdCB0byB3b3JrLCBhcyB3ZSBkaWRuJ3QgaGF2ZSB0aW1lIHRvIHRlc3Qgb3IgYnVpbGQgaXQKK2ZvciB0aGlzIHJlbGVhc2UuICBXZSBhcmUgaW5jbHVkaW5nIGl0IHNvIHRoYXQgdGhlIG1vcmUgYWR2ZW50dXJvdXMgKG9yCittYXNvY2hpc3RpYykgb2YgeW91IGNhbiBwbGF5IHdpdGggaXQuICBXZSBhbHNvIGhhZCBtYWpvciBwcm9ibGVtcyB3aXRoIHRoZQorZmFjdCB0aGF0IHRoZSBjb21waWxlciB0aGF0IHdlIGdvdCBmcm9tIEhQIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgLWcgb3B0aW9uLgorSXQgY29zdHMgZXh0cmEuCisKKyAqIE5ldyB0YXJnZXRzIHN1cHBvcnRlZAorCitIaXRhY2hpIEg4LzMwMAkJCQloODMwMC1oaXRhY2hpLWhtcyAgb3IgIGg4MzAwaG1zCisKKyAqIE1vcmUgc21hcnRzIGFib3V0IGZpbmRpbmcgI2luY2x1ZGUgZmlsZXMKKworR0RCIG5vdyByZW1lbWJlcnMgdGhlIGNvbXBpbGF0aW9uIGRpcmVjdG9yeSBmb3IgYWxsIGluY2x1ZGUgZmlsZXMsIGFuZCBmb3IKK2FsbCBmaWxlcyBmcm9tIHdoaWNoIEMgaXMgZ2VuZXJhdGVkIChsaWtlIHlhY2MgYW5kIGxleCBzb3VyY2VzKS4gIFRoaXMKK2dyZWF0bHkgaW1wcm92ZXMgR0RCJ3MgYWJpbGl0eSB0byBmaW5kIHlhY2MvbGV4IHNvdXJjZXMsIGFuZCBpbmNsdWRlIGZpbGVzLAorZXNwZWNpYWxseSBpZiB5b3UgYXJlIGRlYnVnZ2luZyB5b3VyIHByb2dyYW0gZnJvbSBhIGRpcmVjdG9yeSBkaWZmZXJlbnQgZnJvbQordGhlIG9uZSB0aGF0IGNvbnRhaW5zIHlvdXIgc291cmNlcy4KKworV2UgYWxzbyBmaXhlZCBhIGJ1ZyB3aGljaCBjYXVzZWQgZGlmZmljdWx0eSB3aXRoIGxpc3RpbmcgYW5kIHNldHRpbmcKK2JyZWFrcG9pbnRzIGluIGluY2x1ZGUgZmlsZXMgd2hpY2ggY29udGFpbiBDIGNvZGUuICAoSW4gdGhlIHBhc3QsIHlvdSBoYWQgdG8KK3RyeSB0d2ljZSBpbiBvcmRlciB0byBsaXN0IGFuIGluY2x1ZGUgZmlsZSB0aGF0IHlvdSBoYWRuJ3QgbG9va2VkIGF0IGJlZm9yZS4pCisKKyAqIEludGVyZXN0aW5nIGluZmVybmFscyBjaGFuZ2UKKworR0RCIG5vdyBkZWFscyB3aXRoIGFyYml0cmFyeSBudW1iZXJzIG9mIHNlY3Rpb25zLCB3aGVyZSB0aGUgc3ltYm9scyBmb3IgZWFjaAorc2VjdGlvbiBtdXN0IGJlIHJlbG9jYXRlZCByZWxhdGl2ZSB0byB0aGF0IHNlY3Rpb24ncyBsYW5kaW5nIHBsYWNlIGluIHRoZQordGFyZ2V0J3MgYWRkcmVzcyBzcGFjZS4gIFRoaXMgd29yayB3YXMgbmVlZGVkIHRvIHN1cHBvcnQgRUxGIHdpdGggZW1iZWRkZWQKK3N0YWJzIHVzZWQgYnkgU29sYXJpcy0yLjAuCisKKyAqIEJ1ZyBmaXhlcyAob2YgY291cnNlISkKKworVGhlcmUgaGF2ZSBiZWVuIGxvYWRzIG9mIGZpeGVzIGZvciB0aGUgZm9sbG93aW5nIHRoaW5nczoKKwltaXBzLCByczYwMDAsIDI5ay91ZGksIG02OGssIGcrKywgdHlwZSBoYW5kbGluZywgZWxmL2R3YXJmLCBtODhrLAorCWk5NjAsIHN0YWJzLCBET1MoR08zMiksIHByb2NmcywgZXRjLi4uCisKK1NlZSB0aGUgQ2hhbmdlTG9nIGZvciBkZXRhaWxzLgorCisqKiogQ2hhbmdlcyBpbiBHREItNC41OgorCisgKiBOZXcgbWFjaGluZXMgc3VwcG9ydGVkIChob3N0IGFuZCB0YXJnZXQpCisKK0lCTSBSUzYwMDAgcnVubmluZyBBSVgJCQlyczYwMDAtaWJtLWFpeAlvciByczYwMDAKKworU0dJIElyaXgtNC54CQkJCW1pcHMtc2dpLWlyaXg0CW9yIGlyaXM0CisKKyAqIE5ldyBtYWxsb2MgcGFja2FnZQorCitHREIgbm93IHVzZXMgYSBuZXcgbWVtb3J5IG1hbmFnZXIgY2FsbGVkIG1tYWxsb2MsIGJhc2VkIG9uIGdtYWxsb2MuCitNbWFsbG9jIGlzIGNhcGFibGUgb2YgaGFuZGxpbmcgbXV0aXBsZSBoZWFwcyBvZiBtZW1vcnkuICBJdCBpcyBhbHNvCitjYXBhYmxlIG9mIHNhdmluZyBhIGhlYXAgdG8gYSBmaWxlLCBhbmQgdGhlbiBtYXBwaW5nIGl0IGJhY2sgaW4gbGF0ZXIuCitUaGlzIGNhbiBiZSB1c2VkIHRvIGdyZWF0bHkgc3BlZWR1cCB0aGUgc3RhcnR1cCBvZiBHREIgYnkgdXNpbmcgYQorcHJlLXBhcnNlZCBzeW1ib2wgdGFibGUgd2hpY2ggbGl2ZXMgaW4gYSBtbWFsbG9jIG1hbmFnZWQgaGVhcC4gIEZvcgorbW9yZSBkZXRhaWxzLCBwbGVhc2UgcmVhZCBtbWFsbG9jL21tYWxsb2MudGV4aS4KKworICogaW5mbyBwcm9jCisKK1RoZSAnaW5mbyBwcm9jJyBjb21tYW5kIChTVlI0IG9ubHkpIGhhcyBiZWVuIGVuaGFuY2VkIHF1aXRlIGEgYml0LiAgU2VlCisnaGVscCBpbmZvIHByb2MnIGZvciBkZXRhaWxzLgorCisgKiBNSVBTIGVjb2ZmIHN5bWJvbCB0YWJsZSBmb3JtYXQKKworVGhlIGNvZGUgdGhhdCByZWFkcyBNSVBTIHN5bWJvbCB0YWJsZSBmb3JtYXQgaXMgbm93IHN1cHBvcnRlZCBvbiBhbGwgaG9zdHMuCitUaGFua3MgdG8gTUlQUyBmb3IgcmVsZWFzaW5nIHRoZSBzeW0uaCBhbmQgc3ltY29uc3QuaCBmaWxlcyB0byBtYWtlIHRoaXMKK3Bvc3NpYmxlLgorCisgKiBGaWxlIG5hbWUgY2hhbmdlcyBmb3IgTVMtRE9TCisKK01hbnkgZmlsZXMgaW4gdGhlIGNvbmZpZyBkaXJlY3RvcmllcyBoYXZlIGJlZW4gcmVuYW1lZCB0byBtYWtlIGl0IGVhc2llciB0bworc3VwcG9ydCBHREIgb24gTVMtRE9TZSBzeXN0ZW1zICh3aGljaCBoYXZlIHZlcnkgcmVzdHJpY3RpdmUgZmlsZSBuYW1lCitjb252ZW50aW9ucyA6LSggKS4gIE1TLURPU2UgaG9zdCBzdXBwb3J0ICh1bmRlciBESiBEZWxvcmllJ3MgR08zMgorZW52aXJvbm1lbnQpIGlzIGNsb3NlIHRvIHdvcmtpbmcgYnV0IGhhcyBzb21lIHJlbWFpbmluZyBwcm9ibGVtcy4gIE5vdGUKK3RoYXQgZGVidWdnaW5nIG9mIERPUyBwcm9ncmFtcyBpcyBub3Qgc3VwcG9ydGVkLCBkdWUgdG8gbGltaXRhdGlvbnMKK2luIHRoZSBgYG9wZXJhdGluZyBzeXN0ZW0nJywgYnV0IGl0IGNhbiBiZSB1c2VkIHRvIGhvc3QgY3Jvc3MtZGVidWdnaW5nLgorCisgKiBDcm9zcyBieXRlIG9yZGVyIGZpeGVzCisKK01hbnkgZml4ZXMgaGF2ZSBiZWVuIG1hZGUgdG8gc3VwcG9ydCBjcm9zcyBkZWJ1Z2dpbmcgb2YgU3BhcmMgYW5kIE1JUFMKK3RhcmdldHMgZnJvbSBob3N0cyB3aG9zZSBieXRlIG9yZGVyIGRpZmZlcnMuCisKKyAqIE5ldyAtbWFwcGVkIGFuZCAtcmVhZG5vdyBvcHRpb25zCisKK0lmIG1lbW9yeS1tYXBwZWQgZmlsZXMgYXJlIGF2YWlsYWJsZSBvbiB5b3VyIHN5c3RlbSB0aHJvdWdoIHRoZSAnbW1hcCcKK3N5c3RlbSBjYWxsLCB5b3UgY2FuIHVzZSB0aGUgLW1hcHBlZCBvcHRpb24gb24gdGhlIGBmaWxlJyBvcgorYHN5bWJvbC1maWxlJyBjb21tYW5kcyB0byBjYXVzZSBHREIgdG8gd3JpdGUgdGhlIHN5bWJvbHMgZnJvbSB5b3VyCitwcm9ncmFtIGludG8gYSByZXVzYWJsZSBmaWxlLiAgSWYgdGhlIHByb2dyYW0geW91IGFyZSBkZWJ1Z2dpbmcgaXMKK2NhbGxlZCBgL3BhdGgvZnJlZCcsIHRoZSBtYXBwZWQgc3ltYm9sIGZpbGUgd2lsbCBiZSBgLi9mcmVkLnN5bXMnLgorRnV0dXJlIEdEQiBkZWJ1Z2dpbmcgc2Vzc2lvbnMgd2lsbCBub3RpY2UgdGhlIHByZXNlbmNlIG9mIHRoaXMgZmlsZSwKK2FuZCB3aWxsIHF1aWNrbHkgbWFwIGluIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIGl0LCByYXRoZXIgdGhhbiByZWFkaW5nCit0aGUgc3ltYm9sIHRhYmxlIGZyb20gdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbS4gIFVzaW5nIHRoZSAnLW1hcHBlZCcKK29wdGlvbiBpbiBhIEdEQiBgZmlsZScgb3IgYHN5bWJvbC1maWxlJyBjb21tYW5kIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMKK3N0YXJ0aW5nIEdEQiB3aXRoIHRoZSAnLW1hcHBlZCcgY29tbWFuZC1saW5lIG9wdGlvbi4KKworWW91IGNhbiBjYXVzZSBHREIgdG8gcmVhZCB0aGUgZW50aXJlIHN5bWJvbCB0YWJsZSBpbW1lZGlhdGVseSBieSB1c2luZwordGhlICctcmVhZG5vdycgb3B0aW9uIHdpdGggYW55IG9mIHRoZSBjb21tYW5kcyB0aGF0IGxvYWQgc3ltYm9sIHRhYmxlCitpbmZvcm1hdGlvbiAob3Igb24gdGhlIEdEQiBjb21tYW5kIGxpbmUpLiAgVGhpcyBtYWtlcyB0aGUgY29tbWFuZAorc2xvd2VyLCBidXQgbWFrZXMgZnV0dXJlIG9wZXJhdGlvbnMgZmFzdGVyLgorCitUaGUgLW1hcHBlZCBhbmQgLXJlYWRub3cgb3B0aW9ucyBhcmUgdHlwaWNhbGx5IGNvbWJpbmVkIGluIG9yZGVyIHRvCitidWlsZCBhIGBmcmVkLnN5bXMnIGZpbGUgdGhhdCBjb250YWlucyBjb21wbGV0ZSBzeW1ib2wgaW5mb3JtYXRpb24uCitBIHNpbXBsZSBHREIgaW52b2NhdGlvbiB0byBkbyBub3RoaW5nIGJ1dCBidWlsZCBhIGAuc3ltcycgZmlsZSBmb3IgZnV0dXJlCit1c2UgaXM6CisKKwlnZGIgLWJhdGNoIC1ueCAtbWFwcGVkIC1yZWFkbm93IHByb2dyYW1uYW1lCisKK1RoZSBgLnN5bXMnIGZpbGUgaXMgc3BlY2lmaWMgdG8gdGhlIGhvc3QgbWFjaGluZSBvbiB3aGljaCBHREIgaXMgcnVuLgorSXQgaG9sZHMgYW4gZXhhY3QgaW1hZ2Ugb2YgR0RCJ3MgaW50ZXJuYWwgc3ltYm9sIHRhYmxlLiAgSXQgY2Fubm90IGJlCitzaGFyZWQgYWNyb3NzIG11bHRpcGxlIGhvc3QgcGxhdGZvcm1zLgorCisgKiBsb25nam1wKCkgaGFuZGxpbmcKKworR0RCIGlzIG5vdyBjYXBhYmxlIG9mIHN0ZXBwaW5nIGFuZCBuZXh0aW5nIG92ZXIgbG9uZ2ptcCgpLCBfbG9uZ2ptcCgpLCBhbmQKK3NpZ2xvbmdqbXAoKSB3aXRob3V0IGxvc2luZyBjb250cm9sLiAgVGhpcyBmZWF0dXJlIGhhcyBub3QgeWV0IGJlZW4gcG9ydGVkIHRvCithbGwgc3lzdGVtcy4gIEl0IGN1cnJlbnRseSB3b3JrcyBvbiBtYW55IDM4NiBwbGF0Zm9ybXMsIGFsbCBNSVBTLWJhc2VkCitwbGF0Zm9ybXMgKFNHSSwgREVDc3RhdGlvbiwgZXRjKSwgYW5kIFN1bjMvNC4KKworICogU29sYXJpcyAyLjAKKworUHJlbGltaW5hcnkgd29yayBoYXMgYmVlbiBwdXQgaW4gdG8gc3VwcG9ydCB0aGUgbmV3IFNvbGFyaXMgT1MgZnJvbSBTdW4uICBBdAordGhpcyB0aW1lLCBpdCBjYW4gY29udHJvbCBhbmQgZGVidWcgcHJvY2Vzc2VzLCBidXQgaXQgaXMgbm90IGNhcGFibGUgb2YKK3JlYWRpbmcgc3ltYm9scy4KKworICogQnVnIGZpeGVzCisKK0FzIGFsd2F5cywgbWFueSBtYW55IGJ1ZyBmaXhlcy4gIFRoZSBtYWpvciBhcmVhcyB3ZXJlIHdpdGggZysrLCBhbmQgbWlwc3JlYWQuCitQZW9wbGUgdXNpbmcgdGhlIE1JUFMtYmFzZWQgcGxhdGZvcm1zIHNob3VsZCBleHBlcmllbmNlIGZld2VyIG15c3RlcmlvdXMKK2NyYXNoZXMgYW5kIHRyYXNoZWQgc3ltYm9sIHRhYmxlcy4KKworKioqIENoYW5nZXMgaW4gR0RCLTQuNDoKKworICogTmV3IG1hY2hpbmVzIHN1cHBvcnRlZCAoaG9zdCBhbmQgdGFyZ2V0KQorCitTQ08gVW5peCBvbiBpMzg2IElCTSBQQyBjbG9uZXMJCWkzODYtc2NvLXN5c3YJb3IgIGkzODZzY28KKwkoZXhjZXB0IGNvcmUgZmlsZXMpCitCU0QgUmVubyBvbiBWYXgJCQkJdmF4LWRlYy1ic2QKK1VsdHJpeCBvbiBWYXgJCQkJdmF4LWRlYy11bHRyaXgKKworICogTmV3IG1hY2hpbmVzIHN1cHBvcnRlZCAodGFyZ2V0KQorCitBTUQgMjkwMDAgZW1iZWRkZWQsIHVzaW5nIEVCTU9OCQlhMjlrLW5vbmUtbm9uZQorCisgKiBDKysgc3VwcG9ydAorCitHREIgY29udGludWVzIHRvIGltcHJvdmUgaXRzIGhhbmRsaW5nIG9mIEMrKy4gIGBSZWZlcmVuY2VzJyB3b3JrIGJldHRlci4KK1RoZSBkZW1hbmdsZXIgaGFzIGFsc28gYmVlbiBpbXByb3ZlZCwgYW5kIG5vdyBkZWFscyB3aXRoIHN5bWJvbHMgbWFuZ2xlZCBhcworcGVyIHRoZSBBbm5vdGF0ZWQgQysrIFJlZmVyZW5jZSBHdWlkZS4KKworR0RCIGFsc28gbm93IGhhbmRsZXMgYHN0YWJzJyBzeW1ib2wgaW5mb3JtYXRpb24gZW1iZWRkZWQgaW4gTUlQUworYGVjb2ZmJyBzeW1ib2wgdGFibGVzLiAgU2luY2UgdGhlIGVjb2ZmIGZvcm1hdCB3YXMgbm90IGVhc2lseQorZXh0ZW5zaWJsZSB0byBoYW5kbGUgbmV3IGxhbmd1YWdlcyBzdWNoIGFzIEMrKywgdGhpcyBhcHBlYXJlZCB0byBiZSBhCitnb29kIHdheSB0byBwdXQgQysrIGRlYnVnZ2luZyBpbmZvIGludG8gTUlQUyBiaW5hcmllcy4gIFRoaXMgb3B0aW9uCit3aWxsIGJlIHN1cHBvcnRlZCBpbiB0aGUgR05VIEMgY29tcGlsZXIsIHZlcnNpb24gMiwgd2hlbiBpdCBpcworcmVsZWFzZWQuCisKKyAqIE5ldyBmZWF0dXJlcyBmb3IgU1ZSNAorCitHREIgbm93IGhhbmRsZXMgU1ZSNCBzaGFyZWQgbGlicmFyaWVzLCBpbiB0aGUgc2FtZSBmYXNoaW9uIGFzIFN1bk9TCitzaGFyZWQgbGlicmFyaWVzLiAgRGVidWdnaW5nIGR5bmFtaWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBzaG91bGQgcHJlc2VudAorb25seSBtaW5vciBkaWZmZXJlbmNlcyBmcm9tIGRlYnVnZ2luZyBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcy4KKworVGhlIGBpbmZvIHByb2MnIGNvbW1hbmQgd2lsbCBwcmludCBvdXQgaW5mb3JtYXRpb24gYWJvdXQgYW55IHByb2Nlc3MKK29uIGFuIFNWUjQgc3lzdGVtIChpbmNsdWRpbmcgdGhlIG9uZSB5b3UgYXJlIGRlYnVnZ2luZykuICBBdCB0aGUgbW9tZW50LAoraXQgcHJpbnRzIHRoZSBhZGRyZXNzIG1hcHBpbmdzIG9mIHRoZSBwcm9jZXNzLgorCitJZiB5b3UgYnJpbmcgdXAgR0RCIG9uIGFub3RoZXIgU1ZSNCBzeXN0ZW0sIHBsZWFzZSBzZW5kIG1haWwgdG8KK2J1Zy1nZGJAcHJlcC5haS5taXQuZWR1IHRvIGxldCB1cyBrbm93IHdoYXQgY2hhbmdlcyB3ZXJlIHJlcWlyZWQgKGlmIGFueSkuCisKKyAqIEJldHRlciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydCBpbiBTdW5PUworCitSZWFkaW5nIHN5bWJvbHMgZnJvbSBzaGFyZWQgbGlicmFyaWVzIHdoaWNoIGNvbnRhaW4gZGVidWdnaW5nIHN5bWJvbHMKK25vdyB3b3JrcyBwcm9wZXJseS4gIEhvd2V2ZXIsIHRoZXJlIHJlbWFpbiBpc3N1ZXMgc3VjaCBhcyBhdXRvbWF0aWMKK3NraXBwaW5nIG9mIGB0cmFuc2ZlciB2ZWN0b3InIGNvZGUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLCB3aGljaAorbWFrZSBpdCBoYXJkZXIgdG8gZGVidWcgY29kZSBpbiBhIHNoYXJlZCBsaWJyYXJ5LCB0aGFuIHRvIGRlYnVnIHRoZQorc2FtZSBjb2RlIGxpbmtlZCBzdGF0aWNhbGx5LgorCisgKiBOZXcgR2V0b3B0CisKK0dEQiBpcyBub3cgdXNpbmcgdGhlIGxhdGVzdCBgZ2V0b3B0JyByb3V0aW5lcyBmcm9tIHRoZSBGU0YuICBUaGlzCit2ZXJzaW9uIGFjY2VwdHMgdGhlIC0tIHByZWZpeCBmb3Igb3B0aW9ucyB3aXRoIGxvbmcgbmFtZXMuICBHREIgd2lsbAorY29udGludWUgdG8gYWNjZXB0IHRoZSBvbGQgZm9ybXMgKC1vcHRpb24gYW5kICtvcHRpb24pIGFzIHdlbGwuCitWYXJpb3VzIHNpbmdsZSBsZXR0ZXIgYWJicmV2aWF0aW9ucyBmb3Igb3B0aW9ucyBoYXZlIGJlZW4gZXhwbGljaXR5CithZGRlZCB0byB0aGUgb3B0aW9uIHRhYmxlIHNvIHRoYXQgdGhleSB3b24ndCBnZXQgb3ZlcnNoYWRvd2VkIGluIHRoZQorZnV0dXJlIGJ5IG90aGVyIG9wdGlvbnMgdGhhdCBiZWdpbiB3aXRoIHRoZSBzYW1lIGxldHRlci4KKworICogQnVncyBmaXhlZAorCitUaGUgYGNsZWFudXBfdW5kZWZpbmVkX3R5cGVzJyBidWcgdGhhdCBtYW55IG9mIHlvdSBub3RpY2VkIGhhcyBiZWVuIHNxdWFzaGVkLgorTWFueSBhc3NvcnRlZCBidWdzIGhhdmUgYmVlbiBoYW5kbGVkLiAgTWFueSBtb3JlIHJlbWFpbiB0byBiZSBoYW5kbGVkLgorU2VlIHRoZSB2YXJpb3VzIENoYW5nZUxvZyBmaWxlcyAocHJpbWFyaWx5IGluIGdkYiBhbmQgYmZkKSBmb3IgZGV0YWlscy4KKworCisqKiogQ2hhbmdlcyBpbiBHREItNC4zOgorCisgKiBOZXcgbWFjaGluZXMgc3VwcG9ydGVkIChob3N0IGFuZCB0YXJnZXQpCisKK0FtaWdhIDMwMDAgcnVubmluZyBBbWl4CQkJbTY4ay1jYm0tc3ZyNAlvciAgYW1peAorTkNSIDMwMDAgMzg2IHJ1bm5pbmcgU1ZSNAkJaTM4Ni1uY3Itc3ZyNAlvciAgbmNyMzAwMAorTW90b3JvbGEgRGVsdGEgODgwMDAgcnVubmluZyBTeXMgVgltODhrLW1vdG9yb2xhLXN5c3YgIG9yICBkZWx0YTg4CisKKyAqIEFsbW9zdCBTQ08gVW5peCBzdXBwb3J0CisKK1dlIGhhZCBob3BlZCB0byBzdXBwb3J0OgorU0NPIFVuaXggb24gaTM4NiBJQk0gUEMgY2xvbmVzCQlpMzg2LXNjby1zeXN2CW9yICBpMzg2c2NvCisoZXhjZXB0IGZvciBjb3JlIGZpbGUgc3VwcG9ydCksIGJ1dCB3ZSBkaXNjb3ZlcmVkIHZlcnkgbGF0ZSBpbiB0aGUgcmVsZWFzZQordGhhdCBpdCBoYXMgcHJvYmxlbXMgd2l0aCBwcm9jZXNzIGdyb3VwcyB0aGF0IHJlbmRlciBnZGIgdW51c2FibGUuICBTb3JyeQorYWJvdXQgdGhhdC4gIEkgZW5jb3VyYWdlIHBlb3BsZSB0byBmaXggaXQgYW5kIHBvc3QgdGhlIGZpeGVzLgorCisgKiBQcmVsaW1pbmFyeSBFTEYgYW5kIERXQVJGIHN1cHBvcnQKKworR0RCIGNhbiByZWFkIEVMRiBvYmplY3QgZmlsZXMgb24gU3lzdGVtIFYgUmVsZWFzZSA0LCBhbmQgY2FuIGhhbmRsZQorZGVidWdnaW5nIHJlY29yZHMgZm9yIEMsIGluIERXQVJGIGZvcm1hdCwgaW4gRUxGIGZpbGVzLiAgVGhpcyBzdXBwb3J0CitpcyBwcmVsaW1pbmFyeS4gIElmIHlvdSBicmluZyB1cCBHREIgb24gYW5vdGhlciBTVlI0IHN5c3RlbSwgcGxlYXNlCitzZW5kIG1haWwgdG8gYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUgdG8gbGV0IHVzIGtub3cgd2hhdCBjaGFuZ2VzIHdlcmUKK3JlcWlyZWQgKGlmIGFueSkuCisKKyAqIE5ldyBSZWFkbGluZQorCitHREIgbm93IHVzZXMgdGhlIGxhdGVzdCBgcmVhZGxpbmUnIGxpYnJhcnkuICBPbmUgdXNlci12aXNpYmxlIGNoYW5nZQoraXMgdGhhdCB0d28gdGFicyB3aWxsIGxpc3QgcG9zc2libGUgY29tbWFuZCBjb21wbGV0aW9ucywgd2hpY2ggcHJldmlvdXNseQorcmVxdWlyZWQgdHlwaW5nIE0tPyAobWV0YS1xdWVzdGlvbiBtYXJrLCBvciBFU0MgPykuCisKKyAqIEJ1Z3MgZml4ZWQKKworVGhlIGBzdGVwaScgYnVnIHRoYXQgbWFueSBvZiB5b3Ugbm90aWNlZCBoYXMgYmVlbiBzcXVhc2hlZC4KK01hbnkgYnVncyBpbiBDKysgaGF2ZSBiZWVuIGhhbmRsZWQuICBNYW55IG1vcmUgcmVtYWluIHRvIGJlIGhhbmRsZWQuCitTZWUgdGhlIHZhcmlvdXMgQ2hhbmdlTG9nIGZpbGVzIChwcmltYXJpbHkgaW4gZ2RiIGFuZCBiZmQpIGZvciBkZXRhaWxzLgorCisgKiBTdGF0ZSBvZiB0aGUgTUlQUyB3b3JsZCAoaW4gY2FzZSB5b3Ugd29uZGVyZWQpOgorCitHREIgY2FuIHVuZGVyc3RhbmQgdGhlIHN5bWJvbCB0YWJsZXMgZW1pdHRlZCBieSB0aGUgY29tcGlsZXJzCitzdXBwbGllZCBieSBtb3N0IHZlbmRvcnMgb2YgTUlQUy1iYXNlZCBtYWNoaW5lcywgaW5jbHVkaW5nIERFQy4gIFRoZXNlCitzeW1ib2wgdGFibGVzIGFyZSBpbiBhIGZvcm1hdCB0aGF0IGVzc2VudGlhbGx5IG5vYm9keSBlbHNlIHVzZXMuCisKK1NvbWUgdmVyc2lvbnMgb2YgZ2NjIGNvbWUgd2l0aCBhbiBhc3NlbWJsZXIgcG9zdC1wcm9jZXNzb3IgY2FsbGVkCittaXBzLXRmaWxlLiAgVGhpcyBwcm9ncmFtIGlzIHJlcXVpcmVkIGlmIHlvdSB3YW50IHRvIGRvIHNvdXJjZS1sZXZlbAorZGVidWdnaW5nIG9mIGdjYy1jb21waWxlZCBwcm9ncmFtcy4gIEkgYmVsaWV2ZSBGU0YgZG9lcyBub3Qgc2hpcAorbWlwcy10ZmlsZSB3aXRoIGdjYyB2ZXJzaW9uIDEsIGJ1dCBpdCB3aWxsIGV2ZW50dWFsbHkgY29tZSB3aXRoIGdjYwordmVyc2lvbiAyLgorCitEZWJ1Z2dpbmcgb2YgZysrIG91dHB1dCByZW1haW5zIGEgcHJvYmxlbS4gIGcrKyB2ZXJzaW9uIDEueHggZG9lcyBub3QKK3JlYWxseSBzdXBwb3J0IGl0IGF0IGFsbC4gIChJZiB5b3UncmUgbHVja3ksIHlvdSBzaG91bGQgYmUgYWJsZSB0byBnZXQKK2xpbmUgbnVtYmVycyBhbmQgc3RhY2sgdHJhY2VzIHRvIHdvcmssIGJ1dCBubyBwYXJhbWV0ZXJzIG9yIGxvY2FsCit2YXJpYWJsZXMuKSAgV2l0aCBzb21lIHdvcmsgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGltcHJvdmUgdGhlCitzaXR1YXRpb24gc29tZXdoYXQuCisKK1doZW4gZ2NjIHZlcnNpb24gMiBpcyByZWxlYXNlZCwgeW91IHdpbGwgaGF2ZSBzb21ld2hhdCBiZXR0ZXIgbHVjay4KK0hvd2V2ZXIsIGV2ZW4gdGhlbiB5b3Ugd2lsbCBnZXQgY29uZnVzaW5nIHJlc3VsdHMgZm9yIGluaGVyaXRhbmNlIGFuZAorbWV0aG9kcy4KKworV2Ugd2lsbCBldmVudHVhbGx5IHByb3ZpZGUgZnVsbCBkZWJ1Z2dpbmcgb2YgZysrIG91dHB1dCBvbgorREVDc3RhdGlvbnMuICBUaGlzIHdpbGwgcHJvYmFibHkgaW52b2x2ZSBzb21lIGtpbmQgb2Ygc3RhYnMtaW4tZWNvZmYKK2VuY2FwdWxhdGlvbiwgYnV0IHRoZSBkZXRhaWxzIGhhdmUgbm90IGJlZW4gd29ya2VkIG91dCB5ZXQuCisKKworKioqIENoYW5nZXMgaW4gR0RCLTQuMjoKKworICogIEltcHJvdmVkIGNvbmZpZ3VyYXRpb24KKworT25seSBvbmUgY29weSBvZiBgY29uZmlndXJlJyBleGlzdHMgbm93LCBhbmQgaXQgaXMgbm90IHNlbGYtbW9kaWZ5aW5nLgorUG9ydGluZyBCRkQgaXMgc2ltcGxlci4gIAorCisgKiAgU3RlcHBpbmcgaW1wcm92ZWQKKworVGhlIGBzdGVwJyBhbmQgYG5leHQnIGNvbW1hbmRzIG5vdyBvbmx5IHN0b3AgYXQgdGhlIGZpcnN0IGluc3RydWN0aW9uCitvZiBhIHNvdXJjZSBsaW5lLiAgVGhpcyBwcmV2ZW50cyB0aGUgbXVsdGlwbGUgc3RvcHMgdGhhdCB1c2VkIHRvIG9jY3VyCitpbiBzd2l0Y2ggc3RhdGVtZW50cywgZm9yLWxvb3BzLCBldGMuICBgU3RlcCcgY29udGludWVzIHRvIHN0b3AgaWYgYQorZnVuY3Rpb24gdGhhdCBoYXMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIGNhbGxlZCB3aXRoaW4gdGhlIGxpbmUuCisKKyAqICBCdWcgZml4aW5nCisKK0xvdHMgb2Ygc21hbGwgYnVncyBmaXhlZC4gIE1vcmUgcmVtYWluLgorCisgKiAgTmV3IGhvc3Qgc3VwcG9ydGVkIChub3QgdGFyZ2V0KQorCitJbnRlbCAzODYgUEMgY2xvbmUgcnVubmluZyBNYWNoCQlpMzg2LW5vbmUtbWFjaAorCisKKyoqKiBDaGFuZ2VzIGluIEdEQi00LjE6CisKKyAqICBNdWx0aXBsZSBzb3VyY2UgbGFuZ3VhZ2Ugc3VwcG9ydAorCitHREIgbm93IGhhcyBpbnRlcm5hbCBzY2FmZm9sZGluZyB0byBoYW5kbGUgc2V2ZXJhbCBzb3VyY2UgbGFuZ3VhZ2VzLgorSXQgZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiBlYWNoIHNvdXJjZSBmaWxlIGZyb20gaXRzIGZpbGVuYW1lIGV4dGVuc2lvbiwKK2FuZCB3aWxsIHN3aXRjaCBleHByZXNzaW9uIHBhcnNpbmcgYW5kIG51bWJlciBmb3JtYXR0aW5nIHRvIG1hdGNoIHRoZQorbGFuZ3VhZ2Ugb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc3RhY2sgZnJhbWUuCitZb3UgY2FuIGFsc28gc3BlY2lmaWNhbGx5IHNldCB0aGUgbGFuZ3VhZ2UgdG8gYmUgdXNlZCwgd2l0aAorYHNldCBsYW5ndWFnZSBjJyBvciBgc2V0IGxhbmd1YWdlIG1vZHVsYS0yJy4KKworICogIEdEQiBhbmQgTW9kdWxhLTIKKworR0RCIG5vdyBoYXMgcHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgdGhlIEdOVSBNb2R1bGEtMiBjb21waWxlciwKK2N1cnJlbnRseSB1bmRlciBkZXZlbG9wbWVudCBhdCB0aGUgU3RhdGUgVW5pdmVyc2l0eSBvZiBOZXcgWW9yayBhdAorQnVmZmFsby4gIERldmVsb3BtZW50IG9mIGJvdGggR0RCIGFuZCB0aGUgR05VIE1vZHVsYS0yIGNvbXBpbGVyIHdpbGwKK2NvbnRpbnVlIHRocm91Z2ggdGhlIGZhbGwgb2YgMTk5MSBhbmQgaW50byAxOTkyLgorCitPdGhlciBNb2R1bGEtMiBjb21waWxlcnMgYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLCBhbmQgYXR0ZW1wdGluZyB0bworZGVidWcgcHJvZ3JhbXMgY29tcGlsZWQgd2l0aCB0aGVtIHdpbGwgbGlrZWx5IHJlc3VsdCBpbiBhbiBlcnJvciBhcyB0aGUKK3N5bWJvbCB0YWJsZSBpcyByZWFkLiAgRmVlbCBmcmVlIHRvIHdvcmsgb24gaXQsIHRob3VnaCEKKworVGhlcmUgYXJlIGhvb2tzIGluIEdEQiBmb3Igc3RyaWN0IHR5cGUgY2hlY2tpbmcgYW5kIHJhbmdlIGNoZWNraW5nLAoraW4gdGhlIGBNb2R1bGEtMiBwaGlsb3NvcGh5JywgYnV0IHRoZXkgZG8gbm90IGN1cnJlbnRseSB3b3JrLgorCisgKiBzZXQgd3JpdGUgb24vb2ZmCisKK0dEQiBjYW4gbm93IHdyaXRlIHRvIGV4ZWN1dGFibGUgYW5kIGNvcmUgZmlsZXMgKGUuZy4gcGF0Y2gKK2EgdmFyaWFibGUncyB2YWx1ZSkuICAgWW91IG11c3QgdHVybiB0aGlzIHN3aXRjaCBvbiwgc3BlY2lmeQordGhlIGZpbGUgKCJleGVjIGZvbyIgb3IgImNvcmUgZm9vIiksICp0aGVuKiBtb2RpZnkgaXQsIGUuZy4KK2J5IGFzc2lnbmluZyBhIG5ldyB2YWx1ZSB0byBhIHZhcmlhYmxlLiAgTW9kaWZpY2F0aW9ucyB0YWtlCitlZmZlY3QgaW1tZWRpYXRlbHkuCisKKyAqIEF1dG9tYXRpYyBTdW5PUyBzaGFyZWQgbGlicmFyeSByZWFkaW5nCisKK1doZW4geW91IHJ1biB5b3VyIHByb2dyYW0sIEdEQiBhdXRvbWF0aWNhbGx5IGRldGVybWluZXMgd2hlcmUgaXRzCitzaGFyZWQgbGlicmFyaWVzIChpZiBhbnkpIGhhdmUgYmVlbiBsb2FkZWQsIGFuZCByZWFkcyB0aGVpciBzeW1ib2xzLgorVGhlIGBzaGFyZScgY29tbWFuZCBpcyBubyBsb25nZXIgbmVlZGVkLiAgVGhpcyBhbHNvIHdvcmtzIHdoZW4KK2V4YW1pbmluZyBjb3JlIGZpbGVzLgorCisgKiBzZXQgbGlzdHNpemUKKworWW91IGNhbiBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgbGluZXMgdGhhdCB0aGUgYGxpc3QnIGNvbW1hbmQgc2hvd3MuCitUaGUgZGVmYXVsdCBpcyAxMC4KKworICogTmV3IG1hY2hpbmVzIHN1cHBvcnRlZCAoaG9zdCBhbmQgdGFyZ2V0KQorCitTR0kgSXJpcyAoTUlQUykgcnVubmluZyBJcml4IFYzOiAgCW1pcHMtc2dpLWlyaXggICBvciAgaXJpcworU29ueSBORVdTICg2OEspIHJ1bm5pbmcgTkVXU09TIDMueDoJbTY4ay1zb255LXN5c3YJb3IgIG5ld3MKK1VsdHJhY29tcHV0ZXIgKDI5SykgcnVubmluZyBTeW0xOglhMjlrLW55dS1zeW0xCW9yICB1bHRyYTMKKworICogTmV3IGhvc3RzIHN1cHBvcnRlZCAobm90IHRhcmdldHMpCisKK0lCTSBSVC9QQzoJCQkJcm9tcC1pYm0tYWl4IAlvciAgcnRwYworCisgKiBOZXcgdGFyZ2V0cyBzdXBwb3J0ZWQgKG5vdCBob3N0cykKKworQU1EIDI5MDAwIGVtYmVkZGVkIHdpdGggQ09GRgkJYTI5ay1ub25lLWNvZmYKK0FNRCAyOTAwMCBlbWJlZGRlZCB3aXRoIGEub3V0CQlhMjlrLW5vbmUtYW91dAorVWx0cmFjb21wdXRlciByZW1vdGUga2VybmVsIGRlYnVnCWEyOWstbnl1LWtlcm4KKworICogTmV3IHJlbW90ZSBpbnRlcmZhY2VzCisKK0FNRCAyOTAwMCBBZGFwdAorQU1EIDI5MDAwIE1pbmltb24KKworCisqKiogQ2hhbmdlcyBpbiBHREItNC4wOgorCisgKiAgTmV3IEZhY2lsaXRpZXMKKworV2lkZSBvdXRwdXQgaXMgd3JhcHBlZCBhdCBnb29kIHBsYWNlcyB0byBtYWtlIHRoZSBvdXRwdXQgbW9yZSByZWFkYWJsZS4KKworR2RiIG5vdyBzdXBwb3J0cyBjcm9zcy1kZWJ1Z2dpbmcgZnJvbSBhIGhvc3QgbWFjaGluZSBvZiBvbmUgdHlwZSB0byBhCit0YXJnZXQgbWFjaGluZSBvZiBhbm90aGVyIHR5cGUuICBDb21tdW5pY2F0aW9uIHdpdGggdGhlIHRhcmdldCBzeXN0ZW0KK2lzIG92ZXIgc2VyaWFsIGxpbmVzLiAgVGhlIGBgdGFyZ2V0JycgY29tbWFuZCBoYW5kbGVzIGNvbm5lY3RpbmcgdG8gdGhlCityZW1vdGUgc3lzdGVtOyB0aGUgYGBsb2FkJycgY29tbWFuZCB3aWxsIGRvd25sb2FkIGEgcHJvZ3JhbSBpbnRvIHRoZQorcmVtb3RlIHN5c3RlbS4gIFNlcmlhbCBzdHVicyBmb3IgdGhlIG02OGsgYW5kIGkzODYgYXJlIHByb3ZpZGVkLiAgR2RiCithbHNvIHN1cHBvcnRzIGRlYnVnZ2luZyBvZiByZWFsdGltZSBwcm9jZXNzZXMgcnVubmluZyB1bmRlciBWeFdvcmtzLAordXNpbmcgU3VuUlBDIFJlbW90ZSBQcm9jZWR1cmUgQ2FsbHMgb3ZlciBUQ1AvSVAgdG8gdGFsayB0byBhIGRlYnVnZ2VyCitzdHViIG9uIHRoZSB0YXJnZXQgc3lzdGVtLgorCitOZXcgQ1BVcyBzdXBwb3J0ZWQgaW5jbHVkZSB0aGUgQU1EIDI5MDAwIGFuZCBJbnRlbCA5NjAuCisKK0dEQiBub3cgcmVhZHMgb2JqZWN0IGZpbGVzIGFuZCBzeW1ib2wgdGFibGVzIHZpYSBhIGBgYmluYXJ5IGZpbGUnJyAKK2xpYnJhcnksIHdoaWNoIGFsbG93cyBhIHNpbmdsZSBjb3B5IG9mIEdEQiB0byBkZWJ1ZyBwcm9ncmFtcyBvZiBtdWx0aXBsZQorb2JqZWN0IGZpbGUgdHlwZXMgc3VjaCBhcyBhLm91dCBhbmQgY29mZi4KKworVGhlcmUgaXMgbm93IGEgR0RCIHJlZmVyZW5jZSBjYXJkIGluICJkb2MvcmVmY2FyZC50ZXgiLiAgKE1ha2UgdGFyZ2V0cworcmVmY2FyZC5kdmkgYW5kIHJlZmNhcmQucHMgYXJlIGF2YWlsYWJsZSB0byBmb3JtYXQgaXQpLgorCisKKyAqICBDb250cm9sLVZhcmlhYmxlIHVzZXIgaW50ZXJmYWNlIHNpbXBsaWZpZWQKKworQWxsIHZhcmlhYmxlcyB0aGF0IGNvbnRyb2wgdGhlIG9wZXJhdGlvbiBvZiB0aGUgZGVidWdnZXIgY2FuIGJlIHNldAorYnkgdGhlIGBgc2V0JycgY29tbWFuZCwgYW5kIGRpc3BsYXllZCBieSB0aGUgYGBzaG93JycgY29tbWFuZC4KKworRm9yIGV4YW1wbGUsIGBgc2V0IHByb21wdCBuZXctZ2RiPT4nJyB3aWxsIGNoYW5nZSB5b3VyIHByb21wdCB0byBuZXctZ2RiPT4uCitgYFNob3cgcHJvbXB0JycgcHJvZHVjZXMgdGhlIHJlc3BvbnNlOgorR2RiJ3MgcHJvbXB0IGlzIG5ldy1nZGI9Pi4KKworV2hhdCBmb2xsb3dzIGFyZSB0aGUgTkVXIHNldCBjb21tYW5kcy4gIFRoZSBjb21tYW5kIGBgaGVscCBzZXQnJyB3aWxsCitwcmludCBhIGNvbXBsZXRlIGxpc3Qgb2Ygb2xkIGFuZCBuZXcgc2V0IGNvbW1hbmRzLiAgYGBoZWxwIHNldCBGT08nJword2lsbCBnaXZlIGEgbG9uZ2VyIGRlc2NyaXB0aW9uIG9mIHRoZSB2YXJpYWJsZSBGT08uICBgYHNob3cnJyB3aWxsIHNob3cKK2FsbCBvZiB0aGUgdmFyaWFibGUgZGVzY3JpcHRpb25zIGFuZCB0aGVpciBjdXJyZW50IHNldHRpbmdzLgorCitjb25maXJtIG9uL29mZjogIEVuYWJsZXMgd2FybmluZyBxdWVzdGlvbnMgZm9yIG9wZXJhdGlvbnMgdGhhdCBhcmUKKwkJIGhhcmQgdG8gcmVjb3ZlciBmcm9tLCBlLmcuIHJlcnVubmluZyB0aGUgcHJvZ3JhbSB3aGlsZQorCQkgaXQgaXMgYWxyZWFkeSBydW5uaW5nLiAgRGVmYXVsdCBpcyBPTi4KKworZWRpdGluZyBvbi9vZmY6ICBFbmFibGVzIEVNQUNTIHN0eWxlIGNvbW1hbmQgbGluZSBlZGl0aW5nIAorICAgICAgICAgICAgICAgICBvZiBpbnB1dC4gIFByZXZpb3VzIGxpbmVzIGNhbiBiZSByZWNhbGxlZCB3aXRoIAorCQkgY29udHJvbC1QLCB0aGUgY3VycmVudCBsaW5lIGNhbiBiZSBlZGl0ZWQgd2l0aCBjb250cm9sLUIsCisJCSB5b3UgY2FuIHNlYXJjaCBmb3IgY29tbWFuZHMgd2l0aCBjb250cm9sLVIsIGV0Yy4KKwkJIERlZmF1bHQgaXMgT04uCisKK2hpc3RvcnkgZmlsZW5hbWUgTkFNRTogIE5BTUUgaXMgd2hlcmUgdGhlIGdkYiBjb21tYW5kIGhpc3RvcnkgCisJCQl3aWxsIGJlIHN0b3JlZC4gIFRoZSBkZWZhdWx0IGlzIC5nZGJfaGlzdG9yeSwKKwkJCW9yIHRoZSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKKwkJCUdEQkhJU1RGSUxFLgorCitoaXN0b3J5IHNpemUgTjogIFRoZSBzaXplLCBpbiBjb21tYW5kcywgb2YgdGhlIGNvbW1hbmQgaGlzdG9yeS4gIFRoZSAKKwkJIGRlZmF1bHQgaXMgMjU2LCBvciB0aGUgdmFsdWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCisJCSBISVNUU0laRS4KKworaGlzdG9yeSBzYXZlIG9uL29mZjogSWYgdGhpcyB2YWx1ZSBpcyBzZXQgdG8gT04sIHRoZSBoaXN0b3J5IGZpbGUgd2lsbAorCQkgICAgICBiZSBzYXZlZCBhZnRlciBleGl0aW5nIGdkYi4gIElmIHNldCB0byBPRkYsIHRoZSAKKwkJICAgICAgZmlsZSB3aWxsIG5vdCBiZSBzYXZlZC4gIFRoZSBkZWZhdWx0IGlzIE9GRi4KKworaGlzdG9yeSBleHBhbnNpb24gb24vb2ZmOiBJZiB0aGlzIHZhbHVlIGlzIHNldCB0byBPTiwgdGhlbiBjc2gtbGlrZSAKKwkJCSAgaGlzdG9yeSBleHBhbnNpb24gd2lsbCBiZSBwZXJmb3JtZWQgIG9uIAorCQkJICBjb21tYW5kIGxpbmUgaW5wdXQuICBUaGUgZGVmYXVsdCBpcyBPRkYuCisKK3JhZGl4IE46ICBTZXRzIHRoZSBkZWZhdWx0IHJhZGl4IGZvciBpbnB1dCBhbmQgb3V0cHV0LiAgSXQgY2FuIGJlIHNldAorCSAgdG8gOCwgMTAsIG9yIDE2LiAgTm90ZSB0aGF0IHRoZSBhcmd1bWVudCB0byAicmFkaXgiIGlzIGludGVycHJldGVkCisJICBpbiB0aGUgY3VycmVudCByYWRpeCwgc28gInNldCByYWRpeCAxMCIgaXMgYWx3YXlzIGEgbm8tb3AuCisKK2hlaWdodCBOOiBUaGlzIGludGVnZXIgdmFsdWUgaXMgdGhlIG51bWJlciBvZiBsaW5lcyBvbiBhIHBhZ2UuIERlZmF1bHQKKyAgICAgICAgICBpcyAyNCwgdGhlIGN1cnJlbnQgYHN0dHkgcm93cycnIHNldHRpbmcsIG9yIHRoZSBgYGxpIycnCisJICBzZXR0aW5nIGZyb20gdGhlIHRlcm1jYXAgZW50cnkgbWF0Y2hpbmcgdGhlIGVudmlyb25tZW50CisJICB2YXJpYWJsZSBURVJNLgorCit3aWR0aCBOOiAgVGhpcyBpbnRlZ2VyIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBvbiBhIGxpbmUuCisJICBEZWZhdWx0IGlzIDgwLCB0aGUgY3VycmVudCBgc3R0eSBjb2xzJycgc2V0dGluZywgb3IgdGhlIGBgY28jJycKKwkgIHNldHRpbmcgZnJvbSB0aGUgdGVybWNhcCBlbnRyeSBtYXRjaGluZyB0aGUgZW52aXJvbm1lbnQKKwkgIHZhcmlhYmxlIFRFUk0uCisKK05vdGU6IGBgc2V0IHNjcmVlbnNpemUnJyBpcyBvYnNvbGV0ZS4gVXNlIGBgc2V0IGhlaWdodCcnIGFuZAorYGBzZXQgd2lkdGgnJyBpbnN0ZWFkLgorCitwcmludCBhZGRyZXNzIG9uL29mZjogIFByaW50IG1lbW9yeSBhZGRyZXNzZXMgaW4gdmFyaW91cyBjb21tYW5kIGRpc3BsYXlzLAorCQkgICAgICBzdWNoIGFzIHN0YWNrIHRyYWNlcyBhbmQgc3RydWN0dXJlIHZhbHVlcy4gIEdkYiBsb29rcworCQkgICAgICBtb3JlIGBgc3ltYm9saWMnJyBpZiB5b3UgdHVybiB0aGlzIG9mZjsgaXQgbG9va3MgbW9yZQorCQkgICAgICBgYG1hY2hpbmUgbGV2ZWwnJyB3aXRoIGl0IG9uLiAgRGVmYXVsdCBpcyBPTi4KKworcHJpbnQgYXJyYXkgb24vb2ZmOiAgUHJldHR5cHJpbnQgYXJyYXlzLiAgTmV3IGNvbnZlbmllbnQgZm9ybWF0ISAgRGVmYXVsdCAKKyAgICAgICAgICAgICAgICAgICAgaXMgT0ZGLgorCitwcmludCBkZW1hbmdsZSBvbi9vZmY6ICAgUHJpbnQgQysrIHN5bWJvbHMgaW4gInNvdXJjZSIgZm9ybSBpZiBvbiwKKwkJCSJyYXciIGZvcm0gaWYgb2ZmLgorCitwcmludCBhc20tZGVtYW5nbGUgb24vb2ZmOiAgU2FtZSwgZm9yIGFzc2VtYmxlciBsZXZlbCBwcmludG91dHMKKwkJCWxpa2UgaW5zdHJ1Y3Rpb25zLgorCitwcmludCB2dGJsIG9uL29mZjogIFByZXR0eXByaW50IEMrKyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlcy4gIERlZmF1bHQgaXMgT0ZGLgorCisKKyAqICBTdXBwb3J0IGZvciBFcG9jaCBFbnZpcm9ubWVudC4KKworVGhlIGVwb2NoIGVudmlyb25tZW50IGlzIGEgdmVyc2lvbiBvZiBFbWFjcyB2MTggd2l0aCB3aW5kb3dpbmcuICBPbmUKK25ldyBjb21tYW5kLCBgYGluc3BlY3QnJywgaXMgaWRlbnRpY2FsIHRvIGBgcHJpbnQnJywgZXhjZXB0IHRoYXQgaWYgeW91CithcmUgcnVubmluZyBpbiB0aGUgZXBvY2ggZW52aXJvbm1lbnQsIHRoZSB2YWx1ZSBpcyBwcmludGVkIGluIGl0cyBvd24KK3dpbmRvdy4KKworCisgKiAgU3VwcG9ydCBmb3IgU2hhcmVkIExpYnJhcmllcworCitHREIgY2FuIG5vdyBkZWJ1ZyBwcm9ncmFtcyBhbmQgY29yZSBmaWxlcyB0aGF0IHVzZSBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLgorU3ltYm9scyBmcm9tIGEgc2hhcmVkIGxpYnJhcnkgY2Fubm90IGJlIHJlZmVyZW5jZWQKK2JlZm9yZSB0aGUgc2hhcmVkIGxpYnJhcnkgaGFzIGJlZW4gbGlua2VkIHdpdGggdGhlIHByb2dyYW0gKHRoaXMKK2hhcHBlbnMgYWZ0ZXIgeW91IHR5cGUgYGBydW4nJyBhbmQgYmVmb3JlIHRoZSBmdW5jdGlvbiBtYWluKCkgaXMgZW50ZXJlZCkuCitBdCBhbnkgdGltZSBhZnRlciB0aGlzIGxpbmtpbmcgKGluY2x1ZGluZyB3aGVuIGV4YW1pbmluZyBjb3JlIGZpbGVzCitmcm9tIGR5bmFtaWNhbGx5IGxpbmtlZCBwcm9ncmFtcyksIGdkYiByZWFkcyB0aGUgc3ltYm9scyBmcm9tIGVhY2gKK3NoYXJlZCBsaWJyYXJ5IHdoZW4geW91IHR5cGUgdGhlIGBgc2hhcmVkbGlicmFyeScnIGNvbW1hbmQuCitJdCBjYW4gYmUgYWJicmV2aWF0ZWQgYGBzaGFyZScnLgorCitzaGFyZWRsaWJyYXJ5IFJFR0VYUDogIExvYWQgc2hhcmVkIG9iamVjdCBsaWJyYXJ5IHN5bWJvbHMgZm9yIGZpbGVzIAorICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGluZyBhIHVuaXggcmVndWxhciBleHByZXNzaW9uLiAgTm8gYXJndW1lbnQKKwkJICAgICAgIGluZGljYXRlcyB0byBsb2FkIHN5bWJvbHMgZm9yIGFsbCBzaGFyZWQgbGlicmFyaWVzLgorCitpbmZvIHNoYXJlZGxpYnJhcnk6ICBTdGF0dXMgb2YgbG9hZGVkIHNoYXJlZCBsaWJyYXJpZXMuCisKKworICogIFdhdGNocG9pbnRzCisKK0Egd2F0Y2hwb2ludCBzdG9wcyBleGVjdXRpb24gb2YgYSBwcm9ncmFtIHdoZW5ldmVyIHRoZSB2YWx1ZSBvZiBhbgorZXhwcmVzc2lvbiBjaGFuZ2VzLiAgQ2hlY2tpbmcgZm9yIHRoaXMgc2xvd3MgZG93biBleGVjdXRpb24KK3RyZW1lbmRvdXNseSB3aGVuZXZlciB5b3UgYXJlIGluIHRoZSBzY29wZSBvZiB0aGUgZXhwcmVzc2lvbiwgYnV0IGlzCitxdWl0ZSB1c2VmdWwgZm9yIGNhdGNoaW5nIHRvdWdoIGBgYml0LXNwcmVhZGVyJycgb3IgcG9pbnRlciBtaXN1c2UKK3Byb2JsZW1zLiAgU29tZSBtYWNoaW5lcyBzdWNoIGFzIHRoZSAzODYgaGF2ZSBoYXJkd2FyZSBmb3IgZG9pbmcgdGhpcworbW9yZSBxdWlja2x5LCBhbmQgZnV0dXJlIHZlcnNpb25zIG9mIGdkYiB3aWxsIHVzZSB0aGlzIGhhcmR3YXJlLgorCit3YXRjaCBFWFA6ICBTZXQgYSB3YXRjaHBvaW50IChicmVha3BvaW50KSBmb3IgYW4gZXhwcmVzc2lvbi4KKworaW5mbyB3YXRjaHBvaW50czogIEluZm9ybWF0aW9uIGFib3V0IHlvdXIgd2F0Y2hwb2ludHMuCisKK2RlbGV0ZSBOOiAgIERlbGV0ZXMgd2F0Y2hwb2ludCBudW1iZXIgTiAoc2FtZSBhcyBicmVha3BvaW50cykuCitkaXNhYmxlIE46ICBUZW1wb3JhcmlseSB0dXJucyBvZmYgd2F0Y2hwb2ludCBudW1iZXIgTiAoc2FtZSBhcyBicmVha3BvaW50cykuCitlbmFibGUgTjogICBSZS1lbmFibGVzIHdhdGNocG9pbnQgbnVtYmVyIE4gKHNhbWUgYXMgYnJlYWtwb2ludHMpLgorCisKKyAqICBDKysgbXVsdGlwbGUgaW5oZXJpdGFuY2UKKworV2hlbiB1c2VkIHdpdGggYSBHQ0MgdmVyc2lvbiAyIGNvbXBpbGVyLCBHREIgc3VwcG9ydHMgbXVsdGlwbGUgaW5oZXJpdGFuY2UKK2ZvciBDKysgcHJvZ3JhbXMuCisKKyAqICBDKysgZXhjZXB0aW9uIGhhbmRsaW5nCisKK0dkYiBub3cgc3VwcG9ydHMgbGltaXRlZCBDKysgZXhjZXB0aW9uIGhhbmRsaW5nLiAgQmVzaWRlcyB0aGUgZXhpc3RpbmcKK2FiaWxpdHkgdG8gYnJlYWtwb2ludCBvbiBhbiBleGNlcHRpb24gaGFuZGxlciwgZ2RiIGNhbiBicmVha3BvaW50IG9uCit0aGUgcmFpc2luZyBvZiBhbiBleGNlcHRpb24gKGJlZm9yZSB0aGUgc3RhY2sgaXMgcGVlbGVkIGJhY2sgdG8gdGhlCitoYW5kbGVyJ3MgY29udGV4dCkuCisKK2NhdGNoIEZPTzogIElmIHRoZXJlIGlzIGEgRk9PIGV4Y2VwdGlvbiBoYW5kbGVyIGluIHRoZSBkeW5hbWljIHNjb3BlLAorCSAgICBzZXQgYSBicmVha3BvaW50IHRvIGNhdGNoIGV4Y2VwdGlvbnMgd2hpY2ggbWF5IGJlIHJhaXNlZCB0aGVyZS4KKwkgICAgTXVsdGlwbGUgZXhjZXB0aW9ucyAoYGBjYXRjaCBmb28gYmFyIGJheicnKSBtYXkgYmUgY2F1Z2h0LgorCitpbmZvIGNhdGNoOiAgTGlzdHMgYWxsIGV4Y2VwdGlvbnMgd2hpY2ggbWF5IGJlIGNhdWdodCBpbiB0aGUKKyAgICAgICAgICAgICBjdXJyZW50IHN0YWNrIGZyYW1lLgorCisKKyAqICBNaW5vciBjb21tYW5kIGNoYW5nZXMKKworVGhlIGNvbW1hbmQgYGBjYWxsIGZ1bmMgKGFyZywgYXJnLCAuLi4pJycgbm93IGFjdHMgbGlrZSB0aGUgcHJpbnQKK2NvbW1hbmQsIGV4Y2VwdCBpdCBkb2VzIG5vdCBwcmludCBvciBzYXZlIGEgdmFsdWUgaWYgdGhlIGZ1bmN0aW9uJ3MgcmVzdWx0CitpcyB2b2lkLiAgVGhpcyBpcyBzaW1pbGFyIHRvIGRieCB1c2FnZS4KKworVGhlIGBgdXAnJyBhbmQgYGBkb3duJycgY29tbWFuZHMgbm93IGFsd2F5cyBwcmludCB0aGUgZnJhbWUgdGhleSBlbmQgdXAKK2F0OyBgYHVwLXNpbGVudGx5JycgYW5kIGBkb3duLXNpbGVudGx5JycgY2FuIGJlIHVzZWQgaW4gc2NyaXB0cyB0byBjaGFuZ2UKK2ZyYW1lcyB3aXRob3V0IHByaW50aW5nLgorCisgKiAgTmV3IGRpcmVjdG9yeSBjb21tYW5kCisKKydkaXInIG5vdyBhZGRzIGRpcmVjdG9yaWVzIHRvIHRoZSBGUk9OVCBvZiB0aGUgc291cmNlIHNlYXJjaCBwYXRoLgorVGhlIHBhdGggc3RhcnRzIG9mZiBlbXB0eS4gIFNvdXJjZSBmaWxlcyB0aGF0IGNvbnRhaW4gZGVidWcgaW5mb3JtYXRpb24KK2Fib3V0IHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhleSB3ZXJlIGNvbXBpbGVkIGNhbiBiZSBmb3VuZCBldmVuCit3aXRoIGFuIGVtcHR5IHBhdGg7IFN1biBDQyBhbmQgR0NDIGluY2x1ZGUgdGhpcyBpbmZvcm1hdGlvbi4gIElmIEdEQiBjYW4ndAorZmluZCB5b3VyIHNvdXJjZSBmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgdHlwZSAiZGlyIC4iLgorCisgKiBDb25maWd1cmluZyBHREIgZm9yIGNvbXBpbGF0aW9uCisKK0ZvciBub3JtYWwgdXNlLCB0eXBlIGBgLi9jb25maWd1cmUgaG9zdCcnLiAgU2VlIFJFQURNRSBvciBnZGIudGV4aW5mbworZm9yIG1vcmUgZGV0YWlscy4KKworR0RCIG5vdyBoYW5kbGVzIGNyb3NzIGRlYnVnZ2luZy4gIElmIHlvdSBhcmUgcmVtb3RlbHkgZGVidWdnaW5nIGJldHdlZW4gCit0d28gZGlmZmVyZW50IG1hY2hpbmVzLCB0eXBlIGBgLi9jb25maWd1cmUgaG9zdCAtdGFyZ2V0PXRhcmcnJy4KK0hvc3QgaXMgdGhlIG1hY2hpbmUgd2hlcmUgR0RCIHdpbGwgcnVuOyB0YXJnIGlzIHRoZSBtYWNoaW5lCit3aGVyZSB0aGUgcHJvZ3JhbSB0aGF0IHlvdSBhcmUgZGVidWdnaW5nIHdpbGwgcnVuLgpkaWZmIC0tZ2l0IGEvZ2RiL1JFQURNRSBiL2dkYi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3OTFjZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9SRUFETUUKQEAgLTAsMCArMSw2MTggQEAKKwkJICAgICBSRUFETUUgZm9yIGdkYi00LjE4IHJlbGVhc2UKKwkJICAgVXBkYXRlZCA0IEFwciAxOTk5IGJ5IEppbSBCbGFuZHkKKworVGhpcyBpcyBHREIsIHRoZSBHTlUgc291cmNlLWxldmVsIGRlYnVnZ2VyLgorQSBzdW1tYXJ5IG9mIG5ldyBmZWF0dXJlcyBpcyBpbiB0aGUgZmlsZSBgTkVXUycuCisKK1NlZSB0aGUgR0RCIGhvbWUgcGFnZSBhdCBodHRwOi8vd3d3LmN5Z251cy5jb20vZ2RiLyBmb3IgdXAgdG8gZGF0ZQorcmVsZWFzZSBpbmZvcm1hdGlvbiwgbWFpbGluZyBsaXN0IGxpbmtzIGFuZCBhcmNoaXZlcywgZXRjLgorCisKK1VucGFja2luZyBhbmQgSW5zdGFsbGF0aW9uIC0tIHF1aWNrIG92ZXJ2aWV3Cis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbiB0aGlzIHJlbGVhc2UsIHRoZSBHREIgZGVidWdnZXIgc291cmNlcywgdGhlIGdlbmVyaWMgR05VIGluY2x1ZGUKK2ZpbGVzLCB0aGUgQkZEICgiYmluYXJ5IGZpbGUgZGVzY3JpcHRpb24iKSBsaWJyYXJ5LCB0aGUgcmVhZGxpbmUKK2xpYnJhcnksIGFuZCBvdGhlciBsaWJyYXJpZXMgYWxsIGhhdmUgZGlyZWN0b3JpZXMgb2YgdGhlaXIgb3duCit1bmRlcm5lYXRoIHRoZSBnZGItNC4xOCBkaXJlY3RvcnkuICBUaGUgaWRlYSBpcyB0aGF0IGEgdmFyaWV0eSBvZiBHTlUKK3Rvb2xzIGNhbiBzaGFyZSBhIGNvbW1vbiBjb3B5IG9mIHRoZXNlIHRoaW5ncy4gIEJlIGF3YXJlIG9mIHZhcmlhdGlvbgorb3ZlciB0aW1lLS1mb3IgZXhhbXBsZSBkb24ndCB0cnkgdG8gYnVpbGQgZ2RiIHdpdGggYSBjb3B5IG9mIGJmZCBmcm9tCithIHJlbGVhc2Ugb3RoZXIgdGhhbiB0aGUgZ2RiIHJlbGVhc2UgKHN1Y2ggYXMgYSBiaW51dGlscyBvciBnYXMKK3JlbGVhc2UpLCBlc3BlY2lhbGx5IGlmIHRoZSByZWxlYXNlcyBhcmUgbW9yZSB0aGFuIGEgZmV3IHdlZWtzIGFwYXJ0LgorQ29uZmlndXJhdGlvbiBzY3JpcHRzIGFuZCBtYWtlZmlsZXMgZXhpc3QgdG8gY3J1aXNlIHVwIGFuZCBkb3duIHRoaXMKK2RpcmVjdG9yeSB0cmVlIGFuZCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGFsbCB0aGUgcGllY2VzIGluIHRoZSByaWdodAorb3JkZXIuCisKK1doZW4geW91IHVucGFjayB0aGUgZ2RiLTQuMTgudGFyLmd6IGZpbGUsIHlvdSdsbCBmaW5kIGEgZGlyZWN0b3J5CitjYWxsZWQgYGdkYi00LjE4Jywgd2hpY2ggY29udGFpbnM6CisKKyAgQ09QWUlORyAgICAgICAgICBjb25maWcuc3ViKiAgICAgIGxpYmliZXJ0eS8gICAgICAgb3Bjb2Rlcy8KKyAgQ09QWUlORy5MSUIgICAgICBjb25maWd1cmUqICAgICAgIG1tYWxsb2MvICAgICAgICAgcmVhZGxpbmUvCisgIE1ha2VmaWxlLmluICAgICAgY29uZmlndXJlLmluICAgICBtb3ZlLWlmLWNoYW5nZSogIHNpbS8KKyAgUkVBRE1FICAgICAgICAgICBldGMvICAgICAgICAgICAgIG1wdy1SRUFETUUgICAgICAgdGV4aW5mby8KKyAgYmZkLyAgICAgICAgICAgICBnZGIvICAgICAgICAgICAgIG1wdy1idWlsZC5pbiAgICAgdXRpbHMvCisgIGNvbmZpZy8gICAgICAgICAgaW5jbHVkZS8gICAgICAgICBtcHctY29uZmlnLmluCisgIGNvbmZpZy5ndWVzcyogICAgaW5zdGFsbC5zaCogICAgICBtcHctY29uZmlndXJlCisKK1RvIGJ1aWxkIEdEQiwgeW91IGNhbiBqdXN0IGRvOgorCisJY2QgZ2RiLTQuMTgKKwkuL2NvbmZpZ3VyZQorCW1ha2UKKwljcCBnZGIvZ2RiIC91c3IvbG9jYWwvYmluL2dkYgkob3Igd2hlcmV2ZXIgeW91IHdhbnQpCisKK1RoaXMgd2lsbCBjb25maWd1cmUgYW5kIGJ1aWxkIGFsbCB0aGUgbGlicmFyaWVzIGFzIHdlbGwgYXMgR0RCLgorSWYgYGNvbmZpZ3VyZScgY2FuJ3QgZGV0ZXJtaW5lIHlvdXIgc3lzdGVtIHR5cGUsIHNwZWNpZnkgb25lIGFzIGl0cworYXJndW1lbnQsIGUuZy4sIHN1bjQgb3IgZGVjc3RhdGlvbi4KKworSWYgeW91IGdldCBjb21waWxlciB3YXJuaW5ncyBkdXJpbmcgdGhpcyBzdGFnZSwgc2VlIHRoZSBgUmVwb3J0aW5nIEJ1Z3MnCitzZWN0aW9uIGJlbG93OyB0aGVyZSBhcmUgYSBmZXcga25vd24gcHJvYmxlbXMuCisKK0dEQiByZXF1aXJlcyBhbiBBTlNJIEMgY29tcGlsZXIuICBJZiB5b3UgZG8gbm90IGhhdmUgYW4gQU5TSSBDCitjb21waWxlciBmb3IgeW91ciBzeXN0ZW0sIHlvdSBtYXkgYmUgYWJsZSB0byBkb3dubG9hZCBhbmQgaW5zdGFsbCB0aGUKK0dOVSBDQyBjb21waWxlci4gIEl0IGlzIGF2YWlsYWJsZSB2aWEgYW5vbnltb3VzIEZUUCBmcm9tIGZ0cC5nbnUub3JnLAoraW4gL3B1Yi9nbnUvZ2NjIChhcyBhIFVSTCwgdGhhdCdzIGZ0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvZ2NjKS4KKworR0RCIGNhbiBiZSB1c2VkIGFzIGEgY3Jvc3MtZGVidWdnZXIsIHJ1bm5pbmcgb24gYSBtYWNoaW5lIG9mIG9uZSB0eXBlCit3aGlsZSBkZWJ1Z2dpbmcgYSBwcm9ncmFtIHJ1bm5pbmcgb24gYSBtYWNoaW5lIG9mIGFub3RoZXIgdHlwZS4gIFNlZSBiZWxvdy4KKworCitNb3JlIERvY3VtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKgorCisgICBBbGwgdGhlIGRvY3VtZW50YXRpb24gZm9yIEdEQiBjb21lcyBhcyBwYXJ0IG9mIHRoZSBtYWNoaW5lLXJlYWRhYmxlCitkaXN0cmlidXRpb24uICBUaGUgZG9jdW1lbnRhdGlvbiBpcyB3cml0dGVuIGluIFRleGluZm8gZm9ybWF0LCB3aGljaCBpcworYSBkb2N1bWVudGF0aW9uIHN5c3RlbSB0aGF0IHVzZXMgYSBzaW5nbGUgc291cmNlIGZpbGUgdG8gcHJvZHVjZSBib3RoCitvbi1saW5lIGluZm9ybWF0aW9uIGFuZCBhIHByaW50ZWQgbWFudWFsLiAgWW91IGNhbiB1c2Ugb25lIG9mIHRoZSBJbmZvCitmb3JtYXR0aW5nIGNvbW1hbmRzIHRvIGNyZWF0ZSB0aGUgb24tbGluZSB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudGF0aW9uCithbmQgVGVYIChvciBgdGV4aTJyb2ZmJykgdG8gdHlwZXNldCB0aGUgcHJpbnRlZCB2ZXJzaW9uLgorCisgICBHREIgaW5jbHVkZXMgYW4gYWxyZWFkeSBmb3JtYXR0ZWQgY29weSBvZiB0aGUgb24tbGluZSBJbmZvIHZlcnNpb24gb2YKK3RoaXMgbWFudWFsIGluIHRoZSBgZ2RiL2RvYycgc3ViZGlyZWN0b3J5LiAgVGhlIG1haW4gSW5mbyBmaWxlIGlzCitgZ2RiLTQuMTgvZ2RiL2RvYy9nZGIuaW5mbycsIGFuZCBpdCByZWZlcnMgdG8gc3Vib3JkaW5hdGUgZmlsZXMgbWF0Y2hpbmcKK2BnZGIuaW5mbyonIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4gIElmIG5lY2Vzc2FyeSwgeW91IGNhbiBwcmludCBvdXQKK3RoZXNlIGZpbGVzLCBvciByZWFkIHRoZW0gd2l0aCBhbnkgZWRpdG9yOyBidXQgdGhleSBhcmUgZWFzaWVyIHRvIHJlYWQKK3VzaW5nIHRoZSBgaW5mbycgc3Vic3lzdGVtIGluIEdOVSBFbWFjcyBvciB0aGUgc3RhbmRhbG9uZSBgaW5mbycgcHJvZ3JhbSwKK2F2YWlsYWJsZSBhcyBwYXJ0IG9mIHRoZSBHTlUgVGV4aW5mbyBkaXN0cmlidXRpb24uCisKKyAgIElmIHlvdSB3YW50IHRvIGZvcm1hdCB0aGVzZSBJbmZvIGZpbGVzIHlvdXJzZWxmLCB5b3UgbmVlZCBvbmUgb2YgdGhlCitJbmZvIGZvcm1hdHRpbmcgcHJvZ3JhbXMsIHN1Y2ggYXMgYHRleGluZm8tZm9ybWF0LWJ1ZmZlcicgb3IKK2BtYWtlaW5mbycuCisKKyAgIElmIHlvdSBoYXZlIGBtYWtlaW5mbycgaW5zdGFsbGVkLCBhbmQgYXJlIGluIHRoZSB0b3AgbGV2ZWwgR0RCCitzb3VyY2UgZGlyZWN0b3J5IChgZ2RiLTQuMTgnLCBpbiB0aGUgY2FzZSBvZiB2ZXJzaW9uIDQuMTgpLCB5b3UgY2FuIG1ha2UKK3RoZSBJbmZvIGZpbGUgYnkgdHlwaW5nOgorCisgICAgIGNkIGdkYi9kb2MKKyAgICAgbWFrZSBpbmZvCisKKyAgIElmIHlvdSB3YW50IHRvIHR5cGVzZXQgYW5kIHByaW50IGNvcGllcyBvZiB0aGlzIG1hbnVhbCwgeW91IG5lZWQKK1RlWCwgYSBwcm9ncmFtIHRvIHByaW50IGl0cyBEVkkgb3V0cHV0IGZpbGVzLCBhbmQgYHRleGluZm8udGV4JywgdGhlCitUZXhpbmZvIGRlZmluaXRpb25zIGZpbGUuICBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgaW4gdGhlIEdEQgorZGlzdHJpYnV0aW9uLCBpbiB0aGUgZGlyZWN0b3J5IGBnZGItNC4xOC90ZXhpbmZvJy4KKworICAgVGVYIGlzIGEgdHlwZXNldHRpbmcgcHJvZ3JhbTsgaXQgZG9lcyBub3QgcHJpbnQgZmlsZXMgZGlyZWN0bHksIGJ1dAorcHJvZHVjZXMgb3V0cHV0IGZpbGVzIGNhbGxlZCBEVkkgZmlsZXMuICBUbyBwcmludCBhIHR5cGVzZXQgZG9jdW1lbnQsCit5b3UgbmVlZCBhIHByb2dyYW0gdG8gcHJpbnQgRFZJIGZpbGVzLiAgSWYgeW91ciBzeXN0ZW0gaGFzIFRlWAoraW5zdGFsbGVkLCBjaGFuY2VzIGFyZSBpdCBoYXMgc3VjaCBhIHByb2dyYW0uICBUaGUgcHJlY2lzZSBjb21tYW5kIHRvCit1c2UgZGVwZW5kcyBvbiB5b3VyIHN5c3RlbTsgYGxwciAtZCcgaXMgY29tbW9uOyBhbm90aGVyIChmb3IgUG9zdFNjcmlwdAorZGV2aWNlcykgaXMgYGR2aXBzJy4gIFRoZSBEVkkgcHJpbnQgY29tbWFuZCBtYXkgcmVxdWlyZSBhIGZpbGUgbmFtZQord2l0aG91dCBhbnkgZXh0ZW5zaW9uIG9yIGEgYC5kdmknIGV4dGVuc2lvbi4KKworICAgVGVYIGFsc28gcmVxdWlyZXMgYSBtYWNybyBkZWZpbml0aW9ucyBmaWxlIGNhbGxlZCBgdGV4aW5mby50ZXgnLiAKK1RoaXMgZmlsZSB0ZWxscyBUZVggaG93IHRvIHR5cGVzZXQgYSBkb2N1bWVudCB3cml0dGVuIGluIFRleGluZm8KK2Zvcm1hdC4gIE9uIGl0cyBvd24sIFRlWCBjYW5ub3QgcmVhZCwgbXVjaCBsZXNzIHR5cGVzZXQgYSBUZXhpbmZvIGZpbGUuCisgYHRleGluZm8udGV4JyBpcyBkaXN0cmlidXRlZCB3aXRoIEdEQiBhbmQgaXMgbG9jYXRlZCBpbiB0aGUKK2BnZGItNC4xOC90ZXhpbmZvJyBkaXJlY3RvcnkuCisKKyAgIElmIHlvdSBoYXZlIFRlWCBhbmQgYSBEVkkgcHJpbnRlciBwcm9ncmFtIGluc3RhbGxlZCwgeW91IGNhbiB0eXBlc2V0CithbmQgcHJpbnQgdGhpcyBtYW51YWwuICBGaXJzdCBzd2l0Y2ggdG8gdGhlIHRoZSBgZ2RiJyBzdWJkaXJlY3Rvcnkgb2YKK3RoZSBtYWluIHNvdXJjZSBkaXJlY3RvcnkgKGZvciBleGFtcGxlLCB0byBgZ2RiLTQuMTgvZ2RiJykgYW5kIHRoZW4gdHlwZToKKworICAgICBtYWtlIGdkYi5kdmkKKworCitJbnN0YWxsaW5nIEdEQgorKioqKioqKioqKioqKioKKworICAgR0RCIGNvbWVzIHdpdGggYSBgY29uZmlndXJlJyBzY3JpcHQgdGhhdCBhdXRvbWF0ZXMgdGhlIHByb2Nlc3Mgb2YKK3ByZXBhcmluZyBHREIgZm9yIGluc3RhbGxhdGlvbjsgeW91IGNhbiB0aGVuIHVzZSBgbWFrZScgdG8gYnVpbGQgdGhlCitgZ2RiJyBwcm9ncmFtLgorCisgICBUaGUgR0RCIGRpc3RyaWJ1dGlvbiBpbmNsdWRlcyBhbGwgdGhlIHNvdXJjZSBjb2RlIHlvdSBuZWVkIGZvciBHREIgaW4KK2Egc2luZ2xlIGRpcmVjdG9yeSwgd2hvc2UgbmFtZSBpcyB1c3VhbGx5IGNvbXBvc2VkIGJ5IGFwcGVuZGluZyB0aGUKK3ZlcnNpb24gbnVtYmVyIHRvIGBnZGInLgorCisgICBGb3IgZXhhbXBsZSwgdGhlIEdEQiB2ZXJzaW9uIDQuMTggZGlzdHJpYnV0aW9uIGlzIGluIHRoZSBgZ2RiLTQuMTgnCitkaXJlY3RvcnkuICBUaGF0IGRpcmVjdG9yeSBjb250YWluczoKKworYGdkYi00LjE4L3tDT1BZSU5HLENPUFlJTkcuTElCfScKKyAgICAgU3RhbmRhcmQgR05VIGxpY2Vuc2UgZmlsZXMuICBQbGVhc2UgcmVhZCB0aGVtLgorCitgZ2RiLTQuMTgvYmZkJworICAgICBzb3VyY2UgZm9yIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkKKworYGdkYi00LjE4L2NvbmZpZyonCisgICAgIHNjcmlwdCBmb3IgY29uZmlndXJpbmcgR0RCLCBhbG9uZyB3aXRoIG90aGVyIHN1cHBvcnQgZmlsZXMKKworYGdkYi00LjE4L2dkYicKKyAgICAgdGhlIHNvdXJjZSBzcGVjaWZpYyB0byBHREIgaXRzZWxmCisKK2BnZGItNC4xOC9pbmNsdWRlJworICAgICBHTlUgaW5jbHVkZSBmaWxlcworCitgZ2RiLTQuMTgvbGliaWJlcnR5JworICAgICBzb3VyY2UgZm9yIHRoZSBgLWxpYmVydHknIGZyZWUgc29mdHdhcmUgbGlicmFyeQorCitgZ2RiLTQuMTgvbW1hbGxvYycKKyAgICAgc291cmNlIGZvciB0aGUgR05VIG1lbW9yeS1tYXBwZWQgbWFsbG9jIHBhY2thZ2UKKworYGdkYi00LjE4L29wY29kZXMnCisgICAgIHNvdXJjZSBmb3IgdGhlIGxpYnJhcnkgb2Ygb3Bjb2RlIHRhYmxlcyBhbmQgZGlzYXNzZW1ibGVycworCitgZ2RiLTQuMTgvcmVhZGxpbmUnCisgICAgIHNvdXJjZSBmb3IgdGhlIEdOVSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlCisKK2BnZGItNC4xOC9zaW0nCisgICAgIHNvdXJjZSBmb3Igc29tZSBzaW11bGF0b3JzIChBUk0sIEQxMFYsIFNQQVJDLCBNMzJSLCBNSVBTLCBQUEMsIFY4NTAsIGV0YykKKworYGdkYi00LjE4L2ludGwnCisgICAgIHNvdXJjZSBmb3IgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnksIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbi4KKyAgICAgVGhpcyBpcyBzbGlnaHRseSBtb2RpZmllZCBmcm9tIHRoZSBzdGFuZGFsb25lIGdldHRleHQKKyAgICAgZGlzdHJpYnV0aW9uIHlvdSBjYW4gZ2V0IGZyb20gR05VLgorCitgZ2RiLTQuMTgvdGV4aW5mbycKKyAgICAgVGhlIGB0ZXhpbmZvLnRleCcgZmlsZSwgd2hpY2ggeW91IG5lZWQgaW4gb3JkZXIgdG8gbWFrZSBhIHByaW50ZWQKKyAgICAgbWFudWFsIHVzaW5nIFRlWC4KKworYGdkYi00LjE4L2V0YycKKyAgICAgQ29kaW5nIHN0YW5kYXJkcywgdXNlZnVsIGZpbGVzIGZvciBlZGl0aW5nIEdEQiwgYW5kIG90aGVyCisgICAgIG1pc2NlbGxhbmVhLgorCitgZ2RiLTQuMTgvdXRpbHMnCisgICAgIEEgZ3JhYiBiYWcgb2YgcmFuZG9tIHV0aWxpdGllcy4KKworCisgICBUaGUgc2ltcGxlc3Qgd2F5IHRvIGNvbmZpZ3VyZSBhbmQgYnVpbGQgR0RCIGlzIHRvIHJ1biBgY29uZmlndXJlJworZnJvbSB0aGUgYGdkYi1WRVJTSU9OLU5VTUJFUicgc291cmNlIGRpcmVjdG9yeSwgd2hpY2ggaW4gdGhpcyBleGFtcGxlCitpcyB0aGUgYGdkYi00LjE4JyBkaXJlY3RvcnkuCisKKyAgIEZpcnN0IHN3aXRjaCB0byB0aGUgYGdkYi1WRVJTSU9OLU5VTUJFUicgc291cmNlIGRpcmVjdG9yeSBpZiB5b3UgYXJlCitub3QgYWxyZWFkeSBpbiBpdDsgdGhlbiBydW4gYGNvbmZpZ3VyZScuCisKKyAgIEZvciBleGFtcGxlOgorCisgICAgIGNkIGdkYi00LjE4CisgICAgIC4vY29uZmlndXJlCisgICAgIG1ha2UKKworICAgUnVubmluZyBgY29uZmlndXJlJyBmb2xsb3dlZCBieSBgbWFrZScgYnVpbGRzIHRoZSBgYmZkJywKK2ByZWFkbGluZScsIGBtbWFsbG9jJywgYW5kIGBsaWJpYmVydHknIGxpYnJhcmllcywgdGhlbiBgZ2RiJyBpdHNlbGYuCitUaGUgY29uZmlndXJlZCBzb3VyY2UgZmlsZXMsIGFuZCB0aGUgYmluYXJpZXMsIGFyZSBsZWZ0IGluIHRoZQorY29ycmVzcG9uZGluZyBzb3VyY2UgZGlyZWN0b3JpZXMuCisKKyAgIGBjb25maWd1cmUnIGlzIGEgQm91cm5lLXNoZWxsIChgL2Jpbi9zaCcpIHNjcmlwdDsgaWYgeW91ciBzeXN0ZW0KK2RvZXMgbm90IHJlY29nbml6ZSB0aGlzIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3UgcnVuIGEgZGlmZmVyZW50IHNoZWxsLAoreW91IG1heSBuZWVkIHRvIHJ1biBgc2gnIG9uIGl0IGV4cGxpY2l0bHk6CisKKyAgICAgc2ggY29uZmlndXJlCisKKyAgIElmIHlvdSBydW4gYGNvbmZpZ3VyZScgZnJvbSBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHNvdXJjZQorZGlyZWN0b3JpZXMgZm9yIG11bHRpcGxlIGxpYnJhcmllcyBvciBwcm9ncmFtcywgc3VjaCBhcyB0aGUgYGdkYi00LjE4Jworc291cmNlIGRpcmVjdG9yeSBmb3IgdmVyc2lvbiA0LjE4LCBgY29uZmlndXJlJyBjcmVhdGVzIGNvbmZpZ3VyYXRpb24KK2ZpbGVzIGZvciBldmVyeSBkaXJlY3RvcnkgbGV2ZWwgdW5kZXJuZWF0aCAodW5sZXNzIHlvdSB0ZWxsIGl0IG5vdCB0bywKK3dpdGggdGhlIGAtLW5vcmVjdXJzaW9uJyBvcHRpb24pLgorCisgICBZb3UgY2FuIHJ1biB0aGUgYGNvbmZpZ3VyZScgc2NyaXB0IGZyb20gYW55IG9mIHRoZSBzdWJvcmRpbmF0ZQorZGlyZWN0b3JpZXMgaW4gdGhlIEdEQiBkaXN0cmlidXRpb24sIGlmIHlvdSBvbmx5IHdhbnQgdG8gY29uZmlndXJlIHRoYXQKK3N1YmRpcmVjdG9yeTsgYnV0IGJlIHN1cmUgdG8gc3BlY2lmeSBhIHBhdGggdG8gaXQuCisKKyAgIEZvciBleGFtcGxlLCB3aXRoIHZlcnNpb24gNC4xOCwgdHlwZSB0aGUgZm9sbG93aW5nIHRvIGNvbmZpZ3VyZSBvbmx5Cit0aGUgYGJmZCcgc3ViZGlyZWN0b3J5OgorCisgICAgIGNkIGdkYi00LjE4L2JmZAorICAgICAuLi9jb25maWd1cmUKKworICAgWW91IGNhbiBpbnN0YWxsIGBnZGInIGFueXdoZXJlOyBpdCBoYXMgbm8gaGFyZHdpcmVkIHBhdGhzLiBIb3dldmVyLAoreW91IHNob3VsZCBtYWtlIHN1cmUgdGhhdCB0aGUgc2hlbGwgb24geW91ciBwYXRoIChuYW1lZCBieSB0aGUgYFNIRUxMJworZW52aXJvbm1lbnQgdmFyaWFibGUpIGlzIHB1YmxpY2x5IHJlYWRhYmxlLiAgUmVtZW1iZXIgdGhhdCBHREIgdXNlcyB0aGUKK3NoZWxsIHRvIHN0YXJ0IHlvdXIgcHJvZ3JhbS0tc29tZSBzeXN0ZW1zIHJlZnVzZSB0byBsZXQgR0RCIGRlYnVnIGNoaWxkCitwcm9jZXNzZXMgd2hvc2UgcHJvZ3JhbXMgYXJlIG5vdCByZWFkYWJsZS4KKworCitDb21waWxpbmcgR0RCIGluIGFub3RoZXIgZGlyZWN0b3J5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIElmIHlvdSB3YW50IHRvIHJ1biBHREIgdmVyc2lvbnMgZm9yIHNldmVyYWwgaG9zdCBvciB0YXJnZXQgbWFjaGluZXMsCit5b3UgbmVlZCBhIGRpZmZlcmVudCBgZ2RiJyBjb21waWxlZCBmb3IgZWFjaCBjb21iaW5hdGlvbiBvZiBob3N0IGFuZAordGFyZ2V0LiAgYGNvbmZpZ3VyZScgaXMgZGVzaWduZWQgdG8gbWFrZSB0aGlzIGVhc3kgYnkgYWxsb3dpbmcgeW91IHRvCitnZW5lcmF0ZSBlYWNoIGNvbmZpZ3VyYXRpb24gaW4gYSBzZXBhcmF0ZSBzdWJkaXJlY3RvcnksIHJhdGhlciB0aGFuIGluCit0aGUgc291cmNlIGRpcmVjdG9yeS4gIElmIHlvdXIgYG1ha2UnIHByb2dyYW0gaGFuZGxlcyB0aGUgYFZQQVRIJworZmVhdHVyZSBjb3JyZWN0bHkgKEdOVSBgbWFrZScgYW5kIFN1bk9TICdtYWtlJyBhcmUgdHdvIHRoYXQgc2hvdWxkKSwKK3J1bm5pbmcgYG1ha2UnIGluIGVhY2ggb2YgdGhlc2UgZGlyZWN0b3JpZXMgYnVpbGRzIHRoZSBgZ2RiJyBwcm9ncmFtCitzcGVjaWZpZWQgdGhlcmUuCisKKyAgIFRvIGJ1aWxkIGBnZGInIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5LCBydW4gYGNvbmZpZ3VyZScgd2l0aCB0aGUKK2AtLXNyY2Rpcicgb3B0aW9uIHRvIHNwZWNpZnkgd2hlcmUgdG8gZmluZCB0aGUgc291cmNlLiAoWW91IGFsc28gbmVlZAordG8gc3BlY2lmeSBhIHBhdGggdG8gZmluZCBgY29uZmlndXJlJyBpdHNlbGYgZnJvbSB5b3VyIHdvcmtpbmcKK2RpcmVjdG9yeS4gIElmIHRoZSBwYXRoIHRvIGBjb25maWd1cmUnIHdvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZQorYXJndW1lbnQgdG8gYC0tc3JjZGlyJywgeW91IGNhbiBsZWF2ZSBvdXQgdGhlIGAtLXNyY2Rpcicgb3B0aW9uOyBpdAord2lsbCBiZSBhc3N1bWVkLikKKworICAgRm9yIGV4YW1wbGUsIHdpdGggdmVyc2lvbiA0LjE4LCB5b3UgY2FuIGJ1aWxkIEdEQiBpbiBhIHNlcGFyYXRlCitkaXJlY3RvcnkgZm9yIGEgU3VuIDQgbGlrZSB0aGlzOgorCisgICAgIGNkIGdkYi00LjE4CisgICAgIG1rZGlyIC4uL2dkYi1zdW40CisgICAgIGNkIC4uL2dkYi1zdW40CisgICAgIC4uL2dkYi00LjE4L2NvbmZpZ3VyZSBzdW40CisgICAgIG1ha2UKKworICAgV2hlbiBgY29uZmlndXJlJyBidWlsZHMgYSBjb25maWd1cmF0aW9uIHVzaW5nIGEgcmVtb3RlIHNvdXJjZQorZGlyZWN0b3J5LCBpdCBjcmVhdGVzIGEgdHJlZSBmb3IgdGhlIGJpbmFyaWVzIHdpdGggdGhlIHNhbWUgc3RydWN0dXJlCisoYW5kIHVzaW5nIHRoZSBzYW1lIG5hbWVzKSBhcyB0aGUgdHJlZSB1bmRlciB0aGUgc291cmNlIGRpcmVjdG9yeS4gIEluCit0aGUgZXhhbXBsZSwgeW91J2QgZmluZCB0aGUgU3VuIDQgbGlicmFyeSBgbGliaWJlcnR5LmEnIGluIHRoZQorZGlyZWN0b3J5IGBnZGItc3VuNC9saWJpYmVydHknLCBhbmQgR0RCIGl0c2VsZiBpbiBgZ2RiLXN1bjQvZ2RiJy4KKworICAgT25lIHBvcHVsYXIgcmVhc29uIHRvIGJ1aWxkIHNldmVyYWwgR0RCIGNvbmZpZ3VyYXRpb25zIGluIHNlcGFyYXRlCitkaXJlY3RvcmllcyBpcyB0byBjb25maWd1cmUgR0RCIGZvciBjcm9zcy1jb21waWxpbmcgKHdoZXJlIEdEQiBydW5zIG9uCitvbmUgbWFjaGluZS0tdGhlIGhvc3QtLXdoaWxlIGRlYnVnZ2luZyBwcm9ncmFtcyB0aGF0IHJ1biBvbiBhbm90aGVyCittYWNoaW5lLS10aGUgdGFyZ2V0KS4gIFlvdSBzcGVjaWZ5IGEgY3Jvc3MtZGVidWdnaW5nIHRhcmdldCBieSBnaXZpbmcKK3RoZSBgLS10YXJnZXQ9VEFSR0VUJyBvcHRpb24gdG8gYGNvbmZpZ3VyZScuCisKKyAgIFdoZW4geW91IHJ1biBgbWFrZScgdG8gYnVpbGQgYSBwcm9ncmFtIG9yIGxpYnJhcnksIHlvdSBtdXN0IHJ1biBpdAoraW4gYSBjb25maWd1cmVkIGRpcmVjdG9yeS0td2hhdGV2ZXIgZGlyZWN0b3J5IHlvdSB3ZXJlIGluIHdoZW4geW91CitjYWxsZWQgYGNvbmZpZ3VyZScgKG9yIG9uZSBvZiBpdHMgc3ViZGlyZWN0b3JpZXMpLgorCisgICBUaGUgYE1ha2VmaWxlJyB0aGF0IGBjb25maWd1cmUnIGdlbmVyYXRlcyBpbiBlYWNoIHNvdXJjZSBkaXJlY3RvcnkKK2Fsc28gcnVucyByZWN1cnNpdmVseS4gIElmIHlvdSB0eXBlIGBtYWtlJyBpbiBhIHNvdXJjZSBkaXJlY3Rvcnkgc3VjaAorYXMgYGdkYi00LjE4JyAob3IgaW4gYSBzZXBhcmF0ZSBjb25maWd1cmVkIGRpcmVjdG9yeSBjb25maWd1cmVkIHdpdGgKK2AtLXNyY2Rpcj1QQVRIL2dkYi00LjE4JyksIHlvdSB3aWxsIGJ1aWxkIGFsbCB0aGUgcmVxdWlyZWQgbGlicmFyaWVzLAorYW5kIHRoZW4gYnVpbGQgR0RCLgorCisgICBXaGVuIHlvdSBoYXZlIG11bHRpcGxlIGhvc3RzIG9yIHRhcmdldHMgY29uZmlndXJlZCBpbiBzZXBhcmF0ZQorZGlyZWN0b3JpZXMsIHlvdSBjYW4gcnVuIGBtYWtlJyBvbiB0aGVtIGluIHBhcmFsbGVsIChmb3IgZXhhbXBsZSwgaWYKK3RoZXkgYXJlIE5GUy1tb3VudGVkIG9uIGVhY2ggb2YgdGhlIGhvc3RzKTsgdGhleSB3aWxsIG5vdCBpbnRlcmZlcmUKK3dpdGggZWFjaCBvdGhlci4KKworCitTcGVjaWZ5aW5nIG5hbWVzIGZvciBob3N0cyBhbmQgdGFyZ2V0cworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgVGhlIHNwZWNpZmljYXRpb25zIHVzZWQgZm9yIGhvc3RzIGFuZCB0YXJnZXRzIGluIHRoZSBgY29uZmlndXJlJworc2NyaXB0IGFyZSBiYXNlZCBvbiBhIHRocmVlLXBhcnQgbmFtaW5nIHNjaGVtZSwgYnV0IHNvbWUgc2hvcnQKK3ByZWRlZmluZWQgYWxpYXNlcyBhcmUgYWxzbyBzdXBwb3J0ZWQuICBUaGUgZnVsbCBuYW1pbmcgc2NoZW1lIGVuY29kZXMKK3RocmVlIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBpbiB0aGUgZm9sbG93aW5nIHBhdHRlcm46CisKKyAgICAgQVJDSElURUNUVVJFLVZFTkRPUi1PUworCisgICBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgdGhlIGFsaWFzIGBzdW40JyBhcyBhIEhPU1QgYXJndW1lbnQgb3IgaW4gYQorYC0tdGFyZ2V0PVRBUkdFVCcgb3B0aW9uLiAgVGhlIGVxdWl2YWxlbnQgZnVsbCBuYW1lIGlzCitgc3BhcmMtc3VuLXN1bm9zNCcuCisKKyAgIFRoZSBgY29uZmlndXJlJyBzY3JpcHQgYWNjb21wYW55aW5nIEdEQiBkb2VzIG5vdCBwcm92aWRlIGFueSBxdWVyeQorZmFjaWxpdHkgdG8gbGlzdCBhbGwgc3VwcG9ydGVkIGhvc3QgYW5kIHRhcmdldCBuYW1lcyBvciBhbGlhc2VzLiAKK2Bjb25maWd1cmUnIGNhbGxzIHRoZSBCb3VybmUgc2hlbGwgc2NyaXB0IGBjb25maWcuc3ViJyB0byBtYXAKK2FiYnJldmlhdGlvbnMgdG8gZnVsbCBuYW1lczsgeW91IGNhbiByZWFkIHRoZSBzY3JpcHQsIGlmIHlvdSB3aXNoLCBvcgoreW91IGNhbiB1c2UgaXQgdG8gdGVzdCB5b3VyIGd1ZXNzZXMgb24gYWJicmV2aWF0aW9ucy0tZm9yIGV4YW1wbGU6CisKKyAgICAgJSBzaCBjb25maWcuc3ViIHN1bjQKKyAgICAgc3BhcmMtc3VuLXN1bm9zNC4xLjEKKyAgICAgJSBzaCBjb25maWcuc3ViIHN1bjMKKyAgICAgbTY4ay1zdW4tc3Vub3M0LjEuMQorICAgICAlIHNoIGNvbmZpZy5zdWIgZGVjc3RhdGlvbgorICAgICBtaXBzLWRlYy11bHRyaXg0LjIKKyAgICAgJSBzaCBjb25maWcuc3ViIGhwMzAwYnNkCisgICAgIG02OGstaHAtYnNkCisgICAgICUgc2ggY29uZmlnLnN1YiBpMzg2dgorICAgICBpMzg2LXBjLXN5c3YKKyAgICAgJSBzaCBjb25maWcuc3ViIGk3ODZ2CisgICAgIEludmFsaWQgY29uZmlndXJhdGlvbiBgaTc4NnYnOiBtYWNoaW5lIGBpNzg2dicgbm90IHJlY29nbml6ZWQKKworYGNvbmZpZy5zdWInIGlzIGFsc28gZGlzdHJpYnV0ZWQgaW4gdGhlIEdEQiBzb3VyY2UgZGlyZWN0b3J5CisoYGdkYi00LjE4JywgZm9yIHZlcnNpb24gNC4xOCkuCisKKworYGNvbmZpZ3VyZScgb3B0aW9ucworPT09PT09PT09PT09PT09PT09PQorCisgICBIZXJlIGlzIGEgc3VtbWFyeSBvZiB0aGUgYGNvbmZpZ3VyZScgb3B0aW9ucyBhbmQgYXJndW1lbnRzIHRoYXQgYXJlCittb3N0IG9mdGVuIHVzZWZ1bCBmb3IgYnVpbGRpbmcgR0RCLiAgYGNvbmZpZ3VyZScgYWxzbyBoYXMgc2V2ZXJhbCBvdGhlcgorb3B0aW9ucyBub3QgbGlzdGVkIGhlcmUuICAqbm90ZSA6IChjb25maWd1cmUuaW5mbylXaGF0IENvbmZpZ3VyZSBEb2VzLAorZm9yIGEgZnVsbCBleHBsYW5hdGlvbiBvZiBgY29uZmlndXJlJy4KKworICAgICBjb25maWd1cmUgWy0taGVscF0KKyAgICAgICAgICAgICAgIFstLXByZWZpeD1ESVJdCisgICAgICAgICAgICAgICBbLS1zcmNkaXI9UEFUSF0KKyAgICAgICAgICAgICAgIFstLW5vcmVjdXJzaW9uXSBbLS1ybV0KKwkgICAgICAgWy0tZW5hYmxlLWJ1aWxkLXdhcm5pbmdzXQorICAgICAgICAgICAgICAgWy0tdGFyZ2V0PVRBUkdFVF0KKwkgICAgICAgWy0taG9zdD1IT1NUXQorCSAgICAgICBbSE9TVF0KKworWW91IG1heSBpbnRyb2R1Y2Ugb3B0aW9ucyB3aXRoIGEgc2luZ2xlIGAtJyByYXRoZXIgdGhhbiBgLS0nIGlmIHlvdQorcHJlZmVyOyBidXQgeW91IG1heSBhYmJyZXZpYXRlIG9wdGlvbiBuYW1lcyBpZiB5b3UgdXNlIGAtLScuCisKK2AtLWhlbHAnCisgICAgIERpc3BsYXkgYSBxdWljayBzdW1tYXJ5IG9mIGhvdyB0byBpbnZva2UgYGNvbmZpZ3VyZScuCisKK2AtcHJlZml4PURJUicKKyAgICAgQ29uZmlndXJlIHRoZSBzb3VyY2UgdG8gaW5zdGFsbCBwcm9ncmFtcyBhbmQgZmlsZXMgdW5kZXIgZGlyZWN0b3J5CisgICAgIGBESVInLgorCitgLS1zcmNkaXI9UEFUSCcKKyAgICAgKldhcm5pbmc6IHVzaW5nIHRoaXMgb3B0aW9uIHJlcXVpcmVzIEdOVSBgbWFrZScsIG9yIGFub3RoZXIgYG1ha2UnCisgICAgIHRoYXQgY29tcGF0aWJseSBpbXBsZW1lbnRzIHRoZSBgVlBBVEgnIGZlYXR1cmUuKgorICAgICBVc2UgdGhpcyBvcHRpb24gdG8gbWFrZSBjb25maWd1cmF0aW9ucyBpbiBkaXJlY3RvcmllcyBzZXBhcmF0ZQorICAgICBmcm9tIHRoZSBHREIgc291cmNlIGRpcmVjdG9yaWVzLiAgQW1vbmcgb3RoZXIgdGhpbmdzLCB5b3UgY2FuIHVzZQorICAgICB0aGlzIHRvIGJ1aWxkIChvciBtYWludGFpbikgc2V2ZXJhbCBjb25maWd1cmF0aW9ucyBzaW11bHRhbmVvdXNseSwKKyAgICAgaW4gc2VwYXJhdGUgZGlyZWN0b3JpZXMuICBgY29uZmlndXJlJyB3cml0ZXMgY29uZmlndXJhdGlvbgorICAgICBzcGVjaWZpYyBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIGJ1dCBhcnJhbmdlcyBmb3IgdGhlbSB0bworICAgICB1c2UgdGhlIHNvdXJjZSBpbiB0aGUgZGlyZWN0b3J5IFBBVEguICBgY29uZmlndXJlJyB3aWxsIGNyZWF0ZQorICAgICBkaXJlY3RvcmllcyB1bmRlciB0aGUgd29ya2luZyBkaXJlY3RvcnkgaW4gcGFyYWxsZWwgdG8gdGhlIHNvdXJjZQorICAgICBkaXJlY3RvcmllcyBiZWxvdyBQQVRILgorCitgLS1ub3JlY3Vyc2lvbicKKyAgICAgQ29uZmlndXJlIG9ubHkgdGhlIGRpcmVjdG9yeSBsZXZlbCB3aGVyZSBgY29uZmlndXJlJyBpcyBleGVjdXRlZDsKKyAgICAgZG8gbm90IHByb3BhZ2F0ZSBjb25maWd1cmF0aW9uIHRvIHN1YmRpcmVjdG9yaWVzLgorCitgLS1ybScKKyAgICAgUmVtb3ZlIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgdGhlIG90aGVyIGFyZ3VtZW50cyBzcGVjaWZ5LgorCitgLS1lbmFibGUtYnVpbGQtd2FybmluZ3MnCisgICAgIFdoZW4gYnVpbGRpbmcgdGhlIEdEQiBzb3VyY2VzLCBhc2sgdGhlIGNvbXBpbGVyIHRvIHdhcm4gYWJvdXQgYW55CisgICAgIGNvZGUgd2hpY2ggbG9va3MgZXZlbiB2YWd1ZWx5IHN1c3BpY2lvdXMuICBZb3Ugc2hvdWxkIG9ubHkgdXNpbmcKKyAgICAgdGhpcyBmZWF0dXJlIGlmIHlvdSdyZSBjb21waWxpbmcgd2l0aCBHTlUgQ0MuICBJdCBwYXNzZXMgdGhlCisgICAgIGZvbGxvd2luZyBmbGFnczoKKwktV2FsbAorCS1XcG9pbnRlci1hcml0aAorCS1Xc3RyaWN0LXByb3RvdHlwZXMKKwktV21pc3NpbmctcHJvdG90eXBlcworCS1XbWlzc2luZy1kZWNsYXJhdGlvbnMKKworYC0tdGFyZ2V0PVRBUkdFVCcKKyAgICAgQ29uZmlndXJlIEdEQiBmb3IgY3Jvc3MtZGVidWdnaW5nIHByb2dyYW1zIHJ1bm5pbmcgb24gdGhlIHNwZWNpZmllZAorICAgICBUQVJHRVQuICBXaXRob3V0IHRoaXMgb3B0aW9uLCBHREIgaXMgY29uZmlndXJlZCB0byBkZWJ1ZyBwcm9ncmFtcworICAgICB0aGF0IHJ1biBvbiB0aGUgc2FtZSBtYWNoaW5lIChIT1NUKSBhcyBHREIgaXRzZWxmLgorCisgICAgIFRoZXJlIGlzIG5vIGNvbnZlbmllbnQgd2F5IHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlCisgICAgIHRhcmdldHMuCisKK2AtLWhvc3Q9SE9TVCcKKyAgICAgQ29uZmlndXJlIEdEQiB0byBydW4gb24gdGhlIHNwZWNpZmllZCBIT1NULgorCisgICAgIFRoZXJlIGlzIG5vIGNvbnZlbmllbnQgd2F5IHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlCisgICAgIGhvc3RzLgorCitgSE9TVCAuLi4nCisgICAgIFNhbWUgYXMgYC0taG9zdD1IT1NUJy4gIElmIHlvdSBvbWl0IHRoaXMsIEdEQiB3aWxsIGd1ZXNzOyBpdCdzCisgICAgIHF1aXRlIGFjY3VyYXRlLgorCitgY29uZmlndXJlJyBhY2NlcHRzIG90aGVyIG9wdGlvbnMsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggY29uZmlndXJpbmcKK290aGVyIEdOVSB0b29scyByZWN1cnNpdmVseTsgYnV0IHRoZXNlIGFyZSB0aGUgb25seSBvcHRpb25zIHRoYXQgYWZmZWN0CitHREIgb3IgaXRzIHN1cHBvcnRpbmcgbGlicmFyaWVzLgorCisKK0xhbmd1YWdlcyBvdGhlciB0aGFuIEMKKz09PT09PT09PT09PT09PT09PT09PT09CisKK1NlZSB0aGUgR0RCIG1hbnVhbCAoZ2RiL2RvYy9nZGIudGV4aW5mbykgZm9yIGluZm9ybWF0aW9uIG9uIHRoaXMuCisKKworS2VybmVsIGRlYnVnZ2luZworPT09PT09PT09PT09PT09PT0KKworSSBoYXZlJ3QgZG9uZSB0aGlzIG15c2VsZiBzbyBJIGNhbid0IHJlYWxseSBvZmZlciBhbnkgYWR2aWNlLgorUmVtb3RlIGRlYnVnZ2luZyBvdmVyIHNlcmlhbCBsaW5lcyB3b3JrcyBmaW5lLCBidXQgdGhlIGtlcm5lbCBkZWJ1Z2dpbmcKK2NvZGUgaW4gaGVyZSBoYXMgbm90IGJlZW4gdGVzdGVkIGluIHllYXJzLiAgVmFuIEphY29ic29uIGhhcworYmV0dGVyIGtlcm5lbCBkZWJ1Z2dpbmcsIGJ1dCB0aGUgVUMgbGF3eWVycyB3b24ndCBsZXQgRlNGIGhhdmUgaXQuCisKKworUmVtb3RlIGRlYnVnZ2luZworPT09PT09PT09PT09PT09PT0KKworVGhlIGZpbGVzIG02OGstc3R1Yi5jLCBpMzg2LXN0dWIuYywgYW5kIHNwYXJjLXN0dWIuYyBhcmUgZXhhbXBsZXMgb2YKK3JlbW90ZSBzdHVicyB0byBiZSB1c2VkIHdpdGggcmVtb3RlLmMuICBUaGV5IGFyZSBkZXNpZ25lZCB0byBydW4KK3N0YW5kYWxvbmUgb24gYW4gbTY4aywgaTM4Niwgb3IgU1BBUkMgY3B1IGFuZCBjb21tdW5pY2F0ZSBwcm9wZXJseSB3aXRoCit0aGUgcmVtb3RlLmMgc3R1YiBvdmVyIGEgc2VyaWFsIGxpbmUuCisKK1RoZSBkaXJlY3RvcnkgZ2RiL2dkYnNlcnZlci8gY29udGFpbnMgYGdkYnNlcnZlcicsIGEgcHJvZ3JhbSB0aGF0CithbGxvd3MgcmVtb3RlIGRlYnVnZ2luZyBmb3IgVW5peCBhcHBsaWNhdGlvbnMuICBnZGJzZXJ2ZXIgaXMgb25seQorc3VwcG9ydGVkIGZvciBzb21lIG5hdGl2ZSBjb25maWd1cmF0aW9ucywgaW5jbHVkaW5nIFN1biAzLCBTdW4gNCwKK2FuZCBMaW51eC4KKworVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHJlbW90ZSBpbnRlcmZhY2VzIGZvciB0YWxraW5nIHRvIGV4aXN0aW5nIFJPTQorbW9uaXRvcnMgYW5kIG90aGVyIGhhcmR3YXJlOgorCisJcmVtb3RlLWFkYXB0LmMJIEFNRCAyOTAwMCAiQWRhcHQiCisJcmVtb3RlLWFycmF5LmMgICBBcnJheSBUZWNoIFJBSUQgY29udHJvbGxlcgorCXJlbW90ZS1idWcuYwkgTW90b3JvbGEgQlVHIG1vbml0b3IKKyAgICAgICAgcmVtb3RlLWQxMHYuYyAgICBHREIgcHJvdG9jb2wsIHRhbGtpbmcgdG8gYSBkMTB2IGNoaXAKKwlyZW1vdGUtZTcwMDAuYwkgSGl0YWNoaSBFNzAwMCBJQ0UKKwlyZW1vdGUtZWIuYwkgQU1EIDI5MDAwICJFQk1PTiIKKwlyZW1vdGUtZXMuYwkgRXJpY3Nzb24gMTgwMCBtb25pdG9yCisJcmVtb3RlLWVzdC5jCSBFU1QgZW11bGF0b3IKKwlyZW1vdGUtaG1zLmMJIEhpdGFjaGkgTWljcm8gU3lzdGVtcyBIOC8zMDAgbW9uaXRvcgorCXJlbW90ZS1taXBzLmMJIE1JUFMgcmVtb3RlIGRlYnVnZ2luZyBwcm90b2NvbAorCXJlbW90ZS1tbS5jCSBBTUQgMjkwMDAgIm1pbmltb24iCisJcmVtb3RlLW5pbmR5LmMgICBJbnRlbCA5NjAgIk5pbmR5IgorCXJlbW90ZS1ucm9tLmMJIE5ldFJPTSBST00gZW11bGF0b3IKKwlyZW1vdGUtb3M5ay5jCSBQQyBydW5uaW5nIE9TLzkwMDAKKwlyZW1vdGUtcmRpLmMJIEFSTSB3aXRoIEFuZ2VsIG1vbml0b3IKKwlyZW1vdGUtcmRwLmMJIEFSTSB3aXRoIERlbW9uIG1vbml0b3IKKwlyZW1vdGUtc2RzLmMJIFBvd2VyUEMgU0RTIG1vbml0b3IKKwlyZW1vdGUtc2ltLmMJIEdlbmVyYWxpemVkIHNpbXVsYXRvciBwcm90b2NvbAorCXJlbW90ZS1zdC5jCSBUYW5kZW0gU1QtMjAwMCBtb25pdG9yCisJcmVtb3RlLXVkaS5jCSBBTUQgMjkwMDAgdXNpbmcgdGhlIEFNRCAiVW5pdmVyc2FsIERlYnVnIEludGVyZmFjZSIKKwlyZW1vdGUtdnguYwkgVnhXb3JrcyByZWFsdGltZSBrZXJuZWwKKworUmVtb3RlLXZ4LmMgYW5kIHRoZSB2eC1zaGFyZSBzdWJkaXJlY3RvcnkgY29udGFpbiBhIHJlbW90ZSBpbnRlcmZhY2UgZm9yIHRoZQorVnhXb3JrcyByZWFsdGltZSBrZXJuZWwsIHdoaWNoIGNvbW11bmljYXRlcyBvdmVyIFRDUCB1c2luZyB0aGUgU3VuCitSUEMgbGlicmFyeS4gIFRoaXMgd291bGQgYmUgYSB1c2VmdWwgc3RhcnRpbmcgcG9pbnQgZm9yIG90aGVyIHJlbW90ZS0KK3ZpYS1ldGhlcm5ldCBiYWNrIGVuZHMuCisKK1JlbW90ZS11ZGkuYyBhbmQgdGhlIDI5ay1zaGFyZSBzdWJkaXJlY3RvcnkgY29udGFpbiBhIHJlbW90ZSBpbnRlcmZhY2UKK2ZvciBBTUQgMjkwMDAgcHJvZ3JhbXMsIHdoaWNoIHVzZXMgdGhlIEFNRCAiVW5pdmVyc2FsIERlYnVnIEludGVyZmFjZSIuCitUaGlzIGFsbG93cyBHREIgdG8gdGFsayB0byBzb2Z0d2FyZSBzaW11bGF0b3JzLCBlbXVsYXRvcnMsIGFuZC9vciBiYXJlCitoYXJkd2FyZSBib2FyZHMsIHZpYSBuZXR3b3JrIG9yIHNlcmlhbCBpbnRlcmZhY2VzLiAgTm90ZSB0aGF0IEdEQiBvbmx5Citwcm92aWRlcyBhbiBpbnRlcmZhY2UgdGhhdCBzcGVha3MgVURJLCBub3QgYSBjb21wbGV0ZSBzb2x1dGlvbi4gIFlvdQord2lsbCBuZWVkIHNvbWV0aGluZyBvbiB0aGUgb3RoZXIgZW5kIHRoYXQgYWxzbyBzcGVha3MgVURJLgorCisKK1JlcG9ydGluZyBCdWdzCis9PT09PT09PT09PT09PT0KKworVGhlIGNvcnJlY3QgYWRkcmVzcyBmb3IgcmVwb3J0aW5nIGJ1Z3MgZm91bmQgaW4gZ2RiIGlzCisiYnVnLWdkYkBnbnUub3JnIi4gIFBsZWFzZSBlbWFpbCBhbGwgYnVncywgYW5kIGFsbCByZXF1ZXN0cyBmb3IKK2hlbHAgd2l0aCBHREIsIHRvIHRoYXQgYWRkcmVzcy4gIFBsZWFzZSBpbmNsdWRlIHRoZSBHREIgdmVyc2lvbiBudW1iZXIKKyhlLmcuLCBnZGItNC4xOCksIGFuZCBob3cgeW91IGNvbmZpZ3VyZWQgaXQgKGUuZy4sICJzdW40IiBvciAibWFjaDM4NgoraG9zdCwgaTU4Ni1pbnRlbC1zeW5vcHN5cyB0YXJnZXQiKS4gIFNpbmNlIEdEQiBub3cgc3VwcG9ydHMgc28gbWFueQorZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zLCBpdCBpcyBpbXBvcnRhbnQgdGhhdCB5b3UgYmUgcHJlY2lzZSBhYm91dCB0aGlzLgorSWYgYXQgYWxsIHBvc3NpYmxlLCB5b3Ugc2hvdWxkIGluY2x1ZGUgdGhlIGFjdHVhbCBiYW5uZXIgdGhhdCBHREIgcHJpbnRzCit3aGVuIGl0IHN0YXJ0cyB1cCwgb3IgZmFpbGluZyB0aGF0LCB0aGUgYWN0dWFsIGNvbmZpZ3VyZSBjb21tYW5kIHRoYXQKK3lvdSB1c2VkIHdoZW4gY29uZmlndXJpbmcgR0RCLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cvd2hldGhlciB0byByZXBvcnQgYnVncywgc2VlIHRoZSBHREIgQnVncworc2VjdGlvbiBvZiB0aGUgR0RCIG1hbnVhbCAoZ2RiL2RvYy9nZGIudGV4aW5mbykuCisKK0tub3duIGJ1Z3M6CisKKyAgKiBVbmRlciBVbHRyaXggNC4yIChERUNzdGF0aW9uLTMxMDApIG9yIEFscGhhcyB1bmRlciBPU0YvMSwgd2UgaGF2ZQorICAgIHNlZW4gcHJvYmxlbXMgd2l0aCBiYWNrdHJhY2VzIGFmdGVyIGludGVycnVwdGluZyB0aGUgaW5mZXJpb3Igb3V0CisgICAgb2YgYSByZWFkKCkuICBUaGUgcHJvYmxlbSBpcyBjYXVzZWQgYnkgcHRyYWNlKCkgcmV0dXJuaW5nIGFuCisgICAgaW5jb3JyZWN0IHZhbHVlIGZvciB0aGUgZnJhbWUgcG9pbnRlciByZWdpc3RlciAocmVnaXN0ZXIgMTUgb3IKKyAgICAzMCkuICBBcyBmYXIgYXMgd2UgY2FuIHRlbGwsIHRoaXMgaXMgYSBrZXJuZWwgcHJvYmxlbS4gIEFueSBoZWxwCisgICAgd2l0aCB0aGlzIHdvdWxkIGJlIGdyZWF0bHkgYXBwcmVjaWF0ZWQuCisKKyAgKiBVbmRlciBVbHRyaXggNC40IChERUNzdGF0aW9uLTMxMDApLCBzZXR0aW5nIHRoZSBURVJNQ0FQIGVudmlyb25tZW50CisgICAgdmFyaWFibGUgdG8gYSBzdHJpbmcgd2l0aG91dCBhIHRyYWlsaW5nICc6JyBjYW4gY2F1c2UgR0RCIHRvIGR1bXAKKyAgICBjb3JlIHVwb24gc3RhcnR1cC4gIEFsdGhvdWdoIHRoZSBjb3JlIGZpbGUgbWFrZXMgaXQgbG9vayBhcyB0aG91Z2gKKyAgICBHREIgY29kZSBmYWlsZWQsIHRoZSBjcmFzaCBhY3R1YWxseSBvY2N1cnMgd2l0aGluIGEgY2FsbCB0byB0aGUKKyAgICB0ZXJtY2FwIGxpYnJhcnkgZnVuY3Rpb24gdGdldGVudCgpLiAgVGhlIHByb2JsZW0gY2FuIGJlIHNvbHZlZCBieQorICAgIHVzaW5nIHRoZSBHTlUgVGVybWNhcCBsaWJyYXJ5LgorCisgICAgQWxwaGFzIHJ1bm5pbmcgT1NGLzEgKHZlcnNpb25zIDEuMCB0aHJvdWdoIDIuMSkgaGF2ZSB0aGUgc2FtZSBidWdneQorICAgIHRlcm1jYXAgY29kZSwgYnV0IEdEQiBiZWhhdmVzIHN0cmFuZ2VseSByYXRoZXIgdGhhbiBjcmFzaGluZy4KKworICAqIE9uIERFQ3N0YXRpb25zIHRoZXJlIGFyZSB3YXJuaW5ncyBhYm91dCBzaGlmdCBjb3VudHMgb3V0IG9mIHJhbmdlIGluCisgICAgdmFyaW91cyBCRkQgbW9kdWxlcy4gIE5vbmUgb2YgdGhlbSBpcyBhIGNhdXNlIGZvciBhbGFybSwgdGhleSBhcmUgYWN0dWFsbHkKKyAgICBhIHJlc3VsdCBvZiBidWdzIGluIHRoZSBERUNzdGF0aW9uIGNvbXBpbGVyLgorCisgICogTm90ZXMgZm9yIHRoZSBERUMgQWxwaGEgdXNpbmcgT1NGLzE6CisgICAgVGhlIGRlYnVnZ2luZyBvdXRwdXQgb2YgbmF0aXZlIGNjIGhhcyB0d28ga25vd24gcHJvYmxlbXM7IHdlIHZpZXcgdGhlc2UKKyAgICBhcyBjb21waWxlciBidWdzLgorICAgIFRoZSBsaW5rZXIgbWlzY29tcGFjdHMgc3ltYm9sIHRhYmxlcywgd2hpY2ggY2F1c2VzIGdkYiB0byBjb25mdXNlIHRoZQorICAgIHR5cGUgb2YgdmFyaWFibGVzIG9yIHJlc3VsdHMgaW4gYHN0cnVjdCA8aWxsZWdhbD4nIHR5cGUgb3V0cHV0cy4KKyAgICBkYnggaGFzIHRoZSBzYW1lIHByb2JsZW1zIHdpdGggdGhvc2UgZXhlY3V0YWJsZXMuICBBIHdvcmthcm91bmQgaXMgdG8KKyAgICBzcGVjaWZ5IC1XbCwtYiB3aGVuIGxpbmtpbmcsIGJ1dCB0aGF0IHdpbGwgaW5jcmVhc2UgdGhlIGV4ZWN1dGFibGUgc2l6ZQorICAgIGNvbnNpZGVyYWJseS4KKyAgICBJZiBhIHN0cnVjdHVyZSBoYXMgaW5jb21wbGV0ZSB0eXBlIGluIG9uZSBmaWxlIChlLmcuLCAic3RydWN0IGZvbyAqIgorICAgIHdpdGhvdXQgYSBkZWZpbml0aW9uIGZvciAic3RydWN0IGZvbyIpLCBnZGIgd2lsbCBiZSB1bmFibGUgdG8gZmluZCB0aGUKKyAgICBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmcm9tIGFub3RoZXIgZmlsZS4KKyAgICBJdCBoYXMgYmVlbiByZXBvcnRlZCB0aGF0IHRoZSBVbHRyaXggNC4zQSBjb21waWxlciBvbiBkZWNzdGF0aW9ucyBoYXMgdGhlCisgICAgc2FtZSBwcm9ibGVtcy4KKworICAqIE5vdGVzIGZvciBTb2xhcmlzIDIueCwgdXNpbmcgdGhlIFNQQVJDd29ya3MgY2MgY29tcGlsZXI6CisgICAgWW91IGhhdmUgdG8gY29tcGlsZSB5b3VyIHByb2dyYW0gd2l0aCB0aGUgLXhzIG9wdGlvbiBvZiB0aGUgU1BBUkN3b3JrcworICAgIGNvbXBpbGVyIHRvIGJlIGFibGUgdG8gZGVidWcgeW91ciBwcm9ncmFtIHdpdGggZ2RiLgorICAgIFVuZGVyIFNvbGFyaXMgMi4zIHlvdSBhbHNvIG5lZWQgcGF0Y2ggMTAxNDA5LTAzIChKdW1ibyBsaW5rZXIgcGF0Y2gpLgorICAgIFVuZGVyIFNvbGFyaXMgMi4yLCBpZiB5b3UgaGF2ZSBwYXRjaCAxMDEwNTIgaW5zdGFsbGVkLCBtYWtlIHN1cmUKKyAgICB0aGF0IGl0IGlzIGF0IGxlYXN0IGF0IHJldmlzaW9uIDEwMTA1Mi0wNi4KKworICAqIFVuZGVyIElyaXggNSBmb3IgU0dJcywgeW91IG11c3QgaGF2ZSBpbnN0YWxsZWQgdGhlIGBjb21waWxlcl9kZXYuaGRyJworICAgIHN1YnN5c3RlbSB0aGF0IGlzIG9uIHRoZSBJRE8gQ0QsIG90aGVyd2lzZSB5b3Ugd2lsbCBnZXQgY29tcGxhaW50cworICAgIHRoYXQgY2VydGFpbiBmaWxlcyBzdWNoIGFzIGAvdXNyL2luY2x1ZGUvc3ltcy5oJyBjYW5ub3QgYmUgZm91bmQuCisKKyAgKiBOb3RlcyBmb3IgQlNELzM4NjoKKyAgICBUbyBjb21waWxlIGdkYi00LjE4IG9uIEJTRC8zODYsIHlvdSBtdXN0IHJ1biB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQKKyAgICBpdHMgc3Vic2NyaXB0cyB3aXRoIGJhc2guICBIZXJlIGlzIGFuIGVhc3kgd2F5IHRvIGRvIHRoaXM6CisKKwliYXNoIC1jICdDT05GSUdfU0hFTEw9L2Jpbi9iYXNoIC4vY29uZmlndXJlJworCisgICAgKGNvbmZpZ3VyZSB3aWxsIHJlcG9ydCBpMzg2LXVua25vd24tYnNkKS4gIFRoZW4sIGNvbXBpbGUgd2l0aCB0aGUKKyAgICBzdGFuZGFyZCAibWFrZSIgY29tbWFuZC4KKworR0RCIGNhbiBwcm9kdWNlIHdhcm5pbmdzIGFib3V0IHN5bWJvbHMgdGhhdCBpdCBkb2VzIG5vdCB1bmRlcnN0YW5kLiAgQnkKK2RlZmF1bHQsIHRoZXNlIHdhcm5pbmdzIGFyZSBkaXNhYmxlZC4gIFlvdSBjYW4gZW5hYmxlIHRoZW0gYnkgZXhlY3V0aW5nCitgc2V0IGNvbXBsYWludCAxMCcgKHdoaWNoIHlvdSBjYW4gcHV0IGluIHlvdXIgfi8uZ2RiaW5pdCBpZiB5b3UgbGlrZSkuCitJIHJlY29tbWVuZCBkb2luZyB0aGlzIGlmIHlvdSBhcmUgd29ya2luZyBvbiBhIGNvbXBpbGVyLCBhc3NlbWJsZXIsCitsaW5rZXIsIG9yIEdEQiwgc2luY2UgaXQgd2lsbCBwb2ludCBvdXQgcHJvYmxlbXMgdGhhdCB5b3UgbWF5IGJlIGFibGUKK3RvIGZpeC4gIFdhcm5pbmdzIHByb2R1Y2VkIGR1cmluZyBzeW1ib2wgcmVhZGluZyBpbmRpY2F0ZSBzb21lIG1pc21hdGNoCitiZXR3ZWVuIHRoZSBvYmplY3QgZmlsZSBhbmQgR0RCJ3Mgc3ltYm9sIHJlYWRpbmcgY29kZS4gIEluIG1hbnkgY2FzZXMsCitpdCdzIGEgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgc3BlY3MgZm9yIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQsIGFuZCB3aGF0Cit0aGUgY29tcGlsZXIgYWN0dWFsbHkgb3V0cHV0cyBvciB0aGUgZGVidWdnZXIgYWN0dWFsbHkgdW5kZXJzdGFuZHMuCisKKworWCBXaW5kb3dzIHZlcnN1cyBHREIKKz09PT09PT09PT09PT09PT09PT09PQorCitZb3Ugc2hvdWxkIGNoZWNrIG91dCBEREQsIHRoZSBEYXRhIERpc3BsYXkgRGVidWdnZXIuICBIZXJlJ3MgdGhlIGJsdXJiCitmcm9tIHRoZSBEREQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuY3MudHUtYnMuZGUvc29mdGVjaC9kZGQ6CisKKyAgICBUaGUgRGF0YSBEaXNwbGF5IERlYnVnZ2VyIChEREQpIGlzIGEgcG9wdWxhciBncmFwaGljYWwgdXNlcgorICAgIGludGVyZmFjZSBmb3IgY29tbWFuZC1saW5lIGRlYnVnZ2VycyBzdWNoIGFzIEdEQiwgREJYLCBKREIsIFdEQiwKKyAgICBYREIsIHRoZSBQZXJsIGRlYnVnZ2VyLCBhbmQgdGhlIFB5dGhvbiBkZWJ1Z2dlci4gIEJlc2lkZXMgYGB1c3VhbCcnCisgICAgZnJvbnQtZW5kIGZlYXR1cmVzIHN1Y2ggYXMgdmlld2luZyBzb3VyY2UgdGV4dHMsIERERCBoYXMgYmVjb21lCisgICAgZmFtb3VzIHRocm91Z2ggaXRzIGludGVyYWN0aXZlIGdyYXBoaWNhbCBkYXRhIGRpc3BsYXksIHdoZXJlIGRhdGEKKyAgICBzdHJ1Y3R1cmVzIGFyZSBkaXNwbGF5ZWQgYXMgZ3JhcGhzLiBBIHNpbXBsZSBtb3VzZSBjbGljaworICAgIGRlcmVmZXJlbmNlcyBwb2ludGVycyBvciB2aWV3cyBzdHJ1Y3R1cmUgY29udGVudHMsIHVwZGF0ZWQgZWFjaAorICAgIHRpbWUgdGhlIHByb2dyYW0gc3RvcHMuIFVzaW5nIERERCwgeW91IGNhbiByZWFzb24gYWJvdXQgeW91cgorICAgIGFwcGxpY2F0aW9uIGJ5IHdhdGNoaW5nIGl0cyBkYXRhLCBub3QganVzdCBieSB2aWV3aW5nIGl0IGV4ZWN1dGUKKyAgICBsaW5lcyBvZiBzb3VyY2UgY29kZS4KKworRW1hY3MgdXNlcnMgd2lsbCB2ZXJ5IGxpa2VseSBlbmpveSB0aGUgR3JhbmQgVW5pZmllZCBEZWJ1Z2dlciBtb2RlOwordHJ5IHR5cGluZyBgTS14IGdkYiBSRVQnLgorCitUaG9zZSBpbnRlcmVzdGVkIGluIGV4cGVyaW1lbnRpbmcgd2l0aCBhIG5ldyBraW5kIG9mIGdkYi1tb2RlCitzaG91bGQgbG9hZCBnZGIvZ2RiYS5lbCBpbnRvIEdOVSBFbWFjcyAxOS4yNSBvciBsYXRlci4gIENvbW1lbnRzCitvbiB0aGlzIG1vZGUgYXJlIGFsc28gd2VsY29tZS4KKworCitXcml0aW5nIENvZGUgZm9yIEdEQgorPT09PT09PT09PT09PT09PT09PT09CisKK1RoZXJlIGlzIGEgbG90IG9mIGluZm9ybWF0aW9uIGFib3V0IHdyaXRpbmcgY29kZSBmb3IgR0RCIGluIHRoZQoraW50ZXJuYWxzIG1hbnVhbCwgZGlzdHJpYnV0ZWQgd2l0aCBHREIgaW4gZ2RiL2RvYy9nZGJpbnQudGV4aW5mby4gIFlvdQorY2FuIHJlYWQgaXQgYnkgaGFuZCwgcHJpbnQgaXQgYnkgdXNpbmcgVGVYIGFuZCB0ZXhpbmZvLCBvciBwcm9jZXNzIGl0CitpbnRvIGFuIGBpbmZvJyBmaWxlIGZvciB1c2Ugd2l0aCBFbWFjcycgaW5mbyBtb2RlIG9yIHRoZSBzdGFuZGFsb25lCitgaW5mbycgcHJvZ3JhbS4KKworSWYgeW91IGFyZSBwb25kZXJpbmcgd3JpdGluZyBhbnl0aGluZyBidXQgYSBzaG9ydCBwYXRjaCwgZXNwZWNpYWxseQordGFrZSBub3RlIG9mIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBjb3B5cmlnaHRzIGluIHRoZSBub2RlIFN1Ym1pdHRpbmcKK1BhdGNoZXMuICBJdCBjYW4gdGFrZSBxdWl0ZSBhIHdoaWxlIHRvIGdldCBhbGwgdGhlIHBhcGVyd29yayBkb25lLCBzbword2UgZW5jb3VyYWdlIHlvdSB0byBzdGFydCB0aGF0IHByb2Nlc3MgYXMgc29vbiBhcyB5b3UgZGVjaWRlIHlvdSBhcmUKK3BsYW5uaW5nIHRvIHdvcmsgb24gc29tZXRoaW5nLCBvciBhdCBsZWFzdCB3ZWxsIGFoZWFkIG9mIHdoZW4geW91Cit0aGluayB5b3Ugd2lsbCBiZSByZWFkeSB0byBzdWJtaXQgdGhlIHBhdGNoZXMuCisKKworR0RCIFRlc3RzdWl0ZQorPT09PT09PT09PT09PQorCitUaGVyZSBpcyBhIERlamFHTlUgYmFzZWQgdGVzdHN1aXRlIGF2YWlsYWJsZSBmb3IgdGVzdGluZyB5b3VyIG5ld2x5CitidWlsdCBHREIsIG9yIGZvciByZWdyZXNzaW9uIHRlc3RpbmcgR0RCcyB3aXRoIGxvY2FsIG1vZGlmaWNhdGlvbnMuCisKK1J1bm5pbmcgdGhlIHRlc3RzdWl0ZSByZXF1aXJlcyB0aGUgcHJpb3IgaW5zdGFsbGF0aW9uIG9mIERlamFHTlUsCit3aGljaCBpcyBnZW5lcmFsbHkgYXZhaWxhYmxlIHZpYSBmdHA7IHlvdSdsbCBuZWVkIGEgcHJldHR5IHJlY2VudAorcmVsZWFzZS4gIE9uY2UgRGVqYUdOVSBpcyBpbnN0YWxsZWQsIHlvdSBjYW4gcnVuIHRoZSB0ZXN0cyBpbiBvbmUgb2YKK3R3byB3YXlzOgorCisgICgxKQljZCBnZGItNC4xOC9nZGIJCShhc3N1bWluZyB5b3UgYWxzbyB1bnBhY2tlZCBnZGIpCisJbWFrZSBjaGVjaworCitvcgorCisgICgyKQljZCBnZGItNC4xOC9nZGIvdGVzdHN1aXRlCisJbWFrZSBzaXRlLmV4cAkoYnVpbGRzIHRoZSBzaXRlIHNwZWNpZmljIGZpbGUpCisJcnVudGVzdCAtdG9vbCBnZGIgR0RCPS4uL2dkYiAgICAob3IgR0RCPTxzb21lcGF0aD4gYXMgYXBwcm9wcmlhdGUpCisKK1RoZSBzZWNvbmQgbWV0aG9kIGdpdmVzIHlvdSBzbGlnaHRseSBtb3JlIGNvbnRyb2wgaW4gY2FzZSBvZiBwcm9ibGVtcyB3aXRoCitidWlsZGluZyBvbmUgb3IgbW9yZSB0ZXN0IGV4ZWN1dGFibGVzIG9yIGlmIHlvdSBhcmUgdXNpbmcgdGhlIHRlc3RzdWl0ZQorJ3N0YW5kYWxvbmUnLCB3aXRob3V0IGl0IGJlaW5nIHBhcnQgb2YgdGhlIEdEQiBzb3VyY2UgdHJlZS4KKworU2VlIHRoZSBEZWphR05VIGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscy4KKworDAorKHRoaXMgaXMgZm9yIGVkaXRpbmcgdGhpcyBmaWxlIHdpdGggR05VIGVtYWNzKQorTG9jYWwgVmFyaWFibGVzOgorbW9kZTogdGV4dAorRW5kOgpkaWZmIC0tZ2l0IGEvZ2RiL1RPRE8gYi9nZGIvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2JjZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL1RPRE8KQEAgLTAsMCArMSw0NzEgQEAKK0lmIHlvdSBmaW5kIGluYWNjdXJhY2llcyBpbiB0aGlzIGxpc3QsIHBsZWFzZSBzZW5kIG1haWwgdG8KK2J1Zy1nZGJAcHJlcC5haS5taXQuZWR1LiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gd29yayBvbiBhbnkgb2YgdGhlc2UsCit5b3Ugc2hvdWxkIGNvbnNpZGVyIHNlbmRpbmcgbWFpbCB0byB0aGUgc2FtZSBhZGRyZXNzLCB0byBmaW5kIG91dAord2hldGhlciBhbnlvbmUgZWxzZSBpcyB3b3JraW5nIG9uIGl0LgorCitHZW5lcmFsIFRvIERvIExpc3QKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGxpc3QgaXMgcHJvYmFibHkgbm90IHVwIHRvIGRhdGUsIGFuZCBvcGluaW9ucyB2YXJ5IGFib3V0IHRoZQoraW1wb3J0YW5jZSBvciBldmVuIGRlc2lyYWJpbGl0eSBvZiBzb21lIG9mIHRoZSBpdGVtcy4KKworQWRkIGFuICJpbmZvIGJmZCIgY29tbWFuZCB0aGF0IGRpc3BsYXlzIHN1cHBvcnRlZCBvYmplY3QgZm9ybWF0cywKK3NpbWlsYXJseSB0byBvYmpkdW1wIC1pLgorCitTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCBuZWVkIG5ldmVyIGJlIGRlZmluZWQgdG8gMiwgc2luY2UgdGhhdAoraXMgaXRzIGRlZmF1bHQgdmFsdWUuICBDbGVhbiB0aGlzIHVwLgorCitJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gdXNlIHN5bWJvbHMgZnJvbSBzaGFyZWQgbGlicmFyaWVzIGJlZm9yZSB3ZSBrbm93CitleGFjdGx5IHdoZXJlIHRoZSBsaWJyYXJpZXMgd2lsbCBiZSBsb2FkZWQuICBFLmcuICJiIHBlcnJvciIgYmVmb3JlIHJ1bm5pbmcKK3RoZSBwcm9ncmFtLiAgVGhpcyBjb3VsZCBtYXliZSBiZSBkb25lIGFzIGFuIGV4dGVuc2lvbiBvZiB0aGUgImJyZWFrcG9pbnQKK3JlLWV2YWx1YXRpb24iIGFmdGVyIG5ldyBzeW1ib2xzIGFyZSBsb2FkZWQuCisKK01ha2Ugc2luZ2xlX3N0ZXAoKSBpbnNlcnQgYW5kIHJlbW92ZSBicmVha3BvaW50cyBpbiBvbmUgb3BlcmF0aW9uLgorCitTcGVlZCB1cCBzaW5nbGUgc3RlcHBpbmcgYnkgYXZvaWRpbmcgZXh0cmFuZW91cyBwdHJhY2UgY2FsbHMuCisKK1NwZWVkIHVwIHNpbmdsZSBzdGVwcGluZyBieSBub3QgaW5zZXJ0aW5nIGFuZCByZW1vdmluZyBicmVha3BvaW50cworZWFjaCB0aW1lIHRoZSBpbmZlcmlvciBzdGFydHMgYW5kIHN0b3BzLgorCitCcmVha3BvaW50cyBzaG91bGQgbm90IGJlIGluc2VydGVkIGFuZCBkZWxldGVkIGFsbCB0aGUgdGltZS4gIE9ubHkgdGhlCitvbmUocykgdGhlcmUgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB3ZSBoYXZlIHRvIHN0ZXAgb3ZlciBvbmUuICBTdXBwb3J0CiticmVha3BvaW50cyB0aGF0IGRvbid0IGhhdmUgdG8gYmUgcmVtb3ZlZCB0byBzdGVwIG92ZXIgdGhlbS4KKworVXBkYXRlIGdkYmludC50ZXhpbmZvIHRvIGluY2x1ZGUgZG9jIG9uIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGFuZCAKK3RoZSB2YXJpb3VzIHRyaWNrcyBvZiBidWlsZGluZyBnZGIuCisKK0RvIGEgdHV0b3JpYWwgaW4gZ2RiLnRleGluZm8gb24gaG93IHRvIGRvIHNpbXBsZSB0aGluZ3MgaW4gZ2RiLgorRS5nLiBob3cgdG8gc2V0IGEgYnJlYWtwb2ludCB0aGF0IGp1c3QgcHJpbnRzIHNvbWV0aGluZyBhbmQgY29udGludWVzLgorSG93IHRvIGJyZWFrIG9uIGFib3J0cy4gIEV0Yy4KKworUHJvdmlkZSAidm9vZG9vIiBkZWJ1Z2dpbmcgb2YgY29yZSBmaWxlcy4gIFRoaXMgY3JlYXRlcyBhIHpvbWJpZQorcHJvY2VzcyBhcyBhIGNoaWxkIG9mIHRoZSBkZWJ1Z2dlciwgYW5kIGxvYWRzIGl0IHVwIHdpdGggdGhlIGRhdGEsCitzdGFjaywgYW5kIHJlZ3Mgb2YgdGhlIGNvcmUgZmlsZS4gIFRoaXMgYWxsb3dzIHlvdSB0byBjYWxsIGZ1bmN0aW9ucworaW4gdGhlIGV4ZWN1dGFibGUsIHRvIG1hbmlwdWxhdGUgdGhlIGRhdGEgaW4gdGhlIGNvcmUgZmlsZS4KKworR0RCIHJlb3BlbnMgdGhlIHNvdXJjZSBmaWxlIG9uIGV2ZXJ5IGxpbmUsIGFzIHlvdSAibmV4dCIgdGhyb3VnaCBpdC4KKworUmVmZXJlbmNpbmcgdGhlIHZ0YmwgbWVtYmVyIG9mIGEgc3RydWN0IGRvZXNuJ3Qgd29yay4gIEl0IHByaW50cyBPSworaWYgeW91IHByaW50IHRoZSBzdHJ1Y3QsIGJ1dCBpdCBnZXRzIDAgaWYgeW91IHRyeSB0byBkZXJlZiBpdC4KKworUGVyc2lzdGVudCBjb21tYW5kIGhpc3Rvcnk6IEEgZmVhdHVyZSB3aGVyZSB5b3UgY291bGQgc2F2ZSBvZmYgYSBsaXN0CitvZiB0aGUgY29tbWFuZHMgeW91IGRpZCwgc28geW91IGNhbiBlZGl0IGl0IGludG8gc29tZXRoaW5nIHRoYXQgd2lsbCBicmluZwordGhlIHRhcmdldCB0byB0aGUgc2FtZSBwbGFjZSBldmVyeSB0aW1lIHlvdSBzb3VyY2UgaXQuCitUaGlzIHdvdWxkIGFsc28gYmUgdXNlZnVsIGZvciBhdXRvbWF0ZWQgZmFzdCB3YXRjaHBvaW50aW5nOyBpZiB5b3UgZ28KK3Bhc3QgdGhlIHBsYWNlIHdoZXJlIGl0IHdhdGNocG9pbnRzLCB5b3UganVzdCBzdGFydCBpdCBvdmVyIGFnYWluIGFuZAorZG8gaXQgbW9yZSBjYXJlZnVsbHkuCisKK0RlYWwgd2l0aCB0aGUgU3VuT1MgNC4wIGFuZCA0LjEuMSBwdHJhY2UgYnVnIHRoYXQgbG9zZXMgdGhlIHJlZ2lzdGVycyBpZgordGhlIHN0YWNrIGlzIHBhZ2VkIG91dC4KKworRmluaXNoIHRoZSBDKysgZXhjZXB0aW9uIGhhbmRsaW5nIHN0dWIgcm91dGluZXMuICBMaW50IHBvaW50cyB0aGVtIG91dAorYXMgdW51c2VkIHN0YXRpY3MgZnVuY3Rpb25zLgorCitQZXJoYXBzICJpIHNvdXJjZSIgc2hvdWxkIHRha2UgYW4gYXJndW1lbnQgbGlrZSB0aGF0IG9mICJsaXN0Ii4KKworU2VlIGlmIGNvcmUtYW91dC5jJ3MgZmV0Y2hfY29yZV9yZWdpc3RlcnMgY2FuIGJlIHVzZWQgb24gbW9yZSBtYWNoaW5lcy4KK0UuZy4gTUlQUyAobWlwcy14ZGVwLmMpLgorCit1bnBhY2tfZG91YmxlKCkgZG9lcyBub3QgaGFuZGxlIElFRUUgZmxvYXQgb24gdGhlIHRhcmdldCB1bmxlc3MgdGhlIGhvc3QKK2lzIGFsc28gSUVFRS4gIERlYXRoIG9uIGEgdmF4LgorCitTZXQgdXAgaW50ZXJmYWNlIGJldHdlZW4gR0RCIGFuZCBJTkZPIHNvIHRoYXQgeW91IGNhbiBob3AgaW50byBpbnRlcmFjdGl2ZQorSU5GTyBhbmQgYmFjayBvdXQgYWdhaW4uICBXaGVuIHJ1bm5pbmcgdW5kZXIgRW1hY3MsIHNob3VsZCB1c2UgRW1hY3MKK2luZm8sIGVsc2UgZm9yayB0aGUgaW5mbyBwcm9ncmFtLiAgSW5zdGFsbGF0aW9uIG9mIEdEQiBzaG91bGQgaW5zdGFsbAoraXRzIHRleGluZm8gZmlsZXMgaW50byB0aGUgaW5mbyB0cmVlIGF1dG9tYWdpY2FsbHksIGluY2x1ZGluZyB0aGUgcmVhZGxpbmUKK3RleGluZm8gZmlsZXMuCisKKyJoZWxwIGFkZHJlc3MiIG91Z2h0IHRvIGZpbmQgdGhlICJoZWxwIHNldCBwcmludCBhZGRyZXNzIiBlbnRyeS4KKworUmVtb3ZlIHRoZSBWVEJMIGludGVybmFsIGd1dHMgZnJvbSBwcmludG91dHMgb2YgQysrIHN0cnVjdHMsIHVubGVzcwordnRibHByaW50IGlzIHNldC4KKworUmVtb3ZlICJhdCAweG5ubm4iIGZyb20gdGhlICJiIGZvbyIgcmVzcG9uc2UsIGlmIGBwcmludCBhZGRyZXNzIG9mZicgYW5kIGlmCitpdCBtYXRjaGVzIHRoZSBzb3VyY2UgbGluZSBpbmRpY2F0ZWQuCisKK1RoZSBwcm9tcHQgYXQgZW5kIG9mIHNjcmVlbiBzaG91bGQgYWNjZXB0IHNwYWNlIGFzIHdlbGwgYXMgQ1IuCisKK0NoZWNrIFNUT1JFX1JFVFVSTl9WQUxVRSBvbiBhbGwgYXJjaGl0ZWN0dXJlcy4gIENoZWNrIG5lYXIgaXQgaW4gdG0tc3BhcmMuaAorZm9yIG90aGVyIGJvZ29zaXRpZXMuCisKK0NoZWNrIGZvciBzdG9yYWdlIGxlYWtzIGluIEdEQiwgSSdtIHN1cmUgdGhlcmUgYXJlIGEgbG90IQorCit2dGJscHJpbnQgb2YgYSB2dGJsIHNob3VsZCBkZW1hbmdsZSB0aGUgbmFtZXMgaXQncyBwcmludGluZy4KKworQmFja3RyYWNlIHNob3VsZCBwb2ludCBvdXQgd2hhdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGZyYW1lIGlzLCBpbgoraXRzIGRpc3BsYXksIHBlcmhhcHMgc2hvd2luZyAiQDMgZm9vIChiYXIsIC4uLikiIG9yICI+MyBmb28gKGJhciwKKy4uLikiIHJhdGhlciB0aGFuICIjMyBmb28gKGJhciwgLi4uKSIuCisKKyJpIHByb2dyYW0iIHNob3VsZCB3b3JrIGZvciBjb3JlIGZpbGVzLCBhbmQgZGlzcGxheSBtb3JlIGluZm8sIGxpa2Ugd2hhdAorYWN0dWFsbHkgY2F1c2VkIGl0IHRvIGRpZS4KKworIngvMTBpIiBzaG91bGQgc2hvcnRlbiB0aGUgbG9uZyBuYW1lLCBpZiBhbnksIG9uIHN1YnNlcXVlbnQgbGluZXMuCisKK0NoZWNrIHRocm91Z2ggdGhlIGNvZGUgZm9yIEZJWE1FIGNvbW1lbnRzIGFuZCBmaXggdGhlbS4gIGRieHJlYWQuYywKK2Jsb2NrZnJhbWUuYywgYW5kIHBsZW50eSBtb3JlLiAoSSBjb3VudCA2MzQgYXMgb2YgOTQwNjIxIC0gc3RzKQorCisibmV4dCIgb3ZlciBhIGZ1bmN0aW9uIHRoYXQgbG9uZ2p1bXBzLCBuZXZlciBzdG9wcyB1bnRpbCBuZXh0IHRpbWUgeW91IGhhcHBlbgordG8gZ2V0IHRvIHRoYXQgc3BvdCBieSBhY2NpZGVudC4gIEUuZy4gIm4iIG92ZXIgZXhlY3V0ZV9jb21tYW5kIHdoaWNoIGhhcworYW4gZXJyb3IuCisKKyJzZXQgemVyb3ByaW50IG9mZiIsIGRvbid0IGJvdGhlciBwcmludGluZyBtZW1iZXJzIG9mIHN0cnVjdHMgd2hpY2gKK2FyZSBlbnRpcmVseSB6ZXJvLiAgVXNlZnVsIGZvciB0aG9zZSBiaWcgc3RydWN0cyB3aXRoIGZldyB1c2VmdWwKK21lbWJlcnMuCisKK0dEQiBkb2VzIGZvdXIgaW9jdGwncyBmb3IgZXZlcnkgY29tbWFuZCwgcHJvYmFibHkgc3dpdGNoaW5nIHRlcm1pbmFsIG1vZGVzCit0by9mcm9tIGluZmVyaW9yIG9yIGZvciByZWFkbGluZSBvciBzb21ldGhpbmcuCisKK3Rlcm1pbmFsX291cnMgdmVyc3VzIHRlcm1pbmFsX2luZmVyaW9yOiBjYWNoZSBzdGF0ZS4gIFN3aXRjaCBzaG91bGQgYmUgYSBub29wCitpZiB0aGUgc3RhdGUgaXMgdGhlIHNhbWUsIHRvby4KKworcHR5cGUgJGk2ID0gdm9pZD8/IQorCitDbGVhbiB1cCBpbnZhbGlkX2Zsb2F0IGhhbmRsaW5nIHNvIGdkYiBkb2Vzbid0IGNvcmVkdW1wIHdoZW4gaXQgdHJpZXMgdG8KK2FjY2VzcyBhIE5hTi4gIFdoaWxlIHRoaXMgbWlnaHQgd29yayBvbiBTUEFSQywgb3RoZXIgbWFjaGluZXMgYXJlIG5vdAorY29uZmlndXJlZCByaWdodC4KKworImIgdmFsdWVfYXQgOyBjb21tYW5kcyA7IGNvbnRpbnVlIDsgZW5kIiBzdG9wcyBFVkVSWSBPVEhFUiBUSU1FIQorVGhlbiBvbmNlIHlvdSBlbnRlciBhIGNvbW1hbmQsIGl0IGRvZXMgdGhlIGNvbW1hbmQsIHJ1bnMgdHdvIG1vcmUKK3RpbWVzLCBhbmQgdGhlbiBzdG9wcyBhZ2FpbiEgIEJpemFycmUuLi4gIChUaGlzIGJlaGF2aW91ciBoYXMgYmVlbgorbW9kaWZpZWQsIGJ1dCBpdCBpcyBub3QgeWV0IDEwMCUgcHJlZGljdGFibGUgd2hlbiBlLmcuIHRoZSBjb21tYW5kcworY2FsbCBmdW5jdGlvbnMgaW4gdGhlIGNoaWxkLCBhbmQgd2hpbGUgdGhlcmUsIHRoZSBjaGlsZCBpcyBpbnRlcnJ1cHRlZAord2l0aCBhIHNpZ25hbCwgb3IgaGl0cyBhIGJyZWFrcG9pbnQuKQorCitoZWxwIGNvbXBsZXRpb24sIGhlbHAgaGlzdG9yeSBzaG91bGQgd29yay4KKworQ2hlY2sgdGhhdCB3ZSBjYW4gaGFuZGxlIHN0YWNrIHRyYWNlIHRocm91Z2ggdmFyYXJncyBBTkQgYWxsb2NhIGluIHNhbWUKK2Z1bmN0aW9uLCBvbiAyOUsuCisKK3dhaXRfZm9yX2luZmVyaW9yIGxvb3BzIGZvcmV2ZXIgaWYgd2FpdCgpIGdpdmVzIGl0IGFuIGVycm9yLgorCisiaSBmcmFtZSIgc2hvd3Mgd3JvbmcgImFyZ2xpc3QgYXQiIGxvY2F0aW9uLCBkb2Vzbid0IHNob3cgd2hlcmUgdGhlIGFyZ3MKK3Nob3VsZCBiZSBmb3VuZCwgb25seSB0aGVpciBhY3R1YWwgdmFsdWVzLgorCitUaGVyZSBzaG91bGQgYmUgYSB3YXkgZm9yICJzZXQiIGNvbW1hbmRzIHRvIHZhbGlkYXRlIHRoZSBuZXcgc2V0dGluZworYmVmb3JlIGl0IHRha2VzIGVmZmVjdC4KKworQSBtZXNzIG9mIGZsb2F0aW5nIHBvaW50IG9wY29kZXMgYXJlIG1pc3NpbmcgZnJvbSBzcGFyYy1vcGNvZGUuaC4KK0Fsc28sIGEgbGl0dGxlIHByb2dyYW0gc2hvdWxkIHRlc3QgdGhlIHRhYmxlIGZvciBiaXRzIHRoYXQgYXJlCitvdmVyc3BlY2lmaWVkIG9yIHVuZGVyc3BlY2lmaWVkLiAgRS5nLiBpZiB0aGUgbXVzdC1iZS1vbmVzIGJpdHMKK2FuZCB0aGUgbXVzdC1iZS16ZXJvZXMgYml0cyBsZWF2ZSBzb21lIGZpZWxkcyB1bmV4YW1pbmVkLCBhbmQgdGhlIGZvcm1hdAorc3RyaW5nIGxlYXZlcyB0aGVtIHVucHJpbnRlZCwgdGhlbiBwb2ludCB0aGlzIG91dC4gIElmIG11bHRpcGxlCitub24tYWxpYXMgcGF0dGVybnMgbWF0Y2gsIHBvaW50IHRoaXMgb3V0IHRvby4gIEZpbmFsbHksIHRoZXJlIHNob3VsZAorYmUgYSBzcGFyYy1vcHRlc3QucyBmaWxlIHRoYXQgdHJpZXMgZWFjaCBwYXR0ZXJuIG91dC4gIFRoaXMgZmlsZQorc2hvdWxkIGVuZCB1cCBjb21pbmcgYmFjayB0aGUgc2FtZSAobW9kdWxvIHRyYW5zZm9ybWF0aW9uIGNvbW1lbnRzKSAKK2lmIGZlZCB0byAiZ2FzIiB0aGVuIHRoZSAubyBpcyBmZWQgdG8gZ2RiIGZvciBkaXNhc3NlbWJseS4KKworRWxpbWluYXRlIGFsbCB0aGUgY29yZV9maWxlX2NvbW1hbmQncyBpbiBhbGwgdGhlIHhkZXAgZmlsZXMuCitFbGltaW5hdGUgc2VwYXJhdGUgZGVjbGFyYXRpb25zIG9mIHJlZ2lzdGVyc1tdIGV2ZXJ5d2hlcmUuCisKKyJlbmEgZCIgaXMgYW1iaWd1b3VzLCB3aHk/ICAiZW5hIGRlbGV0ZSIgc2VlbXMgdG8gdGhpbmsgaXQgaXMgYSBjb21tYW5kIQorCitQZXJoYXBzIG1vdmUgdGhlIHRkZXAsIHhkZXAsIGFuZCBuYXQgZmlsZXMsIGludG8gdGhlIGNvbmZpZworc3ViZGlyZWN0b3JpZXMuICBJZiBub3QsIGF0IGxlYXN0IHN0cmFpZ2h0ZW4gb3V0IHRoZWlyIG5hbWVzIHNvIHRoYXQKK3RoZXkgYWxsIHN0YXJ0IHdpdGggdGhlIG1hY2hpbmUgbmFtZS4KKworaW5mZXJpb3Jfc3RhdHVzIHNob3VsZCBpbmNsdWRlIHN0b3BfcHJpbnRfZnJhbWUuICBJdCB3b24ndCBuZWVkIHRvIGJlCityZXNldCBpbiB3YWl0X2Zvcl9pbmZlcmlvciBhZnRlciBicHN0YXRfc3RvcF9zdGF0dXMgY2FsbCwgdGhlbi4KKworaSBsaW5lIFZBUiBwcm9kdWNlcyAiTGluZSBudW1iZXIgbm90IGtub3duIGZvciBzeW1ib2wgYGB2YXInJy4iLiAgSQordGhvdWdodCB3ZSB3ZXJlIHN0YXNoaW5nIHRoYXQgaW5mbyBub3chCisKK1dlIHNob3VsZCBiZSBhYmxlIHRvIHdyaXRlIHRvIHJhbmRvbSBmaWxlcyBhdCBoZXggb2Zmc2V0cyBsaWtlIGFkYi4KKworTWFrZSAidGFyZ2V0IHh4eCIgY29tbWFuZCBpbnRlcnJ1cHRpYmxlLgorCitIYW5kbGUgYWRkX2ZpbGUgd2l0aCBzZXBhcmF0ZSB0ZXh0LCBkYXRhLCBhbmQgYnNzIGFkZHJlc3Nlcy4gIE1heWJlCitoYW5kbGUgc2VwYXJhdGUgYWRkcmVzc2VzIGZvciBlYWNoIHNlZ21lbnQgaW4gdGhlIG9iamVjdCBmaWxlPworCitIYW5kbGUgZnJlZV9uYW1lZF9zeW10YWIgdG8gY29wZSB3aXRoIG11bHRpcGx5LWxvYWRlZCBvYmplY3QgZmlsZXMKK2luIGEgZHluYW1pYyBsaW5raW5nIGVudmlyb25tZW50LiAgU2hvdWxkIHJlbWVtYmVyIHRoZSBsYXN0IGNvcHkgbG9hZGVkLAorYnV0IG5vdCBnZXQgdG9vIHNub3dlZCBpZiBpdCBmaW5kcyByZWZlcmVuY2VzIHRvIHRoZSBvbGRlciBjb3B5LgorCitHZW5lcmFsaXplIGFuZCBTdGFuZGFyZGl6ZSB0aGUgUlBDIGludGVyZmFjZSB0byBhIHRhcmdldCBwcm9ncmFtLAoraW1wcm92ZSBpdCBiZXlvbmQgdGhlICJwdHJhY2UiIGludGVyZmFjZSwgYW5kIHNlZSBpZiBpdCBjYW4gYmVjb21lIGEKK3N0YW5kYXJkIGZvciByZW1vdGUgZGVidWdnaW5nLiAgKFRoaXMgaXMgdGFsa2luZyBhYm91dCB0aGUgdnh3b3JrcworaW50ZXJmYWNlLiAgU2VlbXMgdW5saWtlbHkgdG8gbWUgdGhhdCB0aGVyZSB3aWxsIGJlICJhIHN0YW5kYXJkIiBmb3IKK3JlbW90ZSBkZWJ1Z2dpbmcgYW55dGltZSBzb29uIC0ta2luZ2RvbiwgOCBOb3YgMTk5NCkuCisKK1JlbW92ZSBhbGwgcmVmZXJlbmNlcyB0bzoKKwl0ZXh0X29mZnNldAorCWRhdGFfb2Zmc2V0CisJdGV4dF9kYXRhX3N0YXJ0CisJdGV4dF9lbmQKKwlleGVjX2RhdGFfb2Zmc2V0CisJLi4uCitub3cgdGhhdCB3ZSBoYXZlIEJGRC4gIEFsbCByZW1haW5pbmcgYXJlIGluIG1hY2hpbmUgZGVwZW5kZW50IGZpbGVzLgorCitXaGVuIHF1aXR0aW5nIHdpdGggYSBydW5uaW5nIHByb2dyYW0sIGlmIGEgY29yZSBmaWxlIHdhcyBwcmV2aW91c2x5CitleGFtaW5lZCwgeW91IGdldCAiQ291bGRuJ3QgcmVhZCBmbG9hdCByZWdzIGZyb20gY29yZSBmaWxlIi4uLmlmIAoraW5kZWVkIGl0IGNhbid0LiAgZ2VuZXJpY19tb3Vybl9pbmZlcmlvci4uLgorCitIYXZlIHJlbW90ZSB0YXJnZXRzIGdpdmUgYSB3YXJuaW5nIG9uIGEgc2lnbmFsIGFyZ3VtZW50IHRvCit0YXJnZXRfcmVzdW1lLiAgT3IgYmV0dGVyIHlldCwgZXh0ZW5kIHRoZSBwcm90b2NvbHMgc28gdGhhdCBpdCB3b3JrcworbGlrZSBpdCBkb2VzIG9uIHRoZSBVbml4LWxpa2Ugc3lzdGVtcy4KKworU29ydCBoZWxwIGFuZCBpbmZvIG91dHB1dC4KKworUmUtb3JnYW5pemUgaGVscCBjYXRlZ29yaWVzIGludG8gdGhpbmdzIHRoYXQgdGVuZCB0byBmaXQgb24gYSBzY3JlZW4KK2FuZCBoYW5nIHRvZ2V0aGVyLgorCityZW5vdGUtbmluZHkuYyBoYW5kbGVzIGludGVycnVwdHMgcG9vcmx5OyBpdCBlcnJvcigpcyBvdXQgb2YgYmFkbHkKK2Nob3NlbiBwbGFjZXMsIGUuZy4gbGVhdmluZyBjdXJyZW50X2ZyYW1lIHplcm8sIHdoaWNoIGNhdXNlcyBjb3JlIGR1bXBzCitvbiB0aGUgbmV4dCBjb21tYW5kLgorCitBZGQgaW4gY29tbWFuZHMgbGlrZSBBREIncyBmb3Igc2VhcmNoaW5nIGZvciBwYXR0ZXJucywgZXRjLiAgV2Ugc2hvdWxkCitiZSBhYmxlIHRvIGV4YW1pbmUgYW5kIHBhdGNoIHJhdyB1bnN5bWJvbGVkIGJpbmFyaWVzIGFzIHdlbGwgaW4gZ2RiIGFzCit3ZSBjYW4gaW4gYWRiLiAgKEUuZy4gaW5jcmVhc2UgdGhlIHRpbWVvdXQgaW4gL2Jpbi9sb2dpbiB3aXRob3V0IHNvdXJjZSkuCisKK1Rob3NlIHhkZXAgZmlsZXMgdGhhdCBjYWxsIHJlZ2lzdGVyX2FkZHIgd2l0aG91dCBkZWZpbmluZyBpdCBhcmUKK3Byb2JhYmx5IHNpbXBseSBicm9rZW4uICBXaGVuIHJlY29uZmlndXJpbmcgdGhpcyBwYXJ0IG9mIGdkYiwgSSBjb3VsZAorb25seSBtYWtlIGd1ZXNzZXMgYWJvdXQgaG93IHRvIHJlZG8gc29tZSBvZiB0aG9zZSBmaWxlcywgYW5kIEkKK3Byb2JhYmx5IGd1ZXNzZWQgd3JvbmcsIG9yIGxlZnQgdGhlbSAiZm9yIGxhdGVyIiB3aGVuIEkgaGF2ZSBhCittYWNoaW5lIHRoYXQgY2FuIGF0dGVtcHQgdG8gYnVpbGQgdGhlbS4KKworV2hlbiBkb2luZyAic3RlcCIgb3IgIm5leHQiLCBpZiBhIGZldyBsaW5lcyBvZiBzb3VyY2UgYXJlIHNraXBwZWQgYmV0d2VlbgordGhlIHByZXZpb3VzIGxpbmUgYW5kIHRoZSBjdXJyZW50IG9uZSwgcHJpbnQgdGhvc2UgbGluZXMsIG5vdCBqdXN0IHRoZQorbGFzdCBsaW5lIG9mIGEgbXVsdGlsaW5lIHN0YXRlbWVudC4KKworV2hlbiBzZWFyY2hpbmcgZm9yIEMrKyBzdXBlcmNsYXNzZXMgaW4gdmFsdWVfY2FzdCBpbiB2YWxvcHMuYywgd2UgbXVzdAorbm90IHNlYXJjaCB0aGUgImZpZWxkcyIsIG9ubHkgdGhlICJzdXBlcmNsYXNzZXMiLiAgVGhlcmUgbWlnaHQgYmUgYQorc3RydWN0IHdpdGggYSBmaWVsZCBuYW1lIHRoYXQgbWF0Y2hlcyB0aGUgc3VwZXJjbGFzcyBuYW1lLiAgVGhpcyBjYW4KK2hhcHBlbiB3aGVuIHRoZSBzdHJ1Y3Qgd2FzIGRlZmluZWQgYmVmb3JlIHRoZSBzdXBlcmNsYXNzIChiZWZvcmUgdGhlCituYW1lIGJlY2FtZSBhIHR5cGVkZWYpLgorCitIYW5kbGluZyBvZiAiJiIgYWRkcmVzcy1vZiBvcGVyYXRvciBuZWVkcyBzb21lIHNlcmlvdXMgb3ZlcmhhdWwKK2ZvciBBTlNJIEMgYW5kIGNvbnNpc3RlbmN5IG9uIGFycmF5cyBhbmQgZnVuY3Rpb25zLgorICBGb3IgImZsb2F0IHBvaW50WzE1XTsiOgorcHR5cGUgJnBvaW50WzRdICAgPT0+IEF0dGVtcHQgdG8gdGFrZSBhZGRyZXNzIG9mIG5vbi1sdmFsdWUuCisgIEZvciAiY2hhciAqbWFsbG9jKCk7IjoKK3B0eXBlIG1hbGxvYwkgID09PiAiY2hhciAqKCkiOyAgc2hvdWxkIGJlIHNhbWUgYXMKK3B0eXBlICZtYWxsb2MgICAgID09PiAiY2hhciAqKCopKCkiCitjYWxsIHByaW50ZiAoIiV4XG4iLCBtYWxsb2MpICAgPT0+IHdlaXJkIHZhbHVlLCBzaG91bGQgYmUgc2FtZSBhcworY2FsbCBwcmludGYgKCIleFxuIiwgJm1hbGxvYykgID09PiBjb3JyZWN0IHZhbHVlCisKK0ZpeCBkYnhyZWFkLmMgc3ltYm9sIHJlYWRpbmcgaW4gdGhlIHByZXNlbmNlIG9mIGludGVycnVwdHMuICBJdAorY3VycmVudGx5IGxlYXZlcyBhIGNsZWFudXAgdG8gYmxvdyBhd2F5IHRoZSBlbnRpcmUgc3ltYm9sIHRhYmxlIHdoZW4gYQorUVVJVCBvY2N1cnMuICAoV2hhdCdzIHdyb25nIHdpdGggdGhhdD8gLWtpbmdkb24sIDI4IE9jdCAxOTkzKS4KKworTWlwc3JlYWQuYyByZWFkcyBpbmNsdWRlIGZpbGVzIGRlcHRoLWZpcnN0LCBiZWNhdXNlIHRoZSBkZXBlbmRlbmNpZXMKK2luIHRoZSBwc3ltdGFicyBhcmUgd2F5IHRvbyBpbmNsdXNpdmUgKGl0IHNlZW1zIHRvIG1lKS4gIEZpZ3VyZSBvdXQgd2hhdAorcmVhbGx5IGRlcGVuZHMgb24gd2hhdCwgdG8gYXZvaWQgcmVjdXJzaW5nIDIwIG9yIDMwIHRpbWVzIHdoaWxlIHJlYWRpbmcKK3JlYWwgc3ltdGFicy4KKwordmFsdWVfYWRkKCkgc2hvdWxkIGJlIHN1YnRyYWN0aW5nIHRoZSBsb3dlciBib3VuZCBvZiBhcnJheXMsIGlmIGtub3duLAorYW5kIHBvc3NpYmx5IGNoZWNraW5nIGFnYWluc3QgdGhlIHVwcGVyIGJvdW5kIGZvciBlcnJvciByZXBvcnRpbmcuCisKK21pcHNyZWFkLmMgc3ltYm9sIHRhYmxlIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiBzaG91bGQgYmUgY2hlY2tlZC4KK015IHN1c3BpY2lvbiBpcyB0aGF0IGl0J3MgZnVsbCBvZiBtZW1vcnkgbGVha3MuCisKK1N1bk9TIHNob3VsZCBoYXZlIGEgdGFyZ2V0X2xvb2t1cF9zeW1ib2woKSBmb3IgY29tbW9uJ2QgdGhpbmdzIGFsbG9jYXRlZAorYnkgdGhlIHNoYXJlZCBsaWJyYXJ5IGxpbmtlciBsZC5zby4KKworV2hlbiBsaXN0aW5nIHNvdXJjZSBsaW5lcywgY2hlY2sgZm9yIGEgcHJlY2VkaW5nIFxuLCB0byB2ZXJpZnkgdGhhdAordGhlIGZpbGUgaGFzbid0IGNoYW5nZWQgb3V0IGZyb20gdW5kZXIgdXMuCisKK1doZW4gbGlzdGluZyBzb3VyY2UgbGluZXMsIGVhdCBsZWFkaW5nIHdoaXRlc3BhY2UgY29ycmVzcG9uZGluZyB0byB0aGUKK2xpbmUtbnVtYmVyIHByZWZpeCB3ZSBwcmludC4gIFRoaXMgYXZvaWRzIGxvbmcgbGluZXMgd3JhcHBpbmcuCisKK21pcHNyZWFkLmMgbmVlZHMgdG8gY2hlY2sgZm9yIG9sZCBzeW10YWJzIGFuZCBwc3ltdGFicyBmb3IgdGhlIHNhbWUKK2ZpbGVzLCB0aGUgd2F5IGl0IGhhcHBlbnMgZm9yIGRieHJlYWQuYyBhbmQgY29mZnJlYWQuYywgZm9yIFZ4V29ya3MKK2luY3JlbWVudGFsIHN5bWJvbCB0YWJsZSByZWxvYWRpbmcuCisKK0dldCBhbGwgdGhlIHJlbW90ZSBzeXN0ZW1zICh3aGVyZSB0aGUgcHJvdG9jb2wgYWxsb3dzIGl0KSB0byBiZSBhYmxlIHRvCitzdG9wIHRoZSByZW1vdGUgc3lzdGVtIHdoZW4gdGhlIEdEQiB1c2VyIHR5cGVzIF5DIChsaWtlIHJlbW90ZS5jCitkb2VzKS4gIEZvciBlYm1vbiwgdXNlIF5Bay4KKworUG9zc2libGUgZmVhdHVyZTogQSB2ZXJzaW9uIG9mIHRoZSAiZGlzYXNzZW1ibGUiIGNvbW1hbmQgd2hpY2ggc2hvd3MKK2JvdGggc291cmNlIGFuZCBhc3NlbWJseSBjb2RlICgic2V0IHN5bWJvbC1maWxlbmFtZSBvbiIgaXMgYSBwYXJ0aWFsCitzb2x1dGlvbikuCisKK2ludmVzdGlnYXRlICJ4L3MgMCIgKHJpZ2h0IG5vdyBzdG9wcyBlYXJseSkgKEkgdGhpbmsgbWF5YmUgR0RCIGlzCit1c2luZyBhIDAgYWRkcmVzcyBmb3IgYmFkIHB1cnBvc2VzIGludGVybmFsbHkpLgorCitNYWtlICJpbmZvIHBhdGgiIGFuZCBwYXRoX2NvbW1hbmQgd29yayBhZ2FpbiAoYnV0IGluZGVwZW5kZW50IG9mIHRoZQorZW52aXJvbm1lbnQgZWl0aGVyIG9mIGdkYiBvciB0aGF0IHdlJ2xsIHBhc3MgdG8gdGhlIGluZmVyaW9yKS4KKworTWFrZSBHREIgdW5kZXJzdGFuZCB0aGUgR0NDIGZlYXR1cmUgZm9yIHB1dHRpbmcgb2N0YWwgY29uc3RhbnRzIGluCitlbnVtcy4gIE1ha2UgaXQgc28gb3ZlcmZsb3cgb24gYW4gZW51bSBjb25zdGFudCBkb2VzIG5vdCBlcnJvcl90eXBlCit0aGUgd2hvbGUgdHlwZS4gIEFsbG93IGFyYml0cmFyaWx5IGxhcmdlIGVudW1zIHdpdGggdHlwZSBhdHRyaWJ1dGVzLgorUHV0IGFsbCB0aGlzIHN0dWZmIGluIHRoZSB0ZXN0c3VpdGUuCisKK01ha2UgVFlQRV9DT0RFX0VSUk9SIHdpdGggYSBub24temVybyBUWVBFX0xFTkdUSCBtb3JlIHVzZWZ1bCAocHJpbnQKK3RoZSB2YWx1ZSBpbiBoZXg7IHByb2Nlc3MgdHlwZSBhdHRyaWJ1dGVzKS4gIEFkZCB0aGlzIHRvIHRoZQordGVzdHN1aXRlLiAgVGhpcyB3YXkgZnV0dXJlIGNvbXBpbGVycyBjYW4gYWRkIG5ldyB0eXBlcyBhbmQgb2xkCit2ZXJzaW9ucyBvZiBHREIgY2FuIGRvIHNvbWV0aGluZyBoYWxmd2F5IHJlYXNvbmFibGUuCisKK0NsZWFuIHVwIGZvcm1hdHRpbmcgb2YgImluZm8gcmVnaXN0ZXJzIiBvbiBNSVBTIGFuZCA4OGsuICBTZWUgaWYgaXQKK2lzIHBvc3NpYmxlIHRvIGRvIHRoaXMgZ2VuZXJpY2FsbHkgYWNyb3NzIGFsbCB0YXJnZXQgYXJjaGl0ZWN0dXJlcy4KKworR0RCIGdldHMgYmZkL2NvcmVmaWxlLmMgYW5kIGdkYi9jb3JlZmlsZS5jIGNvbmZ1c2VkICh0aGlzIHNob3VsZCBiZSBlYXN5IHRvCityZXBlYXQgZXZlbiB3aXRoIHNvbWV0aGluZyBtb3JlIHJlY2VudCB0aGFuIEdEQiA0LjkpLgorCitDaGVjayB0aGF0IHVubWF0Y2hlZCBSQlJBQyBkb2Vzbid0IGFib3J0KCkuCisKK0ZpeCBtZGVidWdyZWFkLmM6cGFyc2VfdHlwZSB0byBkbyBmdW5kYW1lbnRhbCB0eXBlcyByaWdodCAoc2VlCityczYwMDBfYnVpbHRpbl90eXBlIGluIHN0YWJzcmVhZC5jIGZvciB3aGF0ICJyaWdodCIgaXMtLXRoZSBwb2ludCBpcwordGhhdCB0aGUgZGVidWcgZm9ybWF0IGZpeGVzIHRoZSBzaXplcyBvZiB0aGVzZSB0aGluZ3MgYW5kIGl0IHNob3VsZG4ndAorZGVwZW5kIG9uIHN0dWZmIGxpa2UgVEFSR0VUX1BUUl9CSVQgYW5kIHNvIG9uLiAgRm9yIG1kZWJ1ZywgdGhlcmUgc2VlbQordG8gYmUgc2VwYXJhdGUgYnQqIGNvZGVzIGZvciA2NCBiaXQgYW5kIDMyIGJpdCB0aGluZ3MsIGFuZCBHREIgc2hvdWxkCitiZSBhd2FyZSBvZiB0aGF0KS4gIEFsc28gdXNlIGEgc3dpdGNoIHN0YXRlbWVudCBmb3IgY2xhcml0eSBhbmQgc3BlZWQuCisKK0ludmVzdGlnYXRlIGFkZGluZyBzeW1ib2xzIGluIHRhcmdldF9sb2FkLS1zb21lIHRhcmdldHMgZG8sIHNvbWUKK2Rvbid0LgorCitQdXQgZGlybmFtZSBpbiBwc3ltdGFicyBhbmQgY2hhbmdlIGxvb2t1cCpzeW10YWIgdG8gdXNlIGRpcm5hbWUgKHNvCisvZm9vL2Jhci5jIHdvcmtzIHdoZXRoZXIgY29tcGlsZWQgYnkgY2MgL2Zvby9iYXIuYywgb3IgY2QgL2ZvbzsgY2MKK2Jhci5jKS4KKworTWVyZ2UgeGNvZmZyZWFkLmMgYW5kIGNvZmZyZWFkLmMuICBVc2UgYnJlYWtwb2ludF9yZV9zZXQgaW5zdGVhZCBvZgorZml4dXBfYnJlYWtwb2ludHMuCisKK0ZpeCBieXRlIG9yZGVyIGFuZCBpbnQgc2l6ZSBzaW5zIGluIHRtLWEyOWsuaAorKEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKS4gIFBlcmhhcHMgc2hvdWxkIHJlcHJvZHVjZSBidWcgYW5kIHZlcmlmeSBmaXgKKyhvciBwZXJoYXBzIHNob3VsZCBqdXN0IGZpeCBpdC4uLikuCisKK01ha2UgYSB3YXRjaHBvaW50IG9uIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBhbiBlcnJvciAob3Igd2FybmluZworcGVyaGFwcykKKworTWFrZSBhIHdhdGNocG9pbnQgd2hpY2ggY29udGFpbnMgYSBmdW5jdGlvbiBjYWxsIGFuIGVycm9yIChpdCBpcworYnJva2VuIG5vdywgbWFraW5nIGl0IHdvcmsgaXMgcHJvYmFibHkgbm90IHdvcnRoIHRoZSBlZmZvcnQpLgorCitSZS1kbyBjYWxscyB0byBzaWduYWwoKSBpbiByZW1vdGUuYywgYW5kIGluZmxvdy5jIChzZXRfc2lnaW50X3RyYXAgYW5kCitzbyBvbikgdG8gYmUgaW5kZXBlbmRlbnQgb2YgdGhlIGRlYnVnZ2luZyB0YXJnZXQsIHVzaW5nIHRhcmdldF9zdG9wIHRvCitzdG9wIHRoZSBpbmZlcmlvci4gIFByb2JhYmx5IHRoZSBwYXJ0IHdoaWNoIGlzIG5vdyBoYW5kbGVkIGJ5CitpbnRlcnJ1cHRfcXVlcnkgaW4gcmVtb3RlLmMgY2FuIGJlIGRvbmUgd2l0aG91dCBhbnkgbmV3IGZlYXR1cmVzIGluCit0aGUgZGVidWdnaW5nIHRhcmdldC4KKworTmV3IHRlc3QgY2FzZSBiYXNlZCBvbiB3ZWlyZC5leHAgYnV0IGluIHdoaWNoIHR5cGUgbnVtYmVycyBhcmUgbm90CityZW51bWJlcmVkICh0aHVzIG11bHRpcGx5IGRlZmluaW5nIGEgdHlwZSkuICBUaGlzIGN1cnJlbnRseSBjYXVzZXMgYW4KK2luZmluaXRlIGxvb3Agb24gInAgdl9jb21iIi4KKworTnVrZSBiYXNlY2xhc3NfYWRkci4KKworTnVrZSBVU0cgZGVmaW5lLgorCisic291cmNlIGZpbGUgbW9yZSByZWNlbnQiIGxvc2VzIG9uIHJlLXJlYWQKKworRml4IDM4NiBmbG9hdGluZyBwb2ludCBzbyB0aGF0IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBhcmUgcmVhbAorcmVnaXN0ZXJzIChidXQgY29kZSBjYW4gZGVhbCBhdCBydW4tdGltZSBpZiB0aGV5IGFyZSBtaXNzaW5nLCBsaWtlCittaXBzIGFuZCA2OGspLiAgVGhpcyB3b3VsZCBjbGVhbiB1cCAiaW5mbyBmbG9hdCIgYW5kIHJlbGF0ZWQgc3R1ZmYuCisKK0xvb2sgYXQgU29sYXJpcyBidWcgaW4gaW50ZXJydXB0LmV4cC4gIENhbiBnZXQgb3V0IG9mIHN5c2NhbGwgd2l0aAorUFJTQUJPUlQgKHN5c2NhbGwgd2lsbCByZXR1cm4gRUlOVFIpIGJ1dCBtZXJlbHkgZG9pbmcgdGhhdCBsZWFkcyB0byBhCisiY2FuJ3QgcmVhZCBtZW1vcnkiIGVycm9yLgorCitnY2MgLWcgLWMgZW51bW1hc2suYyB0aGVuIGdkYiBlbnVtbWFzay5vLCB0aGVuICJwIHYiLiAgR0RCIGNvbXBsYWlucworYWJvdXQgbm90IGJlaW5nIGFibGUgdG8gYWNjZXNzIG1lbW9yeSBsb2NhdGlvbiAwLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLSBlbnVtbWFzay5jCitlbnVtIG1hc2sKK3sKKyAgQU5JTUFMID0gMCwKKyAgVkVHRVRBQkxFID0gMSwKKyAgTUlORVJBTCA9IDIsCisgIEJBU0lDX0NBVEVHT1JZID0gMywKKworICBXSElURSA9IDAsCisgIEJMVUUgPSA0LAorICBHUkVFTiA9IDgsCisgIEJMQUNLID0gMHhjLAorICBDT0xPUiA9IDB4YywKKworICBBTElWRSA9IDB4MTAsCisKKyAgTEFSR0UgPSAweDIwCit9IHY7CisKK0lmIHRyeSB0byBtb2RpZnkgdmFsdWUgaW4gZmlsZSB3aXRoICJzZXQgd3JpdGUgb2ZmIiBzaG91bGQgZ2l2ZQorYXBwcm9wcmlhdGUgZXJyb3Igbm90ICJjYW5ub3QgYWNjZXNzIG1lbW9yeSBhdCBhZGRyZXNzIDB4NjVlMCIuCisKK1doeSBkbyB3ZSBhbGxvdyBhIHRhcmdldCB0byBvbWl0IHN0YW5kYXJkIHJlZ2lzdGVyIG5hbWVzIChOT19TVERfUkVHUworaW4gdG0tejhrLmgpPyAgSSB0aG91Z2h0IHRoZSBzdGFuZGFyZCByZWdpc3RlciBuYW1lcyB3ZXJlIHN1cHBvc2VkIHRvCitiZSBqdXN0IHRoYXQsIHN0YW5kYXJkLgorCitNYWtlIERFQlVHX0VYUFJFU1NJT05TIGEgbWFpbnRlbmFuY2UgY29tbWFuZCwgZGVwZW5kZW50IG9uCitNQUlOVEVOQU5DRV9DT01NQU5EUy4KKworQWxsb3cgY29yZSBmaWxlIHdpdGhvdXQgZXhlYyBmaWxlIG9uIFJTLzYwMDAuCisKK01ha2Ugc3VyZSAic2hlbGwiIHdpdGggbm8gYXJndW1lbnRzIHdvcmtzIHJpZ2h0IG9uIERPUy4KKworTWFrZSBnZGIuaW5pIChhcyB3ZWxsIGFzIC5nZGJpbml0KSBiZSBjaGVja2VkIG9uIGFsbCBwbGF0Zm9ybXMsIHNvCit0aGUgc2FtZSBkaXJlY3RvcnkgY2FuIGJlIE5GUy1tb3VudGVkIG9uIHVuaXggb3IgRE9TLCBhbmQgd29yayB0aGUKK3NhbWUgd2F5LgorCitjZCB+L3RtcC88TS0/PiBjYXVzZXMgaW5maW5pdGUgbG9vcCAod2hlcmUgfi90bXAgaXMgYSBkaXJlY3RvcnkpLgorCitHZXQgU0VDVF9PRkZfVEVYVCBzdHVmZiBvdXQgb2Ygb2JqZmlsZV9yZWxvY2F0ZSAobWlnaHQgYmUgbmVlZGVkIHRvCitnZXQgUlMvNjAwMCB0byB3b3JrIHJpZ2h0LCBtaWdodCBub3QgYmUgaW1tZWRpYXRlbHkgcmVsZXZhbnQpLgorCitDbGVhbiB1cCBhZGRfdG9jX3RvX2xvYWRpbmZvCisKK1RoaW5rIGFib3V0IGF0dGFjaGVkIHByb2Nlc3NlcyBhbmQgc2hhcmluZyB0ZXJtaW5hbC4KKworSm9obiBzZXogaW4gcmVmZXJlbmNlIHRvIGlnbm9yaW5nIGVycm9ycyBmcm9tIHRjc2VncGdycCBpZiBhdHRhY2hfZmxhZzoKK3NldF90dHlfc3RhdGUgc2hvdWxkIG5vdCBoYXZlIGFueSB0cm91YmxlIHdpdGggYXR0YWNoZWQgcHJvY2Vzc2VzLgorSW5zdGVhZCwgdGhlIHR0eSBoYW5kbGluZyBzaG91bGQgbGVhdmUgdGhlIHBncnAgb2YgdGhlIHR0eSBhbG9uZSB3aGVuCithdHRhY2hpbmcgdG8gcHJvY2Vzc2VzIChwZXJoYXBzIHBhc3MgdGVybWluYWxfaW5pdF9pbmZlcmlvciBhIGZsYWcKK3NheWluZyB3aGV0aGVyIHdlJ3JlIGF0dGFjaGluZykuCisKK1BBR0VfU0laRSByZWRlZmluZWQgd2FybmluZ3Mgb24gQUlYLiAgUHJvYmFibHkgc2hvdWxkIGJlIHVzaW5nCitCRkRfUEFHRV9TSVpFIHRocm91Z2hvdXQgQkZELgorCitSZXdyaXRlIHByb2NlZWQsIHdhaXRfZm9yX2luZmVyaW9yLCBhbmQgbm9ybWFsX3N0b3AgdG8gY2xlYW4gdGhlbSB1cC4KK1N1Z2dlc3Rpb25zOiAKKworCTEpIE1ha2UgZWFjaCB0ZXN0IGluIHdhaXRfZm9yX2luZmVyaW9yIGEgc2VwZXJhdGUgc3Vicm91dGluZQorCSAgIGNhbGwuCisJMikgQ29tYmluZSB3YWl0X2Zvcl9pbmZlcmlvciBhbmQgbm9ybWFsX3N0b3AgdG8gY2xlYW4gdXAKKwkgICBjb21tdW5pY2F0aW9uIHZpYSBnbG9iYWwgdmFyaWFibGVzLgorCTMpIFNlZSBpZiB5b3UgY2FuIGZpbmQgc29tZSB3YXkgdG8gY2xlYW4gdXAgdGhlIGdsb2JhbAorCSAgIHZhcmlhYmxlcyB0aGF0IGFyZSB1c2VkOyBwb3NzaWJseSBncm91cCB0aGVtIGJ5IGRhdGEgZmxvdworCSAgIGFuZCBpbmZvcm1hdGlvbiBjb250ZW50PworCitXb3JrIG91dCBzb21lIGtpbmQgb2Ygd2F5IHRvIGFsbG93IHJ1bm5pbmcgdGhlIGluZmVyaW9yIHRvIGJlIGRvbmUgYXMKK2Egc3ViLWV4ZWN1dGlvbiBvZiwgZWcuIGJyZWFrcG9pbnQgY29tbWFuZCBsaXN0cy4gIEN1cnJlbnRseSBydW5uaW5nCit0aGUgaW5mZXJpb3IgaW50ZXJ1cHRzIGFueSBjb21tYW5kIGxpc3QgZXhlY3V0aW9uLiAgVGhpcyB3b3VsZCByZXF1aXJlCitzb21lIHJld3JpdGluZyBvZiB3YWl0X2Zvcl9pbmZlcmlvciAmIGZyaWVuZHMsIGFuZCBoZW5jZSBzaG91bGQKK3Byb2JhYmx5IGJlIGRvbmUgaW4gY29uY2VydCB3aXRoIHRoZSBhYm92ZS4KKworQWRkIGZ1bmN0aW9uIGFyZ3VtZW50cyB0byBnZGIgdXNlciBkZWZpbmVkIGZ1bmN0aW9ucy4KKworQWRkIGNvbnZlbmllbmNlIHZhcmlhYmxlcyB0aGF0IHJlZmVyIHRvIGV4ZWMgZmlsZSwgc3ltYm9sIGZpbGUsCitzZWxlY3RlZCBmcmFtZSBzb3VyY2UgZmlsZSwgc2VsZWN0ZWQgZnJhbWUgZnVuY3Rpb24sIHNlbGVjdGVkIGZyYW1lCitsaW5lIG51bWJlciwgZXRjLgorCitBZGQgYSAic3VzcGVuZCIgc3ViY29tbWFuZCBvZiB0aGUgImNvbnRpbnVlIiBjb21tYW5kIHRvIHN1c3BlbmQgZ2RiCit3aGlsZSBjb250aW51aW5nICBleGVjdXRpb24gb2YgdGhlIHN1YnByb2Nlc3MuICBVc2VmdWwgd2hlbiB5b3UgYXJlCitkZWJ1Z2dpbmcgc2VydmVycyBhbmQgeW91IHdhbnQgdG8gZG9kZ2Ugb3V0IGFuZCBpbml0aWF0ZSBhIGNvbm5lY3Rpb24KK3RvIGEgc2VydmVyIHJ1bm5pbmcgdW5kZXIgZ2RiLgorCitBZGQgc3RhYiBpbmZvcm1hdGlvbiB0byBhbGxvdyByZWFzb25hYmxlIGRlYnVnZ2luZyBvZiBpbmxpbmUgZnVuY3Rpb25zCisocG9zc2libHkgdGhleSBzaG91bGQgc2hvdyB1cCBvbiBhIHN0YWNrIGJhY2t0cmFjZT8gIFdpdGggYSBub3RlCitpbmRpY2F0aW5nIHRoYXQgdGhleSB3ZXJlbid0ICJyZWFsIj8pLgorCitNb2RpZnkgdGhlIG5ha2VkICJ1bnRpbCIgY29tbWFuZCB0byBzdGVwIHVudGlsIHBhc3QgdGhlIGN1cnJlbnQgc291cmNlCitsaW5lLCByYXRoZXIgdGhhbiBwYXN0IHRoZSBjdXJyZW50IHBjIHZhbHVlLiAgVGhpcyBpcyB0cmlja3kgc2ltcGx5CitiZWNhdXNlIHRoZSBsb3cgbGV2ZWwgcm91dGluZXMgaGF2ZSBubyB3YXkgb2Ygc3BlY2lmeWluZyBhIG11bHRpLWxpbmUKK3N0ZXAgcmFuZ2UsIGFuZCB0aGVyZSBpcyBubyB3YXkgb2Ygc2F5aW5nICJkb24ndCBwcmludCBzdHVmZiB3aGVuIHdlCitzdG9wIiBmcm9tIGFib3ZlIChvdGhlcndpc2UgY291bGQganVzdCBjYWxsIHN0ZXAgbWFueSB0aW1lcykuCisKK01vZGlmeSB0aGUgaGFuZGxpbmcgb2Ygc3ltYm9scyBncm91cGVkIHRocm91Z2ggQklOQ0wvRUlOQ0wgc3RhYnMgdG8KK2FsbG9jYXRlIGEgcGFydGlhbCBzeW10YWIgZm9yIGVhY2ggQklOQ0wvRUlOQ0wgZ3JvdXBpbmcuICBUaGlzIHdpbGwKK3NlcmlvdXNseSBkZWNyZWFzZSB0aGUgc2l6ZSBvZiBpbnRlci1wc3ltdGFiIGRlcGVuZGVuY2llcyBhbmQgaGVuY2UKK2xlc3NlbiB0aGUgYW1vdW50IHRoYXQgbmVlZHMgdG8gYmUgcmVhZCBpbiB3aGVuIGEgbmV3IHNvdXJjZSBmaWxlIGlzCithY2Nlc3NlZC4gCisKK0RvIGFuICJ4L2kgJHBjIiBhZnRlciBlYWNoIHN0ZXBpIG9yIG5leHRpLiAgCisKK01vZGlmeSBhbGwgb2YgdGhlIGRpc2Fzc2VtYmxlcnMgdG8gdXNlIHByaW50Zl9maWx0ZXJlZCB0byBnZXQgY29ycmVjdAorbW9yZSBmaWx0ZXJpbmcuCisKK01vZGlmeSBnZGIgdG8gd29yayBjb3JyZWN0bHkgd2l0aCBQYXNjYWwuCisKK0FkZCBhIGNvbW1hbmQgZm9yIHNlYXJjaGluZyBtZW1vcnksIGEgbGEgYWRiLiAgSXQgc3BlY2lmaWVzIHNpemUsCittYXNrLCB2YWx1ZSwgc3RhcnQgYWRkcmVzcy4gIEFEQiBzZWFyY2hlcyB1bnRpbCBpdCBmaW5kcyBpdCBvciBoaXRzCithbiBlcnJvciAob3IgaXMgaW50ZXJydXB0ZWQpLgorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogdGV4dAorIyBFbmQ6CmRpZmYgLS1naXQgYS9nZGIvYTI5ay10ZGVwLmMgYi9nZGIvYTI5ay10ZGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNjMDU2NwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9hMjlrLXRkZXAuYwpAQCAtMCwwICsxLDEwNDAgQEAKKy8qIFRhcmdldC1tYWNoaW5lIGRlcGVuZGVudCBjb2RlIGZvciB0aGUgQU1EIDI5MDAwCisgICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4gIFdyaXR0ZW4gYnkgSmltIEtpbmdkb24uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisKKy8qIElmIGFsbCB0aGVzZSBiaXRzIGluIGFuIGluc3RydWN0aW9uIHdvcmQgYXJlIHplcm8sIGl0IGlzIGEgInRhZyB3b3JkIgorICAgd2hpY2ggcHJlY2VkZXMgYSBmdW5jdGlvbiBlbnRyeSBwb2ludCBhbmQgZ2l2ZXMgc3RhY2sgdHJhY2ViYWNrIGluZm8uCisgICBUaGlzIHVzZWQgdG8gYmUgZGVmaW5lZCBhcyAweGZmMDAwMDAwLCBidXQgdGhhdCB0cmVhdGVkIDB4MDAwMDBkZWIgYXMKKyAgIGEgdGFnIHdvcmQsIHdoaWxlIGl0IGlzIHJlYWxseSB1c2VkIGFzIGEgYnJlYWtwb2ludC4gICovCisjZGVmaW5lCVRBR1dPUkRfWkVST19NQVNLCTB4ZmYwMGY4MDAKKworZXh0ZXJuIENPUkVfQUREUiB0ZXh0X3N0YXJ0OwkvKiBGSVhNRSwga2x1ZGdlLi4uICovCisKKy8qIFRoZSB1c2VyLXNldHRhYmxlIHRvcCBvZiB0aGUgcmVnaXN0ZXIgc3RhY2sgaW4gdmlydHVhbCBtZW1vcnkuICBXZQorICAgd29uJ3QgYXR0ZW1wdCB0byBhY2Nlc3MgYW55IHN0b3JlZCByZWdpc3RlcnMgYWJvdmUgdGhpcyBhZGRyZXNzLCBpZiBzZXQKKyAgIG5vbnplcm8uICAqLworCitzdGF0aWMgQ09SRV9BRERSIHJzdGFja19oaWdoX2FkZHJlc3MgPSBVSU5UX01BWDsKKworCisvKiBTaG91bGQgY2FsbF9mdW5jdGlvbiBhbGxvY2F0ZSBzdGFjayBzcGFjZSBmb3IgYSBzdHJ1Y3QgcmV0dXJuPyAgKi8KKy8qIE9uIHRoZSBhMjlrIG9iamVjdHMgb3ZlciAxNiB3b3JkcyByZXF1aXJlIHRoZSBjYWxsZXIgdG8gYWxsb2NhdGUgc3BhY2UuICAqLworaW50CithMjlrX3VzZV9zdHJ1Y3RfY29udmVudGlvbiAoZ2NjX3AsIHR5cGUpCisgICAgIGludCBnY2NfcDsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIHJldHVybiAoVFlQRV9MRU5HVEggKHR5cGUpID4gMTYgKiA0KTsKK30KKworCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCBjYWNoZWQgaW5mbyBhYm91dCBmdW5jdGlvbiBwcm9sb2d1ZXMuICAqLworCitzdHJ1Y3QgcHJvbG9ndWVfaW5mbworeworICBDT1JFX0FERFIgcGM7CQkJLyogRmlyc3QgYWRkciBhZnRlciBmbiBwcm9sb2d1ZSAqLworICB1bnNpZ25lZCByc2l6ZSwgbXNpemU7CS8qIHJlZ2lzdGVyIHN0YWNrIGZyYW1lIHNpemUsIG1lbSBzdGFjayBkaXR0byAqLworICB1bnNpZ25lZCBtZnBfdXNlZCA6IDE7CS8qIG1lbW9yeSBmcmFtZSBwb2ludGVyIHVzZWQgKi8KKyAgdW5zaWduZWQgcnNpemVfdmFsaWQgOiAxOwkvKiBWYWxpZGl0eSBiaXRzIGZvciB0aGUgYWJvdmUgKi8KKyAgdW5zaWduZWQgbXNpemVfdmFsaWQgOiAxOworICB1bnNpZ25lZCBtZnBfdmFsaWQgOiAxOworfTsKKworLyogRXhhbWluZSB0aGUgcHJvbG9ndWUgb2YgYSBmdW5jdGlvbiB3aGljaCBzdGFydHMgYXQgUEMuICBSZXR1cm4KKyAgIHRoZSBmaXJzdCBhZGRlc3MgcGFzdCB0aGUgcHJvbG9ndWUuICBJZiBNU0laRSBpcyBub24tTlVMTCwgdGhlbgorICAgc2V0ICpNU0laRSB0byB0aGUgbWVtb3J5IHN0YWNrIGZyYW1lIHNpemUuICBJZiBSU0laRSBpcyBub24tTlVMTCwKKyAgIHRoZW4gc2V0ICpSU0laRSB0byB0aGUgcmVnaXN0ZXIgc3RhY2sgZnJhbWUgc2l6ZSAobm90IGluY2x1ZGluZworICAgaW5jb21pbmcgYXJndW1lbnRzIGFuZCB0aGUgcmV0dXJuIGFkZHJlc3MgJiBmcmFtZSBwb2ludGVyIHN0b3JlZAorICAgd2l0aCB0aGVtKS4gIElmIG5vIHByb2xvZ3VlIGlzIGZvdW5kLCAqUlNJWkUgaXMgc2V0IHRvIHplcm8uCisgICBJZiBubyBwcm9sb2d1ZSBpcyBmb3VuZCwgb3IgYSBwcm9sb2d1ZSB3aGljaCBkb2Vzbid0IGludm9sdmUKKyAgIGFsbG9jYXRpbmcgYSBtZW1vcnkgc3RhY2sgZnJhbWUsIHRoZW4gc2V0ICpNU0laRSB0byB6ZXJvLgorCisgICBOb3RlIHRoYXQgYm90aCBtc2l6ZSBhbmQgcnNpemUgYXJlIGluIGJ5dGVzLiAgVGhpcyBpcyBub3QgY29uc2lzdGVudAorICAgd2l0aCB0aGUgX1VzZXIncyBNYW51YWxfIHdpdGggcmVzcGVjdCB0byByc2l6ZSwgYnV0IGl0IGlzIG11Y2ggbW9yZQorICAgY29udmVuaWVudC4KKworICAgSWYgTUZQX1VTRUQgaXMgbm9uLU5VTEwsICpNRlBfVVNFRCBpcyBzZXQgdG8gbm9uemVybyBpZiBhIG1lbW9yeQorICAgZnJhbWUgcG9pbnRlciBpcyBiZWluZyB1c2VkLiAgKi8KKworQ09SRV9BRERSCitleGFtaW5lX3Byb2xvZ3VlIChwYywgcnNpemUsIG1zaXplLCBtZnBfdXNlZCkKKyAgICAgQ09SRV9BRERSIHBjOworICAgICB1bnNpZ25lZCAqbXNpemU7CisgICAgIHVuc2lnbmVkICpyc2l6ZTsKKyAgICAgaW50ICptZnBfdXNlZDsKK3sKKyAgbG9uZyBpbnNuOworICBDT1JFX0FERFIgcCA9IHBjOworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGMgKHBjKTsKKyAgc3RydWN0IHByb2xvZ3VlX2luZm8gKm1pID0gMDsKKworICBpZiAobXN5bWJvbCAhPSBOVUxMKQorICAgIG1pID0gKHN0cnVjdCBwcm9sb2d1ZV9pbmZvICopIG1zeW1ib2wgLT4gaW5mbzsKKworICBpZiAobWkgIT0gMCkKKyAgICB7CisgICAgICBpbnQgdmFsaWQgPSAxOworICAgICAgaWYgKHJzaXplICE9IE5VTEwpCisJeworCSAgKnJzaXplID0gbWktPnJzaXplOworCSAgdmFsaWQgJj0gbWktPnJzaXplX3ZhbGlkOworCX0KKyAgICAgIGlmIChtc2l6ZSAhPSBOVUxMKQorCXsKKwkgICptc2l6ZSA9IG1pLT5tc2l6ZTsKKwkgIHZhbGlkICY9IG1pLT5tc2l6ZV92YWxpZDsKKwl9CisgICAgICBpZiAobWZwX3VzZWQgIT0gTlVMTCkKKwl7CisJICAqbWZwX3VzZWQgPSBtaS0+bWZwX3VzZWQ7CisJICB2YWxpZCAmPSBtaS0+bWZwX3ZhbGlkOworCX0KKyAgICAgIGlmICh2YWxpZCkKKwlyZXR1cm4gbWktPnBjOworICAgIH0KKworICBpZiAocnNpemUgIT0gTlVMTCkKKyAgICAqcnNpemUgPSAwOworICBpZiAobXNpemUgIT0gTlVMTCkKKyAgICAqbXNpemUgPSAwOworICBpZiAobWZwX3VzZWQgIT0gTlVMTCkKKyAgICAqbWZwX3VzZWQgPSAwOworICAKKyAgLyogUHJvbG9ndWUgbXVzdCBzdGFydCB3aXRoIHN1YnRyYWN0aW5nIGEgY29uc3RhbnQgZnJvbSBncjEuCisgICAgIE5vcm1hbGx5IHRoaXMgaXMgc3ViIGdyMSxncjEsPHJzaXplICogND4uICAqLworICBpbnNuID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocCwgNCk7CisgIGlmICgoaW5zbiAmIDB4ZmZmZmZmMDApICE9IDB4MjUwMTAxMDApCisgICAgeworICAgICAgLyogSWYgdGhlIGZyYW1lIGlzIGxhcmdlLCBpbnN0ZWFkIG9mIGEgc2luZ2xlIGluc3RydWN0aW9uIGl0CisJIG1pZ2h0IGJlIGEgcGFpciBvZiBpbnN0cnVjdGlvbnM6CisJIGNvbnN0IDxyZWc+LCA8cnNpemUgKiA0PgorCSBzdWIgZ3IxLGdyMSw8cmVnPgorCSAqLworICAgICAgaW50IHJlZzsKKyAgICAgIC8qIFBvc3NpYmxlIHZhbHVlIGZvciByc2l6ZS4gICovCisgICAgICB1bnNpZ25lZCBpbnQgcnNpemUwOworICAgICAgCisgICAgICBpZiAoKGluc24gJiAweGZmMDAwMDAwKSAhPSAweDAzMDAwMDAwKQorCXsKKwkgIHAgPSBwYzsKKwkgIGdvdG8gZG9uZTsKKwl9CisgICAgICByZWcgPSAoaW5zbiA+PiA4KSAmIDB4ZmY7CisgICAgICByc2l6ZTAgPSAoKChpbnNuID4+IDgpICYgMHhmZjAwKSB8IChpbnNuICYgMHhmZikpOworICAgICAgcCArPSA0OworICAgICAgaW5zbiA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHAsIDQpOworICAgICAgaWYgKChpbnNuICYgMHhmZmZmZmYwMCkgIT0gMHgyNDAxMDEwMAorCSAgfHwgKGluc24gJiAweGZmKSAhPSByZWcpCisJeworCSAgcCA9IHBjOworCSAgZ290byBkb25lOworCX0KKyAgICAgIGlmIChyc2l6ZSAhPSBOVUxMKQorCSpyc2l6ZSA9IHJzaXplMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAocnNpemUgIT0gTlVMTCkKKwkqcnNpemUgPSAoaW5zbiAmIDB4ZmYpOworICAgIH0KKyAgcCArPSA0OworCisgIC8qIE5leHQgaW5zdHJ1Y3Rpb24gb3VnaHQgdG8gYmUgYXNnZXUgVl9TUElMTCxncjEscmFiLiAgCisgICAqIFdlIGRvbid0IGNoZWNrIHRoZSB2ZWN0b3IgbnVtYmVyIHRvIGFsbG93IGZvciBrZXJuZWwgZGVidWdnaW5nLiAgVGhlIAorICAgKiBrZXJuZWwgd2lsbCB1c2UgYSBkaWZmZXJlbnQgdHJhcCBudW1iZXIuIAorICAgKiBJZiB0aGlzIGluc24gaXMgbWlzc2luZywgd2UganVzdCBrZWVwIGdvaW5nOyBNZXRhd2FyZSBSMi4zdSBjb21waWxlcgorICAgKiBnZW5lcmF0ZXMgcHJvbG9ndWUgdGhhdCBpbnRlcm1peGVzIGluaXRpYWxpemF0aW9ucyBhbmQgcHV0cyB0aGUgYXNnZXUKKyAgICogd2F5IGRvd24uCisgICAqLworICBpbnNuID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocCwgNCk7CisgIGlmICgoaW5zbiAmIDB4ZmYwMGZmZmYpID09ICgweDVlMDAwMTAwfFJBQl9IV19SRUdOVU0pKQorICAgIHsKKyAgICAgIHAgKz0gNDsKKyAgICB9CisKKyAgLyogTmV4dCBpbnN0cnVjdGlvbiB1c3VhbGx5IHNldHMgdGhlIGZyYW1lIHBvaW50ZXIgKGxyMSkgYnkgYWRkaW5nCisgICAgIDxzaXplICogND4gZnJvbSBncjEuICBIb3dldmVyLCB0aGlzIGNhbiAoYW5kIGhpZ2ggQyBkb2VzKSBiZQorICAgICBkZWZlcnJlZCB1bnRpbCBhbnl0aW1lIGJlZm9yZSB0aGUgZmlyc3QgZnVuY3Rpb24gY2FsbC4gIFNvIGl0IGlzCisgICAgIE9LIGlmIHdlIGRvbid0IHNlZSBhbnl0aGluZyB3aGljaCBzZXRzIGxyMS4gIAorICAgICBUbyBhbGxvdyBmb3IgYWx0ZXJuYXRlIHJlZ2lzdGVyIHNldHMgKGdjYyAtbWtlcm5lbC1yZWdpc3RlcnMpICB0aGUgbXNwCisgICAgIHJlZ2lzdGVyIG51bWJlciBpcyBhIGNvbXBpbGUgdGltZSBjb25zdGFudC4gKi8KKworICAvKiBOb3JtYWxseSB0aGlzIGlzIGp1c3QgYWRkIGxyMSxncjEsPHNpemUgKiA0Pi4gICovCisgIGluc24gPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwLCA0KTsKKyAgaWYgKChpbnNuICYgMHhmZmZmZmYwMCkgPT0gMHgxNTgxMDEwMCkKKyAgICBwICs9IDQ7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBIb3dldmVyLCBmb3IgbGFyZ2UgZnJhbWVzIGl0IGNhbiBiZQorCSBjb25zdCA8cmVnPiwgPHNpemUgKjQ+CisJIGFkZCBscjEsZ3IxLDxyZWc+CisJICovCisgICAgICBpbnQgcmVnOworICAgICAgQ09SRV9BRERSIHE7CisKKyAgICAgIGlmICgoaW5zbiAmIDB4ZmYwMDAwMDApID09IDB4MDMwMDAwMDApCisJeworCSAgcmVnID0gKGluc24gPj4gOCkgJiAweGZmOworCSAgcSA9IHAgKyA0OworCSAgaW5zbiA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHEsIDQpOworCSAgaWYgKChpbnNuICYgMHhmZmZmZmYwMCkgPT0gMHgxNDgxMDEwMAorCSAgICAgICYmIChpbnNuICYgMHhmZikgPT0gcmVnKQorCSAgICBwID0gcTsKKwl9CisgICAgfQorCisgIC8qIE5leHQgY29tZXMgImFkZCBscns8cnNpemUtMT59LG1zcCwwIiwgYnV0IG9ubHkgaWYgYSBtZW1vcnkKKyAgICAgZnJhbWUgcG9pbnRlciBpcyBpbiB1c2UuICBXZSBqdXN0IGNoZWNrIGZvciBhZGQgbHI8YW55dGhpbmc+LG1zcCwwOworICAgICB3ZSBkb24ndCBjaGVjayB0aGlzIHJzaXplIGFnYWluc3QgdGhlIGZpcnN0IGluc3RydWN0aW9uLCBhbmQKKyAgICAgd2UgZG9uJ3QgY2hlY2sgdGhhdCB0aGUgdHJhY2UtYmFjayB0YWcgaW5kaWNhdGVzIGEgbWVtb3J5IGZyYW1lIHBvaW50ZXIKKyAgICAgaXMgaW4gdXNlLiAgCisgICAgIFRvIGFsbG93IGZvciBhbHRlcm5hdGUgcmVnaXN0ZXIgc2V0cyAoZ2NjIC1ta2VybmVsLXJlZ2lzdGVycykgIHRoZSBtc3AKKyAgICAgcmVnaXN0ZXIgbnVtYmVyIGlzIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50LgorCisgICAgIFRoZSByZWNvbW1lbmRlZCBpbnN0cnVjdGlvbiBpcyBhY3R1YWxseSAic2xsIGxyPHdoYXRldmVyPixtc3AsMCIuIAorICAgICBXZSBjaGVjayBmb3IgdGhhdCwgdG9vLiAgT3JpZ2luYWxseSBKaW0gS2luZ2RvbidzIGNvZGUgc2VlbWVkCisgICAgIHRvIGJlIGxvb2tpbmcgZm9yIGEgInN1YiIgaW5zdHJ1Y3Rpb24gaGVyZSwgYnV0IHRoZSBtYXNrIHdhcyBzZXQKKyAgICAgdXAgdG8gbG9zZSBhbGwgdGhlIHRpbWUuICovCisgIGluc24gPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwLCA0KTsKKyAgaWYgKCgoaW5zbiAmIDB4ZmY4MGZmZmYpID09ICgweDE1ODAwMDAwfChNU1BfSFdfUkVHTlVNPDw4KSkpICAgICAvKiBhZGQgKi8KKyAgIHx8ICgoaW5zbiAmIDB4ZmY4MGZmZmYpID09ICgweDgxODAwMDAwfChNU1BfSFdfUkVHTlVNPDw4KSkpKSAgICAvKiBzbGwgKi8KKyAgICB7CisgICAgICBwICs9IDQ7CisgICAgICBpZiAobWZwX3VzZWQgIT0gTlVMTCkKKwkqbWZwX3VzZWQgPSAxOworICAgIH0KKworICAvKiBOZXh0IGNvbWVzIGEgc3VidHJhY3Rpb24gZnJvbSBtc3AgdG8gYWxsb2NhdGUgYSBtZW1vcnkgZnJhbWUsCisgICAgIGJ1dCBvbmx5IGlmIGEgbWVtb3J5IGZyYW1lIGlzCisgICAgIGJlaW5nIHVzZWQuICBXZSBkb24ndCBjaGVjayBtc2l6ZSBhZ2FpbnN0IHRoZSB0cmFjZS1iYWNrIHRhZy4KKworICAgICBUbyBhbGxvdyBmb3IgYWx0ZXJuYXRlIHJlZ2lzdGVyIHNldHMgKGdjYyAtbWtlcm5lbC1yZWdpc3RlcnMpIHRoZSBtc3AKKyAgICAgcmVnaXN0ZXIgbnVtYmVyIGlzIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50LgorCisgICAgIE5vcm1hbGx5IHRoaXMgaXMganVzdAorICAgICBzdWIgbXNwLG1zcCw8bXNpemU+CisgICAgICovCisgIGluc24gPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwLCA0KTsKKyAgaWYgKChpbnNuICYgMHhmZmZmZmYwMCkgPT0gCisJCSgweDI1MDAwMDAwfChNU1BfSFdfUkVHTlVNPDwxNil8KE1TUF9IV19SRUdOVU08PDgpKSkKKyAgICB7CisgICAgICBwICs9IDQ7CisgICAgICBpZiAobXNpemUgIT0gTlVMTCkgCisJKm1zaXplID0gaW5zbiAmIDB4ZmY7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogRm9yIGxhcmdlIGZyYW1lcywgaW5zdGVhZCBvZiBhIHNpbmdsZSBpbnN0cnVjdGlvbiBpdCBtaWdodAorCSBiZQorCisJIGNvbnN0IDxyZWc+LCA8bXNpemU+CisJIGNvbnN0aCA8cmVnPiwgPG1zaXplPiAgICAgOyBvcHRpb25hbAorCSBzdWIgbXNwLG1zcCw8cmVnPgorCSAqLworICAgICAgaW50IHJlZzsKKyAgICAgIHVuc2lnbmVkIG1zaXplMDsKKyAgICAgIENPUkVfQUREUiBxID0gcDsKKworICAgICAgaWYgKChpbnNuICYgMHhmZjAwMDAwMCkgPT0gMHgwMzAwMDAwMCkKKwl7CisJICByZWcgPSAoaW5zbiA+PiA4KSAmIDB4ZmY7CisJICBtc2l6ZTAgPSAoKGluc24gPj4gOCkgJiAweGZmMDApIHwgKGluc24gJiAweGZmKTsKKwkgIHEgKz0gNDsKKwkgIGluc24gPSByZWFkX21lbW9yeV9pbnRlZ2VyIChxLCA0KTsKKwkgIC8qIENoZWNrIGZvciBjb25zdGguICAqLworCSAgaWYgKChpbnNuICYgMHhmZjAwMDAwMCkgPT0gMHgwMjAwMDAwMAorCSAgICAgICYmIChpbnNuICYgMHgwMDAwZmYwMCkgPT0gcmVnKQorCSAgICB7CisJICAgICAgbXNpemUwIHw9IChpbnNuIDw8IDgpICYgMHhmZjAwMDAwMDsKKwkgICAgICBtc2l6ZTAgfD0gKGluc24gPDwgMTYpICYgMHgwMGZmMDAwMDsKKwkgICAgICBxICs9IDQ7CisJICAgICAgaW5zbiA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHEsIDQpOworCSAgICB9CisJICAvKiBDaGVjayBmb3Igc3ViIG1zcCxtc3AsPHJlZz4uICAqLworICAgICAgICAgIGlmICgoaW5zbiAmIDB4ZmZmZmZmMDApID09IAorCQkoMHgyNDAwMDAwMHwoTVNQX0hXX1JFR05VTTw8MTYpfChNU1BfSFdfUkVHTlVNPDw4KSkKKwkgICAgICAmJiAoaW5zbiAmIDB4ZmYpID09IHJlZykKKwkgICAgeworCSAgICAgIHAgPSBxICsgNDsKKwkgICAgICBpZiAobXNpemUgIT0gTlVMTCkKKwkJKm1zaXplID0gbXNpemUwOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBOZXh0IGluc3RydWN0aW9uIG1pZ2h0IGJlIGFzZ2V1IFZfU1BJTEwsZ3IxLHJhYi4gIAorICAgKiBXZSBkb24ndCBjaGVjayB0aGUgdmVjdG9yIG51bWJlciB0byBhbGxvdyBmb3Iga2VybmVsIGRlYnVnZ2luZy4gIFRoZSAKKyAgICoga2VybmVsIHdpbGwgdXNlIGEgZGlmZmVyZW50IHRyYXAgbnVtYmVyLiAKKyAgICogTWV0YXdhcmUgUjIuM3UgY29tcGlsZXIKKyAgICogZ2VuZXJhdGVzIHByb2xvZ3VlIHRoYXQgaW50ZXJtaXhlcyBpbml0aWFsaXphdGlvbnMgYW5kIHB1dHMgdGhlIGFzZ2V1CisgICAqIHdheSBkb3duIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZS4KKyAgICovCisgIGluc24gPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwLCA0KTsKKyAgaWYgKChpbnNuICYgMHhmZjAwZmZmZikgPT0gKDB4NWUwMDAxMDB8UkFCX0hXX1JFR05VTSkpCisgICAgeworICAgICAgcCArPSA0OworICAgIH0KKworIGRvbmU6CisgIGlmIChtc3ltYm9sICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKG1pID09IDApCisJeworCSAgLyogQWRkIGEgbmV3IGNhY2hlIGVudHJ5LiAgKi8KKwkgIG1pID0gKHN0cnVjdCBwcm9sb2d1ZV9pbmZvICopeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcHJvbG9ndWVfaW5mbykpOworCSAgbXN5bWJvbCAtPiBpbmZvID0gKGNoYXIgKiltaTsKKwkgIG1pLT5yc2l6ZV92YWxpZCA9IDA7CisJICBtaS0+bXNpemVfdmFsaWQgPSAwOworCSAgbWktPm1mcF92YWxpZCA9IDA7CisJfQorICAgICAgLyogZWxzZSwgY2FjaGUgZW50cnkgZXhpc3RzLCBidXQgaW5mbyBpcyBpbmNvbXBsZXRlLiAgKi8KKyAgICAgIG1pLT5wYyA9IHA7CisgICAgICBpZiAocnNpemUgIT0gTlVMTCkKKwl7CisJICBtaS0+cnNpemUgPSAqcnNpemU7CisJICBtaS0+cnNpemVfdmFsaWQgPSAxOworCX0KKyAgICAgIGlmIChtc2l6ZSAhPSBOVUxMKQorCXsKKwkgIG1pLT5tc2l6ZSA9ICptc2l6ZTsKKwkgIG1pLT5tc2l6ZV92YWxpZCA9IDE7CisJfQorICAgICAgaWYgKG1mcF91c2VkICE9IE5VTEwpCisJeworCSAgbWktPm1mcF91c2VkID0gKm1mcF91c2VkOworCSAgbWktPm1mcF92YWxpZCA9IDE7CisJfQorICAgIH0KKyAgcmV0dXJuIHA7Cit9CisKKy8qIEFkdmFuY2UgUEMgYWNyb3NzIGFueSBmdW5jdGlvbiBlbnRyeSBwcm9sb2d1ZSBpbnN0cnVjdGlvbnMKKyAgIHRvIHJlYWNoIHNvbWUgInJlYWwiIGNvZGUuICAqLworCitDT1JFX0FERFIKK3NraXBfcHJvbG9ndWUgKHBjKQorICAgICBDT1JFX0FERFIgcGM7Cit7CisgIHJldHVybiBleGFtaW5lX3Byb2xvZ3VlIChwYywgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBFeGFtaW5lIHRoZSBvbmUgb3IgdHdvIHdvcmQgdGFnIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBmdW5jdGlvbi4KKyAqIFRoZSB0YWcgd29yZCBpcyBleHBlY3QgdG8gYmUgYXQgJ3AnLCBpZiBpdCBpcyBub3QgdGhlcmUsIHdlIGZhaWwKKyAqIGJ5IHJldHVybmluZyAwLiAgVGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSB0YWcgd29yZCB3YXMgdGFrZW4gZnJvbQorICogcGFnZSA3LTE1IG9mIHRoZSAyOTA1MCBVc2VyJ3MgTWFudWFsLiAgV2UgYXJlIGFzc3VtaW5nIHRoYXQgdGhlCisgKiBtIGJpdCBpcyBpbiBiaXQgMjIgb2YgdGhlIHRhZyB3b3JkLCB3aGljaCBzZWVtcyB0byBiZSB0aGUgYWdyZWVkIHVwb24KKyAqIGNvbnZlbnRpb24gdG9kYXkgKDEvMTUvOTIpLgorICogbXNpemUgaXMgcmV0dXJuIGluIGJ5dGVzLgorICovCisKK3N0YXRpYyBpbnQJLyogMC8xIC0gZmFpbHVyZS9zdWNjZXNzIG9mIGZpbmRpbmcgdGhlIHRhZyB3b3JkICAqLworZXhhbWluZV90YWcgKHAsIGlzX3RyYW5zLCBhcmdjb3VudCwgbXNpemUsIG1mcF91c2VkKQorICAgICBDT1JFX0FERFIgcDsKKyAgICAgaW50ICppc190cmFuczsKKyAgICAgaW50ICphcmdjb3VudDsKKyAgICAgdW5zaWduZWQgKm1zaXplOworICAgICBpbnQgKm1mcF91c2VkOworeworICB1bnNpZ25lZCBpbnQgdGFnMSwgdGFnMjsKKworICB0YWcxID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocCwgNCk7CisgIGlmICgodGFnMSAmIFRBR1dPUkRfWkVST19NQVNLKSAhPSAwKQkvKiBOb3QgYSB0YWcgd29yZCAqLworICAgIHJldHVybiAwOworICBpZiAodGFnMSAmICgxPDwyMykpIAkJCS8qIEEgdHdvIHdvcmQgdGFnICovCisgICAgeworICAgICAgIHRhZzIgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwLTQsIDQpOworICAgICAgIGlmIChtc2l6ZSkKKwkgKm1zaXplID0gdGFnMiAqIDI7CisgICAgfQorICBlbHNlCQkJCQkvKiBBIG9uZSB3b3JkIHRhZyAqLworICAgIHsKKyAgICAgICBpZiAobXNpemUpCisJICptc2l6ZSA9IHRhZzEgJiAweDdmZjsKKyAgICB9CisgIGlmIChpc190cmFucykKKyAgICAqaXNfdHJhbnMgPSAoKHRhZzEgJiAoMTw8MjEpKSA/IDEgOiAwKTsKKyAgLyogTm90ZSB0aGF0IHRoaXMgaW5jbHVkZXMgdGhlIGZyYW1lIHBvaW50ZXIgYW5kIHRoZSByZXR1cm4gYWRkcmVzcworICAgICByZWdpc3Rlciwgc28gdGhlIGFjdHVhbCBudW1iZXIgb2YgcmVnaXN0ZXJzIG9mIGFyZ3VtZW50cyBpcyB0d28gbGVzcy4KKyAgICAgYXJnY291bnQgY2FuIGJlIHplcm8sIGhvd2V2ZXIsIHNvbWV0aW1lcywgZm9yIHN0cmFuZ2UgYXNzZW1ibGVyCisgICAgIHJvdXRpbmVzLiAgKi8KKyAgaWYgKGFyZ2NvdW50KQorICAgICphcmdjb3VudCA9ICh0YWcxID4+IDE2KSAmIDB4MWY7CisgIGlmIChtZnBfdXNlZCkKKyAgICAqbWZwX3VzZWQgPSAoKHRhZzEgJiAoMTw8MjIpKSA/IDEgOiAwKTsgCisgIHJldHVybiAxOworfQorCisvKiBJbml0aWFsaXplIHRoZSBmcmFtZS4gIEluIGFkZGl0aW9uIHRvIHNldHRpbmcgImV4dHJhIiBmcmFtZSBpbmZvLAorICAgd2UgYWxzbyBzZXQgLT5mcmFtZSBiZWNhdXNlIHdlIHVzZSBpdCBpbiBhIG5vbnN0YW5kYXJkIHdheSwgYW5kIC0+cGMKKyAgIGJlY2F1c2Ugd2UgbmVlZCB0byBrbm93IGl0IHRvIGdldCB0aGUgb3RoZXIgc3R1ZmYuICBTZWUgdGhlIGRpYWdyYW0KKyAgIG9mIHN0YWNrcyBhbmQgdGhlIGZyYW1lIGNhY2hlIGluIHRtLWEyOWsuaCBmb3IgbW9yZSBkZXRhaWwuICAqLworCitzdGF0aWMgdm9pZAoraW5pdF9mcmFtZV9pbmZvIChpbm5lcm1vc3RfZnJhbWUsIGZyYW1lKQorICAgICBpbnQgaW5uZXJtb3N0X2ZyYW1lOworICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIENPUkVfQUREUiBwOworICBsb25nIGluc247CisgIHVuc2lnbmVkIHJzaXplOworICB1bnNpZ25lZCBtc2l6ZTsKKyAgaW50IG1mcF91c2VkLCB0cmFuczsKKyAgc3RydWN0IHN5bWJvbCAqZnVuYzsKKworICBwID0gZnJhbWUtPnBjOworCisgIGlmIChpbm5lcm1vc3RfZnJhbWUpCisgICAgZnJhbWUtPmZyYW1lID0gcmVhZF9yZWdpc3RlciAoR1IxX1JFR05VTSk7CisgIGVsc2UKKyAgICBmcmFtZS0+ZnJhbWUgPSBmcmFtZS0+bmV4dC0+ZnJhbWUgKyBmcmFtZS0+bmV4dC0+cnNpemU7CisgIAorI2lmIDAgLyogQ0FMTF9EVU1NWV9MT0NBVElPTiA9PSBPTl9TVEFDSyAqLworICBUaGlzIHdvbnQgd29yazsKKyNlbHNlCisgIGlmIChQQ19JTl9DQUxMX0RVTU1ZIChwLCAwLCAwKSkKKyNlbmRpZgorICAgIHsKKyAgICAgIGZyYW1lLT5yc2l6ZSA9IERVTU1ZX0ZSQU1FX1JTSVpFOworICAgICAgLyogVGhpcyBkb2Vzbid0IG1hdHRlciBzaW5jZSB3ZSBuZXZlciB0cnkgdG8gZ2V0IGxvY2FscyBvciBhcmdzCisJIGZyb20gYSBkdW1teSBmcmFtZS4gICovCisgICAgICBmcmFtZS0+bXNpemUgPSAwOworICAgICAgLyogRHVtbXkgZnJhbWVzIGFsd2F5cyB1c2UgYSBtZW1vcnkgZnJhbWUgcG9pbnRlci4gICovCisgICAgICBmcmFtZS0+c2F2ZWRfbXNwID0gCisJcmVhZF9yZWdpc3Rlcl9zdGFja19pbnRlZ2VyIChmcmFtZS0+ZnJhbWUgKyBEVU1NWV9GUkFNRV9SU0laRSAtIDQsIDQpOworICAgICAgZnJhbWUtPmZsYWdzIHw9IChUUkFOU1BBUkVOVF9GUkFNRXxNRlBfVVNFRCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIAorICBmdW5jID0gZmluZF9wY19mdW5jdGlvbiAocCk7CisgIGlmIChmdW5jICE9IE5VTEwpCisgICAgcCA9IEJMT0NLX1NUQVJUIChTWU1CT0xfQkxPQ0tfVkFMVUUgKGZ1bmMpKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNlYXJjaCBiYWNrd2FyZCB0byBmaW5kIHRoZSB0cmFjZS1iYWNrIHRhZy4gIEhvd2V2ZXIsCisJIGRvIG5vdCB0cmFjZSBiYWNrIGJleW9uZCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc2VnbWVudAorCSAoanVzdCBhcyBhIHNhbml0eSBjaGVjayB0byBhdm9pZCBnb2luZyBpbnRvIG5ldmVyLW5ldmVyIGxhbmQpLiAgKi8KKyNpZiAxCisgICAgICB3aGlsZSAocCA+PSB0ZXh0X3N0YXJ0CisJICAgICAmJiAoKGluc24gPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwLCA0KSkgJiBUQUdXT1JEX1pFUk9fTUFTSykgIT0gMCkKKwlwIC09IDQ7CisjZWxzZSAvKiAwICovCisgICAgICBjaGFyIHBhdFs0XSA9IHswLCAwLCAwLCAwfTsKKyAgICAgIGNoYXIgbWFza1s0XTsKKyAgICAgIGNoYXIgaW5zbl9yYXdbNF07CisgICAgICBzdG9yZV91bnNpZ25lZF9pbnRlZ2VyIChtYXNrLCA0LCBUQUdXT1JEX1pFUk9fTUFTSyk7CisgICAgICAvKiBFbmFibGUgdGhpcyBvbmNlIHRhcmdldF9zZWFyY2ggaXMgZW5hYmxlZCBhbmQgdGVzdGVkLiAgKi8KKyAgICAgIHRhcmdldF9zZWFyY2ggKDQsIHBhdCwgbWFzaywgcCwgLTQsIHRleHRfc3RhcnQsIHArMSwgJnAsICZpbnNuX3Jhdyk7CisgICAgICBpbnNuID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChpbnNuX3JhdywgNCk7CisjZW5kaWYgLyogMCAqLworCisgICAgICBpZiAocCA8IHRleHRfc3RhcnQpCisJeworCSAgLyogQ291bGRuJ3QgZmluZCB0aGUgdHJhY2UtYmFjayB0YWcuCisJICAgICBTb21ldGhpbmcgc3RyYW5nZSBpcyBnb2luZyBvbi4gICovCisJICBmcmFtZS0+c2F2ZWRfbXNwID0gMDsKKwkgIGZyYW1lLT5yc2l6ZSA9IDA7CisJICBmcmFtZS0+bXNpemUgPSAwOworCSAgZnJhbWUtPmZsYWdzID0gVFJBTlNQQVJFTlRfRlJBTUU7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZQorCS8qIEFkdmFuY2UgdG8gdGhlIGZpcnN0IHdvcmQgb2YgdGhlIGZ1bmN0aW9uLCBpLmUuIHRoZSB3b3JkCisJICAgYWZ0ZXIgdGhlIHRyYWNlLWJhY2sgdGFnLiAgKi8KKwlwICs9IDQ7CisgICAgfQorCisgIC8qIFdlJ3ZlIGZvdW5kIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICAKKyAgICAgVHJ5IGxvb2tpbmcgZm9yIGEgdGFnIHdvcmQgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGVyZSBpcyBhCisgICAgIG1lbW9yeSBmcmFtZSBwb2ludGVyIGFuZCB3aGF0IHRoZSBtZW1vcnkgc3RhY2sgYWxsb2NhdGlvbiBpcy4KKyAgICAgSWYgb25lIGRvZXNuJ3QgZXhpc3QsIHRyeSB1c2luZyBhIG1vcmUgZXhoYXVzdGl2ZSBzZWFyY2ggb2YKKyAgICAgdGhlIHByb2xvZ3VlLiAgKi8KKworICBpZiAoZXhhbWluZV90YWcocC00LCZ0cmFucywoaW50ICopTlVMTCwmbXNpemUsJm1mcF91c2VkKSkgLyogRm91bmQgZ29vZCB0YWcgKi8KKyAgICAgIGV4YW1pbmVfcHJvbG9ndWUgKHAsICZyc2l6ZSwgMCwgMCk7CisgIGVsc2UgCQkJCQkJLyogTm8gdGFnIHRyeSBwcm9sb2d1ZSAqLworICAgICAgZXhhbWluZV9wcm9sb2d1ZSAocCwgJnJzaXplLCAmbXNpemUsICZtZnBfdXNlZCk7CisKKyAgZnJhbWUtPnJzaXplID0gcnNpemU7CisgIGZyYW1lLT5tc2l6ZSA9IG1zaXplOworICBmcmFtZS0+ZmxhZ3MgPSAwOworICBpZiAobWZwX3VzZWQpCisgIAlmcmFtZS0+ZmxhZ3MgfD0gTUZQX1VTRUQ7CisgIGlmICh0cmFucykKKyAgCWZyYW1lLT5mbGFncyB8PSBUUkFOU1BBUkVOVF9GUkFNRTsKKyAgaWYgKGlubmVybW9zdF9mcmFtZSkKKyAgICB7CisgICAgICBmcmFtZS0+c2F2ZWRfbXNwID0gcmVhZF9yZWdpc3RlciAoTVNQX1JFR05VTSkgKyBtc2l6ZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAobWZwX3VzZWQpCisgIAkgZnJhbWUtPnNhdmVkX21zcCA9CisJICAgICAgcmVhZF9yZWdpc3Rlcl9zdGFja19pbnRlZ2VyIChmcmFtZS0+ZnJhbWUgKyByc2l6ZSAtIDQsIDQpOworICAgICAgZWxzZQorICAJICAgIGZyYW1lLT5zYXZlZF9tc3AgPSBmcmFtZS0+bmV4dC0+c2F2ZWRfbXNwICsgbXNpemU7CisgICAgfQorfQorCit2b2lkCitpbml0X2V4dHJhX2ZyYW1lX2luZm8gKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIGlmIChmcmFtZS0+bmV4dCA9PSAwKQorICAgIC8qIEFzc3VtZSBpbm5lcm1vc3QgZnJhbWUuICBNYXkgcHJvZHVjZSBzdHJhbmdlIHJlc3VsdHMgZm9yICJpbmZvIGZyYW1lIgorICAgICAgIGJ1dCB0aGVyZSBpc24ndCBhbnkgd2F5IHRvIHRlbGwgdGhlIGRpZmZlcmVuY2UuICAqLworICAgIGluaXRfZnJhbWVfaW5mbyAoMSwgZnJhbWUpOworICBlbHNlIHsKKyAgICAgIC8qIFdlJ3JlIGluIGdldF9wcmV2X2ZyYW1lX2luZm8uCisgICAgICAgICBUYWtlIGNhcmUgb2YgZXZlcnl0aGluZyBpbiBpbml0X2ZyYW1lX3BjLiAgKi8KKyAgICAgIDsKKyAgICB9Cit9CisKK3ZvaWQKK2luaXRfZnJhbWVfcGMgKGZyb21sZWFmLCBmcmFtZSkKKyAgICAgaW50IGZyb21sZWFmOworICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIGZyYW1lLT5wYyA9IChmcm9tbGVhZiA/IFNBVkVEX1BDX0FGVEVSX0NBTEwgKGZyYW1lLT5uZXh0KSA6CisJICAgICBmcmFtZS0+bmV4dCA/IEZSQU1FX1NBVkVEX1BDIChmcmFtZS0+bmV4dCkgOiByZWFkX3BjICgpKTsKKyAgaW5pdF9mcmFtZV9pbmZvIChmcm9tbGVhZiwgZnJhbWUpOworfQorDAorLyogTG9jYWwgdmFyaWFibGVzIChpLmUuIExPQ19MT0NBTCkgYXJlIG9uIHRoZSBtZW1vcnkgc3RhY2ssIHdpdGggdGhlaXIKKyAgIG9mZnNldHMgYmVpbmcgcmVsYXRpdmUgdG8gdGhlIG1lbW9yeSBzdGFjayBwb2ludGVyIChoaWdoIEMpIG9yCisgICBzYXZlZF9tc3AgKGdjYykuICAqLworCitDT1JFX0FERFIKK2ZyYW1lX2xvY2Fsc19hZGRyZXNzIChmaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworeworICBpZiAoZmktPmZsYWdzICYgTUZQX1VTRUQpIAorICAgIHJldHVybiBmaS0+c2F2ZWRfbXNwOworICBlbHNlCisgICAgcmV0dXJuIGZpLT5zYXZlZF9tc3AgLSBmaS0+bXNpemU7Cit9CisMCisvKiBSb3V0aW5lcyBmb3IgcmVhZGluZyB0aGUgcmVnaXN0ZXIgc3RhY2suICBUaGUgY2FsbGVyIGdldHMgdG8gdHJlYXQKKyAgIHRoZSByZWdpc3RlciBzdGFjayBhcyBhIHVuaWZvcm0gc3RhY2sgaW4gbWVtb3J5LCBmcm9tIGFkZHJlc3MgJGdyMQorICAgc3RyYWlnaHQgdGhyb3VnaCAkcmZiIGFuZCBiZXlvbmQuICAqLworCisvKiBBbmFsb2dvdXMgdG8gcmVhZF9tZW1vcnkgZXhjZXB0IHRoZSBsZW5ndGggaXMgdW5kZXJzdG9vZCB0byBiZSA0LgorICAgQWxzbywgbXlhZGRyIGNhbiBiZSBOVUxMIChtZWFuaW5nIGRvbid0IGJvdGhlciB0byByZWFkKSwgYW5kCisgICBpZiBhY3R1YWxfbWVtX2FkZHIgaXMgbm9uLU5VTEwsIHN0b3JlIHRoZXJlIHRoZSBhZGRyZXNzIHRoYXQgaXQKKyAgIHdhcyBmZXRjaGVkIGZyb20gKG9yIGlmIGZyb20gYSByZWdpc3RlciB0aGUgb2Zmc2V0IHdpdGhpbgorICAgcmVnaXN0ZXJzKS4gIFNldCAqTFZBTCB0byBsdmFsX21lbW9yeSBvciBsdmFsX3JlZ2lzdGVyLCBkZXBlbmRpbmcKKyAgIG9uIHdoZXJlIGl0IGNhbWUgZnJvbS4gIFRoZSBjb250ZW50cyB3cml0dGVuIGludG8gTVlBRERSIGFyZSBpbgorICAgdGFyZ2V0IGZvcm1hdC4gICovCit2b2lkCityZWFkX3JlZ2lzdGVyX3N0YWNrIChtZW1hZGRyLCBteWFkZHIsIGFjdHVhbF9tZW1fYWRkciwgbHZhbCkKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgQ09SRV9BRERSICphY3R1YWxfbWVtX2FkZHI7CisgICAgIGVudW0gbHZhbF90eXBlICpsdmFsOworeworICBsb25nIHJmYiA9IHJlYWRfcmVnaXN0ZXIgKFJGQl9SRUdOVU0pOworICBsb25nIHJzcCA9IHJlYWRfcmVnaXN0ZXIgKFJTUF9SRUdOVU0pOworCisgIC8qIElmIHdlIGRvbid0IGRvIHRoaXMgJ2luZm8gcmVnaXN0ZXInIHN0b3BzIGluIHRoZSBtaWRkbGUuICovCisgIGlmIChtZW1hZGRyID49IHJzdGFja19oaWdoX2FkZHJlc3MpIAorICAgIHsKKyAgICAgIC8qIGEgYm9ndXMgdmFsdWUgKi8KKyAgICAgIHN0YXRpYyBjaGFyIHZhbFtdID0ge34wLCB+MCwgfjAsIH4wfTsKKyAgICAgIC8qIEl0J3MgaW4gYSBsb2NhbCByZWdpc3RlciwgYnV0IG9mZiB0aGUgZW5kIG9mIHRoZSBzdGFjay4gICovCisgICAgICBpbnQgcmVnbnVtID0gKG1lbWFkZHIgLSByc3ApIC8gNCArIExSMF9SRUdOVU07CisgICAgICBpZiAobXlhZGRyICE9IE5VTEwpCisJeworCSAgLyogUHJvdmlkZSBib2d1c25lc3MgKi8KKwkgIG1lbWNweSAobXlhZGRyLCB2YWwsIDQpOworCX0KKyAgICAgIHN1cHBseV9yZWdpc3RlcihyZWdudW0sIHZhbCk7CS8qIE1vcmUgYm9ndXNuZXNzICovCisgICAgICBpZiAobHZhbCAhPSBOVUxMKQorCSpsdmFsID0gbHZhbF9yZWdpc3RlcjsKKyAgICAgIGlmIChhY3R1YWxfbWVtX2FkZHIgIT0gTlVMTCkKKwkqYWN0dWFsX21lbV9hZGRyID0gUkVHSVNURVJfQllURSAocmVnbnVtKTsKKyAgICB9CisgIC8qIElmIGl0J3MgaW4gdGhlIHBhcnQgb2YgdGhlIHJlZ2lzdGVyIHN0YWNrIHRoYXQncyBpbiByZWFsIHJlZ2lzdGVycywKKyAgICAgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSByZWdpc3RlcnMuICBJZiBpdCdzIGFueXdoZXJlIGVsc2UgaW4gbWVtb3J5CisgICAgIChlLmcuIGluIGFub3RoZXIgdGhyZWFkJ3Mgc2F2ZWQgc3RhY2spLCBza2lwIHRoaXMgcGFydCBhbmQgZ2V0CisgICAgIGl0IGZyb20gcmVhbCBsaXZlIG1lbW9yeS4gICovCisgIGVsc2UgaWYgKG1lbWFkZHIgPCByZmIgJiYgbWVtYWRkciA+PSByc3ApCisgICAgeworICAgICAgLyogSXQncyBpbiBhIHJlZ2lzdGVyLiAgKi8KKyAgICAgIGludCByZWdudW0gPSAobWVtYWRkciAtIHJzcCkgLyA0ICsgTFIwX1JFR05VTTsKKyAgICAgIGlmIChyZWdudW0gPiBMUjBfUkVHTlVNICsgMTI3KQorCWVycm9yICgiQXR0ZW1wdCB0byByZWFkIHJlZ2lzdGVyIHN0YWNrIG91dCBvZiByYW5nZS4iKTsKKyAgICAgIGlmIChteWFkZHIgIT0gTlVMTCkKKwlyZWFkX3JlZ2lzdGVyX2dlbiAocmVnbnVtLCBteWFkZHIpOworICAgICAgaWYgKGx2YWwgIT0gTlVMTCkKKwkqbHZhbCA9IGx2YWxfcmVnaXN0ZXI7CisgICAgICBpZiAoYWN0dWFsX21lbV9hZGRyICE9IE5VTEwpCisJKmFjdHVhbF9tZW1fYWRkciA9IFJFR0lTVEVSX0JZVEUgKHJlZ251bSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogSXQncyBpbiB0aGUgbWVtb3J5IHBvcnRpb24gb2YgdGhlIHJlZ2lzdGVyIHN0YWNrLiAgKi8KKyAgICAgIGlmIChteWFkZHIgIT0gTlVMTCkgCisJcmVhZF9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgNCk7CisgICAgICBpZiAobHZhbCAhPSBOVUxMKQorCSpsdmFsID0gbHZhbF9tZW1vcnk7CisgICAgICBpZiAoYWN0dWFsX21lbV9hZGRyICE9IE5VTEwpCisJKmFjdHVhbF9tZW1fYWRkciA9IG1lbWFkZHI7CisgICAgfQorfQorCisvKiBBbmFsb2dvdXMgdG8gcmVhZF9tZW1vcnlfaW50ZWdlcgorICAgZXhjZXB0IHRoZSBsZW5ndGggaXMgdW5kZXJzdG9vZCB0byBiZSA0LiAgKi8KK2xvbmcKK3JlYWRfcmVnaXN0ZXJfc3RhY2tfaW50ZWdlciAobWVtYWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgY2hhciBidWZbNF07CisgIHJlYWRfcmVnaXN0ZXJfc3RhY2sgKG1lbWFkZHIsIGJ1ZiwgTlVMTCwgTlVMTCk7CisgIHJldHVybiBleHRyYWN0X3NpZ25lZF9pbnRlZ2VyIChidWYsIDQpOworfQorCisvKiBDb3B5IDQgYnl0ZXMgZnJvbSBHREIgbWVtb3J5IGF0IE1ZQUREUiBpbnRvIGluZmVyaW9yIG1lbW9yeQorICAgYXQgTUVNQUREUiBhbmQgcHV0IHRoZSBhY3R1YWwgYWRkcmVzcyB3cml0dGVuIGludG8gaW4KKyAgICpBQ1RVQUxfTUVNX0FERFIuICAqLworc3RhdGljIHZvaWQKK3dyaXRlX3JlZ2lzdGVyX3N0YWNrIChtZW1hZGRyLCBteWFkZHIsIGFjdHVhbF9tZW1fYWRkcikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgQ09SRV9BRERSICphY3R1YWxfbWVtX2FkZHI7Cit7CisgIGxvbmcgcmZiID0gcmVhZF9yZWdpc3RlciAoUkZCX1JFR05VTSk7CisgIGxvbmcgcnNwID0gcmVhZF9yZWdpc3RlciAoUlNQX1JFR05VTSk7CisgIC8qIElmIHdlIGRvbid0IGRvIHRoaXMgJ2luZm8gcmVnaXN0ZXInIHN0b3BzIGluIHRoZSBtaWRkbGUuICovCisgIGlmIChtZW1hZGRyID49IHJzdGFja19oaWdoX2FkZHJlc3MpIAorICAgIHsKKyAgICAgIC8qIEl0J3MgaW4gYSByZWdpc3RlciwgYnV0IG9mZiB0aGUgZW5kIG9mIHRoZSBzdGFjay4gICovCisgICAgICBpZiAoYWN0dWFsX21lbV9hZGRyICE9IE5VTEwpCisJKmFjdHVhbF9tZW1fYWRkciA9IDA7IAorICAgIH0KKyAgZWxzZSBpZiAobWVtYWRkciA8IHJmYikKKyAgICB7CisgICAgICAvKiBJdCdzIGluIGEgcmVnaXN0ZXIuICAqLworICAgICAgaW50IHJlZ251bSA9IChtZW1hZGRyIC0gcnNwKSAvIDQgKyBMUjBfUkVHTlVNOworICAgICAgaWYgKHJlZ251bSA8IExSMF9SRUdOVU0gfHwgcmVnbnVtID4gTFIwX1JFR05VTSArIDEyNykKKwllcnJvciAoIkF0dGVtcHQgdG8gcmVhZCByZWdpc3RlciBzdGFjayBvdXQgb2YgcmFuZ2UuIik7CisgICAgICBpZiAobXlhZGRyICE9IE5VTEwpCisJd3JpdGVfcmVnaXN0ZXIgKHJlZ251bSwgKihsb25nICopbXlhZGRyKTsKKyAgICAgIGlmIChhY3R1YWxfbWVtX2FkZHIgIT0gTlVMTCkKKwkqYWN0dWFsX21lbV9hZGRyID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJdCdzIGluIHRoZSBtZW1vcnkgcG9ydGlvbiBvZiB0aGUgcmVnaXN0ZXIgc3RhY2suICAqLworICAgICAgaWYgKG15YWRkciAhPSBOVUxMKQorCXdyaXRlX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCA0KTsKKyAgICAgIGlmIChhY3R1YWxfbWVtX2FkZHIgIT0gTlVMTCkKKwkqYWN0dWFsX21lbV9hZGRyID0gbWVtYWRkcjsKKyAgICB9Cit9CisMCisvKiBGaW5kIHJlZ2lzdGVyIG51bWJlciBSRUdOVU0gcmVsYXRpdmUgdG8gRlJBTUUgYW5kIHB1dCBpdHMKKyAgIChyYXcpIGNvbnRlbnRzIGluICpSQVdfQlVGRkVSLiAgU2V0ICpPUFRJTUlaRUQgaWYgdGhlIHZhcmlhYmxlCisgICB3YXMgb3B0aW1pemVkIG91dCAoYW5kIHRodXMgY2FuJ3QgYmUgZmV0Y2hlZCkuICBJZiB0aGUgdmFyaWFibGUKKyAgIHdhcyBmZXRjaGVkIGZyb20gbWVtb3J5LCBzZXQgKkFERFJQIHRvIHdoZXJlIGl0IHdhcyBmZXRjaGVkIGZyb20sCisgICBvdGhlcndpc2UgaXQgd2FzIGZldGNoZWQgZnJvbSBhIHJlZ2lzdGVyLgorCisgICBUaGUgYXJndW1lbnQgUkFXX0JVRkZFUiBtdXN0IHBvaW50IHRvIGFsaWduZWQgbWVtb3J5LiAgKi8KKwordm9pZAorZ2V0X3NhdmVkX3JlZ2lzdGVyIChyYXdfYnVmZmVyLCBvcHRpbWl6ZWQsIGFkZHJwLCBmcmFtZSwgcmVnbnVtLCBsdmFscCkKKyAgICAgY2hhciAqcmF3X2J1ZmZlcjsKKyAgICAgaW50ICpvcHRpbWl6ZWQ7CisgICAgIENPUkVfQUREUiAqYWRkcnA7CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKKyAgICAgaW50IHJlZ251bTsKKyAgICAgZW51bSBsdmFsX3R5cGUgKmx2YWxwOworeworICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7CisgIENPUkVfQUREUiBhZGRyOworICBlbnVtIGx2YWxfdHlwZSBsdmFsOworCisgIGlmICghdGFyZ2V0X2hhc19yZWdpc3RlcnMpCisgICAgZXJyb3IgKCJObyByZWdpc3RlcnMuIik7CisKKyAgLyogUHJvYmFibHkgbm93IHJlZHVuZGFudCB3aXRoIHRoZSB0YXJnZXRfaGFzX3JlZ2lzdGVycyBjaGVjay4gICovCisgIGlmIChmcmFtZSA9PSAwKQorICAgIHJldHVybjsKKworICAvKiBPbmNlIHNvbWV0aGluZyBoYXMgYSByZWdpc3RlciBudW1iZXIsIGl0IGRvZXNuJ3QgZ2V0IG9wdGltaXplZCBvdXQuICAqLworICBpZiAob3B0aW1pemVkICE9IE5VTEwpCisgICAgKm9wdGltaXplZCA9IDA7CisgIGlmIChyZWdudW0gPT0gUlNQX1JFR05VTSkKKyAgICB7CisgICAgICBpZiAocmF3X2J1ZmZlciAhPSBOVUxMKQorCXsKKwkgIHN0b3JlX2FkZHJlc3MgKHJhd19idWZmZXIsIFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pLCBmcmFtZS0+ZnJhbWUpOworCX0KKyAgICAgIGlmIChsdmFscCAhPSBOVUxMKQorCSpsdmFscCA9IG5vdF9sdmFsOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZSBpZiAocmVnbnVtID09IFBDX1JFR05VTSAmJiBmcmFtZS0+bmV4dCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChyYXdfYnVmZmVyICE9IE5VTEwpCisJeworCSAgc3RvcmVfYWRkcmVzcyAocmF3X2J1ZmZlciwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSksIGZyYW1lLT5wYyk7CisJfQorCisgICAgICAvKiBOb3Qgc3VyZSB3ZSBoYXZlIHRvIGRvIHRoaXMuICAqLworICAgICAgaWYgKGx2YWxwICE9IE5VTEwpCisJKmx2YWxwID0gbm90X2x2YWw7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UgaWYgKHJlZ251bSA9PSBNU1BfUkVHTlVNKQorICAgIHsKKyAgICAgIGlmIChyYXdfYnVmZmVyICE9IE5VTEwpCisJeworCSAgaWYgKGZyYW1lLT5uZXh0ICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBzdG9yZV9hZGRyZXNzIChyYXdfYnVmZmVyLCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbnVtKSwKKwkJCSAgICAgZnJhbWUtPm5leHQtPnNhdmVkX21zcCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgcmVhZF9yZWdpc3Rlcl9nZW4gKE1TUF9SRUdOVU0sIHJhd19idWZmZXIpOworCX0KKyAgICAgIC8qIFRoZSB2YWx1ZSBtYXkgaGF2ZSBiZWVuIGNvbXB1dGVkLCBub3QgZmV0Y2hlZC4gICovCisgICAgICBpZiAobHZhbHAgIT0gTlVMTCkKKwkqbHZhbHAgPSBub3RfbHZhbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UgaWYgKHJlZ251bSA8IExSMF9SRUdOVU0gfHwgcmVnbnVtID49IExSMF9SRUdOVU0gKyAxMjgpCisgICAgeworICAgICAgLyogVGhlc2UgcmVnaXN0ZXJzIGFyZSBub3Qgc2F2ZWQgb3ZlciBwcm9jZWR1cmUgY2FsbHMsCisJIHNvIGp1c3QgcHJpbnQgb3V0IHRoZSBjdXJyZW50IHZhbHVlcy4gICovCisgICAgICBpZiAocmF3X2J1ZmZlciAhPSBOVUxMKQorCXJlYWRfcmVnaXN0ZXJfZ2VuIChyZWdudW0sIHJhd19idWZmZXIpOworICAgICAgaWYgKGx2YWxwICE9IE5VTEwpCisJKmx2YWxwID0gbHZhbF9yZWdpc3RlcjsKKyAgICAgIGlmIChhZGRycCAhPSBOVUxMKQorCSphZGRycCA9IFJFR0lTVEVSX0JZVEUgKHJlZ251bSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgICAgCisgIGFkZHIgPSBmcmFtZS0+ZnJhbWUgKyAocmVnbnVtIC0gTFIwX1JFR05VTSkgKiA0OworICBpZiAocmF3X2J1ZmZlciAhPSBOVUxMKQorICAgIHJlYWRfcmVnaXN0ZXJfc3RhY2sgKGFkZHIsIHJhd19idWZmZXIsICZhZGRyLCAmbHZhbCk7CisgIGlmIChsdmFscCAhPSBOVUxMKQorICAgICpsdmFscCA9IGx2YWw7CisgIGlmIChhZGRycCAhPSBOVUxMKQorICAgICphZGRycCA9IGFkZHI7Cit9CisMCisKKy8qIERpc2NhcmQgZnJvbSB0aGUgc3RhY2sgdGhlIGlubmVybW9zdCBmcmFtZSwKKyAgIHJlc3RvcmluZyBhbGwgc2F2ZWQgcmVnaXN0ZXJzLiAgKi8KKwordm9pZAorcG9wX2ZyYW1lICgpCit7CisgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZSA9IGdldF9jdXJyZW50X2ZyYW1lICgpOworICBDT1JFX0FERFIgcmZiID0gcmVhZF9yZWdpc3RlciAoUkZCX1JFR05VTSk7CQkgICAgICAKKyAgQ09SRV9BRERSIGdyMSA9IGZyYW1lLT5mcmFtZSArIGZyYW1lLT5yc2l6ZTsKKyAgQ09SRV9BRERSIGxyMTsJCQkJCQkJICAgICAgCisgIENPUkVfQUREUiBvcmlnaW5hbF9scjA7CisgIGludCBtdXN0X2ZpeF9scjAgPSAwOworICBpbnQgaTsKKworICAvKiBJZiBwb3BwaW5nIGEgZHVtbXkgZnJhbWUsIG5lZWQgdG8gcmVzdG9yZSByZWdpc3RlcnMuICAqLworICBpZiAoUENfSU5fQ0FMTF9EVU1NWSAocmVhZF9yZWdpc3RlciAoUENfUkVHTlVNKSwKKwkJCXJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSksCisJCQlGUkFNRV9GUCAoZnJhbWUpKSkKKyAgICB7CisgICAgICBpbnQgbHJudW0gPSBMUjBfUkVHTlVNICsgRFVNTVlfQVJHLzQ7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgRFVNTVlfU0FWRV9TUjEyODsgKytpKQorCXdyaXRlX3JlZ2lzdGVyIChTUl9SRUdOVU0gKGkgKyAxMjgpLHJlYWRfcmVnaXN0ZXIgKGxybnVtKyspKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBEVU1NWV9TQVZFX1NSMTYwOyArK2kpCisJd3JpdGVfcmVnaXN0ZXIgKFNSX1JFR05VTShpKzE2MCksIHJlYWRfcmVnaXN0ZXIgKGxybnVtKyspKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBEVU1NWV9TQVZFX0dSRUdTOyArK2kpCisJd3JpdGVfcmVnaXN0ZXIgKFJFVFVSTl9SRUdOVU0gKyBpLCByZWFkX3JlZ2lzdGVyIChscm51bSsrKSk7CisgICAgICAvKiBSZXN0b3JlIHRoZSBQQ3MgYW5kIHByZXBhcmUgdG8gcmVzdG9yZSBMUjAuICAqLworICAgICAgd3JpdGVfcmVnaXN0ZXIoUENfUkVHTlVNLCByZWFkX3JlZ2lzdGVyIChscm51bSsrKSk7CisgICAgICB3cml0ZV9yZWdpc3RlcihOUENfUkVHTlVNLCByZWFkX3JlZ2lzdGVyIChscm51bSsrKSk7CisgICAgICB3cml0ZV9yZWdpc3RlcihQQzJfUkVHTlVNLCByZWFkX3JlZ2lzdGVyIChscm51bSsrKSk7CisgICAgICBvcmlnaW5hbF9scjAgPSByZWFkX3JlZ2lzdGVyIChscm51bSsrKTsKKyAgICAgIG11c3RfZml4X2xyMCA9IDE7CisgICAgfQorCisgIC8qIFJlc3RvcmUgdGhlIG1lbW9yeSBzdGFjayBwb2ludGVyLiAgKi8KKyAgd3JpdGVfcmVnaXN0ZXIgKE1TUF9SRUdOVU0sIGZyYW1lLT5zYXZlZF9tc3ApOworICAvKiBSZXN0b3JlIHRoZSByZWdpc3RlciBzdGFjayBwb2ludGVyLiAgKi8JCQkJICAgICAgCisgIHdyaXRlX3JlZ2lzdGVyIChHUjFfUkVHTlVNLCBncjEpOworCisgIC8qIElmIHdlIHBvcHBlZCBhIGR1bW15IGZyYW1lLCByZXN0b3JlIGxyMCBub3cgdGhhdCBncjEgaGFzIGJlZW4gcmVzdG9yZWQuICovCisgIGlmIChtdXN0X2ZpeF9scjApIAorICAgIHdyaXRlX3JlZ2lzdGVyIChMUjBfUkVHTlVNLCBvcmlnaW5hbF9scjApOworCisgIC8qIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBmaWxsIHJlZ2lzdGVycy4gICovCQkJICAgICAgCisgIGxyMSA9IHJlYWRfcmVnaXN0ZXIgKExSMF9SRUdOVU0gKyAxKTsJCQkJICAgICAgCisgIGlmIChscjEgPiByZmIpCQkJCQkJCSAgICAgIAorICAgIHsJCQkJCQkJCQkgICAgICAKKyAgICAgIC8qIEZpbGwuICAqLwkJCQkJCQkgICAgICAKKyAgICAgIGludCBudW1fYnl0ZXMgPSBscjEgLSByZmI7CisgICAgICBpbnQgaTsJCQkJCQkJCSAgICAgIAorICAgICAgbG9uZyB3b3JkOworCQkJCQkJICAgICAgCisgICAgICB3cml0ZV9yZWdpc3RlciAoUkFCX1JFR05VTSwgcmVhZF9yZWdpc3RlciAoUkFCX1JFR05VTSkgKyBudW1fYnl0ZXMpOyAgCisgICAgICB3cml0ZV9yZWdpc3RlciAoUkZCX1JFR05VTSwgbHIxKTsJCQkJICAgICAgCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2J5dGVzOyBpICs9IDQpCQkJCSAgICAgIAorICAgICAgICB7CisJICAvKiBOb3RlOiB3b3JkIGlzIGluIGhvc3QgYnl0ZSBvcmRlci4gICovCisgICAgICAgICAgd29yZCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHJmYiArIGksIDQpOworICAgICAgICAgIHdyaXRlX3JlZ2lzdGVyIChMUjBfUkVHTlVNICsgKChyZmIgLSBncjEpICUgMHg4MCkgKyBpIC8gNCwgd29yZCk7CisgICAgICAgIH0JCQkJCQkJCSAgICAgIAorICAgIH0KKyAgZmx1c2hfY2FjaGVkX2ZyYW1lcyAoKTsJCQkJCQkgICAgICAKK30KKworLyogUHVzaCBhbiBlbXB0eSBzdGFjayBmcmFtZSwgdG8gcmVjb3JkIHRoZSBjdXJyZW50IFBDLCBldGMuICAqLworCit2b2lkIAorcHVzaF9kdW1teV9mcmFtZSAoKQoreworICBsb25nIHc7CisgIENPUkVfQUREUiByYWIsIGdyMTsKKyAgQ09SRV9BRERSIG1zcCA9IHJlYWRfcmVnaXN0ZXIgKE1TUF9SRUdOVU0pOworICBpbnQgbHJudW0sIGk7CisgIENPUkVfQUREUiBvcmlnaW5hbF9scjA7CisgICAgICAKKyAgLyogUmVhZCBvcmlnaW5hbCBscjAgYmVmb3JlIGNoYW5naW5nIGdyMS4gIFRoaXMgb3JkZXIgaXNuJ3QgcmVhbGx5IG5lZWRlZAorICAgICBzaW5jZSBHREIgaGFwcGVucyB0byBoYXZlIGEgc25hcHNob3Qgb2YgYWxsIHRoZSByZWdzIGFuZCBkb2Vzbid0IHRvc3MKKyAgICAgaXQgd2hlbiBncjEgaXMgY2hhbmdlZC4gIEJ1dCBpdCdzIFRoZSBSaWdodCBUaGluZyBUbyBEby4gICovCisgIG9yaWdpbmFsX2xyMCA9IHJlYWRfcmVnaXN0ZXIgKExSMF9SRUdOVU0pOworCisgIC8qIEFsbG9jYXRlIHRoZSBuZXcgZnJhbWUuICovIAorICBncjEgPSByZWFkX3JlZ2lzdGVyIChHUjFfUkVHTlVNKSAtIERVTU1ZX0ZSQU1FX1JTSVpFOworICB3cml0ZV9yZWdpc3RlciAoR1IxX1JFR05VTSwgZ3IxKTsKKworI2lmZGVmIFZYV09SS1NfVEFSR0VUCisgIC8qIFdlIGZvcmNlIHJlLXJlYWRpbmcgYWxsIHJlZ2lzdGVycyB0byBnZXQgdGhlIG5ldyBsb2NhbCByZWdpc3RlcnMgc2V0CisgICAgIGFmdGVyIGdyMSBoYXMgYmVlbiBtb2RpZmllZC4gVGhpcyBmaXggaXMgZHVlIHRvIHRoZSBsYWNrIG9mIHNpbmdsZQorICAgICByZWdpc3RlciByZWFkL3dyaXRlIG9wZXJhdGlvbiBpbiB0aGUgUlBDIGludGVyZmFjZSBiZXR3ZWVuIFZ4R0RCIGFuZAorICAgICBWeFdvcmtzLiBUaGlzIHJlYWxseSBtdXN0IGJlIGNoYW5nZWQgISAqLworCisgIHZ4X3JlYWRfcmVnaXN0ZXIgKC0xKTsKKworI2VuZGlmIC8qIFZYV09SS19UQVJHRVQgKi8KKworICByYWIgPSByZWFkX3JlZ2lzdGVyIChSQUJfUkVHTlVNKTsKKyAgaWYgKGdyMSA8IHJhYikKKyAgICB7CisgICAgICAvKiBXZSBuZWVkIHRvIHNwaWxsIHJlZ2lzdGVycy4gICovCisgICAgICBpbnQgbnVtX2J5dGVzID0gcmFiIC0gZ3IxOworICAgICAgQ09SRV9BRERSIHJmYiA9IHJlYWRfcmVnaXN0ZXIgKFJGQl9SRUdOVU0pOworICAgICAgaW50IGk7CisgICAgICBsb25nIHdvcmQ7CisKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChSRkJfUkVHTlVNLCByZmIgLSBudW1fYnl0ZXMpOworICAgICAgd3JpdGVfcmVnaXN0ZXIgKFJBQl9SRUdOVU0sIGdyMSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2J5dGVzOyBpICs9IDQpCisJeworCSAgLyogTm90ZTogIHdvcmQgaXMgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuICAqLworCSAgcmVhZF9yZWdpc3Rlcl9nZW4gKExSMF9SRUdOVU0gKyBpIC8gNCwgKGNoYXIgKikgJndvcmQpOworCSAgd3JpdGVfbWVtb3J5IChyZmIgLSBudW1fYnl0ZXMgKyBpLCAoY2hhciAqKSAmd29yZCwgNCk7CisJfQorICAgIH0KKworICAvKiBUaGVyZSBhcmUgbm8gYXJndW1lbnRzIGluIHRvIHRoZSBkdW1teSBmcmFtZSwgc28gd2UgZG9uJ3QgbmVlZAorICAgICBtb3JlIHRoYW4gcnNpemUgcGx1cyB0aGUgcmV0dXJuIGFkZHJlc3MgYW5kIGxyMS4gICovCisgIHdyaXRlX3JlZ2lzdGVyIChMUjBfUkVHTlVNICsgMSwgZ3IxICsgRFVNTVlfRlJBTUVfUlNJWkUgKyAyICogNCk7CisKKyAgLyogU2V0IHRoZSBtZW1vcnkgZnJhbWUgcG9pbnRlci4gICovCisgIHdyaXRlX3JlZ2lzdGVyIChMUjBfUkVHTlVNICsgRFVNTVlfRlJBTUVfUlNJWkUgLyA0IC0gMSwgbXNwKTsKKworICAvKiBBbGxvY2F0ZSBhcmdfc2xvcC4gICovCisgIHdyaXRlX3JlZ2lzdGVyIChNU1BfUkVHTlVNLCBtc3AgLSAxNiAqIDQpOworCisgIC8qIFNhdmUgcmVnaXN0ZXJzLiAgKi8KKyAgbHJudW0gPSBMUjBfUkVHTlVNICsgRFVNTVlfQVJHLzQ7CisgIGZvciAoaSA9IDA7IGkgPCBEVU1NWV9TQVZFX1NSMTI4OyArK2kpCisgICAgd3JpdGVfcmVnaXN0ZXIgKGxybnVtKyssIHJlYWRfcmVnaXN0ZXIgKFNSX1JFR05VTSAoaSArIDEyOCkpKTsKKyAgZm9yIChpID0gMDsgaSA8IERVTU1ZX1NBVkVfU1IxNjA7ICsraSkKKyAgICB3cml0ZV9yZWdpc3RlciAobHJudW0rKywgcmVhZF9yZWdpc3RlciAoU1JfUkVHTlVNIChpICsgMTYwKSkpOworICBmb3IgKGkgPSAwOyBpIDwgRFVNTVlfU0FWRV9HUkVHUzsgKytpKQorICAgIHdyaXRlX3JlZ2lzdGVyIChscm51bSsrLCByZWFkX3JlZ2lzdGVyIChSRVRVUk5fUkVHTlVNICsgaSkpOworICAvKiBTYXZlIHRoZSBQQ3MgYW5kIExSMC4gICovCisgIHdyaXRlX3JlZ2lzdGVyIChscm51bSsrLCByZWFkX3JlZ2lzdGVyIChQQ19SRUdOVU0pKTsKKyAgd3JpdGVfcmVnaXN0ZXIgKGxybnVtKyssIHJlYWRfcmVnaXN0ZXIgKE5QQ19SRUdOVU0pKTsKKyAgd3JpdGVfcmVnaXN0ZXIgKGxybnVtKyssIHJlYWRfcmVnaXN0ZXIgKFBDMl9SRUdOVU0pKTsKKworICAvKiBXaHkgYXJlIHdlIHNhdmluZyBMUjA/ICBXaGF0IHdvdWxkIGNsb2JiZXIgaXQ/ICh0aGUgZHVtbXkgZnJhbWUgc2hvdWxkCisgICAgIGJlIGJlbG93IGl0IG9uIHRoZSByZWdpc3RlciBzdGFjaywgbm8/KS4gICovCisgIHdyaXRlX3JlZ2lzdGVyIChscm51bSsrLCBvcmlnaW5hbF9scjApOworfQorCisKKworLyoKKyAgIFRoaXMgcm91dGluZSB0YWtlcyB0aHJlZSBhcmd1bWVudHMgYW5kIG1ha2VzIHRoZSBjYWNoZWQgZnJhbWVzIGxvb2sKKyAgIGFzIGlmIHRoZXNlIGFyZ3VtZW50cyBkZWZpbmVkIGEgZnJhbWUgb24gdGhlIGNhY2hlLiAgVGhpcyBhbGxvd3MgdGhlCisgICByZXN0IG9mIGBpbmZvIGZyYW1lJyB0byBleHRyYWN0IHRoZSBpbXBvcnRhbnQgYXJndW1lbnRzIHdpdGhvdXQgbXVjaAorICAgZGlmZmljdWx0eS4gIFNpbmNlIGFuIGluZGl2aWR1YWwgZnJhbWUgb24gdGhlIDI5SyBpcyBkZXRlcm1pbmVkIGJ5CisgICB0aHJlZSB2YWx1ZXMgKEZQLCBQQywgYW5kIE1TUCksIHdlIHJlYWxseSBuZWVkIGFsbCB0aHJlZSB0byBkbyBhCisgICBnb29kIGpvYi4gICovCisKK3N0cnVjdCBmcmFtZV9pbmZvICoKK3NldHVwX2FyYml0cmFyeV9mcmFtZSAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIENPUkVfQUREUiAqYXJndjsKK3sKKyAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworCisgIGlmIChhcmdjICE9IDMpCisgICAgZXJyb3IgKCJBTUQgMjlrIGZyYW1lIHNwZWNpZmljYXRpb25zIHJlcXVpcmUgdGhyZWUgYXJndW1lbnRzOiByc3AgcGMgbXNwIik7CisKKyAgZnJhbWUgPSBjcmVhdGVfbmV3X2ZyYW1lIChhcmd2WzBdLCBhcmd2WzFdKTsKKworICBpZiAoIWZyYW1lKQorICAgIGZhdGFsICgiaW50ZXJuYWw6IGNyZWF0ZV9uZXdfZnJhbWUgcmV0dXJuZWQgaW52YWxpZCBmcmFtZSBpZCIpOworICAKKyAgLyogQ3JlYXRpbmcgYSBuZXcgZnJhbWUgbXVuZ2VzIHRoZSBgZnJhbWUnIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQKKyAgICAgR1IxLCBzbyB3ZSByZXN0b3JlIGl0IGFnYWluIGhlcmUuICBGSVhNRSwgdW50YW5nbGUgYWxsIHRoaXMKKyAgICAgMjlLIGZyYW1lIHN0dWZmLi4uICAqLworICBmcmFtZS0+ZnJhbWUgPSBhcmd2WzBdOworCisgIC8qIE91ciBNU1AgaXMgaW4gYXJndlsyXS4gIEl0J2QgYmUgaW50ZWxsaWdlbnQgaWYgd2UgY291bGQganVzdAorICAgICBzYXZlIHRoaXMgdmFsdWUgaW4gdGhlIEZSQU1FLiAgQnV0IHRoZSB3YXkgaXQncyBzZXQgdXAgKEZJWE1FKSwKKyAgICAgd2UgbXVzdCBzYXZlIG91ciBjYWxsZXIncyBNU1AuICBXZSBjb21wdXRlIHRoYXQgYnkgYWRkaW5nIG91cgorICAgICBtZW1vcnkgc3RhY2sgZnJhbWUgc2l6ZSB0byBvdXIgTVNQLiAgKi8KKyAgZnJhbWUtPnNhdmVkX21zcCA9IGFyZ3ZbMl0gKyBmcmFtZS0+bXNpemU7CisKKyAgcmV0dXJuIGZyYW1lOworfQorCitpbnQKK2dkYl9wcmludF9pbnNuX2EyOWsgKG1lbWFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgaWYgKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pCisgICAgcmV0dXJuIHByaW50X2luc25fYmlnX2EyOWsgKG1lbWFkZHIsIGluZm8pOworICBlbHNlCisgICAgcmV0dXJuIHByaW50X2luc25fbGl0dGxlX2EyOWsgKG1lbWFkZHIsIGluZm8pOworfQorCitlbnVtIGEyOWtfcHJvY2Vzc29yX3R5cGVzIHByb2Nlc3Nvcl90eXBlID0gYTI5a191bmtub3duOworCit2b2lkCithMjlrX2dldF9wcm9jZXNzb3JfdHlwZSAoKQoreworICB1bnNpZ25lZCBpbnQgY2ZnX3JlZyA9ICh1bnNpZ25lZCBpbnQpIHJlYWRfcmVnaXN0ZXIgKENGR19SRUdOVU0pOworCisgIC8qIE1vc3Qgb2YgdGhlc2UgZG9uJ3QgaGF2ZSBmcmVlemUgbW9kZS4gICovCisgIHByb2Nlc3Nvcl90eXBlID0gYTI5a19ub19mcmVlemVfbW9kZTsKKworICBzd2l0Y2ggKChjZmdfcmVnID4+IDI4KSAmIDB4ZikKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlJlbW90ZSBkZWJ1Z2dpbmcgYW4gQW0yOTAwMCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlJlbW90ZSBkZWJ1Z2dpbmcgYW4gQW0yOTAwNSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlJlbW90ZSBkZWJ1Z2dpbmcgYW4gQW0yOTA1MCIpOworICAgICAgcHJvY2Vzc29yX3R5cGUgPSBhMjlrX2ZyZWV6ZV9tb2RlOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlJlbW90ZSBkZWJ1Z2dpbmcgYW4gQW0yOTAzNSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlJlbW90ZSBkZWJ1Z2dpbmcgYW4gQW0yOTAzMCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlJlbW90ZSBkZWJ1Z2dpbmcgYW4gQW0yOTIwKiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlJlbW90ZSBkZWJ1Z2dpbmcgYW4gQW0yOTI0KiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlJlbW90ZSBkZWJ1Z2dpbmcgYW4gQW0yOTA0MCIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJSZW1vdGUgZGVidWdnaW5nIGFuIHVua25vd24gQW0yOWtcbiIpOworICAgICAgLyogRG9uJ3QgYm90aGVyIHRvIHByaW50IHRoZSByZXZpc2lvbi4gICovCisgICAgICByZXR1cm47CisgICAgfQorICBmcHJpbnRmX2ZpbHRlcmVkIChnZGJfc3RkZXJyLCAiIHJldmlzaW9uICVjXG4iLCAnQScgKyAoKGNmZ19yZWcgPj4gMjQpICYgMHgwZikpOworfQorCisjaWZkZWYgR0VUX0xPTkdKTVBfVEFSR0VUCisvKiBGaWd1cmUgb3V0IHdoZXJlIHRoZSBsb25nam1wIHdpbGwgbGFuZC4gIFdlIGV4cGVjdCB0aGF0IHdlIGhhdmUganVzdCBlbnRlcmVkCisgIGxvbmdqbXAgYW5kIGhhdmVuJ3QgeWV0IHNldHVwIHRoZSBzdGFjayBmcmFtZSwgc28gdGhlIGFyZ3MgYXJlIHN0aWxsIGluIHRoZQorICAgb3V0cHV0IHJlZ3MuICBscjIgKExSMl9SRUdOVU0pIHBvaW50cyBhdCB0aGUgam1wX2J1ZiBzdHJ1Y3R1cmUgZnJvbSB3aGljaCB3ZQorICAgZXh0cmFjdCB0aGUgcGMgKEpCX1BDKSB0aGF0IHdlIHdpbGwgbGFuZCBhdC4gIFRoZSBwYyBpcyBjb3BpZWQgaW50byBBRERSLgorICAgVGhpcyByb3V0aW5lIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzICovCisKK2ludAorZ2V0X2xvbmdqbXBfdGFyZ2V0KHBjKQorICAgICBDT1JFX0FERFIgKnBjOworeworICBDT1JFX0FERFIgamJfYWRkcjsKKyAgY2hhciBidWZbc2l6ZW9mKENPUkVfQUREUildOworCisgIGpiX2FkZHIgPSByZWFkX3JlZ2lzdGVyKExSMl9SRUdOVU0pOworCisgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkoamJfYWRkciArIEpCX1BDICogSkJfRUxFTUVOVF9TSVpFLCAoY2hhciAqKSBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENPUkVfQUREUikpKQorICAgIHJldHVybiAwOworCisgICpwYyA9IGV4dHJhY3RfYWRkcmVzcyAoKFBUUikgYnVmLCBzaXplb2YoQ09SRV9BRERSKSk7CisgIHJldHVybiAxOworfQorI2VuZGlmIC8qIEdFVF9MT05HSk1QX1RBUkdFVCAqLworCit2b2lkCitfaW5pdGlhbGl6ZV9hMjlrX3RkZXAgKCkKK3sKKyAgZXh0ZXJuIENPUkVfQUREUiB0ZXh0X2VuZDsKKworICB0bV9wcmludF9pbnNuID0gZ2RiX3ByaW50X2luc25fYTI5azsKKworICAvKiBGSVhNRSwgdGhlcmUgc2hvdWxkIGJlIGEgd2F5IHRvIG1ha2UgYSBDT1JFX0FERFIgdmFyaWFibGUgc2V0dGFibGUuICovCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgicnN0YWNrX2hpZ2hfYWRkcmVzcyIsIGNsYXNzX3N1cHBvcnQsIHZhcl91aW50ZWdlciwKKwkJICAoY2hhciAqKSZyc3RhY2tfaGlnaF9hZGRyZXNzLAorCQkgICJTZXQgdG9wIGFkZHJlc3MgaW4gbWVtb3J5IG9mIHRoZSByZWdpc3RlciBzdGFjay5cblwKK0F0dGVtcHRzIHRvIGFjY2VzcyByZWdpc3RlcnMgc2F2ZWQgYWJvdmUgdGhpcyBhZGRyZXNzIHdpbGwgYmUgaWdub3JlZFxuXAorb3Igd2lsbCBwcm9kdWNlIHRoZSB2YWx1ZSAtMS4iLCAmc2V0bGlzdCksCisgICAgICZzaG93bGlzdCk7CisKKyAgLyogRklYTUUsIHRoZXJlIHNob3VsZCBiZSBhIHdheSB0byBtYWtlIGEgQ09SRV9BRERSIHZhcmlhYmxlIHNldHRhYmxlLiAqLworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoImNhbGxfc2NyYXRjaF9hZGRyZXNzIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX3VpbnRlZ2VyLAorCQkgIChjaGFyICopJnRleHRfZW5kLAorIlNldCBhZGRyZXNzIGluIG1lbW9yeSB3aGVyZSBzbWFsbCBhbW91bnRzIG9mIFJBTSBjYW4gYmUgdXNlZFxuXAord2hlbiBtYWtpbmcgZnVuY3Rpb24gY2FsbHMgaW50byB0aGUgaW5mZXJpb3IuIiwgJnNldGxpc3QpLAorICAgICAmc2hvd2xpc3QpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2E2OHYtbmF0LmMgYi9nZGIvYTY4di1uYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWJiM2M4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2E2OHYtbmF0LmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qIEhvc3QtZGVwZW5kZW50IGNvZGUgZm9yIEFwb2xsby02OGtzIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisKKyNpZm5kZWYgX0lTUF9fTTY4SworI2RlZmluZSBfSVNQX19NNjhLIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8cHRyYWNlLmg+CisKK2V4dGVybiBpbnQgZXJybm87CisKK3ZvaWQKK2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoaWdub3JlZCkKKyAgICBpbnQgaWdub3JlZDsKK3sKKyAgc3RydWN0IHB0cmFjZV8kZGF0YV9yZWdzX202OGsgaW5mZXJpb3JfcmVnaXN0ZXJzOworICBzdHJ1Y3QgcHRyYWNlXyRmbG9hdGluZ19yZWdzX202OGsgaW5mZXJpb3JfZnBfcmVnaXN0ZXJzOworICBzdHJ1Y3QgcHRyYWNlXyRjb250cm9sX3JlZ3NfbTY4ayBpbmZlcmlvcl9jb250cm9sX3JlZ2lzdGVyczsKKyAgZXh0ZXJuIGNoYXIgcmVnaXN0ZXJzW107CisKKyAgcHRyYWNlXyRpbml0X2NvbnRyb2woJmluZmVyaW9yX2NvbnRyb2xfcmVnaXN0ZXJzKTsKKyAgaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLnNpemUgPSBzaXplb2YoaW5mZXJpb3JfZnBfcmVnaXN0ZXJzKTsKKworICByZWdpc3RlcnNfZmV0Y2hlZCAoKTsKKyAgCisgIHB0cmFjZSAoUFRSQUNFX0dFVFJFR1MsIGluZmVyaW9yX3BpZCwKKwkgIChQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfcmVnaXN0ZXJzLAorCSAgcHRyYWNlXyRkYXRhX3NldCwKKwkgIChQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfcmVnaXN0ZXJzLAorCSAgcHRyYWNlXyRkYXRhX3NldCk7CisKKyAgcHRyYWNlIChQVFJBQ0VfR0VUUkVHUywgaW5mZXJpb3JfcGlkLAorCShQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLAorCXB0cmFjZV8kZmxvYXRpbmdfc2V0X202OGssCisJKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9mcF9yZWdpc3RlcnMsCisJcHRyYWNlXyRmbG9hdGluZ19zZXRfbTY4ayk7CisKKyAgcHRyYWNlIChQVFJBQ0VfR0VUUkVHUywgaW5mZXJpb3JfcGlkLAorCShQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfY29udHJvbF9yZWdpc3RlcnMsCisJcHRyYWNlXyRjb250cm9sX3NldF9tNjhrLAorCShQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfY29udHJvbF9yZWdpc3RlcnMsCisJcHRyYWNlXyRjb250cm9sX3NldF9tNjhrKTsKKworICBiY29weSAoJmluZmVyaW9yX3JlZ2lzdGVycywgcmVnaXN0ZXJzLCAxNiAqIDQpOworICBiY29weSAoJmluZmVyaW9yX2ZwX3JlZ2lzdGVycywgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNKV0sCisJIHNpemVvZiBpbmZlcmlvcl9mcF9yZWdpc3RlcnMucmVncyk7CisgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQU19SRUdOVU0pXSA9IGluZmVyaW9yX2NvbnRyb2xfcmVnaXN0ZXJzLnNyOworICAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUENfUkVHTlVNKV0gPSBpbmZlcmlvcl9jb250cm9sX3JlZ2lzdGVycy5wYzsKK30KKworLyogU3RvcmUgb3VyIHJlZ2lzdGVyIHZhbHVlcyBiYWNrIGludG8gdGhlIGluZmVyaW9yLgorICAgSWYgUkVHTk8gaXMgLTEsIGRvIHRoaXMgZm9yIGFsbCByZWdpc3RlcnMuCisgICBPdGhlcndpc2UsIFJFR05PIHNwZWNpZmllcyB3aGljaCByZWdpc3RlciAoc28gd2UgY2FuIHNhdmUgdGltZSkuICAqLworCit2b2lkCitzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHN0cnVjdCBwdHJhY2VfJGRhdGFfcmVnc19tNjhrIGluZmVyaW9yX3JlZ2lzdGVyczsKKyAgc3RydWN0IHB0cmFjZV8kZmxvYXRpbmdfcmVnc19tNjhrIGluZmVyaW9yX2ZwX3JlZ2lzdGVyczsKKyAgc3RydWN0IHB0cmFjZV8kY29udHJvbF9yZWdzX202OGsgaW5mZXJpb3JfY29udHJvbF9yZWdpc3RlcnM7CisgIGV4dGVybiBjaGFyIHJlZ2lzdGVyc1tdOworCisgIHB0cmFjZV8kaW5pdF9jb250cm9sKCZpbmZlcmlvcl9jb250cm9sX3JlZ2lzdGVycyk7CisgIGluZmVyaW9yX2ZwX3JlZ2lzdGVycy5zaXplID0gc2l6ZW9mKGluZmVyaW9yX2ZwX3JlZ2lzdGVycyk7CisKKyAgcHRyYWNlIChQVFJBQ0VfR0VUUkVHUywgaW5mZXJpb3JfcGlkLAorCShQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLAorCXB0cmFjZV8kZmxvYXRpbmdfc2V0X202OGssCisJKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9mcF9yZWdpc3RlcnMsCisJcHRyYWNlXyRmbG9hdGluZ19zZXRfbTY4ayk7CisKKyAgcHRyYWNlIChQVFJBQ0VfR0VUUkVHUywgaW5mZXJpb3JfcGlkLAorCShQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfY29udHJvbF9yZWdpc3RlcnMsCisJcHRyYWNlXyRjb250cm9sX3NldF9tNjhrLAorCShQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfY29udHJvbF9yZWdpc3RlcnMsCisJcHRyYWNlXyRjb250cm9sX3NldF9tNjhrKTsKKworICBiY29weSAocmVnaXN0ZXJzLCAmaW5mZXJpb3JfcmVnaXN0ZXJzLCBzaXplb2YoaW5mZXJpb3JfcmVnaXN0ZXJzKSk7CisKKyAgYmNvcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLCBpbmZlcmlvcl9mcF9yZWdpc3RlcnMucmVncywKKwkgc2l6ZW9mIGluZmVyaW9yX2ZwX3JlZ2lzdGVycy5yZWdzKTsKKworICBpbmZlcmlvcl9jb250cm9sX3JlZ2lzdGVycy5zciA9ICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQU19SRUdOVU0pXTsKKyAgaW5mZXJpb3JfY29udHJvbF9yZWdpc3RlcnMucGMgPSAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUENfUkVHTlVNKV07CisKKyAgcHRyYWNlIChQVFJBQ0VfU0VUUkVHUywgaW5mZXJpb3JfcGlkLAorCSAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9yZWdpc3RlcnMsCisJICBwdHJhY2VfJGRhdGFfc2V0X202OGssCisJICAoUFRSQUNFX0FSRzNfVFlQRSkgJmluZmVyaW9yX3JlZ2lzdGVycywKKwkgIHB0cmFjZV8kZGF0YV9zZXRfbTY4ayk7CisKKyAgcHRyYWNlIChQVFJBQ0VfU0VUUkVHUywgaW5mZXJpb3JfcGlkLAorCSAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9mcF9yZWdpc3RlcnMsCisJICBwdHJhY2VfJGZsb2F0aW5nX3NldF9tNjhrLAorCSAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9mcF9yZWdpc3RlcnMsCisJICBwdHJhY2VfJGZsb2F0aW5nX3NldF9tNjhrKTsKKworICBwdHJhY2UgKFBUUkFDRV9TRVRSRUdTLCBpbmZlcmlvcl9waWQsCisJICAoUFRSQUNFX0FSRzNfVFlQRSkgJmluZmVyaW9yX2NvbnRyb2xfcmVnaXN0ZXJzLAorCSAgcHRyYWNlXyRjb250cm9sX3NldF9tNjhrLAorCSAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9jb250cm9sX3JlZ2lzdGVycywKKwkgIHB0cmFjZV8kY29udHJvbF9zZXRfbTY4ayk7Cit9CmRpZmYgLS1naXQgYS9nZGIvYWJ1Zy1yb20uYyBiL2dkYi9hYnVnLXJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZmYwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvYWJ1Zy1yb20uYwpAQCAtMCwwICsxLDE2OSBAQAorLyogUmVtb3RlIGRlYnVnZ2luZyBpbnRlcmZhY2UgZm9yIEFCdWcgUm9tIG1vbml0b3IgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBXcml0dGVuIGJ5IFJvYiBTYXZveWUgb2YgQ3lnbnVzIFN1cHBvcnQKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJtb25pdG9yLmgiCisjaW5jbHVkZSAic2VyaWFsLmgiCisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gKi8KKworc3RhdGljIHZvaWQgYWJ1Z19vcGVuIFBBUkFNUyAoKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkpOworCitzdGF0aWMgdm9pZAorYWJ1Z19zdXBwbHlfcmVnaXN0ZXIgKHJlZ25hbWUsIHJlZ25hbWVsZW4sIHZhbCwgdmFsbGVuKQorICAgICBjaGFyICpyZWduYW1lOworICAgICBpbnQgcmVnbmFtZWxlbjsKKyAgICAgY2hhciAqdmFsOworICAgICBpbnQgdmFsbGVuOworeworICBpbnQgcmVnbm87CisKKyAgaWYgKHJlZ25hbWVsZW4gIT0gMikKKyAgICByZXR1cm47CisKKyAgc3dpdGNoIChyZWduYW1lWzBdKQorICAgIHsKKyAgICBjYXNlICdTJzoKKyAgICAgIGlmIChyZWduYW1lWzFdICE9ICdSJykKKwlyZXR1cm47CisgICAgICByZWdubyA9IFBTX1JFR05VTTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1AnOgorICAgICAgaWYgKHJlZ25hbWVbMV0gIT0gJ0MnKQorCXJldHVybjsKKyAgICAgIHJlZ25vID0gUENfUkVHTlVNOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnRCc6CisgICAgICBpZiAocmVnbmFtZVsxXSA8ICcwJyB8fCByZWduYW1lWzFdID4gJzcnKQorCXJldHVybjsKKyAgICAgIHJlZ25vID0gcmVnbmFtZVsxXSAtICcwJyArIEQwX1JFR05VTTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0EnOgorICAgICAgaWYgKHJlZ25hbWVbMV0gPCAnMCcgfHwgcmVnbmFtZVsxXSA+ICc3JykKKwlyZXR1cm47CisgICAgICByZWdubyA9IHJlZ25hbWVbMV0gLSAnMCcgKyBBMF9SRUdOVU07CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuOworICAgIH0KKworICBtb25pdG9yX3N1cHBseV9yZWdpc3RlciAocmVnbm8sIHZhbCk7Cit9CisKKy8qCisgKiBUaGlzIGFycmF5IG9mIHJlZ2lzdGVycyBuZWVkcyB0byBtYXRjaCB0aGUgaW5kZXhlcyB1c2VkIGJ5IEdEQi4gVGhlCisgKiB3aG9sZSByZWFzb24gdGhpcyBleGlzdHMgaXMgYmVjYXVzZSB0aGUgdmFyaW91cyBST00gbW9uaXRvcnMgdXNlCisgKiBkaWZmZXJlbnQgbmFtZXMgdGhhbiBHREIgZG9lcywgYW5kIGRvbid0IHN1cHBvcnQgYWxsIHRoZQorICogcmVnaXN0ZXJzIGVpdGhlci4gU28sIHR5cGluZyAiaW5mbyByZWcgc3AiIGJlY29tZXMgYW4gIkE3Ii4KKyAqLworCitzdGF0aWMgY2hhciAqYWJ1Z19yZWduYW1lc1tOVU1fUkVHU10gPQoreworICAiRDAiLCAiRDEiLCAiRDIiLCAiRDMiLCAiRDQiLCAiRDUiLCAiRDYiLCAiRDciLAorICAiQTAiLCAiQTEiLCAiQTIiLCAiQTMiLCAiQTQiLCAiQTUiLCAiQTYiLCAiQTciLAorICAiUEMiLAorfTsKKworLyoKKyAqIERlZmluZSB0aGUgbW9uaXRvciBjb21tYW5kIHN0cmluZ3MuIFNpbmNlIHRoZXNlIGFyZSBwYXNzZWQgZGlyZWN0bHkKKyAqIHRocm91Z2ggdG8gYSBwcmludGYgc3R5bGUgZnVuY3Rpb24sIHdlIG5lZWQgY2FuIGluY2x1ZGUgZm9ybWF0dGluZworICogc3RyaW5ncy4gV2UgYWxzbyBuZWVkIGEgQ1Igb3IgTEYgb24gdGhlIGVuZC4KKyAqLworCitzdGF0aWMgc3RydWN0IHRhcmdldF9vcHMgYWJ1Z19vcHM7CisKK3N0YXRpYyBjaGFyICphYnVnX2luaXRzW10gPSB7IlxyIiwgTlVMTH07CisKK3N0YXRpYyBzdHJ1Y3QgbW9uaXRvcl9vcHMgYWJ1Z19jbWRzIDsKKworc3RhdGljIHZvaWQgCitpbml0X2FidWdfY21kcyh2b2lkKQoreworICBhYnVnX2NtZHMuZmxhZ3MgPSAgIE1PX0NMUl9CUkVBS19VU0VTX0FERFI7CisgIGFidWdfY21kcy5pbml0ID0gICBhYnVnX2luaXRzOwkJCS8qIEluaXQgc3RyaW5ncyAqLworICBhYnVnX2NtZHMuY29udCA9ICAgImdcciI7CQkJLyogY29udGludWUgY29tbWFuZCAqLworICBhYnVnX2NtZHMuc3RlcCA9ICAgInRcciI7CQkJLyogc2luZ2xlIHN0ZXAgKi8KKyAgYWJ1Z19jbWRzLnN0b3AgPSAgIE5VTEw7CQkJCS8qIGludGVycnVwdCBjb21tYW5kICovCisgIGFidWdfY21kcy5zZXRfYnJlYWsgPSAgICJiciAleFxyIjsJCQkvKiBzZXQgYSBicmVha3BvaW50ICovCisgIGFidWdfY21kcy5jbHJfYnJlYWsgPSAgICJub2JyICV4XHIiOwkJCS8qIGNsZWFyIGEgYnJlYWtwb2ludCAqLworICBhYnVnX2NtZHMuY2xyX2FsbF9icmVhayA9ICAgIm5vYnJcciI7CQkJLyogY2xlYXIgYWxsIGJyZWFrcG9pbnRzICovCisgIGFidWdfY21kcy5maWxsID0gICAiYmYgJXg6JXggJXg7YlxyIjsJCS8qIGZpbGwgKHN0YXJ0IGNvdW50IHZhbCkgKi8KKyAgYWJ1Z19jbWRzLnNldG1lbS5jbWRiID0gICAgICJtcyAleCAlMDJ4XHIiOwkJLyogc2V0bWVtLmNtZGIgKGFkZHIsIHZhbHVlKSAqLworICBhYnVnX2NtZHMuc2V0bWVtLmNtZHcgPSAgICAgIm1zICV4ICUwNHhcciI7CQkvKiBzZXRtZW0uY21kdyAoYWRkciwgdmFsdWUpICovCisgIGFidWdfY21kcy5zZXRtZW0uY21kbCA9ICAgICAibXMgJXggJTA4eFxyIjsJCS8qIHNldG1lbS5jbWRsIChhZGRyLCB2YWx1ZSkgKi8KKyAgYWJ1Z19jbWRzLnNldG1lbS5jbWRsbCA9ICAgICBOVUxMOwkJCS8qIHNldG1lbS5jbWRsbCAoYWRkciwgdmFsdWUpICovCisgIGFidWdfY21kcy5zZXRtZW0ucmVzcF9kZWxpbSA9ICAgICBOVUxMOwkJCS8qIHNldHJlZy5yZXNwX2RlbGltICovCisgIGFidWdfY21kcy5zZXRtZW0udGVybSA9ICAgICBOVUxMOwkJCS8qIHNldHJlZy50ZXJtICovCisgIGFidWdfY21kcy5zZXRtZW0udGVybV9jbWQgPSAgICAgTlVMTDsJCQkvKiBzZXRyZWcudGVybV9jbWQgKi8KKyAgYWJ1Z19jbWRzLmdldG1lbS5jbWRiID0gICAgICJtZCAleDoleDtiXHIiOwkJLyogZ2V0bWVtLmNtZGIgKGFkZHIsIGxlbikgKi8KKyAgYWJ1Z19jbWRzLmdldG1lbS5jbWR3ID0gICAgICJtZCAleDoleDtiXHIiOwkJLyogZ2V0bWVtLmNtZHcgKGFkZHIsIGxlbikgKi8KKyAgYWJ1Z19jbWRzLmdldG1lbS5jbWRsID0gICAgICJtZCAleDoleDtiXHIiOwkJLyogZ2V0bWVtLmNtZGwgKGFkZHIsIGxlbikgKi8KKyAgYWJ1Z19jbWRzLmdldG1lbS5jbWRsbCA9ICAgICBOVUxMOwkJCS8qIGdldG1lbS5jbWRsbCAoYWRkciwgbGVuKSAqLworICBhYnVnX2NtZHMuZ2V0bWVtLnJlc3BfZGVsaW0gPSAgICAgIiAiOwkJCS8qIGdldG1lbS5yZXNwX2RlbGltICovCisgIGFidWdfY21kcy5nZXRtZW0udGVybSA9ICAgICBOVUxMOwkJCS8qIGdldG1lbS50ZXJtICovCisgIGFidWdfY21kcy5nZXRtZW0udGVybV9jbWQgPSAgICAgTlVMTDsJCQkvKiBnZXRtZW0udGVybV9jbWQgKi8KKyAgYWJ1Z19jbWRzLnNldHJlZy5jbWQgPSAgICAgInJtICVzICV4XHIiOwkJLyogc2V0cmVnLmNtZCAobmFtZSwgdmFsdWUpICovCisgIGFidWdfY21kcy5zZXRyZWcucmVzcF9kZWxpbSA9ICAgICAiPSI7CQkJLyogc2V0cmVnLnJlc3BfZGVsaW0gKi8KKyAgYWJ1Z19jbWRzLnNldHJlZy50ZXJtID0gICAgICI/ICI7CQkJLyogc2V0cmVnLnRlcm0gKi8KKyAgYWJ1Z19jbWRzLnNldHJlZy50ZXJtX2NtZCA9ICAgICAiLlxyIgk7CQkvKiBzZXRyZWcudGVybV9jbWQgKi8KKyAgYWJ1Z19jbWRzLmdldHJlZy5jbWQgPSAgICAgInJtICVzXHIiOwkJCS8qIGdldHJlZy5jbWQgKG5hbWUpICovCisgIGFidWdfY21kcy5nZXRyZWcucmVzcF9kZWxpbSA9ICAgICAiPSI7CQkJLyogZ2V0cmVnLnJlc3BfZGVsaW0gKi8KKyAgYWJ1Z19jbWRzLmdldHJlZy50ZXJtID0gICAgICI/ICI7CQkJLyogZ2V0cmVnLnRlcm0gKi8KKyAgYWJ1Z19jbWRzLmdldHJlZy50ZXJtX2NtZCA9ICAgICAiLlxyIgk7CQkvKiBnZXRyZWcudGVybV9jbWQgKi8KKyAgICBhYnVnX2NtZHMuZHVtcF9yZWdpc3RlcnMgPSAgICJyZFxyIjsJCQkvKiBkdW1wX3JlZ2lzdGVycyAqLworICBhYnVnX2NtZHMucmVnaXN0ZXJfcGF0dGVybiA9ICAgIlxcKFxcdytcXCkgKz1cXChbMC05YS1mQS1GXStcXGJcXCkiOyAvKiByZWdpc3Rlcl9wYXR0ZXJuICovCisgIGFidWdfY21kcy5zdXBwbHlfcmVnaXN0ZXIgPSAgIGFidWdfc3VwcGx5X3JlZ2lzdGVyOwkvKiBzdXBwbHlfcmVnaXN0ZXIgKi8KKyAgYWJ1Z19jbWRzLmxvYWRfcm91dGluZSA9ICAgTlVMTDsJCQkJLyogbG9hZF9yb3V0aW5lIChkZWZhdWx0cyB0byBTUkVDcykgKi8KKyAgYWJ1Z19jbWRzLmxvYWQgPSAgICJsbyAwXHIiOwkJCS8qIGRvd25sb2FkIGNvbW1hbmQgKi8KKyAgYWJ1Z19jbWRzLmxvYWRyZXNwID0gICAiXG4iOwkJCQkvKiBsb2FkIHJlc3BvbnNlICovCisgIGFidWdfY21kcy5wcm9tcHQgPSAgICIxMzVCdWc+IjsJCQkvKiBtb25pdG9yIGNvbW1hbmQgcHJvbXB0ICovCisgIGFidWdfY21kcy5saW5lX3Rlcm0gPSAgICJcciI7CQkJCS8qIGVuZC1vZi1saW5lIHRlcm1pbmF0b3IgKi8KKyAgYWJ1Z19jbWRzLmNtZF9lbmQgPSAgIE5VTEw7CQkJCS8qIG9wdGlvbmFsIGNvbW1hbmQgdGVybWluYXRvciAqLworICBhYnVnX2NtZHMudGFyZ2V0ID0gICAmYWJ1Z19vcHM7CQkJLyogdGFyZ2V0IG9wZXJhdGlvbnMgKi8KKyAgYWJ1Z19jbWRzLnN0b3BiaXRzID0gICBTRVJJQUxfMV9TVE9QQklUUzsJCS8qIG51bWJlciBvZiBzdG9wIGJpdHMgKi8KKyAgYWJ1Z19jbWRzLnJlZ25hbWVzID0gICBhYnVnX3JlZ25hbWVzOwkJLyogcmVnaXN0ZXJzIG5hbWVzICovCisgIGFidWdfY21kcy5tYWdpYyA9ICAgTU9OSVRPUl9PUFNfTUFHSUMJOwkvKiBtYWdpYyAqLworfTsgCisKK3N0YXRpYyB2b2lkCithYnVnX29wZW4oYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgbW9uaXRvcl9vcGVuIChhcmdzLCAmYWJ1Z19jbWRzLCBmcm9tX3R0eSk7Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX2FidWdfcm9tICgpCit7CisgIGluaXRfYWJ1Z19jbWRzKCkgOworICBpbml0X21vbml0b3Jfb3BzICgmYWJ1Z19vcHMpOworCisgIGFidWdfb3BzLnRvX3Nob3J0bmFtZSA9ICJhYnVnIjsKKyAgYWJ1Z19vcHMudG9fbG9uZ25hbWUgPSAiQUJ1ZyBtb25pdG9yIjsKKyAgYWJ1Z19vcHMudG9fZG9jID0gIkRlYnVnIHZpYSB0aGUgQUJ1ZyBtb25pdG9yLlxuXAorU3BlY2lmeSB0aGUgc2VyaWFsIGRldmljZSBpdCBpcyBjb25uZWN0ZWQgdG8gKGUuZy4gL2Rldi90dHlhKS4iOworICBhYnVnX29wcy50b19vcGVuID0gYWJ1Z19vcGVuOworCisgIGFkZF90YXJnZXQgKCZhYnVnX29wcyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvYWNjb25maWcuaCBiL2dkYi9hY2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZDUwMjAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvYWNjb25maWcuaApAQCAtMCwwICsxLDk1IEBACisKKy8qIFdoZXRoZXIgbWFsbG9jIG11c3QgYmUgZGVjbGFyZWQgZXZlbiBpZiA8c3RkbGliLmg+IGlzIGluY2x1ZGVkLiAgKi8KKyN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQworCisvKiBXaGV0aGVyIHJlYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRsaWIuaD4gaXMgaW5jbHVkZWQuICAqLworI3VuZGVmIE5FRURfREVDTEFSQVRJT05fUkVBTExPQworCisvKiBXaGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRsaWIuaD4gaXMgaW5jbHVkZWQuICAqLworI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQorCisvKiBXaGV0aGVyIHN0cmVycm9yIG11c3QgYmUgZGVjbGFyZWQgZXZlbiBpZiA8c3RyaW5nLmg+IGlzIGluY2x1ZGVkLiAgKi8KKyN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUkVSUk9SCitAVE9QQAorCisvKiBEZWZpbmUgaWYgcHN0YXR1c190IHR5cGUgaXMgYXZhaWxhYmxlICovCisjdW5kZWYgSEFWRV9QU1RBVFVTX1QKKworLyogRGVmaW5lIGlmIHBycnVuX3QgdHlwZSBpcyBhdmFpbGFibGUgKi8KKyN1bmRlZiBIQVZFX1BSUlVOX1QKKworLyogRGVmaW5lIGlmIGZwcmVnc2V0X3QgdHlwZSBpcyBhdmFpbGFibGUuICovCisjdW5kZWYgSEFWRV9GUFJFR1NFVF9UCisKKy8qIERlZmluZSBpZiBncmVnc2V0X3QgdHlwZSBpcyBhdmFpbGFibGUuICovCisjdW5kZWYgSEFWRV9HUkVHU0VUX1QKKworLyogRGVmaW5lIGlmIGlvY3RsIGFyZ3VtZW50IFBJT0NTRVQgaXMgYXZhaWxhYmxlLiAqLworI3VuZGVmIEhBVkVfUFJPQ0ZTX1BJT0NTRVQKKworLyogL3Byb2MgUElEIGVudHJpZXMgYXJlIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdGhlIGZpbGVzCisgICBjdGwgYXMgbWFwIHN0YXR1cyAqLworI3VuZGVmIEhBVkVfTVVMVElQTEVfUFJPQ19GRFMKKworLyogRGVmaW5lIGlmIHRoZSBgbG9uZyBsb25nJyB0eXBlIHdvcmtzLiAgKi8KKyN1bmRlZiBDQ19IQVNfTE9OR19MT05HCisKKy8qIERlZmluZSBpZiB0aGUgImxsIiBmb3JtYXQgd29ya3MgdG8gcHJpbnQgbG9uZyBsb25nIGludHMuICovCisjdW5kZWYgUFJJTlRGX0hBU19MT05HX0xPTkcKKworLyogRGVmaW5lIGlmIHRoZSAiJUxnIiBmb3JtYXQgd29ya3MgdG8gcHJpbnQgbG9uZyBkb3VibGVzLiAqLworI3VuZGVmIFBSSU5URl9IQVNfTE9OR19ET1VCTEUKKworLyogRGVmaW5lIGlmIHRoZSAiJUxnIiBmb3JtYXQgd29ya3MgdG8gc2NhbiBsb25nIGRvdWJsZXMuICovCisjdW5kZWYgU0NBTkZfSEFTX0xPTkdfRE9VQkxFCisKKy8qIERlZmluZSBpZiB1c2luZyBTb2xhcmlzIHRocmVhZCBkZWJ1Z2dpbmcuICAqLworI3VuZGVmIEhBVkVfVEhSRUFEX0RCX0xJQgorCisvKiBEZWZpbmUgb24gYSBHTlUvTGludXggc3lzdGVtIHRvIHdvcmsgYXJvdW5kIHByb2JsZW1zIGluIHN5cy9wcm9jZnMuaC4gICovCisjdW5kZWYgU1RBUlRfSU5GRVJJT1JfVFJBUFNfRVhQRUNURUQKKyN1bmRlZiBzeXNfcXVvdGFjdGwKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIEhQVVggdGhyZWFkcyAqLworI3VuZGVmIEhBVkVfSFBVWF9USFJFQURfU1VQUE9SVAorCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBtZW1vcnkgbWFwcGVkIG1hbGxvYyBwYWNrYWdlIChtbWFsbG9jKS4gKi8KKyN1bmRlZiBVU0VfTU1BTExPQworCisvKiBEZWZpbmUgaWYgdGhlIHJ1bnRpbWUgdXNlcyBhIHJvdXRpbmUgZnJvbSBtbWFsbG9jIGJlZm9yZSBnZGIgaGFzIGEgY2hhbmNlCisgICB0byBpbml0aWFsaXplIG1tYWxsb2MsIGFuZCB3ZSB3YW50IHRvIGZvcmNlIGNoZWNraW5nIHRvIGJlIHVzZWQgYW55d2F5LgorICAgVGhpcyBtYXkgY2F1c2Ugc3B1cmlvdXMgbWVtb3J5IGNvcnJ1cHRpb24gbWVzc2FnZXMgaWYgdGhlIHJ1bnRpbWUgdHJpZXMKKyAgIHRvIGV4cGxpY2l0bHkgZGVhbGxvY2F0ZSB0aGF0IG1lbW9yeSB3aGVuIGdkYiBjYWxscyBleGl0LiAqLworI3VuZGVmIE1NQ0hFQ0tfRk9SQ0UKKworLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCisjdW5kZWYgRU5BQkxFX05MUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCisjdW5kZWYgSEFWRV9DQVRHRVRTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0dFVFRFWFQKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCisjdW5kZWYgSEFWRV9MQ19NRVNTQUdFUworCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBmdWxsLXNjcmVlbiB0ZXJtaW5hbCB1c2VyIGludGVyZmFjZS4gICovCisjdW5kZWYgVFVJCisKKy8qIERlZmluZSBpZiA8cHJvY19zZXJ2aWNlLmg+IG9uIHNvbGFyaXMgdXNlcyBpbnQgaW5zdGVhZCBvZgorICAgc2l6ZV90LCBhbmQgYXNzb3J0ZWQgb3RoZXIgdHlwZSBjaGFuZ2VzLiAqLworI3VuZGVmIFBST0NfU0VSVklDRV9JU19PTEQKKworLyogSWYgeW91IHdhbnQgdG8gc3BlY2lmeSBhIGRlZmF1bHQgQ1BVIHZhcmlhbnQsIGRlZmluZSB0aGlzIHRvIGJlIGl0cworICAgbmFtZSwgYXMgYSBDIHN0cmluZy4gICovCisjdW5kZWYgVEFSR0VUX0NQVV9ERUZBVUxUCisKKy8qIFNldCB0byB0cnVlIGlmIHRoZSBzYXZlX3N0YXRlX3Qgc3RydWN0dXJlIGlzIHByZXNlbnQgKi8KKyNkZWZpbmUgSEFWRV9TVFJVQ1RfU0FWRV9TVEFURV9UIDAKKworLyogU2V0IHRvIHRydWUgaWYgdGhlIHNhdmVfc3RhdGVfdCBzdHJ1Y3R1cmUgaGFzIHRoZSBzc193aWRlIG1lbWJlciAqLworI2RlZmluZSBIQVZFX1NUUlVDVF9NRU1CRVJfU1NfV0lERSAwCmRpZmYgLS1naXQgYS9nZGIvYWNpbmNsdWRlLm00IGIvZ2RiL2FjaW5jbHVkZS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2EwYjBkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2FjaW5jbHVkZS5tNApAQCAtMCwwICsxLDg2MSBAQAorZG5sIHdyaXR0ZW4gYnkgUm9iIFNhdm95ZSA8cm9iQGN5Z251cy5jb20+IGZvciBDeWdudXMgU3VwcG9ydAorZG5sIG1ham9yIHJld3JpdGluZyBmb3IgVGNsIDcuNSBieSBEb24gTGliZXMgPGxpYmVzQG5pc3QuZ292PgorCitkbmwgZ2RiL2NvbmZpZ3VyZS5pbiB1c2VzIEJGRF9ORUVEX0RFQ0xBUkFUSU9OLCBzbyBnZXQgaXRzIGRlZmluaXRpb24uCitzaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQorCitkbmwgVGhpcyBnZXRzIHRoZSBzdGFuZGFyZCBtYWNyb3MsIGxpa2UgdGhlIFRDTCwgVEssIGV0YyBvbmVzLgorc2luY2x1ZGUoLi4vY29uZmlnL2FjaW5jbHVkZS5tNCkKKworZG5sIENZR05VUyBMT0NBTDogVGhpcyBnZXRzIHRoZSByaWdodCBwb3NpeCBmbGFnIGZvciBnY2MKK0FDX0RFRlVOKENZX0FDX1RDTF9MWU5YX1BPU0lYLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKUFDX1JFUVVJUkUoW0FDX1BST0dfQ1BQXSkKK0FDX01TR19DSEVDS0lORyhbaWYgcnVubmluZyBMeW54T1NdKQorQUNfQ0FDSEVfVkFMKGFjX2N2X29zX2x5bngsCitbQUNfRUdSRVBfQ1BQKHllcywKK1svKgorICogVGhlIG9sZCBMeW54ICJjYyIgb25seSBkZWZpbmVzICJMeW54IiwgYnV0IHRoZSBuZXdlciBvbmUgdXNlcyAiX19MeW54X18iCisgKi8KKyNpZiBkZWZpbmVkKF9fTHlueF9fKSB8fCBkZWZpbmVkKEx5bngpCit5ZXMKKyNlbmRpZgorXSwgYWNfY3Zfb3NfbHlueD15ZXMsIGFjX2N2X29zX2x5bng9bm8pXSkKKyMKK2lmIHRlc3QgIiRhY19jdl9vc19seW54IiA9ICJ5ZXMiIDsgdGhlbgorICBBQ19NU0dfUkVTVUxUKHllcykKKyAgQUNfREVGSU5FKExZTlgpCisgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAtbXBvc2l4IG9yIC1YIGlzIGF2YWlsYWJsZV0pCisgIEFDX0NBQ0hFX1ZBTChhY19jdl9jX3Bvc2l4X2ZsYWcsCisgIFtBQ19UUllfQ09NUElMRSgsWworICAvKgorICAgKiBUaGlzIGZsYWcgdmFyaWVzIGRlcGVuZGluZyBvbiBob3cgb2xkIHRoZSBjb21waWxlciBpcy4KKyAgICogLVggaXMgZm9yIHRoZSBvbGQgImNjIiBhbmQgImdjYyIgKGJhc2VkIG9uIDEuNDIpLgorICAgKiAtbXBvc2l4IGlzIGZvciB0aGUgbmV3IGdjYyAoYXQgbGVhc3QgMi41LjgpLgorICAgKi8KKyAgI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDIKKyAgY2hva2UgbWUKKyAgI2VuZGlmCisgIF0sIGFjX2N2X2NfcG9zaXhfZmxhZz0iIC1tcG9zaXgiLCBhY19jdl9jX3Bvc2l4X2ZsYWc9IiAtWCIpXSkKKyAgQ0M9IiRDQyAkYWNfY3ZfY19wb3NpeF9mbGFnIgorICBBQ19NU0dfUkVTVUxUKCRhY19jdl9jX3Bvc2l4X2ZsYWcpCisgIGVsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCitdKQorCisjCisjIFNvbWV0aW1lcyB0aGUgbmF0aXZlIGNvbXBpbGVyIGlzIGEgYm9ndXMgc3R1YiBmb3IgZ2NjIG9yIC91c3IvdWNiL2NjLiBUaGlzCisjIG1ha2VzIGNvbmZpZ3VyZSB0aGluayBpdCdzIGNyb3NzIGNvbXBpbGluZy4gSWYgLS10YXJnZXQgd2Fzbid0IHVzZWQsIHRoZW4KKyMgd2UgY2FuJ3QgY29uZmlndXJlLCBzbyBzb21ldGhpbmcgaXMgd3JvbmcuIFdlIGRvbid0IHVzZSB0aGUgY2FjaGUKKyMgaGVyZSBjYXVzZSBpZiBzb21lYm9keSBmaXhlcyB0aGVpciBjb21waWxlciBpbnN0YWxsLCB3ZSB3YW50IHRoaXMgdG8gd29yay4KK0FDX0RFRlVOKENZX0FDX0NfV09SS1MsCitbIyBJZiB3ZSBjYW5ub3QgY29tcGlsZSBhbmQgbGluayBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgY2FuJ3QgZXhwZWN0IGFueXRoaW5nIHRvIHdvcmsKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRoZSBjb21waWxlciAoJENDKSBhY3R1YWxseSB3b3JrcykKK0FDX1RSWV9DT01QSUxFKCwgWy8qIGRvbid0IG5lZWQgYW55dGhpbmcgaGVyZSAqL10sCisgICAgICAgIGNfY29tcGlsZXM9eWVzLCBjX2NvbXBpbGVzPW5vKQorCitBQ19UUllfTElOSygsIFsvKiBkb24ndCBuZWVkIGFueXRoaW5nIGhlcmUgKi9dLAorICAgICAgICBjX2xpbmtzPXllcywgY19saW5rcz1ubykKKworaWYgdGVzdCB4IiR7Y19jb21waWxlc30iID0geCJubyIgOyB0aGVuCisgIEFDX01TR19FUlJPUih0aGUgbmF0aXZlIGNvbXBpbGVyIGlzIGJyb2tlbiBhbmQgd29uJ3QgY29tcGlsZS4pCitmaQorCitpZiB0ZXN0IHgiJHtjX2xpbmtzfSIgPSB4Im5vIiA7IHRoZW4KKyAgQUNfTVNHX0VSUk9SKHRoZSBuYXRpdmUgY29tcGlsZXIgaXMgYnJva2VuIGFuZCB3b24ndCBsaW5rLikKK2ZpCitBQ19NU0dfUkVTVUxUKHllcykKK10pCisKK0FDX0RFRlVOKENZX0FDX1BBVEhfVENMSCwgWworIworIyBPaywgbGV0cyBmaW5kIHRoZSB0Y2wgc291cmNlIHRyZWVzIHNvIHdlIGNhbiB1c2UgdGhlIGhlYWRlcnMKKyMgV2FybmluZzogdHJhbnNpdGlvbiBvZiB2ZXJzaW9uIDkgdG8gMTAgd2lsbCBicmVhayB0aGlzIGFsZ29yaXRobQorIyBiZWNhdXNlIDEwIHNvcnRzIGJlZm9yZSA5LiBXZSBhbHNvIGxvb2sgZm9yIGp1c3QgdGNsLiBXZSBoYXZlIHRvCisjIGJlIGNhcmVmdWwgdGhhdCB3ZSBkb24ndCBtYXRjaCBzdHVmZiBsaWtlIHRjbFggYnkgYWNjaWRlbnQuCisjIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC10Y2xpbmNsdWRlCisjCisKK25vX3RjbD10cnVlCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIFRjbCBwcml2YXRlIGhlYWRlcnMuIGRpcj0ke2NvbmZpZ2Rpcn0pCitBQ19BUkdfV0lUSCh0Y2xpbmNsdWRlLCBbICAtLXdpdGgtdGNsaW5jbHVkZT1ESVIgICBEaXJlY3Rvcnkgd2hlcmUgdGNsIHByaXZhdGUgaGVhZGVycyBhcmVdLCB3aXRoX3RjbGluY2x1ZGU9JHt3aXRodmFsfSkKK0FDX0NBQ0hFX1ZBTChhY19jdl9jX3RjbGgsWworIyBmaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRjbGluY2x1ZGUgd2FzIHNwZWNpZmllZAoraWYgdGVzdCB4IiR7d2l0aF90Y2xpbmNsdWRlfSIgIT0geCA7IHRoZW4KKyAgaWYgdGVzdCAtZiAke3dpdGhfdGNsaW5jbHVkZX0vdGNsSW50LmggOyB0aGVuCisgICAgYWNfY3ZfY190Y2xoPWAoY2QgJHt3aXRoX3RjbGluY2x1ZGV9OyBwd2QpYAorICBlbGlmIHRlc3QgLWYgJHt3aXRoX3RjbGluY2x1ZGV9L2dlbmVyaWMvdGNsSW50LmggOyB0aGVuCisgICAgYWNfY3ZfY190Y2xoPWAoY2QgJHt3aXRoX3RjbGluY2x1ZGV9L2dlbmVyaWM7IHB3ZClgCisgIGVsc2UKKyAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90Y2xpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIHByaXZhdGUgaGVhZGVyc10pCisgIGZpCitmaQorCisjIG5leHQgY2hlY2sgaWYgaXQgY2FtZSB3aXRoIFRjbCBjb25maWd1cmF0aW9uIGZpbGUKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGNsY29uZmlnfSIgPSB4IDsgdGhlbgorICBpZiB0ZXN0IC1mICRhY19jdl9jX3RjbGNvbmZpZy8uLi9nZW5lcmljL3RjbEludC5oIDsgdGhlbgorICAgIGFjX2N2X2NfdGNsaD1gKGNkICRhY19jdl9jX3RjbGNvbmZpZy8uLjsgcHdkKWAKKyAgZmkKK2ZpCisKKyMgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKKyMKKyMgc2luY2UgbHMgcmV0dXJucyBsb3dlc3QgdmVyc2lvbiBudW1iZXJzIGZpcnN0LCByZXZlcnNlIGl0cyBvdXRwdXQKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iID0geCA7IHRoZW4KKyAgZm9yIGkgaW4gXAorCQkke3NyY2Rpcn0vLi4vdGNsIFwKKwkJYGxzIC1kciAke3NyY2Rpcn0vLi4vdGNsW1s3LTldXSogMj4vZGV2L251bGxgIFwKKwkJJHtzcmNkaXJ9Ly4uLy4uL3RjbCBcCisJCWBscyAtZHIgJHtzcmNkaXJ9Ly4uLy4uL3RjbFtbNy05XV0qIDI+L2Rldi9udWxsYCBcCisJCSR7c3JjZGlyfS8uLi8uLi8uLi90Y2wgXAorCQlgbHMgLWRyICR7c3JjZGlyfS8uLi8uLi8uLi90Y2xbWzctOV1dKiAyPi9kZXYvbnVsbCBgIDsgZG8KKyAgICBpZiB0ZXN0IC1mICRpL2dlbmVyaWMvdGNsSW50LmggOyB0aGVuCisgICAgICBhY19jdl9jX3RjbGg9YChjZCAkaS9nZW5lcmljOyBwd2QpYAorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCitmaQorIyBmaW5hbGx5IGNoZWNrIGluIGEgZmV3IGNvbW1vbiBpbnN0YWxsIGxvY2F0aW9ucworIworIyBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAoraWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgPSB4IDsgdGhlbgorICBmb3IgaSBpbiBcCisJCWBscyAtZHIgL3Vzci9sb2NhbC9zcmMvdGNsW1s3LTldXSogMj4vZGV2L251bGxgIFwKKwkJYGxzIC1kciAvdXNyL2xvY2FsL2xpYi90Y2xbWzctOV1dKiAyPi9kZXYvbnVsbGAgXAorCQkvdXNyL2xvY2FsL3NyYy90Y2wgXAorCQkvdXNyL2xvY2FsL2xpYi90Y2wgXAorCQkke3ByZWZpeH0vaW5jbHVkZSA7IGRvCisgICAgaWYgdGVzdCAtZiAkaS9nZW5lcmljL3RjbEludC5oIDsgdGhlbgorICAgICAgYWNfY3ZfY190Y2xoPWAoY2QgJGkvZ2VuZXJpYzsgcHdkKWAKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorZmkKKyMgc2VlIGlmIG9uZSBpcyBpbnN0YWxsZWQKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iID0geCA7IHRoZW4KKyAgIEFDX0hFQURFUl9DSEVDSyh0Y2xJbnQuaCwgYWNfY3ZfY190Y2xoPWluc3RhbGxlZCwgYWNfY3ZfY190Y2xoPSIiKQorZmkKK10pCitpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGh9IiA9IHggOyB0aGVuCisgIFRDTEhESVI9IiMgbm8gVGNsIHByaXZhdGUgaGVhZGVycyBmb3VuZCIKKyAgQUNfTVNHX0VSUk9SKFtDYW4ndCBmaW5kIFRjbCBwcml2YXRlIGhlYWRlcnNdKQorZmkKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iICE9IHggOyB0aGVuCisgIG5vX3RjbD0iIgorICBpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGh9IiA9IHgiaW5zdGFsbGVkIiA7IHRoZW4KKyAgICBBQ19NU0dfUkVTVUxUKFtpcyBpbnN0YWxsZWRdKQorICAgIFRDTEhESVI9IiIKKyAgZWxzZQorICAgIEFDX01TR19SRVNVTFQoW2ZvdW5kIGluICR7YWNfY3ZfY190Y2xofV0pCisgICAgIyB0aGlzIGhhY2sgaXMgY2F1c2UgdGhlIFRDTEhESVIgd29uJ3QgcHJpbnQgaWYgdGhlcmUgaXMgYSAiLUkiIGluIGl0LgorICAgIFRDTEhESVI9Ii1JJHthY19jdl9jX3RjbGh9IgorICBmaQorZmkKKworQUNfU1VCU1QoVENMSERJUikKK10pCisKKworQUNfREVGVU4oQ1lfQUNfUEFUSF9UQ0xDT05GSUcsIFsKKyMKKyMgT2ssIGxldHMgZmluZCB0aGUgdGNsIGNvbmZpZ3VyYXRpb24KKyMgRmlyc3QsIGxvb2sgZm9yIG9uZSB1bmluc3RhbGxlZC4gIAorIyB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZva2VkIGJ5IC0td2l0aC10Y2xjb25maWcKKyMKKworaWYgdGVzdCB4IiR7bm9fdGNsfSIgPSB4IDsgdGhlbgorICAjIHdlIHJlc2V0IG5vX3RjbCBpbiBjYXNlIHNvbWV0aGluZyBmYWlscyBoZXJlCisgIG5vX3RjbD10cnVlCisgIEFDX0FSR19XSVRIKHRjbGNvbmZpZywgWyAgLS13aXRoLXRjbGNvbmZpZz1ESVIgICAgRGlyZWN0b3J5IGNvbnRhaW5pbmcgdGNsIGNvbmZpZ3VyYXRpb24gKHRjbENvbmZpZy5zaCldLAorICAgICAgICAgd2l0aF90Y2xjb25maWc9JHt3aXRodmFsfSkKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgVGNsIGNvbmZpZ3VyYXRpb25dKQorICBBQ19DQUNIRV9WQUwoYWNfY3ZfY190Y2xjb25maWcsWworCisgICMgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC10Y2xjb25maWcgd2FzIHNwZWNpZmllZC4KKyAgaWYgdGVzdCB4IiR7d2l0aF90Y2xjb25maWd9IiAhPSB4IDsgdGhlbgorICAgIGlmIHRlc3QgLWYgIiR7d2l0aF90Y2xjb25maWd9L3RjbENvbmZpZy5zaCIgOyB0aGVuCisgICAgICBhY19jdl9jX3RjbGNvbmZpZz1gKGNkICR7d2l0aF90Y2xjb25maWd9OyBwd2QpYAorICAgIGVsc2UKKyAgICAgIEFDX01TR19FUlJPUihbJHt3aXRoX3RjbGNvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiB0Y2xDb25maWcuc2hdKQorICAgIGZpCisgIGZpCisKKyAgIyB0aGVuIGNoZWNrIGZvciBhIHByaXZhdGUgVGNsIGluc3RhbGxhdGlvbgorICBpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGNvbmZpZ30iID0geCA7IHRoZW4KKyAgICBmb3IgaSBpbiBcCisJCS4uL3RjbCBcCisJCWBscyAtZHIgLi4vdGNsW1s3LTldXSogMj4vZGV2L251bGxgIFwKKwkJLi4vLi4vdGNsIFwKKwkJYGxzIC1kciAuLi8uLi90Y2xbWzctOV1dKiAyPi9kZXYvbnVsbGAgXAorCQkuLi8uLi8uLi90Y2wgXAorCQlgbHMgLWRyIC4uLy4uLy4uL3RjbFtbNy05XV0qIDI+L2Rldi9udWxsYCA7IGRvCisgICAgICBpZiB0ZXN0IC1mICIkaS8ke2NvbmZpZ2Rpcn0vdGNsQ29uZmlnLnNoIiA7IHRoZW4KKyAgICAgICAgYWNfY3ZfY190Y2xjb25maWc9YChjZCAkaS8ke2NvbmZpZ2Rpcn07IHB3ZClgCisJYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaQorICAjIGNoZWNrIGluIGEgZmV3IGNvbW1vbiBpbnN0YWxsIGxvY2F0aW9ucworICBpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGNvbmZpZ30iID0geCA7IHRoZW4KKyAgICBmb3IgaSBpbiBgbHMgLWQgJHtwcmVmaXh9L2xpYiAvdXNyL2xvY2FsL2xpYiAyPi9kZXYvbnVsbGAgOyBkbworICAgICAgaWYgdGVzdCAtZiAiJGkvdGNsQ29uZmlnLnNoIiA7IHRoZW4KKyAgICAgICAgYWNfY3ZfY190Y2xjb25maWc9YChjZCAkaTsgcHdkKWAKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpCisgICMgY2hlY2sgaW4gYSBmZXcgb3RoZXIgcHJpdmF0ZSBsb2NhdGlvbnMKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xjb25maWd9IiA9IHggOyB0aGVuCisgICAgZm9yIGkgaW4gXAorCQkke3NyY2Rpcn0vLi4vdGNsIFwKKwkJYGxzIC1kciAke3NyY2Rpcn0vLi4vdGNsW1s3LTldXSogMj4vZGV2L251bGxgIDsgZG8KKyAgICAgIGlmIHRlc3QgLWYgIiRpLyR7Y29uZmlnZGlyfS90Y2xDb25maWcuc2giIDsgdGhlbgorICAgICAgICBhY19jdl9jX3RjbGNvbmZpZz1gKGNkICRpLyR7Y29uZmlnZGlyfTsgcHdkKWAKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpCisgIF0pCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsY29uZmlnfSIgPSB4IDsgdGhlbgorICAgIFRDTENPTkZJRz0iIyBubyBUY2wgY29uZmlncyBmb3VuZCIKKyAgICBBQ19NU0dfV0FSTihDYW4ndCBmaW5kIFRjbCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zKQorICBlbHNlCisgICAgbm9fdGNsPQorICAgIFRDTENPTkZJRz0ke2FjX2N2X2NfdGNsY29uZmlnfS90Y2xDb25maWcuc2gKKyAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICRUQ0xDT05GSUcpCisgIGZpCitmaQorXSkKKworIyBEZWZpbmVkIGFzIGEgc2VwYXJhdGUgbWFjcm8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSB0aGUgdmFsdWVzCisjIGZyb20gUEFUSF9UQ0xDT05GSUcgKGJlY2F1c2UgdGhpcyBjYW4gYWxzbyBiZSBjYWNoZWQpLgorQUNfREVGVU4oQ1lfQUNfTE9BRF9UQ0xDT05GSUcsIFsKKyAgICAuICRUQ0xDT05GSUcKKworICAgIEFDX1NVQlNUKFRDTF9WRVJTSU9OKQorICAgIEFDX1NVQlNUKFRDTF9NQUpPUl9WRVJTSU9OKQorICAgIEFDX1NVQlNUKFRDTF9NSU5PUl9WRVJTSU9OKQorICAgIEFDX1NVQlNUKFRDTF9DQykKKyAgICBBQ19TVUJTVChUQ0xfREVGUykKKworZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCitkbmwgICAgQUNfU1VCU1QoVENMX0xJQl9GSUxFKQorCitkbmwgZG9uJ3QgZXhwb3J0LCBub3QgdXNlZCBvdXRzaWRlIG9mIGNvbmZpZ3VyZQorZG5sICAgICBBQ19TVUJTVChUQ0xfTElCUykKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworZG5sICAgIEFDX1NVQlNUKFRDTF9QUkVGSVgpCisKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworZG5sICAgIEFDX1NVQlNUKFRDTF9FWEVDX1BSRUZJWCkKKworICAgIEFDX1NVQlNUKFRDTF9TSExJQl9DRkxBR1MpCisgICAgQUNfU1VCU1QoVENMX1NITElCX0xEKQorZG5sIGRvbid0IGV4cG9ydCwgbm90IHVzZWQgb3V0c2lkZSBvZiBjb25maWd1cmUKKyAgICBBQ19TVUJTVChUQ0xfU0hMSUJfTERfTElCUykKKyAgICBBQ19TVUJTVChUQ0xfU0hMSUJfU1VGRklYKQorZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCisgICAgQUNfU1VCU1QoVENMX0RMX0xJQlMpCisgICAgQUNfU1VCU1QoVENMX0xEX0ZMQUdTKQorZG5sIGRvbid0IGV4cG9ydCwgbm90IHVzZWQgb3V0c2lkZSBvZiBjb25maWd1cmUKKyAgICBBQ19TVUJTVChUQ0xfTERfU0VBUkNIX0ZMQUdTKQorICAgIEFDX1NVQlNUKFRDTF9DT01QQVRfT0JKUykKKyAgICBBQ19TVUJTVChUQ0xfUkFOTElCKQorICAgIEFDX1NVQlNUKFRDTF9CVUlMRF9MSUJfU1BFQykKKyAgICBBQ19TVUJTVChUQ0xfTElCX1NQRUMpCisgICAgQUNfU1VCU1QoVENMX0xJQl9WRVJTSU9OU19PSykKKworZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCitkbmwgICAgQUNfU1VCU1QoVENMX1NIQVJFRF9MSUJfU1VGRklYKQorCitkbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKK2RubCAgICBBQ19TVUJTVChUQ0xfVU5TSEFSRURfTElCX1NVRkZJWCkKK10pCisKKyMgV2FybmluZzogVGsgZGVmaW5pdGlvbnMgYXJlIHZlcnkgc2ltaWxhciB0byBUY2wgZGVmaW5pdGlvbnMgYnV0CisjIGFyZSBub3QgcHJlY2lzZWx5IHRoZSBzYW1lLiAgVGhlcmUgYXJlIGEgY291cGxlIG9mIGRpZmZlcmVuY2VzLAorIyBzbyBkb24ndCBkbyBjaGFuZ2VzIHRvIFRjbCB0aGlua2luZyB5b3UgY2FuIGN1dCBhbmQgcGFzdGUgaXQgZG8gCisjIHRoZSBUayBkaWZmZXJlbmNlcyBhbmQgbGF0ZXIgc2ltcGx5IHN1YnN0aXR1dGUgIlRrIiBmb3IgIlRjbCIuCisjIEtub3duIGRpZmZlcmVuY2VzOgorIyAgLSBBY2NlcHRhYmxlIFRjbCBtYWpvciB2ZXJzaW9uICNzIGlzIDctOSB3aGlsZSBUayBpcyA0LTkKKyMgIC0gU2VhcmNoaW5nIGZvciBUY2wgaW5jbHVkZXMgbG9va2luZyBmb3IgdGNsSW50LmgsIFRrIGxvb2tzIGZvciB0ay5oCisjICAtIENvbXB1dGluZyBtYWpvci9taW5vciB2ZXJzaW9ucyBpcyBkaWZmZXJlbnQgYmVjYXVzZSBUayBkZXBlbmRzIG9uCisjICAgIGhlYWRlcnMgdG8gVGNsLCBUaywgYW5kIFguCisjICAtIFN5bWJvbHMgaW4gdGtDb25maWcuc2ggYXJlIGRpZmZlcmVudCB0aGFuIHRjbENvbmZpZy5zaAorIyAgLSBBY2NlcHRhYmxlIGZvciBUayB0byBiZSBtaXNzaW5nIGJ1dCBub3QgVGNsLgorCitBQ19ERUZVTihDWV9BQ19QQVRIX1RLSCwgWworIworIyBPaywgbGV0cyBmaW5kIHRoZSB0ayBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaGVhZGVycworIyBJZiB0aGUgZGlyZWN0b3J5IChwcmVzdW1hYmx5IHN5bWxpbmspIG5hbWVkICJ0ayIgZXhpc3RzLCB1c2UgdGhhdCBvbmUKKyMgaW4gcHJlZmVyZW5jZSB0byBhbnkgb3RoZXJzLiAgU2FtZSBsb2dpYyBpcyB1c2VkIHdoZW4gY2hvb3NpbmcgbGlicmFyeQorIyBhbmQgYWdhaW4gd2l0aCBUY2wuIFRoZSBzZWFyY2ggb3JkZXIgaXMgdGhlIGJlc3QgcGxhY2UgdG8gbG9vayBmaXJzdCwgdGhlbiBpbgorIyBkZWNyZWFzaW5nIHNpZ25pZmljYW5jZS4gVGhlIGxvb3AgYnJlYWtzIGlmIHRoZSB0cmlnZ2VyIGZpbGUgaXMgZm91bmQuCisjIE5vdGUgdGhlIGdyb3NzIGxpdHRsZSBjb252ZXJzaW9uIGhlcmUgb2Ygc3JjZGlyIGJ5IGNkJ2luZyB0byB0aGUgZm91bmQKKyMgZGlyZWN0b3J5LiBUaGlzIGNvbnZlcnRzIHRoZSBwYXRoIGZyb20gYSByZWxhdGl2ZSB0byBhbiBhYnNvbHV0ZSwgc28KKyMgcmVjdXJzaXZlIGNhY2hlIHZhcmlhYmxlcyBmb3IgdGhlIHBhdGggd2lsbCB3b3JrIHJpZ2h0LiBXZSBjaGVjayBhbGwKKyMgdGhlIHBvc3NpYmxlIHBhdGhzIGluIG9uZSBsb29wIHJhdGhlciB0aGFuIG1hbnkgc2VwZXJhdGUgbG9vcHMgdG8gc3BlZWQKKyMgdGhpbmdzIHVwLgorIyB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtdGtpbmNsdWRlCisjCitub190az10cnVlCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIFRrIHByaXZhdGUgaGVhZGVycykKK0FDX0FSR19XSVRIKHRraW5jbHVkZSwgWyAgLS13aXRoLXRraW5jbHVkZT1ESVIgICAgRGlyZWN0b3J5IHdoZXJlIHRrIHByaXZhdGUgaGVhZGVycyBhcmVdLCB3aXRoX3RraW5jbHVkZT0ke3dpdGh2YWx9KQorQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGtoLFsKKyMgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC10a2luY2x1ZGUgd2FzIHNwZWNpZmllZAoraWYgdGVzdCB4IiR7d2l0aF90a2luY2x1ZGV9IiAhPSB4IDsgdGhlbgorICBpZiB0ZXN0IC1mICR7d2l0aF90a2luY2x1ZGV9L3RrLmggOyB0aGVuCisgICAgYWNfY3ZfY190a2g9YChjZCAke3dpdGhfdGtpbmNsdWRlfTsgcHdkKWAKKyAgZWxpZiB0ZXN0IC1mICR7d2l0aF90a2luY2x1ZGV9L2dlbmVyaWMvdGsuaCA7IHRoZW4KKyAgICBhY19jdl9jX3RraD1gKGNkICR7d2l0aF90a2luY2x1ZGV9L2dlbmVyaWM7IHB3ZClgCisgIGVsc2UKKyAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90a2luY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gcHJpdmF0ZSBoZWFkZXJzXSkKKyAgZmkKK2ZpCisKKyMgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggVGsgY29uZmlndXJhdGlvbiBmaWxlCitpZiB0ZXN0IHgiJHthY19jdl9jX3RrY29uZmlnfSIgPSB4IDsgdGhlbgorICBpZiB0ZXN0IC1mICRhY19jdl9jX3RrY29uZmlnLy4uL2dlbmVyaWMvdGsuaCA7IHRoZW4KKyAgICBhY19jdl9jX3RraD1gKGNkICRhY19jdl9jX3RrY29uZmlnLy4uOyBwd2QpYAorICBmaQorZmkKKworIyBuZXh0IGNoZWNrIGluIHByaXZhdGUgc291cmNlIGRpcmVjdG9yeQorIworIyBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAoraWYgdGVzdCB4IiR7YWNfY3ZfY190a2h9IiA9IHggOyB0aGVuCisgIGZvciBpIGluIFwKKwkJJHtzcmNkaXJ9Ly4uL3RrIFwKKwkJYGxzIC1kciAke3NyY2Rpcn0vLi4vdGtbWzQtOV1dKiAyPi9kZXYvbnVsbGAgXAorCQkke3NyY2Rpcn0vLi4vLi4vdGsgXAorCQlgbHMgLWRyICR7c3JjZGlyfS8uLi8uLi90a1tbNC05XV0qIDI+L2Rldi9udWxsYCBcCisJCSR7c3JjZGlyfS8uLi8uLi8uLi90ayBcCisJCWBscyAtZHIgJHtzcmNkaXJ9Ly4uLy4uLy4uL3RrW1s0LTldXSogMj4vZGV2L251bGwgYCA7IGRvCisgICAgaWYgdGVzdCAtZiAkaS9nZW5lcmljL3RrLmggOyB0aGVuCisgICAgICBhY19jdl9jX3RraD1gKGNkICRpL2dlbmVyaWM7IHB3ZClgCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKK2ZpCisjIGZpbmFsbHkgY2hlY2sgaW4gYSBmZXcgY29tbW9uIGluc3RhbGwgbG9jYXRpb25zCisjCisjIHNpbmNlIGxzIHJldHVybnMgbG93ZXN0IHZlcnNpb24gbnVtYmVycyBmaXJzdCwgcmV2ZXJzZSBpdHMgb3V0cHV0CitpZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iID0geCA7IHRoZW4KKyAgZm9yIGkgaW4gXAorCQlgbHMgLWRyIC91c3IvbG9jYWwvc3JjL3RrW1s0LTldXSogMj4vZGV2L251bGxgIFwKKwkJYGxzIC1kciAvdXNyL2xvY2FsL2xpYi90a1tbNC05XV0qIDI+L2Rldi9udWxsYCBcCisJCS91c3IvbG9jYWwvc3JjL3RrIFwKKwkJL3Vzci9sb2NhbC9saWIvdGsgXAorCQkke3ByZWZpeH0vaW5jbHVkZSA7IGRvCisgICAgaWYgdGVzdCAtZiAkaS9nZW5lcmljL3RrLmggOyB0aGVuCisgICAgICBhY19jdl9jX3RraD1gKGNkICRpL2dlbmVyaWM7IHB3ZClgCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKK2ZpCisjIHNlZSBpZiBvbmUgaXMgaW5zdGFsbGVkCitpZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iID0geCA7IHRoZW4KKyAgIEFDX0hFQURFUl9DSEVDSyh0ay5oLCBhY19jdl9jX3RraD1pbnN0YWxsZWQsIGFjX2N2X2NfdGtoPSIiKQorZmkKK10pCitpZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iICE9IHggOyB0aGVuCisgIG5vX3RrPSIiCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgPSB4Imluc3RhbGxlZCIgOyB0aGVuCisgICAgQUNfTVNHX1JFU1VMVChbaXMgaW5zdGFsbGVkXSkKKyAgICBUS0hESVI9IiIKKyAgZWxzZQorICAgIEFDX01TR19SRVNVTFQoW2ZvdW5kIGluICR7YWNfY3ZfY190a2h9XSkKKyAgICAjIHRoaXMgaGFjayBpcyBjYXVzZSB0aGUgVEtIRElSIHdvbid0IHByaW50IGlmIHRoZXJlIGlzIGEgIi1JIiBpbiBpdC4KKyAgICBUS0hESVI9Ii1JJHthY19jdl9jX3RraH0iCisgIGZpCitlbHNlCisgIFRLSERJUj0iIyBubyBUayBkaXJlY3RvcnkgZm91bmQiCisgIEFDX01TR19XQVJOKFtDYW4ndCBmaW5kIFRrIHByaXZhdGUgaGVhZGVyc10pCisgIG5vX3RrPXRydWUKK2ZpCisKK0FDX1NVQlNUKFRLSERJUikKK10pCisKKworQUNfREVGVU4oQ1lfQUNfUEFUSF9US0NPTkZJRywgWworIworIyBPaywgbGV0cyBmaW5kIHRoZSB0ayBjb25maWd1cmF0aW9uCisjIEZpcnN0LCBsb29rIGZvciBvbmUgdW5pbnN0YWxsZWQuICAKKyMgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2tlZCBieSAtLXdpdGgtdGtjb25maWcKKyMKKworaWYgdGVzdCB4IiR7bm9fdGt9IiA9IHggOyB0aGVuCisgICMgd2UgcmVzZXQgbm9fdGsgaW4gY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQorICBub190az10cnVlCisgIEFDX0FSR19XSVRIKHRrY29uZmlnLCBbICAtLXdpdGgtdGtjb25maWc9RElSICAgICBEaXJlY3RvcnkgY29udGFpbmluZyB0ayBjb25maWd1cmF0aW9uICh0a0NvbmZpZy5zaCldLAorICAgICAgICAgd2l0aF90a2NvbmZpZz0ke3dpdGh2YWx9KQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBUayBjb25maWd1cmF0aW9uXSkKKyAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGtjb25maWcsWworCisgICMgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC10a2NvbmZpZyB3YXMgc3BlY2lmaWVkLgorICBpZiB0ZXN0IHgiJHt3aXRoX3RrY29uZmlnfSIgIT0geCA7IHRoZW4KKyAgICBpZiB0ZXN0IC1mICIke3dpdGhfdGtjb25maWd9L3RrQ29uZmlnLnNoIiA7IHRoZW4KKyAgICAgIGFjX2N2X2NfdGtjb25maWc9YChjZCAke3dpdGhfdGtjb25maWd9OyBwd2QpYAorICAgIGVsc2UKKyAgICAgIEFDX01TR19FUlJPUihbJHt3aXRoX3RrY29uZmlnfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIHRrQ29uZmlnLnNoXSkKKyAgICBmaQorICBmaQorCisgICMgdGhlbiBjaGVjayBmb3IgYSBwcml2YXRlIFRrIGxpYnJhcnkKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2NvbmZpZ30iID0geCA7IHRoZW4KKyAgICBmb3IgaSBpbiBcCisJCS4uL3RrIFwKKwkJYGxzIC1kciAuLi90a1tbNC05XV0qIDI+L2Rldi9udWxsYCBcCisJCS4uLy4uL3RrIFwKKwkJYGxzIC1kciAuLi8uLi90a1tbNC05XV0qIDI+L2Rldi9udWxsYCBcCisJCS4uLy4uLy4uL3RrIFwKKwkJYGxzIC1kciAuLi8uLi8uLi90a1tbNC05XV0qIDI+L2Rldi9udWxsYCA7IGRvCisgICAgICBpZiB0ZXN0IC1mICIkaS8ke2NvbmZpZ2Rpcn0vdGtDb25maWcuc2giIDsgdGhlbgorICAgICAgICBhY19jdl9jX3RrY29uZmlnPWAoY2QgJGkvJHtjb25maWdkaXJ9OyBwd2QpYAorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgIyBjaGVjayBpbiBhIGZldyBjb21tb24gaW5zdGFsbCBsb2NhdGlvbnMKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2NvbmZpZ30iID0geCA7IHRoZW4KKyAgICBmb3IgaSBpbiBgbHMgLWQgJHtwcmVmaXh9L2xpYiAvdXNyL2xvY2FsL2xpYiAyPi9kZXYvbnVsbGAgOyBkbworICAgICAgaWYgdGVzdCAtZiAiJGkvdGtDb25maWcuc2giIDsgdGhlbgorICAgICAgICBhY19jdl9jX3RrY29uZmlnPWAoY2QgJGk7IHB3ZClgCisJYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaQorICAjIGNoZWNrIGluIGEgZmV3IG90aGVyIHByaXZhdGUgbG9jYXRpb25zCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGtjb25maWd9IiA9IHggOyB0aGVuCisgICAgZm9yIGkgaW4gXAorCQkke3NyY2Rpcn0vLi4vdGsgXAorCQlgbHMgLWRyICR7c3JjZGlyfS8uLi90a1tbNC05XV0qIDI+L2Rldi9udWxsYCA7IGRvCisgICAgICBpZiB0ZXN0IC1mICIkaS8ke2NvbmZpZ2Rpcn0vdGtDb25maWcuc2giIDsgdGhlbgorICAgICAgICBhY19jdl9jX3RrY29uZmlnPWAoY2QgJGkvJHtjb25maWdkaXJ9OyBwd2QpYAorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgXSkKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2NvbmZpZ30iID0geCA7IHRoZW4KKyAgICBUS0NPTkZJRz0iIyBubyBUayBjb25maWdzIGZvdW5kIgorICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgVGsgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucykKKyAgZWxzZQorICAgIG5vX3RrPQorICAgIFRLQ09ORklHPSR7YWNfY3ZfY190a2NvbmZpZ30vdGtDb25maWcuc2gKKyAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICRUS0NPTkZJRykKKyAgZmkKK2ZpCisKK10pCisKKyMgRGVmaW5lZCBhcyBhIHNlcGFyYXRlIG1hY3JvIHNvIHdlIGRvbid0IGhhdmUgdG8gY2FjaGUgdGhlIHZhbHVlcworIyBmcm9tIFBBVEhfVEtDT05GSUcgKGJlY2F1c2UgdGhpcyBjYW4gYWxzbyBiZSBjYWNoZWQpLgorQUNfREVGVU4oQ1lfQUNfTE9BRF9US0NPTkZJRywgWworICAgIGlmIHRlc3QgLWYgIiRUS0NPTkZJRyIgOyB0aGVuCisgICAgICAuICRUS0NPTkZJRworICAgIGZpCisKKyAgICBBQ19TVUJTVChUS19WRVJTSU9OKQorZG5sIG5vdCBhY3R1YWxseSB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCitkbmwgICAgQUNfU1VCU1QoVEtfTUFKT1JfVkVSU0lPTikKK2RubCAgICBBQ19TVUJTVChUS19NSU5PUl9WRVJTSU9OKQorICAgIEFDX1NVQlNUKFRLX0RFRlMpCisKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworICAgIGRubCBBQ19TVUJTVChUS19MSUJfRklMRSkKKworZG5sIG5vdCB1c2VkIG91dHNpZGUgb2YgY29uZmlndXJlCitkbmwgICAgQUNfU1VCU1QoVEtfTElCUykKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworZG5sICAgIEFDX1NVQlNUKFRLX1BSRUZJWCkKKworZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCitkbmwgICAgQUNfU1VCU1QoVEtfRVhFQ19QUkVGSVgpCisKKyAgICBBQ19TVUJTVChUS19CVUlMRF9JTkNMVURFUykKKyAgICBBQ19TVUJTVChUS19YSU5DTFVERVMpCisgICAgQUNfU1VCU1QoVEtfWExJQlNXKQorICAgIEFDX1NVQlNUKFRLX0JVSUxEX0xJQl9TUEVDKQorICAgIEFDX1NVQlNUKFRLX0xJQl9TUEVDKQorXSkKKworIyBjaGVjayBmb3IgSXRjbCBoZWFkZXJzLiAKKworQUNfREVGVU4oQ1lfQUNfUEFUSF9JVENMQ09ORklHLCBbCisjCisjIE9rLCBsZXRzIGZpbmQgdGhlIGl0Y2wgY29uZmlndXJhdGlvbgorIyBGaXJzdCwgbG9vayBmb3Igb25lIHVuaW5zdGFsbGVkLiAgCisjIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLWl0Y2xjb25maWcKKyMKKworaWYgdGVzdCB4IiR7bm9faXRjbH0iID0geCA7IHRoZW4KKyAgIyB3ZSByZXNldCBub19pdGNsIGluIGNhc2Ugc29tZXRoaW5nIGZhaWxzIGhlcmUKKyAgbm9faXRjbD10cnVlCisgIEFDX0FSR19XSVRIKGl0Y2xjb25maWcsIFsgIC0td2l0aC1pdGNsY29uZmlnICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyBpdGNsIGNvbmZpZ3VyYXRpb24gKGl0Y2xDb25maWcuc2gpXSwKKyAgICAgICAgIHdpdGhfaXRjbGNvbmZpZz0ke3dpdGh2YWx9KQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBJdGNsIGNvbmZpZ3VyYXRpb25dKQorICBBQ19DQUNIRV9WQUwoYWNfY3ZfY19pdGNsY29uZmlnLFsKKworICAjIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtaXRjbGNvbmZpZyB3YXMgc3BlY2lmaWVkLgorICBpZiB0ZXN0IHgiJHt3aXRoX2l0Y2xjb25maWd9IiAhPSB4IDsgdGhlbgorICAgIGlmIHRlc3QgLWYgIiR7d2l0aF9pdGNsY29uZmlnfS9pdGNsQ29uZmlnLnNoIiA7IHRoZW4KKyAgICAgIGFjX2N2X2NfaXRjbGNvbmZpZz1gKGNkICR7d2l0aF9pdGNsY29uZmlnfTsgcHdkKWAKKyAgICBlbHNlCisgICAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF9pdGNsY29uZmlnfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGl0Y2xDb25maWcuc2hdKQorICAgIGZpCisgIGZpCisKKyAgIyB0aGVuIGNoZWNrIGZvciBhIHByaXZhdGUgSXRjbCBsaWJyYXJ5CisgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGNvbmZpZ30iID0geCA7IHRoZW4KKyAgICBmb3IgaSBpbiBcCisJCS4uL2l0Y2wvaXRjbCBcCisJCWBscyAtZHIgLi4vaXRjbFtbNC05XV0qL2l0Y2wgMj4vZGV2L251bGxgIFwKKwkJLi4vLi4vaXRjbCBcCisJCWBscyAtZHIgLi4vLi4vaXRjbFtbNC05XV0qL2l0Y2wgMj4vZGV2L251bGxgIFwKKwkJLi4vLi4vLi4vaXRjbCBcCisJCWBscyAtZHIgLi4vLi4vLi4vaXRjbFtbNC05XV0qL2l0Y2wgMj4vZGV2L251bGxgIDsgZG8KKyAgICAgIGlmIHRlc3QgLWYgIiRpL2l0Y2xDb25maWcuc2giIDsgdGhlbgorICAgICAgICBhY19jdl9jX2l0Y2xjb25maWc9YChjZCAkaTsgcHdkKWAKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpCisgICMgY2hlY2sgaW4gYSBmZXcgY29tbW9uIGluc3RhbGwgbG9jYXRpb25zCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGNvbmZpZ30iID0geCA7IHRoZW4KKyAgICBmb3IgaSBpbiBgbHMgLWQgJHtwcmVmaXh9L2xpYiAvdXNyL2xvY2FsL2xpYiAyPi9kZXYvbnVsbGAgOyBkbworICAgICAgaWYgdGVzdCAtZiAiJGkvaXRjbENvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfaXRjbGNvbmZpZz1gKGNkICRpOyBwd2QpYAorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgIyBjaGVjayBpbiBhIGZldyBvdGhlciBwcml2YXRlIGxvY2F0aW9ucworICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xjb25maWd9IiA9IHggOyB0aGVuCisgICAgZm9yIGkgaW4gXAorCQkke3NyY2Rpcn0vLi4vaXRjbC9pdGNsIFwKKwkJYGxzIC1kciAke3NyY2Rpcn0vLi4vaXRjbFtbNC05XV0qL2l0Y2wgMj4vZGV2L251bGxgIDsgZG8KKyAgICAgIGlmIHRlc3QgLWYgIiRpL2l0Y2xDb25maWcuc2giIDsgdGhlbgorICAgICAgICBhY19jdl9jX2l0Y2xjb25maWc9YChjZCAkaTsgcHdkKWAKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpCisgIF0pCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGNvbmZpZ30iID0geCA7IHRoZW4KKyAgICBJVENMQ09ORklHPSIjIG5vIEl0Y2wgY29uZmlncyBmb3VuZCIKKyAgICBBQ19NU0dfV0FSTihDYW4ndCBmaW5kIEl0Y2wgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucykKKyAgZWxzZQorICAgIG5vX2l0Y2w9CisgICAgSVRDTENPTkZJRz0ke2FjX2N2X2NfaXRjbGNvbmZpZ30vaXRjbENvbmZpZy5zaAorICAgIEFDX01TR19SRVNVTFQoZm91bmQgJElUQ0xDT05GSUcpCisgIGZpCitmaQorXSkKKworIyBEZWZpbmVkIGFzIGEgc2VwYXJhdGUgbWFjcm8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSB0aGUgdmFsdWVzCisjIGZyb20gUEFUSF9JVENMQ09ORklHIChiZWNhdXNlIHRoaXMgY2FuIGFsc28gYmUgY2FjaGVkKS4KK0FDX0RFRlVOKENZX0FDX0xPQURfSVRDTENPTkZJRywgWworICAgIGlmIHRlc3QgLWYgIiRJVENMQ09ORklHIiA7IHRoZW4KKyAgICAgIC4gJElUQ0xDT05GSUcKKyAgICBmaQorCisgICAgQUNfU1VCU1QoSVRDTF9WRVJTSU9OKQorZG5sIG5vdCBhY3R1YWxseSB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCitkbmwgICAgQUNfU1VCU1QoSVRDTF9NQUpPUl9WRVJTSU9OKQorZG5sICAgIEFDX1NVQlNUKElUQ0xfTUlOT1JfVkVSU0lPTikKKyAgICBBQ19TVUJTVChJVENMX0RFRlMpCisKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworICAgIGRubCBBQ19TVUJTVChJVENMX0xJQl9GSUxFKQorCitkbmwgbm90IHVzZWQgb3V0c2lkZSBvZiBjb25maWd1cmUKK2RubCAgICBBQ19TVUJTVChJVENMX0xJQlMpCitkbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKK2RubCAgICBBQ19TVUJTVChJVENMX1BSRUZJWCkKKworZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCitkbmwgICAgQUNfU1VCU1QoSVRDTF9FWEVDX1BSRUZJWCkKKworICAgIEFDX1NVQlNUKElUQ0xfQlVJTERfSU5DTFVERVMpCisgICAgQUNfU1VCU1QoSVRDTF9CVUlMRF9MSUJfU1BFQykKKyAgICBBQ19TVUJTVChJVENMX0xJQl9TUEVDKQorXSkKKworIyBjaGVjayBmb3IgSXRjbCBoZWFkZXJzLiAKKworQUNfREVGVU4oQ1lfQUNfUEFUSF9JVENMSCwgWworQUNfTVNHX0NIRUNLSU5HKGZvciBJdGNsIHByaXZhdGUgaGVhZGVycy4gc3JjZGlyPSR7c3JjZGlyfSkKK2lmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGh9IiA9IHggOyB0aGVuCisgIGZvciBpIGluICR7c3JjZGlyfS8uLi9pdGNsICR7c3JjZGlyfS8uLi8uLi9pdGNsICR7c3JjZGlyfS8uLi8uLi8uLi9pdGNsICR7c3JjZGlyfS8uLi9pdGNsL2l0Y2w7IGRvCisgICAgaWYgdGVzdCAtZiAkaS9nZW5lcmljL2l0Y2wuaCA7IHRoZW4KKyAgICAgIGFjX2N2X2NfaXRjbGg9YChjZCAkaS9nZW5lcmljOyBwd2QpYAorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCitmaQoraWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsaH0iID0geCA7IHRoZW4KKyAgSVRDTEhESVI9IiMgbm8gSXRjbCBwcml2YXRlIGhlYWRlcnMgZm91bmQiCisgIEFDX01TR19FUlJPUihbQ2FuJ3QgZmluZCBJdGNsIHByaXZhdGUgaGVhZGVyc10pCitmaQoraWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsaH0iICE9IHggOyB0aGVuCisgICAgIElUQ0xIRElSPSItSSR7YWNfY3ZfY19pdGNsaH0iCitmaQorIyBzaG91bGQgYWx3YXlzIGJlIGhlcmUKKyMgICAgIElUQ0xMSUI9Ii4uL2l0Y2wvaXRjbC91bml4L2xpYml0Y2wuYSIKK0FDX1NVQlNUKElUQ0xIRElSKQorI0FDX1NVQlNUKElUQ0xMSUIpCitdKQorCisKK0FDX0RFRlVOKENZX0FDX1BBVEhfSVRLQ09ORklHLCBbCisjCisjIE9rLCBsZXRzIGZpbmQgdGhlIGl0ayBjb25maWd1cmF0aW9uCisjIEZpcnN0LCBsb29rIGZvciBvbmUgdW5pbnN0YWxsZWQuICAKKyMgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2tlZCBieSAtLXdpdGgtaXRrY29uZmlnCisjCisKK2lmIHRlc3QgeCIke25vX2l0a30iID0geCA7IHRoZW4KKyAgIyB3ZSByZXNldCBub19pdGsgaW4gY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQorICBub19pdGs9dHJ1ZQorICBBQ19BUkdfV0lUSChpdGtjb25maWcsIFsgIC0td2l0aC1pdGtjb25maWcgICAgICAgICAgIGRpcmVjdG9yeSBjb250YWluaW5nIGl0ayBjb25maWd1cmF0aW9uIChpdGtDb25maWcuc2gpXSwKKyAgICAgICAgIHdpdGhfaXRrY29uZmlnPSR7d2l0aHZhbH0pCisgIEFDX01TR19DSEVDS0lORyhbZm9yIEl0ayBjb25maWd1cmF0aW9uXSkKKyAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaXRrY29uZmlnLFsKKworICAjIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtaXRrY29uZmlnIHdhcyBzcGVjaWZpZWQuCisgIGlmIHRlc3QgeCIke3dpdGhfaXRrY29uZmlnfSIgIT0geCA7IHRoZW4KKyAgICBpZiB0ZXN0IC1mICIke3dpdGhfaXRrY29uZmlnfS9pdGtDb25maWcuc2giIDsgdGhlbgorICAgICAgYWNfY3ZfY19pdGtjb25maWc9YChjZCAke3dpdGhfaXRrY29uZmlnfTsgcHdkKWAKKyAgICBlbHNlCisgICAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF9pdGtjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaXRrQ29uZmlnLnNoXSkKKyAgICBmaQorICBmaQorCisgICMgdGhlbiBjaGVjayBmb3IgYSBwcml2YXRlIEl0ayBsaWJyYXJ5CisgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRrY29uZmlnfSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluIFwKKwkJLi4vaXRjbC9pdGsgXAorCQlgbHMgLWRyIC4uL2l0Y2xbWzQtOV1dKi9pdGsgMj4vZGV2L251bGxgIFwKKwkJLi4vLi4vaXRrIFwKKwkJYGxzIC1kciAuLi8uLi9pdGNsW1s0LTldXSovaXRrIDI+L2Rldi9udWxsYCBcCisJCS4uLy4uLy4uL2l0ayBcCisJCWBscyAtZHIgLi4vLi4vLi4vaXRjbFtbNC05XV0qL2l0ayAyPi9kZXYvbnVsbGAgOyBkbworICAgICAgaWYgdGVzdCAtZiAiJGkvaXRrQ29uZmlnLnNoIiA7IHRoZW4KKyAgICAgICAgYWNfY3ZfY19pdGtjb25maWc9YChjZCAkaTsgcHdkKWAKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpCisgICMgY2hlY2sgaW4gYSBmZXcgY29tbW9uIGluc3RhbGwgbG9jYXRpb25zCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRrY29uZmlnfSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluIGBscyAtZCAke3ByZWZpeH0vbGliIC91c3IvbG9jYWwvbGliIDI+L2Rldi9udWxsYCA7IGRvCisgICAgICBpZiB0ZXN0IC1mICIkaS9pdGtDb25maWcuc2giIDsgdGhlbgorICAgICAgICBhY19jdl9jX2l0a2NvbmZpZz1gKGNkICRpOyBwd2QpYAorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgIyBjaGVjayBpbiBhIGZldyBvdGhlciBwcml2YXRlIGxvY2F0aW9ucworICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0a2NvbmZpZ30iID0geCA7IHRoZW4KKyAgICBmb3IgaSBpbiBcCisJCSR7c3JjZGlyfS8uLi9pdGNsL2l0ayBcCisJCWBscyAtZHIgJHtzcmNkaXJ9Ly4uL2l0Y2xbWzQtOV1dKi9pdGsgMj4vZGV2L251bGxgIDsgZG8KKyAgICAgIGlmIHRlc3QgLWYgIiRpL2l0a0NvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfaXRrY29uZmlnPWAoY2QgJGk7IHB3ZClgCisJYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaQorICBdKQorICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0a2NvbmZpZ30iID0geCA7IHRoZW4KKyAgICBJVEtDT05GSUc9IiMgbm8gSXRrIGNvbmZpZ3MgZm91bmQiCisgICAgQUNfTVNHX1dBUk4oQ2FuJ3QgZmluZCBJdGsgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucykKKyAgZWxzZQorICAgIG5vX2l0az0KKyAgICBJVEtDT05GSUc9JHthY19jdl9jX2l0a2NvbmZpZ30vaXRrQ29uZmlnLnNoCisgICAgQUNfTVNHX1JFU1VMVChmb3VuZCAkSVRLQ09ORklHKQorICBmaQorZmkKKworXSkKKworIyBEZWZpbmVkIGFzIGEgc2VwYXJhdGUgbWFjcm8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSB0aGUgdmFsdWVzCisjIGZyb20gUEFUSF9JVEtDT05GSUcgKGJlY2F1c2UgdGhpcyBjYW4gYWxzbyBiZSBjYWNoZWQpLgorQUNfREVGVU4oQ1lfQUNfTE9BRF9JVEtDT05GSUcsIFsKKyAgICBpZiB0ZXN0IC1mICIkSVRLQ09ORklHIiA7IHRoZW4KKyAgICAgIC4gJElUS0NPTkZJRworICAgIGZpCisKKyAgICBBQ19TVUJTVChJVEtfVkVSU0lPTikKK2RubCBub3QgYWN0dWFsbHkgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworZG5sICAgIEFDX1NVQlNUKElUS19NQUpPUl9WRVJTSU9OKQorZG5sICAgIEFDX1NVQlNUKElUS19NSU5PUl9WRVJTSU9OKQorICAgIEFDX1NVQlNUKElUS19ERUZTKQorCitkbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKKyAgICBkbmwgQUNfU1VCU1QoSVRLX0xJQl9GSUxFKQorCitkbmwgbm90IHVzZWQgb3V0c2lkZSBvZiBjb25maWd1cmUKK2RubCAgICBBQ19TVUJTVChJVEtfTElCUykKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworZG5sICAgIEFDX1NVQlNUKElUS19QUkVGSVgpCisKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworZG5sICAgIEFDX1NVQlNUKElUS19FWEVDX1BSRUZJWCkKKworICAgIEFDX1NVQlNUKElUS19CVUlMRF9JTkNMVURFUykKKyAgICBBQ19TVUJTVChJVEtfQlVJTERfTElCX1NQRUMpCisgICAgQUNfU1VCU1QoSVRLX0xJQl9TUEVDKQorXSkKKworQUNfREVGVU4oQ1lfQUNfUEFUSF9JVEtILCBbCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIEl0ayBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0pCitpZiB0ZXN0IHgiJHthY19jdl9jX2l0a2h9IiA9IHggOyB0aGVuCisgIGZvciBpIGluICR7c3JjZGlyfS8uLi9pdGNsICR7c3JjZGlyfS8uLi8uLi9pdGNsICR7c3JjZGlyfS8uLi8uLi8uLi9pdGNsICR7c3JjZGlyfS8uLi9pdGNsL2l0azsgZG8KKyAgICBpZiB0ZXN0IC1mICRpL2dlbmVyaWMvaXRrLmggOyB0aGVuCisgICAgICBhY19jdl9jX2l0a2g9YChjZCAkaS9nZW5lcmljOyBwd2QpYAorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCitmaQoraWYgdGVzdCB4IiR7YWNfY3ZfY19pdGtofSIgPSB4IDsgdGhlbgorICBJVEtIRElSPSIjIG5vIEl0ayBwcml2YXRlIGhlYWRlcnMgZm91bmQiCisgIEFDX01TR19FUlJPUihbQ2FuJ3QgZmluZCBJdGsgcHJpdmF0ZSBoZWFkZXJzXSkKK2ZpCitpZiB0ZXN0IHgiJHthY19jdl9jX2l0a2h9IiAhPSB4IDsgdGhlbgorICAgICBJVEtIRElSPSItSSR7YWNfY3ZfY19pdGtofSIKK2ZpCisjIHNob3VsZCBhbHdheXMgYmUgaGVyZQorIyAgICAgSVRLTElCPSIuLi9pdGNsL2l0ay91bml4L2xpYml0ay5hIgorQUNfU1VCU1QoSVRLSERJUikKKyNBQ19TVUJTVChJVEtMSUIpCitdKQorCisjIGNoZWNrIGZvciBUaXggaGVhZGVycy4gCisKK0FDX0RFRlVOKENZX0FDX1BBVEhfVElYSCwgWworQUNfTVNHX0NIRUNLSU5HKGZvciBUaXggcHJpdmF0ZSBoZWFkZXJzLiBzcmNkaXI9JHtzcmNkaXJ9KQoraWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgPSB4IDsgdGhlbgorICBmb3IgaSBpbiAke3NyY2Rpcn0vLi4vdGl4ICR7c3JjZGlyfS8uLi8uLi90aXggJHtzcmNkaXJ9Ly4uLy4uLy4uL3RpeCA7IGRvCisgICAgaWYgdGVzdCAtZiAkaS9nZW5lcmljL3RpeC5oIDsgdGhlbgorICAgICAgYWNfY3ZfY190aXhoPWAoY2QgJGkvZ2VuZXJpYzsgcHdkKWAKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorZmkKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGl4aH0iID0geCA7IHRoZW4KKyAgVElYSERJUj0iIyBubyBUaXggcHJpdmF0ZSBoZWFkZXJzIGZvdW5kIgorICBBQ19NU0dfRVJST1IoW0Nhbid0IGZpbmQgVGl4IHByaXZhdGUgaGVhZGVyc10pCitmaQoraWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgIT0geCA7IHRoZW4KKyAgICAgVElYSERJUj0iLUkke2FjX2N2X2NfdGl4aH0iCitmaQorQUNfU1VCU1QoVElYSERJUikKK10pCisKK0FDX0RFRlVOKENZX0FDX1BBVEhfVElYQ09ORklHLCBbCisjCisjIE9rLCBsZXRzIGZpbmQgdGhlIHRpeCBjb25maWd1cmF0aW9uCisjIEZpcnN0LCBsb29rIGZvciBvbmUgdW5pbnN0YWxsZWQuICAKKyMgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2tlZCBieSAtLXdpdGgtaXRrY29uZmlnCisjCisKK2lmIHRlc3QgeCIke25vX3RpeH0iID0geCA7IHRoZW4KKyAgIyB3ZSByZXNldCBub190aXggaW4gY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQorICBub190aXg9dHJ1ZQorICBBQ19BUkdfV0lUSCh0aXhjb25maWcsIFsgIC0td2l0aC10aXhjb25maWcgICAgICAgICAgIGRpcmVjdG9yeSBjb250YWluaW5nIHRpeCBjb25maWd1cmF0aW9uICh0aXhDb25maWcuc2gpXSwKKyAgICAgICAgIHdpdGhfdGl4Y29uZmlnPSR7d2l0aHZhbH0pCisgIEFDX01TR19DSEVDS0lORyhbZm9yIFRpeCBjb25maWd1cmF0aW9uXSkKKyAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGl4Y29uZmlnLFsKKworICAjIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGl4Y29uZmlnIHdhcyBzcGVjaWZpZWQuCisgIGlmIHRlc3QgeCIke3dpdGhfdGl4Y29uZmlnfSIgIT0geCA7IHRoZW4KKyAgICBpZiB0ZXN0IC1mICIke3dpdGhfdGl4Y29uZmlnfS90aXhDb25maWcuc2giIDsgdGhlbgorICAgICAgYWNfY3ZfY190aXhjb25maWc9YChjZCAke3dpdGhfdGl4Y29uZmlnfTsgcHdkKWAKKyAgICBlbHNlCisgICAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90aXhjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gdGl4Q29uZmlnLnNoXSkKKyAgICBmaQorICBmaQorCisgICMgdGhlbiBjaGVjayBmb3IgYSBwcml2YXRlIFRpeCBsaWJyYXJ5CisgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGl4Y29uZmlnfSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluIFwKKwkJLi4vdGl4IFwKKwkJYGxzIC1kciAuLi90aXggMj4vZGV2L251bGxgIFwKKwkJLi4vLi4vdGl4IFwKKwkJYGxzIC1kciAuLi8uLi90aXggMj4vZGV2L251bGxgIFwKKwkJLi4vLi4vLi4vdGl4IFwKKwkJYGxzIC1kciAuLi8uLi8uLi90aXggMj4vZGV2L251bGxgIDsgZG8KKyAgICAgIGVjaG8gIioqKiogTG9va2luZyBhdCAkaSAtIHdpdGggJHtjb25maWdkaXJ9IgorICAgICAgaWYgdGVzdCAtZiAiJGkvdGl4Q29uZmlnLnNoIiA7IHRoZW4KKyAgICAgICAgYWNfY3ZfY190aXhjb25maWc9YChjZCAkaTsgcHdkKWAKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpCisgICMgY2hlY2sgaW4gYSBmZXcgY29tbW9uIGluc3RhbGwgbG9jYXRpb25zCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGl4Y29uZmlnfSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluIGBscyAtZCAke3ByZWZpeH0vbGliIC91c3IvbG9jYWwvbGliIDI+L2Rldi9udWxsYCA7IGRvCisgICAgICBlY2hvICIqKioqIExvb2tpbmcgYXQgJGkiCisgICAgICBpZiB0ZXN0IC1mICIkaS90aXhDb25maWcuc2giIDsgdGhlbgorICAgICAgICBhY19jdl9jX3RpeGNvbmZpZz1gKGNkICRpOyBwd2QpYAorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgIyBjaGVjayBpbiBhIGZldyBvdGhlciBwcml2YXRlIGxvY2F0aW9ucworICBlY2hvICIqKioqIE90aGVyIHByaXZhdGUgbG9jYXRpb25zIgorICBpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGNvbmZpZ30iID0geCA7IHRoZW4KKyAgICBmb3IgaSBpbiBcCisJCSR7c3JjZGlyfS8uLi90aXggXAorCQlgbHMgLWRyICR7c3JjZGlyfS8uLi90aXggMj4vZGV2L251bGxgIDsgZG8KKyAgICAgIGVjaG8gIioqKiogTG9va2luZyBhdCAkaSAtIHdpdGggJHtjb25maWdkaXJ9IgorICAgICAgaWYgdGVzdCAtZiAiJGkvJHtjb25maWdkaXJ9L3RpeENvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfdGl4Y29uZmlnPWAoY2QgJGkvJHtjb25maWdkaXJ9OyBwd2QpYAorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgXSkKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhjb25maWd9IiA9IHggOyB0aGVuCisgICAgVElYQ09ORklHPSIjIG5vIFRpeCBjb25maWdzIGZvdW5kIgorICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgVGl4IGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMpCisgIGVsc2UKKyAgICBub190aXg9CisgICAgVElYQ09ORklHPSR7YWNfY3ZfY190aXhjb25maWd9L3RpeENvbmZpZy5zaAorICAgIEFDX01TR19SRVNVTFQoZm91bmQgJFRJWENPTkZJRykKKyAgZmkKK2ZpCisKK10pCisKKyMgRGVmaW5lZCBhcyBhIHNlcGFyYXRlIG1hY3JvIHNvIHdlIGRvbid0IGhhdmUgdG8gY2FjaGUgdGhlIHZhbHVlcworIyBmcm9tIFBBVEhfVElYQ09ORklHIChiZWNhdXNlIHRoaXMgY2FuIGFsc28gYmUgY2FjaGVkKS4KK0FDX0RFRlVOKENZX0FDX0xPQURfVElYQ09ORklHLCBbCisgICAgaWYgdGVzdCAtZiAiJFRJWENPTkZJRyIgOyB0aGVuCisgICAgICAuICRUSVhDT05GSUcKKyAgICBmaQorCisgICAgQUNfU1VCU1QoVElYX1ZFUlNJT04pCitkbmwgbm90IGFjdHVhbGx5IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKK2RubCAgICBBQ19TVUJTVChUSVhfTUFKT1JfVkVSU0lPTikKK2RubCAgICBBQ19TVUJTVChUSVhfTUlOT1JfVkVSU0lPTikKK2RubCAgICBBQ19TVUJTVChUSVhfREVGUykKKworZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCitkbmwgICAgZG5sIEFDX1NVQlNUKFRJWF9MSUJfRklMRSkKKworZG5sIG5vdCB1c2VkIG91dHNpZGUgb2YgY29uZmlndXJlCitkbmwgICAgQUNfU1VCU1QoVElYX0xJQlMpCitkbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKK2RubCAgICBBQ19TVUJTVChUSVhfUFJFRklYKQorCitkbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKK2RubCAgICBBQ19TVUJTVChUSVhfRVhFQ19QUkVGSVgpCisKK2RubCAgICBBQ19TVUJTVChUSVhfQlVJTERfSU5DTFVERVMpCisgICAgQUNfU1VCU1QoVElYX0JVSUxEX0xJQl9TUEVDKQorZG5sICAgIEFDX1NVQlNUKFRJWF9MSUJfU1BFQykKK10pCmRpZmYgLS1naXQgYS9nZGIvYWNsb2NhbC5tNCBiL2dkYi9hY2xvY2FsLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZDM2NTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvYWNsb2NhbC5tNApAQCAtMCwwICsxLDEzMDcgQEAKK2RubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS40CisKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCitkbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCitkbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitkbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKK2RubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitkbmwgUEFSVElDVUxBUiBQVVJQT1NFLgorCitkbmwgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4gZm9yIEN5Z251cyBTdXBwb3J0CitkbmwgbWFqb3IgcmV3cml0aW5nIGZvciBUY2wgNy41IGJ5IERvbiBMaWJlcyA8bGliZXNAbmlzdC5nb3Y+CisKK2RubCBnZGIvY29uZmlndXJlLmluIHVzZXMgQkZEX05FRURfREVDTEFSQVRJT04sIHNvIGdldCBpdHMgZGVmaW5pdGlvbi4KK3NpbmNsdWRlKC4uL2JmZC9hY2luY2x1ZGUubTQpCisKK2RubCBUaGlzIGdldHMgdGhlIHN0YW5kYXJkIG1hY3JvcywgbGlrZSB0aGUgVENMLCBUSywgZXRjIG9uZXMuCitzaW5jbHVkZSguLi9jb25maWcvYWNpbmNsdWRlLm00KQorCitkbmwgQ1lHTlVTIExPQ0FMOiBUaGlzIGdldHMgdGhlIHJpZ2h0IHBvc2l4IGZsYWcgZm9yIGdjYworQUNfREVGVU4oQ1lfQUNfVENMX0xZTlhfUE9TSVgsCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pQUNfUkVRVUlSRShbQUNfUFJPR19DUFBdKQorQUNfTVNHX0NIRUNLSU5HKFtpZiBydW5uaW5nIEx5bnhPU10pCitBQ19DQUNIRV9WQUwoYWNfY3Zfb3NfbHlueCwKK1tBQ19FR1JFUF9DUFAoeWVzLAorWy8qCisgKiBUaGUgb2xkIEx5bnggImNjIiBvbmx5IGRlZmluZXMgIkx5bngiLCBidXQgdGhlIG5ld2VyIG9uZSB1c2VzICJfX0x5bnhfXyIKKyAqLworI2lmIGRlZmluZWQoX19MeW54X18pIHx8IGRlZmluZWQoTHlueCkKK3llcworI2VuZGlmCitdLCBhY19jdl9vc19seW54PXllcywgYWNfY3Zfb3NfbHlueD1ubyldKQorIworaWYgdGVzdCAiJGFjX2N2X29zX2x5bngiID0gInllcyIgOyB0aGVuCisgIEFDX01TR19SRVNVTFQoeWVzKQorICBBQ19ERUZJTkUoTFlOWCkKKyAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIC1tcG9zaXggb3IgLVggaXMgYXZhaWxhYmxlXSkKKyAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfcG9zaXhfZmxhZywKKyAgW0FDX1RSWV9DT01QSUxFKCxbCisgIC8qCisgICAqIFRoaXMgZmxhZyB2YXJpZXMgZGVwZW5kaW5nIG9uIGhvdyBvbGQgdGhlIGNvbXBpbGVyIGlzLgorICAgKiAtWCBpcyBmb3IgdGhlIG9sZCAiY2MiIGFuZCAiZ2NjIiAoYmFzZWQgb24gMS40MikuCisgICAqIC1tcG9zaXggaXMgZm9yIHRoZSBuZXcgZ2NjIChhdCBsZWFzdCAyLjUuOCkuCisgICAqLworICAjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gMgorICBjaG9rZSBtZQorICAjZW5kaWYKKyAgXSwgYWNfY3ZfY19wb3NpeF9mbGFnPSIgLW1wb3NpeCIsIGFjX2N2X2NfcG9zaXhfZmxhZz0iIC1YIildKQorICBDQz0iJENDICRhY19jdl9jX3Bvc2l4X2ZsYWciCisgIEFDX01TR19SRVNVTFQoJGFjX2N2X2NfcG9zaXhfZmxhZykKKyAgZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK10pCisKKyMKKyMgU29tZXRpbWVzIHRoZSBuYXRpdmUgY29tcGlsZXIgaXMgYSBib2d1cyBzdHViIGZvciBnY2Mgb3IgL3Vzci91Y2IvY2MuIFRoaXMKKyMgbWFrZXMgY29uZmlndXJlIHRoaW5rIGl0J3MgY3Jvc3MgY29tcGlsaW5nLiBJZiAtLXRhcmdldCB3YXNuJ3QgdXNlZCwgdGhlbgorIyB3ZSBjYW4ndCBjb25maWd1cmUsIHNvIHNvbWV0aGluZyBpcyB3cm9uZy4gV2UgZG9uJ3QgdXNlIHRoZSBjYWNoZQorIyBoZXJlIGNhdXNlIGlmIHNvbWVib2R5IGZpeGVzIHRoZWlyIGNvbXBpbGVyIGluc3RhbGwsIHdlIHdhbnQgdGhpcyB0byB3b3JrLgorQUNfREVGVU4oQ1lfQUNfQ19XT1JLUywKK1sjIElmIHdlIGNhbm5vdCBjb21waWxlIGFuZCBsaW5rIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBjYW4ndCBleHBlY3QgYW55dGhpbmcgdG8gd29yaworQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdGhlIGNvbXBpbGVyICgkQ0MpIGFjdHVhbGx5IHdvcmtzKQorQUNfVFJZX0NPTVBJTEUoLCBbLyogZG9uJ3QgbmVlZCBhbnl0aGluZyBoZXJlICovXSwKKyAgICAgICAgY19jb21waWxlcz15ZXMsIGNfY29tcGlsZXM9bm8pCisKK0FDX1RSWV9MSU5LKCwgWy8qIGRvbid0IG5lZWQgYW55dGhpbmcgaGVyZSAqL10sCisgICAgICAgIGNfbGlua3M9eWVzLCBjX2xpbmtzPW5vKQorCitpZiB0ZXN0IHgiJHtjX2NvbXBpbGVzfSIgPSB4Im5vIiA7IHRoZW4KKyAgQUNfTVNHX0VSUk9SKHRoZSBuYXRpdmUgY29tcGlsZXIgaXMgYnJva2VuIGFuZCB3b24ndCBjb21waWxlLikKK2ZpCisKK2lmIHRlc3QgeCIke2NfbGlua3N9IiA9IHgibm8iIDsgdGhlbgorICBBQ19NU0dfRVJST1IodGhlIG5hdGl2ZSBjb21waWxlciBpcyBicm9rZW4gYW5kIHdvbid0IGxpbmsuKQorZmkKK0FDX01TR19SRVNVTFQoeWVzKQorXSkKKworQUNfREVGVU4oQ1lfQUNfUEFUSF9UQ0xILCBbCisjCisjIE9rLCBsZXRzIGZpbmQgdGhlIHRjbCBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaGVhZGVycworIyBXYXJuaW5nOiB0cmFuc2l0aW9uIG9mIHZlcnNpb24gOSB0byAxMCB3aWxsIGJyZWFrIHRoaXMgYWxnb3JpdGhtCisjIGJlY2F1c2UgMTAgc29ydHMgYmVmb3JlIDkuIFdlIGFsc28gbG9vayBmb3IganVzdCB0Y2wuIFdlIGhhdmUgdG8KKyMgYmUgY2FyZWZ1bCB0aGF0IHdlIGRvbid0IG1hdGNoIHN0dWZmIGxpa2UgdGNsWCBieSBhY2NpZGVudC4KKyMgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2xrZWQgYnkgLS13aXRoLXRjbGluY2x1ZGUKKyMKKworbm9fdGNsPXRydWUKK0FDX01TR19DSEVDS0lORyhmb3IgVGNsIHByaXZhdGUgaGVhZGVycy4gZGlyPSR7Y29uZmlnZGlyfSkKK0FDX0FSR19XSVRIKHRjbGluY2x1ZGUsIFsgIC0td2l0aC10Y2xpbmNsdWRlPURJUiAgIERpcmVjdG9yeSB3aGVyZSB0Y2wgcHJpdmF0ZSBoZWFkZXJzIGFyZV0sIHdpdGhfdGNsaW5jbHVkZT0ke3dpdGh2YWx9KQorQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGNsaCxbCisjIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGNsaW5jbHVkZSB3YXMgc3BlY2lmaWVkCitpZiB0ZXN0IHgiJHt3aXRoX3RjbGluY2x1ZGV9IiAhPSB4IDsgdGhlbgorICBpZiB0ZXN0IC1mICR7d2l0aF90Y2xpbmNsdWRlfS90Y2xJbnQuaCA7IHRoZW4KKyAgICBhY19jdl9jX3RjbGg9YChjZCAke3dpdGhfdGNsaW5jbHVkZX07IHB3ZClgCisgIGVsaWYgdGVzdCAtZiAke3dpdGhfdGNsaW5jbHVkZX0vZ2VuZXJpYy90Y2xJbnQuaCA7IHRoZW4KKyAgICBhY19jdl9jX3RjbGg9YChjZCAke3dpdGhfdGNsaW5jbHVkZX0vZ2VuZXJpYzsgcHdkKWAKKyAgZWxzZQorICAgIEFDX01TR19FUlJPUihbJHt3aXRoX3RjbGluY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gcHJpdmF0ZSBoZWFkZXJzXSkKKyAgZmkKK2ZpCisKKyMgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggVGNsIGNvbmZpZ3VyYXRpb24gZmlsZQoraWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xjb25maWd9IiA9IHggOyB0aGVuCisgIGlmIHRlc3QgLWYgJGFjX2N2X2NfdGNsY29uZmlnLy4uL2dlbmVyaWMvdGNsSW50LmggOyB0aGVuCisgICAgYWNfY3ZfY190Y2xoPWAoY2QgJGFjX2N2X2NfdGNsY29uZmlnLy4uOyBwd2QpYAorICBmaQorZmkKKworIyBuZXh0IGNoZWNrIGluIHByaXZhdGUgc291cmNlIGRpcmVjdG9yeQorIworIyBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAoraWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgPSB4IDsgdGhlbgorICBmb3IgaSBpbiBcCisJCSR7c3JjZGlyfS8uLi90Y2wgXAorCQlgbHMgLWRyICR7c3JjZGlyfS8uLi90Y2xbWzctOV1dKiAyPi9kZXYvbnVsbGAgXAorCQkke3NyY2Rpcn0vLi4vLi4vdGNsIFwKKwkJYGxzIC1kciAke3NyY2Rpcn0vLi4vLi4vdGNsW1s3LTldXSogMj4vZGV2L251bGxgIFwKKwkJJHtzcmNkaXJ9Ly4uLy4uLy4uL3RjbCBcCisJCWBscyAtZHIgJHtzcmNkaXJ9Ly4uLy4uLy4uL3RjbFtbNy05XV0qIDI+L2Rldi9udWxsIGAgOyBkbworICAgIGlmIHRlc3QgLWYgJGkvZ2VuZXJpYy90Y2xJbnQuaCA7IHRoZW4KKyAgICAgIGFjX2N2X2NfdGNsaD1gKGNkICRpL2dlbmVyaWM7IHB3ZClgCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKK2ZpCisjIGZpbmFsbHkgY2hlY2sgaW4gYSBmZXcgY29tbW9uIGluc3RhbGwgbG9jYXRpb25zCisjCisjIHNpbmNlIGxzIHJldHVybnMgbG93ZXN0IHZlcnNpb24gbnVtYmVycyBmaXJzdCwgcmV2ZXJzZSBpdHMgb3V0cHV0CitpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGh9IiA9IHggOyB0aGVuCisgIGZvciBpIGluIFwKKwkJYGxzIC1kciAvdXNyL2xvY2FsL3NyYy90Y2xbWzctOV1dKiAyPi9kZXYvbnVsbGAgXAorCQlgbHMgLWRyIC91c3IvbG9jYWwvbGliL3RjbFtbNy05XV0qIDI+L2Rldi9udWxsYCBcCisJCS91c3IvbG9jYWwvc3JjL3RjbCBcCisJCS91c3IvbG9jYWwvbGliL3RjbCBcCisJCSR7cHJlZml4fS9pbmNsdWRlIDsgZG8KKyAgICBpZiB0ZXN0IC1mICRpL2dlbmVyaWMvdGNsSW50LmggOyB0aGVuCisgICAgICBhY19jdl9jX3RjbGg9YChjZCAkaS9nZW5lcmljOyBwd2QpYAorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCitmaQorIyBzZWUgaWYgb25lIGlzIGluc3RhbGxlZAoraWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgPSB4IDsgdGhlbgorICAgQUNfSEVBREVSX0NIRUNLKHRjbEludC5oLCBhY19jdl9jX3RjbGg9aW5zdGFsbGVkLCBhY19jdl9jX3RjbGg9IiIpCitmaQorXSkKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iID0geCA7IHRoZW4KKyAgVENMSERJUj0iIyBubyBUY2wgcHJpdmF0ZSBoZWFkZXJzIGZvdW5kIgorICBBQ19NU0dfRVJST1IoW0Nhbid0IGZpbmQgVGNsIHByaXZhdGUgaGVhZGVyc10pCitmaQoraWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgIT0geCA7IHRoZW4KKyAgbm9fdGNsPSIiCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iID0geCJpbnN0YWxsZWQiIDsgdGhlbgorICAgIEFDX01TR19SRVNVTFQoW2lzIGluc3RhbGxlZF0pCisgICAgVENMSERJUj0iIgorICBlbHNlCisgICAgQUNfTVNHX1JFU1VMVChbZm91bmQgaW4gJHthY19jdl9jX3RjbGh9XSkKKyAgICAjIHRoaXMgaGFjayBpcyBjYXVzZSB0aGUgVENMSERJUiB3b24ndCBwcmludCBpZiB0aGVyZSBpcyBhICItSSIgaW4gaXQuCisgICAgVENMSERJUj0iLUkke2FjX2N2X2NfdGNsaH0iCisgIGZpCitmaQorCitBQ19TVUJTVChUQ0xIRElSKQorXSkKKworCitBQ19ERUZVTihDWV9BQ19QQVRIX1RDTENPTkZJRywgWworIworIyBPaywgbGV0cyBmaW5kIHRoZSB0Y2wgY29uZmlndXJhdGlvbgorIyBGaXJzdCwgbG9vayBmb3Igb25lIHVuaW5zdGFsbGVkLiAgCisjIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLXRjbGNvbmZpZworIworCitpZiB0ZXN0IHgiJHtub190Y2x9IiA9IHggOyB0aGVuCisgICMgd2UgcmVzZXQgbm9fdGNsIGluIGNhc2Ugc29tZXRoaW5nIGZhaWxzIGhlcmUKKyAgbm9fdGNsPXRydWUKKyAgQUNfQVJHX1dJVEgodGNsY29uZmlnLCBbICAtLXdpdGgtdGNsY29uZmlnPURJUiAgICBEaXJlY3RvcnkgY29udGFpbmluZyB0Y2wgY29uZmlndXJhdGlvbiAodGNsQ29uZmlnLnNoKV0sCisgICAgICAgICB3aXRoX3RjbGNvbmZpZz0ke3dpdGh2YWx9KQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBUY2wgY29uZmlndXJhdGlvbl0pCisgIEFDX0NBQ0hFX1ZBTChhY19jdl9jX3RjbGNvbmZpZyxbCisKKyAgIyBGaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRjbGNvbmZpZyB3YXMgc3BlY2lmaWVkLgorICBpZiB0ZXN0IHgiJHt3aXRoX3RjbGNvbmZpZ30iICE9IHggOyB0aGVuCisgICAgaWYgdGVzdCAtZiAiJHt3aXRoX3RjbGNvbmZpZ30vdGNsQ29uZmlnLnNoIiA7IHRoZW4KKyAgICAgIGFjX2N2X2NfdGNsY29uZmlnPWAoY2QgJHt3aXRoX3RjbGNvbmZpZ307IHB3ZClgCisgICAgZWxzZQorICAgICAgQUNfTVNHX0VSUk9SKFske3dpdGhfdGNsY29uZmlnfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIHRjbENvbmZpZy5zaF0pCisgICAgZmkKKyAgZmkKKworICAjIHRoZW4gY2hlY2sgZm9yIGEgcHJpdmF0ZSBUY2wgaW5zdGFsbGF0aW9uCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsY29uZmlnfSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluIFwKKwkJLi4vdGNsIFwKKwkJYGxzIC1kciAuLi90Y2xbWzctOV1dKiAyPi9kZXYvbnVsbGAgXAorCQkuLi8uLi90Y2wgXAorCQlgbHMgLWRyIC4uLy4uL3RjbFtbNy05XV0qIDI+L2Rldi9udWxsYCBcCisJCS4uLy4uLy4uL3RjbCBcCisJCWBscyAtZHIgLi4vLi4vLi4vdGNsW1s3LTldXSogMj4vZGV2L251bGxgIDsgZG8KKyAgICAgIGlmIHRlc3QgLWYgIiRpLyR7Y29uZmlnZGlyfS90Y2xDb25maWcuc2giIDsgdGhlbgorICAgICAgICBhY19jdl9jX3RjbGNvbmZpZz1gKGNkICRpLyR7Y29uZmlnZGlyfTsgcHdkKWAKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpCisgICMgY2hlY2sgaW4gYSBmZXcgY29tbW9uIGluc3RhbGwgbG9jYXRpb25zCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsY29uZmlnfSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluIGBscyAtZCAke3ByZWZpeH0vbGliIC91c3IvbG9jYWwvbGliIDI+L2Rldi9udWxsYCA7IGRvCisgICAgICBpZiB0ZXN0IC1mICIkaS90Y2xDb25maWcuc2giIDsgdGhlbgorICAgICAgICBhY19jdl9jX3RjbGNvbmZpZz1gKGNkICRpOyBwd2QpYAorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgIyBjaGVjayBpbiBhIGZldyBvdGhlciBwcml2YXRlIGxvY2F0aW9ucworICBpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGNvbmZpZ30iID0geCA7IHRoZW4KKyAgICBmb3IgaSBpbiBcCisJCSR7c3JjZGlyfS8uLi90Y2wgXAorCQlgbHMgLWRyICR7c3JjZGlyfS8uLi90Y2xbWzctOV1dKiAyPi9kZXYvbnVsbGAgOyBkbworICAgICAgaWYgdGVzdCAtZiAiJGkvJHtjb25maWdkaXJ9L3RjbENvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfdGNsY29uZmlnPWAoY2QgJGkvJHtjb25maWdkaXJ9OyBwd2QpYAorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgXSkKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xjb25maWd9IiA9IHggOyB0aGVuCisgICAgVENMQ09ORklHPSIjIG5vIFRjbCBjb25maWdzIGZvdW5kIgorICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgVGNsIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMpCisgIGVsc2UKKyAgICBub190Y2w9CisgICAgVENMQ09ORklHPSR7YWNfY3ZfY190Y2xjb25maWd9L3RjbENvbmZpZy5zaAorICAgIEFDX01TR19SRVNVTFQoZm91bmQgJFRDTENPTkZJRykKKyAgZmkKK2ZpCitdKQorCisjIERlZmluZWQgYXMgYSBzZXBhcmF0ZSBtYWNybyBzbyB3ZSBkb24ndCBoYXZlIHRvIGNhY2hlIHRoZSB2YWx1ZXMKKyMgZnJvbSBQQVRIX1RDTENPTkZJRyAoYmVjYXVzZSB0aGlzIGNhbiBhbHNvIGJlIGNhY2hlZCkuCitBQ19ERUZVTihDWV9BQ19MT0FEX1RDTENPTkZJRywgWworICAgIC4gJFRDTENPTkZJRworCisgICAgQUNfU1VCU1QoVENMX1ZFUlNJT04pCisgICAgQUNfU1VCU1QoVENMX01BSk9SX1ZFUlNJT04pCisgICAgQUNfU1VCU1QoVENMX01JTk9SX1ZFUlNJT04pCisgICAgQUNfU1VCU1QoVENMX0NDKQorICAgIEFDX1NVQlNUKFRDTF9ERUZTKQorCitkbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKK2RubCAgICBBQ19TVUJTVChUQ0xfTElCX0ZJTEUpCisKK2RubCBkb24ndCBleHBvcnQsIG5vdCB1c2VkIG91dHNpZGUgb2YgY29uZmlndXJlCitkbmwgICAgIEFDX1NVQlNUKFRDTF9MSUJTKQorZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCitkbmwgICAgQUNfU1VCU1QoVENMX1BSRUZJWCkKKworZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCitkbmwgICAgQUNfU1VCU1QoVENMX0VYRUNfUFJFRklYKQorCisgICAgQUNfU1VCU1QoVENMX1NITElCX0NGTEFHUykKKyAgICBBQ19TVUJTVChUQ0xfU0hMSUJfTEQpCitkbmwgZG9uJ3QgZXhwb3J0LCBub3QgdXNlZCBvdXRzaWRlIG9mIGNvbmZpZ3VyZQorICAgIEFDX1NVQlNUKFRDTF9TSExJQl9MRF9MSUJTKQorICAgIEFDX1NVQlNUKFRDTF9TSExJQl9TVUZGSVgpCitkbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKKyAgICBBQ19TVUJTVChUQ0xfRExfTElCUykKKyAgICBBQ19TVUJTVChUQ0xfTERfRkxBR1MpCitkbmwgZG9uJ3QgZXhwb3J0LCBub3QgdXNlZCBvdXRzaWRlIG9mIGNvbmZpZ3VyZQorICAgIEFDX1NVQlNUKFRDTF9MRF9TRUFSQ0hfRkxBR1MpCisgICAgQUNfU1VCU1QoVENMX0NPTVBBVF9PQkpTKQorICAgIEFDX1NVQlNUKFRDTF9SQU5MSUIpCisgICAgQUNfU1VCU1QoVENMX0JVSUxEX0xJQl9TUEVDKQorICAgIEFDX1NVQlNUKFRDTF9MSUJfU1BFQykKKyAgICBBQ19TVUJTVChUQ0xfTElCX1ZFUlNJT05TX09LKQorCitkbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKK2RubCAgICBBQ19TVUJTVChUQ0xfU0hBUkVEX0xJQl9TVUZGSVgpCisKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworZG5sICAgIEFDX1NVQlNUKFRDTF9VTlNIQVJFRF9MSUJfU1VGRklYKQorXSkKKworIyBXYXJuaW5nOiBUayBkZWZpbml0aW9ucyBhcmUgdmVyeSBzaW1pbGFyIHRvIFRjbCBkZWZpbml0aW9ucyBidXQKKyMgYXJlIG5vdCBwcmVjaXNlbHkgdGhlIHNhbWUuICBUaGVyZSBhcmUgYSBjb3VwbGUgb2YgZGlmZmVyZW5jZXMsCisjIHNvIGRvbid0IGRvIGNoYW5nZXMgdG8gVGNsIHRoaW5raW5nIHlvdSBjYW4gY3V0IGFuZCBwYXN0ZSBpdCBkbyAKKyMgdGhlIFRrIGRpZmZlcmVuY2VzIGFuZCBsYXRlciBzaW1wbHkgc3Vic3RpdHV0ZSAiVGsiIGZvciAiVGNsIi4KKyMgS25vd24gZGlmZmVyZW5jZXM6CisjICAtIEFjY2VwdGFibGUgVGNsIG1ham9yIHZlcnNpb24gI3MgaXMgNy05IHdoaWxlIFRrIGlzIDQtOQorIyAgLSBTZWFyY2hpbmcgZm9yIFRjbCBpbmNsdWRlcyBsb29raW5nIGZvciB0Y2xJbnQuaCwgVGsgbG9va3MgZm9yIHRrLmgKKyMgIC0gQ29tcHV0aW5nIG1ham9yL21pbm9yIHZlcnNpb25zIGlzIGRpZmZlcmVudCBiZWNhdXNlIFRrIGRlcGVuZHMgb24KKyMgICAgaGVhZGVycyB0byBUY2wsIFRrLCBhbmQgWC4KKyMgIC0gU3ltYm9scyBpbiB0a0NvbmZpZy5zaCBhcmUgZGlmZmVyZW50IHRoYW4gdGNsQ29uZmlnLnNoCisjICAtIEFjY2VwdGFibGUgZm9yIFRrIHRvIGJlIG1pc3NpbmcgYnV0IG5vdCBUY2wuCisKK0FDX0RFRlVOKENZX0FDX1BBVEhfVEtILCBbCisjCisjIE9rLCBsZXRzIGZpbmQgdGhlIHRrIHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBoZWFkZXJzCisjIElmIHRoZSBkaXJlY3RvcnkgKHByZXN1bWFibHkgc3ltbGluaykgbmFtZWQgInRrIiBleGlzdHMsIHVzZSB0aGF0IG9uZQorIyBpbiBwcmVmZXJlbmNlIHRvIGFueSBvdGhlcnMuICBTYW1lIGxvZ2ljIGlzIHVzZWQgd2hlbiBjaG9vc2luZyBsaWJyYXJ5CisjIGFuZCBhZ2FpbiB3aXRoIFRjbC4gVGhlIHNlYXJjaCBvcmRlciBpcyB0aGUgYmVzdCBwbGFjZSB0byBsb29rIGZpcnN0LCB0aGVuIGluCisjIGRlY3JlYXNpbmcgc2lnbmlmaWNhbmNlLiBUaGUgbG9vcCBicmVha3MgaWYgdGhlIHRyaWdnZXIgZmlsZSBpcyBmb3VuZC4KKyMgTm90ZSB0aGUgZ3Jvc3MgbGl0dGxlIGNvbnZlcnNpb24gaGVyZSBvZiBzcmNkaXIgYnkgY2QnaW5nIHRvIHRoZSBmb3VuZAorIyBkaXJlY3RvcnkuIFRoaXMgY29udmVydHMgdGhlIHBhdGggZnJvbSBhIHJlbGF0aXZlIHRvIGFuIGFic29sdXRlLCBzbworIyByZWN1cnNpdmUgY2FjaGUgdmFyaWFibGVzIGZvciB0aGUgcGF0aCB3aWxsIHdvcmsgcmlnaHQuIFdlIGNoZWNrIGFsbAorIyB0aGUgcG9zc2libGUgcGF0aHMgaW4gb25lIGxvb3AgcmF0aGVyIHRoYW4gbWFueSBzZXBlcmF0ZSBsb29wcyB0byBzcGVlZAorIyB0aGluZ3MgdXAuCisjIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC10a2luY2x1ZGUKKyMKK25vX3RrPXRydWUKK0FDX01TR19DSEVDS0lORyhmb3IgVGsgcHJpdmF0ZSBoZWFkZXJzKQorQUNfQVJHX1dJVEgodGtpbmNsdWRlLCBbICAtLXdpdGgtdGtpbmNsdWRlPURJUiAgICBEaXJlY3Rvcnkgd2hlcmUgdGsgcHJpdmF0ZSBoZWFkZXJzIGFyZV0sIHdpdGhfdGtpbmNsdWRlPSR7d2l0aHZhbH0pCitBQ19DQUNIRV9WQUwoYWNfY3ZfY190a2gsWworIyBmaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRraW5jbHVkZSB3YXMgc3BlY2lmaWVkCitpZiB0ZXN0IHgiJHt3aXRoX3RraW5jbHVkZX0iICE9IHggOyB0aGVuCisgIGlmIHRlc3QgLWYgJHt3aXRoX3RraW5jbHVkZX0vdGsuaCA7IHRoZW4KKyAgICBhY19jdl9jX3RraD1gKGNkICR7d2l0aF90a2luY2x1ZGV9OyBwd2QpYAorICBlbGlmIHRlc3QgLWYgJHt3aXRoX3RraW5jbHVkZX0vZ2VuZXJpYy90ay5oIDsgdGhlbgorICAgIGFjX2N2X2NfdGtoPWAoY2QgJHt3aXRoX3RraW5jbHVkZX0vZ2VuZXJpYzsgcHdkKWAKKyAgZWxzZQorICAgIEFDX01TR19FUlJPUihbJHt3aXRoX3RraW5jbHVkZX0gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBwcml2YXRlIGhlYWRlcnNdKQorICBmaQorZmkKKworIyBuZXh0IGNoZWNrIGlmIGl0IGNhbWUgd2l0aCBUayBjb25maWd1cmF0aW9uIGZpbGUKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGtjb25maWd9IiA9IHggOyB0aGVuCisgIGlmIHRlc3QgLWYgJGFjX2N2X2NfdGtjb25maWcvLi4vZ2VuZXJpYy90ay5oIDsgdGhlbgorICAgIGFjX2N2X2NfdGtoPWAoY2QgJGFjX2N2X2NfdGtjb25maWcvLi47IHB3ZClgCisgIGZpCitmaQorCisjIG5leHQgY2hlY2sgaW4gcHJpdmF0ZSBzb3VyY2UgZGlyZWN0b3J5CisjCisjIHNpbmNlIGxzIHJldHVybnMgbG93ZXN0IHZlcnNpb24gbnVtYmVycyBmaXJzdCwgcmV2ZXJzZSBpdHMgb3V0cHV0CitpZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iID0geCA7IHRoZW4KKyAgZm9yIGkgaW4gXAorCQkke3NyY2Rpcn0vLi4vdGsgXAorCQlgbHMgLWRyICR7c3JjZGlyfS8uLi90a1tbNC05XV0qIDI+L2Rldi9udWxsYCBcCisJCSR7c3JjZGlyfS8uLi8uLi90ayBcCisJCWBscyAtZHIgJHtzcmNkaXJ9Ly4uLy4uL3RrW1s0LTldXSogMj4vZGV2L251bGxgIFwKKwkJJHtzcmNkaXJ9Ly4uLy4uLy4uL3RrIFwKKwkJYGxzIC1kciAke3NyY2Rpcn0vLi4vLi4vLi4vdGtbWzQtOV1dKiAyPi9kZXYvbnVsbCBgIDsgZG8KKyAgICBpZiB0ZXN0IC1mICRpL2dlbmVyaWMvdGsuaCA7IHRoZW4KKyAgICAgIGFjX2N2X2NfdGtoPWAoY2QgJGkvZ2VuZXJpYzsgcHdkKWAKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorZmkKKyMgZmluYWxseSBjaGVjayBpbiBhIGZldyBjb21tb24gaW5zdGFsbCBsb2NhdGlvbnMKKyMKKyMgc2luY2UgbHMgcmV0dXJucyBsb3dlc3QgdmVyc2lvbiBudW1iZXJzIGZpcnN0LCByZXZlcnNlIGl0cyBvdXRwdXQKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgPSB4IDsgdGhlbgorICBmb3IgaSBpbiBcCisJCWBscyAtZHIgL3Vzci9sb2NhbC9zcmMvdGtbWzQtOV1dKiAyPi9kZXYvbnVsbGAgXAorCQlgbHMgLWRyIC91c3IvbG9jYWwvbGliL3RrW1s0LTldXSogMj4vZGV2L251bGxgIFwKKwkJL3Vzci9sb2NhbC9zcmMvdGsgXAorCQkvdXNyL2xvY2FsL2xpYi90ayBcCisJCSR7cHJlZml4fS9pbmNsdWRlIDsgZG8KKyAgICBpZiB0ZXN0IC1mICRpL2dlbmVyaWMvdGsuaCA7IHRoZW4KKyAgICAgIGFjX2N2X2NfdGtoPWAoY2QgJGkvZ2VuZXJpYzsgcHdkKWAKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorZmkKKyMgc2VlIGlmIG9uZSBpcyBpbnN0YWxsZWQKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgPSB4IDsgdGhlbgorICAgQUNfSEVBREVSX0NIRUNLKHRrLmgsIGFjX2N2X2NfdGtoPWluc3RhbGxlZCwgYWNfY3ZfY190a2g9IiIpCitmaQorXSkKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgIT0geCA7IHRoZW4KKyAgbm9fdGs9IiIKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2h9IiA9IHgiaW5zdGFsbGVkIiA7IHRoZW4KKyAgICBBQ19NU0dfUkVTVUxUKFtpcyBpbnN0YWxsZWRdKQorICAgIFRLSERJUj0iIgorICBlbHNlCisgICAgQUNfTVNHX1JFU1VMVChbZm91bmQgaW4gJHthY19jdl9jX3RraH1dKQorICAgICMgdGhpcyBoYWNrIGlzIGNhdXNlIHRoZSBUS0hESVIgd29uJ3QgcHJpbnQgaWYgdGhlcmUgaXMgYSAiLUkiIGluIGl0LgorICAgIFRLSERJUj0iLUkke2FjX2N2X2NfdGtofSIKKyAgZmkKK2Vsc2UKKyAgVEtIRElSPSIjIG5vIFRrIGRpcmVjdG9yeSBmb3VuZCIKKyAgQUNfTVNHX1dBUk4oW0Nhbid0IGZpbmQgVGsgcHJpdmF0ZSBoZWFkZXJzXSkKKyAgbm9fdGs9dHJ1ZQorZmkKKworQUNfU1VCU1QoVEtIRElSKQorXSkKKworCitBQ19ERUZVTihDWV9BQ19QQVRIX1RLQ09ORklHLCBbCisjCisjIE9rLCBsZXRzIGZpbmQgdGhlIHRrIGNvbmZpZ3VyYXRpb24KKyMgRmlyc3QsIGxvb2sgZm9yIG9uZSB1bmluc3RhbGxlZC4gIAorIyB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZva2VkIGJ5IC0td2l0aC10a2NvbmZpZworIworCitpZiB0ZXN0IHgiJHtub190a30iID0geCA7IHRoZW4KKyAgIyB3ZSByZXNldCBub190ayBpbiBjYXNlIHNvbWV0aGluZyBmYWlscyBoZXJlCisgIG5vX3RrPXRydWUKKyAgQUNfQVJHX1dJVEgodGtjb25maWcsIFsgIC0td2l0aC10a2NvbmZpZz1ESVIgICAgIERpcmVjdG9yeSBjb250YWluaW5nIHRrIGNvbmZpZ3VyYXRpb24gKHRrQ29uZmlnLnNoKV0sCisgICAgICAgICB3aXRoX3RrY29uZmlnPSR7d2l0aHZhbH0pCisgIEFDX01TR19DSEVDS0lORyhbZm9yIFRrIGNvbmZpZ3VyYXRpb25dKQorICBBQ19DQUNIRV9WQUwoYWNfY3ZfY190a2NvbmZpZyxbCisKKyAgIyBGaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRrY29uZmlnIHdhcyBzcGVjaWZpZWQuCisgIGlmIHRlc3QgeCIke3dpdGhfdGtjb25maWd9IiAhPSB4IDsgdGhlbgorICAgIGlmIHRlc3QgLWYgIiR7d2l0aF90a2NvbmZpZ30vdGtDb25maWcuc2giIDsgdGhlbgorICAgICAgYWNfY3ZfY190a2NvbmZpZz1gKGNkICR7d2l0aF90a2NvbmZpZ307IHB3ZClgCisgICAgZWxzZQorICAgICAgQUNfTVNHX0VSUk9SKFske3dpdGhfdGtjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gdGtDb25maWcuc2hdKQorICAgIGZpCisgIGZpCisKKyAgIyB0aGVuIGNoZWNrIGZvciBhIHByaXZhdGUgVGsgbGlicmFyeQorICBpZiB0ZXN0IHgiJHthY19jdl9jX3RrY29uZmlnfSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluIFwKKwkJLi4vdGsgXAorCQlgbHMgLWRyIC4uL3RrW1s0LTldXSogMj4vZGV2L251bGxgIFwKKwkJLi4vLi4vdGsgXAorCQlgbHMgLWRyIC4uLy4uL3RrW1s0LTldXSogMj4vZGV2L251bGxgIFwKKwkJLi4vLi4vLi4vdGsgXAorCQlgbHMgLWRyIC4uLy4uLy4uL3RrW1s0LTldXSogMj4vZGV2L251bGxgIDsgZG8KKyAgICAgIGlmIHRlc3QgLWYgIiRpLyR7Y29uZmlnZGlyfS90a0NvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfdGtjb25maWc9YChjZCAkaS8ke2NvbmZpZ2Rpcn07IHB3ZClgCisJYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaQorICAjIGNoZWNrIGluIGEgZmV3IGNvbW1vbiBpbnN0YWxsIGxvY2F0aW9ucworICBpZiB0ZXN0IHgiJHthY19jdl9jX3RrY29uZmlnfSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluIGBscyAtZCAke3ByZWZpeH0vbGliIC91c3IvbG9jYWwvbGliIDI+L2Rldi9udWxsYCA7IGRvCisgICAgICBpZiB0ZXN0IC1mICIkaS90a0NvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfdGtjb25maWc9YChjZCAkaTsgcHdkKWAKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpCisgICMgY2hlY2sgaW4gYSBmZXcgb3RoZXIgcHJpdmF0ZSBsb2NhdGlvbnMKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2NvbmZpZ30iID0geCA7IHRoZW4KKyAgICBmb3IgaSBpbiBcCisJCSR7c3JjZGlyfS8uLi90ayBcCisJCWBscyAtZHIgJHtzcmNkaXJ9Ly4uL3RrW1s0LTldXSogMj4vZGV2L251bGxgIDsgZG8KKyAgICAgIGlmIHRlc3QgLWYgIiRpLyR7Y29uZmlnZGlyfS90a0NvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfdGtjb25maWc9YChjZCAkaS8ke2NvbmZpZ2Rpcn07IHB3ZClgCisJYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaQorICBdKQorICBpZiB0ZXN0IHgiJHthY19jdl9jX3RrY29uZmlnfSIgPSB4IDsgdGhlbgorICAgIFRLQ09ORklHPSIjIG5vIFRrIGNvbmZpZ3MgZm91bmQiCisgICAgQUNfTVNHX1dBUk4oQ2FuJ3QgZmluZCBUayBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zKQorICBlbHNlCisgICAgbm9fdGs9CisgICAgVEtDT05GSUc9JHthY19jdl9jX3RrY29uZmlnfS90a0NvbmZpZy5zaAorICAgIEFDX01TR19SRVNVTFQoZm91bmQgJFRLQ09ORklHKQorICBmaQorZmkKKworXSkKKworIyBEZWZpbmVkIGFzIGEgc2VwYXJhdGUgbWFjcm8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSB0aGUgdmFsdWVzCisjIGZyb20gUEFUSF9US0NPTkZJRyAoYmVjYXVzZSB0aGlzIGNhbiBhbHNvIGJlIGNhY2hlZCkuCitBQ19ERUZVTihDWV9BQ19MT0FEX1RLQ09ORklHLCBbCisgICAgaWYgdGVzdCAtZiAiJFRLQ09ORklHIiA7IHRoZW4KKyAgICAgIC4gJFRLQ09ORklHCisgICAgZmkKKworICAgIEFDX1NVQlNUKFRLX1ZFUlNJT04pCitkbmwgbm90IGFjdHVhbGx5IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKK2RubCAgICBBQ19TVUJTVChUS19NQUpPUl9WRVJTSU9OKQorZG5sICAgIEFDX1NVQlNUKFRLX01JTk9SX1ZFUlNJT04pCisgICAgQUNfU1VCU1QoVEtfREVGUykKKworZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCisgICAgZG5sIEFDX1NVQlNUKFRLX0xJQl9GSUxFKQorCitkbmwgbm90IHVzZWQgb3V0c2lkZSBvZiBjb25maWd1cmUKK2RubCAgICBBQ19TVUJTVChUS19MSUJTKQorZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCitkbmwgICAgQUNfU1VCU1QoVEtfUFJFRklYKQorCitkbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKK2RubCAgICBBQ19TVUJTVChUS19FWEVDX1BSRUZJWCkKKworICAgIEFDX1NVQlNUKFRLX0JVSUxEX0lOQ0xVREVTKQorICAgIEFDX1NVQlNUKFRLX1hJTkNMVURFUykKKyAgICBBQ19TVUJTVChUS19YTElCU1cpCisgICAgQUNfU1VCU1QoVEtfQlVJTERfTElCX1NQRUMpCisgICAgQUNfU1VCU1QoVEtfTElCX1NQRUMpCitdKQorCisjIGNoZWNrIGZvciBJdGNsIGhlYWRlcnMuIAorCitBQ19ERUZVTihDWV9BQ19QQVRIX0lUQ0xDT05GSUcsIFsKKyMKKyMgT2ssIGxldHMgZmluZCB0aGUgaXRjbCBjb25maWd1cmF0aW9uCisjIEZpcnN0LCBsb29rIGZvciBvbmUgdW5pbnN0YWxsZWQuICAKKyMgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2tlZCBieSAtLXdpdGgtaXRjbGNvbmZpZworIworCitpZiB0ZXN0IHgiJHtub19pdGNsfSIgPSB4IDsgdGhlbgorICAjIHdlIHJlc2V0IG5vX2l0Y2wgaW4gY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQorICBub19pdGNsPXRydWUKKyAgQUNfQVJHX1dJVEgoaXRjbGNvbmZpZywgWyAgLS13aXRoLWl0Y2xjb25maWcgICAgICAgICAgIGRpcmVjdG9yeSBjb250YWluaW5nIGl0Y2wgY29uZmlndXJhdGlvbiAoaXRjbENvbmZpZy5zaCldLAorICAgICAgICAgd2l0aF9pdGNsY29uZmlnPSR7d2l0aHZhbH0pCisgIEFDX01TR19DSEVDS0lORyhbZm9yIEl0Y2wgY29uZmlndXJhdGlvbl0pCisgIEFDX0NBQ0hFX1ZBTChhY19jdl9jX2l0Y2xjb25maWcsWworCisgICMgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1pdGNsY29uZmlnIHdhcyBzcGVjaWZpZWQuCisgIGlmIHRlc3QgeCIke3dpdGhfaXRjbGNvbmZpZ30iICE9IHggOyB0aGVuCisgICAgaWYgdGVzdCAtZiAiJHt3aXRoX2l0Y2xjb25maWd9L2l0Y2xDb25maWcuc2giIDsgdGhlbgorICAgICAgYWNfY3ZfY19pdGNsY29uZmlnPWAoY2QgJHt3aXRoX2l0Y2xjb25maWd9OyBwd2QpYAorICAgIGVsc2UKKyAgICAgIEFDX01TR19FUlJPUihbJHt3aXRoX2l0Y2xjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaXRjbENvbmZpZy5zaF0pCisgICAgZmkKKyAgZmkKKworICAjIHRoZW4gY2hlY2sgZm9yIGEgcHJpdmF0ZSBJdGNsIGxpYnJhcnkKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsY29uZmlnfSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluIFwKKwkJLi4vaXRjbC9pdGNsIFwKKwkJYGxzIC1kciAuLi9pdGNsW1s0LTldXSovaXRjbCAyPi9kZXYvbnVsbGAgXAorCQkuLi8uLi9pdGNsIFwKKwkJYGxzIC1kciAuLi8uLi9pdGNsW1s0LTldXSovaXRjbCAyPi9kZXYvbnVsbGAgXAorCQkuLi8uLi8uLi9pdGNsIFwKKwkJYGxzIC1kciAuLi8uLi8uLi9pdGNsW1s0LTldXSovaXRjbCAyPi9kZXYvbnVsbGAgOyBkbworICAgICAgaWYgdGVzdCAtZiAiJGkvaXRjbENvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfaXRjbGNvbmZpZz1gKGNkICRpOyBwd2QpYAorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgIyBjaGVjayBpbiBhIGZldyBjb21tb24gaW5zdGFsbCBsb2NhdGlvbnMKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsY29uZmlnfSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluIGBscyAtZCAke3ByZWZpeH0vbGliIC91c3IvbG9jYWwvbGliIDI+L2Rldi9udWxsYCA7IGRvCisgICAgICBpZiB0ZXN0IC1mICIkaS9pdGNsQ29uZmlnLnNoIiA7IHRoZW4KKyAgICAgICAgYWNfY3ZfY19pdGNsY29uZmlnPWAoY2QgJGk7IHB3ZClgCisJYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaQorICAjIGNoZWNrIGluIGEgZmV3IG90aGVyIHByaXZhdGUgbG9jYXRpb25zCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGNvbmZpZ30iID0geCA7IHRoZW4KKyAgICBmb3IgaSBpbiBcCisJCSR7c3JjZGlyfS8uLi9pdGNsL2l0Y2wgXAorCQlgbHMgLWRyICR7c3JjZGlyfS8uLi9pdGNsW1s0LTldXSovaXRjbCAyPi9kZXYvbnVsbGAgOyBkbworICAgICAgaWYgdGVzdCAtZiAiJGkvaXRjbENvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfaXRjbGNvbmZpZz1gKGNkICRpOyBwd2QpYAorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgXSkKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsY29uZmlnfSIgPSB4IDsgdGhlbgorICAgIElUQ0xDT05GSUc9IiMgbm8gSXRjbCBjb25maWdzIGZvdW5kIgorICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgSXRjbCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zKQorICBlbHNlCisgICAgbm9faXRjbD0KKyAgICBJVENMQ09ORklHPSR7YWNfY3ZfY19pdGNsY29uZmlnfS9pdGNsQ29uZmlnLnNoCisgICAgQUNfTVNHX1JFU1VMVChmb3VuZCAkSVRDTENPTkZJRykKKyAgZmkKK2ZpCitdKQorCisjIERlZmluZWQgYXMgYSBzZXBhcmF0ZSBtYWNybyBzbyB3ZSBkb24ndCBoYXZlIHRvIGNhY2hlIHRoZSB2YWx1ZXMKKyMgZnJvbSBQQVRIX0lUQ0xDT05GSUcgKGJlY2F1c2UgdGhpcyBjYW4gYWxzbyBiZSBjYWNoZWQpLgorQUNfREVGVU4oQ1lfQUNfTE9BRF9JVENMQ09ORklHLCBbCisgICAgaWYgdGVzdCAtZiAiJElUQ0xDT05GSUciIDsgdGhlbgorICAgICAgLiAkSVRDTENPTkZJRworICAgIGZpCisKKyAgICBBQ19TVUJTVChJVENMX1ZFUlNJT04pCitkbmwgbm90IGFjdHVhbGx5IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKK2RubCAgICBBQ19TVUJTVChJVENMX01BSk9SX1ZFUlNJT04pCitkbmwgICAgQUNfU1VCU1QoSVRDTF9NSU5PUl9WRVJTSU9OKQorICAgIEFDX1NVQlNUKElUQ0xfREVGUykKKworZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCisgICAgZG5sIEFDX1NVQlNUKElUQ0xfTElCX0ZJTEUpCisKK2RubCBub3QgdXNlZCBvdXRzaWRlIG9mIGNvbmZpZ3VyZQorZG5sICAgIEFDX1NVQlNUKElUQ0xfTElCUykKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworZG5sICAgIEFDX1NVQlNUKElUQ0xfUFJFRklYKQorCitkbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKK2RubCAgICBBQ19TVUJTVChJVENMX0VYRUNfUFJFRklYKQorCisgICAgQUNfU1VCU1QoSVRDTF9CVUlMRF9JTkNMVURFUykKKyAgICBBQ19TVUJTVChJVENMX0JVSUxEX0xJQl9TUEVDKQorICAgIEFDX1NVQlNUKElUQ0xfTElCX1NQRUMpCitdKQorCisjIGNoZWNrIGZvciBJdGNsIGhlYWRlcnMuIAorCitBQ19ERUZVTihDWV9BQ19QQVRIX0lUQ0xILCBbCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIEl0Y2wgcHJpdmF0ZSBoZWFkZXJzLiBzcmNkaXI9JHtzcmNkaXJ9KQoraWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsaH0iID0geCA7IHRoZW4KKyAgZm9yIGkgaW4gJHtzcmNkaXJ9Ly4uL2l0Y2wgJHtzcmNkaXJ9Ly4uLy4uL2l0Y2wgJHtzcmNkaXJ9Ly4uLy4uLy4uL2l0Y2wgJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRjbDsgZG8KKyAgICBpZiB0ZXN0IC1mICRpL2dlbmVyaWMvaXRjbC5oIDsgdGhlbgorICAgICAgYWNfY3ZfY19pdGNsaD1gKGNkICRpL2dlbmVyaWM7IHB3ZClgCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKK2ZpCitpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xofSIgPSB4IDsgdGhlbgorICBJVENMSERJUj0iIyBubyBJdGNsIHByaXZhdGUgaGVhZGVycyBmb3VuZCIKKyAgQUNfTVNHX0VSUk9SKFtDYW4ndCBmaW5kIEl0Y2wgcHJpdmF0ZSBoZWFkZXJzXSkKK2ZpCitpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xofSIgIT0geCA7IHRoZW4KKyAgICAgSVRDTEhESVI9Ii1JJHthY19jdl9jX2l0Y2xofSIKK2ZpCisjIHNob3VsZCBhbHdheXMgYmUgaGVyZQorIyAgICAgSVRDTExJQj0iLi4vaXRjbC9pdGNsL3VuaXgvbGliaXRjbC5hIgorQUNfU1VCU1QoSVRDTEhESVIpCisjQUNfU1VCU1QoSVRDTExJQikKK10pCisKKworQUNfREVGVU4oQ1lfQUNfUEFUSF9JVEtDT05GSUcsIFsKKyMKKyMgT2ssIGxldHMgZmluZCB0aGUgaXRrIGNvbmZpZ3VyYXRpb24KKyMgRmlyc3QsIGxvb2sgZm9yIG9uZSB1bmluc3RhbGxlZC4gIAorIyB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZva2VkIGJ5IC0td2l0aC1pdGtjb25maWcKKyMKKworaWYgdGVzdCB4IiR7bm9faXRrfSIgPSB4IDsgdGhlbgorICAjIHdlIHJlc2V0IG5vX2l0ayBpbiBjYXNlIHNvbWV0aGluZyBmYWlscyBoZXJlCisgIG5vX2l0az10cnVlCisgIEFDX0FSR19XSVRIKGl0a2NvbmZpZywgWyAgLS13aXRoLWl0a2NvbmZpZyAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgaXRrIGNvbmZpZ3VyYXRpb24gKGl0a0NvbmZpZy5zaCldLAorICAgICAgICAgd2l0aF9pdGtjb25maWc9JHt3aXRodmFsfSkKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgSXRrIGNvbmZpZ3VyYXRpb25dKQorICBBQ19DQUNIRV9WQUwoYWNfY3ZfY19pdGtjb25maWcsWworCisgICMgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1pdGtjb25maWcgd2FzIHNwZWNpZmllZC4KKyAgaWYgdGVzdCB4IiR7d2l0aF9pdGtjb25maWd9IiAhPSB4IDsgdGhlbgorICAgIGlmIHRlc3QgLWYgIiR7d2l0aF9pdGtjb25maWd9L2l0a0NvbmZpZy5zaCIgOyB0aGVuCisgICAgICBhY19jdl9jX2l0a2NvbmZpZz1gKGNkICR7d2l0aF9pdGtjb25maWd9OyBwd2QpYAorICAgIGVsc2UKKyAgICAgIEFDX01TR19FUlJPUihbJHt3aXRoX2l0a2NvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBpdGtDb25maWcuc2hdKQorICAgIGZpCisgIGZpCisKKyAgIyB0aGVuIGNoZWNrIGZvciBhIHByaXZhdGUgSXRrIGxpYnJhcnkKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGtjb25maWd9IiA9IHggOyB0aGVuCisgICAgZm9yIGkgaW4gXAorCQkuLi9pdGNsL2l0ayBcCisJCWBscyAtZHIgLi4vaXRjbFtbNC05XV0qL2l0ayAyPi9kZXYvbnVsbGAgXAorCQkuLi8uLi9pdGsgXAorCQlgbHMgLWRyIC4uLy4uL2l0Y2xbWzQtOV1dKi9pdGsgMj4vZGV2L251bGxgIFwKKwkJLi4vLi4vLi4vaXRrIFwKKwkJYGxzIC1kciAuLi8uLi8uLi9pdGNsW1s0LTldXSovaXRrIDI+L2Rldi9udWxsYCA7IGRvCisgICAgICBpZiB0ZXN0IC1mICIkaS9pdGtDb25maWcuc2giIDsgdGhlbgorICAgICAgICBhY19jdl9jX2l0a2NvbmZpZz1gKGNkICRpOyBwd2QpYAorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgIyBjaGVjayBpbiBhIGZldyBjb21tb24gaW5zdGFsbCBsb2NhdGlvbnMKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGtjb25maWd9IiA9IHggOyB0aGVuCisgICAgZm9yIGkgaW4gYGxzIC1kICR7cHJlZml4fS9saWIgL3Vzci9sb2NhbC9saWIgMj4vZGV2L251bGxgIDsgZG8KKyAgICAgIGlmIHRlc3QgLWYgIiRpL2l0a0NvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfaXRrY29uZmlnPWAoY2QgJGk7IHB3ZClgCisJYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaQorICAjIGNoZWNrIGluIGEgZmV3IG90aGVyIHByaXZhdGUgbG9jYXRpb25zCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRrY29uZmlnfSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluIFwKKwkJJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRrIFwKKwkJYGxzIC1kciAke3NyY2Rpcn0vLi4vaXRjbFtbNC05XV0qL2l0ayAyPi9kZXYvbnVsbGAgOyBkbworICAgICAgaWYgdGVzdCAtZiAiJGkvaXRrQ29uZmlnLnNoIiA7IHRoZW4KKyAgICAgICAgYWNfY3ZfY19pdGtjb25maWc9YChjZCAkaTsgcHdkKWAKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpCisgIF0pCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRrY29uZmlnfSIgPSB4IDsgdGhlbgorICAgIElUS0NPTkZJRz0iIyBubyBJdGsgY29uZmlncyBmb3VuZCIKKyAgICBBQ19NU0dfV0FSTihDYW4ndCBmaW5kIEl0ayBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zKQorICBlbHNlCisgICAgbm9faXRrPQorICAgIElUS0NPTkZJRz0ke2FjX2N2X2NfaXRrY29uZmlnfS9pdGtDb25maWcuc2gKKyAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICRJVEtDT05GSUcpCisgIGZpCitmaQorCitdKQorCisjIERlZmluZWQgYXMgYSBzZXBhcmF0ZSBtYWNybyBzbyB3ZSBkb24ndCBoYXZlIHRvIGNhY2hlIHRoZSB2YWx1ZXMKKyMgZnJvbSBQQVRIX0lUS0NPTkZJRyAoYmVjYXVzZSB0aGlzIGNhbiBhbHNvIGJlIGNhY2hlZCkuCitBQ19ERUZVTihDWV9BQ19MT0FEX0lUS0NPTkZJRywgWworICAgIGlmIHRlc3QgLWYgIiRJVEtDT05GSUciIDsgdGhlbgorICAgICAgLiAkSVRLQ09ORklHCisgICAgZmkKKworICAgIEFDX1NVQlNUKElUS19WRVJTSU9OKQorZG5sIG5vdCBhY3R1YWxseSB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCitkbmwgICAgQUNfU1VCU1QoSVRLX01BSk9SX1ZFUlNJT04pCitkbmwgICAgQUNfU1VCU1QoSVRLX01JTk9SX1ZFUlNJT04pCisgICAgQUNfU1VCU1QoSVRLX0RFRlMpCisKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworICAgIGRubCBBQ19TVUJTVChJVEtfTElCX0ZJTEUpCisKK2RubCBub3QgdXNlZCBvdXRzaWRlIG9mIGNvbmZpZ3VyZQorZG5sICAgIEFDX1NVQlNUKElUS19MSUJTKQorZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCitkbmwgICAgQUNfU1VCU1QoSVRLX1BSRUZJWCkKKworZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCitkbmwgICAgQUNfU1VCU1QoSVRLX0VYRUNfUFJFRklYKQorCisgICAgQUNfU1VCU1QoSVRLX0JVSUxEX0lOQ0xVREVTKQorICAgIEFDX1NVQlNUKElUS19CVUlMRF9MSUJfU1BFQykKKyAgICBBQ19TVUJTVChJVEtfTElCX1NQRUMpCitdKQorCitBQ19ERUZVTihDWV9BQ19QQVRIX0lUS0gsIFsKK0FDX01TR19DSEVDS0lORyhmb3IgSXRrIHByaXZhdGUgaGVhZGVycy4gc3JjZGlyPSR7c3JjZGlyfSkKK2lmIHRlc3QgeCIke2FjX2N2X2NfaXRraH0iID0geCA7IHRoZW4KKyAgZm9yIGkgaW4gJHtzcmNkaXJ9Ly4uL2l0Y2wgJHtzcmNkaXJ9Ly4uLy4uL2l0Y2wgJHtzcmNkaXJ9Ly4uLy4uLy4uL2l0Y2wgJHtzcmNkaXJ9Ly4uL2l0Y2wvaXRrOyBkbworICAgIGlmIHRlc3QgLWYgJGkvZ2VuZXJpYy9pdGsuaCA7IHRoZW4KKyAgICAgIGFjX2N2X2NfaXRraD1gKGNkICRpL2dlbmVyaWM7IHB3ZClgCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKK2ZpCitpZiB0ZXN0IHgiJHthY19jdl9jX2l0a2h9IiA9IHggOyB0aGVuCisgIElUS0hESVI9IiMgbm8gSXRrIHByaXZhdGUgaGVhZGVycyBmb3VuZCIKKyAgQUNfTVNHX0VSUk9SKFtDYW4ndCBmaW5kIEl0ayBwcml2YXRlIGhlYWRlcnNdKQorZmkKK2lmIHRlc3QgeCIke2FjX2N2X2NfaXRraH0iICE9IHggOyB0aGVuCisgICAgIElUS0hESVI9Ii1JJHthY19jdl9jX2l0a2h9IgorZmkKKyMgc2hvdWxkIGFsd2F5cyBiZSBoZXJlCisjICAgICBJVEtMSUI9Ii4uL2l0Y2wvaXRrL3VuaXgvbGliaXRrLmEiCitBQ19TVUJTVChJVEtIRElSKQorI0FDX1NVQlNUKElUS0xJQikKK10pCisKKyMgY2hlY2sgZm9yIFRpeCBoZWFkZXJzLiAKKworQUNfREVGVU4oQ1lfQUNfUEFUSF9USVhILCBbCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIFRpeCBwcml2YXRlIGhlYWRlcnMuIHNyY2Rpcj0ke3NyY2Rpcn0pCitpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGh9IiA9IHggOyB0aGVuCisgIGZvciBpIGluICR7c3JjZGlyfS8uLi90aXggJHtzcmNkaXJ9Ly4uLy4uL3RpeCAke3NyY2Rpcn0vLi4vLi4vLi4vdGl4IDsgZG8KKyAgICBpZiB0ZXN0IC1mICRpL2dlbmVyaWMvdGl4LmggOyB0aGVuCisgICAgICBhY19jdl9jX3RpeGg9YChjZCAkaS9nZW5lcmljOyBwd2QpYAorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCitmaQoraWYgdGVzdCB4IiR7YWNfY3ZfY190aXhofSIgPSB4IDsgdGhlbgorICBUSVhIRElSPSIjIG5vIFRpeCBwcml2YXRlIGhlYWRlcnMgZm91bmQiCisgIEFDX01TR19FUlJPUihbQ2FuJ3QgZmluZCBUaXggcHJpdmF0ZSBoZWFkZXJzXSkKK2ZpCitpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGh9IiAhPSB4IDsgdGhlbgorICAgICBUSVhIRElSPSItSSR7YWNfY3ZfY190aXhofSIKK2ZpCitBQ19TVUJTVChUSVhIRElSKQorXSkKKworQUNfREVGVU4oQ1lfQUNfUEFUSF9USVhDT05GSUcsIFsKKyMKKyMgT2ssIGxldHMgZmluZCB0aGUgdGl4IGNvbmZpZ3VyYXRpb24KKyMgRmlyc3QsIGxvb2sgZm9yIG9uZSB1bmluc3RhbGxlZC4gIAorIyB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZva2VkIGJ5IC0td2l0aC1pdGtjb25maWcKKyMKKworaWYgdGVzdCB4IiR7bm9fdGl4fSIgPSB4IDsgdGhlbgorICAjIHdlIHJlc2V0IG5vX3RpeCBpbiBjYXNlIHNvbWV0aGluZyBmYWlscyBoZXJlCisgIG5vX3RpeD10cnVlCisgIEFDX0FSR19XSVRIKHRpeGNvbmZpZywgWyAgLS13aXRoLXRpeGNvbmZpZyAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGl4IGNvbmZpZ3VyYXRpb24gKHRpeENvbmZpZy5zaCldLAorICAgICAgICAgd2l0aF90aXhjb25maWc9JHt3aXRodmFsfSkKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgVGl4IGNvbmZpZ3VyYXRpb25dKQorICBBQ19DQUNIRV9WQUwoYWNfY3ZfY190aXhjb25maWcsWworCisgICMgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC10aXhjb25maWcgd2FzIHNwZWNpZmllZC4KKyAgaWYgdGVzdCB4IiR7d2l0aF90aXhjb25maWd9IiAhPSB4IDsgdGhlbgorICAgIGlmIHRlc3QgLWYgIiR7d2l0aF90aXhjb25maWd9L3RpeENvbmZpZy5zaCIgOyB0aGVuCisgICAgICBhY19jdl9jX3RpeGNvbmZpZz1gKGNkICR7d2l0aF90aXhjb25maWd9OyBwd2QpYAorICAgIGVsc2UKKyAgICAgIEFDX01TR19FUlJPUihbJHt3aXRoX3RpeGNvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiB0aXhDb25maWcuc2hdKQorICAgIGZpCisgIGZpCisKKyAgIyB0aGVuIGNoZWNrIGZvciBhIHByaXZhdGUgVGl4IGxpYnJhcnkKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhjb25maWd9IiA9IHggOyB0aGVuCisgICAgZm9yIGkgaW4gXAorCQkuLi90aXggXAorCQlgbHMgLWRyIC4uL3RpeCAyPi9kZXYvbnVsbGAgXAorCQkuLi8uLi90aXggXAorCQlgbHMgLWRyIC4uLy4uL3RpeCAyPi9kZXYvbnVsbGAgXAorCQkuLi8uLi8uLi90aXggXAorCQlgbHMgLWRyIC4uLy4uLy4uL3RpeCAyPi9kZXYvbnVsbGAgOyBkbworICAgICAgZWNobyAiKioqKiBMb29raW5nIGF0ICRpIC0gd2l0aCAke2NvbmZpZ2Rpcn0iCisgICAgICBpZiB0ZXN0IC1mICIkaS90aXhDb25maWcuc2giIDsgdGhlbgorICAgICAgICBhY19jdl9jX3RpeGNvbmZpZz1gKGNkICRpOyBwd2QpYAorCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgIyBjaGVjayBpbiBhIGZldyBjb21tb24gaW5zdGFsbCBsb2NhdGlvbnMKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhjb25maWd9IiA9IHggOyB0aGVuCisgICAgZm9yIGkgaW4gYGxzIC1kICR7cHJlZml4fS9saWIgL3Vzci9sb2NhbC9saWIgMj4vZGV2L251bGxgIDsgZG8KKyAgICAgIGVjaG8gIioqKiogTG9va2luZyBhdCAkaSIKKyAgICAgIGlmIHRlc3QgLWYgIiRpL3RpeENvbmZpZy5zaCIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfdGl4Y29uZmlnPWAoY2QgJGk7IHB3ZClgCisJYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaQorICAjIGNoZWNrIGluIGEgZmV3IG90aGVyIHByaXZhdGUgbG9jYXRpb25zCisgIGVjaG8gIioqKiogT3RoZXIgcHJpdmF0ZSBsb2NhdGlvbnMiCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGl4Y29uZmlnfSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluIFwKKwkJJHtzcmNkaXJ9Ly4uL3RpeCBcCisJCWBscyAtZHIgJHtzcmNkaXJ9Ly4uL3RpeCAyPi9kZXYvbnVsbGAgOyBkbworICAgICAgZWNobyAiKioqKiBMb29raW5nIGF0ICRpIC0gd2l0aCAke2NvbmZpZ2Rpcn0iCisgICAgICBpZiB0ZXN0IC1mICIkaS8ke2NvbmZpZ2Rpcn0vdGl4Q29uZmlnLnNoIiA7IHRoZW4KKyAgICAgICAgYWNfY3ZfY190aXhjb25maWc9YChjZCAkaS8ke2NvbmZpZ2Rpcn07IHB3ZClgCisJYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaQorICBdKQorICBpZiB0ZXN0IHgiJHthY19jdl9jX3RpeGNvbmZpZ30iID0geCA7IHRoZW4KKyAgICBUSVhDT05GSUc9IiMgbm8gVGl4IGNvbmZpZ3MgZm91bmQiCisgICAgQUNfTVNHX1dBUk4oQ2FuJ3QgZmluZCBUaXggY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucykKKyAgZWxzZQorICAgIG5vX3RpeD0KKyAgICBUSVhDT05GSUc9JHthY19jdl9jX3RpeGNvbmZpZ30vdGl4Q29uZmlnLnNoCisgICAgQUNfTVNHX1JFU1VMVChmb3VuZCAkVElYQ09ORklHKQorICBmaQorZmkKKworXSkKKworIyBEZWZpbmVkIGFzIGEgc2VwYXJhdGUgbWFjcm8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSB0aGUgdmFsdWVzCisjIGZyb20gUEFUSF9USVhDT05GSUcgKGJlY2F1c2UgdGhpcyBjYW4gYWxzbyBiZSBjYWNoZWQpLgorQUNfREVGVU4oQ1lfQUNfTE9BRF9USVhDT05GSUcsIFsKKyAgICBpZiB0ZXN0IC1mICIkVElYQ09ORklHIiA7IHRoZW4KKyAgICAgIC4gJFRJWENPTkZJRworICAgIGZpCisKKyAgICBBQ19TVUJTVChUSVhfVkVSU0lPTikKK2RubCBub3QgYWN0dWFsbHkgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworZG5sICAgIEFDX1NVQlNUKFRJWF9NQUpPUl9WRVJTSU9OKQorZG5sICAgIEFDX1NVQlNUKFRJWF9NSU5PUl9WRVJTSU9OKQorZG5sICAgIEFDX1NVQlNUKFRJWF9ERUZTKQorCitkbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKK2RubCAgICBkbmwgQUNfU1VCU1QoVElYX0xJQl9GSUxFKQorCitkbmwgbm90IHVzZWQgb3V0c2lkZSBvZiBjb25maWd1cmUKK2RubCAgICBBQ19TVUJTVChUSVhfTElCUykKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworZG5sICAgIEFDX1NVQlNUKFRJWF9QUkVGSVgpCisKK2RubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scworZG5sICAgIEFDX1NVQlNUKFRJWF9FWEVDX1BSRUZJWCkKKworZG5sICAgIEFDX1NVQlNUKFRJWF9CVUlMRF9JTkNMVURFUykKKyAgICBBQ19TVUJTVChUSVhfQlVJTERfTElCX1NQRUMpCitkbmwgICAgQUNfU1VCU1QoVElYX0xJQl9TUEVDKQorXSkKKworCisjIHNlcmlhbCAxCisKKyMgQGRlZm1hYyBBQ19QUk9HX0NDX1NUREMKKyMgQG1haW5kZXggUFJPR19DQ19TVERDCisjIEBvdmluZGV4IENDCisjIElmIHRoZSBDIGNvbXBpbGVyIGluIG5vdCBpbiBBTlNJIEMgbW9kZSBieSBkZWZhdWx0LCB0cnkgdG8gYWRkIGFuIG9wdGlvbgorIyB0byBvdXRwdXQgdmFyaWFibGUgQGNvZGV7Q0N9IHRvIG1ha2UgaXQgc28uICBUaGlzIG1hY3JvIHRyaWVzIHZhcmlvdXMKKyMgb3B0aW9ucyB0aGF0IHNlbGVjdCBBTlNJIEMgb24gc29tZSBzeXN0ZW0gb3IgYW5vdGhlci4gIEl0IGNvbnNpZGVycyB0aGUKKyMgY29tcGlsZXIgdG8gYmUgaW4gQU5TSSBDIG1vZGUgaWYgaXQgaGFuZGxlcyBmdW5jdGlvbiBwcm90b3R5cGVzIGNvcnJlY3RseS4KKyMKKyMgSWYgeW91IHVzZSB0aGlzIG1hY3JvLCB5b3Ugc2hvdWxkIGNoZWNrIGFmdGVyIGNhbGxpbmcgaXQgd2hldGhlciB0aGUgQworIyBjb21waWxlciBoYXMgYmVlbiBzZXQgdG8gYWNjZXB0IEFOU0kgQzsgaWYgbm90LCB0aGUgc2hlbGwgdmFyaWFibGUKKyMgQGNvZGV7YW1fY3ZfcHJvZ19jY19zdGRjfSBpcyBzZXQgdG8gQHNhbXB7bm99LiAgSWYgeW91IHdyb3RlIHlvdXIgc291cmNlCisjIGNvZGUgaW4gQU5TSSBDLCB5b3UgY2FuIG1ha2UgYW4gdW4tQU5TSWZpZWQgY29weSBvZiBpdCBieSB1c2luZyB0aGUKKyMgcHJvZ3JhbSBAY29kZXthbnNpMmtucn0sIHdoaWNoIGNvbWVzIHdpdGggR2hvc3RzY3JpcHQuCisjIEBlbmQgZGVmbWFjCisKK0FDX0RFRlVOKEFNX1BST0dfQ0NfU1REQywKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSkKK0FDX0JFRk9SRShbJDBdLCBbQUNfQ19JTkxJTkVdKQorQUNfQkVGT1JFKFskMF0sIFtBQ19DX0NPTlNUXSkKK2RubCBGb3JjZSB0aGlzIGJlZm9yZSBBQ19QUk9HX0NQUC4gIFNvbWUgY3BwJ3MsIGVnIG9uIEhQVVgsIHJlcXVpcmUKK2RubCBhIG1hZ2ljIG9wdGlvbiB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIEFOU0kgcHJlcHJvY2Vzc29yIGNvbW1hbmRzCitkbmwgbGlrZSAjZWxpZi4KK2RubCBGSVhNRTogY2FuJ3QgZG8gdGhpcyBiZWNhdXNlIHRoZW4gQUNfQUlYIHdvbid0IHdvcmsgZHVlIHRvIGEKK2RubCBjaXJjdWxhciBkZXBlbmRlbmN5LgorZG5sIEFDX0JFRk9SRShbJDBdLCBbQUNfUFJPR19DUFBdKQorQUNfTVNHX0NIRUNLSU5HKGZvciAke0NDLWNjfSBvcHRpb24gdG8gYWNjZXB0IEFOU0kgQykKK0FDX0NBQ0hFX1ZBTChhbV9jdl9wcm9nX2NjX3N0ZGMsCitbYW1fY3ZfcHJvZ19jY19zdGRjPW5vCithY19zYXZlX0NDPSIkQ0MiCisjIERvbid0IHRyeSBnY2MgLWFuc2k7IHRoYXQgdHVybnMgb2ZmIHVzZWZ1bCBleHRlbnNpb25zIGFuZAorIyBicmVha3Mgc29tZSBzeXN0ZW1zJyBoZWFkZXIgZmlsZXMuCisjIEFJWAkJCS1xbGFuZ2x2bD1hbnNpCisjIFVsdHJpeCBhbmQgT1NGLzEJLXN0ZDEKKyMgSFAtVVgJCQktQWEgLURfSFBVWF9TT1VSQ0UKKyMgU1ZSNAkJCS1YYyAtRF9fRVhURU5TSU9OU19fCitmb3IgYWNfYXJnIGluICIiIC1xbGFuZ2x2bD1hbnNpIC1zdGQxICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKK2RvCisgIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgorICBBQ19UUllfQ09NUElMRSgKK1sjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLworc3RydWN0IGJ1ZiB7IGludCB4OyB9OworRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKK3N0YXRpYyBjaGFyICplIChwLCBpKQorICAgICBjaGFyICoqcDsKKyAgICAgaW50IGk7Cit7CisgIHJldHVybiBwW2ldOworfQorc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQoreworICBjaGFyICpzOworICB2YV9saXN0IHY7CisgIHZhX3N0YXJ0ICh2LHApOworICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOworICB2YV9lbmQgKHYpOworICByZXR1cm4gczsKK30KK2ludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOworc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307CitzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKK2ludCBwYWlybmFtZXMgKGludCwgY2hhciAqKiwgRklMRSAqKCopKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KSwgaW50LCBpbnQpOworaW50IGFyZ2M7CitjaGFyICoqYXJndjsKK10sIFsKK3JldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKK10sCitbYW1fY3ZfcHJvZ19jY19zdGRjPSIkYWNfYXJnIjsgYnJlYWtdKQorZG9uZQorQ0M9IiRhY19zYXZlX0NDIgorXSkKK2lmIHRlc3QgLXogIiRhbV9jdl9wcm9nX2NjX3N0ZGMiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoW25vbmUgbmVlZGVkXSkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVCgkYW1fY3ZfcHJvZ19jY19zdGRjKQorZmkKK2Nhc2UgIngkYW1fY3ZfcHJvZ19jY19zdGRjIiBpbgorICB4fHhubykgOzsKKyAgKikgQ0M9IiRDQyAkYW1fY3ZfcHJvZ19jY19zdGRjIiA7OworZXNhYworXSkKKworIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCisjIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCisKKyMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDMKKworQUNfREVGVU4oQ1lfV0lUSF9OTFMsCisgIFtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCisgICAgZG5sIERlZmF1bHQgaXMgZW5hYmxlZCBOTFMKKyAgICBBQ19BUkdfRU5BQkxFKG5scywKKyAgICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAorICAgICAgVVNFX05MUz0kZW5hYmxldmFsLCBVU0VfTkxTPXllcykKKyAgICBBQ19NU0dfUkVTVUxUKCRVU0VfTkxTKQorICAgIEFDX1NVQlNUKFVTRV9OTFMpCisKKyAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubworCisgICAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAorICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBBQ19ERUZJTkUoRU5BQkxFX05MUywgMSwgW0RlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWRdKQorICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKKyAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCisgICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKKyAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKKyAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKKyAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKKyAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQorICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KKwlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KKwlubHNfY3ZfaGVhZGVyX2ludGw9CisJbmxzX2N2X2hlYWRlcl9saWJndD0KKwlDQVRPQkpFWFQ9Tk9ORQorCisJQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKKwkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAorCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAorCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCisJICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCisJICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCisJCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKKwkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAorCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAorCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQorCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQsIDEsCisJCQlbRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuXSkKKwkgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAorCQlbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG5vKWRubAorCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KKwkJQUNfQ0hFQ0tfRlVOQ1MoZGNnZXR0ZXh0KQorCQlBQ19QQVRIX1BST0coR01TR0ZNVCwgZ21zZ2ZtdCwgJE1TR0ZNVCkKKwkJQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChYR0VUVEVYVCwgeGdldHRleHQsCisJCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQorCQlBQ19UUllfTElOSygsIFtleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CisJCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHJdLAorCQkgIFtDQVRPQkpFWFQ9LmdtbworCQkgICBEQVRBRElSTkFNRT1zaGFyZV0sCisJCSAgW0NBVE9CSkVYVD0ubW8KKwkJICAgREFUQURJUk5BTUU9bGliXSkKKwkJSU5TVE9CSkVYVD0ubW8KKwkgICAgICBmaQorCSAgICBmaQorCV0pCisKKwlkbmwgSW4gdGhlIHN0YW5kYXJkIGdldHRleHQsIHdlIHdvdWxkIG5vdyBjaGVjayBmb3IgY2F0Z2V0cy4KKyAgICAgICAgZG5sIEhvd2V2ZXIsIHdlIG5ldmVyIHdhbnQgdG8gdXNlIGNhdGdldHMgZm9yIG91ciByZWxlYXNlcy4KKworICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgorCSAgZG5sIE5laXRoZXIgZ2V0dGV4dCBub3IgY2F0Z2V0cyBpbiBpbmNsdWRlZCBpbiB0aGUgQyBsaWJyYXJ5LgorCSAgZG5sIEZhbGwgYmFjayBvbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgorCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCisgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCisgICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoTVNHRk1ULCBtc2dmbXQsCisJICBbdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIl0sIG1zZ2ZtdCkKKyAgICAgICAgQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCisgICAgICAgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAorCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCJdLCA6KQorICAgICAgICBBQ19TVUJTVChNU0dGTVQpCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgZG5sIFRlc3Qgd2hldGhlciB3ZSByZWFsbHkgZm91bmQgR05VIHhnZXR0ZXh0LgorICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwlkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCisJZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KKwlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCisJICA6IDsKKwllbHNlCisJICBBQ19NU0dfUkVTVUxUKAorCSAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0XSkKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgZG5sIFRoZXNlIHJ1bGVzIGFyZSBzb2xlbHkgZm9yIHRoZSBkaXN0cmlidXRpb24gZ29hbC4gIFdoaWxlIGRvaW5nIHRoaXMKKyAgICBkbmwgd2Ugb25seSBoYXZlIHRvIGtlZXAgZXhhY3RseSBvbmUgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGNhdGFsb2dzCisgICAgZG5sIGluIGNvbmZpZ3VyZS5pbi4KKyAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKKyAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgorICAgIGRvbmUKKworICAgIGRubCBNYWtlIGFsbCB2YXJpYWJsZXMgd2UgdXNlIGtub3duIHRvIGF1dG9jb25mLgorICAgIEFDX1NVQlNUKFVTRV9JTkNMVURFRF9MSUJJTlRMKQorICAgIEFDX1NVQlNUKENBVEFMT0dTKQorICAgIEFDX1NVQlNUKENBVE9CSkVYVCkKKyAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKKyAgICBBQ19TVUJTVChHTU9GSUxFUykKKyAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQorICAgIEFDX1NVQlNUKElOVExERVBTKQorICAgIEFDX1NVQlNUKElOVExMSUJTKQorICAgIEFDX1NVQlNUKElOVExPQkpTKQorICAgIEFDX1NVQlNUKFBPRklMRVMpCisgICAgQUNfU1VCU1QoUE9TVUIpCisgIF0pCisKK0FDX0RFRlVOKENZX0dOVV9HRVRURVhULAorICBbQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX1BST0dfUkFOTElCXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0lTQ19QT1NJWF0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19DX0NPTlNUXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfT0ZGX1RdKWRubAorICAgQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKWRubAorICAgQUNfUkVRVUlSRShbQUNfRlVOQ19BTExPQ0FdKWRubAorICAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKKworICAgQUNfQ0hFQ0tfSEVBREVSUyhbYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAordW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmhdKQorICAgQUNfQ0hFQ0tfRlVOQ1MoW2dldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAorX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHRdKQorCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCisgICAgIEFDX0NIRUNLX0ZVTkNTKHN0cGNweSkKKyAgIGZpCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgorICAgICBBQ19ERUZJTkUoSEFWRV9TVFBDUFksIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbl0pCisgICBmaQorCisgICBBTV9MQ19NRVNTQUdFUworICAgQ1lfV0lUSF9OTFMKKworICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgorICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgorICAgICAgIExJTkdVQVM9CisgICAgIGVsc2UKKyAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCkKKyAgICAgICBORVdfTElOR1VBUz0KKyAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KKyAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KKyAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OworICAgICAgICAgZXNhYworICAgICAgIGRvbmUKKyAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUworICAgICAgIEFDX01TR19SRVNVTFQoJExJTkdVQVMpCisgICAgIGZpCisKKyAgICAgZG5sIENvbnN0cnVjdCBsaXN0IG9mIG5hbWVzIG9mIGNhdGFsb2cgZmlsZXMgdG8gYmUgY29uc3RydWN0ZWQuCisgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgorICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKKyAgICAgZmkKKyAgIGZpCisKKyAgIGRubCBUaGUgcmVmZXJlbmNlIHRvIDxsb2NhbGUuaD4gaW4gdGhlIGluc3RhbGxlZCA8bGliaW50bC5oPiBmaWxlCisgICBkbmwgbXVzdCBiZSByZXNvbHZlZCBiZWNhdXNlIHdlIGNhbm5vdCBleHBlY3QgdGhlIHVzZXJzIG9mIHRoaXMKKyAgIGRubCB0byBkZWZpbmUgSEFWRV9MT0NBTEVfSC4KKyAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgorICAgZWxzZQorICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCisvKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCisgICBmaQorICAgQUNfU1VCU1QoSU5DTFVERV9MT0NBTEVfSCkKKworICAgZG5sIERldGVybWluZSB3aGljaCBjYXRhbG9nIGZvcm1hdCB3ZSBoYXZlIChpZiBhbnkgaXMgbmVlZGVkKQorICAgZG5sIEZvciBub3cgd2Uga25vdyBhYm91dCB0d28gZGlmZmVyZW50IGZvcm1hdHM6CisgICBkbmwgICBMaW51eCBsaWJjLTUgYW5kIHRoZSBub3JtYWwgWC9PcGVuIGZvcm1hdAorICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCisJIEFDX0NIRUNLX0hFQURFUihsaW51eC92ZXJzaW9uLmgsIG1zZ2Zvcm1hdD1saW51eCwgbXNnZm9ybWF0PXhvcGVuKQorCisJIGRubCBUcmFuc2Zvcm0gdGhlIFNFRCBzY3JpcHRzIHdoaWxlIGNvcHlpbmcgYmVjYXVzZSBzb21lIGR1bWIgU0VEcworICAgICAgICAgZG5sIGNhbm5vdCBoYW5kbGUgY29tbWVudHMuCisJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAorICAgICAgZmkKKyAgICAgIGRubCBwbzJ0Ymwuc2VkIGlzIGFsd2F5cyBuZWVkZWQuCisgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKKwkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAorICAgZmkKKworICAgZG5sIEluIHRoZSBpbnRsL01ha2VmaWxlLmluIHdlIGhhdmUgYSBzcGVjaWFsIGRlcGVuZGVuY3kgd2hpY2ggbWFrZXMKKyAgIGRubCBvbmx5IHNlbnNlIGZvciBnZXR0ZXh0LiAgV2UgY29tbWVudCB0aGlzIG91dCBmb3Igbm9uLWdldHRleHQKKyAgIGRubCBwYWNrYWdlcy4KKyAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICBBQ19TVUJTVChHVF9OTykKKyAgIEFDX1NVQlNUKEdUX1lFUykKKworICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgorICAgQUNfU1VCU1QoTUtJTlNUQUxMRElSUykKKworICAgZG5sICoqKiBGb3Igbm93IHRoZSBsaWJ0b29sIHN1cHBvcnQgaW4gaW50bC9NYWtlZmlsZSBpcyBub3QgZm9yIHJlYWwuCisgICBsPQorICAgQUNfU1VCU1QobCkKKworICAgZG5sIEdlbmVyYXRlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHhnZXR0ZXh0IHdoaWNoIHdpbGwKKyAgIGRubCBiZSBpbmNsdWRlZCBpbiBwby9NYWtlZmlsZS4gIEJ1dCBvbmx5IGRvIHRoaXMgaWYgdGhlIHBvIGRpcmVjdG9yeQorICAgZG5sIGV4aXN0cyBpbiBzcmNkaXIuCisgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgXSkKKworIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDEKKworZG5sIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoVkFSSUFCTEUsIFBST0ctVE8tQ0hFQ0stRk9SLAorZG5sICAgVEVTVC1QRVJGT1JNRUQtT04tRk9VTkRfUFJPR1JBTSBbLCBWQUxVRS1JRi1OT1QtRk9VTkQgWywgUEFUSF1dKQorQUNfREVGVU4oQU1fUEFUSF9QUk9HX1dJVEhfVEVTVCwKK1sjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiQyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkMjsgYWNfd29yZD1bJF0yCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCitBQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF8kMSwKK1tjYXNlICJbJF0kMSIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfJDE9IlskXSQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIFskM107IHRoZW4KKwlhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitkbmwgSWYgbm8gNHRoIGFyZyBpcyBnaXZlbiwgbGVhdmUgdGhlIGNhY2hlIHZhcmlhYmxlIHVuc2V0LAorZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCitpZmVsc2UoWyQ0XSwgLCAsIFsgIHRlc3QgLXogIlskXWFjX2N2X3BhdGhfJDEiICYmIGFjX2N2X3BhdGhfJDE9IiQ0IgorXSlkbmwKKyAgOzsKK2VzYWNdKWRubAorJDE9IiRhY19jdl9wYXRoXyQxIgoraWYgdGVzdCAtbiAiWyRdJDEiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoWyRdJDEpCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitmaQorQUNfU1VCU1QoJDEpZG5sCitdKQorCisjIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKK0FDX0RFRlVOKEFNX0xDX01FU1NBR0VTLAorICBbaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKKyAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxvY2FsZS5oPl0sIFtyZXR1cm4gTENfTUVTU0FHRVNdLAorICAgICAgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMsIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubyldKQorICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgorICAgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCisJCVtEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLl0pCisgICAgZmkKKyAgZmldKQorCmRpZmYgLS1naXQgYS9nZGIvYWxwaGEtbmF0LmMgYi9nZGIvYWxwaGEtbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliZDBkOAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9hbHBoYS1uYXQuYwpAQCAtMCwwICsxLDI5NyBAQAorLyogTG93IGxldmVsIEFscGhhIGludGVyZmFjZSwgZm9yIEdEQiB3aGVuIHJ1bm5pbmcgbmF0aXZlLgorICAgQ29weXJpZ2h0IDE5OTMsIDE5OTUsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisjaWZkZWYgX19saW51eF9fCisjIGluY2x1ZGUgPGFzbS9yZWcuaD4KKyMgaW5jbHVkZSA8YWxwaGEvcHRyYWNlLmg+CisjZWxzZQorIyBpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3VzZXIuaD4KKworLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAqLworCitzdGF0aWMgdm9pZCBmZXRjaF9vc2ZfY29yZV9yZWdpc3RlcnMgUEFSQU1TICgoY2hhciAqLAorCQkJCQkgICAgICB1bnNpZ25lZCwgaW50LCBDT1JFX0FERFIpKTsKK3N0YXRpYyB2b2lkIGZldGNoX2VsZl9jb3JlX3JlZ2lzdGVycyBQQVJBTVMgKChjaGFyICosCisJCQkJCSAgICAgIHVuc2lnbmVkLCBpbnQsIENPUkVfQUREUikpOworCisvKiBTaXplIG9mIGVsZW1lbnRzIGluIGptcGJ1ZiAqLworCisjZGVmaW5lIEpCX0VMRU1FTlRfU0laRSA4CisKKy8qIFRoZSBkZWZpbml0aW9uIGZvciBKQl9QQyBpbiBtYWNoaW5lL3JlZy5oIGlzIHdyb25nLgorICAgQW5kIHdlIGNhbid0IGdldCBhdCB0aGUgY29ycmVjdCBkZWZpbml0aW9uIGluIHNldGptcC5oIGFzIGl0IGlzCisgICBub3QgYWx3YXlzIGF2YWlsYWJsZSAoZWcuIGlmIF9QT1NJWF9TT1VSQ0UgaXMgZGVmaW5lZCB3aGljaCBpcyB0aGUKKyAgIGRlZmF1bHQpLiBBcyB0aGUgZGVmaW50aW9uIGlzIHVubGlrZWx5IHRvIGNoYW5nZSAoc2VlIGNvbW1lbnQKKyAgIGluIDxzZXRqbXAuaD4sIGRlZmluZSB0aGUgY29ycmVjdCB2YWx1ZSBoZXJlLiAgKi8KKworI3VuZGVmIEpCX1BDCisjZGVmaW5lIEpCX1BDIDIKKworLyogRmlndXJlIG91dCB3aGVyZSB0aGUgbG9uZ2ptcCB3aWxsIGxhbmQuCisgICBXZSBleHBlY3QgdGhlIGZpcnN0IGFyZyB0byBiZSBhIHBvaW50ZXIgdG8gdGhlIGptcF9idWYgc3RydWN0dXJlIGZyb20gd2hpY2gKKyAgIHdlIGV4dHJhY3QgdGhlIHBjIChKQl9QQykgdGhhdCB3ZSB3aWxsIGxhbmQgYXQuICBUaGUgcGMgaXMgY29waWVkIGludG8gUEMuCisgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuICovCisKK2ludAorZ2V0X2xvbmdqbXBfdGFyZ2V0IChwYykKKyAgICAgQ09SRV9BRERSICpwYzsKK3sKKyAgQ09SRV9BRERSIGpiX2FkZHI7CisgIGNoYXIgcmF3X2J1ZmZlcltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworCisgIGpiX2FkZHIgPSByZWFkX3JlZ2lzdGVyKEEwX1JFR05VTSk7CisKKyAgaWYgKHRhcmdldF9yZWFkX21lbW9yeShqYl9hZGRyICsgSkJfUEMgKiBKQl9FTEVNRU5UX1NJWkUsIHJhd19idWZmZXIsCisJCQkgc2l6ZW9mKENPUkVfQUREUikpKQorICAgIHJldHVybiAwOworCisgICpwYyA9IGV4dHJhY3RfYWRkcmVzcyAocmF3X2J1ZmZlciwgc2l6ZW9mKENPUkVfQUREUikpOworICByZXR1cm4gMTsKK30KKworLyogRXh0cmFjdCB0aGUgcmVnaXN0ZXIgdmFsdWVzIG91dCBvZiB0aGUgY29yZSBmaWxlIGFuZCBzdG9yZQorICAgdGhlbSB3aGVyZSBgcmVhZF9yZWdpc3Rlcicgd2lsbCBmaW5kIHRoZW0uCisKKyAgIENPUkVfUkVHX1NFQ1QgcG9pbnRzIHRvIHRoZSByZWdpc3RlciB2YWx1ZXMgdGhlbXNlbHZlcywgcmVhZCBpbnRvIG1lbW9yeS4KKyAgIENPUkVfUkVHX1NJWkUgaXMgdGhlIHNpemUgb2YgdGhhdCBhcmVhLgorICAgV0hJQ0ggc2F5cyB3aGljaCBzZXQgb2YgcmVnaXN0ZXJzIHdlIGFyZSBoYW5kbGluZyAoMCA9IGludCwgMiA9IGZsb2F0CisgICAgICAgICBvbiBtYWNoaW5lcyB3aGVyZSB0aGV5IGFyZSBkaXNjb250aWd1b3VzKS4KKyAgIFJFR19BRERSIGlzIHRoZSBvZmZzZXQgZnJvbSB1LnVfYXIwIHRvIHRoZSByZWdpc3RlciB2YWx1ZXMgcmVsYXRpdmUgdG8KKyAgICAgICAgICAgIGNvcmVfcmVnX3NlY3QuICBUaGlzIGlzIHVzZWQgd2l0aCBvbGQtZmFzaGlvbmVkIGNvcmUgZmlsZXMgdG8KKwkgICAgbG9jYXRlIHRoZSByZWdpc3RlcnMgaW4gYSBsYXJnZSB1cGFnZS1wbHVzLXN0YWNrICIucmVnIiBzZWN0aW9uLgorCSAgICBPcmlnaW5hbCB1cGFnZSBhZGRyZXNzIFggaXMgYXQgbG9jYXRpb24gY29yZV9yZWdfc2VjdCt4K3JlZ19hZGRyLgorICovCisKK3N0YXRpYyB2b2lkCitmZXRjaF9vc2ZfY29yZV9yZWdpc3RlcnMgKGNvcmVfcmVnX3NlY3QsIGNvcmVfcmVnX3NpemUsIHdoaWNoLCByZWdfYWRkcikKKyAgICAgY2hhciAqY29yZV9yZWdfc2VjdDsKKyAgICAgdW5zaWduZWQgY29yZV9yZWdfc2l6ZTsKKyAgICAgaW50IHdoaWNoOworICAgICBDT1JFX0FERFIgcmVnX2FkZHI7Cit7CisgIHJlZ2lzdGVyIGludCByZWdubzsKKyAgcmVnaXN0ZXIgaW50IGFkZHI7CisgIGludCBiYWRfcmVnID0gLTE7CisKKyAgLyogVGFibGUgdG8gbWFwIGEgZ2RiIHJlZ251bSB0byBhbiBpbmRleCBpbiB0aGUgY29yZSByZWdpc3RlciBzZWN0aW9uLgorICAgICBUaGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgdmFsdWVzIGFyZSBnYXJiYWdlIGluIE9TRi8xLjIgY29yZSBmaWxlcy4gICovCisgIHN0YXRpYyBpbnQgY29yZV9yZWdfbWFwcGluZ1tOVU1fUkVHU10gPQorICB7CisjZGVmaW5lIEVGTCAoRUZfU0laRSAvIDgpCisJRUZfVjAsCUVGX1QwLAlFRl9UMSwJRUZfVDIsCUVGX1QzLAlFRl9UNCwJRUZfVDUsCUVGX1Q2LAorCUVGX1Q3LAlFRl9TMCwJRUZfUzEsCUVGX1MyLAlFRl9TMywJRUZfUzQsCUVGX1M1LAlFRl9TNiwKKwlFRl9BMCwJRUZfQTEsCUVGX0EyLAlFRl9BMywJRUZfQTQsCUVGX0E1LAlFRl9UOCwJRUZfVDksCisJRUZfVDEwLAlFRl9UMTEsCUVGX1JBLAlFRl9UMTIsCUVGX0FULAlFRl9HUCwJRUZfU1AsCS0xLAorCUVGTCswLAlFRkwrMSwJRUZMKzIsCUVGTCszLAlFRkwrNCwJRUZMKzUsCUVGTCs2LAlFRkwrNywKKwlFRkwrOCwJRUZMKzksCUVGTCsxMCwJRUZMKzExLAlFRkwrMTIsCUVGTCsxMywJRUZMKzE0LAlFRkwrMTUsCisJRUZMKzE2LAlFRkwrMTcsCUVGTCsxOCwJRUZMKzE5LAlFRkwrMjAsCUVGTCsyMSwJRUZMKzIyLAlFRkwrMjMsCisJRUZMKzI0LAlFRkwrMjUsCUVGTCsyNiwJRUZMKzI3LAlFRkwrMjgsCUVGTCsyOSwJRUZMKzMwLAlFRkwrMzEsCisJRUZfUEMsCS0xCisgIH07CisgIHN0YXRpYyBjaGFyIHplcm9idWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXSA9IHswfTsKKworICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCBOVU1fUkVHUzsgcmVnbm8rKykKKyAgICB7CisgICAgICBpZiAoQ0FOTk9UX0ZFVENIX1JFR0lTVEVSIChyZWdubykpCisJeworCSAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgemVyb2J1Zik7CisJICBjb250aW51ZTsKKwl9CisgICAgICBhZGRyID0gOCAqIGNvcmVfcmVnX21hcHBpbmdbcmVnbm9dOworICAgICAgaWYgKGFkZHIgPCAwIHx8IGFkZHIgPj0gY29yZV9yZWdfc2l6ZSkKKwl7CisJICBpZiAoYmFkX3JlZyA8IDApCisJICAgIGJhZF9yZWcgPSByZWdubzsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgY29yZV9yZWdfc2VjdCArIGFkZHIpOworCX0KKyAgICB9CisgIGlmIChiYWRfcmVnID49IDApCisgICAgeworICAgICAgZXJyb3IgKCJSZWdpc3RlciAlcyBub3QgZm91bmQgaW4gY29yZSBmaWxlLiIsIFJFR0lTVEVSX05BTUUgKGJhZF9yZWcpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitmZXRjaF9lbGZfY29yZV9yZWdpc3RlcnMgKGNvcmVfcmVnX3NlY3QsIGNvcmVfcmVnX3NpemUsIHdoaWNoLCByZWdfYWRkcikKKyAgICAgY2hhciAqY29yZV9yZWdfc2VjdDsKKyAgICAgdW5zaWduZWQgY29yZV9yZWdfc2l6ZTsKKyAgICAgaW50IHdoaWNoOworICAgICBDT1JFX0FERFIgcmVnX2FkZHI7Cit7CisgIGlmIChjb3JlX3JlZ19zaXplIDwgMzIqOCkKKyAgICB7CisgICAgICBlcnJvciAoIkNvcmUgZmlsZSByZWdpc3RlciBzZWN0aW9uIHRvbyBzbWFsbCAoJXUgYnl0ZXMpLiIsIGNvcmVfcmVnX3NpemUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAod2hpY2ggPT0gMikKKyAgICB7CisgICAgICAvKiBUaGUgRlBVIFJlZ2lzdGVycy4gICovCisgICAgICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLCBjb3JlX3JlZ19zZWN0LCAzMSo4KTsKKyAgICAgIG1lbXNldCAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNKzMxKV0sIDAsIDgpOworICAgICAgbWVtc2V0ICgmcmVnaXN0ZXJfdmFsaWRbRlAwX1JFR05VTV0sIDEsIDMyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGUgR2VuZXJhbCBSZWdpc3RlcnMuICAqLworICAgICAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKFYwX1JFR05VTSldLCBjb3JlX3JlZ19zZWN0LCAzMSo4KTsKKyAgICAgIG1lbWNweSAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQQ19SRUdOVU0pXSwgY29yZV9yZWdfc2VjdCszMSo4LCA4KTsKKyAgICAgIG1lbXNldCAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChaRVJPX1JFR05VTSldLCAwLCA4KTsKKyAgICAgIG1lbXNldCAoJnJlZ2lzdGVyX3ZhbGlkW1YwX1JFR05VTV0sIDEsIDMyKTsKKyAgICAgIHJlZ2lzdGVyX3ZhbGlkW1BDX1JFR05VTV0gPSAxOworICAgIH0KK30KKworCisvKiBNYXAgZ2RiIGludGVybmFsIHJlZ2lzdGVyIG51bWJlciB0byBhIHB0cmFjZSBgYGFkZHJlc3MnJy4KKyAgIFRoZXNlIGBgYWRkcmVzc2VzJycgYXJlIGRlZmluZWQgaW4gPHN5cy9wdHJhY2UuaD4gKi8KKworI2RlZmluZSBSRUdJU1RFUl9QVFJBQ0VfQUREUihyZWdubykgXAorICAgKHJlZ25vIDwgRlAwX1JFR05VTSA/IAlHUFJfQkFTRSArIChyZWdubykgXAorICA6IHJlZ25vID09IFBDX1JFR05VTSA/CVBDCVwKKyAgOiByZWdubyA+PSBGUDBfUkVHTlVNID8JRlBSX0JBU0UgKyAoKHJlZ25vKSAtIEZQMF9SRUdOVU0pIFwKKyAgOiAwKQorCisvKiBSZXR1cm4gdGhlIHB0cmFjZSBgYGFkZHJlc3MnJyBvZiByZWdpc3RlciBSRUdOTy4gKi8KKworQ09SRV9BRERSCityZWdpc3Rlcl9hZGRyIChyZWdubywgYmxvY2tlbmQpCisgICAgIGludCByZWdubzsKKyAgICAgQ09SRV9BRERSIGJsb2NrZW5kOworeworICByZXR1cm4gUkVHSVNURVJfUFRSQUNFX0FERFIgKHJlZ25vKTsKK30KKworaW50CitrZXJuZWxfdV9zaXplICgpCit7CisgIHJldHVybiAoc2l6ZW9mIChzdHJ1Y3QgdXNlcikpOworfQorCisjaWYgZGVmaW5lZChVU0VfUFJPQ19GUykgfHwgZGVmaW5lZChIQVZFX0dSRUdTRVRfVCkKKyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+CisKKy8qCisgKiBTZWUgdGhlIGNvbW1lbnQgaW4gbTY4ay10ZGVwLmMgcmVnYXJkaW5nIHRoZSB1dGlsaXR5IG9mIHRoZXNlIGZ1bmN0aW9ucy4KKyAqLworCit2b2lkIAorc3VwcGx5X2dyZWdzZXQgKGdyZWdzZXRwKQorICAgICBncmVnc2V0X3QgKmdyZWdzZXRwOworeworICByZWdpc3RlciBpbnQgcmVnaTsKKyAgcmVnaXN0ZXIgbG9uZyAqcmVncCA9IEFMUEhBX1JFR1NFVF9CQVNFIChncmVnc2V0cCk7CisgIHN0YXRpYyBjaGFyIHplcm9idWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXSA9IHswfTsKKworICBmb3IgKHJlZ2kgPSAwOyByZWdpIDwgMzE7IHJlZ2krKykKKyAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ2ksIChjaGFyICopKHJlZ3AgKyByZWdpKSk7CisKKyAgc3VwcGx5X3JlZ2lzdGVyIChQQ19SRUdOVU0sIChjaGFyICopKHJlZ3AgKyAzMSkpOworCisgIC8qIEZpbGwgaW5hY2Nlc3NpYmxlIHJlZ2lzdGVycyB3aXRoIHplcm8uICAqLworICBzdXBwbHlfcmVnaXN0ZXIgKFpFUk9fUkVHTlVNLCB6ZXJvYnVmKTsKKyAgc3VwcGx5X3JlZ2lzdGVyIChGUF9SRUdOVU0sIHplcm9idWYpOworfQorCit2b2lkCitmaWxsX2dyZWdzZXQgKGdyZWdzZXRwLCByZWdubykKKyAgICAgZ3JlZ3NldF90ICpncmVnc2V0cDsKKyAgICAgaW50IHJlZ25vOworeworICBpbnQgcmVnaTsKKyAgcmVnaXN0ZXIgbG9uZyAqcmVncCA9IEFMUEhBX1JFR1NFVF9CQVNFIChncmVnc2V0cCk7CisKKyAgZm9yIChyZWdpID0gMDsgcmVnaSA8IDMxOyByZWdpKyspCisgICAgaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IHJlZ2kpKQorICAgICAgKihyZWdwICsgcmVnaSkgPSAqKGxvbmcgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdpKV07CisKKyAgaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IFBDX1JFR05VTSkpCisgICAgKihyZWdwICsgMzEpID0gKihsb25nICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUENfUkVHTlVNKV07Cit9CisKKy8qCisgKiBOb3cgd2UgZG8gdGhlIHNhbWUgdGhpbmcgZm9yIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVycy4KKyAqIEFnYWluLCBzZWUgdGhlIGNvbW1lbnRzIGluIG02OGstdGRlcC5jLgorICovCisKK3ZvaWQKK3N1cHBseV9mcHJlZ3NldCAoZnByZWdzZXRwKQorICAgICBmcHJlZ3NldF90ICpmcHJlZ3NldHA7Cit7CisgIHJlZ2lzdGVyIGludCByZWdpOworICByZWdpc3RlciBsb25nICpyZWdwID0gQUxQSEFfUkVHU0VUX0JBU0UgKGZwcmVnc2V0cCk7CisKKyAgZm9yIChyZWdpID0gMDsgcmVnaSA8IDMyOyByZWdpKyspCisgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdpICsgRlAwX1JFR05VTSwgKGNoYXIgKikocmVncCArIHJlZ2kpKTsKK30KKwordm9pZAorZmlsbF9mcHJlZ3NldCAoZnByZWdzZXRwLCByZWdubykKKyAgICAgZnByZWdzZXRfdCAqZnByZWdzZXRwOworICAgICBpbnQgcmVnbm87Cit7CisgIGludCByZWdpOworICByZWdpc3RlciBsb25nICpyZWdwID0gQUxQSEFfUkVHU0VUX0JBU0UgKGZwcmVnc2V0cCk7CisKKyAgZm9yIChyZWdpID0gRlAwX1JFR05VTTsgcmVnaSA8IEZQMF9SRUdOVU0gKyAzMjsgcmVnaSsrKQorICAgIHsKKyAgICAgIGlmICgocmVnbm8gPT0gLTEpIHx8IChyZWdubyA9PSByZWdpKSkKKwl7CisJICAqKHJlZ3AgKyByZWdpIC0gRlAwX1JFR05VTSkgPQorCSAgICAqKGxvbmcgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdpKV07CisJfQorICAgIH0KK30KKyNlbmRpZgorCisMCisvKiBSZWdpc3RlciB0aGF0IHdlIGFyZSBhYmxlIHRvIGhhbmRsZSBhbHBoYSBjb3JlIGZpbGUgZm9ybWF0cy4gKi8KKworc3RhdGljIHN0cnVjdCBjb3JlX2ZucyBhbHBoYV9vc2ZfY29yZV9mbnMgPQoreworICAvKiBUaGlzIHJlYWxseSBpcyBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ci4gICovCisKKyAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCisgIGZldGNoX29zZl9jb3JlX3JlZ2lzdGVycywKKyAgTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBjb3JlX2ZucyBhbHBoYV9lbGZfY29yZV9mbnMgPQoreworICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAorICBmZXRjaF9lbGZfY29yZV9yZWdpc3RlcnMsCisgIE5VTEwKK307CisKK3ZvaWQKK19pbml0aWFsaXplX2NvcmVfYWxwaGEgKCkKK3sKKyAgYWRkX2NvcmVfZm5zICgmYWxwaGFfb3NmX2NvcmVfZm5zKTsKKyAgYWRkX2NvcmVfZm5zICgmYWxwaGFfZWxmX2NvcmVfZm5zKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9hbHBoYS10ZGVwLmMgYi9nZGIvYWxwaGEtdGRlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMDEwMTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvYWxwaGEtdGRlcC5jCkBAIC0wLDAgKzEsMTQxMCBAQAorLyogVGFyZ2V0LWRlcGVuZGVudCBjb2RlIGZvciB0aGUgQUxQSEEgYXJjaGl0ZWN0dXJlLCBmb3IgR0RCLCB0aGUgR05VIERlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImRpcy1hc20uaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisKKy8qIEZJWE1FOiBTb21lIG9mIHRoaXMgY29kZSBzaG91bGQgcGVyaGFwcyBiZSBtZXJnZWQgd2l0aCBtaXBzLXRkZXAuYy4gICovCisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gKi8KKworc3RhdGljIGFscGhhX2V4dHJhX2Z1bmNfaW5mb190IHB1c2hfc2lndHJhbXBfZGVzYyBQQVJBTVMgKChDT1JFX0FERFIgbG93X2FkZHIpKTsKKworc3RhdGljIENPUkVfQUREUiByZWFkX25leHRfZnJhbWVfcmVnIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICosIGludCkpOworCitzdGF0aWMgQ09SRV9BRERSIGhldXJpc3RpY19wcm9jX3N0YXJ0IFBBUkFNUyAoKENPUkVfQUREUikpOworCitzdGF0aWMgYWxwaGFfZXh0cmFfZnVuY19pbmZvX3QgaGV1cmlzdGljX3Byb2NfZGVzYyBQQVJBTVMgKChDT1JFX0FERFIsCisJCQkJCQkJICAgIENPUkVfQUREUiwKKwkJCQkJCQkgICAgc3RydWN0IGZyYW1lX2luZm8gKikpOworCitzdGF0aWMgYWxwaGFfZXh0cmFfZnVuY19pbmZvX3QgZmluZF9wcm9jX2Rlc2MgUEFSQU1TICgoQ09SRV9BRERSLAorCQkJCQkJICAgICAgIHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworI2lmIDAKK3N0YXRpYyBpbnQgYWxwaGFfaW5fbGVuaWVudF9wcm9sb2d1ZSBQQVJBTVMgKChDT1JFX0FERFIsIENPUkVfQUREUikpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJlaW5pdF9mcmFtZV9jYWNoZV9zZnVuYyBQQVJBTVMgKChjaGFyICosIGludCwKKwkJCQkJICAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKikpOworCitzdGF0aWMgQ09SRV9BRERSIGFmdGVyX3Byb2xvZ3VlIFBBUkFNUyAoKENPUkVfQUREUiBwYywKKwkJCQkJIGFscGhhX2V4dHJhX2Z1bmNfaW5mb190IHByb2NfZGVzYykpOworCitzdGF0aWMgaW50IGFscGhhX2luX3Byb2xvZ3VlIFBBUkFNUyAoKENPUkVfQUREUiBwYywKKwkJCQlhbHBoYV9leHRyYV9mdW5jX2luZm9fdCBwcm9jX2Rlc2MpKTsKKworLyogSGV1cmlzdGljX3Byb2Nfc3RhcnQgbWF5IGh1bnQgdGhyb3VnaCB0aGUgdGV4dCBzZWN0aW9uIGZvciBhIGxvbmcKKyAgIHRpbWUgYWNyb3NzIGEgMjQwMCBiYXVkIHNlcmlhbCBsaW5lLiAgQWxsb3dzIHRoZSB1c2VyIHRvIGxpbWl0IHRoaXMKKyAgIHNlYXJjaC4gICovCitzdGF0aWMgdW5zaWduZWQgaW50IGhldXJpc3RpY19mZW5jZV9wb3N0ID0gMDsKKworLyogTGF5b3V0IG9mIGEgc3RhY2sgZnJhbWUgb24gdGhlIGFscGhhOgorCisgICAgICAgICAgICAgICAgfAkJCQl8CisgcGRyIG1lbWJlcnM6CXwgIDd0aCAuLi4gbnRoIGFyZywJCXwKKyAgICAgICAgICAgICAgICB8ICBgcHVzaGVkJyBieSBjYWxsZXIuCQl8CisgICAgICAgICAgICAgICAgfAkJCQl8CistLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18PC0tICBvbGRfc3AgPT0gdmZwCisgICBeICBeICBeICBeCXwJCQkJfAorICAgfCAgfCAgfCAgfAl8CQkJCXwKKyAgIHwgIHxsb2NhbG9mZgl8ICBDb3BpZXMgb2YgMXN0IC4uIDZ0aAkJfAorICAgfCAgfCAgfCAgfAl8ICBhcmd1bWVudCBpZiBuZWNlc3NhcnkuCXwKKyAgIHwgIHwgIHwgIHYJfAkJCQl8CisgICB8ICB8ICB8ICAtLS0JfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18PC0tIEZSQU1FX0xPQ0FMU19BRERSRVNTCisgICB8ICB8ICB8ICAgICAgfAkJCQl8CisgICB8ICB8ICB8ICAgICAgfCAgTG9jYWxzIGFuZCB0ZW1wb3Jhcmllcy4JfAorICAgfCAgfCAgfCAgICAgIHwJCQkJfAorICAgfCAgfCAgfCAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgfCAgfCAgfCAgICAgIHwJCQkJfAorICAgfC1mcmVnb2Zmc2V0CXwgIFNhdmVkIGZsb2F0IHJlZ2lzdGVycy4JfAorICAgfCAgfCAgfCAgICAgIHwgIEY5CQkJCXwKKyAgIHwgIHwgIHwgICAgICB8ICAgLgkJCQl8CisgICB8ICB8ICB8ICAgICAgfCAgIC4JCQkJfAorICAgfCAgfCAgfCAgICAgIHwgIEYyCQkJCXwKKyAgIHwgIHwgIHYgICAgICB8CQkJCXwKKyAgIHwgIHwgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgIHwgIHwgICAgICAgICB8CQkJCXwKKyAgIHwgIHwgICAgICAgICB8ICBTYXZlZCByZWdpc3RlcnMuCQl8CisgICB8ICB8ICAgICAgICAgfCAgUzYJCQkJfAorICAgfC1yZWdvZmZzZXQJfCAgIC4JCQkJfAorICAgfCAgfCAgICAgICAgIHwgICAuCQkJCXwKKyAgIHwgIHwgICAgICAgICB8ICBTMAkJCQl8CisgICB8ICB8ICAgICAgICAgfCAgcGRyLnBjcmVnCQkJfAorICAgfCAgdiAgICAgICAgIHwJCQkJfAorICAgfCAgLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgfCAgICAgICAgICAgIHwJCQkJfAorIGZyYW1lb2Zmc2V0ICAgIHwgIEFyZ3VtZW50IGJ1aWxkIGFyZWEsIGdldHMJfAorICAgfCAgICAgICAgICAgIHwgIDd0aCAuLi4gbnRoIGFyZyBmb3IgYW55CXwKKyAgIHwgICAgICAgICAgICB8ICBjYWxsZWQgcHJvY2VkdXJlLgkJfAorICAgdiAgICAgICAgICAgIHwgIAkJCQl8CisgICAtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18PC0tIHNwCisgICAgICAgICAgICAgICAgfAkJCQl8CisqLworCisjZGVmaW5lIFBST0NfTE9XX0FERFIocHJvYykgKChwcm9jKS0+cGRyLmFkcikgLyogbGVhc3QgYWRkcmVzcyAqLworI2RlZmluZSBQUk9DX0hJR0hfQUREUihwcm9jKSAoKHByb2MpLT5wZHIuaWxpbmUpIC8qIHVwcGVyIGFkZHJlc3MgYm91bmQgKi8KKyNkZWZpbmUgUFJPQ19EVU1NWV9GUkFNRShwcm9jKSAoKHByb2MpLT5wZHIuaW9wdCkgLyogZnJhbWUgZm9yIENBTExfRFVNTVkgKi8KKyNkZWZpbmUgUFJPQ19GUkFNRV9PRkZTRVQocHJvYykgKChwcm9jKS0+cGRyLmZyYW1lb2Zmc2V0KQorI2RlZmluZSBQUk9DX0ZSQU1FX1JFRyhwcm9jKSAoKHByb2MpLT5wZHIuZnJhbWVyZWcpCisjZGVmaW5lIFBST0NfUkVHX01BU0socHJvYykgKChwcm9jKS0+cGRyLnJlZ21hc2spCisjZGVmaW5lIFBST0NfRlJFR19NQVNLKHByb2MpICgocHJvYyktPnBkci5mcmVnbWFzaykKKyNkZWZpbmUgUFJPQ19SRUdfT0ZGU0VUKHByb2MpICgocHJvYyktPnBkci5yZWdvZmZzZXQpCisjZGVmaW5lIFBST0NfRlJFR19PRkZTRVQocHJvYykgKChwcm9jKS0+cGRyLmZyZWdvZmZzZXQpCisjZGVmaW5lIFBST0NfUENfUkVHKHByb2MpICgocHJvYyktPnBkci5wY3JlZykKKyNkZWZpbmUgUFJPQ19MT0NBTE9GRihwcm9jKSAoKHByb2MpLT5wZHIubG9jYWxvZmYpCisjZGVmaW5lIFBST0NfU1lNQk9MKHByb2MpICgqKHN0cnVjdCBzeW1ib2wqKikmKHByb2MpLT5wZHIuaXN5bSkKKyNkZWZpbmUgX1BST0NfTUFHSUNfIDB4MEYwRjBGMEYKKyNkZWZpbmUgUFJPQ19ERVNDX0lTX0RVTU1ZKHByb2MpICgocHJvYyktPnBkci5pc3ltID09IF9QUk9DX01BR0lDXykKKyNkZWZpbmUgU0VUX1BST0NfREVTQ19JU19EVU1NWShwcm9jKSAoKHByb2MpLT5wZHIuaXN5bSA9IF9QUk9DX01BR0lDXykKKworc3RydWN0IGxpbmtlZF9wcm9jX2luZm8KK3sKKyAgc3RydWN0IGFscGhhX2V4dHJhX2Z1bmNfaW5mbyBpbmZvOworICBzdHJ1Y3QgbGlua2VkX3Byb2NfaW5mbyAqbmV4dDsKK30gKmxpbmtlZF9wcm9jX2Rlc2NfdGFibGUgPSBOVUxMOworCisMCisvKiBVbmRlciBHTlUvTGludXgsIHNpZ25hbCBoYW5kbGVyIGludm9jYXRpb25zIGNhbiBiZSBpZGVudGlmaWVkIGJ5IHRoZQorICAgZGVzaWduYXRlZCBjb2RlIHNlcXVlbmNlIHRoYXQgaXMgdXNlZCB0byByZXR1cm4gZnJvbSBhIHNpZ25hbAorICAgaGFuZGxlci4gIEluIHBhcnRpY3VsYXIsIHRoZSByZXR1cm4gYWRkcmVzcyBvZiBhIHNpZ25hbCBoYW5kbGVyCisgICBwb2ludHMgdG8gdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSAodGhlIGZpcnN0IGluc3RydWN0aW9uIGlzIHF1YWR3b3JkCisgICBhbGlnbmVkKToKKworCWJpcyAkMzAsJDMwLCQxNgorCWFkZHEgJDMxLDB4NjcsJDAKKwljYWxsX3BhbCBjYWxsc3lzCisKKyAgIEVhY2ggaW5zdHJ1Y3Rpb24gaGFzIGEgdW5pcXVlIGVuY29kaW5nLCBzbyB3ZSBzaW1wbHkgYXR0ZW1wdCB0bworICAgbWF0Y2ggdGhlIGluc3RydWN0aW9uIHRoZSBwYyBpcyBwb2ludGluZyB0byB3aXRoIGFueSBvZiB0aGUgYWJvdmUKKyAgIGluc3RydWN0aW9ucy4gIElmIHRoZXJlIGlzIGEgaGl0LCB3ZSBrbm93IHRoZSBvZmZzZXQgdG8gdGhlIHN0YXJ0CisgICBvZiB0aGUgZGVzaWduYXRlZCBzZXF1ZW5jZSBhbmQgY2FuIHRoZW4gY2hlY2sgd2hldGhlciB3ZSByZWFsbHkgYXJlCisgICBleGVjdXRpbmcgaW4gYSBkZXNpZ25hdGVkIHNlcXVlbmNlLiAgSWYgbm90LCAtMSBpcyByZXR1cm5lZCwKKyAgIG90aGVyd2lzZSB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBkZXNpbmdhdGVkIHNlcXVlbmNlIGlzCisgICByZXR1cm5lZC4KKworICAgVGhlcmUgaXMgYSBzbGlnaHQgY2hhbmNlIG9mIGZhbHNlIGhpdHM6IGNvZGUgY291bGQganVtcCBpbnRvIHRoZQorICAgbWlkZGxlIG9mIHRoZSBkZXNpZ25hdGVkIHNlcXVlbmNlLCBpbiB3aGljaCBjYXNlIHRoZXJlIGlzIG5vCisgICBndWFyYW50ZWUgdGhhdCB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIHNpZ3JldHVybiBzeXNjYWxsLiAgRG9uJ3QKKyAgIHRoaW5rIHRoaXMgd2lsbCBiZSBhIHByb2JsZW0gaW4gcHJheGlzLCB0aG91Z2guCisqLworCitsb25nCithbHBoYV9saW51eF9zaWd0cmFtcF9vZmZzZXQgKENPUkVfQUREUiBwYykKK3sKKyAgdW5zaWduZWQgaW50IGlbM10sIHc7CisgIGxvbmcgb2ZmOworCisgIGlmIChyZWFkX21lbW9yeV9ub2JwdChwYywgKGNoYXIgKikgJncsIDQpICE9IDApCisgICAgcmV0dXJuIC0xOworCisgIG9mZiA9IC0xOworICBzd2l0Y2ggKHcpCisgICAgeworICAgIGNhc2UgMHg0N2RlMDQxMDogb2ZmID0gMDsgYnJlYWs7CS8qIGJpcyAkMzAsJDMwLCQxNiAqLworICAgIGNhc2UgMHg0M2VjZjQwMDogb2ZmID0gNDsgYnJlYWs7CS8qIGFkZHEgJDMxLDB4NjcsJDAgKi8KKyAgICBjYXNlIDB4MDAwMDAwODM6IG9mZiA9IDg7IGJyZWFrOwkvKiBjYWxsX3BhbCBjYWxsc3lzICovCisgICAgZGVmYXVsdDoJICAgICByZXR1cm4gLTE7CisgICAgfQorICBwYyAtPSBvZmY7CisgIGlmIChwYyAmIDB4NykKKyAgICB7CisgICAgICAvKiBkZXNpZ25hdGVkIHNlcXVlbmNlIGlzIG5vdCBxdWFkd29yZCBhbGlnbmVkICovCisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmIChyZWFkX21lbW9yeV9ub2JwdChwYywgKGNoYXIgKikgaSwgc2l6ZW9mKGkpKSAhPSAwKQorICAgIHJldHVybiAtMTsKKworICBpZiAoaVswXSA9PSAweDQ3ZGUwNDEwICYmIGlbMV0gPT0gMHg0M2VjZjQwMCAmJiBpWzJdID09IDB4MDAwMDAwODMpCisgICAgcmV0dXJuIG9mZjsKKworICByZXR1cm4gLTE7Cit9CisKKwwKKy8qIFVuZGVyIE9TRi8xLCB0aGUgX19zaWd0cmFtcCByb3V0aW5lIGlzIGZyYW1lbGVzcyBhbmQgaGFzIGEgZnJhbWUKKyAgIHNpemUgb2YgemVybywgYnV0IHdlIGFyZSBhYmxlIHRvIGJhY2t0cmFjZSB0aHJvdWdoIGl0LiAgKi8KK0NPUkVfQUREUgorYWxwaGFfb3NmX3NraXBfc2lndHJhbXBfZnJhbWUgKGZyYW1lLCBwYykKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworICAgICBDT1JFX0FERFIgcGM7Cit7CisgIGNoYXIgKm5hbWU7CisgIGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAocGMsICZuYW1lLCAoQ09SRV9BRERSICopTlVMTCwgKENPUkVfQUREUiAqKU5VTEwpOworICBpZiAoSU5fU0lHVFJBTVAgKHBjLCBuYW1lKSkKKyAgICByZXR1cm4gZnJhbWUtPmZyYW1lOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKwwKKy8qIER5bmFtaWNhbGx5IGNyZWF0ZSBhIHNpZ25hbC1oYW5kbGVyIGNhbGxlciBwcm9jZWR1cmUgZGVzY3JpcHRvciBmb3IKKyAgIHRoZSBzaWduYWwtaGFuZGxlciByZXR1cm4gY29kZSBzdGFydGluZyBhdCBhZGRyZXNzIExPV19BRERSLiAgVGhlCisgICBkZXNjcmlwdG9yIGlzIGFkZGVkIHRvIHRoZSBsaW5rZWRfcHJvY19kZXNjX3RhYmxlLiAgKi8KKworc3RhdGljIGFscGhhX2V4dHJhX2Z1bmNfaW5mb190CitwdXNoX3NpZ3RyYW1wX2Rlc2MgKGxvd19hZGRyKQorICAgICBDT1JFX0FERFIgbG93X2FkZHI7Cit7CisgIHN0cnVjdCBsaW5rZWRfcHJvY19pbmZvICpsaW5rOworICBhbHBoYV9leHRyYV9mdW5jX2luZm9fdCBwcm9jX2Rlc2M7CisKKyAgbGluayA9IChzdHJ1Y3QgbGlua2VkX3Byb2NfaW5mbyAqKQorICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxpbmtlZF9wcm9jX2luZm8pKTsKKyAgbGluay0+bmV4dCA9IGxpbmtlZF9wcm9jX2Rlc2NfdGFibGU7CisgIGxpbmtlZF9wcm9jX2Rlc2NfdGFibGUgPSBsaW5rOworCisgIHByb2NfZGVzYyA9ICZsaW5rLT5pbmZvOworCisgIHByb2NfZGVzYy0+bnVtYXJncyA9IDA7CisgIFBST0NfTE9XX0FERFIgKHByb2NfZGVzYykJPSBsb3dfYWRkcjsKKyAgUFJPQ19ISUdIX0FERFIgKHByb2NfZGVzYykJPSBsb3dfYWRkciArIDMgKiA0OworICBQUk9DX0RVTU1ZX0ZSQU1FIChwcm9jX2Rlc2MpCT0gMDsKKyAgUFJPQ19GUkFNRV9PRkZTRVQgKHByb2NfZGVzYykJPSAweDI5ODsgLyogc2l6ZW9mKHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCkgKi8KKyAgUFJPQ19GUkFNRV9SRUcgKHByb2NfZGVzYykJPSBTUF9SRUdOVU07CisgIFBST0NfUkVHX01BU0sgKHByb2NfZGVzYykJPSAweGZmZmY7CisgIFBST0NfRlJFR19NQVNLIChwcm9jX2Rlc2MpCT0gMHhmZmZmOworICBQUk9DX1BDX1JFRyAocHJvY19kZXNjKQk9IDI2OworICBQUk9DX0xPQ0FMT0ZGIChwcm9jX2Rlc2MpCT0gMDsKKyAgU0VUX1BST0NfREVTQ19JU19EWU5fU0lHVFJBTVAgKHByb2NfZGVzYyk7CisgIHJldHVybiAocHJvY19kZXNjKTsKK30KKworDAorLyogR3VhcmFudGVlZCB0byBzZXQgZnJhbWUtPnNhdmVkX3JlZ3MgdG8gc29tZSB2YWx1ZXMgKGl0IG5ldmVyIGxlYXZlcyBpdAorICAgTlVMTCkuICAqLworCit2b2lkCithbHBoYV9maW5kX3NhdmVkX3JlZ3MgKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIGludCBpcmVnOworICBDT1JFX0FERFIgcmVnX3Bvc2l0aW9uOworICB1bnNpZ25lZCBsb25nIG1hc2s7CisgIGFscGhhX2V4dHJhX2Z1bmNfaW5mb190IHByb2NfZGVzYzsKKyAgaW50IHJldHVybnJlZzsKKworICBmcmFtZV9zYXZlZF9yZWdzX3phbGxvYyAoZnJhbWUpOworCisgIC8qIElmIGl0IGlzIHRoZSBmcmFtZSBmb3IgX19zaWd0cmFtcCwgdGhlIHNhdmVkIHJlZ2lzdGVycyBhcmUgbG9jYXRlZAorICAgICBpbiBhIHNpZ2NvbnRleHQgc3RydWN0dXJlIHNvbWV3aGVyZSBvbiB0aGUgc3RhY2suIF9fc2lndHJhbXAKKyAgICAgcGFzc2VzIGEgcG9pbnRlciB0byB0aGUgc2lnY29udGV4dCBzdHJ1Y3R1cmUgb24gdGhlIHN0YWNrLgorICAgICBJZiB0aGUgc3RhY2sgbGF5b3V0IGZvciBfX3NpZ3RyYW1wIGNoYW5nZXMsIG9yIGlmIHNpZ2NvbnRleHQgb2Zmc2V0cworICAgICBjaGFuZ2UsIHdlIG1pZ2h0IGhhdmUgdG8gdXBkYXRlIHRoaXMgY29kZS4gICovCisjaWZuZGVmIFNJR0ZSQU1FX1BDX09GRgorI2RlZmluZSBTSUdGUkFNRV9QQ19PRkYJCSgyICogOCkKKyNkZWZpbmUgU0lHRlJBTUVfUkVHU0FWRV9PRkYJKDQgKiA4KQorI2RlZmluZSBTSUdGUkFNRV9GUFJFR1NBVkVfT0ZGCShTSUdGUkFNRV9SRUdTQVZFX09GRiArIDMyICogOCArIDgpCisjZW5kaWYKKyAgaWYgKGZyYW1lLT5zaWduYWxfaGFuZGxlcl9jYWxsZXIpCisgICAgeworICAgICAgQ09SRV9BRERSIHNpZ2NvbnRleHRfYWRkcjsKKworICAgICAgc2lnY29udGV4dF9hZGRyID0gU0lHQ09OVEVYVF9BRERSIChmcmFtZSk7CisgICAgICBmb3IgKGlyZWcgPSAwOyBpcmVnIDwgMzI7IGlyZWcrKykKKwl7CisgCSAgcmVnX3Bvc2l0aW9uID0gc2lnY29udGV4dF9hZGRyICsgU0lHRlJBTUVfUkVHU0FWRV9PRkYgKyBpcmVnICogODsKKyAJICBmcmFtZS0+c2F2ZWRfcmVnc1tpcmVnXSA9IHJlZ19wb3NpdGlvbjsKKwl9CisgICAgICBmb3IgKGlyZWcgPSAwOyBpcmVnIDwgMzI7IGlyZWcrKykKKwl7CisgCSAgcmVnX3Bvc2l0aW9uID0gc2lnY29udGV4dF9hZGRyICsgU0lHRlJBTUVfRlBSRUdTQVZFX09GRiArIGlyZWcgKiA4OworIAkgIGZyYW1lLT5zYXZlZF9yZWdzW0ZQMF9SRUdOVU0gKyBpcmVnXSA9IHJlZ19wb3NpdGlvbjsKKwl9CisgICAgICBmcmFtZS0+c2F2ZWRfcmVnc1tQQ19SRUdOVU1dID0gc2lnY29udGV4dF9hZGRyICsgU0lHRlJBTUVfUENfT0ZGOworICAgICAgcmV0dXJuOworICAgIH0KKworICBwcm9jX2Rlc2MgPSBmcmFtZS0+cHJvY19kZXNjOworICBpZiAocHJvY19kZXNjID09IE5VTEwpCisgICAgLyogSSdtIG5vdCBzdXJlIGhvdy93aGV0aGVyIHRoaXMgY2FuIGhhcHBlbi4gIE5vcm1hbGx5IHdoZW4gd2UgY2FuJ3QKKyAgICAgICBmaW5kIGEgcHJvY19kZXNjLCB3ZSAic3ludGhlc2l6ZSIgb25lIHVzaW5nIGhldXJpc3RpY19wcm9jX2Rlc2MKKyAgICAgICBhbmQgc2V0IHRoZSBzYXZlZF9yZWdzIHJpZ2h0IGF3YXkuICAqLworICAgIHJldHVybjsKKworICAvKiBGaWxsIGluIHRoZSBvZmZzZXRzIGZvciB0aGUgcmVnaXN0ZXJzIHdoaWNoIGdlbl9tYXNrIHNheXMKKyAgICAgd2VyZSBzYXZlZC4gICovCisKKyAgcmVnX3Bvc2l0aW9uID0gZnJhbWUtPmZyYW1lICsgUFJPQ19SRUdfT0ZGU0VUIChwcm9jX2Rlc2MpOworICBtYXNrID0gUFJPQ19SRUdfTUFTSyAocHJvY19kZXNjKTsKKworICByZXR1cm5yZWcgPSBQUk9DX1BDX1JFRyAocHJvY19kZXNjKTsKKworICAvKiBOb3RlIHRoYXQgUkEgaXMgYWx3YXlzIHNhdmVkIGZpcnN0LCByZWdhcmRsZXNzIG9mIGl0cyBhY3R1YWwKKyAgICAgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KKyAgaWYgKG1hc2sgJiAoMSA8PCByZXR1cm5yZWcpKQorICAgIHsKKyAgICAgIGZyYW1lLT5zYXZlZF9yZWdzW3JldHVybnJlZ10gPSByZWdfcG9zaXRpb247CisgICAgICByZWdfcG9zaXRpb24gKz0gODsKKyAgICAgIG1hc2sgJj0gfigxIDw8IHJldHVybnJlZyk7IC8qIENsZWFyIGJpdCBmb3IgUkEgc28gd2UKKwkJCQkgICAgZG9uJ3Qgc2F2ZSBhZ2FpbiBsYXRlci4gKi8KKyAgICB9CisKKyAgZm9yIChpcmVnID0gMDsgaXJlZyA8PSAzMSA7ICsraXJlZykKKyAgICBpZiAobWFzayAmICgxIDw8IGlyZWcpKQorICAgICAgeworCWZyYW1lLT5zYXZlZF9yZWdzW2lyZWddID0gcmVnX3Bvc2l0aW9uOworCXJlZ19wb3NpdGlvbiArPSA4OworICAgICAgfQorCisgIC8qIEZpbGwgaW4gdGhlIG9mZnNldHMgZm9yIHRoZSByZWdpc3RlcnMgd2hpY2ggZmxvYXRfbWFzayBzYXlzCisgICAgIHdlcmUgc2F2ZWQuICAqLworCisgIHJlZ19wb3NpdGlvbiA9IGZyYW1lLT5mcmFtZSArIFBST0NfRlJFR19PRkZTRVQgKHByb2NfZGVzYyk7CisgIG1hc2sgPSBQUk9DX0ZSRUdfTUFTSyAocHJvY19kZXNjKTsKKworICBmb3IgKGlyZWcgPSAwOyBpcmVnIDw9IDMxIDsgKytpcmVnKQorICAgIGlmIChtYXNrICYgKDEgPDwgaXJlZykpCisgICAgICB7CisJZnJhbWUtPnNhdmVkX3JlZ3NbRlAwX1JFR05VTStpcmVnXSA9IHJlZ19wb3NpdGlvbjsKKwlyZWdfcG9zaXRpb24gKz0gODsKKyAgICAgIH0KKworICBmcmFtZS0+c2F2ZWRfcmVnc1tQQ19SRUdOVU1dID0gZnJhbWUtPnNhdmVkX3JlZ3NbcmV0dXJucmVnXTsKK30KKworc3RhdGljIENPUkVfQUREUgorcmVhZF9uZXh0X2ZyYW1lX3JlZyhmaSwgcmVnbm8pCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKKyAgICAgaW50IHJlZ25vOworeworICBmb3IgKDsgZmk7IGZpID0gZmktPm5leHQpCisgICAgeworICAgICAgLyogV2UgaGF2ZSB0byBnZXQgdGhlIHNhdmVkIHNwIGZyb20gdGhlIHNpZ2NvbnRleHQKKwkgaWYgaXQgaXMgYSBzaWduYWwgaGFuZGxlciBmcmFtZS4gICovCisgICAgICBpZiAocmVnbm8gPT0gU1BfUkVHTlVNICYmICFmaS0+c2lnbmFsX2hhbmRsZXJfY2FsbGVyKQorCXJldHVybiBmaS0+ZnJhbWU7CisgICAgICBlbHNlCisJeworCSAgaWYgKGZpLT5zYXZlZF9yZWdzID09IE5VTEwpCisJICAgIGFscGhhX2ZpbmRfc2F2ZWRfcmVncyAoZmkpOworCSAgaWYgKGZpLT5zYXZlZF9yZWdzW3JlZ25vXSkKKwkgICAgcmV0dXJuIHJlYWRfbWVtb3J5X2ludGVnZXIoZmktPnNhdmVkX3JlZ3NbcmVnbm9dLCA4KTsKKwl9CisgICAgfQorICByZXR1cm4gcmVhZF9yZWdpc3RlcihyZWdubyk7Cit9CisKK0NPUkVfQUREUgorYWxwaGFfZnJhbWVfc2F2ZWRfcGMoZnJhbWUpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgYWxwaGFfZXh0cmFfZnVuY19pbmZvX3QgcHJvY19kZXNjID0gZnJhbWUtPnByb2NfZGVzYzsKKyAgLyogV2UgaGF2ZSB0byBnZXQgdGhlIHNhdmVkIHBjIGZyb20gdGhlIHNpZ2NvbnRleHQKKyAgICAgaWYgaXQgaXMgYSBzaWduYWwgaGFuZGxlciBmcmFtZS4gICovCisgIGludCBwY3JlZyA9IGZyYW1lLT5zaWduYWxfaGFuZGxlcl9jYWxsZXIgPyBQQ19SRUdOVU0gOiBmcmFtZS0+cGNfcmVnOworCisgIGlmIChwcm9jX2Rlc2MgJiYgUFJPQ19ERVNDX0lTX0RVTU1ZKHByb2NfZGVzYykpCisgICAgICByZXR1cm4gcmVhZF9tZW1vcnlfaW50ZWdlcihmcmFtZS0+ZnJhbWUgLSA4LCA4KTsKKworICByZXR1cm4gcmVhZF9uZXh0X2ZyYW1lX3JlZyhmcmFtZSwgcGNyZWcpOworfQorCitDT1JFX0FERFIKK2FscGhhX3NhdmVkX3BjX2FmdGVyX2NhbGwgKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIENPUkVfQUREUiBwYyA9IGZyYW1lLT5wYzsKKyAgQ09SRV9BRERSIHRtcDsKKyAgYWxwaGFfZXh0cmFfZnVuY19pbmZvX3QgcHJvY19kZXNjOworICBpbnQgcGNyZWc7CisKKyAgLyogU2tpcCBvdmVyIHNoYXJlZCBsaWJyYXJ5IHRyYW1wb2xpbmUgaWYgbmVjZXNzYXJ5LiAgKi8KKyAgdG1wID0gU0tJUF9UUkFNUE9MSU5FX0NPREUgKHBjKTsKKyAgaWYgKHRtcCAhPSAwKQorICAgIHBjID0gdG1wOworCisgIHByb2NfZGVzYyA9IGZpbmRfcHJvY19kZXNjIChwYywgZnJhbWUtPm5leHQpOworICBwY3JlZyA9IHByb2NfZGVzYyA/IFBST0NfUENfUkVHIChwcm9jX2Rlc2MpIDogUkFfUkVHTlVNOworCisgIGlmIChmcmFtZS0+c2lnbmFsX2hhbmRsZXJfY2FsbGVyKQorICAgIHJldHVybiBhbHBoYV9mcmFtZV9zYXZlZF9wYyAoZnJhbWUpOworICBlbHNlCisgICAgcmV0dXJuIHJlYWRfcmVnaXN0ZXIgKHBjcmVnKTsKK30KKworCitzdGF0aWMgc3RydWN0IGFscGhhX2V4dHJhX2Z1bmNfaW5mbyB0ZW1wX3Byb2NfZGVzYzsKK3N0YXRpYyBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyB0ZW1wX3NhdmVkX3JlZ3M7CisKKy8qIE5vbnplcm8gaWYgaW5zdHJ1Y3Rpb24gYXQgUEMgaXMgYSByZXR1cm4gaW5zdHJ1Y3Rpb24uICAicmV0CisgICAkemVybywoJHJhKSwxIiBvbiBhbHBoYS4gKi8KKworc3RhdGljIGludAorYWxwaGFfYWJvdXRfdG9fcmV0dXJuIChwYykKKyAgICAgQ09SRV9BRERSIHBjOworeworICByZXR1cm4gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDQpID09IDB4NmJmYTgwMDE7Cit9CisKKworCisvKiBUaGlzIGZlbmNlcG9zdCBsb29rcyBoaWdobHkgc3VzcGljaW91cyB0byBtZS4gIFJlbW92aW5nIGl0IGFsc28KKyAgIHNlZW1zIHN1c3BpY2lvdXMgYXMgaXQgY291bGQgYWZmZWN0IHJlbW90ZSBkZWJ1Z2dpbmcgYWNyb3NzIHNlcmlhbAorICAgbGluZXMuICAqLworCitzdGF0aWMgQ09SRV9BRERSCitoZXVyaXN0aWNfcHJvY19zdGFydChwYykKKyAgICBDT1JFX0FERFIgcGM7Cit7CisgICAgQ09SRV9BRERSIHN0YXJ0X3BjID0gcGM7CisgICAgQ09SRV9BRERSIGZlbmNlID0gc3RhcnRfcGMgLSBoZXVyaXN0aWNfZmVuY2VfcG9zdDsKKworICAgIGlmIChzdGFydF9wYyA9PSAwKQlyZXR1cm4gMDsKKworICAgIGlmIChoZXVyaXN0aWNfZmVuY2VfcG9zdCA9PSBVSU5UX01BWAorCXx8IGZlbmNlIDwgVk1fTUlOX0FERFJFU1MpCisgICAgICBmZW5jZSA9IFZNX01JTl9BRERSRVNTOworCisgICAgLyogc2VhcmNoIGJhY2sgZm9yIHByZXZpb3VzIHJldHVybiAqLworICAgIGZvciAoc3RhcnRfcGMgLT0gNDsgOyBzdGFydF9wYyAtPSA0KQorCWlmIChzdGFydF9wYyA8IGZlbmNlKQorCSAgeworCSAgICAvKiBJdCdzIG5vdCBjbGVhciB0byBtZSB3aHkgd2UgcmVhY2ggdGhpcyBwb2ludCB3aGVuCisJICAgICAgIHN0b3Bfc29vbl9xdWlldGx5LCBidXQgd2l0aCB0aGlzIHRlc3QsIGF0IGxlYXN0IHdlCisJICAgICAgIGRvbid0IHByaW50IG91dCB3YXJuaW5ncyBmb3IgZXZlcnkgY2hpbGQgZm9ya2VkIChlZywgb24KKwkgICAgICAgZGVjc3RhdGlvbikuICAyMmFwcjkzIHJpY2hAY3lnbnVzLmNvbS4gICovCisJICAgIGlmICghc3RvcF9zb29uX3F1aWV0bHkpCisJICAgICAgeworCQlzdGF0aWMgaW50IGJsdXJiX3ByaW50ZWQgPSAwOworCisJCWlmIChmZW5jZSA9PSBWTV9NSU5fQUREUkVTUykKKwkJICB3YXJuaW5nKCJIaXQgYmVnaW5uaW5nIG9mIHRleHQgc2VjdGlvbiB3aXRob3V0IGZpbmRpbmciKTsKKwkJZWxzZQorCQkgIHdhcm5pbmcoIkhpdCBoZXVyaXN0aWMtZmVuY2UtcG9zdCB3aXRob3V0IGZpbmRpbmciKTsKKwkJCisJCXdhcm5pbmcoImVuY2xvc2luZyBmdW5jdGlvbiBmb3IgYWRkcmVzcyAweCVseCIsIHBjKTsKKwkJaWYgKCFibHVyYl9wcmludGVkKQorCQkgIHsKKwkJICAgIHByaW50Zl9maWx0ZXJlZCAoIlwKK1RoaXMgd2FybmluZyBvY2N1cnMgaWYgeW91IGFyZSBkZWJ1Z2dpbmcgYSBmdW5jdGlvbiB3aXRob3V0IGFueSBzeW1ib2xzXG5cCisoZm9yIGV4YW1wbGUsIGluIGEgc3RyaXBwZWQgZXhlY3V0YWJsZSkuICBJbiB0aGF0IGNhc2UsIHlvdSBtYXkgd2lzaCB0b1xuXAoraW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIHNlYXJjaCB3aXRoIHRoZSBgc2V0IGhldXJpc3RpYy1mZW5jZS1wb3N0JyBjb21tYW5kLlxuXAorXG5cCitPdGhlcndpc2UsIHlvdSB0b2xkIEdEQiB0aGVyZSB3YXMgYSBmdW5jdGlvbiB3aGVyZSB0aGVyZSBpc24ndCBvbmUsIG9yXG5cCisobW9yZSBsaWtlbHkpIHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnIGluIEdEQi5cbiIpOworCQkgICAgYmx1cmJfcHJpbnRlZCA9IDE7CisJCSAgfQorCSAgICAgIH0KKworCSAgICByZXR1cm4gMDsgCisJICB9CisJZWxzZSBpZiAoYWxwaGFfYWJvdXRfdG9fcmV0dXJuIChzdGFydF9wYykpCisJICBicmVhazsKKworICAgIHN0YXJ0X3BjICs9IDQ7IC8qIHNraXAgcmV0dXJuICovCisgICAgcmV0dXJuIHN0YXJ0X3BjOworfQorCitzdGF0aWMgYWxwaGFfZXh0cmFfZnVuY19pbmZvX3QKK2hldXJpc3RpY19wcm9jX2Rlc2Moc3RhcnRfcGMsIGxpbWl0X3BjLCBuZXh0X2ZyYW1lKQorICAgIENPUkVfQUREUiBzdGFydF9wYywgbGltaXRfcGM7CisgICAgc3RydWN0IGZyYW1lX2luZm8gKm5leHRfZnJhbWU7Cit7CisgICAgQ09SRV9BRERSIHNwID0gcmVhZF9uZXh0X2ZyYW1lX3JlZyAobmV4dF9mcmFtZSwgU1BfUkVHTlVNKTsKKyAgICBDT1JFX0FERFIgY3VyX3BjOworICAgIGludCBmcmFtZV9zaXplOworICAgIGludCBoYXNfZnJhbWVfcmVnID0gMDsKKyAgICB1bnNpZ25lZCBsb25nIHJlZ19tYXNrID0gMDsKKyAgICBpbnQgcGNyZWcgPSAtMTsKKworICAgIGlmIChzdGFydF9wYyA9PSAwKQorICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0ICgmdGVtcF9wcm9jX2Rlc2MsICdcMCcsIHNpemVvZih0ZW1wX3Byb2NfZGVzYykpOworICAgIG1lbXNldCAoJnRlbXBfc2F2ZWRfcmVncywgJ1wwJywgc2l6ZW9mKHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzKSk7CisgICAgUFJPQ19MT1dfQUREUiAoJnRlbXBfcHJvY19kZXNjKSA9IHN0YXJ0X3BjOworCisgICAgaWYgKHN0YXJ0X3BjICsgMjAwIDwgbGltaXRfcGMpCisgICAgICBsaW1pdF9wYyA9IHN0YXJ0X3BjICsgMjAwOworICAgIGZyYW1lX3NpemUgPSAwOworICAgIGZvciAoY3VyX3BjID0gc3RhcnRfcGM7IGN1cl9wYyA8IGxpbWl0X3BjOyBjdXJfcGMgKz0gNCkKKyAgICAgIHsKKyAgICAgICAgY2hhciBidWZbNF07CisJdW5zaWduZWQgbG9uZyB3b3JkOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSByZWFkX21lbW9yeV9ub2JwdCAoY3VyX3BjLCBidWYsIDQpOyAKKwlpZiAoc3RhdHVzKQorCSAgbWVtb3J5X2Vycm9yIChzdGF0dXMsIGN1cl9wYyk7CisJd29yZCA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0KTsKKworCWlmICgod29yZCAmIDB4ZmZmZjAwMDApID09IDB4MjNkZTAwMDApCQkvKiBsZGEgJHNwLG4oJHNwKSAqLworCSAgeworCSAgICBpZiAod29yZCAmIDB4ODAwMCkKKwkgICAgICBmcmFtZV9zaXplICs9ICgtd29yZCkgJiAweGZmZmY7CisJICAgIGVsc2UKKwkgICAgICAvKiBFeGl0IGxvb3AgaWYgYSBwb3NpdGl2ZSBzdGFjayBhZGp1c3RtZW50IGlzIGZvdW5kLCB3aGljaAorCQkgdXN1YWxseSBtZWFucyB0aGF0IHRoZSBzdGFjayBjbGVhbnVwIGNvZGUgaW4gdGhlIGZ1bmN0aW9uCisJCSBlcGlsb2d1ZSBpcyByZWFjaGVkLiAgKi8KKwkgICAgICBicmVhazsKKwkgIH0KKwllbHNlIGlmICgod29yZCAmIDB4ZmMxZjAwMDApID09IDB4YjQxZTAwMDAJLyogc3RxIHJlZyxuKCRzcCkgKi8KKwkJICYmICh3b3JkICYgMHhmZmZmMDAwMCkgIT0gMHhiN2ZlMDAwMCkJLyogcmVnICE9ICR6ZXJvICovCisJICB7CisJICAgIGludCByZWcgPSAod29yZCAmIDB4MDNlMDAwMDApID4+IDIxOworCSAgICByZWdfbWFzayB8PSAxIDw8IHJlZzsKKwkgICAgdGVtcF9zYXZlZF9yZWdzLnJlZ3NbcmVnXSA9IHNwICsgKHNob3J0KXdvcmQ7CisKKwkgICAgLyogU3RhcnRpbmcgd2l0aCBPU0YvMS0zLjJDLCB0aGUgc3lzdGVtIGxpYnJhcmllcyBhcmUgc2hpcHBlZAorCSAgICAgICB3aXRob3V0IGxvY2FsIHN5bWJvbHMsIGJ1dCB0aGV5IHN0aWxsIGNvbnRhaW4gcHJvY2VkdXJlCisJICAgICAgIGRlc2NyaXB0b3JzIHdpdGhvdXQgYSBzeW1ib2wgcmVmZXJlbmNlLiBHREIgaXMgY3VycmVudGx5CisJICAgICAgIHVuYWJsZSB0byBmaW5kIHRoZXNlIHByb2NlZHVyZSBkZXNjcmlwdG9ycyBhbmQgdXNlcworCSAgICAgICBoZXVyaXN0aWNfcHJvY19kZXNjIGluc3RlYWQuCisJICAgICAgIEFzIHNvbWUgbG93IGxldmVsIGNvbXBpbGVyIHN1cHBvcnQgcm91dGluZXMgKF9fZGl2KiwgX19hZGQqKQorCSAgICAgICB1c2UgYSBub24tc3RhbmRhcmQgcmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIsIHdlIGhhdmUgdG8KKwkgICAgICAgYWRkIHNvbWUgaGV1cmlzdGljcyB0byBkZXRlcm1pbmUgdGhlIHJldHVybiBhZGRyZXNzIHJlZ2lzdGVyLAorCSAgICAgICBvciBzdGVwcGluZyBvdmVyIHRoZXNlIHJvdXRpbmVzIHdpbGwgZmFpbC4KKwkgICAgICAgVXN1YWxseSB0aGUgcmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIgaXMgdGhlIGZpcnN0IHJlZ2lzdGVyCisJICAgICAgIHNhdmVkIG9uIHRoZSBzdGFjaywgYnV0IGFzc2VtYmxlciBvcHRpbWl6YXRpb24gbWlnaHQKKwkgICAgICAgcmVhcnJhbmdlIHRoZSByZWdpc3RlciBzYXZlcy4KKwkgICAgICAgU28gd2UgcmVjb2duaXplIG9ubHkgYSBmZXcgcmVnaXN0ZXJzICh0NywgdDksIHJhKSB3aXRoaW4KKwkgICAgICAgdGhlIHByb2NlZHVyZSBwcm9sb2d1ZSBhcyB2YWxpZCByZXR1cm4gYWRkcmVzcyByZWdpc3RlcnMuCisJICAgICAgIElmIHdlIGVuY291bnRlciBhIHJldHVybiBpbnN0cnVjdGlvbiwgd2UgZXh0cmFjdCB0aGUKKwkgICAgICAgdGhlIHJldHVybiBhZGRyZXNzIHJlZ2lzdGVyIGZyb20gaXQuCisKKwkgICAgICAgRklYTUU6IFJld3JpdGluZyBHREIgdG8gYWNjZXNzIHRoZSBwcm9jZWR1cmUgZGVzY3JpcHRvcnMsCisJICAgICAgIGUuZy4gdmlhIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZSwgbWlnaHQgb2J2aWF0ZSB0aGlzIGhhY2suICAqLworCSAgICBpZiAocGNyZWcgPT0gLTEKKwkJJiYgY3VyX3BjIDwgKHN0YXJ0X3BjICsgODApCisJCSYmIChyZWcgPT0gVDdfUkVHTlVNIHx8IHJlZyA9PSBUOV9SRUdOVU0gfHwgcmVnID09IFJBX1JFR05VTSkpCisJICAgICAgcGNyZWcgPSByZWc7CisJICB9CisJZWxzZSBpZiAoKHdvcmQgJiAweGZmZTBmZmZmKSA9PSAweDZiZTA4MDAxKQkvKiByZXQgemVybyxyZWcsMSAqLworCSAgcGNyZWcgPSAod29yZCA+PiAxNikgJiAweDFmOworCWVsc2UgaWYgKHdvcmQgPT0gMHg0N2RlMDQwZikJCQkvKiBiaXMgc3Asc3AgZnAgKi8KKwkgIGhhc19mcmFtZV9yZWcgPSAxOworICAgICAgfQorICAgIGlmIChwY3JlZyA9PSAtMSkKKyAgICAgIHsKKwkvKiBJZiB3ZSBoYXZlbid0IGZvdW5kIGEgdmFsaWQgcmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIgeWV0LAorCSAgIGtlZXAgc2VhcmNoaW5nIGluIHRoZSBwcm9jZWR1cmUgcHJvbG9ndWUuICAqLworCXdoaWxlIChjdXJfcGMgPCAobGltaXRfcGMgKyA4MCkgJiYgY3VyX3BjIDwgKHN0YXJ0X3BjICsgODApKQorCSAgeworCSAgICBjaGFyIGJ1Zls0XTsKKwkgICAgdW5zaWduZWQgbG9uZyB3b3JkOworCisJICAgIGlmIChyZWFkX21lbW9yeV9ub2JwdCAoY3VyX3BjLCBidWYsIDQpKQorCSAgICAgIGJyZWFrOworCSAgICBjdXJfcGMgKz0gNDsKKwkgICAgd29yZCA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0KTsKKworCSAgICBpZiAoKHdvcmQgJiAweGZjMWYwMDAwKSA9PSAweGI0MWUwMDAwCS8qIHN0cSByZWcsbigkc3ApICovCisJCSYmICh3b3JkICYgMHhmZmZmMDAwMCkgIT0gMHhiN2ZlMDAwMCkJLyogcmVnICE9ICR6ZXJvICovCisJICAgICAgeworCQlpbnQgcmVnID0gKHdvcmQgJiAweDAzZTAwMDAwKSA+PiAyMTsKKwkJaWYgKHJlZyA9PSBUN19SRUdOVU0gfHwgcmVnID09IFQ5X1JFR05VTSB8fCByZWcgPT0gUkFfUkVHTlVNKQorCQkgIHsKKwkJICAgIHBjcmVnID0gcmVnOworCQkgICAgYnJlYWs7CisJCSAgfQorCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoKHdvcmQgJiAweGZmZTBmZmZmKSA9PSAweDZiZTA4MDAxKQkvKiByZXQgemVybyxyZWcsMSAqLworCSAgICAgIHsKKwkJcGNyZWcgPSAod29yZCA+PiAxNikgJiAweDFmOworCQlicmVhazsKKwkgICAgICB9CisJICB9CisgICAgICB9CisKKyAgICBpZiAoaGFzX2ZyYW1lX3JlZykKKyAgICAgIFBST0NfRlJBTUVfUkVHKCZ0ZW1wX3Byb2NfZGVzYykgPSBHQ0NfRlBfUkVHTlVNOworICAgIGVsc2UKKyAgICAgIFBST0NfRlJBTUVfUkVHKCZ0ZW1wX3Byb2NfZGVzYykgPSBTUF9SRUdOVU07CisgICAgUFJPQ19GUkFNRV9PRkZTRVQoJnRlbXBfcHJvY19kZXNjKSA9IGZyYW1lX3NpemU7CisgICAgUFJPQ19SRUdfTUFTSygmdGVtcF9wcm9jX2Rlc2MpID0gcmVnX21hc2s7CisgICAgUFJPQ19QQ19SRUcoJnRlbXBfcHJvY19kZXNjKSA9IChwY3JlZyA9PSAtMSkgPyBSQV9SRUdOVU0gOiBwY3JlZzsKKyAgICBQUk9DX0xPQ0FMT0ZGKCZ0ZW1wX3Byb2NfZGVzYykgPSAwOwkvKiBYWFggLSBib2d1cyAqLworICAgIHJldHVybiAmdGVtcF9wcm9jX2Rlc2M7Cit9CisKKy8qIFRoaXMgcmV0dXJucyB0aGUgUEMgb2YgdGhlIGZpcnN0IGluc3QgYWZ0ZXIgdGhlIHByb2xvZ3VlLiAgSWYgd2UgY2FuJ3QKKyAgIGZpbmQgdGhlIHByb2xvZ3VlLCB0aGVuIHJldHVybiAwLiAgKi8KKworc3RhdGljIENPUkVfQUREUgorYWZ0ZXJfcHJvbG9ndWUgKHBjLCBwcm9jX2Rlc2MpCisgICAgIENPUkVfQUREUiBwYzsKKyAgICAgYWxwaGFfZXh0cmFfZnVuY19pbmZvX3QgcHJvY19kZXNjOworeworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKyAgQ09SRV9BRERSIGZ1bmNfYWRkciwgZnVuY19lbmQ7CisKKyAgaWYgKCFwcm9jX2Rlc2MpCisgICAgcHJvY19kZXNjID0gZmluZF9wcm9jX2Rlc2MgKHBjLCBOVUxMKTsKKworICBpZiAocHJvY19kZXNjKQorICAgIHsKKyAgICAgIGlmIChQUk9DX0RFU0NfSVNfRFlOX1NJR1RSQU1QIChwcm9jX2Rlc2MpKQorCXJldHVybiBQUk9DX0xPV19BRERSIChwcm9jX2Rlc2MpOwkvKiAicHJvbG9ndWUiIGlzIGluIGtlcm5lbCAqLworCisgICAgICAvKiBJZiBmdW5jdGlvbiBpcyBmcmFtZWxlc3MsIHRoZW4gd2UgbmVlZCB0byBkbyBpdCB0aGUgaGFyZCB3YXkuICBJCisJIHN0cm9uZ2x5IHN1c3BlY3QgdGhhdCBmcmFtZWxlc3MgYWx3YXlzIG1lYW5zIHByb2xvZ3VlbGVzcy4uLiAqLworICAgICAgaWYgKFBST0NfRlJBTUVfUkVHIChwcm9jX2Rlc2MpID09IFNQX1JFR05VTQorCSAgJiYgUFJPQ19GUkFNRV9PRkZTRVQgKHByb2NfZGVzYykgPT0gMCkKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKCFmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gKHBjLCBOVUxMLCAmZnVuY19hZGRyLCAmZnVuY19lbmQpKQorICAgIHJldHVybiAwOwkJCS8qIFVua25vd24gKi8KKworICBzYWwgPSBmaW5kX3BjX2xpbmUgKGZ1bmNfYWRkciwgMCk7CisKKyAgaWYgKHNhbC5lbmQgPCBmdW5jX2VuZCkKKyAgICByZXR1cm4gc2FsLmVuZDsKKworICAvKiBUaGUgbGluZSBhZnRlciB0aGUgcHJvbG9ndWUgaXMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uICBJbiB0aGlzCisgICAgIGNhc2UsIHRlbGwgdGhlIGNhbGxlciB0byBmaW5kIHRoZSBwcm9sb2d1ZSB0aGUgaGFyZCB3YXkuICAqLworCisgIHJldHVybiAwOworfQorCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgd2UgKm1pZ2h0KiBiZSBpbiBhIGZ1bmN0aW9uIHByb2xvZ3VlLiAgUmV0dXJuIHplcm8gaWYgd2UKKyAgIGFyZSBkZWZpbml0aXZlbHkgKm5vdCogaW4gYSBmdW5jdGlvbiBwcm9sb2d1ZS4gICovCisKK3N0YXRpYyBpbnQKK2FscGhhX2luX3Byb2xvZ3VlIChwYywgcHJvY19kZXNjKQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIGFscGhhX2V4dHJhX2Z1bmNfaW5mb190IHByb2NfZGVzYzsKK3sKKyAgQ09SRV9BRERSIGFmdGVyX3Byb2xvZ3VlX3BjOworCisgIGFmdGVyX3Byb2xvZ3VlX3BjID0gYWZ0ZXJfcHJvbG9ndWUgKHBjLCBwcm9jX2Rlc2MpOworCisgIGlmIChhZnRlcl9wcm9sb2d1ZV9wYyA9PSAwCisgICAgICB8fCBwYyA8IGFmdGVyX3Byb2xvZ3VlX3BjKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhbHBoYV9leHRyYV9mdW5jX2luZm9fdAorZmluZF9wcm9jX2Rlc2MgKHBjLCBuZXh0X2ZyYW1lKQorICAgIENPUkVfQUREUiBwYzsKKyAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqbmV4dF9mcmFtZTsKK3sKKyAgYWxwaGFfZXh0cmFfZnVuY19pbmZvX3QgcHJvY19kZXNjOworICBzdHJ1Y3QgYmxvY2sgKmI7CisgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgQ09SRV9BRERSIHN0YXJ0YWRkcjsKKworICAvKiBUcnkgdG8gZ2V0IHRoZSBwcm9jX2Rlc2MgZnJvbSB0aGUgbGlua2VkIGNhbGwgZHVtbXkgcHJvY19kZXNjcworICAgICBpZiB0aGUgcGMgaXMgaW4gdGhlIGNhbGwgZHVtbXkuCisgICAgIFRoaXMgaXMgaGFpcnkuIEluIHRoZSBjYXNlIG9mIG5lc3RlZCBkdW1teSBjYWxscyB3ZSBoYXZlIHRvIGZpbmQgdGhlCisgICAgIHJpZ2h0IHByb2NfZGVzYywgYnV0IHdlIG1pZ2h0IG5vdCB5ZXQga25vdyB0aGUgZnJhbWUgZm9yIHRoZSBkdW1teQorICAgICBhcyBpdCB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGUgcHJvY19kZXNjIHdlIGFyZSBzZWFyY2hpbmcgZm9yLgorICAgICBTbyB3ZSBoYXZlIHRvIGZpbmQgdGhlIHByb2NfZGVzYyB3aG9zZSBmcmFtZSBpcyBjbG9zZXN0IHRvIHRoZSBjdXJyZW50CisgICAgIHN0YWNrIHBvaW50ZXIuICAqLworCisgIGlmIChQQ19JTl9DQUxMX0RVTU1ZIChwYywgMCwgMCkpCisgICAgeworICAgICAgc3RydWN0IGxpbmtlZF9wcm9jX2luZm8gKmxpbms7CisgICAgICBDT1JFX0FERFIgc3AgPSByZWFkX25leHRfZnJhbWVfcmVnIChuZXh0X2ZyYW1lLCBTUF9SRUdOVU0pOworICAgICAgYWxwaGFfZXh0cmFfZnVuY19pbmZvX3QgZm91bmRfcHJvY19kZXNjID0gTlVMTDsKKyAgICAgIGxvbmcgbWluX2Rpc3RhbmNlID0gTE9OR19NQVg7CisKKyAgICAgIGZvciAobGluayA9IGxpbmtlZF9wcm9jX2Rlc2NfdGFibGU7IGxpbms7IGxpbmsgPSBsaW5rLT5uZXh0KQorCXsKKwkgIGxvbmcgZGlzdGFuY2UgPSAoQ09SRV9BRERSKSBQUk9DX0RVTU1ZX0ZSQU1FICgmbGluay0+aW5mbykgLSBzcDsKKwkgIGlmIChkaXN0YW5jZSA+IDAgJiYgZGlzdGFuY2UgPCBtaW5fZGlzdGFuY2UpCisJICAgIHsKKwkgICAgICBtaW5fZGlzdGFuY2UgPSBkaXN0YW5jZTsKKwkgICAgICBmb3VuZF9wcm9jX2Rlc2MgPSAmbGluay0+aW5mbzsKKwkgICAgfQorCX0KKyAgICAgIGlmIChmb3VuZF9wcm9jX2Rlc2MgIT0gTlVMTCkKKwlyZXR1cm4gZm91bmRfcHJvY19kZXNjOworICAgIH0KKworICBiID0gYmxvY2tfZm9yX3BjKHBjKTsKKworICBmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gKHBjLCBOVUxMLCAmc3RhcnRhZGRyLCBOVUxMKTsKKyAgaWYgKGIgPT0gTlVMTCkKKyAgICBzeW0gPSBOVUxMOworICBlbHNlCisgICAgeworICAgICAgaWYgKHN0YXJ0YWRkciA+IEJMT0NLX1NUQVJUIChiKSkKKwkvKiBUaGlzIGlzIHRoZSAicGF0aG9sb2dpY2FsIiBjYXNlIHJlZmVycmVkIHRvIGluIGEgY29tbWVudCBpbgorCSAgIHByaW50X2ZyYW1lX2luZm8uICBJdCBtaWdodCBiZSBiZXR0ZXIgdG8gbW92ZSB0aGlzIGNoZWNrIGludG8KKwkgICBzeW1ib2wgcmVhZGluZy4gICovCisJc3ltID0gTlVMTDsKKyAgICAgIGVsc2UKKwlzeW0gPSBsb29rdXBfc3ltYm9sIChNSVBTX0VGSV9TWU1CT0xfTkFNRSwgYiwgTEFCRUxfTkFNRVNQQUNFLAorCQkJICAgICAwLCBOVUxMKTsKKyAgICB9CisKKyAgLyogSWYgd2UgbmV2ZXIgZm91bmQgYSBQRFIgZm9yIHRoaXMgZnVuY3Rpb24gaW4gc3ltYm9sIHJlYWRpbmcsIHRoZW4KKyAgICAgZXhhbWluZSBwcm9sb2d1ZXMgdG8gZmluZCB0aGUgaW5mb3JtYXRpb24uICAqLworICBpZiAoc3ltICYmICgobWlwc19leHRyYV9mdW5jX2luZm9fdCkgU1lNQk9MX1ZBTFVFIChzeW0pKS0+cGRyLmZyYW1lcmVnID09IC0xKQorICAgIHN5bSA9IE5VTEw7CisKKyAgaWYgKHN5bSkKKyAgICB7CisJLyogSUYgdGhpcyBpcyB0aGUgdG9wbW9zdCBmcmFtZSBBTkQKKwkgKiAodGhpcyBwcm9jIGRvZXMgbm90IGhhdmUgZGVidWdnaW5nIGluZm9ybWF0aW9uIE9SCisJICogdGhlIFBDIGlzIGluIHRoZSBwcm9jZWR1cmUgcHJvbG9ndWUpCisJICogVEhFTiBjcmVhdGUgYSAiaGV1cmlzdGljIiBwcm9jX2Rlc2MgKGJ5IGFuYWx5emluZworCSAqIHRoZSBhY3R1YWwgY29kZSkgdG8gcmVwbGFjZSB0aGUgIm9mZmljaWFsIiBwcm9jX2Rlc2MuCisJICovCisJcHJvY19kZXNjID0gKGFscGhhX2V4dHJhX2Z1bmNfaW5mb190KVNZTUJPTF9WQUxVRShzeW0pOworCWlmIChuZXh0X2ZyYW1lID09IE5VTEwpCisJICB7CisJICAgIGlmIChQUk9DX0RFU0NfSVNfRFVNTVkgKHByb2NfZGVzYykgfHwgYWxwaGFfaW5fcHJvbG9ndWUgKHBjLCBwcm9jX2Rlc2MpKQorCSAgICAgIHsKKwkJYWxwaGFfZXh0cmFfZnVuY19pbmZvX3QgZm91bmRfaGV1cmlzdGljID0KKwkJICBoZXVyaXN0aWNfcHJvY19kZXNjIChQUk9DX0xPV19BRERSIChwcm9jX2Rlc2MpLAorCQkJCSAgICAgICBwYywgbmV4dF9mcmFtZSk7CisJCWlmIChmb3VuZF9oZXVyaXN0aWMpCisJCSAgeworCQkgICAgUFJPQ19MT0NBTE9GRiAoZm91bmRfaGV1cmlzdGljKSA9CisJCSAgICAgIFBST0NfTE9DQUxPRkYgKHByb2NfZGVzYyk7CisJCSAgICBQUk9DX1BDX1JFRyAoZm91bmRfaGV1cmlzdGljKSA9IFBST0NfUENfUkVHIChwcm9jX2Rlc2MpOworCQkgICAgcHJvY19kZXNjID0gZm91bmRfaGV1cmlzdGljOworCQkgIH0KKwkgICAgICB9CisJICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbG9uZyBvZmZzZXQ7CisKKyAgICAgIC8qIElzIGxpbmtlZF9wcm9jX2Rlc2NfdGFibGUgcmVhbGx5IG5lY2Vzc2FyeT8gIEl0IG9ubHkgc2VlbXMgdG8gYmUgdXNlZAorCSBieSBwcm9jZWR1cmUgY2FsbCBkdW1teXMuICBIb3dldmVyLCB0aGUgcHJvY2VkdXJlcyBiZWluZyBjYWxsZWQgb3VnaHQKKwkgdG8gaGF2ZSB0aGVpciBvd24gcHJvY19kZXNjcywgYW5kIGV2ZW4gaWYgdGhleSBkb24ndCwKKwkgaGV1cmlzdGljX3Byb2NfZGVzYyBrbm93cyBob3cgdG8gY3JlYXRlIHRoZW0hICovCisKKyAgICAgIHJlZ2lzdGVyIHN0cnVjdCBsaW5rZWRfcHJvY19pbmZvICpsaW5rOworICAgICAgZm9yIChsaW5rID0gbGlua2VkX3Byb2NfZGVzY190YWJsZTsgbGluazsgbGluayA9IGxpbmstPm5leHQpCisJICBpZiAoUFJPQ19MT1dfQUREUigmbGluay0+aW5mbykgPD0gcGMKKwkgICAgICAmJiBQUk9DX0hJR0hfQUREUigmbGluay0+aW5mbykgPiBwYykKKwkgICAgICByZXR1cm4gJmxpbmstPmluZm87CisKKyAgICAgIC8qIElmIFBDIGlzIGluc2lkZSBhIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBzaWd0cmFtcCBoYW5kbGVyLAorCSBjcmVhdGUgYW5kIHB1c2ggYSBwcm9jZWR1cmUgZGVzY3JpcHRvciBmb3IgdGhhdCBjb2RlOiAqLworICAgICAgb2Zmc2V0ID0gRFlOQU1JQ19TSUdUUkFNUF9PRkZTRVQgKHBjKTsKKyAgICAgIGlmIChvZmZzZXQgPj0gMCkKKwlyZXR1cm4gcHVzaF9zaWd0cmFtcF9kZXNjIChwYyAtIG9mZnNldCk7CisKKyAgICAgIC8qIElmIGhldXJpc3RpY19mZW5jZV9wb3N0IGlzIG5vbi16ZXJvLCBkZXRlcm1pbmUgdGhlIHByb2NlZHVyZQorCSBzdGFydCBhZGRyZXNzIGJ5IGV4YW1pbmluZyB0aGUgaW5zdHJ1Y3Rpb25zLgorCSBUaGlzIGFsbG93cyB1cyB0byBmaW5kIHRoZSBzdGFydCBhZGRyZXNzIG9mIHN0YXRpYyBmdW5jdGlvbnMgd2hpY2gKKwkgaGF2ZSBubyBzeW1ib2xpYyBpbmZvcm1hdGlvbiwgYXMgc3RhcnRhZGRyIHdvdWxkIGhhdmUgYmVlbiBzZXQgdG8KKwkgdGhlIHByZWNlZGluZyBnbG9iYWwgZnVuY3Rpb24gc3RhcnQgYWRkcmVzcyBieSB0aGUKKwkgZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIGNhbGwgYWJvdmUuICAqLworICAgICAgaWYgKHN0YXJ0YWRkciA9PSAwIHx8IGhldXJpc3RpY19mZW5jZV9wb3N0ICE9IDApCisJc3RhcnRhZGRyID0gaGV1cmlzdGljX3Byb2Nfc3RhcnQgKHBjKTsKKworICAgICAgcHJvY19kZXNjID0KKwloZXVyaXN0aWNfcHJvY19kZXNjIChzdGFydGFkZHIsIHBjLCBuZXh0X2ZyYW1lKTsKKyAgICB9CisgIHJldHVybiBwcm9jX2Rlc2M7Cit9CisKK2FscGhhX2V4dHJhX2Z1bmNfaW5mb190IGNhY2hlZF9wcm9jX2Rlc2M7CisKK0NPUkVfQUREUgorYWxwaGFfZnJhbWVfY2hhaW4oZnJhbWUpCisgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworeworICAgIGFscGhhX2V4dHJhX2Z1bmNfaW5mb190IHByb2NfZGVzYzsKKyAgICBDT1JFX0FERFIgc2F2ZWRfcGMgPSBGUkFNRV9TQVZFRF9QQyhmcmFtZSk7CisKKyAgICBpZiAoc2F2ZWRfcGMgPT0gMCB8fCBpbnNpZGVfZW50cnlfZmlsZSAoc2F2ZWRfcGMpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBwcm9jX2Rlc2MgPSBmaW5kX3Byb2NfZGVzYyhzYXZlZF9wYywgZnJhbWUpOworICAgIGlmICghcHJvY19kZXNjKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBjYWNoZWRfcHJvY19kZXNjID0gcHJvY19kZXNjOworCisgICAgLyogRmV0Y2ggdGhlIGZyYW1lIHBvaW50ZXIgZm9yIGEgZHVtbXkgZnJhbWUgZnJvbSB0aGUgcHJvY2VkdXJlCisgICAgICAgZGVzY3JpcHRvci4gICovCisgICAgaWYgKFBST0NfREVTQ19JU19EVU1NWShwcm9jX2Rlc2MpKQorICAgICAgcmV0dXJuIChDT1JFX0FERFIpIFBST0NfRFVNTVlfRlJBTUUocHJvY19kZXNjKTsKKworICAgIC8qIElmIG5vIGZyYW1lIHBvaW50ZXIgYW5kIGZyYW1lIHNpemUgaXMgemVybywgd2UgbXVzdCBiZSBhdCBlbmQKKyAgICAgICBvZiBzdGFjayAob3Igb3RoZXJ3aXNlIGhvc2VkKS4gIElmIHdlIGRvbid0IGNoZWNrIGZyYW1lIHNpemUsCisgICAgICAgd2UgbG9vcCBmb3JldmVyIGlmIHdlIHNlZSBhIHplcm8gc2l6ZSBmcmFtZS4gICovCisgICAgaWYgKFBST0NfRlJBTUVfUkVHIChwcm9jX2Rlc2MpID09IFNQX1JFR05VTQorCSYmIFBST0NfRlJBTUVfT0ZGU0VUIChwcm9jX2Rlc2MpID09IDAKKwkvKiBUaGUgcHJldmlvdXMgZnJhbWUgZnJvbSBhIHNpZ3RyYW1wIGZyYW1lIG1pZ2h0IGJlIGZyYW1lbGVzcworCSAgIGFuZCBoYXZlIGZyYW1lIHNpemUgemVyby4gICovCisJJiYgIWZyYW1lLT5zaWduYWxfaGFuZGxlcl9jYWxsZXIpCisgICAgICByZXR1cm4gRlJBTUVfUEFTVF9TSUdUUkFNUF9GUkFNRSAoZnJhbWUsIHNhdmVkX3BjKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gcmVhZF9uZXh0X2ZyYW1lX3JlZyhmcmFtZSwgUFJPQ19GUkFNRV9SRUcocHJvY19kZXNjKSkKKwkgICAgICsgUFJPQ19GUkFNRV9PRkZTRVQocHJvY19kZXNjKTsKK30KKwordm9pZAoraW5pdF9leHRyYV9mcmFtZV9pbmZvIChmcmFtZSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworeworICAvKiBVc2UgcHJvY19kZXNjIGNhbGN1bGF0ZWQgaW4gZnJhbWVfY2hhaW4gKi8KKyAgYWxwaGFfZXh0cmFfZnVuY19pbmZvX3QgcHJvY19kZXNjID0KKyAgICBmcmFtZS0+bmV4dCA/IGNhY2hlZF9wcm9jX2Rlc2MgOiBmaW5kX3Byb2NfZGVzYyhmcmFtZS0+cGMsIGZyYW1lLT5uZXh0KTsKKworICBmcmFtZS0+c2F2ZWRfcmVncyA9IE5VTEw7CisgIGZyYW1lLT5sb2NhbG9mZiA9IDA7CisgIGZyYW1lLT5wY19yZWcgPSBSQV9SRUdOVU07CisgIGZyYW1lLT5wcm9jX2Rlc2MgPSBwcm9jX2Rlc2MgPT0gJnRlbXBfcHJvY19kZXNjID8gMCA6IHByb2NfZGVzYzsKKyAgaWYgKHByb2NfZGVzYykKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGxvY2FscyBvZmZzZXQgYW5kIHRoZSBzYXZlZCBwYyByZWdpc3RlciBmcm9tIHRoZQorCSBwcm9jZWR1cmUgZGVzY3JpcHRvciwgdGhleSBhcmUgdmFsaWQgZXZlbiBpZiB3ZSBhcmUgaW4gdGhlCisJIG1pZGRsZSBvZiB0aGUgcHJvbG9ndWUuICAqLworICAgICAgZnJhbWUtPmxvY2Fsb2ZmID0gUFJPQ19MT0NBTE9GRihwcm9jX2Rlc2MpOworICAgICAgZnJhbWUtPnBjX3JlZyA9IFBST0NfUENfUkVHKHByb2NfZGVzYyk7CisKKyAgICAgIC8qIEZpeHVwIGZyYW1lLXBvaW50ZXIgLSBvbmx5IG5lZWRlZCBmb3IgdG9wIGZyYW1lICovCisKKyAgICAgIC8qIEZldGNoIHRoZSBmcmFtZSBwb2ludGVyIGZvciBhIGR1bW15IGZyYW1lIGZyb20gdGhlIHByb2NlZHVyZQorCSBkZXNjcmlwdG9yLiAgKi8KKyAgICAgIGlmIChQUk9DX0RFU0NfSVNfRFVNTVkocHJvY19kZXNjKSkKKwlmcmFtZS0+ZnJhbWUgPSAoQ09SRV9BRERSKSBQUk9DX0RVTU1ZX0ZSQU1FKHByb2NfZGVzYyk7CisKKyAgICAgIC8qIFRoaXMgbWF5IG5vdCBiZSBxdWl0ZSByaWdodCwgaWYgcHJvYyBoYXMgYSByZWFsIGZyYW1lIHJlZ2lzdGVyLgorCSBHZXQgdGhlIHZhbHVlIG9mIHRoZSBmcmFtZSByZWxhdGl2ZSBzcCwgcHJvY2VkdXJlIG1pZ2h0IGhhdmUgYmVlbgorCSBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCBhdCBpdCdzIHZlcnkgc3RhcnQuICAqLworICAgICAgZWxzZSBpZiAoZnJhbWUtPnBjID09IFBST0NfTE9XX0FERFIgKHByb2NfZGVzYykKKwkgICAgICAgJiYgIVBST0NfREVTQ19JU19EWU5fU0lHVFJBTVAgKHByb2NfZGVzYykpCisJZnJhbWUtPmZyYW1lID0gcmVhZF9uZXh0X2ZyYW1lX3JlZyAoZnJhbWUtPm5leHQsIFNQX1JFR05VTSk7CisgICAgICBlbHNlCisJZnJhbWUtPmZyYW1lID0gcmVhZF9uZXh0X2ZyYW1lX3JlZyAoZnJhbWUtPm5leHQsIFBST0NfRlJBTUVfUkVHIChwcm9jX2Rlc2MpKQorCSAgKyBQUk9DX0ZSQU1FX09GRlNFVCAocHJvY19kZXNjKTsKKworICAgICAgaWYgKHByb2NfZGVzYyA9PSAmdGVtcF9wcm9jX2Rlc2MpCisJeworCSAgY2hhciAqbmFtZTsKKworCSAgLyogRG8gbm90IHNldCB0aGUgc2F2ZWQgcmVnaXN0ZXJzIGZvciBhIHNpZ3RyYW1wIGZyYW1lLAorCSAgICAgYWxwaGFfZmluZF9zYXZlZF9yZWdpc3RlcnMgd2lsbCBkbyB0aGF0IGZvciB1cy4KKwkgICAgIFdlIGNhbid0IHVzZSBmcmFtZS0+c2lnbmFsX2hhbmRsZXJfY2FsbGVyLCBpdCBpcyBub3QgeWV0IHNldC4gICovCisJICBmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gKGZyYW1lLT5wYywgJm5hbWUsCisJCQkJICAgIChDT1JFX0FERFIgKilOVUxMLChDT1JFX0FERFIgKilOVUxMKTsKKwkgIGlmICghSU5fU0lHVFJBTVAgKGZyYW1lLT5wYywgbmFtZSkpCisJICAgIHsKKwkgICAgICBmcmFtZS0+c2F2ZWRfcmVncyA9IChDT1JFX0FERFIqKQorCQlmcmFtZV9vYnN0YWNrX2FsbG9jIChTSVpFT0ZfRlJBTUVfU0FWRURfUkVHUyk7CisJICAgICAgbWVtY3B5IChmcmFtZS0+c2F2ZWRfcmVncywgdGVtcF9zYXZlZF9yZWdzLnJlZ3MsIFNJWkVPRl9GUkFNRV9TQVZFRF9SRUdTKTsKKwkgICAgICBmcmFtZS0+c2F2ZWRfcmVnc1tQQ19SRUdOVU1dCisJCT0gZnJhbWUtPnNhdmVkX3JlZ3NbUkFfUkVHTlVNXTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qIEFMUEhBIHN0YWNrIGZyYW1lcyBhcmUgYWxtb3N0IGltcGVuZXRyYWJsZS4gIFdoZW4gZXhlY3V0aW9uIHN0b3BzLAorICAgd2UgYmFzaWNhbGx5IGhhdmUgdG8gbG9vayBhdCBzeW1ib2wgaW5mb3JtYXRpb24gZm9yIHRoZSBmdW5jdGlvbgorICAgdGhhdCB3ZSBzdG9wcGVkIGluLCB3aGljaCB0ZWxscyB1cyAqd2hpY2gqIHJlZ2lzdGVyIChpZiBhbnkpIGlzCisgICB0aGUgYmFzZSBvZiB0aGUgZnJhbWUgcG9pbnRlciwgYW5kIHdoYXQgb2Zmc2V0IGZyb20gdGhhdCByZWdpc3RlcgorICAgdGhlIGZyYW1lIGl0c2VsZiBpcyBhdC4gIAorCisgICBUaGlzIHByZXNlbnRzIGEgcHJvYmxlbSB3aGVuIHRyeWluZyB0byBleGFtaW5lIGEgc3RhY2sgaW4gbWVtb3J5CisgICAodGhhdCBpc24ndCBleGVjdXRpbmcgYXQgdGhlIG1vbWVudCksIHVzaW5nIHRoZSAiZnJhbWUiIGNvbW1hbmQuICBXZQorICAgZG9uJ3QgaGF2ZSBhIFBDLCBub3IgZG8gd2UgaGF2ZSBhbnkgcmVnaXN0ZXJzIGV4Y2VwdCBTUC4KKworICAgVGhpcyByb3V0aW5lIHRha2VzIHR3byBhcmd1bWVudHMsIFNQIGFuZCBQQywgYW5kIHRyaWVzIHRvIG1ha2UgdGhlCisgICBjYWNoZWQgZnJhbWVzIGxvb2sgYXMgaWYgdGhlc2UgdHdvIGFyZ3VtZW50cyBkZWZpbmVkIGEgZnJhbWUgb24gdGhlCisgICBjYWNoZS4gIFRoaXMgYWxsb3dzIHRoZSByZXN0IG9mIGluZm8gZnJhbWUgdG8gZXh0cmFjdCB0aGUgaW1wb3J0YW50CisgICBhcmd1bWVudHMgd2l0aG91dCBkaWZmaWN1bHR5LiAgKi8KKworc3RydWN0IGZyYW1lX2luZm8gKgorc2V0dXBfYXJiaXRyYXJ5X2ZyYW1lIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgQ09SRV9BRERSICphcmd2OworeworICBpZiAoYXJnYyAhPSAyKQorICAgIGVycm9yICgiQUxQSEEgZnJhbWUgc3BlY2lmaWNhdGlvbnMgcmVxdWlyZSB0d28gYXJndW1lbnRzOiBzcCBhbmQgcGMiKTsKKworICByZXR1cm4gY3JlYXRlX25ld19mcmFtZSAoYXJndlswXSwgYXJndlsxXSk7Cit9CisKKy8qIFRoZSBhbHBoYSBwYXNzZXMgdGhlIGZpcnN0IHNpeCBhcmd1bWVudHMgaW4gdGhlIHJlZ2lzdGVycywgdGhlIHJlc3Qgb24KKyAgIHRoZSBzdGFjay4gVGhlIHJlZ2lzdGVyIGFyZ3VtZW50cyBhcmUgZXZlbnR1YWxseSB0cmFuc2ZlcnJlZCB0byB0aGUKKyAgIGFyZ3VtZW50IHRyYW5zZmVyIGFyZWEgaW1tZWRpYXRlbHkgYmVsb3cgdGhlIHN0YWNrIGJ5IHRoZSBjYWxsZWQgZnVuY3Rpb24KKyAgIGFueXdheS4gU28gd2UgYHB1c2gnIGF0IGxlYXN0IHNpeCBhcmd1bWVudHMgb24gdGhlIHN0YWNrLCBgcmVsb2FkJyB0aGUKKyAgIGFyZ3VtZW50IHJlZ2lzdGVycyBhbmQgdGhlbiBhZGp1c3QgdGhlIHN0YWNrIHBvaW50ZXIgdG8gcG9pbnQgcGFzdCB0aGUKKyAgIHNpeHRoIGFyZ3VtZW50LiBUaGlzIGFsZ29yaXRobSBzaW1wbGlmaWVzIHRoZSBwYXNzaW5nIG9mIGEgbGFyZ2Ugc3RydWN0CisgICB3aGljaCBleHRlbmRzIGZyb20gdGhlIHJlZ2lzdGVycyB0byB0aGUgc3RhY2suCisgICBJZiB0aGUgY2FsbGVkIGZ1bmN0aW9uIGlzIHJldHVybmluZyBhIHN0cnVjdHVyZSwgdGhlIGFkZHJlc3Mgb2YgdGhlCisgICBzdHJ1Y3R1cmUgdG8gYmUgcmV0dXJuZWQgaXMgcGFzc2VkIGFzIGEgaGlkZGVuIGZpcnN0IGFyZ3VtZW50LiAgKi8KKworQ09SRV9BRERSCithbHBoYV9wdXNoX2FyZ3VtZW50cyAobmFyZ3MsIGFyZ3MsIHNwLCBzdHJ1Y3RfcmV0dXJuLCBzdHJ1Y3RfYWRkcikKKyAgICAgaW50IG5hcmdzOworICAgICB2YWx1ZV9wdHIgKmFyZ3M7CisgICAgIENPUkVfQUREUiBzcDsKKyAgICAgaW50IHN0cnVjdF9yZXR1cm47CisgICAgIENPUkVfQUREUiBzdHJ1Y3RfYWRkcjsKK3sKKyAgcmVnaXN0ZXIgaTsKKyAgaW50IGFjY3VtdWxhdGVfc2l6ZSA9IHN0cnVjdF9yZXR1cm4gPyA4IDogMDsKKyAgaW50IGFyZ19yZWdzX3NpemUgPSBBTFBIQV9OVU1fQVJHX1JFR1MgKiA4OworICBzdHJ1Y3QgYWxwaGFfYXJnIHsgY2hhciAqY29udGVudHM7IGludCBsZW47IGludCBvZmZzZXQ7IH07CisgIHN0cnVjdCBhbHBoYV9hcmcgKmFscGhhX2FyZ3MgPQorICAgICAgKHN0cnVjdCBhbHBoYV9hcmcqKWFsbG9jYSAobmFyZ3MgKiBzaXplb2YgKHN0cnVjdCBhbHBoYV9hcmcpKTsKKyAgcmVnaXN0ZXIgc3RydWN0IGFscGhhX2FyZyAqbV9hcmc7CisgIGNoYXIgcmF3X2J1ZmZlcltzaXplb2YgKENPUkVfQUREUildOworICBpbnQgcmVxdWlyZWRfYXJnX3JlZ3M7CisKKyAgZm9yIChpID0gMCwgbV9hcmcgPSBhbHBoYV9hcmdzOyBpIDwgbmFyZ3M7IGkrKywgbV9hcmcrKykKKyAgICB7CisgICAgICB2YWx1ZV9wdHIgYXJnID0gYXJnc1tpXTsKKyAgICAgIHN0cnVjdCB0eXBlICphcmdfdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZykpOworICAgICAgLyogQ2FzdCBhcmd1bWVudCB0byBsb25nIGlmIG5lY2Vzc2FyeSBhcyB0aGUgY29tcGlsZXIgZG9lcyBpdCB0b28uICAqLworICAgICAgc3dpdGNoIChUWVBFX0NPREUgKGFyZ190eXBlKSkKKwl7CisJY2FzZSBUWVBFX0NPREVfSU5UOgorCWNhc2UgVFlQRV9DT0RFX0JPT0w6CisJY2FzZSBUWVBFX0NPREVfQ0hBUjoKKwljYXNlIFRZUEVfQ09ERV9SQU5HRToKKwljYXNlIFRZUEVfQ09ERV9FTlVNOgorCSAgaWYgKFRZUEVfTEVOR1RIIChhcmdfdHlwZSkgPCBUWVBFX0xFTkdUSCAoYnVpbHRpbl90eXBlX2xvbmcpKQorCSAgICB7CisJICAgICAgYXJnX3R5cGUgPSBidWlsdGluX3R5cGVfbG9uZzsKKwkgICAgICBhcmcgPSB2YWx1ZV9jYXN0IChhcmdfdHlwZSwgYXJnKTsKKwkgICAgfQorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGJyZWFrOworCX0KKyAgICAgIG1fYXJnLT5sZW4gPSBUWVBFX0xFTkdUSCAoYXJnX3R5cGUpOworICAgICAgbV9hcmctPm9mZnNldCA9IGFjY3VtdWxhdGVfc2l6ZTsKKyAgICAgIGFjY3VtdWxhdGVfc2l6ZSA9IChhY2N1bXVsYXRlX3NpemUgKyBtX2FyZy0+bGVuICsgNykgJiB+NzsKKyAgICAgIG1fYXJnLT5jb250ZW50cyA9IFZBTFVFX0NPTlRFTlRTKGFyZyk7CisgICAgfQorCisgIC8qIERldGVybWluZSByZXF1aXJlZCBhcmd1bWVudCByZWdpc3RlciBsb2FkcywgbG9hZGluZyBhbiBhcmd1bWVudCByZWdpc3RlcgorICAgICBpcyBleHBlbnNpdmUgYXMgaXQgdXNlcyB0aHJlZSBwdHJhY2UgY2FsbHMuICAqLworICByZXF1aXJlZF9hcmdfcmVncyA9IGFjY3VtdWxhdGVfc2l6ZSAvIDg7CisgIGlmIChyZXF1aXJlZF9hcmdfcmVncyA+IEFMUEhBX05VTV9BUkdfUkVHUykKKyAgICByZXF1aXJlZF9hcmdfcmVncyA9IEFMUEhBX05VTV9BUkdfUkVHUzsKKworICAvKiBNYWtlIHJvb20gZm9yIHRoZSBhcmd1bWVudHMgb24gdGhlIHN0YWNrLiAgKi8KKyAgaWYgKGFjY3VtdWxhdGVfc2l6ZSA8IGFyZ19yZWdzX3NpemUpCisgICAgYWNjdW11bGF0ZV9zaXplID0gYXJnX3JlZ3Nfc2l6ZTsgCisgIHNwIC09IGFjY3VtdWxhdGVfc2l6ZTsKKworICAvKiBLZWVwIHNwIGFsaWduZWQgdG8gYSBtdWx0aXBsZSBvZiAxNiBhcyB0aGUgY29tcGlsZXIgZG9lcyBpdCB0b28uICAqLworICBzcCAmPSB+MTU7CisKKyAgLyogYFB1c2gnIGFyZ3VtZW50cyBvbiB0aGUgc3RhY2suICAqLworICBmb3IgKGkgPSBuYXJnczsgbV9hcmctLSwgLS1pID49IDA7ICkKKyAgICB3cml0ZV9tZW1vcnkoc3AgKyBtX2FyZy0+b2Zmc2V0LCBtX2FyZy0+Y29udGVudHMsIG1fYXJnLT5sZW4pOworICBpZiAoc3RydWN0X3JldHVybikKKyAgICB7CisgICAgICBzdG9yZV9hZGRyZXNzIChyYXdfYnVmZmVyLCBzaXplb2YgKENPUkVfQUREUiksIHN0cnVjdF9hZGRyKTsKKyAgICAgIHdyaXRlX21lbW9yeSAoc3AsIHJhd19idWZmZXIsIHNpemVvZiAoQ09SRV9BRERSKSk7CisgICAgfQorCisgIC8qIExvYWQgdGhlIGFyZ3VtZW50IHJlZ2lzdGVycy4gICovCisgIGZvciAoaSA9IDA7IGkgPCByZXF1aXJlZF9hcmdfcmVnczsgaSsrKQorICAgIHsKKyAgICAgIExPTkdFU1QgdmFsOworCisgICAgICB2YWwgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChzcCArIGkgKiA4LCA4KTsKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChBMF9SRUdOVU0gKyBpLCB2YWwpOworICAgICAgd3JpdGVfcmVnaXN0ZXIgKEZQQTBfUkVHTlVNICsgaSwgdmFsKTsKKyAgICB9CisKKyAgcmV0dXJuIHNwICsgYXJnX3JlZ3Nfc2l6ZTsKK30KKwordm9pZAorYWxwaGFfcHVzaF9kdW1teV9mcmFtZSgpCit7CisgIGludCBpcmVnOworICBzdHJ1Y3QgbGlua2VkX3Byb2NfaW5mbyAqbGluazsKKyAgYWxwaGFfZXh0cmFfZnVuY19pbmZvX3QgcHJvY19kZXNjOworICBDT1JFX0FERFIgc3AgPSByZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pOworICBDT1JFX0FERFIgc2F2ZV9hZGRyZXNzOworICBjaGFyIHJhd19idWZmZXJbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKyAgdW5zaWduZWQgbG9uZyBtYXNrOworCisgIGxpbmsgPSAoc3RydWN0IGxpbmtlZF9wcm9jX2luZm8gKikgeG1hbGxvYyhzaXplb2YgKHN0cnVjdCBsaW5rZWRfcHJvY19pbmZvKSk7CisgIGxpbmstPm5leHQgPSBsaW5rZWRfcHJvY19kZXNjX3RhYmxlOworICBsaW5rZWRfcHJvY19kZXNjX3RhYmxlID0gbGluazsKKyAKKyAgcHJvY19kZXNjID0gJmxpbmstPmluZm87CisKKyAgLyoKKyAgICogVGhlIHJlZ2lzdGVycyB3ZSBtdXN0IHNhdmUgYXJlIGFsbCB0aG9zZSBub3QgcHJlc2VydmVkIGFjcm9zcworICAgKiBwcm9jZWR1cmUgY2FsbHMuCisgICAqIEluIGFkZGl0aW9uLCB3ZSBtdXN0IHNhdmUgdGhlIFBDIGFuZCBSQS4KKyAgICoKKyAgICogRHVtbXkgZnJhbWUgbGF5b3V0OgorICAgKiAgKGhpZ2ggbWVtb3J5KQorICAgKiAJU2F2ZWQgUEMKKyAgICogICAgU2F2ZWQgRjMwCisgICAqICAgIC4uLgorICAgKiAgICBTYXZlZCBGMAorICAgKglTYXZlZCBSMjkKKyAgICoJLi4uCisgICAqCVNhdmVkIFIwCisgICAqCVNhdmVkIFIyNiAoUkEpCisgICAqCVBhcmFtZXRlciBidWlsZCBhcmVhCisgICAqICAobG93IG1lbW9yeSkKKyAgICovCisKKy8qIE1BU0soaSxqKSA9PSAoMTw8aSkgKyAoMTw8KGkrMSkpICsgLi4uICsgKDE8PGopKS4gQXNzdW1lIGk8PWo8MzEuICovCisjZGVmaW5lIE1BU0soaSxqKSAoKCgoTE9OR0VTVCkxIDw8ICgoaikrMSkpIC0gMSkgXiAoKChMT05HRVNUKTEgPDwgKGkpKSAtIDEpKQorI2RlZmluZSBHRU5fUkVHX1NBVkVfTUFTSyAoTUFTSygwLDgpIHwgTUFTSygxNiwyOSkpCisjZGVmaW5lIEdFTl9SRUdfU0FWRV9DT1VOVCAyNAorI2RlZmluZSBGTE9BVF9SRUdfU0FWRV9NQVNLIChNQVNLKDAsMSkgfCBNQVNLKDEwLDMwKSkKKyNkZWZpbmUgRkxPQVRfUkVHX1NBVkVfQ09VTlQgMjMKKyAgLyogVGhlIHNwZWNpYWwgcmVnaXN0ZXIgaXMgdGhlIFBDIGFzIHdlIGhhdmUgbm8gYml0IGZvciBpdCBpbiB0aGUgc2F2ZSBtYXNrcy4KKyAgICAgYWxwaGFfZnJhbWVfc2F2ZWRfcGMga25vd3Mgd2hlcmUgdGhlIHBjIGlzIHNhdmVkIGluIGEgZHVtbXkgZnJhbWUuICAqLworI2RlZmluZSBTUEVDSUFMX1JFR19TQVZFX0NPVU5UIDEKKworICBQUk9DX1JFR19NQVNLKHByb2NfZGVzYykgPSBHRU5fUkVHX1NBVkVfTUFTSzsKKyAgUFJPQ19GUkVHX01BU0socHJvY19kZXNjKSA9IEZMT0FUX1JFR19TQVZFX01BU0s7CisgIC8qIFBST0NfUkVHX09GRlNFVCBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlIGR1bW15IGZyYW1lIHRvIHRoZSBzYXZlZCBSQSwKKyAgICAgYnV0IGtlZXAgU1AgYWxpZ25lZCB0byBhIG11bHRpcGxlIG9mIDE2LiAgKi8KKyAgUFJPQ19SRUdfT0ZGU0VUKHByb2NfZGVzYykgPQorICAgIC0gKCg4ICogKFNQRUNJQUxfUkVHX1NBVkVfQ09VTlQKKwkgICAgKyBHRU5fUkVHX1NBVkVfQ09VTlQKKwkgICAgKyBGTE9BVF9SRUdfU0FWRV9DT1VOVCkKKwkrIDE1KSAmIH4xNSk7CisgIFBST0NfRlJFR19PRkZTRVQocHJvY19kZXNjKSA9CisgICAgUFJPQ19SRUdfT0ZGU0VUKHByb2NfZGVzYykgKyA4ICogR0VOX1JFR19TQVZFX0NPVU5UOworCisgIC8qIFNhdmUgZ2VuZXJhbCByZWdpc3RlcnMuCisgICAgIFRoZSByZXR1cm4gYWRkcmVzcyByZWdpc3RlciBpcyB0aGUgZmlyc3Qgc2F2ZWQgcmVnaXN0ZXIsIGFsbCBvdGhlcgorICAgICByZWdpc3RlcnMgZm9sbG93IGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAgVGhlIFBDIGlzIHNhdmVkIGltbWVkaWF0ZWx5IGJlbG93IHRoZSBTUC4gICovCisgIHNhdmVfYWRkcmVzcyA9IHNwICsgUFJPQ19SRUdfT0ZGU0VUKHByb2NfZGVzYyk7CisgIHN0b3JlX2FkZHJlc3MgKHJhd19idWZmZXIsIDgsIHJlYWRfcmVnaXN0ZXIgKFJBX1JFR05VTSkpOworICB3cml0ZV9tZW1vcnkgKHNhdmVfYWRkcmVzcywgcmF3X2J1ZmZlciwgOCk7CisgIHNhdmVfYWRkcmVzcyArPSA4OworICBtYXNrID0gUFJPQ19SRUdfTUFTSyhwcm9jX2Rlc2MpICYgMHhmZmZmZmZmZkw7CisgIGZvciAoaXJlZyA9IDA7IG1hc2s7IGlyZWcrKywgbWFzayA+Pj0gMSkKKyAgICBpZiAobWFzayAmIDEpCisgICAgICB7CisJaWYgKGlyZWcgPT0gUkFfUkVHTlVNKQorCSAgY29udGludWU7CisJc3RvcmVfYWRkcmVzcyAocmF3X2J1ZmZlciwgOCwgcmVhZF9yZWdpc3RlciAoaXJlZykpOworCXdyaXRlX21lbW9yeSAoc2F2ZV9hZGRyZXNzLCByYXdfYnVmZmVyLCA4KTsKKwlzYXZlX2FkZHJlc3MgKz0gODsKKyAgICAgIH0KKworICBzdG9yZV9hZGRyZXNzIChyYXdfYnVmZmVyLCA4LCByZWFkX3JlZ2lzdGVyIChQQ19SRUdOVU0pKTsKKyAgd3JpdGVfbWVtb3J5IChzcCAtIDgsIHJhd19idWZmZXIsIDgpOworCisgIC8qIFNhdmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLiAgKi8KKyAgc2F2ZV9hZGRyZXNzID0gc3AgKyBQUk9DX0ZSRUdfT0ZGU0VUKHByb2NfZGVzYyk7CisgIG1hc2sgPSBQUk9DX0ZSRUdfTUFTSyhwcm9jX2Rlc2MpICYgMHhmZmZmZmZmZkw7CisgIGZvciAoaXJlZyA9IDA7IG1hc2s7IGlyZWcrKywgbWFzayA+Pj0gMSkKKyAgICBpZiAobWFzayAmIDEpCisgICAgICB7CisJc3RvcmVfYWRkcmVzcyAocmF3X2J1ZmZlciwgOCwgcmVhZF9yZWdpc3RlciAoaXJlZyArIEZQMF9SRUdOVU0pKTsKKwl3cml0ZV9tZW1vcnkgKHNhdmVfYWRkcmVzcywgcmF3X2J1ZmZlciwgOCk7CisJc2F2ZV9hZGRyZXNzICs9IDg7CisgICAgICB9CisKKyAgLyogU2V0IGFuZCBzYXZlIHRoZSBmcmFtZSBhZGRyZXNzIGZvciB0aGUgZHVtbXkuICAKKyAgICAgVGhpcyBpcyB0cmlja3kuIFRoZSBvbmx5IHJlZ2lzdGVycyB0aGF0IGFyZSBzdWl0YWJsZSBmb3IgYSBmcmFtZSBzYXZlCisgICAgIGFyZSB0aG9zZSB0aGF0IGFyZSBwcmVzZXJ2ZWQgYWNyb3NzIHByb2NlZHVyZSBjYWxscyAoczAtczYpLiBCdXQgaWYKKyAgICAgYSByZWFkIHN5c3RlbSBjYWxsIGlzIGludGVycnVwdGVkIGFuZCB0aGVuIGEgZHVtbXkgY2FsbCBpcyBtYWRlCisgICAgIChzZWUgdGVzdHN1aXRlL2dkYi50MTcvaW50ZXJydXB0LmV4cCkgdGhlIGR1bW15IGNhbGwgaGFuZ3MgdGlsbCB0aGUgcmVhZAorICAgICBpcyBzYXRpc2ZpZWQuIFRoZW4gaXQgcmV0dXJucyB3aXRoIHRoZSBzMC1zNiByZWdpc3RlcnMgc2V0IHRvIHRoZSB2YWx1ZXMKKyAgICAgb24gZW50cnkgdG8gdGhlIHJlYWQgc3lzdGVtIGNhbGwgYW5kIG91ciBkdW1teSBmcmFtZSBwb2ludGVyIHdvdWxkIGJlCisgICAgIGRlc3Ryb3llZC4gU28gd2Ugc2F2ZSB0aGUgZHVtbXkgZnJhbWUgaW4gdGhlIHByb2NfZGVzYyBhbmQgaGFuZGxlIHRoZQorICAgICByZXRyaWV2YWwgb2YgdGhlIGZyYW1lIHBvaW50ZXIgb2YgYSBkdW1teSBzcGVjaWZpY2FsbHkuIFRoZSBmcmFtZSByZWdpc3RlcgorICAgICBpcyBzZXQgdG8gdGhlIHZpcnR1YWwgZnJhbWUgKHBzZXVkbykgcmVnaXN0ZXIsIGl0J3MgdmFsdWUgd2lsbCBhbHdheXMKKyAgICAgYmUgcmVhZCBhcyB6ZXJvIGFuZCB3aWxsIGhlbHAgdXMgdG8gY2F0Y2ggYW55IGVycm9ycyBpbiB0aGUgZHVtbXkgZnJhbWUKKyAgICAgcmV0cmlldmFsIGNvZGUuICAqLworICBQUk9DX0RVTU1ZX0ZSQU1FKHByb2NfZGVzYykgPSBzcDsKKyAgUFJPQ19GUkFNRV9SRUcocHJvY19kZXNjKSA9IEZQX1JFR05VTTsKKyAgUFJPQ19GUkFNRV9PRkZTRVQocHJvY19kZXNjKSA9IDA7CisgIHNwICs9IFBST0NfUkVHX09GRlNFVChwcm9jX2Rlc2MpOworICB3cml0ZV9yZWdpc3RlciAoU1BfUkVHTlVNLCBzcCk7CisKKyAgUFJPQ19MT1dfQUREUihwcm9jX2Rlc2MpID0gQ0FMTF9EVU1NWV9BRERSRVNTICgpOworICBQUk9DX0hJR0hfQUREUihwcm9jX2Rlc2MpID0gUFJPQ19MT1dfQUREUihwcm9jX2Rlc2MpICsgNDsKKworICBTRVRfUFJPQ19ERVNDX0lTX0RVTU1ZKHByb2NfZGVzYyk7CisgIFBST0NfUENfUkVHKHByb2NfZGVzYykgPSBSQV9SRUdOVU07Cit9CisKK3ZvaWQKK2FscGhhX3BvcF9mcmFtZSgpCit7CisgIHJlZ2lzdGVyIGludCByZWdudW07CisgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZSA9IGdldF9jdXJyZW50X2ZyYW1lICgpOworICBDT1JFX0FERFIgbmV3X3NwID0gZnJhbWUtPmZyYW1lOworCisgIGFscGhhX2V4dHJhX2Z1bmNfaW5mb190IHByb2NfZGVzYyA9IGZyYW1lLT5wcm9jX2Rlc2M7CisKKyAgd3JpdGVfcmVnaXN0ZXIgKFBDX1JFR05VTSwgRlJBTUVfU0FWRURfUEMoZnJhbWUpKTsKKyAgaWYgKGZyYW1lLT5zYXZlZF9yZWdzID09IE5VTEwpCisgICAgYWxwaGFfZmluZF9zYXZlZF9yZWdzIChmcmFtZSk7CisgIGlmIChwcm9jX2Rlc2MpCisgICAgeworICAgICAgZm9yIChyZWdudW0gPSAzMjsgLS1yZWdudW0gPj0gMDsgKQorCWlmIChQUk9DX1JFR19NQVNLKHByb2NfZGVzYykgJiAoMSA8PCByZWdudW0pKQorCSAgd3JpdGVfcmVnaXN0ZXIgKHJlZ251bSwKKwkJCSAgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnJhbWUtPnNhdmVkX3JlZ3NbcmVnbnVtXSwKKwkJCQkJICAgICAgIDgpKTsKKyAgICAgIGZvciAocmVnbnVtID0gMzI7IC0tcmVnbnVtID49IDA7ICkKKwlpZiAoUFJPQ19GUkVHX01BU0socHJvY19kZXNjKSAmICgxIDw8IHJlZ251bSkpCisJICB3cml0ZV9yZWdpc3RlciAocmVnbnVtICsgRlAwX1JFR05VTSwKKwkJCSAgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnJhbWUtPnNhdmVkX3JlZ3NbcmVnbnVtICsgRlAwX1JFR05VTV0sIDgpKTsKKyAgICB9CisgIHdyaXRlX3JlZ2lzdGVyIChTUF9SRUdOVU0sIG5ld19zcCk7CisgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7CisKKyAgaWYgKHByb2NfZGVzYyAmJiAoUFJPQ19ERVNDX0lTX0RVTU1ZKHByb2NfZGVzYykKKwkJICAgIHx8IFBST0NfREVTQ19JU19EWU5fU0lHVFJBTVAgKHByb2NfZGVzYykpKQorICAgIHsKKyAgICAgIHN0cnVjdCBsaW5rZWRfcHJvY19pbmZvICpwaV9wdHIsICpwcmV2X3B0cjsKKworICAgICAgZm9yIChwaV9wdHIgPSBsaW5rZWRfcHJvY19kZXNjX3RhYmxlLCBwcmV2X3B0ciA9IE5VTEw7CisJICAgcGlfcHRyICE9IE5VTEw7CisJICAgcHJldl9wdHIgPSBwaV9wdHIsIHBpX3B0ciA9IHBpX3B0ci0+bmV4dCkKKwl7CisJICBpZiAoJnBpX3B0ci0+aW5mbyA9PSBwcm9jX2Rlc2MpCisJICAgIGJyZWFrOworCX0KKworICAgICAgaWYgKHBpX3B0ciA9PSBOVUxMKQorCWVycm9yICgiQ2FuJ3QgbG9jYXRlIGR1bW15IGV4dHJhIGZyYW1lIGluZm9cbiIpOworCisgICAgICBpZiAocHJldl9wdHIgIT0gTlVMTCkKKwlwcmV2X3B0ci0+bmV4dCA9IHBpX3B0ci0+bmV4dDsKKyAgICAgIGVsc2UKKwlsaW5rZWRfcHJvY19kZXNjX3RhYmxlID0gcGlfcHRyLT5uZXh0OworCisgICAgICBmcmVlIChwaV9wdHIpOworICAgIH0KK30KKwwKKy8qIFRvIHNraXAgcHJvbG9ndWVzLCBJIHVzZSB0aGlzIHByZWRpY2F0ZS4gIFJldHVybnMgZWl0aGVyIFBDIGl0c2VsZgorICAgaWYgdGhlIGNvZGUgYXQgUEMgZG9lcyBub3QgbG9vayBsaWtlIGEgZnVuY3Rpb24gcHJvbG9ndWU7IG90aGVyd2lzZQorICAgcmV0dXJucyBhbiBhZGRyZXNzIHRoYXQgKGlmIHdlJ3JlIGx1Y2t5KSBmb2xsb3dzIHRoZSBwcm9sb2d1ZS4gIElmCisgICBMRU5JRU5ULCB0aGVuIHdlIG11c3Qgc2tpcCBldmVyeXRoaW5nIHdoaWNoIGlzIGludm9sdmVkIGluIHNldHRpbmcKKyAgIHVwIHRoZSBmcmFtZSAoaXQncyBPSyB0byBza2lwIG1vcmUsIGp1c3Qgc28gbG9uZyBhcyB3ZSBkb24ndCBza2lwCisgICBhbnl0aGluZyB3aGljaCBtaWdodCBjbG9iYmVyIHRoZSByZWdpc3RlcnMgd2hpY2ggYXJlIGJlaW5nIHNhdmVkLgorICAgQ3VycmVudGx5IHdlIG11c3Qgbm90IHNraXAgbW9yZSBvbiB0aGUgYWxwaGEsIGJ1dCB3ZSBtaWdodCB0aGUgbGVuaWVudAorICAgc3R1ZmYgc29tZSBkYXkuICAqLworCitDT1JFX0FERFIKK2FscGhhX3NraXBfcHJvbG9ndWUgKHBjLCBsZW5pZW50KQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIGludCBsZW5pZW50OworeworICAgIHVuc2lnbmVkIGxvbmcgaW5zdDsKKyAgICBpbnQgb2Zmc2V0OworICAgIENPUkVfQUREUiBwb3N0X3Byb2xvZ3VlX3BjOworICAgIGNoYXIgYnVmWzRdOworCisjaWZkZWYgR0RCX1RBUkdFVF9IQVNfU0hBUkVEX0xJQlMKKyAgICAvKiBTaWxlbnRseSByZXR1cm4gdGhlIHVuYWx0ZXJlZCBwYyB1cG9uIG1lbW9yeSBlcnJvcnMuCisgICAgICAgVGhpcyBjb3VsZCBoYXBwZW4gb24gT1NGLzEgaWYgZGVjb2RlX2xpbmVfMSB0cmllcyB0byBza2lwIHRoZQorICAgICAgIHByb2xvZ3VlIGZvciBxdWlja3N0YXJ0ZWQgc2hhcmVkIGxpYnJhcnkgZnVuY3Rpb25zIHdoZW4gdGhlCisgICAgICAgc2hhcmVkIGxpYnJhcnkgaXMgbm90IHlldCBtYXBwZWQgaW4uCisgICAgICAgUmVhZGluZyB0YXJnZXQgbWVtb3J5IGlzIHNsb3cgb3ZlciBzZXJpYWwgbGluZXMsIHNvIHdlIHBlcmZvcm0KKyAgICAgICB0aGlzIGNoZWNrIG9ubHkgaWYgdGhlIHRhcmdldCBoYXMgc2hhcmVkIGxpYnJhcmllcy4gICovCisgICAgaWYgKHRhcmdldF9yZWFkX21lbW9yeSAocGMsIGJ1ZiwgNCkpCisgICAgICByZXR1cm4gcGM7CisjZW5kaWYKKworICAgIC8qIFNlZSBpZiB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSBlbmQgb2YgdGhlIHByb2xvZ3VlIHZpYSB0aGUgc3ltYm9sIHRhYmxlLgorICAgICAgIElmIHNvLCB0aGVuIHJldHVybiBlaXRoZXIgUEMsIG9yIHRoZSBQQyBhZnRlciB0aGUgcHJvbG9ndWUsIHdoaWNoZXZlcgorICAgICAgIGlzIGdyZWF0ZXIuICAqLworCisgICAgcG9zdF9wcm9sb2d1ZV9wYyA9IGFmdGVyX3Byb2xvZ3VlIChwYywgTlVMTCk7CisKKyAgICBpZiAocG9zdF9wcm9sb2d1ZV9wYyAhPSAwKQorICAgICAgcmV0dXJuIG1heCAocGMsIHBvc3RfcHJvbG9ndWVfcGMpOworCisgICAgLyogQ2FuJ3QgZGV0ZXJtaW5lIHByb2xvZ3VlIGZyb20gdGhlIHN5bWJvbCB0YWJsZSwgbmVlZCB0byBleGFtaW5lCisgICAgICAgaW5zdHJ1Y3Rpb25zLiAgKi8KKworICAgIC8qIFNraXAgdGhlIHR5cGljYWwgcHJvbG9ndWUgaW5zdHJ1Y3Rpb25zLiBUaGVzZSBhcmUgdGhlIHN0YWNrIGFkanVzdG1lbnQKKyAgICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIGluc3RydWN0aW9ucyB0aGF0IHNhdmUgcmVnaXN0ZXJzIG9uIHRoZSBzdGFjaworICAgICAgIG9yIGluIHRoZSBnY2MgZnJhbWUuICAqLworICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgMTAwOyBvZmZzZXQgKz0gNCkKKyAgICAgIHsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gcmVhZF9tZW1vcnlfbm9icHQgKHBjICsgb2Zmc2V0LCBidWYsIDQpOworCWlmIChzdGF0dXMpCisJICBtZW1vcnlfZXJyb3IgKHN0YXR1cywgcGMgKyBvZmZzZXQpOworCWluc3QgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgNCk7CisKKwkvKiBUaGUgYWxwaGEgaGFzIG5vIGRlbGF5IHNsb3RzLiBCdXQgbGV0J3Mga2VlcCB0aGUgbGVuaWVudCBzdHVmZiwKKwkgICB3ZSBtaWdodCBuZWVkIGl0IGZvciBzb21ldGhpbmcgZWxzZSBpbiB0aGUgZnV0dXJlLiAgKi8KKwlpZiAobGVuaWVudCAmJiAwKQorCSAgY29udGludWU7CisKKwlpZiAoKGluc3QgJiAweGZmZmYwMDAwKSA9PSAweDI3YmIwMDAwKQkvKiBsZGFoICRncCxuKCR0MTIpICovCisJICAgIGNvbnRpbnVlOworCWlmICgoaW5zdCAmIDB4ZmZmZjAwMDApID09IDB4MjNiZDAwMDApCS8qIGxkYSAkZ3AsbigkZ3ApICovCisJICAgIGNvbnRpbnVlOworCWlmICgoaW5zdCAmIDB4ZmZmZjAwMDApID09IDB4MjNkZTAwMDApCS8qIGxkYSAkc3Asbigkc3ApICovCisJICAgIGNvbnRpbnVlOworCWVsc2UgaWYgKChpbnN0ICYgMHhmYzFmMDAwMCkgPT0gMHhiNDFlMDAwMAorCQkgJiYgKGluc3QgJiAweGZmZmYwMDAwKSAhPSAweGI3ZmUwMDAwKQorCSAgICBjb250aW51ZTsJCQkJLyogc3RxIHJlZyxuKCRzcCkgKi8KKwkJCQkJCS8qIHJlZyAhPSAkemVybyAqLworCWVsc2UgaWYgKChpbnN0ICYgMHhmYzFmMDAwMCkgPT0gMHg5YzFlMDAwMAorCQkgJiYgKGluc3QgJiAweGZmZmYwMDAwKSAhPSAweDlmZmUwMDAwKQorCSAgICBjb250aW51ZTsJCQkJLyogc3R0IHJlZyxuKCRzcCkgKi8KKwkJCQkJCS8qIHJlZyAhPSAkemVybyAqLworCWVsc2UgaWYgKGluc3QgPT0gMHg0N2RlMDQwZikJCS8qIGJpcyBzcCxzcCxmcCAqLworCSAgICBjb250aW51ZTsKKwllbHNlCisJICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcGMgKyBvZmZzZXQ7Cit9CisKKyNpZiAwCisvKiBJcyBhZGRyZXNzIFBDIGluIHRoZSBwcm9sb2d1ZSAobG9vc2VseSBkZWZpbmVkKSBmb3IgZnVuY3Rpb24gYXQKKyAgIFNUQVJUQUREUj8gICovCisKK3N0YXRpYyBpbnQKK2FscGhhX2luX2xlbmllbnRfcHJvbG9ndWUgKHN0YXJ0YWRkciwgcGMpCisgICAgIENPUkVfQUREUiBzdGFydGFkZHI7CisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgQ09SRV9BRERSIGVuZF9wcm9sb2d1ZSA9IGFscGhhX3NraXBfcHJvbG9ndWUgKHN0YXJ0YWRkciwgMSk7CisgIHJldHVybiBwYyA+PSBzdGFydGFkZHIgJiYgcGMgPCBlbmRfcHJvbG9ndWU7Cit9CisjZW5kaWYKKworLyogVGhlIGFscGhhIG5lZWRzIGEgY29udmVyc2lvbiBiZXR3ZWVuIHJlZ2lzdGVyIGFuZCBtZW1vcnkgZm9ybWF0IGlmCisgICB0aGUgcmVnaXN0ZXIgaXMgYSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBhbmQKKyAgICAgIG1lbW9yeSBmb3JtYXQgaXMgZmxvYXQsIGFzIHRoZSByZWdpc3RlciBmb3JtYXQgbXVzdCBiZSBkb3VibGUKKyAgIG9yCisgICAgICBtZW1vcnkgZm9ybWF0IGlzIGFuIGludGVnZXIgd2l0aCA0IGJ5dGVzIG9yIGxlc3MsIGFzIHRoZSByZXByZXNlbnRhdGlvbgorICAgICAgb2YgaW50ZWdlcnMgaW4gZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGlzIGRpZmZlcmVudC4gKi8KK3ZvaWQKK2FscGhhX3JlZ2lzdGVyX2NvbnZlcnRfdG9fdmlydHVhbCAocmVnbnVtLCB2YWx0eXBlLCByYXdfYnVmZmVyLCB2aXJ0dWFsX2J1ZmZlcikKKyAgICBpbnQgcmVnbnVtOworICAgIHN0cnVjdCB0eXBlICp2YWx0eXBlOworICAgIGNoYXIgKnJhd19idWZmZXI7CisgICAgY2hhciAqdmlydHVhbF9idWZmZXI7Cit7CisgIGlmIChUWVBFX0xFTkdUSCAodmFsdHlwZSkgPj0gUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSkpCisgICAgeworICAgICAgbWVtY3B5ICh2aXJ0dWFsX2J1ZmZlciwgcmF3X2J1ZmZlciwgUkVHSVNURVJfVklSVFVBTF9TSVpFIChyZWdudW0pKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKFRZUEVfQ09ERSAodmFsdHlwZSkgPT0gVFlQRV9DT0RFX0ZMVCkKKyAgICB7CisgICAgICBkb3VibGUgZCA9IGV4dHJhY3RfZmxvYXRpbmcgKHJhd19idWZmZXIsIFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pKTsKKyAgICAgIHN0b3JlX2Zsb2F0aW5nICh2aXJ0dWFsX2J1ZmZlciwgVFlQRV9MRU5HVEggKHZhbHR5cGUpLCBkKTsKKyAgICB9CisgIGVsc2UgaWYgKFRZUEVfQ09ERSAodmFsdHlwZSkgPT0gVFlQRV9DT0RFX0lOVCAmJiBUWVBFX0xFTkdUSCAodmFsdHlwZSkgPD0gNCkKKyAgICB7CisgICAgICBVTE9OR0VTVCBsOworICAgICAgbCA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAocmF3X2J1ZmZlciwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSkpOworICAgICAgbCA9ICgobCA+PiAzMikgJiAweGMwMDAwMDAwKSB8ICgobCA+PiAyOSkgJiAweDNmZmZmZmZmKTsKKyAgICAgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKHZpcnR1YWxfYnVmZmVyLCBUWVBFX0xFTkdUSCAodmFsdHlwZSksIGwpOworICAgIH0KKyAgZWxzZQorICAgIGVycm9yICgiQ2Fubm90IHJldHJpZXZlIHZhbHVlIGZyb20gZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIiKTsKK30KKwordm9pZAorYWxwaGFfcmVnaXN0ZXJfY29udmVydF90b19yYXcgKHZhbHR5cGUsIHJlZ251bSwgdmlydHVhbF9idWZmZXIsIHJhd19idWZmZXIpCisgICAgc3RydWN0IHR5cGUgKnZhbHR5cGU7CisgICAgaW50IHJlZ251bTsKKyAgICBjaGFyICp2aXJ0dWFsX2J1ZmZlcjsKKyAgICBjaGFyICpyYXdfYnVmZmVyOworeworICBpZiAoVFlQRV9MRU5HVEggKHZhbHR5cGUpID49IFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pKQorICAgIHsKKyAgICAgIG1lbWNweSAocmF3X2J1ZmZlciwgdmlydHVhbF9idWZmZXIsIFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKFRZUEVfQ09ERSAodmFsdHlwZSkgPT0gVFlQRV9DT0RFX0ZMVCkKKyAgICB7CisgICAgICBkb3VibGUgZCA9IGV4dHJhY3RfZmxvYXRpbmcgKHZpcnR1YWxfYnVmZmVyLCBUWVBFX0xFTkdUSCAodmFsdHlwZSkpOworICAgICAgc3RvcmVfZmxvYXRpbmcgKHJhd19idWZmZXIsIFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pLCBkKTsKKyAgICB9CisgIGVsc2UgaWYgKFRZUEVfQ09ERSAodmFsdHlwZSkgPT0gVFlQRV9DT0RFX0lOVCAmJiBUWVBFX0xFTkdUSCAodmFsdHlwZSkgPD0gNCkKKyAgICB7CisgICAgICBVTE9OR0VTVCBsOworICAgICAgaWYgKFRZUEVfVU5TSUdORUQgKHZhbHR5cGUpKQorCWwgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKHZpcnR1YWxfYnVmZmVyLCBUWVBFX0xFTkdUSCAodmFsdHlwZSkpOworICAgICAgZWxzZQorCWwgPSBleHRyYWN0X3NpZ25lZF9pbnRlZ2VyICh2aXJ0dWFsX2J1ZmZlciwgVFlQRV9MRU5HVEggKHZhbHR5cGUpKTsKKyAgICAgIGwgPSAoKGwgJiAweGMwMDAwMDAwKSA8PCAzMikgfCAoKGwgJiAweDNmZmZmZmZmKSA8PCAyOSk7CisgICAgICBzdG9yZV91bnNpZ25lZF9pbnRlZ2VyIChyYXdfYnVmZmVyLCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbnVtKSwgbCk7CisgICAgfQorICBlbHNlCisgICAgZXJyb3IgKCJDYW5ub3Qgc3RvcmUgdmFsdWUgaW4gZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIiKTsKK30KKworLyogR2l2ZW4gYSByZXR1cm4gdmFsdWUgaW4gYHJlZ2J1Zicgd2l0aCBhIHR5cGUgYHZhbHR5cGUnLCAKKyAgIGV4dHJhY3QgYW5kIGNvcHkgaXRzIHZhbHVlIGludG8gYHZhbGJ1ZicuICAqLworCit2b2lkCithbHBoYV9leHRyYWN0X3JldHVybl92YWx1ZSAodmFsdHlwZSwgcmVnYnVmLCB2YWxidWYpCisgICAgc3RydWN0IHR5cGUgKnZhbHR5cGU7CisgICAgY2hhciByZWdidWZbUkVHSVNURVJfQllURVNdOworICAgIGNoYXIgKnZhbGJ1ZjsKK3sKKyAgaWYgKFRZUEVfQ09ERSAodmFsdHlwZSkgPT0gVFlQRV9DT0RFX0ZMVCkKKyAgICBhbHBoYV9yZWdpc3Rlcl9jb252ZXJ0X3RvX3ZpcnR1YWwgKEZQMF9SRUdOVU0sIHZhbHR5cGUsCisJCQkJICAgICAgIHJlZ2J1ZiArIFJFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pLAorCQkJCSAgICAgICB2YWxidWYpOworICBlbHNlCisgICAgbWVtY3B5ICh2YWxidWYsIHJlZ2J1ZiArIFJFR0lTVEVSX0JZVEUgKFYwX1JFR05VTSksIFRZUEVfTEVOR1RIICh2YWx0eXBlKSk7Cit9CisKKy8qIEdpdmVuIGEgcmV0dXJuIHZhbHVlIGluIGByZWdidWYnIHdpdGggYSB0eXBlIGB2YWx0eXBlJywgCisgICB3cml0ZSBpdHMgdmFsdWUgaW50byB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIuICAqLworCit2b2lkCithbHBoYV9zdG9yZV9yZXR1cm5fdmFsdWUgKHZhbHR5cGUsIHZhbGJ1ZikKKyAgICBzdHJ1Y3QgdHlwZSAqdmFsdHlwZTsKKyAgICBjaGFyICp2YWxidWY7Cit7CisgIGNoYXIgcmF3X2J1ZmZlcltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworICBpbnQgcmVnbnVtID0gVjBfUkVHTlVNOworICBpbnQgbGVuZ3RoID0gVFlQRV9MRU5HVEggKHZhbHR5cGUpOworICAKKyAgaWYgKFRZUEVfQ09ERSAodmFsdHlwZSkgPT0gVFlQRV9DT0RFX0ZMVCkKKyAgICB7CisgICAgICByZWdudW0gPSBGUDBfUkVHTlVNOworICAgICAgbGVuZ3RoID0gUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSk7CisgICAgICBhbHBoYV9yZWdpc3Rlcl9jb252ZXJ0X3RvX3JhdyAodmFsdHlwZSwgcmVnbnVtLCB2YWxidWYsIHJhd19idWZmZXIpOworICAgIH0KKyAgZWxzZQorICAgIG1lbWNweSAocmF3X2J1ZmZlciwgdmFsYnVmLCBsZW5ndGgpOworCisgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFIChyZWdudW0pLCByYXdfYnVmZmVyLCBsZW5ndGgpOworfQorCisvKiBKdXN0IGxpa2UgcmVpbml0X2ZyYW1lX2NhY2hlLCBidXQgd2l0aCB0aGUgcmlnaHQgYXJndW1lbnRzIHRvIGJlCisgICBjYWxsYWJsZSBhcyBhbiBzZnVuYy4gICovCisKK3N0YXRpYyB2b2lkCityZWluaXRfZnJhbWVfY2FjaGVfc2Z1bmMgKGFyZ3MsIGZyb21fdHR5LCBjKQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7CisgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjOworeworICByZWluaXRfZnJhbWVfY2FjaGUgKCk7Cit9CisKKy8qIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gb2YgQ0FMTF9EVU1NWV9BRERSRVNTLiAgSXQncyBhIGhldXJpc3RpYyB0aGF0IGlzIHVzZWQKKyAgIHRvIGZpbmQgYSBjb252ZW5pZW50IHBsYWNlIGluIHRoZSB0ZXh0IHNlZ21lbnQgdG8gc3RpY2sgYSBicmVha3BvaW50IHRvCisgICBkZXRlY3QgdGhlIGNvbXBsZXRpb24gb2YgYSB0YXJnZXQgZnVuY3Rpb24gY2FsbCAoYWxhIGNhbGxfZnVuY3Rpb25fYnlfaGFuZCkuCisgKi8KKworQ09SRV9BRERSCithbHBoYV9jYWxsX2R1bW15X2FkZHJlc3MgKCkKK3sKKyAgQ09SRV9BRERSIGVudHJ5OworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKnN5bTsKKworICBlbnRyeSA9IGVudHJ5X3BvaW50X2FkZHJlc3MgKCk7CisKKyAgaWYgKGVudHJ5ICE9IDApCisgICAgcmV0dXJuIGVudHJ5OworCisgIHN5bSA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoIl9QcmVsdWRlIiwgTlVMTCwgc3ltZmlsZV9vYmpmaWxlKTsKKworICBpZiAoIXN5bSB8fCBNU1lNQk9MX1RZUEUgKHN5bSkgIT0gbXN0X3RleHQpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICByZXR1cm4gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKHN5bSkgKyA0OworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9hbHBoYV90ZGVwICgpCit7CisgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjOworCisgIHRtX3ByaW50X2luc24gPSBwcmludF9pbnNuX2FscGhhOworCisgIC8qIExldCB0aGUgdXNlciBzZXQgdGhlIGZlbmNlIHBvc3QgZm9yIGhldXJpc3RpY19wcm9jX3N0YXJ0LiAgKi8KKworICAvKiBXZSByZWFsbHkgd291bGQgbGlrZSB0byBoYXZlIGJvdGggIjAiIGFuZCAidW5saW1pdGVkIiB3b3JrLCBidXQKKyAgICAgY29tbWFuZC5jIGRvZXNuJ3QgZGVhbCB3aXRoIHRoYXQuICBTbyBtYWtlIGl0IGEgdmFyX3ppbnRlZ2VyCisgICAgIGJlY2F1c2UgdGhlIHVzZXIgY2FuIGFsd2F5cyB1c2UgIjk5OTk5OSIgb3Igc29tZSBzdWNoIGZvciB1bmxpbWl0ZWQuICAqLworICBjID0gYWRkX3NldF9jbWQgKCJoZXVyaXN0aWMtZmVuY2UtcG9zdCIsIGNsYXNzX3N1cHBvcnQsIHZhcl96aW50ZWdlciwKKwkJICAgKGNoYXIgKikgJmhldXJpc3RpY19mZW5jZV9wb3N0LAorCQkgICAiXAorU2V0IHRoZSBkaXN0YW5jZSBzZWFyY2hlZCBmb3IgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24uXG5cCitJZiB5b3UgYXJlIGRlYnVnZ2luZyBhIHN0cmlwcGVkIGV4ZWN1dGFibGUsIEdEQiBuZWVkcyB0byBzZWFyY2ggdGhyb3VnaCB0aGVcblwKK3Byb2dyYW0gZm9yIHRoZSBzdGFydCBvZiBhIGZ1bmN0aW9uLiAgVGhpcyBjb21tYW5kIHNldHMgdGhlIGRpc3RhbmNlIG9mIHRoZVxuXAorc2VhcmNoLiAgVGhlIG9ubHkgbmVlZCB0byBzZXQgaXQgaXMgd2hlbiBkZWJ1Z2dpbmcgYSBzdHJpcHBlZCBleGVjdXRhYmxlLiIsCisJCSAgICZzZXRsaXN0KTsKKyAgLyogV2UgbmVlZCB0byB0aHJvdyBhd2F5IHRoZSBmcmFtZSBjYWNoZSB3aGVuIHdlIHNldCB0aGlzLCBzaW5jZSBpdAorICAgICBtaWdodCBjaGFuZ2Ugb3VyIGFiaWxpdHkgdG8gZ2V0IGJhY2t0cmFjZXMuICAqLworICBjLT5mdW5jdGlvbi5zZnVuYyA9IHJlaW5pdF9mcmFtZV9jYWNoZV9zZnVuYzsKKyAgYWRkX3Nob3dfZnJvbV9zZXQgKGMsICZzaG93bGlzdCk7Cit9CmRpZmYgLS1naXQgYS9nZGIvYWx0b3MteGRlcC5jIGIvZ2RiL2FsdG9zLXhkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzI3MzMyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2FsdG9zLXhkZXAuYwpAQCAtMCwwICsxLDE2NCBAQAorLyogTG93IGxldmVsIGludGVyZmFjZSB0byBwdHJhY2UsIGZvciBHREIgd2hlbiBydW5uaW5nIHVuZGVyIG02OGsgU1ZSMiBVbml4CisgICBvbiBBbHRvcyAzMDY4LiAgUmVwb3J0IGJ1Z3MgdG8gSnlya2kgS3VvcHBhbGEgPGprcEBjcy5odXQuZmk+CisgICBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisKKyNpZmRlZiBVU0cKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL2Rpci5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgVVNHCisjaW5jbHVkZSA8c3lzL3BhZ2UuaD4KKyNpZmRlZiBBTFRPUworI2luY2x1ZGUgPHN5cy9uZXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlIDxzeXMvdXNlci5oPgkJLyogQWZ0ZXIgYS5vdXQuaCAgKi8KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgImdkYl9zdGF0LmgiCisKKwwKKy8qIFdvcmsgd2l0aCBjb3JlIGR1bXAgYW5kIGV4ZWN1dGFibGUgZmlsZXMsIGZvciBHREIuIAorICAgVGhpcyBjb2RlIHdvdWxkIGJlIGluIGNvcmVmaWxlLmMgaWYgaXQgd2VyZW4ndCBtYWNoaW5lLWRlcGVuZGVudC4gKi8KKwordm9pZAorY29yZV9maWxlX2NvbW1hbmQgKGZpbGVuYW1lLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqZmlsZW5hbWU7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IHZhbDsKKyAgZXh0ZXJuIGNoYXIgcmVnaXN0ZXJzW107CisKKyAgLyogRGlzY2FyZCBhbGwgdmVzdGlnZXMgb2YgYW55IHByZXZpb3VzIGNvcmUgZmlsZQorICAgICBhbmQgbWFyayBkYXRhIGFuZCBzdGFjayBzcGFjZXMgYXMgZW1wdHkuICAqLworCisgIGlmIChjb3JlZmlsZSkKKyAgICBmcmVlIChjb3JlZmlsZSk7CisgIGNvcmVmaWxlID0gMDsKKworICBpZiAoY29yZWNoYW4gPj0gMCkKKyAgICBjbG9zZSAoY29yZWNoYW4pOworICBjb3JlY2hhbiA9IC0xOworCisgIGRhdGFfc3RhcnQgPSAwOworICBkYXRhX2VuZCA9IDA7CisgIHN0YWNrX3N0YXJ0ID0gU1RBQ0tfRU5EX0FERFI7CisgIHN0YWNrX2VuZCA9IFNUQUNLX0VORF9BRERSOworCisgIC8qIE5vdywgaWYgYSBuZXcgY29yZSBmaWxlIHdhcyBzcGVjaWZpZWQsIG9wZW4gaXQgYW5kIGRpZ2VzdCBpdC4gICovCisKKyAgaWYgKGZpbGVuYW1lKQorICAgIHsKKyAgICAgIGZpbGVuYW1lID0gdGlsZGVfZXhwYW5kIChmaWxlbmFtZSk7CisgICAgICBtYWtlX2NsZWFudXAgKGZyZWUsIGZpbGVuYW1lKTsKKyAgICAgIAorICAgICAgaWYgKGhhdmVfaW5mZXJpb3JfcCAoKSkKKwllcnJvciAoIlRvIGxvb2sgYXQgYSBjb3JlIGZpbGUsIHlvdSBtdXN0IGtpbGwgdGhlIHByb2dyYW0gd2l0aCBcImtpbGxcIi4iKTsKKyAgICAgIGNvcmVjaGFuID0gb3BlbiAoZmlsZW5hbWUsIE9fUkRPTkxZLCAwKTsKKyAgICAgIGlmIChjb3JlY2hhbiA8IDApCisJcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworICAgICAgLyogNC4yLXN0eWxlIChhbmQgcGVyaGFwcyBhbHNvIHN5c1Ytc3R5bGUpIGNvcmUgZHVtcCBmaWxlLiAgKi8KKyAgICAgIHsKKwlzdHJ1Y3QgdXNlciB1OworCisJdW5zaWduZWQgaW50IHJlZ19vZmZzZXQ7CisKKwl2YWwgPSBteXJlYWQgKGNvcmVjaGFuLCAmdSwgc2l6ZW9mIHUpOworCWlmICh2YWwgPCAwKQorCSAgcGVycm9yX3dpdGhfbmFtZSAoIk5vdCBhIGNvcmUgZmlsZTogcmVhZGluZyB1cGFnZSIpOworCWlmICh2YWwgIT0gc2l6ZW9mIHUpCisJICBlcnJvciAoIk5vdCBhIGNvcmUgZmlsZTogY291bGQgb25seSByZWFkICVkIGJ5dGVzIiwgdmFsKTsKKwlkYXRhX3N0YXJ0ID0gZXhlY19kYXRhX3N0YXJ0OworCisjaWYgIWRlZmluZWQgKE5CUEcpCisjZGVmaW5lIE5CUEcgTkJQUAorI2VuZGlmCisjaWYgIWRlZmluZWQgKFVQQUdFUykKKyNkZWZpbmUgVVBBR0VTIFVTSVpFCisjZW5kaWYKKworCWRhdGFfZW5kID0gZGF0YV9zdGFydCArIE5CUEcgKiB1LnVfZHNpemU7CisJc3RhY2tfc3RhcnQgPSBzdGFja19lbmQgLSBOQlBHICogdS51X3NzaXplOworCWRhdGFfb2Zmc2V0ID0gTkJQRyAqIFVQQUdFUyArIGV4ZWNfZGF0YV9zdGFydCAlIE5CUEcgLyogTm90IHN1cmUgYWJvdXQgdGhpcyAvL2prcCAqLzsKKwlzdGFja19vZmZzZXQgPSBOQlBHICogKFVQQUdFUyArIHUudV9kc2l6ZSk7CisKKwkvKiBTb21lIG1hY2hpbmVzIHB1dCBhbiBhYnNvbHV0ZSBhZGRyZXNzIGluIGhlcmUgYW5kIHNvbWUgcHV0CisJICAgdGhlIG9mZnNldCBpbiB0aGUgdXBhZ2Ugb2YgdGhlIHJlZ3MuICAqLworCXJlZ19vZmZzZXQgPSAoaW50KSB1LnVfc3RhdGU7CisJaWYgKHJlZ19vZmZzZXQgPiBOQlBHICogVVBBR0VTKQorCSAgcmVnX29mZnNldCAtPSBLRVJORUxfVV9BRERSOworCisJbWVtY3B5ICgmY29yZV9hb3V0aGRyLCAmdS51X2V4ZGF0YSwgc2l6ZW9mIChBT1VUSERSKSk7CisJcHJpbnRmX3VuZmlsdGVyZWQgKCJDb3JlIGZpbGUgaXMgZnJvbSBcIiVzXCIuXG4iLCB1LnVfY29tbSk7CisKKwkvKiBJIGRvbid0IGtub3cgd2hlcmUgdG8gZmluZCB0aGlzIGluZm8uCisJICAgU28sIGZvciBub3csIG1hcmsgaXQgYXMgbm90IGF2YWlsYWJsZS4gICovCisJTl9TRVRfTUFHSUMgKGNvcmVfYW91dGhkciwgMCk7CisKKwkvKiBSZWFkIHRoZSByZWdpc3RlciB2YWx1ZXMgb3V0IG9mIHRoZSBjb3JlIGZpbGUgYW5kIHN0b3JlCisJICAgdGhlbSB3aGVyZSBgcmVhZF9yZWdpc3Rlcicgd2lsbCBmaW5kIHRoZW0uICAqLworCisJeworCSAgcmVnaXN0ZXIgaW50IHJlZ25vOworCisJICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCBOVU1fUkVHUzsgcmVnbm8rKykKKwkgICAgeworCSAgICAgIGNoYXIgYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisKKwkgICAgICB2YWwgPSBsc2VlayAoY29yZWNoYW4sIHJlZ2lzdGVyX2FkZHIgKHJlZ25vLCByZWdfb2Zmc2V0KSwgMCk7CisJICAgICAgaWYgKHZhbCA8IDAKKwkJICB8fCAodmFsID0gbXlyZWFkIChjb3JlY2hhbiwgYnVmLCBzaXplb2YgYnVmKSkgPCAwKQorCQl7CisJCSAgY2hhciAqIGJ1ZmZlciA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChSRUdJU1RFUl9OQU1FIChyZWdubykpCisJCQkJCQkgICArIDMwKTsKKwkJICBzdHJjcHkgKGJ1ZmZlciwgIlJlYWRpbmcgcmVnaXN0ZXIgIik7CisJCSAgc3RyY2F0IChidWZmZXIsIFJFR0lTVEVSX05BTUUgKHJlZ25vKSk7CisJCQkJCQkgICAKKwkJICBwZXJyb3Jfd2l0aF9uYW1lIChidWZmZXIpOworCQl9CisKKwkgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCBidWYpOworCSAgICB9CisJfQorICAgICAgfQorICAgICAgaWYgKGZpbGVuYW1lWzBdID09ICcvJykKKwljb3JlZmlsZSA9IHNhdmVzdHJpbmcgKGZpbGVuYW1lLCBzdHJsZW4gKGZpbGVuYW1lKSk7CisgICAgICBlbHNlCisJeworCSAgY29yZWZpbGUgPSBjb25jYXQgKGN1cnJlbnRfZGlyZWN0b3J5LCAiLyIsIGZpbGVuYW1lLCBOVUxMKTsKKwl9CisKKyAgICAgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7CisgICAgICBzZWxlY3RfZnJhbWUgKGdldF9jdXJyZW50X2ZyYW1lICgpLCAwKTsKKyAgICAgIHZhbGlkYXRlX2ZpbGVzICgpOworICAgIH0KKyAgZWxzZSBpZiAoZnJvbV90dHkpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJObyBjb3JlIGZpbGUgbm93LlxuIik7Cit9CmRpZmYgLS1naXQgYS9nZGIvYW5ub3RhdGUuYyBiL2dkYi9hbm5vdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjM2U0MjQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvYW5ub3RhdGUuYwpAQCAtMCwwICsxLDU3NyBAQAorLyogQW5ub3RhdGlvbiByb3V0aW5lcyBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5ODYsIDg5LCA5MCwgOTEsIDkyLCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImFubm90YXRlLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgImJyZWFrcG9pbnQuaCIKKwwKKworLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAqLworCitzdGF0aWMgdm9pZCBwcmludF92YWx1ZV9mbGFncyBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKSk7CisKK3N0YXRpYyB2b2lkIGJyZWFrcG9pbnRfY2hhbmdlZCBQQVJBTVMgKChzdHJ1Y3QgYnJlYWtwb2ludCAqKSk7CisKK3ZvaWQgKCphbm5vdGF0ZV9zdGFydGluZ19ob29rKSBQQVJBTVMgKCh2b2lkKSk7Cit2b2lkICgqYW5ub3RhdGVfc3RvcHBlZF9ob29rKSBQQVJBTVMgKCh2b2lkKSk7Cit2b2lkICgqYW5ub3RhdGVfc2lnbmFsbGVkX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKK3ZvaWQgKCphbm5vdGF0ZV9leGl0ZWRfaG9vaykgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZAorcHJpbnRfdmFsdWVfZmxhZ3MgKHQpCisgICAgIHN0cnVjdCB0eXBlICp0OworeworICBpZiAoY2FuX2RlcmVmZXJlbmNlICh0KSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIqIik7CisgIGVsc2UKKyAgICBwcmludGZfZmlsdGVyZWQgKCItIik7Cit9CisMCit2b2lkCiticmVha3BvaW50c19jaGFuZ2VkICgpCit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICB7CisgICAgICB0YXJnZXRfdGVybWluYWxfb3VycyAoKTsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiXG5cMDMyXDAzMmJyZWFrcG9pbnRzLWludmFsaWRcbiIpOworICAgIH0KK30KKwordm9pZAorYW5ub3RhdGVfYnJlYWtwb2ludCAobnVtKQorICAgICBpbnQgbnVtOworeworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMmJyZWFrcG9pbnQgJWRcbiIsIG51bSk7Cit9CisKK3ZvaWQKK2Fubm90YXRlX2NhdGNocG9pbnQgKG51bSkKKyAgICAgaW50IG51bTsKK3sKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJjYXRjaHBvaW50ICVkXG4iLCBudW0pOworfQorCit2b2lkCithbm5vdGF0ZV93YXRjaHBvaW50IChudW0pCisgICAgIGludCBudW07Cit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMyd2F0Y2hwb2ludCAlZFxuIiwgbnVtKTsKK30KKwordm9pZAorYW5ub3RhdGVfc3RhcnRpbmcgKCkKK3sKKworICBpZiAoYW5ub3RhdGVfc3RhcnRpbmdfaG9vaykKKyAgICBhbm5vdGF0ZV9zdGFydGluZ19ob29rICgpOworICBlbHNlCisgICAgeworICAgICAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMnN0YXJ0aW5nXG4iKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZAorYW5ub3RhdGVfc3RvcHBlZCAoKQoreworICBpZiAoYW5ub3RhdGVfc3RvcHBlZF9ob29rKQorICAgIGFubm90YXRlX3N0b3BwZWRfaG9vayAoKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMnN0b3BwZWRcbiIpOworICAgIH0KK30KKwordm9pZAorYW5ub3RhdGVfZXhpdGVkIChleGl0c3RhdHVzKQorICAgICBpbnQgZXhpdHN0YXR1czsKK3sKKyAgaWYgKGFubm90YXRlX2V4aXRlZF9ob29rKQorICAgIGFubm90YXRlX2V4aXRlZF9ob29rICgpOworICBlbHNlCisgICAgeworICAgICAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgICAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMyZXhpdGVkICVkXG4iLCBleGl0c3RhdHVzKTsKKyAgICB9Cit9CisKK3ZvaWQKK2Fubm90YXRlX3NpZ25hbGxlZCAoKQoreworICBpZiAoYW5ub3RhdGVfc2lnbmFsbGVkX2hvb2spCisgICAgYW5ub3RhdGVfc2lnbmFsbGVkX2hvb2sgKCk7CisKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJzaWduYWxsZWRcbiIpOworfQorCit2b2lkCithbm5vdGF0ZV9zaWduYWxfbmFtZSAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMnNpZ25hbC1uYW1lXG4iKTsKK30KKwordm9pZAorYW5ub3RhdGVfc2lnbmFsX25hbWVfZW5kICgpCit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMyc2lnbmFsLW5hbWUtZW5kXG4iKTsKK30KKwordm9pZAorYW5ub3RhdGVfc2lnbmFsX3N0cmluZyAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMnNpZ25hbC1zdHJpbmdcbiIpOworfQorCit2b2lkCithbm5vdGF0ZV9zaWduYWxfc3RyaW5nX2VuZCAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMnNpZ25hbC1zdHJpbmctZW5kXG4iKTsKK30KKwordm9pZAorYW5ub3RhdGVfc2lnbmFsICgpCit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMyc2lnbmFsXG4iKTsKK30KKwwKK3ZvaWQKK2Fubm90YXRlX2JyZWFrcG9pbnRzX2hlYWRlcnMgKCkKK3sKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJicmVha3BvaW50cy1oZWFkZXJzXG4iKTsKK30KKwordm9pZAorYW5ub3RhdGVfZmllbGQgKG51bSkKKyAgICAgaW50IG51bTsKK3sKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJmaWVsZCAlZFxuIiwgbnVtKTsKK30KKwordm9pZAorYW5ub3RhdGVfYnJlYWtwb2ludHNfdGFibGUgKCkKK3sKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJicmVha3BvaW50cy10YWJsZVxuIik7Cit9CisKK3ZvaWQKK2Fubm90YXRlX3JlY29yZCAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMnJlY29yZFxuIik7Cit9CisKK3ZvaWQKK2Fubm90YXRlX2JyZWFrcG9pbnRzX3RhYmxlX2VuZCAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMmJyZWFrcG9pbnRzLXRhYmxlLWVuZFxuIik7Cit9CisKK3ZvaWQKK2Fubm90YXRlX2ZyYW1lc19pbnZhbGlkICgpCit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICB7CisgICAgICB0YXJnZXRfdGVybWluYWxfb3VycyAoKTsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiXG5cMDMyXDAzMmZyYW1lcy1pbnZhbGlkXG4iKTsKKyAgICB9Cit9CisKK3ZvaWQKK2Fubm90YXRlX2ZpZWxkX2JlZ2luICh0eXBlKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJmaWVsZC1iZWdpbiAiKTsKKyAgICAgIHByaW50X3ZhbHVlX2ZsYWdzICh0eXBlKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgICAgfQorfQorCit2b2lkCithbm5vdGF0ZV9maWVsZF9uYW1lX2VuZCAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMmZpZWxkLW5hbWUtZW5kXG4iKTsKK30KKwordm9pZAorYW5ub3RhdGVfZmllbGRfdmFsdWUgKCkKK3sKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJmaWVsZC12YWx1ZVxuIik7Cit9CisKK3ZvaWQKK2Fubm90YXRlX2ZpZWxkX2VuZCAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMmZpZWxkLWVuZFxuIik7Cit9CisMCit2b2lkCithbm5vdGF0ZV9xdWl0ICgpCit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMycXVpdFxuIik7Cit9CisKK3ZvaWQKK2Fubm90YXRlX2Vycm9yICgpCit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMyZXJyb3JcbiIpOworfQorCit2b2lkCithbm5vdGF0ZV9lcnJvcl9iZWdpbiAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlxuXDAzMlwwMzJlcnJvci1iZWdpblxuIik7Cit9CisKK3ZvaWQKK2Fubm90YXRlX3ZhbHVlX2hpc3RvcnlfYmVnaW4gKGhpc3RpbmRleCwgdHlwZSkKKyAgICAgaW50IGhpc3RpbmRleDsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMydmFsdWUtaGlzdG9yeS1iZWdpbiAlZCAiLCBoaXN0aW5kZXgpOworICAgICAgcHJpbnRfdmFsdWVfZmxhZ3MgKHR5cGUpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgICB9Cit9CisKK3ZvaWQKK2Fubm90YXRlX3ZhbHVlX2JlZ2luICh0eXBlKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJ2YWx1ZS1iZWdpbiAiKTsKKyAgICAgIHByaW50X3ZhbHVlX2ZsYWdzICh0eXBlKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgICAgfQorfQorCit2b2lkCithbm5vdGF0ZV92YWx1ZV9oaXN0b3J5X3ZhbHVlICgpCit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMydmFsdWUtaGlzdG9yeS12YWx1ZVxuIik7Cit9CisKK3ZvaWQKK2Fubm90YXRlX3ZhbHVlX2hpc3RvcnlfZW5kICgpCit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMydmFsdWUtaGlzdG9yeS1lbmRcbiIpOworfQorCit2b2lkCithbm5vdGF0ZV92YWx1ZV9lbmQgKCkKK3sKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJ2YWx1ZS1lbmRcbiIpOworfQorCit2b2lkCithbm5vdGF0ZV9kaXNwbGF5X2JlZ2luICgpCit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMyZGlzcGxheS1iZWdpblxuIik7Cit9CisKK3ZvaWQKK2Fubm90YXRlX2Rpc3BsYXlfbnVtYmVyX2VuZCAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMmRpc3BsYXktbnVtYmVyLWVuZFxuIik7Cit9CisKK3ZvaWQKK2Fubm90YXRlX2Rpc3BsYXlfZm9ybWF0ICgpCit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMyZGlzcGxheS1mb3JtYXRcbiIpOworfQorCit2b2lkCithbm5vdGF0ZV9kaXNwbGF5X2V4cHJlc3Npb24gKCkKK3sKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJkaXNwbGF5LWV4cHJlc3Npb25cbiIpOworfQorCit2b2lkCithbm5vdGF0ZV9kaXNwbGF5X2V4cHJlc3Npb25fZW5kICgpCit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMyZGlzcGxheS1leHByZXNzaW9uLWVuZFxuIik7Cit9CisKK3ZvaWQKK2Fubm90YXRlX2Rpc3BsYXlfdmFsdWUgKCkKK3sKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJkaXNwbGF5LXZhbHVlXG4iKTsKK30KKwordm9pZAorYW5ub3RhdGVfZGlzcGxheV9lbmQgKCkKK3sKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJkaXNwbGF5LWVuZFxuIik7Cit9CisKK3ZvaWQKK2Fubm90YXRlX2FyZ19iZWdpbiAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMmFyZy1iZWdpblxuIik7Cit9CisKK3ZvaWQKK2Fubm90YXRlX2FyZ19uYW1lX2VuZCAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMmFyZy1uYW1lLWVuZFxuIik7Cit9CisKK3ZvaWQKK2Fubm90YXRlX2FyZ192YWx1ZSAodHlwZSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMyYXJnLXZhbHVlICIpOworICAgICAgcHJpbnRfdmFsdWVfZmxhZ3MgKHR5cGUpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgICB9Cit9CisKK3ZvaWQKK2Fubm90YXRlX2FyZ19lbmQgKCkKK3sKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJhcmctZW5kXG4iKTsKK30KKwordm9pZAorYW5ub3RhdGVfc291cmNlIChmaWxlbmFtZSwgbGluZSwgY2hhcmFjdGVyLCBtaWQsIHBjKQorICAgICBjaGFyICpmaWxlbmFtZTsKKyAgICAgaW50IGxpbmU7CisgICAgIGludCBjaGFyYWN0ZXI7CisgICAgIGludCBtaWQ7CisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJzb3VyY2UgIik7CisgIGVsc2UKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcMDMyXDAzMiIpOworCisgIHByaW50Zl9maWx0ZXJlZCAoIiVzOiVkOiVkOiVzOjB4IiwgZmlsZW5hbWUsCisJCSAgIGxpbmUsIGNoYXJhY3RlciwKKwkJICAgbWlkID8gIm1pZGRsZSIgOiAiYmVnIik7CisgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAocGMsIDAsIGdkYl9zdGRvdXQpOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworfQorCit2b2lkCithbm5vdGF0ZV9mcmFtZV9iZWdpbiAobGV2ZWwsIHBjKQorICAgICBpbnQgbGV2ZWw7CisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJmcmFtZS1iZWdpbiAlZCAweCIsIGxldmVsKTsKKyAgICAgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAocGMsIDAsIGdkYl9zdGRvdXQpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgICB9Cit9CisKK3ZvaWQKK2Fubm90YXRlX2Z1bmN0aW9uX2NhbGwgKCkKK3sKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJmdW5jdGlvbi1jYWxsXG4iKTsKK30KKwordm9pZAorYW5ub3RhdGVfc2lnbmFsX2hhbmRsZXJfY2FsbGVyICgpCit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMyc2lnbmFsLWhhbmRsZXItY2FsbGVyXG4iKTsKK30KKwordm9pZAorYW5ub3RhdGVfZnJhbWVfYWRkcmVzcyAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMmZyYW1lLWFkZHJlc3NcbiIpOworfQorCit2b2lkCithbm5vdGF0ZV9mcmFtZV9hZGRyZXNzX2VuZCAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMmZyYW1lLWFkZHJlc3MtZW5kXG4iKTsKK30KKwordm9pZAorYW5ub3RhdGVfZnJhbWVfZnVuY3Rpb25fbmFtZSAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMmZyYW1lLWZ1bmN0aW9uLW5hbWVcbiIpOworfQorCit2b2lkCithbm5vdGF0ZV9mcmFtZV9hcmdzICgpCit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMyZnJhbWUtYXJnc1xuIik7Cit9CisKK3ZvaWQKK2Fubm90YXRlX2ZyYW1lX3NvdXJjZV9iZWdpbiAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMmZyYW1lLXNvdXJjZS1iZWdpblxuIik7Cit9CisKK3ZvaWQKK2Fubm90YXRlX2ZyYW1lX3NvdXJjZV9maWxlICgpCit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMyZnJhbWUtc291cmNlLWZpbGVcbiIpOworfQorCit2b2lkCithbm5vdGF0ZV9mcmFtZV9zb3VyY2VfZmlsZV9lbmQgKCkKK3sKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJmcmFtZS1zb3VyY2UtZmlsZS1lbmRcbiIpOworfQorCit2b2lkCithbm5vdGF0ZV9mcmFtZV9zb3VyY2VfbGluZSAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMmZyYW1lLXNvdXJjZS1saW5lXG4iKTsKK30KKwordm9pZAorYW5ub3RhdGVfZnJhbWVfc291cmNlX2VuZCAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMmZyYW1lLXNvdXJjZS1lbmRcbiIpOworfQorCit2b2lkCithbm5vdGF0ZV9mcmFtZV93aGVyZSAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMmZyYW1lLXdoZXJlXG4iKTsKK30KKwordm9pZAorYW5ub3RhdGVfZnJhbWVfZW5kICgpCit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMyZnJhbWUtZW5kXG4iKTsKK30KKwwKK3ZvaWQKK2Fubm90YXRlX2FycmF5X3NlY3Rpb25fYmVnaW4gKGluZGV4LCBlbHR0eXBlKQorICAgICBpbnQgaW5kZXg7CisgICAgIHN0cnVjdCB0eXBlICplbHR0eXBlOworeworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMmFycmF5LXNlY3Rpb24tYmVnaW4gJWQgIiwgaW5kZXgpOworICAgICAgcHJpbnRfdmFsdWVfZmxhZ3MgKGVsdHR5cGUpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgICB9Cit9CisKK3ZvaWQKK2Fubm90YXRlX2VsdF9yZXAgKHJlcGNvdW50KQorICAgICB1bnNpZ25lZCBpbnQgcmVwY291bnQ7Cit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMyZWx0LXJlcCAldVxuIiwgcmVwY291bnQpOworfQorCit2b2lkCithbm5vdGF0ZV9lbHRfcmVwX2VuZCAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cMDMyXDAzMmVsdC1yZXAtZW5kXG4iKTsKK30KKwordm9pZAorYW5ub3RhdGVfZWx0ICgpCit7CisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMyZWx0XG4iKTsKK30KKwordm9pZAorYW5ub3RhdGVfYXJyYXlfc2VjdGlvbl9lbmQgKCkKK3sKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJhcnJheS1zZWN0aW9uLWVuZFxuIik7Cit9CisKK3N0YXRpYyB2b2lkCiticmVha3BvaW50X2NoYW5nZWQgKGIpCisgICAgIHN0cnVjdCBicmVha3BvaW50ICpiOworeworICBicmVha3BvaW50c19jaGFuZ2VkICgpOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9hbm5vdGF0ZSAoKQoreworICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEpCisgICAgeworICAgICAgZGVsZXRlX2JyZWFrcG9pbnRfaG9vayA9IGJyZWFrcG9pbnRfY2hhbmdlZDsKKyAgICAgIG1vZGlmeV9icmVha3BvaW50X2hvb2sgPSBicmVha3BvaW50X2NoYW5nZWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ2RiL2Fubm90YXRlLmggYi9nZGIvYW5ub3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTczOWRiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2Fubm90YXRlLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qIEFubm90YXRpb24gcm91dGluZXMgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorCitleHRlcm4gdm9pZCBicmVha3BvaW50c19jaGFuZ2VkIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfYnJlYWtwb2ludCBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiB2b2lkIGFubm90YXRlX2NhdGNocG9pbnQgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBhbm5vdGF0ZV93YXRjaHBvaW50IFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfc3RhcnRpbmcgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfc3RvcHBlZCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBhbm5vdGF0ZV9leGl0ZWQgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBhbm5vdGF0ZV9zaWduYWxsZWQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfc2lnbmFsX25hbWUgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfc2lnbmFsX25hbWVfZW5kIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGFubm90YXRlX3NpZ25hbF9zdHJpbmcgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfc2lnbmFsX3N0cmluZ19lbmQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfc2lnbmFsIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfYnJlYWtwb2ludHNfaGVhZGVycyBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBhbm5vdGF0ZV9maWVsZCBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiB2b2lkIGFubm90YXRlX2JyZWFrcG9pbnRzX3RhYmxlIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGFubm90YXRlX3JlY29yZCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBhbm5vdGF0ZV9icmVha3BvaW50c190YWJsZV9lbmQgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCBhbm5vdGF0ZV9mcmFtZXNfaW52YWxpZCBQQVJBTVMgKCh2b2lkKSk7CisKKyNpZmRlZiBfX1NURENfXworc3RydWN0IHR5cGU7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfZmllbGRfYmVnaW4gUEFSQU1TICgoc3RydWN0IHR5cGUgKikpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfZmllbGRfbmFtZV9lbmQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfZmllbGRfdmFsdWUgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfZmllbGRfZW5kIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfcXVpdCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBhbm5vdGF0ZV9lcnJvciBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBhbm5vdGF0ZV9lcnJvcl9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIGFubm90YXRlX3ZhbHVlX2hpc3RvcnlfYmVnaW4gUEFSQU1TICgoaW50LCBzdHJ1Y3QgdHlwZSAqKSk7CitleHRlcm4gdm9pZCBhbm5vdGF0ZV92YWx1ZV9iZWdpbiBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKSk7CitleHRlcm4gdm9pZCBhbm5vdGF0ZV92YWx1ZV9oaXN0b3J5X3ZhbHVlIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGFubm90YXRlX3ZhbHVlX2hpc3RvcnlfZW5kIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGFubm90YXRlX3ZhbHVlX2VuZCBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIGFubm90YXRlX2Rpc3BsYXlfYmVnaW4gUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfZGlzcGxheV9udW1iZXJfZW5kIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGFubm90YXRlX2Rpc3BsYXlfZm9ybWF0IFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGFubm90YXRlX2Rpc3BsYXlfZXhwcmVzc2lvbiBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBhbm5vdGF0ZV9kaXNwbGF5X2V4cHJlc3Npb25fZW5kIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGFubm90YXRlX2Rpc3BsYXlfdmFsdWUgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfZGlzcGxheV9lbmQgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCBhbm5vdGF0ZV9hcmdfYmVnaW4gUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfYXJnX25hbWVfZW5kIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGFubm90YXRlX2FyZ192YWx1ZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKSk7CitleHRlcm4gdm9pZCBhbm5vdGF0ZV9hcmdfZW5kIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfc291cmNlIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBpbnQsIGludCwgQ09SRV9BRERSKSk7CisKK2V4dGVybiB2b2lkIGFubm90YXRlX2ZyYW1lX2JlZ2luIFBBUkFNUyAoKGludCwgQ09SRV9BRERSKSk7CitleHRlcm4gdm9pZCBhbm5vdGF0ZV9mdW5jdGlvbl9jYWxsIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGFubm90YXRlX3NpZ25hbF9oYW5kbGVyX2NhbGxlciBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBhbm5vdGF0ZV9mcmFtZV9hZGRyZXNzIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGFubm90YXRlX2ZyYW1lX2FkZHJlc3NfZW5kIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGFubm90YXRlX2ZyYW1lX2Z1bmN0aW9uX25hbWUgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfZnJhbWVfYXJncyBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBhbm5vdGF0ZV9mcmFtZV9zb3VyY2VfYmVnaW4gUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfZnJhbWVfc291cmNlX2ZpbGUgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfZnJhbWVfc291cmNlX2ZpbGVfZW5kIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGFubm90YXRlX2ZyYW1lX3NvdXJjZV9saW5lIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGFubm90YXRlX2ZyYW1lX3NvdXJjZV9lbmQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfZnJhbWVfd2hlcmUgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfZnJhbWVfZW5kIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfYXJyYXlfc2VjdGlvbl9iZWdpbiBQQVJBTVMgKChpbnQsIHN0cnVjdCB0eXBlICopKTsKK2V4dGVybiB2b2lkIGFubm90YXRlX2VsdF9yZXAgUEFSQU1TICgodW5zaWduZWQgaW50KSk7CitleHRlcm4gdm9pZCBhbm5vdGF0ZV9lbHRfcmVwX2VuZCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBhbm5vdGF0ZV9lbHQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgYW5ub3RhdGVfYXJyYXlfc2VjdGlvbl9lbmQgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCAoKmFubm90YXRlX3N0YXJ0aW5nX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICgqYW5ub3RhdGVfc3RvcHBlZF9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCAoKmFubm90YXRlX3NpZ25hbGxlZF9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCAoKmFubm90YXRlX2V4aXRlZF9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CmRpZmYgLS1naXQgYS9nZGIvYXJjLXRkZXAuYyBiL2dkYi9hcmMtdGRlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOTU3NzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvYXJjLXRkZXAuYwpAQCAtMCwwICsxLDczMyBAQAorLyogQVJDIHRhcmdldC1kZXBlbmRlbnQgc3R1ZmYuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgImZsb2F0Zm9ybWF0LmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisKKy8qIEN1cnJlbnQgQ1BVLCBzZXQgd2l0aCB0aGUgInNldCBjcHUiIGNvbW1hbmQuICAqLworc3RhdGljIGludCBhcmNfYmZkX21hY2hfdHlwZTsKK2NoYXIgKmFyY19jcHVfdHlwZTsKK2NoYXIgKnRtcF9hcmNfY3B1X3R5cGU7CisKKy8qIFRhYmxlIG9mIGNwdSBuYW1lcy4gICovCitzdHJ1Y3QgeworICBjaGFyICpuYW1lOworICBpbnQgdmFsdWU7Cit9IGFyY19jcHVfdHlwZV90YWJsZVtdID0geworICB7ICJiYXNlIiwgYmZkX21hY2hfYXJjX2Jhc2UgfSwKKyAgeyBOVUxMLCAwIH0KK307CisKKy8qIFVzZWQgYnkgc2ltdWxhdG9yLiAgKi8KK2ludCBkaXNwbGF5X3BpcGVsaW5lX3A7CitpbnQgY3B1X3RpbWVyOworLyogVGhpcyBvbmUgbXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgdXNlZCBpbiB0aGUgZW11bGF0b3IuCisgICBJdCdzIGN1cnJlbnRseSBhbiBlbnVtIHNvIHRoaXMgc2hvdWxkIGJlIG9rIGZvciBub3cuICAqLworaW50IGRlYnVnX3BpcGVsaW5lX3A7CisKKyNkZWZpbmUgQVJDX0NBTExfU0FWRURfUkVHKHIpICgocikgPj0gMTYgJiYgKHIpIDwgMjQpCisKKyNkZWZpbmUgT1BNQVNLCTB4ZjgwMDAwMDAKKworLyogSW5zdHJ1Y3Rpb24gZmllbGQgYWNjZXNzb3IgbWFjcm9zLgorICAgU2VlIHRoZSBQcm9ncmFtbWVyJ3MgUmVmZXJlbmNlIE1hbnVhbC4gICovCisjZGVmaW5lIFhfT1AoaSkgKCgoaSkgPj4gMjcpICYgMHgxZikKKyNkZWZpbmUgWF9BKGkpICgoKGkpID4+IDIxKSAmIDB4M2YpCisjZGVmaW5lIFhfQihpKSAoKChpKSA+PiAxNSkgJiAweDNmKQorI2RlZmluZSBYX0MoaSkgKCgoaSkgPj4gOSkgJiAweDNmKQorI2RlZmluZSBYX0QoaSkgKCgoKGkpICYgMHgxZmYpIF4gMHgxMDApIC0gMHgxMDApCisjZGVmaW5lIFhfTChpKSAoKCgoKGkpID4+IDUpICYgMHgzZmZmZmMpIF4gMHgyMDAwMDApIC0gMHgyMDAwMDApCisjZGVmaW5lIFhfTihpKSAoKChpKSA+PiA1KSAmIDMpCisjZGVmaW5lIFhfUShpKSAoKGkpICYgMHgxZikKKworLyogUmV0dXJuIG5vbi16ZXJvIGlmIFggaXMgYSBzaG9ydCBpbW1lZGlhdGUgZGF0YSBpbmRpY2F0b3IuICAqLworI2RlZmluZSBTSElNTV9QKHgpICgoeCkgPT0gNjEgfHwgKHgpID09IDYzKQorCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgWCBpcyBhICJsb25nIiAoMzIgYml0KSBpbW1lZGlhdGUgZGF0YSBpbmRpY2F0b3IuICAqLworI2RlZmluZSBMSU1NX1AoeCkgKCh4KSA9PSA2MikKKworLyogQnVpbGQgYSBzaW1wbGUgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBCVUlMRF9JTlNOKG9wLCBhLCBiLCBjLCBkKSBcCisgICgoKChvcCkgJiAzMSkgPDwgMjcpIFwKKyAgIHwgKCgoYSkgJiA2MykgPDwgMjEpIFwKKyAgIHwgKCgoYikgJiA2MykgPDwgMTUpIFwKKyAgIHwgKCgoYykgJiA2MykgPDwgOSkgXAorICAgfCAoKGQpICYgNTExKSkKKwwKKy8qIENvZGVzdHJlYW0gc3R1ZmYuICAqLworc3RhdGljIHZvaWQgY29kZXN0cmVhbV9yZWFkIFBBUkFNUyAoKHVuc2lnbmVkIGludCAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIGNvZGVzdHJlYW1fc2VlayBQQVJBTVMgKChDT1JFX0FERFIpKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29kZXN0cmVhbV9maWxsIFBBUkFNUyAoKGludCkpOworCisjZGVmaW5lIENPREVTVFJFQU1fQlVGU0laIDE2IAorc3RhdGljIENPUkVfQUREUiBjb2Rlc3RyZWFtX25leHRfYWRkcjsKK3N0YXRpYyBDT1JFX0FERFIgY29kZXN0cmVhbV9hZGRyOworc3RhdGljIHVuc2lnbmVkIGludCBjb2Rlc3RyZWFtX2J1ZltDT0RFU1RSRUFNX0JVRlNJWl07CitzdGF0aWMgaW50IGNvZGVzdHJlYW1fb2ZmOworc3RhdGljIGludCBjb2Rlc3RyZWFtX2NudDsKKworI2RlZmluZSBjb2Rlc3RyZWFtX3RlbGwoKSBcCisgIChjb2Rlc3RyZWFtX2FkZHIgKyBjb2Rlc3RyZWFtX29mZiAqIHNpemVvZiAoY29kZXN0cmVhbV9idWZbMF0pKQorI2RlZmluZSBjb2Rlc3RyZWFtX3BlZWsoKSBcCisgIChjb2Rlc3RyZWFtX2NudCA9PSAwIFwKKyAgID8gY29kZXN0cmVhbV9maWxsICgxKSBcCisgICA6IGNvZGVzdHJlYW1fYnVmW2NvZGVzdHJlYW1fb2ZmXSkKKyNkZWZpbmUgY29kZXN0cmVhbV9nZXQoKSBcCisgIChjb2Rlc3RyZWFtX2NudC0tID09IDAgXAorICAgPyBjb2Rlc3RyZWFtX2ZpbGwgKDApIFwKKyAgIDogY29kZXN0cmVhbV9idWZbY29kZXN0cmVhbV9vZmYrK10pCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgCitjb2Rlc3RyZWFtX2ZpbGwgKHBlZWtfZmxhZykKKyAgICBpbnQgcGVla19mbGFnOworeworICBjb2Rlc3RyZWFtX2FkZHIgPSBjb2Rlc3RyZWFtX25leHRfYWRkcjsKKyAgY29kZXN0cmVhbV9uZXh0X2FkZHIgKz0gQ09ERVNUUkVBTV9CVUZTSVogKiBzaXplb2YgKGNvZGVzdHJlYW1fYnVmWzBdKTsKKyAgY29kZXN0cmVhbV9vZmYgPSAwOworICBjb2Rlc3RyZWFtX2NudCA9IENPREVTVFJFQU1fQlVGU0laOworICByZWFkX21lbW9yeSAoY29kZXN0cmVhbV9hZGRyLCAoY2hhciAqKSBjb2Rlc3RyZWFtX2J1ZiwKKwkgICAgICAgQ09ERVNUUkVBTV9CVUZTSVogKiBzaXplb2YgKGNvZGVzdHJlYW1fYnVmWzBdKSk7CisgIC8qIEZJWE1FOiBjaGVjayByZXR1cm4gY29kZT8gICovCisKKyAgLyogSGFuZGxlIGJ5dGUgb3JkZXIgZGlmZmVyZW5jZXMuICAqLworICBpZiAoSE9TVF9CWVRFX09SREVSICE9IFRBUkdFVF9CWVRFX09SREVSKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpLCBqLCBuID0gc2l6ZW9mIChjb2Rlc3RyZWFtX2J1ZlswXSk7CisgICAgICByZWdpc3RlciBjaGFyIHRtcCwgKnA7CisgICAgICBmb3IgKGkgPSAwLCBwID0gKGNoYXIgKikgY29kZXN0cmVhbV9idWY7IGkgPCBDT0RFU1RSRUFNX0JVRlNJWjsKKwkgICArK2ksIHAgKz0gbikKKwlmb3IgKGogPSAwOyBqIDwgbiAvIDI7ICsraikKKwkgIHRtcCA9IHBbal0sIHBbal0gPSBwW24gLSAxIC0gal0sIHBbbiAtIDEgLSBqXSA9IHRtcDsKKyAgICB9CisgIAorICBpZiAocGVla19mbGFnKQorICAgIHJldHVybiBjb2Rlc3RyZWFtX3BlZWsgKCk7CisgIGVsc2UKKyAgICByZXR1cm4gY29kZXN0cmVhbV9nZXQgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitjb2Rlc3RyZWFtX3NlZWsgKHBsYWNlKQorICAgIENPUkVfQUREUiBwbGFjZTsKK3sKKyAgY29kZXN0cmVhbV9uZXh0X2FkZHIgPSBwbGFjZSAvIENPREVTVFJFQU1fQlVGU0laOworICBjb2Rlc3RyZWFtX25leHRfYWRkciAqPSBDT0RFU1RSRUFNX0JVRlNJWjsKKyAgY29kZXN0cmVhbV9jbnQgPSAwOworICBjb2Rlc3RyZWFtX2ZpbGwgKDEpOworICB3aGlsZSAoY29kZXN0cmVhbV90ZWxsICgpICE9IHBsYWNlKQorICAgIGNvZGVzdHJlYW1fZ2V0ICgpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSB1bnVzZWQgYnV0IGxlYXZlIGluIGZvciBub3cuICAqLworCitzdGF0aWMgdm9pZAorY29kZXN0cmVhbV9yZWFkIChidWYsIGNvdW50KQorICAgICB1bnNpZ25lZCBpbnQgKmJ1ZjsKKyAgICAgaW50IGNvdW50OworeworICB1bnNpZ25lZCBpbnQgKnA7CisgIGludCBpOworICBwID0gYnVmOworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAqcCsrID0gY29kZXN0cmVhbV9nZXQgKCk7Cit9CisMCisvKiBTZXQgdXAgcHJvbG9ndWUgc2Nhbm5pbmcgYW5kIHJldHVybiB0aGUgZmlyc3QgaW5zbi4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3NldHVwX3Byb2xvZ3VlX3NjYW4gKHBjKQorICAgICBDT1JFX0FERFIgcGM7Cit7CisgIHVuc2lnbmVkIGludCBpbnNuOworCisgIGNvZGVzdHJlYW1fc2VlayAocGMpOworICBpbnNuID0gY29kZXN0cmVhbV9nZXQgKCk7CisKKyAgcmV0dXJuIGluc247Cit9CisKKy8qCisgKiBGaW5kICYgcmV0dXJuIGFtb3VudCBhIGxvY2FsIHNwYWNlIGFsbG9jYXRlZCwgYW5kIGFkdmFuY2UgY29kZXN0cmVhbSB0bworICogZmlyc3QgcmVnaXN0ZXIgcHVzaCAoaWYgYW55KS4KKyAqIElmIGVudHJ5IHNlcXVlbmNlIGRvZXNuJ3QgbWFrZSBzZW5zZSwgcmV0dXJuIC0xLCBhbmQgbGVhdmUgCisgKiBjb2Rlc3RyZWFtIHBvaW50ZXIgcmFuZG9tLgorICovCisKK3N0YXRpYyBsb25nCithcmNfZ2V0X2ZyYW1lX3NldHVwIChwYykKKyAgICAgQ09SRV9BRERSIHBjOworeworICB1bnNpZ25lZCBpbnQgaW5zbjsKKyAgLyogU2l6ZSBvZiBmcmFtZSBvciAtMSBpZiB1bnJlY29nbml6YWJsZSBwcm9sb2d1ZS4gICovCisgIGludCBmcmFtZV9zaXplID0gLTE7CisgIC8qIEFuIGluaXRpYWwgInN1YiBzcCxzcCxOIiBtYXkgb3IgbWF5IG5vdCBiZSBmb3IgYSBzdGRhcmcgZm4uICAqLworICBpbnQgbWF5YmVfc3RkYXJnX2RlY3IgPSAtMTsKKworICBpbnNuID0gc2V0dXBfcHJvbG9ndWVfc2NhbiAocGMpOworCisgIC8qIFRoZSBhdXRob3JpdHkgZm9yIHdoYXQgYXBwZWFycyBoZXJlIGlzIHRoZSBob21lLWdyb3duIEFCSS4KKyAgICAgVGhlIG1vc3QgcmVjZW50IHZlcnNpb24gaXMgMS4yLiAgKi8KKworICAvKiBGaXJzdCBpbnNuIG1heSBiZSAic3ViIHNwLHNwLE4iIGlmIHN0ZGFyZyBmbi4gICovCisgIGlmICgoaW5zbiAmIEJVSUxEX0lOU04gKC0xLCAtMSwgLTEsIC0xLCAwKSkKKyAgICAgID09IEJVSUxEX0lOU04gKDEwLCBTUF9SRUdOVU0sIFNQX1JFR05VTSwgU0hJTU1fUkVHTlVNLCAwKSkKKyAgICB7CisgICAgICBtYXliZV9zdGRhcmdfZGVjciA9IFhfRCAoaW5zbik7CisgICAgICBpbnNuID0gY29kZXN0cmVhbV9nZXQgKCk7CisgICAgfQorCisgIGlmICgoaW5zbiAmIEJVSUxEX0lOU04gKC0xLCAwLCAtMSwgLTEsIC0xKSkJLyogc3QgYmxpbmssW3NwLDRdICovCisgICAgICA9PSBCVUlMRF9JTlNOICgyLCAwLCBTUF9SRUdOVU0sIEJMSU5LX1JFR05VTSwgNCkpCisgICAgeworICAgICAgaW5zbiA9IGNvZGVzdHJlYW1fZ2V0ICgpOworICAgICAgLyogRnJhbWUgbWF5IG5vdCBiZSBuZWNlc3NhcnksIGV2ZW4gdGhvdWdoIGJsaW5rIGlzIHNhdmVkLgorCSBBdCBsZWFzdCB0aGlzIGlzIHNvbWV0aGluZyB3ZSByZWNvZ25pemUuICAqLworICAgICAgZnJhbWVfc2l6ZSA9IDA7CisgICAgfQorCisgIGlmICgoaW5zbiAmIEJVSUxEX0lOU04gKC0xLCAwLCAtMSwgLTEsIC0xKSkJCS8qIHN0IGZwLFtzcF0gKi8KKyAgICAgID09IEJVSUxEX0lOU04gKDIsIDAsIFNQX1JFR05VTSwgRlBfUkVHTlVNLCAwKSkKKyAgICB7CQorICAgICAgaW5zbiA9IGNvZGVzdHJlYW1fZ2V0ICgpOworICAgICAgaWYgKChpbnNuICYgQlVJTERfSU5TTiAoLTEsIC0xLCAtMSwgLTEsIDApKQorCSAgICAgICAhPSBCVUlMRF9JTlNOICgxMiwgRlBfUkVHTlVNLCBTUF9SRUdOVU0sIFNQX1JFR05VTSwgMCkpCisJcmV0dXJuIC0xOworCisgICAgICAvKiBDaGVjayBmb3Igc3RhY2sgYWRqdXN0bWVudCBzdWIgc3Asc3AsTi4gICovCisgICAgICBpbnNuID0gY29kZXN0cmVhbV9wZWVrICgpOworICAgICAgaWYgKChpbnNuICYgQlVJTERfSU5TTiAoLTEsIC0xLCAtMSwgMCwgMCkpCisJICA9PSBCVUlMRF9JTlNOICgxMCwgU1BfUkVHTlVNLCBTUF9SRUdOVU0sIDAsIDApKQorCXsKKwkgIGlmIChMSU1NX1AgKFhfQyAoaW5zbikpKQorCSAgICBmcmFtZV9zaXplID0gY29kZXN0cmVhbV9nZXQgKCk7CisJICBlbHNlIGlmIChTSElNTV9QIChYX0MgKGluc24pKSkKKwkgICAgZnJhbWVfc2l6ZSA9IFhfRCAoaW5zbik7CisJICBlbHNlCisJICAgIHJldHVybiAtMTsKKwkgIGlmIChmcmFtZV9zaXplIDwgMCkKKwkgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgY29kZXN0cmVhbV9nZXQgKCk7CisKKwkgIC8qIFRoaXMgc2VxdWVuY2UgaXMgdXNlZCB0byBnZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHJldHVybgorCSAgICAgYnVmZmVyIGZvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHN0cnVjdHVyZS4gICovCisJICBpbnNuID0gY29kZXN0cmVhbV9wZWVrICgpOworCSAgaWYgKGluc24gJiBPUE1BU0sgPT0gMHg2MDAwMDAwMCkKKwkgICAgY29kZXN0cmVhbV9nZXQgKCk7CisJfQorICAgICAgLyogRnJhbWVsZXNzIGZuLiAgKi8KKyAgICAgIGVsc2UKKwl7CisJICBmcmFtZV9zaXplID0gMDsKKwl9CisgICAgfQorCisgIC8qIElmIHdlIGZvdW5kIGEgInN1YiBzcCxzcCxOIiBhbmQgbm90aGluZyBlbHNlLCBpdCBtYXkgb3IgbWF5IG5vdCBiZSBhCisgICAgIHN0ZGFyZyBmbi4gIFRoZSBzdGRhcmcgZGVjcmVtZW50IGlzIG5vdCB0cmVhdGVkIGFzIHBhcnQgb2YgdGhlIGZyYW1lIHNpemUsCisgICAgIHNvIHdlIGhhdmUgYSBkaWxlbW1hOiB3aGF0IGRvIHdlIHJldHVybj8gIEZvciBub3csIGlmIHdlIGdldCBhCisgICAgICJzdWIgc3Asc3AsTiIgYW5kIG5vdGhpbmcgZWxzZSBhc3N1bWUgdGhpcyBpc24ndCBhIHN0ZGFyZyBmbi4gIE9uZSB3YXkKKyAgICAgdG8gZml4IHRoaXMgY29tcGxldGVseSB3b3VsZCBiZSB0byBhZGQgYSBiaXQgdG8gdGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3IKKyAgICAgdGhhdCBzYXlzIHRoZSBmdW5jdGlvbiBpcyBhIHN0ZGFyZyBmdW5jdGlvbi4gICovCisKKyAgaWYgKGZyYW1lX3NpemUgPCAwICYmIG1heWJlX3N0ZGFyZ19kZWNyID4gMCkKKyAgICByZXR1cm4gbWF5YmVfc3RkYXJnX2RlY3I7CisgIHJldHVybiBmcmFtZV9zaXplOworfQorCisvKiBHaXZlbiBhIHBjIHZhbHVlLCBza2lwIGl0IGZvcndhcmQgcGFzdCB0aGUgZnVuY3Rpb24gcHJvbG9ndWUgYnkKKyAgIGRpc2Fzc2VtYmxpbmcgaW5zdHJ1Y3Rpb25zIHRoYXQgYXBwZWFyIHRvIGJlIGEgcHJvbG9ndWUuCisKKyAgIElmIEZSQU1FTEVTU19QIGlzIHNldCwgd2UgYXJlIG9ubHkgdGVzdGluZyB0byBzZWUgaWYgdGhlIGZ1bmN0aW9uCisgICBpcyBmcmFtZWxlc3MuICBJZiBpdCBpcyBhIGZyYW1lbGVzcyBmdW5jdGlvbiwgcmV0dXJuIFBDIHVuY2hhbmdlZC4KKyAgIFRoaXMgYWxsb3dzIGEgcXVpY2tlciBhbnN3ZXIuICAqLworCitDT1JFX0FERFIKK3NraXBfcHJvbG9ndWUgKHBjLCBmcmFtZWxlc3NfcCkKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBpbnQgZnJhbWVsZXNzX3A7Cit7CisgIHVuc2lnbmVkIGludCBpbnNuOworICBpbnQgaSwgZnJhbWVfc2l6ZTsKKworICBpZiAoKGZyYW1lX3NpemUgPSBhcmNfZ2V0X2ZyYW1lX3NldHVwIChwYykpIDwgMCkKKyAgICByZXR1cm4gKHBjKTsKKworICBpZiAoZnJhbWVsZXNzX3ApCisgICAgcmV0dXJuIGZyYW1lX3NpemUgPT0gMCA/IHBjIDogY29kZXN0cmVhbV90ZWxsICgpOworCisgIC8qIFNraXAgb3ZlciByZWdpc3RlciBzYXZlcy4gICovCisgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgeworICAgICAgaW5zbiA9IGNvZGVzdHJlYW1fcGVlayAoKTsKKyAgICAgIGlmICgoaW5zbiAmIEJVSUxEX0lOU04gKC0xLCAwLCAtMSwgMCwgMCkpCisJICAhPSBCVUlMRF9JTlNOICgyLCAwLCBTUF9SRUdOVU0sIDAsIDApKQorCWJyZWFrOyAvKiBub3Qgc3QgaW5zbiAqLworICAgICAgaWYgKCEgQVJDX0NBTExfU0FWRURfUkVHIChYX0MgKGluc24pKSkKKwlicmVhazsKKyAgICAgIGNvZGVzdHJlYW1fZ2V0ICgpOworICAgIH0KKworICByZXR1cm4gY29kZXN0cmVhbV90ZWxsICgpOworfQorCisvKiBSZXR1cm4gdGhlIHJldHVybiBhZGRyZXNzIGZvciBhIGZyYW1lLgorICAgVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCBGUkFNRV9TQVZFRF9QQy4KKyAgIFRoaXMgaXMgdGFrZW4gZnJvbSBmcmFtZWxlc3NfbG9va19mb3JfcHJvbG9ndWUuICAqLworCitDT1JFX0FERFIKK2FyY19mcmFtZV9zYXZlZF9wYyAoZnJhbWUpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgQ09SRV9BRERSIGZ1bmNfc3RhcnQ7CisgIHVuc2lnbmVkIGludCBpbnNuOworCisgIGZ1bmNfc3RhcnQgPSBnZXRfcGNfZnVuY3Rpb25fc3RhcnQgKGZyYW1lLT5wYykgKyBGVU5DVElPTl9TVEFSVF9PRkZTRVQ7CisgIGlmIChmdW5jX3N0YXJ0ID09IDApCisgICAgeworICAgICAgLyogQmVzdCBndWVzcy4gICovCisgICAgICByZXR1cm4gQVJDX1BDX1RPX1JFQUxfQUREUkVTUyAocmVhZF9tZW1vcnlfaW50ZWdlciAoRlJBTUVfRlAgKGZyYW1lKSArIDQsIDQpKTsKKyAgICB9CisKKyAgLyogVGhlIGF1dGhvcml0eSBmb3Igd2hhdCBhcHBlYXJzIGhlcmUgaXMgdGhlIGhvbWUtZ3Jvd24gQUJJLgorICAgICBUaGUgbW9zdCByZWNlbnQgdmVyc2lvbiBpcyAxLjIuICAqLworCisgIGluc24gPSBzZXR1cF9wcm9sb2d1ZV9zY2FuIChmdW5jX3N0YXJ0KTsKKworICAvKiBGaXJzdCBpbnNuIG1heSBiZSAic3ViIHNwLHNwLE4iIGlmIHN0ZGFyZyBmbi4gICovCisgIGlmICgoaW5zbiAmIEJVSUxEX0lOU04gKC0xLCAtMSwgLTEsIC0xLCAwKSkKKyAgICAgID09IEJVSUxEX0lOU04gKDEwLCBTUF9SRUdOVU0sIFNQX1JFR05VTSwgU0hJTU1fUkVHTlVNLCAwKSkKKyAgICBpbnNuID0gY29kZXN0cmVhbV9nZXQgKCk7CisKKyAgLyogSWYgdGhlIG5leHQgaW5zbiBpcyAic3QgYmxpbmssW3NwLDRdIiB3ZSBjYW4gZ2V0IGJsaW5rIGZyb20gdGhlcmUuCisgICAgIE90aGVyd2lzZSB0aGlzIGlzIGEgbGVhZiBmdW5jdGlvbiBhbmQgd2UgY2FuIHVzZSBibGluay4gIE5vdGUgdGhhdAorICAgICB0aGlzIHN0aWxsIGFsbG93cyBmb3IgdGhlIGNhc2Ugd2hlcmUgYSBsZWFmIGZ1bmN0aW9uIHNhdmVzL2Nsb2JiZXJzLworICAgICByZXN0b3JlcyBibGluay4gICovCisKKyAgaWYgKChpbnNuICYgQlVJTERfSU5TTiAoLTEsIDAsIC0xLCAtMSwgLTEpKQkvKiBzdCBibGluayxbc3AsNF0gKi8KKyAgICAgICE9IEJVSUxEX0lOU04gKDIsIDAsIFNQX1JFR05VTSwgQkxJTktfUkVHTlVNLCA0KSkKKyAgICByZXR1cm4gQVJDX1BDX1RPX1JFQUxfQUREUkVTUyAocmVhZF9yZWdpc3RlciAoQkxJTktfUkVHTlVNKSk7CisgIGVsc2UKKyAgICByZXR1cm4gQVJDX1BDX1RPX1JFQUxfQUREUkVTUyAocmVhZF9tZW1vcnlfaW50ZWdlciAoRlJBTUVfRlAgKGZyYW1lKSArIDQsIDQpKTsKK30KKworLyoKKyAqIFBhcnNlIHRoZSBmaXJzdCBmZXcgaW5zdHJ1Y3Rpb25zIG9mIHRoZSBmdW5jdGlvbiB0byBzZWUKKyAqIHdoYXQgcmVnaXN0ZXJzIHdlcmUgc3RvcmVkLgorICoKKyAqIFRoZSBzdGFydHVwIHNlcXVlbmNlIGNhbiBiZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLgorICogJ3N0IGJsaW5rLFtzcCs0XSwgc3QgZnAsW3NwXSwgbW92IGZwLHNwJyAKKyAqCisgKiBMb2NhbCBzcGFjZSBpcyBhbGxvY2F0ZWQganVzdCBiZWxvdyBieSBzdWIgc3Asc3Asbm5uLgorICogTmV4dCwgdGhlIHJlZ2lzdGVycyB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gYXJlIHN0b3JlZCAoYXMgb2Zmc2V0cyBmcm9tIHNwKS4KKyAqLworCit2b2lkCitmcmFtZV9maW5kX3NhdmVkX3JlZ3MgKGZpcCwgZnNycCkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpcDsKKyAgICAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKmZzcnA7Cit7CisgIGxvbmcgbG9jYWxzOworICB1bnNpZ25lZCBpbnQgaW5zbjsKKyAgQ09SRV9BRERSIGR1bW15X2JvdHRvbTsKKyAgQ09SRV9BRERSIGFkcjsKKyAgaW50IGksIHJlZ251bSwgb2Zmc2V0OworCisgIG1lbXNldCAoZnNycCwgMCwgc2l6ZW9mICpmc3JwKTsKKworICAvKiBJZiBmcmFtZSBpcyB0aGUgZW5kIG9mIGEgZHVtbXksIGNvbXB1dGUgd2hlcmUgdGhlIGJlZ2lubmluZyB3b3VsZCBiZS4gICovCisgIGR1bW15X2JvdHRvbSA9IGZpcC0+ZnJhbWUgLSA0IC0gUkVHSVNURVJfQllURVMgLSBDQUxMX0RVTU1ZX0xFTkdUSDsKKworICAvKiBDaGVjayBpZiB0aGUgUEMgaXMgaW4gdGhlIHN0YWNrLCBpbiBhIGR1bW15IGZyYW1lLiAgKi8KKyAgaWYgKGR1bW15X2JvdHRvbSA8PSBmaXAtPnBjICYmIGZpcC0+cGMgPD0gZmlwLT5mcmFtZSkgCisgICAgeworICAgICAgLyogYWxsIHJlZ3Mgd2VyZSBzYXZlZCBieSBwdXNoX2NhbGxfZHVtbXkgKCkgKi8KKyAgICAgIGFkciA9IGZpcC0+ZnJhbWU7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1JFR1M7IGkrKykgCisJeworCSAgYWRyIC09IFJFR0lTVEVSX1JBV19TSVpFIChpKTsKKwkgIGZzcnAtPnJlZ3NbaV0gPSBhZHI7CisJfQorICAgICAgcmV0dXJuOworICAgIH0KKworICBsb2NhbHMgPSBhcmNfZ2V0X2ZyYW1lX3NldHVwIChnZXRfcGNfZnVuY3Rpb25fc3RhcnQgKGZpcC0+cGMpKTsKKworICBpZiAobG9jYWxzID49IDApIAorICAgIHsKKyAgICAgIC8qIFNldCBgYWRyJyB0byB0aGUgdmFsdWUgb2YgYHNwJy4gICovCisgICAgICBhZHIgPSBmaXAtPmZyYW1lIC0gbG9jYWxzOworICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJICBpbnNuID0gY29kZXN0cmVhbV9nZXQgKCk7CisJICBpZiAoKGluc24gJiBCVUlMRF9JTlNOICgtMSwgMCwgLTEsIDAsIDApKQorCSAgICAgICAhPSBCVUlMRF9JTlNOICgyLCAwLCBTUF9SRUdOVU0sIDAsIDApKQorCSAgICBicmVhazsKKyAgICAgICAgICByZWdudW0gPSBYX0MgKGluc24pOworCSAgb2Zmc2V0ID0gWF9EIChpbnNuKTsKKwkgIGZzcnAtPnJlZ3NbcmVnbnVtXSA9IGFkciArIG9mZnNldDsKKwl9CisgICAgfQorCisgIGZzcnAtPnJlZ3NbUENfUkVHTlVNXSA9IGZpcC0+ZnJhbWUgKyA0OworICBmc3JwLT5yZWdzW0ZQX1JFR05VTV0gPSBmaXAtPmZyYW1lOworfQorCit2b2lkCitwdXNoX2R1bW15X2ZyYW1lICgpCit7CisgIENPUkVfQUREUiBzcCA9IHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSk7CisgIGludCByZWdudW07CisgIGNoYXIgcmVnYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisKKyAgcmVhZF9yZWdpc3Rlcl9nZW4gKFBDX1JFR05VTSwgcmVnYnVmKTsKKyAgd3JpdGVfbWVtb3J5IChzcCs0LCByZWdidWYsIFJFR0lTVEVSX1NJWkUpOworICByZWFkX3JlZ2lzdGVyX2dlbiAoRlBfUkVHTlVNLCByZWdidWYpOworICB3cml0ZV9tZW1vcnkgKHNwLCByZWdidWYsIFJFR0lTVEVSX1NJWkUpOworICB3cml0ZV9yZWdpc3RlciAoRlBfUkVHTlVNLCBzcCk7CisgIGZvciAocmVnbnVtID0gMDsgcmVnbnVtIDwgTlVNX1JFR1M7IHJlZ251bSsrKQorICAgIHsKKyAgICAgIHJlYWRfcmVnaXN0ZXJfZ2VuIChyZWdudW0sIHJlZ2J1Zik7CisgICAgICBzcCA9IHB1c2hfYnl0ZXMgKHNwLCByZWdidWYsIFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pKTsKKyAgICB9CisgIHNwICs9ICgyKlJFR0lTVEVSX1NJWkUpOworICB3cml0ZV9yZWdpc3RlciAoU1BfUkVHTlVNLCBzcCk7Cit9CisKK3ZvaWQKK3BvcF9mcmFtZSAoKQoreworICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWUgPSBnZXRfY3VycmVudF9mcmFtZSAoKTsKKyAgQ09SRV9BRERSIGZwOworICBpbnQgcmVnbnVtOworICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyBmc3I7CisgIGNoYXIgcmVnYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisgIAorICBmcCA9IEZSQU1FX0ZQIChmcmFtZSk7CisgIGdldF9mcmFtZV9zYXZlZF9yZWdzIChmcmFtZSwgJmZzcik7CisgIGZvciAocmVnbnVtID0gMDsgcmVnbnVtIDwgTlVNX1JFR1M7IHJlZ251bSsrKSAKKyAgICB7CisgICAgICBDT1JFX0FERFIgYWRyOworICAgICAgYWRyID0gZnNyLnJlZ3NbcmVnbnVtXTsKKyAgICAgIGlmIChhZHIpCisJeworCSAgcmVhZF9tZW1vcnkgKGFkciwgcmVnYnVmLCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbnVtKSk7CisJICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSAocmVnbnVtKSwgcmVnYnVmLAorCQkJCVJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pKTsKKwl9CisgICAgfQorICB3cml0ZV9yZWdpc3RlciAoRlBfUkVHTlVNLCByZWFkX21lbW9yeV9pbnRlZ2VyIChmcCwgNCkpOworICB3cml0ZV9yZWdpc3RlciAoUENfUkVHTlVNLCByZWFkX21lbW9yeV9pbnRlZ2VyIChmcCArIDQsIDQpKTsKKyAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgZnAgKyA4KTsKKyAgZmx1c2hfY2FjaGVkX2ZyYW1lcyAoKTsKK30KKwwKKy8qIFNpbXVsYXRlIHNpbmdsZS1zdGVwLiAgKi8KKwordHlwZWRlZiBlbnVtCit7CisgIE5PUk1BTDQsIC8qIGEgbm9ybWFsIDQgYnl0ZSBpbnNuICovCisgIE5PUk1BTDgsIC8qIGEgbm9ybWFsIDggYnl0ZSBpbnNuICovCisgIEJSQU5DSDQsIC8qIGEgNCBieXRlIGJyYW5jaCBpbnNuLCBpbmNsdWRpbmcgb25lcyB3aXRob3V0IGRlbGF5IHNsb3RzICovCisgIEJSQU5DSDgsIC8qIGFuIDggYnl0ZSBicmFuY2ggaW5zbiwgaW5jbHVkaW5nIG9uZXMgd2l0aCBkZWxheSBzbG90cyAqLworfSBpbnNuX3R5cGU7CisKKy8qIFJldHVybiB0aGUgdHlwZSBvZiBJTlNOIGFuZCBzdG9yZSBpbiBUQVJHRVQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgYQorICAgYnJhbmNoIGlmIHRoaXMgaXMgb25lLiAgKi8KKy8qID8/PyBOZWVkIHRvIHZlcmlmeSBhbGwgY2FzZXMgYXJlIHByb3Blcmx5IGhhbmRsZWQuICAqLworCitzdGF0aWMgaW5zbl90eXBlCitnZXRfaW5zbl90eXBlIChpbnNuLCBwYywgdGFyZ2V0KQorICAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgIENPUkVfQUREUiBwYywgKnRhcmdldDsKK3sKKyAgdW5zaWduZWQgbG9uZyBsaW1tOworCisgIHN3aXRjaCAoaW5zbiA+PiAyNykKKyAgICB7CisgICAgY2FzZSAwIDogY2FzZSAxIDogY2FzZSAyIDogLyogbG9hZC9zdG9yZSBpbnNucyAqLworICAgICAgaWYgKExJTU1fUCAoWF9BIChpbnNuKSkKKwkgIHx8IExJTU1fUCAoWF9CIChpbnNuKSkKKwkgIHx8IExJTU1fUCAoWF9DIChpbnNuKSkpCisJcmV0dXJuIE5PUk1BTDg7CisgICAgICByZXR1cm4gTk9STUFMNDsKKyAgICBjYXNlIDQgOiBjYXNlIDUgOiBjYXNlIDYgOiAvKiBicmFuY2ggaW5zbnMgKi8KKyAgICAgICp0YXJnZXQgPSBwYyArIDQgKyBYX0wgKGluc24pOworICAgICAgLyogPz8/IEl0IGlzbid0IGNsZWFyIHRoYXQgdGhpcyBpcyBhbHdheXMgdGhlIHJpZ2h0IGFuc3dlci4KKwkgVGhlIHByb2JsZW0gb2NjdXJzIHdoZW4gdGhlIG5leHQgaW5zbiBpcyBhbiA4IGJ5dGUgaW5zbi4gIElmIHRoZQorCSBicmFuY2ggaXMgY29uZGl0aW9uYWwgdGhlcmUncyBubyB3b3JyeSBhcyB0aGVyZSBzaG91bGRuJ3QgYmUgYW4gOAorCSBieXRlIGluc24gZm9sbG93aW5nLiAgVGhlIHByb2dyYW1tZXIgbWF5IGJlIGNoZWF0aW5nIGlmIHMvaGUga25vd3MKKwkgdGhlIGJyYW5jaCB3aWxsIG5ldmVyIGJlIHRha2VuLCBidXQgd2UgZG9uJ3QgZGVhbCB3aXRoIHRoYXQuCisJIE5vdGUgdGhhdCB0aGUgcHJvZ3JhbW1lciBpcyBhbHNvIGFsbG93ZWQgdG8gcGxheSBnYW1lcyBieSBwdXR0aW5nCisJIGFuIGluc24gd2l0aCBsb25nIGltbWVkaWF0ZSBkYXRhIGluIHRoZSBkZWxheSBzbG90IGFuZCB0aGVuIGR1cGxpY2F0ZQorCSB0aGUgbG9uZyBpbW1lZGlhdGUgZGF0YSBhdCB0aGUgYnJhbmNoIHRhcmdldC4gIFVnaCEgICovCisgICAgICBpZiAoWF9OIChpbnNuKSA9PSAwKQorCXJldHVybiBCUkFOQ0g0OworICAgICAgcmV0dXJuIEJSQU5DSDg7CisgICAgY2FzZSA3IDogLyoganVtcCBpbnNucyAqLworICAgICAgaWYgKExJTU1fUCAoWF9CIChpbnNuKSkpCisJeworCSAgbGltbSA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjICsgNCwgNCk7CisJICAqdGFyZ2V0ID0gQVJDX1BDX1RPX1JFQUxfQUREUkVTUyAobGltbSk7CisJICByZXR1cm4gQlJBTkNIODsKKwl9CisgICAgICBpZiAoU0hJTU1fUCAoWF9CIChpbnNuKSkpCisJKnRhcmdldCA9IEFSQ19QQ19UT19SRUFMX0FERFJFU1MgKFhfRCAoaW5zbikpOworICAgICAgZWxzZQorCSp0YXJnZXQgPSBBUkNfUENfVE9fUkVBTF9BRERSRVNTIChyZWFkX3JlZ2lzdGVyIChYX0IgKGluc24pKSk7CisgICAgICBpZiAoWF9RIChpbnNuKSA9PSAwICYmIFhfTiAoaW5zbikgPT0gMCkKKwlyZXR1cm4gQlJBTkNINDsKKyAgICAgIHJldHVybiBCUkFOQ0g4OworICAgIGRlZmF1bHQgOiAvKiBhcml0aG1ldGljIGluc25zLCBldGMuICovCisgICAgICBpZiAoTElNTV9QIChYX0EgKGluc24pKQorCSAgfHwgTElNTV9QIChYX0IgKGluc24pKQorCSAgfHwgTElNTV9QIChYX0MgKGluc24pKSkKKwlyZXR1cm4gTk9STUFMODsKKyAgICAgIHJldHVybiBOT1JNQUw0OworICAgIH0KK30KKworLyogc2luZ2xlX3N0ZXAoKSBpcyBjYWxsZWQganVzdCBiZWZvcmUgd2Ugd2FudCB0byByZXN1bWUgdGhlIGluZmVyaW9yLCBpZiB3ZQorICAgd2FudCB0byBzaW5nbGUtc3RlcCBpdCBidXQgdGhlcmUgaXMgbm8gaGFyZHdhcmUgb3Iga2VybmVsIHNpbmdsZS1zdGVwCisgICBzdXBwb3J0LiAgV2UgZmluZCBhbGwgdGhlIHBvc3NpYmxlIHRhcmdldHMgb2YgdGhlIGNvbWluZyBpbnN0cnVjdGlvbiBhbmQKKyAgIGJyZWFrcG9pbnQgdGhlbS4KKworICAgc2luZ2xlX3N0ZXAgaXMgYWxzbyBjYWxsZWQganVzdCBhZnRlciB0aGUgaW5mZXJpb3Igc3RvcHMuICBJZiB3ZSBoYWQKKyAgIHNldCB1cCBhIHNpbXVsYXRlZCBzaW5nbGUtc3RlcCwgd2UgdW5kbyBvdXIgZGFtYWdlLiAgKi8KKwordm9pZAorYXJjX3NvZnR3YXJlX3NpbmdsZV9zdGVwIChpZ25vcmUsIGluc2VydF9icmVha3BvaW50c19wKQorICAgICBlbnVtIHRhcmdldF9zaWduYWwgaWdub3JlOyAvKiBzaWcgYnV0IHdlIGRvbid0IG5lZWQgaXQgKi8KKyAgICAgaW50IGluc2VydF9icmVha3BvaW50c19wOworeworICBzdGF0aWMgQ09SRV9BRERSIG5leHRfcGMsIHRhcmdldDsKKyAgc3RhdGljIGludCBicmt0cmdfcDsKKyAgdHlwZWRlZiBjaGFyIGJpbnNuX3F1YW50dW1bQlJFQUtQT0lOVF9NQVhdOworICBzdGF0aWMgYmluc25fcXVhbnR1bSBicmVha19tZW1bMl07CisKKyAgaWYgKGluc2VydF9icmVha3BvaW50c19wKQorICAgIHsKKyAgICAgIGluc25fdHlwZSB0eXBlOworICAgICAgQ09SRV9BRERSIHBjOworICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOworCisgICAgICBwYyA9IHJlYWRfcmVnaXN0ZXIgKFBDX1JFR05VTSk7CisgICAgICBpbnNuID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDQpOworICAgICAgdHlwZSA9IGdldF9pbnNuX3R5cGUgKGluc24sIHBjLCAmdGFyZ2V0KTsKKworICAgICAgLyogQWx3YXlzIHNldCBhIGJyZWFrcG9pbnQgZm9yIHRoZSBpbnNuIGFmdGVyIHRoZSBicmFuY2guICAqLworICAgICAgbmV4dF9wYyA9IHBjICsgKCh0eXBlID09IE5PUk1BTDggfHwgdHlwZSA9PSBCUkFOQ0g4KSA/IDggOiA0KTsKKyAgICAgIHRhcmdldF9pbnNlcnRfYnJlYWtwb2ludCAobmV4dF9wYywgYnJlYWtfbWVtWzBdKTsKKworICAgICAgYnJrdHJnX3AgPSAwOworCisgICAgICBpZiAoKHR5cGUgPT0gQlJBTkNINCB8fCB0eXBlID09IEJSQU5DSDgpCisJICAvKiBXYXRjaCBvdXQgZm9yIGJyYW5jaGVzIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb24uCisJICAgICBXZSBqdXN0IHN0b3JlZCBhIGJyZWFrcG9pbnQgdGhlcmUgYW5kIGFub3RoZXIgY2FsbCB0bworCSAgICAgdGFyZ2V0X2luc2VydF9icmVha3BvaW50IHdpbGwgdGhpbmsgdGhlIHJlYWwgaW5zbiBpcyB0aGUKKwkgICAgIGJyZWFrcG9pbnQgd2UganVzdCBzdG9yZWQgdGhlcmUuICAqLworCSAgJiYgdGFyZ2V0ICE9IG5leHRfcGMpCisJeworCSAgYnJrdHJnX3AgPSAxOworCSAgdGFyZ2V0X2luc2VydF9icmVha3BvaW50ICh0YXJnZXQsIGJyZWFrX21lbVsxXSk7CisJfQorCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogUmVtb3ZlIGJyZWFrcG9pbnRzLiAgKi8KKyAgICAgIHRhcmdldF9yZW1vdmVfYnJlYWtwb2ludCAobmV4dF9wYywgYnJlYWtfbWVtWzBdKTsKKworICAgICAgaWYgKGJya3RyZ19wKQorCXRhcmdldF9yZW1vdmVfYnJlYWtwb2ludCAodGFyZ2V0LCBicmVha19tZW1bMV0pOworCisgICAgICAvKiBGaXggdGhlIHBjLiAgKi8KKyAgICAgIHN0b3BfcGMgLT0gREVDUl9QQ19BRlRFUl9CUkVBSzsKKyAgICAgIHdyaXRlX3BjIChzdG9wX3BjKTsKKyAgICB9Cit9CisMCisjaWZkZWYgR0VUX0xPTkdKTVBfVEFSR0VUCisvKiBGaWd1cmUgb3V0IHdoZXJlIHRoZSBsb25nam1wIHdpbGwgbGFuZC4gIFNsdXJwIHRoZSBhcmdzIG91dCBvZiB0aGUgc3RhY2suCisgICBXZSBleHBlY3QgdGhlIGZpcnN0IGFyZyB0byBiZSBhIHBvaW50ZXIgdG8gdGhlIGptcF9idWYgc3RydWN0dXJlIGZyb20gd2hpY2gKKyAgIHdlIGV4dHJhY3QgdGhlIHBjIChKQl9QQykgdGhhdCB3ZSB3aWxsIGxhbmQgYXQuICBUaGUgcGMgaXMgY29waWVkIGludG8gUEMuCisgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuICovCisKK2ludAorZ2V0X2xvbmdqbXBfdGFyZ2V0KHBjKQorICAgICBDT1JFX0FERFIgKnBjOworeworICBjaGFyIGJ1ZltUQVJHRVRfUFRSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVF07CisgIENPUkVfQUREUiBzcCwgamJfYWRkcjsKKworICBzcCA9IHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSk7CisKKyAgaWYgKHRhcmdldF9yZWFkX21lbW9yeSAoc3AgKyBTUF9BUkcwLCAvKiBPZmZzZXQgb2YgZmlyc3QgYXJnIG9uIHN0YWNrICovCisJCQkgIGJ1ZiwKKwkJCSAgVEFSR0VUX1BUUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQpKQorICAgIHJldHVybiAwOworCisgIGpiX2FkZHIgPSBleHRyYWN0X2FkZHJlc3MgKGJ1ZiwgVEFSR0VUX1BUUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQpOworCisgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkgKGpiX2FkZHIgKyBKQl9QQyAqIEpCX0VMRU1FTlRfU0laRSwgYnVmLAorCQkJICBUQVJHRVRfUFRSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCkpCisgICAgcmV0dXJuIDA7CisKKyAgKnBjID0gZXh0cmFjdF9hZGRyZXNzIChidWYsIFRBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUKTsKKworICByZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBHRVRfTE9OR0pNUF9UQVJHRVQgKi8KKwwKKy8qIERpc2Fzc2VtYmxlIG9uZSBpbnN0cnVjdGlvbi4gICovCisKK3N0YXRpYyBpbnQKK2FyY19wcmludF9pbnNuICh2bWEsIGluZm8pCisgICAgIGJmZF92bWEgdm1hOworICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICBzdGF0aWMgaW50IGN1cnJlbnRfbWFjaDsKKyAgc3RhdGljIGludCBjdXJyZW50X2VuZGlhbjsKKyAgc3RhdGljIGRpc2Fzc2VtYmxlcl9mdHlwZSBjdXJyZW50X2Rpc2FzbTsKKworICBpZiAoY3VycmVudF9kaXNhc20gPT0gTlVMTAorICAgICAgfHwgYXJjX2JmZF9tYWNoX3R5cGUgIT0gY3VycmVudF9tYWNoCisgICAgICB8fCBUQVJHRVRfQllURV9PUkRFUiAhPSBjdXJyZW50X2VuZGlhbikKKyAgICB7CisgICAgICBjdXJyZW50X21hY2ggPSBhcmNfYmZkX21hY2hfdHlwZTsKKyAgICAgIGN1cnJlbnRfZW5kaWFuID0gVEFSR0VUX0JZVEVfT1JERVI7CisgICAgICBjdXJyZW50X2Rpc2FzbSA9IGFyY19nZXRfZGlzYXNzZW1ibGVyIChjdXJyZW50X21hY2gsCisJCQkJCSAgICAgY3VycmVudF9lbmRpYW4gPT0gQklHX0VORElBTik7CisgICAgfQorCisgIHJldHVybiAoKmN1cnJlbnRfZGlzYXNtKSAodm1hLCBpbmZvKTsKK30KKwwKKy8qIENvbW1hbmQgdG8gc2V0IGNwdSB0eXBlLiAgKi8KKwordm9pZAorYXJjX3NldF9jcHVfdHlwZV9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpbnQgaTsKKworICBpZiAodG1wX2FyY19jcHVfdHlwZSA9PSBOVUxMIHx8ICp0bXBfYXJjX2NwdV90eXBlID09ICdcMCcpCisgICAgeworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJUaGUga25vd24gQVJDIGNwdSB0eXBlcyBhcmUgYXMgZm9sbG93czpcbiIpOworICAgICAgZm9yIChpID0gMDsgYXJjX2NwdV90eXBlX3RhYmxlW2ldLm5hbWUgIT0gTlVMTDsgKytpKQorCXByaW50Zl91bmZpbHRlcmVkICgiJXNcbiIsIGFyY19jcHVfdHlwZV90YWJsZVtpXS5uYW1lKTsKKworICAgICAgLyogUmVzdG9yZSB0aGUgdmFsdWUuICAqLworICAgICAgdG1wX2FyY19jcHVfdHlwZSA9IHN0cnNhdmUgKGFyY19jcHVfdHlwZSk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisgIAorICBpZiAoIWFyY19zZXRfY3B1X3R5cGUgKHRtcF9hcmNfY3B1X3R5cGUpKQorICAgIHsKKyAgICAgIGVycm9yICgiVW5rbm93biBjcHUgdHlwZSBgJXMnLiIsIHRtcF9hcmNfY3B1X3R5cGUpOworICAgICAgLyogUmVzdG9yZSBpdHMgdmFsdWUuICAqLworICAgICAgdG1wX2FyY19jcHVfdHlwZSA9IHN0cnNhdmUgKGFyY19jcHVfdHlwZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorYXJjX3Nob3dfY3B1X3R5cGVfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKK30KKworLyogTW9kaWZ5IHRoZSBhY3R1YWwgY3B1IHR5cGUuCisgICBSZXN1bHQgaXMgYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzcy4gICovCisKK2ludAorYXJjX3NldF9jcHVfdHlwZSAoc3RyKQorICAgICBjaGFyICpzdHI7Cit7CisgIGludCBpLCBqOworCisgIGlmIChzdHIgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICBmb3IgKGkgPSAwOyBhcmNfY3B1X3R5cGVfdGFibGVbaV0ubmFtZSAhPSBOVUxMOyArK2kpCisgICAgeworICAgICAgaWYgKHN0cmNhc2VjbXAgKHN0ciwgYXJjX2NwdV90eXBlX3RhYmxlW2ldLm5hbWUpID09IDApCisJeworCSAgYXJjX2NwdV90eXBlID0gc3RyOworCSAgYXJjX2JmZF9tYWNoX3R5cGUgPSBhcmNfY3B1X3R5cGVfdGFibGVbaV0udmFsdWU7CisJICByZXR1cm4gMTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorDAordm9pZAorX2luaXRpYWxpemVfYXJjX3RkZXAgKCkKK3sKKyAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7CisKKyAgYyA9IGFkZF9zZXRfY21kICgiY3B1IiwgY2xhc3Nfc3VwcG9ydCwgdmFyX3N0cmluZ19ub2VzY2FwZSwKKwkJICAgKGNoYXIgKikgJnRtcF9hcmNfY3B1X3R5cGUsCisJCSAgICJTZXQgdGhlIHR5cGUgb2YgQVJDIGNwdSBpbiB1c2UuXG5cCitUaGlzIGNvbW1hbmQgaGFzIHR3byBwdXJwb3Nlcy4gIEluIGEgbXVsdGktY3B1IHN5c3RlbSBpdCBsZXRzIG9uZVxuXAorY2hhbmdlIHRoZSBjcHUgYmVpbmcgZGVidWdnZWQuICBJdCBhbHNvIGdpdmVzIG9uZSBhY2Nlc3MgdG9cblwKK2NwdS10eXBlLXNwZWNpZmljIHJlZ2lzdGVycyBhbmQgcmVjb2duaXplIGNwdS10eXBlLXNwZWNpZmljIGluc3RydWN0aW9ucy5cCisiLAorCQkgICAmc2V0bGlzdCk7CisgIGMtPmZ1bmN0aW9uLmNmdW5jID0gYXJjX3NldF9jcHVfdHlwZV9jb21tYW5kOworICBjID0gYWRkX3Nob3dfZnJvbV9zZXQgKGMsICZzaG93bGlzdCk7CisgIGMtPmZ1bmN0aW9uLmNmdW5jID0gYXJjX3Nob3dfY3B1X3R5cGVfY29tbWFuZDsKKworICAvKiBXZSBoYXZlIHRvIHVzZSBzdHJzYXZlIGhlcmUgYmVjYXVzZSB0aGUgYHNldCcgY29tbWFuZCBmcmVlcyBpdCBiZWZvcmUKKyAgICAgc2V0dGluZyBhIG5ldyB2YWx1ZS4gICovCisgIHRtcF9hcmNfY3B1X3R5cGUgPSBzdHJzYXZlIChERUZBVUxUX0FSQ19DUFVfVFlQRSk7CisgIGFyY19zZXRfY3B1X3R5cGUgKHRtcF9hcmNfY3B1X3R5cGUpOworCisgIGMgPSBhZGRfc2V0X2NtZCAoImRpc3BsYXlwaXBlbGluZSIsIGNsYXNzX3N1cHBvcnQsIHZhcl96aW50ZWdlciwKKwkJICAgKGNoYXIgKikgJmRpc3BsYXlfcGlwZWxpbmVfcCwKKwkJICAgIlNldCBwaXBlbGluZSBkaXNwbGF5IChzaW11bGF0b3Igb25seSkuXG5cCitXaGVuIGVuYWJsZWQsIHRoZSBzdGF0ZSBvZiB0aGUgcGlwZWxpbmUgYWZ0ZXIgZWFjaCBjeWNsZSBpcyBkaXNwbGF5ZWQuIiwKKwkJICAgJnNldGxpc3QpOworICBjID0gYWRkX3Nob3dfZnJvbV9zZXQgKGMsICZzaG93bGlzdCk7CisKKyAgYyA9IGFkZF9zZXRfY21kICgiZGVidWdwaXBlbGluZSIsIGNsYXNzX3N1cHBvcnQsIHZhcl96aW50ZWdlciwKKwkJICAgKGNoYXIgKikgJmRlYnVnX3BpcGVsaW5lX3AsCisJCSAgICJTZXQgcGlwZWxpbmUgZGVidWcgZGlzcGxheSAoc2ltdWxhdG9yIG9ubHkpLlxuXAorV2hlbiBlbmFibGVkLCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBpcGVsaW5lIGlzIGRpc3BsYXllZC4iLAorCQkgICAmc2V0bGlzdCk7CisgIGMgPSBhZGRfc2hvd19mcm9tX3NldCAoYywgJnNob3dsaXN0KTsKKworICBjID0gYWRkX3NldF9jbWQgKCJjcHV0aW1lciIsIGNsYXNzX3N1cHBvcnQsIHZhcl96aW50ZWdlciwKKwkJICAgKGNoYXIgKikgJmNwdV90aW1lciwKKwkJICAgIlNldCBtYXhpbXVtIGN5Y2xlIGNvdW50IChzaW11bGF0b3Igb25seSkuXG5cCitDb250cm9sIHdpbGwgcmV0dXJuIHRvIGdkYiBpZiB0aGUgdGltZXIgZXhwaXJlcy5cblwKK0EgbmVnYXRpdmUgdmFsdWUgZGlzYWJsZXMgdGhlIHRpbWVyLiIsCisJCSAgICZzZXRsaXN0KTsKKyAgYyA9IGFkZF9zaG93X2Zyb21fc2V0IChjLCAmc2hvd2xpc3QpOworCisgIHRtX3ByaW50X2luc24gPSBhcmNfcHJpbnRfaW5zbjsKK30KZGlmZiAtLWdpdCBhL2dkYi9hcm0tY29udmVydC5zIGIvZ2RiL2FybS1jb252ZXJ0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE2MTMyYgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9hcm0tY29udmVydC5zCkBAIC0wLDAgKzEsMTYgQEAKKwkudGV4dAorCS5nbG9iYWwJX2NvbnZlcnRfZnJvbV9leHRlbmRlZAorCitfY29udmVydF9mcm9tX2V4dGVuZGVkOgorCisJbGRmZQlmMCxbYTFdCisJc3RmZAlmMCxbYTJdCisJbW92cwlwYyxscgorCisJLmdsb2JhbAlfY29udmVydF90b19leHRlbmRlZAorCitfY29udmVydF90b19leHRlbmRlZDoKKworCWxkZmQJZjAsW2ExXQorCXN0ZmUJZjAsW2EyXQorCW1vdnMJcGMsbHIKZGlmZiAtLWdpdCBhL2dkYi9hcm0tdGRlcC5jIGIvZ2RiL2FybS10ZGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3ZGM4ZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9hcm0tdGRlcC5jCkBAIC0wLDAgKzEsMTYyNiBAQAorLyogVGFyZ2V0LWRlcGVuZGVudCBjb2RlIGZvciB0aGUgQWNvcm4gUmlzYyBNYWNoaW5lLCBmb3IgR0RCLCB0aGUgR05VIERlYnVnZ2VyLgorICAgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTg5LCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCS8qIEludGVybmFsIGZvcm1hdCBvZiBDT0ZGIHN5bWJvbHMgaW4gQkZEICovCisKKy8qCisgIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBhY3R1YWxseSB3cm9uZy4gIE5laXRoZXIgYXJtIG5vciB0aHVtYiBjYW4KKyAgb3Igc2hvdWxkIHNldCB0aGUgbHNiIG9uIGFkZHIuCisgIFRoZSB0aHVtYiBhZGRyZXNzZXMgYXJlIG1vZCAyLCBzbyAoYWRkciAmIDIpIHdvdWxkIGJlIGEgZ29vZCBoZXVyaXN0aWMKKyAgdG8gdXNlIHdoZW4gY2hlY2tpbmcgZm9yIHRodW1iIChzZWUgYXJtX3BjX2lzX3RodW1iKCkgYmVsb3cpLgorICBVbmZvcnR1bmF0ZWx5LCBzb21ldGhpbmcgZWxzZSBkZXBlbmRzIG9uIHRoZXNlIChpbmNvcnJlY3QpIG1hY3Jvcywgc28KKyAgZml4aW5nIHRoZW0gYWN0dWFsbHkgYnJlYWtzIGdkYi4gIEkgZGlkbid0IGhhdmUgdGltZSB0byBpbnZlc3RpZ2F0ZS4gWi5SLgorKi8KKy8qIFRodW1iIGZ1bmN0aW9uIGFkZHJlc3NlcyBhcmUgb2RkIChiaXQgMCBpcyBzZXQpLiAgSGVyZSBhcmUgc29tZQorICAgbWFjcm9zIHRvIHRlc3QsIHNldCwgb3IgY2xlYXIgYml0IDAgb2YgYWRkcmVzc2VzLiAgKi8KKyNkZWZpbmUgSVNfVEhVTUJfQUREUihhZGRyKQkoKGFkZHIpICYgMSkKKyNkZWZpbmUgTUFLRV9USFVNQl9BRERSKGFkZHIpCSgoYWRkcikgfCAxKQorI2RlZmluZSBVTk1BS0VfVEhVTUJfQUREUihhZGRyKSAoKGFkZHIpICYgfjEpCisKKy8qIE1hY3JvcyB0byByb3VuZCBOIHVwIG9yIGRvd24gdG8gdGhlIG5leHQgQSBib3VuZGFyeTsgQSBtdXN0IGJlCisgICBhIHBvd2VyIG9mIHR3by4gKi8KKyNkZWZpbmUgUk9VTkRfRE9XTihuLGEpIAkoKG4pICYgfigoYSkgLSAxKSkKKyNkZWZpbmUgUk9VTkRfVVAobixhKSAJCSgoKG4pICsgKGEpIC0gMSkgJiB+KChhKSAtIDEpKQorICAKKy8qIFNob3VsZCBjYWxsX2Z1bmN0aW9uIGFsbG9jYXRlIHN0YWNrIHNwYWNlIGZvciBhIHN0cnVjdCByZXR1cm4/ICAqLworLyogVGhlIHN5c3RlbSBDIGNvbXBpbGVyIHVzZXMgYSBzaW1pbGFyIHN0cnVjdHVyZSByZXR1cm4gY29udmVudGlvbiB0byBnY2MgKi8KK2ludAorYXJtX3VzZV9zdHJ1Y3RfY29udmVudGlvbiAoZ2NjX3AsIHR5cGUpCisgICAgIGludCBnY2NfcDsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIHJldHVybiAoVFlQRV9MRU5HVEggKHR5cGUpID4gNCk7Cit9CisKK2ludAorYXJtX2ZyYW1lX2NoYWluX3ZhbGlkIChjaGFpbiwgdGhpc2ZyYW1lKQorICAgICBDT1JFX0FERFIgY2hhaW47CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICp0aGlzZnJhbWU7Cit7CisjZGVmaW5lIExPV0VTVF9QQyAweDIwICAvKiB0aGUgZmlyc3QgMHgyMCBieXRlcyBhcmUgdGhlIHRyYXAgdmVjdG9ycy4gKi8KKyAgcmV0dXJuIChjaGFpbiAhPSAwICYmIChGUkFNRV9TQVZFRF9QQyAodGhpc2ZyYW1lKSA+PSBMT1dFU1RfUEMpKTsKK30KKworLyogU2V0IHRvIHRydWUgaWYgdGhlIDMyLWJpdCBtb2RlIGlzIGluIHVzZS4gKi8KKworaW50IGFybV9hcGNzXzMyID0gMTsKKworLyogRmxhZyBzZXQgYnkgYXJtX2ZpeF9jYWxsX2R1bW15IHRoYXQgdGVsbHMgd2hldGhlciB0aGUgdGFyZ2V0IGZ1bmN0aW9uCisgICBpcyBhIFRodW1iIGZ1bmN0aW9uLiAgVGhpcyBmbGFnIGlzIGNoZWNrZWQgYnkgYXJtX3B1c2hfYXJndW1lbnRzLgorICAgRklYTUU6IENoYW5nZSB0aGUgUFVTSF9BUkdVTUVOVFMgbWFjcm8gKGFuZCBpdHMgdXNlIGluIHZhbG9wcy5jKSB0bworICAgcGFzcyB0aGUgZnVuY3Rpb24gYWRkcmVzcyBhcyBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlci4gICovCisKK3N0YXRpYyBpbnQgdGFyZ2V0X2lzX3RodW1iOworCisvKiBGbGFnIHNldCBieSBhcm1fZml4X2NhbGxfZHVtbXkgdGhhdCB0ZWxscyB3aGV0aGVyIHRoZSBjYWxsaW5nIGZ1bmN0aW9uCisgICBpcyBhIFRodW1iIGZ1bmN0aW9uLiAgVGhpcyBmbGFnIGlzIGNoZWNrZWQgYnkgYXJtX3BjX2lzX3RodW1iCisgICBhbmQgYXJtX2NhbGxfZHVtbXlfYnJlYWtwb2ludF9vZmZzZXQuICAqLworCitzdGF0aWMgaW50IGNhbGxlcl9pc190aHVtYjsKKworLyogVGVsbCBpZiB0aGUgcHJvZ3JhbSBjb3VudGVyIHZhbHVlIGluIE1FTUFERFIgaXMgaW4gYSBUaHVtYiBmdW5jdGlvbi4gICovCisKK2ludAorYXJtX3BjX2lzX3RodW1iIChtZW1hZGRyKQorICAgICBiZmRfdm1hIG1lbWFkZHI7Cit7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqIHN5bTsKKyAgQ09SRV9BRERSIHNwOworCisgIC8qIElmIGJpdCAwIG9mIHRoZSBhZGRyZXNzIGlzIHNldCwgYXNzdW1lIHRoaXMgaXMgYSBUaHVtYiBhZGRyZXNzLiAqLworICBpZiAoSVNfVEhVTUJfQUREUiAobWVtYWRkcikpCisgICAgcmV0dXJuIDE7CisKKyAgLyogVGh1bWIgZnVuY3Rpb24gaGF2ZSBhICJzcGVjaWFsIiBiaXQgc2V0IGluIG1pbmltYWwgc3ltYm9scyAqLworICBzeW0gPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGMgKG1lbWFkZHIpOworICBpZiAoc3ltKQorICAgIHsKKyAgICAgIHJldHVybiAoTVNZTUJPTF9JU19TUEVDSUFMKHN5bSkpOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBUZWxsIGlmIHRoZSBwcm9ncmFtIGNvdW50ZXIgdmFsdWUgaW4gTUVNQUREUiBpcyBpbiBhIGNhbGwgZHVtbXkgdGhhdAorICAgaXMgYmVpbmcgY2FsbGVkIGZyb20gYSBUaHVtYiBmdW5jdGlvbi4gICovCisKK2ludAorYXJtX3BjX2lzX3RodW1iX2R1bW15IChtZW1hZGRyKQorICAgICBiZmRfdm1hIG1lbWFkZHI7Cit7CisgIENPUkVfQUREUiBzcCA9IHJlYWRfc3AoKTsKKworICBpZiAoUENfSU5fQ0FMTF9EVU1NWSAobWVtYWRkciwgc3AsIHNwKzY0KSkKKyAgICByZXR1cm4gY2FsbGVyX2lzX3RodW1iOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK0NPUkVfQUREUgorYXJtX2FkZHJfYml0c19yZW1vdmUgKHZhbCkKKyAgICAgQ09SRV9BRERSIHZhbDsKK3sKKyAgaWYgKGFybV9wY19pc190aHVtYiAodmFsKSkKKyAgICByZXR1cm4gKHZhbCAmIChhcm1fYXBjc18zMiA/IDB4ZmZmZmZmZmUgOiAweDAzZmZmZmZlKSk7CisgIGVsc2UKKyAgICByZXR1cm4gKHZhbCAmIChhcm1fYXBjc18zMiA/IDB4ZmZmZmZmZmMgOiAweDAzZmZmZmZjKSk7Cit9CisKK0NPUkVfQUREUgorYXJtX3NhdmVkX3BjX2FmdGVyX2NhbGwgKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIHJldHVybiBBRERSX0JJVFNfUkVNT1ZFIChyZWFkX3JlZ2lzdGVyIChMUl9SRUdOVU0pKTsKK30KKworLyogQSB0eXBpY2FsIFRodW1iIHByb2xvZ3VlIGxvb2tzIGxpa2UgdGhpczoKKyAgICAgICAgcHVzaCAgICB7cjcsIGxyfQorICAgICAgICBhZGQgICAgIHNwLCBzcCwgIy0yOAorICAgICAgICBhZGQgICAgIHI3LCBzcCwgIzEyCisgICBTb21ldGltZXMgdGhlIGxhdHRlciBpbnN0cnVjdGlvbiBtYXkgYmUgcmVwbGFjZWQgYnk6CisgICAgICAgIG1vdiAgICAgcjcsIHNwIAorKi8KKworc3RhdGljIENPUkVfQUREUgordGh1bWJfc2tpcF9wcm9sb2d1ZSAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgQ09SRV9BRERSIGN1cnJlbnRfcGM7CisKKyAgZm9yIChjdXJyZW50X3BjID0gcGM7IGN1cnJlbnRfcGMgPCBwYyArIDIwOyBjdXJyZW50X3BjICs9IDIpCisgICAgeworICAgICAgdW5zaWduZWQgc2hvcnQgaW5zbiA9IHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKGN1cnJlbnRfcGMsIDIpOworCisgICAgICBpZiAoICAgKGluc24gJiAweGZlMDApICE9IDB4YjQwMAkJLyogcHVzaCB7Li4uLCByNywgbHJ9ICovCisJICAmJiAoaW5zbiAmIDB4ZmYwMCkgIT0gMHhiMDAwCQkvKiBhZGQgc3AsICNzaW1tICovCisJICAmJiAoaW5zbiAmIDB4ZmYwMCkgIT0gMHhhZjAwCQkvKiBhZGQgcjcsIHNwLCAjaW1tICovCisJICAmJiBpbnNuICE9IDB4NDY2ZgkJCS8qIG1vdiByNywgc3AgKi8KKwkgICYmIChpbnNuICYgMHhmZmMwKSAhPSAweDQ2NDApCQkvKiBtb3YgcjAtcjcsIHI4LXIxNSAqLworCWJyZWFrOworICAgIH0KKworICByZXR1cm4gY3VycmVudF9wYzsKK30KKworLyogQVBDUyAoQVJNIHByb2NlZHVyZSBjYWxsIHN0YW5kYXJkKSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgcHJvbG9ndWU6CisKKyAgIG1vdgkJaXAsIHNwCisgIFtzdG1mZAlzcCEsIHthMSxhMixhMyxhNH1dCisgICBzdG1mZAlzcCEsIHsuLi4sZnAsaXAsbHIscGN9CisgIFtzdGZlCQlmNywgW3NwLCAjLTEyXSFdCisgIFtzdGZlCQlmNiwgW3NwLCAjLTEyXSFdCisgIFtzdGZlCQlmNSwgW3NwLCAjLTEyXSFdCisgIFtzdGZlCQlmNCwgW3NwLCAjLTEyXSFdCisgICBzdWIJCWZwLCBpcCwgI25uCS8vIG5uID09IDIwIG9yIDQgZGVwZW5kaW5nIG9uIHNlY29uZCBpbnMKKyovCisKK0NPUkVfQUREUgorYXJtX3NraXBfcHJvbG9ndWUgKHBjKQorICAgICBDT1JFX0FERFIgcGM7Cit7CisgIHVuc2lnbmVkIGxvbmcgaW5zdDsKKyAgQ09SRV9BRERSIHNraXBfcGM7CisgIENPUkVfQUREUiBmdW5jX2FkZHIsIGZ1bmNfZW5kOworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKworICAvKiBTZWUgd2hhdCB0aGUgc3ltYm9sIHRhYmxlIHNheXMuICovCisgIGlmIChmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gKHBjLCBOVUxMLCAmIGZ1bmNfYWRkciwgJiBmdW5jX2VuZCkpCisgICAgeworICAgICAgc2FsID0gZmluZF9wY19saW5lIChmdW5jX2FkZHIsIDApOworICAgICAgaWYgKHNhbC5saW5lICE9IDAgJiYgc2FsLmVuZCA8IGZ1bmNfZW5kKQorCXJldHVybiBzYWwuZW5kOworICAgIH0KKworICAvKiBDaGVjayBpZiB0aGlzIGlzIFRodW1iIGNvZGUuICAqLworICBpZiAoYXJtX3BjX2lzX3RodW1iIChwYykpCisgICAgcmV0dXJuIHRodW1iX3NraXBfcHJvbG9ndWUgKHBjKTsKKworICAvKiBDYW4ndCBmaW5kIHRoZSBwcm9sb2d1ZSBlbmQgaW4gdGhlIHN5bWJvbCB0YWJsZSwgdHJ5IGl0IHRoZSBoYXJkIHdheQorICAgICBieSBkaXNhc3NlbWJsaW5nIHRoZSBpbnN0cnVjdGlvbnMuICovCisgIHNraXBfcGMgPSBwYzsKKyAgaW5zdCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHNraXBfcGMsIDQpOworICBpZiAoaW5zdCAhPSAweGUxYTBjMDBkKSAgLyogbW92IGlwLCBzcCAqLworICAgIHJldHVybiBwYzsKKworICBza2lwX3BjICs9IDQ7CisgIGluc3QgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChza2lwX3BjLCA0KTsKKyAgaWYgKChpbnN0ICYgMHhmZmZmZmZmMCkgPT0gMHhlOTJkMDAwMCkgIC8qIHN0bWZkIHNwISx7YTEsYTIsYTMsYTR9ICAqLworICAgIHsKKyAgICAgIHNraXBfcGMgKz0gNDsKKyAgICAgIGluc3QgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChza2lwX3BjLCA0KTsKKyAgICB9CisKKyAgaWYgKChpbnN0ICYgMHhmZmZmZjgwMCkgIT0gMHhlOTJkZDgwMCkgIC8qIHN0bWZkIHNwISx7Li4uLGZwLGlwLGxyLHBjfSAqLworICAgIHJldHVybiBwYzsKKworICBza2lwX3BjICs9IDQ7CisgIGluc3QgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChza2lwX3BjLCA0KTsKKworICAvKiBBbnkgaW5zbnMgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgZmxvYXQgaW50byB0aGUgY29kZSwgaWYgaXQgbWFrZXMKKyAgICAgZm9yIGJldHRlciBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nLCBzbyB3ZSBza2lwIHRoZW0gb25seSBpZgorICAgICB3ZSBmaW5kIHRoZW0sIGJ1dCBzdGlsbCBjb25zZGllciB0aGUgZnVuY3Rpb24gdG8gYmUgZnJhbWUtZnVsICAqLworCisgIC8qIFdlIG1heSBoYXZlIGVpdGhlciBvbmUgc2ZtZmQgaW5zdHJ1Y3Rpb24gaGVyZSwgb3Igc2V2ZXJhbCBzdGZlIGluc25zLAorICAgICBkZXBlbmRpbmcgb24gdGhlIHZlcnNpb24gb2YgZmxvYXRpbmcgcG9pbnQgY29kZSB3ZSBzdXBwb3J0LiAgKi8KKyAgaWYgKChpbnN0ICYgMHhmZmJmMGZmZikgPT0gMHhlYzJkMDIwMCkgIC8qIHNmbWZkIGZuLCA8Y250PiwgW3NwXSEgKi8KKyAgICB7CisgICAgICBza2lwX3BjICs9IDQ7CisgICAgICBpbnN0ID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoc2tpcF9wYywgNCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgd2hpbGUgKChpbnN0ICYgMHhmZmZmOGZmZikgPT0gMHhlZDZkMDEwMykgLyogc3RmZSBmbiwgW3NwLCAjLTEyXSEgKi8KKyAgICAgICAgeworICAgICAgICAgIHNraXBfcGMgKz0gNDsKKyAgICAgICAgICBpbnN0ID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoc2tpcF9wYywgNCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKChpbnN0ICYgMHhmZmZmZjAwMCkgPT0gMHhlMjRjYjAwMCkgLyogc3ViIGZwLCBpcCwgI25uICovCisgICAgc2tpcF9wYyArPSA0OworCisgIHJldHVybiBza2lwX3BjOworfQorCisKKworLyogRnVuY3Rpb246IHRodW1iX3NjYW5fcHJvbG9ndWUgKGhlbHBlciBmdW5jdGlvbiBmb3IgYXJtX3NjYW5fcHJvbG9ndWUpCisgICBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgYSBUaHVtYiBmdW5jdGlvbiBwcm9sb2d1ZSB0byBkZXRlcm1pbmU6CisgICAgIDEpIHRoZSBzaXplIG9mIHRoZSBzdGFjayBmcmFtZQorICAgICAyKSB3aGljaCByZWdpc3RlcnMgYXJlIHNhdmVkIG9uIGl0CisgICAgIDMpIHRoZSBvZmZzZXRzIG9mIHNhdmVkIHJlZ3MKKyAgICAgNCkgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFjayBwb2ludGVyIHRvIHRoZSBmcmFtZSBwb2ludGVyCisgICBUaGlzIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiB0aGUgImV4dHJhIiBmaWVsZHMgb2YgdGhlIGZyYW1lX2luZm8uCisKKyAgIEEgdHlwaWNhbCBUaHVtYiBmdW5jdGlvbiBwcm9sb2d1ZSBtaWdodCBsb29rIGxpa2UgdGhpczoKKwlwdXNoIHtyNywgbHJ9CisJc3ViICBzcCwgIzI4LAorCWFkZCAgcjcsIHNwLCAjMTIKKyAgIFdoaWNoIHdvdWxkIGNyZWF0ZSB0aGlzIHN0YWNrIGZyYW1lIChvZmZzZXRzIHJlbGF0aXZlIHRvIEZQKQorICAgICBvbGQgU1AgLT4JMjQgIHN0YWNrIHBhcmFtZXRlcnMKKwkJMjAgIExSCisJCTE2ICBSNworICAgICBSNyAtPiAgICAgICAwICBsb2NhbCB2YXJpYWJsZXMgKDE2IGJ5dGVzKQorICAgICBTUCAtPiAgICAgLTEyICBhZGRpdGlvbmFsIHN0YWNrIHNwYWNlICgxMiBieXRlcykKKyAgIFRoZSBmcmFtZSBzaXplIHdvdWxkIHRodXMgYmUgMzYgYnl0ZXMsIGFuZCB0aGUgZnJhbWUgb2Zmc2V0IHdvdWxkIGJlCisgICAxMiBieXRlcy4gIFRoZSBmcmFtZSByZWdpc3RlciBpcyBSNy4gICovCisJCitzdGF0aWMgdm9pZAordGh1bWJfc2Nhbl9wcm9sb2d1ZSAoZmkpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICogZmk7Cit7CisgIENPUkVfQUREUiBwcm9sb2d1ZV9zdGFydDsKKyAgQ09SRV9BRERSIHByb2xvZ3VlX2VuZDsKKyAgQ09SRV9BRERSIGN1cnJlbnRfcGM7CisgIGludCAgICAgICBzYXZlZF9yZWdbMTZdOwkvKiB3aGljaCByZWdpc3RlciBoYXMgYmVlbiBjb3BpZWQgdG8gcmVnaXN0ZXIgbj8gKi8KKyAgaW50ICAgICAgIGk7CisKKyAgaWYgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAoZmktPnBjLCBOVUxMLCAmIHByb2xvZ3VlX3N0YXJ0LCAmIHByb2xvZ3VlX2VuZCkpCisgICAgeworICAgICAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWwgPSBmaW5kX3BjX2xpbmUgKHByb2xvZ3VlX3N0YXJ0LCAwKTsKKworICAgICAgaWYgKHNhbC5saW5lID09IDApCQkvKiBubyBsaW5lIGluZm8sIHVzZSBjdXJyZW50IFBDICovCisJcHJvbG9ndWVfZW5kID0gZmktPnBjOworICAgICAgZWxzZSBpZiAoc2FsLmVuZCA8IHByb2xvZ3VlX2VuZCkJLyogbmV4dCBsaW5lIGJlZ2lucyBhZnRlciBmbiBlbmQgKi8KKwlwcm9sb2d1ZV9lbmQgPSBzYWwuZW5kOwkJLyogKHByb2JhYmx5IG1lYW5zIG5vIHByb2xvZ3VlKSAgKi8KKyAgICB9CisgIGVsc2UKKyAgICBwcm9sb2d1ZV9lbmQgPSBwcm9sb2d1ZV9zdGFydCArIDQwOyAvKiBXZSdyZSBpbiB0aGUgYm9vbmRvY2tzOiBhbGxvdyBmb3IgKi8KKwkJCQkJLyogMTYgcHVzaGVzLCBhbiBhZGQsIGFuZCAibXYgZnAsc3AiICovCisKKyAgcHJvbG9ndWVfZW5kID0gbWluIChwcm9sb2d1ZV9lbmQsIGZpLT5wYyk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgc2F2ZWQgcmVnaXN0ZXIgbWFwLiAgV2hlbiByZWdpc3RlciBIIGlzIGNvcGllZCB0bworICAgICByZWdpc3RlciBMLCB3ZSB3aWxsIHB1dCBIIGluIHNhdmVkX3JlZ1tMXS4gICovCisgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHNhdmVkX3JlZ1tpXSA9IGk7CisKKyAgLyogU2VhcmNoIHRoZSBwcm9sb2d1ZSBsb29raW5nIGZvciBpbnN0cnVjdGlvbnMgdGhhdCBzZXQgdXAgdGhlCisgICAgIGZyYW1lIHBvaW50ZXIsIGFkanVzdCB0aGUgc3RhY2sgcG9pbnRlciwgYW5kIHNhdmUgcmVnaXN0ZXJzLiAgKi8KKworICBmaS0+ZnJhbWVzaXplID0gMDsKKyAgZm9yIChjdXJyZW50X3BjID0gcHJvbG9ndWVfc3RhcnQ7IGN1cnJlbnRfcGMgPCBwcm9sb2d1ZV9lbmQ7IGN1cnJlbnRfcGMgKz0gMikKKyAgICB7CisgICAgICB1bnNpZ25lZCBzaG9ydCBpbnNuOworICAgICAgaW50IHJlZ25vOworICAgICAgaW50IG9mZnNldDsKKworICAgICAgaW5zbiA9IHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKGN1cnJlbnRfcGMsIDIpOworCisgICAgICBpZiAoKGluc24gJiAweGZlMDApID09IDB4YjQwMCkJCS8qIHB1c2ggeyBybGlzdCB9ICovCisJeworCSAgLyogQml0cyAwLTcgY29udGFpbiBhIG1hc2sgZm9yIHJlZ2lzdGVycyBSMC1SNy4gIEJpdCA4IHNheXMKKwkgICAgIHdoZXRoZXIgdG8gc2F2ZSBMUiAoUjE0KS4gICovCisJICBpbnQgbWFzayA9IChpbnNuICYgMHhmZikgfCAoKGluc24gJiAweDEwMCkgPDwgNik7CisKKwkgIC8qIENhbGN1bGF0ZSBvZmZzZXRzIG9mIHNhdmVkIFIwLVI3IGFuZCBMUi4gKi8KKwkgIGZvciAocmVnbm8gPSBMUl9SRUdOVU07IHJlZ25vID49IDA7IHJlZ25vLS0pCisJICAgIGlmIChtYXNrICYgKDEgPDwgcmVnbm8pKQorIAkgICAgICB7CisJCWZpLT5mcmFtZXNpemUgKz0gNDsKKwkJZmktPmZzci5yZWdzW3NhdmVkX3JlZ1tyZWdub11dID0gLShmaS0+ZnJhbWVzaXplKTsKKwkJc2F2ZWRfcmVnW3JlZ25vXSA9IHJlZ25vOwkvKiByZXNldCBzYXZlZCByZWdpc3RlciBtYXAgKi8KKwkgICAgICB9CisJfQorICAgICAgZWxzZSBpZiAoKGluc24gJiAweGZmMDApID09IDB4YjAwMCkJLyogYWRkIHNwLCAjc2ltbSAqLworCXsKKwkgIG9mZnNldCA9IChpbnNuICYgMHg3ZikgPDwgMjsJCS8qIGdldCBzY2FsZWQgb2Zmc2V0ICovCisJICBpZiAoaW5zbiAmIDB4ODApCQkJLyogaXMgaXQgc2lnbmVkPyAqLworCSAgICAgb2Zmc2V0ID0gLW9mZnNldDsKKwkgIGZpLT5mcmFtZXNpemUgLT0gb2Zmc2V0OworCX0KKyAgICAgIGVsc2UgaWYgKChpbnNuICYgMHhmZjAwKSA9PSAweGFmMDApCS8qIGFkZCByNywgc3AsICNpbW0gKi8KKwl7CisJICBmaS0+ZnJhbWVyZWcgPSBUSFVNQl9GUF9SRUdOVU07CisJICBmaS0+ZnJhbWVvZmZzZXQgPSAoaW5zbiAmIDB4ZmYpIDw8IDI7CS8qIGdldCBzY2FsZWQgb2Zmc2V0ICovCisJfQorICAgICAgZWxzZSBpZiAoaW5zbiA9PSAweDQ2NmYpCQkJLyogbW92IHI3LCBzcCAqLworCXsKKwkgIGZpLT5mcmFtZXJlZyA9IFRIVU1CX0ZQX1JFR05VTTsKKwkgIGZpLT5mcmFtZW9mZnNldCA9IDA7CisJICBzYXZlZF9yZWdbVEhVTUJfRlBfUkVHTlVNXSA9IFNQX1JFR05VTTsKKwl9CisgICAgICBlbHNlIGlmICgoaW5zbiAmIDB4ZmZjMCkgPT0gMHg0NjQwKQkvKiBtb3YgcjAtcjcsIHI4LXIxNSAqLworCXsKKwkgIGludCBsb19yZWcgPSBpbnNuICYgNzsJCS8qIGRlc3QuIHJlZ2lzdGVyIChyMC1yNykgKi8KKwkgIGludCBoaV9yZWcgPSAoKGluc24gPj4gMykgJiA3KSArIDg7CS8qIHNvdXJjZSByZWdpc3RlciAocjgtMTUpICovCisJICBzYXZlZF9yZWdbbG9fcmVnXSA9IGhpX3JlZzsJCS8qIHJlbWVtYmVyIGhpIHJlZyB3YXMgc2F2ZWQgKi8KKwl9CisgICAgICBlbHNlCisJYnJlYWs7CQkJCS8qIGFueXRoaW5nIGVsc2UgaXNuJ3QgcHJvbG9ndWUgKi8KKyAgICB9Cit9CisKKy8qIEZ1bmN0aW9uOiBjaGVja19wcm9sb2d1ZV9jYWNoZQorICAgQ2hlY2sgaWYgcHJvbG9ndWUgZm9yIHRoaXMgZnJhbWUncyBQQyBoYXMgYWxyZWFkeSBiZWVuIHNjYW5uZWQuCisgICBJZiBpdCBoYXMsIGNvcHkgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIGFib3V0IHRoYXQgcHJvbG9ndWUgYW5kCisgICByZXR1cm4gbm9uLXplcm8uICBPdGhlcndpc2UgZG8gbm90IGNvcHkgYW55dGhpbmcgYW5kIHJldHVybiB6ZXJvLgorCisgICBUaGUgaW5mb3JtYXRpb24gc2F2ZWQgaW4gdGhlIGNhY2hlIGluY2x1ZGVzOgorICAgICAqIHRoZSBmcmFtZSByZWdpc3RlciBudW1iZXI7CisgICAgICogdGhlIHNpemUgb2YgdGhlIHN0YWNrIGZyYW1lOworICAgICAqIHRoZSBvZmZzZXRzIG9mIHNhdmVkIHJlZ3MgKHJlbGF0aXZlIHRvIHRoZSBvbGQgU1ApOyBhbmQKKyAgICAgKiB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YWNrIHBvaW50ZXIgdG8gdGhlIGZyYW1lIHBvaW50ZXIKKworICAgVGhlIGNhY2hlIGNvbnRhaW5zIG9ubHkgb25lIGVudHJ5LCBzaW5jZSB0aGlzIGlzIGFkZXF1YXRlCisgICBmb3IgdGhlIHR5cGljYWwgc2VxdWVuY2Ugb2YgcHJvbG9ndWUgc2NhbiByZXF1ZXN0cyB3ZSBnZXQuCisgICBXaGVuIHBlcmZvcm1pbmcgYSBiYWNrdHJhY2UsIEdEQiB3aWxsIHVzdWFsbHkgYXNrIHRvIHNjYW4KKyAgIHRoZSBzYW1lIGZ1bmN0aW9uIHR3aWNlIGluIGEgcm93IChvbmNlIHRvIGdldCB0aGUgZnJhbWUgY2hhaW4sCisgICBhbmQgb25jZSB0byBmaWxsIGluIHRoZSBleHRyYSBmcmFtZSBpbmZvcm1hdGlvbikuCisqLworCitzdGF0aWMgc3RydWN0IGZyYW1lX2luZm8gcHJvbG9ndWVfY2FjaGU7CisKK3N0YXRpYyBpbnQKK2NoZWNrX3Byb2xvZ3VlX2NhY2hlIChmaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKiBmaTsKK3sKKyAgaW50IGk7CisKKyAgaWYgKGZpLT5wYyA9PSBwcm9sb2d1ZV9jYWNoZS5wYykKKyAgICB7CisgICAgICBmaS0+ZnJhbWVyZWcgPSBwcm9sb2d1ZV9jYWNoZS5mcmFtZXJlZzsKKyAgICAgIGZpLT5mcmFtZXNpemUgPSBwcm9sb2d1ZV9jYWNoZS5mcmFtZXNpemU7CisgICAgICBmaS0+ZnJhbWVvZmZzZXQgPSBwcm9sb2d1ZV9jYWNoZS5mcmFtZW9mZnNldDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPD0gTlVNX1JFR1M7IGkrKykKKwlmaS0+ZnNyLnJlZ3NbaV0gPSBwcm9sb2d1ZV9jYWNoZS5mc3IucmVnc1tpXTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisKKy8qIEZ1bmN0aW9uOiBzYXZlX3Byb2xvZ3VlX2NhY2hlCisgICBDb3B5IHRoZSBwcm9sb2d1ZSBpbmZvcm1hdGlvbiBmcm9tIGZpIHRvIHRoZSBwcm9sb2d1ZSBjYWNoZS4KKyovCisKK3N0YXRpYyB2b2lkCitzYXZlX3Byb2xvZ3VlX2NhY2hlIChmaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKiBmaTsKK3sKKyAgaW50IGk7CisKKyAgcHJvbG9ndWVfY2FjaGUucGMgICAgICAgICAgPSBmaS0+cGM7CisgIHByb2xvZ3VlX2NhY2hlLmZyYW1lcmVnICAgID0gZmktPmZyYW1lcmVnOworICBwcm9sb2d1ZV9jYWNoZS5mcmFtZXNpemUgICA9IGZpLT5mcmFtZXNpemU7CisgIHByb2xvZ3VlX2NhY2hlLmZyYW1lb2Zmc2V0ID0gZmktPmZyYW1lb2Zmc2V0OworICAKKyAgZm9yIChpID0gMDsgaSA8PSBOVU1fUkVHUzsgaSsrKQorICAgIHByb2xvZ3VlX2NhY2hlLmZzci5yZWdzW2ldID0gZmktPmZzci5yZWdzW2ldOworfQorCisKKy8qIEZ1bmN0aW9uOiBhcm1fc2Nhbl9wcm9sb2d1ZQorICAgVGhpcyBmdW5jdGlvbiBkZWNvZGVzIGFuIEFSTSBmdW5jdGlvbiBwcm9sb2d1ZSB0byBkZXRlcm1pbmU6CisgICAgIDEpIHRoZSBzaXplIG9mIHRoZSBzdGFjayBmcmFtZQorICAgICAyKSB3aGljaCByZWdpc3RlcnMgYXJlIHNhdmVkIG9uIGl0CisgICAgIDMpIHRoZSBvZmZzZXRzIG9mIHNhdmVkIHJlZ3MKKyAgICAgNCkgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFjayBwb2ludGVyIHRvIHRoZSBmcmFtZSBwb2ludGVyCisgICBUaGlzIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiB0aGUgImV4dHJhIiBmaWVsZHMgb2YgdGhlIGZyYW1lX2luZm8uCisKKyAgIEEgdHlwaWNhbCBBcm0gZnVuY3Rpb24gcHJvbG9ndWUgbWlnaHQgbG9vayBsaWtlIHRoaXM6CisJbW92ICAgIGlwLCBzcAorCXN0bWZkICBzcCEsIHtmcCwgaXAsIGxyLCBwY30KKwlzdWIgICAgZnAsIGlwLCAjNAorCXN1YiAgICBzcCwgc3AsICMxNgorICAgV2hpY2ggd291bGQgY3JlYXRlIHRoaXMgc3RhY2sgZnJhbWUgKG9mZnNldHMgcmVsYXRpdmUgdG8gRlApOgorICAgICBJUCAtPiAgIDQJKGNhbGxlcidzIHN0YWNrKQorICAgICBGUCAtPiAgIDAJUEMgKHBvaW50cyB0byBhZGRyZXNzIG9mIHN0bWZkIGluc3RydWN0aW9uICsgMTIgaW4gY2FsbGVlKQorCSAgICAtNAlMUiAocmV0dXJuIGFkZHJlc3MgaW4gY2FsbGVyKQorCSAgICAtOAlJUCAoY29weSBvZiBjYWxsZXIncyBTUCkKKyAgICAgCSAgIC0xMglGUCAoY2FsbGVyJ3MgRlApCisgICAgIFNQIC0+IC0yOAlMb2NhbCB2YXJpYWJsZXMKKyAgIFRoZSBmcmFtZSBzaXplIHdvdWxkIHRodXMgYmUgMzIgYnl0ZXMsIGFuZCB0aGUgZnJhbWUgb2Zmc2V0IHdvdWxkIGJlCisgICAyOCBieXRlcy4gICovCisKK3N0YXRpYyB2b2lkCithcm1fc2Nhbl9wcm9sb2d1ZSAoZmkpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICogZmk7Cit7CisgIGludCByZWdubywgc3Bfb2Zmc2V0LCBmcF9vZmZzZXQ7CisgIENPUkVfQUREUiBwcm9sb2d1ZV9zdGFydCwgcHJvbG9ndWVfZW5kLCBjdXJyZW50X3BjOworCisgIC8qIENoZWNrIGlmIHRoaXMgZnVuY3Rpb24gaXMgYWxyZWFkeSBpbiB0aGUgY2FjaGUgb2YgZnJhbWUgaW5mb3JtYXRpb24uICovCisgIGlmIChjaGVja19wcm9sb2d1ZV9jYWNoZSAoZmkpKQorICAgIHJldHVybjsKKworICAvKiBBc3N1bWUgdGhlcmUgaXMgbm8gZnJhbWUgdW50aWwgcHJvdmVuIG90aGVyd2lzZS4gICovCisgIGZpLT5mcmFtZXJlZyAgICA9IFNQX1JFR05VTTsKKyAgZmktPmZyYW1lc2l6ZSAgID0gMDsKKyAgZmktPmZyYW1lb2Zmc2V0ID0gMDsKKworICAvKiBDaGVjayBmb3IgVGh1bWIgcHJvbG9ndWUuICAqLworICBpZiAoYXJtX3BjX2lzX3RodW1iIChmaS0+cGMpKQorICAgIHsKKyAgICAgIHRodW1iX3NjYW5fcHJvbG9ndWUgKGZpKTsKKyAgICAgIHNhdmVfcHJvbG9ndWVfY2FjaGUgKGZpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogRmluZCB0aGUgZnVuY3Rpb24gcHJvbG9ndWUuICBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBmdW5jdGlvbiBpbgorICAgICB0aGUgc3ltYm9sIHRhYmxlLCBwZWVrIGluIHRoZSBzdGFjayBmcmFtZSB0byBmaW5kIHRoZSBQQy4gICovCisgIGlmIChmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gKGZpLT5wYywgTlVMTCwgJnByb2xvZ3VlX3N0YXJ0LCAmcHJvbG9ndWVfZW5kKSkKKyAgICB7CisgICAgICAvKiBBc3N1bWUgdGhlIHByb2xvZ3VlIGlzIGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24KKyAgICAgICAgIGluIHRoZSBmdW5jdGlvbiBhbmQgdGhlIGZpcnN0IHNvdXJjZSBsaW5lLiAgKi8KKyAgICAgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsID0gZmluZF9wY19saW5lIChwcm9sb2d1ZV9zdGFydCwgMCk7CisKKyAgICAgIGlmIChzYWwubGluZSA9PSAwKQkJLyogbm8gbGluZSBpbmZvLCB1c2UgY3VycmVudCBQQyAqLworCXByb2xvZ3VlX2VuZCA9IGZpLT5wYzsKKyAgICAgIGVsc2UgaWYgKHNhbC5lbmQgPCBwcm9sb2d1ZV9lbmQpCS8qIG5leHQgbGluZSBiZWdpbnMgYWZ0ZXIgZm4gZW5kICovCisJcHJvbG9ndWVfZW5kID0gc2FsLmVuZDsJCS8qIChwcm9iYWJseSBtZWFucyBubyBwcm9sb2d1ZSkgICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogR2V0IGFkZHJlc3Mgb2YgdGhlIHN0bWZkIGluIHRoZSBwcm9sb2d1ZSBvZiB0aGUgY2FsbGVlOyB0aGUgc2F2ZWQKKyAgICAgICAgIFBDIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzdG1mZCArIDEyLiAgKi8KKyAgICAgIHByb2xvZ3VlX3N0YXJ0ID0gKHJlYWRfbWVtb3J5X2ludGVnZXIgKGZpLT5mcmFtZSwgNCkgJiAweDAzZmZmZmZjKSAtIDEyOworICAgICAgcHJvbG9ndWVfZW5kID0gcHJvbG9ndWVfc3RhcnQgKyA0MDsgLyogRklYTUU6IHNob3VsZCBiZSBiaWcgZW5vdWdoICovCisgICAgfQorCisgIC8qIE5vdyBzZWFyY2ggdGhlIHByb2xvZ3VlIGxvb2tpbmcgZm9yIGluc3RydWN0aW9ucyB0aGF0IHNldCB1cCB0aGUKKyAgICAgZnJhbWUgcG9pbnRlciwgYWRqdXN0IHRoZSBzdGFjayBwb2ludGVyLCBhbmQgc2F2ZSByZWdpc3RlcnMuICAqLworCisgIHNwX29mZnNldCA9IGZwX29mZnNldCA9IDA7CisgIGZvciAoY3VycmVudF9wYyA9IHByb2xvZ3VlX3N0YXJ0OyBjdXJyZW50X3BjIDwgcHJvbG9ndWVfZW5kOyBjdXJyZW50X3BjICs9IDQpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGluc24gPSByZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyIChjdXJyZW50X3BjLCA0KTsKKworICAgICAgaWYgKChpbnNuICYgMHhmZmZmMDAwMCkgPT0gMHhlOTJkMDAwMCkJLyogc3RtZmQgc3AhLCB7Li4uLCByNywgbHJ9ICovCisJeworCSAgaW50IG1hc2sgPSBpbnNuICYgMHhmZmZmOworCisJICAvKiBDYWxjdWxhdGUgb2Zmc2V0cyBvZiBzYXZlZCByZWdpc3RlcnMuICovCisJICBmb3IgKHJlZ25vID0gUENfUkVHTlVNOyByZWdubyA+PSAwOyByZWduby0tKQorCSAgICBpZiAobWFzayAmICgxIDw8IHJlZ25vKSkKKwkgICAgICB7CisJCXNwX29mZnNldCAtPSA0OworCQlmaS0+ZnNyLnJlZ3NbcmVnbm9dID0gc3Bfb2Zmc2V0OworCSAgICAgIH0KKwl9CisgICAgICBlbHNlIGlmICgoaW5zbiAmIDB4ZmZmZmYwMDApID09IDB4ZTI0Y2IwMDApCS8qIHN1YiBmcCwgaXAgI24gKi8KKwl7CisJICB1bnNpZ25lZCBpbW0gPSBpbnNuICYgMHhmZjsJCQkvKiBpbW1lZGlhdGUgdmFsdWUgKi8KKwkgIHVuc2lnbmVkIHJvdCA9IChpbnNuICYgMHhmMDApID4+IDc7CQkvKiByb3RhdGUgYW1vdW50ICovCisJICBpbW0gPSAoaW1tID4+IHJvdCkgfCAoaW1tIDw8ICgzMi1yb3QpKTsKKwkgIGZwX29mZnNldCA9IC1pbW07CisJICBmaS0+ZnJhbWVyZWcgPSBGUF9SRUdOVU07CisJfQorICAgICAgZWxzZSBpZiAoKGluc24gJiAweGZmZmZmMDAwKSA9PSAweGUyNGRkMDAwKQkvKiBzdWIgc3AsIHNwICNuICovCisJeworCSAgdW5zaWduZWQgaW1tID0gaW5zbiAmIDB4ZmY7CQkJLyogaW1tZWRpYXRlIHZhbHVlICovCisJICB1bnNpZ25lZCByb3QgPSAoaW5zbiAmIDB4ZjAwKSA+PiA3OwkJLyogcm90YXRlIGFtb3VudCAqLworCSAgaW1tID0gKGltbSA+PiByb3QpIHwgKGltbSA8PCAoMzItcm90KSk7CisJICBzcF9vZmZzZXQgLT0gaW1tOworCX0KKyAgICAgIGVsc2UgaWYgKChpbnNuICYgMHhmZmZmN2ZmZikgPT0gMHhlZDZkMDEwMykgLyogc3RmZSBmPywgW3NwLCAtI2NdISAqLworCXsKKwkgIHNwX29mZnNldCAtPSAxMjsKKwkgIHJlZ25vID0gRjBfUkVHTlVNICsgKChpbnNuID4+IDEyKSAmIDB4MDcpOworCSAgZmktPmZzci5yZWdzW3JlZ25vXSA9IHNwX29mZnNldDsKKwl9CisgICAgICBlbHNlIGlmIChpbnNuID09IDB4ZTFhMGMwMGQpCQkJLyogbW92IGlwLCBzcCAqLworCWNvbnRpbnVlOworICAgICAgZWxzZQorCWJyZWFrOwkvKiBub3QgYSByZWNvZ25pemVkIHByb2xvZ3VlIGluc3RydWN0aW9uICovCisgICAgfQorCisgIC8qIFRoZSBmcmFtZSBzaXplIGlzIGp1c3QgdGhlIG5lZ2F0aXZlIG9mIHRoZSBvZmZzZXQgKGZyb20gdGhlIG9yaWdpbmFsIFNQKQorICAgICBvZiB0aGUgbGFzdCB0aGluZyB0aGluZyB3ZSBwdXNoZWQgb24gdGhlIHN0YWNrLiAgVGhlIGZyYW1lIG9mZnNldCBpcworICAgICBbbmV3IEZQXSAtIFtuZXcgU1BdLiAgKi8KKyAgZmktPmZyYW1lc2l6ZSA9IC1zcF9vZmZzZXQ7CisgIGZpLT5mcmFtZW9mZnNldCA9IGZwX29mZnNldCAtIHNwX29mZnNldDsKKyAgCisgIHNhdmVfcHJvbG9ndWVfY2FjaGUgKGZpKTsKK30KKworCisvKiBGdW5jdGlvbjogZmluZF9jYWxsZXJzX3JlZworICAgRmluZCBSRUdOVU0gb24gdGhlIHN0YWNrLiAgT3RoZXJ3aXNlLCBpdCdzIGluIGFuIGFjdGl2ZSByZWdpc3Rlci4gIE9uZSB0aGluZworICAgd2UgbWlnaHQgd2FudCB0byBkbyBoZXJlIGlzIHRvIGNoZWNrIFJFR05VTSBhZ2FpbnN0IHRoZSBjbG9iYmVyIG1hc2ssIGFuZAorICAgc29tZWhvdyBmbGFnIGl0IGFzIGludmFsaWQgaWYgaXQgaXNuJ3Qgc2F2ZWQgb24gdGhlIHN0YWNrIHNvbWV3aGVyZS4gIFRoaXMKKyAgIHdvdWxkIHByb3ZpZGUgYSBncmFjZWZ1bCBmYWlsdXJlIG1vZGUgd2hlbiB0cnlpbmcgdG8gZ2V0IHRoZSB2YWx1ZSBvZgorICAgY2FsbGVyLXNhdmVzIHJlZ2lzdGVycyBmb3IgYW4gaW5uZXIgZnJhbWUuICAqLworCitzdGF0aWMgQ09SRV9BRERSCithcm1fZmluZF9jYWxsZXJzX3JlZyAoZmksIHJlZ251bSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKiBmaTsKKyAgICAgaW50IHJlZ251bTsKK3sKKyAgZm9yICg7IGZpOyBmaSA9IGZpLT5uZXh0KQorICAgIAorI2lmIDAJLyogRklYTUU6IGVuYWJsZSB0aGlzIGNvZGUgaWYgd2UgY29udmVydCB0byBuZXcgY2FsbCBkdW1teSBzY2hlbWUuICAqLworICAgIGlmIChQQ19JTl9DQUxMX0RVTU1ZIChmaS0+cGMsIGZpLT5mcmFtZSwgZmktPmZyYW1lKSkKKyAgICAgIHJldHVybiBnZW5lcmljX3JlYWRfcmVnaXN0ZXJfZHVtbXkgKGZpLT5wYywgZmktPmZyYW1lLCByZWdudW0pOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgaWYgKGZpLT5mc3IucmVnc1tyZWdudW1dICE9IDApCisJcmV0dXJuIHJlYWRfbWVtb3J5X2ludGVnZXIgKGZpLT5mc3IucmVnc1tyZWdudW1dLCAKKwkJCQkgIFJFR0lTVEVSX1JBV19TSVpFKHJlZ251bSkpOworICByZXR1cm4gcmVhZF9yZWdpc3RlciAocmVnbnVtKTsKK30KKworCisvKiBGdW5jdGlvbjogZnJhbWVfY2hhaW4KKyAgIEdpdmVuIGEgR0RCIGZyYW1lLCBkZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24ncyBmcmFtZS4KKyAgIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBHREIgZnJhbWUgc3RydWN0LCBhbmQgdGhlbgorICAgSU5JVF9FWFRSQV9GUkFNRV9JTkZPIGFuZCBJTklUX0ZSQU1FX1BDIHdpbGwgYmUgY2FsbGVkIGZvciB0aGUgbmV3IGZyYW1lLgorICAgRm9yIEFSTSwgd2Ugc2F2ZSB0aGUgZnJhbWUgc2l6ZSB3aGVuIHdlIGluaXRpYWxpemUgdGhlIGZyYW1lX2luZm8uCisKKyAgIFRoZSBvcmlnaW5hbCBkZWZpbml0aW9uIG9mIHRoaXMgZnVuY3Rpb24gd2FzIGEgbWFjcm8gaW4gdG0tYXJtLmg6CisgICAgICB7IEluIHRoZSBjYXNlIG9mIHRoZSBBUk0sIHRoZSBmcmFtZSdzIG5vbWluYWwgYWRkcmVzcyBpcyB0aGUgRlAgdmFsdWUsCisJIGFuZCAxMiBieXRlcyBiZWZvcmUgY29tZXMgdGhlIHNhdmVkIHByZXZpb3VzIEZQIHZhbHVlIGFzIGEgNC1ieXRlIHdvcmQuICB9CisKKyAgICAgICNkZWZpbmUgRlJBTUVfQ0hBSU4odGhpc2ZyYW1lKSAgXAorCSgodGhpc2ZyYW1lKS0+cGMgPj0gTE9XRVNUX1BDID8gICAgXAorCSByZWFkX21lbW9yeV9pbnRlZ2VyICgodGhpc2ZyYW1lKS0+ZnJhbWUgLSAxMiwgNCkgOlwKKwkgMCkKKyovCisKK0NPUkVfQUREUgorYXJtX2ZyYW1lX2NoYWluIChmaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKiBmaTsKK3sKKyNpZiAwCS8qIEZJWE1FOiBlbmFibGUgdGhpcyBjb2RlIGlmIHdlIGNvbnZlcnQgdG8gbmV3IGNhbGwgZHVtbXkgc2NoZW1lLiAgKi8KKyAgQ09SRV9BRERSIGZuX3N0YXJ0LCBjYWxsZXJzX3BjLCBmcDsKKworICAvKiBpcyB0aGlzIGEgZHVtbXkgZnJhbWU/ICovCisgIGlmIChQQ19JTl9DQUxMX0RVTU1ZIChmaS0+cGMsIGZpLT5mcmFtZSwgZmktPmZyYW1lKSkKKyAgICByZXR1cm4gZmktPmZyYW1lOwkvKiBkdW1teSBmcmFtZSBzYW1lIGFzIGNhbGxlcidzIGZyYW1lICovCisKKyAgLyogaXMgY2FsbGVyLW9mLXRoaXMgYSBkdW1teSBmcmFtZT8gKi8KKyAgY2FsbGVyc19wYyA9IEZSQU1FX1NBVkVEX1BDKGZpKTsgIC8qIGZpbmQgb3V0IHdobyBjYWxsZWQgdXM6ICovCisgIGZwID0gYXJtX2ZpbmRfY2FsbGVyc19yZWcgKGZpLCBGUF9SRUdOVU0pOworICBpZiAoUENfSU5fQ0FMTF9EVU1NWSAoY2FsbGVyc19wYywgZnAsIGZwKSkJCisgICAgcmV0dXJuIGZwOwkJLyogZHVtbXkgZnJhbWUncyBmcmFtZSBtYXkgYmVhciBubyByZWxhdGlvbiB0byBvdXJzICovCisKKyAgaWYgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAoZmktPnBjLCAwLCAmZm5fc3RhcnQsIDApKQorICAgIGlmIChmbl9zdGFydCA9PSBlbnRyeV9wb2ludF9hZGRyZXNzICgpKQorICAgICAgcmV0dXJuIDA7CQkvKiBpbiBfc3RhcnQgZm4sIGRvbid0IGNoYWluIGZ1cnRoZXIgKi8KKyNlbmRpZgorICBDT1JFX0FERFIgY2FsbGVyX3BjLCBmbl9zdGFydDsKKyAgc3RydWN0IGZyYW1lX2luZm8gY2FsbGVyX2ZpOworICBpbnQgZnJhbWVyZWcgPSBmaS0+ZnJhbWVyZWc7CisKKyAgaWYgKGZpLT5wYyA8IExPV0VTVF9QQykKKyAgICByZXR1cm4gMDsKKworICAvKiBJZiB0aGUgY2FsbGVyIGlzIHRoZSBzdGFydHVwIGNvZGUsIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGNoYWluLiAgKi8KKyAgY2FsbGVyX3BjID0gRlJBTUVfU0FWRURfUEMgKGZpKTsKKyAgaWYgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAoY2FsbGVyX3BjLCAwLCAmZm5fc3RhcnQsIDApKQorICAgIGlmIChmbl9zdGFydCA9PSBlbnRyeV9wb2ludF9hZGRyZXNzICgpKQorICAgICAgcmV0dXJuIDA7CisKKyAgLyogSWYgdGhlIGNhbGxlciBpcyBUaHVtYiBhbmQgdGhlIGNhbGxlciBpcyBBUk0sIG9yIHZpY2UgdmVyc2EsCisgICAgIHRoZSBmcmFtZSByZWdpc3RlciBvZiB0aGUgY2FsbGVyIGlzIGRpZmZlcmVudCBmcm9tIG91cnMuCisgICAgIFNvIHdlIG11c3Qgc2NhbiB0aGUgcHJvbG9ndWUgb2YgdGhlIGNhbGxlciB0byBkZXRlcm1pbmUgaXRzCisgICAgIGZyYW1lIHJlZ2lzdGVyIG51bWJlci4gKi8KKyAgaWYgKGFybV9wY19pc190aHVtYiAoY2FsbGVyX3BjKSAhPSBhcm1fcGNfaXNfdGh1bWIgKGZpLT5wYykpCisgICAgeworICAgICAgbWVtc2V0ICgmIGNhbGxlcl9maSwgMCwgc2l6ZW9mIChjYWxsZXJfZmkpKTsKKyAgICAgIGNhbGxlcl9maS5wYyA9IGNhbGxlcl9wYzsKKyAgICAgIGFybV9zY2FuX3Byb2xvZ3VlICgmIGNhbGxlcl9maSk7CisgICAgICBmcmFtZXJlZyA9IGNhbGxlcl9maS5mcmFtZXJlZzsKKyAgICB9CisKKyAgLyogSWYgdGhlIGNhbGxlciB1c2VkIGEgZnJhbWUgcmVnaXN0ZXIsIHJldHVybiBpdHMgdmFsdWUuCisgICAgIE90aGVyd2lzZSwgcmV0dXJuIHRoZSBjYWxsZXIncyBzdGFjayBwb2ludGVyLiAgKi8KKyAgaWYgKGZyYW1lcmVnID09IEZQX1JFR05VTSB8fCBmcmFtZXJlZyA9PSBUSFVNQl9GUF9SRUdOVU0pCisgICAgcmV0dXJuIGFybV9maW5kX2NhbGxlcnNfcmVnIChmaSwgZnJhbWVyZWcpOworICBlbHNlCisgICAgcmV0dXJuIGZpLT5mcmFtZSArIGZpLT5mcmFtZXNpemU7Cit9CisKKy8qIEZ1bmN0aW9uOiBpbml0X2V4dHJhX2ZyYW1lX2luZm8KKyAgIFRoaXMgZnVuY3Rpb24gYWN0dWFsbHkgZmlndXJlcyBvdXQgdGhlIGZyYW1lIGFkZHJlc3MgZm9yIGEgZ2l2ZW4gcGMgYW5kCisgICBzcC4gIFRoaXMgaXMgdHJpY2t5ICBiZWNhdXNlIHdlIHNvbWV0aW1lcyBkb24ndCB1c2UgYW4gZXhwbGljaXQKKyAgIGZyYW1lIHBvaW50ZXIsIGFuZCB0aGUgcHJldmlvdXMgc3RhY2sgcG9pbnRlciBpc24ndCBuZWNlc3NhcmlseSByZWNvcmRlZAorICAgb24gdGhlIHN0YWNrLiAgVGhlIG9ubHkgcmVsaWFibGUgd2F5IHRvIGdldCB0aGlzIGluZm8gaXMgdG8KKyAgIGV4YW1pbmUgdGhlIHByb2xvZ3VlLiAgKi8KKwordm9pZAorYXJtX2luaXRfZXh0cmFfZnJhbWVfaW5mbyAoZmkpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICogZmk7Cit7CisgIGludCByZWc7CisKKyAgaWYgKGZpLT5uZXh0KQorICAgIGZpLT5wYyA9IEZSQU1FX1NBVkVEX1BDIChmaS0+bmV4dCk7CisKKyAgbWVtc2V0IChmaS0+ZnNyLnJlZ3MsICdcMDAwJywgc2l6ZW9mIGZpLT5mc3IucmVncyk7CisKKyNpZiAwCS8qIEZJWE1FOiBlbmFibGUgdGhpcyBjb2RlIGlmIHdlIGNvbnZlcnQgdG8gbmV3IGNhbGwgZHVtbXkgc2NoZW1lLiAgKi8KKyAgaWYgKFBDX0lOX0NBTExfRFVNTVkgKGZpLT5wYywgZmktPmZyYW1lLCBmaS0+ZnJhbWUpKQorICAgIHsKKyAgICAgIC8qIFdlIG5lZWQgdG8gc2V0dXAgZmktPmZyYW1lIGhlcmUgYmVjYXVzZSBydW5fc3RhY2tfZHVtbXkgZ2V0cyBpdCB3cm9uZworCSBieSBhc3N1bWluZyBpdCdzIGFsd2F5cyBGUC4gICovCisgICAgICBmaS0+ZnJhbWUgICAgICAgPSBnZW5lcmljX3JlYWRfcmVnaXN0ZXJfZHVtbXkgKGZpLT5wYywgZmktPmZyYW1lLCBTUF9SRUdOVU0pOworICAgICAgZmktPmZyYW1lc2l6ZSAgID0gMDsKKyAgICAgIGZpLT5mcmFtZW9mZnNldCA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlIAorI2VuZGlmCisgICAgeworICAgICAgYXJtX3NjYW5fcHJvbG9ndWUgKGZpKTsKKworICAgICAgaWYgKCFmaS0+bmV4dCkJCQkvKiB0aGlzIGlzIHRoZSBpbm5lcm1vc3QgZnJhbWU/ICovCisJZmktPmZyYW1lID0gcmVhZF9yZWdpc3RlciAoZmktPmZyYW1lcmVnKTsKKyAgICAgIGVsc2UJCQkgCS8qIG5vdCB0aGUgaW5uZXJtb3N0IGZyYW1lICovCisJLyogSWYgd2UgaGF2ZSBhbiBGUCwgIHRoZSBjYWxsZWUgc2F2ZWQgaXQuICovCisJaWYgKGZpLT5mcmFtZXJlZyA9PSBGUF9SRUdOVU0gfHwgZmktPmZyYW1lcmVnID09IFRIVU1CX0ZQX1JFR05VTSkKKwkgIGlmIChmaS0+bmV4dC0+ZnNyLnJlZ3NbZmktPmZyYW1lcmVnXSAhPSAwKQorCSAgICBmaS0+ZnJhbWUgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChmaS0+bmV4dC0+ZnNyLnJlZ3NbZmktPmZyYW1lcmVnXSwKKwkJCQkJICAgICA0KTsKKworICAgICAgLyogQ2FsY3VsYXRlIGFjdHVhbCBhZGRyZXNzZXMgb2Ygc2F2ZWQgcmVnaXN0ZXJzIHVzaW5nIG9mZnNldHMgZGV0ZXJtaW5lZAorICAgICAgICAgYnkgYXJtX3NjYW5fcHJvbG9ndWUuICAqLworICAgICAgZm9yIChyZWcgPSAwOyByZWcgPCBOVU1fUkVHUzsgcmVnKyspCisJaWYgKGZpLT5mc3IucmVnc1tyZWddICE9IDApCisJICBmaS0+ZnNyLnJlZ3NbcmVnXSArPSBmaS0+ZnJhbWUgKyBmaS0+ZnJhbWVzaXplIC0gZmktPmZyYW1lb2Zmc2V0OworICAgIH0KK30KKworCisvKiBGdW5jdGlvbjogZnJhbWVfc2F2ZWRfcGMKKyAgIEZpbmQgdGhlIGNhbGxlciBvZiB0aGlzIGZyYW1lLiAgV2UgZG8gdGhpcyBieSBzZWVpbmcgaWYgTFJfUkVHTlVNIGlzIHNhdmVkCisgICBpbiB0aGUgc3RhY2sgYW55d2hlcmUsIG90aGVyd2lzZSB3ZSBnZXQgaXQgZnJvbSB0aGUgcmVnaXN0ZXJzLgorCisgICBUaGUgb2xkIGRlZmluaXRpb24gb2YgdGhpcyBmdW5jdGlvbiB3YXMgYSBtYWNybzoKKyAgICAgI2RlZmluZSBGUkFNRV9TQVZFRF9QQyhGUkFNRSkgXAorCUFERFJfQklUU19SRU1PVkUgKHJlYWRfbWVtb3J5X2ludGVnZXIgKChGUkFNRSktPmZyYW1lIC0gNCwgNCkpCisqLworCitDT1JFX0FERFIKK2FybV9mcmFtZV9zYXZlZF9wYyAoZmkpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICogZmk7Cit7CisjaWYgMAkvKiBGSVhNRTogZW5hYmxlIHRoaXMgY29kZSBpZiB3ZSBjb252ZXJ0IHRvIG5ldyBjYWxsIGR1bW15IHNjaGVtZS4gICovCisgIGlmIChQQ19JTl9DQUxMX0RVTU1ZIChmaS0+cGMsIGZpLT5mcmFtZSwgZmktPmZyYW1lKSkKKyAgICByZXR1cm4gZ2VuZXJpY19yZWFkX3JlZ2lzdGVyX2R1bW15IChmaS0+cGMsIGZpLT5mcmFtZSwgUENfUkVHTlVNKTsKKyAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgQ09SRV9BRERSIHBjID0gYXJtX2ZpbmRfY2FsbGVyc19yZWcgKGZpLCBMUl9SRUdOVU0pOworICAgICAgcmV0dXJuIElTX1RIVU1CX0FERFIgKHBjKSA/IFVOTUFLRV9USFVNQl9BRERSIChwYykgOiBwYzsKKyAgICB9Cit9CisKKworLyogUmV0dXJuIHRoZSBmcmFtZSBhZGRyZXNzLiAgT24gQVJNLCBpdCBpcyBSMTE7IG9uIFRodW1iIGl0IGlzIFI3LgorICAgRXhhbWluZSB0aGUgUHJvZ3JhbSBTdGF0dXMgUmVnaXN0ZXIgdG8gZGVjaWRlIHdoaWNoIHN0YXRlIHdlJ3JlIGluLiAgKi8KKworQ09SRV9BRERSCithcm1fdGFyZ2V0X3JlYWRfZnAgKCkKK3sKKyAgaWYgKHJlYWRfcmVnaXN0ZXIgKFBTX1JFR05VTSkgJiAweDIwKQkJLyogQml0IDUgaXMgVGh1bWIgc3RhdGUgYml0ICovCisgICAgcmV0dXJuIHJlYWRfcmVnaXN0ZXIgKFRIVU1CX0ZQX1JFR05VTSk7CS8qIFI3IGlmIFRodW1iICovCisgIGVsc2UKKyAgICByZXR1cm4gcmVhZF9yZWdpc3RlciAoRlBfUkVHTlVNKTsJCS8qIFIxMSBpZiBBUk0gKi8KK30KKworCisvKiBDYWxjdWxhdGUgdGhlIGZyYW1lIG9mZnNldHMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyAoQVJNIHZlcnNpb24pLiAqLwordm9pZAorYXJtX2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyAoZmksIHJlZ2FkZHIpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKKyAgICAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKnJlZ2FkZHI7Cit7CisgIG1lbWNweSAocmVnYWRkciwgJmZpLT5mc3IsIHNpemVvZiAoc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MpKTsKK30KKworCit2b2lkCithcm1fcHVzaF9kdW1teV9mcmFtZSAoKQoreworICBDT1JFX0FERFIgb2xkX3NwID0gcmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKTsKKyAgQ09SRV9BRERSIHNwID0gb2xkX3NwOworICBDT1JFX0FERFIgZnAsIHByb2xvZ3VlX3N0YXJ0OworICBpbnQgcmVnbnVtOworCisgIC8qIFB1c2ggdGhlIHR3byBkdW1teSBwcm9sb2d1ZSBpbnN0cnVjdGlvbnMgaW4gcmV2ZXJzZSBvcmRlciwKKyAgICAgc28gdGhhdCB0aGV5J2xsIGJlIGluIHRoZSBjb3JyZWN0IGxvdy10by1oaWdoIG9yZGVyIGluIG1lbW9yeS4gICovCisgIC8qIHN1YiAgICAgZnAsIGlwLCAjNCAqLworICBzcCA9IHB1c2hfd29yZCAoc3AsIDB4ZTI0Y2IwMDQpOworICAvKiAgc3RtZGIgICBzcCEsIHtyMC1yMTAsIGZwLCBpcCwgbHIsIHBjfSAqLworICBwcm9sb2d1ZV9zdGFydCA9IHNwID0gcHVzaF93b3JkIChzcCwgMHhlOTJkZGZmZik7CisKKyAgLyogcHVzaCBhIHBvaW50ZXIgdG8gdGhlIGR1bW15IHByb2xvZ3VlICsgMTIsIGJlY2F1c2Ugd2hlbgorICAgICBzdG0gaW5zdHJ1Y3Rpb24gc3RvcmVzIHRoZSBQQywgaXQgc3RvcmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBzdG0KKyAgICAgaW5zdHJ1Y3Rpb24gaXRzZWxmIHBsdXMgMTIuICAqLworICBmcCA9IHNwID0gcHVzaF93b3JkIChzcCwgcHJvbG9ndWVfc3RhcnQgKyAxMik7CisgIHNwID0gcHVzaF93b3JkIChzcCwgcmVhZF9yZWdpc3RlciAoUENfUkVHTlVNKSk7IC8qIEZJWE1FOiB3YXMgUFNfUkVHTlVNICovCisgIHNwID0gcHVzaF93b3JkIChzcCwgb2xkX3NwKTsKKyAgc3AgPSBwdXNoX3dvcmQgKHNwLCByZWFkX3JlZ2lzdGVyIChGUF9SRUdOVU0pKTsKKyAgCisgIGZvciAocmVnbnVtID0gMTA7IHJlZ251bSA+PSAwOyByZWdudW0gLS0pCisgICAgc3AgPSBwdXNoX3dvcmQgKHNwLCByZWFkX3JlZ2lzdGVyIChyZWdudW0pKTsKKyAgCisgIHdyaXRlX3JlZ2lzdGVyIChGUF9SRUdOVU0sIGZwKTsKKyAgd3JpdGVfcmVnaXN0ZXIgKFRIVU1CX0ZQX1JFR05VTSwgZnApOworICB3cml0ZV9yZWdpc3RlciAoU1BfUkVHTlVNLCBzcCk7Cit9CisKKy8qIEZpeCB1cCB0aGUgY2FsbCBkdW1teSwgYmFzZWQgb24gd2hldGhlciB0aGUgcHJvY2Vzc29yIGlzIGN1cnJlbnRseQorICAgaW4gVGh1bWIgb3IgQVJNIG1vZGUsIGFuZCB3aGV0aGVyIHRoZSB0YXJnZXQgZnVuY3Rpb24gaXMgVGh1bWIKKyAgIG9yIEFSTS4gIFRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQgc2l0dWF0aW9ucyByZXF1aXJpbmcgdGhyZWUKKyAgIGRpZmZlcmVudCBkdW1taWVzOgorCisgICAqIEFSTSBjYWxsaW5nIEFSTTogdXNlcyB0aGUgY2FsbCBkdW1teSBpbiB0bS1hcm0uaCwgd2hpY2ggaGFzIGFscmVhZHkKKyAgICAgYmVlbiBjb3BpZWQgaW50byB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIHRoaXMgZnVuY3Rpb24uCisgICAqIEFSTSBjYWxsaW5nIFRodW1iOiB1c2VzIHRoZSBjYWxsIGR1bW15IGluIHRtLWFybS5oLCBidXQgd2l0aCB0aGUKKyAgICAgIm1vdiBwYyxyNCIgaW5zdHJ1Y3Rpb24gcGF0Y2hlZCB0byBiZSBhICJieCByNCIgaW5zdGVhZC4KKyAgICogVGh1bWIgY2FsbGluZyBhbnl0aGluZzogdXNlcyB0aGUgVGh1bWIgZHVtbXkgZGVmaW5lZCBiZWxvdywgd2hpY2gKKyAgICAgd29ya3MgZm9yIGNhbGxpbmcgYm90aCBBUk0gYW5kIFRodW1iIGZ1bmN0aW9ucy4KKworICAgQWxsIHRocmVlIGNhbGwgZHVtbWllcyBleHBlY3QgdG8gcmVjZWl2ZSB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGFkZHJlc3MKKyAgIGluIFI0LCB3aXRoIHRoZSBsb3cgYml0IHNldCBpZiBpdCdzIGEgVGh1bWIgZnVuY3Rpb24uCisqLworCit2b2lkCithcm1fZml4X2NhbGxfZHVtbXkgKGR1bW15LCBwYywgZnVuLCBuYXJncywgYXJncywgdHlwZSwgZ2NjX3ApCisgICAgIGNoYXIgKiAgICAgICAgZHVtbXk7CisgICAgIENPUkVfQUREUiAgICAgcGM7CisgICAgIENPUkVfQUREUiAgICAgZnVuOworICAgICBpbnQgICAgICAgICAgIG5hcmdzOworICAgICB2YWx1ZV9wdHIgKiAgIGFyZ3M7CisgICAgIHN0cnVjdCB0eXBlICogdHlwZTsKKyAgICAgaW50ICAgICAgICAgICBnY2NfcDsKK3sKKyAgc3RhdGljIHNob3J0IHRodW1iX2R1bW15WzRdID0KKyAgeworICAgIDB4ZjAwMCwgMHhmODAxLAkvKgkgIGJsICAgICAgbGFiZWwgKi8KKyAgICAweGRmMTgsCQkvKgkgIHN3aSAgICAgMjQgKi8KKyAgICAweDQ3MjAsCQkvKiBsYWJlbDogYngJICByNCAqLworICB9OworICBzdGF0aWMgdW5zaWduZWQgbG9uZyBhcm1fYnhfcjQgPSAweGUxMmZmZjE0OwkvKiBieCByNCBpbnN0cnVjdGlvbiAqLworCisgIC8qIFNldCBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgY3VycmVudCBQQyBpcyBpbiBhIFRodW1iIGZ1bmN0aW9uLiAqLworICBjYWxsZXJfaXNfdGh1bWIgPSBhcm1fcGNfaXNfdGh1bWIgKHJlYWRfcGMoKSk7CisKKyAgLyogSWYgdGhlIHRhcmdldCBmdW5jdGlvbiBpcyBUaHVtYiwgc2V0IHRoZSBsb3cgYml0IG9mIHRoZSBmdW5jdGlvbiBhZGRyZXNzLgorICAgICBBbmQgaWYgdGhlIENQVSBpcyBjdXJyZW50bHkgaW4gQVJNIG1vZGUsIHBhdGNoIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24KKyAgICAgb2YgY2FsbCBkdW1teSB0byB1c2UgYSBCWCBpbnN0cnVjdGlvbiB0byBzd2l0Y2ggdG8gVGh1bWIgbW9kZS4gICovCisgIHRhcmdldF9pc190aHVtYiA9IGFybV9wY19pc190aHVtYiAoZnVuKTsKKyAgaWYgKHRhcmdldF9pc190aHVtYikKKyAgICB7CisgICAgICBmdW4gfD0gMTsKKyAgICAgIGlmICghY2FsbGVyX2lzX3RodW1iKQorCXN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKGR1bW15ICsgNCwgc2l6ZW9mIChhcm1fYnhfcjQpLCBhcm1fYnhfcjQpOworICAgIH0KKworICAvKiBJZiB0aGUgQ1BVIGlzIGN1cnJlbnRseSBpbiBUaHVtYiBtb2RlLCB1c2UgdGhlIFRodW1iIGNhbGwgZHVtbXkKKyAgICAgaW5zdGVhZCBvZiB0aGUgQVJNIG9uZSB0aGF0J3MgYWxyZWFkeSBiZWVuIGNvcGllZC4gIFRoaXMgd2lsbAorICAgICB3b3JrIGZvciBib3RoIFRodW1iIGFuZCBBUk0gdGFyZ2V0IGZ1bmN0aW9ucy4gICovCisgIGlmIChjYWxsZXJfaXNfdGh1bWIpCisgICAgeworICAgICAgaW50IGk7CisgICAgICBjaGFyICpwID0gZHVtbXk7CisgICAgICBpbnQgbGVuID0gc2l6ZW9mICh0aHVtYl9kdW1teSkgLyBzaXplb2YgKHRodW1iX2R1bW15WzBdKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCXsKKwkgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKHAsIHNpemVvZiAodGh1bWJfZHVtbXlbMF0pLCB0aHVtYl9kdW1teVtpXSk7CisJICBwICs9IHNpemVvZiAodGh1bWJfZHVtbXlbMF0pOworCX0KKyAgICB9CisKKyAgLyogUHV0IHRoZSB0YXJnZXQgYWRkcmVzcyBpbiByNDsgdGhlIGNhbGwgZHVtbXkgd2lsbCBjb3B5IHRoaXMgdG8gdGhlIFBDLiAqLworICB3cml0ZV9yZWdpc3RlciAoNCwgZnVuKTsKK30KKworCisvKiBSZXR1cm4gdGhlIG9mZnNldCBpbiB0aGUgY2FsbCBkdW1teSBvZiB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCBuZWVkcworICAgdG8gaGF2ZSBhIGJyZWFrcG9pbnQgcGxhY2VkIG9uIGl0LiAgVGhpcyBpcyB0aGUgb2Zmc2V0IG9mIHRoZSAnc3dpIDI0JworICAgaW5zdHJ1Y3Rpb24sIHdoaWNoIGlzIG5vIGxvbmdlciBhY3R1YWxseSB1c2VkLCBidXQgc2ltcGx5IGFjdHMKKyAgIGFzIGEgcGxhY2UtaG9sZGVyIG5vdy4KKworICAgVGhpcyBpbXBsZW1lbnRzIHRoZSBDQUxMX0RVTU1ZX0JSRUFLX09GRlNFVCBtYWNyby4KKyovCisKK2ludAorYXJtX2NhbGxfZHVtbXlfYnJlYWtwb2ludF9vZmZzZXQgKCkKK3sKKyAgaWYgKGNhbGxlcl9pc190aHVtYikKKyAgICByZXR1cm4gNDsKKyAgZWxzZQorICAgIHJldHVybiA4OworfQorCisKK0NPUkVfQUREUgorYXJtX3B1c2hfYXJndW1lbnRzKG5hcmdzLCBhcmdzLCBzcCwgc3RydWN0X3JldHVybiwgc3RydWN0X2FkZHIpCisgICAgIGludCAgICAgICAgIG5hcmdzOworICAgICB2YWx1ZV9wdHIgKiBhcmdzOworICAgICBDT1JFX0FERFIgICBzcDsKKyAgICAgaW50ICAgICAgICAgc3RydWN0X3JldHVybjsKKyAgICAgQ09SRV9BRERSICAgc3RydWN0X2FkZHI7Cit7CisgIGludCBhcmdyZWc7CisgIGludCBmbG9hdF9hcmdyZWc7CisgIGludCBhcmdudW07CisgIGludCBzdGFja19vZmZzZXQ7CisgIHN0cnVjdCBzdGFja19hcmcgeworICAgICAgY2hhciAqdmFsOworICAgICAgaW50IGxlbjsKKyAgICAgIGludCBvZmZzZXQ7CisgICAgfTsKKyAgc3RydWN0IHN0YWNrX2FyZyAqc3RhY2tfYXJncyA9CisgICAgICAoc3RydWN0IHN0YWNrX2FyZyopYWxsb2NhIChuYXJncyAqIHNpemVvZiAoc3RydWN0IHN0YWNrX2FyZykpOworICBpbnQgbnN0YWNrX2FyZ3MgPSAwOworCisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgaW50ZWdlciBhbmQgZmxvYXQgcmVnaXN0ZXIgcG9pbnRlcnMuICAqLworICBhcmdyZWcgPSBBMV9SRUdOVU07CisgIGZsb2F0X2FyZ3JlZyA9IEYwX1JFR05VTTsKKworICAvKiB0aGUgc3RydWN0X3JldHVybiBwb2ludGVyIG9jY3VwaWVzIHRoZSBmaXJzdCBwYXJhbWV0ZXItcGFzc2luZyByZWcgKi8KKyAgaWYgKHN0cnVjdF9yZXR1cm4pCisgICAgICB3cml0ZV9yZWdpc3RlciAoYXJncmVnKyssIHN0cnVjdF9hZGRyKTsKKworICAvKiBUaGUgb2Zmc2V0IG9udG8gdGhlIHN0YWNrIGF0IHdoaWNoIHdlIHdpbGwgc3RhcnQgY29weWluZyBwYXJhbWV0ZXJzCisgICAgIChhZnRlciB0aGUgcmVnaXN0ZXJzIGFyZSB1c2VkIHVwKSBiZWdpbnMgYXQgMTYgaW4gdGhlIG9sZCBBQkkuCisgICAgIFRoaXMgbGVhdmVzIHJvb20gZm9yIHRoZSAiaG9tZSIgYXJlYSBmb3IgcmVnaXN0ZXIgcGFyYW1ldGVycy4gICovCisgIHN0YWNrX29mZnNldCA9IFJFR0lTVEVSX1NJWkUgKiA0OworCisgIC8qIFByb2Nlc3MgYXJncyBmcm9tIGxlZnQgdG8gcmlnaHQuICBTdG9yZSBhcyBtYW55IGFzIGFsbG93ZWQgaW4KKwlyZWdpc3RlcnMsIHNhdmUgdGhlIHJlc3QgdG8gYmUgcHVzaGVkIG9uIHRoZSBzdGFjayAqLworICBmb3IoYXJnbnVtID0gMDsgYXJnbnVtIDwgbmFyZ3M7IGFyZ251bSsrKQorICAgIHsKKyAgICAgIGNoYXIgKiAgICAgICAgIHZhbDsKKyAgICAgIHZhbHVlX3B0ciAgICAgIGFyZyA9IGFyZ3NbYXJnbnVtXTsKKyAgICAgIHN0cnVjdCB0eXBlICogIGFyZ190eXBlID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnKSk7CisgICAgICBzdHJ1Y3QgdHlwZSAqICB0YXJnZXRfdHlwZSA9IFRZUEVfVEFSR0VUX1RZUEUgKGFyZ190eXBlKTsKKyAgICAgIGludCAgICAgICAgICAgIGxlbiA9IFRZUEVfTEVOR1RIIChhcmdfdHlwZSk7CisgICAgICBlbnVtIHR5cGVfY29kZSB0eXBlY29kZSA9IFRZUEVfQ09ERSAoYXJnX3R5cGUpOworICAgICAgQ09SRV9BRERSICAgICAgcmVndmFsOworICAgICAgaW50IG5ld2FyZzsKKworICAgICAgdmFsID0gKGNoYXIgKikgVkFMVUVfQ09OVEVOVFMgKGFyZyk7CisKKyAgICAgIC8qIElmIHRoZSBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiwgYW5kIGl0J3MgYSBUaHVtYgorICAgICAgICAgZnVuY3Rpb24sIHNldCB0aGUgbG93IGJpdCBvZiB0aGUgcG9pbnRlci4gICovCisgICAgICBpZiAodHlwZWNvZGUgPT0gVFlQRV9DT0RFX1BUUgorCSAgJiYgdGFyZ2V0X3R5cGUgIT0gTlVMTAorCSAgJiYgVFlQRV9DT0RFICh0YXJnZXRfdHlwZSkgPT0gVFlQRV9DT0RFX0ZVTkMpCisJeworCSAgcmVndmFsID0gZXh0cmFjdF9hZGRyZXNzICh2YWwsIGxlbik7CisJICBpZiAoYXJtX3BjX2lzX3RodW1iIChyZWd2YWwpKQorCSAgICBzdG9yZV9hZGRyZXNzICh2YWwsIGxlbiwgTUFLRV9USFVNQl9BRERSIChyZWd2YWwpKTsKKwl9CisKKyNkZWZpbmUgTUFQQ1NfRkxPQVQgMAkvKiAtLW1hcGNzLWZsb2F0IG5vdCBpbXBsZW1lbnRlZCBieSB0aGUgY29tcGlsZXIgeWV0ICovCisjaWYgTUFQQ1NfRkxPQVQKKyAgICAgIC8qIFVwIHRvIGZvdXIgZmxvYXRpbmcgcG9pbnQgYXJndW1lbnRzIGNhbiBiZSBwYXNzZWQgaW4gZmxvYXRpbmcKKyAgICAgICAgIHBvaW50IHJlZ2lzdGVycyBvbiBBUk0gKG5vdCBvbiBUaHVtYikuICAqLworICAgICAgaWYgKHR5cGVjb2RlID09IFRZUEVfQ09ERV9GTFQKKwkgICYmIGZsb2F0X2FyZ3JlZyA8PSBBUk1fTEFTVF9GUF9BUkdfUkVHTlVNCisJICAmJiAhdGFyZ2V0X2lzX3RodW1iKQorCXsKKwkgIC8qIFRoaXMgaXMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSB0aGF0IGZpdHMgZW50aXJlbHkKKwkgICAgIGluIGEgc2luZ2xlIHJlZ2lzdGVyLiAgKi8KKwkgIHJlZ3ZhbCA9IGV4dHJhY3RfYWRkcmVzcyAodmFsLCBsZW4pOworCSAgd3JpdGVfcmVnaXN0ZXIgKGZsb2F0X2FyZ3JlZysrLCByZWd2YWwpOworCX0KKyAgICAgIGVsc2UKKyNlbmRpZgorCXsKKwkgIC8qIENvcHkgdGhlIGFyZ3VtZW50IHRvIGdlbmVyYWwgcmVnaXN0ZXJzIG9yIHRoZSBzdGFjayBpbgorCSAgICAgcmVnaXN0ZXItc2l6ZWQgcGllY2VzLiAgTGFyZ2UgYXJndW1lbnRzIGFyZSBzcGxpdCBiZXR3ZWVuCisJICAgICByZWdpc3RlcnMgYW5kIHN0YWNrLiAgKi8KKwkgIHdoaWxlIChsZW4gPiAwKQorCSAgICB7CisJICAgICAgaWYgKGFyZ3JlZyA8PSBBUk1fTEFTVF9BUkdfUkVHTlVNKQorCQl7CisJICAgICAgICAgIGludCBwYXJ0aWFsX2xlbiA9IGxlbiA8IFJFR0lTVEVSX1NJWkUgPyBsZW4gOiBSRUdJU1RFUl9TSVpFOworCQkgIHJlZ3ZhbCA9IGV4dHJhY3RfYWRkcmVzcyAodmFsLCBwYXJ0aWFsX2xlbik7CisKKwkJICAvKiBJdCdzIGEgc2ltcGxlIGFyZ3VtZW50IGJlaW5nIHBhc3NlZCBpbiBhIGdlbmVyYWwKKwkJICAgICByZWdpc3Rlci4gICovCisJCSAgd3JpdGVfcmVnaXN0ZXIgKGFyZ3JlZywgcmVndmFsKTsKKwkJICBhcmdyZWcrKzsKKwkgICAgICAgICAgbGVuIC09IHBhcnRpYWxfbGVuOworCSAgICAgICAgICB2YWwgKz0gcGFydGlhbF9sZW47CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiBrZWVwIGZvciBsYXRlciBwdXNoaW5nICovCisJCSAgc3RhY2tfYXJnc1tuc3RhY2tfYXJnc10udmFsID0gdmFsOworCQkgIHN0YWNrX2FyZ3NbbnN0YWNrX2FyZ3MrK10ubGVuID0gbGVuOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICAgIC8qIG5vdyBkbyB0aGUgcmVhbCBzdGFjayBwdXNoaW5nLCBwcm9jZXNzIGFyZ3MgcmlnaHQgdG8gbGVmdCAqLworICAgIHdoaWxlKG5zdGFja19hcmdzLS0pCisgICAgICB7CisJc3AgLT0gc3RhY2tfYXJnc1tuc3RhY2tfYXJnc10ubGVuOworCXdyaXRlX21lbW9yeShzcCwgc3RhY2tfYXJnc1tuc3RhY2tfYXJnc10udmFsLAorCQlzdGFja19hcmdzW25zdGFja19hcmdzXS5sZW4pOworICAgICAgfQorCisgIC8qIFJldHVybiBhZGp1c3RlZCBzdGFjayBwb2ludGVyLiAgKi8KKyAgcmV0dXJuIHNwOworfQorCit2b2lkCithcm1fcG9wX2ZyYW1lICgpCit7CisgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZSA9IGdldF9jdXJyZW50X2ZyYW1lKCk7CisgIGludCByZWdudW07CisKKyAgZm9yIChyZWdudW0gPSAwOyByZWdudW0gPCBOVU1fUkVHUzsgcmVnbnVtKyspCisgICAgaWYgKGZyYW1lLT5mc3IucmVnc1tyZWdudW1dICE9IDApCisgICAgICB3cml0ZV9yZWdpc3RlciAocmVnbnVtLCAKKwkJICAgICAgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnJhbWUtPmZzci5yZWdzW3JlZ251bV0sIDQpKTsKKworICB3cml0ZV9yZWdpc3RlciAoUENfUkVHTlVNLCBGUkFNRV9TQVZFRF9QQyAoZnJhbWUpKTsKKyAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgcmVhZF9yZWdpc3RlciAoZnJhbWUtPmZyYW1lcmVnKSk7CisKKyAgZmx1c2hfY2FjaGVkX2ZyYW1lcyAoKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2ZwdV9mbGFncyAoZmxhZ3MpCisgICAgIGludCBmbGFnczsKK3sKKyAgICBpZiAoZmxhZ3MgJiAoMSA8PCAwKSkgZnB1dHMgKCJJVk8gIiwgc3Rkb3V0KTsKKyAgICBpZiAoZmxhZ3MgJiAoMSA8PCAxKSkgZnB1dHMgKCJEVlogIiwgc3Rkb3V0KTsKKyAgICBpZiAoZmxhZ3MgJiAoMSA8PCAyKSkgZnB1dHMgKCJPRkwgIiwgc3Rkb3V0KTsKKyAgICBpZiAoZmxhZ3MgJiAoMSA8PCAzKSkgZnB1dHMgKCJVRkwgIiwgc3Rkb3V0KTsKKyAgICBpZiAoZmxhZ3MgJiAoMSA8PCA0KSkgZnB1dHMgKCJJTlggIiwgc3Rkb3V0KTsKKyAgICBwdXRjaGFyICgnXG4nKTsKK30KKwordm9pZAorYXJtX2Zsb2F0X2luZm8gKCkKK3sKKyAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHN0YXR1cyA9IHJlYWRfcmVnaXN0ZXIgKEZQU19SRUdOVU0pOworICAgIGludCB0eXBlOworCisgICAgdHlwZSA9IChzdGF0dXMgPj4gMjQpICYgMTI3OworICAgIHByaW50ZiAoIiVzIEZQVSB0eXBlICVkXG4iLAorCSAgICAoc3RhdHVzICYgKDE8PDMxKSkgPyAiSGFyZHdhcmUiIDogIlNvZnR3YXJlIiwKKwkgICAgdHlwZSk7CisgICAgZnB1dHMgKCJtYXNrOiAiLCBzdGRvdXQpOworICAgIHByaW50X2ZwdV9mbGFncyAoc3RhdHVzID4+IDE2KTsKKyAgICBmcHV0cyAoImZsYWdzOiAiLCBzdGRvdXQpOworICAgIHByaW50X2ZwdV9mbGFncyAoc3RhdHVzKTsKK30KKworc3RhdGljIGNoYXIgKm9yaWdpbmFsX3JlZ2lzdGVyX25hbWVzW10gPQoreyAiYTEiLCAiYTIiLCAiYTMiLCAiYTQiLCAvKiAgMCAgMSAgMiAgMyAqLworICAidjEiLCAidjIiLCAidjMiLCAidjQiLCAvKiAgNCAgNSAgNiAgNyAqLworICAidjUiLCAidjYiLCAic2wiLCAiZnAiLCAvKiAgOCAgOSAxMCAxMSAqLworICAiaXAiLCAic3AiLCAibHIiLCAicGMiLCAvKiAxMiAxMyAxNCAxNSAqLworICAiZjAiLCAiZjEiLCAiZjIiLCAiZjMiLCAvKiAxNiAxNyAxOCAxOSAqLworICAiZjQiLCAiZjUiLCAiZjYiLCAiZjciLCAvKiAyMCAyMSAyMiAyMyAqLworICAiZnBzIiwicHMiIH0gICAgICAgICAgICAvKiAyNCAyNSAgICAgICAqLzsKKworLyogVGhlc2UgbmFtZXMgYXJlIHRoZSBvbmVzIHdoaWNoIGdjYyBlbWl0cywgYW5kIAorICAgSSBmaW5kIHRoZW0gbGVzcyBjb25mdXNpbmcuICBUb2dnbGUgYmV0d2VlbiB0aGVtCisgICB1c2luZyB0aGUgYG90aGVybmFtZXMnIGNvbW1hbmQuICovCitzdGF0aWMgY2hhciAqYWRkaXRpb25hbF9yZWdpc3Rlcl9uYW1lc1tdID0KK3sgInIwIiwgInIxIiwgInIyIiwgInIzIiwgLyogIDAgIDEgIDIgIDMgKi8KKyAgInI0IiwgInI1IiwgInI2IiwgInI3IiwgLyogIDQgIDUgIDYgIDcgKi8KKyAgInI4IiwgInI5IiwgInNsIiwgImZwIiwgLyogIDggIDkgMTAgMTEgKi8KKyAgImlwIiwgInNwIiwgImxyIiwgInBjIiwgLyogMTIgMTMgMTQgMTUgKi8KKyAgImYwIiwgImYxIiwgImYyIiwgImYzIiwgLyogMTYgMTcgMTggMTkgKi8KKyAgImY0IiwgImY1IiwgImY2IiwgImY3IiwgLyogMjAgMjEgMjIgMjMgKi8KKyAgImZwcyIsInBzIiB9ICAgICAgICAgICAgLyogMjQgMjUgICAgICAgKi87CisKK2NoYXIgKiphcm1fcmVnaXN0ZXJfbmFtZXMgPSBvcmlnaW5hbF9yZWdpc3Rlcl9uYW1lczsKKworCitzdGF0aWMgdm9pZAorYXJtX290aGVybmFtZXMgKCkKK3sKKyAgc3RhdGljIGludCB0b2dnbGU7CisgIGFybV9yZWdpc3Rlcl9uYW1lcyA9ICh0b2dnbGUKKwkJCT8gYWRkaXRpb25hbF9yZWdpc3Rlcl9uYW1lcworCQkJOiBvcmlnaW5hbF9yZWdpc3Rlcl9uYW1lcyk7CisgIHRvZ2dsZSA9ICF0b2dnbGU7Cit9CisKKy8qIEZJWE1FOiAgRmlsbCBpbiB3aXRoIHRoZSAncmlnaHQgdGhpbmcnLCBzZWUgYXNtIAorICAgdGVtcGxhdGUgaW4gYXJtLWNvbnZlcnQucyAqLworCit2b2lkIAorY29udmVydF9mcm9tX2V4dGVuZGVkIChwdHIsIGRibCkKKyAgICAgdm9pZCAqIHB0cjsKKyAgICAgZG91YmxlICogZGJsOworeworICAqZGJsID0gKihkb3VibGUqKXB0cjsKK30KKwordm9pZCAKK2NvbnZlcnRfdG9fZXh0ZW5kZWQgKGRibCwgcHRyKQorICAgICB2b2lkICogcHRyOworICAgICBkb3VibGUgKiBkYmw7Cit7CisgICooZG91YmxlKilwdHIgPSAqZGJsOworfQorCitzdGF0aWMgaW50Citjb25kaXRpb25fdHJ1ZSAoY29uZCwgc3RhdHVzX3JlZykKKyAgICAgdW5zaWduZWQgbG9uZyBjb25kOworICAgICB1bnNpZ25lZCBsb25nIHN0YXR1c19yZWc7Cit7CisgIGlmIChjb25kID09IElOU1RfQUwgfHwgY29uZCA9PSBJTlNUX05WKQorICAgIHJldHVybiAxOworCisgIHN3aXRjaCAoY29uZCkKKyAgICB7CisgICAgY2FzZSBJTlNUX0VROgorICAgICAgcmV0dXJuICgoc3RhdHVzX3JlZyAmIEZMQUdfWikgIT0gMCk7CisgICAgY2FzZSBJTlNUX05FOgorICAgICAgcmV0dXJuICgoc3RhdHVzX3JlZyAmIEZMQUdfWikgPT0gMCk7CisgICAgY2FzZSBJTlNUX0NTOgorICAgICAgcmV0dXJuICgoc3RhdHVzX3JlZyAmIEZMQUdfQykgIT0gMCk7CisgICAgY2FzZSBJTlNUX0NDOgorICAgICAgcmV0dXJuICgoc3RhdHVzX3JlZyAmIEZMQUdfQykgPT0gMCk7CisgICAgY2FzZSBJTlNUX01JOgorICAgICAgcmV0dXJuICgoc3RhdHVzX3JlZyAmIEZMQUdfTikgIT0gMCk7CisgICAgY2FzZSBJTlNUX1BMOgorICAgICAgcmV0dXJuICgoc3RhdHVzX3JlZyAmIEZMQUdfTikgPT0gMCk7CisgICAgY2FzZSBJTlNUX1ZTOgorICAgICAgcmV0dXJuICgoc3RhdHVzX3JlZyAmIEZMQUdfVikgIT0gMCk7CisgICAgY2FzZSBJTlNUX1ZDOgorICAgICAgcmV0dXJuICgoc3RhdHVzX3JlZyAmIEZMQUdfVikgPT0gMCk7CisgICAgY2FzZSBJTlNUX0hJOgorICAgICAgcmV0dXJuICgoc3RhdHVzX3JlZyAmIChGTEFHX0MgfCBGTEFHX1opKSA9PSBGTEFHX0MpOworICAgIGNhc2UgSU5TVF9MUzoKKyAgICAgIHJldHVybiAoKHN0YXR1c19yZWcgJiAoRkxBR19DIHwgRkxBR19aKSkgIT0gRkxBR19DKTsKKyAgICBjYXNlIElOU1RfR0U6CisgICAgICByZXR1cm4gKCgoc3RhdHVzX3JlZyAmIEZMQUdfTikgPT0gMCkgPT0gKChzdGF0dXNfcmVnICYgRkxBR19WKSA9PSAwKSk7CisgICAgY2FzZSBJTlNUX0xUOgorICAgICAgcmV0dXJuICgoKHN0YXR1c19yZWcgJiBGTEFHX04pID09IDApICE9ICgoc3RhdHVzX3JlZyAmIEZMQUdfVikgPT0gMCkpOworICAgIGNhc2UgSU5TVF9HVDoKKyAgICAgIHJldHVybiAoKChzdGF0dXNfcmVnICYgRkxBR19aKSA9PSAwKSAmJgorCSAgICAgICgoKHN0YXR1c19yZWcgJiBGTEFHX04pID09IDApID09ICgoc3RhdHVzX3JlZyAmIEZMQUdfVikgPT0gMCkpKTsKKyAgICBjYXNlIElOU1RfTEU6CisgICAgICByZXR1cm4gKCgoc3RhdHVzX3JlZyAmIEZMQUdfWikgIT0gMCkgfHwKKwkgICAgICAoKChzdGF0dXNfcmVnICYgRkxBR19OKSA9PSAwKSAhPSAoKHN0YXR1c19yZWcgJiBGTEFHX1YpID09IDApKSk7CisgICAgfQorICByZXR1cm4gMTsKK30KKworI2RlZmluZSBzdWJtYXNrKHgpICgoMUwgPDwgKCh4KSArIDEpKSAtIDEpCisjZGVmaW5lIGJpdChvYmosc3QpICgoKG9iaikgPj4gKHN0KSkgJiAxKQorI2RlZmluZSBiaXRzKG9iaixzdCxmbikgKCgob2JqKSA+PiAoc3QpKSAmIHN1Ym1hc2sgKChmbikgLSAoc3QpKSkKKyNkZWZpbmUgc2JpdHMob2JqLHN0LGZuKSBcCisgICgobG9uZykgKGJpdHMob2JqLHN0LGZuKSB8ICgobG9uZykgYml0KG9iaixmbikgKiB+IHN1Ym1hc2sgKGZuIC0gc3QpKSkpCisjZGVmaW5lIEJyYW5jaERlc3QoYWRkcixpbnN0cikgXAorICAoKENPUkVfQUREUikgKCgobG9uZykgKGFkZHIpKSArIDggKyAoc2JpdHMgKGluc3RyLCAwLCAyMykgPDwgMikpKQorI2RlZmluZSBBUk1fUENfMzIgMQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworc2hpZnRlZF9yZWdfdmFsIChpbnN0LCBjYXJyeSwgcGNfdmFsLCBzdGF0dXNfcmVnKQorICAgICB1bnNpZ25lZCBsb25nIGluc3Q7CisgICAgIGludCBjYXJyeTsKKyAgICAgdW5zaWduZWQgbG9uZyBwY192YWw7CisgICAgIHVuc2lnbmVkIGxvbmcgc3RhdHVzX3JlZzsKK3sKKyAgdW5zaWduZWQgbG9uZyByZXMsIHNoaWZ0OworICBpbnQgcm0gPSBiaXRzIChpbnN0LCAwLCAzKTsKKyAgdW5zaWduZWQgbG9uZyBzaGlmdHR5cGUgPSBiaXRzIChpbnN0LCA1LCA2KTsKKyAKKyAgaWYgKGJpdChpbnN0LCA0KSkKKyAgICB7CisgICAgICBpbnQgcnMgPSBiaXRzIChpbnN0LCA4LCAxMSk7CisgICAgICBzaGlmdCA9IChycyA9PSAxNSA/IHBjX3ZhbCArIDggOiByZWFkX3JlZ2lzdGVyIChycykpICYgMHhGRjsKKyAgICB9CisgIGVsc2UKKyAgICBzaGlmdCA9IGJpdHMgKGluc3QsIDcsIDExKTsKKyAKKyAgcmVzID0gKHJtID09IDE1IAorCSA/ICgocGNfdmFsIHwgKEFSTV9QQ18zMiA/IDAgOiBzdGF0dXNfcmVnKSkKKwkgICAgKyAoYml0IChpbnN0LCA0KSA/IDEyIDogOCkpIAorCSA6IHJlYWRfcmVnaXN0ZXIgKHJtKSk7CisKKyAgc3dpdGNoIChzaGlmdHR5cGUpCisgICAgeworICAgIGNhc2UgMDogLyogTFNMICovCisgICAgICByZXMgPSBzaGlmdCA+PSAzMiA/IDAgOiByZXMgPDwgc2hpZnQ7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgMTogLyogTFNSICovCisgICAgICByZXMgPSBzaGlmdCA+PSAzMiA/IDAgOiByZXMgPj4gc2hpZnQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMjogLyogQVNSICovCisgICAgICBpZiAoc2hpZnQgPj0gMzIpIHNoaWZ0ID0gMzE7CisgICAgICByZXMgPSAoKHJlcyAmIDB4ODAwMDAwMDBMKQorCSAgICAgPyB+KCh+cmVzKSA+PiBzaGlmdCkgOiByZXMgPj4gc2hpZnQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDM6IC8qIFJPUi9SUlggKi8KKyAgICAgIHNoaWZ0ICY9IDMxOworICAgICAgaWYgKHNoaWZ0ID09IDApCisJcmVzID0gKHJlcyA+PiAxKSB8IChjYXJyeSA/IDB4ODAwMDAwMDBMIDogMCk7CisgICAgICBlbHNlCisJcmVzID0gKHJlcyA+PiBzaGlmdCkgfCAocmVzIDw8ICgzMi1zaGlmdCkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiByZXMgJiAweGZmZmZmZmZmOworfQorCisKKy8qIFJldHVybiBudW1iZXIgb2YgMS1iaXRzIGluIFZBTC4gICovCisKK3N0YXRpYyBpbnQKK2JpdGNvdW50ICh2YWwpCisgICAgIHVuc2lnbmVkIGxvbmcgdmFsOworeworICBpbnQgbmJpdHM7CisgIGZvciAobmJpdHMgPSAwOyB2YWwgIT0gMDsgbmJpdHMrKykKKyAgICB2YWwgJj0gdmFsIC0gMTsJLyogZGVsZXRlIHJpZ2h0bW9zdCAxLWJpdCBpbiB2YWwgKi8KKyAgcmV0dXJuIG5iaXRzOworfQorCisKK3N0YXRpYyBDT1JFX0FERFIKK3RodW1iX2dldF9uZXh0X3BjIChwYykKKyAgICAgQ09SRV9BRERSIHBjOworeworICB1bnNpZ25lZCBsb25nIHBjX3ZhbCA9ICgodW5zaWduZWQgbG9uZylwYykgKyA0OwkvKiBQQyBhZnRlciBwcmVmZXRjaCAqLworICB1bnNpZ25lZCBzaG9ydCBpbnN0MSA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAyKTsKKyAgQ09SRV9BRERSIG5leHRwYyA9IHBjICsgMjsJCS8qIGRlZmF1bHQgaXMgbmV4dCBpbnN0cnVjdGlvbiAqLworICB1bnNpZ25lZCBsb25nIG9mZnNldDsKKworICBpZiAoKGluc3QxICYgMHhmZjAwKSA9PSAweGJkMDApCS8qIHBvcCB7cmxpc3QsIHBjfSAqLworICAgIHsKKyAgICAgIENPUkVfQUREUiBzcDsKKworICAgICAgLyogRmV0Y2ggdGhlIHNhdmVkIFBDIGZyb20gdGhlIHN0YWNrLiAgSXQncyBzdG9yZWQgYWJvdmUKKyAgICAgICAgIGFsbCBvZiB0aGUgb3RoZXIgcmVnaXN0ZXJzLiAgKi8KKyAgICAgIG9mZnNldCA9IGJpdGNvdW50IChiaXRzIChpbnN0MSwgMCwgNykpICogUkVHSVNURVJfU0laRTsKKyAgICAgIHNwID0gcmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKTsKKyAgICAgIG5leHRwYyA9IChDT1JFX0FERFIpIHJlYWRfbWVtb3J5X2ludGVnZXIgKHNwICsgb2Zmc2V0LCA0KTsKKyAgICAgIG5leHRwYyA9IEFERFJfQklUU19SRU1PVkUgKG5leHRwYyk7CisgICAgICBpZiAobmV4dHBjID09IHBjKQorCWVycm9yICgiSW5maW5pdGUgbG9vcCBkZXRlY3RlZCIpOworICAgIH0KKyAgZWxzZSBpZiAoKGluc3QxICYgMHhmMDAwKSA9PSAweGQwMDApCS8qIGNvbmRpdGlvbmFsIGJyYW5jaCAqLworICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgc3RhdHVzID0gcmVhZF9yZWdpc3RlciAoUFNfUkVHTlVNKTsKKyAgICAgIHVuc2lnbmVkIGxvbmcgY29uZCA9IGJpdHMgKGluc3QxLCA4LCAxMSk7IAorICAgICAgaWYgKGNvbmQgIT0gMHgwZiAmJiBjb25kaXRpb25fdHJ1ZSAoY29uZCwgc3RhdHVzKSkJLyogMHgwZiA9IFNXSSAqLworCW5leHRwYyA9IHBjX3ZhbCArIChzYml0cyAoaW5zdDEsIDAsIDcpIDw8IDEpOworICAgIH0KKyAgZWxzZSBpZiAoKGluc3QxICYgMHhmODAwKSA9PSAweGUwMDApCS8qIHVuY29uZGl0aW9uYWwgYnJhbmNoICovCisgICAgeworICAgICAgbmV4dHBjID0gcGNfdmFsICsgKHNiaXRzIChpbnN0MSwgMCwgMTApIDw8IDEpOworICAgIH0KKyAgZWxzZSBpZiAoKGluc3QxICYgMHhmODAwKSA9PSAweGYwMDApCS8qIGxvbmcgYnJhbmNoIHdpdGggbGluayAqLworICAgIHsKKyAgICAgIHVuc2lnbmVkIHNob3J0IGluc3QyID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMgKyAyLCAyKTsKKyAgICAgIG9mZnNldCA9IChzYml0cyAoaW5zdDEsIDAsIDEwKSA8PCAxMikgKyAoYml0cyAgKGluc3QyLCAwLCAxMCkgPDwgMSk7CisgICAgICBuZXh0cGMgPSBwY192YWwgKyBvZmZzZXQ7CisgICAgfQorCisgIHJldHVybiBuZXh0cGM7Cit9CisKKworQ09SRV9BRERSCithcm1fZ2V0X25leHRfcGMgKHBjKQorICAgICBDT1JFX0FERFIgcGM7Cit7CisgIHVuc2lnbmVkIGxvbmcgcGNfdmFsOworICB1bnNpZ25lZCBsb25nIHRoaXNfaW5zdHI7CisgIHVuc2lnbmVkIGxvbmcgc3RhdHVzOworICBDT1JFX0FERFIgbmV4dHBjOworCisgIGlmIChhcm1fcGNfaXNfdGh1bWIgKHBjKSkKKyAgICByZXR1cm4gdGh1bWJfZ2V0X25leHRfcGMgKHBjKTsKKworICBwY192YWwgPSAodW5zaWduZWQgbG9uZykgcGM7CisgIHRoaXNfaW5zdHIgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgNCk7CisgIHN0YXR1cyA9IHJlYWRfcmVnaXN0ZXIgKFBTX1JFR05VTSk7CisgIG5leHRwYyA9IChDT1JFX0FERFIpIChwY192YWwgKyA0KTsgIC8qIERlZmF1bHQgY2FzZSAqLworCisgIGlmIChjb25kaXRpb25fdHJ1ZSAoYml0cyAodGhpc19pbnN0ciwgMjgsIDMxKSwgc3RhdHVzKSkKKyAgICB7CisgICAgICBzd2l0Y2ggKGJpdHMgKHRoaXNfaW5zdHIsIDI0LCAyNykpCisJeworCWNhc2UgMHgwOiBjYXNlIDB4MTogLyogZGF0YSBwcm9jZXNzaW5nICovCisJY2FzZSAweDI6IGNhc2UgMHgzOgorCSAgeworCSAgICB1bnNpZ25lZCBsb25nIG9wZXJhbmQxLCBvcGVyYW5kMiwgcmVzdWx0ID0gMDsKKwkgICAgdW5zaWduZWQgbG9uZyBybjsKKwkgICAgaW50IGM7CisgCisJICAgIGlmIChiaXRzICh0aGlzX2luc3RyLCAxMiwgMTUpICE9IDE1KQorCSAgICAgIGJyZWFrOworCisJICAgIGlmIChiaXRzICh0aGlzX2luc3RyLCAyMiwgMjUpID09IDAKKwkJJiYgYml0cyAodGhpc19pbnN0ciwgNCwgNykgPT0gOSkgIC8qIG11bHRpcGx5ICovCisJICAgICAgZXJyb3IgKCJJbGxlZ2FsIHVwZGF0ZSB0byBwYyBpbiBpbnN0cnVjdGlvbiIpOworCisJICAgIC8qIE11bHRpcGx5IGludG8gUEMgKi8KKwkgICAgYyA9IChzdGF0dXMgJiBGTEFHX0MpID8gMSA6IDA7CisJICAgIHJuID0gYml0cyAodGhpc19pbnN0ciwgMTYsIDE5KTsKKwkgICAgb3BlcmFuZDEgPSAocm4gPT0gMTUpID8gcGNfdmFsICsgOCA6IHJlYWRfcmVnaXN0ZXIgKHJuKTsKKyAKKwkgICAgaWYgKGJpdCAodGhpc19pbnN0ciwgMjUpKQorCSAgICAgIHsKKwkJdW5zaWduZWQgbG9uZyBpbW12YWwgPSBiaXRzICh0aGlzX2luc3RyLCAwLCA3KTsKKwkJdW5zaWduZWQgbG9uZyByb3RhdGUgPSAyICogYml0cyAodGhpc19pbnN0ciwgOCwgMTEpOworCQlvcGVyYW5kMiA9ICgoaW1tdmFsID4+IHJvdGF0ZSkgfCAoaW1tdmFsIDw8ICgzMi1yb3RhdGUpKSkKKwkJCSAgICYgMHhmZmZmZmZmZjsKKwkgICAgICB9CisJICAgIGVsc2UgIC8qIG9wZXJhbmQgMiBpcyBhIHNoaWZ0ZWQgcmVnaXN0ZXIgKi8KKwkgICAgICBvcGVyYW5kMiA9IHNoaWZ0ZWRfcmVnX3ZhbCAodGhpc19pbnN0ciwgYywgcGNfdmFsLCBzdGF0dXMpOworIAorCSAgICBzd2l0Y2ggKGJpdHMgKHRoaXNfaW5zdHIsIDIxLCAyNCkpCisJICAgICAgeworCSAgICAgIGNhc2UgMHgwOiAvKmFuZCovCisJCXJlc3VsdCA9IG9wZXJhbmQxICYgb3BlcmFuZDI7CisJCWJyZWFrOworCisJICAgICAgY2FzZSAweDE6IC8qZW9yKi8KKwkJcmVzdWx0ID0gb3BlcmFuZDEgXiBvcGVyYW5kMjsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlIDB4MjogLypzdWIqLworCQlyZXN1bHQgPSBvcGVyYW5kMSAtIG9wZXJhbmQyOworCQlicmVhazsKKworCSAgICAgIGNhc2UgMHgzOiAvKnJzYiovCisJCXJlc3VsdCA9IG9wZXJhbmQyIC0gb3BlcmFuZDE7CisJCWJyZWFrOworCisJICAgICAgY2FzZSAweDQ6ICAvKmFkZCovCisJCXJlc3VsdCA9IG9wZXJhbmQxICsgb3BlcmFuZDI7CisJCWJyZWFrOworCisJICAgICAgY2FzZSAweDU6IC8qYWRjKi8KKwkJcmVzdWx0ID0gb3BlcmFuZDEgKyBvcGVyYW5kMiArIGM7CisJCWJyZWFrOworCisJICAgICAgY2FzZSAweDY6IC8qc2JjKi8KKwkJcmVzdWx0ID0gb3BlcmFuZDEgLSBvcGVyYW5kMiArIGM7CisJCWJyZWFrOworCisJICAgICAgY2FzZSAweDc6IC8qcnNjKi8KKwkJcmVzdWx0ID0gb3BlcmFuZDIgLSBvcGVyYW5kMSArIGM7CisJCWJyZWFrOworCisJICAgICAgY2FzZSAweDg6IGNhc2UgMHg5OiBjYXNlIDB4YTogY2FzZSAweGI6IC8qIHRzdCwgdGVxLCBjbXAsIGNtbiAqLworCQlyZXN1bHQgPSAodW5zaWduZWQgbG9uZykgbmV4dHBjOworCQlicmVhazsKKworCSAgICAgIGNhc2UgMHhjOiAvKm9yciovCisJCXJlc3VsdCA9IG9wZXJhbmQxIHwgb3BlcmFuZDI7CisJCWJyZWFrOworCisJICAgICAgY2FzZSAweGQ6IC8qbW92Ki8KKwkJLyogQWx3YXlzIHN0ZXAgaW50byBhIGZ1bmN0aW9uLiAgKi8KKwkJcmVzdWx0ID0gb3BlcmFuZDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkgICAgICBjYXNlIDB4ZTogLypiaWMqLworCQlyZXN1bHQgPSBvcGVyYW5kMSAmIH5vcGVyYW5kMjsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlIDB4ZjogLyptdm4qLworCQlyZXN1bHQgPSB+b3BlcmFuZDI7CisJCWJyZWFrOworCSAgICAgIH0KKwkgICAgbmV4dHBjID0gKENPUkVfQUREUikgQUREUl9CSVRTX1JFTU9WRSAocmVzdWx0KTsKKworCSAgICBpZiAobmV4dHBjID09IHBjKQorCSAgICAgIGVycm9yICgiSW5maW5pdGUgbG9vcCBkZXRlY3RlZCIpOworCSAgICBicmVhazsKKwkgIH0KKyAKKwljYXNlIDB4NDogY2FzZSAweDU6IC8qIGRhdGEgdHJhbnNmZXIgKi8KKwljYXNlIDB4NjogY2FzZSAweDc6CisJICBpZiAoYml0ICh0aGlzX2luc3RyLCAyMCkpCisJICAgIHsKKwkgICAgICAvKiBsb2FkICovCisJICAgICAgaWYgKGJpdHMgKHRoaXNfaW5zdHIsIDEyLCAxNSkgPT0gMTUpCisJCXsKKwkJICAvKiByZCA9PSBwYyAqLworCQkgIHVuc2lnbmVkIGxvbmcgIHJuOworCQkgIHVuc2lnbmVkIGxvbmcgYmFzZTsKKyAKKwkJICBpZiAoYml0ICh0aGlzX2luc3RyLCAyMikpCisJCSAgICBlcnJvciAoIklsbGVnYWwgdXBkYXRlIHRvIHBjIGluIGluc3RydWN0aW9uIik7CisKKwkJICAvKiBieXRlIHdyaXRlIHRvIFBDICovCisJCSAgcm4gPSBiaXRzICh0aGlzX2luc3RyLCAxNiwgMTkpOworCQkgIGJhc2UgPSAocm4gPT0gMTUpID8gcGNfdmFsICsgOCA6IHJlYWRfcmVnaXN0ZXIgKHJuKTsKKwkJICBpZiAoYml0ICh0aGlzX2luc3RyLCAyNCkpCisJCSAgICB7CisJCSAgICAgIC8qIHByZS1pbmRleGVkICovCisJCSAgICAgIGludCBjID0gKHN0YXR1cyAmIEZMQUdfQykgPyAxIDogMDsKKwkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQgPQorCQkJKGJpdCAodGhpc19pbnN0ciwgMjUpCisJCQkgPyBzaGlmdGVkX3JlZ192YWwgKHRoaXNfaW5zdHIsIGMsIHBjX3ZhbCkKKwkJCSA6IGJpdHMgKHRoaXNfaW5zdHIsIDAsIDExKSk7CisKKwkJICAgICAgaWYgKGJpdCAodGhpc19pbnN0ciwgMjMpKQorCQkJYmFzZSArPSBvZmZzZXQ7CisJCSAgICAgIGVsc2UKKwkJCWJhc2UgLT0gb2Zmc2V0OworCQkgICAgfQorCQkgIG5leHRwYyA9IChDT1JFX0FERFIpIHJlYWRfbWVtb3J5X2ludGVnZXIgKChDT1JFX0FERFIpIGJhc2UsIAorCQkJCQkJCSAgICA0KTsKKyAKKwkJICBuZXh0cGMgPSBBRERSX0JJVFNfUkVNT1ZFIChuZXh0cGMpOworCisJCSAgaWYgKG5leHRwYyA9PSBwYykKKwkJICAgIGVycm9yICgiSW5maW5pdGUgbG9vcCBkZXRlY3RlZCIpOworCQl9CisJICAgIH0KKwkgIGJyZWFrOworIAorCWNhc2UgMHg4OiBjYXNlIDB4OTogLyogYmxvY2sgdHJhbnNmZXIgKi8KKwkgIGlmIChiaXQgKHRoaXNfaW5zdHIsIDIwKSkKKwkgICAgeworCSAgICAgIC8qIExETSAqLworCSAgICAgIGlmIChiaXQgKHRoaXNfaW5zdHIsIDE1KSkKKwkJeworCQkgIC8qIGxvYWRpbmcgcGMgKi8KKwkJICBpbnQgb2Zmc2V0ID0gMDsKKworCQkgIGlmIChiaXQgKHRoaXNfaW5zdHIsIDIzKSkKKwkJICAgIHsKKwkJICAgICAgLyogdXAgKi8KKwkJICAgICAgdW5zaWduZWQgbG9uZyByZWdsaXN0ID0gYml0cyAodGhpc19pbnN0ciwgMCwgMTQpOworCQkgICAgICBvZmZzZXQgPSBiaXRjb3VudCAocmVnbGlzdCkgKiA0OworCQkgICAgICBpZiAoYml0ICh0aGlzX2luc3RyLCAyNCkpIC8qIHByZSAqLworCQkJb2Zmc2V0ICs9IDQ7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoYml0ICh0aGlzX2luc3RyLCAyNCkpCisJCSAgICBvZmZzZXQgPSAtNDsKKyAKKwkJICB7CisJCSAgICB1bnNpZ25lZCBsb25nIHJuX3ZhbCA9IAorCQkgICAgICByZWFkX3JlZ2lzdGVyIChiaXRzICh0aGlzX2luc3RyLCAxNiwgMTkpKTsKKwkJICAgIG5leHRwYyA9CisJCSAgICAgIChDT1JFX0FERFIpIHJlYWRfbWVtb3J5X2ludGVnZXIgKChDT1JFX0FERFIpIChybl92YWwKKwkJCQkJCQkJICAgICsgb2Zmc2V0KSwKKwkJCQkJCSAgICAgICA0KTsKKwkJICB9CisJCSAgbmV4dHBjID0gQUREUl9CSVRTX1JFTU9WRSAobmV4dHBjKTsKKwkJICBpZiAobmV4dHBjID09IHBjKQorCQkgICAgZXJyb3IgKCJJbmZpbml0ZSBsb29wIGRldGVjdGVkIik7CisJCX0KKwkgICAgfQorCSAgYnJlYWs7CisgCisJY2FzZSAweGI6ICAgICAgICAgICAvKiBicmFuY2ggJiBsaW5rICovCisJY2FzZSAweGE6ICAgICAgICAgICAvKiBicmFuY2ggKi8KKwkgIHsKKwkgICAgbmV4dHBjID0gQnJhbmNoRGVzdCAocGMsIHRoaXNfaW5zdHIpOworCisJICAgIG5leHRwYyA9IEFERFJfQklUU19SRU1PVkUgKG5leHRwYyk7CisJICAgIGlmIChuZXh0cGMgPT0gcGMpCisJICAgICAgZXJyb3IgKCJJbmZpbml0ZSBsb29wIGRldGVjdGVkIik7CisJICAgIGJyZWFrOworCSAgfQorIAorCWNhc2UgMHhjOiBjYXNlIDB4ZDoKKwljYXNlIDB4ZTogICAgICAgICAgIC8qIGNvcHJvYyBvcHMgKi8KKwljYXNlIDB4ZjogICAgICAgICAgIC8qIFNXSSAqLworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgZnByaW50ZiAoc3RkZXJyLCAiQmFkIGJpdC1maWVsZCBleHRyYWN0aW9uXG4iKTsKKwkgIHJldHVybiAocGMpOworCX0KKyAgICB9CisKKyAgcmV0dXJuIG5leHRwYzsKK30KKworI2luY2x1ZGUgImJmZC1pbjIuaCIKKyNpbmNsdWRlICJsaWJjb2ZmLmgiCisKK3N0YXRpYyBpbnQKK2dkYl9wcmludF9pbnNuX2FybSAobWVtYWRkciwgaW5mbykKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKK3sKKyAgaWYgKGFybV9wY19pc190aHVtYiAobWVtYWRkcikpCisgICAgeworICAgICAgc3RhdGljIGFzeW1ib2wgKiAgICAgICAgICAgICAgICAgIGFzeW07CisgICAgICBzdGF0aWMgY29tYmluZWRfZW50cnlfdHlwZSAgICAgICAgY2U7CisgICAgICBzdGF0aWMgc3RydWN0IGNvZmZfc3ltYm9sX3N0cnVjdCAgY3N5bTsKKyAgICAgIHN0YXRpYyBzdHJ1Y3QgX2JmZCAgICAgICAgICAgICAgICBmYWtlX2JmZDsKKyAgICAgIHN0YXRpYyBiZmRfdGFyZ2V0ICAgICAgICAgICAgICAgICBmYWtlX3RhcmdldDsKKworICAgICAgaWYgKGNzeW0ubmF0aXZlID09IE5VTEwpCisJeworCSAgLyogQ3JlYXRlIGEgZmFrZSBzeW1ib2wgdmVjdG9yIGNvbnRhaW5pbmcgYSBUaHVtYiBzeW1ib2wuICBUaGlzIGlzCisJICAgICBzb2xlbHkgc28gdGhhdCB0aGUgY29kZSBpbiBwcmludF9pbnNuX2xpdHRsZV9hcm0oKSBhbmQKKwkgICAgIHByaW50X2luc25fYmlnX2FybSgpIGluIG9wY29kZXMvYXJtLWRpcy5jIHdpbGwgZGV0ZWN0IHRoZSBwcmVzZW5jZQorCSAgICAgb2YgYSBUaHVtYiBzeW1ib2wgYW5kIHN3aXRjaCB0byBkZWNvZGluZyBUaHVtYiBpbnN0cnVjdGlvbnMuICAqLworCSAgICAgCisJICBmYWtlX3RhcmdldC5mbGF2b3VyICA9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyOworCSAgZmFrZV9iZmQueHZlYyAgICAgICAgPSAmIGZha2VfdGFyZ2V0OworCSAgY2UudS5zeW1lbnQubl9zY2xhc3MgPSBDX1RIVU1CRVhURlVOQzsKKwkgIGNzeW0ubmF0aXZlICAgICAgICAgID0gJiBjZTsKKwkgIGNzeW0uc3ltYm9sLnRoZV9iZmQgID0gJiBmYWtlX2JmZDsKKwkgIGNzeW0uc3ltYm9sLm5hbWUgICAgID0gImZha2UiOworCSAgYXN5bSAgICAgICAgICAgICAgICAgPSAoYXN5bWJvbCAqKSAmIGNzeW07CisJfQorICAgICAgCisgICAgICBtZW1hZGRyID0gVU5NQUtFX1RIVU1CX0FERFIgKG1lbWFkZHIpOworICAgICAgaW5mby0+c3ltYm9scyA9ICYgYXN5bTsKKyAgICB9CisgIGVsc2UKKyAgICBpbmZvLT5zeW1ib2xzID0gTlVMTDsKKyAgCisgIGlmIChUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQorICAgIHJldHVybiBwcmludF9pbnNuX2JpZ19hcm0gKG1lbWFkZHIsIGluZm8pOworICBlbHNlCisgICAgcmV0dXJuIHByaW50X2luc25fbGl0dGxlX2FybSAobWVtYWRkciwgaW5mbyk7Cit9CisKKy8qIFNlcXVlbmNlIG9mIGJ5dGVzIGZvciBicmVha3BvaW50IGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgQVJNX0xFX0JSRUFLUE9JTlQgezB4RkUsMHhERSwweEZGLDB4RTd9IC8qIFJlY29nbml6ZWQgaWxsZWdhbCBvcGNvZGVzICovCisjZGVmaW5lIEFSTV9CRV9CUkVBS1BPSU5UIHsweEU3LDB4RkYsMHhERSwweEZFfSAKKyNkZWZpbmUgVEhVTUJfTEVfQlJFQUtQT0lOVCB7MHhmZSwweGRmfSAgICAgICAKKyNkZWZpbmUgVEhVTUJfQkVfQlJFQUtQT0lOVCB7MHhkZiwweGZlfSAgICAgICAKKworLyogVGhlIGZvbGxvd2luZyBoYXMgYmVlbiBzdXBlcnNlZGVkIGJ5IEJSRUFLUE9JTlRfRk9SX1BDLCBidXQKKyAgIGlzIGRlZmluZWQgbWVyZWx5IHRvIGtlZXAgbWVtLWJyZWFrLmMgaGFwcHkuICAqLworI2RlZmluZSBMSVRUTEVfQlJFQUtQT0lOVCBBUk1fTEVfQlJFQUtQT0lOVAorI2RlZmluZSBCSUdfQlJFQUtQT0lOVCAgICBBUk1fQkVfQlJFQUtQT0lOVAorCisvKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIEJSRUFLUE9JTlRfRlJPTV9QQyBtYWNyby4gIEl0IHVzZXMgdGhlIHByb2dyYW0KKyAgIGNvdW50ZXIgdmFsdWUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSAxNi0gb3IgMzItYml0IGJyZWFrcG9pbnQgc2hvdWxkIGJlCisgICB1c2VkLiAgSXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgb2YgYnl0ZXMgdGhhdCBlbmNvZGUgYSBicmVha3BvaW50CisgICBpbnN0cnVjdGlvbiwgc3RvcmVzIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0byAqbGVucHRyLCBhbmQgYWRqdXN0cyBwYworICAgKGlmIG5lY2Vzc2FyeSkgdG8gcG9pbnQgdG8gdGhlIGFjdHVhbCBtZW1vcnkgbG9jYXRpb24gd2hlcmUgdGhlCisgICBicmVha3BvaW50IHNob3VsZCBiZSBpbnNlcnRlZC4gICovCisKK3Vuc2lnbmVkIGNoYXIgKgorYXJtX2JyZWFrcG9pbnRfZnJvbV9wYyAocGNwdHIsIGxlbnB0cikKKyAgICAgQ09SRV9BRERSICogcGNwdHI7CisgICAgIGludCAqIGxlbnB0cjsKK3sKKyAgaWYgKGFybV9wY19pc190aHVtYiAoKnBjcHRyKSB8fCBhcm1fcGNfaXNfdGh1bWJfZHVtbXkgKCpwY3B0cikpCisgICAgeworICAgICAgaWYgKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pCisgICAgICAgIHsKKyAgICAgICAgICBzdGF0aWMgY2hhciB0aHVtYl9icmVha3BvaW50W10gPSBUSFVNQl9CRV9CUkVBS1BPSU5UOworICAgICAgICAgICpwY3B0ciA9IFVOTUFLRV9USFVNQl9BRERSICgqcGNwdHIpOworICAgICAgICAgICpsZW5wdHIgPSBzaXplb2YgKHRodW1iX2JyZWFrcG9pbnQpOworICAgICAgICAgIHJldHVybiB0aHVtYl9icmVha3BvaW50OworICAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgc3RhdGljIGNoYXIgdGh1bWJfYnJlYWtwb2ludFtdID0gVEhVTUJfTEVfQlJFQUtQT0lOVDsKKyAgICAgICAgICAqcGNwdHIgPSBVTk1BS0VfVEhVTUJfQUREUiAoKnBjcHRyKTsKKyAgICAgICAgICAqbGVucHRyID0gc2l6ZW9mICh0aHVtYl9icmVha3BvaW50KTsKKyAgICAgICAgICByZXR1cm4gdGh1bWJfYnJlYWtwb2ludDsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQorICAgICAgICB7CisgICAgICAgICAgc3RhdGljIGNoYXIgYXJtX2JyZWFrcG9pbnRbXSA9IEFSTV9CRV9CUkVBS1BPSU5UOworICAgICAgICAgICpsZW5wdHIgPSBzaXplb2YgKGFybV9icmVha3BvaW50KTsKKyAgICAgICAgICByZXR1cm4gYXJtX2JyZWFrcG9pbnQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHN0YXRpYyBjaGFyIGFybV9icmVha3BvaW50W10gPSBBUk1fTEVfQlJFQUtQT0lOVDsKKyAgICAgICAgICAqbGVucHRyID0gc2l6ZW9mIChhcm1fYnJlYWtwb2ludCk7CisgICAgICAgICAgcmV0dXJuIGFybV9icmVha3BvaW50OworICAgICAgICB9CisgICAgfQorfQorLyogUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBQQyBpcyBpbnNpZGUgYSBjYWxsIHRodW5rIChha2Egc3R1YiBvciB0cmFtcG9saW5lKS4KKyAgIFRoaXMgaW1wbGVtZW50cyB0aGUgSU5fU09MSUJfQ0FMTF9UUkFNUE9MSU5FIG1hY3JvLiAgKi8KKworaW50Cithcm1faW5fY2FsbF9zdHViIChwYywgbmFtZSkKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBjaGFyICogbmFtZTsKK3sKKyAgQ09SRV9BRERSIHN0YXJ0X2FkZHI7CisKKyAgLyogRmluZCB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gY29udGFpbmluZyB0aGUgUEMuICBJZiB0aGUKKyAgICAgY2FsbGVyIGRpZG4ndCBnaXZlIHVzIGEgbmFtZSwgbG9vayBpdCB1cCBhdCB0aGUgc2FtZSB0aW1lLiAgKi8KKyAgaWYgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAocGMsIG5hbWUgPyBOVUxMIDogJm5hbWUsICZzdGFydF9hZGRyLCBOVUxMKSA9PSAwKQorICAgIHJldHVybiAwOworCisgIHJldHVybiBzdHJuY21wIChuYW1lLCAiX2NhbGxfdmlhX3IiLCAxMSkgPT0gMDsKK30KKworCisvKiBJZiBQQyBpcyBpbiBhIFRodW1iIGNhbGwgb3IgcmV0dXJuIHN0dWIsIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0CisgICBQQywgd2hpY2ggaXMgaW4gYSByZWdpc3Rlci4gIFRoZSB0aHVuayBmdW5jdGlvbnMgYXJlIGNhbGxlZCBfY2FsbGVkX3ZpYV94eCwKKyAgIHdoZXJlIHggaXMgdGhlIHJlZ2lzdGVyIG5hbWUuICBUaGUgcG9zc2libGUgbmFtZXMgYXJlIHIwLXI5LCBzbCwgZnAsIGlwLAorICAgc3AsIGFuZCBsci4gKi8KKworQ09SRV9BRERSCithcm1fc2tpcF9zdHViIChwYykKKyAgICAgQ09SRV9BRERSIHBjOworeworICBjaGFyICogbmFtZTsKKyAgQ09SRV9BRERSIHN0YXJ0X2FkZHI7CisKKyAgLyogRmluZCB0aGUgc3RhcnRpbmcgYWRkcmVzcyBhbmQgbmFtZSBvZiB0aGUgZnVuY3Rpb24gY29udGFpbmluZyB0aGUgUEMuICAqLworICBpZiAoZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIChwYywgJm5hbWUsICZzdGFydF9hZGRyLCBOVUxMKSA9PSAwKQorICAgIHJldHVybiAwOworCisgIC8qIENhbGwgdGh1bmtzIGFsd2F5cyBzdGFydCB3aXRoICJfY2FsbF92aWFfIi4gICovCisgIGlmIChzdHJuY21wIChuYW1lLCAiX2NhbGxfdmlhXyIsIDEwKSA9PSAwKQorICAgIHsKKyAgICAgIC8qIFVzZSB0aGUgbmFtZSBzdWZmaXggdG8gZGV0ZXJtaW5lIHdoaWNoIHJlZ2lzdGVyIGNvbnRhaW5zCisgICAgICAgICB0aGUgdGFyZ2V0IFBDLiAgKi8KKyAgICAgIHN0YXRpYyBjaGFyICp0YWJsZVsxNV0gPSAKKwl7ICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsCisJICAicjgiLCAicjkiLCAic2wiLCAiZnAiLCAiaXAiLCAic3AiLCAibHIiCisJfTsKKyAgICAgIGludCByZWdubzsKKworICAgICAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDw9IDE0OyByZWdubysrKQorCWlmIChzdHJjbXAgKCZuYW1lWzEwXSwgdGFibGVbcmVnbm9dKSA9PSAwKQorCSAgcmV0dXJuIHJlYWRfcmVnaXN0ZXIgKHJlZ25vKTsKKyAgICB9CisgIHJldHVybiAwOwkvKiBub3QgYSBzdHViICovCit9CisKKwordm9pZAorX2luaXRpYWxpemVfYXJtX3RkZXAgKCkKK3sKKyAgdG1fcHJpbnRfaW5zbiA9IGdkYl9wcmludF9pbnNuX2FybTsKKworICBhZGRfY29tICgib3RoZXJuYW1lcyIsIGNsYXNzX29ic2N1cmUsIGFybV9vdGhlcm5hbWVzLAorCSAgICJTd2l0Y2ggdG8gdGhlIG90aGVyIHNldCBvZiByZWdpc3RlciBuYW1lcy4iKTsKKworICAvKiA/Pz8gTWF5YmUgdGhpcyBzaG91bGQgYmUgYSBib29sZWFuLiAgKi8KKyAgYWRkX3Nob3dfZnJvbV9zZXQgKGFkZF9zZXRfY21kICgiYXBjczMyIiwgbm9fY2xhc3MsCisJCQkJICB2YXJfemludGVnZXIsIChjaGFyICopJmFybV9hcGNzXzMyLAorCQkJCSAgIlNldCB1c2FnZSBvZiBBUk0gMzItYml0IG1vZGUuXG4iLCAmc2V0bGlzdCksCisJCSAgICAgJiBzaG93bGlzdCk7CisKK30KKworLyogVGVzdCB3aGV0aGVyIHRoZSBjb2ZmIHN5bWJvbCBzcGVjaWZpYyB2YWx1ZSBjb3JyZXNwb25kcyB0byBhIFRodW1iIGZ1bmN0aW9uICovCitpbnQKK2NvZmZfc3ltX2lzX3RodW1iKGludCB2YWwpCit7CisJcmV0dXJuICh2YWwgPT0gQ19USFVNQkVYVCB8fAorICAgICAgdmFsID09IENfVEhVTUJTVEFUIHx8CisgICAgICB2YWwgPT0gQ19USFVNQkVYVEZVTkMgfHwKKyAgICAgIHZhbCA9PSBDX1RIVU1CU1RBVEZVTkMgfHwKKyAgICAgIHZhbCA9PSBDX1RIVU1CTEFCRUwpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2FybS14ZGVwLmMgYi9nZGIvYXJtLXhkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGQ4MDZlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2FybS14ZGVwLmMKQEAgLTAsMCArMSw1NTkgQEAKKy8qIEFjb3JuIFJpc2MgTWFjaGluZSBob3N0IG1hY2hpbmUgc3VwcG9ydC4KKyAgIENvcHlyaWdodCAoQykgMTk4OCwgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJhcm0tb3Bjb2RlLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorI2luY2x1ZGUgPG1hY2hpbmUvcmVnLmg+CisKKyNkZWZpbmUgTl9UWFRBRERSKGhkcikgMHg4MDAwCisjZGVmaW5lIE5fREFUQUREUihoZHIpIChoZHIuYV90ZXh0ICsgMHg4MDAwKQorCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorCisjaW5jbHVkZSA8c3lzL3VzZXIuaD4JCS8qIEFmdGVyIGEub3V0LmggICovCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlICJnZGJfc3RhdC5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKwordm9pZAorZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOwkJLyogT3JpZ2luYWwgdmFsdWUgZGlzY2FyZGVkICovCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZWdhZGRyOworICBjaGFyIGJ1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworICByZWdpc3RlciBpbnQgaTsKKworICBzdHJ1Y3QgdXNlciB1OworICB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gKGNoYXIgKikgJnUudV9hcjAgLSAoY2hhciAqKSAmdTsKKyAgb2Zmc2V0ID0gcHRyYWNlIChQVF9SRUFEX1UsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIG9mZnNldCwgMCkKKyAgICAgIC0gS0VSTkVMX1VfQUREUjsKKworICByZWdpc3RlcnNfZmV0Y2hlZCAoKTsKKyAgCisgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IDE2OyByZWdubysrKQorICAgIHsKKyAgICAgIHJlZ2FkZHIgPSBvZmZzZXQgKyByZWdubyAqIDQ7CisgICAgICAqKGludCAqKSZidWZbMF0gPSBwdHJhY2UgKFBUX1JFQURfVSwgaW5mZXJpb3JfcGlkLAorCQkJCShQVFJBQ0VfQVJHM19UWVBFKSByZWdhZGRyLCAwKTsKKyAgICAgIGlmIChyZWdubyA9PSBQQ19SRUdOVU0pCisJICAqKGludCAqKSZidWZbMF0gPSBHRVRfUENfUEFSVCgqKGludCAqKSZidWZbMF0pOworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgYnVmKTsKKyAgICB9CisgICooaW50ICopJmJ1ZlswXSA9IHB0cmFjZSAoUFRfUkVBRF9VLCBpbmZlcmlvcl9waWQsCisJCQkgICAgKFBUUkFDRV9BUkczX1RZUEUpIChvZmZzZXQgKyBQQyo0KSwgMCk7CisgIHN1cHBseV9yZWdpc3RlciAoUFNfUkVHTlVNLCBidWYpOyAvKiBzZXQgdmlydHVhbCByZWdpc3RlciBwcyBzYW1lIGFzIHBjICovCisKKyAgLyogcmVhZCB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzICovCisgIG9mZnNldCA9IChjaGFyICopICZ1LnVfZnBfcmVncyAtIChjaGFyICopJnU7CisgICooaW50ICopYnVmID0gcHRyYWNlIChQVF9SRUFEX1UsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIG9mZnNldCwgMCk7CisgIHN1cHBseV9yZWdpc3RlciAoRlBTX1JFR05VTSwgYnVmKTsKKyAgZm9yIChyZWdubyA9IDE2OyByZWdubyA8IDI0OyByZWdubysrKSB7CisgICAgICByZWdhZGRyID0gb2Zmc2V0ICsgNCArIDEyICogKHJlZ25vIC0gMTYpOworICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpICs9IHNpemVvZihpbnQpKQorCSAgKihpbnQgKikgJmJ1ZltpXSA9IHB0cmFjZSAoUFRfUkVBRF9VLCBpbmZlcmlvcl9waWQsCisJCQkJICAgICAoUFRSQUNFX0FSRzNfVFlQRSkgKHJlZ2FkZHIgKyBpKSwgMCk7CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCBidWYpOworICB9Cit9CisKKy8qIFN0b3JlIG91ciByZWdpc3RlciB2YWx1ZXMgYmFjayBpbnRvIHRoZSBpbmZlcmlvci4KKyAgIElmIFJFR05PIGlzIC0xLCBkbyB0aGlzIGZvciBhbGwgcmVnaXN0ZXJzLgorICAgT3RoZXJ3aXNlLCBSRUdOTyBzcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXIgKHNvIHdlIGNhbiBzYXZlIHRpbWUpLiAgKi8KKwordm9pZAorc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgcmVnYWRkcjsKKyAgY2hhciBidWZbODBdOworCisgIHN0cnVjdCB1c2VyIHU7CisgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisgIHVuc2lnbmVkIGludCBvZmZzZXQgPSAoY2hhciAqKSAmdS51X2FyMCAtIChjaGFyICopICZ1OworICBvZmZzZXQgPSBwdHJhY2UgKFBUX1JFQURfVSwgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgb2Zmc2V0LCAwKQorICAgICAgLSBLRVJORUxfVV9BRERSOworCisgIGlmIChyZWdubyA+PSAwKSB7CisgICAgICBpZiAocmVnbm8gPj0gMTYpIHJldHVybjsKKyAgICAgIHJlZ2FkZHIgPSBvZmZzZXQgKyA0ICogcmVnbm87CisgICAgICBlcnJubyA9IDA7CisgICAgICB2YWx1ZSA9IHJlYWRfcmVnaXN0ZXIocmVnbm8pOworICAgICAgaWYgKHJlZ25vID09IFBDX1JFR05VTSkKKwkgIHZhbHVlID0gU0VUX1BDX1BBUlQocmVhZF9yZWdpc3RlciAoUFNfUkVHTlVNKSwgdmFsdWUpOworICAgICAgcHRyYWNlIChQVF9XUklURV9VLCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSByZWdhZGRyLCB2YWx1ZSk7CisgICAgICBpZiAoZXJybm8gIT0gMCkKKwl7CisJICBzcHJpbnRmIChidWYsICJ3cml0aW5nIHJlZ2lzdGVyIG51bWJlciAlZCIsIHJlZ25vKTsKKwkgIHBlcnJvcl93aXRoX25hbWUgKGJ1Zik7CisJfQorICAgIH0KKyAgZWxzZSBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCAxNTsgcmVnbm8rKykKKyAgICB7CisgICAgICByZWdhZGRyID0gb2Zmc2V0ICsgcmVnbm8gKiA0OworICAgICAgZXJybm8gPSAwOworICAgICAgdmFsdWUgPSByZWFkX3JlZ2lzdGVyKHJlZ25vKTsKKyAgICAgIGlmIChyZWdubyA9PSBQQ19SRUdOVU0pCisJICB2YWx1ZSA9IFNFVF9QQ19QQVJUKHJlYWRfcmVnaXN0ZXIgKFBTX1JFR05VTSksIHZhbHVlKTsKKyAgICAgIHB0cmFjZSAoNiwgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnYWRkciwgdmFsdWUpOworICAgICAgaWYgKGVycm5vICE9IDApCisJeworCSAgc3ByaW50ZiAoYnVmLCAid3JpdGluZyBhbGwgcmVncywgbnVtYmVyICVkIiwgcmVnbm8pOworCSAgcGVycm9yX3dpdGhfbmFtZSAoYnVmKTsKKwl9CisgICAgfQorfQorDAorLyogV29yayB3aXRoIGNvcmUgZHVtcCBhbmQgZXhlY3V0YWJsZSBmaWxlcywgZm9yIEdEQi4gCisgICBUaGlzIGNvZGUgd291bGQgYmUgaW4gY29yZWZpbGUuYyBpZiBpdCB3ZXJlbid0IG1hY2hpbmUtZGVwZW5kZW50LiAqLworCisvKiBTdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgdGhlIGNoYWluIG9mIHNoYXJlZCBsaWJyYXJpZXMgdXNlZAorICAgYnkgdGhlIGV4ZWNmaWxlLgorICAgZS5nLiBwcm9nIHNoYXJlcyBYdCB3aGljaCBzaGFyZXMgWDExIHdoaWNoIHNoYXJlcyBjLiAqLworCitzdHJ1Y3Qgc2hhcmVkX2xpYnJhcnkgeworICAgIHN0cnVjdCBleGVjX2hlYWRlciBoZWFkZXI7CisgICAgY2hhciBuYW1lW1NITElCTEVOXTsKKyAgICBDT1JFX0FERFIgdGV4dF9zdGFydDsJLyogQ09SRV9BRERSIG9mIDFzdCBieXRlIG9mIHRleHQsIHRoaXMgZmlsZSAqLworICAgIGxvbmcgZGF0YV9vZmZzZXQ7CQkvKiBvZmZzZXQgb2YgZGF0YSBzZWN0aW9uIGluIGZpbGUgKi8KKyAgICBpbnQgY2hhbjsJCQkvKiBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBmaWxlICovCisgICAgc3RydWN0IHNoYXJlZF9saWJyYXJ5ICpzaGFyZXM7IC8qIGxpYnJhcnkgdGhpcyBvbmUgc2hhcmVzICovCit9Oworc3RhdGljIHN0cnVjdCBzaGFyZWRfbGlicmFyeSAqc2hsaWIgPSAwOworCisvKiBIb29rIGZvciBgZXhlY19maWxlX2NvbW1hbmQnIGNvbW1hbmQgdG8gY2FsbC4gICovCisKK2V4dGVybiB2b2lkICgqZXhlY19maWxlX2Rpc3BsYXlfaG9vaykgKCk7CisgICAKK3N0YXRpYyBDT1JFX0FERFIgdW5zaGFyZWRfdGV4dF9zdGFydDsKKworLyogZXh0ZW5kZWQgaGVhZGVyIGZyb20gZXhlYyBmaWxlIChmb3Igc2hhcmVkIGxpYnJhcnkgaW5mbykgKi8KKworc3RhdGljIHN0cnVjdCBleGVjX2hlYWRlciBleGVjX2hlYWRlcjsKKwwKK3ZvaWQKK2NvcmVfZmlsZV9jb21tYW5kIChmaWxlbmFtZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmZpbGVuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGludCB2YWw7CisgIGV4dGVybiBjaGFyIHJlZ2lzdGVyc1tdOworCisgIC8qIERpc2NhcmQgYWxsIHZlc3RpZ2VzIG9mIGFueSBwcmV2aW91cyBjb3JlIGZpbGUKKyAgICAgYW5kIG1hcmsgZGF0YSBhbmQgc3RhY2sgc3BhY2VzIGFzIGVtcHR5LiAgKi8KKworICBpZiAoY29yZWZpbGUpCisgICAgZnJlZSAoY29yZWZpbGUpOworICBjb3JlZmlsZSA9IDA7CisKKyAgaWYgKGNvcmVjaGFuID49IDApCisgICAgY2xvc2UgKGNvcmVjaGFuKTsKKyAgY29yZWNoYW4gPSAtMTsKKworICBkYXRhX3N0YXJ0ID0gMDsKKyAgZGF0YV9lbmQgPSAwOworICBzdGFja19zdGFydCA9IFNUQUNLX0VORF9BRERSOworICBzdGFja19lbmQgPSBTVEFDS19FTkRfQUREUjsKKworICAvKiBOb3csIGlmIGEgbmV3IGNvcmUgZmlsZSB3YXMgc3BlY2lmaWVkLCBvcGVuIGl0IGFuZCBkaWdlc3QgaXQuICAqLworCisgIGlmIChmaWxlbmFtZSkKKyAgICB7CisgICAgICBmaWxlbmFtZSA9IHRpbGRlX2V4cGFuZCAoZmlsZW5hbWUpOworICAgICAgbWFrZV9jbGVhbnVwIChmcmVlLCBmaWxlbmFtZSk7CisgICAgICAKKyAgICAgIGlmIChoYXZlX2luZmVyaW9yX3AgKCkpCisJZXJyb3IgKCJUbyBsb29rIGF0IGEgY29yZSBmaWxlLCB5b3UgbXVzdCBraWxsIHRoZSBwcm9ncmFtIHdpdGggXCJraWxsXCIuIik7CisgICAgICBjb3JlY2hhbiA9IG9wZW4gKGZpbGVuYW1lLCBPX1JET05MWSwgMCk7CisgICAgICBpZiAoY29yZWNoYW4gPCAwKQorCXBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKKyAgICAgIC8qIDQuMi1zdHlsZSAoYW5kIHBlcmhhcHMgYWxzbyBzeXNWLXN0eWxlKSBjb3JlIGR1bXAgZmlsZS4gICovCisgICAgICB7CisJc3RydWN0IHVzZXIgdTsKKworCXVuc2lnbmVkIGludCByZWdfb2Zmc2V0LCBmcF9yZWdfb2Zmc2V0OworCisJdmFsID0gbXlyZWFkIChjb3JlY2hhbiwgJnUsIHNpemVvZiB1KTsKKwlpZiAodmFsIDwgMCkKKwkgIHBlcnJvcl93aXRoX25hbWUgKCJOb3QgYSBjb3JlIGZpbGU6IHJlYWRpbmcgdXBhZ2UiKTsKKwlpZiAodmFsICE9IHNpemVvZiB1KQorCSAgZXJyb3IgKCJOb3QgYSBjb3JlIGZpbGU6IGNvdWxkIG9ubHkgcmVhZCAlZCBieXRlcyIsIHZhbCk7CisKKwkvKiBXZSBhcmUgZGVwZW5kaW5nIG9uIGV4ZWNfZmlsZV9jb21tYW5kIGhhdmluZyBiZWVuIGNhbGxlZAorCSAgIHByZXZpb3VzbHkgdG8gc2V0IGV4ZWNfZGF0YV9zdGFydC4gIFNpbmNlIHRoZSBleGVjdXRhYmxlCisJICAgYW5kIHRoZSBjb3JlIGZpbGUgc2hhcmUgdGhlIHNhbWUgdGV4dCBzZWdtZW50LCB0aGUgYWRkcmVzcworCSAgIG9mIHRoZSBkYXRhIHNlZ21lbnQgd2lsbCBiZSB0aGUgc2FtZSBpbiBib3RoLiAgKi8KKwlkYXRhX3N0YXJ0ID0gZXhlY19kYXRhX3N0YXJ0OworCisJZGF0YV9lbmQgPSBkYXRhX3N0YXJ0ICsgTkJQRyAqIHUudV9kc2l6ZTsKKwlzdGFja19zdGFydCA9IHN0YWNrX2VuZCAtIE5CUEcgKiB1LnVfc3NpemU7CisJZGF0YV9vZmZzZXQgPSBOQlBHICogVVBBR0VTOworCXN0YWNrX29mZnNldCA9IE5CUEcgKiAoVVBBR0VTICsgdS51X2RzaXplKTsKKworCS8qIFNvbWUgbWFjaGluZXMgcHV0IGFuIGFic29sdXRlIGFkZHJlc3MgaW4gaGVyZSBhbmQgc29tZSBwdXQKKwkgICB0aGUgb2Zmc2V0IGluIHRoZSB1cGFnZSBvZiB0aGUgcmVncy4gICovCisJcmVnX29mZnNldCA9IChpbnQpIHUudV9hcjA7CisJaWYgKHJlZ19vZmZzZXQgPiBOQlBHICogVVBBR0VTKQorCSAgcmVnX29mZnNldCAtPSBLRVJORUxfVV9BRERSOworCWZwX3JlZ19vZmZzZXQgPSAoY2hhciAqKSAmdS51X2ZwX3JlZ3MgLSAoY2hhciAqKSZ1OworCisJLyogSSBkb24ndCBrbm93IHdoZXJlIHRvIGZpbmQgdGhpcyBpbmZvLgorCSAgIFNvLCBmb3Igbm93LCBtYXJrIGl0IGFzIG5vdCBhdmFpbGFibGUuICAqLworCU5fU0VUX01BR0lDIChjb3JlX2FvdXRoZHIsIDApOworCisJLyogUmVhZCB0aGUgcmVnaXN0ZXIgdmFsdWVzIG91dCBvZiB0aGUgY29yZSBmaWxlIGFuZCBzdG9yZQorCSAgIHRoZW0gd2hlcmUgYHJlYWRfcmVnaXN0ZXInIHdpbGwgZmluZCB0aGVtLiAgKi8KKworCXsKKwkgIHJlZ2lzdGVyIGludCByZWdubzsKKworCSAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgTlVNX1JFR1M7IHJlZ25vKyspCisJICAgIHsKKwkgICAgICBjaGFyIGJ1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworCisJICAgICAgaWYgKHJlZ25vIDwgMTYpCisJCSAgdmFsID0gbHNlZWsgKGNvcmVjaGFuLCByZWdfb2Zmc2V0ICsgNCAqIHJlZ25vLCAwKTsKKwkgICAgICBlbHNlIGlmIChyZWdubyA8IDI0KQorCQkgIHZhbCA9IGxzZWVrIChjb3JlY2hhbiwgZnBfcmVnX29mZnNldCArIDQgKyAxMioocmVnbm8gLSAyNCksIDApOworCSAgICAgIGVsc2UgaWYgKHJlZ25vID09IDI0KQorCQkgIHZhbCA9IGxzZWVrIChjb3JlY2hhbiwgZnBfcmVnX29mZnNldCwgMCk7CisJICAgICAgZWxzZSBpZiAocmVnbm8gPT0gMjUpCisJCSAgdmFsID0gbHNlZWsgKGNvcmVjaGFuLCByZWdfb2Zmc2V0ICsgNCAqIFBDLCAwKTsKKwkgICAgICBpZiAodmFsIDwgMAorCQkgIHx8ICh2YWwgPSBteXJlYWQgKGNvcmVjaGFuLCBidWYsIHNpemVvZiBidWYpKSA8IDApCisJCXsKKwkJICBjaGFyICogYnVmZmVyID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKFJFR0lTVEVSX05BTUUgKHJlZ25vKSkKKwkJCQkJCSAgICsgMzApOworCQkgIHN0cmNweSAoYnVmZmVyLCAiUmVhZGluZyByZWdpc3RlciAiKTsKKwkJICBzdHJjYXQgKGJ1ZmZlciwgUkVHSVNURVJfTkFNRSAocmVnbm8pKTsKKwkJCQkJCSAgIAorCQkgIHBlcnJvcl93aXRoX25hbWUgKGJ1ZmZlcik7CisJCX0KKworCSAgICAgIGlmIChyZWdubyA9PSBQQ19SRUdOVU0pCisJCSAgKihpbnQgKilidWYgPSBHRVRfUENfUEFSVCgqKGludCAqKWJ1Zik7CisJICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgYnVmKTsKKwkgICAgfQorCX0KKyAgICAgIH0KKyAgICAgIGlmIChmaWxlbmFtZVswXSA9PSAnLycpCisJY29yZWZpbGUgPSBzYXZlc3RyaW5nIChmaWxlbmFtZSwgc3RybGVuIChmaWxlbmFtZSkpOworICAgICAgZWxzZQorCXsKKwkgIGNvcmVmaWxlID0gY29uY2F0IChjdXJyZW50X2RpcmVjdG9yeSwgIi8iLCBmaWxlbmFtZSwgTlVMTCk7CisJfQorCisgICAgICBmbHVzaF9jYWNoZWRfZnJhbWVzICgpOworICAgICAgc2VsZWN0X2ZyYW1lIChnZXRfY3VycmVudF9mcmFtZSAoKSwgMCk7CisgICAgICB2YWxpZGF0ZV9maWxlcyAoKTsKKyAgICB9CisgIGVsc2UgaWYgKGZyb21fdHR5KQorICAgIHByaW50ZiAoIk5vIGNvcmUgZmlsZSBub3cuXG4iKTsKK30KKworI2lmIDAKKy8qIFdvcmsgd2l0aCBjb3JlIGR1bXAgYW5kIGV4ZWN1dGFibGUgZmlsZXMsIGZvciBHREIuIAorICAgVGhpcyBjb2RlIHdvdWxkIGJlIGluIGNvcmVmaWxlLmMgaWYgaXQgd2VyZW4ndCBtYWNoaW5lLWRlcGVuZGVudC4gKi8KKworLyogU3RydWN0dXJlIHRvIGRlc2NyaWJlIHRoZSBjaGFpbiBvZiBzaGFyZWQgbGlicmFyaWVzIHVzZWQKKyAgIGJ5IHRoZSBleGVjZmlsZS4KKyAgIGUuZy4gcHJvZyBzaGFyZXMgWHQgd2hpY2ggc2hhcmVzIFgxMSB3aGljaCBzaGFyZXMgYy4gKi8KKworc3RydWN0IHNoYXJlZF9saWJyYXJ5IHsKKyAgICBzdHJ1Y3QgZXhlY19oZWFkZXIgaGVhZGVyOworICAgIGNoYXIgbmFtZVtTSExJQkxFTl07CisgICAgQ09SRV9BRERSIHRleHRfc3RhcnQ7CS8qIENPUkVfQUREUiBvZiAxc3QgYnl0ZSBvZiB0ZXh0LCB0aGlzIGZpbGUgKi8KKyAgICBsb25nIGRhdGFfb2Zmc2V0OwkJLyogb2Zmc2V0IG9mIGRhdGEgc2VjdGlvbiBpbiBmaWxlICovCisgICAgaW50IGNoYW47CQkJLyogZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZSAqLworICAgIHN0cnVjdCBzaGFyZWRfbGlicmFyeSAqc2hhcmVzOyAvKiBsaWJyYXJ5IHRoaXMgb25lIHNoYXJlcyAqLworfTsKK3N0YXRpYyBzdHJ1Y3Qgc2hhcmVkX2xpYnJhcnkgKnNobGliID0gMDsKKworLyogSG9vayBmb3IgYGV4ZWNfZmlsZV9jb21tYW5kJyBjb21tYW5kIHRvIGNhbGwuICAqLworCitleHRlcm4gdm9pZCAoKmV4ZWNfZmlsZV9kaXNwbGF5X2hvb2spICgpOworICAgCitzdGF0aWMgQ09SRV9BRERSIHVuc2hhcmVkX3RleHRfc3RhcnQ7CisKKy8qIGV4dGVuZGVkIGhlYWRlciBmcm9tIGV4ZWMgZmlsZSAoZm9yIHNoYXJlZCBsaWJyYXJ5IGluZm8pICovCisKK3N0YXRpYyBzdHJ1Y3QgZXhlY19oZWFkZXIgZXhlY19oZWFkZXI7CisKK3ZvaWQKK2V4ZWNfZmlsZV9jb21tYW5kIChmaWxlbmFtZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmZpbGVuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGludCB2YWw7CisKKyAgLyogRWxpbWluYXRlIGFsbCB0cmFjZXMgb2Ygb2xkIGV4ZWMgZmlsZS4KKyAgICAgTWFyayB0ZXh0IHNlZ21lbnQgYXMgZW1wdHkuICAqLworCisgIGlmIChleGVjZmlsZSkKKyAgICBmcmVlIChleGVjZmlsZSk7CisgIGV4ZWNmaWxlID0gMDsKKyAgZGF0YV9zdGFydCA9IDA7CisgIGRhdGFfZW5kIC09IGV4ZWNfZGF0YV9zdGFydDsKKyAgdGV4dF9zdGFydCA9IDA7CisgIHVuc2hhcmVkX3RleHRfc3RhcnQgPSAwOworICB0ZXh0X2VuZCA9IDA7CisgIGV4ZWNfZGF0YV9zdGFydCA9IDA7CisgIGV4ZWNfZGF0YV9lbmQgPSAwOworICBpZiAoZXhlY2NoYW4gPj0gMCkKKyAgICBjbG9zZSAoZXhlY2NoYW4pOworICBleGVjY2hhbiA9IC0xOworICBpZiAoc2hsaWIpIHsKKyAgICAgIGNsb3NlX3NoYXJlZF9saWJyYXJ5KHNobGliKTsKKyAgICAgIHNobGliID0gMDsKKyAgfQorCisgIC8qIE5vdyBvcGVuIGFuZCBkaWdlc3QgdGhlIGZpbGUgdGhlIHVzZXIgcmVxdWVzdGVkLCBpZiBhbnkuICAqLworCisgIGlmIChmaWxlbmFtZSkKKyAgICB7CisgICAgICBmaWxlbmFtZSA9IHRpbGRlX2V4cGFuZCAoZmlsZW5hbWUpOworICAgICAgbWFrZV9jbGVhbnVwIChmcmVlLCBmaWxlbmFtZSk7CisKKyAgICAgIGV4ZWNjaGFuID0gb3BlbnAgKGdldGVudiAoIlBBVEgiKSwgMSwgZmlsZW5hbWUsIE9fUkRPTkxZLCAwLAorCQkJJmV4ZWNmaWxlKTsKKyAgICAgIGlmIChleGVjY2hhbiA8IDApCisJcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworCisgICAgICB7CisJc3RydWN0IHN0YXQgc3RfZXhlYzsKKworI2lmZGVmIEhFQURFUl9TRUVLX0ZECisJSEVBREVSX1NFRUtfRkQgKGV4ZWNjaGFuKTsKKyNlbmRpZgorCQorCXZhbCA9IG15cmVhZCAoZXhlY2NoYW4sICZleGVjX2hlYWRlciwgc2l6ZW9mIGV4ZWNfaGVhZGVyKTsKKwlleGVjX2FvdXRoZHIgPSBleGVjX2hlYWRlci5hX2V4ZWM7CisKKwlpZiAodmFsIDwgMCkKKwkgIHBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKKworCXRleHRfc3RhcnQgPSAweDgwMDA7CisKKwkvKiBMb29rIGZvciBzaGFyZWQgbGlicmFyeSBpZiBuZWVkZWQgKi8KKwlpZiAoZXhlY19oZWFkZXIuYV9leGVjLmFfbWFnaWMgJiBNRl9VU0VTX1NMKQorCSAgICBzaGxpYiA9IG9wZW5fc2hhcmVkX2xpYnJhcnkoZXhlY19oZWFkZXIuYV9zaGxpYm5hbWUsIHRleHRfc3RhcnQpOworCisJdGV4dF9vZmZzZXQgPSBOX1RYVE9GRiAoZXhlY19hb3V0aGRyKTsKKwlleGVjX2RhdGFfb2Zmc2V0ID0gTl9UWFRPRkYgKGV4ZWNfYW91dGhkcikgKyBleGVjX2FvdXRoZHIuYV90ZXh0OworCisJaWYgKHNobGliKSB7CisJICAgIHVuc2hhcmVkX3RleHRfc3RhcnQgPSBzaGFyZWRfdGV4dF9lbmQoc2hsaWIpICYgfjB4N2ZmZjsKKwkgICAgc3RhY2tfc3RhcnQgPSBzaGxpYi0+aGVhZGVyLmFfZXhlYy5hX3NsZGF0YWJhc2U7CisJICAgIHN0YWNrX2VuZCA9IFNUQUNLX0VORF9BRERSOworCX0gZWxzZQorCSAgICB1bnNoYXJlZF90ZXh0X3N0YXJ0ID0gMHg4MDAwOworCXRleHRfZW5kID0gdW5zaGFyZWRfdGV4dF9zdGFydCArIGV4ZWNfYW91dGhkci5hX3RleHQ7CisKKwlleGVjX2RhdGFfc3RhcnQgPSB1bnNoYXJlZF90ZXh0X3N0YXJ0ICsgZXhlY19hb3V0aGRyLmFfdGV4dDsKKyAgICAgICAgZXhlY19kYXRhX2VuZCA9IGV4ZWNfZGF0YV9zdGFydCArIGV4ZWNfYW91dGhkci5hX2RhdGE7CisKKwlkYXRhX3N0YXJ0ID0gZXhlY19kYXRhX3N0YXJ0OworCWRhdGFfZW5kICs9IGV4ZWNfZGF0YV9zdGFydDsKKworCWZzdGF0IChleGVjY2hhbiwgJnN0X2V4ZWMpOworCWV4ZWNfbXRpbWUgPSBzdF9leGVjLnN0X210aW1lOworICAgICAgfQorCisgICAgICB2YWxpZGF0ZV9maWxlcyAoKTsKKyAgICB9CisgIGVsc2UgaWYgKGZyb21fdHR5KQorICAgIHByaW50ZiAoIk5vIGV4ZWN1dGFibGUgZmlsZSBub3cuXG4iKTsKKworICAvKiBUZWxsIGRpc3BsYXkgY29kZSAoaWYgYW55KSBhYm91dCB0aGUgY2hhbmdlZCBmaWxlIG5hbWUuICAqLworICBpZiAoZXhlY19maWxlX2Rpc3BsYXlfaG9vaykKKyAgICAoKmV4ZWNfZmlsZV9kaXNwbGF5X2hvb2spIChmaWxlbmFtZSk7Cit9CisjZW5kaWYKKworI2lmIDAKKy8qIFJlYWQgZnJvbSB0aGUgcHJvZ3JhbSdzIG1lbW9yeSAoZXhjZXB0IGZvciBpbmZlcmlvciBwcm9jZXNzZXMpLgorICAgVGhpcyBmdW5jdGlvbiBpcyBtaXNuYW1lZCwgc2luY2UgaXQgb25seSByZWFkcywgbmV2ZXIgd3JpdGVzOyBhbmQKKyAgIHNpbmNlIGl0IHdpbGwgdXNlIHRoZSBjb3JlIGZpbGUgYW5kL29yIGV4ZWN1dGFibGUgZmlsZSBhcyBuZWNlc3NhcnkuCisKKyAgIEl0IHNob3VsZCBiZSBleHRlbmRlZCB0byB3cml0ZSBhcyB3ZWxsIGFzIHJlYWQsIEZJWE1FLCBmb3IgcGF0Y2hpbmcgZmlsZXMuCisKKyAgIFJldHVybiAwIGlmIGFkZHJlc3MgY291bGQgYmUgcmVhZCwgRUlPIGlmIGFkZHJlc3NzIG91dCBvZiBib3VuZHMuICAqLworCitpbnQKK3hmZXJfY29yZV9maWxlIChtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIGludCB2YWw7CisgIGludCB4ZmVyY2hhbjsKKyAgY2hhciAqKnhmZXJmaWxlOworICBpbnQgZmlsZXB0cjsKKyAgaW50IHJldHVybnZhbCA9IDA7CisKKyAgd2hpbGUgKGxlbiA+IDApCisgICAgeworICAgICAgeGZlcmZpbGUgPSAwOworICAgICAgeGZlcmNoYW4gPSAwOworCisgICAgICAvKiBEZXRlcm1pbmUgd2hpY2ggZmlsZSB0aGUgbmV4dCBidW5jaCBvZiBhZGRyZXNzZXMgcmVzaWRlIGluLAorCSBhbmQgd2hlcmUgaW4gdGhlIGZpbGUuICBTZXQgdGhlIGZpbGUncyByZWFkL3dyaXRlIHBvaW50ZXIKKwkgdG8gcG9pbnQgYXQgdGhlIHByb3BlciBwbGFjZSBmb3IgdGhlIGRlc2lyZWQgYWRkcmVzcworCSBhbmQgc2V0IHhmZXJmaWxlIGFuZCB4ZmVyY2hhbiBmb3IgdGhlIGNvcnJlY3QgZmlsZS4KKworCSBJZiBkZXNpcmVkIGFkZHJlc3MgaXMgbm9uZXhpc3RlbnQsIGxlYXZlIHRoZW0gemVyby4KKworCSBpIGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIGhhbmRsZWQKKwkgYWxvbmcgd2l0aCB0aGUgbmV4dCBhZGRyZXNzLgorCisJIFdlIHB1dCB0aGUgbW9zdCBsaWtlbHkgdGVzdHMgZmlyc3QgZm9yIGVmZmljaWVuY3kuICAqLworCisgICAgICAvKiBOb3RlIHRoYXQgaWYgdGhlcmUgaXMgbm8gY29yZSBmaWxlCisJIGRhdGFfc3RhcnQgYW5kIGRhdGFfZW5kIGFyZSBlcXVhbC4gICovCisgICAgICBpZiAobWVtYWRkciA+PSBkYXRhX3N0YXJ0ICYmIG1lbWFkZHIgPCBkYXRhX2VuZCkKKwl7CisJICBpID0gbWluIChsZW4sIGRhdGFfZW5kIC0gbWVtYWRkcik7CisJICBmaWxlcHRyID0gbWVtYWRkciAtIGRhdGFfc3RhcnQgKyBkYXRhX29mZnNldDsKKwkgIHhmZXJmaWxlID0gJmNvcmVmaWxlOworCSAgeGZlcmNoYW4gPSBjb3JlY2hhbjsKKwl9CisgICAgICAvKiBOb3RlIHRoYXQgaWYgdGhlcmUgaXMgbm8gY29yZSBmaWxlCisJIHN0YWNrX3N0YXJ0IGFuZCBzdGFja19lbmQgZGVmaW5lIHRoZSBzaGFyZWQgbGlicmFyeSBkYXRhLiAgKi8KKyAgICAgIGVsc2UgaWYgKG1lbWFkZHIgPj0gc3RhY2tfc3RhcnQgJiYgbWVtYWRkciA8IHN0YWNrX2VuZCkKKwl7CisJICAgIGlmIChjb3JlY2hhbiA8IDApIHsKKwkJc3RydWN0IHNoYXJlZF9saWJyYXJ5ICpsaWI7CisJCWZvciAobGliID0gc2hsaWI7IGxpYjsgbGliID0gbGliLT5zaGFyZXMpCisJCSAgICBpZiAobWVtYWRkciA+PSBsaWItPmhlYWRlci5hX2V4ZWMuYV9zbGRhdGFiYXNlICYmCisJCQltZW1hZGRyIDwgbGliLT5oZWFkZXIuYV9leGVjLmFfc2xkYXRhYmFzZSArCisJCQkgIGxpYi0+aGVhZGVyLmFfZXhlYy5hX2RhdGEpCisJCQlicmVhazsKKwkJaWYgKGxpYikgeworCQkgICAgaSA9IG1pbiAobGVuLCBsaWItPmhlYWRlci5hX2V4ZWMuYV9zbGRhdGFiYXNlICsKKwkJCSAgICAgbGliLT5oZWFkZXIuYV9leGVjLmFfZGF0YSAtIG1lbWFkZHIpOworCQkgICAgZmlsZXB0ciA9IGxpYi0+ZGF0YV9vZmZzZXQgKyBtZW1hZGRyIC0KKwkJCWxpYi0+aGVhZGVyLmFfZXhlYy5hX3NsZGF0YWJhc2U7CisJCSAgICB4ZmVyZmlsZSA9IGV4ZWNmaWxlOworCQkgICAgeGZlcmNoYW4gPSBsaWItPmNoYW47CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJaSA9IG1pbiAobGVuLCBzdGFja19lbmQgLSBtZW1hZGRyKTsKKwkJZmlsZXB0ciA9IG1lbWFkZHIgLSBzdGFja19zdGFydCArIHN0YWNrX29mZnNldDsKKwkJeGZlcmZpbGUgPSAmY29yZWZpbGU7CisJCXhmZXJjaGFuID0gY29yZWNoYW47CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChjb3JlY2hhbiA8IDAKKwkgICAgICAgJiYgbWVtYWRkciA+PSBleGVjX2RhdGFfc3RhcnQgJiYgbWVtYWRkciA8IGV4ZWNfZGF0YV9lbmQpCisJeworCSAgaSA9IG1pbiAobGVuLCBleGVjX2RhdGFfZW5kIC0gbWVtYWRkcik7CisJICBmaWxlcHRyID0gbWVtYWRkciAtIGV4ZWNfZGF0YV9zdGFydCArIGV4ZWNfZGF0YV9vZmZzZXQ7CisJICB4ZmVyZmlsZSA9ICZleGVjZmlsZTsKKwkgIHhmZXJjaGFuID0gZXhlY2NoYW47CisJfQorICAgICAgZWxzZSBpZiAobWVtYWRkciA+PSB0ZXh0X3N0YXJ0ICYmIG1lbWFkZHIgPCB0ZXh0X2VuZCkKKwl7CisJICAgIHN0cnVjdCBzaGFyZWRfbGlicmFyeSAqbGliOworCSAgICBmb3IgKGxpYiA9IHNobGliOyBsaWI7IGxpYiA9IGxpYi0+c2hhcmVzKQorCQlpZiAobWVtYWRkciA+PSBsaWItPnRleHRfc3RhcnQgJiYKKwkJICAgIG1lbWFkZHIgPCBsaWItPnRleHRfc3RhcnQgKyBsaWItPmhlYWRlci5hX2V4ZWMuYV90ZXh0KQorCQkgICAgYnJlYWs7CisJICAgIGlmIChsaWIpIHsKKwkJaSA9IG1pbiAobGVuLCBsaWItPmhlYWRlci5hX2V4ZWMuYV90ZXh0ICsKKwkJCSBsaWItPnRleHRfc3RhcnQgLSBtZW1hZGRyKTsKKwkJZmlsZXB0ciA9IG1lbWFkZHIgLSBsaWItPnRleHRfc3RhcnQgKyB0ZXh0X29mZnNldDsKKwkJeGZlcmZpbGUgPSAmZXhlY2ZpbGU7CisJCXhmZXJjaGFuID0gbGliLT5jaGFuOworCSAgICB9IGVsc2UgeworCQlpID0gbWluIChsZW4sIHRleHRfZW5kIC0gbWVtYWRkcik7CisJCWZpbGVwdHIgPSBtZW1hZGRyIC0gdW5zaGFyZWRfdGV4dF9zdGFydCArIHRleHRfb2Zmc2V0OworCQl4ZmVyZmlsZSA9ICZleGVjZmlsZTsKKwkJeGZlcmNoYW4gPSBleGVjY2hhbjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKG1lbWFkZHIgPCB0ZXh0X3N0YXJ0KQorCXsKKwkgIGkgPSBtaW4gKGxlbiwgdGV4dF9zdGFydCAtIG1lbWFkZHIpOworCX0KKyAgICAgIGVsc2UgaWYgKG1lbWFkZHIgPj0gdGV4dF9lbmQKKwkgICAgICAgJiYgbWVtYWRkciA8IChjb3JlY2hhbiA+PSAwPyBkYXRhX3N0YXJ0IDogZXhlY19kYXRhX3N0YXJ0KSkKKwl7CisJICBpID0gbWluIChsZW4sIGRhdGFfc3RhcnQgLSBtZW1hZGRyKTsKKwl9CisgICAgICBlbHNlIGlmIChjb3JlY2hhbiA+PSAwCisJICAgICAgICYmIG1lbWFkZHIgPj0gZGF0YV9lbmQgJiYgbWVtYWRkciA8IHN0YWNrX3N0YXJ0KQorCXsKKwkgIGkgPSBtaW4gKGxlbiwgc3RhY2tfc3RhcnQgLSBtZW1hZGRyKTsKKwl9CisgICAgICBlbHNlIGlmIChjb3JlY2hhbiA8IDAgJiYgbWVtYWRkciA+PSBleGVjX2RhdGFfZW5kKQorCXsKKwkgIGkgPSBtaW4gKGxlbiwgLSBtZW1hZGRyKTsKKwl9CisgICAgICBlbHNlIGlmIChtZW1hZGRyID49IHN0YWNrX2VuZCAmJiBzdGFja19lbmQgIT0gMCkKKwl7CisJICBpID0gbWluIChsZW4sIC0gbWVtYWRkcik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIEFkZHJlc3MgZGlkIG5vdCBjbGFzc2lmeSBpbnRvIG9uZSBvZiB0aGUga25vd24gcmFuZ2VzLgorCSAgICAgVGhpcyBzaG91bGRuJ3QgaGFwcGVuOyB3ZSBjYXRjaCB0aGUgZW5kcG9pbnRzLiAgKi8KKwkgIGZhdGFsICgiSW50ZXJuYWw6IEJhZCBjYXNlIGxvZ2ljIGluIHhmZXJfY29yZV9maWxlLiIpOworCX0KKworICAgICAgLyogTm93IHdlIGtub3cgd2hpY2ggZmlsZSB0byB1c2UuCisJIFNldCB1cCBpdHMgcG9pbnRlciBhbmQgdHJhbnNmZXIgdGhlIGRhdGEuICAqLworICAgICAgaWYgKHhmZXJmaWxlKQorCXsKKwkgIGlmICgqeGZlcmZpbGUgPT0gMCkKKwkgICAgaWYgKHhmZXJmaWxlID09ICZleGVjZmlsZSkKKwkgICAgICBlcnJvciAoIk5vIHByb2dyYW0gZmlsZSB0byBleGFtaW5lLiIpOworCSAgICBlbHNlCisJICAgICAgZXJyb3IgKCJObyBjb3JlIGR1bXAgZmlsZSBvciBydW5uaW5nIHByb2dyYW0gdG8gZXhhbWluZS4iKTsKKwkgIHZhbCA9IGxzZWVrICh4ZmVyY2hhbiwgZmlsZXB0ciwgMCk7CisJICBpZiAodmFsIDwgMCkKKwkgICAgcGVycm9yX3dpdGhfbmFtZSAoKnhmZXJmaWxlKTsKKwkgIHZhbCA9IG15cmVhZCAoeGZlcmNoYW4sIG15YWRkciwgaSk7CisJICBpZiAodmFsIDwgMCkKKwkgICAgcGVycm9yX3dpdGhfbmFtZSAoKnhmZXJmaWxlKTsKKwl9CisgICAgICAvKiBJZiB0aGlzIGFkZHJlc3MgaXMgZm9yIG5vbmV4aXN0ZW50IG1lbW9yeSwKKwkgcmVhZCB6ZXJvcyBpZiByZWFkaW5nLCBvciBkbyBub3RoaW5nIGlmIHdyaXRpbmcuCisJIEFjdHVhbGx5LCB3ZSBuZXZlciByaWdodC4gICovCisgICAgICBlbHNlCisJeworCSAgbWVtc2V0IChteWFkZHIsICdcMCcsIGkpOworCSAgcmV0dXJudmFsID0gRUlPOworCX0KKworICAgICAgbWVtYWRkciArPSBpOworICAgICAgbXlhZGRyICs9IGk7CisgICAgICBsZW4gLT0gaTsKKyAgICB9CisgIHJldHVybiByZXR1cm52YWw7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2dkYi9heC1nZGIuYyBiL2dkYi9heC1nZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTE4ZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2F4LWdkYi5jCkBAIC0wLDAgKzEsMTk0MiBAQAorLyogR0RCLXNwZWNpZmljIGZ1bmN0aW9ucyBmb3Igb3BlcmF0aW5nIG9uIGFnZW50IGV4cHJlc3Npb25zCisgICBDb3B5cmlnaHQgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiAkSWQkICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiYXguaCIKKyNpbmNsdWRlICJheC1nZGIuaCIKKworLyogUHJvYmFibHkgdGhlIGJlc3Qgd2F5IHRvIHJlYWQgdGhpcyBmaWxlIGlzIHRvIHN0YXJ0IHdpdGggdGhlIHR5cGVzCisgICBhbmQgZW51bXMgaW4gYXgtZ2RiLmgsIGFuZCB0aGVuIGxvb2sgYXQgZ2VuX2V4cHIsIHRvd2FyZHMgdGhlCisgICBib3R0b207IHRoYXQncyB0aGUgbWFpbiBmdW5jdGlvbiB0aGF0IGxvb2tzIGF0IHRoZSBHREIgZXhwcmVzc2lvbnMKKyAgIGFuZCBjYWxscyBldmVyeXRoaW5nIGVsc2UgdG8gZ2VuZXJhdGUgY29kZS4KKworICAgSSdtIGJlZ2lubmluZyB0byB3b25kZXIgd2hldGhlciBpdCB3b3VsZG4ndCBiZSBuaWNlciB0byBpbnRlcm5hbGx5CisgICBnZW5lcmF0ZSB0cmVlcywgd2l0aCB0eXBlcywgYW5kIHRoZW4gc3BpdCBvdXQgdGhlIGJ5dGVjb2RlIGluCisgICBsaW5lYXIgZm9ybSBhZnRlcndhcmRzOyB3ZSBjb3VsZCBnZW5lcmF0ZSBmZXdlciBgc3dhcCcsIGBleHQnLCBhbmQKKyAgIGB6ZXJvX2V4dCcgYnl0ZWNvZGVzIHRoYXQgd2F5OyBpdCB3b3VsZCBtYWtlIGdvb2QgY29uc3RhbnQgZm9sZGluZworICAgZWFzaWVyLCB0b28uICBCdXQgYXQgdGhlIG1vbWVudCwgSSB0aGluayB3ZSBzaG91bGQgYmUgd2lsbGluZyB0bworICAgcGF5IGZvciB0aGUgc2ltcGxpY2l0eSBvZiB0aGlzIGNvZGUgd2l0aCBsZXNzLXRoYW4tb3B0aW1hbCBieXRlY29kZQorICAgc3RyaW5ncy4KKworICAgUmVtZW1iZXIsICJHQkQiIHN0YW5kcyBmb3IgIkdyZWF0IEJyaXRhaW4sIERhbW1pdCEiICBTbyBiZSBjYXJlZnVsLiAgKi8gCisKKworDAorLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAqLworCisvKiBUaGVyZSdzIGEgc3RhbmRhcmQgb3JkZXIgdG8gdGhlIGFyZ3VtZW50cyBvZiB0aGVzZSBmdW5jdGlvbnM6CisgICB1bmlvbiBleHBfZWxlbWVudCAqKiAtLS0gcG9pbnRlciBpbnRvIGV4cHJlc3Npb24KKyAgIHN0cnVjdCBhZ2VudF9leHByICogLS0tIGFnZW50IGV4cHJlc3Npb24gYnVmZmVyIHRvIGdlbmVyYXRlIGNvZGUgaW50bworICAgc3RydWN0IGF4c192YWx1ZSAqIC0tLSBkZXNjcmliZXMgdmFsdWUgbGVmdCBvbiB0b3Agb2Ygc3RhY2sgICovCisgICAKK3N0YXRpYyBzdHJ1Y3QgdmFsdWUgKmNvbnN0X3Zhcl9yZWYgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqdmFyKSk7CitzdGF0aWMgc3RydWN0IHZhbHVlICpjb25zdF9leHByIFBBUkFNUyAoKHVuaW9uIGV4cF9lbGVtZW50ICoqcGMpKTsKK3N0YXRpYyBzdHJ1Y3QgdmFsdWUgKm1heWJlX2NvbnN0X2V4cHIgUEFSQU1TICgodW5pb24gZXhwX2VsZW1lbnQgKipwYykpOworCitzdGF0aWMgdm9pZCBnZW5fdHJhY2VkX3BvcCBQQVJBTVMgKChzdHJ1Y3QgYWdlbnRfZXhwciAqLCBzdHJ1Y3QgYXhzX3ZhbHVlICopKTsKKworc3RhdGljIHZvaWQgZ2VuX3NpZ25fZXh0ZW5kIFBBUkFNUyAoKHN0cnVjdCBhZ2VudF9leHByICosIHN0cnVjdCB0eXBlICopKTsKK3N0YXRpYyB2b2lkIGdlbl9leHRlbmQgUEFSQU1TICgoc3RydWN0IGFnZW50X2V4cHIgKiwgc3RydWN0IHR5cGUgKikpOworc3RhdGljIHZvaWQgZ2VuX2ZldGNoIFBBUkFNUyAoKHN0cnVjdCBhZ2VudF9leHByICosIHN0cnVjdCB0eXBlICopKTsKK3N0YXRpYyB2b2lkIGdlbl9sZWZ0X3NoaWZ0IFBBUkFNUyAoKHN0cnVjdCBhZ2VudF9leHByICosIGludCkpOworCisKK3N0YXRpYyB2b2lkIGdlbl9mcmFtZV9hcmdzX2FkZHJlc3MgICBQQVJBTVMgKChzdHJ1Y3QgYWdlbnRfZXhwciAqKSk7CitzdGF0aWMgdm9pZCBnZW5fZnJhbWVfbG9jYWxzX2FkZHJlc3MgUEFSQU1TICgoc3RydWN0IGFnZW50X2V4cHIgKikpOworc3RhdGljIHZvaWQgZ2VuX29mZnNldCBQQVJBTVMgKChzdHJ1Y3QgYWdlbnRfZXhwciAqYXgsIGludCBvZmZzZXQpKTsKK3N0YXRpYyB2b2lkIGdlbl9zeW1fb2Zmc2V0IFBBUkFNUyAoKHN0cnVjdCBhZ2VudF9leHByICosIHN0cnVjdCBzeW1ib2wgKikpOworc3RhdGljIHZvaWQgZ2VuX3Zhcl9yZWYgUEFSQU1TICgoc3RydWN0IGFnZW50X2V4cHIgKmF4LAorCQkJCSBzdHJ1Y3QgYXhzX3ZhbHVlICp2YWx1ZSwKKwkJCQkgc3RydWN0IHN5bWJvbCAqdmFyKSk7CisKKworc3RhdGljIHZvaWQgZ2VuX2ludF9saXRlcmFsIFBBUkFNUyAoKHN0cnVjdCBhZ2VudF9leHByICpheCwKKwkJCQkgICAgIHN0cnVjdCBheHNfdmFsdWUgKnZhbHVlLAorCQkJCSAgICAgTE9OR0VTVCBrLCBzdHJ1Y3QgdHlwZSAqdHlwZSkpOworCisKK3N0YXRpYyB2b2lkIHJlcXVpcmVfcnZhbHVlIFBBUkFNUyAoKHN0cnVjdCBhZ2VudF9leHByICpheCwKKwkJCQkgICAgc3RydWN0IGF4c192YWx1ZSAqdmFsdWUpKTsKK3N0YXRpYyB2b2lkIGdlbl91c3VhbF91bmFyeSBQQVJBTVMgKChzdHJ1Y3QgYWdlbnRfZXhwciAqYXgsCisJCQkJICAgICBzdHJ1Y3QgYXhzX3ZhbHVlICp2YWx1ZSkpOworc3RhdGljIGludCB0eXBlX3dpZGVyX3RoYW4gUEFSQU1TICgoc3RydWN0IHR5cGUgKnR5cGUxLAorCQkJCSAgICBzdHJ1Y3QgdHlwZSAqdHlwZTIpKTsKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqbWF4X3R5cGUgUEFSQU1TICgoc3RydWN0IHR5cGUgKnR5cGUxLCAKKwkJCQkgICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTIpKTsKK3N0YXRpYyB2b2lkIGdlbl9jb252ZXJzaW9uIFBBUkFNUyAoKHN0cnVjdCBhZ2VudF9leHByICpheCwKKwkJCQkgICAgc3RydWN0IHR5cGUgKmZyb20sCisJCQkJICAgIHN0cnVjdCB0eXBlICp0bykpOworc3RhdGljIGludCBpc19ub250cml2aWFsX2NvbnZlcnNpb24gUEFSQU1TICgoc3RydWN0IHR5cGUgKmZyb20sCisJCQkJCSAgICAgc3RydWN0IHR5cGUgKnRvKSk7CitzdGF0aWMgdm9pZCBnZW5fdXN1YWxfYXJpdGhtZXRpYyBQQVJBTVMgKChzdHJ1Y3QgYWdlbnRfZXhwciAqYXgsCisJCQkJCSAgc3RydWN0IGF4c192YWx1ZSAqdmFsdWUxLAorCQkJCQkgIHN0cnVjdCBheHNfdmFsdWUgKnZhbHVlMikpOworc3RhdGljIHZvaWQgZ2VuX2ludGVncmFsX3Byb21vdGlvbnMgUEFSQU1TICgoc3RydWN0IGFnZW50X2V4cHIgKmF4LAorCQkJCQkgICAgIHN0cnVjdCBheHNfdmFsdWUgKnZhbHVlKSk7CitzdGF0aWMgdm9pZCBnZW5fY2FzdCBQQVJBTVMgKChzdHJ1Y3QgYWdlbnRfZXhwciAqYXgsCisJCQkgICAgICBzdHJ1Y3QgYXhzX3ZhbHVlICp2YWx1ZSwKKwkJCSAgICAgIHN0cnVjdCB0eXBlICp0eXBlKSk7CitzdGF0aWMgdm9pZCBnZW5fc2NhbGUgUEFSQU1TICgoc3RydWN0IGFnZW50X2V4cHIgKmF4LAorCQkJICAgICAgIGVudW0gYWdlbnRfb3Agb3AsCisJCQkgICAgICAgc3RydWN0IHR5cGUgKnR5cGUpKTsKK3N0YXRpYyB2b2lkIGdlbl9hZGQgUEFSQU1TICgoc3RydWN0IGFnZW50X2V4cHIgKmF4LAorCQkJICAgICBzdHJ1Y3QgYXhzX3ZhbHVlICp2YWx1ZSwgCisJCQkgICAgIHN0cnVjdCBheHNfdmFsdWUgKnZhbHVlMSwKKwkJCSAgICAgc3RydWN0IGF4c192YWx1ZSAqdmFsdWUyLAorCQkJICAgICBjaGFyICpuYW1lKSk7CitzdGF0aWMgdm9pZCBnZW5fc3ViIFBBUkFNUyAoKHN0cnVjdCBhZ2VudF9leHByICpheCwKKwkJCSAgICAgc3RydWN0IGF4c192YWx1ZSAqdmFsdWUsIAorCQkJICAgICBzdHJ1Y3QgYXhzX3ZhbHVlICp2YWx1ZTEsCisJCQkgICAgIHN0cnVjdCBheHNfdmFsdWUgKnZhbHVlMikpOworc3RhdGljIHZvaWQgZ2VuX2Jpbm9wIFBBUkFNUyAoKHN0cnVjdCBhZ2VudF9leHByICpheCwKKwkJCSAgICAgICBzdHJ1Y3QgYXhzX3ZhbHVlICp2YWx1ZSwKKwkJCSAgICAgICBzdHJ1Y3QgYXhzX3ZhbHVlICp2YWx1ZTEsCisJCQkgICAgICAgc3RydWN0IGF4c192YWx1ZSAqdmFsdWUyLAorCQkJICAgICAgIGVudW0gYWdlbnRfb3Agb3AsCisJCQkgICAgICAgZW51bSBhZ2VudF9vcCBvcF91bnNpZ25lZCwKKwkJCSAgICAgICBpbnQgbWF5X2NhcnJ5LAorCQkJICAgICAgIGNoYXIgKm5hbWUpKTsKK3N0YXRpYyB2b2lkIGdlbl9sb2dpY2FsX25vdCBQQVJBTVMgKChzdHJ1Y3QgYWdlbnRfZXhwciAqYXgsCisJCQkJICAgICBzdHJ1Y3QgYXhzX3ZhbHVlICp2YWx1ZSkpOworc3RhdGljIHZvaWQgZ2VuX2NvbXBsZW1lbnQgUEFSQU1TICgoc3RydWN0IGFnZW50X2V4cHIgKmF4LAorCQkJCSAgICBzdHJ1Y3QgYXhzX3ZhbHVlICp2YWx1ZSkpOworc3RhdGljIHZvaWQgZ2VuX2RlcmVmIFBBUkFNUyAoKHN0cnVjdCBhZ2VudF9leHByICosIHN0cnVjdCBheHNfdmFsdWUgKikpOworc3RhdGljIHZvaWQgZ2VuX2FkZHJlc3Nfb2YgUEFSQU1TICgoc3RydWN0IGFnZW50X2V4cHIgKiwgc3RydWN0IGF4c192YWx1ZSAqKSk7CitzdGF0aWMgaW50IGZpbmRfZmllbGQgUEFSQU1TICgoc3RydWN0IHR5cGUgKnR5cGUsIGNoYXIgKm5hbWUpKTsKK3N0YXRpYyB2b2lkIGdlbl9iaXRmaWVsZF9yZWYgUEFSQU1TICgoc3RydWN0IGFnZW50X2V4cHIgKmF4LAorCQkJCSAgICAgIHN0cnVjdCBheHNfdmFsdWUgKnZhbHVlLAorCQkJCSAgICAgIHN0cnVjdCB0eXBlICp0eXBlLAorCQkJCSAgICAgIGludCBzdGFydCwgaW50IGVuZCkpOworc3RhdGljIHZvaWQgZ2VuX3N0cnVjdF9yZWYgUEFSQU1TICgoc3RydWN0IGFnZW50X2V4cHIgKmF4LAorCQkJCSAgICBzdHJ1Y3QgYXhzX3ZhbHVlICp2YWx1ZSwKKwkJCQkgICAgY2hhciAqZmllbGQsCisJCQkJICAgIGNoYXIgKm9wZXJhdG9yX25hbWUsCisJCQkJICAgIGNoYXIgKm9wZXJhbmRfbmFtZSkpOworc3RhdGljIHZvaWQgZ2VuX3JlcGVhdCBQQVJBTVMgKCh1bmlvbiBleHBfZWxlbWVudCAqKnBjLAorCQkJCXN0cnVjdCBhZ2VudF9leHByICpheCwKKwkJCQlzdHJ1Y3QgYXhzX3ZhbHVlICp2YWx1ZSkpOworc3RhdGljIHZvaWQgZ2VuX3NpemVvZiBQQVJBTVMgKCh1bmlvbiBleHBfZWxlbWVudCAqKnBjLAorCQkJCXN0cnVjdCBhZ2VudF9leHByICpheCwKKwkJCQlzdHJ1Y3QgYXhzX3ZhbHVlICp2YWx1ZSkpOworc3RhdGljIHZvaWQgZ2VuX2V4cHIgUEFSQU1TICgodW5pb24gZXhwX2VsZW1lbnQgKipwYywKKwkJCSAgICAgIHN0cnVjdCBhZ2VudF9leHByICpheCwKKwkJCSAgICAgIHN0cnVjdCBheHNfdmFsdWUgKnZhbHVlKSk7CisKK3N0YXRpYyB2b2lkIHByaW50X2F4c192YWx1ZSBQQVJBTVMgKChHREJfRklMRSAqZiwgc3RydWN0IGF4c192YWx1ZSAqdmFsdWUpKTsKK3N0YXRpYyB2b2lkIGFnZW50X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqZXhwLCBpbnQgZnJvbV90dHkpKTsKKworDAorLyogRGV0ZWN0aW5nIGNvbnN0YW50IGV4cHJlc3Npb25zLiAgKi8KKworLyogSWYgdGhlIHZhcmlhYmxlIHJlZmVyZW5jZSBhdCAqUEMgaXMgYSBjb25zdGFudCwgcmV0dXJuIGl0cyB2YWx1ZS4KKyAgIE90aGVyd2lzZSwgcmV0dXJuIHplcm8uCisKKyAgIEhleSwgV2FsbHkhICBIb3cgY2FuIGEgdmFyaWFibGUgcmVmZXJlbmNlIGJlIGEgY29uc3RhbnQ/CisKKyAgIFdlbGwsIEJlYXYsIHRoaXMgZnVuY3Rpb24gcmVhbGx5IGhhbmRsZXMgdGhlIE9QX1ZBUl9WQUxVRSBvcGVyYXRvciwKKyAgIG5vdCBzcGVjaWZpY2FsbHkgdmFyaWFibGUgcmVmZXJlbmNlcy4gIEdEQiB1c2VzIE9QX1ZBUl9WQUxVRSB0bworICAgcmVmZXIgdG8gYW55IGtpbmQgb2Ygc3ltYm9saWMgcmVmZXJlbmNlOiBmdW5jdGlvbiBuYW1lcywgZW51bQorICAgZWxlbWVudHMsIGFuZCBnb3RvIGxhYmVscyBhcmUgYWxsIGhhbmRsZWQgdGhyb3VnaCB0aGUgT1BfVkFSX1ZBTFVFCisgICBvcGVyYXRvciwgZXZlbiB0aG91Z2ggdGhleSdyZSBjb25zdGFudHMuICBJdCBtYWtlcyBzZW5zZSBnaXZlbiB0aGUKKyAgIHNpdHVhdGlvbi4KKworICAgR2VlLCBXYWxseSwgZG9uJ2NoYSB3b25kZXIgc29tZXRpbWVzIGlmIGRhdGEgcmVwcmVzZW50YXRpb25zIHRoYXQKKyAgIHN1YnZlcnQgY29tbW9ubHkgYWNjZXB0ZWQgZGVmaW5pdGlvbnMgb2YgdGVybXMgaW4gZmF2b3Igb2YgaGVhdmlseQorICAgY29udGV4dC1zcGVjaWZpYyBpbnRlcnByZXRhdGlvbnMgYXJlIHJlYWxseSBqdXN0IGEgdG9vbCBvZiB0aGUKKyAgIHByb2dyYW1taW5nIGhlZ2Vtb255IHRvIHByZXNlcnZlIHRoZWlyIHBvd2VyIGFuZCBleGNsdWRlIHRoZQorICAgcHJvbGV0YXJpYXQ/ICAqLworCitzdGF0aWMgc3RydWN0IHZhbHVlICoKK2NvbnN0X3Zhcl9yZWYgKHZhcikKKyAgICAgc3RydWN0IHN5bWJvbCAqdmFyOworeworICBzdHJ1Y3QgdHlwZSAqdHlwZSA9IFNZTUJPTF9UWVBFICh2YXIpOworCisgIHN3aXRjaCAoU1lNQk9MX0NMQVNTICh2YXIpKQorICAgIHsKKyAgICBjYXNlIExPQ19DT05TVDoKKyAgICAgIHJldHVybiB2YWx1ZV9mcm9tX2xvbmdlc3QgKHR5cGUsIChMT05HRVNUKSBTWU1CT0xfVkFMVUUgKHZhcikpOworCisgICAgY2FzZSBMT0NfTEFCRUw6CisgICAgICByZXR1cm4gdmFsdWVfZnJvbV9sb25nZXN0ICh0eXBlLCAoTE9OR0VTVCkgU1lNQk9MX1ZBTFVFX0FERFJFU1MgKHZhcikpOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworCisvKiBJZiB0aGUgZXhwcmVzc2lvbiBzdGFydGluZyBhdCAqUEMgaGFzIGEgY29uc3RhbnQgdmFsdWUsIHJldHVybiBpdC4KKyAgIE90aGVyd2lzZSwgcmV0dXJuIHplcm8uICBJZiB3ZSByZXR1cm4gYSB2YWx1ZSwgdGhlbiAqUEMgd2lsbCBiZQorICAgYWR2YW5jZWQgdG8gdGhlIGVuZCBvZiBpdC4gIElmIHdlIHJldHVybiB6ZXJvLCAqUEMgY291bGQgYmUKKyAgIGFueXdoZXJlLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgdmFsdWUgKgorY29uc3RfZXhwciAocGMpCisgICAgIHVuaW9uIGV4cF9lbGVtZW50ICoqcGM7Cit7CisgIGVudW0gZXhwX29wY29kZSBvcCA9ICgqcGMpLT5vcGNvZGU7CisgIHN0cnVjdCB2YWx1ZSAqdjE7CisKKyAgc3dpdGNoIChvcCkKKyAgICB7CisgICAgY2FzZSBPUF9MT05HOgorICAgICAgeworCXN0cnVjdCB0eXBlICp0eXBlID0gKCpwYylbMV0udHlwZTsKKwlMT05HRVNUIGsgPSAoKnBjKVsyXS5sb25nY29uc3Q7CisJKCpwYykgKz0gNDsKKwlyZXR1cm4gdmFsdWVfZnJvbV9sb25nZXN0ICh0eXBlLCBrKTsKKyAgICAgIH0KKworICAgIGNhc2UgT1BfVkFSX1ZBTFVFOgorICAgICAgeworCXN0cnVjdCB2YWx1ZSAqdiA9IGNvbnN0X3Zhcl9yZWYgKCgqcGMpWzJdLnN5bWJvbCk7CisJKCpwYykgKz0gNDsKKwlyZXR1cm4gdjsKKyAgICAgIH0KKworICAgIC8qIFdlIGNvdWxkIGFkZCBtb3JlIG9wZXJhdG9ycyBpbiBoZXJlLiAgKi8KKworICAgIGNhc2UgVU5PUF9ORUc6CisgICAgICAoKnBjKSsrOworICAgICAgdjEgPSBjb25zdF9leHByIChwYyk7CisgICAgICBpZiAodjEpCisJcmV0dXJuIHZhbHVlX25lZyAodjEpOworICAgICAgZWxzZQorCXJldHVybiAwOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworCisvKiBMaWtlIGNvbnN0X2V4cHIsIGJ1dCBndWFyYW50ZWUgYWxzbyB0aGF0ICpQQyBpcyB1bmRpc3R1cmJlZCBpZiB0aGUKKyAgIGV4cHJlc3Npb24gaXMgbm90IGNvbnN0YW50LiAgKi8KK3N0YXRpYyBzdHJ1Y3QgdmFsdWUgKgorbWF5YmVfY29uc3RfZXhwciAocGMpCisgICAgIHVuaW9uIGV4cF9lbGVtZW50ICoqcGM7Cit7CisgIHVuaW9uIGV4cF9lbGVtZW50ICp0ZW50YXRpdmVfcGMgPSAqcGM7CisgIHN0cnVjdCB2YWx1ZSAqdiA9IGNvbnN0X2V4cHIgKCZ0ZW50YXRpdmVfcGMpOworCisgIC8qIElmIHdlIGdvdCBhIHZhbHVlLCB0aGVuIHVwZGF0ZSB0aGUgcmVhbCBQQy4gICovCisgIGlmICh2KQorICAgICpwYyA9IHRlbnRhdGl2ZV9wYzsKKyAKKyAgcmV0dXJuIHY7Cit9CisKKwwKKy8qIEdlbmVyYXRpbmcgYnl0ZWNvZGUgZnJvbSBHREIgZXhwcmVzc2lvbnM6IGdlbmVyYWwgYXNzdW1wdGlvbnMgKi8KKworLyogSGVyZSBhcmUgYSBmZXcgZ2VuZXJhbCBhc3N1bXB0aW9ucyBtYWRlIHRocm91Z2hvdXQgdGhlIGNvZGU7IGlmIHlvdQorICAgd2FudCB0byBtYWtlIGEgY2hhbmdlIHRoYXQgY29udHJhZGljdHMgb25lIG9mIHRoZXNlLCB0aGVuIHlvdSdkCisgICBiZXR0ZXIgc2NhbiB0aGluZ3MgcHJldHR5IHRob3JvdWdobHkuCisKKyAgIC0gV2UgYXNzdW1lIHRoYXQgYWxsIHZhbHVlcyBvY2N1cHkgb25lIHN0YWNrIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwKKyAgICAgc29tZXRpbWVzIHdlJ2xsIHN3YXAgdG8gZ2V0IGF0IHRoZSBsZWZ0IGFyZ3VtZW50IHRvIGEgYmluYXJ5CisgICAgIG9wZXJhdG9yLiAgSWYgd2UgZGVjaWRlIHRoYXQgdm9pZCB2YWx1ZXMgc2hvdWxkIG9jY3VweSBubyBzdGFjaworICAgICBlbGVtZW50cywgb3IgdGhhdCBzeW50aGV0aWMgYXJyYXlzICh3aG9zZSBzaXplIGlzIGRldGVybWluZWQgYXQKKyAgICAgcnVuIHRpbWUsIGNyZWF0ZWQgYnkgdGhlIGBAJyBvcGVyYXRvcikgc2hvdWxkIG9jY3VweSB0d28gc3RhY2sKKyAgICAgZWxlbWVudHMgKGFkZHJlc3MgYW5kIGxlbmd0aCksIHRoZW4gdGhpcyB3aWxsIGNhdXNlIHRyb3VibGUuCisKKyAgIC0gV2UgYXNzdW1lIHRoZSBzdGFjayBlbGVtZW50cyBhcmUgaW5maW5pdGVseSB3aWRlLCBhbmQgdGhhdCB3ZQorICAgICBkb24ndCBoYXZlIHRvIHdvcnJ5IHdoYXQgaGFwcGVucyBpZiB0aGUgdXNlciByZXF1ZXN0cyBhbgorICAgICBvcGVyYXRpb24gdGhhdCBpcyB3aWRlciB0aGFuIHRoZSBhY3R1YWwgaW50ZXJwcmV0ZXIncyBzdGFjay4KKyAgICAgVGhhdCBpcywgaXQncyB1cCB0byB0aGUgaW50ZXJwcmV0ZXIgdG8gaGFuZGxlIGRpcmVjdGx5IGFsbCB0aGUKKyAgICAgaW50ZWdlciB3aWR0aHMgdGhlIHVzZXIgaGFzIGFjY2VzcyB0by4gIChXb2UgYmV0aWRlIHRoZSBsYW5ndWFnZQorICAgICB3aXRoIGJpZ251bXMhKQorCisgICAtIFdlIGRvbid0IHN1cHBvcnQgc2lkZSBlZmZlY3RzLiAgVGh1cywgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dAorICAgICBHQ0MncyBnZW5lcmFsaXplZCBsdmFsdWVzLCBmdW5jdGlvbiBjYWxscywgZXRjLgorCisgICAtIFdlIGRvbid0IHN1cHBvcnQgZmxvYXRpbmcgcG9pbnQuICBNYW55IHBsYWNlcyB3aGVyZSB3ZSBzd2l0Y2ggb24KKyAgICAgc29tZSB0eXBlIGRvbid0IGJvdGhlciB0byBpbmNsdWRlIGNhc2VzIGZvciBmbG9hdGluZyBwb2ludDsgdGhlcmUKKyAgICAgbWF5IGJlIGV2ZW4gbW9yZSBzdWJ0bGUgd2F5cyB0aGlzIGFzc3VtcHRpb24gZXhpc3RzLiAgRm9yCisgICAgIGV4YW1wbGUsIHRoZSBhcmd1bWVudHMgdG8gJSBtdXN0IGJlIGludGVnZXJzLgorCisgICAtIFdlIGFzc3VtZSBhbGwgc3ViZXhwcmVzc2lvbnMgaGF2ZSBhIHN0YXRpYywgdW5jaGFuZ2luZyB0eXBlLiAgSWYKKyAgICAgd2UgdHJpZWQgdG8gc3VwcG9ydCBjb252ZW5pZW5jZSB2YXJpYWJsZXMsIHRoaXMgd291bGQgYmUgYQorICAgICBwcm9ibGVtLgorCisgICAtIEFsbCB2YWx1ZXMgb24gdGhlIHN0YWNrIHNob3VsZCBhbHdheXMgYmUgZnVsbHkgemVyby0gb3IKKyAgICAgc2lnbi1leHRlbmRlZC4KKworICAgICAoSSB3YXNuJ3Qgc3VyZSB3aGV0aGVyIHRvIGNob29zZSB0aGlzIG9yIGl0cyBvcHBvc2l0ZSAtLS0gdGhhdAorICAgICBvbmx5IGFkZHJlc3NlcyBhcmUgYXNzdW1lZCBleHRlbmRlZCAtLS0gYnV0IGl0IHR1cm5zIG91dCB0aGF0CisgICAgIG5laXRoZXIgY29udmVudGlvbiBjb21wbGV0ZWx5IGVsaW1pbmF0ZXMgc3B1cmlvdXMgZXh0ZW5kCisgICAgIG9wZXJhdGlvbnMgKGlmIGV2ZXJ5dGhpbmcgaXMgYWx3YXlzIGV4dGVuZGVkLCB0aGVuIHlvdSBoYXZlIHRvCisgICAgIGV4dGVuZCBhZnRlciBhZGQsIGJlY2F1c2UgaXQgY291bGQgb3ZlcmZsb3c7IGlmIG5vdGhpbmcgaXMKKyAgICAgZXh0ZW5kZWQsIHRoZW4geW91IGVuZCB1cCBwcm9kdWNpbmcgZXh0ZW5kcyB3aGVuZXZlciB5b3UgY2hhbmdlCisgICAgIHNpemVzKSwgYW5kIHRoaXMgaXMgc2ltcGxlci4pICAqLworCisMCisvKiBHZW5lcmF0aW5nIGJ5dGVjb2RlIGZyb20gR0RCIGV4cHJlc3Npb25zOiB0aGUgYHRyYWNlJyBrbHVkZ2UgICovCisKKy8qIFRoZSBjb21waWxlciBpbiB0aGlzIGZpbGUgaXMgYSBnZW5lcmFsLXB1cnBvc2UgbWVjaGFuaXNtIGZvcgorICAgdHJhbnNsYXRpbmcgR0RCIGV4cHJlc3Npb25zIGludG8gYnl0ZWNvZGUuICBPbmUgb3VnaHQgdG8gYmUgYWJsZSB0bworICAgZmluZCBhIG1pbGxpb24gYW5kIG9uZSB1c2VzIGZvciBpdC4KKworICAgSG93ZXZlciwgYXQgdGhlIG1vbWVudCBpdCBpcyBIT1BFTEVTU0xZIEJSQUlOLURBTUFHRUQgZm9yIHRoZSBzYWtlCisgICBvZiBleHBlZGllbmN5LiAgTGV0IGhlIHdobyBpcyB3aXRob3V0IHNpbiBjYXN0IHRoZSBmaXJzdCBzdG9uZS4KKworICAgRm9yIHRoZSBkYXRhIHRyYWNpbmcgZmFjaWxpdHksIHdlIG5lZWQgdG8gaW5zZXJ0IGB0cmFjZScgYnl0ZWNvZGVzCisgICBiZWZvcmUgZWFjaCBkYXRhIGZldGNoOyB0aGlzIHJlY29yZHMgYWxsIHRoZSBtZW1vcnkgdGhhdCB0aGUKKyAgIGV4cHJlc3Npb24gdG91Y2hlcyBpbiB0aGUgY291cnNlIG9mIGV2YWx1YXRpb24sIHNvIHRoYXQgbWVtb3J5IHdpbGwKKyAgIGJlIGF2YWlsYWJsZSB3aGVuIHRoZSB1c2VyIGxhdGVyIHRyaWVzIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uCisgICBpbiBHREIuCisKKyAgIFRoaXMgc2hvdWxkIGJlIGRvbmUgKEkgdGhpbmspIGluIGEgcG9zdC1wcm9jZXNzaW5nIHBhc3MsIHRoYXQgd2Fsa3MKKyAgIGFuIGFyYml0cmFyeSBhZ2VudCBleHByZXNzaW9uIGFuZCBpbnNlcnRzIGB0cmFjZScgb3BlcmF0aW9ucyBhdCB0aGUKKyAgIGFwcHJvcHJpYXRlIHBvaW50cy4gIEJ1dCBpdCdzIG11Y2ggZmFzdGVyIHRvIGp1c3QgaGFjayB0aGVtCisgICBkaXJlY3RseSBpbnRvIHRoZSBjb2RlLiAgQW5kIHNpbmNlIHdlJ3JlIGluIGEgY3J1bmNoLCB0aGF0J3Mgd2hhdAorICAgSSd2ZSBkb25lLgorCisgICBTZXR0aW5nIHRoZSBmbGFnIHRyYWNlX2tsdWRnZSB0byBub24temVybyBlbmFibGVzIHRoZSBjb2RlIHRoYXQKKyAgIGVtaXRzIHRoZSB0cmFjZSBieXRlY29kZXMgYXQgdGhlIGFwcHJvcHJpYXRlIHBvaW50cy4gICovCitzdGF0aWMgaW50IHRyYWNlX2tsdWRnZTsKKworLyogVHJhY2UgdGhlIGx2YWx1ZSBvbiB0aGUgc3RhY2ssIGlmIGl0IG5lZWRzIGl0LiAgSW4gZWl0aGVyIGNhc2UsIHBvcAorICAgdGhlIHZhbHVlLiAgVXNlZnVsIG9uIHRoZSBsZWZ0IHNpZGUgb2YgYSBjb21tYSwgYW5kIGF0IHRoZSBlbmQgb2YKKyAgIGFuIGV4cHJlc3Npb24gYmVpbmcgdXNlZCBmb3IgdHJhY2luZy4gICovCitzdGF0aWMgdm9pZAorZ2VuX3RyYWNlZF9wb3AgKGF4LCB2YWx1ZSkKKyAgICAgc3RydWN0IGFnZW50X2V4cHIgKmF4OworICAgICBzdHJ1Y3QgYXhzX3ZhbHVlICp2YWx1ZTsKK3sKKyAgaWYgKHRyYWNlX2tsdWRnZSkKKyAgICBzd2l0Y2ggKHZhbHVlLT5raW5kKQorICAgICAgeworICAgICAgY2FzZSBheHNfcnZhbHVlOgorCS8qIFdlIGRvbid0IHRyYWNlIHJ2YWx1ZXMsIGp1c3QgdGhlIGx2YWx1ZXMgbmVjZXNzYXJ5IHRvCisgICAgICAgICAgIHByb2R1Y2UgdGhlbS4gIFNvIGp1c3QgZGlzcG9zZSBvZiB0aGlzIHZhbHVlLiAgKi8KKwlheF9zaW1wbGUgKGF4LCBhb3BfcG9wKTsKKwlicmVhazsKKworICAgICAgY2FzZSBheHNfbHZhbHVlX21lbW9yeToKKwl7CisJICBpbnQgbGVuZ3RoID0gVFlQRV9MRU5HVEggKHZhbHVlLT50eXBlKTsKKworCSAgLyogVGhlcmUncyBubyBwb2ludCBpbiB0cnlpbmcgdG8gdXNlIGEgdHJhY2VfcXVpY2sgYnl0ZWNvZGUKKwkgICAgIGhlcmUsIHNpbmNlICJ0cmFjZV9xdWljayBTSVpFIHBvcCIgaXMgdGhyZWUgYnl0ZXMsIHdoZXJlYXMKKwkgICAgICJjb25zdDggU0laRSB0cmFjZSIgaXMgYWxzbyB0aHJlZSBieXRlcywgZG9lcyB0aGUgc2FtZQorCSAgICAgdGhpbmcsIGFuZCB0aGUgc2ltcGxlc3QgY29kZSB3aGljaCBnZW5lcmF0ZXMgdGhhdCB3aWxsIGFsc28KKwkgICAgIHdvcmsgY29ycmVjdGx5IGZvciBvYmplY3RzIHdpdGggbGFyZ2Ugc2l6ZXMuICAqLworCSAgYXhfY29uc3RfbCAoYXgsIGxlbmd0aCk7CisJICBheF9zaW1wbGUgKGF4LCBhb3BfdHJhY2UpOworCX0KKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGF4c19sdmFsdWVfcmVnaXN0ZXI6CisJLyogV2UgbmVlZCB0byBtZW50aW9uIHRoZSByZWdpc3RlciBzb21ld2hlcmUgaW4gdGhlIGJ5dGVjb2RlLAorCSAgIHNvIGF4X3JlcXMgd2lsbCBwaWNrIGl0IHVwIGFuZCBhZGQgaXQgdG8gdGhlIG1hc2sgb2YKKwkgICByZWdpc3RlcnMgdXNlZC4gICovCisJYXhfcmVnIChheCwgdmFsdWUtPnUucmVnKTsKKwlheF9zaW1wbGUgKGF4LCBhb3BfcG9wKTsKKwlicmVhazsKKyAgICAgIH0KKyAgZWxzZQorICAgIC8qIElmIHdlJ3JlIG5vdCB0cmFjaW5nLCBqdXN0IHBvcCB0aGUgdmFsdWUuICAqLworICAgIGF4X3NpbXBsZSAoYXgsIGFvcF9wb3ApOworfQorCisKKwwKKy8qIEdlbmVyYXRpbmcgYnl0ZWNvZGUgZnJvbSBHREIgZXhwcmVzc2lvbnM6IGhlbHBlciBmdW5jdGlvbnMgKi8KKworLyogQXNzdW1lIHRoYXQgdGhlIGxvd2VyIGJpdHMgb2YgdGhlIHRvcCBvZiB0aGUgc3RhY2sgaXMgYSB2YWx1ZSBvZgorICAgdHlwZSBUWVBFLCBhbmQgdGhlIHVwcGVyIGJpdHMgYXJlIHplcm8uICBTaWduLWV4dGVuZCBpZiBuZWNlc3NhcnkuICAqLworc3RhdGljIHZvaWQKK2dlbl9zaWduX2V4dGVuZCAoYXgsIHR5cGUpCisgICAgIHN0cnVjdCBhZ2VudF9leHByICpheDsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIC8qIERvIHdlIG5lZWQgdG8gc2lnbi1leHRlbmQgdGhpcz8gICovCisgIGlmICghIFRZUEVfVU5TSUdORUQgKHR5cGUpKQorICAgIGF4X2V4dCAoYXgsIHR5cGUtPmxlbmd0aCAqIFRBUkdFVF9DSEFSX0JJVCk7Cit9CisKKworLyogQXNzdW1lIHRoZSBsb3dlciBiaXRzIG9mIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGhvbGQgYSB2YWx1ZSBvZiB0eXBlCisgICBUWVBFLCBhbmQgdGhlIHVwcGVyIGJpdHMgYXJlIGdhcmJhZ2UuICBTaWduLWV4dGVuZCBvciB0cnVuY2F0ZSBhcworICAgbmVlZGVkLiAgKi8KK3N0YXRpYyB2b2lkCitnZW5fZXh0ZW5kIChheCwgdHlwZSkKKyAgICAgc3RydWN0IGFnZW50X2V4cHIgKmF4OworICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgaW50IGJpdHMgPSB0eXBlLT5sZW5ndGggKiBUQVJHRVRfQ0hBUl9CSVQ7CisgIC8qIEkganVzdCBoYWQgdG8uICAqLworICAoKFRZUEVfVU5TSUdORUQgKHR5cGUpID8gYXhfemVyb19leHQgOiBheF9leHQpIChheCwgYml0cykpOworfQorCisKKy8qIEFzc3VtZSB0aGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGNvbnRhaW5zIGEgdmFsdWUgb2YgdHlwZSAicG9pbnRlcgorICAgdG8gVFlQRSI7IGdlbmVyYXRlIGNvZGUgdG8gZmV0Y2ggaXRzIHZhbHVlLiAgTm90ZSB0aGF0IFRZUEUgaXMgdGhlCisgICB0YXJnZXQgdHlwZSwgbm90IHRoZSBwb2ludGVyIHR5cGUuICAqLworc3RhdGljIHZvaWQKK2dlbl9mZXRjaCAoYXgsIHR5cGUpCisgICAgIHN0cnVjdCBhZ2VudF9leHByICpheDsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIGlmICh0cmFjZV9rbHVkZ2UpCisgICAgeworICAgICAgLyogUmVjb3JkIHRoZSBhcmVhIG9mIG1lbW9yeSB3ZSdyZSBhYm91dCB0byBmZXRjaC4gICovCisgICAgICBheF90cmFjZV9xdWljayAoYXgsIFRZUEVfTEVOR1RIICh0eXBlKSk7CisgICAgfQorCisgIHN3aXRjaCAodHlwZS0+Y29kZSkKKyAgICB7CisgICAgY2FzZSBUWVBFX0NPREVfUFRSOgorICAgIGNhc2UgVFlQRV9DT0RFX0VOVU06CisgICAgY2FzZSBUWVBFX0NPREVfSU5UOgorICAgIGNhc2UgVFlQRV9DT0RFX0NIQVI6CisgICAgICAvKiBJdCdzIGEgc2NhbGFyIHZhbHVlLCBzbyB3ZSBrbm93IGhvdyB0byBkZXJlZmVyZW5jZSBpdC4gIEhvdworICAgICAgICAgbWFueSBieXRlcyBsb25nIGlzIGl0PyAgKi8KKyAgICAgIHN3aXRjaCAodHlwZS0+bGVuZ3RoKQorCXsKKwljYXNlIDggIC8gVEFSR0VUX0NIQVJfQklUOiBheF9zaW1wbGUgKGF4LCBhb3BfcmVmOCApOyBicmVhazsKKwljYXNlIDE2IC8gVEFSR0VUX0NIQVJfQklUOiBheF9zaW1wbGUgKGF4LCBhb3BfcmVmMTYpOyBicmVhazsKKwljYXNlIDMyIC8gVEFSR0VUX0NIQVJfQklUOiBheF9zaW1wbGUgKGF4LCBhb3BfcmVmMzIpOyBicmVhazsKKwljYXNlIDY0IC8gVEFSR0VUX0NIQVJfQklUOiBheF9zaW1wbGUgKGF4LCBhb3BfcmVmNjQpOyBicmVhazsKKworCSAgLyogRWl0aGVyIG91ciBjYWxsZXIgc2hvdWxkbid0IGhhdmUgYXNrZWQgdXMgdG8gZGVyZWZlcmVuY2UKKwkgICAgIHRoYXQgcG9pbnRlciAob3RoZXIgY29kZSdzIGZhdWx0KSwgb3Igd2UncmUgbm90CisJICAgICBpbXBsZW1lbnRpbmcgc29tZXRoaW5nIHdlIHNob3VsZCBiZSAodGhpcyBjb2RlJ3MgZmF1bHQpLgorCSAgICAgSW4gYW55IGNhc2UsIGl0J3MgYSBidWcgdGhlIHVzZXIgc2hvdWxkbid0IHNlZS4gICovCisJZGVmYXVsdDoKKwkgIGVycm9yICgiR0RCIGJ1ZzogYXgtZ2RiLmMgKGdlbl9mZXRjaCk6IHN0cmFuZ2Ugc2l6ZSIpOworCX0KKworICAgICAgZ2VuX3NpZ25fZXh0ZW5kIChheCwgdHlwZSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBFaXRoZXIgb3VyIGNhbGxlciBzaG91bGRuJ3QgaGF2ZSBhc2tlZCB1cyB0byBkZXJlZmVyZW5jZSB0aGF0CisJIHBvaW50ZXIgKG90aGVyIGNvZGUncyBmYXVsdCksIG9yIHdlJ3JlIG5vdCBpbXBsZW1lbnRpbmcKKwkgc29tZXRoaW5nIHdlIHNob3VsZCBiZSAodGhpcyBjb2RlJ3MgZmF1bHQpLiAgSW4gYW55IGNhc2UsCisJIGl0J3MgYSBidWcgdGhlIHVzZXIgc2hvdWxkbid0IHNlZS4gICovCisgICAgICBlcnJvciAoIkdEQiBidWc6IGF4LWdkYi5jIChnZW5fZmV0Y2gpOiBiYWQgdHlwZSBjb2RlIik7CisgICAgfQorfQorCisKKy8qIEdlbmVyYXRlIGNvZGUgdG8gbGVmdCBzaGlmdCB0aGUgdG9wIG9mIHRoZSBzdGFjayBieSBESVNUQU5DRSBiaXRzLCBvcgorICAgcmlnaHQgc2hpZnQgaXQgYnkgLURJU1RBTkNFIGJpdHMgaWYgRElTVEFOQ0UgPCAwLiAgVGhpcyBnZW5lcmF0ZXMKKyAgIHVuc2lnbmVkIChsb2dpY2FsKSByaWdodCBzaGlmdHMuICAqLworc3RhdGljIHZvaWQKK2dlbl9sZWZ0X3NoaWZ0IChheCwgZGlzdGFuY2UpCisgICAgIHN0cnVjdCBhZ2VudF9leHByICpheDsKKyAgICAgaW50IGRpc3RhbmNlOworeworICBpZiAoZGlzdGFuY2UgPiAwKQorICAgIHsKKyAgICAgIGF4X2NvbnN0X2wgKGF4LCBkaXN0YW5jZSk7CisgICAgICBheF9zaW1wbGUgKGF4LCBhb3BfbHNoKTsKKyAgICB9CisgIGVsc2UgaWYgKGRpc3RhbmNlIDwgMCkKKyAgICB7CisgICAgICBheF9jb25zdF9sIChheCwgLWRpc3RhbmNlKTsKKyAgICAgIGF4X3NpbXBsZSAoYXgsIGFvcF9yc2hfdW5zaWduZWQpOworICAgIH0KK30KKworCisMCisvKiBHZW5lcmF0aW5nIGJ5dGVjb2RlIGZyb20gR0RCIGV4cHJlc3Npb25zOiBzeW1ib2wgcmVmZXJlbmNlcyAqLworCisvKiBHZW5lcmF0ZSBjb2RlIHRvIHB1c2ggdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgYXJndW1lbnQgcG9ydGlvbiBvZgorICAgdGhlIHRvcCBzdGFjayBmcmFtZS4gICovCitzdGF0aWMgdm9pZAorZ2VuX2ZyYW1lX2FyZ3NfYWRkcmVzcyAoYXgpCisgICAgIHN0cnVjdCBhZ2VudF9leHByICpheDsKK3sKKyAgbG9uZyBmcmFtZV9yZWcsIGZyYW1lX29mZnNldDsKKworICBUQVJHRVRfVklSVFVBTF9GUkFNRV9QT0lOVEVSIChheC0+c2NvcGUsICZmcmFtZV9yZWcsICZmcmFtZV9vZmZzZXQpOworICBheF9yZWcgICAgIChheCwgZnJhbWVfcmVnKTsKKyAgZ2VuX29mZnNldCAoYXgsIGZyYW1lX29mZnNldCk7Cit9CisKKworLyogR2VuZXJhdGUgY29kZSB0byBwdXNoIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGxvY2FscyBwb3J0aW9uIG9mIHRoZQorICAgdG9wIHN0YWNrIGZyYW1lLiAgKi8KK3N0YXRpYyB2b2lkCitnZW5fZnJhbWVfbG9jYWxzX2FkZHJlc3MgKGF4KQorICAgICBzdHJ1Y3QgYWdlbnRfZXhwciAqYXg7Cit7CisgIGxvbmcgZnJhbWVfcmVnLCBmcmFtZV9vZmZzZXQ7CisKKyAgVEFSR0VUX1ZJUlRVQUxfRlJBTUVfUE9JTlRFUiAoYXgtPnNjb3BlLCAmZnJhbWVfcmVnLCAmZnJhbWVfb2Zmc2V0KTsKKyAgYXhfcmVnICAgICAoYXgsIGZyYW1lX3JlZyk7CisgIGdlbl9vZmZzZXQgKGF4LCBmcmFtZV9vZmZzZXQpOworfQorCisKKy8qIEdlbmVyYXRlIGNvZGUgdG8gYWRkIE9GRlNFVCB0byB0aGUgdG9wIG9mIHRoZSBzdGFjay4gIFRyeSB0bworICAgZ2VuZXJhdGUgc2hvcnQgYW5kIHJlYWRhYmxlIGNvZGUuICBXZSB1c2UgdGhpcyBmb3IgZ2V0dGluZyB0bworICAgdmFyaWFibGVzIG9uIHRoZSBzdGFjaywgYW5kIHN0cnVjdHVyZSBtZW1iZXJzLiAgSWYgd2Ugd2VyZQorICAgcHJvZ3JhbW1pbmcgaW4gTUwsIGl0IHdvdWxkIGJlIGNsZWFyZXIgd2h5IHRoZXNlIGFyZSB0aGUgc2FtZQorICAgdGhpbmcuICAqLworc3RhdGljIHZvaWQKK2dlbl9vZmZzZXQgKGF4LCBvZmZzZXQpCisgICAgIHN0cnVjdCBhZ2VudF9leHByICpheDsKKyAgICAgaW50IG9mZnNldDsKK3sKKyAgLyogSXQgd291bGQgc3VmZmljZSB0byBzaW1wbHkgcHVzaCB0aGUgb2Zmc2V0IGFuZCBhZGQgaXQsIGJ1dCB0aGlzCisgICAgIG1ha2VzIGl0IGVhc2llciB0byByZWFkIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBvZmZzZXRzIGluIHRoZQorICAgICBieXRlY29kZS4gICovCisgIGlmIChvZmZzZXQgPiAwKQorICAgIHsKKyAgICAgIGF4X2NvbnN0X2wgKGF4LCBvZmZzZXQpOworICAgICAgYXhfc2ltcGxlIChheCwgYW9wX2FkZCk7CisgICAgfQorICBlbHNlIGlmIChvZmZzZXQgPCAwKQorICAgIHsKKyAgICAgIGF4X2NvbnN0X2wgKGF4LCAtb2Zmc2V0KTsKKyAgICAgIGF4X3NpbXBsZSAoYXgsIGFvcF9zdWIpOworICAgIH0KK30KKworCisvKiBJbiBtYW55IGNhc2VzLCBhIHN5bWJvbCdzIHZhbHVlIGlzIHRoZSBvZmZzZXQgZnJvbSBzb21lIG90aGVyCisgICBhZGRyZXNzIChzdGFjayBmcmFtZSwgYmFzZSByZWdpc3RlciwgZXRjLikgIEdlbmVyYXRlIGNvZGUgdG8gYWRkCisgICBWQVIncyB2YWx1ZSB0byB0aGUgdG9wIG9mIHRoZSBzdGFjay4gICovCitzdGF0aWMgdm9pZAorZ2VuX3N5bV9vZmZzZXQgKGF4LCB2YXIpCisgICAgIHN0cnVjdCBhZ2VudF9leHByICpheDsKKyAgICAgc3RydWN0IHN5bWJvbCAqdmFyOworeworICBnZW5fb2Zmc2V0IChheCwgU1lNQk9MX1ZBTFVFICh2YXIpKTsKK30KKworCisvKiBHZW5lcmF0ZSBjb2RlIGZvciBhIHZhcmlhYmxlIHJlZmVyZW5jZSB0byBBWC4gIFRoZSB2YXJpYWJsZSBpcyB0aGUKKyAgIHN5bWJvbCBWQVIuICBTZXQgVkFMVUUgdG8gZGVzY3JpYmUgdGhlIHJlc3VsdC4gICovCisKK3N0YXRpYyB2b2lkCitnZW5fdmFyX3JlZiAoYXgsIHZhbHVlLCB2YXIpCisgICAgIHN0cnVjdCBhZ2VudF9leHByICpheDsKKyAgICAgc3RydWN0IGF4c192YWx1ZSAqdmFsdWU7CisgICAgIHN0cnVjdCBzeW1ib2wgKnZhcjsKK3sKKyAgLyogRGVyZWZlcmVuY2UgYW55IHR5cGVkZWZzLiAqLworICB2YWx1ZS0+dHlwZSA9IGNoZWNrX3R5cGVkZWYgKFNZTUJPTF9UWVBFICh2YXIpKTsKKworICAvKiBJJ20gaW1pdGF0aW5nIHRoZSBjb2RlIGluIHJlYWRfdmFyX3ZhbHVlLiAgKi8KKyAgc3dpdGNoIChTWU1CT0xfQ0xBU1MgKHZhcikpCisgICAgeworICAgIGNhc2UgTE9DX0NPTlNUOgkJLyogQSBjb25zdGFudCwgbGlrZSBhbiBlbnVtIHZhbHVlLiAgKi8KKyAgICAgIGF4X2NvbnN0X2wgKGF4LCAoTE9OR0VTVCkgU1lNQk9MX1ZBTFVFICh2YXIpKTsKKyAgICAgIHZhbHVlLT5raW5kID0gYXhzX3J2YWx1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMT0NfTEFCRUw6CQkvKiBBIGdvdG8gbGFiZWwsIGJlaW5nIHVzZWQgYXMgYSB2YWx1ZS4gICovCisgICAgICBheF9jb25zdF9sIChheCwgKExPTkdFU1QpIFNZTUJPTF9WQUxVRV9BRERSRVNTICh2YXIpKTsKKyAgICAgIHZhbHVlLT5raW5kID0gYXhzX3J2YWx1ZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMT0NfQ09OU1RfQllURVM6CisgICAgICBlcnJvciAoIkdEQiBidWc6IGF4LWdkYi5jIChnZW5fdmFyX3JlZik6IExPQ19DT05TVF9CWVRFUyBzeW1ib2xzIGFyZSBub3Qgc3VwcG9ydGVkIik7CisKKyAgICAgIC8qIFZhcmlhYmxlIGF0IGEgZml4ZWQgbG9jYXRpb24gaW4gbWVtb3J5LiAgRWFzeS4gICovCisgICAgY2FzZSBMT0NfU1RBVElDOgorICAgICAgLyogUHVzaCB0aGUgYWRkcmVzcyBvZiB0aGUgdmFyaWFibGUuICAqLworICAgICAgYXhfY29uc3RfbCAoYXgsIFNZTUJPTF9WQUxVRV9BRERSRVNTICh2YXIpKTsKKyAgICAgIHZhbHVlLT5raW5kID0gYXhzX2x2YWx1ZV9tZW1vcnk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTE9DX0FSRzoJCS8qIHZhciBsaXZlcyBpbiBhcmd1bWVudCBhcmVhIG9mIGZyYW1lICovCisgICAgICBnZW5fZnJhbWVfYXJnc19hZGRyZXNzIChheCk7CisgICAgICBnZW5fc3ltX29mZnNldCAoYXgsIHZhcik7CisgICAgICB2YWx1ZS0+a2luZCA9IGF4c19sdmFsdWVfbWVtb3J5OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExPQ19SRUZfQVJHOgkJLyogQXMgYWJvdmUsIGJ1dCB0aGUgZnJhbWUgc2xvdCByZWFsbHkKKwkJCQkgICBob2xkcyB0aGUgYWRkcmVzcyBvZiB0aGUgdmFyaWFibGUuICAqLworICAgICAgZ2VuX2ZyYW1lX2FyZ3NfYWRkcmVzcyAoYXgpOworICAgICAgZ2VuX3N5bV9vZmZzZXQgKGF4LCB2YXIpOworICAgICAgLyogRG9uJ3QgYXNzdW1lIGFueSBwYXJ0aWN1bGFyIHBvaW50ZXIgc2l6ZS4gICovCisgICAgICBnZW5fZmV0Y2ggKGF4LCBsb29rdXBfcG9pbnRlcl90eXBlIChidWlsdGluX3R5cGVfdm9pZCkpOworICAgICAgdmFsdWUtPmtpbmQgPSBheHNfbHZhbHVlX21lbW9yeTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMT0NfTE9DQUw6CQkvKiB2YXIgbGl2ZXMgaW4gbG9jYWxzIGFyZWEgb2YgZnJhbWUgKi8KKyAgICBjYXNlIExPQ19MT0NBTF9BUkc6CisgICAgICBnZW5fZnJhbWVfbG9jYWxzX2FkZHJlc3MgKGF4KTsKKyAgICAgIGdlbl9zeW1fb2Zmc2V0IChheCwgdmFyKTsKKyAgICAgIHZhbHVlLT5raW5kID0gYXhzX2x2YWx1ZV9tZW1vcnk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTE9DX0JBU0VSRUc6CQkvKiByZWxhdGl2ZSB0byBzb21lIGJhc2UgcmVnaXN0ZXIgKi8KKyAgICBjYXNlIExPQ19CQVNFUkVHX0FSRzoKKyAgICAgIGF4X3JlZyAoYXgsIFNZTUJPTF9CQVNFUkVHICh2YXIpKTsKKyAgICAgIGdlbl9zeW1fb2Zmc2V0IChheCwgdmFyKTsKKyAgICAgIHZhbHVlLT5raW5kID0gYXhzX2x2YWx1ZV9tZW1vcnk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTE9DX1RZUEVERUY6CisgICAgICBlcnJvciAoIkNhbm5vdCBjb21wdXRlIHZhbHVlIG9mIHR5cGVkZWYgYCVzJy4iLAorCSAgICAgU1lNQk9MX1NPVVJDRV9OQU1FICh2YXIpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMT0NfQkxPQ0s6CisgICAgICBheF9jb25zdF9sIChheCwgQkxPQ0tfU1RBUlQgKFNZTUJPTF9CTE9DS19WQUxVRSAodmFyKSkpOworICAgICAgdmFsdWUtPmtpbmQgPSBheHNfcnZhbHVlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExPQ19SRUdJU1RFUjoKKyAgICBjYXNlIExPQ19SRUdQQVJNOgorICAgICAgLyogRG9uJ3QgZ2VuZXJhdGUgYW55IGNvZGUgYXQgYWxsOyBpbiB0aGUgcHJvY2VzcyBvZiB0cmVhdGluZworICAgICAgICAgdGhpcyBhcyBhbiBsdmFsdWUgb3IgcnZhbHVlLCB0aGUgY2FsbGVyIHdpbGwgZ2VuZXJhdGUgdGhlCisgICAgICAgICByaWdodCBjb2RlLiAgKi8KKyAgICAgIHZhbHVlLT5raW5kID0gYXhzX2x2YWx1ZV9yZWdpc3RlcjsKKyAgICAgIHZhbHVlLT51LnJlZyA9IFNZTUJPTF9WQUxVRSAodmFyKTsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBBIGxvdCBsaWtlIExPQ19SRUZfQVJHLCBidXQgdGhlIHBvaW50ZXIgbGl2ZXMgZGlyZWN0bHkgaW4gYQorCSByZWdpc3Rlciwgbm90IG9uIHRoZSBzdGFjay4gIFNpbXBsZXIgdGhhbiBMT0NfUkVHSVNURVIgYW5kCisJIExPQ19SRUdQQVJNLCBiZWNhdXNlIGl0J3MganVzdCBsaWtlIGFueSBvdGhlciBjYXNlIHdoZXJlIHRoZQorCSB0aGluZyBoYXMgYSByZWFsIGFkZHJlc3MuICAqLworICAgIGNhc2UgTE9DX1JFR1BBUk1fQUREUjoKKyAgICAgIGF4X3JlZyAoYXgsIFNZTUJPTF9WQUxVRSAodmFyKSk7CisgICAgICB2YWx1ZS0+a2luZCA9IGF4c19sdmFsdWVfbWVtb3J5OworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExPQ19VTlJFU09MVkVEOgorICAgICAgeworCXN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bSAKKwkgID0gbG9va3VwX21pbmltYWxfc3ltYm9sIChTWU1CT0xfTkFNRSAodmFyKSwgTlVMTCwgTlVMTCk7CisJaWYgKCEgbXN5bSkKKwkgIGVycm9yICgiQ291bGRuJ3QgcmVzb2x2ZSBzeW1ib2wgYCVzJy4iLCBTWU1CT0xfU09VUkNFX05BTUUgKHZhcikpOworCQorCS8qIFB1c2ggdGhlIGFkZHJlc3Mgb2YgdGhlIHZhcmlhYmxlLiAgKi8KKwlheF9jb25zdF9sIChheCwgU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW0pKTsKKwl2YWx1ZS0+a2luZCA9IGF4c19sdmFsdWVfbWVtb3J5OworICAgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSBMT0NfT1BUSU1JWkVEX09VVDoKKyAgICAgIGVycm9yICgiVGhlIHZhcmlhYmxlIGAlcycgaGFzIGJlZW4gb3B0aW1pemVkIG91dC4iLAorCSAgICAgU1lNQk9MX1NPVVJDRV9OQU1FICh2YXIpKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yICgiQ2Fubm90IGZpbmQgdmFsdWUgb2YgYm90Y2hlZCBzeW1ib2wgYCVzJy4iLAorCSAgICAgU1lNQk9MX1NPVVJDRV9OQU1FICh2YXIpKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworCisMCisvKiBHZW5lcmF0aW5nIGJ5dGVjb2RlIGZyb20gR0RCIGV4cHJlc3Npb25zOiBsaXRlcmFscyAqLworCitzdGF0aWMgdm9pZAorZ2VuX2ludF9saXRlcmFsIChheCwgdmFsdWUsIGssIHR5cGUpCisgICAgIHN0cnVjdCBhZ2VudF9leHByICpheDsKKyAgICAgc3RydWN0IGF4c192YWx1ZSAqdmFsdWU7CisgICAgIExPTkdFU1QgazsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIGF4X2NvbnN0X2wgKGF4LCBrKTsKKyAgdmFsdWUtPmtpbmQgPSBheHNfcnZhbHVlOworICB2YWx1ZS0+dHlwZSA9IHR5cGU7Cit9CisKKworDAorLyogR2VuZXJhdGluZyBieXRlY29kZSBmcm9tIEdEQiBleHByZXNzaW9uczogdW5hcnkgY29udmVyc2lvbnMsIGNhc3RzICovCisKKy8qIFRha2Ugd2hhdCdzIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrIChhcyBkZXNjcmliZWQgYnkgVkFMVUUpLCBhbmQKKyAgIHRyeSB0byBtYWtlIGFuIHJ2YWx1ZSBvdXQgb2YgaXQuICBTaWduYWwgYW4gZXJyb3IgaWYgd2UgY2FuJ3QgZG8KKyAgIHRoYXQuICAqLworc3RhdGljIHZvaWQKK3JlcXVpcmVfcnZhbHVlIChheCwgdmFsdWUpCisgICAgIHN0cnVjdCBhZ2VudF9leHByICpheDsKKyAgICAgc3RydWN0IGF4c192YWx1ZSAqdmFsdWU7Cit7CisgIHN3aXRjaCAodmFsdWUtPmtpbmQpCisgICAgeworICAgIGNhc2UgYXhzX3J2YWx1ZToKKyAgICAgIC8qIEl0J3MgYWxyZWFkeSBhbiBydmFsdWUuICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGF4c19sdmFsdWVfbWVtb3J5OgorICAgICAgLyogVGhlIHRvcCBvZiBzdGFjayBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0LiAgRGVyZWZlcmVuY2UuICAqLworICAgICAgZ2VuX2ZldGNoIChheCwgdmFsdWUtPnR5cGUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGF4c19sdmFsdWVfcmVnaXN0ZXI6CisgICAgICAvKiBUaGVyZSdzIG5vdGhpbmcgb24gdGhlIHN0YWNrLCBidXQgdmFsdWUtPnUucmVnIGlzIHRoZQorICAgICAgICAgcmVnaXN0ZXIgbnVtYmVyIGNvbnRhaW5pbmcgdGhlIHZhbHVlLgorCisJIFdoZW4gd2UgYWRkIGZsb2F0aW5nLXBvaW50IHN1cHBvcnQsIHRoaXMgaXMgZ29pbmcgdG8gaGF2ZSB0bworCSBjaGFuZ2UuICBXaGF0IGFib3V0IFNQQVJDIHJlZ2lzdGVyIHBhaXJzLCBmb3IgZXhhbXBsZT8gICovCisgICAgICBheF9yZWcgKGF4LCB2YWx1ZS0+dS5yZWcpOworICAgICAgZ2VuX2V4dGVuZCAoYXgsIHZhbHVlLT50eXBlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICB2YWx1ZS0+a2luZCA9IGF4c19ydmFsdWU7Cit9CisKKworLyogQXNzdW1lIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGlzIGRlc2NyaWJlZCBieSBWQUxVRSwgYW5kIHBlcmZvcm0gdGhlCisgICB1c3VhbCB1bmFyeSBjb252ZXJzaW9ucy4gIFRoaXMgaXMgbW90aXZhdGVkIGJ5IEFOU0kgNi4yLjIsIGJ1dCBvZgorICAgY291cnNlIEdEQiBleHByZXNzaW9ucyBhcmUgbm90IEFOU0k7IHRoZXkncmUgdGhlIG1pc2htYXNoIHVuaW9uIG9mCisgICBhIGJ1bmNoIG9mIGxhbmd1YWdlcy4gIFJhaC4KKworICAgTk9URSEgIFRoaXMgZnVuY3Rpb24gcHJvbWlzZXMgdG8gcHJvZHVjZSBhbiBydmFsdWUgb25seSB3aGVuIHRoZQorICAgaW5jb21pbmcgdmFsdWUgaXMgb2YgYW4gYXBwcm9wcmlhdGUgdHlwZS4gIEluIG90aGVyIHdvcmRzLCB0aGUKKyAgIGNvbnN1bWVyIG9mIHRoZSB2YWx1ZSB0aGlzIGZ1bmN0aW9uIHByb2R1Y2VzIG1heSBhc3N1bWUgdGhlIHZhbHVlCisgICBpcyBhbiBydmFsdWUgb25seSBhZnRlciBjaGVja2luZyBpdHMgdHlwZS4KKworICAgVGhlIGltbWVkaWF0ZSBpc3N1ZSBpcyB0aGF0IGlmIHRoZSB1c2VyIHRyaWVzIHRvIHVzZSBhIHN0cnVjdHVyZSBvcgorICAgdW5pb24gYXMgYW4gb3BlcmFuZCBvZiwgc2F5LCB0aGUgYCsnIG9wZXJhdG9yLCB3ZSBkb24ndCB3YW50IHRvIHRyeQorICAgdG8gY29udmVydCB0aGF0IHN0cnVjdHVyZSB0byBhbiBydmFsdWU7IHJlcXVpcmVfcnZhbHVlIHdpbGwgYm9tYiBvbgorICAgc3RydWN0cyBhbmQgdW5pb25zLiAgUmF0aGVyLCB3ZSB3YW50IHRvIHNpbXBseSBwYXNzIHRoZSBzdHJ1Y3QKKyAgIGx2YWx1ZSB0aHJvdWdoIHVuY2hhbmdlZCwgYW5kIGxldCBgKycgcmFpc2UgYW4gZXJyb3IuICAqLworCitzdGF0aWMgdm9pZAorZ2VuX3VzdWFsX3VuYXJ5IChheCwgdmFsdWUpCisgICAgIHN0cnVjdCBhZ2VudF9leHByICpheDsKKyAgICAgc3RydWN0IGF4c192YWx1ZSAqdmFsdWU7Cit7CisgIC8qIFdlIGRvbid0IGhhdmUgdG8gZ2VuZXJhdGUgYW55IGNvZGUgZm9yIHRoZSB1c3VhbCBpbnRlZ3JhbAorICAgICBjb252ZXJzaW9ucywgc2luY2UgdmFsdWVzIGFyZSBhbHdheXMgcmVwcmVzZW50ZWQgYXMgZnVsbC13aWR0aCBvbgorICAgICB0aGUgc3RhY2suICBTaG91bGQgd2UgdHdlYWsgdGhlIHR5cGU/ICAqLworCisgIC8qIFNvbWUgdHlwZXMgcmVxdWlyZSBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KKyAgc3dpdGNoICh2YWx1ZS0+dHlwZS0+Y29kZSkKKyAgICB7CisgICAgICAvKiBGdW5jdGlvbnMgZ2V0IGNvbnZlcnRlZCB0byBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uLiAgKi8KKyAgICBjYXNlIFRZUEVfQ09ERV9GVU5DOgorICAgICAgdmFsdWUtPnR5cGUgPSBsb29rdXBfcG9pbnRlcl90eXBlICh2YWx1ZS0+dHlwZSk7CisgICAgICB2YWx1ZS0+a2luZCA9IGF4c19ydmFsdWU7CS8qIFNob3VsZCBhbHdheXMgYmUgdHJ1ZSwgYnV0IGp1c3QgaW4gY2FzZS4gICovCisgICAgICBicmVhazsKKworICAgICAgLyogQXJyYXlzIGdldCBjb252ZXJ0ZWQgdG8gYSBwb2ludGVyIHRvIHRoZWlyIGZpcnN0IGVsZW1lbnQsIGFuZAorCSBhcmUgbm8gbG9uZ2VyIGFuIGx2YWx1ZS4gICovCisgICAgY2FzZSBUWVBFX0NPREVfQVJSQVk6CisgICAgICB7CisJc3RydWN0IHR5cGUgKmVsZW1lbnRzID0gVFlQRV9UQVJHRVRfVFlQRSAodmFsdWUtPnR5cGUpOworCXZhbHVlLT50eXBlID0gbG9va3VwX3BvaW50ZXJfdHlwZSAoZWxlbWVudHMpOworCXZhbHVlLT5raW5kID0gYXhzX3J2YWx1ZTsKKwkvKiBXZSBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIGFueSBjb2RlOyB0aGUgYWRkcmVzcyBvZiB0aGUgYXJyYXkKKwkgICBpcyBhbHNvIHRoZSBhZGRyZXNzIG9mIGl0cyBmaXJzdCBlbGVtZW50LiAgKi8KKyAgICAgIH0KKyAgICBicmVhazsKKworICAgIC8qIERvbid0IHRyeSB0byBjb252ZXJ0IHN0cnVjdHVyZXMgYW5kIHVuaW9ucyB0byBydmFsdWVzLiAgTGV0IHRoZQorICAgICAgIGNvbnN1bWVyIHNpZ25hbCBhbiBlcnJvci4gICovCisgICAgY2FzZSBUWVBFX0NPREVfU1RSVUNUOgorICAgIGNhc2UgVFlQRV9DT0RFX1VOSU9OOgorICAgICAgcmV0dXJuOworCisgICAgICAvKiBJZiB0aGUgdmFsdWUgaXMgYW4gZW51bSwgY2FsbCBpdCBhbiBpbnRlZ2VyLiAgKi8KKyAgICBjYXNlIFRZUEVfQ09ERV9FTlVNOgorICAgICAgdmFsdWUtPnR5cGUgPSBidWlsdGluX3R5cGVfaW50OworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIElmIHRoZSB2YWx1ZSBpcyBhbiBsdmFsdWUsIGRlcmVmZXJlbmNlIGl0LiAgKi8KKyAgcmVxdWlyZV9ydmFsdWUgKGF4LCB2YWx1ZSk7Cit9CisKKworLyogUmV0dXJuIG5vbi16ZXJvIGlmZiB0aGUgdHlwZSBUWVBFMSBpcyBjb25zaWRlcmVkICJ3aWRlciIgdGhhbiB0aGUKKyAgIHR5cGUgVFlQRTIsIGFjY29yZGluZyB0byB0aGUgcnVsZXMgZGVzY3JpYmVkIGluIGdlbl91c3VhbF9hcml0aG1ldGljLiAgKi8KK3N0YXRpYyBpbnQKK3R5cGVfd2lkZXJfdGhhbiAodHlwZTEsIHR5cGUyKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTEsICp0eXBlMjsKK3sKKyAgcmV0dXJuIChUWVBFX0xFTkdUSCAodHlwZTEpID4gVFlQRV9MRU5HVEggKHR5cGUyKQorCSAgfHwgKFRZUEVfTEVOR1RIICh0eXBlMSkgPT0gVFlQRV9MRU5HVEggKHR5cGUyKQorCSAgICAgICYmIFRZUEVfVU5TSUdORUQgKHR5cGUxKQorCSAgICAgICYmICEgVFlQRV9VTlNJR05FRCAodHlwZTIpKSk7Cit9CisKKworLyogUmV0dXJuIHRoZSAid2lkZXIiIG9mIHRoZSB0d28gdHlwZXMgVFlQRTEgYW5kIFRZUEUyLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCittYXhfdHlwZSAodHlwZTEsIHR5cGUyKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTEsICp0eXBlMjsKK3sKKyAgcmV0dXJuIHR5cGVfd2lkZXJfdGhhbiAodHlwZTEsIHR5cGUyKSA/IHR5cGUxIDogdHlwZTI7Cit9CisKKworLyogR2VuZXJhdGUgY29kZSB0byBjb252ZXJ0IGEgc2NhbGFyIHZhbHVlIG9mIHR5cGUgRlJPTSB0byB0eXBlIFRPLiAgKi8KK3N0YXRpYyB2b2lkCitnZW5fY29udmVyc2lvbiAoYXgsIGZyb20sIHRvKQorICAgICBzdHJ1Y3QgYWdlbnRfZXhwciAqYXg7CisgICAgIHN0cnVjdCB0eXBlICpmcm9tLCAqdG87Cit7CisgIC8qIFBlcmhhcHMgdGhlcmUgaXMgYSBtb3JlIGdyYWNlZnVsIHdheSB0byBzdGF0ZSB0aGVzZSBydWxlcy4gICovCisKKyAgLyogSWYgd2UncmUgY29udmVydGluZyB0byBhIG5hcnJvd2VyIHR5cGUsIHRoZW4gd2UgbmVlZCB0byBjbGVhciBvdXQKKyAgICAgdGhlIHVwcGVyIGJpdHMuICAqLworICBpZiAoVFlQRV9MRU5HVEggKHRvKSA8IFRZUEVfTEVOR1RIIChmcm9tKSkKKyAgICBnZW5fZXh0ZW5kIChheCwgZnJvbSk7CisKKyAgLyogSWYgdGhlIHR3byB2YWx1ZXMgaGF2ZSBlcXVhbCB3aWR0aCwgYnV0IGRpZmZlcmVudCBzaWduZWRuZXNzZXMsCisgICAgIHRoZW4gd2UgbmVlZCB0byBleHRlbmQuICAqLworICBlbHNlIGlmIChUWVBFX0xFTkdUSCAodG8pID09IFRZUEVfTEVOR1RIIChmcm9tKSkKKyAgICB7CisgICAgICBpZiAoVFlQRV9VTlNJR05FRCAoZnJvbSkgIT0gVFlQRV9VTlNJR05FRCAodG8pKQorCWdlbl9leHRlbmQgKGF4LCB0byk7CisgICAgfQorCisgIC8qIElmIHdlJ3JlIGNvbnZlcnRpbmcgdG8gYSB3aWRlciB0eXBlLCBhbmQgYmVjb21pbmcgdW5zaWduZWQsIHRoZW4KKyAgICAgd2UgbmVlZCB0byB6ZXJvIG91dCBhbnkgcG9zc2libGUgc2lnbiBiaXRzLiAgKi8KKyAgZWxzZSBpZiAoVFlQRV9MRU5HVEggKHRvKSA+IFRZUEVfTEVOR1RIIChmcm9tKSkKKyAgICB7CisgICAgICBpZiAoVFlQRV9VTlNJR05FRCAodG8pKQorCWdlbl9leHRlbmQgKGF4LCB0byk7CisgICAgfQorfQorCisKKy8qIFJldHVybiBub24temVybyBpZmYgdGhlIHR5cGUgRlJPTSB3aWxsIHJlcXVpcmUgYW55IGJ5dGVjb2RlcyB0byBiZQorICAgZW1pdHRlZCB0byBiZSBjb252ZXJ0ZWQgdG8gdGhlIHR5cGUgVE8uICAqLworc3RhdGljIGludAoraXNfbm9udHJpdmlhbF9jb252ZXJzaW9uIChmcm9tLCB0bykKKyAgICAgc3RydWN0IHR5cGUgKmZyb20sICp0bzsKK3sKKyAgc3RydWN0IGFnZW50X2V4cHIgKmF4ID0gbmV3X2FnZW50X2V4cHIgKDApOworICBpbnQgbm9udHJpdmlhbDsKKworICAvKiBBY3R1YWxseSBnZW5lcmF0ZSB0aGUgY29kZSwgYW5kIHNlZSBpZiBhbnl0aGluZyBjYW1lIG91dC4gIEF0IHRoZQorICAgICBtb21lbnQsIGl0IHdvdWxkIGJlIHRyaXZpYWwgdG8gcmVwbGljYXRlIHRoZSBjb2RlIGluCisgICAgIGdlbl9jb252ZXJzaW9uIGhlcmUsIGJ1dCBpbiB0aGUgZnV0dXJlLCB3aGVuIHdlJ3JlIHN1cHBvcnRpbmcKKyAgICAgZmxvYXRpbmcgcG9pbnQgYW5kIHRoZSBsaWtlLCBpdCBtYXkgbm90IGJlLiAgRG9pbmcgdGhpbmdzIHRoaXMKKyAgICAgd2F5IGFsbG93cyB0aGlzIGZ1bmN0aW9uIHRvIGJlIGluZGVwZW5kZW50IG9mIHRoZSBsb2dpYyBpbgorICAgICBnZW5fY29udmVyc2lvbi4gICovCisgIGdlbl9jb252ZXJzaW9uIChheCwgZnJvbSwgdG8pOworICBub250cml2aWFsID0gYXgtPmxlbiA+IDA7CisgIGZyZWVfYWdlbnRfZXhwciAoYXgpOworICByZXR1cm4gbm9udHJpdmlhbDsKK30KKworCisvKiBHZW5lcmF0ZSBjb2RlIHRvIHBlcmZvcm0gdGhlICJ1c3VhbCBhcml0aG1ldGljIGNvbnZlcnNpb25zIiAoQU5TSSBDCisgICA2LjIuMS41KSBmb3IgdGhlIHR3byBvcGVyYW5kcyBvZiBhbiBhcml0aG1ldGljIG9wZXJhdG9yLiAgVGhpcworICAgZWZmZWN0aXZlbHkgZmluZHMgYSAibGVhc3QgdXBwZXIgYm91bmQiIHR5cGUgZm9yIHRoZSB0d28gYXJndW1lbnRzLAorICAgYW5kIHByb21vdGVzIGVhY2ggYXJndW1lbnQgdG8gdGhhdCB0eXBlLiAgKlZBTFVFMSBhbmQgKlZBTFVFMgorICAgZGVzY3JpYmUgdGhlIHZhbHVlcyBhcyB0aGV5IGFyZSBwYXNzZWQgaW4sIGFuZCBhcyB0aGV5IGFyZSBsZWZ0LiAgKi8KK3N0YXRpYyB2b2lkCitnZW5fdXN1YWxfYXJpdGhtZXRpYyAoYXgsIHZhbHVlMSwgdmFsdWUyKQorICAgICBzdHJ1Y3QgYWdlbnRfZXhwciAqYXg7CisgICAgIHN0cnVjdCBheHNfdmFsdWUgKnZhbHVlMSwgKnZhbHVlMjsKK3sKKyAgLyogRG8gdGhlIHVzdWFsIGJpbmFyeSBjb252ZXJzaW9ucy4gICovCisgIGlmIChUWVBFX0NPREUgKHZhbHVlMS0+dHlwZSkgPT0gVFlQRV9DT0RFX0lOVAorICAgICAgJiYgVFlQRV9DT0RFICh2YWx1ZTItPnR5cGUpID09IFRZUEVfQ09ERV9JTlQpCisgICAgeworICAgICAgLyogVGhlIEFOU0kgaW50ZWdyYWwgcHJvbW90aW9ucyBzZWVtIHRvIHdvcmsgdGhpcyB3YXk6IE9yZGVyIHRoZQorCSBpbnRlZ2VyIHR5cGVzIGJ5IHNpemUsIGFuZCB0aGVuIGJ5IHNpZ25lZG5lc3M6IGFuIG4tYml0CisJIHVuc2lnbmVkIHR5cGUgaXMgY29uc2lkZXJlZCAid2lkZXIiIHRoYW4gYW4gbi1iaXQgc2lnbmVkCisJIHR5cGUuICBQcm9tb3RlIHRvIHRoZSAid2lkZXIiIG9mIHRoZSB0d28gdHlwZXMsIGFuZCBhbHdheXMKKwkgcHJvbW90ZSBhdCBsZWFzdCB0byBpbnQuICAqLworICAgICAgc3RydWN0IHR5cGUgKnRhcmdldCA9IG1heF90eXBlIChidWlsdGluX3R5cGVfaW50LAorCQkJCSAgICAgIG1heF90eXBlICh2YWx1ZTEtPnR5cGUsIHZhbHVlMi0+dHlwZSkpOworCisgICAgICAvKiBEZWFsIHdpdGggdmFsdWUyLCBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4gICovCisgICAgICBnZW5fY29udmVyc2lvbiAoYXgsIHZhbHVlMi0+dHlwZSwgdGFyZ2V0KTsKKworICAgICAgLyogRGVhbCB3aXRoIHZhbHVlMSwgbm90IG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgRG9uJ3QKKyAgICAgICAgIGdlbmVyYXRlIHRoZSBgc3dhcCcgaW5zdHJ1Y3Rpb25zIGlmIHdlJ3JlIG5vdCBhY3R1YWxseSBnb2luZworICAgICAgICAgdG8gZG8gYW55dGhpbmcuICAqLworICAgICAgaWYgKGlzX25vbnRyaXZpYWxfY29udmVyc2lvbiAodmFsdWUxLT50eXBlLCB0YXJnZXQpKQorCXsKKwkgIGF4X3NpbXBsZSAoYXgsIGFvcF9zd2FwKTsKKwkgIGdlbl9jb252ZXJzaW9uIChheCwgdmFsdWUxLT50eXBlLCB0YXJnZXQpOworCSAgYXhfc2ltcGxlIChheCwgYW9wX3N3YXApOworCX0KKworICAgICAgdmFsdWUxLT50eXBlID0gdmFsdWUyLT50eXBlID0gdGFyZ2V0OworICAgIH0KK30KKworCisvKiBHZW5lcmF0ZSBjb2RlIHRvIHBlcmZvcm0gdGhlIGludGVncmFsIHByb21vdGlvbnMgKEFOU0kgNi4yLjEuMSkgb24KKyAgIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjaywgYXMgZGVzY3JpYmVkIGJ5IFZBTFVFLiAgQXNzdW1lCisgICB0aGUgdmFsdWUgaGFzIGludGVncmFsIHR5cGUuICAqLworc3RhdGljIHZvaWQKK2dlbl9pbnRlZ3JhbF9wcm9tb3Rpb25zIChheCwgdmFsdWUpCisgICAgIHN0cnVjdCBhZ2VudF9leHByICpheDsKKyAgICAgc3RydWN0IGF4c192YWx1ZSAqdmFsdWU7Cit7CisgIGlmICghIHR5cGVfd2lkZXJfdGhhbiAodmFsdWUtPnR5cGUsIGJ1aWx0aW5fdHlwZV9pbnQpKQorICAgIHsKKyAgICAgIGdlbl9jb252ZXJzaW9uIChheCwgdmFsdWUtPnR5cGUsIGJ1aWx0aW5fdHlwZV9pbnQpOworICAgICAgdmFsdWUtPnR5cGUgPSBidWlsdGluX3R5cGVfaW50OworICAgIH0KKyAgZWxzZSBpZiAoISB0eXBlX3dpZGVyX3RoYW4gKHZhbHVlLT50eXBlLCBidWlsdGluX3R5cGVfdW5zaWduZWRfaW50KSkKKyAgICB7CisgICAgICBnZW5fY29udmVyc2lvbiAoYXgsIHZhbHVlLT50eXBlLCBidWlsdGluX3R5cGVfdW5zaWduZWRfaW50KTsKKyAgICAgIHZhbHVlLT50eXBlID0gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2ludDsKKyAgICB9Cit9CisKKworLyogR2VuZXJhdGUgY29kZSBmb3IgYSBjYXN0IHRvIFRZUEUuICAqLworc3RhdGljIHZvaWQKK2dlbl9jYXN0IChheCwgdmFsdWUsIHR5cGUpCisgICAgIHN0cnVjdCBhZ2VudF9leHByICpheDsKKyAgICAgc3RydWN0IGF4c192YWx1ZSAqdmFsdWU7CisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworeworICAvKiBHQ0MgZG9lcyBhbGxvdyBjYXN0cyB0byB5aWVsZCBsdmFsdWVzLCBzbyB0aGlzIHNob3VsZCBiZSBmaXhlZAorICAgICBiZWZvcmUgbWVyZ2luZyB0aGVzZSBjaGFuZ2VzIGludG8gdGhlIHRydW5rLiAgKi8KKyAgcmVxdWlyZV9ydmFsdWUgKGF4LCB2YWx1ZSk7CisgIC8qIERlcmVmZXJlbmNlIHR5cGVkZWZzLiAqLworICB0eXBlID0gY2hlY2tfdHlwZWRlZiAodHlwZSk7CisKKyAgc3dpdGNoICh0eXBlLT5jb2RlKQorICAgIHsKKyAgICBjYXNlIFRZUEVfQ09ERV9QVFI6CisgICAgICAvKiBJdCdzIGltcGxlbWVudGF0aW9uLWRlZmluZWQsIGFuZCBJJ2xsIGJldCB0aGlzIGlzIHdoYXQgR0NDCisgICAgICAgICBkb2VzLiAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfQVJSQVk6CisgICAgY2FzZSBUWVBFX0NPREVfU1RSVUNUOgorICAgIGNhc2UgVFlQRV9DT0RFX1VOSU9OOgorICAgIGNhc2UgVFlQRV9DT0RFX0ZVTkM6CisgICAgICBlcnJvciAoIklsbGVnYWwgdHlwZSBjYXN0OiBpbnRlbmRlZCB0eXBlIG11c3QgYmUgc2NhbGFyLiIpOworCisgICAgY2FzZSBUWVBFX0NPREVfRU5VTToKKyAgICAgIC8qIFdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIHNpemUgb2YgdGhlIHZhbHVlLCBiZWNhdXNlCisgICAgICAgICBhbGwgb3VyIGludGVncmFsIHZhbHVlcyBhcmUgZnVsbHkgc2lnbi1leHRlbmRlZCwgYW5kIHdoZW4KKyAgICAgICAgIGNhc3RpbmcgcG9pbnRlcnMgd2UgY2FuIGRvIGFueXRoaW5nIHdlIGxpa2UuICBJcyB0aGVyZSBhbnkKKyAgICAgICAgIHdheSBmb3IgdXMgdG8gYWN0dWFsbHkga25vdyB3aGF0IEdDQyBhY3R1YWxseSBkb2VzIHdpdGggYQorICAgICAgICAgY2FzdCBsaWtlIHRoaXM/ICAqLworICAgICAgdmFsdWUtPnR5cGUgPSB0eXBlOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIFRZUEVfQ09ERV9JTlQ6CisgICAgICBnZW5fY29udmVyc2lvbiAoYXgsIHZhbHVlLT50eXBlLCB0eXBlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfVk9JRDoKKyAgICAgIC8qIFdlIGNvdWxkIHBvcCB0aGUgdmFsdWUsIGFuZCByZWx5IG9uIGV2ZXJ5b25lIGVsc2UgdG8gY2hlY2sKKwkgdGhlIHR5cGUgYW5kIG5vdGljZSB0aGF0IHRoaXMgdmFsdWUgZG9lc24ndCBvY2N1cHkgYSBzdGFjaworCSBzbG90LiAgQnV0IGZvciBub3csIGxlYXZlIHRoZSB2YWx1ZSBvbiB0aGUgc3RhY2ssIGFuZAorCSBwcmVzZXJ2ZSB0aGUgInZhbHVlID09IHN0YWNrIGVsZW1lbnQiIGFzc3VtcHRpb24uICAqLworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IgKCJDYXN0cyB0byByZXF1ZXN0ZWQgdHlwZSBhcmUgbm90IHlldCBpbXBsZW1lbnRlZC4iKTsKKyAgICB9CisKKyAgdmFsdWUtPnR5cGUgPSB0eXBlOworfQorCisKKwwKKy8qIEdlbmVyYXRpbmcgYnl0ZWNvZGUgZnJvbSBHREIgZXhwcmVzc2lvbnM6IGFyaXRobWV0aWMgKi8KKworLyogU2NhbGUgdGhlIGludGVnZXIgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sgYnkgdGhlIHNpemUgb2YgdGhlIHRhcmdldAorICAgb2YgdGhlIHBvaW50ZXIgdHlwZSBUWVBFLiAgKi8KK3N0YXRpYyB2b2lkCitnZW5fc2NhbGUgKGF4LCBvcCwgdHlwZSkKKyAgICAgc3RydWN0IGFnZW50X2V4cHIgKmF4OworICAgICBlbnVtIGFnZW50X29wIG9wOworICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgc3RydWN0IHR5cGUgKmVsZW1lbnQgPSBUWVBFX1RBUkdFVF9UWVBFICh0eXBlKTsKKworICBpZiAoZWxlbWVudC0+bGVuZ3RoICE9IDEpCisgICAgeworICAgICAgYXhfY29uc3RfbCAoYXgsIGVsZW1lbnQtPmxlbmd0aCk7CisgICAgICBheF9zaW1wbGUgKGF4LCBvcCk7CisgICAgfQorfQorCisKKy8qIEdlbmVyYXRlIGNvZGUgZm9yIGFuIGFkZGl0aW9uOyBub24tdHJpdmlhbCBiZWNhdXNlIHdlIGRlYWwgd2l0aAorICAgcG9pbnRlciBhcml0aG1ldGljLiAgV2Ugc2V0IFZBTFVFIHRvIGRlc2NyaWJlIHRoZSByZXN1bHQgdmFsdWU7IHdlCisgICBhc3N1bWUgVkFMVUUxIGFuZCBWQUxVRTIgZGVzY3JpYmUgdGhlIHR3byBvcGVyYW5kcywgYW5kIHRoYXQKKyAgIHRoZXkndmUgdW5kZXJnb25lIHRoZSB1c3VhbCBiaW5hcnkgY29udmVyc2lvbnMuICBVc2VkIGJ5IGJvdGgKKyAgIEJJTk9QX0FERCBhbmQgQklOT1BfU1VCU0NSSVBULiAgTkFNRSBpcyB1c2VkIGluIGVycm9yIG1lc3NhZ2VzLiAgKi8KK3N0YXRpYyB2b2lkCitnZW5fYWRkIChheCwgdmFsdWUsIHZhbHVlMSwgdmFsdWUyLCBuYW1lKQorICAgICBzdHJ1Y3QgYWdlbnRfZXhwciAqYXg7CisgICAgIHN0cnVjdCBheHNfdmFsdWUgKnZhbHVlLCAqdmFsdWUxLCAqdmFsdWUyOworICAgICBjaGFyICpuYW1lOworeworICAvKiBJcyBpdCBJTlQrUFRSPyAgKi8KKyAgaWYgKHZhbHVlMS0+dHlwZS0+Y29kZSA9PSBUWVBFX0NPREVfSU5UCisgICAgICAmJiB2YWx1ZTItPnR5cGUtPmNvZGUgPT0gVFlQRV9DT0RFX1BUUikKKyAgICB7CisgICAgICAvKiBTd2FwIHRoZSB2YWx1ZXMgYW5kIHByb2NlZWQgbm9ybWFsbHkuICAqLworICAgICAgYXhfc2ltcGxlIChheCwgYW9wX3N3YXApOworICAgICAgZ2VuX3NjYWxlIChheCwgYW9wX211bCwgdmFsdWUyLT50eXBlKTsKKyAgICAgIGF4X3NpbXBsZSAoYXgsIGFvcF9hZGQpOworICAgICAgZ2VuX2V4dGVuZCAoYXgsIHZhbHVlMi0+dHlwZSk7IC8qIENhdGNoIG92ZXJmbG93LiAgKi8KKyAgICAgIHZhbHVlLT50eXBlID0gdmFsdWUyLT50eXBlOworICAgIH0KKworICAvKiBJcyBpdCBQVFIrSU5UPyAgKi8KKyAgZWxzZSBpZiAodmFsdWUxLT50eXBlLT5jb2RlID09IFRZUEVfQ09ERV9QVFIKKwkgICAmJiB2YWx1ZTItPnR5cGUtPmNvZGUgPT0gVFlQRV9DT0RFX0lOVCkKKyAgICB7CisgICAgICBnZW5fc2NhbGUgKGF4LCBhb3BfbXVsLCB2YWx1ZTEtPnR5cGUpOworICAgICAgYXhfc2ltcGxlIChheCwgYW9wX2FkZCk7CisgICAgICBnZW5fZXh0ZW5kIChheCwgdmFsdWUxLT50eXBlKTsgLyogQ2F0Y2ggb3ZlcmZsb3cuICAqLworICAgICAgdmFsdWUtPnR5cGUgPSB2YWx1ZTEtPnR5cGU7CisgICAgfQorCisgIC8qIE11c3QgYmUgbnVtYmVyICsgbnVtYmVyOyB0aGUgdXN1YWwgYmluYXJ5IGNvbnZlcnNpb25zIHdpbGwgaGF2ZQorICAgICBicm91Z2h0IHRoZW0gYm90aCB0byB0aGUgc2FtZSB3aWR0aC4gICovCisgIGVsc2UgaWYgKHZhbHVlMS0+dHlwZS0+Y29kZSA9PSBUWVBFX0NPREVfSU5UCisJICAgJiYgdmFsdWUyLT50eXBlLT5jb2RlID09IFRZUEVfQ09ERV9JTlQpCisgICAgeworICAgICAgYXhfc2ltcGxlIChheCwgYW9wX2FkZCk7CisgICAgICBnZW5fZXh0ZW5kIChheCwgdmFsdWUxLT50eXBlKTsgLyogQ2F0Y2ggb3ZlcmZsb3cuICAqLworICAgICAgdmFsdWUtPnR5cGUgPSB2YWx1ZTEtPnR5cGU7CisgICAgfQorCisgIGVsc2UKKyAgICBlcnJvciAoIklsbGVnYWwgY29tYmluYXRpb24gb2YgdHlwZXMgaW4gJXMuIiwgbmFtZSk7CisKKyAgdmFsdWUtPmtpbmQgPSBheHNfcnZhbHVlOworfQorCisKKy8qIEdlbmVyYXRlIGNvZGUgZm9yIGFuIGFkZGl0aW9uOyBub24tdHJpdmlhbCBiZWNhdXNlIHdlIGhhdmUgdG8gZGVhbAorICAgd2l0aCBwb2ludGVyIGFyaXRobWV0aWMuICBXZSBzZXQgVkFMVUUgdG8gZGVzY3JpYmUgdGhlIHJlc3VsdAorICAgdmFsdWU7IHdlIGFzc3VtZSBWQUxVRTEgYW5kIFZBTFVFMiBkZXNjcmliZSB0aGUgdHdvIG9wZXJhbmRzLCBhbmQKKyAgIHRoYXQgdGhleSd2ZSB1bmRlcmdvbmUgdGhlIHVzdWFsIGJpbmFyeSBjb252ZXJzaW9ucy4gICovCitzdGF0aWMgdm9pZAorZ2VuX3N1YiAoYXgsIHZhbHVlLCB2YWx1ZTEsIHZhbHVlMikKKyAgICAgc3RydWN0IGFnZW50X2V4cHIgKmF4OworICAgICBzdHJ1Y3QgYXhzX3ZhbHVlICp2YWx1ZSwgKnZhbHVlMSwgKnZhbHVlMjsKK3sKKyAgc3RydWN0IHR5cGUgKmVsZW1lbnQ7CisKKyAgaWYgKHZhbHVlMS0+dHlwZS0+Y29kZSA9PSBUWVBFX0NPREVfUFRSKQorICAgIHsKKyAgICAgIC8qIElzIGl0IFBUUiAtIElOVD8gICovCisgICAgICBpZiAodmFsdWUyLT50eXBlLT5jb2RlID09IFRZUEVfQ09ERV9JTlQpCisJeworCSAgZ2VuX3NjYWxlIChheCwgYW9wX211bCwgdmFsdWUxLT50eXBlKTsKKwkgIGF4X3NpbXBsZSAoYXgsIGFvcF9zdWIpOworCSAgZ2VuX2V4dGVuZCAoYXgsIHZhbHVlMS0+dHlwZSk7IC8qIENhdGNoIG92ZXJmbG93LiAgKi8KKwkgIHZhbHVlLT50eXBlID0gdmFsdWUxLT50eXBlOworCX0KKworICAgICAgLyogSXMgaXQgUFRSIC0gUFRSPyAgU3RyaWN0bHkgc3BlYWtpbmcsIHRoZSB0eXBlcyBvdWdodCB0bworCSBtYXRjaCwgYnV0IHRoaXMgaXMgd2hhdCB0aGUgbm9ybWFsIEdEQiBleHByZXNzaW9uIGV2YWx1YXRvcgorCSB0ZXN0cyBmb3IuICAqLworICAgICAgZWxzZSBpZiAodmFsdWUyLT50eXBlLT5jb2RlID09IFRZUEVfQ09ERV9QVFIKKwkgICAgICAgJiYgKFRZUEVfTEVOR1RIIChUWVBFX1RBUkdFVF9UWVBFICh2YWx1ZTEtPnR5cGUpKQorCQkgICA9PSBUWVBFX0xFTkdUSCAoVFlQRV9UQVJHRVRfVFlQRSAodmFsdWUyLT50eXBlKSkpKQorCXsKKwkgIGF4X3NpbXBsZSAoYXgsIGFvcF9zdWIpOworCSAgZ2VuX3NjYWxlIChheCwgYW9wX2Rpdl91bnNpZ25lZCwgdmFsdWUxLT50eXBlKTsKKwkgIHZhbHVlLT50eXBlID0gYnVpbHRpbl90eXBlX2xvbmc7IC8qIEZJWE1FIC0tLSBzaG91bGQgYmUgcHRyZGlmZl90ICovCisJfQorICAgICAgZWxzZQorCWVycm9yICgiXAorRmlyc3QgYXJndW1lbnQgb2YgYC0nIGlzIGEgcG9pbnRlciwgYnV0IHNlY29uZCBhcmd1bWVudCBpcyBuZWl0aGVyXG5cCithbiBpbnRlZ2VyIG5vciBhIHBvaW50ZXIgb2YgdGhlIHNhbWUgdHlwZS4iKTsKKyAgICB9CisKKyAgLyogTXVzdCBiZSBudW1iZXIgKyBudW1iZXIuICAqLworICBlbHNlIGlmICh2YWx1ZTEtPnR5cGUtPmNvZGUgPT0gVFlQRV9DT0RFX0lOVAorCSAgICYmIHZhbHVlMi0+dHlwZS0+Y29kZSA9PSBUWVBFX0NPREVfSU5UKQorICAgIHsKKyAgICAgIGF4X3NpbXBsZSAoYXgsIGFvcF9zdWIpOworICAgICAgZ2VuX2V4dGVuZCAoYXgsIHZhbHVlMS0+dHlwZSk7IC8qIENhdGNoIG92ZXJmbG93LiAgKi8KKyAgICAgIHZhbHVlLT50eXBlID0gdmFsdWUxLT50eXBlOworICAgIH0KKyAgCisgIGVsc2UKKyAgICBlcnJvciAoIklsbGVnYWwgY29tYmluYXRpb24gb2YgdHlwZXMgaW4gc3VidHJhY3Rpb24uIik7CisKKyAgdmFsdWUtPmtpbmQgPSBheHNfcnZhbHVlOworfQorCisvKiBHZW5lcmF0ZSBjb2RlIGZvciBhIGJpbmFyeSBvcGVyYXRvciB0aGF0IGRvZXNuJ3QgZG8gcG9pbnRlciBtYWdpYy4KKyAgIFdlIHNldCBWQUxVRSB0byBkZXNjcmliZSB0aGUgcmVzdWx0IHZhbHVlOyB3ZSBhc3N1bWUgVkFMVUUxIGFuZAorICAgVkFMVUUyIGRlc2NyaWJlIHRoZSB0d28gb3BlcmFuZHMsIGFuZCB0aGF0IHRoZXkndmUgdW5kZXJnb25lIHRoZQorICAgdXN1YWwgYmluYXJ5IGNvbnZlcnNpb25zLiAgTUFZX0NBUlJZIHNob3VsZCBiZSBub24temVybyBpZmYgdGhlCisgICByZXN1bHQgbmVlZHMgdG8gYmUgZXh0ZW5kZWQuICBOQU1FIGlzIHRoZSBFbmdsaXNoIG5hbWUgb2YgdGhlCisgICBvcGVyYXRvciwgdXNlZCBpbiBlcnJvciBtZXNzYWdlcyAqLworc3RhdGljIHZvaWQKK2dlbl9iaW5vcCAoYXgsIHZhbHVlLCB2YWx1ZTEsIHZhbHVlMiwgb3AsIG9wX3Vuc2lnbmVkLCBtYXlfY2FycnksIG5hbWUpCisgICAgIHN0cnVjdCBhZ2VudF9leHByICpheDsKKyAgICAgc3RydWN0IGF4c192YWx1ZSAqdmFsdWUsICp2YWx1ZTEsICp2YWx1ZTI7CisgICAgIGVudW0gYWdlbnRfb3Agb3AsIG9wX3Vuc2lnbmVkOworICAgICBpbnQgbWF5X2NhcnJ5OworICAgICBjaGFyICpuYW1lOworeworICAvKiBXZSBvbmx5IGhhbmRsZSBJTlQgb3AgSU5ULiAgKi8KKyAgaWYgKCh2YWx1ZTEtPnR5cGUtPmNvZGUgIT0gVFlQRV9DT0RFX0lOVCkKKyAgICAgIHx8ICh2YWx1ZTItPnR5cGUtPmNvZGUgIT0gVFlQRV9DT0RFX0lOVCkpCisgICAgZXJyb3IgKCJJbGxlZ2FsIGNvbWJpbmF0aW9uIG9mIHR5cGVzIGluICVzLiIsIG5hbWUpOworICAKKyAgYXhfc2ltcGxlIChheCwKKwkgICAgIFRZUEVfVU5TSUdORUQgKHZhbHVlMS0+dHlwZSkgPyBvcF91bnNpZ25lZCA6IG9wKTsKKyAgaWYgKG1heV9jYXJyeSkKKyAgICBnZW5fZXh0ZW5kIChheCwgdmFsdWUxLT50eXBlKTsgLyogY2F0Y2ggb3ZlcmZsb3cgKi8KKyAgdmFsdWUtPnR5cGUgPSB2YWx1ZTEtPnR5cGU7CisgIHZhbHVlLT5raW5kID0gYXhzX3J2YWx1ZTsKK30KKworCitzdGF0aWMgdm9pZAorZ2VuX2xvZ2ljYWxfbm90IChheCwgdmFsdWUpCisgICAgIHN0cnVjdCBhZ2VudF9leHByICpheDsKKyAgICAgc3RydWN0IGF4c192YWx1ZSAqdmFsdWU7Cit7CisgIGlmIChUWVBFX0NPREUgKHZhbHVlLT50eXBlKSAhPSBUWVBFX0NPREVfSU5UCisgICAgICAmJiBUWVBFX0NPREUgKHZhbHVlLT50eXBlKSAhPSBUWVBFX0NPREVfUFRSKQorICAgIGVycm9yICgiSWxsZWdhbCB0eXBlIG9mIG9wZXJhbmQgdG8gYCEnLiIpOworCisgIGdlbl91c3VhbF91bmFyeSAoYXgsIHZhbHVlKTsKKyAgYXhfc2ltcGxlIChheCwgYW9wX2xvZ19ub3QpOworICB2YWx1ZS0+dHlwZSA9IGJ1aWx0aW5fdHlwZV9pbnQ7Cit9CisKKworc3RhdGljIHZvaWQKK2dlbl9jb21wbGVtZW50IChheCwgdmFsdWUpCisgICAgIHN0cnVjdCBhZ2VudF9leHByICpheDsKKyAgICAgc3RydWN0IGF4c192YWx1ZSAqdmFsdWU7Cit7CisgIGlmIChUWVBFX0NPREUgKHZhbHVlLT50eXBlKSAhPSBUWVBFX0NPREVfSU5UKQorICAgIGVycm9yICgiSWxsZWdhbCB0eXBlIG9mIG9wZXJhbmQgdG8gYH4nLiIpOworCisgIGdlbl91c3VhbF91bmFyeSAoYXgsIHZhbHVlKTsKKyAgZ2VuX2ludGVncmFsX3Byb21vdGlvbnMgKGF4LCB2YWx1ZSk7CisgIGF4X3NpbXBsZSAoYXgsIGFvcF9iaXRfbm90KTsKKyAgZ2VuX2V4dGVuZCAoYXgsIHZhbHVlLT50eXBlKTsKK30KKworCisMCisvKiBHZW5lcmF0aW5nIGJ5dGVjb2RlIGZyb20gR0RCIGV4cHJlc3Npb25zOiAqICYgLiAtPiBAIHNpemVvZiAqLworCisvKiBEZXJlZmVyZW5jZSB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suICAqLworc3RhdGljIHZvaWQKK2dlbl9kZXJlZiAoYXgsIHZhbHVlKQorICAgICBzdHJ1Y3QgYWdlbnRfZXhwciAqYXg7CisgICAgIHN0cnVjdCBheHNfdmFsdWUgKnZhbHVlOworeworICAvKiBUaGUgY2FsbGVyIHNob3VsZCBjaGVjayB0aGUgdHlwZSwgYmVjYXVzZSBzZXZlcmFsIG9wZXJhdG9ycyB1c2UKKyAgICAgdGhpcywgYW5kIHdlIGRvbid0IGtub3cgd2hhdCBlcnJvciBtZXNzYWdlIHRvIGdlbmVyYXRlLiAgKi8KKyAgaWYgKHZhbHVlLT50eXBlLT5jb2RlICE9IFRZUEVfQ09ERV9QVFIpCisgICAgZXJyb3IgKCJHREIgYnVnOiBheC1nZGIuYyAoZ2VuX2RlcmVmKTogZXhwZWN0ZWQgYSBwb2ludGVyIik7CisKKyAgLyogV2UndmUgZ290IGFuIHJ2YWx1ZSBub3csIHdoaWNoIGlzIGEgcG9pbnRlci4gIFdlIHdhbnQgdG8geWllbGQgYW4KKyAgICAgbHZhbHVlLCB3aG9zZSBhZGRyZXNzIGlzIGV4YWN0bHkgdGhhdCBwb2ludGVyLiAgU28gd2UgZG9uJ3QKKyAgICAgYWN0dWFsbHkgZW1pdCBhbnkgY29kZTsgd2UganVzdCBjaGFuZ2UgdGhlIHR5cGUgZnJvbSAiUG9pbnRlciB0bworICAgICBUIiB0byAiVCIsIGFuZCBtYXJrIHRoZSB2YWx1ZSBhcyBhbiBsdmFsdWUgaW4gbWVtb3J5LiAgTGVhdmUgaXQKKyAgICAgdG8gdGhlIGNvbnN1bWVyIHRvIGFjdHVhbGx5IGRlcmVmZXJlbmNlIGl0LiAgKi8KKyAgdmFsdWUtPnR5cGUgPSBjaGVja190eXBlZGVmIChUWVBFX1RBUkdFVF9UWVBFICh2YWx1ZS0+dHlwZSkpOworICB2YWx1ZS0+a2luZCA9ICgodmFsdWUtPnR5cGUtPmNvZGUgPT0gVFlQRV9DT0RFX0ZVTkMpCisJCSA/IGF4c19ydmFsdWUgOiBheHNfbHZhbHVlX21lbW9yeSk7Cit9CisKKworLyogUHJvZHVjZSB0aGUgYWRkcmVzcyBvZiB0aGUgbHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KK3N0YXRpYyB2b2lkCitnZW5fYWRkcmVzc19vZiAoYXgsIHZhbHVlKQorICAgICBzdHJ1Y3QgYWdlbnRfZXhwciAqYXg7CisgICAgIHN0cnVjdCBheHNfdmFsdWUgKnZhbHVlOworeworICAvKiBTcGVjaWFsIGNhc2UgZm9yIHRha2luZyB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uLiAgVGhlIEFOU0kKKyAgICAgc3RhbmRhcmQgZGVzY3JpYmVzIHRoaXMgYXMgYSBzcGVjaWFsIGNhc2UsIHRvbywgc28gdGhpcworICAgICBhcnJhbmdlbWVudCBpcyBub3Qgd2l0aG91dCBtb3RpdmF0aW9uLiAgKi8KKyAgaWYgKHZhbHVlLT50eXBlLT5jb2RlID09IFRZUEVfQ09ERV9GVU5DKQorICAgIC8qIFRoZSB2YWx1ZSdzIGFscmVhZHkgYW4gcnZhbHVlIG9uIHRoZSBzdGFjaywgc28gd2UganVzdCBuZWVkIHRvCisgICAgICAgY2hhbmdlIHRoZSB0eXBlLiAgKi8KKyAgICB2YWx1ZS0+dHlwZSA9IGxvb2t1cF9wb2ludGVyX3R5cGUgKHZhbHVlLT50eXBlKTsKKyAgZWxzZQorICAgIHN3aXRjaCAodmFsdWUtPmtpbmQpCisgICAgICB7CisgICAgICBjYXNlIGF4c19ydmFsdWU6CisJZXJyb3IgKCJPcGVyYW5kIG9mIGAmJyBpcyBhbiBydmFsdWUsIHdoaWNoIGhhcyBubyBhZGRyZXNzLiIpOworCisgICAgICBjYXNlIGF4c19sdmFsdWVfcmVnaXN0ZXI6CisJZXJyb3IgKCJPcGVyYW5kIG9mIGAmJyBpcyBpbiBhIHJlZ2lzdGVyLCBhbmQgaGFzIG5vIGFkZHJlc3MuIik7CisKKyAgICAgIGNhc2UgYXhzX2x2YWx1ZV9tZW1vcnk6CisJdmFsdWUtPmtpbmQgPSBheHNfcnZhbHVlOworCXZhbHVlLT50eXBlID0gbG9va3VwX3BvaW50ZXJfdHlwZSAodmFsdWUtPnR5cGUpOworCWJyZWFrOworICAgICAgfQorfQorCisKKy8qIEEgbG90IG9mIHRoaXMgc3R1ZmYgd2lsbCBoYXZlIHRvIGNoYW5nZSB0byBzdXBwb3J0IEMrKy4gIEJ1dCB3ZSdyZQorICAgbm90IGdvaW5nIHRvIGRlYWwgd2l0aCB0aGF0IGF0IHRoZSBtb21lbnQuICAqLworCisvKiBGaW5kIHRoZSBmaWVsZCBpbiB0aGUgc3RydWN0dXJlIHR5cGUgVFlQRSBuYW1lZCBOQU1FLCBhbmQgcmV0dXJuCisgICBpdHMgaW5kZXggaW4gVFlQRSdzIGZpZWxkIGFycmF5LiAgKi8KK3N0YXRpYyBpbnQKK2ZpbmRfZmllbGQgKHR5cGUsIG5hbWUpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBjaGFyICpuYW1lOworeworICBpbnQgaTsKKworICBDSEVDS19UWVBFREVGICh0eXBlKTsKKworICAvKiBNYWtlIHN1cmUgdGhpcyBpc24ndCBDKysuICAqLworICBpZiAoVFlQRV9OX0JBU0VDTEFTU0VTICh0eXBlKSAhPSAwKQorICAgIGVycm9yICgiR0RCIGJ1ZzogYXgtZ2RiLmMgKGZpbmRfZmllbGQpOiBkZXJpdmVkIGNsYXNzZXMgc3VwcG9ydGVkIik7CisKKyAgZm9yIChpID0gMDsgaSA8IFRZUEVfTkZJRUxEUyAodHlwZSk7IGkrKykKKyAgICB7CisgICAgICBjaGFyICp0aGlzX25hbWUgPSBUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIGkpOworCisgICAgICBpZiAodGhpc19uYW1lICYmIFNUUkVRIChuYW1lLCB0aGlzX25hbWUpKQorCXJldHVybiBpOworCisgICAgICBpZiAodGhpc19uYW1lWzBdID09ICdcMCcpCisJZXJyb3IgKCJHREIgYnVnOiBheC1nZGIuYyAoZmluZF9maWVsZCk6IGFub255bW91cyB1bmlvbnMgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKworICBlcnJvciAoIkNvdWxkbid0IGZpbmQgbWVtYmVyIG5hbWVkIGAlcycgaW4gc3RydWN0L3VuaW9uIGAlcyciLAorCSBuYW1lLCB0eXBlLT50YWdfbmFtZSk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyogR2VuZXJhdGUgY29kZSB0byBwdXNoIHRoZSB2YWx1ZSBvZiBhIGJpdGZpZWxkIG9mIGEgc3RydWN0dXJlIHdob3NlCisgICBhZGRyZXNzIGlzIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgU1RBUlQgYW5kIEVORCBnaXZlIHRoZQorICAgc3RhcnRpbmcgYW5kIG9uZS1wYXN0LWVuZGluZyAqYml0KiBudW1iZXJzIG9mIHRoZSBmaWVsZCB3aXRoaW4gdGhlCisgICBzdHJ1Y3R1cmUuICAqLworc3RhdGljIHZvaWQKK2dlbl9iaXRmaWVsZF9yZWYgKGF4LCB2YWx1ZSwgdHlwZSwgc3RhcnQsIGVuZCkKKyAgICAgc3RydWN0IGFnZW50X2V4cHIgKmF4OworICAgICBzdHJ1Y3QgYXhzX3ZhbHVlICp2YWx1ZTsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGludCBzdGFydCwgZW5kOworeworICAvKiBOb3RlIHRoYXQgb3BzW2ldIGZldGNoZXMgOCA8PCBpIGJpdHMuICAqLworICBzdGF0aWMgZW51bSBhZ2VudF9vcCBvcHNbXQorICAgID0geyBhb3BfcmVmOCwgYW9wX3JlZjE2LCBhb3BfcmVmMzIsIGFvcF9yZWY2NCB9OworICBzdGF0aWMgaW50IG51bV9vcHMgPSAoc2l6ZW9mIChvcHMpIC8gc2l6ZW9mIChvcHNbMF0pKTsKKworICAvKiBXZSBkb24ndCB3YW50IHRvIHRvdWNoIGFueSBieXRlIHRoYXQgdGhlIGJpdGZpZWxkIGRvZXNuJ3QKKyAgICAgYWN0dWFsbHkgb2NjdXB5OyB3ZSBzaG91bGRuJ3QgbWFrZSBhbnkgYWNjZXNzZXMgd2UncmUgbm90CisgICAgIGV4cGxpY2l0bHkgcGVybWl0dGVkIHRvLiAgV2UgcmVseSBoZXJlIG9uIHRoZSBmYWN0IHRoYXQgdGhlCisgICAgIGJ5dGVjb2RlIGByZWYnIG9wZXJhdG9ycyB3b3JrIG9uIHVuYWxpZ25lZCBhZGRyZXNzZXMuCisKKyAgICAgSXQgdGFrZXMgc29tZSBmYW5jeSBmb290d29yayB0byBnZXQgdGhlIHN0YWNrIHRvIHdvcmsgdGhlIHdheQorICAgICB3ZSdkIGxpa2UuICBTYXkgd2UncmUgcmV0cmlldmluZyBhIGJpdGZpZWxkIHRoYXQgcmVxdWlyZXMgdGhyZWUKKyAgICAgZmV0Y2hlcy4gIEluaXRpYWxseSwgdGhlIHN0YWNrIGp1c3QgY29udGFpbnMgdGhlIGFkZHJlc3M6CisJCWFkZHIKKyAgICAgRm9yIHRoZSBmaXJzdCBmZXRjaCwgd2UgZHVwbGljYXRlIHRoZSBhZGRyZXNzCisJCWFkZHIgYWRkcgorICAgICB0aGVuIGFkZCB0aGUgYnl0ZSBvZmZzZXQsIGRvIHRoZSBmZXRjaCwgYW5kIHNoaWZ0IGFuZCBtYXNrIGFzCisgICAgIG5lZWRlZCwgeWllbGRpbmcgYSBmcmFnbWVudCBvZiB0aGUgdmFsdWUsIHByb3Blcmx5IGFsaWduZWQgZm9yCisgICAgIHRoZSBmaW5hbCBiaXR3aXNlIG9yOgorICAgICAgICAgICAgICAgIGFkZHIgZnJhZzEKKyAgICAgdGhlbiB3ZSBzd2FwLCBhbmQgcmVwZWF0IHRoZSBwcm9jZXNzOgorICAgICAgICAgICAgICAgIGZyYWcxIGFkZHIgICAgICAgICAgICAgICAgICAgIC0tLSBhZGRyZXNzIG9uIHRvcAorCQlmcmFnMSBhZGRyIGFkZHIgICAgICAgICAgICAgICAtLS0gZHVwbGljYXRlIGl0CisgICAgICAgICAgICAgICAgZnJhZzEgYWRkciBmcmFnMiAgICAgICAgICAgICAgLS0tIGdldCBzZWNvbmQgZnJhZ21lbnQKKyAgICAgICAgICAgICAgICBmcmFnMSBmcmFnMiBhZGRyICAgICAgICAgICAgICAtLS0gc3dhcCBhZ2FpbgorICAgICAgICAgICAgICAgIGZyYWcxIGZyYWcyIGZyYWczICAgICAgICAgICAgIC0tLSBnZXQgdGhpcmQgZnJhZ21lbnQKKyAgICAgTm90aWNlIHRoYXQsIHNpbmNlIHRoZSB0aGlyZCBmcmFnbWVudCBpcyB0aGUgbGFzdCBvbmUsIHdlIGRvbid0CisgICAgIGJvdGhlciBkdXBsaWNhdGluZyB0aGUgYWRkcmVzcyB0aGlzIHRpbWUuICBOb3cgd2UgaGF2ZSBhbGwgdGhlCisgICAgIGZyYWdtZW50cyBvbiB0aGUgc3RhY2ssIGFuZCB3ZSBjYW4gc2ltcGx5IGBvcicgdGhlbSB0b2dldGhlciwKKyAgICAgeWllbGRpbmcgdGhlIGZpbmFsIHZhbHVlIG9mIHRoZSBiaXRmaWVsZC4gICovCisKKyAgLyogVGhlIGZpcnN0IGFuZCBvbmUtYWZ0ZXItbGFzdCBiaXRzIGluIHRoZSBmaWVsZCwgYnV0IHJvdW5kZWQgZG93bgorICAgICBhbmQgdXAgdG8gYnl0ZSBib3VuZGFyaWVzLiAgKi8KKyAgaW50IGJvdW5kX3N0YXJ0ID0gKHN0YXJ0IC8gVEFSR0VUX0NIQVJfQklUKSAqIFRBUkdFVF9DSEFSX0JJVDsKKyAgaW50IGJvdW5kX2VuZCAgID0gKCgoZW5kICsgVEFSR0VUX0NIQVJfQklUIC0gMSkKKwkJICAgICAgLyBUQVJHRVRfQ0hBUl9CSVQpCisJCSAgICAgKiBUQVJHRVRfQ0hBUl9CSVQpOworCisgIC8qIGN1cnJlbnQgYml0IG9mZnNldCB3aXRoaW4gdGhlIHN0cnVjdHVyZSAqLworICBpbnQgb2Zmc2V0OworCisgIC8qIFRoZSBpbmRleCBpbiBvcHMgb2YgdGhlIG9wY29kZSB3ZSdyZSBjb25zaWRlcmluZy4gICovCisgIGludCBvcDsKKworICAvKiBUaGUgbnVtYmVyIG9mIGZyYWdtZW50cyB3ZSBnZW5lcmF0ZWQgaW4gdGhlIHByb2Nlc3MuICBQcm9iYWJseQorICAgICBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGBvbmUnIGJpdHMgaW4gYnl0ZXNpemUsIGJ1dCB3aG8gY2FyZXM/ICAqLworICBpbnQgZnJhZ21lbnRfY291bnQ7CisKKyAgLyogRGVyZWZlcmVuY2UgYW55IHR5cGVkZWZzLiAqLworICB0eXBlID0gY2hlY2tfdHlwZWRlZiAodHlwZSk7CisKKyAgLyogQ2FuIHdlIGZldGNoIHRoZSBudW1iZXIgb2YgYml0cyByZXF1ZXN0ZWQgYXQgYWxsPyAgKi8KKyAgaWYgKChlbmQgLSBzdGFydCkgPiAoKDEgPDwgbnVtX29wcykgKiA4KSkKKyAgICBlcnJvciAoIkdEQiBidWc6IGF4LWdkYi5jIChnZW5fYml0ZmllbGRfcmVmKTogYml0ZmllbGQgdG9vIHdpZGUiKTsKKworICAvKiBOb3RlIHRoYXQgd2Uga25vdyBoZXJlIHRoYXQgd2Ugb25seSBuZWVkIHRvIHRyeSBlYWNoIG9wY29kZSBvbmNlLgorICAgICBUaGF0IG1heSBub3QgYmUgdHJ1ZSBvbiBtYWNoaW5lcyB3aXRoIHdlaXJkIGJ5dGUgc2l6ZXMuICAqLworICBvZmZzZXQgPSBib3VuZF9zdGFydDsKKyAgZnJhZ21lbnRfY291bnQgPSAwOworICBmb3IgKG9wID0gbnVtX29wcyAtIDE7IG9wID49IDA7IG9wLS0pCisgICAgeworICAgICAgLyogbnVtYmVyIG9mIGJpdHMgdGhhdCBvcHNbb3BdIHdvdWxkIGZldGNoICovCisgICAgICBpbnQgb3Bfc2l6ZSA9IDggPDwgb3A7CisKKyAgICAgIC8qIFRoZSBzdGFjayBhdCB0aGlzIHBvaW50LCBmcm9tIGJvdHRvbSB0byB0b3AsIGNvbnRhaW5zIHplcm8gb3IKKwkgbW9yZSBmcmFnbWVudHMsIHRoZW4gdGhlIGFkZHJlc3MuICAqLworICAgICAgCisgICAgICAvKiBEb2VzIHRoaXMgZmV0Y2ggZml0IHdpdGhpbiB0aGUgYml0ZmllbGQ/ICAqLworICAgICAgaWYgKG9mZnNldCArIG9wX3NpemUgPD0gYm91bmRfZW5kKQorCXsKKwkgIC8qIElzIHRoaXMgdGhlIGxhc3QgZnJhZ21lbnQ/ICAqLworCSAgaW50IGxhc3RfZnJhZyA9IChvZmZzZXQgKyBvcF9zaXplID09IGJvdW5kX2VuZCk7CisKKwkgIGlmICghIGxhc3RfZnJhZykKKwkgICAgYXhfc2ltcGxlIChheCwgYW9wX2R1cCk7IC8qIGtlZXAgYSBjb3B5IG9mIHRoZSBhZGRyZXNzICovCisJICAKKwkgIC8qIEFkZCB0aGUgb2Zmc2V0LiAgKi8KKwkgIGdlbl9vZmZzZXQgKGF4LCBvZmZzZXQgLyBUQVJHRVRfQ0hBUl9CSVQpOworCisJICBpZiAodHJhY2Vfa2x1ZGdlKQorCSAgICB7CisJICAgICAgLyogUmVjb3JkIHRoZSBhcmVhIG9mIG1lbW9yeSB3ZSdyZSBhYm91dCB0byBmZXRjaC4gICovCisJICAgICAgYXhfdHJhY2VfcXVpY2sgKGF4LCBvcF9zaXplIC8gVEFSR0VUX0NIQVJfQklUKTsKKwkgICAgfQorCisJICAvKiBQZXJmb3JtIHRoZSBmZXRjaC4gICovCisJICBheF9zaW1wbGUgKGF4LCBvcHNbb3BdKTsKKwkKKyAgICAgICAgICAvKiBTaGlmdCB0aGUgYml0cyB3ZSBoYXZlIHRvIHRoZWlyIHByb3BlciBwb3NpdGlvbi4KKwkgICAgIGdlbl9sZWZ0X3NoaWZ0IHdpbGwgZ2VuZXJhdGUgcmlnaHQgc2hpZnRzIHdoZW4gdGhlIG9wZXJhbmQKKwkgICAgIGlzIG5lZ2F0aXZlLgorCisgICAgICAgICAgICAgQSBiaWctZW5kaWFuIGZpZWxkIGRpYWdyYW0gdG8gcG9uZGVyOgorICAgICAgICAgICAgICBieXRlIDAgIGJ5dGUgMSAgYnl0ZSAyICBieXRlIDMgIGJ5dGUgNCAgYnl0ZSA1ICBieXRlIDYgIGJ5dGUgNworICAgICAgICAgICAgICstLS0tLS0rKy0tLS0tLSsrLS0tLS0tKystLS0tLS0rKy0tLS0tLSsrLS0tLS0tKystLS0tLS0rKy0tLS0tLSsKKyAgICAgICAgICAgICB4eHh4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJCQkJCQkJCQkJCQkJCQkJDQ0NDQ3h4eHh4eHh4eHh4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgXiAgICBeCisgICAgICAgICAgICAgYml0IG51bWJlciAgICAgIDE2ICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgNDggICA1MworCSAgICAgVGhlc2UgYXJlIGJpdCBudW1iZXJzIGFzIHN1cHBsaWVkIGJ5IEdEQi4gIE5vdGUgdGhhdCB0aGUKKwkgICAgIGJpdCBudW1iZXJzIHJ1biBmcm9tIHJpZ2h0IHRvIGxlZnQgb25jZSB5b3UndmUgZmV0Y2hlZCB0aGUKKwkgICAgIHZhbHVlIQorCisgICAgICAgICAgICAgQSBsaXR0bGUtZW5kaWFuIGZpZWxkIGRpYWdyYW0gdG8gcG9uZGVyOgorICAgICAgICAgICAgICBieXRlIDcgIGJ5dGUgNiAgYnl0ZSA1ICBieXRlIDQgIGJ5dGUgMyAgYnl0ZSAyICBieXRlIDEgIGJ5dGUgMAorICAgICAgICAgICAgICstLS0tLS0rKy0tLS0tLSsrLS0tLS0tKystLS0tLS0rKy0tLS0tLSsrLS0tLS0tKystLS0tLS0rKy0tLS0tLSsKKyAgICAgICAgICAgICB4eHh4eHh4eHh4eEFBQUFBQkJCQkJCQkJCQkJCQkJCQkNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0N4eHh4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICBeICAgICAgICAgICBeICAgXgorICAgICAgICAgICAgIGJpdCBudW1iZXIgICAgIDQ4ICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgMTYgICAgICAgICAgNCAgIDAKKworICAgICAgICAgICAgIEluIGJvdGggY2FzZXMsIHRoZSBtb3N0IHNpZ25pZmljYW50IGVuZCBpcyBvbiB0aGUgbGVmdAorICAgICAgICAgICAgIChpLmUuIG5vcm1hbCBudW1lcmljIHdyaXRpbmcgb3JkZXIpLCB3aGljaCBtZWFucyB0aGF0IHlvdQorICAgICAgICAgICAgIGRvbid0IGdvIGNyYXp5IHRoaW5raW5nIGFib3V0IGBsZWZ0JyBhbmQgYHJpZ2h0JyBzaGlmdHMuCisKKyAgICAgICAgICAgICBXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IG1hc2tpbmcgeWV0OgorICAgICAgICAgICAgIC0gSWYgdGhleSBjb250YWluIGdhcmJhZ2Ugb2ZmIHRoZSBsZWFzdCBzaWduaWZpY2FudCBlbmQsIHRoZW4gd2UKKyAgICAgICAgICAgICAgIG11c3QgYmUgbG9va2luZyBhdCB0aGUgbG93IGVuZCBvZiB0aGUgZmllbGQsIGFuZCB0aGUgcmlnaHQKKyAgICAgICAgICAgICAgIHNoaWZ0IHdpbGwgd2lwZSB0aGVtIG91dC4KKyAgICAgICAgICAgICAtIElmIHRoZXkgY29udGFpbiBnYXJiYWdlIG9mZiB0aGUgbW9zdCBzaWduaWZpY2FudCBlbmQsIHRoZW4gd2UKKyAgICAgICAgICAgICAgIG11c3QgYmUgbG9va2luZyBhdCB0aGUgbW9zdCBzaWduaWZpY2FudCBlbmQgb2YgdGhlIHdvcmQsIGFuZAorICAgICAgICAgICAgICAgdGhlIHNpZ24vemVybyBleHRlbnNpb24gd2lsbCB3aXBlIHRoZW0gb3V0LgorICAgICAgICAgICAgIC0gSWYgd2UncmUgaW4gdGhlIGludGVyaW9yIG9mIHRoZSB3b3JkLCB0aGVuIHRoZXJlIGlzIG5vIGdhcmJhZ2UKKyAgICAgICAgICAgICAgIG9uIGVpdGhlciBlbmQsIGJlY2F1c2UgdGhlIHJlZiBvcGVyYXRvcnMgemVyby1leHRlbmQuICAqLworCSAgaWYgKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pCisJICAgIGdlbl9sZWZ0X3NoaWZ0IChheCwgZW5kIC0gKG9mZnNldCArIG9wX3NpemUpKTsKKwkgIGVsc2UgCisJICAgIGdlbl9sZWZ0X3NoaWZ0IChheCwgb2Zmc2V0IC0gc3RhcnQpOworCisJICBpZiAoISBsYXN0X2ZyYWcpCisJICAgIC8qIEJyaW5nIHRoZSBjb3B5IG9mIHRoZSBhZGRyZXNzIHVwIHRvIHRoZSB0b3AuICAqLworCSAgICBheF9zaW1wbGUgKGF4LCBhb3Bfc3dhcCk7CisKKwkgIG9mZnNldCArPSBvcF9zaXplOworCSAgZnJhZ21lbnRfY291bnQrKzsKKwl9CisgICAgfQorCisgIC8qIEdlbmVyYXRlIGVub3VnaCBiaXR3aXNlIGBvcicgb3BlcmF0aW9ucyB0byBjb21iaW5lIGFsbCB0aGUKKyAgICAgZnJhZ21lbnRzIHdlIGxlZnQgb24gdGhlIHN0YWNrLiAgKi8KKyAgd2hpbGUgKGZyYWdtZW50X2NvdW50LS0gPiAxKQorICAgIGF4X3NpbXBsZSAoYXgsIGFvcF9iaXRfb3IpOworCisgIC8qIFNpZ24tIG9yIHplcm8tZXh0ZW5kIHRoZSB2YWx1ZSBhcyBhcHByb3ByaWF0ZS4gICovCisgICgoVFlQRV9VTlNJR05FRCAodHlwZSkgPyBheF96ZXJvX2V4dCA6IGF4X2V4dCkgKGF4LCBlbmQgLSBzdGFydCkpOworCisgIC8qIFRoaXMgaXMgKm5vdCogYW4gbHZhbHVlLiAgVWdoLiAgKi8KKyAgdmFsdWUtPmtpbmQgPSBheHNfcnZhbHVlOworICB2YWx1ZS0+dHlwZSA9IHR5cGU7Cit9CisKKworLyogR2VuZXJhdGUgY29kZSB0byByZWZlcmVuY2UgdGhlIG1lbWJlciBuYW1lZCBGSUVMRCBvZiBhIHN0cnVjdHVyZSBvcgorICAgdW5pb24uICBUaGUgdG9wIG9mIHRoZSBzdGFjaywgYXMgZGVzY3JpYmVkIGJ5IFZBTFVFLCBzaG91bGQgaGF2ZQorICAgdHlwZSAocG9pbnRlciB0byBhKSogc3RydWN0L3VuaW9uLiAgT1BFUkFUT1JfTkFNRSBpcyB0aGUgbmFtZSBvZgorICAgdGhlIG9wZXJhdG9yIGJlaW5nIGNvbXBpbGVkLCBhbmQgT1BFUkFORF9OQU1FIGlzIHRoZSBraW5kIG9mIHRoaW5nCisgICBpdCBvcGVyYXRlcyBvbjsgd2UgdXNlIHRoZW0gaW4gZXJyb3IgbWVzc2FnZXMuICAqLworc3RhdGljIHZvaWQKK2dlbl9zdHJ1Y3RfcmVmIChheCwgdmFsdWUsIGZpZWxkLCBvcGVyYXRvcl9uYW1lLCBvcGVyYW5kX25hbWUpCisgICAgIHN0cnVjdCBhZ2VudF9leHByICpheDsKKyAgICAgc3RydWN0IGF4c192YWx1ZSAqdmFsdWU7CisgICAgIGNoYXIgKmZpZWxkOworICAgICBjaGFyICpvcGVyYXRvcl9uYW1lOworICAgICBjaGFyICpvcGVyYW5kX25hbWU7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlOworICBpbnQgaTsKKworICAvKiBGb2xsb3cgcG9pbnRlcnMgdW50aWwgd2UgcmVhY2ggYSBub24tcG9pbnRlci4gIFRoZXNlIGFyZW4ndCB0aGUgQworICAgICBzZW1hbnRpY3MsIGJ1dCB0aGV5J3JlIHdoYXQgdGhlIG5vcm1hbCBHREIgZXZhbHVhdG9yIGRvZXMsIHNvIHdlCisgICAgIHNob3VsZCBhdCBsZWFzdCBiZSBjb25zaXN0ZW50LiAgKi8KKyAgd2hpbGUgKHZhbHVlLT50eXBlLT5jb2RlID09IFRZUEVfQ09ERV9QVFIpCisgICAgeworICAgICAgZ2VuX3VzdWFsX3VuYXJ5IChheCwgdmFsdWUpOworICAgICAgZ2VuX2RlcmVmIChheCwgdmFsdWUpOworICAgIH0KKyAgdHlwZSA9IHZhbHVlLT50eXBlOworCisgIC8qIFRoaXMgbXVzdCB5aWVsZCBhIHN0cnVjdHVyZSBvciBhIHVuaW9uLiAgKi8KKyAgaWYgKFRZUEVfQ09ERSAodHlwZSkgIT0gVFlQRV9DT0RFX1NUUlVDVAorICAgICAgJiYgVFlQRV9DT0RFICh0eXBlKSAhPSBUWVBFX0NPREVfVU5JT04pCisgICAgZXJyb3IgKCJUaGUgbGVmdCBvcGVyYW5kIG9mIGAlcycgaXMgbm90IGEgJXMuIiwKKwkgICBvcGVyYXRvcl9uYW1lLCBvcGVyYW5kX25hbWUpOworCisgIC8qIEFuZCBpdCBtdXN0IGJlIGluIG1lbW9yeTsgd2UgZG9uJ3QgZGVhbCB3aXRoIHN0cnVjdHVyZSBydmFsdWVzLAorICAgICBvciBzdHJ1Y3R1cmVzIGxpdmluZyBpbiByZWdpc3RlcnMuICAqLworICBpZiAodmFsdWUtPmtpbmQgIT0gYXhzX2x2YWx1ZV9tZW1vcnkpCisgICAgZXJyb3IgKCJTdHJ1Y3R1cmUgZG9lcyBub3QgbGl2ZSBpbiBtZW1vcnkuIik7CisKKyAgaSA9IGZpbmRfZmllbGQgKHR5cGUsIGZpZWxkKTsKKyAgCisgIC8qIElzIHRoaXMgYSBiaXRmaWVsZD8gICovCisgIGlmIChUWVBFX0ZJRUxEX1BBQ0tFRCAodHlwZSwgaSkpCisgICAgZ2VuX2JpdGZpZWxkX3JlZiAoYXgsIHZhbHVlLCBUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpLAorCQkgICAgICBUWVBFX0ZJRUxEX0JJVFBPUyAodHlwZSwgaSksCisJCSAgICAgIChUWVBFX0ZJRUxEX0JJVFBPUyAodHlwZSwgaSkKKwkJICAgICAgICsgVFlQRV9GSUVMRF9CSVRTSVpFICh0eXBlLCBpKSkpOworICBlbHNlCisgICAgeworICAgICAgZ2VuX29mZnNldCAoYXgsIFRZUEVfRklFTERfQklUUE9TICh0eXBlLCBpKSAvIFRBUkdFVF9DSEFSX0JJVCk7CisgICAgICB2YWx1ZS0+a2luZCA9IGF4c19sdmFsdWVfbWVtb3J5OworICAgICAgdmFsdWUtPnR5cGUgPSBUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpOworICAgIH0KK30KKworCisvKiBHZW5lcmF0ZSBjb2RlIGZvciBHREIncyBtYWdpY2FsIGByZXBlYXQnIG9wZXJhdG9yLiAgCisgICBMVkFMVUUgQCBJTlQgY3JlYXRlcyBhbiBhcnJheSBJTlQgZWxlbWVudHMgbG9uZywgYW5kIHdob3NlIGVsZW1lbnRzCisgICBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgTFZBTFVFLCBsb2NhdGVkIGluIG1lbW9yeSBzbyB0aGF0IExWQUxVRSBpcworICAgaXRzIGZpcnN0IGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgYXJndlswXUBhcmdjIGdpdmVzIHlvdSB0aGUgYXJyYXkKKyAgIG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCisKKyAgIFVuZm9ydHVuYXRlbHksIGJlY2F1c2Ugd2UgaGF2ZSB0byBrbm93IHRoZSB0eXBlcyBiZWZvcmUgd2UgYWN0dWFsbHkKKyAgIGhhdmUgYSB2YWx1ZSBmb3IgdGhlIGV4cHJlc3Npb24sIHdlIGNhbid0IGltcGxlbWVudCB0aGlzIHBlcmZlY3RseQorICAgd2l0aG91dCBjaGFuZ2luZyB0aGUgdHlwZSBzeXN0ZW0sIGhhdmluZyB2YWx1ZXMgdGhhdCBvY2N1cHkgdHdvCisgICBzdGFjayBzbG90cywgZG9pbmcgd2VpcmQgdGhpbmdzIHdpdGggc2l6ZW9mLCBldGMuICBTbyB3ZSByZXF1aXJlCisgICB0aGUgcmlnaHQgb3BlcmFuZCB0byBiZSBhIGNvbnN0YW50IGV4cHJlc3Npb24uICAqLworc3RhdGljIHZvaWQKK2dlbl9yZXBlYXQgKHBjLCBheCwgdmFsdWUpCisgICAgIHVuaW9uIGV4cF9lbGVtZW50ICoqcGM7CisgICAgIHN0cnVjdCBhZ2VudF9leHByICpheDsKKyAgICAgc3RydWN0IGF4c192YWx1ZSAqdmFsdWU7Cit7CisgIHN0cnVjdCBheHNfdmFsdWUgdmFsdWUxOworICAvKiBXZSBkb24ndCB3YW50IHRvIHR1cm4gdGhpcyBpbnRvIGFuIHJ2YWx1ZSwgc28gbm8gY29udmVyc2lvbnMKKyAgICAgaGVyZS4gICovCisgIGdlbl9leHByIChwYywgYXgsICZ2YWx1ZTEpOworICBpZiAodmFsdWUxLmtpbmQgIT0gYXhzX2x2YWx1ZV9tZW1vcnkpCisgICAgZXJyb3IgKCJMZWZ0IG9wZXJhbmQgb2YgYEAnIG11c3QgYmUgYW4gb2JqZWN0IGluIG1lbW9yeS4iKTsKKworICAvKiBFdmFsdWF0ZSB0aGUgbGVuZ3RoOyBpdCBoYWQgYmV0dGVyIGJlIGEgY29uc3RhbnQuICAqLworICB7CisgICAgc3RydWN0IHZhbHVlICp2ID0gY29uc3RfZXhwciAocGMpOworICAgIGludCBsZW5ndGg7CisKKyAgICBpZiAoISB2KQorICAgICAgZXJyb3IgKCJSaWdodCBvcGVyYW5kIG9mIGBAJyBtdXN0IGJlIGEgY29uc3RhbnQsIGluIGFnZW50IGV4cHJlc3Npb25zLiIpOworICAgIGlmICh2LT50eXBlLT5jb2RlICE9IFRZUEVfQ09ERV9JTlQpCisgICAgICBlcnJvciAoIlJpZ2h0IG9wZXJhbmQgb2YgYEAnIG11c3QgYmUgYW4gaW50ZWdlci4iKTsKKyAgICBsZW5ndGggPSB2YWx1ZV9hc19sb25nICh2KTsKKyAgICBpZiAobGVuZ3RoIDw9IDApCisgICAgICBlcnJvciAoIlJpZ2h0IG9wZXJhbmQgb2YgYEAnIG11c3QgYmUgcG9zaXRpdmUuIik7CisKKyAgICAvKiBUaGUgdG9wIG9mIHRoZSBzdGFjayBpcyBhbHJlYWR5IHRoZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QsIHNvCisgICAgICAgYWxsIHdlIG5lZWQgdG8gZG8gaXMgZnJvYiB0aGUgdHlwZSBvZiB0aGUgbHZhbHVlLiAgKi8KKyAgICB7CisgICAgICAvKiBGSVhNRS10eXBlLWFsbG9jYXRpb246IG5lZWQgYSB3YXkgdG8gZnJlZSB0aGlzIHR5cGUgd2hlbiB3ZSBhcmUKKwkgZG9uZSB3aXRoIGl0LiAgKi8KKyAgICAgIHN0cnVjdCB0eXBlICpyYW5nZQorCT0gY3JlYXRlX3JhbmdlX3R5cGUgKDAsIGJ1aWx0aW5fdHlwZV9pbnQsIDAsIGxlbmd0aCAtIDEpOworICAgICAgc3RydWN0IHR5cGUgKmFycmF5ID0gY3JlYXRlX2FycmF5X3R5cGUgKDAsIHZhbHVlMS50eXBlLCByYW5nZSk7CisKKyAgICAgIHZhbHVlLT5raW5kID0gYXhzX2x2YWx1ZV9tZW1vcnk7CisgICAgICB2YWx1ZS0+dHlwZSA9IGFycmF5OworICAgIH0KKyAgfQorfQorCisKKy8qIEVtaXQgY29kZSBmb3IgdGhlIGBzaXplb2YnIG9wZXJhdG9yLgorICAgKlBDIHNob3VsZCBwb2ludCBhdCB0aGUgc3RhcnQgb2YgdGhlIG9wZXJhbmQgZXhwcmVzc2lvbjsgd2UgYWR2YW5jZSBpdAorICAgdG8gdGhlIGZpcnN0IGluc3RydWN0aW9uIGFmdGVyIHRoZSBvcGVyYW5kLiAgKi8KK3N0YXRpYyB2b2lkCitnZW5fc2l6ZW9mIChwYywgYXgsIHZhbHVlKQorICAgICB1bmlvbiBleHBfZWxlbWVudCAqKnBjOworICAgICBzdHJ1Y3QgYWdlbnRfZXhwciAqYXg7CisgICAgIHN0cnVjdCBheHNfdmFsdWUgKnZhbHVlOworeworICAvKiBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSB2YWx1ZSBvZiB0aGUgb3BlcmFuZCBleHByZXNzaW9uOyB3ZSBvbmx5CisgICAgIGNhcmUgYWJvdXQgaXRzIHR5cGUuICBIb3dldmVyLCBpbiB0aGUgY3VycmVudCBhcnJhbmdlbWVudCwgdGhlCisgICAgIG9ubHkgd2F5IHRvIGZpbmQgYW4gZXhwcmVzc2lvbidzIHR5cGUgaXMgdG8gZ2VuZXJhdGUgY29kZSBmb3IgaXQuCisgICAgIFNvIHdlIGdlbmVyYXRlIGNvZGUgZm9yIHRoZSBvcGVyYW5kLCBhbmQgdGhlbiB0aHJvdyBpdCBhd2F5LAorICAgICByZXBsYWNpbmcgaXQgd2l0aCBjb2RlIHRoYXQgc2ltcGx5IHB1c2hlcyBpdHMgc2l6ZS4gICovCisgIGludCBzdGFydCA9IGF4LT5sZW47CisgIGdlbl9leHByIChwYywgYXgsIHZhbHVlKTsKKworICAvKiBUaHJvdyBhd2F5IHRoZSBjb2RlIHdlIGp1c3QgZ2VuZXJhdGVkLiAgKi8KKyAgYXgtPmxlbiA9IHN0YXJ0OworICAKKyAgYXhfY29uc3RfbCAoYXgsIFRZUEVfTEVOR1RIICh2YWx1ZS0+dHlwZSkpOworICB2YWx1ZS0+a2luZCA9IGF4c19ydmFsdWU7CisgIHZhbHVlLT50eXBlID0gYnVpbHRpbl90eXBlX2ludDsKK30KKworDAorLyogR2VuZXJhdGluZyBieXRlY29kZSBmcm9tIEdEQiBleHByZXNzaW9uczogZ2VuZXJhbCByZWN1cnNpdmUgdGhpbmd5ICAqLworCisvKiBBIGdlbl9leHByIGZ1bmN0aW9uIHdyaXR0ZW4gYnkgYSBHZW4tWCdlciBndXkuCisgICBBcHBlbmQgY29kZSBmb3IgdGhlIHN1YmV4cHJlc3Npb24gb2YgRVhQUiBzdGFydGluZyBhdCAqUE9TX1AgdG8gQVguICAqLworc3RhdGljIHZvaWQKK2dlbl9leHByIChwYywgYXgsIHZhbHVlKQorICAgICB1bmlvbiBleHBfZWxlbWVudCAqKnBjOworICAgICBzdHJ1Y3QgYWdlbnRfZXhwciAqYXg7CisgICAgIHN0cnVjdCBheHNfdmFsdWUgKnZhbHVlOworeworICAvKiBVc2VkIHRvIGhvbGQgdGhlIGRlc2NyaXB0aW9ucyBvZiBvcGVyYW5kIGV4cHJlc3Npb25zLiAgKi8KKyAgc3RydWN0IGF4c192YWx1ZSB2YWx1ZTEsIHZhbHVlMjsKKyAgZW51bSBleHBfb3Bjb2RlIG9wID0gKCpwYylbMF0ub3Bjb2RlOworCisgIC8qIElmIHdlJ3JlIGxvb2tpbmcgYXQgYSBjb25zdGFudCBleHByZXNzaW9uLCBqdXN0IHB1c2ggaXRzIHZhbHVlLiAgKi8KKyAgeworICAgIHN0cnVjdCB2YWx1ZSAqdiA9IG1heWJlX2NvbnN0X2V4cHIgKHBjKTsKKyAgICAKKyAgICBpZiAodikKKyAgICAgIHsKKwlheF9jb25zdF9sIChheCwgdmFsdWVfYXNfbG9uZyAodikpOworCXZhbHVlLT5raW5kID0gYXhzX3J2YWx1ZTsKKwl2YWx1ZS0+dHlwZSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKHYpKTsKKwlyZXR1cm47CisgICAgICB9CisgIH0KKworICAvKiBPdGhlcndpc2UsIGdvIGFoZWFkIGFuZCBnZW5lcmF0ZSBjb2RlIGZvciBpdC4gICovCisgIHN3aXRjaCAob3ApCisgICAgeworICAgICAgLyogQmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0b3JzLiAgKi8KKyAgICBjYXNlIEJJTk9QX0FERDoKKyAgICBjYXNlIEJJTk9QX1NVQjoKKyAgICBjYXNlIEJJTk9QX01VTDoKKyAgICBjYXNlIEJJTk9QX0RJVjoKKyAgICBjYXNlIEJJTk9QX1JFTToKKyAgICBjYXNlIEJJTk9QX1NVQlNDUklQVDoKKyAgICBjYXNlIEJJTk9QX0JJVFdJU0VfQU5EOgorICAgIGNhc2UgQklOT1BfQklUV0lTRV9JT1I6CisgICAgY2FzZSBCSU5PUF9CSVRXSVNFX1hPUjoKKyAgICAgICgqcGMpKys7CisgICAgICBnZW5fZXhwciAocGMsIGF4LCAmdmFsdWUxKTsKKyAgICAgIGdlbl91c3VhbF91bmFyeSAoYXgsICZ2YWx1ZTEpOworICAgICAgZ2VuX2V4cHIgKHBjLCBheCwgJnZhbHVlMik7CisgICAgICBnZW5fdXN1YWxfdW5hcnkgKGF4LCAmdmFsdWUyKTsKKyAgICAgIGdlbl91c3VhbF9hcml0aG1ldGljIChheCwgJnZhbHVlMSwgJnZhbHVlMik7CisgICAgICBzd2l0Y2ggKG9wKQorCXsKKwljYXNlIEJJTk9QX0FERDoKKwkgIGdlbl9hZGQgKGF4LCB2YWx1ZSwgJnZhbHVlMSwgJnZhbHVlMiwgImFkZGl0aW9uIik7CisJICBicmVhazsKKwljYXNlIEJJTk9QX1NVQjoKKwkgIGdlbl9zdWIgKGF4LCB2YWx1ZSwgJnZhbHVlMSwgJnZhbHVlMik7CisJICBicmVhazsKKwljYXNlIEJJTk9QX01VTDoKKwkgIGdlbl9iaW5vcCAoYXgsIHZhbHVlLCAmdmFsdWUxLCAmdmFsdWUyLAorCQkgICAgIGFvcF9tdWwsIGFvcF9tdWwsIDEsICJtdWx0aXBsaWNhdGlvbiIpOworCSAgYnJlYWs7CisJY2FzZSBCSU5PUF9ESVY6CisJICBnZW5fYmlub3AgKGF4LCB2YWx1ZSwgJnZhbHVlMSwgJnZhbHVlMiwKKwkJICAgICBhb3BfZGl2X3NpZ25lZCwgYW9wX2Rpdl91bnNpZ25lZCwgMSwgImRpdmlzaW9uIik7CisJICBicmVhazsKKwljYXNlIEJJTk9QX1JFTToKKwkgIGdlbl9iaW5vcCAoYXgsIHZhbHVlLCAmdmFsdWUxLCAmdmFsdWUyLAorCQkgICAgIGFvcF9yZW1fc2lnbmVkLCBhb3BfcmVtX3Vuc2lnbmVkLCAxLCAicmVtYWluZGVyIik7CisJICBicmVhazsKKwljYXNlIEJJTk9QX1NVQlNDUklQVDoKKwkgIGdlbl9hZGQgKGF4LCB2YWx1ZSwgJnZhbHVlMSwgJnZhbHVlMiwgImFycmF5IHN1YnNjcmlwdGluZyIpOworCSAgaWYgKFRZUEVfQ09ERSAodmFsdWUtPnR5cGUpICE9IFRZUEVfQ09ERV9QVFIpCisJICAgIGVycm9yICgiSWxsZWdhbCBjb21iaW5hdGlvbiBvZiB0eXBlcyBpbiBhcnJheSBzdWJzY3JpcHRpbmcuIik7CisJICBnZW5fZGVyZWYgKGF4LCB2YWx1ZSk7CisJICBicmVhazsKKwljYXNlIEJJTk9QX0JJVFdJU0VfQU5EOgorCSAgZ2VuX2Jpbm9wIChheCwgdmFsdWUsICZ2YWx1ZTEsICZ2YWx1ZTIsCisJCSAgICAgYW9wX2JpdF9hbmQsIGFvcF9iaXRfYW5kLCAwLCAiYml0d2lzZSBhbmQiKTsKKwkgIGJyZWFrOworCisJY2FzZSBCSU5PUF9CSVRXSVNFX0lPUjoKKwkgIGdlbl9iaW5vcCAoYXgsIHZhbHVlLCAmdmFsdWUxLCAmdmFsdWUyLAorCQkgICAgIGFvcF9iaXRfb3IsIGFvcF9iaXRfb3IsIDAsICJiaXR3aXNlIG9yIik7CisJICBicmVhazsKKworCWNhc2UgQklOT1BfQklUV0lTRV9YT1I6CisJICBnZW5fYmlub3AgKGF4LCB2YWx1ZSwgJnZhbHVlMSwgJnZhbHVlMiwKKwkJICAgICBhb3BfYml0X3hvciwgYW9wX2JpdF94b3IsIDAsICJiaXR3aXNlIGV4Y2x1c2l2ZS1vciIpOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgLyogV2Ugc2hvdWxkIG9ubHkgbGlzdCBvcGVyYXRvcnMgaW4gdGhlIG91dGVyIGNhc2Ugc3RhdGVtZW50CisgICAgICAgICAgICAgdGhhdCB3ZSBhY3R1YWxseSBoYW5kbGUgaW4gdGhlIGlubmVyIGNhc2Ugc3RhdGVtZW50LiAgKi8KKwkgIGVycm9yICgiR0RCIGJ1ZzogYXgtZ2RiLmMgKGdlbl9leHByKTogb3AgY2FzZSBzZXRzIGRvbid0IG1hdGNoIik7CisJfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIGJlIGEgbGl0dGxlIHN1YnRsZSBhYm91dCBnZW5lcmF0aW5nIGNvZGUKKwkgZm9yIGNvbW1hLiAgSW4gQywgd2UgY2FuIGRvIHNvbWUgb3B0aW1pemF0aW9ucyBoZXJlIGJlY2F1c2UKKwkgd2Uga25vdyB0aGUgbGVmdCBvcGVyYW5kIGlzIG9ubHkgYmVpbmcgZXZhbHVhdGVkIGZvciBlZmZlY3QuCisJIEhvd2V2ZXIsIGlmIHRoZSB0cmFjaW5nIGtsdWRnZSBpcyBpbiBlZmZlY3QsIHRoZW4gd2UgYWx3YXlzCisJIG5lZWQgdG8gZXZhbHVhdGUgdGhlIGxlZnQgaGFuZCBzaWRlIGZ1bGx5LCBzbyB0aGF0IGFsbCB0aGUKKwkgdmFyaWFibGVzIGl0IG1lbnRpb25zIGdldCB0cmFjZWQuICAqLworICAgIGNhc2UgQklOT1BfQ09NTUE6CisgICAgICAoKnBjKSsrOworICAgICAgZ2VuX2V4cHIgKHBjLCBheCwgJnZhbHVlMSk7CisgICAgICAvKiBEb24ndCBqdXN0IGRpc3Bvc2Ugb2YgdGhlIGxlZnQgb3BlcmFuZC4gIFdlIG1pZ2h0IGJlIHRyYWNpbmcsCisJIGluIHdoaWNoIGNhc2Ugd2Ugd2FudCB0byBlbWl0IGNvZGUgdG8gdHJhY2UgaXQgaWYgaXQncyBhbgorCSBsdmFsdWUuICAqLworICAgICAgZ2VuX3RyYWNlZF9wb3AgKGF4LCAmdmFsdWUxKTsKKyAgICAgIGdlbl9leHByIChwYywgYXgsIHZhbHVlKTsKKyAgICAgIC8qIEl0J3MgdGhlIGNvbnN1bWVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gdHJhY2UgdGhlIHJpZ2h0IG9wZXJhbmQuICAqLworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE9QX0xPTkc6CQkvKiBzb21lIGludGVnZXIgY29uc3RhbnQgKi8KKyAgICAgIHsKKwlzdHJ1Y3QgdHlwZSAqdHlwZSA9ICgqcGMpWzFdLnR5cGU7CisJTE9OR0VTVCBrID0gKCpwYylbMl0ubG9uZ2NvbnN0OworCSgqcGMpICs9IDQ7CisJZ2VuX2ludF9saXRlcmFsIChheCwgdmFsdWUsIGssIHR5cGUpOworICAgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSBPUF9WQVJfVkFMVUU6CisgICAgICBnZW5fdmFyX3JlZiAoYXgsIHZhbHVlLCAoKnBjKVsyXS5zeW1ib2wpOworICAgICAgKCpwYykgKz0gNDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUF9SRUdJU1RFUjoKKyAgICAgIHsKKwlpbnQgcmVnID0gKGludCkgKCpwYylbMV0ubG9uZ2NvbnN0OworCSgqcGMpICs9IDM7CisJdmFsdWUtPmtpbmQgPSBheHNfbHZhbHVlX3JlZ2lzdGVyOworCXZhbHVlLT51LnJlZyA9IHJlZzsKKwl2YWx1ZS0+dHlwZSA9IFJFR0lTVEVSX1ZJUlRVQUxfVFlQRSAocmVnKTsKKyAgICAgIH0KKyAgICBicmVhazsKKworICAgIGNhc2UgT1BfSU5URVJOQUxWQVI6CisgICAgICBlcnJvciAoIkdEQiBhZ2VudCBleHByZXNzaW9ucyBjYW5ub3QgdXNlIGNvbnZlbmllbmNlIHZhcmlhYmxlcy4iKTsKKworICAgIC8qIFdlaXJkbyBvcGVyYXRvcjogc2VlIGNvbW1lbnRzIGZvciBnZW5fcmVwZWF0IGZvciBkZXRhaWxzLiAgKi8KKyAgICBjYXNlIEJJTk9QX1JFUEVBVDoKKyAgICAgIC8qIE5vdGUgdGhhdCBnZW5fcmVwZWF0IGhhbmRsZXMgaXRzIG93biBhcmd1bWVudCBldmFsdWF0aW9uLiAgKi8KKyAgICAgICgqcGMpKys7CisgICAgICBnZW5fcmVwZWF0IChwYywgYXgsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBVTk9QX0NBU1Q6CisgICAgICB7CisJc3RydWN0IHR5cGUgKnR5cGUgPSAoKnBjKVsxXS50eXBlOworCSgqcGMpICs9IDM7CisJZ2VuX2V4cHIgKHBjLCBheCwgdmFsdWUpOworCWdlbl9jYXN0IChheCwgdmFsdWUsIHR5cGUpOworICAgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSBVTk9QX01FTVZBTDoKKyAgICAgIHsKKwlzdHJ1Y3QgdHlwZSAqdHlwZSA9IGNoZWNrX3R5cGVkZWYgKCgqcGMpWzFdLnR5cGUpOworCSgqcGMpICs9IDM7CisJZ2VuX2V4cHIgKHBjLCBheCwgdmFsdWUpOworCS8qIEknbSBub3Qgc3VyZSBJIHVuZGVyc3RhbmQgVU5PUF9NRU1WQUwgZW50aXJlbHkuICBJIHRoaW5rCisJICAgaXQncyBqdXN0IGEgaGFjayBmb3IgZGVhbGluZyB3aXRoIG1pbnN5bXM7IHlvdSB0YWtlIHNvbWUKKwkgICBpbnRlZ2VyIGNvbnN0YW50LCBwcmV0ZW5kIGl0J3MgdGhlIGFkZHJlc3Mgb2YgYW4gbHZhbHVlIG9mCisJICAgdGhlIGdpdmVuIHR5cGUsIGFuZCBkZXJlZmVyZW5jZSBpdC4gICovCisJaWYgKHZhbHVlLT5raW5kICE9IGF4c19ydmFsdWUpCisJICAvKiBUaGlzIHdvdWxkIGJlIHdlaXJkLiAgKi8KKwkgIGVycm9yICgiR0RCIGJ1ZzogYXgtZ2RiLmMgKGdlbl9leHByKTogT1BfTUVNVkFMIG9wZXJhbmQgaXNuJ3QgYW4gcnZhbHVlPz8/Iik7CisJdmFsdWUtPnR5cGUgPSB0eXBlOworCXZhbHVlLT5raW5kID0gYXhzX2x2YWx1ZV9tZW1vcnk7CisgICAgICB9CisgICAgYnJlYWs7CisKKyAgICBjYXNlIFVOT1BfTkVHOgorICAgICAgKCpwYykrKzsKKyAgICAgIC8qIC1GT08gaXMgZXF1aXZhbGVudCB0byAwIC0gRk9PLiAgKi8KKyAgICAgIGdlbl9pbnRfbGl0ZXJhbCAoYXgsICZ2YWx1ZTEsIChMT05HRVNUKSAwLCBidWlsdGluX3R5cGVfaW50KTsKKyAgICAgIGdlbl91c3VhbF91bmFyeSAoYXgsICZ2YWx1ZTEpOyAvKiBzaG91bGRuJ3QgZG8gbXVjaCAqLworICAgICAgZ2VuX2V4cHIgKHBjLCBheCwgJnZhbHVlMik7CisgICAgICBnZW5fdXN1YWxfdW5hcnkgKGF4LCAmdmFsdWUyKTsKKyAgICAgIGdlbl91c3VhbF9hcml0aG1ldGljIChheCwgJnZhbHVlMSwgJnZhbHVlMik7CisgICAgICBnZW5fc3ViIChheCwgdmFsdWUsICZ2YWx1ZTEsICZ2YWx1ZTIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFVOT1BfTE9HSUNBTF9OT1Q6CisgICAgICAoKnBjKSsrOworICAgICAgZ2VuX2V4cHIgKHBjLCBheCwgdmFsdWUpOworICAgICAgZ2VuX2xvZ2ljYWxfbm90IChheCwgdmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFVOT1BfQ09NUExFTUVOVDoKKyAgICAgICgqcGMpKys7CisgICAgICBnZW5fZXhwciAocGMsIGF4LCB2YWx1ZSk7CisgICAgICBnZW5fY29tcGxlbWVudCAoYXgsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBVTk9QX0lORDoKKyAgICAgICgqcGMpKys7CisgICAgICBnZW5fZXhwciAocGMsIGF4LCB2YWx1ZSk7CisgICAgICBnZW5fdXN1YWxfdW5hcnkgKGF4LCB2YWx1ZSk7CisgICAgICBpZiAoVFlQRV9DT0RFICh2YWx1ZS0+dHlwZSkgIT0gVFlQRV9DT0RFX1BUUikKKwllcnJvciAoIkFyZ3VtZW50IG9mIHVuYXJ5IGAqJyBpcyBub3QgYSBwb2ludGVyLiIpOworICAgICAgZ2VuX2RlcmVmIChheCwgdmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFVOT1BfQUREUjoKKyAgICAgICgqcGMpKys7CisgICAgICBnZW5fZXhwciAocGMsIGF4LCB2YWx1ZSk7CisgICAgICBnZW5fYWRkcmVzc19vZiAoYXgsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBVTk9QX1NJWkVPRjoKKyAgICAgICgqcGMpKys7CisgICAgICAvKiBOb3RpY2UgdGhhdCBnZW5fc2l6ZW9mIGhhbmRsZXMgaXRzIG93biBvcGVyYW5kLCB1bmxpa2UgbW9zdAorCSBvZiB0aGUgb3RoZXIgdW5hcnkgb3BlcmF0b3IgZnVuY3Rpb25zLiAgVGhpcyBpcyBiZWNhdXNlIHdlCisJIGhhdmUgdG8gdGhyb3cgYXdheSB0aGUgY29kZSB3ZSBnZW5lcmF0ZS4gICovCisgICAgICBnZW5fc2l6ZW9mIChwYywgYXgsIHZhbHVlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTVFJVQ1RPUF9TVFJVQ1Q6CisgICAgY2FzZSBTVFJVQ1RPUF9QVFI6CisgICAgICB7CisJaW50IGxlbmd0aCA9ICgqcGMpWzFdLmxvbmdjb25zdDsKKwljaGFyICpuYW1lID0gJigqcGMpWzJdLnN0cmluZzsKKworCSgqcGMpICs9IDQgKyBCWVRFU19UT19FWFBfRUxFTSAobGVuZ3RoICsgMSk7CisJZ2VuX2V4cHIgKHBjLCBheCwgdmFsdWUpOworCWlmIChvcCA9PSBTVFJVQ1RPUF9TVFJVQ1QpCisJICBnZW5fc3RydWN0X3JlZiAoYXgsIHZhbHVlLCBuYW1lLCAiLiIsICJzdHJ1Y3R1cmUgb3IgdW5pb24iKTsKKwllbHNlIGlmIChvcCA9PSBTVFJVQ1RPUF9QVFIpCisJICBnZW5fc3RydWN0X3JlZiAoYXgsIHZhbHVlLCBuYW1lLCAiLT4iLAorCQkJICAicG9pbnRlciB0byBhIHN0cnVjdHVyZSBvciB1bmlvbiIpOworCWVsc2UKKwkgIC8qIElmIHRoaXMgYGlmJyBjaGFpbiBkb2Vzbid0IGhhbmRsZSBpdCwgdGhlbiB0aGUgY2FzZSBsaXN0CisgICAgICAgICAgICAgc2hvdWxkbid0IG1lbnRpb24gaXQsIGFuZCB3ZSBzaG91bGRuJ3QgYmUgaGVyZS4gICovCisJICBlcnJvciAoIkdEQiBidWc6IGF4LWdkYi5jIChnZW5fZXhwcik6IHVuaGFuZGxlZCBzdHJ1Y3QgY2FzZSIpOworICAgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSBPUF9UWVBFOgorICAgICAgZXJyb3IgKCJBdHRlbXB0IHRvIHVzZSBhIHR5cGUgbmFtZSBhcyBhbiBleHByZXNzaW9uLiIpOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yICgiVW5zdXBwb3J0ZWQgb3BlcmF0b3IgaW4gZXhwcmVzc2lvbi4iKTsKKyAgICB9Cit9CisgICAgIAorCisMCisjaWYgMCAgLyogbm90IHVzZWQgKi8KKy8qIEdlbmVyYXRpbmcgYnl0ZWNvZGUgZnJvbSBHREIgZXhwcmVzc2lvbnM6IGRyaXZlciAqLworCisvKiBHaXZlbiBhIEdEQiBleHByZXNzaW9uIEVYUFIsIHByb2R1Y2UgYSBzdHJpbmcgb2YgYWdlbnQgYnl0ZWNvZGUKKyAgIHdoaWNoIGNvbXB1dGVzIGl0cyB2YWx1ZS4gIFJldHVybiB0aGUgYWdlbnQgZXhwcmVzc2lvbiwgYW5kIHNldAorICAgKlZBTFVFIHRvIGRlc2NyaWJlIGl0cyB0eXBlLCBhbmQgd2hldGhlciBpdCdzIGFuIGx2YWx1ZSBvciBydmFsdWUuICAqLworc3RydWN0IGFnZW50X2V4cHIgKgorZXhwcl90b19hZ2VudCAoZXhwciwgdmFsdWUpCisgICAgIHN0cnVjdCBleHByZXNzaW9uICpleHByOworICAgICBzdHJ1Y3QgYXhzX3ZhbHVlICp2YWx1ZTsKK3sKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbiA9IDA7CisgIHN0cnVjdCBhZ2VudF9leHByICpheCA9IG5ld19hZ2VudF9leHByICgpOworICB1bmlvbiBleHBfZWxlbWVudCAqcGM7CisKKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfYWdlbnRfZXhwciwgYXgpOworCisgIHBjID0gZXhwci0+ZWx0czsKKyAgdHJhY2Vfa2x1ZGdlID0gMDsKKyAgZ2VuX2V4cHIgKCZwYywgYXgsIHZhbHVlKTsKKworICAvKiBXZSBoYXZlIHN1Y2Nlc3NmdWxseSBidWlsdCB0aGUgYWdlbnQgZXhwciwgc28gY2FuY2VsIHRoZSBjbGVhbnVwCisgICAgIHJlcXVlc3QuICBJZiB3ZSBhZGQgbW9yZSBjbGVhbnVwcyB0aGF0IHdlIGFsd2F5cyB3YW50IGRvbmUsIHRoaXMKKyAgICAgd2lsbCBoYXZlIHRvIGdldCBtb3JlIGNvbXBsaWNhdGVkLiAgKi8KKyAgZGlzY2FyZF9jbGVhbnVwcyAob2xkX2NoYWluKTsKKyAgcmV0dXJuIGF4OworfQorCisKKy8qIEdpdmVuIGEgR0RCIGV4cHJlc3Npb24gRVhQUiBkZW5vdGluZyBhbiBsdmFsdWUgaW4gbWVtb3J5LCBwcm9kdWNlIGEKKyAgIHN0cmluZyBvZiBhZ2VudCBieXRlY29kZSB3aGljaCB3aWxsIGxlYXZlIGl0cyBhZGRyZXNzIGFuZCBzaXplIG9uCisgICB0aGUgdG9wIG9mIHN0YWNrLiAgUmV0dXJuIHRoZSBhZ2VudCBleHByZXNzaW9uLgorCisgICBOb3Qgc3VyZSB0aGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBhdCBhbGwuICAqLworc3RydWN0IGFnZW50X2V4cHIgKgorZXhwcl90b19hZGRyZXNzX2FuZF9zaXplIChleHByKQorICAgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwcjsKK3sKKyAgc3RydWN0IGF4c192YWx1ZSB2YWx1ZTsKKyAgc3RydWN0IGFnZW50X2V4cHIgKmF4ID0gZXhwcl90b19hZ2VudCAoZXhwciwgJnZhbHVlKTsKKworICAvKiBDb21wbGFpbiBpZiB0aGUgcmVzdWx0IGlzIG5vdCBhIG1lbW9yeSBsdmFsdWUuICAqLworICBpZiAodmFsdWUua2luZCAhPSBheHNfbHZhbHVlX21lbW9yeSkKKyAgICB7CisgICAgICBmcmVlX2FnZW50X2V4cHIgKGF4KTsKKyAgICAgIGVycm9yICgiRXhwcmVzc2lvbiBkb2VzIG5vdCBkZW5vdGUgYW4gb2JqZWN0IGluIG1lbW9yeS4iKTsKKyAgICB9CisKKyAgLyogUHVzaCB0aGUgb2JqZWN0J3Mgc2l6ZSBvbiB0aGUgc3RhY2suICAqLworICBheF9jb25zdF9sIChheCwgVFlQRV9MRU5HVEggKHZhbHVlLnR5cGUpKTsKKworICByZXR1cm4gYXg7Cit9CisjZW5kaWYgLyogMCAqLworCisvKiBHaXZlbiBhIEdEQiBleHByZXNzaW9uIEVYUFIsIHJldHVybiBieXRlY29kZSB0byB0cmFjZSBpdHMgdmFsdWUuCisgICBUaGUgcmVzdWx0IHdpbGwgdXNlIHRoZSBgdHJhY2UnIGFuZCBgdHJhY2VfcXVpY2snIGJ5dGVjb2RlcyB0bworICAgcmVjb3JkIHRoZSB2YWx1ZSBvZiBhbGwgbWVtb3J5IHRvdWNoZWQgYnkgdGhlIGV4cHJlc3Npb24uICBUaGUKKyAgIGNhbGxlciBjYW4gdGhlbiB1c2UgdGhlIGF4X3JlcXMgZnVuY3Rpb24gdG8gZGlzY292ZXIgd2hpY2gKKyAgIHJlZ2lzdGVycyBpdCByZWxpZXMgdXBvbi4gICovCitzdHJ1Y3QgYWdlbnRfZXhwciAqCitnZW5fdHJhY2VfZm9yX2V4cHIgKHNjb3BlLCBleHByKQorICAgICBDT1JFX0FERFIgc2NvcGU7CisgICAgIHN0cnVjdCBleHByZXNzaW9uICpleHByOworeworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluID0gMDsKKyAgc3RydWN0IGFnZW50X2V4cHIgKmF4ID0gbmV3X2FnZW50X2V4cHIgKHNjb3BlKTsKKyAgdW5pb24gZXhwX2VsZW1lbnQgKnBjOworICBzdHJ1Y3QgYXhzX3ZhbHVlIHZhbHVlOworCisgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlX2FnZW50X2V4cHIsIGF4KTsKKworICBwYyA9IGV4cHItPmVsdHM7CisgIHRyYWNlX2tsdWRnZSA9IDE7CisgIGdlbl9leHByICgmcGMsIGF4LCAmdmFsdWUpOworCisgIC8qIE1ha2Ugc3VyZSB3ZSByZWNvcmQgdGhlIGZpbmFsIG9iamVjdCwgYW5kIGdldCByaWQgb2YgaXQuICAqLworICBnZW5fdHJhY2VkX3BvcCAoYXgsICZ2YWx1ZSk7CisKKyAgLyogT2gsIGFuZCB0ZXJtaW5hdGUuICAqLworICBheF9zaW1wbGUgKGF4LCBhb3BfZW5kKTsKKworICAvKiBXZSBoYXZlIHN1Y2Nlc3NmdWxseSBidWlsdCB0aGUgYWdlbnQgZXhwciwgc28gY2FuY2VsIHRoZSBjbGVhbnVwCisgICAgIHJlcXVlc3QuICBJZiB3ZSBhZGQgbW9yZSBjbGVhbnVwcyB0aGF0IHdlIGFsd2F5cyB3YW50IGRvbmUsIHRoaXMKKyAgICAgd2lsbCBoYXZlIHRvIGdldCBtb3JlIGNvbXBsaWNhdGVkLiAgKi8KKyAgZGlzY2FyZF9jbGVhbnVwcyAob2xkX2NoYWluKTsKKyAgcmV0dXJuIGF4OworfQorCisKKwwKKy8qIFRoZSAiYWdlbnQiIGNvbW1hbmQsIGZvciB0ZXN0aW5nOiBjb21waWxlIGFuZCBkaXNhc3NlbWJsZSBhbiBleHByZXNzaW9uLiAgKi8KKworc3RhdGljIHZvaWQKK3ByaW50X2F4c192YWx1ZSAoZiwgdmFsdWUpCisgICAgIEdEQl9GSUxFICpmOworICAgICBzdHJ1Y3QgYXhzX3ZhbHVlICp2YWx1ZTsKK3sKKyAgc3dpdGNoICh2YWx1ZS0+a2luZCkKKyAgICB7CisgICAgY2FzZSBheHNfcnZhbHVlOgorICAgICAgZnB1dHNfZmlsdGVyZWQgKCJydmFsdWUiLCBmKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBheHNfbHZhbHVlX21lbW9yeToKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgibWVtb3J5IGx2YWx1ZSIsIGYpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGF4c19sdmFsdWVfcmVnaXN0ZXI6CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChmLCAicmVnaXN0ZXIgJWQgbHZhbHVlIiwgdmFsdWUtPnUucmVnKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBmcHV0c19maWx0ZXJlZCAoIiA6ICIsIGYpOworICB0eXBlX3ByaW50ICh2YWx1ZS0+dHlwZSwgIiIsIGYsIC0xKTsKK30KKworCitzdGF0aWMgdm9pZAorYWdlbnRfY29tbWFuZCAoZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW4gPSAwOworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwcjsKKyAgc3RydWN0IGFnZW50X2V4cHIgKmFnZW50OworICBzdHJ1Y3QgYWdlbnRfcmVxcyByZXFzOworICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmkgPSBnZXRfY3VycmVudF9mcmFtZSAoKTsJLyogbmVlZCBjdXJyZW50IHNjb3BlICovCisKKyAgLyogV2UgZG9uJ3QgZGVhbCB3aXRoIG92ZXJsYXkgZGVidWdnaW5nIGF0IHRoZSBtb21lbnQuICBXZSBuZWVkIHRvCisgICAgIHRoaW5rIG1vcmUgY2FyZWZ1bGx5IGFib3V0IHRoaXMuICBJZiB5b3UgY29weSB0aGlzIGNvZGUgaW50bworICAgICBhbm90aGVyIGNvbW1hbmQsIGNoYW5nZSB0aGUgZXJyb3IgbWVzc2FnZTsgdGhlIHVzZXIgc2hvdWxkbid0CisgICAgIGhhdmUgdG8ga25vdyBhbnl0aGluZyBhYm91dCBhZ2VudCBleHByZXNzaW9ucy4gICovCisgIGlmIChvdmVybGF5X2RlYnVnZ2luZykKKyAgICBlcnJvciAoIkdEQiBjYW4ndCBkbyBhZ2VudCBleHByZXNzaW9uIHRyYW5zbGF0aW9uIHdpdGggb3ZlcmxheXMuIik7CisKKyAgaWYgKGV4cCA9PSAwKQorICAgIGVycm9yX25vX2FyZyAoImV4cHJlc3Npb24gdG8gdHJhbnNsYXRlIik7CisgIAorICBleHByID0gcGFyc2VfZXhwcmVzc2lvbiAoZXhwKTsKKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfY3VycmVudF9jb250ZW50cywgJmV4cHIpOworICBhZ2VudCA9IGdlbl90cmFjZV9mb3JfZXhwciAoZmktPnBjLCBleHByKTsKKyAgbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfYWdlbnRfZXhwciwgYWdlbnQpOworICBheF9wcmludCAoZ2RiX3N0ZG91dCwgYWdlbnQpOworICBheF9yZXFzIChhZ2VudCwgJnJlcXMpOworCisgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworICBkb250X3JlcGVhdCAoKTsKK30KKworDAorLyogSW5pdGlhbGl6YXRpb24gY29kZS4gICovCisKK3ZvaWQgX2luaXRpYWxpemVfYXhfZ2RiIFBBUkFNUyAoKHZvaWQpKTsKK3ZvaWQKK19pbml0aWFsaXplX2F4X2dkYiAoKQoreworICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqYzsKKworICBhZGRfY21kICgiYWdlbnQiLCBjbGFzc19tYWludGVuYW5jZSwgYWdlbnRfY29tbWFuZCwKKwkgICAiVHJhbnNsYXRlIGFuIGV4cHJlc3Npb24gaW50byByZW1vdGUgYWdlbnQgYnl0ZWNvZGUuIiwKKwkgICAmbWFpbnRlbmFuY2VsaXN0KTsKK30KZGlmZiAtLWdpdCBhL2dkYi9heC1nZGIuaCBiL2dkYi9heC1nZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2E3MGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2F4LWdkYi5oCkBAIC0wLDAgKzEsMTExIEBACisvKiBHREItc3BlY2lmaWMgZnVuY3Rpb25zIGZvciBvcGVyYXRpbmcgb24gYWdlbnQgZXhwcmVzc2lvbnMKKyAgIENvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qICRJZCQgKi8KKworI2lmbmRlZiBBWF9HREJfSAorI2RlZmluZSBBWF9HREJfSAorCisMCisvKiBUeXBlcyBhbmQgZW51bXMgKi8KKworLyogR0RCIHN0b3JlcyBleHByZXNzaW9ucyBpbiB0aGUgZm9ybSBvZiBhIGZsYXR0ZW5lZCB0cmVlIChzdHJ1Y3QKKyAgIGV4cHJlc3Npb24pLCBzbyB3ZSBqdXN0IHdhbGsgdGhhdCB0cmVlIGFuZCBnZW5lcmF0ZSBhZ2VudCBieXRlY29kZXMKKyAgIGFzIHdlIGdvIGFsb25nLgorCisgICBHREIncyBub3JtYWwgZXZhbHVhdGlvbiB1c2VzIHN0cnVjdCB2YWx1ZSwgd2hpY2ggY29udGFpbnMgdGhlCisgICBleHByZXNzaW9uJ3MgdmFsdWUgYXMgd2VsbCBhcyBpdHMgYWRkcmVzcyBvciB0aGUgcmVnaXN0ZXIgaXQgY2FtZQorICAgZnJvbS4gIFRoZSBgKycgb3BlcmF0b3IgdXNlcyB0aGUgdmFsdWUsIHdoZXJlYXMgdGhlIHVuYXJ5IGAmJworICAgb3BlcmF0b3Igd2lsbCB1c2UgdGhlIGFkZHJlc3MgcG9ydGlvbi4gIFRoZSBgPScgb3BlcmF0b3Igd2lsbCB1c2UKKyAgIHRoZSBhZGRyZXNzIG9yIHJlZ2lzdGVyIG51bWJlciBvZiBpdHMgbGVmdCBoYW5kIHNpZGUuCisKKyAgIFRoZSBpc3N1ZXMgYXJlIGRpZmZlcmVudCB3aGVuIGdlbmVyYXRpbmcgYWdlbnQgYnl0ZWNvZGUuICBHaXZlbiBhCisgICB2YXJpYWJsZSByZWZlcmVuY2UgZXhwcmVzc2lvbiwgd2Ugc2hvdWxkIG5vdCBuZWNlc3NhcmlseSBnZW5lcmF0ZQorICAgY29kZSB0byBmZXRjaCBpdHMgdmFsdWUsIGJlY2F1c2UgdGhlIG5leHQgb3BlcmF0b3IgbWF5IGJlIGA9JyBvcgorICAgdW5hcnkgYCYnLiAgSW5zdGVhZCwgd2hlbiB3ZSByZWN1cnNlIG9uIGEgc3ViZXhwcmVzc2lvbiwgd2UKKyAgIGluZGljYXRlIHdoZXRoZXIgd2Ugd2FudCB0aGF0IGV4cHJlc3Npb24gdG8gcHJvZHVjZSBhbiBsdmFsdWUgb3IgYW4KKyAgIHJ2YWx1ZS4gIElmIHdlIHJlcXVlc3RlZCBhbiBsdmFsdWUsIHRoZW4gdGhlIHJlY3Vyc2l2ZSBjYWxsIHRlbGxzCisgICB1cyB3aGV0aGVyIGl0IGdlbmVyYXRlZCBjb2RlIHRvIGNvbXB1dGUgYW4gYWRkcmVzcyBvbiB0aGUgc3RhY2ssIG9yCisgICB3aGV0aGVyIHRoZSBsdmFsdWUgbGl2ZXMgaW4gYSByZWdpc3Rlci4KKworICAgVGhlIGBheHMnIHByZWZpeCBoZXJlIG1lYW5zIGBhZ2VudCBleHByZXNzaW9uLCBzdGF0aWMnLCBiZWNhdXNlCisgICB0aGlzIGlzIGFsbCBzdGF0aWMgYW5hbHlzaXMgb2YgdGhlIGV4cHJlc3Npb24sIGkuZS4gYW5hbHlzaXMgd2hpY2gKKyAgIGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSBjb250ZW50cyBvZiBtZW1vcnkgYW5kIHJlZ2lzdGVycy4gICovCisKKworLyogRGlmZmVyZW50IGtpbmRzIG9mIGFnZW50IGV4cHJlc3Npb24gc3RhdGljIHZhbHVlcy4gICovCitlbnVtIGF4c19sdmFsdWVfa2luZCB7CisgIC8qIFdlIGdlbmVyYXRlZCBjb2RlIHRvIGNvbXB1dGUgdGhlIHN1YmV4cHJlc3Npb24ncyB2YWx1ZS4KKyAgICAgQ29uc3RhbnRzIGFuZCBhcml0aG1ldGljIG9wZXJhdG9ycyB5aWVsZCB0aGlzLiAgKi8KKyAgYXhzX3J2YWx1ZSwKKworICAvKiBXZSBnZW5lcmF0ZWQgY29kZSB0byB5aWVsZCB0aGUgc3ViZXhwcmVzc2lvbidzIHZhbHVlJ3MgYWRkcmVzcyBvbgorICAgICB0aGUgdG9wIG9mIHRoZSBzdGFjay4gIElmIHRoZSBjYWxsZXIgbmVlZHMgYW4gcnZhbHVlLCBpdCBzaG91bGQKKyAgICAgY2FsbCByZXF1aXJlX3J2YWx1ZSB0byBwcm9kdWNlIHRoZSBydmFsdWUgZnJvbSB0aGlzIGFkZHJlc3MuICAqLworICBheHNfbHZhbHVlX21lbW9yeSwKKworICAvKiBXZSBkaWRuJ3QgZ2VuZXJhdGUgYW55IGNvZGUsIGFuZCB0aGUgc3RhY2sgaXMgdW5kaXN0dXJiZWQsCisgICAgIGJlY2F1c2UgdGhlIHN1YmV4cHJlc3Npb24ncyB2YWx1ZSBsaXZlcyBpbiBhIHJlZ2lzdGVyOyB1LnJlZyBpcworICAgICB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAgSWYgdGhlIGNhbGxlciBuZWVkcyBhbiBydmFsdWUsIGl0IHNob3VsZAorICAgICBjYWxsIHJlcXVpcmVfcnZhbHVlIHRvIHByb2R1Y2UgdGhlIHJ2YWx1ZSBmcm9tIHRoaXMgcmVnaXN0ZXIKKyAgICAgbnVtYmVyLiAgKi8KKyAgYXhzX2x2YWx1ZV9yZWdpc3RlcgorfTsKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgd2hhdCB3ZSBnb3QgZnJvbSBhIHN1YmV4cHJlc3Npb24uICBUaGluayBvZgorICAgdGhpcyBhcyBwYXJhbGxlbCB0byB2YWx1ZS5oJ3MgZW51bSBsdmFsX3R5cGUsIGV4Y2VwdCB0aGF0IHdlJ3JlCisgICBkZXNjcmliaW5nIGEgdmFsdWUgd2hpY2ggd2lsbCBleGlzdCB3aGVuIHRoZSBleHByZXNzaW9uIGlzCisgICBldmFsdWF0ZWQgaW4gdGhlIGZ1dHVyZSwgbm90IGEgdmFsdWUgd2UgaGF2ZSBpbiBvdXIgaGFuZC4gICovCitzdHJ1Y3QgYXhzX3ZhbHVlIHsKKyAgZW51bSBheHNfbHZhbHVlX2tpbmQga2luZDsJLyogc2VlIGFib3ZlICovCisKKyAgLyogVGhlIHR5cGUgb2YgdGhlIHN1YmV4cHJlc3Npb24uICBFdmVuIGlmIGx2YWx1ZSA9PSBheHNfbHZhbHVlX21lbW9yeSwKKyAgICAgdGhpcyBpcyB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgaXRzZWxmOyB0aGUgdmFsdWUgb24gdGhlIHN0YWNrIGlzIGEKKyAgICAgInBvaW50ZXIgdG8iIGFuIG9iamVjdCBvZiB0aGlzIHR5cGUuICovCisgIHN0cnVjdCB0eXBlICp0eXBlOworCisgIHVuaW9uIHsKKyAgICAvKiBpZiBraW5kID09IGF4c19sdmFsdWVfcmVnaXN0ZXIsIHRoaXMgaXMgdGhlIHJlZ2lzdGVyIG51bWJlciAqLworICAgIGludCByZWc7CisgIH0gdTsKK307CisKKwwKKy8qIFRyYW5zbGF0aW5nIEdEQiBleHByZXNzaW9ucyBpbnRvIGFnZW50IGV4cHJlc3Npb25zLiAgKi8KKworLyogR2l2ZW4gYSBHREIgZXhwcmVzc2lvbiBFWFBSLCB0cmFuc2xhdGUgaXQgaW50byB0aGUgYWdlbnQgYnl0ZWNvZGUsCisgICBhbmQgcmV0dXJuIGl0LiAgRkxBR1MgYXJlIGZyb20gZW51bSBleHByX3RvX2FnZW50X2ZsYWdzLiAgKi8KK2V4dGVybiBzdHJ1Y3QgYWdlbnRfZXhwciAqZXhwcl90b19hZ2VudCBQQVJBTVMgKChzdHJ1Y3QgZXhwcmVzc2lvbiAqRVhQUiwKKwkJCQkJCSBzdHJ1Y3QgYXhzX3ZhbHVlICpWQUxVRSkpOworCisvKiBHaXZlbiBhIEdEQiBleHByZXNzaW9uIEVYUFIgZGVub3RpbmcgYW4gbHZhbHVlIGluIG1lbW9yeSwgcHJvZHVjZSBhCisgICBzdHJpbmcgb2YgYWdlbnQgYnl0ZWNvZGUgd2hpY2ggd2lsbCBsZWF2ZSBpdHMgYWRkcmVzcyBhbmQgc2l6ZSBvbgorICAgdGhlIHRvcCBvZiBzdGFjay4gIFJldHVybiB0aGUgYWdlbnQgZXhwcmVzc2lvbi4gICovCitleHRlcm4gc3RydWN0IGFnZW50X2V4cHIgKmV4cHJfdG9fYWRkcmVzc19hbmRfc2l6ZQorCQkJICBQQVJBTVMgKChzdHJ1Y3QgZXhwcmVzc2lvbiAqRVhQUikpOworCisvKiBHaXZlbiBhIEdEQiBleHByZXNzaW9uIEVYUFIsIHJldHVybiBieXRlY29kZSB0byB0cmFjZSBpdHMgdmFsdWUuCisgICBUaGUgcmVzdWx0IHdpbGwgdXNlIHRoZSBgdHJhY2UnIGFuZCBgdHJhY2VfcXVpY2snIGJ5dGVjb2RlcyB0bworICAgcmVjb3JkIHRoZSB2YWx1ZSBvZiBhbGwgbWVtb3J5IHRvdWNoZWQgYnkgdGhlIGV4cHJlc3Npb24sIGFuZCBsZWF2ZQorICAgbm8gdmFsdWVzIG9uIHRoZSBzdGFjay4gIFRoZSBjYWxsZXIgY2FuIHRoZW4gdXNlIHRoZSBheF9yZXFzCisgICBmdW5jdGlvbiB0byBkaXNjb3ZlciB3aGljaCByZWdpc3RlcnMgdGhlIGV4cHJlc3Npb24gdXNlcy4gICovCitleHRlcm4gc3RydWN0IGFnZW50X2V4cHIgKmdlbl90cmFjZV9mb3JfZXhwciBQQVJBTVMgKChDT1JFX0FERFIsIAorCQkJCQkJICAgICAgc3RydWN0IGV4cHJlc3Npb24gKikpOworCisjZW5kaWYgLyogQVhfR0RCX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9heC1nZW5lcmFsLmMgYi9nZGIvYXgtZ2VuZXJhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZTliYjQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvYXgtZ2VuZXJhbC5jCkBAIC0wLDAgKzEsNTUyIEBACisvKiBGdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBleHByZXNzaW9ucyBkZXNpZ25lZCB0byBiZSBleGVjdXRlZCBvbiB0aGUgYWdlbnQKKyAgIENvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qICRJZCQgKi8KKworLyogRGVzcGl0ZSB3aGF0IHRoZSBhYm92ZSBjb21tZW50IHNheXMgYWJvdXQgdGhpcyBmaWxlIGJlaW5nIHBhcnQgb2YKKyAgIEdEQiwgd2Ugd291bGQgbGlrZSB0byBrZWVwIHRoZXNlIGZ1bmN0aW9ucyBmcmVlIG9mIEdEQgorICAgZGVwZW5kZW5jaWVzLCBzaW5jZSB3ZSB3YW50IHRvIGJlIGFibGUgdG8gdXNlIHRoZW0gaW4gY29udGV4dHMKKyAgIG91dHNpZGUgb2YgR0RCICh0ZXN0IHN1aXRlcywgdGhlIHN0dWIsIGV0Yy4pICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImF4LmgiCisKKwwKKy8qIEZ1bmN0aW9ucyBmb3IgYnVpbGRpbmcgZXhwcmVzc2lvbnMuICAqLworCisvKiBBbGxvY2F0ZSBhIG5ldywgZW1wdHkgYWdlbnQgZXhwcmVzc2lvbi4gICovCitzdHJ1Y3QgYWdlbnRfZXhwciAqCituZXdfYWdlbnRfZXhwciAoc2NvcGUpCisgICAgIENPUkVfQUREUiBzY29wZTsKK3sKKyAgc3RydWN0IGFnZW50X2V4cHIgKnggPSB4bWFsbG9jIChzaXplb2YgKCp4KSk7CisgIHgtPmxlbiAgPSAwOworICB4LT5zaXplID0gMTsJCQkvKiBDaGFuZ2UgdGhpcyB0byBhIGxhcmdlciB2YWx1ZSBvbmNlCisJCQkJICAgcmVhbGxvY2F0aW9uIGNvZGUgaXMgdGVzdGVkLiAgKi8KKyAgeC0+YnVmICAgPSB4bWFsbG9jICh4LT5zaXplKTsKKyAgeC0+c2NvcGUgPSBzY29wZTsKKworICByZXR1cm4geDsKK30KKworLyogRnJlZSBhIGFnZW50IGV4cHJlc3Npb24uICAqLwordm9pZAorZnJlZV9hZ2VudF9leHByICh4KQorICAgICBzdHJ1Y3QgYWdlbnRfZXhwciAqeDsKK3sKKyAgZnJlZSAoeC0+YnVmKTsKKyAgZnJlZSAoeCk7Cit9CisKKworLyogTWFrZSBzdXJlIHRoYXQgWCBoYXMgcm9vbSBmb3IgYXQgbGVhc3QgTiBtb3JlIGJ5dGVzLiAgVGhpcyBkb2Vzbid0CisgICBhZmZlY3QgdGhlIGxlbmd0aCwganVzdCB0aGUgYWxsb2NhdGVkIHNpemUuICAqLworc3RhdGljIHZvaWQKK2dyb3dfZXhwciAoeCwgbikKKyAgICAgc3RydWN0IGFnZW50X2V4cHIgKng7CisgICAgIGludCBuOworeworICBpZiAoeC0+bGVuICsgbiA+IHgtPnNpemUpCisgICAgeworICAgICAgeC0+c2l6ZSAqPSAyOworICAgICAgaWYgKHgtPnNpemUgPCB4LT5sZW4gKyBuKQorCXgtPnNpemUgPSB4LT5sZW4gKyBuICsgMTA7CisgICAgICB4LT5idWYgPSB4cmVhbGxvYyAoeC0+YnVmLCB4LT5zaXplKTsKKyAgICB9Cit9CisKKworLyogQXBwZW5kIHRoZSBsb3cgTiBieXRlcyBvZiBWQUwgYXMgYW4gTi1ieXRlIGludGVnZXIgdG8gdGhlCisgICBleHByZXNzaW9uIFgsIGluIGJpZy1lbmRpYW4gb3JkZXIuICAqLworc3RhdGljIHZvaWQKK2FwcGVuZF9jb25zdCAoeCwgdmFsLCBuKQorICAgICBzdHJ1Y3QgYWdlbnRfZXhwciAqeDsKKyAgICAgTE9OR0VTVCB2YWw7CisgICAgIGludCBuOworeworICBpbnQgaTsKKworICBncm93X2V4cHIgKHgsIG4pOworICBmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgeworICAgICAgeC0+YnVmW3gtPmxlbiArIGldID0gdmFsICYgMHhmZjsKKyAgICAgIHZhbCA+Pj0gODsKKyAgICB9CisgIHgtPmxlbiArPSBuOworfQorCisKKy8qIEV4dHJhY3QgYW4gTi1ieXRlIGJpZy1lbmRpYW4gdW5zaWduZWQgaW50ZWdlciBmcm9tIGV4cHJlc3Npb24gWCBhdAorICAgb2Zmc2V0IE8uICAqLworc3RhdGljIExPTkdFU1QKK3JlYWRfY29uc3QgKHgsIG8sIG4pCisgICAgIHN0cnVjdCBhZ2VudF9leHByICp4OworICAgICBpbnQgbywgbjsKK3sKKyAgaW50IGk7CisgIExPTkdFU1QgYWNjdW0gPSAwOworCisgIC8qIE1ha2Ugc3VyZSB3ZSdyZSBub3QgcmVhZGluZyBvZmYgdGhlIGVuZCBvZiB0aGUgZXhwcmVzc2lvbi4gICovCisgIGlmIChvICsgbiA+IHgtPmxlbikKKyAgICBlcnJvciAoIkdEQiBidWc6IGF4LWdlbmVyYWwuYyAocmVhZF9jb25zdCk6IGluY29tcGxldGUgY29uc3RhbnQiKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIGFjY3VtID0gKGFjY3VtIDw8IDgpIHwgeC0+YnVmW28gKyBpXTsKKyAgCisgIHJldHVybiBhY2N1bTsKK30KKworCisvKiBBcHBlbmQgYSBzaW1wbGUgb3BlcmF0b3IgT1AgdG8gRVhQUi4gICovCit2b2lkCitheF9zaW1wbGUgKHgsIG9wKQorICAgICBzdHJ1Y3QgYWdlbnRfZXhwciAqeDsKKyAgICAgZW51bSBhZ2VudF9vcCBvcDsKK3sKKyAgZ3Jvd19leHByICh4LCAxKTsKKyAgeC0+YnVmW3gtPmxlbisrXSA9IG9wOworfQorCisKKy8qIEFwcGVuZCBhIHNpZ24tZXh0ZW5zaW9uIG9yIHplcm8tZXh0ZW5zaW9uIGluc3RydWN0aW9uIHRvIEVYUFIsIHRvCisgICBleHRlbmQgYW4gTi1iaXQgdmFsdWUuICAqLworc3RhdGljIHZvaWQKK2dlbmVyaWNfZXh0ICh4LCBvcCwgbikKKyAgICAgc3RydWN0IGFnZW50X2V4cHIgKng7CisgICAgIGVudW0gYWdlbnRfb3Agb3A7CisgICAgIGludCBuOworeworICAvKiBOIG11c3QgZml0IGluIGEgYnl0ZS4gICovCisgIGlmIChuIDwgMCB8fCBuID4gMjU1KQorICAgIGVycm9yICgiR0RCIGJ1ZzogYXgtZ2VuZXJhbC5jIChnZW5lcmljX2V4dCk6IGJpdCBjb3VudCBvdXQgb2YgcmFuZ2UiKTsKKyAgLyogVGhhdCBoYWQgYmV0dGVyIGJlIGVub3VnaCByYW5nZS4gICovCisgIGlmIChzaXplb2YgKExPTkdFU1QpICogOCA+IDI1NSkKKyAgICBlcnJvciAoIkdEQiBidWc6IGF4LWdlbmVyYWwuYyAoZ2VuZXJpY19leHQpOiBvcGNvZGUgaGFzIGluYWRlcXVhdGUgcmFuZ2UiKTsKKworICBncm93X2V4cHIgKHgsIDIpOworICB4LT5idWZbeC0+bGVuKytdID0gb3A7CisgIHgtPmJ1Zlt4LT5sZW4rK10gPSBuOworfQorCisKKy8qIEFwcGVuZCBhIHNpZ24tZXh0ZW5zaW9uIGluc3RydWN0aW9uIHRvIEVYUFIsIHRvIGV4dGVuZCBhbiBOLWJpdCB2YWx1ZS4gICovCit2b2lkCitheF9leHQgKHgsIG4pCisgICAgIHN0cnVjdCBhZ2VudF9leHByICp4OworICAgICBpbnQgbjsKK3sKKyAgZ2VuZXJpY19leHQgKHgsIGFvcF9leHQsIG4pOworfQorCisKKy8qIEFwcGVuZCBhIHplcm8tZXh0ZW5zaW9uIGluc3RydWN0aW9uIHRvIEVYUFIsIHRvIGV4dGVuZCBhbiBOLWJpdCB2YWx1ZS4gICovCit2b2lkCitheF96ZXJvX2V4dCAoeCwgbikKKyAgICAgc3RydWN0IGFnZW50X2V4cHIgKng7CisgICAgIGludCBuOworeworICBnZW5lcmljX2V4dCAoeCwgYW9wX3plcm9fZXh0LCBuKTsKK30KKworCisvKiBBcHBlbmQgYSB0cmFjZV9xdWljayBpbnN0cnVjdGlvbiB0byBFWFBSLCB0byByZWNvcmQgTiBieXRlcy4gICovCit2b2lkCitheF90cmFjZV9xdWljayAoeCwgbikKKyAgICAgc3RydWN0IGFnZW50X2V4cHIgKng7CisgICAgIGludCBuOworeworICAvKiBOIG11c3QgZml0IGluIGEgYnl0ZS4gICovCisgIGlmIChuIDwgMCB8fCBuID4gMjU1KQorICAgIGVycm9yICgiR0RCIGJ1ZzogYXgtZ2VuZXJhbC5jIChheF90cmFjZV9xdWljayk6IHNpemUgb3V0IG9mIHJhbmdlIGZvciB0cmFjZV9xdWljayIpOworCisgIGdyb3dfZXhwciAoeCwgMik7CisgIHgtPmJ1Zlt4LT5sZW4rK10gPSBhb3BfdHJhY2VfcXVpY2s7CisgIHgtPmJ1Zlt4LT5sZW4rK10gPSBuOworfQorCisKKy8qIEFwcGVuZCBhIGdvdG8gb3AgdG8gRVhQUi4gIE9QIGlzIHRoZSBhY3R1YWwgb3AgKG11c3QgYmUgYW9wX2dvdG8gb3IKKyAgIGFvcF9pZl9nb3RvKS4gIFdlIGFzc3VtZSB3ZSBkb24ndCBrbm93IHRoZSB0YXJnZXQgb2Zmc2V0IHlldCwKKyAgIGJlY2F1c2UgaXQncyBwcm9iYWJseSBhIGZvcndhcmQgYnJhbmNoLCBzbyB3ZSBsZWF2ZSBzcGFjZSBpbiBFWFBSCisgICBmb3IgdGhlIHRhcmdldCwgYW5kIHJldHVybiB0aGUgb2Zmc2V0IGluIEVYUFIgb2YgdGhhdCBzcGFjZSwgc28gd2UKKyAgIGNhbiBiYWNrcGF0Y2ggaXQgb25jZSB3ZSBkbyBrbm93IHRoZSB0YXJnZXQgb2Zmc2V0LiAgVXNlIGF4X2xhYmVsCisgICB0byBkbyB0aGUgYmFja3BhdGNoaW5nLiAgKi8KK2ludCBheF9nb3RvICh4LCBvcCkKKyAgICAgc3RydWN0IGFnZW50X2V4cHIgKng7CisgICAgIGVudW0gYWdlbnRfb3Agb3A7Cit7CisgIGdyb3dfZXhwciAoeCwgMyk7CisgIHgtPmJ1Zlt4LT5sZW4gKyAwXSA9IG9wOworICB4LT5idWZbeC0+bGVuICsgMV0gPSAweGZmOworICB4LT5idWZbeC0+bGVuICsgMl0gPSAweGZmOworICB4LT5sZW4gKz0gMzsKKyAgcmV0dXJuIHgtPmxlbiAtIDI7Cit9CisKKy8qIFN1cHBvc2UgYSBnaXZlbiBjYWxsIHRvIGF4X2dvdG8gcmV0dXJucyBzb21lIHZhbHVlIFBBVENILiAgV2hlbiB5b3UKKyAgIGtub3cgdGhlIG9mZnNldCBUQVJHRVQgdGhhdCBnb3RvIHNob3VsZCBqdW1wIHRvLCBjYWxsCisJYXhfbGFiZWwgKEVYUFIsIFBBVENILCBUQVJHRVQpCisgICB0byBwYXRjaCBUQVJHRVQgaW50byB0aGUgYXhfZ290byBpbnN0cnVjdGlvbi4gICovCit2b2lkCitheF9sYWJlbCAoeCwgcGF0Y2gsIHRhcmdldCkKKyAgICAgc3RydWN0IGFnZW50X2V4cHIgKng7CisgICAgIGludCBwYXRjaDsKKyAgICAgaW50IHRhcmdldDsKK3sKKyAgLyogTWFrZSBzdXJlIHRoZSB2YWx1ZSBpcyBpbiByYW5nZS4gIERvbid0IGFjY2VwdCAweGZmZmYgYXMgYW4KKyAgICAgb2Zmc2V0OyB0aGF0J3Mgb3VyIG1hZ2ljIHNlbnRpbmVsIHZhbHVlIGZvciB1bnBhdGNoZWQgYnJhbmNoZXMuICAqLworICBpZiAodGFyZ2V0IDwgMCB8fCB0YXJnZXQgPj0gMHhmZmZmKQorICAgIGVycm9yICgiR0RCIGJ1ZzogYXgtZ2VuZXJhbC5jIChheF9sYWJlbCk6IGxhYmVsIHRhcmdldCBvdXQgb2YgcmFuZ2UiKTsKKyAgCisgIHgtPmJ1ZltwYXRjaF0gPSAodGFyZ2V0ID4+IDgpICYgMHhmZjsKKyAgeC0+YnVmW3BhdGNoICsgMV0gPSB0YXJnZXQgJiAweGZmOworfQorCisKKy8qIEFzc2VtYmxlIGNvZGUgdG8gcHVzaCBhIGNvbnN0YW50IG9uIHRoZSBzdGFjay4gICovCit2b2lkCitheF9jb25zdF9sICh4LCBsKQorICAgICBzdHJ1Y3QgYWdlbnRfZXhwciAqeDsKKyAgICAgTE9OR0VTVCBsOworeworICBzdGF0aWMgZW51bSBhZ2VudF9vcCBvcHNbXQorICAgID0geyBhb3BfY29uc3Q4LCBhb3BfY29uc3QxNiwgYW9wX2NvbnN0MzIsIGFvcF9jb25zdDY0IH07CisgIGludCBzaXplOworICBpbnQgb3A7CisKKyAgLyogSG93IGJpZyBpcyB0aGUgbnVtYmVyPyAgJ29wJyBrZWVwcyB0cmFjayBvZiB3aGljaCBvcGNvZGUgdG8gdXNlLgorICAgICBOb3RpY2UgdGhhdCB3ZSBkb24ndCByZWFsbHkgY2FyZSB3aGV0aGVyIHRoZSBvcmlnaW5hbCBudW1iZXIgd2FzCisgICAgIHNpZ25lZCBvciB1bnNpZ25lZDsgd2UgYWx3YXlzIHJlcHJvZHVjZSB0aGUgdmFsdWUgZXhhY3RseSwgYW5kCisgICAgIHVzZSB0aGUgc2hvcnRlc3QgcmVwcmVzZW50YXRpb24uICAqLworICBmb3IgKG9wID0gMCwgc2l6ZSA9IDg7IHNpemUgPCA2NDsgc2l6ZSAqPSAyLCBvcCsrKQorICAgIGlmICgtKChMT05HRVNUKSAxIDw8IHNpemUpIDw9IGwgJiYgbCA8ICgoTE9OR0VTVCkgMSA8PCBzaXplKSkKKyAgICAgIGJyZWFrOworCisgIC8qIEVtaXQgdGhlIHJpZ2h0IG9wY29kZS4uLiAqLworICBheF9zaW1wbGUgKHgsIG9wc1tvcF0pOworCisgIC8qIEVtaXQgdGhlIGxvdyBTSVpFIGJ5dGVzIGFzIGFuIHVuc2lnbmVkIG51bWJlci4gIFdlIGtub3cgdGhhdAorICAgICBzaWduLWV4dGVuZGluZyB0aGlzIHdpbGwgeWllbGQgbC4gICovCisgIGFwcGVuZF9jb25zdCAoeCwgbCwgc2l6ZSAvIDgpOworCisgIC8qIE5vdywgaWYgaXQgd2FzIG5lZ2F0aXZlLCBhbmQgbm90IGZ1bGwtc2l6ZWQsIHNpZ24tZXh0ZW5kIGl0LiAgKi8KKyAgaWYgKGwgPCAwICYmIHNpemUgPCA2NCkKKyAgICBheF9leHQgKHgsIHNpemUpOworfQorCisKK3ZvaWQKK2F4X2NvbnN0X2QgKHgsIGQpCisgICAgIHN0cnVjdCBhZ2VudF9leHByICp4OworICAgICBMT05HRVNUIGQ7Cit7CisgIC8qIEZJWE1FOiBmbG9hdGluZy1wb2ludCBzdXBwb3J0IG5vdCBwcmVzZW50IHlldC4gICovCisgIGVycm9yICgiR0RCIGJ1ZzogYXgtZ2VuZXJhbC5jIChheF9jb25zdF9kKTogZmxvYXRpbmcgcG9pbnQgbm90IHN1cHBvcnRlZCB5ZXQiKTsKK30KKworCisvKiBBc3NlbWJsZSBjb2RlIHRvIHB1c2ggdGhlIHZhbHVlIG9mIHJlZ2lzdGVyIG51bWJlciBSRUcgb24gdGhlCisgICBzdGFjay4gICovCit2b2lkIGF4X3JlZyAoeCwgcmVnKQorICAgICBzdHJ1Y3QgYWdlbnRfZXhwciAqeDsKKyAgICAgaW50IHJlZzsKK3sKKyAgLyogTWFrZSBzdXJlIHRoZSByZWdpc3RlciBudW1iZXIgaXMgaW4gcmFuZ2UuICAqLworICBpZiAocmVnIDwgMCB8fCByZWcgPiAweGZmZmYpCisgICAgZXJyb3IgKCJHREIgYnVnOiBheC1nZW5lcmFsLmMgKGF4X3JlZyk6IHJlZ2lzdGVyIG51bWJlciBvdXQgb2YgcmFuZ2UiKTsKKyAgZ3Jvd19leHByICh4LCAzKTsKKyAgeC0+YnVmW3gtPmxlbiAgICBdID0gYW9wX3JlZzsKKyAgeC0+YnVmW3gtPmxlbiArIDFdID0gKHJlZyA+PiA4KSAmIDB4ZmY7CisgIHgtPmJ1Zlt4LT5sZW4gKyAyXSA9IChyZWcgICAgICkgJiAweGZmOworICB4LT5sZW4gKz0gMzsKK30KKworCisMCisvKiBGdW5jdGlvbnMgZm9yIGRpc2Fzc2VtYmxpbmcgYWdlbnQgZXhwcmVzc2lvbnMsIGFuZCBvdGhlcndpc2UKKyAgIGRlYnVnZ2luZyB0aGUgZXhwcmVzc2lvbiBjb21waWxlci4gICovCisKK3N0cnVjdCBhb3BfbWFwIGFvcF9tYXBbXSA9IHsKKyAgeyAwLCAwLCAwLCAwLCAwIH0sCisgIHsgImZsb2F0IiwgMCwgMCwgMCwgMCB9LAkJICAgLyogMHgwMSAqLworICB7ICJhZGQiLCAwLCAwLCAyLCAxIH0sCQkgICAvKiAweDAyICovCisgIHsgInN1YiIsIDAsIDAsIDIsIDEgfSwJCSAgIC8qIDB4MDMgKi8KKyAgeyAibXVsIiwgMCwgMCwgMiwgMSB9LAkJICAgLyogMHgwNCAqLworICB7ICJkaXZfc2lnbmVkIiwgMCwgMCwgMiwgMSB9LAkJICAgLyogMHgwNSAqLworICB7ICJkaXZfdW5zaWduZWQiLCAwLCAwLCAyLCAxIH0sCSAgIC8qIDB4MDYgKi8KKyAgeyAicmVtX3NpZ25lZCIsIDAsIDAsIDIsIDEgfSwJCSAgIC8qIDB4MDcgKi8KKyAgeyAicmVtX3Vuc2lnbmVkIiwgMCwgMCwgMiwgMSB9LAkgICAvKiAweDA4ICovCisgIHsgImxzaCIsIDAsIDAsIDIsIDEgfSwJCSAgIC8qIDB4MDkgKi8KKyAgeyAicnNoX3NpZ25lZCIsIDAsIDAsIDIsIDEgfSwJCSAgIC8qIDB4MGEgKi8KKyAgeyAicnNoX3Vuc2lnbmVkIiwgMCwgMCwgMiwgMSB9LAkgICAvKiAweDBiICovCisgIHsgInRyYWNlIiwgMCwgMCwgMiwgMCB9LAkJICAgLyogMHgwYyAqLworICB7ICJ0cmFjZV9xdWljayIsIDEsIDAsIDEsIDEgfSwJICAgLyogMHgwZCAqLworICB7ICJsb2dfbm90IiwgMCwgMCwgMSwgMSB9LAkJICAgLyogMHgwZSAqLworICB7ICJiaXRfYW5kIiwgMCwgMCwgMiwgMSB9LAkJICAgLyogMHgwZiAqLworICB7ICJiaXRfb3IiLCAwLCAwLCAyLCAxIH0sCQkgICAvKiAweDEwICovCisgIHsgImJpdF94b3IiLCAwLCAwLCAyLCAxIH0sCQkgICAvKiAweDExICovCisgIHsgImJpdF9ub3QiLCAwLCAwLCAxLCAxIH0sCQkgICAvKiAweDEyICovCisgIHsgImVxdWFsIiwgMCwgMCwgMiwgMSB9LAkJICAgLyogMHgxMyAqLworICB7ICJsZXNzX3NpZ25lZCIsIDAsIDAsIDIsIDEgfSwJICAgLyogMHgxNCAqLworICB7ICJsZXNzX3Vuc2lnbmVkIiwgMCwgMCwgMiwgMSB9LAkgICAvKiAweDE1ICovCisgIHsgImV4dCIsIDEsIDAsIDEsIDEgfSwJCSAgIC8qIDB4MTYgKi8KKyAgeyAicmVmOCIsIDAsIDgsIDEsIDEgfSwJCSAgIC8qIDB4MTcgKi8KKyAgeyAicmVmMTYiLCAwLCAxNiwgMSwgMSB9LAkJICAgLyogMHgxOCAqLworICB7ICJyZWYzMiIsIDAsIDMyLCAxLCAxIH0sCQkgICAvKiAweDE5ICovCisgIHsgInJlZjY0IiwgMCwgNjQsIDEsIDEgfSwJCSAgIC8qIDB4MWEgKi8KKyAgeyAicmVmX2Zsb2F0IiwgMCwgMCwgMSwgMSB9LAkJICAgLyogMHgxYiAqLworICB7ICJyZWZfZG91YmxlIiwgMCwgMCwgMSwgMSB9LAkJICAgLyogMHgxYyAqLworICB7ICJyZWZfbG9uZ19kb3VibGUiLCAwLCAwLCAxLCAxIH0sCSAgIC8qIDB4MWQgKi8KKyAgeyAibF90b19kIiwgMCwgMCwgMSwgMSB9LAkJICAgLyogMHgxZSAqLworICB7ICJkX3RvX2wiLCAwLCAwLCAxLCAxIH0sCQkgICAvKiAweDFmICovCisgIHsgImlmX2dvdG8iLCAyLCAwLCAxLCAwIH0sCQkgICAvKiAweDIwICovCisgIHsgImdvdG8iLCAyLCAwLCAwLCAwIH0sCQkgICAvKiAweDIxICovCisgIHsgImNvbnN0OCIsIDEsIDgsIDAsIDEgfSwJCSAgIC8qIDB4MjIgKi8KKyAgeyAiY29uc3QxNiIsIDIsIDE2LCAwLCAxIH0sCQkgICAvKiAweDIzICovCisgIHsgImNvbnN0MzIiLCA0LCAzMiwgMCwgMSB9LAkJICAgLyogMHgyNCAqLworICB7ICJjb25zdDY0IiwgOCwgNjQsIDAsIDEgfSwJCSAgIC8qIDB4MjUgKi8KKyAgeyAicmVnIiwgMiwgMCwgMCwgMSB9LAkJICAgLyogMHgyNiAqLworICB7ICJlbmQiLCAwLCAwLCAwLCAwIH0sCQkgICAvKiAweDI3ICovCisgIHsgImR1cCIsIDAsIDAsIDEsIDIgfSwJCSAgIC8qIDB4MjggKi8KKyAgeyAicG9wIiwgMCwgMCwgMSwgMCB9LAkJICAgLyogMHgyOSAqLworICB7ICJ6ZXJvX2V4dCIsIDEsIDAsIDEsIDEgfSwJCSAgIC8qIDB4MmEgKi8KKyAgeyAic3dhcCIsIDAsIDAsIDIsIDIgfSwJCSAgIC8qIDB4MmIgKi8KKyAgeyAwLCAwLCAwLCAwLCAwIH0sCQkJICAgLyogMHgyYyAqLworICB7IDAsIDAsIDAsIDAsIDAgfSwJCQkgICAvKiAweDJkICovCisgIHsgMCwgMCwgMCwgMCwgMCB9LAkJCSAgIC8qIDB4MmUgKi8KKyAgeyAwLCAwLCAwLCAwLCAwIH0sCQkJICAgLyogMHgyZiAqLworICB7ICJ0cmFjZTE2IiwgMiwgMCwgMSwgMSB9LAkJICAgLyogMHgzMCAqLworfTsKKworCisvKiBEaXNhc3NlbWJsZSB0aGUgZXhwcmVzc2lvbiBFWFBSLCB3cml0aW5nIHRvIEYuICAqLwordm9pZAorYXhfcHJpbnQgKGYsIHgpCisgICAgIEdEQl9GSUxFICpmOworICAgICBzdHJ1Y3QgYWdlbnRfZXhwciAqeDsKK3sKKyAgaW50IGk7CisgIGludCBpc19mbG9hdCA9IDA7CisKKyAgLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIG5hbWUgYXJyYXkgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KKyAgICAgdGhlIGVudW0sIHRvIGNhdGNoIGFkZGl0aW9ucyB0aGF0IHBlb3BsZSBkaWRuJ3Qgc3luYy4gICovCisgIGlmICgoc2l6ZW9mIChhb3BfbWFwKSAvIHNpemVvZiAoYW9wX21hcFswXSkpCisgICAgICAhPSBhb3BfbGFzdCkKKyAgICBlcnJvciAoIkdEQiBidWc6IGF4LWdlbmVyYWwuYyAoYXhfcHJpbnQpOiBvcGNvZGUgbWFwIG91dCBvZiBzeW5jIik7CisgIAorICBmb3IgKGkgPSAwOyBpIDwgeC0+bGVuOyApCisgICAgeworICAgICAgZW51bSBhZ2VudF9vcCBvcCA9IHgtPmJ1ZltpXTsKKworICAgICAgaWYgKG9wID49IChzaXplb2YgKGFvcF9tYXApIC8gc2l6ZW9mIChhb3BfbWFwWzBdKSkKKwkgIHx8ICEgYW9wX21hcFtvcF0ubmFtZSkKKwl7CisJICBmcHJpbnRmX2ZpbHRlcmVkIChmLCAiJTNkICA8YmFkIG9wY29kZSAlMDJ4PlxuIiwgaSwgb3ApOworCSAgaSsrOworCSAgY29udGludWU7CisJfQorICAgICAgaWYgKGkgKyAxICsgYW9wX21hcFtvcF0ub3Bfc2l6ZSA+IHgtPmxlbikKKwl7CisJICBmcHJpbnRmX2ZpbHRlcmVkIChmLCAiJTNkICA8aW5jb21wbGV0ZSBvcGNvZGUgJXM+XG4iLAorCQkJICAgIGksIGFvcF9tYXBbb3BdLm5hbWUpOworCSAgYnJlYWs7CisJfQorCisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChmLCAiJTNkICAlcyIsIGksIGFvcF9tYXBbb3BdLm5hbWUpOworICAgICAgaWYgKGFvcF9tYXBbb3BdLm9wX3NpemUgPiAwKQorCXsKKwkgIGZwdXRzX2ZpbHRlcmVkICgiICIsIGYpOworCSAgCisJICBwcmludF9sb25nZXN0IChmLCAnZCcsIDAsCisJCQkgcmVhZF9jb25zdCAoeCwgaSArIDEsIGFvcF9tYXBbb3BdLm9wX3NpemUpKTsKKwl9CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChmLCAiXG4iKTsKKyAgICAgIGkgKz0gMSArIGFvcF9tYXBbb3BdLm9wX3NpemU7CisKKyAgICAgIGlzX2Zsb2F0ID0gKG9wID09IGFvcF9mbG9hdCk7CisgICAgfQorfQorCisKKy8qIEdpdmVuIGFuIGFnZW50IGV4cHJlc3Npb24gQVgsIGZpbGwgaW4gYW4gYWdlbnRfcmVxcyBzdHJ1Y3R1cmUgUkVRUworICAgZGVzY3JpYmluZyBpdC4gICovCit2b2lkCitheF9yZXFzIChheCwgcmVxcykKKyAgICAgc3RydWN0IGFnZW50X2V4cHIgKmF4OworICAgICBzdHJ1Y3QgYWdlbnRfcmVxcyAqcmVxczsKK3sKKyAgaW50IGk7CisgIGludCBoZWlnaHQ7CisKKyAgLyogQml0IHZlY3RvciBmb3IgcmVnaXN0ZXJzIHVzZWQuICAqLworICBpbnQgcmVnX21hc2tfbGVuID0gMTsKKyAgdW5zaWduZWQgY2hhciAqcmVnX21hc2sgPSB4bWFsbG9jIChyZWdfbWFza19sZW4gKiBzaXplb2YgKHJlZ19tYXNrWzBdKSk7CisKKyAgLyogSnVtcCB0YXJnZXQgdGFibGUuICB0YXJnZXRzW2ldIGlzIG5vbi16ZXJvIGlmZiB0aGVyZSBpcyBhIGp1bXAgdG8KKyAgICAgb2Zmc2V0IGkuICAqLworICBjaGFyICp0YXJnZXRzID0gKGNoYXIgKikgYWxsb2NhIChheC0+bGVuICogc2l6ZW9mICh0YXJnZXRzWzBdKSk7CisKKyAgLyogSW5zdHJ1Y3Rpb24gYm91bmRhcnkgdGFibGUuICBib3VuZGFyeVtpXSBpcyBub24temVybyBpZmYgYW4KKyAgICAgaW5zdHJ1Y3Rpb24gc3RhcnRzIGF0IG9mZnNldCBpLiAgKi8KKyAgY2hhciAqYm91bmRhcnkgPSAoY2hhciAqKSBhbGxvY2EgKGF4LT5sZW4gKiBzaXplb2YgKGJvdW5kYXJ5WzBdKSk7CisKKyAgLyogU3RhY2sgaGVpZ2h0IHJlY29yZC4gIGlmZiBlaXRoZXIgdGFyZ2V0c1tpXSBvciBib3VuZGFyeVtpXSBpcworICAgICBub24temVybywgaGVpZ2h0c1tpXSBpcyB0aGUgaGVpZ2h0IHRoZSBzdGFjayBzaG91bGQgaGF2ZSBiZWZvcmUKKyAgICAgZXhlY3V0aW5nIHRoZSBieXRlY29kZSBhdCB0aGF0IHBvaW50LiAgKi8KKyAgaW50ICpoZWlnaHRzID0gKGludCAqKSBhbGxvY2EgKGF4LT5sZW4gKiBzaXplb2YgKGhlaWdodHNbMF0pKTsKKworICAvKiBQb2ludGVyIHRvIGEgZGVzY3JpcHRpb24gb2YgdGhlIHByZXNlbnQgb3AuICAqLworICBzdHJ1Y3QgYW9wX21hcCAqb3A7CisKKyAgbWVtc2V0IChyZWdfbWFzaywgMCwgcmVnX21hc2tfbGVuICogc2l6ZW9mIChyZWdfbWFza1swXSkpOworICBtZW1zZXQgKHRhcmdldHMsIDAsIGF4LT5sZW4gKiBzaXplb2YgKHRhcmdldHNbMF0pKTsKKyAgbWVtc2V0IChib3VuZGFyeSwgMCwgYXgtPmxlbiAqIHNpemVvZiAoYm91bmRhcnlbMF0pKTsKKworICByZXFzLT5tYXhfaGVpZ2h0ID0gcmVxcy0+bWluX2hlaWdodCA9IGhlaWdodCA9IDA7CisgIHJlcXMtPmZsYXcgPSBhZ2VudF9mbGF3X25vbmU7CisgIHJlcXMtPm1heF9kYXRhX3NpemUgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBheC0+bGVuOyBpICs9IDEgKyBvcC0+b3Bfc2l6ZSkKKyAgICB7CisgICAgICBpZiAoYXgtPmJ1ZltpXSA+IChzaXplb2YgKGFvcF9tYXApIC8gc2l6ZW9mIChhb3BfbWFwWzBdKSkpCisJeworCSAgcmVxcy0+ZmxhdyA9IGFnZW50X2ZsYXdfYmFkX2luc3RydWN0aW9uOworCSAgZnJlZSAocmVnX21hc2spOworCSAgcmV0dXJuOworCX0KKworICAgICAgb3AgPSAmYW9wX21hcFtheC0+YnVmW2ldXTsKKworICAgICAgaWYgKCEgb3AtPm5hbWUpCisJeworCSAgcmVxcy0+ZmxhdyA9IGFnZW50X2ZsYXdfYmFkX2luc3RydWN0aW9uOworCSAgZnJlZSAocmVnX21hc2spOworCSAgcmV0dXJuOworCX0KKwkKKyAgICAgIGlmIChpICsgMSArIG9wLT5vcF9zaXplID4gYXgtPmxlbikKKwl7CisJICByZXFzLT5mbGF3ID0gYWdlbnRfZmxhd19pbmNvbXBsZXRlX2luc3RydWN0aW9uOworCSAgZnJlZSAocmVnX21hc2spOworCSAgcmV0dXJuOworCX0KKworICAgICAgLyogSWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBhIGp1bXAgdGFyZ2V0LCBkb2VzIHRoZSBjdXJyZW50IHN0YWNrCisgICAgICAgICBoZWlnaHQgbWF0Y2ggdGhlIHN0YWNrIGhlaWdodCBhdCB0aGUganVtcCBzb3VyY2U/ICAqLworICAgICAgaWYgKHRhcmdldHNbaV0gJiYgKGhlaWdodHNbaV0gIT0gaGVpZ2h0KSkKKwl7CisJICByZXFzLT5mbGF3ID0gYWdlbnRfZmxhd19oZWlnaHRfbWlzbWF0Y2g7CisJICBmcmVlIChyZWdfbWFzayk7CisJICByZXR1cm47CisJfQorCisgICAgICBib3VuZGFyeVtpXSA9IDE7CisgICAgICBoZWlnaHRzW2ldID0gaGVpZ2h0OworCisgICAgICBoZWlnaHQgLT0gb3AtPmNvbnN1bWVkOworICAgICAgaWYgKGhlaWdodCA8IHJlcXMtPm1pbl9oZWlnaHQpCisJcmVxcy0+bWluX2hlaWdodCA9IGhlaWdodDsKKyAgICAgIGhlaWdodCArPSBvcC0+cHJvZHVjZWQ7CisgICAgICBpZiAoaGVpZ2h0ID4gcmVxcy0+bWF4X2hlaWdodCkKKwlyZXFzLT5tYXhfaGVpZ2h0ID0gaGVpZ2h0OworCisgICAgICBpZiAob3AtPmRhdGFfc2l6ZSA+IHJlcXMtPm1heF9kYXRhX3NpemUpCisJcmVxcy0+bWF4X2RhdGFfc2l6ZSA9IG9wLT5kYXRhX3NpemU7CisKKyAgICAgIC8qIEZvciBqdW1wIGluc3RydWN0aW9ucywgY2hlY2sgdGhhdCB0aGUgdGFyZ2V0IGlzIGEgdmFsaWQKKwkgb2Zmc2V0LiAgSWYgaXQgaXMsIHJlY29yZCB0aGUgZmFjdCB0aGF0IHRoYXQgbG9jYXRpb24gaXMgYQorCSBqdW1wIHRhcmdldCwgYW5kIHJlY29yZCB0aGUgaGVpZ2h0IHdlIGV4cGVjdCB0aGVyZS4gICovCisgICAgICBpZiAoYW9wX2dvdG8gPT0gb3AgLSBhb3BfbWFwCisJICB8fCBhb3BfaWZfZ290byA9PSBvcCAtIGFvcF9tYXApCisJeworCSAgaW50IHRhcmdldCA9IHJlYWRfY29uc3QgKGF4LCBpICsgMSwgMik7CisJICBpZiAodGFyZ2V0IDwgMCB8fCB0YXJnZXQgPj0gYXgtPmxlbikKKwkgICAgeworCSAgICAgIHJlcXMtPmZsYXcgPSBhZ2VudF9mbGF3X2JhZF9qdW1wOworCSAgICAgIGZyZWUgKHJlZ19tYXNrKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIC8qIEhhdmUgd2UgYWxyZWFkeSBmb3VuZCBvdGhlciBqdW1wcyB0byB0aGUgc2FtZSBsb2NhdGlvbj8gICovCisJICBlbHNlIGlmICh0YXJnZXRzW3RhcmdldF0pCisJICAgIHsKKwkgICAgICBpZiAoaGVpZ2h0c1tpXSAhPSBoZWlnaHQpCisJCXsKKwkJICByZXFzLT5mbGF3ID0gYWdlbnRfZmxhd19oZWlnaHRfbWlzbWF0Y2g7CisJCSAgZnJlZSAocmVnX21hc2spOworCQkgIHJldHVybjsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB0YXJnZXRzW3RhcmdldF0gPSAxOworCSAgICAgIGhlaWdodHNbdGFyZ2V0XSA9IGhlaWdodDsKKwkgICAgfQorCX0KKyAgICAgIAorICAgICAgLyogRm9yIHVuY29uZGl0aW9uYWwganVtcHMgd2l0aCBhIHN1Y2Nlc3NvciwgY2hlY2sgdGhhdCB0aGUKKyAgICAgICAgIHN1Y2Nlc3NvciBpcyBhIHRhcmdldCwgYW5kIHBpY2sgdXAgaXRzIHN0YWNrIGhlaWdodC4gICovCisgICAgICBpZiAoYW9wX2dvdG8gPT0gb3AgLSBhb3BfbWFwCisJICAmJiBpICsgMyA8IGF4LT5sZW4pCisJeworCSAgaWYgKCEgdGFyZ2V0c1tpICsgM10pCisJICAgIHsKKwkgICAgICByZXFzLT5mbGF3ID0gYWdlbnRfZmxhd19ob2xlOworCSAgICAgIGZyZWUgKHJlZ19tYXNrKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKworCSAgaGVpZ2h0ID0gaGVpZ2h0c1tpICsgM107CisJfQorCisgICAgICAvKiBGb3IgcmVnIGluc3RydWN0aW9ucywgcmVjb3JkIHRoZSByZWdpc3RlciBpbiB0aGUgYml0IG1hc2suICAqLworICAgICAgaWYgKGFvcF9yZWcgPT0gb3AgLSBhb3BfbWFwKQorCXsKKwkgIGludCByZWcgPSByZWFkX2NvbnN0IChheCwgaSArIDEsIDIpOworCSAgaW50IGJ5dGUgPSByZWcgLyA4OworCisJICAvKiBHcm93IHRoZSBiaXQgbWFzayBpZiBuZWNlc3NhcnkuICAqLworCSAgaWYgKGJ5dGUgPj0gcmVnX21hc2tfbGVuKQorCSAgICB7CisJICAgICAgLyogSXQncyBub3QgYXBwcm9wcmlhdGUgdG8gZG91YmxlIGhlcmUuICBUaGlzIGlzbid0IGEKKyAgICAgICAgICAgICAgICAgc3RyaW5nIGJ1ZmZlci4gICovCisJICAgICAgaW50IG5ld19sZW4gPSBieXRlICsgMTsKKwkgICAgICByZWdfbWFzayA9IHhyZWFsbG9jIChyZWdfbWFzaywgCisJCQkJICAgbmV3X2xlbiAqIHNpemVvZiAocmVnX21hc2tbMF0pKTsKKwkgICAgICBtZW1zZXQgKHJlZ19tYXNrICsgcmVnX21hc2tfbGVuLCAwLAorCQkgICAgICAobmV3X2xlbiAtIHJlZ19tYXNrX2xlbikgKiBzaXplb2YgKHJlZ19tYXNrWzBdKSk7CisJICAgICAgcmVnX21hc2tfbGVuID0gbmV3X2xlbjsKKwkgICAgfQorCisJICByZWdfbWFza1tieXRlXSB8PSAxIDw8IChyZWcgJSA4KTsKKwl9CisgICAgfQorCisgIC8qIENoZWNrIHRoYXQgYWxsIHRoZSB0YXJnZXRzIGFyZSBvbiBib3VuZGFyaWVzLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IGF4LT5sZW47IGkrKykKKyAgICBpZiAodGFyZ2V0c1tpXSAmJiAhYm91bmRhcnlbaV0pCisgICAgICB7CisJcmVxcy0+ZmxhdyA9IGFnZW50X2ZsYXdfYmFkX2p1bXA7CisJZnJlZSAocmVnX21hc2spOworCXJldHVybjsKKyAgICAgIH0KKworICByZXFzLT5maW5hbF9oZWlnaHQgPSBoZWlnaHQ7CisgIHJlcXMtPnJlZ19tYXNrX2xlbiA9IHJlZ19tYXNrX2xlbjsKKyAgcmVxcy0+cmVnX21hc2sgPSByZWdfbWFzazsKK30KZGlmZiAtLWdpdCBhL2dkYi9heC5oIGIvZ2RiL2F4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVlMGYwYgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9heC5oCkBAIC0wLDAgKzEsMjg1IEBACisvKiBEZWZpbml0aW9ucyBmb3IgZXhwcmVzc2lvbnMgZGVzaWduZWQgdG8gYmUgZXhlY3V0ZWQgb24gdGhlIGFnZW50CisgICBDb3B5cmlnaHQgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiAkSWQkICovCisKKyNpZm5kZWYgQUdFTlRFWFBSX0gKKyNkZWZpbmUgQUdFTlRFWFBSX0gKKworLyogSXQncyBzb21ldGltZXMgdXNlZnVsIHRvIGJlIGFibGUgdG8gZGVidWcgcHJvZ3JhbXMgdGhhdCB5b3UgY2FuJ3QKKyAgIHJlYWxseSBzdG9wIGZvciBtb3JlIHRoYW4gYSBmcmFjdGlvbiBvZiBhIHNlY29uZC4gIFRvIHRoaXMgZW5kLCB0aGUKKyAgIHVzZXIgY2FuIHNwZWNpZnkgYSB0cmFjZXBvaW50IChsaWtlIGEgYnJlYWtwb2ludCwgYnV0IHlvdSBkb24ndAorICAgc3RvcCBhdCBpdCksIGFuZCBzcGVjaWZ5IGEgYnVuY2ggb2YgZXhwcmVzc2lvbnMgdG8gcmVjb3JkIHRoZQorICAgdmFsdWVzIG9mIHdoZW4gdGhhdCB0cmFjZXBvaW50IGlzIHJlYWNoZWQuICBBcyB0aGUgcHJvZ3JhbSBydW5zLAorICAgR0RCIGNvbGxlY3RzIHRoZSB2YWx1ZXMuICBBdCBhbnkgcG9pbnQgKHBvc3NpYmx5IHdoaWxlIHZhbHVlcyBhcmUKKyAgIHN0aWxsIGJlaW5nIGNvbGxlY3RlZCksIHRoZSB1c2VyIGNhbiBkaXNwbGF5IHRoZSBjb2xsZWN0ZWQgdmFsdWVzLgorCisgICBUaGlzIGlzIHVzZWQgd2l0aCByZW1vdGUgZGVidWdnaW5nOyB3ZSBkb24ndCByZWFsbHkgc3VwcG9ydCBpdCBvbgorICAgbmF0aXZlIGNvbmZpZ3VyYXRpb25zLgorCisgICBUaGlzIG1lYW5zIHRoYXQgZXhwcmVzc2lvbnMgYXJlIGJlaW5nIGV2YWx1YXRlZCBieSB0aGUgcmVtb3RlIGFnZW50LAorICAgd2hpY2ggZG9lc24ndCBoYXZlIGFueSBhY2Nlc3MgdG8gdGhlIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbiwgYW5kCisgICBuZWVkcyB0byBiZSBzbWFsbCBhbmQgc2ltcGxlLgorCisgICBUaGUgYWdlbnRfZXhwciByb3V0aW5lcyBhbmQgZGF0YXR5cGVzIGFyZSBhIGJ5dGVjb2RlIGxhbmd1YWdlCisgICBkZXNpZ25lZCB0byBiZSBleGVjdXRlZCBieSB0aGUgYWdlbnQuICBBZ2VudCBleHByZXNzaW9ucyB3b3JrIGluCisgICB0ZXJtcyBvZiBmaXhlZC13aWR0aCB2YWx1ZXMsIG9wZXJhdG9ycywgbWVtb3J5IHJlZmVyZW5jZXMsIGFuZAorICAgcmVnaXN0ZXIgcmVmZXJlbmNlcy4gIFlvdSBjYW4gZXZhbHVhdGUgYSBhZ2VudCBleHByZXNzaW9uIGp1c3QgZ2l2ZW4KKyAgIGEgYnVuY2ggb2YgbWVtb3J5IGFuZCByZWdpc3RlciB2YWx1ZXMgdG8gc25pZmYgYXQ7IHlvdSBkb24ndCBuZWVkCisgICBhbnkgc3ltYm9saWMgaW5mb3JtYXRpb24gbGlrZSB2YXJpYWJsZSBuYW1lcywgdHlwZXMsIGV0Yy4KKworICAgR0RCIHRyYW5zbGF0ZXMgc291cmNlIGV4cHJlc3Npb25zLCB3aG9zZSBtZWFuaW5nIGRlcGVuZHMgb24KKyAgIHN5bWJvbGljIGluZm9ybWF0aW9uLCBpbnRvIGFnZW50IGJ5dGVjb2RlIGV4cHJlc3Npb25zLCB3aG9zZSBtZWFuaW5nCisgICBpcyBpbmRlcGVuZGVudCBvZiBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gIFRoaXMgbWVhbnMgdGhlIGFnZW50IGNhbgorICAgZXZhbHVhdGUgdGhlbSBvbiB0aGUgZmx5IHdpdGhvdXQgcmVmZXJlbmNlIHRvIGRhdGEgb25seSBhdmFpbGFibGUKKyAgIHRvIHRoZSBob3N0IEdEQi4gICovCisKKwwKKy8qIEFnZW50IGV4cHJlc3Npb24gZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KKworLyogVGhlIHR5cGUgb2YgYW4gZWxlbWVudCBvZiB0aGUgYWdlbnQgZXhwcmVzc2lvbiBzdGFjay4KKyAgIFRoZSBieXRlY29kZSBvcGVyYXRpb24gaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnQgd2Ugc2hvdWxkIGFjY2VzczsKKyAgIHRoZSB2YWx1ZSBpdHNlbGYgaGFzIG5vIHR5cGluZyBpbmZvcm1hdGlvbi4gIEdEQiBnZW5lcmF0ZXMgYWxsCisgICBieXRlY29kZSBzdHJlYW1zLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHR5cGUgZXJyb3JzLiAgKi8KKwordW5pb24gYWdlbnRfdmFsIHsKKyAgTE9OR0VTVCBsOworICBET1VCTEVTVCBkOworfTsKKworLyogQSBidWZmZXIgY29udGFpbmluZyBhIGFnZW50IGV4cHJlc3Npb24uICAqLworc3RydWN0IGFnZW50X2V4cHIgeworICB1bnNpZ25lZCBjaGFyICpidWY7CisgIGludCBsZW47CQkJLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXNlZCAqLworICBpbnQgc2l6ZTsJCQkvKiBhbGxvY2F0ZWQgc2l6ZSAqLworICBDT1JFX0FERFIgc2NvcGU7Cit9OworCisKKworCisvKiBUaGUgYWN0dWFsIHZhbHVlcyBvZiB0aGUgdmFyaW91cyBieXRlY29kZSBvcGVyYXRpb25zLgorCisgICBPdGhlciBpbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGFnZW50IGJ5dGVjb2RlIGVuZ2luZSB3aWxsCisgICByZWx5IG9uIHRoZSBleGFjdCB2YWx1ZXMgb2YgdGhlc2UgZW51bXMsIGFuZCBtYXkgbm90IGJlIHJlY29tcGlsZWQKKyAgIHdoZW4gd2UgY2hhbmdlIHRoaXMgdGFibGUuICBUaGUgbnVtZXJpYyB2YWx1ZXMgc2hvdWxkIHJlbWFpbiBmaXhlZAorICAgd2hlbmV2ZXIgcG9zc2libGUuICBUaHVzLCB3ZSBhc3NpZ24gdGhlbSB2YWx1ZXMgZXhwbGljaXRseSBoZXJlICh0bworICAgYWxsb3cgZ2FwcyB0byBmb3JtIHNhZmVseSksIGFuZCB0aGUgZGlzYXNzZW1ibHkgdGFibGUgaW4KKyAgIGFnZW50ZXhwci5oIGJlaGF2ZXMgbGlrZSBhbiBvcGNvZGUgbWFwLiAgSWYgeW91IHdhbnQgdG8gc2VlIHRoZW0KKyAgIGdyb3VwZWQgbG9naWNhbGx5LCBzZWUgZG9jL2FnZW50ZXhwci50ZXhpLiAgKi8KKworZW51bSBhZ2VudF9vcCB7CisgIGFvcF9mbG9hdCA9IDB4MDEsCisgIGFvcF9hZGQgPSAweDAyLAorICBhb3Bfc3ViID0gMHgwMywKKyAgYW9wX211bCA9IDB4MDQsCisgIGFvcF9kaXZfc2lnbmVkID0gMHgwNSwKKyAgYW9wX2Rpdl91bnNpZ25lZCA9IDB4MDYsCisgIGFvcF9yZW1fc2lnbmVkID0gMHgwNywKKyAgYW9wX3JlbV91bnNpZ25lZCA9IDB4MDgsCisgIGFvcF9sc2ggPSAweDA5LAorICBhb3BfcnNoX3NpZ25lZCA9IDB4MGEsCisgIGFvcF9yc2hfdW5zaWduZWQgPSAweDBiLAorICBhb3BfdHJhY2UgPSAweDBjLAorICBhb3BfdHJhY2VfcXVpY2sgPSAweDBkLAorICBhb3BfbG9nX25vdCA9IDB4MGUsCisgIGFvcF9iaXRfYW5kID0gMHgwZiwKKyAgYW9wX2JpdF9vciA9IDB4MTAsCisgIGFvcF9iaXRfeG9yID0gMHgxMSwKKyAgYW9wX2JpdF9ub3QgPSAweDEyLAorICBhb3BfZXF1YWwgPSAweDEzLAorICBhb3BfbGVzc19zaWduZWQgPSAweDE0LAorICBhb3BfbGVzc191bnNpZ25lZCA9IDB4MTUsCisgIGFvcF9leHQgPSAweDE2LAorICBhb3BfcmVmOCA9IDB4MTcsCisgIGFvcF9yZWYxNiA9IDB4MTgsCisgIGFvcF9yZWYzMiA9IDB4MTksCisgIGFvcF9yZWY2NCA9IDB4MWEsCisgIGFvcF9yZWZfZmxvYXQgPSAweDFiLAorICBhb3BfcmVmX2RvdWJsZSA9IDB4MWMsCisgIGFvcF9yZWZfbG9uZ19kb3VibGUgPSAweDFkLAorICBhb3BfbF90b19kID0gMHgxZSwKKyAgYW9wX2RfdG9fbCA9IDB4MWYsCisgIGFvcF9pZl9nb3RvID0gMHgyMCwKKyAgYW9wX2dvdG8gPSAweDIxLAorICBhb3BfY29uc3Q4ID0gMHgyMiwKKyAgYW9wX2NvbnN0MTYgPSAweDIzLAorICBhb3BfY29uc3QzMiA9IDB4MjQsCisgIGFvcF9jb25zdDY0ID0gMHgyNSwKKyAgYW9wX3JlZyA9IDB4MjYsCisgIGFvcF9lbmQgPSAweDI3LAorICBhb3BfZHVwID0gMHgyOCwKKyAgYW9wX3BvcCA9IDB4MjksCisgIGFvcF96ZXJvX2V4dCA9IDB4MmEsCisgIGFvcF9zd2FwID0gMHgyYiwKKyAgYW9wX3RyYWNlMTYgPSAweDMwLAorICBhb3BfbGFzdAorfTsKKworCisMCisvKiBGdW5jdGlvbnMgZm9yIGJ1aWxkaW5nIGV4cHJlc3Npb25zLiAgKi8KKworLyogQWxsb2NhdGUgYSBuZXcsIGVtcHR5IGFnZW50IGV4cHJlc3Npb24uICAqLworZXh0ZXJuIHN0cnVjdCBhZ2VudF9leHByICpuZXdfYWdlbnRfZXhwciBQQVJBTVMgKChDT1JFX0FERFIpKTsKKworLyogRnJlZSBhIGFnZW50IGV4cHJlc3Npb24uICAqLworZXh0ZXJuIHZvaWQgZnJlZV9hZ2VudF9leHByIFBBUkFNUyAoKHN0cnVjdCBhZ2VudF9leHByICopKTsKKworLyogQXBwZW5kIGEgc2ltcGxlIG9wZXJhdG9yIE9QIHRvIEVYUFIuICAqLworZXh0ZXJuIHZvaWQgYXhfc2ltcGxlIFBBUkFNUyAoKHN0cnVjdCBhZ2VudF9leHByICpFWFBSLCBlbnVtIGFnZW50X29wIE9QKSk7CisKKy8qIEFwcGVuZCB0aGUgZmxvYXRpbmctcG9pbnQgcHJlZml4LCBmb3IgdGhlIG5leHQgYnl0ZWNvZGUuICAqLworI2RlZmluZSBheF9mbG9hdChFWFBSKSAoYXhfc2ltcGxlICgoRVhQUiksIGFvcF9mbG9hdCkpCisKKy8qIEFwcGVuZCBhIHNpZ24tZXh0ZW5zaW9uIGluc3RydWN0aW9uIHRvIEVYUFIsIHRvIGV4dGVuZCBhbiBOLWJpdCB2YWx1ZS4gICovCitleHRlcm4gdm9pZCBheF9leHQgUEFSQU1TICgoc3RydWN0IGFnZW50X2V4cHIgKkVYUFIsIGludCBOKSk7CisKKy8qIEFwcGVuZCBhIHplcm8tZXh0ZW5zaW9uIGluc3RydWN0aW9uIHRvIEVYUFIsIHRvIGV4dGVuZCBhbiBOLWJpdCB2YWx1ZS4gICovCitleHRlcm4gdm9pZCBheF96ZXJvX2V4dCBQQVJBTVMgKChzdHJ1Y3QgYWdlbnRfZXhwciAqRVhQUiwgaW50IE4pKTsKKworLyogQXBwZW5kIGEgdHJhY2VfcXVpY2sgaW5zdHJ1Y3Rpb24gdG8gRVhQUiwgdG8gcmVjb3JkIE4gYnl0ZXMuICAqLworZXh0ZXJuIHZvaWQgYXhfdHJhY2VfcXVpY2sgUEFSQU1TICgoc3RydWN0IGFnZW50X2V4cHIgKkVYUFIsIGludCBOKSk7CisKKy8qIEFwcGVuZCBhIGdvdG8gb3AgdG8gRVhQUi4gIE9QIGlzIHRoZSBhY3R1YWwgb3AgKG11c3QgYmUgYW9wX2dvdG8gb3IKKyAgIGFvcF9pZl9nb3RvKS4gIFdlIGFzc3VtZSB3ZSBkb24ndCBrbm93IHRoZSB0YXJnZXQgb2Zmc2V0IHlldCwKKyAgIGJlY2F1c2UgaXQncyBwcm9iYWJseSBhIGZvcndhcmQgYnJhbmNoLCBzbyB3ZSBsZWF2ZSBzcGFjZSBpbiBFWFBSCisgICBmb3IgdGhlIHRhcmdldCwgYW5kIHJldHVybiB0aGUgb2Zmc2V0IGluIEVYUFIgb2YgdGhhdCBzcGFjZSwgc28gd2UKKyAgIGNhbiBiYWNrcGF0Y2ggaXQgb25jZSB3ZSBkbyBrbm93IHRoZSB0YXJnZXQgb2Zmc2V0LiAgVXNlIGF4X2xhYmVsCisgICB0byBkbyB0aGUgYmFja3BhdGNoaW5nLiAgKi8KK2V4dGVybiBpbnQgYXhfZ290byBQQVJBTVMgKChzdHJ1Y3QgYWdlbnRfZXhwciAqRVhQUiwgZW51bSBhZ2VudF9vcCBPUCkpOworCisvKiBTdXBwb3NlIGEgZ2l2ZW4gY2FsbCB0byBheF9nb3RvIHJldHVybnMgc29tZSB2YWx1ZSBQQVRDSC4gIFdoZW4geW91CisgICBrbm93IHRoZSBvZmZzZXQgVEFSR0VUIHRoYXQgZ290byBzaG91bGQganVtcCB0bywgY2FsbAorCWF4X2xhYmVsIChFWFBSLCBQQVRDSCwgVEFSR0VUKQorICAgdG8gcGF0Y2ggVEFSR0VUIGludG8gdGhlIGF4X2dvdG8gaW5zdHJ1Y3Rpb24uICAqLworZXh0ZXJuIHZvaWQgYXhfbGFiZWwgUEFSQU1TICgoc3RydWN0IGFnZW50X2V4cHIgKkVYUFIsIGludCBwYXRjaCwgaW50IHRhcmdldCkpOworCisvKiBBc3NlbWJsZSBjb2RlIHRvIHB1c2ggYSBjb25zdGFudCBvbiB0aGUgc3RhY2suICAqLworZXh0ZXJuIHZvaWQgYXhfY29uc3RfbCBQQVJBTVMgKChzdHJ1Y3QgYWdlbnRfZXhwciAqRVhQUiwgTE9OR0VTVCBsKSk7CitleHRlcm4gdm9pZCBheF9jb25zdF9kIFBBUkFNUyAoKHN0cnVjdCBhZ2VudF9leHByICpFWFBSLCBMT05HRVNUIGQpKTsKKworLyogQXNzZW1ibGUgY29kZSB0byBwdXNoIHRoZSB2YWx1ZSBvZiByZWdpc3RlciBudW1iZXIgUkVHIG9uIHRoZQorICAgc3RhY2suICAqLworZXh0ZXJuIHZvaWQgYXhfcmVnIFBBUkFNUyAoKHN0cnVjdCBhZ2VudF9leHByICpFWFBSLCBpbnQgUkVHKSk7CisKKwwKKy8qIEZ1bmN0aW9ucyBmb3IgcHJpbnRpbmcgb3V0IGV4cHJlc3Npb25zLCBhbmQgb3RoZXJ3aXNlIGRlYnVnZ2luZworICAgdGhpbmdzLiAgKi8KKworLyogRGlzYXNzZW1ibGUgdGhlIGV4cHJlc3Npb24gRVhQUiwgd3JpdGluZyB0byBGLiAgKi8KK2V4dGVybiB2b2lkIGF4X3ByaW50IFBBUkFNUyAoKEdEQl9GSUxFICpmLCBzdHJ1Y3QgYWdlbnRfZXhwciAqRVhQUikpOworCisvKiBBbiBlbnRyeSBpbiB0aGUgb3Bjb2RlIG1hcC4gICovCitzdHJ1Y3QgYW9wX21hcCB7CisKKyAgLyogVGhlIG5hbWUgb2YgdGhlIG9wY29kZS4gIE51bGwgbWVhbnMgdGhhdCB0aGlzIGVudHJ5IGlzIG5vdCBhCisgICAgIHZhbGlkIG9wY29kZSAtLS0gYSBob2xlIGluIHRoZSBvcGNvZGUgc3BhY2UuICAqLworICBjaGFyICpuYW1lOworCisgIC8qIEFsbCBvcGNvZGVzIHRha2Ugbm8gb3BlcmFuZHMgZnJvbSB0aGUgYnl0ZWNvZGUgc3RyZWFtLCBvciB0YWtlCisgICAgIHVuc2lnbmVkIGludGVnZXJzIG9mIHZhcmlvdXMgc2l6ZXMuICBJZiB0aGlzIGlzIGEgcG9zaXRpdmUgbnVtYmVyCisgICAgIG4sIHRoZW4gdGhlIG9wY29kZSBpcyBmb2xsb3dlZCBieSBhbiBuLWJ5dGUgb3BlcmFuZCwgd2hpY2ggc2hvdWxkCisgICAgIGJlIHByaW50ZWQgYXMgYW4gdW5zaWduZWQgaW50ZWdlci4gIElmIHRoaXMgaXMgemVybywgdGhlbiB0aGUKKyAgICAgb3Bjb2RlIHRha2VzIG5vIG9wZXJhbmRzIGZyb20gdGhlIGJ5dGVjb2RlIHN0cmVhbS4KKworICAgICBJZiB3ZSBnZXQgbW9yZSBjb21wbGljYXRlZCBvcGNvZGVzIGluIHRoZSBmdXR1cmUsIGRvbid0IGFkZCBvdGhlcgorICAgICBtYWdpYyB2YWx1ZXMgb2YgdGhpczsgdGhhdCdzIGEgY3JvY2suICBBZGQgYW4gYGVudW0gZW5jb2RpbmcnCisgICAgIGZpZWxkIHRvIHRoaXMsIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQuICAqLworICBpbnQgb3Bfc2l6ZTsKKworICAvKiBUaGUgc2l6ZSBvZiB0aGUgZGF0YSBvcGVyYXRlZCB1cG9uLCBpbiBiaXRzLCBmb3IgYnl0ZWNvZGVzIHRoYXQKKyAgICAgY2FyZSBhYm91dCB0aGF0IChyZWYgYW5kIGNvbnN0KS4gIFplcm8gZm9yIGFsbCBvdGhlcnMuICAqLworICBpbnQgZGF0YV9zaXplOworCisgIC8qIE51bWJlciBvZiBzdGFjayBlbGVtZW50cyBjb25zdW1lZCwgYW5kIG51bWJlciBwcm9kdWNlZC4gICovCisgIGludCBjb25zdW1lZCwgcHJvZHVjZWQ7Cit9OworCisvKiBNYXAgb2YgdGhlIGJ5dGVjb2RlcywgaW5kZXhlZCBieSBieXRlY29kZSBudW1iZXIuICAqLworZXh0ZXJuIHN0cnVjdCBhb3BfbWFwIGFvcF9tYXBbXTsKKworLyogRGlmZmVyZW50IGtpbmRzIG9mIGZsYXdzIGFuIGFnZW50IGV4cHJlc3Npb24gbWlnaHQgaGF2ZSwgYXMKKyAgIGRldGVjdGVkIGJ5IGFnZW50X3JlcXMuICAqLworZW51bSBhZ2VudF9mbGF3cyB7CisgIGFnZW50X2ZsYXdfbm9uZSA9IDAsCQkvKiBjb2RlIGlzIGdvb2QgKi8KKworICAvKiBUaGVyZSBpcyBhbiBpbnZhbGlkIGluc3RydWN0aW9uIGluIHRoZSBzdHJlYW0uICAqLworICBhZ2VudF9mbGF3X2JhZF9pbnN0cnVjdGlvbiwKKworICAvKiBUaGVyZSBpcyBhbiBpbmNvbXBsZXRlIGluc3RydWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGV4cHJlc3Npb24uICAqLworICBhZ2VudF9mbGF3X2luY29tcGxldGVfaW5zdHJ1Y3Rpb24sCisKKyAgLyogYWdlbnRfcmVxcyB3YXMgdW5hYmxlIHRvIHByb3ZlIHRoYXQgZXZlcnkganVtcCB0YXJnZXQgaXMgdG8gYQorICAgICB2YWxpZCBvZmZzZXQuICBWYWxpZCBvZmZzZXRzIGFyZSB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUKKyAgICAgZXhwcmVzc2lvbiwgYW5kIHRvIGEgdmFsaWQgaW5zdHJ1Y3Rpb24gYm91bmRhcnkuICAqLworICBhZ2VudF9mbGF3X2JhZF9qdW1wLAorCisgIC8qIGFnZW50X3JlcXMgd2FzIHVuYWJsZSB0byBwcm92ZSB0byBpdHMgc2F0aXNmYWN0aW9uIHRoYXQsIGZvciBlYWNoCisgICAgIGp1bXAgdGFyZ2V0IGxvY2F0aW9uLCB0aGUgc3RhY2sgd2lsbCBoYXZlIHRoZSBzYW1lIGhlaWdodCB3aGV0aGVyCisgICAgIHRoYXQgbG9jYXRpb24gaXMgcmVhY2hlZCB2aWEgYSBqdW1wIG9yIGJ5IHN0cmFpZ2h0IGV4ZWN1dGlvbi4gICovCisgIGFnZW50X2ZsYXdfaGVpZ2h0X21pc21hdGNoLAorCisgIC8qIGFnZW50X3JlcXMgd2FzIHVuYWJsZSB0byBwcm92ZSB0aGF0IGV2ZXJ5IGluc3RydWN0aW9uIGZvbGxvd2luZworICAgICBhbiB1bmNvbmRpdGlvbmFsIGp1bXAgd2FzIHRoZSB0YXJnZXQgb2Ygc29tZSBvdGhlciBqdW1wLiAgKi8KKyAgYWdlbnRfZmxhd19ob2xlCit9OworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgYnl0ZWNvZGUgZXhwcmVzc2lvbi4gICovCitzdHJ1Y3QgYWdlbnRfcmVxcyB7CisKKyAgLyogSWYgdGhlIGZvbGxvd2luZyBpcyBub3QgZXF1YWwgdG8gYWdlbnRfZmxhd19ub25lLCB0aGUgcmVzdCBvZiB0aGUKKyAgICAgaW5mb3JtYXRpb24gaW4gdGhpcyBzdHJ1Y3R1cmUgaXMgc3VzcGVjdC4gICovCisgIGVudW0gYWdlbnRfZmxhd3MgZmxhdzsKKworICAvKiBOdW1iZXIgb2YgZWxlbWVudHMgbGVmdCBvbiBzdGFjayBhdCBlbmQ7IG1heSBiZSBuZWdhdGl2ZSBpZiBleHByCisgICAgIG9ubHkgY29uc3VtZXMgZWxlbWVudHMuICAqLworICBpbnQgZmluYWxfaGVpZ2h0OworCisgIC8qIE1heGltdW0gYW5kIG1pbmltdW0gc3RhY2sgaGVpZ2h0LCByZWxhdGl2ZSB0byBpbml0aWFsIGhlaWdodC4gICovCisgIGludCBtYXhfaGVpZ2h0LCBtaW5faGVpZ2h0OworCisgIC8qIExhcmdlc3QgYHJlZicgb3IgYGNvbnN0JyBvcGNvZGUgdXNlZCwgaW4gYml0cy4gIFplcm8gbWVhbnMgdGhlCisgICAgIGV4cHJlc3Npb24gaGFzIG5vIHN1Y2ggaW5zdHJ1Y3Rpb25zLiAgKi8KKyAgaW50IG1heF9kYXRhX3NpemU7CisKKyAgLyogQml0IHZlY3RvciBvZiByZWdpc3RlcnMgdXNlZC4gIFJlZ2lzdGVyIFIgaXMgdXNlZCBpZmYKKyAgCisJcmVnX21hc2tbUiAvIDhdICYgKDEgPDwgKFIgJSA4KSkKKworICAgICBpcyBub24temVyby4gIE5vdGUhICBZb3UgbWF5IG5vdCBhc3N1bWUgdGhhdCB0aGlzIGJpdG1hc2sgaXMgbG9uZworICAgICBlbm91Z2ggdG8gaG9sZCBiaXRzIGZvciBhbGwgdGhlIHJlZ2lzdGVycyBvZiB0aGUgbWFjaGluZTsgdGhlCisgICAgIGFnZW50IGV4cHJlc3Npb24gY29kZSBoYXMgbm8gaWRlYSBob3cgbWFueSByZWdpc3RlcnMgdGhlIG1hY2hpbmUKKyAgICAgaGFzLiAgSG93ZXZlciwgdGhlIGJpdG1hc2sgaXMgcmVnX21hc2tfbGVuIGJ5dGVzIGxvbmcsIHNvIHRoZQorICAgICB2YWxpZCByZWdpc3RlciBudW1iZXJzIHJ1biBmcm9tIDAgdG8gcmVnX21hc2tfbGVuICogOCAtIDEuICAKKworICAgICBXZSdyZSBhc3N1bWluZyBlaWdodC1iaXQgYnl0ZXMuICBTbyBzdWUgbWUuCisKKyAgICAgVGhlIGNhbGxlciBzaG91bGQgZnJlZSByZWdfbGlzdCB3aGVuIGRvbmUuICAqLworICBpbnQgcmVnX21hc2tfbGVuOworICB1bnNpZ25lZCBjaGFyICpyZWdfbWFzazsKK307CisKKworLyogR2l2ZW4gYW4gYWdlbnQgZXhwcmVzc2lvbiBBWCwgZmlsbCBpbiBhbiBhZ2VudF9yZXFzIHN0cnVjdHVyZSBSRVFTCisgICBkZXNjcmliaW5nIGl0LiAgKi8KK2V4dGVybiB2b2lkIGF4X3JlcXMgUEFSQU1TICgoc3RydWN0IGFnZW50X2V4cHIgKmF4LAorCQkJICAgICBzdHJ1Y3QgYWdlbnRfcmVxcyAqcmVxcykpOworCisjZW5kaWYgLyogQUdFTlRFWFBSX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9iY2FjaGUuYyBiL2dkYi9iY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjg1MTViCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2JjYWNoZS5jCkBAIC0wLDAgKzEsMjE5IEBACisvKiBJbXBsZW1lbnQgYSBjYWNoZWQgb2JzdGFjay4KKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIChmbmZAY3lnbnVzLmNvbSkKKyAgIENvcHlyaWdodCAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAib2JzdGFjay5oIgorI2luY2x1ZGUgImJjYWNoZS5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIJCS8qIEZvciBtZW1jcHkgZGVjbGFyYXRpb24gKi8KKworLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGhhc2ggUEFSQU1TICgodm9pZCAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgKmxvb2t1cF9jYWNoZSBQQVJBTVMgKCh2b2lkICosIGludCwgaW50LCBzdHJ1Y3QgYmNhY2hlICopKTsKKworLyogRklYTUU6ICBJbmNyZWRpYmx5IHNpbXBsaXN0aWMgaGFzaCBnZW5lcmF0b3IuICBQcm9iYWJseSB3YXkgdG9vIGV4cGVuc2l2ZQorIChjb25zaWRlciBsb25nIHN0cmluZ3MpIGFuZCB1bmxpa2VseSB0byBoYXZlIGdvb2QgZGlzdHJpYnV0aW9uIGFjcm9zcyBoYXNoCisgdmFsdWVzIGZvciB0eXBpY2FsIGlucHV0LiAqLworCitzdGF0aWMgdW5zaWduZWQgaW50CitoYXNoIChieXRlcywgY291bnQpCisgICAgIHZvaWQgKmJ5dGVzOworICAgICBpbnQgY291bnQ7Cit7CisgIHVuc2lnbmVkIGludCBsZW47CisgIHVuc2lnbmVkIGxvbmcgaGFzaHZhbDsKKyAgdW5zaWduZWQgaW50IGM7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEgPSBieXRlczsKKworICBoYXNodmFsID0gMDsKKyAgbGVuID0gMDsKKyAgd2hpbGUgKGNvdW50LS0gPiAwKQorICAgIHsKKyAgICAgIGMgPSAqZGF0YSsrOworICAgICAgaGFzaHZhbCArPSBjICsgKGMgPDwgMTcpOworICAgICAgaGFzaHZhbCBePSBoYXNodmFsID4+IDI7CisgICAgICArK2xlbjsKKyAgICB9CisgIGhhc2h2YWwgKz0gbGVuICsgKGxlbiA8PCAxNyk7CisgIGhhc2h2YWwgXj0gaGFzaHZhbCA+PiAyOworICByZXR1cm4gKGhhc2h2YWwgJSBCQ0FDSEVfSEFTSFNJWkUpOworfQorCitzdGF0aWMgdm9pZCAqCitsb29rdXBfY2FjaGUgKGJ5dGVzLCBjb3VudCwgaGFzaHZhbCwgYmNhY2hlcCkKKyAgICAgdm9pZCAqYnl0ZXM7CisgICAgIGludCBjb3VudDsKKyAgICAgaW50IGhhc2h2YWw7CisgICAgIHN0cnVjdCBiY2FjaGUgKmJjYWNoZXA7Cit7CisgIHZvaWQgKmxvY2F0aW9uID0gTlVMTDsKKyAgc3RydWN0IGhhc2hsaW5rICoqaGFzaHRhYmxlcDsKKyAgc3RydWN0IGhhc2hsaW5rICpsaW5rcDsKKworICBoYXNodGFibGVwID0gYmNhY2hlcCAtPiBpbmRleHRhYmxlW2NvdW50XTsKKyAgaWYgKGhhc2h0YWJsZXAgIT0gTlVMTCkKKyAgICB7CisgICAgICBsaW5rcCA9IGhhc2h0YWJsZXBbaGFzaHZhbF07CisgICAgICB3aGlsZSAobGlua3AgIT0gTlVMTCkKKwl7CisJICBpZiAobWVtY21wIChCQ0FDSEVfREFUQSAobGlua3ApLCBieXRlcywgY291bnQpID09IDApCisJICAgIHsKKwkgICAgICBsb2NhdGlvbiA9IEJDQUNIRV9EQVRBIChsaW5rcCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGxpbmtwID0gbGlua3AgLT4gbmV4dDsKKwl9CisgICAgfQorICByZXR1cm4gKGxvY2F0aW9uKTsKK30KKwordm9pZCAqCitiY2FjaGUgKGJ5dGVzLCBjb3VudCwgYmNhY2hlcCkKKyAgICAgdm9pZCAqYnl0ZXM7CisgICAgIGludCBjb3VudDsKKyAgICAgc3RydWN0IGJjYWNoZSAqYmNhY2hlcDsKK3sKKyAgaW50IGhhc2h2YWw7CisgIHZvaWQgKmxvY2F0aW9uOworICBzdHJ1Y3QgaGFzaGxpbmsgKm5ld2xpbms7CisgIHN0cnVjdCBoYXNobGluayAqKmxpbmtwcDsKKyAgc3RydWN0IGhhc2hsaW5rICoqKmhhc2h0YWJsZXBwOworCisgIGlmIChjb3VudCA+PSBCQ0FDSEVfTUFYTEVOR1RIKQorICAgIHsKKyAgICAgIC8qIFJhcmUgZW5vdWdoIHRvIGp1c3Qgc3Rhc2ggdW5pcXVlIGNvcGllcyAqLworICAgICAgbG9jYXRpb24gPSAodm9pZCAqKSBvYnN0YWNrX2FsbG9jICgmYmNhY2hlcC0+Y2FjaGUsIGNvdW50KTsKKyAgICAgIGJjYWNoZXAgLT4gY2FjaGVfYnl0ZXMgKz0gY291bnQ7CisgICAgICBtZW1jcHkgKGxvY2F0aW9uLCBieXRlcywgY291bnQpOworICAgICAgYmNhY2hlcCAtPiBiY2FjaGVfb3ZlcmZsb3dzKys7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaGFzaHZhbCA9IGhhc2ggKGJ5dGVzLCBjb3VudCk7CisgICAgICBsb2NhdGlvbiA9IGxvb2t1cF9jYWNoZSAoYnl0ZXMsIGNvdW50LCBoYXNodmFsLCBiY2FjaGVwKTsKKyAgICAgIGlmIChsb2NhdGlvbiAhPSBOVUxMKQorCXsKKwkgIGJjYWNoZXAgLT4gY2FjaGVfc2F2aW5ncyArPSBjb3VudDsKKwkgIGJjYWNoZXAgLT4gY2FjaGVfaGl0cysrOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBiY2FjaGVwIC0+IGNhY2hlX21pc3NlcysrOworCSAgaGFzaHRhYmxlcHAgPSAmYmNhY2hlcCAtPiBpbmRleHRhYmxlW2NvdW50XTsKKwkgIGlmICgqaGFzaHRhYmxlcHAgPT0gTlVMTCkKKwkgICAgeworCSAgICAgICpoYXNodGFibGVwcCA9IChzdHJ1Y3QgaGFzaGxpbmsgKiopCisJCW9ic3RhY2tfYWxsb2MgKCZiY2FjaGVwLT5jYWNoZSwgQkNBQ0hFX0hBU0hTSVpFICogc2l6ZW9mIChzdHJ1Y3QgaGFzaGxpbmsgKikpOworCSAgICAgIGJjYWNoZXAgLT4gY2FjaGVfYnl0ZXMgKz0gQkNBQ0hFX0hBU0hTSVpFICogc2l6ZW9mIChzdHJ1Y3QgaGFzaGxpbmsgKik7CisJICAgICAgbWVtc2V0ICgqaGFzaHRhYmxlcHAsIDAsIEJDQUNIRV9IQVNIU0laRSAqIHNpemVvZiAoc3RydWN0IGhhc2hsaW5rICopKTsKKwkgICAgfQorCSAgbGlua3BwID0gJigqaGFzaHRhYmxlcHApW2hhc2h2YWxdOworCSAgbmV3bGluayA9IChzdHJ1Y3QgaGFzaGxpbmsgKikKKwkgICAgb2JzdGFja19hbGxvYyAoJmJjYWNoZXAtPmNhY2hlLCBCQ0FDSEVfREFUQV9BTElHTk1FTlQgKyBjb3VudCk7CisJICBiY2FjaGVwIC0+IGNhY2hlX2J5dGVzICs9IEJDQUNIRV9EQVRBX0FMSUdOTUVOVCArIGNvdW50OworCSAgbWVtY3B5IChCQ0FDSEVfREFUQSAobmV3bGluayksIGJ5dGVzLCBjb3VudCk7CisJICBuZXdsaW5rIC0+IG5leHQgPSAqbGlua3BwOworCSAgKmxpbmtwcCA9IG5ld2xpbms7CisJICBsb2NhdGlvbiA9IEJDQUNIRV9EQVRBIChuZXdsaW5rKTsKKwl9CisgICAgfQorICByZXR1cm4gKGxvY2F0aW9uKTsKK30KKworI2lmIE1BSU5URU5BTkNFX0NNRFMKKwordm9pZAorcHJpbnRfYmNhY2hlX3N0YXRpc3RpY3MgKGJjYWNoZXAsIGlkKQorICAgICBzdHJ1Y3QgYmNhY2hlICpiY2FjaGVwOworICAgICBjaGFyICppZDsKK3sKKyAgc3RydWN0IGhhc2hsaW5rICoqaGFzaHRhYmxlcDsKKyAgc3RydWN0IGhhc2hsaW5rICpsaW5rcDsKKyAgaW50IHRpZHgsIHRjb3VudCwgaGlkeCwgaGNvdW50LCBsY291bnQsIGxtYXgsIHRlbXAsIGxtYXh0LCBsbWF4aDsKKworICBmb3IgKGxtYXggPSBsY291bnQgPSB0Y291bnQgPSBoY291bnQgPSB0aWR4ID0gMDsgdGlkeCA8IEJDQUNIRV9NQVhMRU5HVEg7IHRpZHgrKykKKyAgICB7CisgICAgICBoYXNodGFibGVwID0gYmNhY2hlcCAtPiBpbmRleHRhYmxlW3RpZHhdOworICAgICAgaWYgKGhhc2h0YWJsZXAgIT0gTlVMTCkKKwl7CisJICB0Y291bnQrKzsKKwkgIGZvciAoaGlkeCA9IDA7IGhpZHggPCBCQ0FDSEVfSEFTSFNJWkU7IGhpZHgrKykKKwkgICAgeworCSAgICAgIGxpbmtwID0gaGFzaHRhYmxlcFtoaWR4XTsKKwkgICAgICBpZiAobGlua3AgIT0gTlVMTCkKKwkJeworCQkgIGhjb3VudCsrOworCQkgIGZvciAodGVtcCA9IDA7IGxpbmtwICE9IE5VTEw7IGxpbmtwID0gbGlua3AgLT4gbmV4dCkKKwkJICAgIHsKKwkJICAgICAgbGNvdW50Kys7CisJCSAgICAgIHRlbXArKzsKKwkJICAgIH0KKwkJICBpZiAodGVtcCA+IGxtYXgpCisJCSAgICB7CisJCSAgICAgIGxtYXggPSB0ZW1wOworCQkgICAgICBsbWF4dCA9IHRpZHg7CisJCSAgICAgIGxtYXhoID0gaGlkeDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgcHJpbnRmX2ZpbHRlcmVkICgiICBDYWNoZWQgJyVzJyBzdGF0aXN0aWNzOlxuIiwgaWQpOworICBwcmludGZfZmlsdGVyZWQgKCIgICAgQ2FjaGUgaGl0czogJWRcbiIsIGJjYWNoZXAgLT4gY2FjaGVfaGl0cyk7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgICBDYWNoZSBtaXNzZXM6ICVkXG4iLCBiY2FjaGVwIC0+IGNhY2hlX21pc3Nlcyk7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgICBDYWNoZSBoaXQgcmF0aW86ICIpOworICBpZiAoYmNhY2hlcCAtPiBjYWNoZV9oaXRzICsgYmNhY2hlcCAtPiBjYWNoZV9taXNzZXMgPiAwKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkJSVcbiIsICgoYmNhY2hlcCAtPiBjYWNoZV9oaXRzKSAqIDEwMCkgLworCQkgICAgICAgKGJjYWNoZXAgLT4gY2FjaGVfaGl0cyArIGJjYWNoZXAgLT4gY2FjaGVfbWlzc2VzKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiKG5vdCBhcHBsaWNhYmxlKVxuIik7CisgICAgfQorICBwcmludGZfZmlsdGVyZWQgKCIgICAgU3BhY2UgdXNlZCBmb3IgY2FjaGluZzogJWRcbiIsIGJjYWNoZXAgLT4gY2FjaGVfYnl0ZXMpOworICBwcmludGZfZmlsdGVyZWQgKCIgICAgU3BhY2Ugc2F2ZWQgYnkgY2FjaGUgaGl0czogJWRcbiIsIGJjYWNoZXAgLT4gY2FjaGVfc2F2aW5ncyk7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgICBOdW1iZXIgb2YgYmNhY2hlIG92ZXJmbG93czogJWRcbiIsIGJjYWNoZXAgLT4gYmNhY2hlX292ZXJmbG93cyk7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgICBOdW1iZXIgb2YgaW5kZXggYnVja2V0cyB1c2VkOiAlZFxuIiwgdGNvdW50KTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIE51bWJlciBvZiBoYXNoIHRhYmxlIGJ1Y2tldHMgdXNlZDogJWRcbiIsIGhjb3VudCk7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgICBOdW1iZXIgb2YgY2hhaW5lZCBpdGVtczogJWRcbiIsIGxjb3VudCk7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgICBBdmVyYWdlIGhhc2ggdGFibGUgcG9wdWxhdGlvbjogIik7CisgIGlmICh0Y291bnQgPiAwKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkJSVcbiIsIChoY291bnQgKiAxMDApIC8gKHRjb3VudCAqIEJDQUNIRV9IQVNIU0laRSkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIihub3QgYXBwbGljYWJsZSlcbiIpOworICAgIH0KKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIEF2ZXJhZ2UgY2hhaW4gbGVuZ3RoICIpOworICBpZiAoaGNvdW50ID4gMCkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIlZFxuIiwgbGNvdW50IC8gaGNvdW50KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIobm90IGFwcGxpY2FibGUpXG4iKTsKKyAgICB9CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgICBNYXhpbXVtIGNoYWluIGxlbmd0aCAlZCBhdCAlZDolZFxuIiwgbG1heCwgbG1heHQsIGxtYXhoKTsKK30KKworI2VuZGlmCS8qIE1BSU5URU5BTkNFX0NNRFMgKi8KZGlmZiAtLWdpdCBhL2dkYi9iY2FjaGUuaCBiL2dkYi9iY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjBjNjJlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2JjYWNoZS5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIEluY2x1ZGUgZmlsZSBjYWNoZWQgb2JzdGFjayBpbXBsZW1lbnRhdGlvbi4KKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIChmbmZAY3lnbnVzLmNvbSkKKyAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgQkNBQ0hFX0gKKyNkZWZpbmUgQkNBQ0hFX0ggMQorCisjZGVmaW5lIEJDQUNIRV9IQVNITEVOR1RICTEyCS8qIE51bWJlciBvZiBiaXRzIGluIGhhc2ggdmFsdWUgKi8KKyNkZWZpbmUgQkNBQ0hFX0hBU0hTSVpFCSgxIDw8IEJDQUNIRV9IQVNITEVOR1RIKQorI2RlZmluZSBCQ0FDSEVfTUFYTEVOR1RICTEyOAorCisvKiBOb3RlIHRoYXQgdGhlIHVzZXIgZGF0YSBpcyBzdG9yZWQgaW4gZGF0YVtdLiAgU2luY2UgaXQgY2FuIGJlIGFueSB0eXBlLAorICAgaXQgbmVlZHMgdG8gaGF2ZSB0aGUgc2FtZSBhbGlnbm1lbnQgIGFzIHRoZSBtb3N0IHN0cmljdCBhbGlnbm1lbnQgb2YgCisgICBhbnkgdHlwZSBvbiB0aGUgaG9zdCBtYWNoaW5lLiAgU28gZG8gaXQgdGhlIHNhbWUgd2F5IG9ic3RhY2sgZG9lcy4gKi8KKworc3RydWN0IGhhc2hsaW5rIHsKKyAgc3RydWN0IGhhc2hsaW5rICpuZXh0OworICB1bmlvbiB7CisgICAgY2hhciBkYXRhWzFdOworICAgIGRvdWJsZSBkdW1teTsKKyAgfSBkOworfTsKKworLyogQkNBQ0hFX0RBVEEgaXMgdXNlZCB0byBnZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhY2hlZCBkYXRhLiAqLworCisjZGVmaW5lIEJDQUNIRV9EQVRBKHApICgocCktPmQuZGF0YSkKKworLyogQkNBQ0hFX0RBVEFfQUxJR05NRU5UIGlzIHVzZWQgdG8gZ2V0IHRoZSBvZmZzZXQgb2YgdGhlIHN0YXJ0IG9mCisgICBjYWNoZWQgZGF0YSB3aXRoaW4gdGhlIGhhc2hsaW5rIHN0cnVjdC4gIFRoaXMgdmFsdWUsIHBsdXMgdGhlCisgICBzaXplIG9mIHRoZSBjYWNoZWQgZGF0YSwgaXMgdGhlIGFtb3VudCBvZiBzcGFjZSB0byBhbGxvY2F0ZSBmb3IKKyAgIGEgaGFzaGxpbmsgc3RydWN0IHRvIGhvbGQgdGhlIG5leHQgcG9pbnRlciBhbmQgdGhlIGRhdGEuICovCisKKyNkZWZpbmUgQkNBQ0hFX0RBVEFfQUxJR05NRU5UIFwKKwkoKChjaGFyICopIEJDQUNIRV9EQVRBKChzdHJ1Y3QgaGFzaGxpbmsqKSAwKSAtIChjaGFyICopIDApKQorCitzdHJ1Y3QgYmNhY2hlIHsKKyAgc3RydWN0IG9ic3RhY2sgY2FjaGU7CisgIHN0cnVjdCBoYXNobGluayAqKmluZGV4dGFibGVbQkNBQ0hFX01BWExFTkdUSF07CisgIGludCBjYWNoZV9oaXRzOworICBpbnQgY2FjaGVfbWlzc2VzOworICBpbnQgY2FjaGVfYnl0ZXM7CisgIGludCBjYWNoZV9zYXZpbmdzOworICBpbnQgYmNhY2hlX292ZXJmbG93czsKK307CisKK2V4dGVybiB2b2lkICoKK2JjYWNoZSBQQVJBTVMgKCh2b2lkICpieXRlcywgaW50IGNvdW50LCBzdHJ1Y3QgYmNhY2hlICpiY2FjaGVwKSk7CisKKyNpZiBNQUlOVEVOQU5DRV9DTURTCisKK2V4dGVybiB2b2lkCitwcmludF9iY2FjaGVfc3RhdGlzdGljcyBQQVJBTVMgKChzdHJ1Y3QgYmNhY2hlICosIGNoYXIgKikpOworCisjZW5kaWYJLyogTUFJTlRFTkFOQ0VfQ01EUyAqLworCisjZW5kaWYgLyogQkNBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9ibG9ja2ZyYW1lLmMgYi9nZGIvYmxvY2tmcmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNjZjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvYmxvY2tmcmFtZS5jCkBAIC0wLDAgKzEsMTMwMSBAQAorLyogR2V0IGluZm8gZnJvbSBzdGFjayBmcmFtZXM7CisgICBjb252ZXJ0IGJldHdlZW4gZnJhbWVzLCBibG9ja3MsIGZ1bmN0aW9ucyBhbmQgcGMgdmFsdWVzLgorICAgQ29weXJpZ2h0IDE5ODYsIDg3LCA4OCwgODksIDkxLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgICAgICAgICAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgIm9iamZpbGVzLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAidmFsdWUuaCIJCS8qIGZvciByZWFkX3JlZ2lzdGVyICovCisjaW5jbHVkZSAidGFyZ2V0LmgiCQkvKiBmb3IgdGFyZ2V0X2hhc19zdGFjayAqLworI2luY2x1ZGUgImluZmVyaW9yLmgiCQkvKiBmb3IgcmVhZF9wYyAqLworI2luY2x1ZGUgImFubm90YXRlLmgiCisKKy8qIFByb3RvdHlwZXMgZm9yIGV4cG9ydGVkIGZ1bmN0aW9ucy4gKi8KKwordm9pZCBfaW5pdGlhbGl6ZV9ibG9ja2ZyYW1lIFBBUkFNUyAoKHZvaWQpKTsKKworLyogQSBkZWZhdWx0IEZSQU1FX0NIQUlOX1ZBTElELCBpbiB0aGUgZm9ybSB0aGF0IGlzIHN1aXRhYmxlIGZvciBtb3N0CisgICB0YXJnZXRzLiAgSWYgRlJBTUVfQ0hBSU5fVkFMSUQgcmV0dXJucyB6ZXJvIGl0IG1lYW5zIHRoYXQgdGhlIGdpdmVuCisgICBmcmFtZSBpcyB0aGUgb3V0ZXJtb3N0IG9uZSBhbmQgaGFzIG5vIGNhbGxlci4gKi8KKworaW50CitkZWZhdWx0X2ZyYW1lX2NoYWluX3ZhbGlkIChjaGFpbiwgdGhpc2ZyYW1lKQorICAgICBDT1JFX0FERFIgY2hhaW47CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICp0aGlzZnJhbWU7Cit7CisgIHJldHVybiAoKGNoYWluKSAhPSAwCisJICAmJiAhaW5zaWRlX21haW5fZnVuYyAoKHRoaXNmcmFtZSkgLT4gcGMpCisJICAmJiAhaW5zaWRlX2VudHJ5X2Z1bmMgKCh0aGlzZnJhbWUpIC0+IHBjKSk7Cit9CisKKy8qIFVzZSB0aGUgYWx0ZXJuYXRlIG1ldGhvZCBvZiBhdm9pZGluZyBydW5uaW5nIHVwIG9mZiB0aGUgZW5kIG9mIHRoZQorICAgZnJhbWUgY2hhaW4gb3IgZm9sbG93aW5nIGZyYW1lcyBiYWNrIGludG8gdGhlIHN0YXJ0dXAgY29kZS4gIFNlZQorICAgdGhlIGNvbW1lbnRzIGluIG9iamZpbGVzLmguICovCisgICAKK2ludAorYWx0ZXJuYXRlX2ZyYW1lX2NoYWluX3ZhbGlkIChjaGFpbiwgdGhpc2ZyYW1lKQorICAgICBDT1JFX0FERFIgY2hhaW47CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICp0aGlzZnJhbWU7Cit7CisgIHJldHVybiAoKGNoYWluKSAhPSAwCisJICAmJiAhaW5zaWRlX2VudHJ5X2ZpbGUgKEZSQU1FX1NBVkVEX1BDICh0aGlzZnJhbWUpKSk7Cit9CisKKy8qIEEgdmVyeSBzaW1wbGUgbWV0aG9kIG9mIGRldGVybWluaW5nIGEgdmFsaWQgZnJhbWUgKi8KKyAgIAoraW50Citub25udWxsX2ZyYW1lX2NoYWluX3ZhbGlkIChjaGFpbiwgdGhpc2ZyYW1lKQorICAgICBDT1JFX0FERFIgY2hhaW47CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICp0aGlzZnJhbWU7Cit7CisgIHJldHVybiAoKGNoYWluKSAhPSAwKTsKK30KKworLyogSXMgQUREUiBpbnNpZGUgdGhlIHN0YXJ0dXAgZmlsZT8gIE5vdGUgdGhhdCBpZiB5b3VyIG1hY2hpbmUKKyAgIGhhcyBhIHdheSB0byBkZXRlY3QgdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2ssIHRoZXJlIGlzIG5vIG5lZWQKKyAgIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIEZSQU1FX0NIQUlOX1ZBTElEOyB0aGUgcmVhc29uIGZvcgorICAgZG9pbmcgc28gaXMgdGhhdCBzb21lIG1hY2hpbmVzIGhhdmUgbm8gd2F5IG9mIGRldGVjdGluZyBib3R0b20KKyAgIG9mIHN0YWNrLiAKKworICAgQSBQQyBvZiB6ZXJvIGlzIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrLiAqLworCitpbnQKK2luc2lkZV9lbnRyeV9maWxlIChhZGRyKQorICAgICBDT1JFX0FERFIgYWRkcjsKK3sKKyAgaWYgKGFkZHIgPT0gMCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKHN5bWZpbGVfb2JqZmlsZSA9PSAwKQorICAgIHJldHVybiAwOworI2lmIENBTExfRFVNTVlfTE9DQVRJT04gPT0gQVRfRU5UUllfUE9JTlQKKyAgLyogRG8gbm90IHN0b3AgYmFja3RyYWNpbmcgaWYgdGhlIHBjIGlzIGluIHRoZSBjYWxsIGR1bW15CisgICAgIGF0IHRoZSBlbnRyeSBwb2ludC4gICovCisvKiBGSVhNRTogV29uJ3QgYWx3YXlzIHdvcmsgd2l0aCB6ZXJvcyBmb3IgdGhlIGxhc3QgdHdvIGFyZ3VtZW50cyAqLworICBpZiAoUENfSU5fQ0FMTF9EVU1NWSAoYWRkciwgMCwgMCkpCQorICAgIHJldHVybiAwOworI2VuZGlmCisgIHJldHVybiAoYWRkciA+PSBzeW1maWxlX29iamZpbGUgLT4gZWkuZW50cnlfZmlsZV9sb3dwYyAmJgorCSAgYWRkciA8ICBzeW1maWxlX29iamZpbGUgLT4gZWkuZW50cnlfZmlsZV9oaWdocGMpOworfQorCisvKiBUZXN0IGEgc3BlY2lmaWVkIFBDIHZhbHVlIHRvIHNlZSBpZiBpdCBpcyBpbiB0aGUgcmFuZ2Ugb2YgYWRkcmVzc2VzCisgICB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIG1haW4oKSBmdW5jdGlvbi4gIFNlZSBjb21tZW50cyBhYm92ZSBmb3Igd2h5CisgICB3ZSBtaWdodCB3YW50IHRvIGRvIHRoaXMuCisKKyAgIFR5cGljYWxseSBjYWxsZWQgZnJvbSBGUkFNRV9DSEFJTl9WQUxJRC4KKworICAgQSBQQyBvZiB6ZXJvIGlzIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrLiAqLworCitpbnQKK2luc2lkZV9tYWluX2Z1bmMgKHBjKQorQ09SRV9BRERSIHBjOworeworICBpZiAocGMgPT0gMCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKHN5bWZpbGVfb2JqZmlsZSA9PSAwKQorICAgIHJldHVybiAwOworCisgIC8qIElmIHRoZSBhZGRyIHJhbmdlIGlzIG5vdCBzZXQgdXAgYXQgc3ltYm9sIHJlYWRpbmcgdGltZSwgc2V0IGl0IHVwIG5vdy4KKyAgICAgVGhpcyBpcyBmb3IgRlJBTUVfQ0hBSU5fVkFMSURfQUxURVJOQVRFLiBJIGRvIHRoaXMgZm9yIGNvZmYsIGJlY2F1c2UKKyAgICAgaXQgaXMgdW5hYmxlIHRvIHNldCBpdCB1cCBhbmQgc3ltYm9sIHJlYWRpbmcgdGltZS4gKi8KKworICBpZiAoc3ltZmlsZV9vYmpmaWxlIC0+IGVpLm1haW5fZnVuY19sb3dwYyA9PSBJTlZBTElEX0VOVFJZX0xPV1BDICYmCisgICAgICBzeW1maWxlX29iamZpbGUgLT4gZWkubWFpbl9mdW5jX2hpZ2hwYyA9PSBJTlZBTElEX0VOVFJZX0hJR0hQQykKKyAgICB7CisgICAgICBzdHJ1Y3Qgc3ltYm9sICptYWluc3ltOworCisgICAgICBtYWluc3ltID0gbG9va3VwX3N5bWJvbCAoIm1haW4iLCBOVUxMLCBWQVJfTkFNRVNQQUNFLCBOVUxMLCBOVUxMKTsKKyAgICAgIGlmIChtYWluc3ltICYmIFNZTUJPTF9DTEFTUyhtYWluc3ltKSA9PSBMT0NfQkxPQ0spCisgICAgICAgIHsKKyAgICAgICAgICBzeW1maWxlX29iamZpbGUtPmVpLm1haW5fZnVuY19sb3dwYyA9IAorCSAgICBCTE9DS19TVEFSVCAoU1lNQk9MX0JMT0NLX1ZBTFVFIChtYWluc3ltKSk7CisgICAgICAgICAgc3ltZmlsZV9vYmpmaWxlLT5laS5tYWluX2Z1bmNfaGlnaHBjID0gCisJICAgIEJMT0NLX0VORCAoU1lNQk9MX0JMT0NLX1ZBTFVFIChtYWluc3ltKSk7CisgICAgICAgIH0KKyAgICB9CisgIHJldHVybiAoc3ltZmlsZV9vYmpmaWxlIC0+IGVpLm1haW5fZnVuY19sb3dwYyAgPD0gcGMgJiYKKwkgIHN5bWZpbGVfb2JqZmlsZSAtPiBlaS5tYWluX2Z1bmNfaGlnaHBjID4gcGMpOworfQorCisvKiBUZXN0IGEgc3BlY2lmaWVkIFBDIHZhbHVlIHRvIHNlZSBpZiBpdCBpcyBpbiB0aGUgcmFuZ2Ugb2YgYWRkcmVzc2VzCisgICB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHByb2Nlc3MgZW50cnkgcG9pbnQgZnVuY3Rpb24uICBTZWUgY29tbWVudHMKKyAgIGluIG9iamZpbGVzLmggZm9yIHdoeSB3ZSBtaWdodCB3YW50IHRvIGRvIHRoaXMuCisKKyAgIFR5cGljYWxseSBjYWxsZWQgZnJvbSBGUkFNRV9DSEFJTl9WQUxJRC4KKworICAgQSBQQyBvZiB6ZXJvIGlzIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrLiAqLworCitpbnQKK2luc2lkZV9lbnRyeV9mdW5jIChwYykKK0NPUkVfQUREUiBwYzsKK3sKKyAgaWYgKHBjID09IDApCisgICAgcmV0dXJuIDE7CisgIGlmIChzeW1maWxlX29iamZpbGUgPT0gMCkKKyAgICByZXR1cm4gMDsKKyNpZiBDQUxMX0RVTU1ZX0xPQ0FUSU9OID09IEFUX0VOVFJZX1BPSU5UCisgIC8qIERvIG5vdCBzdG9wIGJhY2t0cmFjaW5nIGlmIHRoZSBwYyBpcyBpbiB0aGUgY2FsbCBkdW1teQorICAgICBhdCB0aGUgZW50cnkgcG9pbnQuICAqLworLyogRklYTUU6IFdvbid0IGFsd2F5cyB3b3JrIHdpdGggemVyb3MgZm9yIHRoZSBsYXN0IHR3byBhcmd1bWVudHMgKi8KKyAgaWYgKFBDX0lOX0NBTExfRFVNTVkgKHBjLCAwLCAwKSkKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorICByZXR1cm4gKHN5bWZpbGVfb2JqZmlsZSAtPiBlaS5lbnRyeV9mdW5jX2xvd3BjICA8PSBwYyAmJgorCSAgc3ltZmlsZV9vYmpmaWxlIC0+IGVpLmVudHJ5X2Z1bmNfaGlnaHBjID4gcGMpOworfQorCisvKiBJbmZvIGFib3V0IHRoZSBpbm5lcm1vc3Qgc3RhY2sgZnJhbWUgKGNvbnRlbnRzIG9mIEZQIHJlZ2lzdGVyKSAqLworCitzdGF0aWMgc3RydWN0IGZyYW1lX2luZm8gKmN1cnJlbnRfZnJhbWU7CisKKy8qIENhY2hlIGZvciBmcmFtZSBhZGRyZXNzZXMgYWxyZWFkeSByZWFkIGJ5IGdkYi4gIFZhbGlkIG9ubHkgd2hpbGUKKyAgIGluZmVyaW9yIGlzIHN0b3BwZWQuICBDb250cm9sIHZhcmlhYmxlcyBmb3IgdGhlIGZyYW1lIGNhY2hlIHNob3VsZAorICAgYmUgbG9jYWwgdG8gdGhpcyBtb2R1bGUuICAqLworCitzdGF0aWMgc3RydWN0IG9ic3RhY2sgZnJhbWVfY2FjaGVfb2JzdGFjazsKKwordm9pZCAqCitmcmFtZV9vYnN0YWNrX2FsbG9jIChzaXplKQorICAgICB1bnNpZ25lZCBsb25nIHNpemU7Cit7CisgIHJldHVybiBvYnN0YWNrX2FsbG9jICgmZnJhbWVfY2FjaGVfb2JzdGFjaywgc2l6ZSk7Cit9CisKK3ZvaWQKK2ZyYW1lX3NhdmVkX3JlZ3NfemFsbG9jIChmaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworeworICBmaS0+c2F2ZWRfcmVncyA9IChDT1JFX0FERFIqKQorICAgIGZyYW1lX29ic3RhY2tfYWxsb2MgKFNJWkVPRl9GUkFNRV9TQVZFRF9SRUdTKTsKKyAgbWVtc2V0IChmaS0+c2F2ZWRfcmVncywgMCwgU0laRU9GX0ZSQU1FX1NBVkVEX1JFR1MpOworfQorCisKKy8qIFJldHVybiB0aGUgaW5uZXJtb3N0IChjdXJyZW50bHkgZXhlY3V0aW5nKSBzdGFjayBmcmFtZS4gICovCisKK3N0cnVjdCBmcmFtZV9pbmZvICoKK2dldF9jdXJyZW50X2ZyYW1lICgpCit7CisgIGlmIChjdXJyZW50X2ZyYW1lID09IE5VTEwpCisgICAgeworICAgICAgaWYgKHRhcmdldF9oYXNfc3RhY2spCisJY3VycmVudF9mcmFtZSA9IGNyZWF0ZV9uZXdfZnJhbWUgKHJlYWRfZnAgKCksIHJlYWRfcGMgKCkpOworICAgICAgZWxzZQorCWVycm9yICgiTm8gc3RhY2suIik7CisgICAgfQorICByZXR1cm4gY3VycmVudF9mcmFtZTsKK30KKwordm9pZAorc2V0X2N1cnJlbnRfZnJhbWUgKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIGN1cnJlbnRfZnJhbWUgPSBmcmFtZTsKK30KKworLyogQ3JlYXRlIGFuIGFyYml0cmFyeSAoaS5lLiBhZGRyZXNzIHNwZWNpZmllZCBieSB1c2VyKSBvciBpbm5lcm1vc3QgZnJhbWUuCisgICBBbHdheXMgcmV0dXJucyBhIG5vbi1OVUxMIHZhbHVlLiAgKi8KKworc3RydWN0IGZyYW1lX2luZm8gKgorY3JlYXRlX25ld19mcmFtZSAoYWRkciwgcGMpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBDT1JFX0FERFIgcGM7Cit7CisgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKKyAgY2hhciAqbmFtZTsKKworICBmaSA9IChzdHJ1Y3QgZnJhbWVfaW5mbyAqKQorICAgIG9ic3RhY2tfYWxsb2MgKCZmcmFtZV9jYWNoZV9vYnN0YWNrLAorCQkgICBzaXplb2YgKHN0cnVjdCBmcmFtZV9pbmZvKSk7CisKKyAgLyogQXJiaXRyYXJ5IGZyYW1lICovCisgIGZpLT5zYXZlZF9yZWdzID0gTlVMTDsKKyAgZmktPm5leHQgPSBOVUxMOworICBmaS0+cHJldiA9IE5VTEw7CisgIGZpLT5mcmFtZSA9IGFkZHI7CisgIGZpLT5wYyA9IHBjOworICBmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gKHBjLCAmbmFtZSwgKENPUkVfQUREUiAqKU5VTEwsKENPUkVfQUREUiAqKU5VTEwpOworICBmaS0+c2lnbmFsX2hhbmRsZXJfY2FsbGVyID0gSU5fU0lHVFJBTVAgKGZpLT5wYywgbmFtZSk7CisKKyNpZmRlZiBJTklUX0VYVFJBX0ZSQU1FX0lORk8KKyAgSU5JVF9FWFRSQV9GUkFNRV9JTkZPICgwLCBmaSk7CisjZW5kaWYKKworICByZXR1cm4gZmk7Cit9CisKKy8qIFJldHVybiB0aGUgZnJhbWUgdGhhdCBjYWxsZWQgRkkuCisgICBJZiBGSSBpcyB0aGUgb3JpZ2luYWwgZnJhbWUgKGl0IGhhcyBubyBjYWxsZXIpLCByZXR1cm4gMC4gICovCisKK3N0cnVjdCBmcmFtZV9pbmZvICoKK2dldF9wcmV2X2ZyYW1lIChmcmFtZSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworeworICByZXR1cm4gZ2V0X3ByZXZfZnJhbWVfaW5mbyAoZnJhbWUpOworfQorCisvKiBSZXR1cm4gdGhlIGZyYW1lIHRoYXQgRlJBTUUgY2FsbHMgKE5VTEwgaWYgRlJBTUUgaXMgdGhlIGlubmVybW9zdAorICAgZnJhbWUpLiAgKi8KKworc3RydWN0IGZyYW1lX2luZm8gKgorZ2V0X25leHRfZnJhbWUgKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIHJldHVybiBmcmFtZS0+bmV4dDsKK30KKworLyogRmx1c2ggdGhlIGVudGlyZSBmcmFtZSBjYWNoZS4gICovCisKK3ZvaWQKK2ZsdXNoX2NhY2hlZF9mcmFtZXMgKCkKK3sKKyAgLyogU2luY2Ugd2UgY2FuJ3QgcmVhbGx5IGJlIHN1cmUgd2hhdCB0aGUgZmlyc3Qgb2JqZWN0IGFsbG9jYXRlZCB3YXMgKi8KKyAgb2JzdGFja19mcmVlICgmZnJhbWVfY2FjaGVfb2JzdGFjaywgMCk7CisgIG9ic3RhY2tfaW5pdCAoJmZyYW1lX2NhY2hlX29ic3RhY2spOworCisgIGN1cnJlbnRfZnJhbWUgPSBOVUxMOyAgLyogSW52YWxpZGF0ZSBjYWNoZSAqLworICBzZWxlY3RfZnJhbWUgKE5VTEwsIC0xKTsKKyAgYW5ub3RhdGVfZnJhbWVzX2ludmFsaWQgKCk7Cit9CisKKy8qIEZsdXNoIHRoZSBmcmFtZSBjYWNoZSwgYW5kIHN0YXJ0IGEgbmV3IG9uZSBpZiBuZWNlc3NhcnkuICAqLworCit2b2lkCityZWluaXRfZnJhbWVfY2FjaGUgKCkKK3sKKyAgZmx1c2hfY2FjaGVkX2ZyYW1lcyAoKTsKKworICAvKiBGSVhNRTogVGhlIGluZmVyaW9yX3BpZCB0ZXN0IGlzIHdyb25nIGlmIHRoZXJlIGlzIGEgY29yZWZpbGUuICAqLworICBpZiAoaW5mZXJpb3JfcGlkICE9IDApCisgICAgeworICAgICAgc2VsZWN0X2ZyYW1lIChnZXRfY3VycmVudF9mcmFtZSAoKSwgMCk7CisgICAgfQorfQorCisvKiBJZiBhIG1hY2hpbmUgYWxsb3dzIGZyYW1lbGVzcyBmdW5jdGlvbnMsIGl0IHNob3VsZCBkZWZpbmUgYSBtYWNybworICAgRlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT04oRkksIEZSQU1FTEVTUykgaW4gcGFyYW0uaC4gIEZJIGlzIHRoZSBzdHJ1Y3QKKyAgIGZyYW1lX2luZm8gZm9yIHRoZSBmcmFtZSwgYW5kIEZSQU1FTEVTUyBzaG91bGQgYmUgc2V0IHRvIG5vbnplcm8KKyAgIGlmIGl0IHJlcHJlc2VudHMgYSBmcmFtZWxlc3MgZnVuY3Rpb24gaW52b2NhdGlvbi4gICovCisKKy8qIFJldHVybiBub256ZXJvIGlmIHRoZSBmdW5jdGlvbiBmb3IgdGhpcyBmcmFtZSBsYWNrcyBhIHByb2xvZ3VlLiAgTWFueQorICAgbWFjaGluZXMgY2FuIGRlZmluZSBGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTiB0byBqdXN0IGNhbGwgdGhpcworICAgZnVuY3Rpb24uICAqLworCitpbnQKK2ZyYW1lbGVzc19sb29rX2Zvcl9wcm9sb2d1ZSAoZnJhbWUpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgQ09SRV9BRERSIGZ1bmNfc3RhcnQsIGFmdGVyX3Byb2xvZ3VlOworICBmdW5jX3N0YXJ0ID0gZ2V0X3BjX2Z1bmN0aW9uX3N0YXJ0IChmcmFtZS0+cGMpOworICBpZiAoZnVuY19zdGFydCkKKyAgICB7CisgICAgICBmdW5jX3N0YXJ0ICs9IEZVTkNUSU9OX1NUQVJUX09GRlNFVDsKKyAgICAgIGFmdGVyX3Byb2xvZ3VlID0gZnVuY19zdGFydDsKKyNpZmRlZiBTS0lQX1BST0xPR1VFX0ZSQU1FTEVTU19QCisgICAgICAvKiBUaGlzIGlzIGZhc3Rlciwgc2luY2Ugb25seSBjYXJlIHdoZXRoZXIgdGhlcmUgKmlzKiBhIHByb2xvZ3VlLAorCSBub3QgaG93IGxvbmcgaXQgaXMuICAqLworICAgICAgU0tJUF9QUk9MT0dVRV9GUkFNRUxFU1NfUCAoYWZ0ZXJfcHJvbG9ndWUpOworI2Vsc2UKKyAgICAgIFNLSVBfUFJPTE9HVUUgKGFmdGVyX3Byb2xvZ3VlKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIGFmdGVyX3Byb2xvZ3VlID09IGZ1bmNfc3RhcnQ7CisgICAgfQorICBlbHNlIGlmIChmcmFtZS0+cGMgPT0gMCkKKyAgICAvKiBBIGZyYW1lIHdpdGggYSB6ZXJvIFBDIGlzIHVzdWFsbHkgY3JlYXRlZCBieSBkZXJlZmVyZW5jaW5nIGEgTlVMTAorICAgICAgIGZ1bmN0aW9uIHBvaW50ZXIsIG5vcm1hbGx5IGNhdXNpbmcgYW4gaW1tZWRpYXRlIGNvcmUgZHVtcCBvZiB0aGUKKyAgICAgICBpbmZlcmlvci4gTWFyayBmdW5jdGlvbiBhcyBmcmFtZWxlc3MsIGFzIHRoZSBpbmZlcmlvciBoYXMgbm8gY2hhbmNlCisgICAgICAgb2Ygc2V0dGluZyB1cCBhIHN0YWNrIGZyYW1lLiAgKi8KKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIC8qIElmIHdlIGNhbid0IGZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiwgd2UgZG9uJ3QgcmVhbGx5CisgICAgICAga25vdyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpcyBmcmFtZWxlc3MsIGJ1dCB3ZSBzaG91bGQgYmUgYWJsZQorICAgICAgIHRvIGdldCBhIHJlYXNvbmFibGUgKGkuZS4gYmVzdCB3ZSBjYW4gZG8gdW5kZXIgdGhlCisgICAgICAgY2lyY3Vtc3RhbmNlcykgYmFja3RyYWNlIGJ5IHNheWluZyB0aGF0IGl0IGlzbid0LiAgKi8KKyAgICByZXR1cm4gMDsKK30KKworLyogRGVmYXVsdCBhIGZldyBtYWNyb3MgdGhhdCBwZW9wbGUgc2VsZG9tIHJlZGVmaW5lLiAgKi8KKworI2lmICFkZWZpbmVkIChJTklUX0ZSQU1FX1BDKQorI2RlZmluZSBJTklUX0ZSQU1FX1BDKGZyb21sZWFmLCBwcmV2KSBcCisgIHByZXYtPnBjID0gKGZyb21sZWFmID8gU0FWRURfUENfQUZURVJfQ0FMTCAocHJldi0+bmV4dCkgOiBcCisJICAgICAgcHJldi0+bmV4dCA/IEZSQU1FX1NBVkVEX1BDIChwcmV2LT5uZXh0KSA6IHJlYWRfcGMgKCkpOworI2VuZGlmCisKKyNpZm5kZWYgRlJBTUVfQ0hBSU5fQ09NQklORQorI2RlZmluZQlGUkFNRV9DSEFJTl9DT01CSU5FKGNoYWluLCB0aGlzZnJhbWUpIChjaGFpbikKKyNlbmRpZgorCisvKiBSZXR1cm4gYSBzdHJ1Y3R1cmUgY29udGFpbmluZyB2YXJpb3VzIGludGVyZXN0aW5nIGluZm9ybWF0aW9uCisgICBhYm91dCB0aGUgZnJhbWUgdGhhdCBjYWxsZWQgTkVYVF9GUkFNRS4gIFJldHVybnMgTlVMTAorICAgaWYgdGhlcmUgaXMgbm8gc3VjaCBmcmFtZS4gICovCisKK3N0cnVjdCBmcmFtZV9pbmZvICoKK2dldF9wcmV2X2ZyYW1lX2luZm8gKG5leHRfZnJhbWUpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpuZXh0X2ZyYW1lOworeworICBDT1JFX0FERFIgYWRkcmVzcyA9IDA7CisgIHN0cnVjdCBmcmFtZV9pbmZvICpwcmV2OworICBpbnQgZnJvbWxlYWYgPSAwOworICBjaGFyICpuYW1lOworCisgIC8qIElmIHRoZSByZXF1ZXN0ZWQgZW50cnkgaXMgaW4gdGhlIGNhY2hlLCByZXR1cm4gaXQuCisgICAgIE90aGVyd2lzZSwgZmlndXJlIG91dCB3aGF0IHRoZSBhZGRyZXNzIHNob3VsZCBiZSBmb3IgdGhlIGVudHJ5CisgICAgIHdlJ3JlIGFib3V0IHRvIGFkZCB0byB0aGUgY2FjaGUuICovCisKKyAgaWYgKCFuZXh0X2ZyYW1lKQorICAgIHsKKyNpZiAwCisgICAgICAvKiBUaGlzIHNjcmV3cyB2YWx1ZV9vZl92YXJpYWJsZSwgd2hpY2gganVzdCB3YW50cyBhIG5pY2UgY2xlYW4KKwkgTlVMTCByZXR1cm4gZnJvbSBibG9ja19pbm5lcm1vc3RfZnJhbWUgaWYgdGhlcmUgYXJlIG5vIGZyYW1lcy4KKwkgSSBkb24ndCB0aGluayBJJ3ZlIGV2ZXIgc2VlbiB0aGlzIG1lc3NhZ2UgaGFwcGVuIG90aGVyd2lzZS4KKwkgQW5kIHJldHVybmluZyBOVUxMIGhlcmUgaXMgYSBwZXJmZWN0bHkgbGVnaXRpbWF0ZSB0aGluZyB0byBkby4gICovCisgICAgICBpZiAoIWN1cnJlbnRfZnJhbWUpCisJeworCSAgZXJyb3IgKCJZb3UgaGF2ZW4ndCBzZXQgdXAgYSBwcm9jZXNzJ3Mgc3RhY2sgdG8gZXhhbWluZS4iKTsKKwl9CisjZW5kaWYKKworICAgICAgcmV0dXJuIGN1cnJlbnRfZnJhbWU7CisgICAgfQorCisgIC8qIElmIHdlIGhhdmUgdGhlIHByZXYgb25lLCByZXR1cm4gaXQgKi8KKyAgaWYgKG5leHRfZnJhbWUtPnByZXYpCisgICAgcmV0dXJuIG5leHRfZnJhbWUtPnByZXY7CisKKyAgLyogT24gc29tZSBtYWNoaW5lcyBpdCBpcyBwb3NzaWJsZSB0byBjYWxsIGEgZnVuY3Rpb24gd2l0aG91dAorICAgICBzZXR0aW5nIHVwIGEgc3RhY2sgZnJhbWUgZm9yIGl0LiAgT24gdGhlc2UgbWFjaGluZXMsIHdlCisgICAgIGRlZmluZSB0aGlzIG1hY3JvIHRvIHRha2UgdHdvIGFyZ3M7IGEgZnJhbWVpbmZvIHBvaW50ZXIKKyAgICAgaWRlbnRpZnlpbmcgYSBmcmFtZSBhbmQgYSB2YXJpYWJsZSB0byBzZXQgb3IgY2xlYXIgaWYgaXQgaXMKKyAgICAgb3IgaXNuJ3QgbGVhZmxlc3MuICAqLworI2lmZGVmIEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OCisgIC8qIFN0aWxsIGRvbid0IHdhbnQgdG8gd29ycnkgYWJvdXQgdGhpcyBleGNlcHQgb24gdGhlIGlubmVybW9zdAorICAgICBmcmFtZS4gIFRoaXMgbWFjcm8gd2lsbCBzZXQgRlJPTUxFQUYgaWYgTkVYVF9GUkFNRSBpcyBhCisgICAgIGZyYW1lbGVzcyBmdW5jdGlvbiBpbnZvY2F0aW9uLiAgKi8KKyAgaWYgKCEobmV4dF9mcmFtZS0+bmV4dCkpCisgICAgeworICAgICAgRlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT04gKG5leHRfZnJhbWUsIGZyb21sZWFmKTsKKyAgICAgIGlmIChmcm9tbGVhZikKKwlhZGRyZXNzID0gRlJBTUVfRlAgKG5leHRfZnJhbWUpOworICAgIH0KKyNlbmRpZgorCisgIGlmICghZnJvbWxlYWYpCisgICAgeworICAgICAgLyogVHdvIG1hY3JvcyBkZWZpbmVkIGluIHRtLmggc3BlY2lmeSB0aGUgbWFjaGluZS1kZXBlbmRlbnQKKwkgYWN0aW9ucyB0byBiZSBwZXJmb3JtZWQgaGVyZS4KKwkgRmlyc3QsIGdldCB0aGUgZnJhbWUncyBjaGFpbi1wb2ludGVyLgorCSBJZiB0aGF0IGlzIHplcm8sIHRoZSBmcmFtZSBpcyB0aGUgb3V0ZXJtb3N0IGZyYW1lIG9yIGEgbGVhZgorCSBjYWxsZWQgYnkgdGhlIG91dGVybW9zdCBmcmFtZS4gIFRoaXMgbWVhbnMgdGhhdCBpZiBzdGFydAorCSBjYWxscyBtYWluIHdpdGhvdXQgYSBmcmFtZSwgd2UnbGwgcmV0dXJuIDAgKHdoaWNoIGlzIGZpbmUKKwkgYW55d2F5KS4KKworCSBOb3BlOyB0aGVyZSdzIGEgcHJvYmxlbS4gIFRoaXMgYWxzbyByZXR1cm5zIHdoZW4gdGhlIGN1cnJlbnQKKwkgcm91dGluZSBpcyBhIGxlYWYgb2YgbWFpbi4gIFRoaXMgaXMgdW5hY2NlcHRhYmxlLiAgV2UgbW92ZQorCSB0aGlzIHRvIGFmdGVyIHRoZSBmZmkgdGVzdDsgSSdkIHJhdGhlciBoYXZlIGJhY2t0cmFjZXMgZnJvbQorCSBzdGFydCBnbyBjdXJmbHV5IHRoYW4gaGF2ZSBhbiBhYm9ydCBjYWxsZWQgZnJvbSBtYWluIG5vdCBzaG93CisJIG1haW4uICAqLworICAgICAgYWRkcmVzcyA9IEZSQU1FX0NIQUlOIChuZXh0X2ZyYW1lKTsKKyAgICAgIGlmICghRlJBTUVfQ0hBSU5fVkFMSUQgKGFkZHJlc3MsIG5leHRfZnJhbWUpKQorCXJldHVybiAwOworICAgICAgYWRkcmVzcyA9IEZSQU1FX0NIQUlOX0NPTUJJTkUgKGFkZHJlc3MsIG5leHRfZnJhbWUpOworICAgIH0KKyAgaWYgKGFkZHJlc3MgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBwcmV2ID0gKHN0cnVjdCBmcmFtZV9pbmZvICopCisgICAgb2JzdGFja19hbGxvYyAoJmZyYW1lX2NhY2hlX29ic3RhY2ssCisJCSAgIHNpemVvZiAoc3RydWN0IGZyYW1lX2luZm8pKTsKKworICBwcmV2LT5zYXZlZF9yZWdzID0gTlVMTDsKKyAgaWYgKG5leHRfZnJhbWUpCisgICAgbmV4dF9mcmFtZS0+cHJldiA9IHByZXY7CisgIHByZXYtPm5leHQgPSBuZXh0X2ZyYW1lOworICBwcmV2LT5wcmV2ID0gKHN0cnVjdCBmcmFtZV9pbmZvICopIDA7CisgIHByZXYtPmZyYW1lID0gYWRkcmVzczsKKyAgcHJldi0+c2lnbmFsX2hhbmRsZXJfY2FsbGVyID0gMDsKKworLyogVGhpcyBjaGFuZ2Ugc2hvdWxkIG5vdCBiZSBuZWVkZWQsIEZJWE1FISAgV2Ugc2hvdWxkCisgICBkZXRlcm1pbmUgd2hldGhlciBhbnkgdGFyZ2V0cyAqbmVlZCogSU5JVF9GUkFNRV9QQyB0byBoYXBwZW4KKyAgIGFmdGVyIElOSVRfRVhUUkFfRlJBTUVfSU5GTyBhbmQgY29tZSB1cCB3aXRoIGEgc2ltcGxlIHdheSB0bworICAgZXhwcmVzcyB3aGF0IGdvZXMgb24gaGVyZS4KKworICAgICAgSU5JVF9FWFRSQV9GUkFNRV9JTkZPIGlzIGNhbGxlZCBmcm9tIHR3byBwbGFjZXM6IGNyZWF0ZV9uZXdfZnJhbWUKKyAgICAgIAkJKHdoZXJlIHRoZSBQQyBpcyBhbHJlYWR5IHNldCB1cCkgYW5kIGhlcmUgKHdoZXJlIGl0IGlzbid0KS4KKyAgICAgIElOSVRfRlJBTUVfUEMgaXMgb25seSBjYWxsZWQgZnJvbSBoZXJlLCBhbHdheXMgYWZ0ZXIKKyAgICAgIAkJSU5JVF9FWFRSQV9GUkFNRV9JTkZPLgorICAgCisgICBUaGUgY2F0Y2ggaXMgdGhlIE1JUFMsIHdoZXJlIElOSVRfRVhUUkFfRlJBTUVfSU5GTyByZXF1aXJlcyB0aGUgUEMKKyAgIHZhbHVlICh3aGljaCBoYXNuJ3QgYmVlbiBzZXQgeWV0KS4gIFNvbWUgb3RoZXIgbWFjaGluZXMgYXBwZWFyIHRvCisgICByZXF1aXJlIElOSVRfRVhUUkFfRlJBTUVfSU5GTyBiZWZvcmUgdGhleSBjYW4gZG8gSU5JVF9GUkFNRV9QQy4gIFBob28uCisKKyAgIFdlIHNob3VsZG4ndCBuZWVkIElOSVRfRlJBTUVfUENfRklSU1QgdG8gYWRkIG1vcmUgY29tcGxpY2F0aW9uIHRvCisgICBhbiBhbHJlYWR5IG92ZXJjb21wbGljYXRlZCBwYXJ0IG9mIEdEQi4gICBnbnVAY3lnbnVzLmNvbSwgMTVTZXA5Mi4KKworICAgQXNzdW1pbmcgdGhhdCBzb21lIG1hY2hpbmVzIG5lZWQgSU5JVF9GUkFNRV9QQyBhZnRlcgorICAgSU5JVF9FWFRSQV9GUkFNRV9JTkZPLCBvbmUgcG9zc2libGUgc2NoZW1lOgorCisgICBTRVRVUF9JTk5FUk1PU1RfRlJBTUUoKQorICAgICBEZWZhdWx0IHZlcnNpb24gaXMganVzdCBjcmVhdGVfbmV3X2ZyYW1lIChyZWFkX2ZwICgpKSwKKyAgICAgcmVhZF9wYyAoKSkuICBNYWNoaW5lcyB3aXRoIGV4dHJhIGZyYW1lIGluZm8gd291bGQgZG8gdGhhdCAob3IgdGhlCisgICAgIGxvY2FsIGVxdWl2YWxlbnQpIGFuZCB0aGVuIHNldCB0aGUgZXh0cmEgZmllbGRzLgorICAgU0VUVVBfQVJCSVRSQVJZX0ZSQU1FKGFyZ2MsIGFyZ3YpCisgICAgIE9ubHkgY2hhbmdlIGhlcmUgaXMgdGhhdCBjcmVhdGVfbmV3X2ZyYW1lIHdvdWxkIG5vIGxvbmdlciBpbml0IGV4dHJhCisgICAgIGZyYW1lIGluZm87IFNFVFVQX0FSQklUUkFSWV9GUkFNRSB3b3VsZCBoYXZlIHRvIGRvIHRoYXQuCisgICBJTklUX1BSRVZfRlJBTUUoZnJvbWxlYWYsIHByZXYpCisgICAgIFJlcGxhY2UgSU5JVF9FWFRSQV9GUkFNRV9JTkZPIGFuZCBJTklUX0ZSQU1FX1BDLiAgVGhpcyBzaG91bGQKKyAgICAgYWxzbyByZXR1cm4gYSBmbGFnIHNheWluZyB3aGV0aGVyIHRvIGtlZXAgdGhlIG5ldyBmcmFtZSwgb3IKKyAgICAgd2hldGhlciB0byBkaXNjYXJkIGl0LCBiZWNhdXNlIG9uIHNvbWUgbWFjaGluZXMgKGUuZy4gIG1pcHMpIGl0CisgICAgIGlzIHJlYWxseSBhd2t3YXJkIHRvIGhhdmUgRlJBTUVfQ0hBSU5fVkFMSUQgY2FsbGVkICpiZWZvcmUqCisgICAgIElOSVRfRVhUUkFfRlJBTUVfSU5GTyAodGhlcmUgaXMgbm8gZ29vZCB3YXkgdG8gZ2V0IGluZm9ybWF0aW9uCisgICAgIGRlZHVjZWQgaW4gRlJBTUVfQ0hBSU5fVkFMSUQgaW50byB0aGUgZXh0cmEgZmllbGRzIG9mIHRoZSBuZXcgZnJhbWUpLgorICAgc3RkX2ZyYW1lX3BjKGZyb21sZWFmLCBwcmV2KQorICAgICBUaGlzIGlzIHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIElOSVRfUFJFVl9GUkFNRS4gIEl0IGp1c3QgZG9lcyB3aGF0CisgICAgIHRoZSBkZWZhdWx0IElOSVRfRlJBTUVfUEMgZG9lcy4gIFNvbWUgbWFjaGluZXMgd2lsbCBjYWxsIGl0IGZyb20KKyAgICAgSU5JVF9QUkVWX0ZSQU1FIChlaXRoZXIgYXQgdGhlIGJlZ2lubmluZywgdGhlIGVuZCwgb3IgaW4gdGhlIG1pZGRsZSkuCisgICAgIFNvbWUgbWFjaGluZXMgd29uJ3QgdXNlIGl0LgorICAga2luZ2RvbkBjeWdudXMuY29tLCAxM0FwcjkzLCAzMUphbjk0LCAxNERlYzk0LiAgKi8KKworI2lmZGVmIElOSVRfRlJBTUVfUENfRklSU1QKKyAgSU5JVF9GUkFNRV9QQ19GSVJTVCAoZnJvbWxlYWYsIHByZXYpOworI2VuZGlmCisKKyNpZmRlZiBJTklUX0VYVFJBX0ZSQU1FX0lORk8KKyAgSU5JVF9FWFRSQV9GUkFNRV9JTkZPKGZyb21sZWFmLCBwcmV2KTsKKyNlbmRpZgorCisgIC8qIFRoaXMgZW50cnkgaXMgaW4gdGhlIGZyYW1lIHF1ZXVlIG5vdywgd2hpY2ggaXMgZ29vZCBzaW5jZQorICAgICBGUkFNRV9TQVZFRF9QQyBtYXkgdXNlIHRoYXQgcXVldWUgdG8gZmlndXJlIG91dCBpdHMgdmFsdWUKKyAgICAgKHNlZSB0bS1zcGFyYy5oKS4gIFdlIHdhbnQgdGhlIHBjIHNhdmVkIGluIHRoZSBpbmZlcmlvciBmcmFtZS4gKi8KKyAgSU5JVF9GUkFNRV9QQyhmcm9tbGVhZiwgcHJldik7CisKKyAgLyogSWYgLT5mcmFtZSBhbmQgLT5wYyBhcmUgdW5jaGFuZ2VkLCB3ZSBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgZ2V0dGluZworICAgICBvdXJzZWx2ZXMgaW50byBhbiBpbmZpbml0ZSBiYWNrdHJhY2UuICBTb21lIGFyY2hpdGVjdHVyZXMgY2hlY2sgdGhpcworICAgICBpbiBGUkFNRV9DSEFJTiBvciB0aGVyZWFib3V0cywgYnV0IGl0IHNlZW1zIGxpa2UgdGhlcmUgaXMgbm8gcmVhc29uCisgICAgIHRoaXMgY2FuJ3QgYmUgYW4gYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGNoZWNrLiAgKi8KKyAgaWYgKG5leHRfZnJhbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAocHJldi0+ZnJhbWUgPT0gbmV4dF9mcmFtZS0+ZnJhbWUKKwkgICYmIHByZXYtPnBjID09IG5leHRfZnJhbWUtPnBjKQorCXsKKwkgIG5leHRfZnJhbWUtPnByZXYgPSBOVUxMOworCSAgb2JzdGFja19mcmVlICgmZnJhbWVfY2FjaGVfb2JzdGFjaywgcHJldik7CisJICByZXR1cm4gTlVMTDsKKwl9CisgICAgfQorCisgIGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAocHJldi0+cGMsICZuYW1lLAorCQkJICAgIChDT1JFX0FERFIgKilOVUxMLChDT1JFX0FERFIgKilOVUxMKTsKKyAgaWYgKElOX1NJR1RSQU1QIChwcmV2LT5wYywgbmFtZSkpCisgICAgcHJldi0+c2lnbmFsX2hhbmRsZXJfY2FsbGVyID0gMTsKKworICByZXR1cm4gcHJldjsKK30KKworQ09SRV9BRERSCitnZXRfZnJhbWVfcGMgKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIHJldHVybiBmcmFtZS0+cGM7Cit9CisKKworI2lmZGVmIEZSQU1FX0ZJTkRfU0FWRURfUkVHUworLyogWFhYIC0gZGVwcmVjYXRlZC4gIFRoaXMgaXMgYSBjb21wYXRpYmlsaXR5IGZ1bmN0aW9uIGZvciB0YXJnZXRzCisgICB0aGF0IGRvIG5vdCB5ZXQgaW1wbGVtZW50IEZSQU1FX0lOSVRfU0FWRURfUkVHUy4gICovCisvKiBGaW5kIHRoZSBhZGRyZXNzZXMgaW4gd2hpY2ggcmVnaXN0ZXJzIGFyZSBzYXZlZCBpbiBGUkFNRS4gICovCisKK3ZvaWQKK2dldF9mcmFtZV9zYXZlZF9yZWdzIChmcmFtZSwgc2F2ZWRfcmVnc19hZGRyKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7CisgICAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICpzYXZlZF9yZWdzX2FkZHI7Cit7CisgIGlmIChmcmFtZS0+c2F2ZWRfcmVncyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZyYW1lLT5zYXZlZF9yZWdzID0gKENPUkVfQUREUiopCisJZnJhbWVfb2JzdGFja19hbGxvYyAoU0laRU9GX0ZSQU1FX1NBVkVEX1JFR1MpOworICAgIH0KKyAgaWYgKHNhdmVkX3JlZ3NfYWRkciA9PSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzIHNhdmVkX3JlZ3M7CisgICAgICBGUkFNRV9GSU5EX1NBVkVEX1JFR1MgKGZyYW1lLCBzYXZlZF9yZWdzKTsKKyAgICAgIG1lbWNweSAoZnJhbWUtPnNhdmVkX3JlZ3MsICZzYXZlZF9yZWdzLCBTSVpFT0ZfRlJBTUVfU0FWRURfUkVHUyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgRlJBTUVfRklORF9TQVZFRF9SRUdTIChmcmFtZSwgKnNhdmVkX3JlZ3NfYWRkcik7CisgICAgICBtZW1jcHkgKGZyYW1lLT5zYXZlZF9yZWdzLCBzYXZlZF9yZWdzX2FkZHIsIFNJWkVPRl9GUkFNRV9TQVZFRF9SRUdTKTsKKyAgICB9Cit9CisjZW5kaWYKKworLyogUmV0dXJuIHRoZSBpbm5lcm1vc3QgbGV4aWNhbCBibG9jayBpbiBleGVjdXRpb24KKyAgIGluIGEgc3BlY2lmaWVkIHN0YWNrIGZyYW1lLiAgVGhlIGZyYW1lIGFkZHJlc3MgaXMgYXNzdW1lZCB2YWxpZC4gICovCisKK3N0cnVjdCBibG9jayAqCitnZXRfZnJhbWVfYmxvY2sgKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIENPUkVfQUREUiBwYzsKKworICBwYyA9IGZyYW1lLT5wYzsKKyAgaWYgKGZyYW1lLT5uZXh0ICE9IDAgJiYgZnJhbWUtPm5leHQtPnNpZ25hbF9oYW5kbGVyX2NhbGxlciA9PSAwKQorICAgIC8qIFdlIGFyZSBub3QgaW4gdGhlIGlubmVybW9zdCBmcmFtZSBhbmQgd2Ugd2VyZSBub3QgaW50ZXJydXB0ZWQKKyAgICAgICBieSBhIHNpZ25hbC4gIFdlIG5lZWQgdG8gc3VidHJhY3Qgb25lIHRvIGdldCB0aGUgY29ycmVjdCBibG9jaywKKyAgICAgICBpbiBjYXNlIHRoZSBjYWxsIGluc3RydWN0aW9uIHdhcyB0aGUgbGFzdCBpbnN0cnVjdGlvbiBvZiB0aGUgYmxvY2suCisgICAgICAgSWYgdGhlcmUgYXJlIGFueSBtYWNoaW5lcyBvbiB3aGljaCB0aGUgc2F2ZWQgcGMgZG9lcyBub3QgcG9pbnQgdG8KKyAgICAgICBhZnRlciB0aGUgY2FsbCBpbnNuLCB3ZSBwcm9iYWJseSB3YW50IHRvIG1ha2UgZnJhbWUtPnBjIHBvaW50IGFmdGVyCisgICAgICAgdGhlIGNhbGwgaW5zbiBhbnl3YXkuICAqLworICAgIC0tcGM7CisgIHJldHVybiBibG9ja19mb3JfcGMgKHBjKTsKK30KKworc3RydWN0IGJsb2NrICoKK2dldF9jdXJyZW50X2Jsb2NrICgpCit7CisgIHJldHVybiBibG9ja19mb3JfcGMgKHJlYWRfcGMgKCkpOworfQorCitDT1JFX0FERFIKK2dldF9wY19mdW5jdGlvbl9zdGFydCAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGJsb2NrICpibDsKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bWJvbCAqc3ltYm9sOworICByZWdpc3RlciBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisgIENPUkVfQUREUiBmc3RhcnQ7CisKKyAgaWYgKChibCA9IGJsb2NrX2Zvcl9wYyAocGMpKSAhPSBOVUxMICYmCisgICAgICAoc3ltYm9sID0gYmxvY2tfZnVuY3Rpb24gKGJsKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBibCA9IFNZTUJPTF9CTE9DS19WQUxVRSAoc3ltYm9sKTsKKyAgICAgIGZzdGFydCA9IEJMT0NLX1NUQVJUIChibCk7CisgICAgfQorICBlbHNlIGlmICgobXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbF9ieV9wYyAocGMpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZzdGFydCA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmc3RhcnQgPSAwOworICAgIH0KKyAgcmV0dXJuIChmc3RhcnQpOworfQorCisvKiBSZXR1cm4gdGhlIHN5bWJvbCBmb3IgdGhlIGZ1bmN0aW9uIGV4ZWN1dGluZyBpbiBmcmFtZSBGUkFNRS4gICovCisKK3N0cnVjdCBzeW1ib2wgKgorZ2V0X2ZyYW1lX2Z1bmN0aW9uIChmcmFtZSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworeworICByZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmJsID0gZ2V0X2ZyYW1lX2Jsb2NrIChmcmFtZSk7CisgIGlmIChibCA9PSAwKQorICAgIHJldHVybiAwOworICByZXR1cm4gYmxvY2tfZnVuY3Rpb24gKGJsKTsKK30KKwwKKworLyogUmV0dXJuIHRoZSBibG9ja3ZlY3RvciBpbW1lZGlhdGVseSBjb250YWluaW5nIHRoZSBpbm5lcm1vc3QgbGV4aWNhbCBibG9jaworICAgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIHBjIHZhbHVlIGFuZCBzZWN0aW9uLCBvciAwIGlmIHRoZXJlIGlzIG5vbmUuCisgICBQSU5ERVggaXMgYSBwb2ludGVyIHRvIHRoZSBpbmRleCB2YWx1ZSBvZiB0aGUgYmxvY2suICBJZiBQSU5ERVgKKyAgIGlzIE5VTEwsIHdlIGRvbid0IHBhc3MgdGhpcyBpbmZvcm1hdGlvbiBiYWNrIHRvIHRoZSBjYWxsZXIuICAqLworCitzdHJ1Y3QgYmxvY2t2ZWN0b3IgKgorYmxvY2t2ZWN0b3JfZm9yX3BjX3NlY3QgKHBjLCBzZWN0aW9uLCBwaW5kZXgsIHN5bXRhYikKKyAgICAgcmVnaXN0ZXIgQ09SRV9BRERSIHBjOworICAgICBzdHJ1Y3Qgc2VjICpzZWN0aW9uOworICAgICBpbnQgKnBpbmRleDsKKyAgICAgc3RydWN0IHN5bXRhYiAqc3ltdGFiOworICAgICAKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGJsb2NrICpiOworICByZWdpc3RlciBpbnQgYm90LCB0b3AsIGhhbGY7CisgIHN0cnVjdCBibG9ja3ZlY3RvciAqYmw7CisKKyAgaWYgKHN5bXRhYiA9PSAwKQkvKiBpZiBubyBzeW10YWIgc3BlY2lmaWVkIGJ5IGNhbGxlciAqLworICAgIHsKKyAgICAgIC8qIEZpcnN0IHNlYXJjaCBhbGwgc3ltdGFicyBmb3Igb25lIHdob3NlIGZpbGUgY29udGFpbnMgb3VyIHBjICovCisgICAgICBpZiAoKHN5bXRhYiA9IGZpbmRfcGNfc2VjdF9zeW10YWIgKHBjLCBzZWN0aW9uKSkgPT0gMCkKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgYmwgPSBCTE9DS1ZFQ1RPUiAoc3ltdGFiKTsKKyAgYiA9IEJMT0NLVkVDVE9SX0JMT0NLIChibCwgMCk7CisKKyAgLyogVGhlbiBzZWFyY2ggdGhhdCBzeW10YWIgZm9yIHRoZSBzbWFsbGVzdCBibG9jayB0aGF0IHdpbnMuICAqLworICAvKiBVc2UgYmluYXJ5IHNlYXJjaCB0byBmaW5kIHRoZSBsYXN0IGJsb2NrIHRoYXQgc3RhcnRzIGJlZm9yZSBQQy4gICovCisKKyAgYm90ID0gMDsKKyAgdG9wID0gQkxPQ0tWRUNUT1JfTkJMT0NLUyAoYmwpOworCisgIHdoaWxlICh0b3AgLSBib3QgPiAxKQorICAgIHsKKyAgICAgIGhhbGYgPSAodG9wIC0gYm90ICsgMSkgPj4gMTsKKyAgICAgIGIgPSBCTE9DS1ZFQ1RPUl9CTE9DSyAoYmwsIGJvdCArIGhhbGYpOworICAgICAgaWYgKEJMT0NLX1NUQVJUIChiKSA8PSBwYykKKwlib3QgKz0gaGFsZjsKKyAgICAgIGVsc2UKKwl0b3AgPSBib3QgKyBoYWxmOworICAgIH0KKworICAvKiBOb3cgc2VhcmNoIGJhY2t3YXJkIGZvciBhIGJsb2NrIHRoYXQgZW5kcyBhZnRlciBQQy4gICovCisKKyAgd2hpbGUgKGJvdCA+PSAwKQorICAgIHsKKyAgICAgIGIgPSBCTE9DS1ZFQ1RPUl9CTE9DSyAoYmwsIGJvdCk7CisgICAgICBpZiAoQkxPQ0tfRU5EIChiKSA+PSBwYykKKwl7CisJICBpZiAocGluZGV4KQorCSAgICAqcGluZGV4ID0gYm90OworCSAgcmV0dXJuIGJsOworCX0KKyAgICAgIGJvdC0tOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB0aGUgYmxvY2t2ZWN0b3IgaW1tZWRpYXRlbHkgY29udGFpbmluZyB0aGUgaW5uZXJtb3N0IGxleGljYWwgYmxvY2sKKyAgIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBwYyB2YWx1ZSwgb3IgMCBpZiB0aGVyZSBpcyBub25lLgorICAgQmFja3dhcmQgY29tcGF0aWJpbGl0eSwgbm8gc2VjdGlvbi4gICovCisKK3N0cnVjdCBibG9ja3ZlY3RvciAqCitibG9ja3ZlY3Rvcl9mb3JfcGMgKHBjLCBwaW5kZXgpCisgICAgIHJlZ2lzdGVyIENPUkVfQUREUiBwYzsKKyAgICAgaW50ICpwaW5kZXg7Cit7CisgIHJldHVybiBibG9ja3ZlY3Rvcl9mb3JfcGNfc2VjdCAocGMsIGZpbmRfcGNfbWFwcGVkX3NlY3Rpb24gKHBjKSwKKwkJCQkgIHBpbmRleCwgTlVMTCk7Cit9CisKKy8qIFJldHVybiB0aGUgaW5uZXJtb3N0IGxleGljYWwgYmxvY2sgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIHBjIHZhbHVlCisgICBpbiB0aGUgc3BlY2lmaWVkIHNlY3Rpb24sIG9yIDAgaWYgdGhlcmUgaXMgbm9uZS4gICovCisKK3N0cnVjdCBibG9jayAqCitibG9ja19mb3JfcGNfc2VjdCAocGMsIHNlY3Rpb24pCisgICAgIHJlZ2lzdGVyIENPUkVfQUREUiBwYzsKKyAgICAgc3RydWN0IHNlYyAqc2VjdGlvbjsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGJsb2NrdmVjdG9yICpibDsKKyAgaW50IGluZGV4OworCisgIGJsID0gYmxvY2t2ZWN0b3JfZm9yX3BjX3NlY3QgKHBjLCBzZWN0aW9uLCAmaW5kZXgsIE5VTEwpOworICBpZiAoYmwpCisgICAgcmV0dXJuIEJMT0NLVkVDVE9SX0JMT0NLIChibCwgaW5kZXgpOworICByZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHRoZSBpbm5lcm1vc3QgbGV4aWNhbCBibG9jayBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgcGMgdmFsdWUsCisgICBvciAwIGlmIHRoZXJlIGlzIG5vbmUuICBCYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBubyBzZWN0aW9uLiAgKi8KKworc3RydWN0IGJsb2NrICoKK2Jsb2NrX2Zvcl9wYyAocGMpCisgICAgIHJlZ2lzdGVyIENPUkVfQUREUiBwYzsKK3sKKyAgcmV0dXJuIGJsb2NrX2Zvcl9wY19zZWN0IChwYywgZmluZF9wY19tYXBwZWRfc2VjdGlvbiAocGMpKTsKK30KKworLyogUmV0dXJuIHRoZSBmdW5jdGlvbiBjb250YWluaW5nIHBjIHZhbHVlIFBDIGluIHNlY3Rpb24gU0VDVElPTi4KKyAgIFJldHVybnMgMCBpZiBmdW5jdGlvbiBpcyBub3Qga25vd24uICAqLworCitzdHJ1Y3Qgc3ltYm9sICoKK2ZpbmRfcGNfc2VjdF9mdW5jdGlvbiAocGMsIHNlY3Rpb24pCisgICAgIENPUkVfQUREUiBwYzsKKyAgICAgc3RydWN0IHNlYyAqc2VjdGlvbjsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGJsb2NrICpiID0gYmxvY2tfZm9yX3BjX3NlY3QgKHBjLCBzZWN0aW9uKTsKKyAgaWYgKGIgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIGJsb2NrX2Z1bmN0aW9uIChiKTsKK30KKworLyogUmV0dXJuIHRoZSBmdW5jdGlvbiBjb250YWluaW5nIHBjIHZhbHVlIFBDLgorICAgUmV0dXJucyAwIGlmIGZ1bmN0aW9uIGlzIG5vdCBrbm93bi4gIEJhY2t3YXJkIGNvbXBhdGliaWxpdHksIG5vIHNlY3Rpb24gKi8KKworc3RydWN0IHN5bWJvbCAqCitmaW5kX3BjX2Z1bmN0aW9uIChwYykKKyAgICAgQ09SRV9BRERSIHBjOworeworICByZXR1cm4gZmluZF9wY19zZWN0X2Z1bmN0aW9uIChwYywgZmluZF9wY19tYXBwZWRfc2VjdGlvbiAocGMpKTsKK30KKworLyogVGhlc2UgdmFyaWFibGVzIGFyZSB1c2VkIHRvIGNhY2hlIHRoZSBtb3N0IHJlY2VudCByZXN1bHQKKyAqIG9mIGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbi4gKi8KKworc3RhdGljIENPUkVfQUREUiAgIGNhY2hlX3BjX2Z1bmN0aW9uX2xvdyAgICAgPSAwOworc3RhdGljIENPUkVfQUREUiAgIGNhY2hlX3BjX2Z1bmN0aW9uX2hpZ2ggICAgPSAwOworc3RhdGljIGNoYXIgICAgICAgKmNhY2hlX3BjX2Z1bmN0aW9uX25hbWUgICAgPSAwOworc3RhdGljIHN0cnVjdCBzZWMgKmNhY2hlX3BjX2Z1bmN0aW9uX3NlY3Rpb24gPSBOVUxMOworCisvKiBDbGVhciBjYWNoZSwgZS5nLiB3aGVuIHN5bWJvbCB0YWJsZSBpcyBkaXNjYXJkZWQuICovCisKK3ZvaWQKK2NsZWFyX3BjX2Z1bmN0aW9uX2NhY2hlKCkKK3sKKyAgY2FjaGVfcGNfZnVuY3Rpb25fbG93ID0gMDsKKyAgY2FjaGVfcGNfZnVuY3Rpb25faGlnaCA9IDA7CisgIGNhY2hlX3BjX2Z1bmN0aW9uX25hbWUgPSAoY2hhciAqKTA7CisgIGNhY2hlX3BjX2Z1bmN0aW9uX3NlY3Rpb24gPSBOVUxMOworfQorCisvKiBGaW5kcyB0aGUgImZ1bmN0aW9uIiAodGV4dCBzeW1ib2wpIHRoYXQgaXMgc21hbGxlciB0aGFuIFBDIGJ1dAorICAgZ3JlYXRlc3Qgb2YgYWxsIG9mIHRoZSBwb3RlbnRpYWwgdGV4dCBzeW1ib2xzIGluIFNFQ1RJT04uICBTZXRzCisgICAqTkFNRSBhbmQvb3IgKkFERFJFU1MgY29uZGl0aW9uYWxseSBpZiB0aGF0IHBvaW50ZXIgaXMgbm9uLW51bGwuCisgICBJZiBFTkRBRERSIGlzIG5vbi1udWxsLCB0aGVuIHNldCAqRU5EQUREUiB0byBiZSB0aGUgZW5kIG9mIHRoZQorICAgZnVuY3Rpb24gKGV4Y2x1c2l2ZSksIGJ1dCBwYXNzaW5nIEVOREFERFIgYXMgbm9uLW51bGwgbWVhbnMgdGhhdAorICAgdGhlIGZ1bmN0aW9uIG1pZ2h0IGNhdXNlIHN5bWJvbHMgdG8gYmUgcmVhZC4gIFRoaXMgZnVuY3Rpb24gZWl0aGVyCisgICBzdWNjZWVkcyBvciBmYWlscyAobm90IGhhbGZ3YXkgc3VjY2VlZHMpLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHNldHMKKyAgICpOQU1FLCAqQUREUkVTUywgYW5kICpFTkRBRERSIHRvIHJlYWwgaW5mb3JtYXRpb24gYW5kIHJldHVybnMgMS4KKyAgIElmIGl0IGZhaWxzLCBpdCBzZXRzICpOQU1FLCAqQUREUkVTUywgYW5kICpFTkRBRERSIHRvIHplcm8gYW5kCisgICByZXR1cm5zIDAuICAqLworCitpbnQKK2ZpbmRfcGNfc2VjdF9wYXJ0aWFsX2Z1bmN0aW9uIChwYywgc2VjdGlvbiwgbmFtZSwgYWRkcmVzcywgZW5kYWRkcikKKyAgICAgQ09SRV9BRERSICBwYzsKKyAgICAgYXNlY3Rpb24gICpzZWN0aW9uOworICAgICBjaGFyICAgICAqKm5hbWU7CisgICAgIENPUkVfQUREUiAqYWRkcmVzczsKKyAgICAgQ09SRV9BRERSICplbmRhZGRyOworeworICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdDsKKyAgc3RydWN0IHN5bWJvbCAgICAgICAgICpmOworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisgIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqcHNiOworICBzdHJ1Y3Qgb2JqX3NlY3Rpb24gICAgKm9zZWN0OworICBpbnQgaTsKKyAgQ09SRV9BRERSIG1hcHBlZF9wYzsKKworICBtYXBwZWRfcGMgPSBvdmVybGF5X21hcHBlZF9hZGRyZXNzIChwYywgc2VjdGlvbik7CisKKyAgaWYgKG1hcHBlZF9wYyA+PSBjYWNoZV9wY19mdW5jdGlvbl9sb3cgJiYgCisgICAgICBtYXBwZWRfcGMgPCBjYWNoZV9wY19mdW5jdGlvbl9oaWdoICYmCisgICAgICBzZWN0aW9uID09IGNhY2hlX3BjX2Z1bmN0aW9uX3NlY3Rpb24pCisgICAgZ290byByZXR1cm5fY2FjaGVkX3ZhbHVlOworCisgIC8qIElmIHNpZ3RyYW1wIGlzIGluIHRoZSB1IGFyZWEsIGl0IGNvdW50cyBhcyBhIGZ1bmN0aW9uIChlc3BlY2lhbGx5CisgICAgIGltcG9ydGFudCBmb3Igc3RlcF8xKS4gICovCisjaWYgZGVmaW5lZCBTSUdUUkFNUF9TVEFSVAorICBpZiAoSU5fU0lHVFJBTVAgKG1hcHBlZF9wYywgKGNoYXIgKilOVUxMKSkKKyAgICB7CisgICAgICBjYWNoZV9wY19mdW5jdGlvbl9sb3cgICAgID0gU0lHVFJBTVBfU1RBUlQgKG1hcHBlZF9wYyk7CisgICAgICBjYWNoZV9wY19mdW5jdGlvbl9oaWdoICAgID0gU0lHVFJBTVBfRU5EIChtYXBwZWRfcGMpOworICAgICAgY2FjaGVfcGNfZnVuY3Rpb25fbmFtZSAgICA9ICI8c2lndHJhbXA+IjsKKyAgICAgIGNhY2hlX3BjX2Z1bmN0aW9uX3NlY3Rpb24gPSBzZWN0aW9uOworICAgICAgZ290byByZXR1cm5fY2FjaGVkX3ZhbHVlOworICAgIH0KKyNlbmRpZgorCisgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGNfc2VjdGlvbiAobWFwcGVkX3BjLCBzZWN0aW9uKTsKKyAgcHN0ID0gZmluZF9wY19zZWN0X3BzeW10YWIgKG1hcHBlZF9wYywgc2VjdGlvbik7CisgIGlmIChwc3QpCisgICAgeworICAgICAgLyogTmVlZCB0byByZWFkIHRoZSBzeW1ib2xzIHRvIGdldCBhIGdvb2QgdmFsdWUgZm9yIHRoZSBlbmQgYWRkcmVzcy4gICovCisgICAgICBpZiAoZW5kYWRkciAhPSBOVUxMICYmICFwc3QtPnJlYWRpbikKKwl7CisJICAvKiBOZWVkIHRvIGdldCB0aGUgdGVybWluYWwgaW4gY2FzZSBzeW1ib2wtcmVhZGluZyBwcm9kdWNlcworCSAgICAgb3V0cHV0LiAgKi8KKwkgIHRhcmdldF90ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgKCk7CisJICBQU1lNVEFCX1RPX1NZTVRBQiAocHN0KTsKKwl9CisKKyAgICAgIGlmIChwc3QtPnJlYWRpbikKKwl7CisJICAvKiBDaGVja2luZyB3aGV0aGVyIHRoZSBtc3ltYm9sIGhhcyBhIGxhcmdlciB2YWx1ZSBpcyBmb3IgdGhlCisJICAgICAicGF0aG9sb2dpY2FsIiBjYXNlIG1lbnRpb25lZCBpbiBwcmludF9mcmFtZV9pbmZvLiAgKi8KKwkgIGYgPSBmaW5kX3BjX3NlY3RfZnVuY3Rpb24gKG1hcHBlZF9wYywgc2VjdGlvbik7CisJICBpZiAoZiAhPSBOVUxMCisJICAgICAgJiYgKG1zeW1ib2wgPT0gTlVMTAorCQkgIHx8IChCTE9DS19TVEFSVCAoU1lNQk9MX0JMT0NLX1ZBTFVFIChmKSkKKwkJICAgICAgPj0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpKSkpCisJICAgIHsKKwkgICAgICBjYWNoZV9wY19mdW5jdGlvbl9sb3cgICAgID0gQkxPQ0tfU1RBUlQgKFNZTUJPTF9CTE9DS19WQUxVRSAoZikpOworCSAgICAgIGNhY2hlX3BjX2Z1bmN0aW9uX2hpZ2ggICAgPSBCTE9DS19FTkQgICAoU1lNQk9MX0JMT0NLX1ZBTFVFIChmKSk7CisJICAgICAgY2FjaGVfcGNfZnVuY3Rpb25fbmFtZSAgICA9IFNZTUJPTF9OQU1FIChmKTsKKwkgICAgICBjYWNoZV9wY19mdW5jdGlvbl9zZWN0aW9uID0gc2VjdGlvbjsKKwkgICAgICBnb3RvIHJldHVybl9jYWNoZWRfdmFsdWU7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyogTm93IHRoYXQgc3RhdGljIHN5bWJvbHMgZ28gaW4gdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlLCBwZXJoYXBzCisJICAgICB3ZSBjb3VsZCBqdXN0IGlnbm9yZSB0aGUgcGFydGlhbCBzeW1ib2xzLiAgQnV0IGF0IGxlYXN0IGZvciBub3cKKwkgICAgIHdlIHVzZSB0aGUgcGFydGlhbCBvciBtaW5pbWFsIHN5bWJvbCwgd2hpY2hldmVyIGlzIGxhcmdlci4gICovCisJICBwc2IgPSBmaW5kX3BjX3NlY3RfcHN5bWJvbCAocHN0LCBtYXBwZWRfcGMsIHNlY3Rpb24pOworCisJICBpZiAocHNiCisJICAgICAgJiYgKG1zeW1ib2wgPT0gTlVMTCB8fAorCQkgIChTWU1CT0xfVkFMVUVfQUREUkVTUyAocHNiKQorCQkgICA+PSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCkpKSkKKwkgICAgeworCSAgICAgIC8qIFRoaXMgY2FzZSBpc24ndCBiZWluZyBjYWNoZWQgY3VycmVudGx5LiAqLworCSAgICAgIGlmIChhZGRyZXNzKQorCQkqYWRkcmVzcyA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChwc2IpOworCSAgICAgIGlmIChuYW1lKQorCQkqbmFtZSA9IFNZTUJPTF9OQU1FIChwc2IpOworCSAgICAgIC8qIGVuZGFkZHIgbm9uLU5VTEwgY2FuJ3QgaGFwcGVuIGhlcmUuICAqLworCSAgICAgIHJldHVybiAxOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBOb3QgaW4gdGhlIG5vcm1hbCBzeW1ib2wgdGFibGVzLCBzZWUgaWYgdGhlIHBjIGlzIGluIGEga25vd24gc2VjdGlvbi4KKyAgICAgSWYgaXQncyBub3QsIHRoZW4gZ2l2ZSB1cC4gIFRoaXMgZW5zdXJlcyB0aGF0IGFueXRoaW5nIGJleW9uZCB0aGUgZW5kCisgICAgIG9mIHRoZSB0ZXh0IHNlZyBkb2Vzbid0IGFwcGVhciB0byBiZSBwYXJ0IG9mIHRoZSBsYXN0IGZ1bmN0aW9uIGluIHRoZQorICAgICB0ZXh0IHNlZ21lbnQuICAqLworCisgIG9zZWN0ID0gZmluZF9wY19zZWN0X3NlY3Rpb24gKG1hcHBlZF9wYywgc2VjdGlvbik7CisKKyAgaWYgKCFvc2VjdCkKKyAgICBtc3ltYm9sID0gTlVMTDsKKworICAvKiBNdXN0IGJlIGluIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZS4gICovCisgIGlmIChtc3ltYm9sID09IE5VTEwpCisgICAgeworICAgICAgLyogTm8gYXZhaWxhYmxlIHN5bWJvbC4gICovCisgICAgICBpZiAobmFtZSAhPSBOVUxMKQorCSpuYW1lID0gMDsKKyAgICAgIGlmIChhZGRyZXNzICE9IE5VTEwpCisJKmFkZHJlc3MgPSAwOworICAgICAgaWYgKGVuZGFkZHIgIT0gTlVMTCkKKwkqZW5kYWRkciA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgY2FjaGVfcGNfZnVuY3Rpb25fbG93ICAgICA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKTsKKyAgY2FjaGVfcGNfZnVuY3Rpb25fbmFtZSAgICA9IFNZTUJPTF9OQU1FIChtc3ltYm9sKTsKKyAgY2FjaGVfcGNfZnVuY3Rpb25fc2VjdGlvbiA9IHNlY3Rpb247CisKKyAgLyogVXNlIHRoZSBsZXNzZXIgb2YgdGhlIG5leHQgbWluaW1hbCBzeW1ib2wgaW4gdGhlIHNhbWUgc2VjdGlvbiwgb3IKKyAgICAgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbiwgYXMgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uICAqLworICAKKyAgLyogU3RlcCBvdmVyIG90aGVyIHN5bWJvbHMgYXQgdGhpcyBzYW1lIGFkZHJlc3MsIGFuZCBzeW1ib2xzIGluCisgICAgIG90aGVyIHNlY3Rpb25zLCB0byBmaW5kIHRoZSBuZXh0IHN5bWJvbCBpbiB0aGlzIHNlY3Rpb24gd2l0aAorICAgICBhIGRpZmZlcmVudCBhZGRyZXNzLiAgKi8KKworICBmb3IgKGk9MTsgU1lNQk9MX05BTUUgKG1zeW1ib2wraSkgIT0gTlVMTDsgaSsrKQorICAgIHsKKyAgICAgIGlmIChTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCtpKSAhPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCkgCisJICAmJiBTWU1CT0xfQkZEX1NFQ1RJT04gKG1zeW1ib2wraSkgPT0gU1lNQk9MX0JGRF9TRUNUSU9OIChtc3ltYm9sKSkKKwlicmVhazsKKyAgICB9CisKKyAgaWYgKFNZTUJPTF9OQU1FIChtc3ltYm9sICsgaSkgIT0gTlVMTAorICAgICAgJiYgU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wgKyBpKSA8IG9zZWN0LT5lbmRhZGRyKQorICAgIGNhY2hlX3BjX2Z1bmN0aW9uX2hpZ2ggPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCArIGkpOworICBlbHNlCisgICAgLyogV2UgZ290IHRoZSBzdGFydCBhZGRyZXNzIGZyb20gdGhlIGxhc3QgbXN5bWJvbCBpbiB0aGUgb2JqZmlsZS4KKyAgICAgICBTbyB0aGUgZW5kIGFkZHJlc3MgaXMgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbi4gICovCisgICAgY2FjaGVfcGNfZnVuY3Rpb25faGlnaCA9IG9zZWN0LT5lbmRhZGRyOworCisgcmV0dXJuX2NhY2hlZF92YWx1ZToKKworICBpZiAoYWRkcmVzcykKKyAgICB7CisgICAgICBpZiAocGNfaW5fdW5tYXBwZWRfcmFuZ2UgKHBjLCBzZWN0aW9uKSkKKyAgICAgICAgKmFkZHJlc3MgPSBvdmVybGF5X3VubWFwcGVkX2FkZHJlc3MgKGNhY2hlX3BjX2Z1bmN0aW9uX2xvdywgc2VjdGlvbik7CisgICAgICBlbHNlCisgICAgICAgICphZGRyZXNzID0gY2FjaGVfcGNfZnVuY3Rpb25fbG93OworICAgIH0KKyAgICAKKyAgaWYgKG5hbWUpCisgICAgKm5hbWUgPSBjYWNoZV9wY19mdW5jdGlvbl9uYW1lOworCisgIGlmIChlbmRhZGRyKQorICAgIHsKKyAgICAgIGlmIChwY19pbl91bm1hcHBlZF9yYW5nZSAocGMsIHNlY3Rpb24pKQorICAgICAgICB7CisJICAvKiBCZWNhdXNlIHRoZSBoaWdoIGFkZHJlc3MgaXMgYWN0dWFsbHkgYmV5b25kIHRoZSBlbmQgb2YKKwkgICAgIHRoZSBmdW5jdGlvbiAoYW5kIHRoZXJlZm9yZSBwb3NzaWJseSBiZXlvbmQgdGhlIGVuZCBvZgorCSAgICAgdGhlIG92ZXJsYXkpLCB3ZSBtdXN0IGFjdHVhbGx5IGNvbnZlcnQgKGhpZ2ggLSAxKQorCSAgICAgYW5kIHRoZW4gYWRkIG9uZSB0byB0aGF0LiAqLworCisJICAqZW5kYWRkciA9IDEgKyBvdmVybGF5X3VubWFwcGVkX2FkZHJlc3MgKGNhY2hlX3BjX2Z1bmN0aW9uX2hpZ2ggLSAxLCAKKwkJCQkJCSAgIHNlY3Rpb24pOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICplbmRhZGRyID0gY2FjaGVfcGNfZnVuY3Rpb25faGlnaDsKKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIEJhY2t3YXJkIGNvbXBhdGliaWxpdHksIG5vIHNlY3Rpb24gYXJndW1lbnQgKi8KKworaW50CitmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gKHBjLCBuYW1lLCBhZGRyZXNzLCBlbmRhZGRyKQorICAgICBDT1JFX0FERFIgIHBjOworICAgICBjaGFyICAgICAqKm5hbWU7CisgICAgIENPUkVfQUREUiAqYWRkcmVzczsKKyAgICAgQ09SRV9BRERSICplbmRhZGRyOworeworICBhc2VjdGlvbiAgICAgKnNlY3Rpb247CisKKyAgc2VjdGlvbiA9IGZpbmRfcGNfb3ZlcmxheSAocGMpOworICByZXR1cm4gZmluZF9wY19zZWN0X3BhcnRpYWxfZnVuY3Rpb24gKHBjLCBzZWN0aW9uLCBuYW1lLCBhZGRyZXNzLCBlbmRhZGRyKTsKK30KKworLyogUmV0dXJuIHRoZSBpbm5lcm1vc3Qgc3RhY2sgZnJhbWUgZXhlY3V0aW5nIGluc2lkZSBvZiBCTE9DSywKKyAgIG9yIE5VTEwgaWYgdGhlcmUgaXMgbm8gc3VjaCBmcmFtZS4gIElmIEJMT0NLIGlzIE5VTEwsIGp1c3QgcmV0dXJuIE5VTEwuICAqLworCitzdHJ1Y3QgZnJhbWVfaW5mbyAqCitibG9ja19pbm5lcm1vc3RfZnJhbWUgKGJsb2NrKQorICAgICBzdHJ1Y3QgYmxvY2sgKmJsb2NrOworeworICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7CisgIHJlZ2lzdGVyIENPUkVfQUREUiBzdGFydDsKKyAgcmVnaXN0ZXIgQ09SRV9BRERSIGVuZDsKKworICBpZiAoYmxvY2sgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICBzdGFydCA9IEJMT0NLX1NUQVJUIChibG9jayk7CisgIGVuZCA9IEJMT0NLX0VORCAoYmxvY2spOworCisgIGZyYW1lID0gTlVMTDsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgZnJhbWUgPSBnZXRfcHJldl9mcmFtZSAoZnJhbWUpOworICAgICAgaWYgKGZyYW1lID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisgICAgICBpZiAoZnJhbWUtPnBjID49IHN0YXJ0ICYmIGZyYW1lLT5wYyA8IGVuZCkKKwlyZXR1cm4gZnJhbWU7CisgICAgfQorfQorCisvKiBSZXR1cm4gdGhlIGZ1bGwgRlJBTUUgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIENPUkVfQUREUgorICAgb3IgTlVMTCBpZiBubyBGUkFNRSBvbiB0aGUgY2hhaW4gY29ycmVzcG9uZHMgdG8gQ09SRV9BRERSLiAgKi8KKworc3RydWN0IGZyYW1lX2luZm8gKgorZmluZF9mcmFtZV9hZGRyX2luX2ZyYW1lX2NoYWluIChmcmFtZV9hZGRyKQorICAgICBDT1JFX0FERFIgZnJhbWVfYWRkcjsKK3sKKyAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lID0gTlVMTDsKKworICBpZiAoZnJhbWVfYWRkciA9PSAoQ09SRV9BRERSKTApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgZnJhbWUgPSBnZXRfcHJldl9mcmFtZSAoZnJhbWUpOworICAgICAgaWYgKGZyYW1lID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisgICAgICBpZiAoRlJBTUVfRlAgKGZyYW1lKSA9PSBmcmFtZV9hZGRyKQorCXJldHVybiBmcmFtZTsKKyAgICB9Cit9CisKKyNpZmRlZiBTSUdDT05URVhUX1BDX09GRlNFVAorLyogR2V0IHNhdmVkIHVzZXIgUEMgZm9yIHNpZ3RyYW1wIGZyb20gc2lnY29udGV4dCBmb3IgQlNEIHN0eWxlIHNpZ3RyYW1wLiAgKi8KKworQ09SRV9BRERSCitzaWd0cmFtcF9zYXZlZF9wYyAoZnJhbWUpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgQ09SRV9BRERSIHNpZ2NvbnRleHRfYWRkcjsKKyAgY2hhciBidWZbVEFSR0VUX1BUUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVRdOworICBpbnQgcHRyYnl0ZXMgPSBUQVJHRVRfUFRSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVDsKKyAgaW50IHNpZ2NvbnRleHRfb2ZmcyA9ICgyICogVEFSR0VUX0lOVF9CSVQpIC8gVEFSR0VUX0NIQVJfQklUOworCisgIC8qIEdldCBzaWdjb250ZXh0IGFkZHJlc3MsIGl0IGlzIHRoZSB0aGlyZCBwYXJhbWV0ZXIgb24gdGhlIHN0YWNrLiAgKi8KKyAgaWYgKGZyYW1lLT5uZXh0KQorICAgIHNpZ2NvbnRleHRfYWRkciA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKEZSQU1FX0FSR1NfQUREUkVTUyAoZnJhbWUtPm5leHQpCisJCQkJCSAgICsgRlJBTUVfQVJHU19TS0lQCisJCQkJCSAgICsgc2lnY29udGV4dF9vZmZzLAorCQkJCQkgICBwdHJieXRlcyk7CisgIGVsc2UKKyAgICBzaWdjb250ZXh0X2FkZHIgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChyZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pCisJCQkJCSAgICArIHNpZ2NvbnRleHRfb2ZmcywKKwkJCQkJICAgcHRyYnl0ZXMpOworCisgIC8qIERvbid0IGNhdXNlIGEgbWVtb3J5X2Vycm9yIHdoZW4gYWNjZXNzaW5nIHNpZ2NvbnRleHQgaW4gY2FzZSB0aGUgc3RhY2sKKyAgICAgbGF5b3V0IGhhcyBjaGFuZ2VkIG9yIHRoZSBzdGFjayBpcyBjb3JydXB0LiAgKi8KKyAgdGFyZ2V0X3JlYWRfbWVtb3J5IChzaWdjb250ZXh0X2FkZHIgKyBTSUdDT05URVhUX1BDX09GRlNFVCwgYnVmLCBwdHJieXRlcyk7CisgIHJldHVybiBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgcHRyYnl0ZXMpOworfQorI2VuZGlmIC8qIFNJR0NPTlRFWFRfUENfT0ZGU0VUICovCisKKyNpZmRlZiBVU0VfR0VORVJJQ19EVU1NWV9GUkFNRVMKKworLyoKKyAqIEdFTkVSSUMgRFVNTVkgRlJBTUVTCisgKiAKKyAqIFRoZSBmb2xsb3dpbmcgY29kZSBzZXJ2ZXMgdG8gbWFpbnRhaW4gdGhlIGR1bW15IHN0YWNrIGZyYW1lcyBmb3IKKyAqIGluZmVyaW9yIGZ1bmN0aW9uIGNhbGxzIChpZS4gd2hlbiBnZGIgY2FsbHMgaW50byB0aGUgaW5mZXJpb3IgdmlhCisgKiBjYWxsX2Z1bmN0aW9uX2J5X2hhbmQpLiAgVGhpcyBjb2RlIHNhdmVzIHRoZSBtYWNoaW5lIHN0YXRlIGJlZm9yZSAKKyAqIHRoZSBjYWxsIGluIGhvc3QgbWVtb3J5LCBzbyB3ZSBtdXN0IG1haW50YWluIGFuIGluZGVwZW5kYW50IHN0YWNrIAorICogYW5kIGtlZXAgaXQgY29uc2lzdGFudCBldGMuICBJIGFtIGF0dGVtcHRpbmcgdG8gbWFrZSB0aGlzIGNvZGUgCisgKiBnZW5lcmljIGVub3VnaCB0byBiZSB1c2VkIGJ5IG1hbnkgdGFyZ2V0cy4KKyAqCisgKiBUaGUgY2hlYXBlc3QgYW5kIG1vc3QgZ2VuZXJpYyB3YXkgdG8gZG8gQ0FMTF9EVU1NWSBvbiBhIG5ldyB0YXJnZXQKKyAqIGlzIHByb2JhYmx5IHRvIGRlZmluZSBDQUxMX0RVTU1ZIHRvIGJlIGVtcHR5LCBDQUxMX0RVTU1ZX0xFTkdUSCB0bworICogemVybywgYW5kIENBTExfRFVNTVlfTE9DQVRJT04gdG8gQVRfRU5UUlkuICBUaGVuIHlvdSBtdXN0IHJlbWVtYmVyCisgKiB0byBkZWZpbmUgUFVTSF9SRVRVUk5fQUREUkVTUywgYmVjYXVzZSBubyBjYWxsIGluc3RydWN0aW9uIHdpbGwgYmUKKyAqIGJlaW5nIGV4ZWN1dGVkIGJ5IHRoZSB0YXJnZXQuICBBbHNvIEZSQU1FX0NIQUlOX1ZBTElEIGFzCisgKiBnZW5lcmljX2ZyYW1lX2NoYWluX3ZhbGlkLiAgKi8KKworc3RhdGljIHN0cnVjdCBkdW1teV9mcmFtZSAqZHVtbXlfZnJhbWVfc3RhY2sgPSBOVUxMOworCisvKiBGdW5jdGlvbjogZmluZF9kdW1teV9mcmFtZShwYywgZnAsIHNwKQorICAgU2VhcmNoIHRoZSBzdGFjayBvZiBkdW1teSBmcmFtZXMgZm9yIG9uZSBtYXRjaGluZyB0aGUgZ2l2ZW4gUEMsIEZQIGFuZCBTUC4KKyAgIFRoaXMgaXMgdGhlIHdvcmstaG9yc2UgZm9yIHBjX2luX2NhbGxfZHVtbXkgYW5kIHJlYWRfcmVnaXN0ZXJfZHVtbXkgICAgICovCisKK2NoYXIgKiAKK2dlbmVyaWNfZmluZF9kdW1teV9mcmFtZSAocGMsIGZwKQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIENPUkVfQUREUiBmcDsKK3sKKyAgc3RydWN0IGR1bW15X2ZyYW1lICogZHVtbXlmcmFtZTsKKworICBpZiAocGMgIT0gZW50cnlfcG9pbnRfYWRkcmVzcyAoKSkKKyAgICByZXR1cm4gMDsKKworICBmb3IgKGR1bW15ZnJhbWUgPSBkdW1teV9mcmFtZV9zdGFjazsgZHVtbXlmcmFtZSAhPSBOVUxMOworICAgICAgIGR1bW15ZnJhbWUgPSBkdW1teWZyYW1lLT5uZXh0KQorICAgIGlmIChmcCA9PSBkdW1teWZyYW1lLT5mcCB8fCBmcCA9PSBkdW1teWZyYW1lLT5zcCkKKyAgICAgIC8qIFRoZSBmcmFtZSBpbiBxdWVzdGlvbiBsaWVzIGJldHdlZW4gdGhlIHNhdmVkIGZwIGFuZCBzcCwgaW5jbHVzaXZlICovCisgICAgICByZXR1cm4gZHVtbXlmcmFtZS0+cmVnczsKKworICByZXR1cm4gMDsKK30KKworLyogRnVuY3Rpb246IHBjX2luX2NhbGxfZHVtbXkgKHBjLCBmcCkKKyAgIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBkdW1teSBmcmFtZSBjcmVhdGVkIGJ5IGdkYiBmb3IgYW4gaW5mZXJpb3IgY2FsbCAqLworCitpbnQKK2dlbmVyaWNfcGNfaW5fY2FsbF9kdW1teSAocGMsIGZwKQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIENPUkVfQUREUiBmcDsKK3sKKyAgLyogaWYgZmluZF9kdW1teV9mcmFtZSBzdWNjZWVkcywgdGhlbiBQQyBpcyBpbiBhIGNhbGwgZHVtbXkgKi8KKyAgcmV0dXJuIChnZW5lcmljX2ZpbmRfZHVtbXlfZnJhbWUgKHBjLCBmcCkgIT0gMCk7Cit9CisKKy8qIEZ1bmN0aW9uOiByZWFkX3JlZ2lzdGVyX2R1bW15IAorICAgRmluZCBhIHNhdmVkIHJlZ2lzdGVyIGZyb20gYmVmb3JlIEdEQiBjYWxscyBhIGZ1bmN0aW9uIGluIHRoZSBpbmZlcmlvciAqLworCitDT1JFX0FERFIKK2dlbmVyaWNfcmVhZF9yZWdpc3Rlcl9kdW1teSAocGMsIGZwLCByZWdubykKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBDT1JFX0FERFIgZnA7CisgICAgIGludCByZWdubzsKK3sKKyAgY2hhciAqZHVtbXlfcmVncyA9IGdlbmVyaWNfZmluZF9kdW1teV9mcmFtZSAocGMsIGZwKTsKKworICBpZiAoZHVtbXlfcmVncykKKyAgICByZXR1cm4gZXh0cmFjdF9hZGRyZXNzICgmZHVtbXlfcmVnc1tSRUdJU1RFUl9CWVRFIChyZWdubyldLAorCQkJICAgIFJFR0lTVEVSX1JBV19TSVpFKHJlZ25vKSk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLyogU2F2ZSBhbGwgdGhlIHJlZ2lzdGVycyBvbiB0aGUgZHVtbXkgZnJhbWUgc3RhY2suICBNb3N0IHBvcnRzIHNhdmUgdGhlCisgICByZWdpc3RlcnMgb24gdGhlIHRhcmdldCBzdGFjay4gIFRoaXMgcmVzdWx0cyBpbiBsb3RzIG9mIHVubmVjZXNzYXJ5IG1lbW9yeQorICAgcmVmZXJlbmNlcywgd2hpY2ggYXJlIHNsb3cgd2hlbiBkZWJ1Z2dpbmcgdmlhIGEgc2VyaWFsIGxpbmUuICBJbnN0ZWFkLCB3ZQorICAgc2F2ZSBhbGwgdGhlIHJlZ2lzdGVycyBpbnRlcm5hbGx5LCBhbmQgbmV2ZXIgd3JpdGUgdGhlbSB0byB0aGUgc3RhY2suICBUaGUKKyAgIHJlZ2lzdGVycyBnZXQgcmVzdG9yZWQgd2hlbiB0aGUgY2FsbGVkIGZ1bmN0aW9uIHJldHVybnMgdG8gdGhlIGVudHJ5IHBvaW50LAorICAgd2hlcmUgYSBicmVha3BvaW50IGlzIGxheWluZyBpbiB3YWl0LiAgKi8KKwordm9pZAorZ2VuZXJpY19wdXNoX2R1bW15X2ZyYW1lICgpCit7CisgIHN0cnVjdCBkdW1teV9mcmFtZSAqZHVtbXlfZnJhbWU7CisgIENPUkVfQUREUiBmcCA9IChnZXRfY3VycmVudF9mcmFtZSAoKSktPmZyYW1lOworCisgIC8qIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgc3RhbGUgZHVtbXkgZnJhbWVzLCAKKyAgICAgcGVyaGFwcyBsZWZ0IG92ZXIgZnJvbSB3aGVuIGEgbG9uZ2p1bXAgdG9vayB1cyBvdXQgb2YgYSAKKyAgICAgZnVuY3Rpb24gdGhhdCB3YXMgY2FsbGVkIGJ5IHRoZSBkZWJ1Z2dlciAqLworCisgIGR1bW15X2ZyYW1lID0gZHVtbXlfZnJhbWVfc3RhY2s7CisgIHdoaWxlIChkdW1teV9mcmFtZSkKKyAgICBpZiAoSU5ORVJfVEhBTiAoZHVtbXlfZnJhbWUtPmZwLCBmcCkpCS8qIHN0YWxlIC0tIGRlc3Ryb3khICovCisgICAgICB7CisJZHVtbXlfZnJhbWVfc3RhY2sgPSBkdW1teV9mcmFtZS0+bmV4dDsKKwlmcmVlIChkdW1teV9mcmFtZSk7CisJZHVtbXlfZnJhbWUgPSBkdW1teV9mcmFtZV9zdGFjazsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBkdW1teV9mcmFtZSA9IGR1bW15X2ZyYW1lLT5uZXh0OworCisgIGR1bW15X2ZyYW1lID0geG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZHVtbXlfZnJhbWUpKTsKKyAgZHVtbXlfZnJhbWUtPnBjICAgPSByZWFkX3JlZ2lzdGVyIChQQ19SRUdOVU0pOworICBkdW1teV9mcmFtZS0+c3AgICA9IHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSk7CisgIGR1bW15X2ZyYW1lLT5mcCAgID0gZnA7CisgIHJlYWRfcmVnaXN0ZXJfYnl0ZXMgKDAsIGR1bW15X2ZyYW1lLT5yZWdzLCBSRUdJU1RFUl9CWVRFUyk7CisgIGR1bW15X2ZyYW1lLT5uZXh0ID0gZHVtbXlfZnJhbWVfc3RhY2s7CisgIGR1bW15X2ZyYW1lX3N0YWNrID0gZHVtbXlfZnJhbWU7Cit9CisKKy8qIEZ1bmN0aW9uOiBwb3BfZnJhbWUKKyAgIFJlc3RvcmUgdGhlIG1hY2hpbmUgc3RhdGUgZnJvbSBlaXRoZXIgdGhlIHNhdmVkIGR1bW15IHN0YWNrIG9yIGEKKyAgIHJlYWwgc3RhY2sgZnJhbWUuICovCisKK3ZvaWQKK2dlbmVyaWNfcG9wX2N1cnJlbnRfZnJhbWUgKHBvcCkKKyAgdm9pZCAoKnBvcCkgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lKSk7Cit7CisgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZSA9IGdldF9jdXJyZW50X2ZyYW1lICgpOworICBpZiAoUENfSU5fQ0FMTF9EVU1NWShmcmFtZS0+cGMsIGZyYW1lLT5mcmFtZSwgZnJhbWUtPmZyYW1lKSkKKyAgICBnZW5lcmljX3BvcF9kdW1teV9mcmFtZSAoKTsKKyAgZWxzZQorICAgIHBvcCAoZnJhbWUpOworfQorCisvKiBGdW5jdGlvbjogcG9wX2R1bW15X2ZyYW1lCisgICBSZXN0b3JlIHRoZSBtYWNoaW5lIHN0YXRlIGZyb20gYSBzYXZlZCBkdW1teSBzdGFjayBmcmFtZS4gKi8KKwordm9pZAorZ2VuZXJpY19wb3BfZHVtbXlfZnJhbWUgKCkKK3sKKyAgc3RydWN0IGR1bW15X2ZyYW1lICpkdW1teV9mcmFtZSA9IGR1bW15X2ZyYW1lX3N0YWNrOworCisgIC8qIEZJWE1FOiB3aGF0IGlmIHRoZSBmaXJzdCBmcmFtZSBpc24ndCB0aGUgcmlnaHQgb25lLCBlZy4uCisgICAgIGJlY2F1c2Ugb25lIGNhbGwtYnktaGFuZCBmdW5jdGlvbiBoYXMgZG9uZSBhIGxvbmdqbXAgaW50byBhbm90aGVyIG9uZT8gKi8KKworICBpZiAoIWR1bW15X2ZyYW1lKQorICAgIGVycm9yICgiQ2FuJ3QgcG9wIGR1bW15IGZyYW1lISIpOworICBkdW1teV9mcmFtZV9zdGFjayA9IGR1bW15X2ZyYW1lLT5uZXh0OworICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoMCwgZHVtbXlfZnJhbWUtPnJlZ3MsIFJFR0lTVEVSX0JZVEVTKTsKKyAgZmx1c2hfY2FjaGVkX2ZyYW1lcyAoKTsKKyAgZnJlZSAoZHVtbXlfZnJhbWUpOworfQorCisvKiBGdW5jdGlvbjogZnJhbWVfY2hhaW5fdmFsaWQgCisgICBSZXR1cm5zIHRydWUgZm9yIGEgdXNlciBmcmFtZSBvciBhIGNhbGxfZnVuY3Rpb25fYnlfaGFuZCBkdW1teSBmcmFtZSwKKyAgIGFuZCBmYWxzZSBmb3IgdGhlIENSVDAgc3RhcnQtdXAgZnJhbWUuICBQdXJwb3NlIGlzIHRvIHRlcm1pbmF0ZSBiYWNrdHJhY2UgKi8KKyAKK2ludAorZ2VuZXJpY19mcmFtZV9jaGFpbl92YWxpZCAoZnAsIGZpKQorICAgICBDT1JFX0FERFIgZnA7CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKK3sKKyAgaWYgKFBDX0lOX0NBTExfRFVNTVkoRlJBTUVfU0FWRURfUEMoZmkpLCBmcCwgZnApKQorICAgIHJldHVybiAxOyAgIC8qIGRvbid0IHBydW5lIENBTExfRFVNTVkgZnJhbWVzICovCisgIGVsc2UgICAgICAgICAgLyogZmFsbCBiYWNrIHRvIGRlZmF1bHQgYWxnb3JpdGhtIChzZWUgZnJhbWUuaCkgKi8KKyAgICByZXR1cm4gKGZwICE9IDAKKwkgICAgJiYgKElOTkVSX1RIQU4gKGZpLT5mcmFtZSwgZnApIHx8IGZpLT5mcmFtZSA9PSBmcCkKKwkgICAgJiYgIWluc2lkZV9lbnRyeV9maWxlIChGUkFNRV9TQVZFRF9QQyhmaSkpKTsKK30KKyAKKy8qIEZ1bmN0aW9uOiBnZXRfc2F2ZWRfcmVnaXN0ZXIKKyAgIEZpbmQgcmVnaXN0ZXIgbnVtYmVyIFJFR05VTSByZWxhdGl2ZSB0byBGUkFNRSBhbmQgcHV0IGl0cyAocmF3LAorICAgdGFyZ2V0IGZvcm1hdCkgY29udGVudHMgaW4gKlJBV19CVUZGRVIuICAKKworICAgU2V0ICpPUFRJTUlaRUQgaWYgdGhlIHZhcmlhYmxlIHdhcyBvcHRpbWl6ZWQgb3V0IChhbmQgdGh1cyBjYW4ndCBiZQorICAgZmV0Y2hlZCkuICBOb3RlIHRoYXQgdGhpcyBpcyBuZXZlciBzZXQgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiB6ZXJvCisgICBpbiB0aGlzIGltcGxlbWVudGF0aW9uLgorCisgICBTZXQgKkxWQUwgdG8gbHZhbF9tZW1vcnksIGx2YWxfcmVnaXN0ZXIsIG9yIG5vdF9sdmFsLCBkZXBlbmRpbmcgb24KKyAgIHdoZXRoZXIgdGhlIHZhbHVlIHdhcyBmZXRjaGVkIGZyb20gbWVtb3J5LCBmcm9tIGEgcmVnaXN0ZXIsIG9yIGluIGEKKyAgIHN0cmFuZ2UgYW5kIG5vbi1tb2RpZmlhYmxlIHdheSAoZS5nLiBhIGZyYW1lIHBvaW50ZXIgd2hpY2ggd2FzCisgICBjYWxjdWxhdGVkIHJhdGhlciB0aGFuIGZldGNoZWQpLiAgV2Ugd2lsbCB1c2Ugbm90X2x2YWwgZm9yIHZhbHVlcworICAgZmV0Y2hlZCBmcm9tIGdlbmVyaWMgZHVtbXkgZnJhbWVzLgorCisgICBTZXQgKkFERFJQIHRvIHRoZSBhZGRyZXNzLCBlaXRoZXIgaW4gbWVtb3J5IG9uIGFzIGEgUkVHSVNURVJfQllURQorICAgb2Zmc2V0IGludG8gdGhlIHJlZ2lzdGVycyBhcnJheS4gIElmIHRoZSB2YWx1ZSBpcyBzdG9yZWQgaW4gYSBkdW1teQorICAgZnJhbWUsIHNldCAqQUREUlAgdG8gemVyby4KKworICAgVG8gdXNlIHRoaXMgaW1wbGVtZW50YXRpb24sIGRlZmluZSBhIGZ1bmN0aW9uIGNhbGxlZAorICAgImdldF9zYXZlZF9yZWdpc3RlciIgaW4geW91ciB0YXJnZXQgY29kZSwgd2hpY2ggc2ltcGx5IHBhc3NlcyBhbGwKKyAgIG9mIGl0cyBhcmd1bWVudHMgdG8gdGhpcyBmdW5jdGlvbi4KKworICAgVGhlIGFyZ3VtZW50IFJBV19CVUZGRVIgbXVzdCBwb2ludCB0byBhbGlnbmVkIG1lbW9yeS4gICovCisKK3ZvaWQKK2dlbmVyaWNfZ2V0X3NhdmVkX3JlZ2lzdGVyIChyYXdfYnVmZmVyLCBvcHRpbWl6ZWQsIGFkZHJwLCBmcmFtZSwgcmVnbnVtLCBsdmFsKQorICAgICBjaGFyICpyYXdfYnVmZmVyOworICAgICBpbnQgKm9wdGltaXplZDsKKyAgICAgQ09SRV9BRERSICphZGRycDsKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworICAgICBpbnQgcmVnbnVtOworICAgICBlbnVtIGx2YWxfdHlwZSAqbHZhbDsKK3sKKyAgaWYgKCF0YXJnZXRfaGFzX3JlZ2lzdGVycykKKyAgICBlcnJvciAoIk5vIHJlZ2lzdGVycy4iKTsKKworICAvKiBOb3JtYWwgc3lzdGVtcyBkb24ndCBvcHRpbWl6ZSBvdXQgdGhpbmdzIHdpdGggcmVnaXN0ZXIgbnVtYmVycy4gICovCisgIGlmIChvcHRpbWl6ZWQgIT0gTlVMTCkKKyAgICAqb3B0aW1pemVkID0gMDsKKworICBpZiAoYWRkcnApCQkvKiBkZWZhdWx0IGFzc3VtcHRpb246IG5vdCBmb3VuZCBpbiBtZW1vcnkgKi8KKyAgICAqYWRkcnAgPSAwOworCisgIC8qIE5vdGU6IHNpbmNlIHRoZSBjdXJyZW50IGZyYW1lJ3MgcmVnaXN0ZXJzIGNvdWxkIG9ubHkgaGF2ZSBiZWVuCisgICAgIHNhdmVkIGJ5IGZyYW1lcyBJTlRFUklPUiBUTyB0aGUgY3VycmVudCBmcmFtZSwgd2Ugc2tpcCBleGFtaW5pbmcKKyAgICAgdGhlIGN1cnJlbnQgZnJhbWUgaXRzZWxmOiBvdGhlcndpc2UsIHdlIHdvdWxkIGJlIGdldHRpbmcgdGhlCisgICAgIHByZXZpb3VzIGZyYW1lJ3MgcmVnaXN0ZXJzIHdoaWNoIHdlcmUgc2F2ZWQgYnkgdGhlIGN1cnJlbnQgZnJhbWUuICAqLworCisgIHdoaWxlIChmcmFtZSAmJiAoKGZyYW1lID0gZnJhbWUtPm5leHQpICE9IE5VTEwpKQorICAgIHsKKyAgICAgIGlmIChQQ19JTl9DQUxMX0RVTU1ZIChmcmFtZS0+cGMsIGZyYW1lLT5mcmFtZSwgZnJhbWUtPmZyYW1lKSkKKwl7CisJICBpZiAobHZhbCkJCQkvKiBmb3VuZCBpdCBpbiBhIENBTExfRFVNTVkgZnJhbWUgKi8KKwkgICAgKmx2YWwgPSBub3RfbHZhbDsKKwkgIGlmIChyYXdfYnVmZmVyKQorCSAgICBtZW1jcHkgKHJhd19idWZmZXIsIAorCQkgICAgZ2VuZXJpY19maW5kX2R1bW15X2ZyYW1lIChmcmFtZS0+cGMsIGZyYW1lLT5mcmFtZSkgKyAKKwkJICAgIFJFR0lTVEVSX0JZVEUgKHJlZ251bSksCisJCSAgICBSRUdJU1RFUl9SQVdfU0laRSAocmVnbnVtKSk7CisJICAgICAgcmV0dXJuOworCX0KKworICAgICAgRlJBTUVfSU5JVF9TQVZFRF9SRUdTIChmcmFtZSk7CisgICAgICBpZiAoZnJhbWUtPnNhdmVkX3JlZ3MgIT0gTlVMTAorCSAgJiYgZnJhbWUtPnNhdmVkX3JlZ3NbcmVnbnVtXSAhPSAwKQorCXsKKwkgIGlmIChsdmFsKQkJCS8qIGZvdW5kIGl0IHNhdmVkIG9uIHRoZSBzdGFjayAqLworCSAgICAqbHZhbCA9IGx2YWxfbWVtb3J5OworCSAgaWYgKHJlZ251bSA9PSBTUF9SRUdOVU0pCisJICAgIHsKKwkgICAgICBpZiAocmF3X2J1ZmZlcikJCS8qIFNQIHJlZ2lzdGVyIHRyZWF0ZWQgc3BlY2lhbGx5ICovCisJCXN0b3JlX2FkZHJlc3MgKHJhd19idWZmZXIsIFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pLCAKKwkJCSAgICAgICBmcmFtZS0+c2F2ZWRfcmVnc1tyZWdudW1dKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKGFkZHJwKQkJLyogYW55IG90aGVyIHJlZ2lzdGVyICovCisJCSphZGRycCA9IGZyYW1lLT5zYXZlZF9yZWdzW3JlZ251bV07CisJICAgICAgaWYgKHJhd19idWZmZXIpCisJCXJlYWRfbWVtb3J5IChmcmFtZS0+c2F2ZWRfcmVnc1tyZWdudW1dLCByYXdfYnVmZmVyLCAKKwkJCSAgICAgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSkpOworCSAgICB9CisJICByZXR1cm47CisJfQorICAgIH0KKworICAvKiBJZiB3ZSBnZXQgdGhydSB0aGUgbG9vcCB0byB0aGlzIHBvaW50LCBpdCBtZWFucyB0aGUgcmVnaXN0ZXIgd2FzCisgICAgIG5vdCBzYXZlZCBpbiBhbnkgZnJhbWUuICBSZXR1cm4gdGhlIGFjdHVhbCBsaXZlLXJlZ2lzdGVyIHZhbHVlLiAgKi8KKworICBpZiAobHZhbCkJCQkJLyogZm91bmQgaXQgaW4gYSBsaXZlIHJlZ2lzdGVyICovCisgICAgKmx2YWwgPSBsdmFsX3JlZ2lzdGVyOworICBpZiAoYWRkcnApCisgICAgKmFkZHJwID0gUkVHSVNURVJfQllURSAocmVnbnVtKTsKKyAgaWYgKHJhd19idWZmZXIpCisgICAgcmVhZF9yZWdpc3Rlcl9nZW4gKHJlZ251bSwgcmF3X2J1ZmZlcik7Cit9CisjZW5kaWYgLyogVVNFX0dFTkVSSUNfRFVNTVlfRlJBTUVTICovCisKK3ZvaWQKK19pbml0aWFsaXplX2Jsb2NrZnJhbWUgKCkKK3sKKyAgb2JzdGFja19pbml0ICgmZnJhbWVfY2FjaGVfb2JzdGFjayk7Cit9CmRpZmYgLS1naXQgYS9nZGIvYnJlYWtwb2ludC5jIGIvZ2RiL2JyZWFrcG9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjA1OTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2JyZWFrcG9pbnQuYwpAQCAtMCwwICsxLDY2ODYgQEAKKy8qIEV2ZXJ5dGhpbmcgYWJvdXQgYnJlYWtwb2ludHMsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk4NiwgODcsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5CisgICAgICAgICAgICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiYnJlYWtwb2ludC5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgImdkYnRocmVhZC5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImRlbWFuZ2xlLmgiCisjaW5jbHVkZSAiYW5ub3RhdGUuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKworLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAqLworCitzdGF0aWMgdm9pZAorY2F0Y2hfY29tbWFuZF8xIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2VuYWJsZV9kZWxldGVfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZAorZW5hYmxlX2RlbGV0ZV9icmVha3BvaW50IFBBUkFNUyAoKHN0cnVjdCBicmVha3BvaW50ICopKTsKKworc3RhdGljIHZvaWQKK2VuYWJsZV9vbmNlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2VuYWJsZV9vbmNlX2JyZWFrcG9pbnQgUEFSQU1TICgoc3RydWN0IGJyZWFrcG9pbnQgKikpOworCitzdGF0aWMgdm9pZAorZGlzYWJsZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitlbmFibGVfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZAorbWFwX2JyZWFrcG9pbnRfbnVtYmVycyBQQVJBTVMgKChjaGFyICosCXZvaWQgKCopKHN0cnVjdCBicmVha3BvaW50ICopKSk7CisKK3N0YXRpYyB2b2lkCitpZ25vcmVfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgaW50IGJyZWFrcG9pbnRfcmVfc2V0X29uZSBQQVJBTVMgKChQVFIpKTsKKworc3RhdGljIHZvaWQKK2NsZWFyX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2NhdGNoX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2hhbmRsZV9nbnVfNF8xNl9jYXRjaF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBpbnQpKTsKKworc3RhdGljIHN0cnVjdCBzeW10YWJzX2FuZF9saW5lcworZ2V0X2NhdGNoX3NhbHMgUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyB2b2lkCit3YXRjaF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyBpbnQKK2Nhbl91c2VfaGFyZHdhcmVfd2F0Y2hwb2ludCBQQVJBTVMgKChzdHJ1Y3QgdmFsdWUgKikpOworCit2b2lkCit0YnJlYWtfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZAorYnJlYWtfY29tbWFuZF8xIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBpbnQpKTsKKworc3RhdGljIHZvaWQKK21lbnRpb24gUEFSQU1TICgoc3RydWN0IGJyZWFrcG9pbnQgKikpOworCitzdHJ1Y3QgYnJlYWtwb2ludCAqCitzZXRfcmF3X2JyZWFrcG9pbnQgUEFSQU1TICgoc3RydWN0IHN5bXRhYl9hbmRfbGluZSkpOworCitzdGF0aWMgdm9pZAorY2hlY2tfZHVwbGljYXRlcyBQQVJBTVMgKChDT1JFX0FERFIsIGFzZWN0aW9uICopKTsKKworc3RhdGljIHZvaWQKK2Rlc2NyaWJlX290aGVyX2JyZWFrcG9pbnRzIFBBUkFNUyAoKENPUkVfQUREUiwgYXNlY3Rpb24gKikpOworCitzdGF0aWMgdm9pZAorYnJlYWtwb2ludHNfaW5mbyBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZAorYnJlYWtwb2ludF8xIFBBUkFNUyAoKGludCwgaW50KSk7CisKK3N0YXRpYyBicHN0YXQKK2Jwc3RhdF9hbGxvYyBQQVJBTVMgKChzdHJ1Y3QgYnJlYWtwb2ludCAqLCBicHN0YXQpKTsKKworc3RhdGljIGludCBicmVha3BvaW50X2NvbmRfZXZhbCBQQVJBTVMgKChQVFIpKTsKKworc3RhdGljIHZvaWQKK2NsZWFudXBfZXhlY3V0aW5nX2JyZWFrcG9pbnRzIFBBUkFNUyAoKFBUUikpOworCitzdGF0aWMgdm9pZAorY29tbWFuZHNfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZAorY29uZGl0aW9uX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIGludAorZ2V0X251bWJlciBQQVJBTVMgKChjaGFyICoqKSk7CisKK3ZvaWQKK3NldF9icmVha3BvaW50X2NvdW50IFBBUkFNUyAoKGludCkpOworCisjaWYgMAorc3RhdGljIHN0cnVjdCBicmVha3BvaW50ICoKK2NyZWF0ZV90ZW1wX2V4Y2VwdGlvbl9icmVha3BvaW50IFBBUkFNUyAoKENPUkVfQUREUikpOworI2VuZGlmCisKK3R5cGVkZWYgZW51bSB7CisgIG1hcmtfaW5zZXJ0ZWQsCisgIG1hcmtfdW5pbnNlcnRlZAorfSBpbnNlcnRpb25fc3RhdGVfdDsKKworc3RhdGljIGludAorcmVtb3ZlX2JyZWFrcG9pbnQgUEFSQU1TICgoc3RydWN0IGJyZWFrcG9pbnQgKiwgaW5zZXJ0aW9uX3N0YXRlX3QpKTsKKworc3RhdGljIGludCBwcmludF9pdF9ub3JtYWwgUEFSQU1TICgoYnBzdGF0KSk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZW51bSBleGNlcHRpb25fZXZlbnRfa2luZCBraW5kOworICBpbnQgZW5hYmxlOworfSBhcmdzX2Zvcl9jYXRjaHBvaW50X2VuYWJsZTsKKworc3RhdGljIGludCB3YXRjaHBvaW50X2NoZWNrIFBBUkFNUyAoKFBUUikpOworCitzdGF0aWMgaW50IGNvdmVyX3RhcmdldF9lbmFibGVfZXhjZXB0aW9uX2NhbGxiYWNrIFBBUkFNUyAoKFBUUikpOworCitzdGF0aWMgaW50IHByaW50X2l0X2RvbmUgUEFSQU1TICgoYnBzdGF0KSk7CisKK3N0YXRpYyBpbnQgcHJpbnRfaXRfbm9vcCBQQVJBTVMgKChicHN0YXQpKTsKKworc3RhdGljIHZvaWQgbWFpbnRlbmFuY2VfaW5mb19icmVha3BvaW50cyBQQVJBTVMgKChjaGFyICosIGludCkpOworCisjaWZkZWYgR0VUX0xPTkdKTVBfVEFSR0VUCitzdGF0aWMgdm9pZCBjcmVhdGVfbG9uZ2ptcF9icmVha3BvaW50IFBBUkFNUyAoKGNoYXIgKikpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgaHdfYnJlYWtwb2ludF91c2VkX2NvdW50IFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIGludCBod193YXRjaHBvaW50X3VzZWRfY291bnQgUEFSQU1TICgoZW51bSBicHR5cGUsIGludCAqKSk7CisKK3N0YXRpYyB2b2lkIGhicmVha19jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHRoYnJlYWtfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCB3YXRjaF9jb21tYW5kXzEgUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCkpOworCitzdGF0aWMgdm9pZCByd2F0Y2hfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBhd2F0Y2hfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBkb19lbmFibGVfYnJlYWtwb2ludCBQQVJBTVMgKChzdHJ1Y3QgYnJlYWtwb2ludCAqLCBlbnVtIGJwZGlzcCkpOworCisvKiBQcm90b3R5cGVzIGZvciBleHBvcnRlZCBmdW5jdGlvbnMuICovCisKK3N0YXRpYyB2b2lkCithd2F0Y2hfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZAorZG9fZW5hYmxlX2JyZWFrcG9pbnQgUEFSQU1TICgoc3RydWN0IGJyZWFrcG9pbnQgKiwgZW51bSBicGRpc3ApKTsKKworLyogSWYgRkFMU0UsIGdkYiB3aWxsIG5vdCB1c2UgaGFyZHdhcmUgc3VwcG9ydCBmb3Igd2F0Y2hwb2ludHMsIGV2ZW4KKyAgIGlmIHN1Y2ggaXMgYXZhaWxhYmxlLiAqLworc3RhdGljIGludCBjYW5fdXNlX2h3X3dhdGNocG9pbnRzOworCit2b2lkIGRlbGV0ZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3ZvaWQgX2luaXRpYWxpemVfYnJlYWtwb2ludCBQQVJBTVMgKCh2b2lkKSk7CisKK3ZvaWQgc2V0X2JyZWFrcG9pbnRfY291bnQgUEFSQU1TICgoaW50KSk7CisKK2V4dGVybiBpbnQgYWRkcmVzc3ByaW50OwkJLyogUHJpbnQgbWFjaGluZSBhZGRyZXNzZXM/ICovCisKKyNpZiBkZWZpbmVkIChHRVRfTE9OR0pNUF9UQVJHRVQpIHx8IGRlZmluZWQgKFNPTElCX0FERCkKK3N0YXRpYyBpbnQgaW50ZXJuYWxfYnJlYWtwb2ludF9udW1iZXIgPSAtMTsKKyNlbmRpZgorCisvKiBBcmUgd2UgZXhlY3V0aW5nIGJyZWFrcG9pbnQgY29tbWFuZHM/ICAqLworc3RhdGljIGludCBleGVjdXRpbmdfYnJlYWtwb2ludF9jb21tYW5kczsKKworLyogV2FsayB0aGUgZm9sbG93aW5nIHN0YXRlbWVudCBvciBibG9jayB0aHJvdWdoIGFsbCBicmVha3BvaW50cy4KKyAgIEFMTF9CUkVBS1BPSU5UU19TQUZFIGRvZXMgc28gZXZlbiBpZiB0aGUgc3RhdG1lbnQgZGVsZXRlcyB0aGUgY3VycmVudAorICAgYnJlYWtwb2ludC4gICovCisKKyNkZWZpbmUgQUxMX0JSRUFLUE9JTlRTKGIpICBmb3IgKGIgPSBicmVha3BvaW50X2NoYWluOyBiOyBiID0gYi0+bmV4dCkKKworI2RlZmluZSBBTExfQlJFQUtQT0lOVFNfU0FGRShiLHRtcCkJXAorCWZvciAoYiA9IGJyZWFrcG9pbnRfY2hhaW47CVwKKwkgICAgIGI/ICh0bXA9Yi0+bmV4dCwgMSk6IDA7CVwKKwkgICAgIGIgPSB0bXApCisKKy8qIFRydWUgaWYgU0hJRlRfSU5TVF9SRUdTIGRlZmluZWQsIGZhbHNlIG90aGVyd2lzZS4gICovCisKK2ludCBtdXN0X3NoaWZ0X2luc3RfcmVncyA9CisjaWYgZGVmaW5lZChTSElGVF9JTlNUX1JFR1MpCisxCisjZWxzZQorMAorI2VuZGlmCis7CisKKy8qIFRydWUgaWYgYnJlYWtwb2ludCBoaXQgY291bnRzIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gYnJlYWtwb2ludCBpbmZvLiAgKi8KKworaW50IHNob3dfYnJlYWtwb2ludF9oaXRfY291bnRzID0gMTsKKworLyogQ2hhaW4gb2YgYWxsIGJyZWFrcG9pbnRzIGRlZmluZWQuICAqLworCitzdHJ1Y3QgYnJlYWtwb2ludCAqYnJlYWtwb2ludF9jaGFpbjsKKworLyogTnVtYmVyIG9mIGxhc3QgYnJlYWtwb2ludCBtYWRlLiAgKi8KKworaW50IGJyZWFrcG9pbnRfY291bnQ7CisKKy8qIFBvaW50ZXIgdG8gY3VycmVudCBleGNlcHRpb24gZXZlbnQgcmVjb3JkICovIAorc3RhdGljIHN0cnVjdCBleGNlcHRpb25fZXZlbnRfcmVjb3JkICogY3VycmVudF9leGNlcHRpb25fZXZlbnQ7CisKKy8qIEluZGljYXRvciBvZiB3aGV0aGVyIGV4Y2VwdGlvbiBjYXRjaHBvaW50cyBzaG91bGQgYmUgbnVrZWQKKyAgIGJldHdlZW4gcnVucyBvZiBhIHByb2dyYW0gKi8KK2ludCBleGNlcHRpb25fY2F0Y2hwb2ludHNfYXJlX2ZyYWdpbGUgPSAwOworIAorLyogSW5kaWNhdG9yIG9mIHdoZW4gZXhjZXB0aW9uIGNhdGNocG9pbnRzIHNldC11cCBzaG91bGQgYmUKKyAgIHJlaW5pdGlhbGl6ZWQgLS0gZS5nLiB3aGVuIHByb2dyYW0gaXMgcmUtcnVuICovCitpbnQgZXhjZXB0aW9uX3N1cHBvcnRfaW5pdGlhbGl6ZWQgPSAwOworCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgICBwYXRobmFtZSBvZiB0aGUgZHluYW1pY2FsbHktbGlua2VkIGxpYnJhcnkgdGhhdCBoYXMganVzdCBiZWVuCisgICBsb2FkZWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIG9ubHkgd2hlbiBTT0xJQl9IQVZFX0xPQURfRVZFTlQgaXMgVFJVRSwKKyAgIG9yIHVuZGVmaW5lZCByZXN1bHRzIGFyZSBndWFyYW50ZWVkLgorCisgICBUaGlzIHN0cmluZydzIGNvbnRlbnRzIGFyZSBvbmx5IHZhbGlkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQorICAgaW5mZXJpb3IgaGFzIHN0b3BwZWQgaW4gdGhlIGR5bmFtaWMgbGlua2VyIGhvb2ssIGFuZCBiZWNvbWVzCisgICBpbnZhbGlkIGFzIHNvb24gYXMgdGhlIGluZmVyaW9yIGlzIGNvbnRpbnVlZC4gIENsaWVudHMgc2hvdWxkIG1ha2UKKyAgIGEgY29weSBvZiB0aGlzIHN0cmluZyBpZiB0aGV5IHdpc2ggdG8gY29udGludWUgdGhlIGluZmVyaW9yIGFuZAorICAgdGhlbiBhY2Nlc3MgdGhlIHN0cmluZy4gICovCisKKyNpZm5kZWYgU09MSUJfTE9BREVEX0xJQlJBUllfUEFUSE5BTUUKKyNkZWZpbmUgU09MSUJfTE9BREVEX0xJQlJBUllfUEFUSE5BTUUocGlkKSAiIgorI2VuZGlmCisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAgIHBhdGhuYW1lIG9mIHRoZSBkeW5hbWljYWxseS1saW5rZWQgbGlicmFyeSB0aGF0IGhhcyBqdXN0IGJlZW4KKyAgIHVubG9hZGVkLgorCisgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gU09MSUJfSEFWRV9VTkxPQURfRVZFTlQgaXMKKyAgIFRSVUUsIG9yIHVuZGVmaW5lZCByZXN1bHRzIGFyZSBndWFyYW50ZWVkLgorCisgICBUaGlzIHN0cmluZydzIGNvbnRlbnRzIGFyZSBvbmx5IHZhbGlkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQorICAgaW5mZXJpb3IgaGFzIHN0b3BwZWQgaW4gdGhlIGR5bmFtaWMgbGlua2VyIGhvb2ssIGFuZCBiZWNvbWVzCisgICBpbnZhbGlkIGFzIHNvb24gYXMgdGhlIGluZmVyaW9yIGlzIGNvbnRpbnVlZC4gIENsaWVudHMgc2hvdWxkIG1ha2UKKyAgIGEgY29weSBvZiB0aGlzIHN0cmluZyBpZiB0aGV5IHdpc2ggdG8gY29udGludWUgdGhlIGluZmVyaW9yIGFuZAorICAgdGhlbiBhY2Nlc3MgdGhlIHN0cmluZy4gICovCisKKyNpZm5kZWYgU09MSUJfVU5MT0FERURfTElCUkFSWV9QQVRITkFNRQorI2RlZmluZSBTT0xJQl9VTkxPQURFRF9MSUJSQVJZX1BBVEhOQU1FKHBpZCkgIiIKKyNlbmRpZgorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgImNhdGNoIGxvYWQiIGNvbW1hbmQuICBJdCBhbGxvd3MgdGhlCisgICBkZWJ1Z2dlciB0byBiZSBub3RpZmllZCBieSB0aGUgZHluYW1pYyBsaW5rZXIgd2hlbiBhIHNwZWNpZmllZAorICAgbGlicmFyeSBmaWxlIChvciBhbnkgbGlicmFyeSBmaWxlLCBpZiBmaWxlbmFtZSBpcyBOVUxMKSBpcyBsb2FkZWQuICAqLworCisjaWZuZGVmIFNPTElCX0NSRUFURV9DQVRDSF9MT0FEX0hPT0sKKyNkZWZpbmUgU09MSUJfQ1JFQVRFX0NBVENIX0xPQURfSE9PSyhwaWQsdGVtcGZsYWcsZmlsZW5hbWUsY29uZF9zdHJpbmcpIFwKKyAgIGVycm9yICgiY2F0Y2ggb2YgbGlicmFyeSBsb2FkcyBub3QgeWV0IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0iKQorI2VuZGlmCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSAiY2F0Y2ggdW5sb2FkIiBjb21tYW5kLiAgSXQgYWxsb3dzCisgICB0aGUgZGVidWdnZXIgdG8gYmUgbm90aWZpZWQgYnkgdGhlIGR5bmFtaWMgbGlua2VyIHdoZW4gYSBzcGVjaWZpZWQKKyAgIGxpYnJhcnkgZmlsZSAob3IgYW55IGxpYnJhcnkgZmlsZSwgaWYgZmlsZW5hbWUgaXMgTlVMTCkgaXMKKyAgIHVubG9hZGVkLiAgKi8KKworI2lmbmRlZiBTT0xJQl9DUkVBVEVfQ0FUQ0hfVU5MT0FEX0hPT0sKKyNkZWZpbmUgU09MSUJfQ1JFQVRFX0NBVENIX1VOTE9BRF9IT09LKHBpZCx0ZW1wZmxhZyxmaWxlbmFtZSxjb25kX3N0cmluZykgXAorICAgZXJyb3IgKCJjYXRjaCBvZiBsaWJyYXJ5IHVubG9hZHMgbm90IHlldCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtIikKKyNlbmRpZgorCisvKiBTZXQgYnJlYWtwb2ludCBjb3VudCB0byBOVU0uICAqLworCit2b2lkCitzZXRfYnJlYWtwb2ludF9jb3VudCAobnVtKQorICAgICBpbnQgbnVtOworeworICBicmVha3BvaW50X2NvdW50ID0gbnVtOworICBzZXRfaW50ZXJuYWx2YXIgKGxvb2t1cF9pbnRlcm5hbHZhciAoImJwbnVtIiksCisJCSAgIHZhbHVlX2Zyb21fbG9uZ2VzdCAoYnVpbHRpbl90eXBlX2ludCwgKExPTkdFU1QpIG51bSkpOworfQorCisvKiBVc2VkIGluIHJ1bl9jb21tYW5kIHRvIHplcm8gdGhlIGhpdCBjb3VudCB3aGVuIGEgbmV3IHJ1biBzdGFydHMuICovCisKK3ZvaWQKK2NsZWFyX2JyZWFrcG9pbnRfaGl0X2NvdW50cyAoKQoreworICBzdHJ1Y3QgYnJlYWtwb2ludCAqYjsKKworICBBTExfQlJFQUtQT0lOVFMgKGIpCisgICAgYi0+aGl0X2NvdW50ID0gMDsKK30KKworLyogRGVmYXVsdCBhZGRyZXNzLCBzeW10YWIgYW5kIGxpbmUgdG8gcHV0IGEgYnJlYWtwb2ludCBhdAorICAgZm9yICJicmVhayIgY29tbWFuZCB3aXRoIG5vIGFyZy4KKyAgIGlmIGRlZmF1bHRfYnJlYWtwb2ludF92YWxpZCBpcyB6ZXJvLCB0aGUgb3RoZXIgdGhyZWUgYXJlCisgICBub3QgdmFsaWQsIGFuZCAiYnJlYWsiIHdpdGggbm8gYXJnIGlzIGFuIGVycm9yLgorCisgICBUaGlzIHNldCBieSBwcmludF9zdGFja19mcmFtZSwgd2hpY2ggY2FsbHMgc2V0X2RlZmF1bHRfYnJlYWtwb2ludC4gICovCisKK2ludCBkZWZhdWx0X2JyZWFrcG9pbnRfdmFsaWQ7CitDT1JFX0FERFIgZGVmYXVsdF9icmVha3BvaW50X2FkZHJlc3M7CitzdHJ1Y3Qgc3ltdGFiICpkZWZhdWx0X2JyZWFrcG9pbnRfc3ltdGFiOworaW50IGRlZmF1bHRfYnJlYWtwb2ludF9saW5lOworDAorLyogKlBQIGlzIGEgc3RyaW5nIGRlbm90aW5nIGEgYnJlYWtwb2ludC4gIEdldCB0aGUgbnVtYmVyIG9mIHRoZSBicmVha3BvaW50LgorICAgQWR2YW5jZSAqUFAgYWZ0ZXIgdGhlIHN0cmluZyBhbmQgYW55IHRyYWlsaW5nIHdoaXRlc3BhY2UuCisKKyAgIEN1cnJlbnRseSB0aGUgc3RyaW5nIGNhbiBlaXRoZXIgYmUgYSBudW1iZXIgb3IgIiQiIGZvbGxvd2VkIGJ5IHRoZSBuYW1lCisgICBvZiBhIGNvbnZlbmllbmNlIHZhcmlhYmxlLiAgTWFraW5nIGl0IGFuIGV4cHJlc3Npb24gd291bGRuJ3Qgd29yayB3ZWxsCisgICBmb3IgbWFwX2JyZWFrcG9pbnRfbnVtYmVycyAoZS5nLiAiNCArIDUgKyA2IikuICAqLworc3RhdGljIGludAorZ2V0X251bWJlciAocHApCisgICAgIGNoYXIgKipwcDsKK3sKKyAgaW50IHJldHZhbDsKKyAgY2hhciAqcCA9ICpwcDsKKworICBpZiAocCA9PSBOVUxMKQorICAgIC8qIEVtcHR5IGxpbmUgbWVhbnMgcmVmZXIgdG8gdGhlIGxhc3QgYnJlYWtwb2ludC4gICovCisgICAgcmV0dXJuIGJyZWFrcG9pbnRfY291bnQ7CisgIGVsc2UgaWYgKCpwID09ICckJykKKyAgICB7CisgICAgICAvKiBNYWtlIGEgY29weSBvZiB0aGUgbmFtZSwgc28gd2UgY2FuIG51bGwtdGVybWluYXRlIGl0CisJIHRvIHBhc3MgdG8gbG9va3VwX2ludGVybmFsdmFyKCkuICAqLworICAgICAgY2hhciAqdmFybmFtZTsKKyAgICAgIGNoYXIgKnN0YXJ0ID0gKytwOworICAgICAgdmFsdWVfcHRyIHZhbDsKKworICAgICAgd2hpbGUgKGlzYWxudW0gKCpwKSB8fCAqcCA9PSAnXycpCisJcCsrOworICAgICAgdmFybmFtZSA9IChjaGFyICopIGFsbG9jYSAocCAtIHN0YXJ0ICsgMSk7CisgICAgICBzdHJuY3B5ICh2YXJuYW1lLCBzdGFydCwgcCAtIHN0YXJ0KTsKKyAgICAgIHZhcm5hbWVbcCAtIHN0YXJ0XSA9ICdcMCc7CisgICAgICB2YWwgPSB2YWx1ZV9vZl9pbnRlcm5hbHZhciAobG9va3VwX2ludGVybmFsdmFyICh2YXJuYW1lKSk7CisgICAgICBpZiAoVFlQRV9DT0RFIChWQUxVRV9UWVBFICh2YWwpKSAhPSBUWVBFX0NPREVfSU5UKQorCWVycm9yICgKKyJDb252ZW5pZW5jZSB2YXJpYWJsZXMgdXNlZCB0byBzcGVjaWZ5IGJyZWFrcG9pbnRzIG11c3QgaGF2ZSBpbnRlZ2VyIHZhbHVlcy4iCisJICAgICAgICk7CisgICAgICByZXR2YWwgPSAoaW50KSB2YWx1ZV9hc19sb25nICh2YWwpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICgqcCA9PSAnLScpCisJKytwOworICAgICAgd2hpbGUgKCpwID49ICcwJyAmJiAqcCA8PSAnOScpCisJKytwOworICAgICAgaWYgKHAgPT0gKnBwKQorCS8qIFRoZXJlIGlzIG5vIG51bWJlciBoZXJlLiAgKGUuZy4gImNvbmQgYSA9PSBiIikuICAqLworCWVycm9yX25vX2FyZyAoImJyZWFrcG9pbnQgbnVtYmVyIik7CisgICAgICByZXR2YWwgPSBhdG9pICgqcHApOworICAgIH0KKyAgaWYgKCEoaXNzcGFjZSAoKnApIHx8ICpwID09ICdcMCcpKQorICAgIGVycm9yICgiYnJlYWtwb2ludCBudW1iZXIgZXhwZWN0ZWQiKTsKKyAgd2hpbGUgKGlzc3BhY2UgKCpwKSkKKyAgICBwKys7CisgICpwcCA9IHA7CisgIHJldHVybiByZXR2YWw7Cit9CisMCisvKiBjb25kaXRpb24gTiBFWFAgLS0gc2V0IGJyZWFrIGNvbmRpdGlvbiBvZiBicmVha3BvaW50IE4gdG8gRVhQLiAgKi8KKworc3RhdGljIHZvaWQKK2NvbmRpdGlvbl9jb21tYW5kIChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGJyZWFrcG9pbnQgKmI7CisgIGNoYXIgKnA7CisgIHJlZ2lzdGVyIGludCBibnVtOworCisgIGlmIChhcmcgPT0gMCkKKyAgICBlcnJvcl9ub19hcmcgKCJicmVha3BvaW50IG51bWJlciIpOworCisgIHAgPSBhcmc7CisgIGJudW0gPSBnZXRfbnVtYmVyICgmcCk7CisKKyAgQUxMX0JSRUFLUE9JTlRTIChiKQorICAgIGlmIChiLT5udW1iZXIgPT0gYm51bSkKKyAgICAgIHsKKwlpZiAoYi0+Y29uZCkKKwkgIHsKKwkgICAgZnJlZSAoKFBUUiliLT5jb25kKTsKKwkgICAgYi0+Y29uZCA9IDA7CisJICB9CisJaWYgKGItPmNvbmRfc3RyaW5nICE9IE5VTEwpCisJICBmcmVlICgoUFRSKWItPmNvbmRfc3RyaW5nKTsKKworCWlmICgqcCA9PSAwKQorCSAgeworCSAgICBiLT5jb25kID0gMDsKKwkgICAgYi0+Y29uZF9zdHJpbmcgPSBOVUxMOworCSAgICBpZiAoZnJvbV90dHkpCisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiQnJlYWtwb2ludCAlZCBub3cgdW5jb25kaXRpb25hbC5cbiIsIGJudW0pOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgYXJnID0gcDsKKwkgICAgLyogSSBkb24ndCBrbm93IGlmIGl0IG1hdHRlcnMgd2hldGhlciB0aGlzIGlzIHRoZSBzdHJpbmcgdGhlIHVzZXIKKwkgICAgICAgdHlwZWQgaW4gb3IgdGhlIGRlY29tcGlsZWQgZXhwcmVzc2lvbi4gICovCisJICAgIGItPmNvbmRfc3RyaW5nID0gc2F2ZXN0cmluZyAoYXJnLCBzdHJsZW4gKGFyZykpOworCSAgICBiLT5jb25kID0gcGFyc2VfZXhwXzEgKCZhcmcsIGJsb2NrX2Zvcl9wYyAoYi0+YWRkcmVzcyksIDApOworCSAgICBpZiAoKmFyZykKKwkgICAgICBlcnJvciAoIkp1bmsgYXQgZW5kIG9mIGV4cHJlc3Npb24iKTsKKwkgIH0KKwlicmVha3BvaW50c19jaGFuZ2VkICgpOworCXJldHVybjsKKyAgICAgIH0KKworICBlcnJvciAoIk5vIGJyZWFrcG9pbnQgbnVtYmVyICVkLiIsIGJudW0pOworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2NvbW1hbmRzX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICByZWdpc3RlciBzdHJ1Y3QgYnJlYWtwb2ludCAqYjsKKyAgY2hhciAqcDsKKyAgcmVnaXN0ZXIgaW50IGJudW07CisgIHN0cnVjdCBjb21tYW5kX2xpbmUgKmw7CisKKyAgLyogSWYgd2UgYWxsb3dlZCB0aGlzLCB3ZSB3b3VsZCBoYXZlIHByb2JsZW1zIHdpdGggd2hlbiB0bworICAgICBmcmVlIHRoZSBzdG9yYWdlLCBpZiB3ZSBjaGFuZ2UgdGhlIGNvbW1hbmRzIGN1cnJlbnRseQorICAgICBiZWluZyByZWFkIGZyb20uICAqLworCisgIGlmIChleGVjdXRpbmdfYnJlYWtwb2ludF9jb21tYW5kcykKKyAgICBlcnJvciAoIkNhbid0IHVzZSB0aGUgXCJjb21tYW5kc1wiIGNvbW1hbmQgYW1vbmcgYSBicmVha3BvaW50J3MgY29tbWFuZHMuIik7CisKKyAgcCA9IGFyZzsKKyAgYm51bSA9IGdldF9udW1iZXIgKCZwKTsKKyAgaWYgKHAgJiYgKnApCisgICAgZXJyb3IgKCJVbmV4cGVjdGVkIGV4dHJhIGFyZ3VtZW50cyBmb2xsb3dpbmcgYnJlYWtwb2ludCBudW1iZXIuIik7CisgICAgICAKKyAgQUxMX0JSRUFLUE9JTlRTIChiKQorICAgIGlmIChiLT5udW1iZXIgPT0gYm51bSkKKyAgICAgIHsKKwljaGFyIHRtcGJ1ZlsxMjhdOworCXNwcmludGYgKHRtcGJ1ZiwgIlR5cGUgY29tbWFuZHMgZm9yIHdoZW4gYnJlYWtwb2ludCAlZCBpcyBoaXQsIG9uZSBwZXIgbGluZS4iLCBibnVtKTsKKwlsID0gcmVhZF9jb21tYW5kX2xpbmVzICh0bXBidWYsIGZyb21fdHR5KTsKKwlmcmVlX2NvbW1hbmRfbGluZXMgKCZiLT5jb21tYW5kcyk7CisJYi0+Y29tbWFuZHMgPSBsOworCWJyZWFrcG9pbnRzX2NoYW5nZWQgKCk7CisJcmV0dXJuOworICAgICAgfQorICBlcnJvciAoIk5vIGJyZWFrcG9pbnQgbnVtYmVyICVkLiIsIGJudW0pOworfQorDAorLyogTGlrZSB0YXJnZXRfcmVhZF9tZW1vcnkoKSBidXQgaWYgYnJlYWtwb2ludHMgYXJlIGluc2VydGVkLCByZXR1cm4KKyAgIHRoZSBzaGFkb3cgY29udGVudHMgaW5zdGVhZCBvZiB0aGUgYnJlYWtwb2ludHMgdGhlbXNlbHZlcy4KKworICAgUmVhZCAibWVtb3J5IGRhdGEiIGZyb20gd2hhdGV2ZXIgdGFyZ2V0IG9yIGluZmVyaW9yIHdlIGhhdmUuIAorICAgUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwsIGVycm5vIHZhbHVlIGlmIG5vdC4gIEVJTyBpcyB1c2VkCisgICBmb3IgYWRkcmVzcyBvdXQgb2YgYm91bmRzLiAgSWYgYnJlYWtwb2ludHMgYXJlIGluc2VydGVkLCByZXR1cm5zCisgICBzaGFkb3cgY29udGVudHMsIG5vdCB0aGUgYnJlYWtwb2ludHMgdGhlbXNlbHZlcy4gIEZyb20gYnJlYWtwb2ludC5jLiAgKi8KKworaW50CityZWFkX21lbW9yeV9ub2JwdCAobWVtYWRkciwgbXlhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIHVuc2lnbmVkIGxlbjsKK3sKKyAgaW50IHN0YXR1czsKKyAgc3RydWN0IGJyZWFrcG9pbnQgKmI7CisgIENPUkVfQUREUiBicF9hZGRyID0gMDsKKyAgaW50IGJwX3NpemUgPSAwOworCisgIGlmIChCUkVBS1BPSU5UX0ZST01fUEMgKCZicF9hZGRyLCAmYnBfc2l6ZSkgPT0gTlVMTCkKKyAgICAvKiBObyBicmVha3BvaW50cyBvbiB0aGlzIG1hY2hpbmUuICovCisgICAgcmV0dXJuIHRhcmdldF9yZWFkX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4pOworICAKKyAgQUxMX0JSRUFLUE9JTlRTIChiKQorICAgIHsKKyAgICAgIGlmIChiLT50eXBlID09IGJwX25vbmUpCisgICAgICAgIHdhcm5pbmcgKCJhdHRlbXB0ZWQgdG8gcmVhZCB0aHJvdWdoIGFwcGFyZW50bHkgZGVsZXRlZCBicmVha3BvaW50ICMlZD9cbiIsIGItPm51bWJlcik7CisKKyAgICAgIC8qIG1lbW9yeSBicmVha3BvaW50PyAqLworICAgICAgaWYgKGItPnR5cGUgPT0gYnBfd2F0Y2hwb2ludAorCSAgfHwgYi0+dHlwZSA9PSBicF9oYXJkd2FyZV93YXRjaHBvaW50CisJICB8fCBiLT50eXBlID09IGJwX3JlYWRfd2F0Y2hwb2ludAorCSAgfHwgYi0+dHlwZSA9PSBicF9hY2Nlc3Nfd2F0Y2hwb2ludCkKKwljb250aW51ZTsKKyAgICAgIC8qIGJwIGluIG1lbW9yeT8gKi8KKyAgICAgIGlmICghYi0+aW5zZXJ0ZWQpCisJY29udGludWU7CisgICAgICAvKiBBZGRyZXNzZXMgYW5kIGxlbmd0aCBvZiB0aGUgcGFydCBvZiB0aGUgYnJlYWtwb2ludCB0aGF0CisJIHdlIG5lZWQgdG8gY29weS4gICovCisgICAgICAvKiBYWFhYIFRoZSBtNjhrLCBzaCBhbmQgaDgzMDAgaGF2ZSBkaWZmZXJlbnQgbG9jYWwgYW5kIHJlbW90ZQorCSBicmVha3BvaW50IHZhbHVlcy4gIEJSRUFLUE9JTlRfRlJPTV9QQyBzdGlsbCBtYW5hZ2VzIHRvCisJIGNvcnJlY3RseSBkZXRlcm1pbmUgdGhlIGJyZWFrcG9pbnRzIG1lbW9yeSBhZGRyZXNzIGFuZCBzaXplCisJIGZvciB0aGVzZSB0YXJnZXRzLiAqLworICAgICAgYnBfYWRkciA9IGItPmFkZHJlc3M7CisgICAgICBicF9zaXplID0gMDsKKyAgICAgIGlmIChCUkVBS1BPSU5UX0ZST01fUEMgKCZicF9hZGRyLCAmYnBfc2l6ZSkgPT0gTlVMTCkKKwljb250aW51ZTsKKyAgICAgIGlmIChicF9zaXplID09IDApCisJLyogYnAgaXNuJ3QgdmFsaWQgKi8KKwljb250aW51ZTsKKyAgICAgIGlmIChicF9hZGRyICsgYnBfc2l6ZSA8PSBtZW1hZGRyKQorCS8qIFRoZSBicmVha3BvaW50IGlzIGVudGlyZWx5IGJlZm9yZSB0aGUgY2h1bmsgb2YgbWVtb3J5IHdlCisJICAgYXJlIHJlYWRpbmcuICAqLworCWNvbnRpbnVlOworICAgICAgaWYgKGJwX2FkZHIgPj0gbWVtYWRkciArIGxlbikKKwkvKiBUaGUgYnJlYWtwb2ludCBpcyBlbnRpcmVseSBhZnRlciB0aGUgY2h1bmsgb2YgbWVtb3J5IHdlIGFyZQorCSAgIHJlYWRpbmcuICovCisJY29udGludWU7CisgICAgICAvKiBDb3B5IHRoZSBicmVha3BvaW50IGZyb20gdGhlIHNoYWRvdyBjb250ZW50cywgYW5kIHJlY3Vyc2UgZm9yCisJIHRoZSB0aGluZ3MgYmVmb3JlIGFuZCBhZnRlci4gICovCisgICAgICB7CisJLyogT2Zmc2V0IHdpdGhpbiBzaGFkb3dfY29udGVudHMuICAqLworCWludCBicHRvZmZzZXQgPSAwOworCSAgCisJaWYgKGJwX2FkZHIgPCBtZW1hZGRyKQorCSAgeworCSAgICAvKiBPbmx5IGNvcHkgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBicmVha3BvaW50LiAgKi8KKwkgICAgYnBfc2l6ZSAtPSBtZW1hZGRyIC0gYnBfYWRkcjsKKwkgICAgYnB0b2Zmc2V0ID0gbWVtYWRkciAtIGJwX2FkZHI7CisJICAgIGJwX2FkZHIgPSBtZW1hZGRyOworCSAgfQorCQorCWlmIChicF9hZGRyICsgYnBfc2l6ZSA+IG1lbWFkZHIgKyBsZW4pCisJICB7CisJICAgIC8qIE9ubHkgY29weSB0aGUgZmlyc3QgcGFydCBvZiB0aGUgYnJlYWtwb2ludC4gICovCisJICAgIGJwX3NpemUgLT0gKGJwX2FkZHIgKyBicF9zaXplKSAtIChtZW1hZGRyICsgbGVuKTsKKwkgIH0KKwkKKwltZW1jcHkgKG15YWRkciArIGJwX2FkZHIgLSBtZW1hZGRyLCAKKwkJYi0+c2hhZG93X2NvbnRlbnRzICsgYnB0b2Zmc2V0LCBicF9zaXplKTsKKwkKKwlpZiAoYnBfYWRkciA+IG1lbWFkZHIpCisJICB7CisJICAgIC8qIENvcHkgdGhlIHNlY3Rpb24gb2YgbWVtb3J5IGJlZm9yZSB0aGUgYnJlYWtwb2ludC4gICovCisJICAgIHN0YXR1cyA9IHJlYWRfbWVtb3J5X25vYnB0IChtZW1hZGRyLCBteWFkZHIsIGJwX2FkZHIgLSBtZW1hZGRyKTsKKwkgICAgaWYgKHN0YXR1cyAhPSAwKQorCSAgICAgIHJldHVybiBzdGF0dXM7CisJICB9CisJCisJaWYgKGJwX2FkZHIgKyBicF9zaXplIDwgbWVtYWRkciArIGxlbikKKwkgIHsKKwkgICAgLyogQ29weSB0aGUgc2VjdGlvbiBvZiBtZW1vcnkgYWZ0ZXIgdGhlIGJyZWFrcG9pbnQuICAqLworCSAgICBzdGF0dXMgPSByZWFkX21lbW9yeV9ub2JwdAorCSAgICAgIChicF9hZGRyICsgYnBfc2l6ZSwKKwkgICAgICAgbXlhZGRyICsgYnBfYWRkciArIGJwX3NpemUgLSBtZW1hZGRyLAorCSAgICAgICBtZW1hZGRyICsgbGVuIC0gKGJwX2FkZHIgKyBicF9zaXplKSk7CisJICAgIGlmIChzdGF0dXMgIT0gMCkKKwkgICAgICByZXR1cm4gc3RhdHVzOworCSAgfQorCXJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgLyogTm90aGluZyBvdmVybGFwcy4gIEp1c3QgY2FsbCByZWFkX21lbW9yeV9ub2Vyci4gICovCisgIHJldHVybiB0YXJnZXRfcmVhZF9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKTsKK30KKworDAorLyogaW5zZXJ0X2JyZWFrcG9pbnRzIGlzIHVzZWQgd2hlbiBzdGFydGluZyBvciBjb250aW51aW5nIHRoZSBwcm9ncmFtLgorICAgcmVtb3ZlX2JyZWFrcG9pbnRzIGlzIHVzZWQgd2hlbiB0aGUgcHJvZ3JhbSBzdG9wcy4KKyAgIEJvdGggcmV0dXJuIHplcm8gaWYgc3VjY2Vzc2Z1bCwKKyAgIG9yIGFuIGBlcnJubycgdmFsdWUgaWYgY291bGQgbm90IHdyaXRlIHRoZSBpbmZlcmlvci4gICovCisKK2ludAoraW5zZXJ0X2JyZWFrcG9pbnRzICgpCit7CisgIHJlZ2lzdGVyIHN0cnVjdCBicmVha3BvaW50ICpiLCAqdGVtcDsKKyAgaW50IHZhbCA9IDA7CisgIGludCBkaXNhYmxlZF9icmVha3MgPSAwOworCisgIHN0YXRpYyBjaGFyIG1lc3NhZ2UxW10gPSAiRXJyb3IgaW5zZXJ0aW5nIGNhdGNocG9pbnQgJWQ6XG4iOworICBzdGF0aWMgY2hhciBtZXNzYWdlW3NpemVvZiAobWVzc2FnZTEpICsgMzBdOworCisKKyAgQUxMX0JSRUFLUE9JTlRTX1NBRkUgKGIsIHRlbXApCisgICAgeworICAgICAgaWYgKGItPnR5cGUgIT0gYnBfd2F0Y2hwb2ludAorCSAgJiYgYi0+dHlwZSAhPSBicF9oYXJkd2FyZV93YXRjaHBvaW50CisJICAmJiBiLT50eXBlICE9IGJwX3JlYWRfd2F0Y2hwb2ludAorCSAgJiYgYi0+dHlwZSAhPSBicF9hY2Nlc3Nfd2F0Y2hwb2ludAorCSAgJiYgYi0+dHlwZSAhPSBicF9jYXRjaF9mb3JrCisJICAmJiBiLT50eXBlICE9IGJwX2NhdGNoX3Zmb3JrCisJICAmJiBiLT50eXBlICE9IGJwX2NhdGNoX2V4ZWMKKyAgICAgICAgICAmJiBiLT50eXBlICE9IGJwX2NhdGNoX3Rocm93CisgICAgICAgICAgJiYgYi0+dHlwZSAhPSBicF9jYXRjaF9jYXRjaAorCSAgJiYgYi0+ZW5hYmxlICE9IGRpc2FibGVkCisJICAmJiBiLT5lbmFibGUgIT0gc2hsaWJfZGlzYWJsZWQKKyAgICAgICAgICAmJiBiLT5lbmFibGUgIT0gY2FsbF9kaXNhYmxlZAorCSAgJiYgISBiLT5pbnNlcnRlZAorCSAgJiYgISBiLT5kdXBsaWNhdGUpCisJeworCSAgaWYgKGItPnR5cGUgPT0gYnBfaGFyZHdhcmVfYnJlYWtwb2ludCkKKwkgICAgdmFsID0gdGFyZ2V0X2luc2VydF9od19icmVha3BvaW50KGItPmFkZHJlc3MsIGItPnNoYWRvd19jb250ZW50cyk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBDaGVjayB0byBzZWUgaWYgYnJlYWtwb2ludCBpcyBpbiBhbiBvdmVybGF5IHNlY3Rpb247CisJCSBpZiBzbywgd2Ugc2hvdWxkIHNldCB0aGUgYnJlYWtwb2ludCBhdCB0aGUgTE1BIGFkZHJlc3MuCisJCSBPbmx5IGlmIHRoZSBzZWN0aW9uIGlzIGN1cnJlbnRseSBtYXBwZWQgc2hvdWxkIHdlIEFMU08KKwkJIHNldCBhIGJyZWFrIGF0IHRoZSBWTUEgYWRkcmVzcy4gKi8KKwkgICAgICBpZiAob3ZlcmxheV9kZWJ1Z2dpbmcgJiYgYi0+c2VjdGlvbiAmJgorCQkgIHNlY3Rpb25faXNfb3ZlcmxheSAoYi0+c2VjdGlvbikpCisJCXsKKwkJICBDT1JFX0FERFIgYWRkcjsKKworCQkgIGFkZHIgPSBvdmVybGF5X3VubWFwcGVkX2FkZHJlc3MgKGItPmFkZHJlc3MsIGItPnNlY3Rpb24pOworCQkgIHZhbCA9IHRhcmdldF9pbnNlcnRfYnJlYWtwb2ludCAoYWRkciwgYi0+c2hhZG93X2NvbnRlbnRzKTsKKwkJICAvKiBUaGlzIHdvdWxkIGJlIHRoZSB0aW1lIHRvIGNoZWNrIHZhbCwgdG8gc2VlIGlmIHRoZQorCQkgICAgIGJyZWFrcG9pbnQgd3JpdGUgdG8gdGhlIGxvYWQgYWRkcmVzcyBzdWNjZWVkZWQuICAKKwkJICAgICBIb3dldmVyLCB0aGlzIG1pZ2h0IGJlIGFuIG9yZGluYXJ5IG9jY3VycmFuY2UsIGVnLiBpZiAKKwkJICAgICB0aGUgdW5tYXBwZWQgb3ZlcmxheSBpcyBpbiBST00uICAqLworCQkgIHZhbCA9IDA7CS8qIGluIGNhc2UgdW5tYXBwZWQgYWRkcmVzcyBmYWlsZWQgKi8KKwkJICBpZiAoc2VjdGlvbl9pc19tYXBwZWQgKGItPnNlY3Rpb24pKQorCQkgICAgdmFsID0gdGFyZ2V0X2luc2VydF9icmVha3BvaW50IChiLT5hZGRyZXNzLCAKKwkJCQkJCSAgICBiLT5zaGFkb3dfY29udGVudHMpOworCQl9CisJICAgICAgZWxzZSAvKiBvcmRpbmFyeSAobm9uLW92ZXJsYXkpIGFkZHJlc3MgKi8KKwkJdmFsID0gdGFyZ2V0X2luc2VydF9icmVha3BvaW50KGItPmFkZHJlc3MsIGItPnNoYWRvd19jb250ZW50cyk7CisJICAgIH0KKwkgIGlmICh2YWwpCisJICAgIHsKKwkgICAgICAvKiBDYW4ndCBzZXQgdGhlIGJyZWFrcG9pbnQuICAqLworI2lmIGRlZmluZWQgKERJU0FCTEVfVU5TRVRUQUJMRV9CUkVBSykKKwkgICAgICBpZiAoRElTQUJMRV9VTlNFVFRBQkxFX0JSRUFLIChiLT5hZGRyZXNzKSkKKwkJeworICAgICAgICAgICAgICAgICAgLyogU2VlIGFsc286IGRpc2FibGVfYnJlYWtwb2ludHNfaW5fc2hsaWJzLiAqLworCQkgIHZhbCA9IDA7CisJCSAgYi0+ZW5hYmxlID0gc2hsaWJfZGlzYWJsZWQ7CisJCSAgaWYgKCFkaXNhYmxlZF9icmVha3MpCisJCSAgICB7CisJCSAgICAgIHRhcmdldF90ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgKCk7CisJCSAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKwkJCQkJICAiQ2Fubm90IGluc2VydCBicmVha3BvaW50ICVkOlxuIiwgYi0+bnVtYmVyKTsKKwkJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiVGVtcG9yYXJpbHkgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJ5IGJyZWFrcG9pbnRzOlxuIik7CisJCSAgICB9CisJCSAgZGlzYWJsZWRfYnJlYWtzID0gMTsKKwkJICBwcmludGZfZmlsdGVyZWQgKCIlZCAiLCBiLT5udW1iZXIpOworCQl9CisJICAgICAgZWxzZQorI2VuZGlmCisJCXsKKwkJICB0YXJnZXRfdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ICgpOworCQkgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIkNhbm5vdCBpbnNlcnQgYnJlYWtwb2ludCAlZDpcbiIsIGItPm51bWJlcik7CisjaWZkZWYgT05FX1BST0NFU1NfV1JJVEVURVhUCisJCSAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLAorCQkJCSAgICAgICJUaGUgc2FtZSBwcm9ncmFtIG1heSBiZSBydW5uaW5nIGluIGFub3RoZXIgcHJvY2Vzcy5cbiIpOworI2VuZGlmCisJCSAgbWVtb3J5X2Vycm9yICh2YWwsIGItPmFkZHJlc3MpOwkvKiB3aGljaCBib21icyB1cyBvdXQgKi8KKwkJfQorCSAgICB9CisJICBlbHNlCisgICAgICAgICAgICBiLT5pbnNlcnRlZCA9IDE7CisgICAgICAgfQorICAgIGVsc2UgaWYgKGVwX2lzX2V4Y2VwdGlvbl9jYXRjaHBvaW50IChiKQorICAgICAgICAgICAgICYmIGItPmVuYWJsZSAhPSBkaXNhYmxlZAorICAgICAgICAgICAgICYmIGItPmVuYWJsZSAhPSBzaGxpYl9kaXNhYmxlZAorICAgICAgICAgICAgICYmIGItPmVuYWJsZSAhPSBjYWxsX2Rpc2FibGVkCisgICAgICAgICAgICAgJiYgISBiLT5pbnNlcnRlZAorICAgICAgICAgICAgICYmICEgYi0+ZHVwbGljYXRlKQorCisgICAgICB7CisgICAgICAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgbXVzdCBoYXZlIGEgY2FsbGJhY2sgbWVjaGFuaXNtIGZvciBleGNlcHRpb24KKyAgICAgICAgICAgIGV2ZW50cyAtLSB3aXRoIGcrKyBzdHlsZSBlbWJlZGRlZCBsYWJlbCBzdXBwb3J0LCB3ZSBpbnNlcnQKKyAgICAgICAgICAgIG9yZGluYXJ5IGJyZWFrcG9pbnRzIGFuZCBub3QgY2F0Y2hwb2ludHMuICovIAorICAgICAgICBzcHJpbnRmIChtZXNzYWdlLCBtZXNzYWdlMSwgYi0+bnVtYmVyKTsgLyogRm9ybWF0IHBvc3NpYmxlIGVycm9yIG1lc3NhZ2UgKi8KKyAKKyAgICAgICAgdmFsID0gdGFyZ2V0X2luc2VydF9icmVha3BvaW50KGItPmFkZHJlc3MsIGItPnNoYWRvd19jb250ZW50cyk7CisgICAgICAgIGlmICh2YWwpCisgICAgICAgICAgeworICAgICAgICAgICAvKiBDb3VsZG4ndCBzZXQgYnJlYWtwb2ludCBmb3Igc29tZSByZWFzb24gKi8gCisgICAgICAgICAgIHRhcmdldF90ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgKCk7CisgICAgICAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgaW5zZXJ0IGNhdGNocG9pbnQgJWQ7IGRpc2FibGluZyBpdFxuIiwgYi0+bnVtYmVyKTsKKyAgICAgICAgICAgYi0+ZW5hYmxlID0gZGlzYWJsZWQ7CisgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBCcCBzZXQsIG5vdyBtYWtlIHN1cmUgY2FsbGJhY2tzIGFyZSBlbmFibGVkICovIAorCSAgICBpbnQgdmFsOworCSAgICBhcmdzX2Zvcl9jYXRjaHBvaW50X2VuYWJsZSBhcmdzOyAgCisJICAgIGFyZ3Mua2luZCA9IGItPnR5cGUgPT0gYnBfY2F0Y2hfY2F0Y2ggPyBFWF9FVkVOVF9DQVRDSCA6IEVYX0VWRU5UX1RIUk9XOworCSAgICBhcmdzLmVuYWJsZSA9IDE7CisJICAgIHZhbCA9IGNhdGNoX2Vycm9ycyAoY292ZXJfdGFyZ2V0X2VuYWJsZV9leGNlcHRpb25fY2FsbGJhY2ssCisJCQkJJmFyZ3MsCisJCQkJbWVzc2FnZSwgUkVUVVJOX01BU0tfQUxMKTsKKwkgICAgaWYgKHZhbCAhPSAwICYmIHZhbCAhPSAtMSkKKwkgICAgICB7CisJCWItPmluc2VydGVkID0gMTsKKwkgICAgICB9CisJICAgIC8qIENoZWNrIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nOyB2YWwgPT0gMCBjYW4gYmUgaWdub3JlZCAqLyAKKwkgICAgaWYgKHZhbCA9PSAtMSkKKwkgICAgICB7CisJCS8qIHNvbWV0aGluZyB3ZW50IHdyb25nICovIAorCQl0YXJnZXRfdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ICgpOworCQlmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJDYW5ub3QgaW5zZXJ0IGNhdGNocG9pbnQgJWQ7IGRpc2FibGluZyBpdFxuIiwgYi0+bnVtYmVyKTsKKwkJYi0+ZW5hYmxlID0gZGlzYWJsZWQ7CisJICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAoKGItPnR5cGUgPT0gYnBfaGFyZHdhcmVfd2F0Y2hwb2ludCB8fAorCQliLT50eXBlID09IGJwX3JlYWRfd2F0Y2hwb2ludCB8fAorCQliLT50eXBlID09IGJwX2FjY2Vzc193YXRjaHBvaW50KQorCSAgICAgICAmJiBiLT5lbmFibGUgPT0gZW5hYmxlZAorCSAgICAgICAmJiAhIGItPmluc2VydGVkCisJICAgICAgICYmICEgYi0+ZHVwbGljYXRlKQorCXsKKwkgIHN0cnVjdCBmcmFtZV9pbmZvICpzYXZlZF9mcmFtZTsKKwkgIGludCBzYXZlZF9sZXZlbCwgd2l0aGluX2N1cnJlbnRfc2NvcGU7CisJICB2YWx1ZV9wdHIgbWFyayA9IHZhbHVlX21hcmsgKCk7CisJICB2YWx1ZV9wdHIgdjsKKworCSAgLyogU2F2ZSB0aGUgY3VycmVudCBmcmFtZSBhbmQgbGV2ZWwgc28gd2UgY2FuIHJlc3RvcmUgaXQgYWZ0ZXIKKwkgICAgIGV2YWx1YXRpbmcgdGhlIHdhdGNocG9pbnQgZXhwcmVzc2lvbiBvbiBpdHMgb3duIGZyYW1lLiAgKi8KKwkgIHNhdmVkX2ZyYW1lID0gc2VsZWN0ZWRfZnJhbWU7CisJICBzYXZlZF9sZXZlbCA9IHNlbGVjdGVkX2ZyYW1lX2xldmVsOworCisJICAvKiBEZXRlcm1pbmUgaWYgdGhlIHdhdGNocG9pbnQgaXMgd2l0aGluIHNjb3BlLiAgKi8KKwkgIGlmIChiLT5leHBfdmFsaWRfYmxvY2sgPT0gTlVMTCkKKwkgICAgd2l0aGluX2N1cnJlbnRfc2NvcGUgPSAxOworCSAgZWxzZQorCSAgICB7CisJICAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworCisJICAgICAgLyogVGhlcmUgbWlnaHQgYmUgbm8gY3VycmVudCBmcmFtZSBhdCB0aGlzIG1vbWVudCBpZiB3ZSBhcmUKKwkJIHJlc3VtaW5nIGZyb20gYSBzdGVwIG92ZXIgYSBicmVha3BvaW50LgorCQkgU2V0IHVwIGN1cnJlbnQgZnJhbWUgYmVmb3JlIHRyeWluZyB0byBmaW5kIHRoZSB3YXRjaHBvaW50CisJCSBmcmFtZS4gICovCisJICAgICAgZ2V0X2N1cnJlbnRfZnJhbWUgKCk7CisJICAgICAgZmkgPSBmaW5kX2ZyYW1lX2FkZHJfaW5fZnJhbWVfY2hhaW4gKGItPndhdGNocG9pbnRfZnJhbWUpOworCSAgICAgIHdpdGhpbl9jdXJyZW50X3Njb3BlID0gKGZpICE9IE5VTEwpOworCSAgICAgIGlmICh3aXRoaW5fY3VycmVudF9zY29wZSkKKwkJc2VsZWN0X2ZyYW1lIChmaSwgLTEpOworCSAgICB9CisJCisJICBpZiAod2l0aGluX2N1cnJlbnRfc2NvcGUpCisJICAgIHsKKwkgICAgICAvKiBFdmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBhbmQgY3V0IHRoZSBjaGFpbiBvZiB2YWx1ZXMKKwkJIHByb2R1Y2VkIG9mZiBmcm9tIHRoZSB2YWx1ZSBjaGFpbi4gICovCisJICAgICAgdiA9IGV2YWx1YXRlX2V4cHJlc3Npb24gKGItPmV4cCk7CisJICAgICAgdmFsdWVfcmVsZWFzZV90b19tYXJrIChtYXJrKTsKKwkgICAgCisJICAgICAgYi0+dmFsX2NoYWluID0gdjsKKwkgICAgICBiLT5pbnNlcnRlZCA9IDE7CisKKwkgICAgICAvKiBMb29rIGF0IGVhY2ggdmFsdWUgb24gdGhlIHZhbHVlIGNoYWluLiAgKi8KKwkgICAgICBmb3IgKCA7IHY7IHY9di0+bmV4dCkKKwkJeworCQkgIC8qIElmIGl0J3MgYSBtZW1vcnkgbG9jYXRpb24sIHRoZW4gd2UgbXVzdCB3YXRjaCBpdC4gICovCisJCSAgaWYgKHYtPmx2YWwgPT0gbHZhbF9tZW1vcnkpCisJCSAgICB7CisJCSAgICAgIGludCBhZGRyLCBsZW4sIHR5cGU7CisJCSAgICAKKwkJICAgICAgYWRkciA9IFZBTFVFX0FERFJFU1MgKHYpICsgVkFMVUVfT0ZGU0VUICh2KTsKKwkJICAgICAgbGVuID0gVFlQRV9MRU5HVEggKFZBTFVFX1RZUEUgKHYpKTsKKwkJICAgICAgdHlwZSA9IDA7CisJCSAgICAgIGlmIChiLT50eXBlID09IGJwX3JlYWRfd2F0Y2hwb2ludCkKKwkJCXR5cGUgPSAxOworCQkgICAgICBlbHNlIGlmIChiLT50eXBlID09IGJwX2FjY2Vzc193YXRjaHBvaW50KQorCQkJdHlwZSA9IDI7CisKKwkJICAgICAgdmFsID0gdGFyZ2V0X2luc2VydF93YXRjaHBvaW50IChhZGRyLCBsZW4sIHR5cGUpOworCQkgICAgICBpZiAodmFsID09IC0xKQorCQkJeworCQkJICBiLT5pbnNlcnRlZCA9IDA7CisJCQkgIGJyZWFrOworCQkJfQorCQkgICAgICB2YWwgPSAwOworCQkgICAgfQorCQl9CisJICAgICAgLyogRmFpbHVyZSB0byBpbnNlcnQgYSB3YXRjaHBvaW50IG9uIGFueSBtZW1vcnkgdmFsdWUgaW4gdGhlCisJCSB2YWx1ZSBjaGFpbiBicmluZ3MgdXMgaGVyZS4gICovCisJICAgICAgaWYgKCFiLT5pbnNlcnRlZCkKKwkJd2FybmluZyAoIkhhcmR3YXJlIHdhdGNocG9pbnQgJWQ6IENvdWxkIG5vdCBpbnNlcnQgd2F0Y2hwb2ludFxuIiwKKwkJCSBiLT5udW1iZXIpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCJcCitIYXJkd2FyZSB3YXRjaHBvaW50ICVkIGRlbGV0ZWQgYmVjYXVzZSB0aGUgcHJvZ3JhbSBoYXMgbGVmdCB0aGUgYmxvY2sgaW5cblwKK3doaWNoIGl0cyBleHByZXNzaW9uIGlzIHZhbGlkLlxuIiwgYi0+bnVtYmVyKTsKKwkgICAgICBpZiAoYi0+cmVsYXRlZF9icmVha3BvaW50KQorCQliLT5yZWxhdGVkX2JyZWFrcG9pbnQtPmRpc3Bvc2l0aW9uID0gZGVsX2F0X25leHRfc3RvcDsKKwkgICAgICBiLT5kaXNwb3NpdGlvbiA9IGRlbF9hdF9uZXh0X3N0b3A7CisJICAgIH0KKworCSAgLyogUmVzdG9yZSB0aGUgZnJhbWUgYW5kIGxldmVsLiAgKi8KKwkgIGlmICgoc2F2ZWRfZnJhbWUgIT0gc2VsZWN0ZWRfZnJhbWUpIHx8CisJICAgICAgKHNhdmVkX2xldmVsICE9IHNlbGVjdGVkX2ZyYW1lX2xldmVsKSkKKwkgICAgc2VsZWN0X2FuZF9wcmludF9mcmFtZSAoc2F2ZWRfZnJhbWUsIHNhdmVkX2xldmVsKTsKKwl9IAorICAgICAgZWxzZSBpZiAoKGItPnR5cGUgPT0gYnBfY2F0Y2hfZm9yaworICAgICAgICAgICAgICAgIHx8IGItPnR5cGUgPT0gYnBfY2F0Y2hfdmZvcmsKKyAgICAgICAgICAgICAgICB8fCBiLT50eXBlID09IGJwX2NhdGNoX2V4ZWMpCisgICAgICAgICAgICAgICAmJiBiLT5lbmFibGUgPT0gZW5hYmxlZAorICAgICAgICAgICAgICAgJiYgISBiLT5pbnNlcnRlZAorICAgICAgICAgICAgICAgJiYgISBiLT5kdXBsaWNhdGUpCisJeworCSAgdmFsID0gLTE7CisgICAgICAgICAgc3dpdGNoIChiLT50eXBlKQorICAgICAgICAgICAgeworCSAgICBjYXNlIGJwX2NhdGNoX2ZvcmsgOgorCSAgICAgIHZhbCA9IHRhcmdldF9pbnNlcnRfZm9ya19jYXRjaHBvaW50IChpbmZlcmlvcl9waWQpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIGJwX2NhdGNoX3Zmb3JrIDoKKwkgICAgICB2YWwgPSB0YXJnZXRfaW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQgKGluZmVyaW9yX3BpZCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgYnBfY2F0Y2hfZXhlYyA6CisJICAgICAgdmFsID0gdGFyZ2V0X2luc2VydF9leGVjX2NhdGNocG9pbnQgKGluZmVyaW9yX3BpZCk7CisJICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKHZhbCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHRhcmdldF90ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgKCk7CisgICAgICAgICAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIkNhbm5vdCBpbnNlcnQgY2F0Y2hwb2ludCAlZDpcbiIsIGItPm51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYi0+aW5zZXJ0ZWQgPSAxOworICAgICAgICB9CisgICAgfQorICBpZiAoZGlzYWJsZWRfYnJlYWtzKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisKKyAgcmV0dXJuIHZhbDsKK30KKworCitpbnQKK3JlbW92ZV9icmVha3BvaW50cyAoKQoreworICByZWdpc3RlciBzdHJ1Y3QgYnJlYWtwb2ludCAqYjsKKyAgaW50IHZhbDsKKworICBBTExfQlJFQUtQT0lOVFMgKGIpCisgICAgeworICAgICAgaWYgKGItPmluc2VydGVkKQorCXsKKwkgIHZhbCA9IHJlbW92ZV9icmVha3BvaW50IChiLCBtYXJrX3VuaW5zZXJ0ZWQpOworCSAgaWYgKHZhbCAhPSAwKQorCSAgICByZXR1cm4gdmFsOworCX0KKyAgICB9CisgIHJldHVybiAwOworfQorCitpbnQKK3JlYXR0YWNoX2JyZWFrcG9pbnRzIChwaWQpCisgIGludCAgcGlkOworeworICByZWdpc3RlciBzdHJ1Y3QgYnJlYWtwb2ludCAqYjsKKyAgaW50IHZhbDsKKyAgaW50ICBzYXZlZF9pbmZlcmlvcl9waWQgPSBpbmZlcmlvcl9waWQ7CisKKyAgaW5mZXJpb3JfcGlkID0gcGlkOyAgLyogQmVjYXVzZSByZW1vdmVfYnJlYWtwb2ludCB3aWxsIHVzZSB0aGlzIGdsb2JhbC4gKi8KKyAgQUxMX0JSRUFLUE9JTlRTIChiKQorICAgIHsKKyAgICAgIGlmIChiLT5pbnNlcnRlZCkKKwl7CisgICAgICAgICAgcmVtb3ZlX2JyZWFrcG9pbnQgKGIsIG1hcmtfaW5zZXJ0ZWQpOworICAgICAgICAgIGlmIChiLT50eXBlID09IGJwX2hhcmR3YXJlX2JyZWFrcG9pbnQpCisgICAgICAgICAgICB2YWwgPSB0YXJnZXRfaW5zZXJ0X2h3X2JyZWFrcG9pbnQoYi0+YWRkcmVzcywgYi0+c2hhZG93X2NvbnRlbnRzKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB2YWwgPSB0YXJnZXRfaW5zZXJ0X2JyZWFrcG9pbnQoYi0+YWRkcmVzcywgYi0+c2hhZG93X2NvbnRlbnRzKTsKKwkgIGlmICh2YWwgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaW5mZXJpb3JfcGlkID0gc2F2ZWRfaW5mZXJpb3JfcGlkOworICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICBpbmZlcmlvcl9waWQgPSBzYXZlZF9pbmZlcmlvcl9waWQ7CisgIHJldHVybiAwOworfQorCit2b2lkCit1cGRhdGVfYnJlYWtwb2ludHNfYWZ0ZXJfZXhlYyAoKQoreworICBzdHJ1Y3QgYnJlYWtwb2ludCAqICBiOworICBzdHJ1Y3QgYnJlYWtwb2ludCAqICB0ZW1wOworCisgIC8qIERvaW5nIHRoaXMgZmlyc3QgcHJldmVudHMgdGhlIGJhZG5lc3Mgb2YgaGF2aW5nIGRlbGV0ZV9icmVha3BvaW50KCkKKyAgICAgd3JpdGUgYSBicmVha3BvaW50J3MgY3VycmVudCAic2hhZG93IGNvbnRlbnRzIiB0byBsaWZ0IHRoZSBicC4gIFRoYXQKKyAgICAgc2hhZG93IGlzIE5PVCB2YWxpZCBhZnRlciBhbiBleGVjKCkhICovCisgIG1hcmtfYnJlYWtwb2ludHNfb3V0ICgpOworCisgIEFMTF9CUkVBS1BPSU5UU19TQUZFIChiLCB0ZW1wKQorICAgIHsKKyAgICAgIC8qIFNvbGliIGJyZWFrcG9pbnRzIG11c3QgYmUgZXhwbGljaXRseSByZXNldCBhZnRlciBhbiBleGVjKCkuICovCisgICAgICBpZiAoYi0+dHlwZSA9PSBicF9zaGxpYl9ldmVudCkKKyAgICAgICAgeworICAgICAgICAgIGRlbGV0ZV9icmVha3BvaW50IChiKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAvKiBTdGVwLXJlc3VtZSBicmVha3BvaW50cyBhcmUgbWVhbmluZ2xlc3MgYWZ0ZXIgYW4gZXhlYygpLiAqLworICAgICAgaWYgKGItPnR5cGUgPT0gYnBfc3RlcF9yZXN1bWUpCisgICAgICAgIHsKKyAgICAgICAgICBkZWxldGVfYnJlYWtwb2ludCAoYik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgLyogRGl0dG8gdGhlIHNpZ3RyYW1wIGhhbmRsZXIgYnJlYWtwb2ludHMuICovCisgICAgICBpZiAoYi0+dHlwZSA9PSBicF90aHJvdWdoX3NpZ3RyYW1wKQorICAgICAgICB7CisgICAgICAgICAgZGVsZXRlX2JyZWFrcG9pbnQgKGIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIC8qIERpdHRvIHRoZSBleGNlcHRpb24taGFuZGxpbmcgY2F0Y2hwb2ludHMuICovCisgICAgICBpZiAoKGItPnR5cGUgPT0gYnBfY2F0Y2hfY2F0Y2gpIHx8IChiLT50eXBlID09IGJwX2NhdGNoX3Rocm93KSkKKyAgICAgICAgeworICAgICAgICAgIGRlbGV0ZV9icmVha3BvaW50IChiKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAvKiBEb24ndCBkZWxldGUgYW4gZXhlYyBjYXRjaHBvaW50LCBiZWNhdXNlIGVsc2UgdGhlIGluZmVyaW9yCisgICAgICAgICB3b24ndCBzdG9wIHdoZW4gaXQgb3VnaHQhCisKKyAgICAgICAgIFNpbWlsYXJseSwgd2UgcHJvYmFibHkgb3VnaHQgdG8ga2VlcCB2Zm9yayBjYXRjaHBvaW50cywgJ2NhdXNlCisgICAgICAgICBvbiB0aGlzIHRhcmdldCwgd2UgbWF5IG5vdCBiZSBhYmxlIHRvIHN0b3Agd2hlbiB0aGUgdmZvcmsgaXMgc2VlbiwKKyAgICAgICAgIGJ1dCBvbmx5IHdoZW4gdGhlIHN1YnNlcXVlbnQgZXhlYyBpcyBzZWVuLiAgKEFuZCBiZWNhdXNlIGRlbGV0aW5nCisgICAgICAgICBmb3JrIGNhdGNocG9pbnRzIGhlcmUgYnV0IG5vdCB2Zm9yayBjYXRjaHBvaW50cyB3aWxsIHNlZW0gbXlzdGVyaW91cworICAgICAgICAgdG8gdXNlcnMsIGtlZXAgdGhvc2UgdG9vLikKKworICAgICAgICAgPz9yZWhyYXVlcjogTGV0J3MgaG9wZSB0aGF0IG1lcmVseSBjbGVhcmluZyBvdXQgdGhpcyBjYXRjaHBvaW50J3MKKyAgICAgICAgIHRhcmdldCBhZGRyZXNzIGZpZWxkLCBpZiBhbnksIGlzIHN1ZmZpY2llbnQgdG8gaGF2ZSBpdCBiZSByZXNldAorICAgICAgICAgYXV0b21hZ2ljYWxseS4gIENlcnRhaW5seSBvbiBIUC1VWCB0aGF0J3MgdHJ1ZS4gKi8KKyAgICAgIGlmICgoYi0+dHlwZSA9PSBicF9jYXRjaF9leGVjKSB8fAorICAgICAgICAgIChiLT50eXBlID09IGJwX2NhdGNoX3Zmb3JrKSB8fAorICAgICAgICAgIChiLT50eXBlID09IGJwX2NhdGNoX2ZvcmspKQorICAgICAgICB7CisgICAgICAgICAgYi0+YWRkcmVzcyA9IChDT1JFX0FERFIpIE5VTEw7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgLyogYnBfZmluaXNoIGlzIGEgc3BlY2lhbCBjYXNlLiAgVGhlIG9ubHkgd2F5IHdlIG91Z2h0IHRvIGJlIGFibGUKKyAgICAgICAgIHRvIHNlZSBvbmUgb2YgdGhlc2Ugd2hlbiBhbiBleGVjKCkgaGFzIGhhcHBlbmVkLCBpcyBpZiB0aGUgdXNlcgorICAgICAgICAgY2F1Z2h0IGEgdmZvcmssIGFuZCB0aGVuIHNhaWQgImZpbmlzaCIuICBPcmRpbmFyaWx5IGEgZmluaXNoIGp1c3QKKyAgICAgICAgIGNhcnJpZXMgdGhlbSB0byB0aGUgY2FsbC1zaXRlIG9mIHRoZSBjdXJyZW50IGNhbGxlZSwgYnkgc2V0dGluZworICAgICAgICAgYSB0ZW1wb3JhcnkgYnAgdGhlcmUgYW5kIHJlc3VtaW5nLiAgQnV0IGluIHRoaXMgY2FzZSwgdGhlIGZpbmlzaAorICAgICAgICAgd2lsbCBjYXJyeSB0aGVtIGVudGlyZWx5IHRocm91Z2ggdGhlIHZmb3JrICYgZXhlYy4KKworICAgICAgICAgV2UgZG9uJ3Qgd2FudCB0byBhbGxvdyBhIGJwX2ZpbmlzaCB0byByZW1haW4gaW5zZXJ0ZWQgbm93LiAgQnV0CisgICAgICAgICB3ZSBjYW4ndCBzYWZlbHkgZGVsZXRlIGl0LCAnY2F1c2UgZmluaXNoX2NvbW1hbmQgaGFzIGEgaGFuZGxlIHRvCisgICAgICAgICB0aGUgYnAgb24gYSBicHN0YXQsIGFuZCB3aWxsIGxhdGVyIHdhbnQgdG8gZGVsZXRlIGl0LiAgVGhlcmUncyBhCisgICAgICAgICBjaGFuY2UgKGFuZCBJJ3ZlIHNlZW4gaXQgaGFwcGVuKSB0aGF0IGlmIHdlIGRlbGV0ZSB0aGUgYnBfZmluaXNoCisgICAgICAgICBoZXJlLCB0aGF0IGl0cyBzdG9yYWdlIHdpbGwgZ2V0IHJldXNlZCBieSB0aGUgdGltZSBmaW5pc2hfY29tbWFuZAorICAgICAgICAgZ2V0cyAncm91bmQgdG8gZGVsZXRpbmcgdGhlICJ1c2UgdG8gYmUgYSBicF9maW5pc2giIGJyZWFrcG9pbnQuCisgICAgICAgICBXZSByZWFsbHkgbXVzdCBhbGxvdyBmaW5pc2hfY29tbWFuZCB0byBkZWxldGUgYSBicF9maW5pc2guCisKKyAgICAgICAgIEluIHRoZSBhYnNlbnNlIG9mIGEgZ2VuZXJhbCBzb2x1dGlvbiBmb3IgdGhlICJob3cgZG8gd2Uga25vdyBpdCdzCisgICAgICAgICBzYWZlIHRvIGRlbGV0ZSBzb21ldGhpbmcgb3RoZXJzIG1heSBoYXZlIGhhbmRsZXMgdG8/IiBwcm9ibGVtLCB3aGF0CisgICAgICAgICB3ZSdsbCBkbyBoZXJlIGlzIGp1c3QgdW5pbnNlcnQgdGhlIGJwX2ZpbmlzaCwgYW5kIGxldCBmaW5pc2hfY29tbWFuZAorICAgICAgICAgZGVsZXRlIGl0LgorCisgICAgICAgICAoV2Uga25vdyB0aGUgYnBfZmluaXNoIGlzICJkb29tZWQiIGluIHRoZSBzZW5zZSB0aGF0IGl0J3MgbW9tZW50YXJ5LAorICAgICAgICAgYW5kIHdpbGwgYmUgZGVsZXRlZCBhcyBzb29uIGFzIGZpbmlzaF9jb21tYW5kIHNlZXMgdGhlIGluZmVyaW9yIHN0b3BwZWQuCisgICAgICAgICBTbyBpdCBkb2Vzbid0IG1hdHRlciB0aGF0IHRoZSBicCdzIGFkZHJlc3MgaXMgcHJvYmFibHkgYm9ndXMgaW4gdGhlCisgICAgICAgICBuZXcgYS5vdXQsIHVubGlrZSBlLmcuLCB0aGUgc29saWIgYnJlYWtwb2ludHMuKSAgKi8KKyAgICAgIGlmIChiLT50eXBlID09IGJwX2ZpbmlzaCkKKyAgICAgICAgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIC8qIFdpdGhvdXQgYSBzeW1ib2xpYyBhZGRyZXNzLCB3ZSBoYXZlIGxpdHRsZSBob3BlIG9mIHRoZQorICAgICAgICAgcHJlLWV4ZWMoKSBhZGRyZXNzIG1lYW5pbmcgdGhlIHNhbWUgdGhpbmcgaW4gdGhlIHBvc3QtZXhlYygpCisgICAgICAgICBhLm91dC4gKi8KKyAgICAgIGlmIChiLT5hZGRyX3N0cmluZyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGVsZXRlX2JyZWFrcG9pbnQgKGIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgIC8qIElmIHRoaXMgYnJlYWtwb2ludCBoYXMgc3Vydml2ZWQgdGhlIGFib3ZlIGJhdHRlcnkgb2YgY2hlY2tzLCB0aGVuCisgICAgICAgICBpdCBtdXN0IGhhdmUgYSBzeW1ib2xpYyBhZGRyZXNzLiAgQmUgc3VyZSB0aGF0IGl0IGdldHMgcmVldmFsdWF0ZWQKKyAgICAgICAgIHRvIGEgdGFyZ2V0IGFkZHJlc3MsIHJhdGhlciB0aGFuIHJldXNpbmcgdGhlIG9sZCBldmFsdWF0aW9uLiAgKi8KKyAgICAgIGItPmFkZHJlc3MgPSAoQ09SRV9BRERSKSBOVUxMOworICAgIH0KK30KKworaW50CitkZXRhY2hfYnJlYWtwb2ludHMgKHBpZCkKKyAgaW50ICBwaWQ7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBicmVha3BvaW50ICpiOworICBpbnQgdmFsOworICBpbnQgIHNhdmVkX2luZmVyaW9yX3BpZCA9IGluZmVyaW9yX3BpZDsKKyAKKyAgaWYgKHBpZCA9PSBpbmZlcmlvcl9waWQpCisgICAgZXJyb3IgKCJDYW5ub3QgZGV0YWNoIGJyZWFrcG9pbnRzIG9mIGluZmVyaW9yX3BpZCIpOworIAorICBpbmZlcmlvcl9waWQgPSBwaWQ7ICAvKiBCZWNhdXNlIHJlbW92ZV9icmVha3BvaW50IHdpbGwgdXNlIHRoaXMgZ2xvYmFsLiAqLworICBBTExfQlJFQUtQT0lOVFMgKGIpCisgICAgeworICAgICAgaWYgKGItPmluc2VydGVkKQorICAgICAgICB7CisgICAgICAgICAgdmFsID0gcmVtb3ZlX2JyZWFrcG9pbnQgKGIsIG1hcmtfaW5zZXJ0ZWQpOworICAgICAgICAgIGlmICh2YWwgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaW5mZXJpb3JfcGlkID0gc2F2ZWRfaW5mZXJpb3JfcGlkOworICAgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICBpbmZlcmlvcl9waWQgPSBzYXZlZF9pbmZlcmlvcl9waWQ7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CityZW1vdmVfYnJlYWtwb2ludCAoYiwgaXMpCisgICAgIHN0cnVjdCBicmVha3BvaW50ICpiOworICAgICBpbnNlcnRpb25fc3RhdGVfdCAgaXM7Cit7CisgIGludCB2YWw7CisgIAorICBpZiAoYi0+dHlwZSA9PSBicF9ub25lKQorICAgIHdhcm5pbmcgKCJhdHRlbXB0ZWQgdG8gcmVtb3ZlIGFwcGFyZW50bHkgZGVsZXRlZCBicmVha3BvaW50ICMlZD9cbiIsIGItPm51bWJlcik7CisKKyAgaWYgKGItPnR5cGUgIT0gYnBfd2F0Y2hwb2ludAorICAgICAgJiYgYi0+dHlwZSAhPSBicF9oYXJkd2FyZV93YXRjaHBvaW50CisgICAgICAmJiBiLT50eXBlICE9IGJwX3JlYWRfd2F0Y2hwb2ludAorICAgICAgJiYgYi0+dHlwZSAhPSBicF9hY2Nlc3Nfd2F0Y2hwb2ludAorICAgICAgJiYgYi0+dHlwZSAhPSBicF9jYXRjaF9mb3JrCisgICAgICAmJiBiLT50eXBlICE9IGJwX2NhdGNoX3Zmb3JrCisgICAgICAmJiBiLT50eXBlICE9IGJwX2NhdGNoX2V4ZWMKKyAgICAgICYmIGItPnR5cGUgIT0gYnBfY2F0Y2hfY2F0Y2gKKyAgICAgICYmIGItPnR5cGUgIT0gYnBfY2F0Y2hfdGhyb3cpCisgICAgICAKKyAgICB7CisgICAgICBpZiAoYi0+dHlwZSA9PSBicF9oYXJkd2FyZV9icmVha3BvaW50KQorICAgICAgICB2YWwgPSB0YXJnZXRfcmVtb3ZlX2h3X2JyZWFrcG9pbnQoYi0+YWRkcmVzcywgYi0+c2hhZG93X2NvbnRlbnRzKTsKKyAgICAgIGVsc2UKKwl7CisJICAvKiBDaGVjayB0byBzZWUgaWYgYnJlYWtwb2ludCBpcyBpbiBhbiBvdmVybGF5IHNlY3Rpb247CisJICAgICBpZiBzbywgd2Ugc2hvdWxkIHJlbW92ZSB0aGUgYnJlYWtwb2ludCBhdCB0aGUgTE1BIGFkZHJlc3MuCisJICAgICBJZiB0aGF0IGlzIG5vdCBlcXVhbCB0byB0aGUgcmF3IGFkZHJlc3MsIHRoZW4gd2Ugc2hvdWxkIAorCSAgICAgcHJlc3VtYWJsZSByZW1vdmUgdGhlIGJyZWFrcG9pbnQgdGhlcmUgYXMgd2VsbC4gICovCisJICBpZiAob3ZlcmxheV9kZWJ1Z2dpbmcgJiYgYi0+c2VjdGlvbiAmJiAKKwkgICAgICBzZWN0aW9uX2lzX292ZXJsYXkgKGItPnNlY3Rpb24pKQorCSAgICB7CisJICAgICAgQ09SRV9BRERSIGFkZHI7CisKKwkgICAgICBhZGRyID0gb3ZlcmxheV91bm1hcHBlZF9hZGRyZXNzIChiLT5hZGRyZXNzLCBiLT5zZWN0aW9uKTsKKwkgICAgICB2YWwgPSB0YXJnZXRfcmVtb3ZlX2JyZWFrcG9pbnQgKGFkZHIsIGItPnNoYWRvd19jb250ZW50cyk7CisJICAgICAgLyogVGhpcyB3b3VsZCBiZSB0aGUgdGltZSB0byBjaGVjayB2YWwsIHRvIHNlZSBpZiB0aGUKKwkJIHNoYWRvdyBicmVha3BvaW50IHdyaXRlIHRvIHRoZSBsb2FkIGFkZHJlc3Mgc3VjY2VlZGVkLiAgCisJCSBIb3dldmVyLCB0aGlzIG1pZ2h0IGJlIGFuIG9yZGluYXJ5IG9jY3VycmFuY2UsIGVnLiBpZiAKKwkJIHRoZSB1bm1hcHBlZCBvdmVybGF5IGlzIGluIFJPTS4gICovCisJICAgICAgdmFsID0gMDsJLyogaW4gY2FzZSB1bm1hcHBlZCBhZGRyZXNzIGZhaWxlZCAqLworCSAgICAgIGlmIChzZWN0aW9uX2lzX21hcHBlZCAoYi0+c2VjdGlvbikpCisJCXZhbCA9IHRhcmdldF9yZW1vdmVfYnJlYWtwb2ludCAoYi0+YWRkcmVzcywgCisJCQkJCQliLT5zaGFkb3dfY29udGVudHMpOworCSAgICB9CisJICBlbHNlIC8qIG9yZGluYXJ5IChub24tb3ZlcmxheSkgYWRkcmVzcyAqLworCSAgICB2YWwgPSB0YXJnZXRfcmVtb3ZlX2JyZWFrcG9pbnQoYi0+YWRkcmVzcywgYi0+c2hhZG93X2NvbnRlbnRzKTsKKwl9CisgICAgICBpZiAodmFsKQorCXJldHVybiB2YWw7CisgICAgICBiLT5pbnNlcnRlZCA9IChpcyA9PSBtYXJrX2luc2VydGVkKTsKKyAgICB9CisgIGVsc2UgaWYgKChiLT50eXBlID09IGJwX2hhcmR3YXJlX3dhdGNocG9pbnQgfHwKKyAgICAgICAgICAgIGItPnR5cGUgPT0gYnBfcmVhZF93YXRjaHBvaW50IHx8CisgIAkgICAgYi0+dHlwZSA9PSBicF9hY2Nlc3Nfd2F0Y2hwb2ludCkKKwkgICAmJiBiLT5lbmFibGUgPT0gZW5hYmxlZAorCSAgICYmICEgYi0+ZHVwbGljYXRlKQorICAgIHsKKyAgICAgIHZhbHVlX3B0ciB2LCBuOworICAgICAgCisgICAgICBiLT5pbnNlcnRlZCA9IChpcyA9PSBtYXJrX2luc2VydGVkKTsKKyAgICAgIC8qIFdhbGsgZG93biB0aGUgc2F2ZWQgdmFsdWUgY2hhaW4uICAqLworICAgICAgZm9yICh2ID0gYi0+dmFsX2NoYWluOyB2OyB2ID0gdi0+bmV4dCkKKwl7CisJICAvKiBGb3IgZWFjaCBtZW1vcnkgcmVmZXJlbmNlIHJlbW92ZSB0aGUgd2F0Y2hwb2ludAorCSAgICAgYXQgdGhhdCBhZGRyZXNzLiAgKi8KKwkgIGlmICh2LT5sdmFsID09IGx2YWxfbWVtb3J5KQorCSAgICB7CisJICAgICAgaW50IGFkZHIsIGxlbiwgdHlwZTsKKwkgICAgICAKKwkgICAgICBhZGRyID0gVkFMVUVfQUREUkVTUyAodikgKyBWQUxVRV9PRkZTRVQgKHYpOworCSAgICAgIGxlbiA9IFRZUEVfTEVOR1RIIChWQUxVRV9UWVBFICh2KSk7CisJICAgICAgdHlwZSA9IDA7CisJICAgICAgaWYgKGItPnR5cGUgPT0gYnBfcmVhZF93YXRjaHBvaW50KQorCQl0eXBlID0gMTsKKwkgICAgICBlbHNlIGlmIChiLT50eXBlID09IGJwX2FjY2Vzc193YXRjaHBvaW50KQorCQl0eXBlID0gMjsKKworCSAgICAgIHZhbCA9IHRhcmdldF9yZW1vdmVfd2F0Y2hwb2ludCAoYWRkciwgbGVuLCB0eXBlKTsKKwkgICAgICBpZiAodmFsID09IC0xKQorCQliLT5pbnNlcnRlZCA9IDE7CisJICAgICAgdmFsID0gMDsKKwkgICAgfQorCX0KKyAgICAgIC8qIEZhaWx1cmUgdG8gcmVtb3ZlIGFueSBvZiB0aGUgaGFyZHdhcmUgd2F0Y2hwb2ludHMgY29tZXMgaGVyZS4gICovCisgICAgICBpZiAoKGlzID09IG1hcmtfdW5pbnNlcnRlZCkgJiYgKGItPmluc2VydGVkKSkKKwl3YXJuaW5nICgiSGFyZHdhcmUgd2F0Y2hwb2ludCAlZDogQ291bGQgbm90IHJlbW92ZSB3YXRjaHBvaW50XG4iLAorCQkgYi0+bnVtYmVyKTsKKyAgICAgIAorICAgICAgLyogRnJlZSB0aGUgc2F2ZWQgdmFsdWUgY2hhaW4uICBXZSB3aWxsIGNvbnN0cnVjdCBhIG5ldyBvbmUKKwkgdGhlIG5leHQgdGltZSB0aGUgd2F0Y2hwb2ludCBpcyBpbnNlcnRlZC4gICovCisgICAgICBmb3IgKHYgPSBiLT52YWxfY2hhaW47IHY7IHYgPSBuKQorCXsKKwkgIG4gPSB2LT5uZXh0OworCSAgdmFsdWVfZnJlZSAodik7CisJfQorICAgICAgYi0+dmFsX2NoYWluID0gTlVMTDsKKyAgICB9CisgIGVsc2UgaWYgKChiLT50eXBlID09IGJwX2NhdGNoX2ZvcmsgfHwKKyAgICAgICAgICAgIGItPnR5cGUgPT0gYnBfY2F0Y2hfdmZvcmsgfHwKKyAgCSAgICBiLT50eXBlID09IGJwX2NhdGNoX2V4ZWMpCisJICAgJiYgYi0+ZW5hYmxlID09IGVuYWJsZWQKKwkgICAmJiAhIGItPmR1cGxpY2F0ZSkKKyAgICB7CisgICAgICB2YWwgPSAtMTsKKyAgICAgIHN3aXRjaCAoYi0+dHlwZSkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgYnBfY2F0Y2hfZm9yazoKKyAgICAgICAgICAgIHZhbCA9IHRhcmdldF9yZW1vdmVfZm9ya19jYXRjaHBvaW50IChpbmZlcmlvcl9waWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBicF9jYXRjaF92Zm9yayA6CisgICAgICAgICAgICB2YWwgPSB0YXJnZXRfcmVtb3ZlX3Zmb3JrX2NhdGNocG9pbnQgKGluZmVyaW9yX3BpZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGJwX2NhdGNoX2V4ZWMgOgorICAgICAgICAgICAgdmFsID0gdGFyZ2V0X3JlbW92ZV9leGVjX2NhdGNocG9pbnQgKGluZmVyaW9yX3BpZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgaWYgKHZhbCkKKwlyZXR1cm4gdmFsOworICAgICAgYi0+aW5zZXJ0ZWQgPSAoaXMgPT0gbWFya19pbnNlcnRlZCk7CisgICAgfQorICBlbHNlIGlmICgoYi0+dHlwZSA9PSBicF9jYXRjaF9jYXRjaCB8fAorICAgICAgICAgICAgYi0+dHlwZSA9PSBicF9jYXRjaF90aHJvdykKKyAgICAgICAgICAgJiYgYi0+ZW5hYmxlID09IGVuYWJsZWQKKyAgICAgICAgICAgJiYgISBiLT5kdXBsaWNhdGUpCisgICAgeworCisgICAgICB2YWwgPSB0YXJnZXRfcmVtb3ZlX2JyZWFrcG9pbnQoYi0+YWRkcmVzcywgYi0+c2hhZG93X2NvbnRlbnRzKTsKKyAgICAgIGlmICh2YWwpCisgICAgICAgIHJldHVybiB2YWw7CisgICAgICBiLT5pbnNlcnRlZCA9IChpcyA9PSBtYXJrX2luc2VydGVkKTsKKyAgICB9CisgIGVsc2UgaWYgKGVwX2lzX2V4Y2VwdGlvbl9jYXRjaHBvaW50IChiKQorICAgICAgICAgICAmJiBiLT5pbnNlcnRlZCAvKiBzb21ldGltZXMgcHJldmlvdXMgaW5zZXJ0IGRvZXNuJ3QgaGFwcGVuICovIAorICAgICAgICAgICAmJiBiLT5lbmFibGUgPT0gZW5hYmxlZAorICAgICAgICAgICAmJiAhIGItPmR1cGxpY2F0ZSkKKyAgICB7CisKKyAgICAgIHZhbCA9IHRhcmdldF9yZW1vdmVfYnJlYWtwb2ludChiLT5hZGRyZXNzLCBiLT5zaGFkb3dfY29udGVudHMpOworICAgICAgaWYgKHZhbCkKKyAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgCisgICAgICBiLT5pbnNlcnRlZCA9IChpcyA9PSBtYXJrX2luc2VydGVkKTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIENsZWFyIHRoZSAiaW5zZXJ0ZWQiIGZsYWcgaW4gYWxsIGJyZWFrcG9pbnRzLiAgKi8KKwordm9pZAorbWFya19icmVha3BvaW50c19vdXQgKCkKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGJyZWFrcG9pbnQgKmI7CisKKyAgQUxMX0JSRUFLUE9JTlRTIChiKQorICAgIGItPmluc2VydGVkID0gMDsKK30KKworLyogQ2xlYXIgdGhlICJpbnNlcnRlZCIgZmxhZyBpbiBhbGwgYnJlYWtwb2ludHMgYW5kIGRlbGV0ZSBhbnkgYnJlYWtwb2ludHMKKyAgIHdoaWNoIHNob3VsZCBnbyBhd2F5IGJldHdlZW4gcnVucyBvZiB0aGUgcHJvZ3JhbS4KKworICAgUGx1cyBvdGhlciBzdWNoIGhvdXNla2VlcGluZyB0aGF0IGhhcyB0byBiZSBkb25lIGZvciBicmVha3BvaW50cworICAgYmV0d2VlbiBydW5zLgorCisgICBOb3RlOiB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgYSBydW4gKGJ5IGdlbmVyaWNfbW91cm5faW5mZXJpb3IpCisgICBhbmQgd2hlbiBhIHJ1biBiZWdpbnMgKGJ5IGluaXRfd2FpdF9mb3JfaW5mZXJpb3IpLiAqLyAKKworCisKK3ZvaWQKK2JyZWFrcG9pbnRfaW5pdF9pbmZlcmlvciAoY29udGV4dCkKKyAgZW51bSBpbmZfY29udGV4dCBjb250ZXh0OworeworICByZWdpc3RlciBzdHJ1Y3QgYnJlYWtwb2ludCAqYiwgKnRlbXA7CisgIHN0YXRpYyBpbnQgd2FybmluZ19uZWVkZWQgPSAwOworCisgIEFMTF9CUkVBS1BPSU5UU19TQUZFIChiLCB0ZW1wKQorICAgIHsKKyAgICAgIGItPmluc2VydGVkID0gMDsKKworICAgICAgc3dpdGNoIChiLT50eXBlKQorCXsKKwljYXNlIGJwX2NhbGxfZHVtbXk6CisJY2FzZSBicF93YXRjaHBvaW50X3Njb3BlOgorCisJICAvKiBJZiB0aGUgY2FsbCBkdW1teSBicmVha3BvaW50IGlzIGF0IHRoZSBlbnRyeSBwb2ludCBpdCB3aWxsCisJICAgICBjYXVzZSBwcm9ibGVtcyB3aGVuIHRoZSBpbmZlcmlvciBpcyByZXJ1biwgc28gd2UgYmV0dGVyCisJICAgICBnZXQgcmlkIG9mIGl0LiAKKworCSAgICAgQWxzbyBnZXQgcmlkIG9mIHNjb3BlIGJyZWFrcG9pbnRzLiAgKi8KKwkgIGRlbGV0ZV9icmVha3BvaW50IChiKTsKKwkgIGJyZWFrOworCisJY2FzZSBicF93YXRjaHBvaW50OgorCWNhc2UgYnBfaGFyZHdhcmVfd2F0Y2hwb2ludDoKKwljYXNlIGJwX3JlYWRfd2F0Y2hwb2ludDoKKwljYXNlIGJwX2FjY2Vzc193YXRjaHBvaW50OgorCisJICAvKiBMaWtld2lzZSBmb3Igd2F0Y2hwb2ludHMgb24gbG9jYWwgZXhwcmVzc2lvbnMuICAqLworCSAgaWYgKGItPmV4cF92YWxpZF9ibG9jayAhPSBOVUxMKQorCSAgICBkZWxldGVfYnJlYWtwb2ludCAoYik7CisJICBicmVhazsKKwlkZWZhdWx0OgorICAgICAgICAgLyogTGlrZXdpc2UgZm9yIGV4Y2VwdGlvbiBjYXRjaHBvaW50cyBpbiBkeW5hbWljLWxpbmtlZAorICAgICAgICAgZXhlY3V0YWJsZXMgd2hlcmUgcmVxdWlyZWQgKi8KKyAgICAgICAgIGlmIChlcF9pc19leGNlcHRpb25fY2F0Y2hwb2ludCAoYikgJiYKKyAgICAgICAgICAgIGV4Y2VwdGlvbl9jYXRjaHBvaW50c19hcmVfZnJhZ2lsZSkKKyAgICAgICAgICB7CisgICAgICAgICAgICB3YXJuaW5nX25lZWRlZCA9IDE7CisgICAgICAgICAgICBkZWxldGVfYnJlYWtwb2ludCAoYik7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKGV4Y2VwdGlvbl9jYXRjaHBvaW50c19hcmVfZnJhZ2lsZSkKKyAgICBleGNlcHRpb25fc3VwcG9ydF9pbml0aWFsaXplZCA9IDA7CisKKyAgLyogRG9uJ3QgaXNzdWUgdGhlIHdhcm5pbmcgdW5sZXNzIGl0J3MgcmVhbGx5IG5lZWRlZC4uLiAqLyAKKyAgaWYgKHdhcm5pbmdfbmVlZGVkICYmIChjb250ZXh0ICE9IGluZl9leGl0ZWQpKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJFeGNlcHRpb24gY2F0Y2hwb2ludHMgZnJvbSBsYXN0IHJ1biB3ZXJlIGRlbGV0ZWQsIHlvdSBtdXN0IHJlaW5zZXJ0IHRoZW0gZXhwbGljaXRseSIpOworICAgICAgd2FybmluZ19uZWVkZWQgPSAwOworICAgIH0gIAorfQorCisvKiBicmVha3BvaW50X2hlcmVfcCAoUEMpIHJldHVybnMgMSBpZiBhbiBlbmFibGVkIGJyZWFrcG9pbnQgZXhpc3RzIGF0IFBDLgorICAgV2hlbiBjb250aW51aW5nIGZyb20gYSBsb2NhdGlvbiB3aXRoIGEgYnJlYWtwb2ludCwKKyAgIHdlIGFjdHVhbGx5IHNpbmdsZSBzdGVwIG9uY2UgYmVmb3JlIGNhbGxpbmcgaW5zZXJ0X2JyZWFrcG9pbnRzLiAgKi8KKworaW50CiticmVha3BvaW50X2hlcmVfcCAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGJyZWFrcG9pbnQgKmI7CisKKyAgQUxMX0JSRUFLUE9JTlRTIChiKQorICAgIGlmIChiLT5lbmFibGUgPT0gZW5hYmxlZAorCSYmIGItPmVuYWJsZSAhPSBzaGxpYl9kaXNhYmxlZAorCSYmIGItPmVuYWJsZSAhPSBjYWxsX2Rpc2FibGVkCisJJiYgYi0+YWRkcmVzcyA9PSBwYykJLyogYnAgaXMgZW5hYmxlZCBhbmQgbWF0Y2hlcyBwYyAqLworICAgICAgeworICAgICAgICBpZiAob3ZlcmxheV9kZWJ1Z2dpbmcgJiYKKwkgICAgc2VjdGlvbl9pc19vdmVybGF5IChiLT5zZWN0aW9uKSAmJgorCSAgICAhc2VjdGlvbl9pc19tYXBwZWQgKGItPnNlY3Rpb24pKQorCSAgY29udGludWU7CQkvKiB1bm1hcHBlZCBvdmVybGF5IC0tIGNhbid0IGJlIGEgbWF0Y2ggKi8KKyAgICAgICAgZWxzZQorCSAgcmV0dXJuIDE7CisgICAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIGJyZWFrcG9pbnRfaW5zZXJ0ZWRfaGVyZV9wIChQQykgaXMganVzdCBsaWtlIGJyZWFrcG9pbnRfaGVyZV9wKCksIGJ1dCBpdAorICAgb25seSByZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYWN0dWFsbHkgYSBicmVha3BvaW50IGluc2VydGVkIGF0IFBDLiAgKi8KKworaW50CiticmVha3BvaW50X2luc2VydGVkX2hlcmVfcCAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGJyZWFrcG9pbnQgKmI7CisKKyAgQUxMX0JSRUFLUE9JTlRTIChiKQorICAgIGlmIChiLT5pbnNlcnRlZAorCSYmIGItPmFkZHJlc3MgPT0gcGMpCS8qIGJwIGlzIGluc2VydGVkIGFuZCBtYXRjaGVzIHBjICovCisgICAgICB7CisgICAgICAgIGlmIChvdmVybGF5X2RlYnVnZ2luZyAmJgorCSAgICBzZWN0aW9uX2lzX292ZXJsYXkgKGItPnNlY3Rpb24pICYmCisJICAgICFzZWN0aW9uX2lzX21hcHBlZCAoYi0+c2VjdGlvbikpCisJICBjb250aW51ZTsJCS8qIHVubWFwcGVkIG92ZXJsYXkgLS0gY2FuJ3QgYmUgYSBtYXRjaCAqLworICAgICAgICBlbHNlCisJICByZXR1cm4gMTsKKyAgICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogUmV0dXJuIG5vbnplcm8gaWYgRlJBTUUgaXMgYSBkdW1teSBmcmFtZS4gIFdlIGNhbid0IHVzZSBQQ19JTl9DQUxMX0RVTU1ZCisgICBiZWNhdXNlIGZpZ3VyaW5nIG91dCB0aGUgc2F2ZWQgU1Agd291bGQgdGFrZSB0b28gbXVjaCB0aW1lLCBhdCBsZWFzdCB1c2luZworICAgZ2V0X3NhdmVkX3JlZ2lzdGVyIG9uIHRoZSA2OGsuICBUaGlzIG1lYW5zIHRoYXQgZm9yIHRoaXMgZnVuY3Rpb24gdG8KKyAgIHdvcmsgcmlnaHQgYSBwb3J0IG11c3QgdXNlIHRoZSBicF9jYWxsX2R1bW15IGJyZWFrcG9pbnQuICAqLworCitpbnQKK2ZyYW1lX2luX2R1bW15IChmcmFtZSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworeworI2lmZGVmIENBTExfRFVNTVkKKyNpZmRlZiBVU0VfR0VORVJJQ19EVU1NWV9GUkFNRVMgCisgIHJldHVybiBnZW5lcmljX3BjX2luX2NhbGxfZHVtbXkgKGZyYW1lLT5wYywgZnJhbWUtPmZyYW1lKTsKKyNlbHNlCisgIHN0cnVjdCBicmVha3BvaW50ICpiOworCisgIEFMTF9CUkVBS1BPSU5UUyAoYikKKyAgICB7CisgICAgICBzdGF0aWMgVUxPTkdFU1QgZHVtbXlbXSA9IENBTExfRFVNTVk7CisKKyAgICAgIGlmIChiLT50eXBlID09IGJwX2NhbGxfZHVtbXkKKwkgICYmIGItPmZyYW1lID09IGZyYW1lLT5mcmFtZQorCisJICAvKiBXZSBuZWVkIHRvIGNoZWNrIHRoZSBQQyBhcyB3ZWxsIGFzIHRoZSBmcmFtZSBvbiB0aGUgc3BhcmMsCisJICAgICBmb3Igc2lnbmFscy5leHAgaW4gdGhlIHRlc3RzdWl0ZS4gICovCisJICAmJiAoZnJhbWUtPnBjCisJICAgICAgPj0gKGItPmFkZHJlc3MKKwkJICAtIHNpemVvZiAoZHVtbXkpIC8gc2l6ZW9mIChMT05HRVNUKSAqIFJFR0lTVEVSX1NJWkUpKQorCSAgJiYgZnJhbWUtPnBjIDw9IGItPmFkZHJlc3MpCisJcmV0dXJuIDE7CisgICAgfQorI2VuZGlmCS8qIEdFTkVSSUNfRFVNTVlfRlJBTUVTICovCisjZW5kaWYgLyogQ0FMTF9EVU1NWSAqLworICByZXR1cm4gMDsKK30KKworLyogYnJlYWtwb2ludF9tYXRjaF90aHJlYWQgKFBDLCBQSUQpIHJldHVybnMgdHJ1ZSBpZiB0aGUgYnJlYWtwb2ludCBhdCBQQworICAgaXMgdmFsaWQgZm9yIHByb2Nlc3MvdGhyZWFkIFBJRC4gICovCisKK2ludAorYnJlYWtwb2ludF90aHJlYWRfbWF0Y2ggKHBjLCBwaWQpCisgICAgIENPUkVfQUREUiBwYzsKKyAgICAgaW50IHBpZDsKK3sKKyAgc3RydWN0IGJyZWFrcG9pbnQgKmI7CisgIGludCB0aHJlYWQ7CisKKyAgdGhyZWFkID0gcGlkX3RvX3RocmVhZF9pZCAocGlkKTsKKworICBBTExfQlJFQUtQT0lOVFMgKGIpCisgICAgaWYgKGItPmVuYWJsZSAhPSBkaXNhYmxlZAorCSYmIGItPmVuYWJsZSAhPSBzaGxpYl9kaXNhYmxlZAorCSYmIGItPmVuYWJsZSAhPSBjYWxsX2Rpc2FibGVkCisJJiYgYi0+YWRkcmVzcyA9PSBwYworCSYmIChiLT50aHJlYWQgPT0gLTEgfHwgYi0+dGhyZWFkID09IHRocmVhZCkpCisgICAgICB7CisgICAgICAgIGlmIChvdmVybGF5X2RlYnVnZ2luZyAmJgorCSAgICBzZWN0aW9uX2lzX292ZXJsYXkgKGItPnNlY3Rpb24pICYmCisJICAgICFzZWN0aW9uX2lzX21hcHBlZCAoYi0+c2VjdGlvbikpCisJICBjb250aW51ZTsJCS8qIHVubWFwcGVkIG92ZXJsYXkgLS0gY2FuJ3QgYmUgYSBtYXRjaCAqLworICAgICAgICBlbHNlCisJICByZXR1cm4gMTsKKyAgICAgIH0KKworICByZXR1cm4gMDsKK30KKworDAorLyogYnBzdGF0IHN0dWZmLiAgRXh0ZXJuYWwgcm91dGluZXMnIGludGVyZmFjZXMgYXJlIGRvY3VtZW50ZWQKKyAgIGluIGJyZWFrcG9pbnQuaC4gICovCisKK2ludAorZXBfaXNfY2F0Y2hwb2ludCAoZXApCisgIHN0cnVjdCBicmVha3BvaW50ICogIGVwOworeworICByZXR1cm4KKyAgICAoZXAtPnR5cGUgPT0gYnBfY2F0Y2hfbG9hZCkKKyAgICB8fCAoZXAtPnR5cGUgPT0gYnBfY2F0Y2hfdW5sb2FkKQorICAgIHx8IChlcC0+dHlwZSA9PSBicF9jYXRjaF9mb3JrKQorICAgIHx8IChlcC0+dHlwZSA9PSBicF9jYXRjaF92Zm9yaykKKyAgICB8fCAoZXAtPnR5cGUgPT0gYnBfY2F0Y2hfZXhlYykKKyAgICB8fCAoZXAtPnR5cGUgPT0gYnBfY2F0Y2hfY2F0Y2gpCisgICAgfHwgKGVwLT50eXBlID09IGJwX2NhdGNoX3Rocm93KQorCisKKyAgICAvKiA/P3JlaHJhdWVyOiBBZGQgbW9yZSBraW5kcyBoZXJlLCBhcyBhcmUgaW1wbGVtZW50ZWQuLi4gKi8KKyAgICA7Cit9CisgCitpbnQKK2VwX2lzX3NobGliX2NhdGNocG9pbnQgKGVwKQorICBzdHJ1Y3QgYnJlYWtwb2ludCAqICBlcDsKK3sKKyAgcmV0dXJuCisgICAgKGVwLT50eXBlID09IGJwX2NhdGNoX2xvYWQpCisgICAgfHwgKGVwLT50eXBlID09IGJwX2NhdGNoX3VubG9hZCkKKyAgICA7Cit9CisKK2ludAorZXBfaXNfZXhjZXB0aW9uX2NhdGNocG9pbnQgKGVwKQorICBzdHJ1Y3QgYnJlYWtwb2ludCAqICBlcDsKK3sKKyAgcmV0dXJuCisgICAgKGVwLT50eXBlID09IGJwX2NhdGNoX2NhdGNoKQorICAgIHx8IChlcC0+dHlwZSA9PSBicF9jYXRjaF90aHJvdykKKyAgICA7Cit9CisKKy8qIENsZWFyIGEgYnBzdGF0IHNvIHRoYXQgaXQgc2F5cyB3ZSBhcmUgbm90IGF0IGFueSBicmVha3BvaW50LgorICAgQWxzbyBmcmVlIGFueSBzdG9yYWdlIHRoYXQgaXMgcGFydCBvZiBhIGJwc3RhdC4gICovCisKK3ZvaWQKK2Jwc3RhdF9jbGVhciAoYnNwKQorICAgICBicHN0YXQgKmJzcDsKK3sKKyAgYnBzdGF0IHA7CisgIGJwc3RhdCBxOworCisgIGlmIChic3AgPT0gMCkKKyAgICByZXR1cm47CisgIHAgPSAqYnNwOworICB3aGlsZSAocCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHEgPSBwLT5uZXh0OworICAgICAgaWYgKHAtPm9sZF92YWwgIT0gTlVMTCkKKwl2YWx1ZV9mcmVlIChwLT5vbGRfdmFsKTsKKyAgICAgIGZyZWUgKChQVFIpcCk7CisgICAgICBwID0gcTsKKyAgICB9CisgICpic3AgPSBOVUxMOworfQorCisvKiBSZXR1cm4gYSBjb3B5IG9mIGEgYnBzdGF0LiAgTGlrZSAiYnMxID0gYnMyIiBidXQgYWxsIHN0b3JhZ2UgdGhhdAorICAgaXMgcGFydCBvZiB0aGUgYnBzdGF0IGlzIGNvcGllZCBhcyB3ZWxsLiAgKi8KKworYnBzdGF0CiticHN0YXRfY29weSAoYnMpCisgICAgIGJwc3RhdCBiczsKK3sKKyAgYnBzdGF0IHAgPSBOVUxMOworICBicHN0YXQgdG1wOworICBicHN0YXQgcmV0dmFsID0gTlVMTDsKKworICBpZiAoYnMgPT0gTlVMTCkKKyAgICByZXR1cm4gYnM7CisKKyAgZm9yICg7IGJzICE9IE5VTEw7IGJzID0gYnMtPm5leHQpCisgICAgeworICAgICAgdG1wID0gKGJwc3RhdCkgeG1hbGxvYyAoc2l6ZW9mICgqdG1wKSk7CisgICAgICBtZW1jcHkgKHRtcCwgYnMsIHNpemVvZiAoKnRtcCkpOworICAgICAgaWYgKHAgPT0gTlVMTCkKKwkvKiBUaGlzIGlzIHRoZSBmaXJzdCB0aGluZyBpbiB0aGUgY2hhaW4uICAqLworCXJldHZhbCA9IHRtcDsKKyAgICAgIGVsc2UKKwlwLT5uZXh0ID0gdG1wOworICAgICAgcCA9IHRtcDsKKyAgICB9CisgIHAtPm5leHQgPSBOVUxMOworICByZXR1cm4gcmV0dmFsOworfQorCisvKiBGaW5kIHRoZSBicHN0YXQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnJlYWtwb2ludCAqLworCiticHN0YXQKK2Jwc3RhdF9maW5kX2JyZWFrcG9pbnQoYnNwLCBicmVha3BvaW50KQorICAgICBicHN0YXQgYnNwOworICAgICBzdHJ1Y3QgYnJlYWtwb2ludCAqYnJlYWtwb2ludDsKK3sKKyAgaWYgKGJzcCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICBmb3IgKDtic3AgIT0gTlVMTDsgYnNwID0gYnNwLT5uZXh0KSB7CisgICAgaWYgKGJzcC0+YnJlYWtwb2ludF9hdCA9PSBicmVha3BvaW50KSByZXR1cm4gYnNwOworICB9CisgIHJldHVybiBOVUxMOworfQorCisvKiBGaW5kIGEgc3RlcF9yZXN1bWUgYnJlYWtwb2ludCBhc3NvY2lhdGVkIHdpdGggdGhpcyBicHN0YXQuCisgICAoSWYgdGhlcmUgYXJlIG11bHRpcGxlIHN0ZXBfcmVzdW1lIGJwJ3Mgb24gdGhlIGxpc3QsIHRoaXMgZnVuY3Rpb24KKyAgIHdpbGwgYXJiaXRyYXJpbHkgcGljayBvbmUuKQorCisgICBJdCBpcyBhbiBlcnJvciB0byB1c2UgdGhpcyBmdW5jdGlvbiBpZiBCUFNUQVQgZG9lc24ndCBjb250YWluIGEKKyAgIHN0ZXBfcmVzdW1lIGJyZWFrcG9pbnQuCisKKyAgIFNlZSB3YWl0X2Zvcl9pbmZlcmlvcidzIHVzZSBvZiB0aGlzIGZ1bmN0aW9uLiAgKi8KK3N0cnVjdCBicmVha3BvaW50ICoKK2Jwc3RhdF9maW5kX3N0ZXBfcmVzdW1lX2JyZWFrcG9pbnQgKGJzcCkKKyAgYnBzdGF0ICBic3A7Cit7CisgIGlmIChic3AgPT0gTlVMTCkKKyAgICBlcnJvciAoIkludGVybmFsIGVycm9yIChicHN0YXRfZmluZF9zdGVwX3Jlc3VtZV9icmVha3BvaW50KSIpOworCisgIGZvciAoOyBic3AgIT0gTlVMTDsgYnNwID0gYnNwLT5uZXh0KQorICAgIHsKKyAgICAgIGlmICgoYnNwLT5icmVha3BvaW50X2F0ICE9IE5VTEwpICYmCisgICAgICAgICAgKGJzcC0+YnJlYWtwb2ludF9hdC0+dHlwZSA9PSBicF9zdGVwX3Jlc3VtZSkpCisgICAgICAgIHJldHVybiBic3AtPmJyZWFrcG9pbnRfYXQ7CisgICAgfQorCisgIGVycm9yICgiSW50ZXJuYWwgZXJyb3IgKG5vIHN0ZXBfcmVzdW1lIGJyZWFrcG9pbnQgZm91bmQpIik7Cit9CisKKworLyogUmV0dXJuIHRoZSBicmVha3BvaW50IG51bWJlciBvZiB0aGUgZmlyc3QgYnJlYWtwb2ludCB3ZSBhcmUgc3RvcHBlZAorICAgYXQuICAqQlNQIHVwb24gcmV0dXJuIGlzIGEgYnBzdGF0IHdoaWNoIHBvaW50cyB0byB0aGUgcmVtYWluaW5nCisgICBicmVha3BvaW50cyBzdG9wcGVkIGF0IChidXQgd2hpY2ggaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgZ29vZCBmb3IKKyAgIGFueXRoaW5nIGJ1dCBmdXJ0aGVyIGNhbGxzIHRvIGJwc3RhdF9udW0pLgorICAgUmV0dXJuIDAgaWYgcGFzc2VkIGEgYnBzdGF0IHdoaWNoIGRvZXMgbm90IGluZGljYXRlIGFueSBicmVha3BvaW50cy4gICovCisKK2ludAorYnBzdGF0X251bSAoYnNwKQorICAgICBicHN0YXQgKmJzcDsKK3sKKyAgc3RydWN0IGJyZWFrcG9pbnQgKmI7CisKKyAgaWYgKCgqYnNwKSA9PSBOVUxMKQorICAgIHJldHVybiAwOwkJCS8qIE5vIG1vcmUgYnJlYWtwb2ludCB2YWx1ZXMgKi8KKyAgZWxzZQorICAgIHsKKyAgICAgIGIgPSAoKmJzcCktPmJyZWFrcG9pbnRfYXQ7CisgICAgICAqYnNwID0gKCpic3ApLT5uZXh0OworICAgICAgaWYgKGIgPT0gTlVMTCkKKwlyZXR1cm4gLTE7CQkvKiBicmVha3BvaW50IHRoYXQncyBiZWVuIGRlbGV0ZWQgc2luY2UgKi8KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGItPm51bWJlcjsJLyogV2UgaGF2ZSBpdHMgbnVtYmVyICovCisgICAgfQorfQorCisvKiBNb2RpZnkgQlMgc28gdGhhdCB0aGUgYWN0aW9ucyB3aWxsIG5vdCBiZSBwZXJmb3JtZWQuICAqLworCit2b2lkCiticHN0YXRfY2xlYXJfYWN0aW9ucyAoYnMpCisgICAgIGJwc3RhdCBiczsKK3sKKyAgZm9yICg7IGJzICE9IE5VTEw7IGJzID0gYnMtPm5leHQpCisgICAgeworICAgICAgYnMtPmNvbW1hbmRzID0gTlVMTDsKKyAgICAgIGlmIChicy0+b2xkX3ZhbCAhPSBOVUxMKQorCXsKKwkgIHZhbHVlX2ZyZWUgKGJzLT5vbGRfdmFsKTsKKwkgIGJzLT5vbGRfdmFsID0gTlVMTDsKKwl9CisgICAgfQorfQorCisvKiBTdHViIGZvciBjbGVhbmluZyB1cCBvdXIgc3RhdGUgaWYgd2UgZXJyb3Itb3V0IG9mIGEgYnJlYWtwb2ludCBjb21tYW5kICovCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2NsZWFudXBfZXhlY3V0aW5nX2JyZWFrcG9pbnRzIChpZ25vcmUpCisgICAgIFBUUiBpZ25vcmU7Cit7CisgIGV4ZWN1dGluZ19icmVha3BvaW50X2NvbW1hbmRzID0gMDsKK30KKworLyogRXhlY3V0ZSBhbGwgdGhlIGNvbW1hbmRzIGFzc29jaWF0ZWQgd2l0aCBhbGwgdGhlIGJyZWFrcG9pbnRzIGF0IHRoaXMKKyAgIGxvY2F0aW9uLiAgQW55IG9mIHRoZXNlIGNvbW1hbmRzIGNvdWxkIGNhdXNlIHRoZSBwcm9jZXNzIHRvIHByb2NlZWQKKyAgIGJleW9uZCB0aGlzIHBvaW50LCBldGMuICBXZSBsb29rIG91dCBmb3Igc3VjaCBjaGFuZ2VzIGJ5IGNoZWNraW5nCisgICB0aGUgZ2xvYmFsICJicmVha3BvaW50X3Byb2NlZWRlZCIgYWZ0ZXIgZWFjaCBjb21tYW5kLiAgKi8KKwordm9pZAorYnBzdGF0X2RvX2FjdGlvbnMgKGJzcCkKKyAgICAgYnBzdGF0ICpic3A7Cit7CisgIGJwc3RhdCBiczsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKyAgc3RydWN0IGNvbW1hbmRfbGluZSAqY21kOworCisgIC8qIEF2b2lkIGVuZGxlc3MgcmVjdXJzaW9uIGlmIGEgYHNvdXJjZScgY29tbWFuZCBpcyBjb250YWluZWQKKyAgICAgaW4gYnMtPmNvbW1hbmRzLiAgKi8KKyAgaWYgKGV4ZWN1dGluZ19icmVha3BvaW50X2NvbW1hbmRzKQorICAgIHJldHVybjsKKworICBleGVjdXRpbmdfYnJlYWtwb2ludF9jb21tYW5kcyA9IDE7CisgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoY2xlYW51cF9leGVjdXRpbmdfYnJlYWtwb2ludHMsIDApOworCit0b3A6CisgIC8qIE5vdGUgdGhhdCAoYXMgb2YgdGhpcyB3cml0aW5nKSwgb3VyIGNhbGxlcnMgYWxsIGFwcGVhciB0bworICAgICBiZSBwYXNzaW5nIHVzIHRoZSBhZGRyZXNzIG9mIGdsb2JhbCBzdG9wX2Jwc3RhdC4gIEFuZCwgaWYKKyAgICAgb3VyIGNhbGxzIHRvIGV4ZWN1dGVfY29udHJvbF9jb21tYW5kIGNhdXNlIHRoZSBpbmZlcmlvciB0bworICAgICBwcm9jZWVkLCB0aGF0IGdsb2JhbCAoYW5kIGhlbmNlLCAqYnNwKSB3aWxsIGNoYW5nZS4KKworICAgICBXZSBtdXN0IGJlIGNhcmVmdWwgdG8gbm90IHRvdWNoICpic3AgdW5sZXNzIHRoZSBpbmZlcmlvcgorICAgICBoYXMgbm90IHByb2NlZWRlZC4gKi8KKworICAvKiBUaGlzIHBvaW50ZXIgd2lsbCBpdGVyYXRlIG92ZXIgdGhlIGxpc3Qgb2YgYnBzdGF0J3MuICovCisgIGJzID0gKmJzcDsKKworICBicmVha3BvaW50X3Byb2NlZWRlZCA9IDA7CisgIGZvciAoOyBicyAhPSBOVUxMOyBicyA9IGJzLT5uZXh0KQorICAgIHsKKyAgICAgIGNtZCA9IGJzLT5jb21tYW5kczsKKyAgICAgIHdoaWxlIChjbWQgIT0gTlVMTCkKKwl7CisJICBleGVjdXRlX2NvbnRyb2xfY29tbWFuZCAoY21kKTsKKworCSAgaWYgKGJyZWFrcG9pbnRfcHJvY2VlZGVkKQorCSAgICBicmVhazsKKwkgIGVsc2UKKwkgICAgY21kID0gY21kLT5uZXh0OworCX0KKyAgICAgIGlmIChicmVha3BvaW50X3Byb2NlZWRlZCkKKwkvKiBUaGUgaW5mZXJpb3IgaXMgcHJvY2VlZGVkIGJ5IHRoZSBjb21tYW5kOyBib21iIG91dCBub3cuCisJICAgVGhlIGJwc3RhdCBjaGFpbiBoYXMgYmVlbiBibG93biBhd2F5IGJ5IHdhaXRfZm9yX2luZmVyaW9yLgorCSAgIEJ1dCBzaW5jZSBleGVjdXRpb24gaGFzIHN0b3BwZWQgYWdhaW4sIHRoZXJlIGlzIGEgbmV3IGJwc3RhdAorCSAgIHRvIGxvb2sgYXQsIHNvIHN0YXJ0IG92ZXIuICAqLworCWdvdG8gdG9wOworICAgICAgZWxzZQorCWJzLT5jb21tYW5kcyA9IE5VTEw7CisgICAgfQorCisgIGV4ZWN1dGluZ19icmVha3BvaW50X2NvbW1hbmRzID0gMDsKKyAgZGlzY2FyZF9jbGVhbnVwcyAob2xkX2NoYWluKTsKK30KKworLyogVGhpcyBpcyB0aGUgbm9ybWFsIHByaW50X2l0IGZ1bmN0aW9uIGZvciBhIGJwc3RhdC4gIEluIHRoZSBmdXR1cmUsCisgICBtdWNoIG9mIHRoaXMgbG9naWMgY291bGQgKHNob3VsZD8pIGJlIG1vdmVkIHRvIGJwc3RhdF9zdG9wX3N0YXR1cywKKyAgIGJ5IGhhdmluZyBpdCBzZXQgZGlmZmVyZW50IHByaW50X2l0IGZ1bmN0aW9ucy4KKworICAgQ3VycmVudCBzY2hlbWU6IFdoZW4gd2Ugc3RvcCwgYnBzdGF0X3ByaW50KCkgaXMgY2FsbGVkLgorICAgSXQgbG9vcHMgdGhyb3VnaCB0aGUgYnBzdGF0IGxpc3Qgb2YgdGhpbmdzIGNhdXNpbmcgdGhpcyBzdG9wLAorICAgY2FsbGluZyB0aGUgcHJpbnRfaXQgZnVuY3Rpb24gZm9yIGVhY2ggb25lLiBUaGUgZGVmYXVsdAorICAgcHJpbnRfaXQgZnVuY3Rpb24sIHVzZWQgZm9yIGJyZWFrcG9pbnRzLCBpcyBwcmludF9pdF9ub3JtYWwoKS4KKyAgIChBbHNvIHNlZSBwcmludF9pdF9ub29wKCkgYW5kIHByaW50X2l0X2RvbmUoKSkuCisgICAKKyAgIFJldHVybiB2YWx1ZXMgZnJvbSB0aGlzIHJvdXRpbmUgKHVzZWQgYnkgYnBzdGF0X3ByaW50KCkgdG8KKyAgIGRlY2lkZSB3aGF0IHRvIGRvKToKKyAgIDE6IE1lYW5zIHdlIHByaW50ZWQgc29tZXRoaW5nLCBhbmQgd2UgZG8gKm5vdCogZGVzaXJlIHRoYXQKKyAgICAgIHNvbWV0aGluZyB0byBiZSBmb2xsb3dlZCBieSBhIGxvY2F0aW9uLgorICAgMDogTWVhbnMgd2UgcHJpbnRlZCBzb21ldGhpbmcsIGFuZCB3ZSAqZG8qICBkZXNpcmUgdGhhdAorICAgICAgc29tZXRoaW5nIHRvIGJlIGZvbGxvd2VkIGJ5IGEgbG9jYXRpb24uCisgICAtMTogTWVhbnMgd2UgcHJpbnRlZCBub3RoaW5nLiAgKi8KKworc3RhdGljIGludAorcHJpbnRfaXRfbm9ybWFsIChicykKKyAgICAgYnBzdGF0IGJzOworeworICAvKiBicy0+YnJlYWtwb2ludF9hdCBjYW4gYmUgTlVMTCBpZiBpdCB3YXMgYSBtb21lbnRhcnkgYnJlYWtwb2ludAorICAgICB3aGljaCBoYXMgc2luY2UgYmVlbiBkZWxldGVkLiAgKi8KKyAgaWYgKGJzLT5icmVha3BvaW50X2F0ID09IE5VTEwKKyAgICAgIHx8IChicy0+YnJlYWtwb2ludF9hdC0+dHlwZSAhPSBicF9icmVha3BvaW50CisgICAgICAgICAgJiYgYnMtPmJyZWFrcG9pbnRfYXQtPnR5cGUgIT0gYnBfY2F0Y2hfbG9hZAorICAgICAgICAgICYmIGJzLT5icmVha3BvaW50X2F0LT50eXBlICE9IGJwX2NhdGNoX3VubG9hZAorICAgICAgICAgICYmIGJzLT5icmVha3BvaW50X2F0LT50eXBlICE9IGJwX2NhdGNoX2ZvcmsKKyAgICAgICAgICAmJiBicy0+YnJlYWtwb2ludF9hdC0+dHlwZSAhPSBicF9jYXRjaF92Zm9yaworICAgICAgICAgICYmIGJzLT5icmVha3BvaW50X2F0LT50eXBlICE9IGJwX2NhdGNoX2V4ZWMKKyAgICAgICAgICAmJiBicy0+YnJlYWtwb2ludF9hdC0+dHlwZSAhPSBicF9jYXRjaF9jYXRjaAorICAgICAgICAgICYmIGJzLT5icmVha3BvaW50X2F0LT50eXBlICE9IGJwX2NhdGNoX3Rocm93CisJICAmJiBicy0+YnJlYWtwb2ludF9hdC0+dHlwZSAhPSBicF9oYXJkd2FyZV9icmVha3BvaW50CisJICAmJiBicy0+YnJlYWtwb2ludF9hdC0+dHlwZSAhPSBicF93YXRjaHBvaW50CisJICAmJiBicy0+YnJlYWtwb2ludF9hdC0+dHlwZSAhPSBicF9yZWFkX3dhdGNocG9pbnQKKwkgICYmIGJzLT5icmVha3BvaW50X2F0LT50eXBlICE9IGJwX2FjY2Vzc193YXRjaHBvaW50CisJICAmJiBicy0+YnJlYWtwb2ludF9hdC0+dHlwZSAhPSBicF9oYXJkd2FyZV93YXRjaHBvaW50KSkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKGVwX2lzX3NobGliX2NhdGNocG9pbnQgKGJzLT5icmVha3BvaW50X2F0KSkKKyAgICB7CisgICAgICBhbm5vdGF0ZV9jYXRjaHBvaW50IChicy0+YnJlYWtwb2ludF9hdC0+bnVtYmVyKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuQ2F0Y2hwb2ludCAlZCAoIiwgYnMtPmJyZWFrcG9pbnRfYXQtPm51bWJlcik7CisgICAgICBpZiAoYnMtPmJyZWFrcG9pbnRfYXQtPnR5cGUgPT0gYnBfY2F0Y2hfbG9hZCkKKyAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgibG9hZGVkIik7CisgICAgICBlbHNlIGlmIChicy0+YnJlYWtwb2ludF9hdC0+dHlwZSA9PSBicF9jYXRjaF91bmxvYWQpCisgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoInVubG9hZGVkIik7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIgJXMpLCAiLCBicy0+YnJlYWtwb2ludF9hdC0+dHJpZ2dlcmVkX2RsbF9wYXRobmFtZSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UgaWYgKGJzLT5icmVha3BvaW50X2F0LT50eXBlID09IGJwX2NhdGNoX2ZvcmsgfHwKKyAgICAgIGJzLT5icmVha3BvaW50X2F0LT50eXBlID09IGJwX2NhdGNoX3Zmb3JrKQorICAgIHsKKyAgICAgIGFubm90YXRlX2NhdGNocG9pbnQgKGJzLT5icmVha3BvaW50X2F0LT5udW1iZXIpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5DYXRjaHBvaW50ICVkICgiLCBicy0+YnJlYWtwb2ludF9hdC0+bnVtYmVyKTsKKyAgICAgIGlmIChicy0+YnJlYWtwb2ludF9hdC0+dHlwZSA9PSBicF9jYXRjaF9mb3JrKQorICAgICAgICBwcmludGZfZmlsdGVyZWQgKCJmb3JrZWQiKTsKKyAgICAgIGVsc2UgaWYgKGJzLT5icmVha3BvaW50X2F0LT50eXBlID09IGJwX2NhdGNoX3Zmb3JrKQorICAgICAgICBwcmludGZfZmlsdGVyZWQgKCJ2Zm9ya2VkIik7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIgcHJvY2VzcyAlZCksICIsIGJzLT5icmVha3BvaW50X2F0LT5mb3JrZWRfaW5mZXJpb3JfcGlkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZSBpZiAoYnMtPmJyZWFrcG9pbnRfYXQtPnR5cGUgPT0gYnBfY2F0Y2hfZXhlYykKKyAgICB7CisgICAgICBhbm5vdGF0ZV9jYXRjaHBvaW50IChicy0+YnJlYWtwb2ludF9hdC0+bnVtYmVyKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuQ2F0Y2hwb2ludCAlZCAoZXhlYydkICVzKSwgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYnMtPmJyZWFrcG9pbnRfYXQtPm51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgYnMtPmJyZWFrcG9pbnRfYXQtPmV4ZWNfcGF0aG5hbWUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorIGVsc2UgaWYgKGJzLT5icmVha3BvaW50X2F0LT50eXBlID09IGJwX2NhdGNoX2NhdGNoKQorICAgIHsKKyAgICAgIGlmIChjdXJyZW50X2V4Y2VwdGlvbl9ldmVudCAmJiAoQ1VSUkVOVF9FWENFUFRJT05fS0lORCA9PSBFWF9FVkVOVF9DQVRDSCkpCisgICAgICAgIHsKKyAgICAgICAgICBhbm5vdGF0ZV9jYXRjaHBvaW50IChicy0+YnJlYWtwb2ludF9hdC0+bnVtYmVyKTsKKyAgICAgICAgICBwcmludGZfZmlsdGVyZWQgKCJcbkNhdGNocG9pbnQgJWQgKGV4Y2VwdGlvbiBjYXVnaHQpLCAiLCBicy0+YnJlYWtwb2ludF9hdC0+bnVtYmVyKTsKKyAgICAgICAgICBwcmludGZfZmlsdGVyZWQgKCJ0aHJvdyBsb2NhdGlvbiAiKTsKKyAgICAgICAgICBpZiAoQ1VSUkVOVF9FWENFUFRJT05fVEhST1dfUEMgJiYgQ1VSUkVOVF9FWENFUFRJT05fVEhST1dfTElORSkKKyAgICAgICAgICAgICAgICBwcmludGZfZmlsdGVyZWQgKCIlczolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJSRU5UX0VYQ0VQVElPTl9USFJPV19GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSUkVOVF9FWENFUFRJT05fVEhST1dfTElORSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgidW5rbm93biIpOworICAgICAgICAgIAorICAgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiwgY2F0Y2ggbG9jYXRpb24gIik7CisgICAgICAgICAgaWYgKENVUlJFTlRfRVhDRVBUSU9OX0NBVENIX1BDICAmJiBDVVJSRU5UX0VYQ0VQVElPTl9DQVRDSF9MSU5FKQorICAgICAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiJXM6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJSRU5UX0VYQ0VQVElPTl9DQVRDSF9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJSRU5UX0VYQ0VQVElPTl9DQVRDSF9MSU5FKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGZfZmlsdGVyZWQgKCJ1bmtub3duIik7CisgICAgICAgICAgCisgICAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgICAgICAgICByZXR1cm4gMTsgICAvKiBkb24ndCBib3RoZXIgdG8gcHJpbnQgbG9jYXRpb24gZnJhbWUgaW5mbyAqLyAKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIC0xOyAgLyogcmVhbGx5IHRocm93LCBzb21lIG90aGVyIGJwc3RhdCB3aWxsIGhhbmRsZSBpdCAqLworICAgICAgICB9CisgICAgfQorICBlbHNlIGlmIChicy0+YnJlYWtwb2ludF9hdC0+dHlwZSA9PSBicF9jYXRjaF90aHJvdykKKyAgICB7CisgICAgICBpZiAoY3VycmVudF9leGNlcHRpb25fZXZlbnQgJiYgKENVUlJFTlRfRVhDRVBUSU9OX0tJTkQgPT0gRVhfRVZFTlRfVEhST1cpKQorICAgICAgICB7CisgICAgICAgICAgYW5ub3RhdGVfY2F0Y2hwb2ludCAoYnMtPmJyZWFrcG9pbnRfYXQtPm51bWJlcik7CisgICAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5DYXRjaHBvaW50ICVkIChleGNlcHRpb24gdGhyb3duKSwgIiwgYnMtPmJyZWFrcG9pbnRfYXQtPm51bWJlcik7CisgICAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgidGhyb3cgbG9jYXRpb24gIik7CisgICAgICAgICAgaWYgKENVUlJFTlRfRVhDRVBUSU9OX1RIUk9XX1BDICYmIENVUlJFTlRfRVhDRVBUSU9OX1RIUk9XX0xJTkUpCisgICAgICAgICAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiJXM6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSUkVOVF9FWENFUFRJT05fVEhST1dfRklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUlJFTlRfRVhDRVBUSU9OX1RIUk9XX0xJTkUpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoInVua25vd24iKTsKKyAgICAgICAgICAKKyAgICAgICAgICBwcmludGZfZmlsdGVyZWQgKCIsIGNhdGNoIGxvY2F0aW9uICIpOworICAgICAgICAgIGlmIChDVVJSRU5UX0VYQ0VQVElPTl9DQVRDSF9QQyAgJiYgQ1VSUkVOVF9FWENFUFRJT05fQ0FUQ0hfTElORSkKKyAgICAgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiVzOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSUkVOVF9FWENFUFRJT05fQ0FUQ0hfRklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSUkVOVF9FWENFUFRJT05fQ0FUQ0hfTElORSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgidW5rbm93biIpOworICAgICAgICAgIAorICAgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgICAgICAgICAgcmV0dXJuIDE7ICAgLyogZG9uJ3QgYm90aGVyIHRvIHByaW50IGxvY2F0aW9uIGZyYW1lIGluZm8gKi8gCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiAtMTsgIC8qIHJlYWxseSBjYXRjaCwgc29tZSBvdGhlciBicHN0YXQgd2lsbGhhbmRsZSBpdCAqLworICAgICAgICB9CisgICAgfQorCisgIGVsc2UgaWYgKGJzLT5icmVha3BvaW50X2F0LT50eXBlID09IGJwX2JyZWFrcG9pbnQgfHwKKyAgICAgIGJzLT5icmVha3BvaW50X2F0LT50eXBlID09IGJwX2hhcmR3YXJlX2JyZWFrcG9pbnQpCisgICAgeworICAgICAgLyogSSB0aGluayB0aGUgdXNlciBwcm9iYWJseSBvbmx5IHdhbnRzIHRvIHNlZSBvbmUgYnJlYWtwb2ludAorCSBudW1iZXIsIG5vdCBhbGwgb2YgdGhlbS4gICovCisgICAgICBhbm5vdGF0ZV9icmVha3BvaW50IChicy0+YnJlYWtwb2ludF9hdC0+bnVtYmVyKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuQnJlYWtwb2ludCAlZCwgIiwgYnMtPmJyZWFrcG9pbnRfYXQtPm51bWJlcik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UgaWYgKChicy0+b2xkX3ZhbCAhPSBOVUxMKSAmJgorCShicy0+YnJlYWtwb2ludF9hdC0+dHlwZSA9PSBicF93YXRjaHBvaW50IHx8CisJIGJzLT5icmVha3BvaW50X2F0LT50eXBlID09IGJwX2FjY2Vzc193YXRjaHBvaW50IHx8CisJIGJzLT5icmVha3BvaW50X2F0LT50eXBlID09IGJwX2hhcmR3YXJlX3dhdGNocG9pbnQpKQorICAgIHsKKyAgICAgIGFubm90YXRlX3dhdGNocG9pbnQgKGJzLT5icmVha3BvaW50X2F0LT5udW1iZXIpOworICAgICAgbWVudGlvbiAoYnMtPmJyZWFrcG9pbnRfYXQpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5PbGQgdmFsdWUgPSAiKTsKKyAgICAgIHZhbHVlX3ByaW50IChicy0+b2xkX3ZhbCwgZ2RiX3N0ZG91dCwgMCwgVmFsX3ByZXR0eV9kZWZhdWx0KTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuTmV3IHZhbHVlID0gIik7CisgICAgICB2YWx1ZV9wcmludCAoYnMtPmJyZWFrcG9pbnRfYXQtPnZhbCwgZ2RiX3N0ZG91dCwgMCwKKwkJICAgVmFsX3ByZXR0eV9kZWZhdWx0KTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgICAgICB2YWx1ZV9mcmVlIChicy0+b2xkX3ZhbCk7CisgICAgICBicy0+b2xkX3ZhbCA9IE5VTEw7CisgICAgICAvKiBNb3JlIHRoYW4gb25lIHdhdGNocG9pbnQgbWF5IGhhdmUgYmVlbiB0cmlnZ2VyZWQuICAqLworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgZWxzZSBpZiAoYnMtPmJyZWFrcG9pbnRfYXQtPnR5cGUgPT0gYnBfYWNjZXNzX3dhdGNocG9pbnQgfHwKKwkgICBicy0+YnJlYWtwb2ludF9hdC0+dHlwZSA9PSBicF9yZWFkX3dhdGNocG9pbnQpCisgICAgeworICAgICAgbWVudGlvbiAoYnMtPmJyZWFrcG9pbnRfYXQpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5WYWx1ZSA9ICIpOworICAgICAgdmFsdWVfcHJpbnQgKGJzLT5icmVha3BvaW50X2F0LT52YWwsIGdkYl9zdGRvdXQsIDAsCisgICAgICAgICAgICAgICAgICAgVmFsX3ByZXR0eV9kZWZhdWx0KTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAvKiBXZSBjYW4ndCBkZWFsIHdpdGggaXQuICBNYXliZSBhbm90aGVyIG1lbWJlciBvZiB0aGUgYnBzdGF0IGNoYWluIGNhbi4gICovCisgIHJldHVybiAtMTsKK30KKworLyogUHJpbnQgYSBtZXNzYWdlIGluZGljYXRpbmcgd2hhdCBoYXBwZW5lZC4KKyAgIFRoaXMgaXMgY2FsbGVkIGZyb20gbm9ybWFsX3N0b3AoKS4KKyAgIFRoZSBpbnB1dCB0byB0aGlzIHJvdXRpbmUgaXMgdGhlIGhlYWQgb2YgdGhlIGJwc3RhdCBsaXN0IC0gYSBsaXN0CisgICBvZiB0aGUgZXZlbnRwb2ludHMgdGhhdCBjYXVzZWQgdGhpcyBzdG9wLgorICAgVGhpcyByb3V0aW5lIGNhbGxzIHRoZSAicHJpbnRfaXQiIHJvdXRpbmUocykgYXNzb2NpYXRlZAorICAgd2l0aCB0aGVzZSBldmVudHBvaW50cy4gVGhpcyB3aWxsIHByaW50IChmb3IgZXhhbXBsZSkKKyAgIHRoZSAiQnJlYWtwb2ludCBuLCIgcGFydCBvZiB0aGUgb3V0cHV0LgorICAgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIHJvdXRpbmUgaXMgb25lIG9mOgorCisgICAtMTogTWVhbnMgd2UgcHJpbnRlZCBub3RoaW5nCisgICAwOiBNZWFucyB3ZSBwcmludGVkIHNvbWV0aGluZywgYW5kIGV4cGVjdCBzdWJzZXF1ZW50CisgICAgICBjb2RlIHRvIHByaW50IHRoZSBsb2NhdGlvbi4gQW4gZXhhbXBsZSBpcyAKKyAgICAgICJCcmVha3BvaW50IDEsICIgd2hpY2ggc2hvdWxkIGJlIGZvbGxvd2VkIGJ5CisgICAgICB0aGUgbG9jYXRpb24uCisgICAxIDogTWVhbnMgd2UgcHJpbnRlZCBzb21ldGhpbmcsIGJ1dCB0aGVyZSBpcyBubyBuZWVkCisgICAgICAgdG8gYWxzbyBwcmludCB0aGUgbG9jYXRpb24gcGFydCBvZiB0aGUgbWVzc2FnZS4KKyAgICAgICBBbiBleGFtcGxlIGlzIHRoZSBjYXRjaC90aHJvdyBtZXNzYWdlcywgd2hpY2gKKyAgICAgICBkb24ndCByZXF1aXJlIGEgbG9jYXRpb24gYXBwZW5kZWQgdG8gdGhlIGVuZC4gICovIAorCitpbnQKK2Jwc3RhdF9wcmludCAoYnMpCisgICAgIGJwc3RhdCBiczsKK3sKKyAgaW50IHZhbDsKKyAgCisgIGlmIChicyA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICB2YWwgPSAoKmJzLT5wcmludF9pdCkgKGJzKTsKKyAgaWYgKHZhbCA+PSAwKQorICAgIHJldHVybiB2YWw7CisgIAorICAvKiBNYXliZSBhbm90aGVyIGJyZWFrcG9pbnQgaW4gdGhlIGNoYWluIGNhdXNlZCB1cyB0byBzdG9wLgorICAgICAoQ3VycmVudGx5IGFsbCB3YXRjaHBvaW50cyBnbyBvbiB0aGUgYnBzdGF0IHdoZXRoZXIgaGl0IG9yCisgICAgIG5vdC4gIFRoYXQgcHJvYmFibHkgY291bGQgKHNob3VsZCkgYmUgY2hhbmdlZCwgcHJvdmlkZWQgY2FyZSBpcyB0YWtlbgorICAgICB3aXRoIHJlc3BlY3QgdG8gYnBzdGF0X2V4cGxhaW5zX3NpZ25hbCkuICAqLworICBpZiAoYnMtPm5leHQpCisgICAgcmV0dXJuIGJwc3RhdF9wcmludCAoYnMtPm5leHQpOworCisgIC8qIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgY2hhaW4gd2l0aG91dCBwcmludGluZyBhbnl0aGluZy4gICovCisgIHJldHVybiAtMTsKK30KKworLyogRXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gRVhQIGFuZCByZXR1cm4gMSBpZiB2YWx1ZSBpcyB6ZXJvLgorICAgVGhpcyBpcyB1c2VkIGluc2lkZSBhIGNhdGNoX2Vycm9ycyB0byBldmFsdWF0ZSB0aGUgYnJlYWtwb2ludCBjb25kaXRpb24uIAorICAgVGhlIGFyZ3VtZW50IGlzIGEgInN0cnVjdCBleHByZXNzaW9uICoiIHRoYXQgaGFzIGJlZW4gY2FzdCB0byBjaGFyICogdG8gCisgICBtYWtlIGl0IHBhc3MgdGhyb3VnaCBjYXRjaF9lcnJvcnMuICAqLworCitzdGF0aWMgaW50CiticmVha3BvaW50X2NvbmRfZXZhbCAoZXhwKQorICAgICBQVFIgZXhwOworeworICB2YWx1ZV9wdHIgbWFyayA9IHZhbHVlX21hcmsgKCk7CisgIGludCBpID0gIXZhbHVlX3RydWUgKGV2YWx1YXRlX2V4cHJlc3Npb24gKChzdHJ1Y3QgZXhwcmVzc2lvbiAqKWV4cCkpOworICB2YWx1ZV9mcmVlX3RvX21hcmsgKG1hcmspOworICByZXR1cm4gaTsKK30KKworLyogQWxsb2NhdGUgYSBuZXcgYnBzdGF0IGFuZCBjaGFpbiBpdCB0byB0aGUgY3VycmVudCBvbmUuICAqLworCitzdGF0aWMgYnBzdGF0CiticHN0YXRfYWxsb2MgKGIsIGNicykKKyAgICAgcmVnaXN0ZXIgc3RydWN0IGJyZWFrcG9pbnQgKmI7CisgICAgIGJwc3RhdCBjYnM7CQkJLyogQ3VycmVudCAiYnMiIHZhbHVlICovCit7CisgIGJwc3RhdCBiczsKKworICBicyA9IChicHN0YXQpIHhtYWxsb2MgKHNpemVvZiAoKmJzKSk7CisgIGNicy0+bmV4dCA9IGJzOworICBicy0+YnJlYWtwb2ludF9hdCA9IGI7CisgIC8qIElmIHRoZSBjb25kaXRpb24gaXMgZmFsc2UsIGV0Yy4sIGRvbid0IGRvIHRoZSBjb21tYW5kcy4gICovCisgIGJzLT5jb21tYW5kcyA9IE5VTEw7CisgIGJzLT5vbGRfdmFsID0gTlVMTDsKKyAgYnMtPnByaW50X2l0ID0gcHJpbnRfaXRfbm9ybWFsOworICByZXR1cm4gYnM7Cit9CisMCisvKiBQb3NzaWJsZSByZXR1cm4gdmFsdWVzIGZvciB3YXRjaHBvaW50X2NoZWNrICh0aGlzIGNhbid0IGJlIGFuIGVudW0KKyAgIGJlY2F1c2Ugb2YgY2hlY2tfZXJyb3JzKS4gICovCisvKiBUaGUgd2F0Y2hwb2ludCBoYXMgYmVlbiBkZWxldGVkLiAgKi8KKyNkZWZpbmUgV1BfREVMRVRFRCAxCisvKiBUaGUgdmFsdWUgaGFzIGNoYW5nZWQuICAqLworI2RlZmluZSBXUF9WQUxVRV9DSEFOR0VEIDIKKy8qIFRoZSB2YWx1ZSBoYXMgbm90IGNoYW5nZWQuICAqLworI2RlZmluZSBXUF9WQUxVRV9OT1RfQ0hBTkdFRCAzCisKKyNkZWZpbmUgQlBfVEVNUEZMQUcgMQorI2RlZmluZSBCUF9IQVJEV0FSRUZMQUcgMgorCisvKiBDaGVjayB3YXRjaHBvaW50IGNvbmRpdGlvbi4gICovCisKK3N0YXRpYyBpbnQKK3dhdGNocG9pbnRfY2hlY2sgKHApCisgICAgIFBUUiBwOworeworICBicHN0YXQgYnMgPSAoYnBzdGF0KSBwOworICBzdHJ1Y3QgYnJlYWtwb2ludCAqYjsKKyAgc3RydWN0IGZyYW1lX2luZm8gKmZyOworICBpbnQgd2l0aGluX2N1cnJlbnRfc2NvcGU7CisKKyAgYiA9IGJzLT5icmVha3BvaW50X2F0OworCisgIGlmIChiLT5leHBfdmFsaWRfYmxvY2sgPT0gTlVMTCkKKyAgICB3aXRoaW5fY3VycmVudF9zY29wZSA9IDE7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGVyZSBpcyBubyBjdXJyZW50IGZyYW1lIGF0IHRoaXMgbW9tZW50LiAgSWYgd2UncmUgZ29pbmcgdG8gaGF2ZQorCSBhbnkgY2hhbmNlIG9mIGhhbmRsaW5nIHdhdGNocG9pbnRzIG9uIGxvY2FsIHZhcmlhYmxlcywgd2UnbGwgbmVlZAorCSB0aGUgZnJhbWUgY2hhaW4gKHNvIHdlIGNhbiBkZXRlcm1pbmUgaWYgd2UncmUgaW4gc2NvcGUpLiAgKi8KKyAgICAgIHJlaW5pdF9mcmFtZV9jYWNoZSgpOworICAgICAgZnIgPSBmaW5kX2ZyYW1lX2FkZHJfaW5fZnJhbWVfY2hhaW4gKGItPndhdGNocG9pbnRfZnJhbWUpOworICAgICAgd2l0aGluX2N1cnJlbnRfc2NvcGUgPSAoZnIgIT0gTlVMTCk7CisgICAgICBpZiAod2l0aGluX2N1cnJlbnRfc2NvcGUpCisJLyogSWYgd2UgZW5kIHVwIHN0b3BwaW5nLCB0aGUgY3VycmVudCBmcmFtZSB3aWxsIGdldCBzZWxlY3RlZAorCSAgIGluIG5vcm1hbF9zdG9wLiAgU28gdGhpcyBjYWxsIHRvIHNlbGVjdF9mcmFtZSB3b24ndCBhZmZlY3QKKwkgICB0aGUgdXNlci4gICovCisJc2VsZWN0X2ZyYW1lIChmciwgLTEpOworICAgIH0KKyAgICAgIAorICBpZiAod2l0aGluX2N1cnJlbnRfc2NvcGUpCisgICAgeworICAgICAgLyogV2UgdXNlIHZhbHVlX3ssZnJlZV90b199bWFyayBiZWNhdXNlIGl0IGNvdWxkIGJlIGEKKyAgICAgICAgICpsb25nKiB0aW1lIGJlZm9yZSB3ZSByZXR1cm4gdG8gdGhlIGNvbW1hbmQgbGV2ZWwgYW5kCisJIGNhbGwgZnJlZV9hbGxfdmFsdWVzLiAgV2UgY2FuJ3QgY2FsbCBmcmVlX2FsbF92YWx1ZXMgYmVjYXVzZQorCSB3ZSBtaWdodCBiZSBpbiB0aGUgbWlkZGxlIG9mIGV2YWx1YXRpbmcgYSBmdW5jdGlvbiBjYWxsLiAgKi8KKworICAgICAgdmFsdWVfcHRyIG1hcmsgPSB2YWx1ZV9tYXJrICgpOworICAgICAgdmFsdWVfcHRyIG5ld192YWwgPSBldmFsdWF0ZV9leHByZXNzaW9uIChicy0+YnJlYWtwb2ludF9hdC0+ZXhwKTsKKyAgICAgIGlmICghdmFsdWVfZXF1YWwgKGItPnZhbCwgbmV3X3ZhbCkpCisJeworCSAgcmVsZWFzZV92YWx1ZSAobmV3X3ZhbCk7CisJICB2YWx1ZV9mcmVlX3RvX21hcmsgKG1hcmspOworCSAgYnMtPm9sZF92YWwgPSBiLT52YWw7CisJICBiLT52YWwgPSBuZXdfdmFsOworCSAgLyogV2Ugd2lsbCBzdG9wIGhlcmUgKi8KKwkgIHJldHVybiBXUF9WQUxVRV9DSEFOR0VEOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBOb3RoaW5nIGNoYW5nZWQsIGRvbid0IGRvIGFueXRoaW5nLiAgKi8KKwkgIHZhbHVlX2ZyZWVfdG9fbWFyayAobWFyayk7CisJICAvKiBXZSB3b24ndCBzdG9wIGhlcmUgKi8KKwkgIHJldHVybiBXUF9WQUxVRV9OT1RfQ0hBTkdFRDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVGhpcyBzZWVtcyBsaWtlIHRoZSBvbmx5IGxvZ2ljYWwgdGhpbmcgdG8gZG8gYmVjYXVzZQorCSBpZiB3ZSB0ZW1wb3JhcmlseSBpZ25vcmVkIHRoZSB3YXRjaHBvaW50LCB0aGVuIHdoZW4KKwkgd2UgcmVlbnRlciB0aGUgYmxvY2sgaW4gd2hpY2ggaXQgaXMgdmFsaWQgaXQgY29udGFpbnMKKwkgZ2FyYmFnZSAoaW4gdGhlIGNhc2Ugb2YgYSBmdW5jdGlvbiwgaXQgbWF5IGhhdmUgdHdvCisJIGdhcmJhZ2UgdmFsdWVzLCBvbmUgYmVmb3JlIGFuZCBvbmUgYWZ0ZXIgdGhlIHByb2xvZ3VlKS4KKwkgU28gd2UgY2FuJ3QgZXZlbiBkZXRlY3QgdGhlIGZpcnN0IGFzc2lnbm1lbnQgdG8gaXQgYW5kCisJIHdhdGNoIGFmdGVyIHRoYXQgKHNpbmNlIHRoZSBnYXJiYWdlIG1heSBvciBtYXkgbm90IGVxdWFsCisJIHRoZSBmaXJzdCB2YWx1ZSBhc3NpZ25lZCkuICAqLworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXAorV2F0Y2hwb2ludCAlZCBkZWxldGVkIGJlY2F1c2UgdGhlIHByb2dyYW0gaGFzIGxlZnQgdGhlIGJsb2NrIGluXG5cCit3aGljaCBpdHMgZXhwcmVzc2lvbiBpcyB2YWxpZC5cbiIsIGJzLT5icmVha3BvaW50X2F0LT5udW1iZXIpOworICAgICAgaWYgKGItPnJlbGF0ZWRfYnJlYWtwb2ludCkKKwliLT5yZWxhdGVkX2JyZWFrcG9pbnQtPmRpc3Bvc2l0aW9uID0gZGVsX2F0X25leHRfc3RvcDsKKyAgICAgIGItPmRpc3Bvc2l0aW9uID0gZGVsX2F0X25leHRfc3RvcDsKKworICAgICAgcmV0dXJuIFdQX0RFTEVURUQ7CisgICAgfQorfQorCisvKiBUaGlzIGlzIHVzZWQgd2hlbiBldmVyeXRoaW5nIHdoaWNoIG5lZWRzIHRvIGJlIHByaW50ZWQgaGFzCisgICBhbHJlYWR5IGJlZW4gcHJpbnRlZC4gIEJ1dCB3ZSBzdGlsbCB3YW50IHRvIHByaW50IHRoZSBmcmFtZS4gICovCisKKy8qIEJhY2tncm91bmQ6IFdoZW4gd2Ugc3RvcCwgYnBzdGF0X3ByaW50KCkgaXMgY2FsbGVkLgorICAgSXQgbG9vcHMgdGhyb3VnaCB0aGUgYnBzdGF0IGxpc3Qgb2YgdGhpbmdzIGNhdXNpbmcgdGhpcyBzdG9wLAorICAgY2FsbGluZyB0aGUgcHJpbnRfaXQgZnVuY3Rpb24gZm9yIGVhY2ggb25lLiBUaGUgZGVmYXVsdAorICAgcHJpbnRfaXQgZnVuY3Rpb24sIHVzZWQgZm9yIGJyZWFrcG9pbnRzLCBpcyBwcmludF9pdF9ub3JtYWwoKS4KKyAgIEFsc28gc2VlIHByaW50X2l0X25vb3AoKSBhbmQgcHJpbnRfaXRfZG9uZSgpIGFyZSB0aGUgb3RoZXIgCisgICB0d28gcG9zc2liaWxpdGllcy4gU2VlIGNvbW1lbnRzIGluIGJwc3RhdF9wcmludCgpIGFuZAorICAgaW4gaGVhZGVyIG9mIHByaW50X2l0X25vcm1hbCgpIGZvciBtb3JlIGRldGFpbC4gICovCisKK3N0YXRpYyBpbnQKK3ByaW50X2l0X2RvbmUgKGJzKQorICAgICBicHN0YXQgYnM7Cit7CisgIHJldHVybiAwOworfQorCisvKiBUaGlzIGlzIHVzZWQgd2hlbiBub3RoaW5nIHNob3VsZCBiZSBwcmludGVkIGZvciB0aGlzIGJwc3RhdCBlbnRyeS4gICovCisvKiBCYWNrZ3JvdW5kOiBXaGVuIHdlIHN0b3AsIGJwc3RhdF9wcmludCgpIGlzIGNhbGxlZC4KKyAgIEl0IGxvb3BzIHRocm91Z2ggdGhlIGJwc3RhdCBsaXN0IG9mIHRoaW5ncyBjYXVzaW5nIHRoaXMgc3RvcCwKKyAgIGNhbGxpbmcgdGhlIHByaW50X2l0IGZ1bmN0aW9uIGZvciBlYWNoIG9uZS4gVGhlIGRlZmF1bHQKKyAgIHByaW50X2l0IGZ1bmN0aW9uLCB1c2VkIGZvciBicmVha3BvaW50cywgaXMgcHJpbnRfaXRfbm9ybWFsKCkuCisgICBBbHNvIHNlZSBwcmludF9pdF9ub29wKCkgYW5kIHByaW50X2l0X2RvbmUoKSBhcmUgdGhlIG90aGVyIAorICAgdHdvIHBvc3NpYmlsaXRpZXMuIFNlZSBjb21tZW50cyBpbiBicHN0YXRfcHJpbnQoKSBhbmQKKyAgIGluIGhlYWRlciBvZiBwcmludF9pdF9ub3JtYWwoKSBmb3IgbW9yZSBkZXRhaWwuICAqLworCitzdGF0aWMgaW50CitwcmludF9pdF9ub29wIChicykKKyAgICAgYnBzdGF0IGJzOworeworICByZXR1cm4gLTE7Cit9CisKKy8qIEdldCBhIGJwc3RhdCBhc3NvY2lhdGVkIHdpdGggaGF2aW5nIGp1c3Qgc3RvcHBlZCBhdCBhZGRyZXNzICpQQworICAgYW5kIGZyYW1lIGFkZHJlc3MgQ09SRV9BRERSRVNTLiAgVXBkYXRlICpQQyB0byBwb2ludCBhdCB0aGUKKyAgIGJyZWFrcG9pbnQgKGlmIHdlIGhpdCBhIGJyZWFrcG9pbnQpLiAgTk9UX0FfQlJFQUtQT0lOVCBpcyBub256ZXJvCisgICBpZiB0aGlzIGlzIGtub3duIHRvIG5vdCBiZSBhIHJlYWwgYnJlYWtwb2ludCAoaXQgY291bGQgc3RpbGwgYmUgYQorICAgd2F0Y2hwb2ludCwgdGhvdWdoKS4gICovCisKKy8qIERldGVybWluZSB3aGV0aGVyIHdlIHN0b3BwZWQgYXQgYSBicmVha3BvaW50LCBldGMsIG9yIHdoZXRoZXIgd2UKKyAgIGRvbid0IHVuZGVyc3RhbmQgdGhpcyBzdG9wLiAgUmVzdWx0IGlzIGEgY2hhaW4gb2YgYnBzdGF0J3Mgc3VjaCB0aGF0OgorCisJaWYgd2UgZG9uJ3QgdW5kZXJzdGFuZCB0aGUgc3RvcCwgdGhlIHJlc3VsdCBpcyBhIG51bGwgcG9pbnRlci4KKworCWlmIHdlIHVuZGVyc3RhbmQgd2h5IHdlIHN0b3BwZWQsIHRoZSByZXN1bHQgaXMgbm90IG51bGwuCisKKwlFYWNoIGVsZW1lbnQgb2YgdGhlIGNoYWluIHJlZmVycyB0byBhIHBhcnRpY3VsYXIgYnJlYWtwb2ludCBvcgorCXdhdGNocG9pbnQgYXQgd2hpY2ggd2UgaGF2ZSBzdG9wcGVkLiAgKFdlIG1heSBoYXZlIHN0b3BwZWQgZm9yCisJc2V2ZXJhbCByZWFzb25zIGNvbmN1cnJlbnRseS4pCisKKwlFYWNoIGVsZW1lbnQgb2YgdGhlIGNoYWluIGhhcyB2YWxpZCBuZXh0LCBicmVha3BvaW50X2F0LAorCWNvbW1hbmRzLCBGSVhNRT8/PyBmaWVsZHMuICAqLworCiticHN0YXQKK2Jwc3RhdF9zdG9wX3N0YXR1cyAocGMsIG5vdF9hX2JyZWFrcG9pbnQpCisgICAgIENPUkVfQUREUiAqcGM7CisgICAgIGludCBub3RfYV9icmVha3BvaW50OworeworICByZWdpc3RlciBzdHJ1Y3QgYnJlYWtwb2ludCAqYiwgKnRlbXA7CisgIENPUkVfQUREUiBicF9hZGRyOworICAvKiBUcnVlIGlmIHdlJ3ZlIGhpdCBhIGJyZWFrcG9pbnQgKGFzIG9wcG9zZWQgdG8gYSB3YXRjaHBvaW50KS4gICovCisgIGludCByZWFsX2JyZWFrcG9pbnQgPSAwOworICAvKiBSb290IG9mIHRoZSBjaGFpbiBvZiBicHN0YXQncyAqLworICBzdHJ1Y3QgYnBzdGF0cyByb290X2JzWzFdOworICAvKiBQb2ludGVyIHRvIHRoZSBsYXN0IHRoaW5nIGluIHRoZSBjaGFpbiBjdXJyZW50bHkuICAqLworICBicHN0YXQgYnMgPSByb290X2JzOworICBzdGF0aWMgY2hhciBtZXNzYWdlMVtdID0KKyAgICAgICAgICAgICJFcnJvciBldmFsdWF0aW5nIGV4cHJlc3Npb24gZm9yIHdhdGNocG9pbnQgJWRcbiI7CisgIGNoYXIgbWVzc2FnZVtzaXplb2YgKG1lc3NhZ2UxKSArIDMwIC8qIHNsb3AgKi9dOworCisgIC8qIEdldCB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgYnJlYWtwb2ludCB3b3VsZCBoYXZlIGJlZW4uICAqLworICBicF9hZGRyID0gKnBjIC0gREVDUl9QQ19BRlRFUl9CUkVBSzsKKworICBBTExfQlJFQUtQT0lOVFNfU0FGRSAoYiwgdGVtcCkKKyAgICB7CisgICAgICBpZiAoYi0+ZW5hYmxlID09IGRpc2FibGVkCisJICB8fCBiLT5lbmFibGUgPT0gc2hsaWJfZGlzYWJsZWQKKyAgICAgICAgICB8fCBiLT5lbmFibGUgPT0gY2FsbF9kaXNhYmxlZCkKKwljb250aW51ZTsKKworICAgICAgaWYgKGItPnR5cGUgIT0gYnBfd2F0Y2hwb2ludAorCSAgJiYgYi0+dHlwZSAhPSBicF9oYXJkd2FyZV93YXRjaHBvaW50CisgICAgICAgICAgJiYgYi0+dHlwZSAhPSBicF9yZWFkX3dhdGNocG9pbnQKKyAgICAgICAgICAmJiBiLT50eXBlICE9IGJwX2FjY2Vzc193YXRjaHBvaW50CisJICAmJiBiLT50eXBlICE9IGJwX2hhcmR3YXJlX2JyZWFrcG9pbnQKKyAgICAgICAgICAmJiBiLT50eXBlICE9IGJwX2NhdGNoX2ZvcmsKKyAgICAgICAgICAmJiBiLT50eXBlICE9IGJwX2NhdGNoX3Zmb3JrCisgICAgICAgICAgJiYgYi0+dHlwZSAhPSBicF9jYXRjaF9leGVjCisgICAgICAgICAgJiYgYi0+dHlwZSAhPSBicF9jYXRjaF9jYXRjaAorICAgICAgICAgICYmIGItPnR5cGUgIT0gYnBfY2F0Y2hfdGhyb3cpICAgICAgICAgLyogYSBub24td2F0Y2hwb2ludCBicCAqLworCWlmIChiLT5hZGRyZXNzICE9IGJwX2FkZHIgfHwJCS8qIGFkZHJlc3MgZG9lc24ndCBtYXRjaCBvciAqLworCSAgICAob3ZlcmxheV9kZWJ1Z2dpbmcgJiYJCS8qIG92ZXJsYXkgZG9lc24ndCBtYXRjaCAqLworCSAgICAgc2VjdGlvbl9pc19vdmVybGF5IChiLT5zZWN0aW9uKSAmJgorCSAgICAgIXNlY3Rpb25faXNfbWFwcGVkIChiLT5zZWN0aW9uKSkpCisJICBjb250aW51ZTsKKworICAgICAgaWYgKGItPnR5cGUgPT0gYnBfaGFyZHdhcmVfYnJlYWtwb2ludAorCSAgJiYgYi0+YWRkcmVzcyAhPSAoKnBjIC0gREVDUl9QQ19BRlRFUl9IV19CUkVBSykpCisJY29udGludWU7CisKKyAgICAgIGlmIChiLT50eXBlICE9IGJwX3dhdGNocG9pbnQKKwkgICYmIGItPnR5cGUgIT0gYnBfaGFyZHdhcmVfd2F0Y2hwb2ludAorCSAgJiYgYi0+dHlwZSAhPSBicF9yZWFkX3dhdGNocG9pbnQKKwkgICYmIGItPnR5cGUgIT0gYnBfYWNjZXNzX3dhdGNocG9pbnQKKwkgICYmIG5vdF9hX2JyZWFrcG9pbnQpCisJY29udGludWU7CisKKyAgICAgIC8qIElzIHRoaXMgYSBjYXRjaHBvaW50IG9mIGEgbG9hZCBvciB1bmxvYWQ/ICBJZiBzbywgZGlkIHdlCisgICAgICAgICBnZXQgYSBsb2FkIG9yIHVubG9hZCBvZiB0aGUgc3BlY2lmaWVkIGxpYnJhcnk/ICBJZiBub3QsCisgICAgICAgICBpZ25vcmUgaXQuICovCisgICAgICBpZiAoKGItPnR5cGUgPT0gYnBfY2F0Y2hfbG9hZCkKKyNpZiBkZWZpbmVkKFNPTElCX0hBVkVfTE9BRF9FVkVOVCkKKyAgICAgICAgICAmJiAoIVNPTElCX0hBVkVfTE9BRF9FVkVOVChpbmZlcmlvcl9waWQpCisgICAgICAgICAgICAgIHx8ICgoYi0+ZGxsX3BhdGhuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAmJiAoc3RyY21wIChiLT5kbGxfcGF0aG5hbWUsIFNPTElCX0xPQURFRF9MSUJSQVJZX1BBVEhOQU1FKGluZmVyaW9yX3BpZCkpICE9IDApKSkKKyNlbmRpZgorCQkgICkKKyAgICAgICAgY29udGludWU7CisgCisgICAgICBpZiAoKGItPnR5cGUgPT0gYnBfY2F0Y2hfdW5sb2FkKQorI2lmIGRlZmluZWQoU09MSUJfSEFWRV9VTkxPQURfRVZFTlQpCisgICAgICAgICAgJiYgKCFTT0xJQl9IQVZFX1VOTE9BRF9FVkVOVChpbmZlcmlvcl9waWQpCisgICAgICAgICAgICAgIHx8ICgoYi0+ZGxsX3BhdGhuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAmJiAoc3RyY21wIChiLT5kbGxfcGF0aG5hbWUsIFNPTElCX1VOTE9BREVEX0xJQlJBUllfUEFUSE5BTUUoaW5mZXJpb3JfcGlkKSkgIT0gMCkpKQorI2VuZGlmCisJICApCisgICAgICAgIGNvbnRpbnVlOworIAorICAgICAgaWYgKChiLT50eXBlID09IGJwX2NhdGNoX2ZvcmspCisgICAgICAgICAgJiYgISB0YXJnZXRfaGFzX2ZvcmtlZCAoaW5mZXJpb3JfcGlkLCAmYi0+Zm9ya2VkX2luZmVyaW9yX3BpZCkpCisgICAgICAgICAgY29udGludWU7CisgCisgICAgICBpZiAoKGItPnR5cGUgPT0gYnBfY2F0Y2hfdmZvcmspCisgICAgICAgICAgJiYgISB0YXJnZXRfaGFzX3Zmb3JrZWQgKGluZmVyaW9yX3BpZCwgJmItPmZvcmtlZF9pbmZlcmlvcl9waWQpKQorICAgICAgICAgIGNvbnRpbnVlOworIAorICAgICAgaWYgKChiLT50eXBlID09IGJwX2NhdGNoX2V4ZWMpCisJICAmJiAhIHRhcmdldF9oYXNfZXhlY2QgKGluZmVyaW9yX3BpZCwgJmItPmV4ZWNfcGF0aG5hbWUpKQorCWNvbnRpbnVlOworCisgICAgICBpZiAoZXBfaXNfZXhjZXB0aW9uX2NhdGNocG9pbnQgKGIpICYmCisgICAgICAgICAgIShjdXJyZW50X2V4Y2VwdGlvbl9ldmVudCA9IHRhcmdldF9nZXRfY3VycmVudF9leGNlcHRpb25fZXZlbnQgKCkpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLyogQ29tZSBoZXJlIGlmIGl0J3MgYSB3YXRjaHBvaW50LCBvciBpZiB0aGUgYnJlYWsgYWRkcmVzcyBtYXRjaGVzICovCisKKyAgICAgIGJzID0gYnBzdGF0X2FsbG9jIChiLCBicyk7CS8qIEFsbG9jIGEgYnBzdGF0IHRvIGV4cGxhaW4gc3RvcCAqLworCisgICAgICAvKiBXYXRjaHBvaW50cyBtYXkgY2hhbmdlIHRoaXMsIGlmIG5vdCBmb3VuZCB0byBoYXZlIHRyaWdnZXJlZC4gKi8KKyAgICAgIGJzLT5zdG9wID0gMTsKKyAgICAgIGJzLT5wcmludCA9IDE7CisKKyAgICAgIHNwcmludGYgKG1lc3NhZ2UsIG1lc3NhZ2UxLCBiLT5udW1iZXIpOworICAgICAgaWYgKGItPnR5cGUgPT0gYnBfd2F0Y2hwb2ludCB8fCBiLT50eXBlID09IGJwX2hhcmR3YXJlX3dhdGNocG9pbnQpCisJeworCSAgc3dpdGNoIChjYXRjaF9lcnJvcnMgKHdhdGNocG9pbnRfY2hlY2ssIGJzLCBtZXNzYWdlLCBSRVRVUk5fTUFTS19BTEwpKQorCSAgICB7CisJICAgIGNhc2UgV1BfREVMRVRFRDoKKwkgICAgICAvKiBXZSd2ZSBhbHJlYWR5IHByaW50ZWQgd2hhdCBuZWVkcyB0byBiZSBwcmludGVkLiAgKi8KKwkgICAgICBicy0+cHJpbnRfaXQgPSBwcmludF9pdF9kb25lOworCSAgICAgIC8qIFN0b3AuICAqLworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFdQX1ZBTFVFX0NIQU5HRUQ6CisJICAgICAgLyogU3RvcC4gICovCisJICAgICAgKysoYi0+aGl0X2NvdW50KTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBXUF9WQUxVRV9OT1RfQ0hBTkdFRDoKKwkgICAgICAvKiBEb24ndCBzdG9wLiAgKi8KKwkgICAgICBicy0+cHJpbnRfaXQgPSBwcmludF9pdF9ub29wOworCSAgICAgIGJzLT5zdG9wID0gMDsKKwkgICAgICAvKiBEb24ndCBjb25zaWRlciB0aGlzIGEgaGl0LiAgKi8KKwkgICAgICAtLShiLT5oaXRfY291bnQpOworCSAgICAgIGNvbnRpbnVlOworCSAgICBkZWZhdWx0OgorCSAgICAgIC8qIENhbid0IGhhcHBlbi4gICovCisJICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKwkgICAgY2FzZSAwOgorCSAgICAgIC8qIEVycm9yIGZyb20gY2F0Y2hfZXJyb3JzLiAgKi8KKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCJXYXRjaHBvaW50ICVkIGRlbGV0ZWQuXG4iLCBiLT5udW1iZXIpOworCSAgICAgIGlmIChiLT5yZWxhdGVkX2JyZWFrcG9pbnQpCisJCWItPnJlbGF0ZWRfYnJlYWtwb2ludC0+ZGlzcG9zaXRpb24gPSBkZWxfYXRfbmV4dF9zdG9wOworCSAgICAgIGItPmRpc3Bvc2l0aW9uID0gZGVsX2F0X25leHRfc3RvcDsKKwkgICAgICAvKiBXZSd2ZSBhbHJlYWR5IHByaW50ZWQgd2hhdCBuZWVkcyB0byBiZSBwcmludGVkLiAgKi8KKwkgICAgICBicy0+cHJpbnRfaXQgPSBwcmludF9pdF9kb25lOworCisJICAgICAgLyogU3RvcC4gICovCisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChiLT50eXBlID09IGJwX3JlYWRfd2F0Y2hwb2ludCB8fCBiLT50eXBlID09IGJwX2FjY2Vzc193YXRjaHBvaW50KQorICAgICAgICB7CisJICBDT1JFX0FERFIgYWRkcjsKKwkgIHZhbHVlX3B0ciB2OworICAgICAgICAgIGludCBmb3VuZCA9IDA7CisKKwkgIGFkZHIgPSB0YXJnZXRfc3RvcHBlZF9kYXRhX2FkZHJlc3MoKTsKKwkgIGlmIChhZGRyID09IDApIGNvbnRpbnVlOworICAgICAgICAgIGZvciAodiA9IGItPnZhbF9jaGFpbjsgdjsgdiA9IHYtPm5leHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICh2LT5sdmFsID09IGx2YWxfbWVtb3J5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIENPUkVfQUREUiB2YWRkcjsKKworICAgICAgICAgICAgICAgICAgdmFkZHIgPSBWQUxVRV9BRERSRVNTICh2KSArIFZBTFVFX09GRlNFVCAodik7CisJICAgICAgICAgIGlmIChhZGRyID09IHZhZGRyKQorCSAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJICBpZiAoZm91bmQpIAorCSAgICBzd2l0Y2ggKGNhdGNoX2Vycm9ycyAod2F0Y2hwb2ludF9jaGVjaywgYnMsIG1lc3NhZ2UsIFJFVFVSTl9NQVNLX0FMTCkpCisgICAJICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgV1BfREVMRVRFRDoKKyAgICAgICAgICAgICAgICAgIC8qIFdlJ3ZlIGFscmVhZHkgcHJpbnRlZCB3aGF0IG5lZWRzIHRvIGJlIHByaW50ZWQuICAqLworICAgICAgICAgICAgICAgICAgYnMtPnByaW50X2l0ID0gcHJpbnRfaXRfZG9uZTsKKyAgICAgICAgICAgICAgICAgIC8qIFN0b3AuICAqLworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBXUF9WQUxVRV9DSEFOR0VEOgorICAgICAgICAgICAgICAgIGNhc2UgV1BfVkFMVUVfTk9UX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAvKiBTdG9wLiAgKi8KKwkJICArKyhiLT5oaXRfY291bnQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIC8qIENhbid0IGhhcHBlbi4gICovCisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgLyogRXJyb3IgZnJvbSBjYXRjaF9lcnJvcnMuICAqLworICAgICAgICAgICAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiV2F0Y2hwb2ludCAlZCBkZWxldGVkLlxuIiwgYi0+bnVtYmVyKTsKKwkJICBpZiAoYi0+cmVsYXRlZF9icmVha3BvaW50KQorCQkgICAgYi0+cmVsYXRlZF9icmVha3BvaW50LT5kaXNwb3NpdGlvbiA9IGRlbF9hdF9uZXh0X3N0b3A7CisJCSAgYi0+ZGlzcG9zaXRpb24gPSBkZWxfYXRfbmV4dF9zdG9wOworICAgICAgICAgICAgICAgICAgLyogV2UndmUgYWxyZWFkeSBwcmludGVkIHdoYXQgbmVlZHMgdG8gYmUgcHJpbnRlZC4gICovCisgICAgICAgICAgICAgICAgICBicy0+cHJpbnRfaXQgPSBwcmludF9pdF9kb25lOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisJICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgLyogQnkgZGVmaW5pdGlvbiwgYW4gZW5jb3VudGVyZWQgYnJlYWtwb2ludCBpcyBhIHRyaWdnZXJlZAorICAgICAgICAgICAgIGJyZWFrcG9pbnQuICovCisgICAgICAgICAgKysoYi0+aGl0X2NvdW50KTsKKworCSAgcmVhbF9icmVha3BvaW50ID0gMTsKKyAgICAgICAgfQorCisgICAgICBpZiAoYi0+ZnJhbWUgJiYgYi0+ZnJhbWUgIT0gKGdldF9jdXJyZW50X2ZyYW1lICgpKS0+ZnJhbWUgJiYKKyAgICAgICAgICAoYi0+dHlwZSA9PSBicF9zdGVwX3Jlc3VtZSAmJiAKKyAgICAgICAgICAgKElOTkVSX1RIQU4gKGdldF9jdXJyZW50X2ZyYW1lICgpLT5mcmFtZSwgYi0+ZnJhbWUpKSkpCisJYnMtPnN0b3AgPSAwOworICAgICAgZWxzZQorCXsKKwkgIGludCB2YWx1ZV9pc196ZXJvID0gMDsKKworCSAgaWYgKGItPmNvbmQpCisJICAgIHsKKwkgICAgICAvKiBOZWVkIHRvIHNlbGVjdCB0aGUgZnJhbWUsIHdpdGggYWxsIHRoYXQgaW1wbGllcworCQkgc28gdGhhdCB0aGUgY29uZGl0aW9ucyB3aWxsIGhhdmUgdGhlIHJpZ2h0IGNvbnRleHQuICAqLworCSAgICAgIHNlbGVjdF9mcmFtZSAoZ2V0X2N1cnJlbnRfZnJhbWUgKCksIDApOworCSAgICAgIHZhbHVlX2lzX3plcm8KKwkJPSBjYXRjaF9lcnJvcnMgKGJyZWFrcG9pbnRfY29uZF9ldmFsLCAoYi0+Y29uZCksCisJCQkJIkVycm9yIGluIHRlc3RpbmcgYnJlYWtwb2ludCBjb25kaXRpb246XG4iLAorCQkJCVJFVFVSTl9NQVNLX0FMTCk7CisJCQkJLyogRklYTUUtc29tZWRheSwgc2hvdWxkIGdpdmUgYnJlYWtwb2ludCAjICovCisJICAgICAgZnJlZV9hbGxfdmFsdWVzICgpOworCSAgICB9CisJICBpZiAoYi0+Y29uZCAmJiB2YWx1ZV9pc196ZXJvKQorCSAgICB7CisJICAgICAgYnMtPnN0b3AgPSAwOworCSAgICAgIC8qIERvbid0IGNvbnNpZGVyIHRoaXMgYSBoaXQuICAqLworCSAgICAgIC0tKGItPmhpdF9jb3VudCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKGItPmlnbm9yZV9jb3VudCA+IDApCisJICAgIHsKKwkgICAgICBiLT5pZ25vcmVfY291bnQtLTsKKwkgICAgICBicy0+c3RvcCA9IDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFdlIHdpbGwgc3RvcCBoZXJlICovCisJICAgICAgaWYgKGItPmRpc3Bvc2l0aW9uID09IGRpc2FibGUpCisJCWItPmVuYWJsZSA9IGRpc2FibGVkOworCSAgICAgIGJzLT5jb21tYW5kcyA9IGItPmNvbW1hbmRzOworCSAgICAgIGlmIChiLT5zaWxlbnQpCisJCWJzLT5wcmludCA9IDA7CisJICAgICAgaWYgKGJzLT5jb21tYW5kcyAmJgorCQkgIChTVFJFUSAoInNpbGVudCIsIGJzLT5jb21tYW5kcy0+bGluZSkgfHwKKwkJICAgKHhkYl9jb21tYW5kcyAmJiBTVFJFUSAoIlEiLCBicy0+Y29tbWFuZHMtPmxpbmUpKSkpCisJCXsKKwkJICBicy0+Y29tbWFuZHMgPSBicy0+Y29tbWFuZHMtPm5leHQ7CisJCSAgYnMtPnByaW50ID0gMDsKKwkJfQorCSAgICB9CisJfQorICAgICAgLyogUHJpbnQgbm90aGluZyBmb3IgdGhpcyBlbnRyeSBpZiB3ZSBkb250IHN0b3Agb3IgaWYgd2UgZG9udCBwcmludC4gICovCisgICAgICBpZiAoYnMtPnN0b3AgPT0gMCB8fCBicy0+cHJpbnQgPT0gMCkKKwlicy0+cHJpbnRfaXQgPSBwcmludF9pdF9ub29wOworICAgIH0KKworICBicy0+bmV4dCA9IE5VTEw7CQkvKiBUZXJtaW5hdGUgdGhlIGNoYWluICovCisgIGJzID0gcm9vdF9icy0+bmV4dDsJCS8qIFJlLWdyYWIgdGhlIGhlYWQgb2YgdGhlIGNoYWluICovCisKKyAgaWYgKHJlYWxfYnJlYWtwb2ludCAmJiBicykKKyAgICB7CisgICAgICBpZiAoYnMtPmJyZWFrcG9pbnRfYXQtPnR5cGUgPT0gYnBfaGFyZHdhcmVfYnJlYWtwb2ludCkgCisJeworCSAgaWYgKERFQ1JfUENfQUZURVJfSFdfQlJFQUsgIT0gMCkgCisJICAgIHsKKwkgICAgICAqcGMgPSAqcGMgLSBERUNSX1BDX0FGVEVSX0hXX0JSRUFLOworCSAgICAgIHdyaXRlX3BjICgqcGMpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChERUNSX1BDX0FGVEVSX0JSRUFLICE9IDAgfHwgbXVzdF9zaGlmdF9pbnN0X3JlZ3MpCisJICAgIHsKKwkgICAgICAqcGMgPSBicF9hZGRyOworI2lmIGRlZmluZWQgKFNISUZUX0lOU1RfUkVHUykKKwkgICAgICBTSElGVF9JTlNUX1JFR1MoKTsKKyNlbHNlIC8qIE5vIFNISUZUX0lOU1RfUkVHUy4gICovCisJICAgICAgd3JpdGVfcGMgKGJwX2FkZHIpOworI2VuZGlmIC8qIE5vIFNISUZUX0lOU1RfUkVHUy4gICovCisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIFRoZSB2YWx1ZSBvZiBhIGhhcmR3YXJlIHdhdGNocG9pbnQgaGFzbid0IGNoYW5nZWQsIGJ1dCB0aGUKKyAgICAgaW50ZXJtZWRpYXRlIG1lbW9yeSBsb2NhdGlvbnMgd2UgYXJlIHdhdGNoaW5nIG1heSBoYXZlLiAgKi8KKyAgaWYgKGJzICYmICEgYnMtPnN0b3AgJiYKKyAgICAgIChicy0+YnJlYWtwb2ludF9hdC0+dHlwZSA9PSBicF9oYXJkd2FyZV93YXRjaHBvaW50IHx8CisgICAgICAgYnMtPmJyZWFrcG9pbnRfYXQtPnR5cGUgPT0gYnBfcmVhZF93YXRjaHBvaW50IHx8CisgICAgICAgYnMtPmJyZWFrcG9pbnRfYXQtPnR5cGUgPT0gYnBfYWNjZXNzX3dhdGNocG9pbnQpKQorICAgIHsKKyAgICAgIHJlbW92ZV9icmVha3BvaW50cyAoKTsKKyAgICAgIGluc2VydF9icmVha3BvaW50cyAoKTsKKyAgICB9CisgIHJldHVybiBiczsKK30KKwwKKy8qIFRlbGwgd2hhdCB0byBkbyBhYm91dCB0aGlzIGJwc3RhdC4gICovCitzdHJ1Y3QgYnBzdGF0X3doYXQKK2Jwc3RhdF93aGF0IChicykKKyAgICAgYnBzdGF0IGJzOworeworICAvKiBDbGFzc2lmeSBlYWNoIGJwc3RhdCBhcyBvbmUgb2YgdGhlIGZvbGxvd2luZy4gICovCisgIGVudW0gY2xhc3MgeworICAgIC8qIFRoaXMgYnBzdGF0IGVsZW1lbnQgaGFzIG5vIGVmZmVjdCBvbiB0aGUgbWFpbl9hY3Rpb24uICAqLworICAgIG5vX2VmZmVjdCA9IDAsCisKKyAgICAvKiBUaGVyZSB3YXMgYSB3YXRjaHBvaW50LCBzdG9wIGJ1dCBkb24ndCBwcmludC4gICovCisgICAgd3Bfc2lsZW50LAorCisgICAgLyogVGhlcmUgd2FzIGEgd2F0Y2hwb2ludCwgc3RvcCBhbmQgcHJpbnQuICAqLworICAgIHdwX25vaXN5LAorCisgICAgLyogVGhlcmUgd2FzIGEgYnJlYWtwb2ludCBidXQgd2UncmUgbm90IHN0b3BwaW5nLiAgKi8KKyAgICBicF9ub3N0b3AsCisKKyAgICAvKiBUaGVyZSB3YXMgYSBicmVha3BvaW50LCBzdG9wIGJ1dCBkb24ndCBwcmludC4gICovCisgICAgYnBfc2lsZW50LAorCisgICAgLyogVGhlcmUgd2FzIGEgYnJlYWtwb2ludCwgc3RvcCBhbmQgcHJpbnQuICAqLworICAgIGJwX25vaXN5LAorCisgICAgLyogV2UgaGl0IHRoZSBsb25nam1wIGJyZWFrcG9pbnQuICAqLworICAgIGxvbmdfanVtcCwKKworICAgIC8qIFdlIGhpdCB0aGUgbG9uZ2ptcF9yZXN1bWUgYnJlYWtwb2ludC4gICovCisgICAgbG9uZ19yZXN1bWUsCisKKyAgICAvKiBXZSBoaXQgdGhlIHN0ZXBfcmVzdW1lIGJyZWFrcG9pbnQuICAqLworICAgIHN0ZXBfcmVzdW1lLAorCisgICAgLyogV2UgaGl0IHRoZSB0aHJvdWdoX3NpZ3RyYW1wIGJyZWFrcG9pbnQuICAqLworICAgIHRocm91Z2hfc2lnLAorCisgICAgLyogV2UgaGl0IHRoZSBzaGFyZWQgbGlicmFyeSBldmVudCBicmVha3BvaW50LiAgKi8KKyAgICBzaGxpYl9ldmVudCwKKworICAgIC8qIFdlIGNhdWdodCBhIHNoYXJlZCBsaWJyYXJ5IGV2ZW50LiAgKi8KKyAgICBjYXRjaF9zaGxpYl9ldmVudCwKKyAKKyAgICAvKiBUaGlzIGlzIGp1c3QgdXNlZCB0byBjb3VudCBob3cgbWFueSBlbnVtcyB0aGVyZSBhcmUuICAqLworICAgIGNsYXNzX2xhc3QKKyAgICB9OworCisgIC8qIEhlcmUgaXMgdGhlIHRhYmxlIHdoaWNoIGRyaXZlcyB0aGlzIHJvdXRpbmUuICBTbyB0aGF0IHdlIGNhbgorICAgICBmb3JtYXQgaXQgcHJldHR5LCB3ZSBkZWZpbmUgc29tZSBhYmJyZXZpYXRpb25zIGZvciB0aGUKKyAgICAgZW51bSBicHN0YXRfd2hhdCBjb2Rlcy4gICovCisjZGVmaW5lIGtjIEJQU1RBVF9XSEFUX0tFRVBfQ0hFQ0tJTkcKKyNkZWZpbmUgc3MgQlBTVEFUX1dIQVRfU1RPUF9TSUxFTlQKKyNkZWZpbmUgc24gQlBTVEFUX1dIQVRfU1RPUF9OT0lTWQorI2RlZmluZSBzZ2wgQlBTVEFUX1dIQVRfU0lOR0xFCisjZGVmaW5lIHNsciBCUFNUQVRfV0hBVF9TRVRfTE9OR0pNUF9SRVNVTUUKKyNkZWZpbmUgY2xyIEJQU1RBVF9XSEFUX0NMRUFSX0xPTkdKTVBfUkVTVU1FCisjZGVmaW5lIGNscnMgQlBTVEFUX1dIQVRfQ0xFQVJfTE9OR0pNUF9SRVNVTUVfU0lOR0xFCisjZGVmaW5lIHNyIEJQU1RBVF9XSEFUX1NURVBfUkVTVU1FCisjZGVmaW5lIHRzIEJQU1RBVF9XSEFUX1RIUk9VR0hfU0lHVFJBTVAKKyNkZWZpbmUgc2hsIEJQU1RBVF9XSEFUX0NIRUNLX1NITElCUworI2RlZmluZSBzaGxyIEJQU1RBVF9XSEFUX0NIRUNLX1NITElCU19SRVNVTUVfRlJPTV9IT09LCisKKy8qICJDYW4ndCBoYXBwZW4uIiAgTWlnaHQgd2FudCB0byBwcmludCBhbiBlcnJvciBtZXNzYWdlLgorICAgYWJvcnQoKSBpcyBub3Qgb3V0IG9mIHRoZSBxdWVzdGlvbiwgYnV0IGNoYW5jZXMgYXJlIEdEQiBpcyBqdXN0CisgICBhIGJpdCBjb25mdXNlZCwgbm90IHVudXNhYmxlLiAgKi8KKyNkZWZpbmUgZXJyIEJQU1RBVF9XSEFUX1NUT1BfTk9JU1kKKworICAvKiBHaXZlbiBhbiBvbGQgYWN0aW9uIGFuZCBhIGNsYXNzLCBjb21lIHVwIHdpdGggYSBuZXcgYWN0aW9uLiAgKi8KKyAgLyogT25lIGludGVyZXN0aW5nIHByb3BlcnR5IG9mIHRoaXMgdGFibGUgaXMgdGhhdCB3cF9zaWxlbnQgaXMgdGhlIHNhbWUKKyAgICAgYXMgYnBfc2lsZW50IGFuZCB3cF9ub2lzeSBpcyB0aGUgc2FtZSBhcyBicF9ub2lzeS4gIFRoYXQgaXMgYmVjYXVzZQorICAgICBhZnRlciBzdG9wcGluZywgdGhlIGNoZWNrIGZvciB3aGV0aGVyIHRvIHN0ZXAgb3ZlciBhIGJyZWFrcG9pbnQKKyAgICAgKEJQU1RBVF9XSEFUX1NJTkdMRSB0eXBlIHN0dWZmKSBpcyBoYW5kbGVkIGluIHByb2NlZWQoKSB3aXRob3V0CisgICAgIHJlZmVyZW5jZSB0byBob3cgd2Ugc3RvcHBlZC4gIFdlIHJldGFpbiBzZXBhcmF0ZSB3cF9zaWxlbnQgYW5kIGJwX3NpbGVudAorICAgICBjb2RlcyBpbiBjYXNlIHdlIHdhbnQgdG8gY2hhbmdlIHRoYXQgc29tZWRheS4gICovCisKKyAgLyogc3RlcF9yZXN1bWUgZW50cmllczogYSBzdGVwIHJlc3VtZSBicmVha3BvaW50IG92ZXJyaWRlcyBhbm90aGVyCisgICAgIGJyZWFrcG9pbnQgb2Ygc2lnbmFsIGhhbmRsaW5nIChzZWUgY29tbWVudCBpbiB3YWl0X2Zvcl9pbmZlcmlvcgorICAgICBhdCBmaXJzdCBJTl9TSUdUUkFNUCB3aGVyZSB3ZSBzZXQgdGhlIHN0ZXBfcmVzdW1lIGJyZWFrcG9pbnQpLiAgKi8KKyAgLyogV2UgaGFuZGxlIHRoZSB0aHJvdWdoX3NpZ3RyYW1wX2JyZWFrcG9pbnQgdGhlIHNhbWUgd2F5OyBoYXZpbmcgYm90aAorICAgICBvbmUgb2YgdGhvc2UgYW5kIGEgc3RlcF9yZXN1bWVfYnJlYWtwb2ludCBpcyBwcm9iYWJseSB2ZXJ5IHJhcmUgKD8pLiAgKi8KKworICBzdGF0aWMgY29uc3QgZW51bSBicHN0YXRfd2hhdF9tYWluX2FjdGlvbgorICAgIHRhYmxlWyhpbnQpY2xhc3NfbGFzdF1bKGludClCUFNUQVRfV0hBVF9MQVNUXSA9CisgICAgICB7CisJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQgYWN0aW9uICovCisgICAgICAgIC8qICAgICAgIGtjICAgIHNzICAgIHNuICAgIHNnbCAgICBzbHIgICBjbHIgICAgY2xycyAgIHNyICAgIHRzICAgc2hsICAgc2hscgorICAgICAgICAgKi8KKy8qbm9fZWZmZWN0Ki8gICB7a2MsICAgc3MsICAgc24sICAgc2dsLCAgIHNsciwgIGNsciwgICBjbHJzLCAgc3IsICAgdHMsICBzaGwsICBzaGxyfSwKKy8qd3Bfc2lsZW50Ki8gICB7c3MsICAgc3MsICAgc24sICAgc3MsICAgIHNzLCAgIHNzLCAgICBzcywgICAgc3IsICAgdHMsICBzaGwsICBzaGxyfSwKKy8qd3Bfbm9pc3kqLyAgICB7c24sICAgc24sICAgc24sICAgc24sICAgIHNuLCAgIHNuLCAgICBzbiwgICAgc3IsICAgdHMsICBzaGwsICBzaGxyfSwKKy8qYnBfbm9zdG9wKi8gICB7c2dsLCAgc3MsICAgc24sICAgc2dsLCAgIHNsciwgIGNscnMsICBjbHJzLCAgc3IsICAgdHMsICBzaGwsICBzaGxyfSwKKy8qYnBfc2lsZW50Ki8gICB7c3MsICAgc3MsICAgc24sICAgc3MsICAgIHNzLCAgIHNzLCAgICBzcywgICAgc3IsICAgdHMsICBzaGwsICBzaGxyfSwKKy8qYnBfbm9pc3kqLyAgICB7c24sICAgc24sICAgc24sICAgc24sICAgIHNuLCAgIHNuLCAgICBzbiwgICAgc3IsICAgdHMsICBzaGwsICBzaGxyfSwKKy8qbG9uZ19qdW1wKi8gICB7c2xyLCAgc3MsICAgc24sICAgc2xyLCAgIGVyciwgIGVyciwgICBlcnIsICAgc3IsICAgdHMsICBzaGwsICBzaGxyfSwKKy8qbG9uZ19yZXN1bWUqLyB7Y2xyLCAgc3MsICAgc24sICAgY2xycywgIGVyciwgIGVyciwgICBlcnIsICAgc3IsICAgdHMsICBzaGwsICBzaGxyfSwKKy8qc3RlcF9yZXN1bWUqLyB7c3IsICAgc3IsICAgc3IsICAgc3IsICAgIHNyLCAgIHNyLCAgICBzciwgICAgc3IsICAgdHMsICBzaGwsICBzaGxyfSwKKy8qdGhyb3VnaF9zaWcqLyB7dHMsICAgdHMsICAgdHMsICAgdHMsICAgIHRzLCAgIHRzLCAgICB0cywgICAgdHMsICAgdHMsICBzaGwsICBzaGxyfSwKKy8qc2hsaWIqLyAgICAgICB7c2hsLCAgc2hsLCAgc2hsLCAgc2hsLCAgIHNobCwgIHNobCwgICBzaGwsICAgc2hsLCAgdHMsICBzaGwsICBzaGxyfSwKKy8qY2F0Y2hfc2hsaWIqLyB7c2hsciwgc2hsciwgc2hsciwgc2hsciwgIHNobHIsIHNobHIsICBzaGxyLCAgc2hsciwgdHMsICBzaGxyLCBzaGxyfQorICAgICAgICAgICAgICB9OworCisjdW5kZWYga2MKKyN1bmRlZiBzcworI3VuZGVmIHNuCisjdW5kZWYgc2dsCisjdW5kZWYgc2xyCisjdW5kZWYgY2xyCisjdW5kZWYgY2xycworI3VuZGVmIGVycgorI3VuZGVmIHNyCisjdW5kZWYgdHMKKyN1bmRlZiBzaGwKKyN1bmRlZiBzaGxyCisgIGVudW0gYnBzdGF0X3doYXRfbWFpbl9hY3Rpb24gY3VycmVudF9hY3Rpb24gPSBCUFNUQVRfV0hBVF9LRUVQX0NIRUNLSU5HOworICBzdHJ1Y3QgYnBzdGF0X3doYXQgcmV0dmFsOworCisgIHJldHZhbC5jYWxsX2R1bW15ID0gMDsKKyAgZm9yICg7IGJzICE9IE5VTEw7IGJzID0gYnMtPm5leHQpCisgICAgeworICAgICAgZW51bSBjbGFzcyBic19jbGFzcyA9IG5vX2VmZmVjdDsKKyAgICAgIGlmIChicy0+YnJlYWtwb2ludF9hdCA9PSBOVUxMKQorCS8qIEkgc3VzcGVjdCB0aGlzIGNhbiBoYXBwZW4gaWYgaXQgd2FzIGEgbW9tZW50YXJ5IGJyZWFrcG9pbnQKKwkgICB3aGljaCBoYXMgc2luY2UgYmVlbiBkZWxldGVkLiAgKi8KKwljb250aW51ZTsKKyAgICAgIHN3aXRjaCAoYnMtPmJyZWFrcG9pbnRfYXQtPnR5cGUpCisJeworCWNhc2UgYnBfbm9uZToKKwkgIGNvbnRpbnVlOworCisJY2FzZSBicF9icmVha3BvaW50OgorCWNhc2UgYnBfaGFyZHdhcmVfYnJlYWtwb2ludDoKKwljYXNlIGJwX3VudGlsOgorCWNhc2UgYnBfZmluaXNoOgorCSAgaWYgKGJzLT5zdG9wKQorCSAgICB7CisJICAgICAgaWYgKGJzLT5wcmludCkKKwkJYnNfY2xhc3MgPSBicF9ub2lzeTsKKwkgICAgICBlbHNlCisJCWJzX2NsYXNzID0gYnBfc2lsZW50OworCSAgICB9CisJICBlbHNlCisJICAgIGJzX2NsYXNzID0gYnBfbm9zdG9wOworCSAgYnJlYWs7CisJY2FzZSBicF93YXRjaHBvaW50OgorCWNhc2UgYnBfaGFyZHdhcmVfd2F0Y2hwb2ludDoKKwljYXNlIGJwX3JlYWRfd2F0Y2hwb2ludDoKKwljYXNlIGJwX2FjY2Vzc193YXRjaHBvaW50OgorCSAgaWYgKGJzLT5zdG9wKQorCSAgICB7CisJICAgICAgaWYgKGJzLT5wcmludCkKKwkJYnNfY2xhc3MgPSB3cF9ub2lzeTsKKwkgICAgICBlbHNlCisJCWJzX2NsYXNzID0gd3Bfc2lsZW50OworCSAgICB9CisJICBlbHNlCisJICAgIC8qIFRoZXJlIHdhcyBhIHdhdGNocG9pbnQsIGJ1dCB3ZSdyZSBub3Qgc3RvcHBpbmcuICBUaGlzIHJlcXVpcmVzCisJICAgICAgIG5vIGZ1cnRoZXIgYWN0aW9uLiAgKi8KKwkgICAgYnNfY2xhc3MgPSBub19lZmZlY3Q7CisJICBicmVhazsKKwljYXNlIGJwX2xvbmdqbXA6CisJICBic19jbGFzcyA9IGxvbmdfanVtcDsKKwkgIGJyZWFrOworCWNhc2UgYnBfbG9uZ2ptcF9yZXN1bWU6CisJICBic19jbGFzcyA9IGxvbmdfcmVzdW1lOworCSAgYnJlYWs7CisJY2FzZSBicF9zdGVwX3Jlc3VtZToKKwkgIGlmIChicy0+c3RvcCkKKwkgICAgeworCSAgICAgIGJzX2NsYXNzID0gc3RlcF9yZXN1bWU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgLyogSXQgaXMgZm9yIHRoZSB3cm9uZyBmcmFtZS4gICovCisJICAgIGJzX2NsYXNzID0gYnBfbm9zdG9wOworCSAgYnJlYWs7CisJY2FzZSBicF90aHJvdWdoX3NpZ3RyYW1wOgorCSAgYnNfY2xhc3MgPSB0aHJvdWdoX3NpZzsKKwkgIGJyZWFrOworCWNhc2UgYnBfd2F0Y2hwb2ludF9zY29wZToKKwkgIGJzX2NsYXNzID0gYnBfbm9zdG9wOworCSAgYnJlYWs7CisJY2FzZSBicF9zaGxpYl9ldmVudDoKKwkgIGJzX2NsYXNzID0gc2hsaWJfZXZlbnQ7CisJICBicmVhazsKKyAgICAgICAgY2FzZSBicF9jYXRjaF9sb2FkOgorICAgICAgICBjYXNlIGJwX2NhdGNoX3VubG9hZDoKKyAgICAgICAgICAvKiBPbmx5IGlmIHRoaXMgY2F0Y2hwb2ludCB0cmlnZ2VyZWQgc2hvdWxkIHdlIGNhdXNlIHRoZQorICAgICAgICAgICAgIHN0ZXAtb3V0LW9mLWRsZCBiZWhhdmlvdXIuICBPdGhlcndpc2UsIHdlIGlnbm9yZSB0aGlzCisgICAgICAgICAgICAgY2F0Y2hwb2ludC4gICovCisgICAgICAgICAgaWYgKGJzLT5zdG9wKQorICAgICAgICAgICAgYnNfY2xhc3MgPSBjYXRjaF9zaGxpYl9ldmVudDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBic19jbGFzcyA9IG5vX2VmZmVjdDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBicF9jYXRjaF9mb3JrOgorICAgICAgICBjYXNlIGJwX2NhdGNoX3Zmb3JrOgorCWNhc2UgYnBfY2F0Y2hfZXhlYzoKKyAgICAgICAgICBpZiAoYnMtPnN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChicy0+cHJpbnQpCisgICAgICAgICAgICAgICAgYnNfY2xhc3MgPSBicF9ub2lzeTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJzX2NsYXNzID0gYnBfc2lsZW50OworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8qIFRoZXJlIHdhcyBhIGNhdGNocG9pbnQsIGJ1dCB3ZSdyZSBub3Qgc3RvcHBpbmcuICBUaGlzIHJlcXVpcmVzCisgICAgICAgICAgICAgICBubyBmdXJ0aGVyIGFjdGlvbi4gICovCisgICAgICAgICAgICBic19jbGFzcyA9IG5vX2VmZmVjdDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBicF9jYXRjaF9jYXRjaDoKKyAgICAgICAgICBpZiAoIWJzLT5zdG9wIHx8IENVUlJFTlRfRVhDRVBUSU9OX0tJTkQgIT0gRVhfRVZFTlRfQ0FUQ0gpCisgICAgICAgICAgICBic19jbGFzcyA9IGJwX25vc3RvcDsKKyAgICAgICAgICBlbHNlIGlmIChicy0+c3RvcCkKKyAgICAgICAgICAgIGJzX2NsYXNzID0gYnMtPnByaW50ID8gYnBfbm9pc3kgOiBicF9zaWxlbnQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYnBfY2F0Y2hfdGhyb3c6CisgICAgICAgICAgaWYgKCFicy0+c3RvcCB8fCBDVVJSRU5UX0VYQ0VQVElPTl9LSU5EICE9IEVYX0VWRU5UX1RIUk9XKQorICAgICAgICAgICAgYnNfY2xhc3MgPSBicF9ub3N0b3A7CisgICAgICAgICAgZWxzZSBpZiAoYnMtPnN0b3ApCisgICAgICAgICAgICBic19jbGFzcyA9IGJzLT5wcmludCA/IGJwX25vaXN5IDogYnBfc2lsZW50OworICAgICAgICAgIGJyZWFrOworCWNhc2UgYnBfY2FsbF9kdW1teToKKwkgIC8qIE1ha2Ugc3VyZSB0aGUgYWN0aW9uIGlzIHN0b3AgKHNpbGVudCBvciBub2lzeSksIHNvIGluZnJ1bi5jCisJICAgICBwb3BzIHRoZSBkdW1teSBmcmFtZS4gICovCisJICBic19jbGFzcyA9IGJwX3NpbGVudDsKKwkgIHJldHZhbC5jYWxsX2R1bW15ID0gMTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGN1cnJlbnRfYWN0aW9uID0gdGFibGVbKGludClic19jbGFzc11bKGludCljdXJyZW50X2FjdGlvbl07CisgICAgfQorICByZXR2YWwubWFpbl9hY3Rpb24gPSBjdXJyZW50X2FjdGlvbjsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogTm9uemVybyBpZiB3ZSBzaG91bGQgc3RlcCBjb25zdGFudGx5IChlLmcuIHdhdGNocG9pbnRzIG9uIG1hY2hpbmVzCisgICB3aXRob3V0IGhhcmR3YXJlIHN1cHBvcnQpLiAgVGhpcyBpc24ndCByZWxhdGVkIHRvIGEgc3BlY2lmaWMgYnBzdGF0LAorICAganVzdCB0byB0aGluZ3MgbGlrZSB3aGV0aGVyIHdhdGNocG9pbnRzIGFyZSBzZXQuICAqLworCitpbnQgCiticHN0YXRfc2hvdWxkX3N0ZXAgKCkKK3sKKyAgc3RydWN0IGJyZWFrcG9pbnQgKmI7CisgIEFMTF9CUkVBS1BPSU5UUyAoYikKKyAgICBpZiAoYi0+ZW5hYmxlID09IGVuYWJsZWQgJiYgYi0+dHlwZSA9PSBicF93YXRjaHBvaW50KQorICAgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCisvKiBOb256ZXJvIGlmIHRoZXJlIGFyZSBlbmFibGVkIGhhcmR3YXJlIHdhdGNocG9pbnRzLiAqLworaW50CiticHN0YXRfaGF2ZV9hY3RpdmVfaHdfd2F0Y2hwb2ludHMgKCkKK3sKKyAgc3RydWN0IGJyZWFrcG9pbnQgKmI7CisgIEFMTF9CUkVBS1BPSU5UUyAoYikKKyAgICBpZiAoKGItPmVuYWJsZSA9PSBlbmFibGVkKSAmJgorICAgICAgICAoYi0+aW5zZXJ0ZWQpICYmCisgICAgICAgICgoYi0+dHlwZSA9PSBicF9oYXJkd2FyZV93YXRjaHBvaW50KSB8fAorICAgICAgICAgKGItPnR5cGUgPT0gYnBfcmVhZF93YXRjaHBvaW50KSB8fAorICAgICAgICAgKGItPnR5cGUgPT0gYnBfYWNjZXNzX3dhdGNocG9pbnQpKSkKKyAgICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworDAorLyogR2l2ZW4gYSBicHN0YXQgdGhhdCByZWNvcmRzIHplcm8gb3IgbW9yZSB0cmlnZ2VyZWQgZXZlbnRwb2ludHMsIHRoaXMKKyAgIGZ1bmN0aW9uIHJldHVybnMgYW5vdGhlciBicHN0YXQgd2hpY2ggY29udGFpbnMgb25seSB0aGUgY2F0Y2hwb2ludHMKKyAgIG9uIHRoYXQgZmlyc3QgbGlzdCwgaWYgYW55LiAqLwordm9pZAorYnBzdGF0X2dldF90cmlnZ2VyZWRfY2F0Y2hwb2ludHMgKGVwX2xpc3QsIGNwX2xpc3QpCisgIGJwc3RhdCAgZXBfbGlzdDsKKyAgYnBzdGF0ICogIGNwX2xpc3Q7Cit7CisgIHN0cnVjdCBicHN0YXRzICByb290X2JzWzFdOworICBicHN0YXQgIGJzID0gcm9vdF9iczsKKyAgc3RydWN0IGJyZWFrcG9pbnQgKiAgZXA7CisgIGNoYXIgKiAgZGxsX3BhdGhuYW1lOworIAorICBicHN0YXRfY2xlYXIgKGNwX2xpc3QpOworICByb290X2JzLT5uZXh0ID0gTlVMTDsKKyAKKyAgZm9yICg7IGVwX2xpc3QgIT0gTlVMTDsgZXBfbGlzdCA9IGVwX2xpc3QtPm5leHQgKQorICAgIHsKKyAgICAgIC8qIElzIHRoaXMgZXZlbnRwb2ludCBhIGNhdGNocG9pbnQ/ICBJZiBub3QsIGlnbm9yZSBpdC4gKi8KKyAgICAgIGVwID0gZXBfbGlzdC0+YnJlYWtwb2ludF9hdDsKKyAgICAgIGlmIChlcCA9PSBOVUxMKQorICAgICAgICBicmVhazsKKyAgICAgIGlmICgoZXAtPnR5cGUgIT0gYnBfY2F0Y2hfbG9hZCkgJiYgCisgICAgICAgICAgKGVwLT50eXBlICE9IGJwX2NhdGNoX3VubG9hZCkgJiYKKyAgICAgICAgICAoZXAtPnR5cGUgIT0gYnBfY2F0Y2hfY2F0Y2gpICYmCisgICAgICAgICAgKGVwLT50eXBlICE9IGJwX2NhdGNoX3Rocm93KSkgICAvKiBwYWk6ICh0ZW1wKSBBREQgZm9yay92Zm9yayBoZXJlISEgICovCisgICAgICAgIGNvbnRpbnVlOworIAorICAgICAgLyogWWVzOyBhZGQgaXQgdG8gdGhlIGxpc3QuICovCisgICAgICBicyA9IGJwc3RhdF9hbGxvYyAoZXAsIGJzKTsKKyAgICAgICpicyA9ICplcF9saXN0OworICAgICAgYnMtPm5leHQgPSBOVUxMOworICAgICAgYnMgPSByb290X2JzLT5uZXh0OworIAorI2lmIGRlZmluZWQoU09MSUJfQUREKQorICAgICAgLyogQWxzbywgZm9yIGVhY2ggdHJpZ2dlcmVkIGNhdGNocG9pbnQsIHRhZyBpdCB3aXRoIHRoZSBuYW1lIG9mCisgICAgICAgICB0aGUgbGlicmFyeSB0aGF0IGNhdXNlZCB0aGlzIHRyaWdnZXIuICAoV2UgY29weSB0aGUgbmFtZSBub3csCisgICAgICAgICBiZWNhdXNlIGl0J3Mgb25seSBndWFyYW50ZWVkIHRvIGJlIGF2YWlsYWJsZSBOT1csIHdoZW4gdGhlCisgICAgICAgICBjYXRjaHBvaW50IHRyaWdnZXJzLiAgQ2xpZW50cyB3aG8gbWF5IHdpc2ggdG8ga25vdyB0aGUgbmFtZQorICAgICAgICAgbGF0ZXIgbXVzdCBnZXQgaXQgZnJvbSB0aGUgY2F0Y2hwb2ludCBpdHNlbGYuKSAqLworICAgICAgaWYgKGVwLT50cmlnZ2VyZWRfZGxsX3BhdGhuYW1lICE9IE5VTEwpCisgICAgICAgIGZyZWUgKGVwLT50cmlnZ2VyZWRfZGxsX3BhdGhuYW1lKTsKKyAgICAgIGlmIChlcC0+dHlwZSA9PSBicF9jYXRjaF9sb2FkKQorICAgICAgICBkbGxfcGF0aG5hbWUgPSBTT0xJQl9MT0FERURfTElCUkFSWV9QQVRITkFNRSAoaW5mZXJpb3JfcGlkKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGxsX3BhdGhuYW1lID0gU09MSUJfVU5MT0FERURfTElCUkFSWV9QQVRITkFNRSAoaW5mZXJpb3JfcGlkKTsKKyNlbHNlCisgICAgICBkbGxfcGF0aG5hbWUgPSBOVUxMOworI2VuZGlmCisgICAgICBpZiAoZGxsX3BhdGhuYW1lKQorCXsKKwkgIGVwLT50cmlnZ2VyZWRfZGxsX3BhdGhuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChkbGxfcGF0aG5hbWUpICsgMSk7CisJICBzdHJjcHkgKGVwLT50cmlnZ2VyZWRfZGxsX3BhdGhuYW1lLCBkbGxfcGF0aG5hbWUpOworCX0KKyAgICAgIGVsc2UKKwllcC0+dHJpZ2dlcmVkX2RsbF9wYXRobmFtZSA9IE5VTEw7CisgICAgfQorIAorICAqY3BfbGlzdCA9IGJzOworfQorCisvKiBQcmludCBpbmZvcm1hdGlvbiBvbiBicmVha3BvaW50IG51bWJlciBCTlVNLCBvciAtMSBpZiBhbGwuCisgICBJZiBXQVRDSFBPSU5UUyBpcyB6ZXJvLCBwcm9jZXNzIG9ubHkgYnJlYWtwb2ludHM7IGlmIFdBVENIUE9JTlRTCisgICBpcyBub256ZXJvLCBwcm9jZXNzIG9ubHkgd2F0Y2hwb2ludHMuICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGVudW0gYnB0eXBlICB0eXBlOworICBjaGFyICogIGRlc2NyaXB0aW9uOworfSBlcF90eXBlX2Rlc2NyaXB0aW9uX3Q7CisKK3N0YXRpYyB2b2lkCiticmVha3BvaW50XzEgKGJudW0sIGFsbGZsYWcpCisgICAgIGludCBibnVtOworICAgICBpbnQgYWxsZmxhZzsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGJyZWFrcG9pbnQgKmI7CisgIHJlZ2lzdGVyIHN0cnVjdCBjb21tYW5kX2xpbmUgKmw7CisgIHJlZ2lzdGVyIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgQ09SRV9BRERSIGxhc3RfYWRkciA9IChDT1JFX0FERFIpLTE7CisgIGludCBmb3VuZF9hX2JyZWFrcG9pbnQgPSAwOworICBzdGF0aWMgZXBfdHlwZV9kZXNjcmlwdGlvbl90ICBicHR5cGVzW10gPQorICB7CisgICAge2JwX25vbmUsICAgICAgICAgICAgICAgICI/ZGVsZXRlZD8ifSwKKyAgICB7YnBfYnJlYWtwb2ludCwgICAgICAgICAgImJyZWFrcG9pbnQifSwKKyAgICB7YnBfaGFyZHdhcmVfYnJlYWtwb2ludCwgImh3IGJyZWFrcG9pbnQifSwKKyAgICB7YnBfdW50aWwsICAgICAgICAgICAgICAgInVudGlsIn0sCisgICAge2JwX2ZpbmlzaCwgICAgICAgICAgICAgICJmaW5pc2gifSwKKyAgICB7YnBfd2F0Y2hwb2ludCwgICAgICAgICAgIndhdGNocG9pbnQifSwKKyAgICB7YnBfaGFyZHdhcmVfd2F0Y2hwb2ludCwgImh3IHdhdGNocG9pbnQifSwKKyAgICB7YnBfcmVhZF93YXRjaHBvaW50LCAgICAgInJlYWQgd2F0Y2hwb2ludCJ9LAorICAgIHticF9hY2Nlc3Nfd2F0Y2hwb2ludCwgICAiYWNjIHdhdGNocG9pbnQifSwKKyAgICB7YnBfbG9uZ2ptcCwgICAgICAgICAgICAgImxvbmdqbXAifSwKKyAgICB7YnBfbG9uZ2ptcF9yZXN1bWUsICAgICAgImxvbmdqbXAgcmVzdW1lIn0sCisgICAge2JwX3N0ZXBfcmVzdW1lLCAgICAgICAgICJzdGVwIHJlc3VtZSJ9LAorICAgIHticF90aHJvdWdoX3NpZ3RyYW1wLCAgICAic2lndHJhbXAifSwKKyAgICB7YnBfd2F0Y2hwb2ludF9zY29wZSwgICAgIndhdGNocG9pbnQgc2NvcGUifSwKKyAgICB7YnBfY2FsbF9kdW1teSwgICAgICAgICAgImNhbGwgZHVtbXkifSwKKyAgICB7YnBfc2hsaWJfZXZlbnQsICAgICAgICAgInNobGliIGV2ZW50cyJ9LAorICAgIHticF9jYXRjaF9sb2FkLCAgICAgICAgICAiY2F0Y2ggbG9hZCJ9LAorICAgIHticF9jYXRjaF91bmxvYWQsICAgICAgICAiY2F0Y2ggdW5sb2FkIn0sCisgICAge2JwX2NhdGNoX2ZvcmssICAgICAgICAgICJjYXRjaCBmb3JrIn0sCisgICAge2JwX2NhdGNoX3Zmb3JrLCAgICAgICAgICJjYXRjaCB2Zm9yayJ9LAorICAgIHticF9jYXRjaF9leGVjLCAgICAgICAgICAiY2F0Y2ggZXhlYyJ9LAorICAgIHticF9jYXRjaF9jYXRjaCwgICAgICAgICAiY2F0Y2ggY2F0Y2gifSwKKyAgICB7YnBfY2F0Y2hfdGhyb3csICAgICAgICAgImNhdGNoIHRocm93In0KKyAgIH07CisKKyAgc3RhdGljIGNoYXIgKmJwZGlzcHNbXSA9IHsiZGVsIiwgImRzdHAiLCAiZGlzIiwgImtlZXAifTsKKyAgc3RhdGljIGNoYXIgYnBlbmFibGVzW10gPSAibnluIjsKKyAgY2hhciB3cmFwX2luZGVudFs4MF07CisKKyAgQUxMX0JSRUFLUE9JTlRTIChiKQorICAgIGlmIChibnVtID09IC0xCisJfHwgYm51bSA9PSBiLT5udW1iZXIpCisgICAgICB7CisvKiAgV2Ugb25seSBwcmludCBvdXQgdXNlciBzZXR0YWJsZSBicmVha3BvaW50cyB1bmxlc3MgdGhlIGFsbGZsYWcgaXMgc2V0LiAqLworCWlmICghYWxsZmxhZworCSAgICAmJiBiLT50eXBlICE9IGJwX2JyZWFrcG9pbnQKKyAgICAgICAgICAgICYmIGItPnR5cGUgIT0gYnBfY2F0Y2hfbG9hZAorICAgICAgICAgICAgJiYgYi0+dHlwZSAhPSBicF9jYXRjaF91bmxvYWQKKyAgICAgICAgICAgICYmIGItPnR5cGUgIT0gYnBfY2F0Y2hfZm9yaworICAgICAgICAgICAgJiYgYi0+dHlwZSAhPSBicF9jYXRjaF92Zm9yaworICAgICAgICAgICAgJiYgYi0+dHlwZSAhPSBicF9jYXRjaF9leGVjCisJICAgICYmIGItPnR5cGUgIT0gYnBfY2F0Y2hfY2F0Y2gKKwkgICAgJiYgYi0+dHlwZSAhPSBicF9jYXRjaF90aHJvdworCSAgICAmJiBiLT50eXBlICE9IGJwX2hhcmR3YXJlX2JyZWFrcG9pbnQKKwkgICAgJiYgYi0+dHlwZSAhPSBicF93YXRjaHBvaW50CisJICAgICYmIGItPnR5cGUgIT0gYnBfcmVhZF93YXRjaHBvaW50CisJICAgICYmIGItPnR5cGUgIT0gYnBfYWNjZXNzX3dhdGNocG9pbnQKKwkgICAgJiYgYi0+dHlwZSAhPSBicF9oYXJkd2FyZV93YXRjaHBvaW50KQorCSAgY29udGludWU7CisKKwlpZiAoIWZvdW5kX2FfYnJlYWtwb2ludCsrKQorCSAgeworICAgICAgICAgICAgYW5ub3RhdGVfYnJlYWtwb2ludHNfaGVhZGVycyAoKTsKKyAgCisgICAgICAgICAgICBhbm5vdGF0ZV9maWVsZCAoMCk7CisgICAgICAgICAgICBwcmludGZfZmlsdGVyZWQgKCJOdW0gIik7CisgICAgICAgICAgICBhbm5vdGF0ZV9maWVsZCAoMSk7CisgICAgICAgICAgICBwcmludGZfZmlsdGVyZWQgKCJUeXBlICAgICAgICAgICAiKTsKKyAgICAgICAgICAgIGFubm90YXRlX2ZpZWxkICgyKTsKKyAgICAgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkRpc3AgIik7CisgICAgICAgICAgICBhbm5vdGF0ZV9maWVsZCAoMyk7CisgICAgICAgICAgICBwcmludGZfZmlsdGVyZWQgKCJFbmIgIik7CisgICAgICAgICAgICBpZiAoYWRkcmVzc3ByaW50KQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYW5ub3RhdGVfZmllbGQgKDQpOworICAgICAgICAgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkFkZHJlc3MgICAgIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFubm90YXRlX2ZpZWxkICg1KTsKKyAgICAgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoIldoYXRcbiIpOworICAKKyAgICAgICAgICAgIGFubm90YXRlX2JyZWFrcG9pbnRzX3RhYmxlICgpOworICAgICAgICAgIH0KKyAgCisgICAgICAgIGFubm90YXRlX3JlY29yZCAoKTsKKyAgICAgICAgYW5ub3RhdGVfZmllbGQgKDApOworICAgICAgICBwcmludGZfZmlsdGVyZWQgKCIlLTNkICIsIGItPm51bWJlcik7CisgICAgICAgIGFubm90YXRlX2ZpZWxkICgxKTsKKyAgICAgICAgaWYgKChpbnQpYi0+dHlwZSA+IChzaXplb2YoYnB0eXBlcykvc2l6ZW9mKGJwdHlwZXNbMF0pKSkKKyAgICAgICAgICBlcnJvciAoImJwdHlwZXMgdGFibGUgZG9lcyBub3QgZGVzY3JpYmUgdHlwZSAjJWQuIiwgKGludCliLT50eXBlKTsKKyAgICAgICAgaWYgKChpbnQpYi0+dHlwZSAhPSBicHR5cGVzWyhpbnQpYi0+dHlwZV0udHlwZSkKKyAgICAgICAgICBlcnJvciAoImJwdHlwZXMgdGFibGUgZG9lcyBub3QgZGVzY3JpYmUgdHlwZSAjJWQ/IiwgKGludCliLT50eXBlKTsKKyAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiJS0xNHMgIiwgYnB0eXBlc1soaW50KWItPnR5cGVdLmRlc2NyaXB0aW9uKTsKKyAgICAgICAgYW5ub3RhdGVfZmllbGQgKDIpOworICAgICAgICBwcmludGZfZmlsdGVyZWQgKCIlLTRzICIsIGJwZGlzcHNbKGludCliLT5kaXNwb3NpdGlvbl0pOworICAgICAgICBhbm5vdGF0ZV9maWVsZCAoMyk7CisJcHJpbnRmX2ZpbHRlcmVkICgiJS0zYyAiLCBicGVuYWJsZXNbKGludCliLT5lbmFibGVdKTsKKworCXN0cmNweSAod3JhcF9pbmRlbnQsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKKwlpZiAoYWRkcmVzc3ByaW50KQorCSAgc3RyY2F0ICh3cmFwX2luZGVudCwgIiAgICAgICAgICAgIik7CisJc3dpdGNoIChiLT50eXBlKQorCSAgeworCSAgY2FzZSBicF93YXRjaHBvaW50OgorCSAgY2FzZSBicF9oYXJkd2FyZV93YXRjaHBvaW50OgorCSAgY2FzZSBicF9yZWFkX3dhdGNocG9pbnQ6CisJICBjYXNlIGJwX2FjY2Vzc193YXRjaHBvaW50OgorCSAgICAvKiBGaWVsZCA0LCB0aGUgYWRkcmVzcywgaXMgb21pdHRlZCAod2hpY2ggbWFrZXMgdGhlIGNvbHVtbnMKKwkgICAgICAgbm90IGxpbmUgdXAgdG9vIG5pY2VseSB3aXRoIHRoZSBoZWFkZXJzLCBidXQgdGhlIGVmZmVjdAorCSAgICAgICBpcyByZWxhdGl2ZWx5IHJlYWRhYmxlKS4gICovCisJICAgIGFubm90YXRlX2ZpZWxkICg1KTsKKwkgICAgcHJpbnRfZXhwcmVzc2lvbiAoYi0+ZXhwLCBnZGJfc3Rkb3V0KTsKKwkgICAgYnJlYWs7CisgCisgICAgICAgICAgY2FzZSBicF9jYXRjaF9sb2FkOgorICAgICAgICAgIGNhc2UgYnBfY2F0Y2hfdW5sb2FkOgorICAgICAgICAgICAgLyogRmllbGQgNCwgdGhlIGFkZHJlc3MsIGlzIG9taXR0ZWQgKHdoaWNoIG1ha2VzIHRoZSBjb2x1bW5zCisgICAgICAgICAgICAgICBub3QgbGluZSB1cCB0b28gbmljZWx5IHdpdGggdGhlIGhlYWRlcnMsIGJ1dCB0aGUgZWZmZWN0CisgICAgICAgICAgICAgICBpcyByZWxhdGl2ZWx5IHJlYWRhYmxlKS4gICovCisgICAgICAgICAgICBhbm5vdGF0ZV9maWVsZCAoNSk7CisgICAgICAgICAgICBpZiAoYi0+ZGxsX3BhdGhuYW1lID09IE5VTEwpCisgICAgICAgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoIjxhbnkgbGlicmFyeT4gIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoImxpYnJhcnkgXCIlc1wiICIsIGItPmRsbF9wYXRobmFtZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgYnBfY2F0Y2hfZm9yazoKKyAgICAgICAgICBjYXNlIGJwX2NhdGNoX3Zmb3JrOgorCSAgICAvKiBGaWVsZCA0LCB0aGUgYWRkcmVzcywgaXMgb21pdHRlZCAod2hpY2ggbWFrZXMgdGhlIGNvbHVtbnMKKwkgICAgICAgbm90IGxpbmUgdXAgdG9vIG5pY2VseSB3aXRoIHRoZSBoZWFkZXJzLCBidXQgdGhlIGVmZmVjdAorCSAgICAgICBpcyByZWxhdGl2ZWx5IHJlYWRhYmxlKS4gICovCisJICAgIGFubm90YXRlX2ZpZWxkICg1KTsKKwkgICAgaWYgKGItPmZvcmtlZF9pbmZlcmlvcl9waWQgIT0gMCkKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCJwcm9jZXNzICVkICIsIGItPmZvcmtlZF9pbmZlcmlvcl9waWQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIGJwX2NhdGNoX2V4ZWM6CisJICAgIC8qIEZpZWxkIDQsIHRoZSBhZGRyZXNzLCBpcyBvbWl0dGVkICh3aGljaCBtYWtlcyB0aGUgY29sdW1ucworCSAgICAgICBub3QgbGluZSB1cCB0b28gbmljZWx5IHdpdGggdGhlIGhlYWRlcnMsIGJ1dCB0aGUgZWZmZWN0CisJICAgICAgIGlzIHJlbGF0aXZlbHkgcmVhZGFibGUpLiAgKi8KKwkgICAgYW5ub3RhdGVfZmllbGQgKDUpOworCSAgICBpZiAoYi0+ZXhlY19wYXRobmFtZSAhPSBOVUxMKQorCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoInByb2dyYW0gXCIlc1wiICIsIGItPmV4ZWNfcGF0aG5hbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBicF9jYXRjaF9jYXRjaDoKKwkgICAgLyogRmllbGQgNCwgdGhlIGFkZHJlc3MsIGlzIG9taXR0ZWQgKHdoaWNoIG1ha2VzIHRoZSBjb2x1bW5zCisJICAgICAgIG5vdCBsaW5lIHVwIHRvbyBuaWNlbHkgd2l0aCB0aGUgaGVhZGVycywgYnV0IHRoZSBlZmZlY3QKKwkgICAgICAgaXMgcmVsYXRpdmVseSByZWFkYWJsZSkuICAqLworCSAgICBhbm5vdGF0ZV9maWVsZCAoNSk7CisgICAgICAgICAgICBwcmludGZfZmlsdGVyZWQgKCJleGNlcHRpb24gY2F0Y2ggIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGJwX2NhdGNoX3Rocm93OgorCSAgICAvKiBGaWVsZCA0LCB0aGUgYWRkcmVzcywgaXMgb21pdHRlZCAod2hpY2ggbWFrZXMgdGhlIGNvbHVtbnMKKwkgICAgICAgbm90IGxpbmUgdXAgdG9vIG5pY2VseSB3aXRoIHRoZSBoZWFkZXJzLCBidXQgdGhlIGVmZmVjdAorCSAgICAgICBpcyByZWxhdGl2ZWx5IHJlYWRhYmxlKS4gICovCisJICAgIGFubm90YXRlX2ZpZWxkICg1KTsKKyAgICAgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoImV4Y2VwdGlvbiB0aHJvdyAiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisJICBjYXNlIGJwX2JyZWFrcG9pbnQ6CisJICBjYXNlIGJwX2hhcmR3YXJlX2JyZWFrcG9pbnQ6CisJICBjYXNlIGJwX3VudGlsOgorCSAgY2FzZSBicF9maW5pc2g6CisJICBjYXNlIGJwX2xvbmdqbXA6CisJICBjYXNlIGJwX2xvbmdqbXBfcmVzdW1lOgorCSAgY2FzZSBicF9zdGVwX3Jlc3VtZToKKwkgIGNhc2UgYnBfdGhyb3VnaF9zaWd0cmFtcDoKKwkgIGNhc2UgYnBfd2F0Y2hwb2ludF9zY29wZToKKwkgIGNhc2UgYnBfY2FsbF9kdW1teToKKwkgIGNhc2UgYnBfc2hsaWJfZXZlbnQ6CisJICAgIGlmIChhZGRyZXNzcHJpbnQpCisJICAgICAgeworCSAgICAgICAgYW5ub3RhdGVfZmllbGQgKDQpOworCQkvKiBGSVhNRS0zMng2NDogbmVlZCBhIHByaW50X2FkZHJlc3NfbnVtZXJpYyB3aXRoCisgICAgICAgICAgICAgICAgICAgZmllbGQgd2lkdGggKi8KKwkJcHJpbnRmX2ZpbHRlcmVkCisJCSAgKCIlcyAiLAorCQkgICBsb2NhbF9oZXhfc3RyaW5nX2N1c3RvbQorCQkgICAoKHVuc2lnbmVkIGxvbmcpIGItPmFkZHJlc3MsICIwOGwiKSk7CisJICAgICAgfQorCisJICAgIGFubm90YXRlX2ZpZWxkICg1KTsKKworCSAgICBsYXN0X2FkZHIgPSBiLT5hZGRyZXNzOworCSAgICBpZiAoYi0+c291cmNlX2ZpbGUpCisJICAgICAgeworCQlzeW0gPSBmaW5kX3BjX3NlY3RfZnVuY3Rpb24gKGItPmFkZHJlc3MsIGItPnNlY3Rpb24pOworCQlpZiAoc3ltKQorCQkgIHsKKwkJICAgIGZwdXRzX2ZpbHRlcmVkICgiaW4gIiwgZ2RiX3N0ZG91dCk7CisJCSAgICBmcHV0c19maWx0ZXJlZCAoU1lNQk9MX1NPVVJDRV9OQU1FIChzeW0pLCBnZGJfc3Rkb3V0KTsKKwkJICAgIHdyYXBfaGVyZSAod3JhcF9pbmRlbnQpOworCQkgICAgZnB1dHNfZmlsdGVyZWQgKCIgYXQgIiwgZ2RiX3N0ZG91dCk7CisJCSAgfQorCQlmcHV0c19maWx0ZXJlZCAoYi0+c291cmNlX2ZpbGUsIGdkYl9zdGRvdXQpOworCQlwcmludGZfZmlsdGVyZWQgKCI6JWQiLCBiLT5saW5lX251bWJlcik7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgcHJpbnRfYWRkcmVzc19zeW1ib2xpYyAoYi0+YWRkcmVzcywgZ2RiX3N0ZG91dCwgZGVtYW5nbGUsICIgIik7CisJICAgIGJyZWFrOworCSAgfQorCisgICAgICAgIGlmIChiLT50aHJlYWQgIT0gLTEpCisgICAgICAgICAgICBwcmludGZfZmlsdGVyZWQgKCIgdGhyZWFkICVkIiwgYi0+dGhyZWFkICk7CisKKwlwcmludGZfZmlsdGVyZWQgKCJcbiIpOworCisJaWYgKGItPmZyYW1lKQorCSAgeworICAgICAgICAgICAgYW5ub3RhdGVfZmllbGQgKDYpOworCisJICAgIHByaW50Zl9maWx0ZXJlZCAoIlx0c3RvcCBvbmx5IGluIHN0YWNrIGZyYW1lIGF0ICIpOworCSAgICBwcmludF9hZGRyZXNzX251bWVyaWMgKGItPmZyYW1lLCAxLCBnZGJfc3Rkb3V0KTsKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKwkgIH0KKworCWlmIChiLT5jb25kKQorCSAgeworICAgICAgICAgICAgYW5ub3RhdGVfZmllbGQgKDcpOworCisJICAgIHByaW50Zl9maWx0ZXJlZCAoIlx0c3RvcCBvbmx5IGlmICIpOworCSAgICBwcmludF9leHByZXNzaW9uIChiLT5jb25kLCBnZGJfc3Rkb3V0KTsKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKwkgIH0KKworCWlmIChiLT50aHJlYWQgIT0gLTEpCisJICB7CisJICAgIC8qIEZJWE1FIHNob3VsZCBtYWtlIGFuIGFubm90YXRpb24gZm9yIHRoaXMgKi8KKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgiXHRzdG9wIG9ubHkgaW4gdGhyZWFkICVkXG4iLCBiLT50aHJlYWQpOworCSAgfQorCisgICAgICAgIGlmIChzaG93X2JyZWFrcG9pbnRfaGl0X2NvdW50cyAmJiBiLT5oaXRfY291bnQpCisJICB7CisJICAgIC8qIEZJWE1FIHNob3VsZCBtYWtlIGFuIGFubm90YXRpb24gZm9yIHRoaXMgKi8KKyAgICAgICAgICAgIGlmIChlcF9pc19jYXRjaHBvaW50IChiKSkKKyAgICAgICAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXHRjYXRjaHBvaW50Iik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlx0YnJlYWtwb2ludCIpOworICAgICAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiIGFscmVhZHkgaGl0ICVkIHRpbWUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi0+aGl0X2NvdW50LCAoYi0+aGl0X2NvdW50ID09IDEgPyAiIiA6ICJzIikpOworCSAgfQorCisJaWYgKGItPmlnbm9yZV9jb3VudCkKKwkgIHsKKyAgICAgICAgICAgIGFubm90YXRlX2ZpZWxkICg4KTsKKworCSAgICBwcmludGZfZmlsdGVyZWQgKCJcdGlnbm9yZSBuZXh0ICVkIGhpdHNcbiIsIGItPmlnbm9yZV9jb3VudCk7CisJICB9CisKKwlpZiAoKGwgPSBiLT5jb21tYW5kcykpCisJICB7CisgICAgICAgICAgICBhbm5vdGF0ZV9maWVsZCAoOSk7CisKKwkgICAgd2hpbGUgKGwpCisJICAgICAgeworCQlwcmludF9jb21tYW5kX2xpbmUgKGwsIDQpOworCQlsID0gbC0+bmV4dDsKKwkgICAgICB9CisJICB9CisgICAgICB9CisKKyAgaWYgKCFmb3VuZF9hX2JyZWFrcG9pbnQpCisgICAgeworICAgICAgaWYgKGJudW0gPT0gLTEpCisgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoIk5vIGJyZWFrcG9pbnRzIG9yIHdhdGNocG9pbnRzLlxuIik7CisgICAgICBlbHNlCisgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoIk5vIGJyZWFrcG9pbnQgb3Igd2F0Y2hwb2ludCBudW1iZXIgJWQuXG4iLCBibnVtKTsKKyAgICB9CisgIGVsc2UKKyAgICAvKiBDb21wYXJlIGFnYWluc3QgKENPUkVfQUREUiktMSBpbiBjYXNlIHNvbWUgY29tcGlsZXIgZGVjaWRlcworICAgICAgIHRoYXQgYSBjb21wYXJpc29uIG9mIGFuIHVuc2lnbmVkIHdpdGggLTEgaXMgYWx3YXlzIGZhbHNlLiAgKi8KKyAgICBpZiAobGFzdF9hZGRyICE9IChDT1JFX0FERFIpLTEpCisgICAgICBzZXRfbmV4dF9hZGRyZXNzIChsYXN0X2FkZHIpOworCisgIGFubm90YXRlX2JyZWFrcG9pbnRzX3RhYmxlX2VuZCAoKTsKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCiticmVha3BvaW50c19pbmZvIChibnVtX2V4cCwgZnJvbV90dHkpCisgICAgIGNoYXIgKmJudW1fZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGludCBibnVtID0gLTE7CisKKyAgaWYgKGJudW1fZXhwKQorICAgIGJudW0gPSBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIChibnVtX2V4cCk7CisKKyAgYnJlYWtwb2ludF8xIChibnVtLCAwKTsKK30KKworI2lmIE1BSU5URU5BTkNFX0NNRFMKKworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK21haW50ZW5hbmNlX2luZm9fYnJlYWtwb2ludHMgKGJudW1fZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYm51bV9leHA7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IGJudW0gPSAtMTsKKworICBpZiAoYm51bV9leHApCisgICAgYm51bSA9IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgKGJudW1fZXhwKTsKKworICBicmVha3BvaW50XzEgKGJudW0sIDEpOworfQorCisjZW5kaWYKKworLyogUHJpbnQgYSBtZXNzYWdlIGRlc2NyaWJpbmcgYW55IGJyZWFrcG9pbnRzIHNldCBhdCBQQy4gICovCisKK3N0YXRpYyB2b2lkCitkZXNjcmliZV9vdGhlcl9icmVha3BvaW50cyAocGMsIHNlY3Rpb24pCisgICAgIENPUkVfQUREUiBwYzsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247Cit7CisgIHJlZ2lzdGVyIGludCBvdGhlcnMgPSAwOworICByZWdpc3RlciBzdHJ1Y3QgYnJlYWtwb2ludCAqYjsKKworICBBTExfQlJFQUtQT0lOVFMgKGIpCisgICAgaWYgKGItPmFkZHJlc3MgPT0gcGMpCisgICAgICBpZiAob3ZlcmxheV9kZWJ1Z2dpbmcgPT0gMCB8fAorCSAgYi0+c2VjdGlvbiA9PSBzZWN0aW9uKQorCW90aGVycysrOworICBpZiAob3RoZXJzID4gMCkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJOb3RlOiBicmVha3BvaW50JXMgIiwgKG90aGVycyA+IDEpID8gInMiIDogIiIpOworICAgICAgQUxMX0JSRUFLUE9JTlRTIChiKQorCWlmIChiLT5hZGRyZXNzID09IHBjKQorCSAgaWYgKG92ZXJsYXlfZGVidWdnaW5nID09IDAgfHwKKwkgICAgICBiLT5zZWN0aW9uID09IHNlY3Rpb24pCisJICAgIHsKKwkgICAgICBvdGhlcnMtLTsKKwkgICAgICBwcmludGZfZmlsdGVyZWQKKwkJKCIlZCVzJXMgIiwKKwkJIGItPm51bWJlciwKKwkJICgoYi0+ZW5hYmxlID09IGRpc2FibGVkIHx8IGItPmVuYWJsZSA9PSBzaGxpYl9kaXNhYmxlZCB8fCBiLT5lbmFibGUgPT0gY2FsbF9kaXNhYmxlZCkKKwkJICA/ICIgKGRpc2FibGVkKSIgOiAiIiksCisJCSAob3RoZXJzID4gMSkgPyAiLCIgOiAoKG90aGVycyA9PSAxKSA/ICIgYW5kIiA6ICIiKSk7CisJICAgIH0KKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoImFsc28gc2V0IGF0IHBjICIpOworICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChwYywgMSwgZ2RiX3N0ZG91dCk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIuXG4iKTsKKyAgICB9Cit9CisMCisvKiBTZXQgdGhlIGRlZmF1bHQgcGxhY2UgdG8gcHV0IGEgYnJlYWtwb2ludAorICAgZm9yIHRoZSBgYnJlYWsnIGNvbW1hbmQgd2l0aCBubyBhcmd1bWVudHMuICAqLworCit2b2lkCitzZXRfZGVmYXVsdF9icmVha3BvaW50ICh2YWxpZCwgYWRkciwgc3ltdGFiLCBsaW5lKQorICAgICBpbnQgdmFsaWQ7CisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBzdHJ1Y3Qgc3ltdGFiICpzeW10YWI7CisgICAgIGludCBsaW5lOworeworICBkZWZhdWx0X2JyZWFrcG9pbnRfdmFsaWQgPSB2YWxpZDsKKyAgZGVmYXVsdF9icmVha3BvaW50X2FkZHJlc3MgPSBhZGRyOworICBkZWZhdWx0X2JyZWFrcG9pbnRfc3ltdGFiID0gc3ltdGFiOworICBkZWZhdWx0X2JyZWFrcG9pbnRfbGluZSA9IGxpbmU7Cit9CisKKy8qIFJlc2NhbiBicmVha3BvaW50cyBhdCBhZGRyZXNzIEFERFJFU1MsCisgICBtYXJraW5nIHRoZSBmaXJzdCBvbmUgYXMgImZpcnN0IiBhbmQgYW55IG90aGVycyBhcyAiZHVwbGljYXRlcyIuCisgICBUaGlzIGlzIHNvIHRoYXQgdGhlIGJwdCBpbnN0cnVjdGlvbiBpcyBvbmx5IGluc2VydGVkIG9uY2UuICAqLworCitzdGF0aWMgdm9pZAorY2hlY2tfZHVwbGljYXRlcyAoYWRkcmVzcywgc2VjdGlvbikKKyAgICAgQ09SRV9BRERSIGFkZHJlc3M7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworeworICByZWdpc3RlciBzdHJ1Y3QgYnJlYWtwb2ludCAqYjsKKyAgcmVnaXN0ZXIgaW50IGNvdW50ID0gMDsKKworICBpZiAoYWRkcmVzcyA9PSAwKQkJLyogV2F0Y2hwb2ludHMgYXJlIHVuaW50ZXJlc3RpbmcgKi8KKyAgICByZXR1cm47CisKKyAgQUxMX0JSRUFLUE9JTlRTIChiKQorICAgIGlmIChiLT5lbmFibGUgIT0gZGlzYWJsZWQKKwkmJiBiLT5lbmFibGUgIT0gc2hsaWJfZGlzYWJsZWQKKwkmJiBiLT5lbmFibGUgIT0gY2FsbF9kaXNhYmxlZAorCSYmIGItPmFkZHJlc3MgPT0gYWRkcmVzcworCSYmIChvdmVybGF5X2RlYnVnZ2luZyA9PSAwIHx8IGItPnNlY3Rpb24gPT0gc2VjdGlvbikpCisgICAgICB7CisJY291bnQrKzsKKwliLT5kdXBsaWNhdGUgPSBjb3VudCA+IDE7CisgICAgICB9Cit9CisKKy8qIExvdyBsZXZlbCByb3V0aW5lIHRvIHNldCBhIGJyZWFrcG9pbnQuCisgICBUYWtlcyBhcyBhcmdzIHRoZSB0aHJlZSB0aGluZ3MgdGhhdCBldmVyeSBicmVha3BvaW50IG11c3QgaGF2ZS4KKyAgIFJldHVybnMgdGhlIGJyZWFrcG9pbnQgb2JqZWN0IHNvIGNhbGxlciBjYW4gc2V0IG90aGVyIHRoaW5ncy4KKyAgIERvZXMgbm90IHNldCB0aGUgYnJlYWtwb2ludCBudW1iZXIhCisgICBEb2VzIG5vdCBwcmludCBhbnl0aGluZy4KKworICAgPT0+IFRoaXMgcm91dGluZSBzaG91bGQgbm90IGJlIGNhbGxlZCBpZiB0aGVyZSBpcyBhIGNoYW5jZSBvZiBsYXRlcgorICAgZXJyb3IoKTsgb3RoZXJ3aXNlIGl0IGxlYXZlcyBhIGJvZ3VzIGJyZWFrcG9pbnQgb24gdGhlIGNoYWluLiAgVmFsaWRhdGUKKyAgIHlvdXIgYXJndW1lbnRzIEJFRk9SRSBjYWxsaW5nIHRoaXMgcm91dGluZSEgICovCisKK3N0cnVjdCBicmVha3BvaW50ICoKK3NldF9yYXdfYnJlYWtwb2ludCAoc2FsKQorICAgICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGJyZWFrcG9pbnQgKmIsICpiMTsKKworICBiID0gKHN0cnVjdCBicmVha3BvaW50ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGJyZWFrcG9pbnQpKTsKKyAgbWVtc2V0IChiLCAwLCBzaXplb2YgKCpiKSk7CisgIGItPmFkZHJlc3MgPSBzYWwucGM7CisgIGlmIChzYWwuc3ltdGFiID09IE5VTEwpCisgICAgYi0+c291cmNlX2ZpbGUgPSBOVUxMOworICBlbHNlCisgICAgYi0+c291cmNlX2ZpbGUgPSBzYXZlc3RyaW5nIChzYWwuc3ltdGFiLT5maWxlbmFtZSwKKwkJCQkgc3RybGVuIChzYWwuc3ltdGFiLT5maWxlbmFtZSkpOworICBiLT5zZWN0aW9uID0gc2FsLnNlY3Rpb247CisgIGItPmxhbmd1YWdlID0gY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2U7CisgIGItPmlucHV0X3JhZGl4ID0gaW5wdXRfcmFkaXg7CisgIGItPnRocmVhZCA9IC0xOworICBiLT5saW5lX251bWJlciA9IHNhbC5saW5lOworICBiLT5lbmFibGUgPSBlbmFibGVkOworICBiLT5uZXh0ID0gMDsKKyAgYi0+c2lsZW50ID0gMDsKKyAgYi0+aWdub3JlX2NvdW50ID0gMDsKKyAgYi0+Y29tbWFuZHMgPSBOVUxMOworICBiLT5mcmFtZSA9IDA7CisgIGItPmRsbF9wYXRobmFtZSA9IE5VTEw7CisgIGItPnRyaWdnZXJlZF9kbGxfcGF0aG5hbWUgPSBOVUxMOworICBiLT5mb3JrZWRfaW5mZXJpb3JfcGlkID0gMDsKKyAgYi0+ZXhlY19wYXRobmFtZSA9IE5VTEw7CisKKyAgLyogQWRkIHRoaXMgYnJlYWtwb2ludCB0byB0aGUgZW5kIG9mIHRoZSBjaGFpbgorICAgICBzbyB0aGF0IGEgbGlzdCBvZiBicmVha3BvaW50cyB3aWxsIGNvbWUgb3V0IGluIG9yZGVyCisgICAgIG9mIGluY3JlYXNpbmcgbnVtYmVycy4gICovCisKKyAgYjEgPSBicmVha3BvaW50X2NoYWluOworICBpZiAoYjEgPT0gMCkKKyAgICBicmVha3BvaW50X2NoYWluID0gYjsKKyAgZWxzZQorICAgIHsKKyAgICAgIHdoaWxlIChiMS0+bmV4dCkKKwliMSA9IGIxLT5uZXh0OworICAgICAgYjEtPm5leHQgPSBiOworICAgIH0KKworICBjaGVja19kdXBsaWNhdGVzIChzYWwucGMsIHNhbC5zZWN0aW9uKTsKKyAgYnJlYWtwb2ludHNfY2hhbmdlZCAoKTsKKworICByZXR1cm4gYjsKK30KKworI2lmZGVmIEdFVF9MT05HSk1QX1RBUkdFVAorCitzdGF0aWMgdm9pZAorY3JlYXRlX2xvbmdqbXBfYnJlYWtwb2ludCAoZnVuY19uYW1lKQorICAgICBjaGFyICpmdW5jX25hbWU7Cit7CisgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOworICBzdHJ1Y3QgYnJlYWtwb2ludCAqYjsKKworICBJTklUX1NBTCAoJnNhbCk7CS8qIGluaXRpYWxpemUgdG8gemVyb2VzICovCisgIGlmIChmdW5jX25hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm07CisKKyAgICAgIG0gPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfdGV4dCAoZnVuY19uYW1lLCBOVUxMLCAoc3RydWN0IG9iamZpbGUgKilOVUxMKTsKKyAgICAgIGlmIChtKQorCXNhbC5wYyA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtKTsKKyAgICAgIGVsc2UKKwlyZXR1cm47CisgICAgfQorICBzYWwuc2VjdGlvbiA9IGZpbmRfcGNfb3ZlcmxheSAoc2FsLnBjKTsKKyAgYiA9IHNldF9yYXdfYnJlYWtwb2ludCAoc2FsKTsKKyAgaWYgKCFiKSByZXR1cm47CisKKyAgYi0+dHlwZSA9IGZ1bmNfbmFtZSAhPSBOVUxMID8gYnBfbG9uZ2ptcCA6IGJwX2xvbmdqbXBfcmVzdW1lOworICBiLT5kaXNwb3NpdGlvbiA9IGRvbnR0b3VjaDsKKyAgYi0+ZW5hYmxlID0gZGlzYWJsZWQ7CisgIGItPnNpbGVudCA9IDE7CisgIGlmIChmdW5jX25hbWUpCisgICAgYi0+YWRkcl9zdHJpbmcgPSBzdHJzYXZlKGZ1bmNfbmFtZSk7CisgIGItPm51bWJlciA9IGludGVybmFsX2JyZWFrcG9pbnRfbnVtYmVyLS07Cit9CisKKyNlbmRpZgkvKiAjaWZkZWYgR0VUX0xPTkdKTVBfVEFSR0VUICovCisKKy8qIENhbGwgdGhpcyByb3V0aW5lIHdoZW4gc3RlcHBpbmcgYW5kIG5leHRpbmcgdG8gZW5hYmxlIGEgYnJlYWtwb2ludCBpZiB3ZSBkbworICAgYSBsb25nam1wKCkuICBXaGVuIHdlIGhpdCB0aGF0IGJyZWFrcG9pbnQsIGNhbGwKKyAgIHNldF9sb25nam1wX3Jlc3VtZV9icmVha3BvaW50KCkgdG8gZmlndXJlIG91dCB3aGVyZSB3ZSBhcmUgZ29pbmcuICovCisKK3ZvaWQKK2VuYWJsZV9sb25nam1wX2JyZWFrcG9pbnQoKQoreworICByZWdpc3RlciBzdHJ1Y3QgYnJlYWtwb2ludCAqYjsKKworICBBTExfQlJFQUtQT0lOVFMgKGIpCisgICAgaWYgKGItPnR5cGUgPT0gYnBfbG9uZ2ptcCkKKyAgICAgIHsKKwliLT5lbmFibGUgPSBlbmFibGVkOworCWNoZWNrX2R1cGxpY2F0ZXMgKGItPmFkZHJlc3MsIGItPnNlY3Rpb24pOworICAgICAgfQorfQorCit2b2lkCitkaXNhYmxlX2xvbmdqbXBfYnJlYWtwb2ludCgpCit7CisgIHJlZ2lzdGVyIHN0cnVjdCBicmVha3BvaW50ICpiOworCisgIEFMTF9CUkVBS1BPSU5UUyAoYikKKyAgICBpZiAoICAgYi0+dHlwZSA9PSBicF9sb25nam1wCisJfHwgYi0+dHlwZSA9PSBicF9sb25nam1wX3Jlc3VtZSkKKyAgICAgIHsKKwliLT5lbmFibGUgPSBkaXNhYmxlZDsKKwljaGVja19kdXBsaWNhdGVzIChiLT5hZGRyZXNzLCBiLT5zZWN0aW9uKTsKKyAgICAgIH0KK30KKworI2lmZGVmIFNPTElCX0FERAordm9pZAorcmVtb3ZlX3NvbGliX2V2ZW50X2JyZWFrcG9pbnRzICgpCit7CisgIHJlZ2lzdGVyIHN0cnVjdCBicmVha3BvaW50ICpiLCAqdGVtcDsKKworICBBTExfQlJFQUtQT0lOVFNfU0FGRSAoYiwgdGVtcCkKKyAgICBpZiAoYi0+dHlwZSA9PSBicF9zaGxpYl9ldmVudCkKKyAgICAgIGRlbGV0ZV9icmVha3BvaW50IChiKTsKK30KKwordm9pZAorY3JlYXRlX3NvbGliX2V2ZW50X2JyZWFrcG9pbnQgKGFkZHJlc3MpCisgICAgIENPUkVfQUREUiBhZGRyZXNzOworeworICBzdHJ1Y3QgYnJlYWtwb2ludCAqYjsKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CisKKyAgSU5JVF9TQUwgKCZzYWwpOwkvKiBpbml0aWFsaXplIHRvIHplcm9lcyAqLworICBzYWwucGMgPSBhZGRyZXNzOworICBzYWwuc2VjdGlvbiA9IGZpbmRfcGNfb3ZlcmxheSAoc2FsLnBjKTsKKyAgYiA9IHNldF9yYXdfYnJlYWtwb2ludCAoc2FsKTsKKyAgYi0+bnVtYmVyID0gaW50ZXJuYWxfYnJlYWtwb2ludF9udW1iZXItLTsKKyAgYi0+ZGlzcG9zaXRpb24gPSBkb250dG91Y2g7CisgIGItPnR5cGUgPSBicF9zaGxpYl9ldmVudDsKK30KKwordm9pZAorZGlzYWJsZV9icmVha3BvaW50c19pbl9zaGxpYnMgKHNpbGVudCkKKyAgICAgaW50IHNpbGVudDsKK3sKKyAgc3RydWN0IGJyZWFrcG9pbnQgKiAgYjsKKyAgaW50ICBkaXNhYmxlZF9zaGxpYl9icmVha3MgPSAwOworCisgIC8qIFNlZSBhbHNvOiBpbnNlcnRfYnJlYWtwb2ludHMsIHVuZGVyIERJU0FCTEVfVU5TRVRUQUJMRV9CUkVBSy4gKi8KKyAgQUxMX0JSRUFLUE9JTlRTIChiKQorICAgIHsKKyNpZiBkZWZpbmVkIChQQ19TT0xJQikKKyAgICAgIGlmICgoKGItPnR5cGUgPT0gYnBfYnJlYWtwb2ludCkgfHwKKyAgICAgICAgICAgKGItPnR5cGUgPT0gYnBfaGFyZHdhcmVfYnJlYWtwb2ludCkpICYmCisgICAgICAgICAgKGItPmVuYWJsZSAhPSBzaGxpYl9kaXNhYmxlZCkgJiYKKyAgICAgICAgICAoYi0+ZW5hYmxlICE9IGNhbGxfZGlzYWJsZWQpICYmCisgICAgICAgICAgISBiLT5kdXBsaWNhdGUgJiYKKyAgICAgICAgICBQQ19TT0xJQiAoYi0+YWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICBiLT5lbmFibGUgPSBzaGxpYl9kaXNhYmxlZDsKKwkgIGlmICghc2lsZW50KQorCSAgICB7CisJICAgICAgaWYgKCFkaXNhYmxlZF9zaGxpYl9icmVha3MpCisJCXsKKwkJICB0YXJnZXRfdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ICgpOworCQkgIHByaW50Zl9maWx0ZXJlZCAoIlRlbXBvcmFyaWx5IGRpc2FibGluZyBzaGFyZWQgbGlicmFyeSBicmVha3BvaW50czpcbiIpOworCQl9CisJICAgICAgZGlzYWJsZWRfc2hsaWJfYnJlYWtzID0gMTsKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCIlZCAiLCBiLT5udW1iZXIpOworCSAgICB9CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgaWYgKGRpc2FibGVkX3NobGliX2JyZWFrcyAmJiAhc2lsZW50KQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7Cit9CisKKy8qIFRyeSB0byByZWVuYWJsZSBhbnkgYnJlYWtwb2ludHMgaW4gc2hhcmVkIGxpYnJhcmllcy4gICovCit2b2lkCityZV9lbmFibGVfYnJlYWtwb2ludHNfaW5fc2hsaWJzICgpCit7CisgIHN0cnVjdCBicmVha3BvaW50ICpiOworCisgIEFMTF9CUkVBS1BPSU5UUyAoYikKKyAgICBpZiAoYi0+ZW5hYmxlID09IHNobGliX2Rpc2FibGVkKQorICAgICAgeworCWNoYXIgYnVmWzFdOworCisJLyogRG8gbm90IHJlZW5hYmxlIHRoZSBicmVha3BvaW50IGlmIHRoZSBzaGFyZWQgbGlicmFyeQorCSAgIGlzIHN0aWxsIG5vdCBtYXBwZWQgaW4uICAqLworCWlmICh0YXJnZXRfcmVhZF9tZW1vcnkgKGItPmFkZHJlc3MsIGJ1ZiwgMSkgPT0gMCkKKwkgIGItPmVuYWJsZSA9IGVuYWJsZWQ7CisgICAgICB9Cit9CisKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorY3JlYXRlX3NvbGliX2xvYWRfdW5sb2FkX2V2ZW50X2JyZWFrcG9pbnQgKGhvb2tuYW1lLCB0ZW1wZmxhZywgZGxsX3BhdGhuYW1lLCBjb25kX3N0cmluZywgYnBfa2luZCkKKyAgY2hhciAqICBob29rbmFtZTsKKyAgaW50ICB0ZW1wZmxhZzsKKyAgY2hhciAqICBkbGxfcGF0aG5hbWU7CisgIGNoYXIgKiAgY29uZF9zdHJpbmc7CisgIGVudW0gYnB0eXBlICBicF9raW5kOworeworICBzdHJ1Y3QgYnJlYWtwb2ludCAqICBiOworICBzdHJ1Y3Qgc3ltdGFic19hbmRfbGluZXMgc2FsczsKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSAgc2FsOworICBzdHJ1Y3QgY2xlYW51cCAqICBvbGRfY2hhaW47CisgIHN0cnVjdCBjbGVhbnVwICogIGNhbm9uaWNhbF9zdHJpbmdzX2NoYWluID0gTlVMTDsKKyAgaW50ICBpOworICBjaGFyICogIGFkZHJfc3RhcnQgPSBob29rbmFtZTsKKyAgY2hhciAqICBhZGRyX2VuZCA9IE5VTEw7CisgIGNoYXIgKiogIGNhbm9uaWNhbCA9IChjaGFyICoqKSBOVUxMOworICBpbnQgIHRocmVhZCA9IC0xOyAgLyogQWxsIHRocmVhZHMuICovCisgCisgIC8qIFNldCBhIGJyZWFrcG9pbnQgb24gdGhlIHNwZWNpZmllZCBob29rLiAqLworICBzYWxzID0gZGVjb2RlX2xpbmVfMSAoJmhvb2tuYW1lLCAxLCAoc3RydWN0IHN5bXRhYiAqKSBOVUxMLCAwLCAmY2Fub25pY2FsKTsKKyAgYWRkcl9lbmQgPSBob29rbmFtZTsKKyAKKyAgaWYgKHNhbHMubmVsdHMgPT0gMCkKKyAgICB7CisgICAgICB3YXJuaW5nICgiVW5hYmxlIHRvIHNldCBhIGJyZWFrcG9pbnQgb24gZHluYW1pYyBsaW5rZXIgY2FsbGJhY2suIik7CisgICAgICB3YXJuaW5nICgiU3VnZ2VzdCBsaW5raW5nIHdpdGggL29wdC9sYW5ndG9vbHMvbGliL2VuZC5vLiIpOworICAgICAgd2FybmluZyAoIkdEQiB3aWxsIGJlIHVuYWJsZSB0byB0cmFjayBzaGxfbG9hZC9zaGxfdW5sb2FkIGNhbGxzIik7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoc2Fscy5uZWx0cyAhPSAxKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJVbmFibGUgdG8gc2V0IGEgdW5pcXVlIGJyZWFrcG9pbnQgb24gZHluYW1pYyBsaW5rZXIgY2FsbGJhY2suIik7CisgICAgICB3YXJuaW5nICgiR0RCIHdpbGwgYmUgdW5hYmxlIHRvIHRyYWNrIHNobF9sb2FkL3NobF91bmxvYWQgY2FsbHMiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogTWFrZSBzdXJlIHRoYXQgYWxsIHN0b3JhZ2UgYWxsb2NhdGVkIGluIGRlY29kZV9saW5lXzEgZ2V0cyBmcmVlZCBpbiBjYXNlCisgICAgIHRoZSBmb2xsb3dpbmcgZXJyb3JzIG91dC4gICovCisgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoZnJlZSwgc2Fscy5zYWxzKTsKKyAgaWYgKGNhbm9uaWNhbCAhPSAoY2hhciAqKilOVUxMKQorICAgIHsKKyAgICAgIG1ha2VfY2xlYW51cCAoZnJlZSwgY2Fub25pY2FsKTsKKyAgICAgIGNhbm9uaWNhbF9zdHJpbmdzX2NoYWluID0gbWFrZV9jbGVhbnVwIChudWxsX2NsZWFudXAsIDApOworICAgICAgaWYgKGNhbm9uaWNhbFswXSAhPSBOVUxMKQorICAgICAgICBtYWtlX2NsZWFudXAgKGZyZWUsIGNhbm9uaWNhbFswXSk7CisgICAgfQorIAorICByZXNvbHZlX3NhbF9wYyAoJnNhbHMuc2Fsc1swXSk7CisgCisgIC8qIFJlbW92ZSB0aGUgY2Fub25pY2FsIHN0cmluZ3MgZnJvbSB0aGUgY2xlYW51cCwgdGhleSBhcmUgbmVlZGVkIGJlbG93LiAgKi8KKyAgaWYgKGNhbm9uaWNhbCAhPSAoY2hhciAqKilOVUxMKQorICAgIGRpc2NhcmRfY2xlYW51cHMgKGNhbm9uaWNhbF9zdHJpbmdzX2NoYWluKTsKKyAKKyAgYiA9IHNldF9yYXdfYnJlYWtwb2ludCAoc2Fscy5zYWxzWzBdKTsKKyAgc2V0X2JyZWFrcG9pbnRfY291bnQgKGJyZWFrcG9pbnRfY291bnQgKyAxKTsKKyAgYi0+bnVtYmVyID0gYnJlYWtwb2ludF9jb3VudDsKKyAgYi0+Y29uZCA9IE5VTEw7CisgIGItPmNvbmRfc3RyaW5nID0gKGNvbmRfc3RyaW5nID09IE5VTEwpID8gTlVMTCA6IHNhdmVzdHJpbmcgKGNvbmRfc3RyaW5nLCBzdHJsZW4gKGNvbmRfc3RyaW5nKSk7CisgIGItPnRocmVhZCA9IHRocmVhZDsKKyAKKyAgaWYgKGNhbm9uaWNhbCAhPSAoY2hhciAqKilOVUxMICYmIGNhbm9uaWNhbFswXSAhPSBOVUxMKQorICAgIGItPmFkZHJfc3RyaW5nID0gY2Fub25pY2FsWzBdOworICBlbHNlIGlmIChhZGRyX3N0YXJ0KQorICAgIGItPmFkZHJfc3RyaW5nID0gc2F2ZXN0cmluZyAoYWRkcl9zdGFydCwgYWRkcl9lbmQgLSBhZGRyX3N0YXJ0KTsKKyAKKyAgYi0+ZW5hYmxlID0gZW5hYmxlZDsKKyAgYi0+ZGlzcG9zaXRpb24gPSB0ZW1wZmxhZyA/IGRlbCA6IGRvbnR0b3VjaDsKKyAKKyAgaWYgKGRsbF9wYXRobmFtZSA9PSBOVUxMKQorICAgIGItPmRsbF9wYXRobmFtZSA9IE5VTEw7CisgIGVsc2UKKyAgICB7CisgICAgICBiLT5kbGxfcGF0aG5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGRsbF9wYXRobmFtZSkgKyAxKTsKKyAgICAgIHN0cmNweSAoYi0+ZGxsX3BhdGhuYW1lLCBkbGxfcGF0aG5hbWUpOworICAgIH0KKyAgYi0+dHlwZSA9IGJwX2tpbmQ7CisgCisgIG1lbnRpb24gKGIpOworICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKK30KKwordm9pZAorY3JlYXRlX3NvbGliX2xvYWRfZXZlbnRfYnJlYWtwb2ludCAoaG9va25hbWUsIHRlbXBmbGFnLCBkbGxfcGF0aG5hbWUsIGNvbmRfc3RyaW5nKQorICBjaGFyICogIGhvb2tuYW1lOworICBpbnQgIHRlbXBmbGFnOworICBjaGFyICogIGRsbF9wYXRobmFtZTsKKyAgY2hhciAqICBjb25kX3N0cmluZzsKK3sKKyAgY3JlYXRlX3NvbGliX2xvYWRfdW5sb2FkX2V2ZW50X2JyZWFrcG9pbnQgKGhvb2tuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGxfcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwX2NhdGNoX2xvYWQpOworfQorCit2b2lkCitjcmVhdGVfc29saWJfdW5sb2FkX2V2ZW50X2JyZWFrcG9pbnQgKGhvb2tuYW1lLCB0ZW1wZmxhZywgZGxsX3BhdGhuYW1lLCBjb25kX3N0cmluZykKKyAgY2hhciAqICBob29rbmFtZTsKKyAgaW50ICB0ZW1wZmxhZzsKKyAgY2hhciAqICBkbGxfcGF0aG5hbWU7CisgIGNoYXIgKiAgY29uZF9zdHJpbmc7Cit7CisgIGNyZWF0ZV9zb2xpYl9sb2FkX3VubG9hZF9ldmVudF9icmVha3BvaW50IChob29rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGxsX3BhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZF9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicF9jYXRjaF91bmxvYWQpOworfQorCitzdGF0aWMgdm9pZAorY3JlYXRlX2ZvcmtfdmZvcmtfZXZlbnRfY2F0Y2hwb2ludCAodGVtcGZsYWcsIGNvbmRfc3RyaW5nLCBicF9raW5kKQorICBpbnQgIHRlbXBmbGFnOworICBjaGFyICogIGNvbmRfc3RyaW5nOworICBlbnVtIGJwdHlwZSAgYnBfa2luZDsKK3sKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSAgc2FsOworICBzdHJ1Y3QgYnJlYWtwb2ludCAqICBiOworICBpbnQgIHRocmVhZCA9IC0xOyAgLyogQWxsIHRocmVhZHMuICovCisgCisgIElOSVRfU0FMKCZzYWwpOworICBzYWwucGMgPSAwOworICBzYWwuc3ltdGFiID0gTlVMTDsKKyAgc2FsLmxpbmUgPSAwOworIAorICBiID0gc2V0X3Jhd19icmVha3BvaW50IChzYWwpOworICBzZXRfYnJlYWtwb2ludF9jb3VudCAoYnJlYWtwb2ludF9jb3VudCArIDEpOworICBiLT5udW1iZXIgPSBicmVha3BvaW50X2NvdW50OworICBiLT5jb25kID0gTlVMTDsKKyAgYi0+Y29uZF9zdHJpbmcgPSAoY29uZF9zdHJpbmcgPT0gTlVMTCkgPyBOVUxMIDogc2F2ZXN0cmluZyAoY29uZF9zdHJpbmcsIHN0cmxlbiAoY29uZF9zdHJpbmcpKTsKKyAgYi0+dGhyZWFkID0gdGhyZWFkOworICBiLT5hZGRyX3N0cmluZyA9IE5VTEw7CisgIGItPmVuYWJsZSA9IGVuYWJsZWQ7CisgIGItPmRpc3Bvc2l0aW9uID0gdGVtcGZsYWcgPyBkZWwgOiBkb250dG91Y2g7CisgIGItPmZvcmtlZF9pbmZlcmlvcl9waWQgPSAwOworIAorICBiLT50eXBlID0gYnBfa2luZDsKKyAKKyAgbWVudGlvbiAoYik7Cit9CisKK3ZvaWQKK2NyZWF0ZV9mb3JrX2V2ZW50X2NhdGNocG9pbnQgKHRlbXBmbGFnLCBjb25kX3N0cmluZykKKyAgaW50ICB0ZW1wZmxhZzsKKyAgY2hhciAqICBjb25kX3N0cmluZzsKK3sKKyAgY3JlYXRlX2ZvcmtfdmZvcmtfZXZlbnRfY2F0Y2hwb2ludCAodGVtcGZsYWcsIGNvbmRfc3RyaW5nLCBicF9jYXRjaF9mb3JrKTsKK30KKyAKK3ZvaWQKK2NyZWF0ZV92Zm9ya19ldmVudF9jYXRjaHBvaW50ICh0ZW1wZmxhZywgY29uZF9zdHJpbmcpCisgIGludCAgdGVtcGZsYWc7CisgIGNoYXIgKiAgY29uZF9zdHJpbmc7Cit7CisgIGNyZWF0ZV9mb3JrX3Zmb3JrX2V2ZW50X2NhdGNocG9pbnQgKHRlbXBmbGFnLCBjb25kX3N0cmluZywgYnBfY2F0Y2hfdmZvcmspOworfQorCit2b2lkCitjcmVhdGVfZXhlY19ldmVudF9jYXRjaHBvaW50ICh0ZW1wZmxhZywgY29uZF9zdHJpbmcpCisgIGludCAgdGVtcGZsYWc7CisgIGNoYXIgKiAgY29uZF9zdHJpbmc7Cit7CisgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgIHNhbDsKKyAgc3RydWN0IGJyZWFrcG9pbnQgKiAgYjsKKyAgaW50ICB0aHJlYWQgPSAtMTsgIC8qIEFsbCB0aHJlYWRzLiAqLworCisgIElOSVRfU0FMKCZzYWwpOworICBzYWwucGMgPSAwOworICBzYWwuc3ltdGFiID0gTlVMTDsKKyAgc2FsLmxpbmUgPSAwOworCisgIGIgPSBzZXRfcmF3X2JyZWFrcG9pbnQgKHNhbCk7CisgIHNldF9icmVha3BvaW50X2NvdW50IChicmVha3BvaW50X2NvdW50ICsgMSk7CisgIGItPm51bWJlciA9IGJyZWFrcG9pbnRfY291bnQ7CisgIGItPmNvbmQgPSBOVUxMOworICBiLT5jb25kX3N0cmluZyA9IChjb25kX3N0cmluZyA9PSBOVUxMKSA/IE5VTEwgOiBzYXZlc3RyaW5nIChjb25kX3N0cmluZywgc3RybGVuIChjb25kX3N0cmluZykpOworICBiLT50aHJlYWQgPSB0aHJlYWQ7CisgIGItPmFkZHJfc3RyaW5nID0gTlVMTDsKKyAgYi0+ZW5hYmxlID0gZW5hYmxlZDsKKyAgYi0+ZGlzcG9zaXRpb24gPSB0ZW1wZmxhZyA/IGRlbCA6IGRvbnR0b3VjaDsKKworICBiLT50eXBlID0gYnBfY2F0Y2hfZXhlYzsKKworICBtZW50aW9uIChiKTsKK30KKworc3RhdGljIGludAoraHdfYnJlYWtwb2ludF91c2VkX2NvdW50KCkKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGJyZWFrcG9pbnQgKmI7CisgIGludCBpID0gMDsKKworICBBTExfQlJFQUtQT0lOVFMgKGIpCisgICAgeworICAgICAgaWYgKGItPnR5cGUgPT0gYnBfaGFyZHdhcmVfYnJlYWtwb2ludCAmJiBiLT5lbmFibGUgPT0gZW5hYmxlZCkKKwlpKys7CisgICAgfQorCisgIHJldHVybiBpOworfQorCitzdGF0aWMgaW50Citod193YXRjaHBvaW50X3VzZWRfY291bnQodHlwZSwgb3RoZXJfdHlwZV91c2VkKQorICAgIGVudW0gYnB0eXBlIHR5cGU7CisgICAgaW50ICpvdGhlcl90eXBlX3VzZWQ7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBicmVha3BvaW50ICpiOworICBpbnQgaSA9IDA7CisKKyAgKm90aGVyX3R5cGVfdXNlZCA9IDA7CisgIEFMTF9CUkVBS1BPSU5UUyAoYikKKyAgICB7CisgICAgICBpZiAoYi0+ZW5hYmxlID09IGVuYWJsZWQpCisJeworICAgICAgICAgIGlmIChiLT50eXBlID09IHR5cGUpIGkrKzsKKyAgICAgICAgICBlbHNlIGlmICgoYi0+dHlwZSA9PSBicF9oYXJkd2FyZV93YXRjaHBvaW50IHx8CisJICAgICAgIGItPnR5cGUgPT0gYnBfcmVhZF93YXRjaHBvaW50IHx8CisJICAgICAgIGItPnR5cGUgPT0gYnBfYWNjZXNzX3dhdGNocG9pbnQpCisJICAgICAgICYmIGItPmVuYWJsZSA9PSBlbmFibGVkKQorCSAgICAqb3RoZXJfdHlwZV91c2VkID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgcmV0dXJuIGk7Cit9CisKKy8qIENhbGwgdGhpcyBhZnRlciBoaXR0aW5nIHRoZSBsb25nam1wKCkgYnJlYWtwb2ludC4gIFVzZSB0aGlzIHRvIHNldCBhIG5ldworICAgYnJlYWtwb2ludCBhdCB0aGUgdGFyZ2V0IG9mIHRoZSBqbXBfYnVmLgorCisgICBGSVhNRSAtIFRoaXMgb3VnaHQgdG8gYmUgZG9uZSBieSBzZXR0aW5nIGEgdGVtcG9yYXJ5IGJyZWFrcG9pbnQgdGhhdCBnZXRzCisgICBkZWxldGVkIGF1dG9tYXRpY2FsbHkuLi4gKi8KKwordm9pZAorc2V0X2xvbmdqbXBfcmVzdW1lX2JyZWFrcG9pbnQocGMsIGZyYW1lKQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGJyZWFrcG9pbnQgKmI7CisKKyAgQUxMX0JSRUFLUE9JTlRTIChiKQorICAgIGlmIChiLT50eXBlID09IGJwX2xvbmdqbXBfcmVzdW1lKQorICAgICAgeworCWItPmFkZHJlc3MgPSBwYzsKKwliLT5lbmFibGUgPSBlbmFibGVkOworCWlmIChmcmFtZSAhPSBOVUxMKQorCSAgYi0+ZnJhbWUgPSBmcmFtZS0+ZnJhbWU7CisJZWxzZQorCSAgYi0+ZnJhbWUgPSAwOworCWNoZWNrX2R1cGxpY2F0ZXMgKGItPmFkZHJlc3MsIGItPnNlY3Rpb24pOworCXJldHVybjsKKyAgICAgIH0KK30KKwordm9pZAorZGlzYWJsZV93YXRjaHBvaW50c19iZWZvcmVfaW50ZXJhY3RpdmVfY2FsbF9zdGFydCAoKQoreworICBzdHJ1Y3QgYnJlYWtwb2ludCAqICBiOworCisgIEFMTF9CUkVBS1BPSU5UUyAoYikKKyAgICB7CisgICAgICBpZiAoKChiLT50eXBlID09IGJwX3dhdGNocG9pbnQpCisgICAgICAgICAgIHx8IChiLT50eXBlID09IGJwX2hhcmR3YXJlX3dhdGNocG9pbnQpCisgICAgICAgICAgIHx8IChiLT50eXBlID09IGJwX3JlYWRfd2F0Y2hwb2ludCkKKyAgICAgICAgICAgfHwgKGItPnR5cGUgPT0gYnBfYWNjZXNzX3dhdGNocG9pbnQpCisgICAgICAgICAgIHx8IGVwX2lzX2V4Y2VwdGlvbl9jYXRjaHBvaW50IChiKSkKKyAgICAgICAgICAmJiAoYi0+ZW5hYmxlID09IGVuYWJsZWQpKQorICAgICAgICB7CisgICAgICAgICAgYi0+ZW5hYmxlID0gY2FsbF9kaXNhYmxlZDsKKyAgICAgICAgICBjaGVja19kdXBsaWNhdGVzIChiLT5hZGRyZXNzLCBiLT5zZWN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZAorZW5hYmxlX3dhdGNocG9pbnRzX2FmdGVyX2ludGVyYWN0aXZlX2NhbGxfc3RvcCAoKQoreworICBzdHJ1Y3QgYnJlYWtwb2ludCAqICBiOworCisgIEFMTF9CUkVBS1BPSU5UUyAoYikKKyAgICB7CisgICAgICBpZiAoKChiLT50eXBlID09IGJwX3dhdGNocG9pbnQpCisgICAgICAgICAgIHx8IChiLT50eXBlID09IGJwX2hhcmR3YXJlX3dhdGNocG9pbnQpCisgICAgICAgICAgIHx8IChiLT50eXBlID09IGJwX3JlYWRfd2F0Y2hwb2ludCkKKyAgICAgICAgICAgfHwgKGItPnR5cGUgPT0gYnBfYWNjZXNzX3dhdGNocG9pbnQpCisgICAgICAgICAgIHx8IGVwX2lzX2V4Y2VwdGlvbl9jYXRjaHBvaW50IChiKSkKKyAgICAgICAgICAmJiAoYi0+ZW5hYmxlID09IGNhbGxfZGlzYWJsZWQpKQorICAgICAgICB7CisgICAgICAgICAgYi0+ZW5hYmxlID0gZW5hYmxlZDsKKyAgICAgICAgICBjaGVja19kdXBsaWNhdGVzIChiLT5hZGRyZXNzLCBiLT5zZWN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvKiBTZXQgYSBicmVha3BvaW50IHRoYXQgd2lsbCBldmFwb3JhdGUgYW4gZW5kIG9mIGNvbW1hbmQKKyAgIGF0IGFkZHJlc3Mgc3BlY2lmaWVkIGJ5IFNBTC4KKyAgIFJlc3RyaWN0IGl0IHRvIGZyYW1lIEZSQU1FIGlmIEZSQU1FIGlzIG5vbnplcm8uICAqLworCitzdHJ1Y3QgYnJlYWtwb2ludCAqCitzZXRfbW9tZW50YXJ5X2JyZWFrcG9pbnQgKHNhbCwgZnJhbWUsIHR5cGUpCisgICAgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOworICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7CisgICAgIGVudW0gYnB0eXBlIHR5cGU7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBicmVha3BvaW50ICpiOworICBiID0gc2V0X3Jhd19icmVha3BvaW50IChzYWwpOworICBiLT50eXBlID0gdHlwZTsKKyAgYi0+ZW5hYmxlID0gZW5hYmxlZDsKKyAgYi0+ZGlzcG9zaXRpb24gPSBkb250dG91Y2g7CisgIGItPmZyYW1lID0gKGZyYW1lID8gZnJhbWUtPmZyYW1lIDogMCk7CisKKyAgLyogSWYgd2UncmUgZGVidWdnaW5nIGEgbXVsdGktdGhyZWFkZWQgcHJvZ3JhbSwgdGhlbiB3ZQorICAgICB3YW50IG1vbWVudGFyeSBicmVha3BvaW50cyB0byBiZSBhY3RpdmUgaW4gb25seSBhIAorICAgICBzaW5nbGUgdGhyZWFkIG9mIGNvbnRyb2wuICAqLworICBpZiAoaW5fdGhyZWFkX2xpc3QgKGluZmVyaW9yX3BpZCkpCisgICAgYi0+dGhyZWFkID0gcGlkX3RvX3RocmVhZF9pZCAoaW5mZXJpb3JfcGlkKTsKKworICByZXR1cm4gYjsKK30KKworDAorLyogVGVsbCB0aGUgdXNlciB3ZSBoYXZlIGp1c3Qgc2V0IGEgYnJlYWtwb2ludCBCLiAgKi8KKworc3RhdGljIHZvaWQKK21lbnRpb24gKGIpCisgICAgIHN0cnVjdCBicmVha3BvaW50ICpiOworeworICBpbnQgc2F5X3doZXJlID0gMDsKKworICAvKiBGSVhNRTogVGhpcyBpcyBtaXNwbGFjZWQ7IG1lbnRpb24oKSBpcyBjYWxsZWQgYnkgdGhpbmdzIChsaWtlIGhpdHRpbmcgYQorICAgICB3YXRjaHBvaW50KSBvdGhlciB0aGFuIGJyZWFrcG9pbnQgY3JlYXRpb24uICBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8KKyAgICAgY2xlYW4gdGhpcyB1cCBhbmQgYXQgdGhlIHNhbWUgdGltZSByZXBsYWNlIHRoZSByYW5kb20gY2FsbHMgdG8KKyAgICAgYnJlYWtwb2ludF9jaGFuZ2VkIHdpdGggdGhpcyBob29rLCBhcyBoYXMgYWxyZWFkeSBiZWVuIGRvbmUgZm9yCisgICAgIGRlbGV0ZV9icmVha3BvaW50X2hvb2sgYW5kIHNvIG9uLiAgKi8KKyAgaWYgKGNyZWF0ZV9icmVha3BvaW50X2hvb2spCisgICAgY3JlYXRlX2JyZWFrcG9pbnRfaG9vayAoYik7CisKKyAgc3dpdGNoIChiLT50eXBlKQorICAgIHsKKyAgICBjYXNlIGJwX25vbmU6CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIoYXBwYXJlbnRseSBkZWxldGVkPykgRXZlbnRwb2ludCAlZDogIiwgYi0+bnVtYmVyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYnBfd2F0Y2hwb2ludDoKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIldhdGNocG9pbnQgJWQ6ICIsIGItPm51bWJlcik7CisgICAgICBwcmludF9leHByZXNzaW9uIChiLT5leHAsIGdkYl9zdGRvdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBicF9oYXJkd2FyZV93YXRjaHBvaW50OgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiSGFyZHdhcmUgd2F0Y2hwb2ludCAlZDogIiwgYi0+bnVtYmVyKTsKKyAgICAgIHByaW50X2V4cHJlc3Npb24gKGItPmV4cCwgZ2RiX3N0ZG91dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJwX3JlYWRfd2F0Y2hwb2ludDoKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkhhcmR3YXJlIHJlYWQgd2F0Y2hwb2ludCAlZDogIiwgYi0+bnVtYmVyKTsKKyAgICAgIHByaW50X2V4cHJlc3Npb24gKGItPmV4cCwgZ2RiX3N0ZG91dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJwX2FjY2Vzc193YXRjaHBvaW50OgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiSGFyZHdhcmUgYWNjZXNzIChyZWFkL3dyaXRlKSB3YXRjaHBvaW50ICVkOiAiLGItPm51bWJlcik7CisgICAgICBwcmludF9leHByZXNzaW9uIChiLT5leHAsIGdkYl9zdGRvdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBicF9icmVha3BvaW50OgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiQnJlYWtwb2ludCAlZCIsIGItPm51bWJlcik7CisgICAgICBzYXlfd2hlcmUgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBicF9oYXJkd2FyZV9icmVha3BvaW50OgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiSGFyZHdhcmUgYXNzaXN0ZWQgYnJlYWtwb2ludCAlZCIsIGItPm51bWJlcik7CisgICAgICBzYXlfd2hlcmUgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBicF9jYXRjaF9sb2FkOgorICAgIGNhc2UgYnBfY2F0Y2hfdW5sb2FkOgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiQ2F0Y2hwb2ludCAlZCAoJXMgJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYi0+bnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAoYi0+dHlwZSA9PSBicF9jYXRjaF9sb2FkKSA/ICJsb2FkIiA6ICJ1bmxvYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAoYi0+ZGxsX3BhdGhuYW1lICE9IE5VTEwpID8gYi0+ZGxsX3BhdGhuYW1lIDogIjxhbnkgbGlicmFyeT4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYnBfY2F0Y2hfZm9yazoKKyAgICBjYXNlIGJwX2NhdGNoX3Zmb3JrOgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiQ2F0Y2hwb2ludCAlZCAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYi0+bnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAoYi0+dHlwZSA9PSBicF9jYXRjaF9mb3JrKSA/ICJmb3JrIiA6ICJ2Zm9yayIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBicF9jYXRjaF9leGVjOgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiQ2F0Y2hwb2ludCAlZCAoZXhlYykiLAorICAgICAgICAgICAgICAgICAgICAgICBiLT5udW1iZXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBicF9jYXRjaF9jYXRjaDoKKyAgICBjYXNlIGJwX2NhdGNoX3Rocm93OgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiQ2F0Y2hwb2ludCAlZCAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYi0+bnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAoYi0+dHlwZSA9PSBicF9jYXRjaF9jYXRjaCkgPyAiY2F0Y2giIDogInRocm93Iik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYnBfdW50aWw6CisgICAgY2FzZSBicF9maW5pc2g6CisgICAgY2FzZSBicF9sb25nam1wOgorICAgIGNhc2UgYnBfbG9uZ2ptcF9yZXN1bWU6CisgICAgY2FzZSBicF9zdGVwX3Jlc3VtZToKKyAgICBjYXNlIGJwX3Rocm91Z2hfc2lndHJhbXA6CisgICAgY2FzZSBicF9jYWxsX2R1bW15OgorICAgIGNhc2UgYnBfd2F0Y2hwb2ludF9zY29wZToKKyAgICBjYXNlIGJwX3NobGliX2V2ZW50OgorICAgICAgYnJlYWs7CisgICAgfQorICBpZiAoc2F5X3doZXJlKQorICAgIHsKKyAgICAgIGlmIChhZGRyZXNzcHJpbnQgfHwgYi0+c291cmNlX2ZpbGUgPT0gTlVMTCkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCIgYXQgIik7CisJICBwcmludF9hZGRyZXNzX251bWVyaWMgKGItPmFkZHJlc3MsIDEsIGdkYl9zdGRvdXQpOworCX0KKyAgICAgIGlmIChiLT5zb3VyY2VfZmlsZSkKKwlwcmludGZfZmlsdGVyZWQgKCI6IGZpbGUgJXMsIGxpbmUgJWQuIiwKKwkJCSBiLT5zb3VyY2VfZmlsZSwgYi0+bGluZV9udW1iZXIpOworICAgICAgVFVJRE8oKChUdWlPcGFxdWVGdW5jUHRyKXR1aV92QWxsU2V0SGFzQnJlYWtBdCwgYiwgMSkpOworICAgICAgVFVJRE8oKChUdWlPcGFxdWVGdW5jUHRyKXR1aVVwZGF0ZUFsbEV4ZWNJbmZvcykpOworICAgIH0KKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKK30KKworDAorLyogU2V0IGEgYnJlYWtwb2ludCBhY2NvcmRpbmcgdG8gQVJHIChmdW5jdGlvbiwgbGluZW51bSBvciAqYWRkcmVzcykKKyAgIGZsYWc6IGZpcnN0IGJpdCAgOiAwIG5vbi10ZW1wb3JhcnksIDEgdGVtcG9yYXJ5LgorCSBzZWNvbmQgYml0IDogMCBub3JtYWwgYnJlYWtwb2ludCwgMSBoYXJkd2FyZSBicmVha3BvaW50LiAqLworCitzdGF0aWMgdm9pZAorYnJlYWtfY29tbWFuZF8xIChhcmcsIGZsYWcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmbGFnLCBmcm9tX3R0eTsKK3sKKyAgaW50IHRlbXBmbGFnLCBoYXJkd2FyZWZsYWc7CisgIHN0cnVjdCBzeW10YWJzX2FuZF9saW5lcyBzYWxzOworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKyAgcmVnaXN0ZXIgc3RydWN0IGV4cHJlc3Npb24gKmNvbmQgPSAwOworICByZWdpc3RlciBzdHJ1Y3QgYnJlYWtwb2ludCAqYjsKKworICAvKiBQb2ludGVycyBpbiBhcmcgdG8gdGhlIHN0YXJ0LCBhbmQgb25lIHBhc3QgdGhlIGVuZCwgb2YgdGhlIGNvbmRpdGlvbi4gICovCisgIGNoYXIgKmNvbmRfc3RhcnQgPSBOVUxMOworICBjaGFyICpjb25kX2VuZCA9IE5VTEw7CisgIC8qIFBvaW50ZXJzIGluIGFyZyB0byB0aGUgc3RhcnQsIGFuZCBvbmUgcGFzdCB0aGUgZW5kLAorICAgICBvZiB0aGUgYWRkcmVzcyBwYXJ0LiAgKi8KKyAgY2hhciAqYWRkcl9zdGFydCA9IE5VTEw7CisgIGNoYXIgKmFkZHJfZW5kID0gTlVMTDsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKyAgc3RydWN0IGNsZWFudXAgKmNhbm9uaWNhbF9zdHJpbmdzX2NoYWluID0gTlVMTDsKKyAgY2hhciAqKmNhbm9uaWNhbCA9IChjaGFyICoqKU5VTEw7CisgIGludCBpOworICBpbnQgdGhyZWFkOworCisgIGhhcmR3YXJlZmxhZyA9IGZsYWcgJiBCUF9IQVJEV0FSRUZMQUc7CisgIHRlbXBmbGFnID0gZmxhZyAmIEJQX1RFTVBGTEFHOworCisgIHNhbHMuc2FscyA9IE5VTEw7CisgIHNhbHMubmVsdHMgPSAwOworCisgIElOSVRfU0FMICgmc2FsKTsJLyogaW5pdGlhbGl6ZSB0byB6ZXJvZXMgKi8KKworICAvKiBJZiBubyBhcmcgZ2l2ZW4sIG9yIGlmIGZpcnN0IGFyZyBpcyAnaWYgJywgdXNlIHRoZSBkZWZhdWx0IGJyZWFrcG9pbnQuICovCisKKyAgaWYgKCFhcmcgfHwgKGFyZ1swXSA9PSAnaScgJiYgYXJnWzFdID09ICdmJyAKKwkgICAgICAgJiYgKGFyZ1syXSA9PSAnICcgfHwgYXJnWzJdID09ICdcdCcpKSkKKyAgICB7CisgICAgICBpZiAoZGVmYXVsdF9icmVha3BvaW50X3ZhbGlkKQorCXsKKwkgIHNhbHMuc2FscyA9IChzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lICopIAorCSAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUpKTsKKwkgIHNhbC5wYyA9IGRlZmF1bHRfYnJlYWtwb2ludF9hZGRyZXNzOworCSAgc2FsLmxpbmUgPSBkZWZhdWx0X2JyZWFrcG9pbnRfbGluZTsKKwkgIHNhbC5zeW10YWIgPSBkZWZhdWx0X2JyZWFrcG9pbnRfc3ltdGFiOworCSAgc2FsLnNlY3Rpb24gID0gZmluZF9wY19vdmVybGF5IChzYWwucGMpOworCSAgc2Fscy5zYWxzWzBdID0gc2FsOworCSAgc2Fscy5uZWx0cyA9IDE7CisJfQorICAgICAgZWxzZQorCWVycm9yICgiTm8gZGVmYXVsdCBicmVha3BvaW50IGFkZHJlc3Mgbm93LiIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFkZHJfc3RhcnQgPSBhcmc7CisKKyAgICAgIC8qIEZvcmNlIGFsbW9zdCBhbGwgYnJlYWtwb2ludHMgdG8gYmUgaW4gdGVybXMgb2YgdGhlCisJIGN1cnJlbnRfc291cmNlX3N5bXRhYiAod2hpY2ggaXMgZGVjb2RlX2xpbmVfMSdzIGRlZmF1bHQpLiAgVGhpcworCSBzaG91bGQgcHJvZHVjZSB0aGUgcmVzdWx0cyB3ZSB3YW50IGFsbW9zdCBhbGwgb2YgdGhlIHRpbWUgd2hpbGUKKwkgbGVhdmluZyBkZWZhdWx0X2JyZWFrcG9pbnRfKiBhbG9uZS4gICovCisgICAgICBpZiAoZGVmYXVsdF9icmVha3BvaW50X3ZhbGlkCisJICAmJiAoIWN1cnJlbnRfc291cmNlX3N5bXRhYgorCSAgICAgIHx8IChhcmcgJiYgKCphcmcgPT0gJysnIHx8ICphcmcgPT0gJy0nKSkpKQorCXNhbHMgPSBkZWNvZGVfbGluZV8xICgmYXJnLCAxLCBkZWZhdWx0X2JyZWFrcG9pbnRfc3ltdGFiLAorCQkJICAgICAgZGVmYXVsdF9icmVha3BvaW50X2xpbmUsICZjYW5vbmljYWwpOworICAgICAgZWxzZQorCXNhbHMgPSBkZWNvZGVfbGluZV8xICgmYXJnLCAxLCAoc3RydWN0IHN5bXRhYiAqKU5VTEwsIDAsICZjYW5vbmljYWwpOworCisgICAgICBhZGRyX2VuZCA9IGFyZzsKKyAgICB9CisgIAorICBpZiAoISBzYWxzLm5lbHRzKSAKKyAgICByZXR1cm47CisKKyAgLyogTWFrZSBzdXJlIHRoYXQgYWxsIHN0b3JhZ2UgYWxsb2NhdGVkIGluIGRlY29kZV9saW5lXzEgZ2V0cyBmcmVlZCBpbiBjYXNlCisgICAgIHRoZSBmb2xsb3dpbmcgYGZvcicgbG9vcCBlcnJvcnMgb3V0LiAgKi8KKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwIChmcmVlLCBzYWxzLnNhbHMpOworICBpZiAoY2Fub25pY2FsICE9IChjaGFyICoqKU5VTEwpCisgICAgeworICAgICAgbWFrZV9jbGVhbnVwIChmcmVlLCBjYW5vbmljYWwpOworICAgICAgY2Fub25pY2FsX3N0cmluZ3NfY2hhaW4gPSBtYWtlX2NsZWFudXAgKG51bGxfY2xlYW51cCwgMCk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2Fscy5uZWx0czsgaSsrKQorCXsKKwkgIGlmIChjYW5vbmljYWxbaV0gIT0gTlVMTCkKKwkgICAgbWFrZV9jbGVhbnVwIChmcmVlLCBjYW5vbmljYWxbaV0pOworCX0KKyAgICB9CisKKyAgdGhyZWFkID0gLTE7CQkJLyogTm8gc3BlY2lmaWMgdGhyZWFkIHlldCAqLworCisgIC8qIFJlc29sdmUgYWxsIGxpbmUgbnVtYmVycyB0byBQQydzLCBhbmQgdmVyaWZ5IHRoYXQgY29uZGl0aW9ucworICAgICBjYW4gYmUgcGFyc2VkLCBiZWZvcmUgc2V0dGluZyBhbnkgYnJlYWtwb2ludHMuICAqLworICBmb3IgKGkgPSAwOyBpIDwgc2Fscy5uZWx0czsgaSsrKQorICAgIHsKKyAgICAgIGNoYXIgKnRvaywgKmVuZF90b2s7CisgICAgICBpbnQgdG9rbGVuOworCisgICAgICByZXNvbHZlX3NhbF9wYyAoJnNhbHMuc2Fsc1tpXSk7CisKKyAgICAgIC8qIEl0J3MgcG9zc2libGUgZm9yIHRoZSBQQyB0byBiZSBub256ZXJvLCBidXQgc3RpbGwgYW4gaWxsZWdhbAorICAgICAgICAgdmFsdWUgb24gc29tZSB0YXJnZXRzLgorCisgICAgICAgICBGb3IgZXhhbXBsZSwgb24gSFAtVVggaWYgeW91IHN0YXJ0IGdkYiwgYW5kIGJlZm9yZSBydW5uaW5nIHRoZQorICAgICAgICAgaW5mZXJpb3IgeW91IHRyeSB0byBzZXQgYSBicmVha3BvaW50IG9uIGEgc2hhcmVkIGxpYnJhcnkgZnVuY3Rpb24KKyAgICAgICAgICJmb28iIHdoZXJlIHRoZSBpbmZlcmlvciBkb2Vzbid0IGNhbGwgImZvbyIgZGlyZWN0bHkgYnV0IGRvZXMKKyAgICAgICAgIHBhc3MgaXRzIGFkZHJlc3MgdG8gYW5vdGhlciBmdW5jdGlvbiBjYWxsLCB0aGVuIHdlIGRvIGZpbmQgYQorICAgICAgICAgbWluaW1hbCBzeW1ib2wgZm9yIHRoZSAiZm9vIiwgYnV0IGl0J3MgYWRkcmVzcyBpcyBpbnZhbGlkLgorICAgICAgICAgKEFwcGVhcnMgdG8gYmUgYW4gaW5kZXggaW50byBhIHRhYmxlIHRoYXQgdGhlIGxvYWRlciBzZXRzIHVwCisgICAgICAgICB3aGVuIHRoZSBpbmZlcmlvciBpcyBydW4uKQorCisgICAgICAgICBHaXZlIHRoZSB0YXJnZXQgYSBjaGFuY2UgdG8gYmxlc3Mgc2Fscy5zYWxzW2ldLnBjIGJlZm9yZSB3ZQorICAgICAgICAgdHJ5IHRvIG1ha2UgYSBicmVha3BvaW50IGZvciBpdC4gKi8KKyAgICAgIGlmIChQQ19SRVFVSVJFU19SVU5fQkVGT1JFX1VTRShzYWxzLnNhbHNbaV0ucGMpKQorICAgICAgICB7CisgICAgICAgICAgZXJyb3IgKCJDYW5ub3QgYnJlYWsgb24gJXMgd2l0aG91dCBhIHJ1bm5pbmcgcHJvZ3JhbS4iLCBhZGRyX3N0YXJ0KTsKKyAgICAgICAgfQorICAgICAgCisgICAgICB0b2sgPSBhcmc7CisKKyAgICAgIHdoaWxlICh0b2sgJiYgKnRvaykKKwl7CisJICB3aGlsZSAoKnRvayA9PSAnICcgfHwgKnRvayA9PSAnXHQnKQorCSAgICB0b2srKzsKKworCSAgZW5kX3RvayA9IHRvazsKKworCSAgd2hpbGUgKCplbmRfdG9rICE9ICcgJyAmJiAqZW5kX3RvayAhPSAnXHQnICYmICplbmRfdG9rICE9ICdcMDAwJykKKwkgICAgZW5kX3RvaysrOworCisJICB0b2tsZW4gPSBlbmRfdG9rIC0gdG9rOworCisJICBpZiAodG9rbGVuID49IDEgJiYgc3RybmNtcCAodG9rLCAiaWYiLCB0b2tsZW4pID09IDApCisJICAgIHsKKwkgICAgICB0b2sgPSBjb25kX3N0YXJ0ID0gZW5kX3RvayArIDE7CisJICAgICAgY29uZCA9IHBhcnNlX2V4cF8xICgmdG9rLCBibG9ja19mb3JfcGMgKHNhbHMuc2Fsc1tpXS5wYyksIDApOworCSAgICAgIGNvbmRfZW5kID0gdG9rOworCSAgICB9CisJICBlbHNlIGlmICh0b2tsZW4gPj0gMSAmJiBzdHJuY21wICh0b2ssICJ0aHJlYWQiLCB0b2tsZW4pID09IDApCisJICAgIHsKKwkgICAgICBjaGFyICp0bXB0b2s7CisKKwkgICAgICB0b2sgPSBlbmRfdG9rICsgMTsKKwkgICAgICB0bXB0b2sgPSB0b2s7CisJICAgICAgdGhyZWFkID0gc3RydG9sICh0b2ssICZ0b2ssIDApOworCSAgICAgIGlmICh0b2sgPT0gdG1wdG9rKQorCQllcnJvciAoIkp1bmsgYWZ0ZXIgdGhyZWFkIGtleXdvcmQuIik7CisJICAgICAgaWYgKCF2YWxpZF90aHJlYWRfaWQgKHRocmVhZCkpCisJCWVycm9yICgiVW5rbm93biB0aHJlYWQgJWRcbiIsIHRocmVhZCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgZXJyb3IgKCJKdW5rIGF0IGVuZCBvZiBhcmd1bWVudHMuIik7CisJfQorICAgIH0KKyAgaWYgKGhhcmR3YXJlZmxhZykKKyAgICB7CisgICAgICBpbnQgaSwgdGFyZ2V0X3Jlc291cmNlc19vazsKKworICAgICAgaSA9IGh3X2JyZWFrcG9pbnRfdXNlZF9jb3VudCAoKTsgIAorICAgICAgdGFyZ2V0X3Jlc291cmNlc19vayA9IFRBUkdFVF9DQU5fVVNFX0hBUkRXQVJFX1dBVENIUE9JTlQgKAorCQlicF9oYXJkd2FyZV9icmVha3BvaW50LCBpICsgc2Fscy5uZWx0cywgMCk7CisgICAgICBpZiAodGFyZ2V0X3Jlc291cmNlc19vayA9PSAwKQorCWVycm9yICgiTm8gaGFyZHdhcmUgYnJlYWtwb2ludCBzdXBwb3J0IGluIHRoZSB0YXJnZXQuIik7CisgICAgICBlbHNlIGlmICh0YXJnZXRfcmVzb3VyY2VzX29rIDwgMCkKKyAgICAgICAgZXJyb3IgKCJIYXJkd2FyZSBicmVha3BvaW50cyB1c2VkIGV4Y2VlZHMgbGltaXQuIik7CisgICAgfQorCisgIC8qIFJlbW92ZSB0aGUgY2Fub25pY2FsIHN0cmluZ3MgZnJvbSB0aGUgY2xlYW51cCwgdGhleSBhcmUgbmVlZGVkIGJlbG93LiAgKi8KKyAgaWYgKGNhbm9uaWNhbCAhPSAoY2hhciAqKilOVUxMKQorICAgIGRpc2NhcmRfY2xlYW51cHMgKGNhbm9uaWNhbF9zdHJpbmdzX2NoYWluKTsKKworICAvKiBOb3cgc2V0IGFsbCB0aGUgYnJlYWtwb2ludHMuICAqLworICBmb3IgKGkgPSAwOyBpIDwgc2Fscy5uZWx0czsgaSsrKQorICAgIHsKKyAgICAgIHNhbCA9IHNhbHMuc2Fsc1tpXTsKKworICAgICAgaWYgKGZyb21fdHR5KQorCWRlc2NyaWJlX290aGVyX2JyZWFrcG9pbnRzIChzYWwucGMsIHNhbC5zZWN0aW9uKTsKKworICAgICAgYiA9IHNldF9yYXdfYnJlYWtwb2ludCAoc2FsKTsKKyAgICAgIHNldF9icmVha3BvaW50X2NvdW50IChicmVha3BvaW50X2NvdW50ICsgMSk7CisgICAgICBiLT5udW1iZXIgPSBicmVha3BvaW50X2NvdW50OworICAgICAgYi0+dHlwZSA9IGhhcmR3YXJlZmxhZyA/IGJwX2hhcmR3YXJlX2JyZWFrcG9pbnQgOiBicF9icmVha3BvaW50OworICAgICAgYi0+Y29uZCA9IGNvbmQ7CisgICAgICBiLT50aHJlYWQgPSB0aHJlYWQ7CisKKyAgICAgIC8qIElmIGEgY2Fub25pY2FsIGxpbmUgc3BlYyBpcyBuZWVkZWQgdXNlIHRoYXQgaW5zdGVhZCBvZiB0aGUKKwkgY29tbWFuZCBzdHJpbmcuICAqLworICAgICAgaWYgKGNhbm9uaWNhbCAhPSAoY2hhciAqKilOVUxMICYmIGNhbm9uaWNhbFtpXSAhPSBOVUxMKQorCWItPmFkZHJfc3RyaW5nID0gY2Fub25pY2FsW2ldOworICAgICAgZWxzZSBpZiAoYWRkcl9zdGFydCkKKwliLT5hZGRyX3N0cmluZyA9IHNhdmVzdHJpbmcgKGFkZHJfc3RhcnQsIGFkZHJfZW5kIC0gYWRkcl9zdGFydCk7CisgICAgICBpZiAoY29uZF9zdGFydCkKKwliLT5jb25kX3N0cmluZyA9IHNhdmVzdHJpbmcgKGNvbmRfc3RhcnQsIGNvbmRfZW5kIC0gY29uZF9zdGFydCk7CisJCQkJICAgICAKKyAgICAgIGItPmVuYWJsZSA9IGVuYWJsZWQ7CisgICAgICBiLT5kaXNwb3NpdGlvbiA9IHRlbXBmbGFnID8gZGVsIDogZG9udHRvdWNoOworICAgICAgbWVudGlvbiAoYik7CisgICAgfQorCisgIGlmIChzYWxzLm5lbHRzID4gMSkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJNdWx0aXBsZSBicmVha3BvaW50cyB3ZXJlIHNldC5cbiIpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiVXNlIHRoZSBcImRlbGV0ZVwiIGNvbW1hbmQgdG8gZGVsZXRlIHVud2FudGVkIGJyZWFrcG9pbnRzLlxuIik7CisgICAgfQorICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKK30KKworc3RhdGljIHZvaWQKK2JyZWFrX2F0X2ZpbmlzaF9hdF9kZXB0aF9jb21tYW5kXzEgKGFyZywgZmxhZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZsYWc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworICBDT1JFX0FERFIgbG93LCBoaWdoLCBzZWxlY3RlZF9wYyA9IDA7CisgIGNoYXIgKmV4dHJhX2FyZ3MsICpsZXZlbF9hcmcsICphZGRyX3N0cmluZzsKKyAgaW50IGV4dHJhX2FyZ3NfbGVuID0gMCwgaWZfYXJnID0gMDsKKworICBpZiAoIWFyZyB8fAorICAgICAgKGFyZ1swXSA9PSAnaScgJiYgYXJnWzFdID09ICdmJyAmJiAoYXJnWzJdID09ICcgJyB8fCBhcmdbMl0gPT0gJ1x0JykpKQorICAgIHsKKworICAgICAgaWYgKGRlZmF1bHRfYnJlYWtwb2ludF92YWxpZCkKKwl7CisJICBpZiAoc2VsZWN0ZWRfZnJhbWUpCisJICAgIHsKKwkgICAgICBzZWxlY3RlZF9wYyA9IHNlbGVjdGVkX2ZyYW1lLT5wYzsKKwkgICAgICBpZiAoYXJnKQorCQlpZl9hcmcgPSAxOworCSAgICB9CisJICBlbHNlCisJICAgIGVycm9yICgiTm8gc2VsZWN0ZWQgZnJhbWUuIik7CisJfQorICAgICAgZWxzZQorCWVycm9yICgiTm8gZGVmYXVsdCBicmVha3BvaW50IGFkZHJlc3Mgbm93LiIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGV4dHJhX2FyZ3MgPSBzdHJjaHIgKGFyZywgJyAnKTsKKyAgICAgIGlmIChleHRyYV9hcmdzKQorCXsKKwkgIGV4dHJhX2FyZ3MrKzsKKwkgIGV4dHJhX2FyZ3NfbGVuID0gc3RybGVuIChleHRyYV9hcmdzKTsKKwkgIGxldmVsX2FyZyA9IChjaGFyICopIHhtYWxsb2MgKGV4dHJhX2FyZ3MgLSBhcmcpOworCSAgc3RybmNweSAobGV2ZWxfYXJnLCBhcmcsIGV4dHJhX2FyZ3MgLSBhcmcgLSAxKTsKKwkgIGxldmVsX2FyZ1tleHRyYV9hcmdzIC0gYXJnIC0gMV0gPSAnXDAnOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBsZXZlbF9hcmcgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGFyZykgKyAxKTsKKwkgIHN0cmNweSAobGV2ZWxfYXJnLCBhcmcpOworCX0KKworICAgICAgZnJhbWUgPSBwYXJzZV9mcmFtZV9zcGVjaWZpY2F0aW9uIChsZXZlbF9hcmcpOworICAgICAgaWYgKGZyYW1lKQorCXNlbGVjdGVkX3BjID0gZnJhbWUtPnBjOworICAgICAgZWxzZQorCXNlbGVjdGVkX3BjID0gMDsKKyAgICB9CisgIGlmIChpZl9hcmcpCisgICAgeworICAgICAgZXh0cmFfYXJncyA9IGFyZzsKKyAgICAgIGV4dHJhX2FyZ3NfbGVuID0gc3RybGVuIChhcmcpOyAKKyAgICB9CisKKyAgaWYgKHNlbGVjdGVkX3BjKQorICAgIHsKKyAgICAgIGlmIChmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24oc2VsZWN0ZWRfcGMsIChjaGFyICoqKU5VTEwsICZsb3csICZoaWdoKSkKKwl7CisJICBhZGRyX3N0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKDI2ICsgZXh0cmFfYXJnc19sZW4pOworCSAgaWYgKGV4dHJhX2FyZ3NfbGVuKQorCSAgICBzcHJpbnRmIChhZGRyX3N0cmluZywgIioweCV4ICVzIiwgaGlnaCwgZXh0cmFfYXJncyk7CisJICBlbHNlCisJICAgIHNwcmludGYgKGFkZHJfc3RyaW5nLCAiKjB4JXgiLCBoaWdoKTsKKwkgIGJyZWFrX2NvbW1hbmRfMSAoYWRkcl9zdHJpbmcsIGZsYWcsIGZyb21fdHR5KTsKKwkgIGZyZWUgKGFkZHJfc3RyaW5nKTsKKwl9CisgICAgICBlbHNlCisJZXJyb3IgKCJObyBmdW5jdGlvbiBjb250YWlucyB0aGUgc3BlY2lmaWVkIGFkZHJlc3MiKTsKKyAgICB9CisgIGVsc2UKKyAgICBlcnJvciAoIlVuYWJsZSB0byBzZXQgYnJlYWtwb2ludCBhdCBwcm9jZWR1cmUgZXhpdCIpOworfQorCisKK3N0YXRpYyB2b2lkCiticmVha19hdF9maW5pc2hfY29tbWFuZF8xIChhcmcsIGZsYWcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmbGFnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoYXIgKmFkZHJfc3RyaW5nLCAqYnJlYWtfc3RyaW5nLCAqYmVnX2FkZHJfc3RyaW5nOworICBDT1JFX0FERFIgbG93LCBoaWdoOworICBzdHJ1Y3Qgc3ltdGFic19hbmRfbGluZXMgc2FsczsKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisgIGNoYXIgKmV4dHJhX2FyZ3M7CisgIGludCBleHRyYV9hcmdzX2xlbiA9IDA7CisgIGludCBpLCBpZl9hcmcgPSAwOworCisgIGlmICghYXJnIHx8CisgICAgICAoYXJnWzBdID09ICdpJyAmJiBhcmdbMV0gPT0gJ2YnICYmIChhcmdbMl0gPT0gJyAnIHx8IGFyZ1syXSA9PSAnXHQnKSkpCisgICAgeworICAgICAgaWYgKGRlZmF1bHRfYnJlYWtwb2ludF92YWxpZCkKKwl7CisJICBpZiAoc2VsZWN0ZWRfZnJhbWUpCisJICAgIHsKKwkgICAgICBhZGRyX3N0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKDE1KTsKKwkgICAgICBzcHJpbnRmIChhZGRyX3N0cmluZywgIioweCV4Iiwgc2VsZWN0ZWRfZnJhbWUtPnBjKTsKKwkgICAgICBpZiAoYXJnKQorCQlpZl9hcmcgPSAxOworCSAgICB9CisJICBlbHNlCisJICAgIGVycm9yICgiTm8gc2VsZWN0ZWQgZnJhbWUuIik7CisJfQorICAgICAgZWxzZQorCWVycm9yICgiTm8gZGVmYXVsdCBicmVha3BvaW50IGFkZHJlc3Mgbm93LiIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFkZHJfc3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChhcmcpICsgMSk7CisgICAgICBzdHJjcHkgKGFkZHJfc3RyaW5nLCBhcmcpOworICAgIH0KKworICBpZiAoaWZfYXJnKQorICAgIHsKKyAgICAgIGV4dHJhX2FyZ3MgPSBhcmc7CisgICAgICBleHRyYV9hcmdzX2xlbiA9IHN0cmxlbiAoYXJnKTsgCisgICAgfQorICBlbHNlCisgICAgaWYgKGFyZykKKyAgICAgIHsKKwkvKiBnZXQgdGhlIHN0dWZmIGFmdGVyIHRoZSBmdW5jdGlvbiBuYW1lIG9yIGFkZHJlc3MgKi8KKwlleHRyYV9hcmdzID0gc3RyY2hyIChhcmcsICcgJyk7CisgICAgICAgIGlmIChleHRyYV9hcmdzKQorCSAgeworCSAgICBleHRyYV9hcmdzKys7CisJICAgIGV4dHJhX2FyZ3NfbGVuID0gc3RybGVuIChleHRyYV9hcmdzKTsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgc2Fscy5zYWxzID0gTlVMTDsKKyAgc2Fscy5uZWx0cyA9IDA7CisKKyAgYmVnX2FkZHJfc3RyaW5nID0gYWRkcl9zdHJpbmc7ICAKKyAgc2FscyA9IGRlY29kZV9saW5lXzEgKCZhZGRyX3N0cmluZywgMSwgKHN0cnVjdCBzeW10YWIgKilOVUxMLCAwLCAKKwkJCShjaGFyICoqKilOVUxMKTsKKworICBmcmVlIChiZWdfYWRkcl9zdHJpbmcpOworICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKGZyZWUsIHNhbHMuc2Fscyk7CisgIGZvciAoaSA9IDA7IChpIDwgc2Fscy5uZWx0cyk7IGkrKykKKyAgICB7CisgICAgICBzYWwgPSBzYWxzLnNhbHNbaV07CisgICAgICBpZiAoZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIChzYWwucGMsIChjaGFyICoqKU5VTEwsICZsb3csICZoaWdoKSkKKwl7CisJICBicmVha19zdHJpbmcgPSAoY2hhciAqKSB4bWFsbG9jIChleHRyYV9hcmdzX2xlbiArIDI2KTsKKwkgIGlmIChleHRyYV9hcmdzX2xlbikKKwkgICAgc3ByaW50ZiAoYnJlYWtfc3RyaW5nLCAiKjB4JXggJXMiLCBoaWdoLCBleHRyYV9hcmdzKTsKKwkgIGVsc2UKKwkgICAgc3ByaW50ZiAoYnJlYWtfc3RyaW5nLCAiKjB4JXgiLCBoaWdoKTsKKwkgIGJyZWFrX2NvbW1hbmRfMSAoYnJlYWtfc3RyaW5nLCBmbGFnLCBmcm9tX3R0eSk7CisJICBmcmVlKGJyZWFrX3N0cmluZyk7CisJfQorICAgICAgZWxzZQorCWVycm9yICgiTm8gZnVuY3Rpb24gY29udGFpbnMgdGhlIHNwZWNpZmllZCBhZGRyZXNzIik7CisgICAgfQorICBpZiAoc2Fscy5uZWx0cyA+IDEpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiTXVsdGlwbGUgYnJlYWtwb2ludHMgd2VyZSBzZXQuXG4iKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlVzZSB0aGUgXCJkZWxldGVcIiBjb21tYW5kIHRvIGRlbGV0ZSB1bndhbnRlZCBicmVha3BvaW50cy5cbiIpOworICAgIH0KKyAgZG9fY2xlYW51cHMob2xkX2NoYWluKTsKK30KKworCisvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGJyZWFrX2NvbW1hbmRfMSBhbmQgZGlzYXNzZW1ibGVfY29tbWFuZC4gICovCisKK3ZvaWQKK3Jlc29sdmVfc2FsX3BjIChzYWwpCisgICAgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgKnNhbDsKK3sKKyAgQ09SRV9BRERSIHBjOworCisgIGlmIChzYWwtPnBjID09IDAgJiYgc2FsLT5zeW10YWIgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIWZpbmRfbGluZV9wYyAoc2FsLT5zeW10YWIsIHNhbC0+bGluZSwgJnBjKSkKKwllcnJvciAoIk5vIGxpbmUgJWQgaW4gZmlsZSBcIiVzXCIuIiwKKwkgICAgICAgc2FsLT5saW5lLCBzYWwtPnN5bXRhYi0+ZmlsZW5hbWUpOworICAgICAgc2FsLT5wYyA9IHBjOworICAgIH0KKworICBpZiAoc2FsLT5zZWN0aW9uID09IDAgJiYgc2FsLT5zeW10YWIgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3QgYmxvY2t2ZWN0b3IgKmJ2OworICAgICAgc3RydWN0IGJsb2NrICAgICAgICpiOworICAgICAgc3RydWN0IHN5bWJvbCAgICAgICpzeW07CisgICAgICBpbnQgICAgICAgICAgICAgICAgIGluZGV4OworCisgICAgICBidiAgPSBibG9ja3ZlY3Rvcl9mb3JfcGNfc2VjdCAoc2FsLT5wYywgMCwgJmluZGV4LCBzYWwtPnN5bXRhYik7CisgICAgICBpZiAoYnYgIT0gTlVMTCkKKwl7CisJICBiICAgPSBCTE9DS1ZFQ1RPUl9CTE9DSyAoYnYsIGluZGV4KTsKKwkgIHN5bSA9IGJsb2NrX2Z1bmN0aW9uIChiKTsKKwkgIGlmIChzeW0gIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZpeHVwX3N5bWJvbF9zZWN0aW9uIChzeW0sIHNhbC0+c3ltdGFiLT5vYmpmaWxlKTsKKwkgICAgICBzYWwtPnNlY3Rpb24gPSBTWU1CT0xfQkZEX1NFQ1RJT04gKHN5bSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIEl0IHJlYWxseSBpcyB3b3J0aHdoaWxlIHRvIGhhdmUgdGhlIHNlY3Rpb24sIHNvIHdlJ2xsIGp1c3QKKwkJIGhhdmUgdG8gbG9vayBoYXJkZXIuIFRoaXMgY2FzZSBjYW4gYmUgZXhlY3V0ZWQgaWYgd2UgaGF2ZSAKKwkJIGxpbmUgbnVtYmVycyBidXQgbm8gZnVuY3Rpb25zIChhcyBjYW4gaGFwcGVuIGluIGFzc2VtYmx5IAorCQkgc291cmNlKS4gICovCisKKwkgICAgICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW07IAorCisJICAgICAgbXN5bSA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbF9ieV9wYyAoc2FsLT5wYyk7CisJICAgICAgaWYgKG1zeW0pCisJCXNhbC0+c2VjdGlvbiA9IFNZTUJPTF9CRkRfU0VDVElPTiAobXN5bSk7CisJICAgIH0KKwl9CisgICAgfQorfQorCit2b2lkCiticmVha19jb21tYW5kIChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgYnJlYWtfY29tbWFuZF8xIChhcmcsIDAsIGZyb21fdHR5KTsKK30KKwordm9pZAorYnJlYWtfYXRfZmluaXNoX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBicmVha19hdF9maW5pc2hfY29tbWFuZF8xIChhcmcsIDAsIGZyb21fdHR5KTsKK30KKwordm9pZAorYnJlYWtfYXRfZmluaXNoX2F0X2RlcHRoX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBicmVha19hdF9maW5pc2hfYXRfZGVwdGhfY29tbWFuZF8xIChhcmcsIDAsIGZyb21fdHR5KTsKK30KKwordm9pZAordGJyZWFrX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBicmVha19jb21tYW5kXzEgKGFyZywgQlBfVEVNUEZMQUcsIGZyb21fdHR5KTsKK30KKwordm9pZAordGJyZWFrX2F0X2ZpbmlzaF9jb21tYW5kIChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgYnJlYWtfYXRfZmluaXNoX2NvbW1hbmRfMSAoYXJnLCBCUF9URU1QRkxBRywgZnJvbV90dHkpOworfQorCitzdGF0aWMgdm9pZAoraGJyZWFrX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBicmVha19jb21tYW5kXzEgKGFyZywgQlBfSEFSRFdBUkVGTEFHLCBmcm9tX3R0eSk7Cit9CisKK3N0YXRpYyB2b2lkCit0aGJyZWFrX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBicmVha19jb21tYW5kXzEgKGFyZywgKEJQX1RFTVBGTEFHIHwgQlBfSEFSRFdBUkVGTEFHKSwgZnJvbV90dHkpOworfQorCitzdGF0aWMgdm9pZAorc3RvcF9jb21tYW5kIChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcHJpbnRmX2ZpbHRlcmVkICgiU3BlY2lmeSB0aGUgdHlwZSBvZiBicmVha3BvaW50IHRvIHNldC5cblwKK1VzYWdlOiBzdG9wIGluIDxmdW5jdGlvbiB8IGFkZHJlc3M+XG5cCisgICAgICAgc3RvcCBhdCA8bGluZT5cbiIpOworfQorCitzdGF0aWMgdm9pZAorc3RvcGluX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpbnQgYmFkSW5wdXQgPSAwOworCisgIGlmIChhcmcgPT0gKGNoYXIgKilOVUxMKQorICAgIGJhZElucHV0ID0gMTsKKyAgZWxzZSBpZiAoKmFyZyAhPSAnKicpCisgICAgeworICAgICAgY2hhciAqYXJncHRyID0gYXJnOworICAgICAgaW50IGhhc0NvbG9uID0gMDsKKworICAgICAgLyogbG9vayBmb3IgYSAnOicuICBJZiB0aGlzIGlzIGEgbGluZSBudW1iZXIgc3BlY2lmaWNhdGlvbiwgdGhlbiBzYXkKKwkgaXQgaXMgYmFkLCBvdGhlcndpc2UsIGl0IHNob3VsZCBiZSBhbiBhZGRyZXNzIG9yIGZ1bmN0aW9uL21ldGhvZAorCSBuYW1lICovCisgICAgICB3aGlsZSAoKmFyZ3B0ciAmJiAhaGFzQ29sb24pCisgICAgICAgIHsKKyAgICAgICAgICBoYXNDb2xvbiA9ICgqYXJncHRyID09ICc6Jyk7CisgICAgICAgICAgYXJncHRyKys7CisgICAgICAgIH0KKworICAgICAgaWYgKGhhc0NvbG9uKQorICAgICAgICBiYWRJbnB1dCA9ICgqYXJncHRyICE9ICc6Jyk7IC8qIE5vdCBhIGNsYXNzOjptZXRob2QgKi8KKyAgICAgIGVsc2UKKyAgICAgICAgYmFkSW5wdXQgPSBpc2RpZ2l0KCphcmcpOyAvKiBhIHNpbXBsZSBsaW5lIG51bWJlciAqLworICAgIH0KKworICBpZiAoYmFkSW5wdXQpCisgICAgcHJpbnRmX2ZpbHRlcmVkKCJVc2FnZTogc3RvcCBpbiA8ZnVuY3Rpb24gfCBhZGRyZXNzPlxuIik7CisgIGVsc2UKKyAgICBicmVha19jb21tYW5kXzEgKGFyZywgMCwgZnJvbV90dHkpOworfQorCitzdGF0aWMgdm9pZAorc3RvcGF0X2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpbnQgYmFkSW5wdXQgPSAwOworCisgIGlmIChhcmcgPT0gKGNoYXIgKilOVUxMIHx8ICphcmcgPT0gJyonKSAvKiBubyBsaW5lIG51bWJlciAqLworICAgIGJhZElucHV0ID0gMTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgKmFyZ3B0ciA9IGFyZzsKKyAgICAgIGludCBoYXNDb2xvbiA9IDA7CisKKyAgICAgIC8qIGxvb2sgZm9yIGEgJzonLiAgSWYgdGhlcmUgaXMgYSAnOjonIHRoZW4gZ2V0IG91dCwgb3RoZXJ3aXNlCisJIGl0IGlzIHByb2JhYmx5IGEgbGluZSBudW1iZXIuICovCisgICAgICB3aGlsZSAoKmFyZ3B0ciAmJiAhaGFzQ29sb24pCisgICAgICAgIHsKKyAgICAgICAgICBoYXNDb2xvbiA9ICgqYXJncHRyID09ICc6Jyk7CisgICAgICAgICAgYXJncHRyKys7CisgICAgICAgIH0KKworICAgICAgaWYgKGhhc0NvbG9uKQorICAgICAgICBiYWRJbnB1dCA9ICgqYXJncHRyID09ICc6Jyk7IC8qIHdlIGhhdmUgY2xhc3M6Om1ldGhvZCAqLworICAgICAgZWxzZQorICAgICAgICBiYWRJbnB1dCA9ICFpc2RpZ2l0KCphcmcpOyAvKiBub3QgYSBsaW5lIG51bWJlciAqLworICAgIH0KKworICBpZiAoYmFkSW5wdXQpCisgICAgcHJpbnRmX2ZpbHRlcmVkKCJVc2FnZTogc3RvcCBhdCA8bGluZT5cbiIpOworICBlbHNlCisgICAgYnJlYWtfY29tbWFuZF8xIChhcmcsIDAsIGZyb21fdHR5KTsKK30KKworLyogQVJHU1VTRUQgKi8KKy8qIGFjY2Vzc2ZsYWc6ICAwOiB3YXRjaCB3cml0ZSwgMTogd2F0Y2ggcmVhZCwgMjogd2F0Y2ggYWNjZXNzKHJlYWQgb3Igd3JpdGUpICovCitzdGF0aWMgdm9pZAord2F0Y2hfY29tbWFuZF8xIChhcmcsIGFjY2Vzc2ZsYWcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBhY2Nlc3NmbGFnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCBicmVha3BvaW50ICpiOworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKyAgc3RydWN0IGV4cHJlc3Npb24gKmV4cDsKKyAgc3RydWN0IGJsb2NrICpleHBfdmFsaWRfYmxvY2s7CisgIHN0cnVjdCB2YWx1ZSAqdmFsLCAqbWFyazsKKyAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworICBzdHJ1Y3QgZnJhbWVfaW5mbyAqcHJldl9mcmFtZSA9IE5VTEw7CisgIGNoYXIgKmV4cF9zdGFydCA9IE5VTEw7CisgIGNoYXIgKmV4cF9lbmQgPSBOVUxMOworICBjaGFyICp0b2ssICplbmRfdG9rOworICBpbnQgdG9rbGVuOworICBjaGFyICpjb25kX3N0YXJ0ID0gTlVMTDsKKyAgY2hhciAqY29uZF9lbmQgPSBOVUxMOworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqY29uZCA9IE5VTEw7CisgIGludCBpLCBvdGhlcl90eXBlX3VzZWQsIHRhcmdldF9yZXNvdXJjZXNfb2sgPSAwOworICBlbnVtIGJwdHlwZSBicF90eXBlOworICBpbnQgbWVtX2NudCA9IDA7CisKKyAgSU5JVF9TQUwgKCZzYWwpOwkvKiBpbml0aWFsaXplIHRvIHplcm9lcyAqLworICAKKyAgLyogUGFyc2UgYXJndW1lbnRzLiAgKi8KKyAgaW5uZXJtb3N0X2Jsb2NrID0gTlVMTDsKKyAgZXhwX3N0YXJ0ID0gYXJnOworICBleHAgPSBwYXJzZV9leHBfMSAoJmFyZywgMCwgMCk7CisgIGV4cF9lbmQgPSBhcmc7CisgIGV4cF92YWxpZF9ibG9jayA9IGlubmVybW9zdF9ibG9jazsKKyAgbWFyayA9IHZhbHVlX21hcmsgKCk7CisgIHZhbCA9IGV2YWx1YXRlX2V4cHJlc3Npb24gKGV4cCk7CisgIHJlbGVhc2VfdmFsdWUgKHZhbCk7CisgIGlmIChWQUxVRV9MQVpZICh2YWwpKQorICAgIHZhbHVlX2ZldGNoX2xhenkgKHZhbCk7CisKKyAgdG9rID0gYXJnOworICB3aGlsZSAoKnRvayA9PSAnICcgfHwgKnRvayA9PSAnXHQnKQorICAgIHRvaysrOworICBlbmRfdG9rID0gdG9rOworCisgIHdoaWxlICgqZW5kX3RvayAhPSAnICcgJiYgKmVuZF90b2sgIT0gJ1x0JyAmJiAqZW5kX3RvayAhPSAnXDAwMCcpCisgICAgZW5kX3RvaysrOworCisgIHRva2xlbiA9IGVuZF90b2sgLSB0b2s7CisgIGlmICh0b2tsZW4gPj0gMSAmJiBzdHJuY21wICh0b2ssICJpZiIsIHRva2xlbikgPT0gMCkKKyAgICB7CisgICAgICB0b2sgPSBjb25kX3N0YXJ0ID0gZW5kX3RvayArIDE7CisgICAgICBjb25kID0gcGFyc2VfZXhwXzEgKCZ0b2ssIDAsIDApOworICAgICAgY29uZF9lbmQgPSB0b2s7CisgICAgfQorICBpZiAoKnRvaykKKyAgICBlcnJvcigiSnVuayBhdCBlbmQgb2YgY29tbWFuZC4iKTsKKworICBpZiAoYWNjZXNzZmxhZyA9PSAxKSBicF90eXBlID0gYnBfcmVhZF93YXRjaHBvaW50OworICBlbHNlIGlmIChhY2Nlc3NmbGFnID09IDIpIGJwX3R5cGUgPSBicF9hY2Nlc3Nfd2F0Y2hwb2ludDsKKyAgZWxzZSBicF90eXBlID0gYnBfaGFyZHdhcmVfd2F0Y2hwb2ludDsKKworICBtZW1fY250ID0gY2FuX3VzZV9oYXJkd2FyZV93YXRjaHBvaW50ICh2YWwpOworICBpZiAobWVtX2NudCA9PSAwICYmIGJwX3R5cGUgIT0gYnBfaGFyZHdhcmVfd2F0Y2hwb2ludCkKKyAgICBlcnJvciAoIkV4cHJlc3Npb24gY2Fubm90IGJlIGltcGxlbWVudGVkIHdpdGggcmVhZC9hY2Nlc3Mgd2F0Y2hwb2ludC4iKTsKKyAgaWYgKG1lbV9jbnQgIT0gMCkgeyAKKyAgICBpID0gaHdfd2F0Y2hwb2ludF91c2VkX2NvdW50IChicF90eXBlLCAmb3RoZXJfdHlwZV91c2VkKTsKKyAgICB0YXJnZXRfcmVzb3VyY2VzX29rID0gVEFSR0VUX0NBTl9VU0VfSEFSRFdBUkVfV0FUQ0hQT0lOVCgKKwkJYnBfdHlwZSwgaSArIG1lbV9jbnQsIG90aGVyX3R5cGVfdXNlZCk7CisgICAgaWYgKHRhcmdldF9yZXNvdXJjZXNfb2sgPT0gMCAmJiBicF90eXBlICE9IGJwX2hhcmR3YXJlX3dhdGNocG9pbnQpCisgICAgICBlcnJvciAoIlRhcmdldCBkb2VzIG5vdCBoYXZlIHRoaXMgdHlwZSBvZiBoYXJkd2FyZSB3YXRjaHBvaW50IHN1cHBvcnQuIik7CisgICAgaWYgKHRhcmdldF9yZXNvdXJjZXNfb2sgPCAwICYmIGJwX3R5cGUgIT0gYnBfaGFyZHdhcmVfd2F0Y2hwb2ludCkKKyAgICAgIGVycm9yICgiVGFyZ2V0IHJlc291cmNlcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGZvciBvdGhlciB0eXBlcyBvZiB3YXRjaHBvaW50cy4iKTsKKyAgfQorCisjaWYgZGVmaW5lZChIUFVYSFBQQSkKKyAvKiAgT24gSFAtVVggaWYgeW91IHNldCBhIGgvdworICAgICB3YXRjaHBvaW50IGJlZm9yZSB0aGUgInJ1biIgY29tbWFuZCwgdGhlIGluZmVyaW9yIGRpZXMgd2l0aCBhIGUuZy4sCisgICAgIFNJR0lMTCBvbmNlIHlvdSBzdGFydCBpdC4gIEkgaW5pdGlhbGx5IGJlbGlldmVkIHRoaXMgd2FzIGR1ZSB0byBhCisgICAgIGJhZCBpbnRlcmFjdGlvbiBiZXR3ZWVuIHBhZ2UgcHJvdGVjdGlvbiB0cmFwcyBhbmQgdGhlIGluaXRpYWwKKyAgICAgc3RhcnR1cCBzZXF1ZW5jZSBieSB0aGUgZHluYW1pYyBsaW5rZXIuCisKKyAgICAgSG93ZXZlciwgSSB0cmllZCBhdm9pZGluZyB0aGF0IGJ5IGhhdmluZyBIUC1VWCdzIGltcGxlbWVudGF0aW9uIG9mCisgICAgIFRBUkdFVF9DQU5fVVNFX0hXX1dBVENIUE9JTlQgcmV0dXJuIEZBTFNFIGlmIHRoZXJlIHdhcyBubyBpbmZlcmlvcl9waWQKKyAgICAgeWV0LCB3aGljaCBmb3JjZWQgc2xvdyB3YXRjaGVzIGJlZm9yZSBhICJydW4iIG9yICJhdHRhY2giLCBhbmQgaXQKKyAgICAgc3RpbGwgZmFpbHMgc29tZXdoZXJlIGluIHRoZSBzdGFydHVwIGNvZGUuCisKKyAgICAgVW50aWwgSSBmaWd1cmUgb3V0IHdoYXQncyBoYXBwZW5pbmcsIEknbSBkaXNhbGxvd2luZyB3YXRjaGVzIGFsdG9nZXRoZXIKKyAgICAgYmVmb3JlIHRoZSAicnVuIiBvciAiYXR0YWNoIiBjb21tYW5kLiAgV2UnbGwgdGVsbCB0aGUgdXNlciB0aGV5IG11c3QKKyAgICAgc2V0IHdhdGNoZXMgYWZ0ZXIgZ2V0dGluZyB0aGUgcHJvZ3JhbSBzdGFydGVkLiAqLworICBpZiAoISB0YXJnZXRfaGFzX2V4ZWN1dGlvbikKKyAgICB7CisgICAgICB3YXJuaW5nICgiY2FuJ3QgZG8gdGhhdCB3aXRob3V0IGEgcnVubmluZyBwcm9ncmFtOyB0cnkgXCJicmVhayBtYWluXCIsIFwicnVuXCIgZmlyc3QiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogSFBVWEhQUEEgKi8KKyAgCisgIC8qIE5vdyBzZXQgdXAgdGhlIGJyZWFrcG9pbnQuICAqLworICBiID0gc2V0X3Jhd19icmVha3BvaW50IChzYWwpOworICBzZXRfYnJlYWtwb2ludF9jb3VudCAoYnJlYWtwb2ludF9jb3VudCArIDEpOworICBiLT5udW1iZXIgPSBicmVha3BvaW50X2NvdW50OworICBiLT5kaXNwb3NpdGlvbiA9IGRvbnR0b3VjaDsKKyAgYi0+ZXhwID0gZXhwOworICBiLT5leHBfdmFsaWRfYmxvY2sgPSBleHBfdmFsaWRfYmxvY2s7CisgIGItPmV4cF9zdHJpbmcgPSBzYXZlc3RyaW5nIChleHBfc3RhcnQsIGV4cF9lbmQgLSBleHBfc3RhcnQpOworICBiLT52YWwgPSB2YWw7CisgIGItPmNvbmQgPSBjb25kOworICBpZiAoY29uZF9zdGFydCkKKyAgICBiLT5jb25kX3N0cmluZyA9IHNhdmVzdHJpbmcgKGNvbmRfc3RhcnQsIGNvbmRfZW5kIC0gY29uZF9zdGFydCk7CisgIGVsc2UKKyAgICBiLT5jb25kX3N0cmluZyA9IDA7CisgICAgICAgICAKKyAgZnJhbWUgPSBibG9ja19pbm5lcm1vc3RfZnJhbWUgKGV4cF92YWxpZF9ibG9jayk7CisgIGlmIChmcmFtZSkKKyAgICB7CisgICAgICBwcmV2X2ZyYW1lID0gZ2V0X3ByZXZfZnJhbWUgKGZyYW1lKTsKKyAgICAgIGItPndhdGNocG9pbnRfZnJhbWUgPSBmcmFtZS0+ZnJhbWU7CisgICAgfQorICBlbHNlCisgICAgYi0+d2F0Y2hwb2ludF9mcmFtZSA9IChDT1JFX0FERFIpMDsKKworICBpZiAobWVtX2NudCAmJiB0YXJnZXRfcmVzb3VyY2VzX29rID4gMCkKKyAgICBiLT50eXBlID0gYnBfdHlwZTsKKyAgZWxzZQorICAgIGItPnR5cGUgPSBicF93YXRjaHBvaW50OworCisgIC8qIElmIHRoZSBleHByZXNzaW9uIGlzICJsb2NhbCIsIHRoZW4gc2V0IHVwIGEgIndhdGNocG9pbnQgc2NvcGUiCisgICAgIGJyZWFrcG9pbnQgYXQgdGhlIHBvaW50IHdoZXJlIHdlJ3ZlIGxlZnQgdGhlIHNjb3BlIG9mIHRoZSB3YXRjaHBvaW50CisgICAgIGV4cHJlc3Npb24uICAqLworICBpZiAoaW5uZXJtb3N0X2Jsb2NrKQorICAgIHsKKyAgICAgIGlmIChwcmV2X2ZyYW1lKQorCXsKKwkgIHN0cnVjdCBicmVha3BvaW50ICpzY29wZV9icmVha3BvaW50OworCSAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzY29wZV9zYWw7CisKKwkgIElOSVRfU0FMICgmc2NvcGVfc2FsKTsJLyogaW5pdGlhbGl6ZSB0byB6ZXJvZXMgKi8KKwkgIHNjb3BlX3NhbC5wYyAgICAgID0gZ2V0X2ZyYW1lX3BjIChwcmV2X2ZyYW1lKTsKKwkgIHNjb3BlX3NhbC5zZWN0aW9uID0gZmluZF9wY19vdmVybGF5IChzY29wZV9zYWwucGMpOworCisJICBzY29wZV9icmVha3BvaW50ID0gc2V0X3Jhd19icmVha3BvaW50IChzY29wZV9zYWwpOworCSAgc2V0X2JyZWFrcG9pbnRfY291bnQgKGJyZWFrcG9pbnRfY291bnQgKyAxKTsKKwkgIHNjb3BlX2JyZWFrcG9pbnQtPm51bWJlciA9IGJyZWFrcG9pbnRfY291bnQ7CisKKwkgIHNjb3BlX2JyZWFrcG9pbnQtPnR5cGUgPSBicF93YXRjaHBvaW50X3Njb3BlOworCSAgc2NvcGVfYnJlYWtwb2ludC0+ZW5hYmxlID0gZW5hYmxlZDsKKworCSAgLyogQXV0b21hdGljYWxseSBkZWxldGUgdGhlIGJyZWFrcG9pbnQgd2hlbiBpdCBoaXRzLiAgKi8KKwkgIHNjb3BlX2JyZWFrcG9pbnQtPmRpc3Bvc2l0aW9uID0gZGVsOworCisJICAvKiBPbmx5IGJyZWFrIGluIHRoZSBwcm9wZXIgZnJhbWUgKGhlbHAgd2l0aCByZWN1cnNpb24pLiAgKi8KKwkgIHNjb3BlX2JyZWFrcG9pbnQtPmZyYW1lID0gcHJldl9mcmFtZS0+ZnJhbWU7CisKKwkgIC8qIFNldCB0aGUgYWRkcmVzcyBhdCB3aGljaCB3ZSB3aWxsIHN0b3AuICAqLworCSAgc2NvcGVfYnJlYWtwb2ludC0+YWRkcmVzcyA9IGdldF9mcmFtZV9wYyAocHJldl9mcmFtZSk7CisKKwkgIC8qIFRoZSBzY29wZSBicmVha3BvaW50IGlzIHJlbGF0ZWQgdG8gdGhlIHdhdGNocG9pbnQuICBXZQorCSAgICAgd2lsbCBuZWVkIHRvIGFjdCBvbiB0aGVtIHRvZ2V0aGVyLiAgKi8KKwkgIGItPnJlbGF0ZWRfYnJlYWtwb2ludCA9IHNjb3BlX2JyZWFrcG9pbnQ7CisJfQorICAgIH0KKyAgdmFsdWVfZnJlZV90b19tYXJrIChtYXJrKTsKKyAgbWVudGlvbiAoYik7Cit9CisKKy8qIFJldHVybiBjb3VudCBvZiBsb2NhdGlvbnMgbmVlZCB0byBiZSB3YXRjaGVkIGFuZCBjYW4gYmUgaGFuZGxlZAorICAgaW4gaGFyZHdhcmUuICBJZiB0aGUgd2F0Y2hwb2ludCBjYW4gbm90IGJlIGhhbmRsZWQKKyAgIGluIGhhcmR3YXJlIHJldHVybiB6ZXJvLiAgKi8KKworI2lmICFkZWZpbmVkKFRBUkdFVF9SRUdJT05fU0laRV9PS19GT1JfSFdfV0FUQ0hQT0lOVCkKKyNkZWZpbmUgVEFSR0VUX1JFR0lPTl9TSVpFX09LX0ZPUl9IV19XQVRDSFBPSU5UKGJ5dGVfc2l6ZSkgXAorICAgICgoYnl0ZV9zaXplKSA8PSAoUkVHSVNURVJfU0laRSkpCisjZW5kaWYKKworc3RhdGljIGludAorY2FuX3VzZV9oYXJkd2FyZV93YXRjaHBvaW50ICh2KQorICAgICBzdHJ1Y3QgdmFsdWUgKnY7Cit7CisgIGludCBmb3VuZF9tZW1vcnlfY250ID0gMDsKKworICAvKiBEaWQgdGhlIHVzZXIgc3BlY2lmaWNhbGx5IGZvcmJpZCB1cyB0byB1c2UgaGFyZHdhcmUgd2F0Y2hwb2ludHM/ICovCisgIGlmICghIGNhbl91c2VfaHdfd2F0Y2hwb2ludHMpCisgICAgcmV0dXJuIDA7CisJCisgIC8qIE1ha2Ugc3VyZSBhbGwgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMgYXJlIGluIG1lbW9yeS4gIEFsc28gbWFrZSBzdXJlCisgICAgIHdlIGZvdW5kIGF0IGxlYXN0IG9uZSBtZW1vcnkgZXhwcmVzc2lvbi4gIEd1YXJkcyBhZ2FpbnN0IHdhdGNoIDB4MTIzNDUsCisgICAgIHdoaWNoIGlzIG1lYW5pbmdsZXNzLCBidXQgY291bGQgY2F1c2UgZXJyb3JzIGlmIG9uZSB0cmllcyB0byBpbnNlcnQgYSAKKyAgICAgaGFyZHdhcmUgd2F0Y2hwb2ludCBmb3IgdGhlIGNvbnN0YW50IGV4cHJlc3Npb24uICAqLworICBmb3IgKCA7IHY7IHYgPSB2LT5uZXh0KQorICAgIHsKKyAgICAgIGlmICh2LT5sdmFsID09IGx2YWxfbWVtb3J5KQorCXsKKwkgIGlmIChUQVJHRVRfUkVHSU9OX1NJWkVfT0tfRk9SX0hXX1dBVENIUE9JTlQgKFRZUEVfTEVOR1RIIChWQUxVRV9UWVBFICh2KSkpKQorCSAgICBmb3VuZF9tZW1vcnlfY250Kys7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHYtPmx2YWwgIT0gbm90X2x2YWwgJiYgdi0+bW9kaWZpYWJsZSA9PSAwKQorCXJldHVybiAwOworICAgIH0KKworICAvKiBUaGUgZXhwcmVzc2lvbiBpdHNlbGYgbG9va3Mgc3VpdGFibGUgZm9yIHVzaW5nIGEgaGFyZHdhcmUKKyAgICAgd2F0Y2hwb2ludCwgYnV0IGdpdmUgdGhlIHRhcmdldCBtYWNoaW5lIGEgY2hhbmNlIHRvIHJlamVjdCBpdC4gICovCisgIHJldHVybiBmb3VuZF9tZW1vcnlfY250OworfQorCitzdGF0aWMgdm9pZCB3YXRjaF9jb21tYW5kIChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgd2F0Y2hfY29tbWFuZF8xIChhcmcsIDAsIGZyb21fdHR5KTsKK30KKworc3RhdGljIHZvaWQgcndhdGNoX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICB3YXRjaF9jb21tYW5kXzEgKGFyZywgMSwgZnJvbV90dHkpOworfQorCitzdGF0aWMgdm9pZCBhd2F0Y2hfY29tbWFuZCAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHdhdGNoX2NvbW1hbmRfMSAoYXJnLCAyLCBmcm9tX3R0eSk7Cit9CisKKwwKKy8qIEhlbHBlciByb3V0aW5lIGZvciB0aGUgdW50aWxfY29tbWFuZCByb3V0aW5lIGluIGluZmNtZC5jLiAgSGVyZQorICAgYmVjYXVzZSBpdCB1c2VzIHRoZSBtZWNoYW5pc21zIG9mIGJyZWFrcG9pbnRzLiAgKi8KKworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK3VudGlsX2JyZWFrX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBzdHJ1Y3Qgc3ltdGFic19hbmRfbGluZXMgc2FsczsKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CisgIHN0cnVjdCBmcmFtZV9pbmZvICpwcmV2X2ZyYW1lID0gZ2V0X3ByZXZfZnJhbWUgKHNlbGVjdGVkX2ZyYW1lKTsKKyAgc3RydWN0IGJyZWFrcG9pbnQgKmJyZWFrcG9pbnQ7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisKKyAgY2xlYXJfcHJvY2VlZF9zdGF0dXMgKCk7CisKKyAgLyogU2V0IGEgYnJlYWtwb2ludCB3aGVyZSB0aGUgdXNlciB3YW50cyBpdCBhbmQgYXQgcmV0dXJuIGZyb20KKyAgICAgdGhpcyBmdW5jdGlvbiAqLworICAKKyAgaWYgKGRlZmF1bHRfYnJlYWtwb2ludF92YWxpZCkKKyAgICBzYWxzID0gZGVjb2RlX2xpbmVfMSAoJmFyZywgMSwgZGVmYXVsdF9icmVha3BvaW50X3N5bXRhYiwKKwkJCSAgZGVmYXVsdF9icmVha3BvaW50X2xpbmUsIChjaGFyICoqKilOVUxMKTsKKyAgZWxzZQorICAgIHNhbHMgPSBkZWNvZGVfbGluZV8xICgmYXJnLCAxLCAoc3RydWN0IHN5bXRhYiAqKU5VTEwsIDAsIChjaGFyICoqKilOVUxMKTsKKyAgCisgIGlmIChzYWxzLm5lbHRzICE9IDEpCisgICAgZXJyb3IgKCJDb3VsZG4ndCBnZXQgaW5mb3JtYXRpb24gb24gc3BlY2lmaWVkIGxpbmUuIik7CisgIAorICBzYWwgPSBzYWxzLnNhbHNbMF07CisgIGZyZWUgKChQVFIpc2Fscy5zYWxzKTsJCS8qIG1hbGxvYydkLCBzbyBmcmVlZCAqLworICAKKyAgaWYgKCphcmcpCisgICAgZXJyb3IgKCJKdW5rIGF0IGVuZCBvZiBhcmd1bWVudHMuIik7CisgIAorICByZXNvbHZlX3NhbF9wYyAoJnNhbCk7CisgIAorICBicmVha3BvaW50ID0gc2V0X21vbWVudGFyeV9icmVha3BvaW50IChzYWwsIHNlbGVjdGVkX2ZyYW1lLCBicF91bnRpbCk7CisgIAorICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZGVsZXRlX2JyZWFrcG9pbnQsIGJyZWFrcG9pbnQpOworCisgIC8qIEtlZXAgd2l0aGluIHRoZSBjdXJyZW50IGZyYW1lICovCisgIAorICBpZiAocHJldl9mcmFtZSkKKyAgICB7CisgICAgICBzYWwgPSBmaW5kX3BjX2xpbmUgKHByZXZfZnJhbWUtPnBjLCAwKTsKKyAgICAgIHNhbC5wYyA9IHByZXZfZnJhbWUtPnBjOworICAgICAgYnJlYWtwb2ludCA9IHNldF9tb21lbnRhcnlfYnJlYWtwb2ludCAoc2FsLCBwcmV2X2ZyYW1lLCBicF91bnRpbCk7CisgICAgICBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZGVsZXRlX2JyZWFrcG9pbnQsIGJyZWFrcG9pbnQpOworICAgIH0KKyAgCisgIHByb2NlZWQgKC0xLCBUQVJHRVRfU0lHTkFMX0RFRkFVTFQsIDApOworICBkb19jbGVhbnVwcyhvbGRfY2hhaW4pOworfQorDAorI2lmIDAKKy8qIFRoZXNlIGFyZW4ndCB1c2VkOyBJIGRvbid0IGtvbncgd2hhdCB0aGV5IHdlcmUgZm9yLiAgKi8KKy8qIFNldCBhIGJyZWFrcG9pbnQgYXQgdGhlIGNhdGNoIGNsYXVzZSBmb3IgTkFNRS4gICovCitzdGF0aWMgaW50CitjYXRjaF9icmVha3BvaW50IChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworfQorCitzdGF0aWMgaW50CitkaXNhYmxlX2NhdGNoX2JyZWFrcG9pbnQgKCkKK3sKK30KKworc3RhdGljIGludAorZGVsZXRlX2NhdGNoX2JyZWFrcG9pbnQgKCkKK3sKK30KKworc3RhdGljIGludAorZW5hYmxlX2NhdGNoX2JyZWFrcG9pbnQgKCkKK3sKK30KKyNlbmRpZiAvKiAwICovCisKK3N0cnVjdCBzYWxfY2hhaW4KK3sKKyAgc3RydWN0IHNhbF9jaGFpbiAqbmV4dDsKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7Cit9OworCisvKiBOb3QgcmVhbGx5IHVzZWQgLS0gaW52b2NhdGlvbiBpbiBoYW5kbGVfZ251XzRfMTZfY2F0Y2hfY29tbWFuZAorICAgaGFkIGJlZW4gY29tbWVudGVkIG91dCBpbiB0aGUgdi40LjE2IHNvdXJjZXMsIGFuZCBzdGF5cworICAgZGlzYWJsZWQgdGhlcmUgbm93IGJlY2F1c2UgImNhdGNoIE5BTUUiIHN5bnRheCBpc24ndCBhbGxvd2VkLgorICAgcGFpLzE5OTctMDctMTEgKi8KKy8qIFRoaXMgaXNuJ3QgdXNlZDsgSSBkb24ndCBrbm93IHdoYXQgaXQgd2FzIGZvci4gICovCisvKiBGb3IgZWFjaCBjYXRjaCBjbGF1c2UgaWRlbnRpZmllZCBpbiBBUkdTLCBydW4gRlVOQ1RJT04KKyAgIHdpdGggdGhhdCBjbGF1c2UgYXMgYW4gYXJndW1lbnQuICAqLworc3RhdGljIHN0cnVjdCBzeW10YWJzX2FuZF9saW5lcworbWFwX2NhdGNoX25hbWVzIChhcmdzLCBmdW5jdGlvbikKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50ICgqZnVuY3Rpb24pKCk7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKnAgPSBhcmdzOworICByZWdpc3RlciBjaGFyICpwMTsKKyAgc3RydWN0IHN5bXRhYnNfYW5kX2xpbmVzIHNhbHM7CisjaWYgMAorICBzdHJ1Y3Qgc2FsX2NoYWluICpzYWxfY2hhaW4gPSAwOworI2VuZGlmCisKKyAgaWYgKHAgPT0gMCkKKyAgICBlcnJvcl9ub19hcmcgKCJvbmUgb3IgbW9yZSBjYXRjaCBuYW1lcyIpOworCisgIHNhbHMubmVsdHMgPSAwOworICBzYWxzLnNhbHMgPSBOVUxMOworCisgIHdoaWxlICgqcCkKKyAgICB7CisgICAgICBwMSA9IHA7CisgICAgICAvKiBEb24ndCBzd2FsbG93IGNvbmRpdGlvbmFsIHBhcnQuICAqLworICAgICAgaWYgKHAxWzBdID09ICdpJyAmJiBwMVsxXSA9PSAnZicKKwkgICYmIChwMVsyXSA9PSAnICcgfHwgcDFbMl0gPT0gJ1x0JykpCisJYnJlYWs7CisKKyAgICAgIGlmIChpc2FscGhhICgqcDEpKQorCXsKKwkgIHAxKys7CisJICB3aGlsZSAoaXNhbG51bSAoKnAxKSB8fCAqcDEgPT0gJ18nIHx8ICpwMSA9PSAnJCcpCisJICAgIHAxKys7CisJfQorCisgICAgICBpZiAoKnAxICYmICpwMSAhPSAnICcgJiYgKnAxICE9ICdcdCcpCisJZXJyb3IgKCJBcmd1bWVudHMgbXVzdCBiZSBjYXRjaCBuYW1lcy4iKTsKKworICAgICAgKnAxID0gMDsKKyNpZiAwCisgICAgICBpZiAoZnVuY3Rpb24gKHApKQorCXsKKwkgIHN0cnVjdCBzYWxfY2hhaW4gKm5leHQgPSAoc3RydWN0IHNhbF9jaGFpbiAqKQorCSAgICBhbGxvY2EgKHNpemVvZiAoc3RydWN0IHNhbF9jaGFpbikpOworCSAgbmV4dC0+bmV4dCA9IHNhbF9jaGFpbjsKKwkgIG5leHQtPnNhbCA9IGdldF9jYXRjaF9zYWwgKHApOworCSAgc2FsX2NoYWluID0gbmV4dDsKKwkgIGdvdG8gd2luOworCX0KKyNlbmRpZgorICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJObyBjYXRjaCBjbGF1c2UgZm9yIGV4Y2VwdGlvbiAlcy5cbiIsIHApOworI2lmIDAKKyAgICB3aW46CisjZW5kaWYKKyAgICAgIHAgPSBwMTsKKyAgICAgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykgcCsrOworICAgIH0KK30KKworLyogVGhpcyBzaGFyZXMgYSBsb3Qgb2YgY29kZSB3aXRoIGBwcmludF9mcmFtZV9sYWJlbF92YXJzJyBmcm9tIHN0YWNrLmMuICAqLworCitzdGF0aWMgc3RydWN0IHN5bXRhYnNfYW5kX2xpbmVzCitnZXRfY2F0Y2hfc2FscyAodGhpc19sZXZlbF9vbmx5KQorICAgICBpbnQgdGhpc19sZXZlbF9vbmx5OworeworICByZWdpc3RlciBzdHJ1Y3QgYmxvY2t2ZWN0b3IgKmJsOworICByZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmJsb2NrOworICBpbnQgaW5kZXgsIGhhdmVfZGVmYXVsdCA9IDA7CisgIENPUkVfQUREUiBwYzsKKyAgc3RydWN0IHN5bXRhYnNfYW5kX2xpbmVzIHNhbHM7CisgIHN0cnVjdCBzYWxfY2hhaW4gKnNhbF9jaGFpbiA9IDA7CisgIGNoYXIgKmJsb2Nrc19zZWFyY2hlZDsKKworICAvKiBOb3Qgc3VyZSB3aGV0aGVyIGFuIGVycm9yIG1lc3NhZ2UgaXMgYWx3YXlzIHRoZSBjb3JyZWN0IHJlc3BvbnNlLAorICAgICBidXQgaXQncyBiZXR0ZXIgdGhhbiBhIGNvcmUgZHVtcC4gICovCisgIGlmIChzZWxlY3RlZF9mcmFtZSA9PSBOVUxMKQorICAgIGVycm9yICgiTm8gc2VsZWN0ZWQgZnJhbWUuIik7CisgIGJsb2NrID0gZ2V0X2ZyYW1lX2Jsb2NrIChzZWxlY3RlZF9mcmFtZSk7CisgIHBjID0gc2VsZWN0ZWRfZnJhbWUtPnBjOworCisgIHNhbHMubmVsdHMgPSAwOworICBzYWxzLnNhbHMgPSBOVUxMOworCisgIGlmIChibG9jayA9PSAwKQorICAgIGVycm9yICgiTm8gc3ltYm9sIHRhYmxlIGluZm8gYXZhaWxhYmxlLlxuIik7CisKKyAgYmwgPSBibG9ja3ZlY3Rvcl9mb3JfcGMgKEJMT0NLX0VORCAoYmxvY2spIC0gNCwgJmluZGV4KTsKKyAgYmxvY2tzX3NlYXJjaGVkID0gKGNoYXIgKikgYWxsb2NhIChCTE9DS1ZFQ1RPUl9OQkxPQ0tTIChibCkgKiBzaXplb2YgKGNoYXIpKTsKKyAgbWVtc2V0IChibG9ja3Nfc2VhcmNoZWQsIDAsIEJMT0NLVkVDVE9SX05CTE9DS1MgKGJsKSAqIHNpemVvZiAoY2hhcikpOworCisgIHdoaWxlIChibG9jayAhPSAwKQorICAgIHsKKyAgICAgIENPUkVfQUREUiBlbmQgPSBCTE9DS19FTkQgKGJsb2NrKSAtIDQ7CisgICAgICBpbnQgbGFzdF9pbmRleDsKKworICAgICAgaWYgKGJsICE9IGJsb2NrdmVjdG9yX2Zvcl9wYyAoZW5kLCAmaW5kZXgpKQorCWVycm9yICgiYmxvY2t2ZWN0b3IgYmxvdGNoIik7CisgICAgICBpZiAoQkxPQ0tWRUNUT1JfQkxPQ0sgKGJsLCBpbmRleCkgIT0gYmxvY2spCisJZXJyb3IgKCJibG9ja3ZlY3RvciBib3RjaCIpOworICAgICAgbGFzdF9pbmRleCA9IEJMT0NLVkVDVE9SX05CTE9DS1MgKGJsKTsKKyAgICAgIGluZGV4ICs9IDE7CisKKyAgICAgIC8qIERvbid0IHByaW50IG91dCBibG9ja3MgdGhhdCBoYXZlIGdvbmUgYnkuICAqLworICAgICAgd2hpbGUgKGluZGV4IDwgbGFzdF9pbmRleAorCSAgICAgJiYgQkxPQ0tfRU5EIChCTE9DS1ZFQ1RPUl9CTE9DSyAoYmwsIGluZGV4KSkgPCBwYykKKwlpbmRleCsrOworCisgICAgICB3aGlsZSAoaW5kZXggPCBsYXN0X2luZGV4CisJICAgICAmJiBCTE9DS19FTkQgKEJMT0NLVkVDVE9SX0JMT0NLIChibCwgaW5kZXgpKSA8IGVuZCkKKwl7CisJICBpZiAoYmxvY2tzX3NlYXJjaGVkW2luZGV4XSA9PSAwKQorCSAgICB7CisJICAgICAgc3RydWN0IGJsb2NrICpiID0gQkxPQ0tWRUNUT1JfQkxPQ0sgKGJsLCBpbmRleCk7CisJICAgICAgaW50IG5zeW1zOworCSAgICAgIHJlZ2lzdGVyIGludCBpOworCSAgICAgIHJlZ2lzdGVyIHN0cnVjdCBzeW1ib2wgKnN5bTsKKworCSAgICAgIG5zeW1zID0gQkxPQ0tfTlNZTVMgKGIpOworCisJICAgICAgZm9yIChpID0gMDsgaSA8IG5zeW1zOyBpKyspCisJCXsKKwkJICBzeW0gPSBCTE9DS19TWU0gKGIsIGkpOworCQkgIGlmIChTVFJFUSAoU1lNQk9MX05BTUUgKHN5bSksICJkZWZhdWx0IikpCisJCSAgICB7CisJCSAgICAgIGlmIChoYXZlX2RlZmF1bHQpCisJCQljb250aW51ZTsKKwkJICAgICAgaGF2ZV9kZWZhdWx0ID0gMTsKKwkJICAgIH0KKwkJICBpZiAoU1lNQk9MX0NMQVNTIChzeW0pID09IExPQ19MQUJFTCkKKwkJICAgIHsKKwkJICAgICAgc3RydWN0IHNhbF9jaGFpbiAqbmV4dCA9IChzdHJ1Y3Qgc2FsX2NoYWluICopCisJCQlhbGxvY2EgKHNpemVvZiAoc3RydWN0IHNhbF9jaGFpbikpOworCQkgICAgICBuZXh0LT5uZXh0ID0gc2FsX2NoYWluOworCQkgICAgICBuZXh0LT5zYWwgPSBmaW5kX3BjX2xpbmUgKFNZTUJPTF9WQUxVRV9BRERSRVNTIChzeW0pLCAwKTsKKwkJICAgICAgc2FsX2NoYWluID0gbmV4dDsKKwkJICAgIH0KKwkJfQorCSAgICAgIGJsb2Nrc19zZWFyY2hlZFtpbmRleF0gPSAxOworCSAgICB9CisJICBpbmRleCsrOworCX0KKyAgICAgIGlmIChoYXZlX2RlZmF1bHQpCisJYnJlYWs7CisgICAgICBpZiAoc2FsX2NoYWluICYmIHRoaXNfbGV2ZWxfb25seSkKKwlicmVhazsKKworICAgICAgLyogQWZ0ZXIgaGFuZGxpbmcgdGhlIGZ1bmN0aW9uJ3MgdG9wLWxldmVsIGJsb2NrLCBzdG9wLgorCSBEb24ndCBjb250aW51ZSB0byBpdHMgc3VwZXJibG9jaywgdGhlIGJsb2NrIG9mCisJIHBlci1maWxlIHN5bWJvbHMuICAqLworICAgICAgaWYgKEJMT0NLX0ZVTkNUSU9OIChibG9jaykpCisJYnJlYWs7CisgICAgICBibG9jayA9IEJMT0NLX1NVUEVSQkxPQ0sgKGJsb2NrKTsKKyAgICB9CisKKyAgaWYgKHNhbF9jaGFpbikKKyAgICB7CisgICAgICBzdHJ1Y3Qgc2FsX2NoYWluICp0bXBfY2hhaW47CisKKyAgICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgZW50cmllcy4gICovCisgICAgICBmb3IgKGluZGV4ID0gMCwgdG1wX2NoYWluID0gc2FsX2NoYWluOyB0bXBfY2hhaW47CisJICAgdG1wX2NoYWluID0gdG1wX2NoYWluLT5uZXh0KQorCWluZGV4Kys7CisKKyAgICAgIHNhbHMubmVsdHMgPSBpbmRleDsKKyAgICAgIHNhbHMuc2FscyA9IChzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lICopCisJeG1hbGxvYyAoaW5kZXggKiBzaXplb2YgKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUpKTsKKyAgICAgIGZvciAoaW5kZXggPSAwOyBzYWxfY2hhaW47IHNhbF9jaGFpbiA9IHNhbF9jaGFpbi0+bmV4dCwgaW5kZXgrKykKKwlzYWxzLnNhbHNbaW5kZXhdID0gc2FsX2NoYWluLT5zYWw7CisgICAgfQorCisgIHJldHVybiBzYWxzOworfQorCitzdGF0aWMgdm9pZAorZXBfc2tpcF9sZWFkaW5nX3doaXRlc3BhY2UgKHMpCisgICAgY2hhciAqKiAgczsKK3sKKyAgIGlmICgocyA9PSBOVUxMKSB8fCAoKnMgPT0gTlVMTCkpCisgICAgICAgcmV0dXJuOworICAgd2hpbGUgKGlzc3BhY2UoKipzKSkKKyAgICAgICAqcyArPSAxOworfQorIAorLyogVGhpcyBmdW5jdGlvbiBleGFtaW5lcyBhIHN0cmluZywgYW5kIGF0dGVtcHRzIHRvIGZpbmQgYSB0b2tlbgorICAgdGhhdCBtaWdodCBiZSBhbiBldmVudCBuYW1lIGluIHRoZSBsZWFkaW5nIGNoYXJhY3RlcnMuICBJZiBhCisgICBwb3NzaWJsZSBtYXRjaCBpcyBmb3VuZCwgYSBwb2ludGVyIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBvZgorICAgdGhlIHRva2VuIGlzIHJldHVybmVkLiAgRWxzZSwgTlVMTCBpcyByZXR1cm5lZC4gKi8KK3N0YXRpYyBjaGFyICoKK2VwX2ZpbmRfZXZlbnRfbmFtZV9lbmQgKGFyZykKKyAgY2hhciAqICBhcmc7Cit7CisgIGNoYXIgKiAgcyA9IGFyZzsKKyAgY2hhciAqICBldmVudF9uYW1lX2VuZCA9IE5VTEw7CisgCisgIC8qIElmIHdlIGNvdWxkIGRlcGVuZCB1cG9uIHRoZSBwcmVzZW5zZSBvZiBzdHJycGJyaywgd2UnZCB1c2UgdGhhdC4uLiAqLworICBpZiAoYXJnID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgCisgIC8qIFdlIGJyZWFrIG91dCBvZiB0aGUgbG9vcCB3aGVuIHdlIGZpbmQgYSB0b2tlbiBkZWxpbWl0ZXIuCisgICBCYXNpY2FsbHksIHdlJ3JlIGxvb2tpbmcgZm9yIGFscGhhbnVtZXJpY3MgYW5kIHVuZGVyc2NvcmVzOworICAgYW55dGhpbmcgZWxzZSBkZWxpbWl0ZXMgdGhlIHRva2VuLiAqLworICB3aGlsZSAoKnMgIT0gJ1wwJykKKyAgICB7CisgICAgICBpZiAoISBpc2FsbnVtKCpzKSAmJiAoKnMgIT0gJ18nKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBldmVudF9uYW1lX2VuZCA9IHM7CisgICAgICBzKys7CisgICAgfQorIAorICByZXR1cm4gZXZlbnRfbmFtZV9lbmQ7Cit9CisKKyAKKy8qIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gcGFyc2UgYW4gb3B0aW9uYWwgImlmIDxjb25kPiIgY2xhdXNlCisgICBmcm9tIHRoZSBhcmcgc3RyaW5nLiAgSWYgb25lIGlzIG5vdCBmb3VuZCwgaXQgcmV0dXJucyBOVUxMLgorIAorICAgRWxzZSwgaXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNvbmRpdGlvbiBzdHJpbmcuICAoSXQgZG9lcyBub3QKKyAgIGF0dGVtcHQgdG8gZXZhbHVhdGUgdGhlIHN0cmluZyBhZ2FpbnN0IGEgcGFydGljdWxhciBibG9jay4pICBBbmQsCisgICBpdCB1cGRhdGVzIGFyZyB0byBwb2ludCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGZvbGxvd2luZyB0aGUgcGFyc2VkCisgICBpZiBjbGF1c2UgaW4gdGhlIGFyZyBzdHJpbmcuICovCitzdGF0aWMgY2hhciAqCitlcF9wYXJzZV9vcHRpb25hbF9pZl9jbGF1c2UgKGFyZykKKyAgY2hhciAqKiAgYXJnOworeworICBjaGFyICogIGNvbmRfc3RyaW5nOworIAorICBpZiAoKCgqYXJnKVswXSAhPSAnaScpIHx8ICgoKmFyZylbMV0gIT0gJ2YnKSB8fCAhaXNzcGFjZSgoKmFyZylbMl0pKQorICAgIHJldHVybiBOVUxMOworIAorICAvKiBTa2lwIHRoZSAiaWYiIGtleXdvcmQuICovCisgICgqYXJnKSArPSAyOworIAorICAvKiBTa2lwIGFueSBleHRyYSBsZWFkaW5nIHdoaXRlc3BhY2UsIGFuZCByZWNvcmQgdGhlIHN0YXJ0IG9mIHRoZQorICAgICBjb25kaXRpb24gc3RyaW5nLiAqLworICBlcF9za2lwX2xlYWRpbmdfd2hpdGVzcGFjZSAoYXJnKTsKKyAgY29uZF9zdHJpbmcgPSAqYXJnOworIAorICAvKiBBc3N1bWUgdGhhdCB0aGUgY29uZGl0aW9uIG9jY3VwaWVzIHRoZSByZW1haW5kZXIgb2YgdGhlIGFyZyBzdHJpbmcuICovCisgICgqYXJnKSArPSBzdHJsZW4gKGNvbmRfc3RyaW5nKTsKKyAKKyAgcmV0dXJuIGNvbmRfc3RyaW5nOworfQorIAorLyogVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBwYXJzZSBhbiBvcHRpb25hbCBmaWxlbmFtZSBmcm9tIHRoZSBhcmcKKyAgIHN0cmluZy4gIElmIG9uZSBpcyBub3QgZm91bmQsIGl0IHJldHVybnMgTlVMTC4KKyAKKyAgIEVsc2UsIGl0IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBwYXJzZWQgZmlsZW5hbWUuICAoVGhpcyBmdW5jdGlvbgorICAgbWFrZXMgbm8gYXR0ZW1wdCB0byB2ZXJpZnkgdGhhdCBhIGZpbGUgb2YgdGhhdCBuYW1lIGV4aXN0cywgb3IgaXMKKyAgIGFjY2Vzc2libGUuKSAgQW5kLCBpdCB1cGRhdGVzIGFyZyB0byBwb2ludCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyCisgICBmb2xsb3dpbmcgdGhlIHBhcnNlZCBmaWxlbmFtZSBpbiB0aGUgYXJnIHN0cmluZy4KKyAKKyAgIE5vdGUgdGhhdCBjbGllbnRzIG5lZWRpbmcgdG8gcHJlc2VydmUgdGhlIHJldHVybmVkIGZpbGVuYW1lIGZvcgorICAgZnV0dXJlIGFjY2VzcyBzaG91bGQgY29weSBpdCB0byB0aGVpciBvd24gYnVmZmVycy4gKi8KK3N0YXRpYyBjaGFyICoKK2VwX3BhcnNlX29wdGlvbmFsX2ZpbGVuYW1lIChhcmcpCisgIGNoYXIgKiogIGFyZzsKK3sKKyAgc3RhdGljIGNoYXIgIGZpbGVuYW1lIFsxMDI0XTsKKyAgY2hhciAqICBhcmdfcCA9ICphcmc7CisgIGludCAgaTsKKyAgY2hhciAgYzsKKyAKKyAgaWYgKCgqYXJnX3AgPT0gJ1wwJykgfHwgaXNzcGFjZSAoKmFyZ19wKSkKKyAgICByZXR1cm4gTlVMTDsKKyAKKyAgZm9yIChpPTA7IDsgaSsrKQorICAgIHsKKyAgICAgIGMgPSAqYXJnX3A7CisgICAgICBpZiAoaXNzcGFjZSAoYykpCisgICAgICAgIGMgPSAnXDAnOworICAgICAgZmlsZW5hbWVbaV0gPSBjOworICAgICAgaWYgKGMgPT0gJ1wwJykKKyAgICAgICAgYnJlYWs7CisgICAgICBhcmdfcCsrOworICAgIH0KKyAgKmFyZyA9IGFyZ19wOworIAorICByZXR1cm4gZmlsZW5hbWU7Cit9CisgCisvKiBDb21tYW5kcyB0byBkZWFsIHdpdGggY2F0Y2hpbmcgZXZlbnRzLCBzdWNoIGFzIHNpZ25hbHMsIGV4Y2VwdGlvbnMsCisgICBwcm9jZXNzIHN0YXJ0L2V4aXQsIGV0Yy4gICovCisgCit0eXBlZGVmIGVudW0ge2NhdGNoX2ZvcmssIGNhdGNoX3Zmb3JrfSBjYXRjaF9mb3JrX2tpbmQ7CisgCitzdGF0aWMgdm9pZAorY2F0Y2hfZm9ya19jb21tYW5kXzEgKGZvcmtfa2luZCwgYXJnLCB0ZW1wZmxhZywgZnJvbV90dHkpCisgIGNhdGNoX2Zvcmtfa2luZCAgZm9ya19raW5kOworICBjaGFyICogIGFyZzsKKyAgaW50ICB0ZW1wZmxhZzsKKyAgaW50ICBmcm9tX3R0eTsKK3sKKyAgY2hhciAqICBjb25kX3N0cmluZyA9IE5VTEw7CisgCisgIGVwX3NraXBfbGVhZGluZ193aGl0ZXNwYWNlICgmYXJnKTsKKyAKKyAgLyogVGhlIGFsbG93ZWQgc3ludGF4IGlzOgorICAgICAgICBjYXRjaCBbdl1mb3JrCisgICAgICAgIGNhdGNoIFt2XWZvcmsgaWYgPGNvbmQ+CisgCisgICAgIEZpcnN0LCBjaGVjayBpZiB0aGVyZSdzIGFuIGlmIGNsYXVzZS4gKi8KKyAgY29uZF9zdHJpbmcgPSBlcF9wYXJzZV9vcHRpb25hbF9pZl9jbGF1c2UgKCZhcmcpOworIAorICBpZiAoKCphcmcgIT0gJ1wwJykgJiYgIWlzc3BhY2UgKCphcmcpKQorICAgIGVycm9yICgiSnVuayBhdCBlbmQgb2YgYXJndW1lbnRzLiIpOworIAorICAvKiBJZiB0aGlzIHRhcmdldCBzdXBwb3J0cyBpdCwgY3JlYXRlIGEgZm9yayBvciB2Zm9yayBjYXRjaHBvaW50CisgICAgIGFuZCBlbmFibGUgcmVwb3J0aW5nIG9mIHN1Y2ggZXZlbnRzLiAqLworICBzd2l0Y2ggKGZvcmtfa2luZCkgeworICAgIGNhc2UgY2F0Y2hfZm9yayA6CisgICAgICBjcmVhdGVfZm9ya19ldmVudF9jYXRjaHBvaW50ICh0ZW1wZmxhZywgY29uZF9zdHJpbmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjYXRjaF92Zm9yayA6CisgICAgICBjcmVhdGVfdmZvcmtfZXZlbnRfY2F0Y2hwb2ludCAodGVtcGZsYWcsIGNvbmRfc3RyaW5nKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQgOgorICAgICAgZXJyb3IgKCJ1bnN1cHBvcnRlZCBvciB1bmtub3duIGZvcmsga2luZDsgY2Fubm90IGNhdGNoIGl0Iik7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorY2F0Y2hfZXhlY19jb21tYW5kXzEgKGFyZywgdGVtcGZsYWcsIGZyb21fdHR5KQorICBjaGFyICogIGFyZzsKKyAgaW50ICB0ZW1wZmxhZzsKKyAgaW50ICBmcm9tX3R0eTsKK3sKKyAgY2hhciAqICBjb25kX3N0cmluZyA9IE5VTEw7CisKKyAgZXBfc2tpcF9sZWFkaW5nX3doaXRlc3BhY2UgKCZhcmcpOworCisgIC8qIFRoZSBhbGxvd2VkIHN5bnRheCBpczoKKyAgICAgICAgY2F0Y2ggZXhlYworICAgICAgICBjYXRjaCBleGVjIGlmIDxjb25kPgorCisgICAgIEZpcnN0LCBjaGVjayBpZiB0aGVyZSdzIGFuIGlmIGNsYXVzZS4gKi8KKyAgY29uZF9zdHJpbmcgPSBlcF9wYXJzZV9vcHRpb25hbF9pZl9jbGF1c2UgKCZhcmcpOworCisgIGlmICgoKmFyZyAhPSAnXDAnKSAmJiAhaXNzcGFjZSAoKmFyZykpCisgICAgZXJyb3IgKCJKdW5rIGF0IGVuZCBvZiBhcmd1bWVudHMuIik7CisKKyAgLyogSWYgdGhpcyB0YXJnZXQgc3VwcG9ydHMgaXQsIGNyZWF0ZSBhbiBleGVjIGNhdGNocG9pbnQKKyAgICAgYW5kIGVuYWJsZSByZXBvcnRpbmcgb2Ygc3VjaCBldmVudHMuICovCisgIGNyZWF0ZV9leGVjX2V2ZW50X2NhdGNocG9pbnQgKHRlbXBmbGFnLCBjb25kX3N0cmluZyk7Cit9CisgCisjaWYgZGVmaW5lZChTT0xJQl9BREQpCitzdGF0aWMgdm9pZAorY2F0Y2hfbG9hZF9jb21tYW5kXzEgKGFyZywgdGVtcGZsYWcsIGZyb21fdHR5KQorICBjaGFyICogIGFyZzsKKyAgaW50ICB0ZW1wZmxhZzsKKyAgaW50ICBmcm9tX3R0eTsKK3sKKyAgY2hhciAqICBkbGxfcGF0aG5hbWUgPSBOVUxMOworICBjaGFyICogIGNvbmRfc3RyaW5nID0gTlVMTDsKKyAKKyAgZXBfc2tpcF9sZWFkaW5nX3doaXRlc3BhY2UgKCZhcmcpOworIAorICAvKiBUaGUgYWxsb3dlZCBzeW50YXggaXM6CisgICAgICAgIGNhdGNoIGxvYWQKKyAgICAgICAgY2F0Y2ggbG9hZCBpZiA8Y29uZD4KKyAgICAgICAgY2F0Y2ggbG9hZCA8ZmlsZW5hbWU+CisgICAgICAgIGNhdGNoIGxvYWQgPGZpbGVuYW1lPiBpZiA8Y29uZD4KKyAKKyAgICAgVGhlIHVzZXIgaXMgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSB0aGUgPGZpbGVuYW1lPiBhZnRlciBhbgorICAgICBpZiBjbGF1c2UuCisgCisgICAgIFdlJ2xsIGlnbm9yZSB0aGUgcGF0aG9sb2dpY2FsIGNhc2Ugb2YgYSBmaWxlIG5hbWVkICJpZiIuCisgCisgICAgIEZpcnN0LCBjaGVjayBpZiB0aGVyZSdzIGFuIGlmIGNsYXVzZS4gIElmIHNvLCB0aGVuIHRoZXJlCisgICAgIGNhbm5vdCBiZSBhIGZpbGVuYW1lLiAqLworICBjb25kX3N0cmluZyA9IGVwX3BhcnNlX29wdGlvbmFsX2lmX2NsYXVzZSAoJmFyZyk7CisgCisgIC8qIElmIHRoZXJlIHdhcyBhbiBpZiBjbGF1c2UsIHRoZW4gdGhlcmUgY2Fubm90IGJlIGEgZmlsZW5hbWUuCisgICAgIEVsc2UsIHRoZXJlIG1pZ2h0IGJlIGEgZmlsZW5hbWUgYW5kIGFuIGlmIGNsYXVzZS4gKi8KKyAgaWYgKGNvbmRfc3RyaW5nID09IE5VTEwpCisgICAgeworICAgICAgZGxsX3BhdGhuYW1lID0gZXBfcGFyc2Vfb3B0aW9uYWxfZmlsZW5hbWUgKCZhcmcpOworICAgICAgZXBfc2tpcF9sZWFkaW5nX3doaXRlc3BhY2UgKCZhcmcpOworICAgICAgY29uZF9zdHJpbmcgPSBlcF9wYXJzZV9vcHRpb25hbF9pZl9jbGF1c2UgKCZhcmcpOworICAgIH0KKyAKKyAgaWYgKCgqYXJnICE9ICdcMCcpICYmICFpc3NwYWNlICgqYXJnKSkKKyAgICBlcnJvciAoIkp1bmsgYXQgZW5kIG9mIGFyZ3VtZW50cy4iKTsKKyAKKyAgLyogQ3JlYXRlIGEgbG9hZCBicmVha3BvaW50IHRoYXQgb25seSB0cmlnZ2VycyB3aGVuIGEgbG9hZCBvZgorICAgICB0aGUgc3BlY2lmaWVkIGRsbCAob3IgYW55IGRsbCwgaWYgbm8gcGF0aG5hbWUgd2FzIHNwZWNpZmllZCkKKyAgICAgb2NjdXJzLiAqLworICBTT0xJQl9DUkVBVEVfQ0FUQ0hfTE9BRF9IT09LIChpbmZlcmlvcl9waWQsIHRlbXBmbGFnLCBkbGxfcGF0aG5hbWUsIGNvbmRfc3RyaW5nKTsKK30KKyAKK3N0YXRpYyB2b2lkCitjYXRjaF91bmxvYWRfY29tbWFuZF8xIChhcmcsIHRlbXBmbGFnLCBmcm9tX3R0eSkKKyAgY2hhciAqICBhcmc7CisgIGludCAgdGVtcGZsYWc7CisgIGludCAgZnJvbV90dHk7Cit7CisgIGNoYXIgKiAgZGxsX3BhdGhuYW1lID0gTlVMTDsKKyAgY2hhciAqICBjb25kX3N0cmluZyA9IE5VTEw7CisgCisgIGVwX3NraXBfbGVhZGluZ193aGl0ZXNwYWNlICgmYXJnKTsKKyAKKyAgLyogVGhlIGFsbG93ZWQgc3ludGF4IGlzOgorICAgICAgICBjYXRjaCB1bmxvYWQKKyAgICAgICAgY2F0Y2ggdW5sb2FkIGlmIDxjb25kPgorICAgICAgICBjYXRjaCB1bmxvYWQgPGZpbGVuYW1lPgorICAgICAgICBjYXRjaCB1bmxvYWQgPGZpbGVuYW1lPiBpZiA8Y29uZD4KKyAKKyAgICAgVGhlIHVzZXIgaXMgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSB0aGUgPGZpbGVuYW1lPiBhZnRlciBhbgorICAgICBpZiBjbGF1c2UuCisgCisgICAgIFdlJ2xsIGlnbm9yZSB0aGUgcGF0aG9sb2dpY2FsIGNhc2Ugb2YgYSBmaWxlIG5hbWVkICJpZiIuCisgCisgICAgIEZpcnN0LCBjaGVjayBpZiB0aGVyZSdzIGFuIGlmIGNsYXVzZS4gIElmIHNvLCB0aGVuIHRoZXJlCisgICAgIGNhbm5vdCBiZSBhIGZpbGVuYW1lLiAqLworICBjb25kX3N0cmluZyA9IGVwX3BhcnNlX29wdGlvbmFsX2lmX2NsYXVzZSAoJmFyZyk7CisgCisgIC8qIElmIHRoZXJlIHdhcyBhbiBpZiBjbGF1c2UsIHRoZW4gdGhlcmUgY2Fubm90IGJlIGEgZmlsZW5hbWUuCisgICAgIEVsc2UsIHRoZXJlIG1pZ2h0IGJlIGEgZmlsZW5hbWUgYW5kIGFuIGlmIGNsYXVzZS4gKi8KKyAgaWYgKGNvbmRfc3RyaW5nID09IE5VTEwpCisgICAgeworICAgICAgZGxsX3BhdGhuYW1lID0gZXBfcGFyc2Vfb3B0aW9uYWxfZmlsZW5hbWUgKCZhcmcpOworICAgICAgZXBfc2tpcF9sZWFkaW5nX3doaXRlc3BhY2UgKCZhcmcpOworICAgICAgY29uZF9zdHJpbmcgPSBlcF9wYXJzZV9vcHRpb25hbF9pZl9jbGF1c2UgKCZhcmcpOworICAgIH0KKyAKKyAgaWYgKCgqYXJnICE9ICdcMCcpICYmICFpc3NwYWNlICgqYXJnKSkKKyAgICBlcnJvciAoIkp1bmsgYXQgZW5kIG9mIGFyZ3VtZW50cy4iKTsKKyAKKyAgLyogQ3JlYXRlIGFuIHVubG9hZCBicmVha3BvaW50IHRoYXQgb25seSB0cmlnZ2VycyB3aGVuIGFuIHVubG9hZCBvZgorICAgICB0aGUgc3BlY2lmaWVkIGRsbCAob3IgYW55IGRsbCwgaWYgbm8gcGF0aG5hbWUgd2FzIHNwZWNpZmllZCkKKyAgICAgb2NjdXJzLiAqLworICBTT0xJQl9DUkVBVEVfQ0FUQ0hfVU5MT0FEX0hPT0sgKGluZmVyaW9yX3BpZCwgdGVtcGZsYWcsIGRsbF9wYXRobmFtZSwgY29uZF9zdHJpbmcpOworfQorI2VuZGlmIC8qIFNPTElCX0FERCAqLworCisvKiBDb21tYW5kcyB0byBkZWFsIHdpdGggY2F0Y2hpbmcgZXhjZXB0aW9ucy4gICovCisKKy8qIFNldCBhIGJyZWFrcG9pbnQgYXQgdGhlIHNwZWNpZmllZCBjYWxsYmFjayByb3V0aW5lIGZvciBhbgorICAgZXhjZXB0aW9uIGV2ZW50IGNhbGxiYWNrICovIAorCitzdGF0aWMgdm9pZAorY3JlYXRlX2V4Y2VwdGlvbl9jYXRjaHBvaW50ICh0ZW1wZmxhZywgY29uZF9zdHJpbmcsIGV4X2V2ZW50LCBzYWwpCisgIGludCB0ZW1wZmxhZzsKKyAgY2hhciAqIGNvbmRfc3RyaW5nOworICBlbnVtIGV4Y2VwdGlvbl9ldmVudF9raW5kIGV4X2V2ZW50OworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lICogc2FsOworeworICBzdHJ1Y3QgYnJlYWtwb2ludCAqICBiOworICBpbnQgIGk7CisgIGludCAgdGhyZWFkID0gLTE7ICAvKiBBbGwgdGhyZWFkcy4gKi8KKworICBpZiAoIXNhbCkgLyogbm8gZXhjZXB0aW9uIHN1cHBvcnQ/ICovCisgICAgcmV0dXJuOworCisgIGIgPSBzZXRfcmF3X2JyZWFrcG9pbnQgKCpzYWwpOworICBzZXRfYnJlYWtwb2ludF9jb3VudCAoYnJlYWtwb2ludF9jb3VudCArIDEpOworICBiLT5udW1iZXIgPSBicmVha3BvaW50X2NvdW50OworICBiLT5jb25kID0gTlVMTDsKKyAgYi0+Y29uZF9zdHJpbmcgPSAoY29uZF9zdHJpbmcgPT0gTlVMTCkgPyBOVUxMIDogc2F2ZXN0cmluZyAoY29uZF9zdHJpbmcsIHN0cmxlbiAoY29uZF9zdHJpbmcpKTsKKyAgYi0+dGhyZWFkID0gdGhyZWFkOworICBiLT5hZGRyX3N0cmluZyA9IE5VTEw7CisgIGItPmVuYWJsZSA9IGVuYWJsZWQ7CisgIGItPmRpc3Bvc2l0aW9uID0gdGVtcGZsYWcgPyBkZWwgOiBkb250dG91Y2g7CisgIHN3aXRjaCAoZXhfZXZlbnQpCisgICAgeworICAgICAgY2FzZSBFWF9FVkVOVF9USFJPVzoKKyAgICAgICAgYi0+dHlwZSA9IGJwX2NhdGNoX3Rocm93OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRVhfRVZFTlRfQ0FUQ0g6CisgICAgICAgIGItPnR5cGUgPSBicF9jYXRjaF9jYXRjaDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAvKiBlcnJvciBjb25kaXRpb24gKi8gCisgICAgICAgIGItPnR5cGUgPSBicF9ub25lOworICAgICAgICBiLT5lbmFibGUgPSBkaXNhYmxlZDsKKyAgICAgICAgZXJyb3IgKCJJbnRlcm5hbCBlcnJvciAtLSBpbnZhbGlkIGNhdGNocG9pbnQga2luZCIpOworICAgIH0KKyAgbWVudGlvbiAoYik7Cit9CisKKy8qIERlYWwgd2l0aCAiY2F0Y2ggY2F0Y2giIGFuZCAiY2F0Y2ggdGhyb3ciIGNvbW1hbmRzICovIAorCitzdGF0aWMgdm9pZAorY2F0Y2hfZXhjZXB0aW9uX2NvbW1hbmRfMSAoZXhfZXZlbnQsIGFyZywgdGVtcGZsYWcsIGZyb21fdHR5KQorICBlbnVtIGV4Y2VwdGlvbl9ldmVudF9raW5kIGV4X2V2ZW50OworICBjaGFyICogIGFyZzsKKyAgaW50ICB0ZW1wZmxhZzsKKyAgaW50ICBmcm9tX3R0eTsKK3sKKyAgY2hhciAqIGNvbmRfc3RyaW5nID0gTlVMTDsKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSAqIHNhbCA9IE5VTEw7CisgIAorICBlcF9za2lwX2xlYWRpbmdfd2hpdGVzcGFjZSAoJmFyZyk7CisgIAorICBjb25kX3N0cmluZyA9IGVwX3BhcnNlX29wdGlvbmFsX2lmX2NsYXVzZSAoJmFyZyk7CisKKyAgaWYgKCgqYXJnICE9ICdcMCcpICYmICFpc3NwYWNlICgqYXJnKSkKKyAgICBlcnJvciAoIkp1bmsgYXQgZW5kIG9mIGFyZ3VtZW50cy4iKTsKKworICBpZiAoKGV4X2V2ZW50ICE9IEVYX0VWRU5UX1RIUk9XKSAmJgorICAgICAgKGV4X2V2ZW50ICE9IEVYX0VWRU5UX0NBVENIKSkKKyAgICBlcnJvciAoIlVuc3VwcG9ydGVkIG9yIHVua25vd24gZXhjZXB0aW9uIGV2ZW50OyBjYW5ub3QgY2F0Y2ggaXQiKTsKKworICAvKiBTZWUgaWYgd2UgY2FuIGZpbmQgYSBjYWxsYmFjayByb3V0aW5lICovCisgIHNhbCA9IHRhcmdldF9lbmFibGVfZXhjZXB0aW9uX2NhbGxiYWNrIChleF9ldmVudCwgMSk7CisKKyAgaWYgKHNhbCkgCisgICAgeworICAgICAgLyogV2UgaGF2ZSBjYWxsYmFja3MgZnJvbSB0aGUgcnVudGltZSBzeXN0ZW0gZm9yIGV4Y2VwdGlvbnMuCisgICAgICAgICBTZXQgYSBicmVha3BvaW50IG9uIHRoZSBzYWwgZm91bmQsIGlmIG5vIGVycm9ycyAqLyAKKyAgICAgIGlmIChzYWwgIT0gKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgKikgLTEpCisgICAgICAgIGNyZWF0ZV9leGNlcHRpb25fY2F0Y2hwb2ludCAodGVtcGZsYWcsIGNvbmRfc3RyaW5nLCBleF9ldmVudCwgc2FsKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuOyAvKiBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHNldHRpbmcgdXAgY2FsbGJhY2tzICovIAorICAgIH0KKyAgZWxzZSAgCisgICAgeworICAgICAgLyogTm8gY2FsbGJhY2tzIGZyb20gcnVudGltZSBzeXN0ZW0gZm9yIGV4Y2VwdGlvbnMuCisgICAgICAgICBUcnkgR05VIEMrKyBleGNlcHRpb24gYnJlYWtwb2ludHMgdXNpbmcgbGFiZWxzIGluIGRlYnVnIGluZm8uICovCisgICAgICBpZiAoZXhfZXZlbnQgPT0gRVhfRVZFTlRfQ0FUQ0gpCisgICAgICAgIHsKKyAgICAgICAgICBoYW5kbGVfZ251XzRfMTZfY2F0Y2hfY29tbWFuZCAoYXJnLCB0ZW1wZmxhZywgZnJvbV90dHkpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChleF9ldmVudCA9PSBFWF9FVkVOVF9USFJPVykKKyAgICAgICAgeworICAgICAgICAgIC8qIFNldCBhIGJyZWFrcG9pbnQgb24gX19yYWlzZV9leGNlcHRpb24gKCkgKi8KKyAgICAgICAgICAKKyAgICAgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChnZGJfc3RkZXJyLCAiVW5zdXBwb3J0ZWQgd2l0aCB0aGlzIHBsYXRmb3JtL2NvbXBpbGVyIGNvbWJpbmF0aW9uLlxuIik7CisgICAgICAgICAgZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlBlcmhhcHMgeW91IGNhbiBhY2hpZXZlIHRoZSBlZmZlY3QgeW91IHdhbnQgYnkgc2V0dGluZ1xuIik7CisgICAgICAgICAgZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgImEgYnJlYWtwb2ludCBvbiBfX3JhaXNlX2V4Y2VwdGlvbigpLlxuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIENvdmVyIHJvdXRpbmUgdG8gYWxsb3cgd3JhcHBpbmcgdGFyZ2V0X2VuYWJsZV9leGNlcHRpb25fY2F0Y2hwb2ludHMKKyAgIGluc2lkZSBhIGNhdGNoX2Vycm9ycyAqLworCitzdGF0aWMgaW50Citjb3Zlcl90YXJnZXRfZW5hYmxlX2V4Y2VwdGlvbl9jYWxsYmFjayAoYXJnKQorICBQVFIgYXJnOworeworICBhcmdzX2Zvcl9jYXRjaHBvaW50X2VuYWJsZSAqYXJncyA9IGFyZzsKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSAqc2FsOworICBzYWwgPSB0YXJnZXRfZW5hYmxlX2V4Y2VwdGlvbl9jYWxsYmFjayAoYXJncy0+a2luZCwgYXJncy0+ZW5hYmxlKTsKKyAgaWYgKHNhbCA9PSBOVUxMKQorICAgIHJldHVybiAwOworICBlbHNlIGlmIChzYWwgPT0gKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgKikgLTEpCisgICAgcmV0dXJuIC0xOworICBlbHNlCisgICAgcmV0dXJuIDE7IC8qaXMgdmFsaWQqLworfQorCisKKworLyogVGhpcyBpcyB0aGUgb3JpZ2luYWwgdi40LjE2IGFuZCBlYXJsaWVyIHZlcnNpb24gb2YgdGhlCisgICBjYXRjaF9jb21tYW5kXzEoKSBmdW5jdGlvbi4gIE5vdyB0aGF0IG90aGVyIGZsYXZvdXJzIG9mICJjYXRjaCIKKyAgIGhhdmUgYmVlbiBpbnRyb2R1Y2VkLCBhbmQgc2luY2UgZXhjZXB0aW9uIGhhbmRsaW5nIGNhbiBiZSBoYW5kbGVkCisgICBpbiBvdGhlciB3YXlzICh0aHJvdWdoIHRhcmdldCBvcHMpIGFsc28sIHRoaXMgaXMgdXNlZCBvbmx5IGZvciB0aGUKKyAgIEdOVSBDKysgZXhjZXB0aW9uIGhhbmRsaW5nIHN5c3RlbS4KKyAgIE5vdGU6IE9ubHkgdGhlICJjYXRjaCIgZmxhdm91ciBvZiBHREIgNC4xNiBpcyBoYW5kbGVkIGhlcmUuICBUaGUKKyAgICJjYXRjaCBOQU1FIiBpcyBub3cgbm8gbG9uZ2VyIGFsbG93ZWQgaW4gY2F0Y2hfY29tbWFuZF8xKCkuICBBbHNvLAorICAgdGhlcmUgd2FzIG5vIGNvZGUgaW4gR0RCIDQuMTYgZm9yICJjYXRjaCB0aHJvdyIuIAorICAKKyAgIENhbGxlZCBmcm9tIGNhdGNoX2V4Y2VwdGlvbl9jb21tYW5kXzEgKCkgKi8KKworCitzdGF0aWMgdm9pZAoraGFuZGxlX2dudV80XzE2X2NhdGNoX2NvbW1hbmQgKGFyZywgdGVtcGZsYWcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCB0ZW1wZmxhZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICAvKiBGaXJzdCwgdHJhbnNsYXRlIEFSRyBpbnRvIHNvbWV0aGluZyB3ZSBjYW4gZGVhbCB3aXRoIGluIHRlcm1zCisgICAgIG9mIGJyZWFrcG9pbnRzLiAgKi8KKworICBzdHJ1Y3Qgc3ltdGFic19hbmRfbGluZXMgc2FsczsKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CisgIHJlZ2lzdGVyIHN0cnVjdCBleHByZXNzaW9uICpjb25kID0gMDsKKyAgcmVnaXN0ZXIgc3RydWN0IGJyZWFrcG9pbnQgKmI7CisgIGNoYXIgKnNhdmVfYXJnOworICBpbnQgaTsKKworICBJTklUX1NBTCAoJnNhbCk7CS8qIGluaXRpYWxpemUgdG8gemVyb2VzICovCisKKyAgLyogSWYgbm8gYXJnIGdpdmVuLCBvciBpZiBmaXJzdCBhcmcgaXMgJ2lmICcsIGFsbCBhY3RpdmUgY2F0Y2ggY2xhdXNlcworICAgICBhcmUgYnJlYWtwb2ludGVkLiAqLworCisgIGlmICghYXJnIHx8IChhcmdbMF0gPT0gJ2knICYmIGFyZ1sxXSA9PSAnZicgCisJICAgICAgICYmIChhcmdbMl0gPT0gJyAnIHx8IGFyZ1syXSA9PSAnXHQnKSkpCisgICAgeworICAgICAgLyogR3JhYiBhbGwgYWN0aXZlIGNhdGNoIGNsYXVzZXMuICAqLworICAgICAgc2FscyA9IGdldF9jYXRjaF9zYWxzICgwKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBHcmFiIHNlbGVjdGVkIGNhdGNoIGNsYXVzZXMuICAqLworICAgICAgZXJyb3IgKCJjYXRjaCBOQU1FIG5vdCBpbXBsZW1lbnRlZCIpOworCisjaWYgMAorICAgICAgLyogTm90IHN1cmUgd2h5IHRoaXMgY29kZSBoYXMgYmVlbiBkaXNhYmxlZC4gSSdtIGxlYXZpbmcKKyAgICAgICAgIGl0IGRpc2FibGVkLiAgV2UgY2FuIG5ldmVyIGNvbWUgaGVyZSBub3cgYW55d2F5CisgICAgICAgICBzaW5jZSB3ZSBkb24ndCBhbGxvdyB0aGUgImNhdGNoIE5BTUUiIHN5bnRheC4KKyAgICAgICAgIHBhaS8xOTk3LTA3LTExICovIAorCisgICAgICAvKiBUaGlzIGlzbid0IHVzZWQ7IEkgZG9uJ3Qga25vdyB3aGF0IGl0IHdhcyBmb3IuICAqLworICAgICAgc2FscyA9IG1hcF9jYXRjaF9uYW1lcyAoYXJnLCBjYXRjaF9icmVha3BvaW50KTsKKyNlbmRpZgorICAgIH0KKworICBpZiAoISBzYWxzLm5lbHRzKSAKKyAgICByZXR1cm47CisKKyAgc2F2ZV9hcmcgPSBhcmc7CisgIGZvciAoaSA9IDA7IGkgPCBzYWxzLm5lbHRzOyBpKyspCisgICAgeworICAgICAgcmVzb2x2ZV9zYWxfcGMgKCZzYWxzLnNhbHNbaV0pOworICAgICAgCisgICAgICB3aGlsZSAoYXJnICYmICphcmcpCisJeworCSAgaWYgKGFyZ1swXSA9PSAnaScgJiYgYXJnWzFdID09ICdmJworCSAgICAgICYmIChhcmdbMl0gPT0gJyAnIHx8IGFyZ1syXSA9PSAnXHQnKSkKKwkgICAgY29uZCA9IHBhcnNlX2V4cF8xICgoYXJnICs9IDIsICZhcmcpLCAKKwkJCQlibG9ja19mb3JfcGMgKHNhbHMuc2Fsc1tpXS5wYyksIDApOworCSAgZWxzZQorCSAgICBlcnJvciAoIkp1bmsgYXQgZW5kIG9mIGFyZ3VtZW50cy4iKTsKKwl9CisgICAgICBhcmcgPSBzYXZlX2FyZzsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHNhbHMubmVsdHM7IGkrKykKKyAgICB7CisgICAgICBzYWwgPSBzYWxzLnNhbHNbaV07CisKKyAgICAgIGlmIChmcm9tX3R0eSkKKwlkZXNjcmliZV9vdGhlcl9icmVha3BvaW50cyAoc2FsLnBjLCBzYWwuc2VjdGlvbik7CisKKyAgICAgIGIgPSBzZXRfcmF3X2JyZWFrcG9pbnQgKHNhbCk7CisgICAgICBzZXRfYnJlYWtwb2ludF9jb3VudCAoYnJlYWtwb2ludF9jb3VudCArIDEpOworICAgICAgYi0+bnVtYmVyID0gYnJlYWtwb2ludF9jb3VudDsKKyAgICAgIGItPnR5cGUgPSBicF9icmVha3BvaW50OyAvKiBJbXBvcnRhbnQgLS0gdGhpcyBpcyBhbiBvcmRpbmFyeSBicmVha3BvaW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBwbGF0Zm9ybXMgd2l0aCBjYWxsYmFjayBzdXBwb3J0IGZvciBleGNlcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV9leGNlcHRpb25fY2F0Y2hwb2ludCgpIHdpbGwgY3JlYXRlIHNwZWNpYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicCB0eXBlcyAoYnBfY2F0Y2hfY2F0Y2ggYW5kIGJwX2NhdGNoX3Rocm93KSwgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgY29kZSBpbiBpbnNlcnRfYnJlYWtwb2ludHMoKSBhbmQgZWxzZXdoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBkZXBlbmRzIG9uIHRoYXQuICovCisKKyAgICAgIGItPmNvbmQgPSBjb25kOworICAgICAgYi0+ZW5hYmxlID0gZW5hYmxlZDsKKyAgICAgIGItPmRpc3Bvc2l0aW9uID0gdGVtcGZsYWcgPyBkZWwgOiBkb250dG91Y2g7CisKKyAgICAgIG1lbnRpb24gKGIpOworICAgIH0KKworICBpZiAoc2Fscy5uZWx0cyA+IDEpCisgICAgeworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJNdWx0aXBsZSBicmVha3BvaW50cyB3ZXJlIHNldC5cbiIpOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJVc2UgdGhlIFwiZGVsZXRlXCIgY29tbWFuZCB0byBkZWxldGUgdW53YW50ZWQgYnJlYWtwb2ludHMuXG4iKTsKKyAgICB9CisgIGZyZWUgKChQVFIpc2Fscy5zYWxzKTsKK30KKworI2lmIDAKKy8qIFRoaXMgY3JlYXRlcyBhIHRlbXBvcmFyeSBpbnRlcm5hbCBicmVha3BvaW50CisgICBqdXN0IHRvIHBsYWNhdGUgaW5mcnVuICovCitzdGF0aWMgc3RydWN0IGJyZWFrcG9pbnQgKgorY3JlYXRlX3RlbXBfZXhjZXB0aW9uX2JyZWFrcG9pbnQgKHBjKQorICBDT1JFX0FERFIgcGM7Cit7CisgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOworICBzdHJ1Y3QgYnJlYWtwb2ludCAqYjsKKworICBJTklUX1NBTCgmc2FsKTsKKyAgc2FsLnBjID0gcGM7CisgIHNhbC5zeW10YWIgPSBOVUxMOworICBzYWwubGluZSA9IDA7CisKKyAgYiA9IHNldF9yYXdfYnJlYWtwb2ludCAoc2FsKTsKKyAgaWYgKCFiKQorICAgIGVycm9yICgiSW50ZXJuYWwgZXJyb3IgLS0gY291bGRuJ3Qgc2V0IHRlbXAgZXhjZXB0aW9uIGJyZWFrcG9pbnQiKTsKKworICBiLT50eXBlID0gYnBfYnJlYWtwb2ludDsKKyAgYi0+ZGlzcG9zaXRpb24gPSBkZWw7CisgIGItPmVuYWJsZSA9IGVuYWJsZWQ7CisgIGItPnNpbGVudCA9IDE7CisgIGItPm51bWJlciA9IGludGVybmFsX2JyZWFrcG9pbnRfbnVtYmVyLS07CisgIHJldHVybiBiOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitjYXRjaF9jb21tYW5kXzEgKGFyZywgdGVtcGZsYWcsIGZyb21fdHR5KQorICBjaGFyICphcmc7CisgIGludCB0ZW1wZmxhZzsKKyAgaW50IGZyb21fdHR5OworeworIAorICAvKiBUaGUgZmlyc3QgYXJndW1lbnQgbWF5IGJlIGFuIGV2ZW50IG5hbWUsIHN1Y2ggYXMgInN0YXJ0IiBvciAibG9hZCIuCisgICAgIElmIHNvLCB0aGVuIGhhbmRsZSBpdCBhcyBzdWNoLiAgSWYgaXQgZG9lc24ndCBtYXRjaCBhbiBldmVudCBuYW1lLAorICAgICB0aGVuIGF0dGVtcHQgdG8gaW50ZXJwcmV0IGl0IGFzIGFuIGV4Y2VwdGlvbiBuYW1lLiAgKFRoaXMgbGF0dGVyIGlzCisgICAgIHRoZSB2NC4xNi1hbmQtZWFybGllciBHREIgbWVhbmluZyBvZiB0aGUgImNhdGNoIiBjb21tYW5kLikKKyAKKyAgICAgRmlyc3QsIHRyeSB0byBmaW5kIHRoZSBib3VuZHMgb2Ygd2hhdCBtaWdodCBiZSBhbiBldmVudCBuYW1lLiAqLworICBjaGFyICogIGFyZzFfc3RhcnQgPSBhcmc7CisgIGNoYXIgKiAgYXJnMV9lbmQ7CisgIGludCAgYXJnMV9sZW5ndGg7CisgCisgIGlmIChhcmcxX3N0YXJ0ID09IE5VTEwpCisgICAgeworICAgICAgLyogT2xkIGJlaGF2aW91ciB3YXMgdG8gdXNlIHByZS12LTQuMTYgc3ludGF4ICovIAorICAgICAgLyogY2F0Y2hfdGhyb3dfY29tbWFuZF8xIChhcmcxX3N0YXJ0LCB0ZW1wZmxhZywgZnJvbV90dHkpOyAqLworICAgICAgLyogcmV0dXJuOyAqLworICAgICAgLyogTm93LCB0aGlzIGlzIG5vdCBhbGxvd2VkICovIAorICAgICAgZXJyb3IgKCJDYXRjaCByZXF1aXJlcyBhbiBldmVudCBuYW1lLiIpOworCisgICAgfQorICBhcmcxX2VuZCA9IGVwX2ZpbmRfZXZlbnRfbmFtZV9lbmQgKGFyZzFfc3RhcnQpOworICBpZiAoYXJnMV9lbmQgPT0gTlVMTCkKKyAgICBlcnJvciAoImNhdGNoIHJlcXVpcmVzIGFuIGV2ZW50Iik7CisgIGFyZzFfbGVuZ3RoID0gYXJnMV9lbmQgKyAxIC0gYXJnMV9zdGFydDsKKyAKKyAgLyogVHJ5IHRvIG1hdGNoIHdoYXQgd2UgZm91bmQgYWdhaW5zdCBrbm93biBldmVudCBuYW1lcy4gKi8KKyAgaWYgKHN0cm5jbXAgKGFyZzFfc3RhcnQsICJzaWduYWwiLCBhcmcxX2xlbmd0aCkgPT0gMCkKKyAgICB7CisgICAgICBlcnJvciAoIkNhdGNoIG9mIHNpZ25hbCBub3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorICBlbHNlIGlmIChzdHJuY21wIChhcmcxX3N0YXJ0LCAiY2F0Y2giLCBhcmcxX2xlbmd0aCkgPT0gMCkKKyAgICB7CisgICAgICBjYXRjaF9leGNlcHRpb25fY29tbWFuZF8xIChFWF9FVkVOVF9DQVRDSCwgYXJnMV9lbmQrMSwgdGVtcGZsYWcsIGZyb21fdHR5KTsgCisgICAgfQorICBlbHNlIGlmIChzdHJuY21wIChhcmcxX3N0YXJ0LCAidGhyb3ciLCBhcmcxX2xlbmd0aCkgPT0gMCkKKyAgICB7CisgICAgICBjYXRjaF9leGNlcHRpb25fY29tbWFuZF8xIChFWF9FVkVOVF9USFJPVywgYXJnMV9lbmQrMSwgdGVtcGZsYWcsIGZyb21fdHR5KTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cm5jbXAgKGFyZzFfc3RhcnQsICJ0aHJlYWRfc3RhcnQiLCBhcmcxX2xlbmd0aCkgPT0gMCkKKyAgICB7CisgICAgICBlcnJvciAoIkNhdGNoIG9mIHRocmVhZF9zdGFydCBub3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorICBlbHNlIGlmIChzdHJuY21wIChhcmcxX3N0YXJ0LCAidGhyZWFkX2V4aXQiLCBhcmcxX2xlbmd0aCkgPT0gMCkKKyAgICB7CisgICAgICBlcnJvciAoIkNhdGNoIG9mIHRocmVhZF9leGl0IG5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cm5jbXAgKGFyZzFfc3RhcnQsICJ0aHJlYWRfam9pbiIsIGFyZzFfbGVuZ3RoKSA9PSAwKQorICAgIHsKKyAgICAgIGVycm9yICgiQ2F0Y2ggb2YgdGhyZWFkX2pvaW4gbm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKyAgZWxzZSBpZiAoc3RybmNtcCAoYXJnMV9zdGFydCwgInN0YXJ0IiwgYXJnMV9sZW5ndGgpID09IDApCisgICAgeworICAgICAgZXJyb3IgKCJDYXRjaCBvZiBzdGFydCBub3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorICBlbHNlIGlmIChzdHJuY21wIChhcmcxX3N0YXJ0LCAiZXhpdCIsIGFyZzFfbGVuZ3RoKSA9PSAwKQorICAgIHsKKyAgICAgIGVycm9yICgiQ2F0Y2ggb2YgZXhpdCBub3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgfQorICBlbHNlIGlmIChzdHJuY21wIChhcmcxX3N0YXJ0LCAiZm9yayIsIGFyZzFfbGVuZ3RoKSA9PSAwKQorICAgIHsKKyNpZiBkZWZpbmVkKENISUxEX0lOU0VSVF9GT1JLX0NBVENIUE9JTlQpCisgICAgICBjYXRjaF9mb3JrX2NvbW1hbmRfMSAoY2F0Y2hfZm9yaywgYXJnMV9lbmQrMSwgdGVtcGZsYWcsIGZyb21fdHR5KTsKKyNlbHNlCisgICAgICBlcnJvciAoIkNhdGNoIG9mIGZvcmsgbm90IHlldCBpbXBsZW1lbnRlZCIpOworI2VuZGlmCisgICAgfQorICBlbHNlIGlmIChzdHJuY21wIChhcmcxX3N0YXJ0LCAidmZvcmsiLCBhcmcxX2xlbmd0aCkgPT0gMCkKKyAgICB7CisjaWYgZGVmaW5lZChDSElMRF9JTlNFUlRfVkZPUktfQ0FUQ0hQT0lOVCkKKyAgICAgIGNhdGNoX2ZvcmtfY29tbWFuZF8xIChjYXRjaF92Zm9yaywgYXJnMV9lbmQrMSwgdGVtcGZsYWcsIGZyb21fdHR5KTsKKyNlbHNlCisgICAgICBlcnJvciAoIkNhdGNoIG9mIHZmb3JrIG5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyNlbmRpZgorICAgIH0KKyAgZWxzZSBpZiAoc3RybmNtcCAoYXJnMV9zdGFydCwgImV4ZWMiLCBhcmcxX2xlbmd0aCkgPT0gMCkKKyAgICB7CisjaWYgZGVmaW5lZChDSElMRF9JTlNFUlRfRVhFQ19DQVRDSFBPSU5UKQorICAgICAgY2F0Y2hfZXhlY19jb21tYW5kXzEgKGFyZzFfZW5kKzEsIHRlbXBmbGFnLCBmcm9tX3R0eSk7CisjZWxzZQorICAgICAgZXJyb3IgKCJDYXRjaCBvZiBleGVjIG5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyNlbmRpZgorICAgIH0KKyAgZWxzZSBpZiAoc3RybmNtcCAoYXJnMV9zdGFydCwgImxvYWQiLCBhcmcxX2xlbmd0aCkgPT0gMCkKKyAgICB7CisjaWYgZGVmaW5lZChTT0xJQl9BREQpCisgICAgICBjYXRjaF9sb2FkX2NvbW1hbmRfMSAoYXJnMV9lbmQrMSwgdGVtcGZsYWcsIGZyb21fdHR5KTsKKyNlbHNlCisgICAgICBlcnJvciAoIkNhdGNoIG9mIGxvYWQgbm90IGltcGxlbWVudGVkIik7CisjZW5kaWYKKyAgICB9CisgIGVsc2UgaWYgKHN0cm5jbXAgKGFyZzFfc3RhcnQsICJ1bmxvYWQiLCBhcmcxX2xlbmd0aCkgPT0gMCkKKyAgICB7CisjaWYgZGVmaW5lZChTT0xJQl9BREQpCisgICAgICBjYXRjaF91bmxvYWRfY29tbWFuZF8xIChhcmcxX2VuZCsxLCB0ZW1wZmxhZywgZnJvbV90dHkpOworI2Vsc2UKKyAgICAgIGVycm9yICgiQ2F0Y2ggb2YgbG9hZCBub3QgaW1wbGVtZW50ZWQiKTsKKyNlbmRpZgorICAgIH0KKyAgZWxzZSBpZiAoc3RybmNtcCAoYXJnMV9zdGFydCwgInN0b3AiLCBhcmcxX2xlbmd0aCkgPT0gMCkKKyAgICB7CisgICAgICBlcnJvciAoIkNhdGNoIG9mIHN0b3Agbm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgIH0KKyAKKyAgLyogVGhpcyBkb2Vzbid0IGFwcGVhciB0byBiZSBhbiBldmVudCBuYW1lICovCisKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFByZS12LjQuMTYgYmVoYXZpb3VyIHdhcyB0byB0cmVhdCB0aGUgYXJndW1lbnQKKyAgICAgICAgIGFzIHRoZSBuYW1lIG9mIGFuIGV4Y2VwdGlvbiAqLyAKKyAgICAgIC8qIGNhdGNoX3Rocm93X2NvbW1hbmRfMSAoYXJnMV9zdGFydCwgdGVtcGZsYWcsIGZyb21fdHR5KTsgKi8KKyAgICAgIC8qIE5vdyB0aGlzIGlzIG5vdCBhbGxvd2VkICovIAorICAgICAgZXJyb3IgKCJVbmtub3duIGV2ZW50IGtpbmQgc3BlY2lmaWVkIGZvciBjYXRjaCIpOworCisgICAgfQorfQorCisvKiBVc2VkIGJ5IHRoZSBndWksIGNvdWxkIGJlIG1hZGUgYSB3b3JrZXIgZm9yIG90aGVyIHRoaW5ncy4gKi8KKworc3RydWN0IGJyZWFrcG9pbnQgKgorc2V0X2JyZWFrcG9pbnRfc2FsIChzYWwpCisgICAgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOworeworICBzdHJ1Y3QgYnJlYWtwb2ludCAqYjsKKyAgYiA9IHNldF9yYXdfYnJlYWtwb2ludCAoc2FsKTsKKyAgc2V0X2JyZWFrcG9pbnRfY291bnQgKGJyZWFrcG9pbnRfY291bnQgKyAxKTsKKyAgYi0+bnVtYmVyID0gYnJlYWtwb2ludF9jb3VudDsKKyAgYi0+dHlwZSA9IGJwX2JyZWFrcG9pbnQ7CisgIGItPmNvbmQgPSAwOworICBiLT50aHJlYWQgPSAtMTsKKyAgcmV0dXJuIGI7Cit9CisKKyNpZiAwCisvKiBUaGVzZSBhcmVuJ3QgdXNlZDsgSSBkb24ndCBrbm93IHdoYXQgdGhleSB3ZXJlIGZvci4gICovCisvKiBEaXNhYmxlIGJyZWFrcG9pbnRzIG9uIGFsbCBjYXRjaCBjbGF1c2VzIGRlc2NyaWJlZCBpbiBBUkdTLiAgKi8KK3N0YXRpYyB2b2lkCitkaXNhYmxlX2NhdGNoIChhcmdzKQorICAgICBjaGFyICphcmdzOworeworICAvKiBNYXAgdGhlIGRpc2FibGUgY29tbWFuZCB0byBjYXRjaCBjbGF1c2VzIGRlc2NyaWJlZCBpbiBBUkdTLiAgKi8KK30KKworLyogRW5hYmxlIGJyZWFrcG9pbnRzIG9uIGFsbCBjYXRjaCBjbGF1c2VzIGRlc2NyaWJlZCBpbiBBUkdTLiAgKi8KK3N0YXRpYyB2b2lkCitlbmFibGVfY2F0Y2ggKGFyZ3MpCisgICAgIGNoYXIgKmFyZ3M7Cit7CisgIC8qIE1hcCB0aGUgZGlzYWJsZSBjb21tYW5kIHRvIGNhdGNoIGNsYXVzZXMgZGVzY3JpYmVkIGluIEFSR1MuICAqLworfQorCisvKiBEZWxldGUgYnJlYWtwb2ludHMgb24gYWxsIGNhdGNoIGNsYXVzZXMgaW4gdGhlIGFjdGl2ZSBzY29wZS4gICovCitzdGF0aWMgdm9pZAorZGVsZXRlX2NhdGNoIChhcmdzKQorICAgICBjaGFyICphcmdzOworeworICAvKiBNYXAgdGhlIGRlbGV0ZSBjb21tYW5kIHRvIGNhdGNoIGNsYXVzZXMgZGVzY3JpYmVkIGluIEFSR1MuICAqLworfQorI2VuZGlmIC8qIDAgKi8KKworc3RhdGljIHZvaWQKK2NhdGNoX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjYXRjaF9jb21tYW5kXzEgKGFyZywgMCwgZnJvbV90dHkpOworfQorDAorCitzdGF0aWMgdm9pZAordGNhdGNoX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjYXRjaF9jb21tYW5kXzEgKGFyZywgMSwgZnJvbV90dHkpOworfQorCisKK3N0YXRpYyB2b2lkCitjbGVhcl9jb21tYW5kIChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGJyZWFrcG9pbnQgKmIsICpiMTsKKyAgaW50IGRlZmF1bHRfbWF0Y2g7CisgIHN0cnVjdCBzeW10YWJzX2FuZF9saW5lcyBzYWxzOworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKyAgcmVnaXN0ZXIgc3RydWN0IGJyZWFrcG9pbnQgKmZvdW5kOworICBpbnQgaTsKKworICBpZiAoYXJnKQorICAgIHsKKyAgICAgIHNhbHMgPSBkZWNvZGVfbGluZV9zcGVjIChhcmcsIDEpOworICAgICAgZGVmYXVsdF9tYXRjaCA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2Fscy5zYWxzID0gKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgKikgCisJeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lKSk7CisgICAgICBJTklUX1NBTCAoJnNhbCk7CS8qIGluaXRpYWxpemUgdG8gemVyb2VzICovCisgICAgICBzYWwubGluZSA9IGRlZmF1bHRfYnJlYWtwb2ludF9saW5lOworICAgICAgc2FsLnN5bXRhYiA9IGRlZmF1bHRfYnJlYWtwb2ludF9zeW10YWI7CisgICAgICBzYWwucGMgPSBkZWZhdWx0X2JyZWFrcG9pbnRfYWRkcmVzczsKKyAgICAgIGlmIChzYWwuc3ltdGFiID09IDApCisJZXJyb3IgKCJObyBzb3VyY2UgZmlsZSBzcGVjaWZpZWQuIik7CisKKyAgICAgIHNhbHMuc2Fsc1swXSA9IHNhbDsKKyAgICAgIHNhbHMubmVsdHMgPSAxOworCisgICAgICBkZWZhdWx0X21hdGNoID0gMTsKKyAgICB9CisKKyAgLyogRm9yIGVhY2ggbGluZSBzcGVjIGdpdmVuLCBkZWxldGUgYnBzIHdoaWNoIGNvcnJlc3BvbmQKKyAgICAgdG8gaXQuICBXZSBkbyB0aGlzIGluIHR3byBsb29wczogdGhlIGZpcnN0IGxvb3AgbG9va3MgYXQKKyAgICAgdGhlIGluaXRpYWwgYnAocykgaW4gdGhlIGNoYWluIHdoaWNoIHNob3VsZCBiZSBkZWxldGVkLAorICAgICB0aGUgc2Vjb25kIGdvZXMgZG93biB0aGUgcmVzdCBvZiB0aGUgY2hhaW4gbG9va2luZyBhaGVhZAorICAgICBvbmUgc28gaXQgY2FuIHRha2UgdGhvc2UgYnBzIG9mZiB0aGUgY2hhaW4gd2l0aG91dCBtZXNzaW5nCisgICAgIHVwIHRoZSBjaGFpbi4gKi8KKworCisgIGZvciAoaSA9IDA7IGkgPCBzYWxzLm5lbHRzOyBpKyspCisgICAgeworICAgICAgLyogSWYgZXhhY3QgcGMgZ2l2ZW4sIGNsZWFyIGJwdHMgYXQgdGhhdCBwYy4KKwkgSWYgbGluZSBnaXZlbiAocGMgPT0gMCksIGNsZWFyIGFsbCBicHRzIG9uIHNwZWNpZmllZCBsaW5lLgorCSBJZiBkZWZhdWx0aW5nLCBjbGVhciBhbGwgYnB0cyBvbiBkZWZhdWx0IGxpbmUKKyAgICAgICAgIG9yIGF0IGRlZmF1bHQgcGMuCisgICAgICAgCisJCWRlZmF1bHRpbmcgICAgc2FsLnBjICE9IDAgICAgdGVzdHMgdG8gZG8KKyAgICAgICAKKyAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAxICAgICAgICAgICAgIHBjCisgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgMSAgICAgICAgICAgICBwYyBfYW5kXyBsaW5lCisgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgMCAgICAgICAgICAgICBsaW5lCisgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgMCAgICAgICAgICAgICA8Y2FuJ3QgaGFwcGVuPiAqLworCisgICAgICBzYWwgPSBzYWxzLnNhbHNbaV07CisgICAgICBmb3VuZCA9IChzdHJ1Y3QgYnJlYWtwb2ludCAqKSAwOworCisKKyAgICAgIHdoaWxlIChicmVha3BvaW50X2NoYWluCisgICAgICAgICAgICAgLyogV2h5IGRvbid0IHdlIGNoZWNrIGhlcmUgdGhhdCB0aGlzIGlzIG5vdAorCQlhIHdhdGNocG9pbnQsIGV0Yy4sIGFzIHdlIGRvIGJlbG93PworCQlJIGNhbid0IG1ha2UgaXQgZmFpbCwgYnV0IGRvbid0IGtub3cKKwkJd2hhdCdzIHN0b3BwaW5nIHRoZSBmYWlsdXJlOiBhIHdhdGNocG9pbnQKKwkJb2YgdGhlIHNhbWUgYWRkcmVzcyBhcyAic2FsLnBjIiBzaG91bGQKKwkJd2luZCB1cCBiZWluZyBkZWxldGVkLiAqLworIAorICAgICAgICAgICAgICYmICggICgoc2FsLnBjICYmIChicmVha3BvaW50X2NoYWluLT5hZGRyZXNzID09IHNhbC5wYykpICYmCisgICAgICAgICAgICAgICAgICAgKG92ZXJsYXlfZGVidWdnaW5nID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludF9jaGFpbi0+c2VjdGlvbiA9PSBzYWwuc2VjdGlvbikpCisgICAgICAgICAgICAgICAgfHwgKChkZWZhdWx0X21hdGNoIHx8ICgwID09IHNhbC5wYykpCisgICAgICAgICAgICAgICAgICAgJiYgYnJlYWtwb2ludF9jaGFpbi0+c291cmNlX2ZpbGUgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICYmIHNhbC5zeW10YWIgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICYmIFNUUkVRIChicmVha3BvaW50X2NoYWluLT5zb3VyY2VfZmlsZSwgc2FsLnN5bXRhYi0+ZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgICAgJiYgYnJlYWtwb2ludF9jaGFpbi0+bGluZV9udW1iZXIgPT0gc2FsLmxpbmUpKSkKKworCXsKKwkgIGIxID0gYnJlYWtwb2ludF9jaGFpbjsKKwkgIGJyZWFrcG9pbnRfY2hhaW4gPSBiMS0+bmV4dDsKKwkgIGIxLT5uZXh0ID0gZm91bmQ7CisJICBmb3VuZCA9IGIxOworCX0KKworICAgICAgQUxMX0JSRUFLUE9JTlRTIChiKQorCisgICAgICB3aGlsZSAoYi0+bmV4dAorICAgICAgICAgICAgICYmIGItPm5leHQtPnR5cGUgIT0gYnBfbm9uZQorICAgICAgICAgICAgICYmIGItPm5leHQtPnR5cGUgIT0gYnBfd2F0Y2hwb2ludAorICAgICAgICAgICAgICYmIGItPm5leHQtPnR5cGUgIT0gYnBfaGFyZHdhcmVfd2F0Y2hwb2ludAorICAgICAgICAgICAgICYmIGItPm5leHQtPnR5cGUgIT0gYnBfcmVhZF93YXRjaHBvaW50CisgICAgICAgICAgICAgJiYgYi0+bmV4dC0+dHlwZSAhPSBicF9hY2Nlc3Nfd2F0Y2hwb2ludAorICAgICAgICAgICAgICYmICggICgoc2FsLnBjICYmIChiLT5uZXh0LT5hZGRyZXNzID09IHNhbC5wYykpICYmCisgICAgICAgICAgICAgICAgICAgKG92ZXJsYXlfZGVidWdnaW5nID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgYi0+bmV4dC0+c2VjdGlvbiA9PSBzYWwuc2VjdGlvbikpCisgICAgICAgICAgICAgICAgfHwgKChkZWZhdWx0X21hdGNoIHx8ICgwID09IHNhbC5wYykpCisgICAgICAgICAgICAgICAgICAgJiYgYi0+bmV4dC0+c291cmNlX2ZpbGUgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICYmIHNhbC5zeW10YWIgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICYmIFNUUkVRIChiLT5uZXh0LT5zb3VyY2VfZmlsZSwgc2FsLnN5bXRhYi0+ZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgICAgJiYgYi0+bmV4dC0+bGluZV9udW1iZXIgPT0gc2FsLmxpbmUpKSkKKworCisJICB7CisJICAgIGIxID0gYi0+bmV4dDsKKwkgICAgYi0+bmV4dCA9IGIxLT5uZXh0OworCSAgICBiMS0+bmV4dCA9IGZvdW5kOworCSAgICBmb3VuZCA9IGIxOworCSAgfQorCisgICAgICBpZiAoZm91bmQgPT0gMCkKKwl7CisJICBpZiAoYXJnKQorCSAgICBlcnJvciAoIk5vIGJyZWFrcG9pbnQgYXQgJXMuIiwgYXJnKTsKKwkgIGVsc2UKKwkgICAgZXJyb3IgKCJObyBicmVha3BvaW50IGF0IHRoaXMgbGluZS4iKTsKKwl9CisKKyAgICAgIGlmIChmb3VuZC0+bmV4dCkgZnJvbV90dHkgPSAxOyAvKiBBbHdheXMgcmVwb3J0IGlmIGRlbGV0ZWQgbW9yZSB0aGFuIG9uZSAqLworICAgICAgaWYgKGZyb21fdHR5KSBwcmludGZfdW5maWx0ZXJlZCAoIkRlbGV0ZWQgYnJlYWtwb2ludCVzICIsIGZvdW5kLT5uZXh0ID8gInMiIDogIiIpOworICAgICAgYnJlYWtwb2ludHNfY2hhbmdlZCAoKTsKKyAgICAgIHdoaWxlIChmb3VuZCkKKwl7CisJICBpZiAoZnJvbV90dHkpIHByaW50Zl91bmZpbHRlcmVkICgiJWQgIiwgZm91bmQtPm51bWJlcik7CisJICBiMSA9IGZvdW5kLT5uZXh0OworCSAgZGVsZXRlX2JyZWFrcG9pbnQgKGZvdW5kKTsKKwkgIGZvdW5kID0gYjE7CisJfQorICAgICAgaWYgKGZyb21fdHR5KSBwdXRjaGFyX3VuZmlsdGVyZWQgKCdcbicpOworICAgIH0KKyAgZnJlZSAoKFBUUilzYWxzLnNhbHMpOworfQorDAorLyogRGVsZXRlIGJyZWFrcG9pbnQgaW4gQlMgaWYgdGhleSBhcmUgYGRlbGV0ZScgYnJlYWtwb2ludHMgYW5kCisgICBhbGwgYnJlYWtwb2ludHMgdGhhdCBhcmUgbWFya2VkIGZvciBkZWxldGlvbiwgd2hldGhlciBoaXQgb3Igbm90LgorICAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYW55IGJyZWFrcG9pbnQgaXMgaGl0LCBvciBhZnRlciBlcnJvcnMuICAqLworCit2b2lkCiticmVha3BvaW50X2F1dG9fZGVsZXRlIChicykKKyAgICAgYnBzdGF0IGJzOworeworICBzdHJ1Y3QgYnJlYWtwb2ludCAqYiwgKnRlbXA7CisKKyAgZm9yICg7IGJzOyBicyA9IGJzLT5uZXh0KQorICAgIGlmIChicy0+YnJlYWtwb2ludF9hdCAmJiBicy0+YnJlYWtwb2ludF9hdC0+ZGlzcG9zaXRpb24gPT0gZGVsIAorCSYmIGJzLT5zdG9wKQorICAgICAgZGVsZXRlX2JyZWFrcG9pbnQgKGJzLT5icmVha3BvaW50X2F0KTsKKworICBBTExfQlJFQUtQT0lOVFNfU0FGRSAoYiwgdGVtcCkKKyAgICB7CisgICAgICBpZiAoYi0+ZGlzcG9zaXRpb24gPT0gZGVsX2F0X25leHRfc3RvcCkKKwlkZWxldGVfYnJlYWtwb2ludCAoYik7CisgICAgfQorfQorCisvKiBEZWxldGUgYSBicmVha3BvaW50IGFuZCBjbGVhbiB1cCBhbGwgdHJhY2VzIG9mIGl0IGluIHRoZSBkYXRhIHN0cnVjdHVyZXMuICovCisKK3ZvaWQKK2RlbGV0ZV9icmVha3BvaW50IChicHQpCisgICAgIHN0cnVjdCBicmVha3BvaW50ICpicHQ7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBicmVha3BvaW50ICpiOworICByZWdpc3RlciBicHN0YXQgYnM7CisKKyAgaWYgKGJwdCA9PSBOVUxMKQorICAgIGVycm9yICgiSW50ZXJuYWwgZXJyb3IgKGF0dGVtcHRlZCB0byBkZWxldGUgYSBOVUxMIGJyZWFrcG9pbnQpIik7CisKKworICAvKiBIYXMgdGhpcyBicCBhbHJlYWR5IGJlZW4gZGVsZXRlZD8gIFRoaXMgY2FuIGhhcHBlbiBiZWNhdXNlIG11bHRpcGxlCisgICAgIGxpc3RzIGNhbiBob2xkIHBvaW50ZXJzIHRvIGJwJ3MuICBicHN0YXQgbGlzdHMgYXJlIGVzcGVjaWFsIGN1bHByaXRzLgorCisgICAgIE9uZSBleGFtcGxlIG9mIHRoaXMgaGFwcGVuaW5nIGlzIGEgd2F0Y2hwb2ludCdzIHNjb3BlIGJwLiAgV2hlbiB0aGUKKyAgICAgc2NvcGUgYnAgdHJpZ2dlcnMsIHdlIG5vdGljZSB0aGF0IHRoZSB3YXRjaHBvaW50IGlzIG91dCBvZiBzY29wZSwgYW5kCisgICAgIGRlbGV0ZSBpdC4gIFdlIGFsc28gZGVsZXRlIGl0cyBzY29wZSBicC4gIEJ1dCB0aGUgc2NvcGUgYnAgaXMgbWFya2VkCisgICAgICJhdXRvLWRlbGV0aW5nIiwgYW5kIGlzIGFscmVhZHkgb24gYSBicHN0YXQuICBUaGF0IGJwc3RhdCBpcyB0aGVuCisgICAgIGNoZWNrZWQgZm9yIGF1dG8tZGVsZXRpbmcgYnAncywgd2hpY2ggYXJlIGRlbGV0ZWQuCisKKyAgICAgQSByZWFsIHNvbHV0aW9uIHRvIHRoaXMgcHJvYmxlbSBtaWdodCBpbnZvbHZlIHJlZmVyZW5jZSBjb3VudHMgaW4gYnAncywKKyAgICAgYW5kL29yIGdpdmluZyB0aGVtIHBvaW50ZXJzIGJhY2sgdG8gdGhlaXIgcmVmZXJlbmNpbmcgYnBzdGF0J3MsIGFuZAorICAgICB0ZWFjaGluZyBkZWxldGVfYnJlYWtwb2ludCB0byBvbmx5IGZyZWUgYSBicCdzIHN0b3JhZ2Ugd2hlbiBubyBtb3JlCisgICAgIHJlZmVyZW5jZXMgd2VyZSBleHRlbnQuICBBIGNoZWFwZXIgYmFuZGFpZCB3YXMgY2hvc2VuLiAqLworICBpZiAoYnB0LT50eXBlID09IGJwX25vbmUpCisgICAgcmV0dXJuOworCisgIGlmIChkZWxldGVfYnJlYWtwb2ludF9ob29rKQorICAgIGRlbGV0ZV9icmVha3BvaW50X2hvb2sgKGJwdCk7CisKKyAgaWYgKGJwdC0+aW5zZXJ0ZWQpCisgICAgcmVtb3ZlX2JyZWFrcG9pbnQgKGJwdCwgbWFya191bmluc2VydGVkKTsKKyAgICAgIAorICBpZiAoYnJlYWtwb2ludF9jaGFpbiA9PSBicHQpCisgICAgYnJlYWtwb2ludF9jaGFpbiA9IGJwdC0+bmV4dDsKKworICAvKiBJZiB3ZSBoYXZlIGNhbGxiYWNrLXN0eWxlIGV4Y2VwdGlvbiBjYXRjaHBvaW50cywgZG9uJ3QgZ28gdGhyb3VnaAorICAgICB0aGUgYWRqdXN0bWVudHMgdG8gdGhlIEMrKyBydW50aW1lIGxpYnJhcnkgZXRjLiBpZiB0aGUgaW5mZXJpb3IKKyAgICAgaXNuJ3QgYWN0dWFsbHkgcnVubmluZy4gIHRhcmdldF9lbmFibGVfZXhjZXB0aW9uX2NhbGxiYWNrIGZvciBhCisgICAgIG51bGwgdGFyZ2V0IG9wcyB2ZWN0b3IgZ2l2ZXMgYW4gdW5kZXNpcmFibGUgZXJyb3IgbWVzc2FnZSwgc28gd2UKKyAgICAgY2hlY2sgaGVyZSBhbmQgYXZvaWQgaXQuIFNpbmNlIGN1cnJlbnRseSAoMTk5Ny0wOS0xNykgb25seSBIUC1VWCBhQ0MncworICAgICBleGNlcHRpb25zIGFyZSBzdXBwb3J0ZWQgaW4gdGhpcyB3YXksIGl0J3MgT0sgZm9yIG5vdy4gRklYTUUgKi8gCisgIGlmIChlcF9pc19leGNlcHRpb25fY2F0Y2hwb2ludCAoYnB0KSAmJiB0YXJnZXRfaGFzX2V4ZWN1dGlvbikKKyAgICB7CisgICAgICBzdGF0aWMgY2hhciBtZXNzYWdlMVtdID0gIkVycm9yIGluIGRlbGV0aW5nIGNhdGNocG9pbnQgJWQ6XG4iOworICAgICAgc3RhdGljIGNoYXIgbWVzc2FnZVtzaXplb2YgKG1lc3NhZ2UxKSArIDMwXTsKKyAgICAgIGFyZ3NfZm9yX2NhdGNocG9pbnRfZW5hYmxlIGFyZ3M7CisKKyAgICAgIHNwcmludGYgKG1lc3NhZ2UsIG1lc3NhZ2UxLCBicHQtPm51bWJlcik7CS8qIEZvcm1hdCBwb3NzaWJsZSBlcnJvciBtc2cgKi8KKyAgICAgIGFyZ3Mua2luZCA9IGJwdC0+dHlwZSA9PSBicF9jYXRjaF9jYXRjaCA/IEVYX0VWRU5UX0NBVENIIDogRVhfRVZFTlRfVEhST1c7CisgICAgICBhcmdzLmVuYWJsZSA9IDA7CisgICAgICBjYXRjaF9lcnJvcnMgKGNvdmVyX3RhcmdldF9lbmFibGVfZXhjZXB0aW9uX2NhbGxiYWNrLCAmYXJncywKKwkJICAgIG1lc3NhZ2UsIFJFVFVSTl9NQVNLX0FMTCk7CisgICAgfQorCisKKyAgQUxMX0JSRUFLUE9JTlRTIChiKQorICAgIGlmIChiLT5uZXh0ID09IGJwdCkKKyAgICAgIHsKKwliLT5uZXh0ID0gYnB0LT5uZXh0OworCWJyZWFrOworICAgICAgfQorCisgIC8qIEJlZm9yZSB0dXJuaW5nIG9mZiB0aGUgdmlzdWFscyBmb3IgdGhlIGJwLCBjaGVjayB0byBzZWUgdGhhdAorICAgICB0aGVyZSBhcmUgbm8gb3RoZXIgYnBzIGF0IHRoZSBzYW1lIGFkZHJlc3MuICovCisgIGlmICh0dWlfdmVyc2lvbikKKyAgICB7CisgICAgICBpbnQgY2xlYXJJdDsKKworICAgICAgQUxMX0JSRUFLUE9JTlRTIChiKQorICAgICAgICB7CisgICAgICAgICAgY2xlYXJJdCA9IChiLT5hZGRyZXNzICE9IGJwdC0+YWRkcmVzcyk7CisgICAgICAgICAgaWYgKCFjbGVhckl0KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgaWYgKGNsZWFySXQpCisgICAgICAgIHsKKyAgICAgICAgICBUVUlETygoKFR1aU9wYXF1ZUZ1bmNQdHIpdHVpX3ZBbGxTZXRIYXNCcmVha0F0LCBicHQsIDApKTsKKyAgICAgICAgICBUVUlETygoKFR1aU9wYXF1ZUZ1bmNQdHIpdHVpVXBkYXRlQWxsRXhlY0luZm9zKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgY2hlY2tfZHVwbGljYXRlcyAoYnB0LT5hZGRyZXNzLCBicHQtPnNlY3Rpb24pOworICAvKiBJZiB0aGlzIGJyZWFrcG9pbnQgd2FzIGluc2VydGVkLCBhbmQgdGhlcmUgaXMgYW5vdGhlciBicmVha3BvaW50CisgICAgIGF0IHRoZSBzYW1lIGFkZHJlc3MsIHdlIG5lZWQgdG8gaW5zZXJ0IHRoZSBvdGhlciBicmVha3BvaW50LiAgKi8KKyAgaWYgKGJwdC0+aW5zZXJ0ZWQKKyAgICAgICYmIGJwdC0+dHlwZSAhPSBicF9oYXJkd2FyZV93YXRjaHBvaW50CisgICAgICAmJiBicHQtPnR5cGUgIT0gYnBfcmVhZF93YXRjaHBvaW50CisgICAgICAmJiBicHQtPnR5cGUgIT0gYnBfYWNjZXNzX3dhdGNocG9pbnQKKyAgICAgICYmIGJwdC0+dHlwZSAhPSBicF9jYXRjaF9mb3JrCisgICAgICAmJiBicHQtPnR5cGUgIT0gYnBfY2F0Y2hfdmZvcmsKKyAgICAgICYmIGJwdC0+dHlwZSAhPSBicF9jYXRjaF9leGVjKQorICAgIHsKKyAgICAgIEFMTF9CUkVBS1BPSU5UUyAoYikKKwlpZiAoYi0+YWRkcmVzcyA9PSBicHQtPmFkZHJlc3MKKwkgICAgJiYgYi0+c2VjdGlvbiA9PSBicHQtPnNlY3Rpb24KKwkgICAgJiYgIWItPmR1cGxpY2F0ZQorCSAgICAmJiBiLT5lbmFibGUgIT0gZGlzYWJsZWQKKwkgICAgJiYgYi0+ZW5hYmxlICE9IHNobGliX2Rpc2FibGVkCisJICAgICYmIGItPmVuYWJsZSAhPSBjYWxsX2Rpc2FibGVkKQorCSAgeworCSAgICBpbnQgdmFsOworCSAgICB2YWwgPSB0YXJnZXRfaW5zZXJ0X2JyZWFrcG9pbnQgKGItPmFkZHJlc3MsIGItPnNoYWRvd19jb250ZW50cyk7CisJICAgIGlmICh2YWwgIT0gMCkKKwkgICAgICB7CisJCXRhcmdldF90ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgKCk7CisJCWZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIkNhbm5vdCBpbnNlcnQgYnJlYWtwb2ludCAlZDpcbiIsIGItPm51bWJlcik7CisJCW1lbW9yeV9lcnJvciAodmFsLCBiLT5hZGRyZXNzKTsJLyogd2hpY2ggYm9tYnMgdXMgb3V0ICovCisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgYi0+aW5zZXJ0ZWQgPSAxOworCSAgfQorICAgIH0KKworICBmcmVlX2NvbW1hbmRfbGluZXMgKCZicHQtPmNvbW1hbmRzKTsKKyAgaWYgKGJwdC0+Y29uZCkKKyAgICBmcmVlIChicHQtPmNvbmQpOworICBpZiAoYnB0LT5jb25kX3N0cmluZyAhPSBOVUxMKQorICAgIGZyZWUgKGJwdC0+Y29uZF9zdHJpbmcpOworICBpZiAoYnB0LT5hZGRyX3N0cmluZyAhPSBOVUxMKQorICAgIGZyZWUgKGJwdC0+YWRkcl9zdHJpbmcpOworICBpZiAoYnB0LT5leHAgIT0gTlVMTCkKKyAgICBmcmVlIChicHQtPmV4cCk7CisgIGlmIChicHQtPmV4cF9zdHJpbmcgIT0gTlVMTCkKKyAgICBmcmVlIChicHQtPmV4cF9zdHJpbmcpOworICBpZiAoYnB0LT52YWwgIT0gTlVMTCkKKyAgICB2YWx1ZV9mcmVlIChicHQtPnZhbCk7CisgIGlmIChicHQtPnNvdXJjZV9maWxlICE9IE5VTEwpCisgICAgZnJlZSAoYnB0LT5zb3VyY2VfZmlsZSk7CisgIGlmIChicHQtPmRsbF9wYXRobmFtZSAhPSBOVUxMKQorICAgIGZyZWUgKGJwdC0+ZGxsX3BhdGhuYW1lKTsKKyAgaWYgKGJwdC0+dHJpZ2dlcmVkX2RsbF9wYXRobmFtZSAhPSBOVUxMKQorICAgIGZyZWUgKGJwdC0+dHJpZ2dlcmVkX2RsbF9wYXRobmFtZSk7CisgIGlmIChicHQtPmV4ZWNfcGF0aG5hbWUgIT0gTlVMTCkKKyAgICBmcmVlIChicHQtPmV4ZWNfcGF0aG5hbWUpOworCisgIC8qIEJlIHN1cmUgbm8gYnBzdGF0J3MgYXJlIHBvaW50aW5nIGF0IGl0IGFmdGVyIGl0J3MgYmVlbiBmcmVlZC4gICovCisgIC8qIEZJWE1FLCBob3cgY2FuIHdlIGZpbmQgYWxsIGJwc3RhdCdzPworICAgICBXZSBqdXN0IGNoZWNrIHN0b3BfYnBzdGF0IGZvciBub3cuICAqLworICBmb3IgKGJzID0gc3RvcF9icHN0YXQ7IGJzOyBicyA9IGJzLT5uZXh0KQorICAgIGlmIChicy0+YnJlYWtwb2ludF9hdCA9PSBicHQpCisgICAgICB7CisJYnMtPmJyZWFrcG9pbnRfYXQgPSBOVUxMOworCisJLyogd2UnZCBjYWxsIGJwc3RhdF9jbGVhcl9hY3Rpb25zLCBidXQgdGhhdCBmcmVlJ3Mgc3R1ZmYgYW5kIGR1ZQorCSAgIHRvIHRoZSBtdWx0aXBsZSBwb2ludGVycyBwb2ludGluZyB0byBvbmUgaXRlbSB3aXRoIG5vCisJICAgcmVmZXJlbmNlIGNvdW50cyBmb3VuZCBhbnl3aGVyZSB0aHJvdWdoIG91dCB0aGUgYnBzdGF0J3MgKGhvdworCSAgIGRvIHlvdSBzcGVsbCBmcmFnaWxlPyksIHdlIGRvbid0IHdhbnQgdG8gZnJlZSB0aGluZ3MgdHdpY2UgLS0KKwkgICBiZXR0ZXIgYSBtZW1vcnkgbGVhayB0aGFuIGEgY29ycnVwdCBtYWxsb2MgcG9vbCEgKi8KKwlicy0+Y29tbWFuZHMgPSBOVUxMOworCWJzLT5vbGRfdmFsID0gTlVMTDsKKyAgICAgIH0KKyAgLyogT24gdGhlIGNoYW5jZSB0aGF0IHNvbWVvbmUgd2lsbCBzb29uIHRyeSBhZ2FpbiB0byBkZWxldGUgdGhpcyBzYW1lCisgICAgIGJwLCB3ZSBtYXJrIGl0IGFzIGRlbGV0ZWQgYmVmb3JlIGZyZWVpbmcgaXRzIHN0b3JhZ2UuICovCisgIGJwdC0+dHlwZSA9IGJwX25vbmU7CisKKyAgZnJlZSAoKFBUUilicHQpOworfQorCit2b2lkCitkZWxldGVfY29tbWFuZCAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCBicmVha3BvaW50ICpiLCAqdGVtcDsKKworICBpZiAoYXJnID09IDApCisgICAgeworICAgICAgaW50IGJyZWFrc190b19kZWxldGUgPSAwOworCisgICAgICAvKiBEZWxldGUgYWxsIGJyZWFrcG9pbnRzIGlmIG5vIGFyZ3VtZW50LgorCSBEbyBub3QgZGVsZXRlIGludGVybmFsIG9yIGNhbGwtZHVtbXkgYnJlYWtwb2ludHMsIHRoZXNlCisJIGhhdmUgdG8gYmUgZGVsZXRlZCB3aXRoIGFuIGV4cGxpY2l0IGJyZWFrcG9pbnQgbnVtYmVyIGFyZ3VtZW50LiAgKi8KKyAgICAgIEFMTF9CUkVBS1BPSU5UUyAoYikgCisJeworCSAgaWYgKGItPnR5cGUgIT0gYnBfY2FsbF9kdW1teSAmJiAKKyAgICAgICAgICAgICAgYi0+dHlwZSAhPSBicF9zaGxpYl9ldmVudCAmJiAKKyAgICAgICAgICAgICAgYi0+bnVtYmVyID49IDApCisJICAgIGJyZWFrc190b19kZWxldGUgPSAxOworCX0KKworICAgICAgLyogQXNrIHVzZXIgb25seSBpZiB0aGVyZSBhcmUgc29tZSBicmVha3BvaW50cyB0byBkZWxldGUuICAqLworICAgICAgaWYgKCFmcm9tX3R0eQorCSAgfHwgKGJyZWFrc190b19kZWxldGUgJiYgcXVlcnkgKCJEZWxldGUgYWxsIGJyZWFrcG9pbnRzPyAiKSkpCisJeworCSAgQUxMX0JSRUFLUE9JTlRTX1NBRkUgKGIsIHRlbXApIAorCSAgICB7CisJICAgICAgaWYgKGItPnR5cGUgIT0gYnBfY2FsbF9kdW1teSAmJgorICAgICAgICAgICAgICAgICAgYi0+dHlwZSAhPSBicF9zaGxpYl9ldmVudCAmJgorICAgICAgICAgICAgICAgICAgYi0+bnVtYmVyID49IDApCisJCWRlbGV0ZV9icmVha3BvaW50IChiKTsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICBtYXBfYnJlYWtwb2ludF9udW1iZXJzIChhcmcsIGRlbGV0ZV9icmVha3BvaW50KTsKK30KKworLyogUmVzZXQgYSBicmVha3BvaW50IGdpdmVuIGl0J3Mgc3RydWN0IGJyZWFrcG9pbnQgKiBCSU5ULgorICAgVGhlIHZhbHVlIHdlIHJldHVybiBlbmRzIHVwIGJlaW5nIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBjYXRjaF9lcnJvcnMuCisgICBVbnVzZWQgaW4gdGhpcyBjYXNlLiAgKi8KKworc3RhdGljIGludAorYnJlYWtwb2ludF9yZV9zZXRfb25lIChiaW50KQorICAgICBQVFIgYmludDsKK3sKKyAgc3RydWN0IGJyZWFrcG9pbnQgKmIgPSAoc3RydWN0IGJyZWFrcG9pbnQgKiliaW50OyAgLyogZ2V0IHBhc3QgY2F0Y2hfZXJycyAqLworICBzdHJ1Y3QgdmFsdWUgKm1hcms7CisgIGludCBpOworICBzdHJ1Y3Qgc3ltdGFic19hbmRfbGluZXMgc2FsczsKKyAgY2hhciAqczsKKyAgZW51bSBlbmFibGUgc2F2ZV9lbmFibGU7CisKKyAgc3dpdGNoIChiLT50eXBlKQorICAgIHsKKyAgICBjYXNlIGJwX25vbmU6CisgICAgICB3YXJuaW5nICgiYXR0ZW1wdGVkIHRvIHJlc2V0IGFwcGFyZW50bHkgZGVsZXRlZCBicmVha3BvaW50ICMlZD9cbiIsIGItPm51bWJlcik7CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIGJwX2JyZWFrcG9pbnQ6CisgICAgY2FzZSBicF9oYXJkd2FyZV9icmVha3BvaW50OgorICAgIGNhc2UgYnBfY2F0Y2hfbG9hZDoKKyAgICBjYXNlIGJwX2NhdGNoX3VubG9hZDoKKyAgICAgIGlmIChiLT5hZGRyX3N0cmluZyA9PSBOVUxMKQorCXsKKwkgIC8qIEFueXRoaW5nIHdpdGhvdXQgYSBzdHJpbmcgY2FuJ3QgYmUgcmUtc2V0LiAqLworCSAgZGVsZXRlX2JyZWFrcG9pbnQgKGIpOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgLyogSW4gY2FzZSB3ZSBoYXZlIGEgcHJvYmxlbSwgZGlzYWJsZSB0aGlzIGJyZWFrcG9pbnQuICBXZSdsbCByZXN0b3JlCisJIGl0cyBzdGF0dXMgaWYgd2Ugc3VjY2VlZC4gICovCisgICAgICBzYXZlX2VuYWJsZSA9IGItPmVuYWJsZTsKKyAgICAgIGItPmVuYWJsZSA9IGRpc2FibGVkOworCisgICAgICBzZXRfbGFuZ3VhZ2UgKGItPmxhbmd1YWdlKTsKKyAgICAgIGlucHV0X3JhZGl4ID0gYi0+aW5wdXRfcmFkaXg7CisgICAgICBzID0gYi0+YWRkcl9zdHJpbmc7CisgICAgICBzYWxzID0gZGVjb2RlX2xpbmVfMSAoJnMsIDEsIChzdHJ1Y3Qgc3ltdGFiICopTlVMTCwgMCwgKGNoYXIgKioqKU5VTEwpOworICAgICAgZm9yIChpID0gMDsgaSA8IHNhbHMubmVsdHM7IGkrKykKKwl7CisJICByZXNvbHZlX3NhbF9wYyAoJnNhbHMuc2Fsc1tpXSk7CisKKwkgIC8qIFJlcGFyc2UgY29uZGl0aW9ucywgdGhleSBtaWdodCBjb250YWluIHJlZmVyZW5jZXMgdG8gdGhlCisJICAgICBvbGQgc3ltdGFiLiAgKi8KKwkgIGlmIChiLT5jb25kX3N0cmluZyAhPSBOVUxMKQorCSAgICB7CisJICAgICAgcyA9IGItPmNvbmRfc3RyaW5nOworCSAgICAgIGlmIChiLT5jb25kKQorCQlmcmVlICgoUFRSKWItPmNvbmQpOworCSAgICAgIGItPmNvbmQgPSBwYXJzZV9leHBfMSAoJnMsIGJsb2NrX2Zvcl9wYyAoc2Fscy5zYWxzW2ldLnBjKSwgMCk7CisJICAgIH0KKworCSAgLyogV2UgbmVlZCB0byByZS1zZXQgdGhlIGJyZWFrcG9pbnQgaWYgdGhlIGFkZHJlc3MgY2hhbmdlcy4uLiovCisJICBpZiAoYi0+YWRkcmVzcyAhPSBzYWxzLnNhbHNbaV0ucGMKKwkgICAgICAvKiAuLi5vciBuZXcgYW5kIG9sZCBicmVha3BvaW50cyBib3RoIGhhdmUgc291cmNlIGZpbGVzLCBhbmQKKwkJIHRoZSBzb3VyY2UgZmlsZSBuYW1lIG9yIHRoZSBsaW5lIG51bWJlciBjaGFuZ2VzLi4uICAqLworCSAgICAgIHx8IChiLT5zb3VyY2VfZmlsZSAhPSBOVUxMCisJCSAgJiYgc2Fscy5zYWxzW2ldLnN5bXRhYiAhPSBOVUxMCisJCSAgJiYgKCFTVFJFUSAoYi0+c291cmNlX2ZpbGUsIHNhbHMuc2Fsc1tpXS5zeW10YWItPmZpbGVuYW1lKQorCQkgICAgICB8fCBiLT5saW5lX251bWJlciAhPSBzYWxzLnNhbHNbaV0ubGluZSkKKwkJICApCisJICAgICAgLyogLi4ub3Igd2Ugc3dpdGNoIGJldHdlZW4gaGF2aW5nIGEgc291cmNlIGZpbGUgYW5kIG5vdCBoYXZpbmcKKwkJIG9uZS4gICovCisJICAgICAgfHwgKChiLT5zb3VyY2VfZmlsZSA9PSBOVUxMKSAhPSAoc2Fscy5zYWxzW2ldLnN5bXRhYiA9PSBOVUxMKSkKKwkgICAgICApCisJICAgIHsKKwkgICAgICBpZiAoYi0+c291cmNlX2ZpbGUgIT0gTlVMTCkKKwkJZnJlZSAoYi0+c291cmNlX2ZpbGUpOworCSAgICAgIGlmIChzYWxzLnNhbHNbaV0uc3ltdGFiID09IE5VTEwpCisJCWItPnNvdXJjZV9maWxlID0gTlVMTDsKKwkgICAgICBlbHNlCisJCWItPnNvdXJjZV9maWxlID0KKwkJICBzYXZlc3RyaW5nIChzYWxzLnNhbHNbaV0uc3ltdGFiLT5maWxlbmFtZSwKKwkJCSAgICAgIHN0cmxlbiAoc2Fscy5zYWxzW2ldLnN5bXRhYi0+ZmlsZW5hbWUpKTsKKwkgICAgICBiLT5saW5lX251bWJlciA9IHNhbHMuc2Fsc1tpXS5saW5lOworCSAgICAgIGItPmFkZHJlc3MgPSBzYWxzLnNhbHNbaV0ucGM7CisKKyAgICAgICAgICAgICAvKiBVc2VkIHRvIGNoZWNrIGZvciBkdXBsaWNhdGVzIGhlcmUsIGJ1dCB0aGF0IGNhbgorCQljYXVzZSB0cm91YmxlLCBhcyBpdCBkb2Vzbid0IGNoZWNrIGZvciBkaXNhYmxlCisgICAgICAgICAgICAgICAgYnJlYWtwb2ludHMuICovCisKKwkgICAgICBtZW50aW9uIChiKTsKKworCSAgICAgIC8qIE1pZ2h0IGJlIGJldHRlciB0byBkbyB0aGlzIGp1c3Qgb25jZSBwZXIgYnJlYWtwb2ludF9yZV9zZXQsCisJCSByYXRoZXIgdGhhbiBvbmNlIGZvciBldmVyeSBicmVha3BvaW50LiAgKi8KKwkgICAgICBicmVha3BvaW50c19jaGFuZ2VkICgpOworCSAgICB9CisJICBiLT5zZWN0aW9uID0gc2Fscy5zYWxzW2ldLnNlY3Rpb247CisJICBiLT5lbmFibGUgPSBzYXZlX2VuYWJsZTsJLyogUmVzdG9yZSBpdCwgdGhpcyB3b3JrZWQuICovCisKKworICAgICAgICAgIC8qIE5vdyB0aGF0IHRoaXMgaXMgcmUtZW5hYmxlZCwgY2hlY2tfZHVwbGljYXRlcworCSAgICAgY2FuIGJlIHVzZWQuICovCisgICAgICAgICAgY2hlY2tfZHVwbGljYXRlcyAoYi0+YWRkcmVzcywgYi0+c2VjdGlvbik7CisKKwl9CisgICAgICBmcmVlICgoUFRSKXNhbHMuc2Fscyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgYnBfd2F0Y2hwb2ludDoKKyAgICBjYXNlIGJwX2hhcmR3YXJlX3dhdGNocG9pbnQ6CisgICAgY2FzZSBicF9yZWFkX3dhdGNocG9pbnQ6CisgICAgY2FzZSBicF9hY2Nlc3Nfd2F0Y2hwb2ludDoKKyAgICAgIGlubmVybW9zdF9ibG9jayA9IE5VTEw7CisgICAgICAvKiBUaGUgaXNzdWUgYXJpc2VzIG9mIHdoYXQgY29udGV4dCB0byBldmFsdWF0ZSB0aGlzIGluLiAgVGhlIHNhbWUKKwkgb25lIGFzIHdoZW4gaXQgd2FzIHNldCwgYnV0IHdoYXQgZG9lcyB0aGF0IG1lYW4gd2hlbiBzeW1ib2xzIGhhdmUKKwkgYmVlbiByZS1yZWFkPyAgV2UgY291bGQgc2F2ZSB0aGUgZmlsZW5hbWUgYW5kIGZ1bmN0aW9ubmFtZSwgYnV0CisJIGlmIHRoZSBjb250ZXh0IGlzIG1vcmUgbG9jYWwgdGhhbiB0aGF0LCB0aGUgYmVzdCB3ZSBjb3VsZCBkbyB3b3VsZAorCSBiZSBzb21ldGhpbmcgbGlrZSBob3cgbWFueSBsZXZlbHMgZGVlcCBhbmQgd2hpY2ggaW5kZXggYXQgdGhhdAorCSBwYXJ0aWN1bGFyIGxldmVsLCBidXQgdGhhdCdzIGdvaW5nIHRvIGJlIGxlc3Mgc3RhYmxlIHRoYW4gZmlsZW5hbWVzCisJIG9yIGZ1bmN0aW9ubmFtZXMuICAqLworICAgICAgLyogU28gZm9yIG5vdywganVzdCB1c2UgYSBnbG9iYWwgY29udGV4dC4gICovCisgICAgICBpZiAoYi0+ZXhwKQorCWZyZWUgKChQVFIpYi0+ZXhwKTsKKyAgICAgIGItPmV4cCA9IHBhcnNlX2V4cHJlc3Npb24gKGItPmV4cF9zdHJpbmcpOworICAgICAgYi0+ZXhwX3ZhbGlkX2Jsb2NrID0gaW5uZXJtb3N0X2Jsb2NrOworICAgICAgbWFyayA9IHZhbHVlX21hcmsgKCk7CisgICAgICBpZiAoYi0+dmFsKQorCXZhbHVlX2ZyZWUgKGItPnZhbCk7CisgICAgICBiLT52YWwgPSBldmFsdWF0ZV9leHByZXNzaW9uIChiLT5leHApOworICAgICAgcmVsZWFzZV92YWx1ZSAoYi0+dmFsKTsKKyAgICAgIGlmIChWQUxVRV9MQVpZIChiLT52YWwpKQorCXZhbHVlX2ZldGNoX2xhenkgKGItPnZhbCk7CisKKyAgICAgIGlmIChiLT5jb25kX3N0cmluZyAhPSBOVUxMKQorCXsKKwkgIHMgPSBiLT5jb25kX3N0cmluZzsKKwkgIGlmIChiLT5jb25kKQorCSAgICBmcmVlICgoUFRSKWItPmNvbmQpOworCSAgYi0+Y29uZCA9IHBhcnNlX2V4cF8xICgmcywgKHN0cnVjdCBibG9jayAqKTAsIDApOworCX0KKyAgICAgIGlmIChiLT5lbmFibGUgPT0gZW5hYmxlZCkKKwltZW50aW9uIChiKTsKKyAgICAgIHZhbHVlX2ZyZWVfdG9fbWFyayAobWFyayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGJwX2NhdGNoX2NhdGNoOiAgCisgICAgY2FzZSBicF9jYXRjaF90aHJvdzogIAorICAgICAgYnJlYWs7CisgICAgLyogV2UgbmVlZG4ndCByZWFsbHkgZG8gYW55dGhpbmcgdG8gcmVzZXQgdGhlc2UsIHNpbmNlIHRoZSBtYXNrCisgICAgICAgdGhhdCByZXF1ZXN0cyB0aGVtIGlzIHVuYWZmZWN0ZWQgYnkgZS5nLiwgbmV3IGxpYnJhcmllcyBiZWluZworICAgICAgIGxvYWRlZC4gKi8KKyAgICBjYXNlIGJwX2NhdGNoX2Zvcms6CisgICAgY2FzZSBicF9jYXRjaF92Zm9yazoKKyAgICBjYXNlIGJwX2NhdGNoX2V4ZWM6CisgICAgICBicmVhazsKKyAKKyAgICBkZWZhdWx0OgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiRGVsZXRpbmcgdW5rbm93biBicmVha3BvaW50IHR5cGUgJWRcbiIsIGItPnR5cGUpOworICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgLyogRGVsZXRlIGxvbmdqbXAgYnJlYWtwb2ludHMsIHRoZXkgd2lsbCBiZSByZXNldCBsYXRlciBieQorICAgICAgIGJyZWFrcG9pbnRfcmVfc2V0LiAgKi8KKyAgICBjYXNlIGJwX2xvbmdqbXA6CisgICAgY2FzZSBicF9sb25nam1wX3Jlc3VtZToKKyAgICAgIGRlbGV0ZV9icmVha3BvaW50IChiKTsKKyAgICAgIGJyZWFrOworCisgICAgLyogVGhpcyBicmVha3BvaW50IGlzIHNwZWNpYWwsIGl0J3Mgc2V0IHVwIHdoZW4gdGhlIGluZmVyaW9yCisgICAgICAgc3RhcnRzIGFuZCB3ZSByZWFsbHkgZG9uJ3Qgd2FudCB0byB0b3VjaCBpdC4gICovCisgICAgY2FzZSBicF9zaGxpYl9ldmVudDoKKworICAgIC8qIEtlZXAgdGVtcG9yYXJ5IGJyZWFrcG9pbnRzLCB3aGljaCBjYW4gYmUgZW5jb3VudGVyZWQgd2hlbiB3ZSBzdGVwCisgICAgICAgb3ZlciBhIGRsb3BlbiBjYWxsIGFuZCBTT0xJQl9BREQgaXMgcmVzZXR0aW5nIHRoZSBicmVha3BvaW50cy4KKyAgICAgICBPdGhlcndpc2UgdGhlc2Ugc2hvdWxkIGhhdmUgYmVlbiBibG93biBhd2F5IHZpYSB0aGUgY2xlYW51cCBjaGFpbgorICAgICAgIG9yIGJ5IGJyZWFrcG9pbnRfaW5pdF9pbmZlcmlvciB3aGVuIHdlIHJlcnVuIHRoZSBleGVjdXRhYmxlLiAgKi8KKyAgICBjYXNlIGJwX3VudGlsOgorICAgIGNhc2UgYnBfZmluaXNoOgorICAgIGNhc2UgYnBfd2F0Y2hwb2ludF9zY29wZToKKyAgICBjYXNlIGJwX2NhbGxfZHVtbXk6CisgICAgY2FzZSBicF9zdGVwX3Jlc3VtZToKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogUmUtc2V0IGFsbCBicmVha3BvaW50cyBhZnRlciBzeW1ib2xzIGhhdmUgYmVlbiByZS1sb2FkZWQuICAqLwordm9pZAorYnJlYWtwb2ludF9yZV9zZXQgKCkKK3sKKyAgc3RydWN0IGJyZWFrcG9pbnQgKmIsICp0ZW1wOworICBlbnVtIGxhbmd1YWdlIHNhdmVfbGFuZ3VhZ2U7CisgIGludCBzYXZlX2lucHV0X3JhZGl4OworICBzdGF0aWMgY2hhciBtZXNzYWdlMVtdID0gIkVycm9yIGluIHJlLXNldHRpbmcgYnJlYWtwb2ludCAlZDpcbiI7CisgIGNoYXIgbWVzc2FnZVtzaXplb2YgKG1lc3NhZ2UxKSArIDMwIC8qIHNsb3AgKi9dOworICAKKyAgc2F2ZV9sYW5ndWFnZSA9IGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2xhbmd1YWdlOworICBzYXZlX2lucHV0X3JhZGl4ID0gaW5wdXRfcmFkaXg7CisgIEFMTF9CUkVBS1BPSU5UU19TQUZFIChiLCB0ZW1wKQorICAgIHsKKyAgICAgIHNwcmludGYgKG1lc3NhZ2UsIG1lc3NhZ2UxLCBiLT5udW1iZXIpOwkvKiBGb3JtYXQgcG9zc2libGUgZXJyb3IgbXNnICovCisgICAgICBjYXRjaF9lcnJvcnMgKGJyZWFrcG9pbnRfcmVfc2V0X29uZSwgYiwgbWVzc2FnZSwgUkVUVVJOX01BU0tfQUxMKTsKKyAgICB9CisgIHNldF9sYW5ndWFnZSAoc2F2ZV9sYW5ndWFnZSk7CisgIGlucHV0X3JhZGl4ID0gc2F2ZV9pbnB1dF9yYWRpeDsKKworI2lmZGVmIEdFVF9MT05HSk1QX1RBUkdFVAorICBjcmVhdGVfbG9uZ2ptcF9icmVha3BvaW50ICgibG9uZ2ptcCIpOworICBjcmVhdGVfbG9uZ2ptcF9icmVha3BvaW50ICgiX2xvbmdqbXAiKTsKKyAgY3JlYXRlX2xvbmdqbXBfYnJlYWtwb2ludCAoInNpZ2xvbmdqbXAiKTsKKyAgY3JlYXRlX2xvbmdqbXBfYnJlYWtwb2ludCAoIl9zaWdsb25nam1wIik7CisgIGNyZWF0ZV9sb25nam1wX2JyZWFrcG9pbnQgKE5VTEwpOworI2VuZGlmCisKKyNpZiAwCisgIC8qIFRvb2sgdGhpcyBvdXQgKHRlbXBvcmFyaWx5IGF0IGxlYXN0KSwgc2luY2UgaXQgcHJvZHVjZXMgYW4gZXh0cmEgCisgICAgIGJsYW5rIGxpbmUgYXQgc3RhcnR1cC4gVGhpcyBtZXNzZXMgdXAgdGhlIGdkYnRlc3RzLiAtUEIgKi8KKyAgLyogQmxhbmsgbGluZSB0byBmaW5pc2ggb2ZmIGFsbCB0aG9zZSBtZW50aW9uKCkgbWVzc2FnZXMgd2UganVzdCBwcmludGVkLiAgKi8KKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyNlbmRpZgorfQorDAorLyogU2V0IGlnbm9yZS1jb3VudCBvZiBicmVha3BvaW50IG51bWJlciBCUFROVU0gdG8gQ09VTlQuCisgICBJZiBmcm9tX3R0eSBpcyBub256ZXJvLCBpdCBwcmludHMgYSBtZXNzYWdlIHRvIHRoYXQgZWZmZWN0LAorICAgd2hpY2ggZW5kcyB3aXRoIGEgcGVyaW9kIChubyBuZXdsaW5lKS4gICovCisKKy8qIFJlc2V0IHRoZSB0aHJlYWQgbnVtYmVyIG9mIHRoaXMgYnJlYWtwb2ludDoKKworICAgLSBJZiB0aGUgYnJlYWtwb2ludCBpcyBmb3IgYWxsIHRocmVhZHMsIGxlYXZlIGl0IGFzLWlzLgorICAgLSBFbHNlLCByZXNldCBpdCB0byB0aGUgY3VycmVudCB0aHJlYWQgZm9yIGluZmVyaW9yX3BpZC4gKi8KK3ZvaWQKK2JyZWFrcG9pbnRfcmVfc2V0X3RocmVhZCAoYikKKyAgc3RydWN0IGJyZWFrcG9pbnQgKiAgYjsKK3sKKyAgaWYgKGItPnRocmVhZCAhPSAtMSkKKyAgICB7CisgICAgICBpZiAoaW5fdGhyZWFkX2xpc3QgKGluZmVyaW9yX3BpZCkpCisgICAgICAgIGItPnRocmVhZCA9IHBpZF90b190aHJlYWRfaWQgKGluZmVyaW9yX3BpZCk7CisgICAgfQorfQorCit2b2lkCitzZXRfaWdub3JlX2NvdW50IChicHRudW0sIGNvdW50LCBmcm9tX3R0eSkKKyAgICAgaW50IGJwdG51bSwgY291bnQsIGZyb21fdHR5OworeworICByZWdpc3RlciBzdHJ1Y3QgYnJlYWtwb2ludCAqYjsKKworICBpZiAoY291bnQgPCAwKQorICAgIGNvdW50ID0gMDsKKworICBBTExfQlJFQUtQT0lOVFMgKGIpCisgICAgaWYgKGItPm51bWJlciA9PSBicHRudW0pCisgICAgICB7CisJYi0+aWdub3JlX2NvdW50ID0gY291bnQ7CisJaWYgKCFmcm9tX3R0eSkKKwkgIHJldHVybjsKKwllbHNlIGlmIChjb3VudCA9PSAwKQorCSAgcHJpbnRmX2ZpbHRlcmVkICgiV2lsbCBzdG9wIG5leHQgdGltZSBicmVha3BvaW50ICVkIGlzIHJlYWNoZWQuIiwKKwkJCSAgIGJwdG51bSk7CisJZWxzZSBpZiAoY291bnQgPT0gMSkKKwkgIHByaW50Zl9maWx0ZXJlZCAoIldpbGwgaWdub3JlIG5leHQgY3Jvc3Npbmcgb2YgYnJlYWtwb2ludCAlZC4iLAorCQkJICAgYnB0bnVtKTsKKwllbHNlCisJICBwcmludGZfZmlsdGVyZWQgKCJXaWxsIGlnbm9yZSBuZXh0ICVkIGNyb3NzaW5ncyBvZiBicmVha3BvaW50ICVkLiIsCisJCSAgY291bnQsIGJwdG51bSk7CisJYnJlYWtwb2ludHNfY2hhbmdlZCAoKTsKKwlyZXR1cm47CisgICAgICB9CisKKyAgZXJyb3IgKCJObyBicmVha3BvaW50IG51bWJlciAlZC4iLCBicHRudW0pOworfQorCisvKiBDbGVhciB0aGUgaWdub3JlIGNvdW50cyBvZiBhbGwgYnJlYWtwb2ludHMuICAqLwordm9pZAorYnJlYWtwb2ludF9jbGVhcl9pZ25vcmVfY291bnRzICgpCit7CisgIHN0cnVjdCBicmVha3BvaW50ICpiOworCisgIEFMTF9CUkVBS1BPSU5UUyAoYikKKyAgICBiLT5pZ25vcmVfY291bnQgPSAwOworfQorCisvKiBDb21tYW5kIHRvIHNldCBpZ25vcmUtY291bnQgb2YgYnJlYWtwb2ludCBOIHRvIENPVU5ULiAgKi8KKworc3RhdGljIHZvaWQKK2lnbm9yZV9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjaGFyICpwID0gYXJnczsKKyAgcmVnaXN0ZXIgaW50IG51bTsKKworICBpZiAocCA9PSAwKQorICAgIGVycm9yX25vX2FyZyAoImEgYnJlYWtwb2ludCBudW1iZXIiKTsKKyAgCisgIG51bSA9IGdldF9udW1iZXIgKCZwKTsKKworICBpZiAoKnAgPT0gMCkKKyAgICBlcnJvciAoIlNlY29uZCBhcmd1bWVudCAoc3BlY2lmaWVkIGlnbm9yZS1jb3VudCkgaXMgbWlzc2luZy4iKTsKKworICBzZXRfaWdub3JlX2NvdW50IChudW0sCisJCSAgICBsb25nZXN0X3RvX2ludCAodmFsdWVfYXNfbG9uZyAocGFyc2VfYW5kX2V2YWwgKHApKSksCisJCSAgICBmcm9tX3R0eSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIGJyZWFrcG9pbnRzX2NoYW5nZWQgKCk7Cit9CisMCisvKiBDYWxsIEZVTkNUSU9OIG9uIGVhY2ggb2YgdGhlIGJyZWFrcG9pbnRzCisgICB3aG9zZSBudW1iZXJzIGFyZSBnaXZlbiBpbiBBUkdTLiAgKi8KKworc3RhdGljIHZvaWQKK21hcF9icmVha3BvaW50X251bWJlcnMgKGFyZ3MsIGZ1bmN0aW9uKQorICAgICBjaGFyICphcmdzOworICAgICB2b2lkICgqZnVuY3Rpb24pIFBBUkFNUyAoKHN0cnVjdCBicmVha3BvaW50ICopKTsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqcCA9IGFyZ3M7CisgIGNoYXIgKnAxOworICByZWdpc3RlciBpbnQgbnVtOworICByZWdpc3RlciBzdHJ1Y3QgYnJlYWtwb2ludCAqYjsKKworICBpZiAocCA9PSAwKQorICAgIGVycm9yX25vX2FyZyAoIm9uZSBvciBtb3JlIGJyZWFrcG9pbnQgbnVtYmVycyIpOworCisgIHdoaWxlICgqcCkKKyAgICB7CisgICAgICBwMSA9IHA7CisgICAgICAKKyAgICAgIG51bSA9IGdldF9udW1iZXIgKCZwMSk7CisKKyAgICAgIEFMTF9CUkVBS1BPSU5UUyAoYikKKwlpZiAoYi0+bnVtYmVyID09IG51bSkKKwkgIHsKKwkgICAgc3RydWN0IGJyZWFrcG9pbnQgKnJlbGF0ZWRfYnJlYWtwb2ludCA9IGItPnJlbGF0ZWRfYnJlYWtwb2ludDsKKwkgICAgZnVuY3Rpb24gKGIpOworCSAgICBpZiAocmVsYXRlZF9icmVha3BvaW50KQorCSAgICAgIGZ1bmN0aW9uIChyZWxhdGVkX2JyZWFrcG9pbnQpOworCSAgICBnb3RvIHdpbjsKKwkgIH0KKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiTm8gYnJlYWtwb2ludCBudW1iZXIgJWQuXG4iLCBudW0pOworICAgIHdpbjoKKyAgICAgIHAgPSBwMTsKKyAgICB9Cit9CisKK3ZvaWQKK2Rpc2FibGVfYnJlYWtwb2ludCAoYnB0KQorICAgICBzdHJ1Y3QgYnJlYWtwb2ludCAqYnB0OworeworICAvKiBOZXZlciBkaXNhYmxlIGEgd2F0Y2hwb2ludCBzY29wZSBicmVha3BvaW50OyB3ZSB3YW50IHRvCisgICAgIGhpdCB0aGVtIHdoZW4gd2UgbGVhdmUgc2NvcGUgc28gd2UgY2FuIGRlbGV0ZSBib3RoIHRoZQorICAgICB3YXRjaHBvaW50IGFuZCBpdHMgc2NvcGUgYnJlYWtwb2ludCBhdCB0aGF0IHRpbWUuICAqLworICBpZiAoYnB0LT50eXBlID09IGJwX3dhdGNocG9pbnRfc2NvcGUpCisgICAgcmV0dXJuOworCisgIGJwdC0+ZW5hYmxlID0gZGlzYWJsZWQ7CisKKyAgY2hlY2tfZHVwbGljYXRlcyAoYnB0LT5hZGRyZXNzLCBicHQtPnNlY3Rpb24pOworCisgIGlmIChtb2RpZnlfYnJlYWtwb2ludF9ob29rKQorICAgIG1vZGlmeV9icmVha3BvaW50X2hvb2sgKGJwdCk7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorZGlzYWJsZV9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICByZWdpc3RlciBzdHJ1Y3QgYnJlYWtwb2ludCAqYnB0OworICBpZiAoYXJncyA9PSAwKQorICAgIEFMTF9CUkVBS1BPSU5UUyAoYnB0KQorICAgICAgc3dpdGNoIChicHQtPnR5cGUpCisJeworICAgICAgICBjYXNlIGJwX25vbmU6CisgICAgICAgICAgd2FybmluZyAoImF0dGVtcHRlZCB0byBkaXNhYmxlIGFwcGFyZW50bHkgZGVsZXRlZCBicmVha3BvaW50ICMlZD9cbiIsIGJwdC0+bnVtYmVyKTsKKyAgICAgICAgICBjb250aW51ZTsKKwljYXNlIGJwX2JyZWFrcG9pbnQ6CisgICAgICAgIGNhc2UgYnBfY2F0Y2hfbG9hZDoKKyAgICAgICAgY2FzZSBicF9jYXRjaF91bmxvYWQ6CisgICAgICAgIGNhc2UgYnBfY2F0Y2hfZm9yazoKKyAgICAgICAgY2FzZSBicF9jYXRjaF92Zm9yazoKKyAgICAgICAgY2FzZSBicF9jYXRjaF9leGVjOgorCWNhc2UgYnBfY2F0Y2hfY2F0Y2g6CisJY2FzZSBicF9jYXRjaF90aHJvdzoKKyAgICAgICAgY2FzZSBicF9oYXJkd2FyZV9icmVha3BvaW50OgorICAgICAgICBjYXNlIGJwX3dhdGNocG9pbnQ6CisgICAgICAgIGNhc2UgYnBfaGFyZHdhcmVfd2F0Y2hwb2ludDoKKyAgICAgICAgY2FzZSBicF9yZWFkX3dhdGNocG9pbnQ6CisgICAgICAgIGNhc2UgYnBfYWNjZXNzX3dhdGNocG9pbnQ6CisJICBkaXNhYmxlX2JyZWFrcG9pbnQgKGJwdCk7CisJZGVmYXVsdDoKKwkgIGNvbnRpbnVlOworCX0KKyAgZWxzZQorICAgIG1hcF9icmVha3BvaW50X251bWJlcnMgKGFyZ3MsIGRpc2FibGVfYnJlYWtwb2ludCk7Cit9CisKK3N0YXRpYyB2b2lkCitkb19lbmFibGVfYnJlYWtwb2ludCAoYnB0LCBkaXNwb3NpdGlvbikKKyAgICAgc3RydWN0IGJyZWFrcG9pbnQgKmJwdDsKKyAgICAgZW51bSBicGRpc3AgZGlzcG9zaXRpb247Cit7CisgIHN0cnVjdCBmcmFtZV9pbmZvICpzYXZlX3NlbGVjdGVkX2ZyYW1lID0gTlVMTDsKKyAgaW50IHNhdmVfc2VsZWN0ZWRfZnJhbWVfbGV2ZWwgPSAtMTsKKyAgaW50IHRhcmdldF9yZXNvdXJjZXNfb2ssIG90aGVyX3R5cGVfdXNlZDsKKyAgc3RydWN0IHZhbHVlICptYXJrOworCisgIGlmIChicHQtPnR5cGUgPT0gYnBfaGFyZHdhcmVfYnJlYWtwb2ludCkKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIGkgPSBod19icmVha3BvaW50X3VzZWRfY291bnQoKTsKKyAgICAgIHRhcmdldF9yZXNvdXJjZXNfb2sgPSBUQVJHRVRfQ0FOX1VTRV9IQVJEV0FSRV9XQVRDSFBPSU5UKAorCQlicF9oYXJkd2FyZV9icmVha3BvaW50LCBpKzEsIDApOworICAgICAgaWYgKHRhcmdldF9yZXNvdXJjZXNfb2sgPT0gMCkKKyAgICAgICAgZXJyb3IgKCJObyBoYXJkd2FyZSBicmVha3BvaW50IHN1cHBvcnQgaW4gdGhlIHRhcmdldC4iKTsKKyAgICAgIGVsc2UgaWYgKHRhcmdldF9yZXNvdXJjZXNfb2sgPCAwKQorICAgICAgICBlcnJvciAoIkhhcmR3YXJlIGJyZWFrcG9pbnRzIHVzZWQgZXhjZWVkcyBsaW1pdC4iKTsKKyAgICB9CisKKyAgYnB0LT5lbmFibGUgPSBlbmFibGVkOworICBicHQtPmRpc3Bvc2l0aW9uID0gZGlzcG9zaXRpb247CisgIGNoZWNrX2R1cGxpY2F0ZXMgKGJwdC0+YWRkcmVzcywgYnB0LT5zZWN0aW9uKTsKKyAgYnJlYWtwb2ludHNfY2hhbmdlZCAoKTsKKworICBpZiAoYnB0LT50eXBlID09IGJwX3dhdGNocG9pbnQgfHwgYnB0LT50eXBlID09IGJwX2hhcmR3YXJlX3dhdGNocG9pbnQgfHwKKyAgICAgIGJwdC0+dHlwZSA9PSBicF9yZWFkX3dhdGNocG9pbnQgfHwgYnB0LT50eXBlID09IGJwX2FjY2Vzc193YXRjaHBvaW50KQorICAgIHsKKyAgICAgIGlmIChicHQtPmV4cF92YWxpZF9ibG9jayAhPSBOVUxMKQorCXsKKwkgIHN0cnVjdCBmcmFtZV9pbmZvICpmciA9CisKKyAgICAgICAgICAvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIHRoZSBjdXJyZW50IGZyYW1lLiAgRWxzZSwgdGhpcworICAgICAgICAgICAgIG5leHQgcXVlcnkgbWF5IHBlc3NpbWlzdGljYWxseSBiZSBhbnN3ZXJlZCBhcywgIk5vLAorICAgICAgICAgICAgIG5vdCB3aXRoaW4gY3VycmVudCBzY29wZSIuICovCisgICAgICAgICAgZ2V0X2N1cnJlbnRfZnJhbWUgKCk7CisgICAgICAgICAgZnIgPSBmaW5kX2ZyYW1lX2FkZHJfaW5fZnJhbWVfY2hhaW4gKGJwdC0+d2F0Y2hwb2ludF9mcmFtZSk7CisJICBpZiAoZnIgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlwKK0Nhbm5vdCBlbmFibGUgd2F0Y2hwb2ludCAlZCBiZWNhdXNlIHRoZSBibG9jayBpbiB3aGljaCBpdHMgZXhwcmVzc2lvblxuXAoraXMgdmFsaWQgaXMgbm90IGN1cnJlbnRseSBpbiBzY29wZS5cbiIsIGJwdC0+bnVtYmVyKTsKKwkgICAgICBicHQtPmVuYWJsZSA9IGRpc2FibGVkOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCisJICBzYXZlX3NlbGVjdGVkX2ZyYW1lID0gc2VsZWN0ZWRfZnJhbWU7CisJICBzYXZlX3NlbGVjdGVkX2ZyYW1lX2xldmVsID0gc2VsZWN0ZWRfZnJhbWVfbGV2ZWw7CisJICBzZWxlY3RfZnJhbWUgKGZyLCAtMSk7CisJfQorCisgICAgICB2YWx1ZV9mcmVlIChicHQtPnZhbCk7CisgICAgICBtYXJrID0gdmFsdWVfbWFyayAoKTsKKyAgICAgIGJwdC0+dmFsID0gZXZhbHVhdGVfZXhwcmVzc2lvbiAoYnB0LT5leHApOworICAgICAgcmVsZWFzZV92YWx1ZSAoYnB0LT52YWwpOworICAgICAgaWYgKFZBTFVFX0xBWlkgKGJwdC0+dmFsKSkKKwl2YWx1ZV9mZXRjaF9sYXp5IChicHQtPnZhbCk7CisKKyAgICAgIGlmIChicHQtPnR5cGUgPT0gYnBfaGFyZHdhcmVfd2F0Y2hwb2ludCB8fAorICAgICAgICAgICBicHQtPnR5cGUgPT0gYnBfcmVhZF93YXRjaHBvaW50IHx8CisgICAgICAgICAgIGJwdC0+dHlwZSA9PSBicF9hY2Nlc3Nfd2F0Y2hwb2ludCkKKyAgICAgIHsKKyAgICAgICAgaW50IGkgPSBod193YXRjaHBvaW50X3VzZWRfY291bnQgKGJwdC0+dHlwZSwgJm90aGVyX3R5cGVfdXNlZCk7CisgICAgICAgIGludCBtZW1fY250ID0gY2FuX3VzZV9oYXJkd2FyZV93YXRjaHBvaW50IChicHQtPnZhbCk7CisKKyAgICAgICAgLyogSGFjayBhcm91bmQgJ3VudXNlZCB2YXInIGVycm9yIGZvciBzb21lIHRhcmdldHMgaGVyZSAqLworICAgICAgICAodm9pZCkgbWVtX2NudCwgaTsKKyAgICAgICAgdGFyZ2V0X3Jlc291cmNlc19vayA9IFRBUkdFVF9DQU5fVVNFX0hBUkRXQVJFX1dBVENIUE9JTlQoCisgICAgICAgICAgICAgICAgYnB0LT50eXBlLCBpICsgbWVtX2NudCwgb3RoZXJfdHlwZV91c2VkKTsKKyAgICAgICAgLyogd2UgY2FuIGNvbnNpZGVyIG9mIHR5cGUgaXMgYnBfaGFyZHdhcmVfd2F0Y2hwb2ludCwgY29udmVydCB0byAKKwkgICBicF93YXRjaHBvaW50IGluIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uICovCisgICAgICAgIGlmICh0YXJnZXRfcmVzb3VyY2VzX29rIDwgMCkKKwkgIHsKKyAgICAgICAgICAgICBwcmludGZfZmlsdGVyZWQoIlwKK0Nhbm5vdCBlbmFibGUgd2F0Y2hwb2ludCAlZCBiZWNhdXNlIHRhcmdldCB3YXRjaCByZXNvdXJjZXNcblwKK2hhdmUgYmVlbiBhbGxvY2F0ZWQgZm9yIG90aGVyIHdhdGNocG9pbnRzLlxuIiwgYnB0LT5udW1iZXIpOworCSAgICAgYnB0LT5lbmFibGUgPSBkaXNhYmxlZDsKKwkgICAgIHZhbHVlX2ZyZWVfdG9fbWFyayAobWFyayk7CisJICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoc2F2ZV9zZWxlY3RlZF9mcmFtZV9sZXZlbCA+PSAwKQorCXNlbGVjdF9hbmRfcHJpbnRfZnJhbWUgKHNhdmVfc2VsZWN0ZWRfZnJhbWUsIHNhdmVfc2VsZWN0ZWRfZnJhbWVfbGV2ZWwpOworICAgICAgdmFsdWVfZnJlZV90b19tYXJrIChtYXJrKTsKKyAgICB9CisgIGlmIChtb2RpZnlfYnJlYWtwb2ludF9ob29rKQorICAgIG1vZGlmeV9icmVha3BvaW50X2hvb2sgKGJwdCk7Cit9CisKK3ZvaWQKK2VuYWJsZV9icmVha3BvaW50IChicHQpCisgICAgIHN0cnVjdCBicmVha3BvaW50ICpicHQ7Cit7CisgIGRvX2VuYWJsZV9icmVha3BvaW50IChicHQsIGJwdC0+ZGlzcG9zaXRpb24pOworfQorCisvKiBUaGUgZW5hYmxlIGNvbW1hbmQgZW5hYmxlcyB0aGUgc3BlY2lmaWVkIGJyZWFrcG9pbnRzIChvciBhbGwgZGVmaW5lZAorICAgYnJlYWtwb2ludHMpIHNvIHRoZXkgb25jZSBhZ2FpbiBiZWNvbWUgKG9yIGNvbnRpbnVlIHRvIGJlKSBlZmZlY3RpdmUKKyAgIGluIHN0b3BwaW5nIHRoZSBpbmZlcmlvci4gKi8KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitlbmFibGVfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGJyZWFrcG9pbnQgKmJwdDsKKyAgaWYgKGFyZ3MgPT0gMCkKKyAgICBBTExfQlJFQUtQT0lOVFMgKGJwdCkKKyAgICAgIHN3aXRjaCAoYnB0LT50eXBlKQorCXsKKyAgICAgICAgY2FzZSBicF9ub25lOgorICAgICAgICAgIHdhcm5pbmcgKCJhdHRlbXB0ZWQgdG8gZW5hYmxlIGFwcGFyZW50bHkgZGVsZXRlZCBicmVha3BvaW50ICMlZD9cbiIsIGJwdC0+bnVtYmVyKTsKKyAgICAgICAgICBjb250aW51ZTsKKwljYXNlIGJwX2JyZWFrcG9pbnQ6CisgICAgICAgIGNhc2UgYnBfY2F0Y2hfbG9hZDoKKyAgICAgICAgY2FzZSBicF9jYXRjaF91bmxvYWQ6CisgICAgICAgIGNhc2UgYnBfY2F0Y2hfZm9yazoKKyAgICAgICAgY2FzZSBicF9jYXRjaF92Zm9yazoKKyAgICAgICAgY2FzZSBicF9jYXRjaF9leGVjOgorCWNhc2UgYnBfY2F0Y2hfY2F0Y2g6CisJY2FzZSBicF9jYXRjaF90aHJvdzoKKwljYXNlIGJwX2hhcmR3YXJlX2JyZWFrcG9pbnQ6CisJY2FzZSBicF93YXRjaHBvaW50OgorCWNhc2UgYnBfaGFyZHdhcmVfd2F0Y2hwb2ludDoKKwljYXNlIGJwX3JlYWRfd2F0Y2hwb2ludDoKKwljYXNlIGJwX2FjY2Vzc193YXRjaHBvaW50OgorCSAgZW5hYmxlX2JyZWFrcG9pbnQgKGJwdCk7CisJZGVmYXVsdDoKKwkgIGNvbnRpbnVlOworCX0KKyAgZWxzZQorICAgIG1hcF9icmVha3BvaW50X251bWJlcnMgKGFyZ3MsIGVuYWJsZV9icmVha3BvaW50KTsKK30KKworc3RhdGljIHZvaWQKK2VuYWJsZV9vbmNlX2JyZWFrcG9pbnQgKGJwdCkKKyAgICAgc3RydWN0IGJyZWFrcG9pbnQgKmJwdDsKK3sKKyAgZG9fZW5hYmxlX2JyZWFrcG9pbnQgKGJwdCwgZGlzYWJsZSk7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorZW5hYmxlX29uY2VfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgbWFwX2JyZWFrcG9pbnRfbnVtYmVycyAoYXJncywgZW5hYmxlX29uY2VfYnJlYWtwb2ludCk7Cit9CisKK3N0YXRpYyB2b2lkCitlbmFibGVfZGVsZXRlX2JyZWFrcG9pbnQgKGJwdCkKKyAgICAgc3RydWN0IGJyZWFrcG9pbnQgKmJwdDsKK3sKKyAgZG9fZW5hYmxlX2JyZWFrcG9pbnQgKGJwdCwgZGVsKTsKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitlbmFibGVfZGVsZXRlX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIG1hcF9icmVha3BvaW50X251bWJlcnMgKGFyZ3MsIGVuYWJsZV9kZWxldGVfYnJlYWtwb2ludCk7Cit9CisMCisvKiBVc2UgZGVmYXVsdF9icmVha3BvaW50XydzLCBvciBub3RoaW5nIGlmIHRoZXkgYXJlbid0IHZhbGlkLiAgKi8KKworc3RydWN0IHN5bXRhYnNfYW5kX2xpbmVzCitkZWNvZGVfbGluZV9zcGVjXzEgKHN0cmluZywgZnVuZmlyc3RsaW5lKQorICAgICBjaGFyICpzdHJpbmc7CisgICAgIGludCBmdW5maXJzdGxpbmU7Cit7CisgIHN0cnVjdCBzeW10YWJzX2FuZF9saW5lcyBzYWxzOworICBpZiAoc3RyaW5nID09IDApCisgICAgZXJyb3IgKCJFbXB0eSBsaW5lIHNwZWNpZmljYXRpb24uIik7CisgIGlmIChkZWZhdWx0X2JyZWFrcG9pbnRfdmFsaWQpCisgICAgc2FscyA9IGRlY29kZV9saW5lXzEgKCZzdHJpbmcsIGZ1bmZpcnN0bGluZSwKKwkJCSAgZGVmYXVsdF9icmVha3BvaW50X3N5bXRhYiwgZGVmYXVsdF9icmVha3BvaW50X2xpbmUsCisJCQkgIChjaGFyICoqKilOVUxMKTsKKyAgZWxzZQorICAgIHNhbHMgPSBkZWNvZGVfbGluZV8xICgmc3RyaW5nLCBmdW5maXJzdGxpbmUsCisJCQkgIChzdHJ1Y3Qgc3ltdGFiICopTlVMTCwgMCwgKGNoYXIgKioqKU5VTEwpOworICBpZiAoKnN0cmluZykKKyAgICBlcnJvciAoIkp1bmsgYXQgZW5kIG9mIGxpbmUgc3BlY2lmaWNhdGlvbjogJXMiLCBzdHJpbmcpOworICByZXR1cm4gc2FsczsKK30KKwwKK3ZvaWQKK19pbml0aWFsaXplX2JyZWFrcG9pbnQgKCkKK3sKKyAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7CisKKyAgYnJlYWtwb2ludF9jaGFpbiA9IDA7CisgIC8qIERvbid0IGJvdGhlciB0byBjYWxsIHNldF9icmVha3BvaW50X2NvdW50LiAgJGJwbnVtIGlzbid0IHVzZWZ1bAorICAgICBiZWZvcmUgYSBicmVha3BvaW50IGlzIHNldC4gICovCisgIGJyZWFrcG9pbnRfY291bnQgPSAwOworCisgIGFkZF9jb20gKCJpZ25vcmUiLCBjbGFzc19icmVha3BvaW50LCBpZ25vcmVfY29tbWFuZCwKKwkgICAiU2V0IGlnbm9yZS1jb3VudCBvZiBicmVha3BvaW50IG51bWJlciBOIHRvIENPVU5ULlxuXAorVXNhZ2UgaXMgYGlnbm9yZSBOIENPVU5UJy4iKTsKKyAgaWYgKHhkYl9jb21tYW5kcykKKyAgICBhZGRfY29tX2FsaWFzKCJiYyIsICJpZ25vcmUiLCBjbGFzc19icmVha3BvaW50LCAxKTsKKworICBhZGRfY29tICgiY29tbWFuZHMiLCBjbGFzc19icmVha3BvaW50LCBjb21tYW5kc19jb21tYW5kLAorCSAgICJTZXQgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQgd2hlbiBhIGJyZWFrcG9pbnQgaXMgaGl0LlxuXAorR2l2ZSBicmVha3BvaW50IG51bWJlciBhcyBhcmd1bWVudCBhZnRlciBcImNvbW1hbmRzXCIuXG5cCitXaXRoIG5vIGFyZ3VtZW50LCB0aGUgdGFyZ2V0ZWQgYnJlYWtwb2ludCBpcyB0aGUgbGFzdCBvbmUgc2V0LlxuXAorVGhlIGNvbW1hbmRzIHRoZW1zZWx2ZXMgZm9sbG93IHN0YXJ0aW5nIG9uIHRoZSBuZXh0IGxpbmUuXG5cCitUeXBlIGEgbGluZSBjb250YWluaW5nIFwiZW5kXCIgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiB0aGVtLlxuXAorR2l2ZSBcInNpbGVudFwiIGFzIHRoZSBmaXJzdCBsaW5lIHRvIG1ha2UgdGhlIGJyZWFrcG9pbnQgc2lsZW50O1xuXAordGhlbiBubyBvdXRwdXQgaXMgcHJpbnRlZCB3aGVuIGl0IGlzIGhpdCwgZXhjZXB0IHdoYXQgdGhlIGNvbW1hbmRzIHByaW50LiIpOworCisgIGFkZF9jb20gKCJjb25kaXRpb24iLCBjbGFzc19icmVha3BvaW50LCBjb25kaXRpb25fY29tbWFuZCwKKwkgICAiU3BlY2lmeSBicmVha3BvaW50IG51bWJlciBOIHRvIGJyZWFrIG9ubHkgaWYgQ09ORCBpcyB0cnVlLlxuXAorVXNhZ2UgaXMgYGNvbmRpdGlvbiBOIENPTkQnLCB3aGVyZSBOIGlzIGFuIGludGVnZXIgYW5kIENPTkQgaXMgYW5cblwKK2V4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkIHdoZW5ldmVyIGJyZWFrcG9pbnQgTiBpcyByZWFjaGVkLiAgIik7CisKKyAgYWRkX2NvbSAoInRicmVhayIsIGNsYXNzX2JyZWFrcG9pbnQsIHRicmVha19jb21tYW5kLAorCSAgICJTZXQgYSB0ZW1wb3JhcnkgYnJlYWtwb2ludC4gIEFyZ3MgbGlrZSBcImJyZWFrXCIgY29tbWFuZC5cblwKK0xpa2UgXCJicmVha1wiIGV4Y2VwdCB0aGUgYnJlYWtwb2ludCBpcyBvbmx5IHRlbXBvcmFyeSxcblwKK3NvIGl0IHdpbGwgYmUgZGVsZXRlZCB3aGVuIGhpdC4gIEVxdWl2YWxlbnQgdG8gXCJicmVha1wiIGZvbGxvd2VkXG5cCitieSB1c2luZyBcImVuYWJsZSBkZWxldGVcIiBvbiB0aGUgYnJlYWtwb2ludCBudW1iZXIuIik7CisgIGFkZF9jb20oInR4YnJlYWsiLCBjbGFzc19icmVha3BvaW50LCB0YnJlYWtfYXRfZmluaXNoX2NvbW1hbmQsCisgICAgICAgICAgIlNldCB0ZW1wb3JhcnkgYnJlYWtwb2ludCBhdCBwcm9jZWR1cmUgZXhpdC4gIEVpdGhlciB0aGVyZSBzaG91bGRcblwKK2JlIG5vIGFyZ3VtZW50IG9yIHRoZSBhcmd1bWVudCBtdXN0IGJlIGEgZGVwdGguXG4iKTsKKworICBhZGRfY29tICgiaGJyZWFrIiwgY2xhc3NfYnJlYWtwb2ludCwgaGJyZWFrX2NvbW1hbmQsCisJICAgIlNldCBhIGhhcmR3YXJlIGFzc2lzdGVkICBicmVha3BvaW50LiBBcmdzIGxpa2UgXCJicmVha1wiIGNvbW1hbmQuXG5cCitMaWtlIFwiYnJlYWtcIiBleGNlcHQgdGhlIGJyZWFrcG9pbnQgcmVxdWlyZXMgaGFyZHdhcmUgc3VwcG9ydCxcblwKK3NvbWUgdGFyZ2V0IGhhcmR3YXJlIG1heSBub3QgaGF2ZSB0aGlzIHN1cHBvcnQuIik7CisKKyAgYWRkX2NvbSAoInRoYnJlYWsiLCBjbGFzc19icmVha3BvaW50LCB0aGJyZWFrX2NvbW1hbmQsCisJICAgIlNldCBhIHRlbXBvcmFyeSBoYXJkd2FyZSBhc3Npc3RlZCBicmVha3BvaW50LiBBcmdzIGxpa2UgXCJicmVha1wiIGNvbW1hbmQuXG5cCitMaWtlIFwiaGJyZWFrXCIgZXhjZXB0IHRoZSBicmVha3BvaW50IGlzIG9ubHkgdGVtcG9yYXJ5LFxuXAorc28gaXQgd2lsbCBiZSBkZWxldGVkIHdoZW4gaGl0LiIpOworCisgIGFkZF9wcmVmaXhfY21kICgiZW5hYmxlIiwgY2xhc3NfYnJlYWtwb2ludCwgZW5hYmxlX2NvbW1hbmQsCisJCSAgIkVuYWJsZSBzb21lIGJyZWFrcG9pbnRzLlxuXAorR2l2ZSBicmVha3BvaW50IG51bWJlcnMgKHNlcGFyYXRlZCBieSBzcGFjZXMpIGFzIGFyZ3VtZW50cy5cblwKK1dpdGggbm8gc3ViY29tbWFuZCwgYnJlYWtwb2ludHMgYXJlIGVuYWJsZWQgdW50aWwgeW91IGNvbW1hbmQgb3RoZXJ3aXNlLlxuXAorVGhpcyBpcyB1c2VkIHRvIGNhbmNlbCB0aGUgZWZmZWN0IG9mIHRoZSBcImRpc2FibGVcIiBjb21tYW5kLlxuXAorV2l0aCBhIHN1YmNvbW1hbmQgeW91IGNhbiBlbmFibGUgdGVtcG9yYXJpbHkuIiwKKwkJICAmZW5hYmxlbGlzdCwgImVuYWJsZSAiLCAxLCAmY21kbGlzdCk7CisgIGlmICh4ZGJfY29tbWFuZHMpCisgICAgICBhZGRfY29tKCJhYiIsIGNsYXNzX2JyZWFrcG9pbnQsIGVuYWJsZV9jb21tYW5kLAorCQkgICAgICAiRW5hYmxlIHNvbWUgYnJlYWtwb2ludHMuXG5cCitHaXZlIGJyZWFrcG9pbnQgbnVtYmVycyAoc2VwYXJhdGVkIGJ5IHNwYWNlcykgYXMgYXJndW1lbnRzLlxuXAorV2l0aCBubyBzdWJjb21tYW5kLCBicmVha3BvaW50cyBhcmUgZW5hYmxlZCB1bnRpbCB5b3UgY29tbWFuZCBvdGhlcndpc2UuXG5cCitUaGlzIGlzIHVzZWQgdG8gY2FuY2VsIHRoZSBlZmZlY3Qgb2YgdGhlIFwiZGlzYWJsZVwiIGNvbW1hbmQuXG5cCitXaXRoIGEgc3ViY29tbWFuZCB5b3UgY2FuIGVuYWJsZSB0ZW1wb3JhcmlseS4iKTsKKworICBhZGRfY29tX2FsaWFzICgiZW4iLCAiZW5hYmxlIiwgY2xhc3NfYnJlYWtwb2ludCwgMSk7CisKKyAgYWRkX2FiYnJldl9wcmVmaXhfY21kICgiYnJlYWtwb2ludHMiLCBjbGFzc19icmVha3BvaW50LCBlbmFibGVfY29tbWFuZCwKKwkJICAiRW5hYmxlIHNvbWUgYnJlYWtwb2ludHMuXG5cCitHaXZlIGJyZWFrcG9pbnQgbnVtYmVycyAoc2VwYXJhdGVkIGJ5IHNwYWNlcykgYXMgYXJndW1lbnRzLlxuXAorVGhpcyBpcyB1c2VkIHRvIGNhbmNlbCB0aGUgZWZmZWN0IG9mIHRoZSBcImRpc2FibGVcIiBjb21tYW5kLlxuXAorTWF5IGJlIGFiYnJldmlhdGVkIHRvIHNpbXBseSBcImVuYWJsZVwiLlxuIiwKKwkJICAmZW5hYmxlYnJlYWtsaXN0LCAiZW5hYmxlIGJyZWFrcG9pbnRzICIsIDEsICZlbmFibGVsaXN0KTsKKworICBhZGRfY21kICgib25jZSIsIG5vX2NsYXNzLCBlbmFibGVfb25jZV9jb21tYW5kLAorCSAgICJFbmFibGUgYnJlYWtwb2ludHMgZm9yIG9uZSBoaXQuICBHaXZlIGJyZWFrcG9pbnQgbnVtYmVycy5cblwKK0lmIGEgYnJlYWtwb2ludCBpcyBoaXQgd2hpbGUgZW5hYmxlZCBpbiB0aGlzIGZhc2hpb24sIGl0IGJlY29tZXMgZGlzYWJsZWQuIiwKKwkgICAmZW5hYmxlYnJlYWtsaXN0KTsKKworICBhZGRfY21kICgiZGVsZXRlIiwgbm9fY2xhc3MsIGVuYWJsZV9kZWxldGVfY29tbWFuZCwKKwkgICAiRW5hYmxlIGJyZWFrcG9pbnRzIGFuZCBkZWxldGUgd2hlbiBoaXQuICBHaXZlIGJyZWFrcG9pbnQgbnVtYmVycy5cblwKK0lmIGEgYnJlYWtwb2ludCBpcyBoaXQgd2hpbGUgZW5hYmxlZCBpbiB0aGlzIGZhc2hpb24sIGl0IGlzIGRlbGV0ZWQuIiwKKwkgICAmZW5hYmxlYnJlYWtsaXN0KTsKKworICBhZGRfY21kICgiZGVsZXRlIiwgbm9fY2xhc3MsIGVuYWJsZV9kZWxldGVfY29tbWFuZCwKKwkgICAiRW5hYmxlIGJyZWFrcG9pbnRzIGFuZCBkZWxldGUgd2hlbiBoaXQuICBHaXZlIGJyZWFrcG9pbnQgbnVtYmVycy5cblwKK0lmIGEgYnJlYWtwb2ludCBpcyBoaXQgd2hpbGUgZW5hYmxlZCBpbiB0aGlzIGZhc2hpb24sIGl0IGlzIGRlbGV0ZWQuIiwKKwkgICAmZW5hYmxlbGlzdCk7CisKKyAgYWRkX2NtZCAoIm9uY2UiLCBub19jbGFzcywgZW5hYmxlX29uY2VfY29tbWFuZCwKKwkgICAiRW5hYmxlIGJyZWFrcG9pbnRzIGZvciBvbmUgaGl0LiAgR2l2ZSBicmVha3BvaW50IG51bWJlcnMuXG5cCitJZiBhIGJyZWFrcG9pbnQgaXMgaGl0IHdoaWxlIGVuYWJsZWQgaW4gdGhpcyBmYXNoaW9uLCBpdCBiZWNvbWVzIGRpc2FibGVkLiIsCisJICAgJmVuYWJsZWxpc3QpOworCisgIGFkZF9wcmVmaXhfY21kICgiZGlzYWJsZSIsIGNsYXNzX2JyZWFrcG9pbnQsIGRpc2FibGVfY29tbWFuZCwKKwkgICAiRGlzYWJsZSBzb21lIGJyZWFrcG9pbnRzLlxuXAorQXJndW1lbnRzIGFyZSBicmVha3BvaW50IG51bWJlcnMgd2l0aCBzcGFjZXMgaW4gYmV0d2Vlbi5cblwKK1RvIGRpc2FibGUgYWxsIGJyZWFrcG9pbnRzLCBnaXZlIG5vIGFyZ3VtZW50LlxuXAorQSBkaXNhYmxlZCBicmVha3BvaW50IGlzIG5vdCBmb3Jnb3R0ZW4sIGJ1dCBoYXMgbm8gZWZmZWN0IHVudGlsIHJlZW5hYmxlZC4iLAorCQkgICZkaXNhYmxlbGlzdCwgImRpc2FibGUgIiwgMSwgJmNtZGxpc3QpOworICBhZGRfY29tX2FsaWFzICgiZGlzIiwgImRpc2FibGUiLCBjbGFzc19icmVha3BvaW50LCAxKTsKKyAgYWRkX2NvbV9hbGlhcyAoImRpc2EiLCAiZGlzYWJsZSIsIGNsYXNzX2JyZWFrcG9pbnQsIDEpOworICBpZiAoeGRiX2NvbW1hbmRzKQorICAgIGFkZF9jb20oInNiIiwgY2xhc3NfYnJlYWtwb2ludCwgZGlzYWJsZV9jb21tYW5kLAorCSAgICAgICAgIkRpc2FibGUgc29tZSBicmVha3BvaW50cy5cblwKK0FyZ3VtZW50cyBhcmUgYnJlYWtwb2ludCBudW1iZXJzIHdpdGggc3BhY2VzIGluIGJldHdlZW4uXG5cCitUbyBkaXNhYmxlIGFsbCBicmVha3BvaW50cywgZ2l2ZSBubyBhcmd1bWVudC5cblwKK0EgZGlzYWJsZWQgYnJlYWtwb2ludCBpcyBub3QgZm9yZ290dGVuLCBidXQgaGFzIG5vIGVmZmVjdCB1bnRpbCByZWVuYWJsZWQuIik7CisKKyAgYWRkX2NtZCAoImJyZWFrcG9pbnRzIiwgY2xhc3NfYWxpYXMsIGRpc2FibGVfY29tbWFuZCwKKwkgICAiRGlzYWJsZSBzb21lIGJyZWFrcG9pbnRzLlxuXAorQXJndW1lbnRzIGFyZSBicmVha3BvaW50IG51bWJlcnMgd2l0aCBzcGFjZXMgaW4gYmV0d2Vlbi5cblwKK1RvIGRpc2FibGUgYWxsIGJyZWFrcG9pbnRzLCBnaXZlIG5vIGFyZ3VtZW50LlxuXAorQSBkaXNhYmxlZCBicmVha3BvaW50IGlzIG5vdCBmb3Jnb3R0ZW4sIGJ1dCBoYXMgbm8gZWZmZWN0IHVudGlsIHJlZW5hYmxlZC5cblwKK1RoaXMgY29tbWFuZCBtYXkgYmUgYWJicmV2aWF0ZWQgXCJkaXNhYmxlXCIuIiwKKwkgICAmZGlzYWJsZWxpc3QpOworCisgIGFkZF9wcmVmaXhfY21kICgiZGVsZXRlIiwgY2xhc3NfYnJlYWtwb2ludCwgZGVsZXRlX2NvbW1hbmQsCisJICAgIkRlbGV0ZSBzb21lIGJyZWFrcG9pbnRzIG9yIGF1dG8tZGlzcGxheSBleHByZXNzaW9ucy5cblwKK0FyZ3VtZW50cyBhcmUgYnJlYWtwb2ludCBudW1iZXJzIHdpdGggc3BhY2VzIGluIGJldHdlZW4uXG5cCitUbyBkZWxldGUgYWxsIGJyZWFrcG9pbnRzLCBnaXZlIG5vIGFyZ3VtZW50LlxuXAorXG5cCitBbHNvIGEgcHJlZml4IGNvbW1hbmQgZm9yIGRlbGV0aW9uIG9mIG90aGVyIEdEQiBvYmplY3RzLlxuXAorVGhlIFwidW5zZXRcIiBjb21tYW5kIGlzIGFsc28gYW4gYWxpYXMgZm9yIFwiZGVsZXRlXCIuIiwKKwkJICAmZGVsZXRlbGlzdCwgImRlbGV0ZSAiLCAxLCAmY21kbGlzdCk7CisgIGFkZF9jb21fYWxpYXMgKCJkIiwgImRlbGV0ZSIsIGNsYXNzX2JyZWFrcG9pbnQsIDEpOworICBpZiAoeGRiX2NvbW1hbmRzKQorICAgIGFkZF9jb20gKCJkYiIsIGNsYXNzX2JyZWFrcG9pbnQsIGRlbGV0ZV9jb21tYW5kLAorICAgIAkgICAiRGVsZXRlIHNvbWUgYnJlYWtwb2ludHMuXG5cCitBcmd1bWVudHMgYXJlIGJyZWFrcG9pbnQgbnVtYmVycyB3aXRoIHNwYWNlcyBpbiBiZXR3ZWVuLlxuXAorVG8gZGVsZXRlIGFsbCBicmVha3BvaW50cywgZ2l2ZSBubyBhcmd1bWVudC5cbiIpOworCisgIGFkZF9jbWQgKCJicmVha3BvaW50cyIsIGNsYXNzX2FsaWFzLCBkZWxldGVfY29tbWFuZCwKKwkgICAiRGVsZXRlIHNvbWUgYnJlYWtwb2ludHMgb3IgYXV0by1kaXNwbGF5IGV4cHJlc3Npb25zLlxuXAorQXJndW1lbnRzIGFyZSBicmVha3BvaW50IG51bWJlcnMgd2l0aCBzcGFjZXMgaW4gYmV0d2Vlbi5cblwKK1RvIGRlbGV0ZSBhbGwgYnJlYWtwb2ludHMsIGdpdmUgbm8gYXJndW1lbnQuXG5cCitUaGlzIGNvbW1hbmQgbWF5IGJlIGFiYnJldmlhdGVkIFwiZGVsZXRlXCIuIiwKKwkgICAmZGVsZXRlbGlzdCk7CisKKyAgYWRkX2NvbSAoImNsZWFyIiwgY2xhc3NfYnJlYWtwb2ludCwgY2xlYXJfY29tbWFuZCwKKwkgICBjb25jYXQgKCJDbGVhciBicmVha3BvaW50IGF0IHNwZWNpZmllZCBsaW5lIG9yIGZ1bmN0aW9uLlxuXAorQXJndW1lbnQgbWF5IGJlIGxpbmUgbnVtYmVyLCBmdW5jdGlvbiBuYW1lLCBvciBcIipcIiBhbmQgYW4gYWRkcmVzcy5cblwKK0lmIGxpbmUgbnVtYmVyIGlzIHNwZWNpZmllZCwgYWxsIGJyZWFrcG9pbnRzIGluIHRoYXQgbGluZSBhcmUgY2xlYXJlZC5cblwKK0lmIGZ1bmN0aW9uIGlzIHNwZWNpZmllZCwgYnJlYWtwb2ludHMgYXQgYmVnaW5uaW5nIG9mIGZ1bmN0aW9uIGFyZSBjbGVhcmVkLlxuXAorSWYgYW4gYWRkcmVzcyBpcyBzcGVjaWZpZWQsIGJyZWFrcG9pbnRzIGF0IHRoYXQgYWRkcmVzcyBhcmUgY2xlYXJlZC5cblxuIiwKKyJXaXRoIG5vIGFyZ3VtZW50LCBjbGVhcnMgYWxsIGJyZWFrcG9pbnRzIGluIHRoZSBsaW5lIHRoYXQgdGhlIHNlbGVjdGVkIGZyYW1lXG5cCitpcyBleGVjdXRpbmcgaW4uXG5cCitcblwKK1NlZSBhbHNvIHRoZSBcImRlbGV0ZVwiIGNvbW1hbmQgd2hpY2ggY2xlYXJzIGJyZWFrcG9pbnRzIGJ5IG51bWJlci4iLCBOVUxMKSk7CisKKyAgYWRkX2NvbSAoImJyZWFrIiwgY2xhc3NfYnJlYWtwb2ludCwgYnJlYWtfY29tbWFuZCwKKwkgICBjb25jYXQgKCJTZXQgYnJlYWtwb2ludCBhdCBzcGVjaWZpZWQgbGluZSBvciBmdW5jdGlvbi5cblwKK0FyZ3VtZW50IG1heSBiZSBsaW5lIG51bWJlciwgZnVuY3Rpb24gbmFtZSwgb3IgXCIqXCIgYW5kIGFuIGFkZHJlc3MuXG5cCitJZiBsaW5lIG51bWJlciBpcyBzcGVjaWZpZWQsIGJyZWFrIGF0IHN0YXJ0IG9mIGNvZGUgZm9yIHRoYXQgbGluZS5cblwKK0lmIGZ1bmN0aW9uIGlzIHNwZWNpZmllZCwgYnJlYWsgYXQgc3RhcnQgb2YgY29kZSBmb3IgdGhhdCBmdW5jdGlvbi5cblwKK0lmIGFuIGFkZHJlc3MgaXMgc3BlY2lmaWVkLCBicmVhayBhdCB0aGF0IGV4YWN0IGFkZHJlc3MuXG4iLAorIldpdGggbm8gYXJnLCB1c2VzIGN1cnJlbnQgZXhlY3V0aW9uIGFkZHJlc3Mgb2Ygc2VsZWN0ZWQgc3RhY2sgZnJhbWUuXG5cCitUaGlzIGlzIHVzZWZ1bCBmb3IgYnJlYWtpbmcgb24gcmV0dXJuIHRvIGEgc3RhY2sgZnJhbWUuXG5cCitcblwKK011bHRpcGxlIGJyZWFrcG9pbnRzIGF0IG9uZSBwbGFjZSBhcmUgcGVybWl0dGVkLCBhbmQgdXNlZnVsIGlmIGNvbmRpdGlvbmFsLlxuXAorXG5cCitEbyBcImhlbHAgYnJlYWtwb2ludHNcIiBmb3IgaW5mbyBvbiBvdGhlciBjb21tYW5kcyBkZWFsaW5nIHdpdGggYnJlYWtwb2ludHMuIiwgTlVMTCkpOworICBhZGRfY29tX2FsaWFzICgiYiIsICJicmVhayIsIGNsYXNzX3J1biwgMSk7CisgIGFkZF9jb21fYWxpYXMgKCJiciIsICJicmVhayIsIGNsYXNzX3J1biwgMSk7CisgIGFkZF9jb21fYWxpYXMgKCJicmUiLCAiYnJlYWsiLCBjbGFzc19ydW4sIDEpOworICBhZGRfY29tX2FsaWFzICgiYnJlYSIsICJicmVhayIsIGNsYXNzX3J1biwgMSk7CisKKyAgYWRkX2NvbSgieGJyZWFrIiwgY2xhc3NfYnJlYWtwb2ludCwgYnJlYWtfYXRfZmluaXNoX2NvbW1hbmQsCisgICAgICAgICAgY29uY2F0KCJTZXQgYnJlYWtwb2ludCBhdCBwcm9jZWR1cmUgZXhpdC4gXG5cCitBcmd1bWVudCBtYXkgYmUgZnVuY3Rpb24gbmFtZSwgb3IgXCIqXCIgYW5kIGFuIGFkZHJlc3MuXG5cCitJZiBmdW5jdGlvbiBpcyBzcGVjaWZpZWQsIGJyZWFrIGF0IGVuZCBvZiBjb2RlIGZvciB0aGF0IGZ1bmN0aW9uLlxuXAorSWYgYW4gYWRkcmVzcyBpcyBzcGVjaWZpZWQsIGJyZWFrIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgY29udGFpbnMgXG5cCit0aGF0IGV4YWN0IGFkZHJlc3MuXG4iLAorIldpdGggbm8gYXJnLCB1c2VzIGN1cnJlbnQgZXhlY3V0aW9uIGFkZHJlc3Mgb2Ygc2VsZWN0ZWQgc3RhY2sgZnJhbWUuXG5cCitUaGlzIGlzIHVzZWZ1bCBmb3IgYnJlYWtpbmcgb24gcmV0dXJuIHRvIGEgc3RhY2sgZnJhbWUuXG5cCitcblwKK011bHRpcGxlIGJyZWFrcG9pbnRzIGF0IG9uZSBwbGFjZSBhcmUgcGVybWl0dGVkLCBhbmQgdXNlZnVsIGlmIGNvbmRpdGlvbmFsLlxuXAorXG5cCitEbyBcImhlbHAgYnJlYWtwb2ludHNcIiBmb3IgaW5mbyBvbiBvdGhlciBjb21tYW5kcyBkZWFsaW5nIHdpdGggYnJlYWtwb2ludHMuIiwgTlVMTCkpOworICBhZGRfY29tX2FsaWFzICgieGIiLCAieGJyZWFrIiwgY2xhc3NfYnJlYWtwb2ludCwgMSk7CisgIGFkZF9jb21fYWxpYXMgKCJ4YnIiLCAieGJyZWFrIiwgY2xhc3NfYnJlYWtwb2ludCwgMSk7CisgIGFkZF9jb21fYWxpYXMgKCJ4YnJlIiwgInhicmVhayIsIGNsYXNzX2JyZWFrcG9pbnQsIDEpOworICBhZGRfY29tX2FsaWFzICgieGJyZWEiLCAieGJyZWFrIiwgY2xhc3NfYnJlYWtwb2ludCwgMSk7CisKKyAgaWYgKHhkYl9jb21tYW5kcykKKyAgICB7CisgICAgICBhZGRfY29tX2FsaWFzICgiYmEiLCAiYnJlYWsiLCBjbGFzc19icmVha3BvaW50LCAxKTsKKyAgICAgIGFkZF9jb21fYWxpYXMgKCJidSIsICJ1YnJlYWsiLCBjbGFzc19icmVha3BvaW50LCAxKTsKKyAgICAgIGFkZF9jb20gKCJieCIsIGNsYXNzX2JyZWFrcG9pbnQsIGJyZWFrX2F0X2ZpbmlzaF9hdF9kZXB0aF9jb21tYW5kLAorICAgICAgICAgICJTZXQgYnJlYWtwb2ludCBhdCBwcm9jZWR1cmUgZXhpdC4gIEVpdGhlciB0aGVyZSBzaG91bGRcblwKK2JlIG5vIGFyZ3VtZW50IG9yIHRoZSBhcmd1bWVudCBtdXN0IGJlIGEgZGVwdGguXG4iKTsKKyAgICB9CisKKyAgaWYgKGRieF9jb21tYW5kcykKKyAgICB7CisgICAgICBhZGRfYWJicmV2X3ByZWZpeF9jbWQoInN0b3AiLCBjbGFzc19icmVha3BvaW50LCBzdG9wX2NvbW1hbmQsIAorICAgICAgICAgICAiQnJlYWsgaW4gZnVuY3Rpb24vYWRkcmVzcyBvciBicmVhayBhdCBhIGxpbmUgaW4gdGhlIGN1cnJlbnQgZmlsZS4iLAorICAgICAgICAgICAmc3RvcGxpc3QsICJzdG9wICIsIDEsICZjbWRsaXN0KTsKKyAgICAgIGFkZF9jbWQoImluIiwgY2xhc3NfYnJlYWtwb2ludCwgc3RvcGluX2NvbW1hbmQsCisgICAgICAgICAgICAgICJCcmVhayBpbiBmdW5jdGlvbiBvciBhZGRyZXNzLlxuIiwgJnN0b3BsaXN0KTsKKyAgICAgIGFkZF9jbWQoImF0IiwgY2xhc3NfYnJlYWtwb2ludCwgc3RvcGF0X2NvbW1hbmQsCisgICAgICAgICAgICAgICJCcmVhayBhdCBhIGxpbmUgaW4gdGhlIGN1cnJlbnQgZmlsZS5cbiIsICZzdG9wbGlzdCk7CisgICAgICBhZGRfY29tKCJzdGF0dXMiLCBjbGFzc19pbmZvLCBicmVha3BvaW50c19pbmZvLCAKKwkgICAgY29uY2F0ICgiU3RhdHVzIG9mIHVzZXItc2V0dGFibGUgYnJlYWtwb2ludHMsIG9yIGJyZWFrcG9pbnQgbnVtYmVyIE5VTUJFUi5cblwKK1RoZSBcIlR5cGVcIiBjb2x1bW4gaW5kaWNhdGVzIG9uZSBvZjpcblwKK1x0YnJlYWtwb2ludCAgICAgLSBub3JtYWwgYnJlYWtwb2ludFxuXAorXHR3YXRjaHBvaW50ICAgICAtIHdhdGNocG9pbnRcblwKK1RoZSBcIkRpc3BcIiBjb2x1bW4gY29udGFpbnMgb25lIG9mIFwia2VlcFwiLCBcImRlbFwiLCBvciBcImRpc1wiIHRvIGluZGljYXRlXG5cCit0aGUgZGlzcG9zaXRpb24gb2YgdGhlIGJyZWFrcG9pbnQgYWZ0ZXIgaXQgZ2V0cyBoaXQuICBcImRpc1wiIG1lYW5zIHRoYXQgdGhlXG5cCiticmVha3BvaW50IHdpbGwgYmUgZGlzYWJsZWQuICBUaGUgXCJBZGRyZXNzXCIgYW5kIFwiV2hhdFwiIGNvbHVtbnMgaW5kaWNhdGUgdGhlXG5cCithZGRyZXNzIGFuZCBmaWxlL2xpbmUgbnVtYmVyIHJlc3BlY3RpdmVseS5cblxuIiwKKyJDb252ZW5pZW5jZSB2YXJpYWJsZSBcIiRfXCIgYW5kIGRlZmF1bHQgZXhhbWluZSBhZGRyZXNzIGZvciBcInhcIlxuXAorYXJlIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCBicmVha3BvaW50IGxpc3RlZC5cblxuXAorQ29udmVuaWVuY2UgdmFyaWFibGUgXCIkYnBudW1cIiBjb250YWlucyB0aGUgbnVtYmVyIG9mIHRoZSBsYXN0XG5cCiticmVha3BvaW50IHNldC4iLCBOVUxMKSk7CisgICAgfQorCisgIGFkZF9pbmZvICgiYnJlYWtwb2ludHMiLCBicmVha3BvaW50c19pbmZvLAorCSAgICBjb25jYXQgKCJTdGF0dXMgb2YgdXNlci1zZXR0YWJsZSBicmVha3BvaW50cywgb3IgYnJlYWtwb2ludCBudW1iZXIgTlVNQkVSLlxuXAorVGhlIFwiVHlwZVwiIGNvbHVtbiBpbmRpY2F0ZXMgb25lIG9mOlxuXAorXHRicmVha3BvaW50ICAgICAtIG5vcm1hbCBicmVha3BvaW50XG5cCitcdHdhdGNocG9pbnQgICAgIC0gd2F0Y2hwb2ludFxuXAorVGhlIFwiRGlzcFwiIGNvbHVtbiBjb250YWlucyBvbmUgb2YgXCJrZWVwXCIsIFwiZGVsXCIsIG9yIFwiZGlzXCIgdG8gaW5kaWNhdGVcblwKK3RoZSBkaXNwb3NpdGlvbiBvZiB0aGUgYnJlYWtwb2ludCBhZnRlciBpdCBnZXRzIGhpdC4gIFwiZGlzXCIgbWVhbnMgdGhhdCB0aGVcblwKK2JyZWFrcG9pbnQgd2lsbCBiZSBkaXNhYmxlZC4gIFRoZSBcIkFkZHJlc3NcIiBhbmQgXCJXaGF0XCIgY29sdW1ucyBpbmRpY2F0ZSB0aGVcblwKK2FkZHJlc3MgYW5kIGZpbGUvbGluZSBudW1iZXIgcmVzcGVjdGl2ZWx5LlxuXG4iLAorIkNvbnZlbmllbmNlIHZhcmlhYmxlIFwiJF9cIiBhbmQgZGVmYXVsdCBleGFtaW5lIGFkZHJlc3MgZm9yIFwieFwiXG5cCithcmUgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBsYXN0IGJyZWFrcG9pbnQgbGlzdGVkLlxuXG5cCitDb252ZW5pZW5jZSB2YXJpYWJsZSBcIiRicG51bVwiIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgdGhlIGxhc3RcblwKK2JyZWFrcG9pbnQgc2V0LiIsIE5VTEwpKTsKKworICBpZiAoeGRiX2NvbW1hbmRzKQorICAgIGFkZF9jb20oImxiIiwgY2xhc3NfYnJlYWtwb2ludCwgYnJlYWtwb2ludHNfaW5mbywKKwkgICAgY29uY2F0ICgiU3RhdHVzIG9mIHVzZXItc2V0dGFibGUgYnJlYWtwb2ludHMsIG9yIGJyZWFrcG9pbnQgbnVtYmVyIE5VTUJFUi5cblwKK1RoZSBcIlR5cGVcIiBjb2x1bW4gaW5kaWNhdGVzIG9uZSBvZjpcblwKK1x0YnJlYWtwb2ludCAgICAgLSBub3JtYWwgYnJlYWtwb2ludFxuXAorXHR3YXRjaHBvaW50ICAgICAtIHdhdGNocG9pbnRcblwKK1RoZSBcIkRpc3BcIiBjb2x1bW4gY29udGFpbnMgb25lIG9mIFwia2VlcFwiLCBcImRlbFwiLCBvciBcImRpc1wiIHRvIGluZGljYXRlXG5cCit0aGUgZGlzcG9zaXRpb24gb2YgdGhlIGJyZWFrcG9pbnQgYWZ0ZXIgaXQgZ2V0cyBoaXQuICBcImRpc1wiIG1lYW5zIHRoYXQgdGhlXG5cCiticmVha3BvaW50IHdpbGwgYmUgZGlzYWJsZWQuICBUaGUgXCJBZGRyZXNzXCIgYW5kIFwiV2hhdFwiIGNvbHVtbnMgaW5kaWNhdGUgdGhlXG5cCithZGRyZXNzIGFuZCBmaWxlL2xpbmUgbnVtYmVyIHJlc3BlY3RpdmVseS5cblxuIiwKKyJDb252ZW5pZW5jZSB2YXJpYWJsZSBcIiRfXCIgYW5kIGRlZmF1bHQgZXhhbWluZSBhZGRyZXNzIGZvciBcInhcIlxuXAorYXJlIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCBicmVha3BvaW50IGxpc3RlZC5cblxuXAorQ29udmVuaWVuY2UgdmFyaWFibGUgXCIkYnBudW1cIiBjb250YWlucyB0aGUgbnVtYmVyIG9mIHRoZSBsYXN0XG5cCiticmVha3BvaW50IHNldC4iLCBOVUxMKSk7CisKKyNpZiBNQUlOVEVOQU5DRV9DTURTCisKKyAgYWRkX2NtZCAoImJyZWFrcG9pbnRzIiwgY2xhc3NfbWFpbnRlbmFuY2UsIG1haW50ZW5hbmNlX2luZm9fYnJlYWtwb2ludHMsCisJICAgIGNvbmNhdCAoIlN0YXR1cyBvZiBhbGwgYnJlYWtwb2ludHMsIG9yIGJyZWFrcG9pbnQgbnVtYmVyIE5VTUJFUi5cblwKK1RoZSBcIlR5cGVcIiBjb2x1bW4gaW5kaWNhdGVzIG9uZSBvZjpcblwKK1x0YnJlYWtwb2ludCAgICAgLSBub3JtYWwgYnJlYWtwb2ludFxuXAorXHR3YXRjaHBvaW50ICAgICAtIHdhdGNocG9pbnRcblwKK1x0bG9uZ2ptcCAgICAgICAgLSBpbnRlcm5hbCBicmVha3BvaW50IHVzZWQgdG8gc3RlcCB0aHJvdWdoIGxvbmdqbXAoKVxuXAorXHRsb25nam1wIHJlc3VtZSAtIGludGVybmFsIGJyZWFrcG9pbnQgYXQgdGhlIHRhcmdldCBvZiBsb25nam1wKClcblwKK1x0dW50aWwgICAgICAgICAgLSBpbnRlcm5hbCBicmVha3BvaW50IHVzZWQgYnkgdGhlIFwidW50aWxcIiBjb21tYW5kXG5cCitcdGZpbmlzaCAgICAgICAgIC0gaW50ZXJuYWwgYnJlYWtwb2ludCB1c2VkIGJ5IHRoZSBcImZpbmlzaFwiIGNvbW1hbmRcbiIsCisiVGhlIFwiRGlzcFwiIGNvbHVtbiBjb250YWlucyBvbmUgb2YgXCJrZWVwXCIsIFwiZGVsXCIsIG9yIFwiZGlzXCIgdG8gaW5kaWNhdGVcblwKK3RoZSBkaXNwb3NpdGlvbiBvZiB0aGUgYnJlYWtwb2ludCBhZnRlciBpdCBnZXRzIGhpdC4gIFwiZGlzXCIgbWVhbnMgdGhhdCB0aGVcblwKK2JyZWFrcG9pbnQgd2lsbCBiZSBkaXNhYmxlZC4gIFRoZSBcIkFkZHJlc3NcIiBhbmQgXCJXaGF0XCIgY29sdW1ucyBpbmRpY2F0ZSB0aGVcblwKK2FkZHJlc3MgYW5kIGZpbGUvbGluZSBudW1iZXIgcmVzcGVjdGl2ZWx5LlxuXG4iLAorIkNvbnZlbmllbmNlIHZhcmlhYmxlIFwiJF9cIiBhbmQgZGVmYXVsdCBleGFtaW5lIGFkZHJlc3MgZm9yIFwieFwiXG5cCithcmUgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBsYXN0IGJyZWFrcG9pbnQgbGlzdGVkLlxuXG5cCitDb252ZW5pZW5jZSB2YXJpYWJsZSBcIiRicG51bVwiIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgdGhlIGxhc3RcblwKK2JyZWFrcG9pbnQgc2V0LiIsIE5VTEwpLAorCSAgICZtYWludGVuYW5jZWluZm9saXN0KTsKKworI2VuZGlmCS8qIE1BSU5URU5BTkNFX0NNRFMgKi8KKworICBhZGRfY29tICgiY2F0Y2giLCBjbGFzc19icmVha3BvaW50LCBjYXRjaF9jb21tYW5kLAorICAgICAgICAgIlNldCBjYXRjaHBvaW50cyB0byBjYXRjaCBldmVudHMuXG5cCitSYWlzZWQgc2lnbmFscyBtYXkgYmUgY2F1Z2h0OlxuXAorXHRjYXRjaCBzaWduYWwgICAgICAgICAgICAgIC0gYWxsIHNpZ25hbHNcblwKK1x0Y2F0Y2ggc2lnbmFsIDxzaWduYW1lPiAgICAtIGEgcGFydGljdWxhciBzaWduYWxcblwKK1JhaXNlZCBleGNlcHRpb25zIG1heSBiZSBjYXVnaHQ6XG5cCitcdGNhdGNoIHRocm93ICAgICAgICAgICAgICAgLSBhbGwgZXhjZXB0aW9ucywgd2hlbiB0aHJvd25cblwKK1x0Y2F0Y2ggdGhyb3cgPGV4Y2VwdG5hbWU+ICAtIGEgcGFydGljdWxhciBleGNlcHRpb24sIHdoZW4gdGhyb3duXG5cCitcdGNhdGNoIGNhdGNoICAgICAgICAgICAgICAgLSBhbGwgZXhjZXB0aW9ucywgd2hlbiBjYXVnaHRcblwKK1x0Y2F0Y2ggY2F0Y2ggPGV4Y2VwdG5hbWU+ICAtIGEgcGFydGljdWxhciBleGNlcHRpb24sIHdoZW4gY2F1Z2h0XG5cCitUaHJlYWQgb3IgcHJvY2VzcyBldmVudHMgbWF5IGJlIGNhdWdodDpcblwKK1x0Y2F0Y2ggdGhyZWFkX3N0YXJ0ICAgICAgICAtIGFueSB0aHJlYWRzLCBqdXN0IGFmdGVyIGNyZWF0aW9uXG5cCitcdGNhdGNoIHRocmVhZF9leGl0ICAgICAgICAgLSBhbnkgdGhyZWFkcywganVzdCBiZWZvcmUgZXhwaXJhdGlvblxuXAorXHRjYXRjaCB0aHJlYWRfam9pbiAgICAgICAgIC0gYW55IHRocmVhZHMsIGp1c3QgYWZ0ZXIgam9pbnNcblwKK1Byb2Nlc3MgZXZlbnRzIG1heSBiZSBjYXVnaHQ6XG5cCitcdGNhdGNoIHN0YXJ0ICAgICAgICAgICAgICAgLSBhbnkgcHJvY2Vzc2VzLCBqdXN0IGFmdGVyIGNyZWF0aW9uXG5cCitcdGNhdGNoIGV4aXQgICAgICAgICAgICAgICAgLSBhbnkgcHJvY2Vzc2VzLCBqdXN0IGJlZm9yZSBleHBpcmF0aW9uXG5cCitcdGNhdGNoIGZvcmsgICAgICAgICAgICAgICAgLSBjYWxscyB0byBmb3JrKClcblwKK1x0Y2F0Y2ggdmZvcmsgICAgICAgICAgICAgICAtIGNhbGxzIHRvIHZmb3JrKClcblwKK1x0Y2F0Y2ggZXhlYyAgICAgICAgICAgICAgICAtIGNhbGxzIHRvIGV4ZWMoKVxuXAorRHluYW1pY2FsbHktbGlua2VkIGxpYnJhcnkgZXZlbnRzIG1heSBiZSBjYXVnaHQ6XG5cCitcdGNhdGNoIGxvYWQgICAgICAgICAgICAgICAgLSBsb2FkcyBvZiBhbnkgbGlicmFyeVxuXAorXHRjYXRjaCBsb2FkIDxsaWJuYW1lPiAgICAgIC0gbG9hZHMgb2YgYSBwYXJ0aWN1bGFyIGxpYnJhcnlcblwKK1x0Y2F0Y2ggdW5sb2FkICAgICAgICAgICAgICAtIHVubG9hZHMgb2YgYW55IGxpYnJhcnlcblwKK1x0Y2F0Y2ggdW5sb2FkIDxsaWJuYW1lPiAgICAtIHVubG9hZHMgb2YgYSBwYXJ0aWN1bGFyIGxpYnJhcnlcblwKK1RoZSBhY3Qgb2YgeW91ciBwcm9ncmFtJ3MgZXhlY3V0aW9uIHN0b3BwaW5nIG1heSBhbHNvIGJlIGNhdWdodDpcblwKK1x0Y2F0Y2ggc3RvcFxuXG5cCitDKysgZXhjZXB0aW9ucyBtYXkgYmUgY2F1Z2h0OlxuXAorXHRjYXRjaCB0aHJvdyAgICAgICAgICAgICAgIC0gYWxsIGV4Y2VwdGlvbnMsIHdoZW4gdGhyb3duXG5cCitcdGNhdGNoIGNhdGNoICAgICAgICAgICAgICAgLSBhbGwgZXhjZXB0aW9ucywgd2hlbiBjYXVnaHRcblwKK1xuXAorRG8gXCJoZWxwIHNldCBmb2xsb3ctZm9yay1tb2RlXCIgZm9yIGluZm8gb24gZGVidWdnaW5nIHlvdXIgcHJvZ3JhbVxuXAorYWZ0ZXIgYSBmb3JrIG9yIHZmb3JrIGlzIGNhdWdodC5cblxuXAorRG8gXCJoZWxwIGJyZWFrcG9pbnRzXCIgZm9yIGluZm8gb24gb3RoZXIgY29tbWFuZHMgZGVhbGluZyB3aXRoIGJyZWFrcG9pbnRzLiIpOworIAorICBhZGRfY29tICgidGNhdGNoIiwgY2xhc3NfYnJlYWtwb2ludCwgdGNhdGNoX2NvbW1hbmQsCisgICAgICAgICAiU2V0IHRlbXBvcmFyeSBjYXRjaHBvaW50cyB0byBjYXRjaCBldmVudHMuXG5cCitBcmdzIGxpa2UgXCJjYXRjaFwiIGNvbW1hbmQuXG5cCitMaWtlIFwiY2F0Y2hcIiBleGNlcHQgdGhlIGNhdGNocG9pbnQgaXMgb25seSB0ZW1wb3JhcnksXG5cCitzbyBpdCB3aWxsIGJlIGRlbGV0ZWQgd2hlbiBoaXQuICBFcXVpdmFsZW50IHRvIFwiY2F0Y2hcIiBmb2xsb3dlZFxuXAorYnkgdXNpbmcgXCJlbmFibGUgZGVsZXRlXCIgb24gdGhlIGNhdGNocG9pbnQgbnVtYmVyLiIpOworIAorYWRkX2NvbSAoIndhdGNoIiwgY2xhc3NfYnJlYWtwb2ludCwgd2F0Y2hfY29tbWFuZCwKKworCSAgICJTZXQgYSB3YXRjaHBvaW50IGZvciBhbiBleHByZXNzaW9uLlxuXAorQSB3YXRjaHBvaW50IHN0b3BzIGV4ZWN1dGlvbiBvZiB5b3VyIHByb2dyYW0gd2hlbmV2ZXIgdGhlIHZhbHVlIG9mXG5cCithbiBleHByZXNzaW9uIGNoYW5nZXMuIik7CisKKyAgYWRkX2NvbSAoInJ3YXRjaCIsIGNsYXNzX2JyZWFrcG9pbnQsIHJ3YXRjaF9jb21tYW5kLAorCSAgICJTZXQgYSByZWFkIHdhdGNocG9pbnQgZm9yIGFuIGV4cHJlc3Npb24uXG5cCitBIHdhdGNocG9pbnQgc3RvcHMgZXhlY3V0aW9uIG9mIHlvdXIgcHJvZ3JhbSB3aGVuZXZlciB0aGUgdmFsdWUgb2ZcblwKK2FuIGV4cHJlc3Npb24gaXMgcmVhZC4iKTsKKworICBhZGRfY29tICgiYXdhdGNoIiwgY2xhc3NfYnJlYWtwb2ludCwgYXdhdGNoX2NvbW1hbmQsCisJICAgIlNldCBhIHdhdGNocG9pbnQgZm9yIGFuIGV4cHJlc3Npb24uXG5cCitBIHdhdGNocG9pbnQgc3RvcHMgZXhlY3V0aW9uIG9mIHlvdXIgcHJvZ3JhbSB3aGVuZXZlciB0aGUgdmFsdWUgb2ZcblwKK2FuIGV4cHJlc3Npb24gaXMgZWl0aGVyIHJlYWQgb3Igd3JpdHRlbi4iKTsKKworICBhZGRfaW5mbyAoIndhdGNocG9pbnRzIiwgYnJlYWtwb2ludHNfaW5mbywKKwkgICAgIlN5bm9ueW0gZm9yIGBgaW5mbyBicmVha3BvaW50cycnLiIpOworCisKKyAgYyA9IGFkZF9zZXRfY21kICgiY2FuLXVzZS1ody13YXRjaHBvaW50cyIsIGNsYXNzX3N1cHBvcnQsIHZhcl96aW50ZWdlciwKKyAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmY2FuX3VzZV9od193YXRjaHBvaW50cywKKyAgICAgICAgICAgICAgICAgICAiU2V0IGRlYnVnZ2VyJ3Mgd2lsbGluZ25lc3MgdG8gdXNlIHdhdGNocG9pbnQgaGFyZHdhcmUuXG5cCitJZiB6ZXJvLCBnZGIgd2lsbCBub3QgdXNlIGhhcmR3YXJlIGZvciBuZXcgd2F0Y2hwb2ludHMsIGV2ZW4gaWZcblwKK3N1Y2ggaXMgYXZhaWxhYmxlLiAgKEhvd2V2ZXIsIGFueSBoYXJkd2FyZSB3YXRjaHBvaW50cyB0aGF0IHdlcmVcblwKK2NyZWF0ZWQgYmVmb3JlIHNldHRpbmcgdGhpcyB0byBub256ZXJvLCB3aWxsIGNvbnRpbnVlIHRvIHVzZSB3YXRjaHBvaW50XG5cCitoYXJkd2FyZS4pIiwKKyAgICAgICAgICAgICAgICZzZXRsaXN0KTsKKyAgYWRkX3Nob3dfZnJvbV9zZXQgKGMsICZzaG93bGlzdCk7CisKKyAgY2FuX3VzZV9od193YXRjaHBvaW50cyA9IDE7Cit9CmRpZmYgLS1naXQgYS9nZGIvYnJlYWtwb2ludC5oIGIvZ2RiL2JyZWFrcG9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmZlYmFjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2JyZWFrcG9pbnQuaApAQCAtMCwwICsxLDYwNCBAQAorLyogRGF0YSBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCBicmVha3BvaW50cyBpbiBHREIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWYgIWRlZmluZWQgKEJSRUFLUE9JTlRfSCkKKyNkZWZpbmUgQlJFQUtQT0lOVF9IIDEKKworI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKworLyogVGhpcyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgYSBicmVha3BvaW50IGluc3RydWN0aW9uIGNhbiB0YWtlLgorICAgRmVlbCBmcmVlIHRvIGluY3JlYXNlIGl0LiAgSXQncyBqdXN0IHVzZWQgaW4gYSBmZXcgcGxhY2VzIHRvIHNpemUKKyAgIGFycmF5cyB0aGF0IHNob3VsZCBiZSBpbmRlcGVuZGVudCBvZiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gICovCisKKyNkZWZpbmUJQlJFQUtQT0lOVF9NQVgJMTYKKwwKKy8qIFR5cGUgb2YgYnJlYWtwb2ludC4gKi8KKy8qIEZJWE1FIEluIHRoZSBmdXR1cmUsIHdlIHNob3VsZCBmb2xkIGFsbCBvdGhlciBicmVha3BvaW50LWxpa2UgdGhpbmdzIGludG8KKyAgIGhlcmUuICBUaGlzIGluY2x1ZGVzOgorCisgICAqIHNpbmdsZS1zdGVwIChmb3IgbWFjaGluZXMgd2hlcmUgd2UgaGF2ZSB0byBzaW11bGF0ZSBzaW5nbGUgc3RlcHBpbmcpCisgICAgICAocHJvYmFibHksIHRob3VnaCBwZXJoYXBzIGl0IGlzIGJldHRlciBmb3IgaXQgdG8gbG9vayBhcyBtdWNoIGFzCisgICAgICBwb3NzaWJsZSBsaWtlIGEgc2luZ2xlLXN0ZXAgdG8gd2FpdF9mb3JfaW5mZXJpb3IpLiAgKi8KKworZW51bSBicHR5cGUgeworICBicF9ub25lID0gMCwgICAgICAgICAgICAgICAgICAvKiBFdmVudHBvaW50IGhhcyBiZWVuIGRlbGV0ZWQuICovCisgIGJwX2JyZWFrcG9pbnQsCQkvKiBOb3JtYWwgYnJlYWtwb2ludCAqLworICBicF9oYXJkd2FyZV9icmVha3BvaW50LAkvKiBIYXJkd2FyZSBhc3Npc3RlZCBicmVha3BvaW50ICovCisgIGJwX3VudGlsLAkJCS8qIHVzZWQgYnkgdW50aWwgY29tbWFuZCAqLworICBicF9maW5pc2gsCQkJLyogdXNlZCBieSBmaW5pc2ggY29tbWFuZCAqLworICBicF93YXRjaHBvaW50LAkJLyogV2F0Y2hwb2ludCAqLworICBicF9oYXJkd2FyZV93YXRjaHBvaW50LAkvKiBIYXJkd2FyZSBhc3Npc3RlZCB3YXRjaHBvaW50ICovCisgIGJwX3JlYWRfd2F0Y2hwb2ludCwJCS8qIHJlYWQgd2F0Y2hwb2ludCwgKGhhcmR3YXJlIGFzc2lzdGVkKSAqLworICBicF9hY2Nlc3Nfd2F0Y2hwb2ludCwJCS8qIGFjY2VzcyB3YXRjaHBvaW50LCAoaGFyZHdhcmUgYXNzaXN0ZWQpICovCisgIGJwX2xvbmdqbXAsCQkJLyogc2VjcmV0IGJyZWFrcG9pbnQgdG8gZmluZCBsb25nam1wKCkgKi8KKyAgYnBfbG9uZ2ptcF9yZXN1bWUsCQkvKiBzZWNyZXQgYnJlYWtwb2ludCB0byBlc2NhcGUgbG9uZ2ptcCgpICovCisKKyAgLyogVXNlZCBieSB3YWl0X2Zvcl9pbmZlcmlvciBmb3Igc3RlcHBpbmcgb3ZlciBzdWJyb3V0aW5lIGNhbGxzLCBmb3IKKyAgICAgc3RlcHBpbmcgb3ZlciBzaWduYWwgaGFuZGxlcnMsIGFuZCBmb3Igc2tpcHBpbmcgcHJvbG9ndWVzLiAgKi8KKyAgYnBfc3RlcF9yZXN1bWUsCisKKyAgLyogVXNlZCBieSB3YWl0X2Zvcl9pbmZlcmlvciBmb3Igc3RlcHBpbmcgb3ZlciBzaWduYWwgaGFuZGxlcnMuICAqLworICBicF90aHJvdWdoX3NpZ3RyYW1wLAorCisgIC8qIFVzZWQgdG8gZGV0ZWN0IHdoZW4gYSB3YXRjaHBvaW50IGV4cHJlc3Npb24gaGFzIGdvbmUgb3V0IG9mCisgICAgIHNjb3BlLiAgVGhlc2UgYnJlYWtwb2ludHMgYXJlIHVzdWFsbHkgbm90IHZpc2libGUgdG8gdGhlIHVzZXIuCisKKyAgICAgVGhpcyBicmVha3BvaW50IGhhcyBzb21lIGludGVyZXN0aW5nIHByb3BlcnRpZXM6CisKKyAgICAgICAxKSBUaGVyZSdzIGFsd2F5cyBhIDE6MSBtYXBwaW5nIGJldHdlZW4gd2F0Y2hwb2ludHMKKyAgICAgICBvbiBsb2NhbCB2YXJpYWJsZXMgYW5kIHdhdGNocG9pbnRfc2NvcGUgYnJlYWtwb2ludHMuCisKKyAgICAgICAyKSBJdCBhdXRvbWF0aWNhbGx5IGRlbGV0ZXMgaXRzZWxmIGFuZCB0aGUgd2F0Y2hwb2ludCBpdCdzCisgICAgICAgYXNzb2NpYXRlZCB3aXRoIHdoZW4gaGl0LgorCisgICAgICAgMykgSXQgY2FuIG5ldmVyIGJlIGRpc2FibGVkLiAgKi8KKyAgYnBfd2F0Y2hwb2ludF9zY29wZSwKKworICAvKiBUaGUgYnJlYWtwb2ludCBhdCB0aGUgZW5kIG9mIGEgY2FsbCBkdW1teS4gICovCisgIC8qIEZJWE1FOiBXaGF0IGlmIHRoZSBmdW5jdGlvbiB3ZSBhcmUgY2FsbGluZyBsb25nam1wKClzIG91dCBvZiB0aGUKKyAgICAgY2FsbCwgb3IgdGhlIHVzZXIgZ2V0cyBvdXQgd2l0aCB0aGUgInJldHVybiIgY29tbWFuZD8gIFdlIGN1cnJlbnRseQorICAgICBoYXZlIG5vIHdheSBvZiBjbGVhbmluZyB1cCB0aGUgYnJlYWtwb2ludCBpbiB0aGVzZSAob2JzY3VyZSkgc2l0dWF0aW9ucy4KKyAgICAgKFByb2JhYmx5IGNhbiBzb2x2ZSB0aGlzIGJ5IG5vdGljaW5nIGxvbmdqbXAsICJyZXR1cm4iLCBldGMuLCBpdCdzCisgICAgIHNpbWlsYXIgdG8gbm90aWNpbmcgd2hlbiBhIHdhdGNocG9pbnQgb24gYSBsb2NhbCB2YXJpYWJsZSBnb2VzIG91dAorICAgICBvZiBzY29wZSAod2l0aCBoYXJkd2FyZSBzdXBwb3J0IGZvciB3YXRjaHBvaW50cykpLiAgKi8KKyAgYnBfY2FsbF9kdW1teSwKKworICAvKiBTb21lIGR5bmFtaWMgbGlua2VycyAoSFAsIG1heWJlIFNvbGFyaXMpIGNhbiBhcnJhbmdlIGZvciBzcGVjaWFsCisgICAgIGNvZGUgaW4gdGhlIGluZmVyaW9yIHRvIHJ1biB3aGVuIHNpZ25pZmljYW50IGV2ZW50cyBvY2N1ciBpbiB0aGUKKyAgICAgZHluYW1pYyBsaW5rZXIgKGZvciBleGFtcGxlIGEgbGlicmFyeSBpcyBsb2FkZWQgb3IgdW5sb2FkZWQpLgorCisgICAgIEJ5IHBsYWNpbmcgYSBicmVha3BvaW50IGluIHRoaXMgbWFnaWMgY29kZSBHREIgd2lsbCBnZXQgY29udHJvbAorICAgICB3aGVuIHRoZXNlIHNpZ25pZmljYW50IGV2ZW50cyBvY2N1ci4gIEdEQiBjYW4gdGhlbiByZS1leGFtaW5lCisgICAgIHRoZSBkeW5hbWljIGxpbmtlcidzIGRhdGEgc3RydWN0dXJlcyB0byBkaXNjb3ZlciBhbnkgbmV3bHkgbG9hZGVkCisgICAgIGR5bmFtaWMgbGlicmFyaWVzLiAgKi8KKyAgYnBfc2hsaWJfZXZlbnQsCisgCisgIC8qIFRoZXNlIGJyZWFrcG9pbnRzIGFyZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgImNhdGNoIGxvYWQiIGNvbW1hbmQKKyAgICAgb24gcGxhdGZvcm1zIHdob3NlIGR5bmFtaWMgbGlua2VycyBzdXBwb3J0IHN1Y2ggZnVuY3Rpb25hbGl0eS4gICovCisgIGJwX2NhdGNoX2xvYWQsCisgCisgIC8qIFRoZXNlIGJyZWFrcG9pbnRzIGFyZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgImNhdGNoIHVubG9hZCIgY29tbWFuZAorICAgICBvbiBwbGF0Zm9ybXMgd2hvc2UgZHluYW1pYyBsaW5rZXJzIHN1cHBvcnQgc3VjaCBmdW5jdGlvbmFsaXR5LiAgKi8KKyAgYnBfY2F0Y2hfdW5sb2FkLAorIAorICAvKiBUaGVzZSBhcmUgbm90IHJlYWxseSBicmVha3BvaW50cywgYnV0IGFyZSBjYXRjaHBvaW50cyB0aGF0CisgICAgIGltcGxlbWVudCB0aGUgImNhdGNoIGZvcmsiLCAiY2F0Y2ggdmZvcmsiIGFuZCAiY2F0Y2ggZXhlYyIgY29tbWFuZHMKKyAgICAgb24gcGxhdGZvcm1zIHdob3NlIGtlcm5lbCBzdXBwb3J0IHN1Y2ggZnVuY3Rpb25hbGl0eS4gIChJLmUuLAorICAgICBrZXJuZWxzIHdoaWNoIGNhbiByYWlzZSBhbiBldmVudCB3aGVuIGEgZm9yayBvciBleGVjIG9jY3VycywgYXMKKyAgICAgb3Bwb3NlZCB0byB0aGUgZGVidWdnZXIgc2V0dGluZyBicmVha3BvaW50cyBvbiBmdW5jdGlvbnMgbmFtZWQKKyAgICAgImZvcmsiIG9yICJleGVjIi4pICovCisgIGJwX2NhdGNoX2ZvcmssCisgIGJwX2NhdGNoX3Zmb3JrLAorICBicF9jYXRjaF9leGVjLAorCisgIC8qIFRoZXNlIGFyZSBjYXRjaHBvaW50cyB0byBpbXBsZW1lbnQgImNhdGNoIGNhdGNoIiBhbmQgImNhdGNoIHRocm93IgorICAgICBjb21tYW5kcyBmb3IgQysrIGV4Y2VwdGlvbiBoYW5kbGluZy4gKi8KKyAgYnBfY2F0Y2hfY2F0Y2gsCisgIGJwX2NhdGNoX3Rocm93CisgCit9OworCisvKiBTdGF0ZXMgb2YgZW5hYmxlbWVudCBvZiBicmVha3BvaW50LiAqLworCitlbnVtIGVuYWJsZSB7IAorICBkaXNhYmxlZCwgICAgICAgICAgIC8qIFRoZSBldmVudHBvaW50IGlzIGluYWN0aXZlLCBhbmQgY2Fubm90IHRyaWdnZXIuICovCisgIGVuYWJsZWQsICAgICAgICAgICAgLyogVGhlIGV2ZW50cG9pbnQgaXMgYWN0aXZlLCBhbmQgY2FuIHRyaWdnZXIuICovCisgIHNobGliX2Rpc2FibGVkLCAgICAgLyogVGhlIGV2ZW50cG9pbnQncyBhZGRyZXNzIGlzIHdpdGhpbiBhbiB1bmxvYWRlZCBzb2xpYi4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZXZlbnRwb2ludCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCAmIHJlc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGF0IHNvbGliIGlzIGxvYWRlZC4gKi8KKyAgY2FsbF9kaXNhYmxlZCAgICAgICAvKiBUaGUgZXZlbnRwb2ludCBoYXMgYmVlbiBkaXNhYmxlZCB3aGlsZSBhIGNhbGwgaW50bworICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbmZlcmlvciBpcyAiaW4gZmxpZ2h0IiwgYmVjYXVzZSBzb21lIGV2ZW50cG9pbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmZXJlIHdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgY2FsbCBvbiBzb21lCisgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cy4gIFRoZSBldmVudHBvaW50IHdpbGwgYmUgYXV0b21hdGljYWxseSBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgJiByZXNldCB3aGVuIHRoZSBjYWxsICJsYW5kcyIgKGVpdGhlciBjb21wbGV0ZXMsIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHMgYXQgYW5vdGhlciBldmVudHBvaW50KS4gKi8KK307CisKKworLyogRGlzcG9zaXRpb24gb2YgYnJlYWtwb2ludC4gIEllOiB3aGF0IHRvIGRvIGFmdGVyIGhpdHRpbmcgaXQuICovCisKK2VudW0gYnBkaXNwIHsKKyAgZGVsLAkJCQkvKiBEZWxldGUgaXQgKi8KKyAgZGVsX2F0X25leHRfc3RvcCwJCS8qIERlbGV0ZSBhdCBuZXh0IHN0b3AsIHdoZXRoZXIgaGl0IG9yIG5vdCAqLworICBkaXNhYmxlLAkJCS8qIERpc2FibGUgaXQgKi8KKyAgZG9udHRvdWNoCQkJLyogTGVhdmUgaXQgYWxvbmUgKi8KK307CisKKy8qIE5vdGUgdGhhdCB0aGUgLT5zaWxlbnQgZmllbGQgaXMgbm90IGN1cnJlbnRseSB1c2VkIGJ5IGFueSBjb21tYW5kcworICAgKHRob3VnaCB0aGUgY29kZSBpcyBpbiB0aGVyZSBpZiBpdCB3YXMgdG8gYmUsIGFuZCBzZXRfcmF3X2JyZWFrcG9pbnQKKyAgIGRvZXMgc2V0IGl0IHRvIDApLiAgSSBpbXBsZW1lbnRlZCBpdCBiZWNhdXNlIEkgdGhvdWdodCBpdCB3b3VsZCBiZQorICAgdXNlZnVsIGZvciBhIGhhY2sgSSBoYWQgdG8gcHV0IGluOyBJJ20gZ29pbmcgdG8gbGVhdmUgaXQgaW4gYmVjYXVzZQorICAgSSBjYW4gc2VlIGhvdyB0aGVyZSBtaWdodCBiZSB0aW1lcyB3aGVuIGl0IHdvdWxkIGluZGVlZCBiZSB1c2VmdWwgKi8KKworLyogVGhpcyBpcyBmb3IgYSBicmVha3BvaW50IG9yIGEgd2F0Y2hwb2ludC4gICovCisKK3N0cnVjdCBicmVha3BvaW50Cit7CisgIHN0cnVjdCBicmVha3BvaW50ICpuZXh0OworICAvKiBUeXBlIG9mIGJyZWFrcG9pbnQuICovCisgIGVudW0gYnB0eXBlIHR5cGU7CisgIC8qIFplcm8gbWVhbnMgZGlzYWJsZWQ7IHJlbWVtYmVyIHRoZSBpbmZvIGJ1dCBkb24ndCBicmVhayBoZXJlLiAgKi8KKyAgZW51bSBlbmFibGUgZW5hYmxlOworICAvKiBXaGF0IHRvIGRvIHdpdGggdGhpcyBicmVha3BvaW50IGFmdGVyIHdlIGhpdCBpdC4gKi8KKyAgZW51bSBicGRpc3AgZGlzcG9zaXRpb247CisgIC8qIE51bWJlciBhc3NpZ25lZCB0byBkaXN0aW5ndWlzaCBicmVha3BvaW50cy4gICovCisgIGludCBudW1iZXI7CisKKyAgLyogQWRkcmVzcyB0byBicmVhayBhdCwgb3IgTlVMTCBpZiBub3QgYSBicmVha3BvaW50LiAgKi8KKyAgQ09SRV9BRERSIGFkZHJlc3M7CisKKyAgLyogTGluZSBudW1iZXIgb2YgdGhpcyBhZGRyZXNzLiAgT25seSBtYXR0ZXJzIGlmIGFkZHJlc3MgaXMKKyAgICAgbm9uLU5VTEwuICAqLworCisgIGludCBsaW5lX251bWJlcjsKKworICAvKiBTb3VyY2UgZmlsZSBuYW1lIG9mIHRoaXMgYWRkcmVzcy4gIE9ubHkgbWF0dGVycyBpZiBhZGRyZXNzIGlzCisgICAgIG5vbi1OVUxMLiAgKi8KKworICBjaGFyICpzb3VyY2VfZmlsZTsKKworICAvKiBOb24temVybyBtZWFucyBhIHNpbGVudCBicmVha3BvaW50IChkb24ndCBwcmludCBmcmFtZSBpbmZvCisgICAgIGlmIHdlIHN0b3AgaGVyZSkuICovCisgIHVuc2lnbmVkIGNoYXIgc2lsZW50OworICAvKiBOdW1iZXIgb2Ygc3RvcHMgYXQgdGhpcyBicmVha3BvaW50IHRoYXQgc2hvdWxkCisgICAgIGJlIGNvbnRpbnVlZCBhdXRvbWF0aWNhbGx5IGJlZm9yZSByZWFsbHkgc3RvcHBpbmcuICAqLworICBpbnQgaWdub3JlX2NvdW50OworICAvKiAiUmVhbCIgY29udGVudHMgb2YgYnl0ZSB3aGVyZSBicmVha3BvaW50IGhhcyBiZWVuIGluc2VydGVkLgorICAgICBWYWxpZCBvbmx5IHdoZW4gYnJlYWtwb2ludHMgYXJlIGluIHRoZSBwcm9ncmFtLiAgVW5kZXIgdGhlIGNvbXBsZXRlCisgICAgIGNvbnRyb2wgb2YgdGhlIHRhcmdldCBpbnNlcnRfYnJlYWtwb2ludCBhbmQgcmVtb3ZlX2JyZWFrcG9pbnQgcm91dGluZXMuCisgICAgIE5vIG90aGVyIGNvZGUgc2hvdWxkIGFzc3VtZSBhbnl0aGluZyBhYm91dCB0aGUgdmFsdWUocykgaGVyZS4gICovCisgIGNoYXIgc2hhZG93X2NvbnRlbnRzW0JSRUFLUE9JTlRfTUFYXTsKKyAgLyogTm9uemVybyBpZiB0aGlzIGJyZWFrcG9pbnQgaXMgbm93IGluc2VydGVkLiAgT25seSBtYXR0ZXJzIGlmIGFkZHJlc3MKKyAgICAgaXMgbm9uLU5VTEwuICAqLworICBjaGFyIGluc2VydGVkOworICAvKiBOb256ZXJvIGlmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBicmVha3BvaW50IGluIHRoZSBsaXN0CisgICAgIGZvciB0aGUgZ2l2ZW4gYWRkcmVzcy4gIE9ubHkgbWF0dGVycyBpZiBhZGRyZXNzIGlzIG5vbi1OVUxMLiAgKi8KKyAgY2hhciBkdXBsaWNhdGU7CisgIC8qIENoYWluIG9mIGNvbW1hbmQgbGluZXMgdG8gZXhlY3V0ZSB3aGVuIHRoaXMgYnJlYWtwb2ludCBpcyBoaXQuICAqLworICBzdHJ1Y3QgY29tbWFuZF9saW5lICpjb21tYW5kczsKKyAgLyogU3RhY2sgZGVwdGggKGFkZHJlc3Mgb2YgZnJhbWUpLiAgSWYgbm9uemVybywgYnJlYWsgb25seSBpZiBmcAorICAgICBlcXVhbHMgdGhpcy4gICovCisgIENPUkVfQUREUiBmcmFtZTsKKyAgLyogQ29uZGl0aW9uYWwuICBCcmVhayBvbmx5IGlmIHRoaXMgZXhwcmVzc2lvbidzIHZhbHVlIGlzIG5vbnplcm8uICAqLworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqY29uZDsKKworICAvKiBTdHJpbmcgd2UgdXNlZCB0byBzZXQgdGhlIGJyZWFrcG9pbnQgKG1hbGxvYydkKS4gIE9ubHkgbWF0dGVycyBpZgorICAgICBhZGRyZXNzIGlzIG5vbi1OVUxMLiAgKi8KKyAgY2hhciAqYWRkcl9zdHJpbmc7CisgIC8qIExhbmd1YWdlIHdlIHVzZWQgdG8gc2V0IHRoZSBicmVha3BvaW50LiAgKi8KKyAgZW51bSBsYW5ndWFnZSBsYW5ndWFnZTsKKyAgLyogSW5wdXQgcmFkaXggd2UgdXNlZCB0byBzZXQgdGhlIGJyZWFrcG9pbnQuICAqLworICBpbnQgaW5wdXRfcmFkaXg7CisgIC8qIFN0cmluZyBmb3JtIG9mIHRoZSBicmVha3BvaW50IGNvbmRpdGlvbiAobWFsbG9jJ2QpLCBvciBOVUxMIGlmIHRoZXJlCisgICAgIGlzIG5vIGNvbmRpdGlvbi4gICovCisgIGNoYXIgKmNvbmRfc3RyaW5nOworICAvKiBTdHJpbmcgZm9ybSBvZiBleHAgKG1hbGxvYydkKSwgb3IgTlVMTCBpZiBub25lLiAgKi8KKyAgY2hhciAqZXhwX3N0cmluZzsKKworICAvKiBUaGUgZXhwcmVzc2lvbiB3ZSBhcmUgd2F0Y2hpbmcsIG9yIE5VTEwgaWYgbm90IGEgd2F0Y2hwb2ludC4gICovCisgIHN0cnVjdCBleHByZXNzaW9uICpleHA7CisgIC8qIFRoZSBsYXJnZXN0IGJsb2NrIHdpdGhpbiB3aGljaCBpdCBpcyB2YWxpZCwgb3IgTlVMTCBpZiBpdCBpcworICAgICB2YWxpZCBhbnl3aGVyZSAoZS5nLiBjb25zaXN0cyBqdXN0IG9mIGdsb2JhbCBzeW1ib2xzKS4gICovCisgIHN0cnVjdCBibG9jayAqZXhwX3ZhbGlkX2Jsb2NrOworICAvKiBWYWx1ZSBvZiB0aGUgd2F0Y2hwb2ludCB0aGUgbGFzdCB0aW1lIHdlIGNoZWNrZWQgaXQuICAqLworICB2YWx1ZV9wdHIgdmFsOworCisgIC8qIEhvbGRzIHRoZSB2YWx1ZSBjaGFpbiBmb3IgYSBoYXJkd2FyZSB3YXRjaHBvaW50IGV4cHJlc3Npb24uICAqLworICB2YWx1ZV9wdHIgdmFsX2NoYWluOworCisgIC8qIEhvbGRzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxhdGVkIHdhdGNocG9pbnRfc2NvcGUgYnJlYWtwb2ludAorICAgICB3aGVuIHVzaW5nIHdhdGNocG9pbnRzIG9uIGxvY2FsIHZhcmlhYmxlcyAobWlnaHQgdGhlIGNvbmNlcHQKKyAgICAgb2YgYSByZWxhdGVkIGJyZWFrcG9pbnQgYmUgdXNlZnVsIGVsc2V3aGVyZSwgaWYgbm90IGp1c3QgY2FsbAorICAgICBpdCB0aGUgd2F0Y2hwb2ludF9zY29wZSBicmVha3BvaW50IG9yIHNvbWV0aGluZyBsaWtlIHRoYXQuIEZJWE1FKS4gICovCisgIHN0cnVjdCBicmVha3BvaW50ICpyZWxhdGVkX2JyZWFrcG9pbnQ7IAorCisgIC8qIEhvbGRzIHRoZSBmcmFtZSBhZGRyZXNzIHdoaWNoIGlkZW50aWZpZXMgdGhlIGZyYW1lIHRoaXMgd2F0Y2hwb2ludAorICAgICBzaG91bGQgYmUgZXZhbHVhdGVkIGluLCBvciBOVUxMIGlmIHRoZSB3YXRjaHBvaW50IHNob3VsZCBiZSBldmFsdWF0ZWQKKyAgICAgb24gdGhlIG91dGVybW9zdCBmcmFtZS4gICovCisgIENPUkVfQUREUiB3YXRjaHBvaW50X2ZyYW1lOworCisgIC8qIFRocmVhZCBudW1iZXIgZm9yIHRocmVhZC1zcGVjaWZpYyBicmVha3BvaW50LCBvciAtMSBpZiBkb24ndCBjYXJlICovCisgIGludCB0aHJlYWQ7CisKKyAgLyogQ291bnQgb2YgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGJyZWFrcG9pbnQgd2FzIHRha2VuLCBkdW1wZWQKKyAgICAgd2l0aCB0aGUgaW5mbywgYnV0IG5vdCB1c2VkIGZvciBhbnl0aGluZyBlbHNlLiAgVXNlZnVsIGZvcgorICAgICBzZWVpbmcgaG93IG1hbnkgdGltZXMgeW91IGhpdCBhIGJyZWFrIHByaW9yIHRvIHRoZSBwcm9ncmFtCisgICAgIGFib3J0aW5nLCBzbyB5b3UgY2FuIGJhY2sgdXAgdG8ganVzdCBiZWZvcmUgdGhlIGFib3J0LiAgKi8KKyAgaW50IGhpdF9jb3VudDsKKworICAvKiBGaWxlbmFtZSBvZiBhIGR5bmFtaWNhbGx5LWxpbmtlZCBsaWJyYXJ5IChkbGwpLCB1c2VkIGZvciBicF9jYXRjaF9sb2FkCisgICAgIGFuZCBicF9jYXRjaF91bmxvYWQgKG1hbGxvYydkKSwgb3IgTlVMTCBpZiBhbnkgbGlicmFyeSBpcyBzaWduaWZpY2FudC4gICovCisgIGNoYXIgKiAgZGxsX3BhdGhuYW1lOworIAorICAvKiBGaWxlbmFtZSBvZiBhIGRsbCB3aG9zZSBzdGF0ZSBjaGFuZ2UgKGUuZy4sIGxvYWQgb3IgdW5sb2FkKQorICAgICB0cmlnZ2VyZWQgdGhpcyBjYXRjaHBvaW50LiAgVGhpcyBmaWVsZCBpcyBvbmx5IHZhaWQgaW1tZWRpYXRlbHkKKyAgICAgYWZ0ZXIgdGhpcyBjYXRjaHBvaW50IGhhcyB0cmlnZ2VyZWQuICAqLworICBjaGFyICogIHRyaWdnZXJlZF9kbGxfcGF0aG5hbWU7CisgCisgIC8qIFByb2Nlc3MgaWQgb2YgYSBjaGlsZCBwcm9jZXNzIHdob3NlIGZvcmtpbmcgdHJpZ2dlcmVkIHRoaXMgY2F0Y2hwb2ludC4KKyAgICAgVGhpcyBmaWVsZCBpcyBvbmx5IHZhaWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBjYXRjaHBvaW50IGhhcyB0cmlnZ2VyZWQuICAqLworICBpbnQgIGZvcmtlZF9pbmZlcmlvcl9waWQ7CisgCisgIC8qIEZpbGVuYW1lIG9mIGEgcHJvZ3JhbSB3aG9zZSBleGVjIHRyaWdnZXJlZCB0aGlzIGNhdGNocG9pbnQuICBUaGlzCisgICAgIGZpZWxkIGlzIG9ubHkgdmFpZCBpbW1lZGlhdGVseSBhZnRlciB0aGlzIGNhdGNocG9pbnQgaGFzIHRyaWdnZXJlZC4gICovCisgIGNoYXIgKiAgZXhlY19wYXRobmFtZTsKKyAgCisgIGFzZWN0aW9uICpzZWN0aW9uOworfTsKKwwKKy8qIFRoZSBmb2xsb3dpbmcgc3R1ZmYgaXMgYW4gYWJzdHJhY3QgZGF0YSB0eXBlICJicHN0YXQiICgiYnJlYWtwb2ludCBzdGF0dXMiKS4KKyAgIFRoaXMgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgaGF2ZSBzdG9wcGVkIGF0IGEKKyAgIGJyZWFrcG9pbnQsIGFuZCB3aGF0IHdlIHNob3VsZCBkbyBhYm91dCBpdC4gICovCisKK3R5cGVkZWYgc3RydWN0IGJwc3RhdHMgKmJwc3RhdDsKKworLyogSW50ZXJmYWNlOiAgKi8KKy8qIENsZWFyIGEgYnBzdGF0IHNvIHRoYXQgaXQgc2F5cyB3ZSBhcmUgbm90IGF0IGFueSBicmVha3BvaW50LgorICAgQWxzbyBmcmVlIGFueSBzdG9yYWdlIHRoYXQgaXMgcGFydCBvZiBhIGJwc3RhdC4gICovCitleHRlcm4gdm9pZCBicHN0YXRfY2xlYXIgUEFSQU1TICgoYnBzdGF0ICopKTsKKworLyogUmV0dXJuIGEgY29weSBvZiBhIGJwc3RhdC4gIExpa2UgImJzMSA9IGJzMiIgYnV0IGFsbCBzdG9yYWdlIHRoYXQKKyAgIGlzIHBhcnQgb2YgdGhlIGJwc3RhdCBpcyBjb3BpZWQgYXMgd2VsbC4gICovCitleHRlcm4gYnBzdGF0IGJwc3RhdF9jb3B5IFBBUkFNUyAoKGJwc3RhdCkpOworCitleHRlcm4gYnBzdGF0IGJwc3RhdF9zdG9wX3N0YXR1cyBQQVJBTVMgKChDT1JFX0FERFIgKiwgaW50KSk7CisMCisvKiBUaGlzIGJwc3RhdF93aGF0IHN0dWZmIHRlbGxzIHdhaXRfZm9yX2luZmVyaW9yIHdoYXQgdG8gZG8gd2l0aCBhCisgICBicmVha3BvaW50IChhIGNoYWxsZW5naW5nIHRhc2spLiAgKi8KKworZW51bSBicHN0YXRfd2hhdF9tYWluX2FjdGlvbiB7CisgIC8qIFBlcmZvcm0gdmFyaW91cyBvdGhlciB0ZXN0czsgdGhhdCBpcywgdGhpcyBicHN0YXQgZG9lcyBub3QKKyAgICAgc2F5IHRvIHBlcmZvcm0gYW55IGFjdGlvbiAoZS5nLiBmYWlsZWQgd2F0Y2hwb2ludCBhbmQgbm90aGluZworICAgICBlbHNlKS4gICovCisgIEJQU1RBVF9XSEFUX0tFRVBfQ0hFQ0tJTkcsCisKKyAgLyogUmF0aGVyIHRoYW4gZGlzdGluZ3Vpc2ggYmV0d2VlbiBub2lzeSBhbmQgc2lsZW50IHN0b3BzIGhlcmUsIGl0CisgICAgIG1pZ2h0IGJlIGNsZWFuZXIgdG8gaGF2ZSBicHN0YXRfcHJpbnQgbWFrZSB0aGF0IGRlY2lzaW9uIChhbHNvCisgICAgIHRha2luZyBpbnRvIGFjY291bnQgc3RvcF9wcmludF9mcmFtZSBhbmQgc291cmNlX29ubHkpLiAgQnV0IHRoZQorICAgICBpbXBsaWNhdGlvbnMgYXJlIGEgYml0IHNjYXJ5IChpbnRlcmFjdGlvbiB3aXRoIGF1dG8tZGlzcGxheXMsIGV0Yy4pLAorICAgICBzbyBJIHdvbid0IHRyeSBpdC4gICovCisgICAgIAorICAvKiBTdG9wIHNpbGVudGx5LiAgKi8KKyAgQlBTVEFUX1dIQVRfU1RPUF9TSUxFTlQsCisKKyAgLyogU3RvcCBhbmQgcHJpbnQuICAqLworICBCUFNUQVRfV0hBVF9TVE9QX05PSVNZLAorCisgIC8qIFJlbW92ZSBicmVha3BvaW50cywgc2luZ2xlIHN0ZXAgb25jZSwgdGhlbiBwdXQgdGhlbSBiYWNrIGluIGFuZAorICAgICBnbyBiYWNrIHRvIHdoYXQgd2Ugd2VyZSBkb2luZy4gIEl0J3MgcG9zc2libGUgdGhhdCB0aGlzIHNob3VsZCBiZQorICAgICByZW1vdmVkIGZyb20gdGhlIG1haW5fYWN0aW9uIGFuZCBwdXQgaW50byBhIHNlcGFyYXRlIGZpZWxkLCB0byBtb3JlCisgICAgIGNsZWFubHkgaGFuZGxlIEJQU1RBVF9XSEFUX0NMRUFSX0xPTkdKTVBfUkVTVU1FX1NJTkdMRS4gICovCisgIEJQU1RBVF9XSEFUX1NJTkdMRSwKKworICAvKiBTZXQgbG9uZ2ptcF9yZXN1bWUgYnJlYWtwb2ludCwgcmVtb3ZlIGFsbCBvdGhlciBicmVha3BvaW50cywKKyAgICAgYW5kIGNvbnRpbnVlLiAgVGhlICJyZW1vdmUgYWxsIG90aGVyIGJyZWFrcG9pbnRzIiBwYXJ0IGlzIHJlcXVpcmVkCisgICAgIGlmIHdlIGFyZSBhbHNvIHN0ZXBwaW5nIG92ZXIgYW5vdGhlciBicmVha3BvaW50IGFzIHdlbGwgYXMgZG9pbmcKKyAgICAgdGhlIGxvbmdqbXAgaGFuZGxpbmcuICAqLworICBCUFNUQVRfV0hBVF9TRVRfTE9OR0pNUF9SRVNVTUUsCisKKyAgLyogQ2xlYXIgbG9uZ2ptcF9yZXN1bWUgYnJlYWtwb2ludCwgdGhlbiBoYW5kbGUgYXMKKyAgICAgQlBTVEFUX1dIQVRfS0VFUF9DSEVDS0lORy4gICovCisgIEJQU1RBVF9XSEFUX0NMRUFSX0xPTkdKTVBfUkVTVU1FLAorCisgIC8qIENsZWFyIGxvbmdqbXBfcmVzdW1lIGJyZWFrcG9pbnQsIHRoZW4gaGFuZGxlIGFzIEJQU1RBVF9XSEFUX1NJTkdMRS4gICovCisgIEJQU1RBVF9XSEFUX0NMRUFSX0xPTkdKTVBfUkVTVU1FX1NJTkdMRSwKKworICAvKiBDbGVhciBzdGVwIHJlc3VtZSBicmVha3BvaW50LCBhbmQga2VlcCBjaGVja2luZy4gICovCisgIEJQU1RBVF9XSEFUX1NURVBfUkVTVU1FLAorCisgIC8qIENsZWFyIHRocm91Z2hfc2lndHJhbXAgYnJlYWtwb2ludCwgbXVjayB3aXRoIHRyYXBfZXhwZWN0ZWQsIGFuZCBrZWVwCisgICAgIGNoZWNraW5nLiAgKi8KKyAgQlBTVEFUX1dIQVRfVEhST1VHSF9TSUdUUkFNUCwKKworICAvKiBDaGVjayB0aGUgZHluYW1pYyBsaW5rZXIncyBkYXRhIHN0cnVjdHVyZXMgZm9yIG5ldyBsaWJyYXJpZXMsIHRoZW4KKyAgICAga2VlcCBjaGVja2luZy4gICovCisgIEJQU1RBVF9XSEFUX0NIRUNLX1NITElCUywKKworICAvKiBDaGVjayB0aGUgZHluYW1pYyBsaW5rZXIncyBkYXRhIHN0cnVjdHVyZXMgZm9yIG5ldyBsaWJyYXJpZXMsIHRoZW4KKyAgICAgcmVzdW1lIG91dCBvZiB0aGUgZHluYW1pYyBsaW5rZXIncyBjYWxsYmFjaywgc3RvcCBhbmQgcHJpbnQuICAqLworICBCUFNUQVRfV0hBVF9DSEVDS19TSExJQlNfUkVTVU1FX0ZST01fSE9PSywKKworICAvKiBUaGlzIGlzIGp1c3QgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGVudW1zIHRoZXJlIGFyZS4gICovCisgIEJQU1RBVF9XSEFUX0xBU1QKK307CisKK3N0cnVjdCBicHN0YXRfd2hhdCB7CisgIGVudW0gYnBzdGF0X3doYXRfbWFpbl9hY3Rpb24gbWFpbl9hY3Rpb247CisKKyAgLyogRGlkIHdlIGhpdCBhIGNhbGwgZHVtbXkgYnJlYWtwb2ludD8gIFRoaXMgb25seSBnb2VzIHdpdGggYSBtYWluX2FjdGlvbgorICAgICBvZiBCUFNUQVRfV0hBVF9TVE9QX1NJTEVOVCBvciBCUFNUQVRfV0hBVF9TVE9QX05PSVNZICh0aGUgY29uY2VwdCBvZgorICAgICBjb250aW51aW5nIGZyb20gYSBjYWxsIGR1bW15IHdpdGhvdXQgcG9wcGluZyB0aGUgZnJhbWUgaXMgbm90IGEKKyAgICAgdXNlZnVsIG9uZSkuICAqLworICBpbnQgY2FsbF9kdW1teTsKK307CisKKy8qIFRlbGwgd2hhdCB0byBkbyBhYm91dCB0aGlzIGJwc3RhdC4gICovCitzdHJ1Y3QgYnBzdGF0X3doYXQgYnBzdGF0X3doYXQgUEFSQU1TICgoYnBzdGF0KSk7CisMCisvKiBGaW5kIHRoZSBicHN0YXQgYXNzb2NpYXRlZCB3aXRoIGEgYnJlYWtwb2ludC4gIE5VTEwgb3RoZXJ3aXNlLiAqLworYnBzdGF0IGJwc3RhdF9maW5kX2JyZWFrcG9pbnQgUEFSQU1TICgoYnBzdGF0LCBzdHJ1Y3QgYnJlYWtwb2ludCAqKSk7CisKKy8qIEZpbmQgYSBzdGVwX3Jlc3VtZSBicmVha3BvaW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJwc3RhdC4KKyAgIChJZiB0aGVyZSBhcmUgbXVsdGlwbGUgc3RlcF9yZXN1bWUgYnAncyBvbiB0aGUgbGlzdCwgdGhpcyBmdW5jdGlvbgorICAgd2lsbCBhcmJpdHJhcmlseSBwaWNrIG9uZS4pCisKKyAgIEl0IGlzIGFuIGVycm9yIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGlmIEJQU1RBVCBkb2Vzbid0IGNvbnRhaW4gYQorICAgc3RlcF9yZXN1bWUgYnJlYWtwb2ludC4KKworICAgU2VlIHdhaXRfZm9yX2luZmVyaW9yJ3MgdXNlIG9mIHRoaXMgZnVuY3Rpb24uCisgICAqLworZXh0ZXJuIHN0cnVjdCBicmVha3BvaW50ICoKK2Jwc3RhdF9maW5kX3N0ZXBfcmVzdW1lX2JyZWFrcG9pbnQgUEFSQU1TICgoYnBzdGF0KSk7CisKKy8qIE5vbnplcm8gaWYgYSBzaWduYWwgdGhhdCB3ZSBnb3QgaW4gd2FpdCgpIHdhcyBkdWUgdG8gY2lyY3Vtc3RhbmNlcworICAgZXhwbGFpbmVkIGJ5IHRoZSBCUy4gICovCisvKiBDdXJyZW50bHkgdGhhdCBpcyB0cnVlIGlmIHdlIGhhdmUgaGl0IGEgYnJlYWtwb2ludCwgb3IgaWYgdGhlcmUgaXMKKyAgIGEgd2F0Y2hwb2ludCBlbmFibGVkLiAgKi8KKyNkZWZpbmUgYnBzdGF0X2V4cGxhaW5zX3NpZ25hbChicykgKChicykgIT0gTlVMTCkKKworLyogTm9uemVybyBpZiB3ZSBzaG91bGQgc3RlcCBjb25zdGFudGx5IChlLmcuIHdhdGNocG9pbnRzIG9uIG1hY2hpbmVzCisgICB3aXRob3V0IGhhcmR3YXJlIHN1cHBvcnQpLiAgVGhpcyBpc24ndCByZWxhdGVkIHRvIGEgc3BlY2lmaWMgYnBzdGF0LAorICAganVzdCB0byB0aGluZ3MgbGlrZSB3aGV0aGVyIHdhdGNocG9pbnRzIGFyZSBzZXQuICAqLworZXh0ZXJuIGludCBicHN0YXRfc2hvdWxkX3N0ZXAgUEFSQU1TICgodm9pZCkpOworCisvKiBOb256ZXJvIGlmIHRoZXJlIGFyZSBlbmFibGVkIGhhcmR3YXJlIHdhdGNocG9pbnRzLiAqLworZXh0ZXJuIGludCBicHN0YXRfaGF2ZV9hY3RpdmVfaHdfd2F0Y2hwb2ludHMgUEFSQU1TICgodm9pZCkpOworCisvKiBQcmludCBhIG1lc3NhZ2UgaW5kaWNhdGluZyB3aGF0IGhhcHBlbmVkLiAgUmV0dXJucyBub256ZXJvIHRvCisgICBzYXkgdGhhdCBvbmx5IHRoZSBzb3VyY2UgbGluZSBzaG91bGQgYmUgcHJpbnRlZCBhZnRlciB0aGlzICh6ZXJvCisgICByZXR1cm4gbWVhbnMgcHJpbnQgdGhlIGZyYW1lIGFzIHdlbGwgYXMgdGhlIHNvdXJjZSBsaW5lKS4gICovCitleHRlcm4gaW50IGJwc3RhdF9wcmludCBQQVJBTVMgKChicHN0YXQpKTsKKworLyogUmV0dXJuIHRoZSBicmVha3BvaW50IG51bWJlciBvZiB0aGUgZmlyc3QgYnJlYWtwb2ludCB3ZSBhcmUgc3RvcHBlZAorICAgYXQuICAqQlNQIHVwb24gcmV0dXJuIGlzIGEgYnBzdGF0IHdoaWNoIHBvaW50cyB0byB0aGUgcmVtYWluaW5nCisgICBicmVha3BvaW50cyBzdG9wcGVkIGF0IChidXQgd2hpY2ggaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgZ29vZCBmb3IKKyAgIGFueXRoaW5nIGJ1dCBmdXJ0aGVyIGNhbGxzIHRvIGJwc3RhdF9udW0pLgorICAgUmV0dXJuIDAgaWYgcGFzc2VkIGEgYnBzdGF0IHdoaWNoIGRvZXMgbm90IGluZGljYXRlIGFueSBicmVha3BvaW50cy4gICovCitleHRlcm4gaW50IGJwc3RhdF9udW0gUEFSQU1TICgoYnBzdGF0ICopKTsKKworLyogUGVyZm9ybSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBoYXZpbmcgc3RvcHBlZCBhdCAqQlNQLiAgQWN0dWFsbHksIHdlIGp1c3QKKyAgIHVzZSB0aGlzIGZvciBicmVha3BvaW50IGNvbW1hbmRzLiAgUGVyaGFwcyBvdGhlciBhY3Rpb25zIHdpbGwgZ28gaGVyZQorICAgbGF0ZXIsIGJ1dCB0aGlzIGlzIGV4ZWN1dGVkIGF0IGEgbGF0ZSB0aW1lIChmcm9tIHRoZSBjb21tYW5kIGxvb3ApLiAgKi8KK2V4dGVybiB2b2lkIGJwc3RhdF9kb19hY3Rpb25zIFBBUkFNUyAoKGJwc3RhdCAqKSk7CisKKy8qIE1vZGlmeSBCUyBzbyB0aGF0IHRoZSBhY3Rpb25zIHdpbGwgbm90IGJlIHBlcmZvcm1lZC4gICovCitleHRlcm4gdm9pZCBicHN0YXRfY2xlYXJfYWN0aW9ucyBQQVJBTVMgKChicHN0YXQpKTsKKworLyogR2l2ZW4gYSBicHN0YXQgdGhhdCByZWNvcmRzIHplcm8gb3IgbW9yZSB0cmlnZ2VyZWQgZXZlbnRwb2ludHMsIHRoaXMKKyAgIGZ1bmN0aW9uIHJldHVybnMgYW5vdGhlciBicHN0YXQgd2hpY2ggY29udGFpbnMgb25seSB0aGUgY2F0Y2hwb2ludHMKKyAgIG9uIHRoYXQgZmlyc3QgbGlzdCwgaWYgYW55LgorICAgKi8KK2V4dGVybiB2b2lkIGJwc3RhdF9nZXRfdHJpZ2dlcmVkX2NhdGNocG9pbnRzIFBBUkFNUyAoKGJwc3RhdCwgYnBzdGF0ICopKTsKKyAKKy8qIEltcGxlbWVudGF0aW9uOiAgKi8KK3N0cnVjdCBicHN0YXRzCit7CisgIC8qIExpbmtlZCBsaXN0IGJlY2F1c2UgdGhlcmUgY2FuIGJlIHR3byBicmVha3BvaW50cyBhdCB0aGUKKyAgICAgc2FtZSBwbGFjZSwgYW5kIGEgYnBzdGF0IHJlZmxlY3RzIHRoZSBmYWN0IHRoYXQgYm90aCBoYXZlIGJlZW4gaGl0LiAgKi8KKyAgYnBzdGF0IG5leHQ7CisgIC8qIEJyZWFrcG9pbnQgdGhhdCB3ZSBhcmUgYXQuICAqLworICBzdHJ1Y3QgYnJlYWtwb2ludCAqYnJlYWtwb2ludF9hdDsKKyAgLyogQ29tbWFuZHMgbGVmdCB0byBiZSBkb25lLiAgKi8KKyAgc3RydWN0IGNvbW1hbmRfbGluZSAqY29tbWFuZHM7CisgIC8qIE9sZCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSB3YXRjaHBvaW50LiAgKi8KKyAgdmFsdWVfcHRyIG9sZF92YWw7CisKKyAgLyogTm9uemVybyBpZiB0aGlzIGJyZWFrcG9pbnQgdGVsbHMgdXMgdG8gcHJpbnQgdGhlIGZyYW1lLiAgKi8KKyAgY2hhciBwcmludDsKKworICAvKiBOb256ZXJvIGlmIHRoaXMgYnJlYWtwb2ludCB0ZWxscyB1cyB0byBzdG9wLiAgKi8KKyAgY2hhciBzdG9wOworCisgIC8qIEZ1bmN0aW9uIGNhbGxlZCBieSBicHN0YXRfcHJpbnQgdG8gcHJpbnQgc3R1ZmYgYXNzb2NpYXRlZCB3aXRoCisgICAgIHRoaXMgZWxlbWVudCBvZiB0aGUgYnBzdGF0IGNoYWluLiAgUmV0dXJucyAwIG9yIDEganVzdCBsaWtlCisgICAgIGJwc3RhdF9wcmludCwgb3IgLTEgaWYgaXQgY2FuJ3QgZGVhbCB3aXRoIGl0LiAgKi8KKyAgaW50ICgqcHJpbnRfaXQpIFBBUkFNUygoYnBzdGF0IGJzKSk7Cit9OworCitlbnVtIGluZl9jb250ZXh0Cit7CisgIGluZl9zdGFydGluZywKKyAgaW5mX3J1bm5pbmcsCisgIGluZl9leGl0ZWQKK307CisKKwwKKy8qIFByb3RvdHlwZXMgZm9yIGJyZWFrcG9pbnQtcmVsYXRlZCBmdW5jdGlvbnMuICAqLworCisjaWZkZWYgX19TVERDX18JCS8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBwcm90b3R5cGVzICovCitzdHJ1Y3QgZnJhbWVfaW5mbzsKKyNlbmRpZgorCitleHRlcm4gaW50IGJyZWFrcG9pbnRfaGVyZV9wIFBBUkFNUyAoKENPUkVfQUREUikpOworCitleHRlcm4gaW50IGJyZWFrcG9pbnRfaW5zZXJ0ZWRfaGVyZV9wIFBBUkFNUyAoKENPUkVfQUREUikpOworCitleHRlcm4gaW50IGZyYW1lX2luX2R1bW15IFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworZXh0ZXJuIGludCBicmVha3BvaW50X3RocmVhZF9tYXRjaCBQQVJBTVMgKChDT1JFX0FERFIsIGludCkpOworCitleHRlcm4gdm9pZCB1bnRpbF9icmVha19jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK2V4dGVybiB2b2lkIGJyZWFrcG9pbnRfcmVfc2V0IFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgYnJlYWtwb2ludF9yZV9zZXRfdGhyZWFkIFBBUkFNUyAoKHN0cnVjdCBicmVha3BvaW50ICopKTsKKworZXh0ZXJuIGludCBlcF9pc19leGNlcHRpb25fY2F0Y2hwb2ludCBQQVJBTVMgKChzdHJ1Y3QgYnJlYWtwb2ludCAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgYnJlYWtwb2ludCAqc2V0X21vbWVudGFyeV9icmVha3BvaW50CisgIFBBUkFNUyAoKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUsIHN0cnVjdCBmcmFtZV9pbmZvICosIGVudW0gYnB0eXBlKSk7CisKK2V4dGVybiB2b2lkIHNldF9pZ25vcmVfY291bnQgUEFSQU1TICgoaW50LCBpbnQsIGludCkpOworCitleHRlcm4gdm9pZCBzZXRfZGVmYXVsdF9icmVha3BvaW50IFBBUkFNUyAoKGludCwgQ09SRV9BRERSLCBzdHJ1Y3Qgc3ltdGFiICosIGludCkpOworCitleHRlcm4gdm9pZCBtYXJrX2JyZWFrcG9pbnRzX291dCBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIGJyZWFrcG9pbnRfaW5pdF9pbmZlcmlvciBQQVJBTVMgKChlbnVtIGluZl9jb250ZXh0KSk7CisKK2V4dGVybiB2b2lkIGRlbGV0ZV9icmVha3BvaW50IFBBUkFNUyAoKHN0cnVjdCBicmVha3BvaW50ICopKTsKKworZXh0ZXJuIHZvaWQgYnJlYWtwb2ludF9hdXRvX2RlbGV0ZSBQQVJBTVMgKChicHN0YXQpKTsKKworZXh0ZXJuIHZvaWQgYnJlYWtwb2ludF9jbGVhcl9pZ25vcmVfY291bnRzIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgYnJlYWtfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitleHRlcm4gdm9pZCB0YnJlYWtfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitleHRlcm4gaW50IGluc2VydF9icmVha3BvaW50cyBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBpbnQgcmVtb3ZlX2JyZWFrcG9pbnRzIFBBUkFNUyAoKHZvaWQpKTsKKworLyogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBwaHlzaWNhbGx5IGluc2VydCBldmVudHBvaW50cyBmcm9tIHRoZQorICAgc3BlY2lmaWVkIHRyYWNlZCBpbmZlcmlvciBwcm9jZXNzLCB3aXRob3V0IG1vZGlmeWluZyB0aGUgYnJlYWtwb2ludAorICAgcGFja2FnZSdzIHN0YXRlLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciB0aG9zZSB0YXJnZXRzIHdoaWNoIHN1cHBvcnQKKyAgIGZvbGxvd2luZyB0aGUgcHJvY2Vzc2VzIG9mIGEgZm9yaygpIG9yIHZmb3JrKCkgc3lzdGVtIGNhbGwsIHdoZW4gYm90aAorICAgb2YgdGhlIHJlc3VsdGluZyB0d28gcHJvY2Vzc2VzIGFyZSB0byBiZSBmb2xsb3dlZC4gICovCitleHRlcm4gaW50IHJlYXR0YWNoX2JyZWFrcG9pbnRzIFBBUkFNUyAoKGludCkpOworCisvKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHVwZGF0ZSB0aGUgYnJlYWtwb2ludCBwYWNrYWdlJ3Mgc3RhdGUKKyAgIGFmdGVyIGFuIGV4ZWMoKSBzeXN0ZW0gY2FsbCBoYXMgYmVlbiBleGVjdXRlZC4KKworICAgVGhpcyBmdW5jdGlvbiBjYXVzZXMgdGhlIGZvbGxvd2luZzoKKworICAgICAtIEFsbCBldmVudHBvaW50cyBhcmUgbWFya2VkICJub3QgaW5zZXJ0ZWQiLgorICAgICAtIEFsbCBldmVudHBvaW50cyB3aXRoIGEgc3ltYm9saWMgYWRkcmVzcyBhcmUgcmVzZXQgc3VjaCB0aGF0CisgICAgICAgdGhlIHN5bWJvbGljIGFkZHJlc3MgbXVzdCBiZSByZWV2YWx1YXRlZCBiZWZvcmUgdGhlIGV2ZW50cG9pbnRzCisgICAgICAgY2FuIGJlIHJlaW5zZXJ0ZWQuCisgICAgIC0gVGhlIHNvbGliIGJyZWFrcG9pbnRzIGFyZSBleHBsaWNpdGx5IHJlbW92ZWQgZnJvbSB0aGUgYnJlYWtwb2ludAorICAgICAgIGxpc3QuCisgICAgIC0gQSBzdGVwLXJlc3VtZSBicmVha3BvaW50LCBpZiBhbnksIGlzIGV4cGxpY2l0bHkgcmVtb3ZlZCBmcm9tIHRoZQorICAgICAgIGJyZWFrcG9pbnQgbGlzdC4KKyAgICAgLSBBbGwgZXZlbnRwb2ludHMgd2l0aG91dCBhIHN5bWJvbGljIGFkZHJlc3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUKKyAgICAgICBicmVha3BvaW50IGxpc3QuICovCitleHRlcm4gdm9pZCB1cGRhdGVfYnJlYWtwb2ludHNfYWZ0ZXJfZXhlYyBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcGh5c2ljYWxseSByZW1vdmUgaGFyZHdhcmUgYnJlYWtwb2ludHMKKyAgIGFuZCB3YXRjaHBvaW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgdHJhY2VkIGluZmVyaW9yIHByb2Nlc3MsIHdpdGhvdXQKKyAgIG1vZGlmeWluZyB0aGUgYnJlYWtwb2ludCBwYWNrYWdlJ3Mgc3RhdGUuICBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yCisgICB0aG9zZSB0YXJnZXRzIHdoaWNoIHN1cHBvcnQgZm9sbG93aW5nIHRoZSBwcm9jZXNzZXMgb2YgYSBmb3JrKCkgb3IKKyAgIHZmb3JrKCkgc3lzdGVtIGNhbGwsIHdoZW4gb25lIG9mIHRoZSByZXN1bHRpbmcgdHdvIHByb2Nlc3NlcyBpcyB0bworICAgYmUgZGV0YWNoZWQgYW5kIGFsbG93ZWQgdG8gcnVuIGZyZWUuCisgCisgICBJdCBpcyBhbiBlcnJvciB0byB1c2UgdGhpcyBmdW5jdGlvbiBvbiB0aGUgcHJvY2VzcyB3aG9zZSBpZCBpcworICAgaW5mZXJpb3JfcGlkLiAgKi8KK2V4dGVybiBpbnQgZGV0YWNoX2JyZWFrcG9pbnRzIFBBUkFNUyAoKGludCkpOworIAorZXh0ZXJuIHZvaWQgZW5hYmxlX2xvbmdqbXBfYnJlYWtwb2ludCBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIGRpc2FibGVfbG9uZ2ptcF9icmVha3BvaW50IFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgc2V0X2xvbmdqbXBfcmVzdW1lX2JyZWFrcG9pbnQgUEFSQU1TICgoQ09SRV9BRERSLAorCQkJCQkJICAgc3RydWN0IGZyYW1lX2luZm8gKikpOworLyogVGhlc2UgZnVuY3Rpb25zIHJlc3BlY3RpdmVseSBkaXNhYmxlIG9yIHJlZW5hYmxlIGFsbCBjdXJyZW50bHkKKyAgIGVuYWJsZWQgd2F0Y2hwb2ludHMuICBXaGVuIGRpc2FibGVkLCB0aGUgd2F0Y2hwb2ludHMgYXJlIG1hcmtlZAorICAgY2FsbF9kaXNhYmxlZC4gIFdoZW4gcmVlbmFibGVkLCB0aGV5IGFyZSBtYXJrZWQgZW5hYmxlZC4KKworICAgVGhlIGludGVuZGVkIGNsaWVudCBvZiB0aGVzZSBmdW5jdGlvbnMgaXMgaW5mY21kLmNccnVuX3N0YWNrX2R1bW15LgorCisgICBUaGUgaW5mZXJpb3IgbXVzdCBiZSBzdG9wcGVkLCBhbmQgYWxsIGJyZWFrcG9pbnRzIHJlbW92ZWQsIHdoZW4KKyAgIHRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZC4KKworICAgVGhlIG5lZWQgZm9yIHRoZXNlIGZ1bmN0aW9ucyBpcyB0aGF0IG9uIHNvbWUgdGFyZ2V0cyAoZS5nLiwgSFAtVVgpLAorICAgZ2RiIGlzIHVuYWJsZSB0byB1bndpbmQgdGhyb3VnaCB0aGUgZHVtbXkgZnJhbWUgdGhhdCBpcyBwdXNoZWQgYXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgY2FsbCBjb21tYW5kLiAgV2F0Y2hwb2ludHMgY2FuCisgICBjYXVzZSB0aGUgaW5mZXJpb3IgdG8gc3RvcCBpbiBwbGFjZXMgd2hlcmUgdGhpcyBmcmFtZSBpcyB2aXNpYmxlLAorICAgYW5kIHRoYXQgY2FuIGNhdXNlIGV4ZWN1dGlvbiBjb250cm9sIHRvIGJlY29tZSB2ZXJ5IGNvbmZ1c2VkLgorCisgICBOb3RlIHRoYXQgaWYgYSB1c2VyIHNldHMgYnJlYWtwb2ludHMgaW4gYW4gaW50ZXJhY3RpdmVseSBjYWxsCisgICBmdW5jdGlvbiwgdGhlIGNhbGxfZGlzYWJsZWQgd2F0Y2hwb2ludHMgd2lsbCBoYXZlIGJlZW4gcmVlbmFibGVkCisgICB3aGVuIHRoZSBmaXJzdCBzdWNoIGJyZWFrcG9pbnQgaXMgcmVhY2hlZC4gIEhvd2V2ZXIsIG9uIHRhcmdldHMKKyAgIHRoYXQgYXJlIHVuYWJsZSB0byB1bndpbmQgdGhyb3VnaCB0aGUgY2FsbCBkdW1teSBmcmFtZSwgd2F0Y2hlcworICAgb2Ygc3RhY2stYmFzZWQgc3RvcmFnZSBtYXkgdGhlbiBiZSBkZWxldGVkLCBiZWNhdXNlIGdkYiB3aWxsCisgICBiZWxpZXZlIHRoYXQgdGhlaXIgd2F0Y2hlZCBzdG9yYWdlIGlzIG91dCBvZiBzY29wZS4gIChTaWdoLikgKi8KK2V4dGVybiB2b2lkCitkaXNhYmxlX3dhdGNocG9pbnRzX2JlZm9yZV9pbnRlcmFjdGl2ZV9jYWxsX3N0YXJ0IFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQKK2VuYWJsZV93YXRjaHBvaW50c19hZnRlcl9pbnRlcmFjdGl2ZV9jYWxsX3N0b3AgUEFSQU1TICgodm9pZCkpOworCisgCitleHRlcm4gdm9pZCBjbGVhcl9icmVha3BvaW50X2hpdF9jb3VudHMgUEFSQU1TICgodm9pZCkpOworCisvKiBUaGUgZm9sbG93aW5nIGFyZSBmb3IgZGlzcGxheXMsIHdoaWNoIGFyZW4ndCByZWFsbHkgYnJlYWtwb2ludHMsIGJ1dAorICAgaGVyZSBpcyBhcyBnb29kIGEgcGxhY2UgYXMgYW55IGZvciB0aGVtLiAgKi8KKworZXh0ZXJuIHZvaWQgZGlzYWJsZV9jdXJyZW50X2Rpc3BsYXkgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCBkb19kaXNwbGF5cyBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIGRpc2FibGVfZGlzcGxheSBQQVJBTVMgKChpbnQpKTsKKworZXh0ZXJuIHZvaWQgY2xlYXJfZGlzcGxheXMgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCBkaXNhYmxlX2JyZWFrcG9pbnQgUEFSQU1TICgoc3RydWN0IGJyZWFrcG9pbnQgKikpOworCitleHRlcm4gdm9pZCBlbmFibGVfYnJlYWtwb2ludCBQQVJBTVMgKChzdHJ1Y3QgYnJlYWtwb2ludCAqKSk7CisKK2V4dGVybiB2b2lkIGNyZWF0ZV9zb2xpYl9ldmVudF9icmVha3BvaW50IFBBUkFNUyAoKENPUkVfQUREUikpOworCitleHRlcm4gdm9pZCByZW1vdmVfc29saWJfZXZlbnRfYnJlYWtwb2ludHMgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCBkaXNhYmxlX2JyZWFrcG9pbnRzX2luX3NobGlicyBQQVJBTVMgKChpbnQgc2lsZW50KSk7CisKK2V4dGVybiB2b2lkIHJlX2VuYWJsZV9icmVha3BvaW50c19pbl9zaGxpYnMgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCBjcmVhdGVfc29saWJfbG9hZF9ldmVudF9icmVha3BvaW50IFBBUkFNUyAoKGNoYXIgKiwgaW50LCBjaGFyICosIGNoYXIgKikpOworIAorZXh0ZXJuIHZvaWQgY3JlYXRlX3NvbGliX3VubG9hZF9ldmVudF9icmVha3BvaW50IFBBUkFNUyAoKGNoYXIgKiwgaW50LCBjaGFyICosIGNoYXIgKikpOworIAorZXh0ZXJuIHZvaWQgY3JlYXRlX2ZvcmtfZXZlbnRfY2F0Y2hwb2ludCBQQVJBTVMgKChpbnQsIGNoYXIgKikpOworIAorZXh0ZXJuIHZvaWQgY3JlYXRlX3Zmb3JrX2V2ZW50X2NhdGNocG9pbnQgUEFSQU1TICgoaW50LCBjaGFyICopKTsKKworZXh0ZXJuIHZvaWQgY3JlYXRlX2V4ZWNfZXZlbnRfY2F0Y2hwb2ludCBQQVJBTVMgKChpbnQsIGNoYXIgKikpOworIAorLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIFRSVUUgaWYgZXAgaXMgYSBjYXRjaHBvaW50LiAqLworZXh0ZXJuIGludCBlcF9pc19jYXRjaHBvaW50IFBBUkFNUyAoKHN0cnVjdCBicmVha3BvaW50ICopKTsKKyAKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBUUlVFIGlmIGVwIGlzIGEgY2F0Y2hwb2ludCBvZiBhCisgICBzaGFyZWQgbGlicmFyeSAoYWthIGR5bmFtaWNhbGx5LWxpbmtlZCBsaWJyYXJ5KSBldmVudCwKKyAgIHN1Y2ggYXMgYSBsaWJyYXJ5IGxvYWQgb3IgdW5sb2FkLiAqLworZXh0ZXJuIGludCBlcF9pc19zaGxpYl9jYXRjaHBvaW50IFBBUkFNUyAoKHN0cnVjdCBicmVha3BvaW50ICopKTsKKyAKK2V4dGVybiBzdHJ1Y3QgYnJlYWtwb2ludCAqc2V0X2JyZWFrcG9pbnRfc2FsIFBBUkFNUyAoKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUpKTsKKworI2VuZGlmIC8qICFkZWZpbmVkIChCUkVBS1BPSU5UX0gpICovCmRpZmYgLS1naXQgYS9nZGIvYnVpbGRzeW0uYyBiL2dkYi9idWlsZHN5bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YjY0YmUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvYnVpbGRzeW0uYwpAQCAtMCwwICsxLDExMzAgQEAKKy8qIFN1cHBvcnQgcm91dGluZXMgZm9yIGJ1aWxkaW5nIHN5bWJvbCB0YWJsZXMgaW4gR0RCJ3MgaW50ZXJuYWwgZm9ybWF0LgorICAgQ29weXJpZ2h0IDE5ODYtMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBzdWJyb3V0aW5lcyB1c2VkIGZvciBjcmVhdGluZyBhbmQgYWRkaW5nIHRvCisgICB0aGUgc3ltYm9sIHRhYmxlLiAgVGhlc2Ugcm91dGluZXMgYXJlIGNhbGxlZCBmcm9tIHZhcmlvdXMgc3ltYm9sLQorICAgZmlsZS1yZWFkaW5nIHJvdXRpbmVzLgorCisgICBSb3V0aW5lcyB0byBzdXBwb3J0IHNwZWNpZmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3JtYXRzIChzdGFicywKKyAgIERXQVJGLCBldGMpIGJlbG9uZyBzb21ld2hlcmUgZWxzZS4gKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJvYnN0YWNrLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgkJLyogTmVlZGVkIGZvciAic3RydWN0IGNvbXBsYWludCIgKi8KKyNpbmNsdWRlICJvYmpmaWxlcy5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAiY29tcGxhaW50cy5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKworLyogQXNrIGJ1aWxkc3ltLmggdG8gZGVmaW5lIHRoZSB2YXJzIGl0IG5vcm1hbGx5IGRlY2xhcmVzIGBleHRlcm4nLiAgKi8KKyNkZWZpbmUJRVhURVJOCQkJLyoqLworI2luY2x1ZGUgImJ1aWxkc3ltLmgiCQkvKiBPdXIgb3duIGRlY2xhcmF0aW9ucyAqLworI3VuZGVmCUVYVEVSTgorCisvKiBGb3IgY2xlYW51cF91bmRlZmluZWRfdHlwZXMgYW5kIGZpbmlzaF9nbG9iYWxfc3RhYnMgKHNvbWV3aGF0CisgICBxdWVzdGlvbmFibGUtLXNlZSBjb21tZW50IHdoZXJlIHdlIGNhbGwgdGhlbSkuICAqLworCisjaW5jbHVkZSAic3RhYnNyZWFkLmgiCisKKy8qIExpc3Qgb2YgZnJlZSBgc3RydWN0IHBlbmRpbmcnIHN0cnVjdHVyZXMgZm9yIHJldXNlLiAgKi8KKworc3RhdGljIHN0cnVjdCBwZW5kaW5nICpmcmVlX3BlbmRpbmdzOworCisvKiBOb24temVybyBpZiBzeW10YWIgaGFzIGxpbmUgbnVtYmVyIGluZm8uICBUaGlzIHByZXZlbnRzIGFuCisgICBvdGhlcndpc2UgZW1wdHkgc3ltdGFiIGZyb20gYmVpbmcgdG9zc2VkLiAgKi8KKworc3RhdGljIGludCBoYXZlX2xpbmVfbnVtYmVyczsKKwwKK3N0YXRpYyBpbnQgY29tcGFyZV9saW5lX251bWJlcnMgKGNvbnN0IHZvaWQgKmxuMXAsIGNvbnN0IHZvaWQgKmxuMnApOworDAorCisvKiBJbml0aWFsIHNpemVzIG9mIGRhdGEgc3RydWN0dXJlcy4gIFRoZXNlIGFyZSByZWFsbG9jJ2QgbGFyZ2VyIGlmCisgICBuZWVkZWQsIGFuZCByZWFsbG9jJ2QgZG93biB0byB0aGUgc2l6ZSBhY3R1YWxseSB1c2VkLCB3aGVuCisgICBjb21wbGV0ZWQuICAqLworCisjZGVmaW5lCUlOSVRJQUxfQ09OVEVYVF9TVEFDS19TSVpFCTEwCisjZGVmaW5lCUlOSVRJQUxfTElORV9WRUNUT1JfTEVOR1RICTEwMDAKKwwKKworLyogQ29tcGxhaW50cyBhYm91dCB0aGUgc3ltYm9scyB3ZSBoYXZlIGVuY291bnRlcmVkLiAgKi8KKworc3RydWN0IGNvbXBsYWludCBibG9ja19lbmRfY29tcGxhaW50ID0KK3siYmxvY2sgZW5kIGFkZHJlc3MgbGVzcyB0aGFuIGJsb2NrIHN0YXJ0IGFkZHJlc3MgaW4gJXMgKHBhdGNoZWQgaXQpIiwgMCwgMH07CisKK3N0cnVjdCBjb21wbGFpbnQgYW5vbl9ibG9ja19lbmRfY29tcGxhaW50ID0KK3siYmxvY2sgZW5kIGFkZHJlc3MgMHglbHggbGVzcyB0aGFuIGJsb2NrIHN0YXJ0IGFkZHJlc3MgMHglbHggKHBhdGNoZWQgaXQpIiwgMCwgMH07CisKK3N0cnVjdCBjb21wbGFpbnQgaW5uZXJibG9ja19jb21wbGFpbnQgPQoreyJpbm5lciBibG9jayBub3QgaW5zaWRlIG91dGVyIGJsb2NrIGluICVzIiwgMCwgMH07CisKK3N0cnVjdCBjb21wbGFpbnQgaW5uZXJibG9ja19hbm9uX2NvbXBsYWludCA9Cit7ImlubmVyIGJsb2NrICgweCVseC0weCVseCkgbm90IGluc2lkZSBvdXRlciBibG9jayAoMHglbHgtMHglbHgpIiwgMCwgMH07CisKK3N0cnVjdCBjb21wbGFpbnQgYmxvY2t2ZWN0b3JfY29tcGxhaW50ID0KK3siYmxvY2sgYXQgMHglbHggb3V0IG9mIG9yZGVyIiwgMCwgMH07CisMCisvKiBtYWludGFpbiB0aGUgbGlzdHMgb2Ygc3ltYm9scyBhbmQgYmxvY2tzICovCisKKy8qIEFkZCBhIHN5bWJvbCB0byBvbmUgb2YgdGhlIGxpc3RzIG9mIHN5bWJvbHMuICAqLworCit2b2lkCithZGRfc3ltYm9sX3RvX2xpc3QgKHN0cnVjdCBzeW1ib2wgKnN5bWJvbCwgc3RydWN0IHBlbmRpbmcgKipsaXN0aGVhZCkKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHBlbmRpbmcgKmxpbms7CisKKyAgLyogSWYgdGhpcyBpcyBhbiBhbGlhcyBmb3IgYW5vdGhlciBzeW1ib2wsIGRvbid0IGFkZCBpdC4gICovCisgIGlmIChzeW1ib2wtPmdpbmZvLm5hbWUgJiYgc3ltYm9sLT5naW5mby5uYW1lWzBdID09ICcjJykKKyAgICByZXR1cm47CisKKyAgLyogV2Uga2VlcCBQRU5ESU5HU0laRSBzeW1ib2xzIGluIGVhY2ggbGluayBvZiB0aGUgbGlzdC4gSWYgd2UKKyAgICAgZG9uJ3QgaGF2ZSBhIGxpbmsgd2l0aCByb29tIGluIGl0LCBhZGQgYSBuZXcgbGluay4gICovCisgIGlmICgqbGlzdGhlYWQgPT0gTlVMTCB8fCAoKmxpc3RoZWFkKS0+bnN5bXMgPT0gUEVORElOR1NJWkUpCisgICAgeworICAgICAgaWYgKGZyZWVfcGVuZGluZ3MpCisJeworCSAgbGluayA9IGZyZWVfcGVuZGluZ3M7CisJICBmcmVlX3BlbmRpbmdzID0gbGluay0+bmV4dDsKKwl9CisgICAgICBlbHNlCisJeworCSAgbGluayA9IChzdHJ1Y3QgcGVuZGluZyAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBwZW5kaW5nKSk7CisJfQorCisgICAgICBsaW5rLT5uZXh0ID0gKmxpc3RoZWFkOworICAgICAgKmxpc3RoZWFkID0gbGluazsKKyAgICAgIGxpbmstPm5zeW1zID0gMDsKKyAgICB9CisKKyAgKCpsaXN0aGVhZCktPnN5bWJvbFsoKmxpc3RoZWFkKS0+bnN5bXMrK10gPSBzeW1ib2w7Cit9CisKKy8qIEZpbmQgYSBzeW1ib2wgbmFtZWQgTkFNRSBvbiBhIExJU1QuICBOQU1FIG5lZWQgbm90IGJlCisgICAnXDAnLXRlcm1pbmF0ZWQ7IExFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBuYW1lLiAgKi8KKworc3RydWN0IHN5bWJvbCAqCitmaW5kX3N5bWJvbF9pbl9saXN0IChzdHJ1Y3QgcGVuZGluZyAqbGlzdCwgY2hhciAqbmFtZSwgaW50IGxlbmd0aCkKK3sKKyAgaW50IGo7CisgIGNoYXIgKnBwOworCisgIHdoaWxlIChsaXN0ICE9IE5VTEwpCisgICAgeworICAgICAgZm9yIChqID0gbGlzdC0+bnN5bXM7IC0taiA+PSAwOykKKwl7CisJICBwcCA9IFNZTUJPTF9OQU1FIChsaXN0LT5zeW1ib2xbal0pOworCSAgaWYgKCpwcCA9PSAqbmFtZSAmJiBzdHJuY21wIChwcCwgbmFtZSwgbGVuZ3RoKSA9PSAwICYmCisJICAgICAgcHBbbGVuZ3RoXSA9PSAnXDAnKQorCSAgICB7CisJICAgICAgcmV0dXJuIChsaXN0LT5zeW1ib2xbal0pOworCSAgICB9CisJfQorICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgfQorICByZXR1cm4gKE5VTEwpOworfQorCisvKiBBdCBlbmQgb2YgcmVhZGluZyBzeW1zLCBvciBpbiBjYXNlIG9mIHF1aXQsIHJlYWxseSBmcmVlIGFzIG1hbnkKKyAgIGBzdHJ1Y3QgcGVuZGluZydzIGFzIHdlIGNhbiBlYXNpbHkgZmluZC4gKi8KKworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK3JlYWxseV9mcmVlX3BlbmRpbmdzIChpbnQgZm9vKQoreworICBzdHJ1Y3QgcGVuZGluZyAqbmV4dCwgKm5leHQxOworCisgIGZvciAobmV4dCA9IGZyZWVfcGVuZGluZ3M7IG5leHQ7IG5leHQgPSBuZXh0MSkKKyAgICB7CisgICAgICBuZXh0MSA9IG5leHQtPm5leHQ7CisgICAgICBmcmVlICgodm9pZCAqKSBuZXh0KTsKKyAgICB9CisgIGZyZWVfcGVuZGluZ3MgPSBOVUxMOworCisgIGZyZWVfcGVuZGluZ19ibG9ja3MgKCk7CisKKyAgZm9yIChuZXh0ID0gZmlsZV9zeW1ib2xzOyBuZXh0ICE9IE5VTEw7IG5leHQgPSBuZXh0MSkKKyAgICB7CisgICAgICBuZXh0MSA9IG5leHQtPm5leHQ7CisgICAgICBmcmVlICgodm9pZCAqKSBuZXh0KTsKKyAgICB9CisgIGZpbGVfc3ltYm9scyA9IE5VTEw7CisKKyAgZm9yIChuZXh0ID0gZ2xvYmFsX3N5bWJvbHM7IG5leHQgIT0gTlVMTDsgbmV4dCA9IG5leHQxKQorICAgIHsKKyAgICAgIG5leHQxID0gbmV4dC0+bmV4dDsKKyAgICAgIGZyZWUgKCh2b2lkICopIG5leHQpOworICAgIH0KKyAgZ2xvYmFsX3N5bWJvbHMgPSBOVUxMOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkaXNjYXJkIGFueSBwZW5kaW5nIGJsb2Nrcy4gKi8KKwordm9pZAorZnJlZV9wZW5kaW5nX2Jsb2NrcyAodm9pZCkKK3sKKyNpZiAwCQkJCS8qIE5vdyB3ZSBtYWtlIHRoZSBsaW5rcyBpbiB0aGUKKwkJCQkgICBzeW1ib2xfb2JzdGFjaywgc28gZG9uJ3QgZnJlZQorCQkJCSAgIHRoZW0uICAqLworICBzdHJ1Y3QgcGVuZGluZ19ibG9jayAqYm5leHQsICpibmV4dDE7CisKKyAgZm9yIChibmV4dCA9IHBlbmRpbmdfYmxvY2tzOyBibmV4dDsgYm5leHQgPSBibmV4dDEpCisgICAgeworICAgICAgYm5leHQxID0gYm5leHQtPm5leHQ7CisgICAgICBmcmVlICgodm9pZCAqKSBibmV4dCk7CisgICAgfQorI2VuZGlmCisgIHBlbmRpbmdfYmxvY2tzID0gTlVMTDsKK30KKworLyogVGFrZSBvbmUgb2YgdGhlIGxpc3RzIG9mIHN5bWJvbHMgYW5kIG1ha2UgYSBibG9jayBmcm9tIGl0LiAgS2VlcAorICAgdGhlIG9yZGVyIHRoZSBzeW1ib2xzIGhhdmUgaW4gdGhlIGxpc3QgKHJldmVyc2VkIGZyb20gdGhlIGlucHV0CisgICBmaWxlKS4gIFB1dCB0aGUgYmxvY2sgb24gdGhlIGxpc3Qgb2YgcGVuZGluZyBibG9ja3MuICAqLworCit2b2lkCitmaW5pc2hfYmxvY2sgKHN0cnVjdCBzeW1ib2wgKnN5bWJvbCwgc3RydWN0IHBlbmRpbmcgKipsaXN0aGVhZCwKKwkgICAgICBzdHJ1Y3QgcGVuZGluZ19ibG9jayAqb2xkX2Jsb2NrcywKKwkgICAgICBDT1JFX0FERFIgc3RhcnQsIENPUkVfQUREUiBlbmQsCisJICAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGUpCit7CisgIHJlZ2lzdGVyIHN0cnVjdCBwZW5kaW5nICpuZXh0LCAqbmV4dDE7CisgIHJlZ2lzdGVyIHN0cnVjdCBibG9jayAqYmxvY2s7CisgIHJlZ2lzdGVyIHN0cnVjdCBwZW5kaW5nX2Jsb2NrICpwYmxvY2s7CisgIHN0cnVjdCBwZW5kaW5nX2Jsb2NrICpvcGJsb2NrOworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgaW50IGo7CisKKyAgLyogQ291bnQgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBvZiBzeW1ib2xzLiAgKi8KKworICBmb3IgKG5leHQgPSAqbGlzdGhlYWQsIGkgPSAwOworICAgICAgIG5leHQ7CisgICAgICAgaSArPSBuZXh0LT5uc3ltcywgbmV4dCA9IG5leHQtPm5leHQpCisgICAgeworICAgICAgLyogRU1QVFkgKi8gOworICAgIH0KKworICBibG9jayA9IChzdHJ1Y3QgYmxvY2sgKikgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrLAorICAgIChzaXplb2YgKHN0cnVjdCBibG9jaykgKyAoKGkgLSAxKSAqIHNpemVvZiAoc3RydWN0IHN5bWJvbCAqKSkpKTsKKworICAvKiBDb3B5IHRoZSBzeW1ib2xzIGludG8gdGhlIGJsb2NrLiAgKi8KKworICBCTE9DS19OU1lNUyAoYmxvY2spID0gaTsKKyAgZm9yIChuZXh0ID0gKmxpc3RoZWFkOyBuZXh0OyBuZXh0ID0gbmV4dC0+bmV4dCkKKyAgICB7CisgICAgICBmb3IgKGogPSBuZXh0LT5uc3ltcyAtIDE7IGogPj0gMDsgai0tKQorCXsKKwkgIEJMT0NLX1NZTSAoYmxvY2ssIC0taSkgPSBuZXh0LT5zeW1ib2xbal07CisJfQorICAgIH0KKworICBCTE9DS19TVEFSVCAoYmxvY2spID0gc3RhcnQ7CisgIEJMT0NLX0VORCAoYmxvY2spID0gZW5kOworICAvKiBTdXBlcmJsb2NrIGZpbGxlZCBpbiB3aGVuIGNvbnRhaW5pbmcgYmxvY2sgaXMgbWFkZSAqLworICBCTE9DS19TVVBFUkJMT0NLIChibG9jaykgPSBOVUxMOworCisgIEJMT0NLX0dDQ19DT01QSUxFRCAoYmxvY2spID0gcHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb247CisKKyAgLyogUHV0IHRoZSBibG9jayBpbiBhcyB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB0aGF0IG5hbWVzIGl0LiAgKi8KKworICBpZiAoc3ltYm9sKQorICAgIHsKKyAgICAgIHN0cnVjdCB0eXBlICpmdHlwZSA9IFNZTUJPTF9UWVBFIChzeW1ib2wpOworICAgICAgU1lNQk9MX0JMT0NLX1ZBTFVFIChzeW1ib2wpID0gYmxvY2s7CisgICAgICBCTE9DS19GVU5DVElPTiAoYmxvY2spID0gc3ltYm9sOworCisgICAgICBpZiAoVFlQRV9ORklFTERTIChmdHlwZSkgPD0gMCkKKwl7CisJICAvKiBObyBwYXJhbWV0ZXIgdHlwZSBpbmZvcm1hdGlvbiBpcyByZWNvcmRlZCB3aXRoIHRoZQorCSAgICAgZnVuY3Rpb24ncyB0eXBlLiAgU2V0IHRoYXQgZnJvbSB0aGUgdHlwZSBvZiB0aGUKKwkgICAgIHBhcmFtZXRlciBzeW1ib2xzLiAqLworCSAgaW50IG5wYXJhbXMgPSAwLCBpcGFyYW1zOworCSAgc3RydWN0IHN5bWJvbCAqc3ltOworCSAgZm9yIChpID0gMDsgaSA8IEJMT0NLX05TWU1TIChibG9jayk7IGkrKykKKwkgICAgeworCSAgICAgIHN5bSA9IEJMT0NLX1NZTSAoYmxvY2ssIGkpOworCSAgICAgIHN3aXRjaCAoU1lNQk9MX0NMQVNTIChzeW0pKQorCQl7CisJCWNhc2UgTE9DX0FSRzoKKwkJY2FzZSBMT0NfUkVGX0FSRzoKKwkJY2FzZSBMT0NfUkVHUEFSTToKKwkJY2FzZSBMT0NfUkVHUEFSTV9BRERSOgorCQljYXNlIExPQ19CQVNFUkVHX0FSRzoKKwkJY2FzZSBMT0NfTE9DQUxfQVJHOgorCQkgIG5wYXJhbXMrKzsKKwkJICBicmVhazsKKwkJY2FzZSBMT0NfVU5ERUY6CisJCWNhc2UgTE9DX0NPTlNUOgorCQljYXNlIExPQ19TVEFUSUM6CisJCWNhc2UgTE9DX0lORElSRUNUOgorCQljYXNlIExPQ19SRUdJU1RFUjoKKwkJY2FzZSBMT0NfTE9DQUw6CisJCWNhc2UgTE9DX1RZUEVERUY6CisJCWNhc2UgTE9DX0xBQkVMOgorCQljYXNlIExPQ19CTE9DSzoKKwkJY2FzZSBMT0NfQ09OU1RfQllURVM6CisJCWNhc2UgTE9DX0JBU0VSRUc6CisJCWNhc2UgTE9DX1VOUkVTT0xWRUQ6CisJCWNhc2UgTE9DX09QVElNSVpFRF9PVVQ6CisJCWRlZmF1bHQ6CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgaWYgKG5wYXJhbXMgPiAwKQorCSAgICB7CisJICAgICAgVFlQRV9ORklFTERTIChmdHlwZSkgPSBucGFyYW1zOworCSAgICAgIFRZUEVfRklFTERTIChmdHlwZSkgPSAoc3RydWN0IGZpZWxkICopCisJCVRZUEVfQUxMT0MgKGZ0eXBlLCBucGFyYW1zICogc2l6ZW9mIChzdHJ1Y3QgZmllbGQpKTsKKworCSAgICAgIGZvciAoaSA9IGlwYXJhbXMgPSAwOyBpcGFyYW1zIDwgbnBhcmFtczsgaSsrKQorCQl7CisJCSAgc3ltID0gQkxPQ0tfU1lNIChibG9jaywgaSk7CisJCSAgc3dpdGNoIChTWU1CT0xfQ0xBU1MgKHN5bSkpCisJCSAgICB7CisJCSAgICBjYXNlIExPQ19BUkc6CisJCSAgICBjYXNlIExPQ19SRUZfQVJHOgorCQkgICAgY2FzZSBMT0NfUkVHUEFSTToKKwkJICAgIGNhc2UgTE9DX1JFR1BBUk1fQUREUjoKKwkJICAgIGNhc2UgTE9DX0JBU0VSRUdfQVJHOgorCQkgICAgY2FzZSBMT0NfTE9DQUxfQVJHOgorCQkgICAgICBUWVBFX0ZJRUxEX1RZUEUgKGZ0eXBlLCBpcGFyYW1zKSA9IFNZTUJPTF9UWVBFIChzeW0pOworCQkgICAgICBpcGFyYW1zKys7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSBMT0NfVU5ERUY6CisJCSAgICBjYXNlIExPQ19DT05TVDoKKwkJICAgIGNhc2UgTE9DX1NUQVRJQzoKKwkJICAgIGNhc2UgTE9DX0lORElSRUNUOgorCQkgICAgY2FzZSBMT0NfUkVHSVNURVI6CisJCSAgICBjYXNlIExPQ19MT0NBTDoKKwkJICAgIGNhc2UgTE9DX1RZUEVERUY6CisJCSAgICBjYXNlIExPQ19MQUJFTDoKKwkJICAgIGNhc2UgTE9DX0JMT0NLOgorCQkgICAgY2FzZSBMT0NfQ09OU1RfQllURVM6CisJCSAgICBjYXNlIExPQ19CQVNFUkVHOgorCQkgICAgY2FzZSBMT0NfVU5SRVNPTFZFRDoKKwkJICAgIGNhc2UgTE9DX09QVElNSVpFRF9PVVQ6CisJCSAgICBkZWZhdWx0OgorCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEJMT0NLX0ZVTkNUSU9OIChibG9jaykgPSBOVUxMOworICAgIH0KKworICAvKiBOb3cgImZyZWUiIHRoZSBsaW5rcyBvZiB0aGUgbGlzdCwgYW5kIGVtcHR5IHRoZSBsaXN0LiAgKi8KKworICBmb3IgKG5leHQgPSAqbGlzdGhlYWQ7IG5leHQ7IG5leHQgPSBuZXh0MSkKKyAgICB7CisgICAgICBuZXh0MSA9IG5leHQtPm5leHQ7CisgICAgICBuZXh0LT5uZXh0ID0gZnJlZV9wZW5kaW5nczsKKyAgICAgIGZyZWVfcGVuZGluZ3MgPSBuZXh0OworICAgIH0KKyAgKmxpc3RoZWFkID0gTlVMTDsKKworI2lmIDEKKyAgLyogQ2hlY2sgdG8gYmUgc3VyZSB0aGF0IHRoZSBibG9ja3MgaGF2ZSBhbiBlbmQgYWRkcmVzcyB0aGF0IGlzCisgICAgIGdyZWF0ZXIgdGhhbiBzdGFydGluZyBhZGRyZXNzICovCisKKyAgaWYgKEJMT0NLX0VORCAoYmxvY2spIDwgQkxPQ0tfU1RBUlQgKGJsb2NrKSkKKyAgICB7CisgICAgICBpZiAoc3ltYm9sKQorCXsKKwkgIGNvbXBsYWluICgmYmxvY2tfZW5kX2NvbXBsYWludCwgU1lNQk9MX1NPVVJDRV9OQU1FIChzeW1ib2wpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgY29tcGxhaW4gKCZhbm9uX2Jsb2NrX2VuZF9jb21wbGFpbnQsIEJMT0NLX0VORCAoYmxvY2spLCBCTE9DS19TVEFSVCAoYmxvY2spKTsKKwl9CisgICAgICAvKiBCZXR0ZXIgdGhhbiBub3RoaW5nICovCisgICAgICBCTE9DS19FTkQgKGJsb2NrKSA9IEJMT0NLX1NUQVJUIChibG9jayk7CisgICAgfQorI2VuZGlmCisKKyAgLyogSW5zdGFsbCB0aGlzIGJsb2NrIGFzIHRoZSBzdXBlcmJsb2NrIG9mIGFsbCBibG9ja3MgbWFkZSBzaW5jZSB0aGUKKyAgICAgc3RhcnQgb2YgdGhpcyBzY29wZSB0aGF0IGRvbid0IGhhdmUgc3VwZXJibG9ja3MgeWV0LiAgKi8KKworICBvcGJsb2NrID0gTlVMTDsKKyAgZm9yIChwYmxvY2sgPSBwZW5kaW5nX2Jsb2NrczsgcGJsb2NrICE9IG9sZF9ibG9ja3M7IHBibG9jayA9IHBibG9jay0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoQkxPQ0tfU1VQRVJCTE9DSyAocGJsb2NrLT5ibG9jaykgPT0gTlVMTCkKKwl7CisjaWYgMQorCSAgLyogQ2hlY2sgdG8gYmUgc3VyZSB0aGUgYmxvY2tzIGFyZSBuZXN0ZWQgYXMgd2UgcmVjZWl2ZQorCSAgICAgdGhlbS4gSWYgdGhlIGNvbXBpbGVyL2Fzc2VtYmxlci9saW5rZXIgd29yaywgdGhpcyBqdXN0CisJICAgICBidXJucyBhIHNtYWxsIGFtb3VudCBvZiB0aW1lLiAgKi8KKwkgIGlmIChCTE9DS19TVEFSVCAocGJsb2NrLT5ibG9jaykgPCBCTE9DS19TVEFSVCAoYmxvY2spIHx8CisJICAgICAgQkxPQ0tfRU5EIChwYmxvY2stPmJsb2NrKSA+IEJMT0NLX0VORCAoYmxvY2spKQorCSAgICB7CisJICAgICAgaWYgKHN5bWJvbCkKKwkJeworCQkgIGNvbXBsYWluICgmaW5uZXJibG9ja19jb21wbGFpbnQsCisJCQkgICAgU1lNQk9MX1NPVVJDRV9OQU1FIChzeW1ib2wpKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGNvbXBsYWluICgmaW5uZXJibG9ja19hbm9uX2NvbXBsYWludCwgQkxPQ0tfU1RBUlQgKHBibG9jay0+YmxvY2spLAorCQkgICAgIEJMT0NLX0VORCAocGJsb2NrLT5ibG9jayksIEJMT0NLX1NUQVJUIChibG9jayksCisJCQkgICAgQkxPQ0tfRU5EIChibG9jaykpOworCQl9CisJICAgICAgaWYgKEJMT0NLX1NUQVJUIChwYmxvY2stPmJsb2NrKSA8IEJMT0NLX1NUQVJUIChibG9jaykpCisJCUJMT0NLX1NUQVJUIChwYmxvY2stPmJsb2NrKSA9IEJMT0NLX1NUQVJUIChibG9jayk7CisJICAgICAgaWYgKEJMT0NLX0VORCAocGJsb2NrLT5ibG9jaykgPiBCTE9DS19FTkQgKGJsb2NrKSkKKwkJQkxPQ0tfRU5EIChwYmxvY2stPmJsb2NrKSA9IEJMT0NLX0VORCAoYmxvY2spOworCSAgICB9CisjZW5kaWYKKwkgIEJMT0NLX1NVUEVSQkxPQ0sgKHBibG9jay0+YmxvY2spID0gYmxvY2s7CisJfQorICAgICAgb3BibG9jayA9IHBibG9jazsKKyAgICB9CisKKyAgcmVjb3JkX3BlbmRpbmdfYmxvY2sgKG9iamZpbGUsIGJsb2NrLCBvcGJsb2NrKTsKK30KKworLyogUmVjb3JkIEJMT0NLIG9uIHRoZSBsaXN0IG9mIGFsbCBibG9ja3MgaW4gdGhlIGZpbGUuICBQdXQgaXQgYWZ0ZXIKKyAgIE9QQkxPQ0ssIG9yIGF0IHRoZSBiZWdpbm5pbmcgaWYgb3BibG9jayBpcyBOVUxMLiAgVGhpcyBwdXRzIHRoZQorICAgYmxvY2sgaW4gdGhlIGxpc3QgYWZ0ZXIgYWxsIGl0cyBzdWJibG9ja3MuCisKKyAgIEFsbG9jYXRlIHRoZSBwZW5kaW5nIGJsb2NrIHN0cnVjdCBpbiB0aGUgc3ltYm9sX29ic3RhY2sgdG8gc2F2ZQorICAgdGltZS4gIFRoaXMgd2FzdGVzIGEgbGl0dGxlIHNwYWNlLiAgRklYTUU6IElzIGl0IHdvcnRoIGl0PyAgKi8KKwordm9pZAorcmVjb3JkX3BlbmRpbmdfYmxvY2sgKHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlLCBzdHJ1Y3QgYmxvY2sgKmJsb2NrLAorCQkgICAgICBzdHJ1Y3QgcGVuZGluZ19ibG9jayAqb3BibG9jaykKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHBlbmRpbmdfYmxvY2sgKnBibG9jazsKKworICBwYmxvY2sgPSAoc3RydWN0IHBlbmRpbmdfYmxvY2sgKikKKyAgICBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssIHNpemVvZiAoc3RydWN0IHBlbmRpbmdfYmxvY2spKTsKKyAgcGJsb2NrLT5ibG9jayA9IGJsb2NrOworICBpZiAob3BibG9jaykKKyAgICB7CisgICAgICBwYmxvY2stPm5leHQgPSBvcGJsb2NrLT5uZXh0OworICAgICAgb3BibG9jay0+bmV4dCA9IHBibG9jazsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwYmxvY2stPm5leHQgPSBwZW5kaW5nX2Jsb2NrczsKKyAgICAgIHBlbmRpbmdfYmxvY2tzID0gcGJsb2NrOworICAgIH0KK30KKworLyogTm90ZSB0aGF0IHRoaXMgaXMgb25seSB1c2VkIGluIHRoaXMgZmlsZSBhbmQgaW4gZHN0cmVhZC5jLCB3aGljaAorICAgc2hvdWxkIGJlIGZpeGVkIHRvIG5vdCBuZWVkIGRpcmVjdCBhY2Nlc3MgdG8gdGhpcyBmdW5jdGlvbi4gIFdoZW4KKyAgIHRoYXQgaXMgZG9uZSwgaXQgY2FuIGJlIG1hZGUgc3RhdGljIGFnYWluLiAqLworCitzdHJ1Y3QgYmxvY2t2ZWN0b3IgKgorbWFrZV9ibG9ja3ZlY3RvciAoc3RydWN0IG9iamZpbGUgKm9iamZpbGUpCit7CisgIHJlZ2lzdGVyIHN0cnVjdCBwZW5kaW5nX2Jsb2NrICpuZXh0OworICByZWdpc3RlciBzdHJ1Y3QgYmxvY2t2ZWN0b3IgKmJsb2NrdmVjdG9yOworICByZWdpc3RlciBpbnQgaTsKKworICAvKiBDb3VudCB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IG9mIGJsb2Nrcy4gICovCisKKyAgZm9yIChuZXh0ID0gcGVuZGluZ19ibG9ja3MsIGkgPSAwOyBuZXh0OyBuZXh0ID0gbmV4dC0+bmV4dCwgaSsrKQorICAgIHs7CisgICAgfQorCisgIGJsb2NrdmVjdG9yID0gKHN0cnVjdCBibG9ja3ZlY3RvciAqKQorICAgIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywKKwkJICAgKHNpemVvZiAoc3RydWN0IGJsb2NrdmVjdG9yKQorCQkgICAgKyAoaSAtIDEpICogc2l6ZW9mIChzdHJ1Y3QgYmxvY2sgKikpKTsKKworICAvKiBDb3B5IHRoZSBibG9ja3MgaW50byB0aGUgYmxvY2t2ZWN0b3IuIFRoaXMgaXMgZG9uZSBpbiByZXZlcnNlCisgICAgIG9yZGVyLCB3aGljaCBoYXBwZW5zIHRvIHB1dCB0aGUgYmxvY2tzIGludG8gdGhlIHByb3BlciBvcmRlcgorICAgICAoYXNjZW5kaW5nIHN0YXJ0aW5nIGFkZHJlc3MpLiBmaW5pc2hfYmxvY2sgaGFzIGhhaXIgdG8gaW5zZXJ0CisgICAgIGVhY2ggYmxvY2sgaW50byB0aGUgbGlzdCBhZnRlciBpdHMgc3ViYmxvY2tzIGluIG9yZGVyIHRvIG1ha2UKKyAgICAgc3VyZSB0aGlzIGlzIHRydWUuICAqLworCisgIEJMT0NLVkVDVE9SX05CTE9DS1MgKGJsb2NrdmVjdG9yKSA9IGk7CisgIGZvciAobmV4dCA9IHBlbmRpbmdfYmxvY2tzOyBuZXh0OyBuZXh0ID0gbmV4dC0+bmV4dCkKKyAgICB7CisgICAgICBCTE9DS1ZFQ1RPUl9CTE9DSyAoYmxvY2t2ZWN0b3IsIC0taSkgPSBuZXh0LT5ibG9jazsKKyAgICB9CisKKyNpZiAwCQkJCS8qIE5vdyB3ZSBtYWtlIHRoZSBsaW5rcyBpbiB0aGUKKwkJCQkgICBvYnN0YWNrLCBzbyBkb24ndCBmcmVlIHRoZW0uICAqLworICAvKiBOb3cgZnJlZSB0aGUgbGlua3Mgb2YgdGhlIGxpc3QsIGFuZCBlbXB0eSB0aGUgbGlzdC4gICovCisKKyAgZm9yIChuZXh0ID0gcGVuZGluZ19ibG9ja3M7IG5leHQ7IG5leHQgPSBuZXh0MSkKKyAgICB7CisgICAgICBuZXh0MSA9IG5leHQtPm5leHQ7CisgICAgICBmcmVlIChuZXh0KTsKKyAgICB9CisjZW5kaWYKKyAgcGVuZGluZ19ibG9ja3MgPSBOVUxMOworCisjaWYgMQkJCQkvKiBGSVhNRSwgc2h1dCB0aGlzIG9mZiBhZnRlciBhIHdoaWxlCisJCQkJICAgdG8gc3BlZWQgdXAgc3ltYm9sIHJlYWRpbmcuICAqLworICAvKiBTb21lIGNvbXBpbGVycyBvdXRwdXQgYmxvY2tzIGluIHRoZSB3cm9uZyBvcmRlciwgYnV0IHdlIGRlcGVuZCBvbgorICAgICB0aGVpciBiZWluZyBpbiB0aGUgcmlnaHQgb3JkZXIgc28gd2UgY2FuIGJpbmFyeSBzZWFyY2guIENoZWNrIHRoZQorICAgICBvcmRlciBhbmQgbW9hbiBhYm91dCBpdC4gIEZJWE1FLiAgKi8KKyAgaWYgKEJMT0NLVkVDVE9SX05CTE9DS1MgKGJsb2NrdmVjdG9yKSA+IDEpCisgICAgeworICAgICAgZm9yIChpID0gMTsgaSA8IEJMT0NLVkVDVE9SX05CTE9DS1MgKGJsb2NrdmVjdG9yKTsgaSsrKQorCXsKKwkgIGlmIChCTE9DS19TVEFSVCAoQkxPQ0tWRUNUT1JfQkxPQ0sgKGJsb2NrdmVjdG9yLCBpIC0gMSkpCisJICAgICAgPiBCTE9DS19TVEFSVCAoQkxPQ0tWRUNUT1JfQkxPQ0sgKGJsb2NrdmVjdG9yLCBpKSkpCisJICAgIHsKKworCSAgICAgIC8qIEZJWE1FLTMyeDY0OiBsb3NlcyBpZiBDT1JFX0FERFIgZG9lc24ndCBmaXQgaW4gYQorCSAgICAgICAgIGxvbmcuICBQb3NzaWJsZSBzb2x1dGlvbnMgaW5jbHVkZSBhIHZlcnNpb24gb2YKKwkgICAgICAgICBjb21wbGFpbiB3aGljaCB0YWtlcyBhIGNhbGxiYWNrLCBhCisJICAgICAgICAgc3ByaW50Zl9hZGRyZXNzX251bWVyaWMgdG8gbWF0Y2gKKwkgICAgICAgICBwcmludF9hZGRyZXNzX251bWVyaWMsIG9yIGEgd2F5IHRvIHNldCB1cCBhIEdEQl9GSUxFCisJICAgICAgICAgd2hpY2ggY2F1c2VzIHNwcmludGYgcmF0aGVyIHRoYW4gZnByaW50ZiB0byBiZQorCSAgICAgICAgIGNhbGxlZC4gICovCisKKwkgICAgICBjb21wbGFpbiAoJmJsb2NrdmVjdG9yX2NvbXBsYWludCwKKwkJCSh1bnNpZ25lZCBsb25nKSBCTE9DS19TVEFSVCAoQkxPQ0tWRUNUT1JfQkxPQ0sgKGJsb2NrdmVjdG9yLCBpKSkpOworCSAgICB9CisJfQorICAgIH0KKyNlbmRpZgorCisgIHJldHVybiAoYmxvY2t2ZWN0b3IpOworfQorDAorLyogU3RhcnQgcmVjb3JkaW5nIGluZm9ybWF0aW9uIGFib3V0IHNvdXJjZSBjb2RlIHRoYXQgY2FtZSBmcm9tIGFuCisgICBpbmNsdWRlZCAob3Igb3RoZXJ3aXNlIG1lcmdlZC1pbikgc291cmNlIGZpbGUgd2l0aCBhIGRpZmZlcmVudAorICAgbmFtZS4gIE5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgKGNhbm5vdCBiZSBOVUxMKSwgRElSTkFNRSBpcworICAgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBpdCByZXNpZGVzIChvciBOVUxMIGlmIG5vdCBrbm93bikuICAqLworCit2b2lkCitzdGFydF9zdWJmaWxlIChjaGFyICpuYW1lLCBjaGFyICpkaXJuYW1lKQoreworICByZWdpc3RlciBzdHJ1Y3Qgc3ViZmlsZSAqc3ViZmlsZTsKKworICAvKiBTZWUgaWYgdGhpcyBzdWJmaWxlIGlzIGFscmVhZHkga25vd24gYXMgYSBzdWJmaWxlIG9mIHRoZSBjdXJyZW50CisgICAgIG1haW4gc291cmNlIGZpbGUuICAqLworCisgIGZvciAoc3ViZmlsZSA9IHN1YmZpbGVzOyBzdWJmaWxlOyBzdWJmaWxlID0gc3ViZmlsZS0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoU1RSRVEgKHN1YmZpbGUtPm5hbWUsIG5hbWUpKQorCXsKKwkgIGN1cnJlbnRfc3ViZmlsZSA9IHN1YmZpbGU7CisJICByZXR1cm47CisJfQorICAgIH0KKworICAvKiBUaGlzIHN1YmZpbGUgaXMgbm90IGtub3duLiAgQWRkIGFuIGVudHJ5IGZvciBpdC4gTWFrZSBhbiBlbnRyeQorICAgICBmb3IgdGhpcyBzdWJmaWxlIGluIHRoZSBsaXN0IG9mIGFsbCBzdWJmaWxlcyBvZiB0aGUgY3VycmVudCBtYWluCisgICAgIHNvdXJjZSBmaWxlLiAgKi8KKworICBzdWJmaWxlID0gKHN0cnVjdCBzdWJmaWxlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHN1YmZpbGUpKTsKKyAgc3ViZmlsZS0+bmV4dCA9IHN1YmZpbGVzOworICBzdWJmaWxlcyA9IHN1YmZpbGU7CisgIGN1cnJlbnRfc3ViZmlsZSA9IHN1YmZpbGU7CisKKyAgLyogU2F2ZSBpdHMgbmFtZSBhbmQgY29tcGlsYXRpb24gZGlyZWN0b3J5IG5hbWUgKi8KKyAgc3ViZmlsZS0+bmFtZSA9IChuYW1lID09IE5VTEwpID8gTlVMTCA6IHNhdmVzdHJpbmcgKG5hbWUsIHN0cmxlbiAobmFtZSkpOworICBzdWJmaWxlLT5kaXJuYW1lID0KKyAgICAoZGlybmFtZSA9PSBOVUxMKSA/IE5VTEwgOiBzYXZlc3RyaW5nIChkaXJuYW1lLCBzdHJsZW4gKGRpcm5hbWUpKTsKKworICAvKiBJbml0aWFsaXplIGxpbmUtbnVtYmVyIHJlY29yZGluZyBmb3IgdGhpcyBzdWJmaWxlLiAgKi8KKyAgc3ViZmlsZS0+bGluZV92ZWN0b3IgPSBOVUxMOworCisgIC8qIERlZmF1bHQgdGhlIHNvdXJjZSBsYW5ndWFnZSB0byB3aGF0ZXZlciBjYW4gYmUgZGVkdWNlZCBmcm9tIHRoZQorICAgICBmaWxlbmFtZS4gIElmIG5vdGhpbmcgY2FuIGJlIGRlZHVjZWQgKHN1Y2ggYXMgZm9yIGEgQy9DKysgaW5jbHVkZQorICAgICBmaWxlIHdpdGggYSAiLmgiIGV4dGVuc2lvbiksIHRoZW4gaW5oZXJpdCB3aGF0ZXZlciBsYW5ndWFnZSB0aGUKKyAgICAgcHJldmlvdXMgc3ViZmlsZSBoYWQuICBUaGlzIGtsdWRnZXJ5IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZXJlCisgICAgIGlzIG5vIHN0YW5kYXJkIHdheSBpbiBzb21lIG9iamVjdCBmb3JtYXRzIHRvIHJlY29yZCB0aGUgc291cmNlCisgICAgIGxhbmd1YWdlLiAgQWxzbywgd2hlbiBzeW10YWJzIGFyZSBhbGxvY2F0ZWQgd2UgdHJ5IHRvIGRlZHVjZSBhCisgICAgIGxhbmd1YWdlIHRoZW4gYXMgd2VsbCwgYnV0IGl0IGlzIHRvbyBsYXRlIGZvciB1cyB0byB1c2UgdGhhdAorICAgICBpbmZvcm1hdGlvbiB3aGlsZSByZWFkaW5nIHN5bWJvbHMsIHNpbmNlIHN5bXRhYnMgYXJlbid0IGFsbG9jYXRlZAorICAgICB1bnRpbCBhZnRlciBhbGwgdGhlIHN5bWJvbHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCBmb3IgYSBnaXZlbgorICAgICBzb3VyY2UgZmlsZS4gKi8KKworICBzdWJmaWxlLT5sYW5ndWFnZSA9IGRlZHVjZV9sYW5ndWFnZV9mcm9tX2ZpbGVuYW1lIChzdWJmaWxlLT5uYW1lKTsKKyAgaWYgKHN1YmZpbGUtPmxhbmd1YWdlID09IGxhbmd1YWdlX3Vua25vd24gJiYKKyAgICAgIHN1YmZpbGUtPm5leHQgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdWJmaWxlLT5sYW5ndWFnZSA9IHN1YmZpbGUtPm5leHQtPmxhbmd1YWdlOworICAgIH0KKworICAvKiBJbml0aWFsaXplIHRoZSBkZWJ1ZyBmb3JtYXQgc3RyaW5nIHRvIE5VTEwuICBXZSBtYXkgc3VwcGx5IGl0CisgICAgIGxhdGVyIHZpYSBhIGNhbGwgdG8gcmVjb3JkX2RlYnVnZm9ybWF0LiAqLworICBzdWJmaWxlLT5kZWJ1Z2Zvcm1hdCA9IE5VTEw7CisKKyAgLyogY2Zyb250IG91dHB1dCBpcyBhIEMgcHJvZ3JhbSwgc28gaW4gbW9zdCB3YXlzIGl0IGxvb2tzIGxpa2UgYSBDCisgICAgIHByb2dyYW0uICBCdXQgdG8gZGVtYW5nbGUgd2UgbmVlZCB0byBzZXQgdGhlIGxhbmd1YWdlIHRvIEMrKy4gIFdlCisgICAgIGNhbiBkaXN0aW5ndWlzaCBjZnJvbnQgY29kZSBieSB0aGUgZmFjdCB0aGF0IGl0IGhhcyAjbGluZQorICAgICBkaXJlY3RpdmVzIHdoaWNoIHNwZWNpZnkgYSBmaWxlIG5hbWUgZW5kaW5nIGluIC5DLgorICAKKyAgICAgU28gaWYgdGhlIGZpbGVuYW1lIG9mIHRoaXMgc3ViZmlsZSBlbmRzIGluIC5DLCB0aGVuIGNoYW5nZSB0aGUKKyAgICAgbGFuZ3VhZ2Ugb2YgYW55IHBlbmRpbmcgc3ViZmlsZXMgZnJvbSBDIHRvIEMrKy4gIFdlIGFsc28gYWNjZXB0CisgICAgIGFueSBvdGhlciBDKysgc3VmZml4ZXMgYWNjZXB0ZWQgYnkgZGVkdWNlX2xhbmd1YWdlX2Zyb21fZmlsZW5hbWUKKyAgICAgKGluIHBhcnRpY3VsYXIsIHNvbWUgcGVvcGxlIHVzZSAuY3h4IHdpdGggY2Zyb250KS4gICovCisgIC8qIExpa2V3aXNlIGZvciBmMmMuICAqLworCisgIGlmIChzdWJmaWxlLT5uYW1lKQorICAgIHsKKyAgICAgIHN0cnVjdCBzdWJmaWxlICpzOworICAgICAgZW51bSBsYW5ndWFnZSBzdWJsYW5nID0gZGVkdWNlX2xhbmd1YWdlX2Zyb21fZmlsZW5hbWUgKHN1YmZpbGUtPm5hbWUpOworCisgICAgICBpZiAoc3VibGFuZyA9PSBsYW5ndWFnZV9jcGx1cyB8fCBzdWJsYW5nID09IGxhbmd1YWdlX2ZvcnRyYW4pCisJZm9yIChzID0gc3ViZmlsZXM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCisJICBpZiAocy0+bGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfYykKKwkgICAgcy0+bGFuZ3VhZ2UgPSBzdWJsYW5nOworICAgIH0KKworICAvKiBBbmQgcGF0Y2ggdXAgdGhpcyBmaWxlIGlmIG5lY2Vzc2FyeS4gICovCisgIGlmIChzdWJmaWxlLT5sYW5ndWFnZSA9PSBsYW5ndWFnZV9jCisgICAgICAmJiBzdWJmaWxlLT5uZXh0ICE9IE5VTEwKKyAgICAgICYmIChzdWJmaWxlLT5uZXh0LT5sYW5ndWFnZSA9PSBsYW5ndWFnZV9jcGx1cworCSAgfHwgc3ViZmlsZS0+bmV4dC0+bGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfZm9ydHJhbikpCisgICAgeworICAgICAgc3ViZmlsZS0+bGFuZ3VhZ2UgPSBzdWJmaWxlLT5uZXh0LT5sYW5ndWFnZTsKKyAgICB9Cit9CisKKy8qIEZvciBzdGFicyByZWFkZXJzLCB0aGUgZmlyc3QgTl9TTyBzeW1ib2wgaXMgYXNzdW1lZCB0byBiZSB0aGUKKyAgIHNvdXJjZSBmaWxlIG5hbWUsIGFuZCB0aGUgc3ViZmlsZSBzdHJ1Y3QgaXMgaW5pdGlhbGl6ZWQgdXNpbmcgdGhhdAorICAgYXNzdW1wdGlvbi4gIElmIGFub3RoZXIgTl9TTyBzeW1ib2wgaXMgbGF0ZXIgc2VlbiwgaW1tZWRpYXRlbHkKKyAgIGZvbGxvd2luZyB0aGUgZmlyc3Qgb25lLCB0aGVuIHRoZSBmaXJzdCBvbmUgaXMgYXNzdW1lZCB0byBiZSB0aGUKKyAgIGRpcmVjdG9yeSBuYW1lIGFuZCB0aGUgc2Vjb25kIG9uZSBpcyByZWFsbHkgdGhlIHNvdXJjZSBmaWxlIG5hbWUuCisKKyAgIFNvIHdlIGhhdmUgdG8gcGF0Y2ggdXAgdGhlIHN1YmZpbGUgc3RydWN0IGJ5IG1vdmluZyB0aGUgb2xkIG5hbWUKKyAgIHZhbHVlIHRvIGRpcm5hbWUgYW5kIHJlbWVtYmVyaW5nIHRoZSBuZXcgbmFtZS4gIFNvbWUgc2FuaXR5CisgICBjaGVja2luZyBpcyBwZXJmb3JtZWQgdG8gZW5zdXJlIHRoYXQgdGhlIHN0YXRlIG9mIHRoZSBzdWJmaWxlCisgICBzdHJ1Y3QgaXMgcmVhc29uYWJsZSBhbmQgdGhhdCB0aGUgb2xkIG5hbWUgd2UgYXJlIGFzc3VtaW5nIHRvIGJlIGEKKyAgIGRpcmVjdG9yeSBuYW1lIGFjdHVhbGx5IGlzIChieSBjaGVja2luZyBmb3IgYSB0cmFpbGluZyAnLycpLiAqLworCit2b2lkCitwYXRjaF9zdWJmaWxlX25hbWVzIChzdHJ1Y3Qgc3ViZmlsZSAqc3ViZmlsZSwgY2hhciAqbmFtZSkKK3sKKyAgaWYgKHN1YmZpbGUgIT0gTlVMTCAmJiBzdWJmaWxlLT5kaXJuYW1lID09IE5VTEwgJiYgc3ViZmlsZS0+bmFtZSAhPSBOVUxMCisgICAgICAmJiBzdWJmaWxlLT5uYW1lW3N0cmxlbiAoc3ViZmlsZS0+bmFtZSkgLSAxXSA9PSAnLycpCisgICAgeworICAgICAgc3ViZmlsZS0+ZGlybmFtZSA9IHN1YmZpbGUtPm5hbWU7CisgICAgICBzdWJmaWxlLT5uYW1lID0gc2F2ZXN0cmluZyAobmFtZSwgc3RybGVuIChuYW1lKSk7CisgICAgICBsYXN0X3NvdXJjZV9maWxlID0gbmFtZTsKKworICAgICAgLyogRGVmYXVsdCB0aGUgc291cmNlIGxhbmd1YWdlIHRvIHdoYXRldmVyIGNhbiBiZSBkZWR1Y2VkIGZyb20KKyAgICAgICAgIHRoZSBmaWxlbmFtZS4gIElmIG5vdGhpbmcgY2FuIGJlIGRlZHVjZWQgKHN1Y2ggYXMgZm9yIGEgQy9DKysKKyAgICAgICAgIGluY2x1ZGUgZmlsZSB3aXRoIGEgIi5oIiBleHRlbnNpb24pLCB0aGVuIGluaGVyaXQgd2hhdGV2ZXIKKyAgICAgICAgIGxhbmd1YWdlIHRoZSBwcmV2aW91cyBzdWJmaWxlIGhhZC4gIFRoaXMga2x1ZGdlcnkgaXMKKyAgICAgICAgIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHN0YW5kYXJkIHdheSBpbiBzb21lIG9iamVjdAorICAgICAgICAgZm9ybWF0cyB0byByZWNvcmQgdGhlIHNvdXJjZSBsYW5ndWFnZS4gIEFsc28sIHdoZW4gc3ltdGFicworICAgICAgICAgYXJlIGFsbG9jYXRlZCB3ZSB0cnkgdG8gZGVkdWNlIGEgbGFuZ3VhZ2UgdGhlbiBhcyB3ZWxsLCBidXQKKyAgICAgICAgIGl0IGlzIHRvbyBsYXRlIGZvciB1cyB0byB1c2UgdGhhdCBpbmZvcm1hdGlvbiB3aGlsZSByZWFkaW5nCisgICAgICAgICBzeW1ib2xzLCBzaW5jZSBzeW10YWJzIGFyZW4ndCBhbGxvY2F0ZWQgdW50aWwgYWZ0ZXIgYWxsIHRoZQorICAgICAgICAgc3ltYm9scyBoYXZlIGJlZW4gcHJvY2Vzc2VkIGZvciBhIGdpdmVuIHNvdXJjZSBmaWxlLiAqLworCisgICAgICBzdWJmaWxlLT5sYW5ndWFnZSA9IGRlZHVjZV9sYW5ndWFnZV9mcm9tX2ZpbGVuYW1lIChzdWJmaWxlLT5uYW1lKTsKKyAgICAgIGlmIChzdWJmaWxlLT5sYW5ndWFnZSA9PSBsYW5ndWFnZV91bmtub3duICYmCisJICBzdWJmaWxlLT5uZXh0ICE9IE5VTEwpCisJeworCSAgc3ViZmlsZS0+bGFuZ3VhZ2UgPSBzdWJmaWxlLT5uZXh0LT5sYW5ndWFnZTsKKwl9CisgICAgfQorfQorDAorLyogSGFuZGxlIHRoZSBOX0JJTkNMIGFuZCBOX0VJTkNMIHN5bWJvbCB0eXBlcyB0aGF0IGFjdCBsaWtlIE5fU09MIGZvcgorICAgc3dpdGNoaW5nIHNvdXJjZSBmaWxlcyAoZGlmZmVyZW50IHN1YmZpbGVzLCBhcyB3ZSBjYWxsIHRoZW0pIHdpdGhpbgorICAgb25lIG9iamVjdCBmaWxlLCBidXQgdXNpbmcgYSBzdGFjayByYXRoZXIgdGhhbiBpbiBhbiBhcmJpdHJhcnkKKyAgIG9yZGVyLiAgKi8KKwordm9pZAorcHVzaF9zdWJmaWxlICh2b2lkKQoreworICByZWdpc3RlciBzdHJ1Y3Qgc3ViZmlsZV9zdGFjayAqdGVtCisgID0gKHN0cnVjdCBzdWJmaWxlX3N0YWNrICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHN1YmZpbGVfc3RhY2spKTsKKworICB0ZW0tPm5leHQgPSBzdWJmaWxlX3N0YWNrOworICBzdWJmaWxlX3N0YWNrID0gdGVtOworICBpZiAoY3VycmVudF9zdWJmaWxlID09IE5VTEwgfHwgY3VycmVudF9zdWJmaWxlLT5uYW1lID09IE5VTEwpCisgICAgeworICAgICAgYWJvcnQgKCk7CisgICAgfQorICB0ZW0tPm5hbWUgPSBjdXJyZW50X3N1YmZpbGUtPm5hbWU7Cit9CisKK2NoYXIgKgorcG9wX3N1YmZpbGUgKHZvaWQpCit7CisgIHJlZ2lzdGVyIGNoYXIgKm5hbWU7CisgIHJlZ2lzdGVyIHN0cnVjdCBzdWJmaWxlX3N0YWNrICpsaW5rID0gc3ViZmlsZV9zdGFjazsKKworICBpZiAobGluayA9PSBOVUxMKQorICAgIHsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKyAgbmFtZSA9IGxpbmstPm5hbWU7CisgIHN1YmZpbGVfc3RhY2sgPSBsaW5rLT5uZXh0OworICBmcmVlICgodm9pZCAqKSBsaW5rKTsKKyAgcmV0dXJuIChuYW1lKTsKK30KKwwKKy8qIEFkZCBhIGxpbmV0YWJsZSBlbnRyeSBmb3IgbGluZSBudW1iZXIgTElORSBhbmQgYWRkcmVzcyBQQyB0byB0aGUKKyAgIGxpbmUgdmVjdG9yIGZvciBTVUJGSUxFLiAgKi8KKwordm9pZAorcmVjb3JkX2xpbmUgKHJlZ2lzdGVyIHN0cnVjdCBzdWJmaWxlICpzdWJmaWxlLCBpbnQgbGluZSwgQ09SRV9BRERSIHBjKQoreworICBzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5ICplOworICAvKiBJZ25vcmUgdGhlIGR1bW15IGxpbmUgbnVtYmVyIGluIGxpYmcubyAqLworCisgIGlmIChsaW5lID09IDB4ZmZmZikKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIE1ha2Ugc3VyZSBsaW5lIHZlY3RvciBleGlzdHMgYW5kIGlzIGJpZyBlbm91Z2guICAqLworICBpZiAoIXN1YmZpbGUtPmxpbmVfdmVjdG9yKQorICAgIHsKKyAgICAgIHN1YmZpbGUtPmxpbmVfdmVjdG9yX2xlbmd0aCA9IElOSVRJQUxfTElORV9WRUNUT1JfTEVOR1RIOworICAgICAgc3ViZmlsZS0+bGluZV92ZWN0b3IgPSAoc3RydWN0IGxpbmV0YWJsZSAqKQorCXhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxpbmV0YWJsZSkKKwkJICsgc3ViZmlsZS0+bGluZV92ZWN0b3JfbGVuZ3RoICogc2l6ZW9mIChzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5KSk7CisgICAgICBzdWJmaWxlLT5saW5lX3ZlY3Rvci0+bml0ZW1zID0gMDsKKyAgICAgIGhhdmVfbGluZV9udW1iZXJzID0gMTsKKyAgICB9CisKKyAgaWYgKHN1YmZpbGUtPmxpbmVfdmVjdG9yLT5uaXRlbXMgKyAxID49IHN1YmZpbGUtPmxpbmVfdmVjdG9yX2xlbmd0aCkKKyAgICB7CisgICAgICBzdWJmaWxlLT5saW5lX3ZlY3Rvcl9sZW5ndGggKj0gMjsKKyAgICAgIHN1YmZpbGUtPmxpbmVfdmVjdG9yID0gKHN0cnVjdCBsaW5ldGFibGUgKikKKwl4cmVhbGxvYyAoKGNoYXIgKikgc3ViZmlsZS0+bGluZV92ZWN0b3IsCisJCSAgKHNpemVvZiAoc3RydWN0IGxpbmV0YWJsZSkKKwkJICAgKyAoc3ViZmlsZS0+bGluZV92ZWN0b3JfbGVuZ3RoCisJCSAgICAgICogc2l6ZW9mIChzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5KSkpKTsKKyAgICB9CisKKyAgZSA9IHN1YmZpbGUtPmxpbmVfdmVjdG9yLT5pdGVtICsgc3ViZmlsZS0+bGluZV92ZWN0b3ItPm5pdGVtcysrOworICBlLT5saW5lID0gbGluZTsKKyAgZS0+cGMgPSBwYzsKK30KKworLyogTmVlZGVkIGluIG9yZGVyIHRvIHNvcnQgbGluZSB0YWJsZXMgZnJvbSBJQk0geGNvZmYgZmlsZXMuICBTaWdoISAgKi8KKworc3RhdGljIGludAorY29tcGFyZV9saW5lX251bWJlcnMgKGNvbnN0IHZvaWQgKmxuMXAsIGNvbnN0IHZvaWQgKmxuMnApCit7CisgIHN0cnVjdCBsaW5ldGFibGVfZW50cnkgKmxuMSA9IChzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5ICopIGxuMXA7CisgIHN0cnVjdCBsaW5ldGFibGVfZW50cnkgKmxuMiA9IChzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5ICopIGxuMnA7CisKKyAgLyogTm90ZTogdGhpcyBjb2RlIGRvZXMgbm90IGFzc3VtZSB0aGF0IENPUkVfQUREUnMgY2FuIGZpdCBpbiBpbnRzLgorICAgICBQbGVhc2Uga2VlcCBpdCB0aGF0IHdheS4gICovCisgIGlmIChsbjEtPnBjIDwgbG4yLT5wYykKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKGxuMS0+cGMgPiBsbjItPnBjKQorICAgIHJldHVybiAxOworCisgIC8qIElmIHBjIGVxdWFsLCBzb3J0IGJ5IGxpbmUuICBJJ20gbm90IHN1cmUgd2hldGhlciB0aGlzIGlzIG9wdGltdW0KKyAgICAgYmVoYXZpb3IgKHNlZSBjb21tZW50IGF0IHN0cnVjdCBsaW5ldGFibGUgaW4gc3ltdGFiLmgpLiAgKi8KKyAgcmV0dXJuIGxuMS0+bGluZSAtIGxuMi0+bGluZTsKK30KKwwKKy8qIFN0YXJ0IGEgbmV3IHN5bXRhYiBmb3IgYSBuZXcgc291cmNlIGZpbGUuICBDYWxsZWQsIGZvciBleGFtcGxlLAorICAgd2hlbiBhIHN0YWJzIHN5bWJvbCBvZiB0eXBlIE5fU08gaXMgc2Vlbiwgb3Igd2hlbiBhIERXQVJGCisgICBUQUdfY29tcGlsZV91bml0IERJRSBpcyBzZWVuLiAgSXQgaW5kaWNhdGVzIHRoZSBzdGFydCBvZiBkYXRhIGZvcgorICAgb25lIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiAgKi8KKwordm9pZAorc3RhcnRfc3ltdGFiIChjaGFyICpuYW1lLCBjaGFyICpkaXJuYW1lLCBDT1JFX0FERFIgc3RhcnRfYWRkcikKK3sKKworICBsYXN0X3NvdXJjZV9maWxlID0gbmFtZTsKKyAgbGFzdF9zb3VyY2Vfc3RhcnRfYWRkciA9IHN0YXJ0X2FkZHI7CisgIGZpbGVfc3ltYm9scyA9IE5VTEw7CisgIGdsb2JhbF9zeW1ib2xzID0gTlVMTDsKKyAgd2l0aGluX2Z1bmN0aW9uID0gMDsKKyAgaGF2ZV9saW5lX251bWJlcnMgPSAwOworCisgIC8qIENvbnRleHQgc3RhY2sgaXMgaW5pdGlhbGx5IGVtcHR5LiAgQWxsb2NhdGUgZmlyc3Qgb25lIHdpdGggcm9vbQorICAgICBmb3IgMTAgbGV2ZWxzOyByZXVzZSBpdCBmb3JldmVyIGFmdGVyd2FyZC4gICovCisgIGlmIChjb250ZXh0X3N0YWNrID09IE5VTEwpCisgICAgeworICAgICAgY29udGV4dF9zdGFja19zaXplID0gSU5JVElBTF9DT05URVhUX1NUQUNLX1NJWkU7CisgICAgICBjb250ZXh0X3N0YWNrID0gKHN0cnVjdCBjb250ZXh0X3N0YWNrICopCisJeG1hbGxvYyAoY29udGV4dF9zdGFja19zaXplICogc2l6ZW9mIChzdHJ1Y3QgY29udGV4dF9zdGFjaykpOworICAgIH0KKyAgY29udGV4dF9zdGFja19kZXB0aCA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgbGlzdCBvZiBzdWIgc291cmNlIGZpbGVzIHdpdGggb25lIGVudHJ5IGZvciB0aGlzCisgICAgIGZpbGUgKHRoZSB0b3AtbGV2ZWwgc291cmNlIGZpbGUpLiAgKi8KKworICBzdWJmaWxlcyA9IE5VTEw7CisgIGN1cnJlbnRfc3ViZmlsZSA9IE5VTEw7CisgIHN0YXJ0X3N1YmZpbGUgKG5hbWUsIGRpcm5hbWUpOworfQorCisvKiBGaW5pc2ggdGhlIHN5bWJvbCBkZWZpbml0aW9ucyBmb3Igb25lIG1haW4gc291cmNlIGZpbGUsIGNsb3NlIG9mZgorICAgYWxsIHRoZSBsZXhpY2FsIGNvbnRleHRzIGZvciB0aGF0IGZpbGUgKGNyZWF0aW5nIHN0cnVjdCBibG9jaydzIGZvcgorICAgdGhlbSksIHRoZW4gbWFrZSB0aGUgc3RydWN0IHN5bXRhYiBmb3IgdGhhdCBmaWxlIGFuZCBwdXQgaXQgaW4gdGhlCisgICBsaXN0IG9mIGFsbCBzdWNoLgorCisgICBFTkRfQUREUiBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBmaWxlJ3MgdGV4dC4gIFNFQ1RJT04gaXMKKyAgIHRoZSBzZWN0aW9uIG51bWJlciAoaW4gb2JqZmlsZS0+c2VjdGlvbl9vZmZzZXRzKSBvZiB0aGUgYmxvY2t2ZWN0b3IKKyAgIGFuZCBsaW5ldGFibGUuCisKKyAgIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgZW5kX3N5bXRhYigpIHRvIHJldHVybiBOVUxMLiAgSW4KKyAgIHBhcnRpY3VsYXIsIGZvciB0aGUgRFdBUkYgY2FzZSBhdCBsZWFzdCwgaXQgd2lsbCByZXR1cm4gTlVMTCB3aGVuCisgICBpdCBmaW5kcyBhIGNvbXBpbGF0aW9uIHVuaXQgdGhhdCBoYXMgZXhhY3RseSBvbmUgRElFLCBhCisgICBUQUdfY29tcGlsZV91bml0IERJRS4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGxpbmsgaW4gYW4gb2JqZWN0CisgICBmaWxlIHRoYXQgd2FzIGNvbXBpbGVkIGZyb20gYW4gZW1wdHkgc291cmNlIGZpbGUuICBSZXR1cm5pbmcgTlVMTAorICAgaXMgcHJvYmFibHkgbm90IHRoZSBjb3JyZWN0IHRoaW5nIHRvIGRvLCBiZWNhdXNlIHRoZW4gZ2RiIHdpbGwKKyAgIG5ldmVyIGtub3cgYWJvdXQgdGhpcyBlbXB0eSBmaWxlIChGSVhNRSkuICovCisKK3N0cnVjdCBzeW10YWIgKgorZW5kX3N5bXRhYiAoQ09SRV9BRERSIGVuZF9hZGRyLCBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSwgaW50IHNlY3Rpb24pCit7CisgIHJlZ2lzdGVyIHN0cnVjdCBzeW10YWIgKnN5bXRhYiA9IE5VTEw7CisgIHJlZ2lzdGVyIHN0cnVjdCBibG9ja3ZlY3RvciAqYmxvY2t2ZWN0b3I7CisgIHJlZ2lzdGVyIHN0cnVjdCBzdWJmaWxlICpzdWJmaWxlOworICByZWdpc3RlciBzdHJ1Y3QgY29udGV4dF9zdGFjayAqY3N0azsKKyAgc3RydWN0IHN1YmZpbGUgKm5leHRzdWI7CisKKyAgLyogRmluaXNoIHRoZSBsZXhpY2FsIGNvbnRleHQgb2YgdGhlIGxhc3QgZnVuY3Rpb24gaW4gdGhlIGZpbGU7IHBvcAorICAgICB0aGUgY29udGV4dCBzdGFjay4gICovCisKKyAgaWYgKGNvbnRleHRfc3RhY2tfZGVwdGggPiAwKQorICAgIHsKKyAgICAgIGNzdGsgPSBwb3BfY29udGV4dCAoKTsKKyAgICAgIC8qIE1ha2UgYSBibG9jayBmb3IgdGhlIGxvY2FsIHN5bWJvbHMgd2l0aGluLiAgKi8KKyAgICAgIGZpbmlzaF9ibG9jayAoY3N0ay0+bmFtZSwgJmxvY2FsX3N5bWJvbHMsIGNzdGstPm9sZF9ibG9ja3MsCisJCSAgICBjc3RrLT5zdGFydF9hZGRyLCBlbmRfYWRkciwgb2JqZmlsZSk7CisKKyAgICAgIGlmIChjb250ZXh0X3N0YWNrX2RlcHRoID4gMCkKKwl7CisJICAvKiBUaGlzIGlzIHNhaWQgdG8gaGFwcGVuIHdpdGggU0NPLiAgVGhlIG9sZCBjb2ZmcmVhZC5jCisJICAgICBjb2RlIHNpbXBseSBlbXB0aWVkIHRoZSBjb250ZXh0IHN0YWNrLCBzbyB3ZSBkbyB0aGUKKwkgICAgIHNhbWUuICBGSVhNRTogRmluZCBvdXQgd2h5IGl0IGlzIGhhcHBlbmluZy4gIFRoaXMgaXMgbm90CisJICAgICBiZWxpZXZlZCB0byBoYXBwZW4gaW4gbW9zdCBjYXNlcyAoZXZlbiBmb3IgY29mZnJlYWQuYyk7CisJICAgICBpdCB1c2VkIHRvIGJlIGFuIGFib3J0KCkuICAqLworCSAgc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgbXNnID0KKwkgIHsiQ29udGV4dCBzdGFjayBub3QgZW1wdHkgaW4gZW5kX3N5bXRhYiIsIDAsIDB9OworCSAgY29tcGxhaW4gKCZtc2cpOworCSAgY29udGV4dF9zdGFja19kZXB0aCA9IDA7CisJfQorICAgIH0KKworICAvKiBSZW9yZGVyZWQgZXhlY3V0YWJsZXMgbWF5IGhhdmUgb3V0IG9mIG9yZGVyIHBlbmRpbmcgYmxvY2tzOyBpZgorICAgICBPQkpGX1JFT1JERVJFRCBpcyB0cnVlLCB0aGVuIHNvcnQgdGhlIHBlbmRpbmcgYmxvY2tzLiAgKi8KKyAgaWYgKChvYmpmaWxlLT5mbGFncyAmIE9CSkZfUkVPUkRFUkVEKSAmJiBwZW5kaW5nX2Jsb2NrcykKKyAgICB7CisgICAgICAvKiBGSVhNRSEgIFJlbW92ZSB0aGlzIGhvcnJpZCBidWJibGUgc29ydCBhbmQgdXNlIG1lcmdlIHNvcnQhISEgKi8KKyAgICAgIGludCBzd2FwcGVkOworICAgICAgZG8KKwl7CisJICBzdHJ1Y3QgcGVuZGluZ19ibG9jayAqcGIsICpwYm5leHQ7CisKKwkgIHBiID0gcGVuZGluZ19ibG9ja3M7CisJICBwYm5leHQgPSBwYi0+bmV4dDsKKwkgIHN3YXBwZWQgPSAwOworCisJICB3aGlsZSAocGJuZXh0KQorCSAgICB7CisJICAgICAgLyogc3dhcCBibG9ja3MgaWYgdW5vcmRlcmVkISAqLworCisJICAgICAgaWYgKEJMT0NLX1NUQVJUIChwYi0+YmxvY2spIDwgQkxPQ0tfU1RBUlQgKHBibmV4dC0+YmxvY2spKQorCQl7CisJCSAgc3RydWN0IGJsb2NrICp0bXAgPSBwYi0+YmxvY2s7CisJCSAgcGItPmJsb2NrID0gcGJuZXh0LT5ibG9jazsKKwkJICBwYm5leHQtPmJsb2NrID0gdG1wOworCQkgIHN3YXBwZWQgPSAxOworCQl9CisJICAgICAgcGIgPSBwYm5leHQ7CisJICAgICAgcGJuZXh0ID0gcGJuZXh0LT5uZXh0OworCSAgICB9CisJfQorICAgICAgd2hpbGUgKHN3YXBwZWQpOworICAgIH0KKworICAvKiBDbGVhbnVwIGFueSB1bmRlZmluZWQgdHlwZXMgdGhhdCBoYXZlIGJlZW4gbGVmdCBoYW5naW5nIGFyb3VuZAorICAgICAodGhpcyBuZWVkcyB0byBiZSBkb25lIGJlZm9yZSB0aGUgZmluaXNoX2Jsb2NrcyBzbyB0aGF0CisgICAgIGZpbGVfc3ltYm9scyBpcyBzdGlsbCBnb29kKS4KKyAgCisgICAgIEJvdGggY2xlYW51cF91bmRlZmluZWRfdHlwZXMgYW5kIGZpbmlzaF9nbG9iYWxfc3RhYnMgYXJlIHN0YWJzCisgICAgIHNwZWNpZmljLCBidXQgaGFybWxlc3MgZm9yIG90aGVyIHN5bWJvbCByZWFkZXJzLCBzaW5jZSBvbiBnZGIKKyAgICAgc3RhcnR1cCBvciB3aGVuIGZpbmlzaGVkIHJlYWRpbmcgc3RhYnMsIHRoZSBzdGF0ZSBpcyBzZXQgc28gdGhlc2UKKyAgICAgYXJlIG5vLW9wcy4gIEZJWE1FOiBJcyB0aGlzIGhhbmRsZWQgcmlnaHQgaW4gY2FzZSBvZiBRVUlUPyAgQ2FuCisgICAgIHdlIG1ha2UgdGhpcyBjbGVhbmVyPyAgKi8KKworICBjbGVhbnVwX3VuZGVmaW5lZF90eXBlcyAoKTsKKyAgZmluaXNoX2dsb2JhbF9zdGFicyAob2JqZmlsZSk7CisKKyAgaWYgKHBlbmRpbmdfYmxvY2tzID09IE5VTEwKKyAgICAgICYmIGZpbGVfc3ltYm9scyA9PSBOVUxMCisgICAgICAmJiBnbG9iYWxfc3ltYm9scyA9PSBOVUxMCisgICAgICAmJiBoYXZlX2xpbmVfbnVtYmVycyA9PSAwKQorICAgIHsKKyAgICAgIC8qIElnbm9yZSBzeW10YWJzIHRoYXQgaGF2ZSBubyBmdW5jdGlvbnMgd2l0aCByZWFsIGRlYnVnZ2luZworICAgICAgICAgaW5mby4gICovCisgICAgICBibG9ja3ZlY3RvciA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogRGVmaW5lIHRoZSBTVEFUSUNfQkxPQ0sgJiBHTE9CQUxfQkxPQ0ssIGFuZCBidWlsZCB0aGUKKyAgICAgICAgIGJsb2NrdmVjdG9yLiAgKi8KKyAgICAgIGZpbmlzaF9ibG9jayAoMCwgJmZpbGVfc3ltYm9scywgMCwgbGFzdF9zb3VyY2Vfc3RhcnRfYWRkciwgZW5kX2FkZHIsCisJCSAgICBvYmpmaWxlKTsKKyAgICAgIGZpbmlzaF9ibG9jayAoMCwgJmdsb2JhbF9zeW1ib2xzLCAwLCBsYXN0X3NvdXJjZV9zdGFydF9hZGRyLCBlbmRfYWRkciwKKwkJICAgIG9iamZpbGUpOworICAgICAgYmxvY2t2ZWN0b3IgPSBtYWtlX2Jsb2NrdmVjdG9yIChvYmpmaWxlKTsKKyAgICB9CisKKyNpZm5kZWYgUFJPQ0VTU19MSU5FTlVNQkVSX0hPT0sKKyNkZWZpbmUgUFJPQ0VTU19MSU5FTlVNQkVSX0hPT0soKQorI2VuZGlmCisgIFBST0NFU1NfTElORU5VTUJFUl9IT09LICgpOwkvKiBOZWVkZWQgZm9yIHhjb2ZmLiAqLworCisgIC8qIE5vdyBjcmVhdGUgdGhlIHN5bXRhYiBvYmplY3RzIHByb3Blciwgb25lIGZvciBlYWNoIHN1YmZpbGUuICAqLworICAvKiAoVGhlIG1haW4gZmlsZSBpcyB0aGUgbGFzdCBvbmUgb24gdGhlIGNoYWluLikgICovCisKKyAgZm9yIChzdWJmaWxlID0gc3ViZmlsZXM7IHN1YmZpbGU7IHN1YmZpbGUgPSBuZXh0c3ViKQorICAgIHsKKyAgICAgIGludCBsaW5ldGFibGVzaXplID0gMDsKKyAgICAgIHN5bXRhYiA9IE5VTEw7CisKKyAgICAgIC8qIElmIHdlIGhhdmUgYmxvY2tzIG9mIHN5bWJvbHMsIG1ha2UgYSBzeW10YWIuIE90aGVyd2lzZSwganVzdAorICAgICAgICAgaWdub3JlIHRoaXMgZmlsZSBhbmQgYW55IGxpbmUgbnVtYmVyIGluZm8gaW4gaXQuICAqLworICAgICAgaWYgKGJsb2NrdmVjdG9yKQorCXsKKwkgIGlmIChzdWJmaWxlLT5saW5lX3ZlY3RvcikKKwkgICAgeworCSAgICAgIGxpbmV0YWJsZXNpemUgPSBzaXplb2YgKHN0cnVjdCBsaW5ldGFibGUpICsKKwkgICAgICAgIHN1YmZpbGUtPmxpbmVfdmVjdG9yLT5uaXRlbXMgKiBzaXplb2YgKHN0cnVjdCBsaW5ldGFibGVfZW50cnkpOworI2lmIDAKKwkgICAgICAvKiBJIHRoaW5rIHRoaXMgaXMgYXJ0aWZhY3QgZnJvbSBiZWZvcmUgaXQgd2VudCBvbiB0aGUKKwkgICAgICAgICBvYnN0YWNrLiBJIGRvdWJ0IHdlJ2xsIG5lZWQgdGhlIG1lbW9yeSBiZXR3ZWVuIG5vdworCSAgICAgICAgIGFuZCB3aGVuIHdlIGZyZWUgaXQgbGF0ZXIgaW4gdGhpcyBmdW5jdGlvbi4gICovCisJICAgICAgLyogRmlyc3QsIHNocmluayB0aGUgbGluZXRhYmxlIHRvIG1ha2UgbW9yZSBtZW1vcnkuICAqLworCSAgICAgIHN1YmZpbGUtPmxpbmVfdmVjdG9yID0gKHN0cnVjdCBsaW5ldGFibGUgKikKKwkJeHJlYWxsb2MgKChjaGFyICopIHN1YmZpbGUtPmxpbmVfdmVjdG9yLCBsaW5ldGFibGVzaXplKTsKKyNlbmRpZgorCisJICAgICAgLyogTGlrZSB0aGUgcGVuZGluZyBibG9ja3MsIHRoZSBsaW5lIHRhYmxlIG1heSBiZQorCSAgICAgICAgIHNjcmFtYmxlZCBpbiByZW9yZGVyZWQgZXhlY3V0YWJsZXMuICBTb3J0IGl0IGlmCisJICAgICAgICAgT0JKRl9SRU9SREVSRUQgaXMgdHJ1ZS4gICovCisJICAgICAgaWYgKG9iamZpbGUtPmZsYWdzICYgT0JKRl9SRU9SREVSRUQpCisJCXFzb3J0IChzdWJmaWxlLT5saW5lX3ZlY3Rvci0+aXRlbSwKKwkJICAgICAgIHN1YmZpbGUtPmxpbmVfdmVjdG9yLT5uaXRlbXMsCisJCSAgICAgICBzaXplb2YgKHN0cnVjdCBsaW5ldGFibGVfZW50cnkpLCBjb21wYXJlX2xpbmVfbnVtYmVycyk7CisJICAgIH0KKworCSAgLyogTm93LCBhbGxvY2F0ZSBhIHN5bWJvbCB0YWJsZS4gICovCisJICBzeW10YWIgPSBhbGxvY2F0ZV9zeW10YWIgKHN1YmZpbGUtPm5hbWUsIG9iamZpbGUpOworCisJICAvKiBGaWxsIGluIGl0cyBjb21wb25lbnRzLiAgKi8KKwkgIHN5bXRhYi0+YmxvY2t2ZWN0b3IgPSBibG9ja3ZlY3RvcjsKKwkgIGlmIChzdWJmaWxlLT5saW5lX3ZlY3RvcikKKwkgICAgeworCSAgICAgIC8qIFJlYWxsb2NhdGUgdGhlIGxpbmUgdGFibGUgb24gdGhlIHN5bWJvbCBvYnN0YWNrICovCisJICAgICAgc3ltdGFiLT5saW5ldGFibGUgPSAoc3RydWN0IGxpbmV0YWJsZSAqKQorCQlvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssIGxpbmV0YWJsZXNpemUpOworCSAgICAgIG1lbWNweSAoc3ltdGFiLT5saW5ldGFibGUsIHN1YmZpbGUtPmxpbmVfdmVjdG9yLCBsaW5ldGFibGVzaXplKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgc3ltdGFiLT5saW5ldGFibGUgPSBOVUxMOworCSAgICB9CisJICBzeW10YWItPmJsb2NrX2xpbmVfc2VjdGlvbiA9IHNlY3Rpb247CisJICBpZiAoc3ViZmlsZS0+ZGlybmFtZSkKKwkgICAgeworCSAgICAgIC8qIFJlYWxsb2NhdGUgdGhlIGRpcm5hbWUgb24gdGhlIHN5bWJvbCBvYnN0YWNrICovCisJICAgICAgc3ltdGFiLT5kaXJuYW1lID0gKGNoYXIgKikKKwkJb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrLAorCQkJICAgICAgIHN0cmxlbiAoc3ViZmlsZS0+ZGlybmFtZSkgKyAxKTsKKwkgICAgICBzdHJjcHkgKHN5bXRhYi0+ZGlybmFtZSwgc3ViZmlsZS0+ZGlybmFtZSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN5bXRhYi0+ZGlybmFtZSA9IE5VTEw7CisJICAgIH0KKwkgIHN5bXRhYi0+ZnJlZV9jb2RlID0gZnJlZV9saW5ldGFibGU7CisJICBzeW10YWItPmZyZWVfcHRyID0gTlVMTDsKKworCSAgLyogVXNlIHdoYXRldmVyIGxhbmd1YWdlIHdlIGhhdmUgYmVlbiB1c2luZyBmb3IgdGhpcworCSAgICAgc3ViZmlsZSwgbm90IHRoZSBvbmUgdGhhdCB3YXMgZGVkdWNlZCBpbiBhbGxvY2F0ZV9zeW10YWIKKwkgICAgIGZyb20gdGhlIGZpbGVuYW1lLiAgV2UgYWxyZWFkeSBkaWQgb3VyIG93biBkZWR1Y2luZyB3aGVuCisJICAgICB3ZSBjcmVhdGVkIHRoZSBzdWJmaWxlLCBhbmQgd2UgbWF5IGhhdmUgYWx0ZXJlZCBvdXIKKwkgICAgIG9waW5pb24gb2Ygd2hhdCBsYW5ndWFnZSBpdCBpcyBmcm9tIHRoaW5ncyB3ZSBmb3VuZCBpbgorCSAgICAgdGhlIHN5bWJvbHMuICovCisJICBzeW10YWItPmxhbmd1YWdlID0gc3ViZmlsZS0+bGFuZ3VhZ2U7CisKKwkgIC8qIFNhdmUgdGhlIGRlYnVnIGZvcm1hdCBzdHJpbmcgKGlmIGFueSkgaW4gdGhlIHN5bXRhYiAqLworCSAgaWYgKHN1YmZpbGUtPmRlYnVnZm9ybWF0ICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBzeW10YWItPmRlYnVnZm9ybWF0ID0gb2JzYXZlc3RyaW5nIChzdWJmaWxlLT5kZWJ1Z2Zvcm1hdCwKKwkJCQkgICAgICBzdHJsZW4gKHN1YmZpbGUtPmRlYnVnZm9ybWF0KSwKKwkJCQkJICAmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2spOworCSAgICB9CisKKwkgIC8qIEFsbCBzeW10YWJzIGZvciB0aGUgbWFpbiBmaWxlIGFuZCB0aGUgc3ViZmlsZXMgc2hhcmUgYQorCSAgICAgYmxvY2t2ZWN0b3IsIHNvIHdlIG5lZWQgdG8gY2xlYXIgcHJpbWFyeSBmb3IgZXZlcnl0aGluZworCSAgICAgYnV0IHRoZSBtYWluIGZpbGUuICAqLworCisJICBzeW10YWItPnByaW1hcnkgPSAwOworCX0KKyAgICAgIGlmIChzdWJmaWxlLT5uYW1lICE9IE5VTEwpCisJeworCSAgZnJlZSAoKHZvaWQgKikgc3ViZmlsZS0+bmFtZSk7CisJfQorICAgICAgaWYgKHN1YmZpbGUtPmRpcm5hbWUgIT0gTlVMTCkKKwl7CisJICBmcmVlICgodm9pZCAqKSBzdWJmaWxlLT5kaXJuYW1lKTsKKwl9CisgICAgICBpZiAoc3ViZmlsZS0+bGluZV92ZWN0b3IgIT0gTlVMTCkKKwl7CisJICBmcmVlICgodm9pZCAqKSBzdWJmaWxlLT5saW5lX3ZlY3Rvcik7CisJfQorICAgICAgaWYgKHN1YmZpbGUtPmRlYnVnZm9ybWF0ICE9IE5VTEwpCisJeworCSAgZnJlZSAoKHZvaWQgKikgc3ViZmlsZS0+ZGVidWdmb3JtYXQpOworCX0KKworICAgICAgbmV4dHN1YiA9IHN1YmZpbGUtPm5leHQ7CisgICAgICBmcmVlICgodm9pZCAqKSBzdWJmaWxlKTsKKyAgICB9CisKKyAgLyogU2V0IHRoaXMgZm9yIHRoZSBtYWluIHNvdXJjZSBmaWxlLiAgKi8KKyAgaWYgKHN5bXRhYikKKyAgICB7CisgICAgICBzeW10YWItPnByaW1hcnkgPSAxOworICAgIH0KKworICBsYXN0X3NvdXJjZV9maWxlID0gTlVMTDsKKyAgY3VycmVudF9zdWJmaWxlID0gTlVMTDsKKworICByZXR1cm4gc3ltdGFiOworfQorCisvKiBQdXNoIGEgY29udGV4dCBibG9jay4gIEFyZ3MgYXJlIGFuIGlkZW50aWZ5aW5nIG5lc3RpbmcgbGV2ZWwKKyAgIChjaGVja2FibGUgd2hlbiB5b3UgcG9wIGl0KSwgYW5kIHRoZSBzdGFydGluZyBQQyBhZGRyZXNzIG9mIHRoaXMKKyAgIGNvbnRleHQuICAqLworCitzdHJ1Y3QgY29udGV4dF9zdGFjayAqCitwdXNoX2NvbnRleHQgKGludCBkZXNjLCBDT1JFX0FERFIgdmFsdSkKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGNvbnRleHRfc3RhY2sgKm5ldzsKKworICBpZiAoY29udGV4dF9zdGFja19kZXB0aCA9PSBjb250ZXh0X3N0YWNrX3NpemUpCisgICAgeworICAgICAgY29udGV4dF9zdGFja19zaXplICo9IDI7CisgICAgICBjb250ZXh0X3N0YWNrID0gKHN0cnVjdCBjb250ZXh0X3N0YWNrICopCisJeHJlYWxsb2MgKChjaGFyICopIGNvbnRleHRfc3RhY2ssCisJICAgICAgKGNvbnRleHRfc3RhY2tfc2l6ZSAqIHNpemVvZiAoc3RydWN0IGNvbnRleHRfc3RhY2spKSk7CisgICAgfQorCisgIG5ldyA9ICZjb250ZXh0X3N0YWNrW2NvbnRleHRfc3RhY2tfZGVwdGgrK107CisgIG5ldy0+ZGVwdGggPSBkZXNjOworICBuZXctPmxvY2FscyA9IGxvY2FsX3N5bWJvbHM7CisgIG5ldy0+cGFyYW1zID0gcGFyYW1fc3ltYm9sczsKKyAgbmV3LT5vbGRfYmxvY2tzID0gcGVuZGluZ19ibG9ja3M7CisgIG5ldy0+c3RhcnRfYWRkciA9IHZhbHU7CisgIG5ldy0+bmFtZSA9IE5VTEw7CisKKyAgbG9jYWxfc3ltYm9scyA9IE5VTEw7CisgIHBhcmFtX3N5bWJvbHMgPSBOVUxMOworCisgIHJldHVybiBuZXc7Cit9CisMCisvKiBDb21wdXRlIGEgc21hbGwgaW50ZWdlciBoYXNoIGNvZGUgZm9yIHRoZSBnaXZlbiBuYW1lLiAqLworCitpbnQKK2hhc2huYW1lIChjaGFyICpuYW1lKQoreworICByZWdpc3RlciBjaGFyICpwID0gbmFtZTsKKyAgcmVnaXN0ZXIgaW50IHRvdGFsID0gcFswXTsKKyAgcmVnaXN0ZXIgaW50IGM7CisKKyAgYyA9IHBbMV07CisgIHRvdGFsICs9IGMgPDwgMjsKKyAgaWYgKGMpCisgICAgeworICAgICAgYyA9IHBbMl07CisgICAgICB0b3RhbCArPSBjIDw8IDQ7CisgICAgICBpZiAoYykKKwl7CisJICB0b3RhbCArPSBwWzNdIDw8IDY7CisJfQorICAgIH0KKworICAvKiBFbnN1cmUgcmVzdWx0IGlzIHBvc2l0aXZlLiAgKi8KKyAgaWYgKHRvdGFsIDwgMCkKKyAgICB7CisgICAgICB0b3RhbCArPSAoMTAwMCA8PCA2KTsKKyAgICB9CisgIHJldHVybiAodG90YWwgJSBIQVNIU0laRSk7Cit9CisMCisKK3ZvaWQKK3JlY29yZF9kZWJ1Z2Zvcm1hdCAoY2hhciAqZm9ybWF0KQoreworICBjdXJyZW50X3N1YmZpbGUtPmRlYnVnZm9ybWF0ID0gc2F2ZXN0cmluZyAoZm9ybWF0LCBzdHJsZW4gKGZvcm1hdCkpOworfQorCisvKiBNZXJnZSB0aGUgZmlyc3Qgc3ltYm9sIGxpc3QgU1JDTElTVCBpbnRvIHRoZSBzZWNvbmQgc3ltYm9sIGxpc3QKKyAgIFRBUkdFVExJU1QgYnkgcmVwZWF0ZWQgY2FsbHMgdG8gYWRkX3N5bWJvbF90b19saXN0KCkuICBUaGlzCisgICBwcm9jZWR1cmUgImZyZWVzIiBlYWNoIGxpbmsgb2YgU1JDTElTVCBieSBhZGRpbmcgaXQgdG8gdGhlCisgICBmcmVlX3BlbmRpbmdzIGxpc3QuICBDYWxsZXIgbXVzdCBzZXQgU1JDTElTVCB0byBhIG51bGwgbGlzdCBhZnRlcgorICAgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorCisgICBWb2lkIHJldHVybi4gKi8KKwordm9pZAorbWVyZ2Vfc3ltYm9sX2xpc3RzIChzdHJ1Y3QgcGVuZGluZyAqKnNyY2xpc3QsIHN0cnVjdCBwZW5kaW5nICoqdGFyZ2V0bGlzdCkKK3sKKyAgcmVnaXN0ZXIgaW50IGk7CisKKyAgaWYgKCFzcmNsaXN0IHx8ICEqc3JjbGlzdCkKKyAgICByZXR1cm47CisKKyAgLyogTWVyZ2UgaW4gZWxlbWVudHMgZnJvbSBjdXJyZW50IGxpbmsuICAqLworICBmb3IgKGkgPSAwOyBpIDwgKCpzcmNsaXN0KS0+bnN5bXM7IGkrKykKKyAgICBhZGRfc3ltYm9sX3RvX2xpc3QgKCgqc3JjbGlzdCktPnN5bWJvbFtpXSwgdGFyZ2V0bGlzdCk7CisKKyAgLyogUmVjdXJzZSBvbiBuZXh0LiAgKi8KKyAgbWVyZ2Vfc3ltYm9sX2xpc3RzICgmKCpzcmNsaXN0KS0+bmV4dCwgdGFyZ2V0bGlzdCk7CisKKyAgLyogIkZyZWUiIHRoZSBjdXJyZW50IGxpbmsuICAqLworICAoKnNyY2xpc3QpLT5uZXh0ID0gZnJlZV9wZW5kaW5nczsKKyAgZnJlZV9wZW5kaW5ncyA9ICgqc3JjbGlzdCk7Cit9CisMCisvKiBJbml0aWFsaXplIGFueXRoaW5nIHRoYXQgbmVlZHMgaW5pdGlhbGl6aW5nIHdoZW4gc3RhcnRpbmcgdG8gcmVhZCBhCisgICBmcmVzaCBwaWVjZSBvZiBhIHN5bWJvbCBmaWxlLCBlLmcuIHJlYWRpbmcgaW4gdGhlIHN0dWZmCisgICBjb3JyZXNwb25kaW5nIHRvIGEgcHN5bXRhYi4gICovCisKK3ZvaWQKK2J1aWxkc3ltX2luaXQgKCkKK3sKKyAgZnJlZV9wZW5kaW5ncyA9IE5VTEw7CisgIGZpbGVfc3ltYm9scyA9IE5VTEw7CisgIGdsb2JhbF9zeW1ib2xzID0gTlVMTDsKKyAgcGVuZGluZ19ibG9ja3MgPSBOVUxMOworfQorCisvKiBJbml0aWFsaXplIGFueXRoaW5nIHRoYXQgbmVlZHMgaW5pdGlhbGl6aW5nIHdoZW4gYSBjb21wbGV0ZWx5IG5ldworICAgc3ltYm9sIGZpbGUgaXMgc3BlY2lmaWVkIChub3QganVzdCBhZGRpbmcgc29tZSBzeW1ib2xzIGZyb20gYW5vdGhlcgorICAgZmlsZSwgZS5nLiBhIHNoYXJlZCBsaWJyYXJ5KS4gICovCisKK3ZvaWQKK2J1aWxkc3ltX25ld19pbml0ICgpCit7CisgIGJ1aWxkc3ltX2luaXQgKCk7Cit9CmRpZmYgLS1naXQgYS9nZGIvYnVpbGRzeW0uaCBiL2dkYi9idWlsZHN5bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYTM0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvYnVpbGRzeW0uaApAQCAtMCwwICsxLDI5NyBAQAorLyogQnVpbGQgc3ltYm9sIHRhYmxlcyBpbiBHREIncyBpbnRlcm5hbCBmb3JtYXQuCisgICBDb3B5cmlnaHQgMTk4Ni0xOTkzLCAxOTk2LTE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIChCVUlMRFNZTV9IKQorI2RlZmluZSBCVUlMRFNZTV9IIDEKKworLyogVGhpcyBtb2R1bGUgcHJvdmlkZXMgZGVmaW5pdGlvbnMgdXNlZCBmb3IgY3JlYXRpbmcgYW5kIGFkZGluZyB0bworICAgdGhlIHN5bWJvbCB0YWJsZS4gIFRoZXNlIHJvdXRpbmVzIGFyZSBjYWxsZWQgZnJvbSB2YXJpb3VzIHN5bWJvbC0KKyAgIGZpbGUtcmVhZGluZyByb3V0aW5lcy4KKworICAgVGhleSBvcmlnaW5hdGVkIGluIGRieHJlYWQuYyBvZiBnZGItNC4yLCBhbmQgd2VyZSBzcGxpdCBvdXQgdG8KKyAgIG1ha2UgeGNvZmZyZWFkLmMgbW9yZSBtYWludGFpbmFibGUgYnkgc2hhcmluZyBjb2RlLgorCisgICBWYXJpYWJsZXMgZGVjbGFyZWQgaW4gdGhpcyBmaWxlIGNhbiBiZSBkZWZpbmVkIGJ5ICNkZWZpbmUtaW5nIHRoZQorICAgbmFtZSBFWFRFUk4gdG8gbnVsbC4gIEl0IGlzIHVzZWQgdG8gZGVjbGFyZSB2YXJpYWJsZXMgdGhhdCBhcmUKKyAgIG5vcm1hbGx5IGV4dGVybiwgYnV0IHdoaWNoIGdldCBkZWZpbmVkIGluIGEgc2luZ2xlIG1vZHVsZSB1c2luZworICAgdGhpcyB0ZWNobmlxdWUuICAqLworCisjaWZuZGVmIEVYVEVSTgorI2RlZmluZQlFWFRFUk4gZXh0ZXJuCisjZW5kaWYKKworI2RlZmluZSBIQVNIU0laRSAxMjcJCS8qIFNpemUgb2YgdGhpbmdzIGhhc2hlZCB2aWEKKwkJCQkgICBoYXNobmFtZSgpICovCisKKy8qIE5hbWUgb2Ygc291cmNlIGZpbGUgd2hvc2Ugc3ltYm9sIGRhdGEgd2UgYXJlIG5vdyBwcm9jZXNzaW5nLiAgVGhpcworICAgY29tZXMgZnJvbSBhIHN5bWJvbCBvZiB0eXBlIE5fU08uICovCisKK0VYVEVSTiBjaGFyICpsYXN0X3NvdXJjZV9maWxlOworCisvKiBDb3JlIGFkZHJlc3Mgb2Ygc3RhcnQgb2YgdGV4dCBvZiBjdXJyZW50IHNvdXJjZSBmaWxlLiAgVGhpcyB0b28KKyAgIGNvbWVzIGZyb20gdGhlIE5fU08gc3ltYm9sLiAqLworCitFWFRFUk4gQ09SRV9BRERSIGxhc3Rfc291cmNlX3N0YXJ0X2FkZHI7CisKKy8qIFRoZSBsaXN0IG9mIHN1Yi1zb3VyY2UtZmlsZXMgd2l0aGluIHRoZSBjdXJyZW50IGluZGl2aWR1YWwKKyAgIGNvbXBpbGF0aW9uLiAgRWFjaCBmaWxlIGdldHMgaXRzIG93biBzeW10YWIgd2l0aCBpdHMgb3duIGxpbmV0YWJsZQorICAgYW5kIGFzc29jaWF0ZWQgaW5mbywgYnV0IHRoZXkgYWxsIHNoYXJlIG9uZSBibG9ja3ZlY3Rvci4gICovCisKK3N0cnVjdCBzdWJmaWxlCisgIHsKKyAgICBzdHJ1Y3Qgc3ViZmlsZSAqbmV4dDsKKyAgICBjaGFyICpuYW1lOworICAgIGNoYXIgKmRpcm5hbWU7CisgICAgc3RydWN0IGxpbmV0YWJsZSAqbGluZV92ZWN0b3I7CisgICAgaW50IGxpbmVfdmVjdG9yX2xlbmd0aDsKKyAgICBlbnVtIGxhbmd1YWdlIGxhbmd1YWdlOworICAgIGNoYXIgKmRlYnVnZm9ybWF0OworICB9OworCitFWFRFUk4gc3RydWN0IHN1YmZpbGUgKnN1YmZpbGVzOworCitFWFRFUk4gc3RydWN0IHN1YmZpbGUgKmN1cnJlbnRfc3ViZmlsZTsKKworLyogR2xvYmFsIHZhcmlhYmxlIHdoaWNoLCB3aGVuIHNldCwgaW5kaWNhdGVzIHRoYXQgd2UgYXJlIHByb2Nlc3NpbmcgYQorICAgLm8gZmlsZSBjb21waWxlZCB3aXRoIGdjYyAqLworCitFWFRFUk4gdW5zaWduZWQgY2hhciBwcm9jZXNzaW5nX2djY19jb21waWxhdGlvbjsKKworLyogV2hlbiBzZXQsIHdlIGFyZSBwcm9jZXNzaW5nIGEgLm8gZmlsZSBjb21waWxlZCBieSBzdW4gYWNjLiAgVGhpcyBpcworICAgbWlzbmFtZWQ7IGl0IHJlZmVycyB0byBhbGwgc3RhYnMtaW4tZWxmIGltcGxlbWVudGF0aW9ucyB3aGljaCB1c2UKKyAgIE5fVU5ERiB0aGUgd2F5IFN1biBkb2VzLCBpbmNsdWRpbmcgU29sYXJpcyBnY2MuICBIb3BlZnVsbHkgYWxsCisgICBzdGFicy1pbi1lbGYgaW1wbGVtZW50YXRpb25zIGV2ZXIgaW52ZW50ZWQgd2lsbCBjaG9vc2UgdG8gYmUKKyAgIGNvbXBhdGlibGUuICAqLworCitFWFRFUk4gdW5zaWduZWQgY2hhciBwcm9jZXNzaW5nX2FjY19jb21waWxhdGlvbjsKKworLyogZWx6OiBhZGRlZCB0aGlzIGZsYWcgdG8ga25vdyB3aGVuIGEgYmxvY2sgaXMgY29tcGlsZWQgd2l0aCBIUAorICAgY29tcGlsZXJzIChjYywgYUNDKS4gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvZiB0aGUgbWFjcm8KKyAgIENPRVJDRV9GTE9BVF9UT19ET1VCTEUgZGVmaW5lZCBpbiB0bV9ocHBhLmgsIHdoaWNoIGNhdXNlcyBhCisgICBjb2VyY2lvbiBvZiBmbG9hdCB0byBkb3VibGUgdG8gYWx3YXlzIG9jY3VyIGluIHBhcmFtZXRlciBwYXNzaW5nCisgICBmb3IgYSBmdW5jdGlvbiBjYWxsZWQgYnkgZ2RiIChzZWUgdGhlIGZ1bmN0aW9uIHZhbHVlX2FyZ19jb2VyY2UgaW4KKyAgIHZhbG9wcy5jKS4gVGhpcyBpcyBuZWNlc3Nhcnkgb25seSBpZiB0aGUgdGFyZ2V0IHdhcyBjb21waWxlZCB3aXRoCisgICBnY2MsIG5vdCB3aXRoIEhQIGNvbXBpbGVycyBvciB3aXRoIGcrKyAqLworCitFWFRFUk4gdW5zaWduZWQgY2hhciBwcm9jZXNzaW5nX2hwX2NvbXBpbGF0aW9uOworCisvKiBDb3VudCBzeW1ib2xzIGFzIHRoZXkgYXJlIHByb2Nlc3NlZCwgZm9yIGVycm9yIG1lc3NhZ2VzLiAgKi8KKworRVhURVJOIHVuc2lnbmVkIGludCBzeW1udW07CisKKy8qIFJlY29yZCB0aGUgc3ltYm9scyBkZWZpbmVkIGZvciBlYWNoIGNvbnRleHQgaW4gYSBsaXN0LiAgV2UgZG9uJ3QKKyAgIGNyZWF0ZSBhIHN0cnVjdCBibG9jayBmb3IgdGhlIGNvbnRleHQgdW50aWwgd2Uga25vdyBob3cgbG9uZyB0bworICAgbWFrZSBpdC4gICovCisKKyNkZWZpbmUgUEVORElOR1NJWkUgMTAwCisKK3N0cnVjdCBwZW5kaW5nCisgIHsKKyAgICBzdHJ1Y3QgcGVuZGluZyAqbmV4dDsKKyAgICBpbnQgbnN5bXM7CisgICAgc3RydWN0IHN5bWJvbCAqc3ltYm9sW1BFTkRJTkdTSVpFXTsKKyAgfTsKKworLyogSGVyZSBhcmUgdGhlIHRocmVlIGxpc3RzIHRoYXQgc3ltYm9scyBhcmUgcHV0IG9uLiAgKi8KKworLyogc3RhdGljIGF0IHRvcCBsZXZlbCwgYW5kIHR5cGVzICovCisKK0VYVEVSTiBzdHJ1Y3QgcGVuZGluZyAqZmlsZV9zeW1ib2xzOworCisvKiBnbG9iYWwgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgKi8KKworRVhURVJOIHN0cnVjdCBwZW5kaW5nICpnbG9iYWxfc3ltYm9sczsKKworLyogZXZlcnl0aGluZyBsb2NhbCB0byBsZXhpY2FsIGNvbnRleHQgKi8KKworRVhURVJOIHN0cnVjdCBwZW5kaW5nICpsb2NhbF9zeW1ib2xzOworCisvKiBmdW5jIHBhcmFtcyBsb2NhbCB0byBsZXhpY2FsICBjb250ZXh0ICovCisKK0VYVEVSTiBzdHJ1Y3QgcGVuZGluZyAqcGFyYW1fc3ltYm9sczsKKworLyogU3RhY2sgcmVwcmVzZW50aW5nIHVuY2xvc2VkIGxleGljYWwgY29udGV4dHMgKHRoYXQgd2lsbCBiZWNvbWUKKyAgIGJsb2NrcywgZXZlbnR1YWxseSkuICAqLworCitzdHJ1Y3QgY29udGV4dF9zdGFjaworICB7CisgICAgLyogT3V0ZXIgbG9jYWxzIGF0IHRoZSB0aW1lIHdlIGVudGVyZWQgKi8KKworICAgIHN0cnVjdCBwZW5kaW5nICpsb2NhbHM7CisKKyAgICAvKiBQZW5kaW5nIGZ1bmMgcGFyYW1zIGF0IHRoZSB0aW1lIHdlIGVudGVyZWQgKi8KKworICAgIHN0cnVjdCBwZW5kaW5nICpwYXJhbXM7CisKKyAgICAvKiBQb2ludGVyIGludG8gYmxvY2tsaXN0IGFzIG9mIGVudHJ5ICovCisKKyAgICBzdHJ1Y3QgcGVuZGluZ19ibG9jayAqb2xkX2Jsb2NrczsKKworICAgIC8qIE5hbWUgb2YgZnVuY3Rpb24sIGlmIGFueSwgZGVmaW5pbmcgY29udGV4dCAqLworCisgICAgc3RydWN0IHN5bWJvbCAqbmFtZTsKKworICAgIC8qIFBDIHdoZXJlIHRoaXMgY29udGV4dCBzdGFydHMgKi8KKworICAgIENPUkVfQUREUiBzdGFydF9hZGRyOworCisgICAgLyogVGVtcCBzbG90IGZvciBleGNlcHRpb24gaGFuZGxpbmcuICovCisKKyAgICBDT1JFX0FERFIgZW5kX2FkZHI7CisKKyAgICAvKiBGb3IgZXJyb3ItY2hlY2tpbmcgbWF0Y2hpbmcgcHVzaC9wb3AgKi8KKworICAgIGludCBkZXB0aDsKKworICB9OworCitFWFRFUk4gc3RydWN0IGNvbnRleHRfc3RhY2sgKmNvbnRleHRfc3RhY2s7CisKKy8qIEluZGV4IG9mIGZpcnN0IHVudXNlZCBlbnRyeSBpbiBjb250ZXh0IHN0YWNrLiAgKi8KKworRVhURVJOIGludCBjb250ZXh0X3N0YWNrX2RlcHRoOworCisvKiBDdXJyZW50bHkgYWxsb2NhdGVkIHNpemUgb2YgY29udGV4dCBzdGFjay4gICovCisKK0VYVEVSTiBpbnQgY29udGV4dF9zdGFja19zaXplOworCisvKiBNYWNybyAiZnVuY3Rpb24iIGZvciBwb3BwaW5nIGNvbnRleHRzIGZyb20gdGhlIHN0YWNrLiAgUHVzaGluZyBpcworICAgZG9uZSBieSBhIHJlYWwgZnVuY3Rpb24sIHB1c2hfY29udGV4dC4gIFRoaXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gYQorICAgc3RydWN0IGNvbnRleHRfc3RhY2suICAqLworCisjZGVmaW5lCXBvcF9jb250ZXh0KCkgKCZjb250ZXh0X3N0YWNrWy0tY29udGV4dF9zdGFja19kZXB0aF0pOworCisvKiBOb256ZXJvIGlmIHdpdGhpbiBhIGZ1bmN0aW9uIChzbyBzeW1ib2xzIHNob3VsZCBiZSBsb2NhbCwgaWYKKyAgIG5vdGhpbmcgc2F5cyBzcGVjaWZpY2FsbHkpLiAgKi8KKworRVhURVJOIGludCB3aXRoaW5fZnVuY3Rpb247CisKKy8qIExpc3Qgb2YgYmxvY2tzIGFscmVhZHkgbWFkZSAobGV4aWNhbCBjb250ZXh0cyBhbHJlYWR5IGNsb3NlZCkuCisgICBUaGlzIGlzIHVzZWQgYXQgdGhlIGVuZCB0byBtYWtlIHRoZSBibG9ja3ZlY3Rvci4gICovCisKK3N0cnVjdCBwZW5kaW5nX2Jsb2NrCisgIHsKKyAgICBzdHJ1Y3QgcGVuZGluZ19ibG9jayAqbmV4dDsKKyAgICBzdHJ1Y3QgYmxvY2sgKmJsb2NrOworICB9OworCisvKiBQb2ludGVyIHRvIHRoZSBoZWFkIG9mIGEgbGlua2VkIGxpc3Qgb2Ygc3ltYm9sIGJsb2NrcyB3aGljaCBoYXZlCisgICBhbHJlYWR5IGJlZW4gZmluYWxpemVkIChsZXhpY2FsIGNvbnRleHRzIGFscmVhZHkgY2xvc2VkKSBhbmQgd2hpY2gKKyAgIGFyZSBqdXN0IHdhaXRpbmcgdG8gYmUgYnVpbHQgaW50byBhIGJsb2NrdmVjdG9yIHdoZW4gZmluYWxpemluZyB0aGUKKyAgIGFzc29jaWF0ZWQgc3ltdGFiLiAqLworCitFWFRFUk4gc3RydWN0IHBlbmRpbmdfYmxvY2sgKnBlbmRpbmdfYmxvY2tzOworDAorCitzdHJ1Y3Qgc3ViZmlsZV9zdGFjaworICB7CisgICAgc3RydWN0IHN1YmZpbGVfc3RhY2sgKm5leHQ7CisgICAgY2hhciAqbmFtZTsKKyAgfTsKKworRVhURVJOIHN0cnVjdCBzdWJmaWxlX3N0YWNrICpzdWJmaWxlX3N0YWNrOworCisjZGVmaW5lIG5leHRfc3ltYm9sX3RleHQob2JqZmlsZSkgKCpuZXh0X3N5bWJvbF90ZXh0X2Z1bmMpKG9iamZpbGUpCisKKy8qIEZ1bmN0aW9uIHRvIGludm9rZSBnZXQgdGhlIG5leHQgc3ltYm9sLiAgUmV0dXJuIHRoZSBzeW1ib2wgbmFtZS4gKi8KKworRVhURVJOIGNoYXIgKigqbmV4dF9zeW1ib2xfdGV4dF9mdW5jKSAoc3RydWN0IG9iamZpbGUgKik7CisKKy8qIFZlY3RvciBvZiB0eXBlcyBkZWZpbmVkIHNvIGZhciwgaW5kZXhlZCBieSB0aGVpciB0eXBlIG51bWJlcnMuCisgICBVc2VkIGZvciBib3RoIHN0YWJzIGFuZCBjb2ZmLiAgKEluIG5ld2VyIHN1biBzeXN0ZW1zLCBkYnggdXNlcyBhCisgICBwYWlyIG9mIG51bWJlcnMgaW4gcGFyZW5zLCBhcyBpbiAiKFNVQkZJTEVOVU0sTlVNV0lUSElOU1VCRklMRSkiLgorICAgVGhlbiB0aGVzZSBudW1iZXJzIG11c3QgYmUgdHJhbnNsYXRlZCB0aHJvdWdoIHRoZSB0eXBlX3RyYW5zbGF0aW9ucworICAgaGFzaCB0YWJsZSB0byBnZXQgdGhlIGluZGV4IGludG8gdGhlIHR5cGUgdmVjdG9yLikgICovCisKK0VYVEVSTiBzdHJ1Y3QgdHlwZSAqKnR5cGVfdmVjdG9yOworCisvKiBOdW1iZXIgb2YgZWxlbWVudHMgYWxsb2NhdGVkIGZvciB0eXBlX3ZlY3RvciBjdXJyZW50bHkuICAqLworCitFWFRFUk4gaW50IHR5cGVfdmVjdG9yX2xlbmd0aDsKKworLyogSW5pdGlhbCBzaXplIG9mIHR5cGUgdmVjdG9yLiAgSXMgcmVhbGxvYydkIGxhcmdlciBpZiBuZWVkZWQsIGFuZAorICAgcmVhbGxvYydkIGRvd24gdG8gdGhlIHNpemUgYWN0dWFsbHkgdXNlZCwgd2hlbiBjb21wbGV0ZWQuICAqLworCisjZGVmaW5lCUlOSVRJQUxfVFlQRV9WRUNUT1JfTEVOR1RICTE2MAorCitleHRlcm4gdm9pZCBhZGRfc3ltYm9sX3RvX2xpc3QgKHN0cnVjdCBzeW1ib2wgKnN5bWJvbCwKKwkJCQlzdHJ1Y3QgcGVuZGluZyAqKmxpc3RoZWFkKTsKKworZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKmZpbmRfc3ltYm9sX2luX2xpc3QgKHN0cnVjdCBwZW5kaW5nICpsaXN0LAorCQkJCQkgICBjaGFyICpuYW1lLCBpbnQgbGVuZ3RoKTsKKworZXh0ZXJuIHZvaWQgZmluaXNoX2Jsb2NrIChzdHJ1Y3Qgc3ltYm9sICpzeW1ib2wsCisJCQkgIHN0cnVjdCBwZW5kaW5nICoqbGlzdGhlYWQsCisJCQkgIHN0cnVjdCBwZW5kaW5nX2Jsb2NrICpvbGRfYmxvY2tzLAorCQkJICBDT1JFX0FERFIgc3RhcnQsIENPUkVfQUREUiBlbmQsCisJCQkgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlKTsKKworZXh0ZXJuIHZvaWQgcmVhbGx5X2ZyZWVfcGVuZGluZ3MgKGludCBmb28pOworCitleHRlcm4gdm9pZCBzdGFydF9zdWJmaWxlIChjaGFyICpuYW1lLCBjaGFyICpkaXJuYW1lKTsKKworZXh0ZXJuIHZvaWQgcGF0Y2hfc3ViZmlsZV9uYW1lcyAoc3RydWN0IHN1YmZpbGUgKnN1YmZpbGUsIGNoYXIgKm5hbWUpOworCitleHRlcm4gdm9pZCBwdXNoX3N1YmZpbGUgKHZvaWQpOworCitleHRlcm4gY2hhciAqcG9wX3N1YmZpbGUgKHZvaWQpOworCitleHRlcm4gc3RydWN0IHN5bXRhYiAqZW5kX3N5bXRhYiAoQ09SRV9BRERSIGVuZF9hZGRyLAorCQkJCSAgc3RydWN0IG9iamZpbGUgKm9iamZpbGUsIGludCBzZWN0aW9uKTsKKworLyogRGVmaW5lZCBpbiBzdGFic3JlYWQuYy4gICovCisKK2V4dGVybiB2b2lkIHNjYW5fZmlsZV9nbG9iYWxzIChzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSk7CisKK2V4dGVybiB2b2lkIGJ1aWxkc3ltX25ld19pbml0ICh2b2lkKTsKKworZXh0ZXJuIHZvaWQgYnVpbGRzeW1faW5pdCAodm9pZCk7CisKK2V4dGVybiBzdHJ1Y3QgY29udGV4dF9zdGFjayAqcHVzaF9jb250ZXh0IChpbnQgZGVzYywgQ09SRV9BRERSIHZhbHUpOworCitleHRlcm4gdm9pZCByZWNvcmRfbGluZSAoc3RydWN0IHN1YmZpbGUgKnN1YmZpbGUsIGludCBsaW5lLCBDT1JFX0FERFIgcGMpOworCitleHRlcm4gdm9pZCBzdGFydF9zeW10YWIgKGNoYXIgKm5hbWUsIGNoYXIgKmRpcm5hbWUsIENPUkVfQUREUiBzdGFydF9hZGRyKTsKKworZXh0ZXJuIGludCBoYXNobmFtZSAoY2hhciAqbmFtZSk7CisKK2V4dGVybiB2b2lkIGZyZWVfcGVuZGluZ19ibG9ja3MgKHZvaWQpOworCisvKiBGSVhNRTogTm90ZSB0aGF0IHRoaXMgaXMgdXNlZCBvbmx5IGluIGJ1aWxkc3ltLmMgYW5kIGRzdHJlYWQuYywKKyAgIHdoaWNoIHNob3VsZCBiZSBmaXhlZCB0byBub3QgbmVlZCBkaXJlY3QgYWNjZXNzIHRvCisgICBtYWtlX2Jsb2NrdmVjdG9yLiAqLworCitleHRlcm4gc3RydWN0IGJsb2NrdmVjdG9yICptYWtlX2Jsb2NrdmVjdG9yIChzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSk7CisKKy8qIEZJWE1FOiBOb3RlIHRoYXQgdGhpcyBpcyB1c2VkIG9ubHkgaW4gYnVpbGRzeW0uYyBhbmQgZHN0cmVhZC5jLAorICAgd2hpY2ggc2hvdWxkIGJlIGZpeGVkIHRvIG5vdCBuZWVkIGRpcmVjdCBhY2Nlc3MgdG8KKyAgIHJlY29yZF9wZW5kaW5nX2Jsb2NrLiAqLworCitleHRlcm4gdm9pZCByZWNvcmRfcGVuZGluZ19ibG9jayAoc3RydWN0IG9iamZpbGUgKm9iamZpbGUsCisJCQkJICBzdHJ1Y3QgYmxvY2sgKmJsb2NrLAorCQkJCSAgc3RydWN0IHBlbmRpbmdfYmxvY2sgKm9wYmxvY2spOworCitleHRlcm4gdm9pZCByZWNvcmRfZGVidWdmb3JtYXQgKGNoYXIgKmZvcm1hdCk7CisKK2V4dGVybiB2b2lkIG1lcmdlX3N5bWJvbF9saXN0cyAoc3RydWN0IHBlbmRpbmcgKipzcmNsaXN0LAorCQkJCXN0cnVjdCBwZW5kaW5nICoqdGFyZ2V0bGlzdCk7CisKKyN1bmRlZiBFWFRFUk4KKworI2VuZGlmIC8qIGRlZmluZWQgKEJVSUxEU1lNX0gpICovCmRpZmYgLS1naXQgYS9nZGIvYy1leHAueSBiL2dkYi9jLWV4cC55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3N2Y5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvYy1leHAueQpAQCAtMCwwICsxLDE3NDAgQEAKKy8qIFlBQ0MgcGFyc2VyIGZvciBDIGV4cHJlc3Npb25zLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBQYXJzZSBhIEMgZXhwcmVzc2lvbiBmcm9tIHRleHQgaW4gYSBzdHJpbmcsCisgICBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYSAgc3RydWN0IGV4cHJlc3Npb24gIHBvaW50ZXIuCisgICBUaGF0IHN0cnVjdHVyZSBjb250YWlucyBhcml0aG1ldGljIG9wZXJhdGlvbnMgaW4gcmV2ZXJzZSBwb2xpc2gsCisgICB3aXRoIGNvbnN0YW50cyByZXByZXNlbnRlZCBieSBvcGVyYXRpb25zIHRoYXQgYXJlIGZvbGxvd2VkIGJ5IHNwZWNpYWwgZGF0YS4KKyAgIFNlZSBleHByZXNzaW9uLmggZm9yIHRoZSBkZXRhaWxzIG9mIHRoZSBmb3JtYXQuCisgICBXaGF0IGlzIGltcG9ydGFudCBoZXJlIGlzIHRoYXQgaXQgY2FuIGJlIGJ1aWx0IHVwIHNlcXVlbnRpYWxseQorICAgZHVyaW5nIHRoZSBwcm9jZXNzIG9mIHBhcnNpbmc7IHRoZSBsb3dlciBsZXZlbHMgb2YgdGhlIHRyZWUgYWx3YXlzCisgICBjb21lIGZpcnN0IGluIHRoZSByZXN1bHQuCisKKyAgIE5vdGUgdGhhdCBtYWxsb2MncyBhbmQgcmVhbGxvYydzIGluIHRoaXMgZmlsZSBhcmUgdHJhbnNmb3JtZWQgdG8KKyAgIHhtYWxsb2MgYW5kIHhyZWFsbG9jIHJlc3BlY3RpdmVseSBieSB0aGUgc2FtZSBzZWQgY29tbWFuZCBpbiB0aGUKKyAgIG1ha2VmaWxlIHRoYXQgcmVtYXBzIGFueSBvdGhlciBtYWxsb2MvcmVhbGxvYyBpbnNlcnRlZCBieSB0aGUgcGFyc2VyCisgICBnZW5lcmF0b3IuICBEb2luZyB0aGlzIHdpdGggI2RlZmluZXMgYW5kIHRyeWluZyB0byBjb250cm9sIHRoZSBpbnRlcmFjdGlvbgorICAgd2l0aCBpbmNsdWRlIGZpbGVzICg8bWFsbG9jLmg+IGFuZCA8c3RkbGliLmg+IGZvciBleGFtcGxlKSBqdXN0IGJlY2FtZQorICAgdG9vIG1lc3N5LCBwYXJ0aWN1bGFybHkgd2hlbiBzdWNoIGluY2x1ZGVzIGNhbiBiZSBpbnNlcnRlZCBhdCByYW5kb20KKyAgIHRpbWVzIGJ5IHRoZSBwYXJzZXIgZ2VuZXJhdG9yLiAgKi8KKyAgIAorJXsKKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJwYXJzZXItZGVmcy5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAiYy1sYW5nLmgiCisjaW5jbHVkZSAiYmZkLmgiIC8qIFJlcXVpcmVkIGJ5IG9iamZpbGVzLmguICAqLworI2luY2x1ZGUgInN5bWZpbGUuaCIgLyogUmVxdWlyZWQgYnkgb2JqZmlsZXMuaC4gICovCisjaW5jbHVkZSAib2JqZmlsZXMuaCIgLyogRm9yIGhhdmVfZnVsbF9zeW1ib2xzIGFuZCBoYXZlX3BhcnRpYWxfc3ltYm9scyAqLworCisvKiBGbGFnIGluZGljYXRpbmcgd2UncmUgZGVhbGluZyB3aXRoIEhQLWNvbXBpbGVkIG9iamVjdHMgKi8gCitleHRlcm4gaW50IGhwX3NvbV9zb21fb2JqZWN0X3ByZXNlbnQ7CisKKy8qIFJlbWFwIG5vcm1hbCB5YWNjIHBhcnNlciBpbnRlcmZhY2UgbmFtZXMgKHl5cGFyc2UsIHl5bGV4LCB5eWVycm9yLCBldGMpLAorICAgYXMgd2VsbCBhcyBncmF0dWl0aW91c2x5IGdsb2JhbCBzeW1ib2wgbmFtZXMsIHNvIHdlIGNhbiBoYXZlIG11bHRpcGxlCisgICB5YWNjIGdlbmVyYXRlZCBwYXJzZXJzIGluIGdkYi4gIE5vdGUgdGhhdCB0aGVzZSBhcmUgb25seSB0aGUgdmFyaWFibGVzCisgICBwcm9kdWNlZCBieSB5YWNjLiAgSWYgb3RoZXIgcGFyc2VyIGdlbmVyYXRvcnMgKGJpc29uLCBieWFjYywgZXRjKSBwcm9kdWNlCisgICBhZGRpdGlvbmFsIGdsb2JhbCBuYW1lcyB0aGF0IGNvbmZsaWN0IGF0IGxpbmsgdGltZSwgdGhlbiB0aG9zZSBwYXJzZXIKKyAgIGdlbmVyYXRvcnMgbmVlZCB0byBiZSBmaXhlZCBpbnN0ZWFkIG9mIGFkZGluZyB0aG9zZSBuYW1lcyB0byB0aGlzIGxpc3QuICovCisKKyNkZWZpbmUJeXltYXhkZXB0aCBjX21heGRlcHRoCisjZGVmaW5lCXl5cGFyc2UJY19wYXJzZQorI2RlZmluZQl5eWxleAljX2xleAorI2RlZmluZQl5eWVycm9yCWNfZXJyb3IKKyNkZWZpbmUJeXlsdmFsCWNfbHZhbAorI2RlZmluZQl5eWNoYXIJY19jaGFyCisjZGVmaW5lCXl5ZGVidWcJY19kZWJ1ZworI2RlZmluZQl5eXBhY3QJY19wYWN0CQorI2RlZmluZQl5eXIxCWNfcjEJCQkKKyNkZWZpbmUJeXlyMgljX3IyCQkJCisjZGVmaW5lCXl5ZGVmCWNfZGVmCQkKKyNkZWZpbmUJeXljaGsJY19jaGsJCQorI2RlZmluZQl5eXBnbwljX3BnbwkJCisjZGVmaW5lCXl5YWN0CWNfYWN0CQkKKyNkZWZpbmUJeXlleGNhCWNfZXhjYQorI2RlZmluZSB5eWVycmZsYWcgY19lcnJmbGFnCisjZGVmaW5lIHl5bmVycnMJY19uZXJycworI2RlZmluZQl5eXBzCWNfcHMKKyNkZWZpbmUJeXlwdgljX3B2CisjZGVmaW5lCXl5cwljX3MKKyNkZWZpbmUJeXlfeXlzCWNfeXlzCisjZGVmaW5lCXl5c3RhdGUJY19zdGF0ZQorI2RlZmluZQl5eXRtcAljX3RtcAorI2RlZmluZQl5eXYJY192CisjZGVmaW5lCXl5X3l5dgljX3l5dgorI2RlZmluZQl5eXZhbAljX3ZhbAorI2RlZmluZQl5eWxsb2MJY19sbG9jCisjZGVmaW5lIHl5cmVkcwljX3JlZHMJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCisjZGVmaW5lIHl5dG9rcwljX3Rva3MJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCisjZGVmaW5lIHl5bGhzCWNfeXlsaHMKKyNkZWZpbmUgeXlsZW4JY195eWxlbgorI2RlZmluZSB5eWRlZnJlZCBjX3l5ZGVmcmVkCisjZGVmaW5lIHl5ZGdvdG8JY195eWRnb3RvCisjZGVmaW5lIHl5c2luZGV4IGNfeXlzaW5kZXgKKyNkZWZpbmUgeXlyaW5kZXggY195eXJpbmRleAorI2RlZmluZSB5eWdpbmRleCBjX3l5Z2luZGV4CisjZGVmaW5lIHl5dGFibGUJIGNfeXl0YWJsZQorI2RlZmluZSB5eWNoZWNrCSBjX3l5Y2hlY2sKKworI2lmbmRlZiBZWURFQlVHCisjZGVmaW5lCVlZREVCVUcJMAkJLyogRGVmYXVsdCB0byBubyB5eWRlYnVnIHN1cHBvcnQgKi8KKyNlbmRpZgorCitpbnQKK3l5cGFyc2UgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgaW50Cit5eWxleCBQQVJBTVMgKCh2b2lkKSk7CisKK3ZvaWQKK3l5ZXJyb3IgUEFSQU1TICgoY2hhciAqKSk7CisKKyV9CisKKy8qIEFsdGhvdWdoIHRoZSB5YWNjICJ2YWx1ZSIgb2YgYW4gZXhwcmVzc2lvbiBpcyBub3QgdXNlZCwKKyAgIHNpbmNlIHRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHRoZSBzdHJ1Y3R1cmUgYmVpbmcgY3JlYXRlZCwKKyAgIG90aGVyIG5vZGUgdHlwZXMgZG8gaGF2ZSB2YWx1ZXMuICAqLworCisldW5pb24KKyAgeworICAgIExPTkdFU1QgbHZhbDsKKyAgICBzdHJ1Y3QgeworICAgICAgTE9OR0VTVCB2YWw7CisgICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICB9IHR5cGVkX3ZhbF9pbnQ7CisgICAgc3RydWN0IHsKKyAgICAgIERPVUJMRVNUIGR2YWw7CisgICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICB9IHR5cGVkX3ZhbF9mbG9hdDsKKyAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgICAgc3RydWN0IHR5cGUgKnR2YWw7CisgICAgc3RydWN0IHN0b2tlbiBzdmFsOworICAgIHN0cnVjdCB0dHlwZSB0c3ltOworICAgIHN0cnVjdCBzeW10b2tlbiBzc3ltOworICAgIGludCB2b2lkdmFsOworICAgIHN0cnVjdCBibG9jayAqYnZhbDsKKyAgICBlbnVtIGV4cF9vcGNvZGUgb3Bjb2RlOworICAgIHN0cnVjdCBpbnRlcm5hbHZhciAqaXZhcjsKKworICAgIHN0cnVjdCB0eXBlICoqdHZlYzsKKyAgICBpbnQgKml2ZWM7CisgIH0KKworJXsKKy8qIFlZU1RZUEUgZ2V0cyBkZWZpbmVkIGJ5ICV1bmlvbiAqLworc3RhdGljIGludAorcGFyc2VfbnVtYmVyIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBpbnQsIFlZU1RZUEUgKikpOworJX0KKworJXR5cGUgPHZvaWR2YWw+IGV4cCBleHAxIHR5cGVfZXhwIHN0YXJ0IHZhcmlhYmxlIHF1YWxpZmllZF9uYW1lIGxjdXJseQorJXR5cGUgPGx2YWw+IHJjdXJseQorJXR5cGUgPHR2YWw+IHR5cGUgdHlwZWJhc2UKKyV0eXBlIDx0dmVjPiBub25lbXB0eV90eXBlbGlzdAorLyogJXR5cGUgPGJ2YWw+IGJsb2NrICovCisKKy8qIEZhbmN5IHR5cGUgcGFyc2luZy4gICovCisldHlwZSA8dm9pZHZhbD4gZnVuY19tb2QgZGlyZWN0X2Fic19kZWNsIGFic19kZWNsCisldHlwZSA8dHZhbD4gcHR5cGUKKyV0eXBlIDxsdmFsPiBhcnJheV9tb2QKKworJXRva2VuIDx0eXBlZF92YWxfaW50PiBJTlQKKyV0b2tlbiA8dHlwZWRfdmFsX2Zsb2F0PiBGTE9BVAorCisvKiBCb3RoIE5BTUUgYW5kIFRZUEVOQU1FIHRva2VucyByZXByZXNlbnQgc3ltYm9scyBpbiB0aGUgaW5wdXQsCisgICBhbmQgYm90aCBjb252ZXkgdGhlaXIgZGF0YSBhcyBzdHJpbmdzLgorICAgQnV0IGEgVFlQRU5BTUUgaXMgYSBzdHJpbmcgdGhhdCBoYXBwZW5zIHRvIGJlIGRlZmluZWQgYXMgYSB0eXBlZGVmCisgICBvciBidWlsdGluIHR5cGUgbmFtZSAoc3VjaCBhcyBpbnQgb3IgY2hhcikKKyAgIGFuZCBhIE5BTUUgaXMgYW55IG90aGVyIHN5bWJvbC4KKyAgIENvbnRleHRzIHdoZXJlIHRoaXMgZGlzdGluY3Rpb24gaXMgbm90IGltcG9ydGFudCBjYW4gdXNlIHRoZQorICAgbm9udGVybWluYWwgIm5hbWUiLCB3aGljaCBtYXRjaGVzIGVpdGhlciBOQU1FIG9yIFRZUEVOQU1FLiAgKi8KKworJXRva2VuIDxzdmFsPiBTVFJJTkcKKyV0b2tlbiA8c3N5bT4gTkFNRSAvKiBCTE9DS05BTUUgZGVmaW5lZCBiZWxvdyB0byBnaXZlIGl0IGhpZ2hlciBwcmVjZWRlbmNlLiAqLworJXRva2VuIDx0c3ltPiBUWVBFTkFNRQorJXR5cGUgPHN2YWw+IG5hbWUKKyV0eXBlIDxzc3ltPiBuYW1lX25vdF90eXBlbmFtZQorJXR5cGUgPHRzeW0+IHR5cGVuYW1lCisKKy8qIEEgTkFNRV9PUl9JTlQgaXMgYSBzeW1ib2wgd2hpY2ggaXMgbm90IGtub3duIGluIHRoZSBzeW1ib2wgdGFibGUsCisgICBidXQgd2hpY2ggd291bGQgcGFyc2UgYXMgYSB2YWxpZCBudW1iZXIgaW4gdGhlIGN1cnJlbnQgaW5wdXQgcmFkaXguCisgICBFLmcuICJjIiB3aGVuIGlucHV0X3JhZGl4PT0xNi4gIERlcGVuZGluZyBvbiB0aGUgcGFyc2UsIGl0IHdpbGwgYmUKKyAgIHR1cm5lZCBpbnRvIGEgbmFtZSBvciBpbnRvIGEgbnVtYmVyLiAgKi8KKworJXRva2VuIDxzc3ltPiBOQU1FX09SX0lOVCAKKworJXRva2VuIFNUUlVDVCBDTEFTUyBVTklPTiBFTlVNIFNJWkVPRiBVTlNJR05FRCBDT0xPTkNPTE9OCisldG9rZW4gVEVNUExBVEUKKyV0b2tlbiBFUlJPUgorCisvKiBTcGVjaWFsIHR5cGUgY2FzZXMsIHB1dCBpbiB0byBhbGxvdyB0aGUgcGFyc2VyIHRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudAorICAgbGVnYWwgYmFzZXR5cGVzLiAgKi8KKyV0b2tlbiBTSUdORURfS0VZV09SRCBMT05HIFNIT1JUIElOVF9LRVlXT1JEIENPTlNUX0tFWVdPUkQgVk9MQVRJTEVfS0VZV09SRCBET1VCTEVfS0VZV09SRAorCisldG9rZW4gPHZvaWR2YWw+IFZBUklBQkxFCisKKyV0b2tlbiA8b3Bjb2RlPiBBU1NJR05fTU9ESUZZCisKKy8qIEMrKyAqLworJXRva2VuIFRISVMKKyV0b2tlbiBUUlVFS0VZV09SRAorJXRva2VuIEZBTFNFS0VZV09SRAorCisKKyVsZWZ0ICcsJworJWxlZnQgQUJPVkVfQ09NTUEKKyVyaWdodCAnPScgQVNTSUdOX01PRElGWQorJXJpZ2h0ICc/JworJWxlZnQgT1JPUgorJWxlZnQgQU5EQU5ECislbGVmdCAnfCcKKyVsZWZ0ICdeJworJWxlZnQgJyYnCislbGVmdCBFUVVBTCBOT1RFUVVBTAorJWxlZnQgJzwnICc+JyBMRVEgR0VRCislbGVmdCBMU0ggUlNICislbGVmdCAnQCcKKyVsZWZ0ICcrJyAnLScKKyVsZWZ0ICcqJyAnLycgJyUnCislcmlnaHQgVU5BUlkgSU5DUkVNRU5UIERFQ1JFTUVOVAorJXJpZ2h0IEFSUk9XICcuJyAnWycgJygnCisldG9rZW4gPHNzeW0+IEJMT0NLTkFNRSAKKyV0b2tlbiA8YnZhbD4gRklMRU5BTUUKKyV0eXBlIDxidmFsPiBibG9jaworJWxlZnQgQ09MT05DT0xPTgorCisMCislJQorCitzdGFydCAgIDoJZXhwMQorCXwJdHlwZV9leHAKKwk7CisKK3R5cGVfZXhwOgl0eXBlCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpOworCQkJICB3cml0ZV9leHBfZWx0X3R5cGUoJDEpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZShPUF9UWVBFKTt9CisJOworCisvKiBFeHByZXNzaW9ucywgaW5jbHVkaW5nIHRoZSBjb21tYSBvcGVyYXRvci4gICovCitleHAxCToJZXhwCisJfAlleHAxICcsJyBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0NPTU1BKTsgfQorCTsKKworLyogRXhwcmVzc2lvbnMsIG5vdCBpbmNsdWRpbmcgdGhlIGNvbW1hIG9wZXJhdG9yLiAgKi8KK2V4cAk6CScqJyBleHAgICAgJXByZWMgVU5BUlkKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfSU5EKTsgfQorCitleHAJOgknJicgZXhwICAgICVwcmVjIFVOQVJZCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0FERFIpOyB9CisKK2V4cAk6CSctJyBleHAgICAgJXByZWMgVU5BUlkKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTkVHKTsgfQorCTsKKworZXhwCToJJyEnIGV4cCAgICAlcHJlYyBVTkFSWQorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9MT0dJQ0FMX05PVCk7IH0KKwk7CisKK2V4cAk6CSd+JyBleHAgICAgJXByZWMgVU5BUlkKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ09NUExFTUVOVCk7IH0KKwk7CisKK2V4cAk6CUlOQ1JFTUVOVCBleHAgICAgJXByZWMgVU5BUlkKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfUFJFSU5DUkVNRU5UKTsgfQorCTsKKworZXhwCToJREVDUkVNRU5UIGV4cCAgICAlcHJlYyBVTkFSWQorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9QUkVERUNSRU1FTlQpOyB9CisJOworCitleHAJOglleHAgSU5DUkVNRU5UICAgICVwcmVjIFVOQVJZCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX1BPU1RJTkNSRU1FTlQpOyB9CisJOworCitleHAJOglleHAgREVDUkVNRU5UICAgICVwcmVjIFVOQVJZCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX1BPU1RERUNSRU1FTlQpOyB9CisJOworCitleHAJOglTSVpFT0YgZXhwICAgICAgICVwcmVjIFVOQVJZCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX1NJWkVPRik7IH0KKwk7CisKK2V4cAk6CWV4cCBBUlJPVyBuYW1lCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9QVFIpOworCQkJICB3cml0ZV9leHBfc3RyaW5nICgkMyk7CisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9QVFIpOyB9CisJOworCitleHAJOglleHAgQVJST1cgcXVhbGlmaWVkX25hbWUKKwkJCXsgLyogZXhwLT50eXBlOjpuYW1lIGJlY29tZXMgZXhwLT4qKCZ0eXBlOjpuYW1lKSAqLworCQkJICAvKiBOb3RlOiB0aGlzIGRvZXNuJ3Qgd29yayBpZiBuYW1lIGlzIGEKKwkJCSAgICAgc3RhdGljIG1lbWJlciEgIEZJWE1FICovCisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0FERFIpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfTVBUUik7IH0KKwk7CisKK2V4cAk6CWV4cCBBUlJPVyAnKicgZXhwCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9NUFRSKTsgfQorCTsKKworZXhwCToJZXhwICcuJyBuYW1lCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9TVFJVQ1QpOworCQkJICB3cml0ZV9leHBfc3RyaW5nICgkMyk7CisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9TVFJVQ1QpOyB9CisJOworCitleHAJOglleHAgJy4nIHF1YWxpZmllZF9uYW1lCisJCQl7IC8qIGV4cC50eXBlOjpuYW1lIGJlY29tZXMgZXhwLiooJnR5cGU6Om5hbWUpICovCisJCQkgIC8qIE5vdGU6IHRoaXMgZG9lc24ndCB3b3JrIGlmIG5hbWUgaXMgYQorCQkJICAgICBzdGF0aWMgbWVtYmVyISAgRklYTUUgKi8KKwkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQUREUik7CisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9NRU1CRVIpOyB9CisJOworCitleHAJOglleHAgJy4nICcqJyBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX01FTUJFUik7IH0KKwk7CisKK2V4cAk6CWV4cCAnWycgZXhwMSAnXScKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1NVQlNDUklQVCk7IH0KKwk7CisKK2V4cAk6CWV4cCAnKCcgCisJCQkvKiBUaGlzIGlzIHRvIHNhdmUgdGhlIHZhbHVlIG9mIGFyZ2xpc3RfbGVuCisJCQkgICBiZWluZyBhY2N1bXVsYXRlZCBieSBhbiBvdXRlciBmdW5jdGlvbiBjYWxsLiAgKi8KKwkJCXsgc3RhcnRfYXJnbGlzdCAoKTsgfQorCQlhcmdsaXN0ICcpJwklcHJlYyBBUlJPVworCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRlVOQ0FMTCk7CisJCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIGVuZF9hcmdsaXN0ICgpKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0ZVTkNBTEwpOyB9CisJOworCitsY3VybHkJOgkneycKKwkJCXsgc3RhcnRfYXJnbGlzdCAoKTsgfQorCTsKKworYXJnbGlzdAk6CisJOworCithcmdsaXN0CToJZXhwCisJCQl7IGFyZ2xpc3RfbGVuID0gMTsgfQorCTsKKworYXJnbGlzdAk6CWFyZ2xpc3QgJywnIGV4cCAgICVwcmVjIEFCT1ZFX0NPTU1BCisJCQl7IGFyZ2xpc3RfbGVuKys7IH0KKwk7CisKK3JjdXJseQk6CSd9JworCQkJeyAkJCA9IGVuZF9hcmdsaXN0ICgpIC0gMTsgfQorCTsKK2V4cAk6CWxjdXJseSBhcmdsaXN0IHJjdXJseQklcHJlYyBBUlJPVworCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQVJSQVkpOworCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSAwKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgJDMpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQVJSQVkpOyB9CisJOworCitleHAJOglsY3VybHkgdHlwZSByY3VybHkgZXhwICAlcHJlYyBVTkFSWQorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9NRU1WQUwpOworCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKCQyKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTUVNVkFMKTsgfQorCTsKKworZXhwCToJJygnIHR5cGUgJyknIGV4cCAgJXByZWMgVU5BUlkKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7CisJCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoJDIpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsgfQorCTsKKworZXhwCToJJygnIGV4cDEgJyknCisJCQl7IH0KKwk7CisKKy8qIEJpbmFyeSBvcGVyYXRvcnMgaW4gb3JkZXIgb2YgZGVjcmVhc2luZyBwcmVjZWRlbmNlLiAgKi8KKworZXhwCToJZXhwICdAJyBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1JFUEVBVCk7IH0KKwk7CisKK2V4cAk6CWV4cCAnKicgZXhwCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9NVUwpOyB9CisJOworCitleHAJOglleHAgJy8nIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfRElWKTsgfQorCTsKKworZXhwCToJZXhwICclJyBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1JFTSk7IH0KKwk7CisKK2V4cAk6CWV4cCAnKycgZXhwCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BREQpOyB9CisJOworCitleHAJOglleHAgJy0nIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfU1VCKTsgfQorCTsKKworZXhwCToJZXhwIExTSCBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xTSCk7IH0KKwk7CisKK2V4cAk6CWV4cCBSU0ggZXhwCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9SU0gpOyB9CisJOworCitleHAJOglleHAgRVFVQUwgZXhwCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9FUVVBTCk7IH0KKwk7CisKK2V4cAk6CWV4cCBOT1RFUVVBTCBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX05PVEVRVUFMKTsgfQorCTsKKworZXhwCToJZXhwIExFUSBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xFUSk7IH0KKwk7CisKK2V4cAk6CWV4cCBHRVEgZXhwCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9HRVEpOyB9CisJOworCitleHAJOglleHAgJzwnIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTEVTUyk7IH0KKwk7CisKK2V4cAk6CWV4cCAnPicgZXhwCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9HVFIpOyB9CisJOworCitleHAJOglleHAgJyYnIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQklUV0lTRV9BTkQpOyB9CisJOworCitleHAJOglleHAgJ14nIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQklUV0lTRV9YT1IpOyB9CisJOworCitleHAJOglleHAgJ3wnIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQklUV0lTRV9JT1IpOyB9CisJOworCitleHAJOglleHAgQU5EQU5EIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTE9HSUNBTF9BTkQpOyB9CisJOworCitleHAJOglleHAgT1JPUiBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xPR0lDQUxfT1IpOyB9CisJOworCitleHAJOglleHAgJz8nIGV4cCAnOicgZXhwCSVwcmVjICc/JworCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoVEVSTk9QX0NPTkQpOyB9CisJOworCQkJICAKK2V4cAk6CWV4cCAnPScgZXhwCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BU1NJR04pOyB9CisJOworCitleHAJOglleHAgQVNTSUdOX01PRElGWSBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FTU0lHTl9NT0RJRlkpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoJDIpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQVNTSUdOX01PRElGWSk7IH0KKwk7CisKK2V4cAk6CUlOVAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7CisJCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoJDEudHlwZSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpKCQxLnZhbCkpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IH0KKwk7CisKK2V4cAk6CU5BTUVfT1JfSU5UCisJCQl7IFlZU1RZUEUgdmFsOworCQkJICBwYXJzZV9udW1iZXIgKCQxLnN0b2tlbi5wdHIsICQxLnN0b2tlbi5sZW5ndGgsIDAsICZ2YWwpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7CisJCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAodmFsLnR5cGVkX3ZhbF9pbnQudHlwZSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpdmFsLnR5cGVkX3ZhbF9pbnQudmFsKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOworCQkJfQorCTsKKworCitleHAJOglGTE9BVAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRE9VQkxFKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICgkMS50eXBlKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9kYmxjc3QgKCQxLmR2YWwpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRE9VQkxFKTsgfQorCTsKKworZXhwCToJdmFyaWFibGUKKwk7CisKK2V4cAk6CVZBUklBQkxFCisJCQkvKiBBbHJlYWR5IHdyaXR0ZW4gYnkgd3JpdGVfZG9sbGFyX3ZhcmlhYmxlLiAqLworCTsKKworZXhwCToJU0laRU9GICcoJyB0eXBlICcpJwklcHJlYyBVTkFSWQorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7CisJCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX2ludCk7CisJCQkgIENIRUNLX1RZUEVERUYgKCQzKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgVFlQRV9MRU5HVEggKCQzKSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsgfQorCTsKKworZXhwCToJU1RSSU5HCisJCQl7IC8qIEMgc3RyaW5ncyBhcmUgY29udmVydGVkIGludG8gYXJyYXkgY29uc3RhbnRzIHdpdGgKKwkJCSAgICAgYW4gZXhwbGljaXQgbnVsbCBieXRlIGFkZGVkIGF0IHRoZSBlbmQuICBUaHVzCisJCQkgICAgIHRoZSBhcnJheSB1cHBlciBib3VuZCBpcyB0aGUgc3RyaW5nIGxlbmd0aC4KKwkJCSAgICAgVGhlcmUgaXMgbm8gc3VjaCB0aGluZyBpbiBDIGFzIGEgY29tcGxldGVseSBlbXB0eQorCQkJICAgICBzdHJpbmcuICovCisJCQkgIGNoYXIgKnNwID0gJDEucHRyOyBpbnQgY291bnQgPSAkMS5sZW5ndGg7CisJCQkgIHdoaWxlIChjb3VudC0tID4gMCkKKwkJCSAgICB7CisJCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7CisJCQkgICAgICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9jaGFyKTsKKwkJCSAgICAgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpKCpzcCsrKSk7CisJCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7CisJCQkgICAgfQorCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7CisJCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX2NoYXIpOworCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSdcMCcpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7CisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9BUlJBWSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIDApOworCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSAoJDEubGVuZ3RoKSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9BUlJBWSk7IH0KKwk7CisKKy8qIEMrKy4gICovCitleHAJOglUSElTCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9USElTKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1RISVMpOyB9CisJOworCitleHAgICAgIDogICAgICAgVFJVRUtFWVdPUkQgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZXhwX2VsdF90eXBlIChidWlsdGluX3R5cGVfYm9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IH0KKwk7CisKK2V4cCAgICAgOiAgICAgICBGQUxTRUtFWVdPUkQgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOworICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9ib29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsgfQorCTsKKworLyogZW5kIG9mIEMrKy4gICovCisKK2Jsb2NrCToJQkxPQ0tOQU1FCisJCQl7CisJCQkgIGlmICgkMS5zeW0pCisJCQkgICAgJCQgPSBTWU1CT0xfQkxPQ0tfVkFMVUUgKCQxLnN5bSk7CisJCQkgIGVsc2UKKwkJCSAgICBlcnJvciAoIk5vIGZpbGUgb3IgZnVuY3Rpb24gXCIlc1wiLiIsCisJCQkJICAgY29weV9uYW1lICgkMS5zdG9rZW4pKTsKKwkJCX0KKwl8CUZJTEVOQU1FCisJCQl7CisJCQkgICQkID0gJDE7CisJCQl9CisJOworCitibG9jawk6CWJsb2NrIENPTE9OQ09MT04gbmFtZQorCQkJeyBzdHJ1Y3Qgc3ltYm9sICp0ZW0KKwkJCSAgICA9IGxvb2t1cF9zeW1ib2wgKGNvcHlfbmFtZSAoJDMpLCAkMSwKKwkJCQkJICAgICBWQVJfTkFNRVNQQUNFLCAoaW50ICopIE5VTEwsCisJCQkJCSAgICAgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpOworCQkJICBpZiAoIXRlbSB8fCBTWU1CT0xfQ0xBU1MgKHRlbSkgIT0gTE9DX0JMT0NLKQorCQkJICAgIGVycm9yICgiTm8gZnVuY3Rpb24gXCIlc1wiIGluIHNwZWNpZmllZCBjb250ZXh0LiIsCisJCQkJICAgY29weV9uYW1lICgkMykpOworCQkJICAkJCA9IFNZTUJPTF9CTE9DS19WQUxVRSAodGVtKTsgfQorCTsKKwordmFyaWFibGU6CWJsb2NrIENPTE9OQ09MT04gbmFtZQorCQkJeyBzdHJ1Y3Qgc3ltYm9sICpzeW07CisJCQkgIHN5bSA9IGxvb2t1cF9zeW1ib2wgKGNvcHlfbmFtZSAoJDMpLCAkMSwKKwkJCQkJICAgICAgIFZBUl9OQU1FU1BBQ0UsIChpbnQgKikgTlVMTCwKKwkJCQkJICAgICAgIChzdHJ1Y3Qgc3ltdGFiICoqKSBOVUxMKTsKKwkJCSAgaWYgKHN5bSA9PSAwKQorCQkJICAgIGVycm9yICgiTm8gc3ltYm9sIFwiJXNcIiBpbiBzcGVjaWZpZWQgY29udGV4dC4iLAorCQkJCSAgIGNvcHlfbmFtZSAoJDMpKTsKKworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsKKwkJCSAgLyogYmxvY2tfZm91bmQgaXMgc2V0IGJ5IGxvb2t1cF9zeW1ib2wuICAqLworCQkJICB3cml0ZV9leHBfZWx0X2Jsb2NrIChibG9ja19mb3VuZCk7CisJCQkgIHdyaXRlX2V4cF9lbHRfc3ltIChzeW0pOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsgfQorCTsKKworcXVhbGlmaWVkX25hbWU6CXR5cGViYXNlIENPTE9OQ09MT04gbmFtZQorCQkJeworCQkJICBzdHJ1Y3QgdHlwZSAqdHlwZSA9ICQxOworCQkJICBpZiAoVFlQRV9DT0RFICh0eXBlKSAhPSBUWVBFX0NPREVfU1RSVUNUCisJCQkgICAgICAmJiBUWVBFX0NPREUgKHR5cGUpICE9IFRZUEVfQ09ERV9VTklPTikKKwkJCSAgICBlcnJvciAoImAlcycgaXMgbm90IGRlZmluZWQgYXMgYW4gYWdncmVnYXRlIHR5cGUuIiwKKwkJCQkgICBUWVBFX05BTUUgKHR5cGUpKTsKKworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfU0NPUEUpOworCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHR5cGUpOworCQkJICB3cml0ZV9leHBfc3RyaW5nICgkMyk7CisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9TQ09QRSk7CisJCQl9CisJfAl0eXBlYmFzZSBDT0xPTkNPTE9OICd+JyBuYW1lCisJCQl7CisJCQkgIHN0cnVjdCB0eXBlICp0eXBlID0gJDE7CisJCQkgIHN0cnVjdCBzdG9rZW4gdG1wX3Rva2VuOworCQkJICBpZiAoVFlQRV9DT0RFICh0eXBlKSAhPSBUWVBFX0NPREVfU1RSVUNUCisJCQkgICAgICAmJiBUWVBFX0NPREUgKHR5cGUpICE9IFRZUEVfQ09ERV9VTklPTikKKwkJCSAgICBlcnJvciAoImAlcycgaXMgbm90IGRlZmluZWQgYXMgYW4gYWdncmVnYXRlIHR5cGUuIiwKKwkJCQkgICBUWVBFX05BTUUgKHR5cGUpKTsKKworCQkJICB0bXBfdG9rZW4ucHRyID0gKGNoYXIqKSBhbGxvY2EgKCQ0Lmxlbmd0aCArIDIpOworCQkJICB0bXBfdG9rZW4ubGVuZ3RoID0gJDQubGVuZ3RoICsgMTsKKwkJCSAgdG1wX3Rva2VuLnB0clswXSA9ICd+JzsKKwkJCSAgbWVtY3B5ICh0bXBfdG9rZW4ucHRyKzEsICQ0LnB0ciwgJDQubGVuZ3RoKTsKKwkJCSAgdG1wX3Rva2VuLnB0clt0bXBfdG9rZW4ubGVuZ3RoXSA9IDA7CisKKwkJCSAgLyogQ2hlY2sgZm9yIHZhbGlkIGRlc3RydWN0b3IgbmFtZS4gICovCisJCQkgIGRlc3RydWN0b3JfbmFtZV9wICh0bXBfdG9rZW4ucHRyLCB0eXBlKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1NDT1BFKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh0eXBlKTsKKwkJCSAgd3JpdGVfZXhwX3N0cmluZyAodG1wX3Rva2VuKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1NDT1BFKTsKKwkJCX0KKwk7CisKK3ZhcmlhYmxlOglxdWFsaWZpZWRfbmFtZQorCXwJQ09MT05DT0xPTiBuYW1lCisJCQl7CisJCQkgIGNoYXIgKm5hbWUgPSBjb3B5X25hbWUgKCQyKTsKKwkJCSAgc3RydWN0IHN5bWJvbCAqc3ltOworCQkJICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisKKwkJCSAgc3ltID0KKwkJCSAgICBsb29rdXBfc3ltYm9sIChuYW1lLCAoY29uc3Qgc3RydWN0IGJsb2NrICopIE5VTEwsCisJCQkJCSAgIFZBUl9OQU1FU1BBQ0UsIChpbnQgKikgTlVMTCwKKwkJCQkJICAgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpOworCQkJICBpZiAoc3ltKQorCQkJICAgIHsKKwkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOworCQkJICAgICAgd3JpdGVfZXhwX2VsdF9ibG9jayAoTlVMTCk7CisJCQkgICAgICB3cml0ZV9leHBfZWx0X3N5bSAoc3ltKTsKKwkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOworCQkJICAgICAgYnJlYWs7CisJCQkgICAgfQorCisJCQkgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKG5hbWUsIE5VTEwsIE5VTEwpOworCQkJICBpZiAobXN5bWJvbCAhPSBOVUxMKQorCQkJICAgIHsKKwkJCSAgICAgIHdyaXRlX2V4cF9tc3ltYm9sIChtc3ltYm9sLAorCQkJCQkJIGxvb2t1cF9mdW5jdGlvbl90eXBlIChidWlsdGluX3R5cGVfaW50KSwKKwkJCQkJCSBidWlsdGluX3R5cGVfaW50KTsKKwkJCSAgICB9CisJCQkgIGVsc2UKKwkJCSAgICBpZiAoIWhhdmVfZnVsbF9zeW1ib2xzICgpICYmICFoYXZlX3BhcnRpYWxfc3ltYm9scyAoKSkKKwkJCSAgICAgIGVycm9yICgiTm8gc3ltYm9sIHRhYmxlIGlzIGxvYWRlZC4gIFVzZSB0aGUgXCJmaWxlXCIgY29tbWFuZC4iKTsKKwkJCSAgICBlbHNlCisJCQkgICAgICBlcnJvciAoIk5vIHN5bWJvbCBcIiVzXCIgaW4gY3VycmVudCBjb250ZXh0LiIsIG5hbWUpOworCQkJfQorCTsKKwordmFyaWFibGU6CW5hbWVfbm90X3R5cGVuYW1lCisJCQl7IHN0cnVjdCBzeW1ib2wgKnN5bSA9ICQxLnN5bTsKKworCQkJICBpZiAoc3ltKQorCQkJICAgIHsKKwkJCSAgICAgIGlmIChzeW1ib2xfcmVhZF9uZWVkc19mcmFtZSAoc3ltKSkKKwkJCQl7CisJCQkJICBpZiAoaW5uZXJtb3N0X2Jsb2NrID09IDAgfHwKKwkJCQkgICAgICBjb250YWluZWRfaW4gKGJsb2NrX2ZvdW5kLCAKKwkJCQkJCSAgICBpbm5lcm1vc3RfYmxvY2spKQorCQkJCSAgICBpbm5lcm1vc3RfYmxvY2sgPSBibG9ja19mb3VuZDsKKwkJCQl9CisKKwkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOworCQkJICAgICAgLyogV2Ugd2FudCB0byB1c2UgdGhlIHNlbGVjdGVkIGZyYW1lLCBub3QKKwkJCQkgYW5vdGhlciBtb3JlIGlubmVyIGZyYW1lIHdoaWNoIGhhcHBlbnMgdG8KKwkJCQkgYmUgaW4gdGhlIHNhbWUgYmxvY2suICAqLworCQkJICAgICAgd3JpdGVfZXhwX2VsdF9ibG9jayAoTlVMTCk7CisJCQkgICAgICB3cml0ZV9leHBfZWx0X3N5bSAoc3ltKTsKKwkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOworCQkJICAgIH0KKwkJCSAgZWxzZSBpZiAoJDEuaXNfYV9maWVsZF9vZl90aGlzKQorCQkJICAgIHsKKwkJCSAgICAgIC8qIEMrKzogaXQgaGFuZ3Mgb2ZmIG9mIGB0aGlzJy4gIE11c3QKKwkJCSAgICAgICAgIG5vdCBpbmFkdmVydGVudGx5IGNvbnZlcnQgZnJvbSBhIG1ldGhvZCBjYWxsCisJCQkJIHRvIGRhdGEgcmVmLiAgKi8KKwkJCSAgICAgIGlmIChpbm5lcm1vc3RfYmxvY2sgPT0gMCB8fCAKKwkJCQkgIGNvbnRhaW5lZF9pbiAoYmxvY2tfZm91bmQsIGlubmVybW9zdF9ibG9jaykpCisJCQkJaW5uZXJtb3N0X2Jsb2NrID0gYmxvY2tfZm91bmQ7CisJCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVEhJUyk7CisJCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVEhJUyk7CisJCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfUFRSKTsKKwkJCSAgICAgIHdyaXRlX2V4cF9zdHJpbmcgKCQxLnN0b2tlbik7CisJCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfUFRSKTsKKwkJCSAgICB9CisJCQkgIGVsc2UKKwkJCSAgICB7CisJCQkgICAgICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisJCQkgICAgICByZWdpc3RlciBjaGFyICphcmcgPSBjb3B5X25hbWUgKCQxLnN0b2tlbik7CisKKwkJCSAgICAgIG1zeW1ib2wgPQorCQkJCWxvb2t1cF9taW5pbWFsX3N5bWJvbCAoYXJnLCBOVUxMLCBOVUxMKTsKKwkJCSAgICAgIGlmIChtc3ltYm9sICE9IE5VTEwpCisJCQkJeworCQkJCSAgd3JpdGVfZXhwX21zeW1ib2wgKG1zeW1ib2wsCisJCQkJCQkgICAgIGxvb2t1cF9mdW5jdGlvbl90eXBlIChidWlsdGluX3R5cGVfaW50KSwKKwkJCQkJCSAgICAgYnVpbHRpbl90eXBlX2ludCk7CisJCQkJfQorCQkJICAgICAgZWxzZSBpZiAoIWhhdmVfZnVsbF9zeW1ib2xzICgpICYmICFoYXZlX3BhcnRpYWxfc3ltYm9scyAoKSkKKwkJCQllcnJvciAoIk5vIHN5bWJvbCB0YWJsZSBpcyBsb2FkZWQuICBVc2UgdGhlIFwiZmlsZVwiIGNvbW1hbmQuIik7CisJCQkgICAgICBlbHNlCisJCQkJZXJyb3IgKCJObyBzeW1ib2wgXCIlc1wiIGluIGN1cnJlbnQgY29udGV4dC4iLAorCQkJCSAgICAgICBjb3B5X25hbWUgKCQxLnN0b2tlbikpOworCQkJICAgIH0KKwkJCX0KKwk7CisKKworcHR5cGUJOgl0eXBlYmFzZQorCS8qICJjb25zdCIgYW5kICJ2b2xhdGlsZSIgYXJlIGN1cmVudGx5IGlnbm9yZWQuICBBIHR5cGUgcXVhbGlmaWVyCisJICAgYmVmb3JlIHRoZSB0eXBlIGlzIGN1cnJlbnRseSBoYW5kbGVkIGluIHRoZSB0eXBlYmFzZSBydWxlLgorCSAgIFRoZSByZWFzb24gZm9yIHJlY29nbml6aW5nIHRoZXNlIGhlcmUgKHNoaWZ0L3JlZHVjZSBjb25mbGljdHMpCisJICAgbWlnaHQgYmUgb2Jzb2xldGUgbm93IHRoYXQgc29tZSBwb2ludGVyIHRvIG1lbWJlciBydWxlcyBoYXZlCisJICAgYmVlbiBkZWxldGVkLiAgKi8KKwl8CXR5cGViYXNlIENPTlNUX0tFWVdPUkQKKwl8CXR5cGViYXNlIFZPTEFUSUxFX0tFWVdPUkQKKwl8CXR5cGViYXNlIGFic19kZWNsCisJCXsgJCQgPSBmb2xsb3dfdHlwZXMgKCQxKTsgfQorCXwJdHlwZWJhc2UgQ09OU1RfS0VZV09SRCBhYnNfZGVjbAorCQl7ICQkID0gZm9sbG93X3R5cGVzICgkMSk7IH0KKwl8CXR5cGViYXNlIFZPTEFUSUxFX0tFWVdPUkQgYWJzX2RlY2wKKwkJeyAkJCA9IGZvbGxvd190eXBlcyAoJDEpOyB9CisJOworCithYnNfZGVjbDoJJyonCisJCQl7IHB1c2hfdHlwZSAodHBfcG9pbnRlcik7ICQkID0gMDsgfQorCXwJJyonIGFic19kZWNsCisJCQl7IHB1c2hfdHlwZSAodHBfcG9pbnRlcik7ICQkID0gJDI7IH0KKwl8CScmJworCQkJeyBwdXNoX3R5cGUgKHRwX3JlZmVyZW5jZSk7ICQkID0gMDsgfQorCXwJJyYnIGFic19kZWNsCisJCQl7IHB1c2hfdHlwZSAodHBfcmVmZXJlbmNlKTsgJCQgPSAkMjsgfQorCXwJZGlyZWN0X2Fic19kZWNsCisJOworCitkaXJlY3RfYWJzX2RlY2w6ICcoJyBhYnNfZGVjbCAnKScKKwkJCXsgJCQgPSAkMjsgfQorCXwJZGlyZWN0X2Fic19kZWNsIGFycmF5X21vZAorCQkJeworCQkJICBwdXNoX3R5cGVfaW50ICgkMik7CisJCQkgIHB1c2hfdHlwZSAodHBfYXJyYXkpOworCQkJfQorCXwJYXJyYXlfbW9kCisJCQl7CisJCQkgIHB1c2hfdHlwZV9pbnQgKCQxKTsKKwkJCSAgcHVzaF90eXBlICh0cF9hcnJheSk7CisJCQkgICQkID0gMDsKKwkJCX0KKworCXwgCWRpcmVjdF9hYnNfZGVjbCBmdW5jX21vZAorCQkJeyBwdXNoX3R5cGUgKHRwX2Z1bmN0aW9uKTsgfQorCXwJZnVuY19tb2QKKwkJCXsgcHVzaF90eXBlICh0cF9mdW5jdGlvbik7IH0KKwk7CisKK2FycmF5X21vZDoJJ1snICddJworCQkJeyAkJCA9IC0xOyB9CisJfAknWycgSU5UICddJworCQkJeyAkJCA9ICQyLnZhbDsgfQorCTsKKworZnVuY19tb2Q6CScoJyAnKScKKwkJCXsgJCQgPSAwOyB9CisJfAknKCcgbm9uZW1wdHlfdHlwZWxpc3QgJyknCisJCQl7IGZyZWUgKChQVFIpJDIpOyAkJCA9IDA7IH0KKwk7CisKKy8qIFdlIHVzZWQgdG8gdHJ5IHRvIHJlY29nbml6ZSBtb3JlIHBvaW50ZXIgdG8gbWVtYmVyIHR5cGVzIGhlcmUsIGJ1dAorICAgdGhhdCBkaWRuJ3Qgd29yayAoc2hpZnQvcmVkdWNlIGNvbmZsaWN0cyBtZWFudCB0aGF0IHRoZXNlIHJ1bGVzIG5ldmVyCisgICBnb3QgZXhlY3V0ZWQpLiAgVGhlIHByb2JsZW0gaXMgdGhhdAorICAgICBpbnQgKGZvbzo6YmFyOjpiYXo6OmJpenpsZSkKKyAgIGlzIGEgZnVuY3Rpb24gdHlwZSBidXQKKyAgICAgaW50IChmb286OmJhcjo6YmF6OjpiaXp6bGU6OiopCisgICBpcyBhIHBvaW50ZXIgdG8gbWVtYmVyIHR5cGUuICBTdHJvdXN0cnVwIGxvc2VzIGFnYWluISAgKi8KKwordHlwZQk6CXB0eXBlCisJfAl0eXBlYmFzZSBDT0xPTkNPTE9OICcqJworCQkJeyAkJCA9IGxvb2t1cF9tZW1iZXJfdHlwZSAoYnVpbHRpbl90eXBlX2ludCwgJDEpOyB9CisJOworCit0eXBlYmFzZSAgLyogSW1wbGVtZW50cyAoYXBwcm94aW1hdGVseSk6ICh0eXBlLXF1YWxpZmllcikqIHR5cGUtc3BlY2lmaWVyICovCisJOglUWVBFTkFNRQorCQkJeyAkJCA9ICQxLnR5cGU7IH0KKwl8CUlOVF9LRVlXT1JECisJCQl7ICQkID0gYnVpbHRpbl90eXBlX2ludDsgfQorCXwJTE9ORworCQkJeyAkJCA9IGJ1aWx0aW5fdHlwZV9sb25nOyB9CisJfAlTSE9SVAorCQkJeyAkJCA9IGJ1aWx0aW5fdHlwZV9zaG9ydDsgfQorCXwJTE9ORyBJTlRfS0VZV09SRAorCQkJeyAkJCA9IGJ1aWx0aW5fdHlwZV9sb25nOyB9CisJfAlVTlNJR05FRCBMT05HIElOVF9LRVlXT1JECisJCQl7ICQkID0gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmc7IH0KKwl8CUxPTkcgTE9ORworCQkJeyAkJCA9IGJ1aWx0aW5fdHlwZV9sb25nX2xvbmc7IH0KKwl8CUxPTkcgTE9ORyBJTlRfS0VZV09SRAorCQkJeyAkJCA9IGJ1aWx0aW5fdHlwZV9sb25nX2xvbmc7IH0KKwl8CVVOU0lHTkVEIExPTkcgTE9ORworCQkJeyAkJCA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9sb25nX2xvbmc7IH0KKwl8CVVOU0lHTkVEIExPTkcgTE9ORyBJTlRfS0VZV09SRAorCQkJeyAkJCA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9sb25nX2xvbmc7IH0KKwl8CVNIT1JUIElOVF9LRVlXT1JECisJCQl7ICQkID0gYnVpbHRpbl90eXBlX3Nob3J0OyB9CisJfAlVTlNJR05FRCBTSE9SVCBJTlRfS0VZV09SRAorCQkJeyAkJCA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9zaG9ydDsgfQorCXwJRE9VQkxFX0tFWVdPUkQKKwkJCXsgJCQgPSBidWlsdGluX3R5cGVfZG91YmxlOyB9CisJfAlMT05HIERPVUJMRV9LRVlXT1JECisJCQl7ICQkID0gYnVpbHRpbl90eXBlX2xvbmdfZG91YmxlOyB9CisJfAlTVFJVQ1QgbmFtZQorCQkJeyAkJCA9IGxvb2t1cF9zdHJ1Y3QgKGNvcHlfbmFtZSAoJDIpLAorCQkJCQkgICAgICBleHByZXNzaW9uX2NvbnRleHRfYmxvY2spOyB9CisJfAlDTEFTUyBuYW1lCisJCQl7ICQkID0gbG9va3VwX3N0cnVjdCAoY29weV9uYW1lICgkMiksCisJCQkJCSAgICAgIGV4cHJlc3Npb25fY29udGV4dF9ibG9jayk7IH0KKwl8CVVOSU9OIG5hbWUKKwkJCXsgJCQgPSBsb29rdXBfdW5pb24gKGNvcHlfbmFtZSAoJDIpLAorCQkJCQkgICAgIGV4cHJlc3Npb25fY29udGV4dF9ibG9jayk7IH0KKwl8CUVOVU0gbmFtZQorCQkJeyAkJCA9IGxvb2t1cF9lbnVtIChjb3B5X25hbWUgKCQyKSwKKwkJCQkJICAgIGV4cHJlc3Npb25fY29udGV4dF9ibG9jayk7IH0KKwl8CVVOU0lHTkVEIHR5cGVuYW1lCisJCQl7ICQkID0gbG9va3VwX3Vuc2lnbmVkX3R5cGVuYW1lIChUWVBFX05BTUUoJDIudHlwZSkpOyB9CisJfAlVTlNJR05FRAorCQkJeyAkJCA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9pbnQ7IH0KKwl8CVNJR05FRF9LRVlXT1JEIHR5cGVuYW1lCisJCQl7ICQkID0gbG9va3VwX3NpZ25lZF90eXBlbmFtZSAoVFlQRV9OQU1FKCQyLnR5cGUpKTsgfQorCXwJU0lHTkVEX0tFWVdPUkQKKwkJCXsgJCQgPSBidWlsdGluX3R5cGVfaW50OyB9CisgICAgICAgICAgICAgICAgLyogSXQgYXBwZWFycyB0aGF0IHRoaXMgcnVsZSBmb3IgdGVtcGxhdGVzIGlzIG5ldmVyCisgICAgICAgICAgICAgICAgICAgcmVkdWNlZDsgdGVtcGxhdGUgcmVjb2duaXRpb24gaGFwcGVucyBieSBsb29rYWhlYWQKKyAgICAgICAgICAgICAgICAgICBpbiB0aGUgdG9rZW4gcHJvY2Vzc2luZyBjb2RlIGluIHl5bGV4LiAqLyAgICAgICAgIAorCXwJVEVNUExBVEUgbmFtZSAnPCcgdHlwZSAnPicKKwkJCXsgJCQgPSBsb29rdXBfdGVtcGxhdGVfdHlwZShjb3B5X25hbWUoJDIpLCAkNCwKKwkJCQkJCSAgICBleHByZXNzaW9uX2NvbnRleHRfYmxvY2spOworCQkJfQorCS8qICJjb25zdCIgYW5kICJ2b2xhdGlsZSIgYXJlIGN1cmVudGx5IGlnbm9yZWQuICBBIHR5cGUgcXVhbGlmaWVyCisJICAgYWZ0ZXIgdGhlIHR5cGUgaXMgaGFuZGxlZCBpbiB0aGUgcHR5cGUgcnVsZS4gIEkgdGhpbmsgdGhlc2UgY291bGQKKwkgICBiZSB0b28uICAqLworCXwJQ09OU1RfS0VZV09SRCB0eXBlYmFzZSB7ICQkID0gJDI7IH0KKwl8CVZPTEFUSUxFX0tFWVdPUkQgdHlwZWJhc2UgeyAkJCA9ICQyOyB9CisJOworCit0eXBlbmFtZToJVFlQRU5BTUUKKwl8CUlOVF9LRVlXT1JECisJCXsKKwkJICAkJC5zdG9rZW4ucHRyID0gImludCI7CisJCSAgJCQuc3Rva2VuLmxlbmd0aCA9IDM7CisJCSAgJCQudHlwZSA9IGJ1aWx0aW5fdHlwZV9pbnQ7CisJCX0KKwl8CUxPTkcKKwkJeworCQkgICQkLnN0b2tlbi5wdHIgPSAibG9uZyI7CisJCSAgJCQuc3Rva2VuLmxlbmd0aCA9IDQ7CisJCSAgJCQudHlwZSA9IGJ1aWx0aW5fdHlwZV9sb25nOworCQl9CisJfAlTSE9SVAorCQl7CisJCSAgJCQuc3Rva2VuLnB0ciA9ICJzaG9ydCI7CisJCSAgJCQuc3Rva2VuLmxlbmd0aCA9IDU7CisJCSAgJCQudHlwZSA9IGJ1aWx0aW5fdHlwZV9zaG9ydDsKKwkJfQorCTsKKworbm9uZW1wdHlfdHlwZWxpc3QKKwk6CXR5cGUKKwkJeyAkJCA9IChzdHJ1Y3QgdHlwZSAqKikgbWFsbG9jIChzaXplb2YgKHN0cnVjdCB0eXBlICopICogMik7CisJCSAgJDxpdmVjPiRbMF0gPSAxOwkvKiBOdW1iZXIgb2YgdHlwZXMgaW4gdmVjdG9yICovCisJCSAgJCRbMV0gPSAkMTsKKwkJfQorCXwJbm9uZW1wdHlfdHlwZWxpc3QgJywnIHR5cGUKKwkJeyBpbnQgbGVuID0gc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSAqICgrKygkPGl2ZWM+MVswXSkgKyAxKTsKKwkJICAkJCA9IChzdHJ1Y3QgdHlwZSAqKikgcmVhbGxvYyAoKGNoYXIgKikgJDEsIGxlbik7CisJCSAgJCRbJDxpdmVjPiRbMF1dID0gJDM7CisJCX0KKwk7CisKK25hbWUJOglOQU1FIHsgJCQgPSAkMS5zdG9rZW47IH0KKwl8CUJMT0NLTkFNRSB7ICQkID0gJDEuc3Rva2VuOyB9CisJfAlUWVBFTkFNRSB7ICQkID0gJDEuc3Rva2VuOyB9CisJfAlOQU1FX09SX0lOVCAgeyAkJCA9ICQxLnN0b2tlbjsgfQorCTsKKworbmFtZV9ub3RfdHlwZW5hbWUgOglOQU1FCisJfAlCTE9DS05BTUUKKy8qIFRoZXNlIHdvdWxkIGJlIHVzZWZ1bCBpZiBuYW1lX25vdF90eXBlbmFtZSB3YXMgdXNlZnVsLCBidXQgaXQgaXMganVzdAorICAgYSBmYWtlIGZvciAidmFyaWFibGUiLCBzbyB0aGVzZSBjYXVzZSByZWR1Y2UvcmVkdWNlIGNvbmZsaWN0cyBiZWNhdXNlCisgICB0aGUgcGFyc2VyIGNhbid0IHRlbGwgd2hldGhlciBOQU1FX09SX0lOVCBpcyBhIG5hbWVfbm90X3R5cGVuYW1lICg9dmFyaWFibGUsCisgICA9ZXhwKSBvciBqdXN0IGFuIGV4cC4gIElmIG5hbWVfbm90X3R5cGVuYW1lIHdhcyBldmVyIHVzZWQgaW4gYW4gbHZhbHVlCisgICBjb250ZXh0IHdoZXJlIG9ubHkgYSBuYW1lIGNvdWxkIG9jY3VyLCB0aGlzIG1pZ2h0IGJlIHVzZWZ1bC4KKyAgCXwJTkFNRV9PUl9JTlQKKyAqLworCTsKKworJSUKKworLyogVGFrZSBjYXJlIG9mIHBhcnNpbmcgYSBudW1iZXIgKGFueXRoaW5nIHRoYXQgc3RhcnRzIHdpdGggYSBkaWdpdCkuCisgICBTZXQgeXlsdmFsIGFuZCByZXR1cm4gdGhlIHRva2VuIHR5cGU7IHVwZGF0ZSBsZXhwdHIuCisgICBMRU4gaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGl0LiAgKi8KKworLyoqKiBOZWVkcyBzb21lIGVycm9yIGNoZWNraW5nIGZvciB0aGUgZmxvYXQgY2FzZSAqKiovCisKK3N0YXRpYyBpbnQKK3BhcnNlX251bWJlciAocCwgbGVuLCBwYXJzZWRfZmxvYXQsIHB1dGl0aGVyZSkKKyAgICAgcmVnaXN0ZXIgY2hhciAqcDsKKyAgICAgcmVnaXN0ZXIgaW50IGxlbjsKKyAgICAgaW50IHBhcnNlZF9mbG9hdDsKKyAgICAgWVlTVFlQRSAqcHV0aXRoZXJlOworeworICAvKiBGSVhNRTogU2hvdWxkbid0IHRoZXNlIGJlIHVuc2lnbmVkPyAgV2UgZG9uJ3QgZGVhbCB3aXRoIG5lZ2F0aXZlIHZhbHVlcworICAgICBoZXJlLCBhbmQgd2UgZG8ga2luZCBvZiBzaWxseSB0aGluZ3MgbGlrZSBjYXN0IHRvIHVuc2lnbmVkLiAgKi8KKyAgcmVnaXN0ZXIgTE9OR0VTVCBuID0gMDsKKyAgcmVnaXN0ZXIgTE9OR0VTVCBwcmV2biA9IDA7CisgIFVMT05HRVNUIHVuOworCisgIHJlZ2lzdGVyIGludCBpID0gMDsKKyAgcmVnaXN0ZXIgaW50IGM7CisgIHJlZ2lzdGVyIGludCBiYXNlID0gaW5wdXRfcmFkaXg7CisgIGludCB1bnNpZ25lZF9wID0gMDsKKworICAvKiBOdW1iZXIgb2YgIkwiIHN1ZmZpeGVzIGVuY291bnRlcmVkLiAgKi8KKyAgaW50IGxvbmdfcCA9IDA7CisKKyAgLyogV2UgaGF2ZSBmb3VuZCBhICJMIiBvciAiVSIgc3VmZml4LiAgKi8KKyAgaW50IGZvdW5kX3N1ZmZpeCA9IDA7CisKKyAgVUxPTkdFU1QgaGlnaF9iaXQ7CisgIHN0cnVjdCB0eXBlICpzaWduZWRfdHlwZTsKKyAgc3RydWN0IHR5cGUgKnVuc2lnbmVkX3R5cGU7CisKKyAgaWYgKHBhcnNlZF9mbG9hdCkKKyAgICB7CisgICAgICAvKiBJdCdzIGEgZmxvYXQgc2luY2UgaXQgY29udGFpbnMgYSBwb2ludCBvciBhbiBleHBvbmVudC4gICovCisgICAgICBjaGFyIGM7CisgICAgICBpbnQgbnVtID0gMDsJLyogbnVtYmVyIG9mIHRva2VucyBzY2FubmVkIGJ5IHNjYW5mICovCisgICAgICBjaGFyIHNhdmVkX2NoYXIgPSBwW2xlbl07CisKKyAgICAgIHBbbGVuXSA9IDA7CS8qIG51bGwtdGVybWluYXRlIHRoZSB0b2tlbiAqLworICAgICAgaWYgKHNpemVvZiAocHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQuZHZhbCkgPD0gc2l6ZW9mIChmbG9hdCkpCisJbnVtID0gc3NjYW5mIChwLCAiJWclYyIsIChmbG9hdCAqKSAmcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQuZHZhbCwmYyk7CisgICAgICBlbHNlIGlmIChzaXplb2YgKHB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LmR2YWwpIDw9IHNpemVvZiAoZG91YmxlKSkKKwludW0gPSBzc2NhbmYgKHAsICIlbGclYyIsIChkb3VibGUgKikgJnB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LmR2YWwsJmMpOworICAgICAgZWxzZQorCXsKKyNpZmRlZiBTQ0FORl9IQVNfTE9OR19ET1VCTEUKKwkgIG51bSA9IHNzY2FuZiAocCwgIiVMZyVjIiwgJnB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LmR2YWwsJmMpOworI2Vsc2UKKwkgIC8qIFNjYW4gaXQgaW50byBhIGRvdWJsZSwgdGhlbiBhc3NpZ24gaXQgdG8gdGhlIGxvbmcgZG91YmxlLgorCSAgICAgVGhpcyBhdCBsZWFzdCB3aW5zIHdpdGggdmFsdWVzIHJlcHJlc2VudGFibGUgaW4gdGhlIHJhbmdlCisJICAgICBvZiBkb3VibGVzLiAqLworCSAgZG91YmxlIHRlbXA7CisJICBudW0gPSBzc2NhbmYgKHAsICIlbGclYyIsICZ0ZW1wLCZjKTsKKwkgIHB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LmR2YWwgPSB0ZW1wOworI2VuZGlmCisJfQorICAgICAgcFtsZW5dID0gc2F2ZWRfY2hhcjsJLyogcmVzdG9yZSB0aGUgaW5wdXQgc3RyZWFtICovCisgICAgICBpZiAobnVtICE9IDEpIAkJLyogY2hlY2sgc2NhbmYgZm91bmQgT05MWSBhIGZsb2F0IC4uLiAqLworCXJldHVybiBFUlJPUjsKKyAgICAgIC8qIFNlZSBpZiBpdCBoYXMgYGYnIG9yIGBsJyBzdWZmaXggKGZsb2F0IG9yIGxvbmcgZG91YmxlKS4gICovCisKKyAgICAgIGMgPSB0b2xvd2VyIChwW2xlbiAtIDFdKTsKKworICAgICAgaWYgKGMgPT0gJ2YnKQorCXB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LnR5cGUgPSBidWlsdGluX3R5cGVfZmxvYXQ7CisgICAgICBlbHNlIGlmIChjID09ICdsJykKKwlwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC50eXBlID0gYnVpbHRpbl90eXBlX2xvbmdfZG91YmxlOworICAgICAgZWxzZSBpZiAoaXNkaWdpdCAoYykgfHwgYyA9PSAnLicpCisJcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQudHlwZSA9IGJ1aWx0aW5fdHlwZV9kb3VibGU7CisgICAgICBlbHNlCisJcmV0dXJuIEVSUk9SOworCisgICAgICByZXR1cm4gRkxPQVQ7CisgICAgfQorCisgIC8qIEhhbmRsZSBiYXNlLXN3aXRjaGluZyBwcmVmaXhlcyAweCwgMHQsIDBkLCAwICovCisgIGlmIChwWzBdID09ICcwJykKKyAgICBzd2l0Y2ggKHBbMV0pCisgICAgICB7CisgICAgICBjYXNlICd4JzoKKyAgICAgIGNhc2UgJ1gnOgorCWlmIChsZW4gPj0gMykKKwkgIHsKKwkgICAgcCArPSAyOworCSAgICBiYXNlID0gMTY7CisJICAgIGxlbiAtPSAyOworCSAgfQorCWJyZWFrOworCisgICAgICBjYXNlICd0JzoKKyAgICAgIGNhc2UgJ1QnOgorICAgICAgY2FzZSAnZCc6CisgICAgICBjYXNlICdEJzoKKwlpZiAobGVuID49IDMpCisJICB7CisJICAgIHAgKz0gMjsKKwkgICAgYmFzZSA9IDEwOworCSAgICBsZW4gLT0gMjsKKwkgIH0KKwlicmVhazsKKworICAgICAgZGVmYXVsdDoKKwliYXNlID0gODsKKwlicmVhazsKKyAgICAgIH0KKworICB3aGlsZSAobGVuLS0gPiAwKQorICAgIHsKKyAgICAgIGMgPSAqcCsrOworICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQorCWMgKz0gJ2EnIC0gJ0EnOworICAgICAgaWYgKGMgIT0gJ2wnICYmIGMgIT0gJ3UnKQorCW4gKj0gYmFzZTsKKyAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKwl7CisJICBpZiAoZm91bmRfc3VmZml4KQorCSAgICByZXR1cm4gRVJST1I7CisJICBuICs9IGkgPSBjIC0gJzAnOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoYmFzZSA+IDEwICYmIGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorCSAgICB7CisJICAgICAgaWYgKGZvdW5kX3N1ZmZpeCkKKwkJcmV0dXJuIEVSUk9SOworCSAgICAgIG4gKz0gaSA9IGMgLSAnYScgKyAxMDsKKwkgICAgfQorCSAgZWxzZSBpZiAoYyA9PSAnbCcpCisJICAgIHsKKwkgICAgICArK2xvbmdfcDsKKwkgICAgICBmb3VuZF9zdWZmaXggPSAxOworCSAgICB9CisJICBlbHNlIGlmIChjID09ICd1JykKKwkgICAgeworCSAgICAgIHVuc2lnbmVkX3AgPSAxOworCSAgICAgIGZvdW5kX3N1ZmZpeCA9IDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgcmV0dXJuIEVSUk9SOwkvKiBDaGFyIG5vdCBhIGRpZ2l0ICovCisJfQorICAgICAgaWYgKGkgPj0gYmFzZSkKKwlyZXR1cm4gRVJST1I7CQkvKiBJbnZhbGlkIGRpZ2l0IGluIHRoaXMgYmFzZSAqLworCisgICAgICAvKiBQb3J0YWJseSB0ZXN0IGZvciBvdmVyZmxvdyAob25seSB3b3JrcyBmb3Igbm9uemVybyB2YWx1ZXMsIHNvIG1ha2UKKwkgYSBzZWNvbmQgY2hlY2sgZm9yIHplcm8pLiAgRklYTUU6IENhbid0IHdlIGp1c3QgbWFrZSBuIGFuZCBwcmV2bgorCSB1bnNpZ25lZCBhbmQgYXZvaWQgdGhpcz8gICovCisgICAgICBpZiAoYyAhPSAnbCcgJiYgYyAhPSAndScgJiYgKHByZXZuID49IG4pICYmIG4gIT0gMCkKKwl1bnNpZ25lZF9wID0gMTsJCS8qIFRyeSBzb21ldGhpbmcgdW5zaWduZWQgKi8KKworICAgICAgLyogUG9ydGFibHkgdGVzdCBmb3IgdW5zaWduZWQgb3ZlcmZsb3cuCisJIEZJWE1FOiBUaGlzIGNoZWNrIGlzIHdyb25nOyBmb3IgZXhhbXBsZSBpdCBkb2Vzbid0IGZpbmQgb3ZlcmZsb3cKKwkgb24gMHgxMjM0NTY3ODkgd2hlbiBMT05HRVNUIGlzIDMyIGJpdHMuICAqLworICAgICAgaWYgKGMgIT0gJ2wnICYmIGMgIT0gJ3UnICYmIG4gIT0gMCkKKwl7CQorCSAgaWYgKCh1bnNpZ25lZF9wICYmIChVTE9OR0VTVCkgcHJldm4gPj0gKFVMT05HRVNUKSBuKSkKKwkgICAgZXJyb3IgKCJOdW1lcmljIGNvbnN0YW50IHRvbyBsYXJnZS4iKTsKKwl9CisgICAgICBwcmV2biA9IG47CisgICAgfQorCisgIC8qIEFuIGludGVnZXIgY29uc3RhbnQgaXMgYW4gaW50LCBhIGxvbmcsIG9yIGEgbG9uZyBsb25nLiAgQW4gTAorICAgICBzdWZmaXggZm9yY2VzIGl0IHRvIGJlIGxvbmc7IGFuIExMIHN1ZmZpeCBmb3JjZXMgaXQgdG8gYmUgbG9uZworICAgICBsb25nLiAgSWYgbm90IGZvcmNlZCB0byBhIGxhcmdlciBzaXplLCBpdCBnZXRzIHRoZSBmaXJzdCB0eXBlIG9mCisgICAgIHRoZSBhYm92ZSB0aGF0IGl0IGZpdHMgaW4uICBUbyBmaWd1cmUgb3V0IHdoZXRoZXIgaXQgZml0cywgd2UKKyAgICAgc2hpZnQgaXQgcmlnaHQgYW5kIHNlZSB3aGV0aGVyIGFueXRoaW5nIHJlbWFpbnMuICBOb3RlIHRoYXQgd2UKKyAgICAgY2FuJ3Qgc2hpZnQgc2l6ZW9mIChMT05HRVNUKSAqIEhPU1RfQ0hBUl9CSVQgYml0cyBvciBtb3JlIGluIG9uZQorICAgICBvcGVyYXRpb24sIGJlY2F1c2UgbWFueSBjb21waWxlcnMgd2lsbCB3YXJuIGFib3V0IHN1Y2ggYSBzaGlmdAorICAgICAod2hpY2ggYWx3YXlzIHByb2R1Y2VzIGEgemVybyByZXN1bHQpLiAgU29tZXRpbWVzIFRBUkdFVF9JTlRfQklUCisgICAgIG9yIFRBUkdFVF9MT05HX0JJVCB3aWxsIGJlIHRoYXQgYmlnLCBzb21ldGltZXMgbm90LiAgVG8gZGVhbCB3aXRoCisgICAgIHRoZSBjYXNlIHdoZXJlIGl0IGlzIHdlIGp1c3QgYWx3YXlzIHNoaWZ0IHRoZSB2YWx1ZSBtb3JlIHRoYW4KKyAgICAgb25jZSwgd2l0aCBmZXdlciBiaXRzIGVhY2ggdGltZS4gICovCisKKyAgdW4gPSAoVUxPTkdFU1QpbiA+PiAyOworICBpZiAobG9uZ19wID09IDAKKyAgICAgICYmICh1biA+PiAoVEFSR0VUX0lOVF9CSVQgLSAyKSkgPT0gMCkKKyAgICB7CisgICAgICBoaWdoX2JpdCA9ICgoVUxPTkdFU1QpMSkgPDwgKFRBUkdFVF9JTlRfQklULTEpOworCisgICAgICAvKiBBIGxhcmdlIGRlY2ltYWwgKG5vdCBoZXggb3Igb2N0YWwpIGNvbnN0YW50IChiZXR3ZWVuIElOVF9NQVgKKwkgYW5kIFVJTlRfTUFYKSBpcyBhIGxvbmcgb3IgdW5zaWduZWQgbG9uZywgYWNjb3JkaW5nIHRvIEFOU0ksCisJIG5ldmVyIGFuIHVuc2lnbmVkIGludCwgYnV0IHRoaXMgY29kZSB0cmVhdHMgaXQgYXMgdW5zaWduZWQKKwkgaW50LiAgVGhpcyBwcm9iYWJseSBzaG91bGQgYmUgZml4ZWQuICBHQ0MgZ2l2ZXMgYSB3YXJuaW5nIG9uCisJIHN1Y2ggY29uc3RhbnRzLiAgKi8KKworICAgICAgdW5zaWduZWRfdHlwZSA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9pbnQ7CisgICAgICBzaWduZWRfdHlwZSA9IGJ1aWx0aW5fdHlwZV9pbnQ7CisgICAgfQorICBlbHNlIGlmIChsb25nX3AgPD0gMQorCSAgICYmICh1biA+PiAoVEFSR0VUX0xPTkdfQklUIC0gMikpID09IDApCisgICAgeworICAgICAgaGlnaF9iaXQgPSAoKFVMT05HRVNUKTEpIDw8IChUQVJHRVRfTE9OR19CSVQtMSk7CisgICAgICB1bnNpZ25lZF90eXBlID0gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmc7CisgICAgICBzaWduZWRfdHlwZSA9IGJ1aWx0aW5fdHlwZV9sb25nOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBzaGlmdDsKKyAgICAgIGlmIChzaXplb2YgKFVMT05HRVNUKSAqIEhPU1RfQ0hBUl9CSVQgPCBUQVJHRVRfTE9OR19MT05HX0JJVCkKKwkvKiBBIGxvbmcgbG9uZyBkb2VzIG5vdCBmaXQgaW4gYSBMT05HRVNULiAgKi8KKwlzaGlmdCA9IChzaXplb2YgKFVMT05HRVNUKSAqIEhPU1RfQ0hBUl9CSVQgLSAxKTsKKyAgICAgIGVsc2UKKwlzaGlmdCA9IChUQVJHRVRfTE9OR19MT05HX0JJVCAtIDEpOworICAgICAgaGlnaF9iaXQgPSAoVUxPTkdFU1QpIDEgPDwgc2hpZnQ7CisgICAgICB1bnNpZ25lZF90eXBlID0gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZzsKKyAgICAgIHNpZ25lZF90eXBlID0gYnVpbHRpbl90eXBlX2xvbmdfbG9uZzsKKyAgICB9CisKKyAgIHB1dGl0aGVyZS0+dHlwZWRfdmFsX2ludC52YWwgPSBuOworCisgICAvKiBJZiB0aGUgaGlnaCBiaXQgb2YgdGhlIHdvcmtlZCBvdXQgdHlwZSBpcyBzZXQgdGhlbiB0aGlzIG51bWJlcgorICAgICAgaGFzIHRvIGJlIHVuc2lnbmVkLiAqLworCisgICBpZiAodW5zaWduZWRfcCB8fCAobiAmIGhpZ2hfYml0KSkgCisgICAgIHsKKyAgICAgICBwdXRpdGhlcmUtPnR5cGVkX3ZhbF9pbnQudHlwZSA9IHVuc2lnbmVkX3R5cGU7CisgICAgIH0KKyAgIGVsc2UgCisgICAgIHsKKyAgICAgICBwdXRpdGhlcmUtPnR5cGVkX3ZhbF9pbnQudHlwZSA9IHNpZ25lZF90eXBlOworICAgICB9CisKKyAgIHJldHVybiBJTlQ7Cit9CisKK3N0cnVjdCB0b2tlbgoreworICBjaGFyICpvcGVyYXRvcjsKKyAgaW50IHRva2VuOworICBlbnVtIGV4cF9vcGNvZGUgb3Bjb2RlOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2tlbiB0b2tlbnRhYjNbXSA9CisgIHsKKyAgICB7Ij4+PSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX1JTSH0sCisgICAgeyI8PD0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9MU0h9CisgIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rZW4gdG9rZW50YWIyW10gPQorICB7CisgICAgeyIrPSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX0FERH0sCisgICAgeyItPSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX1NVQn0sCisgICAgeyIqPSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX01VTH0sCisgICAgeyIvPSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX0RJVn0sCisgICAgeyIlPSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX1JFTX0sCisgICAgeyJ8PSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX0JJVFdJU0VfSU9SfSwKKyAgICB7IiY9IiwgQVNTSUdOX01PRElGWSwgQklOT1BfQklUV0lTRV9BTkR9LAorICAgIHsiXj0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9CSVRXSVNFX1hPUn0sCisgICAgeyIrKyIsIElOQ1JFTUVOVCwgQklOT1BfRU5EfSwKKyAgICB7Ii0tIiwgREVDUkVNRU5ULCBCSU5PUF9FTkR9LAorICAgIHsiLT4iLCBBUlJPVywgQklOT1BfRU5EfSwKKyAgICB7IiYmIiwgQU5EQU5ELCBCSU5PUF9FTkR9LAorICAgIHsifHwiLCBPUk9SLCBCSU5PUF9FTkR9LAorICAgIHsiOjoiLCBDT0xPTkNPTE9OLCBCSU5PUF9FTkR9LAorICAgIHsiPDwiLCBMU0gsIEJJTk9QX0VORH0sCisgICAgeyI+PiIsIFJTSCwgQklOT1BfRU5EfSwKKyAgICB7Ij09IiwgRVFVQUwsIEJJTk9QX0VORH0sCisgICAgeyIhPSIsIE5PVEVRVUFMLCBCSU5PUF9FTkR9LAorICAgIHsiPD0iLCBMRVEsIEJJTk9QX0VORH0sCisgICAgeyI+PSIsIEdFUSwgQklOT1BfRU5EfQorICB9OworCisvKiBSZWFkIG9uZSB0b2tlbiwgZ2V0dGluZyBjaGFyYWN0ZXJzIHRocm91Z2ggbGV4cHRyLiAgKi8KKworc3RhdGljIGludAoreXlsZXggKCkKK3sKKyAgaW50IGM7CisgIGludCBuYW1lbGVuOworICB1bnNpZ25lZCBpbnQgaTsKKyAgY2hhciAqdG9rc3RhcnQ7CisgIGNoYXIgKnRva3B0cjsKKyAgaW50IHRlbXBidWZpbmRleDsKKyAgc3RhdGljIGNoYXIgKnRlbXBidWY7CisgIHN0YXRpYyBpbnQgdGVtcGJ1ZnNpemU7CisgIHN0cnVjdCBzeW1ib2wgKiBzeW1fY2xhc3MgPSBOVUxMOworICBjaGFyICogdG9rZW5fc3RyaW5nID0gTlVMTDsKKyAgaW50IGNsYXNzX3ByZWZpeCA9IDA7CisgIGludCB1bnF1b3RlZF9leHByOworICAgCisgcmV0cnk6CisKKyAgdW5xdW90ZWRfZXhwciA9IDE7CisKKyAgdG9rc3RhcnQgPSBsZXhwdHI7CisgIC8qIFNlZSBpZiBpdCBpcyBhIHNwZWNpYWwgdG9rZW4gb2YgbGVuZ3RoIDMuICAqLworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIHRva2VudGFiMyAvIHNpemVvZiB0b2tlbnRhYjNbMF07IGkrKykKKyAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgdG9rZW50YWIzW2ldLm9wZXJhdG9yLCAzKSkKKyAgICAgIHsKKwlsZXhwdHIgKz0gMzsKKwl5eWx2YWwub3Bjb2RlID0gdG9rZW50YWIzW2ldLm9wY29kZTsKKwlyZXR1cm4gdG9rZW50YWIzW2ldLnRva2VuOworICAgICAgfQorCisgIC8qIFNlZSBpZiBpdCBpcyBhIHNwZWNpYWwgdG9rZW4gb2YgbGVuZ3RoIDIuICAqLworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIHRva2VudGFiMiAvIHNpemVvZiB0b2tlbnRhYjJbMF07IGkrKykKKyAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgdG9rZW50YWIyW2ldLm9wZXJhdG9yLCAyKSkKKyAgICAgIHsKKwlsZXhwdHIgKz0gMjsKKwl5eWx2YWwub3Bjb2RlID0gdG9rZW50YWIyW2ldLm9wY29kZTsKKwlyZXR1cm4gdG9rZW50YWIyW2ldLnRva2VuOworICAgICAgfQorCisgIHN3aXRjaCAoYyA9ICp0b2tzdGFydCkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlICcgJzoKKyAgICBjYXNlICdcdCc6CisgICAgY2FzZSAnXG4nOgorICAgICAgbGV4cHRyKys7CisgICAgICBnb3RvIHJldHJ5OworCisgICAgY2FzZSAnXCcnOgorICAgICAgLyogV2UgZWl0aGVyIGhhdmUgYSBjaGFyYWN0ZXIgY29uc3RhbnQgKCcwJyBvciAnXDE3NycgZm9yIGV4YW1wbGUpCisJIG9yIHdlIGhhdmUgYSBxdW90ZWQgc3ltYm9sIHJlZmVyZW5jZSAoJ2ZvbyhpbnQsaW50KScgaW4gQysrCisJIGZvciBleGFtcGxlKS4gKi8KKyAgICAgIGxleHB0cisrOworICAgICAgYyA9ICpsZXhwdHIrKzsKKyAgICAgIGlmIChjID09ICdcXCcpCisJYyA9IHBhcnNlX2VzY2FwZSAoJmxleHB0cik7CisgICAgICBlbHNlIGlmIChjID09ICdcJycpCisJZXJyb3IgKCJFbXB0eSBjaGFyYWN0ZXIgY29uc3RhbnQuIik7CisKKyAgICAgIHl5bHZhbC50eXBlZF92YWxfaW50LnZhbCA9IGM7CisgICAgICB5eWx2YWwudHlwZWRfdmFsX2ludC50eXBlID0gYnVpbHRpbl90eXBlX2NoYXI7CisKKyAgICAgIGMgPSAqbGV4cHRyKys7CisgICAgICBpZiAoYyAhPSAnXCcnKQorCXsKKwkgIG5hbWVsZW4gPSBza2lwX3F1b3RlZCAodG9rc3RhcnQpIC0gdG9rc3RhcnQ7CisJICBpZiAobmFtZWxlbiA+IDIpCisJICAgIHsKKwkgICAgICBsZXhwdHIgPSB0b2tzdGFydCArIG5hbWVsZW47CisgICAgICAgICAgICAgIHVucXVvdGVkX2V4cHIgPSAwOworCSAgICAgIGlmIChsZXhwdHJbLTFdICE9ICdcJycpCisJCWVycm9yICgiVW5tYXRjaGVkIHNpbmdsZSBxdW90ZS4iKTsKKwkgICAgICBuYW1lbGVuIC09IDI7CisJICAgICAgdG9rc3RhcnQrKzsKKwkgICAgICBnb3RvIHRyeW5hbWU7CisJICAgIH0KKwkgIGVycm9yICgiSW52YWxpZCBjaGFyYWN0ZXIgY29uc3RhbnQuIik7CisJfQorICAgICAgcmV0dXJuIElOVDsKKworICAgIGNhc2UgJygnOgorICAgICAgcGFyZW5fZGVwdGgrKzsKKyAgICAgIGxleHB0cisrOworICAgICAgcmV0dXJuIGM7CisKKyAgICBjYXNlICcpJzoKKyAgICAgIGlmIChwYXJlbl9kZXB0aCA9PSAwKQorCXJldHVybiAwOworICAgICAgcGFyZW5fZGVwdGgtLTsKKyAgICAgIGxleHB0cisrOworICAgICAgcmV0dXJuIGM7CisKKyAgICBjYXNlICcsJzoKKyAgICAgIGlmIChjb21tYV90ZXJtaW5hdGVzICYmIHBhcmVuX2RlcHRoID09IDApCisJcmV0dXJuIDA7CisgICAgICBsZXhwdHIrKzsKKyAgICAgIHJldHVybiBjOworCisgICAgY2FzZSAnLic6CisgICAgICAvKiBNaWdodCBiZSBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4gICovCisgICAgICBpZiAobGV4cHRyWzFdIDwgJzAnIHx8IGxleHB0clsxXSA+ICc5JykKKwlnb3RvIHN5bWJvbDsJCS8qIE5vcGUsIG11c3QgYmUgYSBzeW1ib2wuICovCisgICAgICAvKiBGQUxMIFRIUlUgaW50byBudW1iZXIgY2FzZS4gICovCisKKyAgICBjYXNlICcwJzoKKyAgICBjYXNlICcxJzoKKyAgICBjYXNlICcyJzoKKyAgICBjYXNlICczJzoKKyAgICBjYXNlICc0JzoKKyAgICBjYXNlICc1JzoKKyAgICBjYXNlICc2JzoKKyAgICBjYXNlICc3JzoKKyAgICBjYXNlICc4JzoKKyAgICBjYXNlICc5JzoKKyAgICAgIHsKKwkvKiBJdCdzIGEgbnVtYmVyLiAgKi8KKwlpbnQgZ290X2RvdCA9IDAsIGdvdF9lID0gMCwgdG9rdHlwZTsKKwlyZWdpc3RlciBjaGFyICpwID0gdG9rc3RhcnQ7CisJaW50IGhleCA9IGlucHV0X3JhZGl4ID4gMTA7CisKKwlpZiAoYyA9PSAnMCcgJiYgKHBbMV0gPT0gJ3gnIHx8IHBbMV0gPT0gJ1gnKSkKKwkgIHsKKwkgICAgcCArPSAyOworCSAgICBoZXggPSAxOworCSAgfQorCWVsc2UgaWYgKGMgPT0gJzAnICYmIChwWzFdPT0ndCcgfHwgcFsxXT09J1QnIHx8IHBbMV09PSdkJyB8fCBwWzFdPT0nRCcpKQorCSAgeworCSAgICBwICs9IDI7CisJICAgIGhleCA9IDA7CisJICB9CisKKwlmb3IgKDs7ICsrcCkKKwkgIHsKKwkgICAgLyogVGhpcyB0ZXN0IGluY2x1ZGVzICFoZXggYmVjYXVzZSAnZScgaXMgYSB2YWxpZCBoZXggZGlnaXQKKwkgICAgICAgYW5kIHRodXMgZG9lcyBub3QgaW5kaWNhdGUgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgd2hlbgorCSAgICAgICB0aGUgcmFkaXggaXMgaGV4LiAgKi8KKwkgICAgaWYgKCFoZXggJiYgIWdvdF9lICYmICgqcCA9PSAnZScgfHwgKnAgPT0gJ0UnKSkKKwkgICAgICBnb3RfZG90ID0gZ290X2UgPSAxOworCSAgICAvKiBUaGlzIHRlc3QgZG9lcyBub3QgaW5jbHVkZSAhaGV4LCBiZWNhdXNlIGEgJy4nIGFsd2F5cyBpbmRpY2F0ZXMKKwkgICAgICAgYSBkZWNpbWFsIGZsb2F0aW5nIHBvaW50IG51bWJlciByZWdhcmRsZXNzIG9mIHRoZSByYWRpeC4gICovCisJICAgIGVsc2UgaWYgKCFnb3RfZG90ICYmICpwID09ICcuJykKKwkgICAgICBnb3RfZG90ID0gMTsKKwkgICAgZWxzZSBpZiAoZ290X2UgJiYgKHBbLTFdID09ICdlJyB8fCBwWy0xXSA9PSAnRScpCisJCSAgICAgJiYgKCpwID09ICctJyB8fCAqcCA9PSAnKycpKQorCSAgICAgIC8qIFRoaXMgaXMgdGhlIHNpZ24gb2YgdGhlIGV4cG9uZW50LCBub3QgdGhlIGVuZCBvZiB0aGUKKwkJIG51bWJlci4gICovCisJICAgICAgY29udGludWU7CisJICAgIC8qIFdlIHdpbGwgdGFrZSBhbnkgbGV0dGVycyBvciBkaWdpdHMuICBwYXJzZV9udW1iZXIgd2lsbAorCSAgICAgICBjb21wbGFpbiBpZiBwYXN0IHRoZSByYWRpeCwgb3IgaWYgTCBvciBVIGFyZSBub3QgZmluYWwuICAqLworCSAgICBlbHNlIGlmICgoKnAgPCAnMCcgfHwgKnAgPiAnOScpCisJCSAgICAgJiYgKCgqcCA8ICdhJyB8fCAqcCA+ICd6JykKKwkJCQkgICYmICgqcCA8ICdBJyB8fCAqcCA+ICdaJykpKQorCSAgICAgIGJyZWFrOworCSAgfQorCXRva3R5cGUgPSBwYXJzZV9udW1iZXIgKHRva3N0YXJ0LCBwIC0gdG9rc3RhcnQsIGdvdF9kb3R8Z290X2UsICZ5eWx2YWwpOworICAgICAgICBpZiAodG9rdHlwZSA9PSBFUlJPUikKKwkgIHsKKwkgICAgY2hhciAqZXJyX2NvcHkgPSAoY2hhciAqKSBhbGxvY2EgKHAgLSB0b2tzdGFydCArIDEpOworCisJICAgIG1lbWNweSAoZXJyX2NvcHksIHRva3N0YXJ0LCBwIC0gdG9rc3RhcnQpOworCSAgICBlcnJfY29weVtwIC0gdG9rc3RhcnRdID0gMDsKKwkgICAgZXJyb3IgKCJJbnZhbGlkIG51bWJlciBcIiVzXCIuIiwgZXJyX2NvcHkpOworCSAgfQorCWxleHB0ciA9IHA7CisJcmV0dXJuIHRva3R5cGU7CisgICAgICB9CisKKyAgICBjYXNlICcrJzoKKyAgICBjYXNlICctJzoKKyAgICBjYXNlICcqJzoKKyAgICBjYXNlICcvJzoKKyAgICBjYXNlICclJzoKKyAgICBjYXNlICd8JzoKKyAgICBjYXNlICcmJzoKKyAgICBjYXNlICdeJzoKKyAgICBjYXNlICd+JzoKKyAgICBjYXNlICchJzoKKyAgICBjYXNlICdAJzoKKyAgICBjYXNlICc8JzoKKyAgICBjYXNlICc+JzoKKyAgICBjYXNlICdbJzoKKyAgICBjYXNlICddJzoKKyAgICBjYXNlICc/JzoKKyAgICBjYXNlICc6JzoKKyAgICBjYXNlICc9JzoKKyAgICBjYXNlICd7JzoKKyAgICBjYXNlICd9JzoKKyAgICBzeW1ib2w6CisgICAgICBsZXhwdHIrKzsKKyAgICAgIHJldHVybiBjOworCisgICAgY2FzZSAnIic6CisKKyAgICAgIC8qIEJ1aWxkIHRoZSBnZGIgaW50ZXJuYWwgZm9ybSBvZiB0aGUgaW5wdXQgc3RyaW5nIGluIHRlbXBidWYsCisJIHRyYW5zbGF0aW5nIGFueSBzdGFuZGFyZCBDIGVzY2FwZSBmb3JtcyBzZWVuLiAgTm90ZSB0aGF0IHRoZQorCSBidWZmZXIgaXMgbnVsbCBieXRlIHRlcm1pbmF0ZWQgKm9ubHkqIGZvciB0aGUgY29udmVuaWVuY2Ugb2YKKwkgZGVidWdnaW5nIGdkYiBpdHNlbGYgYW5kIHByaW50aW5nIHRoZSBidWZmZXIgY29udGVudHMgd2hlbgorCSB0aGUgYnVmZmVyIGNvbnRhaW5zIG5vIGVtYmVkZGVkIG51bGxzLiAgR2RiIGRvZXMgbm90IGRlcGVuZAorCSB1cG9uIHRoZSBidWZmZXIgYmVpbmcgbnVsbCBieXRlIHRlcm1pbmF0ZWQsIGl0IHVzZXMgdGhlIGxlbmd0aAorCSBzdHJpbmcgaW5zdGVhZC4gIFRoaXMgYWxsb3dzIGdkYiB0byBoYW5kbGUgQyBzdHJpbmdzIChhcyB3ZWxsCisJIGFzIHN0cmluZ3MgaW4gb3RoZXIgbGFuZ3VhZ2VzKSB3aXRoIGVtYmVkZGVkIG51bGwgYnl0ZXMgKi8KKworICAgICAgdG9rcHRyID0gKyt0b2tzdGFydDsKKyAgICAgIHRlbXBidWZpbmRleCA9IDA7CisKKyAgICAgIGRvIHsKKwkvKiBHcm93IHRoZSBzdGF0aWMgdGVtcCBidWZmZXIgaWYgbmVjZXNzYXJ5LCBpbmNsdWRpbmcgYWxsb2NhdGluZworCSAgIHRoZSBmaXJzdCBvbmUgb24gZGVtYW5kLiAqLworCWlmICh0ZW1wYnVmaW5kZXggKyAxID49IHRlbXBidWZzaXplKQorCSAgeworCSAgICB0ZW1wYnVmID0gKGNoYXIgKikgcmVhbGxvYyAodGVtcGJ1ZiwgdGVtcGJ1ZnNpemUgKz0gNjQpOworCSAgfQorCXN3aXRjaCAoKnRva3B0cikKKwkgIHsKKwkgIGNhc2UgJ1wwJzoKKwkgIGNhc2UgJyInOgorCSAgICAvKiBEbyBub3RoaW5nLCBsb29wIHdpbGwgdGVybWluYXRlLiAqLworCSAgICBicmVhazsKKwkgIGNhc2UgJ1xcJzoKKwkgICAgdG9rcHRyKys7CisJICAgIGMgPSBwYXJzZV9lc2NhcGUgKCZ0b2twdHIpOworCSAgICBpZiAoYyA9PSAtMSkKKwkgICAgICB7CisJCWNvbnRpbnVlOworCSAgICAgIH0KKwkgICAgdGVtcGJ1Zlt0ZW1wYnVmaW5kZXgrK10gPSBjOworCSAgICBicmVhazsKKwkgIGRlZmF1bHQ6CisJICAgIHRlbXBidWZbdGVtcGJ1ZmluZGV4KytdID0gKnRva3B0cisrOworCSAgICBicmVhazsKKwkgIH0KKyAgICAgIH0gd2hpbGUgKCgqdG9rcHRyICE9ICciJykgJiYgKCp0b2twdHIgIT0gJ1wwJykpOworICAgICAgaWYgKCp0b2twdHIrKyAhPSAnIicpCisJeworCSAgZXJyb3IgKCJVbnRlcm1pbmF0ZWQgc3RyaW5nIGluIGV4cHJlc3Npb24uIik7CisJfQorICAgICAgdGVtcGJ1Zlt0ZW1wYnVmaW5kZXhdID0gJ1wwJzsJLyogU2VlIG5vdGUgYWJvdmUgKi8KKyAgICAgIHl5bHZhbC5zdmFsLnB0ciA9IHRlbXBidWY7CisgICAgICB5eWx2YWwuc3ZhbC5sZW5ndGggPSB0ZW1wYnVmaW5kZXg7CisgICAgICBsZXhwdHIgPSB0b2twdHI7CisgICAgICByZXR1cm4gKFNUUklORyk7CisgICAgfQorCisgIGlmICghKGMgPT0gJ18nIHx8IGMgPT0gJyQnCisJfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpKSkKKyAgICAvKiBXZSBtdXN0IGhhdmUgY29tZSBhY3Jvc3MgYSBiYWQgY2hhcmFjdGVyIChlLmcuICc7JykuICAqLworICAgIGVycm9yICgiSW52YWxpZCBjaGFyYWN0ZXIgJyVjJyBpbiBleHByZXNzaW9uLiIsIGMpOworCisgIC8qIEl0J3MgYSBuYW1lLiAgU2VlIGhvdyBsb25nIGl0IGlzLiAgKi8KKyAgbmFtZWxlbiA9IDA7CisgIGZvciAoYyA9IHRva3N0YXJ0W25hbWVsZW5dOworICAgICAgIChjID09ICdfJyB8fCBjID09ICckJyB8fCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHx8IGMgPT0gJzwnKTspCisgICAgeworICAgICAgLyogVGVtcGxhdGUgcGFyYW1ldGVyIGxpc3RzIGFyZSBwYXJ0IG9mIHRoZSBuYW1lLgorCSBGSVhNRTogVGhpcyBtaXNoYW5kbGVzIGBwcmludCAkYTw0JiYkYT4zJy4gICovCisKKyAgICAgIGlmIChjID09ICc8JykKKwl7IAorICAgICAgICAgICBpZiAoaHBfc29tX3NvbV9vYmplY3RfcHJlc2VudCkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAvKiBTY2FuIGFoZWFkIHRvIGdldCByZXN0IG9mIHRoZSB0ZW1wbGF0ZSBzcGVjaWZpY2F0aW9uLiAgTm90ZQorICAgICAgICAgICAgICAgICAgdGhhdCB3ZSBsb29rIGFoZWFkIG9ubHkgd2hlbiB0aGUgJzwnIGFkam9pbnMgbm9uLXdoaXRlc3BhY2UKKyAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnM7IGZvciBjb21wYXJpc29uIGV4cHJlc3Npb25zLCBlLmcuICJhIDwgYiA+IGMiLAorICAgICAgICAgICAgICAgICAgdGhlcmUgbXVzdCBiZSBzcGFjZXMgYmVmb3JlIHRoZSAnPCcsIGV0Yy4gKi8KKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgY2hhciAqIHAgPSBmaW5kX3RlbXBsYXRlX25hbWVfZW5kICh0b2tzdGFydCArIG5hbWVsZW4pOworICAgICAgICAgICAgICAgaWYgKHApCisgICAgICAgICAgICAgICAgIG5hbWVsZW4gPSBwIC0gdG9rc3RhcnQ7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICB7IAorCSAgICAgICBpbnQgaSA9IG5hbWVsZW47CisJICAgICAgIGludCBuZXN0aW5nX2xldmVsID0gMTsKKwkgICAgICAgd2hpbGUgKHRva3N0YXJ0WysraV0pCisJCSB7CisJCSAgIGlmICh0b2tzdGFydFtpXSA9PSAnPCcpCisJCSAgICAgbmVzdGluZ19sZXZlbCsrOworCQkgICBlbHNlIGlmICh0b2tzdGFydFtpXSA9PSAnPicpCisJCSAgICAgeworCQkgICAgICAgaWYgKC0tbmVzdGluZ19sZXZlbCA9PSAwKQorCQkJIGJyZWFrOworCQkgICAgIH0KKwkJIH0KKwkgICAgICAgaWYgKHRva3N0YXJ0W2ldID09ICc+JykKKwkJIG5hbWVsZW4gPSBpOworCSAgICAgICBlbHNlCisJCSBicmVhazsKKwkgICAgIH0KKwl9CisgICAgICBjID0gdG9rc3RhcnRbKytuYW1lbGVuXTsKKyAgICB9CisKKyAgLyogVGhlIHRva2VuICJpZiIgdGVybWluYXRlcyB0aGUgZXhwcmVzc2lvbiBhbmQgaXMgTk9UIAorICAgICByZW1vdmVkIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gICovCisgIGlmIChuYW1lbGVuID09IDIgJiYgdG9rc3RhcnRbMF0gPT0gJ2knICYmIHRva3N0YXJ0WzFdID09ICdmJykKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgbGV4cHRyICs9IG5hbWVsZW47CisKKyAgdHJ5bmFtZToKKworICAvKiBDYXRjaCBzcGVjaWZpYyBrZXl3b3Jkcy4gIFNob3VsZCBiZSBkb25lIHdpdGggYSBkYXRhIHN0cnVjdHVyZS4gICovCisgIHN3aXRjaCAobmFtZWxlbikKKyAgICB7CisgICAgY2FzZSA4OgorICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJ1bnNpZ25lZCIsIDgpKQorCXJldHVybiBVTlNJR05FRDsKKyAgICAgIGlmIChjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSA9PSBsYW5ndWFnZV9jcGx1cworCSAgJiYgU1RSRVFOICh0b2tzdGFydCwgInRlbXBsYXRlIiwgOCkpCisJcmV0dXJuIFRFTVBMQVRFOworICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJ2b2xhdGlsZSIsIDgpKQorCXJldHVybiBWT0xBVElMRV9LRVlXT1JEOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJzdHJ1Y3QiLCA2KSkKKwlyZXR1cm4gU1RSVUNUOworICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJzaWduZWQiLCA2KSkKKwlyZXR1cm4gU0lHTkVEX0tFWVdPUkQ7CisgICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgInNpemVvZiIsIDYpKSAgICAgIAorCXJldHVybiBTSVpFT0Y7CisgICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImRvdWJsZSIsIDYpKSAgICAgIAorCXJldHVybiBET1VCTEVfS0VZV09SRDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgIGlmIChjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSA9PSBsYW5ndWFnZV9jcGx1cykKKyAgICAgICAgeworICAgICAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiZmFsc2UiLCA1KSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRUtFWVdPUkQ7CisgICAgICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJjbGFzcyIsIDUpKQorICAgICAgICAgICAgcmV0dXJuIENMQVNTOworICAgICAgICB9CisgICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgInVuaW9uIiwgNSkpCisJcmV0dXJuIFVOSU9OOworICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJzaG9ydCIsIDUpKQorCXJldHVybiBTSE9SVDsKKyAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiY29uc3QiLCA1KSkKKwlyZXR1cm4gQ09OU1RfS0VZV09SRDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiZW51bSIsIDQpKQorCXJldHVybiBFTlVNOworICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJsb25nIiwgNCkpCisJcmV0dXJuIExPTkc7CisgICAgICBpZiAoY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfY3BsdXMpCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJ0cnVlIiwgNCkpCisgICAgICAgICAgICAgIHJldHVybiBUUlVFS0VZV09SRDsKKworICAgICAgICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJ0aGlzIiwgNCkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB0aGlzX25hbWVbXSA9CisgICAgICAgICAgICAgICAgeyBDUExVU19NQVJLRVIsICd0JywgJ2gnLCAnaScsICdzJywgJ1wwJyB9OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChsb29rdXBfc3ltYm9sICh0aGlzX25hbWUsIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSX05BTUVTUEFDRSwgKGludCAqKSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCkpCisgICAgICAgICAgICAgICAgICByZXR1cm4gVEhJUzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiaW50IiwgMykpCisJcmV0dXJuIElOVF9LRVlXT1JEOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICB5eWx2YWwuc3ZhbC5wdHIgPSB0b2tzdGFydDsKKyAgeXlsdmFsLnN2YWwubGVuZ3RoID0gbmFtZWxlbjsKKworICBpZiAoKnRva3N0YXJ0ID09ICckJykKKyAgICB7CisgICAgICB3cml0ZV9kb2xsYXJfdmFyaWFibGUgKHl5bHZhbC5zdmFsKTsKKyAgICAgIHJldHVybiBWQVJJQUJMRTsKKyAgICB9CisgIAorICAvKiBMb29rIGFoZWFkIGFuZCBzZWUgaWYgd2UgY2FuIGNvbnN1bWUgbW9yZSBvZiB0aGUgaW5wdXQKKyAgICAgc3RyaW5nIHRvIGdldCBhIHJlYXNvbmFibGUgY2xhc3MvbmFtZXNwYWNlIHNwZWMgb3IgYQorICAgICBmdWxseS1xdWFsaWZpZWQgbmFtZS4gIFRoaXMgaXMgYSBrbHVkZ2UgdG8gZ2V0IGFyb3VuZCB0aGUKKyAgICAgSFAgYUNDIGNvbXBpbGVyJ3MgZ2VuZXJhdGlvbiBvZiBzeW1ib2wgbmFtZXMgd2l0aCBlbWJlZGRlZAorICAgICBjb2xvbnMgZm9yIG5hbWVzcGFjZSBhbmQgbmVzdGVkIGNsYXNzZXMuICovIAorICBpZiAodW5xdW90ZWRfZXhwcikKKyAgICB7CisgICAgICAvKiBPbmx5IGRvIGl0IGlmIG5vdCBpbnNpZGUgc2luZ2xlIHF1b3RlcyAqLyAKKyAgICAgIHN5bV9jbGFzcyA9IHBhcnNlX25lc3RlZF9jbGFzc2VzX2Zvcl9ocGFjYyAoeXlsdmFsLnN2YWwucHRyLCB5eWx2YWwuc3ZhbC5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b2tlbl9zdHJpbmcsICZjbGFzc19wcmVmaXgsICZsZXhwdHIpOworICAgICAgaWYgKHN5bV9jbGFzcykKKyAgICAgICAgeworICAgICAgICAgIC8qIFJlcGxhY2UgdGhlIGN1cnJlbnQgdG9rZW4gd2l0aCB0aGUgYmlnZ2VyIG9uZSB3ZSBmb3VuZCAqLyAKKyAgICAgICAgICB5eWx2YWwuc3ZhbC5wdHIgPSB0b2tlbl9zdHJpbmc7CisgICAgICAgICAgeXlsdmFsLnN2YWwubGVuZ3RoID0gc3RybGVuICh0b2tlbl9zdHJpbmcpOworICAgICAgICB9CisgICAgfQorICAKKyAgLyogVXNlIHRva2VuLXR5cGUgQkxPQ0tOQU1FIGZvciBzeW1ib2xzIHRoYXQgaGFwcGVuIHRvIGJlIGRlZmluZWQgYXMKKyAgICAgZnVuY3Rpb25zIG9yIHN5bXRhYnMuICBJZiB0aGlzIGlzIG5vdCBzbywgdGhlbiAuLi4KKyAgICAgVXNlIHRva2VuLXR5cGUgVFlQRU5BTUUgZm9yIHN5bWJvbHMgdGhhdCBoYXBwZW4gdG8gYmUgZGVmaW5lZAorICAgICBjdXJyZW50bHkgYXMgbmFtZXMgb2YgdHlwZXM7IE5BTUUgZm9yIG90aGVyIHN5bWJvbHMuCisgICAgIFRoZSBjYWxsZXIgaXMgbm90IGNvbnN0cmFpbmVkIHRvIGNhcmUgYWJvdXQgdGhlIGRpc3RpbmN0aW9uLiAgKi8KKyAgeworICAgIGNoYXIgKnRtcCA9IGNvcHlfbmFtZSAoeXlsdmFsLnN2YWwpOworICAgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgICBpbnQgaXNfYV9maWVsZF9vZl90aGlzID0gMDsKKyAgICBpbnQgaGV4dHlwZTsKKworICAgIHN5bSA9IGxvb2t1cF9zeW1ib2wgKHRtcCwgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrLAorCQkJIFZBUl9OQU1FU1BBQ0UsCisJCQkgY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfY3BsdXMKKwkJCSA/ICZpc19hX2ZpZWxkX29mX3RoaXMgOiAoaW50ICopIE5VTEwsCisJCQkgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpOworICAgIC8qIENhbGwgbG9va3VwX3N5bXRhYiwgbm90IGxvb2t1cF9wYXJ0aWFsX3N5bXRhYiwgaW4gY2FzZSB0aGVyZSBhcmUKKyAgICAgICBubyBwc3ltdGFicyAoY29mZiwgeGNvZmYsIG9yIHNvbWUgZnV0dXJlIGNoYW5nZSB0byBibG93IGF3YXkgdGhlCisgICAgICAgcHN5bXRhYnMgb25jZSBvbmNlIHN5bWJvbHMgYXJlIHJlYWQpLiAgKi8KKyAgICBpZiAoc3ltICYmIFNZTUJPTF9DTEFTUyAoc3ltKSA9PSBMT0NfQkxPQ0spCisgICAgICB7CisJeXlsdmFsLnNzeW0uc3ltID0gc3ltOworCXl5bHZhbC5zc3ltLmlzX2FfZmllbGRfb2ZfdGhpcyA9IGlzX2FfZmllbGRfb2ZfdGhpczsKKwlyZXR1cm4gQkxPQ0tOQU1FOworICAgICAgfQorICAgIGVsc2UgaWYgKCFzeW0pCisgICAgICB7CQkJCS8qIFNlZSBpZiBpdCdzIGEgZmlsZSBuYW1lLiAqLworCXN0cnVjdCBzeW10YWIgKnN5bXRhYjsKKworCXN5bXRhYiA9IGxvb2t1cF9zeW10YWIgKHRtcCk7CisKKwlpZiAoc3ltdGFiKQorCSAgeworCSAgICB5eWx2YWwuYnZhbCA9IEJMT0NLVkVDVE9SX0JMT0NLIChCTE9DS1ZFQ1RPUiAoc3ltdGFiKSwgU1RBVElDX0JMT0NLKTsKKwkgICAgcmV0dXJuIEZJTEVOQU1FOworCSAgfQorICAgICAgfQorCisgICAgaWYgKHN5bSAmJiBTWU1CT0xfQ0xBU1MgKHN5bSkgPT0gTE9DX1RZUEVERUYpCisgICAgICAgIHsKKyNpZiAxCisJICAvKiBEZXNwaXRlIHRoZSBmb2xsb3dpbmcgZmxhdywgd2UgbmVlZCB0byBrZWVwIHRoaXMgY29kZSBlbmFibGVkLgorCSAgICAgQmVjYXVzZSB3ZSBjYW4gZ2V0IGNhbGxlZCBmcm9tIGNoZWNrX3N0dWJfbWV0aG9kLCBpZiB3ZSBkb24ndAorCSAgICAgaGFuZGxlIG5lc3RlZCB0eXBlcyB0aGVuIGl0IHNjcmV3cyBtYW55IG9wZXJhdGlvbnMgaW4gYW55CisJICAgICBwcm9ncmFtIHdoaWNoIHVzZXMgbmVzdGVkIHR5cGVzLiAgKi8KKwkgIC8qIEluICJBOjp4IiwgaWYgeCBpcyBhIG1lbWJlciBmdW5jdGlvbiBvZiBBIGFuZCB0aGVyZSBoYXBwZW5zCisJICAgICB0byBiZSBhIHR5cGUgKG5lc3RlZCBvciBub3QsIHNpbmNlIHRoZSBzdGFicyBkb24ndCBtYWtlIHRoYXQKKwkgICAgIGRpc3RpbmN0aW9uKSBuYW1lZCB4LCB0aGVuIHRoaXMgY29kZSBpbmNvcnJlY3RseSB0aGlua3Mgd2UKKwkgICAgIGFyZSBkZWFsaW5nIHdpdGggbmVzdGVkIHR5cGVzIHJhdGhlciB0aGFuIGEgbWVtYmVyIGZ1bmN0aW9uLiAgKi8KKworCSAgY2hhciAqcDsKKwkgIGNoYXIgKm5hbWVzdGFydDsKKwkgIHN0cnVjdCBzeW1ib2wgKmJlc3Rfc3ltOworCisJICAvKiBMb29rIGFoZWFkIHRvIGRldGVjdCBuZXN0ZWQgdHlwZXMuICBUaGlzIHByb2JhYmx5IHNob3VsZCBiZQorCSAgICAgZG9uZSBpbiB0aGUgZ3JhbW1hciwgYnV0IHRyeWluZyBzZWVtZWQgdG8gaW50cm9kdWNlIGEgbG90CisJICAgICBvZiBzaGlmdC9yZWR1Y2UgYW5kIHJlZHVjZS9yZWR1Y2UgY29uZmxpY3RzLiAgSXQncyBwb3NzaWJsZQorCSAgICAgdGhhdCBpdCBjb3VsZCBiZSBkb25lLCB0aG91Z2guICBPciBwZXJoYXBzIGEgbm9uLWdyYW1tYXIsIGJ1dAorCSAgICAgbGVzcyBhZCBob2MsIGFwcHJvYWNoIHdvdWxkIHdvcmsgd2VsbC4gICovCisKKwkgIC8qIFNpbmNlIHdlIGRvIG5vdCBjdXJyZW50bHkgaGF2ZSBhbnkgd2F5IG9mIGRpc3Rpbmd1aXNoaW5nCisJICAgICBhIG5lc3RlZCB0eXBlIGZyb20gYSBub24tbmVzdGVkIG9uZSAodGhlIHN0YWJzIGRvbid0IHRlbGwKKwkgICAgIHVzIHdoZXRoZXIgYSB0eXBlIGlzIG5lc3RlZCksIHdlIGp1c3QgaWdub3JlIHRoZQorCSAgICAgY29udGFpbmluZyB0eXBlLiAgKi8KKworCSAgcCA9IGxleHB0cjsKKwkgIGJlc3Rfc3ltID0gc3ltOworCSAgd2hpbGUgKDEpCisJICAgIHsKKwkgICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLworCSAgICAgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnXG4nKQorCQkrK3A7CisJICAgICAgaWYgKCpwID09ICc6JyAmJiBwWzFdID09ICc6JykKKwkJeworCQkgIC8qIFNraXAgdGhlIGA6OicuICAqLworCQkgIHAgKz0gMjsKKwkJICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLworCQkgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnXG4nKQorCQkgICAgKytwOworCQkgIG5hbWVzdGFydCA9IHA7CisJCSAgd2hpbGUgKCpwID09ICdfJyB8fCAqcCA9PSAnJCcgfHwgKCpwID49ICcwJyAmJiAqcCA8PSAnOScpCisJCQkgfHwgKCpwID49ICdhJyAmJiAqcCA8PSAneicpCisJCQkgfHwgKCpwID49ICdBJyAmJiAqcCA8PSAnWicpKQorCQkgICAgKytwOworCQkgIGlmIChwICE9IG5hbWVzdGFydCkKKwkJICAgIHsKKwkJICAgICAgc3RydWN0IHN5bWJvbCAqY3VyX3N5bTsKKwkJICAgICAgLyogQXMgYmlnIGFzIHRoZSB3aG9sZSByZXN0IG9mIHRoZSBleHByZXNzaW9uLCB3aGljaCBpcworCQkJIGF0IGxlYXN0IGJpZyBlbm91Z2guICAqLworCQkgICAgICBjaGFyICpuY29weSA9IGFsbG9jYSAoc3RybGVuICh0bXApK3N0cmxlbiAobmFtZXN0YXJ0KSszKTsKKwkJICAgICAgY2hhciAqdG1wMTsKKworCQkgICAgICB0bXAxID0gbmNvcHk7CisJCSAgICAgIG1lbWNweSAodG1wMSwgdG1wLCBzdHJsZW4gKHRtcCkpOworCQkgICAgICB0bXAxICs9IHN0cmxlbiAodG1wKTsKKwkJICAgICAgbWVtY3B5ICh0bXAxLCAiOjoiLCAyKTsKKwkJICAgICAgdG1wMSArPSAyOworCQkgICAgICBtZW1jcHkgKHRtcDEsIG5hbWVzdGFydCwgcCAtIG5hbWVzdGFydCk7CisJCSAgICAgIHRtcDFbcCAtIG5hbWVzdGFydF0gPSAnXDAnOworCQkgICAgICBjdXJfc3ltID0gbG9va3VwX3N5bWJvbCAobmNvcHksIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywKKwkJCQkJICAgICAgIFZBUl9OQU1FU1BBQ0UsIChpbnQgKikgTlVMTCwKKwkJCQkJICAgICAgIChzdHJ1Y3Qgc3ltdGFiICoqKSBOVUxMKTsKKwkJICAgICAgaWYgKGN1cl9zeW0pCisJCQl7CisJCQkgIGlmIChTWU1CT0xfQ0xBU1MgKGN1cl9zeW0pID09IExPQ19UWVBFREVGKQorCQkJICAgIHsKKwkJCSAgICAgIGJlc3Rfc3ltID0gY3VyX3N5bTsKKwkJCSAgICAgIGxleHB0ciA9IHA7CisJCQkgICAgfQorCQkJICBlbHNlCisJCQkgICAgYnJlYWs7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCWJyZWFrOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIGJyZWFrOworCQl9CisJICAgICAgZWxzZQorCQlicmVhazsKKwkgICAgfQorCisJICB5eWx2YWwudHN5bS50eXBlID0gU1lNQk9MX1RZUEUgKGJlc3Rfc3ltKTsKKyNlbHNlIC8qIG5vdCAwICovCisJICB5eWx2YWwudHN5bS50eXBlID0gU1lNQk9MX1RZUEUgKHN5bSk7CisjZW5kaWYgLyogbm90IDAgKi8KKwkgIHJldHVybiBUWVBFTkFNRTsKKyAgICAgICAgfQorICAgIGlmICgoeXlsdmFsLnRzeW0udHlwZSA9IGxvb2t1cF9wcmltaXRpdmVfdHlwZW5hbWUgKHRtcCkpICE9IDApCisJcmV0dXJuIFRZUEVOQU1FOworCisgICAgLyogSW5wdXQgbmFtZXMgdGhhdCBhcmVuJ3Qgc3ltYm9scyBidXQgQVJFIHZhbGlkIGhleCBudW1iZXJzLAorICAgICAgIHdoZW4gdGhlIGlucHV0IHJhZGl4IHBlcm1pdHMgdGhlbSwgY2FuIGJlIG5hbWVzIG9yIG51bWJlcnMKKyAgICAgICBkZXBlbmRpbmcgb24gdGhlIHBhcnNlLiAgTm90ZSB3ZSBzdXBwb3J0IHJhZGl4ZXMgPiAxNiBoZXJlLiAgKi8KKyAgICBpZiAoIXN5bSAmJiAKKyAgICAgICAgKCh0b2tzdGFydFswXSA+PSAnYScgJiYgdG9rc3RhcnRbMF0gPCAnYScgKyBpbnB1dF9yYWRpeCAtIDEwKSB8fAorICAgICAgICAgKHRva3N0YXJ0WzBdID49ICdBJyAmJiB0b2tzdGFydFswXSA8ICdBJyArIGlucHV0X3JhZGl4IC0gMTApKSkKKyAgICAgIHsKKyAJWVlTVFlQRSBuZXdsdmFsOwkvKiBJdHMgdmFsdWUgaXMgaWdub3JlZC4gICovCisJaGV4dHlwZSA9IHBhcnNlX251bWJlciAodG9rc3RhcnQsIG5hbWVsZW4sIDAsICZuZXdsdmFsKTsKKwlpZiAoaGV4dHlwZSA9PSBJTlQpCisJICB7CisJICAgIHl5bHZhbC5zc3ltLnN5bSA9IHN5bTsKKwkgICAgeXlsdmFsLnNzeW0uaXNfYV9maWVsZF9vZl90aGlzID0gaXNfYV9maWVsZF9vZl90aGlzOworCSAgICByZXR1cm4gTkFNRV9PUl9JTlQ7CisJICB9CisgICAgICB9CisKKyAgICAvKiBBbnkgb3RoZXIga2luZCBvZiBzeW1ib2wgKi8KKyAgICB5eWx2YWwuc3N5bS5zeW0gPSBzeW07CisgICAgeXlsdmFsLnNzeW0uaXNfYV9maWVsZF9vZl90aGlzID0gaXNfYV9maWVsZF9vZl90aGlzOworICAgIHJldHVybiBOQU1FOworICB9Cit9CisKK3ZvaWQKK3l5ZXJyb3IgKG1zZykKKyAgICAgY2hhciAqbXNnOworeworICBlcnJvciAoIkEgJXMgaW4gZXhwcmVzc2lvbiwgbmVhciBgJXMnLiIsIChtc2cgPyBtc2cgOiAiZXJyb3IiKSwgbGV4cHRyKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9jLWxhbmcuYyBiL2dkYi9jLWxhbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2FhMDU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2MtbGFuZy5jCkBAIC0wLDAgKzEsNTI3IEBACisvKiBDIGxhbmd1YWdlIHN1cHBvcnQgcm91dGluZXMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTkyLCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAicGFyc2VyLWRlZnMuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1ZGUgImMtbGFuZy5oIgorCitzdGF0aWMgdm9pZCBjX2VtaXRfY2hhciBQQVJBTVMgKChpbnQgYywgR0RCX0ZJTEUgKnN0cmVhbSwgaW50IHF1b3RlcikpOworCisvKiBQcmludCB0aGUgY2hhcmFjdGVyIEMgb24gU1RSRUFNIGFzIHBhcnQgb2YgdGhlIGNvbnRlbnRzIG9mIGEgbGl0ZXJhbAorICAgc3RyaW5nIHdob3NlIGRlbGltaXRlciBpcyBRVU9URVIuICBOb3RlIHRoYXQgdGhhdCBmb3JtYXQgZm9yIHByaW50aW5nCisgICBjaGFyYWN0ZXJzIGFuZCBzdHJpbmdzIGlzIGxhbmd1YWdlIHNwZWNpZmljLiAqLworCitzdGF0aWMgdm9pZAorY19lbWl0X2NoYXIgKGMsIHN0cmVhbSwgcXVvdGVyKQorICAgICByZWdpc3RlciBpbnQgYzsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgaW50IHF1b3RlcjsKK3sKKyAgYyAmPSAweEZGOwkJCS8qIEF2b2lkIHNpZ24gYml0IGZvbGxpZXMgKi8KKworICBpZiAoUFJJTlRfTElURVJBTF9GT1JNIChjKSkKKyAgICB7CisgICAgICBpZiAoYyA9PSAnXFwnIHx8IGMgPT0gcXVvdGVyKQorCXsKKwkgIGZwdXRzX2ZpbHRlcmVkICgiXFwiLCBzdHJlYW0pOworCX0KKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiVjIiwgYyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3dpdGNoIChjKQorCXsKKwljYXNlICdcbic6CisJICBmcHV0c19maWx0ZXJlZCAoIlxcbiIsIHN0cmVhbSk7CisJICBicmVhazsKKwljYXNlICdcYic6CisJICBmcHV0c19maWx0ZXJlZCAoIlxcYiIsIHN0cmVhbSk7CisJICBicmVhazsKKwljYXNlICdcdCc6CisJICBmcHV0c19maWx0ZXJlZCAoIlxcdCIsIHN0cmVhbSk7CisJICBicmVhazsKKwljYXNlICdcZic6CisJICBmcHV0c19maWx0ZXJlZCAoIlxcZiIsIHN0cmVhbSk7CisJICBicmVhazsKKwljYXNlICdccic6CisJICBmcHV0c19maWx0ZXJlZCAoIlxcciIsIHN0cmVhbSk7CisJICBicmVhazsKKwljYXNlICdcMDMzJzoKKwkgIGZwdXRzX2ZpbHRlcmVkICgiXFxlIiwgc3RyZWFtKTsKKwkgIGJyZWFrOworCWNhc2UgJ1wwMDcnOgorCSAgZnB1dHNfZmlsdGVyZWQgKCJcXGEiLCBzdHJlYW0pOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlxcJS4zbyIsICh1bnNpZ25lZCBpbnQpIGMpOworCSAgYnJlYWs7CisJfQorICAgIH0KK30KKwordm9pZAorY19wcmludGNoYXIgKGMsIHN0cmVhbSkKKyAgICAgaW50IGM7CisgICAgIEdEQl9GSUxFICpzdHJlYW07Cit7CisgIGZwdXRjX2ZpbHRlcmVkICgnXCcnLCBzdHJlYW0pOworICBMQV9FTUlUX0NIQVIgKGMsIHN0cmVhbSwgJ1wnJyk7CisgIGZwdXRjX2ZpbHRlcmVkICgnXCcnLCBzdHJlYW0pOworfQorCisvKiBQcmludCB0aGUgY2hhcmFjdGVyIHN0cmluZyBTVFJJTkcsIHByaW50aW5nIGF0IG1vc3QgTEVOR1RIIGNoYXJhY3RlcnMuCisgICBMRU5HVEggaXMgLTEgaWYgdGhlIHN0cmluZyBpcyBudWwgdGVybWluYXRlZC4gIEVhY2ggY2hhcmFjdGVyIGlzIFdJRFRIIGJ5dGVzCisgICBsb25nLiAgUHJpbnRpbmcgc3RvcHMgZWFybHkgaWYgdGhlIG51bWJlciBoaXRzIHByaW50X21heDsgcmVwZWF0IGNvdW50cyBhcmUKKyAgIHByaW50ZWQgYXMgYXBwcm9wcmlhdGUuICBQcmludCBlbGxpcHNlcyBhdCB0aGUgZW5kIGlmIHdlIGhhZCB0byBzdG9wIGJlZm9yZQorICAgcHJpbnRpbmcgTEVOR1RIIGNoYXJhY3RlcnMsIG9yIGlmIEZPUkNFX0VMTElQU0VTLiAgKi8KKwordm9pZAorY19wcmludHN0ciAoc3RyZWFtLCBzdHJpbmcsIGxlbmd0aCwgd2lkdGgsIGZvcmNlX2VsbGlwc2VzKQorICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBjaGFyICpzdHJpbmc7CisgICAgIHVuc2lnbmVkIGludCBsZW5ndGg7CisgICAgIGludCB3aWR0aDsKKyAgICAgaW50IGZvcmNlX2VsbGlwc2VzOworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKKyAgdW5zaWduZWQgaW50IHRoaW5nc19wcmludGVkID0gMDsKKyAgaW50IGluX3F1b3RlcyA9IDA7CisgIGludCBuZWVkX2NvbW1hID0gMDsKKyAgZXh0ZXJuIGludCBpbnNwZWN0X2l0OworICBleHRlcm4gaW50IHJlcGVhdF9jb3VudF90aHJlc2hvbGQ7CisgIGV4dGVybiBpbnQgcHJpbnRfbWF4OworCisgIC8qIElmIHRoZSBzdHJpbmcgd2FzIG5vdCB0cnVuY2F0ZWQgZHVlIHRvIGBzZXQgcHJpbnQgZWxlbWVudHMnLCBhbmQKKyAgICAgdGhlIGxhc3QgYnl0ZSBvZiBpdCBpcyBhIG51bGwsIHdlIGRvbid0IHByaW50IHRoYXQsIGluIHRyYWRpdGlvbmFsIEMKKyAgICAgc3R5bGUuICAqLworICBpZiAoIWZvcmNlX2VsbGlwc2VzCisgICAgICAmJiBsZW5ndGggPiAwCisgICAgICAmJiBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKHN0cmluZyArIChsZW5ndGggLSAxKSAqIHdpZHRoLCB3aWR0aCkgPT0gJ1wwJykKKyAgICBsZW5ndGgtLTsKKworICBpZiAobGVuZ3RoID09IDApCisgICAgeworICAgICAgZnB1dHNfZmlsdGVyZWQgKCJcIlwiIiwgc3RyZWFtKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbmd0aCAmJiB0aGluZ3NfcHJpbnRlZCA8IHByaW50X21heDsgKytpKQorICAgIHsKKyAgICAgIC8qIFBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgd2UgYXJlIGV4YW1pbmluZworCSB0byBzZWUgd2hldGhlciBpdCBpcyByZXBlYXRlZC4gICovCisgICAgICB1bnNpZ25lZCBpbnQgcmVwMTsKKyAgICAgIC8qIE51bWJlciBvZiByZXBldGl0aW9ucyB3ZSBoYXZlIGRldGVjdGVkIHNvIGZhci4gICovCisgICAgICB1bnNpZ25lZCBpbnQgcmVwczsKKyAgICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF9jaGFyOworCisgICAgICBRVUlUOworCisgICAgICBpZiAobmVlZF9jb21tYSkKKwl7CisJICBmcHV0c19maWx0ZXJlZCAoIiwgIiwgc3RyZWFtKTsKKwkgIG5lZWRfY29tbWEgPSAwOworCX0KKworICAgICAgY3VycmVudF9jaGFyID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChzdHJpbmcgKyBpICogd2lkdGgsIHdpZHRoKTsKKworICAgICAgcmVwMSA9IGkgKyAxOworICAgICAgcmVwcyA9IDE7CisgICAgICB3aGlsZSAocmVwMSA8IGxlbmd0aAorCSAgICAgJiYgZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChzdHJpbmcgKyByZXAxICogd2lkdGgsIHdpZHRoKQorCSAgICAgICAgPT0gY3VycmVudF9jaGFyKQorCXsKKwkgICsrcmVwMTsKKwkgICsrcmVwczsKKwl9CisKKyAgICAgIGlmIChyZXBzID4gcmVwZWF0X2NvdW50X3RocmVzaG9sZCkKKwl7CisJICBpZiAoaW5fcXVvdGVzKQorCSAgICB7CisJICAgICAgaWYgKGluc3BlY3RfaXQpCisJCWZwdXRzX2ZpbHRlcmVkICgiXFxcIiwgIiwgc3RyZWFtKTsKKwkgICAgICBlbHNlCisJCWZwdXRzX2ZpbHRlcmVkICgiXCIsICIsIHN0cmVhbSk7CisJICAgICAgaW5fcXVvdGVzID0gMDsKKwkgICAgfQorCSAgTEFfUFJJTlRfQ0hBUiAoY3VycmVudF9jaGFyLCBzdHJlYW0pOworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiIDxyZXBlYXRzICV1IHRpbWVzPiIsIHJlcHMpOworCSAgaSA9IHJlcDEgLSAxOworCSAgdGhpbmdzX3ByaW50ZWQgKz0gcmVwZWF0X2NvdW50X3RocmVzaG9sZDsKKwkgIG5lZWRfY29tbWEgPSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoIWluX3F1b3RlcykKKwkgICAgeworCSAgICAgIGlmIChpbnNwZWN0X2l0KQorCQlmcHV0c19maWx0ZXJlZCAoIlxcXCIiLCBzdHJlYW0pOworCSAgICAgIGVsc2UKKwkJZnB1dHNfZmlsdGVyZWQgKCJcIiIsIHN0cmVhbSk7CisJICAgICAgaW5fcXVvdGVzID0gMTsKKwkgICAgfQorCSAgTEFfRU1JVF9DSEFSIChjdXJyZW50X2NoYXIsIHN0cmVhbSwgJyInKTsKKwkgICsrdGhpbmdzX3ByaW50ZWQ7CisJfQorICAgIH0KKworICAvKiBUZXJtaW5hdGUgdGhlIHF1b3RlcyBpZiBuZWNlc3NhcnkuICAqLworICBpZiAoaW5fcXVvdGVzKQorICAgIHsKKyAgICAgIGlmIChpbnNwZWN0X2l0KQorCWZwdXRzX2ZpbHRlcmVkICgiXFxcIiIsIHN0cmVhbSk7CisgICAgICBlbHNlCisJZnB1dHNfZmlsdGVyZWQgKCJcIiIsIHN0cmVhbSk7CisgICAgfQorCisgIGlmIChmb3JjZV9lbGxpcHNlcyB8fCBpIDwgbGVuZ3RoKQorICAgIGZwdXRzX2ZpbHRlcmVkICgiLi4uIiwgc3RyZWFtKTsKK30KKworLyogQ3JlYXRlIGEgZnVuZGFtZW50YWwgQyB0eXBlIHVzaW5nIGRlZmF1bHQgcmVhc29uYWJsZSBmb3IgdGhlIGN1cnJlbnQKKyAgIHRhcmdldCBtYWNoaW5lLgorCisgICBTb21lIG9iamVjdC9kZWJ1Z2dpbmcgZmlsZSBmb3JtYXRzIChEV0FSRiB2ZXJzaW9uIDEsIENPRkYsIGV0YykgZG8gbm90CisgICBkZWZpbmUgZnVuZGFtZW50YWwgdHlwZXMgc3VjaCBhcyAiaW50IiBvciAiZG91YmxlIi4gIE90aGVycyAoc3RhYnMgb3IKKyAgIERXQVJGIHZlcnNpb24gMiwgZXRjKSBkbyBkZWZpbmUgZnVuZGFtZW50YWwgdHlwZXMuICBGb3IgdGhlIGZvcm1hdHMgd2hpY2gKKyAgIGRvbid0IHByb3ZpZGUgZnVuZGFtZW50YWwgdHlwZXMsIGdkYiBjYW4gY3JlYXRlIHN1Y2ggdHlwZXMgdXNpbmcgdGhpcworICAgZnVuY3Rpb24uCisKKyAgIEZJWE1FOiAgU29tZSBjb21waWxlcnMgZGlzdGluZ3Vpc2ggZXhwbGljaXRseSBzaWduZWQgaW50ZWdyYWwgdHlwZXMKKyAgIChzaWduZWQgc2hvcnQsIHNpZ25lZCBpbnQsIHNpZ25lZCBsb25nKSBmcm9tICJyZWd1bGFyIiBpbnRlZ3JhbCB0eXBlcworICAgKHNob3J0LCBpbnQsIGxvbmcpIGluIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGVyZSBpcyBzb21lIGRpcy0KKyAgIGFncmVlbWVudCBhcyB0byBob3cgdXNlZnVsIHRoaXMgZmVhdHVyZSBpcy4gIEluIHBhcnRpY3VsYXIsIGdjYyBkb2VzCisgICBub3Qgc3VwcG9ydCB0aGlzLiAgQWxzbywgb25seSBzb21lIGRlYnVnZ2luZyBmb3JtYXRzIGFsbG93IHRoZQorICAgZGlzdGluY3Rpb24gdG8gYmUgcGFzc2VkIG9uIHRvIGEgZGVidWdnZXIuICBGb3Igbm93LCB3ZSBhbHdheXMganVzdAorICAgdXNlICJzaG9ydCIsICJpbnQiLCBvciAibG9uZyIgYXMgdGhlIHR5cGUgbmFtZSwgZm9yIGJvdGggdGhlIGltcGxpY2l0CisgICBhbmQgZXhwbGljaXRseSBzaWduZWQgdHlwZXMuICBUaGlzIGFsc28gbWFrZXMgbGlmZSBlYXNpZXIgZm9yIHRoZQorICAgZ2RiIHRlc3Qgc3VpdGUgc2luY2Ugd2UgZG9uJ3QgaGF2ZSB0byBhY2NvdW50IGZvciB0aGUgZGlmZmVyZW5jZXMKKyAgIGluIG91dHB1dCBkZXBlbmRpbmcgdXBvbiB3aGF0IHRoZSBjb21waWxlciBhbmQgZGVidWdnaW5nIGZvcm1hdAorICAgc3VwcG9ydC4gIFdlIHdpbGwgcHJvYmFibHkgaGF2ZSB0byByZS1leGFtaW5lIHRoZSBpc3N1ZSB3aGVuIGdkYgorICAgc3RhcnRzIHRha2luZyBpdCdzIGZ1bmRhbWVudGFsIHR5cGUgaW5mb3JtYXRpb24gZGlyZWN0bHkgZnJvbSB0aGUKKyAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBzdXBwbGllZCBieSB0aGUgY29tcGlsZXIuICBmbmZAY3lnbnVzLmNvbSAqLworCitzdHJ1Y3QgdHlwZSAqCitjX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCB0eXBlaWQpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBpbnQgdHlwZWlkOworeworICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdHlwZSA9IE5VTEw7CisKKyAgc3dpdGNoICh0eXBlaWQpCisgICAgeworICAgICAgZGVmYXVsdDoKKwkvKiBGSVhNRTogIEZvciBub3csIGlmIHdlIGFyZSBhc2tlZCB0byBwcm9kdWNlIGEgdHlwZSBub3QgaW4gdGhpcworCSAgIGxhbmd1YWdlLCBjcmVhdGUgdGhlIGVxdWl2YWxlbnQgb2YgYSBDIGludGVnZXIgdHlwZSB3aXRoIHRoZQorCSAgIG5hbWUgIjw/dHlwZT8+Ii4gIFdoZW4gYWxsIHRoZSBkdXN0IHNldHRsZXMgZnJvbSB0aGUgdHlwZQorCSAgIHJlY29uc3RydWN0aW9uIHdvcmssIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlY29tZSBhbiBlcnJvci4gKi8KKwl0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJICBUQVJHRVRfSU5UX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCSAgMCwgIjw/dHlwZT8+Iiwgb2JqZmlsZSk7CisgICAgICAgIHdhcm5pbmcgKCJpbnRlcm5hbCBlcnJvcjogbm8gQy9DKysgZnVuZGFtZW50YWwgdHlwZSAlZCIsIHR5cGVpZCk7CisJYnJlYWs7CisgICAgICBjYXNlIEZUX1ZPSUQ6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX1ZPSUQsCisJCQkgIFRBUkdFVF9DSEFSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCSAgMCwgInZvaWQiLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfQk9PTEVBTjoKKyAgICAgICAgdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0JPT0wsCisJCQkgIFRBUkdFVF9DSEFSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgImJvb2wiLCBvYmpmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGVF9DSEFSOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsCisJCQkgIFRBUkdFVF9DSEFSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCSAgMCwgImNoYXIiLCBvYmpmaWxlKTsKKyAgICAgICAgVFlQRV9GTEFHUyAodHlwZSkgfD0gVFlQRV9GTEFHX05PU0lHTjsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfU0lHTkVEX0NIQVI6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwKKwkJCSAgVEFSR0VUX0NIQVJfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJICAwLCAic2lnbmVkIGNoYXIiLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfVU5TSUdORURfQ0hBUjoKKwl0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJICBUQVJHRVRfQ0hBUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIFRZUEVfRkxBR19VTlNJR05FRCwgInVuc2lnbmVkIGNoYXIiLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfU0hPUlQ6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwKKwkJCSAgVEFSR0VUX1NIT1JUX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCSAgMCwgInNob3J0Iiwgb2JqZmlsZSk7CisJYnJlYWs7CisgICAgICBjYXNlIEZUX1NJR05FRF9TSE9SVDoKKwl0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJICBUQVJHRVRfU0hPUlRfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJICAwLCAic2hvcnQiLCBvYmpmaWxlKTsJLyogRklYTUUtZm5mICovCisJYnJlYWs7CisgICAgICBjYXNlIEZUX1VOU0lHTkVEX1NIT1JUOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsCisJCQkgIFRBUkdFVF9TSE9SVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIFRZUEVfRkxBR19VTlNJR05FRCwgInVuc2lnbmVkIHNob3J0Iiwgb2JqZmlsZSk7CisJYnJlYWs7CisgICAgICBjYXNlIEZUX0lOVEVHRVI6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwKKwkJCSAgVEFSR0VUX0lOVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIDAsICJpbnQiLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfU0lHTkVEX0lOVEVHRVI6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwKKwkJCSAgVEFSR0VUX0lOVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIDAsICJpbnQiLCBvYmpmaWxlKTsgLyogRklYTUUgLWZuZiAqLworCWJyZWFrOworICAgICAgY2FzZSBGVF9VTlNJR05FRF9JTlRFR0VSOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsCisJCQkgIFRBUkdFVF9JTlRfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJICBUWVBFX0ZMQUdfVU5TSUdORUQsICJ1bnNpZ25lZCBpbnQiLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfTE9ORzoKKwl0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJICBUQVJHRVRfTE9OR19CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIDAsICJsb25nIiwgb2JqZmlsZSk7CisJYnJlYWs7CisgICAgICBjYXNlIEZUX1NJR05FRF9MT05HOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsCisJCQkgIFRBUkdFVF9MT05HX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCSAgMCwgImxvbmciLCBvYmpmaWxlKTsgLyogRklYTUUgLWZuZiAqLworCWJyZWFrOworICAgICAgY2FzZSBGVF9VTlNJR05FRF9MT05HOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsCisJCQkgIFRBUkdFVF9MT05HX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCSAgVFlQRV9GTEFHX1VOU0lHTkVELCAidW5zaWduZWQgbG9uZyIsIG9iamZpbGUpOworCWJyZWFrOworICAgICAgY2FzZSBGVF9MT05HX0xPTkc6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwKKwkJCSAgVEFSR0VUX0xPTkdfTE9OR19CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIDAsICJsb25nIGxvbmciLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfU0lHTkVEX0xPTkdfTE9ORzoKKwl0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJICBUQVJHRVRfTE9OR19MT05HX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCSAgMCwgInNpZ25lZCBsb25nIGxvbmciLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfVU5TSUdORURfTE9OR19MT05HOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsCisJCQkgIFRBUkdFVF9MT05HX0xPTkdfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJICBUWVBFX0ZMQUdfVU5TSUdORUQsICJ1bnNpZ25lZCBsb25nIGxvbmciLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfRkxPQVQ6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0ZMVCwKKwkJCSAgVEFSR0VUX0ZMT0FUX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCSAgMCwgImZsb2F0Iiwgb2JqZmlsZSk7CisJYnJlYWs7CisgICAgICBjYXNlIEZUX0RCTF9QUkVDX0ZMT0FUOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9GTFQsCisJCQkgIFRBUkdFVF9ET1VCTEVfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJICAwLCAiZG91YmxlIiwgb2JqZmlsZSk7CisJYnJlYWs7CisgICAgICBjYXNlIEZUX0VYVF9QUkVDX0ZMT0FUOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9GTFQsCisJCQkgIFRBUkdFVF9MT05HX0RPVUJMRV9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIDAsICJsb25nIGRvdWJsZSIsIG9iamZpbGUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlRfVEVNUExBVEVfQVJHOgorICAgICAgICB0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfVEVNUExBVEVfQVJHLAorCQkJICAwLAorCQkgICAgICAgICAgMCwgIjx0ZW1wbGF0ZSBhcmc+Iiwgb2JqZmlsZSk7CisKKwlicmVhazsKKyAgICAgIH0KKyAgcmV0dXJuICh0eXBlKTsKK30KKworDAorLyogVGFibGUgbWFwcGluZyBvcGNvZGVzIGludG8gc3RyaW5ncyBmb3IgcHJpbnRpbmcgb3BlcmF0b3JzCisgICBhbmQgcHJlY2VkZW5jZXMgb2YgdGhlIG9wZXJhdG9ycy4gICovCisKK2NvbnN0IHN0cnVjdCBvcF9wcmludCBjX29wX3ByaW50X3RhYltdID0KKyAgeworICAgIHsiLCIsICBCSU5PUF9DT01NQSwgUFJFQ19DT01NQSwgMH0sCisgICAgeyI9IiwgIEJJTk9QX0FTU0lHTiwgUFJFQ19BU1NJR04sIDF9LAorICAgIHsifHwiLCBCSU5PUF9MT0dJQ0FMX09SLCBQUkVDX0xPR0lDQUxfT1IsIDB9LAorICAgIHsiJiYiLCBCSU5PUF9MT0dJQ0FMX0FORCwgUFJFQ19MT0dJQ0FMX0FORCwgMH0sCisgICAgeyJ8IiwgIEJJTk9QX0JJVFdJU0VfSU9SLCBQUkVDX0JJVFdJU0VfSU9SLCAwfSwKKyAgICB7Il4iLCAgQklOT1BfQklUV0lTRV9YT1IsIFBSRUNfQklUV0lTRV9YT1IsIDB9LAorICAgIHsiJiIsICBCSU5PUF9CSVRXSVNFX0FORCwgUFJFQ19CSVRXSVNFX0FORCwgMH0sCisgICAgeyI9PSIsIEJJTk9QX0VRVUFMLCBQUkVDX0VRVUFMLCAwfSwKKyAgICB7IiE9IiwgQklOT1BfTk9URVFVQUwsIFBSRUNfRVFVQUwsIDB9LAorICAgIHsiPD0iLCBCSU5PUF9MRVEsIFBSRUNfT1JERVIsIDB9LAorICAgIHsiPj0iLCBCSU5PUF9HRVEsIFBSRUNfT1JERVIsIDB9LAorICAgIHsiPiIsICBCSU5PUF9HVFIsIFBSRUNfT1JERVIsIDB9LAorICAgIHsiPCIsICBCSU5PUF9MRVNTLCBQUkVDX09SREVSLCAwfSwKKyAgICB7Ij4+IiwgQklOT1BfUlNILCBQUkVDX1NISUZULCAwfSwKKyAgICB7Ijw8IiwgQklOT1BfTFNILCBQUkVDX1NISUZULCAwfSwKKyAgICB7IisiLCAgQklOT1BfQURELCBQUkVDX0FERCwgMH0sCisgICAgeyItIiwgIEJJTk9QX1NVQiwgUFJFQ19BREQsIDB9LAorICAgIHsiKiIsICBCSU5PUF9NVUwsIFBSRUNfTVVMLCAwfSwKKyAgICB7Ii8iLCAgQklOT1BfRElWLCBQUkVDX01VTCwgMH0sCisgICAgeyIlIiwgIEJJTk9QX1JFTSwgUFJFQ19NVUwsIDB9LAorICAgIHsiQCIsICBCSU5PUF9SRVBFQVQsIFBSRUNfUkVQRUFULCAwfSwKKyAgICB7Ii0iLCAgVU5PUF9ORUcsIFBSRUNfUFJFRklYLCAwfSwKKyAgICB7IiEiLCAgVU5PUF9MT0dJQ0FMX05PVCwgUFJFQ19QUkVGSVgsIDB9LAorICAgIHsifiIsICBVTk9QX0NPTVBMRU1FTlQsIFBSRUNfUFJFRklYLCAwfSwKKyAgICB7IioiLCAgVU5PUF9JTkQsIFBSRUNfUFJFRklYLCAwfSwKKyAgICB7IiYiLCAgVU5PUF9BRERSLCBQUkVDX1BSRUZJWCwgMH0sCisgICAgeyJzaXplb2YgIiwgVU5PUF9TSVpFT0YsIFBSRUNfUFJFRklYLCAwfSwKKyAgICB7IisrIiwgVU5PUF9QUkVJTkNSRU1FTlQsIFBSRUNfUFJFRklYLCAwfSwKKyAgICB7Ii0tIiwgVU5PUF9QUkVERUNSRU1FTlQsIFBSRUNfUFJFRklYLCAwfSwKKyAgICAvKiBDKysgICovCisgICAgeyI6OiIsIEJJTk9QX1NDT1BFLCBQUkVDX1BSRUZJWCwgMH0sCisgICAge05VTEwsIDAsIDAsIDB9Cit9OworDAorc3RydWN0IHR5cGUgKiogQ09OU1RfUFRSIChjX2J1aWx0aW5fdHlwZXNbXSkgPSAKK3sKKyAgJmJ1aWx0aW5fdHlwZV9pbnQsCisgICZidWlsdGluX3R5cGVfbG9uZywKKyAgJmJ1aWx0aW5fdHlwZV9zaG9ydCwKKyAgJmJ1aWx0aW5fdHlwZV9jaGFyLAorICAmYnVpbHRpbl90eXBlX2Zsb2F0LAorICAmYnVpbHRpbl90eXBlX2RvdWJsZSwKKyAgJmJ1aWx0aW5fdHlwZV92b2lkLAorICAmYnVpbHRpbl90eXBlX2xvbmdfbG9uZywKKyAgJmJ1aWx0aW5fdHlwZV9zaWduZWRfY2hhciwKKyAgJmJ1aWx0aW5fdHlwZV91bnNpZ25lZF9jaGFyLAorICAmYnVpbHRpbl90eXBlX3Vuc2lnbmVkX3Nob3J0LAorICAmYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2ludCwKKyAgJmJ1aWx0aW5fdHlwZV91bnNpZ25lZF9sb25nLAorICAmYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZywKKyAgJmJ1aWx0aW5fdHlwZV9sb25nX2RvdWJsZSwKKyAgJmJ1aWx0aW5fdHlwZV9jb21wbGV4LAorICAmYnVpbHRpbl90eXBlX2RvdWJsZV9jb21wbGV4LAorICAwCit9OworCitjb25zdCBzdHJ1Y3QgbGFuZ3VhZ2VfZGVmbiBjX2xhbmd1YWdlX2RlZm4gPSB7CisgICJjIiwJCQkJLyogTGFuZ3VhZ2UgbmFtZSAqLworICBsYW5ndWFnZV9jLAorICBjX2J1aWx0aW5fdHlwZXMsCisgIHJhbmdlX2NoZWNrX29mZiwKKyAgdHlwZV9jaGVja19vZmYsCisgIGNfcGFyc2UsCisgIGNfZXJyb3IsCisgIGV2YWx1YXRlX3N1YmV4cF9zdGFuZGFyZCwKKyAgY19wcmludGNoYXIsCQkJLyogUHJpbnQgYSBjaGFyYWN0ZXIgY29uc3RhbnQgKi8KKyAgY19wcmludHN0ciwJCQkvKiBGdW5jdGlvbiB0byBwcmludCBzdHJpbmcgY29uc3RhbnQgKi8KKyAgY19lbWl0X2NoYXIsCQkJLyogUHJpbnQgYSBzaW5nbGUgY2hhciAqLworICBjX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlLAkvKiBDcmVhdGUgZnVuZGFtZW50YWwgdHlwZSBpbiB0aGlzIGxhbmd1YWdlICovCisgIGNfcHJpbnRfdHlwZSwJCQkvKiBQcmludCBhIHR5cGUgdXNpbmcgYXBwcm9wcmlhdGUgc3ludGF4ICovCisgIGNfdmFsX3ByaW50LAkJCS8qIFByaW50IGEgdmFsdWUgdXNpbmcgYXBwcm9wcmlhdGUgc3ludGF4ICovCisgIGNfdmFsdWVfcHJpbnQsCQkvKiBQcmludCBhIHRvcC1sZXZlbCB2YWx1ZSAqLworICB7IiIsICAgICAiIiwgICAgIiIsICAiIn0sCS8qIEJpbmFyeSBmb3JtYXQgaW5mbyAqLworICB7IjAlbG8iLCAgIjAiLCAgICJvIiwgIiJ9LAkvKiBPY3RhbCBmb3JtYXQgaW5mbyAqLworICB7IiVsZCIsICAgIiIsICAgICJkIiwgIiJ9LAkvKiBEZWNpbWFsIGZvcm1hdCBpbmZvICovCisgIHsiMHglbHgiLCAiMHgiLCAgIngiLCAiIn0sCS8qIEhleCBmb3JtYXQgaW5mbyAqLworICBjX29wX3ByaW50X3RhYiwJCS8qIGV4cHJlc3Npb24gb3BlcmF0b3JzIGZvciBwcmludGluZyAqLworICAxLAkJCQkvKiBjLXN0eWxlIGFycmF5cyAqLworICAwLAkJCQkvKiBTdHJpbmcgbG93ZXIgYm91bmQgKi8KKyAgJmJ1aWx0aW5fdHlwZV9jaGFyLAkJLyogVHlwZSBvZiBzdHJpbmcgZWxlbWVudHMgKi8gCisgIExBTkdfTUFHSUMKK307CisKK3N0cnVjdCB0eXBlICoqIGNvbnN0IChjcGx1c19idWlsdGluX3R5cGVzW10pID0gCit7CisgICZidWlsdGluX3R5cGVfaW50LAorICAmYnVpbHRpbl90eXBlX2xvbmcsCisgICZidWlsdGluX3R5cGVfc2hvcnQsCisgICZidWlsdGluX3R5cGVfY2hhciwKKyAgJmJ1aWx0aW5fdHlwZV9mbG9hdCwKKyAgJmJ1aWx0aW5fdHlwZV9kb3VibGUsCisgICZidWlsdGluX3R5cGVfdm9pZCwKKyAgJmJ1aWx0aW5fdHlwZV9sb25nX2xvbmcsCisgICZidWlsdGluX3R5cGVfc2lnbmVkX2NoYXIsCisgICZidWlsdGluX3R5cGVfdW5zaWduZWRfY2hhciwKKyAgJmJ1aWx0aW5fdHlwZV91bnNpZ25lZF9zaG9ydCwKKyAgJmJ1aWx0aW5fdHlwZV91bnNpZ25lZF9pbnQsCisgICZidWlsdGluX3R5cGVfdW5zaWduZWRfbG9uZywKKyAgJmJ1aWx0aW5fdHlwZV91bnNpZ25lZF9sb25nX2xvbmcsCisgICZidWlsdGluX3R5cGVfbG9uZ19kb3VibGUsCisgICZidWlsdGluX3R5cGVfY29tcGxleCwKKyAgJmJ1aWx0aW5fdHlwZV9kb3VibGVfY29tcGxleCwKKyAgJmJ1aWx0aW5fdHlwZV9ib29sLAorICAwCit9OworCitjb25zdCBzdHJ1Y3QgbGFuZ3VhZ2VfZGVmbiBjcGx1c19sYW5ndWFnZV9kZWZuID0geworICAiYysrIiwJCQkJLyogTGFuZ3VhZ2UgbmFtZSAqLworICBsYW5ndWFnZV9jcGx1cywKKyAgY3BsdXNfYnVpbHRpbl90eXBlcywKKyAgcmFuZ2VfY2hlY2tfb2ZmLAorICB0eXBlX2NoZWNrX29mZiwKKyAgY19wYXJzZSwKKyAgY19lcnJvciwKKyAgZXZhbHVhdGVfc3ViZXhwX3N0YW5kYXJkLAorICBjX3ByaW50Y2hhciwJCQkvKiBQcmludCBhIGNoYXJhY3RlciBjb25zdGFudCAqLworICBjX3ByaW50c3RyLAkJCS8qIEZ1bmN0aW9uIHRvIHByaW50IHN0cmluZyBjb25zdGFudCAqLworICBjX2VtaXRfY2hhciwJCQkvKiBQcmludCBhIHNpbmdsZSBjaGFyICovCisgIGNfY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGUsCS8qIENyZWF0ZSBmdW5kYW1lbnRhbCB0eXBlIGluIHRoaXMgbGFuZ3VhZ2UgKi8KKyAgY19wcmludF90eXBlLAkJCS8qIFByaW50IGEgdHlwZSB1c2luZyBhcHByb3ByaWF0ZSBzeW50YXggKi8KKyAgY192YWxfcHJpbnQsCQkJLyogUHJpbnQgYSB2YWx1ZSB1c2luZyBhcHByb3ByaWF0ZSBzeW50YXggKi8KKyAgY192YWx1ZV9wcmludCwJCS8qIFByaW50IGEgdG9wLWxldmVsIHZhbHVlICovCisgIHsiIiwgICAgICAiIiwgICAgIiIsICAgIiJ9LAkvKiBCaW5hcnkgZm9ybWF0IGluZm8gKi8KKyAgeyIwJWxvIiwgICAiMCIsICAgIm8iLCAgIiJ9LAkvKiBPY3RhbCBmb3JtYXQgaW5mbyAqLworICB7IiVsZCIsICAgICIiLCAgICAiZCIsICAiIn0sCS8qIERlY2ltYWwgZm9ybWF0IGluZm8gKi8KKyAgeyIweCVseCIsICAiMHgiLCAgIngiLCAgIiJ9LAkvKiBIZXggZm9ybWF0IGluZm8gKi8KKyAgY19vcF9wcmludF90YWIsCQkvKiBleHByZXNzaW9uIG9wZXJhdG9ycyBmb3IgcHJpbnRpbmcgKi8KKyAgMSwJCQkJLyogYy1zdHlsZSBhcnJheXMgKi8KKyAgMCwJCQkJLyogU3RyaW5nIGxvd2VyIGJvdW5kICovCisgICZidWlsdGluX3R5cGVfY2hhciwJCS8qIFR5cGUgb2Ygc3RyaW5nIGVsZW1lbnRzICovIAorICBMQU5HX01BR0lDCit9OworCitjb25zdCBzdHJ1Y3QgbGFuZ3VhZ2VfZGVmbiBhc21fbGFuZ3VhZ2VfZGVmbiA9IHsKKyAgImFzbSIsCQkJLyogTGFuZ3VhZ2UgbmFtZSAqLworICBsYW5ndWFnZV9hc20sCisgIGNfYnVpbHRpbl90eXBlcywKKyAgcmFuZ2VfY2hlY2tfb2ZmLAorICB0eXBlX2NoZWNrX29mZiwKKyAgY19wYXJzZSwKKyAgY19lcnJvciwKKyAgZXZhbHVhdGVfc3ViZXhwX3N0YW5kYXJkLAorICBjX3ByaW50Y2hhciwJCQkvKiBQcmludCBhIGNoYXJhY3RlciBjb25zdGFudCAqLworICBjX3ByaW50c3RyLAkJCS8qIEZ1bmN0aW9uIHRvIHByaW50IHN0cmluZyBjb25zdGFudCAqLworICBjX2VtaXRfY2hhciwJCQkvKiBQcmludCBhIHNpbmdsZSBjaGFyICovCisgIGNfY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGUsCS8qIENyZWF0ZSBmdW5kYW1lbnRhbCB0eXBlIGluIHRoaXMgbGFuZ3VhZ2UgKi8KKyAgY19wcmludF90eXBlLAkJCS8qIFByaW50IGEgdHlwZSB1c2luZyBhcHByb3ByaWF0ZSBzeW50YXggKi8KKyAgY192YWxfcHJpbnQsCQkJLyogUHJpbnQgYSB2YWx1ZSB1c2luZyBhcHByb3ByaWF0ZSBzeW50YXggKi8KKyAgY192YWx1ZV9wcmludCwJCS8qIFByaW50IGEgdG9wLWxldmVsIHZhbHVlICovCisgIHsiIiwgICAgICIiLCAgICAiIiwgICIifSwJLyogQmluYXJ5IGZvcm1hdCBpbmZvICovCisgIHsiMCVsbyIsICAiMCIsICAgIm8iLCAiIn0sCS8qIE9jdGFsIGZvcm1hdCBpbmZvICovCisgIHsiJWxkIiwgICAiIiwgICAgImQiLCAiIn0sCS8qIERlY2ltYWwgZm9ybWF0IGluZm8gKi8KKyAgeyIweCVseCIsICIweCIsICAieCIsICIifSwJLyogSGV4IGZvcm1hdCBpbmZvICovCisgIGNfb3BfcHJpbnRfdGFiLAkJLyogZXhwcmVzc2lvbiBvcGVyYXRvcnMgZm9yIHByaW50aW5nICovCisgIDEsCQkJCS8qIGMtc3R5bGUgYXJyYXlzICovCisgIDAsCQkJCS8qIFN0cmluZyBsb3dlciBib3VuZCAqLworICAmYnVpbHRpbl90eXBlX2NoYXIsCQkvKiBUeXBlIG9mIHN0cmluZyBlbGVtZW50cyAqLyAKKyAgTEFOR19NQUdJQworfTsKKwordm9pZAorX2luaXRpYWxpemVfY19sYW5ndWFnZSAoKQoreworICBhZGRfbGFuZ3VhZ2UgKCZjX2xhbmd1YWdlX2RlZm4pOworICBhZGRfbGFuZ3VhZ2UgKCZjcGx1c19sYW5ndWFnZV9kZWZuKTsKKyAgYWRkX2xhbmd1YWdlICgmYXNtX2xhbmd1YWdlX2RlZm4pOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2MtbGFuZy5oIGIvZ2RiL2MtbGFuZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NDg2ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvYy1sYW5nLmgKQEAgLTAsMCArMSw4NyBAQAorLyogQyBsYW5ndWFnZSBzdXBwb3J0IGRlZmluaXRpb25zIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk5MiwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNpZiAhZGVmaW5lZCAoQ19MQU5HX0gpCisjZGVmaW5lIENfTEFOR19IIDEKKworI2luY2x1ZGUgInZhbHVlLmgiCisKKworZXh0ZXJuIGludAorY19wYXJzZSBQQVJBTVMgKCh2b2lkKSk7CS8qIERlZmluZWQgaW4gYy1leHAueSAqLworCitleHRlcm4gdm9pZAorY19lcnJvciBQQVJBTVMgKChjaGFyICopKTsJLyogRGVmaW5lZCBpbiBjLWV4cC55ICovCisKK2V4dGVybiB2b2lkCQkJLyogRGVmaW5lZCBpbiBjLXR5cGVwcmludC5jICovCitjX3ByaW50X3R5cGUgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqLCBHREJfRklMRSAqLCBpbnQsIGludCkpOworCitleHRlcm4gaW50CitjX3ZhbF9wcmludCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBjaGFyICosIGludCwgQ09SRV9BRERSLCBHREJfRklMRSAqLCBpbnQsIGludCwKKwkJICAgICBpbnQsIGVudW0gdmFsX3ByZXR0eXByaW50KSk7CisKK2V4dGVybiBpbnQKK2NfdmFsdWVfcHJpbnQgUEFSQU1TICgoc3RydWN0IHZhbHVlICosIEdEQl9GSUxFICosIGludCwgZW51bSB2YWxfcHJldHR5cHJpbnQpKTsKKworLyogVGhlc2UgYXJlIGluIGMtbGFuZy5jOiAqLworCitleHRlcm4gdm9pZCBjX3ByaW50Y2hhciBQQVJBTVMgKChpbnQsIEdEQl9GSUxFKikpOworCitleHRlcm4gdm9pZCBjX3ByaW50c3RyIFBBUkFNUyAoKEdEQl9GSUxFICpzdHJlYW0sIGNoYXIgKnN0cmluZywKKwkJCQl1bnNpZ25lZCBpbnQgbGVuZ3RoLCBpbnQgd2lkdGgsCisJCQkJaW50IGZvcmNlX2VsbGlwc2VzKSk7CisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqIGNfY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGUgUEFSQU1TICgoc3RydWN0IG9iamZpbGUqLCBpbnQpKTsKKworZXh0ZXJuIHN0cnVjdCB0eXBlICoqIENPTlNUX1BUUiAoY19idWlsdGluX3R5cGVzW10pOworCisvKiBUaGVzZSBhcmUgaW4gYy10eXBlcHJpbnQuYzogKi8KKworZXh0ZXJuIHZvaWQKK2NfdHlwZV9wcmludF9iYXNlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIEdEQl9GSUxFICosIGludCwgaW50KSk7CisKK2V4dGVybiB2b2lkCitjX3R5cGVfcHJpbnRfdmFyc3BlY19wcmVmaXggUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgR0RCX0ZJTEUgKiwgaW50LCBpbnQpKTsKKworLyogVGhlc2UgYXJlIGluIGNwLXZhbHByaW50LmMgKi8KKworZXh0ZXJuIGludCB2dGJscHJpbnQ7CQkvKiBDb250cm9scyBwcmludGluZyBvZiB2dGJsJ3MgKi8KKworZXh0ZXJuIGludCBzdGF0aWNfZmllbGRfcHJpbnQ7CisKK2V4dGVybiB2b2lkCitjcF9wcmludF9jbGFzc19tZW1iZXIgUEFSQU1TICgoY2hhciAqLCBzdHJ1Y3QgdHlwZSAqLCBHREJfRklMRSAqLCBjaGFyICopKTsKKworZXh0ZXJuIHZvaWQKK2NwX3ByaW50X2NsYXNzX21ldGhvZCBQQVJBTVMgKChjaGFyICosIHN0cnVjdCB0eXBlICosIEdEQl9GSUxFICopKTsKKworZXh0ZXJuIHZvaWQKK2NwX3ByaW50X3ZhbHVlX2ZpZWxkcyBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBzdHJ1Y3QgdHlwZSAqLCBjaGFyICosIGludCwgQ09SRV9BRERSLAorCQkJICAgICAgIEdEQl9GSUxFICosIGludCwgaW50LCBlbnVtIHZhbF9wcmV0dHlwcmludCwKKwkJCSAgICAgICBzdHJ1Y3QgdHlwZSoqLCBpbnQpKTsKKworZXh0ZXJuIGludAorY3BfaXNfdnRibF9wdHJfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKSk7CisKK2V4dGVybiBpbnQKK2NwX2lzX3Z0YmxfbWVtYmVyIFBBUkFNUyAoKHN0cnVjdCB0eXBlICopKTsKKworCisjZW5kaWYJLyogIWRlZmluZWQgKENfTEFOR19IKSAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2MtdHlwZXByaW50LmMgYi9nZGIvYy10eXBlcHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTU1NTAzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2MtdHlwZXByaW50LmMKQEAgLTAsMCArMSwxMDg5IEBACisvKiBTdXBwb3J0IGZvciBwcmludGluZyBDIGFuZCBDKysgdHlwZXMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg4LCAxOTg5LCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJiZmQuaCIJCS8qIEJpbmFyeSBGaWxlIERlc2NyaXB0aW9uICovCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAiZGVtYW5nbGUuaCIKKyNpbmNsdWRlICJjLWxhbmcuaCIKKyNpbmNsdWRlICJ0eXBlcHJpbnQuaCIKKworI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKy8qIEZsYWcgaW5kaWNhdGluZyB0YXJnZXQgd2FzIGNvbXBpbGVkIGJ5IEhQIGNvbXBpbGVyICovCitleHRlcm4gaW50IGhwX3NvbV9zb21fb2JqZWN0X3ByZXNlbnQ7CisKK3N0YXRpYyB2b2lkCitjX3R5cGVfcHJpbnRfYXJncyBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBHREJfRklMRSAqKSk7CisKK3N0YXRpYyB2b2lkCitjcF90eXBlX3ByaW50X2Rlcml2YXRpb25faW5mbyBQQVJBTVMgKChHREJfRklMRSAqLCBzdHJ1Y3QgdHlwZSAqKSk7CisKK3ZvaWQKK2NfdHlwZV9wcmludF92YXJzcGVjX3ByZWZpeCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBHREJfRklMRSAqLCBpbnQsIGludCkpOworCitzdGF0aWMgdm9pZAorY190eXBlX3ByaW50X2N2X3F1YWxpZmllciBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBHREJfRklMRSAqLCBpbnQsIGludCkpOworCisKKwwKKy8qIFByaW50IGEgZGVzY3JpcHRpb24gb2YgYSB0eXBlIGluIHRoZSBmb3JtYXQgb2YgYSAKKyAgIHR5cGVkZWYgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlLgorICAgTkVXIGlzIHRoZSBuZXcgbmFtZSBmb3IgYSB0eXBlIFRZUEUuICovCisKK3ZvaWQKK2NfdHlwZWRlZl9wcmludCAodHlwZSwgbmV3LCBzdHJlYW0pCisgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgIHN0cnVjdCBzeW1ib2wgKm5ldzsKKyAgIEdEQl9GSUxFICpzdHJlYW07Cit7CisgIENIRUNLX1RZUEVERUYgKHR5cGUpOworICAgc3dpdGNoIChjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSkKKyAgIHsKKyNpZmRlZiBfTEFOR19jCisgICBjYXNlIGxhbmd1YWdlX2M6CisgICBjYXNlIGxhbmd1YWdlX2NwbHVzOgorICAgICAgZnByaW50Zl9maWx0ZXJlZChzdHJlYW0sICJ0eXBlZGVmICIpOworICAgICAgdHlwZV9wcmludCh0eXBlLCIiLHN0cmVhbSwwKTsKKyAgICAgIGlmKFRZUEVfTkFNRSAoKFNZTUJPTF9UWVBFIChuZXcpKSkgPT0gMAorCSB8fCAhU1RSRVEgKFRZUEVfTkFNRSAoKFNZTUJPTF9UWVBFIChuZXcpKSksIFNZTUJPTF9OQU1FIChuZXcpKSkKKwlmcHJpbnRmX2ZpbHRlcmVkKHN0cmVhbSwgICIgJXMiLCBTWU1CT0xfU09VUkNFX05BTUUobmV3KSk7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIF9MQU5HX20yCisgICBjYXNlIGxhbmd1YWdlX20yOgorICAgICAgZnByaW50Zl9maWx0ZXJlZChzdHJlYW0sICJUWVBFICIpOworICAgICAgaWYoIVRZUEVfTkFNRShTWU1CT0xfVFlQRShuZXcpKSB8fAorCSAhU1RSRVEgKFRZUEVfTkFNRShTWU1CT0xfVFlQRShuZXcpKSwgU1lNQk9MX05BTUUobmV3KSkpCisJZnByaW50Zl9maWx0ZXJlZChzdHJlYW0sICIlcyA9ICIsIFNZTUJPTF9TT1VSQ0VfTkFNRShuZXcpKTsKKyAgICAgIGVsc2UKKwkgZnByaW50Zl9maWx0ZXJlZChzdHJlYW0sICI8YnVpbHRpbj4gPSAiKTsKKyAgICAgIHR5cGVfcHJpbnQodHlwZSwiIixzdHJlYW0sMCk7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIF9MQU5HX2NoaWxsCisgICBjYXNlIGxhbmd1YWdlX2NoaWxsOgorICAgICAgZnByaW50Zl9maWx0ZXJlZChzdHJlYW0sICJTWU5NT0RFICIpOworICAgICAgaWYoIVRZUEVfTkFNRShTWU1CT0xfVFlQRShuZXcpKSB8fAorCSAhU1RSRVEgKFRZUEVfTkFNRShTWU1CT0xfVFlQRShuZXcpKSwgU1lNQk9MX05BTUUobmV3KSkpCisJZnByaW50Zl9maWx0ZXJlZChzdHJlYW0sICIlcyA9ICIsIFNZTUJPTF9TT1VSQ0VfTkFNRShuZXcpKTsKKyAgICAgIGVsc2UKKwkgZnByaW50Zl9maWx0ZXJlZChzdHJlYW0sICI8YnVpbHRpbj4gPSAiKTsKKyAgICAgIHR5cGVfcHJpbnQodHlwZSwiIixzdHJlYW0sMCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgZGVmYXVsdDoKKyAgICAgIGVycm9yKCJMYW5ndWFnZSBub3Qgc3VwcG9ydGVkLiIpOworICAgfQorICAgZnByaW50Zl9maWx0ZXJlZChzdHJlYW0sICI7XG4iKTsKK30KKworCisvKiBMRVZFTCBpcyB0aGUgZGVwdGggdG8gaW5kZW50IGxpbmVzIGJ5LiAgKi8KKwordm9pZAorY19wcmludF90eXBlICh0eXBlLCB2YXJzdHJpbmcsIHN0cmVhbSwgc2hvdywgbGV2ZWwpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBjaGFyICp2YXJzdHJpbmc7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGludCBzaG93OworICAgICBpbnQgbGV2ZWw7Cit7CisgIHJlZ2lzdGVyIGVudW0gdHlwZV9jb2RlIGNvZGU7CisgIGludCBkZW1hbmdsZWRfYXJnczsKKworICBpZiAoc2hvdyA+IDApCisgICAgQ0hFQ0tfVFlQRURFRiAodHlwZSk7CisKKyAgY190eXBlX3ByaW50X2Jhc2UgKHR5cGUsIHN0cmVhbSwgc2hvdywgbGV2ZWwpOworICBjb2RlID0gVFlQRV9DT0RFICh0eXBlKTsKKyAgaWYgKCh2YXJzdHJpbmcgIT0gTlVMTCAmJiAqdmFyc3RyaW5nICE9ICdcMCcpCisgICAgICB8fAorICAgICAgLyogTmVlZCBhIHNwYWNlIGlmIGdvaW5nIHRvIHByaW50IHN0YXJzIG9yIGJyYWNrZXRzOworCSBidXQgbm90IGlmIHdlIHdpbGwgcHJpbnQganVzdCBhIHR5cGUgbmFtZS4gICovCisgICAgICAoKHNob3cgPiAwIHx8IFRZUEVfTkFNRSAodHlwZSkgPT0gMCkKKyAgICAgICAmJgorICAgICAgIChjb2RlID09IFRZUEVfQ09ERV9QVFIgfHwgY29kZSA9PSBUWVBFX0NPREVfRlVOQworCXx8IGNvZGUgPT0gVFlQRV9DT0RFX01FVEhPRAorCXx8IGNvZGUgPT0gVFlQRV9DT0RFX0FSUkFZCisJfHwgY29kZSA9PSBUWVBFX0NPREVfTUVNQkVSCisJfHwgY29kZSA9PSBUWVBFX0NPREVfUkVGKSkpCisgICAgZnB1dHNfZmlsdGVyZWQgKCIgIiwgc3RyZWFtKTsKKyAgY190eXBlX3ByaW50X3ZhcnNwZWNfcHJlZml4ICh0eXBlLCBzdHJlYW0sIHNob3csIDApOworCisgIGlmICh2YXJzdHJpbmcgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcHV0c19maWx0ZXJlZCAodmFyc3RyaW5nLCBzdHJlYW0pOworCisgICAgICAvKiBGb3IgZGVtYW5nbGVkIGZ1bmN0aW9uIG5hbWVzLCB3ZSBoYXZlIHRoZSBhcmdsaXN0IGFzIHBhcnQgb2YgdGhlIG5hbWUsCisJIHNvIGRvbid0IHByaW50IGFuIGFkZGl0aW9uYWwgcGFpciBvZiAoKSdzICovCisKKyAgICAgIGRlbWFuZ2xlZF9hcmdzID0gc3RyY2hyKHZhcnN0cmluZywgJygnKSAhPSBOVUxMOworICAgICAgY190eXBlX3ByaW50X3ZhcnNwZWNfc3VmZml4ICh0eXBlLCBzdHJlYW0sIHNob3csIDAsIGRlbWFuZ2xlZF9hcmdzKTsKKyAgICB9Cit9CisgIAorLyogSWYgVFlQRSBpcyBhIGRlcml2ZWQgdHlwZSwgdGhlbiBwcmludCBvdXQgZGVyaXZhdGlvbiBpbmZvcm1hdGlvbi4KKyAgIFByaW50IG9ubHkgdGhlIGFjdHVhbCBiYXNlIGNsYXNzZXMgb2YgdGhpcyB0eXBlLCBub3QgdGhlIGJhc2UgY2xhc3NlcworICAgb2YgdGhlIGJhc2UgY2xhc3Nlcy4gIEkuRS4gIGZvciB0aGUgZGVyaXZhdGlvbiBoaWVyYXJjaHk6CisKKwljbGFzcyBBIHsgaW50IGE7IH07CisJY2xhc3MgQiA6IHB1YmxpYyBBIHtpbnQgYjsgfTsKKwljbGFzcyBDIDogcHVibGljIEIge2ludCBjOyB9OworCisgICBQcmludCB0aGUgdHlwZSBvZiBjbGFzcyBDIGFzOgorCisgICAJY2xhc3MgQyA6IHB1YmxpYyBCIHsKKwkJaW50IGM7CisJfQorCisgICBOb3QgYXMgdGhlIGZvbGxvd2luZyAobGlrZSBnZGIgdXNlZCB0byksIHdoaWNoIGlzIG5vdCBsZWdhbCBDKysgc3ludGF4IGZvcgorICAgZGVyaXZlZCB0eXBlcyBhbmQgbWF5IGJlIGNvbmZ1c2VkIHdpdGggdGhlIG11bHRpcGxlIGluaGVyaXRhbmNlIGZvcm06CisKKwljbGFzcyBDIDogcHVibGljIEIgOiBwdWJsaWMgQSB7CisJCWludCBjOworCX0KKworICAgSW4gZ2VuZXJhbCwgZ2RiIHNob3VsZCB0cnkgdG8gcHJpbnQgdGhlIHR5cGVzIGFzIGNsb3NlbHkgYXMgcG9zc2libGUgdG8KKyAgIHRoZSBmb3JtIHRoYXQgdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSBjb2RlLiAKKyAgIE5vdGUgdGhhdCBpbiBjYXNlIG9mIHByb3RlY3RlZCBkZXJpdmF0aW9uIGdjYyB3aWxsIG5vdCBzYXkgJ3Byb3RlY3RlZCcgCisgICBidXQgJ3ByaXZhdGUnLiBUaGUgSFAncyBhQ0MgY29tcGlsZXIgZW1pdHMgc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIAorICAgZGVyaXZhdGlvbiB2aWEgcHJvdGVjdGVkIGluaGVyaXRhbmNlLCBzbyBnZGIgY2FuIHByaW50IGl0IG91dCAqLworCitzdGF0aWMgdm9pZAorY3BfdHlwZV9wcmludF9kZXJpdmF0aW9uX2luZm8gKHN0cmVhbSwgdHlwZSkKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIGNoYXIgKm5hbWU7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBUWVBFX05fQkFTRUNMQVNTRVMgKHR5cGUpOyBpKyspCisgICAgeworICAgICAgZnB1dHNfZmlsdGVyZWQgKGkgPT0gMCA/ICI6ICIgOiAiLCAiLCBzdHJlYW0pOworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJXMlcyAiLAorCQkJQkFTRVRZUEVfVklBX1BVQkxJQyAodHlwZSwgaSkgPyAicHVibGljIiAKKwkJCTogKFRZUEVfRklFTERfUFJPVEVDVEVEICh0eXBlLCBpKSA/ICJwcm90ZWN0ZWQiIDogInByaXZhdGUiKSwKKwkJCUJBU0VUWVBFX1ZJQV9WSVJUVUFMKHR5cGUsIGkpID8gIiB2aXJ0dWFsIiA6ICIiKTsKKyAgICAgIG5hbWUgPSB0eXBlX25hbWVfbm9fdGFnIChUWVBFX0JBU0VDTEFTUyAodHlwZSwgaSkpOworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJXMiLCBuYW1lID8gbmFtZSA6ICIobnVsbCkiKTsKKyAgICB9CisgIGlmIChpID4gMCkKKyAgICB7CisgICAgICBmcHV0c19maWx0ZXJlZCAoIiAiLCBzdHJlYW0pOworICAgIH0KK30KKy8qIFByaW50IHRoZSBDKysgbWV0aG9kIGFyZ3VtZW50cyBBUkdTIHRvIHRoZSBmaWxlIFNUUkVBTS4gICovCisgCit2b2lkCitjcF90eXBlX3ByaW50X21ldGhvZF9hcmdzIChhcmdzLCBwcmVmaXgsIHZhcnN0cmluZywgc3RhdGljcCwgc3RyZWFtKQorICAgICBzdHJ1Y3QgdHlwZSAqKmFyZ3M7CisgICAgIGNoYXIgKnByZWZpeDsKKyAgICAgY2hhciAqdmFyc3RyaW5nOworICAgICBpbnQgc3RhdGljcDsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgaW50IGk7CisgCisgIGZwcmludGZfc3ltYm9sX2ZpbHRlcmVkIChzdHJlYW0sIHByZWZpeCwgbGFuZ3VhZ2VfY3BsdXMsIERNR0xfQU5TSSk7CisgIGZwcmludGZfc3ltYm9sX2ZpbHRlcmVkIChzdHJlYW0sIHZhcnN0cmluZywgbGFuZ3VhZ2VfY3BsdXMsIERNR0xfQU5TSSk7CisgIGZwdXRzX2ZpbHRlcmVkICgiKCIsIHN0cmVhbSk7CisgIGlmIChhcmdzICYmIGFyZ3NbIXN0YXRpY3BdICYmIGFyZ3NbIXN0YXRpY3BdLT5jb2RlICE9IFRZUEVfQ09ERV9WT0lEKQorICAgIHsKKyAgICAgIGkgPSAhc3RhdGljcDsgICAgICAgICAgICAgLyogc2tpcCB0aGUgY2xhc3MgdmFyaWFibGUgKi8KKyAgICAgIHdoaWxlICgxKQorICAgICAgICB7CisgICAgICAgICAgdHlwZV9wcmludCAoYXJnc1tpKytdLCAiIiwgc3RyZWFtLCAwKTsKKyAgICAgICAgICBpZiAoIWFyZ3NbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiAuLi4iKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS0+Y29kZSAhPSBUWVBFX0NPREVfVk9JRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGJyZWFrOworICAgICAgICB9CisgICAgfQorICBlbHNlIGlmIChjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSA9PSBsYW5ndWFnZV9jcGx1cykKKyAgICB7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJ2b2lkIik7CisgICAgfQorIAorICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIpIik7Cit9CisKKworLyogUHJpbnQgYW55IGFzdGVyaXNrcyBvciBvcGVuLXBhcmVudGhlc2VzIG5lZWRlZCBiZWZvcmUgdGhlCisgICB2YXJpYWJsZSBuYW1lICh0byBkZXNjcmliZSBpdHMgdHlwZSkuCisKKyAgIE9uIG91dGVybW9zdCBjYWxsLCBwYXNzIDAgZm9yIFBBU1NFRF9BX1BUUi4KKyAgIE9uIG91dGVybW9zdCBjYWxsLCBTSE9XID4gMCBtZWFucyBzaG91bGQgaWdub3JlCisgICBhbnkgdHlwZW5hbWUgZm9yIFRZUEUgYW5kIHNob3cgaXRzIGRldGFpbHMuCisgICBTSE9XIGlzIGFsd2F5cyB6ZXJvIG9uIHJlY3Vyc2l2ZSBjYWxscy4gICovCisKK3ZvaWQKK2NfdHlwZV9wcmludF92YXJzcGVjX3ByZWZpeCAodHlwZSwgc3RyZWFtLCBzaG93LCBwYXNzZWRfYV9wdHIpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgc2hvdzsKKyAgICAgaW50IHBhc3NlZF9hX3B0cjsKK3sKKyAgY2hhciAqbmFtZTsKKyAgaWYgKHR5cGUgPT0gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKFRZUEVfTkFNRSAodHlwZSkgJiYgc2hvdyA8PSAwKQorICAgIHJldHVybjsKKworICBRVUlUOworCisgIHN3aXRjaCAoVFlQRV9DT0RFICh0eXBlKSkKKyAgICB7CisgICAgY2FzZSBUWVBFX0NPREVfUFRSOgorICAgICAgY190eXBlX3ByaW50X3ZhcnNwZWNfcHJlZml4IChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSwgc3RyZWFtLCAwLCAxKTsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIioiKTsKKyAgICAgIGNfdHlwZV9wcmludF9jdl9xdWFsaWZpZXIgKHR5cGUsIHN0cmVhbSwgMSwgMCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX01FTUJFUjoKKyAgICAgIGlmIChwYXNzZWRfYV9wdHIpCisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKCIpOworICAgICAgY190eXBlX3ByaW50X3ZhcnNwZWNfcHJlZml4IChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSwgc3RyZWFtLCAwLCAwKTsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiAiKTsKKyAgICAgIG5hbWUgPSB0eXBlX25hbWVfbm9fdGFnIChUWVBFX0RPTUFJTl9UWVBFICh0eXBlKSk7CisgICAgICBpZiAobmFtZSkKKwlmcHV0c19maWx0ZXJlZCAobmFtZSwgc3RyZWFtKTsKKyAgICAgIGVsc2UKKyAgICAgICAgY190eXBlX3ByaW50X2Jhc2UgKFRZUEVfRE9NQUlOX1RZUEUgKHR5cGUpLCBzdHJlYW0sIDAsIHBhc3NlZF9hX3B0cik7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICI6OiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9NRVRIT0Q6CisgICAgICBpZiAocGFzc2VkX2FfcHRyKQorCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIigiKTsKKyAgICAgIGNfdHlwZV9wcmludF92YXJzcGVjX3ByZWZpeCAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSksIHN0cmVhbSwgMCwgMCk7CisgICAgICBpZiAocGFzc2VkX2FfcHRyKQorCXsKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiAiKTsKKwkgIGNfdHlwZV9wcmludF9iYXNlIChUWVBFX0RPTUFJTl9UWVBFICh0eXBlKSwgc3RyZWFtLCAwLCBwYXNzZWRfYV9wdHIpOworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiOjoiKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX1JFRjoKKyAgICAgIGNfdHlwZV9wcmludF92YXJzcGVjX3ByZWZpeCAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSksIHN0cmVhbSwgMCwgMSk7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICImIik7CisgICAgICBjX3R5cGVfcHJpbnRfY3ZfcXVhbGlmaWVyICh0eXBlLCBzdHJlYW0sIDEsIDApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9GVU5DOgorICAgICAgY190eXBlX3ByaW50X3ZhcnNwZWNfcHJlZml4IChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSwgc3RyZWFtLCAwLCAwKTsKKyAgICAgIGlmIChwYXNzZWRfYV9wdHIpCisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKCIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9BUlJBWToKKyAgICAgIGNfdHlwZV9wcmludF92YXJzcGVjX3ByZWZpeCAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSksIHN0cmVhbSwgMCwgMCk7CisgICAgICBpZiAocGFzc2VkX2FfcHRyKQorCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIigiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfVU5ERUY6CisgICAgY2FzZSBUWVBFX0NPREVfU1RSVUNUOgorICAgIGNhc2UgVFlQRV9DT0RFX1VOSU9OOgorICAgIGNhc2UgVFlQRV9DT0RFX0VOVU06CisgICAgY2FzZSBUWVBFX0NPREVfSU5UOgorICAgIGNhc2UgVFlQRV9DT0RFX0ZMVDoKKyAgICBjYXNlIFRZUEVfQ09ERV9WT0lEOgorICAgIGNhc2UgVFlQRV9DT0RFX0VSUk9SOgorICAgIGNhc2UgVFlQRV9DT0RFX0NIQVI6CisgICAgY2FzZSBUWVBFX0NPREVfQk9PTDoKKyAgICBjYXNlIFRZUEVfQ09ERV9TRVQ6CisgICAgY2FzZSBUWVBFX0NPREVfUkFOR0U6CisgICAgY2FzZSBUWVBFX0NPREVfU1RSSU5HOgorICAgIGNhc2UgVFlQRV9DT0RFX0JJVFNUUklORzoKKyAgICBjYXNlIFRZUEVfQ09ERV9DT01QTEVYOgorICAgIGNhc2UgVFlQRV9DT0RFX1RZUEVERUY6CisgICAgICAvKiBUaGVzZSB0eXBlcyBuZWVkIG5vIHByZWZpeC4gIFRoZXkgYXJlIGxpc3RlZCBoZXJlIHNvIHRoYXQKKwkgZ2NjIC1XYWxsIHdpbGwgcmV2ZWFsIGFueSB0eXBlcyB0aGF0IGhhdmVuJ3QgYmVlbiBoYW5kbGVkLiAgKi8KKyAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogUHJpbnQgb3V0ICJjb25zdCIgYW5kICJ2b2xhdGlsZSIgYXR0cmlidXRlcy4KKyAgIFRZUEUgaXMgYSBwb2ludGVyIHRvIHRoZSB0eXBlIGJlaW5nIHByaW50ZWQgb3V0LgorICAgU1RSRUFNIGlzIHRoZSBvdXRwdXQgZGVzdGluYXRpb24uCisgICBORUVEX1NQQUNFID0gMSBpbmRpY2F0ZXMgYW4gaW5pdGlhbCB3aGl0ZSBzcGFjZSBpcyBuZWVkZWQgKi8KKworc3RhdGljIHZvaWQKK2NfdHlwZV9wcmludF9jdl9xdWFsaWZpZXIgKHR5cGUsIHN0cmVhbSwgbmVlZF9wcmVfc3BhY2UsIG5lZWRfcG9zdF9zcGFjZSkKKyAgc3RydWN0IHR5cGUgKnR5cGU7CisgIEdEQl9GSUxFICpzdHJlYW07CisgIGludCBuZWVkX3ByZV9zcGFjZTsKKyAgaW50IG5lZWRfcG9zdF9zcGFjZTsKK3sKKyAgaW50IGZsYWcgPSAwOworICAKKyAgaWYgKFRZUEVfQ09OU1QgKHR5cGUpKQorICAgIHsKKyAgICAgIGlmIChuZWVkX3ByZV9zcGFjZSkKKyAgICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiICIpOworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiY29uc3QiKTsKKyAgICAgIGZsYWcgPSAxOworICAgIH0KKyAgCisgIGlmIChUWVBFX1ZPTEFUSUxFICh0eXBlKSkKKyAgICB7CisgICAgICBpZiAoZmxhZyB8fCBuZWVkX3ByZV9zcGFjZSkKKyAgICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiICIpOworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAidm9sYXRpbGUiKTsKKyAgICAgIGZsYWcgPSAxOworICAgIH0KKworICBpZiAoZmxhZyAmJiBuZWVkX3Bvc3Rfc3BhY2UpCisgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiICIpOworfQorCisKKworCitzdGF0aWMgdm9pZAorY190eXBlX3ByaW50X2FyZ3MgKHR5cGUsIHN0cmVhbSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIEdEQl9GSUxFICpzdHJlYW07Cit7CisgIGludCBpOworICBzdHJ1Y3QgdHlwZSAqKmFyZ3M7CisKKyAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKCIpOworICBhcmdzID0gVFlQRV9BUkdfVFlQRVMgKHR5cGUpOworICBpZiAoYXJncyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChhcmdzWzFdID09IE5VTEwpCisJeworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiLi4uIik7CisJfQorICAgICAgZWxzZSBpZiAoKGFyZ3NbMV0tPmNvZGUgPT0gVFlQRV9DT0RFX1ZPSUQpICYmCisgICAgICAgICAgICAgICAoY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfY3BsdXMpKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAidm9pZCIpOworICAgICAgICB9CisgICAgICBlbHNlCisJeworCSAgZm9yIChpID0gMTsKKwkgICAgICAgYXJnc1tpXSAhPSBOVUxMICYmIGFyZ3NbaV0tPmNvZGUgIT0gVFlQRV9DT0RFX1ZPSUQ7CisJICAgICAgIGkrKykKKwkgICAgeworCSAgICAgIGNfcHJpbnRfdHlwZSAoYXJnc1tpXSwgIiIsIHN0cmVhbSwgLTEsIDApOworCSAgICAgIGlmIChhcmdzW2krMV0gPT0gTlVMTCkKKwkJeworCQkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIi4uLiIpOworCQl9CisJICAgICAgZWxzZSBpZiAoYXJnc1tpKzFdLT5jb2RlICE9IFRZUEVfQ09ERV9WT0lEKQorCQl7CisJCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiLCIpOworCQkgIHdyYXBfaGVyZSAoIiAgICAiKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgZWxzZSBpZiAoY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfY3BsdXMpCisgICAgeworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAidm9pZCIpOworICAgIH0KKyAgCisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIikiKTsKK30KKworLyogUHJpbnQgYW55IGFycmF5IHNpemVzLCBmdW5jdGlvbiBhcmd1bWVudHMgb3IgY2xvc2UgcGFyZW50aGVzZXMKKyAgIG5lZWRlZCBhZnRlciB0aGUgdmFyaWFibGUgbmFtZSAodG8gZGVzY3JpYmUgaXRzIHR5cGUpLgorICAgQXJncyB3b3JrIGxpa2UgY190eXBlX3ByaW50X3ZhcnNwZWNfcHJlZml4LiAgKi8KKwordm9pZAorY190eXBlX3ByaW50X3ZhcnNwZWNfc3VmZml4ICh0eXBlLCBzdHJlYW0sIHNob3csIHBhc3NlZF9hX3B0ciwgZGVtYW5nbGVkX2FyZ3MpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgc2hvdzsKKyAgICAgaW50IHBhc3NlZF9hX3B0cjsKKyAgICAgaW50IGRlbWFuZ2xlZF9hcmdzOworeworICBpZiAodHlwZSA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAoVFlQRV9OQU1FICh0eXBlKSAmJiBzaG93IDw9IDApCisgICAgcmV0dXJuOworCisgIFFVSVQ7CisKKyAgc3dpdGNoIChUWVBFX0NPREUgKHR5cGUpKQorICAgIHsKKyAgICBjYXNlIFRZUEVfQ09ERV9BUlJBWToKKyAgICAgIGlmIChwYXNzZWRfYV9wdHIpCisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKSIpOworICAgICAgCisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJbIik7CisgICAgICBpZiAoVFlQRV9MRU5HVEggKHR5cGUpID49IDAgJiYgVFlQRV9MRU5HVEggKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKSA+IDAKKwkgICYmIFRZUEVfQVJSQVlfVVBQRVJfQk9VTkRfVFlQRSh0eXBlKSAhPSBCT1VORF9DQU5OT1RfQkVfREVURVJNSU5FRCkKKwlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlZCIsCisJCQkgIChUWVBFX0xFTkdUSCAodHlwZSkKKwkJCSAgIC8gVFlQRV9MRU5HVEggKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKSkpOworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiXSIpOworICAgICAgCisgICAgICBjX3R5cGVfcHJpbnRfdmFyc3BlY19zdWZmaXggKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpLCBzdHJlYW0sIDAsIDAsIDApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9NRU1CRVI6CisgICAgICBpZiAocGFzc2VkX2FfcHRyKQorCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIikiKTsKKyAgICAgIGNfdHlwZV9wcmludF92YXJzcGVjX3N1ZmZpeCAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSksIHN0cmVhbSwgMCwgMCwgMCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX01FVEhPRDoKKyAgICAgIGlmIChwYXNzZWRfYV9wdHIpCisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKSIpOworICAgICAgY190eXBlX3ByaW50X3ZhcnNwZWNfc3VmZml4IChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSwgc3RyZWFtLCAwLCAwLCAwKTsKKyAgICAgIGlmIChwYXNzZWRfYV9wdHIpCisJeworCSAgY190eXBlX3ByaW50X2FyZ3MgKHR5cGUsIHN0cmVhbSk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9QVFI6CisgICAgY2FzZSBUWVBFX0NPREVfUkVGOgorICAgICAgY190eXBlX3ByaW50X3ZhcnNwZWNfc3VmZml4IChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSwgc3RyZWFtLCAwLCAxLCAwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfRlVOQzoKKyAgICAgIGlmIChwYXNzZWRfYV9wdHIpCisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKSIpOworICAgICAgaWYgKCFkZW1hbmdsZWRfYXJncykKKwl7IGludCBpLCBsZW4gPSBUWVBFX05GSUVMRFMgKHR5cGUpOworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKCIpOworICAgICAgICAgIGlmICgobGVuID09IDApICYmIChjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSA9PSBsYW5ndWFnZV9jcGx1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInZvaWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZwdXRzX2ZpbHRlcmVkICgiLCAiLCBzdHJlYW0pOworICAgICAgICAgICAgICAgICAgICB3cmFwX2hlcmUgKCIgICAgIik7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY19wcmludF90eXBlIChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpLCAiIiwgc3RyZWFtLCAtMSwgMCk7CisgICAgICAgICAgICAgIH0KKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIikiKTsKKwl9CisgICAgICBjX3R5cGVfcHJpbnRfdmFyc3BlY19zdWZmaXggKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpLCBzdHJlYW0sIDAsCisJCQkJICAgcGFzc2VkX2FfcHRyLCAwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfVU5ERUY6CisgICAgY2FzZSBUWVBFX0NPREVfU1RSVUNUOgorICAgIGNhc2UgVFlQRV9DT0RFX1VOSU9OOgorICAgIGNhc2UgVFlQRV9DT0RFX0VOVU06CisgICAgY2FzZSBUWVBFX0NPREVfSU5UOgorICAgIGNhc2UgVFlQRV9DT0RFX0ZMVDoKKyAgICBjYXNlIFRZUEVfQ09ERV9WT0lEOgorICAgIGNhc2UgVFlQRV9DT0RFX0VSUk9SOgorICAgIGNhc2UgVFlQRV9DT0RFX0NIQVI6CisgICAgY2FzZSBUWVBFX0NPREVfQk9PTDoKKyAgICBjYXNlIFRZUEVfQ09ERV9TRVQ6CisgICAgY2FzZSBUWVBFX0NPREVfUkFOR0U6CisgICAgY2FzZSBUWVBFX0NPREVfU1RSSU5HOgorICAgIGNhc2UgVFlQRV9DT0RFX0JJVFNUUklORzoKKyAgICBjYXNlIFRZUEVfQ09ERV9DT01QTEVYOgorICAgIGNhc2UgVFlQRV9DT0RFX1RZUEVERUY6CisgICAgICAvKiBUaGVzZSB0eXBlcyBkbyBub3QgbmVlZCBhIHN1ZmZpeC4gIFRoZXkgYXJlIGxpc3RlZCBzbyB0aGF0CisJIGdjYyAtV2FsbCB3aWxsIHJlcG9ydCB0eXBlcyB0aGF0IG1heSBub3QgaGF2ZSBiZWVuIGNvbnNpZGVyZWQuICAqLworICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBQcmludCB0aGUgbmFtZSBvZiB0aGUgdHlwZSAob3IgdGhlIHVsdGltYXRlIHBvaW50ZXIgdGFyZ2V0LAorICAgZnVuY3Rpb24gdmFsdWUgb3IgYXJyYXkgZWxlbWVudCksIG9yIHRoZSBkZXNjcmlwdGlvbiBvZiBhCisgICBzdHJ1Y3R1cmUgb3IgdW5pb24uCisKKyAgIFNIT1cgcG9zaXRpdmUgbWVhbnMgcHJpbnQgZGV0YWlscyBhYm91dCB0aGUgdHlwZSAoZS5nLiBlbnVtIHZhbHVlcyksCisgICBhbmQgcHJpbnQgc3RydWN0dXJlIGVsZW1lbnRzIHBhc3NpbmcgU0hPVyAtIDEgZm9yIHNob3cuCisgICBTSE9XIG5lZ2F0aXZlIG1lYW5zIGp1c3QgcHJpbnQgdGhlIHR5cGUgbmFtZSBvciBzdHJ1Y3QgdGFnIGlmIHRoZXJlIGlzIG9uZS4KKyAgIElmIHRoZXJlIGlzIG5vIG5hbWUsIHByaW50IHNvbWV0aGluZyBzZW5zaWJsZSBidXQgY29uY2lzZSBsaWtlCisgICAic3RydWN0IHsuLi59Ii4KKyAgIFNIT1cgemVybyBtZWFucyBqdXN0IHByaW50IHRoZSB0eXBlIG5hbWUgb3Igc3RydWN0IHRhZyBpZiB0aGVyZSBpcyBvbmUuCisgICBJZiB0aGVyZSBpcyBubyBuYW1lLCBwcmludCBzb21ldGhpbmcgc2Vuc2libGUgYnV0IG5vdCBhcyBjb25jaXNlIGxpa2UKKyAgICJzdHJ1Y3Qge2ludCB4OyBpbnQgeTt9Ii4KKworICAgTEVWRUwgaXMgdGhlIG51bWJlciBvZiBzcGFjZXMgdG8gaW5kZW50IGJ5LgorICAgV2UgaW5jcmVhc2UgaXQgZm9yIHNvbWUgcmVjdXJzaXZlIGNhbGxzLiAgKi8KKwordm9pZAorY190eXBlX3ByaW50X2Jhc2UgKHR5cGUsIHN0cmVhbSwgc2hvdywgbGV2ZWwpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgc2hvdzsKKyAgICAgaW50IGxldmVsOworeworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgaW50IGxlbjsKKyAgcmVnaXN0ZXIgaW50IGxhc3R2YWw7CisgIGNoYXIgKm1hbmdsZWRfbmFtZTsKKyAgY2hhciAqZGVtYW5nbGVkX25hbWU7CisgIGNoYXIgKmRlbWFuZ2xlZF9ub19zdGF0aWM7CisgIGVudW0ge3Nfbm9uZSwgc19wdWJsaWMsIHNfcHJpdmF0ZSwgc19wcm90ZWN0ZWR9IHNlY3Rpb25fdHlwZTsKKyAgaW50IG5lZWRfYWNjZXNzX2xhYmVsID0gMDsKKyAgaW50IGosIGxlbjI7CisKKyAgUVVJVDsKKworICB3cmFwX2hlcmUgKCIgICAgIik7CisgIGlmICh0eXBlID09IE5VTEwpCisgICAgeworICAgICAgZnB1dHNfZmlsdGVyZWQgKCI8dHlwZSB1bmtub3duPiIsIHN0cmVhbSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFdoZW4gU0hPVyBpcyB6ZXJvIG9yIGxlc3MsIGFuZCB0aGVyZSBpcyBhIHZhbGlkIHR5cGUgbmFtZSwgdGhlbiBhbHdheXMKKyAgICAganVzdCBwcmludCB0aGUgdHlwZSBuYW1lIGRpcmVjdGx5IGZyb20gdGhlIHR5cGUuICAqLworICAvKiBJZiB3ZSBoYXZlICJ0eXBlZGVmIHN0cnVjdCBmb28gey4gLiAufSBiYXI7IiBkbyB3ZSB3YW50IHRvIHByaW50IGl0CisgICAgIGFzICJzdHJ1Y3QgZm9vIiBvciBhcyAiYmFyIj8gIFBpY2sgdGhlIGxhdHRlciwgYmVjYXVzZSBDKysgZm9sayB0ZW5kCisgICAgIHRvIGV4cGVjdCB0aGluZ3MgbGlrZSAiY2xhc3M1ICpmb28iIHJhdGhlciB0aGFuICJzdHJ1Y3QgY2xhc3M1ICpmb28iLiAgKi8KKworICBpZiAoc2hvdyA8PSAwCisgICAgICAmJiBUWVBFX05BTUUgKHR5cGUpICE9IE5VTEwpCisgICAgeworICAgICAgY190eXBlX3ByaW50X2N2X3F1YWxpZmllciAodHlwZSwgc3RyZWFtLCAwLCAxKTsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkIChUWVBFX05BTUUgKHR5cGUpLCBzdHJlYW0pOworICAgICAgcmV0dXJuOworICAgIH0KKworICBDSEVDS19UWVBFREVGICh0eXBlKTsKKwkgIAorICBzd2l0Y2ggKFRZUEVfQ09ERSAodHlwZSkpCisgICAgeworICAgIGNhc2UgVFlQRV9DT0RFX1RZUEVERUY6CisgICAgY2FzZSBUWVBFX0NPREVfQVJSQVk6CisgICAgY2FzZSBUWVBFX0NPREVfUFRSOgorICAgIGNhc2UgVFlQRV9DT0RFX01FTUJFUjoKKyAgICBjYXNlIFRZUEVfQ09ERV9SRUY6CisgICAgY2FzZSBUWVBFX0NPREVfRlVOQzoKKyAgICBjYXNlIFRZUEVfQ09ERV9NRVRIT0Q6CisgICAgICBjX3R5cGVfcHJpbnRfYmFzZSAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSksIHN0cmVhbSwgc2hvdywgbGV2ZWwpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9TVFJVQ1Q6CisgICAgICBjX3R5cGVfcHJpbnRfY3ZfcXVhbGlmaWVyICh0eXBlLCBzdHJlYW0sIDAsIDEpOworICAgICAgLyogTm90ZSBUWVBFX0NPREVfU1RSVUNUIGFuZCBUWVBFX0NPREVfQ0xBU1MgaGF2ZSB0aGUgc2FtZSB2YWx1ZSwKKyAgICAgICAqIHNvIHdlIHVzZSBhbm90aGVyIG1lYW5zIGZvciBkaXN0aW5ndWlzaGluZyB0aGVtLgorICAgICAgICovCisgICAgICBpZiAoSEFWRV9DUExVU19TVFJVQ1QgKHR5cGUpKSB7CisgICAgICAgIHN3aXRjaCAoVFlQRV9ERUNMQVJFRF9UWVBFKHR5cGUpKSB7CisgICAgICAgICAgY2FzZSBERUNMQVJFRF9UWVBFX0NMQVNTOgorCSAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJjbGFzcyAiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgREVDTEFSRURfVFlQRV9VTklPTjoKKyAgICAgICAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInVuaW9uICIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBERUNMQVJFRF9UWVBFX1NUUlVDVDoKKyAgICAgICAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInN0cnVjdCAiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBJZiB0aGVyZSBpcyBhIENQTFVTX1NUUlVDVCwgYXNzdW1lIGNsYXNzIGlmIG5vdAorICAgICAgICAgICAgICogb3RoZXJ3aXNlIHNwZWNpZmllZCBpbiB0aGUgZGVjbGFyZWRfdHlwZSBmaWVsZC4KKyAgICAgICAgICAgICAqLworCSAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJjbGFzcyAiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IC8qIHN3aXRjaCAqLworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSWYgbm90IENQTFVTX1NUUlVDVCwgdGhlbiBhc3N1bWUgaXQncyBhIEMgc3RydWN0ICovIAorICAgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJzdHJ1Y3QgIik7CisgICAgICB9CisgICAgICBnb3RvIHN0cnVjdF91bmlvbjsKKworICAgIGNhc2UgVFlQRV9DT0RFX1VOSU9OOgorICAgICAgY190eXBlX3ByaW50X2N2X3F1YWxpZmllciAodHlwZSwgc3RyZWFtLCAwLCAxKTsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInVuaW9uICIpOworCisgICAgc3RydWN0X3VuaW9uOgorCisgICAgICAvKiBQcmludCB0aGUgdGFnIGlmIGl0IGV4aXN0cy4gCisgICAgICAgKiBUaGUgSFAgYUNDIGNvbXBpbGVyIGVtaXRzCisgICAgICAgKiBhIHNwdXJpb3VzICJ7dW5uYW1lZCBzdHJ1Y3R9Ii8ie3VubmFtZWQgdW5pb259Ii8ie3VubmFtZWQgZW51bX0iCisgICAgICAgKiB0YWcgIGZvciB1bm5hbWVkIHN0cnVjdC91bmlvbi9lbnVtJ3MsIHdoaWNoIHdlIGRvbid0CisgICAgICAgKiB3YW50IHRvIHByaW50LgorICAgICAgICovCisgICAgICBpZiAoVFlQRV9UQUdfTkFNRSAodHlwZSkgIT0gTlVMTCAmJgorICAgICAgICAgIHN0cm5jbXAoVFlQRV9UQUdfTkFNRSh0eXBlKSwgInt1bm5hbWVkIiwgOCkpCisJeworCSAgZnB1dHNfZmlsdGVyZWQgKFRZUEVfVEFHX05BTUUgKHR5cGUpLCBzdHJlYW0pOworCSAgaWYgKHNob3cgPiAwKQorCSAgICBmcHV0c19maWx0ZXJlZCAoIiAiLCBzdHJlYW0pOworCX0KKyAgICAgIHdyYXBfaGVyZSAoIiAgICAiKTsKKyAgICAgIGlmIChzaG93IDwgMCkKKwl7CisJICAvKiBJZiB3ZSBqdXN0IHByaW50ZWQgYSB0YWcgbmFtZSwgbm8gbmVlZCB0byBwcmludCBhbnl0aGluZyBlbHNlLiAgKi8KKwkgIGlmIChUWVBFX1RBR19OQU1FICh0eXBlKSA9PSBOVUxMKQorCSAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJ7Li4ufSIpOworCX0KKyAgICAgIGVsc2UgaWYgKHNob3cgPiAwIHx8IFRZUEVfVEFHX05BTUUgKHR5cGUpID09IE5VTEwpCisJeworCSAgY3BfdHlwZV9wcmludF9kZXJpdmF0aW9uX2luZm8gKHN0cmVhbSwgdHlwZSk7CisJICAKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIntcbiIpOworCSAgaWYgKChUWVBFX05GSUVMRFMgKHR5cGUpID09IDApICYmIChUWVBFX05GTl9GSUVMRFMgKHR5cGUpID09IDApKQorCSAgICB7CisJICAgICAgaWYgKFRZUEVfRkxBR1MgKHR5cGUpICYgVFlQRV9GTEFHX1NUVUIpCisJCWZwcmludGZpX2ZpbHRlcmVkIChsZXZlbCArIDQsIHN0cmVhbSwgIjxpbmNvbXBsZXRlIHR5cGU+XG4iKTsKKwkgICAgICBlbHNlCisJCWZwcmludGZpX2ZpbHRlcmVkIChsZXZlbCArIDQsIHN0cmVhbSwgIjxubyBkYXRhIGZpZWxkcz5cbiIpOworCSAgICB9CisKKwkgIC8qIFN0YXJ0IG9mZiB3aXRoIG5vIHNwZWNpZmljIHNlY3Rpb24gdHlwZSwgc28gd2UgY2FuIHByaW50CisJICAgICBvbmUgZm9yIHRoZSBmaXJzdCBmaWVsZCB3ZSBmaW5kLCBhbmQgdXNlIHRoYXQgc2VjdGlvbiB0eXBlCisJICAgICB0aGVyZWFmdGVyIHVudGlsIHdlIGZpbmQgYW5vdGhlciB0eXBlLiAqLworCisJICBzZWN0aW9uX3R5cGUgPSBzX25vbmU7CisKKyAgICAgICAgICAvKiBGb3IgYSBjbGFzcywgaWYgYWxsIG1lbWJlcnMgYXJlIHByaXZhdGUsIHRoZXJlJ3Mgbm8gbmVlZAorICAgICAgICAgICAgIGZvciBhICJwcml2YXRlOiIgbGFiZWw7IHNpbWlsYXJseSwgZm9yIGEgc3RydWN0IG9yIHVuaW9uCisgICAgICAgICAgICAgbWFzcXVlcmFkaW5nIGFzIGEgY2xhc3MsIGlmIGFsbCBtZW1iZXJzIGFyZSBwdWJsaWMsIHRoZXJlJ3MKKyAgICAgICAgICAgICBubyBuZWVkIGZvciBhICJwdWJsaWM6IiBsYWJlbC4gKi8gCisKKyAgICAgICAgICBpZiAoKFRZUEVfREVDTEFSRURfVFlQRSAodHlwZSkgPT0gREVDTEFSRURfVFlQRV9DTEFTUykgfHwKKyAgICAgICAgICAgICAgIChUWVBFX0RFQ0xBUkVEX1RZUEUgKHR5cGUpID09IERFQ0xBUkVEX1RZUEVfVEVNUExBVEUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBRVUlUOworICAgICAgICAgICAgICBsZW4gPSBUWVBFX05GSUVMRFMgKHR5cGUpOworICAgICAgICAgICAgICBmb3IgKGkgPSBUWVBFX05fQkFTRUNMQVNTRVMgKHR5cGUpOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKCFUWVBFX0ZJRUxEX1BSSVZBVEUgKHR5cGUsIGkpKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZWVkX2FjY2Vzc19sYWJlbCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBRVUlUOworICAgICAgICAgICAgICBpZiAoIW5lZWRfYWNjZXNzX2xhYmVsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGxlbjIgPSBUWVBFX05GTl9GSUVMRFMgKHR5cGUpOworICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjI7IGorKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IFRZUEVfRk5fRklFTERMSVNUX0xFTkdUSCAodHlwZSwgaik7CisgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFUWVBFX0ZOX0ZJRUxEX1BSSVZBVEUgKFRZUEVfRk5fRklFTERMSVNUMSAodHlwZSwgaiksIGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF9hY2Nlc3NfbGFiZWwgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRfYWNjZXNzX2xhYmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoKFRZUEVfREVDTEFSRURfVFlQRSAodHlwZSkgPT0gREVDTEFSRURfVFlQRV9TVFJVQ1QpIHx8CisgICAgICAgICAgICAgICAgICAgKFRZUEVfREVDTEFSRURfVFlQRSAodHlwZSkgPT0gREVDTEFSRURfVFlQRV9VTklPTikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFFVSVQ7CisgICAgICAgICAgICAgIGxlbiA9IFRZUEVfTkZJRUxEUyAodHlwZSk7CisgICAgICAgICAgICAgIGZvciAoaSA9IFRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSk7IGkgPCBsZW47IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoVFlQRV9GSUVMRF9QUklWQVRFICh0eXBlLCBpKSB8fCBUWVBFX0ZJRUxEX1BST1RFQ1RFRCAodHlwZSwgaSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5lZWRfYWNjZXNzX2xhYmVsID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIFFVSVQ7CisgICAgICAgICAgICAgIGlmICghbmVlZF9hY2Nlc3NfbGFiZWwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbGVuMiA9IFRZUEVfTkZOX0ZJRUxEUyAodHlwZSk7CisgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuMjsgaisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgUVVJVDsKKyAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBUWVBFX0ZOX0ZJRUxETElTVF9MRU5HVEggKHR5cGUsIGopOworICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUWVBFX0ZOX0ZJRUxEX1BSSVZBVEUgKFRZUEVfRk5fRklFTERMSVNUMSAodHlwZSwgaiksIGkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9GTl9GSUVMRF9QUk9URUNURUQgKFRZUEVfRk5fRklFTERMSVNUMSAodHlwZSwgaiksIGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF9hY2Nlc3NfbGFiZWwgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRfYWNjZXNzX2xhYmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKwkgIC8qIElmIHRoZXJlIGlzIGEgYmFzZSBjbGFzcyBmb3IgdGhpcyB0eXBlLAorCSAgICAgZG8gbm90IHByaW50IHRoZSBmaWVsZCB0aGF0IGl0IG9jY3VwaWVzLiAgKi8KKworCSAgbGVuID0gVFlQRV9ORklFTERTICh0eXBlKTsKKwkgIGZvciAoaSA9IFRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSk7IGkgPCBsZW47IGkrKykKKwkgICAgeworCSAgICAgIFFVSVQ7CisJICAgICAgLyogRG9uJ3QgcHJpbnQgb3V0IHZpcnR1YWwgZnVuY3Rpb24gdGFibGUuICAqLworICAgICAgICAgICAgICAvKiBIUCBBTlNJIEMrKyBjYXNlICovCisgICAgICAgICAgICAgIGlmIChUWVBFX0hBU19WVEFCTEUodHlwZSkgJiYgKFNUUkVRTiAoVFlQRV9GSUVMRF9OQU1FICh0eXBlLCBpKSwgIl9fdmZwIiwgNSkpKQorICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgLyogT3RoZXIgY29tcGlsZXJzICovCisgICAgICAgICAgICAgIC8qIHBhaTo6IEZJWE1FIDogY2hlY2sgZm9yIGhhc192dGFibGUgPCAwICovCisJICAgICAgaWYgKFNUUkVRTiAoVFlQRV9GSUVMRF9OQU1FICh0eXBlLCBpKSwgIl92cHRyIiwgNSkKKwkJICAmJiBpc19jcGx1c19tYXJrZXIgKChUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIGkpKVs1XSkpCisJCWNvbnRpbnVlOworCisJICAgICAgLyogSWYgdGhpcyBpcyBhIEMrKyBjbGFzcyB3ZSBjYW4gcHJpbnQgdGhlIHZhcmlvdXMgQysrIHNlY3Rpb24KKwkJIGxhYmVscy4gKi8KKworCSAgICAgIGlmIChIQVZFX0NQTFVTX1NUUlVDVCAodHlwZSkgJiYgbmVlZF9hY2Nlc3NfbGFiZWwpCisJCXsKKwkJICBpZiAoVFlQRV9GSUVMRF9QUk9URUNURUQgKHR5cGUsIGkpKQorCQkgICAgeworCQkgICAgICBpZiAoc2VjdGlvbl90eXBlICE9IHNfcHJvdGVjdGVkKQorCQkJeworCQkJICBzZWN0aW9uX3R5cGUgPSBzX3Byb3RlY3RlZDsKKwkJCSAgZnByaW50ZmlfZmlsdGVyZWQgKGxldmVsICsgMiwgc3RyZWFtLAorCQkJCQkgICAgICJwcm90ZWN0ZWQ6XG4iKTsKKwkJCX0KKwkJICAgIH0KKwkJICBlbHNlIGlmIChUWVBFX0ZJRUxEX1BSSVZBVEUgKHR5cGUsIGkpKQorCQkgICAgeworCQkgICAgICBpZiAoc2VjdGlvbl90eXBlICE9IHNfcHJpdmF0ZSkKKwkJCXsKKwkJCSAgc2VjdGlvbl90eXBlID0gc19wcml2YXRlOworCQkJICBmcHJpbnRmaV9maWx0ZXJlZCAobGV2ZWwgKyAyLCBzdHJlYW0sICJwcml2YXRlOlxuIik7CisJCQl9CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBpZiAoc2VjdGlvbl90eXBlICE9IHNfcHVibGljKQorCQkJeworCQkJICBzZWN0aW9uX3R5cGUgPSBzX3B1YmxpYzsKKwkJCSAgZnByaW50ZmlfZmlsdGVyZWQgKGxldmVsICsgMiwgc3RyZWFtLCAicHVibGljOlxuIik7CisJCQl9CisJCSAgICB9CisJCX0KKworCSAgICAgIHByaW50X3NwYWNlc19maWx0ZXJlZCAobGV2ZWwgKyA0LCBzdHJlYW0pOworCSAgICAgIGlmIChUWVBFX0ZJRUxEX1NUQVRJQyAodHlwZSwgaSkpCisJCXsKKwkJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJzdGF0aWMgIik7CisJCX0KKwkgICAgICBjX3ByaW50X3R5cGUgKFRZUEVfRklFTERfVFlQRSAodHlwZSwgaSksCisJCQkgICAgVFlQRV9GSUVMRF9OQU1FICh0eXBlLCBpKSwKKwkJCSAgICBzdHJlYW0sIHNob3cgLSAxLCBsZXZlbCArIDQpOworCSAgICAgIGlmICghVFlQRV9GSUVMRF9TVEFUSUMgKHR5cGUsIGkpCisJCSAgJiYgVFlQRV9GSUVMRF9QQUNLRUQgKHR5cGUsIGkpKQorCQl7CisJCSAgLyogSXQgaXMgYSBiaXRmaWVsZC4gIFRoaXMgY29kZSBkb2VzIG5vdCBhdHRlbXB0CisJCSAgICAgdG8gbG9vayBhdCB0aGUgYml0cG9zIGFuZCByZWNvbnN0cnVjdCBmaWxsZXIsCisJCSAgICAgdW5uYW1lZCBmaWVsZHMuICBUaGlzIHdvdWxkIGxlYWQgdG8gbWlzbGVhZGluZworCQkgICAgIHJlc3VsdHMgaWYgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHB1dCBvdXQgZmllbGRzCisJCSAgICAgZm9yIHN1Y2ggdGhpbmdzIChJIGRvbid0IGtub3cgd2hhdCBpdCBkb2VzKS4gICovCisJCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiIDogJWQiLAorCQkJCSAgICBUWVBFX0ZJRUxEX0JJVFNJWkUgKHR5cGUsIGkpKTsKKwkJfQorCSAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjtcbiIpOworCSAgICB9CisKKwkgIC8qIElmIHRoZXJlIGFyZSBib3RoIGZpZWxkcyBhbmQgbWV0aG9kcywgcHV0IGEgc3BhY2UgYmV0d2Vlbi4gKi8KKwkgIGxlbiA9IFRZUEVfTkZOX0ZJRUxEUyAodHlwZSk7CisJICBpZiAobGVuICYmIHNlY3Rpb25fdHlwZSAhPSBzX25vbmUpCisJICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJcbiIpOworCisJICAvKiBDKys6IHByaW50IG91dCB0aGUgbWV0aG9kcyAqLworCSAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCSAgICB7CisJICAgICAgc3RydWN0IGZuX2ZpZWxkICpmID0gVFlQRV9GTl9GSUVMRExJU1QxICh0eXBlLCBpKTsKKwkgICAgICBpbnQgaiwgbGVuMiA9IFRZUEVfRk5fRklFTERMSVNUX0xFTkdUSCAodHlwZSwgaSk7CisJICAgICAgY2hhciAqbWV0aG9kX25hbWUgPSBUWVBFX0ZOX0ZJRUxETElTVF9OQU1FICh0eXBlLCBpKTsKKwkgICAgICBjaGFyICpuYW1lID0gdHlwZV9uYW1lX25vX3RhZyAodHlwZSk7CisJICAgICAgaW50IGlzX2NvbnN0cnVjdG9yID0gbmFtZSAmJiBTVFJFUShtZXRob2RfbmFtZSwgbmFtZSk7CisJICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjI7IGorKykKKwkJeworCQkgIGNoYXIgKnBoeXNuYW1lID0gVFlQRV9GTl9GSUVMRF9QSFlTTkFNRSAoZiwgaik7CisJCSAgaW50IGlzX2Z1bGxfcGh5c25hbWVfY29uc3RydWN0b3IgPSAKKwkJICAgICgocGh5c25hbWVbMF0gPT0gJ18nICYmIHBoeXNuYW1lWzFdID09ICdfJworCQkgICAgICAmJiBzdHJjaHIgKCIwMTIzNDU2Nzg5UXQiLCBwaHlzbmFtZVsyXSkpCisJCSAgICAgfHwgU1RSRVFOIChwaHlzbmFtZSwgIl9fY3RfXyIsIDYpCisJCSAgICAgfHwgREVTVFJVQ1RPUl9QUkVGSVhfUCAocGh5c25hbWUpCisJCSAgICAgfHwgU1RSRVFOIChwaHlzbmFtZSwgIl9fZHRfXyIsIDYpKTsKKworCQkgIFFVSVQ7CisJCSAgaWYgKFRZUEVfRk5fRklFTERfUFJPVEVDVEVEIChmLCBqKSkKKwkJICAgIHsKKwkJICAgICAgaWYgKHNlY3Rpb25fdHlwZSAhPSBzX3Byb3RlY3RlZCkKKwkJCXsKKwkJCSAgc2VjdGlvbl90eXBlID0gc19wcm90ZWN0ZWQ7CisJCQkgIGZwcmludGZpX2ZpbHRlcmVkIChsZXZlbCArIDIsIHN0cmVhbSwKKwkJCQkJICAgICAicHJvdGVjdGVkOlxuIik7CisJCQl9CisJCSAgICB9CisJCSAgZWxzZSBpZiAoVFlQRV9GTl9GSUVMRF9QUklWQVRFIChmLCBqKSkKKwkJICAgIHsKKwkJICAgICAgaWYgKHNlY3Rpb25fdHlwZSAhPSBzX3ByaXZhdGUpCisJCQl7CisJCQkgIHNlY3Rpb25fdHlwZSA9IHNfcHJpdmF0ZTsKKwkJCSAgZnByaW50ZmlfZmlsdGVyZWQgKGxldmVsICsgMiwgc3RyZWFtLCAicHJpdmF0ZTpcbiIpOworCQkJfQorCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgaWYgKHNlY3Rpb25fdHlwZSAhPSBzX3B1YmxpYykKKwkJCXsKKwkJCSAgc2VjdGlvbl90eXBlID0gc19wdWJsaWM7CisJCQkgIGZwcmludGZpX2ZpbHRlcmVkIChsZXZlbCArIDIsIHN0cmVhbSwgInB1YmxpYzpcbiIpOworCQkJfQorCQkgICAgfQorCisJCSAgcHJpbnRfc3BhY2VzX2ZpbHRlcmVkIChsZXZlbCArIDQsIHN0cmVhbSk7CisJCSAgaWYgKFRZUEVfRk5fRklFTERfVklSVFVBTF9QIChmLCBqKSkKKwkJICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInZpcnR1YWwgIik7CisJCSAgZWxzZSBpZiAoVFlQRV9GTl9GSUVMRF9TVEFUSUNfUCAoZiwgaikpCisJCSAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJzdGF0aWMgIik7CisJCSAgaWYgKFRZUEVfVEFSR0VUX1RZUEUgKFRZUEVfRk5fRklFTERfVFlQRSAoZiwgaikpID09IDApCisJCSAgICB7CisJCSAgICAgIC8qIEtlZXAgR0RCIGZyb20gY3Jhc2hpbmcgaGVyZS4gICovCisJCSAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjx1bmRlZmluZWQgdHlwZT4gJXM7XG4iLAorCQkJICAgICAgIFRZUEVfRk5fRklFTERfUEhZU05BTUUgKGYsIGopKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoIWlzX2NvbnN0cnVjdG9yICYmICAgICAgICAgICAgICAgICAgLyogY29uc3RydWN0b3JzIGRvbid0IGhhdmUgZGVjbGFyZWQgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc19mdWxsX3BoeXNuYW1lX2NvbnN0cnVjdG9yICYmICAgIC8qICAgICIgIiAgKi8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3Ryc3RyIChtZXRob2RfbmFtZSwgIm9wZXJhdG9yICIpKSAvKiBOb3QgYSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChub3RlIHNwYWNlIC0tIG90aGVyIG9wZXJhdG9ycyBkb24ndCBoYXZlIGl0KSAqLyAKKwkJICAgIHsKKwkJICAgICAgdHlwZV9wcmludCAoVFlQRV9UQVJHRVRfVFlQRSAoVFlQRV9GTl9GSUVMRF9UWVBFIChmLCBqKSksCisJCQkJICAiIiwgc3RyZWFtLCAtMSk7CisJCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiICIsIHN0cmVhbSk7CisJCSAgICB9CisJCSAgaWYgKFRZUEVfRk5fRklFTERfU1RVQiAoZiwgaikpCisJCSAgICAvKiBCdWlsZCBzb21ldGhpbmcgd2UgY2FuIGRlbWFuZ2xlLiAgKi8KKwkJICAgIG1hbmdsZWRfbmFtZSA9IGdkYl9tYW5nbGVfbmFtZSAodHlwZSwgaSwgaik7CisJCSAgZWxzZQorCQkgICAgbWFuZ2xlZF9uYW1lID0gVFlQRV9GTl9GSUVMRF9QSFlTTkFNRSAoZiwgaik7CisKKwkJICBkZW1hbmdsZWRfbmFtZSA9CisJCSAgICBjcGx1c19kZW1hbmdsZSAobWFuZ2xlZF9uYW1lLAorCQkJCSAgICBETUdMX0FOU0kgfCBETUdMX1BBUkFNUyk7CisJCSAgaWYgKGRlbWFuZ2xlZF9uYW1lID09IE5VTEwpCisJCSAgICB7CisJCSAgICAgIC8qIGluIHNvbWUgY2FzZXMgKGZvciBpbnN0YW5jZSB3aXRoIHRoZSBIUCBkZW1hbmdsaW5nKSwKKwkJCSBpZiBhIGZ1bmN0aW9uIGhhcyBtb3JlIHRoYW4gMTAgYXJndW1lbnRzLCAKKwkJCSB0aGUgZGVtYW5nbGluZyB3aWxsIGZhaWwuCisJCQkgTGV0J3MgdHJ5IHRvIHJlY29uc3RydWN0IHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgZnJvbSAKKwkJCSB0aGUgc3ltYm9sIGluZm9ybWF0aW9uCSovCisJCSAgICAgIGlmICghVFlQRV9GTl9GSUVMRF9TVFVCIChmLCBqKSkKKwkJCWNwX3R5cGVfcHJpbnRfbWV0aG9kX2FyZ3MgKFRZUEVfRk5fRklFTERfQVJHUyAoZiwgaiksICIiLAorCQkJCQkJICAgbWV0aG9kX25hbWUsCisJCQkJCQkgICBUWVBFX0ZOX0ZJRUxEX1NUQVRJQ19QIChmLCBqKSwKKwkJCQkJCSAgIHN0cmVhbSk7CisJCSAgICAgIGVsc2UKKwkJCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjxiYWRseSBtYW5nbGVkIG5hbWUgJyVzJz4iLAorCQkJCQkgIG1hbmdsZWRfbmFtZSk7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBjaGFyICpwOworCQkgICAgICBjaGFyICpkZW1hbmdsZWRfbm9fY2xhc3MgPSBkZW1hbmdsZWRfbmFtZTsKKwkJICAgICAgCisJCSAgICAgIHdoaWxlIChwID0gc3RyY2hyIChkZW1hbmdsZWRfbm9fY2xhc3MsICc6JykpCisJCQl7CisJCQkgIGRlbWFuZ2xlZF9ub19jbGFzcyA9IHA7CisJCQkgIGlmICgqKytkZW1hbmdsZWRfbm9fY2xhc3MgPT0gJzonKQorCQkJICAgICsrZGVtYW5nbGVkX25vX2NsYXNzOworCQkJfQorCQkgICAgICAvKiBnZXQgcmlkIG9mIHRoZSBzdGF0aWMgd29yZCBhcHBlbmRlZCBieSB0aGUgZGVtYW5nbGVyICovCisJCSAgICAgIHAgPSBzdHJzdHIgKGRlbWFuZ2xlZF9ub19jbGFzcywgIiBzdGF0aWMiKTsKKwkJICAgICAgaWYgKHAgIT0gTlVMTCkKKwkJCXsKKwkJCSAgaW50IGxlbmd0aCA9IHAgLSBkZW1hbmdsZWRfbm9fY2xhc3M7CisJCQkgIGRlbWFuZ2xlZF9ub19zdGF0aWMgPSAoY2hhciAqKSB4bWFsbG9jIChsZW5ndGggKyAxKTsKKwkJCSAgc3RybmNweSAoZGVtYW5nbGVkX25vX3N0YXRpYywgZGVtYW5nbGVkX25vX2NsYXNzLCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAqKGRlbWFuZ2xlZF9ub19zdGF0aWMgKyBsZW5ndGgpID0gJ1wwJzsKKwkJCSAgZnB1dHNfZmlsdGVyZWQgKGRlbWFuZ2xlZF9ub19zdGF0aWMsIHN0cmVhbSk7CisJCQkgIGZyZWUgKGRlbWFuZ2xlZF9ub19zdGF0aWMpOworCQkJfQorCQkgICAgICBlbHNlCisJCQlmcHV0c19maWx0ZXJlZCAoZGVtYW5nbGVkX25vX2NsYXNzLCBzdHJlYW0pOworCQkgICAgICBmcmVlIChkZW1hbmdsZWRfbmFtZSk7CisJCSAgICB9CisKKwkJICBpZiAoVFlQRV9GTl9GSUVMRF9TVFVCIChmLCBqKSkKKwkJICAgIGZyZWUgKG1hbmdsZWRfbmFtZSk7CisKKwkJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICI7XG4iKTsKKwkJfQorCSAgICB9CisKKyAgICAgIGlmIChUWVBFX0xPQ0FMVFlQRV9QVFIgKHR5cGUpICYmIHNob3cgPj0gMCkKKyAgICAgICAgZnByaW50ZmlfZmlsdGVyZWQgKGxldmVsLCBzdHJlYW0sICIgKExvY2FsIGF0ICVzOiVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfTE9DQUxUWVBFX0ZJTEUgKHR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9MT0NBTFRZUEVfTElORSAodHlwZSkpOworCisJICBmcHJpbnRmaV9maWx0ZXJlZCAobGV2ZWwsIHN0cmVhbSwgIn0iKTsKKwl9CisgICAgICBpZiAoVFlQRV9DT0RFKHR5cGUpID09IFRZUEVfQ09ERV9URU1QTEFURSkKKyAgICAgICAgZ290byBnb19iYWNrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9FTlVNOgorICAgICAgY190eXBlX3ByaW50X2N2X3F1YWxpZmllciAodHlwZSwgc3RyZWFtLCAwLCAxKTsKKyAgICAgIC8qIEhQIEMgc3VwcG9ydHMgc2l6ZWQgZW51bXMgKi8KKyAgICAgIGlmIChocF9zb21fc29tX29iamVjdF9wcmVzZW50KQorICAgICAgICBzd2l0Y2ggKFRZUEVfTEVOR1RIICh0eXBlKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgIGZwdXRzX2ZpbHRlcmVkICgiY2hhciAiLCBzdHJlYW0pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgZnB1dHNfZmlsdGVyZWQgKCJzaG9ydCAiLCBzdHJlYW0pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJlbnVtICIpOworICAgICAgLyogUHJpbnQgdGhlIHRhZyBuYW1lIGlmIGl0IGV4aXN0cy4KKyAgICAgICAgIFRoZSBhQ0MgY29tcGlsZXIgZW1pdHMgYSBzcHVyaW91cyAKKyAgICAgICAgICJ7dW5uYW1lZCBzdHJ1Y3R9Ii8ie3VubmFtZWQgdW5pb259Ii8ie3VubmFtZWQgZW51bX0iCisgICAgICAgICB0YWcgZm9yIHVubmFtZWQgc3RydWN0L3VuaW9uL2VudW0ncywgd2hpY2ggd2UgZG9uJ3QKKyAgICAgICAgIHdhbnQgdG8gcHJpbnQuICovCisgICAgICBpZiAoVFlQRV9UQUdfTkFNRSAodHlwZSkgIT0gTlVMTCAmJgorICAgICAgICAgIHN0cm5jbXAoVFlQRV9UQUdfTkFNRSh0eXBlKSwgInt1bm5hbWVkIiwgOCkpCisJeworCSAgZnB1dHNfZmlsdGVyZWQgKFRZUEVfVEFHX05BTUUgKHR5cGUpLCBzdHJlYW0pOworCSAgaWYgKHNob3cgPiAwKQorCSAgICBmcHV0c19maWx0ZXJlZCAoIiAiLCBzdHJlYW0pOworCX0KKworICAgICAgd3JhcF9oZXJlICgiICAgICIpOworICAgICAgaWYgKHNob3cgPCAwKQorCXsKKwkgIC8qIElmIHdlIGp1c3QgcHJpbnRlZCBhIHRhZyBuYW1lLCBubyBuZWVkIHRvIHByaW50IGFueXRoaW5nIGVsc2UuICAqLworCSAgaWYgKFRZUEVfVEFHX05BTUUgKHR5cGUpID09IE5VTEwpCisJICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInsuLi59Iik7CisJfQorICAgICAgZWxzZSBpZiAoc2hvdyA+IDAgfHwgVFlQRV9UQUdfTkFNRSAodHlwZSkgPT0gTlVMTCkKKwl7CisJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJ7Iik7CisJICBsZW4gPSBUWVBFX05GSUVMRFMgKHR5cGUpOworCSAgbGFzdHZhbCA9IDA7CisJICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJICAgIHsKKwkgICAgICBRVUlUOworCSAgICAgIGlmIChpKSBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIsICIpOworCSAgICAgIHdyYXBfaGVyZSAoIiAgICAiKTsKKwkgICAgICBmcHV0c19maWx0ZXJlZCAoVFlQRV9GSUVMRF9OQU1FICh0eXBlLCBpKSwgc3RyZWFtKTsKKwkgICAgICBpZiAobGFzdHZhbCAhPSBUWVBFX0ZJRUxEX0JJVFBPUyAodHlwZSwgaSkpCisJCXsKKwkJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIgPSAlZCIsIFRZUEVfRklFTERfQklUUE9TICh0eXBlLCBpKSk7CisJCSAgbGFzdHZhbCA9IFRZUEVfRklFTERfQklUUE9TICh0eXBlLCBpKTsKKwkJfQorCSAgICAgIGxhc3R2YWwrKzsKKwkgICAgfQorCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAifSIpOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfVk9JRDoKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInZvaWQiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfVU5ERUY6CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJzdHJ1Y3QgPHVua25vd24+Iik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX0VSUk9SOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiPHVua25vd24gdHlwZT4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfUkFOR0U6CisgICAgICAvKiBUaGlzIHNob3VsZCBub3Qgb2NjdXIgKi8KKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjxyYW5nZSB0eXBlPiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9URU1QTEFURToKKyAgICAgIC8qIENhbGxlZCBvbiAicHR5cGUgdCIgd2hlcmUgInQiIGlzIGEgdGVtcGxhdGUuCisgICAgICAgICBQcmludHMgdGhlIHRlbXBsYXRlIGhlYWRlciAod2l0aCBhcmdzKSwgZS5nLjoKKyAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4gY2xhc3MgIgorICAgICAgICAgYW5kIHRoZW4gbWVyZ2VzIHdpdGggdGhlIHN0cnVjdC91bmlvbi9jbGFzcyBjb2RlIHRvCisgICAgICAgICBwcmludCB0aGUgcmVzdCBvZiB0aGUgZGVmaW5pdGlvbi4gKi8KKyAgICAgIGNfdHlwZV9wcmludF9jdl9xdWFsaWZpZXIgKHR5cGUsIHN0cmVhbSwgMCwgMSk7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJ0ZW1wbGF0ZSA8Iik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgVFlQRV9OVEVNUExBVEVfQVJHUyh0eXBlKTsgaSsrKSB7CisgICAgICAgIHN0cnVjdCB0ZW1wbGF0ZV9hcmcgdGVtcGxfYXJnOworICAgICAgICB0ZW1wbF9hcmcgPSBUWVBFX1RFTVBMQVRFX0FSRyh0eXBlLCBpKTsKKyAgICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiY2xhc3MgJXMiLCB0ZW1wbF9hcmcubmFtZSk7CisgICAgICAgIGlmIChpIDwgVFlQRV9OVEVNUExBVEVfQVJHUyh0eXBlKS0xKQorICAgICAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiwgIik7CisgICAgICB9CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICI+IGNsYXNzICIpOworICAgICAgLyogWXVjaywgZmFjdG9yIHRoaXMgb3V0IHRvIGEgc3Vicm91dGluZSBzbyB3ZSBjYW4gY2FsbAorICAgICAgICAgaXQgYW5kIHJldHVybiB0byB0aGUgcG9pbnQgbWFya2VkIHdpdGggdGhlICJnb2JhY2s6IiBsYWJlbC4uLiAtIFJUICovCisgICAgICBnb3RvIHN0cnVjdF91bmlvbjsgCitnb19iYWNrOgorICAgICAgaWYgKFRZUEVfTklOU1RBTlRJQVRJT05TKHR5cGUpID4gMCkgeworICAgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJcbnRlbXBsYXRlIGluc3RhbnRpYXRpb25zOlxuIik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBUWVBFX05JTlNUQU5USUFUSU9OUyh0eXBlKTsgaSsrKSB7CisgICAgICAgICAgZnByaW50Zl9maWx0ZXJlZChzdHJlYW0sICIgICIpOworICAgICAgICAgIGNfdHlwZV9wcmludF9iYXNlIChUWVBFX0lOU1RBTlRJQVRJT04odHlwZSwgaSksIHN0cmVhbSwgMCwgbGV2ZWwpOworICAgICAgICAgIGlmIChpIDwgVFlQRV9OSU5TVEFOVElBVElPTlModHlwZSktMSkgZnByaW50Zl9maWx0ZXJlZChzdHJlYW0sICJcbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICAgICAKKyAgICBkZWZhdWx0OgorICAgICAgLyogSGFuZGxlIHR5cGVzIG5vdCBleHBsaWNpdGx5IGhhbmRsZWQgYnkgdGhlIG90aGVyIGNhc2VzLAorCSBzdWNoIGFzIGZ1bmRhbWVudGFsIHR5cGVzLiAgRm9yIHRoZXNlLCBqdXN0IHByaW50IHdoYXRldmVyCisJIHRoZSB0eXBlIG5hbWUgaXMsIGFzIHJlY29yZGVkIGluIHRoZSB0eXBlIGl0c2VsZi4gIElmIHRoZXJlCisJIGlzIG5vIHR5cGUgbmFtZSwgdGhlbiBjb21wbGFpbi4gKi8KKyAgICAgIGlmIChUWVBFX05BTUUgKHR5cGUpICE9IE5VTEwpCisJeworICAgICAgICAgIGNfdHlwZV9wcmludF9jdl9xdWFsaWZpZXIgKHR5cGUsIHN0cmVhbSwgMCwgMSk7CisJICBmcHV0c19maWx0ZXJlZCAoVFlQRV9OQU1FICh0eXBlKSwgc3RyZWFtKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogQXQgbGVhc3QgZm9yIGR1bXBfc3ltdGFiLCBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGlzIG5vdCBiZQorCSAgICAgYW4gZXJyb3IgKCkuICAqLworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiPGludmFsaWQgdHlwZSBjb2RlICVkPiIsCisJCQkgICAgVFlQRV9DT0RFICh0eXBlKSk7CisJfQorICAgICAgYnJlYWs7CisgICAgfQorfQorCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZ2RiL2MtdmFscHJpbnQuYyBiL2dkYi9jLXZhbHByaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5YzZiZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jLXZhbHByaW50LmMKQEAgLTAsMCArMSw1MzUgQEAKKy8qIFN1cHBvcnQgZm9yIHByaW50aW5nIEMgdmFsdWVzIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4OCwgMTk4OSwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICAgICAgICAgICAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJkZW1hbmdsZS5oIgorI2luY2x1ZGUgInZhbHByaW50LmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJjLWxhbmcuaCIKKworDAorLyogUHJpbnQgZGF0YSBvZiB0eXBlIFRZUEUgbG9jYXRlZCBhdCBWQUxBRERSICh3aXRoaW4gR0RCKSwgd2hpY2ggY2FtZSBmcm9tCisgICB0aGUgaW5mZXJpb3IgYXQgYWRkcmVzcyBBRERSRVNTLCBvbnRvIHN0ZGlvIHN0cmVhbSBTVFJFQU0gYWNjb3JkaW5nIHRvCisgICBGT1JNQVQgKGEgbGV0dGVyIG9yIDAgZm9yIG5hdHVyYWwgZm9ybWF0KS4gIFRoZSBkYXRhIGF0IFZBTEFERFIgaXMgaW4KKyAgIHRhcmdldCBieXRlIG9yZGVyLgorCisgICBJZiB0aGUgZGF0YSBhcmUgYSBzdHJpbmcgcG9pbnRlciwgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0cmluZyBjaGFyYWN0ZXJzCisgICBwcmludGVkLgorCisgICBJZiBERVJFRl9SRUYgaXMgbm9uemVybywgdGhlbiBkZXJlZmVyZW5jZSByZWZlcmVuY2VzLCBvdGhlcndpc2UganVzdCBwcmludAorICAgdGhlbSBsaWtlIHBvaW50ZXJzLgorCisgICBUaGUgUFJFVFRZIHBhcmFtZXRlciBjb250cm9scyBwcmV0dHlwcmludGluZy4gICovCisKK2ludAorY192YWxfcHJpbnQgKHR5cGUsIHZhbGFkZHIsIGVtYmVkZGVkX29mZnNldCwgYWRkcmVzcywgc3RyZWFtLCBmb3JtYXQsIGRlcmVmX3JlZiwgcmVjdXJzZSwKKwkgICAgIHByZXR0eSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGNoYXIgKnZhbGFkZHI7CisgICAgIGludCBlbWJlZGRlZF9vZmZzZXQ7CisgICAgIENPUkVfQUREUiBhZGRyZXNzOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgZm9ybWF0OworICAgICBpbnQgZGVyZWZfcmVmOworICAgICBpbnQgcmVjdXJzZTsKKyAgICAgZW51bSB2YWxfcHJldHR5cHJpbnQgcHJldHR5OworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaSA9IDA7CQkvKiBOdW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkICovCisgIHVuc2lnbmVkIGxlbjsKKyAgc3RydWN0IHR5cGUgKmVsdHR5cGU7CisgIHVuc2lnbmVkIGVsdGxlbjsKKyAgTE9OR0VTVCB2YWw7CisgIENPUkVfQUREUiBhZGRyOworCisgIENIRUNLX1RZUEVERUYgKHR5cGUpOworICBzd2l0Y2ggKFRZUEVfQ09ERSAodHlwZSkpCisgICAgeworICAgIGNhc2UgVFlQRV9DT0RFX0FSUkFZOgorICAgICAgZWx0dHlwZSA9IGNoZWNrX3R5cGVkZWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKKyAgICAgIGlmIChUWVBFX0xFTkdUSCAodHlwZSkgPiAwICYmIFRZUEVfTEVOR1RIIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSkgPiAwKQorCXsKKwkgIGVsdGxlbiA9IFRZUEVfTEVOR1RIIChlbHR0eXBlKTsKKwkgIGxlbiA9IFRZUEVfTEVOR1RIICh0eXBlKSAvIGVsdGxlbjsKKwkgIGlmIChwcmV0dHlwcmludF9hcnJheXMpCisJICAgIHsKKwkgICAgICBwcmludF9zcGFjZXNfZmlsdGVyZWQgKDIgKyAyICogcmVjdXJzZSwgc3RyZWFtKTsKKwkgICAgfQorCSAgLyogRm9yIGFuIGFycmF5IG9mIGNoYXJzLCBwcmludCB3aXRoIHN0cmluZyBzeW50YXguICAqLworCSAgaWYgKGVsdGxlbiA9PSAxICYmCisJICAgICAgKChUWVBFX0NPREUgKGVsdHR5cGUpID09IFRZUEVfQ09ERV9JTlQpCisJICAgICAgIHx8ICgoY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfbTIpCisJCSAgICYmIChUWVBFX0NPREUgKGVsdHR5cGUpID09IFRZUEVfQ09ERV9DSEFSKSkpCisJICAgICAgJiYgKGZvcm1hdCA9PSAwIHx8IGZvcm1hdCA9PSAncycpKQorCSAgICB7CisJICAgICAgLyogSWYgcmVxdWVzdGVkLCBsb29rIGZvciB0aGUgZmlyc3QgbnVsbCBjaGFyIGFuZCBvbmx5IHByaW50CisJCSBlbGVtZW50cyB1cCB0byBpdC4gICovCisJICAgICAgaWYgKHN0b3BfcHJpbnRfYXRfbnVsbCkKKwkJeworCQkgIGludCB0ZW1wX2xlbjsKKwkJICAKKwkJICAvKiBMb29rIGZvciBhIE5VTEwgY2hhci4gKi8KKwkJICBmb3IgKHRlbXBfbGVuID0gMDsKKwkJICAgICAgICh2YWxhZGRyICsgZW1iZWRkZWRfb2Zmc2V0KVt0ZW1wX2xlbl0KKwkJICAgICAgICYmIHRlbXBfbGVuIDwgbGVuICYmIHRlbXBfbGVuIDwgcHJpbnRfbWF4OworCQkgICAgICAgdGVtcF9sZW4rKyk7CisJCSAgbGVuID0gdGVtcF9sZW47CisJCX0KKwkgICAgICAKKwkgICAgICBMQV9QUklOVF9TVFJJTkcgKHN0cmVhbSwgdmFsYWRkciArIGVtYmVkZGVkX29mZnNldCwgbGVuLCBlbHRsZW4sIDApOworCSAgICAgIGkgPSBsZW47CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInsiKTsKKwkgICAgICAvKiBJZiB0aGlzIGlzIGEgdmlydHVhbCBmdW5jdGlvbiB0YWJsZSwgcHJpbnQgdGhlIDB0aAorCQkgZW50cnkgc3BlY2lhbGx5LCBhbmQgdGhlIHJlc3Qgb2YgdGhlIG1lbWJlcnMgbm9ybWFsbHkuICAqLworCSAgICAgIGlmIChjcF9pc192dGJsX3B0cl90eXBlIChlbHR0eXBlKSkKKwkJeworCQkgIGkgPSAxOworCQkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiVkIHZ0YWJsZSBlbnRyaWVzIiwgbGVuIC0gMSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpID0gMDsKKwkJfQorCSAgICAgIHZhbF9wcmludF9hcnJheV9lbGVtZW50cyAodHlwZSwgdmFsYWRkciArIGVtYmVkZGVkX29mZnNldCwgYWRkcmVzcywgc3RyZWFtLAorCQkJCQlmb3JtYXQsIGRlcmVmX3JlZiwgcmVjdXJzZSwgcHJldHR5LCBpKTsKKwkgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJ9Iik7CisJICAgIH0KKwkgIGJyZWFrOworCX0KKyAgICAgIC8qIEFycmF5IG9mIHVuc3BlY2lmaWVkIGxlbmd0aDogdHJlYXQgbGlrZSBwb2ludGVyIHRvIGZpcnN0IGVsdC4gICovCisgICAgICBhZGRyID0gYWRkcmVzczsKKyAgICAgIGdvdG8gcHJpbnRfdW5wYWNrZWRfcG9pbnRlcjsKKworICAgIGNhc2UgVFlQRV9DT0RFX1BUUjoKKyAgICAgIGlmIChmb3JtYXQgJiYgZm9ybWF0ICE9ICdzJykKKwl7CisJICBwcmludF9zY2FsYXJfZm9ybWF0dGVkICh2YWxhZGRyICsgZW1iZWRkZWRfb2Zmc2V0LCB0eXBlLCBmb3JtYXQsIDAsIHN0cmVhbSk7CisJICBicmVhazsKKwl9CisgICAgICBpZiAodnRibHByaW50ICYmIGNwX2lzX3Z0YmxfcHRyX3R5cGUodHlwZSkpCisJeworICAgICAgICAgIC8qIFByaW50IHRoZSB1bm1hbmdsZWQgbmFtZSBpZiBkZXNpcmVkLiAgKi8KKwkgIC8qIFByaW50IHZ0YWJsZSBlbnRyeSAtIHdlIG9ubHkgZ2V0IGhlcmUgaWYgd2UgQVJFIHVzaW5nCisJICAgICAtZnZ0YWJsZV90aHVua3MuICAoT3RoZXJ3aXNlLCBsb29rIHVuZGVyIFRZUEVfQ09ERV9TVFJVQ1QuKSAqLworCSAgcHJpbnRfYWRkcmVzc19kZW1hbmdsZShleHRyYWN0X2FkZHJlc3MgKHZhbGFkZHIgKyBlbWJlZGRlZF9vZmZzZXQsIFRZUEVfTEVOR1RIICh0eXBlKSksCisJCQkJIHN0cmVhbSwgZGVtYW5nbGUpOworCSAgYnJlYWs7CisJfQorICAgICAgZWx0dHlwZSA9IGNoZWNrX3R5cGVkZWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKKyAgICAgIGlmIChUWVBFX0NPREUgKGVsdHR5cGUpID09IFRZUEVfQ09ERV9NRVRIT0QpCisJeworCSAgY3BfcHJpbnRfY2xhc3NfbWV0aG9kICh2YWxhZGRyICsgZW1iZWRkZWRfb2Zmc2V0LCB0eXBlLCBzdHJlYW0pOworCX0KKyAgICAgIGVsc2UgaWYgKFRZUEVfQ09ERSAoZWx0dHlwZSkgPT0gVFlQRV9DT0RFX01FTUJFUikKKwl7CisJICBjcF9wcmludF9jbGFzc19tZW1iZXIgKHZhbGFkZHIgKyBlbWJlZGRlZF9vZmZzZXQsCisJCQkJIFRZUEVfRE9NQUlOX1RZUEUgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKSwKKwkJCQkgc3RyZWFtLCAiJiIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBhZGRyID0gdW5wYWNrX3BvaW50ZXIgKHR5cGUsIHZhbGFkZHIgKyBlbWJlZGRlZF9vZmZzZXQpOworCXByaW50X3VucGFja2VkX3BvaW50ZXI6CisgICAgICAgICAgZWx0dHlwZSA9IGNoZWNrX3R5cGVkZWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKKworCSAgaWYgKFRZUEVfQ09ERSAoZWx0dHlwZSkgPT0gVFlQRV9DT0RFX0ZVTkMpCisJICAgIHsKKwkgICAgICAvKiBUcnkgdG8gcHJpbnQgd2hhdCBmdW5jdGlvbiBpdCBwb2ludHMgdG8uICAqLworCSAgICAgIHByaW50X2FkZHJlc3NfZGVtYW5nbGUgKGFkZHIsIHN0cmVhbSwgZGVtYW5nbGUpOworCSAgICAgIC8qIFJldHVybiB2YWx1ZSBpcyBpcnJlbGV2YW50IGV4Y2VwdCBmb3Igc3RyaW5nIHBvaW50ZXJzLiAgKi8KKwkgICAgICByZXR1cm4gKDApOworCSAgICB9CisKKwkgIGlmIChhZGRyZXNzcHJpbnQgJiYgZm9ybWF0ICE9ICdzJykKKwkgICAgeworCSAgICAgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoYWRkciwgMSwgc3RyZWFtKTsKKwkgICAgfQorCisJICAvKiBGb3IgYSBwb2ludGVyIHRvIGNoYXIgb3IgdW5zaWduZWQgY2hhciwgYWxzbyBwcmludCB0aGUgc3RyaW5nCisJICAgICBwb2ludGVkIHRvLCB1bmxlc3MgcG9pbnRlciBpcyBudWxsLiAgKi8KKwkgIC8qIEZJWE1FOiBuZWVkIHRvIGhhbmRsZSB3Y2hhcl90IGhlcmUuLi4gKi8KKworCSAgaWYgKFRZUEVfTEVOR1RIIChlbHR0eXBlKSA9PSAxCisJICAgICAgJiYgVFlQRV9DT0RFIChlbHR0eXBlKSA9PSBUWVBFX0NPREVfSU5UCisJICAgICAgJiYgKGZvcm1hdCA9PSAwIHx8IGZvcm1hdCA9PSAncycpCisJICAgICAgJiYgYWRkciAhPSAwKQorCSAgICB7CisJICAgICAgaSA9IHZhbF9wcmludF9zdHJpbmcgKGFkZHIsIC0xLCBUWVBFX0xFTkdUSCAoZWx0dHlwZSksIHN0cmVhbSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKGNwX2lzX3Z0YmxfbWVtYmVyKHR5cGUpKQorICAJICAgIHsKKwkgICAgICAvKiBwcmludCB2dGJsJ3MgbmljZWx5ICovCisJICAgICAgQ09SRV9BRERSIHZ0X2FkZHJlc3MgPSB1bnBhY2tfcG9pbnRlciAodHlwZSwgdmFsYWRkciArIGVtYmVkZGVkX29mZnNldCk7CisKKwkgICAgICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2wgPQorCQlsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGMgKHZ0X2FkZHJlc3MpOworCSAgICAgIGlmICgobXN5bWJvbCAhPSBOVUxMKSAmJgorCQkgICh2dF9hZGRyZXNzID09IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKSkpCisJCXsKKwkJICBmcHV0c19maWx0ZXJlZCAoIiA8Iiwgc3RyZWFtKTsKKwkJICBmcHV0c19maWx0ZXJlZCAoU1lNQk9MX1NPVVJDRV9OQU1FIChtc3ltYm9sKSwgc3RyZWFtKTsKKwkJICBmcHV0c19maWx0ZXJlZCAoIj4iLCBzdHJlYW0pOworCQl9CisJICAgICAgaWYgKHZ0X2FkZHJlc3MgJiYgdnRibHByaW50KQorCSAgICAgICAgeworCQkgIHZhbHVlX3B0ciB2dF92YWw7CisJICAgICAgICAgIHN0cnVjdCBzeW1ib2wgKndzeW0gPSAoc3RydWN0IHN5bWJvbCAqKU5VTEw7CisJICAgICAgICAgIHN0cnVjdCB0eXBlICp3dHlwZTsKKwkJICBzdHJ1Y3Qgc3ltdGFiICpzOworCQkgIHN0cnVjdCBibG9jayAqYmxvY2sgPSAoc3RydWN0IGJsb2NrICopTlVMTDsKKwkJICBpbnQgaXNfdGhpc19mbGQ7CisKKwkJICBpZiAobXN5bWJvbCAhPSBOVUxMKQorICAgICAgICAgICAgICAJICAgIHdzeW0gPSBsb29rdXBfc3ltYm9sIChTWU1CT0xfTkFNRShtc3ltYm9sKSwgYmxvY2ssIAorCQkJCVZBUl9OQU1FU1BBQ0UsICZpc190aGlzX2ZsZCwgJnMpOworIAorCQkgIGlmICh3c3ltKQorCQkgICAgeworCSAgICAgICAgICAgICAgd3R5cGUgPSBTWU1CT0xfVFlQRSh3c3ltKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIHd0eXBlID0gVFlQRV9UQVJHRVRfVFlQRSh0eXBlKTsKKwkJICAgIH0KKwkJICB2dF92YWwgPSB2YWx1ZV9hdCAod3R5cGUsIHZ0X2FkZHJlc3MsIE5VTEwpOworCQkgIHZhbF9wcmludCAoVkFMVUVfVFlQRSAodnRfdmFsKSwgVkFMVUVfQ09OVEVOVFMgKHZ0X3ZhbCksIDAsCisJCQkgICAgIFZBTFVFX0FERFJFU1MgKHZ0X3ZhbCksIHN0cmVhbSwgZm9ybWF0LAorCQkJICAgICBkZXJlZl9yZWYsIHJlY3Vyc2UgKyAxLCBwcmV0dHkpOworCQkgIGlmIChwcmV0dHkpCisJCSAgICB7CisJCSAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlxuIik7CisJCSAgICAgIHByaW50X3NwYWNlc19maWx0ZXJlZCAoMiArIDIgKiByZWN1cnNlLCBzdHJlYW0pOworCQkgICAgfQorCSAgICAgICAgfQorCSAgICAgIH0KKworCSAgLyogUmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQsIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcKKwkgICAgICdcMCcgaWYgd2UgcmVhY2hlZCB0aGUgZW5kLiAgdmFsX3ByaW50X3N0cmluZyB0YWtlcyBjYXJlIGluY2x1ZGluZworCSAgICAgdGhlIHRlcm1pbmF0aW5nICdcMCcgaWYgbmVjZXNzYXJ5LiAgKi8KKwkgIHJldHVybiBpOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfTUVNQkVSOgorICAgICAgZXJyb3IgKCJub3QgaW1wbGVtZW50ZWQ6IG1lbWJlciB0eXBlIGluIGNfdmFsX3ByaW50Iik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX1JFRjoKKyAgICAgIGVsdHR5cGUgPSBjaGVja190eXBlZGVmIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSk7CisgICAgICBpZiAoVFlQRV9DT0RFIChlbHR0eXBlKSA9PSBUWVBFX0NPREVfTUVNQkVSKQorICAgICAgICB7CisJICBjcF9wcmludF9jbGFzc19tZW1iZXIgKHZhbGFkZHIgKyBlbWJlZGRlZF9vZmZzZXQsCisJCQkJIFRZUEVfRE9NQUlOX1RZUEUgKGVsdHR5cGUpLAorCQkJCSBzdHJlYW0sICIiKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGlmIChhZGRyZXNzcHJpbnQpCisgICAgICAgIHsKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIkAiKTsKKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYworCSAgICAoZXh0cmFjdF9hZGRyZXNzICh2YWxhZGRyICsgZW1iZWRkZWRfb2Zmc2V0LAorCQkJICAgICAgVEFSR0VUX1BUUl9CSVQgLyBIT1NUX0NIQVJfQklUKSwgMSwgc3RyZWFtKTsKKwkgIGlmIChkZXJlZl9yZWYpCisJICAgIGZwdXRzX2ZpbHRlcmVkICgiOiAiLCBzdHJlYW0pOworICAgICAgICB9CisgICAgICAvKiBEZS1yZWZlcmVuY2UgdGhlIHJlZmVyZW5jZS4gICovCisgICAgICBpZiAoZGVyZWZfcmVmKQorCXsKKwkgIGlmIChUWVBFX0NPREUgKGVsdHR5cGUpICE9IFRZUEVfQ09ERV9VTkRFRikKKwkgICAgeworCSAgICAgIHZhbHVlX3B0ciBkZXJlZl92YWwgPQorCQl2YWx1ZV9hdAorCQkgIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSwKKwkJICAgdW5wYWNrX3BvaW50ZXIgKGxvb2t1cF9wb2ludGVyX3R5cGUgKGJ1aWx0aW5fdHlwZV92b2lkKSwKKwkJCQkgICB2YWxhZGRyICsgZW1iZWRkZWRfb2Zmc2V0KSwKKwkJICAgTlVMTCk7CisJICAgICAgdmFsX3ByaW50IChWQUxVRV9UWVBFIChkZXJlZl92YWwpLAorCQkJIFZBTFVFX0NPTlRFTlRTIChkZXJlZl92YWwpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLAorCQkJIFZBTFVFX0FERFJFU1MgKGRlcmVmX3ZhbCksIAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorCQkJIGRlcmVmX3JlZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJldHR5KTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBmcHV0c19maWx0ZXJlZCAoIj8/PyIsIHN0cmVhbSk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9VTklPTjoKKyAgICAgIGlmIChyZWN1cnNlICYmICF1bmlvbnByaW50KQorCXsKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInsuLi59Iik7CisJICBicmVhazsKKwl9CisgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworICAgIGNhc2UgVFlQRV9DT0RFX1NUUlVDVDoKKyAgICAgIGlmICh2dGJscHJpbnQgJiYgY3BfaXNfdnRibF9wdHJfdHlwZSh0eXBlKSkKKwl7CisgICAgICAgICAgLyogUHJpbnQgdGhlIHVubWFuZ2xlZCBuYW1lIGlmIGRlc2lyZWQuICAqLworCSAgLyogUHJpbnQgdnRhYmxlIGVudHJ5IC0gd2Ugb25seSBnZXQgaGVyZSBpZiBOT1QgdXNpbmcKKwkgICAgIC1mdnRhYmxlX3RodW5rcy4gIChPdGhlcndpc2UsIGxvb2sgdW5kZXIgVFlQRV9DT0RFX1BUUi4pICovCisgICAgICAgICAgcHJpbnRfYWRkcmVzc19kZW1hbmdsZSAoZXh0cmFjdF9hZGRyZXNzICgKKwkgICAgICAgIHZhbGFkZHIgKyBlbWJlZGRlZF9vZmZzZXQgKyAKKyAgICAgICAgICAgICAgICBUWVBFX0ZJRUxEX0JJVFBPUyAodHlwZSwgVlRCTF9GTkFERFJfT0ZGU0VUKSAvIDgsCisJICAgICAgICBUWVBFX0xFTkdUSCAoVFlQRV9GSUVMRF9UWVBFICh0eXBlLCBWVEJMX0ZOQUREUl9PRkZTRVQpKSksCisgICAgICAgICAgICAgIHN0cmVhbSwgZGVtYW5nbGUpOworCX0KKyAgICAgIGVsc2UKKwljcF9wcmludF92YWx1ZV9maWVsZHMgKHR5cGUsIHR5cGUsIHZhbGFkZHIsIGVtYmVkZGVkX29mZnNldCwgYWRkcmVzcywgc3RyZWFtLCBmb3JtYXQsCisJCQkgICAgICAgcmVjdXJzZSwgcHJldHR5LCBOVUxMLCAwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfRU5VTToKKyAgICAgIGlmIChmb3JtYXQpCisJeworCSAgcHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCAodmFsYWRkciArIGVtYmVkZGVkX29mZnNldCwgdHlwZSwgZm9ybWF0LCAwLCBzdHJlYW0pOworCSAgYnJlYWs7CisJfQorICAgICAgbGVuID0gVFlQRV9ORklFTERTICh0eXBlKTsKKyAgICAgIHZhbCA9IHVucGFja19sb25nICh0eXBlLCB2YWxhZGRyICsgZW1iZWRkZWRfb2Zmc2V0KTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwl7CisJICBRVUlUOworCSAgaWYgKHZhbCA9PSBUWVBFX0ZJRUxEX0JJVFBPUyAodHlwZSwgaSkpCisJICAgIHsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGlmIChpIDwgbGVuKQorCXsKKwkgIGZwdXRzX2ZpbHRlcmVkIChUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIGkpLCBzdHJlYW0pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwcmludF9sb25nZXN0IChzdHJlYW0sICdkJywgMCwgdmFsKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX0ZVTkM6CisgICAgICBpZiAoZm9ybWF0KQorCXsKKwkgIHByaW50X3NjYWxhcl9mb3JtYXR0ZWQgKHZhbGFkZHIgKyBlbWJlZGRlZF9vZmZzZXQsIHR5cGUsIGZvcm1hdCwgMCwgc3RyZWFtKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIC8qIEZJWE1FLCB3ZSBzaG91bGQgY29uc2lkZXIsIGF0IGxlYXN0IGZvciBBTlNJIEMgbGFuZ3VhZ2UsIGVsaW1pbmF0aW5nCisJIHRoZSBkaXN0aW5jdGlvbiBtYWRlIGJldHdlZW4gRlVOQ3MgYW5kIFBPSU5URVJzIHRvIEZVTkNzLiAgKi8KKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInsiKTsKKyAgICAgIHR5cGVfcHJpbnQgKHR5cGUsICIiLCBzdHJlYW0sIC0xKTsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIn0gIik7CisgICAgICAvKiBUcnkgdG8gcHJpbnQgd2hhdCBmdW5jdGlvbiBpdCBwb2ludHMgdG8sIGFuZCBpdHMgYWRkcmVzcy4gICovCisgICAgICBwcmludF9hZGRyZXNzX2RlbWFuZ2xlIChhZGRyZXNzLCBzdHJlYW0sIGRlbWFuZ2xlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfQk9PTDoKKyAgICAgIGZvcm1hdCA9IGZvcm1hdCA/IGZvcm1hdCA6IG91dHB1dF9mb3JtYXQ7CisgICAgICBpZiAoZm9ybWF0KQorCXByaW50X3NjYWxhcl9mb3JtYXR0ZWQgKHZhbGFkZHIgKyBlbWJlZGRlZF9vZmZzZXQsIHR5cGUsIGZvcm1hdCwgMCwgc3RyZWFtKTsKKyAgICAgIGVsc2UKKwl7CisJICB2YWwgPSB1bnBhY2tfbG9uZyAodHlwZSwgdmFsYWRkciArIGVtYmVkZGVkX29mZnNldCk7CisJICBpZiAodmFsID09IDApCisJICAgIGZwdXRzX2ZpbHRlcmVkICgiZmFsc2UiLCBzdHJlYW0pOworCSAgZWxzZSBpZiAodmFsID09IDEpCisJICAgIGZwdXRzX2ZpbHRlcmVkICgidHJ1ZSIsIHN0cmVhbSk7CisJICBlbHNlCisJICAgIHByaW50X2xvbmdlc3QgKHN0cmVhbSwgJ2QnLCAwLCB2YWwpOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfUkFOR0U6CisgICAgICAvKiBGSVhNRTogY3JlYXRlX3JhbmdlX3R5cGUgZG9lcyBub3Qgc2V0IHRoZSB1bnNpZ25lZCBiaXQgaW4gYQorCSByYW5nZSB0eXBlIChJIHRoaW5rIGl0IHByb2JhYmx5IHNob3VsZCBjb3B5IGl0IGZyb20gdGhlIHRhcmdldAorCSB0eXBlKSwgc28gd2Ugd29uJ3QgcHJpbnQgdmFsdWVzIHdoaWNoIGFyZSB0b28gbGFyZ2UgdG8KKwkgZml0IGluIGEgc2lnbmVkIGludGVnZXIgY29ycmVjdGx5LiAgKi8KKyAgICAgIC8qIEZJWE1FOiBEb2Vzbid0IGhhbmRsZSByYW5nZXMgb2YgZW51bXMgY29ycmVjdGx5LiAgKENhbid0IGp1c3QKKwkgcHJpbnQgd2l0aCB0aGUgdGFyZ2V0IHR5cGUsIHRob3VnaCwgYmVjYXVzZSB0aGUgc2l6ZSBvZiBvdXIgdHlwZQorCSBhbmQgdGhlIHRhcmdldCB0eXBlIG1pZ2h0IGRpZmZlcikuICAqLworICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKworICAgIGNhc2UgVFlQRV9DT0RFX0lOVDoKKyAgICAgIGZvcm1hdCA9IGZvcm1hdCA/IGZvcm1hdCA6IG91dHB1dF9mb3JtYXQ7CisgICAgICBpZiAoZm9ybWF0KQorCXsKKwkgIHByaW50X3NjYWxhcl9mb3JtYXR0ZWQgKHZhbGFkZHIgKyBlbWJlZGRlZF9vZmZzZXQsIHR5cGUsIGZvcm1hdCwgMCwgc3RyZWFtKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdmFsX3ByaW50X3R5cGVfY29kZV9pbnQgKHR5cGUsIHZhbGFkZHIgKyBlbWJlZGRlZF9vZmZzZXQsIHN0cmVhbSk7CisJICAvKiBDIGFuZCBDKysgaGFzIG5vIHNpbmdsZSBieXRlIGludCB0eXBlLCBjaGFyIGlzIHVzZWQgaW5zdGVhZC4KKwkgICAgIFNpbmNlIHdlIGRvbid0IGtub3cgd2hldGhlciB0aGUgdmFsdWUgaXMgcmVhbGx5IGludGVuZGVkIHRvCisJICAgICBiZSB1c2VkIGFzIGFuIGludGVnZXIgb3IgYSBjaGFyYWN0ZXIsIHByaW50IHRoZSBjaGFyYWN0ZXIKKwkgICAgIGVxdWl2YWxlbnQgYXMgd2VsbC4gKi8KKwkgIGlmIChUWVBFX0xFTkdUSCAodHlwZSkgPT0gMSkKKwkgICAgeworCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiICIsIHN0cmVhbSk7CisJICAgICAgTEFfUFJJTlRfQ0hBUiAoKHVuc2lnbmVkIGNoYXIpIHVucGFja19sb25nICh0eXBlLCB2YWxhZGRyICsgZW1iZWRkZWRfb2Zmc2V0KSwKKwkJCSAgICAgc3RyZWFtKTsKKwkgICAgfQorCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfQ0hBUjoKKyAgICAgIGZvcm1hdCA9IGZvcm1hdCA/IGZvcm1hdCA6IG91dHB1dF9mb3JtYXQ7CisgICAgICBpZiAoZm9ybWF0KQorCXsKKwkgIHByaW50X3NjYWxhcl9mb3JtYXR0ZWQgKHZhbGFkZHIgKyBlbWJlZGRlZF9vZmZzZXQsIHR5cGUsIGZvcm1hdCwgMCwgc3RyZWFtKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCBUWVBFX1VOU0lHTkVEICh0eXBlKSA/ICIldSIgOiAiJWQiLAorCQkJICAgIHVucGFja19sb25nICh0eXBlLCB2YWxhZGRyICsgZW1iZWRkZWRfb2Zmc2V0KSk7CisJICBmcHV0c19maWx0ZXJlZCAoIiAiLCBzdHJlYW0pOworCSAgTEFfUFJJTlRfQ0hBUiAoKHVuc2lnbmVkIGNoYXIpIHVucGFja19sb25nICh0eXBlLCB2YWxhZGRyICsgZW1iZWRkZWRfb2Zmc2V0KSwgc3RyZWFtKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX0ZMVDoKKyAgICAgIGlmIChmb3JtYXQpCisJeworCSAgcHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCAodmFsYWRkciArIGVtYmVkZGVkX29mZnNldCwgdHlwZSwgZm9ybWF0LCAwLCBzdHJlYW0pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwcmludF9mbG9hdGluZyAodmFsYWRkciArIGVtYmVkZGVkX29mZnNldCwgdHlwZSwgc3RyZWFtKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX01FVEhPRDoKKyAgICAgIGNwX3ByaW50X2NsYXNzX21ldGhvZCAodmFsYWRkciArIGVtYmVkZGVkX29mZnNldCwgbG9va3VwX3BvaW50ZXJfdHlwZSAodHlwZSksIHN0cmVhbSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX1ZPSUQ6CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJ2b2lkIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX0VSUk9SOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiPGVycm9yIHR5cGU+Iik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX1VOREVGOgorICAgICAgLyogVGhpcyBoYXBwZW5zICh3aXRob3V0IFRZUEVfRkxBR19TVFVCIHNldCkgb24gc3lzdGVtcyB3aGljaCBkb24ndCB1c2UKKwkgZGJ4IHhyZWZzIChOT19EQlhfWFJFRlMgaW4gZ2NjKSBpZiBhIGZpbGUgaGFzIGEgInN0cnVjdCBmb28gKmJhciIKKwkgYW5kIG5vIGNvbXBsZXRlIHR5cGUgZm9yIHN0cnVjdCBmb28gaW4gdGhhdCBmaWxlLiAgKi8KKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjxpbmNvbXBsZXRlIHR5cGU+Iik7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciAoIkludmFsaWQgQy9DKysgdHlwZSBjb2RlICVkIGluIHN5bWJvbCB0YWJsZS4iLCBUWVBFX0NPREUgKHR5cGUpKTsKKyAgICB9CisgIGdkYl9mbHVzaCAoc3RyZWFtKTsKKyAgcmV0dXJuICgwKTsKK30KKwwKK2ludAorY192YWx1ZV9wcmludCAodmFsLCBzdHJlYW0sIGZvcm1hdCwgcHJldHR5KQorICAgICB2YWx1ZV9wdHIgdmFsOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgZm9ybWF0OworICAgICBlbnVtIHZhbF9wcmV0dHlwcmludCBwcmV0dHk7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlID0gVkFMVUVfVFlQRSAodmFsKTsKKyAgc3RydWN0IHR5cGUgKiByZWFsX3R5cGU7CisgIGludCBmdWxsLCB0b3AsIHVzaW5nX2VuYzsKKyAKKyAgLyogSWYgaXQgaXMgYSBwb2ludGVyLCBpbmRpY2F0ZSB3aGF0IGl0IHBvaW50cyB0by4KKworICAgICBQcmludCB0eXBlIGFsc28gaWYgaXQgaXMgYSByZWZlcmVuY2UuCisKKyAgICAgQysrOiBpZiBpdCBpcyBhIG1lbWJlciBwb2ludGVyLCB3ZSB3aWxsIHRha2UgY2FyZQorICAgICBvZiB0aGF0IHdoZW4gd2UgcHJpbnQgaXQuICAqLworICBpZiAoVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfUFRSIHx8CisgICAgICBUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9SRUYpCisgICAgeworICAgICAgLyogSGFjazogIHJlbW92ZSAoY2hhciAqKSBmb3IgY2hhciBzdHJpbmdzLiAgVGhlaXIKKwkgdHlwZSBpcyBpbmRpY2F0ZWQgYnkgdGhlIHF1b3RlZCBzdHJpbmcgYW55d2F5LiAqLworICAgICAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1BUUiAmJgorCSAgVFlQRV9OQU1FICh0eXBlKSA9PSBOVUxMICYmCisJICBUWVBFX05BTUUgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKSAhPSBOVUxMICYmCisJICBTVFJFUSAoVFlQRV9OQU1FIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSksICJjaGFyIikpCisJeworCSAgLyogUHJpbnQgbm90aGluZyAqLworCX0KKyAgICAgIGVsc2UgaWYgKG9iamVjdHByaW50ICYmIChUWVBFX0NPREUgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKSA9PSBUWVBFX0NPREVfQ0xBU1MpKQorICAgICAgICB7CisgICAgICAgICAgLyogUG9pbnRlciB0byBjbGFzcywgY2hlY2sgcmVhbCB0eXBlIG9mIG9iamVjdCAqLworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKCIpOworICAgICAgICAgIHR5cGUgPSB2YWx1ZV9ydHRpX3RhcmdldF90eXBlICh2YWwsICZmdWxsLCAmdG9wLCAmdXNpbmdfZW5jKTsKKyAgICAgICAgICBpZiAodHlwZSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFJUVEkgZW50cnkgZm91bmQgKi8KKyAgICAgICAgICAgICAgdHlwZSA9IGxvb2t1cF9wb2ludGVyX3R5cGUgKHR5cGUpOworICAgICAgICAgICAgICB0eXBlX3ByaW50ICh0eXBlLCAiIiwgc3RyZWFtLCAtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBObyBSVFRJIGZpZWxkcywgZG8gd2hhdGV2ZXIgd2UgY2FuICovCisgICAgICAgICAgICAgIHR5cGUgPSBWQUxVRV9FTkNMT1NJTkdfVFlQRSAodmFsKTsKKyAgICAgICAgICAgICAgdHlwZV9wcmludCAodHlwZSwgIiIsIHN0cmVhbSwgLTEpOworICAgICAgICAgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIgPyIpOworICAgICAgICAgICAgfQorCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKSAiKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorCXsKKyAgICAgICAgICAvKiBub3JtYWwgY2FzZSAqLyAKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIigiKTsKKwkgIHR5cGVfcHJpbnQgKHR5cGUsICIiLCBzdHJlYW0sIC0xKTsKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIikgIik7CisJfQorICAgIH0KKyAgaWYgKG9iamVjdHByaW50ICYmIChUWVBFX0NPREUgKFZBTFVFX1RZUEUgKHZhbCkpID09IFRZUEVfQ09ERV9DTEFTUykpCisgICAgeworICAgICAgLyogQXR0ZW1wdCB0byBkZXRlcm1pbmUgcmVhbCB0eXBlIG9mIG9iamVjdCAqLworICAgICAgcmVhbF90eXBlID0gdmFsdWVfcnR0aV90eXBlICh2YWwsICZmdWxsLCAmdG9wLCAmdXNpbmdfZW5jKTsKKyAgICAgIGlmIChyZWFsX3R5cGUpIAorICAgICAgICB7CisgICAgICAgICAgLyogV2UgaGF2ZSBSVFRJIGluZm9ybWF0aW9uLCBzbyB1c2UgaXQgKi8KKyAgICAgICAgICB2YWwgPSB2YWx1ZV9mdWxsX29iamVjdCAodmFsLCByZWFsX3R5cGUsIGZ1bGwsIHRvcCwgdXNpbmdfZW5jKTsKKyAgICAgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIoJXMlcykgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX05BTUUgKHJlYWxfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbCA/ICIiIDogIiBbaW5jb21wbGV0ZSBvYmplY3RdIik7CisgICAgICAgICAgLyogUHJpbnQgb3V0IG9iamVjdDogZW5jbG9zaW5nIHR5cGUgaXMgc2FtZSBhcyByZWFsX3R5cGUgaWYgZnVsbCAqLworICAgICAgICAgIHJldHVybiB2YWxfcHJpbnQgKFZBTFVFX0VOQ0xPU0lOR19UWVBFICh2YWwpLCBWQUxVRV9DT05URU5UU19BTEwgKHZhbCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfQUREUkVTUyAodmFsKSwgc3RyZWFtLCBmb3JtYXQsIDEsIDAsIHByZXR0eSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHR5cGUgIT0gVkFMVUVfRU5DTE9TSU5HX1RZUEUgKHZhbCkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBObyBSVFRJIGluZm9ybWF0aW9uLCBzbyBsZXQncyBkbyBvdXIgYmVzdCAqLworICAgICAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiglcyA/KSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfTkFNRSAoVkFMVUVfRU5DTE9TSU5HX1RZUEUgKHZhbCkpKTsKKyAgICAgICAgICByZXR1cm4gdmFsX3ByaW50IChWQUxVRV9FTkNMT1NJTkdfVFlQRSAodmFsKSwgVkFMVUVfQ09OVEVOVFNfQUxMICh2YWwpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX0FERFJFU1MgKHZhbCksIHN0cmVhbSwgZm9ybWF0LCAxLCAwLCBwcmV0dHkpOworICAgICAgICB9CisgICAgICAvKiBPdGhlcndpc2UsIHdlIGVuZCB1cCBhdCB0aGUgcmV0dXJuIG91dHNpZGUgdGhpcyAiaWYiICovCisgICAgfQorICAKKyAgIHJldHVybiB2YWxfcHJpbnQgKHR5cGUsIFZBTFVFX0NPTlRFTlRTX0FMTCAodmFsKSwgVkFMVUVfRU1CRURERURfT0ZGU0VUICh2YWwpLAorCQkgICAgVkFMVUVfQUREUkVTUyAodmFsKSwKKwkJICAgIHN0cmVhbSwgZm9ybWF0LCAxLCAwLCBwcmV0dHkpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2NhbGwtY21kcy5oIGIvZ2RiL2NhbGwtY21kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMDIwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY2FsbC1jbWRzLmgKQEAgLTAsMCArMSwyOCBAQAorLyogUHJvdG90eXBlcyBmb3IgR0RCIGNvbW1hbmRzIHRoYXQgYXJlIGNhbGxlZCBpbnRlcm5hbGx5IGJ5IG90aGVyIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCitleHRlcm4gdm9pZAoraW5pdGlhbGl6ZV9hbGxfZmlsZXMgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZAorZXhlY19maWxlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworZXh0ZXJuIHZvaWQKK2NvcmVfZmlsZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK2V4dGVybiB2b2lkCiticmVha19jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CmRpZmYgLS1naXQgYS9nZGIvY2gtZXhwLmMgYi9nZGIvY2gtZXhwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0MzZhMwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jaC1leHAuYwpAQCAtMCwwICsxLDIxNjkgQEAKKy8qIFBhcnNlciBmb3IgR05VIENISUxMIChDQ0lUVCBIaWdoLUxldmVsIExhbmd1YWdlKSAgLSotIEMgLSotCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogUGFyc2UgYSBDaGlsbCBleHByZXNzaW9uIGZyb20gdGV4dCBpbiBhIHN0cmluZywKKyAgIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhICBzdHJ1Y3QgZXhwcmVzc2lvbiAgcG9pbnRlci4KKyAgIFRoYXQgc3RydWN0dXJlIGNvbnRhaW5zIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBpbiByZXZlcnNlIHBvbGlzaCwKKyAgIHdpdGggY29uc3RhbnRzIHJlcHJlc2VudGVkIGJ5IG9wZXJhdGlvbnMgdGhhdCBhcmUgZm9sbG93ZWQgYnkgc3BlY2lhbCBkYXRhLgorICAgU2VlIGV4cHJlc3Npb24uaCBmb3IgdGhlIGRldGFpbHMgb2YgdGhlIGZvcm1hdC4KKyAgIFdoYXQgaXMgaW1wb3J0YW50IGhlcmUgaXMgdGhhdCBpdCBjYW4gYmUgYnVpbHQgdXAgc2VxdWVudGlhbGx5CisgICBkdXJpbmcgdGhlIHByb2Nlc3Mgb2YgcGFyc2luZzsgdGhlIGxvd2VyIGxldmVscyBvZiB0aGUgdHJlZSBhbHdheXMKKyAgIGNvbWUgZmlyc3QgaW4gdGhlIHJlc3VsdC4KKworICAgTm90ZSB0aGF0IHRoZSBsYW5ndWFnZSBhY2NlcHRlZCBieSB0aGlzIHBhcnNlciBpcyBtb3JlIGxpYmVyYWwKKyAgIHRoYW4gdGhlIG9uZSBhY2NlcHRlZCBieSBhbiBhY3R1YWwgQ2hpbGwgY29tcGlsZXIuICBGb3IgZXhhbXBsZSwgdGhlCisgICBsYW5ndWFnZSBydWxlIHRoYXQgYSBzaW1wbGUgbmFtZSBzdHJpbmcgY2FuIG5vdCBiZSBvbmUgb2YgdGhlIHJlc2VydmVkCisgICBzaW1wbGUgbmFtZSBzdHJpbmdzIGlzIG5vdCBlbmZvcmNlZCAoZS5nICJjYXNlIiBpcyBub3QgdHJlYXRlZCBhcyBhCisgICByZXNlcnZlZCBuYW1lKS4gIEFub3RoZXIgZXhhbXBsZSBpcyB0aGF0IENoaWxsIGlzIGEgc3Ryb25nbHkgdHlwZWQKKyAgIGxhbmd1YWdlLCBhbmQgY2VydGFpbiBleHByZXNzaW9ucyB0aGF0IHZpb2xhdGUgdGhlIHR5cGUgY29uc3RyYWludHMKKyAgIG1heSBzdGlsbCBiZSBldmFsdWF0ZWQgaWYgZ2RiIGNhbiBkbyBzbyBpbiBhIG1lYW5pbmdmdWwgbWFubmVyLCB3aGlsZQorICAgc3VjaCBleHByZXNzaW9ucyB3b3VsZCBiZSByZWplY3RlZCBieSB0aGUgY29tcGlsZXIuICBUaGUgcmVhc29uIGZvcgorICAgdGhpcyBtb3JlIGxpYmVyYWwgYmVoYXZpb3IgaXMgdGhlIHBoaWxvc29waHkgdGhhdCB0aGUgZGVidWdnZXIKKyAgIGlzIGludGVuZGVkIHRvIGJlIGEgdG9vbCB0aGF0IGlzIHVzZWQgYnkgdGhlIHByb2dyYW1tZXIgd2hlbiB0aGluZ3MKKyAgIGdvIHdyb25nLCBhbmQgYXMgc3VjaCwgaXQgc2hvdWxkIHByb3ZpZGUgYXMgZmV3IGFydGlmaWNpYWwgYmFycmllcnMKKyAgIHRvIGl0J3MgdXNlIGFzIHBvc3NpYmxlLiAgSWYgaXQgY2FuIGRvIHNvbWV0aGluZyBtZWFuaW5nZnVsLCBldmVuCisgICBzb21ldGhpbmcgdGhhdCB2aW9sYXRlcyBsYW5ndWFnZSBjb250cmFpbnRzIHRoYXQgYXJlIGVuZm9yY2VkIGJ5IHRoZQorICAgY29tcGlsZXIsIGl0IHNob3VsZCBkbyBzbyB3aXRob3V0IGNvbXBsYWludC4KKworICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJwYXJzZXItZGVmcy5oIgorI2luY2x1ZGUgImNoLWxhbmcuaCIKKyNpbmNsdWRlICJiZmQuaCIgLyogUmVxdWlyZWQgYnkgb2JqZmlsZXMuaC4gICovCisjaW5jbHVkZSAic3ltZmlsZS5oIiAvKiBSZXF1aXJlZCBieSBvYmpmaWxlcy5oLiAgKi8KKyNpbmNsdWRlICJvYmpmaWxlcy5oIiAvKiBGb3IgaGF2ZV9mdWxsX3N5bWJvbHMgYW5kIGhhdmVfcGFydGlhbF9zeW1ib2xzICovCisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXworI2VuZGlmCisKK3R5cGVkZWYgdW5pb24KKworICB7CisgICAgTE9OR0VTVCBsdmFsOworICAgIFVMT05HRVNUIHVsdmFsOworICAgIHN0cnVjdCB7CisgICAgICBMT05HRVNUIHZhbDsKKyAgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgIH0gdHlwZWRfdmFsOworICAgIGRvdWJsZSBkdmFsOworICAgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgICBzdHJ1Y3QgdHlwZSAqdHZhbDsKKyAgICBzdHJ1Y3Qgc3Rva2VuIHN2YWw7CisgICAgc3RydWN0IHR0eXBlIHRzeW07CisgICAgc3RydWN0IHN5bXRva2VuIHNzeW07CisgIH1ZWVNUWVBFOworCitlbnVtIGNoX3Rlcm1pbmFsIHsKKyAgRU5EX1RPS0VOID0gMCwKKyAgLyogJ1wwMDEnIC4uLiAnXHhmZicgY29tZSBmaXJzdC4gKi8KKyAgT1BFTl9QQVJFTiA9ICcoJywKKyAgVE9LRU5fTk9UX1JFQUQgPSA5OTksCisgIElOVEVHRVJfTElURVJBTCwKKyAgQk9PTEVBTl9MSVRFUkFMLAorICBDSEFSQUNURVJfTElURVJBTCwKKyAgRkxPQVRfTElURVJBTCwKKyAgR0VORVJBTF9QUk9DRURVUkVfTkFNRSwKKyAgTE9DQVRJT05fTkFNRSwKKyAgRU1QVElORVNTX0xJVEVSQUwsCisgIENIQVJBQ1RFUl9TVFJJTkdfTElURVJBTCwKKyAgQklUX1NUUklOR19MSVRFUkFMLAorICBUWVBFTkFNRSwKKyAgRE9UX0ZJRUxEX05BTUUsIC8qICcuJyBmb2xsb3dlZCBieSA8ZmllbGQgbmFtZT4gKi8KKyAgQ0FTRSwKKyAgT0YsCisgIEVTQUMsCisgIExPR0lPUiwKKyAgT1JJRiwKKyAgTE9HWE9SLAorICBMT0dBTkQsCisgIEFORElGLAorICBOT1RFUVVBTCwKKyAgR0VRLAorICBMRVEsCisgIElOLAorICBTTEFTSF9TTEFTSCwKKyAgTU9ELAorICBSRU0sCisgIE5PVCwKKyAgUE9JTlRFUiwKKyAgUkVDRUlWRSwKKyAgVVAsCisgIElGLAorICBUSEVOLAorICBFTFNFLAorICBGSSwKKyAgRUxTSUYsCisgIElMTEVHQUxfVE9LRU4sCisgIE5VTSwKKyAgUFJFRCwKKyAgU1VDQywKKyAgQUJTLAorICBDQVJELAorICBNQVhfVE9LRU4sCisgIE1JTl9UT0tFTiwKKyAgQUREUl9UT0tFTiwKKyAgU0laRSwKKyAgVVBQRVIsCisgIExPV0VSLAorICBMRU5HVEgsCisgIEFSUkFZLAorICBHREJfVkFSSUFCTEUsCisgIEdEQl9BU1NJR05NRU5UCit9OworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gKi8KKworc3RhdGljIHZvaWQgd3JpdGVfbG93ZXJfdXBwZXJfdmFsdWUgUEFSQU1TICgoZW51bSBleHBfb3Bjb2RlLCBzdHJ1Y3QgdHlwZSAqKSk7CitzdGF0aWMgZW51bSBjaF90ZXJtaW5hbCBtYXRjaF9iaXRzdHJpbmdfbGl0ZXJhbCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgZW51bSBjaF90ZXJtaW5hbCBtYXRjaF9pbnRlZ2VyX2xpdGVyYWwgUEFSQU1TICgodm9pZCkpOworc3RhdGljIGVudW0gY2hfdGVybWluYWwgbWF0Y2hfY2hhcmFjdGVyX2xpdGVyYWwgUEFSQU1TICgodm9pZCkpOworc3RhdGljIGVudW0gY2hfdGVybWluYWwgbWF0Y2hfc3RyaW5nX2xpdGVyYWwgUEFSQU1TICgodm9pZCkpOworc3RhdGljIGVudW0gY2hfdGVybWluYWwgbWF0Y2hfZmxvYXRfbGl0ZXJhbCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgZW51bSBjaF90ZXJtaW5hbCBtYXRjaF9mbG9hdF9saXRlcmFsIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBpbnQgZGVjb2RlX2ludGVnZXJfbGl0ZXJhbCBQQVJBTVMgKChMT05HRVNUICosIGNoYXIgKiopKTsKK3N0YXRpYyBpbnQgZGVjb2RlX2ludGVnZXJfdmFsdWUgUEFSQU1TICgoaW50LCBjaGFyICoqLCBMT05HRVNUICopKTsKK3N0YXRpYyBjaGFyICptYXRjaF9zaW1wbGVfbmFtZV9zdHJpbmcgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgZ3Jvd2J1Zl9ieV9zaXplIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcGFyc2VfdW50eXBlZF9leHByIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHBhcnNlX2lmX2V4cHJlc3Npb24gUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgcGFyc2VfZWxzZV9hbHRlcm5hdGl2ZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBwYXJzZV90aGVuX2FsdGVybmF0aXZlIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHBhcnNlX2V4cHIgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgcGFyc2Vfb3BlcmFuZDAgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgcGFyc2Vfb3BlcmFuZDEgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgcGFyc2Vfb3BlcmFuZDIgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgcGFyc2Vfb3BlcmFuZDMgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgcGFyc2Vfb3BlcmFuZDQgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgcGFyc2Vfb3BlcmFuZDUgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgcGFyc2Vfb3BlcmFuZDYgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgcGFyc2VfcHJpbXZhbCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBwYXJzZV90dXBsZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKSk7CitzdGF0aWMgdm9pZCBwYXJzZV9vcHRfZWxlbWVudF9saXN0IFBBUkFNUyAoKHN0cnVjdCB0eXBlICopKTsKK3N0YXRpYyB2b2lkIHBhcnNlX3R1cGxlX2VsZW1lbnQgUEFSQU1TICgoc3RydWN0IHR5cGUgKikpOworc3RhdGljIHZvaWQgcGFyc2VfbmFtZWRfcmVjb3JkX2VsZW1lbnQgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgcGFyc2VfY2FsbCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgc3RydWN0IHR5cGUgKnBhcnNlX21vZGVfb3Jfbm9ybWFsX2NhbGwgUEFSQU1TICgodm9pZCkpOworI2lmIDAKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqcGFyc2VfbW9kZV9jYWxsIFBBUkFNUyAoKHZvaWQpKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgcGFyc2VfdW5hcnlfY2FsbCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgaW50IHBhcnNlX29wdF91bnR5cGVkX2V4cHIgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgcGFyc2VfY2FzZV9sYWJlbCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgaW50IGV4cGVjdCBQQVJBTVMgKChlbnVtIGNoX3Rlcm1pbmFsLCBjaGFyICopKTsKK3N0YXRpYyB2b2lkIHBhcnNlX2V4cHIgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgcGFyc2VfcHJpbXZhbCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBwYXJzZV91bnR5cGVkX2V4cHIgUEFSQU1TICgodm9pZCkpOworc3RhdGljIGludCBwYXJzZV9vcHRfdW50eXBlZF9leHByIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHBhcnNlX2lmX2V4cHJlc3Npb25fYm9keSBQQVJBTVMoKHZvaWQpKTsKK3N0YXRpYyBlbnVtIGNoX3Rlcm1pbmFsIGNoX2xleCBQQVJBTVMgKCh2b2lkKSk7CitJTkxJTkUgc3RhdGljIGVudW0gY2hfdGVybWluYWwgUEVFS19UT0tFTiBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgZW51bSBjaF90ZXJtaW5hbCBwZWVrX3Rva2VuXyBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB2b2lkIGZvcndhcmRfdG9rZW5fIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHJlcXVpcmUgUEFSQU1TICgoZW51bSBjaF90ZXJtaW5hbCkpOworc3RhdGljIGludCBjaGVja190b2tlbiBQQVJBTVMgKChlbnVtIGNoX3Rlcm1pbmFsKSk7CisKKyNkZWZpbmUgTUFYX0xPT0tfQUhFQUQgMgorc3RhdGljIGVudW0gY2hfdGVybWluYWwgdGVybWluYWxfYnVmZmVyW01BWF9MT09LX0FIRUFEKzFdID0geworICBUT0tFTl9OT1RfUkVBRCwgVE9LRU5fTk9UX1JFQUQsIFRPS0VOX05PVF9SRUFEfTsKK3N0YXRpYyBZWVNUWVBFIHl5bHZhbDsKK3N0YXRpYyBZWVNUWVBFIHZhbF9idWZmZXJbTUFYX0xPT0tfQUhFQUQrMV07CisKKy8qaW50IGN1cnJlbnRfdG9rZW4sIGxvb2thaGVhZF90b2tlbjsqLworCitJTkxJTkUgc3RhdGljIGVudW0gY2hfdGVybWluYWwKK1BFRUtfVE9LRU4oKQoreworICBpZiAodGVybWluYWxfYnVmZmVyWzBdID09IFRPS0VOX05PVF9SRUFEKQorICAgIHsKKyAgICAgIHRlcm1pbmFsX2J1ZmZlclswXSA9IGNoX2xleCAoKTsKKyAgICAgIHZhbF9idWZmZXJbMF0gPSB5eWx2YWw7CisgICAgfQorICByZXR1cm4gdGVybWluYWxfYnVmZmVyWzBdOworfQorI2RlZmluZSBQRUVLX0xWQUwoKSB2YWxfYnVmZmVyWzBdCisjZGVmaW5lIFBFRUtfVE9LRU4xKCkgcGVla190b2tlbl8oMSkKKyNkZWZpbmUgUEVFS19UT0tFTjIoKSBwZWVrX3Rva2VuXygyKQorc3RhdGljIGVudW0gY2hfdGVybWluYWwKK3BlZWtfdG9rZW5fIChpKQorICAgICBpbnQgaTsKK3sKKyAgaWYgKGkgPiBNQVhfTE9PS19BSEVBRCkKKyAgICBmYXRhbCAoImludGVybmFsIGVycm9yIC0gdG9vIG11Y2ggbG9va2FoZWFkIik7CisgIGlmICh0ZXJtaW5hbF9idWZmZXJbaV0gPT0gVE9LRU5fTk9UX1JFQUQpCisgICAgeworICAgICAgdGVybWluYWxfYnVmZmVyW2ldID0gY2hfbGV4ICgpOworICAgICAgdmFsX2J1ZmZlcltpXSA9IHl5bHZhbDsKKyAgICB9CisgIHJldHVybiB0ZXJtaW5hbF9idWZmZXJbaV07Cit9CisKKyNpZiAwCisKK3N0YXRpYyB2b2lkCitwdXNoYmFja190b2tlbiAoY29kZSwgbm9kZSkKKyAgICAgZW51bSBjaF90ZXJtaW5hbCBjb2RlOworICAgICBZWVNUWVBFIG5vZGU7Cit7CisgIGludCBpOworICBpZiAodGVybWluYWxfYnVmZmVyW01BWF9MT09LX0FIRUFEXSAhPSBUT0tFTl9OT1RfUkVBRCkKKyAgICBmYXRhbCAoImludGVybmFsIGVycm9yIC0gY2Fubm90IHB1c2hiYWNrIHRva2VuIik7CisgIGZvciAoaSA9IE1BWF9MT09LX0FIRUFEOyBpID4gMDsgaS0tKQorICAgIHsgCisgICAgICB0ZXJtaW5hbF9idWZmZXJbaV0gPSB0ZXJtaW5hbF9idWZmZXJbaSAtIDFdOyAKKyAgICAgIHZhbF9idWZmZXJbaV0gPSB2YWxfYnVmZmVyW2kgLSAxXTsKKyAgfQorICB0ZXJtaW5hbF9idWZmZXJbMF0gPSBjb2RlOworICB2YWxfYnVmZmVyWzBdID0gbm9kZTsKK30KKworI2VuZGlmCisKK3N0YXRpYyB2b2lkCitmb3J3YXJkX3Rva2VuXygpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0xPT0tfQUhFQUQ7IGkrKykKKyAgICB7CisgICAgICB0ZXJtaW5hbF9idWZmZXJbaV0gPSB0ZXJtaW5hbF9idWZmZXJbaSsxXTsKKyAgICAgIHZhbF9idWZmZXJbaV0gPSB2YWxfYnVmZmVyW2krMV07CisgICAgfQorICB0ZXJtaW5hbF9idWZmZXJbTUFYX0xPT0tfQUhFQURdID0gVE9LRU5fTk9UX1JFQUQ7Cit9CisjZGVmaW5lIEZPUldBUkRfVE9LRU4oKSBmb3J3YXJkX3Rva2VuXygpCisKKy8qIFNraXAgdGhlIG5leHQgdG9rZW4uCisgICBpZiBpdCBpc24ndCBUT0tFTiwgdGhlIHBhcnNlciBpcyBicm9rZW4uICovCisKK3N0YXRpYyB2b2lkCityZXF1aXJlKHRva2VuKQorICAgICBlbnVtIGNoX3Rlcm1pbmFsIHRva2VuOworeworICBpZiAoUEVFS19UT0tFTigpICE9IHRva2VuKQorICAgIHsKKyAgICAgIGNoYXIgYnVmWzgwXTsKKyAgICAgIHNwcmludGYgKGJ1ZiwgImludGVybmFsIHBhcnNlciBlcnJvciAtIGV4cGVjdGVkIHRva2VuICVkIiwgKGludCl0b2tlbik7CisgICAgICBmYXRhbChidWYpOworICAgIH0KKyAgRk9SV0FSRF9UT0tFTigpOworfQorCitzdGF0aWMgaW50CitjaGVja190b2tlbiAodG9rZW4pCisgICAgIGVudW0gY2hfdGVybWluYWwgdG9rZW47Cit7CisgIGlmIChQRUVLX1RPS0VOKCkgIT0gdG9rZW4pCisgICAgcmV0dXJuIDA7CisgIEZPUldBUkRfVE9LRU4gKCk7CisgIHJldHVybiAxOworfQorCisvKiByZXR1cm4gMCBpZiBleHBlY3RlZCB0b2tlbiB3YXMgbm90IGZvdW5kLAorICAgZWxzZSByZXR1cm4gMS4KKyovCitzdGF0aWMgaW50CitleHBlY3QgKHRva2VuLCBtZXNzYWdlKQorICAgICBlbnVtIGNoX3Rlcm1pbmFsIHRva2VuOworICAgICBjaGFyICptZXNzYWdlOworeworICBpZiAoUEVFS19UT0tFTigpICE9IHRva2VuKQorICAgIHsKKyAgICAgIGlmIChtZXNzYWdlKQorCWVycm9yIChtZXNzYWdlKTsKKyAgICAgIGVsc2UgaWYgKHRva2VuIDwgMjU2KQorCWVycm9yICgic3ludGF4IGVycm9yIC0gZXhwZWN0ZWQgYSAnJWMnIGhlcmUgXCIlc1wiIiwgdG9rZW4sIGxleHB0cik7CisgICAgICBlbHNlCisJZXJyb3IgKCJzeW50YXggZXJyb3IiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZQorICAgIEZPUldBUkRfVE9LRU4oKTsKKyAgcmV0dXJuIDE7Cit9CisKKyNpZiAwCitzdGF0aWMgdHJlZQorcGFyc2Vfb3B0X25hbWVfc3RyaW5nIChhbGxvd19hbGwpCisgICAgIGludCBhbGxvd19hbGw7IC8qIDEgaWYgQUxMIGlzIGFsbG93ZWQgYXMgYSBwb3N0Zml4ICovCit7CisgIGludCB0b2tlbiA9IFBFRUtfVE9LRU4oKTsKKyAgdHJlZSBuYW1lOworICBpZiAodG9rZW4gIT0gTkFNRSkKKyAgICB7CisgICAgICBpZiAodG9rZW4gPT0gQUxMICYmIGFsbG93X2FsbCkKKwl7CisJICBGT1JXQVJEX1RPS0VOICgpOworCSAgcmV0dXJuIEFMTF9QT1NURklYOworCX0KKyAgICAgIHJldHVybiBOVUxMX1RSRUU7CisgICAgfQorICBuYW1lID0gUEVFS19MVkFMKCk7CisgIGZvciAoOzspCisgICAgeworICAgICAgRk9SV0FSRF9UT0tFTiAoKTsKKyAgICAgIHRva2VuID0gUEVFS19UT0tFTigpOworICAgICAgaWYgKHRva2VuICE9ICchJykKKwlyZXR1cm4gbmFtZTsKKyAgICAgIEZPUldBUkRfVE9LRU4oKTsKKyAgICAgIHRva2VuID0gUEVFS19UT0tFTigpOworICAgICAgaWYgKHRva2VuID09IEFMTCAmJiBhbGxvd19hbGwpCisJcmV0dXJuIGdldF9pZGVudGlmaWVyMyhJREVOVElGSUVSX1BPSU5URVIgKG5hbWUpLCAiISIsICIqIik7CisgICAgICBpZiAodG9rZW4gIT0gTkFNRSkKKwl7CisJICBpZiAocGFzcyA9PSAxKQorCSAgICBlcnJvciAoIiclcyEnIGlzIG5vdCBmb2xsb3dlZCBieSBhbiBpZGVudGlmaWVyIiwKKwkJICAgSURFTlRJRklFUl9QT0lOVEVSIChuYW1lKSk7CisJICByZXR1cm4gbmFtZTsKKwl9CisgICAgICBuYW1lID0gZ2V0X2lkZW50aWZpZXIzKElERU5USUZJRVJfUE9JTlRFUihuYW1lKSwKKwkJCSAgICAgIiEiLCBJREVOVElGSUVSX1BPSU5URVIoUEVFS19MVkFMKCkpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB0cmVlCitwYXJzZV9zaW1wbGVfbmFtZV9zdHJpbmcgKCkKK3sKKyAgaW50IHRva2VuID0gUEVFS19UT0tFTigpOworICB0cmVlIG5hbWU7CisgIGlmICh0b2tlbiAhPSBOQU1FKQorICAgIHsKKyAgICAgIGVycm9yICgiZXhwZWN0ZWQgYSBuYW1lIGhlcmUiKTsKKyAgICAgIHJldHVybiBlcnJvcl9tYXJrX25vZGU7CisgICAgfQorICBuYW1lID0gUEVFS19MVkFMICgpOworICBGT1JXQVJEX1RPS0VOICgpOworICByZXR1cm4gbmFtZTsKK30KKworc3RhdGljIHRyZWUKK3BhcnNlX25hbWVfc3RyaW5nICgpCit7CisgIHRyZWUgbmFtZSA9IHBhcnNlX29wdF9uYW1lX3N0cmluZyAoMCk7CisgIGlmIChuYW1lKQorICAgIHJldHVybiBuYW1lOworICBpZiAocGFzcyA9PSAxKQorICAgIGVycm9yICgiZXhwZWN0ZWQgYSBuYW1lIHN0cmluZyBoZXJlIik7CisgIHJldHVybiBlcnJvcl9tYXJrX25vZGU7Cit9CisKKy8qIE1hdGNoZXM6IDxuYW1lX3N0cmluZz4KKyAgIFJldHVybnMgaWYgcGFzcyAxOiB0aGUgaWRlbnRpZmllci4KKyAgIFJldHVybnMgaWYgcGFzcyAyOiBhIGRlY2wgb3IgdmFsdWUgZm9yIGlkZW50aWZpZXIuICovCisKK3N0YXRpYyB0cmVlCitwYXJzZV9uYW1lICgpCit7CisgIHRyZWUgbmFtZSA9IHBhcnNlX25hbWVfc3RyaW5nICgpOworICBpZiAocGFzcyA9PSAxIHx8IGlnbm9yaW5nKQorICAgIHJldHVybiBuYW1lOworICBlbHNlCisgICAgeworICAgICAgdHJlZSBkZWNsID0gbG9va3VwX25hbWUgKG5hbWUpOworICAgICAgaWYgKGRlY2wgPT0gTlVMTF9UUkVFKQorCXsKKwkgIGVycm9yICgiYCVzJyB1bmRlY2xhcmVkIiwgSURFTlRJRklFUl9QT0lOVEVSIChuYW1lKSk7CisJICByZXR1cm4gZXJyb3JfbWFya19ub2RlOworCX0KKyAgICAgIGVsc2UgaWYgKFRSRUVfQ09ERSAoVFJFRV9UWVBFIChkZWNsKSkgPT0gRVJST1JfTUFSSykKKwlyZXR1cm4gZXJyb3JfbWFya19ub2RlOworICAgICAgZWxzZSBpZiAoVFJFRV9DT0RFIChkZWNsKSA9PSBDT05TVF9ERUNMKQorCXJldHVybiBERUNMX0lOSVRJQUwgKGRlY2wpOworICAgICAgZWxzZSBpZiAoVFJFRV9DT0RFIChUUkVFX1RZUEUgKGRlY2wpKSA9PSBSRUZFUkVOQ0VfVFlQRSkKKwlyZXR1cm4gY29udmVydF9mcm9tX3JlZmVyZW5jZSAoZGVjbCk7CisgICAgICBlbHNlCisJcmV0dXJuIGRlY2w7CisgICAgfSAKK30KKyNlbmRpZgorCisjaWYgMAorc3RhdGljIHZvaWQKK3B1c2hiYWNrX3BhcmVuX2V4cHIgKGV4cHIpCisgICAgIHRyZWUgZXhwcjsKK3sKKyAgaWYgKHBhc3MgPT0gMSAmJiAhaWdub3JpbmcpCisgICAgZXhwciA9IGJ1aWxkMSAoUEFSRU5fRVhQUiwgTlVMTF9UUkVFLCBleHByKTsKKyAgcHVzaGJhY2tfdG9rZW4gKEVYUFIsIGV4cHIpOworfQorI2VuZGlmCisKKy8qIE1hdGNoZXM6IDxjYXNlIGxhYmVsPiAqLworCitzdGF0aWMgdm9pZAorcGFyc2VfY2FzZV9sYWJlbCAoKQoreworICBpZiAoY2hlY2tfdG9rZW4gKEVMU0UpKQorICAgIGVycm9yICgiRUxTRSBpbiB0dXBsZXMgbGFiZWxzIG5vdCBpbXBsZW1lbnRlZCIpOworICAvKiBEb2VzIG5vdCBoYW5kbGUgdGhlIGNhc2Ugb2YgYSBtb2RlIG5hbWUuICBGSVhNRSAqLworICBwYXJzZV9leHByICgpOworICBpZiAoY2hlY2tfdG9rZW4gKCc6JykpCisgICAgeworICAgICAgcGFyc2VfZXhwciAoKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9SQU5HRSk7CisgICAgfQorfQorCitzdGF0aWMgaW50CitwYXJzZV9vcHRfdW50eXBlZF9leHByICgpCit7CisgIHN3aXRjaCAoUEVFS19UT0tFTiAoKSkKKyAgICB7CisgICAgY2FzZSAnLCc6CisgICAgY2FzZSAnOic6CisgICAgY2FzZSAnKSc6CisgICAgICByZXR1cm4gMDsKKyAgICBkZWZhdWx0OgorICAgICAgcGFyc2VfdW50eXBlZF9leHByICgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcGFyc2VfdW5hcnlfY2FsbCAoKQoreworICBGT1JXQVJEX1RPS0VOICgpOworICBleHBlY3QgKCcoJywgTlVMTCk7CisgIHBhcnNlX2V4cHIgKCk7CisgIGV4cGVjdCAoJyknLCBOVUxMKTsKK30KKworLyogUGFyc2UgTkFNRSAnKCcgTU9ERU5BTUUgJyknLiAqLworCisjaWYgMAorCitzdGF0aWMgc3RydWN0IHR5cGUgKgorcGFyc2VfbW9kZV9jYWxsICgpCit7CisgIHN0cnVjdCB0eXBlICp0eXBlOworICBGT1JXQVJEX1RPS0VOICgpOworICBleHBlY3QgKCcoJywgTlVMTCk7CisgIGlmIChQRUVLX1RPS0VOICgpICE9IFRZUEVOQU1FKQorICAgIGVycm9yICgiZXhwZWN0IE1PREVOQU1FIGhlcmUgYCVzJyIsIGxleHB0cik7CisgIHR5cGUgPSBQRUVLX0xWQUwoKS50c3ltLnR5cGU7CisgIEZPUldBUkRfVE9LRU4gKCk7CisgIGV4cGVjdCAoJyknLCBOVUxMKTsKKyAgcmV0dXJuIHR5cGU7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHR5cGUgKgorcGFyc2VfbW9kZV9vcl9ub3JtYWxfY2FsbCAoKQoreworICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgRk9SV0FSRF9UT0tFTiAoKTsKKyAgZXhwZWN0ICgnKCcsIE5VTEwpOworICBpZiAoUEVFS19UT0tFTiAoKSA9PSBUWVBFTkFNRSkKKyAgICB7CisgICAgICB0eXBlID0gUEVFS19MVkFMKCkudHN5bS50eXBlOworICAgICAgRk9SV0FSRF9UT0tFTiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwYXJzZV9leHByICgpOworICAgICAgdHlwZSA9IE5VTEw7CisgICAgfQorICBleHBlY3QgKCcpJywgTlVMTCk7CisgIHJldHVybiB0eXBlOworfQorCisvKiBQYXJzZSBzb21ldGhpbmcgdGhhdCBsb29rcyBsaWtlIGEgZnVuY3Rpb24gY2FsbC4KKyAgIEFzc3VtZSB3ZSBoYXZlIHBhcnNlZCB0aGUgZnVuY3Rpb24sIGFuZCBhcmUgYXQgdGhlICcoJy4gKi8KKworc3RhdGljIHZvaWQKK3BhcnNlX2NhbGwgKCkKK3sKKyAgaW50IGFyZ19jb3VudDsKKyAgcmVxdWlyZSAoJygnKTsKKyAgLyogVGhpcyBpcyB0byBzYXZlIHRoZSB2YWx1ZSBvZiBhcmdsaXN0X2xlbgorICAgICBiZWluZyBhY2N1bXVsYXRlZCBmb3IgZWFjaCBkaW1lbnNpb24uICovCisgIHN0YXJ0X2FyZ2xpc3QgKCk7CisgIGlmIChwYXJzZV9vcHRfdW50eXBlZF9leHByICgpKQorICAgIHsKKyAgICAgIGludCB0b2sgPSBQRUVLX1RPS0VOICgpOworICAgICAgYXJnbGlzdF9sZW4gPSAxOworICAgICAgaWYgKHRvayA9PSBVUCB8fCB0b2sgPT0gJzonKQorCXsKKwkgIEZPUldBUkRfVE9LRU4gKCk7CisJICBwYXJzZV9leHByICgpOworCSAgZXhwZWN0ICgnKScsICJleHBlY3RlZCAnKScgdG8gdGVybWluYXRlIHNsaWNlIik7CisJICBlbmRfYXJnbGlzdCAoKTsKKwkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlICh0b2sgPT0gVVAgPyBURVJOT1BfU0xJQ0VfQ09VTlQKKwkJCQk6IFRFUk5PUF9TTElDRSk7CisJICByZXR1cm47CisJfQorICAgICAgd2hpbGUgKGNoZWNrX3Rva2VuICgnLCcpKQorCXsKKwkgIHBhcnNlX3VudHlwZWRfZXhwciAoKTsKKwkgIGFyZ2xpc3RfbGVuKys7CisJfQorICAgIH0KKyAgZWxzZQorICAgIGFyZ2xpc3RfbGVuID0gMDsKKyAgZXhwZWN0ICgnKScsIE5VTEwpOworICBhcmdfY291bnQgPSBlbmRfYXJnbGlzdCAoKTsKKyAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE1VTFRJX1NVQlNDUklQVCk7CisgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoYXJnX2NvdW50KTsKKyAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE1VTFRJX1NVQlNDUklQVCk7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9uYW1lZF9yZWNvcmRfZWxlbWVudCAoKQoreworICBzdHJ1Y3Qgc3Rva2VuIGxhYmVsOworICBjaGFyIGJ1ZlsyNTZdOworCisgIGxhYmVsID0gUEVFS19MVkFMICgpLnN2YWw7CisgIHNwcmludGYgKGJ1ZiwgImV4cGVjdGVkIGEgZmllbGQgbmFtZSBoZXJlIGAlcyciLCBsZXhwdHIpOworICBleHBlY3QgKERPVF9GSUVMRF9OQU1FLCBidWYpOworICBpZiAoY2hlY2tfdG9rZW4gKCcsJykpCisgICAgcGFyc2VfbmFtZWRfcmVjb3JkX2VsZW1lbnQgKCk7CisgIGVsc2UgaWYgKGNoZWNrX3Rva2VuICgnOicpKQorICAgIHBhcnNlX2V4cHIgKCk7CisgIGVsc2UKKyAgICBlcnJvciAoInN5bnRheCBlcnJvciBuZWFyIGAlcycgaW4gbmFtZWQgcmVjb3JkIHR1cGxlIGVsZW1lbnQiLCBsZXhwdHIpOworICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTEFCRUxFRCk7CisgIHdyaXRlX2V4cF9zdHJpbmcgKGxhYmVsKTsKKyAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xBQkVMRUQpOworfQorCisvKiBSZXR1cm5zIG9uZSBvciBtb3JlIFRSRUVfTElTVCBub2RlcywgaW4gcmV2ZXJzZSBvcmRlci4gKi8KKworc3RhdGljIHZvaWQKK3BhcnNlX3R1cGxlX2VsZW1lbnQgKHR5cGUpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworeworICBpZiAoUEVFS19UT0tFTiAoKSA9PSBET1RfRklFTERfTkFNRSkKKyAgICB7CisgICAgICAvKiBQYXJzZSBhIGxhYmVsbGVkIHN0cnVjdHVyZSB0dXBsZS4gKi8KKyAgICAgIHBhcnNlX25hbWVkX3JlY29yZF9lbGVtZW50ICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoY2hlY2tfdG9rZW4gKCcoJykpCisgICAgeworICAgICAgaWYgKGNoZWNrX3Rva2VuICgnKicpKQorCXsKKwkgIGV4cGVjdCAoJyknLCAibWlzc2luZyAnKScgYWZ0ZXIgJyonIGNhc2UgbGFiZWwgbGlzdCIpOworCSAgaWYgKHR5cGUpCisJICAgIHsKKwkgICAgICBpZiAoVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfQVJSQVkpCisJCXsKKwkJICAvKiBkbyB0aGlzIGFzIGEgcmFuZ2UgZnJvbSBsb3cgdG8gaGlnaCAqLworCQkgIHN0cnVjdCB0eXBlICpyYW5nZV90eXBlID0gVFlQRV9GSUVMRF9UWVBFICh0eXBlLCAwKTsKKwkJICBMT05HRVNUIGxvd19ib3VuZCwgaGlnaF9ib3VuZDsKKwkJICBpZiAoZ2V0X2Rpc2NyZXRlX2JvdW5kcyAocmFuZ2VfdHlwZSwgJmxvd19ib3VuZCwgJmhpZ2hfYm91bmQpIDwgMCkKKwkJICAgIGVycm9yICgiY2Fubm90IGRldGVybWluZSBib3VuZHMgZm9yICgqKSIpOworCQkgIC8qIGxvd2VyIGJvdW5kICovCisJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOworCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAocmFuZ2VfdHlwZSk7CisJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0IChsb3dfYm91bmQpOworCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKKwkJICAvKiB1cHBlciBib3VuZCAqLworCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKKwkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHJhbmdlX3R5cGUpOworCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoaGlnaF9ib3VuZCk7CisJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOworCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9SQU5HRSk7CisJCX0KKwkgICAgICBlbHNlCisJCWVycm9yICgiKCopIGluIGludmFsaWQgY29udGV4dCIpOworCSAgICB9CisJICBlbHNlCisJICAgIGVycm9yICgiKCopIG9ubHkgcG9zc2libGUgd2l0aCBtb2RlbmFtZSBpbiBmcm9udCBvZiB0dXBsZSAobW9kZVsuLl0pIik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHBhcnNlX2Nhc2VfbGFiZWwgKCk7CisJICB3aGlsZSAoY2hlY2tfdG9rZW4gKCcsJykpCisJICAgIHsKKwkgICAgICBwYXJzZV9jYXNlX2xhYmVsICgpOworCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9DT01NQSk7CisJICAgIH0KKwkgIGV4cGVjdCAoJyknLCBOVUxMKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgcGFyc2VfdW50eXBlZF9leHByICgpOworICBpZiAoY2hlY2tfdG9rZW4gKCc6JykpCisgICAgeworICAgICAgLyogQSBwb3dlcnNldCByYW5nZSBvciBhIGxhYmVsZWQgQXJyYXkuICovCisgICAgICBwYXJzZV91bnR5cGVkX2V4cHIgKCk7CisgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfUkFOR0UpOworICAgIH0KK30KKworLyogTWF0Y2hlczogIGEgQ09NTUEtc2VwYXJhdGVkIGxpc3Qgb2YgdHVwbGUgZWxlbWVudHMuCisgICBSZXR1cm5zIGEgbGlzdCAob2YgVFJFRV9MSVNUIG5vZGVzKS4gKi8KK3N0YXRpYyB2b2lkCitwYXJzZV9vcHRfZWxlbWVudF9saXN0ICh0eXBlKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgYXJnbGlzdF9sZW4gPSAwOworICBpZiAoUEVFS19UT0tFTiAoKSA9PSAnXScpCisgICAgcmV0dXJuOworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIHBhcnNlX3R1cGxlX2VsZW1lbnQgKHR5cGUpOworICAgICAgYXJnbGlzdF9sZW4rKzsKKyAgICAgIGlmIChQRUVLX1RPS0VOICgpID09ICddJykKKwlicmVhazsKKyAgICAgIGlmICghY2hlY2tfdG9rZW4gKCcsJykpCisJZXJyb3IgKCJiYWQgc3ludGF4IGluIHR1cGxlIik7CisgICAgfQorfQorCisvKiBQYXJzZXM6ICdbJyBlbGVtZW50cyAnXScKKyAgIElmIG1vZGVuYW1lIGlzIG5vbi1OVUxMIGl0IHByZWZpeGVkIHRoZSB0dXBsZS4gICovCisKK3N0YXRpYyB2b2lkCitwYXJzZV90dXBsZSAobW9kZSkKKyAgICAgc3RydWN0IHR5cGUgKm1vZGU7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlOworICBpZiAobW9kZSkKKyAgICB0eXBlID0gY2hlY2tfdHlwZWRlZiAobW9kZSk7CisgIGVsc2UKKyAgICB0eXBlID0gMDsKKyAgcmVxdWlyZSAoJ1snKTsKKyAgc3RhcnRfYXJnbGlzdCAoKTsKKyAgcGFyc2Vfb3B0X2VsZW1lbnRfbGlzdCAodHlwZSk7CisgIGV4cGVjdCAoJ10nLCAibWlzc2luZyAnXScgYWZ0ZXIgdHVwbGUiKTsKKyAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0FSUkFZKTsKKyAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgMCk7CisgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIGVuZF9hcmdsaXN0ICgpIC0gMSk7CisgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9BUlJBWSk7CisgIGlmICh0eXBlKQorICAgIHsKKyAgICAgIGlmIChUWVBFX0NPREUgKHR5cGUpICE9IFRZUEVfQ09ERV9BUlJBWQorCSAgJiYgVFlQRV9DT0RFICh0eXBlKSAhPSBUWVBFX0NPREVfU1RSVUNUCisJICAmJiBUWVBFX0NPREUgKHR5cGUpICE9IFRZUEVfQ09ERV9TRVQpCisJZXJyb3IgKCJpbnZhbGlkIHR1cGxlIG1vZGUiKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOworICAgICAgd3JpdGVfZXhwX2VsdF90eXBlIChtb2RlKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3BhcnNlX3ByaW12YWwgKCkKK3sKKyAgc3RydWN0IHR5cGUgKnR5cGU7CisgIGVudW0gZXhwX29wY29kZSBvcDsKKyAgY2hhciAqb3BfbmFtZTsKKyAgc3dpdGNoIChQRUVLX1RPS0VOICgpKQorICAgIHsKKyAgICBjYXNlIElOVEVHRVJfTElURVJBTDogCisgICAgY2FzZSBDSEFSQUNURVJfTElURVJBTDoKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfdHlwZSAoUEVFS19MVkFMICgpLnR5cGVkX3ZhbC50eXBlKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoUEVFS19MVkFMICgpLnR5cGVkX3ZhbC52YWwpOworICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOworICAgICAgRk9SV0FSRF9UT0tFTiAoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQk9PTEVBTl9MSVRFUkFMOgorICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0JPT0wpOworICAgICAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgUEVFS19MVkFMICgpLnVsdmFsKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9CT09MKTsKKyAgICAgIEZPUldBUkRfVE9LRU4gKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZMT0FUX0xJVEVSQUw6CisgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRE9VQkxFKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX2RvdWJsZSk7CisgICAgICB3cml0ZV9leHBfZWx0X2RibGNzdCAoUEVFS19MVkFMICgpLmR2YWwpOworICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0RPVUJMRSk7CisgICAgICBGT1JXQVJEX1RPS0VOICgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFTVBUSU5FU1NfTElURVJBTDoKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfdHlwZSAobG9va3VwX3BvaW50ZXJfdHlwZSAoYnVpbHRpbl90eXBlX3ZvaWQpKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoMCk7CisgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7CisgICAgICBGT1JXQVJEX1RPS0VOICgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDSEFSQUNURVJfU1RSSU5HX0xJVEVSQUw6CisgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfU1RSSU5HKTsKKyAgICAgIHdyaXRlX2V4cF9zdHJpbmcgKFBFRUtfTFZBTCAoKS5zdmFsKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9TVFJJTkcpOworICAgICAgRk9SV0FSRF9UT0tFTiAoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklUX1NUUklOR19MSVRFUkFMOgorICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0JJVFNUUklORyk7CisgICAgICB3cml0ZV9leHBfYml0c3RyaW5nIChQRUVLX0xWQUwgKCkuc3ZhbCk7CisgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQklUU1RSSU5HKTsKKyAgICAgIEZPUldBUkRfVE9LRU4gKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSUkFZOgorICAgICAgRk9SV0FSRF9UT0tFTiAoKTsKKyAgICAgIC8qIFRoaXMgaXMgcHNldWRvLUNoaWxsLCBzaW1pbGFyIHRvIEMncyAnKFRZUEVbXSlFWFBSJworCSB3aGljaCBjYXN0cyB0byBhbiBhcnRpZmljaWFsIGFycmF5LiAqLworICAgICAgZXhwZWN0ICgnKCcsIE5VTEwpOworICAgICAgZXhwZWN0ICgnKScsIE5VTEwpOworICAgICAgaWYgKFBFRUtfVE9LRU4gKCkgIT0gVFlQRU5BTUUpCisJZXJyb3IgKCJtaXNzaW5nIE1PREVOQU1FIGFmdGVyIEFSUkFZKCkiKTsKKyAgICAgIHR5cGUgPSBQRUVLX0xWQUwoKS50c3ltLnR5cGU7CisgICAgICBGT1JXQVJEX1RPS0VOICgpOworICAgICAgZXhwZWN0ICgnKCcsIE5VTEwpOworICAgICAgcGFyc2VfZXhwciAoKTsKKyAgICAgIGV4cGVjdCAoJyknLCAibWlzc2luZyByaWdodCBwYXJlbnRoZXNpcyIpOworICAgICAgdHlwZSA9IGNyZWF0ZV9hcnJheV90eXBlICgoc3RydWN0IHR5cGUgKikgTlVMTCwgdHlwZSwKKwkJCQljcmVhdGVfcmFuZ2VfdHlwZSAoKHN0cnVjdCB0eXBlICopIE5VTEwsCisJCQkJCQkgICBidWlsdGluX3R5cGVfaW50LCAwLCAwKSk7CisgICAgICBUWVBFX0FSUkFZX1VQUEVSX0JPVU5EX1RZUEUodHlwZSkgPSBCT1VORF9DQU5OT1RfQkVfREVURVJNSU5FRDsKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOworICAgICAgd3JpdGVfZXhwX2VsdF90eXBlICh0eXBlKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOworICAgICAgYnJlYWs7CisjaWYgMAorICAgIGNhc2UgQ09OU1Q6CisgICAgY2FzZSBFWFBSOgorICAgICAgdmFsID0gUEVFS19MVkFMKCk7CisgICAgICBGT1JXQVJEX1RPS0VOICgpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlICcoJzoKKyAgICAgIEZPUldBUkRfVE9LRU4gKCk7CisgICAgICBwYXJzZV9leHByICgpOworICAgICAgZXhwZWN0ICgnKScsICJtaXNzaW5nIHJpZ2h0IHBhcmVudGhlc2lzIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICdbJzoKKyAgICAgIHBhcnNlX3R1cGxlIChOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0VORVJBTF9QUk9DRURVUkVfTkFNRToKKyAgICBjYXNlIExPQ0FUSU9OX05BTUU6CisgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfYmxvY2sgKE5VTEwpOworICAgICAgd3JpdGVfZXhwX2VsdF9zeW0gKFBFRUtfTFZBTCAoKS5zc3ltLnN5bSk7CisgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsKKyAgICAgIEZPUldBUkRfVE9LRU4gKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdEQl9WQVJJQUJMRToJLyogZ2RiIHNwZWNpZmljICovCisgICAgICBGT1JXQVJEX1RPS0VOICgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBOVU06CisgICAgICBwYXJzZV91bmFyeV9jYWxsICgpOworICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7CisgICAgICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9pbnQpOworICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENBUkQ6CisgICAgICBwYXJzZV91bmFyeV9jYWxsICgpOworICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FSRCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1BWF9UT0tFTjoKKyAgICAgIHBhcnNlX3VuYXJ5X2NhbGwgKCk7CisgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DSE1BWCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1JTl9UT0tFTjoKKyAgICAgIHBhcnNlX3VuYXJ5X2NhbGwgKCk7CisgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DSE1JTik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBSRUQ6ICAgICAgb3BfbmFtZSA9ICJQUkVEIjsgZ290byB1bmltcGxlbWVudGVkX3VuYXJ5X2J1aWx0aW47CisgICAgY2FzZSBTVUNDOiAgICAgIG9wX25hbWUgPSAiU1VDQyI7IGdvdG8gdW5pbXBsZW1lbnRlZF91bmFyeV9idWlsdGluOworICAgIGNhc2UgQUJTOiAgICAgICBvcF9uYW1lID0gIkFCUyI7ICBnb3RvIHVuaW1wbGVtZW50ZWRfdW5hcnlfYnVpbHRpbjsKKyAgICB1bmltcGxlbWVudGVkX3VuYXJ5X2J1aWx0aW46CisgICAgICBwYXJzZV91bmFyeV9jYWxsICgpOworICAgICAgZXJyb3IgKCJub3QgaW1wbGVtZW50ZWQ6ICAlcyBidWlsdGluIGZ1bmN0aW9uIiwgb3BfbmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFERFJfVE9LRU46CisgICAgICBwYXJzZV91bmFyeV9jYWxsICgpOworICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQUREUik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNJWkU6CisgICAgICB0eXBlID0gcGFyc2VfbW9kZV9vcl9ub3JtYWxfY2FsbCAoKTsKKyAgICAgIGlmICh0eXBlKQorCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOworCSAgd3JpdGVfZXhwX2VsdF90eXBlIChidWlsdGluX3R5cGVfaW50KTsKKwkgIENIRUNLX1RZUEVERUYgKHR5cGUpOworCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgVFlQRV9MRU5HVEggKHR5cGUpKTsKKwkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKKwl9CisgICAgICBlbHNlCisJd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfU0laRU9GKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTE9XRVI6CisgICAgICBvcCA9IFVOT1BfTE9XRVI7CisgICAgICBnb3RvIGxvd2VyX3VwcGVyOworICAgIGNhc2UgVVBQRVI6CisgICAgICBvcCA9IFVOT1BfVVBQRVI7CisgICAgICBnb3RvIGxvd2VyX3VwcGVyOworICAgIGxvd2VyX3VwcGVyOgorICAgICAgdHlwZSA9IHBhcnNlX21vZGVfb3Jfbm9ybWFsX2NhbGwgKCk7CisgICAgICB3cml0ZV9sb3dlcl91cHBlcl92YWx1ZSAob3AsIHR5cGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMRU5HVEg6CisgICAgICBwYXJzZV91bmFyeV9jYWxsICgpOworICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTEVOR1RIKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRU5BTUU6CisgICAgICB0eXBlID0gUEVFS19MVkFMICgpLnRzeW0udHlwZTsKKyAgICAgIEZPUldBUkRfVE9LRU4gKCk7CisgICAgICBzd2l0Y2ggKFBFRUtfVE9LRU4oKSkKKwl7CisJY2FzZSAnWyc6CisJICBwYXJzZV90dXBsZSAodHlwZSk7CisJICBicmVhazsKKwljYXNlICcoJzoKKwkgIEZPUldBUkRfVE9LRU4gKCk7CisJICBwYXJzZV9leHByICgpOworCSAgZXhwZWN0ICgnKScsICJtaXNzaW5nIHJpZ2h0IHBhcmVudGhlc2lzIik7CisJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsKKwkgIHdyaXRlX2V4cF9lbHRfdHlwZSAodHlwZSk7CisJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBlcnJvciAoInR5cGVuYW1lIGluIGludmFsaWQgY29udGV4dCIpOworCX0KKyAgICAgIGJyZWFrOworICAgICAgCisgICAgZGVmYXVsdDogCisgICAgICBlcnJvciAoImludmFsaWQgZXhwcmVzc2lvbiBzeW50YXggYXQgYCVzJyIsIGxleHB0cik7CisgICAgfQorICBmb3IgKDs7KQorICAgIHsKKyAgICAgIHN3aXRjaCAoUEVFS19UT0tFTiAoKSkKKwl7CisJY2FzZSBET1RfRklFTERfTkFNRToKKwkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9TVFJVQ1QpOworCSAgd3JpdGVfZXhwX3N0cmluZyAoUEVFS19MVkFMICgpLnN2YWwpOworCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX1NUUlVDVCk7CisJICBGT1JXQVJEX1RPS0VOICgpOworCSAgY29udGludWU7CisJY2FzZSBQT0lOVEVSOgorCSAgRk9SV0FSRF9UT0tFTiAoKTsKKwkgIGlmIChQRUVLX1RPS0VOICgpID09IFRZUEVOQU1FKQorCSAgICB7CisJICAgICAgdHlwZSA9IFBFRUtfTFZBTCAoKS50c3ltLnR5cGU7CisJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7CisJICAgICAgd3JpdGVfZXhwX2VsdF90eXBlIChsb29rdXBfcG9pbnRlcl90eXBlICh0eXBlKSk7CisJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7CisJICAgICAgRk9SV0FSRF9UT0tFTiAoKTsKKwkgICAgfQorCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfSU5EKTsKKwkgIGNvbnRpbnVlOworCWNhc2UgT1BFTl9QQVJFTjoKKwkgIHBhcnNlX2NhbGwgKCk7CisJICBjb250aW51ZTsKKwljYXNlIENIQVJBQ1RFUl9TVFJJTkdfTElURVJBTDoKKwljYXNlIENIQVJBQ1RFUl9MSVRFUkFMOgorCWNhc2UgQklUX1NUUklOR19MSVRFUkFMOgorCSAgLyogSGFuZGxlIHN0cmluZyByZXBldGl0aW9uLiAoU2VlIGNvbW1lbnQgaW4gcGFyc2Vfb3BlcmFuZDUuKSAqLworCSAgcGFyc2VfcHJpbXZhbCAoKTsKKwkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChNVUxUSV9TVUJTQ1JJUFQpOworCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgxKTsKKwkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChNVUxUSV9TVUJTQ1JJUFQpOworCSAgY29udGludWU7CisJY2FzZSBFTkRfVE9LRU46CisJY2FzZSBUT0tFTl9OT1RfUkVBRDoKKwljYXNlIElOVEVHRVJfTElURVJBTDoKKwljYXNlIEJPT0xFQU5fTElURVJBTDoKKwljYXNlIEZMT0FUX0xJVEVSQUw6CisJY2FzZSBHRU5FUkFMX1BST0NFRFVSRV9OQU1FOgorCWNhc2UgTE9DQVRJT05fTkFNRToKKwljYXNlIEVNUFRJTkVTU19MSVRFUkFMOgorCWNhc2UgVFlQRU5BTUU6CisJY2FzZSBDQVNFOgorCWNhc2UgT0Y6CisJY2FzZSBFU0FDOgorCWNhc2UgTE9HSU9SOgorCWNhc2UgT1JJRjoKKwljYXNlIExPR1hPUjoKKwljYXNlIExPR0FORDoKKwljYXNlIEFORElGOgorCWNhc2UgTk9URVFVQUw6CisJY2FzZSBHRVE6CisJY2FzZSBMRVE6CisJY2FzZSBJTjoKKwljYXNlIFNMQVNIX1NMQVNIOgorCWNhc2UgTU9EOgorCWNhc2UgUkVNOgorCWNhc2UgTk9UOgorCWNhc2UgUkVDRUlWRToKKwljYXNlIFVQOgorCWNhc2UgSUY6CisJY2FzZSBUSEVOOgorCWNhc2UgRUxTRToKKwljYXNlIEZJOgorCWNhc2UgRUxTSUY6CisJY2FzZSBJTExFR0FMX1RPS0VOOgorCWNhc2UgTlVNOgorCWNhc2UgUFJFRDoKKwljYXNlIFNVQ0M6CisJY2FzZSBBQlM6CisJY2FzZSBDQVJEOgorCWNhc2UgTUFYX1RPS0VOOgorCWNhc2UgTUlOX1RPS0VOOgorCWNhc2UgQUREUl9UT0tFTjoKKwljYXNlIFNJWkU6CisJY2FzZSBVUFBFUjoKKwljYXNlIExPV0VSOgorCWNhc2UgTEVOR1RIOgorCWNhc2UgQVJSQVk6CisJY2FzZSBHREJfVkFSSUFCTEU6CisJY2FzZSBHREJfQVNTSUdOTUVOVDoKKwkgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorcGFyc2Vfb3BlcmFuZDYgKCkKK3sKKyAgaWYgKGNoZWNrX3Rva2VuIChSRUNFSVZFKSkKKyAgICB7CisgICAgICBwYXJzZV9wcmltdmFsICgpOworICAgICAgZXJyb3IgKCJub3QgaW1wbGVtZW50ZWQ6ICBSRUNFSVZFIGV4cHJlc3Npb24iKTsKKyAgICB9CisgIGVsc2UgaWYgKGNoZWNrX3Rva2VuIChQT0lOVEVSKSkKKyAgICB7CisgICAgICBwYXJzZV9wcmltdmFsICgpOworICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQUREUik7CisgICAgfQorICBlbHNlCisgICAgcGFyc2VfcHJpbXZhbCgpOworfQorCitzdGF0aWMgdm9pZAorcGFyc2Vfb3BlcmFuZDUoKQoreworICBlbnVtIGV4cF9vcGNvZGUgb3A7CisgIC8qIFdlIGFyZSBzdXBwb3NlZCB0byBiZSBsb29raW5nIGZvciBhIDxzdHJpbmcgcmVwZXRpdGlvbiBvcGVyYXRvcj4sCisgICAgIGJ1dCBpbiBnZW5lcmFsIHdlIGNhbid0IGRpc3Rpbmd1aXNoIHRoYXQgZnJvbSBhIHBhcmVudGhlc2l6ZWQKKyAgICAgZXhwcmVzc2lvbi4gIFRoaXMgaXMgZXNwZWNpYWxseSBkaWZmaWN1bHQgaWYgd2UgYWxsb3cgdGhlCisgICAgIHN0cmluZyBvcGVyYW5kIHRvIGJlIGEgY29uc3RhbnQgZXhwcmVzc2lvbiAoYXMgcmVxdWVzdGVkIGJ5CisgICAgIHNvbWUgdXNlcnMpLCBhbmQgbm90IGp1c3QgYSBzdHJpbmcgbGl0ZXJhbC4KKyAgICAgQ29uc2lkZXI6ICBMUFJOIGV4cHIgUlBSTiBMUFJOIGV4cHIgUlBSTgorICAgICBJcyB0aGF0IGEgZnVuY3Rpb24gY2FsbCBvciBzdHJpbmcgcmVwZXRpdGlvbj8KKyAgICAgSW5zdGVhZCwgd2UgaGFuZGxlIHN0cmluZyByZXBldGl0aW9uIGluIHBhcnNlX3ByaW12YWwsCisgICAgIGFuZCBidWlsZF9nZW5lcmFsaXplZF9jYWxsLiAqLworICBzd2l0Y2ggKFBFRUtfVE9LRU4oKSkKKyAgICB7CisgICAgY2FzZSBOT1Q6ICBvcCA9IFVOT1BfTE9HSUNBTF9OT1Q7IGJyZWFrOworICAgIGNhc2UgJy0nOiAgb3AgPSBVTk9QX05FRzsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG9wID0gT1BfTlVMTDsKKyAgICB9CisgIGlmIChvcCAhPSBPUF9OVUxMKQorICAgIEZPUldBUkRfVE9LRU4oKTsKKyAgcGFyc2Vfb3BlcmFuZDYoKTsKKyAgaWYgKG9wICE9IE9QX05VTEwpCisgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKG9wKTsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlX29wZXJhbmQ0ICgpCit7CisgIGVudW0gZXhwX29wY29kZSBvcDsKKyAgcGFyc2Vfb3BlcmFuZDUoKTsKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBzd2l0Y2ggKFBFRUtfVE9LRU4oKSkKKwl7CisJY2FzZSAnKic6ICBvcCA9IEJJTk9QX01VTDsgYnJlYWs7CisJY2FzZSAnLyc6ICBvcCA9IEJJTk9QX0RJVjsgYnJlYWs7CisJY2FzZSBNT0Q6ICBvcCA9IEJJTk9QX01PRDsgYnJlYWs7CisJY2FzZSBSRU06ICBvcCA9IEJJTk9QX1JFTTsgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHJldHVybjsKKwl9CisgICAgICBGT1JXQVJEX1RPS0VOKCk7CisgICAgICBwYXJzZV9vcGVyYW5kNSgpOworICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKG9wKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9vcGVyYW5kMyAoKQoreworICBlbnVtIGV4cF9vcGNvZGUgb3A7CisgIHBhcnNlX29wZXJhbmQ0ICgpOworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIHN3aXRjaCAoUEVFS19UT0tFTigpKQorCXsKKwljYXNlICcrJzogICAgb3AgPSBCSU5PUF9BREQ7IGJyZWFrOworCWNhc2UgJy0nOiAgICBvcCA9IEJJTk9QX1NVQjsgYnJlYWs7CisJY2FzZSBTTEFTSF9TTEFTSDogb3AgPSBCSU5PUF9DT05DQVQ7IGJyZWFrOworCWRlZmF1bHQ6CisJICByZXR1cm47CisJfQorICAgICAgRk9SV0FSRF9UT0tFTigpOworICAgICAgcGFyc2Vfb3BlcmFuZDQoKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChvcCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcGFyc2Vfb3BlcmFuZDIgKCkKK3sKKyAgZW51bSBleHBfb3Bjb2RlIG9wOworICBwYXJzZV9vcGVyYW5kMyAoKTsKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBpZiAoY2hlY2tfdG9rZW4gKElOKSkKKwl7CisJICBwYXJzZV9vcGVyYW5kMygpOworCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0lOKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3dpdGNoIChQRUVLX1RPS0VOKCkpCisJICAgIHsKKwkgICAgY2FzZSAnPic6ICAgICAgb3AgPSBCSU5PUF9HVFI7IGJyZWFrOworCSAgICBjYXNlIEdFUTogICAgICBvcCA9IEJJTk9QX0dFUTsgYnJlYWs7CisJICAgIGNhc2UgJzwnOiAgICAgIG9wID0gQklOT1BfTEVTUzsgYnJlYWs7CisJICAgIGNhc2UgTEVROiAgICAgIG9wID0gQklOT1BfTEVROyBicmVhazsKKwkgICAgY2FzZSAnPSc6ICAgICAgb3AgPSBCSU5PUF9FUVVBTDsgYnJlYWs7CisJICAgIGNhc2UgTk9URVFVQUw6IG9wID0gQklOT1BfTk9URVFVQUw7IGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgRk9SV0FSRF9UT0tFTigpOworCSAgcGFyc2Vfb3BlcmFuZDMoKTsKKwkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChvcCk7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK3BhcnNlX29wZXJhbmQxICgpCit7CisgIGVudW0gZXhwX29wY29kZSBvcDsKKyAgcGFyc2Vfb3BlcmFuZDIgKCk7CisgIGZvciAoOzspCisgICAgeworICAgICAgc3dpdGNoIChQRUVLX1RPS0VOKCkpCisJeworCWNhc2UgTE9HQU5EOiBvcCA9IEJJTk9QX0JJVFdJU0VfQU5EOyBicmVhazsKKwljYXNlIEFORElGOiAgb3AgPSBCSU5PUF9MT0dJQ0FMX0FORDsgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHJldHVybjsKKwl9CisgICAgICBGT1JXQVJEX1RPS0VOKCk7CisgICAgICBwYXJzZV9vcGVyYW5kMigpOworICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKG9wKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9vcGVyYW5kMCAoKQoreyAKKyAgZW51bSBleHBfb3Bjb2RlIG9wOworICBwYXJzZV9vcGVyYW5kMSgpOworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIHN3aXRjaCAoUEVFS19UT0tFTigpKQorCXsKKwljYXNlIExPR0lPUjogIG9wID0gQklOT1BfQklUV0lTRV9JT1I7IGJyZWFrOworCWNhc2UgTE9HWE9SOiAgb3AgPSBCSU5PUF9CSVRXSVNFX1hPUjsgYnJlYWs7CisJY2FzZSBPUklGOiAgICBvcCA9IEJJTk9QX0xPR0lDQUxfT1I7IGJyZWFrOworCWRlZmF1bHQ6CisJICByZXR1cm47CisJfQorICAgICAgRk9SV0FSRF9UT0tFTigpOworICAgICAgcGFyc2Vfb3BlcmFuZDEoKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChvcCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcGFyc2VfZXhwciAoKQoreworICBwYXJzZV9vcGVyYW5kMCAoKTsKKyAgaWYgKGNoZWNrX3Rva2VuIChHREJfQVNTSUdOTUVOVCkpCisgICAgeworICAgICAgcGFyc2VfZXhwciAoKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BU1NJR04pOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3BhcnNlX3RoZW5fYWx0ZXJuYXRpdmUgKCkKK3sKKyAgZXhwZWN0IChUSEVOLCAibWlzc2luZyAnVEhFTicgaW4gJ0lGJyBleHByZXNzaW9uIik7CisgIHBhcnNlX2V4cHIgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9lbHNlX2FsdGVybmF0aXZlICgpCit7CisgIGlmIChjaGVja190b2tlbiAoRUxTSUYpKQorICAgIHBhcnNlX2lmX2V4cHJlc3Npb25fYm9keSAoKTsKKyAgZWxzZSBpZiAoY2hlY2tfdG9rZW4gKEVMU0UpKQorICAgIHBhcnNlX2V4cHIgKCk7CisgIGVsc2UKKyAgICBlcnJvciAoIm1pc3NpbmcgRUxTRS9FTFNJRiBpbiBJRiBleHByZXNzaW9uIik7Cit9CisKKy8qIE1hdGNoZXM6IDxib29sZWFuIGV4cHJlc3Npb24+IDx0aGVuIGFsdGVybmF0aXZlPiA8ZWxzZSBhbHRlcm5hdGl2ZT4gKi8KKworc3RhdGljIHZvaWQKK3BhcnNlX2lmX2V4cHJlc3Npb25fYm9keSAoKQoreworICBwYXJzZV9leHByICgpOworICBwYXJzZV90aGVuX2FsdGVybmF0aXZlICgpOworICBwYXJzZV9lbHNlX2FsdGVybmF0aXZlICgpOworICB3cml0ZV9leHBfZWx0X29wY29kZSAoVEVSTk9QX0NPTkQpOworfQorCitzdGF0aWMgdm9pZAorcGFyc2VfaWZfZXhwcmVzc2lvbiAoKQoreworICByZXF1aXJlIChJRik7CisgIHBhcnNlX2lmX2V4cHJlc3Npb25fYm9keSAoKTsKKyAgZXhwZWN0IChGSSwgIm1pc3NpbmcgJ0ZJJyBhdCBlbmQgb2YgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiIpOworfQorCisvKiBBbiA8dW50eXBlZF9leHByPiBpcyBhIHN1cGVyc2V0IG9mIDxleHByPi4gIEl0IGFsc28gaW5jbHVkZXMKKyAgIDxjb25kaXRpb25hbCBleHByZXNzaW9ucz4gYW5kIHVudHlwZWQgPHR1cGxlcz4sIHdob3NlIHR5cGVzCisgICBhcmUgbm90IGdpdmVuIGJ5IHRoZWlyIGNvbnN0aXR1ZW50cy4gIEhlbmNlLCB0aGVzZSBhcmUgb25seQorICAgYWxsb3dlZCBpbiBjZXJ0YWluIGNvbnRleHRzIHRoYXQgZXhwZWN0IGEgY2VydGFpbiB0eXBlLgorICAgWW91IHNob3VsZCBjYWxsIGNvbnZlcnQoKSB0byBmaXggdXAgdGhlIDx1bnR5cGVkX2V4cHI+LiAqLworCitzdGF0aWMgdm9pZAorcGFyc2VfdW50eXBlZF9leHByICgpCit7CisgIHN3aXRjaCAoUEVFS19UT0tFTigpKQorICAgIHsKKyAgICBjYXNlIElGOgorICAgICAgcGFyc2VfaWZfZXhwcmVzc2lvbiAoKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIENBU0U6CisgICAgICBlcnJvciAoIm5vdCBpbXBsZW1lbnRlZDogIENBU0UgZXhwcmVzc2lvbiIpOworICAgIGNhc2UgJygnOgorICAgICAgc3dpdGNoIChQRUVLX1RPS0VOMSgpKQorCXsKKwljYXNlIElGOgorCWNhc2UgQ0FTRToKKwkgIGdvdG8gc2tpcF9scHJuOworCWNhc2UgJ1snOgorCXNraXBfbHBybjoKKwkgIEZPUldBUkRfVE9LRU4gKCk7CisJICBwYXJzZV91bnR5cGVkX2V4cHIgKCk7CisJICBleHBlY3QgKCcpJywgIm1pc3NpbmcgJyknIik7CisJICByZXR1cm47CisJZGVmYXVsdDogOworCSAgLyogZmFsbCB0aHJvdWdoICovCisJfQorICAgIGRlZmF1bHQ6CisgICAgICBwYXJzZV9vcGVyYW5kMCAoKTsKKyAgICB9Cit9CisKK2ludAorY2hpbGxfcGFyc2UgKCkKK3sKKyAgdGVybWluYWxfYnVmZmVyWzBdID0gVE9LRU5fTk9UX1JFQUQ7CisgIGlmIChQRUVLX1RPS0VOICgpID09IFRZUEVOQU1FICYmIFBFRUtfVE9LRU4xICgpID09IEVORF9UT0tFTikKKyAgICB7CisgICAgICB3cml0ZV9leHBfZWx0X29wY29kZShPUF9UWVBFKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfdHlwZShQRUVLX0xWQUwgKCkudHN5bS50eXBlKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpOworICAgICAgRk9SV0FSRF9UT0tFTiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICBwYXJzZV9leHByICgpOworICBpZiAodGVybWluYWxfYnVmZmVyWzBdICE9IEVORF9UT0tFTikKKyAgICB7CisgICAgICBpZiAoY29tbWFfdGVybWluYXRlcyAmJiB0ZXJtaW5hbF9idWZmZXJbMF0gPT0gJywnKQorCWxleHB0ci0tOyAgLyogUHV0IHRoZSBjb21tYSBiYWNrLiAgKi8KKyAgICAgIGVsc2UKKwllcnJvciAoIkp1bmsgYWZ0ZXIgZW5kIG9mIGV4cHJlc3Npb24uIik7CisgICAgfQorICByZXR1cm4gMDsKK30KKworCisvKiBJbXBsZW1lbnRhdGlvbiBvZiBhIGR5bmFtaWNhbGx5IGV4cGFuZGFibGUgYnVmZmVyIGZvciBwcm9jZXNzaW5nIGlucHV0CisgICBjaGFyYWN0ZXJzIGFjcXVpcmVkIHRocm91Z2ggbGV4cHRyIGFuZCBidWlsZGluZyBhIHZhbHVlIHRvIHJldHVybiBpbgorICAgeXlsdmFsLiAqLworCitzdGF0aWMgY2hhciAqdGVtcGJ1ZjsJCS8qIEN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzICovCitzdGF0aWMgaW50IHRlbXBidWZzaXplOwkJLyogU2l6ZSBvZiBhbGxvY2F0ZWQgYnVmZmVyICovCitzdGF0aWMgaW50IHRlbXBidWZpbmRleDsJLyogQ3VycmVudCBpbmRleCBpbnRvIGJ1ZmZlciAqLworCisjZGVmaW5lIEdST1dCWV9NSU5fU0laRSA2NAkvKiBNaW5pbXVtIGFtb3VudCB0byBncm93IGJ1ZmZlciBieSAqLworCisjZGVmaW5lIENIRUNLQlVGKHNpemUpIFwKKyAgZG8geyBcCisgICAgaWYgKHRlbXBidWZpbmRleCArIChzaXplKSA+PSB0ZW1wYnVmc2l6ZSkgXAorICAgICAgeyBcCisJZ3Jvd2J1Zl9ieV9zaXplIChzaXplKTsgXAorICAgICAgfSBcCisgIH0gd2hpbGUgKDApOworCisvKiBHcm93IHRoZSBzdGF0aWMgdGVtcCBidWZmZXIgaWYgbmVjZXNzYXJ5LCBpbmNsdWRpbmcgYWxsb2NhdGluZyB0aGUgZmlyc3Qgb25lCisgICBvbiBkZW1hbmQuICovCisKK3N0YXRpYyB2b2lkCitncm93YnVmX2J5X3NpemUgKGNvdW50KQorICAgICBpbnQgY291bnQ7Cit7CisgIGludCBncm93Ynk7CisKKyAgZ3Jvd2J5ID0gbWF4IChjb3VudCwgR1JPV0JZX01JTl9TSVpFKTsKKyAgdGVtcGJ1ZnNpemUgKz0gZ3Jvd2J5OworICBpZiAodGVtcGJ1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHRlbXBidWYgPSAoY2hhciAqKSB4bWFsbG9jICh0ZW1wYnVmc2l6ZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdGVtcGJ1ZiA9IChjaGFyICopIHhyZWFsbG9jICh0ZW1wYnVmLCB0ZW1wYnVmc2l6ZSk7CisgICAgfQorfQorCisvKiBUcnkgdG8gY29uc3VtZSBhIHNpbXBsZSBuYW1lIHN0cmluZyB0b2tlbi4gIElmIHN1Y2Nlc3NmdWwsIHJldHVybnMKKyAgIGEgcG9pbnRlciB0byBhIG51bGxieXRlIHRlcm1pbmF0ZWQgY29weSBvZiB0aGUgbmFtZSB0aGF0IGNhbiBiZSB1c2VkCisgICBpbiBzeW1ib2wgdGFibGUgbG9va3Vwcy4gIElmIG5vdCBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwuICovCisKK3N0YXRpYyBjaGFyICoKK21hdGNoX3NpbXBsZV9uYW1lX3N0cmluZyAoKQoreworICBjaGFyICp0b2twdHIgPSBsZXhwdHI7CisKKyAgaWYgKGlzYWxwaGEgKCp0b2twdHIpIHx8ICp0b2twdHIgPT0gJ18nKQorICAgIHsKKyAgICAgIGNoYXIgKnJlc3VsdDsKKyAgICAgIGRvIHsKKwl0b2twdHIrKzsKKyAgICAgIH0gd2hpbGUgKGlzYWxudW0gKCp0b2twdHIpIHx8ICgqdG9rcHRyID09ICdfJykpOworICAgICAgeXlsdmFsLnN2YWwucHRyID0gbGV4cHRyOworICAgICAgeXlsdmFsLnN2YWwubGVuZ3RoID0gdG9rcHRyIC0gbGV4cHRyOworICAgICAgbGV4cHRyID0gdG9rcHRyOworICAgICAgcmVzdWx0ID0gY29weV9uYW1lICh5eWx2YWwuc3ZhbCk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgcmV0dXJuIChOVUxMKTsKK30KKworLyogU3RhcnQgbG9va2luZyBmb3IgYSB2YWx1ZSBjb21wb3NlZCBvZiB2YWxpZCBkaWdpdHMgYXMgc2V0IGJ5IHRoZSBiYXNlCisgICBpbiB1c2UuICBOb3RlIHRoYXQgJ18nIGNoYXJhY3RlcnMgYXJlIHZhbGlkIGFueXdoZXJlLCBpbiBhbnkgcXVhbnRpdHksCisgICBhbmQgYXJlIHNpbXBseSBpZ25vcmVkLiAgU2luY2Ugd2UgbXVzdCBmaW5kIGF0IGxlYXN0IG9uZSB2YWxpZCBkaWdpdCwKKyAgIG9yIHJlamVjdCB0aGlzIHRva2VuIGFzIGFuIGludGVnZXIgbGl0ZXJhbCwgd2Uga2VlcCB0cmFjayBvZiBob3cgbWFueQorICAgZGlnaXRzIHdlIGhhdmUgZW5jb3VudGVyZWQuICovCisgIAorc3RhdGljIGludAorZGVjb2RlX2ludGVnZXJfdmFsdWUgKGJhc2UsIHRva3B0cnB0ciwgaXZhbHB0cikKKyAgaW50IGJhc2U7CisgIGNoYXIgKip0b2twdHJwdHI7CisgIExPTkdFU1QgKml2YWxwdHI7Cit7CisgIGNoYXIgKnRva3B0ciA9ICp0b2twdHJwdHI7CisgIGludCB0ZW1wOworICBpbnQgZGlnaXRzID0gMDsKKworICB3aGlsZSAoKnRva3B0ciAhPSAnXDAnKQorICAgIHsKKyAgICAgIHRlbXAgPSAqdG9rcHRyOworICAgICAgaWYgKGlzdXBwZXIgKHRlbXApKQorICAgICAgICB0ZW1wID0gdG9sb3dlciAodGVtcCk7CisgICAgICB0b2twdHIrKzsKKyAgICAgIHN3aXRjaCAodGVtcCkKKwl7CisJY2FzZSAnXyc6CisJICBjb250aW51ZTsKKwljYXNlICcwJzogIGNhc2UgJzEnOiAgY2FzZSAnMic6ICBjYXNlICczJzogIGNhc2UgJzQnOgorCWNhc2UgJzUnOiAgY2FzZSAnNic6ICBjYXNlICc3JzogIGNhc2UgJzgnOiAgY2FzZSAnOSc6CisJICB0ZW1wIC09ICcwJzsKKwkgIGJyZWFrOworCWNhc2UgJ2EnOiAgY2FzZSAnYic6ICBjYXNlICdjJzogIGNhc2UgJ2QnOiAgY2FzZSAnZSc6IGNhc2UgJ2YnOgorCSAgdGVtcCAtPSAnYSc7CisJICB0ZW1wICs9IDEwOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHRlbXAgPSBiYXNlOworCSAgYnJlYWs7CisJfQorICAgICAgaWYgKHRlbXAgPCBiYXNlKQorCXsKKwkgIGRpZ2l0cysrOworCSAgKml2YWxwdHIgKj0gYmFzZTsKKwkgICppdmFscHRyICs9IHRlbXA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIEZvdW5kIHNvbWV0aGluZyBub3QgaW4gZG9tYWluIGZvciBjdXJyZW50IGJhc2UuICovCisJICB0b2twdHItLTsJLyogVW5jb25zdW1lIHdoYXQgZ2F2ZSB1cyBpbmRpZ2VzdGlvbi4gKi8KKwkgIGJyZWFrOworCX0KKyAgICB9CisgIAorICAvKiBJZiB3ZSBkaWRuJ3QgZmluZCBhbnkgZGlnaXRzLCB0aGVuIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBpbnRlZ2VyCisgICAgIHZhbHVlLCBzbyByZWplY3QgdGhlIGVudGlyZSB0b2tlbi4gIE90aGVyd2lzZSwgdXBkYXRlIHRoZSBsZXhpY2FsCisgICAgIHNjYW4gcG9pbnRlciwgYW5kIHJldHVybiBub24temVybyBmb3Igc3VjY2Vzcy4gKi8KKyAgCisgIGlmIChkaWdpdHMgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICp0b2twdHJwdHIgPSB0b2twdHI7CisgICAgICByZXR1cm4gKDEpOworICAgIH0KK30KKworc3RhdGljIGludAorZGVjb2RlX2ludGVnZXJfbGl0ZXJhbCAodmFscHRyLCB0b2twdHJwdHIpCisgIExPTkdFU1QgKnZhbHB0cjsKKyAgY2hhciAqKnRva3B0cnB0cjsKK3sKKyAgY2hhciAqdG9rcHRyID0gKnRva3B0cnB0cjsKKyAgaW50IGJhc2UgPSAwOworICBMT05HRVNUIGl2YWwgPSAwOworICBpbnQgZXhwbGljaXRfYmFzZSA9IDA7CisgIAorICAvKiBMb29rIGZvciBhbiBleHBsaWNpdCBiYXNlIHNwZWNpZmllciwgd2hpY2ggaXMgb3B0aW9uYWwuICovCisgIAorICBzd2l0Y2ggKCp0b2twdHIpCisgICAgeworICAgIGNhc2UgJ2QnOgorICAgIGNhc2UgJ0QnOgorICAgICAgZXhwbGljaXRfYmFzZSsrOworICAgICAgYmFzZSA9IDEwOworICAgICAgdG9rcHRyKys7CisgICAgICBicmVhazsKKyAgICBjYXNlICdiJzoKKyAgICBjYXNlICdCJzoKKyAgICAgIGV4cGxpY2l0X2Jhc2UrKzsKKyAgICAgIGJhc2UgPSAyOworICAgICAgdG9rcHRyKys7CisgICAgICBicmVhazsKKyAgICBjYXNlICdoJzoKKyAgICBjYXNlICdIJzoKKyAgICAgIGV4cGxpY2l0X2Jhc2UrKzsKKyAgICAgIGJhc2UgPSAxNjsKKyAgICAgIHRva3B0cisrOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbyc6CisgICAgY2FzZSAnTyc6CisgICAgICBleHBsaWNpdF9iYXNlKys7CisgICAgICBiYXNlID0gODsKKyAgICAgIHRva3B0cisrOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJhc2UgPSAxMDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgCisgIC8qIElmIHdlIGZvdW5kIGFuIGV4cGxpY2l0IGJhc2UgZW5zdXJlIHRoYXQgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUKKyAgICAgZXhwbGljaXQgYmFzZSBpcyBhIHNpbmdsZSBxdW90ZS4gKi8KKyAgCisgIGlmIChleHBsaWNpdF9iYXNlICYmICgqdG9rcHRyKysgIT0gJ1wnJykpCisgICAgeworICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgIAorICAvKiBBdHRlbXB0IHRvIGRlY29kZSB3aGF0ZXZlciBmb2xsb3dzIGFzIGFuIGludGVnZXIgdmFsdWUgaW4gdGhlCisgICAgIGluZGljYXRlZCBiYXNlLCB1cGRhdGluZyB0aGUgdG9rZW4gcG9pbnRlciBpbiB0aGUgcHJvY2VzcyBhbmQKKyAgICAgY29tcHV0aW5nIHRoZSB2YWx1ZSBpbnRvIGl2YWwuICBBbHNvLCBpZiB3ZSBoYXZlIGFuIGV4cGxpY2l0CisgICAgIGJhc2UsIHRoZW4gdGhlIG5leHQgY2hhcmFjdGVyIG11c3Qgbm90IGJlIGEgc2luZ2xlIHF1b3RlLCBvciB3ZQorICAgICBoYXZlIGEgYml0c3RyaW5nIGxpdGVyYWwsIHNvIHJlamVjdCB0aGUgZW50aXJlIHRva2VuIGluIHRoaXMgY2FzZS4KKyAgICAgT3RoZXJ3aXNlLCB1cGRhdGUgdGhlIGxleGljYWwgc2NhbiBwb2ludGVyLCBhbmQgcmV0dXJuIG5vbi16ZXJvCisgICAgIGZvciBzdWNjZXNzLiAqLworCisgIGlmICghZGVjb2RlX2ludGVnZXJfdmFsdWUgKGJhc2UsICZ0b2twdHIsICZpdmFsKSkKKyAgICB7CisgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgZWxzZSBpZiAoZXhwbGljaXRfYmFzZSAmJiAoKnRva3B0ciA9PSAnXCcnKSkKKyAgICB7CisgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICp2YWxwdHIgPSBpdmFsOworICAgICAgKnRva3B0cnB0ciA9IHRva3B0cjsKKyAgICAgIHJldHVybiAoMSk7CisgICAgfQorfQorCisvKiAgSWYgaXQgd2Fzbid0IGZvciB0aGUgZmFjdCB0aGF0IGZsb2F0aW5nIHBvaW50IHZhbHVlcyBjYW4gY29udGFpbiAnXycKKyAgICBjaGFyYWN0ZXJzLCB3ZSBjb3VsZCBqdXN0IGxldCBzdHJ0b2QgZG8gYWxsIHRoZSBoYXJkIHdvcmsgYnkgbGV0dGluZyBpdAorICAgIHRyeSB0byBjb25zdW1lIGFzIG11Y2ggb2YgdGhlIGN1cnJlbnQgdG9rZW4gYnVmZmVyIGFzIHBvc3NpYmxlIGFuZAorICAgIGZpbmQgYSBsZWdhbCBjb252ZXJzaW9uLiAgVW5mb3J0dW5hdGVseSB3ZSBuZWVkIHRvIGZpbHRlciBvdXQgdGhlICdfJworICAgIGNoYXJhY3RlcnMgYmVmb3JlIGNhbGxpbmcgc3RydG9kLCB3aGljaCB3ZSBkbyBieSBjb3B5aW5nIHRoZSBvdGhlcgorICAgIGxlZ2FsIGNoYXJzIHRvIGEgbG9jYWwgYnVmZmVyIHRvIGJlIGNvbnZlcnRlZC4gIEhvd2V2ZXIgc2luY2Ugd2UgYWxzbworICAgIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGVyZSB0aGUgbGFzdCB1bmNvbnN1bWVkIGNoYXJhY3RlciBpbiB0aGUgaW5wdXQKKyAgICBidWZmZXIgaXMsIHdlIGhhdmUgdHJhbnNmZXIgb25seSBhcyBtYW55IGNoYXJhY3RlcnMgYXMgbWF5IGNvbXBvc2UgYQorICAgIGxlZ2FsIGZsb2F0aW5nIHBvaW50IHZhbHVlLiAqLworICAgIAorc3RhdGljIGVudW0gY2hfdGVybWluYWwKK21hdGNoX2Zsb2F0X2xpdGVyYWwgKCkKK3sKKyAgY2hhciAqdG9rcHRyID0gbGV4cHRyOworICBjaGFyICpidWY7CisgIGNoYXIgKmNvcHk7CisgIGRvdWJsZSBkdmFsOworICBleHRlcm4gZG91YmxlIHN0cnRvZCAoKTsKKyAgCisgIC8qIE1ha2UgbG9jYWwgYnVmZmVyIGluIHdoaWNoIHRvIGJ1aWxkIHRoZSBzdHJpbmcgdG8gY29udmVydC4gIFRoaXMgaXMKKyAgICAgcmVxdWlyZWQgYmVjYXVzZSB1bmRlcnNjb3JlcyBhcmUgdmFsaWQgaW4gY2hpbGwgZmxvYXRpbmcgcG9pbnQgbnVtYmVycworICAgICBidXQgbm90IGluIHRoZSBzdHJpbmcgcGFzc2VkIHRvIHN0cnRvZCB0byBjb252ZXJ0LiAgVGhlIHN0cmluZyB3aWxsIGJlCisgICAgIG5vIGxvbmdlciB0aGFuIG91ciBpbnB1dCBzdHJpbmcuICovCisgICAgIAorICBjb3B5ID0gYnVmID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKHRva3B0cikgKyAxKTsKKworICAvKiBUcmFuc2ZlciBhbGwgbGVhZGluZyBkaWdpdHMgdG8gdGhlIGNvbnZlcnNpb24gYnVmZmVyLCBkaXNjYXJkaW5nIGFueQorICAgICB1bmRlcnNjb3Jlcy4gKi8KKworICB3aGlsZSAoaXNkaWdpdCAoKnRva3B0cikgfHwgKnRva3B0ciA9PSAnXycpCisgICAgeworICAgICAgaWYgKCp0b2twdHIgIT0gJ18nKQorCXsKKwkgICpjb3B5KysgPSAqdG9rcHRyOworCX0KKyAgICAgIHRva3B0cisrOworICAgIH0KKworICAvKiBOb3cgYWNjZXB0IGVpdGhlciBhICcuJywgb3Igb25lIG9mIFtlRWREXS4gIERvdCBpcyBsZWdhbCByZWdhcmRsZXNzCisgICAgIG9mIHdoZXRoZXIgd2UgZm91bmQgYW55IGxlYWRpbmcgZGlnaXRzLCBhbmQgd2Ugc2ltcGx5IGFjY2VwdCBpdCBhbmQKKyAgICAgY29udGludWUgb24gdG8gbG9vayBmb3IgdGhlIGZyYWN0aW9uYWwgcGFydCBhbmQvb3IgZXhwb25lbnQuICBPbmUgb2YKKyAgICAgW2VFZERdIGlzIGxlZ2FsIG9ubHkgaWYgd2UgaGF2ZSBzZWVuIGRpZ2l0cywgYW5kIG1lYW5zIHRoYXQgdGhlcmUKKyAgICAgaXMgbm8gZnJhY3Rpb25hbCBwYXJ0LiAgSWYgd2UgZmluZCBuZWl0aGVyIG9mIHRoZXNlLCB0aGVuIHRoaXMgaXMKKyAgICAgbm90IGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBzbyByZXR1cm4gZmFpbHVyZS4gKi8KKworICBzd2l0Y2ggKCp0b2twdHIrKykKKyAgICB7CisgICAgICBjYXNlICcuJzoKKyAgICAgICAgLyogQWNjZXB0IGFuZCB0aGVuIGxvb2sgZm9yIGZyYWN0aW9uYWwgcGFydCBhbmQvb3IgZXhwb25lbnQuICovCisJKmNvcHkrKyA9ICcuJzsKKwlicmVhazsKKworICAgICAgY2FzZSAnZSc6CisgICAgICBjYXNlICdFJzoKKyAgICAgIGNhc2UgJ2QnOgorICAgICAgY2FzZSAnRCc6CisJaWYgKGNvcHkgPT0gYnVmKQorCSAgeworCSAgICByZXR1cm4gKDApOworCSAgfQorCSpjb3B5KysgPSAnZSc7CisJZ290byBjb2xsZWN0X2V4cG9uZW50OworCWJyZWFrOworCisgICAgICBkZWZhdWx0OgorCXJldHVybiAoMCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAvKiBXZSBmb3VuZCBhICcuJywgY29weSBhbnkgZnJhY3Rpb25hbCBkaWdpdHMgdG8gdGhlIGNvbnZlcnNpb24gYnVmZmVyLCB1cAorICAgICB0byB0aGUgZmlyc3Qgbm9uZGlnaXQsIG5vbi11bmRlcnNjb3JlIGNoYXJhY3Rlci4gKi8KKworICB3aGlsZSAoaXNkaWdpdCAoKnRva3B0cikgfHwgKnRva3B0ciA9PSAnXycpCisgICAgeworICAgICAgaWYgKCp0b2twdHIgIT0gJ18nKQorCXsKKwkgICpjb3B5KysgPSAqdG9rcHRyOworCX0KKyAgICAgIHRva3B0cisrOworICAgIH0KKworICAvKiBMb29rIGZvciBhbiBleHBvbmVudCwgd2hpY2ggbXVzdCBzdGFydCB3aXRoIG9uZSBvZiBbZUVkRF0uICBJZiBub25lCisgICAgIGlzIGZvdW5kLCBqdW1wIGRpcmVjdGx5IHRvIHRyeWluZyB0byBjb252ZXJ0IHdoYXQgd2UgaGF2ZSBjb2xsZWN0ZWQKKyAgICAgc28gZmFyLiAqLworCisgIHN3aXRjaCAoKnRva3B0cikKKyAgICB7CisgICAgICBjYXNlICdlJzoKKyAgICAgIGNhc2UgJ0UnOgorICAgICAgY2FzZSAnZCc6CisgICAgICBjYXNlICdEJzoKKwkqY29weSsrID0gJ2UnOworCXRva3B0cisrOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlnb3RvIGNvbnZlcnRfZmxvYXQ7CisJYnJlYWs7CisgICAgfQorCisgIC8qIEFjY2VwdCBhbiBvcHRpb25hbCAnLScgb3IgJysnIGZvbGxvd2luZyBvbmUgb2YgW2VFZERdLiAqLworCisgIGNvbGxlY3RfZXhwb25lbnQ6CisgIGlmICgqdG9rcHRyID09ICcrJyB8fCAqdG9rcHRyID09ICctJykKKyAgICB7CisgICAgICAqY29weSsrID0gKnRva3B0cisrOworICAgIH0KKworICAvKiBOb3cgY29weSBhbiBleHBvbmVudCBpbnRvIHRoZSBjb252ZXJzaW9uIGJ1ZmZlci4gIE5vdGUgdGhhdCBhdCB0aGUgCisgICAgIG1vbWVudCB1bmRlcnNjb3JlcyBhcmUgKm5vdCogYWxsb3dlZCBpbiBleHBvbmVudHMuICovCisKKyAgd2hpbGUgKGlzZGlnaXQgKCp0b2twdHIpKQorICAgIHsKKyAgICAgICpjb3B5KysgPSAqdG9rcHRyKys7CisgICAgfQorCisgIC8qIElmIHdlIHRyYW5zZmVyZWQgYW55IGNoYXJzIHRvIHRoZSBjb252ZXJzaW9uIGJ1ZmZlciwgdHJ5IHRvIGludGVycHJldCBpdHMKKyAgICAgY29udGVudHMgYXMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZS4gIElmIGFueSBjaGFyYWN0ZXJzIHJlbWFpbiwgdGhlbiB3ZQorICAgICBtdXN0IG5vdCBoYXZlIGEgdmFsaWQgZmxvYXRpbmcgcG9pbnQgc3RyaW5nLiAqLworCisgIGNvbnZlcnRfZmxvYXQ6CisgICpjb3B5ID0gJ1wwJzsKKyAgaWYgKGNvcHkgIT0gYnVmKQorICAgICAgeworICAgICAgICBkdmFsID0gc3RydG9kIChidWYsICZjb3B5KTsKKyAgICAgICAgaWYgKCpjb3B5ID09ICdcMCcpCisJICB7CisJICAgIHl5bHZhbC5kdmFsID0gZHZhbDsKKwkgICAgbGV4cHRyID0gdG9rcHRyOworCSAgICByZXR1cm4gKEZMT0FUX0xJVEVSQUwpOworCSAgfQorICAgICAgfQorICByZXR1cm4gKDApOworfQorCisvKiBSZWNvZ25pemUgYSBzdHJpbmcgbGl0ZXJhbC4gIEEgc3RyaW5nIGxpdGVyYWwgaXMgYSBzZXF1ZW5jZQorICAgb2YgY2hhcmFjdGVycyBlbmNsb3NlZCBpbiBtYXRjaGluZyBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcywgZXhjZXB0IHRoYXQKKyAgIGEgc2luZ2xlIGNoYXJhY3RlciBpbnNpZGUgc2luZ2xlIHF1b3RlcyBpcyBhIGNoYXJhY3RlciBsaXRlcmFsLCB3aGljaAorICAgd2UgcmVqZWN0IGFzIGEgc3RyaW5nIGxpdGVyYWwuICBUbyBlbWJlZCB0aGUgdGVybWluYXRvciBjaGFyYWN0ZXIgaW5zaWRlCisgICBhIHN0cmluZywgaXQgaXMgc2ltcGx5IGRvdWJsZWQgKEkuRS4gInRoaXMiImlzIiJvbmUiInN0cmluZyIpICovCisKK3N0YXRpYyBlbnVtIGNoX3Rlcm1pbmFsCittYXRjaF9zdHJpbmdfbGl0ZXJhbCAoKQoreworICBjaGFyICp0b2twdHIgPSBsZXhwdHI7CisgIGludCBpbl9jdHJsc2VxID0gMDsKKyAgTE9OR0VTVCBpdmFsOworCisgIGZvciAodGVtcGJ1ZmluZGV4ID0gMCwgdG9rcHRyKys7ICp0b2twdHIgIT0gJ1wwJzsgdG9rcHRyKyspCisgICAgeworICAgICAgQ0hFQ0tCVUYgKDEpOworICAgIHRyeWFnYWluOiA7CisgICAgICBpZiAoaW5fY3RybHNlcSkKKwl7CisJICAvKiBza2lwIHBvc3NpYmxlIHdoaXRlc3BhY2VzICovCisJICB3aGlsZSAoKCp0b2twdHIgPT0gJyAnIHx8ICp0b2twdHIgPT0gJ1x0JykgJiYgKnRva3B0cikKKwkgICAgdG9rcHRyKys7CisJICBpZiAoKnRva3B0ciA9PSAnKScpCisJICAgIHsKKwkgICAgICBpbl9jdHJsc2VxID0gMDsKKwkgICAgICB0b2twdHIrKzsKKwkgICAgICBnb3RvIHRyeWFnYWluOworCSAgICB9CisJICBlbHNlIGlmICgqdG9rcHRyICE9ICcsJykKKwkgICAgZXJyb3IgKCJJbnZhbGlkIGNvbnRyb2wgc2VxdWVuY2UiKTsKKwkgIHRva3B0cisrOworCSAgLyogc2tpcCBwb3NzaWJsZSB3aGl0ZXNwYWNlcyAqLworCSAgd2hpbGUgKCgqdG9rcHRyID09ICcgJyB8fCAqdG9rcHRyID09ICdcdCcpICYmICp0b2twdHIpCisJICAgIHRva3B0cisrOworCSAgaWYgKCFkZWNvZGVfaW50ZWdlcl9saXRlcmFsICgmaXZhbCwgJnRva3B0cikpCisJICAgIGVycm9yICgiSW52YWxpZCBjb250cm9sIHNlcXVlbmNlIik7CisJICB0b2twdHItLTsKKwl9CisgICAgICBlbHNlIGlmICgqdG9rcHRyID09ICpsZXhwdHIpCisJeworCSAgaWYgKCoodG9rcHRyICsgMSkgPT0gKmxleHB0cikKKwkgICAgeworCSAgICAgIGl2YWwgPSAqdG9rcHRyKys7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoKnRva3B0ciA9PSAnXicpCisJeworCSAgaWYgKCoodG9rcHRyICsgMSkgPT0gJygnKQorCSAgICB7CisJICAgICAgaW5fY3RybHNlcSA9IDE7CisJICAgICAgdG9rcHRyICs9IDI7CisJICAgICAgaWYgKCFkZWNvZGVfaW50ZWdlcl9saXRlcmFsICgmaXZhbCwgJnRva3B0cikpCisJCWVycm9yICgiSW52YWxpZCBjb250cm9sIHNlcXVlbmNlIik7CisJICAgICAgdG9rcHRyLS07CisJICAgIH0KKwkgIGVsc2UgaWYgKCoodG9rcHRyICsgMSkgPT0gJ14nKQorCSAgICBpdmFsID0gKnRva3B0cisrOworCSAgZWxzZQorCSAgICBlcnJvciAoIkludmFsaWQgY29udHJvbCBzZXF1ZW5jZSIpOworCX0KKyAgICAgIGVsc2UKKwlpdmFsID0gKnRva3B0cjsKKyAgICAgIHRlbXBidWZbdGVtcGJ1ZmluZGV4KytdID0gaXZhbDsKKyAgICB9CisgIGlmIChpbl9jdHJsc2VxKQorICAgIGVycm9yICgiSW52YWxpZCBjb250cm9sIHNlcXVlbmNlIik7CisKKyAgaWYgKCp0b2twdHIgPT0gJ1wwJwkJCQkJLyogbm8gdGVybWluYXRvciAqLworICAgICAgfHwgKHRlbXBidWZpbmRleCA9PSAxICYmICp0b2twdHIgPT0gJ1wnJykpCS8qIGNoYXIgbGl0ZXJhbCAqLworICAgIHsKKyAgICAgIHJldHVybiAoMCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdGVtcGJ1Zlt0ZW1wYnVmaW5kZXhdID0gJ1wwJzsKKyAgICAgIHl5bHZhbC5zdmFsLnB0ciA9IHRlbXBidWY7CisgICAgICB5eWx2YWwuc3ZhbC5sZW5ndGggPSB0ZW1wYnVmaW5kZXg7CisgICAgICBsZXhwdHIgPSArK3Rva3B0cjsKKyAgICAgIHJldHVybiAoQ0hBUkFDVEVSX1NUUklOR19MSVRFUkFMKTsKKyAgICB9Cit9CisKKy8qIFJlY29nbml6ZSBhIGNoYXJhY3RlciBsaXRlcmFsLiAgQSBjaGFyYWN0ZXIgbGl0ZXJhbCBpcyBzaW5nbGUgY2hhcmFjdGVyCisgICBvciBhIGNvbnRyb2wgc2VxdWVuY2UsIGVuY2xvc2VkIGluIHNpbmdsZSBxdW90ZXMuICBBIGNvbnRyb2wgc2VxdWVuY2UKKyAgIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygb25lIG9yIG1vcmUgaW50ZWdlciBsaXRlcmFscywgZW5jbG9zZWQKKyAgIGluIHBhcmVudGhlc2lzIGFuZCBpbnRyb2R1Y2VkIHdpdGggYSBjaXJjdW1mbGV4IGNoYXJhY3Rlci4KKworICAgRVg6ICAnYScgICdeKDcpJyAgJ14oNyw4KScKKworICAgQXMgYSBHTlUgY2hpbGwgZXh0ZW5zaW9uLCB0aGUgc3ludGF4IEMneHgnIGlzIGFsc28gcmVjb2duaXplZCBhcyBhIAorICAgY2hhcmFjdGVyIGxpdGVyYWwsIHdoZXJlIHh4IGlzIGEgaGV4IHZhbHVlIGZvciB0aGUgY2hhcmFjdGVyLgorCisgICBOb3RlIHRoYXQgbW9yZSB0aGFuIGEgc2luZ2xlIGNoYXJhY3RlciwgZW5jbG9zZWQgaW4gc2luZ2xlIHF1b3RlcywgaXMKKyAgIGEgc3RyaW5nIGxpdGVyYWwuCisKKyAgIFJldHVybnMgQ0hBUkFDVEVSX0xJVEVSQUwgaWYgYSBtYXRjaCBpcyBmb3VuZC4KKyAgICovCisKK3N0YXRpYyBlbnVtIGNoX3Rlcm1pbmFsCittYXRjaF9jaGFyYWN0ZXJfbGl0ZXJhbCAoKQoreworICBjaGFyICp0b2twdHIgPSBsZXhwdHI7CisgIExPTkdFU1QgaXZhbCA9IDA7CisgIAorICBpZiAoKCp0b2twdHIgPT0gJ2MnIHx8ICp0b2twdHIgPT0gJ0MnKSAmJiAoKih0b2twdHIgKyAxKSA9PSAnXCcnKSkKKyAgICB7CisgICAgICAvKiBXZSBoYXZlIGEgR05VIGNoaWxsIGV4dGVuc2lvbiBmb3JtLCBzbyBza2lwIHRoZSBsZWFkaW5nICJDJyIsCisJIGRlY29kZSB0aGUgaGV4IHZhbHVlLCBhbmQgdGhlbiBlbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdHJhaWxpbmcKKwkgc2luZ2xlIHF1b3RlIGNoYXJhY3Rlci4gKi8KKyAgICAgIHRva3B0ciArPSAyOworICAgICAgaWYgKCFkZWNvZGVfaW50ZWdlcl92YWx1ZSAoMTYsICZ0b2twdHIsICZpdmFsKSB8fCAoKnRva3B0ciAhPSAnXCcnKSkKKwl7CisJICByZXR1cm4gKDApOworCX0KKyAgICAgIHRva3B0cisrOworICAgIH0KKyAgZWxzZSBpZiAoKnRva3B0ciA9PSAnXCcnKQorICAgIHsKKyAgICAgIHRva3B0cisrOworCisgICAgICAvKiBEZXRlcm1pbmUgd2hpY2ggZm9ybSB3ZSBoYXZlLCBlaXRoZXIgYSBjb250cm9sIHNlcXVlbmNlIG9yIHRoZQorCSBzaW5nbGUgY2hhcmFjdGVyIGZvcm0uICovCisgICAgICAKKyAgICAgIGlmICgqdG9rcHRyID09ICdeJykKKwl7CisJICBpZiAoKih0b2twdHIgKyAxKSA9PSAnKCcpCisJICAgIHsKKwkgICAgICAvKiBNYXRjaCBhbmQgZGVjb2RlIGEgY29udHJvbCBzZXF1ZW5jZS4gIFJldHVybiB6ZXJvIGlmIHdlIGRvbid0CisJCSBmaW5kIGEgdmFsaWQgaW50ZWdlciBsaXRlcmFsLCBvciBpZiB0aGUgbmV4dCB1bmNvbnN1bWVkIGNoYXJhY3RlcgorCQkgYWZ0ZXIgdGhlIGludGVnZXIgbGl0ZXJhbCBpcyBub3QgdGhlIHRyYWlsaW5nICcpJy4gKi8KKwkgICAgICB0b2twdHIgKz0gMjsKKwkgICAgICBpZiAoIWRlY29kZV9pbnRlZ2VyX2xpdGVyYWwgKCZpdmFsLCAmdG9rcHRyKSB8fCAoKnRva3B0cisrICE9ICcpJykpCisJCXsKKwkJICByZXR1cm4gKDApOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKCoodG9rcHRyICsgMSkgPT0gJ14nKQorCSAgICB7CisJICAgICAgaXZhbCA9ICp0b2twdHI7CisJICAgICAgdG9rcHRyICs9IDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgLyogZmFpbCAqLworCSAgICBlcnJvciAoIkludmFsaWQgY29udHJvbCBzZXF1ZW5jZSIpOworCX0KKyAgICAgIGVsc2UgaWYgKCp0b2twdHIgPT0gJ1wnJykKKwl7CisJICAvKiB0aGlzIG11c3QgYmUgZHVwbGljYXRlZCAqLworCSAgaXZhbCA9ICp0b2twdHI7CisJICB0b2twdHIgKz0gMjsKKwl9CisgICAgICBlbHNlCisJeworCSAgaXZhbCA9ICp0b2twdHIrKzsKKwl9CisKKyAgICAgIC8qIFRoZSB0cmFpbGluZyBxdW90ZSBoYXMgbm90IHlldCBiZWVuIGNvbnN1bWVkLiAgSWYgd2UgZG9uJ3QgZmluZAorCSBpdCwgdGhlbiB3ZSBoYXZlIG5vIG1hdGNoLiAqLworICAgICAgCisgICAgICBpZiAoKnRva3B0cisrICE9ICdcJycpCisJeworCSAgcmV0dXJuICgwKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogTm90IGEgY2hhcmFjdGVyIGxpdGVyYWwuICovCisgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgeXlsdmFsLnR5cGVkX3ZhbC52YWwgPSBpdmFsOworICB5eWx2YWwudHlwZWRfdmFsLnR5cGUgPSBidWlsdGluX3R5cGVfY2hpbGxfY2hhcjsKKyAgbGV4cHRyID0gdG9rcHRyOworICByZXR1cm4gKENIQVJBQ1RFUl9MSVRFUkFMKTsKK30KKworLyogUmVjb2duaXplIGFuIGludGVnZXIgbGl0ZXJhbCwgYXMgc3BlY2lmaWVkIGluIFouMjAwIHNlYyA1LjIuNC4yLgorICAgTm90ZSB0aGF0IGFjY29yZGluZyB0byA1LjIuNC4yLCBhIHNpbmdsZSAiXyIgaXMgYWxzbyBhIHZhbGlkIGludGVnZXIKKyAgIGxpdGVyYWwsIGhvd2V2ZXIgR05VLWNoaWxsIHJlcXVpcmVzIHRoZXJlIHRvIGJlIGF0IGxlYXN0IG9uZSAiZGlnaXQiCisgICBpbiBhbnkgaW50ZWdlciBsaXRlcmFsLiAqLworCitzdGF0aWMgZW51bSBjaF90ZXJtaW5hbAorbWF0Y2hfaW50ZWdlcl9saXRlcmFsICgpCit7CisgIGNoYXIgKnRva3B0ciA9IGxleHB0cjsKKyAgTE9OR0VTVCBpdmFsOworICAKKyAgaWYgKCFkZWNvZGVfaW50ZWdlcl9saXRlcmFsICgmaXZhbCwgJnRva3B0cikpCisgICAgeworICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgIGVsc2UgCisgICAgeworICAgICAgeXlsdmFsLnR5cGVkX3ZhbC52YWwgPSBpdmFsOworI2lmIGRlZmluZWQoQ0NfSEFTX0xPTkdfTE9ORykgJiYgZGVmaW5lZChfX1NURENfXykKKyAgICAgIGlmIChpdmFsID4gKExPTkdFU1QpMjE0NzQ4MzY0N1UgfHwgaXZhbCA8IC0oTE9OR0VTVCkyMTQ3NDgzNjQ4VSkKKwl5eWx2YWwudHlwZWRfdmFsLnR5cGUgPSBidWlsdGluX3R5cGVfbG9uZ19sb25nOworICAgICAgZWxzZQorI2VuZGlmCisJeXlsdmFsLnR5cGVkX3ZhbC50eXBlID0gYnVpbHRpbl90eXBlX2ludDsKKyAgICAgIGxleHB0ciA9IHRva3B0cjsKKyAgICAgIHJldHVybiAoSU5URUdFUl9MSVRFUkFMKTsKKyAgICB9Cit9CisKKy8qIFJlY29nbml6ZSBhIGJpdC1zdHJpbmcgbGl0ZXJhbCwgYXMgc3BlY2lmaWVkIGluIFouMjAwIHNlYyA1LjIuNC44CisgICBOb3RlIHRoYXQgYWNjb3JkaW5nIHRvIDUuMi40LjgsIGEgc2luZ2xlICJfIiBpcyBhbHNvIGEgdmFsaWQgYml0LXN0cmluZworICAgbGl0ZXJhbCwgaG93ZXZlciBHTlUtY2hpbGwgcmVxdWlyZXMgdGhlcmUgdG8gYmUgYXQgbGVhc3Qgb25lICJkaWdpdCIKKyAgIGluIGFueSBiaXQtc3RyaW5nIGxpdGVyYWwuICovCisKK3N0YXRpYyBlbnVtIGNoX3Rlcm1pbmFsCittYXRjaF9iaXRzdHJpbmdfbGl0ZXJhbCAoKQoreworICByZWdpc3RlciBjaGFyICp0b2twdHIgPSBsZXhwdHI7CisgIGludCBiaXRvZmZzZXQgPSAwOworICBpbnQgYml0Y291bnQgPSAwOworICBpbnQgYml0c19wZXJfY2hhcjsKKyAgaW50IGRpZ2l0OworICAKKyAgdGVtcGJ1ZmluZGV4ID0gMDsKKyAgQ0hFQ0tCVUYgKDEpOworICB0ZW1wYnVmWzBdID0gMDsKKworICAvKiBMb29rIGZvciB0aGUgcmVxdWlyZWQgZXhwbGljaXQgYmFzZSBzcGVjaWZpZXIuICovCisgIAorICBzd2l0Y2ggKCp0b2twdHIrKykKKyAgICB7CisgICAgY2FzZSAnYic6CisgICAgY2FzZSAnQic6CisgICAgICBiaXRzX3Blcl9jaGFyID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ28nOgorICAgIGNhc2UgJ08nOgorICAgICAgYml0c19wZXJfY2hhciA9IDM7CisgICAgICBicmVhazsKKyAgICBjYXNlICdoJzoKKyAgICBjYXNlICdIJzoKKyAgICAgIGJpdHNfcGVyX2NoYXIgPSA0OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAoMCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogRW5zdXJlIHRoYXQgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgZXhwbGljaXQgYmFzZSBpcyBhIHNpbmdsZSBxdW90ZS4gKi8KKyAgCisgIGlmICgqdG9rcHRyKysgIT0gJ1wnJykKKyAgICB7CisgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgCisgIHdoaWxlICgqdG9rcHRyICE9ICdcMCcgJiYgKnRva3B0ciAhPSAnXCcnKQorICAgIHsKKyAgICAgIGRpZ2l0ID0gKnRva3B0cjsKKyAgICAgIGlmIChpc3VwcGVyIChkaWdpdCkpCisgICAgICAgIGRpZ2l0ID0gdG9sb3dlciAoZGlnaXQpOworICAgICAgdG9rcHRyKys7CisgICAgICBzd2l0Y2ggKGRpZ2l0KQorCXsKKwkgIGNhc2UgJ18nOgorCSAgICBjb250aW51ZTsKKwkgIGNhc2UgJzAnOiAgY2FzZSAnMSc6ICBjYXNlICcyJzogIGNhc2UgJzMnOiAgY2FzZSAnNCc6CisJICBjYXNlICc1JzogIGNhc2UgJzYnOiAgY2FzZSAnNyc6ICBjYXNlICc4JzogIGNhc2UgJzknOgorCSAgICBkaWdpdCAtPSAnMCc7CisJICAgIGJyZWFrOworCSAgY2FzZSAnYSc6ICBjYXNlICdiJzogIGNhc2UgJ2MnOiAgY2FzZSAnZCc6ICBjYXNlICdlJzogY2FzZSAnZic6CisJICAgIGRpZ2l0IC09ICdhJzsKKwkgICAgZGlnaXQgKz0gMTA7CisJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkgICAgLyogdGhpcyBpcyBub3QgYSBiaXRzdHJpbmcgbGl0ZXJhbCwgcHJvYmFibHkgYW4gaW50ZWdlciAqLworCSAgICByZXR1cm4gMDsKKwl9CisgICAgICBpZiAoZGlnaXQgPj0gMSA8PCBiaXRzX3Blcl9jaGFyKQorCXsKKwkgIC8qIEZvdW5kIHNvbWV0aGluZyBub3QgaW4gZG9tYWluIGZvciBjdXJyZW50IGJhc2UuICovCisJICBlcnJvciAoIlRvby1sYXJnZSBkaWdpdCBpbiBiaXRzdHJpbmcgb3IgaW50ZWdlci4iKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogRXh0cmFjdCBiaXRzIGZyb20gZGlnaXQsIHBhY2tpbmcgdGhlbSBpbnRvIHRoZSBiaXRzdHJpbmcgYnl0ZS4gKi8KKwkgIGludCBrID0gVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTiA/IGJpdHNfcGVyX2NoYXIgLSAxIDogMDsKKwkgIGZvciAoOyBUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOID8gayA+PSAwIDogayA8IGJpdHNfcGVyX2NoYXI7CisJICAgICAgIFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4gPyBrLS0gOiBrKyspCisJICAgIHsKKwkgICAgICBiaXRjb3VudCsrOworCSAgICAgIGlmIChkaWdpdCAmICgxIDw8IGspKQorCQl7CisJCSAgdGVtcGJ1Zlt0ZW1wYnVmaW5kZXhdIHw9CisJCSAgICAoVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKKwkJICAgICAgPyAoMSA8PCAoSE9TVF9DSEFSX0JJVCAtIDEgLSBiaXRvZmZzZXQpKQorCQkJOiAoMSA8PCBiaXRvZmZzZXQpOworCQl9CisJICAgICAgYml0b2Zmc2V0Kys7CisJICAgICAgaWYgKGJpdG9mZnNldCA9PSBIT1NUX0NIQVJfQklUKQorCQl7CisJCSAgYml0b2Zmc2V0ID0gMDsKKwkJICB0ZW1wYnVmaW5kZXgrKzsKKwkJICBDSEVDS0JVRigxKTsKKwkJICB0ZW1wYnVmW3RlbXBidWZpbmRleF0gPSAwOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICAKKyAgLyogVmVyaWZ5IHRoYXQgd2UgY29uc3VtZWQgZXZlcnl0aGluZyB1cCB0byB0aGUgdHJhaWxpbmcgc2luZ2xlIHF1b3RlLAorICAgICBhbmQgdGhhdCB3ZSBmb3VuZCBzb21lIGJpdHMgKElFIG5vdCBqdXN0IHVuZGVyYmFycykuICovCisKKyAgaWYgKCp0b2twdHIrKyAhPSAnXCcnKQorICAgIHsKKyAgICAgIHJldHVybiAoMCk7CisgICAgfQorICBlbHNlIAorICAgIHsKKyAgICAgIHl5bHZhbC5zdmFsLnB0ciA9IHRlbXBidWY7CisgICAgICB5eWx2YWwuc3ZhbC5sZW5ndGggPSBiaXRjb3VudDsKKyAgICAgIGxleHB0ciA9IHRva3B0cjsKKyAgICAgIHJldHVybiAoQklUX1NUUklOR19MSVRFUkFMKTsKKyAgICB9Cit9CisKK3N0cnVjdCB0b2tlbgoreworICBjaGFyICpvcGVyYXRvcjsKKyAgaW50IHRva2VuOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2tlbiBpZHRva2VudGFiW10gPQoreworICAgIHsgImFycmF5IiwgQVJSQVkgfSwKKyAgICB7ICJsZW5ndGgiLCBMRU5HVEggfSwKKyAgICB7ICJsb3dlciIsIExPV0VSIH0sCisgICAgeyAidXBwZXIiLCBVUFBFUiB9LAorICAgIHsgImFuZGlmIiwgQU5ESUYgfSwKKyAgICB7ICJwcmVkIiwgUFJFRCB9LAorICAgIHsgInN1Y2MiLCBTVUNDIH0sCisgICAgeyAiY2FyZCIsIENBUkQgfSwKKyAgICB7ICJzaXplIiwgU0laRSB9LAorICAgIHsgIm9yaWYiLCBPUklGIH0sCisgICAgeyAibnVtIiwgTlVNIH0sCisgICAgeyAiYWJzIiwgQUJTIH0sCisgICAgeyAibWF4IiwgTUFYX1RPS0VOIH0sCisgICAgeyAibWluIiwgTUlOX1RPS0VOIH0sCisgICAgeyAibW9kIiwgTU9EIH0sCisgICAgeyAicmVtIiwgUkVNIH0sCisgICAgeyAibm90IiwgTk9UIH0sCisgICAgeyAieG9yIiwgTE9HWE9SIH0sCisgICAgeyAiYW5kIiwgTE9HQU5EIH0sCisgICAgeyAiaW4iLCBJTiB9LAorICAgIHsgIm9yIiwgTE9HSU9SIH0sCisgICAgeyAidXAiLCBVUCB9LAorICAgIHsgImFkZHIiLCBBRERSX1RPS0VOIH0sCisgICAgeyAibnVsbCIsIEVNUFRJTkVTU19MSVRFUkFMIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rZW4gdG9rZW50YWIyW10gPQoreworICAgIHsgIjo9IiwgR0RCX0FTU0lHTk1FTlQgfSwKKyAgICB7ICIvLyIsIFNMQVNIX1NMQVNIIH0sCisgICAgeyAiLT4iLCBQT0lOVEVSIH0sCisgICAgeyAiLz0iLCBOT1RFUVVBTCB9LAorICAgIHsgIjw9IiwgTEVRIH0sCisgICAgeyAiPj0iLCBHRVEgfQorfTsKKworLyogUmVhZCBvbmUgdG9rZW4sIGdldHRpbmcgY2hhcmFjdGVycyB0aHJvdWdoIGxleHB0ci4gICovCisvKiBUaGlzIGlzIHdoZXJlIHdlIHdpbGwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxhbmd1YWdlIGFuZCB0aGUKKyAgIG9wZXJhdG9ycyB1c2VkIGFyZSBjb21wYXRpYmxlLiAgKi8KKworc3RhdGljIGVudW0gY2hfdGVybWluYWwKK2NoX2xleCAoKQoreworICAgIHVuc2lnbmVkIGludCBpOworICAgIGVudW0gY2hfdGVybWluYWwgdG9rZW47CisgICAgY2hhciAqaW5wdXRuYW1lOworICAgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKworICAgIC8qIFNraXAgb3ZlciBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlLiAqLworICAgIHdoaWxlIChpc3NwYWNlICgqbGV4cHRyKSkKKwl7CisJICAgIGxleHB0cisrOworCX0KKyAgICAvKiBMb29rIGZvciBzcGVjaWFsIHNpbmdsZSBjaGFyYWN0ZXIgY2FzZXMgd2hpY2ggY2FuJ3QgYmUgdGhlIGZpcnN0CisgICAgICAgY2hhcmFjdGVyIG9mIHNvbWUgb3RoZXIgbXVsdGljaGFyYWN0ZXIgdG9rZW4uICovCisgICAgc3dpdGNoICgqbGV4cHRyKQorCXsKKwkgICAgY2FzZSAnXDAnOgorCSAgICAgICAgcmV0dXJuIEVORF9UT0tFTjsKKwkgICAgY2FzZSAnLCc6CisJICAgIGNhc2UgJz0nOgorCSAgICBjYXNlICc7JzoKKwkgICAgY2FzZSAnISc6CisJICAgIGNhc2UgJysnOgorCSAgICBjYXNlICcqJzoKKwkgICAgY2FzZSAnKCc6CisJICAgIGNhc2UgJyknOgorCSAgICBjYXNlICdbJzoKKwkgICAgY2FzZSAnXSc6CisJCXJldHVybiAoKmxleHB0cisrKTsKKwl9CisgICAgLyogTG9vayBmb3IgY2hhcmFjdGVycyB3aGljaCBzdGFydCBhIHBhcnRpY3VsYXIga2luZCBvZiBtdWx0aWNoYXJhY3RlcgorICAgICAgIHRva2VuLCBzdWNoIGFzIGEgY2hhcmFjdGVyIGxpdGVyYWwsIHJlZ2lzdGVyIG5hbWUsIGNvbnZlbmllbmNlCisgICAgICAgdmFyaWFibGUgbmFtZSwgc3RyaW5nIGxpdGVyYWwsIGV0Yy4gKi8KKyAgICBzd2l0Y2ggKCpsZXhwdHIpCisgICAgICB7CisJY2FzZSAnXCcnOgorCWNhc2UgJ1wiJzoKKwkgIC8qIEZpcnN0IHRyeSB0byBtYXRjaCBhIHN0cmluZyBsaXRlcmFsLCB3aGljaCBpcyBhbnkKKwkgICAgIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgZW5jbG9zZWQgaW4gbWF0Y2hpbmcgc2luZ2xlIG9yIGRvdWJsZQorCSAgICAgcXVvdGVzLCBleGNlcHQgdGhhdCBhIHNpbmdsZSBjaGFyYWN0ZXIgaW5zaWRlIHNpbmdsZSBxdW90ZXMKKwkgICAgIGlzIGEgY2hhcmFjdGVyIGxpdGVyYWwsIHNvIHdlIGhhdmUgdG8gY2F0Y2ggdGhhdCBjYXNlIGFsc28uICovCisJICB0b2tlbiA9IG1hdGNoX3N0cmluZ19saXRlcmFsICgpOworCSAgaWYgKHRva2VuICE9IDApCisJICAgIHsKKwkgICAgICByZXR1cm4gKHRva2VuKTsKKwkgICAgfQorCSAgaWYgKCpsZXhwdHIgPT0gJ1wnJykKKwkgICAgeworCSAgICAgIHRva2VuID0gbWF0Y2hfY2hhcmFjdGVyX2xpdGVyYWwgKCk7CisJICAgICAgaWYgKHRva2VuICE9IDApCisJCXsKKwkJICByZXR1cm4gKHRva2VuKTsKKwkJfQorCSAgICB9CisJICBicmVhazsKKyAgICAgICAgY2FzZSAnQyc6CisgICAgICAgIGNhc2UgJ2MnOgorCSAgdG9rZW4gPSBtYXRjaF9jaGFyYWN0ZXJfbGl0ZXJhbCAoKTsKKwkgIGlmICh0b2tlbiAhPSAwKQorCSAgICB7CisJICAgICAgcmV0dXJuICh0b2tlbik7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgJyQnOgorCSAgeXlsdmFsLnN2YWwucHRyID0gbGV4cHRyOworCSAgZG8geworCSAgICBsZXhwdHIrKzsKKwkgIH0gd2hpbGUgKGlzYWxudW0gKCpsZXhwdHIpIHx8ICpsZXhwdHIgPT0gJ18nIHx8ICpsZXhwdHIgPT0gJyQnKTsKKwkgIHl5bHZhbC5zdmFsLmxlbmd0aCA9IGxleHB0ciAtIHl5bHZhbC5zdmFsLnB0cjsKKwkgIHdyaXRlX2RvbGxhcl92YXJpYWJsZSAoeXlsdmFsLnN2YWwpOworCSAgcmV0dXJuIEdEQl9WQVJJQUJMRTsKKwkgIGJyZWFrOworICAgICAgfQorICAgIC8qIFNlZSBpZiBpdCBpcyBhIHNwZWNpYWwgdG9rZW4gb2YgbGVuZ3RoIDIuICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHRva2VudGFiMikgLyBzaXplb2YgKHRva2VudGFiMlswXSk7IGkrKykKKwl7CisJICAgIGlmIChTVFJFUU4gKGxleHB0ciwgdG9rZW50YWIyW2ldLm9wZXJhdG9yLCAyKSkKKwkJeworCQkgICAgbGV4cHRyICs9IDI7CisJCSAgICByZXR1cm4gKHRva2VudGFiMltpXS50b2tlbik7CisJCX0KKwl9CisgICAgLyogTG9vayBmb3Igc2luZ2xlIGNoYXJhY3RlciBjYXNlcyB3aGljaCB3aGljaCBjb3VsZCBiZSB0aGUgZmlyc3QKKyAgICAgICBjaGFyYWN0ZXIgb2Ygc29tZSBvdGhlciBtdWx0aWNoYXJhY3RlciB0b2tlbiwgYnV0IGFyZW4ndCwgb3Igd2UKKyAgICAgICB3b3VsZCBhbHJlYWR5IGhhdmUgZm91bmQgaXQuICovCisgICAgc3dpdGNoICgqbGV4cHRyKQorCXsKKwkgICAgY2FzZSAnLSc6CisJICAgIGNhc2UgJzonOgorCSAgICBjYXNlICcvJzoKKwkgICAgY2FzZSAnPCc6CisJICAgIGNhc2UgJz4nOgorCQlyZXR1cm4gKCpsZXhwdHIrKyk7CisJfQorICAgIC8qIExvb2sgZm9yIGEgZmxvYXQgbGl0ZXJhbCBiZWZvcmUgbG9va2luZyBmb3IgYW4gaW50ZWdlciBsaXRlcmFsLCBzbworICAgICAgIHdlIG1hdGNoIGFzIG11Y2ggb2YgdGhlIGlucHV0IHN0cmVhbSBhcyBwb3NzaWJsZS4gKi8KKyAgICB0b2tlbiA9IG1hdGNoX2Zsb2F0X2xpdGVyYWwgKCk7CisgICAgaWYgKHRva2VuICE9IDApCisJeworCSAgICByZXR1cm4gKHRva2VuKTsKKwl9CisgICAgdG9rZW4gPSBtYXRjaF9iaXRzdHJpbmdfbGl0ZXJhbCAoKTsKKyAgICBpZiAodG9rZW4gIT0gMCkKKwl7CisJICAgIHJldHVybiAodG9rZW4pOworCX0KKyAgICB0b2tlbiA9IG1hdGNoX2ludGVnZXJfbGl0ZXJhbCAoKTsKKyAgICBpZiAodG9rZW4gIT0gMCkKKwl7CisJICAgIHJldHVybiAodG9rZW4pOworCX0KKworICAgIC8qIFRyeSB0byBtYXRjaCBhIHNpbXBsZSBuYW1lIHN0cmluZywgYW5kIGlmIGEgbWF0Y2ggaXMgZm91bmQsIHRoZW4KKyAgICAgICBmdXJ0aGVyIGNsYXNzaWZ5IHdoYXQgc29ydCBvZiBuYW1lIGl0IGlzIGFuZCByZXR1cm4gYW4gYXBwcm9wcmlhdGUKKyAgICAgICB0b2tlbi4gIE5vdGUgdGhhdCBhdHRlbXB0aW5nIHRvIG1hdGNoIGEgc2ltcGxlIG5hbWUgc3RyaW5nIGNvbnN1bWVzCisgICAgICAgdGhlIHRva2VuIGZyb20gbGV4cHRyLCBzbyB3ZSBjYW4ndCBiYWNrIG91dCBpZiB3ZSBsYXRlciBmaW5kIHRoYXQKKyAgICAgICB3ZSBjYW4ndCBjbGFzc2lmeSB3aGF0IHNvcnQgb2YgbmFtZSBpdCBpcy4gKi8KKworICAgIGlucHV0bmFtZSA9IG1hdGNoX3NpbXBsZV9uYW1lX3N0cmluZyAoKTsKKworICAgIGlmIChpbnB1dG5hbWUgIT0gTlVMTCkKKyAgICAgIHsKKwljaGFyICpzaW1wbGVuYW1lID0gKGNoYXIqKSBhbGxvY2EgKHN0cmxlbiAoaW5wdXRuYW1lKSArIDEpOworCisJY2hhciAqZHB0ciA9IHNpbXBsZW5hbWUsICpzcHRyID0gaW5wdXRuYW1lOworCWZvciAoOyAqc3B0cjsgc3B0cisrKQorCSAgKmRwdHIrKyA9IGlzdXBwZXIgKCpzcHRyKSA/IHRvbG93ZXIoKnNwdHIpIDogKnNwdHI7CisJKmRwdHIgPSAnXDAnOworCisJLyogU2VlIGlmIGl0IGlzIGEgcmVzZXJ2ZWQgaWRlbnRpZmllci4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChpZHRva2VudGFiKSAvIHNpemVvZiAoaWR0b2tlbnRhYlswXSk7IGkrKykKKwkgICAgeworCQlpZiAoU1RSRVEgKHNpbXBsZW5hbWUsIGlkdG9rZW50YWJbaV0ub3BlcmF0b3IpKQorCQkgICAgeworCQkJcmV0dXJuIChpZHRva2VudGFiW2ldLnRva2VuKTsKKwkJICAgIH0KKwkgICAgfQorCisJLyogTG9vayBmb3Igb3RoZXIgc3BlY2lhbCB0b2tlbnMuICovCisJaWYgKFNUUkVRIChzaW1wbGVuYW1lLCAidHJ1ZSIpKQorCSAgICB7CisJCXl5bHZhbC51bHZhbCA9IDE7CisJCXJldHVybiAoQk9PTEVBTl9MSVRFUkFMKTsKKwkgICAgfQorCWlmIChTVFJFUSAoc2ltcGxlbmFtZSwgImZhbHNlIikpCisJICAgIHsKKwkJeXlsdmFsLnVsdmFsID0gMDsKKwkJcmV0dXJuIChCT09MRUFOX0xJVEVSQUwpOworCSAgICB9CisKKwlzeW0gPSBsb29rdXBfc3ltYm9sIChpbnB1dG5hbWUsIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywKKwkJCSAgICAgVkFSX05BTUVTUEFDRSwgKGludCAqKSBOVUxMLAorCQkJICAgICAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCk7CisJaWYgKHN5bSA9PSBOVUxMICYmIHN0cmNtcCAoaW5wdXRuYW1lLCBzaW1wbGVuYW1lKSAhPSAwKQorCSAgeworCSAgICBzeW0gPSBsb29rdXBfc3ltYm9sIChzaW1wbGVuYW1lLCBleHByZXNzaW9uX2NvbnRleHRfYmxvY2ssCisJCQkJIFZBUl9OQU1FU1BBQ0UsIChpbnQgKikgTlVMTCwKKwkJCQkgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpOworCSAgfQorCWlmIChzeW0gIT0gTlVMTCkKKwkgIHsKKwkgICAgeXlsdmFsLnNzeW0uc3Rva2VuLnB0ciA9IE5VTEw7CisJICAgIHl5bHZhbC5zc3ltLnN0b2tlbi5sZW5ndGggPSAwOworCSAgICB5eWx2YWwuc3N5bS5zeW0gPSBzeW07CisJICAgIHl5bHZhbC5zc3ltLmlzX2FfZmllbGRfb2ZfdGhpcyA9IDA7CS8qIEZJWE1FLCBDKysnaXNtICovCisJICAgIHN3aXRjaCAoU1lNQk9MX0NMQVNTIChzeW0pKQorCSAgICAgIHsKKwkgICAgICBjYXNlIExPQ19CTE9DSzoKKwkJLyogRm91bmQgYSBwcm9jZWR1cmUgbmFtZS4gKi8KKwkJcmV0dXJuIChHRU5FUkFMX1BST0NFRFVSRV9OQU1FKTsKKwkgICAgICBjYXNlIExPQ19TVEFUSUM6CisJCS8qIEZvdW5kIGEgZ2xvYmFsIG9yIGxvY2FsIHN0YXRpYyB2YXJpYWJsZS4gKi8KKwkJcmV0dXJuIChMT0NBVElPTl9OQU1FKTsKKwkgICAgICBjYXNlIExPQ19SRUdJU1RFUjoKKwkgICAgICBjYXNlIExPQ19BUkc6CisJICAgICAgY2FzZSBMT0NfUkVGX0FSRzoKKwkgICAgICBjYXNlIExPQ19SRUdQQVJNOgorCSAgICAgIGNhc2UgTE9DX1JFR1BBUk1fQUREUjoKKwkgICAgICBjYXNlIExPQ19MT0NBTDoKKwkgICAgICBjYXNlIExPQ19MT0NBTF9BUkc6CisJICAgICAgY2FzZSBMT0NfQkFTRVJFRzoKKwkgICAgICBjYXNlIExPQ19CQVNFUkVHX0FSRzoKKwkJaWYgKGlubmVybW9zdF9ibG9jayA9PSBOVUxMCisJCSAgICB8fCBjb250YWluZWRfaW4gKGJsb2NrX2ZvdW5kLCBpbm5lcm1vc3RfYmxvY2spKQorCQkgIHsKKwkJICAgIGlubmVybW9zdF9ibG9jayA9IGJsb2NrX2ZvdW5kOworCQkgIH0KKwkJcmV0dXJuIChMT0NBVElPTl9OQU1FKTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBMT0NfQ09OU1Q6CisJICAgICAgY2FzZSBMT0NfTEFCRUw6CisJCXJldHVybiAoTE9DQVRJT05fTkFNRSk7CisJCWJyZWFrOworCSAgICAgIGNhc2UgTE9DX1RZUEVERUY6CisJCXl5bHZhbC50c3ltLnR5cGUgPSBTWU1CT0xfVFlQRSAoc3ltKTsKKwkJcmV0dXJuIFRZUEVOQU1FOworCSAgICAgIGNhc2UgTE9DX1VOREVGOgorCSAgICAgIGNhc2UgTE9DX0NPTlNUX0JZVEVTOgorCSAgICAgIGNhc2UgTE9DX09QVElNSVpFRF9PVVQ6CisJCWVycm9yICgiU3ltYm9sIFwiJXNcIiBuYW1lcyBubyBsb2NhdGlvbi4iLCBpbnB1dG5hbWUpOworCQlicmVhazsKKwkgICAgICBjYXNlIExPQ19VTlJFU09MVkVEOgorCQllcnJvciAoInVuaGFuZGxlZCBTWU1CT0xfQ0xBU1MgaW4gY2hfbGV4KCkiKTsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgfQorCWVsc2UgaWYgKCFoYXZlX2Z1bGxfc3ltYm9scyAoKSAmJiAhaGF2ZV9wYXJ0aWFsX3N5bWJvbHMgKCkpCisJICB7CisJICAgIGVycm9yICgiTm8gc3ltYm9sIHRhYmxlIGlzIGxvYWRlZC4gIFVzZSB0aGUgXCJmaWxlXCIgY29tbWFuZC4iKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGVycm9yICgiTm8gc3ltYm9sIFwiJXNcIiBpbiBjdXJyZW50IGNvbnRleHQuIiwgaW5wdXRuYW1lKTsKKwkgIH0KKyAgICAgIH0KKworICAgIC8qIENhdGNoIHNpbmdsZSBjaGFyYWN0ZXIgdG9rZW5zIHdoaWNoIGFyZSBub3QgcGFydCBvZiBzb21lCisgICAgICAgbG9uZ2VyIHRva2VuLiAqLworCisgICAgc3dpdGNoICgqbGV4cHRyKQorICAgICAgeworCWNhc2UgJy4nOgkJCS8qIE5vdCBmbG9hdCBmb3IgZXhhbXBsZS4gKi8KKwkgIGxleHB0cisrOworCSAgd2hpbGUgKGlzc3BhY2UgKCpsZXhwdHIpKSBsZXhwdHIrKzsKKwkgIGlucHV0bmFtZSA9IG1hdGNoX3NpbXBsZV9uYW1lX3N0cmluZyAoKTsKKwkgIGlmICghaW5wdXRuYW1lKQorCSAgICByZXR1cm4gJy4nOworCSAgcmV0dXJuIERPVF9GSUVMRF9OQU1FOworICAgICAgfQorCisgICAgcmV0dXJuIChJTExFR0FMX1RPS0VOKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX2xvd2VyX3VwcGVyX3ZhbHVlIChvcGNvZGUsIHR5cGUpCisgICAgIGVudW0gZXhwX29wY29kZSBvcGNvZGU7ICAvKiBFaXRoZXIgVU5PUF9MT1dFUiBvciBVTk9QX1VQUEVSICovCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworeworICBpZiAodHlwZSA9PSBOVUxMKQorICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChvcGNvZGUpOworICBlbHNlCisgICAgeworICAgICAgc3RydWN0IHR5cGUgKnJlc3VsdF90eXBlOworICAgICAgTE9OR0VTVCB2YWwgPSB0eXBlX2xvd2VyX3VwcGVyIChvcGNvZGUsIHR5cGUsICZyZXN1bHRfdHlwZSk7CisgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7CisgICAgICB3cml0ZV9leHBfZWx0X3R5cGUgKHJlc3VsdF90eXBlKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAodmFsKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKKyAgICB9Cit9CisKK3ZvaWQKK2NoaWxsX2Vycm9yIChtc2cpCisgICAgIGNoYXIgKm1zZzsKK3sKKyAgLyogTmV2ZXIgdXNlZC4gKi8KK30KZGlmZiAtLWdpdCBhL2dkYi9jaC1sYW5nLmMgYi9nZGIvY2gtbGFuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NGU4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY2gtbGFuZy5jCkBAIC0wLDAgKzEsNjc1IEBACisvKiBDaGlsbCBsYW5ndWFnZSBzdXBwb3J0IHJvdXRpbmVzIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk5MiwgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAicGFyc2VyLWRlZnMuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1ZGUgImNoLWxhbmcuaCIKKworc3RhdGljIHZhbHVlX3B0cgorZXZhbHVhdGVfc3ViZXhwX2NoaWxsIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIHN0cnVjdCBleHByZXNzaW9uICosIGludCAqLCBlbnVtIG5vc2lkZSkpOworCitzdGF0aWMgdmFsdWVfcHRyCit2YWx1ZV9jaGlsbF9tYXhfbWluIFBBUkFNUyAoKGVudW0gZXhwX29wY29kZSwgdmFsdWVfcHRyKSk7CisKK3N0YXRpYyB2YWx1ZV9wdHIKK3ZhbHVlX2NoaWxsX2NhcmQgUEFSQU1TICgodmFsdWVfcHRyKSk7CisKK3N0YXRpYyB2YWx1ZV9wdHIKKyB2YWx1ZV9jaGlsbF9sZW5ndGggUEFSQU1TICgodmFsdWVfcHRyKSk7CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitjaGlsbF9jcmVhdGVfZnVuZGFtZW50YWxfdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2NoaWxsX3ByaW50c3RyIFBBUkFNUyAoKEdEQl9GSUxFICpzdHJlYW0sIGNoYXIgKnN0cmluZywgdW5zaWduZWQgaW50IGxlbmd0aCwgaW50IHdpZHRoLCBpbnQgZm9yY2VfZWxsaXBzZXMpKTsKKworc3RhdGljIHZvaWQKK2NoaWxsX3ByaW50Y2hhciBQQVJBTVMgKChpbnQsIEdEQl9GSUxFICopKTsKKworLyogRm9yIG5vdywgQ2hpbGwgdXNlcyBhIHNpbXBsZSBtYW5nbGluZyBhbGdvcml0aG0gd2hlcmVieSB5b3Ugc2ltcGx5CisgICBkaXNjYXJkIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIG9jY3VyYW5jZSBvZiB0d28gc3VjY2Vzc2l2ZSBDUExVU19NQVJLRVIKKyAgIGNoYXJhY3RlcnMgdG8gZGVyaXZlIHRoZSBkZW1hbmdsZWQgZm9ybS4gKi8KKworY2hhciAqCitjaGlsbF9kZW1hbmdsZSAobWFuZ2xlZCkKKyAgICAgY29uc3QgY2hhciAqbWFuZ2xlZDsKK3sKKyAgY29uc3QgY2hhciAqam9pbmVyID0gTlVMTDsKKyAgY2hhciAqZGVtYW5nbGVkOworICBjb25zdCBjaGFyICpjcCA9IG1hbmdsZWQ7CisKKyAgd2hpbGUgKCpjcCkKKyAgICB7CisgICAgICBpZiAoaXNfY3BsdXNfbWFya2VyICgqY3ApKQorCXsKKwkgIGpvaW5lciA9IGNwOworCSAgYnJlYWs7CisJfQorICAgICAgY3ArKzsKKyAgICB9CisgIGlmIChqb2luZXIgIT0gTlVMTCAmJiAqKGpvaW5lciArIDEpID09ICpqb2luZXIpCisgICAgeworICAgICAgZGVtYW5nbGVkID0gc2F2ZXN0cmluZyAobWFuZ2xlZCwgam9pbmVyIC0gbWFuZ2xlZCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGVtYW5nbGVkID0gTlVMTDsKKyAgICB9CisgIHJldHVybiAoZGVtYW5nbGVkKTsKK30KKworc3RhdGljIHZvaWQKK2NoaWxsX3ByaW50Y2hhciAoYywgc3RyZWFtKQorICAgICByZWdpc3RlciBpbnQgYzsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgYyAmPSAweEZGOwkJCS8qIEF2b2lkIHNpZ24gYml0IGZvbGxpZXMgKi8KKworICBpZiAoUFJJTlRfTElURVJBTF9GT1JNIChjKSkKKyAgICB7CisgICAgICBpZiAoYyA9PSAnXCcnIHx8IGMgPT0gJ14nKQorCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiclYyVjJyIsIGMsIGMpOworICAgICAgZWxzZQorCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiclYyciLCBjKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICInXigldSknIiwgKHVuc2lnbmVkIGludCkgYyk7CisgICAgfQorfQorCisvKiBQcmludCB0aGUgY2hhcmFjdGVyIHN0cmluZyBTVFJJTkcsIHByaW50aW5nIGF0IG1vc3QgTEVOR1RIIGNoYXJhY3RlcnMuCisgICBQcmludGluZyBzdG9wcyBlYXJseSBpZiB0aGUgbnVtYmVyIGhpdHMgcHJpbnRfbWF4OyByZXBlYXQgY291bnRzCisgICBhcmUgcHJpbnRlZCBhcyBhcHByb3ByaWF0ZS4gIFByaW50IGVsbGlwc2VzIGF0IHRoZSBlbmQgaWYgd2UKKyAgIGhhZCB0byBzdG9wIGJlZm9yZSBwcmludGluZyBMRU5HVEggY2hhcmFjdGVycywgb3IgaWYgRk9SQ0VfRUxMSVBTRVMuCisgICBOb3RlIHRoYXQgZ2RiIG1haW50YWlucyB0aGUgbGVuZ3RoIG9mIHN0cmluZ3Mgd2l0aG91dCBjb3VudGluZyB0aGUKKyAgIHRlcm1pbmF0aW5nIG51bGwgYnl0ZSwgd2hpbGUgY2hpbGwgc3RyaW5ncyBhcmUgdHlwaWNhbGx5IHdyaXR0ZW4gd2l0aAorICAgYW4gZXhwbGljaXQgbnVsbCBieXRlLiAgU28gd2UgYWx3YXlzIGFzc3VtZSBhbiBpbXBsaWVkIG51bGwgYnl0ZQorICAgdW50aWwgZ2RiIGlzIGFibGUgdG8gbWFpbnRhaW4gbm9uLW51bGwgdGVybWluYXRlZCBzdHJpbmdzIGFzIHdlbGwKKyAgIGFzIG51bGwgdGVybWluYXRlZCBzdHJpbmdzIChGSVhNRSkuCisgICovCisKK3N0YXRpYyB2b2lkCitjaGlsbF9wcmludHN0ciAoc3RyZWFtLCBzdHJpbmcsIGxlbmd0aCwgd2lkdGgsIGZvcmNlX2VsbGlwc2VzKQorICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBjaGFyICpzdHJpbmc7CisgICAgIHVuc2lnbmVkIGludCBsZW5ndGg7CisgICAgIGludCB3aWR0aDsKKyAgICAgaW50IGZvcmNlX2VsbGlwc2VzOworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKKyAgdW5zaWduZWQgaW50IHRoaW5nc19wcmludGVkID0gMDsKKyAgaW50IGluX2xpdGVyYWxfZm9ybSA9IDA7CisgIGludCBpbl9jb250cm9sX2Zvcm0gPSAwOworICBpbnQgbmVlZF9zbGFzaHNsYXNoID0gMDsKKyAgdW5zaWduZWQgaW50IGM7CisgIGV4dGVybiBpbnQgcmVwZWF0X2NvdW50X3RocmVzaG9sZDsKKyAgZXh0ZXJuIGludCBwcmludF9tYXg7CisKKyAgaWYgKGxlbmd0aCA9PSAwKQorICAgIHsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiXCJcIiIsIHN0cmVhbSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggJiYgdGhpbmdzX3ByaW50ZWQgPCBwcmludF9tYXg7ICsraSkKKyAgICB7CisgICAgICAvKiBQb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHdlIGFyZSBleGFtaW5pbmcKKwkgdG8gc2VlIHdoZXRoZXIgaXQgaXMgcmVwZWF0ZWQuICAqLworICAgICAgdW5zaWduZWQgaW50IHJlcDE7CisgICAgICAvKiBOdW1iZXIgb2YgcmVwZXRpdGlvbnMgd2UgaGF2ZSBkZXRlY3RlZCBzbyBmYXIuICAqLworICAgICAgdW5zaWduZWQgaW50IHJlcHM7CisKKyAgICAgIFFVSVQ7CisKKyAgICAgIGlmIChuZWVkX3NsYXNoc2xhc2gpCisJeworCSAgZnB1dHNfZmlsdGVyZWQgKCIvLyIsIHN0cmVhbSk7CisJICBuZWVkX3NsYXNoc2xhc2ggPSAwOworCX0KKworICAgICAgcmVwMSA9IGkgKyAxOworICAgICAgcmVwcyA9IDE7CisgICAgICB3aGlsZSAocmVwMSA8IGxlbmd0aCAmJiBzdHJpbmdbcmVwMV0gPT0gc3RyaW5nW2ldKQorCXsKKwkgICsrcmVwMTsKKwkgICsrcmVwczsKKwl9CisKKyAgICAgIGMgPSBzdHJpbmdbaV07CisgICAgICBpZiAocmVwcyA+IHJlcGVhdF9jb3VudF90aHJlc2hvbGQpCisJeworCSAgaWYgKGluX2NvbnRyb2xfZm9ybSB8fCBpbl9saXRlcmFsX2Zvcm0pCisJICAgIHsKKwkgICAgICBpZiAoaW5fY29udHJvbF9mb3JtKQorCQlmcHV0c19maWx0ZXJlZCAoIikiLCBzdHJlYW0pOworCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiXCIvLyIsIHN0cmVhbSk7CisJICAgICAgaW5fY29udHJvbF9mb3JtID0gaW5fbGl0ZXJhbF9mb3JtID0gMDsKKwkgICAgfQorCSAgY2hpbGxfcHJpbnRjaGFyIChjLCBzdHJlYW0pOworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiPHJlcGVhdHMgJXUgdGltZXM+IiwgcmVwcyk7CisJICBpID0gcmVwMSAtIDE7CisJICB0aGluZ3NfcHJpbnRlZCArPSByZXBlYXRfY291bnRfdGhyZXNob2xkOworCSAgbmVlZF9zbGFzaHNsYXNoID0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKCEgaW5fbGl0ZXJhbF9mb3JtICYmICEgaW5fY29udHJvbF9mb3JtKQorCSAgICBmcHV0c19maWx0ZXJlZCAoIlwiIiwgc3RyZWFtKTsKKwkgIGlmIChQUklOVF9MSVRFUkFMX0ZPUk0gKGMpKQorCSAgICB7CisJICAgICAgaWYgKCFpbl9saXRlcmFsX2Zvcm0pCisJCXsKKwkJICBpZiAoaW5fY29udHJvbF9mb3JtKQorCQkgICAgeworCQkgICAgICBmcHV0c19maWx0ZXJlZCAoIikiLCBzdHJlYW0pOworCQkgICAgICBpbl9jb250cm9sX2Zvcm0gPSAwOworCQkgICAgfQorCQkgIGluX2xpdGVyYWxfZm9ybSA9IDE7CisJCX0KKwkgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlYyIsIGMpOworCSAgICAgIGlmIChjID09ICciJyB8fCBjID09ICdeJykKKwkJLyogZHVwbGljYXRlIHRoaXMgb25lIGFzIG11c3QgYmUgZG9uZSBhdCBpbnB1dCAqLworCQlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlYyIsIGMpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoIWluX2NvbnRyb2xfZm9ybSkKKwkJeworCQkgIGlmIChpbl9saXRlcmFsX2Zvcm0pCisJCSAgICB7CisJCSAgICAgIGluX2xpdGVyYWxfZm9ybSA9IDA7CisJCSAgICB9CisJCSAgZnB1dHNfZmlsdGVyZWQgKCJeKCIsIHN0cmVhbSk7CisJCSAgaW5fY29udHJvbF9mb3JtID0gMTsKKwkJfQorCSAgICAgIGVsc2UKKwkJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiLCIpOworCSAgICAgIGMgPSBjICYgMHhmZjsKKwkgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIldSIsICh1bnNpZ25lZCBpbnQpIGMpOworCSAgICB9CisJICArK3RoaW5nc19wcmludGVkOworCX0KKyAgICB9CisKKyAgLyogVGVybWluYXRlIHRoZSBxdW90ZXMgaWYgbmVjZXNzYXJ5LiAgKi8KKyAgaWYgKGluX2NvbnRyb2xfZm9ybSkKKyAgICB7CisgICAgICBmcHV0c19maWx0ZXJlZCAoIikiLCBzdHJlYW0pOworICAgIH0KKyAgaWYgKGluX2xpdGVyYWxfZm9ybSB8fCBpbl9jb250cm9sX2Zvcm0pCisgICAgeworICAgICAgZnB1dHNfZmlsdGVyZWQgKCJcIiIsIHN0cmVhbSk7CisgICAgfQorICBpZiAoZm9yY2VfZWxsaXBzZXMgfHwgKGkgPCBsZW5ndGgpKQorICAgIHsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiLi4uIiwgc3RyZWFtKTsKKyAgICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitjaGlsbF9jcmVhdGVfZnVuZGFtZW50YWxfdHlwZSAob2JqZmlsZSwgdHlwZWlkKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgaW50IHR5cGVpZDsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKnR5cGUgPSBOVUxMOworCisgIHN3aXRjaCAodHlwZWlkKQorICAgIHsKKyAgICAgIGRlZmF1bHQ6CisJLyogRklYTUU6ICBGb3Igbm93LCBpZiB3ZSBhcmUgYXNrZWQgdG8gcHJvZHVjZSBhIHR5cGUgbm90IGluIHRoaXMKKwkgICBsYW5ndWFnZSwgY3JlYXRlIHRoZSBlcXVpdmFsZW50IG9mIGEgQyBpbnRlZ2VyIHR5cGUgd2l0aCB0aGUKKwkgICBuYW1lICI8P3R5cGU/PiIuICBXaGVuIGFsbCB0aGUgZHVzdCBzZXR0bGVzIGZyb20gdGhlIHR5cGUKKwkgICByZWNvbnN0cnVjdGlvbiB3b3JrLCB0aGlzIHNob3VsZCBwcm9iYWJseSBiZWNvbWUgYW4gZXJyb3IuICovCisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgMiwgMCwgIjw/dHlwZT8+Iiwgb2JqZmlsZSk7CisgICAgICAgIHdhcm5pbmcgKCJpbnRlcm5hbCBlcnJvcjogbm8gY2hpbGwgZnVuZGFtZW50YWwgdHlwZSAlZCIsIHR5cGVpZCk7CisJYnJlYWs7CisgICAgICBjYXNlIEZUX1ZPSUQ6CisJLyogRklYTUU6ICBDdXJyZW50bHkgdGhlIEdOVSBDaGlsbCBjb21waWxlciBlbWl0cyBzb21lIERXQVJGIGVudHJpZXMgZm9yCisJICAgdHlwZWRlZnMsIHVucmVsYXRlZCB0byBhbnl0aGluZyBkaXJlY3RseSBpbiB0aGUgY29kZSBiZWluZyBjb21waWxlZCwKKwkgICB0aGF0IGhhdmUgc29tZSBGVF9WT0lEIHR5cGVzLiAgSnVzdCBmYWtlIGl0IGZvciBub3cuICovCisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX1ZPSUQsIDAsIDAsICI8P1ZPSUQ/PiIsIG9iamZpbGUpOworCWJyZWFrOworICAgICAgY2FzZSBGVF9CT09MRUFOOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9CT09MLCAxLCBUWVBFX0ZMQUdfVU5TSUdORUQsICJCT09MIiwgb2JqZmlsZSk7CisJYnJlYWs7CisgICAgICBjYXNlIEZUX0NIQVI6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0NIQVIsIDEsIFRZUEVfRkxBR19VTlNJR05FRCwgIkNIQVIiLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfU0lHTkVEX0NIQVI6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgMSwgMCwgIkJZVEUiLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfVU5TSUdORURfQ0hBUjoKKwl0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCAxLCBUWVBFX0ZMQUdfVU5TSUdORUQsICJVQllURSIsIG9iamZpbGUpOworCWJyZWFrOworICAgICAgY2FzZSBGVF9TSE9SVDoJCQkvKiBDaGlsbCBpbnRzIGFyZSAyIGJ5dGVzICovCisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgMiwgMCwgIklOVCIsIG9iamZpbGUpOworCWJyZWFrOworICAgICAgY2FzZSBGVF9VTlNJR05FRF9TSE9SVDoJCS8qIENoaWxsIGludHMgYXJlIDIgYnl0ZXMgKi8KKwl0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCAyLCBUWVBFX0ZMQUdfVU5TSUdORUQsICJVSU5UIiwgb2JqZmlsZSk7CisJYnJlYWs7CisgICAgICBjYXNlIEZUX0lOVEVHRVI6CQkJLyogRklYTUU/ICovCisgICAgICBjYXNlIEZUX1NJR05FRF9JTlRFR0VSOgkJLyogRklYTUU/ICovCisgICAgICBjYXNlIEZUX0xPTkc6CQkJLyogQ2hpbGwgbG9uZ3MgYXJlIDQgYnl0ZXMgKi8KKyAgICAgIGNhc2UgRlRfU0lHTkVEX0xPTkc6CQkvKiBDaGlsbCBsb25ncyBhcmUgNCBieXRlcyAqLworCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDQsIDAsICJMT05HIiwgb2JqZmlsZSk7CisJYnJlYWs7CisgICAgICBjYXNlIEZUX1VOU0lHTkVEX0lOVEVHRVI6CQkvKiBGSVhNRT8gKi8KKyAgICAgIGNhc2UgRlRfVU5TSUdORURfTE9ORzoJCS8qIENoaWxsIGxvbmdzIGFyZSA0IGJ5dGVzICovCisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgNCwgVFlQRV9GTEFHX1VOU0lHTkVELCAiVUxPTkciLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfRkxPQVQ6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0ZMVCwgNCwgMCwgIlJFQUwiLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfREJMX1BSRUNfRkxPQVQ6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0ZMVCwgOCwgMCwgIkxPTkdfUkVBTCIsIG9iamZpbGUpOworCWJyZWFrOworICAgICAgfQorICByZXR1cm4gKHR5cGUpOworfQorCisMCisvKiBUYWJsZSBvZiBvcGVyYXRvcnMgYW5kIHRoZWlyIHByZWNlZGVuY2VzIGZvciBwcmludGluZyBleHByZXNzaW9ucy4gICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3BfcHJpbnQgY2hpbGxfb3BfcHJpbnRfdGFiW10gPSB7CisgICAgeyJBTkQiLCBCSU5PUF9MT0dJQ0FMX0FORCwgUFJFQ19MT0dJQ0FMX0FORCwgMH0sCisgICAgeyJPUiIsICBCSU5PUF9MT0dJQ0FMX09SLCBQUkVDX0xPR0lDQUxfT1IsIDB9LAorICAgIHsiTk9UIiwgVU5PUF9MT0dJQ0FMX05PVCwgUFJFQ19QUkVGSVgsIDB9LAorICAgIHsiTU9EIiwgQklOT1BfTU9ELCBQUkVDX01VTCwgMH0sCisgICAgeyJSRU0iLCBCSU5PUF9SRU0sIFBSRUNfTVVMLCAwfSwKKyAgICB7IlNJWkUiLFVOT1BfU0laRU9GLCBQUkVDX0JVSUxUSU5fRlVOQ1RJT04sIDB9LAorICAgIHsiTE9XRVIiLFVOT1BfTE9XRVIsIFBSRUNfQlVJTFRJTl9GVU5DVElPTiwgMH0sCisgICAgeyJVUFBFUiIsVU5PUF9VUFBFUiwgUFJFQ19CVUlMVElOX0ZVTkNUSU9OLCAwfSwKKyAgICB7IkNBUkQiLFVOT1BfQ0FSRCwgUFJFQ19CVUlMVElOX0ZVTkNUSU9OLCAwfSwKKyAgICB7Ik1BWCIsVU5PUF9DSE1BWCwgUFJFQ19CVUlMVElOX0ZVTkNUSU9OLCAwfSwKKyAgICB7Ik1JTiIsVU5PUF9DSE1JTiwgUFJFQ19CVUlMVElOX0ZVTkNUSU9OLCAwfSwKKyAgICB7Ijo9IiwgIEJJTk9QX0FTU0lHTiwgUFJFQ19BU1NJR04sIDF9LAorICAgIHsiPSIsICAgQklOT1BfRVFVQUwsIFBSRUNfRVFVQUwsIDB9LAorICAgIHsiLz0iLCAgQklOT1BfTk9URVFVQUwsIFBSRUNfRVFVQUwsIDB9LAorICAgIHsiPD0iLCAgQklOT1BfTEVRLCBQUkVDX09SREVSLCAwfSwKKyAgICB7Ij49IiwgIEJJTk9QX0dFUSwgUFJFQ19PUkRFUiwgMH0sCisgICAgeyI+IiwgICBCSU5PUF9HVFIsIFBSRUNfT1JERVIsIDB9LAorICAgIHsiPCIsICAgQklOT1BfTEVTUywgUFJFQ19PUkRFUiwgMH0sCisgICAgeyIrIiwgICBCSU5PUF9BREQsIFBSRUNfQURELCAwfSwKKyAgICB7Ii0iLCAgIEJJTk9QX1NVQiwgUFJFQ19BREQsIDB9LAorICAgIHsiKiIsICAgQklOT1BfTVVMLCBQUkVDX01VTCwgMH0sCisgICAgeyIvIiwgICBCSU5PUF9ESVYsIFBSRUNfTVVMLCAwfSwKKyAgICB7Ii8vIiwgIEJJTk9QX0NPTkNBVCwgUFJFQ19QUkVGSVgsIDB9LAkvKiBGSVhNRTogcHJlY2VkZW5jZT8gKi8KKyAgICB7Ii0iLCAgIFVOT1BfTkVHLCBQUkVDX1BSRUZJWCwgMH0sCisgICAgeyItPiIsICBVTk9QX0lORCwgUFJFQ19TVUZGSVgsIDF9LAorICAgIHsiLT4iLCAgVU5PUF9BRERSLCBQUkVDX1BSRUZJWCwgMH0sCisgICAgeyI6IiwgICBCSU5PUF9SQU5HRSwgUFJFQ19BU1NJR04sIDB9LAorICAgIHtOVUxMLCAgMCwgMCwgMH0KK307CisMCisvKiBUaGUgYnVpbHQtaW4gdHlwZXMgb2YgQ2hpbGwuICAqLworCitzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2NoaWxsX2Jvb2w7CitzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2NoaWxsX2NoYXI7CitzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2NoaWxsX2xvbmc7CitzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2NoaWxsX3Vsb25nOworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9jaGlsbF9yZWFsOworCitzdHJ1Y3QgdHlwZSAqKiBDT05TVF9QVFIgKGNoaWxsX2J1aWx0aW5fdHlwZXNbXSkgPSAKK3sKKyAgJmJ1aWx0aW5fdHlwZV9jaGlsbF9ib29sLAorICAmYnVpbHRpbl90eXBlX2NoaWxsX2NoYXIsCisgICZidWlsdGluX3R5cGVfY2hpbGxfbG9uZywKKyAgJmJ1aWx0aW5fdHlwZV9jaGlsbF91bG9uZywKKyAgJmJ1aWx0aW5fdHlwZV9jaGlsbF9yZWFsLAorICAwCit9OworCisvKiBDYWxjdWxhdGUgTE9XRVIgb3IgVVBQRVIgb2YgVFlQRS4KKyAgIFJldHVybnMgdGhlIHJlc3VsdCBhcyBhbiBpbnRlZ2VyLgorICAgKlJFU1VMVF9UWVBFIGlzIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGZvciB0aGUgcmVzdWx0LiAqLworCitMT05HRVNUCit0eXBlX2xvd2VyX3VwcGVyIChvcCwgdHlwZSwgcmVzdWx0X3R5cGUpCisgICAgIGVudW0gZXhwX29wY29kZSBvcDsgIC8qIEVpdGhlciBVTk9QX0xPV0VSIG9yIFVOT1BfVVBQRVIgKi8KKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIHN0cnVjdCB0eXBlICoqcmVzdWx0X3R5cGU7Cit7CisgIExPTkdFU1QgbG93LCBoaWdoOworICAqcmVzdWx0X3R5cGUgPSB0eXBlOworICBDSEVDS19UWVBFREVGICh0eXBlKTsKKyAgc3dpdGNoIChUWVBFX0NPREUgKHR5cGUpKQorICAgIHsKKyAgICBjYXNlIFRZUEVfQ09ERV9TVFJVQ1Q6CisgICAgICAqcmVzdWx0X3R5cGUgPSBidWlsdGluX3R5cGVfaW50OworICAgICAgaWYgKGNoaWxsX3ZhcnlpbmdfdHlwZSAodHlwZSkpCisJcmV0dXJuIHR5cGVfbG93ZXJfdXBwZXIgKG9wLCBUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIDEpLCByZXN1bHRfdHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfQ09ERV9BUlJBWToKKyAgICBjYXNlIFRZUEVfQ09ERV9CSVRTVFJJTkc6CisgICAgY2FzZSBUWVBFX0NPREVfU1RSSU5HOgorICAgICAgdHlwZSA9IFRZUEVfRklFTERfVFlQRSAodHlwZSwgMCk7ICAvKiBHZXQgaW5kZXggdHlwZSAqLworCisgICAgICAvKiAuLi4gZmFsbCB0aHJvdWdoIC4uLiAqLworICAgIGNhc2UgVFlQRV9DT0RFX1JBTkdFOgorICAgICAgKnJlc3VsdF90eXBlID0gVFlQRV9UQVJHRVRfVFlQRSAodHlwZSk7CisgICAgICByZXR1cm4gb3AgPT0gVU5PUF9MT1dFUiA/IFRZUEVfTE9XX0JPVU5EICh0eXBlKSA6IFRZUEVfSElHSF9CT1VORCAodHlwZSk7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9FTlVNOgorICAgIGNhc2UgVFlQRV9DT0RFX0JPT0w6CisgICAgY2FzZSBUWVBFX0NPREVfSU5UOgorICAgIGNhc2UgVFlQRV9DT0RFX0NIQVI6CisgICAgICBpZiAoZ2V0X2Rpc2NyZXRlX2JvdW5kcyAodHlwZSwgJmxvdywgJmhpZ2gpID49IDApCisJeworCSAgKnJlc3VsdF90eXBlID0gdHlwZTsKKwkgIHJldHVybiBvcCA9PSBVTk9QX0xPV0VSID8gbG93IDogaGlnaDsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfQ09ERV9VTkRFRjoKKyAgICBjYXNlIFRZUEVfQ09ERV9QVFI6CisgICAgY2FzZSBUWVBFX0NPREVfVU5JT046CisgICAgY2FzZSBUWVBFX0NPREVfRlVOQzoKKyAgICBjYXNlIFRZUEVfQ09ERV9GTFQ6CisgICAgY2FzZSBUWVBFX0NPREVfVk9JRDoKKyAgICBjYXNlIFRZUEVfQ09ERV9TRVQ6CisgICAgY2FzZSBUWVBFX0NPREVfRVJST1I6CisgICAgY2FzZSBUWVBFX0NPREVfTUVNQkVSOgorICAgIGNhc2UgVFlQRV9DT0RFX01FVEhPRDoKKyAgICBjYXNlIFRZUEVfQ09ERV9SRUY6CisgICAgY2FzZSBUWVBFX0NPREVfQ09NUExFWDoKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICBlcnJvciAoInVua25vd24gbW9kZSBmb3IgTE9XRVIvVVBQRVIgYnVpbHRpbiIpOworfQorCitzdGF0aWMgdmFsdWVfcHRyCit2YWx1ZV9jaGlsbF9sZW5ndGggKHZhbCkKKyAgICAgdmFsdWVfcHRyIHZhbDsKK3sKKyAgTE9OR0VTVCB0bXA7CisgIHN0cnVjdCB0eXBlICp0eXBlID0gVkFMVUVfVFlQRSAodmFsKTsKKyAgc3RydWN0IHR5cGUgKnR0eXBlOworICBDSEVDS19UWVBFREVGICh0eXBlKTsKKyAgc3dpdGNoIChUWVBFX0NPREUgKHR5cGUpKQorICAgIHsKKyAgICBjYXNlIFRZUEVfQ09ERV9BUlJBWToKKyAgICBjYXNlIFRZUEVfQ09ERV9CSVRTVFJJTkc6CisgICAgY2FzZSBUWVBFX0NPREVfU1RSSU5HOgorICAgICAgdG1wID0gdHlwZV9sb3dlcl91cHBlciAoVU5PUF9VUFBFUiwgdHlwZSwgJnR0eXBlKQorCS0gdHlwZV9sb3dlcl91cHBlciAoVU5PUF9MT1dFUiwgdHlwZSwgJnR0eXBlKSArIDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfQ09ERV9TVFJVQ1Q6CisgICAgICBpZiAoY2hpbGxfdmFyeWluZ190eXBlICh0eXBlKSkKKwl7CisJICB0bXAgPSB1bnBhY2tfbG9uZyAoVFlQRV9GSUVMRF9UWVBFICh0eXBlLCAwKSwgVkFMVUVfQ09OVEVOVFMgKHZhbCkpOworCSAgYnJlYWs7CisJfQorICAgICAgLyogLi4uIGVsc2UgZmFsbCB0aHJvdWdoIC4uLiAqLworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciAoImJhZCBhcmd1bWVudCB0byBMRU5HVEggYnVpbHRpbiIpOworICAgIH0KKyAgcmV0dXJuIHZhbHVlX2Zyb21fbG9uZ2VzdCAoYnVpbHRpbl90eXBlX2ludCwgdG1wKTsKK30KKworc3RhdGljIHZhbHVlX3B0cgordmFsdWVfY2hpbGxfY2FyZCAodmFsKQorICAgICB2YWx1ZV9wdHIgdmFsOworeworICBMT05HRVNUIHRtcCA9IDA7CisgIHN0cnVjdCB0eXBlICp0eXBlID0gVkFMVUVfVFlQRSAodmFsKTsKKyAgQ0hFQ0tfVFlQRURFRiAodHlwZSk7CisKKyAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1NFVCkKKyAgICB7CisgICAgICBzdHJ1Y3QgdHlwZSAqcmFuZ2VfdHlwZSA9IFRZUEVfSU5ERVhfVFlQRSAodHlwZSk7CisgICAgICBMT05HRVNUIGxvd2VyX2JvdW5kLCB1cHBlcl9ib3VuZDsKKyAgICAgIGludCBpOworCisgICAgICBnZXRfZGlzY3JldGVfYm91bmRzIChyYW5nZV90eXBlLCAmbG93ZXJfYm91bmQsICZ1cHBlcl9ib3VuZCk7CisgICAgICBmb3IgKGkgPSBsb3dlcl9ib3VuZDsgaSA8PSB1cHBlcl9ib3VuZDsgaSsrKQorCWlmICh2YWx1ZV9iaXRfaW5kZXggKHR5cGUsIFZBTFVFX0NPTlRFTlRTICh2YWwpLCBpKSA+IDApCisJICB0bXArKzsKKyAgICB9CisgIGVsc2UKKyAgICBlcnJvciAoImJhZCBhcmd1bWVudCB0byBDQVJEIGJ1aWx0aW4iKTsKKworICByZXR1cm4gdmFsdWVfZnJvbV9sb25nZXN0IChidWlsdGluX3R5cGVfaW50LCB0bXApOworfQorCitzdGF0aWMgdmFsdWVfcHRyCit2YWx1ZV9jaGlsbF9tYXhfbWluIChvcCwgdmFsKQorICAgICBlbnVtIGV4cF9vcGNvZGUgb3A7CisgICAgIHZhbHVlX3B0ciB2YWw7Cit7CisgIExPTkdFU1QgdG1wID0gMDsKKyAgc3RydWN0IHR5cGUgKnR5cGUgPSBWQUxVRV9UWVBFICh2YWwpOworICBzdHJ1Y3QgdHlwZSAqZWx0dHlwZTsKKyAgQ0hFQ0tfVFlQRURFRiAodHlwZSk7CisKKyAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1NFVCkKKyAgICB7CisgICAgICBMT05HRVNUIGxvd2VyX2JvdW5kLCB1cHBlcl9ib3VuZDsKKyAgICAgIGludCBpLCBlbXB0eSA9IDE7CisKKyAgICAgIGVsdHR5cGUgPSBUWVBFX0lOREVYX1RZUEUgKHR5cGUpOworICAgICAgQ0hFQ0tfVFlQRURFRiAoZWx0dHlwZSk7CisgICAgICBnZXRfZGlzY3JldGVfYm91bmRzIChlbHR0eXBlLCAmbG93ZXJfYm91bmQsICZ1cHBlcl9ib3VuZCk7CisKKyAgICAgIGlmIChvcCA9PSBVTk9QX0NITUFYKQorCXsKKwkgIGZvciAoaSA9IHVwcGVyX2JvdW5kOyBpID49IGxvd2VyX2JvdW5kOyBpLS0pCisJICAgIHsKKwkgICAgICBpZiAodmFsdWVfYml0X2luZGV4ICh0eXBlLCBWQUxVRV9DT05URU5UUyAodmFsKSwgaSkgPiAwKQorCQl7CisJCSAgdG1wID0gaTsKKwkJICBlbXB0eSA9IDA7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBmb3IgKGkgPSBsb3dlcl9ib3VuZDsgaSA8PSB1cHBlcl9ib3VuZDsgaSsrKQorCSAgICB7CisJICAgICAgaWYgKHZhbHVlX2JpdF9pbmRleCAodHlwZSwgVkFMVUVfQ09OVEVOVFMgKHZhbCksIGkpID4gMCkKKwkJeworCQkgIHRtcCA9IGk7CisJCSAgZW1wdHkgPSAwOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgICBpZiAoZW1wdHkpCisJZXJyb3IgKCIlcyBmb3IgZW1wdHkgcG93ZXJzZXQiLCBvcCA9PSBVTk9QX0NITUFYID8gIk1BWCIgOiAiTUlOIik7CisgICAgfQorICBlbHNlCisgICAgZXJyb3IgKCJiYWQgYXJndW1lbnQgdG8gJXMgYnVpbHRpbiIsIG9wID09IFVOT1BfQ0hNQVggPyAiTUFYIiA6ICJNSU4iKTsKKworICByZXR1cm4gdmFsdWVfZnJvbV9sb25nZXN0IChUWVBFX0NPREUgKGVsdHR5cGUpID09IFRZUEVfQ09ERV9SQU5HRQorCQkJICAgICAgID8gVFlQRV9UQVJHRVRfVFlQRSAoZWx0dHlwZSkKKwkJCSAgICAgICA6IGVsdHR5cGUsCisJCQkgICAgIHRtcCk7Cit9CisKK3N0YXRpYyB2YWx1ZV9wdHIKK2V2YWx1YXRlX3N1YmV4cF9jaGlsbCAoZXhwZWN0X3R5cGUsIGV4cCwgcG9zLCBub3NpZGUpCisgICAgIHN0cnVjdCB0eXBlICpleHBlY3RfdHlwZTsKKyAgICAgcmVnaXN0ZXIgc3RydWN0IGV4cHJlc3Npb24gKmV4cDsKKyAgICAgcmVnaXN0ZXIgaW50ICpwb3M7CisgICAgIGVudW0gbm9zaWRlIG5vc2lkZTsKK3sKKyAgaW50IHBjID0gKnBvczsKKyAgc3RydWN0IHR5cGUgKnR5cGU7CisgIGludCB0ZW0sIG5hcmdzOworICB2YWx1ZV9wdHIgYXJnMTsKKyAgdmFsdWVfcHRyICphcmd2ZWM7CisgIGVudW0gZXhwX29wY29kZSBvcCA9IGV4cC0+ZWx0c1sqcG9zXS5vcGNvZGU7CisgIHN3aXRjaCAob3ApCisgICAgeworICAgIGNhc2UgTVVMVElfU1VCU0NSSVBUOgorICAgICAgaWYgKG5vc2lkZSA9PSBFVkFMX1NLSVApCisJYnJlYWs7CisgICAgICAoKnBvcykgKz0gMzsKKyAgICAgIG5hcmdzID0gbG9uZ2VzdF90b19pbnQgKGV4cC0+ZWx0c1twYyArIDFdLmxvbmdjb25zdCk7CisgICAgICBhcmcxID0gZXZhbHVhdGVfc3ViZXhwX3dpdGhfY29lcmNpb24gKGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZzEpKTsKKworICAgICAgaWYgKG5hcmdzID09IDEgJiYgVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfSU5UKQorCXsKKwkgIC8qIExvb2tzIGxpa2Ugc3RyaW5nIHJlcGV0aXRpb24uICovCisJICB2YWx1ZV9wdHIgc3RyaW5nID0gZXZhbHVhdGVfc3ViZXhwX3dpdGhfY29lcmNpb24gKGV4cCwgcG9zLCBub3NpZGUpOworCSAgcmV0dXJuIHZhbHVlX2NvbmNhdCAoYXJnMSwgc3RyaW5nKTsKKwl9CisKKyAgICAgIHN3aXRjaCAoVFlQRV9DT0RFICh0eXBlKSkKKwl7CisJY2FzZSBUWVBFX0NPREVfUFRSOgorCSAgdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKKwkgIGlmICghdHlwZSB8fCBUWVBFX0NPREUgKHR5cGUpICE9IFRZUEVfQ09ERV9GVU5DKQorCSAgICBlcnJvciAoInJlZmVyZW5jZSB2YWx1ZSB1c2VkIGFzIGZ1bmN0aW9uIik7CisJICAvKiAuLi4gZmFsbCB0aHJvdWdoIC4uLiAqLworCWNhc2UgVFlQRV9DT0RFX0ZVTkM6CisJICAvKiBJdCdzIGEgZnVuY3Rpb24gY2FsbC4gKi8KKwkgIGlmIChub3NpZGUgPT0gRVZBTF9BVk9JRF9TSURFX0VGRkVDVFMpCisJICAgIGJyZWFrOworCisJICAvKiBBbGxvY2F0ZSBhcmcgdmVjdG9yLCBpbmNsdWRpbmcgc3BhY2UgZm9yIHRoZSBmdW5jdGlvbiB0byBiZQorCSAgICAgY2FsbGVkIGluIGFyZ3ZlY1swXSBhbmQgYSB0ZXJtaW5hdGluZyBOVUxMICovCisJICBhcmd2ZWMgPSAodmFsdWVfcHRyICopIGFsbG9jYSAoc2l6ZW9mICh2YWx1ZV9wdHIpICogKG5hcmdzICsgMikpOworCSAgYXJndmVjWzBdID0gYXJnMTsKKwkgIHRlbSA9IDE7CisJICBmb3IgKDsgdGVtIDw9IG5hcmdzICYmIHRlbSA8PSBUWVBFX05GSUVMRFMgKHR5cGUpOyB0ZW0rKykKKwkgICAgeworCSAgICAgIGFyZ3ZlY1t0ZW1dCisJCT0gZXZhbHVhdGVfc3ViZXhwX2NoaWxsIChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIHRlbS0xKSwKKwkJCQkJIGV4cCwgcG9zLCBub3NpZGUpOworCSAgICB9CisJICBmb3IgKDsgdGVtIDw9IG5hcmdzOyB0ZW0rKykKKwkgICAgYXJndmVjW3RlbV0gPSBldmFsdWF0ZV9zdWJleHBfd2l0aF9jb2VyY2lvbiAoZXhwLCBwb3MsIG5vc2lkZSk7CisJICBhcmd2ZWNbdGVtXSA9IDA7IC8qIHNpZ25hbCBlbmQgb2YgYXJnbGlzdCAqLworCisJICByZXR1cm4gY2FsbF9mdW5jdGlvbl9ieV9oYW5kIChhcmd2ZWNbMF0sIG5hcmdzLCBhcmd2ZWMgKyAxKTsKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorCisgICAgICB3aGlsZSAobmFyZ3MtLSA+IDApCisJeworCSAgdmFsdWVfcHRyIGluZGV4ID0gZXZhbHVhdGVfc3ViZXhwX3dpdGhfY29lcmNpb24gKGV4cCwgcG9zLCBub3NpZGUpOworCSAgYXJnMSA9IHZhbHVlX3N1YnNjcmlwdCAoYXJnMSwgaW5kZXgpOworCX0KKyAgICAgIHJldHVybiAoYXJnMSk7CisKKyAgICBjYXNlIFVOT1BfTE9XRVI6CisgICAgY2FzZSBVTk9QX1VQUEVSOgorICAgICAgKCpwb3MpKys7CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfU0tJUCkKKwl7CisJICAoKmV4cC0+bGFuZ3VhZ2VfZGVmbi0+ZXZhbHVhdGVfZXhwKSAoTlVMTF9UWVBFLCBleHAsIHBvcywgRVZBTF9TS0lQKTsKKwkgIGdvdG8gbm9zaWRlcmV0OworCX0KKyAgICAgIGFyZzEgPSAoKmV4cC0+bGFuZ3VhZ2VfZGVmbi0+ZXZhbHVhdGVfZXhwKSAoTlVMTF9UWVBFLCBleHAsIHBvcywKKwkJCQkJCSAgRVZBTF9BVk9JRF9TSURFX0VGRkVDVFMpOworICAgICAgdGVtID0gdHlwZV9sb3dlcl91cHBlciAob3AsIFZBTFVFX1RZUEUgKGFyZzEpLCAmdHlwZSk7CisgICAgICByZXR1cm4gdmFsdWVfZnJvbV9sb25nZXN0ICh0eXBlLCB0ZW0pOworCisgICAgY2FzZSBVTk9QX0xFTkdUSDoKKyAgICAgICgqcG9zKSsrOworICAgICAgYXJnMSA9ICgqZXhwLT5sYW5ndWFnZV9kZWZuLT5ldmFsdWF0ZV9leHApIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgcmV0dXJuIHZhbHVlX2NoaWxsX2xlbmd0aCAoYXJnMSk7CisKKyAgICBjYXNlIFVOT1BfQ0FSRDoKKyAgICAgICgqcG9zKSsrOworICAgICAgYXJnMSA9ICgqZXhwLT5sYW5ndWFnZV9kZWZuLT5ldmFsdWF0ZV9leHApIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgcmV0dXJuIHZhbHVlX2NoaWxsX2NhcmQgKGFyZzEpOworCisgICAgY2FzZSBVTk9QX0NITUFYOgorICAgIGNhc2UgVU5PUF9DSE1JTjoKKyAgICAgICgqcG9zKSsrOworICAgICAgYXJnMSA9ICgqZXhwLT5sYW5ndWFnZV9kZWZuLT5ldmFsdWF0ZV9leHApIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgcmV0dXJuIHZhbHVlX2NoaWxsX21heF9taW4gKG9wLCBhcmcxKTsKKworICAgIGNhc2UgQklOT1BfQ09NTUE6CisgICAgICBlcnJvciAoIicsJyBvcGVyYXRvciB1c2VkIGluIGludmFsaWQgY29udGV4dCIpOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gZXZhbHVhdGVfc3ViZXhwX3N0YW5kYXJkIChleHBlY3RfdHlwZSwgZXhwLCBwb3MsIG5vc2lkZSk7Cisgbm9zaWRlcmV0OgorICByZXR1cm4gdmFsdWVfZnJvbV9sb25nZXN0IChidWlsdGluX3R5cGVfbG9uZywgKExPTkdFU1QpIDEpOworfQorCitjb25zdCBzdHJ1Y3QgbGFuZ3VhZ2VfZGVmbiBjaGlsbF9sYW5ndWFnZV9kZWZuID0geworICAiY2hpbGwiLAorICBsYW5ndWFnZV9jaGlsbCwKKyAgY2hpbGxfYnVpbHRpbl90eXBlcywKKyAgcmFuZ2VfY2hlY2tfb24sCisgIHR5cGVfY2hlY2tfb24sCisgIGNoaWxsX3BhcnNlLAkJCS8qIHBhcnNlciAqLworICBjaGlsbF9lcnJvciwJCQkvKiBwYXJzZXIgZXJyb3IgZnVuY3Rpb24gKi8KKyAgZXZhbHVhdGVfc3ViZXhwX2NoaWxsLAorICBjaGlsbF9wcmludGNoYXIsCQkvKiBwcmludCBhIGNoYXJhY3RlciBjb25zdGFudCAqLworICBjaGlsbF9wcmludHN0ciwJCS8qIGZ1bmN0aW9uIHRvIHByaW50IGEgc3RyaW5nIGNvbnN0YW50ICovCisgIE5VTEwsCQkJCS8qIEZ1bmN0aW9uIHRvIHByaW50IGEgc2luZ2xlIGNoYXIgKi8KKyAgY2hpbGxfY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGUsLyogQ3JlYXRlIGZ1bmRhbWVudGFsIHR5cGUgaW4gdGhpcyBsYW5ndWFnZSAqLworICBjaGlsbF9wcmludF90eXBlLAkJLyogUHJpbnQgYSB0eXBlIHVzaW5nIGFwcHJvcHJpYXRlIHN5bnRheCAqLworICBjaGlsbF92YWxfcHJpbnQsCQkvKiBQcmludCBhIHZhbHVlIHVzaW5nIGFwcHJvcHJpYXRlIHN5bnRheCAqLworICBjaGlsbF92YWx1ZV9wcmludCwJCS8qIFByaW50IGEgdG9wLWxldmwgdmFsdWUgKi8KKyAgeyIiLCAgICAgICJCJyIsICAiIiwgICAiIn0sCS8qIEJpbmFyeSBmb3JtYXQgaW5mbyAqLworICB7Ik8nJWxvIiwgICJPJyIsICAibyIsICAiIn0sCS8qIE9jdGFsIGZvcm1hdCBpbmZvICovCisgIHsiRCclbGQiLCAgIkQnIiwgICJkIiwgICIifSwJLyogRGVjaW1hbCBmb3JtYXQgaW5mbyAqLworICB7IkgnJWx4IiwgICJIJyIsICAieCIsICAiIn0sCS8qIEhleCBmb3JtYXQgaW5mbyAqLworICBjaGlsbF9vcF9wcmludF90YWIsCQkvKiBleHByZXNzaW9uIG9wZXJhdG9ycyBmb3IgcHJpbnRpbmcgKi8KKyAgMCwJCQkJLyogYXJyYXlzIGFyZSBmaXJzdC1jbGFzcyAobm90IGMtc3R5bGUpICovCisgIDAsCQkJCS8qIFN0cmluZyBsb3dlciBib3VuZCAqLworICAmYnVpbHRpbl90eXBlX2NoaWxsX2NoYXIsCS8qIFR5cGUgb2Ygc3RyaW5nIGVsZW1lbnRzICovIAorICBMQU5HX01BR0lDCit9OworCisvKiBJbml0aWFsaXphdGlvbiBmb3IgQ2hpbGwgKi8KKwordm9pZAorX2luaXRpYWxpemVfY2hpbGxfbGFuZ3VhZ2UgKCkKK3sKKyAgYnVpbHRpbl90eXBlX2NoaWxsX2Jvb2wgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0JPT0wsIFRBUkdFVF9DSEFSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgVFlQRV9GTEFHX1VOU0lHTkVELAorCSAgICAgICAiQk9PTCIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgYnVpbHRpbl90eXBlX2NoaWxsX2NoYXIgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0NIQVIsIFRBUkdFVF9DSEFSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgVFlQRV9GTEFHX1VOU0lHTkVELAorCSAgICAgICAiQ0hBUiIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgYnVpbHRpbl90eXBlX2NoaWxsX2xvbmcgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgVEFSR0VUX0xPTkdfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCSAgICAgICAwLAorCSAgICAgICAiTE9ORyIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgYnVpbHRpbl90eXBlX2NoaWxsX3Vsb25nID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIFRBUkdFVF9MT05HX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgVFlQRV9GTEFHX1VOU0lHTkVELAorCSAgICAgICAiVUxPTkciLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIGJ1aWx0aW5fdHlwZV9jaGlsbF9yZWFsID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9GTFQsIFRBUkdFVF9ET1VCTEVfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCSAgICAgICAwLAorCSAgICAgICAiTE9OR19SRUFMIiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworCisgIGFkZF9sYW5ndWFnZSAoJmNoaWxsX2xhbmd1YWdlX2RlZm4pOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2NoLWxhbmcuaCBiL2dkYi9jaC1sYW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyNWMzMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jaC1sYW5nLmgKQEAgLTAsMCArMSw0MiBAQAorLyogQ2hpbGwgbGFuZ3VhZ2Ugc3VwcG9ydCBkZWZpbml0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCQkvKiBGb3J3YXJkIGRlY2xzIGZvciBwcm90b3R5cGVzICovCitzdHJ1Y3QgdmFsdWU7CisjZW5kaWYKKworZXh0ZXJuIGludAorY2hpbGxfcGFyc2UgUEFSQU1TICgodm9pZCkpOwkvKiBEZWZpbmVkIGluIGNoLWV4cC55ICovCisKK2V4dGVybiB2b2lkCitjaGlsbF9lcnJvciBQQVJBTVMgKChjaGFyICopKTsJLyogRGVmaW5lZCBpbiBjaC1leHAueSAqLworCitleHRlcm4gdm9pZAkJCS8qIERlZmluZWQgaW4gY2gtdHlwZXByaW50LmMgKi8KK2NoaWxsX3ByaW50X3R5cGUgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqLCBHREJfRklMRSAqLCBpbnQsIGludCkpOworCitleHRlcm4gaW50CitjaGlsbF92YWxfcHJpbnQgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqLCBpbnQsIENPUkVfQUREUiwgR0RCX0ZJTEUgKiwgaW50LCBpbnQsCisJCQkgaW50LCBlbnVtIHZhbF9wcmV0dHlwcmludCkpOworCitleHRlcm4gaW50CitjaGlsbF92YWx1ZV9wcmludCBQQVJBTVMgKChzdHJ1Y3QgdmFsdWUgKiwgR0RCX0ZJTEUgKiwKKwkJCSAgIGludCwgZW51bSB2YWxfcHJldHR5cHJpbnQpKTsKKworZXh0ZXJuIExPTkdFU1QKK3R5cGVfbG93ZXJfdXBwZXIgUEFSQU1TICgoZW51bSBleHBfb3Bjb2RlLCBzdHJ1Y3QgdHlwZSAqLCBzdHJ1Y3QgdHlwZSAqKikpOwpkaWZmIC0tZ2l0IGEvZ2RiL2NoLXR5cGVwcmludC5jIGIvZ2RiL2NoLXR5cGVwcmludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YjE5NDQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY2gtdHlwZXByaW50LmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qIFN1cHBvcnQgZm9yIHByaW50aW5nIENoaWxsIHR5cGVzIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4OCwgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJiZmQuaCIJCS8qIEJpbmFyeSBGaWxlIERlc2NyaXB0aW9uICovCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAiZGVtYW5nbGUuaCIKKyNpbmNsdWRlICJjaC1sYW5nLmgiCisjaW5jbHVkZSAidHlwZXByaW50LmgiCisKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKworc3RhdGljIHZvaWQKK2NoaWxsX3R5cGVfcHJpbnRfYmFzZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBHREJfRklMRSAqLCBpbnQsIGludCkpOworCit2b2lkCitjaGlsbF9wcmludF90eXBlICh0eXBlLCB2YXJzdHJpbmcsIHN0cmVhbSwgc2hvdywgbGV2ZWwpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBjaGFyICp2YXJzdHJpbmc7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGludCBzaG93OworICAgICBpbnQgbGV2ZWw7Cit7CisgIGlmICh2YXJzdHJpbmcgIT0gTlVMTCAmJiAqdmFyc3RyaW5nICE9ICdcMCcpCisgICAgeworICAgICAgZnB1dHNfZmlsdGVyZWQgKHZhcnN0cmluZywgc3RyZWFtKTsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiICIsIHN0cmVhbSk7CisgICAgfQorICBjaGlsbF90eXBlX3ByaW50X2Jhc2UgKHR5cGUsIHN0cmVhbSwgc2hvdywgbGV2ZWwpOworfQorCisvKiBQcmludCB0aGUgbmFtZSBvZiB0aGUgdHlwZSAob3IgdGhlIHVsdGltYXRlIHBvaW50ZXIgdGFyZ2V0LAorICAgZnVuY3Rpb24gdmFsdWUgb3IgYXJyYXkgZWxlbWVudCkuCisKKyAgIFNIT1cgbm9uemVybyBtZWFucyBkb24ndCBwcmludCB0aGlzIHR5cGUgYXMganVzdCBpdHMgbmFtZTsKKyAgIHNob3cgaXRzIHJlYWwgZGVmaW5pdGlvbiBldmVuIGlmIGl0IGhhcyBhIG5hbWUuCisgICBTSE9XIHplcm8gbWVhbnMgcHJpbnQganVzdCB0eXBlbmFtZSBvciB0YWcgaWYgdGhlcmUgaXMgb25lCisgICBTSE9XIG5lZ2F0aXZlIG1lYW5zIGFiYnJldmlhdGUgc3RydWN0dXJlIGVsZW1lbnRzLgorICAgU0hPVyBpcyBkZWNyZW1lbnRlZCBmb3IgcHJpbnRpbmcgb2Ygc3RydWN0dXJlIGVsZW1lbnRzLgorCisgICBMRVZFTCBpcyB0aGUgZGVwdGggdG8gaW5kZW50IGJ5LgorICAgV2UgaW5jcmVhc2UgaXQgZm9yIHNvbWUgcmVjdXJzaXZlIGNhbGxzLiAgKi8KKworc3RhdGljIHZvaWQKK2NoaWxsX3R5cGVfcHJpbnRfYmFzZSAodHlwZSwgc3RyZWFtLCBzaG93LCBsZXZlbCkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGludCBzaG93OworICAgICBpbnQgbGV2ZWw7Cit7CisgIHJlZ2lzdGVyIGludCBsZW47CisgIHJlZ2lzdGVyIGludCBpOworICBzdHJ1Y3QgdHlwZSAqaW5kZXhfdHlwZTsKKyAgc3RydWN0IHR5cGUgKnJhbmdlX3R5cGU7CisgIExPTkdFU1QgbG93X2JvdW5kOworICBMT05HRVNUIGhpZ2hfYm91bmQ7CisKKyAgUVVJVDsKKworICB3cmFwX2hlcmUgKCIgICAgIik7CisgIGlmICh0eXBlID09IE5VTEwpCisgICAgeworICAgICAgZnB1dHNfZmlsdGVyZWQgKCI8dHlwZSB1bmtub3duPiIsIHN0cmVhbSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFdoZW4gU0hPVyBpcyB6ZXJvIG9yIGxlc3MsIGFuZCB0aGVyZSBpcyBhIHZhbGlkIHR5cGUgbmFtZSwgdGhlbiBhbHdheXMKKyAgICAganVzdCBwcmludCB0aGUgdHlwZSBuYW1lIGRpcmVjdGx5IGZyb20gdGhlIHR5cGUuICovCisKKyAgaWYgKChzaG93IDw9IDApICYmIChUWVBFX05BTUUgKHR5cGUpICE9IE5VTEwpKQorICAgIHsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkIChUWVBFX05BTUUgKHR5cGUpLCBzdHJlYW0pOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoVFlQRV9DT0RFICh0eXBlKSAhPSBUWVBFX0NPREVfVFlQRURFRikKKyAgICBDSEVDS19UWVBFREVGICh0eXBlKTsKKworICBzd2l0Y2ggKFRZUEVfQ09ERSAodHlwZSkpCisgICAgeworICAgICAgY2FzZSBUWVBFX0NPREVfVFlQRURFRjoKKyAgICAgICAgY2hpbGxfdHlwZV9wcmludF9iYXNlIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSwgc3RyZWFtLCAwLCBsZXZlbCk7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfQ09ERV9QVFI6CisJaWYgKFRZUEVfQ09ERSAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpID09IFRZUEVfQ09ERV9WT0lEKQorCSAgeworCSAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sCisJCQkgICAgICBUWVBFX05BTUUgKHR5cGUpID8gVFlQRV9OQU1FICh0eXBlKSA6ICJQVFIiKTsKKwkgICAgYnJlYWs7CisJICB9CisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiUkVGICIpOworCWNoaWxsX3R5cGVfcHJpbnRfYmFzZSAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSksIHN0cmVhbSwgMCwgbGV2ZWwpOworCWJyZWFrOworCisgICAgICBjYXNlIFRZUEVfQ09ERV9CT09MOgorCS8qIEZJWE1FOiB3ZSBzaG91bGQgcHJvYmFibHkganVzdCBwcmludCB0aGUgVFlQRV9OQU1FLCBpbiBjYXNlCisJICAgYW55b25lIGV2ZXIgZml4ZXMgdGhlIGNvbXBpbGVyIHRvIGdpdmUgdXMgdGhlIHJlYWwgbmFtZXMKKwkgICBpbiB0aGUgcHJlc2VuY2Ugb2YgdGhlIGNoaWxsIGVxdWl2YWxlbnQgb2YgdHlwZWRlZiAoYXNzdW1pbmcKKwkgICB0aGVyZSBpcyBvbmUpLiAgKi8KKwlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sCisJCQkgIFRZUEVfTkFNRSAodHlwZSkgPyBUWVBFX05BTUUgKHR5cGUpIDogIkJPT0wiKTsKKwlicmVhazsKKworICAgICAgY2FzZSBUWVBFX0NPREVfQVJSQVk6CisgICAgICAgIGZwdXRzX2ZpbHRlcmVkICgiQVJSQVkgKCIsIHN0cmVhbSk7CisJcmFuZ2VfdHlwZSA9IFRZUEVfRklFTERfVFlQRSAodHlwZSwgMCk7CisJaWYgKFRZUEVfQ09ERSAocmFuZ2VfdHlwZSkgIT0gVFlQRV9DT0RFX1JBTkdFKQorCSAgY2hpbGxfcHJpbnRfdHlwZSAocmFuZ2VfdHlwZSwgIiIsIHN0cmVhbSwgMCwgbGV2ZWwpOworCWVsc2UKKwkgIHsKKwkgICAgaW5kZXhfdHlwZSA9IFRZUEVfVEFSR0VUX1RZUEUgKHJhbmdlX3R5cGUpOworCSAgICBsb3dfYm91bmQgPSBUWVBFX0ZJRUxEX0JJVFBPUyAocmFuZ2VfdHlwZSwgMCk7CisJICAgIGhpZ2hfYm91bmQgPSBUWVBFX0ZJRUxEX0JJVFBPUyAocmFuZ2VfdHlwZSwgMSk7CisJICAgIHByaW50X3R5cGVfc2NhbGFyIChpbmRleF90eXBlLCBsb3dfYm91bmQsIHN0cmVhbSk7CisJICAgIGZwdXRzX2ZpbHRlcmVkICgiOiIsIHN0cmVhbSk7CisJICAgIHByaW50X3R5cGVfc2NhbGFyIChpbmRleF90eXBlLCBoaWdoX2JvdW5kLCBzdHJlYW0pOworCSAgfQorCWZwdXRzX2ZpbHRlcmVkICgiKSAiLCBzdHJlYW0pOworCWNoaWxsX3ByaW50X3R5cGUgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpLCAiIiwgc3RyZWFtLCAwLCBsZXZlbCk7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgVFlQRV9DT0RFX0JJVFNUUklORzoKKyAgICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiQk9PTFMgKCVkKSIsCisJCQkgIFRZUEVfRklFTERfQklUUE9TIChUWVBFX0ZJRUxEX1RZUEUodHlwZSwwKSwgMSkgKyAxKTsKKwlicmVhazsKKworICAgICAgY2FzZSBUWVBFX0NPREVfU0VUOgorICAgICAgICBmcHV0c19maWx0ZXJlZCAoIlBPV0VSU0VUICIsIHN0cmVhbSk7CisJY2hpbGxfcHJpbnRfdHlwZSAoVFlQRV9JTkRFWF9UWVBFICh0eXBlKSwgIiIsIHN0cmVhbSwKKwkJCSAgc2hvdyAtIDEsIGxldmVsKTsKKwlicmVhazsKKworICAgICAgY2FzZSBUWVBFX0NPREVfU1RSSU5HOgorCXJhbmdlX3R5cGUgPSBUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIDApOworCWluZGV4X3R5cGUgPSBUWVBFX1RBUkdFVF9UWVBFIChyYW5nZV90eXBlKTsKKwloaWdoX2JvdW5kID0gVFlQRV9GSUVMRF9CSVRQT1MgKHJhbmdlX3R5cGUsIDEpOworICAgICAgICBmcHV0c19maWx0ZXJlZCAoIkNIQVJTICgiLCBzdHJlYW0pOworCXByaW50X3R5cGVfc2NhbGFyIChpbmRleF90eXBlLCBoaWdoX2JvdW5kICsgMSwgc3RyZWFtKTsKKwlmcHV0c19maWx0ZXJlZCAoIikiLCBzdHJlYW0pOworCWJyZWFrOworCisgICAgICBjYXNlIFRZUEVfQ09ERV9NRU1CRVI6CisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiTUVNQkVSICIpOworICAgICAgICBjaGlsbF90eXBlX3ByaW50X2Jhc2UgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpLCBzdHJlYW0sIDAsIGxldmVsKTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT0RFX1JFRjoKKwlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIvKkxPQyovICIpOworICAgICAgICBjaGlsbF90eXBlX3ByaW50X2Jhc2UgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpLCBzdHJlYW0sIHNob3csIGxldmVsKTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT0RFX0ZVTkM6CisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiUFJPQyAoIik7CisJbGVuID0gVFlQRV9ORklFTERTICh0eXBlKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJICB7CisJICAgIHN0cnVjdCB0eXBlICpwYXJhbV90eXBlID0gVFlQRV9GSUVMRF9UWVBFICh0eXBlLCBpKTsKKwkgICAgaWYgKGkgPiAwKQorCSAgICAgIHsKKwkJZnB1dHNfZmlsdGVyZWQgKCIsICIsIHN0cmVhbSk7CisJCXdyYXBfaGVyZSAoIiAgICAiKTsKKwkgICAgICB9CisJICAgIGlmIChUWVBFX0NPREUgKHBhcmFtX3R5cGUpID09IFRZUEVfQ09ERV9SRUYpCisJICAgICAgeworCQljaGlsbF90eXBlX3ByaW50X2Jhc2UgKFRZUEVfVEFSR0VUX1RZUEUgKHBhcmFtX3R5cGUpLAorCQkJCSAgICAgICBzdHJlYW0sIDAsIGxldmVsKTsKKwkJZnB1dHNfZmlsdGVyZWQgKCIgTE9DIiwgc3RyZWFtKTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICBjaGlsbF90eXBlX3ByaW50X2Jhc2UgKHBhcmFtX3R5cGUsIHN0cmVhbSwgc2hvdywgbGV2ZWwpOworCSAgfQorCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIikiKTsKKwlpZiAoVFlQRV9DT0RFIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSkgIT0gVFlQRV9DT0RFX1ZPSUQpCisJICB7CisJICAgIGZwdXRzX2ZpbHRlcmVkICgiIFJFVFVSTlMgKCIsIHN0cmVhbSk7CisJICAgIGNoaWxsX3R5cGVfcHJpbnRfYmFzZSAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSksIHN0cmVhbSwgMCwgbGV2ZWwpOworCSAgICBmcHV0c19maWx0ZXJlZCAoIikiLCBzdHJlYW0pOworCSAgfQorCWJyZWFrOworCisgICAgICBjYXNlIFRZUEVfQ09ERV9TVFJVQ1Q6CisJaWYgKGNoaWxsX3ZhcnlpbmdfdHlwZSAodHlwZSkpCisJICB7CisJICAgIGNoaWxsX3R5cGVfcHJpbnRfYmFzZSAoVFlQRV9GSUVMRF9UWVBFICh0eXBlLCAxKSwKKwkJCQkgICBzdHJlYW0sIDAsIGxldmVsKTsKKwkgICAgZnB1dHNfZmlsdGVyZWQgKCIgVkFSWUlORyIsIHN0cmVhbSk7CisJICB9CisJZWxzZQorCSAgeworCSAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJTVFJVQ1QgIik7CisKKwkgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKFxuIik7CisJICAgIGlmICgoVFlQRV9ORklFTERTICh0eXBlKSA9PSAwKSAmJiAoVFlQRV9ORk5fRklFTERTICh0eXBlKSA9PSAwKSkKKwkgICAgICB7CisJCWlmIChUWVBFX0ZMQUdTICh0eXBlKSAmIFRZUEVfRkxBR19TVFVCKQorCQkgIHsKKwkJICAgIGZwcmludGZpX2ZpbHRlcmVkIChsZXZlbCArIDQsIHN0cmVhbSwgIjxpbmNvbXBsZXRlIHR5cGU+XG4iKTsKKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICBmcHJpbnRmaV9maWx0ZXJlZCAobGV2ZWwgKyA0LCBzdHJlYW0sICI8bm8gZGF0YSBmaWVsZHM+XG4iKTsKKwkJICB9CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlsZW4gPSBUWVBFX05GSUVMRFMgKHR5cGUpOworCQlmb3IgKGkgPSBUWVBFX05fQkFTRUNMQVNTRVMgKHR5cGUpOyBpIDwgbGVuOyBpKyspCisJCSAgeworCQkgICAgc3RydWN0IHR5cGUgKmZpZWxkX3R5cGUgPSBUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpOworCQkgICAgUVVJVDsKKwkJICAgIHByaW50X3NwYWNlc19maWx0ZXJlZCAobGV2ZWwgKyA0LCBzdHJlYW0pOworCQkgICAgaWYgKFRZUEVfQ09ERSAoZmllbGRfdHlwZSkgPT0gVFlQRV9DT0RFX1VOSU9OKQorCQkgICAgICB7IGludCBqOyAvKiB2YXJpYW50IG51bWJlciAqLworCQkJZnB1dHNfZmlsdGVyZWQgKCJDQVNFIE9GXG4iLCBzdHJlYW0pOworCQkJZm9yIChqID0gMDsgaiA8IFRZUEVfTkZJRUxEUyAoZmllbGRfdHlwZSk7IGorKykKKwkJCSAgeyBpbnQgazsgLyogdmFyaWFudCBmaWVsZCBpbmRleCAqLworCQkJICAgIHN0cnVjdCB0eXBlICp2YXJpYW50X3R5cGUKKwkJCSAgICAgID0gVFlQRV9GSUVMRF9UWVBFIChmaWVsZF90eXBlLCBqKTsKKwkJCSAgICBpbnQgdmFyX2xlbiA9IFRZUEVfTkZJRUxEUyAodmFyaWFudF90eXBlKTsKKwkJCSAgICBwcmludF9zcGFjZXNfZmlsdGVyZWQgKGxldmVsICsgNCwgc3RyZWFtKTsKKwkJCSAgICBpZiAoc3RyY21wIChUWVBFX0ZJRUxEX05BTUUgKGZpZWxkX3R5cGUsIGopLAorCQkJCQkiZWxzZSIpID09IDApCisJCQkgICAgICBmcHV0c19maWx0ZXJlZCAoIkVMU0VcbiIsIHN0cmVhbSk7CisJCQkgICAgZWxzZQorCQkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCI6XG4iLCBzdHJlYW0pOworCQkJICAgIGlmIChUWVBFX0NPREUgKHZhcmlhbnRfdHlwZSkgIT0gVFlQRV9DT0RFX1NUUlVDVCkKKwkJCSAgICAgIGVycm9yICgidmFyaWFudCByZWNvcmQgY29uZnVzaW9uIik7CisJCQkgICAgZm9yIChrID0gMDsgayA8IHZhcl9sZW47IGsrKykKKwkJCSAgICAgIHsKKwkJCQlwcmludF9zcGFjZXNfZmlsdGVyZWQgKGxldmVsICsgOCwgc3RyZWFtKTsKKwkJCQljaGlsbF9wcmludF90eXBlIChUWVBFX0ZJRUxEX1RZUEUgKHZhcmlhbnRfdHlwZSwgayksCisJCQkJCQkgIFRZUEVfRklFTERfTkFNRSAodmFyaWFudF90eXBlLCBrKSwKKwkJCQkJCSAgc3RyZWFtLCBzaG93IC0gMSwgbGV2ZWwgKyA4KTsKKwkJCQlpZiAoayA8ICh2YXJfbGVuIC0gMSkpCisJCQkJICBmcHV0c19maWx0ZXJlZCAoIiwiLCBzdHJlYW0pOworCQkJCWZwdXRzX2ZpbHRlcmVkICgiXG4iLCBzdHJlYW0pOworCQkJICAgICAgfQorCQkJICB9CisJCQlwcmludF9zcGFjZXNfZmlsdGVyZWQgKGxldmVsICsgNCwgc3RyZWFtKTsKKwkJCWZwdXRzX2ZpbHRlcmVkICgiRVNBQyIsIHN0cmVhbSk7CisJCSAgICAgIH0KKwkJICAgIGVsc2UKKwkJICAgICAgY2hpbGxfcHJpbnRfdHlwZSAoZmllbGRfdHlwZSwKKwkJCQkJVFlQRV9GSUVMRF9OQU1FICh0eXBlLCBpKSwKKwkJCQkJc3RyZWFtLCBzaG93IC0gMSwgbGV2ZWwgKyA0KTsKKwkJICAgIGlmIChpIDwgKGxlbiAtIDEpKQorCQkgICAgICB7CisJCQlmcHV0c19maWx0ZXJlZCAoIiwiLCBzdHJlYW0pOworCQkgICAgICB9CisJCSAgICBmcHV0c19maWx0ZXJlZCAoIlxuIiwgc3RyZWFtKTsKKwkJICB9CisJICAgICAgfQorCSAgICBmcHJpbnRmaV9maWx0ZXJlZCAobGV2ZWwsIHN0cmVhbSwgIikiKTsKKwkgIH0KKwlicmVhazsKKworICAgICAgY2FzZSBUWVBFX0NPREVfUkFOR0U6CisJICB7CisJICAgIHN0cnVjdCB0eXBlICp0YXJnZXQgPSBUWVBFX1RBUkdFVF9UWVBFICh0eXBlKTsKKwkgICAgaWYgKHRhcmdldCAmJiBUWVBFX05BTUUgKHRhcmdldCkpCisJICAgICAgZnB1dHNfZmlsdGVyZWQgKFRZUEVfTkFNRSAodGFyZ2V0KSwgc3RyZWFtKTsKKwkgICAgZWxzZQorCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiUkFOR0UiLCBzdHJlYW0pOworCSAgICBpZiAodGFyZ2V0ID09IE5VTEwpCisJICAgICAgdGFyZ2V0ID0gYnVpbHRpbl90eXBlX2xvbmc7CisJICAgIGZwdXRzX2ZpbHRlcmVkICgiICgiLCBzdHJlYW0pOworCSAgICBwcmludF90eXBlX3NjYWxhciAodGFyZ2V0LCBUWVBFX0xPV19CT1VORCAodHlwZSksIHN0cmVhbSk7CisJICAgIGZwdXRzX2ZpbHRlcmVkICgiOiIsIHN0cmVhbSk7CisJICAgIHByaW50X3R5cGVfc2NhbGFyICh0YXJnZXQsIFRZUEVfSElHSF9CT1VORCAodHlwZSksIHN0cmVhbSk7CisJICAgIGZwdXRzX2ZpbHRlcmVkICgiKSIsIHN0cmVhbSk7CisJICB9CisJYnJlYWs7CisKKyAgICAgIGNhc2UgVFlQRV9DT0RFX0VOVU06CisJeworCSAgcmVnaXN0ZXIgaW50IGxhc3R2YWwgPSAwOworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiU0VUICgiKTsKKwkgIGxlbiA9IFRZUEVfTkZJRUxEUyAodHlwZSk7CisJICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJICAgIHsKKwkgICAgICBRVUlUOworCSAgICAgIGlmIChpKSBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIsICIpOworCSAgICAgIHdyYXBfaGVyZSAoIiAgICAiKTsKKwkgICAgICBmcHV0c19maWx0ZXJlZCAoVFlQRV9GSUVMRF9OQU1FICh0eXBlLCBpKSwgc3RyZWFtKTsKKwkgICAgICBpZiAobGFzdHZhbCAhPSBUWVBFX0ZJRUxEX0JJVFBPUyAodHlwZSwgaSkpCisJCXsKKwkJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIgPSAlZCIsIFRZUEVfRklFTERfQklUUE9TICh0eXBlLCBpKSk7CisJCSAgbGFzdHZhbCA9IFRZUEVfRklFTERfQklUUE9TICh0eXBlLCBpKTsKKwkJfQorCSAgICAgIGxhc3R2YWwrKzsKKwkgICAgfQorCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKSIpOworCX0KKwlicmVhazsKKworICAgICAgY2FzZSBUWVBFX0NPREVfVk9JRDoKKyAgICAgIGNhc2UgVFlQRV9DT0RFX1VOREVGOgorICAgICAgY2FzZSBUWVBFX0NPREVfRVJST1I6CisgICAgICBjYXNlIFRZUEVfQ09ERV9VTklPTjoKKyAgICAgIGNhc2UgVFlQRV9DT0RFX01FVEhPRDoKKwllcnJvciAoIm1pc3NpbmcgbGFuZ3VhZ2Ugc3VwcG9ydCBpbiBjaGlsbF90eXBlX3ByaW50X2Jhc2UiKTsKKwlicmVhazsKKworICAgICAgZGVmYXVsdDoKKworCS8qIEhhbmRsZSB0eXBlcyBub3QgZXhwbGljaXRseSBoYW5kbGVkIGJ5IHRoZSBvdGhlciBjYXNlcywKKwkgICBzdWNoIGFzIGZ1bmRhbWVudGFsIHR5cGVzLiAgRm9yIHRoZXNlLCBqdXN0IHByaW50IHdoYXRldmVyCisJICAgdGhlIHR5cGUgbmFtZSBpcywgYXMgcmVjb3JkZWQgaW4gdGhlIHR5cGUgaXRzZWxmLiAgSWYgdGhlcmUKKwkgICBpcyBubyB0eXBlIG5hbWUsIHRoZW4gY29tcGxhaW4uICovCisKKwlpZiAoVFlQRV9OQU1FICh0eXBlKSAhPSBOVUxMKQorCSAgeworCSAgICBmcHV0c19maWx0ZXJlZCAoVFlQRV9OQU1FICh0eXBlKSwgc3RyZWFtKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGVycm9yICgiVW5yZWNvZ25pemVkIHR5cGUgY29kZSAoJWQpIGluIHN5bWJvbCB0YWJsZS4iLAorCQkgICBUWVBFX0NPREUgKHR5cGUpKTsKKwkgIH0KKwlicmVhazsKKyAgICAgIH0KK30KZGlmZiAtLWdpdCBhL2dkYi9jaC12YWxwcmludC5jIGIvZ2RiL2NoLXZhbHByaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYzYmE2NAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jaC12YWxwcmludC5jCkBAIC0wLDAgKzEsNjMwIEBACisvKiBTdXBwb3J0IGZvciBwcmludGluZyBDaGlsbCB2YWx1ZXMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg4LCAxOTg5LCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgInZhbHByaW50LmgiCisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJkZW1hbmdsZS5oIgorI2luY2x1ZGUgImMtbGFuZy5oIiAvKiBGb3IgY192YWxfcHJpbnQgKi8KKyNpbmNsdWRlICJ0eXBlcHJpbnQuaCIKKyNpbmNsdWRlICJjaC1sYW5nLmgiCisjaW5jbHVkZSAiYW5ub3RhdGUuaCIKKworc3RhdGljIHZvaWQKK2NoaWxsX3ByaW50X3ZhbHVlX2ZpZWxkcyBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBjaGFyICosIEdEQl9GSUxFICosIGludCwgaW50LAorCQkJCSAgZW51bSB2YWxfcHJldHR5cHJpbnQsIHN0cnVjdCB0eXBlICoqKSk7CisKK3N0YXRpYyB2b2lkCitjaGlsbF9wcmludF90eXBlX3NjYWxhciBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBMT05HRVNULCBHREJfRklMRSAqKSk7CisKK3N0YXRpYyB2b2lkCitjaGlsbF92YWxfcHJpbnRfYXJyYXlfZWxlbWVudHMgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqLCBDT1JFX0FERFIsIEdEQl9GSUxFICosCisJCQkJCWludCwgaW50LCBpbnQsIGVudW0gdmFsX3ByZXR0eXByaW50KSk7CisKKwwKKy8qIFByaW50IGludGVncmFsIHNjYWxhciBkYXRhIFZBTCwgb2YgdHlwZSBUWVBFLCBvbnRvIHN0ZGlvIHN0cmVhbSBTVFJFQU0uCisgICBVc2VkIHRvIHByaW50IGRhdGEgZnJvbSB0eXBlIHN0cnVjdHVyZXMgaW4gYSBzcGVjaWZpZWQgdHlwZS4gIEZvciBleGFtcGxlLAorICAgYXJyYXkgYm91bmRzIG1heSBiZSBjaGFyYWN0ZXJzIG9yIGJvb2xlYW5zIGluIHNvbWUgbGFuZ3VhZ2VzLCBhbmQgdGhpcworICAgYWxsb3dzIHRoZSByYW5nZXMgdG8gYmUgcHJpbnRlZCBpbiB0aGVpciAibmF0dXJhbCIgZm9ybSByYXRoZXIgdGhhbiBhcworICAgZGVjaW1hbCBpbnRlZ2VyIHZhbHVlcy4gKi8KKworc3RhdGljIHZvaWQKK2NoaWxsX3ByaW50X3R5cGVfc2NhbGFyICh0eXBlLCB2YWwsIHN0cmVhbSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIExPTkdFU1QgdmFsOworICAgICBHREJfRklMRSAqc3RyZWFtOworeworICBzd2l0Y2ggKFRZUEVfQ09ERSAodHlwZSkpCisgICAgeworICAgIGNhc2UgVFlQRV9DT0RFX1JBTkdFOgorICAgICAgaWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKQorCXsKKwkgIGNoaWxsX3ByaW50X3R5cGVfc2NhbGFyIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSwgdmFsLCBzdHJlYW0pOworCSAgcmV0dXJuOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9DT0RFX1VOREVGOgorICAgIGNhc2UgVFlQRV9DT0RFX1BUUjoKKyAgICBjYXNlIFRZUEVfQ09ERV9BUlJBWToKKyAgICBjYXNlIFRZUEVfQ09ERV9TVFJVQ1Q6CisgICAgY2FzZSBUWVBFX0NPREVfVU5JT046CisgICAgY2FzZSBUWVBFX0NPREVfRU5VTToKKyAgICBjYXNlIFRZUEVfQ09ERV9GVU5DOgorICAgIGNhc2UgVFlQRV9DT0RFX0lOVDoKKyAgICBjYXNlIFRZUEVfQ09ERV9GTFQ6CisgICAgY2FzZSBUWVBFX0NPREVfVk9JRDoKKyAgICBjYXNlIFRZUEVfQ09ERV9TRVQ6CisgICAgY2FzZSBUWVBFX0NPREVfU1RSSU5HOgorICAgIGNhc2UgVFlQRV9DT0RFX0JJVFNUUklORzoKKyAgICBjYXNlIFRZUEVfQ09ERV9FUlJPUjoKKyAgICBjYXNlIFRZUEVfQ09ERV9NRU1CRVI6CisgICAgY2FzZSBUWVBFX0NPREVfTUVUSE9EOgorICAgIGNhc2UgVFlQRV9DT0RFX1JFRjoKKyAgICBjYXNlIFRZUEVfQ09ERV9DSEFSOgorICAgIGNhc2UgVFlQRV9DT0RFX0JPT0w6CisgICAgY2FzZSBUWVBFX0NPREVfQ09NUExFWDoKKyAgICBjYXNlIFRZUEVfQ09ERV9UWVBFREVGOgorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIHByaW50X3R5cGVfc2NhbGFyICh0eXBlLCB2YWwsIHN0cmVhbSk7Cit9CisMCisvKiBQcmludCB0aGUgZWxlbWVudHMgb2YgYW4gYXJyYXkuCisgICBTaW1pbGFyIHRvIHZhbF9wcmludF9hcnJheV9lbGVtZW50cywgYnV0IHByaW50cworICAgZWxlbWVudCBpbmRleGVzIChpbiBDaGlsbCBzeW50YXgpLiAqLworCitzdGF0aWMgdm9pZAorY2hpbGxfdmFsX3ByaW50X2FycmF5X2VsZW1lbnRzICh0eXBlLCB2YWxhZGRyLCBhZGRyZXNzLCBzdHJlYW0sCisJCQkJZm9ybWF0LCBkZXJlZl9yZWYsIHJlY3Vyc2UsIHByZXR0eSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGNoYXIgKnZhbGFkZHI7CisgICAgIENPUkVfQUREUiBhZGRyZXNzOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgZm9ybWF0OworICAgICBpbnQgZGVyZWZfcmVmOworICAgICBpbnQgcmVjdXJzZTsKKyAgICAgZW51bSB2YWxfcHJldHR5cHJpbnQgcHJldHR5OworeworICB1bnNpZ25lZCBpbnQgaSA9IDA7CisgIHVuc2lnbmVkIGludCB0aGluZ3NfcHJpbnRlZCA9IDA7CisgIHVuc2lnbmVkIGxlbjsKKyAgc3RydWN0IHR5cGUgKmVsdHR5cGU7CisgIHN0cnVjdCB0eXBlICpyYW5nZV90eXBlID0gVFlQRV9GSUVMRF9UWVBFICh0eXBlLCAwKTsKKyAgc3RydWN0IHR5cGUgKmluZGV4X3R5cGUgPSBUWVBFX1RBUkdFVF9UWVBFIChyYW5nZV90eXBlKTsKKyAgdW5zaWduZWQgZWx0bGVuOworICAvKiBQb3NpdGlvbiBvZiB0aGUgYXJyYXkgZWxlbWVudCB3ZSBhcmUgZXhhbWluaW5nIHRvIHNlZQorICAgICB3aGV0aGVyIGl0IGlzIHJlcGVhdGVkLiAgKi8KKyAgdW5zaWduZWQgaW50IHJlcDE7CisgIC8qIE51bWJlciBvZiByZXBldGl0aW9ucyB3ZSBoYXZlIGRldGVjdGVkIHNvIGZhci4gICovCisgIHVuc2lnbmVkIGludCByZXBzOworICBMT05HRVNUIGxvd19ib3VuZCA9ICBUWVBFX0ZJRUxEX0JJVFBPUyAocmFuZ2VfdHlwZSwgMCk7CisgICAgICAKKyAgZWx0dHlwZSA9IGNoZWNrX3R5cGVkZWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKKyAgZWx0bGVuID0gVFlQRV9MRU5HVEggKGVsdHR5cGUpOworICBsZW4gPSBUWVBFX0xFTkdUSCAodHlwZSkgLyBlbHRsZW47CisKKyAgYW5ub3RhdGVfYXJyYXlfc2VjdGlvbl9iZWdpbiAoaSwgZWx0dHlwZSk7CisKKyAgZm9yICg7IGkgPCBsZW4gJiYgdGhpbmdzX3ByaW50ZWQgPCBwcmludF9tYXg7IGkrKykKKyAgICB7CisgICAgICBpZiAoaSAhPSAwKQorCXsKKwkgIGlmIChwcmV0dHlwcmludF9hcnJheXMpCisJICAgIHsKKwkgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIsXG4iKTsKKwkgICAgICBwcmludF9zcGFjZXNfZmlsdGVyZWQgKDIgKyAyICogcmVjdXJzZSwgc3RyZWFtKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiLCAiKTsKKwkgICAgfQorCX0KKyAgICAgIHdyYXBfaGVyZSAobl9zcGFjZXMgKDIgKyAyICogcmVjdXJzZSkpOworCisgICAgICByZXAxID0gaSArIDE7CisgICAgICByZXBzID0gMTsKKyAgICAgIHdoaWxlICgocmVwMSA8IGxlbikgJiYgCisJICAgICAhbWVtY21wICh2YWxhZGRyICsgaSAqIGVsdGxlbiwgdmFsYWRkciArIHJlcDEgKiBlbHRsZW4sIGVsdGxlbikpCisJeworCSAgKytyZXBzOworCSAgKytyZXAxOworCX0KKworICAgICAgZnB1dHNfZmlsdGVyZWQgKCIoIiwgc3RyZWFtKTsKKyAgICAgIGNoaWxsX3ByaW50X3R5cGVfc2NhbGFyIChpbmRleF90eXBlLCBsb3dfYm91bmQgKyBpLCBzdHJlYW0pOworICAgICAgaWYgKHJlcHMgPiAxKQorCXsKKwkgIGZwdXRzX2ZpbHRlcmVkICgiOiIsIHN0cmVhbSk7CisJICBjaGlsbF9wcmludF90eXBlX3NjYWxhciAoaW5kZXhfdHlwZSwgbG93X2JvdW5kICsgaSArIHJlcHMgLSAxLAorCQkJCSAgIHN0cmVhbSk7CisJICBmcHV0c19maWx0ZXJlZCAoIik6ICIsIHN0cmVhbSk7CisJICB2YWxfcHJpbnQgKGVsdHR5cGUsIHZhbGFkZHIgKyBpICogZWx0bGVuLCAwLCAwLCBzdHJlYW0sIGZvcm1hdCwKKwkJICAgICBkZXJlZl9yZWYsIHJlY3Vyc2UgKyAxLCBwcmV0dHkpOworCisJICBpID0gcmVwMSAtIDE7CisJICB0aGluZ3NfcHJpbnRlZCArPSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBmcHV0c19maWx0ZXJlZCAoIik6ICIsIHN0cmVhbSk7CisJICB2YWxfcHJpbnQgKGVsdHR5cGUsIHZhbGFkZHIgKyBpICogZWx0bGVuLCAwLCAwLCBzdHJlYW0sIGZvcm1hdCwKKwkJICAgICBkZXJlZl9yZWYsIHJlY3Vyc2UgKyAxLCBwcmV0dHkpOworCSAgYW5ub3RhdGVfZWx0ICgpOworCSAgdGhpbmdzX3ByaW50ZWQrKzsKKwl9CisgICAgfQorICBhbm5vdGF0ZV9hcnJheV9zZWN0aW9uX2VuZCAoKTsKKyAgaWYgKGkgPCBsZW4pCisgICAgeworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiLi4uIik7CisgICAgfQorfQorCisvKiBQcmludCBkYXRhIG9mIHR5cGUgVFlQRSBsb2NhdGVkIGF0IFZBTEFERFIgKHdpdGhpbiBHREIpLCB3aGljaCBjYW1lIGZyb20KKyAgIHRoZSBpbmZlcmlvciBhdCBhZGRyZXNzIEFERFJFU1MsIG9udG8gc3RkaW8gc3RyZWFtIFNUUkVBTSBhY2NvcmRpbmcgdG8KKyAgIEZPUk1BVCAoYSBsZXR0ZXIgb3IgMCBmb3IgbmF0dXJhbCBmb3JtYXQpLiAgVGhlIGRhdGEgYXQgVkFMQUREUiBpcyBpbgorICAgdGFyZ2V0IGJ5dGUgb3JkZXIuCisKKyAgIElmIHRoZSBkYXRhIGFyZSBhIHN0cmluZyBwb2ludGVyLCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3RyaW5nIGNoYXJhY3RlcnMKKyAgIHByaW50ZWQuCisKKyAgIElmIERFUkVGX1JFRiBpcyBub256ZXJvLCB0aGVuIGRlcmVmZXJlbmNlIHJlZmVyZW5jZXMsIG90aGVyd2lzZSBqdXN0IHByaW50CisgICB0aGVtIGxpa2UgcG9pbnRlcnMuCisKKyAgIFRoZSBQUkVUVFkgcGFyYW1ldGVyIGNvbnRyb2xzIHByZXR0eXByaW50aW5nLiAgKi8KKworaW50CitjaGlsbF92YWxfcHJpbnQgKHR5cGUsIHZhbGFkZHIsIGVtYmVkZGVkX29mZnNldCwgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgc3RyZWFtLCBmb3JtYXQsIGRlcmVmX3JlZiwgcmVjdXJzZSwgcHJldHR5KQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgY2hhciAqdmFsYWRkcjsKKyAgICAgaW50IGVtYmVkZGVkX29mZnNldDsKKyAgICAgQ09SRV9BRERSIGFkZHJlc3M7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGludCBmb3JtYXQ7CisgICAgIGludCBkZXJlZl9yZWY7CisgICAgIGludCByZWN1cnNlOworICAgICBlbnVtIHZhbF9wcmV0dHlwcmludCBwcmV0dHk7Cit7CisgIExPTkdFU1QgdmFsOworICB1bnNpZ25lZCBpbnQgaSA9IDA7CQkvKiBOdW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLiAgKi8KKyAgc3RydWN0IHR5cGUgKmVsdHR5cGU7CisgIENPUkVfQUREUiBhZGRyOworCisgIENIRUNLX1RZUEVERUYgKHR5cGUpOworCisgIHN3aXRjaCAoVFlQRV9DT0RFICh0eXBlKSkKKyAgICB7CisgICAgY2FzZSBUWVBFX0NPREVfQVJSQVk6CisgICAgICBpZiAoVFlQRV9MRU5HVEggKHR5cGUpID4gMCAmJiBUWVBFX0xFTkdUSCAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpID4gMCkKKwl7CisJICBpZiAocHJldHR5cHJpbnRfYXJyYXlzKQorCSAgICB7CisJICAgICAgcHJpbnRfc3BhY2VzX2ZpbHRlcmVkICgyICsgMiAqIHJlY3Vyc2UsIHN0cmVhbSk7CisJICAgIH0KKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlsiKTsKKwkgIGNoaWxsX3ZhbF9wcmludF9hcnJheV9lbGVtZW50cyAodHlwZSwgdmFsYWRkciwgYWRkcmVzcywgc3RyZWFtLAorCQkJCQkgIGZvcm1hdCwgZGVyZWZfcmVmLCByZWN1cnNlLCBwcmV0dHkpOworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiXSIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBlcnJvciAoInVuaW1wbGVtZW50ZWQgaW4gY2hpbGxfdmFsX3ByaW50OyB1bnNwZWNpZmllZCBhcnJheSBsZW5ndGgiKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX0lOVDoKKyAgICAgIGZvcm1hdCA9IGZvcm1hdCA/IGZvcm1hdCA6IG91dHB1dF9mb3JtYXQ7CisgICAgICBpZiAoZm9ybWF0KQorCXsKKwkgIHByaW50X3NjYWxhcl9mb3JtYXR0ZWQgKHZhbGFkZHIsIHR5cGUsIGZvcm1hdCwgMCwgc3RyZWFtKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdmFsX3ByaW50X3R5cGVfY29kZV9pbnQgKHR5cGUsIHZhbGFkZHIsIHN0cmVhbSk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9DSEFSOgorICAgICAgZm9ybWF0ID0gZm9ybWF0ID8gZm9ybWF0IDogb3V0cHV0X2Zvcm1hdDsKKyAgICAgIGlmIChmb3JtYXQpCisJeworCSAgcHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCAodmFsYWRkciwgdHlwZSwgZm9ybWF0LCAwLCBzdHJlYW0pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBMQV9QUklOVF9DSEFSICgodW5zaWduZWQgY2hhcikgdW5wYWNrX2xvbmcgKHR5cGUsIHZhbGFkZHIpLAorCQkJIHN0cmVhbSk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9GTFQ6CisgICAgICBpZiAoZm9ybWF0KQorCXsKKwkgIHByaW50X3NjYWxhcl9mb3JtYXR0ZWQgKHZhbGFkZHIsIHR5cGUsIGZvcm1hdCwgMCwgc3RyZWFtKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcHJpbnRfZmxvYXRpbmcgKHZhbGFkZHIsIHR5cGUsIHN0cmVhbSk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9CT09MOgorICAgICAgZm9ybWF0ID0gZm9ybWF0ID8gZm9ybWF0IDogb3V0cHV0X2Zvcm1hdDsKKyAgICAgIGlmIChmb3JtYXQpCisJeworCSAgcHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCAodmFsYWRkciwgdHlwZSwgZm9ybWF0LCAwLCBzdHJlYW0pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBGSVhNRTogV2h5IGlzIHRoaXMgdXNpbmcgYnVpbHRpbl90eXBlX2NoaWxsX2Jvb2wgbm90IHR5cGU/ICAqLworCSAgdmFsID0gdW5wYWNrX2xvbmcgKGJ1aWx0aW5fdHlwZV9jaGlsbF9ib29sLCB2YWxhZGRyKTsKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgdmFsID8gIlRSVUUiIDogIkZBTFNFIik7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9VTkRFRjoKKyAgICAgIC8qIFRoaXMgaGFwcGVucyAod2l0aG91dCBUWVBFX0ZMQUdfU1RVQiBzZXQpIG9uIHN5c3RlbXMgd2hpY2ggZG9uJ3QgdXNlCisJIGRieCB4cmVmcyAoTk9fREJYX1hSRUZTIGluIGdjYykgaWYgYSBmaWxlIGhhcyBhICJzdHJ1Y3QgZm9vICpiYXIiCisJIGFuZCBubyBjb21wbGV0ZSB0eXBlIGZvciBzdHJ1Y3QgZm9vIGluIHRoYXQgZmlsZS4gICovCisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICI8aW5jb21wbGV0ZSB0eXBlPiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9QVFI6CisgICAgICBpZiAoZm9ybWF0ICYmIGZvcm1hdCAhPSAncycpCisJeworCSAgcHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCAodmFsYWRkciwgdHlwZSwgZm9ybWF0LCAwLCBzdHJlYW0pOworCSAgYnJlYWs7CisJfQorICAgICAgYWRkciA9IHVucGFja19wb2ludGVyICh0eXBlLCB2YWxhZGRyKTsKKyAgICAgIGVsdHR5cGUgPSBjaGVja190eXBlZGVmIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSk7CisKKyAgICAgIC8qIFdlIGFzc3VtZSBhIE5VTEwgcG9pbnRlciBpcyBhbGwgemVyb3MgLi4uICovCisgICAgICBpZiAoYWRkciA9PSAwKQorCXsKKwkgIGZwdXRzX2ZpbHRlcmVkICgiTlVMTCIsIHN0cmVhbSk7CisJICByZXR1cm4gMDsKKwl9CisgICAgICAKKyAgICAgIGlmIChUWVBFX0NPREUgKGVsdHR5cGUpID09IFRZUEVfQ09ERV9GVU5DKQorCXsKKwkgIC8qIFRyeSB0byBwcmludCB3aGF0IGZ1bmN0aW9uIGl0IHBvaW50cyB0by4gICovCisJICBwcmludF9hZGRyZXNzX2RlbWFuZ2xlIChhZGRyLCBzdHJlYW0sIGRlbWFuZ2xlKTsKKwkgIC8qIFJldHVybiB2YWx1ZSBpcyBpcnJlbGV2YW50IGV4Y2VwdCBmb3Igc3RyaW5nIHBvaW50ZXJzLiAgKi8KKwkgIHJldHVybiAoMCk7CisJfQorICAgICAgaWYgKGFkZHJlc3NwcmludCAmJiBmb3JtYXQgIT0gJ3MnKQorCXsKKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoYWRkciwgMSwgc3RyZWFtKTsKKwl9CisgICAgICAKKyAgICAgIC8qIEZvciBhIHBvaW50ZXIgdG8gY2hhciBvciB1bnNpZ25lZCBjaGFyLCBhbHNvIHByaW50IHRoZSBzdHJpbmcKKwkgcG9pbnRlZCB0bywgdW5sZXNzIHBvaW50ZXIgaXMgbnVsbC4gICovCisgICAgICBpZiAoVFlQRV9MRU5HVEggKGVsdHR5cGUpID09IDEKKwkgICYmIFRZUEVfQ09ERSAoZWx0dHlwZSkgPT0gVFlQRV9DT0RFX0NIQVIKKwkgICYmIChmb3JtYXQgPT0gMCB8fCBmb3JtYXQgPT0gJ3MnKQorCSAgJiYgYWRkciAhPSAwCisJICAmJiAvKiBJZiBwcmludF9tYXggaXMgVUlOVF9NQVgsIHRoZSBhbGxvY2EgYmVsb3cgd2lsbCBmYWlsLgorCQlJbiB0aGF0IGNhc2UgZG9uJ3QgdHJ5IHRvIHByaW50IHRoZSBzdHJpbmcuICAqLworCSAgcHJpbnRfbWF4IDwgVUlOVF9NQVgpCisJaSA9IHZhbF9wcmludF9zdHJpbmcgKGFkZHIsIC0xLCBUWVBFX0xFTkdUSCAoZWx0dHlwZSksIHN0cmVhbSk7CisKKyAgICAgIC8qIFJldHVybiBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLCBwbHVzIG9uZSBmb3IgdGhlCisJIHRlcm1pbmF0aW5nIG51bGwgaWYgd2UgaGF2ZSAicmVhY2hlZCB0aGUgZW5kIi4gICovCisgICAgICByZXR1cm4gKGkgKyAocHJpbnRfbWF4ICYmIGkgIT0gcHJpbnRfbWF4KSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX1NUUklORzoKKyAgICAgIGkgPSBUWVBFX0xFTkdUSCAodHlwZSk7CisgICAgICBMQV9QUklOVF9TVFJJTkcgKHN0cmVhbSwgdmFsYWRkciwgaSwgMSwgMCk7CisgICAgICAvKiBSZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZCwgcGx1cyBvbmUgZm9yIHRoZSB0ZXJtaW5hdGluZworCSBudWxsIGlmIHdlIGhhdmUgInJlYWNoZWQgdGhlIGVuZCIuICAqLworICAgICAgcmV0dXJuIChpICsgKHByaW50X21heCAmJiBpICE9IHByaW50X21heCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9CSVRTVFJJTkc6CisgICAgY2FzZSBUWVBFX0NPREVfU0VUOgorICAgICAgZWx0dHlwZSA9IFRZUEVfSU5ERVhfVFlQRSAodHlwZSk7CisgICAgICBDSEVDS19UWVBFREVGIChlbHR0eXBlKTsKKyAgICAgIGlmIChUWVBFX0ZMQUdTIChlbHR0eXBlKSAmIFRZUEVfRkxBR19TVFVCKQorCXsKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjxpbmNvbXBsZXRlIHR5cGU+Iik7CisJICBnZGJfZmx1c2ggKHN0cmVhbSk7CisJICBicmVhazsKKwl9CisgICAgICB7CisJc3RydWN0IHR5cGUgKnJhbmdlID0gZWx0dHlwZTsKKwlMT05HRVNUIGxvd19ib3VuZCwgaGlnaF9ib3VuZDsKKwlpbnQgaTsKKwlpbnQgaXNfYml0c3RyaW5nID0gVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfQklUU1RSSU5HOworCWludCBuZWVkX2NvbW1hID0gMDsKKworCWlmIChpc19iaXRzdHJpbmcpCisJICBmcHV0c19maWx0ZXJlZCAoIkInIiwgc3RyZWFtKTsKKwllbHNlCisJICBmcHV0c19maWx0ZXJlZCAoIlsiLCBzdHJlYW0pOworCisJaSA9IGdldF9kaXNjcmV0ZV9ib3VuZHMgKHJhbmdlLCAmbG93X2JvdW5kLCAmaGlnaF9ib3VuZCk7CisgICAgICBtYXliZV9iYWRfYnN0cmluZzoKKwlpZiAoaSA8IDApCisJICB7CisJICAgIGZwdXRzX2ZpbHRlcmVkICgiPGVycm9yIHZhbHVlPiIsIHN0cmVhbSk7CisJICAgIGdvdG8gZG9uZTsKKwkgIH0KKworCWZvciAoaSA9IGxvd19ib3VuZDsgaSA8PSBoaWdoX2JvdW5kOyBpKyspCisJICB7CisJICAgIGludCBlbGVtZW50ID0gdmFsdWVfYml0X2luZGV4ICh0eXBlLCB2YWxhZGRyLCBpKTsKKwkgICAgaWYgKGVsZW1lbnQgPCAwKQorCSAgICAgIHsKKwkJaSA9IGVsZW1lbnQ7CisJCWdvdG8gbWF5YmVfYmFkX2JzdHJpbmc7CisJICAgICAgfQorCSAgICBpZiAoaXNfYml0c3RyaW5nKQorCSAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiVkIiwgZWxlbWVudCk7CisJICAgIGVsc2UgaWYgKGVsZW1lbnQpCisJICAgICAgeworCQlpZiAobmVlZF9jb21tYSkKKwkJICBmcHV0c19maWx0ZXJlZCAoIiwgIiwgc3RyZWFtKTsKKwkJY2hpbGxfcHJpbnRfdHlwZV9zY2FsYXIgKHJhbmdlLCAoTE9OR0VTVCkgaSwgc3RyZWFtKTsKKwkJbmVlZF9jb21tYSA9IDE7CisKKwkJLyogTG9vayBmb3IgYSBjb250aW51b3VzIHJhbmdlIG9mIHRydWUgZWxlbWVudHMuICovCisJCWlmIChpKzEgPD0gaGlnaF9ib3VuZCAmJiB2YWx1ZV9iaXRfaW5kZXggKHR5cGUsIHZhbGFkZHIsICsraSkpCisJCSAgeworCQkgICAgaW50IGogPSBpOyAvKiBqIGlzIHRoZSB1cHBlciBib3VuZCBzbyBmYXIgb2YgdGhlIHJhbmdlICovCisJCSAgICBmcHV0c19maWx0ZXJlZCAoIjoiLCBzdHJlYW0pOworCQkgICAgd2hpbGUgKGkrMSA8PSBoaWdoX2JvdW5kCisJCQkgICAmJiB2YWx1ZV9iaXRfaW5kZXggKHR5cGUsIHZhbGFkZHIsICsraSkpCisJCSAgICAgIGogPSBpOworCQkgICAgY2hpbGxfcHJpbnRfdHlwZV9zY2FsYXIgKHJhbmdlLCAoTE9OR0VTVCkgaiwgc3RyZWFtKTsKKwkJICB9CisJICAgICAgfQorCSAgfQorICAgICAgZG9uZToKKwlpZiAoaXNfYml0c3RyaW5nKQorCSAgZnB1dHNfZmlsdGVyZWQgKCInIiwgc3RyZWFtKTsKKwllbHNlCisJICBmcHV0c19maWx0ZXJlZCAoIl0iLCBzdHJlYW0pOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9TVFJVQ1Q6CisgICAgICBpZiAoY2hpbGxfdmFyeWluZ190eXBlICh0eXBlKSkKKwl7CisJICBzdHJ1Y3QgdHlwZSAqaW5uZXIgPSBjaGVja190eXBlZGVmIChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIDEpKTsKKwkgIGxvbmcgbGVuZ3RoID0gdW5wYWNrX2xvbmcgKFRZUEVfRklFTERfVFlQRSAodHlwZSwgMCksIHZhbGFkZHIpOworCSAgY2hhciAqZGF0YV9hZGRyID0gdmFsYWRkciArIFRZUEVfRklFTERfQklUUE9TICh0eXBlLCAxKSAvIDg7CisJICAKKwkgIHN3aXRjaCAoVFlQRV9DT0RFIChpbm5lcikpCisJICAgIHsKKwkgICAgY2FzZSBUWVBFX0NPREVfU1RSSU5HOgorCSAgICAgIGlmIChsZW5ndGggPiBUWVBFX0xFTkdUSCAodHlwZSkgLSAyKQorCQl7CisJCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLAorCQkJCSAgICAiPGR5bmFtaWMgbGVuZ3RoICVsZCA+IHN0YXRpYyBsZW5ndGggJWQ+ICppbnZhbGlkKiIsCisJCQkJICAgIGxlbmd0aCwgVFlQRV9MRU5HVEggKHR5cGUpKTsKKworCQkgIC8qIERvbid0IHByaW50IHRoZSBzdHJpbmc7IGRvaW5nIHNvIG1pZ2h0IHByb2R1Y2UgYQorCQkgICAgIHNlZ2ZhdWx0LiAgKi8KKwkJICByZXR1cm4gbGVuZ3RoOworCQl9CisJICAgICAgTEFfUFJJTlRfU1RSSU5HIChzdHJlYW0sIGRhdGFfYWRkciwgbGVuZ3RoLCAxLCAwKTsKKwkgICAgICByZXR1cm4gbGVuZ3RoOworCSAgICBkZWZhdWx0OgorCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgY2hpbGxfcHJpbnRfdmFsdWVfZmllbGRzICh0eXBlLCB2YWxhZGRyLCBzdHJlYW0sIGZvcm1hdCwgcmVjdXJzZSwgcHJldHR5LAorCQkJCTApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9SRUY6CisgICAgICBpZiAoYWRkcmVzc3ByaW50KQorICAgICAgICB7CisJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJMT0MoIik7CisJICBwcmludF9hZGRyZXNzX251bWVyaWMKKwkgICAgKGV4dHJhY3RfYWRkcmVzcyAodmFsYWRkciwgVEFSR0VUX1BUUl9CSVQgLyBIT1NUX0NIQVJfQklUKSwKKwkgICAgIDEsCisJICAgICBzdHJlYW0pOworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKSIpOworCSAgaWYgKGRlcmVmX3JlZikKKwkgICAgZnB1dHNfZmlsdGVyZWQgKCI6ICIsIHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgIC8qIERlLXJlZmVyZW5jZSB0aGUgcmVmZXJlbmNlLiAgKi8KKyAgICAgIGlmIChkZXJlZl9yZWYpCisJeworCSAgaWYgKFRZUEVfQ09ERSAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpICE9IFRZUEVfQ09ERV9VTkRFRikKKwkgICAgeworCSAgICAgIHZhbHVlX3B0ciBkZXJlZl92YWwgPQorCQl2YWx1ZV9hdAorCQkgIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSwKKwkJICAgdW5wYWNrX3BvaW50ZXIgKGxvb2t1cF9wb2ludGVyX3R5cGUgKGJ1aWx0aW5fdHlwZV92b2lkKSwKKwkJCQkgICB2YWxhZGRyKSwKKwkJICAgTlVMTCk7CisJICAgICAgdmFsX3ByaW50IChWQUxVRV9UWVBFIChkZXJlZl92YWwpLAorCQkJIFZBTFVFX0NPTlRFTlRTIChkZXJlZl92YWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisJCQkgVkFMVUVfQUREUkVTUyAoZGVyZWZfdmFsKSwgc3RyZWFtLCBmb3JtYXQsCisJCQkgZGVyZWZfcmVmLCByZWN1cnNlICsgMSwgcHJldHR5KTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBmcHV0c19maWx0ZXJlZCAoIj8/PyIsIHN0cmVhbSk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9FTlVNOgorICAgICAgY192YWxfcHJpbnQgKHR5cGUsIHZhbGFkZHIsIDAsIGFkZHJlc3MsIHN0cmVhbSwgZm9ybWF0LAorCQkgICBkZXJlZl9yZWYsIHJlY3Vyc2UsIHByZXR0eSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX1JBTkdFOgorICAgICAgaWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKQorCWNoaWxsX3ZhbF9wcmludCAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSksIHZhbGFkZHIsIDAsIGFkZHJlc3MsIHN0cmVhbSwKKwkJCSBmb3JtYXQsIGRlcmVmX3JlZiwgcmVjdXJzZSwgcHJldHR5KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfTUVNQkVSOgorICAgIGNhc2UgVFlQRV9DT0RFX1VOSU9OOgorICAgIGNhc2UgVFlQRV9DT0RFX0ZVTkM6CisgICAgY2FzZSBUWVBFX0NPREVfVk9JRDoKKyAgICBjYXNlIFRZUEVfQ09ERV9FUlJPUjoKKyAgICBkZWZhdWx0OgorICAgICAgLyogTGV0J3MgZGVmZXIgcHJpbnRpbmcgdG8gdGhlIEMgcHJpbnRlciwgcmF0aGVyIHRoYW4KKwkgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZS4gIEZJWE1FISAqLworICAgICAgY192YWxfcHJpbnQgKHR5cGUsIHZhbGFkZHIsIDAsIGFkZHJlc3MsIHN0cmVhbSwgZm9ybWF0LAorCQkgICBkZXJlZl9yZWYsIHJlY3Vyc2UsIHByZXR0eSk7CisgICAgfQorICBnZGJfZmx1c2ggKHN0cmVhbSk7CisgIHJldHVybiAoMCk7Cit9CisKKy8qIE11dHVhbGx5IHJlY3Vyc2l2ZSBzdWJyb3V0aW5lcyBvZiBjcGx1c19wcmludF92YWx1ZSBhbmQgY192YWxfcHJpbnQgdG8KKyAgIHByaW50IG91dCBhIHN0cnVjdHVyZSdzIGZpZWxkczogY3BfcHJpbnRfdmFsdWVfZmllbGRzIGFuZCBjcGx1c19wcmludF92YWx1ZS4KKworICAgVFlQRSwgVkFMQUREUiwgU1RSRUFNLCBSRUNVUlNFLCBhbmQgUFJFVFRZIGhhdmUgdGhlCisgICBzYW1lIG1lYW5pbmdzIGFzIGluIGNwbHVzX3ByaW50X3ZhbHVlIGFuZCBjX3ZhbF9wcmludC4KKworICAgRE9OVF9QUklOVCBpcyBhbiBhcnJheSBvZiBiYXNlY2xhc3MgdHlwZXMgdGhhdCB3ZQorICAgc2hvdWxkIG5vdCBwcmludCwgb3IgemVybyBpZiBjYWxsZWQgZnJvbSB0b3AgbGV2ZWwuICAqLworCitzdGF0aWMgdm9pZAorY2hpbGxfcHJpbnRfdmFsdWVfZmllbGRzICh0eXBlLCB2YWxhZGRyLCBzdHJlYW0sIGZvcm1hdCwgcmVjdXJzZSwgcHJldHR5LAorCQkJICBkb250X3ByaW50KQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgY2hhciAqdmFsYWRkcjsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgaW50IGZvcm1hdDsKKyAgICAgaW50IHJlY3Vyc2U7CisgICAgIGVudW0gdmFsX3ByZXR0eXByaW50IHByZXR0eTsKKyAgICAgc3RydWN0IHR5cGUgKipkb250X3ByaW50OworeworICBpbnQgaSwgbGVuOworICBpbnQgZmllbGRzX3NlZW4gPSAwOworCisgIENIRUNLX1RZUEVERUYgKHR5cGUpOworCisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlsiKTsKKyAgbGVuID0gVFlQRV9ORklFTERTICh0eXBlKTsKKyAgaWYgKGxlbiA9PSAwKQorICAgIHsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjxObyBkYXRhIGZpZWxkcz4iKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJeworCSAgaWYgKGZpZWxkc19zZWVuKQorCSAgICB7CisJICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiLCAiKTsKKwkgICAgfQorCSAgZmllbGRzX3NlZW4gPSAxOworCSAgaWYgKHByZXR0eSkKKwkgICAgeworCSAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlxuIik7CisJICAgICAgcHJpbnRfc3BhY2VzX2ZpbHRlcmVkICgyICsgMiAqIHJlY3Vyc2UsIHN0cmVhbSk7CisJICAgIH0KKwkgIGVsc2UgCisJICAgIHsKKwkgICAgICB3cmFwX2hlcmUgKG5fc3BhY2VzICgyICsgMiAqIHJlY3Vyc2UpKTsKKwkgICAgfQorCSAgZnB1dHNfZmlsdGVyZWQgKCIuIiwgc3RyZWFtKTsKKwkgIGZwcmludGZfc3ltYm9sX2ZpbHRlcmVkIChzdHJlYW0sIFRZUEVfRklFTERfTkFNRSAodHlwZSwgaSksCisJCQkJICAgbGFuZ3VhZ2VfY2hpbGwsIERNR0xfTk9fT1BUUyk7CisJICBmcHV0c19maWx0ZXJlZCAoIjogIiwgc3RyZWFtKTsKKwkgIGlmIChUWVBFX0ZJRUxEX1BBQ0tFRCAodHlwZSwgaSkpCisJICAgIHsKKwkgICAgICB2YWx1ZV9wdHIgdjsKKworCSAgICAgIC8qIEJpdGZpZWxkcyByZXF1aXJlIHNwZWNpYWwgaGFuZGxpbmcsIGVzcGVjaWFsbHkgZHVlIHRvIGJ5dGUKKwkJIG9yZGVyIHByb2JsZW1zLiAgKi8KKwkgICAgICB2ID0gdmFsdWVfZnJvbV9sb25nZXN0IChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpLAorCQkJCSAgICAgIHVucGFja19maWVsZF9hc19sb25nICh0eXBlLCB2YWxhZGRyLCBpKSk7CisKKwkgICAgICBjaGlsbF92YWxfcHJpbnQgKFRZUEVfRklFTERfVFlQRSAodHlwZSwgaSksIFZBTFVFX0NPTlRFTlRTICh2KSwgMCwgMCwKKwkJCSAgICAgICBzdHJlYW0sIGZvcm1hdCwgMCwgcmVjdXJzZSArIDEsIHByZXR0eSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNoaWxsX3ZhbF9wcmludCAoVFlQRV9GSUVMRF9UWVBFICh0eXBlLCBpKSwgCisJCQkgICAgICAgdmFsYWRkciArIFRZUEVfRklFTERfQklUUE9TICh0eXBlLCBpKSAvIDgsIDAsCisJCQkgICAgICAgMCwgc3RyZWFtLCBmb3JtYXQsIDAsIHJlY3Vyc2UgKyAxLCBwcmV0dHkpOworCSAgICB9CisJfQorICAgICAgaWYgKHByZXR0eSkKKwl7CisJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJcbiIpOworCSAgcHJpbnRfc3BhY2VzX2ZpbHRlcmVkICgyICogcmVjdXJzZSwgc3RyZWFtKTsKKwl9CisgICAgfQorICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJdIik7Cit9CisMCitpbnQKK2NoaWxsX3ZhbHVlX3ByaW50ICh2YWwsIHN0cmVhbSwgZm9ybWF0LCBwcmV0dHkpCisgICAgIHZhbHVlX3B0ciB2YWw7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGludCBmb3JtYXQ7CisgICAgIGVudW0gdmFsX3ByZXR0eXByaW50IHByZXR0eTsKK3sKKyAgc3RydWN0IHR5cGUgKnR5cGUgPSBWQUxVRV9UWVBFICh2YWwpOworICBzdHJ1Y3QgdHlwZSAqcmVhbF90eXBlID0gY2hlY2tfdHlwZWRlZiAgKHR5cGUpOworCisgIC8qIElmIGl0IGlzIGEgcG9pbnRlciwgaW5kaWNhdGUgd2hhdCBpdCBwb2ludHMgdG8uCisKKyAgICAgUHJpbnQgdHlwZSBhbHNvIGlmIGl0IGlzIGEgcmVmZXJlbmNlLiAqLworCisgIGlmIChUWVBFX0NPREUgKHJlYWxfdHlwZSkgPT0gVFlQRV9DT0RFX1BUUiB8fAorICAgICAgVFlQRV9DT0RFIChyZWFsX3R5cGUpID09IFRZUEVfQ09ERV9SRUYpCisgICAgeworICAgICAgY2hhciAqdmFsYWRkciA9IFZBTFVFX0NPTlRFTlRTICh2YWwpOworICAgICAgQ09SRV9BRERSIGFkZHIgPSB1bnBhY2tfcG9pbnRlciAodHlwZSwgdmFsYWRkcik7CisgICAgICBpZiAoVFlQRV9DT0RFICh0eXBlKSAhPSBUWVBFX0NPREVfUFRSIHx8IGFkZHIgIT0gMCkKKwl7CisJICBpbnQgaTsKKwkgIGNoYXIgKm5hbWUgPSBUWVBFX05BTUUgKHR5cGUpOworCSAgaWYgKG5hbWUpCisJICAgIGZwdXRzX2ZpbHRlcmVkIChuYW1lLCBzdHJlYW0pOworCSAgZWxzZSBpZiAoVFlQRV9DT0RFIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSkgPT0gVFlQRV9DT0RFX1ZPSUQpCisJICAgIGZwdXRzX2ZpbHRlcmVkICgiUFRSIiwgc3RyZWFtKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIigiKTsKKwkgICAgICB0eXBlX3ByaW50ICh0eXBlLCAiIiwgc3RyZWFtLCAtMSk7CisJICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKSIpOworCSAgICB9CisJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIoIik7CisJICBpID0gdmFsX3ByaW50ICh0eXBlLCB2YWxhZGRyLCAwLCBWQUxVRV9BRERSRVNTICh2YWwpLAorCQkJIHN0cmVhbSwgZm9ybWF0LCAxLCAwLCBwcmV0dHkpOworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKSIpOworCSAgcmV0dXJuIGk7CisJfQorICAgIH0KKyAgcmV0dXJuICh2YWxfcHJpbnQgKHR5cGUsIFZBTFVFX0NPTlRFTlRTICh2YWwpLCAwLAorCQkgICAgIFZBTFVFX0FERFJFU1MgKHZhbCksIHN0cmVhbSwgZm9ybWF0LCAxLCAwLCBwcmV0dHkpKTsKK30KKworCmRpZmYgLS1naXQgYS9nZGIvY29mZi1zb2xpYi5jIGIvZ2RiL2NvZmYtc29saWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmU2ODY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvZmYtc29saWIuYwpAQCAtMCwwICsxLDEzNCBAQAorLyogSGFuZGxlIENPRkYgU1ZSMyBzaGFyZWQgbGlicmFyaWVzIGZvciBHREIsIHRoZSBHTlUgRGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIAorVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNpbmNsdWRlICJkZWZzLmgiCisKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKworLyoKKworR0xPQkFMIEZVTkNUSU9OCisKKwljb2ZmX3NvbGliX2FkZCAtLSBhZGQgYSBzaGFyZWQgbGlicmFyeSBmaWxlcyB0byB0aGUgc3ltdGFiIGxpc3QuICBXZQorCWV4YW1pbmUgdGhlIGAubGliJyBzZWN0aW9uIG9mIHRoZSBleGVjIGZpbGUgYW5kIGRldGVybWluZSB0aGUgbmFtZXMgb2YKKwl0aGUgc2hhcmVkIGxpYnJhcmllcy4KKworCVRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGRpc2NvdmVyaW5nIHRob3NlIG5hbWVzIGFuZAorCWFkZHJlc3NlcywgYW5kIHNhdmluZyBzdWZmaWNpZW50IGluZm9ybWF0aW9uIGFib3V0IHRoZW0gdG8gYWxsb3cKKwl0aGVpciBzeW1ib2xzIHRvIGJlIHJlYWQgYXQgYSBsYXRlciB0aW1lLgorCitTWU5PUFNJUworCisJdm9pZCBjb2ZmX3NvbGliX2FkZCAoY2hhciAqYXJnX3N0cmluZywgaW50IGZyb21fdHR5LAorCQkJICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0KQorCitERVNDUklQVElPTgorCisqLworCit2b2lkCitjb2ZmX3NvbGliX2FkZCAoYXJnX3N0cmluZywgZnJvbV90dHksIHRhcmdldCkKKyAgICAgY2hhciAqYXJnX3N0cmluZzsKKyAgICAgaW50IGZyb21fdHR5OworICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0OworewkKKyAgYXNlY3Rpb24gKmxpYnNlY3Q7CisKKyAgbGlic2VjdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChleGVjX2JmZCwgIi5saWIiKTsKKworICBpZiAobGlic2VjdCkKKyAgICB7CisgICAgICBpbnQgbGlic2l6ZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmxpYjsKKyAgICAgIHN0cnVjdCBsaWJlbnQKKwl7CisJICBiZmRfYnl0ZSBsZW5bNF07CisJICBiZmRfYnl0ZSBuYW1lb2Zmc2V0WzRdOworCX07CisKKyAgICAgIGxpYnNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChleGVjX2JmZCwgbGlic2VjdCk7CisKKyAgICAgIGxpYiA9ICh1bnNpZ25lZCBjaGFyICopIGFsbG9jYSAobGlic2l6ZSk7CisKKyAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoZXhlY19iZmQsIGxpYnNlY3QsIGxpYiwgMCwgbGlic2l6ZSk7CisKKyAgICAgIHdoaWxlIChsaWJzaXplID4gMCkKKwl7CisJICBzdHJ1Y3QgbGliZW50ICplbnQ7CisJICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKwkgIGludCBsZW4sIG5hbWVvZmZzZXQ7CisJICBjaGFyICpmaWxlbmFtZTsKKworCSAgZW50ID0gKHN0cnVjdCBsaWJlbnQgKilsaWI7CisKKwkgIGxlbiA9IGJmZF9nZXRfMzIgKGV4ZWNfYmZkLCBlbnQtPmxlbik7CisKKwkgIG5hbWVvZmZzZXQgPSBiZmRfZ2V0XzMyIChleGVjX2JmZCwgZW50LT5uYW1lb2Zmc2V0KTsKKworCSAgaWYgKGxlbiA8PSAwKQorCSAgICBicmVhazsKKworCSAgZmlsZW5hbWUgPSAoY2hhciAqKWVudCArIG5hbWVvZmZzZXQgKiA0OworCisJICBvYmpmaWxlID0gc3ltYm9sX2ZpbGVfYWRkIChmaWxlbmFtZSwgZnJvbV90dHksCisJCQkJICAgICAwLCAvKiBhZGRyICovCisJCQkJICAgICAwLCAvKiBub3QgbWFpbmxpbmUgKi8KKwkJCQkgICAgIDAsIC8qIG5vdCBtYXBwZWQgKi8KKwkJCQkgICAgIDAsIC8qIE5vdCByZWFkbm93ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogTm90IHVzZXIgbG9hZGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7IC8qIElzIGEgc29saWIgKi8KKworCSAgbGlic2l6ZSAtPSBsZW4gKiA0OworCSAgbGliICs9IGxlbiAqIDQ7CisJfQorCisgICAgICAvKiBHZXR0aW5nIG5ldyBzeW1ib2xzIG1heSBjaGFuZ2Ugb3VyIG9waW5pb24gYWJvdXQgd2hhdCBpcworCSBmcmFtZWxlc3MuICAqLworICAgICAgcmVpbml0X2ZyYW1lX2NhY2hlICgpOworICAgIH0KK30KKworLyoKKyAgCitHTE9CQUwgRlVOQ1RJT04KKyAgCisJY29mZl9zb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vayAtLSBzaGFyZWQgbGlicmFyeSBzdGFydHVwIHN1cHBvcnQKKyAgCitTWU5PUFNJUworICAKKwl2b2lkIGNvZmZfc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2soKQorICAKK0RFU0NSSVBUSU9OCisgIAorCVdoZW4gZ2RiIHN0YXJ0cyB1cCB0aGUgaW5mZXJpb3IsIHRoZSBrZXJuZWwgbWFwcyBpbiB0aGUgc2hhcmVkCisJbGlicmFyaWVzLiAgV2UgZ2V0IGhlcmUgd2l0aCB0aGUgdGFyZ2V0IHN0b3BwZWQgYXQgaXQncyBmaXJzdAorCWluc3RydWN0aW9uLCBhbmQgdGhlIGxpYnJhcmllcyBhbHJlYWR5IG1hcHBlZC4gIEF0IHRoaXMJcG9pbnQsIHRoaXMKKwlmdW5jdGlvbiBnZXRzIGNhbGxlZCB2aWEgZXhwYW5zaW9uIG9mIHRoZSBtYWNybworCVNPTElCX0NSRUFURV9JTkZFUklPUl9IT09LLgorICAqLworCit2b2lkIAorY29mZl9zb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vaygpCit7CisgIGNvZmZfc29saWJfYWRkICgoY2hhciAqKSAwLCAwLCAoc3RydWN0IHRhcmdldF9vcHMgKikgMCk7Cit9CmRpZmYgLS1naXQgYS9nZGIvY29mZi1zb2xpYi5oIGIvZ2RiL2NvZmYtc29saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzM3NWNjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvZmYtc29saWIuaApAQCAtMCwwICsxLDE5MCBAQAorLyogQ09GRiAoU1ZSMykgU2hhcmVkIGxpYnJhcnkgZGVjbGFyYXRpb25zIGZvciBHREIsIHRoZSBHTlUgRGVidWdnZXIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCQkvKiBGb3J3YXJkIGRlY2wncyBmb3IgcHJvdG90eXBlcyAqLworc3RydWN0IHRhcmdldF9vcHM7CisjZW5kaWYKKworLyogQ2FsbGVkIHdoZW4gd2UgZnJlZSBhbGwgc3ltdGFicywgdG8gZnJlZSB0aGUgc2hhcmVkIGxpYnJhcnkgaW5mb3JtYXRpb24KKyAgIGFzIHdlbGwuICovCisKKyNpZiAwCisjZGVmaW5lIENMRUFSX1NPTElCCQkJY29mZl9jbGVhcl9zb2xpYgorCitleHRlcm4gdm9pZAorY29mZl9jbGVhcl9zb2xpYiBQQVJBTVMgKCh2b2lkKSk7CisjZW5kaWYKKworLyogQ2FsbGVkIHRvIGFkZCBzeW1ib2xzIGZyb20gYSBzaGFyZWQgbGlicmFyeSB0byBnZGIncyBzeW1ib2wgdGFibGUuICovCisKKyNkZWZpbmUgU09MSUJfQUREKGZpbGVuYW1lLCBmcm9tX3R0eSwgdGFyZykgXAorICAgIGNvZmZfc29saWJfYWRkIChmaWxlbmFtZSwgZnJvbV90dHksIHRhcmcpCisKK2V4dGVybiB2b2lkCitjb2ZmX3NvbGliX2FkZCBQQVJBTVMgKChjaGFyICosIGludCwgc3RydWN0IHRhcmdldF9vcHMgKikpOworCisvKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgaW5mZXJpb3Igc3RhcnRzIHVwLCB0byBkaXNjb3ZlciB0aGUgbmFtZXMKKyAgIG9mIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCBhcmUgZHluYW1pY2FsbHkgbGlua2VkLCB0aGUgYmFzZSBhZGRyZXNzZXMgdG8KKyAgIHdoaWNoIHRoZXkgYXJlIGxpbmtlZCwgYW5kIHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gdG8gcmVhZCBpbiB0aGVpciBzeW1ib2xzCisgICBhdCBhIGxhdGVyIHRpbWUuICovCisKKyNkZWZpbmUgU09MSUJfQ1JFQVRFX0lORkVSSU9SX0hPT0soUElEKQljb2ZmX3NvbGliX2NyZWF0ZV9pbmZlcmlvcl9ob29rKCkKKworZXh0ZXJuIHZvaWQKK2NvZmZfc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2sgUEFSQU1TKCh2b2lkKSk7CS8qIHNvbGliLmMgKi8KKworLyogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIHJlbW92ZSB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIGRlYnVnZ2VyIGFuZAorICAgZHluYW1pYyBsaW5rZXIgdGhhdCB3YXMgZXN0YWJsaXNoZWQgYnkgU09MSUJfQ1JFQVRFX0lORkVSSU9SX0hPT0suCisgICAoVGhpcyBvcGVyYXRpb24gZG9lcyBub3QgcmVtb3ZlIHNoYXJlZCBsaWJyYXJ5IGluZm9ybWF0aW9uIGZyb20KKyAgIHRoZSBkZWJ1Z2dlciwgYXMgQ0xFQVJfU09MSUIgZG9lcy4pCisKKyAgIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBwcmVzZW50bHkgbm90IGltcGxlbWVudGVkIGZvciB0aGlzIHRhcmdldC4KKyAgICovCisjZGVmaW5lIFNPTElCX1JFTU9WRV9JTkZFUklPUl9IT09LKFBJRCkgKDApCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSAiY2F0Y2ggbG9hZCIgY29tbWFuZC4gIEl0IGFsbG93cworICAgdGhlIGRlYnVnZ2VyIHRvIGJlIG5vdGlmaWVkIGJ5IHRoZSBkeW5hbWljIGxpbmtlciB3aGVuIGEgc3BlY2lmaWVkCisgICBsaWJyYXJ5IGZpbGUgKG9yIGFueSBsaWJyYXJ5IGZpbGUsIGlmIGZpbGVuYW1lIGlzIE5VTEwpIGlzIGxvYWRlZC4KKworICAgUHJlc2VudGx5LCB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGltcGxlbWVudGVkLgorICAgKi8KKyNkZWZpbmUgU09MSUJfQ1JFQVRFX0NBVENIX0xPQURfSE9PSyhwaWQsdGVtcGZsYWcsZmlsZW5hbWUsY29uZF9zdHJpbmcpIFwKKyAgIGVycm9yKCJjYXRjaCBvZiBsaWJyYXJ5IGxvYWRzL3VubG9hZHMgbm90IHlldCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtIikKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlICJjYXRjaCB1bmxvYWQiIGNvbW1hbmQuICBJdCBhbGxvd3MKKyAgIHRoZSBkZWJ1Z2dlciB0byBiZSBub3RpZmllZCBieSB0aGUgZHluYW1pYyBsaW5rZXIgd2hlbiBhIHNwZWNpZmllZAorICAgbGlicmFyeSBmaWxlIChvciBhbnkgbGlicmFyeSBmaWxlLCBpZiBmaWxlbmFtZSBpcyBOVUxMKSBpcyB1bmxvYWRlZC4KKworICAgUHJlc2VudGx5LCB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGltcGxlbWVudGVkLgorICAgKi8KKyNkZWZpbmUgU09MSUJfQ1JFQVRFX0NBVENIX1VOTE9BRF9IT09LKHBpZCx0ZW1wZmxhZyxmaWxlbmFtZSxjb25kX3N0cmluZykgXAorICAgZXJyb3IoImNhdGNoIG9mIGxpYnJhcnkgbG9hZHMvdW5sb2FkcyBub3QgeWV0IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0iKQorCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgVFJVRSBpZiB0aGUgZHluYW1pYyBsaW5rZXIgaGFzIGp1c3QgcmVwb3J0ZWQKKyAgIGEgbG9hZCBvZiBhIGxpYnJhcnkuCisKKyAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgaW5mZXJpb3IgaGFzIHN0b3BwZWQgaW4KKyAgIHRoZSBkeW5hbWljIGxpbmtlciBob29rLCBvciB1bmRlZmluZWQgcmVzdWx0cyBhcmUgZ3VhcmFudGVlZC4KKworICAgUHJlc2VudGx5LCB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGltcGxlbWVudGVkLgorICAgKi8KKy8qCisjZGVmaW5lIFNPTElCX0hBVkVfTE9BRF9FVkVOVChwaWQpIFwKKyAgIGVycm9yKCJjYXRjaCBvZiBsaWJyYXJ5IGxvYWRzL3VubG9hZHMgbm90IHlldCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtIikKKyovCisKKyNkZWZpbmUgU09MSUJfSEFWRV9MT0FEX0VWRU5UKHBpZCkgXAorKDApCisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAgIHBhdGhuYW1lIG9mIHRoZSBkeW5hbWljYWxseS1saW5rZWQgbGlicmFyeSB0aGF0IGhhcyBqdXN0IGJlZW4gbG9hZGVkLgorCisgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gU09MSUJfSEFWRV9MT0FEX0VWRU5UIGlzIFRSVUUsCisgICBvciB1bmRlZmluZWQgcmVzdWx0cyBhcmUgZ3VhcmFudGVlZC4KKworICAgVGhpcyBzdHJpbmcncyBjb250ZW50cyBhcmUgb25seSB2YWxpZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgaW5mZXJpb3IKKyAgIGhhcyBzdG9wcGVkIGluIHRoZSBkeW5hbWljIGxpbmtlciBob29rLCBhbmQgYmVjb21lcyBpbnZhbGlkIGFzIHNvb24KKyAgIGFzIHRoZSBpbmZlcmlvciBpcyBjb250aW51ZWQuICBDbGllbnRzIHNob3VsZCBtYWtlIGEgY29weSBvZiB0aGlzCisgICBzdHJpbmcgaWYgdGhleSB3aXNoIHRvIGNvbnRpbnVlIHRoZSBpbmZlcmlvciBhbmQgdGhlbiBhY2Nlc3MgdGhlIHN0cmluZy4KKworICAgUHJlc2VudGx5LCB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGltcGxlbWVudGVkLgorICAgKi8KKworLyoKKyNkZWZpbmUgU09MSUJfTE9BREVEX0xJQlJBUllfUEFUSE5BTUUocGlkKSBcCisgICBlcnJvcigiY2F0Y2ggb2YgbGlicmFyeSBsb2Fkcy91bmxvYWRzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgb24gdGhpcyBwbGF0Zm9ybSIpCisqLworCisjZGVmaW5lIFNPTElCX0xPQURFRF9MSUJSQVJZX1BBVEhOQU1FKHBpZCkgXAorKDApCisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBUUlVFIGlmIHRoZSBkeW5hbWljIGxpbmtlciBoYXMganVzdCByZXBvcnRlZAorICAgYW4gdW5sb2FkIG9mIGEgbGlicmFyeS4KKworICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBpbmZlcmlvciBoYXMgc3RvcHBlZCBpbgorICAgdGhlIGR5bmFtaWMgbGlua2VyIGhvb2ssIG9yIHVuZGVmaW5lZCByZXN1bHRzIGFyZSBndWFyYW50ZWVkLgorCisgICBQcmVzZW50bHksIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAqLworLyoKKyNkZWZpbmUgU09MSUJfSEFWRV9VTkxPQURfRVZFTlQocGlkKSBcCisgICBlcnJvcigiY2F0Y2ggb2YgbGlicmFyeSBsb2Fkcy91bmxvYWRzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgb24gdGhpcyBwbGF0Zm9ybSIpCisqLworCisjZGVmaW5lIFNPTElCX0hBVkVfVU5MT0FEX0VWRU5UKHBpZCkgXAorKDApCisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAgIHBhdGhuYW1lIG9mIHRoZSBkeW5hbWljYWxseS1saW5rZWQgbGlicmFyeSB0aGF0IGhhcyBqdXN0IGJlZW4gdW5sb2FkZWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIG9ubHkgd2hlbiBTT0xJQl9IQVZFX1VOTE9BRF9FVkVOVCBpcyBUUlVFLAorICAgb3IgdW5kZWZpbmVkIHJlc3VsdHMgYXJlIGd1YXJhbnRlZWQuCisKKyAgIFRoaXMgc3RyaW5nJ3MgY29udGVudHMgYXJlIG9ubHkgdmFsaWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGluZmVyaW9yCisgICBoYXMgc3RvcHBlZCBpbiB0aGUgZHluYW1pYyBsaW5rZXIgaG9vaywgYW5kIGJlY29tZXMgaW52YWxpZCBhcyBzb29uCisgICBhcyB0aGUgaW5mZXJpb3IgaXMgY29udGludWVkLiAgQ2xpZW50cyBzaG91bGQgbWFrZSBhIGNvcHkgb2YgdGhpcworICAgc3RyaW5nIGlmIHRoZXkgd2lzaCB0byBjb250aW51ZSB0aGUgaW5mZXJpb3IgYW5kIHRoZW4gYWNjZXNzIHRoZSBzdHJpbmcuCisKKyAgIFByZXNlbnRseSwgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBpbXBsZW1lbnRlZC4KKyAgICovCisvKgorI2RlZmluZSBTT0xJQl9VTkxPQURFRF9MSUJSQVJZX1BBVEhOQU1FKHBpZCkgXAorICAgZXJyb3IoImNhdGNoIG9mIGxpYnJhcnkgbG9hZHMvdW5sb2FkcyBub3QgeWV0IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0iKQorKi8KKworI2RlZmluZSBTT0xJQl9VTkxPQURFRF9MSUJSQVJZX1BBVEhOQU1FKHBpZCkgXAorKDApCisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBUUlVFIGlmIHBjIGlzIHRoZSBhZGRyZXNzIG9mIGFuIGluc3RydWN0aW9uIHRoYXQKKyAgIGxpZXMgd2l0aGluIHRoZSBkeW5hbWljIGxpbmtlciAoc3VjaCBhcyB0aGUgZXZlbnQgaG9vaywgb3IgdGhlIGRsZAorICAgaXRzZWxmKS4KKworICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIGEgZHluYW1pYyBsaW5rZXIgZXZlbnQgaGFzIGJlZW4KKyAgIGNhdWdodCwgYW5kIHRoZSBpbmZlcmlvciBpcyBiZWluZyBzdGVwcGVkIG91dCBvZiB0aGUgaG9vaywgb3IgdW5kZWZpbmVkCisgICByZXN1bHRzIGFyZSBndWFyYW50ZWVkLgorCisgICBQcmVzZW50bHksIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAqLworCisvKgorI2RlZmluZSBTT0xJQl9JTl9EWU5BTUlDX0xJTktFUihwaWQscGMpIFwKKyAgIGVycm9yKCJjYXRjaCBvZiBsaWJyYXJ5IGxvYWRzL3VubG9hZHMgbm90IHlldCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtIikKKyovCisKKyNkZWZpbmUgU09MSUJfSU5fRFlOQU1JQ19MSU5LRVIocGlkLHBjKSBcCisoMCkKKworLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBpbmZlcmlvciBpcyBraWxsZWQsIGFuZCB0aGUgcHJvZ3JhbQorICAgcmVzdGFydGVkLiAgVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgQ0xFQVJfU09MSUIsIGluIHRoYXQgaXQgZG9lc24ndCBkaXNjYXJkCisgICBhbnkgc3ltYm9sIHRhYmxlcy4KKworICAgUHJlc2VudGx5LCB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGltcGxlbWVudGVkLgorICAgKi8KKyNkZWZpbmUgU09MSUJfUkVTVEFSVCgpIFwKKyAgKDApCisKKy8qIElmIHdlIGNhbid0IHNldCBhIGJyZWFrcG9pbnQsIGFuZCBpdCdzIGluIGEgc2hhcmVkIGxpYnJhcnksIGp1c3QKKyAgIGRpc2FibGUgaXQuICAqLworCisjaWYgMAorI2RlZmluZSBESVNBQkxFX1VOU0VUVEFCTEVfQlJFQUsoYWRkcikJY29mZl9zb2xpYl9hZGRyZXNzKGFkZHIpCisKK2V4dGVybiBpbnQKK3NvbGliX2FkZHJlc3MgUEFSQU1TICgoQ09SRV9BRERSKSk7CQkvKiBzb2xpYi5jICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dkYi9jb2ZmcmVhZC5jIGIvZ2RiL2NvZmZyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwZTc3ZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb2ZmcmVhZC5jCkBAIC0wLDAgKzEsMjI1NSBAQAorLyogUmVhZCBjb2ZmIHN5bWJvbCB0YWJsZXMgYW5kIGNvbnZlcnQgdG8gaW50ZXJuYWwgZm9ybWF0LCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5ODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NiwgOTcsIDE5OTgKKyAgICAgICAgICAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIEQuIEpvaG5zb24sIEJyb3duIFVuaXZlcnNpdHkgKGRkakBjcy5icm93bi5lZHUpLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJkZW1hbmdsZS5oIgorI2luY2x1ZGUgImJyZWFrcG9pbnQuaCIKKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKworI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgkvKiBJbnRlcm5hbCBmb3JtYXQgb2YgQ09GRiBzeW1ib2xzIGluIEJGRCAqLworI2luY2x1ZGUgImxpYmNvZmYuaCIJCS8qIEZJWE1FIHNlY3JldCBpbnRlcm5hbCBkYXRhIGZyb20gQkZEICovCisKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJidWlsZHN5bS5oIgorI2luY2x1ZGUgImdkYi1zdGFicy5oIgorI2luY2x1ZGUgInN0YWJzcmVhZC5oIgorI2luY2x1ZGUgImNvbXBsYWludHMuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKworc3RydWN0IGNvZmZfc3ltZmlsZV9pbmZvIHsKKyAgZmlsZV9wdHIgbWluX2xpbmVub19vZmZzZXQ7CQkvKiBXaGVyZSBpbiBmaWxlIGxvd2VzdCBsaW5lI3MgYXJlICovCisgIGZpbGVfcHRyIG1heF9saW5lbm9fb2Zmc2V0OwkJLyogMStsYXN0IGJ5dGUgb2YgbGluZSNzIGluIGZpbGUgKi8KKworICBDT1JFX0FERFIgdGV4dGFkZHI7CQkJLyogQWRkciBvZiAudGV4dCBzZWN0aW9uLiAqLworICB1bnNpZ25lZCBpbnQgdGV4dHNpemU7CQkvKiBTaXplIG9mIC50ZXh0IHNlY3Rpb24uICovCisgIHN0cnVjdCBzdGFiX3NlY3Rpb25fbGlzdCAqc3RhYnNlY3RzOwkvKiAuc3RhYiBzZWN0aW9ucy4gICovCisgIGFzZWN0aW9uICpzdGFic3Ryc2VjdDsJCS8qIFNlY3Rpb24gcG9pbnRlciBmb3IgLnN0YWIgc2VjdGlvbiAqLworICBjaGFyICpzdGFic3RyZGF0YTsKK307CisKKy8qIFRyYW5zbGF0ZSBhbiBleHRlcm5hbCBuYW1lIHN0cmluZyBpbnRvIGEgdXNlci12aXNpYmxlIG5hbWUuICAqLworI2RlZmluZQlFWFRFUk5BTF9OQU1FKHN0cmluZywgYWJmZCkgXAorCShzdHJpbmdbMF0gPT0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyKGFiZmQpPyBzdHJpbmcrMTogc3RyaW5nKQorCisvKiBUbyBiZSBhbiBzZGIgZGVidWcgdHlwZSwgdHlwZSBtdXN0IGhhdmUgYXQgbGVhc3QgYSBiYXNpYyBvciBwcmltYXJ5CisgICBkZXJpdmVkIHR5cGUuICBVc2luZyB0aGlzIHJhdGhlciB0aGFuIGNoZWNraW5nIGFnYWluc3QgVF9OVUxMIGlzCisgICBzYWlkIHRvIHByZXZlbnQgY29yZSBkdW1wcyBpZiB3ZSB0cnkgdG8gb3BlcmF0ZSBvbiBNaWNoYWVsIEJsb29tCisgICBkYngtaW4tY29mZiBmaWxlLiAgKi8KKworI2RlZmluZSBTREJfVFlQRSh0eXBlKSAoQlRZUEUodHlwZSkgfCAodHlwZSAmIE5fVE1BU0spKQorCisvKiBDb252ZXJ0IGZyb20gYW4gc2RiIHJlZ2lzdGVyIG51bWJlciB0byBhbiBpbnRlcm5hbCBnZGIgcmVnaXN0ZXIgbnVtYmVyLgorICAgVGhpcyBzaG91bGQgYmUgZGVmaW5lZCBpbiB0bS5oLCBpZiBSRUdJU1RFUl9OQU1FUyBpcyBub3Qgc2V0IHVwCisgICB0byBtYXAgb25lIHRvIG9uZSBvbnRvIHRoZSBzZGIgcmVnaXN0ZXIgbnVtYmVycy4gICovCisKKyNpZm5kZWYgU0RCX1JFR19UT19SRUdOVU0KKyMgZGVmaW5lIFNEQl9SRUdfVE9fUkVHTlVNKHZhbHVlKSAgICAgKHZhbHVlKQorI2VuZGlmCisKKy8qIENvcmUgYWRkcmVzcyBvZiBzdGFydCBhbmQgZW5kIG9mIHRleHQgb2YgY3VycmVudCBzb3VyY2UgZmlsZS4KKyAgIFRoaXMgY29tZXMgZnJvbSBhICIudGV4dCIgc3ltYm9sIHdoZXJlIHhfbmxpbm5vID4gMC4gICovCisKK3N0YXRpYyBDT1JFX0FERFIgY3VycmVudF9zb3VyY2Vfc3RhcnRfYWRkcjsKK3N0YXRpYyBDT1JFX0FERFIgY3VycmVudF9zb3VyY2VfZW5kX2FkZHI7CisKKy8qIFRoZSBhZGRyZXNzZXMgb2YgdGhlIHN5bWJvbCB0YWJsZSBzdHJlYW0gYW5kIG51bWJlciBvZiBzeW1ib2xzCisgICBvZiB0aGUgb2JqZWN0IGZpbGUgd2UgYXJlIHJlYWRpbmcgKGFzIGNvcGllZCBpbnRvIGNvcmUpLiAgKi8KKworc3RhdGljIGJmZCAqbmxpc3RfYmZkX2dsb2JhbDsKK3N0YXRpYyBpbnQgbmxpc3RfbnN5bXNfZ2xvYmFsOworCisvKiBWZWN0b3Igb2YgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICAqLworCitzdGF0aWMgc3RydWN0IGxpbmV0YWJsZSAqbGluZV92ZWN0b3I7CisKKy8qIEluZGV4IG9mIG5leHQgZW50cnkgdG8gZ28gaW4gbGluZV92ZWN0b3JfaW5kZXguICAqLworCitzdGF0aWMgaW50IGxpbmVfdmVjdG9yX2luZGV4OworCisvKiBMYXN0IGxpbmUgbnVtYmVyIHJlY29yZGVkIGluIHRoZSBsaW5lIHZlY3Rvci4gICovCisKK3N0YXRpYyBpbnQgcHJldl9saW5lX251bWJlcjsKKworLyogTnVtYmVyIG9mIGVsZW1lbnRzIGFsbG9jYXRlZCBmb3IgbGluZV92ZWN0b3IgY3VycmVudGx5LiAgKi8KKworc3RhdGljIGludCBsaW5lX3ZlY3Rvcl9sZW5ndGg7CisKKy8qIFBvaW50ZXJzIHRvIHNjcmF0Y2ggc3RvcmFnZSwgdXNlZCBmb3IgcmVhZGluZyByYXcgc3ltYm9scyBhbmQgYXV4ZW50cy4gICovCisKK3N0YXRpYyBjaGFyICp0ZW1wX3N5bTsKK3N0YXRpYyBjaGFyICp0ZW1wX2F1eDsKKworLyogTG9jYWwgdmFyaWFibGVzIHRoYXQgaG9sZCB0aGUgc2hpZnQgYW5kIG1hc2sgdmFsdWVzIGZvciB0aGUKKyAgIENPRkYgZmlsZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgcmVhZGluZy4gIFRoZXNlIGNvbWUgYmFjayB0byB1cworICAgZnJvbSBCRkQsIGFuZCBhcmUgcmVmZXJlbmNlZCBieSB0aGVpciBtYWNybyBuYW1lcywgYXMgd2VsbCBhcworICAgaW50ZXJuYWxseSB0byB0aGUgQlRZUEUsIElTUFRSLCBJU0ZDTiwgSVNBUlksIElTVEFHLCBhbmQgREVDUkVGCisgICBtYWNyb3MgZnJvbSBpbmNsdWRlL2NvZmYvaW50ZXJuYWwuaCAuICAqLworCitzdGF0aWMgdW5zaWduZWQJbG9jYWxfbl9idG1hc2s7CitzdGF0aWMgdW5zaWduZWQJbG9jYWxfbl9idHNoZnQ7CitzdGF0aWMgdW5zaWduZWQJbG9jYWxfbl90bWFzazsKK3N0YXRpYyB1bnNpZ25lZAlsb2NhbF9uX3RzaGlmdDsKKworI2RlZmluZQlOX0JUTUFTSwlsb2NhbF9uX2J0bWFzaworI2RlZmluZQlOX0JUU0hGVAlsb2NhbF9uX2J0c2hmdAorI2RlZmluZQlOX1RNQVNLCQlsb2NhbF9uX3RtYXNrCisjZGVmaW5lCU5fVFNISUZUCWxvY2FsX25fdHNoaWZ0CisgCisvKiBMb2NhbCB2YXJpYWJsZXMgdGhhdCBob2xkIHRoZSBzaXplcyBpbiB0aGUgZmlsZSBvZiB2YXJpb3VzIENPRkYgc3RydWN0dXJlcy4KKyAgIChXZSBvbmx5IG5lZWQgdG8ga25vdyB0aGlzIHRvIHJlYWQgdGhlbSBmcm9tIHRoZSBmaWxlIC0tIEJGRCB3aWxsIHRoZW4KKyAgIHRyYW5zbGF0ZSB0aGUgZGF0YSBpbiB0aGVtLCBpbnRvIGBpbnRlcm5hbF94eHgnIHN0cnVjdHMgaW4gdGhlIHJpZ2h0CisgICBieXRlIG9yZGVyLCBhbGlnbm1lbnQsIGV0Yy4pICAqLworCitzdGF0aWMgdW5zaWduZWQJbG9jYWxfbGluZXN6Oworc3RhdGljIHVuc2lnbmVkCWxvY2FsX3N5bWVzejsKK3N0YXRpYyB1bnNpZ25lZAlsb2NhbF9hdXhlc3o7CisKKy8qIFRoaXMgaXMgc2V0IGlmIHRoaXMgaXMgYSBQRSBmb3JtYXQgZmlsZS4gICovCisKK3N0YXRpYyBpbnQgcGVfZmlsZTsKKworLyogQ2hhaW4gb2YgdHlwZWRlZnMgb2YgcG9pbnRlcnMgdG8gZW1wdHkgc3RydWN0L3VuaW9uIHR5cGVzLgorICAgVGhleSBhcmUgY2hhaW5lZCB0aHJ1IHRoZSBTWU1CT0xfVkFMVUVfQ0hBSU4uICAqLworCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqb3BhcXVlX3R5cGVfY2hhaW5bSEFTSFNJWkVdOworCisvKiBDb21wbGFpbnRzIGFib3V0IHZhcmlvdXMgcHJvYmxlbXMgaW4gdGhlIGZpbGUgYmVpbmcgcmVhZCAgKi8KKworc3RydWN0IGNvbXBsYWludCBlZl9jb21wbGFpbnQgPSAKKyAgeyJVbm1hdGNoZWQgLmVmIHN5bWJvbChzKSBpZ25vcmVkIHN0YXJ0aW5nIGF0IHN5bW51bSAlZCIsIDAsIDB9OworCitzdHJ1Y3QgY29tcGxhaW50IGVmX3N0YWNrX2NvbXBsYWludCA9IAorICB7ImAuZWYnIHN5bWJvbCB3aXRob3V0IG1hdGNoaW5nIGAuYmYnIHN5bWJvbCBpZ25vcmVkIHN0YXJ0aW5nIGF0IHN5bW51bSAlZCIsIDAsIDB9OworCitzdHJ1Y3QgY29tcGxhaW50IGViX3N0YWNrX2NvbXBsYWludCA9IAorICB7ImAuZWInIHN5bWJvbCB3aXRob3V0IG1hdGNoaW5nIGAuYmInIHN5bWJvbCBpZ25vcmVkIHN0YXJ0aW5nIGF0IHN5bW51bSAlZCIsIDAsIDB9OworCitzdHJ1Y3QgY29tcGxhaW50IGJmX25vX2F1eF9jb21wbGFpbnQgPQorICB7ImAuYmYnIHN5bWJvbCAlZCBoYXMgbm8gYXV4IGVudHJ5IiwgMCwgMH07CisKK3N0cnVjdCBjb21wbGFpbnQgZWZfbm9fYXV4X2NvbXBsYWludCA9CisgIHsiYC5lZicgc3ltYm9sICVkIGhhcyBubyBhdXggZW50cnkiLCAwLCAwfTsKKworc3RydWN0IGNvbXBsYWludCBsaW5lbm9fY29tcGxhaW50ID0KKyAgeyJMaW5lIG51bWJlciBwb2ludGVyICVkIGxvd2VyIHRoYW4gc3RhcnQgb2YgbGluZSBudW1iZXJzIiwgMCwgMH07CisKK3N0cnVjdCBjb21wbGFpbnQgdW5leHBlY3RlZF90eXBlX2NvbXBsYWludCA9CisgIHsiVW5leHBlY3RlZCB0eXBlIGZvciBzeW1ib2wgJXMiLCAwLCAwfTsKKworc3RydWN0IGNvbXBsYWludCBiYWRfc2NsYXNzX2NvbXBsYWludCA9CisgIHsiQmFkIG5fc2NsYXNzIGZvciBzeW1ib2wgJXMiLCAwLCAwfTsKKworc3RydWN0IGNvbXBsYWludCBtaXNvcmRlcmVkX2Jsb2Nrc19jb21wbGFpbnQgPQorICB7IkJsb2NrcyBvdXQgb2Ygb3JkZXIgYXQgYWRkcmVzcyAleCIsIDAsIDB9OworCitzdHJ1Y3QgY29tcGxhaW50IHRhZ25keF9iYWRfY29tcGxhaW50ID0KKyAgeyJTeW1ib2wgdGFibGUgZW50cnkgZm9yICVzIGhhcyBiYWQgdGFnbmR4IHZhbHVlIiwgMCwgMH07CisKK3N0cnVjdCBjb21wbGFpbnQgZWJfY29tcGxhaW50ID0gCisgIHsiTWlzbWF0Y2hlZCAuZWIgc3ltYm9sIGlnbm9yZWQgc3RhcnRpbmcgYXQgc3ltbnVtICVkIiwgMCwgMH07CisKKy8qIFNpbXBsaWZpZWQgaW50ZXJuYWwgdmVyc2lvbiBvZiBjb2ZmIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbiAqLworCitzdHJ1Y3QgY29mZl9zeW1ib2wgeworICBjaGFyICpjX25hbWU7CisgIGludCBjX3N5bW51bTsJCS8qIHN5bWJvbCBudW1iZXIgb2YgdGhpcyBlbnRyeSAqLworICBpbnQgY19uYXV4OwkJLyogMCBpZiBzeW1lbnQgb25seSwgMSBpZiBzeW1lbnQgKyBhdXhlbnQsIGV0YyAqLworICBsb25nIGNfdmFsdWU7CisgIGludCBjX3NjbGFzczsKKyAgaW50IGNfc2VjbnVtOworICB1bnNpZ25lZCBpbnQgY190eXBlOworfTsKKworc3RhdGljIHN0cnVjdCB0eXBlICpjb2ZmX3JlYWRfc3RydWN0X3R5cGUgUEFSQU1TICgoaW50LCBpbnQsIGludCkpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKmRlY29kZV9iYXNlX3R5cGUgUEFSQU1TICgoc3RydWN0IGNvZmZfc3ltYm9sICosCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCwKKwkJCQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICopKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICpkZWNvZGVfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgY29mZl9zeW1ib2wgKiwgdW5zaWduZWQgaW50LAorCQkJCQkgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICopKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICpkZWNvZGVfZnVuY3Rpb25fdHlwZSBQQVJBTVMgKChzdHJ1Y3QgY29mZl9zeW1ib2wgKiwKKwkJCQkJCSAgdW5zaWduZWQgaW50LAorCQkJCQkJICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKmNvZmZfcmVhZF9lbnVtX3R5cGUgUEFSQU1TICgoaW50LCBpbnQsIGludCkpOworCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqcHJvY2Vzc19jb2ZmX3N5bWJvbCBQQVJBTVMgKChzdHJ1Y3QgY29mZl9zeW1ib2wgKiwKKwkJCQkJCSAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqLAorCQkJCQkJICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqLAorCQkJCQkJICAgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZCBwYXRjaF9vcGFxdWVfdHlwZXMgUEFSQU1TICgoc3RydWN0IHN5bXRhYiAqKSk7CisKK3N0YXRpYyB2b2lkIHBhdGNoX3R5cGUgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgc3RydWN0IHR5cGUgKikpOworCitzdGF0aWMgdm9pZCBlbnRlcl9saW5lbm9zIFBBUkFNUyAoKGxvbmcsIGludCwgaW50LCBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICopKTsKKworc3RhdGljIHZvaWQgZnJlZV9saW5ldGFiIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIGludCBpbml0X2xpbmVubyBQQVJBTVMgKChiZmQgKiwgbG9uZywgaW50KSk7CisKK3N0YXRpYyBjaGFyICpnZXRzeW1uYW1lIFBBUkFNUyAoKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOworCitzdGF0aWMgY2hhciAqY29mZl9nZXRmaWxlbmFtZSBQQVJBTVMgKCh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikpOworCitzdGF0aWMgdm9pZCBmcmVlX3N0cmluZ3RhYiBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyBpbnQgaW5pdF9zdHJpbmd0YWIgUEFSQU1TICgoYmZkICosIGxvbmcpKTsKKworc3RhdGljIHZvaWQgcmVhZF9vbmVfc3ltIFBBUkFNUyAoKHN0cnVjdCBjb2ZmX3N5bWJvbCAqLAorCQkJCSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAorCQkJCSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICopKTsKKworc3RhdGljIHZvaWQgY29mZl9zeW10YWJfcmVhZCBQQVJBTVMgKChsb25nLCBpbnQsIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKiwKKwkJCQkgICAgICBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkIGZpbmRfbGluZW5vcyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSKSk7CisKK3N0YXRpYyB2b2lkIGNvZmZfc3ltZmlsZV9pbml0IFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQgY29mZl9uZXdfaW5pdCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkIGNvZmZfc3ltZmlsZV9yZWFkIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosCisJCQkJICAgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGNvZmZfc3ltZmlsZV9maW5pc2ggUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZCByZWNvcmRfbWluaW1hbF9zeW1ib2wgUEFSQU1TICgoY2hhciAqLCBDT1JFX0FERFIsCisJCQkJCSAgIGVudW0gbWluaW1hbF9zeW1ib2xfdHlwZSwKKwkJCQkJICAgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZCBjb2ZmX2VuZF9zeW10YWIgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZCBjb21wbGV0ZV9zeW10YWIgUEFSQU1TICgoY2hhciAqLCBDT1JFX0FERFIsIHVuc2lnbmVkIGludCkpOworCitzdGF0aWMgdm9pZCBjb2ZmX3N0YXJ0X3N5bXRhYiBQQVJBTVMgKChjaGFyICopKTsKKworc3RhdGljIHZvaWQgY29mZl9yZWNvcmRfbGluZSBQQVJBTVMgKChpbnQsIENPUkVfQUREUikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKmNvZmZfYWxsb2NfdHlwZSBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICoqY29mZl9sb29rdXBfdHlwZSBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIHZvaWQgY29mZl9sb2NhdGVfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOworDAorLyogV2UgYXJlIGNhbGxlZCBvbmNlIHBlciBzZWN0aW9uIGZyb20gY29mZl9zeW1maWxlX3JlYWQuICBXZQorICAgbmVlZCB0byBleGFtaW5lIGVhY2ggc2VjdGlvbiB3ZSBhcmUgcGFzc2VkLCBjaGVjayB0byBzZWUKKyAgIGlmIGl0IGlzIHNvbWV0aGluZyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBwcm9jZXNzaW5nLCBhbmQKKyAgIGlmIHNvLCBzdGFzaCBhd2F5IHNvbWUgYWNjZXNzIGluZm9ybWF0aW9uIGZvciB0aGUgc2VjdGlvbi4KKworICAgRklYTUU6IFRoZSBzZWN0aW9uIG5hbWVzIHNob3VsZCBub3QgYmUgaGFyZHdpcmVkIHN0cmluZ3MgKHdoYXQKKyAgIHNob3VsZCB0aGV5IGJlPyAgSSBkb24ndCB0aGluayBtb3N0IG9iamVjdCBmaWxlIGZvcm1hdHMgaGF2ZSBlbm91Z2gKKyAgIHNlY3Rpb24gZmxhZ3MgdG8gc3BlY2lmeSB3aGF0IGtpbmQgb2YgZGVidWcgc2VjdGlvbiBpdCBpcworICAgLWtpbmdkb24pLiAgKi8KKworc3RhdGljIHZvaWQKK2NvZmZfbG9jYXRlX3NlY3Rpb25zIChhYmZkLCBzZWN0cCwgY3NpcCkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdHA7CisgICAgIFBUUiBjc2lwOworeworICByZWdpc3RlciBzdHJ1Y3QgY29mZl9zeW1maWxlX2luZm8gKmNzaTsKKyAgY29uc3QgY2hhciAqbmFtZTsKKworICBjc2kgPSAoc3RydWN0IGNvZmZfc3ltZmlsZV9pbmZvICopIGNzaXA7CisgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjdHApOworICBpZiAoU1RSRVEgKG5hbWUsICIudGV4dCIpKQorICAgIHsKKyAgICAgIGNzaS0+dGV4dGFkZHIgPSBiZmRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3RwKTsKKyAgICAgIGNzaS0+dGV4dHNpemUgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdHApOworICAgIH0KKyAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi50ZXh0Iiwgc2l6ZW9mICIudGV4dCIgLSAxKSA9PSAwKQorICAgIHsKKyAgICAgIGNzaS0+dGV4dHNpemUgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdHApOworICAgIH0KKyAgZWxzZSBpZiAoU1RSRVEgKG5hbWUsICIuc3RhYnN0ciIpKQorICAgIHsKKyAgICAgIGNzaS0+c3RhYnN0cnNlY3QgPSBzZWN0cDsKKyAgICB9CisgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuc3RhYiIsIHNpemVvZiAiLnN0YWIiIC0gMSkgPT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpzOworCisgICAgICAvKiBXZSBjYW4gaGF2ZSBtdWx0aXBsZSAuc3RhYiBzZWN0aW9ucyBpZiBsaW5rZWQgd2l0aAorICAgICAgICAgLS1zcGxpdC1ieS1yZWxvYy4gICovCisgICAgICBmb3IgKHMgPSBuYW1lICsgc2l6ZW9mICIuc3RhYiIgLSAxOyAqcyAhPSAnXDAnOyBzKyspCisJaWYgKCEgaXNkaWdpdCAoKnMpKQorCSAgYnJlYWs7CisgICAgICBpZiAoKnMgPT0gJ1wwJykKKwl7CisJICBzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2xpc3QgKm4sICoqcG47CisKKwkgIG4gPSAoKHN0cnVjdCBzdGFiX3NlY3Rpb25fbGlzdCAqKQorCSAgICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzdGFiX3NlY3Rpb25fbGlzdCkpKTsKKwkgIG4tPnNlY3Rpb24gPSBzZWN0cDsKKwkgIG4tPm5leHQgPSBOVUxMOworCSAgZm9yIChwbiA9ICZjc2ktPnN0YWJzZWN0czsgKnBuICE9IE5VTEw7IHBuID0gJigqcG4pLT5uZXh0KQorCSAgICA7CisJICAqcG4gPSBuOworCisJICAvKiBUaGlzIHdpbGwgYmUgcnVuIGFmdGVyIGNvZmZzdGFiX2J1aWxkX3BzeW10YWJzIGlzIGNhbGxlZAorICAgICAgICAgICAgIGluIGNvZmZfc3ltZmlsZV9yZWFkLCBhdCB3aGljaCBwb2ludCB3ZSBubyBsb25nZXIgbmVlZAorICAgICAgICAgICAgIHRoZSBpbmZvcm1hdGlvbi4gICovCisJICBtYWtlX2NsZWFudXAgKGZyZWUsIG4pOworCX0KKyAgICB9Cit9CisKKy8qIFJldHVybiB0aGUgc2VjdGlvbl9vZmZzZXRzKiB0aGF0IENTIHBvaW50cyB0by4gICovCitzdGF0aWMgaW50IGNzX3RvX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGNvZmZfc3ltYm9sICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RydWN0IGZpbmRfdGFyZ19zZWNfYXJnIHsKKyAgaW50IHRhcmdfaW5kZXg7CisgIGFzZWN0aW9uICoqcmVzdWx0cDsKK307CisKK3N0YXRpYyB2b2lkIGZpbmRfdGFyZ19zZWMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHZvaWQgKikpOworCitzdGF0aWMgdm9pZCBmaW5kX3Rhcmdfc2VjIChhYmZkLCBzZWN0LCBvYmopCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Q7CisgICAgIFBUUiBvYmo7Cit7CisgIHN0cnVjdCBmaW5kX3Rhcmdfc2VjX2FyZyAqYXJncyA9IChzdHJ1Y3QgZmluZF90YXJnX3NlY19hcmcgKilvYmo7CisgIGlmIChzZWN0LT50YXJnZXRfaW5kZXggPT0gYXJncy0+dGFyZ19pbmRleCkKKyAgICAqYXJncy0+cmVzdWx0cCA9IHNlY3Q7Cit9CisKKy8qIFJldHVybiB0aGUgc2VjdGlvbiBudW1iZXIgKFNFQ1RfT0ZGXyopIHRoYXQgQ1MgcG9pbnRzIHRvLiAgKi8KK3N0YXRpYyBpbnQKK2NzX3RvX3NlY3Rpb24gKGNzLCBvYmpmaWxlKQorICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKmNzOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgYXNlY3Rpb24gKnNlY3QgPSBOVUxMOworICBzdHJ1Y3QgZmluZF90YXJnX3NlY19hcmcgYXJnczsKKyAgaW50IG9mZiA9IFNFQ1RfT0ZGX1RFWFQ7CisKKyAgYXJncy50YXJnX2luZGV4ID0gY3MtPmNfc2VjbnVtOworICBhcmdzLnJlc3VsdHAgPSAmc2VjdDsKKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChvYmpmaWxlLT5vYmZkLCBmaW5kX3Rhcmdfc2VjLCAmYXJncyk7CisgIGlmIChzZWN0ICE9IE5VTEwpCisgICAgeworICAgICAgLyogVGhpcyBpcyB0aGUgc2VjdGlvbi4gIEZpZ3VyZSBvdXQgd2hhdCBTRUNUX09GRl8qIGNvZGUgaXQgaXMuICAqLworICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdCkgJiBTRUNfQ09ERSkKKwlvZmYgPSBTRUNUX09GRl9URVhUOworICAgICAgZWxzZSBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWN0KSAmIFNFQ19MT0FEKQorCW9mZiA9IFNFQ1RfT0ZGX0RBVEE7CisgICAgICBlbHNlCisJb2ZmID0gU0VDVF9PRkZfQlNTOworICAgIH0KKyAgcmV0dXJuIG9mZjsKK30KKworLyogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIG9mIGEgQ09GRiBzeW1ib2wuICAqLworCitzdGF0aWMgQ09SRV9BRERSIGNzX3NlY3Rpb25fYWRkcmVzcyBQQVJBTVMgKChzdHJ1Y3QgY29mZl9zeW1ib2wgKiwgYmZkICopKTsKKworc3RhdGljIENPUkVfQUREUgorY3Nfc2VjdGlvbl9hZGRyZXNzIChjcywgYWJmZCkKKyAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpjczsKKyAgICAgYmZkICphYmZkOworeworICBhc2VjdGlvbiAqc2VjdCA9IE5VTEw7CisgIHN0cnVjdCBmaW5kX3Rhcmdfc2VjX2FyZyBhcmdzOworICBDT1JFX0FERFIgYWRkciA9IDA7CisKKyAgYXJncy50YXJnX2luZGV4ID0gY3MtPmNfc2VjbnVtOworICBhcmdzLnJlc3VsdHAgPSAmc2VjdDsKKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBmaW5kX3Rhcmdfc2VjLCAmYXJncyk7CisgIGlmIChzZWN0ICE9IE5VTEwpCisgICAgYWRkciA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKG9iamZpbGUtPm9iZmQsIHNlY3QpOworICByZXR1cm4gYWRkcjsKK30KKworLyogTG9vayB1cCBhIGNvZmYgdHlwZS1udW1iZXIgaW5kZXguICBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHNsb3QKKyAgIHdoZXJlIHRoZSB0eXBlIGZvciB0aGF0IGluZGV4IGlzIHN0b3JlZC4KKyAgIFRoZSB0eXBlLW51bWJlciBpcyBpbiBJTkRFWC4gCisKKyAgIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGZpbmRpbmcgdGhlIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgaW5kZXgKKyAgIG9yIGZvciBhc3NvY2lhdGluZyBhIG5ldyB0eXBlIHdpdGggdGhlIGluZGV4LiAgKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICoqCitjb2ZmX2xvb2t1cF90eXBlIChpbmRleCkKKyAgICAgcmVnaXN0ZXIgaW50IGluZGV4OworeworICBpZiAoaW5kZXggPj0gdHlwZV92ZWN0b3JfbGVuZ3RoKQorICAgIHsKKyAgICAgIGludCBvbGRfdmVjdG9yX2xlbmd0aCA9IHR5cGVfdmVjdG9yX2xlbmd0aDsKKworICAgICAgdHlwZV92ZWN0b3JfbGVuZ3RoICo9IDI7CisgICAgICBpZiAoaW5kZXggLyogaXMgc3RpbGwgKi8gPj0gdHlwZV92ZWN0b3JfbGVuZ3RoKQorCXR5cGVfdmVjdG9yX2xlbmd0aCA9IGluZGV4ICogMjsKKworICAgICAgdHlwZV92ZWN0b3IgPSAoc3RydWN0IHR5cGUgKiopCisJeHJlYWxsb2MgKChjaGFyICopIHR5cGVfdmVjdG9yLAorCQkgIHR5cGVfdmVjdG9yX2xlbmd0aCAqIHNpemVvZiAoc3RydWN0IHR5cGUgKikpOworICAgICAgbWVtc2V0ICgmdHlwZV92ZWN0b3Jbb2xkX3ZlY3Rvcl9sZW5ndGhdLCAwLAorCSAgICAgKHR5cGVfdmVjdG9yX2xlbmd0aCAtIG9sZF92ZWN0b3JfbGVuZ3RoKSAqIHNpemVvZihzdHJ1Y3QgdHlwZSAqKSk7CisgICAgfQorICByZXR1cm4gJnR5cGVfdmVjdG9yW2luZGV4XTsKK30KKworLyogTWFrZSBzdXJlIHRoZXJlIGlzIGEgdHlwZSBhbGxvY2F0ZWQgZm9yIHR5cGUgbnVtYmVyIGluZGV4CisgICBhbmQgcmV0dXJuIHRoZSB0eXBlIG9iamVjdC4KKyAgIFRoaXMgY2FuIGNyZWF0ZSBhbiBlbXB0eSAoemVyb2VkKSB0eXBlIG9iamVjdC4gICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitjb2ZmX2FsbG9jX3R5cGUgKGluZGV4KQorICAgICBpbnQgaW5kZXg7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCB0eXBlICoqdHlwZV9hZGRyID0gY29mZl9sb29rdXBfdHlwZSAoaW5kZXgpOworICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdHlwZSA9ICp0eXBlX2FkZHI7CisKKyAgLyogSWYgd2UgYXJlIHJlZmVycmluZyB0byBhIHR5cGUgbm90IGtub3duIGF0IGFsbCB5ZXQsCisgICAgIGFsbG9jYXRlIGFuIGVtcHR5IHR5cGUgZm9yIGl0LgorICAgICBXZSB3aWxsIGZpbGwgaXQgaW4gbGF0ZXIgaWYgd2UgZmluZCBvdXQgaG93LiAgKi8KKyAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICB7CisgICAgICB0eXBlID0gYWxsb2NfdHlwZSAoY3VycmVudF9vYmpmaWxlKTsKKyAgICAgICp0eXBlX2FkZHIgPSB0eXBlOworICAgIH0KKyAgcmV0dXJuIHR5cGU7Cit9CisMCisvKiBSZWNvcmQgYSBsaW5lIG51bWJlciBlbnRyeSBmb3IgbGluZSBMSU5FIGF0IGFkZHJlc3MgUEMuCisgICBGSVhNRTogIFVzZSByZWNvcmRfbGluZSBpbnN0ZWFkLiAgKi8KKworc3RhdGljIHZvaWQKK2NvZmZfcmVjb3JkX2xpbmUgKGxpbmUsIHBjKQorICAgICBpbnQgbGluZTsKKyAgICAgQ09SRV9BRERSIHBjOworeworICBzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5ICplOworICAvKiBNYWtlIHN1cmUgbGluZSB2ZWN0b3IgaXMgYmlnIGVub3VnaC4gICovCisKKyAgaWYgKGxpbmVfdmVjdG9yX2luZGV4ICsgMiA+PSBsaW5lX3ZlY3Rvcl9sZW5ndGgpCisgICAgeworICAgICAgbGluZV92ZWN0b3JfbGVuZ3RoICo9IDI7CisgICAgICBsaW5lX3ZlY3RvciA9IChzdHJ1Y3QgbGluZXRhYmxlICopCisJeHJlYWxsb2MgKChjaGFyICopIGxpbmVfdmVjdG9yLCBzaXplb2YgKHN0cnVjdCBsaW5ldGFibGUpCisJCSAgKyAobGluZV92ZWN0b3JfbGVuZ3RoCisJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBsaW5ldGFibGVfZW50cnkpKSk7CisgICAgfQorCisgIGUgPSBsaW5lX3ZlY3Rvci0+aXRlbSArIGxpbmVfdmVjdG9yX2luZGV4Kys7CisgIGUtPmxpbmUgPSBsaW5lOyBlLT5wYyA9IHBjOworfQorDAorLyogU3RhcnQgYSBuZXcgc3ltdGFiIGZvciBhIG5ldyBzb3VyY2UgZmlsZS4KKyAgIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBDT0ZGICIuZmlsZSIgc3ltYm9sIGlzIHNlZW47CisgICBpdCBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIGRhdGEgZm9yIG9uZSBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gICovCisKK3N0YXRpYyB2b2lkCitjb2ZmX3N0YXJ0X3N5bXRhYiAobmFtZSkKKyAgICBjaGFyICpuYW1lOworeworICBzdGFydF9zeW10YWIgKAorCQkvKiBXZSBmaWxsIGluIHRoZSBmaWxlbmFtZSBsYXRlci4gIHN0YXJ0X3N5bXRhYiBwdXRzCisJCSAgIHRoaXMgcG9pbnRlciBpbnRvIGxhc3Rfc291cmNlX2ZpbGUgYW5kIHdlIHB1dCBpdCBpbgorCQkgICBzdWJmaWxlcy0+bmFtZSwgd2hpY2ggZW5kX3N5bXRhYiBmcmVlczsgdGhhdCdzIHdoeQorCQkgICBpdCBtdXN0IGJlIG1hbGxvYydkLiAgKi8KKwkJc2F2ZXN0cmluZyAobmFtZSwgc3RybGVuKG5hbWUpKSwKKwkJLyogV2UgbmV2ZXIga25vdyB0aGUgZGlyZWN0b3J5IG5hbWUgZm9yIENPRkYuICAqLworCQlOVUxMLAorCQkvKiBUaGUgc3RhcnQgYWRkcmVzcyBpcyBpcnJlbGV2YW50LCBzaW5jZSB3ZSBzZXQKKwkJICAgbGFzdF9zb3VyY2Vfc3RhcnRfYWRkciBpbiBjb2ZmX2VuZF9zeW10YWIuICAqLworCQkwKTsKKyAgcmVjb3JkX2RlYnVnZm9ybWF0ICgiQ09GRiIpOworCisgIC8qIEluaXRpYWxpemUgdGhlIHNvdXJjZSBmaWxlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIGZpbGUuICAqLworCisgIGlmIChsaW5lX3ZlY3RvcikJCS8qIFVubGlrZWx5LCBidXQgbWF5YmUgcG9zc2libGU/ICovCisgICAgZnJlZSAoKFBUUilsaW5lX3ZlY3Rvcik7CisgIGxpbmVfdmVjdG9yX2luZGV4ID0gMDsKKyAgbGluZV92ZWN0b3JfbGVuZ3RoID0gMTAwMDsKKyAgcHJldl9saW5lX251bWJlciA9IC0yOwkvKiBGb3JjZSBmaXJzdCBsaW5lIG51bWJlciB0byBiZSBleHBsaWNpdCAqLworICBsaW5lX3ZlY3RvciA9IChzdHJ1Y3QgbGluZXRhYmxlICopCisgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbGluZXRhYmxlKQorCSAgICAgKyBsaW5lX3ZlY3Rvcl9sZW5ndGggKiBzaXplb2YgKHN0cnVjdCBsaW5ldGFibGVfZW50cnkpKTsKK30KKworLyogU2F2ZSB0aGUgdml0YWwgaW5mb3JtYXRpb24gZnJvbSB3aGVuIHN0YXJ0aW5nIHRvIHJlYWQgYSBmaWxlLAorICAgZm9yIHVzZSB3aGVuIGNsb3Npbmcgb2ZmIHRoZSBjdXJyZW50IGZpbGUuCisgICBOQU1FIGlzIHRoZSBmaWxlIG5hbWUgdGhlIHN5bWJvbHMgY2FtZSBmcm9tLCBTVEFSVF9BRERSIGlzIHRoZSBmaXJzdAorICAgdGV4dCBhZGRyZXNzIGZvciB0aGUgZmlsZSwgYW5kIFNJWkUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiB0ZXh0LiAgKi8KKworc3RhdGljIHZvaWQKK2NvbXBsZXRlX3N5bXRhYiAobmFtZSwgc3RhcnRfYWRkciwgc2l6ZSkKKyAgICBjaGFyICpuYW1lOworICAgIENPUkVfQUREUiBzdGFydF9hZGRyOworICAgIHVuc2lnbmVkIGludCBzaXplOworeworICBpZiAobGFzdF9zb3VyY2VfZmlsZSAhPSBOVUxMKQorICAgIGZyZWUgKGxhc3Rfc291cmNlX2ZpbGUpOworICBsYXN0X3NvdXJjZV9maWxlID0gc2F2ZXN0cmluZyAobmFtZSwgc3RybGVuIChuYW1lKSk7CisgIGN1cnJlbnRfc291cmNlX3N0YXJ0X2FkZHIgPSBzdGFydF9hZGRyOworICBjdXJyZW50X3NvdXJjZV9lbmRfYWRkciA9IHN0YXJ0X2FkZHIgKyBzaXplOworCisgIGlmIChjdXJyZW50X29iamZpbGUgLT4gZWkuZW50cnlfcG9pbnQgPj0gY3VycmVudF9zb3VyY2Vfc3RhcnRfYWRkciAmJgorICAgICAgY3VycmVudF9vYmpmaWxlIC0+IGVpLmVudHJ5X3BvaW50IDwgIGN1cnJlbnRfc291cmNlX2VuZF9hZGRyKQorICAgIHsKKyAgICAgIGN1cnJlbnRfb2JqZmlsZSAtPiBlaS5lbnRyeV9maWxlX2xvd3BjID0gY3VycmVudF9zb3VyY2Vfc3RhcnRfYWRkcjsKKyAgICAgIGN1cnJlbnRfb2JqZmlsZSAtPiBlaS5lbnRyeV9maWxlX2hpZ2hwYyA9IGN1cnJlbnRfc291cmNlX2VuZF9hZGRyOworICAgIH0KK30KKworLyogRmluaXNoIHRoZSBzeW1ib2wgZGVmaW5pdGlvbnMgZm9yIG9uZSBtYWluIHNvdXJjZSBmaWxlLAorICAgY2xvc2Ugb2ZmIGFsbCB0aGUgbGV4aWNhbCBjb250ZXh0cyBmb3IgdGhhdCBmaWxlCisgICAoY3JlYXRpbmcgc3RydWN0IGJsb2NrJ3MgZm9yIHRoZW0pLCB0aGVuIG1ha2UgdGhlCisgICBzdHJ1Y3Qgc3ltdGFiIGZvciB0aGF0IGZpbGUgYW5kIHB1dCBpdCBpbiB0aGUgbGlzdCBvZiBhbGwgc3VjaC4gKi8KKworc3RhdGljIHZvaWQKK2NvZmZfZW5kX3N5bXRhYiAob2JqZmlsZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCBzeW10YWIgKnN5bXRhYjsKKworICBsYXN0X3NvdXJjZV9zdGFydF9hZGRyID0gY3VycmVudF9zb3VyY2Vfc3RhcnRfYWRkcjsKKworICAvKiBGb3Igbm8gZ29vZCByZWFzb24sIHRoaXMgZmlsZSBzdG9yZXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIGEKKyAgICAgc2VwYXJhdGUgdmFyaWFibGUgaW5zdGVhZCBvZiBpbiBsaW5lX3ZlY3Rvci0+bml0ZW1zLiAgRml4IGl0LiAgKi8KKyAgaWYgKGxpbmVfdmVjdG9yKQorICAgIGxpbmVfdmVjdG9yLT5uaXRlbXMgPSBsaW5lX3ZlY3Rvcl9pbmRleDsKKworICAvKiBGb3IgQ09GRiwgd2Ugb25seSBoYXZlIG9uZSBzdWJmaWxlLCBzbyB3ZSBjYW4ganVzdCBsb29rIGF0CisgICAgIHN1YmZpbGVzIGFuZCBub3Qgd29ycnkgYWJvdXQgdGhlcmUgYmVpbmcgb3RoZXIgZWxlbWVudHMgaW4gdGhlCisgICAgIGNoYWluLiAgV2UgZmlsbCBpbiB2YXJpb3VzIGZpZWxkcyBub3cgYmVjYXVzZSB3ZSBkaWRuJ3Qga25vdyB0aGVtCisgICAgIGJlZm9yZSAob3IgYmVjYXVzZSBkb2luZyBpdCBub3cgaXMgc2ltcGx5IGFuIGFydGlmYWN0IG9mIGhvdyB0aGlzCisgICAgIGZpbGUgdXNlZCB0byBiZSB3cml0dGVuKS4gICovCisgIHN1YmZpbGVzLT5saW5lX3ZlY3RvciA9IGxpbmVfdmVjdG9yOworCisgIHN5bXRhYiA9IGVuZF9zeW10YWIgKGN1cnJlbnRfc291cmNlX2VuZF9hZGRyLCBvYmpmaWxlLCAwKTsKKworICBpZiAoc3ltdGFiICE9IE5VTEwpCisgICAgZnJlZV9uYW1lZF9zeW10YWJzIChzeW10YWItPmZpbGVuYW1lKTsKKworICAvKiBSZWluaXRpYWxpemUgZm9yIGJlZ2lubmluZyBvZiBuZXcgZmlsZS4gKi8KKyAgbGluZV92ZWN0b3IgPSAwOworICBsaW5lX3ZlY3Rvcl9sZW5ndGggPSAtMTsKKyAgbGFzdF9zb3VyY2VfZmlsZSA9IE5VTEw7Cit9CisMCitzdGF0aWMgdm9pZAorcmVjb3JkX21pbmltYWxfc3ltYm9sIChuYW1lLCBhZGRyZXNzLCB0eXBlLCBvYmpmaWxlKQorICAgICBjaGFyICpuYW1lOworICAgICBDT1JFX0FERFIgYWRkcmVzczsKKyAgICAgZW51bSBtaW5pbWFsX3N5bWJvbF90eXBlIHR5cGU7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICAvKiBXZSBkb24ndCB3YW50IFRERVNDIGVudHJ5IHBvaW50cyBpbiB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGUgKi8KKyAgaWYgKG5hbWVbMF0gPT0gJ0AnKSByZXR1cm47CisKKyAgcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2wgKG5hbWUsIGFkZHJlc3MsIHR5cGUsIG9iamZpbGUpOworfQorDAorLyogY29mZl9zeW1maWxlX2luaXQgKCkKKyAgIGlzIHRoZSBjb2ZmLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIHJlYWRpbmcgc3ltYm9scy4KKyAgIEl0IGlzIHBhc3NlZCBhIHN0cnVjdCBvYmpmaWxlIHdoaWNoIGNvbnRhaW5zLCBhbW9uZyBvdGhlciB0aGluZ3MsCisgICB0aGUgQkZEIGZvciB0aGUgZmlsZSB3aG9zZSBzeW1ib2xzIGFyZSBiZWluZyByZWFkLCBhbmQgYSBzbG90IGZvcgorICAgYSBwb2ludGVyIHRvICJwcml2YXRlIGRhdGEiIHdoaWNoIHdlIGZpbGwgd2l0aCBjb29raWVzIGFuZCBvdGhlcgorICAgdHJlYXRzIGZvciBjb2ZmX3N5bWZpbGVfcmVhZCAoKS4KKworICAgV2Ugd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiB0aGlzIGlzIGEgQ09GRiBvciBDT0ZGLWxpa2UgZmlsZS4KKyAgIEJGRCBoYW5kbGVzIGZpZ3VyaW5nIG91dCB0aGUgZm9ybWF0IG9mIHRoZSBmaWxlLCBhbmQgY29kZSBpbiBzeW10YWIuYworICAgdXNlcyBCRkQncyBkZXRlcm1pbmF0aW9uIHRvIHZlY3RvciB0byB1cy4KKworICAgVGhlIHVsdGltYXRlIHJlc3VsdCBpcyBhIG5ldyBzeW10YWIgKG9yLCBGSVhNRSwgZXZlbnR1YWxseSBhIHBzeW10YWIpLiAgKi8KKworc3RhdGljIHZvaWQKK2NvZmZfc3ltZmlsZV9pbml0IChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgLyogQWxsb2NhdGUgc3RydWN0IHRvIGtlZXAgdHJhY2sgb2Ygc3RhYiByZWFkaW5nLiAqLworICBvYmpmaWxlLT5zeW1fc3RhYl9pbmZvID0gKHN0cnVjdCBkYnhfc3ltZmlsZV9pbmZvICopCisgICAgeG1tYWxsb2MgKG9iamZpbGUtPm1kLCBzaXplb2YgKHN0cnVjdCBkYnhfc3ltZmlsZV9pbmZvKSk7CisKKyAgbWVtc2V0ICgoUFRSKSBvYmpmaWxlLT5zeW1fc3RhYl9pbmZvLCAwLCBzaXplb2YgKHN0cnVjdCBkYnhfc3ltZmlsZV9pbmZvKSk7CisKKyAgLyogQWxsb2NhdGUgc3RydWN0IHRvIGtlZXAgdHJhY2sgb2YgdGhlIHN5bWZpbGUgKi8KKyAgb2JqZmlsZS0+c3ltX3ByaXZhdGUgPSB4bW1hbGxvYyAob2JqZmlsZS0+bWQsCisJCQkJICAgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zeW1maWxlX2luZm8pKTsKKworICBtZW1zZXQgKG9iamZpbGUtPnN5bV9wcml2YXRlLCAwLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3N5bWZpbGVfaW5mbykpOworCisgIC8qIENPRkYgb2JqZWN0cyBtYXkgYmUgcmVvcmRlcmVkLCBzbyBzZXQgT0JKRl9SRU9SREVSRUQuICBJZiB3ZQorICAgICBmaW5kIHRoaXMgY2F1c2VzIGEgc2lnbmlmaWNhbnQgc2xvd2Rvd24gaW4gZ2RiIHRoZW4gd2UgY291bGQKKyAgICAgc2V0IGl0IGluIHRoZSBkZWJ1ZyBzeW1ib2wgcmVhZGVycyBvbmx5IHdoZW4gbmVjZXNzYXJ5LiAgKi8KKyAgb2JqZmlsZS0+ZmxhZ3MgfD0gT0JKRl9SRU9SREVSRUQ7CisKKyAgaW5pdF9lbnRyeV9wb2ludF9pbmZvIChvYmpmaWxlKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGV2ZXJ5IHNlY3Rpb247IGl0IGZpbmRzIHRoZSBvdXRlciBsaW1pdHMKKyAgIG9mIHRoZSBsaW5lIHRhYmxlIChtaW5pbXVtIGFuZCBtYXhpbXVtIGZpbGUgb2Zmc2V0KSBzbyB0aGF0IHRoZQorICAgbWFpbmxpbmUgY29kZSBjYW4gcmVhZCB0aGUgd2hvbGUgdGhpbmcgZm9yIGVmZmljaWVuY3kuICAqLworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2ZpbmRfbGluZW5vcyAoYWJmZCwgYXNlY3QsIHZwaW5mbykKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIGFzZWN0OworICAgICBQVFIgdnBpbmZvOworeworICBzdHJ1Y3QgY29mZl9zeW1maWxlX2luZm8gKmluZm87CisgIGludCBzaXplLCBjb3VudDsKKyAgZmlsZV9wdHIgb2Zmc2V0LCBtYXhvZmY7CisKKy8qIFdBUk5JTkcgV0lMTCBST0JJTlNPTiEgIEFDQ0VTU0lORyBCRkQtUFJJVkFURSBEQVRBIEhFUkUhICBGSVhNRSEgICovCisgIGNvdW50ID0gYXNlY3QtPmxpbmVub19jb3VudDsKKy8qIEVuZCBvZiB3YXJuaW5nICovCisKKyAgaWYgKGNvdW50ID09IDApCisgICAgcmV0dXJuOworICBzaXplID0gY291bnQgKiBsb2NhbF9saW5lc3o7CisKKyAgaW5mbyA9IChzdHJ1Y3QgY29mZl9zeW1maWxlX2luZm8gKil2cGluZm87CisvKiBXQVJOSU5HIFdJTEwgUk9CSU5TT04hICBBQ0NFU1NJTkcgQkZELVBSSVZBVEUgREFUQSBIRVJFISAgRklYTUUhICAqLworICBvZmZzZXQgPSBhc2VjdC0+bGluZV9maWxlcG9zOworLyogRW5kIG9mIHdhcm5pbmcgKi8KKworICBpZiAob2Zmc2V0IDwgaW5mby0+bWluX2xpbmVub19vZmZzZXQgfHwgaW5mby0+bWluX2xpbmVub19vZmZzZXQgPT0gMCkKKyAgICBpbmZvLT5taW5fbGluZW5vX29mZnNldCA9IG9mZnNldDsKKworICBtYXhvZmYgPSBvZmZzZXQgKyBzaXplOworICBpZiAobWF4b2ZmID4gaW5mby0+bWF4X2xpbmVub19vZmZzZXQpCisgICAgaW5mby0+bWF4X2xpbmVub19vZmZzZXQgPSBtYXhvZmY7Cit9CisKKworLyogVGhlIEJGRCBmb3IgdGhpcyBmaWxlIC0tIG9ubHkgZ29vZCB3aGlsZSB3ZSdyZSBhY3RpdmVseSByZWFkaW5nCisgICBzeW1ib2xzIGludG8gYSBwc3ltdGFiIG9yIGEgc3ltdGFiLiAgKi8KKworc3RhdGljIGJmZCAqc3ltZmlsZV9iZmQ7CisKKy8qIFJlYWQgYSBzeW1ib2wgZmlsZSwgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gYnkgY29mZl9zeW1maWxlX2luaXQuICAqLworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2NvZmZfc3ltZmlsZV9yZWFkIChvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMsIG1haW5saW5lKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworICAgICBpbnQgbWFpbmxpbmU7Cit7CisgIHN0cnVjdCBjb2ZmX3N5bWZpbGVfaW5mbyAqaW5mbzsKKyAgc3RydWN0IGRieF9zeW1maWxlX2luZm8gKmRieGluZm87CisgIGJmZCAqYWJmZCA9IG9iamZpbGUtPm9iZmQ7CisgIGNvZmZfZGF0YV90eXBlICpjZGF0YSA9IGNvZmZfZGF0YSAoYWJmZCk7CisgIGNoYXIgKm5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKKyAgcmVnaXN0ZXIgaW50IHZhbDsKKyAgaW50IG51bV9zeW1ib2xzOworICBpbnQgc3ltdGFiX29mZnNldDsKKyAgaW50IHN0cmluZ3RhYl9vZmZzZXQ7CisgIHN0cnVjdCBjbGVhbnVwICpiYWNrX3RvOworICBpbnQgc3RhYnN0cnNpemU7CisKKyAgaW5mbyA9IChzdHJ1Y3QgY29mZl9zeW1maWxlX2luZm8gKikgb2JqZmlsZSAtPiBzeW1fcHJpdmF0ZTsKKyAgZGJ4aW5mbyA9IG9iamZpbGUtPnN5bV9zdGFiX2luZm87CisgIHN5bWZpbGVfYmZkID0gYWJmZDsJCQkvKiBLbHVkZ2UgZm9yIHN3YXAgcm91dGluZXMgKi8KKworLyogV0FSTklORyBXSUxMIFJPQklOU09OISAgQUNDRVNTSU5HIEJGRC1QUklWQVRFIERBVEEgSEVSRSEgIEZJWE1FISAgKi8KKyAgIG51bV9zeW1ib2xzID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7CS8qIEhvdyBtYW55IHN5bXMgKi8KKyAgIHN5bXRhYl9vZmZzZXQgPSBjZGF0YS0+c3ltX2ZpbGVwb3M7CQkvKiBTeW1ib2wgdGFibGUgZmlsZSBvZmZzZXQgKi8KKyAgIHN0cmluZ3RhYl9vZmZzZXQgPSBzeW10YWJfb2Zmc2V0ICsJCS8qIFN0cmluZyB0YWJsZSBmaWxlIG9mZnNldCAqLworCQkgICAgICBudW1fc3ltYm9scyAqIGNkYXRhLT5sb2NhbF9zeW1lc3o7CisKKyAgLyogU2V0IGEgZmV3IGZpbGUtc3RhdGljcyB0aGF0IGdpdmUgdXMgc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgdGhlIHBhcnRpY3VsYXIgQ09GRiBmaWxlIGZvcm1hdCB3ZSdyZSByZWFkaW5nLiAgKi8KKyAgbG9jYWxfbGluZXN6ICAgPSBjZGF0YS0+bG9jYWxfbGluZXN6OworICBsb2NhbF9uX2J0bWFzayA9IGNkYXRhLT5sb2NhbF9uX2J0bWFzazsKKyAgbG9jYWxfbl9idHNoZnQgPSBjZGF0YS0+bG9jYWxfbl9idHNoZnQ7CisgIGxvY2FsX25fdG1hc2sgID0gY2RhdGEtPmxvY2FsX25fdG1hc2s7CisgIGxvY2FsX25fdHNoaWZ0ID0gY2RhdGEtPmxvY2FsX25fdHNoaWZ0OworICBsb2NhbF9saW5lc3ogICA9IGNkYXRhLT5sb2NhbF9saW5lc3o7CisgIGxvY2FsX3N5bWVzeiAgID0gY2RhdGEtPmxvY2FsX3N5bWVzejsKKyAgbG9jYWxfYXV4ZXN6ICAgPSBjZGF0YS0+bG9jYWxfYXV4ZXN6OworCisgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciByYXcgc3ltYm9sIGFuZCBhdXggZW50cmllcywgYmFzZWQgb24gdGhlaXIKKyAgICAgc3BhY2UgcmVxdWlyZW1lbnRzIGFzIHJlcG9ydGVkIGJ5IEJGRC4gICovCisgIHRlbXBfc3ltID0gKGNoYXIgKikgeG1hbGxvYworCSAoY2RhdGEtPmxvY2FsX3N5bWVzeiArIGNkYXRhLT5sb2NhbF9hdXhlc3opOworICB0ZW1wX2F1eCA9IHRlbXBfc3ltICsgY2RhdGEtPmxvY2FsX3N5bWVzejsKKyAgYmFja190byA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlX2N1cnJlbnRfY29udGVudHMsICZ0ZW1wX3N5bSk7CisKKyAgLyogV2UgbmVlZCB0byBrbm93IHdoZXRoZXIgdGhpcyBpcyBhIFBFIGZpbGUsIGJlY2F1c2UgaW4gUEUgZmlsZXMsCisgICAgIHVubGlrZSBzdGFuZGFyZCBDT0ZGIGZpbGVzLCBzeW1ib2wgdmFsdWVzIGFyZSBzdG9yZWQgYXMgb2Zmc2V0cworICAgICBmcm9tIHRoZSBzZWN0aW9uIGFkZHJlc3MsIHJhdGhlciB0aGFuIGFzIGFic29sdXRlIGFkZHJlc3Nlcy4KKyAgICAgRklYTUU6IFdlIHNob3VsZCB1c2UgQkZEIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZSwgYW5kIHRodXMgYXZvaWQKKyAgICAgdGhpcyBwcm9ibGVtLiAgKi8KKyAgcGVfZmlsZSA9IHN0cm5jbXAgKGJmZF9nZXRfdGFyZ2V0IChvYmpmaWxlLT5vYmZkKSwgInBlIiwgMikgPT0gMDsKKworLyogRW5kIG9mIHdhcm5pbmcgKi8KKworICAvKiBSZWFkIHRoZSBsaW5lIG51bWJlciB0YWJsZSwgYWxsIGF0IG9uY2UuICAqLworICBpbmZvLT5taW5fbGluZW5vX29mZnNldCA9IDA7CisgIGluZm8tPm1heF9saW5lbm9fb2Zmc2V0ID0gMDsKKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBmaW5kX2xpbmVub3MsIChQVFIpIGluZm8pOworCisgIG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlX2xpbmV0YWIsIDApOworICB2YWwgPSBpbml0X2xpbmVubyAoYWJmZCwgaW5mby0+bWluX2xpbmVub19vZmZzZXQsIAorCQkgICAgIGluZm8tPm1heF9saW5lbm9fb2Zmc2V0IC0gaW5mby0+bWluX2xpbmVub19vZmZzZXQpOworICBpZiAodmFsIDwgMCkKKyAgICBlcnJvciAoIlwiJXNcIjogZXJyb3IgcmVhZGluZyBsaW5lIG51bWJlcnNcbiIsIG5hbWUpOworCisgIC8qIE5vdyByZWFkIHRoZSBzdHJpbmcgdGFibGUsIGFsbCBhdCBvbmNlLiAgKi8KKworICBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZnJlZV9zdHJpbmd0YWIsIDApOworICB2YWwgPSBpbml0X3N0cmluZ3RhYiAoYWJmZCwgc3RyaW5ndGFiX29mZnNldCk7CisgIGlmICh2YWwgPCAwKQorICAgIGVycm9yICgiXCIlc1wiOiBjYW4ndCBnZXQgc3RyaW5nIHRhYmxlIiwgbmFtZSk7CisKKyAgaW5pdF9taW5pbWFsX3N5bWJvbF9jb2xsZWN0aW9uICgpOworICBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZGlzY2FyZF9taW5pbWFsX3N5bWJvbHMsIDApOworCisgIC8qIE5vdyB0aGF0IHRoZSBleGVjdXRhYmxlIGZpbGUgaXMgcG9zaXRpb25lZCBhdCBzeW1ib2wgdGFibGUsCisgICAgIHByb2Nlc3MgaXQgYW5kIGRlZmluZSBzeW1ib2xzIGFjY29yZGluZ2x5LiAgKi8KKworICBjb2ZmX3N5bXRhYl9yZWFkICgobG9uZykgc3ltdGFiX29mZnNldCwgbnVtX3N5bWJvbHMsIHNlY3Rpb25fb2Zmc2V0cywKKwkJICAgIG9iamZpbGUpOworCisgIC8qIFNvcnQgc3ltYm9scyBhbHBoYWJldGljYWxseSB3aXRoaW4gZWFjaCBibG9jay4gICovCisKKyAgeworICAgIHN0cnVjdCBzeW10YWIgKnM7CisKKyAgICBmb3IgKHMgPSBvYmpmaWxlIC0+IHN5bXRhYnM7IHMgIT0gTlVMTDsgcyA9IHMgLT4gbmV4dCkKKyAgICAgIHNvcnRfc3ltdGFiX3N5bXMgKHMpOworICB9CisKKyAgLyogSW5zdGFsbCBhbnkgbWluaW1hbCBzeW1ib2xzIHRoYXQgaGF2ZSBiZWVuIGNvbGxlY3RlZCBhcyB0aGUgY3VycmVudAorICAgICBtaW5pbWFsIHN5bWJvbHMgZm9yIHRoaXMgb2JqZmlsZS4gICovCisKKyAgaW5zdGFsbF9taW5pbWFsX3N5bWJvbHMgKG9iamZpbGUpOworCisgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgY29mZl9sb2NhdGVfc2VjdGlvbnMsIChQVFIpIGluZm8pOworCisgIGlmIChpbmZvLT5zdGFic2VjdHMpCisgICAgeworICAgICAgLyogRklYTUU6IGR1YmlvdXMuICBXaHkgY2FuJ3Qgd2UgdXNlIHNvbWV0aGluZyBub3JtYWwgbGlrZQorCSBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHM/ICAqLworICAgICAgYmZkX3NlZWsgKGFiZmQsIGFiZmQtPndoZXJlLCAwKTsKKworICAgICAgc3RhYnN0cnNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBpbmZvLT5zdGFic3Ryc2VjdCk7CisKKyAgICAgIGNvZmZzdGFiX2J1aWxkX3BzeW10YWJzIChvYmpmaWxlLAorCQkJICAgICAgIHNlY3Rpb25fb2Zmc2V0cywKKwkJCSAgICAgICBtYWlubGluZSwKKwkJCSAgICAgICBpbmZvLT50ZXh0YWRkciwgaW5mby0+dGV4dHNpemUsCisJCQkgICAgICAgaW5mby0+c3RhYnNlY3RzLAorCQkJICAgICAgIGluZm8tPnN0YWJzdHJzZWN0LT5maWxlcG9zLCBzdGFic3Ryc2l6ZSk7CisgICAgfQorCisgIGRvX2NsZWFudXBzIChiYWNrX3RvKTsKK30KKworc3RhdGljIHZvaWQKK2NvZmZfbmV3X2luaXQgKGlnbm9yZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKmlnbm9yZTsKK3sKK30KKworLyogUGVyZm9ybSBhbnkgbG9jYWwgY2xlYW51cHMgcmVxdWlyZWQgd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIGEgcGFydGljdWxhcgorICAgb2JqZmlsZS4gIEkuRSwgd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGRpc2NhcmRpbmcgYWxsIHN5bWJvbCBpbmZvcm1hdGlvbgorICAgZm9yIGFuIG9iamZpbGUsIGZyZWVpbmcgdXAgYWxsIG1lbW9yeSBoZWxkIGZvciBpdCwgYW5kIHVubGlua2luZyB0aGUKKyAgIG9iamZpbGUgc3RydWN0IGZyb20gdGhlIGdsb2JhbCBsaXN0IG9mIGtub3duIG9iamZpbGVzLiAqLworCitzdGF0aWMgdm9pZAorY29mZl9zeW1maWxlX2ZpbmlzaCAob2JqZmlsZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIGlmIChvYmpmaWxlIC0+IHN5bV9wcml2YXRlICE9IE5VTEwpCisgICAgeworICAgICAgbWZyZWUgKG9iamZpbGUgLT4gbWQsIG9iamZpbGUgLT4gc3ltX3ByaXZhdGUpOworICAgIH0KK30KKworDAorLyogR2l2ZW4gcG9pbnRlcnMgdG8gYSBzeW1ib2wgdGFibGUgaW4gY29mZiBzdHlsZSBleGVjIGZpbGUsCisgICBhbmFseXplIHRoZW0gYW5kIGNyZWF0ZSBzdHJ1Y3Qgc3ltdGFiJ3MgZGVzY3JpYmluZyB0aGUgc3ltYm9scy4KKyAgIE5TWU1TIGlzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlLgorICAgV2UgcmVhZCB0aGVtIG9uZSBhdCBhIHRpbWUgdXNpbmcgcmVhZF9vbmVfc3ltICgpLiAgKi8KKworc3RhdGljIHZvaWQKK2NvZmZfc3ltdGFiX3JlYWQgKHN5bXRhYl9vZmZzZXQsIG5zeW1zLCBzZWN0aW9uX29mZnNldHMsIG9iamZpbGUpCisgICAgIGxvbmcgc3ltdGFiX29mZnNldDsKKyAgICAgaW50IG5zeW1zOworICAgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHM7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICByZWdpc3RlciBzdHJ1Y3QgY29udGV4dF9zdGFjayAqbmV3OworICBzdHJ1Y3QgY29mZl9zeW1ib2wgY29mZl9zeW1ib2w7CisgIHJlZ2lzdGVyIHN0cnVjdCBjb2ZmX3N5bWJvbCAqY3MgPSAmY29mZl9zeW1ib2w7CisgIHN0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IG1haW5fc3ltOworICBzdGF0aWMgdW5pb24gaW50ZXJuYWxfYXV4ZW50IG1haW5fYXV4OworICBzdHJ1Y3QgY29mZl9zeW1ib2wgZmNuX2NzX3NhdmVkOworICBzdGF0aWMgc3RydWN0IGludGVybmFsX3N5bWVudCBmY25fc3ltX3NhdmVkOworICBzdGF0aWMgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGZjbl9hdXhfc2F2ZWQ7CisgIHN0cnVjdCBzeW10YWIgKnM7CisgIC8qIEEgLmZpbGUgaXMgb3Blbi4gICovCisgIGludCBpbl9zb3VyY2VfZmlsZSA9IDA7CisgIGludCBuZXh0X2ZpbGVfc3ltbnVtID0gLTE7CisgIC8qIE5hbWUgb2YgdGhlIGN1cnJlbnQgZmlsZS4gICovCisgIGNoYXIgKmZpbGVzdHJpbmcgPSAiIjsKKyAgaW50IGRlcHRoID0gMDsKKyAgaW50IGZjbl9maXJzdF9saW5lID0gMDsKKyAgaW50IGZjbl9sYXN0X2xpbmUgPSAwOworICBpbnQgZmNuX3N0YXJ0X2FkZHIgPSAwOworICBsb25nIGZjbl9saW5lX3B0ciA9IDA7CisgIGludCB2YWw7CisgIENPUkVfQUREUiB0bXBhZGRyOworCisgIC8qIFdvcmsgYXJvdW5kIGEgc3RkaW8gYnVnIGluIFN1bk9TNC4xLjEgKHRoaXMgbWFrZXMgbWUgbmVydm91cy4uLi4KKyAgICAgaXQncyBoYXJkIHRvIGtub3cgSSd2ZSByZWFsbHkgd29ya2VkIGFyb3VuZCBpdC4gIFRoZSBmaXggc2hvdWxkIGJlCisgICAgIGhhcm1sZXNzLCBhbnl3YXkpLiAgVGhlIHN5bXB0b20gb2YgdGhlIGJ1ZyBpcyB0aGF0IHRoZSBmaXJzdAorICAgICBmcmVhZCAoaW4gcmVhZF9vbmVfc3ltKSwgd2lsbCAoaW4gbXkgZXhhbXBsZSkgYWN0dWFsbHkgZ2V0IGRhdGEKKyAgICAgZnJvbSBmaWxlIG9mZnNldCAyNjgsIHdoZW4gdGhlIGZzZWVrIHdhcyB0byAyNjQgKGFuZCBmdGVsbCBzaG93cworICAgICAyNjQpLiAgVGhpcyBjYXVzZXMgYWxsIGhlbGwgdG8gYnJlYWsgbG9vc2UuICBJIHdhcyB1bmFibGUgdG8KKyAgICAgcmVwcm9kdWNlIHRoaXMgb24gYSBzaG9ydCB0ZXN0IHByb2dyYW0gd2hpY2ggb3BlcmF0ZWQgb24gdGhlIHNhbWUKKyAgICAgZmlsZSwgcGVyZm9ybWluZyAoSSB0aGluaykgdGhlIHNhbWUgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucy4KKworICAgICBJdCBzdG9wcGVkIGhhcHBlbmluZyB3aGVuIEkgcHV0IGluIHRoaXMgKGZvcm1lcikgcmV3aW5kKCkuCisKKyAgICAgRklYTUU6IEZpbmQgb3V0IGlmIHRoaXMgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gU3VuLCB3aGV0aGVyIGl0IGhhcworICAgICBiZWVuIGZpeGVkIGluIGEgbGF0ZXIgcmVsZWFzZSwgZXRjLiAgKi8KKworICBiZmRfc2VlayAob2JqZmlsZS0+b2JmZCwgMCwgMCk7CisKKyAgLyogUG9zaXRpb24gdG8gcmVhZCB0aGUgc3ltYm9sIHRhYmxlLiAqLworICB2YWwgPSBiZmRfc2VlayAob2JqZmlsZS0+b2JmZCwgKGxvbmcpIHN5bXRhYl9vZmZzZXQsIDApOworICBpZiAodmFsIDwgMCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lIChvYmpmaWxlLT5uYW1lKTsKKworICBjdXJyZW50X29iamZpbGUgPSBvYmpmaWxlOworICBubGlzdF9iZmRfZ2xvYmFsID0gb2JqZmlsZS0+b2JmZDsKKyAgbmxpc3RfbnN5bXNfZ2xvYmFsID0gbnN5bXM7CisgIGxhc3Rfc291cmNlX2ZpbGUgPSBOVUxMOworICBtZW1zZXQgKG9wYXF1ZV90eXBlX2NoYWluLCAwLCBzaXplb2Ygb3BhcXVlX3R5cGVfY2hhaW4pOworCisgIGlmICh0eXBlX3ZlY3RvcikJCQkvKiBHZXQgcmlkIG9mIHByZXZpb3VzIG9uZSAqLworICAgIGZyZWUgKChQVFIpIHR5cGVfdmVjdG9yKTsKKyAgdHlwZV92ZWN0b3JfbGVuZ3RoID0gMTYwOworICB0eXBlX3ZlY3RvciA9IChzdHJ1Y3QgdHlwZSAqKikKKyAgICB4bWFsbG9jICh0eXBlX3ZlY3Rvcl9sZW5ndGggKiBzaXplb2YgKHN0cnVjdCB0eXBlICopKTsKKyAgbWVtc2V0ICh0eXBlX3ZlY3RvciwgMCwgdHlwZV92ZWN0b3JfbGVuZ3RoICogc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSk7CisKKyAgY29mZl9zdGFydF9zeW10YWIgKCIiKTsKKworICBzeW1udW0gPSAwOworICB3aGlsZSAoc3ltbnVtIDwgbnN5bXMpCisgICAgeworICAgICAgUVVJVDsJCQkvKiBNYWtlIHRoaXMgY29tbWFuZCBpbnRlcnJ1cHRhYmxlLiAgKi8KKworICAgICAgcmVhZF9vbmVfc3ltIChjcywgJm1haW5fc3ltLCAmbWFpbl9hdXgpOworCisgICAgICBpZiAoY3MtPmNfc3ltbnVtID09IG5leHRfZmlsZV9zeW1udW0gJiYgY3MtPmNfc2NsYXNzICE9IENfRklMRSkKKwl7CisJICBpZiAobGFzdF9zb3VyY2VfZmlsZSkKKwkgICAgY29mZl9lbmRfc3ltdGFiIChvYmpmaWxlKTsKKworCSAgY29mZl9zdGFydF9zeW10YWIgKCJfZ2xvYmFsc18iKTsKKwkgIGNvbXBsZXRlX3N5bXRhYiAoIl9nbG9iYWxzXyIsIDAsIDApOworCSAgLyogZG9uZSB3aXRoIGFsbCBmaWxlcywgZXZlcnl0aGluZyBmcm9tIGhlcmUgb24gb3V0IGlzIGdsb2JhbHMgKi8KKwl9CisKKyAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZmlsZSB3aXRoIHR5cGUgZGVjbGFyYXRpb25zIG9ubHksIG5vIHRleHQuICAqLworICAgICAgaWYgKCFsYXN0X3NvdXJjZV9maWxlICYmIFNEQl9UWVBFIChjcy0+Y190eXBlKQorCSAgJiYgY3MtPmNfc2VjbnVtID09IE5fREVCVUcpCisJY29tcGxldGVfc3ltdGFiIChmaWxlc3RyaW5nLCAwLCAwKTsKKworICAgICAgLyogVHlwZWRlZnMgc2hvdWxkIG5vdCBiZSB0cmVhdGVkIGFzIHN5bWJvbCBkZWZpbml0aW9ucy4gICovCisgICAgICBpZiAoSVNGQ04gKGNzLT5jX3R5cGUpICYmIGNzLT5jX3NjbGFzcyAhPSBDX1RQREVGKQorCXsKKwkgIC8qIFJlY29yZCBhbGwgZnVuY3Rpb25zIC0tIGV4dGVybmFsIGFuZCBzdGF0aWMgLS0gaW4gbWluc3ltcy4gKi8KKwkgIHRtcGFkZHIgPSBjcy0+Y192YWx1ZSArIEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOworCSAgcmVjb3JkX21pbmltYWxfc3ltYm9sIChjcy0+Y19uYW1lLCB0bXBhZGRyLCBtc3RfdGV4dCwgb2JqZmlsZSk7CisKKwkgIGZjbl9saW5lX3B0ciA9IG1haW5fYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cjsKKwkgIGZjbl9zdGFydF9hZGRyID0gdG1wYWRkcjsKKwkgIGZjbl9jc19zYXZlZCA9ICpjczsKKwkgIGZjbl9zeW1fc2F2ZWQgPSBtYWluX3N5bTsKKwkgIGZjbl9hdXhfc2F2ZWQgPSBtYWluX2F1eDsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgc3dpdGNoIChjcy0+Y19zY2xhc3MpCisJeworCSAgY2FzZSBDX0VGQ046CisJICBjYXNlIENfRVhUREVGOgorCSAgY2FzZSBDX1VMQUJFTDoKKwkgIGNhc2UgQ19VU1RBVElDOgorCSAgY2FzZSBDX0xJTkU6CisJICBjYXNlIENfQUxJQVM6CisJICBjYXNlIENfSElEREVOOgorCSAgICBjb21wbGFpbiAoJmJhZF9zY2xhc3NfY29tcGxhaW50LCBjcy0+Y19uYW1lKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgQ19GSUxFOgorCSAgICAvKiBjX3ZhbHVlIGZpZWxkIGNvbnRhaW5zIHN5bW51bSBvZiBuZXh0IC5maWxlIGVudHJ5IGluIHRhYmxlCisJICAgICAgIG9yIHN5bW51bSBvZiBmaXJzdCBnbG9iYWwgYWZ0ZXIgbGFzdCAuZmlsZS4gICovCisJICAgIG5leHRfZmlsZV9zeW1udW0gPSBjcy0+Y192YWx1ZTsKKwkgICAgaWYgKGNzLT5jX25hdXggPiAwKQorCSAgICAgIGZpbGVzdHJpbmcgPSBjb2ZmX2dldGZpbGVuYW1lICgmbWFpbl9hdXgpOworCSAgICBlbHNlCisJICAgICAgZmlsZXN0cmluZyA9ICIiOworCisJICAgIC8qIENvbXBsZXRlIHN5bWJvbCB0YWJsZSBmb3IgbGFzdCBvYmplY3QgZmlsZQorCSAgICAgICBjb250YWluaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCisJICAgIGlmIChsYXN0X3NvdXJjZV9maWxlKQorCSAgICAgIHsKKwkJY29mZl9lbmRfc3ltdGFiIChvYmpmaWxlKTsKKwkJY29mZl9zdGFydF9zeW10YWIgKGZpbGVzdHJpbmcpOworCSAgICAgIH0KKwkgICAgaW5fc291cmNlX2ZpbGUgPSAxOworCSAgICBicmVhazsKKworCSAgLyogQ19MQUJFTCBpcyB1c2VkIGZvciBsYWJlbHMgYW5kIHN0YXRpYyBmdW5jdGlvbnMuICBJbmNsdWRpbmcKKwkgICAgIGl0IGhlcmUgYWxsb3dzIGdkYiB0byBzZWUgc3RhdGljIGZ1bmN0aW9ucyB3aGVuIG5vIGRlYnVnCisJICAgICBpbmZvIGlzIGF2YWlsYWJsZS4gICovCisJICBjYXNlIENfTEFCRUw6CisJICAgIC8qIEhvd2V2ZXIsIGxhYmVscyB3aXRoaW4gYSBmdW5jdGlvbiBjYW4gbWFrZSB3ZWlyZCBiYWNrdHJhY2VzLAorCSAgICAgICBzbyBmaWx0ZXIgdGhlbSBvdXQgKGZyb20gcGhkbUBtYWNxZWwuYmUpLiAqLworCSAgICBpZiAod2l0aGluX2Z1bmN0aW9uKQorCSAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQ19TVEFUOgorCSAgY2FzZSBDX1RIVU1CTEFCRUw6CisJICBjYXNlIENfVEhVTUJTVEFUOgorCSAgY2FzZSBDX1RIVU1CU1RBVEZVTkM6CisJICAgIGlmIChjcy0+Y19uYW1lWzBdID09ICcuJykKKwkgICAgICB7CisJCWlmIChTVFJFUSAoY3MtPmNfbmFtZSwgIi50ZXh0IikpIHsKKwkJICAvKiBGSVhNRTogIGRvbid0IHdpcmUgaW4gIi50ZXh0IiBhcyBzZWN0aW9uIG5hbWUKKwkJICAgICBvciBzeW1ib2wgbmFtZSEgKi8KKwkJICAvKiBDaGVjayBmb3IgaW5fc291cmNlX2ZpbGUgZGVhbHMgd2l0aCBjYXNlIG9mCisJCSAgICAgYSBmaWxlIHdpdGggZGVidWdnaW5nIHN5bWJvbHMKKwkJICAgICBmb2xsb3dlZCBieSBhIGxhdGVyIGZpbGUgd2l0aCBubyBzeW1ib2xzLiAgKi8KKwkJICBpZiAoaW5fc291cmNlX2ZpbGUpCisJCSAgICBjb21wbGV0ZV9zeW10YWIgKGZpbGVzdHJpbmcsCisJCQkJICAgICBjcy0+Y192YWx1ZSArIEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpLAorCQkJCSAgICAgbWFpbl9hdXgueF9zY24ueF9zY25sZW4pOworCQkgIGluX3NvdXJjZV9maWxlID0gMDsKKwkJfQorCQkvKiBmbHVzaCByZXN0IG9mICcuJyBzeW1ib2xzICovCisJCWJyZWFrOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoIVNEQl9UWVBFIChjcy0+Y190eXBlKQorCQkgICAgICYmIGNzLT5jX25hbWVbMF0gPT0gJ0wnCisJCSAgICAgJiYgKHN0cm5jbXAgKGNzLT5jX25hbWUsICJMSSUiLCAzKSA9PSAwCisJCQkgfHwgc3RybmNtcCAoY3MtPmNfbmFtZSwgIkxGJSIsIDMpID09IDAKKwkJCSB8fCBzdHJuY21wIChjcy0+Y19uYW1lLCJMQyUiLDMpID09IDAKKwkJCSB8fCBzdHJuY21wIChjcy0+Y19uYW1lLCJMUCUiLDMpID09IDAKKwkJCSB8fCBzdHJuY21wIChjcy0+Y19uYW1lLCJMUEIlIiw0KSA9PSAwCisJCQkgfHwgc3RybmNtcCAoY3MtPmNfbmFtZSwiTEJCJSIsNCkgPT0gMAorCQkJIHx8IHN0cm5jbXAgKGNzLT5jX25hbWUsIkxCRSUiLDQpID09IDAKKwkJCSB8fCBzdHJuY21wIChjcy0+Y19uYW1lLCJMUEJYJSIsNSkgPT0gMCkpCisJICAgICAgLyogQXQgbGVhc3Qgb24gYSAzYjEsIGdjYyBnZW5lcmF0ZXMgc3diZWcgYW5kIHN0cmluZyBsYWJlbHMKKwkJIHRoYXQgbG9vayBsaWtlIHRoaXMuICBJZ25vcmUgdGhlbS4gICovCisJICAgICAgYnJlYWs7CisJICAgIC8qIGZhbGwgaW4gZm9yIHN0YXRpYyBzeW1ib2xzIHRoYXQgZG9uJ3Qgc3RhcnQgd2l0aCAnLicgKi8KKwkgIGNhc2UgQ19USFVNQkVYVDoKKwkgIGNhc2UgQ19USFVNQkVYVEZVTkM6CisJICBjYXNlIENfRVhUOgorCSAgICB7CisJICAgICAgLyogUmVjb3JkIGl0IGluIHRoZSBtaW5pbWFsIHN5bWJvbHMgcmVnYXJkbGVzcyBvZgorCQkgU0RCX1RZUEUuICBUaGlzIHBhcmFsbGVscyB3aGF0IHdlIGRvIGZvciBvdGhlciBkZWJ1ZworCQkgZm9ybWF0cywgYW5kIHByb2JhYmx5IGlzIG5lZWRlZCB0byBtYWtlCisJCSBwcmludF9hZGRyZXNzX3N5bWJvbGljIHdvcmsgcmlnaHQgd2l0aG91dCB0aGUgKG5vdworCQkgZ29uZSkgInNldCBmYXN0LXN5bWJvbGljLWFkZHIgb2ZmIiBrbHVkZ2UuICAqLworCisJICAgICAgLyogRklYTUU6IHNob3VsZCB1c2UgbXN0X2FicywgYW5kIG5vdCByZWxvY2F0ZSwgaWYgYWJzb2x1dGUuICAqLworCSAgICAgIGVudW0gbWluaW1hbF9zeW1ib2xfdHlwZSBtc190eXBlOworCSAgICAgIGludCBzZWM7CisKKwkgICAgICBpZiAoY3MtPmNfc2VjbnVtID09IE5fVU5ERUYpCisJCXsKKwkJICAvKiBUaGlzIGlzIGEgY29tbW9uIHN5bWJvbC4gIFNlZSBpZiB0aGUgdGFyZ2V0CisJCSAgICAgZW52aXJvbm1lbnQga25vd3Mgd2hlcmUgaXQgaGFzIGJlZW4gcmVsb2NhdGVkIHRvLiAgKi8KKwkJICBDT1JFX0FERFIgcmVsYWRkcjsKKwkJICBpZiAodGFyZ2V0X2xvb2t1cF9zeW1ib2wgKGNzLT5jX25hbWUsICZyZWxhZGRyKSkKKwkJICAgIHsKKwkJICAgICAgLyogRXJyb3IgaW4gbG9va3VwOyBpZ25vcmUgc3ltYm9sLiAgKi8KKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCSAgdG1wYWRkciA9IHJlbGFkZHI7CisJCSAgLyogVGhlIGFkZHJlc3MgaGFzIGFscmVhZHkgYmVlbiByZWxvY2F0ZWQ7IG1ha2Ugc3VyZSB0aGF0CisJCSAgICAgb2JqZmlsZV9yZWxvY2F0ZSBkb2Vzbid0IHJlbG9jYXRlIGl0IGFnYWluLiAgKi8KKwkJICBzZWMgPSAtMjsKKwkJICBtc190eXBlID0gY3MtPmNfc2NsYXNzID09IENfRVhUCisJCQkgICAgfHwgY3MtPmNfc2NsYXNzID09IENfVEhVTUJFWFQgPworCQkJICAgICAgIG1zdF9ic3MgOiBtc3RfZmlsZV9ic3M7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBzZWMgPSBjc190b19zZWN0aW9uIChjcywgb2JqZmlsZSk7CisJCSAgdG1wYWRkciA9IGNzLT5jX3ZhbHVlOworCQkgIGlmIChjcy0+Y19zY2xhc3MgPT0gQ19FWFQgfHwgY3MtPmNfc2NsYXNzID09IENfVEhVTUJFWFRGVU5DCisJCSAgICAgIHx8IGNzLT5jX3NjbGFzcyA9PSBDX1RIVU1CRVhUKQorCQkgICAgdG1wYWRkciArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBzZWMpOworCisJCSAgc3dpdGNoIChzZWMpCisJCSAgICB7CisJCSAgICBjYXNlIFNFQ1RfT0ZGX1RFWFQ6CisJCSAgICBjYXNlIFNFQ1RfT0ZGX1JPREFUQToKKwkJICAgICAgbXNfdHlwZSA9CisJCQljcy0+Y19zY2xhc3MgPT0gQ19FWFQgfHwgY3MtPmNfc2NsYXNzID09IENfVEhVTUJFWFRGVU5DCisJCQkJCXx8IGNzLT5jX3NjbGFzcyA9PSBDX1RIVU1CRVhUID8KKwkJCQkJICBtc3RfdGV4dCA6IG1zdF9maWxlX3RleHQ7CisjaWZkZWYgU01BU0hfVEVYVF9BRERSRVNTCisJCSAgICAgIGlmICh0bXBhZGRyICYgMSkJLyogRklYTUU6IGRlbGV0ZSB0aGlzIGxpbmUgKi8KKwkJCVNNQVNIX1RFWFRfQUREUkVTUyAodG1wYWRkcik7CisjZW5kaWYKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIFNFQ1RfT0ZGX0RBVEE6CisJCSAgICAgIG1zX3R5cGUgPQorCQkJY3MtPmNfc2NsYXNzID09IENfRVhUIHx8IGNzLT5jX3NjbGFzcyA9PSBDX1RIVU1CRVhUID8KKwkJCSAgbXN0X2RhdGEgOiBtc3RfZmlsZV9kYXRhOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgU0VDVF9PRkZfQlNTOgorCQkgICAgICBtc190eXBlID0KKwkJCWNzLT5jX3NjbGFzcyA9PSBDX0VYVCB8fCBjcy0+Y19zY2xhc3MgPT0gQ19USFVNQkVYVCA/CisJCQkgIG1zdF9kYXRhIDogbXN0X2ZpbGVfZGF0YTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBkZWZhdWx0OgorCQkgICAgICBtc190eXBlID0gbXN0X3Vua25vd247CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisKKwkgICAgICBpZiAoY3MtPmNfbmFtZVswXSAhPSAnQCcgLyogU2tpcCB0ZGVzYyBzeW1ib2xzICovKQorCQl7CisJCSAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltOworCisJCSAgbXN5bSA9IHByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9sX2FuZF9pbmZvCisJCSAgKGNzLT5jX25hbWUsIHRtcGFkZHIsIG1zX3R5cGUsIChjaGFyICopY3MtPmNfc2NsYXNzLCBzZWMsCisJCSAgIE5VTEwsIG9iamZpbGUpOworI2lmZGVmIENPRkZfTUFLRV9NU1lNQk9MX1NQRUNJQUwKKwkJICBpZihtc3ltKQorCQkgICAgQ09GRl9NQUtFX01TWU1CT0xfU1BFQ0lBTChjcy0+Y19zY2xhc3MsIG1zeW0pOwkJCisjZW5kaWYKKwkJfQorCSAgICAgIGlmIChTREJfVFlQRSAoY3MtPmNfdHlwZSkpCisJCXsKKwkJICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisJCSAgc3ltID0gcHJvY2Vzc19jb2ZmX3N5bWJvbAorCQkgICAgKGNzLCAmbWFpbl9hdXgsIHNlY3Rpb25fb2Zmc2V0cywgb2JqZmlsZSk7CisJCSAgU1lNQk9MX1ZBTFVFIChzeW0pID0gdG1wYWRkcjsKKwkJICBTWU1CT0xfU0VDVElPTiAoc3ltKSA9IHNlYzsKKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworCisJICBjYXNlIENfRkNOOgorCSAgICBpZiAoU1RSRVEgKGNzLT5jX25hbWUsICIuYmYiKSkKKwkgICAgICB7CisJCXdpdGhpbl9mdW5jdGlvbiA9IDE7CisKKwkJLyogdmFsdWUgY29udGFpbnMgYWRkcmVzcyBvZiBmaXJzdCBub24taW5pdCB0eXBlIGNvZGUgKi8KKwkJLyogbWFpbl9hdXgueF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8KKwkJCSAgICBjb250YWlucyBsaW5lIG51bWJlciBvZiAneycgfSAqLworCQlpZiAoY3MtPmNfbmF1eCAhPSAxKQorCQkgIGNvbXBsYWluICgmYmZfbm9fYXV4X2NvbXBsYWludCwgY3MtPmNfc3ltbnVtKTsKKwkJZmNuX2ZpcnN0X2xpbmUgPSBtYWluX2F1eC54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubzsKKworCQkvKiBNaWdodCB3YW50IHRvIGNoZWNrIHRoYXQgbG9jYWxzIGFyZSAwIGFuZAorCQkgICBjb250ZXh0X3N0YWNrX2RlcHRoIGlzIHplcm8sIGFuZCBjb21wbGFpbiBpZiBub3QuICAqLworCisJCWRlcHRoID0gMDsKKwkJbmV3ID0gcHVzaF9jb250ZXh0IChkZXB0aCwgZmNuX3N0YXJ0X2FkZHIpOworCQlmY25fY3Nfc2F2ZWQuY19uYW1lID0gZ2V0c3ltbmFtZSAoJmZjbl9zeW1fc2F2ZWQpOworCQluZXctPm5hbWUgPQorCQkgIHByb2Nlc3NfY29mZl9zeW1ib2wgKCZmY25fY3Nfc2F2ZWQsICZmY25fYXV4X3NhdmVkLAorCQkJCSAgICAgICBzZWN0aW9uX29mZnNldHMsIG9iamZpbGUpOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoU1RSRVEgKGNzLT5jX25hbWUsICIuZWYiKSkKKwkgICAgICB7CisJCS8qIHRoZSB2YWx1ZSBvZiAuZWYgaXMgdGhlIGFkZHJlc3Mgb2YgZXBpbG9ndWUgY29kZTsKKwkJICAgbm90IHVzZWZ1bCBmb3IgZ2RiLiAgKi8KKwkJLyogeyBtYWluX2F1eC54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubworCQkJICAgIGNvbnRhaW5zIG51bWJlciBvZiBsaW5lcyB0byAnfScgKi8KKworCQlpZiAoY29udGV4dF9zdGFja19kZXB0aCA8PSAwKQorCQkgIHsJCS8qIFdlIGF0dGVtcHRlZCB0byBwb3AgYW4gZW1wdHkgY29udGV4dCBzdGFjayAqLworCQkgICAgY29tcGxhaW4gKCZlZl9zdGFja19jb21wbGFpbnQsIGNzLT5jX3N5bW51bSk7CisJCSAgICB3aXRoaW5fZnVuY3Rpb24gPSAwOworCQkgICAgYnJlYWs7CisJCSAgfQorCisJCW5ldyA9IHBvcF9jb250ZXh0ICgpOworCQkvKiBTdGFjayBtdXN0IGJlIGVtcHR5IG5vdy4gICovCisJCWlmIChjb250ZXh0X3N0YWNrX2RlcHRoID4gMCB8fCBuZXcgPT0gTlVMTCkKKwkJICB7CisJCSAgICBjb21wbGFpbiAoJmVmX2NvbXBsYWludCwgY3MtPmNfc3ltbnVtKTsKKwkJICAgIHdpdGhpbl9mdW5jdGlvbiA9IDA7CisJCSAgICBicmVhazsKKwkJICB9CisJCWlmIChjcy0+Y19uYXV4ICE9IDEpCisJCSAgeworCQkgICAgY29tcGxhaW4gKCZlZl9ub19hdXhfY29tcGxhaW50LCBjcy0+Y19zeW1udW0pOworCQkgICAgZmNuX2xhc3RfbGluZSA9IDB4N0ZGRkZGRkY7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgZmNuX2xhc3RfbGluZSA9IG1haW5fYXV4Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vOworCQkgIH0KKwkJZW50ZXJfbGluZW5vcyAoZmNuX2xpbmVfcHRyLCBmY25fZmlyc3RfbGluZSwgZmNuX2xhc3RfbGluZSwKKwkJCSAgICAgICBzZWN0aW9uX29mZnNldHMpOworCisJCWZpbmlzaF9ibG9jayAobmV3LT5uYW1lLCAmbG9jYWxfc3ltYm9scywgbmV3LT5vbGRfYmxvY2tzLAorCQkJICAgICAgbmV3LT5zdGFydF9hZGRyLAorI2lmIGRlZmluZWQgKEZVTkNUSU9OX0VQSUxPR1VFX1NJWkUpCisJCQkgICAgICAvKiBUaGlzIG1hY3JvIHNob3VsZCBiZSBkZWZpbmVkIG9ubHkgb24KKwkJCQkgbWFjaGluZXMgd2hlcmUgdGhlCisJCQkJIGZjbl9hdXhfc2F2ZWQueF9zeW0ueF9taXNjLnhfZnNpemUKKwkJCQkgZmllbGQgaXMgYWx3YXlzIHplcm8uCisJCQkJIFNvIHVzZSB0aGUgLmJmIHJlY29yZCBpbmZvcm1hdGlvbiB0aGF0CisJCQkJIHBvaW50cyB0byB0aGUgZXBpbG9ndWUgYW5kIGFkZCB0aGUgc2l6ZQorCQkJCSBvZiB0aGUgZXBpbG9ndWUuICAqLworCQkJICAgICAgY3MtPmNfdmFsdWUKKwkJCSAgICAgICsgRlVOQ1RJT05fRVBJTE9HVUVfU0laRQorCQkJICAgICAgKyBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKSwKKyNlbHNlCisJCQkgICAgICBmY25fY3Nfc2F2ZWQuY192YWx1ZQorCQkJICAgICAgKyBmY25fYXV4X3NhdmVkLnhfc3ltLnhfbWlzYy54X2ZzaXplCisJCQkgICAgICArIEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpLAorI2VuZGlmCisJCQkgICAgICBvYmpmaWxlCisJCQkgICAgICApOworCQl3aXRoaW5fZnVuY3Rpb24gPSAwOworCSAgICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgQ19CTE9DSzoKKwkgICAgaWYgKFNUUkVRIChjcy0+Y19uYW1lLCAiLmJiIikpCisJICAgICAgeworCQl0bXBhZGRyID0gY3MtPmNfdmFsdWU7CisJCXRtcGFkZHIgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCk7CisJCXB1c2hfY29udGV4dCAoKytkZXB0aCwgdG1wYWRkcik7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChTVFJFUSAoY3MtPmNfbmFtZSwgIi5lYiIpKQorCSAgICAgIHsKKwkJaWYgKGNvbnRleHRfc3RhY2tfZGVwdGggPD0gMCkKKwkJICB7CQkvKiBXZSBhdHRlbXB0ZWQgdG8gcG9wIGFuIGVtcHR5IGNvbnRleHQgc3RhY2sgKi8KKwkJICAgIGNvbXBsYWluICgmZWJfc3RhY2tfY29tcGxhaW50LCBjcy0+Y19zeW1udW0pOworCQkgICAgYnJlYWs7CisJCSAgfQorCisJCW5ldyA9IHBvcF9jb250ZXh0ICgpOworCQlpZiAoZGVwdGgtLSAhPSBuZXctPmRlcHRoKQorCQkgIHsKKwkJICAgIGNvbXBsYWluICgmZWJfY29tcGxhaW50LCBzeW1udW0pOworCQkgICAgYnJlYWs7CisJCSAgfQorCQlpZiAobG9jYWxfc3ltYm9scyAmJiBjb250ZXh0X3N0YWNrX2RlcHRoID4gMCkKKwkJICB7CisJCSAgICB0bXBhZGRyID0KKwkJICAgICAgY3MtPmNfdmFsdWUgKyBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKTsKKwkJICAgIC8qIE1ha2UgYSBibG9jayBmb3IgdGhlIGxvY2FsIHN5bWJvbHMgd2l0aGluLiAgKi8KKwkJICAgIGZpbmlzaF9ibG9jayAoMCwgJmxvY2FsX3N5bWJvbHMsIG5ldy0+b2xkX2Jsb2NrcywKKwkJCQkgIG5ldy0+c3RhcnRfYWRkciwgdG1wYWRkciwgb2JqZmlsZSk7CisJCSAgfQorCQkvKiBOb3cgcG9wIGxvY2FscyBvZiBibG9jayBqdXN0IGZpbmlzaGVkLiAgKi8KKwkJbG9jYWxfc3ltYm9scyA9IG5ldy0+bG9jYWxzOworCSAgICAgIH0KKwkgICAgYnJlYWs7CisKKwkgIGRlZmF1bHQ6CisJICAgIHByb2Nlc3NfY29mZl9zeW1ib2wgKGNzLCAmbWFpbl9hdXgsIHNlY3Rpb25fb2Zmc2V0cywgb2JqZmlsZSk7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKGxhc3Rfc291cmNlX2ZpbGUpCisgICAgY29mZl9lbmRfc3ltdGFiIChvYmpmaWxlKTsKKworICAvKiBQYXRjaCB1cCBhbnkgb3BhcXVlIHR5cGVzIChyZWZlcmVuY2VzIHRvIHR5cGVzIHRoYXQgYXJlIG5vdCBkZWZpbmVkCisgICAgIGluIHRoZSBmaWxlIHdoZXJlIHRoZXkgYXJlIHJlZmVyZW5jZWQsIGUuZy4gInN0cnVjdCBmb28gKmJhciIpLiAgKi8KKyAgQUxMX09CSkZJTEVfU1lNVEFCUyAob2JqZmlsZSwgcykKKyAgICBwYXRjaF9vcGFxdWVfdHlwZXMgKHMpOworCisgIGN1cnJlbnRfb2JqZmlsZSA9IE5VTEw7Cit9CisMCisvKiBSb3V0aW5lcyBmb3IgcmVhZGluZyBoZWFkZXJzIGFuZCBzeW1ib2xzIGZyb20gZXhlY3V0YWJsZS4gICovCisKKy8qIFJlYWQgdGhlIG5leHQgc3ltYm9sLCBzd2FwIGl0LCBhbmQgcmV0dXJuIGl0IGluIGJvdGggaW50ZXJuYWxfc3ltZW50CisgICBmb3JtLCBhbmQgY29mZl9zeW1ib2wgZm9ybS4gIEFsc28gcmV0dXJuIGl0cyBmaXJzdCBhdXhlbnQsIGlmIGFueSwKKyAgIGluIGludGVybmFsX2F1eGVudCBmb3JtLCBhbmQgc2tpcCBhbnkgb3RoZXIgYXV4ZW50cy4gICovCisKK3N0YXRpYyB2b2lkCityZWFkX29uZV9zeW0gKGNzLCBzeW0sIGF1eCkKKyAgICByZWdpc3RlciBzdHJ1Y3QgY29mZl9zeW1ib2wgKmNzOworICAgIHJlZ2lzdGVyIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKKyAgICByZWdpc3RlciB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eDsKK3sKKyAgaW50IGk7CisKKyAgY3MtPmNfc3ltbnVtID0gc3ltbnVtOworICBiZmRfcmVhZCAodGVtcF9zeW0sIGxvY2FsX3N5bWVzeiwgMSwgbmxpc3RfYmZkX2dsb2JhbCk7CisgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChzeW1maWxlX2JmZCwgdGVtcF9zeW0sIChjaGFyICopc3ltKTsKKyAgY3MtPmNfbmF1eCA9IHN5bS0+bl9udW1hdXggJiAweGZmOworICBpZiAoY3MtPmNfbmF1eCA+PSAxKQorICAgIHsKKyAgICBiZmRfcmVhZCAodGVtcF9hdXgsIGxvY2FsX2F1eGVzeiwgMSwgbmxpc3RfYmZkX2dsb2JhbCk7CisgICAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKHN5bWZpbGVfYmZkLCB0ZW1wX2F1eCwgc3ltLT5uX3R5cGUsIHN5bS0+bl9zY2xhc3MsCisJCQkgIDAsIGNzLT5jX25hdXgsIChjaGFyICopYXV4KTsKKyAgICAvKiBJZiBtb3JlIHRoYW4gb25lIGF1eCBlbnRyeSwgcmVhZCBwYXN0IGl0IChvbmx5IHRoZSBmaXJzdCBhdXgKKyAgICAgICBpcyBpbXBvcnRhbnQpLiAqLworICAgIGZvciAoaSA9IDE7IGkgPCBjcy0+Y19uYXV4OyBpKyspCisgICAgICBiZmRfcmVhZCAodGVtcF9hdXgsIGxvY2FsX2F1eGVzeiwgMSwgbmxpc3RfYmZkX2dsb2JhbCk7CisgICAgfQorICBjcy0+Y19uYW1lID0gZ2V0c3ltbmFtZSAoc3ltKTsKKyAgY3MtPmNfdmFsdWUgPSBzeW0tPm5fdmFsdWU7CisgIGNzLT5jX3NjbGFzcyA9IChzeW0tPm5fc2NsYXNzICYgMHhmZik7CisgIGNzLT5jX3NlY251bSA9IHN5bS0+bl9zY251bTsKKyAgY3MtPmNfdHlwZSA9ICh1bnNpZ25lZCkgc3ltLT5uX3R5cGU7CisgIGlmICghU0RCX1RZUEUgKGNzLT5jX3R5cGUpKQorICAgIGNzLT5jX3R5cGUgPSAwOworCisjaWYgMAorICBpZiAoY3MtPmNfc2NsYXNzICYgMTI4KQorICAgIHByaW50ZigidGh1bWIgc3ltYm9sICVzLCBjbGFzcyAweCV4XG4iLCBjcy0+Y19uYW1lLCBjcy0+Y19zY2xhc3MpOworI2VuZGlmCisKKyAgc3ltbnVtICs9IDEgKyBjcy0+Y19uYXV4OworCisgIC8qIFRoZSBQRSBmaWxlIGZvcm1hdCBzdG9yZXMgc3ltYm9sIHZhbHVlcyBhcyBvZmZzZXRzIHdpdGhpbiB0aGUKKyAgICAgc2VjdGlvbiwgcmF0aGVyIHRoYW4gYXMgYWJzb2x1dGUgYWRkcmVzc2VzLiAgV2UgY29ycmVjdCB0aGF0CisgICAgIGhlcmUsIGlmIHRoZSBzeW1ib2wgaGFzIGFuIGFwcHJvcHJpYXRlIHN0b3JhZ2UgY2xhc3MuICBGSVhNRTogV2UKKyAgICAgc2hvdWxkIHVzZSBCRkQgdG8gcmVhZCB0aGUgc3ltYm9scywgcmF0aGVyIHRoYW4gZHVwbGljYXRpbmcgdGhlCisgICAgIHdvcmsgaGVyZS4gICovCisgIGlmIChwZV9maWxlKQorICAgIHsKKyAgICAgIHN3aXRjaCAoY3MtPmNfc2NsYXNzKQorCXsKKwljYXNlIENfRVhUOgorCWNhc2UgQ19USFVNQkVYVDoKKwljYXNlIENfVEhVTUJFWFRGVU5DOgorCWNhc2UgQ19TRUNUSU9OOgorCWNhc2UgQ19OVF9XRUFLOgorCWNhc2UgQ19TVEFUOgorCWNhc2UgQ19USFVNQlNUQVQ6CisJY2FzZSBDX1RIVU1CU1RBVEZVTkM6CisJY2FzZSBDX0xBQkVMOgorCWNhc2UgQ19USFVNQkxBQkVMOgorCWNhc2UgQ19CTE9DSzoKKwljYXNlIENfRkNOOgorCWNhc2UgQ19FRkNOOgorCSAgaWYgKGNzLT5jX3NlY251bSAhPSAwKQorCSAgICBjcy0+Y192YWx1ZSArPSBjc19zZWN0aW9uX2FkZHJlc3MgKGNzLCBzeW1maWxlX2JmZCk7CisJICBicmVhazsKKwl9CisgICAgfQorfQorDAorLyogU3VwcG9ydCBmb3Igc3RyaW5nIHRhYmxlIGhhbmRsaW5nICovCisKK3N0YXRpYyBjaGFyICpzdHJpbmd0YWIgPSBOVUxMOworCitzdGF0aWMgaW50Citpbml0X3N0cmluZ3RhYiAoYWJmZCwgb2Zmc2V0KQorICAgIGJmZCAqYWJmZDsKKyAgICBsb25nIG9mZnNldDsKK3sKKyAgbG9uZyBsZW5ndGg7CisgIGludCB2YWw7CisgIHVuc2lnbmVkIGNoYXIgbGVuZ3RoYnVmWzRdOworCisgIGZyZWVfc3RyaW5ndGFiICgpOworCisgIC8qIElmIHRoZSBmaWxlIGlzIHN0cmlwcGVkLCB0aGUgb2Zmc2V0IG1pZ2h0IGJlIHplcm8sIGluZGljYXRpbmcgbm8KKyAgICAgc3RyaW5nIHRhYmxlLiAgSnVzdCByZXR1cm4gd2l0aCBgc3RyaW5ndGFiJyBzZXQgdG8gbnVsbC4gKi8KKyAgaWYgKG9mZnNldCA9PSAwKQorICAgIHJldHVybiAwOworCisgIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCAwKSA8IDApCisgICAgcmV0dXJuIC0xOworCisgIHZhbCA9IGJmZF9yZWFkICgoY2hhciAqKWxlbmd0aGJ1Ziwgc2l6ZW9mIGxlbmd0aGJ1ZiwgMSwgYWJmZCk7CisgIGxlbmd0aCA9IGJmZF9oX2dldF8zMiAoc3ltZmlsZV9iZmQsIGxlbmd0aGJ1Zik7CisgICAgICAgCisgIC8qIElmIG5vIHN0cmluZyB0YWJsZSBpcyBuZWVkZWQsIHRoZW4gdGhlIGZpbGUgbWF5IGVuZCBpbW1lZGlhdGVseQorICAgICBhZnRlciB0aGUgc3ltYm9scy4gIEp1c3QgcmV0dXJuIHdpdGggYHN0cmluZ3RhYicgc2V0IHRvIG51bGwuICovCisgIGlmICh2YWwgIT0gc2l6ZW9mIGxlbmd0aGJ1ZiB8fCBsZW5ndGggPCBzaXplb2YgbGVuZ3RoYnVmKQorICAgIHJldHVybiAwOworCisgIHN0cmluZ3RhYiA9IChjaGFyICopIHhtYWxsb2MgKGxlbmd0aCk7CisgIC8qIFRoaXMgaXMgaW4gdGFyZ2V0IGZvcm1hdCAocHJvYmFibHkgbm90IHZlcnkgdXNlZnVsLCBhbmQgbm90IGN1cnJlbnRseQorICAgICB1c2VkKSwgbm90IGhvc3QgZm9ybWF0LiAgKi8KKyAgbWVtY3B5IChzdHJpbmd0YWIsIGxlbmd0aGJ1Ziwgc2l6ZW9mIGxlbmd0aGJ1Zik7CisgIGlmIChsZW5ndGggPT0gc2l6ZW9mIGxlbmd0aCkJCS8qIEVtcHR5IHRhYmxlIC0tIGp1c3QgdGhlIGNvdW50ICovCisgICAgcmV0dXJuIDA7CisKKyAgdmFsID0gYmZkX3JlYWQgKHN0cmluZ3RhYiArIHNpemVvZiBsZW5ndGhidWYsIGxlbmd0aCAtIHNpemVvZiBsZW5ndGhidWYsIDEsIGFiZmQpOworICBpZiAodmFsICE9IGxlbmd0aCAtIHNpemVvZiBsZW5ndGhidWYgfHwgc3RyaW5ndGFiW2xlbmd0aCAtIDFdICE9ICdcMCcpCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9zdHJpbmd0YWIgKCkKK3sKKyAgaWYgKHN0cmluZ3RhYikKKyAgICBmcmVlIChzdHJpbmd0YWIpOworICBzdHJpbmd0YWIgPSBOVUxMOworfQorCitzdGF0aWMgY2hhciAqCitnZXRzeW1uYW1lIChzeW1ib2xfZW50cnkpCisgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltYm9sX2VudHJ5OworeworICBzdGF0aWMgY2hhciBidWZmZXJbU1lNTk1MRU4rMV07CisgIGNoYXIgKnJlc3VsdDsKKworICBpZiAoc3ltYm9sX2VudHJ5LT5fbi5fbl9uLl9uX3plcm9lcyA9PSAwKQorICAgIHsKKyAgICAgIC8qIEZJWE1FOiBQcm9iYWJseSBzaG91bGQgYmUgZGV0ZWN0aW5nIGNvcnJ1cHQgc3ltYm9sIGZpbGVzIGJ5CisJIHNlZWluZyB3aGV0aGVyIG9mZnNldCBwb2ludHMgdG8gd2l0aGluIHRoZSBzdHJpbmd0YWIuICAqLworICAgICAgcmVzdWx0ID0gc3RyaW5ndGFiICsgc3ltYm9sX2VudHJ5LT5fbi5fbl9uLl9uX29mZnNldDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdHJuY3B5IChidWZmZXIsIHN5bWJvbF9lbnRyeS0+X24uX25fbmFtZSwgU1lNTk1MRU4pOworICAgICAgYnVmZmVyW1NZTU5NTEVOXSA9ICdcMCc7CisgICAgICByZXN1bHQgPSBidWZmZXI7CisgICAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKiBFeHRyYWN0IHRoZSBmaWxlIG5hbWUgZnJvbSB0aGUgYXV4IGVudHJ5IG9mIGEgQ19GSUxFIHN5bWJvbC4gIFJldHVybgorICAgb25seSB0aGUgbGFzdCBjb21wb25lbnQgb2YgdGhlIG5hbWUuICBSZXN1bHQgaXMgaW4gc3RhdGljIHN0b3JhZ2UgYW5kCisgICBpcyBvbmx5IGdvb2QgZm9yIHRlbXBvcmFyeSB1c2UuICAqLworCitzdGF0aWMgY2hhciAqCitjb2ZmX2dldGZpbGVuYW1lIChhdXhfZW50cnkpCisgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXhfZW50cnk7Cit7CisgIHN0YXRpYyBjaGFyIGJ1ZmZlcltCVUZTSVpdOworICByZWdpc3RlciBjaGFyICp0ZW1wOworICBjaGFyICpyZXN1bHQ7CisKKyAgaWYgKGF1eF9lbnRyeS0+eF9maWxlLnhfbi54X3plcm9lcyA9PSAwKQorICAgIHN0cmNweSAoYnVmZmVyLCBzdHJpbmd0YWIgKyBhdXhfZW50cnktPnhfZmlsZS54X24ueF9vZmZzZXQpOworICBlbHNlCisgICAgeworICAgICAgc3RybmNweSAoYnVmZmVyLCBhdXhfZW50cnktPnhfZmlsZS54X2ZuYW1lLCBGSUxOTUxFTik7CisgICAgICBidWZmZXJbRklMTk1MRU5dID0gJ1wwJzsKKyAgICB9CisgIHJlc3VsdCA9IGJ1ZmZlcjsKKworICAvKiBGSVhNRTogV2Ugc2hvdWxkIG5vdCBiZSB0aHJvd2luZyBhd2F5IHRoZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0CisgICAgIGRpcmVjdG9yeS4gIEl0IHNob3VsZCBnbyBpbnRvIGRpcm5hbWUgb2YgdGhlIHN5bXRhYiwgb3Igc29tZSBzdWNoCisgICAgIHBsYWNlLiAgKi8KKyAgaWYgKCh0ZW1wID0gc3RycmNociAocmVzdWx0LCAnLycpKSAhPSBOVUxMKQorICAgIHJlc3VsdCA9IHRlbXAgKyAxOworICByZXR1cm4gKHJlc3VsdCk7Cit9CisMCisvKiBTdXBwb3J0IGZvciBsaW5lIG51bWJlciBoYW5kbGluZy4gICovCisKK3N0YXRpYyBjaGFyICpsaW5ldGFiID0gTlVMTDsKK3N0YXRpYyBsb25nIGxpbmV0YWJfb2Zmc2V0Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgbGluZXRhYl9zaXplOworCisvKiBSZWFkIGluIGFsbCB0aGUgbGluZSBudW1iZXJzIGZvciBmYXN0IGxvb2t1cHMgbGF0ZXIuICBMZWF2ZSB0aGVtIGluCisgICBleHRlcm5hbCAodW5zd2FwcGVkKSBmb3JtYXQgaW4gbWVtb3J5OyB3ZSdsbCBzd2FwIHRoZW0gYXMgd2UgZW50ZXIKKyAgIHRoZW0gaW50byBHREIncyBkYXRhIHN0cnVjdHVyZXMuICAqLworIAorc3RhdGljIGludAoraW5pdF9saW5lbm8gKGFiZmQsIG9mZnNldCwgc2l6ZSkKKyAgICBiZmQgKmFiZmQ7CisgICAgbG9uZyBvZmZzZXQ7CisgICAgaW50IHNpemU7Cit7CisgIGludCB2YWw7CisKKyAgbGluZXRhYl9vZmZzZXQgPSBvZmZzZXQ7CisgIGxpbmV0YWJfc2l6ZSA9IHNpemU7CisKKyAgZnJlZV9saW5ldGFiKCk7CisKKyAgaWYgKHNpemUgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgMCkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgCisgIC8qIEFsbG9jYXRlIHRoZSBkZXNpcmVkIHRhYmxlLCBwbHVzIGEgc2VudGluZWwgKi8KKyAgbGluZXRhYiA9IChjaGFyICopIHhtYWxsb2MgKHNpemUgKyBsb2NhbF9saW5lc3opOworCisgIHZhbCA9IGJmZF9yZWFkIChsaW5ldGFiLCBzaXplLCAxLCBhYmZkKTsKKyAgaWYgKHZhbCAhPSBzaXplKQorICAgIHJldHVybiAtMTsKKworICAvKiBUZXJtaW5hdGUgaXQgd2l0aCBhbiBhbGwtemVybyBzZW50aW5lbCByZWNvcmQgKi8KKyAgbWVtc2V0IChsaW5ldGFiICsgc2l6ZSwgMCwgbG9jYWxfbGluZXN6KTsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfbGluZXRhYiAoKQoreworICBpZiAobGluZXRhYikKKyAgICBmcmVlIChsaW5ldGFiKTsKKyAgbGluZXRhYiA9IE5VTEw7Cit9CisKKyNpZiAhZGVmaW5lZCAoTF9MTk5PMzIpCisjZGVmaW5lIExfTE5OTzMyKGxwKSAoKGxwKS0+bF9sbm5vKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitlbnRlcl9saW5lbm9zIChmaWxlX29mZnNldCwgZmlyc3RfbGluZSwgbGFzdF9saW5lLCBzZWN0aW9uX29mZnNldHMpCisgICAgIGxvbmcgZmlsZV9vZmZzZXQ7CisgICAgIHJlZ2lzdGVyIGludCBmaXJzdF9saW5lOworICAgICByZWdpc3RlciBpbnQgbGFzdF9saW5lOworICAgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHM7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKnJhd3B0cjsKKyAgc3RydWN0IGludGVybmFsX2xpbmVubyBscHRyOworCisgIGlmICghbGluZXRhYikKKyAgICByZXR1cm4gOworICBpZiAoZmlsZV9vZmZzZXQgPCBsaW5ldGFiX29mZnNldCkKKyAgICB7CisgICAgICBjb21wbGFpbiAoJmxpbmVub19jb21wbGFpbnQsIGZpbGVfb2Zmc2V0KTsKKyAgICAgIGlmIChmaWxlX29mZnNldCA+IGxpbmV0YWJfc2l6ZSkJLyogVG9vIGJpZyB0byBiZSBhbiBvZmZzZXQ/ICovCisJcmV0dXJuOworICAgICAgZmlsZV9vZmZzZXQgKz0gbGluZXRhYl9vZmZzZXQ7ICAvKiBUcnkgcmVhZGluZyBhdCB0aGF0IGxpbmV0YWIgb2Zmc2V0ICovCisgICAgfQorICAKKyAgcmF3cHRyID0gJmxpbmV0YWJbZmlsZV9vZmZzZXQgLSBsaW5ldGFiX29mZnNldF07CisKKyAgLyogc2tpcCBmaXJzdCBsaW5lIGVudHJ5IGZvciBlYWNoIGZ1bmN0aW9uICovCisgIHJhd3B0ciArPSBsb2NhbF9saW5lc3o7CisgIC8qIGxpbmUgbnVtYmVycyBzdGFydCBhdCBvbmUgZm9yIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBmdW5jdGlvbiAqLworICBmaXJzdF9saW5lLS07CisKKyAgZm9yICg7OykgeworICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luIChzeW1maWxlX2JmZCwgcmF3cHRyLCAmbHB0cik7CisgICAgcmF3cHRyICs9IGxvY2FsX2xpbmVzejsKKyAgICAvKiBUaGUgbmV4dCBmdW5jdGlvbiwgb3IgdGhlIHNlbnRpbmVsLCB3aWxsIGhhdmUgTF9MTk5PMzIgemVybzsgd2UgZXhpdC4gKi8KKyAgICBpZiAoTF9MTk5PMzIgKCZscHRyKSAmJiBMX0xOTk8zMiAoJmxwdHIpIDw9IGxhc3RfbGluZSkKKyAgICAgIGNvZmZfcmVjb3JkX2xpbmUgKGZpcnN0X2xpbmUgKyBMX0xOTk8zMiAoJmxwdHIpLAorCQkJbHB0ci5sX2FkZHIubF9wYWRkcgorCQkJKyBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKSk7CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0gCit9CisMCitzdGF0aWMgdm9pZAorcGF0Y2hfdHlwZSAodHlwZSwgcmVhbF90eXBlKQorICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgIHN0cnVjdCB0eXBlICpyZWFsX3R5cGU7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCB0eXBlICp0YXJnZXQgPSBUWVBFX1RBUkdFVF9UWVBFICh0eXBlKTsKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKnJlYWxfdGFyZ2V0ID0gVFlQRV9UQVJHRVRfVFlQRSAocmVhbF90eXBlKTsKKyAgaW50IGZpZWxkX3NpemUgPSBUWVBFX05GSUVMRFMgKHJlYWxfdGFyZ2V0KSAqIHNpemVvZiAoc3RydWN0IGZpZWxkKTsKKworICBUWVBFX0xFTkdUSCAodGFyZ2V0KSA9IFRZUEVfTEVOR1RIIChyZWFsX3RhcmdldCk7CisgIFRZUEVfTkZJRUxEUyAodGFyZ2V0KSA9IFRZUEVfTkZJRUxEUyAocmVhbF90YXJnZXQpOworICBUWVBFX0ZJRUxEUyAodGFyZ2V0KSA9IChzdHJ1Y3QgZmllbGQgKikgVFlQRV9BTExPQyAodGFyZ2V0LCBmaWVsZF9zaXplKTsKKworICBtZW1jcHkgKFRZUEVfRklFTERTICh0YXJnZXQpLCBUWVBFX0ZJRUxEUyAocmVhbF90YXJnZXQpLCBmaWVsZF9zaXplKTsKKworICBpZiAoVFlQRV9OQU1FIChyZWFsX3RhcmdldCkpCisgICAgeworICAgICAgaWYgKFRZUEVfTkFNRSAodGFyZ2V0KSkKKwlmcmVlIChUWVBFX05BTUUgKHRhcmdldCkpOworICAgICAgVFlQRV9OQU1FICh0YXJnZXQpID0gY29uY2F0IChUWVBFX05BTUUgKHJlYWxfdGFyZ2V0KSwgTlVMTCk7CisgICAgfQorfQorCisvKiBQYXRjaCB1cCBhbGwgYXBwcm9wcmlhdGUgdHlwZWRlZiBzeW1ib2xzIGluIHRoZSBvcGFxdWVfdHlwZV9jaGFpbnMKKyAgIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCB0byBwcmludCBvdXQgb3BhcXVlIGRhdGEgc3RydWN0dXJlcyBwcm9wZXJseS4gICovCisKK3N0YXRpYyB2b2lkCitwYXRjaF9vcGFxdWVfdHlwZXMgKHMpCisgICAgIHN0cnVjdCBzeW10YWIgKnM7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBibG9jayAqYjsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzeW1ib2wgKnJlYWxfc3ltOworICAKKyAgLyogR28gdGhyb3VnaCB0aGUgcGVyLWZpbGUgc3ltYm9scyBvbmx5ICovCisgIGIgPSBCTE9DS1ZFQ1RPUl9CTE9DSyAoQkxPQ0tWRUNUT1IgKHMpLCBTVEFUSUNfQkxPQ0spOworICBmb3IgKGkgPSBCTE9DS19OU1lNUyAoYikgLSAxOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICAvKiBGaW5kIGNvbXBsZXRlZCB0eXBlZGVmcyB0byB1c2UgdG8gZml4IG9wYXF1ZSBvbmVzLgorCSBSZW1vdmUgc3ltcyBmcm9tIHRoZSBjaGFpbiB3aGVuIHRoZWlyIHR5cGVzIGFyZSBzdG9yZWQsCisJIGJ1dCBzZWFyY2ggdGhlIHdob2xlIGNoYWluLCBhcyB0aGVyZSBtYXkgYmUgc2V2ZXJhbCBzeW1zCisJIGZyb20gZGlmZmVyZW50IGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZS4gICovCisgICAgICByZWFsX3N5bSA9IEJMT0NLX1NZTSAoYiwgaSk7CisgICAgICBpZiAoU1lNQk9MX0NMQVNTIChyZWFsX3N5bSkgPT0gTE9DX1RZUEVERUYgJiYKKwkgIFNZTUJPTF9OQU1FU1BBQ0UgKHJlYWxfc3ltKSA9PSBWQVJfTkFNRVNQQUNFICYmCisJICBUWVBFX0NPREUgKFNZTUJPTF9UWVBFIChyZWFsX3N5bSkpID09IFRZUEVfQ09ERV9QVFIgJiYKKwkgIFRZUEVfTEVOR1RIIChUWVBFX1RBUkdFVF9UWVBFIChTWU1CT0xfVFlQRSAocmVhbF9zeW0pKSkgIT0gMCkKKwl7CisJICByZWdpc3RlciBjaGFyICpuYW1lID0gU1lNQk9MX05BTUUgKHJlYWxfc3ltKTsKKwkgIHJlZ2lzdGVyIGludCBoYXNoID0gaGFzaG5hbWUgKG5hbWUpOworCSAgcmVnaXN0ZXIgc3RydWN0IHN5bWJvbCAqc3ltLCAqcHJldjsKKwkgIAorCSAgcHJldiA9IDA7CisJICBmb3IgKHN5bSA9IG9wYXF1ZV90eXBlX2NoYWluW2hhc2hdOyBzeW07KQorCSAgICB7CisJICAgICAgaWYgKG5hbWVbMF0gPT0gU1lNQk9MX05BTUUgKHN5bSlbMF0gJiYKKwkJICBTVFJFUSAobmFtZSArIDEsIFNZTUJPTF9OQU1FIChzeW0pICsgMSkpCisJCXsKKwkJICBpZiAocHJldikKKwkJICAgIHsKKwkJICAgICAgU1lNQk9MX1ZBTFVFX0NIQUlOIChwcmV2KSA9IFNZTUJPTF9WQUxVRV9DSEFJTiAoc3ltKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIG9wYXF1ZV90eXBlX2NoYWluW2hhc2hdID0gU1lNQk9MX1ZBTFVFX0NIQUlOIChzeW0pOworCQkgICAgfQorCQkgIAorCQkgIHBhdGNoX3R5cGUgKFNZTUJPTF9UWVBFIChzeW0pLCBTWU1CT0xfVFlQRSAocmVhbF9zeW0pKTsKKwkJICAKKwkJICBpZiAocHJldikKKwkJICAgIHsKKwkJICAgICAgc3ltID0gU1lNQk9MX1ZBTFVFX0NIQUlOIChwcmV2KTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIHN5bSA9IG9wYXF1ZV90eXBlX2NoYWluW2hhc2hdOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgcHJldiA9IHN5bTsKKwkJICBzeW0gPSBTWU1CT0xfVkFMVUVfQ0hBSU4gKHN5bSk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9Cit9CisMCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqCitwcm9jZXNzX2NvZmZfc3ltYm9sIChjcywgYXV4LCBzZWN0aW9uX29mZnNldHMsIG9iamZpbGUpCisgICAgIHJlZ2lzdGVyIHN0cnVjdCBjb2ZmX3N5bWJvbCAqY3M7CisgICAgIHJlZ2lzdGVyIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4OworICAgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHM7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICByZWdpc3RlciBzdHJ1Y3Qgc3ltYm9sICpzeW0KKyAgICA9IChzdHJ1Y3Qgc3ltYm9sICopIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywKKwkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisgIGNoYXIgKm5hbWU7CisKKyAgbWVtc2V0IChzeW0sIDAsIHNpemVvZiAoc3RydWN0IHN5bWJvbCkpOworICBuYW1lID0gY3MtPmNfbmFtZTsKKyAgbmFtZSA9IEVYVEVSTkFMX05BTUUgKG5hbWUsIG9iamZpbGUtPm9iZmQpOworICBTWU1CT0xfTkFNRSAoc3ltKSA9IG9ic2F2ZXN0cmluZyAobmFtZSwgc3RybGVuIChuYW1lKSwKKwkJCQkgICAgJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrKTsKKyAgU1lNQk9MX0xBTkdVQUdFIChzeW0pID0gbGFuZ3VhZ2VfYXV0bzsKKyAgU1lNQk9MX0lOSVRfREVNQU5HTEVEX05BTUUgKHN5bSwgJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrKTsKKworICAvKiBkZWZhdWx0IGFzc3VtcHRpb25zICovCisgIFNZTUJPTF9WQUxVRSAoc3ltKSA9IGNzLT5jX3ZhbHVlOworICBTWU1CT0xfTkFNRVNQQUNFIChzeW0pID0gVkFSX05BTUVTUEFDRTsKKyAgU1lNQk9MX1NFQ1RJT04gKHN5bSkgPSBjc190b19zZWN0aW9uIChjcywgb2JqZmlsZSk7CisKKyAgaWYgKElTRkNOIChjcy0+Y190eXBlKSkKKyAgICB7CisgICAgICBTWU1CT0xfVkFMVUUgKHN5bSkgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCk7CisgICAgICAgU1lNQk9MX1RZUEUoc3ltKSA9IAorCSBsb29rdXBfZnVuY3Rpb25fdHlwZSAoZGVjb2RlX2Z1bmN0aW9uX3R5cGUgKGNzLCBjcy0+Y190eXBlLCBhdXgpKTsKKworICAgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0JMT0NLOworICAgICAgaWYgKGNzLT5jX3NjbGFzcyA9PSBDX1NUQVQgfHwgY3MtPmNfc2NsYXNzID09IENfVEhVTUJTVEFUCisJICB8fCBjcy0+Y19zY2xhc3MgPT0gQ19USFVNQlNUQVRGVU5DKQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZmlsZV9zeW1ib2xzKTsKKyAgICAgIGVsc2UgaWYgKGNzLT5jX3NjbGFzcyA9PSBDX0VYVCB8fCBjcy0+Y19zY2xhc3MgPT0gQ19USFVNQkVYVAorCSAgICAgICB8fCBjcy0+Y19zY2xhc3MgPT0gQ19USFVNQkVYVEZVTkMpCisJYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZnbG9iYWxfc3ltYm9scyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSBkZWNvZGVfdHlwZSAoY3MsIGNzLT5jX3R5cGUsIGF1eCk7CisgICAgICBzd2l0Y2ggKGNzLT5jX3NjbGFzcykKKwl7CisJICBjYXNlIENfTlVMTDoKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgQ19BVVRPOgorCSAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfTE9DQUw7CisJICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmbG9jYWxfc3ltYm9scyk7CisJICAgIGJyZWFrOworCisJICBjYXNlIENfVEhVTUJFWFQ6CisJICBjYXNlIENfVEhVTUJFWFRGVU5DOgorCSAgY2FzZSBDX0VYVDoKKwkgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX1NUQVRJQzsKKwkgICAgU1lNQk9MX1ZBTFVFX0FERFJFU1MgKHN5bSkgPSAoQ09SRV9BRERSKSBjcy0+Y192YWx1ZTsKKwkgICAgU1lNQk9MX1ZBTFVFX0FERFJFU1MgKHN5bSkgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCk7CisJICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZ2xvYmFsX3N5bWJvbHMpOworCSAgICBicmVhazsKKworCSAgY2FzZSBDX1RIVU1CU1RBVDoKKwkgIGNhc2UgQ19USFVNQlNUQVRGVU5DOgorCSAgY2FzZSBDX1NUQVQ6CisJICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19TVEFUSUM7CisJICAgIFNZTUJPTF9WQUxVRV9BRERSRVNTIChzeW0pID0gKENPUkVfQUREUikgY3MtPmNfdmFsdWU7CisJICAgIFNZTUJPTF9WQUxVRV9BRERSRVNTIChzeW0pICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOworCSAgICBpZiAod2l0aGluX2Z1bmN0aW9uKSB7CisJICAgICAgLyogU3RhdGljIHN5bWJvbCBvZiBsb2NhbCBzY29wZSAqLworCSAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmbG9jYWxfc3ltYm9scyk7CisJICAgIH0KKwkgICAgZWxzZSB7CisJICAgICAgLyogU3RhdGljIHN5bWJvbCBhdCB0b3AgbGV2ZWwgb2YgZmlsZSAqLworCSAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZmlsZV9zeW1ib2xzKTsKKwkgICAgfQorCSAgICBicmVhazsKKworI2lmZGVmIENfR0xCTFJFRwkJLyogQU1EIGNvZmYgKi8KKwkgIGNhc2UgQ19HTEJMUkVHOgorI2VuZGlmCisJICBjYXNlIENfUkVHOgorCSAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfUkVHSVNURVI7CisJICAgIFNZTUJPTF9WQUxVRSAoc3ltKSA9IFNEQl9SRUdfVE9fUkVHTlVNKGNzLT5jX3ZhbHVlKTsKKwkgICAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZsb2NhbF9zeW1ib2xzKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgQ19USFVNQkxBQkVMOgorCSAgY2FzZSBDX0xBQkVMOgorCSAgICBicmVhazsKKworCSAgY2FzZSBDX0FSRzoKKwkgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0FSRzsKKwkgICAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZsb2NhbF9zeW1ib2xzKTsKKyNpZiAhZGVmaW5lZCAoQkVMSUVWRV9QQ0NfUFJPTU9USU9OKQorCSAgICBpZiAoVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKKwkgICAgICB7CisJCS8qIElmIFBDQyBzYXlzIGEgcGFyYW1ldGVyIGlzIGEgc2hvcnQgb3IgYSBjaGFyLAorCQkgICBhbGlnbmVkIG9uIGFuIGludCBib3VuZGFyeSwgcmVhbGlnbiBpdCB0byB0aGUKKwkJICAgImxpdHRsZSBlbmQiIG9mIHRoZSBpbnQuICAqLworCQlzdHJ1Y3QgdHlwZSAqdGVtcHR5cGU7CisJCXRlbXB0eXBlID0gbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwKKwkJCQkJCSAgICBGVF9JTlRFR0VSKTsKKwkJaWYgKFRZUEVfTEVOR1RIIChTWU1CT0xfVFlQRSAoc3ltKSkgPCBUWVBFX0xFTkdUSCAodGVtcHR5cGUpCisJCSAgICAmJiBUWVBFX0NPREUgKFNZTUJPTF9UWVBFIChzeW0pKSA9PSBUWVBFX0NPREVfSU5UCisJCSAgICAmJiAwID09IFNZTUJPTF9WQUxVRSAoc3ltKSAlIFRZUEVfTEVOR1RIICh0ZW1wdHlwZSkpCisJCSAgeworCQkgICAgU1lNQk9MX1ZBTFVFIChzeW0pICs9CisJCSAgICAgIFRZUEVfTEVOR1RIICh0ZW1wdHlwZSkKKwkJCS0gVFlQRV9MRU5HVEggKFNZTUJPTF9UWVBFIChzeW0pKTsKKwkJICB9CisJICAgICAgfQorI2VuZGlmCisJICAgIGJyZWFrOworCisJICBjYXNlIENfUkVHUEFSTToKKwkgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX1JFR1BBUk07CisJICAgIFNZTUJPTF9WQUxVRSAoc3ltKSA9IFNEQl9SRUdfVE9fUkVHTlVNKGNzLT5jX3ZhbHVlKTsKKwkgICAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZsb2NhbF9zeW1ib2xzKTsKKyNpZiAhZGVmaW5lZCAoQkVMSUVWRV9QQ0NfUFJPTU9USU9OKQorCSAgICAvKiBGSVhNRTogIFRoaXMgc2hvdWxkIHJldGFpbiB0aGUgY3VycmVudCB0eXBlLCBzaW5jZSBpdCdzIGp1c3QKKwkgICAgICAgYSByZWdpc3RlciB2YWx1ZS4gIGdudUBhZG9iZSwgMjZGZWI5MyAqLworCSAgICAgIHsKKwkgICAgICAgIC8qIElmIFBDQyBzYXlzIGEgcGFyYW1ldGVyIGlzIGEgc2hvcnQgb3IgYSBjaGFyLAorCQkgICBpdCBpcyByZWFsbHkgYW4gaW50LiAgKi8KKwkJc3RydWN0IHR5cGUgKnRlbXB0eXBlOworCQl0ZW1wdHlwZSA9CisJCSAgbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfSU5URUdFUik7CisJCWlmIChUWVBFX0xFTkdUSCAoU1lNQk9MX1RZUEUgKHN5bSkpIDwgVFlQRV9MRU5HVEggKHRlbXB0eXBlKQorCQkgICAgJiYgVFlQRV9DT0RFIChTWU1CT0xfVFlQRSAoc3ltKSkgPT0gVFlQRV9DT0RFX0lOVCkKKwkJICB7CisJCSAgICBTWU1CT0xfVFlQRSAoc3ltKSA9CisJCSAgICAgIChUWVBFX1VOU0lHTkVEIChTWU1CT0xfVFlQRSAoc3ltKSkKKwkJICAgICAgID8gbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwKKwkJCQkJCSAgRlRfVU5TSUdORURfSU5URUdFUikKKwkJICAgICAgIDogdGVtcHR5cGUpOworCQkgIH0KKwkgICAgICB9CisjZW5kaWYKKwkgICAgYnJlYWs7CisJICAgIAorCSAgY2FzZSBDX1RQREVGOgorCSAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfVFlQRURFRjsKKwkgICAgU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9IFZBUl9OQU1FU1BBQ0U7CisKKwkgICAgLyogSWYgdHlwZSBoYXMgbm8gbmFtZSwgZ2l2ZSBpdCBvbmUgKi8KKwkgICAgaWYgKFRZUEVfTkFNRSAoU1lNQk9MX1RZUEUgKHN5bSkpID09IDApCisJICAgICAgeworCQlpZiAoVFlQRV9DT0RFIChTWU1CT0xfVFlQRSAoc3ltKSkgPT0gVFlQRV9DT0RFX1BUUgorCQkgICAgfHwgVFlQRV9DT0RFIChTWU1CT0xfVFlQRSAoc3ltKSkgPT0gVFlQRV9DT0RFX0ZVTkMpCisJCSAgeworCQkgICAgLyogSWYgd2UgYXJlIGdpdmluZyBhIG5hbWUgdG8gYSB0eXBlIHN1Y2ggYXMgInBvaW50ZXIgdG8KKwkJICAgICAgIGZvbyIgb3IgImZ1bmN0aW9uIHJldHVybmluZyBmb28iLCB3ZSBiZXR0ZXIgbm90IHNldAorCQkgICAgICAgdGhlIFRZUEVfTkFNRS4gIElmIHRoZSBwcm9ncmFtIGNvbnRhaW5zICJ0eXBlZGVmIGNoYXIKKwkJICAgICAgICpjYWRkcl90OyIsIHdlIGRvbid0IHdhbnQgYWxsIHZhcmlhYmxlcyBvZiB0eXBlIGNoYXIKKwkJICAgICAgICogdG8gcHJpbnQgYXMgY2FkZHJfdC4gIFRoaXMgaXMgbm90IGp1c3QgYQorCQkgICAgICAgY29uc2VxdWVuY2Ugb2YgR0RCJ3MgdHlwZSBtYW5hZ2VtZW50OyBDQyBhbmQgR0NDIChhdAorCQkgICAgICAgbGVhc3QgdGhyb3VnaCB2ZXJzaW9uIDIuNCkgYm90aCBvdXRwdXQgdmFyaWFibGVzIG9mCisJCSAgICAgICBlaXRoZXIgdHlwZSBjaGFyICogb3IgY2FkZHJfdCB3aXRoIHRoZSB0eXBlCisJCSAgICAgICByZWZlcmluZyB0byB0aGUgQ19UUERFRiBzeW1ib2wgZm9yIGNhZGRyX3QuICBJZiBhIGZ1dHVyZQorCQkgICAgICAgY29tcGlsZXIgY2xlYW5zIHRoaXMgdXAgaXQgR0RCIGlzIG5vdCByZWFkeSBmb3IgaXQKKwkJICAgICAgIHlldCwgYnV0IGlmIGl0IGJlY29tZXMgcmVhZHkgd2Ugc29tZWhvdyBuZWVkIHRvCisJCSAgICAgICBkaXNhYmxlIHRoaXMgY2hlY2sgKHdpdGhvdXQgYnJlYWtpbmcgdGhlIFBDQy9HQ0MyLjQKKwkJICAgICAgIGNhc2UpLgorCisJCSAgICAgICBTaWdoLgorCisJCSAgICAgICBGb3J0dW5hdGVseSwgdGhpcyBjaGVjayBzZWVtcyBub3QgdG8gYmUgbmVjZXNzYXJ5CisJCSAgICAgICBmb3IgYW55dGhpbmcgZXhjZXB0IHBvaW50ZXJzIG9yIGZ1bmN0aW9ucy4gICovCisJCSAgICA7CisJCSAgfQorCQllbHNlCisJCSAgVFlQRV9OQU1FIChTWU1CT0xfVFlQRSAoc3ltKSkgPQorCQkgICAgY29uY2F0IChTWU1CT0xfTkFNRSAoc3ltKSwgTlVMTCk7CisJICAgICAgfQorI2lmZGVmIENYVVhfVEFSR0VUCisJICAgIC8qIElnbm9yZSB2ZW5kb3Igc2VjdGlvbiBmb3IgSGFycmlzIENYL1VYIHRhcmdldHMuICovCisgICAgICAgICAgICBlbHNlIGlmIChjcy0+Y19uYW1lWzBdID09ICckJykgCisJICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ1hVWF9UQVJHRVQgKi8KKworCSAgICAvKiBLZWVwIHRyYWNrIG9mIGFueSB0eXBlIHdoaWNoIHBvaW50cyB0byBlbXB0eSBzdHJ1Y3R1cmVkIHR5cGUsCisJCXNvIGl0IGNhbiBiZSBmaWxsZWQgZnJvbSBhIGRlZmluaXRpb24gZnJvbSBhbm90aGVyIGZpbGUuICBBCisJCXNpbXBsZSBmb3J3YXJkIHJlZmVyZW5jZSAoVFlQRV9DT0RFX1VOREVGKSBpcyBub3QgYW4KKwkJZW1wdHkgc3RydWN0dXJlZCB0eXBlLCB0aG91Z2g7IHRoZSBmb3J3YXJkIHJlZmVyZW5jZXMKKwkJd29yayB0aGVtc2VsdmVzIG91dCB2aWEgdGhlIG1hZ2ljIG9mIGNvZmZfbG9va3VwX3R5cGUuICAqLworCSAgICBpZiAoVFlQRV9DT0RFIChTWU1CT0xfVFlQRSAoc3ltKSkgPT0gVFlQRV9DT0RFX1BUUiAmJgorCQlUWVBFX0xFTkdUSCAoVFlQRV9UQVJHRVRfVFlQRSAoU1lNQk9MX1RZUEUgKHN5bSkpKSA9PSAwICYmCisJCVRZUEVfQ09ERSAgIChUWVBFX1RBUkdFVF9UWVBFIChTWU1CT0xfVFlQRSAoc3ltKSkpICE9CisJCQkJCQlUWVBFX0NPREVfVU5ERUYpCisJICAgICAgeworCQlyZWdpc3RlciBpbnQgaSA9IGhhc2huYW1lIChTWU1CT0xfTkFNRSAoc3ltKSk7CisKKwkJU1lNQk9MX1ZBTFVFX0NIQUlOIChzeW0pID0gb3BhcXVlX3R5cGVfY2hhaW5baV07CisJCW9wYXF1ZV90eXBlX2NoYWluW2ldID0gc3ltOworCSAgICAgIH0KKwkgICAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZmaWxlX3N5bWJvbHMpOworCSAgICBicmVhazsKKworCSAgY2FzZSBDX1NUUlRBRzoKKwkgIGNhc2UgQ19VTlRBRzoKKwkgIGNhc2UgQ19FTlRBRzoKKwkgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX1RZUEVERUY7CisJICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBTVFJVQ1RfTkFNRVNQQUNFOworCisgICAgICAgICAgICAvKiBTb21lIGNvbXBpbGVycyB0cnkgdG8gYmUgaGVscGZ1bCBieSBpbnZlbnRpbmcgImZha2UiCisgICAgICAgICAgICAgICBuYW1lcyBmb3IgYW5vbnltb3VzIGVudW1zLCBzdHJ1Y3R1cmVzLCBhbmQgdW5pb25zLCBsaWtlCisgICAgICAgICAgICAgICAifjBmYWtlIiBvciAiLjBmYWtlIi4gIFRoYW5rcywgYnV0IG5vIHRoYW5rcy4uLiAqLworCSAgICBpZiAoVFlQRV9UQUdfTkFNRSAoU1lNQk9MX1RZUEUgKHN5bSkpID09IDApCisJICAgICAgaWYgKFNZTUJPTF9OQU1FKHN5bSkgIT0gTlVMTAorCQkgICYmICpTWU1CT0xfTkFNRShzeW0pICE9ICd+JworCQkgICYmICpTWU1CT0xfTkFNRShzeW0pICE9ICcuJykKKwkJVFlQRV9UQUdfTkFNRSAoU1lNQk9MX1RZUEUgKHN5bSkpID0KKwkJICBjb25jYXQgKFNZTUJPTF9OQU1FIChzeW0pLCBOVUxMKTsKKworCSAgICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmZpbGVfc3ltYm9scyk7CisJICAgIGJyZWFrOworCisJICBkZWZhdWx0OgorCSAgICBicmVhazsKKwl9CisgICAgfQorICByZXR1cm4gc3ltOworfQorDAorLyogRGVjb2RlIGEgY29mZiB0eXBlIHNwZWNpZmllcjsgIHJldHVybiB0aGUgdHlwZSB0aGF0IGlzIG1lYW50LiAgKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2RlY29kZV90eXBlIChjcywgY190eXBlLCBhdXgpCisgICAgIHJlZ2lzdGVyIHN0cnVjdCBjb2ZmX3N5bWJvbCAqY3M7CisgICAgIHVuc2lnbmVkIGludCBjX3R5cGU7CisgICAgIHJlZ2lzdGVyIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4OworeworICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdHlwZSA9IDA7CisgIHVuc2lnbmVkIGludCBuZXdfY190eXBlOworCisgIGlmIChjX3R5cGUgJiB+Tl9CVE1BU0spCisgICAgeworICAgICAgbmV3X2NfdHlwZSA9IERFQ1JFRiAoY190eXBlKTsKKyAgICAgIGlmIChJU1BUUiAoY190eXBlKSkKKwl7CisJICB0eXBlID0gZGVjb2RlX3R5cGUgKGNzLCBuZXdfY190eXBlLCBhdXgpOworCSAgdHlwZSA9IGxvb2t1cF9wb2ludGVyX3R5cGUgKHR5cGUpOworCX0KKyAgICAgIGVsc2UgaWYgKElTRkNOIChjX3R5cGUpKQorCXsKKwkgIHR5cGUgPSBkZWNvZGVfdHlwZSAoY3MsIG5ld19jX3R5cGUsIGF1eCk7CisJICB0eXBlID0gbG9va3VwX2Z1bmN0aW9uX3R5cGUgKHR5cGUpOworCX0KKyAgICAgIGVsc2UgaWYgKElTQVJZIChjX3R5cGUpKQorCXsKKwkgIGludCBpLCBuOworCSAgcmVnaXN0ZXIgdW5zaWduZWQgc2hvcnQgKmRpbTsKKwkgIHN0cnVjdCB0eXBlICpiYXNlX3R5cGUsICppbmRleF90eXBlLCAqcmFuZ2VfdHlwZTsKKworCSAgLyogRGVmaW5lIGFuIGFycmF5IHR5cGUuICAqLworCSAgLyogYXV4ZW50IHJlZmVycyB0byBhcnJheSwgbm90IGJhc2UgdHlwZSAqLworCSAgaWYgKGF1eC0+eF9zeW0ueF90YWduZHgubCA9PSAwKQorCSAgICBjcy0+Y19uYXV4ID0gMDsKKworCSAgLyogc2hpZnQgdGhlIGluZGljZXMgZG93biAqLworCSAgZGltID0gJmF1eC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXTsKKwkgIGkgPSAxOworCSAgbiA9IGRpbVswXTsKKwkgIGZvciAoaSA9IDA7ICpkaW0gJiYgaSA8IERJTU5VTSAtIDE7IGkrKywgZGltKyspCisJICAgICpkaW0gPSAqKGRpbSArIDEpOworCSAgKmRpbSA9IDA7CisKKwkgIGJhc2VfdHlwZSA9IGRlY29kZV90eXBlIChjcywgbmV3X2NfdHlwZSwgYXV4KTsKKwkgIGluZGV4X3R5cGUgPSBsb29rdXBfZnVuZGFtZW50YWxfdHlwZSAoY3VycmVudF9vYmpmaWxlLCBGVF9JTlRFR0VSKTsKKwkgIHJhbmdlX3R5cGUgPQorCSAgICBjcmVhdGVfcmFuZ2VfdHlwZSAoKHN0cnVjdCB0eXBlICopIE5VTEwsIGluZGV4X3R5cGUsIDAsIG4gLSAxKTsKKwkgIHR5cGUgPQorCSAgICBjcmVhdGVfYXJyYXlfdHlwZSAoKHN0cnVjdCB0eXBlICopIE5VTEwsIGJhc2VfdHlwZSwgcmFuZ2VfdHlwZSk7CisJfQorICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgIC8qIFJlZmVyZW5jZSB0byBleGlzdGluZyB0eXBlLiAgVGhpcyBvbmx5IG9jY3VycyB3aXRoIHRoZQorICAgICBzdHJ1Y3QsIHVuaW9uLCBhbmQgZW51bSB0eXBlcy4gIEVQSSBhMjlrIGNvZmYKKyAgICAgZmFrZXMgdXMgb3V0IGJ5IHByb2R1Y2luZyBhdXggZW50cmllcyB3aXRoIGEgbm9uemVybworICAgICB4X3RhZ25keCBmb3IgZGVmaW5pdGlvbnMgb2Ygc3RydWN0cywgdW5pb25zLCBhbmQgZW51bXMsIHNvIHdlCisgICAgIGhhdmUgdG8gY2hlY2sgdGhlIGNfc2NsYXNzIGZpZWxkLiAgU0NPIDMuMnY0IGNjIGdldHMgY29uZnVzZWQKKyAgICAgd2l0aCBwb2ludGVycyB0byBwb2ludGVycyB0byBkZWZpbmVkIHN0cnVjdHMsIGFuZCBnZW5lcmF0ZXMKKyAgICAgbmVnYXRpdmUgeF90YWduZHggZmllbGRzLiAgKi8KKyAgaWYgKGNzLT5jX25hdXggPiAwICYmIGF1eC0+eF9zeW0ueF90YWduZHgubCAhPSAwKQorICAgIHsKKyAgICAgIGlmIChjcy0+Y19zY2xhc3MgIT0gQ19TVFJUQUcKKwkgICYmIGNzLT5jX3NjbGFzcyAhPSBDX1VOVEFHCisJICAmJiBjcy0+Y19zY2xhc3MgIT0gQ19FTlRBRworCSAgJiYgYXV4LT54X3N5bS54X3RhZ25keC5sID49IDApCisJeworCSAgdHlwZSA9IGNvZmZfYWxsb2NfdHlwZSAoYXV4LT54X3N5bS54X3RhZ25keC5sKTsKKwkgIHJldHVybiB0eXBlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjb21wbGFpbiAoJnRhZ25keF9iYWRfY29tcGxhaW50LCBjcy0+Y19uYW1lKTsKKwkgIC8qIEFuZCBmYWxsIHRocm91Z2ggdG8gZGVjb2RlX2Jhc2VfdHlwZS4uLiAqLworCX0KKyAgICB9CisKKyAgcmV0dXJuIGRlY29kZV9iYXNlX3R5cGUgKGNzLCBCVFlQRSAoY190eXBlKSwgYXV4KTsKK30KKworLyogRGVjb2RlIGEgY29mZiB0eXBlIHNwZWNpZmllciBmb3IgZnVuY3Rpb24gZGVmaW5pdGlvbjsKKyAgIHJldHVybiB0aGUgdHlwZSB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zLiAgKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2RlY29kZV9mdW5jdGlvbl90eXBlIChjcywgY190eXBlLCBhdXgpCisgICAgIHJlZ2lzdGVyIHN0cnVjdCBjb2ZmX3N5bWJvbCAqY3M7CisgICAgIHVuc2lnbmVkIGludCBjX3R5cGU7CisgICAgIHJlZ2lzdGVyIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4OworeworICBpZiAoYXV4LT54X3N5bS54X3RhZ25keC5sID09IDApCisgICAgY3MtPmNfbmF1eCA9IDA7CS8qIGF1eGVudCByZWZlcnMgdG8gZnVuY3Rpb24sIG5vdCBiYXNlIHR5cGUgKi8KKworICByZXR1cm4gZGVjb2RlX3R5cGUgKGNzLCBERUNSRUYgKGNfdHlwZSksIGF1eCk7Cit9CisMCisvKiBiYXNpYyBDIHR5cGVzICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitkZWNvZGVfYmFzZV90eXBlIChjcywgY190eXBlLCBhdXgpCisgICAgIHJlZ2lzdGVyIHN0cnVjdCBjb2ZmX3N5bWJvbCAqY3M7CisgICAgIHVuc2lnbmVkIGludCBjX3R5cGU7CisgICAgIHJlZ2lzdGVyIHVuaW9uIGludGVybmFsX2F1eGVudCAqYXV4OworeworICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKworICBzd2l0Y2ggKGNfdHlwZSkKKyAgICB7CisgICAgICBjYXNlIFRfTlVMTDoKKyAgICAgICAgLyogc2hvd3MgdXAgd2l0aCAidm9pZCAoKmZvbykoKTsiIHN0cnVjdHVyZSBtZW1iZXJzICovCisJcmV0dXJuIGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlIChjdXJyZW50X29iamZpbGUsIEZUX1ZPSUQpOworCisjaWYgMAorLyogREdVWCBhY3R1YWxseSBkZWZpbmVzIGJvdGggVF9BUkcgYW5kIFRfVk9JRCB0byB0aGUgc2FtZSB2YWx1ZS4gICovCisjaWZkZWYgVF9BUkcKKyAgICAgIGNhc2UgVF9BUkc6CisJLyogU2hvd3MgdXAgaW4gREdVWCwgSSB0aGluay4gIE5vdCBzdXJlIHdoZXJlLiAgKi8KKwlyZXR1cm4gbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfVk9JRCk7CS8qIHNob3VsZG4ndCBzaG93IHVwIGhlcmUgKi8KKyNlbmRpZgorI2VuZGlmIC8qIDAgKi8KKworI2lmZGVmIFRfVk9JRAorICAgICAgY2FzZSBUX1ZPSUQ6CisJLyogSW50ZWwgOTYwIENPRkYgaGFzIHRoaXMgc3ltYm9sIGFuZCBtZWFuaW5nLiAgKi8KKwlyZXR1cm4gbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfVk9JRCk7CisjZW5kaWYKKworICAgICAgY2FzZSBUX0NIQVI6CisJcmV0dXJuIGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlIChjdXJyZW50X29iamZpbGUsIEZUX0NIQVIpOworCisgICAgICBjYXNlIFRfU0hPUlQ6CisJcmV0dXJuIGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlIChjdXJyZW50X29iamZpbGUsIEZUX1NIT1JUKTsKKworICAgICAgY2FzZSBUX0lOVDoKKwlyZXR1cm4gbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfSU5URUdFUik7CisKKyAgICAgIGNhc2UgVF9MT05HOgorCWlmIChjcy0+Y19zY2xhc3MgPT0gQ19GSUVMRAorCSAgICAmJiBhdXgtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplID4gVEFSR0VUX0xPTkdfQklUKQorCSAgcmV0dXJuIGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlIChjdXJyZW50X29iamZpbGUsIEZUX0xPTkdfTE9ORyk7CisJZWxzZQorCSAgcmV0dXJuIGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlIChjdXJyZW50X29iamZpbGUsIEZUX0xPTkcpOworCisgICAgICBjYXNlIFRfRkxPQVQ6CisJcmV0dXJuIGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlIChjdXJyZW50X29iamZpbGUsIEZUX0ZMT0FUKTsKKworICAgICAgY2FzZSBUX0RPVUJMRToKKwlyZXR1cm4gbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfREJMX1BSRUNfRkxPQVQpOworCisgICAgICBjYXNlIFRfTE5HREJMOgorCXJldHVybiBsb29rdXBfZnVuZGFtZW50YWxfdHlwZSAoY3VycmVudF9vYmpmaWxlLCBGVF9FWFRfUFJFQ19GTE9BVCk7CisKKyAgICAgIGNhc2UgVF9TVFJVQ1Q6CisJaWYgKGNzLT5jX25hdXggIT0gMSkKKwkgIHsKKwkgICAgLyogYW5vbnltb3VzIHN0cnVjdHVyZSB0eXBlICovCisJICAgIHR5cGUgPSBjb2ZmX2FsbG9jX3R5cGUgKGNzLT5jX3N5bW51bSk7CisJICAgIFRZUEVfQ09ERSAodHlwZSkgPSBUWVBFX0NPREVfU1RSVUNUOworCSAgICBUWVBFX05BTUUgKHR5cGUpID0gTlVMTDsKKwkgICAgLyogVGhpcyB1c2VkIHRvIHNldCB0aGUgdGFnIHRvICI8b3BhcXVlPiIuICBCdXQgSSB0aGluayBzZXR0aW5nIGl0CisJICAgICAgIHRvIE5VTEwgaXMgcmlnaHQsIGFuZCB0aGUgcHJpbnRpbmcgY29kZSBjYW4gcHJpbnQgaXQgYXMKKwkgICAgICAgInN0cnVjdCB7Li4ufSIuICAqLworCSAgICBUWVBFX1RBR19OQU1FICh0eXBlKSA9IE5VTEw7CisJICAgIElOSVRfQ1BMVVNfU1BFQ0lGSUModHlwZSk7CisJICAgIFRZUEVfTEVOR1RIICh0eXBlKSA9IDA7CisJICAgIFRZUEVfRklFTERTICh0eXBlKSA9IDA7CisJICAgIFRZUEVfTkZJRUxEUyAodHlwZSkgPSAwOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgdHlwZSA9IGNvZmZfcmVhZF9zdHJ1Y3RfdHlwZSAoY3MtPmNfc3ltbnVtLAorCQkJCSAgICBhdXgtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplLAorCQkJCSAgICBhdXgtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwpOworCSAgfQorCXJldHVybiB0eXBlOworCisgICAgICBjYXNlIFRfVU5JT046CisJaWYgKGNzLT5jX25hdXggIT0gMSkKKwkgIHsKKwkgICAgLyogYW5vbnltb3VzIHVuaW9uIHR5cGUgKi8KKwkgICAgdHlwZSA9IGNvZmZfYWxsb2NfdHlwZSAoY3MtPmNfc3ltbnVtKTsKKwkgICAgVFlQRV9OQU1FICh0eXBlKSA9IE5VTEw7CisJICAgIC8qIFRoaXMgdXNlZCB0byBzZXQgdGhlIHRhZyB0byAiPG9wYXF1ZT4iLiAgQnV0IEkgdGhpbmsgc2V0dGluZyBpdAorCSAgICAgICB0byBOVUxMIGlzIHJpZ2h0LCBhbmQgdGhlIHByaW50aW5nIGNvZGUgY2FuIHByaW50IGl0IGFzCisJICAgICAgICJ1bmlvbiB7Li4ufSIuICAqLworCSAgICBUWVBFX1RBR19OQU1FICh0eXBlKSA9IE5VTEw7CisJICAgIElOSVRfQ1BMVVNfU1BFQ0lGSUModHlwZSk7CisJICAgIFRZUEVfTEVOR1RIICh0eXBlKSA9IDA7CisJICAgIFRZUEVfRklFTERTICh0eXBlKSA9IDA7CisJICAgIFRZUEVfTkZJRUxEUyAodHlwZSkgPSAwOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgdHlwZSA9IGNvZmZfcmVhZF9zdHJ1Y3RfdHlwZSAoY3MtPmNfc3ltbnVtLAorCQkJCSAgICBhdXgtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplLAorCQkJCSAgICBhdXgtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwpOworCSAgfQorCVRZUEVfQ09ERSAodHlwZSkgPSBUWVBFX0NPREVfVU5JT047CisJcmV0dXJuIHR5cGU7CisKKyAgICAgIGNhc2UgVF9FTlVNOgorCWlmIChjcy0+Y19uYXV4ICE9IDEpCisJICB7CisJICAgIC8qIGFub255bW91cyBlbnVtIHR5cGUgKi8KKwkgICAgdHlwZSA9IGNvZmZfYWxsb2NfdHlwZSAoY3MtPmNfc3ltbnVtKTsKKwkgICAgVFlQRV9DT0RFICh0eXBlKSA9IFRZUEVfQ09ERV9FTlVNOworCSAgICBUWVBFX05BTUUgKHR5cGUpID0gTlVMTDsKKwkgICAgLyogVGhpcyB1c2VkIHRvIHNldCB0aGUgdGFnIHRvICI8b3BhcXVlPiIuICBCdXQgSSB0aGluayBzZXR0aW5nIGl0CisJICAgICAgIHRvIE5VTEwgaXMgcmlnaHQsIGFuZCB0aGUgcHJpbnRpbmcgY29kZSBjYW4gcHJpbnQgaXQgYXMKKwkgICAgICAgImVudW0gey4uLn0iLiAgKi8KKwkgICAgVFlQRV9UQUdfTkFNRSAodHlwZSkgPSBOVUxMOworCSAgICBUWVBFX0xFTkdUSCAodHlwZSkgPSAwOworCSAgICBUWVBFX0ZJRUxEUyAodHlwZSkgPSAwOworCSAgICBUWVBFX05GSUVMRFModHlwZSkgPSAwOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgdHlwZSA9IGNvZmZfcmVhZF9lbnVtX3R5cGUgKGNzLT5jX3N5bW51bSwKKwkJCQkJYXV4LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSwKKwkJCQkJYXV4LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sKTsKKwkgIH0KKwlyZXR1cm4gdHlwZTsKKworICAgICAgY2FzZSBUX01PRToKKwkvKiBzaG91bGRuJ3Qgc2hvdyB1cCBoZXJlICovCisJYnJlYWs7CisKKyAgICAgIGNhc2UgVF9VQ0hBUjoKKwlyZXR1cm4gbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfVU5TSUdORURfQ0hBUik7CisKKyAgICAgIGNhc2UgVF9VU0hPUlQ6CisJcmV0dXJuIGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlIChjdXJyZW50X29iamZpbGUsIEZUX1VOU0lHTkVEX1NIT1JUKTsKKworICAgICAgY2FzZSBUX1VJTlQ6CisJcmV0dXJuIGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlIChjdXJyZW50X29iamZpbGUsIEZUX1VOU0lHTkVEX0lOVEVHRVIpOworCisgICAgICBjYXNlIFRfVUxPTkc6CisJaWYgKGNzLT5jX3NjbGFzcyA9PSBDX0ZJRUxECisJICAgICYmIGF1eC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUgPiBUQVJHRVRfTE9OR19CSVQpCisJICByZXR1cm4gbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfVU5TSUdORURfTE9OR19MT05HKTsKKwllbHNlCisJICByZXR1cm4gbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfVU5TSUdORURfTE9ORyk7CisgICAgfQorICBjb21wbGFpbiAoJnVuZXhwZWN0ZWRfdHlwZV9jb21wbGFpbnQsIGNzLT5jX25hbWUpOworICByZXR1cm4gbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfVk9JRCk7Cit9CisMCisvKiBUaGlzIHBhZ2UgY29udGFpbnMgc3Vicm91dGluZXMgb2YgcmVhZF90eXBlLiAgKi8KKworLyogUmVhZCB0aGUgZGVzY3JpcHRpb24gb2YgYSBzdHJ1Y3R1cmUgKG9yIHVuaW9uIHR5cGUpIGFuZCByZXR1cm4gYW4KKyAgIG9iamVjdCBkZXNjcmliaW5nIHRoZSB0eXBlLiAgKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2NvZmZfcmVhZF9zdHJ1Y3RfdHlwZSAoaW5kZXgsIGxlbmd0aCwgbGFzdHN5bSkKKyAgICAgaW50IGluZGV4OworICAgICBpbnQgbGVuZ3RoOworICAgICBpbnQgbGFzdHN5bTsKK3sKKyAgc3RydWN0IG5leHRmaWVsZAorICAgIHsKKyAgICAgIHN0cnVjdCBuZXh0ZmllbGQgKm5leHQ7CisgICAgICBzdHJ1Y3QgZmllbGQgZmllbGQ7CisgICAgfTsKKworICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgcmVnaXN0ZXIgc3RydWN0IG5leHRmaWVsZCAqbGlzdCA9IDA7CisgIHN0cnVjdCBuZXh0ZmllbGQgKm5ldzsKKyAgaW50IG5maWVsZHMgPSAwOworICByZWdpc3RlciBpbnQgbjsKKyAgY2hhciAqbmFtZTsKKyAgc3RydWN0IGNvZmZfc3ltYm9sIG1lbWJlcl9zeW07CisgIHJlZ2lzdGVyIHN0cnVjdCBjb2ZmX3N5bWJvbCAqbXMgPSAmbWVtYmVyX3N5bTsKKyAgc3RydWN0IGludGVybmFsX3N5bWVudCBzdWJfc3ltOworICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgc3ViX2F1eDsKKyAgaW50IGRvbmUgPSAwOworCisgIHR5cGUgPSBjb2ZmX2FsbG9jX3R5cGUgKGluZGV4KTsKKyAgVFlQRV9DT0RFICh0eXBlKSA9IFRZUEVfQ09ERV9TVFJVQ1Q7CisgIElOSVRfQ1BMVVNfU1BFQ0lGSUModHlwZSk7CisgIFRZUEVfTEVOR1RIICh0eXBlKSA9IGxlbmd0aDsKKworICB3aGlsZSAoIWRvbmUgJiYgc3ltbnVtIDwgbGFzdHN5bSAmJiBzeW1udW0gPCBubGlzdF9uc3ltc19nbG9iYWwpCisgICAgeworICAgICAgcmVhZF9vbmVfc3ltIChtcywgJnN1Yl9zeW0sICZzdWJfYXV4KTsKKyAgICAgIG5hbWUgPSBtcy0+Y19uYW1lOworICAgICAgbmFtZSA9IEVYVEVSTkFMX05BTUUgKG5hbWUsIGN1cnJlbnRfb2JqZmlsZS0+b2JmZCk7CisKKyAgICAgIHN3aXRjaCAobXMtPmNfc2NsYXNzKQorCXsKKwkgIGNhc2UgQ19NT1M6CisJICBjYXNlIENfTU9VOgorCisJICAgIC8qIEdldCBzcGFjZSB0byByZWNvcmQgdGhlIG5leHQgZmllbGQncyBkYXRhLiAgKi8KKwkgICAgbmV3ID0gKHN0cnVjdCBuZXh0ZmllbGQgKikgYWxsb2NhIChzaXplb2YgKHN0cnVjdCBuZXh0ZmllbGQpKTsKKwkgICAgbmV3LT5uZXh0ID0gbGlzdDsKKwkgICAgbGlzdCA9IG5ldzsKKworCSAgICAvKiBTYXZlIHRoZSBkYXRhLiAgKi8KKwkgICAgbGlzdC0+ZmllbGQubmFtZSA9CisJICAgICAgb2JzYXZlc3RyaW5nIChuYW1lLAorCQkJICAgIHN0cmxlbiAobmFtZSksCisJCQkgICAgJmN1cnJlbnRfb2JqZmlsZS0+c3ltYm9sX29ic3RhY2spOworCSAgICBGSUVMRF9UWVBFIChsaXN0LT5maWVsZCkgPSBkZWNvZGVfdHlwZSAobXMsIG1zLT5jX3R5cGUsICZzdWJfYXV4KTsKKwkgICAgRklFTERfQklUUE9TIChsaXN0LT5maWVsZCkgPSA4ICogbXMtPmNfdmFsdWU7CisJICAgIEZJRUxEX0JJVFNJWkUgKGxpc3QtPmZpZWxkKSA9IDA7CisJICAgIG5maWVsZHMrKzsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgQ19GSUVMRDoKKworCSAgICAvKiBHZXQgc3BhY2UgdG8gcmVjb3JkIHRoZSBuZXh0IGZpZWxkJ3MgZGF0YS4gICovCisJICAgIG5ldyA9IChzdHJ1Y3QgbmV4dGZpZWxkICopIGFsbG9jYSAoc2l6ZW9mIChzdHJ1Y3QgbmV4dGZpZWxkKSk7CisJICAgIG5ldy0+bmV4dCA9IGxpc3Q7CisJICAgIGxpc3QgPSBuZXc7CisKKwkgICAgLyogU2F2ZSB0aGUgZGF0YS4gICovCisJICAgIGxpc3QtPmZpZWxkLm5hbWUgPQorCSAgICAgIG9ic2F2ZXN0cmluZyAobmFtZSwKKwkJCSAgICBzdHJsZW4gKG5hbWUpLAorCQkJICAgICZjdXJyZW50X29iamZpbGUtPnN5bWJvbF9vYnN0YWNrKTsKKwkgICAgRklFTERfVFlQRSAobGlzdC0+ZmllbGQpID0gZGVjb2RlX3R5cGUgKG1zLCBtcy0+Y190eXBlLCAmc3ViX2F1eCk7CisJICAgIEZJRUxEX0JJVFBPUyAobGlzdC0+ZmllbGQpID0gbXMtPmNfdmFsdWU7CisJICAgIEZJRUxEX0JJVFNJWkUgKGxpc3QtPmZpZWxkKSA9IHN1Yl9hdXgueF9zeW0ueF9taXNjLnhfbG5zei54X3NpemU7CisJICAgIG5maWVsZHMrKzsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgQ19FT1M6CisJICAgIGRvbmUgPSAxOworCSAgICBicmVhazsKKwl9CisgICAgfQorICAvKiBOb3cgY3JlYXRlIHRoZSB2ZWN0b3Igb2YgZmllbGRzLCBhbmQgcmVjb3JkIGhvdyBiaWcgaXQgaXMuICAqLworCisgIFRZUEVfTkZJRUxEUyAodHlwZSkgPSBuZmllbGRzOworICBUWVBFX0ZJRUxEUyAodHlwZSkgPSAoc3RydWN0IGZpZWxkICopCisgICAgVFlQRV9BTExPQyAodHlwZSwgc2l6ZW9mIChzdHJ1Y3QgZmllbGQpICogbmZpZWxkcyk7CisKKyAgLyogQ29weSB0aGUgc2F2ZWQtdXAgZmllbGRzIGludG8gdGhlIGZpZWxkIHZlY3Rvci4gICovCisKKyAgZm9yIChuID0gbmZpZWxkczsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpCisgICAgVFlQRV9GSUVMRCAodHlwZSwgLS1uKSA9IGxpc3QtPmZpZWxkOworCisgIHJldHVybiB0eXBlOworfQorDAorLyogUmVhZCBhIGRlZmluaXRpb24gb2YgYW4gZW51bWVyYXRpb24gdHlwZSwKKyAgIGFuZCBjcmVhdGUgYW5kIHJldHVybiBhIHN1aXRhYmxlIHR5cGUgb2JqZWN0LgorICAgQWxzbyBkZWZpbmVzIHRoZSBzeW1ib2xzIHRoYXQgcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgdGhlIHR5cGUuICAqLworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHN0cnVjdCB0eXBlICoKK2NvZmZfcmVhZF9lbnVtX3R5cGUgKGluZGV4LCBsZW5ndGgsIGxhc3RzeW0pCisgICAgIGludCBpbmRleDsKKyAgICAgaW50IGxlbmd0aDsKKyAgICAgaW50IGxhc3RzeW07Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKnR5cGU7CisgIGludCBuc3ltcyA9IDA7CisgIGludCBkb25lID0gMDsKKyAgc3RydWN0IHBlbmRpbmcgKipzeW1saXN0OworICBzdHJ1Y3QgY29mZl9zeW1ib2wgbWVtYmVyX3N5bTsKKyAgcmVnaXN0ZXIgc3RydWN0IGNvZmZfc3ltYm9sICptcyA9ICZtZW1iZXJfc3ltOworICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN1Yl9zeW07CisgIHVuaW9uIGludGVybmFsX2F1eGVudCBzdWJfYXV4OworICBzdHJ1Y3QgcGVuZGluZyAqb3N5bXMsICpzeW1zOworICBpbnQgb19uc3ltczsKKyAgcmVnaXN0ZXIgaW50IG47CisgIGNoYXIgKm5hbWU7CisgIGludCB1bnNpZ25lZF9lbnVtID0gMTsKKworICB0eXBlID0gY29mZl9hbGxvY190eXBlIChpbmRleCk7CisgIGlmICh3aXRoaW5fZnVuY3Rpb24pCisgICAgc3ltbGlzdCA9ICZsb2NhbF9zeW1ib2xzOworICBlbHNlCisgICAgc3ltbGlzdCA9ICZmaWxlX3N5bWJvbHM7CisgIG9zeW1zID0gKnN5bWxpc3Q7CisgIG9fbnN5bXMgPSBvc3ltcyA/IG9zeW1zLT5uc3ltcyA6IDA7CisKKyAgd2hpbGUgKCFkb25lICYmIHN5bW51bSA8IGxhc3RzeW0gJiYgc3ltbnVtIDwgbmxpc3RfbnN5bXNfZ2xvYmFsKQorICAgIHsKKyAgICAgIHJlYWRfb25lX3N5bSAobXMsICZzdWJfc3ltLCAmc3ViX2F1eCk7CisgICAgICBuYW1lID0gbXMtPmNfbmFtZTsKKyAgICAgIG5hbWUgPSBFWFRFUk5BTF9OQU1FIChuYW1lLCBjdXJyZW50X29iamZpbGUtPm9iZmQpOworCisgICAgICBzd2l0Y2ggKG1zLT5jX3NjbGFzcykKKwl7CisJICBjYXNlIENfTU9FOgorCSAgICBzeW0gPSAoc3RydWN0IHN5bWJvbCAqKSBvYnN0YWNrX2FsbG9jCisJICAgICAgKCZjdXJyZW50X29iamZpbGUtPnN5bWJvbF9vYnN0YWNrLAorCSAgICAgICBzaXplb2YgKHN0cnVjdCBzeW1ib2wpKTsKKwkgICAgbWVtc2V0IChzeW0sIDAsIHNpemVvZiAoc3RydWN0IHN5bWJvbCkpOworCisJICAgIFNZTUJPTF9OQU1FIChzeW0pID0KKwkgICAgICBvYnNhdmVzdHJpbmcgKG5hbWUsIHN0cmxlbiAobmFtZSksCisJCQkgICAgJmN1cnJlbnRfb2JqZmlsZS0+c3ltYm9sX29ic3RhY2spOworCSAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfQ09OU1Q7CisJICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworCSAgICBTWU1CT0xfVkFMVUUgKHN5bSkgPSBtcy0+Y192YWx1ZTsKKwkgICAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sIHN5bWxpc3QpOworCSAgICBuc3ltcysrOworCSAgICBicmVhazsKKworCSAgY2FzZSBDX0VPUzoKKwkgICAgLyogU29tZXRpbWVzIHRoZSBsaW5rZXIgKG9uIDM4Ni9peCAyLjAuMiBhdCBsZWFzdCkgc2NyZXdzCisJICAgICAgIHVwIHRoZSBjb3VudCBvZiBob3cgbWFueSBzeW1ib2xzIHRvIHJlYWQuICBTbyBzdG9wCisJICAgICAgIG9uIC5lb3MuICAqLworCSAgICBkb25lID0gMTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAvKiBOb3cgZmlsbCBpbiB0aGUgZmllbGRzIG9mIHRoZSB0eXBlLXN0cnVjdHVyZS4gICovCisKKyAgaWYgKGxlbmd0aCA+IDApCisgICAgVFlQRV9MRU5HVEggKHR5cGUpID0gbGVuZ3RoOworICBlbHNlCisgICAgVFlQRV9MRU5HVEggKHR5cGUpID0gVEFSR0VUX0lOVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQ7IC8qIEFzc3VtZSBpbnRzICovCisgIFRZUEVfQ09ERSAodHlwZSkgPSBUWVBFX0NPREVfRU5VTTsKKyAgVFlQRV9ORklFTERTICh0eXBlKSA9IG5zeW1zOworICBUWVBFX0ZJRUxEUyAodHlwZSkgPSAoc3RydWN0IGZpZWxkICopCisgICAgVFlQRV9BTExPQyAodHlwZSwgc2l6ZW9mIChzdHJ1Y3QgZmllbGQpICogbnN5bXMpOworCisgIC8qIEZpbmQgdGhlIHN5bWJvbHMgZm9yIHRoZSB2YWx1ZXMgYW5kIHB1dCB0aGVtIGludG8gdGhlIHR5cGUuCisgICAgIFRoZSBzeW1ib2xzIGNhbiBiZSBmb3VuZCBpbiB0aGUgc3ltbGlzdCB0aGF0IHdlIHB1dCB0aGVtIG9uCisgICAgIHRvIGNhdXNlIHRoZW0gdG8gYmUgZGVmaW5lZC4gIG9zeW1zIGNvbnRhaW5zIHRoZSBvbGQgdmFsdWUKKyAgICAgb2YgdGhhdCBzeW1saXN0OyBldmVyeXRoaW5nIHVwIHRvIHRoZXJlIHdhcyBkZWZpbmVkIGJ5IHVzLiAgKi8KKyAgLyogTm90ZSB0aGF0IHdlIHByZXNlcnZlIHRoZSBvcmRlciBvZiB0aGUgZW51bSBjb25zdGFudHMsIHNvCisgICAgIHRoYXQgaW4gc29tZXRoaW5nIGxpa2UgImVudW0ge0ZPTywgTEFTVF9USElORz1GT099IiB3ZSBwcmludAorICAgICBGT08sIG5vdCBMQVNUX1RISU5HLiAgKi8KKworICBmb3IgKHN5bXMgPSAqc3ltbGlzdCwgbiA9IDA7IHN5bXM7IHN5bXMgPSBzeW1zLT5uZXh0KQorICAgIHsKKyAgICAgIGludCBqID0gMDsKKworICAgICAgaWYgKHN5bXMgPT0gb3N5bXMpCisJaiA9IG9fbnN5bXM7CisgICAgICBmb3IgKDsgaiA8IHN5bXMtPm5zeW1zOyBqKyssbisrKQorCXsKKwkgIHN0cnVjdCBzeW1ib2wgKnhzeW0gPSBzeW1zLT5zeW1ib2xbal07CisJICBTWU1CT0xfVFlQRSAoeHN5bSkgPSB0eXBlOworCSAgVFlQRV9GSUVMRF9OQU1FICh0eXBlLCBuKSA9IFNZTUJPTF9OQU1FICh4c3ltKTsKKwkgIFRZUEVfRklFTERfQklUUE9TICh0eXBlLCBuKSA9IFNZTUJPTF9WQUxVRSAoeHN5bSk7CisJICBpZiAoU1lNQk9MX1ZBTFVFICh4c3ltKSA8IDApCisJICAgIHVuc2lnbmVkX2VudW0gPSAwOworCSAgVFlQRV9GSUVMRF9CSVRTSVpFICh0eXBlLCBuKSA9IDA7CisJfQorICAgICAgaWYgKHN5bXMgPT0gb3N5bXMpCisJYnJlYWs7CisgICAgfQorCisgIGlmICh1bnNpZ25lZF9lbnVtKQorICAgIFRZUEVfRkxBR1MgKHR5cGUpIHw9IFRZUEVfRkxBR19VTlNJR05FRDsKKworICByZXR1cm4gdHlwZTsKK30KKworLyogUmVnaXN0ZXIgb3VyIGFiaWxpdHkgdG8gcGFyc2Ugc3ltYm9scyBmb3IgY29mZiBCRkQgZmlsZXMuICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3ltX2ZucyBjb2ZmX3N5bV9mbnMgPQoreworICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKKyAgY29mZl9uZXdfaW5pdCwJLyogc3ltX25ld19pbml0OiBpbml0IGFueXRoaW5nIGdibCB0byBlbnRpcmUgc3ltdGFiICovCisgIGNvZmZfc3ltZmlsZV9pbml0LAkvKiBzeW1faW5pdDogcmVhZCBpbml0aWFsIGluZm8sIHNldHVwIGZvciBzeW1fcmVhZCgpICovCisgIGNvZmZfc3ltZmlsZV9yZWFkLAkvKiBzeW1fcmVhZDogcmVhZCBhIHN5bWJvbCBmaWxlIGludG8gc3ltdGFiICovCisgIGNvZmZfc3ltZmlsZV9maW5pc2gsCS8qIHN5bV9maW5pc2g6IGZpbmlzaGVkIHdpdGggZmlsZSwgY2xlYW51cCAqLworICBkZWZhdWx0X3N5bWZpbGVfb2Zmc2V0cywKKwkJCS8qIHN5bV9vZmZzZXRzOiAgeGxhdGUgZXh0ZXJuYWwgdG8gaW50ZXJuYWwgZm9ybSAqLworICBOVUxMCQkJLyogbmV4dDogcG9pbnRlciB0byBuZXh0IHN0cnVjdCBzeW1fZm5zICovCit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9jb2ZmcmVhZCAoKQoreworICBhZGRfc3ltdGFiX2ZucyAoJmNvZmZfc3ltX2Zucyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvY29tbWFuZC5jIGIvZ2RiL2NvbW1hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGFmNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbW1hbmQuYwpAQCAtMCwwICsxLDE1NjQgQEAKKy8qIEhhbmRsZSBsaXN0cyBvZiBjb21tYW5kcywgdGhlaXIgZGVjb2RpbmcgYW5kIGRvY3VtZW50YXRpb24sIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9XQUlUX0gKKyMgaW5jbHVkZSA8d2FpdC5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TWVNfV0FJVF9ICisjICBpbmNsdWRlIDxzeXMvd2FpdC5oPgorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJ3YWl0LmgiCisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgdm9pZCB1bmRlZl9jbWRfZXJyb3IgUEFSQU1TICgoY2hhciAqLCBjaGFyICopKTsKKworc3RhdGljIHZvaWQgc2hvd191c2VyIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHNob3dfdXNlcl8xIFBBUkFNUyAoKHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICosIEdEQl9GSUxFICopKTsKKworc3RhdGljIHZvaWQgbWFrZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHNoZWxsX2VzY2FwZSBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgaW50IHBhcnNlX2JpbmFyeV9vcGVyYXRpb24gUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyB2b2lkIHByaW50X2RvY19saW5lIFBBUkFNUyAoKEdEQl9GSUxFICosIGNoYXIgKikpOworCit2b2lkIF9pbml0aWFsaXplX2NvbW1hbmQgUEFSQU1TICgodm9pZCkpOworCisvKiBBZGQgZWxlbWVudCBuYW1lZCBOQU1FLgorICAgQ0xBU1MgaXMgdGhlIHRvcCBsZXZlbCBjYXRlZ29yeSBpbnRvIHdoaWNoIGNvbW1hbmRzIGFyZSBicm9rZW4gZG93bgorICAgZm9yICJoZWxwIiBwdXJwb3Nlcy4KKyAgIEZVTiBzaG91bGQgYmUgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQ7CisgICBpdCB3aWxsIGdldCBhIGNoYXJhY3RlciBzdHJpbmcgYXMgYXJndW1lbnQsIHdpdGggbGVhZGluZworICAgYW5kIHRyYWlsaW5nIGJsYW5rcyBhbHJlYWR5IGVsaW1pbmF0ZWQuCisKKyAgIERPQyBpcyBhIGRvY3VtZW50YXRpb24gc3RyaW5nIGZvciB0aGUgY29tbWFuZC4KKyAgIEl0cyBmaXJzdCBsaW5lIHNob3VsZCBiZSBhIGNvbXBsZXRlIHNlbnRlbmNlLgorICAgSXQgc2hvdWxkIHN0YXJ0IHdpdGggPyBmb3IgYSBjb21tYW5kIHRoYXQgaXMgYW4gYWJicmV2aWF0aW9uCisgICBvciB3aXRoICogZm9yIGEgY29tbWFuZCB0aGF0IG1vc3QgdXNlcnMgZG9uJ3QgbmVlZCB0byBrbm93IGFib3V0LgorCisgICBBZGQgdGhpcyBjb21tYW5kIHRvIGNvbW1hbmQgbGlzdCAqTElTVC4gIAorCisgICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWRkZWQgY29tbWFuZCAobm90IG5lY2Vzc2FyaWx5IHRoZSBoZWFkIAorICAgb2YgKkxJU1QpLiAqLworCitzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqCithZGRfY21kIChuYW1lLCBjbGFzcywgZnVuLCBkb2MsIGxpc3QpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIGVudW0gY29tbWFuZF9jbGFzcyBjbGFzczsKKyAgICAgdm9pZCAoKmZ1bikgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKyAgICAgY2hhciAqZG9jOworICAgICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqKmxpc3Q7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjCisgICAgPSAoc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCkpOworICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqcDsKKworICBkZWxldGVfY21kIChuYW1lLCBsaXN0KTsKKworICBpZiAoKmxpc3QgPT0gTlVMTCB8fCBTVFJDTVAgKCgqbGlzdCktPm5hbWUsIG5hbWUpID49IDApCisgICAgeworICAgICAgYy0+bmV4dCA9ICpsaXN0OworICAgICAgKmxpc3QgPSBjOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHAgPSAqbGlzdDsKKyAgICAgIHdoaWxlIChwLT5uZXh0ICYmIFNUUkNNUCAocC0+bmV4dC0+bmFtZSwgbmFtZSkgPD0gMCkKKyAgICAgICAgeworICAgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICB9CisgICAgICBjLT5uZXh0ID0gcC0+bmV4dDsKKyAgICAgIHAtPm5leHQgPSBjOworICAgIH0KKworICBjLT5uYW1lID0gbmFtZTsKKyAgYy0+Y2xhc3MgPSBjbGFzczsKKyAgYy0+ZnVuY3Rpb24uY2Z1bmMgPSBmdW47CisgIGMtPmRvYyA9IGRvYzsKKyAgYy0+aG9vayA9IE5VTEw7CisgIGMtPnByZWZpeGxpc3QgPSBOVUxMOworICBjLT5wcmVmaXhuYW1lID0gTlVMTDsKKyAgYy0+YWxsb3dfdW5rbm93biA9IDA7CisgIGMtPmFiYnJldl9mbGFnID0gMDsKKyAgYy0+Y29tcGxldGVyID0gbWFrZV9zeW1ib2xfY29tcGxldGlvbl9saXN0OworICBjLT50eXBlID0gbm90X3NldF9jbWQ7CisgIGMtPnZhciA9IE5VTEw7CisgIGMtPnZhcl90eXBlID0gdmFyX2Jvb2xlYW47CisgIGMtPmVudW1zID0gTlVMTDsKKyAgYy0+dXNlcl9jb21tYW5kcyA9IE5VTEw7CisgIGMtPmhvb2tlZSA9IE5VTEw7CisgIGMtPmNtZF9wb2ludGVyID0gTlVMTDsKKworICByZXR1cm4gYzsKK30KKworLyogU2FtZSBhcyBhYm92ZSwgZXhjZXB0IHRoYXQgdGhlIGFiYnJldl9mbGFnIGlzIHNldC4gKi8KKworI2lmIDAJLyogQ3VycmVudGx5IHVudXNlZCAqLworCitzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqCithZGRfYWJicmV2X2NtZCAobmFtZSwgY2xhc3MsIGZ1biwgZG9jLCBsaXN0KQorICAgICBjaGFyICpuYW1lOworICAgICBlbnVtIGNvbW1hbmRfY2xhc3MgY2xhc3M7CisgICAgIHZvaWQgKCpmdW4pIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisgICAgIGNoYXIgKmRvYzsKKyAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKipsaXN0OworeworICByZWdpc3RlciBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqYworICAgID0gYWRkX2NtZCAobmFtZSwgY2xhc3MsIGZ1biwgZG9jLCBsaXN0KTsKKworICBjLT5hYmJyZXZfZmxhZyA9IDE7CisgIHJldHVybiBjOworfQorCisjZW5kaWYKKworc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKgorYWRkX2FsaWFzX2NtZCAobmFtZSwgb2xkbmFtZSwgY2xhc3MsIGFiYnJldl9mbGFnLCBsaXN0KQorICAgICBjaGFyICpuYW1lOworICAgICBjaGFyICpvbGRuYW1lOworICAgICBlbnVtIGNvbW1hbmRfY2xhc3MgY2xhc3M7CisgICAgIGludCBhYmJyZXZfZmxhZzsKKyAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKipsaXN0OworeworICAvKiBNdXN0IGRvIHRoaXMgc2luY2UgbG9va3VwX2NtZCB0cmllcyB0byBzaWRlLWVmZmVjdCBpdHMgZmlyc3QgYXJnICovCisgIGNoYXIgKmNvcGllZF9uYW1lOworICByZWdpc3RlciBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqb2xkOworICByZWdpc3RlciBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqYzsKKyAgY29waWVkX25hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAob2xkbmFtZSkgKyAxKTsKKyAgc3RyY3B5IChjb3BpZWRfbmFtZSwgb2xkbmFtZSk7CisgIG9sZCAgPSBsb29rdXBfY21kICgmY29waWVkX25hbWUsICpsaXN0LCAiIiwgMSwgMSk7CisKKyAgaWYgKG9sZCA9PSAwKQorICAgIHsKKyAgICAgIGRlbGV0ZV9jbWQgKG5hbWUsIGxpc3QpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGMgPSBhZGRfY21kIChuYW1lLCBjbGFzcywgb2xkLT5mdW5jdGlvbi5jZnVuYywgb2xkLT5kb2MsIGxpc3QpOworICBjLT5wcmVmaXhsaXN0ID0gb2xkLT5wcmVmaXhsaXN0OworICBjLT5wcmVmaXhuYW1lID0gb2xkLT5wcmVmaXhuYW1lOworICBjLT5hbGxvd191bmtub3duID0gb2xkLT5hbGxvd191bmtub3duOworICBjLT5hYmJyZXZfZmxhZyA9IGFiYnJldl9mbGFnOworICBjLT5jbWRfcG9pbnRlciA9IG9sZDsKKyAgcmV0dXJuIGM7Cit9CisKKy8qIExpa2UgYWRkX2NtZCBidXQgYWRkcyBhbiBlbGVtZW50IGZvciBhIGNvbW1hbmQgcHJlZml4OgorICAgYSBuYW1lIHRoYXQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgc3ViY29tbWFuZCB0byBiZSBsb29rZWQgdXAKKyAgIGluIGFub3RoZXIgY29tbWFuZCBsaXN0LiAgUFJFRklYTElTVCBzaG91bGQgYmUgdGhlIGFkZHJlc3MKKyAgIG9mIHRoZSB2YXJpYWJsZSBjb250YWluaW5nIHRoYXQgbGlzdC4gICovCisKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICoKK2FkZF9wcmVmaXhfY21kIChuYW1lLCBjbGFzcywgZnVuLCBkb2MsIHByZWZpeGxpc3QsIHByZWZpeG5hbWUsCisJCWFsbG93X3Vua25vd24sIGxpc3QpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIGVudW0gY29tbWFuZF9jbGFzcyBjbGFzczsKKyAgICAgdm9pZCAoKmZ1bikgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKyAgICAgY2hhciAqZG9jOworICAgICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqKnByZWZpeGxpc3Q7CisgICAgIGNoYXIgKnByZWZpeG5hbWU7CisgICAgIGludCBhbGxvd191bmtub3duOworICAgICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqKmxpc3Q7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjID0gYWRkX2NtZCAobmFtZSwgY2xhc3MsIGZ1biwgZG9jLCBsaXN0KTsKKyAgYy0+cHJlZml4bGlzdCA9IHByZWZpeGxpc3Q7CisgIGMtPnByZWZpeG5hbWUgPSBwcmVmaXhuYW1lOworICBjLT5hbGxvd191bmtub3duID0gYWxsb3dfdW5rbm93bjsKKyAgcmV0dXJuIGM7Cit9CisKKy8qIExpa2UgYWRkX3ByZWZpeF9jbWQgYnV0IHNldHMgdGhlIGFiYnJldl9mbGFnIG9uIHRoZSBuZXcgY29tbWFuZC4gKi8KKyAgIAorc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKgorYWRkX2FiYnJldl9wcmVmaXhfY21kIChuYW1lLCBjbGFzcywgZnVuLCBkb2MsIHByZWZpeGxpc3QsIHByZWZpeG5hbWUsCisJCSAgICAgICBhbGxvd191bmtub3duLCBsaXN0KQorICAgICBjaGFyICpuYW1lOworICAgICBlbnVtIGNvbW1hbmRfY2xhc3MgY2xhc3M7CisgICAgIHZvaWQgKCpmdW4pIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisgICAgIGNoYXIgKmRvYzsKKyAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKipwcmVmaXhsaXN0OworICAgICBjaGFyICpwcmVmaXhuYW1lOworICAgICBpbnQgYWxsb3dfdW5rbm93bjsKKyAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKipsaXN0OworeworICByZWdpc3RlciBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqYyA9IGFkZF9jbWQgKG5hbWUsIGNsYXNzLCBmdW4sIGRvYywgbGlzdCk7CisgIGMtPnByZWZpeGxpc3QgPSBwcmVmaXhsaXN0OworICBjLT5wcmVmaXhuYW1lID0gcHJlZml4bmFtZTsKKyAgYy0+YWxsb3dfdW5rbm93biA9IGFsbG93X3Vua25vd247CisgIGMtPmFiYnJldl9mbGFnID0gMTsKKyAgcmV0dXJuIGM7Cit9CisKKy8qIFRoaXMgaXMgYW4gZW1wdHkgImNmdW5jIi4gICovCit2b2lkCitub3RfanVzdF9oZWxwX2NsYXNzX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7Cit9CisKKy8qIFRoaXMgaXMgYW4gZW1wdHkgInNmdW5jIi4gICovCitzdGF0aWMgdm9pZCBlbXB0eV9zZnVuYyBQQVJBTVMgKChjaGFyICosIGludCwgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKikpOworCitzdGF0aWMgdm9pZAorZW1wdHlfc2Z1bmMgKGFyZ3MsIGZyb21fdHR5LCBjKQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7CisgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjOworeworfQorCisvKiBBZGQgZWxlbWVudCBuYW1lZCBOQU1FIHRvIGNvbW1hbmQgbGlzdCBMSVNUICh0aGUgbGlzdCBmb3Igc2V0CisgICBvciBzb21lIHN1Ymxpc3QgdGhlcmVvZikuCisgICBDTEFTUyBpcyBhcyBpbiBhZGRfY21kLgorICAgVkFSX1RZUEUgaXMgdGhlIGtpbmQgb2YgdGhpbmcgd2UgYXJlIHNldHRpbmcuCisgICBWQVIgaXMgYWRkcmVzcyBvZiB0aGUgdmFyaWFibGUgYmVpbmcgY29udHJvbGxlZCBieSB0aGlzIGNvbW1hbmQuCisgICBET0MgaXMgdGhlIGRvY3VtZW50YXRpb24gc3RyaW5nLiAgKi8KKworc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKgorYWRkX3NldF9jbWQgKG5hbWUsIGNsYXNzLCB2YXJfdHlwZSwgdmFyLCBkb2MsIGxpc3QpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIGVudW0gY29tbWFuZF9jbGFzcyBjbGFzczsKKyAgICAgdmFyX3R5cGVzIHZhcl90eXBlOworICAgICBjaGFyICp2YXI7CisgICAgIGNoYXIgKmRvYzsKKyAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKipsaXN0OworeworICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqYworICAgID0gYWRkX2NtZCAobmFtZSwgY2xhc3MsIE5PX0ZVTkNUSU9OLCBkb2MsIGxpc3QpOworCisgIGMtPnR5cGUgPSBzZXRfY21kOworICBjLT52YXJfdHlwZSA9IHZhcl90eXBlOworICBjLT52YXIgPSB2YXI7CisgIC8qIFRoaXMgbmVlZHMgdG8gYmUgc29tZXRoaW5nIGJlc2lkZXMgTk9fRlVOQ1RJT04gc28gdGhhdCB0aGlzIGlzbid0CisgICAgIHRyZWF0ZWQgYXMgYSBoZWxwIGNsYXNzLiAgKi8KKyAgYy0+ZnVuY3Rpb24uc2Z1bmMgPSBlbXB0eV9zZnVuYzsKKyAgcmV0dXJuIGM7Cit9CisKKy8qIEFkZCBlbGVtZW50IG5hbWVkIE5BTUUgdG8gY29tbWFuZCBsaXN0IExJU1QgKHRoZSBsaXN0IGZvciBzZXQKKyAgIG9yIHNvbWUgc3VibGlzdCB0aGVyZW9mKS4KKyAgIENMQVNTIGlzIGFzIGluIGFkZF9jbWQuCisgICBFTlVNTElTVCBpcyBhIGxpc3Qgb2Ygc3RyaW5ncyB3aGljaCBtYXkgZm9sbG93IE5BTUUuCisgICBWQVIgaXMgYWRkcmVzcyBvZiB0aGUgdmFyaWFibGUgd2hpY2ggd2lsbCBjb250YWluIHRoZSBtYXRjaGluZyBzdHJpbmcKKyAgICAgKGZyb20gRU5VTUxJU1QpLgorICAgRE9DIGlzIHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZy4gICovCisKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICoKK2FkZF9zZXRfZW51bV9jbWQgKG5hbWUsIGNsYXNzLCBlbnVtbGlzdCwgdmFyLCBkb2MsIGxpc3QpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIGVudW0gY29tbWFuZF9jbGFzcyBjbGFzczsKKyAgICAgY2hhciAqZW51bWxpc3RbXTsKKyAgICAgY2hhciAqdmFyOworICAgICBjaGFyICpkb2M7CisgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICoqbGlzdDsKK3sKKyAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmMKKyAgICA9IGFkZF9zZXRfY21kIChuYW1lLCBjbGFzcywgdmFyX2VudW0sIHZhciwgZG9jLCBsaXN0KTsKKyAgYy0+ZW51bXMgPSBlbnVtbGlzdDsKKworICByZXR1cm4gYzsKK30KKworLyogV2hlcmUgU0VUQ01EIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQsIGFkZCB0aGUgY29ycmVzcG9uZGluZyBzaG93CisgICBjb21tYW5kIHRvIExJU1QgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGFkZGVkIGNvbW1hbmQgKG5vdCAKKyAgIG5lY2Vzc2FyaWx5IHRoZSBoZWFkIG9mIExJU1QpLiAgKi8KK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICoKK2FkZF9zaG93X2Zyb21fc2V0IChzZXRjbWQsIGxpc3QpCisgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpzZXRjbWQ7CisgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICoqbGlzdDsKK3sKKyAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKnNob3djbWQgPQorICAgIChzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50KSk7CisgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpwOworCisgIG1lbWNweSAoc2hvd2NtZCwgc2V0Y21kLCBzaXplb2YgKHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50KSk7CisgIGRlbGV0ZV9jbWQgKHNob3djbWQtPm5hbWUsIGxpc3QpOworICBzaG93Y21kLT50eXBlID0gc2hvd19jbWQ7CisgIAorICAvKiBSZXBsYWNlICJzZXQgIiBhdCBzdGFydCBvZiBkb2NzdHJpbmcgd2l0aCAic2hvdyAiLiAgKi8KKyAgaWYgKHNldGNtZC0+ZG9jWzBdID09ICdTJyAmJiBzZXRjbWQtPmRvY1sxXSA9PSAnZScKKyAgICAgICYmIHNldGNtZC0+ZG9jWzJdID09ICd0JyAmJiBzZXRjbWQtPmRvY1szXSA9PSAnICcpCisgICAgc2hvd2NtZC0+ZG9jID0gY29uY2F0ICgiU2hvdyAiLCBzZXRjbWQtPmRvYyArIDQsIE5VTEwpOworICBlbHNlCisgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiR0RCIGludGVybmFsIGVycm9yOiBCYWQgZG9jc3RyaW5nIGZvciBzZXQgY29tbWFuZFxuIik7CisgIAorICAgIGlmICgqbGlzdCA9PSBOVUxMIHx8IFNUUkNNUCAoKCpsaXN0KS0+bmFtZSwgc2hvd2NtZC0+bmFtZSkgPj0gMCkKKyAgICB7CisgICAgICBzaG93Y21kLT5uZXh0ID0gKmxpc3Q7CisgICAgICAqbGlzdCA9IHNob3djbWQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcCA9ICpsaXN0OworICAgICAgd2hpbGUgKHAtPm5leHQgJiYgU1RSQ01QIChwLT5uZXh0LT5uYW1lLCBzaG93Y21kLT5uYW1lKSA8PSAwKQorICAgICAgICB7CisgICAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgIH0KKyAgICAgIHNob3djbWQtPm5leHQgPSBwLT5uZXh0OworICAgICAgcC0+bmV4dCA9IHNob3djbWQ7CisgICAgfQorCisgIHJldHVybiBzaG93Y21kOworfQorCisvKiBSZW1vdmUgdGhlIGNvbW1hbmQgbmFtZWQgTkFNRSBmcm9tIHRoZSBjb21tYW5kIGxpc3QuICAqLworCit2b2lkCitkZWxldGVfY21kIChuYW1lLCBsaXN0KQorICAgICBjaGFyICpuYW1lOworICAgICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqKmxpc3Q7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjOworICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqcDsKKworICB3aGlsZSAoKmxpc3QgJiYgU1RSRVEgKCgqbGlzdCktPm5hbWUsIG5hbWUpKQorICAgIHsKKyAgICAgIGlmICgoKmxpc3QpLT5ob29rZWUpCisJKCpsaXN0KS0+aG9va2VlLT5ob29rID0gMDsJLyogSG9vayBzbGlwcyBvdXQgb2YgaXRzIG1vdXRoICovCisgICAgICBwID0gKCpsaXN0KS0+bmV4dDsKKyAgICAgIGZyZWUgKChQVFIpKmxpc3QpOworICAgICAgKmxpc3QgPSBwOworICAgIH0KKworICBpZiAoKmxpc3QpCisgICAgZm9yIChjID0gKmxpc3Q7IGMtPm5leHQ7KQorICAgICAgeworCWlmIChTVFJFUSAoYy0+bmV4dC0+bmFtZSwgbmFtZSkpCisJICB7CisJICAgIGlmIChjLT5uZXh0LT5ob29rZWUpCisJICAgICAgYy0+bmV4dC0+aG9va2VlLT5ob29rID0gMDsgIC8qIGhvb2tlZCBjbWQgZ2V0cyBhd2F5LiAgKi8KKwkgICAgcCA9IGMtPm5leHQtPm5leHQ7CisJICAgIGZyZWUgKChQVFIpYy0+bmV4dCk7CisJICAgIGMtPm5leHQgPSBwOworCSAgfQorCWVsc2UKKwkgIGMgPSBjLT5uZXh0OworICAgICAgfQorfQorCisvKiBUaGlzIGNvbW1hbmQgcmVhbGx5IGhhcyB0byBkZWFsIHdpdGggdHdvIHRoaW5nczoKKyAqICAgICAxKSBJIHdhbnQgZG9jdW1lbnRhdGlvbiBvbiAqdGhpcyBzdHJpbmcqICh1c3VhbGx5IGNhbGxlZCBieQorICogImhlbHAgY29tbWFuZG5hbWUiKS4KKyAqICAgICAyKSBJIHdhbnQgZG9jdW1lbnRhdGlvbiBvbiAqdGhpcyBsaXN0KiAodXN1YWxseSBjYWxsZWQgYnkKKyAqIGdpdmluZyBhIGNvbW1hbmQgdGhhdCByZXF1aXJlcyBzdWJjb21tYW5kcy4gIEFsc28gY2FsbGVkIGJ5IHNheWluZworICoganVzdCAiaGVscCIuKQorICoKKyAqICAgSSBhbSBnb2luZyB0byBzcGxpdCB0aGlzIGludG8gdHdvIHNlcGVyYXRlIGNvbWFtbmRzLCBoZWxwX2NtZCBhbmQKKyAqIGhlbHBfbGlzdC4gCisgKi8KKwordm9pZAoraGVscF9jbWQgKGNvbW1hbmQsIHN0cmVhbSkKKyAgICAgY2hhciAqY29tbWFuZDsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7CisgIGV4dGVybiBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqY21kbGlzdDsKKworICBpZiAoIWNvbW1hbmQpCisgICAgeworICAgICAgaGVscF9saXN0IChjbWRsaXN0LCAiIiwgYWxsX2NsYXNzZXMsIHN0cmVhbSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGMgPSBsb29rdXBfY21kICgmY29tbWFuZCwgY21kbGlzdCwgIiIsIDAsIDApOworCisgIGlmIChjID09IDApCisgICAgcmV0dXJuOworCisgIC8qIFRoZXJlIGFyZSB0aHJlZSBjYXNlcyBoZXJlLgorICAgICBJZiBjLT5wcmVmaXhsaXN0IGlzIG5vbnplcm8sIHdlIGhhdmUgYSBwcmVmaXggY29tbWFuZC4KKyAgICAgUHJpbnQgaXRzIGRvY3VtZW50YXRpb24sIHRoZW4gbGlzdCBpdHMgc3ViY29tbWFuZHMuCisgICAgIAorICAgICBJZiBjLT5mdW5jdGlvbiBpcyBub256ZXJvLCB3ZSByZWFsbHkgaGF2ZSBhIGNvbW1hbmQuCisgICAgIFByaW50IGl0cyBkb2N1bWVudGF0aW9uIGFuZCByZXR1cm4uCisgICAgIAorICAgICBJZiBjLT5mdW5jdGlvbiBpcyB6ZXJvLCB3ZSBoYXZlIGEgY2xhc3MgbmFtZS4KKyAgICAgUHJpbnQgaXRzIGRvY3VtZW50YXRpb24gKGFzIGlmIGl0IHdlcmUgYSBjb21tYW5kKQorICAgICBhbmQgdGhlbiBzZXQgY2xhc3MgdG8gdGhlIG51bWJlciBvZiB0aGlzIGNsYXNzCisgICAgIHNvIHRoYXQgdGhlIGNvbW1hbmRzIGluIHRoZSBjbGFzcyB3aWxsIGJlIGxpc3RlZC4gICovCisKKyAgZnB1dHNfZmlsdGVyZWQgKGMtPmRvYywgc3RyZWFtKTsKKyAgZnB1dHNfZmlsdGVyZWQgKCJcbiIsIHN0cmVhbSk7CisKKyAgaWYgKGMtPnByZWZpeGxpc3QgPT0gMCAmJiBjLT5mdW5jdGlvbi5jZnVuYyAhPSBOVUxMKQorICAgIHJldHVybjsKKyAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiXG4iKTsKKworICAvKiBJZiB0aGlzIGlzIGEgcHJlZml4IGNvbW1hbmQsIHByaW50IGl0J3Mgc3ViY29tbWFuZHMgKi8KKyAgaWYgKGMtPnByZWZpeGxpc3QpCisgICAgaGVscF9saXN0ICgqYy0+cHJlZml4bGlzdCwgYy0+cHJlZml4bmFtZSwgYWxsX2NvbW1hbmRzLCBzdHJlYW0pOworCisgIC8qIElmIHRoaXMgaXMgYSBjbGFzcyBuYW1lLCBwcmludCBhbGwgb2YgdGhlIGNvbW1hbmRzIGluIHRoZSBjbGFzcyAqLworICBpZiAoYy0+ZnVuY3Rpb24uY2Z1bmMgPT0gTlVMTCkKKyAgICBoZWxwX2xpc3QgKGNtZGxpc3QsICIiLCBjLT5jbGFzcywgc3RyZWFtKTsKKworICBpZiAoYy0+aG9vaykKKyAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJcblRoaXMgY29tbWFuZCBoYXMgYSBob29rIGRlZmluZWQ6ICVzXG4iLAorCQkgICAgICBjLT5ob29rLT5uYW1lKTsKK30KKworLyoKKyAqIEdldCBhIHNwZWNpZmljIGtpbmQgb2YgaGVscCBvbiBhIGNvbW1hbmQgbGlzdC4KKyAqCisgKiBMSVNUIGlzIHRoZSBsaXN0LgorICogQ01EVFlQRSBpcyB0aGUgcHJlZml4IHRvIHVzZSBpbiB0aGUgdGl0bGUgc3RyaW5nLgorICogQ0xBU1MgaXMgdGhlIGNsYXNzIHdpdGggd2hpY2ggdG8gbGlzdCB0aGUgbm9kZXMgb2YgdGhpcyBsaXN0IChzZWUKKyAqIGRvY3VtZW50YXRpb24gZm9yIGhlbHBfY21kX2xpc3QgYmVsb3cpLCAgQXMgdXN1YWwsIEFMTF9DT01NQU5EUyBmb3IKKyAqIGV2ZXJ5dGhpbmcsIEFMTF9DTEFTU0VTIGZvciBqdXN0IGNsYXNzZXMsIGFuZCBub24tbmVnYXRpdmUgZm9yIG9ubHkgdGhpbmdzCisgKiBpbiBhIHNwZWNpZmljIGNsYXNzLgorICogYW5kIFNUUkVBTSBpcyB0aGUgb3V0cHV0IHN0cmVhbSBvbiB3aGljaCB0byBwcmludCB0aGluZ3MuCisgKiBJZiB5b3UgY2FsbCB0aGlzIHJvdXRpbmUgd2l0aCBhIGNsYXNzID49IDAsIGl0IHJlY3Vyc2VzLgorICovCit2b2lkCitoZWxwX2xpc3QgKGxpc3QsIGNtZHR5cGUsIGNsYXNzLCBzdHJlYW0pCisgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpsaXN0OworICAgICBjaGFyICpjbWR0eXBlOworICAgICBlbnVtIGNvbW1hbmRfY2xhc3MgY2xhc3M7CisgICAgIEdEQl9GSUxFICpzdHJlYW07Cit7CisgIGludCBsZW47CisgIGNoYXIgKmNtZHR5cGUxLCAqY21kdHlwZTI7CisgIAorICAvKiBJZiBDTURUWVBFIGlzICJmb28gIiwgQ01EVFlQRTEgZ2V0cyAiIGZvbyIgYW5kIENNRFRZUEUyIGdldHMgImZvbyBzdWIiICAqLworICBsZW4gPSBzdHJsZW4gKGNtZHR5cGUpOworICBjbWR0eXBlMSA9IChjaGFyICopIGFsbG9jYSAobGVuICsgMSk7CisgIGNtZHR5cGUxWzBdID0gMDsKKyAgY21kdHlwZTIgPSAoY2hhciAqKSBhbGxvY2EgKGxlbiArIDQpOworICBjbWR0eXBlMlswXSA9IDA7CisgIGlmIChsZW4pCisgICAgeworICAgICAgY21kdHlwZTFbMF0gPSAnICc7CisgICAgICBzdHJuY3B5IChjbWR0eXBlMSArIDEsIGNtZHR5cGUsIGxlbiAtIDEpOworICAgICAgY21kdHlwZTFbbGVuXSA9IDA7CisgICAgICBzdHJuY3B5IChjbWR0eXBlMiwgY21kdHlwZSwgbGVuIC0gMSk7CisgICAgICBzdHJjcHkgKGNtZHR5cGUyICsgbGVuIC0gMSwgIiBzdWIiKTsKKyAgICB9CisKKyAgaWYgKGNsYXNzID09IGFsbF9jbGFzc2VzKQorICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIkxpc3Qgb2YgY2xhc3NlcyBvZiAlc2NvbW1hbmRzOlxuXG4iLCBjbWR0eXBlMik7CisgIGVsc2UKKyAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJMaXN0IG9mICVzY29tbWFuZHM6XG5cbiIsIGNtZHR5cGUyKTsKKworICBoZWxwX2NtZF9saXN0IChsaXN0LCBjbGFzcywgY21kdHlwZSwgKGludCljbGFzcyA+PSAwLCBzdHJlYW0pOworCisgIGlmIChjbGFzcyA9PSBhbGxfY2xhc3NlcykKKyAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJcblwKK1R5cGUgXCJoZWxwJXNcIiBmb2xsb3dlZCBieSBhIGNsYXNzIG5hbWUgZm9yIGEgbGlzdCBvZiBjb21tYW5kcyBpbiB0aGF0IGNsYXNzLiIsCisJICAgICBjbWR0eXBlMSk7CisKKyAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiXG5cCitUeXBlIFwiaGVscCVzXCIgZm9sbG93ZWQgYnkgJXNjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi5cblwKK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLlxuIiwKKwkgICBjbWR0eXBlMSwgY21kdHlwZTIpOworfQorICAgICAKKy8qIFByaW50IG9ubHkgdGhlIGZpcnN0IGxpbmUgb2YgU1RSIG9uIFNUUkVBTS4gICovCitzdGF0aWMgdm9pZAorcHJpbnRfZG9jX2xpbmUgKHN0cmVhbSwgc3RyKQorICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBjaGFyICpzdHI7Cit7CisgIHN0YXRpYyBjaGFyICpsaW5lX2J1ZmZlciA9IDA7CisgIHN0YXRpYyBpbnQgbGluZV9zaXplOworICByZWdpc3RlciBjaGFyICpwOworCisgIGlmICghbGluZV9idWZmZXIpCisgICAgeworICAgICAgbGluZV9zaXplID0gODA7CisgICAgICBsaW5lX2J1ZmZlciA9IChjaGFyICopIHhtYWxsb2MgKGxpbmVfc2l6ZSk7CisgICAgfQorCisgIHAgPSBzdHI7CisgIHdoaWxlICgqcCAmJiAqcCAhPSAnXG4nICYmICpwICE9ICcuJyAmJiAqcCAhPSAnLCcpCisgICAgcCsrOworICBpZiAocCAtIHN0ciA+IGxpbmVfc2l6ZSAtIDEpCisgICAgeworICAgICAgbGluZV9zaXplID0gcCAtIHN0ciArIDE7CisgICAgICBmcmVlICgoUFRSKWxpbmVfYnVmZmVyKTsKKyAgICAgIGxpbmVfYnVmZmVyID0gKGNoYXIgKikgeG1hbGxvYyAobGluZV9zaXplKTsKKyAgICB9CisgIHN0cm5jcHkgKGxpbmVfYnVmZmVyLCBzdHIsIHAgLSBzdHIpOworICBsaW5lX2J1ZmZlcltwIC0gc3RyXSA9ICdcMCc7CisgIGlmIChpc2xvd2VyIChsaW5lX2J1ZmZlclswXSkpCisgICAgbGluZV9idWZmZXJbMF0gPSB0b3VwcGVyIChsaW5lX2J1ZmZlclswXSk7CisgIGZwdXRzX2ZpbHRlcmVkIChsaW5lX2J1ZmZlciwgc3RyZWFtKTsKK30KKworLyoKKyAqIEltcGxlbWVudCBhIGhlbHAgY29tbWFuZCBvbiBjb21tYW5kIGxpc3QgTElTVC4KKyAqIFJFQ1VSU0Ugc2hvdWxkIGJlIG5vbi16ZXJvIGlmIHRoaXMgc2hvdWxkIGJlIGRvbmUgcmVjdXJzaXZlbHkgb24KKyAqIGFsbCBzdWJsaXN0cyBvZiBMSVNULgorICogUFJFRklYIGlzIHRoZSBwcmVmaXggdG8gcHJpbnQgYmVmb3JlIGVhY2ggY29tbWFuZCBuYW1lLgorICogU1RSRUFNIGlzIHRoZSBzdHJlYW0gdXBvbiB3aGljaCB0aGUgb3V0cHV0IHNob3VsZCBiZSB3cml0dGVuLgorICogQ0xBU1Mgc2hvdWxkIGJlOgorICoJQSBub24tbmVnYXRpdmUgY2xhc3MgbnVtYmVyIHRvIGxpc3Qgb25seSBjb21tYW5kcyBpbiB0aGF0CisgKiBjbGFzcy4KKyAqCUFMTF9DT01NQU5EUyB0byBsaXN0IGFsbCBjb21tYW5kcyBpbiBsaXN0LgorICoJQUxMX0NMQVNTRVMgIHRvIGxpc3QgYWxsIGNsYXNzZXMgaW4gbGlzdC4KKyAqCisgKiAgIE5vdGUgdGhhdCBSRUNVUlNFIHdpbGwgYmUgYWN0aXZlIG9uICphbGwqIHN1Ymxpc3RzLCBub3QganVzdCB0aGUKKyAqIG9uZXMgc2VsZWN0ZWQgYnkgdGhlIGNyaXRlcmlhIGFib3ZlIChpZS4gdGhlIHNlbGVjdGlvbiBtZWNoYW5pc20KKyAqIGlzIGF0IHRoZSBsb3cgbGV2ZWwsIG5vdCB0aGUgaGlnaC1sZXZlbCkuCisgKi8KK3ZvaWQKK2hlbHBfY21kX2xpc3QgKGxpc3QsIGNsYXNzLCBwcmVmaXgsIHJlY3Vyc2UsIHN0cmVhbSkKKyAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmxpc3Q7CisgICAgIGVudW0gY29tbWFuZF9jbGFzcyBjbGFzczsKKyAgICAgY2hhciAqcHJlZml4OworICAgICBpbnQgcmVjdXJzZTsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7CisKKyAgZm9yIChjID0gbGlzdDsgYzsgYyA9IGMtPm5leHQpCisgICAgeworICAgICAgaWYgKGMtPmFiYnJldl9mbGFnID09IDAgJiYKKwkgIChjbGFzcyA9PSBhbGxfY29tbWFuZHMKKwkgIHx8IChjbGFzcyA9PSBhbGxfY2xhc3NlcyAmJiBjLT5mdW5jdGlvbi5jZnVuYyA9PSBOVUxMKQorCSAgfHwgKGNsYXNzID09IGMtPmNsYXNzICYmIGMtPmZ1bmN0aW9uLmNmdW5jICE9IE5VTEwpKSkKKwl7CisJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlcyVzIC0tICIsIHByZWZpeCwgYy0+bmFtZSk7CisJICBwcmludF9kb2NfbGluZSAoc3RyZWFtLCBjLT5kb2MpOworCSAgZnB1dHNfZmlsdGVyZWQgKCJcbiIsIHN0cmVhbSk7CisJfQorICAgICAgaWYgKHJlY3Vyc2UKKwkgICYmIGMtPnByZWZpeGxpc3QgIT0gMAorCSAgJiYgYy0+YWJicmV2X2ZsYWcgPT0gMCkKKwloZWxwX2NtZF9saXN0ICgqYy0+cHJlZml4bGlzdCwgY2xhc3MsIGMtPnByZWZpeG5hbWUsIDEsIHN0cmVhbSk7CisgICAgfQorfQorCisMCisvKiBTZWFyY2ggdGhlIGlucHV0IGNsaXN0IGZvciAnY29tbWFuZCcuICBSZXR1cm4gdGhlIGNvbW1hbmQgaWYKKyAgIGZvdW5kIChvciBOVUxMIGlmIG5vdCksIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBjb21tYW5kcworICAgZm91bmQgaW4gbmZvdW5kICovCisKK3N0YXRpYyBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqCitmaW5kX2NtZChjb21tYW5kLCBsZW4sIGNsaXN0LCBpZ25vcmVfaGVscF9jbGFzc2VzLCBuZm91bmQpCisgICAgIGNoYXIgKmNvbW1hbmQ7CisgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjbGlzdDsKKyAgICAgaW50IGlnbm9yZV9oZWxwX2NsYXNzZXM7CisgICAgIGludCAqbmZvdW5kOworeworICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqZm91bmQsICpjOworCisgIGZvdW5kID0gKHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICopTlVMTDsKKyAgKm5mb3VuZCA9IDA7CisgIGZvciAoYyA9IGNsaXN0OyBjOyBjID0gYy0+bmV4dCkKKyAgICBpZiAoIXN0cm5jbXAgKGNvbW1hbmQsIGMtPm5hbWUsIGxlbikKKyAgICAgICAgJiYgKCFpZ25vcmVfaGVscF9jbGFzc2VzIHx8IGMtPmZ1bmN0aW9uLmNmdW5jKSkKKyAgICAgIHsKKyAgICAgICAgZm91bmQgPSBjOworICAgICAgICAoKm5mb3VuZCkrKzsKKyAgICAgICAgaWYgKGMtPm5hbWVbbGVuXSA9PSAnXDAnKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICpuZm91bmQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgfQorICByZXR1cm4gZm91bmQ7Cit9CisKKy8qIFRoaXMgcm91dGluZSB0YWtlcyBhIGxpbmUgb2YgVEVYVCBhbmQgYSBDTElTVCBpbiB3aGljaCB0byBzdGFydCB0aGUKKyAgIGxvb2t1cC4gIFdoZW4gaXQgcmV0dXJucyBpdCB3aWxsIGhhdmUgaW5jcmVtZW50ZWQgdGhlIHRleHQgcG9pbnRlciBwYXN0CisgICB0aGUgc2VjdGlvbiBvZiB0ZXh0IGl0IG1hdGNoZWQsIHNldCAqUkVTVUxUX0xJU1QgdG8gcG9pbnQgdG8gdGhlIGxpc3QgaW4KKyAgIHdoaWNoIHRoZSBsYXN0IHdvcmQgd2FzIG1hdGNoZWQsIGFuZCB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNtZAorICAgbGlzdCBlbGVtZW50IHdoaWNoIHRoZSB0ZXh0IG1hdGNoZXMuICBJdCB3aWxsIHJldHVybiBOVUxMIGlmIG5vIG1hdGNoIGF0CisgICBhbGwgd2FzIHBvc3NpYmxlLiAgSXQgd2lsbCByZXR1cm4gLTEgKGNhc3QgYXBwcm9wcmlhdGVseSwgaWNrKSBpZiBhbWJpZ291cworICAgbWF0Y2hlcyBhcmUgcG9zc2libGU7IGluIHRoaXMgY2FzZSAqUkVTVUxUX0xJU1Qgd2lsbCBiZSBzZXQgdG8gcG9pbnQgdG8KKyAgIHRoZSBsaXN0IGluIHdoaWNoIHRoZXJlIGFyZSBhbWJpZ3VvdXMgY2hvaWNlcyAoYW5kICpURVhUIHdpbGwgYmUgc2V0IHRvCisgICB0aGUgYW1iaWd1b3VzIHRleHQgc3RyaW5nKS4KKworICAgSWYgdGhlIGxvY2F0ZWQgY29tbWFuZCB3YXMgYW4gYWJicmV2aWF0aW9uLCB0aGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgYmFzZQorICAgY29tbWFuZCBvZiB0aGUgYWJicmV2aWF0aW9uLgorCisgICBJdCBkb2VzIG5vIGVycm9yIHJlcG9ydGluZyB3aGF0c29ldmVyOyBjb250cm9sIHdpbGwgYWx3YXlzIHJldHVybgorICAgdG8gdGhlIHN1cGVyaW9yIHJvdXRpbmUuCisKKyAgIEluIHRoZSBjYXNlIG9mIGFuIGFtYmlndW91cyByZXR1cm4gKC0xKSwgKlJFU1VMVF9MSVNUIHdpbGwgYmUgc2V0IHRvIHBvaW50CisgICBhdCB0aGUgcHJlZml4X2NvbW1hbmQgKGllLiB0aGUgYmVzdCBtYXRjaCkgKm9yKiAoc3BlY2lhbCBjYXNlKSB3aWxsIGJlIE5VTEwKKyAgIGlmIG5vIHByZWZpeCBjb21tYW5kIHdhcyBldmVyIGZvdW5kLiAgRm9yIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mICJpbmZvIGEiLAorICAgImluZm8iIG1hdGNoZXMgd2l0aG91dCBhbWJpZ3VpdHksIGJ1dCAiYSIgY291bGQgYmUgImFyZ3MiIG9yICJhZGRyZXNzIiwgc28KKyAgICpSRVNVTFRfTElTVCBpcyBzZXQgdG8gdGhlIGNtZF9saXN0X2VsZW1lbnQgZm9yICJpbmZvIi4gIFNvIGluIHRoaXMgY2FzZQorICAgUkVTVUxUX0xJU1Qgc2hvdWxkIG5vdCBiZSBpbnRlcnBldGVkIGFzIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGEKKyAgIGxpc3Q7IGl0IHNpbXBseSBwb2ludHMgdG8gYSBzcGVjaWZpYyBjb21tYW5kLiAgSW4gdGhlIGNhc2Ugb2YgYW4gYW1iaWd1b3VzCisgICByZXR1cm4gKlRFWFQgaXMgYWR2YW5jZWQgcGFzdCB0aGUgbGFzdCBub24tYW1iaWd1b3VzIHByZWZpeCAoZS5nLgorICAgImluZm8gdCIgY2FuIGJlICJpbmZvIHR5cGVzIiBvciAiaW5mbyB0YXJnZXQiOyB1cG9uIHJldHVybiAqVEVYVCBoYXMgYmVlbgorICAgYWR2YW5jZWQgcGFzdCAiaW5mbyAiKS4KKworICAgSWYgUkVTVUxUX0xJU1QgaXMgTlVMTCwgZG9uJ3Qgc2V0ICpSRVNVTFRfTElTVCAoYnV0IGRvbid0IG90aGVyd2lzZQorICAgYWZmZWN0IHRoZSBvcGVyYXRpb24pLgorCisgICBUaGlzIHJvdXRpbmUgZG9lcyAqbm90KiBtb2RpZnkgdGhlIHRleHQgcG9pbnRlZCB0byBieSBURVhULgorICAgCisgICBJZiBJR05PUkVfSEVMUF9DTEFTU0VTIGlzIG5vbnplcm8sIGlnbm9yZSBhbnkgY29tbWFuZCBsaXN0IGVsZW1lbnRzIHdoaWNoCisgICBhcmUgYWN0dWFsbHkgaGVscCBjbGFzc2VzIHJhdGhlciB0aGFuIGNvbW1hbmRzIChpLmUuIHRoZSBmdW5jdGlvbiBmaWVsZCBvZgorICAgdGhlIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50IGlzIE5VTEwpLiAgKi8KKworc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKgorbG9va3VwX2NtZF8xICh0ZXh0LCBjbGlzdCwgcmVzdWx0X2xpc3QsIGlnbm9yZV9oZWxwX2NsYXNzZXMpCisgICAgIGNoYXIgKip0ZXh0OworICAgICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqY2xpc3QsICoqcmVzdWx0X2xpc3Q7CisgICAgIGludCBpZ25vcmVfaGVscF9jbGFzc2VzOworeworICBjaGFyICpwLCAqY29tbWFuZDsKKyAgaW50IGxlbiwgdG1wLCBuZm91bmQ7CisgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpmb3VuZCwgKmM7CisKKyAgd2hpbGUgKCoqdGV4dCA9PSAnICcgfHwgKip0ZXh0ID09ICdcdCcpCisgICAgKCp0ZXh0KSsrOworCisgIC8qIFRyZWF0aW5nIHVuZGVyc2NvcmVzIGFzIHBhcnQgb2YgY29tbWFuZCB3b3JkcyBpcyBpbXBvcnRhbnQKKyAgICAgc28gdGhhdCAic2V0IGFyZ3NfZm9vKCkiIGRvZXNuJ3QgZ2V0IGludGVycHJldGVkIGFzCisgICAgICJzZXQgYXJncyBfZm9vKCkiLiAgKi8KKyAgZm9yIChwID0gKnRleHQ7CisgICAgICAgKnAgJiYgKGlzYWxudW0oKnApIHx8ICpwID09ICctJyB8fCAqcCA9PSAnXycgfHwKKwkgICAgICAodHVpX3ZlcnNpb24gJiYKKwkgICAgICAgKCpwID09ICcrJyB8fCAqcCA9PSAnPCcgfHwgKnAgPT0gJz4nIHx8ICpwID09ICckJykpIHx8CisJICAgICAgKHhkYl9jb21tYW5kcyAmJiAoKnAgPT0gJyEnIHx8ICpwID09ICcvJyB8fCAqcCA9PSAnPycpKSk7CisgICAgICAgcCsrKQorICAgIDsKKworICAvKiBJZiBub3RoaW5nIGJ1dCB3aGl0ZXNwYWNlLCByZXR1cm4gMC4gICovCisgIGlmIChwID09ICp0ZXh0KQorICAgIHJldHVybiAwOworICAKKyAgbGVuID0gcCAtICp0ZXh0OworCisgIC8qICp0ZXh0IGFuZCBwIG5vdyBicmFja2V0IHRoZSBmaXJzdCBjb21tYW5kIHdvcmQgdG8gbG9va3VwIChhbmQKKyAgICAgaXQncyBsZW5ndGggaXMgbGVuKS4gIFdlIGNvcHkgdGhpcyBpbnRvIGEgbG9jYWwgdGVtcG9yYXJ5ICovCisKKworICBjb21tYW5kID0gKGNoYXIgKikgYWxsb2NhIChsZW4gKyAxKTsKKyAgZm9yICh0bXAgPSAwOyB0bXAgPCBsZW47IHRtcCsrKQorICAgIHsKKyAgICAgIGNoYXIgeCA9ICgqdGV4dClbdG1wXTsKKyAgICAgIGNvbW1hbmRbdG1wXSA9IHg7CisgICAgfQorICBjb21tYW5kW2xlbl0gPSAnXDAnOworCisgIC8qIExvb2sgaXQgdXAuICAqLworICBmb3VuZCA9IDA7CisgIG5mb3VuZCA9IDA7CisgIGZvdW5kID0gZmluZF9jbWQoY29tbWFuZCwgbGVuLCBjbGlzdCwgaWdub3JlX2hlbHBfY2xhc3NlcywgJm5mb3VuZCk7CisKKyAgLyogCisgICoqIFdlIGRpZG4ndCBmaW5kIHRoZSBjb21tYW5kIGluIHRoZSBlbnRlcmVkIGNhc2UsIHNvIGxvd2VyIGNhc2UgaXQKKyAgKiogYW5kIHNlYXJjaCBhZ2Fpbi4KKyAgKi8KKyAgaWYgKCFmb3VuZCB8fCBuZm91bmQgPT0gMCkKKyAgICB7CisgICAgICBmb3IgKHRtcCA9IDA7IHRtcCA8IGxlbjsgdG1wKyspCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyIHggPSBjb21tYW5kW3RtcF07CisgICAgICAgICAgY29tbWFuZFt0bXBdID0gaXN1cHBlcih4KSA/IHRvbG93ZXIoeCkgOiB4OworICAgICAgICB9CisgICAgICBmb3VuZCA9IGZpbmRfY21kKGNvbW1hbmQsIGxlbiwgY2xpc3QsIGlnbm9yZV9oZWxwX2NsYXNzZXMsICZuZm91bmQpOworICAgIH0KKworICAvKiBJZiBub3RoaW5nIG1hdGNoZXMsIHdlIGhhdmUgYSBzaW1wbGUgZmFpbHVyZS4gICovCisgIGlmIChuZm91bmQgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBpZiAobmZvdW5kID4gMSkKKyAgICB7CisgICAgICBpZiAocmVzdWx0X2xpc3QgIT0gTlVMTCkKKwkvKiBXaWxsIGJlIG1vZGlmaWVkIGluIGNhbGxpbmcgcm91dGluZQorCSAgIGlmIHdlIGtub3cgd2hhdCB0aGUgcHJlZml4IGNvbW1hbmQgaXMuICAqLworCSpyZXN1bHRfbGlzdCA9IDA7CQkKKyAgICAgIHJldHVybiAoc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKikgLTE7IC8qIEFtYmlndW91cy4gICovCisgICAgfQorCisgIC8qIFdlJ3ZlIG1hdGNoZWQgc29tZXRoaW5nIG9uIHRoaXMgbGlzdC4gIE1vdmUgdGV4dCBwb2ludGVyIGZvcndhcmQuICovCisKKyAgKnRleHQgPSBwOworCisgIC8qIElmIHRoaXMgd2FzIGFuIGFiYnJldmlhdGlvbiwgdXNlIHRoZSBiYXNlIGNvbW1hbmQgaW5zdGVhZC4gICovCisKKyAgaWYgKGZvdW5kLT5jbWRfcG9pbnRlcikKKyAgICBmb3VuZCA9IGZvdW5kLT5jbWRfcG9pbnRlcjsKKworICAvKiBJZiB3ZSBmb3VuZCBhIHByZWZpeCBjb21tYW5kLCBrZWVwIGxvb2tpbmcuICAqLworCisgIGlmIChmb3VuZC0+cHJlZml4bGlzdCkKKyAgICB7CisgICAgICBjID0gbG9va3VwX2NtZF8xICh0ZXh0LCAqZm91bmQtPnByZWZpeGxpc3QsIHJlc3VsdF9saXN0LAorCQkJaWdub3JlX2hlbHBfY2xhc3Nlcyk7CisgICAgICBpZiAoIWMpCisJeworCSAgLyogRGlkbid0IGZpbmQgYW55dGhpbmc7IHRoaXMgaXMgYXMgZmFyIGFzIHdlIGdvdC4gICovCisJICBpZiAocmVzdWx0X2xpc3QgIT0gTlVMTCkKKwkgICAgKnJlc3VsdF9saXN0ID0gY2xpc3Q7CisJICByZXR1cm4gZm91bmQ7CisJfQorICAgICAgZWxzZSBpZiAoYyA9PSAoc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKikgLTEpCisJeworCSAgLyogV2UndmUgZ290dGVuIHRoaXMgZmFyIHByb3Blcmx5LCBidXQgdGhlIG5leHQgc3RlcAorCSAgICAgaXMgYW1iaWd1b3VzLiAgV2UgbmVlZCB0byBzZXQgdGhlIHJlc3VsdCBsaXN0IHRvIHRoZSBiZXN0CisJICAgICB3ZSd2ZSBmb3VuZCAoaWYgYW4gaW5mZXJpb3IgaGFzbid0IGFscmVhZHkgc2V0IGl0KS4gICovCisJICBpZiAocmVzdWx0X2xpc3QgIT0gTlVMTCkKKwkgICAgaWYgKCEqcmVzdWx0X2xpc3QpCisJICAgICAgLyogVGhpcyB1c2VkIHRvIHNheSAqcmVzdWx0X2xpc3QgPSAqZm91bmQtPnByZWZpeGxpc3QKKwkJIElmIHRoYXQgd2FzIGNvcnJlY3QsIG5lZWQgdG8gbW9kaWZ5IHRoZSBkb2N1bWVudGF0aW9uCisJCSBhdCB0aGUgdG9wIG9mIHRoaXMgZnVuY3Rpb24gdG8gY2xhcmlmeSB3aGF0IGlzIHN1cHBvc2VkCisJCSB0byBiZSBnb2luZyBvbi4gICovCisJICAgICAgKnJlc3VsdF9saXN0ID0gZm91bmQ7CisJICByZXR1cm4gYzsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogV2UgbWF0Y2hlZCEgICovCisJICByZXR1cm4gYzsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHJlc3VsdF9saXN0ICE9IE5VTEwpCisJKnJlc3VsdF9saXN0ID0gY2xpc3Q7CisgICAgICByZXR1cm4gZm91bmQ7CisgICAgfQorfQorCisvKiBBbGwgdGhpcyBoYWlyIHRvIG1vdmUgdGhlIHNwYWNlIHRvIHRoZSBmcm9udCBvZiBjbWR0eXBlICovCisKK3N0YXRpYyB2b2lkCit1bmRlZl9jbWRfZXJyb3IgKGNtZHR5cGUsIHEpCisgICAgIGNoYXIgKmNtZHR5cGUsICpxOworeworICBlcnJvciAoIlVuZGVmaW5lZCAlc2NvbW1hbmQ6IFwiJXNcIi4gIFRyeSBcImhlbHAlcyUuKnNcIi4iLAorICAgIGNtZHR5cGUsCisgICAgcSwKKyAgICAqY21kdHlwZT8gIiAiOiAiIiwKKyAgICBzdHJsZW4oY21kdHlwZSktMSwKKyAgICBjbWR0eXBlKTsKK30KKworLyogTG9vayB1cCB0aGUgY29udGVudHMgb2YgKkxJTkUgYXMgYSBjb21tYW5kIGluIHRoZSBjb21tYW5kIGxpc3QgTElTVC4KKyAgIExJU1QgaXMgYSBjaGFpbiBvZiBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCdzLgorICAgSWYgaXQgaXMgZm91bmQsIHJldHVybiB0aGUgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgZm9yIHRoYXQgY29tbWFuZAorICAgYW5kIHVwZGF0ZSAqTElORSB0byBwb2ludCBhZnRlciB0aGUgY29tbWFuZCBuYW1lLCBhdCB0aGUgZmlyc3QgYXJndW1lbnQuCisgICBJZiBub3QgZm91bmQsIGNhbGwgZXJyb3IgaWYgQUxMT1dfVU5LTk9XTiBpcyB6ZXJvCisgICBvdGhlcndpc2UgKG9yIGlmIGVycm9yIHJldHVybnMpIHJldHVybiB6ZXJvLgorICAgQ2FsbCBlcnJvciBpZiBzcGVjaWZpZWQgY29tbWFuZCBpcyBhbWJpZ3VvdXMsCisgICB1bmxlc3MgQUxMT1dfVU5LTk9XTiBpcyBuZWdhdGl2ZS4KKyAgIENNRFRZUEUgcHJlY2VkZXMgdGhlIHdvcmQgImNvbW1hbmQiIGluIHRoZSBlcnJvciBtZXNzYWdlLgorCisgICBJZiBJTkdOT1JFX0hFTFBfQ0xBU1NFUyBpcyBub256ZXJvLCBpZ25vcmUgYW55IGNvbW1hbmQgbGlzdAorICAgZWxlbWVudHMgd2hpY2ggYXJlIGFjdHVhbGx5IGhlbHAgY2xhc3NlcyByYXRoZXIgdGhhbiBjb21tYW5kcyAoaS5lLgorICAgdGhlIGZ1bmN0aW9uIGZpZWxkIG9mIHRoZSBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCBpcyAwKS4gICovCisKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICoKK2xvb2t1cF9jbWQgKGxpbmUsIGxpc3QsIGNtZHR5cGUsIGFsbG93X3Vua25vd24sIGlnbm9yZV9oZWxwX2NsYXNzZXMpCisgICAgIGNoYXIgKipsaW5lOworICAgICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqbGlzdDsKKyAgICAgY2hhciAqY21kdHlwZTsKKyAgICAgaW50IGFsbG93X3Vua25vd247CisgICAgIGludCBpZ25vcmVfaGVscF9jbGFzc2VzOworeworICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqbGFzdF9saXN0ID0gMDsKKyAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmMgPQorICAgIGxvb2t1cF9jbWRfMSAobGluZSwgbGlzdCwgJmxhc3RfbGlzdCwgaWdub3JlX2hlbHBfY2xhc3Nlcyk7CisjaWYgMAorICAvKiBUaGlzIGlzIHdyb25nIGZvciBjb21wbGV0ZV9jb21tYW5kLiAgKi8KKyAgY2hhciAqcHRyID0gKCpsaW5lKSArIHN0cmxlbiAoKmxpbmUpIC0gMTsKKworICAvKiBDbGVhciBvZmYgdHJhaWxpbmcgd2hpdGVzcGFjZS4gICovCisgIHdoaWxlIChwdHIgPj0gKmxpbmUgJiYgKCpwdHIgPT0gJyAnIHx8ICpwdHIgPT0gJ1x0JykpCisgICAgcHRyLS07CisgICoocHRyICsgMSkgPSAnXDAnOworI2VuZGlmCisgIAorICBpZiAoIWMpCisgICAgeworICAgICAgaWYgKCFhbGxvd191bmtub3duKQorCXsKKwkgIGlmICghKmxpbmUpCisJICAgIGVycm9yICgiTGFjayBvZiBuZWVkZWQgJXNjb21tYW5kIiwgY21kdHlwZSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjaGFyICpwID0gKmxpbmUsICpxOworCisJICAgICAgd2hpbGUgKGlzYWxudW0oKnApIHx8ICpwID09ICctJykKKwkJcCsrOworCisJICAgICAgcSA9IChjaGFyICopIGFsbG9jYSAocCAtICpsaW5lICsgMSk7CisJICAgICAgc3RybmNweSAocSwgKmxpbmUsIHAgLSAqbGluZSk7CisJICAgICAgcVtwIC0gKmxpbmVdID0gJ1wwJzsKKwkgICAgICB1bmRlZl9jbWRfZXJyb3IgKGNtZHR5cGUsIHEpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXJldHVybiAwOworICAgIH0KKyAgZWxzZSBpZiAoYyA9PSAoc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKikgLTEpCisgICAgeworICAgICAgLyogQW1iaWdvdXMuICBMb2NhbCB2YWx1ZXMgc2hvdWxkIGJlIG9mZiBwcmVmaXhsaXN0IG9yIGNhbGxlZAorCSB2YWx1ZXMuICAqLworICAgICAgaW50IGxvY2FsX2FsbG93X3Vua25vd24gPSAobGFzdF9saXN0ID8gbGFzdF9saXN0LT5hbGxvd191bmtub3duIDoKKwkJCQkgYWxsb3dfdW5rbm93bik7CisgICAgICBjaGFyICpsb2NhbF9jbWR0eXBlID0gbGFzdF9saXN0ID8gbGFzdF9saXN0LT5wcmVmaXhuYW1lIDogY21kdHlwZTsKKyAgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpsb2NhbF9saXN0ID0KKwkobGFzdF9saXN0ID8gKihsYXN0X2xpc3QtPnByZWZpeGxpc3QpIDogbGlzdCk7CisgICAgICAKKyAgICAgIGlmIChsb2NhbF9hbGxvd191bmtub3duIDwgMCkKKwl7CisJICBpZiAobGFzdF9saXN0KQorCSAgICByZXR1cm4gbGFzdF9saXN0OwkvKiBGb3VuZCBzb21ldGhpbmcuICAqLworCSAgZWxzZQorCSAgICByZXR1cm4gMDsJCS8qIEZvdW5kIG5vdGhpbmcuICAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBSZXBvcnQgYXMgZXJyb3IuICAqLworCSAgaW50IGFtYl9sZW47CisJICBjaGFyIGFtYmJ1ZlsxMDBdOworCisJICBmb3IgKGFtYl9sZW4gPSAwOworCSAgICAgICAoKCpsaW5lKVthbWJfbGVuXSAmJiAoKmxpbmUpW2FtYl9sZW5dICE9ICcgJworCQkmJiAoKmxpbmUpW2FtYl9sZW5dICE9ICdcdCcpOworCSAgICAgICBhbWJfbGVuKyspCisJICAgIDsKKwkgIAorCSAgYW1iYnVmWzBdID0gMDsKKwkgIGZvciAoYyA9IGxvY2FsX2xpc3Q7IGM7IGMgPSBjLT5uZXh0KQorCSAgICBpZiAoIXN0cm5jbXAgKCpsaW5lLCBjLT5uYW1lLCBhbWJfbGVuKSkKKwkgICAgICB7CisJCWlmIChzdHJsZW4gKGFtYmJ1ZikgKyBzdHJsZW4gKGMtPm5hbWUpICsgNiA8IChpbnQpc2l6ZW9mIGFtYmJ1ZikKKwkJICB7CisJCSAgICBpZiAoc3RybGVuIChhbWJidWYpKQorCQkgICAgICBzdHJjYXQgKGFtYmJ1ZiwgIiwgIik7CisJCSAgICBzdHJjYXQgKGFtYmJ1ZiwgYy0+bmFtZSk7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgc3RyY2F0IChhbWJidWYsICIuLiIpOworCQkgICAgYnJlYWs7CisJCSAgfQorCSAgICAgIH0KKwkgIGVycm9yICgiQW1iaWd1b3VzICVzY29tbWFuZCBcIiVzXCI6ICVzLiIsIGxvY2FsX2NtZHR5cGUsCisJCSAqbGluZSwgYW1iYnVmKTsKKwkgIHJldHVybiAwOwkJLyogbGludCAqLworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSd2ZSBnb3Qgc29tZXRoaW5nLiAgSXQgbWF5IHN0aWxsIG5vdCBiZSB3aGF0IHRoZSBjYWxsZXIKKyAgICAgICAgIHdhbnRzIChpZiB0aGlzIGNvbW1hbmQgKm5lZWRzKiBhIHN1YmNvbW1hbmQpLiAgKi8KKyAgICAgIHdoaWxlICgqKmxpbmUgPT0gJyAnIHx8ICoqbGluZSA9PSAnXHQnKQorCSgqbGluZSkrKzsKKworICAgICAgaWYgKGMtPnByZWZpeGxpc3QgJiYgKipsaW5lICYmICFjLT5hbGxvd191bmtub3duKQorCXVuZGVmX2NtZF9lcnJvciAoYy0+cHJlZml4bmFtZSwgKmxpbmUpOworCisgICAgICAvKiBTZWVtcyB0byBiZSB3aGF0IGhlIHdhbnRzLiAgUmV0dXJuIGl0LiAgKi8KKyAgICAgIHJldHVybiBjOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisJCisjaWYgMAorLyogTG9vayB1cCB0aGUgY29udGVudHMgb2YgKkxJTkUgYXMgYSBjb21tYW5kIGluIHRoZSBjb21tYW5kIGxpc3QgTElTVC4KKyAgIExJU1QgaXMgYSBjaGFpbiBvZiBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCdzLgorICAgSWYgaXQgaXMgZm91bmQsIHJldHVybiB0aGUgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgZm9yIHRoYXQgY29tbWFuZAorICAgYW5kIHVwZGF0ZSAqTElORSB0byBwb2ludCBhZnRlciB0aGUgY29tbWFuZCBuYW1lLCBhdCB0aGUgZmlyc3QgYXJndW1lbnQuCisgICBJZiBub3QgZm91bmQsIGNhbGwgZXJyb3IgaWYgQUxMT1dfVU5LTk9XTiBpcyB6ZXJvCisgICBvdGhlcndpc2UgKG9yIGlmIGVycm9yIHJldHVybnMpIHJldHVybiB6ZXJvLgorICAgQ2FsbCBlcnJvciBpZiBzcGVjaWZpZWQgY29tbWFuZCBpcyBhbWJpZ3VvdXMsCisgICB1bmxlc3MgQUxMT1dfVU5LTk9XTiBpcyBuZWdhdGl2ZS4KKyAgIENNRFRZUEUgcHJlY2VkZXMgdGhlIHdvcmQgImNvbW1hbmQiIGluIHRoZSBlcnJvciBtZXNzYWdlLiAgKi8KKworc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKgorbG9va3VwX2NtZCAobGluZSwgbGlzdCwgY21kdHlwZSwgYWxsb3dfdW5rbm93bikKKyAgICAgY2hhciAqKmxpbmU7CisgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpsaXN0OworICAgICBjaGFyICpjbWR0eXBlOworICAgICBpbnQgYWxsb3dfdW5rbm93bjsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqcDsKKyAgcmVnaXN0ZXIgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmMsICpmb3VuZDsKKyAgaW50IG5mb3VuZDsKKyAgY2hhciBhbWJidWZbMTAwXTsKKyAgY2hhciAqcHJvY2Vzc2VkX2NtZDsKKyAgaW50IGksIGNtZF9sZW47CisKKyAgLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UuICAqLworCisgIHdoaWxlICgqKmxpbmUgPT0gJyAnIHx8ICoqbGluZSA9PSAnXHQnKQorICAgICgqbGluZSkrKzsKKworICAvKiBDbGVhciBvdXQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gICovCisKKyAgcCA9ICpsaW5lICsgc3RybGVuICgqbGluZSk7CisgIHdoaWxlIChwICE9ICpsaW5lICYmIChwWy0xXSA9PSAnICcgfHwgcFstMV0gPT0gJ1x0JykpCisgICAgcC0tOworICAqcCA9IDA7CisKKyAgLyogRmluZCBlbmQgb2YgY29tbWFuZCBuYW1lLiAgKi8KKworICBwID0gKmxpbmU7CisgIHdoaWxlICgqcCA9PSAnLScgfHwgaXNhbG51bSgqcCkpCisgICAgcCsrOworCisgIC8qIExvb2sgdXAgdGhlIGNvbW1hbmQgbmFtZS4KKyAgICAgSWYgZXhhY3QgbWF0Y2gsIGtlZXAgdGhhdC4KKyAgICAgT3RoZXJ3aXNlLCB0YWtlIGNvbW1hbmQgYWJicmV2aWF0ZWQsIGlmIHVuaXF1ZS4gIE5vdGUgdGhhdCAoaW4gbXkKKyAgICAgb3BpbmlvbikgYSBudWxsIHN0cmluZyBkb2VzICpub3QqIGluZGljYXRlIGFtYmlndWl0eTsgc2ltcGx5IHRoZQorICAgICBlbmQgb2YgdGhlIGFyZ3VtZW50LiAgKi8KKworICBpZiAocCA9PSAqbGluZSkKKyAgICB7CisgICAgICBpZiAoIWFsbG93X3Vua25vd24pCisJZXJyb3IgKCJMYWNrIG9mIG5lZWRlZCAlc2NvbW1hbmQiLCBjbWR0eXBlKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgCisgIC8qIENvcHkgb3ZlciB0byBhIGxvY2FsIGJ1ZmZlciwgY29udmVydGluZyB0byBsb3dlcmNhc2Ugb24gdGhlIHdheS4KKyAgICAgVGhpcyBpcyBpbiBjYXNlIHRoZSBjb21tYW5kIGJlaW5nIHBhcnNlZCBpcyBhIHN1YmNvbW1hbmQgd2hpY2gKKyAgICAgZG9lc24ndCBtYXRjaCBhbnl0aGluZywgYW5kIHRoYXQncyBvay4gIFdlIHdhbnQgdGhlIG9yaWdpbmFsCisgICAgIHVudG91Y2hlZCBmb3IgdGhlIHJvdXRpbmUgb2YgdGhlIG9yaWdpbmFsIGNvbW1hbmQuICAqLworICAKKyAgcHJvY2Vzc2VkX2NtZCA9IChjaGFyICopIGFsbG9jYSAocCAtICpsaW5lICsgMSk7CisgIGZvciAoY21kX2xlbiA9IDA7IGNtZF9sZW4gPCBwIC0gKmxpbmU7IGNtZF9sZW4rKykKKyAgICB7CisgICAgICBjaGFyIHggPSAoKmxpbmUpW2NtZF9sZW5dOworICAgICAgaWYgKGlzdXBwZXIoeCkpCisJcHJvY2Vzc2VkX2NtZFtjbWRfbGVuXSA9IHRvbG93ZXIoeCk7CisgICAgICBlbHNlCisJcHJvY2Vzc2VkX2NtZFtjbWRfbGVuXSA9IHg7CisgICAgfQorICBwcm9jZXNzZWRfY21kW2NtZF9sZW5dID0gJ1wwJzsKKworICAvKiBDaGVjayBhbGwgcG9zc2liaWxpdGllcyBpbiB0aGUgY3VycmVudCBjb21tYW5kIGxpc3QuICAqLworICBmb3VuZCA9IDA7CisgIG5mb3VuZCA9IDA7CisgIGZvciAoYyA9IGxpc3Q7IGM7IGMgPSBjLT5uZXh0KQorICAgIHsKKyAgICAgIGlmICghc3RybmNtcCAocHJvY2Vzc2VkX2NtZCwgYy0+bmFtZSwgY21kX2xlbikpCisJeworCSAgZm91bmQgPSBjOworCSAgbmZvdW5kKys7CisJICBpZiAoYy0+bmFtZVtjbWRfbGVuXSA9PSAwKQorCSAgICB7CisJICAgICAgbmZvdW5kID0gMTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogUmVwb3J0IGVycm9yIGZvciB1bmRlZmluZWQgY29tbWFuZCBuYW1lLiAgKi8KKworICBpZiAobmZvdW5kICE9IDEpCisgICAgeworICAgICAgaWYgKG5mb3VuZCA+IDEgJiYgYWxsb3dfdW5rbm93biA+PSAwKQorCXsKKwkgIGFtYmJ1ZlswXSA9IDA7CisJICBmb3IgKGMgPSBsaXN0OyBjOyBjID0gYy0+bmV4dCkKKwkgICAgaWYgKCFzdHJuY21wIChwcm9jZXNzZWRfY21kLCBjLT5uYW1lLCBjbWRfbGVuKSkKKwkgICAgICB7CisJCWlmIChzdHJsZW4gKGFtYmJ1ZikgKyBzdHJsZW4gKGMtPm5hbWUpICsgNiA8IHNpemVvZiBhbWJidWYpCisJCSAgeworCQkgICAgaWYgKHN0cmxlbiAoYW1iYnVmKSkKKwkJICAgICAgc3RyY2F0IChhbWJidWYsICIsICIpOworCQkgICAgc3RyY2F0IChhbWJidWYsIGMtPm5hbWUpOworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIHN0cmNhdCAoYW1iYnVmLCAiLi4iKTsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkgICAgICB9CisJICBlcnJvciAoIkFtYmlndW91cyAlc2NvbW1hbmQgXCIlc1wiOiAlcy4iLCBjbWR0eXBlLAorCQkgcHJvY2Vzc2VkX2NtZCwgYW1iYnVmKTsKKwl9CisgICAgICBlbHNlIGlmICghYWxsb3dfdW5rbm93bikKKwllcnJvciAoIlVuZGVmaW5lZCAlc2NvbW1hbmQ6IFwiJXNcIi4iLCBjbWR0eXBlLCBwcm9jZXNzZWRfY21kKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBTa2lwIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBhcmd1bWVudC4gICovCisKKyAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKSBwKys7CisgICpsaW5lID0gcDsKKworICBpZiAoZm91bmQtPnByZWZpeGxpc3QgJiYgKnApCisgICAgeworICAgICAgYyA9IGxvb2t1cF9jbWQgKGxpbmUsICpmb3VuZC0+cHJlZml4bGlzdCwgZm91bmQtPnByZWZpeG5hbWUsCisJCSAgICAgIGZvdW5kLT5hbGxvd191bmtub3duKTsKKyAgICAgIGlmIChjKQorCXJldHVybiBjOworICAgIH0KKworICByZXR1cm4gZm91bmQ7Cit9CisjZW5kaWYKKworLyogSGVscGVyIGZ1bmN0aW9uIGZvciBTWU1CT0xfQ09NUExFVElPTl9GVU5DVElPTi4gICovCisKKy8qIFJldHVybiBhIHZlY3RvciBvZiBjaGFyIHBvaW50ZXJzIHdoaWNoIHBvaW50IHRvIHRoZSBkaWZmZXJlbnQKKyAgIHBvc3NpYmxlIGNvbXBsZXRpb25zIGluIExJU1Qgb2YgVEVYVC4gIAorCisgICBXT1JEIHBvaW50cyBpbiB0aGUgc2FtZSBidWZmZXIgYXMgVEVYVCwgYW5kIGNvbXBsZXRpb25zIHNob3VsZCBiZQorICAgcmV0dXJuZWQgcmVsYXRpdmUgdG8gdGhpcyBwb3NpdGlvbi4gIEZvciBleGFtcGxlLCBzdXBwb3NlIFRFWFQgaXMgImZvbyIKKyAgIGFuZCB3ZSB3YW50IHRvIGNvbXBsZXRlIHRvICJmb29iYXIiLiAgSWYgV09SRCBpcyAib28iLCByZXR1cm4KKyAgICJvb2JhciI7IGlmIFdPUkQgaXMgImJhei9mb28iLCByZXR1cm4gImJhei9mb29iYXIiLiAgKi8KKworY2hhciAqKgorY29tcGxldGVfb25fY21kbGlzdCAobGlzdCwgdGV4dCwgd29yZCkKKyAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmxpc3Q7CisgICAgIGNoYXIgKnRleHQ7CisgICAgIGNoYXIgKndvcmQ7Cit7CisgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpwdHI7CisgIGNoYXIgKiptYXRjaGxpc3Q7CisgIGludCBzaXplb2ZfbWF0Y2hsaXN0OworICBpbnQgbWF0Y2hlczsKKyAgaW50IHRleHRsZW4gPSBzdHJsZW4gKHRleHQpOworCisgIHNpemVvZl9tYXRjaGxpc3QgPSAxMDsKKyAgbWF0Y2hsaXN0ID0gKGNoYXIgKiopIHhtYWxsb2MgKHNpemVvZl9tYXRjaGxpc3QgKiBzaXplb2YgKGNoYXIgKikpOworICBtYXRjaGVzID0gMDsKKworICBmb3IgKHB0ciA9IGxpc3Q7IHB0cjsgcHRyID0gcHRyLT5uZXh0KQorICAgIGlmICghc3RybmNtcCAocHRyLT5uYW1lLCB0ZXh0LCB0ZXh0bGVuKQorCSYmICFwdHItPmFiYnJldl9mbGFnCisJJiYgKHB0ci0+ZnVuY3Rpb24uY2Z1bmMKKwkgICAgfHwgcHRyLT5wcmVmaXhsaXN0KSkKKyAgICAgIHsKKwlpZiAobWF0Y2hlcyA9PSBzaXplb2ZfbWF0Y2hsaXN0KQorCSAgeworCSAgICBzaXplb2ZfbWF0Y2hsaXN0ICo9IDI7CisJICAgIG1hdGNobGlzdCA9IChjaGFyICoqKSB4cmVhbGxvYyAoKGNoYXIgKiltYXRjaGxpc3QsCisJCQkJCSAgICAoc2l6ZW9mX21hdGNobGlzdAorCQkJCQkgICAgICogc2l6ZW9mIChjaGFyICopKSk7CisJICB9CisKKwltYXRjaGxpc3RbbWF0Y2hlc10gPSAoY2hhciAqKSAKKwkgIHhtYWxsb2MgKHN0cmxlbiAod29yZCkgKyBzdHJsZW4gKHB0ci0+bmFtZSkgKyAxKTsKKwlpZiAod29yZCA9PSB0ZXh0KQorCSAgc3RyY3B5IChtYXRjaGxpc3RbbWF0Y2hlc10sIHB0ci0+bmFtZSk7CisJZWxzZSBpZiAod29yZCA+IHRleHQpCisJICB7CisJICAgIC8qIFJldHVybiBzb21lIHBvcnRpb24gb2YgcHRyLT5uYW1lLiAgKi8KKwkgICAgc3RyY3B5IChtYXRjaGxpc3RbbWF0Y2hlc10sIHB0ci0+bmFtZSArICh3b3JkIC0gdGV4dCkpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgLyogUmV0dXJuIHNvbWUgb2YgdGV4dCBwbHVzIHB0ci0+bmFtZS4gICovCisJICAgIHN0cm5jcHkgKG1hdGNobGlzdFttYXRjaGVzXSwgd29yZCwgdGV4dCAtIHdvcmQpOworCSAgICBtYXRjaGxpc3RbbWF0Y2hlc11bdGV4dCAtIHdvcmRdID0gJ1wwJzsKKwkgICAgc3RyY2F0IChtYXRjaGxpc3RbbWF0Y2hlc10sIHB0ci0+bmFtZSk7CisJICB9CisJKyttYXRjaGVzOworICAgICAgfQorCisgIGlmIChtYXRjaGVzID09IDApCisgICAgeworICAgICAgZnJlZSAoKFBUUiltYXRjaGxpc3QpOworICAgICAgbWF0Y2hsaXN0ID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtYXRjaGxpc3QgPSAoY2hhciAqKikgeHJlYWxsb2MgKChjaGFyICopbWF0Y2hsaXN0LCAoKG1hdGNoZXMgKyAxKQorCQkJCQkJKiBzaXplb2YgKGNoYXIgKikpKTsKKyAgICAgIG1hdGNobGlzdFttYXRjaGVzXSA9IChjaGFyICopIDA7CisgICAgfQorCisgIHJldHVybiBtYXRjaGxpc3Q7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiBmb3IgU1lNQk9MX0NPTVBMRVRJT05fRlVOQ1RJT04uICAqLworCisvKiBSZXR1cm4gYSB2ZWN0b3Igb2YgY2hhciBwb2ludGVycyB3aGljaCBwb2ludCB0byB0aGUgZGlmZmVyZW50CisgICBwb3NzaWJsZSBjb21wbGV0aW9ucyBpbiBDTUQgb2YgVEVYVC4gIAorCisgICBXT1JEIHBvaW50cyBpbiB0aGUgc2FtZSBidWZmZXIgYXMgVEVYVCwgYW5kIGNvbXBsZXRpb25zIHNob3VsZCBiZQorICAgcmV0dXJuZWQgcmVsYXRpdmUgdG8gdGhpcyBwb3NpdGlvbi4gIEZvciBleGFtcGxlLCBzdXBwb3NlIFRFWFQgaXMgImZvbyIKKyAgIGFuZCB3ZSB3YW50IHRvIGNvbXBsZXRlIHRvICJmb29iYXIiLiAgSWYgV09SRCBpcyAib28iLCByZXR1cm4KKyAgICJvb2JhciI7IGlmIFdPUkQgaXMgImJhei9mb28iLCByZXR1cm4gImJhei9mb29iYXIiLiAgKi8KKworY2hhciAqKgorY29tcGxldGVfb25fZW51bSAoZW51bWxpc3QsIHRleHQsIHdvcmQpCisgICAgIGNoYXIgKiplbnVtbGlzdDsKKyAgICAgY2hhciAqdGV4dDsKKyAgICAgY2hhciAqd29yZDsKK3sKKyAgY2hhciAqKm1hdGNobGlzdDsKKyAgaW50IHNpemVvZl9tYXRjaGxpc3Q7CisgIGludCBtYXRjaGVzOworICBpbnQgdGV4dGxlbiA9IHN0cmxlbiAodGV4dCk7CisgIGludCBpOworICBjaGFyICpuYW1lOworCisgIHNpemVvZl9tYXRjaGxpc3QgPSAxMDsKKyAgbWF0Y2hsaXN0ID0gKGNoYXIgKiopIHhtYWxsb2MgKHNpemVvZl9tYXRjaGxpc3QgKiBzaXplb2YgKGNoYXIgKikpOworICBtYXRjaGVzID0gMDsKKworICBmb3IgKGkgPSAwOyAobmFtZSA9IGVudW1saXN0W2ldKSAhPSBOVUxMOyBpKyspCisgICAgaWYgKHN0cm5jbXAgKG5hbWUsIHRleHQsIHRleHRsZW4pID09IDApCisgICAgICB7CisJaWYgKG1hdGNoZXMgPT0gc2l6ZW9mX21hdGNobGlzdCkKKwkgIHsKKwkgICAgc2l6ZW9mX21hdGNobGlzdCAqPSAyOworCSAgICBtYXRjaGxpc3QgPSAoY2hhciAqKikgeHJlYWxsb2MgKChjaGFyICopbWF0Y2hsaXN0LAorCQkJCQkgICAgKHNpemVvZl9tYXRjaGxpc3QKKwkJCQkJICAgICAqIHNpemVvZiAoY2hhciAqKSkpOworCSAgfQorCisJbWF0Y2hsaXN0W21hdGNoZXNdID0gKGNoYXIgKikgCisJICB4bWFsbG9jIChzdHJsZW4gKHdvcmQpICsgc3RybGVuIChuYW1lKSArIDEpOworCWlmICh3b3JkID09IHRleHQpCisJICBzdHJjcHkgKG1hdGNobGlzdFttYXRjaGVzXSwgbmFtZSk7CisJZWxzZSBpZiAod29yZCA+IHRleHQpCisJICB7CisJICAgIC8qIFJldHVybiBzb21lIHBvcnRpb24gb2YgbmFtZS4gICovCisJICAgIHN0cmNweSAobWF0Y2hsaXN0W21hdGNoZXNdLCBuYW1lICsgKHdvcmQgLSB0ZXh0KSk7CisJICB9CisJZWxzZQorCSAgeworCSAgICAvKiBSZXR1cm4gc29tZSBvZiB0ZXh0IHBsdXMgbmFtZS4gICovCisJICAgIHN0cm5jcHkgKG1hdGNobGlzdFttYXRjaGVzXSwgd29yZCwgdGV4dCAtIHdvcmQpOworCSAgICBtYXRjaGxpc3RbbWF0Y2hlc11bdGV4dCAtIHdvcmRdID0gJ1wwJzsKKwkgICAgc3RyY2F0IChtYXRjaGxpc3RbbWF0Y2hlc10sIG5hbWUpOworCSAgfQorCSsrbWF0Y2hlczsKKyAgICAgIH0KKworICBpZiAobWF0Y2hlcyA9PSAwKQorICAgIHsKKyAgICAgIGZyZWUgKChQVFIpbWF0Y2hsaXN0KTsKKyAgICAgIG1hdGNobGlzdCA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbWF0Y2hsaXN0ID0gKGNoYXIgKiopIHhyZWFsbG9jICgoY2hhciAqKW1hdGNobGlzdCwgKChtYXRjaGVzICsgMSkKKwkJCQkJCSogc2l6ZW9mIChjaGFyICopKSk7CisgICAgICBtYXRjaGxpc3RbbWF0Y2hlc10gPSAoY2hhciAqKSAwOworICAgIH0KKworICByZXR1cm4gbWF0Y2hsaXN0OworfQorCitzdGF0aWMgaW50CitwYXJzZV9iaW5hcnlfb3BlcmF0aW9uIChhcmcpCisgICAgIGNoYXIgKmFyZzsKK3sKKyAgaW50IGxlbmd0aDsKKworICBpZiAoIWFyZyB8fCAhKmFyZykKKyAgICByZXR1cm4gMTsKKworICBsZW5ndGggPSBzdHJsZW4gKGFyZyk7CisKKyAgd2hpbGUgKGFyZ1tsZW5ndGggLSAxXSA9PSAnICcgfHwgYXJnW2xlbmd0aCAtIDFdID09ICdcdCcpCisgICAgbGVuZ3RoLS07CisKKyAgaWYgKCFzdHJuY21wIChhcmcsICJvbiIsIGxlbmd0aCkKKyAgICAgIHx8ICFzdHJuY21wIChhcmcsICIxIiwgbGVuZ3RoKQorICAgICAgfHwgIXN0cm5jbXAgKGFyZywgInllcyIsIGxlbmd0aCkpCisgICAgcmV0dXJuIDE7CisgIGVsc2UKKyAgICBpZiAoIXN0cm5jbXAgKGFyZywgIm9mZiIsIGxlbmd0aCkKKwl8fCAhc3RybmNtcCAoYXJnLCAiMCIsIGxlbmd0aCkKKwl8fCAhc3RybmNtcCAoYXJnLCAibm8iLCBsZW5ndGgpKQorICAgICAgcmV0dXJuIDA7CisgICAgZWxzZSAKKyAgICAgIHsKKwllcnJvciAoIlwib25cIiBvciBcIm9mZlwiIGV4cGVjdGVkLiIpOworCXJldHVybiAwOworICAgICAgfQorfQorCisvKiBEbyBhICJzZXQiIG9yICJzaG93IiBjb21tYW5kLiAgQVJHIGlzIE5VTEwgaWYgbm8gYXJndW1lbnQsIG9yIHRoZSB0ZXh0CisgICBvZiB0aGUgYXJndW1lbnQsIGFuZCBGUk9NX1RUWSBpcyBub256ZXJvIGlmIHRoaXMgY29tbWFuZCBpcyBiZWluZyBlbnRlcmVkCisgICBkaXJlY3RseSBieSB0aGUgdXNlciAoaS5lLiB0aGVzZSBhcmUganVzdCBsaWtlIGFueSBvdGhlcgorICAgY29tbWFuZCkuICBDIGlzIHRoZSBjb21tYW5kIGxpc3QgZWxlbWVudCBmb3IgdGhlIGNvbW1hbmQuICAqLwordm9pZAorZG9fc2V0c2hvd19jb21tYW5kIChhcmcsIGZyb21fdHR5LCBjKQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKKyAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7Cit7CisgIGlmIChjLT50eXBlID09IHNldF9jbWQpCisgICAgeworICAgICAgc3dpdGNoIChjLT52YXJfdHlwZSkKKwl7CisJY2FzZSB2YXJfc3RyaW5nOgorCSAgeworCSAgICBjaGFyICpuZXc7CisJICAgIGNoYXIgKnA7CisJICAgIGNoYXIgKnE7CisJICAgIGludCBjaDsKKwkgICAgCisJICAgIGlmIChhcmcgPT0gTlVMTCkKKwkgICAgICBhcmcgPSAiIjsKKwkgICAgbmV3ID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChhcmcpICsgMik7CisJICAgIHAgPSBhcmc7IHEgPSBuZXc7CisJICAgIHdoaWxlICgoY2ggPSAqcCsrKSAhPSAnXDAwMCcpCisJICAgICAgeworCQlpZiAoY2ggPT0gJ1xcJykKKwkJICB7CisJCSAgICAvKiBcIGF0IGVuZCBvZiBhcmd1bWVudCBpcyB1c2VkIGFmdGVyIHNwYWNlcworCQkgICAgICAgc28gdGhleSB3b24ndCBiZSBsb3N0LiAgKi8KKwkJICAgIC8qIFRoaXMgaXMgb2Jzb2xldGUgbm93IHRoYXQgd2Ugbm8gbG9uZ2VyIHN0cmlwCisJCSAgICAgICB0cmFpbGluZyB3aGl0ZXNwYWNlIGFuZCBhY3R1YWxseSwgdGhlIGJhY2tzbGFzaAorCQkgICAgICAgZGlkbid0IGdldCBoZXJlIGluIG15IHRlc3QsIHJlYWRsaW5lIG9yCisJCSAgICAgICBzb21ldGhpbmcgZGlkIHNvbWV0aGluZyBmdW5reSB3aXRoIGEgYmFja3NsYXNoCisJCSAgICAgICByaWdodCBiZWZvcmUgYSBuZXdsaW5lLiAgKi8KKwkJICAgIGlmICgqcCA9PSAwKQorCQkgICAgICBicmVhazsKKwkJICAgIGNoID0gcGFyc2VfZXNjYXBlICgmcCk7CisJCSAgICBpZiAoY2ggPT0gMCkKKwkJICAgICAgYnJlYWs7IC8qIEMgbG9zZXMgKi8KKwkJICAgIGVsc2UgaWYgKGNoID4gMCkKKwkJICAgICAgKnErKyA9IGNoOworCQkgIH0KKwkJZWxzZQorCQkgICpxKysgPSBjaDsKKwkgICAgICB9CisjaWYgMAorCSAgICBpZiAoKihwIC0gMSkgIT0gJ1xcJykKKwkgICAgICAqcSsrID0gJyAnOworI2VuZGlmCisJICAgICpxKysgPSAnXDAnOworCSAgICBuZXcgPSAoY2hhciAqKSB4cmVhbGxvYyAobmV3LCBxIC0gbmV3KTsKKwkgICAgaWYgKCooY2hhciAqKiljLT52YXIgIT0gTlVMTCkKKwkgICAgICBmcmVlICgqKGNoYXIgKiopYy0+dmFyKTsKKwkgICAgKihjaGFyICoqKSBjLT52YXIgPSBuZXc7CisJICB9CisJICBicmVhazsKKwljYXNlIHZhcl9zdHJpbmdfbm9lc2NhcGU6CisJICBpZiAoYXJnID09IE5VTEwpCisJICAgIGFyZyA9ICIiOworCSAgaWYgKCooY2hhciAqKiljLT52YXIgIT0gTlVMTCkKKwkgICAgZnJlZSAoKihjaGFyICoqKWMtPnZhcik7CisJICAqKGNoYXIgKiopIGMtPnZhciA9IHNhdmVzdHJpbmcgKGFyZywgc3RybGVuIChhcmcpKTsKKwkgIGJyZWFrOworCWNhc2UgdmFyX2ZpbGVuYW1lOgorCSAgaWYgKGFyZyA9PSBOVUxMKQorCSAgICBlcnJvcl9ub19hcmcgKCJmaWxlbmFtZSB0byBzZXQgaXQgdG8uIik7CisJICBpZiAoKihjaGFyICoqKWMtPnZhciAhPSBOVUxMKQorCSAgICBmcmVlICgqKGNoYXIgKiopYy0+dmFyKTsKKwkgICooY2hhciAqKiljLT52YXIgPSB0aWxkZV9leHBhbmQgKGFyZyk7CisJICBicmVhazsKKwljYXNlIHZhcl9ib29sZWFuOgorCSAgKihpbnQgKikgYy0+dmFyID0gcGFyc2VfYmluYXJ5X29wZXJhdGlvbiAoYXJnKTsKKwkgIGJyZWFrOworCWNhc2UgdmFyX3VpbnRlZ2VyOgorCSAgaWYgKGFyZyA9PSBOVUxMKQorCSAgICBlcnJvcl9ub19hcmcgKCJpbnRlZ2VyIHRvIHNldCBpdCB0by4iKTsKKwkgICoodW5zaWduZWQgaW50ICopIGMtPnZhciA9IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgKGFyZyk7CisJICBpZiAoKih1bnNpZ25lZCBpbnQgKikgYy0+dmFyID09IDApCisJICAgICoodW5zaWduZWQgaW50ICopIGMtPnZhciA9IFVJTlRfTUFYOworCSAgYnJlYWs7CisJY2FzZSB2YXJfaW50ZWdlcjoKKwkgIHsKKwkgICAgdW5zaWduZWQgaW50IHZhbDsKKwkgICAgaWYgKGFyZyA9PSBOVUxMKQorCSAgICAgIGVycm9yX25vX2FyZyAoImludGVnZXIgdG8gc2V0IGl0IHRvLiIpOworCSAgICB2YWwgPSBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIChhcmcpOworCSAgICBpZiAodmFsID09IDApCisJICAgICAgKihpbnQgKikgYy0+dmFyID0gSU5UX01BWDsKKwkgICAgZWxzZSBpZiAodmFsID49IElOVF9NQVgpCisJICAgICAgZXJyb3IgKCJpbnRlZ2VyICV1IG91dCBvZiByYW5nZSIsIHZhbCk7CisJICAgIGVsc2UKKwkgICAgICAqKGludCAqKSBjLT52YXIgPSB2YWw7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgdmFyX3ppbnRlZ2VyOgorCSAgaWYgKGFyZyA9PSBOVUxMKQorCSAgICBlcnJvcl9ub19hcmcgKCJpbnRlZ2VyIHRvIHNldCBpdCB0by4iKTsKKwkgICooaW50ICopIGMtPnZhciA9IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgKGFyZyk7CisJICBicmVhazsKKwljYXNlIHZhcl9lbnVtOgorCSAgeworCSAgICBpbnQgaTsKKwkgICAgaW50IGxlbjsKKwkgICAgaW50IG5tYXRjaGVzOworCSAgICBjaGFyICptYXRjaCA9IE5VTEw7CisJICAgIGNoYXIgKnA7CisKKwkgICAgLyogaWYgbm8gYXJndW1lbnQgd2FzIHN1cHBsaWVkLCBwcmludCBhbiBpbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlICovCisJICAgIGlmIChhcmcgPT0gTlVMTCkKKwkgICAgICB7CisJCWNoYXIgbXNnWzEwMjRdOworCQlzdHJjcHkgKG1zZywgIlJlcXVpcmVzIGFuIGFyZ3VtZW50LiBWYWxpZCBhcmd1bWVudHMgYXJlICIpOworCQlmb3IgKGkgPSAwOyBjLT5lbnVtc1tpXTsgaSsrKQorCQkgIHsKKwkJICAgIGlmIChpICE9IDApCisJCSAgICAgIHN0cmNhdCAobXNnLCAiLCAiKTsKKwkJICAgIHN0cmNhdCAobXNnLCBjLT5lbnVtc1tpXSk7CisJCSAgfQorCQlzdHJjYXQgKG1zZywgIi4iKTsKKwkJZXJyb3IgKG1zZyk7CisJICAgICAgfQorCisJICAgIHAgPSBzdHJjaHIgKGFyZywgJyAnKTsKKwkgICAgCisJICAgIGlmIChwKQorCSAgICAgIGxlbiA9IHAgLSBhcmc7CisJICAgIGVsc2UKKwkgICAgICBsZW4gPSBzdHJsZW4gKGFyZyk7CisKKwkgICAgbm1hdGNoZXMgPSAwOworCSAgICBmb3IgKGkgPSAwOyBjLT5lbnVtc1tpXTsgaSsrKQorCSAgICAgIGlmIChzdHJuY21wIChhcmcsIGMtPmVudW1zW2ldLCBsZW4pID09IDApCisJCXsKKwkJICBtYXRjaCA9IGMtPmVudW1zW2ldOworCQkgIG5tYXRjaGVzKys7CisJCX0KKworCSAgICBpZiAobm1hdGNoZXMgPD0gMCkKKwkgICAgICBlcnJvciAoIlVuZGVmaW5lZCBpdGVtOiBcIiVzXCIuIiwgYXJnKTsKKworCSAgICBpZiAobm1hdGNoZXMgPiAxKQorCSAgICAgIGVycm9yICgiQW1iaWd1b3VzIGl0ZW0gXCIlc1wiLiIsIGFyZyk7CisKKwkgICAgKihjaGFyICoqKWMtPnZhciA9IG1hdGNoOworCSAgfQorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGVycm9yICgiZ2RiIGludGVybmFsIGVycm9yOiBiYWQgdmFyX3R5cGUgaW4gZG9fc2V0c2hvd19jb21tYW5kIik7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoYy0+dHlwZSA9PSBzaG93X2NtZCkKKyAgICB7CisgICAgICAvKiBQcmludCBkb2MgbWludXMgInNob3ciIGF0IHN0YXJ0LiAgKi8KKyAgICAgIHByaW50X2RvY19saW5lIChnZGJfc3Rkb3V0LCBjLT5kb2MgKyA1KTsKKyAgICAgIAorICAgICAgZnB1dHNfZmlsdGVyZWQgKCIgaXMgIiwgZ2RiX3N0ZG91dCk7CisgICAgICB3cmFwX2hlcmUgKCIgICAgIik7CisgICAgICBzd2l0Y2ggKGMtPnZhcl90eXBlKQorCXsKKyAgICAgIGNhc2UgdmFyX3N0cmluZzoKKwl7CisJICB1bnNpZ25lZCBjaGFyICpwOworCisJICBmcHV0c19maWx0ZXJlZCAoIlwiIiwgZ2RiX3N0ZG91dCk7CisJICBpZiAoKih1bnNpZ25lZCBjaGFyICoqKWMtPnZhcikKKwkgICAgZm9yIChwID0gKih1bnNpZ25lZCBjaGFyICoqKSBjLT52YXI7ICpwICE9ICdcMCc7IHArKykKKwkgICAgICBnZGJfcHJpbnRjaGFyICgqcCwgZ2RiX3N0ZG91dCwgJyInKTsKKwkgIGZwdXRzX2ZpbHRlcmVkICgiXCIiLCBnZGJfc3Rkb3V0KTsKKwl9CisJYnJlYWs7CisgICAgICBjYXNlIHZhcl9zdHJpbmdfbm9lc2NhcGU6CisgICAgICBjYXNlIHZhcl9maWxlbmFtZToKKyAgICAgIGNhc2UgdmFyX2VudW06CisJZnB1dHNfZmlsdGVyZWQgKCJcIiIsIGdkYl9zdGRvdXQpOworCWlmICgqKGNoYXIgKiopYy0+dmFyKQorCSAgZnB1dHNfZmlsdGVyZWQgKCooY2hhciAqKikgYy0+dmFyLCBnZGJfc3Rkb3V0KTsKKwlmcHV0c19maWx0ZXJlZCAoIlwiIiwgZ2RiX3N0ZG91dCk7CisJYnJlYWs7CisgICAgICBjYXNlIHZhcl9ib29sZWFuOgorCWZwdXRzX2ZpbHRlcmVkICgqKGludCAqKSBjLT52YXIgPyAib24iIDogIm9mZiIsIGdkYl9zdGRvdXQpOworCWJyZWFrOworICAgICAgY2FzZSB2YXJfdWludGVnZXI6CisJaWYgKCoodW5zaWduZWQgaW50ICopIGMtPnZhciA9PSBVSU5UX01BWCkgeworCSAgZnB1dHNfZmlsdGVyZWQgKCJ1bmxpbWl0ZWQiLCBnZGJfc3Rkb3V0KTsKKwkgIGJyZWFrOworCX0KKwkvKiBlbHNlIGZhbGwgdGhyb3VnaCAqLworICAgICAgY2FzZSB2YXJfemludGVnZXI6CisJZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZG91dCwgIiV1IiwgKih1bnNpZ25lZCBpbnQgKikgYy0+dmFyKTsKKwlicmVhazsKKyAgICAgIGNhc2UgdmFyX2ludGVnZXI6CisJaWYgKCooaW50ICopIGMtPnZhciA9PSBJTlRfTUFYKQorCSAgeworCSAgICBmcHV0c19maWx0ZXJlZCAoInVubGltaXRlZCIsIGdkYl9zdGRvdXQpOworCSAgfQorCWVsc2UKKwkgIGZwcmludGZfZmlsdGVyZWQgKGdkYl9zdGRvdXQsICIlZCIsICooaW50ICopIGMtPnZhcik7CisJYnJlYWs7CisJICAgIAorICAgICAgZGVmYXVsdDoKKwllcnJvciAoImdkYiBpbnRlcm5hbCBlcnJvcjogYmFkIHZhcl90eXBlIGluIGRvX3NldHNob3dfY29tbWFuZCIpOworICAgICAgfQorICAgICAgZnB1dHNfZmlsdGVyZWQgKCIuXG4iLCBnZGJfc3Rkb3V0KTsKKyAgICB9CisgIGVsc2UKKyAgICBlcnJvciAoImdkYiBpbnRlcm5hbCBlcnJvcjogYmFkIGNtZF90eXBlIGluIGRvX3NldHNob3dfY29tbWFuZCIpOworICAoKmMtPmZ1bmN0aW9uLnNmdW5jKSAoTlVMTCwgZnJvbV90dHksIGMpOworfQorCisvKiBTaG93IGFsbCB0aGUgc2V0dGluZ3MgaW4gYSBsaXN0IG9mIHNob3cgY29tbWFuZHMuICAqLworCit2b2lkCitjbWRfc2hvd19saXN0IChsaXN0LCBmcm9tX3R0eSwgcHJlZml4KQorICAgICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqbGlzdDsKKyAgICAgaW50IGZyb21fdHR5OworICAgICBjaGFyICpwcmVmaXg7Cit7CisgIGZvciAoOyBsaXN0ICE9IE5VTEw7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisgICAgLyogSWYgd2UgZmluZCBhIHByZWZpeCwgcnVuIGl0cyBsaXN0LCBwcmVmaXhpbmcgb3VyIG91dHB1dCBieSBpdHMKKyAgICAgICBwcmVmaXggKHdpdGggInNob3cgIiBza2lwcGVkKS4gICovCisgICAgaWYgKGxpc3QtPnByZWZpeGxpc3QgJiYgIWxpc3QtPmFiYnJldl9mbGFnKQorICAgICAgY21kX3Nob3dfbGlzdCAoKmxpc3QtPnByZWZpeGxpc3QsIGZyb21fdHR5LCBsaXN0LT5wcmVmaXhuYW1lICsgNSk7CisgICAgaWYgKGxpc3QtPnR5cGUgPT0gc2hvd19jbWQpCisgICAgICB7CisJZnB1dHNfZmlsdGVyZWQgKHByZWZpeCwgZ2RiX3N0ZG91dCk7CisJZnB1dHNfZmlsdGVyZWQgKGxpc3QtPm5hbWUsIGdkYl9zdGRvdXQpOworCWZwdXRzX2ZpbHRlcmVkICgiOiAgIiwgZ2RiX3N0ZG91dCk7CisJZG9fc2V0c2hvd19jb21tYW5kICgoY2hhciAqKU5VTEwsIGZyb21fdHR5LCBsaXN0KTsKKyAgICAgIH0KKyAgfQorfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3NoZWxsX2VzY2FwZSAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisjaWZkZWYgQ0FOVF9GT1JLCisgIC8qIEZJWE1FOiB3aGF0IGFib3V0IGVycm9ycyAoSSBkb24ndCBrbm93IGhvdyBHTzMyIHN5c3RlbSgpIGhhbmRsZXMKKyAgICAgdGhlbSk/ICAqLworICBzeXN0ZW0gKGFyZyk7CisjZWxzZSAvKiBDYW4gZm9yay4gICovCisgIGludCByYywgc3RhdHVzLCBwaWQ7CisgIGNoYXIgKnAsICp1c2VyX3NoZWxsOworCisgIGlmICgodXNlcl9zaGVsbCA9IChjaGFyICopIGdldGVudiAoIlNIRUxMIikpID09IE5VTEwpCisgICAgdXNlcl9zaGVsbCA9ICIvYmluL3NoIjsKKworICAvKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHNoZWxsIGZvciBhcmcwICovCisgIGlmICgocCA9IHN0cnJjaHIgKHVzZXJfc2hlbGwsICcvJykpID09IE5VTEwpCisgICAgcCA9IHVzZXJfc2hlbGw7CisgIGVsc2UKKyAgICBwKys7CQkJLyogR2V0IHBhc3QgJy8nICovCisKKyAgaWYgKChwaWQgPSBmb3JrKCkpID09IDApCisgICAgeworICAgICAgaWYgKCFhcmcpCisJZXhlY2wgKHVzZXJfc2hlbGwsIHAsIDApOworICAgICAgZWxzZQorCWV4ZWNsICh1c2VyX3NoZWxsLCBwLCAiLWMiLCBhcmcsIDApOworCisgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJDYW5ub3QgZXhlY3V0ZSAlczogJXNcbiIsIHVzZXJfc2hlbGwsCisJCQkgIHNhZmVfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRlcnIpOworICAgICAgX2V4aXQgKDAxNzcpOworICAgIH0KKworICBpZiAocGlkICE9IC0xKQorICAgIHdoaWxlICgocmMgPSB3YWl0ICgmc3RhdHVzKSkgIT0gcGlkICYmIHJjICE9IC0xKQorICAgICAgOworICBlbHNlCisgICAgZXJyb3IgKCJGb3JrIGZhaWxlZCIpOworI2VuZGlmIC8qIENhbiBmb3JrLiAgKi8KK30KKworc3RhdGljIHZvaWQKK21ha2VfY29tbWFuZCAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoYXIgKnA7CisKKyAgaWYgKGFyZyA9PSAwKQorICAgIHAgPSAibWFrZSI7CisgIGVsc2UKKyAgICB7CisgICAgICBwID0geG1hbGxvYyAoc2l6ZW9mKCJtYWtlICIpICsgc3RybGVuKGFyZykpOworICAgICAgc3RyY3B5IChwLCAibWFrZSAiKTsKKyAgICAgIHN0cmNweSAocCArIHNpemVvZigibWFrZSAiKS0xLCBhcmcpOworICAgIH0KKyAgCisgIHNoZWxsX2VzY2FwZSAocCwgZnJvbV90dHkpOworfQorCitzdGF0aWMgdm9pZAorc2hvd191c2VyXzEgKGMsIHN0cmVhbSkKKyAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7CisgICAgIEdEQl9GSUxFICpzdHJlYW07Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBjb21tYW5kX2xpbmUgKmNtZGxpbmVzOworCisgIGNtZGxpbmVzID0gYy0+dXNlcl9jb21tYW5kczsKKyAgaWYgKCFjbWRsaW5lcykKKyAgICByZXR1cm47CisgIGZwdXRzX2ZpbHRlcmVkICgiVXNlciBjb21tYW5kICIsIHN0cmVhbSk7CisgIGZwdXRzX2ZpbHRlcmVkIChjLT5uYW1lLCBzdHJlYW0pOworICBmcHV0c19maWx0ZXJlZCAoIjpcbiIsIHN0cmVhbSk7CisKKyAgd2hpbGUgKGNtZGxpbmVzKQorICAgIHsKKyAgICAgIHByaW50X2NvbW1hbmRfbGluZSAoY21kbGluZXMsIDQpOworICAgICAgY21kbGluZXMgPSBjbWRsaW5lcy0+bmV4dDsKKyAgICB9CisgIGZwdXRzX2ZpbHRlcmVkICgiXG4iLCBzdHJlYW0pOworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3Nob3dfdXNlciAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7CisgIGV4dGVybiBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqY21kbGlzdDsKKworICBpZiAoYXJncykKKyAgICB7CisgICAgICBjID0gbG9va3VwX2NtZCAoJmFyZ3MsIGNtZGxpc3QsICIiLCAwLCAxKTsKKyAgICAgIGlmIChjLT5jbGFzcyAhPSBjbGFzc191c2VyKQorCWVycm9yICgiTm90IGEgdXNlciBjb21tYW5kLiIpOworICAgICAgc2hvd191c2VyXzEgKGMsIGdkYl9zdGRvdXQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAoYyA9IGNtZGxpc3Q7IGM7IGMgPSBjLT5uZXh0KQorCXsKKwkgIGlmIChjLT5jbGFzcyA9PSBjbGFzc191c2VyKQorCSAgICBzaG93X3VzZXJfMSAoYywgZ2RiX3N0ZG91dCk7CisJfQorICAgIH0KK30KKwordm9pZAorX2luaXRpYWxpemVfY29tbWFuZCAoKQoreworICBhZGRfY29tICgic2hlbGwiLCBjbGFzc19zdXBwb3J0LCBzaGVsbF9lc2NhcGUsCisJICAgIkV4ZWN1dGUgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgYXMgYSBzaGVsbCBjb21tYW5kLiAgXG5cCitXaXRoIG5vIGFyZ3VtZW50cywgcnVuIGFuIGluZmVyaW9yIHNoZWxsLiIpOworCisgIGlmICh4ZGJfY29tbWFuZHMpCisgICAgYWRkX2NvbV9hbGlhcygiISIsICJzaGVsbCIsIGNsYXNzX3N1cHBvcnQsIDApOworCisgIGFkZF9jb20gKCJtYWtlIiwgY2xhc3Nfc3VwcG9ydCwgbWFrZV9jb21tYW5kLAorCSAgICJSdW4gdGhlIGBgbWFrZScnIHByb2dyYW0gdXNpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgYXMgYXJndW1lbnRzLiIpOworICBhZGRfY21kICgidXNlciIsIG5vX2NsYXNzLCBzaG93X3VzZXIsIAorCSAgICJTaG93IGRlZmluaXRpb25zIG9mIHVzZXIgZGVmaW5lZCBjb21tYW5kcy5cblwKK0FyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSB1c2VyIGRlZmluZWQgY29tbWFuZC5cblwKK1dpdGggbm8gYXJndW1lbnQsIHNob3cgZGVmaW5pdGlvbnMgb2YgYWxsIHVzZXIgZGVmaW5lZCBjb21tYW5kcy4iLCAmc2hvd2xpc3QpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbW1hbmQuaCBiL2dkYi9jb21tYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEyMDkyMwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb21tYW5kLmgKQEAgLTAsMCArMSwyNTkgQEAKKy8qIEhlYWRlciBmaWxlIGZvciBjb21tYW5kLXJlYWRpbmcgbGlicmFyeSBjb21tYW5kLmMuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODksIDE5OTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCAoQ09NTUFORF9IKQorI2RlZmluZSBDT01NQU5EX0ggMQorCisvKiBOb3QgYSBzZXQvc2hvdyBjb21tYW5kLiAgTm90ZSB0aGF0IHNvbWUgY29tbWFuZHMgd2hpY2ggYmVnaW4gd2l0aAorICAgInNldCIgb3IgInNob3ciIG1pZ2h0IGJlIGluIHRoaXMgY2F0ZWdvcnksIGlmIHRoZWlyIHN5bnRheCBkb2VzCisgICBub3QgZmFsbCBpbnRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhdGVnb3JpZXMuICAqLwordHlwZWRlZiBlbnVtIGNtZF90eXBlcyB7CisgIG5vdF9zZXRfY21kLAorICBzZXRfY21kLAorICBzaG93X2NtZAorfSBjbWRfdHlwZXM7CisKKy8qIFR5cGVzIG9mICJzZXQiIG9yICJzaG93IiBjb21tYW5kLiAgKi8KK3R5cGVkZWYgZW51bSB2YXJfdHlwZXMgeworICAvKiAib24iIG9yICJvZmYiLiAgKlZBUiBpcyBhbiBpbnRlZ2VyIHdoaWNoIGlzIG5vbnplcm8gZm9yIG9uLAorICAgICB6ZXJvIGZvciBvZmYuICAqLworICB2YXJfYm9vbGVhbiwKKyAgLyogVW5zaWduZWQgSW50ZWdlci4gICpWQVIgaXMgYW4gdW5zaWduZWQgaW50LiAgVGhlIHVzZXIgY2FuIHR5cGUgMAorICAgICB0byBtZWFuICJ1bmxpbWl0ZWQiLCB3aGljaCBpcyBzdG9yZWQgaW4gKlZBUiBhcyBVSU5UX01BWC4gICovCisgIHZhcl91aW50ZWdlciwKKworICAvKiBMaWtlIHZhcl91aW50ZWdlciBidXQgc2lnbmVkLiAgKlZBUiBpcyBhbiBpbnQuICBUaGUgdXNlciBjYW4gdHlwZSAwCisgICAgIHRvIG1lYW4gInVubGltaXRlZCIsIHdoaWNoIGlzIHN0b3JlZCBpbiAqVkFSIGFzIElOVF9NQVguICAqLworICB2YXJfaW50ZWdlciwKKworICAvKiBTdHJpbmcgd2hpY2ggdGhlIHVzZXIgZW50ZXJzIHdpdGggZXNjYXBlcyAoZS5nLiB0aGUgdXNlciB0eXBlcyBcbiBhbmQKKyAgICAgaXQgaXMgYSByZWFsIG5ld2xpbmUgaW4gdGhlIHN0b3JlZCBzdHJpbmcpLgorICAgICAqVkFSIGlzIGEgbWFsbG9jJ2Qgc3RyaW5nLCBvciBOVUxMIGlmIHRoZSBzdHJpbmcgaXMgZW1wdHkuICAqLworICB2YXJfc3RyaW5nLAorICAvKiBTdHJpbmcgd2hpY2ggc3RvcmVzIHdoYXQgdGhlIHVzZXIgdHlwZXMgdmVyYmF0aW0uCisgICAgICpWQVIgaXMgYSBtYWxsb2MnZCBzdHJpbmcsIG9yIE5VTEwgaWYgdGhlIHN0cmluZyBpcyBlbXB0eS4gICovCisgIHZhcl9zdHJpbmdfbm9lc2NhcGUsCisgIC8qIFN0cmluZyB3aGljaCBzdG9yZXMgYSBmaWxlbmFtZS4KKyAgICAgKlZBUiBpcyBhIG1hbGxvYydkIHN0cmluZywgb3IgTlVMTCBpZiB0aGUgc3RyaW5nIGlzIGVtcHR5LiAgKi8KKyAgdmFyX2ZpbGVuYW1lLAorICAvKiBaZXJvYWJsZUludGVnZXIuICAqVkFSIGlzIGFuIGludC4gIExpa2UgVW5zaWduZWQgSW50ZWdlciBleGNlcHQKKyAgICAgdGhhdCB6ZXJvIHJlYWxseSBtZWFucyB6ZXJvLiAgKi8KKyAgdmFyX3ppbnRlZ2VyLAorICAvKiBFbnVtZXJhdGVkIHR5cGUuICBDYW4gb25seSBoYXZlIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcy4gICpWQVIgaXMgYQorICAgICBjaGFyIHBvaW50ZXIgdG8gdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdGhhdCB3ZSBmaW5kLiAgKi8KKyAgdmFyX2VudW0KK30gdmFyX3R5cGVzOworCisvKiBUaGlzIHN0cnVjdHVyZSByZWNvcmRzIG9uZSBjb21tYW5kJ2QgZGVmaW5pdGlvbi4gICovCisKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50CisgIHsKKyAgICAvKiBQb2ludHMgdG8gbmV4dCBjb21tYW5kIGluIHRoaXMgbGlzdC4gICovCisgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKm5leHQ7CisKKyAgICAvKiBOYW1lIG9mIHRoaXMgY29tbWFuZC4gICovCisgICAgY2hhciAqbmFtZTsKKworICAgIC8qIENvbW1hbmQgY2xhc3M7IGNsYXNzIHZhbHVlcyBhcmUgY2hvc2VuIGJ5IGFwcGxpY2F0aW9uIHByb2dyYW0uICAqLworICAgIGVudW0gY29tbWFuZF9jbGFzcyBjbGFzczsKKworICAgIC8qIEZ1bmN0aW9uIGRlZmluaXRpb24gb2YgdGhpcyBjb21tYW5kLgorICAgICAgIE5PX0ZVTkNUSU9OIGZvciBjb21tYW5kIGNsYXNzIG5hbWVzIGFuZCBmb3IgaGVscCB0b3BpY3MgdGhhdAorICAgICAgIGFyZSBub3QgcmVhbGx5IGNvbW1hbmRzLiAgKi8KKyAgICB1bmlvbgorICAgICAgeworCS8qIElmIHR5cGUgaXMgbm90X3NldF9jbWQsIGNhbGwgaXQgbGlrZSB0aGlzOiAgKi8KKwl2b2lkICgqY2Z1bmMpIFBBUkFNUyAoKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkpOworCisJLyogSWYgdHlwZSBpcyBjbWRfc2V0IG9yIHNob3dfY21kLCBmaXJzdCBzZXQgdGhlIHZhcmlhYmxlcywgYW5kCisJICAgdGhlbiBjYWxsIHRoaXMuICAqLworCXZvaWQgKCpzZnVuYykgUEFSQU1TICgoY2hhciAqYXJncywgaW50IGZyb21fdHR5LAorCQkJICAgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjKSk7CisgICAgICB9IGZ1bmN0aW9uOworIyAgIGRlZmluZSBOT19GVU5DVElPTiAoKHZvaWQgKCopIFBBUkFNUygoY2hhciAqYXJncywgaW50IGZyb21fdHR5KSkpIDApCisKKyAgICAvKiBEb2N1bWVudGF0aW9uIG9mIHRoaXMgY29tbWFuZCAob3IgaGVscCB0b3BpYykuCisgICAgICAgRmlyc3QgbGluZSBpcyBicmllZiBkb2N1bWVudGF0aW9uOyByZW1haW5pbmcgbGluZXMgZm9ybSwgd2l0aCBpdCwKKyAgICAgICB0aGUgZnVsbCBkb2N1bWVudGF0aW9uLiAgRmlyc3QgbGluZSBzaG91bGQgZW5kIHdpdGggYSBwZXJpb2QuCisgICAgICAgRW50aXJlIHN0cmluZyBzaG91bGQgYWxzbyBlbmQgd2l0aCBhIHBlcmlvZCwgbm90IGEgbmV3bGluZS4gICovCisgICAgY2hhciAqZG9jOworCisgICAgLyogSG9vayBmb3IgYW5vdGhlciBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGlzIGNvbW1hbmQuICAqLworICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpob29rOworCisgICAgLyogTm9uemVybyBpZGVudGlmaWVzIGEgcHJlZml4IGNvbW1hbmQuICBGb3IgdGhlbSwgdGhlIGFkZHJlc3MKKyAgICAgICBvZiB0aGUgdmFyaWFibGUgY29udGFpbmluZyB0aGUgbGlzdCBvZiBzdWJjb21tYW5kcy4gICovCisgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKipwcmVmaXhsaXN0OworCisgICAgLyogRm9yIHByZWZpeCBjb21tYW5kcyBvbmx5OgorICAgICAgIFN0cmluZyBjb250YWluaW5nIHByZWZpeCBjb21tYW5kcyB0byBnZXQgaGVyZTogdGhpcyBvbmUKKyAgICAgICBwbHVzIGFueSBvdGhlcnMgbmVlZGVkIHRvIGdldCB0byBpdC4gIFNob3VsZCBlbmQgaW4gYSBzcGFjZS4KKyAgICAgICBJdCBpcyB1c2VkIGJlZm9yZSB0aGUgd29yZCAiY29tbWFuZCIgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgICBjb21tYW5kcyByZWFjaGVkIHRocm91Z2ggdGhpcyBwcmVmaXguICAqLworICAgIGNoYXIgKnByZWZpeG5hbWU7CisKKyAgICAvKiBGb3IgcHJlZml4IGNvbW1hbmRzIG9ubHk6CisgICAgICAgbm9uemVybyBtZWFucyBkbyBub3QgZ2V0IGFuIGVycm9yIGlmIHN1YmNvbW1hbmQgaXMgbm90CisgICAgICAgcmVjb2duaXplZDsgY2FsbCB0aGUgcHJlZml4J3Mgb3duIGZ1bmN0aW9uIGluIHRoYXQgY2FzZS4gICovCisgICAgY2hhciBhbGxvd191bmtub3duOworCisgICAgLyogTm9uemVybyBzYXlzIHRoaXMgaXMgYW4gYWJicmV2aWF0aW9uLCBhbmQgc2hvdWxkIG5vdAorICAgICAgIGJlIG1lbnRpb25lZCBpbiBsaXN0cyBvZiBjb21tYW5kcy4KKyAgICAgICBUaGlzIGFsbG93cyAiYnI8dGFiPiIgdG8gY29tcGxldGUgdG8gImJyZWFrIiwgd2hpY2ggaXQKKyAgICAgICBvdGhlcndpc2Ugd291bGRuJ3QuICAqLworICAgIGNoYXIgYWJicmV2X2ZsYWc7CisKKyAgICAvKiBDb21wbGV0aW9uIHJvdXRpbmUgZm9yIHRoaXMgY29tbWFuZC4gIFRFWFQgaXMgdGhlIHRleHQgYmV5b25kCisgICAgICAgd2hhdCB3YXMgbWF0Y2hlZCBmb3IgdGhlIGNvbW1hbmQgaXRzZWxmIChsZWFkaW5nIHdoaXRlc3BhY2UgaXMKKyAgICAgICBza2lwcGVkKS4gIEl0IHN0b3BzIHdoZXJlIHdlIGFyZSBzdXBwb3NlZCB0byBzdG9wIGNvbXBsZXRpbmcKKyAgICAgICAocmxfcG9pbnQpIGFuZCBpcyAnXDAnIHRlcm1pbmF0ZWQuCisKKyAgICAgICBSZXR1cm4gdmFsdWUgaXMgYSBtYWxsb2MnZCB2ZWN0b3Igb2YgcG9pbnRlcnMgdG8gcG9zc2libGUgY29tcGxldGlvbnMKKyAgICAgICB0ZXJtaW5hdGVkIHdpdGggTlVMTC4gIElmIHRoZXJlIGFyZSBubyBjb21wbGV0aW9ucywgcmV0dXJuaW5nIGEgcG9pbnRlcgorICAgICAgIHRvIGEgTlVMTCB3b3VsZCB3b3JrIGJ1dCByZXR1cm5pbmcgTlVMTCBpdHNlbGYgaXMgYWxzbyB2YWxpZC4KKyAgICAgICBXT1JEIHBvaW50cyBpbiB0aGUgc2FtZSBidWZmZXIgYXMgVEVYVCwgYW5kIGNvbXBsZXRpb25zIHNob3VsZCBiZQorICAgICAgIHJldHVybmVkIHJlbGF0aXZlIHRvIHRoaXMgcG9zaXRpb24uICBGb3IgZXhhbXBsZSwgc3VwcG9zZSBURVhUIGlzICJmb28iCisgICAgICAgYW5kIHdlIHdhbnQgdG8gY29tcGxldGUgdG8gImZvb2JhciIuICBJZiBXT1JEIGlzICJvbyIsIHJldHVybgorICAgICAgICJvb2JhciI7IGlmIFdPUkQgaXMgImJhei9mb28iLCByZXR1cm4gImJhei9mb29iYXIiLiAgKi8KKyAgICBjaGFyICoqICgqY29tcGxldGVyKSBQQVJBTVMgKChjaGFyICp0ZXh0LCBjaGFyICp3b3JkKSk7CisKKyAgICAvKiBUeXBlIG9mICJzZXQiIG9yICJzaG93IiBjb21tYW5kIChvciBTRVRfTk9UX1NFVCBpZiBub3QgInNldCIKKyAgICAgICBvciAic2hvdyIpLiAgKi8KKyAgICBjbWRfdHlwZXMgdHlwZTsKKworICAgIC8qIFBvaW50ZXIgdG8gdmFyaWFibGUgYWZmZWN0ZWQgYnkgInNldCIgYW5kICJzaG93Ii4gIERvZXNuJ3QgbWF0dGVyCisgICAgICAgaWYgdHlwZSBpcyBub3Rfc2V0LiAgKi8KKyAgICBjaGFyICp2YXI7CisKKyAgICAvKiBXaGF0IGtpbmQgb2YgdmFyaWFibGUgaXMgKlZBUj8gICovCisgICAgdmFyX3R5cGVzIHZhcl90eXBlOworCisgICAgLyogUG9pbnRlciB0byBOVUxMIHRlcm1pbmF0ZWQgbGlzdCBvZiBlbnVtZXJhdGVkIHZhbHVlcyAobGlrZSBhcmd2KS4gICovCisgICAgY2hhciAqKmVudW1zOworCisgICAgLyogUG9pbnRlciB0byBjb21tYW5kIHN0cmluZ3Mgb2YgdXNlci1kZWZpbmVkIGNvbW1hbmRzICovCisgICAgc3RydWN0IGNvbW1hbmRfbGluZSAqdXNlcl9jb21tYW5kczsKKworICAgIC8qIFBvaW50ZXIgdG8gY29tbWFuZCB0aGF0IGlzIGhvb2tlZCBieSB0aGlzIG9uZSwKKyAgICAgICBzbyB0aGUgaG9vayBjYW4gYmUgcmVtb3ZlZCB3aGVuIHRoaXMgb25lIGlzIGRlbGV0ZWQuICAqLworICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpob29rZWU7CisKKyAgICAvKiBQb2ludGVyIHRvIGNvbW1hbmQgdGhhdCBpcyBhbGlhc2VkIGJ5IHRoaXMgb25lLCBzbyB0aGUKKyAgICAgICBhbGlhc2VkIGNvbW1hbmQgY2FuIGJlIGxvY2F0ZWQgaW4gY2FzZSBpdCBoYXMgYmVlbiBob29rZWQuICAqLworICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjbWRfcG9pbnRlcjsKKyAgfTsKKworLyogRm9yd2FyZC1kZWNsYXJhdGlvbnMgb2YgdGhlIGVudHJ5LXBvaW50cyBvZiBjb21tYW5kLmMuICAqLworCitleHRlcm4gc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKgorYWRkX2NtZCBQQVJBTVMgKChjaGFyICosIGVudW0gY29tbWFuZF9jbGFzcywgdm9pZCAoKmZ1bikgKGNoYXIgKiwgaW50KSwKKwkJIGNoYXIgKiwgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKiopKTsKKworZXh0ZXJuIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICoKK2FkZF9hbGlhc19jbWQgUEFSQU1TICgoY2hhciAqLCBjaGFyICosIGVudW0gY29tbWFuZF9jbGFzcywgaW50LAorCQkgICAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKiopKTsKKworZXh0ZXJuIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICoKK2FkZF9wcmVmaXhfY21kIFBBUkFNUyAoKGNoYXIgKiwgZW51bSBjb21tYW5kX2NsYXNzLCB2b2lkICgqZnVuKSAoY2hhciAqLCBpbnQpLAorCQkJY2hhciAqLCBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqKiwgY2hhciAqLCBpbnQsCisJCQlzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqKikpOworCitleHRlcm4gc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKgorYWRkX2FiYnJldl9wcmVmaXhfY21kIFBBUkFNUyAoKGNoYXIgKiwgZW51bSBjb21tYW5kX2NsYXNzLAorCQkJICAgICAgIHZvaWQgKCpmdW4pIChjaGFyICosIGludCksIGNoYXIgKiwKKwkJCSAgICAgICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqKiwgY2hhciAqLCBpbnQsCisJCQkgICAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKiopKTsKKworZXh0ZXJuIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICoKK2xvb2t1cF9jbWQgUEFSQU1TICgoY2hhciAqKiwgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKiwgY2hhciAqLCBpbnQsIGludCkpOworCitleHRlcm4gc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKgorbG9va3VwX2NtZF8xIFBBUkFNUyAoKGNoYXIgKiosIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICosCisJCSAgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICoqLCBpbnQpKTsKKworZXh0ZXJuIHZvaWQKK2FkZF9jb20gUEFSQU1TICgoY2hhciAqLCBlbnVtIGNvbW1hbmRfY2xhc3MsIHZvaWQgKCpmdW4pKGNoYXIgKiwgaW50KSwKKwkJIGNoYXIgKikpOworCitleHRlcm4gdm9pZAorYWRkX2NvbV9hbGlhcyBQQVJBTVMgKChjaGFyICosIGNoYXIgKiwgZW51bSBjb21tYW5kX2NsYXNzLCBpbnQpKTsKKworZXh0ZXJuIHZvaWQKK2FkZF9pbmZvIFBBUkFNUyAoKGNoYXIgKiwgdm9pZCAoKmZ1bikgKGNoYXIgKiwgaW50KSwgY2hhciAqKSk7CisKK2V4dGVybiB2b2lkCithZGRfaW5mb19hbGlhcyBQQVJBTVMgKChjaGFyICosIGNoYXIgKiwgaW50KSk7CisKK2V4dGVybiBjaGFyICoqCitjb21wbGV0ZV9vbl9jbWRsaXN0IFBBUkFNUyAoKHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICosIGNoYXIgKiwgY2hhciAqKSk7CisKK2V4dGVybiBjaGFyICoqCitjb21wbGV0ZV9vbl9lbnVtIFBBUkFNUyAoKGNoYXIgKiplbnVtbGlzdCwgY2hhciAqLCBjaGFyICopKTsKKworZXh0ZXJuIHZvaWQKK2RlbGV0ZV9jbWQgUEFSQU1TICgoY2hhciAqLCBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqKikpOworCitleHRlcm4gdm9pZAoraGVscF9jbWQgUEFSQU1TICgoY2hhciAqLCBHREJfRklMRSAqKSk7CisKK2V4dGVybiB2b2lkCitoZWxwX2xpc3QgUEFSQU1TICgoc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKiwgY2hhciAqLCBlbnVtIGNvbW1hbmRfY2xhc3MsCisJCSAgIEdEQl9GSUxFICopKTsKKworZXh0ZXJuIHZvaWQKK2hlbHBfY21kX2xpc3QgUEFSQU1TICgoc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKiwgZW51bSBjb21tYW5kX2NsYXNzLCBjaGFyICosCisJCSAgICAgICBpbnQsIEdEQl9GSUxFICopKTsKKworZXh0ZXJuIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICoKK2FkZF9zZXRfY21kIFBBUkFNUyAoKGNoYXIgKiwgZW51bSBjb21tYW5kX2NsYXNzLCB2YXJfdHlwZXMsIGNoYXIgKiwgY2hhciAqLAorCQkgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICoqKSk7CisKK2V4dGVybiBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqCithZGRfc2V0X2VudW1fY21kIFBBUkFNUyAoKGNoYXIgKm5hbWUsIGVudW0gY29tbWFuZF9jbGFzcywgY2hhciAqbGlzdFtdLAorCQkJICBjaGFyICp2YXIsIGNoYXIgKmRvYywgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKipjKSk7CisKK2V4dGVybiBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqCithZGRfc2hvd19mcm9tX3NldCBQQVJBTVMgKChzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqLAorCQkJICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKiopKTsKKworLyogRG8gYSAic2V0IiBvciAic2hvdyIgY29tbWFuZC4gIEFSRyBpcyBOVUxMIGlmIG5vIGFyZ3VtZW50LCBvciB0aGUgdGV4dAorICAgb2YgdGhlIGFyZ3VtZW50LCBhbmQgRlJPTV9UVFkgaXMgbm9uemVybyBpZiB0aGlzIGNvbW1hbmQgaXMgYmVpbmcgZW50ZXJlZAorICAgZGlyZWN0bHkgYnkgdGhlIHVzZXIgKGkuZS4gdGhlc2UgYXJlIGp1c3QgbGlrZSBhbnkgb3RoZXIKKyAgIGNvbW1hbmQpLiAgQyBpcyB0aGUgY29tbWFuZCBsaXN0IGVsZW1lbnQgZm9yIHRoZSBjb21tYW5kLiAgKi8KKworZXh0ZXJuIHZvaWQKK2RvX3NldHNob3dfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCwgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKikpOworCisvKiBEbyBhICJzaG93IiBjb21tYW5kIGZvciBlYWNoIHRoaW5nIG9uIGEgY29tbWFuZCBsaXN0LiAgKi8KKworZXh0ZXJuIHZvaWQKK2NtZF9zaG93X2xpc3QgUEFSQU1TICgoc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKiwgaW50LCBjaGFyICopKTsKKworZXh0ZXJuIHZvaWQKK2Vycm9yX25vX2FyZyBQQVJBTVMgKChjaGFyICopKTsKKworZXh0ZXJuIHZvaWQKK2RvbnRfcmVwZWF0IFBBUkFNUyAoKHZvaWQpKTsKKworLyogVXNlZCB0byBtYXJrIGNvbW1hbmRzIHRoYXQgZG9uJ3QgZG8gYW55dGhpbmcuICBJZiB3ZSBqdXN0IGxlYXZlIHRoZQorICAgZnVuY3Rpb24gZmllbGQgTlVMTCwgdGhlIGNvbW1hbmQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBoZWxwIHRvcGljLCBvcgorICAgYXMgYSBjbGFzcyBvZiBjb21tYW5kcy4gICovCisKK2V4dGVybiB2b2lkCitub3RfanVzdF9oZWxwX2NsYXNzX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworI2VuZGlmIC8qICFkZWZpbmVkIChDT01NQU5EX0gpICovCmRpZmYgLS1naXQgYS9nZGIvY29tcGxhaW50cy5jIGIvZ2RiL2NvbXBsYWludHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzgwMzhkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbXBsYWludHMuYwpAQCAtMCwwICsxLDE2NiBAQAorLyogU3VwcG9ydCBmb3IgY29tcGxhaW50IGhhbmRsaW5nIGR1cmluZyBzeW1ib2wgcmVhZGluZyBpbiBHREIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEsIDE5OTIgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiY29tcGxhaW50cy5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorCisvKiBTdHJ1Y3R1cmUgdG8gbWFuYWdlIGNvbXBsYWludHMgYWJvdXQgc3ltYm9sIGZpbGUgY29udGVudHMuICAqLworCitzdHJ1Y3QgY29tcGxhaW50IGNvbXBsYWludF9yb290WzFdID0geworICB7CisgICAgKGNoYXIgKikgTlVMTCwJLyogQ29tcGxhaW50IG1lc3NhZ2UgKi8KKyAgICAwLAkJCS8qIENvbXBsYWludCBjb3VudGVyICovCisgICAgY29tcGxhaW50X3Jvb3QJLyogTmV4dCBjb21wbGFpbnQuICovCisgIH0KK307CisKKy8qIEhvdyBtYW55IGNvbXBsYWludHMgYWJvdXQgYSBwYXJ0aWN1bGFyIHRoaW5nIHNob3VsZCBiZSBwcmludGVkIGJlZm9yZQorICAgd2Ugc3RvcCB3aGluaW5nIGFib3V0IGl0PyAgRGVmYXVsdCBpcyBubyB3aGluaW5nIGF0IGFsbCwgc2luY2Ugc28gbWFueQorICAgc3lzdGVtcyBoYXZlIGlsbC1jb25zdHJ1Y3RlZCBzeW1ib2wgZmlsZXMuICAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IHN0b3Bfd2hpbmluZyA9IDA7CisKKy8qIFNob3VsZCBlYWNoIGNvbXBsYWludCBiZSBzZWxmIGV4cGxhbmF0b3J5LCBvciBzaG91bGQgd2UgYXNzdW1lIHRoYXQKKyAgIGEgc2VyaWVzIG9mIGNvbXBsYWludHMgaXMgYmVpbmcgcHJvZHVjZWQ/IAorICAgY2FzZSAwOiAgc2VsZiBleHBsYW5hdG9yeSBtZXNzYWdlLgorICAgY2FzZSAxOiAgRmlyc3QgbWVzc2FnZSBvZiBhIHNlcmllcyB0aGF0IG11c3Qgc3RhcnQgb2ZmIHdpdGggZXhwbGFuYXRpb24uCisgICBjYXNlIDI6ICBTdWJzZXF1ZW50IG1lc3NhZ2UsIHdoZW4gdXNlciBhbHJlYWR5IGtub3dzIHdlIGFyZSByZWFkaW5nCisgICAgICAgICAgICBzeW1ib2xzIGFuZCB3ZSBjYW4ganVzdCBzdGF0ZSBvdXIgcGllY2UuICAqLworCitzdGF0aWMgaW50IGNvbXBsYWludF9zZXJpZXMgPSAwOworCisvKiBFeHRlcm5hbCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyByZWZlcmVuY2VkLiAqLworCitleHRlcm4gaW50IGluZm9fdmVyYm9zZTsKKworDAorLyogRnVuY3Rpb25zIHRvIGhhbmRsZSBjb21wbGFpbnRzIGR1cmluZyBzeW1ib2wgcmVhZGluZy4gICovCisKKy8qIFByaW50IGEgY29tcGxhaW50IGFib3V0IHRoZSBpbnB1dCBzeW1ib2xzLCBhbmQgbGluayB0aGUgY29tcGxhaW50IGJsb2NrCisgICBpbnRvIGEgY2hhaW4gZm9yIGxhdGVyIGhhbmRsaW5nLiAgKi8KKworLyogVkFSQVJHUyAqLwordm9pZAorI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworY29tcGxhaW4gKHN0cnVjdCBjb21wbGFpbnQgKmNvbXBsYWludCwgLi4uKQorI2Vsc2UKK2NvbXBsYWluICh2YV9hbGlzdCkKKyAgICAgdmFfZGNsCisjZW5kaWYKK3sKKyAgdmFfbGlzdCBhcmdzOworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworICB2YV9zdGFydCAoYXJncywgY29tcGxhaW50KTsKKyNlbHNlCisgIHN0cnVjdCBjb21wbGFpbnQgKmNvbXBsYWludDsKKworICB2YV9zdGFydCAoYXJncyk7CisgIGNvbXBsYWludCA9IHZhX2FyZyAoYXJncywgc3RydWN0IGNvbXBsYWludCAqKTsKKyNlbmRpZgorCisgIGNvbXBsYWludCAtPiBjb3VudGVyKys7CisgIGlmIChjb21wbGFpbnQgLT4gbmV4dCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGNvbXBsYWludCAtPiBuZXh0ID0gY29tcGxhaW50X3Jvb3QgLT4gbmV4dDsKKyAgICAgIGNvbXBsYWludF9yb290IC0+IG5leHQgPSBjb21wbGFpbnQ7CisgICAgfQorICBpZiAoY29tcGxhaW50IC0+IGNvdW50ZXIgPiBzdG9wX3doaW5pbmcpCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgd3JhcF9oZXJlICgiIik7CisKKyAgc3dpdGNoIChjb21wbGFpbnRfc2VyaWVzICsgKGluZm9fdmVyYm9zZSA8PCAxKSkKKyAgICB7CisKKyAgICAgIC8qIElzb2xhdGVkIG1lc3NhZ2VzLCBtdXN0IGJlIHNlbGYtZXhwbGFuYXRvcnkuICAqLworICAgICAgY2FzZSAwOgorICAgICAgICBiZWdpbl9saW5lICgpOworICAgICAgICBwdXRzX2ZpbHRlcmVkICgiRHVyaW5nIHN5bWJvbCByZWFkaW5nLCAiKTsKKwl3cmFwX2hlcmUgKCIiKTsKKwl2cHJpbnRmX2ZpbHRlcmVkIChjb21wbGFpbnQgLT4gbWVzc2FnZSwgYXJncyk7CisJcHV0c19maWx0ZXJlZCAoIi5cbiIpOworCWJyZWFrOworCisgICAgICAvKiBGaXJzdCBvZiBhIHNlcmllcywgd2l0aG91dCBgc2V0IHZlcmJvc2UnLiAgKi8KKyAgICAgIGNhc2UgMToKKyAgICAgICAgYmVnaW5fbGluZSAoKTsKKwlwdXRzX2ZpbHRlcmVkICgiRHVyaW5nIHN5bWJvbCByZWFkaW5nLi4uIik7CisJdnByaW50Zl9maWx0ZXJlZCAoY29tcGxhaW50IC0+IG1lc3NhZ2UsIGFyZ3MpOworCXB1dHNfZmlsdGVyZWQgKCIuLi4iKTsKKwl3cmFwX2hlcmUgKCIiKTsKKwljb21wbGFpbnRfc2VyaWVzKys7CisJYnJlYWs7CisKKyAgICAgIC8qIFN1YnNlcXVlbnQgbWVzc2FnZXMgb2YgYSBzZXJpZXMsIG9yIG1lc3NhZ2VzIHVuZGVyIGBzZXQgdmVyYm9zZScuCisJIChXZSdsbCBhbHJlYWR5IGhhdmUgcHJvZHVjZWQgYSAiUmVhZGluZyBpbiBzeW1ib2xzIGZvciBYWFguLi4iCisJIG1lc3NhZ2UgYW5kIHdpbGwgY2xlYW4gdXAgYXQgdGhlIGVuZCB3aXRoIGEgbmV3bGluZS4pICAqLworICAgICAgZGVmYXVsdDoKKwl2cHJpbnRmX2ZpbHRlcmVkIChjb21wbGFpbnQgLT4gbWVzc2FnZSwgYXJncyk7CisJcHV0c19maWx0ZXJlZCAoIi4uLiIpOworCXdyYXBfaGVyZSAoIiIpOworICAgIH0KKyAgLyogSWYgR0RCIGR1bXBzIGNvcmUsIHdlJ2QgbGlrZSB0byBzZWUgdGhlIGNvbXBsYWludHMgZmlyc3QuICBQcmVzdW1hYmx5CisgICAgIEdEQiB3aWxsIG5vdCBiZSBzZW5kaW5nIHNvIG1hbnkgY29tcGxhaW50cyB0aGF0IHRoaXMgYmVjb21lcyBhCisgICAgIHBlcmZvcm1hbmNlIGhvZy4gICovCisgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisgIHZhX2VuZCAoYXJncyk7Cit9CisKKy8qIENsZWFyIG91dCBhbGwgY29tcGxhaW50IGNvdW50ZXJzIHRoYXQgaGF2ZSBldmVyIGJlZW4gaW5jcmVtZW50ZWQuCisgICBJZiBzeW1fcmVhZGluZyBpcyAxLCBiZSBsZXNzIHZlcmJvc2UgYWJvdXQgc3VjY2Vzc2l2ZSBjb21wbGFpbnRzLAorICAgc2luY2UgdGhlIG1lc3NhZ2VzIGFyZSBhcHBlYXJpbmcgYWxsIHRvZ2V0aGVyIGR1cmluZyBhIGNvbW1hbmQgdGhhdAorICAgcmVhZHMgc3ltYm9scyAocmF0aGVyIHRoYW4gc2NhdHRlcmVkIGFyb3VuZCBhcyBwc3ltdGFicyBnZXQgZmxlc2hlZAorICAgb3V0IGludG8gc3ltdGFicyBhdCByYW5kb20gdGltZXMpLiAgSWYgbm9pc3kgaXMgMSwgd2UgYXJlIGluIGEKKyAgIG5vaXN5IHN5bWJvbCByZWFkaW5nIGNvbW1hbmQsIGFuZCBvdXIgY2FsbGVyIHdpbGwgcHJpbnQgZW5vdWdoCisgICBjb250ZXh0IGZvciB0aGUgdXNlciB0byBmaWd1cmUgaXQgb3V0LiAgKi8KKwordm9pZAorY2xlYXJfY29tcGxhaW50cyAoc3ltX3JlYWRpbmcsIG5vaXN5KQorICAgICBpbnQgc3ltX3JlYWRpbmc7CisgICAgIGludCBub2lzeTsKK3sKKyAgc3RydWN0IGNvbXBsYWludCAqcDsKKworICBmb3IgKHAgPSBjb21wbGFpbnRfcm9vdCAtPiBuZXh0OyBwICE9IGNvbXBsYWludF9yb290OyBwID0gcCAtPiBuZXh0KQorICAgIHsKKyAgICAgIHAgLT4gY291bnRlciA9IDA7CisgICAgfQorCisgIGlmICghc3ltX3JlYWRpbmcgJiYgIW5vaXN5ICYmIGNvbXBsYWludF9zZXJpZXMgPiAxKQorICAgIHsKKyAgICAgIC8qIFRlcm1pbmF0ZSBwcmV2aW91cyBzZXJpZXMsIHNpbmNlIGNhbGxlciB3b24ndC4gICovCisgICAgICBwdXRzX2ZpbHRlcmVkICgiXG4iKTsKKyAgICB9CisKKyAgY29tcGxhaW50X3NlcmllcyA9IHN5bV9yZWFkaW5nID8gMSArIG5vaXN5IDogMDsKK30KKwordm9pZAorX2luaXRpYWxpemVfY29tcGxhaW50cyAoKQoreworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoImNvbXBsYWludHMiLCBjbGFzc19zdXBwb3J0LCB2YXJfemludGVnZXIsCisJCSAgKGNoYXIgKikgJnN0b3Bfd2hpbmluZywKKwkJICAiU2V0IG1heCBudW1iZXIgb2YgY29tcGxhaW50cyBhYm91dCBpbmNvcnJlY3Qgc3ltYm9scy4iLAorCQkgICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKKworfQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbXBsYWludHMuaCBiL2dkYi9jb21wbGFpbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5YjVkZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb21wbGFpbnRzLmgKQEAgLTAsMCArMSw1MyBAQAorLyogRGVmaW5pdGlvbnMgZm9yIGNvbXBsYWludCBoYW5kbGluZyBkdXJpbmcgc3ltYm9sIHJlYWRpbmcgaW4gR0RCLgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNpZiAhZGVmaW5lZCAoQ09NUExBSU5UU19IKQorI2RlZmluZSBDT01QTEFJTlRTX0gKKworCisvKiBTdXBwb3J0IGZvciBjb21wbGFpbmluZyBhYm91dCB0aGluZ3MgaW4gdGhlIHN5bWJvbCBmaWxlIHRoYXQgYXJlbid0CisgICBjYXRhc3Ryb3BoaWMuCisKKyAgIEVhY2ggc3VjaCB0aGluZyBnZXRzIGEgY291bnRlci4gIFRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgdGhlIHByb2JsZW0sCisgICBkdXJpbmcgYSBzeW1ib2wgcmVhZCwgd2UgcmVwb3J0IGl0LiAgQXQgdGhlIGVuZCBvZiBzeW1ib2wgcmVhZGluZywKKyAgIGlmIHZlcmJvc2UsIHdlIHJlcG9ydCBob3cgbWFueSBvZiBlYWNoIHByb2JsZW0gd2UgaGFkLiAgKi8KKworc3RydWN0IGNvbXBsYWludAoreworICBjaGFyICptZXNzYWdlOworICB1bnNpZ25lZCBjb3VudGVyOworICBzdHJ1Y3QgY29tcGxhaW50ICpuZXh0OworfTsKKworLyogUm9vdCBvZiB0aGUgY2hhaW4gb2YgY29tcGxhaW50cyB0aGF0IGhhdmUgYXQgc29tZSBwb2ludCBiZWVuIGlzc3VlZC4gCisgICBUaGlzIGlzIHVzZWQgdG8gcmVzZXQgdGhlIGNvdW50ZXJzLCBhbmQvb3IgcmVwb3J0IHRoZSB0b3RhbCBjb3VudHMuICAqLworCitleHRlcm4gc3RydWN0IGNvbXBsYWludCBjb21wbGFpbnRfcm9vdFsxXTsKKworLyogRnVuY3Rpb25zIHRoYXQgaGFuZGxlIGNvbXBsYWludHMuICAoaW4gY29tcGxhaW50cy5jKSAgKi8KKworZXh0ZXJuIHZvaWQKK2NvbXBsYWluIFBBUkFNUyAoKHN0cnVjdCBjb21wbGFpbnQgKiwgLi4uKSk7CisKK2V4dGVybiB2b2lkCitjbGVhcl9jb21wbGFpbnRzIFBBUkFNUyAoKGludCwgaW50KSk7CisKKworI2VuZGlmCS8qICFkZWZpbmVkIChDT01QTEFJTlRTX0gpICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnLmluIGIvZ2RiL2NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmJmZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy5pbgpAQCAtMCwwICsxLDMyNSBAQAorLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisKKy8qIFdoZXRoZXIgbWFsbG9jIG11c3QgYmUgZGVjbGFyZWQgZXZlbiBpZiA8c3RkbGliLmg+IGlzIGluY2x1ZGVkLiAgKi8KKyN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQworCisvKiBXaGV0aGVyIHJlYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRsaWIuaD4gaXMgaW5jbHVkZWQuICAqLworI3VuZGVmIE5FRURfREVDTEFSQVRJT05fUkVBTExPQworCisvKiBXaGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRsaWIuaD4gaXMgaW5jbHVkZWQuICAqLworI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQorCisvKiBXaGV0aGVyIHN0cmVycm9yIG11c3QgYmUgZGVjbGFyZWQgZXZlbiBpZiA8c3RyaW5nLmg+IGlzIGluY2x1ZGVkLiAgKi8KKyN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUkVSUk9SCisKKy8qIERlZmluZSBpZiBvbiBBSVggMy4KKyAgIFN5c3RlbSBoZWFkZXJzIHNvbWV0aW1lcyBkZWZpbmUgdGhpcy4KKyAgIFdlIGp1c3Qgd2FudCB0byBhdm9pZCBhIHJlZGVmaW5pdGlvbiBlcnJvciBtZXNzYWdlLiAgKi8KKyNpZm5kZWYgX0FMTF9TT1VSQ0UKKyN1bmRlZiBfQUxMX1NPVVJDRQorI2VuZGlmCisKKy8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCisjdW5kZWYgQ19BTExPQ0EKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCisjdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCisjdW5kZWYgSEFWRV9BTExPQ0EKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgaWYgdGhlIGBsb25nIGRvdWJsZScgdHlwZSB3b3Jrcy4gICovCisjdW5kZWYgSEFWRV9MT05HX0RPVUJMRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCisjdW5kZWYgaW5saW5lCisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgb2ZmX3QKKworLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCisjdW5kZWYgX1BPU0lYX1NPVVJDRQorCisvKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoaW50IG9yIHZvaWQpLiAgKi8KKyN1bmRlZiBSRVRTSUdUWVBFCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIHNpemVfdAorCisvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKKyAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgorIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgorICovCisjdW5kZWYgU1RBQ0tfRElSRUNUSU9OCisKKy8qIERlZmluZSBpZiB0aGUgYFNfSVMqJyBtYWNyb3MgaW4gPHN5cy9zdGF0Lmg+IGRvIG5vdCB3b3JrIHByb3Blcmx5LiAgKi8KKyN1bmRlZiBTVEFUX01BQ1JPU19CUk9LRU4KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KKyN1bmRlZiBTVERDX0hFQURFUlMKKworLyogRGVmaW5lIGlmIGlvY3RsIGFyZ3VtZW50IFBJT0NTRVQgaXMgYXZhaWxhYmxlLiAqLworI3VuZGVmIEhBVkVfUFJPQ0ZTX1BJT0NTRVQKKworLyogL3Byb2MgUElEIGVudHJpZXMgYXJlIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdGhlIGZpbGVzCisgICBjdGwgYXMgbWFwIHN0YXR1cyAqLworI3VuZGVmIEhBVkVfTVVMVElQTEVfUFJPQ19GRFMKKworLyogRGVmaW5lIGlmIHRoZSBgbG9uZyBsb25nJyB0eXBlIHdvcmtzLiAgKi8KKyN1bmRlZiBDQ19IQVNfTE9OR19MT05HCisKKy8qIERlZmluZSBpZiB0aGUgImxsIiBmb3JtYXQgd29ya3MgdG8gcHJpbnQgbG9uZyBsb25nIGludHMuICovCisjdW5kZWYgUFJJTlRGX0hBU19MT05HX0xPTkcKKworLyogRGVmaW5lIGlmIHRoZSAiJUxnIiBmb3JtYXQgd29ya3MgdG8gcHJpbnQgbG9uZyBkb3VibGVzLiAqLworI3VuZGVmIFBSSU5URl9IQVNfTE9OR19ET1VCTEUKKworLyogRGVmaW5lIGlmIHRoZSAiJUxnIiBmb3JtYXQgd29ya3MgdG8gc2NhbiBsb25nIGRvdWJsZXMuICovCisjdW5kZWYgU0NBTkZfSEFTX0xPTkdfRE9VQkxFCisKKy8qIERlZmluZSBpZiB1c2luZyBTb2xhcmlzIHRocmVhZCBkZWJ1Z2dpbmcuICAqLworI3VuZGVmIEhBVkVfVEhSRUFEX0RCX0xJQgorCisvKiBEZWZpbmUgb24gYSBHTlUvTGludXggc3lzdGVtIHRvIHdvcmsgYXJvdW5kIHByb2JsZW1zIGluIHN5cy9wcm9jZnMuaC4gICovCisjdW5kZWYgU1RBUlRfSU5GRVJJT1JfVFJBUFNfRVhQRUNURUQKKyN1bmRlZiBzeXNfcXVvdGFjdGwKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIEhQVVggdGhyZWFkcyAqLworI3VuZGVmIEhBVkVfSFBVWF9USFJFQURfU1VQUE9SVAorCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBtZW1vcnkgbWFwcGVkIG1hbGxvYyBwYWNrYWdlIChtbWFsbG9jKS4gKi8KKyN1bmRlZiBVU0VfTU1BTExPQworCisvKiBEZWZpbmUgaWYgdGhlIHJ1bnRpbWUgdXNlcyBhIHJvdXRpbmUgZnJvbSBtbWFsbG9jIGJlZm9yZSBnZGIgaGFzIGEgY2hhbmNlCisgICB0byBpbml0aWFsaXplIG1tYWxsb2MsIGFuZCB3ZSB3YW50IHRvIGZvcmNlIGNoZWNraW5nIHRvIGJlIHVzZWQgYW55d2F5LgorICAgVGhpcyBtYXkgY2F1c2Ugc3B1cmlvdXMgbWVtb3J5IGNvcnJ1cHRpb24gbWVzc2FnZXMgaWYgdGhlIHJ1bnRpbWUgdHJpZXMKKyAgIHRvIGV4cGxpY2l0bHkgZGVhbGxvY2F0ZSB0aGF0IG1lbW9yeSB3aGVuIGdkYiBjYWxscyBleGl0LiAqLworI3VuZGVmIE1NQ0hFQ0tfRk9SQ0UKKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgZnVsbC1zY3JlZW4gdGVybWluYWwgdXNlciBpbnRlcmZhY2UuICAqLworI3VuZGVmIFRVSQorCisvKiBEZWZpbmUgaWYgPHByb2Nfc2VydmljZS5oPiBvbiBzb2xhcmlzIHVzZXMgaW50IGluc3RlYWQgb2YKKyAgIHNpemVfdCwgYW5kIGFzc29ydGVkIG90aGVyIHR5cGUgY2hhbmdlcy4gKi8KKyN1bmRlZiBQUk9DX1NFUlZJQ0VfSVNfT0xECisKKy8qIFNldCB0byB0cnVlIGlmIHRoZSBzYXZlX3N0YXRlX3Qgc3RydWN0dXJlIGlzIHByZXNlbnQgKi8KKyNkZWZpbmUgSEFWRV9TVFJVQ1RfU0FWRV9TVEFURV9UIDAKKworLyogU2V0IHRvIHRydWUgaWYgdGhlIHNhdmVfc3RhdGVfdCBzdHJ1Y3R1cmUgaGFzIHRoZSBzc193aWRlIG1lbWJlciAqLworI2RlZmluZSBIQVZFX1NUUlVDVF9NRU1CRVJfU1NfV0lERSAwCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYmNvcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfQkNPUFkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBidG93YyBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9CVE9XQworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGJ6ZXJvIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0JaRVJPCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0RDR0VUVEVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRDV0QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRQQUdFU0laRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGlzYXNjaWkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfSVNBU0NJSQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9NVU5NQVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfUFVURU5WCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2JyayBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TQlJLCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NFVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRMT0NBTEUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRwZ2lkIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NFVFBHSUQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzaWdhY3Rpb24gZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0lHQUNUSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDSFIKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9BUkdaX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXNtL2RlYnVncmVnLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0FTTV9ERUJVR1JFR19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGN0eXBlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0NUWVBFX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8Y3Vyc2VzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0NVUlNFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGVuZGlhbi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9FTkRJQU5fSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGluay5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9MSU5LX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9NQUxMT0NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTUVNT1JZX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxvYmpsaXN0Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX09CSkxJU1RfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxwdHJhY2UuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfUFRSQUNFX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c2d0dHkuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU0dUVFlfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRkZWYuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1REREVGX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZGVidWdyZWcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX0RFQlVHUkVHX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wcm9jZnMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1BST0NGU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wdHJhY2UuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1BUUkFDRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZWcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1JFR19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy93YWl0Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19XQUlUX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dGVybS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9URVJNX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dGVybWlvLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1RFUk1JT19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRlcm1pb3MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVEVSTUlPU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVkFMVUVTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8d2FpdC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9XQUlUX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8d2NoYXIuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfV0NIQVJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx3Y3R5cGUuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfV0NUWVBFX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkbCBsaWJyYXJ5ICgtbGRsKS4gICovCisjdW5kZWYgSEFWRV9MSUJETAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG0gbGlicmFyeSAoLWxtKS4gICovCisjdW5kZWYgSEFWRV9MSUJNCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdyBsaWJyYXJ5ICgtbHcpLiAgKi8KKyN1bmRlZiBIQVZFX0xJQlcKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLworI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKKworLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCisjdW5kZWYgSEFWRV9HRVRURVhUCisKKy8qIERlZmluZSBpZiBtYWxsb2MgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MKKworLyogRGVmaW5lIGlmIHJlYWxsb2MgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9SRUFMTE9DCisKKy8qIERlZmluZSBpZiBmcmVlIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQorCisvKiBEZWZpbmUgaWYgc3RyZXJyb3IgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJFUlJPUgorCisvKiBEZWZpbmUgaWYgc3RyZHVwIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU1RSRFVQCisKKy8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgcHN0YXR1c190LiAqLworI3VuZGVmIEhBVkVfUFNUQVRVU19UCisKKy8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgcHJydW5fdC4gKi8KKyN1bmRlZiBIQVZFX1BSUlVOX1QKKworLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBncmVnc2V0X3QuICovCisjdW5kZWYgSEFWRV9HUkVHU0VUX1QKKworLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBmcHJlZ3NldF90LiAqLworI3VuZGVmIEhBVkVfRlBSRUdTRVRfVAorCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2EyOWsvYTI5ay1rZXJuLm10IGIvZ2RiL2NvbmZpZy9hMjlrL2EyOWsta2Vybi5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWEyZTUyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9hMjlrL2EyOWsta2Vybi5tdApAQCAtMCwwICsxLDEzIEBACisjIFRhcmdldDogUmVtb3RlIEFNRCAyOTAwMCB0aGF0IHJ1bnMgVW5peCBrZXJuZWwgb24gTllVIFVsdHJhMyBwcm9jZXNzb3IgYm9hcmQKKworIyBUaGlzIGJ1aWxkcyBhIGdkYiB0aGF0IHNob3VsZCBydW4gb24gYSBob3N0ICh3ZSB1c2Ugc3VuM29zNCkgdGhhdAorIyB0aGVuIGNvbW11bmljYXRlcyBvdmVyIHRoZSBzZXJpYWwgbGluZSB0byBlaXRoZXIgYW4gQWRhcHQgb3IgTWluaU1vbiwKKyMgZm9yIHVzZSBpbiBkZWJ1Z2dpbmcgVW5peCBrZXJuZWxzLgorIyBBcyBjb21wYXJlZCB0byBvcmRpbmFyeSByZW1vdGUgMjlLIGRlYnVnZ2luZywgdGhpcyBjaGFuZ2VzIHRoZSByZWdpc3RlcgorIyBudW1iZXJpbmcgYSBiaXQsIHRvIGhvbGQga2VybmVsIHJlZ3MsIGFuZCBhZGRzIHN1cHBvcnQgZm9yIGxvb2tpbmcgYXQKKyMgdGhlIHVwYWdlLgorCitUREVQRklMRVM9IGEyOWstdGRlcC5vIHJlbW90ZS1tbS5vIHJlbW90ZS1hZGFwdC5vCitUTV9GSUxFPSB0bS11bHRyYTMuaAorCitNVF9DRkxBR1MgPSAtREtFUk5FTF9ERUJVR0dJTkcgLUROT19ISUZfU1VQUE9SVApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hMjlrL2EyOWstdWRpLm10IGIvZ2RiL2NvbmZpZy9hMjlrL2EyOWstdWRpLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YjMzZTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2EyOWsvYTI5ay11ZGkubXQKQEAgLTAsMCArMSw1IEBACisjIFRhcmdldDogQU1EIDI5MDAwIG9uIEVCMjlLIGJvYXJkIG92ZXIgYSBzZXJpYWwgbGluZQorVERFUEZJTEVTPSBhMjlrLXRkZXAubyByZW1vdGUtdWRpLm8gdWRpcDJzb2MubyB1ZHIubyB1ZGkyZ28zMi5vCitUTV9GSUxFPSB0bS1hMjlrLmgKKworTVRfQ0ZMQUdTID0gJChIT1NUX0lQQykKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvYTI5ay9hMjlrLm10IGIvZ2RiL2NvbmZpZy9hMjlrL2EyOWsubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmNTkxMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvYTI5ay9hMjlrLm10CkBAIC0wLDAgKzEsNSBAQAorIyBUYXJnZXQ6IEFNRCAyOTAwMAorVERFUEZJTEVTPSBhMjlrLXRkZXAubyByZW1vdGUtZWIubyByZW1vdGUtYWRhcHQubworVE1fRklMRT0gdG0tYTI5ay5oCisKK01UX0NGTEFHUyA9IC1ETk9fSElGX1NVUFBPUlQKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvYTI5ay9ubS11bHRyYTMuaCBiL2dkYi9jb25maWcvYTI5ay9ubS11bHRyYTMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2JjNDc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9hMjlrL25tLXVsdHJhMy5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIEhvc3QgZGVmaW5pdGlvbnMgZm9yIEdEQiBydW5uaW5nIG9uIGFuIGEyOWsgTllVIFVsdHJhY29tcHV0ZXIKKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIFdvb2QgKHdvb2RAbGFiLnVsdHJhLm55dS5lZHUpLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIElmIHdlIGV2ZXIgKmRvKiBlbmQgdXAgdXNpbmcgdGhlIHN0YW5kYXJkIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycywKKyAgIHRoaXMgaXMgdGhlIHJpZ2h0IHZhbHVlIGZvciBVX1JFR1NfT0ZGU0VULiAgKi8KKyNkZWZpbmUJVV9SRUdTX09GRlNFVAkwCisKKy8qIE92ZXJyaWRlIGNvcGllcyBvZiB7ZmV0Y2gsc3RvcmV9X2luZmVyaW9yX3JlZ2lzdGVycyBpbiBpbmZwdHJhY2UuYy4gICovCisjZGVmaW5lIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hMjlrL3RtLWEyOWsuaCBiL2dkYi9jb25maWcvYTI5ay90bS1hMjlrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5MmVjNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvYTI5ay90bS1hMjlrLmgKQEAgLTAsMCArMSw3MDcgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIHRhcmdldCBtYWNoaW5lIEFNRCAyOTAwMCwgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuICBXcml0dGVuIGJ5IEppbSBLaW5nZG9uLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFBhcmFtZXRlcnMgZm9yIGFuIEVCMjlLIChhIGJvYXJkIHdoaWNoIHBsdWdzIGludG8gYSBQQyBhbmQgaXMKKyAgIGFjY2Vzc2VkIHRocm91Z2ggRUJNT04gc29mdHdhcmUgcnVubmluZyBvbiB0aGUgUEMsIHdoaWNoIHdlCisgICB1c2UgYXMgd2UnZCB1c2UgYSByZW1vdGUgc3R1YiAoc2VlIHJlbW90ZS1lYi5jKS4KKworICAgSWYgZ2RiIGlzIHBvcnRlZCB0byBvdGhlciBhMjlrIG1hY2hpbmVzL3N5c3RlbXMsIHRoZQorICAgbWFjaGluZS9zeXN0ZW0tc3BlY2lmaWMgcGFydHMgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGlzIGZpbGUgKGEKKyAgIGxhIHRtLW02OGsuaCkuICAqLworCisvKiBCeXRlIG9yZGVyIGlzIGNvbmZpZ3VyYWJsZSwgYnV0IHRoaXMgbWFjaGluZSBydW5zIGJpZy1lbmRpYW4uICAqLworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUiBCSUdfRU5ESUFOCisKKy8qIEZsb2F0aW5nIHBvaW50IHVzZXMgSUVFRSByZXByZXNlbnRhdGlvbnMuICAqLworI2RlZmluZSBJRUVFX0ZMT0FUCisKKy8qIFJlY29nbml6ZSBvdXIgbWFnaWMgbnVtYmVyLiAgKi8KKyNkZWZpbmUgQkFETUFHKHgpICgoeCkuZl9tYWdpYyAhPSAwNTcyKQorCisvKiBPZmZzZXQgZnJvbSBhZGRyZXNzIG9mIGZ1bmN0aW9uIHRvIHN0YXJ0IG9mIGl0cyBjb2RlLgorICAgWmVybyBvbiBtb3N0IG1hY2hpbmVzLiAgKi8KKworI2RlZmluZSBGVU5DVElPTl9TVEFSVF9PRkZTRVQgMAorCisvKiBBZHZhbmNlIFBDIGFjcm9zcyBhbnkgZnVuY3Rpb24gZW50cnkgcHJvbG9ndWUgaW5zdHJ1Y3Rpb25zCisgICB0byByZWFjaCBzb21lICJyZWFsIiBjb2RlLiAgKi8KKworI2RlZmluZSBTS0lQX1BST0xPR1VFKHBjKSBcCisgIHsgcGMgPSBza2lwX3Byb2xvZ3VlIChwYyk7IH0KK0NPUkVfQUREUiBza2lwX3Byb2xvZ3VlICgpOworCisvKiBJbW1lZGlhdGVseSBhZnRlciBhIGZ1bmN0aW9uIGNhbGwsIHJldHVybiB0aGUgc2F2ZWQgcGMuCisgICBDYW4ndCBnbyB0aHJvdWdoIHRoZSBmcmFtZXMgZm9yIHRoaXMgYmVjYXVzZSBvbiBzb21lIG1hY2hpbmVzCisgICB0aGUgbmV3IGZyYW1lIGlzIG5vdCBzZXQgdXAgdW50aWwgdGhlIG5ldyBmdW5jdGlvbiBleGVjdXRlcworICAgc29tZSBpbnN0cnVjdGlvbnMuICAqLworCisjZGVmaW5lIFNBVkVEX1BDX0FGVEVSX0NBTEwoZnJhbWUpICgoZnJhbWUtPmZsYWdzICYgVFJBTlNQQVJFTlRfRlJBTUUpIFwKKwkJCQkgICAgPyByZWFkX3JlZ2lzdGVyIChUUENfUkVHTlVNKSBcCisJCQkJICAgIDogcmVhZF9yZWdpc3RlciAoTFIwX1JFR05VTSkpCisKKy8qIFN0YWNrIGdyb3dzIGRvd253YXJkLiAgKi8KKworI2RlZmluZSBJTk5FUl9USEFOKGxocyxyaHMpICgobGhzKSA8IChyaHMpKQorCisvKiBTdGFjayBtdXN0IGJlIGFsaWduZWQgb24gMzItYml0IGJvdW5kYXJpZXMgd2hlbiBzeW50aGVzaXppbmcKKyAgIGZ1bmN0aW9uIGNhbGxzLiAqLworCisjZGVmaW5lIFNUQUNLX0FMSUdOKEFERFIpICgoKEFERFIpICsgMykgJiB+MykKKworLyogU2VxdWVuY2Ugb2YgYnl0ZXMgZm9yIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uICAqLworLyogQVNORVEgMHg1MCwgZ3IxLCBncjEKKyAgIFRoZSB0cmFwIG51bWJlciAweDUwIGlzIGNob3NlbiBhcmJpdHJhcmlseS4KKyAgIFdlIGxldCB0aGUgY29tbWFuZCBsaW5lIChvciBwcmV2aW91c2x5IGluY2x1ZGVkIGZpbGVzKSBvdmVycmlkZSB0aGlzCisgICBzZXR0aW5nLiAgKi8KKyNpZm5kZWYgQlJFQUtQT0lOVAorI2lmIFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4KKyNkZWZpbmUgQlJFQUtQT0lOVCB7MHg3MiwgMHg1MCwgMHgwMSwgMHgwMX0KKyNlbHNlIC8qIFRhcmdldCBpcyBsaXR0bGUtZW5kaWFuLiAgKi8KKyNkZWZpbmUgQlJFQUtQT0lOVCB7MHgwMSwgMHgwMSwgMHg1MCwgMHg3Mn0KKyNlbmRpZiAvKiBUYXJnZXQgaXMgbGl0dGxlLWVuZGlhbi4gICovCisjZW5kaWYgLyogQlJFQUtQT0lOVCAqLworCisvKiBBbW91bnQgUEMgbXVzdCBiZSBkZWNyZW1lbnRlZCBieSBhZnRlciBhIGJyZWFrcG9pbnQuCisgICBUaGlzIGlzIG9mdGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gQlJFQUtQT0lOVAorICAgYnV0IG5vdCBhbHdheXMuICAqLworCisjZGVmaW5lIERFQ1JfUENfQUZURVJfQlJFQUsgMAorCisvKiBTYXkgaG93IGxvbmcgKG9yZGluYXJ5KSByZWdpc3RlcnMgYXJlLiAgVGhpcyBpcyBhIHBpZWNlIG9mIGJvZ29zaXR5CisgICB1c2VkIGluIHB1c2hfd29yZCBhbmQgYSBmZXcgb3RoZXIgcGxhY2VzOyBSRUdJU1RFUl9SQVdfU0laRSBpcyB0aGUKKyAgIHJlYWwgd2F5IHRvIGtub3cgaG93IGJpZyBhIHJlZ2lzdGVyIGlzLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9TSVpFIDQKKworLyogQWxsb3cgdGhlIHJlZ2lzdGVyIGRlY2xhcmF0aW9ucyBoZXJlIHRvIGJlIG92ZXJyaWRkZW4gZm9yIHJlbW90ZQorICAga2VybmVsIGRlYnVnZ2luZy4gICovCisjaWYgIWRlZmluZWQgKFJFR0lTVEVSX05BTUVTKQorCisvKiBOdW1iZXIgb2YgbWFjaGluZSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBOVU1fUkVHUyAyMDUKKworLyogSW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIG5hbWVzIG9mIHJlZ2lzdGVycy4KKyAgIFRoZXJlIHNob3VsZCBiZSBOVU1fUkVHUyBzdHJpbmdzIGluIHRoaXMgaW5pdGlhbGl6ZXIuCisKKyAgIEZJWE1FLCBhZGQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGFuZCBzdXBwb3J0IGhlcmUuCisKKyAgIEFsc28gbm90ZSB0aGF0IHRoaXMgbGlzdCBkb2VzIG5vdCBhdHRlbXB0IHRvIGRlYWwgd2l0aCBrZXJuZWwKKyAgIGRlYnVnZ2luZyAoaW4gd2hpY2ggdGhlIGZpcnN0IDMyIHJlZ2lzdGVycyBhcmUgZ3I2NC1ncjk1KS4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfTkFNRVMgXAoreyJncjk2IiwgImdyOTciLCAiZ3I5OCIsICJncjk5IiwgImdyMTAwIiwgImdyMTAxIiwgImdyMTAyIiwgImdyMTAzIiwgImdyMTA0IiwgXAorICJncjEwNSIsICJncjEwNiIsICJncjEwNyIsICJncjEwOCIsICJncjEwOSIsICJncjExMCIsICJncjExMSIsICJncjExMiIsIFwKKyAiZ3IxMTMiLCAiZ3IxMTQiLCAiZ3IxMTUiLCAiZ3IxMTYiLCAiZ3IxMTciLCAiZ3IxMTgiLCAiZ3IxMTkiLCAiZ3IxMjAiLCBcCisgImdyMTIxIiwgImdyMTIyIiwgImdyMTIzIiwgImdyMTI0IiwgImdyMTI1IiwgImdyMTI2IiwgImdyMTI3IiwJCSBcCisgImxyMCIsICJscjEiLCAibHIyIiwgImxyMyIsICJscjQiLCAibHI1IiwgImxyNiIsICJscjciLCAibHI4IiwgImxyOSIsICAgXAorICJscjEwIiwgImxyMTEiLCAibHIxMiIsICJscjEzIiwgImxyMTQiLCAibHIxNSIsICJscjE2IiwgImxyMTciLCAibHIxOCIsIFwKKyAibHIxOSIsICJscjIwIiwgImxyMjEiLCAibHIyMiIsICJscjIzIiwgImxyMjQiLCAibHIyNSIsICJscjI2IiwgImxyMjciLCBcCisgImxyMjgiLCAibHIyOSIsICJscjMwIiwgImxyMzEiLCAibHIzMiIsICJscjMzIiwgImxyMzQiLCAibHIzNSIsICJscjM2IiwgXAorICJscjM3IiwgImxyMzgiLCAibHIzOSIsICJscjQwIiwgImxyNDEiLCAibHI0MiIsICJscjQzIiwgImxyNDQiLCAibHI0NSIsIFwKKyAibHI0NiIsICJscjQ3IiwgImxyNDgiLCAibHI0OSIsICJscjUwIiwgImxyNTEiLCAibHI1MiIsICJscjUzIiwgImxyNTQiLCBcCisgImxyNTUiLCAibHI1NiIsICJscjU3IiwgImxyNTgiLCAibHI1OSIsICJscjYwIiwgImxyNjEiLCAibHI2MiIsICJscjYzIiwgXAorICJscjY0IiwgImxyNjUiLCAibHI2NiIsICJscjY3IiwgImxyNjgiLCAibHI2OSIsICJscjcwIiwgImxyNzEiLCAibHI3MiIsIFwKKyAibHI3MyIsICJscjc0IiwgImxyNzUiLCAibHI3NiIsICJscjc3IiwgImxyNzgiLCAibHI3OSIsICJscjgwIiwgImxyODEiLCBcCisgImxyODIiLCAibHI4MyIsICJscjg0IiwgImxyODUiLCAibHI4NiIsICJscjg3IiwgImxyODgiLCAibHI4OSIsICJscjkwIiwgXAorICJscjkxIiwgImxyOTIiLCAibHI5MyIsICJscjk0IiwgImxyOTUiLCAibHI5NiIsICJscjk3IiwgImxyOTgiLCAibHI5OSIsIFwKKyAibHIxMDAiLCAibHIxMDEiLCAibHIxMDIiLCAibHIxMDMiLCAibHIxMDQiLCAibHIxMDUiLCAibHIxMDYiLCAibHIxMDciLCBcCisgImxyMTA4IiwgImxyMTA5IiwgImxyMTEwIiwgImxyMTExIiwgImxyMTEyIiwgImxyMTEzIiwgImxyMTE0IiwgImxyMTE1IiwgXAorICJscjExNiIsICJscjExNyIsICJscjExOCIsICJscjExOSIsICJscjEyMCIsICJscjEyMSIsICJscjEyMiIsICJscjEyMyIsIFwKKyAibHIxMjQiLCAibHIxMjUiLCAibHIxMjYiLCAibHIxMjciLAkJCQkJIFwKKyAgIkFJMCIsICJBSTEiLCAiQUkyIiwgIkFJMyIsICJBSTQiLCAiQUk1IiwgIkFJNiIsICJBSTciLCAiQUk4IiwgIkFJOSIsICBcCisgICJBSTEwIiwgIkFJMTEiLCAiQUkxMiIsICJBSTEzIiwgIkFJMTQiLCAiQUkxNSIsICJGUCIsCQkJIFwKKyAgImJwIiwgImZjIiwgImNyIiwgInEiLAkJCQkJCSBcCisgICJ2YWIiLCAib3BzIiwgImNwcyIsICJjZmciLCAiY2hhIiwgImNoZCIsICJjaGMiLCAicmJwIiwgInRtYyIsICJ0bXIiLAkgXAorICAicGMwIiwgInBjMSIsICJwYzIiLCAibW11IiwgImxydSIsICJmcGUiLCAiaW50ZSIsICJmcHMiLCAiZXhvIiwgImdyMSIsICBcCisgICJhbHUiLCAiaXBjIiwgImlwYSIsICJpcGIiIH0KKworLyoKKyAqIENvbnZlcnRzIGFuIHNkYiByZWdpc3RlciBudW1iZXIgdG8gYW4gaW50ZXJuYWwgZ2RiIHJlZ2lzdGVyIG51bWJlci4KKyAqIEN1cnJlbnRseSB1bmRlciBlcGksIGdyOTYtPjAuLi5ncjEyNy0+MzEuLi5scjAtPjMyLi4ubHIxMjctPjE1OSwgb3IuLi4KKyAqIAkJICAJZ3I2NC0+MC4uLmdyOTUtPjMxLCBscjAtPjMyLi4ubHIxMjctPjE1OS4KKyAqLworI2RlZmluZSBTREJfUkVHX1RPX1JFR05VTSh2YWx1ZSkgXAorICAoKCh2YWx1ZSkgPj0gOTYgJiYgKHZhbHVlKSA8PSAxMjcpID8gKCh2YWx1ZSkgLSA5NikgOiBcCisgICAoKHZhbHVlKSA+PSAxMjggJiYgKHZhbHVlKSA8PSAgMjU1KSA/ICgodmFsdWUpIC0gMTI4ICsgTFIwX1JFR05VTSkgOiBcCisgICAodmFsdWUpKQorCisvKgorICogUHJvdmlkZSB0aGUgcHJvY2Vzc29yIHJlZ2lzdGVyIG51bWJlcnMgb2Ygc29tZSByZWdpc3RlcnMgdGhhdCBhcmUKKyAqIGV4cGVjdGVkL3dyaXR0ZW4gaW4gaW5zdHJ1Y3Rpb25zIHRoYXQgbWlnaHQgY2hhbmdlIHVuZGVyIGRpZmZlcmVudAorICogcmVnaXN0ZXIgc2V0cy4gIE5hbWVseSwgZ2NjIGNhbiBjb21waWxlICgtbWtlcm5lbC1yZWdpc3RlcnMpIHNvIHRoYXQKKyAqIGl0IHVzZXMgZ3I2NC1ncjk1IGluIHN0ZWFkIG9mIGdyOTYtZ3IxMjcuCisgKi8KKyNkZWZpbmUgTVNQX0hXX1JFR05VTQkxMjUJCS8qIGdyMTI1ICovCisjZGVmaW5lIFJBQl9IV19SRUdOVU0JMTI2CQkvKiBncjEyNiAqLworCisvKiBDb252ZXJ0IFByb2Nlc3NvciBTcGVjaWFsIHJlZ2lzdGVyICN4IHRvIFJFR0lTVEVSX05BTUVTIHJlZ2lzdGVyICMgKi8KKyNkZWZpbmUgU1JfUkVHTlVNKHgpIFwKKyAgKCh4KSA8IDE1ICA/IFZBQl9SRUdOVU0gKyAoeCkJCQkJCSBcCisgICA6ICh4KSA+PSAxMjggJiYgKHgpIDwgMTMxID8gSVBDX1JFR05VTSArICh4KSAtIDEyOAkJIFwKKyAgIDogKHgpID09IDEzMSA/IFFfUkVHTlVNCQkJCQkgXAorICAgOiAoeCkgPT0gMTMyID8gQUxVX1JFR05VTQkJCQkJIFwKKyAgIDogKHgpID49IDEzMyAmJiAoeCkgPCAxMzYgPyBCUF9SRUdOVU0gKyAoeCkgLSAxMzMJCSBcCisgICA6ICh4KSA+PSAxNjAgJiYgKHgpIDwgMTYzID8gRlBFX1JFR05VTSArICh4KSAtIDE2MAkJIFwKKyAgIDogKHgpID09IDE2NCA/IEVYT19SRUdOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgOiAoZXJyb3IgKCJJbnRlcm5hbCBlcnJvciBpbiBTUl9SRUdOVU0iKSwgMCkpCisjZGVmaW5lIEdSOTZfUkVHTlVNIDAKKworLyogRGVmaW5lIHRoZSByZXR1cm4gcmVnaXN0ZXIgc2VwYXJhdGVseSwgc28gaXQgY2FuIGJlIG92ZXJyaWRkZW4gZm9yCisgICBrZXJuZWwgcHJvY2VkdXJlIGNhbGxpbmcgY29udmVudGlvbnMuICovCisjZGVmaW5lCVJFVFVSTl9SRUdOVU0JR1I5Nl9SRUdOVU0KKyNkZWZpbmUgR1IxX1JFR05VTSAyMDAKKy8qIFRoaXMgbmVlZHMgdG8gYmUgdGhlIG1lbW9yeSBzdGFjayBwb2ludGVyLCBub3QgdGhlIHJlZ2lzdGVyIHN0YWNrIHBvaW50ZXIsCisgICB0byBtYWtlIGNhbGxfZnVuY3Rpb24gd29yayByaWdodC4gICovCisjZGVmaW5lIFNQX1JFR05VTSBNU1BfUkVHTlVNCisjZGVmaW5lIEZQX1JFR05VTSAzMyAvKiBscjEgKi8KKworLyogUmV0dXJuIHJlZ2lzdGVyIGZvciB0cmFuc3BhcmVudCBjYWxsaW5nIGNvbnZlbnRpb24gKGdyMTIyKS4gICovCisjZGVmaW5lIFRQQ19SRUdOVU0gKDEyMiAtIDk2ICsgR1I5Nl9SRUdOVU0pCisKKy8qIExhcmdlIFJldHVybiBQb2ludGVyIChncjEyMykuICAqLworI2RlZmluZSBMUlBfUkVHTlVNICgxMjMgLSA5NiArIEdSOTZfUkVHTlVNKQorCisvKiBTdGF0aWMgbGluayBwb2ludGVyIChncjEyNCkuICAqLworI2RlZmluZSBTTFBfUkVHTlVNICgxMjQgLSA5NiArIEdSOTZfUkVHTlVNKQorCisvKiBNZW1vcnkgU3RhY2sgUG9pbnRlciAoZ3IxMjUpLiAgKi8KKyNkZWZpbmUgTVNQX1JFR05VTSAoMTI1IC0gOTYgKyBHUjk2X1JFR05VTSkKKworLyogUmVnaXN0ZXIgYWxsb2NhdGUgYm91bmQgKGdyMTI2KS4gICovCisjZGVmaW5lIFJBQl9SRUdOVU0gKDEyNiAtIDk2ICsgR1I5Nl9SRUdOVU0pCisKKy8qIFJlZ2lzdGVyIEZyZWUgQm91bmQgKGdyMTI3KS4gICovCisjZGVmaW5lIFJGQl9SRUdOVU0gKDEyNyAtIDk2ICsgR1I5Nl9SRUdOVU0pCisKKy8qIFJlZ2lzdGVyIFN0YWNrIFBvaW50ZXIuICAqLworI2RlZmluZSBSU1BfUkVHTlVNIEdSMV9SRUdOVU0KKyNkZWZpbmUgTFIwX1JFR05VTSAzMgorI2RlZmluZSBCUF9SRUdOVU0gMTc3CisjZGVmaW5lIEZDX1JFR05VTSAxNzgKKyNkZWZpbmUgQ1JfUkVHTlVNIDE3OQorI2RlZmluZSBRX1JFR05VTSAxODAKKyNkZWZpbmUgVkFCX1JFR05VTSAxODEKKyNkZWZpbmUgT1BTX1JFR05VTSAoVkFCX1JFR05VTSArIDEpCisjZGVmaW5lIENQU19SRUdOVU0gKFZBQl9SRUdOVU0gKyAyKQorI2RlZmluZSBDRkdfUkVHTlVNIChWQUJfUkVHTlVNICsgMykKKyNkZWZpbmUgQ0hBX1JFR05VTSAoVkFCX1JFR05VTSArIDQpCisjZGVmaW5lIENIRF9SRUdOVU0gKFZBQl9SRUdOVU0gKyA1KQorI2RlZmluZSBDSENfUkVHTlVNIChWQUJfUkVHTlVNICsgNikKKyNkZWZpbmUgUkJQX1JFR05VTSAoVkFCX1JFR05VTSArIDcpCisjZGVmaW5lIFRNQ19SRUdOVU0gKFZBQl9SRUdOVU0gKyA4KQorI2RlZmluZSBUTVJfUkVHTlVNIChWQUJfUkVHTlVNICsgOSkKKyNkZWZpbmUgTlBDX1JFR05VTSAoVkFCX1JFR05VTSArIDEwKSAgLyogcGMwICovCisjZGVmaW5lIFBDX1JFR05VTSAgKFZBQl9SRUdOVU0gKyAxMSkgIC8qIHBjMSAqLworI2RlZmluZSBQQzJfUkVHTlVNIChWQUJfUkVHTlVNICsgMTIpCisjZGVmaW5lIE1NVV9SRUdOVU0gKFZBQl9SRUdOVU0gKyAxMykKKyNkZWZpbmUgTFJVX1JFR05VTSAoVkFCX1JFR05VTSArIDE0KQorI2RlZmluZSBGUEVfUkVHTlVNIChWQUJfUkVHTlVNICsgMTUpCisjZGVmaW5lIElOVEVfUkVHTlVNIChWQUJfUkVHTlVNICsgMTYpCisjZGVmaW5lIEZQU19SRUdOVU0gKFZBQl9SRUdOVU0gKyAxNykKKyNkZWZpbmUgRVhPX1JFR05VTSAoVkFCX1JFR05VTSArIDE4KQorLyogZ3IxIGlzIGRlZmluZWQgYWJvdmUgYXMgMjAwID0gVkFCX1JFR05VTSArIDE5ICovCisjZGVmaW5lIEFMVV9SRUdOVU0gKFZBQl9SRUdOVU0gKyAyMCkKKyNkZWZpbmUgUFNfUkVHTlVNICBBTFVfUkVHTlVNCisjZGVmaW5lIElQQ19SRUdOVU0gKFZBQl9SRUdOVU0gKyAyMSkKKyNkZWZpbmUgSVBBX1JFR05VTSAoVkFCX1JFR05VTSArIDIyKQorI2RlZmluZSBJUEJfUkVHTlVNIChWQUJfUkVHTlVNICsgMjMpCisKKyNlbmRpZgkvKiAhZGVmaW5lZChSRUdJU1RFUl9OQU1FUykgKi8KKworLyogVG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCB0byBzdG9yZSBvdXIgY29waWVzIG9mIHRoZSBtYWNoaW5lJ3MKKyAgIHJlZ2lzdGVyIHN0YXRlLCB0aGUgYXJyYXkgYHJlZ2lzdGVycycuICAqLworI2RlZmluZSBSRUdJU1RFUl9CWVRFUyAoTlVNX1JFR1MgKiA0KQorCisvKiBJbmRleCB3aXRoaW4gYHJlZ2lzdGVycycgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNwYWNlIGZvcgorICAgcmVnaXN0ZXIgTi4gICovCisjZGVmaW5lIFJFR0lTVEVSX0JZVEUoTikgICgoTikqNCkKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIGFjdHVhbCBtYWNoaW5lIHJlcHJlc2VudGF0aW9uCisgICBmb3IgcmVnaXN0ZXIgTi4gICovCisKKy8qIEFsbCByZWdzIGFyZSA0IGJ5dGVzLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9SQVdfU0laRShOKSAoNCkKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIHByb2dyYW0ncyByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICAqLworCisvKiBBbGwgcmVncyBhcmUgNCBieXRlcy4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9TSVpFKE4pICg0KQorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1JBV19TSVpFIGNhbiBoYXZlLiAgKi8KKworI2RlZmluZSBNQVhfUkVHSVNURVJfUkFXX1NJWkUgKDQpCisKKy8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfVklSVFVBTF9TSVpFIGNhbiBoYXZlLiAgKi8KKworI2RlZmluZSBNQVhfUkVHSVNURVJfVklSVFVBTF9TSVpFICg0KQorCisvKiBSZXR1cm4gdGhlIEdEQiB0eXBlIG9iamVjdCBmb3IgdGhlICJzdGFuZGFyZCIgZGF0YSB0eXBlCisgICBvZiBkYXRhIGluIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRShOKSBcCisgICgoKE4pID09IFBDX1JFR05VTSB8fCAoTikgPT0gTFJQX1JFR05VTSB8fCAoTikgPT0gU0xQX1JFR05VTSAgICAgICAgIFwKKyAgICB8fCAoTikgPT0gTVNQX1JFR05VTSB8fCAoTikgPT0gUkFCX1JFR05VTSB8fCAoTikgPT0gUkZCX1JFR05VTSAgICAgXAorICAgIHx8IChOKSA9PSBHUjFfUkVHTlVNIHx8IChOKSA9PSBGUF9SRUdOVU0gfHwgKE4pID09IExSMF9SRUdOVU0gICAgICAgXAorICAgIHx8IChOKSA9PSBOUENfUkVHTlVNIHx8IChOKSA9PSBQQzJfUkVHTlVNKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgID8gbG9va3VwX3BvaW50ZXJfdHlwZSAoYnVpbHRpbl90eXBlX3ZvaWQpIDogYnVpbHRpbl90eXBlX2ludCkKKwwKKy8qIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBwbGFjZSBpbiB3aGljaCB0byBjb3B5IHRoZSBzdHJ1Y3R1cmUgdGhlCisgICBzdWJyb3V0aW5lIHdpbGwgcmV0dXJuLiAgVGhpcyBpcyBjYWxsZWQgZnJvbSBjYWxsX2Z1bmN0aW9uLiAqLworLyogT24gdGhlIGEyOWsgdGhlIExSUCBwb2ludHMgdG8gdGhlIHBhcnQgb2YgdGhlIHN0cnVjdHVyZSBiZXlvbmQgdGhlIGZpcnN0CisgICAxNiB3b3Jkcy4gICovCisjZGVmaW5lIFNUT1JFX1NUUlVDVF9SRVRVUk4oQUREUiwgU1ApIFwKKyAgd3JpdGVfcmVnaXN0ZXIgKExSUF9SRUdOVU0sIChBRERSKSArIDE2ICogNCk7CisKKy8qIFNob3VsZCBjYWxsX2Z1bmN0aW9uIGFsbG9jYXRlIHN0YWNrIHNwYWNlIGZvciBhIHN0cnVjdCByZXR1cm4/ICAqLworLyogT24gdGhlIGEyOWsgb2JqZWN0cyBvdmVyIDE2IHdvcmRzIHJlcXVpcmUgdGhlIGNhbGxlciB0byBhbGxvY2F0ZSBzcGFjZS4gICovCitleHRlcm4gdXNlX3N0cnVjdF9jb252ZW50aW9uX2ZuIGEyOWtfdXNlX3N0cnVjdF9jb252ZW50aW9uOworI2RlZmluZSBVU0VfU1RSVUNUX0NPTlZFTlRJT04oZ2NjX3AsIHR5cGUpIGEyOWtfdXNlX3N0cnVjdF9jb252ZW50aW9uIChnY2NfcCwgdHlwZSkKKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgb2YgdHlwZSBUWVBFLCBhbmQgY29weSB0aGF0LCBpbiB2aXJ0dWFsIGZvcm1hdCwKKyAgIGludG8gVkFMQlVGLiAgKi8KKworI2RlZmluZSBFWFRSQUNUX1JFVFVSTl9WQUxVRShUWVBFLFJFR0JVRixWQUxCVUYpCSAgICAgIFwKKyAgeyAgICAJICAgICAgIAkgICAgICAgCSAgICAgICAJICAgICAgIAkgICAgICAgCSAgICAgICAJICAgICAgIAkgICAgICAgCSAgIFwKKyAgICBpbnQgcmVnX2xlbmd0aCA9IFRZUEVfTEVOR1RIIChUWVBFKTsJCQkJICAgXAorICAgIGlmIChyZWdfbGVuZ3RoID4gMTYgKiA0KQkJCQkJCSAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICBcCisJcmVnX2xlbmd0aCA9IDE2ICogNDsJCQkJCQkgICBcCisJcmVhZF9tZW1vcnkgKCooKGludCAqKShSRUdCVUYpICsgTFJQX1JFR05VTSksIChWQUxCVUYpICsgMTYgKiA0LCAgIFwKKwkJICAgICBUWVBFX0xFTkdUSCAoVFlQRSkgLSAxNiAqIDQpOwkJCSAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICBcCisgICAgbWVtY3B5ICgoVkFMQlVGKSwgKChpbnQgKikoUkVHQlVGKSkrUkVUVVJOX1JFR05VTSwgcmVnX2xlbmd0aCk7CSAgIFwKKyAgfQorCisvKiBXcml0ZSBpbnRvIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZQorICAgb2YgdHlwZSBUWVBFLCBnaXZlbiBpbiB2aXJ0dWFsIGZvcm1hdC4gICovCisKKyNkZWZpbmUgU1RPUkVfUkVUVVJOX1ZBTFVFKFRZUEUsVkFMQlVGKSBcCisgIHsJCQkJCQkJCQkgIFwKKyAgICBpbnQgcmVnX2xlbmd0aCA9IFRZUEVfTEVOR1RIIChUWVBFKTsJCQkJICBcCisgICAgaWYgKHJlZ19sZW5ndGggPiAxNiAqIDQpCQkJCQkJICBcCisgICAgICB7CQkJCQkJCQkJICBcCisgICAgICAgIHJlZ19sZW5ndGggPSAxNiAqIDQ7CQkJCQkJICBcCisgICAgICAgIHdyaXRlX21lbW9yeSAocmVhZF9yZWdpc3RlciAoTFJQX1JFR05VTSksCQkJICBcCisJCSAgICAgIChjaGFyICopKFZBTEJVRikgKyAxNiAqIDQsCQkJICBcCisJCSAgICAgIFRZUEVfTEVOR1RIIChUWVBFKSAtIDE2ICogNCk7CQkJICBcCisgICAgICB9CQkJCQkJCQkJICBcCisgICAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKFJFR0lTVEVSX0JZVEUgKFJFVFVSTl9SRUdOVU0pLCAoY2hhciAqKShWQUxCVUYpLCAgXAorCQkJICBUWVBFX0xFTkdUSCAoVFlQRSkpOwkJCQkgIFwKKyAgfQorDAorLyogVGhlIGEyOWsgdXNlcidzIGd1aWRlIGRvY3VtZW50cyB3ZWxsIHdoYXQgdGhlIHN0YWNrcyBsb29rIGxpa2UuCisgICBCdXQgd2hhdCBpc24ndCBzbyBjbGVhciB0aGVyZSBpcyBob3cgdGhpcyBpbnRlcnJhY3RzIHdpdGggdGhlCisgICBzeW1ib2xzLCBvciB3aXRoIEdEQi4KKyAgIEluIHRoZSBmb2xsb3dpbmcgc2F2ZWRfbXNwLCBzYXZlZCBtZW1vcnkgc3RhY2sgcG9pbnRlciAod2hpY2ggZnVuY3Rpb25zCisgICBhcyBhIG1lbW9yeSBmcmFtZSBwb2ludGVyKSwgbWVhbnMgZWl0aGVyCisgICBhIHJlZ2lzdGVyIGNvbnRhaW5pbmcgdGhlIG1lbW9yeSBmcmFtZSBwb2ludGVyIG9yLCBpbiB0aGUgY2FzZSBvZgorICAgZnVuY3Rpb25zIHdpdGggZml4ZWQgc2l6ZSBtZW1vcnkgZnJhbWVzIChpLmUuIHRob3NlIHdobyBkb24ndCB1c2UKKyAgIGFsbG9jYSgpKSwgdGhlIHJlc3VsdCBvZiB0aGUgY2FsY3VsYXRpb24gbXNwICsgbXNpemUuCisKKyAgIExPQ19BUkcsIExPQ19MT0NBTCAtIEZvciBHQ0MsIHRoZXNlIGFyZSByZWxhdGl2ZSB0byBzYXZlZF9tc3AuCisgICAgIEZvciBoaWdoIEMsIHRoZXNlIGFyZSByZWxhdGl2ZSB0byBtc3AgKG1ha2luZyBhbGxvY2EgaW1wb3NzaWJsZSkuCisgICBMT0NfUkVHSVNURVIsIExPQ19SRUdQQVJNIC0gVGhlIHJlZ2lzdGVyIG51bWJlciBpcyB0aGUgbnVtYmVyIGF0IHRoZQorICAgICB0aW1lIHRoZSBmdW5jdGlvbiBpcyBydW5uaW5nIChhZnRlciB0aGUgcHJvbG9ndWUpLCBvciBpbiB0aGUgY2FzZQorICAgICBvZiBMT0NfUkVHUEFSTSwgbWF5IGJlIGEgcmVnaXN0ZXIgbnVtYmVyIGluIHRoZSByYW5nZSAxNjAtMTc1LgorCisgICBUaGUgY29tcGlsZXJzIGRvIHRoaW5ncyBsaWtlIHN0b3JlIGFuIGFyZ3VtZW50IGludG8gbWVtb3J5LCBhbmQgdGhlbiBwdXQgb3V0CisgICBhIExPQ19BUkcgZm9yIGl0LCBvciBwdXQgaXQgaW50byBnbG9iYWwgcmVnaXN0ZXJzIGFuZCBwdXQgb3V0IGEKKyAgIExPQ19SRUdQQVJNLiAgVGh1cyBpcyBpdCBpbXBvcnRhbnQgdG8gZXhlY3V0ZSB0aGUgZmlyc3QgbGluZSBvZgorICAgY29kZSAoaS5lLiB0aGUgbGluZSBvZiB0aGUgb3BlbiBicmFjZSwgaS5lLiB0aGUgcHJvbG9ndWUpIG9mIGEgZnVuY3Rpb24KKyAgIGJlZm9yZSB0cnlpbmcgdG8gcHJpbnQgYXJndW1lbnRzIG9yIGFueXRoaW5nLgorCisgICBUaGUgZm9sbG93aW5nIGRpYWdyYW0gYXR0ZW1wdHMgdG8gZGVwaWN0IHdoYXQgaXMgZ29pbmcgb24gaW4gbWVtb3J5CisgICAoc2VlIGFsc28gdGhlIF9hMjlrIHVzZXIncyBndWlkZV8pIGFuZCBhbHNvIGhvdyB0aGF0IGludGVyYWN0cyB3aXRoCisgICBHREIgZnJhbWVzLiAgV2UgYXJiaXRyYXJpbHkgcGljayBmY2ktPmZyYW1lIHRvIHBvaW50IHRoZSBzYW1lIHBsYWNlCisgICBhcyB0aGUgcmVnaXN0ZXIgc3RhY2sgcG9pbnRlcjsgc2luY2Ugd2Ugc2V0IGl0IG91cnNlbGYgaW4KKyAgIElOSVRfRVhUUkFfRlJBTUVfSU5GTywgYW5kIGFjY2VzcyBpdCBvbmx5IHRocm91Z2ggdGhlIEZSQU1FXyoKKyAgIG1hY3JvcywgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyIGV4YWN0bHkgaG93IHdlCisgICBkbyBpdC4gIEhvd2V2ZXIsIG5vdGUgdGhhdCBGUkFNRV9GUCBpcyB1c2VkIGluIHR3byB3YXlzIGluIEdEQjoKKyAgICgxKSBhcyBhICJtYWdpYyBjb29raWUiIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgZnJhbWVzIChldmVuIG92ZXIKKyAgIGNhbGxzIHRvIHRoZSBpbmZlcmlvciksICgyKSAoaW4gUENfSU5fQ0FMTF9EVU1NWSBbT05fU1RBQ0tdKQorICAgYXMgdGhlIHZhbHVlIG9mIFNQX1JFR05VTSBiZWZvcmUgdGhlIGR1bW15IGZyYW1lIHdhcyBwdXNoZWQuICBUaGVzZQorICAgdHdvIG1lYW5pbmdzIHdvdWxkIGJlIGluY29tcGF0aWJsZSBmb3IgdGhlIGEyOWsgaWYgd2UgZGVmaW5lZAorICAgQ0FMTF9EVU1NWV9MT0NBVElPTiA9PSBPTl9TVEFDSyAoYnV0IHdlIGRvbid0LCBzbyBkb24ndCB3b3JyeSBhYm91dCBpdCkuCisgICBBbHNvIG5vdGUgdGhhdCAibHIxIiBiZWxvdywgd2hpbGUgY2FsbGVkIGEgZnJhbWUgcG9pbnRlcgorICAgaW4gdGhlIHVzZXIncyBndWlkZSwgaGFzIG9ubHkgb25lIGZ1bmN0aW9uOiAgVG8gZGV0ZXJtaW5lIHdoZXRoZXIKKyAgIHJlZ2lzdGVycyBuZWVkIHRvIGJlIGZpbGxlZCBpbiB0aGUgZnVuY3Rpb24gZXBpbG9ndWUuCisKKyAgIENvbnNpZGVyIHRoZSBjb2RlOgorICAgICAgICAgICAgICA8IGNhbGwgYmFyPgorICAgICAgIAlsb2MxOiAuIC4gLgorICAgICAgICBiYXI6ICBzdWIgZ3IxLGdyMSxyc2l6ZV9iCisJICAgICAgLiAuIC4KKwkgICAgICBhZGQgbWZwLG1zcCwwCisJICAgICAgc3ViIG1zcCxtc3AsbXNpemVfYgorCSAgICAgIC4gLiAuCisJICAgICAgPCBjYWxsIGZvbyA+CisJbG9jMjogLiAuIC4KKyAgICAgICAgZm9vOiAgc3ViIGdyMSxncjEscnNpemVfZgorCSAgICAgIC4gLiAuCisJICAgICAgYWRkIG1mcCxtc3AsMAorCSAgICAgIHN1YiBtc3AsbXNwLG1zaXplX2YKKwkgICAgICAuIC4gLgorICAgICAgICBsb2MzOiA8IHN1cHBvc2UgdGhlIGluZmVyaW9yIHN0b3BzIGhlcmUgPgorCisgICAgICAgICAgICAgICAgICAgbWVtb3J5IHN0YWNrICAgICAgcmVnaXN0ZXIgc3RhY2sKKwkJICAgfCAgICAgICAgICAgfCAgICAgfF9fX19fX19fX19fX3wKKwkJICAgfCAgICAgICAgICAgfCAgICAgfF9fX19sb2MxX19fX3wKKwkgICstLS0tLS0tPnxfX19fX19fX19fX3wgICAgIHwgICAgICAgICAgICB8ICAgXgorCSAgfCAgICAgICAgfCBeICAgICAgICAgfCAgICAgfCAgbG9jYWxzX2IgIHwgICB8CisJICB8ICAgICAgICB8IHwgICAgICAgICB8ICAgICB8X19fX19fX19fX19ffCAgIHwKKwkgIHwgICAgICAgIHwgfCAgICAgICAgIHwgICAgIHwgICAgICAgICAgICB8ICAgfCByc2l6ZV9iCisJICB8ICAgICAgICB8IHwgbXNpemVfYiB8ICAgICB8IGFyZ3NfdG9fZiAgfCAgIHwKKwkgIHwgICAgICAgIHwgfCAgICAgICAgIHwgICAgIHxfX19fX19fX19fX198ICAgfAorCSAgfCAgICAgICAgfCB8ICAgICAgICAgfCAgICAgfF9fX19scjFfX19fX3wgICBWCisJICB8ICAgICAgICB8IFYgICAgICAgICB8ICAgICB8X19fX2xvYzJfX19ffDwtLS0tLS0tLS0tLS0tLS0tKworCSAgfCAgICstLS0+fF9fX19fX19fX19ffDwtLS0tLS0tLS1tZnAgICAgIHwgICBeICAgICAgICAgICAgIHwKKwkgIHwgICB8ICAgIHwgXiAgICAgICAgIHwgICAgIHwgIGxvY2Fsc19mICB8ICAgfCAgICAgICAgICAgICB8CisJICB8ICAgfCAgICB8IHwgbXNpemVfZiB8ICAgICB8X19fX19fX19fX19ffCAgIHwgICAgICAgICAgICAgfAorCSAgfCAgIHwgICAgfCB8ICAgICAgICAgfCAgICAgfCAgICAgICAgICAgIHwgICB8IHJzaXplX2YgICAgIHwKKwkgIHwgICB8ICAgIHwgViAgICAgICAgIHwgICAgIHwgICBhcmdzICAgICB8ICAgfCAgICAgICAgICAgICB8CisJICB8ICAgfCAgICB8X19fX19fX19fX198PG1zcCB8X19fX19fX19fX19ffCAgIHwgICAgICAgICAgICAgfAorCSAgfCAgIHwgICAgICAgICAgICAgICAgICAgICAgfF9fX19fbHIxX19fX3wgICBWICAgICAgICAgICAgIHwKKwkgIHwgICB8ICAgICAgICAgICAgICAgICAgICAgIHxfX19nYXJiYWdlX198IDwtIGdyMSA8LS0tLSsgICB8CisgCSAgfCAgIHwgICAgICAgICAgICAgICAgIAkJICAgICAgICAgICAgICAgIHwgICB8CisgICAgICAgICAgfCAgIHwgICAgICAgICAgICAgICAgIAkJICAgICAgICAgICAgICAgIHwgICB8CisJICB8ICAgfAkgICAgICAgCSAgICAgICAJICAgICBwYz1sb2MzCSAgICAgICAgICAgICAgICB8ICAgfAorCSAgfCAgIHwgICAgICAgICAJCSAgICAgIAkgICAgICAgICAgICAgICAgfCAgIHwKKwkgIHwgICB8ICAgICAgICAgCQkgICAgICAJICAgICAgICAgICAgICAgIHwgICB8CisJICB8ICAgfCAgICAgICAgICAgIGZyYW1lIGNhY2hlCSAgICAgIAkgICAgICAgICAgICAgICAgfCAgIHwKKyAgICAgICAgICB8ICAgfCAgICAgICB8X19fX19fX19fX19fX19fX198ICAgICAJICAgICAgICAgICAgICAgIHwgICB8CisgICAgICAgICAgfCAgIHwgICAgICAgfHJzaXplPXJzaXplX2IgICAgfCAgICAgCSAgICAgICAgICAgICAgICB8ICAgfAorICAgICAgICAgIHwgICB8ICAgICAgIHxtc2l6ZT1tc2l6ZV9iICAgIHwgICAgIAkgICAgICAgICAgICAgICAgfCAgIHwKKyAgICAgICAgICArLS0tfC0tLS0tLS0tc2F2ZWRfbXNwICAgICAgICB8ICAgICAJICAgICAgICAgICAgICAgIHwgICB8CisgICAgICAgICAgICAgIHwgICAgICAgfGZyYW1lLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLSsKKyAgICAgICAgICAgICAgfCAgICAgICB8cGM9bG9jMiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgIHwgICAgICAgfF9fX19fX19fX19fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICB8ICAgICAgIHxyc2l6ZT1yc2l6ZV9mICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgfCAgICAgICB8bXNpemU9bXNpemVfZiAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICstLS0tLS0tLXNhdmVkX21zcCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgIHxmcmFtZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICB8cGM9bG9jMyAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19fX19fX19fX19ffAorCisgICBTbywgaXMgdGhhdCBzdWZmaWNpZW50bHkgY29uZnVzaW5nPyAgV2VsY29tZSB0byB0aGUgMjkwMDAuCisgICBOb3RlczoKKyAgICogVGhlIGZyYW1lIGZvciBmb28gdXNlcyBhIG1lbW9yeSBmcmFtZSBwb2ludGVyIGJ1dCB0aGUgZnJhbWUgZm9yCisgICAgIGJhciBkb2VzIG5vdC4gIEluIHRoZSBsYXR0ZXIgY2FzZSB0aGUgc2F2ZWRfbXNwIGlzCisgICAgIGNvbXB1dGVkIGJ5IGFkZGluZyBtc2l6ZSB0byB0aGUgc2F2ZWRfbXNwIG9mIHRoZQorICAgICBuZXh0IGZyYW1lLgorICAgKiBtc2l6ZSBpcyBpbiB0aGUgZnJhbWUgY2FjaGUgb25seSBmb3IgaGlnaCBDJ3Mgc2FrZS4gICovCisKK3ZvaWQgcmVhZF9yZWdpc3Rlcl9zdGFjayAoKTsKK2xvbmcgcmVhZF9yZWdpc3Rlcl9zdGFja19pbnRlZ2VyICgpOworDAorI2RlZmluZSBGUkFNRV9JTklUX1NBVkVEX1JFR1MoZmkpIC8qbm8tb3AqLworCisjZGVmaW5lIEVYVFJBX0ZSQU1FX0lORk8gIFwKKyAgQ09SRV9BRERSIHNhdmVkX21zcDsgICAgXAorICB1bnNpZ25lZCBpbnQgcnNpemU7ICAgICBcCisgIHVuc2lnbmVkIGludCBtc2l6ZTsJICBcCisgIHVuc2lnbmVkIGNoYXIgZmxhZ3M7CisKKy8qIEJpdHMgZm9yIGZsYWdzIGluIEVYVFJBX0ZSQU1FX0lORk8gKi8KKyNkZWZpbmUgVFJBTlNQQVJFTlRfRlJBTUUJMHgxCS8qIFRoaXMgaXMgYSB0cmFuc3BhcmVudCBmcmFtZSAqLworI2RlZmluZSBNRlBfVVNFRAkJMHgyCS8qIEEgbWVtb3J5IGZyYW1lIHBvaW50ZXIgaXMgdXNlZCAqLworCisvKiBCZWNhdXNlIElOSVRfRlJBTUVfUEMgZ2V0cyBwYXNzZWQgZnJvbWxlYWYsIHRoYXQncyB3aGVyZSB3ZSBpbml0CisgICBub3Qgb25seSAtPnBjIGFuZCAtPmZyYW1lLCBidXQgYWxsIHRoZSBleHRyYSBzdHVmZiwgd2hlbiBjYWxsZWQgZnJvbQorICAgZ2V0X3ByZXZfZnJhbWVfaW5mbywgdGhhdCBpcy4gICovCisjZGVmaW5lIElOSVRfRVhUUkFfRlJBTUVfSU5GTyhmcm9tbGVhZiwgZmNpKSAgaW5pdF9leHRyYV9mcmFtZV9pbmZvKGZjaSkKK3ZvaWQgaW5pdF9leHRyYV9mcmFtZV9pbmZvICgpOworCisjZGVmaW5lIElOSVRfRlJBTUVfUEMoZnJvbWxlYWYsIGZjaSkgaW5pdF9mcmFtZV9wYyhmcm9tbGVhZiwgZmNpKQordm9pZCBpbml0X2ZyYW1lX3BjICgpOworCisMCisvKiBGUkFNRV9DSEFJTiB0YWtlcyBhIEZSQU1FCisgICBhbmQgcHJvZHVjZXMgdGhlIGZyYW1lJ3MgY2hhaW4tcG9pbnRlci4KKworICAgSG93ZXZlciwgaWYgRlJBTUVfQ0hBSU5fVkFMSUQgcmV0dXJucyB6ZXJvLAorICAgaXQgbWVhbnMgdGhlIGdpdmVuIGZyYW1lIGlzIHRoZSBvdXRlcm1vc3Qgb25lIGFuZCBoYXMgbm8gY2FsbGVyLiAgKi8KKworLyogT24gdGhlIGEyOWssIHRoZSBub21pbmFsIGFkZHJlc3Mgb2YgYSBmcmFtZSBpcyB0aGUgYWRkcmVzcyBvbiB0aGUKKyAgIHJlZ2lzdGVyIHN0YWNrIG9mIHRoZSByZXR1cm4gYWRkcmVzcyAodGhlIG9uZSBuZXh0IHRvIHRoZSBpbmNvbWluZworICAgYXJndW1lbnRzLCBub3QgZG93biBhdCB0aGUgYm90dG9tIHNvIG5vbWluYWwgYWRkcmVzcyA9PSBzdGFjayBwb2ludGVyKS4KKworICAgR0RCIGV4cGVjdHMgIm5vbWluYWwgYWRkcmVzcyIgdG8gZXF1YWwgY29udGVudHMgb2YgRlBfUkVHTlVNLAorICAgYXQgbGVhc3Qgd2hlbiBpdCBjb21lcyB0aW1lIHRvIGNyZWF0ZSB0aGUgaW5uZXJtb3N0IGZyYW1lLgorICAgSG93ZXZlciwgdGhhdCBkb2Vzbid0IHdvcmsgZm9yIHVzLCBzbyB3aGVuIGNyZWF0aW5nIHRoZSBpbm5lcm1vc3QKKyAgIGZyYW1lIHdlIHNldCAtPmZyYW1lIG91cnNlbHZlcyBpbiBJTklUX0VYVFJBX0ZSQU1FX0lORk8uICAqLworCisvKiBUaGVzZSBhcmUgbW9zdGx5IGR1bW1pZXMgZm9yIHRoZSBhMjlrIGJlY2F1c2UgSU5JVF9GUkFNRV9QQworICAgc2V0cyBwcmV2LT5mcmFtZSBpbnN0ZWFkLiAgKi8KKy8qIElmIHJzaXplIGlzIHplcm8sIHdlIG11c3QgYmUgYXQgZW5kIG9mIHN0YWNrIChvciBvdGhlcndpc2UgaG9zZWQpLgorICAgSWYgd2UgZG9uJ3QgY2hlY2sgcnNpemUsIHdlIGxvb3AgZm9yZXZlciBpZiB3ZSBzZWUgcnNpemUgPT0gMC4gICovCisjZGVmaW5lIEZSQU1FX0NIQUlOKHRoaXNmcmFtZSkgXAorICAoKHRoaXNmcmFtZSktPnJzaXplID09IDAgXAorICAgPyAwIFwKKyAgIDogKHRoaXNmcmFtZSktPmZyYW1lICsgKHRoaXNmcmFtZSktPnJzaXplKQorCisvKiBEZXRlcm1pbmUgaWYgdGhlIGZyYW1lIGhhcyBhICdwcmV2aW91cycgYW5kIGJhY2stdHJhY2VhYmxlIGZyYW1lLiAqLworI2RlZmluZSBGUkFNRV9JU19VTkNIQUlORUQoZnJhbWUpCSgoZnJhbWUpLT5mbGFncyAmIFRSQU5TUEFSRU5UX0ZSQU1FKQorCisvKiBGaW5kIHRoZSBwcmV2aW91cyBmcmFtZSBvZiBhIHRyYW5zcGFyZW50IHJvdXRpbmUuCisgKiBGb3Igbm93IGxldHMgbm90IHRyeSBhbmQgdHJhY2UgdGhyb3VnaCBhIHRyYW5zcGFyZW50IHJvdXRpbmUgKHdlIG1pZ2h0IAorICogaGF2ZSB0byBhc3N1bWUgdGhhdCBhbGwgdHJhbnNwYXJlbnQgcm91dGluZXMgYXJlIHRyYXBzKS4KKyAqLworI2RlZmluZSBGSU5EX1BSRVZfVU5DSEFJTkVEX0ZSQU1FKGZyYW1lKQkwCisKKy8qIERlZmluZSBvdGhlciBhc3BlY3RzIG9mIHRoZSBzdGFjayBmcmFtZS4gICovCisKKy8qIEEgbWFjcm8gdGhhdCB0ZWxscyB1cyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpbnZvY2F0aW9uIHJlcHJlc2VudGVkCisgICBieSBGSSBkb2VzIG5vdCBoYXZlIGEgZnJhbWUgb24gdGhlIHN0YWNrIGFzc29jaWF0ZWQgd2l0aCBpdC4gIElmIGl0CisgICBkb2VzIG5vdCwgRlJBTUVMRVNTIGlzIHNldCB0byAxLCBlbHNlIDAuICAqLworI2RlZmluZSBGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTihGSSwgRlJBTUVMRVNTKSBcCisgIChGUkFNRUxFU1MpID0gZnJhbWVsZXNzX2xvb2tfZm9yX3Byb2xvZ3VlKEZJKQorCisvKiBTYXZlZCBwYyAoaS5lLiByZXR1cm4gYWRkcmVzcykuICAqLworI2RlZmluZSBGUkFNRV9TQVZFRF9QQyhmcmFpbSkgXAorICAocmVhZF9yZWdpc3Rlcl9zdGFja19pbnRlZ2VyICgoZnJhaW0pLT5mcmFtZSArIChmcmFpbSktPnJzaXplLCA0KSkKKworLyogTG9jYWwgdmFyaWFibGVzIChpLmUuIExPQ19MT0NBTCkgYXJlIG9uIHRoZSBtZW1vcnkgc3RhY2ssIHdpdGggdGhlaXIKKyAgIG9mZnNldHMgYmVpbmcgcmVsYXRpdmUgdG8gdGhlIG1lbW9yeSBzdGFjayBwb2ludGVyIChoaWdoIEMpIG9yCisgICBzYXZlZF9tc3AgKGdjYykuICAqLworCisjZGVmaW5lIEZSQU1FX0xPQ0FMU19BRERSRVNTKGZpKSBmcmFtZV9sb2NhbHNfYWRkcmVzcyAoZmkpCitleHRlcm4gQ09SRV9BRERSIGZyYW1lX2xvY2Fsc19hZGRyZXNzICgpOworCisvKiBSZXR1cm4gbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvIGEgZnJhbWUuCisgICBDYW4gcmV0dXJuIC0xLCBtZWFuaW5nIG5vIHdheSB0byB0ZWxsLiAgKi8KKy8qIFdlIHRyaWVkIGdvaW5nIHRvIHRoZSBlZmZvcnQgb2YgZmluZGluZyB0aGUgdGFncyB3b3JkIGFuZCBnZXR0aW5nCisgICB0aGUgYXJnY291bnQgZmllbGQgZnJvbSBpdCwgdG8gc3VwcG9ydCBkZWJ1Z2dpbmcgYXNzZW1ibGVyIGNvZGUuCisgICBQcm9ibGVtIHdhcywgdGhlICJhcmdjb3VudCIgZmllbGQgbmV2ZXIgZGlkIGhvbGQgdGhlIGFyZ3VtZW50CisgICBjb3VudC4gICovCisjZGVmaW5lCUZSQU1FX05VTV9BUkdTKG51bWFyZ3MsIGZpKSAoKG51bWFyZ3MpID0gLTEpCisKKyNkZWZpbmUgRlJBTUVfQVJHU19BRERSRVNTKGZpKSBGUkFNRV9MT0NBTFNfQUREUkVTUyAoZmkpCisKKy8qIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgYXQgc3RhcnQgb2YgYXJnbGlzdCB0aGF0IGFyZSBub3QgcmVhbGx5IGFyZ3MuICAqLworCisjZGVmaW5lIEZSQU1FX0FSR1NfU0tJUCAwCisKKy8qIFByb3ZpZGUgb3VyIG93biBnZXRfc2F2ZWRfcmVnaXN0ZXIuICBIQVZFX1JFR0lTVEVSX1dJTkRPV1MgaXMgaW5zdWZmaWNpZW50CisgICBiZWNhdXNlIHJlZ2lzdGVycyBnZXQgcmVudW1iZXJlZCBvbiB0aGUgYTI5ayB3aXRob3V0IGdldHRpbmcgc2F2ZWQuICAqLworCisjZGVmaW5lIEdFVF9TQVZFRF9SRUdJU1RFUgorDAorLyogQ2FsbCBmdW5jdGlvbiBzdHVmZi4gICovCisKKy8qIFRoZSBkdW1teSBmcmFtZSBsb29rcyBsaWtlIHRoaXMgKHNlZSBhbHNvIHRoZSBnZW5lcmFsIGZyYW1lIHBpY3R1cmUKKyAgIGFib3ZlKToKKworCQkJCQlyZWdpc3RlciBzdGFjaworCisJICAgICAgICAgICAgICAgIAkgICAgICB8ICAgICAgICAgICAgICAgIHwgIGZyYW1lIGZvciBmdW5jdGlvbgorICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICB8ICAgbG9jYWxzX3Nwcm9jIHwgIGV4ZWN1dGluZyBhdCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19fX19fX19fX19ffCAgb2YgY2FsbF9mdW5jdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgIAkJICAgICAgfAkgICAgICAgICAgICAgICB8ICBXZSBtdXN0IG5vdCBkaXN0dXJiCisgICAgICAgICAgICAgICAgICAgICAJCSAgICAgIHwJYXJnc19vdXRfc3Byb2MgfCAgaXQuCisgICAgICAgIG1lbW9yeSBzdGFjayAJCSAgICAgIHxfX19fX19fX19fX19fX19ffAorICAgICAgICAgICAgICAgICAgICAgCQkgICAgICB8X19fX2xyMV9zcHJvY19fX3w8LSsKKyAgICAgICB8ICAgICAgICAgICAgfAkJICAgICAgfF9fcmV0YWRkcl9zcHJvY198ICB8IDwtLSBncjEgKGF0IHN0YXJ0KQorICAgICAgIHxfX19fX19fX19fX198PC1tc3AgMCA8LS0tLS0tLS0tLS1tZnBfZHVtbXlfX19fX3wgIHwKKyAgICAgICB8ICAgICAgICAgICAgfCAgKGF0IHN0YXJ0KSAgICAgfCAgc2F2ZSByZWdzICAgICB8ICB8CisgICAgICAgfCBhcmdfc2xvcCAgIHwJCSAgICAgIHwgIHBjMCxwYzEgICAgICAgfCAgfAorICAgICAgIHwgICAgICAgICAgICB8CQkgICAgICB8ICBwYzIsbHIwIHNwcm9jIHwgIHwKKyAgICAgICB8ICgxNiB3b3JkcykgfAkJICAgICAgfCBncjk2LWdyMTI0ICAgICB8ICB8CisgICAgICAgfF9fX19fX19fX19fX3w8LW1zcCAxLS1hZnRlciAgIHwgc3IxNjAtc3IxNjIgICAgfCAgfAorICAgICAgIHwgICAgICAgICAgICB8IFBVU0hfRFVNTVlfRlJBTUV8IHNyMTI4LXNyMTM1ICAgIHwgIHwKKyAgICAgICB8IHN0cnVjdCByZXQgfCAgICAgICAgICAgICAgICAgfF9fX19fX19fX19fX19fX198ICB8CisgICAgICAgfCAxNysgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgfCAKKyAgICAgICB8X19fX19fX19fX19ffDwtIGxycCAgICAgICAgICAgfCBhcmdzX291dF9kdW1teSB8ICB8CisgICAgICAgfCBzdHJ1Y3QgcmV0IHwJCSAgICAgIHwgICgxNiB3b3JkcykgICAgfCAgfAorICAgICAgIHwgMTYgICAgICAgICB8CQkgICAgICB8X19fX19fX19fX19fX19fX3wgIHwKKyAgICAgICB8ICgxNiB3b3JkcykgfCAgICAgICAgICAgICAgICAgfF9fX19scjFfZHVtbXlfX198LS0rCisgICAgICAgfF9fX19fX19fX19fX3w8LSBtc3AgMi0tYWZ0ZXIgIHxfcmV0YWRkcl9kdW1teV9ffDwtIGdyMSBhZnRlcgorICAgICAgIHwgICAgICAgICAgICB8IHN0cnVjdCByZXQgICAgICB8ICAgICAgICAgICAgICAgIHwgICBQVVNIX0RVTU1ZX0ZSQU1FCisgICAgICAgfCBtYXJnczE3KyAgIHwgYXJlYSBhbGxvY2F0ZWQgIHwgIGxvY2Fsc19pbmYgICAgfAorICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8X19fX19fX19fX19fX19fX3wgICAgY2FsbGVkCisgICAgICAgfF9fX19fX19fX19fX3w8LSBtc3AgNC0td2hlbiAgIHwgICAgICAgICAgICAgICAgfCAgICBmdW5jdGlvbidzCisgICAgICAgfCAgICAgICAgICAgIHwgICBpbmYgY2FsbGVkICAgIHwgYXJnc19vdXRfaW5mICAgfCAgICBmcmFtZSAoc2V0IHVwCisgICAgICAgfCBtYXJnczE2ICAgIHwgICAgICAgICAgICAgICAgIHxfX19fX19fX19fX19fX19ffCAgICBieSBjYWxsZWQKKyAgICAgICB8ICgxNiB3b3JkcykgfCAgICAgICAgICAgICAgICAgfF9fX19fbHIxX2luZl9fX198ICAgIGZ1bmN0aW9uKS4KKyAgICAgICB8X19fX19fX19fX19ffDwtIG1zcCAzLS1hZnRlciAgfCAgICAgICAuICAgICAgICB8CisgICAgICAgfCAgICAgICAgICAgIHwgICBhcmdzIHB1c2hlZCAgIHwgICAgICAgLiAgICAgICAgfAorICAgICAgIHwgICAgICAgICAgICB8CSAgICAgICAgICAgICAgfCAgICAgICAuICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAorCisgICBhcmdfc2xvcDogVGhpcyBhcmVhIGlzIHNvIHRoYXQgd2hlbiB0aGUgY2FsbCBkdW1teSBhZGRzIDE2IHdvcmRzIHRvCisgICAgICB0aGUgbXNwLCBpdCB3b24ndCBlbmQgdXAgbGFyZ2VyIHRoYW4gbWZwX2R1bW15IChpdCBpcyBuZWVkZWQgaW4gdGhlCisgICAgICBjYXNlIHdoZXJlIG1hcmdzIGFuZCBzdHJ1Y3RfcmV0IGRvIG5vdCBhZGQgdXAgdG8gYXQgbGVhc3QgMTYgd29yZHMpLgorICAgc3RydWN0IHJldDogIFRoaXMgYXJlYSBpcyBhbGxvY2F0ZWQgYnkgR0RCIGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgbW9yZQorICAgICAgdGhhbiAxNiB3b3Jkcy4gIHN0cnVjdCByZXRfMTYgaXMgbm90IHVzZWQgb24gdGhlIGEyOWsuCisgICBtYXJnczogIFB1c2hlZCBieSBHREIuICBUaGUgY2FsbCBkdW1teSBjb3BpZXMgdGhlIGZpcnN0IDE2IHdvcmRzIHRvCisgICAgICBhcmdzX291dF9kdW1teS4KKyAgIHJldGFkZHJfc3Byb2M6ICBDb250YWlucyB0aGUgUEMgYXQgdGhlIHRpbWUgd2UgY2FsbCB0aGUgZnVuY3Rpb24uCisgICAgICBzZXQgYnkgUFVTSF9EVU1NWV9GUkFNRSBhbmQgcmVhZCBieSBQT1BfRlJBTUUuCisgICByZXRhZGRyX2R1bW15OiAgVGhpcyBwb2ludHMgdG8gYSBicmVha3BvaW50IGluc3RydWN0aW9uIGluIHRoZSBkdW1teS4gICovCisMCisvKiBSc2l6ZSBmb3IgZHVtbXkgZnJhbWUsIGluIGJ5dGVzLiAgKi8KKworLyogQnl0ZXMgZm9yIG91dGdvaW5nIGFyZ3MsIGxyMSwgYW5kIHJldGFkZHIuICAqLworI2RlZmluZSBEVU1NWV9BUkcgKDIgKiA0ICsgMTYgKiA0KQorCisvKiBOdW1iZXIgb2Ygc3BlY2lhbCByZWdpc3RlcnMgKHNyMTI4LSkgdG8gc2F2ZS4gICovCisjZGVmaW5lIERVTU1ZX1NBVkVfU1IxMjggOAorLyogTnVtYmVyIG9mIHNwZWNpYWwgcmVnaXN0ZXJzIChzcjE2MC0pIHRvIHNhdmUuICAqLworI2RlZmluZSBEVU1NWV9TQVZFX1NSMTYwIDMKKy8qIE51bWJlciBvZiBnZW5lcmFsIChncjk2LSBvciBncjY0LSkgcmVnaXN0ZXJzIHRvIHNhdmUuICAqLworI2RlZmluZSBEVU1NWV9TQVZFX0dSRUdTIDI5CisKKyNkZWZpbmUgRFVNTVlfRlJBTUVfUlNJWkUgXAorKDQgLyogbWZwX2R1bW15ICovICAgICAJICBcCisgKyA0ICogNCAgLyogcGMwLCBwYzEsIHBjMiwgbHIwICovICBcCisgKyBEVU1NWV9TQVZFX0dSRUdTICogNCAgIFwKKyArIERVTU1ZX1NBVkVfU1IxNjAgKiA0CSAgXAorICsgRFVNTVlfU0FWRV9TUjEyOCAqIDQJICBcCisgKyBEVU1NWV9BUkcJCSAgXAorICsgNCAvKiBwYWQgdG8gZG91Ymxld29yZCAqLyApCisKKy8qIFB1c2ggYW4gZW1wdHkgc3RhY2sgZnJhbWUsIHRvIHJlY29yZCB0aGUgY3VycmVudCBQQywgZXRjLiAgKi8KKworI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FIHB1c2hfZHVtbXlfZnJhbWUoKQorZXh0ZXJuIHZvaWQgcHVzaF9kdW1teV9mcmFtZSAoKTsKKworLyogRGlzY2FyZCBmcm9tIHRoZSBzdGFjayB0aGUgaW5uZXJtb3N0IGZyYW1lLAorICAgcmVzdG9yaW5nIGFsbCBzYXZlZCByZWdpc3RlcnMuICAqLworCisjZGVmaW5lIFBPUF9GUkFNRSBwb3BfZnJhbWUoKQorZXh0ZXJuIHZvaWQgcG9wX2ZyYW1lICgpOworCisvKiBUaGlzIHNlcXVlbmNlIG9mIHdvcmRzIGlzIHRoZSBpbnN0cnVjdGlvbnMKKyAgIG10c3JpbSBjciwgMTUKKyAgIGxvYWRtIDAsIDAsIGxyMiwgbXNwICAgICA7IGxvYWQgZmlyc3QgMTYgd29yZHMgb2YgYXJndW1lbnRzIGludG8gcmVnaXN0ZXJzCisgICBhZGQgbXNwLCBtc3AsIDE2ICogNCAgICAgOyBwb2ludCB0byB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cworIENPTlNUX0lOU046CisgICBjb25zdCBscjAsaW5mCQk7IChyZXBsYWNlZCBieSAgICAgICBoYWxmIG9mIHRhcmdldCBhZGRyKQorICAgY29uc3RoIGxyMCxpbmYJCTsgKHJlcGxhY2VkIGJ5IG90aGVyIGhhbGYgb2YgdGFyZ2V0IGFkZHIpCisgICBjYWxsaSBscjAsIGxyMCAKKyAgIGFzZXEgMHg0MCxncjEsZ3IxICAgOyBub3AKKyBCUkVBS1BUX0lOU046CisgICBhc25lcSAweDUwLGdyMSxncjEgIDsgYnJlYWtwb2ludAkocmVwbGFjZWQgYnkgbG9jYWwgYnJlYWtwb2ludCBpbnNuKQorICAgKi8KKworI2lmIFRBUkdFVF9CWVRFX09SREVSID09IEhPU1RfQllURV9PUkRFUgorI2RlZmluZSBCUyhjb25zdCkJY29uc3QKKyNlbHNlCisjZGVmaW5lCUJTKGNvbnN0KQkoKChjb25zdCkgJiAweGZmKSA8PCAyNCkgfAlcCisJCQkoKChjb25zdCkgJiAweGZmMDApIDw8IDgpIHwJXAorCQkJKCgoY29uc3QpICYgMHhmZjAwMDApID4+IDgpIHwJXAorCQkJKCgoY29uc3QpICYgMHhmZjAwMDAwMCkgPj4gMjQpCisjZW5kaWYKKworLyogUG9zaXRpb24gb2YgdGhlICJjb25zdCIgYW5kIGJsa3QgaW5zdHJ1Y3Rpb25zIHdpdGhpbiBDQUxMX0RVTU1ZIGluIGJ5dGVzLiAqLworI2RlZmluZSBDT05TVF9JTlNOICgzICogNCkKKyNkZWZpbmUgQlJFQUtQVF9JTlNOICg3ICogNCkKKyNkZWZpbmUgQ0FMTF9EVU1NWSB7CVwKKwkJQlMoMHgwNDAwODcwZiksXAorCQlCUygweDM2MDA4MjAwfChNU1BfSFdfUkVHTlVNKSksIFwKKwkJQlMoMHgxNTAwMDA0MHwoTVNQX0hXX1JFR05VTTw8OCl8KE1TUF9IV19SRUdOVU08PDE2KSksIFwKKwkJQlMoMHgwM2ZmODBmZiksCVwKKwkJQlMoMHgwMmZmODBmZiksCVwKKwkJQlMoMHhjODAwODA4MCksCVwKKwkJQlMoMHg3MDQwMDEwMSksCVwKKwkJQlMoMHg3MjUwMDEwMSl9CisjZGVmaW5lIENBTExfRFVNTVlfTEVOR1RIICg4ICogNCkKKworI2RlZmluZSBDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCAwICAvKiBTdGFydCBleGVjdXRpb24gYXQgYmVnaW5uaW5nIG9mIGR1bW15ICovCisKKy8qIEhlbHBlciBtYWNybyBmb3IgRklYX0NBTExfRFVNTVkuICBXT1JEUCBpcyBhIGxvbmcgKiB3aGljaCBwb2ludHMgdG8gYQorICAgd29yZCBpbiB0YXJnZXQgYnl0ZSBvcmRlcjsgYml0cyAwLTcgYW5kIDE2LTIzIG9mICpXT1JEUCBhcmUgcmVwbGFjZWQgd2l0aAorICAgYml0cyAwLTcgYW5kIDgtMTUgb2YgREFUQSAod2hpY2ggaXMgaW4gaG9zdCBieXRlIG9yZGVyKS4gICovCisKKyNpZiBUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisjZGVmaW5lIFNUVUZGX0kxNihXT1JEUCwgREFUQSkgXAorICB7IFwKKyAgICAqKChjaGFyICopKFdPUkRQKSArIDMpID0gKChEQVRBKSAmIDB4ZmYpO1wKKyAgICAqKChjaGFyICopKFdPUkRQKSArIDEpID0gKCgoREFUQSkgPj4gOCkgJiAweGZmKTtcCisgIH0KKyNlbHNlIC8qIFRhcmdldCBpcyBsaXR0bGUgZW5kaWFuLiAgKi8KKyNkZWZpbmUgU1RVRkZfSTE2KFdPUkRQLCBEQVRBKSBcCisgIHsKKyAgICAqKGNoYXIgKikoV09SRFApID0gKChEQVRBKSAmIDB4ZmYpOworICAgICooKGNoYXIgKikoV09SRFApICsgMikgPSAoKChEQVRBKSA+PiA4KSAmIDB4ZmYpOworICB9CisjZW5kaWYgLyogVGFyZ2V0IGlzIGxpdHRsZSBlbmRpYW4uICAqLworCisvKiBJbnNlcnQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYXJncyBhbmQgZnVuY3Rpb24gYWRkcmVzcworICAgaW50byBhIGNhbGwgc2VxdWVuY2Ugb2YgdGhlIGFib3ZlIGZvcm0gc3RvcmVkIGF0IERVTU1ZTkFNRS4gICovCisKKy8qIEN1cnJlbnRseSB0aGlzIHN0dWZmcyBpbiB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gdGhhdCB3ZSBhcmUgY2FsbGluZy4KKyAgIFNpbmNlIGRpZmZlcmVudCBhMjlrIHN5c3RlbXMgdXNlIGRpZmZlcmVudCBicmVha3BvaW50IGluc3RydWN0aW9ucywgaXQKKyAgIGFsc28gc3R1ZmZzIEJSRUFLUE9JTlQgaW4gdGhlIHJpZ2h0IHBsYWNlICh0byBhdm9pZCBoYXZpbmcgdG8KKyAgIGR1cGxpY2F0ZSBDQUxMX0RVTU1ZIGluIGVhY2ggdG0tKi5oIGZpbGUpLiAgKi8KKworI2RlZmluZSBGSVhfQ0FMTF9EVU1NWShkdW1teW5hbWUsIHBjLCBmdW4sIG5hcmdzLCBhcmdzLCB0eXBlLCBnY2NfcCkgICBcCisgIHtcCisgICAgU1RVRkZfSTE2KChjaGFyICopZHVtbXluYW1lICsgQ09OU1RfSU5TTiwgZnVuKTsJCVwKKyAgICBTVFVGRl9JMTYoKGNoYXIgKilkdW1teW5hbWUgKyBDT05TVF9JTlNOICsgNCwgZnVuID4+IDE2KTsJXAorICAvKiBGSVhNRSAgbWVtY3B5ICgoY2hhciAqKShkdW1teW5hbWUpICsgQlJFQUtQVF9JTlNOLCBicmVha19pbnNuLCA0KTsgKi8gXAorICB9CisKKy8qIGEyOWsgYXJjaGl0ZWN0dXJlIGhhcyBzZXBhcmF0ZSBkYXRhICYgaW5zdHJ1Y3Rpb24gbWVtb3JpZXMgLS0gd2lyZWQgdG8KKyAgIGRpZmZlcmVudCBwaW5zIG9uIHRoZSBjaGlwIC0tIGFuZCBjYW4ndCBleGVjdXRlIHRoZSBkYXRhIG1lbW9yeS4KKyAgIEFsc28sIHRoZXJlIHNob3VsZCBiZSBzcGFjZSBhZnRlciB0ZXh0X2VuZDsKKyAgIHdlIHdvbid0IGdldCBhIFNJR1NFR1Ygb3Igc2NyaWJibGUgb24gZGF0YSBzcGFjZS4gICovCisKKyNkZWZpbmUgQ0FMTF9EVU1NWV9MT0NBVElPTiBBRlRFUl9URVhUX0VORAorCisvKiBCZWNhdXNlIG9mIHRoaXMsIHdlIG5lZWQgKGFzIGEga2x1ZGdlKSB0byBrbm93IHRoZSBhZGRyZXNzZXMgb2YgdGhlCisgICB0ZXh0IHNlY3Rpb24uICAqLworCisjZGVmaW5lCU5FRURfVEVYVF9TVEFSVF9FTkQgMQorCisvKiBIb3cgdG8gdHJhbnNsYXRlIHJlZ2lzdGVyIG51bWJlcnMgaW4gdGhlIC5zdGFiJ3MgaW50byBnZGIncyBpbnRlcm5hbCByZWdpc3RlcgorICAgbnVtYmVycy4gIFdlIGRvbid0IHRyYW5zbGF0ZSB0aGVtLCBidXQgd2Ugd2FybiBpZiBhbiBpbnZhbGlkIHJlZ2lzdGVyCisgICBudW1iZXIgaXMgc2Vlbi4gIE5vdGUgdGhhdCBGSVhNRSwgd2UgdXNlIHRoZSB2YWx1ZSAic3ltIiBhcyBhbiBpbXBsaWNpdAorICAgYXJndW1lbnQgaW4gcHJpbnRpbmcgdGhlIGVycm9yIG1lc3NhZ2UuICBJdCBoYXBwZW5zIHRvIGJlIGF2YWlsYWJsZSB3aGVyZQorICAgdGhpcyBtYWNybyBpcyB1c2VkLiAgKFRoaXMgbWFjcm8gZGVmaW5pdGlvbiBhcHBlYXJlZCBpbiBhIGxhdGUgcmV2aXNpb24KKyAgIG9mIGdkYi0zLjkxLjYgYW5kIGlzIG5vdCB3ZWxsIHRlc3RlZC4gIEFsc28sIGl0IHNob3VsZCBiZSBhICJjb21wbGFpbnQiLikgKi8KKworI2RlZmluZQlTVEFCX1JFR19UT19SRUdOVU0obnVtKSBcCisJKCgobnVtKSA+IExSMF9SRUdOVU0gKyAxMjcpIFwKKwkgICA/IGZwcmludGYoc3RkZXJyLCAJXAorCQkiSW52YWxpZCByZWdpc3RlciBudW1iZXIgJWQgaW4gc3ltYm9sIHRhYmxlIGVudHJ5IGZvciAlc1xuIiwgXAorCSAgICAgICAgIChudW0pLCBTWU1CT0xfU09VUkNFX05BTUUgKHN5bSkpLCAobnVtKQlcCisJICAgOiAobnVtKSkKKworZXh0ZXJuIGVudW0gYTI5a19wcm9jZXNzb3JfdHlwZXMgeworICBhMjlrX3Vua25vd24sCisKKyAgLyogQml0IDB4NDAwIG9mIHRoZSBDUFMgZG9lcyAqbm90KiBpZGVudGlmeSBmcmVlemUgbW9kZSwgaS5lLiAyOTAwMCwKKyAgICAgMjkwMzAsIGV0Yy4gICovCisgIGEyOWtfbm9fZnJlZXplX21vZGUsCisKKyAgLyogQml0IDB4NDAwIG9mIHRoZSBDUFMgZG9lcyBpZGVudGlmeSBmcmVlemUgbW9kZSwgaS5lLiAyOTA1MC4gICovCisgIGEyOWtfZnJlZXplX21vZGUKK30gcHJvY2Vzc29yX3R5cGU7CisKKy8qIFdlIG5lZWQgdGhyZWUgYXJndW1lbnRzIGZvciBhIGdlbmVyYWwgZnJhbWUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlCisgICAiZnJhbWUiIG9yICJpbmZvIGZyYW1lIiBjb21tYW5kLiAgKi8KKworI2RlZmluZSBTRVRVUF9BUkJJVFJBUllfRlJBTUUoYXJnYywgYXJndikgc2V0dXBfYXJiaXRyYXJ5X2ZyYW1lIChhcmdjLCBhcmd2KQorZXh0ZXJuIHN0cnVjdCBmcmFtZV9pbmZvICpzZXR1cF9hcmJpdHJhcnlfZnJhbWUgUEFSQU1TICgoaW50LCBDT1JFX0FERFIgKikpOwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hMjlrL3RtLXVsdHJhMy5oIGIvZ2RiL2NvbmZpZy9hMjlrL3RtLXVsdHJhMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOTYyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2EyOWsvdG0tdWx0cmEzLmgKQEAgLTAsMCArMSwyMjYgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIE5ZVSBVbHRyYWNvbXB1dGVyIDI5MDAwIHRhcmdldCwgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTkwLCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgV29vZCBAIE5ldyBZb3JrIFVuaXZlcnNpdHkgKHdvb2RAbnl1LmVkdSkuIAorICAgCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBpbmNsdWRlcyB0bS1hMjlrLmgsIGJ1dCBwcmVkZWZpbmVzIFJFR0lTVEVSX05BTUVTIGFuZAorICAgcmVsYXRlZCBtYWNyb3MuICBUaGUgZmlsZSBzdXBwb3J0cyBhIGEyOWsgcnVubmluZyBvdXIgZmxhdm9yIG9mCisgICBVbml4IG9uIG91ciBVbHRyYTMgUEUgQm9hcmRzLiAgKi8KKworLyogQnl0ZSBvcmRlciBpcyBjb25maWd1cmFibGUsIGJ1dCB0aGlzIG1hY2hpbmUgcnVucyBiaWctZW5kaWFuLiAgKi8KKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVIgQklHX0VORElBTgorCisvKiBJbml0aWFsaXplciBmb3IgYW4gYXJyYXkgb2YgbmFtZXMgb2YgcmVnaXN0ZXJzLgorICAgVGhlcmUgc2hvdWxkIGJlIE5VTV9SRUdTIHN0cmluZ3MgaW4gdGhpcyBpbml0aWFsaXplci4KKyAqLworI2RlZmluZSBOVU1fUkVHUyAgIChFWE9fUkVHTlVNICsgMSkJCisKKyNkZWZpbmUgUkVHSVNURVJfTkFNRVMgeyAJCQkJCQkgXAorICJncjEiLAkJCQkJCQkJCSBcCisgImdyNjQiLCAiZ3I2NSIsICJncjY2IiwgImdyNjciLCAiZ3I2OCIsICJncjY5IiwgImdyNzAiLCAiZ3I3MSIsICJncjcyIiwgXAorICJncjczIiwgImdyNzQiLCAiZ3I3NSIsICJncjc2IiwgImdyNzciLCAiZ3I3OCIsICJncjc5IiwgImdyODAiLCAiZ3I4MSIsIFwKKyAiZ3I4MiIsICJncjgzIiwgImdyODQiLCAiZ3I4NSIsICJncjg2IiwgImdyODciLCAiZ3I4OCIsICJncjg5IiwgImdyOTAiLCBcCisgImdyOTEiLCAiZ3I5MiIsICJncjkzIiwgImdyOTQiLCAiZ3I5NSIsCQkJCSBcCisgImdyOTYiLCAiZ3I5NyIsICJncjk4IiwgImdyOTkiLCAiZ3IxMDAiLCAiZ3IxMDEiLCAiZ3IxMDIiLCAiZ3IxMDMiLCAiZ3IxMDQiLCBcCisgImdyMTA1IiwgImdyMTA2IiwgImdyMTA3IiwgImdyMTA4IiwgImdyMTA5IiwgImdyMTEwIiwgImdyMTExIiwgImdyMTEyIiwgXAorICJncjExMyIsICJncjExNCIsICJncjExNSIsICJncjExNiIsICJncjExNyIsICJncjExOCIsICJncjExOSIsICJncjEyMCIsIFwKKyAiZ3IxMjEiLCAiZ3IxMjIiLCAiZ3IxMjMiLCAiZ3IxMjQiLCAiZ3IxMjUiLCAiZ3IxMjYiLCAiZ3IxMjciLAkJIFwKKyAibHIwIiwgImxyMSIsICJscjIiLCAibHIzIiwgImxyNCIsICJscjUiLCAibHI2IiwgImxyNyIsICJscjgiLCAibHI5IiwgICBcCisgImxyMTAiLCAibHIxMSIsICJscjEyIiwgImxyMTMiLCAibHIxNCIsICJscjE1IiwgImxyMTYiLCAibHIxNyIsICJscjE4IiwgXAorICJscjE5IiwgImxyMjAiLCAibHIyMSIsICJscjIyIiwgImxyMjMiLCAibHIyNCIsICJscjI1IiwgImxyMjYiLCAibHIyNyIsIFwKKyAibHIyOCIsICJscjI5IiwgImxyMzAiLCAibHIzMSIsICJscjMyIiwgImxyMzMiLCAibHIzNCIsICJscjM1IiwgImxyMzYiLCBcCisgImxyMzciLCAibHIzOCIsICJscjM5IiwgImxyNDAiLCAibHI0MSIsICJscjQyIiwgImxyNDMiLCAibHI0NCIsICJscjQ1IiwgXAorICJscjQ2IiwgImxyNDciLCAibHI0OCIsICJscjQ5IiwgImxyNTAiLCAibHI1MSIsICJscjUyIiwgImxyNTMiLCAibHI1NCIsIFwKKyAibHI1NSIsICJscjU2IiwgImxyNTciLCAibHI1OCIsICJscjU5IiwgImxyNjAiLCAibHI2MSIsICJscjYyIiwgImxyNjMiLCBcCisgImxyNjQiLCAibHI2NSIsICJscjY2IiwgImxyNjciLCAibHI2OCIsICJscjY5IiwgImxyNzAiLCAibHI3MSIsICJscjcyIiwgXAorICJscjczIiwgImxyNzQiLCAibHI3NSIsICJscjc2IiwgImxyNzciLCAibHI3OCIsICJscjc5IiwgImxyODAiLCAibHI4MSIsIFwKKyAibHI4MiIsICJscjgzIiwgImxyODQiLCAibHI4NSIsICJscjg2IiwgImxyODciLCAibHI4OCIsICJscjg5IiwgImxyOTAiLCBcCisgImxyOTEiLCAibHI5MiIsICJscjkzIiwgImxyOTQiLCAibHI5NSIsICJscjk2IiwgImxyOTciLCAibHI5OCIsICJscjk5IiwgXAorICJscjEwMCIsICJscjEwMSIsICJscjEwMiIsICJscjEwMyIsICJscjEwNCIsICJscjEwNSIsICJscjEwNiIsICJscjEwNyIsIFwKKyAibHIxMDgiLCAibHIxMDkiLCAibHIxMTAiLCAibHIxMTEiLCAibHIxMTIiLCAibHIxMTMiLCAibHIxMTQiLCAibHIxMTUiLCBcCisgImxyMTE2IiwgImxyMTE3IiwgImxyMTE4IiwgImxyMTE5IiwgImxyMTIwIiwgImxyMTIxIiwgImxyMTIyIiwgImxyMTIzIiwgXAorICJscjEyNCIsICJscjEyNSIsICJscjEyNiIsICJscjEyNyIsCQkJCQkgXAorICJ2YWIiLCAib3BzIiwgImNwcyIsICJjZmciLCAiY2hhIiwgImNoZCIsICJjaGMiLCAicmJwIiwgInRtYyIsICJ0bXIiLAkgXAorICJwYzAiLCAicGMxIiwgInBjMiIsICJtbXUiLCAibHJ1IiwJCQkJCSBcCisgImlwYyIsICJpcGEiLCAiaXBiIiwgInEiLCAiYWx1IiwgImJwIiwgImZjIiwgImNyIiwJCQkgXAorICJmcGUiLCAiaW50IiwgImZwcyIsICJleG8iIH0KKworCisjaWZkZWYgS0VSTkVMX0RFQlVHR0lORworIyBkZWZpbmUJUEFERFJfVV9SRUdOVU0JMjIJCS8qIGdyODYgKi8KKyMgZGVmaW5lCVJFVFVSTl9SRUdOVU0JR1I2NF9SRUdOVU0JCisjZWxzZQorIyBkZWZpbmUJUkVUVVJOX1JFR05VTQlHUjk2X1JFR05VTQkKKyNlbmRpZgkvKiBLRVJORUxfREVCVUdHSU5HICovCisKKworLyogU2hvdWxkIHJlbmFtZSBhbGwgR1I5Nl9SRUdOVU0gdG8gUkVUVVJOX1JFR05VTSAqLyAKKyNkZWZpbmUgR1IxX1JFR05VTSAJKDApCisjZGVmaW5lIEdSNjRfUkVHTlVNCTEKKyNkZWZpbmUgR1I5Nl9SRUdOVU0gCShHUjY0X1JFR05VTSArIDMyKQorLyogVGhpcyBuZWVkcyB0byBiZSB0aGUgbWVtb3J5IHN0YWNrIHBvaW50ZXIsIG5vdCB0aGUgcmVnaXN0ZXIgc3RhY2sgcG9pbnRlciwKKyAgIHRvIG1ha2UgY2FsbF9mdW5jdGlvbiB3b3JrIHJpZ2h0LiAgKi8KKyNkZWZpbmUgU1BfUkVHTlVNIAlNU1BfUkVHTlVNCisKKyNkZWZpbmUgRlBfUkVHTlVNIAkoTFIwX1JFR05VTSArIDEpCS8qIGxyMSAqLworLyogTGFyZ2UgUmV0dXJuIFBvaW50ZXIgICovCisjZGVmaW5lIExSUF9SRUdOVU0gKDEyMyAtIDk2ICsgUkVUVVJOX1JFR05VTSkKKy8qIFN0YXRpYyBsaW5rIHBvaW50ZXIgICAqLworI2RlZmluZSBTTFBfUkVHTlVNICgxMjQgLSA5NiArIFJFVFVSTl9SRUdOVU0pCisvKiBNZW1vcnkgU3RhY2sgUG9pbnRlci4gICovCisjZGVmaW5lIE1TUF9SRUdOVU0gKDEyNSAtIDk2ICsgUkVUVVJOX1JFR05VTSkKKy8qIFJlZ2lzdGVyIGFsbG9jYXRlIGJvdW5kLiAgKi8KKyNkZWZpbmUgUkFCX1JFR05VTSAoMTI2IC0gOTYgKyBSRVRVUk5fUkVHTlVNKQorLyogUmVnaXN0ZXIgRnJlZSBCb3VuZC4gICovCisjZGVmaW5lIFJGQl9SRUdOVU0gKDEyNyAtIDk2ICsgUkVUVVJOX1JFR05VTSkKKy8qIFJlZ2lzdGVyIFN0YWNrIFBvaW50ZXIuICAqLworI2RlZmluZSBSU1BfUkVHTlVNIEdSMV9SRUdOVU0KKyNkZWZpbmUgTFIwX1JFR05VTSAoIDMyICsgIEdSOTZfUkVHTlVNKSAKKworLyogUHJvdGVjdGVkIFNwZWNpYWwgcmVnaXN0ZXJzICovCisjZGVmaW5lIFZBQl9SRUdOVU0gKExSMF9SRUdOVU0gKyAgMTI4KQorI2RlZmluZSBPUFNfUkVHTlVNIChWQUJfUkVHTlVNICsgMSkgIAorI2RlZmluZSBDUFNfUkVHTlVNIChWQUJfUkVHTlVNICsgMikgIAorI2RlZmluZSBDRkdfUkVHTlVNIChWQUJfUkVHTlVNICsgMykgIAorI2RlZmluZSBDSEFfUkVHTlVNIChWQUJfUkVHTlVNICsgNCkgIAorI2RlZmluZSBDSERfUkVHTlVNIChWQUJfUkVHTlVNICsgNSkgIAorI2RlZmluZSBDSENfUkVHTlVNIChWQUJfUkVHTlVNICsgNikgIAorI2RlZmluZSBSQlBfUkVHTlVNIChWQUJfUkVHTlVNICsgNykgIAorI2RlZmluZSBUTUNfUkVHTlVNIChWQUJfUkVHTlVNICsgOCkgIAorI2RlZmluZSBUTVJfUkVHTlVNIChWQUJfUkVHTlVNICsgOSkgIAorI2RlZmluZSBOUENfUkVHTlVNIChWQUJfUkVHTlVNICsgMTApCS8qIHBjMCAqLworI2RlZmluZSBQQ19SRUdOVU0gIChWQUJfUkVHTlVNICsgMTEpICAJLyogcGMxICovCisjZGVmaW5lIFBDMl9SRUdOVU0gKFZBQl9SRUdOVU0gKyAxMikgIAkvKiBwYzIgKi8KKyNkZWZpbmUgTU1VX1JFR05VTSAoVkFCX1JFR05VTSArIDEzKQorI2RlZmluZSBMUlVfUkVHTlVNIChWQUJfUkVHTlVNICsgMTQpCisJLyogUmVnaXN0ZXIgc2VxdWVuY2UgZ2FwICovCisvKiBVbnByb3RlY3RlZCBTcGVjaWFsIHJlZ2lzdGVycyAqLworI2RlZmluZSBJUENfUkVHTlVNIChMUlVfUkVHTlVNICsgMSkgCisjZGVmaW5lIElQQV9SRUdOVU0gKElQQ19SRUdOVU0gKyAxKSAKKyNkZWZpbmUgSVBCX1JFR05VTSAoSVBDX1JFR05VTSArIDIpIAorI2RlZmluZSBRX1JFR05VTSAgIChJUENfUkVHTlVNICsgMykgCisjZGVmaW5lIEFMVV9SRUdOVU0gKElQQ19SRUdOVU0gKyA0KSAKKyNkZWZpbmUgUFNfUkVHTlVNICBBTFVfUkVHTlVNCisjZGVmaW5lIEJQX1JFR05VTSAgKElQQ19SRUdOVU0gKyA1KSAKKyNkZWZpbmUgRkNfUkVHTlVNICAoSVBDX1JFR05VTSArIDYpIAorI2RlZmluZSBDUl9SRUdOVU0gIChJUENfUkVHTlVNICsgNykgCisJLyogUmVnaXN0ZXIgc2VxdWVuY2UgZ2FwICovCisjZGVmaW5lIEZQRV9SRUdOVU0gKENSX1JFR05VTSAgKyAxKSAKKyNkZWZpbmUgSU5UX1JFR05VTSAoRlBFX1JFR05VTSArIDEpIAorI2RlZmluZSBGUFNfUkVHTlVNIChGUEVfUkVHTlVNICsgMikgCisJLyogUmVnaXN0ZXIgc2VxdWVuY2UgZ2FwICovCisjZGVmaW5lIEVYT19SRUdOVU0gKEZQU19SRUdOVU0gKyAxKSAKKworLyogU3BlY2lhbCByZWdpc3RlciAjeC4gICovCisjZGVmaW5lIFNSX1JFR05VTSh4KSBcCisgICgoeCkgPCAxNSAgPyBWQUJfUkVHTlVNICsgKHgpCQkJCQkgXAorICAgOiAoeCkgPj0gMTI4ICYmICh4KSA8IDEzNiA/IElQQ19SRUdOVU0gKyAoeC0xMjgpCQkgXAorICAgOiAoeCkgPj0gMTYwICYmICh4KSA8IDE2MyA/IEZQRV9SRUdOVU0gKyAoeC0xNjApCQkgXAorICAgOiAoeCkgPT0gMTY0ID8gRVhPX1JFR05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA6IChlcnJvciAoIkludGVybmFsIGVycm9yIGluIFNSX1JFR05VTSIpLCAwKSkKKworI2lmbmRlZiBLRVJORUxfREVCVUdHSU5HCisvKgorICogVGhpcyBtYWNybyBkZWZpbmVzIHRoZSByZWdpc3RlciBudW1iZXJzIChmcm9tIFJFR0lTVEVSX05BTUVTKSB0aGF0CisgKiBhcmUgZWZmZWN0aXZlbHkgdW5hdmFpbGFibGUgdG8gdGhlIHVzZXIgdGhyb3VnaCBwdHJhY2UoKS4gIEl0IGFsbG93cyAKKyAqIHVzIHRvIGluY2x1ZGUgdGhlIHdob2xlIHJlZ2lzdGVyIHNldCBpbiBSRUdJU1RFUl9OQU1FUyAoaW5vcmRlciB0byAKKyAqIGJldHRlciBzdXBwb3J0IHJlbW90ZSBkZWJ1Z2dpbmcpLiAgSWYgaXQgaXMgdXNlZCBpbiAKKyAqIGZldGNoL3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycygpIGdkYiB3aWxsIG5vdCBjb21wbGFpbiBhYm91dCBJL08gZXJyb3JzIAorICogb24gZmV0Y2hpbmcgdGhlc2UgcmVnaXN0ZXJzLiAgSWYgYWxsIHJlZ2lzdGVycyBpbiBSRUdJU1RFUl9OQU1FUworICogYXJlIGF2YWlsYWJsZSwgdGhlbiByZXR1cm4gZmFsc2UgKDApLgorICovCisjZGVmaW5lIENBTk5PVF9TVE9SRV9SRUdJU1RFUihyZWdubykJCVwKKyAgICAgICAgICAgICAgICAgICgoKHJlZ25vKT49R1I2NF9SRUdOVU0gJiYgKHJlZ25vKTxHUjY0X1JFR05VTSszMikgfHwJXAorICAgICAgICAgICAgICAgICAgICgocmVnbm8pPT1WQUJfUkVHTlVNKSB8fAlcCisJCSAgICgocmVnbm8pPT1PUFNfUkVHTlVNKSB8fAlcCisgICAgICAgICAgICAgICAgICAgKChyZWdubyk+PUNGR19SRUdOVU0gJiYgKHJlZ25vKTw9VE1SX1JFR05VTSkgICAgIHx8CVwKKyAgICAgICAgICAgICAgICAgICAoKHJlZ25vKT09TU1VX1JFR05VTSkgfHwJXAorCQkgICAoKHJlZ25vKT09TFJVX1JFR05VTSkgfHwJXAorICAgICAgICAgICAgICAgICAgICgocmVnbm8pPj1BTFVfUkVHTlVNKSB8fAlcCisgICAgICAgICAgICAgICAgICAgKChyZWdubyk9PUNSX1JFR05VTSkgIHx8CVwKKwkJICAgKChyZWdubyk9PUVYT19SRUdOVU0pKQorI2RlZmluZSBDQU5OT1RfRkVUQ0hfUkVHSVNURVIocmVnbm8pCUNBTk5PVF9TVE9SRV9SRUdJU1RFUihyZWdubykKKyNlbmRpZiAvKiBLRVJORUxfREVCVUdHSU5HICovCisKKy8qCisgKiBDb252ZXJ0cyBhbiBzZGIgcmVnaXN0ZXIgbnVtYmVyIHRvIGFuIGludGVybmFsIGdkYiByZWdpc3RlciBudW1iZXIuCisgKiBDdXJyZW50bHkgdW5kZXIgZ2NjLCBncjk2LT4wLi4uZ3IxMjgtPjMxLi4ubHIwLT4zMi4uLmxyMTI3LT4xNTksIG9yLi4uCisgKiAJCSAgCWdyNjQtPjAuLi5ncjk1LT4zMSwgbHIwLT4zMi4uLmxyMTI3LT4xNTkuCisgKi8KKyNkZWZpbmUgU0RCX1JFR19UT19SRUdOVU0odmFsdWUpICgoKHZhbHVlKTwzMikgPyAoKHZhbHVlKStSRVRVUk5fUkVHTlVNKSA6IFwKKwkJIAkJICAgICAgICAgICAgICAgICAoKHZhbHVlKS0zMitMUjBfUkVHTlVNKSkKKworI2lmZGVmIEtFUk5FTF9ERUJVR0dJTkcKKyAgLyogdWJsb2NrIHZpcnR1YWwgYWRkcmVzcyBhcyBkZWZpbmVkIGluIG91ciBzeXMvcGFyYW0uaCAqLworICAvKiBGSVhNRTogU2hvdWxkIGdldCB0aGlzIGZyb20gc3lzL3BhcmFtLmggKi8KKyMgZGVmaW5lIFVWQUREUgkoKDMyKjB4MTAwMDAwKS04MTkyKSAgICAKKyNlbmRpZgorCisvKgorICogQXJlIHdlIGluIHNpZ3RyYW1wKCksIG5lZWRlZCBpbiBpbmZydW4uYy4gIFNwZWNpZmljIHRvIHVsdHJhMywgYmVjYXVzZQorICogd2UgdGFrZSBvZmYgdGhlIGxlYWRpbmcgJ18nLgorICovCisjaWYgIWRlZmluZWQoS0VSTkVMX0RFQlVHR0lORykKKyNpZmRlZiBTWU0xCisjIGRlZmluZSBJTl9TSUdUUkFNUChwYywgbmFtZSkgKG5hbWUgJiYgU1RSRVEgKCJzaWd0cmFtcCIsIG5hbWUpKQorI2Vsc2UKKyAgICAgICAgTmVlZCB0byBkZWZpbmUgSU5fU0lHVFJBTVAoKSBmb3Igc3ltMi4KKyNlbmRpZgorI2VuZGlmIC8qICFLRVJORUxfREVCVUdHSU5HICovCisKKyNpbmNsdWRlICJhMjlrL3RtLWEyOWsuaCIKKworLyoqKiogVGhlIGZvbGxvd2luZyBhcmUgZGVmaW5pdGlvbnMgdGhhdCBvdmVycmlkZSB0aG9zZSBpbiB0bS1hMjlrLmggKioqKi8KKworLyogVGhpcyBzZXF1ZW5jZSBvZiB3b3JkcyBpcyB0aGUgaW5zdHJ1Y3Rpb25zCisgICBtdHNyaW0gY3IsIDE1CisgICBsb2FkbSAwLCAwLCBscjIsIG1zcCAgICAgOyBsb2FkIGZpcnN0IDE2IHdvcmRzIG9mIGFyZ3VtZW50cyBpbnRvIHJlZ2lzdGVycworICAgYWRkIG1zcCwgbXNwLCAxNiAqIDQgICAgIDsgcG9pbnQgdG8gdGhlIHJlbWFpbmluZyBhcmd1bWVudHMKKyAgQ09OU1RfSU5TTjoKKyAgIGNvbnN0IGdyOTYsaW5mCisgICBjb25zdGggZ3I5NixpbmYKKyAgIGNhbGxpIGxyMCwgZ3I5NgorICAgYXNlcSAweDQwLGdyMSxncjEgICA7IG5vcAorICAgYXNuZXEgMHg1MCxncjEsZ3IxICA7IGJyZWFrcG9pbnQKKyAgIFdoZW4gS0VSTkVMX0RFQlVHR0lOIGlzIGRlZmluZWQsIG1zcCAtPiBncjkzLCBncjk2IC0+IGdyNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3ZCAgLT4gNWQsICAgIDYwICAtPiA0MAorICAgKi8KKworLyogUG9zaXRpb24gb2YgdGhlICJjb25zdCIgaW5zdHJ1Y3Rpb24gd2l0aGluIENBTExfRFVNTVkgaW4gYnl0ZXMuICAqLworI3VuZGVmIENBTExfRFVNTVkKKyNpZiBUQVJHRVRfQllURV9PUkRFUiA9PSBIT1NUX0JZVEVfT1JERVIKKyNpZmRlZiBLRVJORUxfREVCVUdHSU5HIC8qIGdyOTYgLT4gZ3I2NCAqLworIyAgZGVmaW5lIENBTExfRFVNTVkgezB4MDQwMDg3MGYsIDB4MzYwMDgyNWQsIDB4MTU1ZDVkNDAsIDB4MDNmZjQwZmYsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgMHgwMmZmNDBmZiwgMHhjODAwODA0MCwgMHg3MDQwMDEwMSwgMHg3MjUwMDEwMX0KKyNlbHNlCisjICBkZWZpbmUgQ0FMTF9EVU1NWSB7MHgwNDAwODcwZiwgMHgzNjAwODI3ZCwgMHgxNTdkN2Q0MCwgMHgwM2ZmNjBmZiwgICAgXAorICAgICAgICAgICAgICAgICAgICAweDAyZmY2MGZmLCAweGM4MDA4MDYwLCAweDcwNDAwMTAxLCAweDcyNTAwMTAxfQorI2VuZGlmIC8qIEtFUk5FTF9ERUJVR0dJTkcgKi8KKyNlbHNlIC8qIEJ5dGUgb3JkZXIgZGlmZmVycy4gICovCisgIHlvdSBsb3NlCisjZW5kaWYgLyogQnl0ZSBvcmRlciBkaWZmZXJzLiAgKi8KKworI2lmICFkZWZpbmVkKEtFUk5FTF9ERUJVR0dJTkcpCisjIGlmZGVmIFNZTTEKKyMgIHVuZGVmICBERUNSX1BDX0FGVEVSX0JSRUFLCisjICBkZWZpbmUgREVDUl9QQ19BRlRFUl9CUkVBSyAwCS8qIFN5bTEga2VybmVsIGRvZXMgdGhlIGRlY3JlbWVudCAqLworIyBlbHNlCisgICAgLT4iVUxUUkEzIHJ1bm5pbmcgb3RoZXIgdGhhbiBzeW0xIE9TIiE7CisjIGVuZGlmCisjZW5kaWYgLyogIUtFUk5FTF9ERUJVR0dJTkcgKi8KKwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hMjlrL3RtLXZ4MjlrLmggYi9nZGIvY29uZmlnL2EyOWsvdG0tdngyOWsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODdkZjgyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9hMjlrL3RtLXZ4MjlrLmgKQEAgLTAsMCArMSwyMjkgQEAKKy8qIFRhcmdldCBtYWNoaW5lIGRlc2NyaXB0aW9uIGZvciBWeFdvcmtzIG9uIHRoZSAyOWssIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJhMjlrL3RtLWEyOWsuaCIKKworI2RlZmluZQlHREJJTklUX0ZJTEVOQU1FCSIudnhnZGJpbml0IgorCisjZGVmaW5lCURFRkFVTFRfUFJPTVBUCQkiKHZ4Z2RiKSAiCisKKy8qIE51bWJlciBvZiByZWdpc3RlcnMgaW4gYSBwdHJhY2VfZ2V0cmVncyBjYWxsLiAqLworCisjZGVmaW5lIFZYX05VTV9SRUdTIChOVU1fUkVHUykKKworLyogTnVtYmVyIG9mIHJlZ2lzdGVycyBpbiBhIHB0cmFjZV9nZXRmcHJlZ3MgY2FsbC4gKi8KKworLyogI2RlZmluZSBWWF9TSVpFX0ZQUkVHUyAqLworCisvKiBUaGlzIGlzIGFsbW9zdCBjZXJ0YWlubHkgdGhlIHdyb25nIHBsYWNlIGZvciB0aGlzOiAqLworI2RlZmluZSBMUjJfUkVHTlVNIDM0CisMCisKKy8qIFZ4d29ya3MgaGFzIGl0cyBvd24gQ0FMTF9EVU1NWSBzaW5jZSBpdCBtYW5hZ2VzIGJyZWFrcG9pbnRzIGluIHRoZSBrZXJuZWwgKi8KKworI3VuZGVmIENBTExfRFVNTVkKKworLyogUmVwbGFjZSB0aGUgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiBpbiB0aGUgQ0FMTF9EVU1NWSB3aXRoIGEgbm9wLgorICAgRm9yIFZ4d29ya3MsIHRoZSBicmVha3BvaW50IGlzIHNldCBhbmQgZGVsZXRlZCBieSBjYWxscyB0bworICAgQ0FMTF9EVU1NWV9CUkVBS19TRVQgYW5kIENBTExfRFVNTVlfQlJFQUtfREVMRVRFLiAgKi8KKworI2lmIFRBUkdFVF9CWVRFX09SREVSID09IEhPU1RfQllURV9PUkRFUgorI2RlZmluZSBDQUxMX0RVTU1ZIHsweDA0MDA4NzBmLFwKKwkJMHgzNjAwODIwMHwoTVNQX0hXX1JFR05VTSksIFwKKwkJMHgxNTAwMDA0MHwoTVNQX0hXX1JFR05VTTw8OCl8KE1TUF9IV19SRUdOVU08PDE2KSwgXAorCQkweDAzZmY4MGZmLCAweDAyZmY4MGZmLCAweGM4MDA4MDgwLCAweDcwNDAwMTAxLCAweDcwNDAwMTAxfQorI2Vsc2UgLyogQnl0ZSBvcmRlciBkaWZmZXJzLiAgKi8KKyNkZWZpbmUgQ0FMTF9EVU1NWSB7MHgwZjg3MDAwNCxcCisJCTB4MDA4MjAwMzZ8KE1TUF9IV19SRUdOVU0gPDwgMjQpLCBcCisJCTB4NDAwMDAwMTV8KE1TUF9IV19SRUdOVU08PDgpfChNU1BfSFdfUkVHTlVNPDwxNiksIFwKKwkJMHhmZjgwZmYwMywgMHhmZjgwZmYwMiwgMHg4MDgwMDBjOCwgMHgwMTAxNDA3MCwgMHgwMTAxNDA3MH0KKyNlbmRpZiAvKiBCeXRlIG9yZGVyIGRpZmZlcnMuICAqLworCisKKy8qIEZvciB0aGUgYmFzaWMgQ0FMTF9EVU1NWSBkZWZpbml0aW9ucywgc2VlICJ0bS0yOWsuaC4iICBXZSB1c2UgdGhlCisgICBzYW1lIENBTExfRFVNTVkgY29kZSwgYnV0IGRlZmluZSBGSVhfQ0FMTF9EVU1NWSAoYW5kIHJlbGF0ZWQgbWFjcm9zKQorICAgbG9jYWxseSB0byBoYW5kbGUgcmVtb3RlIGRlYnVnZ2luZyBvZiBWeFdvcmtzIHRhcmdldHMuICBUaGUgZGlmZmVyZW5jZQorICAgaXMgaW4gdGhlIHNldHRpbmcgYW5kIGNsZWFyaW5nIG9mIHRoZSBicmVha3BvaW50IGF0IHRoZSBlbmQgb2YgdGhlCisgICBDQUxMX0RVTU1ZIGNvZGUgZnJhZ21lbnQ7IHVuZGVyIFZ4V29ya3MsIHdlIGNhbid0IHNpbXBseSBpbnNlcnQgYQorICAgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiBpbnRvIHRoZSBjb2RlLCBzaW5jZSB0aGF0IHdvdWxkIGludGVyZmVyZSB3aXRoCisgICB0aGUgYnJlYWtwb2ludCBtYW5hZ2VtZW50IG1lY2hhbmlzbSBvbiB0aGUgdGFyZ2V0LgorICAgTm90ZSB0aGF0IENBTExfRFVNTVkgaXMgYSBwaWVjZSBvZiBjb2RlIHRoYXQgaXMgdXNlZCB0byBjYWxsIGFueSBDIGZ1bmN0aW9uCisgICB0aHJ1IFZ4R0RCICovCisKKy8qIFRoZSBvZmZzZXQgb2YgdGhlIGluc3RydWN0aW9uIHdpdGhpbiB0aGUgQ0FMTF9EVU1NWSBjb2RlIHdoZXJlIHdlCisgICB3YW50IHRoZSBpbmZlcmlvciB0byBzdG9wIGFmdGVyIHRoZSBmdW5jdGlvbiBjYWxsIGhhcyBjb21wbGV0ZWQuCisgICBjYWxsX2Z1bmN0aW9uX2J5X2hhbmQgKCkgc2V0cyBhIGJyZWFrcG9pbnQgaGVyZSAodmlhIENBTExfRFVNTVlfQlJFQUtfU0VUKSwKKyAgIHdoaWNoIFBPUF9GUkFNRSBsYXRlciBkZWxldGVzICh2aWEgQ0FMTF9EVU1NWV9CUkVBS19ERUxFVEUpLiAgKi8KKyAKKyNkZWZpbmUgQ0FMTF9EVU1NWV9TVE9QX09GRlNFVCAoNyAqIDQpCisgCisvKiBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBvZiB0aGUgQ0FMTF9EVU1NWSBjb2RlIGZyYWdtZW50CisgICByZWxhdGl2ZSB0byB0aGUgZnJhbWUgcG9pbnRlciBmb3IgYSBkdW1teSBmcmFtZS4gIFRoaXMgaXMgZXF1YWwgdG8KKyAgIHRoZSBzaXplIG9mIHRoZSBDQUxMX0RVTU1ZIHBsdXMgdGhlIGFyZ19zbG9wIGFyZWEgc2l6ZSAoc2VlIHRoZSBkaWFncmFtCisgICBpbiAidG0tMjlrLmgiKS4gICovCisvKiBQQUQgOiB0aGUgYXJnX3Nsb3AgYXJlYSBzaXplIGRvZXNuJ3QgYXBwZWFyIHRvIG1lIHRvIGJlIHVzZWZ1bCBzaW5jZSwgdGhlCisgICBjYWxsIGR1bW15IGNvZGUgbm8gbG9uZ2VyIG1vZGlmeSB0aGUgbXNwLiBTZWUgYmVsb3cuIFRoaXMgbXVzdCBiZSBjaGVja2VkLiAqLworCisjZGVmaW5lIENBTExfRFVNTVlfT0ZGU0VUX0lOX0ZSQU1FIChDQUxMX0RVTU1ZX0xFTkdUSCArIDE2ICogNCkKKworLyogSW5zZXJ0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGFyZ3MgYW5kIGZ1bmN0aW9uIGFkZHJlc3MKKyAgIGludG8gYSBDQUxMX0RVTU1ZIHNlcXVlbmNlIHN0b3JlZCBhdCBEVU1NWU5BTUUsIHJlcGxhY2UgdGhlIHRoaXJkCisgICBpbnN0cnVjdGlvbiAoYWRkIG1zcCwgbXNwLCAxNio0KSB3aXRoIGEgbm9wLCBhbmQgbGVhdmUgdGhlIGZpbmFsIG5vcC4KKyAgIFdlIGNhbid0IGtlZXAgdXNpbmcgYSBDQUxMX0RVTU1ZIHRoYXQgbW9kaWZ5IHRoZSBtc3Agc2luY2UsIGZvciBWeFdvcmtzLAorICAgQ0FMTF9EVU1NWSBpcyBzdG9yZWQgaW4gdGhlIE1lbW9yeSBTdGFjay4gQWRkaW5nIDE2IHdvcmRzIHRvIHRoZSBtc3AKKyAgIHdvdWxkIHRoZW4gbWFrZSBwb3NzaWJsZSBmb3IgdGhlIGluZmVyaW9yIHRvIG92ZXJ3cml0ZSB0aGUgQ0FMTF9EVU1NWSBjb2RlLAorICAgdGh1cyBjcmVhdGluZyBhIGxvdCBvZiB0cm91YmxlIHdoZW4gZXhpdGluZyB0aGUgaW5mZXJpb3IgdG8gY29tZSBiYWNrIGluCisgICBhIENBTExfRFVNTVkgY29kZSB0aGF0IG5vIGxvbmdlciBleGlzdHMuLi4gRnVydGhlcm1vcmUsIEVTRiBhcmUgYWxzbyBzdG9yZWQKKyAgIGZyb20gdGhlIG1zcCBpbiB0aGUgbWVtb3J5IHN0YWNrLiBJZiBtc3AgaXMgc2V0IGhpZ2hlciB0aGFuIHRoZSBkdW1teSBjb2RlLAorICAgYW4gRVNGIG1heSBjbG9iYmVyIHRoaXMgY29kZS4gKi8KKworI2lmIFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4KKyNkZWZpbmUgTk9QX0lOU1RSICAweDcwNDAwMTAxCisjZWxzZSAvKiBUYXJnZXQgaXMgbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBOT1BfSU5TVFIgIDB4MDEwMTQwNzAKKyNlbmRpZgorCisjdW5kZWYgRklYX0NBTExfRFVNTVkKKyNkZWZpbmUgRklYX0NBTExfRFVNTVkoZHVtbXluYW1lLCBwYywgZnVuLCBuYXJncywgYXJncywgdHlwZSwgZ2NjX3ApICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICooaW50ICopKChjaGFyICopZHVtbXluYW1lICsgOCkgPSBOT1BfSU5TVFI7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTVFVGRl9JMTYoKGNoYXIgKilkdW1teW5hbWUgKyBDT05TVF9JTlNOLCBmdW4pOyAgICAgICAgICAgICAgICAgICBcCisgICAgU1RVRkZfSTE2KChjaGFyICopZHVtbXluYW1lICsgQ09OU1RfSU5TTiArIDQsIGZ1biA+PiAxNik7ICAgICAgICAgXAorICB9CisKKy8qIEZvciBWeFdvcmtzLCBDQUxMX0RVTU1ZIG11c3QgYmUgc3RvcmVkIGluIHRoZSBzdGFjayBvZiB0aGUgdGFzayB0aGF0IGlzCisgICBiZWluZyBkZWJ1Z2dlZCBhbmQgZXhlY3V0ZWQgImluIHRoZSBjb250ZXh0IG9mIiB0aGlzIHRhc2sgKi8KKworI3VuZGVmIENBTExfRFVNTVlfTE9DQVRJT04KKyNkZWZpbmUgQ0FMTF9EVU1NWV9MT0NBVElPTiAgICAgT05fU1RBQ0sKKworLyogU2V0IG9yIGRlbGV0ZSBhIGJyZWFrcG9pbnQgYXQgdGhlIGxvY2F0aW9uIHdpdGhpbiBhIENBTExfRFVNTVkgY29kZQorICAgZnJhZ21lbnQgd2hlcmUgd2Ugd2FudCB0aGUgdGFyZ2V0IHByb2dyYW0gdG8gc3RvcCBhZnRlciB0aGUgZnVuY3Rpb24KKyAgIGNhbGwgaXMgY29tcGxldGUuICBDQUxMX0RVTU1ZX0FERFIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0CisgICBpbnN0cnVjdGlvbiBpbiB0aGUgQ0FMTF9EVU1NWS4gIERVTU1ZX0ZSQU1FX0FERFIgaXMgdGhlIHZhbHVlIG9mIHRoZQorICAgZnJhbWUgcG9pbnRlciBpbiB0aGUgZHVtbXkgZnJhbWUuCisKKyAgIE5PVEU6IGluIHRoZSBib3RoIG9mIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMsIHdlIHRha2UgYWR2YW50YWdlIG9mCisJIGtub3dsZWRnZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRhcmdldCBicmVha3BvaW50IG9wZXJhdGlvbiwKKwkgaW4gdGhhdCB3ZSBwYXNzIGEgbnVsbCBwb2ludGVyIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuICBJdCBzZWVtcworCSByZWFzb25hYmxlIHRvIGFzc3VtZSB0aGF0IGFueSB0YXJnZXQgcmVxdWlyaW5nIHRoZSB1c2Ugb2YgCisJIENBTExfRFVNTVlfQlJFQUtfe1NFVCxERUxFVEV9IHdpbGwgbm90IHN0b3JlIHRoZSBicmVha3BvaW50CisJIHNoYWRvdyBjb250ZW50cyBpbiBHREI7IGluIGFueSBjYXNlLCB0aGlzIGFzc3VtcHRpb24gaXMgdmFpbGQKKwkgZm9yIGFsbCBWeFdvcmtzLXJlbGF0ZWQgdGFyZ2V0cy4gICovCisKKyNkZWZpbmUgQ0FMTF9EVU1NWV9CUkVBS19TRVQoY2FsbF9kdW1teV9hZGRyKSBcCisgIHRhcmdldF9pbnNlcnRfYnJlYWtwb2ludCAoKGNhbGxfZHVtbXlfYWRkcikgKyBDQUxMX0RVTU1ZX1NUT1BfT0ZGU0VULCBcCisJCQkgICAgKGNoYXIgKikgMCkKKworI2RlZmluZSBDQUxMX0RVTU1ZX0JSRUFLX0RFTEVURShkdW1teV9mcmFtZV9hZGRyKSBcCisgIHRhcmdldF9yZW1vdmVfYnJlYWtwb2ludCAoKGR1bW15X2ZyYW1lX2FkZHIpIC0gKENBTExfRFVNTVlfT0ZGU0VUX0lOX0ZSQU1FIFwKKwkJCQkgICAgICAgICAgICAgICAgICAtIENBTExfRFVNTVlfU1RPUF9PRkZTRVQpLCBcCisJCQkgICAgKGNoYXIgKikgMCkKKworLyogUmV0dXJuIG5vbnplcm8gaWYgdGhlIHBjIGlzIGV4ZWN1dGluZyB3aXRoaW4gYSBDQUxMX0RVTU1ZIGZyYW1lLiAgKi8KKworI2RlZmluZSBQQ19JTl9DQUxMX0RVTU1ZKHBjLCBzcCwgZnJhbWVfYWRkcmVzcykgXAorICAoKHBjKSA+PSAoc3ApIFwKKyAgICAmJiAocGMpIDw9IChzcCkgKyBDQUxMX0RVTU1ZX09GRlNFVF9JTl9GUkFNRSArIENBTExfRFVNTVlfTEVOR1RIKQorCisvKiBEZWZpbmluZyB0aGlzIHByZXZlbnRzIHVzIGZyb20gdHJ5aW5nIHRvIHBhc3MgYSBzdHJ1Y3R1cmUtdmFsdWVkIGFyZ3VtZW50CisgICB0byBhIGZ1bmN0aW9uIGNhbGxlZCB2aWEgdGhlIENBTExfRFVNTVkgbWVjaGFuaXNtLiAgVGhpcyBpcyBub3QgaGFuZGxlZAorICAgcHJvcGVybHkgaW4gY2FsbF9mdW5jdGlvbl9ieV9oYW5kICgpLCBhbmQgdGhlIGZpeCBtaWdodCByZXF1aXJlIHJlLXdyaXRpbmcKKyAgIHRoZSBDQUxMX0RVTU1ZIGhhbmRsaW5nIGZvciBhbGwgdGFyZ2V0cyAoYXQgbGVhc3QsIGEgY2xlYW4gc29sdXRpb24KKyAgIHdvdWxkIHByb2JhYmx5IHJlcXVpcmUgdGhpcykuICBBcmd1YWJseSwgdGhpcyBzaG91bGQgZ28gaW4gInRtLTI5ay5oIgorICAgcmF0aGVyIHRoYW4gaGVyZS4gICovCisgICAKKyNkZWZpbmUgU1RSVUNUX1ZBTF9BUkdTX1VOU1VQUE9SVEVECisKKyNkZWZpbmUgQktQVF9PRkZTRVQJKDcgKiA0KQorI2RlZmluZSBCS1BUX0lOU1RSCTB4NzI1MDAxMDEKKworI3VuZGVmIEZJWF9DQUxMX0RVTU1ZCisjZGVmaW5lIEZJWF9DQUxMX0RVTU1ZKGR1bW15bmFtZSwgcGMsIGZ1biwgbmFyZ3MsIGFyZ3MsIHR5cGUsIGdjY19wKSAgIFwKKyAge1wKKyAgICBTVFVGRl9JMTYoKGNoYXIgKilkdW1teW5hbWUgKyBDT05TVF9JTlNOLCBmdW4pO1wKKyAgICBTVFVGRl9JMTYoKGNoYXIgKilkdW1teW5hbWUgKyBDT05TVF9JTlNOICsgNCwgZnVuID4+IDE2KTtcCisgICAgKihpbnQgKikoKGNoYXIgKilkdW1teW5hbWUgKyBCS1BUX09GRlNFVCkgPSBCS1BUX0lOU1RSO1wKKyAgfQorCisMCisvKiBPZmZzZXRzIGludG8gam1wX2J1Zi4gIFRoZXkgYXJlIGRlcml2ZWQgZnJvbSBWeFdvcmtzJyBSRUdfU0VUIHN0cnVjdAorICAgKHNlZSBWeFdvcmtzJyBzZXRqbXAuaCkuIE5vdGUgdGhhdCBTdW4yLCBTdW4zIGFuZCBTdW5PUzQgYW5kIFZ4V29ya3MgaGF2ZQorICAgZGlmZmVyZW50IFJFR19TRVQgc3RydWN0cywgaGVuY2UgZGlmZmVyZW50IGxheW91dHMgZm9yIHRoZSBqbXBfYnVmIHN0cnVjdC4KKyAgIE9ubHkgSkJfUEMgaXMgbmVlZGVkIGZvciBnZXR0aW5nIHRoZSBzYXZlZCBQQyB2YWx1ZS4gICovCisKKyNkZWZpbmUgSkJfRUxFTUVOVF9TSVpFIDQgICAgICAgLyogc2l6ZSBvZiBlYWNoIGVsZW1lbnQgaW4gam1wX2J1ZiAqLworI2RlZmluZSBKQl9QQwkJMwkvKiBvZmZzZXQgb2YgcGMgKHBjMSkgaW4gam1wX2J1ZiAqLworIAorLyogRmlndXJlIG91dCB3aGVyZSB0aGUgbG9uZ2ptcCB3aWxsIGxhbmQuICBXZSBleHBlY3QgdGhhdCB3ZSBoYXZlIGp1c3QgZW50ZXJlZAorICAgbG9uZ2ptcCBhbmQgaGF2ZW4ndCB5ZXQgc2V0dXAgdGhlIHN0YWNrIGZyYW1lLCBzbyB0aGUgYXJncyBhcmUgc3RpbGwgaW4gdGhlCisgICBvdXRwdXQgcmVncy4gIGxyMiAoTFIyX1JFR05VTSkgcG9pbnRzIGF0IHRoZSBqbXBfYnVmIHN0cnVjdHVyZSBmcm9tIHdoaWNoIHdlCisgICBleHRyYWN0IHRoZSBwYyAoSkJfUEMpIHRoYXQgd2Ugd2lsbCBsYW5kIGF0LiAgVGhlIHBjIGlzIGNvcGllZCBpbnRvIEFERFIuCisgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MgKi8KKworI2RlZmluZSBHRVRfTE9OR0pNUF9UQVJHRVQoQUREUikgZ2V0X2xvbmdqbXBfdGFyZ2V0KEFERFIpCitleHRlcm4gaW50IGdldF9sb25nam1wX3RhcmdldCBQQVJBTVMgKChDT1JFX0FERFIgKikpOworCisvKiBWeFdvcmtzIGFkanVzdHMgdGhlIFBDIGFmdGVyIGEgYnJlYWtwb2ludCBoYXMgYmVlbiBoaXQuICAqLworIAorI3VuZGVmIERFQ1JfUENfQUZURVJfQlJFQUsKKyNkZWZpbmUgREVDUl9QQ19BRlRFUl9CUkVBSyAwCisKKy8qIERvIHdoYXRldmVyIHByb21vdGlvbnMgYXJlIGFwcHJvcHJpYXRlIG9uIGEgdmFsdWUgYmVpbmcgcmV0dXJuZWQKKyAgIGZyb20gYSBmdW5jdGlvbi4gIFZBTCBpcyB0aGUgdXNlci1zdXBwbGllZCB2YWx1ZSwgYW5kIEZVTkNfVFlQRQorICAgaXMgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbiBpZiBrbm93biwgZWxzZSAwLgorIAorICAgRm9yIHRoZSBBbTI5aywgYXMgZmFyIGFzIEkgdW5kZXJzdGFuZCwgaWYgdGhlIGZ1bmN0aW9uIHJldHVybiB0eXBlIGlzIGtub3duLAorICAgY2FzdCB0aGUgdmFsdWUgdG8gdGhhdCB0eXBlOyBvdGhlcndpc2UsIGVuc3VyZSB0aGF0IGludGVnZXIgcmV0dXJuIHZhbHVlcworICAgZmlsbCBhbGwgb2YgZ3I5Ni4KKworICAgVGhpcyBkZWZpbml0aW9uIHJlYWxseSBiZWxvbmdzIGluICJ0bS0yOWsuaCIsIHNpbmNlIGl0IGFwcGxpZXMKKyAgIHRvIG1vc3QgQW0yOUstYmFzZWQgc3lzdGVtczsgYnV0IG9uY2UgbW92ZWQgaW50byB0aGF0IGZpbGUsIGl0IG1pZ2h0CisgICBuZWVkIHRvIGJlIHJlZGVmaW5lZCBmb3IgYWxsIEFtMjlLLWJhc2VkIHRhcmdldHMgdGhhdCBhbHNvIHJlZGVmaW5lCisgICBTVE9SRV9SRVRVUk5fVkFMVUUuICBGb3Igbm93LCB0byBiZSBzYWZlLCB3ZSBkZWZpbmUgaXQgaGVyZS4gICovCisgCisjZGVmaW5lIFBST01PVEVfUkVUVVJOX1ZBTFVFKHZhbCwgZnVuY190eXBlKSBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoZnVuY190eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZhbCA9IHZhbHVlX2Nhc3QgKGZ1bmNfdHlwZSwgdmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoKFRZUEVfQ09ERSAoVkFMVUVfVFlQRSAodmFsKSkgPT0gVFlQRV9DT0RFX0lOVCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHx8IFRZUEVfQ09ERSAoVkFMVUVfVFlQRSAodmFsKSkgPT0gVFlQRV9DT0RFX0VOVU0pICAgICAgICAgICBcCisgICAgICAgICAgJiYgVFlQRV9MRU5HVEggKFZBTFVFX1RZUEUgKHZhbCkpIDwgUkVHSVNURVJfUkFXX1NJWkUgKDApKSAgICBcCisgICAgICAgIHZhbCA9IHZhbHVlX2Nhc3QgKGJ1aWx0aW5fdHlwZV9pbnQsIHZhbCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKK2V4dGVybiBpbnQgdngyOWtfZnJhbWVfY2hhaW5fdmFsaWQgUEFSQU1TICgoQ09SRV9BRERSLCBzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisjZGVmaW5lIEZSQU1FX0NIQUlOX1ZBTElEKGNoYWluLCB0aGlzZnJhbWUpIHZ4MjlrX2ZyYW1lX2NoYWluX3ZhbGlkIChjaGFpbiwgdGhpc2ZyYW1lKQorCitleHRlcm4gQ09SRV9BRERSIGZyYW1lX3NhdmVkX2NhbGxfc2l0ZSAoKTsKKworI3VuZGVmIFBSRVBBUkVfVE9fSU5JVF9GUkFNRV9JTkZPCisjZGVmaW5lIFBSRVBBUkVfVE9fSU5JVF9GUkFNRV9JTkZPKGZjaSkJZG8gewkJCQkgICAgICBcCisgIGxvbmcgY3VycmVudF9tc3AgPSByZWFkX3JlZ2lzdGVyIChNU1BfUkVHTlVNKTsJCQkgICAgICBcCisgIGlmIChQQ19JTl9DQUxMX0RVTU1ZIChmY2ktPnBjLCBjdXJyZW50X21zcCwgMCkpCQkJICAgICAgXAorICAgIHsJCQkJCQkJCQkgICAgICBcCisgICAgICBmY2ktPnJzaXplID0gRFVNTVlfRlJBTUVfUlNJWkU7CQkJCQkgICAgICBcCisgICAgICBmY2ktPm1zaXplID0gMDsJCQkJCQkJICAgICAgXAorICAgICAgZmNpLT5zYXZlZF9tc3AgPQkgCQkJCQkJICAgICAgXAorCXJlYWRfcmVnaXN0ZXJfc3RhY2tfaW50ZWdlciAoZmNpLT5mcmFtZSArIERVTU1ZX0ZSQU1FX1JTSVpFIC0gNCwgNCk7ICBcCisgICAgICBmY2ktPmZsYWdzIHw9IChUUkFOU1BBUkVOVHxNRlBfVVNFRCk7CQkJCSAgICAgIFwKKyAgICAgIHJldHVybjsJCQkJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hMjlrL3VsdHJhMy5taCBiL2dkYi9jb25maWcvYTI5ay91bHRyYTMubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYyMTFjNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvYTI5ay91bHRyYTMubWgKQEAgLTAsMCArMSwxMyBAQAorIyBIb3N0OiBOWVUgVWx0cmFjb21wdXRlciAoQU1EIDI5MDAwIHJ1bm5pbmcgVW5peCkKKworQ0M9dTNjYworCitYTV9GSUxFPSB4bS11bHRyYTMuaAorWERFUEZJTEVTPSB1bHRyYTMteGRlcC5vIAorCitNSF9DRkxBR1MgPSAtRFNZTTEKK1hNX0NMSUJTID0gLWxzeXN2IC1sam9icyAtbHRlcm1saWIgCisKK05BVF9GSUxFPSBubS11bHRyYTMuaAorTkFUREVQRklMRVM9IGluZnB0cmFjZS5vIGluZnRhcmcubyBmb3JrLWNoaWxkLm8gdWx0cmEzLW5hdC5vCisKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvYTI5ay91bHRyYTMubXQgYi9nZGIvY29uZmlnL2EyOWsvdWx0cmEzLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNWZkMmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2EyOWsvdWx0cmEzLm10CkBAIC0wLDAgKzEsNiBAQAorIyBUYXJnZXQ6IEFNRCAyOTAwMCBydW5uaW5nIFVuaXggb24gTmV3IFlvcmsgVW5pdmVyc2l0eSBwcm9jZXNzb3IgYm9hcmQKK1RERVBGSUxFUz0gYTI5ay10ZGVwLm8KK1RNX0ZJTEU9IHRtLXVsdHJhMy5oCisKKyMgU1lNMSBpcyBzb21lIE9TIHRoZXkgaGF2ZS4KK01UX0NGTEFHUyA9IC1EU1lNMQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hMjlrL3Z4MjlrLm10IGIvZ2RiL2NvbmZpZy9hMjlrL3Z4MjlrLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNmY1Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2EyOWsvdngyOWsubXQKQEAgLTAsMCArMSw0IEBACisjIFRhcmdldDogQU1EIDI5ayBydW5uaW5nIFZ4V29ya3MKK1RERVBGSUxFUz0gYTI5ay10ZGVwLm8gcmVtb3RlLXZ4Lm8gcmVtb3RlLXZ4MjlrLm8geGRyX2xkLm8geGRyX3B0cmFjZS5vIHhkcl9yZGIubyAKK1RNX0ZJTEU9IHRtLXZ4MjlrLmgKK01UX0NGTEFHUyA9IC1ETk9fSElGX1NVUFBPUlQKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvYTI5ay94bS11bHRyYTMuaCBiL2dkYi9jb25maWcvYTI5ay94bS11bHRyYTMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzBiMTA4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9hMjlrL3htLXVsdHJhMy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIEhvc3QgZGVmaW5pdGlvbnMgZm9yIEdEQiBydW5uaW5nIG9uIGFuIGEyOWsgTllVIFVsdHJhY29tcHV0ZXIKKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIFdvb2QgKHdvb2RAbGFiLnVsdHJhLm55dS5lZHUpLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEhlcmUgYXQgTllVIHdlIGhhdmUgd2hhdCB3ZSBjYWxsIGFuIFVMVFJBMyBQRSBib2FyZC4gIFNvCisgICBpZmRlZnMgZm9yIFVMVFJBMyBhcmUgbXkgZG9pbmcuICBBdCB0aGlzIHBvaW50IGluIHRpbWUsCisgICBJIGRvbid0IGtub3cgb2YgYW55IG90aGVyIFVuaXhpIHJ1bm5pbmcgb24gdGhlIGEyOWsuICAqLworCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBCSUdfRU5ESUFOCisKKyNkZWZpbmUgSEFWRV9XQUlUX1NUUlVDVAorCisjaWZuZGVmIExfU0VUCisjIGRlZmluZSBMX1NFVCAgIDAgLyogc2V0IHRoZSBzZWVrIHBvaW50ZXIgKi8KKyMgZGVmaW5lIExfSU5DUiAgMSAvKiBpbmNyZW1lbnQgdGhlIHNlZWsgcG9pbnRlciAqLworIyBkZWZpbmUgTF9YVE5EICAyIC8qIGV4dGVuZCB0aGUgZmlsZSBzaXplICovCisjZW5kaWYKKworI2lmbmRlZiBPX1JET05MWQorIyBkZWZpbmUgT19SRE9OTFkgMAorIyBkZWZpbmUgT19XUk9OTFkgMQorIyBkZWZpbmUgT19SRFdSCSAgMgorI2VuZGlmCisKKyNpZm5kZWYgRl9PSworIyBkZWZpbmUgUl9PSyA0CisjIGRlZmluZSBXX09LIDIKKyMgZGVmaW5lIFhfT0sgMQorIyBkZWZpbmUgRl9PSyAwCisjZW5kaWYKKworLyogU3lzdGVtIGRvZXNuJ3QgcHJvdmlkZSBzaWdpbnRlcnJ1cHQoKS4gICovCisjZGVmaW5lCU5PX1NJR0lOVEVSUlVQVAorCisvKiBTeXN0ZW0gdXNlcyBhIGBzaG9ydCcgdG8gaG9sZCBhIHByb2Nlc3MgZ3JvdXAgSUQuICAqLworI2RlZmluZQlTSE9SVF9QR1JQCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2FscGhhL2FscGhhLWxpbnV4Lm1oIGIvZ2RiL2NvbmZpZy9hbHBoYS9hbHBoYS1saW51eC5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTRhMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9hbHBoYS9hbHBoYS1saW51eC5taApAQCAtMCwwICsxLDkgQEAKKyMgSG9zdDogTGl0dGxlLWVuZGlhbiBBbHBoYSBydW5uaW5nIExpbnV4CitYREVQRklMRVM9IHNlci10Y3AubworWE1fRklMRT0geG0tYWxwaGFsaW51eC5oCitOQVRfRklMRT0gbm0tbGludXguaAorTkFUREVQRklMRVM9IGluZnB0cmFjZS5vIGluZnRhcmcubyBjb3JlbG93Lm8gY29yZS1yZWdzZXQubyBhbHBoYS1uYXQubyBcCisJZm9yay1jaGlsZC5vIHNvbGliLm8KKworTU1BTExPQyA9IAorTU1BTExPQ19DRkxBR1MgPSAtRE5PX01NQUxMT0MgCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2FscGhhL2FscGhhLWxpbnV4Lm10IGIvZ2RiL2NvbmZpZy9hbHBoYS9hbHBoYS1saW51eC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzg5MjUyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9hbHBoYS9hbHBoYS1saW51eC5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBMaXR0bGUtZW5kaWFuIEFscGhhCitUREVQRklMRVM9IGFscGhhLXRkZXAubworVE1fRklMRT0gdG0tYWxwaGFsaW51eC5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2FscGhhL2FscGhhLW9zZjEubWggYi9nZGIvY29uZmlnL2FscGhhL2FscGhhLW9zZjEubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkMGY5NQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvYWxwaGEvYWxwaGEtb3NmMS5taApAQCAtMCwwICsxLDUgQEAKKyMgSG9zdDogTGl0dGxlLWVuZGlhbiBBbHBoYSBydW5uaW5nIE9TRi8xLTEueAorWERFUEZJTEVTPSAKK1hNX0ZJTEU9IHhtLWFscGhhb3NmLmgKK05BVF9GSUxFPSBubS1vc2YuaAorTkFUREVQRklMRVM9IGluZnB0cmFjZS5vIGluZnRhcmcubyBjb3JlbG93Lm8gYWxwaGEtbmF0Lm8gZm9yay1jaGlsZC5vIG9zZnNvbGliLm8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvYWxwaGEvYWxwaGEtb3NmMS5tdCBiL2dkYi9jb25maWcvYWxwaGEvYWxwaGEtb3NmMS5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGY4N2MxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9hbHBoYS9hbHBoYS1vc2YxLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IExpdHRsZS1lbmRpYW4gQWxwaGEKK1RERVBGSUxFUz0gYWxwaGEtdGRlcC5vCitUTV9GSUxFPSB0bS1hbHBoYS5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2FscGhhL2FscGhhLW9zZjIubWggYi9nZGIvY29uZmlnL2FscGhhL2FscGhhLW9zZjIubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5YjZmZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvYWxwaGEvYWxwaGEtb3NmMi5taApAQCAtMCwwICsxLDUgQEAKKyMgSG9zdDogTGl0dGxlLWVuZGlhbiBBbHBoYSBydW5uaW5nIE9TRi8xLTIueCB1c2luZyBwcm9jZnMKK1hERVBGSUxFUz0gCitYTV9GSUxFPSB4bS1hbHBoYW9zZi5oCitOQVRfRklMRT0gbm0tb3NmMi5oCitOQVRERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGNvcmVsb3cubyBhbHBoYS1uYXQubyBmb3JrLWNoaWxkLm8gb3Nmc29saWIubyBwcm9jZnMubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hbHBoYS9hbHBoYS1vc2YzLm1oIGIvZ2RiL2NvbmZpZy9hbHBoYS9hbHBoYS1vc2YzLm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OTc1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2FscGhhL2FscGhhLW9zZjMubWgKQEAgLTAsMCArMSw1IEBACisjIEhvc3Q6IExpdHRsZS1lbmRpYW4gQWxwaGEgcnVubmluZyBPU0YvMS0zLnggYW5kIGhpZ2hlciB1c2luZyBwcm9jZnMKK1hERVBGSUxFUz0gCitYTV9GSUxFPSB4bS1hbHBoYW9zZi5oCitOQVRfRklMRT0gbm0tb3NmMy5oCitOQVRERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGNvcmVsb3cubyBhbHBoYS1uYXQubyBmb3JrLWNoaWxkLm8gb3Nmc29saWIubyBwcm9jZnMubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hbHBoYS9ubS1saW51eC5oIGIvZ2RiL2NvbmZpZy9hbHBoYS9ubS1saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZGIxYTkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2FscGhhL25tLWxpbnV4LmgKQEAgLTAsMCArMSw2NiBAQAorLyogTmF0aXZlIGRlZmluaXRpb25zIGZvciBhbHBoYSBydW5uaW5nIExpbnV4LgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLworCisvKiBGaWd1cmUgb3V0IHdoZXJlIHRoZSBsb25nam1wIHdpbGwgbGFuZC4gIFdlIGV4cGVjdCB0aGF0IHdlIGhhdmUganVzdCBlbnRlcmVkCisgICBsb25nam1wIGFuZCBoYXZlbid0IHlldCBzZXR1cCB0aGUgc3RhY2sgZnJhbWUsIHNvIHRoZSBhcmdzIGFyZSBzdGlsbCBpbiB0aGUKKyAgIGFyZ3VtZW50IHJlZ3MuICBBMF9SRUdOVU0gcG9pbnRzIGF0IHRoZSBqbXBfYnVmIHN0cnVjdHVyZSBmcm9tIHdoaWNoIHdlCisgICBleHRyYWN0IHRoZSBwYyAoSkJfUEMpIHRoYXQgd2Ugd2lsbCBsYW5kIGF0LiAgVGhlIHBjIGlzIGNvcGllZCBpbnRvIEFERFIuCisgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MgKi8KKworI2RlZmluZSBHRVRfTE9OR0pNUF9UQVJHRVQoQUREUikgZ2V0X2xvbmdqbXBfdGFyZ2V0KEFERFIpCitleHRlcm4gaW50CitnZXRfbG9uZ2ptcF90YXJnZXQgUEFSQU1TICgoQ09SRV9BRERSICopKTsKKworLyogVGVsbCBnZGIgdGhhdCB3ZSBjYW4gYXR0YWNoIGFuZCBkZXRhY2ggb3RoZXIgcHJvY2Vzc2VzICovCisjZGVmaW5lIEFUVEFDSF9ERVRBQ0gKKworLyogcHRyYWNlIHJlZ2lzdGVyIGBgYWRkcmVzc2VzJycgYXJlIGFic29sdXRlLiAgKi8KKworI2RlZmluZSBVX1JFR1NfT0ZGU0VUIDAKKworI2RlZmluZSBQVFJBQ0VfQVJHM19UWVBFIGxvbmcKKworLyogcHRyYWNlIHRyYW5zZmVycyBsb25ncywgdGhlIHB0cmFjZSBtYW4gcGFnZSBpcyBseWluZy4gICovCisKKyNkZWZpbmUgUFRSQUNFX1hGRVJfVFlQRSBsb25nCisKKy8qIFRoZSBhbHBoYSBkb2VzIG5vdCBzdGVwIG92ZXIgYSBicmVha3BvaW50LCB0aGUgbWFucGFnZSBpcyBseWluZyBhZ2Fpbi4gICovCisKKyNkZWZpbmUgQ0FOTk9UX1NURVBfQlJFQUtQT0lOVAorCisvKiBMaW51eCBoYXMgc2hhcmVkIGxpYnJhcmllcy4gICovCisKKyNkZWZpbmUgR0RCX1RBUkdFVF9IQVNfU0hBUkVEX0xJQlMKKworLyogU3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcy4gICovCisKKyNpbmNsdWRlICJzb2xpYi5oIgorCisjaWZkZWYgX19FTEZfXworI2RlZmluZSBTVlI0X1NIQVJFRF9MSUJTCisjZGVmaW5lIFRBUkdFVF9FTEY2NAorI2VuZGlmCisKKy8qIFRoaXMgaXMgYSBsaWUuICBJdCdzIGFjdHVhbGx5IGluIHN0ZGlvLmguICovCisKKyNkZWZpbmUgUFNJR05BTF9JTl9TSUdOQUxfSAorCisvKiBHaXZlbiBhIHBvaW50ZXIgdG8gZWl0aGVyIGEgZ3JlZ3NldF90IG9yIGZwcmVnc2V0X3QsIHJldHVybiBhCisgICBwb2ludGVyIHRvIHRoZSBmaXJzdCByZWdpc3Rlci4gICovCisjZGVmaW5lIEFMUEhBX1JFR1NFVF9CQVNFKHJlZ3NldHApICAoKGxvbmcgKikgKHJlZ3NldHApKQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hbHBoYS9ubS1vc2YuaCBiL2dkYi9jb25maWcvYWxwaGEvbm0tb3NmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2MTQwZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvYWxwaGEvbm0tb3NmLmgKQEAgLTAsMCArMSw1NiBAQAorLyogTmF0aXZlIGRlZmluaXRpb25zIGZvciBhbHBoYSBydW5uaW5nIE9TRi8xLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIGxvbmdqbXAgd2lsbCBsYW5kLiAgV2UgZXhwZWN0IHRoYXQgd2UgaGF2ZSBqdXN0IGVudGVyZWQKKyAgIGxvbmdqbXAgYW5kIGhhdmVuJ3QgeWV0IHNldHVwIHRoZSBzdGFjayBmcmFtZSwgc28gdGhlIGFyZ3MgYXJlIHN0aWxsIGluIHRoZQorICAgYXJndW1lbnQgcmVncy4gIEEwX1JFR05VTSBwb2ludHMgYXQgdGhlIGptcF9idWYgc3RydWN0dXJlIGZyb20gd2hpY2ggd2UKKyAgIGV4dHJhY3QgdGhlIHBjIChKQl9QQykgdGhhdCB3ZSB3aWxsIGxhbmQgYXQuICBUaGUgcGMgaXMgY29waWVkIGludG8gQUREUi4KKyAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRydWUgb24gc3VjY2VzcyAqLworCisjZGVmaW5lIEdFVF9MT05HSk1QX1RBUkdFVChBRERSKSBnZXRfbG9uZ2ptcF90YXJnZXQoQUREUikKK2V4dGVybiBpbnQKK2dldF9sb25nam1wX3RhcmdldCBQQVJBTVMgKChDT1JFX0FERFIgKikpOworCisvKiBwdHJhY2UgcmVnaXN0ZXIgYGBhZGRyZXNzZXMnJyBhcmUgYWJzb2x1dGUuICAqLworCisjZGVmaW5lIFVfUkVHU19PRkZTRVQgMAorCisvKiBGSVhNRTogU2hvdWxkbid0IHRoZSBkZWZhdWx0IGRlZmluaXRpb24gaW4gaW5mZXJpb3IuaCBiZSBpbnQqID8gKi8KKworI2RlZmluZSBQVFJBQ0VfQVJHM19UWVBFIGludCoKKworLyogcHRyYWNlIHRyYW5zZmVycyBsb25ncywgdGhlIHB0cmFjZSBtYW4gcGFnZSBpcyBseWluZy4gICovCisKKyNkZWZpbmUgUFRSQUNFX1hGRVJfVFlQRSBsb25nCisKKy8qIFRoZSBhbHBoYSBkb2VzIG5vdCBzdGVwIG92ZXIgYSBicmVha3BvaW50LCB0aGUgbWFucGFnZSBpcyBseWluZyBhZ2Fpbi4gICovCisKKyNkZWZpbmUgQ0FOTk9UX1NURVBfQlJFQUtQT0lOVAorCisvKiBPU0YvMSBoYXMgc2hhcmVkIGxpYnJhcmllcy4gICovCisKKyNkZWZpbmUgR0RCX1RBUkdFVF9IQVNfU0hBUkVEX0xJQlMKKworLyogU3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcy4gICovCisKKyNpbmNsdWRlICJzb2xpYi5oIgorCisvKiBHaXZlbiBhIHBvaW50ZXIgdG8gZWl0aGVyIGEgZ3JlZ3NldF90IG9yIGZwcmVnc2V0X3QsIHJldHVybiBhCisgICBwb2ludGVyIHRvIHRoZSBmaXJzdCByZWdpc3Rlci4gICovCisjZGVmaW5lIEFMUEhBX1JFR1NFVF9CQVNFKHJlZ3NldHApICAgICAoKHJlZ3NldHApLT5yZWdzKQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hbHBoYS9ubS1vc2YyLmggYi9nZGIvY29uZmlnL2FscGhhL25tLW9zZjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTcyNWVmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9hbHBoYS9ubS1vc2YyLmgKQEAgLTAsMCArMSw1NCBAQAorLyogTmF0aXZlIGRlZmluaXRpb25zIGZvciBhbHBoYSBydW5uaW5nIE9TRi8xLTIueCwgdXNpbmcgcHJvY2ZzLgorICAgQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEdldCBnZW5lcmljIE9TRi8xIGRlZmluaXRpb25zLiAgKi8KKyNpbmNsdWRlICJhbHBoYS9ubS1vc2YuaCIKKworLyogT1NGLzEtMi54IGhhcyBvcHRpb25hbCAvcHJvYyBzdXBwb3J0LCB0cnkgdG8gdXNlIGl0IGluc3RlYWQgb2YgcHRyYWNlLiAgKi8KKyNkZWZpbmUgVVNFX1BST0NfRlMKKyNkZWZpbmUgSEFWRV9PUFRJT05BTF9QUk9DX0ZTCisKKy8qIE9TRi8xIGRvZXNuJ3QgcHJvdmlkZSB0aGUgc3RhbmRhcmQgZmF1bHQgZGVmaW5pdGlvbnMsIHNvIGRvbid0IHVzZSB0aGVtLiAgKi8KKyNkZWZpbmUgRkFVTFRFRF9VU0VfU0lHSU5GTworCisvKiBEb24ndCB0cmFjZSBmYXVsdHMgdW5kZXIgT1NGLzEsIHJlbHkgb24gdGhlIHBvc3Rpbmcgb2YgdGhlIGFwcHJvcHJpYXRlCisgICBzaWduYWwgaWYgZmF1bHQgdHJhY2luZyBpcyBkaXNhYmxlZC4KKyAgIFRyYWNpbmcgVF9JRkFVTFQgdW5kZXIgQWxwaGEgT1NGLzEgY2F1c2VzIGEgYGZsb2F0aW5nIHBvaW50IGVuYWJsZScKKyAgIGZhdWx0IGZyb20gd2hpY2ggd2UgY2Fubm90IGNvbnRpbnVlIChleGNlcHQgYnkgZGlzYWJsaW5nIHRoZQorICAgdHJhY2luZykuCisgICBBbmQgYXMgT1NGLzEgZG9lc24ndCBwcm92aWRlIHRoZSBzdGFuZGFyZCBmYXVsdCBkZWZpbml0aW9ucywgdGhlCisgICBtYXBwaW5nIG9mIGZhdWx0cyB0byBhcHByb3ByaWF0ZSBzaWduYWxzIGluIHByb2Nmc193YWl0IGlzIGRpZmZpY3VsdC4gICovCisjZGVmaW5lIFBST0NGU19ET05UX1RSQUNFX0ZBVUxUUworCisvKiBXb3JrIGFyb3VuZCBzb21lIHBlY3VsaWFyaXRpZXMgaW4gdGhlIE9TRi8xIHByb2NmcyBpbXBsZW1lbnRhdGlvbi4gICovCisjZGVmaW5lIFBST0NGU19TSUdQRU5EX09GRlNFVAorI2RlZmluZSBQUk9DRlNfTkVFRF9QSU9DU1NJR19GT1JfS0lMTAorI2RlZmluZSBQUk9DRlNfRE9OVF9QSU9DU1NJR19DVVJTSUcKKworLyogUmV0dXJuIHNpemVvZiB1c2VyIHN0cnVjdCB0byBjYWxsZXJzIGluIGxlc3MgbWFjaGluZSBkZXBlbmRlbnQgcm91dGluZXMgKi8KKworI2RlZmluZSBLRVJORUxfVV9TSVpFIGtlcm5lbF91X3NpemUoKQorZXh0ZXJuIGludCBrZXJuZWxfdV9zaXplIFBBUkFNUyAoKHZvaWQpKTsKKworLyogcG9sbCgpIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIHByb3Blcmx5IGZvciAvcHJvYyBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIE9TLgorICAgSWYgd2Ugb25seSBzcGVjaWZ5IFBPTExQUkksIHRoaW5ncyBoYW5nLiAgSXQgc2VlbXMgdG8gZ2V0IGJldHRlciB3aGVuIHdlIHNldAorICAgUE9MTE9VVCwgYnV0IHRoYXQgYWx3YXlzIHJldHVybnMgUE9MTE5WQUwhISEgIEFsc28sIFBPTExPVVQgY2F1c2VzIHByb2JsZW1zCisgICBvbiBvdGhlciBPU2VzLiAgKi8KKworI2RlZmluZSBMT1NJTkdfUE9MTApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hbHBoYS9ubS1vc2YzLmggYi9nZGIvY29uZmlnL2FscGhhL25tLW9zZjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTg3MWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9hbHBoYS9ubS1vc2YzLmgKQEAgLTAsMCArMSwyNiBAQAorLyogTmF0aXZlIGRlZmluaXRpb25zIGZvciBhbHBoYSBydW5uaW5nIE9TRi8xLTMueCBhbmQgaGlnaGVyLCB1c2luZyBwcm9jZnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogT1NGLzEtMy54IGZpeGVzIHNvbWUgT1NGLzEtMi54IHByb2NmcyBwZWN1bGlhcml0aWVzIGFuZCBhZGRzCisgICBhIG5ldyBvbmUuICAqLworI2luY2x1ZGUgImFscGhhL25tLW9zZjIuaCIKKworI3VuZGVmIFBST0NGU19ORUVEX1BJT0NTU0lHX0ZPUl9LSUxMCisjdW5kZWYgUFJPQ0ZTX0RPTlRfUElPQ1NTSUdfQ1VSU0lHCisjZGVmaW5lIFBST0NGU19ORUVEX0NMRUFSX0NVUlNJR19GT1JfS0lMTApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hbHBoYS90bS1hbHBoYS5oIGIvZ2RiL2NvbmZpZy9hbHBoYS90bS1hbHBoYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5Yjk4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2FscGhhL3RtLWFscGhhLmgKQEAgLTAsMCArMSw0NzkgQEAKKy8qIERlZmluaXRpb25zIHRvIG1ha2UgR0RCIHJ1biBvbiBhbiBBbHBoYSBib3ggdW5kZXIgT1NGMS4gIFRoaXMgaXMKKyAgIGFsc28gdXNlZCBieSB0aGUgQWxwaGEvTmV0d2FyZSBhbmQgQWxwaGEvTGludXggdGFyZ2V0cy4KKyAgIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgVE1fQUxQSEFfSAorI2RlZmluZSBUTV9BTFBIQV9ICisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJjb2ZmL3N5bS5oIgkJLyogTmVlZGVkIGZvciBQRFIgYmVsb3cuICAqLworI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKKworI2lmZGVmIF9fU1REQ19fCitzdHJ1Y3QgZnJhbWVfaW5mbzsKK3N0cnVjdCB0eXBlOworc3RydWN0IHZhbHVlOworc3RydWN0IHN5bWJvbDsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKFRBUkdFVF9CWVRFX09SREVSKQorI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisjZW5kaWYKKworLyogUmVkZWZpbmUgc29tZSB0YXJnZXQgYml0IHNpemVzIGZyb20gdGhlIGRlZmF1bHQuICAqLworCisjZGVmaW5lIFRBUkdFVF9MT05HX0JJVCA2NAorI2RlZmluZSBUQVJHRVRfTE9OR19MT05HX0JJVCA2NAorI2RlZmluZSBUQVJHRVRfUFRSX0JJVCA2NAorCisvKiBGbG9hdGluZyBwb2ludCBpcyBJRUVFIGNvbXBsaWFudCAqLworI2RlZmluZSBJRUVFX0ZMT0FUCisKKy8qIE51bWJlciBvZiB0cmFwcyB0aGF0IGhhcHBlbiBiZXR3ZWVuIGV4ZWMnaW5nIHRoZSBzaGVsbCAKKyAqIHRvIHJ1biBhbiBpbmZlcmlvciwgYW5kIHdoZW4gd2UgZmluYWxseSBnZXQgdG8gCisgKiB0aGUgaW5mZXJpb3IgY29kZS4gIFRoaXMgaXMgMiBvbiBtb3N0IGltcGxlbWVudGF0aW9ucy4KKyAqLworI2RlZmluZSBTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCAzCisKKy8qIE9mZnNldCBmcm9tIGFkZHJlc3Mgb2YgZnVuY3Rpb24gdG8gc3RhcnQgb2YgaXRzIGNvZGUuCisgICBaZXJvIG9uIG1vc3QgbWFjaGluZXMuICAqLworCisjZGVmaW5lIEZVTkNUSU9OX1NUQVJUX09GRlNFVCAwCisKKy8qIEFkdmFuY2UgUEMgYWNyb3NzIGFueSBmdW5jdGlvbiBlbnRyeSBwcm9sb2d1ZSBpbnN0cnVjdGlvbnMKKyAgIHRvIHJlYWNoIHNvbWUgInJlYWwiIGNvZGUuICAqLworCisjZGVmaW5lIFNLSVBfUFJPTE9HVUUocGMpCXBjID0gYWxwaGFfc2tpcF9wcm9sb2d1ZShwYywgMCkKK2V4dGVybiBDT1JFX0FERFIgYWxwaGFfc2tpcF9wcm9sb2d1ZSBQQVJBTVMgKChDT1JFX0FERFIgYWRkciwgaW50IGxlbmllbnQpKTsKKworLyogSW1tZWRpYXRlbHkgYWZ0ZXIgYSBmdW5jdGlvbiBjYWxsLCByZXR1cm4gdGhlIHNhdmVkIHBjLgorICAgQ2FuJ3QgYWx3YXlzIGdvIHRocm91Z2ggdGhlIGZyYW1lcyBmb3IgdGhpcyBiZWNhdXNlIG9uIHNvbWUgbWFjaGluZXMKKyAgIHRoZSBuZXcgZnJhbWUgaXMgbm90IHNldCB1cCB1bnRpbCB0aGUgbmV3IGZ1bmN0aW9uIGV4ZWN1dGVzCisgICBzb21lIGluc3RydWN0aW9ucy4gICovCisKKyNkZWZpbmUgU0FWRURfUENfQUZURVJfQ0FMTChmcmFtZSkJYWxwaGFfc2F2ZWRfcGNfYWZ0ZXJfY2FsbChmcmFtZSkKK2V4dGVybiBDT1JFX0FERFIKK2FscGhhX3NhdmVkX3BjX2FmdGVyX2NhbGwgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworCisvKiBBcmUgd2UgY3VycmVudGx5IGhhbmRsaW5nIGEgc2lnbmFsID8gICovCisKKyNkZWZpbmUgSU5fU0lHVFJBTVAocGMsIG5hbWUpCSgobmFtZSkgJiYgU1RSRVEgKCJfX3NpZ3RyYW1wIiwgKG5hbWUpKSkKKworLyogU3RhY2sgZ3Jvd3MgZG93bndhcmQuICAqLworCisjZGVmaW5lIElOTkVSX1RIQU4obGhzLHJocykgKChsaHMpIDwgKHJocykpCisKKyNkZWZpbmUgQlJFQUtQT0lOVCB7MHg4MCwgMCwgMCwgMH0gLyogY2FsbF9wYWwgYnB0ICovCisKKy8qIEFtb3VudCBQQyBtdXN0IGJlIGRlY3JlbWVudGVkIGJ5IGFmdGVyIGEgYnJlYWtwb2ludC4KKyAgIFRoaXMgaXMgb2Z0ZW4gdGhlIG51bWJlciBvZiBieXRlcyBpbiBCUkVBS1BPSU5UCisgICBidXQgbm90IGFsd2F5cy4gICovCisKKyNpZm5kZWYgREVDUl9QQ19BRlRFUl9CUkVBSworI2RlZmluZSBERUNSX1BDX0FGVEVSX0JSRUFLIDQKKyNlbmRpZgorCisvKiBTYXkgaG93IGxvbmcgKG9yZGluYXJ5KSByZWdpc3RlcnMgYXJlLiAgVGhpcyBpcyBhIHBpZWNlIG9mIGJvZ29zaXR5CisgICB1c2VkIGluIHB1c2hfd29yZCBhbmQgYSBmZXcgb3RoZXIgcGxhY2VzOyBSRUdJU1RFUl9SQVdfU0laRSBpcyB0aGUKKyAgIHJlYWwgd2F5IHRvIGtub3cgaG93IGJpZyBhIHJlZ2lzdGVyIGlzLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9TSVpFIDgKKworLyogTnVtYmVyIG9mIG1hY2hpbmUgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTlVNX1JFR1MgNjYKKworLyogSW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIG5hbWVzIG9mIHJlZ2lzdGVycy4KKyAgIFRoZXJlIHNob3VsZCBiZSBOVU1fUkVHUyBzdHJpbmdzIGluIHRoaXMgaW5pdGlhbGl6ZXIuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX05BTUVTIAlcCisgICAgewkidjAiLAkidDAiLAkidDEiLAkidDIiLAkidDMiLAkidDQiLAkidDUiLAkidDYiLCBcCisJInQ3IiwJInMwIiwJInMxIiwJInMyIiwJInMzIiwJInM0IiwJInM1IiwJImZwIiwgXAorCSJhMCIsCSJhMSIsCSJhMiIsCSJhMyIsCSJhNCIsCSJhNSIsCSJ0OCIsCSJ0OSIsIFwKKwkidDEwIiwJInQxMSIsCSJyYSIsCSJ0MTIiLAkiYXQiLAkiZ3AiLAkic3AiLAkiemVybyIsIFwKKwkiZjAiLCAgICJmMSIsICAgImYyIiwgICAiZjMiLCAgICJmNCIsICAgImY1IiwgICAiZjYiLCAgICJmNyIsIFwKKwkiZjgiLCAgICJmOSIsICAgImYxMCIsICAiZjExIiwgICJmMTIiLCAgImYxMyIsICAiZjE0IiwgICJmMTUiLCBcCisJImYxNiIsICAiZjE3IiwgICJmMTgiLCAgImYxOSIsICAiZjIwIiwgICJmMjEiLCAgImYyMiIsICAiZjIzIixcCisJImYyNCIsICAiZjI1IiwgICJmMjYiLCAgImYyNyIsICAiZjI4IiwgICJmMjkiLCAgImYzMCIsICAiZjMxIixcCisJInBjIiwJInZmcCIsCQkJCQkJXAorICAgIH0KKworLyogUmVnaXN0ZXIgbnVtYmVycyBvZiB2YXJpb3VzIGltcG9ydGFudCByZWdpc3RlcnMuCisgICBOb3RlIHRoYXQgbW9zdCBvZiB0aGVzZSB2YWx1ZXMgYXJlICJyZWFsIiByZWdpc3RlciBudW1iZXJzLAorICAgYW5kIGNvcnJlc3BvbmQgdG8gdGhlIGdlbmVyYWwgcmVnaXN0ZXJzIG9mIHRoZSBtYWNoaW5lLAorICAgYW5kIEZQX1JFR05VTSBpcyBhICJwaG9ueSIgcmVnaXN0ZXIgbnVtYmVyIHdoaWNoIGlzIHRvbyBsYXJnZQorICAgdG8gYmUgYW4gYWN0dWFsIHJlZ2lzdGVyIG51bWJlciBhcyBmYXIgYXMgdGhlIHVzZXIgaXMgY29uY2VybmVkCisgICBidXQgc2VydmVzIHRvIGdldCB0aGUgZGVzaXJlZCB2YWx1ZSB3aGVuIHBhc3NlZCB0byByZWFkX3JlZ2lzdGVyLiAgKi8KKworI2RlZmluZSBWMF9SRUdOVU0gMAkJLyogRnVuY3Rpb24gaW50ZWdlciByZXR1cm4gdmFsdWUgKi8KKyNkZWZpbmUgVDdfUkVHTlVNIDgJCS8qIFJldHVybiBhZGRyZXNzIHJlZ2lzdGVyIGZvciBPU0YvMSBfX2FkZCogKi8KKyNkZWZpbmUgR0NDX0ZQX1JFR05VTSAxNQkvKiBVc2VkIGJ5IGdjYyBhcyBmcmFtZSByZWdpc3RlciAqLworI2RlZmluZSBBMF9SRUdOVU0gMTYJCS8qIExvYyBvZiBmaXJzdCBhcmcgZHVyaW5nIGEgc3ViciBjYWxsICovCisjZGVmaW5lIFQ5X1JFR05VTSAyMwkJLyogUmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIgZm9yIE9TRi8xIF9fZGl2KiAqLworI2RlZmluZSBUMTJfUkVHTlVNIDI3CQkvKiBDb250YWlucyBzdGFydCBhZGRyIG9mIGN1cnJlbnQgcHJvYyAqLworI2RlZmluZSBTUF9SRUdOVU0gMzAJCS8qIENvbnRhaW5zIGFkZHJlc3Mgb2YgdG9wIG9mIHN0YWNrICovCisjZGVmaW5lIFJBX1JFR05VTSAyNgkJLyogQ29udGFpbnMgcmV0dXJuIGFkZHJlc3MgdmFsdWUgKi8KKyNkZWZpbmUgWkVST19SRUdOVU0gMzEJCS8qIFJlYWQtb25seSByZWdpc3RlciwgYWx3YXlzIDAgKi8KKyNkZWZpbmUgRlAwX1JFR05VTSAzMiAgICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgMCAqLworI2RlZmluZSBGUEEwX1JFR05VTSA0OCAgICAgICAgICAvKiBGaXJzdCBmbG9hdCBhcmcgZHVyaW5nIGEgc3ViciBjYWxsICovCisjZGVmaW5lIFBDX1JFR05VTSA2NAkJLyogQ29udGFpbnMgcHJvZ3JhbSBjb3VudGVyICovCisjZGVmaW5lIEZQX1JFR05VTSA2NQkJLyogVmlydHVhbCBmcmFtZSBwb2ludGVyICovCisKKyNkZWZpbmUgQ0FOTk9UX0ZFVENIX1JFR0lTVEVSKHJlZ25vKSBcCisgICgocmVnbm8pID09IEZQX1JFR05VTSB8fCAocmVnbm8pID09IFpFUk9fUkVHTlVNKQorI2RlZmluZSBDQU5OT1RfU1RPUkVfUkVHSVNURVIocmVnbm8pIFwKKyAgKChyZWdubykgPT0gRlBfUkVHTlVNIHx8IChyZWdubykgPT0gWkVST19SRUdOVU0pCisKKy8qIFRvdGFsIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgdG8gc3RvcmUgb3VyIGNvcGllcyBvZiB0aGUgbWFjaGluZSdzCisgICByZWdpc3RlciBzdGF0ZSwgdGhlIGFycmF5IGByZWdpc3RlcnMnLiAgKi8KKyNkZWZpbmUgUkVHSVNURVJfQllURVMgKE5VTV9SRUdTICogOCkKKworLyogSW5kZXggd2l0aGluIGByZWdpc3RlcnMnIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzcGFjZSBmb3IKKyAgIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0JZVEUoTikgKChOKSAqIDgpCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBhY3R1YWwgbWFjaGluZSByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICBPbiBBbHBoYXMsIGFsbCByZWdzIGFyZSA4IGJ5dGVzLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9SQVdfU0laRShOKSA4CisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBwcm9ncmFtJ3MgcmVwcmVzZW50YXRpb24KKyAgIGZvciByZWdpc3RlciBOLiAgT24gQWxwaGFzLCBhbGwgcmVncyBhcmUgOCBieXRlcy4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9TSVpFKE4pIDgKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9SQVdfU0laRSBjYW4gaGF2ZS4gICovCisKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1JBV19TSVpFIDgKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUgOAorCisvKiBOb256ZXJvIGlmIHJlZ2lzdGVyIE4gcmVxdWlyZXMgY29udmVyc2lvbgorICAgZnJvbSByYXcgZm9ybWF0IHRvIHZpcnR1YWwgZm9ybWF0LgorICAgVGhlIGFscGhhIG5lZWRzIGEgY29udmVyc2lvbiBiZXR3ZWVuIHJlZ2lzdGVyIGFuZCBtZW1vcnkgZm9ybWF0IGlmCisgICB0aGUgcmVnaXN0ZXIgaXMgYSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBhbmQKKyAgICAgIG1lbW9yeSBmb3JtYXQgaXMgZmxvYXQsIGFzIHRoZSByZWdpc3RlciBmb3JtYXQgbXVzdCBiZSBkb3VibGUKKyAgIG9yCisgICAgICBtZW1vcnkgZm9ybWF0IGlzIGFuIGludGVnZXIgd2l0aCA0IGJ5dGVzIG9yIGxlc3MsIGFzIHRoZSByZXByZXNlbnRhdGlvbgorICAgICAgb2YgaW50ZWdlcnMgaW4gZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGlzIGRpZmZlcmVudC4gKi8KKworI2RlZmluZSBSRUdJU1RFUl9DT05WRVJUSUJMRShOKSAoKE4pID49IEZQMF9SRUdOVU0gJiYgKE4pIDwgRlAwX1JFR05VTSArIDMyKQorCisvKiBDb252ZXJ0IGRhdGEgZnJvbSByYXcgZm9ybWF0IGZvciByZWdpc3RlciBSRUdOVU0gaW4gYnVmZmVyIEZST00KKyAgIHRvIHZpcnR1YWwgZm9ybWF0IHdpdGggdHlwZSBUWVBFIGluIGJ1ZmZlciBUTy4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMKFJFR05VTSwgVFlQRSwgRlJPTSwgVE8pIFwKKyAgYWxwaGFfcmVnaXN0ZXJfY29udmVydF90b192aXJ0dWFsIChSRUdOVU0sIFRZUEUsIEZST00sIFRPKQorZXh0ZXJuIHZvaWQKK2FscGhhX3JlZ2lzdGVyX2NvbnZlcnRfdG9fdmlydHVhbCBQQVJBTVMgKChpbnQsIHN0cnVjdCB0eXBlICosIGNoYXIgKiwgY2hhciAqKSk7CisKKy8qIENvbnZlcnQgZGF0YSBmcm9tIHZpcnR1YWwgZm9ybWF0IHdpdGggdHlwZSBUWVBFIGluIGJ1ZmZlciBGUk9NCisgICB0byByYXcgZm9ybWF0IGZvciByZWdpc3RlciBSRUdOVU0gaW4gYnVmZmVyIFRPLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9DT05WRVJUX1RPX1JBVyhUWVBFLCBSRUdOVU0sIEZST00sIFRPKQlcCisgIGFscGhhX3JlZ2lzdGVyX2NvbnZlcnRfdG9fcmF3IChUWVBFLCBSRUdOVU0sIEZST00sIFRPKQorZXh0ZXJuIHZvaWQKK2FscGhhX3JlZ2lzdGVyX2NvbnZlcnRfdG9fcmF3IFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIGludCwgY2hhciAqLCBjaGFyICopKTsKKworLyogUmV0dXJuIHRoZSBHREIgdHlwZSBvYmplY3QgZm9yIHRoZSAic3RhbmRhcmQiIGRhdGEgdHlwZQorICAgb2YgZGF0YSBpbiByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1RZUEUoTikgXAorCSgoKE4pID49IEZQMF9SRUdOVU0gJiYgKE4pIDwgRlAwX1JFR05VTSszMikgIFwKKwkgPyBidWlsdGluX3R5cGVfZG91YmxlIDogYnVpbHRpbl90eXBlX2xvbmcpIFwKKworLyogU3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIHBsYWNlIGluIHdoaWNoIHRvIGNvcHkgdGhlIHN0cnVjdHVyZSB0aGUKKyAgIHN1YnJvdXRpbmUgd2lsbCByZXR1cm4uICBIYW5kbGVkIGJ5IGFscGhhX3B1c2hfYXJndW1lbnRzLiAgKi8KKworI2RlZmluZSBTVE9SRV9TVFJVQ1RfUkVUVVJOKGFkZHIsIHNwKQkvKiovCisKKy8qIEV4dHJhY3QgZnJvbSBhbiBhcnJheSBSRUdCVUYgY29udGFpbmluZyB0aGUgKHJhdykgcmVnaXN0ZXIgc3RhdGUKKyAgIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIG9mIHR5cGUgVFlQRSwgYW5kIGNvcHkgdGhhdCwgaW4gdmlydHVhbCBmb3JtYXQsCisgICBpbnRvIFZBTEJVRi4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9SRVRVUk5fVkFMVUUoVFlQRSxSRUdCVUYsVkFMQlVGKSBcCisgIGFscGhhX2V4dHJhY3RfcmV0dXJuX3ZhbHVlKFRZUEUsIFJFR0JVRiwgVkFMQlVGKQorZXh0ZXJuIHZvaWQKK2FscGhhX2V4dHJhY3RfcmV0dXJuX3ZhbHVlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIGNoYXIgKiwgY2hhciAqKSk7CisKKy8qIFdyaXRlIGludG8gYXBwcm9wcmlhdGUgcmVnaXN0ZXJzIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlCisgICBvZiB0eXBlIFRZUEUsIGdpdmVuIGluIHZpcnR1YWwgZm9ybWF0LiAgKi8KKworI2RlZmluZSBTVE9SRV9SRVRVUk5fVkFMVUUoVFlQRSxWQUxCVUYpIFwKKyAgYWxwaGFfc3RvcmVfcmV0dXJuX3ZhbHVlKFRZUEUsIFZBTEJVRikKK2V4dGVybiB2b2lkCithbHBoYV9zdG9yZV9yZXR1cm5fdmFsdWUgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqKSk7CisKKy8qIEV4dHJhY3QgZnJvbSBhbiBhcnJheSBSRUdCVUYgY29udGFpbmluZyB0aGUgKHJhdykgcmVnaXN0ZXIgc3RhdGUKKyAgIHRoZSBhZGRyZXNzIGluIHdoaWNoIGEgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBpdHMgc3RydWN0dXJlIHZhbHVlLAorICAgYXMgYSBDT1JFX0FERFIgKG9yIGFuIGV4cHJlc3Npb24gdGhhdCBjYW4gYmUgdXNlZCBhcyBvbmUpLiAgKi8KKy8qIFRoZSBhZGRyZXNzIGlzIHBhc3NlZCBpbiBhMCB1cG9uIGVudHJ5IHRvIHRoZSBmdW5jdGlvbiwgYnV0IHdoZW4KKyAgIHRoZSBmdW5jdGlvbiBleGl0cywgdGhlIGNvbXBpbGVyIGhhcyBjb3BpZWQgdGhlIHZhbHVlIHRvIHYwLiAgVGhpcworICAgY29udmVudGlvbiBpcyBzcGVjaWZpZWQgYnkgdGhlIFN5c3RlbSBWIEFCSSwgc28gSSB0aGluayB3ZSBjYW4gcmVseQorICAgb24gaXQuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MoUkVHQlVGKSBcCisgIChleHRyYWN0X2FkZHJlc3MgKFJFR0JVRiArIFJFR0lTVEVSX0JZVEUgKFYwX1JFR05VTSksIFwKKwkJICAgIFJFR0lTVEVSX1JBV19TSVpFIChWMF9SRUdOVU0pKSkKKworLyogU3RydWN0dXJlcyBhcmUgcmV0dXJuZWQgYnkgcmVmIGluIGV4dHJhIGFyZzAgKi8KKyNkZWZpbmUgVVNFX1NUUlVDVF9DT05WRU5USU9OKGdjY19wLCB0eXBlKQkxCisKKwwKKy8qIERlc2NyaWJlIHRoZSBwb2ludGVyIGluIGVhY2ggc3RhY2sgZnJhbWUgdG8gdGhlIHByZXZpb3VzIHN0YWNrIGZyYW1lCisgICAoaXRzIGNhbGxlcikuICAqLworCisvKiBGUkFNRV9DSEFJTiB0YWtlcyBhIGZyYW1lJ3Mgbm9taW5hbCBhZGRyZXNzCisgICBhbmQgcHJvZHVjZXMgdGhlIGZyYW1lJ3MgY2hhaW4tcG9pbnRlci4gKi8KKworI2RlZmluZSBGUkFNRV9DSEFJTih0aGlzZnJhbWUpIChDT1JFX0FERFIpIGFscGhhX2ZyYW1lX2NoYWluICh0aGlzZnJhbWUpCitleHRlcm4gQ09SRV9BRERSIGFscGhhX2ZyYW1lX2NoYWluIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworLyogRGVmaW5lIG90aGVyIGFzcGVjdHMgb2YgdGhlIHN0YWNrIGZyYW1lLiAgKi8KKworCisvKiBBIG1hY3JvIHRoYXQgdGVsbHMgdXMgd2hldGhlciB0aGUgZnVuY3Rpb24gaW52b2NhdGlvbiByZXByZXNlbnRlZAorICAgYnkgRkkgZG9lcyBub3QgaGF2ZSBhIGZyYW1lIG9uIHRoZSBzdGFjayBhc3NvY2lhdGVkIHdpdGggaXQuICBJZiBpdAorICAgZG9lcyBub3QsIEZSQU1FTEVTUyBpcyBzZXQgdG8gMSwgZWxzZSAwLiAgKi8KKy8qIFdlIGhhbmRsZSB0aGlzIGRpZmZlcmVudGx5IGZvciBhbHBoYSwgYW5kIG1heWJlIHdlIHNob3VsZCBub3QgKi8KKworI2RlZmluZSBGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTihGSSwgRlJBTUVMRVNTKSAgeyhGUkFNRUxFU1MpID0gMDt9CisKKy8qIFNhdmVkIFBjLiAgKi8KKworI2RlZmluZSBGUkFNRV9TQVZFRF9QQyhGUkFNRSkJKGFscGhhX2ZyYW1lX3NhdmVkX3BjKEZSQU1FKSkKK2V4dGVybiBDT1JFX0FERFIKK2FscGhhX2ZyYW1lX3NhdmVkX3BjIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworLyogVGhlIGFscGhhIGhhcyB0d28gZGlmZmVyZW50IHZpcnR1YWwgcG9pbnRlcnMgZm9yIGFyZ3VtZW50cyBhbmQgbG9jYWxzLgorCisgICBUaGUgdmlydHVhbCBhcmd1bWVudCBwb2ludGVyIGlzIHBvaW50aW5nIHRvIHRoZSBib3R0b20gb2YgdGhlIGFyZ3VtZW50CisgICB0cmFuc2ZlciBhcmVhLCB3aGljaCBpcyBsb2NhdGVkIGltbWVkaWF0ZWx5IGJlbG93IHRoZSB2aXJ0dWFsIGZyYW1lCisgICBwb2ludGVyLiBJdHMgc2l6ZSBpcyBmaXhlZCBmb3IgdGhlIG5hdGl2ZSBjb21waWxlciwgaXQgaXMgZWl0aGVyIHplcm8KKyAgIChmb3IgdGhlIG5vIGFyZ3VtZW50cyBjYXNlKSBvciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgYXJndW1lbnQgcmVnaXN0ZXJzLgorICAgZ2NjIHVzZXMgYSB2YXJpYWJsZSBzaXplZCBhcmd1bWVudCB0cmFuc2ZlciBhcmVhLiBBcyBpdCBoYXMKKyAgIHRvIHN0YXkgY29tcGF0aWJsZSB3aXRoIHRoZSBuYXRpdmUgZGVidWdnaW5nIHRvb2xzIGl0IGhhcyB0byB1c2UgdGhlIHNhbWUKKyAgIHZpcnR1YWwgYXJndW1lbnQgcG9pbnRlciBhbmQgYWRqdXN0IHRoZSBhcmd1bWVudCBvZmZzZXRzIGFjY29yZGluZ2x5LgorCisgICBUaGUgdmlydHVhbCBsb2NhbCBwb2ludGVyIGlzIGxvY2Fsb2ZmIGJ5dGVzIGJlbG93IHRoZSB2aXJ0dWFsIGZyYW1lCisgICBwb2ludGVyLCB0aGUgdmFsdWUgb2YgbG9jYWxvZmYgaXMgb2J0YWluZWQgZnJvbSB0aGUgUERSLiAgKi8KKworI2RlZmluZSBBTFBIQV9OVU1fQVJHX1JFR1MJNgorCisjZGVmaW5lIEZSQU1FX0FSR1NfQUREUkVTUyhmaSkJKChmaSktPmZyYW1lIC0gKEFMUEhBX05VTV9BUkdfUkVHUyAqIDgpKQorCisjZGVmaW5lIEZSQU1FX0xPQ0FMU19BRERSRVNTKGZpKSAoKGZpKS0+ZnJhbWUgLSAoZmkpLT5sb2NhbG9mZikKKworLyogUmV0dXJuIG51bWJlciBvZiBhcmdzIHBhc3NlZCB0byBhIGZyYW1lLgorICAgQ2FuIHJldHVybiAtMSwgbWVhbmluZyBubyB3YXkgdG8gdGVsbC4gICovCisKKyNkZWZpbmUgRlJBTUVfTlVNX0FSR1MobnVtLCBmaSkJKChudW0pID0gLTEpCisKKy8qIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgYXQgc3RhcnQgb2YgYXJnbGlzdCB0aGF0IGFyZSBub3QgcmVhbGx5IGFyZ3MuICAqLworCisjZGVmaW5lIEZSQU1FX0FSR1NfU0tJUCAwCisKKy8qIFB1dCBoZXJlIHRoZSBjb2RlIHRvIHN0b3JlLCBpbnRvIGEgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MsCisgICB0aGUgYWRkcmVzc2VzIG9mIHRoZSBzYXZlZCByZWdpc3RlcnMgb2YgZnJhbWUgZGVzY3JpYmVkIGJ5IEZSQU1FX0lORk8uCisgICBUaGlzIGluY2x1ZGVzIHNwZWNpYWwgcmVnaXN0ZXJzIHN1Y2ggYXMgcGMgYW5kIGZwIHNhdmVkIGluIHNwZWNpYWwKKyAgIHdheXMgaW4gdGhlIHN0YWNrIGZyYW1lLiAgc3AgaXMgZXZlbiBtb3JlIHNwZWNpYWw6CisgICB0aGUgYWRkcmVzcyB3ZSByZXR1cm4gZm9yIGl0IElTIHRoZSBzcCBmb3IgdGhlIG5leHQgZnJhbWUuICAqLworCitleHRlcm4gdm9pZCBhbHBoYV9maW5kX3NhdmVkX3JlZ3MgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworCisjZGVmaW5lIEZSQU1FX0lOSVRfU0FWRURfUkVHUyhmcmFtZV9pbmZvKSBcCisgIGRvIHsgXAorICAgIGlmICgoZnJhbWVfaW5mbyktPnNhdmVkX3JlZ3MgPT0gTlVMTCkgXAorICAgICAgYWxwaGFfZmluZF9zYXZlZF9yZWdzIChmcmFtZV9pbmZvKTsgXAorICAgIChmcmFtZV9pbmZvKS0+c2F2ZWRfcmVnc1tTUF9SRUdOVU1dID0gKGZyYW1lX2luZm8pLT5mcmFtZTsgXAorICB9IHdoaWxlICgwKQorCisMCisvKiBUaGluZ3MgbmVlZGVkIGZvciBtYWtpbmcgdGhlIGluZmVyaW9yIGNhbGwgZnVuY3Rpb25zLiAgKi8KKworI2RlZmluZSBQVVNIX0FSR1VNRU5UUyhuYXJncywgYXJncywgc3AsIHN0cnVjdF9yZXR1cm4sIHN0cnVjdF9hZGRyKSBcCisgICAgc3AgPSBhbHBoYV9wdXNoX2FyZ3VtZW50cygobmFyZ3MpLCAoYXJncyksIChzcCksIChzdHJ1Y3RfcmV0dXJuKSwgKHN0cnVjdF9hZGRyKSkKK2V4dGVybiBDT1JFX0FERFIKK2FscGhhX3B1c2hfYXJndW1lbnRzIFBBUkFNUyAoKGludCwgc3RydWN0IHZhbHVlICoqLCBDT1JFX0FERFIsIGludCwgQ09SRV9BRERSKSk7CisKKy8qIFB1c2ggYW4gZW1wdHkgc3RhY2sgZnJhbWUsIHRvIHJlY29yZCB0aGUgY3VycmVudCBQQywgZXRjLiAgKi8KKworI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FIAlhbHBoYV9wdXNoX2R1bW15X2ZyYW1lKCkKK2V4dGVybiB2b2lkCithbHBoYV9wdXNoX2R1bW15X2ZyYW1lIFBBUkFNUyAoKHZvaWQpKTsKKworLyogRGlzY2FyZCBmcm9tIHRoZSBzdGFjayB0aGUgaW5uZXJtb3N0IGZyYW1lLCByZXN0b3JpbmcgYWxsIHJlZ2lzdGVycy4gICovCisKKyNkZWZpbmUgUE9QX0ZSQU1FCQlhbHBoYV9wb3BfZnJhbWUoKQorZXh0ZXJuIHZvaWQKK2FscGhhX3BvcF9mcmFtZSBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIEFscGhhIE9TRi8xIGluaGliaXRzIGV4ZWN1dGlvbiBvZiBjb2RlIG9uIHRoZSBzdGFjay4KKyAgIEJ1dCB0aGVyZSBpcyBubyBuZWVkIGZvciBhIGR1bW15IG9uIHRoZSBhbHBoYS4gUFVTSF9BUkdVTUVOVFMKKyAgIHRha2VzIGNhcmUgb2YgYWxsIGFyZ3VtZW50IGhhbmRsaW5nIGFuZCBicF9jYWxsX2R1bW15IHRha2VzIGNhcmUKKyAgIG9mIHN0b3BwaW5nIHRoZSBkdW1teS4gICovCisKKyNkZWZpbmUgQ0FMTF9EVU1NWV9MT0NBVElPTiBBVF9FTlRSWV9QT0lOVAorCisvKiBPbiB0aGUgQWxwaGEgdGhlIGNhbGwgZHVtbXkgY29kZSBpcyBuZXZlciBjb3BpZWQgdG8gdXNlciBzcGFjZSwKKyAgIHN0b3BwaW5nIHRoZSB1c2VyIGNhbGwgaXMgYWNoaWV2ZWQgdmlhIGEgYnBfY2FsbF9kdW1teSBicmVha3BvaW50LgorICAgQnV0IHdlIG5lZWQgYSBmYWtlIENBTExfRFVNTVkgZGVmaW5pdGlvbiB0byBlbmFibGUgdGhlIHByb3BlcgorICAgY2FsbF9mdW5jdGlvbl9ieV9oYW5kIGFuZCB0byBhdm9pZCB6ZXJvIGxlbmd0aCBhcnJheSB3YXJuaW5ncworICAgaW4gdmFsb3BzLmMgICovCisKKyNkZWZpbmUgQ0FMTF9EVU1NWSB7IDAgfQkvKiBDb250ZW50IGRvZXNuJ3QgbWF0dGVyLiAqLworCisjZGVmaW5lIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUICgwKQorCisjZGVmaW5lIENBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQgKDApCisKK2V4dGVybiBDT1JFX0FERFIgYWxwaGFfY2FsbF9kdW1teV9hZGRyZXNzIFBBUkFNUyAoKHZvaWQpKTsKKyNkZWZpbmUgQ0FMTF9EVU1NWV9BRERSRVNTKCkgYWxwaGFfY2FsbF9kdW1teV9hZGRyZXNzKCkKKworLyogSW5zZXJ0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGFyZ3MgYW5kIGZ1bmN0aW9uIGFkZHJlc3MKKyAgIGludG8gYSBjYWxsIHNlcXVlbmNlIG9mIHRoZSBhYm92ZSBmb3JtIHN0b3JlZCBhdCBEVU1NWU5BTUUuCisgICBXZSBvbmx5IGhhdmUgdG8gc2V0IFJBX1JFR05VTSB0byB0aGUgZHVtbXkgYnJlYWtwb2ludCBhZGRyZXNzCisgICBhbmQgVDEyX1JFR05VTSAodGhlIGBwcm9jZWR1cmUgdmFsdWUgcmVnaXN0ZXInKSB0byB0aGUgZnVuY3Rpb24gYWRkcmVzcy4gICovCisKKyNkZWZpbmUgRklYX0NBTExfRFVNTVkoZHVtbXluYW1lLCBwYywgZnVuLCBuYXJncywgYXJncywgdHlwZSwgZ2NjX3ApICAgIFwKK3sJCQkJCQkJCQlcCisgIENPUkVfQUREUiBicF9hZGRyZXNzID0gQ0FMTF9EVU1NWV9BRERSRVNTICgpOwkJCVwKKyAgaWYgKGJwX2FkZHJlc3MgPT0gMCkJCQkJCQkJXAorICAgIGVycm9yICgibm8gcGxhY2UgdG8gcHV0IGNhbGwiKTsJCQkJCVwKKyAgd3JpdGVfcmVnaXN0ZXIgKFJBX1JFR05VTSwgYnBfYWRkcmVzcyk7CQkJCVwKKyAgd3JpdGVfcmVnaXN0ZXIgKFQxMl9SRUdOVU0sIGZ1bik7CQkJCQlcCit9CisKKy8qIFRoZXJlJ3MgYSBtZXNzIGluIHN0YWNrIGZyYW1lIGNyZWF0aW9uLiAgU2VlIGNvbW1lbnRzIGluIGJsb2NrZnJhbWUuYworICAgbmVhciByZWZlcmVuY2UgdG8gSU5JVF9GUkFNRV9QQ19GSVJTVC4gICovCisKKyNkZWZpbmUJSU5JVF9GUkFNRV9QQyhmcm9tbGVhZiwgcHJldikgLyogbmFkYSAqLworCisjZGVmaW5lIElOSVRfRlJBTUVfUENfRklSU1QoZnJvbWxlYWYsIHByZXYpIFwKKyAgKHByZXYpLT5wYyA9ICgoZnJvbWxlYWYpID8gU0FWRURfUENfQUZURVJfQ0FMTCAoKHByZXYpLT5uZXh0KSA6IFwKKwkgICAgICAocHJldiktPm5leHQgPyBGUkFNRV9TQVZFRF9QQyAoKHByZXYpLT5uZXh0KSA6IHJlYWRfcGMgKCkpOworCisvKiBTcGVjaWFsIHN5bWJvbCBmb3VuZCBpbiBibG9ja3MgYXNzb2NpYXRlZCB3aXRoIHJvdXRpbmVzLiAgV2UgY2FuIGhhbmcKKyAgIGFscGhhX2V4dHJhX2Z1bmNfaW5mb190J3Mgb2ZmIG9mIHRoaXMuICAqLworCisjZGVmaW5lIE1JUFNfRUZJX1NZTUJPTF9OQU1FICJfX0dEQl9FRklfSU5GT19fIgorZXh0ZXJuIHZvaWQgZWNvZmZfcmVsb2NhdGVfZWZpIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKiwgQ09SRV9BRERSKSk7CisKKy8qIFNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvY2VkdXJlLgorICAgVGhpcyBvdmVybGF5cyB0aGUgQUxQSEEncyBQRFIgcmVjb3JkcywgCisgICBhbHBoYXJlYWQuYyAoYWIpdXNlcyB0aGlzIHRvIHNhdmUgbWVtb3J5ICovCisKK3R5cGVkZWYgc3RydWN0IGFscGhhX2V4dHJhX2Z1bmNfaW5mbyB7CisJbG9uZwludW1hcmdzOwkvKiBudW1iZXIgb2YgYXJncyB0byBwcm9jZWR1cmUgKHdhcyBpb3B0KSAqLworCVBEUglwZHI7CQkvKiBQcm9jZWR1cmUgZGVzY3JpcHRvciByZWNvcmQgKi8KK30gKmFscGhhX2V4dHJhX2Z1bmNfaW5mb190OworCisvKiBEZWZpbmUgdGhlIGV4dHJhX2Z1bmNfaW5mbyB0aGF0IG1pcHNyZWFkLmMgbmVlZHMuCisgICBGSVhNRTogV2Ugc2hvdWxkIGRlZmluZSBvdXIgb3duIFBEUiBpbnRlcmZhY2UsIHBlcmhhcHMgaW4gYSBzZXBhcmF0ZQorICAgaGVhZGVyIGZpbGUuIFRoaXMgd291bGQgZ2V0IHJpZCBvZiB0aGUgPGJmZC5oPiBpbmNsdXNpb24gaW4gYWxsIHNvdXJjZXMKKyAgIGFuZCB3b3VsZCBhYnN0cmFjdCB0aGUgbWlwcy9hbHBoYSBpbnRlcmZhY2UgZnJvbSBlY29mZi4gICovCisjZGVmaW5lIG1pcHNfZXh0cmFfZnVuY19pbmZvIGFscGhhX2V4dHJhX2Z1bmNfaW5mbworI2RlZmluZSBtaXBzX2V4dHJhX2Z1bmNfaW5mb190IGFscGhhX2V4dHJhX2Z1bmNfaW5mb190CisKKyNkZWZpbmUgRVhUUkFfRlJBTUVfSU5GTyBcCisgIGludCBsb2NhbG9mZjsgXAorICBpbnQgcGNfcmVnOyBcCisgIGFscGhhX2V4dHJhX2Z1bmNfaW5mb190IHByb2NfZGVzYzsKKworI2RlZmluZSBJTklUX0VYVFJBX0ZSQU1FX0lORk8oZnJvbWxlYWYsIGZjaSkgaW5pdF9leHRyYV9mcmFtZV9pbmZvKGZjaSkKK2V4dGVybiB2b2lkCitpbml0X2V4dHJhX2ZyYW1lX2luZm8gUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworCisjZGVmaW5lCVBSSU5UX0VYVFJBX0ZSQU1FX0lORk8oZmkpIFwKKyAgeyBcCisgICAgaWYgKGZpICYmIGZpLT5wcm9jX2Rlc2MgJiYgZmktPnByb2NfZGVzYy0+cGRyLmZyYW1lcmVnIDwgTlVNX1JFR1MpIFwKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiBmcmFtZSBwb2ludGVyIGlzIGF0ICVzKyVkXG4iLCBcCisgICAgICAgICAgICAgICAgICAgICAgIFJFR0lTVEVSX05BTUUgKGZpLT5wcm9jX2Rlc2MtPnBkci5mcmFtZXJlZyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpLT5wcm9jX2Rlc2MtPnBkci5mcmFtZW9mZnNldCk7IFwKKyAgfQorCisvKiBJdCB0YWtlcyB0d28gdmFsdWVzIHRvIHNwZWNpZnkgYSBmcmFtZSBvbiB0aGUgQUxQSEEuICBTaWdoLgorCisgICBJbiBmYWN0LCBhdCB0aGUgbW9tZW50LCB0aGUgKlBDKiBpcyB0aGUgcHJpbWFyeSB2YWx1ZSB0aGF0IHNldHMgdXAKKyAgIGEgZnJhbWUuICBUaGUgUEMgaXMgbG9va2VkIHVwIHRvIHNlZSB3aGF0IGZ1bmN0aW9uIGl0J3MgaW47IHN5bWJvbAorICAgaW5mb3JtYXRpb24gZnJvbSB0aGF0IGZ1bmN0aW9uIHRlbGxzIHVzIHdoaWNoIHJlZ2lzdGVyIGlzIHRoZSBmcmFtZQorICAgcG9pbnRlciBiYXNlLCBhbmQgd2hhdCBvZmZzZXQgZnJvbSB0aGVyZSBpcyB0aGUgInZpcnR1YWwgZnJhbWUgcG9pbnRlciIuCisgICAoVGhpcyBpcyB1c3VhbGx5IGFuIG9mZnNldCBmcm9tIFNQLikgIEZJWE1FIC0tIHRoaXMgc2hvdWxkIGJlIGNsZWFuZWQKKyAgIHVwIHNvIHRoYXQgdGhlIHByaW1hcnkgdmFsdWUgaXMgdGhlIFNQLCBhbmQgdGhlIFBDIGlzIHVzZWQgdG8gZGlzYW1iaWd1YXRlCisgICBtdWx0aXBsZSBmdW5jdGlvbnMgd2l0aCB0aGUgc2FtZSBTUCB0aGF0IGFyZSBhdCBkaWZmZXJlbnQgc3RhY2sgbGV2ZWxzLiAqLworCisjZGVmaW5lIFNFVFVQX0FSQklUUkFSWV9GUkFNRShhcmdjLCBhcmd2KSBzZXR1cF9hcmJpdHJhcnlfZnJhbWUgKGFyZ2MsIGFyZ3YpCitleHRlcm4gc3RydWN0IGZyYW1lX2luZm8gKnNldHVwX2FyYml0cmFyeV9mcmFtZSBQQVJBTVMgKChpbnQsIENPUkVfQUREUiAqKSk7CisKKy8qIFRoaXMgaXMgdXNlZCBieSBoZXVyaXN0aWNfcHJvY19zdGFydC4gIEl0IHNob3VsZCBiZSBzaG90IGl0IHRoZSBoZWFkLiAgKi8KKyNpZm5kZWYgVk1fTUlOX0FERFJFU1MKKyNkZWZpbmUgVk1fTUlOX0FERFJFU1MgKENPUkVfQUREUikweDEyMDAwMDAwMAorI2VuZGlmCisKKy8qIElmIFBDIGlzIGluIGEgc2hhcmVkIGxpYnJhcnkgdHJhbXBvbGluZSBjb2RlLCByZXR1cm4gdGhlIFBDCisgICB3aGVyZSB0aGUgZnVuY3Rpb24gaXRzZWxmIGFjdHVhbGx5IHN0YXJ0cy4gIElmIG5vdCwgcmV0dXJuIDAuICAqLworI2RlZmluZSBTS0lQX1RSQU1QT0xJTkVfQ09ERShwYykgIGZpbmRfc29saWJfdHJhbXBvbGluZV90YXJnZXQgKHBjKQorCisvKiBJZiB0aGUgY3VycmVudCBnY2MgZm9yIGZvciB0aGlzIHRhcmdldCBkb2VzIG5vdCBwcm9kdWNlIGNvcnJlY3QgZGVidWdnaW5nCisgICBpbmZvcm1hdGlvbiBmb3IgZmxvYXQgcGFyYW1ldGVycywgYm90aCBwcm90b3R5cGVkIGFuZCB1bnByb3RvdHlwZWQsIHRoZW4KKyAgIGRlZmluZSB0aGlzIG1hY3JvLiAgVGhpcyBmb3JjZXMgZ2RiIHRvICBhbHdheXMgYXNzdW1lIHRoYXQgZmxvYXRzIGFyZQorICAgcGFzc2VkIGFzIGRvdWJsZXMgYW5kIHRoZW4gY29udmVydGVkIGluIHRoZSBjYWxsZWUuCisKKyAgIEZvciB0aGUgYWxwaGEsIGl0IGFwcGVhcnMgdGhhdCB0aGUgZGVidWcgaW5mbyBtYXJrcyB0aGUgcGFyYW1ldGVycyBhcworICAgZmxvYXRzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgZnVuY3Rpb24gaXMgcHJvdG90eXBlZCwgYnV0IHRoZSBhY3R1YWwKKyAgIHZhbHVlcyBhcmUgYWx3YXlzIHBhc3NlZCBpbiBhcyBkb3VibGVzLiAgVGh1cyBieSBzZXR0aW5nIHRoaXMgdG8gMSwgYm90aAorICAgdHlwZXMgb2YgY2FsbHMgd2lsbCB3b3JrLiAqLworCisjZGVmaW5lIENPRVJDRV9GTE9BVF9UT19ET1VCTEUgMQorCisvKiBSZXR1cm4gVFJVRSBpZiBwcm9jZWR1cmUgZGVzY3JpcHRvciBQUk9DIGlzIGEgcHJvY2VkdXJlIGRlc2NyaXB0b3IKKyAgIHRoYXQgcmVmZXJzIHRvIGEgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIHNpZ3RyYW1wIGZ1bmN0aW9uLgorCisgICBPU0YvMSBkb2Vzbid0IHVzZSBkeW5hbWljIHNpZ3RyYW1wIGZ1bmN0aW9ucywgc28gdGhpcyBpcyBhbHdheXMKKyAgIEZBTFNFLiAgKi8KKworI2RlZmluZSBQUk9DX0RFU0NfSVNfRFlOX1NJR1RSQU1QKHByb2MpCSgwKQorI2RlZmluZSBTRVRfUFJPQ19ERVNDX0lTX0RZTl9TSUdUUkFNUChwcm9jKQorCisvKiBJZiBQQyBpcyBpbnNpZGUgYSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgc2lndHJhbXAgZnVuY3Rpb24sIHJldHVybgorICAgaG93IG1hbnkgYnl0ZXMgdGhlIHByb2dyYW0gY291bnRlciBpcyBiZXlvbmQgdGhlIHN0YXJ0IG9mIHRoYXQKKyAgIGZ1bmN0aW9uLiAgT3RoZXJ3aXNlLCByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZS4KKworICAgT1NGLzEgZG9lc24ndCB1c2UgZHluYW1pYyBzaWd0cmFtcCBmdW5jdGlvbnMsIHNvIHRoaXMgYWx3YXlzCisgICByZXR1cm5zIC0xLiAgKi8KKworI2RlZmluZSBEWU5BTUlDX1NJR1RSQU1QX09GRlNFVChwYykJKC0xKQorCisvKiBUcmFuc2xhdGUgYSBzaWduYWwgaGFuZGxlciBmcmFtZSBpbnRvIHRoZSBhZGRyZXNzIG9mIHRoZSBzaWdjb250ZXh0CisgICBzdHJ1Y3R1cmUuICAqLworCisjZGVmaW5lIFNJR0NPTlRFWFRfQUREUihmcmFtZSkgXAorICAocmVhZF9tZW1vcnlfaW50ZWdlciAoKGZyYW1lKS0+bmV4dCA/IGZyYW1lLT5uZXh0LT5mcmFtZSA6IGZyYW1lLT5mcmFtZSwgOCkpCisKKy8qIElmIEZSQU1FIHJlZmVycyB0byBhIHNpZ3RyYW1wIGZyYW1lLCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQKKyAgIGZyYW1lLiAgKi8KKworI2RlZmluZSBGUkFNRV9QQVNUX1NJR1RSQU1QX0ZSQU1FKGZyYW1lLCBwYykgXAorICAoYWxwaGFfb3NmX3NraXBfc2lndHJhbXBfZnJhbWUgKGZyYW1lLCBwYykpCitleHRlcm4gQ09SRV9BRERSIGFscGhhX29zZl9za2lwX3NpZ3RyYW1wX2ZyYW1lIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICosIENPUkVfQUREUikpOworCisjZW5kaWYgLyogVE1fQUxQSEFfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hbHBoYS90bS1hbHBoYWxpbnV4LmggYi9nZGIvY29uZmlnL2FscGhhL3RtLWFscGhhbGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODM2YTcwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9hbHBoYS90bS1hbHBoYWxpbnV4LmgKQEAgLTAsMCArMSw4MCBAQAorLyogRGVmaW5pdGlvbnMgdG8gbWFrZSBHREIgcnVuIG9uIGFuIEFscGhhIGJveCB1bmRlciBMaW51eC4gIFRoZQorICAgZGVmaW5pdGlvbnMgaGVyZSBhcmUgdXNlZCB3aGVuIHRoZSBfdGFyZ2V0XyBzeXN0ZW0gaXMgcnVubmluZyBMaW51eC4KKyAgIENvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgVE1fTElOVVhBTFBIQV9ICisjZGVmaW5lIFRNX0xJTlVYQUxQSEFfSAorCisjaW5jbHVkZSAiYWxwaGEvdG0tYWxwaGEuaCIKKworLyogQXJlIHdlIGN1cnJlbnRseSBoYW5kbGluZyBhIHNpZ25hbCA/ICAqLworCitleHRlcm4gbG9uZyBhbHBoYV9saW51eF9zaWd0cmFtcF9vZmZzZXQgUEFSQU1TICgoQ09SRV9BRERSKSk7CisjdW5kZWYgSU5fU0lHVFJBTVAKKyNkZWZpbmUgSU5fU0lHVFJBTVAocGMsIG5hbWUpCShhbHBoYV9saW51eF9zaWd0cmFtcF9vZmZzZXQgKHBjKSA+PSAwKQorCisvKiBHZXQgc3RhcnQgYW5kIGVuZCBhZGRyZXNzIG9mIHNpZ3RyYW1wIGhhbmRsZXIuICAqLworCisjZGVmaW5lIFNJR1RSQU1QX1NUQVJUKHBjKQkocGMgLSBhbHBoYV9saW51eF9zaWd0cmFtcF9vZmZzZXQgKHBjKSkKKyNkZWZpbmUgU0lHVFJBTVBfRU5EKHBjKQkoU0lHVFJBTVBfU1RBUlQocGMpICsgMyo0KQorCisKKy8qIE51bWJlciBvZiB0cmFwcyB0aGF0IGhhcHBlbiBiZXR3ZWVuIGV4ZWMnaW5nIHRoZSBzaGVsbCB0byBydW4gYW4KKyAgIGluZmVyaW9yLCBhbmQgd2hlbiB3ZSBmaW5hbGx5IGdldCB0byB0aGUgaW5mZXJpb3IgY29kZS4gIFRoaXMgaXMgMgorICAgb24gTGludXggYW5kIG1vc3QgaW1wbGVtZW50YXRpb25zLiAgKi8KKworI3VuZGVmIFNUQVJUX0lORkVSSU9SX1RSQVBTX0VYUEVDVEVECisjZGVmaW5lIFNUQVJUX0lORkVSSU9SX1RSQVBTX0VYUEVDVEVEIDIKKworLyogUmV0dXJuIFRSVUUgaWYgcHJvY2VkdXJlIGRlc2NyaXB0b3IgUFJPQyBpcyBhIHByb2NlZHVyZSBkZXNjcmlwdG9yCisgICB0aGF0IHJlZmVycyB0byBhIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBzaWd0cmFtcCBmdW5jdGlvbi4gICovCisKKyN1bmRlZiBQUk9DX0RFU0NfSVNfRFlOX1NJR1RSQU1QCisjZGVmaW5lIFBST0NfU0lHVFJBTVBfTUFHSUMJMHgwZTBmMGYwZgorI2RlZmluZSBQUk9DX0RFU0NfSVNfRFlOX1NJR1RSQU1QKHByb2MpICgocHJvYyktPnBkci5pc3ltCQlcCisJCQkJCSA9PSBQUk9DX1NJR1RSQU1QX01BR0lDKQorI3VuZGVmIFNFVF9QUk9DX0RFU0NfSVNfRFlOX1NJR1RSQU1QCisjZGVmaW5lIFNFVF9QUk9DX0RFU0NfSVNfRFlOX1NJR1RSQU1QKHByb2MpICgocHJvYyktPnBkci5pc3ltCQlcCisJCQkJCSAgICAgPSBQUk9DX1NJR1RSQU1QX01BR0lDKQorCisvKiBJZiBQQyBpcyBpbnNpZGUgYSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgc2lndHJhbXAgZnVuY3Rpb24sIHJldHVybgorICAgaG93IG1hbnkgYnl0ZXMgdGhlIHByb2dyYW0gY291bnRlciBpcyBiZXlvbmQgdGhlIHN0YXJ0IG9mIHRoYXQKKyAgIGZ1bmN0aW9uLiAgT3RoZXJ3aXNlLCByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZS4gICovCisKKyN1bmRlZiBEWU5BTUlDX1NJR1RSQU1QX09GRlNFVAorI2RlZmluZSBEWU5BTUlDX1NJR1RSQU1QX09GRlNFVChwYykJKGFscGhhX2xpbnV4X3NpZ3RyYW1wX29mZnNldCAocGMpKQorCisvKiBUcmFuc2xhdGUgYSBzaWduYWwgaGFuZGxlciBmcmFtZSBpbnRvIHRoZSBhZGRyZXNzIG9mIHRoZSBzaWdjb250ZXh0CisgICBzdHJ1Y3R1cmUuICAqLworCisjdW5kZWYgU0lHQ09OVEVYVF9BRERSCisjZGVmaW5lIFNJR0NPTlRFWFRfQUREUihmcmFtZSkJCQkoKGZyYW1lKS0+ZnJhbWUgLSAweDI5OCkKKworLyogSWYgRlJBTUUgcmVmZXJzIHRvIGEgc2lndHJhbXAgZnJhbWUsIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBmcmFtZS4KKworICAgVW5kZXIgTGludXgsIHNpZ3RyYW1wIGhhbmRsZXJzIGhhdmUgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIHByb2NlZHVyZQorICAgZGVzY3JpcHRvcnMgdGhhdCBtYWtlIHRoaXMgaGFjayB1bm5lY2Vzc2FyeS4gICovCisKKyN1bmRlZiBGUkFNRV9QQVNUX1NJR1RSQU1QX0ZSQU1FCisjZGVmaW5lIEZSQU1FX1BBU1RfU0lHVFJBTVBfRlJBTUUoZnJhbWUsIHBjKQkoMCkKKworLyogV2UgbmVlZCB0aGlzIGZvciB0aGUgU09MSUJfVFJBTVBPTElORSBzdHVmZi4gICovCisjaW5jbHVkZSAidG0tc3lzdjQuaCIKKworI2VuZGlmIC8qIFRNX0xJTlVYQUxQSEFfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hbHBoYS94bS1hbHBoYWxpbnV4LmggYi9nZGIvY29uZmlnL2FscGhhL3htLWFscGhhbGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2FlYWIwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9hbHBoYS94bS1hbHBoYWxpbnV4LmgKQEAgLTAsMCArMSwyOSBAQAorLyogSG9zdCBkZWZpbml0aW9ucyBmb3IgR0RCIHJ1bm5pbmcgb24gYW4gQWxwaGEgdW5kZXIgTGludXgKKyAgIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIChIT1NUX0JZVEVfT1JERVIpCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisjZW5kaWYKKworLyogVGhlIGFscGhhIGhhcyBubyBzaWdpbnRlcnJ1cHQgcm91dGluZS4gICovCisjZGVmaW5lIE5PX1NJR0lOVEVSUlVQVAorCisjZGVmaW5lIEhBVkVfVEVSTUlPUworI2RlZmluZSBIQVZFX1NJR1NFVE1BU0sJMQorI2RlZmluZSBVU0cKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvYWxwaGEveG0tYWxwaGFvc2YuaCBiL2dkYi9jb25maWcvYWxwaGEveG0tYWxwaGFvc2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGI3ZmUwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9hbHBoYS94bS1hbHBoYW9zZi5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qIEhvc3QgZGVmaW5pdGlvbnMgZm9yIEdEQiBydW5uaW5nIG9uIGFuIGFscGhhIHVuZGVyIE9TRi8xCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCAoSE9TVF9CWVRFX09SREVSKQorI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgorI2VuZGlmCisKKy8qIFRoZSBhbHBoYSBoYXMgbm8gc2lnaW50ZXJydXB0IHJvdXRpbmUuICAqLworI2RlZmluZSBOT19TSUdJTlRFUlJVUFQKKworI2RlZmluZSBIQVZFX1RFUk1JT1MKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvYXJjL2FyYy5tdCBiL2dkYi9jb25maWcvYXJjL2FyYy5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWU4YzNkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9hcmMvYXJjLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IEFSQyBwcm9jZXNzb3IKK1RERVBGSUxFUyA9IGFyYy10ZGVwLm8KK1RNX0ZJTEUgPSB0bS1hcmMuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hcmMvdG0tYXJjLmggYi9nZGIvY29uZmlnL2FyYy90bS1hcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTY0YmVmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9hcmMvdG0tYXJjLmgKQEAgLTAsMCArMSwzNDcgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIHRhcmdldCBtYWNoaW5lIEFSQywgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFVzZWQgYnkgYXJjLXRkZXAuYyB0byBzZXQgdGhlIGRlZmF1bHQgY3B1IHR5cGUuICAqLworI2RlZmluZSBERUZBVUxUX0FSQ19DUFVfVFlQRSAiYmFzZSIKKworLyogQnl0ZSBvcmRlciBpcyBzZWxlY3RhYmxlLiAgKi8KKyNkZWZpbmUJVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRQorCisvKiBXZSBoYXZlIElFRUUgZmxvYXRpbmcgcG9pbnQsIGlmIHdlIGhhdmUgYW55IGZsb2F0IGF0IGFsbC4gICovCisjZGVmaW5lIElFRUVfRkxPQVQKKworLyogT2Zmc2V0IGZyb20gYWRkcmVzcyBvZiBmdW5jdGlvbiB0byBzdGFydCBvZiBpdHMgY29kZS4KKyAgIFplcm8gb24gbW9zdCBtYWNoaW5lcy4gICovCisjZGVmaW5lIEZVTkNUSU9OX1NUQVJUX09GRlNFVCAwCisKKy8qIEFkdmFuY2UgUEMgYWNyb3NzIGFueSBmdW5jdGlvbiBlbnRyeSBwcm9sb2d1ZSBpbnN0cnVjdGlvbnMKKyAgIHRvIHJlYWNoIHNvbWUgInJlYWwiIGNvZGUuICBTS0lQX1BST0xPR1VFX0ZSQU1FTEVTU19QIGFkdmFuY2VzCisgICB0aGUgUEMgcGFzdCBzb21lIG9mIHRoZSBwcm9sb2d1ZSwgYnV0IHN0b3BzIGFzIHNvb24gYXMgaXQKKyAgIGtub3dzIHRoYXQgdGhlIGZ1bmN0aW9uIGhhcyBhIGZyYW1lLiAgSXRzIHJlc3VsdCBpcyBlcXVhbAorICAgdG8gaXRzIGlucHV0IFBDIGlmIHRoZSBmdW5jdGlvbiBpcyBmcmFtZWxlc3MsIHVuZXF1YWwgb3RoZXJ3aXNlLiAgKi8KKworI2RlZmluZSBTS0lQX1BST0xPR1VFKHBjKSBcCisgIHsgcGMgPSBza2lwX3Byb2xvZ3VlIChwYywgMCk7IH0KKyNkZWZpbmUgU0tJUF9QUk9MT0dVRV9GUkFNRUxFU1NfUChwYykgXAorICB7IHBjID0gc2tpcF9wcm9sb2d1ZSAocGMsIDEpOyB9CitleHRlcm4gQ09SRV9BRERSIHNraXBfcHJvbG9ndWUgUEFSQU1TICgoQ09SRV9BRERSLCBpbnQpKTsKKworLyogU2VxdWVuY2Ugb2YgYnl0ZXMgZm9yIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uCisgICA/Pz8gVGhlIGN1cnJlbnQgdmFsdWUgaXMgInNyIC0xLFstMV0iIGFuZCBpcyBmb3IgdGhlIHNpbXVsYXRvciBvbmx5LgorICAgVGhlIHNpbXVsYXRvciB3YXRjaGVzIGZvciB0aGlzIGFuZCBkb2VzIHRoZSByaWdodCB0aGluZy4KKyAgIFRoZSBoYXJkd2FyZSB2ZXJzaW9uIHdpbGwgaGF2ZSB0byBhc3NvY2lhdGUgd2l0aCBlYWNoIGJyZWFrcG9pbnQKKyAgIHRoZSBzZXF1ZW5jZSAiZmxhZyAxOyBub3A7IG5vcDsgbm9wIi4gIElFOiBUaGUgYnJlYWtwb2ludCBpbnNuIHdpbGwgbm90CisgICBiZSBhIGZpeGVkIHNldCBvZiBiaXRzIGJ1dCBpbnN0ZWFkIHdpbGwgYmUgYSBicmFuY2ggdG8gYSBzZW1pLXJhbmRvbQorICAgYWRkcmVzcy4gIFByZXN1bWFibHkgdGhpcyB3aWxsIGJlIGNsZWFuZWQgdXAgZm9yICJzZWNvbmQgc2lsaWNvbiIuICAqLworI2RlZmluZSBCSUdfQlJFQUtQT0lOVCB7IDB4MTIsIDB4MWYsIDB4ZmYsIDB4ZmYgfQorI2RlZmluZSBMSVRUTEVfQlJFQUtQT0lOVCB7IDB4ZmYsIDB4ZmYsIDB4MWYsIDB4MTIgfQorCisvKiBHaXZlbiB0aGUgZXhwb3NlZCBwaXBlbGluZSwgdGhlcmUgaXNuJ3QgYW55IG9uZSBjb3JyZWN0IHZhbHVlLgorICAgSG93ZXZlciwgdGhpcyB2YWx1ZSBtdXN0IGJlIDQuICBHREIgY2FuJ3QgaGFuZGxlIGFueSBvdGhlciB2YWx1ZSAob3RoZXIgdGhhbgorICAgemVybykuICBTZWUgZm9yIGV4YW1wbGUgaW5mcnVuLmM6CisgICAicHJldl9wYyAhPSBzdG9wX3BjIC0gREVDUl9QQ19BRlRFUl9CUkVBSyIgICovCisvKiBGSVhNRSAqLworI2RlZmluZSBERUNSX1BDX0FGVEVSX0JSRUFLIDgKKworLyogV2UgZG9uJ3QgaGF2ZSBhIHJlbGlhYmxlIHNpbmdsZSBzdGVwIGZhY2lsaXR5LgorICAgPz8/IFdlIGRvIGhhdmUgYSBjeWNsZSBzaW5nbGUgc3RlcCBmYWNpbGl0eSwgYnV0IHRoYXQgd29uJ3Qgd29yay4gICovCisjZGVmaW5lIFNPRlRXQVJFX1NJTkdMRV9TVEVQX1AgMQorZXh0ZXJuIHZvaWQgYXJjX3NvZnR3YXJlX3NpbmdsZV9zdGVwIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgaW50KSk7CisjZGVmaW5lIFNPRlRXQVJFX1NJTkdMRV9TVEVQKHNpZyxicF9wKSBhcmNfc29mdHdhcmVfc2luZ2xlX3N0ZXAgKHNpZywgYnBfcCkKKworLyogRklYTUU6IE5lZWQgdG8gc2V0IFNURVBfU0tJUFNfREVMQVkuICAqLworCisvKiBHaXZlbiBhIHBjIHZhbHVlIGFzIGRlZmluZWQgYnkgdGhlIGhhcmR3YXJlLCByZXR1cm4gdGhlIHJlYWwgYWRkcmVzcy4KKyAgIFJlbWVtYmVyIHRoYXQgb24gdGhlIEFSQyBibGluayBjb250YWlucyB0aGF0IHN0YXR1cyByZWdpc3RlciB3aGljaAorICAgaW5jbHVkZXMgUEMgKyBmbGFncyAoc28gd2UgaGF2ZSB0byBtYXNrIG91dCB0aGUgZmxhZ3MpLiAgKi8KKyNkZWZpbmUgQVJDX1BDX1RPX1JFQUxfQUREUkVTUyhwYykgKCgocGMpICYgMHhmZmZmZmYpIDw8IDIpCisKKy8qIEltbWVkaWF0ZWx5IGFmdGVyIGEgZnVuY3Rpb24gY2FsbCwgcmV0dXJuIHRoZSBzYXZlZCBwYy4KKyAgIENhbid0IGFsd2F5cyBnbyB0aHJvdWdoIHRoZSBmcmFtZXMgZm9yIHRoaXMgYmVjYXVzZSBvbiBzb21lIG1hY2hpbmVzCisgICB0aGUgbmV3IGZyYW1lIGlzIG5vdCBzZXQgdXAgdW50aWwgdGhlIG5ldyBmdW5jdGlvbgorICAgZXhlY3V0ZXMgc29tZSBpbnN0cnVjdGlvbnMuICAqLworCisjZGVmaW5lIFNBVkVEX1BDX0FGVEVSX0NBTEwoZnJhbWUpIFwKKyAgKEFSQ19QQ19UT19SRUFMX0FERFJFU1MgKHJlYWRfcmVnaXN0ZXIgKEJMSU5LX1JFR05VTSkpKQorCisvKiBTdGFjayBncm93cyB1cHdhcmQgKi8KKworI2RlZmluZSBJTk5FUl9USEFOKGxocyxyaHMpICgobGhzKSA8IChyaHMpKQorCisvKiBTYXkgaG93IGxvbmcgKG9yZGluYXJ5KSByZWdpc3RlcnMgYXJlLiAgVGhpcyBpcyBhIHBpZWNlIG9mIGJvZ29zaXR5CisgICB1c2VkIGluIHB1c2hfd29yZCBhbmQgYSBmZXcgb3RoZXIgcGxhY2VzOyBSRUdJU1RFUl9SQVdfU0laRSBpcyB0aGUKKyAgIHJlYWwgd2F5IHRvIGtub3cgaG93IGJpZyBhIHJlZ2lzdGVyIGlzLiAgKi8KKyNkZWZpbmUgUkVHSVNURVJfU0laRSA0CisKKy8qIE51bWJlciBvZiBtYWNoaW5lIHJlZ2lzdGVycyAqLworI2RlZmluZSBOVU1fUkVHUyA5MgorCisvKiBJbml0aWFsaXplciBmb3IgYW4gYXJyYXkgb2YgbmFtZXMgb2YgcmVnaXN0ZXJzLgorICAgVGhlcmUgc2hvdWxkIGJlIE5VTV9SRUdTIHN0cmluZ3MgaW4gdGhpcyBpbml0aWFsaXplci4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfTkFNRVMgXAoreyBcCisgICAgLyogIDAgKi8gInIwIiwgICJyMSIsICAicjIiLCAgInIzIiwgICJyNCIsICAicjUiLCAgInI2IiwgICJyNyIsIFwKKyAgICAvKiAgOCAqLyAicjgiLCAgInI5IiwgICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIsIFwKKyAgICAvKiAxNiAqLyAicjE2IiwgInIxNyIsICJyMTgiLCAicjE5IiwgInIyMCIsICJyMjEiLCAicjIyIiwgInIyMyIsIFwKKyAgICAvKiAyNCAqLyAicjI0IiwgInIyNSIsICJyMjYiLCAiZnAiLCAic3AiLCAiaWxpbmsxIiwgImlsaW5rMiIsICJibGluayIsIFwKKyAgICAvKiAzMiAqLyAicjMyIiwgInIzMyIsICJyMzQiLCAicjM1IiwgInIzNiIsICJyMzciLCAicjM4IiwgInIzOSIsIFwKKyAgICAvKiA0MCAqLyAicjQwIiwgInI0MSIsICJyNDIiLCAicjQzIiwgInI0NCIsICJyNDUiLCAicjQ2IiwgInI0NyIsIFwKKyAgICAvKiA0OCAqLyAicjQ4IiwgInI0OSIsICJyNTAiLCAicjUxIiwgInI1MiIsICJyNTMiLCAicjU0IiwgInI1NSIsIFwKKyAgICAvKiA1NiAqLyAicjU2IiwgIm1sbyIsICJtbWlkIiwgIm1oaSIsICJscF9jb3VudCIsIFwKKyAgICAvKiA2MSAqLyAic3RhdHVzIiwgInNlbWEiLCAibHBfc3RhcnQiLCAibHBfZW5kIiwgImlkZW50aXR5IiwgImRlYnVnIiwgXAorICAgIC8qIDY3ICovICJhdXgxMCIsICJhdXgxMSIsICJhdXgxMiIsICJhdXgxMyIsICJhdXgxNCIsIFwKKyAgICAvKiA3MiAqLyAiYXV4MTUiLCAiYXV4MTYiLCAiYXV4MTciLCAiYXV4MTgiLCAiYXV4MTkiLCBcCisgICAgLyogNzcgKi8gImF1eDFhIiwgImF1eDFiIiwgImF1eDFjIiwgImF1eDFkIiwgImF1eDFlIiwgXAorICAgIC8qIDgyICovICJhdXgxZiIsICJhdXgyMCIsICJhdXgyMSIsICJhdXgyMiIsIFwKKyAgICAvKiA4NiAqLyAiYXV4MzAiLCAiYXV4MzEiLCAiYXV4MzIiLCAiYXV4MzMiLCAiYXV4NDAiLCBcCisgICAgLyogOTEgKi8gInBjIiBcCit9CisKKy8qIFJlZ2lzdGVyIG51bWJlcnMgb2YgdmFyaW91cyBpbXBvcnRhbnQgcmVnaXN0ZXJzICh1c2VkIHRvIGluZGV4CisgICBpbnRvIGFycmF5cyBvZiByZWdpc3RlciBuYW1lcyBhbmQgcmVnaXN0ZXIgdmFsdWVzKS4gICovCisKKyNkZWZpbmUgUjBfUkVHTlVNICAgMAkgICAvKiBGaXJzdCBsb2NhbCByZWdpc3RlcgkJKi8KKyNkZWZpbmUgUjU5X1JFR05VTSA1OQkgICAvKiBMYXN0IGxvY2FsIHJlZ2lzdGVyCQkqLworI2RlZmluZSBGUF9SRUdOVU0gIDI3CSAgIC8qIENvbnRhaW5zIGFkZHJlc3Mgb2YgZXhlY3V0aW5nIHN0YWNrIGZyYW1lICovCisjZGVmaW5lIFNQX1JFR05VTSAgMjggICAgICAvKiBzdGFjayBwb2ludGVyICovCisjZGVmaW5lIEJMSU5LX1JFR05VTSAzMSAgICAvKiBsaW5rIHJlZ2lzdGVyICovCisjZGVmaW5lCVNUQV9SRUdOVU0gNjEJICAgLyogcHJvY2Vzc29yIHN0YXR1cyB3b3JkICovCisjZGVmaW5lIFBDX1JFR05VTSAgOTEJICAgLyogaW5zdHJ1Y3Rpb24gcG9pbnRlciAqLworI2RlZmluZSBBVVhfQkVHX1JFR05VTSAgNjEgLyogYXV4IHJlZyBiZWdpbnMgKi8KKyNkZWZpbmUgQVVYX0VORF9SRUdOVU0gIDkwIC8qIGF1eCByZWcgZW5kcywgcGMgbm90IHJlYWwgYXV4IHJlZyAqLworCisvKiBGYWtlIHJlZ2lzdGVycyB1c2VkIHRvIG1hcmsgaW1tZWRpYXRlIGRhdGEuICAqLworI2RlZmluZSBTSElNTV9GTEFHX1JFR05VTSA2MQorI2RlZmluZSBMSU1NX1JFR05VTSA2MgorI2RlZmluZSBTSElNTV9SRUdOVU0gNjMKKworI2RlZmluZSBBVVhfUkVHX01BUCBcCit7IFwKKyAgIHsgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgXAorICAgICAxNiwgLTEsIC0xLCAtMSwgLTEsIFwKKyAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCBcCisgICAgIC0xLCAtMSwgLTEsIC0xLCAzMCwgXAorICAgICAtMSwgMzIsIDMzLCAtMSwgXAorICAgICAgNDgsIDQ5LCA1MCwgNTEsIDY0LCBcCisgICAgICAwIFwKKyAgICB9LCBcCisgICB7ICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsIFwKKyAgICAgMTYsIC0xLCAtMSwgLTEsIC0xLCBcCisgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgXAorICAgICAtMSwgLTEsIC0xLCAtMSwgMzAsIFwKKyAgICAgMzEsIDMyLCAzMywgLTEsIFwKKyAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCBcCisgICAgICAwIFwKKyAgICB9LCBcCisgICB7ICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsIFwKKyAgICAgIDE2LCAxNywgMTgsIDE5LCAyMCwgXAorICAgICAgMjEsIDIyLCAyMywgMjQsIDI1LCBcCisgICAgICAyNiwgMjcsIDI4LCAyOSwgMzAsIFwKKyAgICAgIDMxLCAzMiwgMzMsIDM0LCBcCisgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgXAorICAgICAgMCBcCisgICAgfSBcCit9CisgICAKKyNkZWZpbmUgUEZQX1JFR05VTSBSMF9SRUdOVU0JLyogUHJldmlvdXMgZnJhbWUgcG9pbnRlcgkqLworCisvKiBUb3RhbCBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIHRvIHN0b3JlIG91ciBjb3BpZXMgb2YgdGhlIG1hY2hpbmUncworICAgcmVnaXN0ZXIgc3RhdGUsIHRoZSBhcnJheSBgcmVnaXN0ZXJzJy4gICovCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTIChOVU1fUkVHUyAqIDQpCisKKy8qIEluZGV4IHdpdGhpbiBgcmVnaXN0ZXJzJyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3BhY2UgZm9yIHJlZ2lzdGVyIE4uICAqLworI2RlZmluZSBSRUdJU1RFUl9CWVRFKE4pICg0KihOKSkKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIGFjdHVhbCBtYWNoaW5lIHJlcHJlc2VudGF0aW9uCisgICBmb3IgcmVnaXN0ZXIgTi4gKi8KKyNkZWZpbmUgUkVHSVNURVJfUkFXX1NJWkUoTikgNAorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgcHJvZ3JhbSdzIHJlcHJlc2VudGF0aW9uIGZvciByZWdpc3RlciBOLiAqLworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUoTikgNAorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1JBV19TSVpFIGNhbiBoYXZlLiAgKi8KKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1JBV19TSVpFIDQKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUgY2FuIGhhdmUuICAqLworI2RlZmluZSBNQVhfUkVHSVNURVJfVklSVFVBTF9TSVpFIDQKKworLyogUmV0dXJuIHRoZSBHREIgdHlwZSBvYmplY3QgZm9yIHRoZSAic3RhbmRhcmQiIGRhdGEgdHlwZQorICAgb2YgZGF0YSBpbiByZWdpc3RlciBOLiAgKi8KKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9UWVBFKE4pIChidWlsdGluX3R5cGVfaW50KQorCisMCisvKiBNYWNyb3MgZm9yIHVuZGVyc3RhbmRpbmcgZnVuY3Rpb24gcmV0dXJuIHZhbHVlcy4uLiAqLworCisvKiBEb2VzIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gdXNlIHRoZSAic3RydWN0IHJldHVybmluZyIgY29udmVudGlvbgorICAgb3IgdGhlICJ2YWx1ZSByZXR1cm5pbmciIGNvbnZlbnRpb24/ICBUaGUgInZhbHVlIHJldHVybmluZyIgY29udmVudGlvbgorICAgYWxtb3N0IGludmFyaWFibHkgcmV0dXJucyB0aGUgZW50aXJlIHZhbHVlIGluIHJlZ2lzdGVycy4gIFRoZQorICAgInN0cnVjdCByZXR1cm5pbmciIGNvbnZlbnRpb24gb2Z0ZW4gcmV0dXJucyB0aGUgZW50aXJlIHZhbHVlIGluCisgICBtZW1vcnksIGFuZCBwYXNzZXMgYSBwb2ludGVyIChvdXQgb2Ygb3IgaW50byB0aGUgZnVuY3Rpb24pIHNheWluZworICAgd2hlcmUgdGhlIHZhbHVlIChpcyBvciBzaG91bGQgZ28pLgorCisgICBTaW5jZSB0aGlzIHNvbWV0aW1lcyBkZXBlbmRzIG9uIHdoZXRoZXIgaXQgd2FzIGNvbXBpbGVkIHdpdGggR0NDLAorICAgdGhpcyBpcyBhbHNvIGFuIGFyZ3VtZW50LiAgVGhpcyBpcyB1c2VkIGluIGNhbGxfZnVuY3Rpb24gdG8gYnVpbGQgYQorICAgc3RhY2ssIGFuZCBpbiB2YWx1ZV9iZWluZ19yZXR1cm5lZCB0byBwcmludCByZXR1cm4gdmFsdWVzLgorCisgICBPbiBhcmMsIGEgc3RydWN0dXJlIGlzIGFsd2F5cyByZXR1bnJlZCB3aXRoIHBvaW50ZXIgaW4gcjAuICovCisKKyNkZWZpbmUgVVNFX1NUUlVDVF9DT05WRU5USU9OKGdjY19wLCB0eXBlKSAxCisKKy8qIEV4dHJhY3QgZnJvbSBhbiBhcnJheSBSRUdCVUYgY29udGFpbmluZyB0aGUgKHJhdykgcmVnaXN0ZXIgc3RhdGUKKyAgIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIG9mIHR5cGUgVFlQRSwgYW5kIGNvcHkgdGhhdCwgaW4gdmlydHVhbCBmb3JtYXQsCisgICBpbnRvIFZBTEJVRi4gIFRoaXMgaXMgb25seSBjYWxsZWQgaWYgVVNFX1NUUlVDVF9DT05WRU5USU9OIGZvciB0aGlzCisgICB0eXBlIGlzIDAuCisqLworI2RlZmluZSBFWFRSQUNUX1JFVFVSTl9WQUxVRShUWVBFLFJFR0JVRixWQUxCVUYpIFwKKwltZW1jcHkoVkFMQlVGLCBSRUdCVUYrUkVHSVNURVJfQllURShSMF9SRUdOVU0pLCBUWVBFX0xFTkdUSCAoVFlQRSkpCisKKy8qIElmIFVTRV9TVFJVQ1RfQ09OVkVOVElPTiBwcm9kdWNlcyBhIDEsIAorICAgZXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgdGhlIGFkZHJlc3MgaW4gd2hpY2ggYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGl0cyBzdHJ1Y3R1cmUgdmFsdWUsCisgICBhcyBhIENPUkVfQUREUiAob3IgYW4gZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIG9uZSkuICovCisjZGVmaW5lIEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MoUkVHQlVGKSBcCisgICAoZXJyb3IoIkRvbid0IGtub3cgd2hlcmUgbGFyZ2Ugc3RydWN0dXJlIGlzIHJldHVybmVkIG9uIGFyYyIpLCAwKQorCisvKiBXcml0ZSBpbnRvIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZQorICAgb2YgdHlwZSBUWVBFLCBnaXZlbiBpbiB2aXJ0dWFsIGZvcm1hdCwgZm9yICJ2YWx1ZSByZXR1cm5pbmciIGZ1bmN0aW9ucy4KKyAgIEZvciAncmV0dXJuJyBjb21tYW5kOiAgbm90ICh5ZXQpIGltcGxlbWVudGVkIGZvciBhcmMuICAqLworI2RlZmluZSBTVE9SRV9SRVRVUk5fVkFMVUUoVFlQRSxWQUxCVUYpIFwKKyAgICBlcnJvciAoIlJldHVybmluZyB2YWx1ZXMgZnJvbSBmdW5jdGlvbnMgaXMgbm90IGltcGxlbWVudGVkIGluIGFyYyBnZGIiKQorCisvKiBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUgcGxhY2UgaW4gd2hpY2ggdG8gY29weSB0aGUgc3RydWN0dXJlIHRoZQorICAgc3Vicm91dGluZSB3aWxsIHJldHVybi4gIFRoaXMgaXMgY2FsbGVkIGZyb20gY2FsbF9mdW5jdGlvbi4gKi8KKyNkZWZpbmUgU1RPUkVfU1RSVUNUX1JFVFVSTihBRERSLCBTUCkgXAorICAgIGVycm9yICgiUmV0dXJuaW5nIHZhbHVlcyBmcm9tIGZ1bmN0aW9ucyBpcyBub3QgaW1wbGVtZW50ZWQgaW4gYXJjIGdkYiIpCisKKwwKKy8qIERlc2NyaWJlIHRoZSBwb2ludGVyIGluIGVhY2ggc3RhY2sgZnJhbWUgdG8gdGhlIHByZXZpb3VzIHN0YWNrIGZyYW1lCisgICAoaXRzIGNhbGxlcikuICAqLworCisvKiBXZSBjYWNoZSBpbmZvcm1hdGlvbiBhYm91dCBzYXZlZCByZWdpc3RlcnMgaW4gdGhlIGZyYW1lIHN0cnVjdHVyZSwKKyAgIHRvIHNhdmUgdXMgZnJvbSBoYXZpbmcgdG8gcmUtc2NhbiBmdW5jdGlvbiBwcm9sb2d1ZXMgZXZlcnkgdGltZQorICAgYSByZWdpc3RlciBpbiBhIG5vbi1jdXJyZW50IGZyYW1lIGlzIGFjY2Vzc2VkLiAgKi8KKworI2RlZmluZSBFWFRSQV9GUkFNRV9JTkZPIFwKKwlzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqZnNyOyBcCisJQ09SRV9BRERSIGFyZ19wb2ludGVyOworCisvKiBaZXJvIHRoZSBmcmFtZV9zYXZlZF9yZWdzIHBvaW50ZXIgd2hlbiB0aGUgZnJhbWUgaXMgaW5pdGlhbGl6ZWQsCisgICBzbyB0aGF0IEZSQU1FX0ZJTkRfU0FWRURfUkVHUyAoKSB3aWxsIGtub3cgdG8gYWxsb2NhdGUgYW5kCisgICBpbml0aWFsaXplIGEgZnJhbWVfc2F2ZWRfcmVncyBzdHJ1Y3QgdGhlIGZpcnN0IHRpbWUgaXQgaXMgY2FsbGVkLgorICAgU2V0IHRoZSBhcmdfcG9pbnRlciB0byAtMSwgd2hpY2ggaXMgbm90IHZhbGlkOyAwIGFuZCBvdGhlciB2YWx1ZXMKKyAgIGluZGljYXRlIHJlYWwsIGNhY2hlZCB2YWx1ZXMuICAqLworCisjZGVmaW5lIElOSVRfRVhUUkFfRlJBTUVfSU5GTyhmcm9tbGVhZiwgZmkpIFwKKwkoKGZpKS0+ZnNyID0gMCwgKGZpKS0+YXJnX3BvaW50ZXIgPSAtMSkKKworLyogRlJBTUVfQ0hBSU4gdGFrZXMgYSBmcmFtZSdzIG5vbWluYWwgYWRkcmVzcworICAgYW5kIHByb2R1Y2VzIHRoZSBmcmFtZSdzIGNoYWluLXBvaW50ZXIuCisgICBIb3dldmVyLCBpZiBGUkFNRV9DSEFJTl9WQUxJRCByZXR1cm5zIHplcm8sCisgICBpdCBtZWFucyB0aGUgZ2l2ZW4gZnJhbWUgaXMgdGhlIG91dGVybW9zdCBvbmUgYW5kIGhhcyBubyBjYWxsZXIuICAqLworLyogT24gdGhlIGFyYywgd2UgZ2V0IHRoZSBjaGFpbiBwb2ludGVyIGJ5IHJlYWRpbmcgdGhlIFBGUCBzYXZlZAorICAgb24gdGhlIHN0YWNrLiAqLworLyogVGhlIFBGUCBhbmQgUlBDIGlzIGluIGZwIGFuZCBmcCs0LiAgKi8KKworI2RlZmluZSBGUkFNRV9DSEFJTih0aGlzZnJhbWUpIFwKKyAgKHJlYWRfbWVtb3J5X2ludGVnZXIgKEZSQU1FX0ZQICh0aGlzZnJhbWUpLCA0KSkKKworLyogRlJBTUVfQ0hBSU5fVkFMSUQgcmV0dXJucyB6ZXJvIGlmIHRoZSBnaXZlbiBmcmFtZSBpcyB0aGUgb3V0ZXJtb3N0IG9uZQorICAgYW5kIGhhcyBubyBjYWxsZXIuICAqLworI2RlZmluZSBGUkFNRV9DSEFJTl9WQUxJRChjaGFpbiwgdGhpc2ZyYW1lKSBub25udWxsX2ZyYW1lX2NoYWluX3ZhbGlkIChjaGFpbiwgdGhpc2ZyYW1lKQorCisvKiBBIG1hY3JvIHRoYXQgdGVsbHMgdXMgd2hldGhlciB0aGUgZnVuY3Rpb24gaW52b2NhdGlvbiByZXByZXNlbnRlZAorICAgYnkgRkkgZG9lcyBub3QgaGF2ZSBhIGZyYW1lIG9uIHRoZSBzdGFjayBhc3NvY2lhdGVkIHdpdGggaXQuICBJZiBpdAorICAgZG9lcyBub3QsIEZSQU1FTEVTUyBpcyBzZXQgdG8gMSwgZWxzZSAwLiAgKi8KKworI2RlZmluZSBGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTihGSSwgRlJBTUVMRVNTKSBcCisgIGRvIHsgXAorICAgIGlmICgoRkkpLT5zaWduYWxfaGFuZGxlcl9jYWxsZXIpIFwKKyAgICAgIChGUkFNRUxFU1MpID0gMDsgXAorICAgIGVsc2UgXAorICAgICAgKEZSQU1FTEVTUykgPSBmcmFtZWxlc3NfbG9va19mb3JfcHJvbG9ndWUgKEZJKTsgXAorICB9IHdoaWxlICgwKQorCisvKiBXaGVyZSBpcyB0aGUgUEMgZm9yIGEgc3BlY2lmaWMgZnJhbWUuCisgICBBIGxlYWYgZnVuY3Rpb24gbWF5IG5ldmVyIHNhdmUgYmxpbmssIHNvIHdlIGhhdmUgdG8gY2hlY2sgZm9yIHRoYXQgaGVyZS4gICovCisKKyNkZWZpbmUgRlJBTUVfU0FWRURfUEMoZnJhbWUpIChhcmNfZnJhbWVfc2F2ZWRfcGMgKGZyYW1lKSkKK3N0cnVjdCBmcmFtZV9pbmZvOyAvKiBpbiBjYXNlIGZyYW1lLmggbm90IGluY2x1ZGVkIHlldCAqLworQ09SRV9BRERSIGFyY19mcmFtZV9zYXZlZF9wYyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisKKy8qIElmIHRoZSBhcmd1bWVudCBpcyBvbiB0aGUgc3RhY2ssIGl0IHdpbGwgYmUgaGVyZS4KKyAgIFdlIGNhY2hlIHRoaXMgdmFsdWUgaW4gdGhlIGZyYW1lIGluZm8gaWYgd2UndmUgYWxyZWFkeSBsb29rZWQgaXQgdXAuICAqLworLyogPz8/IElzIHRoZSBhcmdfcG9pbnRlciBjaGVjayBuZWNlc3Nhcnk/ICAqLworCisjZGVmaW5lIEZSQU1FX0FSR1NfQUREUkVTUyhmaSkgXAorICAoKChmaSktPmFyZ19wb2ludGVyICE9IC0xKSA/IChmaSktPmFyZ19wb2ludGVyIDogKGZpKS0+ZnJhbWUpCisKKy8qIFRoaXMgaXMgdGhlIHNhbWUgZXhjZXB0IGl0IHNob3VsZCByZXR1cm4gMCB3aGVuCisgICBpdCBkb2VzIG5vdCByZWFsbHkga25vdyB3aGVyZSB0aGUgYXJncyBhcmUsIHJhdGhlciB0aGFuIGd1ZXNzaW5nLgorICAgVGhpcyB2YWx1ZSBpcyBub3QgY2FjaGVkIHNpbmNlIGl0IGlzIG9ubHkgdXNlZCBpbmZyZXF1ZW50bHkuICAqLworCisjZGVmaW5lIEZSQU1FX0xPQ0FMU19BRERSRVNTKGZpKQkoKGZpKS0+ZnJhbWUpCisKKy8qIFNldCBOVU1BUkdTIHRvIHRoZSBudW1iZXIgb2YgYXJncyBwYXNzZWQgdG8gYSBmcmFtZS4KKyAgIENhbiByZXR1cm4gLTEsIG1lYW5pbmcgbm8gd2F5IHRvIHRlbGwuICAqLworCisjZGVmaW5lIEZSQU1FX05VTV9BUkdTKG51bWFyZ3MsIGZpKQkobnVtYXJncyA9IC0xKQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGF0IHN0YXJ0IG9mIGFyZ2xpc3QgdGhhdCBhcmUgbm90IHJlYWxseSBhcmdzLiAgKi8KKworI2RlZmluZSBGUkFNRV9BUkdTX1NLSVAgMAorCisvKiBQcm9kdWNlIHRoZSBwb3NpdGlvbnMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBpbiBhIHN0YWNrIGZyYW1lLiAgKi8KKworI2RlZmluZSBGUkFNRV9GSU5EX1NBVkVEX1JFR1MoZnJhbWVfaW5mb19hZGRyLCBzcikgXAorCWZyYW1lX2ZpbmRfc2F2ZWRfcmVncyAoZnJhbWVfaW5mb19hZGRyLCAmc3IpCitleHRlcm4gdm9pZCBmcmFtZV9maW5kX3NhdmVkX3JlZ3MoKTsJCS8qIFNlZSBhcmMtdGRlcC5jICovCisKKwwKKy8qIFRoaW5ncyBuZWVkZWQgZm9yIG1ha2luZyBjYWxscyB0byBmdW5jdGlvbnMgaW4gdGhlIGluZmVyaW9yIHByb2Nlc3MgKi8KKyNkZWZpbmUgUFVTSF9EVU1NWV9GUkFNRSBcCisJcHVzaF9kdW1teV9mcmFtZSAoKQorCisvKiBEaXNjYXJkIGZyb20gdGhlIHN0YWNrIHRoZSBpbm5lcm1vc3QgZnJhbWUsIHJlc3RvcmluZyBhbGwgcmVnaXN0ZXJzLiAgKi8KKyNkZWZpbmUgUE9QX0ZSQU1FIFwKKwlwb3BfZnJhbWUgKCkKKworLyogVGhpcyBzZXF1ZW5jZSBvZiB3b3JkcyBpcyB0aGUgaW5zdHJ1Y3Rpb25zICBibCB4eHh4LCBmbGFnIDEgKi8KKyNkZWZpbmUgQ0FMTF9EVU1NWSB7IDB4MjgwMDAwMDAsIDB4MWZiZTgwMDEgfSAgIAorI2RlZmluZSBDQUxMX0RVTU1ZX0xFTkdUSCA4CisKKy8qIFN0YXJ0IGV4ZWN1dGlvbiBhdCBiZWdpbm5pbmcgb2YgZHVtbXkgKi8KKyNkZWZpbmUgQ0FMTF9EVU1NWV9TVEFSVF9PRkZTRVQgMCAKKworLyogSW5zZXJ0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGFyZ3MgYW5kIGZ1bmN0aW9uIGFkZHJlc3MKKyAgIGludG8gYSBjYWxsIHNlcXVlbmNlIG9mIHRoZSBhYm92ZSBmb3JtIHN0b3JlZCBhdCAnZHVtbXluYW1lJy4qLyAgCisjZGVmaW5lIEZJWF9DQUxMX0RVTU1ZKGR1bW15bmFtZSwgcGMsIGZ1biwgbmFyZ3MsIGFyZ3MsIHR5cGUsIGdjY19wKSBcCit7IFwKKyAgICAgICAgaW50IGZyb20sIHRvLCBkZWx0YSwgbG9jOyBcCisgICAgICAgIGxvYyA9IChpbnQpKHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSkgLSBDQUxMX0RVTU1ZX0xFTkdUSCk7IFwKKyAgICAgICAgZnJvbSA9IGxvYyArIDQ7IFwKKyAgICAgICAgdG8gPSAoaW50KShmdW4pOyBcCisgICAgICAgIGRlbHRhID0gKHRvIC0gZnJvbSkgPj4gMjsgXAorICAgICAgICAqKChjaGFyICopKGR1bW15bmFtZSkgKyAxKSA9IChkZWx0YSAmIDB4MSk7IFwKKyAgICAgICAgKigoY2hhciAqKShkdW1teW5hbWUpICsgMikgPSAoKGRlbHRhID4+IDEpICYgMHhmZik7IFwKKyAgICAgICAgKigoY2hhciAqKShkdW1teW5hbWUpICsgMykgPSAoKGRlbHRhID4+IDkpICYgMHhmZik7IFwKKyAgICAgICAgKigoY2hhciAqKShkdW1teW5hbWUpICsgNCkgPSAoKGRlbHRhID4+IDE3KSAmIDB4Nyk7IFwKK30KKwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hcm0vYXJtLm1oIGIvZ2RiL2NvbmZpZy9hcm0vYXJtLm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmY2YwZGUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2FybS9hcm0ubWgKQEAgLTAsMCArMSw1IEBACisjIEhvc3Q6IEFjb3JuIFJJU0MgbWFjaGluZSBydW5uaW5nIFJJU0NpWCAoNC4zYnNkKQorWERFUEZJTEVTPSBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gZm9yay1jaGlsZC5vIGFybS14ZGVwLm8gYXJtLWNvbnZlcnQubyAKK1hNX0ZJTEU9IHhtLWFybS5oCisKK05BVF9GSUxFPSBubS1hcm0uaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hcm0vYXJtLm10IGIvZ2RiL2NvbmZpZy9hcm0vYXJtLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MzNjNDYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2FybS9hcm0ubXQKQEAgLTAsMCArMSw2IEBACisjIFRhcmdldDogQWNvcm4gUklTQyBtYWNoaW5lIChBUk0pIHdpdGggc2ltdWxhdG9yCitUREVQRklMRVM9IGFybS10ZGVwLm8gcmVtb3RlLXJkcC5vCitUTV9GSUxFPSB0bS1hcm0uaAorCitTSU1fT0JTID0gcmVtb3RlLXNpbS5vCitTSU0gPSAuLi9zaW0vYXJtL2xpYnNpbS5hCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2FybS9ubS1hcm0uaCBiL2dkYi9jb25maWcvYXJtL25tLWFybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MGE4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2FybS9ubS1hcm0uaApAQCAtMCwwICsxLDI3IEBACisvKiBEZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gYW4gQVJNIHVuZGVyIFJJU0NpWCAoNC4zYnNkKS4KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGlzIHRoZSBhbW91bnQgdG8gc3VidHJhY3QgZnJvbSB1LnVfYXIwCisgICB0byBnZXQgdGhlIG9mZnNldCBpbiB0aGUgY29yZSBmaWxlIG9mIHRoZSByZWdpc3RlciB2YWx1ZXMuICAqLworCisjZGVmaW5lIEtFUk5FTF9VX0FERFIgKDB4MDEwMDAwMDAgLSAoVVBBR0VTICogTkJQRykpCisKKy8qIE92ZXJyaWRlIGNvcGllcyBvZiB7ZmV0Y2gsc3RvcmV9X2luZmVyaW9yX3JlZ2lzdGVycyBpbiBpbmZwdHJhY2UuYy4gICovCisjZGVmaW5lIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9hcm0vdG0tYXJtLmggYi9nZGIvY29uZmlnL2FybS90bS1hcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzI3YWMzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9hcm0vdG0tYXJtLmgKQEAgLTAsMCArMSw0NTMgQEAKKy8qIERlZmluaXRpb25zIHRvIG1ha2UgR0RCIHRhcmdldCBmb3IgYW4gQVJNCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSwgMTk5MywgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgX19TVERDX18JCS8qIEZvcndhcmQgZGVjbHMgZm9yIHByb3RvdHlwZXMgKi8KK3N0cnVjdCB0eXBlOworc3RydWN0IHZhbHVlOworI2VuZGlmCisKKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRQorCisvKiBJRUVFIGZvcm1hdCBmbG9hdGluZyBwb2ludCAqLworCisjZGVmaW5lIElFRUVfRkxPQVQKKworLyogRklYTUU6IG1heSBuZWVkIGEgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfYmlnYnl0ZV9saXR0bGV3b3JkIGZvcm1hdCBmb3IKKyAgIEJJR19FTkRJQU4gdXNlLiAtZm5mICovCisKKyNkZWZpbmUgVEFSR0VUX0RPVUJMRV9GT1JNQVQgKHRhcmdldF9ieXRlX29yZGVyID09IEJJR19FTkRJQU4gXAorCQkJICAgICAgPyAmZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfYmlnIFwKKwkJCSAgICAgIDogJmZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZWJ5dGVfYmlnd29yZCkKKworLyogV2hlbiByZWFkaW5nIHN5bWJvbHMsIHdlIG5lZWQgdG8gemFwIHRoZSBsb3cgYml0IG9mIHRoZSBhZGRyZXNzLCB3aGljaAorICAgbWF5IGJlIHNldCB0byAxIGZvciBUaHVtYiBmdW5jdGlvbnMuICAqLworCisjZGVmaW5lIFNNQVNIX1RFWFRfQUREUkVTUyhhZGRyKSAoKGFkZHIpICY9IH4weDEpCisKKy8qIFJlbW92ZSB1c2VsZXNzIGJpdHMgZnJvbSBhZGRyZXNzZXMgaW4gYSBydW5uaW5nIHByb2dyYW0uICAqLworCitDT1JFX0FERFIgYXJtX2FkZHJfYml0c19yZW1vdmUgUEFSQU1TICgoQ09SRV9BRERSKSk7CisKKyNkZWZpbmUgQUREUl9CSVRTX1JFTU9WRSh2YWwpIChhcm1fYWRkcl9iaXRzX3JlbW92ZSAodmFsKSkKKworLyogT2Zmc2V0IGZyb20gYWRkcmVzcyBvZiBmdW5jdGlvbiB0byBzdGFydCBvZiBpdHMgY29kZS4KKyAgIFplcm8gb24gbW9zdCBtYWNoaW5lcy4gICovCisKKyNkZWZpbmUgRlVOQ1RJT05fU1RBUlRfT0ZGU0VUIDAKKworLyogQWR2YW5jZSBQQyBhY3Jvc3MgYW55IGZ1bmN0aW9uIGVudHJ5IHByb2xvZ3VlIGluc3RydWN0aW9ucworICAgdG8gcmVhY2ggc29tZSAicmVhbCIgY29kZS4gICovCisKK2V4dGVybiBDT1JFX0FERFIgYXJtX3NraXBfcHJvbG9ndWUgUEFSQU1TICgoQ09SRV9BRERSIHBjKSk7CisKKyNkZWZpbmUgU0tJUF9QUk9MT0dVRShwYykgeyBwYyA9IGFybV9za2lwX3Byb2xvZ3VlIChwYyk7IH0KKworLyogSW1tZWRpYXRlbHkgYWZ0ZXIgYSBmdW5jdGlvbiBjYWxsLCByZXR1cm4gdGhlIHNhdmVkIHBjLgorICAgQ2FuJ3QgYWx3YXlzIGdvIHRocm91Z2ggdGhlIGZyYW1lcyBmb3IgdGhpcyBiZWNhdXNlIG9uIHNvbWUgbWFjaGluZXMKKyAgIHRoZSBuZXcgZnJhbWUgaXMgbm90IHNldCB1cCB1bnRpbCB0aGUgbmV3IGZ1bmN0aW9uIGV4ZWN1dGVzCisgICBzb21lIGluc3RydWN0aW9ucy4gICovCisKKyNkZWZpbmUgU0FWRURfUENfQUZURVJfQ0FMTChmcmFtZSkgYXJtX3NhdmVkX3BjX2FmdGVyX2NhbGwgKGZyYW1lKQorc3RydWN0IGZyYW1lX2luZm87CitleHRlcm4gQ09SRV9BRERSIGFybV9zYXZlZF9wY19hZnRlcl9jYWxsIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworLyogSSBkb24ndCBrbm93IHRoZSByZWFsIHZhbHVlcyBmb3IgdGhlc2UuICAqLworI2RlZmluZSBUQVJHRVRfVVBBR0VTIFVQQUdFUworI2RlZmluZSBUQVJHRVRfTkJQRyBOQlBHCisKKy8qIEFkZHJlc3Mgb2YgZW5kIG9mIHN0YWNrIHNwYWNlLiAgKi8KKworI2RlZmluZSBTVEFDS19FTkRfQUREUiAoMHgwMTAwMDAwMCAtIChUQVJHRVRfVVBBR0VTICogVEFSR0VUX05CUEcpKQorCisvKiBTdGFjayBncm93cyBkb3dud2FyZC4gICovCisKKyNkZWZpbmUgSU5ORVJfVEhBTihsaHMscmhzKSAoKGxocykgPCAocmhzKSkKKworLyogISEhISBpZiB3ZSdyZSB1c2luZyBSRFAsIHRoZW4gd2UncmUgaW5zZXJ0aW5nIGJyZWFrcG9pbnRzIGFuZCBzdG9yaW5nCisgICB0aGVpciBoYW5kbGVzIGluc3RyZWFkIG9mIHdoYXQgd2FzIGluIG1lbW9yeS4gIEl0IGlzIG5pY2UgdGhhdAorICAgdGhpcyBpcyB0aGUgc2FtZSBzaXplIGFzIGEgaGFuZGxlIC0gb3RoZXJ3aXNlIHJlbW90ZS1yZHAgd2lsbAorICAgaGF2ZSB0byBjaGFuZ2UuICovCisKKy8qIEJSRUFLUE9JTlRfRlJPTV9QQyB1c2VzIHRoZSBwcm9ncmFtIGNvdW50ZXIgdmFsdWUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYQorICAgMTYtIG9yIDMyLWJpdCBicmVha3BvaW50IHNob3VsZCBiZSB1c2VkLiAgSXQgcmV0dXJucyBhIHBvaW50ZXIKKyAgIHRvIGEgc3RyaW5nIG9mIGJ5dGVzIHRoYXQgZW5jb2RlIGEgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiwgc3RvcmVzCisgICB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdG8gKmxlbnB0ciwgYW5kIGFkanVzdHMgdGhlIHBjIChpZiBuZWNlc3NhcnkpIHRvCisgICBwb2ludCB0byB0aGUgYWN0dWFsIG1lbW9yeSBsb2NhdGlvbiB3aGVyZSB0aGUgYnJlYWtwb2ludCBzaG91bGQgYmUKKyAgIGluc2VydGVkLiAgKi8KKworZXh0ZXJuIGJyZWFrcG9pbnRfZnJvbV9wY19mbiBhcm1fYnJlYWtwb2ludF9mcm9tX3BjOworI2RlZmluZSBCUkVBS1BPSU5UX0ZST01fUEMocGNwdHIsIGxlbnB0cikgYXJtX2JyZWFrcG9pbnRfZnJvbV9wYyAocGNwdHIsIGxlbnB0cikKKworLyogQW1vdW50IFBDIG11c3QgYmUgZGVjcmVtZW50ZWQgYnkgYWZ0ZXIgYSBicmVha3BvaW50LgorICAgVGhpcyBpcyBvZnRlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIEJSRUFLUE9JTlQKKyAgIGJ1dCBub3QgYWx3YXlzLiAgKi8KKworI2RlZmluZSBERUNSX1BDX0FGVEVSX0JSRUFLIDAKKworLyogY29kZSB0byBleGVjdXRlIHRvIHByaW50IGludGVyZXN0aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICogZmxvYXRpbmcgcG9pbnQgcHJvY2Vzc29yIChpZiBhbnkpCisgKiBObyBuZWVkIHRvIGRlZmluZSBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLgorICovCisjZGVmaW5lIEZMT0FUX0lORk8geyBhcm1fZmxvYXRfaW5mbyAoKTsgfQorCisvKiBTYXkgaG93IGxvbmcgKG9yZGluYXJ5KSByZWdpc3RlcnMgYXJlLiAgVGhpcyBpcyBhIHBpZWNlIG9mIGJvZ29zaXR5CisgICB1c2VkIGluIHB1c2hfd29yZCBhbmQgYSBmZXcgb3RoZXIgcGxhY2VzOyBSRUdJU1RFUl9SQVdfU0laRSBpcyB0aGUKKyAgIHJlYWwgd2F5IHRvIGtub3cgaG93IGJpZyBhIHJlZ2lzdGVyIGlzLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9TSVpFIDQKKworLyogTnVtYmVyIG9mIG1hY2hpbmUgcmVnaXN0ZXJzICovCisKKy8qIE5vdGU6IEkgbWFrZSBhIGZha2UgY29weSBvZiB0aGUgcGMgaW4gcmVnaXN0ZXIgMjUgKGNhbGxpbmcgaXQgcHMpIHNvCisgICB0aGF0IEkgY2FuIGNsZWFyIHRoZSBzdGF0dXMgYml0cyBmcm9tIHBjIChyZWdpc3RlciAxNSkgKi8KKworI2RlZmluZSBOVU1fUkVHUyAyNgorCisvKiBBbiBhcnJheSBvZiBuYW1lcyBvZiByZWdpc3RlcnMuICovCisKK2V4dGVybiBjaGFyICoqYXJtX3JlZ2lzdGVyX25hbWVzOworI2RlZmluZSBSRUdJU1RFUl9OQU1FKGkpIGFybV9yZWdpc3Rlcl9uYW1lc1tpXQorCisvKiBSZWdpc3RlciBudW1iZXJzIG9mIHZhcmlvdXMgaW1wb3J0YW50IHJlZ2lzdGVycy4KKyAgIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgInJlYWwiIHJlZ2lzdGVyIG51bWJlcnMsCisgICBhbmQgY29ycmVzcG9uZCB0byB0aGUgZ2VuZXJhbCByZWdpc3RlcnMgb2YgdGhlIG1hY2hpbmUsCisgICBhbmQgc29tZSBhcmUgInBob255IiByZWdpc3RlciBudW1iZXJzIHdoaWNoIGFyZSB0b28gbGFyZ2UKKyAgIHRvIGJlIGFjdHVhbCByZWdpc3RlciBudW1iZXJzIGFzIGZhciBhcyB0aGUgdXNlciBpcyBjb25jZXJuZWQKKyAgIGJ1dCBkbyBzZXJ2ZSB0byBnZXQgdGhlIGRlc2lyZWQgdmFsdWVzIHdoZW4gcGFzc2VkIHRvIHJlYWRfcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIEExX1JFR05VTSAwCQkvKiBmaXJzdCBpbnRlZ2VyLWxpa2UgYXJndW1lbnQgKi8KKyNkZWZpbmUgQTRfUkVHTlVNIDMJCS8qIGxhc3QgaW50ZWdlci1saWtlIGFyZ3VtZW50ICovCisjZGVmaW5lIEFQX1JFR05VTSAxMQorI2RlZmluZSBGUF9SRUdOVU0gMTEJCS8qIENvbnRhaW5zIGFkZHJlc3Mgb2YgZXhlY3V0aW5nIHN0YWNrIGZyYW1lICovCisjZGVmaW5lIFNQX1JFR05VTSAxMwkJLyogQ29udGFpbnMgYWRkcmVzcyBvZiB0b3Agb2Ygc3RhY2sgKi8KKyNkZWZpbmUgTFJfUkVHTlVNIDE0CQkvKiBhZGRyZXNzIHRvIHJldHVybiB0byBmcm9tIGEgZnVuY3Rpb24gY2FsbCAqLworI2RlZmluZSBQQ19SRUdOVU0gMTUJCS8qIENvbnRhaW5zIHByb2dyYW0gY291bnRlciAqLworI2RlZmluZSBGMF9SRUdOVU0gMTYJCS8qIGZpcnN0IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyICovCisjZGVmaW5lIEYzX1JFR05VTSAxOQkJLyogbGFzdCBmbG9hdGluZyBwb2ludCBhcmd1bWVudCByZWdpc3RlciAqLworI2RlZmluZSBGN19SRUdOVU0gMjMJCS8qIGxhc3QgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRlBTX1JFR05VTSAyNAkJLyogZmxvYXRpbmcgcG9pbnQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFBTX1JFR05VTSAyNQkJLyogQ29udGFpbnMgcHJvY2Vzc29yIHN0YXR1cyAqLworCisjZGVmaW5lIFRIVU1CX0ZQX1JFR05VTSA3CS8qIFI3IGlzIGZyYW1lIHJlZ2lzdGVyIG9uIFRodW1iICovCisKKyNkZWZpbmUgQVJNX05VTV9BUkdfUkVHUyAJNAorI2RlZmluZSBBUk1fTEFTVF9BUkdfUkVHTlVNIAlBNF9SRUdOVU0KKyNkZWZpbmUgQVJNX05VTV9GUF9BUkdfUkVHUyAJNAorI2RlZmluZSBBUk1fTEFTVF9GUF9BUkdfUkVHTlVNCUYzX1JFR05VTQorCisvKiBJbnN0cnVjdGlvbiBjb25kaXRpb24gZmllbGQgdmFsdWVzLiAgKi8KKyNkZWZpbmUgSU5TVF9FUQkJMHgwCisjZGVmaW5lIElOU1RfTkUJCTB4MQorI2RlZmluZSBJTlNUX0NTCQkweDIKKyNkZWZpbmUgSU5TVF9DQwkJMHgzCisjZGVmaW5lIElOU1RfTUkJCTB4NAorI2RlZmluZSBJTlNUX1BMCQkweDUKKyNkZWZpbmUgSU5TVF9WUwkJMHg2CisjZGVmaW5lIElOU1RfVkMJCTB4NworI2RlZmluZSBJTlNUX0hJCQkweDgKKyNkZWZpbmUgSU5TVF9MUwkJMHg5CisjZGVmaW5lIElOU1RfR0UJCTB4YQorI2RlZmluZSBJTlNUX0xUCQkweGIKKyNkZWZpbmUgSU5TVF9HVAkJMHhjCisjZGVmaW5lIElOU1RfTEUJCTB4ZAorI2RlZmluZSBJTlNUX0FMCQkweGUKKyNkZWZpbmUgSU5TVF9OVgkJMHhmCisKKyNkZWZpbmUgRkxBR19OCQkweDgwMDAwMDAwCisjZGVmaW5lIEZMQUdfWgkJMHg0MDAwMDAwMAorI2RlZmluZSBGTEFHX0MJCTB4MjAwMDAwMDAKKyNkZWZpbmUgRkxBR19WCQkweDEwMDAwMDAwCisKKworCisvKiBUb3RhbCBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIHRvIHN0b3JlIG91ciBjb3BpZXMgb2YgdGhlIG1hY2hpbmUncworICAgcmVnaXN0ZXIgc3RhdGUsIHRoZSBhcnJheSBgcmVnaXN0ZXJzJy4gICovCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTICgxNio0ICsgMTIqOCArIDQgKyA0KQorCisvKiBJbmRleCB3aXRoaW4gYHJlZ2lzdGVycycgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNwYWNlIGZvcgorICAgcmVnaXN0ZXIgTi4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfQllURShOKSAoKChOKSA8IEYwX1JFR05VTSkgPyAoTikqNCA6IFwKKwkJCSAgKCgoTikgPCBQU19SRUdOVU0pID8gMTYqNCArICgoTikgLSAxNikqMTIgOiBcCisJCQkgICAxNio0ICsgOCoxMiArICgoTikgLSBGUFNfUkVHTlVNKSAqIDQpKQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgYWN0dWFsIG1hY2hpbmUgcmVwcmVzZW50YXRpb24KKyAgIGZvciByZWdpc3RlciBOLiAgT24gdGhlIHZheCwgYWxsIHJlZ3MgYXJlIDQgYnl0ZXMuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pICgoKE4pIDwgRjBfUkVHTlVNIHx8IChOKSA+PSBGUFNfUkVHTlVNKSA/IDQgOiAxMikKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIHByb2dyYW0ncyByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICBPbiB0aGUgdmF4LCBhbGwgcmVncyBhcmUgNCBieXRlcy4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9TSVpFKE4pICgoKE4pIDwgRjBfUkVHTlVNIHx8IChOKSA+PSBGUFNfUkVHTlVNKSA/IDQgOiA4KQorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1JBV19TSVpFIGNhbiBoYXZlLiAgKi8KKworI2RlZmluZSBNQVhfUkVHSVNURVJfUkFXX1NJWkUgMTIgCisKKy8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfVklSVFVBTF9TSVpFIGNhbiBoYXZlLiAgKi8KKworI2RlZmluZSBNQVhfUkVHSVNURVJfVklSVFVBTF9TSVpFIDgKKworLyogTm9uemVybyBpZiByZWdpc3RlciBOIHJlcXVpcmVzIGNvbnZlcnNpb24KKyAgIGZyb20gcmF3IGZvcm1hdCB0byB2aXJ0dWFsIGZvcm1hdC4gICovCisjZGVmaW5lIFJFR0lTVEVSX0NPTlZFUlRJQkxFKE4pICgodW5zaWduZWQpKE4pIC0gRjBfUkVHTlVNIDwgOCkKKworLyogQ29udmVydCBkYXRhIGZyb20gcmF3IGZvcm1hdCBmb3IgcmVnaXN0ZXIgUkVHTlVNIGluIGJ1ZmZlciBGUk9NCisgICB0byB2aXJ0dWFsIGZvcm1hdCB3aXRoIHR5cGUgVFlQRSBpbiBidWZmZXIgVE8uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0NPTlZFUlRfVE9fVklSVFVBTChSRUdOVU0sVFlQRSxGUk9NLFRPKSBcCit7IFwKKyAgZG91YmxlIHZhbDsgXAorICBjb252ZXJ0X2Zyb21fZXh0ZW5kZWQgKChGUk9NKSwgJiB2YWwpOyBcCisgIHN0b3JlX2Zsb2F0aW5nICgoVE8pLCBUWVBFX0xFTkdUSCAoVFlQRSksIHZhbCk7IFwKK30KKworLyogQ29udmVydCBkYXRhIGZyb20gdmlydHVhbCBmb3JtYXQgd2l0aCB0eXBlIFRZUEUgaW4gYnVmZmVyIEZST00KKyAgIHRvIHJhdyBmb3JtYXQgZm9yIHJlZ2lzdGVyIFJFR05VTSBpbiBidWZmZXIgVE8uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXKFRZUEUsUkVHTlVNLEZST00sVE8pCVwKK3sgXAorICBkb3VibGUgdmFsID0gZXh0cmFjdF9mbG9hdGluZyAoKEZST00pLCBUWVBFX0xFTkdUSCAoVFlQRSkpOyBcCisgIGNvbnZlcnRfdG9fZXh0ZW5kZWQgKCZ2YWwsIChUTykpOyBcCit9CisvKiBSZXR1cm4gdGhlIEdEQiB0eXBlIG9iamVjdCBmb3IgdGhlICJzdGFuZGFyZCIgZGF0YSB0eXBlCisgICBvZiBkYXRhIGluIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRShOKSBcCisgKCgodW5zaWduZWQpKE4pIC0gRjBfUkVHTlVNKSA8IDggPyBidWlsdGluX3R5cGVfZG91YmxlIDogYnVpbHRpbl90eXBlX2ludCkKKwwKKy8qIFRoZSBzeXN0ZW0gQyBjb21waWxlciB1c2VzIGEgc2ltaWxhciBzdHJ1Y3R1cmUgcmV0dXJuIGNvbnZlbnRpb24gdG8gZ2NjICovCitleHRlcm4gdXNlX3N0cnVjdF9jb252ZW50aW9uX2ZuIGFybV91c2Vfc3RydWN0X2NvbnZlbnRpb247CisjZGVmaW5lIFVTRV9TVFJVQ1RfQ09OVkVOVElPTihnY2NfcCwgdHlwZSkgYXJtX3VzZV9zdHJ1Y3RfY29udmVudGlvbiAoZ2NjX3AsIHR5cGUpCisKKy8qIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBwbGFjZSBpbiB3aGljaCB0byBjb3B5IHRoZSBzdHJ1Y3R1cmUgdGhlCisgICBzdWJyb3V0aW5lIHdpbGwgcmV0dXJuLiAgVGhpcyBpcyBjYWxsZWQgZnJvbSBjYWxsX2Z1bmN0aW9uLiAqLworCisjZGVmaW5lIFNUT1JFX1NUUlVDVF9SRVRVUk4oQUREUiwgU1ApIFwKKyAgeyB3cml0ZV9yZWdpc3RlciAoMCwgKEFERFIpKTsgfQorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwgZm9ybWF0LAorICAgaW50byBWQUxCVUYuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKFRZUEUsUkVHQlVGLFZBTEJVRikgXAorICBpZiAoVFlQRV9DT0RFIChUWVBFKSA9PSBUWVBFX0NPREVfRkxUKQkJCQlcCisgICAgY29udmVydF9mcm9tX2V4dGVuZGVkIChSRUdCVUYgKyBSRUdJU1RFUl9CWVRFIChGMF9SRUdOVU0pLCBWQUxCVUYpOwlcCisgIGVsc2UJCQkJCQkJCQlcCisgICAgbWVtY3B5IChWQUxCVUYsIFJFR0JVRiwgVFlQRV9MRU5HVEggKFRZUEUpKQorCisvKiBXcml0ZSBpbnRvIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZQorICAgb2YgdHlwZSBUWVBFLCBnaXZlbiBpbiB2aXJ0dWFsIGZvcm1hdC4gICovCisKKyNkZWZpbmUgU1RPUkVfUkVUVVJOX1ZBTFVFKFRZUEUsVkFMQlVGKSBcCisgIGlmIChUWVBFX0NPREUgKFRZUEUpID09IFRZUEVfQ09ERV9GTFQpIHsJCQkJXAorICAgIGNoYXIgX2J1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOwkJCQkJXAorICAgIGNvbnZlcnRfdG9fZXh0ZW5kZWQgKFZBTEJVRiwgX2J1Zik7IAkJCQkJXAorICAgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFIChGMF9SRUdOVU0pLCBfYnVmLCBNQVhfUkVHSVNURVJfUkFXX1NJWkUpOyBcCisgIH0gZWxzZQkJCQkJCQkJXAorICAgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzICgwLCBWQUxCVUYsIFRZUEVfTEVOR1RIIChUWVBFKSkKKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgdGhlIGFkZHJlc3MgaW4gd2hpY2ggYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGl0cyBzdHJ1Y3R1cmUgdmFsdWUsCisgICBhcyBhIENPUkVfQUREUiAob3IgYW4gZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIG9uZSkuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MoUkVHQlVGKSAoKihpbnQgKikoUkVHQlVGKSkKKworLyogU3BlY2lmeSB0aGF0IGZvciB0aGUgbmF0aXZlIGNvbXBpbGVyIHZhcmlhYmxlcyBmb3IgYSBwYXJ0aWN1bGFyCisgICBsZXhpY2FsIGNvbnRleHQgYXJlIGxpc3RlZCBhZnRlciB0aGUgYmVnaW5uaW5nIExCUkFDIGluc3RlYWQgb2YKKyAgIGJlZm9yZSBpbiB0aGUgZXhlY3V0YWJsZXMgbGlzdCBvZiBzeW1ib2xzLiAgKi8KKyNkZWZpbmUgVkFSSUFCTEVTX0lOU0lERV9CTE9DSyhkZXNjLCBnY2NfcCkgKCEoZ2NjX3ApKQorCisMCisvKiBEZWZpbmUgb3RoZXIgYXNwZWN0cyBvZiB0aGUgc3RhY2sgZnJhbWUuIAorICAgV2Uga2VlcCB0aGUgb2Zmc2V0cyBvZiBhbGwgc2F2ZWQgcmVnaXN0ZXJzLCAnY2F1c2Ugd2UgbmVlZCAnZW0gYSBsb3QhCisgICBXZSBhbHNvIGtlZXAgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgc3RhY2sgZnJhbWUsIGFuZCB0aGUgb2Zmc2V0IG9mCisgICB0aGUgZnJhbWUgcG9pbnRlciBmcm9tIHRoZSBzdGFjayBwb2ludGVyIChmb3IgZnJhbWVsZXNzIGZ1bmN0aW9ucywgYW5kCisgICB3aGVuIHdlJ3JlIHN0aWxsIGluIHRoZSBwcm9sb2d1ZSBvZiBhIGZ1bmN0aW9uIHdpdGggYSBmcmFtZSkgKi8KKworI2RlZmluZSBFWFRSQV9GUkFNRV9JTkZPICAJXAorICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyBmc3I7CVwKKyAgaW50IGZyYW1lc2l6ZTsJCVwKKyAgaW50IGZyYW1lb2Zmc2V0OwkJXAorICBpbnQgZnJhbWVyZWc7CisKK2V4dGVybiB2b2lkIGFybV9pbml0X2V4dHJhX2ZyYW1lX2luZm8gUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKmZpKSk7CisjZGVmaW5lIElOSVRfRVhUUkFfRlJBTUVfSU5GTyhmcm9tbGVhZiwgZmkpIGFybV9pbml0X2V4dHJhX2ZyYW1lX2luZm8gKGZpKQorCisvKiBSZXR1cm4gdGhlIGZyYW1lIGFkZHJlc3MuICBPbiBBUk0sIGl0IGlzIFIxMTsgb24gVGh1bWIgaXQgaXMgUjcuICAqLworQ09SRV9BRERSIGFybV90YXJnZXRfcmVhZF9mcCBQQVJBTVMgKCh2b2lkKSk7CisjZGVmaW5lIFRBUkdFVF9SRUFEX0ZQKCkgYXJtX3RhcmdldF9yZWFkX2ZwICgpCisKKy8qIERlc2NyaWJlIHRoZSBwb2ludGVyIGluIGVhY2ggc3RhY2sgZnJhbWUgdG8gdGhlIHByZXZpb3VzIHN0YWNrIGZyYW1lCisgICAoaXRzIGNhbGxlcikuICAqLworCisvKiBGUkFNRV9DSEFJTiB0YWtlcyBhIGZyYW1lJ3Mgbm9taW5hbCBhZGRyZXNzCisgICBhbmQgcHJvZHVjZXMgdGhlIGZyYW1lJ3MgY2hhaW4tcG9pbnRlci4KKworICAgSG93ZXZlciwgaWYgRlJBTUVfQ0hBSU5fVkFMSUQgcmV0dXJucyB6ZXJvLAorICAgaXQgbWVhbnMgdGhlIGdpdmVuIGZyYW1lIGlzIHRoZSBvdXRlcm1vc3Qgb25lIGFuZCBoYXMgbm8gY2FsbGVyLiAgKi8KKworI2RlZmluZSBGUkFNRV9DSEFJTih0aGlzZnJhbWUpIChDT1JFX0FERFIpIGFybV9mcmFtZV9jaGFpbiAodGhpc2ZyYW1lKQorZXh0ZXJuIENPUkVfQUREUiBhcm1fZnJhbWVfY2hhaW4gUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworCitleHRlcm4gaW50IGFybV9mcmFtZV9jaGFpbl92YWxpZCBQQVJBTVMgKChDT1JFX0FERFIsIHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKyNkZWZpbmUgRlJBTUVfQ0hBSU5fVkFMSUQoY2hhaW4sIHRoaXNmcmFtZSkgYXJtX2ZyYW1lX2NoYWluX3ZhbGlkIChjaGFpbiwgdGhpc2ZyYW1lKQorCisvKiBEZWZpbmUgb3RoZXIgYXNwZWN0cyBvZiB0aGUgc3RhY2sgZnJhbWUuICAqLworCisvKiBBIG1hY3JvIHRoYXQgdGVsbHMgdXMgd2hldGhlciB0aGUgZnVuY3Rpb24gaW52b2NhdGlvbiByZXByZXNlbnRlZAorICAgYnkgRkkgZG9lcyBub3QgaGF2ZSBhIGZyYW1lIG9uIHRoZSBzdGFjayBhc3NvY2lhdGVkIHdpdGggaXQuICBJZiBpdAorICAgZG9lcyBub3QsIEZSQU1FTEVTUyBpcyBzZXQgdG8gMSwgZWxzZSAwLiAgKi8KKyNkZWZpbmUgRlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT04oRkksIEZSQU1FTEVTUykgXAorewkJCQkJCQlcCisgIENPUkVfQUREUiBmdW5jX3N0YXJ0LCBhZnRlcl9wcm9sb2d1ZTsJCQlcCisgIGZ1bmNfc3RhcnQgPSAoZ2V0X3BjX2Z1bmN0aW9uX3N0YXJ0ICgoRkkpLT5wYykgKwlcCisJCUZVTkNUSU9OX1NUQVJUX09GRlNFVCk7CQkJXAorICBhZnRlcl9wcm9sb2d1ZSA9IGZ1bmNfc3RhcnQ7CQkJCVwKKyAgU0tJUF9QUk9MT0dVRSAoYWZ0ZXJfcHJvbG9ndWUpOwkJCVwKKyAgKEZSQU1FTEVTUykgPSAoYWZ0ZXJfcHJvbG9ndWUgPT0gZnVuY19zdGFydCk7CQlcCit9CisKKy8qIFNhdmVkIFBjLiAgKi8KKworI2RlZmluZSBGUkFNRV9TQVZFRF9QQyhGUkFNRSkJYXJtX2ZyYW1lX3NhdmVkX3BjIChGUkFNRSkKK2V4dGVybiBDT1JFX0FERFIgYXJtX2ZyYW1lX3NhdmVkX3BjIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworI2RlZmluZSBGUkFNRV9BUkdTX0FERFJFU1MoZmkpIChmaS0+ZnJhbWUpCisKKyNkZWZpbmUgRlJBTUVfTE9DQUxTX0FERFJFU1MoZmkpICgoZmkpLT5mcmFtZSkKKworLyogUmV0dXJuIG51bWJlciBvZiBhcmdzIHBhc3NlZCB0byBhIGZyYW1lLgorICAgQ2FuIHJldHVybiAtMSwgbWVhbmluZyBubyB3YXkgdG8gdGVsbC4gICovCisKKyNkZWZpbmUgRlJBTUVfTlVNX0FSR1MobnVtYXJncywgZmkpIChudW1hcmdzID0gLTEpCisKKy8qIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgYXQgc3RhcnQgb2YgYXJnbGlzdCB0aGF0IGFyZSBub3QgcmVhbGx5IGFyZ3MuICAqLworCisjZGVmaW5lIEZSQU1FX0FSR1NfU0tJUCAwCisKKy8qIFB1dCBoZXJlIHRoZSBjb2RlIHRvIHN0b3JlLCBpbnRvIGEgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MsCisgICB0aGUgYWRkcmVzc2VzIG9mIHRoZSBzYXZlZCByZWdpc3RlcnMgb2YgZnJhbWUgZGVzY3JpYmVkIGJ5IEZSQU1FX0lORk8uCisgICBUaGlzIGluY2x1ZGVzIHNwZWNpYWwgcmVnaXN0ZXJzIHN1Y2ggYXMgcGMgYW5kIGZwIHNhdmVkIGluIHNwZWNpYWwKKyAgIHdheXMgaW4gdGhlIHN0YWNrIGZyYW1lLiAgc3AgaXMgZXZlbiBtb3JlIHNwZWNpYWw6CisgICB0aGUgYWRkcmVzcyB3ZSByZXR1cm4gZm9yIGl0IElTIHRoZSBzcCBmb3IgdGhlIG5leHQgZnJhbWUuICAqLworCitzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVnczsKK3N0cnVjdCBmcmFtZV9pbmZvOwordm9pZCBmcmFtZV9maW5kX3NhdmVkX3JlZ3MgUEFSQU1TKChzdHJ1Y3QgZnJhbWVfaW5mbyAqZmksCisJCQkJICAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKmZzcikpOworCisjZGVmaW5lIEZSQU1FX0ZJTkRfU0FWRURfUkVHUyhmcmFtZV9pbmZvLCBmcmFtZV9zYXZlZF9yZWdzKSBcCisgYXJtX2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyAoZnJhbWVfaW5mbywgJihmcmFtZV9zYXZlZF9yZWdzKSk7CisKKwwKKy8qIFRoaW5ncyBuZWVkZWQgZm9yIG1ha2luZyB0aGUgaW5mZXJpb3IgY2FsbCBmdW5jdGlvbnMuICAqLworCisjZGVmaW5lIFBVU0hfQVJHVU1FTlRTKG5hcmdzLCBhcmdzLCBzcCwgc3RydWN0X3JldHVybiwgc3RydWN0X2FkZHIpIFwKKyAgICBzcCA9IGFybV9wdXNoX2FyZ3VtZW50cyAoKG5hcmdzKSwgKGFyZ3MpLCAoc3ApLCAoc3RydWN0X3JldHVybiksIChzdHJ1Y3RfYWRkcikpCitleHRlcm4gQ09SRV9BRERSCithcm1fcHVzaF9hcmd1bWVudHMgUEFSQU1TICgoaW50LCBzdHJ1Y3QgdmFsdWUgKiosIENPUkVfQUREUiwgaW50LCBDT1JFX0FERFIpKTsKKworLyogUHVzaCBhbiBlbXB0eSBzdGFjayBmcmFtZSwgdG8gcmVjb3JkIHRoZSBjdXJyZW50IFBDLCBldGMuICAqLworCit2b2lkIGFybV9wdXNoX2R1bW15X2ZyYW1lIFBBUkFNUyAoKHZvaWQpKTsKKworI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FIGFybV9wdXNoX2R1bW15X2ZyYW1lICgpCisKKy8qIERpc2NhcmQgZnJvbSB0aGUgc3RhY2sgdGhlIGlubmVybW9zdCBmcmFtZSwgcmVzdG9yaW5nIGFsbCByZWdpc3RlcnMuICAqLworCit2b2lkIGFybV9wb3BfZnJhbWUgUEFSQU1TICgodm9pZCkpOworCisjZGVmaW5lIFBPUF9GUkFNRSBhcm1fcG9wX2ZyYW1lICgpCisKKy8qIFRoaXMgc2VxdWVuY2Ugb2Ygd29yZHMgaXMgdGhlIGluc3RydWN0aW9ucworCisgICAgIG1vdiAJbHIscGMKKyAgICAgbW92CXBjLHI0CisgICAgIGlsbGVnYWwKKworICAgTm90ZSB0aGlzIGlzIDEyIGJ5dGVzLiAgKi8KKworI2RlZmluZSBDQUxMX0RVTU1ZIHsweGUxYTBlMDBmLCAweGUxYTBmMDA0LCAweEU3RkZERUZFfQorCisjZGVmaW5lIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUIDAgIC8qIFN0YXJ0IGV4ZWN1dGlvbiBhdCBiZWdpbm5pbmcgb2YgZHVtbXkgKi8KKworI2RlZmluZSBDQUxMX0RVTU1ZX0JSRUFLUE9JTlRfT0ZGU0VUIGFybV9jYWxsX2R1bW15X2JyZWFrcG9pbnRfb2Zmc2V0KCkKK2V4dGVybiBpbnQgYXJtX2NhbGxfZHVtbXlfYnJlYWtwb2ludF9vZmZzZXQgUEFSQU1TICgodm9pZCkpOworCisvKiBJbnNlcnQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYXJncyBhbmQgZnVuY3Rpb24gYWRkcmVzcworICAgaW50byBhIGNhbGwgc2VxdWVuY2Ugb2YgdGhlIGFib3ZlIGZvcm0gc3RvcmVkIGF0IERVTU1ZTkFNRS4gICovCisKKyNkZWZpbmUgRklYX0NBTExfRFVNTVkoZHVtbXluYW1lLCBwYywgZnVuLCBuYXJncywgYXJncywgdHlwZSwgZ2NjX3ApIFwKKyAgIGFybV9maXhfY2FsbF9kdW1teSAoZHVtbXluYW1lLCBwYywgZnVuLCBuYXJncywgYXJncywgdHlwZSwgZ2NjX3ApCisKK3ZvaWQgYXJtX2ZpeF9jYWxsX2R1bW15IFBBUkFNUyAoKGNoYXIgKmR1bW15LCBDT1JFX0FERFIgcGMsIENPUkVfQUREUiBmdW4sCisJCQkJIGludCBuYXJncywgc3RydWN0IHZhbHVlICoqYXJncywKKwkJCQkgc3RydWN0IHR5cGUgKnR5cGUsIGludCBnY2NfcCkpOworCitDT1JFX0FERFIgYXJtX2dldF9uZXh0X3BjIFBBUkFNUyAoKENPUkVfQUREUikpOworCisvKiBGdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBUaHVtYiBjYWxsIHRodW5rcy4gICovCisjZGVmaW5lIElOX1NPTElCX0NBTExfVFJBTVBPTElORShwYywgbmFtZSkJYXJtX2luX2NhbGxfc3R1YiAocGMsIG5hbWUpCisjZGVmaW5lIFNLSVBfVFJBTVBPTElORV9DT0RFKHBjKQkJYXJtX3NraXBfc3R1YiAocGMpCitleHRlcm4gaW50IGFybV9pbl9jYWxsX3N0dWIgUEFSQU1TICgoQ09SRV9BRERSIHBjLCAgY2hhciAqbmFtZSkpOworZXh0ZXJuIENPUkVfQUREUiBhcm1fc2tpcF9zdHViIFBBUkFNUyAoKENPUkVfQUREUiBwYykpOworCisvKiBGdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciBNRU1BRERSIGlzIGluIGEgVGh1bWIgZnVuY3Rpb24uICAqLworZXh0ZXJuIGludCBhcm1fcGNfaXNfdGh1bWIgUEFSQU1TICgoYmZkX3ZtYSBtZW1hZGRyKSk7CisKKy8qIEZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIE1FTUFERFIgaXMgaW4gYSBjYWxsIGR1bW15IGNhbGxlZCBmcm9tCisgICBhIFRodW1iIGZ1bmN0aW9uLiAgKi8KK2V4dGVybiBpbnQgYXJtX3BjX2lzX3RodW1iX2R1bW15IFBBUkFNUyAoKGJmZF92bWEgbWVtYWRkcikpOworCisvKiBNYWNyb3MgZm9yIHNldHRpbmcgYW5kIHRlc3RpbmcgYSBiaXQgaW4gYSBtaW5pbWFsIHN5bWJvbCB0aGF0CisgICBtYXJrcyBpdCBhcyBUaHVtYiBmdW5jdGlvbi4gIFRoZSBNU0Igb2YgdGhlIG1pbmltYWwgc3ltYm9sJ3MKKyAgICJpbmZvIiBmaWVsZCBpcyB1c2VkIGZvciB0aGlzIHB1cnBvc2UuIFRoaXMgZmllbGQgaXMgYWxyZWFkeQorICAgYmVpbmcgdXNlZCB0byBzdG9yZSB0aGUgc3ltYm9sIHNpemUsIHNvIHRoZSBhc3N1bXB0aW9uIGlzCisgICB0aGF0IHRoZSBzeW1ib2wgc2l6ZSBjYW5ub3QgZXhjZWVkIDJeMzEuCisgCisgICBDT0ZGX01BS0VfTVNZTUJPTF9TUEVDSUFMCisgICBFTEZfTUFLRV9NU1lNQk9MX1NQRUNJQUwJdGVzdHMgd2hldGhlciB0aGUgQ09GRiBvciBFTEYgc3ltYm9sIGNvcnJlc3BvbmRzIAorICAgICAgICAgICAgICAgICAgICAgICAgdG8gYSB0aHVtYiBmdW5jdGlvbiwgYW5kIHNldHMgYSAic3BlY2lhbCIgYml0IGluIGEKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltYWwgc3ltYm9sIHRvIGluZGljYXRlIHRoYXQgaXQgZG9lcworICAgTVNZTUJPTF9TRVRfU1BFQ0lBTAlhY3R1YWxseSBzZXRzIHRoZSAic3BlY2lhbCIgYml0CisgICBNU1lNQk9MX0lTX1NQRUNJQUwgICB0ZXN0cyB0aGUgInNwZWNpYWwiIGJpdCBpbiBhIG1pbmltYWwgc3ltYm9sCisgICBNU1lNQk9MX1NJWkUgICAgICAgICByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBtaW5pbWFsIHN5bWJvbCwgaS5lLgorICAgICAgICAgICAgICAgICAgICAgICAgdGhlICJpbmZvIiBmaWVsZCB3aXRoIHRoZSAic3BlY2lhbCIgYml0IG1hc2tlZCBvdXQKKyovCisgCitleHRlcm4gaW50IGNvZmZfc3ltX2lzX3RodW1iKGludCB2YWwpOworI2RlZmluZSBNU1lNQk9MX1NFVF9TUEVDSUFMKG1zeW0pIFwKKyAgICBNU1lNQk9MX0lORk8gKG1zeW0pID0gKGNoYXIgKikgKCgobG9uZykgTVNZTUJPTF9JTkZPIChtc3ltKSkgfCAweDgwMDAwMDAwKQorI2RlZmluZSBNU1lNQk9MX0lTX1NQRUNJQUwobXN5bSkgXAorICAoKChsb25nKSBNU1lNQk9MX0lORk8gKG1zeW0pICYgMHg4MDAwMDAwMCkgIT0gMCkKKyNkZWZpbmUgTVNZTUJPTF9TSVpFKG1zeW0pIFwKKyAgKChsb25nKSBNU1lNQk9MX0lORk8gKG1zeW0pICYgMHg3ZmZmZmZmZikKKworLyogVGh1bWIgc3ltYm9sIGFyZSBvZiB0eXBlIFNUVF9MT1BST0MsIChzeW5vbnltb3VzIHdpdGggU1RUX0FSTV9URlVOQykgKi8KKyNkZWZpbmUgRUxGX01BS0VfTVNZTUJPTF9TUEVDSUFMKHN5bSxtc3ltKSBcCisgeyBpZihFTEZfU1RfVFlQRSgoKGVsZl9zeW1ib2xfdHlwZSAqKShzeW0pKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvKSA9PSBTVFRfTE9QUk9DKSBcCisJTVNZTUJPTF9TRVRfU1BFQ0lBTChtc3ltKTsgfQorICAKKyNkZWZpbmUgQ09GRl9NQUtFX01TWU1CT0xfU1BFQ0lBTCh2YWwsbXN5bSkgXAorIHsgaWYoY29mZl9zeW1faXNfdGh1bWIodmFsKSkgTVNZTUJPTF9TRVRfU1BFQ0lBTChtc3ltKTsgfQorCisjdW5kZWYgIElOX1NJR1RSQU1QCisjZGVmaW5lIElOX1NJR1RSQU1QKHBjLCBuYW1lKSAwCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2FybS94bS1hcm0uaCBiL2dkYi9jb25maWcvYXJtL3htLWFybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YzBiZDMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2FybS94bS1hcm0uaApAQCAtMCwwICsxLDc2IEBACisvKiBEZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gYW4gQVJNIHVuZGVyIFJJU0NpWCAoNC4zYnNkKS4KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisKKwwKKyNpZiAwCisvKiBJbnRlcmZhY2UgZGVmaW5pdGlvbnMgZm9yIGtlcm5lbCBkZWJ1Z2dlciBLREIuICAqLworCisvKiBNYXAgbWFjaGluZSBmYXVsdCBjb2RlcyBpbnRvIHNpZ25hbCBudW1iZXJzLgorICAgRmlyc3Qgc3VidHJhY3QgMCwgZGl2aWRlIGJ5IDQsIHRoZW4gaW5kZXggaW4gYSB0YWJsZS4KKyAgIEZhdWx0cyBmb3Igd2hpY2ggdGhlIGVudHJ5IGluIHRoaXMgdGFibGUgaXMgMAorICAgYXJlIG5vdCBoYW5kbGVkIGJ5IEtEQjsgdGhlIHByb2dyYW0ncyBvd24gdHJhcCBoYW5kbGVyCisgICBnZXRzIHRvIGhhbmRsZSB0aGVuLiAgKi8KKworI2RlZmluZSBGQVVMVF9DT0RFX09SSUdJTiAwCisjZGVmaW5lIEZBVUxUX0NPREVfVU5JVFMgNAorI2RlZmluZSBGQVVMVF9UQUJMRSAgICBcCit7IDAsIFNJR0tJTEwsIFNJR1NFR1YsIDAsIDAsIDAsIDAsIDAsIFwKKyAgMCwgMCwgU0lHVFJBUCwgU0lHVFJBUCwgMCwgMCwgMCwgMCwgXAorICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQorCisvKiBTdGFydCBydW5uaW5nIHdpdGggYSBzdGFjayBzdHJldGNoaW5nIGZyb20gQkVHIHRvIEVORC4KKyAgIEJFRyBhbmQgRU5EIHNob3VsZCBiZSBzeW1ib2xzIG1lYW5pbmdmdWwgdG8gdGhlIGFzc2VtYmxlci4KKyAgIFRoaXMgaXMgdXNlZCBvbmx5IGZvciBrZGIuICAqLworCisjZGVmaW5lIElOSVRfU1RBQ0soYmVnLCBlbmQpICBcCit7IGFzbSAoIi5nbG9ibCBlbmQiKTsgICAgICAgICBcCisgIGFzbSAoIm1vdmwgJCBlbmQsIHNwIik7ICAgICAgXAorICBhc20gKCJjbHJsIGZwIik7IH0KKworLyogUHVzaCB0aGUgZnJhbWUgcG9pbnRlciByZWdpc3RlciBvbiB0aGUgc3RhY2suICAqLworI2RlZmluZSBQVVNIX0ZSQU1FX1BUUiAgICAgICAgXAorICBhc20gKCJwdXNobCBmcCIpOworCisvKiBDb3B5IHRoZSB0b3Atb2Ytc3RhY2sgdG8gdGhlIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIuICAqLworI2RlZmluZSBQT1BfRlJBTUVfUFRSICBcCisgIGFzbSAoIm1vdmwgKHNwKSwgZnAiKTsKKworLyogQWZ0ZXIgS0RCIGlzIGVudGVyZWQgYnkgYSBmYXVsdCwgcHVzaCBhbGwgcmVnaXN0ZXJzCisgICB0aGF0IEdEQiB0aGlua3MgYWJvdXQgKGFsbCBOVU1fUkVHUyBvZiB0aGVtKSwKKyAgIHNvIHRoYXQgdGhleSBhcHBlYXIgaW4gb3JkZXIgb2YgYXNjZW5kaW5nIEdEQiByZWdpc3RlciBudW1iZXIuCisgICBUaGUgZmF1bHQgY29kZSB3aWxsIGJlIG9uIHRoZSBzdGFjayBiZXlvbmQgdGhlIGxhc3QgcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIFBVU0hfUkVHSVNURVJTICAgICAgICBcCit7IGFzbSAoInB1c2hsIDgoc3ApIik7ICAgICAgICBcCisgIGFzbSAoInB1c2hsIDgoc3ApIik7ICAgICAgICBcCisgIGFzbSAoInB1c2hhbCAweDE0KHNwKSIpOyAgICBcCisgIGFzbSAoInB1c2hyICQwMzc3NzciKTsgfQorCisvKiBBc3N1bWluZyB0aGUgcmVnaXN0ZXJzIChpbmNsdWRpbmcgcHJvY2Vzc29yIHN0YXR1cykgaGF2ZSBiZWVuCisgICBwdXNoZWQgb24gdGhlIHN0YWNrIGluIG9yZGVyIG9mIGFzY2VuZGluZyBHREIgcmVnaXN0ZXIgbnVtYmVyLAorICAgcmVzdG9yZSB0aGVtIGFuZCByZXR1cm4gdG8gdGhlIGFkZHJlc3MgaW4gdGhlIHNhdmVkIFBDIHJlZ2lzdGVyLiAgKi8KKworI2RlZmluZSBQT1BfUkVHSVNURVJTICAgICAgXAoreyBhc20gKCJwb3ByICQwMzc3NzciKTsgICAgXAorICBhc20gKCJzdWJsMiAkOCwoc3ApIik7ICAgXAorICBhc20gKCJtb3ZsIChzcCksc3AiKTsgICAgXAorICBhc20gKCJyZWkiKTsgfQorI2VuZGlmIC8qIDAgKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvY29udmV4L0NvbnZleC5ub3RlcyBiL2dkYi9jb25maWcvY29udmV4L0NvbnZleC5ub3RlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGQzMzZiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9jb252ZXgvQ29udmV4Lm5vdGVzCkBAIC0wLDAgKzEsMTYzIEBACisKK0Bub2RlIENvbnZleCwsLCBUb3AKK0BhcHBlbmRpeCBDb252ZXgtc3BlY2lmaWMgaW5mbworQGNpbmRleCBDb252ZXggbm90ZXMKKworU2NhbGFyIHJlZ2lzdGVycyBhcmUgNjQgYml0cyBsb25nLCB3aGljaCBpcyBhIHBhaW4gc2luY2UKK2xlZnQgaGFsZiBvZiBhbiBTIHJlZ2lzdGVyIGZyZXF1ZW50bHkgY29udGFpbnMgbm9pc2UuCitUaGVyZWZvcmUgdGhlcmUgYXJlIHR3byB3YXlzIHRvIG9idGFpbiB0aGUgdmFsdWUgb2YgYW4gUyByZWdpc3Rlci4KKworQHRhYmxlIEBrYmQKK0BpdGVtICRzMAorcmV0dXJucyB0aGUgbG93IGhhbGYgb2YgdGhlIHJlZ2lzdGVyIGFzIGFuIGludAorCitAaXRlbSAkUzAKK3JldHVybnMgdGhlIHdob2xlIHJlZ2lzdGVyIGFzIGEgbG9uZyBsb25nCitAZW5kIHRhYmxlCisKK1lvdSBjYW4gcHJpbnQgdGhlIHZhbHVlIGluIGZsb2F0aW5nIHBvaW50IGJ5IHVzaW5nIEBzYW1we3AvZiAkczB9IG9yIEBzYW1we3AvZiAkUzB9Cit0byBwcmludCBhIHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIHZhbHVlLgorCitAY2luZGV4IHZlY3RvciByZWdpc3RlcnMKK1ZlY3RvciByZWdpc3RlcnMgYXJlIGhhbmRsZWQgc2ltaWxhcmx5LCB3aXRoIEBzYW1weyRWMH0gZGVub3RpbmcgdGhlIHdob2xlCis2NC1iaXQgcmVnaXN0ZXIgYW5kIEBrYmR7JHYwfSBkZW5vdGluZyB0aGUgMzItYml0IGxvdyBoYWxmOyBAc2FtcHtwL2YgJHYwfQorb3IgQHNhbXB7cC9mICRWMH0gY2FuIGJlIHVzZWQgdG8gZXhhbWluZSB0aGUgcmVnaXN0ZXIgaW4gZmxvYXRpbmcgcG9pbnQuCitUaGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3IgcmVnaXN0ZXJzIGlzIHRha2VuIGZyb20gQHNhbXB7JHZsfS4gIAorCitJbmRpdmlkdWFsIGVsZW1lbnRzIG9mIGEgdmVjdG9yIHJlZ2lzdGVyIGFyZSBkZW5vdGVkIGluIHRoZSBvYnZpb3VzIHdheTsKK0BzYW1we3ByaW50ICR2M1s5XX0gcHJpbnRzIHRoZSB0ZW50aCBlbGVtZW50IG9mIHJlZ2lzdGVyIEBrYmR7djN9LCBhbmQKK0BzYW1we3NldCAkdjNbOV0gPSAxMjM0fSBhbHRlcnMgaXQuCisKK0BrYmR7JHZsfSBhbmQgQGtiZHskdnN9IGFyZSBpbnQsIGFuZCBAa2JkeyR2bX0gaXMgYW4gaW50IHZlY3Rvci4KK0VsZW1lbnRzIG9mIEBrYmR7JHZtfSBjYW4ndCBiZSBhc3NpZ25lZCB0by4KKworQGNpbmRleCBjb21tdW5pY2F0aW9uIHJlZ2lzdGVycworQGtpbmRleCBpbmZvIGNvbW0tcmVnaXN0ZXJzCitDb21tdW5pY2F0aW9uIHJlZ2lzdGVycyBoYXZlIG5hbWVzIEBrYmR7JEMwIC4uICRDNjN9LCB3aXRoIEBrYmR7JGMwIC4uICRjNjN9CitkZW5vdGluZyB0aGUgbG93LW9yZGVyIGhhbHZlcy4gIEBzYW1we2luZm8gY29tbS1yZWdpc3RlcnN9IHdpbGwgcHJpbnQgdGhlbQorYWxsIG91dCwgYW5kIHRlbGwgd2hpY2ggYXJlIGxvY2tlZC4gIChBIGNvbW11bmljYXRpb24gcmVnaXN0ZXIgaXMKK2xvY2tlZCB3aGVuIGEgdmFsdWUgaXMgc2VudCB0byBpdCwgYW5kIHVubG9ja2VkIHdoZW4gdGhlIHZhbHVlIGlzCityZWNlaXZlZC4pICBDb21tdW5pY2F0aW9uIHJlZ2lzdGVycyBhcmUsIG9mIGNvdXJzZSwgZ2xvYmFsIHRvIGFsbAordGhyZWFkcywgc28gaXQgZG9lcyBub3QgbWF0dGVyIHdoYXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0aHJlYWQgaXMuCitAc2FtcHtpbmZvIGNvbW0tcmVnIEB2YXJ7bmFtZX19IHByaW50cyBqdXN0IHRoYXQgb25lIGNvbW11bmljYXRpb24KK3JlZ2lzdGVyOyBAc2FtcHtuYW1lfSBtYXkgYWxzbyBiZSBhIGNvbW11bmljYXRpb24gcmVnaXN0ZXIgbnVtYmVyCitAc2FtcHtubn0gb3IgQHNhbXB7MHhubn0uCitAc2FtcHtpbmZvIGNvbW0tcmVnIEB2YXJ7YWRkcmVzc319IHByaW50cyB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlCitzdHJ1Y3R1cmUgYXQgdGhhdCBhZGRyZXNzLgorCitAa2luZGV4IGluZm8gcHN3CitUaGUgY29tbWFuZCBAc2FtcHtpbmZvIHBzd30gcHJpbnRzIHRoZSBwcm9jZXNzb3Igc3RhdHVzIHdvcmQgQGtiZHskcHN9CitiaXQgYnkgYml0LgorCitAa2luZGV4IHNldCBiYXNlCitHREIgbm9ybWFsbHkgcHJpbnRzIGFsbCBpbnRlZ2VycyBpbiBiYXNlIDEwLCBidXQgdGhlIGxlYWRpbmcKK0BrYmR7MHg4MDAwMDAwMH0gb2YgcG9pbnRlcnMgaXMgaW50b2xlcmFibGUgaW4gZGVjaW1hbCwgc28gdGhlIGRlZmF1bHQKK291dHB1dCByYWRpeCBoYXMgYmVlbiBjaGFuZ2VkIHRvIHRyeSB0byBwcmludCBhZGRyZXNzZXMgYXBwcm9wcmlhdGVseS4KK1RoZSBAc2FtcHtzZXQgYmFzZX0gY29tbWFuZCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhpcy4KKworQHRhYmxlIEBjb2RlCitAaXRlbSBzZXQgYmFzZSAxMAorSW50ZWdlciB2YWx1ZXMgYWx3YXlzIHByaW50IGluIGRlY2ltYWwuCisKK0BpdGVtIHNldCBiYXNlIDE2CitJbnRlZ2VyIHZhbHVlcyBhbHdheXMgcHJpbnQgaW4gaGV4LgorCitAaXRlbSBzZXQgYmFzZQorR28gYmFjayB0byB0aGUgaW5pdGlhbCBzdGF0ZSwgd2hpY2ggcHJpbnRzIGludGVnZXIgdmFsdWVzIGluIGhleCBpZiB0aGV5Citsb29rIGxpa2UgcG9pbnRlcnMgKHNwZWNpZmljYWxseSwgaWYgdGhleSBzdGFydCB3aXRoIDB4OCBvciAweGYgaW4gdGhlCitzdGFjayksIG90aGVyd2lzZSBpbiBkZWNpbWFsLgorQGVuZCB0YWJsZQorCitAa2luZGV4IHNldCBwaXBlbGluZQorV2hlbiBhbiBleGNlcHRpb24gc3VjaCBhcyBhIGJ1cyBlcnJvciBvciBvdmVyZmxvdyBoYXBwZW5zLCB1c3VhbGx5IHRoZSBQQworaXMgc2V2ZXJhbCBpbnN0cnVjdGlvbnMgYWhlYWQgYnkgdGhlIHRpbWUgdGhlIGV4Y2VwdGlvbiBpcyBkZXRlY3RlZC4KK1RoZSBAc2FtcHtzZXQgcGlwZX0gY29tbWFuZCB3aWxsIGRpc2FibGUgdGhpcy4KKworQHRhYmxlIEBjb2RlCitAaXRlbSBzZXQgcGlwZWxpbmUgb2ZmCitGb3JjZXMgc2VyaWFsIGV4ZWN1dGlvbiBvZiBpbnN0cnVjdGlvbnM7IG5vIHZlY3RvciBjaGFpbmluZyBhbmQgbm8gCitzY2FsYXIgaW5zdHJ1Y3Rpb24gb3ZlcmxhcC4gIFdpdGggdGhpcywgZXhjZXB0aW9ucyBhcmUgZGV0ZWN0ZWQgd2l0aCAKK3RoZSBQQyBwb2ludGluZyB0byB0aGUgaW5zdHJ1Y3Rpb24gYWZ0ZXIgdGhlIG9uZSBpbiBlcnJvci4KKworQGl0ZW0gc2V0IHBpcGVsaW5lIG9uCitSZXR1cm5zIHRvIG5vcm1hbCwgZmFzdCwgZXhlY3V0aW9uLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KK0BlbmQgdGFibGUKKworQGNpbmRleCBwYXJhbGxlbAorSW4gYSBwYXJhbGxlbCBwcm9ncmFtLCBtdWx0aXBsZSB0aHJlYWRzIG1heSBiZSBleGVjdXRpbmcsIGVhY2gKK3dpdGggaXRzIG93biByZWdpc3RlcnMsIHN0YWNrLCBhbmQgbG9jYWwgbWVtb3J5LiAgV2hlbiBvbmUgb2YgdGhlbQoraGl0cyBhIGJyZWFrcG9pbnQsIHRoYXQgdGhyZWFkIGlzIHNlbGVjdGVkLiAgT3RoZXIgdGhyZWFkcyBkbworbm90IHJ1biB3aGlsZSB0aGUgdGhyZWFkIGlzIGluIHRoZSBicmVha3BvaW50LgorCitAa2luZGV4IDFjb250CitUaGUgc2VsZWN0ZWQgdGhyZWFkIGNhbiBiZSBzaW5nbGUtc3RlcHBlZCwgZ2l2ZW4gc2lnbmFscywgYW5kIHNvCitvbi4gIEFueSBvdGhlciB0aHJlYWRzIHJlbWFpbiBzdG9wcGVkLiAgV2hlbiBhIEBzYW1we2NvbnR9IGNvbW1hbmQgaXMgZ2l2ZW4sCithbGwgdGhyZWFkcyBhcmUgcmVzdW1lZC4gIFRvIHJlc3VtZSBqdXN0IHRoZSBzZWxlY3RlZCB0aHJlYWQsIHVzZQordGhlIGNvbW1hbmQgQHNhbXB7MWNvbnR9LgorCitAa2luZGV4IHRocmVhZAorVGhlIEBzYW1we3RocmVhZH0gY29tbWFuZCB3aWxsIHNob3cgdGhlIGFjdGl2ZSB0aHJlYWRzIGFuZCB0aGUKK2luc3RydWN0aW9uIHRoZXkgYXJlIGFib3V0IHRvIGV4ZWN1dGUuICBUaGUgc2VsZWN0ZWQgdGhyZWFkIGlzIG1hcmtlZAord2l0aCBhbiBhc3Rlcmlzay4gIFRoZSBjb21tYW5kIEBzYW1we3RocmVhZCBAdmFye259fSB3aWxsIHNlbGVjdCB0aHJlYWQgQHZhcntufSwKK3NoaWZ0aW5nIHRoZSBkZWJ1Z2dlcidzIGF0dGVudGlvbiB0byBpdCBmb3Igc2luZ2xlLXN0ZXBwaW5nLAorcmVnaXN0ZXJzLCBsb2NhbCBtZW1vcnksIGFuZCBzbyBvbi4KKworQGtpbmRleCBpbmZvIHRocmVhZHMKK1RoZSBAc2FtcHtpbmZvIHRocmVhZHN9IGNvbW1hbmQgd2lsbCBzaG93IHdoYXQgdGhyZWFkcywgaWYgYW55LCBoYXZlCitpbnZpc2libHkgaGl0IGJyZWFrcG9pbnRzIG9yIHNpZ25hbHMgYW5kIGFyZSB3YWl0aW5nIHRvIGJlIG5vdGljZWQuCisKK0BraW5kZXggc2V0IHBhcmFsbGVsCitUaGUgQHNhbXB7c2V0IHBhcmFsbGVsfSBjb21tYW5kIGNvbnRyb2xzIGhvdyBtYW55IHRocmVhZHMgY2FuIGJlIGFjdGl2ZS4KKworQHRhYmxlIEBjb2RlCitAaXRlbSBzZXQgcGFyYWxsZWwgb2ZmCitPbmUgdGhyZWFkLiAgUmVxdWVzdHMgYnkgdGhlIHByb2dyYW0gdGhhdCBvdGhlciB0aHJlYWRzIGpvaW4gaW4KKyhzcGF3biBhbmQgcGZvcmsgaW5zdHJ1Y3Rpb25zKSBkbyBub3QgY2F1c2Ugb3RoZXIgdGhyZWFkcyB0byBzdGFydCB1cC4KK1RoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyB0aGUgQHNhbXB7bGltaXQgY29uY3VycmVuY3kgMX0gY29tbWFuZC4KKworQGl0ZW0gc2V0IHBhcmFsbGVsIGZpeGVkCitBbGwgQ1BVcyBhcmUgYXNzaWduZWQgdG8geW91ciBwcm9ncmFtIHdoZW5ldmVyIGl0IHJ1bnMuICBXaGVuIGl0CitleGVjdXRlcyBhIHBmb3JrIG9yIHNwYXduIGluc3RydWN0aW9uLCBpdCBiZWdpbnMgcGFyYWxsZWwgZXhlY3V0aW9uCitpbW1lZGlhdGVseS4gIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyB0aGUgQHNhbXB7bXBhIC1mfSBjb21tYW5kLgorCitAaXRlbSBzZXQgcGFyYWxsZWwgb24KK09uZSBvciBtb3JlIHRocmVhZHMuICBTcGF3biBhbmQgcGZvcmsgY2F1c2UgQ1BVcyB0byBqb2luIGluIHdoZW4gYW5kIGlmCit0aGV5IGFyZSBmcmVlLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4gIEl0IGlzIHZlcnkgZ29vZCBmb3Igc3lzdGVtCit0aHJvdWdocHV0LCBidXQgbm90IHZlcnkgZ29vZCBmb3IgZmluZGluZyBidWdzIGluIHBhcmFsbGVsIGNvZGUuICBJZiB5b3UKK3N1c3BlY3QgYSBidWcgaW4gcGFyYWxsZWwgY29kZSwgeW91IHByb2JhYmx5IHdhbnQgQHNhbXB7c2V0IHBhcmFsbGVsIGZpeGVkLn0KK0BlbmQgdGFibGUKKworQHN1YnNlY3Rpb24gTGltaXRhdGlvbnMKKworV0FSTklORzogQ29udmV4IEdEQiBldmFsdWF0ZXMgZXhwcmVzc2lvbnMgaW4gbG9uZyBsb25nLCBiZWNhdXNlIFMKK3JlZ2lzdGVycyBhcmUgNjQgYml0cyBsb25nLiAgSG93ZXZlciwgR0RCIGV4cHJlc3Npb24gc2VtYW50aWNzIGFyZSBub3QKK2V4YWN0bHkgQyBzZW1hbnRpY3MuICBUaGlzIGlzIGEgYnVnLCBzdHJpY3RseSBzcGVha2luZywgYnV0IGl0J3Mgbm90IG9uZSBJCitrbm93IGhvdyB0byBmaXguICBJZiBAc2FtcHt4fSBpcyBhIHByb2dyYW0gdmFyaWFibGUgb2YgdHlwZSBpbnQsIHRoZW4gaXQKK2lzIGFsc28gdHlwZSBpbnQgdG8gR0RCLCBidXQgQHNhbXB7eCArIDF9IGlzIGxvbmcgbG9uZywgYXMgaXMgQHNhbXB7eCArIHl9CitvciBhbnkgb3RoZXIgZXhwcmVzc2lvbiByZXF1aXJpbmcgY29tcHV0YXRpb24uICBTbyBpcyB0aGUgZXhwcmVzc2lvbgorQHNhbXB7MX0sIG9yIGFueSBvdGhlciBjb25zdGFudC4gIFlvdSBvbmx5IHJlYWxseSBoYXZlIHRvIHdhdGNoIG91dCBmb3IKK2NhbGxzLiAgVGhlIGlubm9jdW91cyBleHByZXNzaW9uIEBzYW1we2xpc3Rfbm9kZSAoMHg4MDAwMTIzNCl9IGhhcyBhbgorYXJndW1lbnQgb2YgdHlwZSBsb25nIGxvbmcuICBZb3UgbXVzdCBleHBsaWNpdGx5IGNhc3QgaXQgdG8gaW50LgorCitJdCBpcyBub3QgcG9zc2libGUgdG8gY29udGludWUgYWZ0ZXIgYW4gdW5jYXVnaHQgZmF0YWwgc2lnbmFsIGJ5IHVzaW5nCitAc2FtcHtzaWduYWwgMH0sIEBzYW1we3JldHVybn0sIEBzYW1we2p1bXB9LCBvciBhbnl0aGluZyBlbHNlLiAgVGhlIGRpZmZpY3VsdHkgaXMgd2l0aAorVW5peCwgbm90IEdEQi4KKworSSBoYXZlIG1hZGUgbm8gYmlnIGVmZm9ydCB0byBtYWtlIHN1Y2ggdGhpbmdzIGFzIHNpbmdsZS1zdGVwcGluZyBhCitAa2Jke2pvaW59IGluc3RydWN0aW9uIGRvIHNvbWV0aGluZyByZWFzb25hYmxlLiAgSWYgdGhlIHByb2dyYW0gc2VlbXMgdG8KK2hhbmcgd2hlbiBkb2luZyB0aGlzLCB0eXBlIEBrYmR7Y3RybC1jfSBhbmQgQHNhbXB7Y29udH0sIG9yIHVzZQorQHNhbXB7dGhyZWFkfSB0byBzaGlmdCB0byBhIGxpdmUgdGhyZWFkLiAgU2luZ2xlLXN0ZXBwaW5nIGEgQGtiZHtzcGF3bn0KK2luc3RydWN0aW9uIGFwcGFyZW50bHkgY2F1c2VzIG5ldyB0aHJlYWRzIHRvIGJlIGJvcm4gd2l0aCB0aGVpciBUIGJpdCBzZXQ7Cit0aGlzIGlzIG5vdCBoYW5kbGVkIGdyYWNlZnVsbHkuICBXaGVuIGEgdGhyZWFkIGhhcyBoaXQgYSBicmVha3BvaW50LCBvdGhlcgordGhyZWFkcyBtYXkgaGF2ZSBpbnZpc2libHkgaGl0IHRoZSBicmVha3BvaW50IGluIHRoZSBiYWNrZ3JvdW5kOyBpZiB5b3UKK2NsZWFyIHRoZSBicmVha3BvaW50IGdkYiB3aWxsIGJlIHN1cnByaXNlZCB3aGVuIHRocmVhZHMgc2VlbSB0byBjb250aW51ZQordG8gc3RvcCBhdCBpdC4gIEFsbCBvZiB0aGVzZSBzaXR1YXRpb25zIHByb2R1Y2Ugc3B1cmlvdXMgc2lnbmFsIDUgdHJhcHM7CitpZiB0aGlzIGhhcHBlbnMsIGp1c3QgdHlwZSBAc2FtcHtjb250fS4gIElmIGl0IGJlY29tZXMgYSBudWlzYW5jZSwgdXNlCitAc2FtcHtoYW5kbGUgNSBub3N0b3B9LiAgKEl0IHdpbGwgYXNrIGlmIHlvdSBhcmUgc3VyZS4gIFlvdSBhcmUuKQorCitUaGVyZSBpcyBubyB3YXkgaW4gR0RCIHRvIHN0b3JlIGEgZmxvYXQgaW4gYSByZWdpc3RlciwgYXMgd2l0aAorQGtiZHtzZXQgJHMwID0gMy4xNDE2fS4gIFRoZSBpZGVudGlmaWVyIEBrYmR7JHMwfSBkZW5vdGVzIGFuIGludGVnZXIsCithbmQgbGlrZSBhbnkgQyBleHByZXNzaW9uIHdoaWNoIGFzc2lnbnMgdG8gYW4gaW50ZWdlciB2YXJpYWJsZSwgdGhlCityaWdodC1oYW5kIHNpZGUgaXMgY2FzdGVkIHRvIHR5cGUgaW50LiAgSWYgeW91IHNob3VsZCBuZWVkIHRvIGRvCitzb21ldGhpbmcgbGlrZSB0aGlzLCB5b3UgY2FuIGFzc2lnbiB0aGUgdmFsdWUgdG8gQGtiZHtAe2Zsb2F0QH0gKCRzcC00KX0KK2FuZCB0aGVuIGRvIEBrYmR7c2V0ICRzMCA9ICRzcFstNF19LiAgU2FtZSBkZWFsIHdpdGggQGtiZHtzZXQgJHYwWzY5XSA9IDYuOX0uCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2NvbnZleC9jb252ZXgubWggYi9nZGIvY29uZmlnL2NvbnZleC9jb252ZXgubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhMTIxZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvY29udmV4L2NvbnZleC5taApAQCAtMCwwICsxLDMgQEAKKyMgSG9zdDogQ29udmV4IFVuaXggKDRic2QpCitYREVQRklMRVM9IGNvbnZleC14ZGVwLm8KK1hNX0ZJTEU9IHhtLWNvbnZleC5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2NvbnZleC9jb252ZXgubXQgYi9nZGIvY29uZmlnL2NvbnZleC9jb252ZXgubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmYmViMwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvY29udmV4L2NvbnZleC5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBDb252ZXggVW5peCAoNGJzZCkKK1RERVBGSUxFUz0gY29udmV4LXRkZXAubworVE1fRklMRT0gdG0tY29udmV4LmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvY29udmV4L3RtLWNvbnZleC5oIGIvZ2RiL2NvbmZpZy9jb252ZXgvdG0tY29udmV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWViOWY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvY29udmV4L3RtLWNvbnZleC5oCkBAIC0wLDAgKzEsNTExIEBACisvKiBEZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gQ29udmV4IFVuaXggKDRic2QpCisgICBDb3B5cmlnaHQgMTk4OSwgMTk5MSwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRBUkdFVF9CWVRFX09SREVSIEJJR19FTkRJQU4KKworLyogVGhlcmUgaXMgY29tZSBwcm9ibGVtIHdpdGggdGhlIGRlYnVnZ2luZyBzeW1ib2xzIGdlbmVyYXRlZCBieSB0aGUKKyAgIGNvbXBpbGVyIHN1Y2ggdGhhdCB0aGUgZGVidWdnaW5nIHN5bWJvbCBmb3IgdGhlIGZpcnN0IGxpbmUgb2YgYQorICAgZnVuY3Rpb24gb3ZlcmxhcCB3aXRoIHRoZSBmdW5jdGlvbiBwcm9sb2d1ZS4gICovCisjZGVmaW5lIFBST0xPR1VFX0ZJUlNUTElORV9PVkVSTEFQCisKKy8qIFdoZW4gY29udmV4IHBjYyBzYXlzIENIQVIgb3IgU0hPUlQsIGl0IHByb3ZpZGVzIHRoZSBjb3JyZWN0IGFkZHJlc3MuICAqLworCisjZGVmaW5lIEJFTElFVkVfUENDX1BST01PVElPTiAxCisKKy8qIFN5bWJvbCB0eXBlcyB0byBpZ25vcmUuICAqLworLyogMHhjNCBpcyBOX01PTlBULiAgVXNlIHRoZSBudW1lcmljIHZhbHVlIGZvciB0aGUgYmVuZWZpdCBvZiBwZW9wbGUKKyAgIHdpdGggKHJhdGhlcikgb2xkIE9TJ3MuICAqLworI2RlZmluZSBJR05PUkVfU1lNQk9MKFRZUEUpIFwKKyAgICAoKChUWVBFKSAmIH5OX0VYVCkgPT0gTl9UQlNTICAgICAgIFwKKyAgICAgfHwgKChUWVBFKSAmIH5OX0VYVCkgPT0gTl9UREFUQSAgIFwKKyAgICAgfHwgKChUWVBFKSAmIH5OX0VYVCkgPT0gMHhjNCkKKworLyogT2Zmc2V0IGZyb20gYWRkcmVzcyBvZiBmdW5jdGlvbiB0byBzdGFydCBvZiBpdHMgY29kZS4KKyAgIFplcm8gb24gbW9zdCBtYWNoaW5lcy4gICovCisKKyNkZWZpbmUgRlVOQ1RJT05fU1RBUlRfT0ZGU0VUIDAKKworLyogQWR2YW5jZSBQQyBhY3Jvc3MgYW55IGZ1bmN0aW9uIGVudHJ5IHByb2xvZ3VlIGluc3RydWN0aW9ucworICAgdG8gcmVhY2ggc29tZSAicmVhbCIgY29kZS4KKyAgIENvbnZleCBwcm9sb2cgaXM6CisgICAgICAgW3N1Yi53ICMtLHNwXQkJaW4gb25lIG9mIDMgcG9zc2libGUgc2l6ZXMKKyAgICAgICBbbW92IHBzdywtCQlmYy92YyBtYWluIHByb2dyYW0gcHJvbG9nCisgICAgICAgIGFuZCAjLSwtCQkgIChza2lwIGl0IGJlY2F1c2UgdGhlICJtb3YgcHN3IiBzYXZlcyB0aGUKKwltb3YgLSxwc3ddCQkgICBUIGJpdCwgc28gY29udGludWUgZ2V0cyBhIHN1cnByaXNlIHRyYXApCisgICAgICAgW2FuZCAjLSxzcF0JCWZjL3ZjIE8yIG1haW4gcHJvZ3JhbSBwcm9sb2cKKyAgICAgICBbbGQuLSAtKGFwKSwtXQkJcGNjL2djYyByZWdpc3RlciBhcmcgbG9hZHMKKyovCisKKyNkZWZpbmUgU0tJUF9QUk9MT0dVRShwYykgIFwKK3sgaW50IG9wLCBpeDsJCQkJCQkJCVwKKyAgb3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgMik7CQkJCQlcCisgIGlmICgob3AgJiAweGZmYzcpID09IDB4NWFjMCkgcGMgKz0gMjsJCQkJCVwKKyAgZWxzZSBpZiAob3AgPT0gMHgxNTgwKSBwYyArPSA0OwkJCQkJXAorICBlbHNlIGlmIChvcCA9PSAweDE1YzApIHBjICs9IDY7CQkJCQlcCisgIGlmICgocmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDIpICYgMHhmZmY4KSA9PSAweDdjNDAJCQlcCisgICAgICAmJiAocmVhZF9tZW1vcnlfaW50ZWdlciAocGMgKyAyLCAyKSAmIDB4ZmZmOCkgPT0gMHgxMjQwCQlcCisgICAgICAmJiAocmVhZF9tZW1vcnlfaW50ZWdlciAocGMgKyA4LCAyKSAmIDB4ZmZmOCkgPT0gMHg3YzQ4KQkJXAorICAgIHBjICs9IDEwOwkJCQkJCQkJXAorICBpZiAocmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDIpID09IDB4MTI0MCkgcGMgKz0gNjsJCQlcCisgIGZvciAoOzspIHsJCQkJCQkJCVwKKyAgICBvcCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAyKTsJCQkJCVwKKyAgICBpeCA9IChvcCA+PiAzKSAmIDc7CQkJCQkJCVwKKyAgICBpZiAoaXggIT0gNikgYnJlYWs7CQkJCQkJCVwKKyAgICBpZiAoKG9wICYgMHhmY2MwKSA9PSAweDMwMDApIHBjICs9IDQ7CQkJCVwKKyAgICBlbHNlIGlmICgob3AgJiAweGZjYzApID09IDB4MzA0MCkgcGMgKz0gNjsJCQkJXAorICAgIGVsc2UgaWYgKChvcCAmIDB4ZmNjMCkgPT0gMHgyODAwKSBwYyArPSA0OwkJCQlcCisgICAgZWxzZSBpZiAoKG9wICYgMHhmY2MwKSA9PSAweDI4NDApIHBjICs9IDY7CQkJCVwKKyAgICBlbHNlIGJyZWFrO319CisKKy8qIEltbWVkaWF0ZWx5IGFmdGVyIGEgZnVuY3Rpb24gY2FsbCwgcmV0dXJuIHRoZSBzYXZlZCBwYy4KKyAgIChpZ25vcmUgZnJhbWUgYW5kIHJldHVybiAqJHNwIHNvIHdlIGNhbiBoYW5kbGUgYm90aCBjYWxscyBhbmQgY2FsbHEpICovCisKKyNkZWZpbmUgU0FWRURfUENfQUZURVJfQ0FMTChmcmFtZSkgXAorICAgIHJlYWRfbWVtb3J5X2ludGVnZXIgKHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSksIDQpCisKKy8qIEFkZHJlc3Mgb2YgZW5kIG9mIHN0YWNrIHNwYWNlLgorICAgVGhpcyBpcyAoKFVTUlNUQUNLICsgMHhmZmYpICYgLTB4MTAwMCkpIGZyb20gPGNvbnZleC92bXBhcmFtLmg+IGJ1dAorICAgdGhhdCBleHByZXNzaW9uIGRlcGVuZHMgb24gdGhlIGtlcm5lbCB2ZXJzaW9uOyBpbnN0ZWFkLCBmZXRjaCBhCisgICBwYWdlLXplcm8gcG9pbnRlciBhbmQgZ2V0IGl0IGZyb20gdGhhdC4gIFRoaXMgd2lsbCBiZSBpbnZhbGlkIGlmCisgICB0aGV5IGV2ZXIgY2hhbmdlIHRoZSB3YXkgYmtwdCBzaWduYWxzIGFyZSBkZWxpdmVyZWQuICAqLworCisjZGVmaW5lIFNUQUNLX0VORF9BRERSICgweGZmZmZmMDAwICYgKih1bnNpZ25lZCAqKSAweDgwMDAwMDUwKQorCisvKiBVc2VyLW1vZGUgdHJhcHMgcHVzaCBhbiBleHRlbmRlZCBydG4gYmxvY2ssCisgICB0aGVuIGZhdWx0IHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgUENzICovCisKKyNkZWZpbmUgaXNfdHJhY2VfcGMocGMpICAoKHVuc2lnbmVkKSAoKHBjKSAtICgqKGludCAqKSAweDgwMDAwMDQwKSkgPD0gNCkKKyNkZWZpbmUgaXNfYXJpdGhfcGMocGMpICAoKHVuc2lnbmVkKSAoKHBjKSAtICgqKGludCAqKSAweDgwMDAwMDQ0KSkgPD0gNCkKKyNkZWZpbmUgaXNfYnJlYWtfcGMocGMpICAoKHVuc2lnbmVkKSAoKHBjKSAtICgqKGludCAqKSAweDgwMDAwMDUwKSkgPD0gNCkKKworLyogV2UgbmVlZCB0byBtYW5pcHVsYXRlIHRyYXAgYml0cyBpbiB0aGUgcHN3ICovCisKKyNkZWZpbmUgUFNXX1RSQVBfRkxBR1MJMHg2OTY3MDAwMAorI2RlZmluZSBQU1dfVF9CSVQJMHgwODAwMDAwMAorI2RlZmluZSBQU1dfU19CSVQJMHgwMTAwMDAwMAorCisvKiBTdGFjayBncm93cyBkb3dud2FyZC4gICovCisKKyNkZWZpbmUgSU5ORVJfVEhBTihsaHMscmhzKSAoKGxocykgPCAocmhzKSkKKworLyogU2VxdWVuY2Ugb2YgYnl0ZXMgZm9yIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uIChia3B0KSAgKi8KKworI2RlZmluZSBCUkVBS1BPSU5UIHsweDdkLDB4NTB9CisKKy8qIEFtb3VudCBQQyBtdXN0IGJlIGRlY3JlbWVudGVkIGJ5IGFmdGVyIGEgYnJlYWtwb2ludC4KKyAgIFRoaXMgaXMgb2Z0ZW4gdGhlIG51bWJlciBvZiBieXRlcyBpbiBCUkVBS1BPSU5UIGJ1dCBub3QgYWx3YXlzLgorICAgKFRoZSBicmVhayBQQyBuZWVkcyB0byBiZSBkZWNyZW1lbnRlZCBieSAyLCBidXQgd2UgZG8gaXQgd2hlbiB0aGUKKyAgIGJyZWFrIGZyYW1lIGlzIHJlY29nbml6ZWQgYW5kIHBvcHBlZC4gIFRoYXQgd2F5IGdkYiBjYW4gdGVsbCBicmVha3MKKyAgIGZyb20gdHJhY2UgdHJhcHMgd2l0aCBjZXJ0YWludHkuKSAqLworCisjZGVmaW5lIERFQ1JfUENfQUZURVJfQlJFQUsgMAorCisvKiBTYXkgaG93IGxvbmcgKG9yZGluYXJ5KSByZWdpc3RlcnMgYXJlLiAgVGhpcyBpcyBhIHBpZWNlIG9mIGJvZ29zaXR5CisgICB1c2VkIGluIHB1c2hfd29yZCBhbmQgYSBmZXcgb3RoZXIgcGxhY2VzOyBSRUdJU1RFUl9SQVdfU0laRSBpcyB0aGUKKyAgIHJlYWwgd2F5IHRvIGtub3cgaG93IGJpZyBhIHJlZ2lzdGVyIGlzLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9TSVpFIDgKKworLyogTnVtYmVyIG9mIG1hY2hpbmUgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTlVNX1JFR1MgMjYKKworLyogSW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIG5hbWVzIG9mIHJlZ2lzdGVycy4KKyAgIFRoZXJlIHNob3VsZCBiZSBOVU1fUkVHUyBzdHJpbmdzIGluIHRoaXMgaW5pdGlhbGl6ZXIuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX05BTUVTIHsicGMiLCJwc3ciLCJmcCIsImFwIiwiYTUiLCJhNCIsImEzIiwiYTIiLCJhMSIsInNwIixcCisJCQkiczciLCJzNiIsInM1IiwiczQiLCJzMyIsInMyIiwiczEiLCJzMCIsXAorCQkJIlM3IiwiUzYiLCJTNSIsIlM0IiwiUzMiLCJTMiIsIlMxIiwiUzAifQorCisvKiBSZWdpc3RlciBudW1iZXJzIG9mIHZhcmlvdXMgaW1wb3J0YW50IHJlZ2lzdGVycy4KKyAgIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgInJlYWwiIHJlZ2lzdGVyIG51bWJlcnMsCisgICBhbmQgY29ycmVzcG9uZCB0byB0aGUgZ2VuZXJhbCByZWdpc3RlcnMgb2YgdGhlIG1hY2hpbmUsCisgICBhbmQgc29tZSBhcmUgInBob255IiByZWdpc3RlciBudW1iZXJzIHdoaWNoIGFyZSB0b28gbGFyZ2UKKyAgIHRvIGJlIGFjdHVhbCByZWdpc3RlciBudW1iZXJzIGFzIGZhciBhcyB0aGUgdXNlciBpcyBjb25jZXJuZWQKKyAgIGJ1dCBkbyBzZXJ2ZSB0byBnZXQgdGhlIGRlc2lyZWQgdmFsdWVzIHdoZW4gcGFzc2VkIHRvIHJlYWRfcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIFMwX1JFR05VTSAyNQkJLyogdGhlIHJlYWwgUyByZWdzICovCisjZGVmaW5lIFM3X1JFR05VTSAxOAorI2RlZmluZSBzMF9SRUdOVU0gMTcJCS8qIGxvdy1vcmRlciBoYWx2ZXMgb2YgUyByZWdzICovCisjZGVmaW5lIHM3X1JFR05VTSAxMAorI2RlZmluZSBTUF9SRUdOVU0gOSAJCS8qIEEgcmVncyAqLworI2RlZmluZSBBMV9SRUdOVU0gOAorI2RlZmluZSBBNV9SRUdOVU0gNAorI2RlZmluZSBBUF9SRUdOVU0gMworI2RlZmluZSBGUF9SRUdOVU0gMgkJLyogQ29udGFpbnMgYWRkcmVzcyBvZiBleGVjdXRpbmcgc3RhY2sgZnJhbWUgKi8KKyNkZWZpbmUgUFNfUkVHTlVNIDEJCS8qIENvbnRhaW5zIHByb2Nlc3NvciBzdGF0dXMgKi8KKyNkZWZpbmUgUENfUkVHTlVNIDAJCS8qIENvbnRhaW5zIHByb2dyYW0gY291bnRlciAqLworCisvKiBjb252ZXJ0IGRieCBzdGFiIHJlZ2lzdGVyIG51bWJlciAoZnJvbSBgcicgZGVjbGFyYXRpb24pIHRvIGEgZ2RiIFJFR05VTSAqLworCisjZGVmaW5lIFNUQUJfUkVHX1RPX1JFR05VTSh2YWx1ZSkgXAorICAgICAgKCh2YWx1ZSkgPCA4ID8gUzBfUkVHTlVNIC0gKHZhbHVlKSA6IFNQX1JFR05VTSAtICgodmFsdWUpIC0gOCkpCisKKy8qIFZlY3RvciByZWdpc3RlciBudW1iZXJzLCBub3QgaGFuZGxlZCBhcyBvcmRpbmFyeSByZWdzLgorICAgVGhleSBhcmUgdHJlYXRlZCBhcyBjb252ZW5pZW5jZSB2YXJpYWJsZXMgd2hvc2UgdmFsdWVzIGFyZSByZWFkCisgICBmcm9tIHRoZSBpbmZlcmlvciB3aGVuIG5lZWRlZC4gICovCisKKyNkZWZpbmUgVjBfUkVHTlVNIDAKKyNkZWZpbmUgVjdfUkVHTlVNIDcKKyNkZWZpbmUgVk1fUkVHTlVNIDgKKyNkZWZpbmUgVlNfUkVHTlVNIDkKKyNkZWZpbmUgVkxfUkVHTlVNIDEwCisKKy8qIFRvdGFsIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgdG8gc3RvcmUgb3VyIGNvcGllcyBvZiB0aGUgbWFjaGluZSdzCisgICByZWdpc3RlciBzdGF0ZSwgdGhlIGFycmF5IGByZWdpc3RlcnMnLiAgKi8KKyNkZWZpbmUgUkVHSVNURVJfQllURVMgKDQqMTAgKyA4KjgpCisKKy8qIEluZGV4IHdpdGhpbiBgcmVnaXN0ZXJzJyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3BhY2UgZm9yCisgICByZWdpc3RlciBOLgorICAgTkI6IG11c3QgbWF0Y2ggc3RydWN0dXJlIG9mIHN0cnVjdCBzeXNjYWxsX2NvbnRleHQgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uICovCisKKyNkZWZpbmUgUkVHSVNURVJfQllURShOKSAoKE4pIDwgczdfUkVHTlVNID8gNCooTikgOiBcCisJCQkgIChOKSA8IFM3X1JFR05VTSA/IDQ0ICsgOCAqICgoTiktczdfUkVHTlVNKSA6IFwKKwkJCSAgICAgICAgICAgICAgICAgICAgNDAgKyA4ICogKChOKS1TN19SRUdOVU0pKQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgYWN0dWFsIG1hY2hpbmUgcmVwcmVzZW50YXRpb24KKyAgIGZvciByZWdpc3RlciBOLiAqLworCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pICgoTikgPCBTN19SRUdOVU0gPyA0IDogOCkKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIHByb2dyYW0ncyByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUoTikgUkVHSVNURVJfUkFXX1NJWkUoTikKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9SQVdfU0laRSBjYW4gaGF2ZS4gICovCisKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1JBV19TSVpFIDgKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUgOAorCisvKiBSZXR1cm4gdGhlIEdEQiB0eXBlIG9iamVjdCBmb3IgdGhlICJzdGFuZGFyZCIgZGF0YSB0eXBlCisgICBvZiBkYXRhIGluIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRShOKSBcCisgICAoKE4pIDwgUzdfUkVHTlVNID8gYnVpbHRpbl90eXBlX2ludCA6IGJ1aWx0aW5fdHlwZV9sb25nX2xvbmcpCisKKy8qIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBwbGFjZSBpbiB3aGljaCB0byBjb3B5IHRoZSBzdHJ1Y3R1cmUgdGhlCisgICBzdWJyb3V0aW5lIHdpbGwgcmV0dXJuLiAgVGhpcyBpcyBjYWxsZWQgZnJvbSBjYWxsX2Z1bmN0aW9uLiAqLworCisjZGVmaW5lIFNUT1JFX1NUUlVDVF9SRVRVUk4oQUREUiwgU1ApIFwKKyAgeyB3cml0ZV9yZWdpc3RlciAoQTFfUkVHTlVNLCAoQUREUikpOyB9CisKKy8qIEV4dHJhY3QgZnJvbSBhbiBhcnJheSBSRUdCVUYgY29udGFpbmluZyB0aGUgKHJhdykgcmVnaXN0ZXIgc3RhdGUKKyAgIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIG9mIHR5cGUgVFlQRSwgYW5kIGNvcHkgdGhhdCwgaW4gdmlydHVhbCBmb3JtYXQsCisgICBpbnRvIFZBTEJVRi4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9SRVRVUk5fVkFMVUUoVFlQRSxSRUdCVUYsVkFMQlVGKSBcCisgIG1lbWNweSAoVkFMQlVGLCAmKChjaGFyICopIFJFR0JVRikgW1JFR0lTVEVSX0JZVEUgKFMwX1JFR05VTSkgKyBcCisJCQkgICAgIDggLSBUWVBFX0xFTkdUSCAoVFlQRSldLFwKKwkgVFlQRV9MRU5HVEggKFRZUEUpKQorCisvKiBXcml0ZSBpbnRvIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZQorICAgb2YgdHlwZSBUWVBFLCBnaXZlbiBpbiB2aXJ0dWFsIGZvcm1hdC4gICovCisKKyNkZWZpbmUgU1RPUkVfUkVUVVJOX1ZBTFVFKFRZUEUsVkFMQlVGKSBcCisgICAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKFJFR0lTVEVSX0JZVEUgKFMwX1JFR05VTSksIFZBTEJVRiwgOCkKKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgdGhlIGFkZHJlc3MgaW4gd2hpY2ggYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGl0cyBzdHJ1Y3R1cmUgdmFsdWUsCisgICBhcyBhIENPUkVfQUREUiAob3IgYW4gZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIG9uZSkuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MoUkVHQlVGKSBcCisgICAgKCooaW50ICopICYgKChjaGFyICopIFJFR0JVRikgW1JFR0lTVEVSX0JZVEUgKHMwX1JFR05VTSldKQorCisvKiBEZWZpbmUgdHJhcHBlZCBpbnRlcm5hbCB2YXJpYWJsZSBob29rcyB0byByZWFkIGFuZCB3cml0ZQorICAgdmVjdG9yIGFuZCBjb21tdW5pY2F0aW9uIHJlZ2lzdGVycy4gICovCisKKyNkZWZpbmUgSVNfVFJBUFBFRF9JTlRFUk5BTFZBUiBpc190cmFwcGVkX2ludGVybmFsdmFyCisjZGVmaW5lIFZBTFVFX09GX1RSQVBQRURfSU5URVJOQUxWQVIgdmFsdWVfb2ZfdHJhcHBlZF9pbnRlcm5hbHZhcgorI2RlZmluZSBTRVRfVFJBUFBFRF9JTlRFUk5BTFZBUiBzZXRfdHJhcHBlZF9pbnRlcm5hbHZhcgorCitleHRlcm4gc3RydWN0IHZhbHVlICp2YWx1ZV9vZl90cmFwcGVkX2ludGVybmFsdmFyICgpOworCisvKiBIb29rcyB0byByZWFkIGRhdGEgZnJvbSBzb2ZmIGV4ZWMgYW5kIGNvcmUgZmlsZXMsCisgICBhbmQgdG8gZGVzY3JpYmUgdGhlIGZpbGVzLiAgKi8KKworI2RlZmluZSBGSUxFU19JTkZPX0hPT0sgcHJpbnRfbWFwcworCisvKiBIb29rIHRvIGNhbGwgdG8gcHJpbnQgYSB0eXBlbGVzcyBpbnRlZ2VyIHZhbHVlLCBub3JtYWxseSBwcmludGVkIGluIGRlY2ltYWwuCisgICBGb3IgY29udmV4LCB1c2UgaGV4IGluc3RlYWQgaWYgdGhlIG51bWJlciBsb29rcyBsaWtlIGFuIGFkZHJlc3MuICAqLworCisjZGVmaW5lIFBSSU5UX1RZUEVMRVNTX0lOVEVHRVIgZGVjb3V0CisKKy8qIEZvciB0aGUgbmF0aXZlIGNvbXBpbGVyLCB2YXJpYWJsZXMgZm9yIGEgcGFydGljdWxhciBsZXhpY2FsIGNvbnRleHQKKyAgIGFyZSBsaXN0ZWQgYWZ0ZXIgdGhlIGJlZ2lubmluZyBMQlJBQyBpbnN0ZWFkIG9mIGJlZm9yZSBpbiB0aGUKKyAgIGV4ZWN1dGFibGVzIGxpc3Qgb2Ygc3ltYm9scy4gIFVzaW5nICJnY2NfY29tcGlsZWQuIiB0byBkaXN0aW5ndWlzaAorICAgYmV0d2VlbiBHQ0MgYW5kIG5hdGl2ZSBjb21waWxlciBkb2Vzbid0IHdvcmsgb24gQ29udmV4IGJlY2F1c2UgdGhlCisgICBsaW5rZXIgc29ydHMgdGhlIHN5bWJvbHMgdG8gcHV0ICJnY2NfY29tcGlsZWQuIiBpbiB0aGUgd3JvbmcgcGxhY2UuCisgICBkZXNjIGlzIG5vbnplcm8gZm9yIG5hdGl2ZSwgemVybyBmb3IgZ2NjLiAgICovCisjZGVmaW5lIFZBUklBQkxFU19JTlNJREVfQkxPQ0soZGVzYywgZ2NjX3ApIChkZXNjICE9IDApCisKKy8qIFBjYyBvY2NhaXNpb25hbGx5IHB1dHMgYW4gU08gd2hlcmUgdGhlcmUgc2hvdWxkIGJlIGFuIFNPTC4gICAqLworI2RlZmluZSBQQ0NfU09MX0JST0tFTgorDAorLyogRGVzY3JpYmUgdGhlIHBvaW50ZXIgaW4gZWFjaCBzdGFjayBmcmFtZSB0byB0aGUgcHJldmlvdXMgc3RhY2sgZnJhbWUKKyAgIChpdHMgY2FsbGVyKS4gICovCisKKy8qIEZSQU1FX0NIQUlOIHRha2VzIGEgZnJhbWVfaW5mbyB3aXRoIGEgZnJhbWUncyBub21pbmFsIGFkZHJlc3MgaW4gZmktPmZyYW1lLAorICAgYW5kIHByb2R1Y2VzIHRoZSBmcmFtZSdzIGNoYWluLXBvaW50ZXIuICovCisKKy8qIChjYWxsZXIgZnAgaXMgc2F2ZWQgYXQgOChmcCkpICovCisKKyNkZWZpbmUgRlJBTUVfQ0hBSU4oZmkpICAgKHJlYWRfbWVtb3J5X2ludGVnZXIgKChmaSktPmZyYW1lICsgOCwgNCkpCisKKy8qIERlZmluZSBvdGhlciBhc3BlY3RzIG9mIHRoZSBzdGFjayBmcmFtZS4gICovCisKKy8qIFdlIG5lZWQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHRleHQgaW4gdGhlIGV4ZWMgZmlsZSwgYXMgYSBrbHVkZ2UsCisgICBmb3IgRlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT04gYW5kIENBTExfRFVNTVlfTE9DQVRJT04uICovCisKKyNkZWZpbmUJTkVFRF9URVhUX1NUQVJUX0VORCAxCisKKy8qIEEgbWFjcm8gdGhhdCB0ZWxscyB1cyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpbnZvY2F0aW9uIHJlcHJlc2VudGVkCisgICBieSBGSSBkb2VzIG5vdCBoYXZlIGEgZnJhbWUgb24gdGhlIHN0YWNrIGFzc29jaWF0ZWQgd2l0aCBpdC4gIElmIGl0CisgICBkb2VzIG5vdCwgRlJBTUVMRVNTIGlzIHNldCB0byAxLCBlbHNlIDAuCisgICBPbiBjb252ZXgsIGNoZWNrIGF0IHRoZSByZXR1cm4gYWRkcmVzcyBmb3IgYGNhbGxxJyAtLSBpZiBzbywgZnJhbWVsZXNzLAorICAgb3RoZXJ3aXNlLCBub3QuICAqLworCisjZGVmaW5lIEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OKEZJLCBGUkFNRUxFU1MpIFwKK3sgCQkJCQkJCQkJXAorICBleHRlcm4gQ09SRV9BRERSIHRleHRfc3RhcnQsIHRleHRfZW5kOwkJCQlcCisgIENPUkVfQUREUiBjYWxsX2FkZHIgPSBTQVZFRF9QQ19BRlRFUl9DQUxMIChGSSk7CQkJXAorICAoRlJBTUVMRVNTKSA9IChjYWxsX2FkZHIgPj0gdGV4dF9zdGFydCAmJiBjYWxsX2FkZHIgPCB0ZXh0X2VuZAlcCisJCSAmJiByZWFkX21lbW9yeV9pbnRlZ2VyIChjYWxsX2FkZHIgLSA2LCAxKSA9PSAweDIyKTsJXAorfQorCisjZGVmaW5lIEZSQU1FX1NBVkVEX1BDKGZpKSAocmVhZF9tZW1vcnlfaW50ZWdlciAoKGZpKS0+ZnJhbWUsIDQpKQorCisjZGVmaW5lIEZSQU1FX0FSR1NfQUREUkVTUyhmaSkgKHJlYWRfbWVtb3J5X2ludGVnZXIgKChmaSktPmZyYW1lICsgMTIsIDQpKQorCisjZGVmaW5lIEZSQU1FX0xPQ0FMU19BRERSRVNTKGZpKSAoZmkpLT5mcmFtZQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvIGEgZnJhbWUuCisgICBDYW4gcmV0dXJuIC0xLCBtZWFuaW5nIG5vIHdheSB0byB0ZWxsLiAgKi8KKworI2RlZmluZSBGUkFNRV9OVU1fQVJHUyhudW1hcmdzLCBmaSkgIFwKK3sgbnVtYXJncyA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKEZSQU1FX0FSR1NfQUREUkVTUyAoZmkpIC0gNCwgNCk7IFwKKyAgaWYgKG51bWFyZ3MgPCAwIHx8IG51bWFyZ3MgPj0gMjU2KSBudW1hcmdzID0gLTE7fQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGF0IHN0YXJ0IG9mIGFyZ2xpc3QgdGhhdCBhcmUgbm90IHJlYWxseSBhcmdzLiAgKi8KKworI2RlZmluZSBGUkFNRV9BUkdTX1NLSVAgMAorCisvKiBQdXQgaGVyZSB0aGUgY29kZSB0byBzdG9yZSwgaW50byBhIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzLAorICAgdGhlIGFkZHJlc3NlcyBvZiB0aGUgc2F2ZWQgcmVnaXN0ZXJzIG9mIGZyYW1lIGRlc2NyaWJlZCBieSBGUkFNRV9JTkZPLgorICAgVGhpcyBpbmNsdWRlcyBzcGVjaWFsIHJlZ2lzdGVycyBzdWNoIGFzIHBjIGFuZCBmcCBzYXZlZCBpbiBzcGVjaWFsCisgICB3YXlzIGluIHRoZSBzdGFjayBmcmFtZS4gIHNwIGlzIGV2ZW4gbW9yZSBzcGVjaWFsOgorICAgdGhlIGFkZHJlc3Mgd2UgcmV0dXJuIGZvciBpdCBJUyB0aGUgc3AgZm9yIHRoZSBuZXh0IGZyYW1lLiAgKi8KKworLyogTm9ybWFsIChzaG9ydCkgZnJhbWVzIHNhdmUgb25seSBQQywgRlAsIChjYWxsZWUncykgQVAuICBUbyByZWFzb25hYmx5CisgICBoYW5kbGUgZ2NjIGFuZCBwY2MgcmVnaXN0ZXIgdmFyaWFibGVzLCBzY2FuIHRoZSBjb2RlIGZvbGxvd2luZyB0aGUKKyAgIGNhbGwgZm9yIHRoZSBpbnN0cnVjdGlvbnMgdGhlIGNvbXBpbGVyIGluc2VydHMgdG8gcmVsb2FkIHJlZ2lzdGVyCisgICB2YXJpYWJsZXMgZnJvbSBzdGFjayBzbG90cyBhbmQgcmVjb3JkIHRoZSBzdGFjayBzbG90cyBhcyB0aGUgc2F2ZWQKKyAgIGxvY2F0aW9ucyBvZiB0aG9zZSByZWdpc3RlcnMuICBUaGlzIHdpbGwgb2NjYXNpb25hbGx5IGlkZW50aWZ5IHNvbWUKKyAgIHJhbmRvbSBsb2FkIGFzIGEgc2F2ZWQgcmVnaXN0ZXI7IHRoaXMgaXMgaGFybWxlc3MuICB2YyBkb2VzIG5vdAorICAgZGVjbGFyZSBpdHMgcmVnaXN0ZXIgYWxsb2NhdGlvbiBhY3Rpb25zIGluIHRoZSBzdGFicy4gICovCisKKyNkZWZpbmUgRlJBTUVfRklORF9TQVZFRF9SRUdTKGZyYW1lX2luZm8sIGZyYW1lX3NhdmVkX3JlZ3MpCQlcCit7IHJlZ2lzdGVyIGludCByZWdudW07CQkJCQkJCVwKKyAgcmVnaXN0ZXIgaW50IGZyYW1lX2xlbmd0aCA9CS8qIDMgc2hvcnQsIDIgbG9uZywgMSBleHRlbmRlZCwgMCBjb250ZXh0ICovXAorICAgICAgKHJlYWRfbWVtb3J5X2ludGVnZXIgKChmcmFtZV9pbmZvKS0+ZnJhbWUgKyA0LCA0KSA+PiAyNSkgJiAzOwlcCisgIHJlZ2lzdGVyIENPUkVfQUREUiBmcmFtZV9mcCA9CQkJCQkJXAorICAgICAgcmVhZF9tZW1vcnlfaW50ZWdlciAoKGZyYW1lX2luZm8pLT5mcmFtZSArIDgsIDQpOwkJCVwKKyAgcmVnaXN0ZXIgQ09SRV9BRERSIG5leHRfYWRkcjsJCQkJCQlcCisgIG1lbXNldCAoJmZyYW1lX3NhdmVkX3JlZ3MsICdcMCcsIHNpemVvZiBmcmFtZV9zYXZlZF9yZWdzKTsJCQlcCisgIChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzW1BDX1JFR05VTV0gPSAoZnJhbWVfaW5mbyktPmZyYW1lICsgMDsJCVwKKyAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbUFNfUkVHTlVNXSA9IChmcmFtZV9pbmZvKS0+ZnJhbWUgKyA0OwkJXAorICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tGUF9SRUdOVU1dID0gKGZyYW1lX2luZm8pLT5mcmFtZSArIDg7CQlcCisgIChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzW0FQX1JFR05VTV0gPSBmcmFtZV9mcCArIDEyOwkJCVwKKyAgbmV4dF9hZGRyID0gKGZyYW1lX2luZm8pLT5mcmFtZSArIDEyOwkJCQkJXAorICBpZiAoZnJhbWVfbGVuZ3RoIDwgMykJCQkJCQkJXAorICAgIGZvciAocmVnbnVtID0gQTVfUkVHTlVNOyByZWdudW0gPCBTUF9SRUdOVU07ICsrcmVnbnVtKQkJXAorICAgICAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbcmVnbnVtXSA9IChuZXh0X2FkZHIgKz0gNCk7CQlcCisgIGlmIChmcmFtZV9sZW5ndGggPCAyKQkJCQkJCQlcCisgICAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbU1BfUkVHTlVNXSA9IChuZXh0X2FkZHIgKz0gNCk7CQlcCisgIG5leHRfYWRkciAtPSA0OwkJCQkJCQlcCisgIGlmIChmcmFtZV9sZW5ndGggPCAzKQkJCQkJCQlcCisgICAgZm9yIChyZWdudW0gPSBTN19SRUdOVU07IHJlZ251bSA8IFMwX1JFR05VTTsgKytyZWdudW0pCQlcCisgICAgICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tyZWdudW1dID0gKG5leHRfYWRkciArPSA4KTsJCVwKKyAgaWYgKGZyYW1lX2xlbmd0aCA8IDIpCQkJCQkJCVwKKyAgICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tTMF9SRUdOVU1dID0gKG5leHRfYWRkciArPSA4KTsJCVwKKyAgZWxzZQkJCQkJCQkJCVwKKyAgICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tTUF9SRUdOVU1dID0gbmV4dF9hZGRyICsgODsJCQlcCisgIGlmIChmcmFtZV9sZW5ndGggPT0gMykgewkJCQkJCVwKKyAgICBDT1JFX0FERFIgcGMgPSByZWFkX21lbW9yeV9pbnRlZ2VyICgoZnJhbWVfaW5mbyktPmZyYW1lLCA0KTsJXAorICAgIGludCBvcCwgaXgsIGRpc3A7CQkJCQkJCVwKKyAgICBvcCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAyKTsJCQkJCVwKKyAgICBpZiAoKG9wICYgMHhmZmM3KSA9PSAweDE0ODApIHBjICs9IDQ7IAkvKiBhZGQudyAjLSxzcCAqLwlcCisgICAgZWxzZSBpZiAoKG9wICYgMHhmZmM3KSA9PSAweDU4YzApIHBjICs9IDI7CS8qIGFkZC53ICMtLHNwICovCVwKKyAgICBvcCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAyKTsJCQkJCVwKKyAgICBpZiAoKG9wICYgMHhmZmM3KSA9PSAweDJhMDYpIHBjICs9IDQ7CS8qIGxkLncgLSxhcCAqLwkJXAorICAgIGZvciAoOzspIHsJCQkJCQkJCVwKKyAgICAgIG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDIpOwkJCQkJXAorICAgICAgaXggPSAob3AgPj4gMykgJiA3OwkJCQkJCVwKKyAgICAgIGlmICgob3AgJiAweGZjYzApID09IDB4MjgwMCkgewkJLyogbGQuLSAtLGFrICovCQlcCisgICAgICAgIHJlZ251bSA9IFNQX1JFR05VTSAtIChvcCAmIDcpOwkJCQkJXAorCWRpc3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYyArIDIsIDIpOwkJCQlcCisJcGMgKz0gNDt9CQkJCQkJCVwKKyAgICAgIGVsc2UgaWYgKChvcCAmIDB4ZmNjMCkgPT0gMHgyODQwKSB7CS8qIGxkLi0gLSxhayAqLwkJXAorICAgICAgICByZWdudW0gPSBTUF9SRUdOVU0gLSAob3AgJiA3KTsJCQkJCVwKKwlkaXNwID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMgKyAyLCA0KTsJCQkJXAorCXBjICs9IDY7fQkJCQkJCQlcCisgICAgICBpZiAoKG9wICYgMHhmY2MwKSA9PSAweDMwMDApIHsJCS8qIGxkLi0gLSxzayAqLwkJXAorICAgICAgICByZWdudW0gPSBTMF9SRUdOVU0gLSAob3AgJiA3KTsJCQkJCVwKKwlkaXNwID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMgKyAyLCAyKTsJCQkJXAorCXBjICs9IDQ7fQkJCQkJCQlcCisgICAgICBlbHNlIGlmICgob3AgJiAweGZjYzApID09IDB4MzA0MCkgewkvKiBsZC4tIC0sc2sgKi8JCVwKKyAgICAgICAgcmVnbnVtID0gUzBfUkVHTlVNIC0gKG9wICYgNyk7CQkJCQlcCisJZGlzcCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjICsgMiwgNCk7CQkJCVwKKwlwYyArPSA2O30JCQkJCQkJXAorICAgICAgZWxzZSBpZiAoKG9wICYgMHhmZjAwKSA9PSAweDcxMDApIHsJLyogYnIgY3Jvc3NqdW1wICovCVwKKyAgICAgICAgcGMgKz0gMiAqIChjaGFyKSBvcDsJCQkJCQlcCisgICAgICAgIGNvbnRpbnVlO30JCQkJCQkJXAorICAgICAgZWxzZSBpZiAob3AgPT0gMHgwMTQwKSB7CQkJLyogam1wIGNyb3NzanVtcCAqLwlcCisgICAgICAgIHBjID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMgKyAyLCA0KTsJCQkJXAorICAgICAgICBjb250aW51ZTt9CQkJCQkJCVwKKyAgICAgIGVsc2UgYnJlYWs7CQkJCQkJCVwKKyAgICAgIGlmICgoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tyZWdudW1dKQkJCQlcCisJYnJlYWs7CQkJCQkJCQlcCisgICAgICBpZiAoaXggPT0gNykgZGlzcCArPSBmcmFtZV9mcDsJCQkJCVwKKyAgICAgIGVsc2UgaWYgKGl4ID09IDYpIGRpc3AgKz0gcmVhZF9tZW1vcnlfaW50ZWdlciAoZnJhbWVfZnAgKyAxMiwgNCk7CVwKKyAgICAgIGVsc2UgaWYgKGl4ICE9IDApIGJyZWFrOwkJCQkJCVwKKyAgICAgIChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzW3JlZ251bV0gPQkJCQkJXAorCWRpc3AgLSA4ICsgKDEgPDwgKChvcCA+PiA4KSAmIDMpKTsJCQkJXAorICAgICAgaWYgKHJlZ251bSA+PSBTN19SRUdOVU0pCQkJCQkJXAorICAgICAgICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tyZWdudW0gLSBTMF9SRUdOVU0gKyBzMF9SRUdOVU1dID0JXAorCSAgZGlzcCAtIDQgKyAoMSA8PCAoKG9wID4+IDgpICYgMykpOwkJCQlcCisgICAgfQkJCQkJCQkJCVwKKyAgfQkJCQkJCQkJCVwKK30KKwwKKy8qIFRoaW5ncyBuZWVkZWQgZm9yIG1ha2luZyB0aGUgaW5mZXJpb3IgY2FsbCBmdW5jdGlvbnMuICAqLworCisjZGVmaW5lCUNBTExfRFVNTVlfTE9DQVRJT04JQkVGT1JFX1RFWFRfRU5ECisKKy8qIFB1c2ggYW4gZW1wdHkgc3RhY2sgZnJhbWUsIHRvIHJlY29yZCB0aGUgY3VycmVudCBQQywgZXRjLiAgKi8KKworI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FIFwKK3sgcmVnaXN0ZXIgQ09SRV9BRERSIHNwID0gcmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKTsJCQlcCisgIHJlZ2lzdGVyIGludCByZWdudW07CQkJCSAgICAJCQlcCisgIGNoYXIgYnVmWzhdOwkJCQkJICAgIAkJCVwKKyAgbG9uZyB3b3JkOwkJCQkJCQkJXAorICBmb3IgKHJlZ251bSA9IFMwX1JFR05VTTsgcmVnbnVtID49IFM3X1JFR05VTTsgLS1yZWdudW0pIHsgCQlcCisgICAgcmVhZF9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSAocmVnbnVtKSwgYnVmLCA4KTsgCQlcCisgICAgc3AgPSBwdXNoX2J5dGVzIChzcCwgYnVmLCA4KTt9CQkgICAgCQkJXAorICBmb3IgKHJlZ251bSA9IFNQX1JFR05VTTsgcmVnbnVtID49IEZQX1JFR05VTTsgLS1yZWdudW0pIHsgCQlcCisgICAgd29yZCA9IHJlYWRfcmVnaXN0ZXIgKHJlZ251bSk7CQkJCQlcCisgICAgc3AgPSBwdXNoX2J5dGVzIChzcCwgJndvcmQsIDQpO30gICAJCQkJCVwKKyAgd29yZCA9IChyZWFkX3JlZ2lzdGVyIChQU19SRUdOVU0pICZ+ICgzPDwyNSkpIHwgKDE8PDI1KTsJCVwKKyAgc3AgPSBwdXNoX2J5dGVzIChzcCwgJndvcmQsIDQpOyAJCQkJCVwKKyAgd29yZCA9IHJlYWRfcmVnaXN0ZXIgKFBDX1JFR05VTSk7CQkJCQlcCisgIHNwID0gcHVzaF9ieXRlcyAoc3AsICZ3b3JkLCA0KTsgICAJCQkJCVwKKyAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgc3ApOwkJICAgIAkJCVwKKyAgd3JpdGVfcmVnaXN0ZXIgKEZQX1JFR05VTSwgc3ApOwkJICAgIAkJCVwKKyAgd3JpdGVfcmVnaXN0ZXIgKEFQX1JFR05VTSwgc3ApO30KKworLyogRGlzY2FyZCBmcm9tIHRoZSBzdGFjayB0aGUgaW5uZXJtb3N0IGZyYW1lLCByZXN0b3JpbmcgYWxsIHJlZ2lzdGVycy4gICovCisKKyNkZWZpbmUgUE9QX0ZSQU1FICBkbyB7XAorICByZWdpc3RlciBDT1JFX0FERFIgZnAgPSByZWFkX3JlZ2lzdGVyIChGUF9SRUdOVU0pOwkgICAgXAorICByZWdpc3RlciBpbnQgcmVnbnVtOwkJCQkJICAgIFwKKyAgcmVnaXN0ZXIgaW50IGZyYW1lX2xlbmd0aCA9CS8qIDMgc2hvcnQsIDIgbG9uZywgMSBleHRlbmRlZCwgMCBjb250ZXh0ICovIFwKKyAgICAgIChyZWFkX21lbW9yeV9pbnRlZ2VyIChmcCArIDQsIDQpID4+IDI1KSAmIDM7ICAgICAgICAgIFwKKyAgY2hhciBidWZbOF07CQkJCQkgICAgICAgICAgICBcCisgIHdyaXRlX3JlZ2lzdGVyIChQQ19SRUdOVU0sIHJlYWRfbWVtb3J5X2ludGVnZXIgKGZwLCA0KSk7ICBcCisgIHdyaXRlX3JlZ2lzdGVyIChQU19SRUdOVU0sIHJlYWRfbWVtb3J5X2ludGVnZXIgKGZwICs9IDQsIDQpKTsgIFwKKyAgd3JpdGVfcmVnaXN0ZXIgKEZQX1JFR05VTSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnAgKz0gNCwgNCkpOyAgXAorICB3cml0ZV9yZWdpc3RlciAoQVBfUkVHTlVNLCByZWFkX21lbW9yeV9pbnRlZ2VyIChmcCArPSA0LCA0KSk7ICBcCisgIGlmIChmcmFtZV9sZW5ndGggPCAzKSAJCQkJICAgICBcCisgICAgZm9yIChyZWdudW0gPSBBNV9SRUdOVU07IHJlZ251bSA8IFNQX1JFR05VTTsgKytyZWdudW0pICAgXAorICAgICAgd3JpdGVfcmVnaXN0ZXIgKHJlZ251bSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnAgKz0gNCwgNCkpOyBcCisgIGlmIChmcmFtZV9sZW5ndGggPCAyKQkJCQkJICAgICBcCisgICAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnAgKz0gNCwgNCkpOyBcCisgIGZwIC09IDQ7CQkJCQkJCVwKKyAgaWYgKGZyYW1lX2xlbmd0aCA8IDMpICAJCQkJCVwKKyAgICBmb3IgKHJlZ251bSA9IFM3X1JFR05VTTsgcmVnbnVtIDwgUzBfUkVHTlVNOyArK3JlZ251bSkgewlcCisgICAgICByZWFkX21lbW9yeSAoZnAgKz0gOCwgYnVmLCA4KTsJCQkJXAorICAgICAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKFJFR0lTVEVSX0JZVEUgKHJlZ251bSksIGJ1ZiwgOCk7fSAgIFwKKyAgaWYgKGZyYW1lX2xlbmd0aCA8IDIpCXsJCQkJCVwKKyAgICByZWFkX21lbW9yeSAoZnAgKz0gOCwgYnVmLCA4KTsJCQkJXAorICAgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFIChyZWdudW0pLCBidWYsIDgpO30gICAgIFwKKyAgZWxzZSB3cml0ZV9yZWdpc3RlciAoU1BfUkVHTlVNLCBmcCArIDgpOwkJCVwKKyAgZmx1c2hfY2FjaGVkX2ZyYW1lcyAoKTsJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qIFRoaXMgc2VxdWVuY2Ugb2Ygd29yZHMgaXMgdGhlIGluc3RydWN0aW9ucworICAgICBtb3Ygc3AsYXAKKyAgICAgcHNoZWEgNjk2OTY5NjkKKyAgICAgY2FsbHMgMzIzMjMyMzIKKyAgICAgYmtwdAorICAgTm90ZSB0aGlzIGlzIDE2IGJ5dGVzLiAgKi8KKworI2RlZmluZSBDQUxMX0RVTU1ZIHsweDUwODYwZDQwNjk2OTY5NjlMTCwweDIxNDAzMjMyMzIzMjdkNTBMTH0KKworI2RlZmluZSBDQUxMX0RVTU1ZX0xFTkdUSCAxNgorCisjZGVmaW5lIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUIDAKKworLyogSW5zZXJ0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGFyZ3MgYW5kIGZ1bmN0aW9uIGFkZHJlc3MKKyAgIGludG8gYSBjYWxsIHNlcXVlbmNlIG9mIHRoZSBhYm92ZSBmb3JtIHN0b3JlZCBhdCBEVU1NWU5BTUUuICAqLworCisjZGVmaW5lIEZJWF9DQUxMX0RVTU1ZKGR1bW15bmFtZSwgcGMsIGZ1biwgbmFyZ3MsIGFyZ3MsIHR5cGUsIGdjY19wKSAgIFwKK3sgKihpbnQgKikoKGNoYXIgKikgZHVtbXluYW1lICsgNCkgPSBuYXJnczsJXAorICAqKGludCAqKSgoY2hhciAqKSBkdW1teW5hbWUgKyAxMCkgPSBmdW47IH0KKwwKKy8qIERlZnMgdG8gcmVhZCBzb2ZmIHN5bWJvbCB0YWJsZXMsIHNlZSBkYnhyZWFkLmMgKi8KKworI2RlZmluZSBOVU1CRVJfT0ZfU1lNQk9MUyAgICAoKGxvbmcpIG9wdGhkci5vX25zeW1zKQorI2RlZmluZSBTVFJJTkdfVEFCTEVfT0ZGU0VUICAoKGxvbmcpIGZpbGVoZHIuaF9zdHJwdHIpCisjZGVmaW5lIFNZTUJPTF9UQUJMRV9PRkZTRVQgICgobG9uZykgb3B0aGRyLm9fc3ltcHRyKQorI2RlZmluZSBTVFJJTkdfVEFCTEVfU0laRSAgICAoKGxvbmcpIGZpbGVoZHIuaF9zdHJzaXopCisjZGVmaW5lIFNJWkVfT0ZfVEVYVF9TRUdNRU5UICgobG9uZykgdHh0aGRyLnNfc2l6ZSkKKyNkZWZpbmUgRU5UUllfUE9JTlQgICAgICAgICAgKChsb25nKSBvcHRoZHIub19lbnRyeSkKKworI2RlZmluZSBSRUFEX1NUUklOR19UQUJMRV9TSVpFKEJVRkZFUikgXAorICAgIChCVUZGRVIgPSBTVFJJTkdfVEFCTEVfU0laRSkKKworI2RlZmluZSBERUNMQVJFX0ZJTEVfSEVBREVSUyBcCisgIEZJTEVIRFIgZmlsZWhkcjsJCQkJCQkJXAorICBPUFRIRFIgb3B0aGRyOwkJCQkJCQlcCisgIFNDTkhEUiB0eHRoZHIKKworI2RlZmluZSBSRUFEX0ZJTEVfSEVBREVSUyhERVNDLE5BTUUpIFwKK3sJCQkJCQkJCQlcCisgIGludCBuOwkJCQkJCQkJXAorICB2YWwgPSBteXJlYWQgKERFU0MsICZmaWxlaGRyLCBzaXplb2YgZmlsZWhkcik7CQkJXAorICBpZiAodmFsIDwgMCkJCQkJCQkJCVwKKyAgICBwZXJyb3Jfd2l0aF9uYW1lIChOQU1FKTsJCQkJCQlcCisgIGlmICghIElTX1NPRkZfTUFHSUMgKGZpbGVoZHIuaF9tYWdpYykpCQkJCVwKKyAgICBlcnJvciAoIiVzOiBub3QgYW4gZXhlY3V0YWJsZSBmaWxlLiIsIE5BTUUpOwkJCVwKKyAgbHNlZWsgKERFU0MsIDBMLCAwKTsJCQkJCQkJXAorICBpZiAobXlyZWFkIChERVNDLCAmZmlsZWhkciwgc2l6ZW9mIGZpbGVoZHIpIDwgMCkJCQlcCisgICAgcGVycm9yX3dpdGhfbmFtZSAoTkFNRSk7CQkJCQkJXAorICBpZiAobXlyZWFkIChERVNDLCAmb3B0aGRyLCBmaWxlaGRyLmhfb3B0aGRyKSA8PSAwKQkJCVwKKyAgICBwZXJyb3Jfd2l0aF9uYW1lIChOQU1FKTsJCQkJCQlcCisgIGZvciAobiA9IDA7IG4gPCBmaWxlaGRyLmhfbnNjbnM7IG4rKykJCQkJCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgaWYgKG15cmVhZCAoREVTQywgJnR4dGhkciwgc2l6ZW9mIHR4dGhkcikgPCAwKQkJCVwKKwlwZXJyb3Jfd2l0aF9uYW1lIChOQU1FKTsJCQkJCVwKKyAgICAgIGlmICgodHh0aGRyLnNfZmxhZ3MgJiBTX1RZUE1BU0spID09IFNfVEVYVCkJCQlcCisJYnJlYWs7CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKK30KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvY29udmV4L3htLWNvbnZleC5oIGIvZ2RiL2NvbmZpZy9jb252ZXgveG0tY29udmV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjZWU0ZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvY29udmV4L3htLWNvbnZleC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIERlZmluaXRpb25zIHRvIG1ha2UgR0RCIHJ1biBvbiBDb252ZXggVW5peCAoNGJzZCkKKyAgIENvcHlyaWdodCAxOTg5LCAxOTkxLCAxOTkyLCAxOTk2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBCSUdfRU5ESUFOCisKKyNkZWZpbmUgQVRUQUNIX0RFVEFDSAorI2RlZmluZSBIQVZFX1dBSVRfU1RSVUNUCisjZGVmaW5lIE5PX1NJR0lOVEVSUlVQVAorCisvKiBVc2UgU0lHQ09OVCByYXRoZXIgdGhhbiBTSUdUU1RQIGJlY2F1c2UgY29udmV4IFVuaXggb2NjYXNpb25hbGx5CisgICB0dXJrZXlzIFNJR1RTVFAuICBJIHRoaW5rLiAgKi8KKworI2RlZmluZSBTVE9QX1NJR05BTCBTSUdDT05UCisKKy8qIEhvb2sgdG8gY2FsbCBhZnRlciBjcmVhdGluZyBpbmZlcmlvciBwcm9jZXNzLiAgTm93IGluaXRfdHJhY2VfZnVuCisgICBpcyBpbiB0aGUgc2FtZSBwbGFjZS4gIFNvIHJlLXdyaXRlIHRoaXMgdG8gdXNlIHRoZSBpbml0X3RyYWNlX2Z1bgorICAgKG1ha2luZyBjb252ZXggYSBkZWJ1Z2dpbmcgdGFyZ2V0KS4gIEZJWE1FLiAgKi8KKworI2RlZmluZSBDUkVBVEVfSU5GRVJJT1JfSE9PSyBjcmVhdGVfaW5mZXJpb3JfaG9vawpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9kMTB2L2QxMHYubXQgYi9nZGIvY29uZmlnL2QxMHYvZDEwdi5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGRiMWIzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9kMTB2L2QxMHYubXQKQEAgLTAsMCArMSw1IEBACisjIFRhcmdldDogTWl0c3ViaXNoaSBEMTBWIHByb2Nlc3NvcgorVERFUEZJTEVTPSBkMTB2LXRkZXAubyByZW1vdGUtZDEwdi5vCitUTV9GSUxFPSB0bS1kMTB2LmgKK1NJTV9PQlM9IHJlbW90ZS1zaW0ubworU0lNPSAuLi9zaW0vZDEwdi9saWJzaW0uYQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9kMTB2L3RtLWQxMHYuaCBiL2dkYi9jb25maWcvZDEwdi90bS1kMTB2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3NWJjNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvZDEwdi90bS1kMTB2LmgKQEAgLTAsMCArMSwzMzcgQEAKKy8qIFRhcmdldC1zcGVjaWZpYyBkZWZpbml0aW9uIGZvciB0aGUgTWl0c3ViaXNoaSBEMTBWCisgICBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogQ29udHJpYnV0ZWQgYnkgTWFydGluIEh1bnQsIGh1bnRAY3lnbnVzLmNvbSAqLworCisjZGVmaW5lIEdEQl9UQVJHRVRfSVNfRDEwVgorCisvKiBEZWZpbmUgdGhlIGJpdCwgYnl0ZSwgYW5kIHdvcmQgb3JkZXJpbmcgb2YgdGhlIG1hY2hpbmUuICAqLworCisjZGVmaW5lIFRBUkdFVF9CWVRFX09SREVSCUJJR19FTkRJQU4KKworLyogT2Zmc2V0IGZyb20gYWRkcmVzcyBvZiBmdW5jdGlvbiB0byBzdGFydCBvZiBpdHMgY29kZS4KKyAgIFplcm8gb24gbW9zdCBtYWNoaW5lcy4gICovCisKKyNkZWZpbmUgRlVOQ1RJT05fU1RBUlRfT0ZGU0VUIDAKKworLyogdGhlc2UgYXJlIHRoZSBhZGRyZXNzZXMgdGhlIEQxMFYtRVZBIGJvYXJkIG1hcHMgZGF0YSAqLworLyogYW5kIGluc3RydWN0aW9uIG1lbW9yeSB0by4gKi8KKworI2RlZmluZSBETUVNX1NUQVJUCTB4MDAwMDAwMAorI2RlZmluZSBJTUVNX1NUQVJUCTB4MTAwMDAwMAorI2RlZmluZSBTVEFDS19TVEFSVAkweDAwMDdmZmUKKworI2lmZGVmIF9fU1REQ19fCQkvKiBGb3J3YXJkIGRlY2xzIGZvciBwcm90b3R5cGVzICovCitzdHJ1Y3QgZnJhbWVfaW5mbzsKK3N0cnVjdCBmcmFtZV9zYXZlZF9yZWdzOyAKK3N0cnVjdCB0eXBlOworc3RydWN0IHZhbHVlOworI2VuZGlmCisKKy8qIEFkdmFuY2UgUEMgYWNyb3NzIGFueSBmdW5jdGlvbiBlbnRyeSBwcm9sb2d1ZSBpbnN0cnVjdGlvbnMKKyAgIHRvIHJlYWNoIHNvbWUgInJlYWwiIGNvZGUuICAqLworCitleHRlcm4gQ09SRV9BRERSIGQxMHZfc2tpcF9wcm9sb2d1ZSAoKTsKKyNkZWZpbmUgU0tJUF9QUk9MT0dVRShpcCkgXAorICAgIHsoaXApID0gZDEwdl9za2lwX3Byb2xvZ3VlKGlwKTt9CisKKworLyogU3RhY2sgZ3Jvd3MgZG93bndhcmQuICAqLworI2RlZmluZSBJTk5FUl9USEFOKGxocyxyaHMpICgobGhzKSA8IChyaHMpKQorCisvKiBmb3IgYSBicmVha3BvaW50LCB1c2UgImRidCB8fCBub3AiICovCisjZGVmaW5lIEJSRUFLUE9JTlQgezB4MmYsIDB4OTAsIDB4NWUsIDB4MDB9IAorCisvKiBJZiB5b3VyIGtlcm5lbCByZXNldHMgdGhlIHBjIGFmdGVyIHRoZSB0cmFwIGhhcHBlbnMgeW91IG1heSBuZWVkIHRvCisgICBkZWZpbmUgdGhpcyBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZS4gICovCisjZGVmaW5lIERFQ1JfUENfQUZURVJfQlJFQUsgNAorCisjZGVmaW5lIFJFR0lTVEVSX05BTUVTIFwKK3sgInIwIiwgInIxIiwgInIyIiwgInIzIiwgInI0IiwgInI1IiwgICJyNiIsICJyNyIsIFwKKyAgICAicjgiLCAicjkiLCAicjEwIiwicjExIiwicjEyIiwgInIxMyIsICJyMTQiLCJyMTUiLFwKKyAgICAicHN3IiwiYnBzdyIsInBjIiwiYnBjIiwgImNyNCIsICJjcjUiLCAiY3I2IiwgInJwdF9jIixcCisgICAgInJwdF9zIiwicnB0X2UiLCAibW9kX3MiLCAibW9kX2UiLCAiY3IxMiIsICJjcjEzIiwgImliYSIsICJjcjE1IixcCisgICAgImltYXAwIiwiaW1hcDEiLCJkbWFwIiwiYTAiLCAiYTEiXAorICAgIH0KKworI2RlZmluZSBOVU1fUkVHUyAzNworCisvKiBSZWdpc3RlciBudW1iZXJzIG9mIHZhcmlvdXMgaW1wb3J0YW50IHJlZ2lzdGVycy4KKyAgIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgInJlYWwiIHJlZ2lzdGVyIG51bWJlcnMsCisgICBhbmQgY29ycmVzcG9uZCB0byB0aGUgZ2VuZXJhbCByZWdpc3RlcnMgb2YgdGhlIG1hY2hpbmUsCisgICBhbmQgc29tZSBhcmUgInBob255IiByZWdpc3RlciBudW1iZXJzIHdoaWNoIGFyZSB0b28gbGFyZ2UKKyAgIHRvIGJlIGFjdHVhbCByZWdpc3RlciBudW1iZXJzIGFzIGZhciBhcyB0aGUgdXNlciBpcyBjb25jZXJuZWQKKyAgIGJ1dCBkbyBzZXJ2ZSB0byBnZXQgdGhlIGRlc2lyZWQgdmFsdWVzIHdoZW4gcGFzc2VkIHRvIHJlYWRfcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIFIwX1JFR05VTQkwCisjZGVmaW5lIExSX1JFR05VTSAJMTMKKyNkZWZpbmUgU1BfUkVHTlVNIAkxNQorI2RlZmluZSBGUF9SRUdOVU0JMTEKKyNkZWZpbmUgUENfUkVHTlVNIAkxOAorI2RlZmluZSBQU1dfUkVHTlVNIAkxNgorI2RlZmluZSBJTUFQMF9SRUdOVU0JMzIKKyNkZWZpbmUgSU1BUDFfUkVHTlVNCTMzCisjZGVmaW5lIERNQVBfUkVHTlVNCTM0CisjZGVmaW5lIEEwX1JFR05VTSAJMzUKKworLyogU2F5IGhvdyBtdWNoIG1lbW9yeSBpcyBuZWVkZWQgdG8gc3RvcmUgYSBjb3B5IG9mIHRoZSByZWdpc3RlciBzZXQgKi8KKyNkZWZpbmUgUkVHSVNURVJfQllURVMgICAgKChOVU1fUkVHUy0yKSoyKzE2KSAKKworLyogSW5kZXggd2l0aGluIGByZWdpc3RlcnMnIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzcGFjZSBmb3IKKyAgIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0JZVEUoTikgIFwKKyggKChOKSA+IEEwX1JFR05VTSkgPyAoICgoTiktQTBfUkVHTlVNKSo4ICsgQTBfUkVHTlVNKjIgKSA6ICgoTikgKiAyKSApCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBhY3R1YWwgbWFjaGluZSByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pICggKChOKSA+PSBBMF9SRUdOVU0pID8gOCA6IDIgKQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgcHJvZ3JhbSdzIHJlcHJlc2VudGF0aW9uCisgICBmb3IgcmVnaXN0ZXIgTi4gICovICAgCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfU0laRShOKSAoICgoTikgPj0gQTBfUkVHTlVNKSA/IDggOiAoICgoTikgPT0gUENfUkVHTlVNIHx8IChOKSA9PSBTUF9SRUdOVU0pID8gNCA6IDIgKSkKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9SQVdfU0laRSBjYW4gaGF2ZS4gICovCisKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1JBV19TSVpFIDgKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUgOAorCisvKiBSZXR1cm4gdGhlIEdEQiB0eXBlIG9iamVjdCBmb3IgdGhlICJzdGFuZGFyZCIgZGF0YSB0eXBlCisgICBvZiBkYXRhIGluIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRShOKSBcCisoICgoTikgPCBBMF9SRUdOVU0gKSA/ICgoTikgPT0gUENfUkVHTlVNIHx8IChOKSA9PSBTUF9SRUdOVU0gPyBidWlsdGluX3R5cGVfbG9uZyA6IGJ1aWx0aW5fdHlwZV9zaG9ydCkgOiBidWlsdGluX3R5cGVfbG9uZ19sb25nKQorCisKKy8qIGNvbnZlcnQgJHBjIGFuZCAkc3AgdG8vZnJvbSB2aXJ0dWFsIGFkZHJlc3NlcyAqLworI2RlZmluZSBSRUdJU1RFUl9DT05WRVJUSUJMRShOKSAoKE4pID09IFBDX1JFR05VTSB8fCAoTikgPT0gU1BfUkVHTlVNKQorI2RlZmluZSBSRUdJU1RFUl9DT05WRVJUX1RPX1ZJUlRVQUwoUkVHTlVNLFRZUEUsRlJPTSxUTykgXAoreyBcCisgICAgVUxPTkdFU1QgeCA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoKEZST00pLCBSRUdJU1RFUl9SQVdfU0laRSAoUkVHTlVNKSk7IFwKKyAgICBpZiAoUkVHTlVNID09IFBDX1JFR05VTSkgeCA9ICh4IDw8IDIpIHwgSU1FTV9TVEFSVDsgXAorICAgIGVsc2UgeCB8PSBETUVNX1NUQVJUOyBcCisgICAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoKFRPKSwgVFlQRV9MRU5HVEgoVFlQRSksIHgpOyBcCit9CisjZGVmaW5lIFJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXKFRZUEUsUkVHTlVNLEZST00sVE8pIFwKK3sgXAorICAgIFVMT05HRVNUIHggPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKChGUk9NKSwgVFlQRV9MRU5HVEgoVFlQRSkpOyBcCisgICAgeCAmPSAweDNmZmZmOyBcCisgICAgaWYgKFJFR05VTSA9PSBQQ19SRUdOVU0pIHggPj49IDI7IFwKKyAgICBzdG9yZV91bnNpZ25lZF9pbnRlZ2VyICgoVE8pLCAyLCB4KTsgXAorfQorCisjZGVmaW5lIEQxMFZfTUFLRV9EQUREUih4KSAoKHgpIHwgRE1FTV9TVEFSVCkKKyNkZWZpbmUgRDEwVl9NQUtFX0lBRERSKHgpICgoKHgpIDw8IDIpIHwgSU1FTV9TVEFSVCkKKworI2RlZmluZSBEMTBWX0RBRERSX1AoWCkgKCgoWCkgJiAweDMwMDAwMDApID09IERNRU1fU1RBUlQpCisjZGVmaW5lIEQxMFZfSUFERFJfUChYKSAoKChYKSAmIDB4MzAwMDAwMCkgPT0gSU1FTV9TVEFSVCkKKworI2RlZmluZSBEMTBWX0NPTlZFUlRfSUFERFJfVE9fUkFXKFgpICgoKFgpID4+IDIpICYgMHhmZmZmKQorI2RlZmluZSBEMTBWX0NPTlZFUlRfREFERFJfVE9fUkFXKFgpICgoWCkgJiAweGZmZmYpCisKKyNkZWZpbmUgQVJHMV9SRUdOVU0gUjBfUkVHTlVNCisjZGVmaW5lIEFSR05fUkVHTlVNIDMKKyNkZWZpbmUgUkVUMV9SRUdOVU0gUjBfUkVHTlVNCisKKy8qIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBwbGFjZSBpbiB3aGljaCB0byBjb3B5IHRoZSBzdHJ1Y3R1cmUgdGhlCisgICBzdWJyb3V0aW5lIHdpbGwgcmV0dXJuLiAgVGhpcyBpcyBjYWxsZWQgZnJvbSBjYWxsX2Z1bmN0aW9uLiAKKworICAgV2Ugc3RvcmUgc3RydWN0cyB0aHJvdWdoIGEgcG9pbnRlciBwYXNzZWQgaW4gdGhlIGZpcnN0IEFyZ3VtZW50CisgICByZWdpc3Rlci4gKi8KKworI2RlZmluZSBTVE9SRV9TVFJVQ1RfUkVUVVJOKEFERFIsIFNQKSBcCisgICAgeyB3cml0ZV9yZWdpc3RlciAoQVJHMV9SRUdOVU0sIChBRERSKSk7ICB9CisKKworLyogV3JpdGUgaW50byBhcHByb3ByaWF0ZSByZWdpc3RlcnMgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUKKyAgIG9mIHR5cGUgVFlQRSwgZ2l2ZW4gaW4gdmlydHVhbCBmb3JtYXQuICAKKworICAgVGhpbmdzIGFsd2F5cyBnZXQgcmV0dXJuZWQgaW4gUkVUMV9SRUdOVU0sIFJFVDJfUkVHTlVNLCAuLi4gKi8KKworI2RlZmluZSBTVE9SRV9SRVRVUk5fVkFMVUUoVFlQRSxWQUxCVUYpIFwKKyAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKFJFR0lTVEVSX0JZVEUoUkVUMV9SRUdOVU0pLCBWQUxCVUYsIFRZUEVfTEVOR1RIIChUWVBFKSkKKworCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICB0aGUgYWRkcmVzcyBpbiB3aGljaCBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gaXRzIHN0cnVjdHVyZSB2YWx1ZSwKKyAgIGFzIGEgQ09SRV9BRERSIChvciBhbiBleHByZXNzaW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgb25lKS4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyhSRUdCVUYpIFwKKyAgICAgKGV4dHJhY3RfYWRkcmVzcyAoKFJFR0JVRikgKyBSRUdJU1RFUl9CWVRFIChBUkcxX1JFR05VTSksIFJFR0lTVEVSX1JBV19TSVpFIChBUkcxX1JFR05VTSkpIHwgRE1FTV9TVEFSVCkKKworLyogU2hvdWxkIHdlIHVzZSBFWFRSQUNUX1NUUlVDVF9WQUxVRV9BRERSRVNTIGluc3RlYWQgb2YKKyAgIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFPyAgR0NDX1AgaXMgdHJ1ZSBpZiBjb21waWxlZCB3aXRoIGdjYworICAgYW5kIFRZUEUgaXMgdGhlIHR5cGUgKHdoaWNoIGlzIGtub3duIHRvIGJlIHN0cnVjdCwgdW5pb24gb3IgYXJyYXkpLgorCisgICBUaGUgZDEwdiByZXR1cm5zIGFueXRoaW5nIGxlc3MgdGhhbiA4IGJ5dGVzIGluIHNpemUgaW4KKyAgIHJlZ2lzdGVycy4gKi8KKworZXh0ZXJuIHVzZV9zdHJ1Y3RfY29udmVudGlvbl9mbiBkMTB2X3VzZV9zdHJ1Y3RfY29udmVudGlvbjsKKyNkZWZpbmUgVVNFX1NUUlVDVF9DT05WRU5USU9OKGdjY19wLCB0eXBlKSBkMTB2X3VzZV9zdHJ1Y3RfY29udmVudGlvbiAoZ2NjX3AsIHR5cGUpCisKKwwKKworLyogRGVmaW5lIG90aGVyIGFzcGVjdHMgb2YgdGhlIHN0YWNrIGZyYW1lLiAKKyAgIHdlIGtlZXAgYSBjb3B5IG9mIHRoZSB3b3JrZWQgb3V0IHJldHVybiBwYyBseWluZyBhcm91bmQsIHNpbmNlIGl0CisgICBpcyBhIHVzZWZ1bCBiaXQgb2YgaW5mbyAqLworCisjZGVmaW5lIEVYVFJBX0ZSQU1FX0lORk8gXAorICAgIENPUkVfQUREUiByZXR1cm5fcGM7IFwKKyAgICBpbnQgZnJhbWVsZXNzOyBcCisgICAgaW50IHNpemU7CisKKyNkZWZpbmUgSU5JVF9FWFRSQV9GUkFNRV9JTkZPKGZyb21sZWFmLCBmaSkgXAorICAgIGQxMHZfaW5pdF9leHRyYV9mcmFtZV9pbmZvKGZyb21sZWFmLCBmaSkgCisKK2V4dGVybiB2b2lkIGQxMHZfaW5pdF9leHRyYV9mcmFtZV9pbmZvIFBBUkFNUyAoKCBpbnQgZnJvbWxlYWYsIHN0cnVjdCBmcmFtZV9pbmZvICpmaSApKTsKKworLyogQSBtYWNybyB0aGF0IHRlbGxzIHVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGludm9jYXRpb24gcmVwcmVzZW50ZWQKKyAgIGJ5IEZJIGRvZXMgbm90IGhhdmUgYSBmcmFtZSBvbiB0aGUgc3RhY2sgYXNzb2NpYXRlZCB3aXRoIGl0LiAgSWYgaXQKKyAgIGRvZXMgbm90LCBGUkFNRUxFU1MgaXMgc2V0IHRvIDEsIGVsc2UgMC4gICovCisKKyNkZWZpbmUgRlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT04oRkksIEZSQU1FTEVTUykgXAorICAoRlJBTUVMRVNTKSA9IGZyYW1lbGVzc19sb29rX2Zvcl9wcm9sb2d1ZShGSSkKKworI2RlZmluZSBGUkFNRV9DSEFJTihGUkFNRSkgICAgICAgZDEwdl9mcmFtZV9jaGFpbihGUkFNRSkKK2V4dGVybiBpbnQgZDEwdl9mcmFtZV9jaGFpbl92YWxpZCBQQVJBTVMgKChDT1JFX0FERFIsIHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKyNkZWZpbmUgRlJBTUVfQ0hBSU5fVkFMSUQoY2hhaW4sIHRoaXNmcmFtZSkgZDEwdl9mcmFtZV9jaGFpbl92YWxpZCAoY2hhaW4sIHRoaXNmcmFtZSkKKyNkZWZpbmUgRlJBTUVfU0FWRURfUEMoRlJBTUUpICAgICgoRlJBTUUpLT5yZXR1cm5fcGMpICAgCisjZGVmaW5lIEZSQU1FX0FSR1NfQUREUkVTUyhmaSkgICAoZmkpLT5mcmFtZQorI2RlZmluZSBGUkFNRV9MT0NBTFNfQUREUkVTUyhmaSkgKGZpKS0+ZnJhbWUKKworLyogSW1tZWRpYXRlbHkgYWZ0ZXIgYSBmdW5jdGlvbiBjYWxsLCByZXR1cm4gdGhlIHNhdmVkIHBjLiAgV2UgY2FuJ3QgKi8KKy8qIHVzZSBmcmFtZS0+cmV0dXJuX3BjIGJlYXVzZSB0aGF0IGlzIGRldGVybWluZWQgYnkgcmVhZGluZyBSMTMgb2ZmIHRoZSAqLworLypzdGFjayBhbmQgdGhhdCBtYXkgbm90IGJlIHdyaXR0ZW4geWV0LiAqLworCisjZGVmaW5lIFNBVkVEX1BDX0FGVEVSX0NBTEwoZnJhbWUpICgocmVhZF9yZWdpc3RlcihMUl9SRUdOVU0pIDw8IDIpIHwgSU1FTV9TVEFSVCkKKyAgICAKKy8qIFNldCBWQUwgdG8gdGhlIG51bWJlciBvZiBhcmdzIHBhc3NlZCB0byBmcmFtZSBkZXNjcmliZWQgYnkgRkkuCisgICBDYW4gc2V0IFZBTCB0byAtMSwgbWVhbmluZyBubyB3YXkgdG8gdGVsbC4gICovCisvKiBXZSBjYW4ndCB0ZWxsIGhvdyBtYW55IGFyZ3MgdGhlcmUgYXJlICovCisKKyNkZWZpbmUgRlJBTUVfTlVNX0FSR1ModmFsLGZpKSAodmFsID0gLTEpCisKKy8qIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgYXQgc3RhcnQgb2YgYXJnbGlzdCB0aGF0IGFyZSBub3QgcmVhbGx5IGFyZ3MuICAqLworCisjZGVmaW5lIEZSQU1FX0FSR1NfU0tJUCAwCisKKworLyogUHV0IGhlcmUgdGhlIGNvZGUgdG8gc3RvcmUsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywKKyAgIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4KKyAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbAorICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDoKKyAgIHRoZSBhZGRyZXNzIHdlIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4gICovCisKKyNkZWZpbmUgRlJBTUVfRklORF9TQVZFRF9SRUdTKGZyYW1lX2luZm8sIGZyYW1lX3NhdmVkX3JlZ3MpCSAgICBcCisgICBkMTB2X2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyhmcmFtZV9pbmZvLCAmKGZyYW1lX3NhdmVkX3JlZ3MpKQorCitleHRlcm4gdm9pZCBkMTB2X2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqLCBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqKSk7CisKKyNkZWZpbmUgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCisKKworLyogRFVNTVkgRlJBTUVTLiAgTmVlZCB0aGVzZSB0byBzdXBwb3J0IGluZmVyaW9yIGZ1bmN0aW9uIGNhbGxzLiAgVGhleQorICAgd29yayBsaWtlIHRoaXMgb24gRDEwVjogRmlyc3Qgd2Ugc2V0IGEgYnJlYWtwb2ludCBhdCAwIG9yIF9fc3RhcnQuCisgICBUaGVuIHdlIHB1c2ggYWxsIHRoZSByZWdpc3RlcnMgb250byB0aGUgc3RhY2suICBUaGVuIHB1dCB0aGUKKyAgIGZ1bmN0aW9uIGFyZ3VtZW50cyBpbiB0aGUgcHJvcGVyIHJlZ2lzdGVycyBhbmQgc2V0IHIxMyB0byBvdXIKKyAgIGJyZWFrcG9pbnQgYWRkcmVzcy4gIEZpbmFsbHksIHRoZSBQQyBpcyBzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZQorICAgZnVuY3Rpb24gYmVpbmcgY2FsbGVkIChubyBKU1IvQlNSIGluc24pLiAgV2hlbiBpdCBoaXRzIHRoZQorICAgYnJlYWtwb2ludCwgY2xlYXIgdGhlIGJyZWFrIHBvaW50IGFuZCBwb3AgdGhlIG9sZCByZWdpc3RlciBjb250ZW50cworICAgb2ZmIHRoZSBzdGFjay4gICovCisKK2V4dGVybiB2b2lkIGQxMHZfcG9wX2ZyYW1lIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZSkpOworI2RlZmluZSBQT1BfRlJBTUUgZ2VuZXJpY19wb3BfY3VycmVudF9mcmFtZSAoZDEwdl9wb3BfZnJhbWUpCisKKyNkZWZpbmUgVVNFX0dFTkVSSUNfRFVNTVlfRlJBTUVTCisjZGVmaW5lIENBTExfRFVNTVkgICAgICAgICAgICAgICAgICAgezB9CisjZGVmaW5lIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUICAgICAgKDApCisjZGVmaW5lIENBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQgKDApCisjZGVmaW5lIENBTExfRFVNTVlfTE9DQVRJT04gICAgICAgICAgQVRfRU5UUllfUE9JTlQKKyNkZWZpbmUgRklYX0NBTExfRFVNTVkoRFVNTVksIFNUQVJULCBGVU5BRERSLCBOQVJHUywgQVJHUywgVFlQRSwgR0NDUCkKKyNkZWZpbmUgQ0FMTF9EVU1NWV9BRERSRVNTKCkgICAgICAgICBlbnRyeV9wb2ludF9hZGRyZXNzICgpCitleHRlcm4gQ09SRV9BRERSIGQxMHZfcHVzaF9yZXR1cm5fYWRkcmVzcyBQQVJBTVMgKChDT1JFX0FERFIgcGMsIENPUkVfQUREUiBzcCkpOworI2RlZmluZSBQVVNIX1JFVFVSTl9BRERSRVNTKFBDLCBTUCkgIGQxMHZfcHVzaF9yZXR1cm5fYWRkcmVzcyAoUEMsIFNQKQorCisjZGVmaW5lIFBDX0lOX0NBTExfRFVNTVkoUEMsIFNQLCBGUCkgZ2VuZXJpY19wY19pbl9jYWxsX2R1bW15IChQQywgU1ApCisvKiAjZGVmaW5lIFBDX0lOX0NBTExfRFVNTVkocGMsIHNwLCBmcmFtZV9hZGRyZXNzKSAoIHBjID09IElNRU1fU1RBUlQgKyA0ICkgKi8KKworI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FCWdlbmVyaWNfcHVzaF9kdW1teV9mcmFtZSAoKQorCisvKiBvdmVycmlkZSB0aGUgZGVmYXVsdCBnZXRfc2F2ZWRfcmVnaXN0ZXIgZnVuY3Rpb24gd2l0aCBvbmUgdGhhdAorICAgdGFrZXMgYWNjb3VudCBvZiBnZW5lcmljIENBTExfRFVNTVkgZnJhbWVzICovCisjZGVmaW5lIEdFVF9TQVZFRF9SRUdJU1RFUgorI2RlZmluZSBnZXRfc2F2ZWRfcmVnaXN0ZXIgZ2VuZXJpY19nZXRfc2F2ZWRfcmVnaXN0ZXIKKworI2RlZmluZSBQVVNIX0FSR1VNRU5UUyhuYXJncywgYXJncywgc3AsIHN0cnVjdF9yZXR1cm4sIHN0cnVjdF9hZGRyKSBcCisgICAgc3AgPSBkMTB2X3B1c2hfYXJndW1lbnRzKChuYXJncyksIChhcmdzKSwgKHNwKSwgKHN0cnVjdF9yZXR1cm4pLCAoc3RydWN0X2FkZHIpKQorZXh0ZXJuIENPUkVfQUREUiBkMTB2X3B1c2hfYXJndW1lbnRzIFBBUkFNUyAoKGludCwgc3RydWN0IHZhbHVlICoqLCBDT1JFX0FERFIsIGludCwgQ09SRV9BRERSKSk7CisKKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgb2YgdHlwZSBUWVBFLCBhbmQgY29weSB0aGF0LCBpbiB2aXJ0dWFsIGZvcm1hdCwKKyAgIGludG8gVkFMQlVGLiAgKi8KKworI2RlZmluZSBFWFRSQUNUX1JFVFVSTl9WQUxVRShUWVBFLFJFR0JVRixWQUxCVUYpIFwKK2QxMHZfZXh0cmFjdF9yZXR1cm5fdmFsdWUoVFlQRSwgUkVHQlVGLCBWQUxCVUYpCisgIGV4dGVybiB2b2lkCitkMTB2X2V4dHJhY3RfcmV0dXJuX3ZhbHVlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIGNoYXIgKiwgY2hhciAqKSk7CisKKworI2RlZmluZSBSRUdJU1RFUl9TSVpFIDIKKworI2lmZGVmIENDX0hBU19MT05HX0xPTkcKKyMgIGRlZmluZSBMT05HRVNUIGxvbmcgbG9uZworI2Vsc2UKKyMgIGRlZmluZSBMT05HRVNUIGxvbmcKKyNlbmRpZiAKKyNkZWZpbmUgVUxPTkdFU1QgdW5zaWduZWQgTE9OR0VTVAorCit2b2lkIGQxMHZfd3JpdGVfcGMgUEFSQU1TICgoQ09SRV9BRERSIHZhbCwgaW50IHBpZCkpOworQ09SRV9BRERSIGQxMHZfcmVhZF9wYyBQQVJBTVMgKChpbnQgcGlkKSk7Cit2b2lkIGQxMHZfd3JpdGVfc3AgUEFSQU1TICgoQ09SRV9BRERSIHZhbCkpOworQ09SRV9BRERSIGQxMHZfcmVhZF9zcCBQQVJBTVMgKCh2b2lkKSk7Cit2b2lkIGQxMHZfd3JpdGVfZnAgUEFSQU1TICgoQ09SRV9BRERSIHZhbCkpOworQ09SRV9BRERSIGQxMHZfcmVhZF9mcCBQQVJBTVMgKCh2b2lkKSk7CisKKyNkZWZpbmUgVEFSR0VUX1JFQURfUEMocGlkKQkJZDEwdl9yZWFkX3BjIChwaWQpCisjZGVmaW5lIFRBUkdFVF9XUklURV9QQyh2YWwscGlkKQlkMTB2X3dyaXRlX3BjICh2YWwsIHBpZCkKKyNkZWZpbmUgVEFSR0VUX1JFQURfRlAoKQkJZDEwdl9yZWFkX2ZwICgpCisjZGVmaW5lIFRBUkdFVF9XUklURV9GUCh2YWwpCQlkMTB2X3dyaXRlX2ZwICh2YWwpCisjZGVmaW5lIFRBUkdFVF9SRUFEX1NQKCkJCWQxMHZfcmVhZF9zcCAoKQorI2RlZmluZSBUQVJHRVRfV1JJVEVfU1AodmFsKQkJZDEwdl93cml0ZV9zcCAodmFsKQorCisvKiBOdW1iZXIgb2YgYml0cyBpbiB0aGUgYXBwcm9wcmlhdGUgdHlwZSAqLworI2RlZmluZSBUQVJHRVRfSU5UX0JJVCAoMiAqIFRBUkdFVF9DSEFSX0JJVCkKKyNkZWZpbmUgVEFSR0VUX1BUUl9CSVQgKDQgKiBUQVJHRVRfQ0hBUl9CSVQpCisjZGVmaW5lIFRBUkdFVF9ET1VCTEVfQklUICg0ICogVEFSR0VUX0NIQVJfQklUKQorI2RlZmluZSBUQVJHRVRfTE9OR19ET1VCTEVfQklUICg4ICogVEFSR0VUX0NIQVJfQklUKQorCisMCisvKiBGb3IgdGhlIGQxMHYgd2hlbiB0YWxraW5nIHRvIHRoZSByZW1vdGUgZDEwdiBib2FyZCwgR0RCIGFkZHJlc3NlcworICAgbmVlZCB0byBiZSB0cmFuc2xhdGVkIGludG8gYSBmb3JtYXQgdGhhdCB0aGUgZDEwdiByb20gbW9uaXRvcgorICAgdW5kZXJzdGFuZHMuICovCisKK2ludCByZW1vdGVfZDEwdl90cmFuc2xhdGVfeGZlcl9hZGRyZXNzIFBBUkFNUyAoKENPUkVfQUREUiBnZGJfYWRkciwgaW50IGdkYl9sZW4sIENPUkVfQUREUiAqcmVtX2FkZHIpKTsKKyNkZWZpbmUgUkVNT1RFX1RSQU5TTEFURV9YRkVSX0FERFJFU1MoR0RCX0FERFIsIEdEQl9MRU4sIFJFTV9BRERSLCBSRU1fTEVOKSBcCisoUkVNX0xFTikgPSByZW1vdGVfZDEwdl90cmFuc2xhdGVfeGZlcl9hZGRyZXNzICgoR0RCX0FERFIpLCAoR0RCX0xFTiksICYoUkVNX0FERFIpKQorCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2QzMHYvZDMwdi5tdCBiL2dkYi9jb25maWcvZDMwdi9kMzB2Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMGFmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2QzMHYvZDMwdi5tdApAQCAtMCwwICsxLDUgQEAKKyMgVGFyZ2V0OiBNaXRzdWJpc2hpIEQzMFYgcHJvY2Vzc29yCitUREVQRklMRVM9IGQzMHYtdGRlcC5vCitUTV9GSUxFPSB0bS1kMzB2LmgKK1NJTV9PQlM9IHJlbW90ZS1zaW0ubworU0lNPSAuLi9zaW0vZDMwdi9saWJzaW0uYQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9kMzB2L3RtLWQzMHYuaCBiL2dkYi9jb25maWcvZDMwdi90bS1kMzB2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2OWNhMwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvZDMwdi90bS1kMzB2LmgKQEAgLTAsMCArMSwzMjUgQEAKKy8qIFRhcmdldC1zcGVjaWZpYyBkZWZpbml0aW9uIGZvciB0aGUgTWl0c3ViaXNoaSBEMzBWCisgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBUTV9EMzBWX0gKKyNkZWZpbmUgVE1fRDMwVl9ICisKKy8qIERlZmluZSB0aGUgYml0LCBieXRlLCBhbmQgd29yZCBvcmRlcmluZyBvZiB0aGUgbWFjaGluZS4gICovCisKKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVIJQklHX0VORElBTgorCisvKiBPZmZzZXQgZnJvbSBhZGRyZXNzIG9mIGZ1bmN0aW9uIHRvIHN0YXJ0IG9mIGl0cyBjb2RlLgorICAgWmVybyBvbiBtb3N0IG1hY2hpbmVzLiAgKi8KKworI2RlZmluZSBGVU5DVElPTl9TVEFSVF9PRkZTRVQgMAorCisvKiB0aGVzZSBhcmUgdGhlIGFkZHJlc3NlcyB0aGUgRDMwVi1FVkEgYm9hcmQgbWFwcyBkYXRhICovCisvKiBhbmQgaW5zdHJ1Y3Rpb24gbWVtb3J5IHRvLiAqLworCisjZGVmaW5lIERNRU1fU1RBUlQJMHgyMDAwMDAwMAorI2RlZmluZSBJTUVNX1NUQVJUCTB4MDAwMDAwMDAgLyogd2FzIDB4MTAwMDAwMDAgKi8KKyNkZWZpbmUgU1RBQ0tfU1RBUlQJMHgyMDAwN2ZmZQorCisjaWZkZWYgX19TVERDX18JCS8qIEZvcndhcmQgZGVjbHMgZm9yIHByb3RvdHlwZXMgKi8KK3N0cnVjdCBmcmFtZV9pbmZvOworc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3M7IAorc3RydWN0IHR5cGU7CitzdHJ1Y3QgdmFsdWU7CisjZW5kaWYKKworLyogQWR2YW5jZSBQQyBhY3Jvc3MgYW55IGZ1bmN0aW9uIGVudHJ5IHByb2xvZ3VlIGluc3RydWN0aW9ucworICAgdG8gcmVhY2ggc29tZSAicmVhbCIgY29kZS4gICovCisKK2V4dGVybiBDT1JFX0FERFIgZDMwdl9za2lwX3Byb2xvZ3VlICgpOworI2RlZmluZSBTS0lQX1BST0xPR1VFKGlwKSBcCisgICAgeyhpcCkgPSBkMzB2X3NraXBfcHJvbG9ndWUoaXApO30KKworCisvKiBTdGFjayBncm93cyBkb3dud2FyZC4gICovCisjZGVmaW5lIElOTkVSX1RIQU4obGhzLHJocykgKChsaHMpIDwgKHJocykpCisKKy8qIGZvciBhIGJyZWFrcG9pbnQsIHVzZSAiZGJ0IHx8IG5vcCIgKi8KKyNkZWZpbmUgQlJFQUtQT0lOVCB7MHgwMCwgMHhiMCwgMHgwMCwgMHgwMCxcCisJCSAgICAweDAwLCAweGYwLCAweDAwLCAweDAwfQorCisvKiBJZiB5b3VyIGtlcm5lbCByZXNldHMgdGhlIHBjIGFmdGVyIHRoZSB0cmFwIGhhcHBlbnMgeW91IG1heSBuZWVkIHRvCisgICBkZWZpbmUgdGhpcyBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZS4gICovCisjZGVmaW5lIERFQ1JfUENfQUZURVJfQlJFQUsgMAorCisjZGVmaW5lIFJFR0lTVEVSX05BTUVTIFwKK3sgICAicjAiLCAgInIxIiwgICJyMiIsICAicjMiLCAgInI0IiwgICJyNSIsICAicjYiLCAgInI3IiwJXAorICAgICJyOCIsICAicjkiLCAgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IiwJXAorICAgICJyMTYiLCAicjE3IiwgInIxOCIsICJyMTkiLCAicjIwIiwgInIyMSIsICJyMjIiLCAicjIzIiwJXAorICAgICJyMjQiLCAicjI1IiwgInIyNiIsICJyMjciLCAicjI4IiwgInIyOSIsICJyMzAiLCAicjMxIiwJXAorICAgICJyMzIiLCAicjMzIiwgInIzNCIsICJyMzUiLCAicjM2IiwgInIzNyIsICJyMzgiLCAicjM5IiwJXAorICAgICJyNDAiLCAicjQxIiwgInI0MiIsICJyNDMiLCAicjQ0IiwgInI0NSIsICJyNDYiLCAicjQ3IiwJXAorICAgICJyNDgiLCAicjQ5IiwgInI1MCIsICJyNTEiLCAicjUyIiwgInI1MyIsICJyNTQiLCAicjU1IiwJXAorICAgICJyNTYiLCAicjU3IiwgInI1OCIsICJyNTkiLCAicjYwIiwgInI2MSIsICJyNjIiLCAicjYzIiwJXAorICAgICJzcGkiLCAic3B1IiwgXAorICAgICJwc3ciLCAiYnBzdyIsICJwYyIsICJicGMiLCAiZHBzdyIsICJkcGMiLCAiY3I2IiwgInJwdF9jIiwJXAorICAgICJycHRfcyIsICJycHRfZSIsICJtb2RfcyIsICJtb2RfZSIsICJjcjEyIiwgImNyMTMiLCAiaWJhIiwgImVpdF92YiIsXAorICAgICJpbnRfcyIsICJpbnRfbSIsICJhMCIsICJhMSIgXAorICAgIH0KKworI2RlZmluZSBOVU1fUkVHUyA4NgorCisvKiBSZWdpc3RlciBudW1iZXJzIG9mIHZhcmlvdXMgaW1wb3J0YW50IHJlZ2lzdGVycy4KKyAgIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgInJlYWwiIHJlZ2lzdGVyIG51bWJlcnMsCisgICBhbmQgY29ycmVzcG9uZCB0byB0aGUgZ2VuZXJhbCByZWdpc3RlcnMgb2YgdGhlIG1hY2hpbmUsCisgICBhbmQgc29tZSBhcmUgInBob255IiByZWdpc3RlciBudW1iZXJzIHdoaWNoIGFyZSB0b28gbGFyZ2UKKyAgIHRvIGJlIGFjdHVhbCByZWdpc3RlciBudW1iZXJzIGFzIGZhciBhcyB0aGUgdXNlciBpcyBjb25jZXJuZWQKKyAgIGJ1dCBkbyBzZXJ2ZSB0byBnZXQgdGhlIGRlc2lyZWQgdmFsdWVzIHdoZW4gcGFzc2VkIHRvIHJlYWRfcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIFIwX1JFR05VTQkwCisjZGVmaW5lIEZQX1JFR05VTQk2MQorI2RlZmluZSBMUl9SRUdOVU0gCTYyCisjZGVmaW5lIFNQX1JFR05VTSAJNjMKKyNkZWZpbmUgU1BJX1JFR05VTQk2NAkvKiBJbnRlcnJ1cHQgc3RhY2sgcG9pbnRlciAqLworI2RlZmluZSBTUFVfUkVHTlVNCTY1CS8qIFVzZXIgc3RhY2sgcG9pbnRlciAqLworI2RlZmluZSBDUkVHU19TVEFSVAk2NgorCisjZGVmaW5lIFBTV19SRUdOVU0gCShDUkVHU19TVEFSVCArIDApIC8qIHBzdywgYnBzdywgb3IgZHBzdz8/PyAqLworI2RlZmluZSAgICAgUFNXX1NNICgoKHVuc2lnbmVkIGxvbmcpMHg4MDAwMDAwMCkgPj4gMCkJLyogU3RhY2sgbW9kZTogMC9TUEkgKi8KKwkJCQkJCQkvKgkgICAgICAgMS9TUFUgKi8KKyNkZWZpbmUgICAgIFBTV19FQSAoKCh1bnNpZ25lZCBsb25nKTB4ODAwMDAwMDApID4+IDIpCS8qIEV4ZWN1dGlvbiBzdGF0dXMgKi8KKyNkZWZpbmUgICAgIFBTV19EQiAoKCh1bnNpZ25lZCBsb25nKTB4ODAwMDAwMDApID4+IDMpCS8qIERlYnVnIG1vZGUgKi8KKyNkZWZpbmUgICAgIFBTV19EUyAoKCh1bnNpZ25lZCBsb25nKTB4ODAwMDAwMDApID4+IDQpCS8qIERlYnVnIEVJVCBzdGF0dXMgKi8KKyNkZWZpbmUgICAgIFBTV19JRSAoKCh1bnNpZ25lZCBsb25nKTB4ODAwMDAwMDApID4+IDUpCS8qIEludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgICAgIFBTV19SUCAoKCh1bnNpZ25lZCBsb25nKTB4ODAwMDAwMDApID4+IDYpCS8qIFJlcGVhdCBlbmFibGUgKi8KKyNkZWZpbmUgICAgIFBTV19NRCAoKCh1bnNpZ25lZCBsb25nKTB4ODAwMDAwMDApID4+IDcpCS8qIE1vZHVsbyBlbmFibGUgKi8KKyNkZWZpbmUgICAgIFBTV19GMCAoKCh1bnNpZ25lZCBsb25nKTB4ODAwMDAwMDApID4+IDE3KQkvKiBGMCBmbGFnICovCisjZGVmaW5lICAgICBQU1dfRjEgKCgodW5zaWduZWQgbG9uZykweDgwMDAwMDAwKSA+PiAxOSkJLyogRjEgZmxhZyAqLworI2RlZmluZSAgICAgUFNXX0YyICgoKHVuc2lnbmVkIGxvbmcpMHg4MDAwMDAwMCkgPj4gMjEpCS8qIEYyIGZsYWcgKi8KKyNkZWZpbmUgICAgIFBTV19GMyAoKCh1bnNpZ25lZCBsb25nKTB4ODAwMDAwMDApID4+IDIzKQkvKiBGMyBmbGFnICovCisjZGVmaW5lICAgICBQU1dfUyAgKCgodW5zaWduZWQgbG9uZykweDgwMDAwMDAwKSA+PiAyNSkJLyogU2F0dXJhdGlvbiBmbGFnICovCisjZGVmaW5lICAgICBQU1dfViAgKCgodW5zaWduZWQgbG9uZykweDgwMDAwMDAwKSA+PiAyNykJLyogT3ZlcmZsb3cgZmxhZyAqLworI2RlZmluZSAgICAgUFNXX1ZBICgoKHVuc2lnbmVkIGxvbmcpMHg4MDAwMDAwMCkgPj4gMjkpCS8qIEFjY3VtLiBvdmVyZmxvdyAqLworI2RlZmluZSAgICAgUFNXX0MgICgoKHVuc2lnbmVkIGxvbmcpMHg4MDAwMDAwMCkgPj4gMzEpCS8qIENhcnJ5L0JvcnJvdyBmbGFnICovCisKKyNkZWZpbmUgQlBTV19SRUdOVU0JKENSRUdTX1NUQVJUICsgMSkgLyogQmFja3VwIFBTVyAob24gaW50ZXJydXB0KSAqLworI2RlZmluZSBQQ19SRUdOVU0gCShDUkVHU19TVEFSVCArIDIpIC8qIHBjLCBicGMsIG9yIGRwYz8/PyAqLworI2RlZmluZSBCUENfUkVHTlVNIAkoQ1JFR1NfU1RBUlQgKyAzKSAvKiBCYWNrdXAgUEMgKG9uIGludGVycnVwdCkgKi8KKyNkZWZpbmUgRFBTV19SRUdOVU0JKENSRUdTX1NUQVJUICsgNCkgLyogQmFja3VwIFBTVyAob24gZGVidWcgdHJhcCkgKi8KKyNkZWZpbmUgRFBDX1JFR05VTSAJKENSRUdTX1NUQVJUICsgNSkgLyogQmFja3VwIFBDIChvbiBkZWJ1ZyB0cmFwKSAqLworI2RlZmluZSBSUFRfQ19SRUdOVU0JKENSRUdTX1NUQVJUICsgNykgLyogTG9vcCBjb3VudCAqLworI2RlZmluZSBSUFRfU19SRUdOVU0JKENSRUdTX1NUQVJUICsgOCkgLyogTG9vcCBzdGFydCBhZGRyZXNzKi8KKyNkZWZpbmUgUlBUX0VfUkVHTlVNCShDUkVHU19TVEFSVCArIDkpIC8qIExvb3AgZW5kIGFkZHJlc3MgKi8KKyNkZWZpbmUgTU9EX1NfUkVHTlVNCShDUkVHU19TVEFSVCArIDEwKQorI2RlZmluZSBNT0RfRV9SRUdOVU0JKENSRUdTX1NUQVJUICsgMTEpCisjZGVmaW5lIElCQV9SRUdOVU0JKENSRUdTX1NUQVJUICsgMTQpIC8qIEluc3RydWN0aW9uIGJyZWFrIGFkZHJlc3MgKi8KKyNkZWZpbmUgRUlUX1ZCX1JFR05VTQkoQ1JFR1NfU1RBUlQgKyAxNSkgLyogVmVjdG9yIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBJTlRfU19SRUdOVU0JKENSRUdTX1NUQVJUICsgMTYpIC8qIEludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgSU5UX01fUkVHTlVNCShDUkVHU19TVEFSVCArIDE3KSAvKiBJbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSBBMF9SRUdOVU0gCTg0CisjZGVmaW5lIEExX1JFR05VTSAJODUKKworLyogU2F5IGhvdyBtdWNoIG1lbW9yeSBpcyBuZWVkZWQgdG8gc3RvcmUgYSBjb3B5IG9mIHRoZSByZWdpc3RlciBzZXQgKi8KKyNkZWZpbmUgUkVHSVNURVJfQllURVMgICAgKChOVU1fUkVHUyAtIDIpICogNCArIDIgKiA4KSAKKworLyogSW5kZXggd2l0aGluIGByZWdpc3RlcnMnIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzcGFjZSBmb3IKKyAgIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0JZVEUoTikgIFwKKyggKChOKSA+PSBBMF9SRUdOVU0pID8gKCAoKE4pIC0gQTBfUkVHTlVNKSAqIDggKyBBMF9SRUdOVU0gKiA0ICkgOiAoKE4pICogNCkgKQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgYWN0dWFsIG1hY2hpbmUgcmVwcmVzZW50YXRpb24KKyAgIGZvciByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9SQVdfU0laRShOKSAoICgoTikgPj0gQTBfUkVHTlVNKSA/IDggOiA0ICkKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIHByb2dyYW0ncyByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICAqLyAgIAorI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUoTikgUkVHSVNURVJfUkFXX1NJWkUoTikKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9SQVdfU0laRSBjYW4gaGF2ZS4gICovCisKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1JBV19TSVpFIDgKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUgOAorCisvKiBSZXR1cm4gdGhlIEdEQiB0eXBlIG9iamVjdCBmb3IgdGhlICJzdGFuZGFyZCIgZGF0YSB0eXBlCisgICBvZiBkYXRhIGluIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRShOKSBcCisoICgoTikgPCBBMF9SRUdOVU0gKSA/IGJ1aWx0aW5fdHlwZV9sb25nIDogYnVpbHRpbl90eXBlX2xvbmdfbG9uZykKKworLyogV3JpdGluZyB0byByMCBpcyBhIG5vb3AgKG5vdCBhbiBlcnJvciBvciBleGNlcHRpb24gb3IgYW55dGhpbmcgbGlrZQorICAgdGhhdCwgaG93ZXZlcikuICAqLworCisjZGVmaW5lIENBTk5PVF9TVE9SRV9SRUdJU1RFUihyZWdubykgKChyZWdubykgPT0gUjBfUkVHTlVNKQorCit2b2lkIGQzMHZfZG9fcmVnaXN0ZXJzX2luZm8gUEFSQU1TICgoaW50IHJlZ251bSwgaW50IGZwcmVncykpOworCisjZGVmaW5lIERPX1JFR0lTVEVSU19JTkZPIGQzMHZfZG9fcmVnaXN0ZXJzX2luZm8KKworLyogU3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIHBsYWNlIGluIHdoaWNoIHRvIGNvcHkgdGhlIHN0cnVjdHVyZSB0aGUKKyAgIHN1YnJvdXRpbmUgd2lsbCByZXR1cm4uICBUaGlzIGlzIGNhbGxlZCBmcm9tIGNhbGxfZnVuY3Rpb24uIAorCisgICBXZSBzdG9yZSBzdHJ1Y3RzIHRocm91Z2ggYSBwb2ludGVyIHBhc3NlZCBpbiBSMiAqLworCisjZGVmaW5lIFNUT1JFX1NUUlVDVF9SRVRVUk4oQUREUiwgU1ApIFwKKyAgICB7IHdyaXRlX3JlZ2lzdGVyICgyLCAoQUREUikpOyAgfQorCisKKy8qIFdyaXRlIGludG8gYXBwcm9wcmlhdGUgcmVnaXN0ZXJzIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlCisgICBvZiB0eXBlIFRZUEUsIGdpdmVuIGluIHZpcnR1YWwgZm9ybWF0LiAgCisKKyAgIFRoaW5ncyBhbHdheXMgZ2V0IHJldHVybmVkIGluIFIyL1IzICovCisKKyNkZWZpbmUgU1RPUkVfUkVUVVJOX1ZBTFVFKFRZUEUsVkFMQlVGKSBcCisgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFKDIpLCBWQUxCVUYsIFRZUEVfTEVOR1RIIChUWVBFKSkKKworCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICB0aGUgYWRkcmVzcyBpbiB3aGljaCBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gaXRzIHN0cnVjdHVyZSB2YWx1ZSwKKyAgIGFzIGEgQ09SRV9BRERSIChvciBhbiBleHByZXNzaW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgb25lKS4gICovCisjZGVmaW5lIEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MoUkVHQlVGKSAoKChDT1JFX0FERFIgKikoUkVHQlVGKSlbMl0pCisMCisKKy8qIERlZmluZSBvdGhlciBhc3BlY3RzIG9mIHRoZSBzdGFjayBmcmFtZS4gCisgICB3ZSBrZWVwIGEgY29weSBvZiB0aGUgd29ya2VkIG91dCByZXR1cm4gcGMgbHlpbmcgYXJvdW5kLCBzaW5jZSBpdAorICAgaXMgYSB1c2VmdWwgYml0IG9mIGluZm8gKi8KKworI2RlZmluZSBFWFRSQV9GUkFNRV9JTkZPIFwKKyAgICBDT1JFX0FERFIgcmV0dXJuX3BjOyBcCisgICAgQ09SRV9BRERSIGR1bW15OyBcCisgICAgaW50IGZyYW1lbGVzczsgXAorICAgIGludCBzaXplOworCisjZGVmaW5lIElOSVRfRVhUUkFfRlJBTUVfSU5GTyhmcm9tbGVhZiwgZmkpIFwKKyAgICBkMzB2X2luaXRfZXh0cmFfZnJhbWVfaW5mbyhmcm9tbGVhZiwgZmkpIAorCitleHRlcm4gdm9pZCBkMzB2X2luaXRfZXh0cmFfZnJhbWVfaW5mbyBQQVJBTVMgKCggaW50IGZyb21sZWFmLCBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmkgKSk7CisKKy8qIEEgbWFjcm8gdGhhdCB0ZWxscyB1cyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpbnZvY2F0aW9uIHJlcHJlc2VudGVkCisgICBieSBGSSBkb2VzIG5vdCBoYXZlIGEgZnJhbWUgb24gdGhlIHN0YWNrIGFzc29jaWF0ZWQgd2l0aCBpdC4gIElmIGl0CisgICBkb2VzIG5vdCwgRlJBTUVMRVNTIGlzIHNldCB0byAxLCBlbHNlIDAuICAqLworCisjZGVmaW5lIEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OKEZJLCBGUkFNRUxFU1MpIFwKKyAgKEZSQU1FTEVTUykgPSBmcmFtZWxlc3NfbG9va19mb3JfcHJvbG9ndWUoRkkpCisKKyNkZWZpbmUgRlJBTUVfQ0hBSU4oRlJBTUUpICAgICAgIGQzMHZfZnJhbWVfY2hhaW4oRlJBTUUpCitleHRlcm4gaW50IGQzMHZfZnJhbWVfY2hhaW5fdmFsaWQgUEFSQU1TICgoQ09SRV9BRERSLCBzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisjZGVmaW5lIEZSQU1FX0NIQUlOX1ZBTElEKGNoYWluLCB0aGlzZnJhbWUpIGQzMHZfZnJhbWVfY2hhaW5fdmFsaWQgKGNoYWluLCB0aGlzZnJhbWUpCisjZGVmaW5lIEZSQU1FX1NBVkVEX1BDKEZSQU1FKSAgICAoKEZSQU1FKS0+cmV0dXJuX3BjKSAgIAorI2RlZmluZSBGUkFNRV9BUkdTX0FERFJFU1MoZmkpICAgKGZpKS0+ZnJhbWUKKyNkZWZpbmUgRlJBTUVfTE9DQUxTX0FERFJFU1MoZmkpIChmaSktPmZyYW1lCisKKyNkZWZpbmUgSU5JVF9GUkFNRV9QQ19GSVJTVChmcm9tbGVhZiwgcHJldikJZDMwdl9pbml0X2ZyYW1lX3BjKGZyb21sZWFmLCBwcmV2KQorI2RlZmluZSBJTklUX0ZSQU1FX1BDKGZyb21sZWFmLCBwcmV2KQkvKiBuYWRhICovCisKKy8qIEltbWVkaWF0ZWx5IGFmdGVyIGEgZnVuY3Rpb24gY2FsbCwgcmV0dXJuIHRoZSBzYXZlZCBwYy4gIFdlIGNhbid0ICovCisvKiB1c2UgZnJhbWUtPnJldHVybl9wYyBiZWF1c2UgdGhhdCBpcyBkZXRlcm1pbmVkIGJ5IHJlYWRpbmcgUjYyIG9mZiB0aGUgKi8KKy8qIHN0YWNrIGFuZCB0aGF0IG1heSBub3QgYmUgd3JpdHRlbiB5ZXQuICovCisKKyNkZWZpbmUgU0FWRURfUENfQUZURVJfQ0FMTChmcmFtZSkgKHJlYWRfcmVnaXN0ZXIoTFJfUkVHTlVNKSkKKyAgICAKKy8qIFNldCBWQUwgdG8gdGhlIG51bWJlciBvZiBhcmdzIHBhc3NlZCB0byBmcmFtZSBkZXNjcmliZWQgYnkgRkkuCisgICBDYW4gc2V0IFZBTCB0byAtMSwgbWVhbmluZyBubyB3YXkgdG8gdGVsbC4gICovCisvKiBXZSBjYW4ndCB0ZWxsIGhvdyBtYW55IGFyZ3MgdGhlcmUgYXJlICovCisKKyNkZWZpbmUgRlJBTUVfTlVNX0FSR1ModmFsLGZpKSAodmFsID0gLTEpCisKKy8qIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgYXQgc3RhcnQgb2YgYXJnbGlzdCB0aGF0IGFyZSBub3QgcmVhbGx5IGFyZ3MuICAqLworCisjZGVmaW5lIEZSQU1FX0FSR1NfU0tJUCAwCisKKworLyogUHV0IGhlcmUgdGhlIGNvZGUgdG8gc3RvcmUsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywKKyAgIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4KKyAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbAorICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDoKKyAgIHRoZSBhZGRyZXNzIHdlIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4gICovCisKKyNkZWZpbmUgRlJBTUVfRklORF9TQVZFRF9SRUdTKGZyYW1lX2luZm8sIGZyYW1lX3NhdmVkX3JlZ3MpCSAgICBcCisgICBkMzB2X2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyhmcmFtZV9pbmZvLCAmKGZyYW1lX3NhdmVkX3JlZ3MpKQorCitleHRlcm4gdm9pZCBkMzB2X2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqLCBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqKSk7CisKKyNkZWZpbmUgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCisgICAgICAKKy8qIERVTU1ZIEZSQU1FUy4gIE5lZWQgdGhlc2UgdG8gc3VwcG9ydCBpbmZlcmlvciBmdW5jdGlvbiBjYWxscy4KKyAgIFRoZXkgd29yayBsaWtlIHRoaXMgb24gRDMwVjoKKyAgIEZpcnN0IHdlIHNldCBhIGJyZWFrcG9pbnQgYXQgMCBvciBfX3N0YXJ0LgorICAgVGhlbiB3ZSBwdXNoIGFsbCB0aGUgcmVnaXN0ZXJzIG9udG8gdGhlIHN0YWNrLgorICAgVGhlbiBwdXQgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBpbiB0aGUgcHJvcGVyIHJlZ2lzdGVycyBhbmQgc2V0IHIxMworICAgdG8gb3VyIGJyZWFrcG9pbnQgYWRkcmVzcy4KKyAgIEZpbmFsbHkgY2FsbCB0aGUgZnVuY3Rpb24gZGlyZWN0bHkuCisgICBXaGVuIGl0IGhpdHMgdGhlIGJyZWFrcG9pbnQsIGNsZWFyIHRoZSBicmVhayBwb2ludCBhbmQgcG9wIHRoZSBvbGQKKyAgIHJlZ2lzdGVyIGNvbnRlbnRzIG9mZiB0aGUgc3RhY2suICovCisKKyNkZWZpbmUgQ0FMTF9EVU1NWQkJeyAwIH0gIAorI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FCisjZGVmaW5lIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUCTAJCisjZGVmaW5lIENBTExfRFVNTVlfTE9DQVRJT04JQVRfRU5UUllfUE9JTlQKKyNkZWZpbmUgQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVCAoMCkKKworZXh0ZXJuIENPUkVfQUREUiBkMzB2X2NhbGxfZHVtbXlfYWRkcmVzcyBQQVJBTVMgKCh2b2lkKSk7CisjZGVmaW5lIENBTExfRFVNTVlfQUREUkVTUygpIGQzMHZfY2FsbF9kdW1teV9hZGRyZXNzKCkKKworI2RlZmluZSBGSVhfQ0FMTF9EVU1NWShkdW1teW5hbWUsIHBjLCBmdW4sIG5hcmdzLCBhcmdzLCB0eXBlLCBnY2NfcCkgXAorc3AgPSBkMzB2X2ZpeF9jYWxsX2R1bW15IChkdW1teW5hbWUsIHBjLCBmdW4sIG5hcmdzLCBhcmdzLCB0eXBlLCBnY2NfcCkKKworI2RlZmluZSBQQ19JTl9DQUxMX0RVTU1ZKHBjLCBzcCwgZnJhbWVfYWRkcmVzcykJKCBwYyA9PSBJTUVNX1NUQVJUICsgNCApCisKK2V4dGVybiBDT1JFX0FERFIgZDMwdl9maXhfY2FsbF9kdW1teSBQQVJBTVMgKChjaGFyICosIENPUkVfQUREUiwgQ09SRV9BRERSLAorCQkJCQkgICBpbnQsIHN0cnVjdCB2YWx1ZSAqKiwKKwkJCQkJICAgc3RydWN0IHR5cGUgKiwgaW50KSk7CisjZGVmaW5lIFBVU0hfQVJHVU1FTlRTKG5hcmdzLCBhcmdzLCBzcCwgc3RydWN0X3JldHVybiwgc3RydWN0X2FkZHIpIFwKKyAgICBzcCA9IGQzMHZfcHVzaF9hcmd1bWVudHMoKG5hcmdzKSwgKGFyZ3MpLCAoc3ApLCAoc3RydWN0X3JldHVybiksIChzdHJ1Y3RfYWRkcikpCitleHRlcm4gQ09SRV9BRERSIGQzMHZfcHVzaF9hcmd1bWVudHMgUEFSQU1TICgoaW50LCBzdHJ1Y3QgdmFsdWUgKiosIENPUkVfQUREUiwgaW50LCBDT1JFX0FERFIpKTsKKworCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwgZm9ybWF0LAorICAgaW50byBWQUxCVUYuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKFRZUEUsUkVHQlVGLFZBTEJVRikgXAorZDMwdl9leHRyYWN0X3JldHVybl92YWx1ZShUWVBFLCBSRUdCVUYsIFZBTEJVRikKKyAgZXh0ZXJuIHZvaWQKK2QzMHZfZXh0cmFjdF9yZXR1cm5fdmFsdWUgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqLCBjaGFyICopKTsKKworCisvKiBEaXNjYXJkIGZyb20gdGhlIHN0YWNrIHRoZSBpbm5lcm1vc3QgZnJhbWUsCisgICByZXN0b3JpbmcgYWxsIHNhdmVkIHJlZ2lzdGVycy4gICovCisjZGVmaW5lIFBPUF9GUkFNRSBkMzB2X3BvcF9mcmFtZSgpOworZXh0ZXJuIHZvaWQgZDMwdl9wb3BfZnJhbWUgUEFSQU1TKCh2b2lkKSk7CisKKyNkZWZpbmUgUkVHSVNURVJfU0laRSA0CisKKy8qIE5lZWQgdG8gaGFuZGxlIFNQIHNwZWNpYWwsIGFzIHdlIG5lZWQgdG8gc2VsZWN0IGJldHdlZW4gc3B1IGFuZCBzcGkuICAqLworI2lmIDAJCQkJLyogWFhYIHVudGlsIHRoZSBzaW11bGF0b3IgaXMgZml4ZWQgKi8KKyNkZWZpbmUgVEFSR0VUX1JFQURfU1AoKSAoKHJlYWRfcmVnaXN0ZXIgKFBTV19SRUdOVU0pICYgUFNXX1NNKSBcCisJCQkgID8gcmVhZF9yZWdpc3RlciAoU1BVX1JFR05VTSkgXAorCQkJICA6IHJlYWRfcmVnaXN0ZXIgKFNQSV9SRUdOVU0pKQorCisjZGVmaW5lIFRBUkdFVF9XUklURV9TUCh2YWwpICgocmVhZF9yZWdpc3RlciAoUFNXX1JFR05VTSkgJiBQU1dfU00pIFwKKwkJCSAgPyB3cml0ZV9yZWdpc3RlciAoU1BVX1JFR05VTSwgKHZhbCkpIFwKKwkJCSAgOiB3cml0ZV9yZWdpc3RlciAoU1BJX1JFR05VTSwgKHZhbCkpKQorI2VuZGlmCisKKyNkZWZpbmUgU1RBQ0tfQUxJR04obGVuKQkoKChsZW4pICsgNyApICYgfjcpCisKKy8qIFR1cm4gdGhpcyBvbiB0byBjYXVzZSByZW1vdGUtc2ltLmMgdG8gdXNlIHNpbV9zZXQvY2xlYXJfYnJlYWtwb2ludC4gKi8KKworI2RlZmluZSBTSU1fSEFTX0JSRUFLUE9JTlRTCisKKyNlbmRpZiAvKiBUTV9EMzBWX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvZnIzMC9mcjMwLm10IGIvZ2RiL2NvbmZpZy9mcjMwL2ZyMzAubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFjMzA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvZnIzMC9mcjMwLm10CkBAIC0wLDAgKzEsNSBAQAorIyBUYXJnZXQ6IEZ1aml0c3UgRlIzMCBwcm9jZXNzb3IKK1RERVBGSUxFUz0gZnIzMC10ZGVwLm8KK1RNX0ZJTEU9IHRtLWZyMzAuaAorU0lNX09CUyA9IHJlbW90ZS1zaW0ubworU0lNID0gLi4vc2ltL2ZyMzAvbGlic2ltLmEKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvZnIzMC90bS1mcjMwLmggYi9nZGIvY29uZmlnL2ZyMzAvdG0tZnIzMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMzI3OTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2ZyMzAvdG0tZnIzMC5oCkBAIC0wLDAgKzEsMjMyIEBACisvKiBQYXJhbWV0ZXJzIGZvciBleGVjdXRpb24gb24gYSBGdWppdHN1IEZSMzAgcHJvY2Vzc29yLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgRlIzMF9HRU5SRUdTCQkxNgorI2RlZmluZSBGUjMwX0RFRElDQVRFRFJFR1MJOAorI2RlZmluZSBGUjMwX1JFR1NJWkUJCTQJLyogYnl0ZXMgKi8KKworI2RlZmluZSBOVU1fUkVHUyAoRlIzMF9HRU5SRUdTICsgRlIzMF9ERURJQ0FURURSRUdTKQorI2RlZmluZSBSRUdJU1RFUl9CWVRFUyAoKEZSMzBfR0VOUkVHUyArIEZSMzBfREVESUNBVEVEUkVHUykqRlIzMF9SRUdTSVpFKQorCisvKiBJbmRleCB3aXRoaW4gYHJlZ2lzdGVycycgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNwYWNlIGZvcgorICAgcmVnaXN0ZXIgTi4gICovCisjZGVmaW5lIFJFR0lTVEVSX0JZVEUoTikgKChOKSAqIEZSMzBfUkVHU0laRSkKKworLyogSW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIG5hbWVzIG9mIHJlZ2lzdGVycy4KKyAgIFRoZXJlIHNob3VsZCBiZSBOVU1fUkVHUyBzdHJpbmdzIGluIHRoaXMgaW5pdGlhbGl6ZXIuICAqLworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyBcCit7ICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsICJyOCIsIFwKKyAgInI5IiwgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IiwgXAorICAicGMiLCAicHMiLCAidGJyIiwgInJwIiwgInNzcCIsICJ1c3AiLCAibWRoIiwgIm1kbCIgfQorCisvKiBPZmZzZXQgZnJvbSBhZGRyZXNzIG9mIGZ1bmN0aW9uIHRvIHN0YXJ0IG9mIGl0cyBjb2RlLgorICAgWmVybyBvbiBtb3N0IG1hY2hpbmVzLiAgKi8KKyNkZWZpbmUgRlVOQ1RJT05fU1RBUlRfT0ZGU0VUIDAKKworLyogQW1vdW50IFBDIG11c3QgYmUgZGVjcmVtZW50ZWQgYnkgYWZ0ZXIgYSBicmVha3BvaW50LgorICAgVGhpcyBpcyBvZnRlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIEJSRUFLUE9JTlQKKyAgIGJ1dCBub3QgYWx3YXlzLiAgKi8KKworI2RlZmluZSBERUNSX1BDX0FGVEVSX0JSRUFLIDAKKworLyogU3RhY2sgZ3Jvd3MgZG93bndhcmQuICAqLworCisjZGVmaW5lIElOTkVSX1RIQU4obGhzLHJocykgKChsaHMpIDwgKHJocykpCisKKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVIgQklHX0VORElBTgorCisjZGVmaW5lIFIwX1JFR05VTSAgMAorI2RlZmluZSBSMV9SRUdOVU0gIDEKKyNkZWZpbmUgUjJfUkVHTlVNICAyCisjZGVmaW5lIFIzX1JFR05VTSAgMworI2RlZmluZSBSNF9SRUdOVU0gIDQKKyNkZWZpbmUgUjVfUkVHTlVNICA1CisjZGVmaW5lIFI2X1JFR05VTSAgNgorI2RlZmluZSBSN19SRUdOVU0gIDcKKyNkZWZpbmUgUjhfUkVHTlVNICA4CisjZGVmaW5lIFI5X1JFR05VTSAgOQorI2RlZmluZSBSMTBfUkVHTlVNICAxMAorI2RlZmluZSBSMTFfUkVHTlVNICAxMQorI2RlZmluZSBSMTJfUkVHTlVNICAxMgorI2RlZmluZSBSMTNfUkVHTlVNICAxMworI2RlZmluZSBGUF9SRUdOVU0gMTQJCS8qIEZyYW1lIHBvaW50ZXIgKi8KKyNkZWZpbmUgU1BfUkVHTlVNIDE1CQkvKiBTdGFjayBwb2ludGVyICovCisjZGVmaW5lIFBDX1JFR05VTSAxNgkJLyogUHJvZ3JhbSBjb3VudGVyICovCisjZGVmaW5lIFJQX1JFR05VTSAxOQkJLyogUmV0dXJuIHBvaW50ZXIgKi8KKworI2RlZmluZSBGSVJTVF9BUkdSRUcJUjRfUkVHTlVNCS8qIGZpcnN0IGFyZyAob3Igc3RydWN0IHJldCB2YWwgYWRkcikgKi8KKyNkZWZpbmUgTEFTVF9BUkdSRUcJUjdfUkVHTlVNCS8qIGZvdXJ0aCAob3IgdGhpcmQgYXJnKSAqLworI2RlZmluZSBSRVRWQUxfUkVHCVI0X1JFR05VTQkvKiByZXR1cm4gdmF1ZSAqLworCisvKiBTYXkgaG93IGxvbmcgKG9yZGluYXJ5KSByZWdpc3RlcnMgYXJlLiAgVGhpcyBpcyBhIHBpZWNlIG9mIGJvZ29zaXR5CisgICB1c2VkIGluIHB1c2hfd29yZCBhbmQgYSBmZXcgb3RoZXIgcGxhY2VzOyBSRUdJU1RFUl9SQVdfU0laRSBpcyB0aGUKKyAgIHJlYWwgd2F5IHRvIGtub3cgaG93IGJpZyBhIHJlZ2lzdGVyIGlzLiAgKi8KKyNkZWZpbmUgUkVHSVNURVJfU0laRSBGUjMwX1JFR1NJWkUKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIGFjdHVhbCBtYWNoaW5lIHJlcHJlc2VudGF0aW9uCisgICBmb3IgcmVnaXN0ZXIgTi4gICovCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pIEZSMzBfUkVHU0laRQorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1JBV19TSVpFIGNhbiBoYXZlLiAgKi8KKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1JBV19TSVpFIEZSMzBfUkVHU0laRSAKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIHByb2dyYW0ncyByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICAqLworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUoTikgUkVHSVNURVJfUkFXX1NJWkUoTikKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUgY2FuIGhhdmUuICAqLworI2RlZmluZSBNQVhfUkVHSVNURVJfVklSVFVBTF9TSVpFIEZSMzBfUkVHU0laRQorCitleHRlcm4gdm9pZCBmcjMwX3BvcF9mcmFtZSBQQVJBTVMgKCh2b2lkKSk7CisjZGVmaW5lIFBPUF9GUkFNRSBmcjMwX3BvcF9mcmFtZSgpCisKKyNkZWZpbmUgVVNFX0dFTkVSSUNfRFVNTVlfRlJBTUVTCisjZGVmaW5lIENBTExfRFVNTVkgICAgICAgICAgICAgICAgICAgezB9CisjZGVmaW5lIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUICAgICAgKDApCisjZGVmaW5lIENBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQgKDApCisjZGVmaW5lIENBTExfRFVNTVlfTE9DQVRJT04gICAgICAgICAgQVRfRU5UUllfUE9JTlQKKyNkZWZpbmUgRklYX0NBTExfRFVNTVkoRFVNTVksIFNUQVJULCBGVU5BRERSLCBOQVJHUywgQVJHUywgVFlQRSwgR0NDUCkKKyNkZWZpbmUgQ0FMTF9EVU1NWV9BRERSRVNTKCkgICAgICAgICBlbnRyeV9wb2ludF9hZGRyZXNzICgpCisjZGVmaW5lIFBVU0hfUkVUVVJOX0FERFJFU1MoUEMsIFNQKSAgKHdyaXRlX3JlZ2lzdGVyKFJQX1JFR05VTSwgQ0FMTF9EVU1NWV9BRERSRVNTKCkpLCBTUCkKKyNkZWZpbmUgUFVTSF9EVU1NWV9GUkFNRQlnZW5lcmljX3B1c2hfZHVtbXlfZnJhbWUgKCkKKworLyogTnVtYmVyIG9mIGJ5dGVzIGF0IHN0YXJ0IG9mIGFyZ2xpc3QgdGhhdCBhcmUgbm90IHJlYWxseSBhcmdzLiAgKi8KKyNkZWZpbmUgRlJBTUVfQVJHU19TS0lQIDAKKworLyogUmV0dXJuIHRoZSBHREIgdHlwZSBvYmplY3QgZm9yIHRoZSAic3RhbmRhcmQiIGRhdGEgdHlwZQorICAgb2YgZGF0YSBpbiByZWdpc3RlciBOLiAgKi8KKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9UWVBFKFJFRykgYnVpbHRpbl90eXBlX2ludAorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwgZm9ybWF0LAorICAgaW50byBWQUxCVUYuICAqLworI2RlZmluZSBFWFRSQUNUX1JFVFVSTl9WQUxVRShUWVBFLFJFR0JVRixWQUxCVUYpIFwKKyAgICBtZW1jcHkgKFZBTEJVRiwgUkVHQlVGICsgUkVHSVNURVJfQllURShSRVRWQUxfUkVHKSArICBcCisJKFRZUEVfTEVOR1RIKFRZUEUpIDwgNCA/IDQgLSBUWVBFX0xFTkdUSChUWVBFKSA6IDApLCBUWVBFX0xFTkdUSCAoVFlQRSkpCisKKy8qIEV4dHJhY3QgZnJvbSBhbiBhcnJheSBSRUdCVUYgY29udGFpbmluZyB0aGUgKHJhdykgcmVnaXN0ZXIgc3RhdGUKKyAgIHRoZSBhZGRyZXNzIGluIHdoaWNoIGEgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBpdHMgc3RydWN0dXJlIHZhbHVlLAorICAgYXMgYSBDT1JFX0FERFIgKG9yIGFuIGV4cHJlc3Npb24gdGhhdCBjYW4gYmUgdXNlZCBhcyBvbmUpLiAgKi8KKyNkZWZpbmUgRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyhSRUdCVUYpIFwKKyAgZXh0cmFjdF9hZGRyZXNzIChSRUdCVUYgKyBSRUdJU1RFUl9CWVRFIChSRVRWQUxfUkVHKSwgXAorCQkgICBSRUdJU1RFUl9SQVdfU0laRSAoUkVUVkFMX1JFRykpCisKKyNkZWZpbmUgU1RPUkVfU1RSVUNUX1JFVFVSTihBRERSLCBTUCkgXAorICB7IHdyaXRlX3JlZ2lzdGVyIChSRVRWQUxfUkVHLCAoQUREUikpOyB9CisKKyNkZWZpbmUgRlJBTUVfQVJHU19BRERSRVNTKGZpKSAoZmktPmZyYW1lKQorI2RlZmluZSBGUkFNRV9MT0NBTFNfQUREUkVTUyhmaSkgKChmaSktPmZyYW1lKQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvIGEgZnJhbWUuCisgICBDYW4gcmV0dXJuIC0xLCBtZWFuaW5nIG5vIHdheSB0byB0ZWxsLiAgKi8KKyNkZWZpbmUgRlJBTUVfTlVNX0FSR1MobnVtYXJncywgZmkpIChudW1hcmdzID0gLTEpCisKKyNpZmRlZiBfX1NURENfXwkJLyogRm9yd2FyZCBkZWNscyBmb3IgcHJvdG90eXBlcyAqLworc3RydWN0IGZyYW1lX2luZm87CitzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVnczsKK3N0cnVjdCB0eXBlOworc3RydWN0IHZhbHVlOworI2VuZGlmCisKKyNkZWZpbmUgRVhUUkFfRlJBTUVfSU5GTyBcCisgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzIGZzcjsgIFwKKyAgaW50IGZyYW1lc2l6ZTsJCVwKKyAgaW50IGZyYW1lb2Zmc2V0OwkJXAorICBpbnQgZnJhbWVyZWc7CisKK2V4dGVybiBDT1JFX0FERFIgZnIzMF9mcmFtZV9jaGFpbiBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqZmkpKTsKKyNkZWZpbmUgRlJBTUVfQ0hBSU4oZmkpIGZyMzBfZnJhbWVfY2hhaW4gKGZpKQorCitleHRlcm4gQ09SRV9BRERSIGZyMzBfZnJhbWVfc2F2ZWRfcGMgICBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisjZGVmaW5lIEZSQU1FX1NBVkVEX1BDKGZpKSAoZnIzMF9mcmFtZV9zYXZlZF9wYyAoZmkpKQorCisjZGVmaW5lIFNBVkVEX1BDX0FGVEVSX0NBTEwoZmkpIHJlYWRfcmVnaXN0ZXIgKFJQX1JFR05VTSkKKworZXh0ZXJuIENPUkVfQUREUiBmcjMwX3NraXBfcHJvbG9ndWUgUEFSQU1TICgoQ09SRV9BRERSIHBjKSk7CisjZGVmaW5lIFNLSVBfUFJPTE9HVUUocGMpIHBjID0gZnIzMF9za2lwX3Byb2xvZ3VlIChwYykKKworLyogV3JpdGUgaW50byBhcHByb3ByaWF0ZSByZWdpc3RlcnMgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUKKyAgIG9mIHR5cGUgVFlQRSwgZ2l2ZW4gaW4gdmlydHVhbCBmb3JtYXQuICAqLworCisjZGVmaW5lIFNUT1JFX1JFVFVSTl9WQUxVRShUWVBFLFZBTEJVRikgXAorICAgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzICgwLCBWQUxCVUYsIFRZUEVfTEVOR1RIIChUWVBFKSkKKworLyogUHV0IGhlcmUgdGhlIGNvZGUgdG8gc3RvcmUsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywKKyAgIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4KKyAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbAorICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDoKKyAgIHRoZSBhZGRyZXNzIHdlIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4gICovCisjZGVmaW5lIEZSQU1FX0ZJTkRfU0FWRURfUkVHUyhmaSwgcmVnYWRkcikgcmVnYWRkciA9IGZpLT5mc3IKKworLyogVXNlIElOVCAjQlJFQUtQT0lOVF9JTlROVU0gaW5zdHJ1Y3Rpb24gZm9yIGJyZWFrcG9pbnQgKi8KKyNkZWZpbmUgRlIzMF9CUkVBS09QCTB4MWYJLyogb3Bjb2RlLCB0eXBlIEQgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgQlJFQUtQT0lOVF9JTlROVU0gOQkvKiBvbmUgb2YgdGhlIHJlc2VydmVkIHRyYXBzICovCisjZGVmaW5lIEJSRUFLUE9JTlQge0ZSMzBfQlJFQUtPUCwgQlJFQUtQT0lOVF9JTlROVU19CisKKy8qIERlZmluZSB0aGlzIGZvciBXaW5nZGIgKi8KKyNkZWZpbmUgVEFSR0VUX0ZSMzAKKworLyogSUVFRSBmb3JtYXQgZmxvYXRpbmcgcG9pbnQgKi8KKyNkZWZpbmUgSUVFRV9GTE9BVAorCisvKiBEZWZpbmUgb3RoZXIgYXNwZWN0cyBvZiB0aGUgc3RhY2sgZnJhbWUuICAqLworCisvKiBBIG1hY3JvIHRoYXQgdGVsbHMgdXMgd2hldGhlciB0aGUgZnVuY3Rpb24gaW52b2NhdGlvbiByZXByZXNlbnRlZAorICAgYnkgRkkgZG9lcyBub3QgaGF2ZSBhIGZyYW1lIG9uIHRoZSBzdGFjayBhc3NvY2lhdGVkIHdpdGggaXQuICBJZiBpdAorICAgZG9lcyBub3QsIEZSQU1FTEVTUyBpcyBzZXQgdG8gMSwgZWxzZSAwLiAgKi8KKyNkZWZpbmUgRlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT04oRkksIEZSQU1FTEVTUykgXAorewkJCQkJCQlcCisgIENPUkVfQUREUiBmdW5jX3N0YXJ0LCBhZnRlcl9wcm9sb2d1ZTsJCQlcCisgIGZ1bmNfc3RhcnQgPSAoZ2V0X3BjX2Z1bmN0aW9uX3N0YXJ0ICgoRkkpLT5wYykgKwlcCisJCUZVTkNUSU9OX1NUQVJUX09GRlNFVCk7CQkJXAorICBhZnRlcl9wcm9sb2d1ZSA9IGZ1bmNfc3RhcnQ7CQkJCVwKKyAgU0tJUF9QUk9MT0dVRSAoYWZ0ZXJfcHJvbG9ndWUpOwkJCVwKKyAgKEZSQU1FTEVTUykgPSAoYWZ0ZXJfcHJvbG9ndWUgPT0gZnVuY19zdGFydCk7CQlcCit9CisKK2V4dGVybiB2b2lkIGZyMzBfaW5pdF9leHRyYV9mcmFtZV9pbmZvIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICpmaSkpOworI2RlZmluZSBJTklUX0VYVFJBX0ZSQU1FX0lORk8oZnJvbWxlYWYsIGZpKSBmcjMwX2luaXRfZXh0cmFfZnJhbWVfaW5mbyAoZmkpCisKKyNkZWZpbmUgRlJBTUVfQ0hBSU5fVkFMSUQoRlAsIEZJKQlnZW5lcmljX2ZyYW1lX2NoYWluX3ZhbGlkIChGUCwgRkkpCisKK2V4dGVybiBDT1JFX0FERFIKK2ZyMzBfcHVzaF9hcmd1bWVudHMgUEFSQU1TICgoaW50IG5hcmdzLCBzdHJ1Y3QgdmFsdWUgKiphcmdzLCBDT1JFX0FERFIgc3AsCisJCQkgICAgIGludCBzdHJ1Y3RfcmV0dXJuLAorCQkJICAgICBDT1JFX0FERFIgc3RydWN0X2FkZHIpKTsKKyNkZWZpbmUgUFVTSF9BUkdVTUVOVFMoTkFSR1MsIEFSR1MsIFNQLCBTVFJVQ1RfUkVUVVJOLCBTVFJVQ1RfQUREUikgXAorICAoU1ApID0gZnIzMF9wdXNoX2FyZ3VtZW50cyAoTkFSR1MsIEFSR1MsIFNQLCBTVFJVQ1RfUkVUVVJOLCBTVFJVQ1RfQUREUikKKworI2RlZmluZSBQQ19JTl9DQUxMX0RVTU1ZKFBDLCBTUCwgRlApIGdlbmVyaWNfcGNfaW5fY2FsbF9kdW1teSAoUEMsIFNQKQorCisvKiBGdWppdHN1J3MgQUJJIHJlcXVpcmVzIGFsbCBzdHJ1Y3RzIHRvIGJlIHBhc3NlZCB1c2luZyBhIHBvaW50ZXIuCisgICBUaGF0IGlzIG9idmlvdXNseSBub3QgdmVyeSBlZmZpY2llbnQsIHNvIEkgYW0gbGVhdmluZyB0aGUgZGVmaW5pdGlvbnMKKyAgIHRvIG1ha2UgZ2RiIHdvcmsgd2l0aCBHQ0Mgc3R5bGUgc3RydWN0IHBhc3NpbmcsIGluIGNhc2Ugd2UgZGVjaWRlCisgICB0byBnbyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLCByYXRoZXIgdGhhbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCisgICBGdWppdHN1IChqdXN0IGNoYW5nZSBTVFJVQ1RfQUxXQVlTX0JZX0FERFIgdG8gMCkgKi8KKworI2RlZmluZSBTVFJVQ1RfQUxXQVlTX0JZX0FERFIJMQorCisjaWYoU1RSVUNUX0FMV0FZU19CWV9BRERSKQorI2RlZmluZSBSRUdfU1RSVUNUX0hBU19BRERSKGdjY19wLHR5cGUpCQkxCisjZWxzZQorLyogbW9yZSBzdGFuZGFyZCBHQ0MgKG9wdGltaXplZCkgKi8KKyNkZWZpbmUgUkVHX1NUUlVDVF9IQVNfQUREUihnY2NfcCx0eXBlKQkJXAorCQkoKFRZUEVfTEVOR1RIKHR5cGUpID4gNCkgJiYgKFRZUEVfTEVOR1RIKHR5cGUpICYgMHgzKSkKKyNlbmRpZgorLyogYWx3YXkgcmV0dXJuIHN0cnVjdCBieSB2YWx1ZSBieSBpbnB1dCBwb2ludGVyICovCisjZGVmaW5lIFVTRV9TVFJVQ1RfQ09OVkVOVElPTihHQ0NfUCwgVFlQRSkJMQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9nb3VsZC9ucDEubWggYi9nZGIvY29uZmlnL2dvdWxkL25wMS5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjJmMjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9nb3VsZC9ucDEubWgKQEAgLTAsMCArMSwzIEBACisjIE9CU09MRVRFICMgSG9zdDogR291bGQgTlAxCisjIE9CU09MRVRFIFhERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBnb3VsZC14ZGVwLm8KKyMgT0JTT0xFVEUgWE1fRklMRT0geG0tbnAxLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvZ291bGQvbnAxLm10IGIvZ2RiL2NvbmZpZy9nb3VsZC9ucDEubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhMmRhNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvZ291bGQvbnAxLm10CkBAIC0wLDAgKzEsMyBAQAorIyBPQlNPTEVURSAjIFRhcmdldDogR291bGQgTlAxCisjIE9CU09MRVRFIFRERVBGSUxFUz0gZ291bGQtdGRlcC5vCisjIE9CU09MRVRFIFRNX0ZJTEU9IHRtLW5wMS5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2dvdWxkL3BuLm1oIGIvZ2RiL2NvbmZpZy9nb3VsZC9wbi5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDY5ZjkwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9nb3VsZC9wbi5taApAQCAtMCwwICsxLDMgQEAKKyMgT0JTT0xFVEUgIyBIb3N0OiBHb3VsZCBQb3dlcm5vZGUKKyMgT0JTT0xFVEUgWERFUEZJTEVTPSBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gZm9yay1jaGlsZC5vIGNvcmVsb3cubyBjb3JlLWFvdXQubworIyBPQlNPTEVURSBYTV9GSUxFPSB4bS1wbi5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2dvdWxkL3BuLm10IGIvZ2RiL2NvbmZpZy9nb3VsZC9wbi5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjczZmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9nb3VsZC9wbi5tdApAQCAtMCwwICsxLDMgQEAKKyMgT0JTT0xFVEUgIyBUYXJnZXQ6IEdvdWxkIFBvd2Vybm9kZQorIyBPQlNPTEVURSBUREVQRklMRVM9IGdvdWxkLXRkZXAubworIyBPQlNPTEVURSBUTV9GSUxFPSB0bS1wbi5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2dvdWxkL3RtLW5wMS5oIGIvZ2RiL2NvbmZpZy9nb3VsZC90bS1ucDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjg3MTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9nb3VsZC90bS1ucDEuaApAQCAtMCwwICsxLDQ5MCBAQAorLyogT0JTT0xFVEUgLyogUGFyYW1ldGVycyBmb3IgdGFyZ2V0aW5nIG9uIGEgR291bGQgTlAxLCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLiAqLworLyogT0JTT0xFVEUgICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgKi8KKy8qIE9CU09MRVRFIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICovCisvKiBPQlNPTEVURSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAqLworLyogT0JTT0xFVEUgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICovCisvKiBPQlNPTEVURSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAqLworLyogT0JTT0xFVEUgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAqLworLyogT0JTT0xFVEUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKi8KKy8qIE9CU09MRVRFIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICovCisvKiBPQlNPTEVURSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKngvICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgR09VTERfTlBMICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVIgQklHX0VORElBTiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBOX0VOVFJZIGFwcGVhcnMgaW4gbGlicmFyaWVzIG9uIEdvdWxkIG1hY2hpbmVzLiAqLworLyogT0JTT0xFVEUgICAgRG9uJ3Qga25vdyB3aGF0IDB4YTQgaXM7IGl0J3MgbWVudGlvbmVkIGluIHN0YWIuaCAqLworLyogT0JTT0xFVEUgICAgYnV0IG9ubHkgaW4gdGhlIHNkYiBzeW1ib2wgbGlzdC4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBJR05PUkVfU1lNQk9MKHR5cGUpICh0eXBlID09IE5fRU5UUlkgfHwgdHlwZSA9PSAweGE0KSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBXZSBkb24ndCB3YW50IHRoZSBleHRyYSBnbnUgc3ltYm9scyBvbiB0aGUgbWFjaGluZTsgKi8KKy8qIE9CU09MRVRFICAgIHRoZXkgd2lsbCBpbnRlcmZlcmUgd2l0aCB0aGUgc2hhcmVkIHNlZ21lbnQgc3ltYm9scy4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBOT19HTlVfU1RBQlMgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogTWFjcm8gZm9yIHRleHQtb2Zmc2V0IGFuZCBkYXRhIGluZm8gKGluIE5QTCBhLm91dCBmb3JtYXQpLiAgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lCVRFWFRJTkZPCQkJCQkJXCAqLworLyogT0JTT0xFVEUgICAgICAgICB0ZXh0X29mZnNldCA9IE5fVFhUT0ZGIChleGVjX2NvZmZoZHIsIGV4ZWNfYW91dGhkcik7CVwgKi8KKy8qIE9CU09MRVRFICAgICAgICAgZXhlY19kYXRhX29mZnNldCA9IE5fVFhUT0ZGIChleGVjX2NvZmZoZHIsIGV4ZWNfYW91dGhkcilcICovCisvKiBPQlNPTEVURSAgICAgICAgICAgICAgICAgKyBleGVjX2FvdXRoZHIuYV90ZXh0ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIE1hY3JvIGZvciBudW1iZXIgb2Ygc3ltYm9sIHRhYmxlIGVudHJpZXMgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIE5VTUJFUl9PRl9TWU1CT0xTCQkJCQlcICovCisvKiBPQlNPTEVURSAJKGNvZmZoZHIuZl9uc3ltcykgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogTWFjcm8gZm9yIGZpbGUtb2Zmc2V0IG9mIHN5bWJvbCB0YWJsZSAoaW4gTlBMIGEub3V0IGZvcm1hdCkuICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgU1lNQk9MX1RBQkxFX09GRlNFVAkJCQkJXCAqLworLyogT0JTT0xFVEUgCU5fU1lNT0ZGIChjb2ZmaGRyKSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBNYWNybyBmb3IgZmlsZS1vZmZzZXQgb2Ygc3RyaW5nIHRhYmxlIChpbiBOUEwgYS5vdXQgZm9ybWF0KS4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBTVFJJTkdfVEFCTEVfT0ZGU0VUCQkJCQlcICovCisvKiBPQlNPTEVURSAJKE5fU1RST0ZGIChjb2ZmaGRyKSkgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogTWFjcm8gdG8gc3RvcmUgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRhYmxlIGRhdGEgaW4gSU5UTy4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBSRUFEX1NUUklOR19UQUJMRV9TSVpFKElOVE8pCQkJCVwgKi8KKy8qIE9CU09MRVRFIAl7IElOVE8gPSBoZHIuYV9zdHNpemU7IH0gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogTWFjcm8gdG8gZGVjbGFyZSB2YXJpYWJsZXMgdG8gaG9sZCB0aGUgZmlsZSdzIGhlYWRlciBkYXRhLiAgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIERFQ0xBUkVfRklMRV9IRUFERVJTICBzdHJ1Y3QgZXhlYyBoZHI7CQkJXCAqLworLyogT0JTT0xFVEUgCQkJICAgICAgRklMSERSIGNvZmZoZHIgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogTWFjcm8gdG8gcmVhZCB0aGUgaGVhZGVyIGRhdGEgZnJvbSBkZXNjcmlwdG9yIERFU0MgYW5kIHZhbGlkYXRlIGl0LiAqLworLyogT0JTT0xFVEUgICAgTkFNRSBpcyB0aGUgZmlsZSBuYW1lLCBmb3IgZXJyb3IgbWVzc2FnZXMuICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUkVBRF9GSUxFX0hFQURFUlMoREVTQywgTkFNRSkJCQkJXCAqLworLyogT0JTT0xFVEUgeyB2YWwgPSBteXJlYWQgKERFU0MsICZjb2ZmaGRyLCBzaXplb2YgY29mZmhkcik7CQlcICovCisvKiBPQlNPTEVURSAgIGlmICh2YWwgPCAwKQkJCQkJCQlcICovCisvKiBPQlNPTEVURSAgICAgcGVycm9yX3dpdGhfbmFtZSAoTkFNRSk7CQkJCQlcICovCisvKiBPQlNPTEVURSAgIHZhbCA9IG15cmVhZCAoREVTQywgJmhkciwgc2l6ZW9mIGhkcik7CQkJXCAqLworLyogT0JTT0xFVEUgICBpZiAodmFsIDwgMCkJCQkJCQkJXCAqLworLyogT0JTT0xFVEUgICAgIHBlcnJvcl93aXRoX25hbWUgKE5BTUUpOwkJCQkJXCAqLworLyogT0JTT0xFVEUgICBpZiAoY29mZmhkci5mX21hZ2ljICE9IEdOUDFNQUdJQykJCQkJXCAqLworLyogT0JTT0xFVEUgICAgIGVycm9yICgiRmlsZSBcIiVzXCIgbm90IGluIGNvZmYgZXhlY3V0YWJsZSBmb3JtYXQuIiwgTkFNRSk7CVwgKi8KKy8qIE9CU09MRVRFICAgaWYgKE5fQkFETUFHIChoZHIpKQkJCQkJCVwgKi8KKy8qIE9CU09MRVRFICAgICBlcnJvciAoIkZpbGUgXCIlc1wiIG5vdCBpbiBleGVjdXRhYmxlIGZvcm1hdC4iLCBOQU1FKTsgfSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBEZWZpbmUgQ09GRiBhbmQgb3RoZXIgc3ltYm9saWMgbmFtZXMgbmVlZGVkIG9uIE5QMSAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUJTlMzMkdNQUdJQwlHTlAxTUFHSUMgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUJTlMzMlNNQUdJQwlHUE5NQUdJQyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBBZGRyZXNzIG9mIGJsb2NrcyBpbiBOX0xCUkFDIGFuZCBOX1JCUkFDIHN5bWJvbHMgYXJlIGFic29sdXRlIGFkZHJlc3NlcywgKi8KKy8qIE9CU09MRVRFICAgIG5vdCByZWxhdGl2ZSB0byBzdGFydCBvZiBzb3VyY2UgYWRkcmVzcy4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBCTE9DS19BRERSRVNTX0FCU09MVVRFICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIE9mZnNldCBmcm9tIGFkZHJlc3Mgb2YgZnVuY3Rpb24gdG8gc3RhcnQgb2YgaXRzIGNvZGUuICovCisvKiBPQlNPTEVURSAgICBaZXJvIG9uIG1vc3QgbWFjaGluZXMuICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgRlVOQ1RJT05fU1RBUlRfT0ZGU0VUCTggKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogQWR2YW5jZSBQQyBhY3Jvc3MgYW55IGZ1bmN0aW9uIGVudHJ5IHByb2xvZ3VlIGluc3RydWN0aW9ucyAqLworLyogT0JTT0xFVEUgICAgdG8gcmVhY2ggc29tZSAicmVhbCIgY29kZS4gIE9uZSBOUEwgd2UgY2FuIGhhdmUgb25lIHR3byBzdGFydHVwICovCisvKiBPQlNPTEVURSAgICBzZXF1ZW5jZXMgZGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIHRoZSBsb2NhbCBzdGFjazogKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgICAgRWl0aGVyOiAqLworLyogT0JTT0xFVEUgICAgICAgInN1YWJyIGIyLCAjIiAqLworLyogT0JTT0xFVEUgICAgb2YgKi8KKy8qIE9CU09MRVRFICAgICAgICJsaWwgcjQsICMiLCAic3VhYnIgYjIsICMocjQpIiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAgICAibHdiciBiNiwgIyIsICJzdHcgcjEsIDgoYjIpIiAqLworLyogT0JTT0xFVEUgICAgT3B0aW9uYWwgInN0d2JyIGIzLCBjKGIyKSIgKi8KKy8qIE9CU09MRVRFICAgIE9wdGlvbmFsICJ0cnIgcjIscjciICAgICAgKEdvdWxkIGZpcnN0IGFyZ3VtZW50IHJlZ2lzdGVyIHBhc3NpbmcpICovCisvKiBPQlNPTEVURSAgICAgIG9yICovCisvKiBPQlNPTEVURSAgICBPcHRpb25hbCAic3R3IHIyLDgoYjMpIiAgIChHb3VsZCBmaXJzdCBhcmd1bWVudCByZWdpc3RlciBwYXNzaW5nKSAqLworLyogT0JTT0xFVEUgICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBTS0lQX1BST0xPR1VFKHBjKSB7IAkJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAlyZWdpc3RlciBpbnQgb3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyICgocGMpLCA0KTsJCVwgKi8KKy8qIE9CU09MRVRFIAlpZiAoKG9wICYgMHhmZmZmMDAwMCkgPT0gMHhGQTBCMDAwMCkgeyAJCQkJXCAqLworLyogT0JTT0xFVEUgCSAgICBwYyArPSA0OwkJCQkJCQlcICovCisvKiBPQlNPTEVURSAJICAgIG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoKHBjKSwgNCk7CQkJCVwgKi8KKy8qIE9CU09MRVRFIAkgICAgaWYgKChvcCAmIDB4ZmZmZjAwMDApID09IDB4NTk0MDAwMDApIHsJCQlcICovCisvKiBPQlNPTEVURSAJCXBjICs9IDQ7CQkJCQkJXCAqLworLyogT0JTT0xFVEUgCSAgICAgICAgb3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyICgocGMpLCA0KTsJCQlcICovCisvKiBPQlNPTEVURSAJCWlmICgob3AgJiAweGZmZmYwMDAwKSA9PSAweDVGMDAwMDAwKSB7CQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgcGMgKz0gNDsJCQkJCQlcICovCisvKiBPQlNPTEVURSAJICAgICAgICAgICAgb3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyICgocGMpLCA0KTsJCQlcICovCisvKiBPQlNPTEVURSAJCSAgICBpZiAob3AgPT0gMHhENDgyMDAwOCkgewkJCQlcICovCisvKiBPQlNPTEVURSAJCSAgICAJcGMgKz0gNDsJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAkgICAgICAgICAgICAJb3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyICgocGMpLCA0KTsJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgIAlpZiAob3AgPT0gMHg1NTgyMDAwQykgewkJCQlcICovCisvKiBPQlNPTEVURSAJCSAgICAJICAgIHBjICs9IDQ7CQkJCQlcICovCisvKiBPQlNPTEVURSAJICAgICAgICAgICAgICAgICAgICBvcCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKChwYyksIDIpOwkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgICAgICAgICBpZiAob3AgPT0gMHgyZmEwKSB7CQkJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgIAkgICAgICAgIHBjICs9IDI7CQkJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgICAgICAgICAgfSBlbHNlIHsJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAkgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKChwYyksIDQpOwlcICovCisvKiBPQlNPTEVURSAJCSAgICAgICAgICAgICAgICBpZiAob3AgPT0gMHhkNTAzMDAwOCkgewkJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgIAkgICAgICAgICAgICBwYyArPSA0OwkJCQlcICovCisvKiBPQlNPTEVURSAJCSAgICAgICAgICAgICAgICB9CQkJCQlcICovCisvKiBPQlNPTEVURSAJCSAgICAgICAgICAgIH0JCQkJCQlcICovCisvKiBPQlNPTEVURSAJCSAgICAgICAgfSBlbHNlIHsJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAkgICAgICAgICAgICAgICAgICAgIG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoKHBjKSwgMik7CQlcICovCisvKiBPQlNPTEVURSAJCSAgICAgICAgICAgIGlmIChvcCA9PSAweDJmYTApIHsJCQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgCSAgICAgICAgcGMgKz0gMjsJCQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgICAgICAgICB9CQkJCQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgICAgIH0JCQkJCQlcICovCisvKiBPQlNPTEVURSAJCSAgICB9CQkJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAkJfQkJCQkJCQlcICovCisvKiBPQlNPTEVURSAJICAgIH0JCQkJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAl9IAkJCQkJCQkJXCAqLworLyogT0JTT0xFVEUgCWlmICgob3AgJiAweGZmZmYwMDAwKSA9PSAweDU5MDAwMDAwKSB7IAkJCQlcICovCisvKiBPQlNPTEVURSAJICAgIHBjICs9IDQ7CQkJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAkgICAgb3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyICgocGMpLCA0KTsJCQkJXCAqLworLyogT0JTT0xFVEUgCSAgICBpZiAoKG9wICYgMHhmZmZmMDAwMCkgPT0gMHg1RjAwMDAwMCkgewkJCVwgKi8KKy8qIE9CU09MRVRFIAkJcGMgKz0gNDsJCQkJCQlcICovCisvKiBPQlNPTEVURSAJICAgICAgICBvcCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKChwYyksIDQpOwkJCVwgKi8KKy8qIE9CU09MRVRFIAkJaWYgKG9wID09IDB4RDQ4MjAwMDgpIHsJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgIHBjICs9IDQ7CQkJCQkJXCAqLworLyogT0JTT0xFVEUgCSAgICAgICAgICAgIG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoKHBjKSwgNCk7CQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgaWYgKG9wID09IDB4NTU4MjAwMEMpIHsJCQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgCXBjICs9IDQ7CQkJCQlcICovCisvKiBPQlNPTEVURSAJICAgICAgICAgICAgICAgIG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoKHBjKSwgMik7CQlcICovCisvKiBPQlNPTEVURSAJCSAgICAgICAgaWYgKG9wID09IDB4MmZhMCkgewkJCQlcICovCisvKiBPQlNPTEVURSAJCSAgICAJICAgIHBjICs9IDI7CQkJCQlcICovCisvKiBPQlNPTEVURSAJCSAgICAgICAgfSBlbHNlIHsJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAkgICAgICAgICAgICAgICAgICAgIG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoKHBjKSwgNCk7CQlcICovCisvKiBPQlNPTEVURSAJCSAgICAgICAgICAgIGlmIChvcCA9PSAweGQ1MDMwMDA4KSB7CQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgCSAgICAgICAgcGMgKz0gNDsJCQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgICAgICAgICB9CQkJCQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgICAgIH0JCQkJCQlcICovCisvKiBPQlNPTEVURSAJCSAgICB9IGVsc2UgewkJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAkgICAgICAgICAgICAgICAgb3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyICgocGMpLCAyKTsJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgICAgICBpZiAob3AgPT0gMHgyZmEwKSB7CQkJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgIAkgICAgcGMgKz0gMjsJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgICAgICB9CQkJCQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgfQkJCQkJCQlcICovCisvKiBPQlNPTEVURSAJCX0JCQkJCQkJXCAqLworLyogT0JTT0xFVEUgCSAgICB9CQkJCQkJCQlcICovCisvKiBPQlNPTEVURSAJfSAJCQkJCQkJCVwgKi8KKy8qIE9CU09MRVRFIH0gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogSW1tZWRpYXRlbHkgYWZ0ZXIgYSBmdW5jdGlvbiBjYWxsLCByZXR1cm4gdGhlIHNhdmVkIHBjLiAqLworLyogT0JTT0xFVEUgICAgQ2FuJ3QgZ28gdGhyb3VnaCB0aGUgZnJhbWVzIGZvciB0aGlzIGJlY2F1c2Ugb24gc29tZSBtYWNoaW5lcyAqLworLyogT0JTT0xFVEUgICAgdGhlIG5ldyBmcmFtZSBpcyBub3Qgc2V0IHVwIHVudGlsIHRoZSBuZXcgZnVuY3Rpb24gZXhlY3V0ZXMgKi8KKy8qIE9CU09MRVRFICAgIHNvbWUgaW5zdHJ1Y3Rpb25zLiAgVHJ1ZSBvbiBOUEwhIFJldHVybiBhZGRyZXNzIGlzIGluIFIxLiAqLworLyogT0JTT0xFVEUgICAgVGhlIHRydWUgcmV0dXJuIGFkZHJlc3MgaXMgUkVBTExZIDQgcGFzdCB0aGF0IGxvY2F0aW9uISAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgU0FWRURfUENfQUZURVJfQ0FMTChmcmFtZSkgXCAqLworLyogT0JTT0xFVEUgCShyZWFkX3JlZ2lzdGVyKFIxX1JFR05VTSkgKyA0KSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBBZGRyZXNzIG9mIGVuZCBvZiBzdGFjayBzcGFjZS4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBTVEFDS19FTkRfQUREUiAJCTB4N2ZmZmMwMDAgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogU3RhY2sgZ3Jvd3MgZG93bndhcmQuICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgSU5ORVJfVEhBTihsaHMscmhzKSAoKGxocykgPCAocmhzKSkgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogU2VxdWVuY2Ugb2YgYnl0ZXMgZm9yIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uICovCisvKiBPQlNPTEVURSAgICBUaGlzIGlzIHBhZGRlZCBvdXQgdG8gdGhlIHNpemUgb2YgYSBtYWNoaW5lIHdvcmQuICBXaGVuIGl0IHdhcyBqdXN0ICovCisvKiBPQlNPTEVURSAgICB7MHgyOCwgMHgwOX0gaXQgZ2F2ZSBwcm9ibGVtcyBpZiBoaXQgYnJlYWtwb2ludCBvbiByZXR1cm5pbmcgZnJvbSBhICovCisvKiBPQlNPTEVURSAgICBmdW5jdGlvbiBjYWxsLiAgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEJSRUFLUE9JTlQgCQl7MHgyOCwgMHgwOSwgMHgwLCAweDB9ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIEFtb3VudCBQQyBtdXN0IGJlIGRlY3JlbWVudGVkIGJ5IGFmdGVyIGEgYnJlYWtwb2ludC4gKi8KKy8qIE9CU09MRVRFICAgIFRoaXMgaXMgb2Z0ZW4gdGhlIG51bWJlciBvZiBieXRlcyBpbiBCUkVBS1BPSU5UICovCisvKiBPQlNPTEVURSAgICBidXQgbm90IGFsd2F5cy4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBERUNSX1BDX0FGVEVSX0JSRUFLCTIgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogUmV0dXJuIDEgaWYgUCBwb2ludHMgdG8gYW4gaW52YWxpZCBmbG9hdGluZyBwb2ludCB2YWx1ZS4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBJTlZBTElEX0ZMT0FUKHAsIGxlbikgCSgoKihzaG9ydCAqKXAgJiAweGZmODApID09IDB4ODAwMCkgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogU2F5IGhvdyBsb25nIChvcmRpbmFyeSkgcmVnaXN0ZXJzIGFyZS4gIFRoaXMgaXMgYSBwaWVjZSBvZiBib2dvc2l0eSAqLworLyogT0JTT0xFVEUgICAgdXNlZCBpbiBwdXNoX3dvcmQgYW5kIGEgZmV3IG90aGVyIHBsYWNlczsgUkVHSVNURVJfUkFXX1NJWkUgaXMgdGhlICovCisvKiBPQlNPTEVURSAgICByZWFsIHdheSB0byBrbm93IGhvdyBiaWcgYSByZWdpc3RlciBpcy4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFJFR0lTVEVSX1NJWkUgNCAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBTaXplIG9mIGJ5dGVzIG9mIHZlY3RvciByZWdpc3RlciAoTlAxIG9ubHkpLCAzMiBlbGVtZW50cyAqIHNpemVvZihpbnQpICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBWUl9TSVpFCQkJMTI4ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIE51bWJlciBvZiBtYWNoaW5lIHJlZ2lzdGVycyAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgTlVNX1JFR1MgCQkyNyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBOVU1fR0VOX1JFR1MJCTE2ICovCisvKiBPQlNPTEVURSAjZGVmaW5lIE5VTV9DUFVfUkVHUwkJNCAqLworLyogT0JTT0xFVEUgI2RlZmluZSBOVU1fVkVDVE9SX1JFR1MJCTcgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogSW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIG5hbWVzIG9mIHJlZ2lzdGVycy4gKi8KKy8qIE9CU09MRVRFICAgIFRoZXJlIHNob3VsZCBiZSBOVU1fUkVHUyBzdHJpbmdzIGluIHRoaXMgaW5pdGlhbGl6ZXIuICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUkVHSVNURVJfTkFNRVMgeyBcICovCisvKiBPQlNPTEVURSAgICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsIFwgKi8KKy8qIE9CU09MRVRFICAgImIwIiwgImIxIiwgImIyIiwgImIzIiwgImI0IiwgImI1IiwgImI2IiwgImI3IiwgXCAqLworLyogT0JTT0xFVEUgICAic3AiLCAicHMiLCAicGMiLCAidmUiLCBcICovCisvKiBPQlNPTEVURSAgICJ2MSIsICJ2MiIsICJ2MyIsICJ2NCIsICJ2NSIsICJ2NiIsICJ2NyIsIFwgKi8KKy8qIE9CU09MRVRFIH0gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogUmVnaXN0ZXIgbnVtYmVycyBvZiB2YXJpb3VzIGltcG9ydGFudCByZWdpc3RlcnMuICovCisvKiBPQlNPTEVURSAgICBOb3RlIHRoYXQgc29tZSBvZiB0aGVzZSB2YWx1ZXMgYXJlICJyZWFsIiByZWdpc3RlciBudW1iZXJzLCAqLworLyogT0JTT0xFVEUgICAgYW5kIGNvcnJlc3BvbmQgdG8gdGhlIGdlbmVyYWwgcmVnaXN0ZXJzIG9mIHRoZSBtYWNoaW5lLCAqLworLyogT0JTT0xFVEUgICAgYW5kIHNvbWUgYXJlICJwaG9ueSIgcmVnaXN0ZXIgbnVtYmVycyB3aGljaCBhcmUgdG9vIGxhcmdlICovCisvKiBPQlNPTEVURSAgICB0byBiZSBhY3R1YWwgcmVnaXN0ZXIgbnVtYmVycyBhcyBmYXIgYXMgdGhlIHVzZXIgaXMgY29uY2VybmVkICovCisvKiBPQlNPTEVURSAgICBidXQgZG8gc2VydmUgdG8gZ2V0IHRoZSBkZXNpcmVkIHZhbHVlcyB3aGVuIHBhc3NlZCB0byByZWFkX3JlZ2lzdGVyLiAgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFIxX1JFR05VTQkxCS8qIEdyMSA9PiByZXR1cm4gYWRkcmVzcyBvZiBjYWxsZXIgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFIyX1JFR05VTQkyCS8qIEdyMiA9PiByZXR1cm4gdmFsdWUgZnJvbSBmdW5jdGlvbiAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUjRfUkVHTlVNCTQJLyogR3I0ID0+IHJlZ2lzdGVyIHNhdmUgYXJlYSAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUjVfUkVHTlVNCTUJLyogR3I1ID0+IHJlZ2lzdGVyIHNhdmUgYXJlYSAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUjZfUkVHTlVNCTYJLyogR3I2ID0+IHJlZ2lzdGVyIHNhdmUgYXJlYSAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUjdfUkVHTlVNCTcJLyogR3I3ID0+IHJlZ2lzdGVyIHNhdmUgYXJlYSAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgQjFfUkVHTlVNCTkJLyogQnIxID0+IHN0YXJ0IG9mIHRoaXMgY29kZSByb3V0aW5lICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBTUF9SRUdOVU0JMTAJLyogQnIyID09IChzcCkgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEFQX1JFR05VTQkxMQkvKiBCcjMgPT0gKGFwKSAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgRlBfUkVHTlVNIAkxNgkvKiBBIGNvcHkgb2YgQnIyIHNhdmVkIGluIHRyYXAgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFBTX1JFR05VTSAJMTcJLyogQ29udGFpbnMgcHJvY2Vzc29yIHN0YXR1cyAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUENfUkVHTlVNIAkxOAkvKiBDb250YWlucyBwcm9ncmFtIGNvdW50ZXIgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFZFX1JFR05VTSAJMTkJLyogVmVjdG9yIGVuZCAodXNlciBzZXR1cCkgcmVnaXN0ZXIgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFYxX1JFR05VTSAJMjAJLyogRmlyc3QgdmVjdG9yIHJlZ2lzdGVyICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBWN19SRUdOVU0gCTI2CS8qIEZpcnN0IHZlY3RvciByZWdpc3RlciAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogVG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCB0byBzdG9yZSBvdXIgY29waWVzIG9mIHRoZSBtYWNoaW5lJ3MgKi8KKy8qIE9CU09MRVRFICAgIHJlZ2lzdGVyIHN0YXRlLCB0aGUgYXJyYXkgYHJlZ2lzdGVycycuICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUkVHSVNURVJfQllURVMgXCAqLworLyogT0JTT0xFVEUgCShOVU1fR0VOX1JFR1MqNCArIE5VTV9WRUNUT1JfUkVHUypWUl9TSVpFICsgTlVNX0NQVV9SRUdTKjQpICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIEluZGV4IHdpdGhpbiBgcmVnaXN0ZXJzJyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3BhY2UgZm9yICovCisvKiBPQlNPTEVURSAgICByZWdpc3RlciBOLiAgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFJFR0lTVEVSX0JZVEUoTikgIFwgKi8KKy8qIE9CU09MRVRFIAkoKChOKSA8IFYxX1JFR05VTSkgPyAoKE4pICogNCkgOiAoKChOKSAtIFYxX1JFR05VTSkgKiBWUl9TSVpFKSArIDgwKSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgYWN0dWFsIG1hY2hpbmUgcmVwcmVzZW50YXRpb24gKi8KKy8qIE9CU09MRVRFICAgIGZvciByZWdpc3RlciBOLiAgT24gdGhlIE5QMSwgYWxsIG5vcm1hbCByZWdzIGFyZSA0IGJ5dGVzLCBidXQgKi8KKy8qIE9CU09MRVRFICAgIHRoZSB2ZWN0b3IgcmVnaXN0ZXJzIGFyZSBWUl9TSVpFKjQgYnl0ZXMgbG9uZy4gKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pIFwgKi8KKy8qIE9CU09MRVRFIAkoKChOKSA8IFYxX1JFR05VTSkgPyA0IDogVlJfU0laRSkgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIHByb2dyYW0ncyByZXByZXNlbnRhdGlvbiAqLworLyogT0JTT0xFVEUgICAgZm9yIHJlZ2lzdGVyIE4uICBPbiB0aGUgTlAxLCBhbGwgcmVncyBhcmUgNCBieXRlcy4gKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfU0laRShOKSBcICovCisvKiBPQlNPTEVURSAJKCgoTikgPCBWMV9SRUdOVU0pID8gNCA6IFZSX1NJWkUpICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfUkFXX1NJWkUgY2FuIGhhdmUuICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgTUFYX1JFR0lTVEVSX1JBV19TSVpFCQlWUl9TSVpFICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfVklSVFVBTF9TSVpFIGNhbiBoYXZlLiAgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUJVlJfU0laRSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBSZXR1cm4gdGhlIEdEQiB0eXBlIG9iamVjdCBmb3IgdGhlICJzdGFuZGFyZCIgZGF0YSB0eXBlICovCisvKiBPQlNPTEVURSAgICBvZiBkYXRhIGluIHJlZ2lzdGVyIE4uICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9UWVBFKE4pCVwgKi8KKy8qIE9CU09MRVRFICAgKChOKSA+IFZFX1JFR05VTSA/IGJ1aWx0aW5fdHlwZV9ucDFfdmVjdG9yIDogYnVpbHRpbl90eXBlX2ludCkgKi8KKy8qIE9CU09MRVRFIGV4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX25wMV92ZWN0b3I7ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBwbGFjZSBpbiB3aGljaCB0byBjb3B5IHRoZSBzdHJ1Y3R1cmUgdGhlICovCisvKiBPQlNPTEVURSAgICBzdWJyb3V0aW5lIHdpbGwgcmV0dXJuLiAgVGhpcyBpcyBjYWxsZWQgZnJvbSBjYWxsX2Z1bmN0aW9uLiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAgICBPbiB0aGlzIG1hY2hpbmUgdGhpcyBpcyBhIG5vLW9wLCBiZWNhdXNlIGdjYyBpc24ndCB1c2VkIG9uIGl0ICovCisvKiBPQlNPTEVURSAgICB5ZXQuICBTbyB0aGlzIGNhbGxpbmcgY29udmVudGlvbiBpcyBub3QgdXNlZC4gKngvICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgU1RPUkVfU1RSVUNUX1JFVFVSTihBRERSLCBTUCkgcHVzaF93b3JkKFNQICsgOCwgQUREUikgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogRXh0cmFjdCBmcm9tIGFuIGFycmFyeSBSRUdCVUYgY29udGFpbmluZyB0aGUgKHJhdykgcmVnaXN0ZXIgc3RhdGUgKi8KKy8qIE9CU09MRVRFICAgIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIG9mIHR5cGUgVFlQRSwgYW5kIGNvcHkgdGhhdCwgaW4gdmlydHVhbCBmb3JtYXQsICovCisvKiBPQlNPTEVURSAgICBpbnRvIFZBTEJVRi4gKngvICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgRVhUUkFDVF9SRVRVUk5fVkFMVUUoVFlQRSxSRUdCVUYsVkFMQlVGKSBcICovCisvKiBPQlNPTEVURSAJbWVtY3B5IChWQUxCVUYsICgoaW50ICopKFJFR0JVRikpICsgMiwgVFlQRV9MRU5HVEggKFRZUEUpKSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBXcml0ZSBpbnRvIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSAqLworLyogT0JTT0xFVEUgICAgb2YgdHlwZSBUWVBFLCBnaXZlbiBpbiB2aXJ0dWFsIGZvcm1hdC4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFNUT1JFX1JFVFVSTl9WQUxVRShUWVBFLFZBTEJVRikgXCAqLworLyogT0JTT0xFVEUgCXdyaXRlX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFIChSMl9SRUdOVU0pLCBWQUxCVUYsICAgICAgXCAqLworLyogT0JTT0xFVEUgCQkJICAgICAgVFlQRV9MRU5HVEggKFRZUEUpKSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlICovCisvKiBPQlNPTEVURSAgICB0aGUgYWRkcmVzcyBpbiB3aGljaCBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gaXRzIHN0cnVjdHVyZSB2YWx1ZSwgKi8KKy8qIE9CU09MRVRFICAgIGFzIGEgQ09SRV9BRERSIChvciBhbiBleHByZXNzaW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgb25lKS4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MoUkVHQlVGKSAoKigoaW50ICopKFJFR0JVRikgKyAyKSkgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogQm90aCBnY2MgYW5kIGNjIHJldHVybiBzbWFsbCBzdHJ1Y3RzIGluIHJlZ2lzdGVycyAoaS5lLiBpbiBHREIgKi8KKy8qIE9CU09MRVRFICAgIHRlcm1pbm9sb2d5LCBzbWFsbCBzdHJ1Y3RzIGRvbid0IHVzZSB0aGUgc3RydWN0IHJldHVybiBjb252ZW50aW9uKS4gICp4LyAqLworLyogT0JTT0xFVEUgZXh0ZXJuIHVzZV9zdHJ1Y3RfY29udmVudGlvbl9mbiBnb3VsZF91c2Vfc3RydWN0X2NvbnZlbnRpb247ICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFVTRV9TVFJVQ1RfQ09OVkVOVElPTihnY2NfcCwgdHlwZSkgZ291bGRfdXNlX3N0cnVjdF9jb252ZW50aW9uIChnY2NfcCwgdHlwZSkgKi8KKy8qIE9CU09MRVRFIAwgKi8KKy8qIE9CU09MRVRFIC8qIERlc2NyaWJlIHRoZSBwb2ludGVyIGluIGVhY2ggc3RhY2sgZnJhbWUgdG8gdGhlIHByZXZpb3VzIHN0YWNrIGZyYW1lICovCisvKiBPQlNPTEVURSAgICAoaXRzIGNhbGxlcikuICAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogRlJBTUVfQ0hBSU4gdGFrZXMgYSBmcmFtZSdzIG5vbWluYWwgYWRkcmVzcyAqLworLyogT0JTT0xFVEUgICAgYW5kIHByb2R1Y2VzIHRoZSBmcmFtZSdzIGNoYWluLXBvaW50ZXIuICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICAgIEhvd2V2ZXIsIGlmIEZSQU1FX0NIQUlOX1ZBTElEIHJldHVybnMgemVybywgKi8KKy8qIE9CU09MRVRFICAgIGl0IG1lYW5zIHRoZSBnaXZlbiBmcmFtZSBpcyB0aGUgb3V0ZXJtb3N0IG9uZSBhbmQgaGFzIG5vIGNhbGxlci4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBJbiB0aGUgY2FzZSBvZiB0aGUgTlBMLCB0aGUgZnJhbWUncyBub3JtaW5hbCBhZGRyZXNzIGlzIEJyMiBhbmQgdGhlICAqLworLyogT0JTT0xFVEUgICAgcHJldmlvdXMgcm91dGluZXMgZnJhbWUgaXMgdXAgdGhlIHN0YWNrIFggYnl0ZXMsIHdoZXJlIFggaXMgdGhlICovCisvKiBPQlNPTEVURSAgICB2YWx1ZSBzdG9yZWQgaW4gdGhlIGNvZGUgZnVuY3Rpb24gaGVhZGVyIHhBKEJyMSkuICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBGUkFNRV9DSEFJTih0aGlzZnJhbWUpCQkoZmluZGZyYW1lKHRoaXNmcmFtZSkpICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIGV4dGVybiBpbnQgZ291bGRfZnJhbWVfY2hhaW5fdmFsaWQgUEFSQU1TICgoQ09SRV9BRERSLCBzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7ICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEZSQU1FX0NIQUlOX1ZBTElEKGNoYWluLCB0aGlzZnJhbWUpIGdvdWxkX2ZyYW1lX2NoYWluX3ZhbGlkIChjaGFpbiwgdGhpc2ZyYW1lKSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBEZWZpbmUgb3RoZXIgYXNwZWN0cyBvZiB0aGUgc3RhY2sgZnJhbWUgb24gTlBMLiAgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEZSQU1FX1NBVkVEX1BDKEZSQU1FKSBcICovCisvKiBPQlNPTEVURSAJKHJlYWRfbWVtb3J5X2ludGVnZXIgKChGUkFNRSktPmZyYW1lICsgOCwgNCkpICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgRlJBTUVfQVJHU19BRERSRVNTKGZpKSBcICovCisvKiBPQlNPTEVURSAJKChmaSktPm5leHQgPyBcICovCisvKiBPQlNPTEVURSAJIHJlYWRfbWVtb3J5X2ludGVnZXIgKChmaSktPmZyYW1lICsgMTIsIDQpIDogXCAqLworLyogT0JTT0xFVEUgCSByZWFkX3JlZ2lzdGVyIChBUF9SRUdOVU0pKSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEZSQU1FX0xPQ0FMU19BRERSRVNTKGZpKQkoKGZpKS0+ZnJhbWUpICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIFNldCBWQUwgdG8gdGhlIG51bWJlciBvZiBhcmdzIHBhc3NlZCB0byBmcmFtZSBkZXNjcmliZWQgYnkgRkkuICovCisvKiBPQlNPTEVURSAgICBDYW4gc2V0IFZBTCB0byAtMSwgbWVhbmluZyBubyB3YXkgdG8gdGVsbC4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBXZSBjYW4gY2hlY2sgdGhlIHN0YWIgaW5mbyB0byBzZWUgaG93ICovCisvKiBPQlNPTEVURSAgICBtYW55IGFyZyB3ZSBoYXZlLiAgTm8gaW5mbyBpbiBzdGFjayB3aWxsIHRlbGwgdXMgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEZSQU1FX05VTV9BUkdTKHZhbCxmaSkJCSh2YWwgPSBmaW5kYXJnKGZpKSkgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogUmV0dXJuIG51bWJlciBvZiBieXRlcyBhdCBzdGFydCBvZiBhcmdsaXN0IHRoYXQgYXJlIG5vdCByZWFsbHkgYXJncy4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBGUkFNRV9BUkdTX1NLSVAJCQk4ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIFB1dCBoZXJlIHRoZSBjb2RlIHRvIHN0b3JlLCBpbnRvIGEgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MsICovCisvKiBPQlNPTEVURSAgICB0aGUgYWRkcmVzc2VzIG9mIHRoZSBzYXZlZCByZWdpc3RlcnMgb2YgZnJhbWUgZGVzY3JpYmVkIGJ5IEZSQU1FX0lORk8uICovCisvKiBPQlNPTEVURSAgICBUaGlzIGluY2x1ZGVzIHNwZWNpYWwgcmVnaXN0ZXJzIHN1Y2ggYXMgcGMgYW5kIGZwIHNhdmVkIGluIHNwZWNpYWwgKi8KKy8qIE9CU09MRVRFICAgIHdheXMgaW4gdGhlIHN0YWNrIGZyYW1lLiAgc3AgaXMgZXZlbiBtb3JlIHNwZWNpYWw6ICovCisvKiBPQlNPTEVURSAgICB0aGUgYWRkcmVzcyB3ZSByZXR1cm4gZm9yIGl0IElTIHRoZSBzcCBmb3IgdGhlIG5leHQgZnJhbWUuICAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgI2RlZmluZSBGUkFNRV9GSU5EX1NBVkVEX1JFR1MoZnJhbWVfaW5mbywgZnJhbWVfc2F2ZWRfcmVncykJCVwgKi8KKy8qIE9CU09MRVRFIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgKi8KKy8qIE9CU09MRVRFICAgbWVtc2V0ICgmZnJhbWVfc2F2ZWRfcmVncywgJ1wwJywgc2l6ZW9mIGZyYW1lX3NhdmVkX3JlZ3MpOwkJCVwgKi8KKy8qIE9CU09MRVRFICAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbU1BfUkVHTlVNXSA9IGZyYW1lY2hhaW4gKGZyYW1lX2luZm8pOyAgICAgICAgIFwgKi8KKy8qIE9CU09MRVRFICAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbUENfUkVHTlVNXSA9IChmcmFtZV9pbmZvKS0+ZnJhbWUgKyA4OwkJXCAqLworLyogT0JTT0xFVEUgICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tSNF9SRUdOVU1dID0gKGZyYW1lX2luZm8pLT5mcmFtZSArIDB4MzA7CVwgKi8KKy8qIE9CU09MRVRFICAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbUjVfUkVHTlVNXSA9IChmcmFtZV9pbmZvKS0+ZnJhbWUgKyAweDM0OwlcICovCisvKiBPQlNPTEVURSAgIChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzW1I2X1JFR05VTV0gPSAoZnJhbWVfaW5mbyktPmZyYW1lICsgMHgzODsJXCAqLworLyogT0JTT0xFVEUgICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tSN19SRUdOVU1dID0gKGZyYW1lX2luZm8pLT5mcmFtZSArIDB4M0M7CVwgKi8KKy8qIE9CU09MRVRFIH0gKi8KKy8qIE9CU09MRVRFIAwgKi8KKy8qIE9CU09MRVRFIC8qIFRoaW5ncyBuZWVkZWQgZm9yIG1ha2luZyB0aGUgaW5mZXJpb3IgY2FsbCBmdW5jdGlvbnMuICAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgI2RlZmluZSBDQUxMX0RVTU1ZX0xPQ0FUSU9OCUJFRk9SRV9URVhUX0VORCAqLworLyogT0JTT0xFVEUgI2RlZmluZQlORUVEX1RFWFRfU1RBUlRfRU5EIDEgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogUHVzaCBhbiBlbXB0eSBzdGFjayBmcmFtZSwgdG8gcmVjb3JkIHRoZSBjdXJyZW50IFBDLCBldGMuICAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FIFwgKi8KKy8qIE9CU09MRVRFIHsgcmVnaXN0ZXIgQ09SRV9BRERSIHNwID0gcmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKTsgXCAqLworLyogT0JTT0xFVEUgICByZWdpc3RlciBpbnQgcmVnbnVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcICovCisvKiBPQlNPTEVURSAgIGZvciAocmVnbnVtID0gMDsgcmVnbnVtIDwgRlBfUkVHTlVNOyByZWdudW0rKykgICAgIFwgKi8KKy8qIE9CU09MRVRFICAgICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKHJlZ251bSkpOyAgICAgXCAqLworLyogT0JTT0xFVEUgICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKFBTX1JFR05VTSkpOyAgICBcICovCisvKiBPQlNPTEVURSAgIHNwID0gcHVzaF93b3JkIChzcCwgcmVhZF9yZWdpc3RlciAoUENfUkVHTlVNKSk7ICAgIFwgKi8KKy8qIE9CU09MRVRFICAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgc3ApO30gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogRGlzY2FyZCBmcm9tIHRoZSBzdGFjayB0aGUgaW5uZXJtb3N0IGZyYW1lLCAgKi8KKy8qIE9CU09MRVRFICAgIHJlc3RvcmluZyBhbGwgc2F2ZWQgcmVnaXN0ZXJzLiAgKngvICovCisvKiBPQlNPTEVURSAvKiBGSVhNRTogU2hvdWxkIGJlIHVzaW5nIHtzdG9yZSxleHRyYWN0fV91bnNpZ25lZF9pbnRlZ2VyLiAgKngvICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUE9QX0ZSQU1FICBcICovCisvKiBPQlNPTEVURSB7IENPUkVfQUREUiBzcCA9IHJlYWRfcmVnaXN0ZXIoU1BfUkVHTlVNKTsgICAgICAgICAgICAgXCAqLworLyogT0JTT0xFVEUgICBVTE9OR0VTVCByZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcICovCisvKiBPQlNPTEVURSAgIGludCByZWdudW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAqLworLyogT0JTT0xFVEUgICBmb3IocmVnbnVtID0gMDtyZWdudW0gPCBGUF9SRUdOVU07cmVnbnVtKyspeyAgICAgICAgIFwgKi8KKy8qIE9CU09MRVRFICAgICBzcC09UkVHSVNURVJfU0laRTsgICAgICAgICAgICAgICAgICAgICAgICAgXCAqLworLyogT0JTT0xFVEUgICAgIHJlYWRfbWVtb3J5KHNwLCZyZWcsUkVHSVNURVJfU0laRSk7ICAgICAgICBcICovCisvKiBPQlNPTEVURSAgICAgd3JpdGVfcmVnaXN0ZXIocmVnbnVtLHJlZyk7fSAgICAgICAgICAgICAgICAgICAgICAgXCAqLworLyogT0JTT0xFVEUgICBzcC09UkVHSVNURVJfU0laRTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcICovCisvKiBPQlNPTEVURSAgIHJlYWRfbWVtb3J5KHNwLCZyZWcsUkVHSVNURVJfU0laRSk7ICAgICAgICAgIFwgKi8KKy8qIE9CU09MRVRFICAgd3JpdGVfcmVnaXN0ZXIoUFNfUkVHTlVNLHJlZyk7ICAgICAgICAgICAgICAgICAgICAgICBcICovCisvKiBPQlNPTEVURSAgIHNwLT1SRUdJU1RFUl9TSVpFOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgKi8KKy8qIE9CU09MRVRFICAgcmVhZF9tZW1vcnkoc3AsJnJlZyxSRUdJU1RFUl9TSVpFKTsgICAgICAgICAgXCAqLworLyogT0JTT0xFVEUgICB3cml0ZV9yZWdpc3RlcihQQ19SRUdOVU0scmVnKTt9ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIE1KRCAtIFNpemUgb2YgZHVtbXkgZnJhbWUgcHVzaGVkIG9udG8gc3RhY2sgYnkgUFVTSF9EVU1NWV9GUkFNRSAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgI2RlZmluZSBEVU1NWV9GUkFNRV9TSVpFICgweDQ4KSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBNSkQgLSBUaGUgc2VxdWVuY2Ugb2Ygd29yZHMgaW4gdGhlIGluc3RydWN0aW9ucyBpcyAqLworLyogT0JTT0xFVEUgICAgaGFsdCAqLworLyogT0JTT0xFVEUgICAgaGFsdCAqLworLyogT0JTT0xFVEUgICAgaGFsdCAqLworLyogT0JTT0xFVEUgICAgaGFsdCAqLworLyogT0JTT0xFVEUgICAgc3ViciAgICBiMixzdGFjayBzaXplLDAgICAgICAgICAgICAgZ3JhYiBzdGFjayBzcGFjZSBmb3IgZHVtbXkgY2FsbCAqLworLyogT0JTT0xFVEUgICAgbGFiciAgICBiMyx4MChiMiksMCAgICAgICAgICAgICAgICAgc2V0IEFQX1JFR05VTSB0byBwb2ludCBhdCBhcmd1bWVudHMgKi8KKy8qIE9CU09MRVRFICAgIGx3ICAgICAgcjIseDgoYjMpLDAgICAgICAgICAgICAgICAgIGxvYWQgcjIgd2l0aCBmaXJzdCBhcmd1bWVudCAgICAgKi8KKy8qIE9CU09MRVRFICAgIGx3YnIgICAgYjEsYXJndW1lbnRzIHNpemUoYjIpLDAgICAgIGxvYWQgYWRkcmVzcyBvZiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgKi8KKy8qIE9CU09MRVRFICAgIGJybG5rICAgcjEseDgoYjEpLDAgICAgICAgICAgICAgICAgIGNhbGwgZnVuY3Rpb24gKi8KKy8qIE9CU09MRVRFICAgIGhhbHQgKi8KKy8qIE9CU09MRVRFICAgIGhhbHQgKi8KKy8qIE9CU09MRVRFICAgIGxhYnIgICAgYjIsc3RhY2sgc2l6ZShiMiksMCAgICAgICAgIGdpdmUgYmFjayBzdGFjayAqLworLyogT0JTT0xFVEUgICAgYnJlYWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgKi8KKy8qIE9CU09MRVRFICAgICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIENBTExfRFVNTVkgezB4MDAwMDAwMDAsICBcICovCisvKiBPQlNPTEVURSAJCSAgICAweDAwMDAwMDAwLCAgXCAqLworLyogT0JTT0xFVEUgCQkgICAgMHg1OTAwMDAwMCwgIFwgKi8KKy8qIE9CU09MRVRFIAkJICAgIDB4NTk4YTAwMDAsICBcICovCisvKiBPQlNPTEVURSAJCSAgICAweGI1MDMwMDA4LCAgXCAqLworLyogT0JTT0xFVEUgCQkgICAgMHg1YzgyMDAwMCwgIFwgKi8KKy8qIE9CU09MRVRFIAkJICAgIDB4NDQ4MTAwMDgsICBcICovCisvKiBPQlNPTEVURSAJCSAgICAweDAwMDAwMDAwLCAgXCAqLworLyogT0JTT0xFVEUgCQkgICAgMHg1OTBhMDAwMCwgIFwgKi8KKy8qIE9CU09MRVRFIAkJICAgIDB4MjgwOTAwMDAgfSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIENBTExfRFVNTVlfTEVOR1RIIDQwICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgQ0FMTF9EVU1NWV9TVEFSVF9PRkZTRVQgOCAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIENBTExfRFVNTVlfU1RBQ0tfQURKVVNUIDggKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogTUpEIC0gRml4dXAgQ0FMTF9EVU1NWSBmb3IgdGhlIHNwZWNpZmljIGZ1bmN0aW9uIGNhbGwuICovCisvKiBPQlNPTEVURSAgICBPSyBoZXJlcyB0aGUgcHJvYmxlbXMgKi8KKy8qIE9CU09MRVRFICAgIDEpIE9uIGEgdHJhcCB0aGVyZSBhcmUgdHdvIGNvcGllcyBvZiB0aGUgc3RhY2sgcG9pbnRlciwgb25lIGluIFNQX1JFR05VTSAqLworLyogT0JTT0xFVEUgICAgICAgd2hpY2ggaXMgcmVhZC93cml0ZSBhbmQgb25lIGluIEZQX1JFR05VTSB3aGljaCBpcyBvbmx5IHJlYWQuIEl0IHNlZW1zICovCisvKiBPQlNPTEVURSAgICAgICB0aGF0IHdoZW4gcmVzdGFydGluZyB0aGUgR09VTEQgTlAxIHVzZXMgRlBfUkVHTlVNJ3MgdmFsdWUuICovCisvKiBPQlNPTEVURSAgICAyKSBMb2FkaW5nIGZ1bmN0aW9uIGFkZHJlc3MgaW50byBiMSBsb29rcyBhIGJpdCBkaWZmaWN1bHQgaWYgYmlnZ2VyIHRoYW4gKi8KKy8qIE9CU09MRVRFICAgICAgIDB4MDAwMGZmZmMsIGluZmFjdCBmcm9tIHdoYXQgSSBjYW4gdGVsbCB0aGUgY29tcGlsZXIgc2V0cyB1cCB0YWJsZSBvZiAqLworLyogT0JTT0xFVEUgICAgICAgZnVuY3Rpb24gYWRkcmVzcyBpbiBiYXNlMyB0aHJvdWdoIHdoaWNoIGZ1bmN0aW9uIGNhbGxzIGFyZSByZWZlcmVuY2VkLiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAgICBPSyBteSBzb2x1dGlvbnMgKi8KKy8qIE9CU09MRVRFICAgICAgQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBkdW1teSBzdGFjayBmcmFtZSBhbmQgZG8gYWRqdXN0bWVudHMgb2YgKi8KKy8qIE9CU09MRVRFICAgICAgU1BfUkVHTlVNIGluIHRoZSBkdW1teSBjYWxsLiAqLworLyogT0JTT0xFVEUgICAgICBQdXNoIGZ1bmN0aW9uIGFkZHJlc3Mgb250byB0aGUgc3RhY2sgYW5kIGxvYWQgaXQgaW4gdGhlIGR1bW15IGNhbGwgKi8KKy8qIE9CU09MRVRFICAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgI2RlZmluZSBGSVhfQ0FMTF9EVU1NWShkdW1teW5hbWUsIHNwLCBmdW4sIG5hcmdzLCBhcmdzLCB0eXBlLCBnY2NfcCkgXCAqLworLyogT0JTT0xFVEUgICB7ICAgaW50IGk7XCAqLworLyogT0JTT0xFVEUgICAgICAgaW50IGFyZ19sZW4gPSAwLCB0b3RhbF9sZW47XCAqLworLyogT0JTT0xFVEUgICAgICAgb2xkX3NwID0gcHVzaF93b3JkKG9sZF9zcCxmdW4pO1wgKi8KKy8qIE9CU09MRVRFICAgICAgIGZvcihpID0gbmFyZ3MgLSAxO2kgPj0gMDtpLS0pXCAqLworLyogT0JTT0xFVEUgCWFyZ19sZW4gKz0gVFlQRV9MRU5HVEggKFZBTFVFX1RZUEUgKHZhbHVlX2FyZ19jb2VyY2UgKGFyZ3NbaV0pKSk7XCAqLworLyogT0JTT0xFVEUgICAgICAgaWYoc3RydWN0X3JldHVybilcICovCisvKiBPQlNPTEVURSAJYXJnX2xlbiArPSBUWVBFX0xFTkdUSCh2YWx1ZV90eXBlKTtcICovCisvKiBPQlNPTEVURSAgICAgICB0b3RhbF9sZW4gPSBEVU1NWV9GUkFNRV9TSVpFK0NBTExfRFVNTVlfU1RBQ0tfQURKVVNUKzQrYXJnX2xlbjtcICovCisvKiBPQlNPTEVURSAgICAgICBkdW1teW5hbWVbMF0gKz0gdG90YWxfbGVuO1wgKi8KKy8qIE9CU09MRVRFICAgICAgIGR1bW15bmFtZVsyXSArPSB0b3RhbF9sZW47XCAqLworLyogT0JTT0xFVEUgICAgICAgZHVtbXluYW1lWzVdICs9IGFyZ19sZW4rQ0FMTF9EVU1NWV9TVEFDS19BREpVU1Q7XCAqLworLyogT0JTT0xFVEUgICAgICAgZHVtbXluYW1lWzhdICs9IHRvdGFsX2xlbjt9ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIE1KRCAtIFNvIHRoZSBzdGFjayBzaG91bGQgZW5kIHVwIGxvb2tpbmcgbGlrZSB0aGlzICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICAgICAgICAgICAgICAgICAgICB8IE5vcm1hbCBzdGFjayBmcmFtZSAgfCAqLworLyogT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgIHwgZnJvbSBub3JtYWwgcHJvZ3JhbSB8ICovCisvKiBPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgfCBmbG93ICAgICAgICAgICAgICAgIHwgKi8KKy8qIE9CU09MRVRFICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyA8LSBGaW5hbCBzcCAtIDB4MDggLSBhcmd1bWVudCBzaXplICovCisvKiBPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwgICAgLSAweDQgLSBkdW1teV9mcmFtZV9zaXplICovCisvKiBPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgfCBQdXNoZWQgZHVtbXkgZnJhbWUgIHwgKi8KKy8qIE9CU09MRVRFICAgICAgICAgICAgICAgICAgICB8ICBiMC1iNywgcjAtcjcgICAgICAgfCAqLworLyogT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgIHwgIHBjIGFuZCBwcyAgICAgICAgICB8ICovCisvKiBPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwgKi8KKy8qIE9CU09MRVRFICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAqLworLyogT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgIHwgRnVuY3Rpb24gYWRkcmVzcyAgICB8ICovCisvKiBPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgPC0gRmluYWwgc3AgLSAweDggLSBhcmd1bWVudHMgc2l6ZSAqLworLyogT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8ICovCisvKiBPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwgKi8KKy8qIE9CU09MRVRFICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAqLworLyogT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgIHwgIEFyZ3VtZW50cyB0byAgICAgICB8ICovCisvKiBPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgfCAgICAgICBGdW5jdGlvbiAgICAgIHwgKi8KKy8qIE9CU09MRVRFICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAqLworLyogT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8ICovCisvKiBPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwgKi8KKy8qIE9CU09MRVRFICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyA8LSBGaW5hbCBzcCAtIDB4OCAqLworLyogT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgIHwgRHVtbXlfc3RhY2tfYWRqdXN0ICB8ICovCisvKiBPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgPC0gRmluYWwgc3AgKi8KKy8qIE9CU09MRVRFICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAqLworLyogT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgIHwgd2hlcmUgY2FsbCB3aWxsICAgICB8ICovCisvKiBPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgfCAgIGJ1aWxkIGZyYW1lICAgICAgIHwgKi8KKy8qIE9CU09MRVRFICp4LyAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9nb3VsZC90bS1wbi5oIGIvZ2RiL2NvbmZpZy9nb3VsZC90bS1wbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NGQ0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2dvdWxkL3RtLXBuLmgKQEAgLTAsMCArMSw0MDkgQEAKKy8qIE9CU09MRVRFIC8qIFBhcmFtZXRlcnMgZm9yIHRhcmdlIG9mIGEgR291bGQgUG93ZXJub2RlLCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLiAqLworLyogT0JTT0xFVEUgICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgKi8KKy8qIE9CU09MRVRFIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICovCisvKiBPQlNPTEVURSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAqLworLyogT0JTT0xFVEUgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICovCisvKiBPQlNPTEVURSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAqLworLyogT0JTT0xFVEUgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAqLworLyogT0JTT0xFVEUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKi8KKy8qIE9CU09MRVRFIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICovCisvKiBPQlNPTEVURSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKngvICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgR09VTERfUE4gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUiBCSUdfRU5ESUFOICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIFRoaXMgY29kZSBhcHBlYXJzIGluIGxpYnJhcmllcyBvbiBHb3VsZCBtYWNoaW5lcy4gIElnbm9yZSBpdC4gKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIElHTk9SRV9TWU1CT0wodHlwZSkgKHR5cGUgPT0gTl9FTlRSWSkgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogV2UgZG9uJ3Qgd2FudCB0aGUgZXh0cmEgZ251IHN5bWJvbHMgb24gdGhlIG1hY2hpbmU7ICovCisvKiBPQlNPTEVURSAgICB0aGV5IHdpbGwgaW50ZXJmZXJlIHdpdGggdGhlIHNoYXJlZCBzZWdtZW50IHN5bWJvbHMuICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgTk9fR05VX1NUQUJTICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIE1hY3JvIGZvciB0ZXh0LW9mZnNldCBhbmQgZGF0YSBpbmZvIChpbiBQTiBhLm91dCBmb3JtYXQpLiAgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lCVRFWFRJTkZPCQkJCQkJXCAqLworLyogT0JTT0xFVEUgCXRleHRfb2Zmc2V0ID0gTl9UWFRPRkYgKGV4ZWNfY29mZmhkcik7CQkJXCAqLworLyogT0JTT0xFVEUgCWV4ZWNfZGF0YV9vZmZzZXQgPSBOX1RYVE9GRiAoZXhlY19jb2ZmaGRyKQkJXCAqLworLyogT0JTT0xFVEUgCQkrIGV4ZWNfYW91dGhkci5hX3RleHQgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogTWFjcm8gZm9yIG51bWJlciBvZiBzeW1ib2wgdGFibGUgZW50cmllcyAodGhpcyB1c2VkIHRvIGJlIGNoZWNrZWQgKi8KKy8qIE9CU09MRVRFICAgIGluIGRieHJlYWQuYyBhbmQgY2F1c2VkIHRoZSBsYXN0IHBzeW10YWIgdG8gdXNlIHRoaXMgYXMgdGhlIGVuZCBvZiAqLworLyogT0JTT0xFVEUgICAgdGV4dC4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IHdvdWxkIHN0aWxsIGJlIG5lY2Vzc2FyeSkuICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgRU5EX09GX1RFWFRfREVGQVVMVAkJCQkJXCAqLworLyogT0JTT0xFVEUgCSgweGZmZmZmZikgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogTWFjcm8gZm9yIG51bWJlciBvZiBzeW1ib2wgdGFibGUgZW50cmllcyAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgTlVNQkVSX09GX1NZTUJPTFMJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAkoY29mZmhkci5mX25zeW1zKSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBNYWNybyBmb3IgZmlsZS1vZmZzZXQgb2Ygc3ltYm9sIHRhYmxlIChpbiB1c3VhbCBhLm91dCBmb3JtYXQpLiAgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFNZTUJPTF9UQUJMRV9PRkZTRVQJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAlOX1NZTU9GRiAoY29mZmhkcikgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogTWFjcm8gZm9yIGZpbGUtb2Zmc2V0IG9mIHN0cmluZyB0YWJsZSAoaW4gdXN1YWwgYS5vdXQgZm9ybWF0KS4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBTVFJJTkdfVEFCTEVfT0ZGU0VUCQkJCQlcICovCisvKiBPQlNPTEVURSAJKE5fU1RST0ZGIChjb2ZmaGRyKSArIHNpemVvZihpbnQpKSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBNYWNybyB0byBzdG9yZSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdGFibGUgZGF0YSBpbiBJTlRPLiAgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFJFQURfU1RSSU5HX1RBQkxFX1NJWkUoSU5UTykJCQkJXCAqLworLyogT0JTT0xFVEUgCXsgSU5UTyA9IGhkci5hX3N0c2l6ZTsgfSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBNYWNybyB0byBkZWNsYXJlIHZhcmlhYmxlcyB0byBob2xkIHRoZSBmaWxlJ3MgaGVhZGVyIGRhdGEuICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgREVDTEFSRV9GSUxFX0hFQURFUlMgIHN0cnVjdCBvbGRfZXhlYyBoZHI7CQlcICovCisvKiBPQlNPTEVURSAJCQkgICAgICBGSUxIRFIgY29mZmhkciAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBNYWNybyB0byByZWFkIHRoZSBoZWFkZXIgZGF0YSBmcm9tIGRlc2NyaXB0b3IgREVTQyBhbmQgdmFsaWRhdGUgaXQuICovCisvKiBPQlNPTEVURSAgICBOQU1FIGlzIHRoZSBmaWxlIG5hbWUsIGZvciBlcnJvciBtZXNzYWdlcy4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBSRUFEX0ZJTEVfSEVBREVSUyhERVNDLCBOQU1FKQkJCQlcICovCisvKiBPQlNPTEVURSB7IHZhbCA9IG15cmVhZCAoREVTQywgJmNvZmZoZHIsIHNpemVvZiBjb2ZmaGRyKTsJCVwgKi8KKy8qIE9CU09MRVRFICAgaWYgKHZhbCA8IDApCQkJCQkJCVwgKi8KKy8qIE9CU09MRVRFICAgICBwZXJyb3Jfd2l0aF9uYW1lIChOQU1FKTsJCQkJCVwgKi8KKy8qIE9CU09MRVRFICAgdmFsID0gbXlyZWFkIChERVNDLCAmaGRyLCBzaXplb2YgaGRyKTsJCQlcICovCisvKiBPQlNPTEVURSAgIGlmICh2YWwgPCAwKQkJCQkJCQlcICovCisvKiBPQlNPTEVURSAgICAgcGVycm9yX3dpdGhfbmFtZSAoTkFNRSk7CQkJCQlcICovCisvKiBPQlNPTEVURSAgIGlmIChjb2ZmaGRyLmZfbWFnaWMgIT0gR05QMU1BR0lDKQkJCQlcICovCisvKiBPQlNPTEVURSAgICAgZXJyb3IgKCJGaWxlIFwiJXNcIiBub3QgaW4gY29mZiBleGVjdXRhYmxlIGZvcm1hdC4iLCBOQU1FKTsJXCAqLworLyogT0JTT0xFVEUgICBpZiAoTl9CQURNQUcgKGhkcikpCQkJCQkJXCAqLworLyogT0JTT0xFVEUgICAgIGVycm9yICgiRmlsZSBcIiVzXCIgbm90IGluIGV4ZWN1dGFibGUgZm9ybWF0LiIsIE5BTUUpOyB9ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIERlZmluZSBDT0ZGIGFuZCBvdGhlciBzeW1ib2xpYyBuYW1lcyBuZWVkZWQgb24gTlAxICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZQlOUzMyR01BR0lDCUdEUE1BR0lDICovCisvKiBPQlNPTEVURSAjZGVmaW5lCU5TMzJTTUFHSUMJUE5fTUFHSUMgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogT2Zmc2V0IGZyb20gYWRkcmVzcyBvZiBmdW5jdGlvbiB0byBzdGFydCBvZiBpdHMgY29kZS4gKi8KKy8qIE9CU09MRVRFICAgIFplcm8gb24gbW9zdCBtYWNoaW5lcy4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBGVU5DVElPTl9TVEFSVF9PRkZTRVQJNCAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBBZHZhbmNlIFBDIGFjcm9zcyBhbnkgZnVuY3Rpb24gZW50cnkgcHJvbG9ndWUgaW5zdHJ1Y3Rpb25zICovCisvKiBPQlNPTEVURSAgICB0byByZWFjaCBzb21lICJyZWFsIiBjb2RlLiAgT25lIFBOIHdlIGNhbiBoYXZlIG9uZSBvciB0d28gc3RhcnR1cCAqLworLyogT0JTT0xFVEUgICAgc2VxdWVuY2VzIGRlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgbG9jYWwgc3RhY2s6ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICAgIEVpdGhlcjogKi8KKy8qIE9CU09MRVRFICAgICAgICJzdWFiciBiMiwgIyIgKi8KKy8qIE9CU09MRVRFICAgIG9mICovCisvKiBPQlNPTEVURSAgICAgICAibGlsIHI0LCAjIiwgInN1YWJyIGIyLCAjKHI0KSIgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgICAgImx3YnIgYjYsICMiLCAic3R3IHIxLCA4KGIyKSIgKi8KKy8qIE9CU09MRVRFICAgIE9wdGlvbmFsICJzdHdiciBiMywgYyhiMikiICovCisvKiBPQlNPTEVURSAgICBPcHRpb25hbCAidHJyIHIyLHI3IiAgICAgIChHb3VsZCBmaXJzdCBhcmd1bWVudCByZWdpc3RlciBwYXNzaW5nKSAqLworLyogT0JTT0xFVEUgICAgICBvciAqLworLyogT0JTT0xFVEUgICAgT3B0aW9uYWwgInN0dyByMiw4KGIzKSIgICAoR291bGQgZmlyc3QgYXJndW1lbnQgcmVnaXN0ZXIgcGFzc2luZykgKi8KKy8qIE9CU09MRVRFICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgU0tJUF9QUk9MT0dVRShwYykgeyAJCQkJCQlcICovCisvKiBPQlNPTEVURSAJcmVnaXN0ZXIgaW50IG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoKHBjKSwgNCk7CQlcICovCisvKiBPQlNPTEVURSAJaWYgKChvcCAmIDB4ZmZmZjAwMDApID09IDB4NTgwQjAwMDApIHsgCQkJCVwgKi8KKy8qIE9CU09MRVRFIAkgICAgcGMgKz0gNDsJCQkJCQkJXCAqLworLyogT0JTT0xFVEUgCSAgICBvcCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKChwYyksIDQpOwkJCQlcICovCisvKiBPQlNPTEVURSAJICAgIGlmICgob3AgJiAweGZmZmYwMDAwKSA9PSAweDU5NDAwMDAwKSB7CQkJXCAqLworLyogT0JTT0xFVEUgCQlwYyArPSA0OwkJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAkgICAgICAgIG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoKHBjKSwgNCk7CQkJXCAqLworLyogT0JTT0xFVEUgCQlpZiAoKG9wICYgMHhmZmZmMDAwMCkgPT0gMHg1RjAwMDAwMCkgewkJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgIHBjICs9IDQ7CQkJCQkJXCAqLworLyogT0JTT0xFVEUgCSAgICAgICAgICAgIG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoKHBjKSwgNCk7CQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgaWYgKG9wID09IDB4RDQ4MjAwMDgpIHsJCQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgCXBjICs9IDQ7CQkJCQlcICovCisvKiBPQlNPTEVURSAJICAgICAgICAgICAgCW9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoKHBjKSwgNCk7CQlcICovCisvKiBPQlNPTEVURSAJCSAgICAJaWYgKG9wID09IDB4NTU4MjAwMEMpIHsJCQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgCSAgICBwYyArPSA0OwkJCQkJXCAqLworLyogT0JTT0xFVEUgCSAgICAgICAgICAgICAgICAgICAgb3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyICgocGMpLCAyKTsJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgICAgICAgICAgaWYgKG9wID09IDB4MmZhMCkgewkJCQlcICovCisvKiBPQlNPTEVURSAJCSAgICAJICAgICAgICBwYyArPSAyOwkJCQlcICovCisvKiBPQlNPTEVURSAJCSAgICAgICAgICAgIH0gZWxzZSB7CQkJCQlcICovCisvKiBPQlNPTEVURSAJICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyICgocGMpLCA0KTsJXCAqLworLyogT0JTT0xFVEUgCQkgICAgICAgICAgICAgICAgaWYgKG9wID09IDB4ZDUwMzAwMDgpIHsJCQlcICovCisvKiBPQlNPTEVURSAJCSAgICAJICAgICAgICAgICAgcGMgKz0gNDsJCQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgICAgICAgICAgICAgfQkJCQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgICAgICAgICB9CQkJCQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgICAgIH0gZWxzZSB7CQkJCQlcICovCisvKiBPQlNPTEVURSAJICAgICAgICAgICAgICAgICAgICBvcCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKChwYyksIDIpOwkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgICAgICAgICBpZiAob3AgPT0gMHgyZmEwKSB7CQkJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgIAkgICAgICAgIHBjICs9IDI7CQkJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgICAgICAgICAgfQkJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgICAgICB9CQkJCQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgfQkJCQkJCQlcICovCisvKiBPQlNPTEVURSAJCX0JCQkJCQkJXCAqLworLyogT0JTT0xFVEUgCSAgICB9CQkJCQkJCQlcICovCisvKiBPQlNPTEVURSAJfSAJCQkJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAlpZiAoKG9wICYgMHhmZmZmMDAwMCkgPT0gMHg1OTAwMDAwMCkgeyAJCQkJXCAqLworLyogT0JTT0xFVEUgCSAgICBwYyArPSA0OwkJCQkJCQlcICovCisvKiBPQlNPTEVURSAJICAgIG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoKHBjKSwgNCk7CQkJCVwgKi8KKy8qIE9CU09MRVRFIAkgICAgaWYgKChvcCAmIDB4ZmZmZjAwMDApID09IDB4NUYwMDAwMDApIHsJCQlcICovCisvKiBPQlNPTEVURSAJCXBjICs9IDQ7CQkJCQkJXCAqLworLyogT0JTT0xFVEUgCSAgICAgICAgb3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyICgocGMpLCA0KTsJCQlcICovCisvKiBPQlNPTEVURSAJCWlmIChvcCA9PSAweEQ0ODIwMDA4KSB7CQkJCQlcICovCisvKiBPQlNPTEVURSAJCSAgICBwYyArPSA0OwkJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAkgICAgICAgICAgICBvcCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKChwYyksIDQpOwkJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgIGlmIChvcCA9PSAweDU1ODIwMDBDKSB7CQkJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgIAlwYyArPSA0OwkJCQkJXCAqLworLyogT0JTT0xFVEUgCSAgICAgICAgICAgICAgICBvcCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKChwYyksIDIpOwkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgICAgIGlmIChvcCA9PSAweDJmYTApIHsJCQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgCSAgICBwYyArPSAyOwkJCQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgICAgIH0gZWxzZSB7CQkJCQlcICovCisvKiBPQlNPTEVURSAJICAgICAgICAgICAgICAgICAgICBvcCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKChwYyksIDQpOwkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgICAgICAgICBpZiAob3AgPT0gMHhkNTAzMDAwOCkgewkJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgIAkgICAgICAgIHBjICs9IDQ7CQkJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgICAgICAgICAgfQkJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgICAgICB9CQkJCQkJXCAqLworLyogT0JTT0xFVEUgCQkgICAgfSBlbHNlIHsJCQkJCQlcICovCisvKiBPQlNPTEVURSAJICAgICAgICAgICAgICAgIG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoKHBjKSwgMik7CQlcICovCisvKiBPQlNPTEVURSAJCSAgICAgICAgaWYgKG9wID09IDB4MmZhMCkgewkJCQlcICovCisvKiBPQlNPTEVURSAJCSAgICAJICAgIHBjICs9IDI7CQkJCQlcICovCisvKiBPQlNPTEVURSAJCSAgICAgICAgfQkJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAkJICAgIH0JCQkJCQkJXCAqLworLyogT0JTT0xFVEUgCQl9CQkJCQkJCVwgKi8KKy8qIE9CU09MRVRFIAkgICAgfQkJCQkJCQkJXCAqLworLyogT0JTT0xFVEUgCX0gCQkJCQkJCQlcICovCisvKiBPQlNPTEVURSB9ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIEltbWVkaWF0ZWx5IGFmdGVyIGEgZnVuY3Rpb24gY2FsbCwgcmV0dXJuIHRoZSBzYXZlZCBwYy4gKi8KKy8qIE9CU09MRVRFICAgIENhbid0IGdvIHRocm91Z2ggdGhlIGZyYW1lcyBmb3IgdGhpcyBiZWNhdXNlIG9uIHNvbWUgbWFjaGluZXMgKi8KKy8qIE9CU09MRVRFICAgIHRoZSBuZXcgZnJhbWUgaXMgbm90IHNldCB1cCB1bnRpbCB0aGUgbmV3IGZ1bmN0aW9uIGV4ZWN1dGVzICovCisvKiBPQlNPTEVURSAgICBzb21lIGluc3RydWN0aW9ucy4gIFRydWUgb24gUE4hICBSZXR1cm4gYWRkcmVzcyBpcyBpbiBSMS4gKi8KKy8qIE9CU09MRVRFICAgIE5vdGU6IHRydWUgcmV0dXJuIGxvY2F0aW9uIGlzIDQgYnl0ZXMgcGFzdCBSMSEgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFNBVkVEX1BDX0FGVEVSX0NBTEwoZnJhbWUpIFwgKi8KKy8qIE9CU09MRVRFIAkocmVhZF9yZWdpc3RlcihSMV9SRUdOVU0pICsgNCkgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogQWRkcmVzcyBvZiBlbmQgb2Ygc3RhY2sgc3BhY2UuICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgU1RBQ0tfRU5EX0FERFIgCQkweDQ4MDAwMCAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBTdGFjayBncm93cyBkb3dud2FyZC4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBJTk5FUl9USEFOKGxocyxyaHMpICgobGhzKSA8IChyaHMpKSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBTZXF1ZW5jZSBvZiBieXRlcyBmb3IgYnJlYWtwb2ludCBpbnN0cnVjdGlvbi4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBCUkVBS1BPSU5UIAkJezB4MjgsIDB4MDl9ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIEFtb3VudCBQQyBtdXN0IGJlIGRlY3JlbWVudGVkIGJ5IGFmdGVyIGEgYnJlYWtwb2ludC4gKi8KKy8qIE9CU09MRVRFICAgIFRoaXMgaXMgb2Z0ZW4gdGhlIG51bWJlciBvZiBieXRlcyBpbiBCUkVBS1BPSU5UICovCisvKiBPQlNPTEVURSAgICBidXQgbm90IGFsd2F5cy4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBERUNSX1BDX0FGVEVSX0JSRUFLCTIgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogUmV0dXJuIDEgaWYgUCBwb2ludHMgdG8gYW4gaW52YWxpZCBmbG9hdGluZyBwb2ludCB2YWx1ZS4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBJTlZBTElEX0ZMT0FUKHAsIGxlbikgCSgoKihzaG9ydCAqKXAgJiAweGZmODApID09IDB4ODAwMCkgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogU2F5IGhvdyBsb25nIChvcmRpbmFyeSkgcmVnaXN0ZXJzIGFyZS4gIFRoaXMgaXMgYSBwaWVjZSBvZiBib2dvc2l0eSAqLworLyogT0JTT0xFVEUgICAgdXNlZCBpbiBwdXNoX3dvcmQgYW5kIGEgZmV3IG90aGVyIHBsYWNlczsgUkVHSVNURVJfUkFXX1NJWkUgaXMgdGhlICovCisvKiBPQlNPTEVURSAgICByZWFsIHdheSB0byBrbm93IGhvdyBiaWcgYSByZWdpc3RlciBpcy4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFJFR0lTVEVSX1NJWkUgNCAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBOdW1iZXIgb2YgbWFjaGluZSByZWdpc3RlcnMgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIE5VTV9SRUdTIAkJMTkgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgTlVNX0dFTl9SRUdTCQkxNiAqLworLyogT0JTT0xFVEUgI2RlZmluZSBOVU1fQ1BVX1JFR1MJCTMgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogSW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIG5hbWVzIG9mIHJlZ2lzdGVycy4gKi8KKy8qIE9CU09MRVRFICAgIFRoZXJlIHNob3VsZCBiZSBOVU1fUkVHUyBzdHJpbmdzIGluIHRoaXMgaW5pdGlhbGl6ZXIuICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUkVHSVNURVJfTkFNRVMgeyBcICovCisvKiBPQlNPTEVURSAgICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsIFwgKi8KKy8qIE9CU09MRVRFICAgImIwIiwgImIxIiwgImIyIiwgImIzIiwgImI0IiwgImI1IiwgImI2IiwgImI3IiwgXCAqLworLyogT0JTT0xFVEUgICAic3AiLCAicHMiLCAicGMiLCBcICovCisvKiBPQlNPTEVURSB9ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIFJlZ2lzdGVyIG51bWJlcnMgb2YgdmFyaW91cyBpbXBvcnRhbnQgcmVnaXN0ZXJzLiAqLworLyogT0JTT0xFVEUgICAgTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2UgdmFsdWVzIGFyZSAicmVhbCIgcmVnaXN0ZXIgbnVtYmVycywgKi8KKy8qIE9CU09MRVRFICAgIGFuZCBjb3JyZXNwb25kIHRvIHRoZSBnZW5lcmFsIHJlZ2lzdGVycyBvZiB0aGUgbWFjaGluZSwgKi8KKy8qIE9CU09MRVRFICAgIGFuZCBzb21lIGFyZSAicGhvbnkiIHJlZ2lzdGVyIG51bWJlcnMgd2hpY2ggYXJlIHRvbyBsYXJnZSAqLworLyogT0JTT0xFVEUgICAgdG8gYmUgYWN0dWFsIHJlZ2lzdGVyIG51bWJlcnMgYXMgZmFyIGFzIHRoZSB1c2VyIGlzIGNvbmNlcm5lZCAqLworLyogT0JTT0xFVEUgICAgYnV0IGRvIHNlcnZlIHRvIGdldCB0aGUgZGVzaXJlZCB2YWx1ZXMgd2hlbiBwYXNzZWQgdG8gcmVhZF9yZWdpc3Rlci4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBSMV9SRUdOVU0JMQkvKiBHcjEgPT4gcmV0dXJuIGFkZHJlc3Mgb2YgY2FsbGVyICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBSNF9SRUdOVU0JNAkvKiBHcjQgPT4gcmVnaXN0ZXIgc2F2ZSBhcmVhICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBSNV9SRUdOVU0JNQkvKiBHcjUgPT4gcmVnaXN0ZXIgc2F2ZSBhcmVhICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBSNl9SRUdOVU0JNgkvKiBHcjYgPT4gcmVnaXN0ZXIgc2F2ZSBhcmVhICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBSN19SRUdOVU0JNwkvKiBHcjcgPT4gcmVnaXN0ZXIgc2F2ZSBhcmVhICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBCMV9SRUdOVU0JOQkvKiBCcjEgPT4gc3RhcnQgb2YgdGhpcyBjb2RlIHJvdXRpbmUgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEZQX1JFR05VTQkxMAkvKiBCcjIgPT0gKHNwKSAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgQVBfUkVHTlVNCTExCS8qIEJyMyA9PSAoYXApICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBTUF9SRUdOVU0gCTE2CS8qIEEgY29weSBvZiBCcjIgc2F2ZWQgaW4gdHJhcCAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUFNfUkVHTlVNIAkxNwkvKiBDb250YWlucyBwcm9jZXNzb3Igc3RhdHVzICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBQQ19SRUdOVU0gCTE4CS8qIENvbnRhaW5zIHByb2dyYW0gY291bnRlciAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogVG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCB0byBzdG9yZSBvdXIgY29waWVzIG9mIHRoZSBtYWNoaW5lJ3MgKi8KKy8qIE9CU09MRVRFICAgIHJlZ2lzdGVyIHN0YXRlLCB0aGUgYXJyYXkgYHJlZ2lzdGVycycuICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUkVHSVNURVJfQllURVMJCQkoTlVNX0dFTl9SRUdTKjQgKyBOVU1fQ1BVX1JFR1MqNCkgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogSW5kZXggd2l0aGluIGByZWdpc3RlcnMnIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzcGFjZSBmb3IgKi8KKy8qIE9CU09MRVRFICAgIHJlZ2lzdGVyIE4uICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUkVHSVNURVJfQllURShOKSAgCQkoKE4pICogNCkgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIGFjdHVhbCBtYWNoaW5lIHJlcHJlc2VudGF0aW9uICovCisvKiBPQlNPTEVURSAgICBmb3IgcmVnaXN0ZXIgTi4gIE9uIHRoZSBQTiwgYWxsIG5vcm1hbCByZWdzIGFyZSA0IGJ5dGVzLiAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUkVHSVNURVJfUkFXX1NJWkUoTikgCQkoNCkgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIHByb2dyYW0ncyByZXByZXNlbnRhdGlvbiAqLworLyogT0JTT0xFVEUgICAgZm9yIHJlZ2lzdGVyIE4uICBPbiB0aGUgUE4sIGFsbCByZWdzIGFyZSA0IGJ5dGVzLiAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9TSVpFKE4pCSg0KSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1JBV19TSVpFIGNhbiBoYXZlLiAgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIE1BWF9SRUdJU1RFUl9SQVdfU0laRQkJKDQpICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfVklSVFVBTF9TSVpFIGNhbiBoYXZlLiAgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUJKDQpICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIFJldHVybiB0aGUgR0RCIHR5cGUgb2JqZWN0IGZvciB0aGUgInN0YW5kYXJkIiBkYXRhIHR5cGUgKi8KKy8qIE9CU09MRVRFICAgIG9mIGRhdGEgaW4gcmVnaXN0ZXIgTi4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1RZUEUoTikJKGJ1aWx0aW5fdHlwZV9pbnQpICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBwbGFjZSBpbiB3aGljaCB0byBjb3B5IHRoZSBzdHJ1Y3R1cmUgdGhlICovCisvKiBPQlNPTEVURSAgICBzdWJyb3V0aW5lIHdpbGwgcmV0dXJuLiAgVGhpcyBpcyBjYWxsZWQgZnJvbSBjYWxsX2Z1bmN0aW9uLiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAgICBPbiB0aGlzIG1hY2hpbmUgdGhpcyBpcyBhIG5vLW9wLCBiZWNhdXNlIGdjYyBpc24ndCB1c2VkIG9uIGl0ICovCisvKiBPQlNPTEVURSAgICB5ZXQuICBTbyB0aGlzIGNhbGxpbmcgY29udmVudGlvbiBpcyBub3QgdXNlZC4gKngvICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgU1RPUkVfU1RSVUNUX1JFVFVSTihBRERSLCBTUCkgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogRXh0cmFjdCBmcm9tIGFuIGFycmFyeSBSRUdCVUYgY29udGFpbmluZyB0aGUgKHJhdykgcmVnaXN0ZXIgc3RhdGUgKi8KKy8qIE9CU09MRVRFICAgIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIG9mIHR5cGUgVFlQRSwgYW5kIGNvcHkgdGhhdCwgaW4gdmlydHVhbCBmb3JtYXQsICovCisvKiBPQlNPTEVURSAgICBpbnRvIFZBTEJVRi4gKngvICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgRVhUUkFDVF9SRVRVUk5fVkFMVUUoVFlQRSxSRUdCVUYsVkFMQlVGKSBcICovCisvKiBPQlNPTEVURSAJbWVtY3B5IChWQUxCVUYsIFJFR0JVRiwgVFlQRV9MRU5HVEggKFRZUEUpKSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBXcml0ZSBpbnRvIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSAqLworLyogT0JTT0xFVEUgICAgb2YgdHlwZSBUWVBFLCBnaXZlbiBpbiB2aXJ0dWFsIGZvcm1hdC4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFNUT1JFX1JFVFVSTl9WQUxVRShUWVBFLFZBTEJVRikgXCAqLworLyogT0JTT0xFVEUgCXdyaXRlX3JlZ2lzdGVyX2J5dGVzICgwLCBWQUxCVUYsIFRZUEVfTEVOR1RIIChUWVBFKSkgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZSAqLworLyogT0JTT0xFVEUgICAgdGhlIGFkZHJlc3MgaW4gd2hpY2ggYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGl0cyBzdHJ1Y3R1cmUgdmFsdWUsICovCisvKiBPQlNPTEVURSAgICBhcyBhIENPUkVfQUREUiAob3IgYW4gZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIG9uZSkuICAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgI2RlZmluZSBFWFRSQUNUX1NUUlVDVF9WQUxVRV9BRERSRVNTKFJFR0JVRikgKCooaW50ICopKFJFR0JVRikpICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIAwgKi8KKy8qIE9CU09MRVRFIC8qIERlc2NyaWJlIHRoZSBwb2ludGVyIGluIGVhY2ggc3RhY2sgZnJhbWUgdG8gdGhlIHByZXZpb3VzIHN0YWNrIGZyYW1lICovCisvKiBPQlNPTEVURSAgICAoaXRzIGNhbGxlcikuICAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogRlJBTUVfQ0hBSU4gdGFrZXMgYSBmcmFtZSdzIG5vbWluYWwgYWRkcmVzcyAqLworLyogT0JTT0xFVEUgICAgYW5kIHByb2R1Y2VzIHRoZSBmcmFtZSdzIGNoYWluLXBvaW50ZXIuICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICAgIEhvd2V2ZXIsIGlmIEZSQU1FX0NIQUlOX1ZBTElEIHJldHVybnMgemVybywgKi8KKy8qIE9CU09MRVRFICAgIGl0IG1lYW5zIHRoZSBnaXZlbiBmcmFtZSBpcyB0aGUgb3V0ZXJtb3N0IG9uZSBhbmQgaGFzIG5vIGNhbGxlci4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBJbiB0aGUgY2FzZSBvZiB0aGUgTlBMLCB0aGUgZnJhbWUncyBub3JtaW5hbCBhZGRyZXNzIGlzIEJyMiBhbmQgdGhlICAqLworLyogT0JTT0xFVEUgICAgcHJldmlvdXMgcm91dGluZXMgZnJhbWUgaXMgdXAgdGhlIHN0YWNrIFggYnl0ZXMsIHdoZXJlIFggaXMgdGhlICovCisvKiBPQlNPTEVURSAgICB2YWx1ZSBzdG9yZWQgaW4gdGhlIGNvZGUgZnVuY3Rpb24gaGVhZGVyIHhBKEJyMSkuICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBGUkFNRV9DSEFJTih0aGlzZnJhbWUpCQkoZmluZGZyYW1lKHRoaXNmcmFtZSkpICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIGV4dGVybiBpbnQgZ291bGRfZnJhbWVfY2hhaW5fdmFsaWQgUEFSQU1TICgoQ09SRV9BRERSLCBzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7ICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEZSQU1FX0NIQUlOX1ZBTElEKGNoYWluLCB0aGlzZnJhbWUpIGdvdWxkX2ZyYW1lX2NoYWluX3ZhbGlkIChjaGFpbiwgdGhpc2ZyYW1lKSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBEZWZpbmUgb3RoZXIgYXNwZWN0cyBvZiB0aGUgc3RhY2sgZnJhbWUgb24gTlBMLiAgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEZSQU1FX1NBVkVEX1BDKGZyYW1lKSBcICovCisvKiBPQlNPTEVURSAJKHJlYWRfbWVtb3J5X2ludGVnZXIgKChmcmFtZSktPmZyYW1lICsgOCwgNCkpICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgRlJBTUVfQVJHU19BRERSRVNTKGZpKSBcICovCisvKiBPQlNPTEVURSAJKChmaSktPm5leHQgPyBcICovCisvKiBPQlNPTEVURSAJIHJlYWRfbWVtb3J5X2ludGVnZXIgKChmaSktPmZyYW1lICsgMTIsIDQpIDogXCAqLworLyogT0JTT0xFVEUgCSByZWFkX3JlZ2lzdGVyIChBUF9SRUdOVU0pKSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEZSQU1FX0xPQ0FMU19BRERSRVNTKGZpKQkoKGZpKS0+ZnJhbWUgKyA4MCkgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogU2V0IFZBTCB0byB0aGUgbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvIGZyYW1lIGRlc2NyaWJlZCBieSBGSS4gKi8KKy8qIE9CU09MRVRFICAgIENhbiBzZXQgVkFMIHRvIC0xLCBtZWFuaW5nIG5vIHdheSB0byB0ZWxsLiAgKngvICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIFdlIGNhbiBjaGVjayB0aGUgc3RhYiBpbmZvIHRvIHNlZSBob3cgKi8KKy8qIE9CU09MRVRFICAgIG1hbnkgYXJnIHdlIGhhdmUuICBObyBpbmZvIGluIHN0YWNrIHdpbGwgdGVsbCB1cyAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgRlJBTUVfTlVNX0FSR1ModmFsLGZpKQkJKHZhbCA9IGZpbmRhcmcoZmkpKSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGF0IHN0YXJ0IG9mIGFyZ2xpc3QgdGhhdCBhcmUgbm90IHJlYWxseSBhcmdzLiAgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEZSQU1FX0FSR1NfU0tJUAkJCTggKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogUHV0IGhlcmUgdGhlIGNvZGUgdG8gc3RvcmUsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywgKi8KKy8qIE9CU09MRVRFICAgIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4gKi8KKy8qIE9CU09MRVRFICAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbCAqLworLyogT0JTT0xFVEUgICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDogKi8KKy8qIE9CU09MRVRFICAgIHRoZSBhZGRyZXNzIHdlIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEZSQU1FX0ZJTkRfU0FWRURfUkVHUyhmcmFtZV9pbmZvLCBmcmFtZV9zYXZlZF9yZWdzKQkJXCAqLworLyogT0JTT0xFVEUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAqLworLyogT0JTT0xFVEUgICBtZW1zZXQgKCZmcmFtZV9zYXZlZF9yZWdzLCAnXDAnLCBzaXplb2YgZnJhbWVfc2F2ZWRfcmVncyk7CQkJXCAqLworLyogT0JTT0xFVEUgICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tQQ19SRUdOVU1dID0gKGZyYW1lX2luZm8pLT5mcmFtZSArIDg7CQlcICovCisvKiBPQlNPTEVURSAgIChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzW1I0X1JFR05VTV0gPSAoZnJhbWVfaW5mbyktPmZyYW1lICsgMHgzMDsJXCAqLworLyogT0JTT0xFVEUgICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tSNV9SRUdOVU1dID0gKGZyYW1lX2luZm8pLT5mcmFtZSArIDB4MzQ7CVwgKi8KKy8qIE9CU09MRVRFICAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbUjZfUkVHTlVNXSA9IChmcmFtZV9pbmZvKS0+ZnJhbWUgKyAweDM4OwlcICovCisvKiBPQlNPTEVURSAgIChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzW1I3X1JFR05VTV0gPSAoZnJhbWVfaW5mbyktPmZyYW1lICsgMHgzQzsJXCAqLworLyogT0JTT0xFVEUgfSAqLworLyogT0JTT0xFVEUgDCAqLworLyogT0JTT0xFVEUgLyogVGhpbmdzIG5lZWRlZCBmb3IgbWFraW5nIHRoZSBpbmZlcmlvciBjYWxsIGZ1bmN0aW9ucy4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBQdXNoIGFuIGVtcHR5IHN0YWNrIGZyYW1lLCB0byByZWNvcmQgdGhlIGN1cnJlbnQgUEMsIGV0Yy4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFBVU0hfRFVNTVlfRlJBTUUgXCAqLworLyogT0JTT0xFVEUgeyByZWdpc3RlciBDT1JFX0FERFIgc3AgPSByZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pOwkJCVwgKi8KKy8qIE9CU09MRVRFICAgcmVnaXN0ZXIgaW50IHJlZ251bTsJCQkJCQkJXCAqLworLyogT0JTT0xFVEUgICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKFBDX1JFR05VTSkpOwkJCVwgKi8KKy8qIE9CU09MRVRFICAgc3AgPSBwdXNoX3dvcmQgKHNwLCByZWFkX3JlZ2lzdGVyIChGUF9SRUdOVU0pKTsJCQlcICovCisvKiBPQlNPTEVURSAgIHdyaXRlX3JlZ2lzdGVyIChGUF9SRUdOVU0sIHNwKTsJCQkJCVwgKi8KKy8qIE9CU09MRVRFICAgZm9yIChyZWdudW0gPSBGUF9SRUdOVU0gLSAxOyByZWdudW0gPj0gMDsgcmVnbnVtLS0pCQkJXCAqLworLyogT0JTT0xFVEUgICAgIHNwID0gcHVzaF93b3JkIChzcCwgcmVhZF9yZWdpc3RlciAocmVnbnVtKSk7CQkJXCAqLworLyogT0JTT0xFVEUgICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKFBTX1JFR05VTSkpOwkJCVwgKi8KKy8qIE9CU09MRVRFICAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgc3ApOyAgfSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBEaXNjYXJkIGZyb20gdGhlIHN0YWNrIHRoZSBpbm5lcm1vc3QgZnJhbWUsICAqLworLyogT0JTT0xFVEUgICAgcmVzdG9yaW5nIGFsbCBzYXZlZCByZWdpc3RlcnMuICAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgI2RlZmluZSBQT1BfRlJBTUUgIFwgKi8KKy8qIE9CU09MRVRFIHsgcmVnaXN0ZXIgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lID0gZ2V0X2N1cnJlbnRfZnJhbWUgKCk7CSBcICovCisvKiBPQlNPTEVURSAgIHJlZ2lzdGVyIENPUkVfQUREUiBmcDsJCQkJCSBcICovCisvKiBPQlNPTEVURSAgIHJlZ2lzdGVyIGludCByZWdudW07CQkJCQkJIFwgKi8KKy8qIE9CU09MRVRFICAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgZnNyOwkJCQkJIFwgKi8KKy8qIE9CU09MRVRFICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOwkJCQkJIFwgKi8KKy8qIE9CU09MRVRFICAgZnAgPSBmcmFtZS0+ZnJhbWU7CQkJCQkJIFwgKi8KKy8qIE9CU09MRVRFICAgZ2V0X2ZyYW1lX3NhdmVkX3JlZ3MgKGZyYW1lLCAmZnNyKTsJCQkJIFwgKi8KKy8qIE9CU09MRVRFICAgZm9yIChyZWdudW0gPSBGUF9SRUdOVU0gLSAxOyByZWdudW0gPj0gMDsgcmVnbnVtLS0pCQkgXCAqLworLyogT0JTT0xFVEUgICAgIGlmIChmc3IucmVnc1tyZWdudW1dKQkJCQkJIFwgKi8KKy8qIE9CU09MRVRFICAgICAgIHdyaXRlX3JlZ2lzdGVyIChyZWdudW0sIHJlYWRfbWVtb3J5X2ludGVnZXIgKGZzci5yZWdzW3JlZ251bV0sIDQpKTsgXCAqLworLyogT0JTT0xFVEUgICBpZiAoZnNyLnJlZ3NbUFNfUkVHTlVNXSkJCQkJCSBcICovCisvKiBPQlNPTEVURSAgICAgd3JpdGVfcmVnaXN0ZXIgKFBTX1JFR05VTSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnNyLnJlZ3NbUFNfUkVHTlVNXSwgNCkpOyBcICovCisvKiBPQlNPTEVURSAgIHdyaXRlX3JlZ2lzdGVyIChGUF9SRUdOVU0sIHJlYWRfbWVtb3J5X2ludGVnZXIgKGZwLCA0KSk7CSBcICovCisvKiBPQlNPTEVURSAgIHdyaXRlX3JlZ2lzdGVyIChQQ19SRUdOVU0sIHJlYWRfbWVtb3J5X2ludGVnZXIgKGZwICsgNCwgNCkpOyAgIFwgKi8KKy8qIE9CU09MRVRFICAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgZnAgKyA4KTsJCQkJIFwgKi8KKy8qIE9CU09MRVRFICAgZmx1c2hfY2FjaGVkX2ZyYW1lcyAoKTsJCQkJCSBcICovCisvKiBPQlNPTEVURSB9ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIFRoaXMgc2VxdWVuY2Ugb2Ygd29yZHMgaXMgdGhlIGluc3RydWN0aW9uczogKi8KKy8qIE9CU09MRVRFICAgICAgaGFsdCAqLworLyogT0JTT0xFVEUgICAgICBoYWx0ICovCisvKiBPQlNPTEVURSAgICAgIGhhbHQgKi8KKy8qIE9CU09MRVRFICAgICAgaGFsdCAqLworLyogT0JTT0xFVEUgICAgICBzdWFicgliMiwgIzxzdGFja3NpemU+ICovCisvKiBPQlNPTEVURSAgICAgIGx3YnIJYjYsICNjb24gKi8KKy8qIE9CU09MRVRFICAgICAgc3R3CXIxLCA4KGIyKQktIHNhdmUgY2FsbGVyIGFkZHJlc3MsIGRvIHdlIGNhcmU/ICovCisvKiBPQlNPTEVURSAgICAgIGx3CQlyMiwgNjAoYjIpCS0gYXJnMSAqLworLyogT0JTT0xFVEUgICAgICBsYWJyCWIzLCA1MChiMikgKi8KKy8qIE9CU09MRVRFICAgICAgc3RkCXI0LCAzMChiMikJLSBzYXZlIHI0LXI3ICovCisvKiBPQlNPTEVURSAgICAgIHN0ZAlyNiwgMzgoYjIpICovCisvKiBPQlNPTEVURSAgICAgIGx3YnIJYjEsICM8ZnVuYz4JLSBsb2FkIGZ1bmN0aW9uIGNhbGwgYWRkcmVzcyAqLworLyogT0JTT0xFVEUgICAgICBicmxuawlyMSwgOChiMSkJLSBjYWxsIGZ1bmN0aW9uICovCisvKiBPQlNPTEVURSAgICAgIGhhbHQgKi8KKy8qIE9CU09MRVRFICAgICAgaGFsdCAqLworLyogT0JTT0xFVEUgICAgICBsZAkJcjQsIDMwKGIyKQktIHJlc3RvcmUgcjQtcjcgKi8KKy8qIE9CU09MRVRFICAgICAgbGQJCXI2LCAzOChiMikgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgICAgU2V0dXAgb3VyIHN0YWNrIGZyYW1lLCBsb2FkIGFyZ3VtZW10cywgY2FsbCBhbmQgdGhlbiByZXN0b3JlIHJlZ2lzdGVycy4gKi8KKy8qIE9CU09MRVRFICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBGSVhNRTogIFRoZSBiZWxvdyBkZWZpbmVzIGFuIG02OGsgQ0FMTF9EVU1NWSwgd2hpY2ggbG9va3Mgbm90aGluZyBsaWtlIHdoYXQgKi8KKy8qIE9CU09MRVRFICAgIGlzIGRvY3VtZW50ZWQgYWJvdmUuICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIENBTExfRFVNTVkgezB4ZjIyN2UwZmYsIDB4NDhlN2ZmZmMsIDB4NDI2NzQyZTcsIDB4NGViOTMyMzIsIDB4MzIzMmRmZmMsIDB4Njk2OTY5NjksIDB4NGU0ZjRlNzF9ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgQ0FMTF9EVU1NWV9MRU5HVEggMjggKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgI2RlZmluZSBDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCAxMiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBJbnNlcnQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYXJncyBhbmQgZnVuY3Rpb24gYWRkcmVzcyAqLworLyogT0JTT0xFVEUgICAgaW50byBhIGNhbGwgc2VxdWVuY2Ugb2YgdGhlIGFib3ZlIGZvcm0gc3RvcmVkIGF0IERVTU1ZTkFNRS4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEZJWF9DQUxMX0RVTU1ZKGR1bW15bmFtZSwgcGMsIGZ1biwgbmFyZ3MsIGFyZ3MsIHR5cGUsIGdjY19wKSAgICAgXCAqLworLyogT0JTT0xFVEUgeyAqKGludCAqKSgoY2hhciAqKSBkdW1teW5hbWUgKyAyMCkgPSBuYXJncyAqIDQ7ICBcICovCisvKiBPQlNPTEVURSAgICooaW50ICopKChjaGFyICopIGR1bW15bmFtZSArIDE0KSA9IGZ1bjsgfSAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9nb3VsZC94bS1ucDEuaCBiL2dkYi9jb25maWcvZ291bGQveG0tbnAxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiYzQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvZ291bGQveG0tbnAxLmgKQEAgLTAsMCArMSw5NCBAQAorLyogT0JTT0xFVEUgLyogUGFyYW1ldGVycyBmb3IgZXhlY3V0aW9uIG9uIGEgR291bGQgTlAxLCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLiAqLworLyogT0JTT0xFVEUgICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgKi8KKy8qIE9CU09MRVRFIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICovCisvKiBPQlNPTEVURSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAqLworLyogT0JTT0xFVEUgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICovCisvKiBPQlNPTEVURSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAqLworLyogT0JTT0xFVEUgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAqLworLyogT0JTT0xFVEUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKi8KKy8qIE9CU09MRVRFIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICovCisvKiBPQlNPTEVURSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKngvICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgSE9TVF9CWVRFX09SREVSIEJJR19FTkRJQU4gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogQWRkcmVzcyBvZiBVIGluIGtlcm5lbCBzcGFjZSAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUJS0VSTkVMX1VfQUREUgkJMHg3ZmZmYzAwMCAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBUaGlzIGlzIGEgcGllY2Ugb2YgbWFnaWMgdGhhdCBpcyBnaXZlbiBhIHJlZ2lzdGVyIG51bWJlciBSRUdOTyAqLworLyogT0JTT0xFVEUgICAgYW5kIGFzIEJMT0NLRU5EIHRoZSBhZGRyZXNzIGluIHRoZSBzeXN0ZW0gb2YgdGhlIGVuZCBvZiB0aGUgdXNlciBzdHJ1Y3R1cmUgKi8KKy8qIE9CU09MRVRFICAgIGFuZCBzdG9yZXMgaW4gQUREUiB0aGUgYWRkcmVzcyBpbiB0aGUga2VybmVsIG9yIGNvcmUgZHVtcCAqLworLyogT0JTT0xFVEUgICAgb2YgdGhhdCByZWdpc3Rlci4gKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFJFR0lTVEVSX1VfQUREUihhZGRyLCBibG9ja2VuZCwgcmVnbm8pIHsJCQlcICovCisvKiBPQlNPTEVURSAJYWRkciA9IGJsb2NrZW5kICsgcmVnbm8gKiA0OwkJCQkJXCAqLworLyogT0JTT0xFVEUgCWlmIChyZWdubyA9PSBWRV9SRUdOVU0pIGFkZHIgPSBibG9ja2VuZCAtIDkgKiA0OwkJXCAqLworLyogT0JTT0xFVEUgCWlmIChyZWdubyA9PSBQQ19SRUdOVU0pIGFkZHIgPSBibG9ja2VuZCAtIDggKiA0OwkJXCAqLworLyogT0JTT0xFVEUgCWlmIChyZWdubyA9PSBQU19SRUdOVU0pIGFkZHIgPSBibG9ja2VuZCAtIDcgKiA0OwkJXCAqLworLyogT0JTT0xFVEUgCWlmIChyZWdubyA9PSBGUF9SRUdOVU0pIGFkZHIgPSBibG9ja2VuZCAtIDYgKiA0OwkJXCAqLworLyogT0JTT0xFVEUgCWlmIChyZWdubyA+PSBWMV9SRUdOVU0pIAkJCQkJXCAqLworLyogT0JTT0xFVEUgCSAgICBhZGRyID0gYmxvY2tlbmQgKyAxNiAqIDQgKyAocmVnbm8gLSBWMV9SRUdOVU0pICogVlJfU0laRTsJXCAqLworLyogT0JTT0xFVEUgfSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBEb24ndCB0cnkgdG8gd3JpdGUgdGhlIGZyYW1lIHBvaW50ZXIuICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgQ0FOTk9UX1NUT1JFX1JFR0lTVEVSKHJlZ25vKSAoKHJlZ25vKSA9PSBGUF9SRUdOVU0pICovCisvKiBPQlNPTEVURSAMICovCisvKiBPQlNPTEVURSAvKiAqLworLyogT0JTT0xFVEUgICogTm8gS0RCIHN1cHBvcnQsIFlldCEgKngvICovCisvKiBPQlNPTEVURSAvKiBJbnRlcmZhY2UgZGVmaW5pdGlvbnMgZm9yIGtlcm5lbCBkZWJ1Z2dlciBLREIuICAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogTWFwIG1hY2hpbmUgZmF1bHQgY29kZXMgaW50byBzaWduYWwgbnVtYmVycy4gKi8KKy8qIE9CU09MRVRFICAgIEZpcnN0IHN1YnRyYWN0IDAsIGRpdmlkZSBieSA0LCB0aGVuIGluZGV4IGluIGEgdGFibGUuICovCisvKiBPQlNPTEVURSAgICBGYXVsdHMgZm9yIHdoaWNoIHRoZSBlbnRyeSBpbiB0aGlzIHRhYmxlIGlzIDAgKi8KKy8qIE9CU09MRVRFICAgIGFyZSBub3QgaGFuZGxlZCBieSBLREI7IHRoZSBwcm9ncmFtJ3Mgb3duIHRyYXAgaGFuZGxlciAqLworLyogT0JTT0xFVEUgICAgZ2V0cyB0byBoYW5kbGUgdGhlbi4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEZBVUxUX0NPREVfT1JJR0lOIDAgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgRkFVTFRfQ09ERV9VTklUUyA0ICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEZBVUxUX1RBQkxFICAgIFwgKi8KKy8qIE9CU09MRVRFIHsgMCwgMCwgMCwgMCwgU0lHVFJBUCwgMCwgMCwgMCwgXCAqLworLyogT0JTT0xFVEUgICAwLCBTSUdUUkFQLCAwLCAwLCAwLCAwLCAwLCBTSUdLSUxMLCBcICovCisvKiBPQlNPTEVURSAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFwgKi8KKy8qIE9CU09MRVRFICAgU0lHSUxMIH0gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogU3RhcnQgcnVubmluZyB3aXRoIGEgc3RhY2sgc3RyZXRjaGluZyBmcm9tIEJFRyB0byBFTkQuICovCisvKiBPQlNPTEVURSAgICBCRUcgYW5kIEVORCBzaG91bGQgYmUgc3ltYm9scyBtZWFuaW5nZnVsIHRvIHRoZSBhc3NlbWJsZXIuICovCisvKiBPQlNPTEVURSAgICBUaGlzIGlzIHVzZWQgb25seSBmb3Iga2RiLiAgKngvICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgSU5JVF9TVEFDSyhiZWcsIGVuZCkgIFwgKi8KKy8qIE9CU09MRVRFIHsgYXNtICgiLmdsb2JsIGVuZCIpOyAgICAgICAgIFwgKi8KKy8qIE9CU09MRVRFICAgYXNtICgibW92ZWwgJCBlbmQsIHNwIik7ICAgICAgXCAqLworLyogT0JTT0xFVEUgICBhc20gKCJjbHJsIGZwIik7IH0gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogUHVzaCB0aGUgZnJhbWUgcG9pbnRlciByZWdpc3RlciBvbiB0aGUgc3RhY2suICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUFVTSF9GUkFNRV9QVFIgICAgICAgIFwgKi8KKy8qIE9CU09MRVRFICAgYXNtICgibW92ZWwgZnAsIC0oc3ApIik7ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIENvcHkgdGhlIHRvcC1vZi1zdGFjayB0byB0aGUgZnJhbWUgcG9pbnRlciByZWdpc3Rlci4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBQT1BfRlJBTUVfUFRSICBcICovCisvKiBPQlNPTEVURSAgIGFzbSAoIm1vdmwgKHNwKSwgZnAiKTsgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogQWZ0ZXIgS0RCIGlzIGVudGVyZWQgYnkgYSBmYXVsdCwgcHVzaCBhbGwgcmVnaXN0ZXJzICovCisvKiBPQlNPTEVURSAgICB0aGF0IEdEQiB0aGlua3MgYWJvdXQgKGFsbCBOVU1fUkVHUyBvZiB0aGVtKSwgKi8KKy8qIE9CU09MRVRFICAgIHNvIHRoYXQgdGhleSBhcHBlYXIgaW4gb3JkZXIgb2YgYXNjZW5kaW5nIEdEQiByZWdpc3RlciBudW1iZXIuICovCisvKiBPQlNPTEVURSAgICBUaGUgZmF1bHQgY29kZSB3aWxsIGJlIG9uIHRoZSBzdGFjayBiZXlvbmQgdGhlIGxhc3QgcmVnaXN0ZXIuICAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgI2RlZmluZSBQVVNIX1JFR0lTVEVSUyAgICAgICAgXCAqLworLyogT0JTT0xFVEUgeyBhc20gKCJjbHJ3IC0oc3ApIik7CSAgICAgIFwgKi8KKy8qIE9CU09MRVRFICAgYXNtICgicGVhIDEwKHNwKSIpOwkgICAgICBcICovCisvKiBPQlNPTEVURSAgIGFzbSAoIm1vdmVtICQgMHhmZmZlLC0oc3ApIik7IH0gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogQXNzdW1pbmcgdGhlIHJlZ2lzdGVycyAoaW5jbHVkaW5nIHByb2Nlc3NvciBzdGF0dXMpIGhhdmUgYmVlbiAqLworLyogT0JTT0xFVEUgICAgcHVzaGVkIG9uIHRoZSBzdGFjayBpbiBvcmRlciBvZiBhc2NlbmRpbmcgR0RCIHJlZ2lzdGVyIG51bWJlciwgKi8KKy8qIE9CU09MRVRFICAgIHJlc3RvcmUgdGhlbSBhbmQgcmV0dXJuIHRvIHRoZSBhZGRyZXNzIGluIHRoZSBzYXZlZCBQQyByZWdpc3Rlci4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFBPUF9SRUdJU1RFUlMgICAgICAgICAgXCAqLworLyogT0JTT0xFVEUgeyBhc20gKCJzdWJpbCAkOCwyOChzcCkiKTsgICAgIFwgKi8KKy8qIE9CU09MRVRFICAgYXNtICgibW92ZW0gKHNwKSwkIDB4ZmZmZiIpOyBcICovCisvKiBPQlNPTEVURSAgIGFzbSAoInJ0ZSIpOyB9ICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2dvdWxkL3htLXBuLmggYi9nZGIvY29uZmlnL2dvdWxkL3htLXBuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU0MGNmYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvZ291bGQveG0tcG4uaApAQCAtMCwwICsxLDg3IEBACisvKiBPQlNPTEVURSAvKiBQYXJhbWV0ZXJzIGZvciBleGVjdXRpb24gb24gYSBHb3VsZCBQTiwgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4gKi8KKy8qIE9CU09MRVRFICAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAqLworLyogT0JTT0xFVEUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgKi8KKy8qIE9CU09MRVRFIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICovCisvKiBPQlNPTEVURSAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgKi8KKy8qIE9CU09MRVRFIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICovCisvKiBPQlNPTEVURSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICovCisvKiBPQlNPTEVURSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAqLworLyogT0JTT0xFVEUgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgKi8KKy8qIE9CU09MRVRFIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgQklHX0VORElBTiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBBZGRyZXNzIG9mIFUgaW4ga2VybmVsIHNwYWNlICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZQlLRVJORUxfVV9BRERSCQkweDNmYzAwMCAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBUaGlzIGlzIGEgcGllY2Ugb2YgbWFnaWMgdGhhdCBpcyBnaXZlbiBhIHJlZ2lzdGVyIG51bWJlciBSRUdOTyAqLworLyogT0JTT0xFVEUgICAgYW5kIGFzIEJMT0NLRU5EIHRoZSBhZGRyZXNzIGluIHRoZSBzeXN0ZW0gb2YgdGhlIGVuZCBvZiB0aGUgdXNlciBzdHJ1Y3R1cmUgKi8KKy8qIE9CU09MRVRFICAgIGFuZCBzdG9yZXMgaW4gQUREUiB0aGUgYWRkcmVzcyBpbiB0aGUga2VybmVsIG9yIGNvcmUgZHVtcCAqLworLyogT0JTT0xFVEUgICAgb2YgdGhhdCByZWdpc3Rlci4gKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFJFR0lTVEVSX1VfQUREUihhZGRyLCBibG9ja2VuZCwgcmVnbm8pIHsJCQlcICovCisvKiBPQlNPTEVURSAJYWRkciA9IGJsb2NrZW5kICsgcmVnbm8gKiA0OwkJCQkJXCAqLworLyogT0JTT0xFVEUgCWlmIChyZWdubyA9PSBQQ19SRUdOVU0pIGFkZHIgPSBibG9ja2VuZCAtIDggKiA0OwkJXCAqLworLyogT0JTT0xFVEUgCWlmIChyZWdubyA9PSBQU19SRUdOVU0pIGFkZHIgPSBibG9ja2VuZCAtIDcgKiA0OwkJXCAqLworLyogT0JTT0xFVEUgCWlmIChyZWdubyA9PSBTUF9SRUdOVU0pIGFkZHIgPSBibG9ja2VuZCAtIDYgKiA0OwkJXCAqLworLyogT0JTT0xFVEUgfSAqLworLyogT0JTT0xFVEUgDCAqLworLyogT0JTT0xFVEUgLyogTm8gS0RCIHN1cHBvcnQsIFlldCEgKngvICovCisvKiBPQlNPTEVURSAvKiBJbnRlcmZhY2UgZGVmaW5pdGlvbnMgZm9yIGtlcm5lbCBkZWJ1Z2dlciBLREIuICAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogTWFwIG1hY2hpbmUgZmF1bHQgY29kZXMgaW50byBzaWduYWwgbnVtYmVycy4gKi8KKy8qIE9CU09MRVRFICAgIEZpcnN0IHN1YnRyYWN0IDAsIGRpdmlkZSBieSA0LCB0aGVuIGluZGV4IGluIGEgdGFibGUuICovCisvKiBPQlNPTEVURSAgICBGYXVsdHMgZm9yIHdoaWNoIHRoZSBlbnRyeSBpbiB0aGlzIHRhYmxlIGlzIDAgKi8KKy8qIE9CU09MRVRFICAgIGFyZSBub3QgaGFuZGxlZCBieSBLREI7IHRoZSBwcm9ncmFtJ3Mgb3duIHRyYXAgaGFuZGxlciAqLworLyogT0JTT0xFVEUgICAgZ2V0cyB0byBoYW5kbGUgdGhlbi4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEZBVUxUX0NPREVfT1JJR0lOIDAgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgRkFVTFRfQ09ERV9VTklUUyA0ICovCisvKiBPQlNPTEVURSAjZGVmaW5lIEZBVUxUX1RBQkxFICAgIFwgKi8KKy8qIE9CU09MRVRFIHsgMCwgMCwgMCwgMCwgU0lHVFJBUCwgMCwgMCwgMCwgXCAqLworLyogT0JTT0xFVEUgICAwLCBTSUdUUkFQLCAwLCAwLCAwLCAwLCAwLCBTSUdLSUxMLCBcICovCisvKiBPQlNPTEVURSAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFwgKi8KKy8qIE9CU09MRVRFICAgU0lHSUxMIH0gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogU3RhcnQgcnVubmluZyB3aXRoIGEgc3RhY2sgc3RyZXRjaGluZyBmcm9tIEJFRyB0byBFTkQuICovCisvKiBPQlNPTEVURSAgICBCRUcgYW5kIEVORCBzaG91bGQgYmUgc3ltYm9scyBtZWFuaW5nZnVsIHRvIHRoZSBhc3NlbWJsZXIuICovCisvKiBPQlNPTEVURSAgICBUaGlzIGlzIHVzZWQgb25seSBmb3Iga2RiLiAgKngvICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgSU5JVF9TVEFDSyhiZWcsIGVuZCkgIFwgKi8KKy8qIE9CU09MRVRFIHsgYXNtICgiLmdsb2JsIGVuZCIpOyAgICAgICAgIFwgKi8KKy8qIE9CU09MRVRFICAgYXNtICgibW92ZWwgJCBlbmQsIHNwIik7ICAgICAgXCAqLworLyogT0JTT0xFVEUgICBhc20gKCJjbHJsIGZwIik7IH0gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogUHVzaCB0aGUgZnJhbWUgcG9pbnRlciByZWdpc3RlciBvbiB0aGUgc3RhY2suICAqeC8gKi8KKy8qIE9CU09MRVRFICNkZWZpbmUgUFVTSF9GUkFNRV9QVFIgICAgICAgIFwgKi8KKy8qIE9CU09MRVRFICAgYXNtICgibW92ZWwgZnAsIC0oc3ApIik7ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIENvcHkgdGhlIHRvcC1vZi1zdGFjayB0byB0aGUgZnJhbWUgcG9pbnRlciByZWdpc3Rlci4gICp4LyAqLworLyogT0JTT0xFVEUgI2RlZmluZSBQT1BfRlJBTUVfUFRSICBcICovCisvKiBPQlNPTEVURSAgIGFzbSAoIm1vdmwgKHNwKSwgZnAiKTsgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogQWZ0ZXIgS0RCIGlzIGVudGVyZWQgYnkgYSBmYXVsdCwgcHVzaCBhbGwgcmVnaXN0ZXJzICovCisvKiBPQlNPTEVURSAgICB0aGF0IEdEQiB0aGlua3MgYWJvdXQgKGFsbCBOVU1fUkVHUyBvZiB0aGVtKSwgKi8KKy8qIE9CU09MRVRFICAgIHNvIHRoYXQgdGhleSBhcHBlYXIgaW4gb3JkZXIgb2YgYXNjZW5kaW5nIEdEQiByZWdpc3RlciBudW1iZXIuICovCisvKiBPQlNPTEVURSAgICBUaGUgZmF1bHQgY29kZSB3aWxsIGJlIG9uIHRoZSBzdGFjayBiZXlvbmQgdGhlIGxhc3QgcmVnaXN0ZXIuICAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgI2RlZmluZSBQVVNIX1JFR0lTVEVSUyAgICAgICAgXCAqLworLyogT0JTT0xFVEUgeyBhc20gKCJjbHJ3IC0oc3ApIik7CSAgICAgIFwgKi8KKy8qIE9CU09MRVRFICAgYXNtICgicGVhIDEwKHNwKSIpOwkgICAgICBcICovCisvKiBPQlNPTEVURSAgIGFzbSAoIm1vdmVtICQgMHhmZmZlLC0oc3ApIik7IH0gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogQXNzdW1pbmcgdGhlIHJlZ2lzdGVycyAoaW5jbHVkaW5nIHByb2Nlc3NvciBzdGF0dXMpIGhhdmUgYmVlbiAqLworLyogT0JTT0xFVEUgICAgcHVzaGVkIG9uIHRoZSBzdGFjayBpbiBvcmRlciBvZiBhc2NlbmRpbmcgR0RCIHJlZ2lzdGVyIG51bWJlciwgKi8KKy8qIE9CU09MRVRFICAgIHJlc3RvcmUgdGhlbSBhbmQgcmV0dXJuIHRvIHRoZSBhZGRyZXNzIGluIHRoZSBzYXZlZCBQQyByZWdpc3Rlci4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjZGVmaW5lIFBPUF9SRUdJU1RFUlMgICAgICAgICAgXCAqLworLyogT0JTT0xFVEUgeyBhc20gKCJzdWJpbCAkOCwyOChzcCkiKTsgICAgIFwgKi8KKy8qIE9CU09MRVRFICAgYXNtICgibW92ZW0gKHNwKSwkIDB4ZmZmZiIpOyBcICovCisvKiBPQlNPTEVURSAgIGFzbSAoInJ0ZSIpOyB9ICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2g4MzAwL2g4MzAwLm10IGIvZ2RiL2NvbmZpZy9oODMwMC9oODMwMC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmUyNWFiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9oODMwMC9oODMwMC5tdApAQCAtMCwwICsxLDYgQEAKKyMgVGFyZ2V0OiBIODMwMCB3aXRoIEhNUyBtb25pdG9yLCBFNzAwMCBJQ0UgYW5kIEg4IHNpbXVsYXRvcgorVERFUEZJTEVTPSBoODMwMC10ZGVwLm8gcmVtb3RlLWU3MDAwLm8gc2VyLWU3a3BjLm8gbW9uaXRvci5vIHJlbW90ZS1obXMubyBkc3JlYy5vCitUTV9GSUxFPSB0bS1oODMwMC5oCisKK1NJTV9PQlMgPSByZW1vdGUtc2ltLm8KK1NJTSA9IC4uL3NpbS9oODMwMC9saWJzaW0uYQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9oODMwMC90bS1oODMwMC5oIGIvZ2RiL2NvbmZpZy9oODMwMC90bS1oODMwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOThkMmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2g4MzAwL3RtLWg4MzAwLmgKQEAgLTAsMCArMSwzMDMgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIGV4ZWN1dGlvbiBvbiBhIEg4LzMwMCBzZXJpZXMgbWFjaGluZS4KKyAgIENvcHlyaWdodCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHNhY0BjeWdudXMuY29tICovCisKKyNpZmRlZiBfX1NURENfXworc3RydWN0IGZyYW1lX2luZm87CitzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVnczsKK3N0cnVjdCB2YWx1ZTsKK3N0cnVjdCB0eXBlOworI2VuZGlmCisKKy8qIDEgaWYgZGVidWdnaW5nIEg4LzMwMEggYXBwbGljYXRpb24gKi8KK2V4dGVybiBpbnQgaDgzMDBobW9kZTsKK2V4dGVybiBpbnQgaDgzMDBzbW9kZTsKKworLyogTnVtYmVyIG9mIGJ5dGVzIGluIGEgd29yZCAqLworCisjZGVmaW5lIEJJTldPUkQgKGg4MzAwaG1vZGU/NDoyKQorCisjZGVmaW5lIEVYVFJBX0ZSQU1FX0lORk8gCVwKKwlzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqZnNyOwlcCisJQ09SRV9BRERSIGZyb21fcGM7IFwKKwlDT1JFX0FERFIgYXJnc19wb2ludGVyO1wKKyAgICAgICAgQ09SRV9BRERSIGxvY2Fsc19wb2ludGVyIDsKKworLyogWmVybyB0aGUgZnJhbWVfc2F2ZWRfcmVncyBwb2ludGVyIHdoZW4gdGhlIGZyYW1lIGlzIGluaXRpYWxpemVkLAorICAgc28gdGhhdCBGUkFNRV9GSU5EX1NBVkVEX1JFR1MgKCkgd2lsbCBrbm93IHRvIGFsbG9jYXRlIGFuZAorICAgaW5pdGlhbGl6ZSBhIGZyYW1lX3NhdmVkX3JlZ3Mgc3RydWN0IHRoZSBmaXJzdCB0aW1lIGl0IGlzIGNhbGxlZC4KKyAgIFNldCB0aGUgYXJnX3BvaW50ZXIgdG8gLTEsIHdoaWNoIGlzIG5vdCB2YWxpZDsgMCBhbmQgb3RoZXIgdmFsdWVzCisgICBpbmRpY2F0ZSByZWFsLCBjYWNoZWQgdmFsdWVzLiAgKi8KKworI2RlZmluZSBJTklUX0VYVFJBX0ZSQU1FX0lORk8oZnJvbWxlYWYsIGZpKSBcCisJaDgzMDBfaW5pdF9leHRyYV9mcmFtZV9pbmZvIChmcm9tbGVhZiwgZmkpCisKK2V4dGVybiB2b2lkIGg4MzAwX2luaXRfZXh0cmFfZnJhbWVfaW5mbyAoKTsKKworI2RlZmluZSBJRUVFX0ZMT0FUCisvKiBEZWZpbmUgdGhlIGJpdCwgYnl0ZSwgYW5kIHdvcmQgb3JkZXJpbmcgb2YgdGhlIG1hY2hpbmUuICAqLworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUiBCSUdfRU5ESUFOCisjdW5kZWYgVEFSR0VUX0lOVF9CSVQKKyNkZWZpbmUgVEFSR0VUX0lOVF9CSVQgIDE2CisjdW5kZWYgVEFSR0VUX0xPTkdfQklUCisjZGVmaW5lIFRBUkdFVF9MT05HX0JJVCAgMzIKKyN1bmRlZiBUQVJHRVRfUFRSX0JJVAorI2RlZmluZSBUQVJHRVRfUFRSX0JJVCAgKGg4MzAwaG1vZGUgPyAzMjoxNikKKworLyogT2Zmc2V0IGZyb20gYWRkcmVzcyBvZiBmdW5jdGlvbiB0byBzdGFydCBvZiBpdHMgY29kZS4KKyAgIFplcm8gb24gbW9zdCBtYWNoaW5lcy4gICovCisKKyNkZWZpbmUgRlVOQ1RJT05fU1RBUlRfT0ZGU0VUIDAKKworLyogQWR2YW5jZSBQQyBhY3Jvc3MgYW55IGZ1bmN0aW9uIGVudHJ5IHByb2xvZ3VlIGluc3RydWN0aW9ucworICAgdG8gcmVhY2ggc29tZSAicmVhbCIgY29kZS4gICovCisKKyNkZWZpbmUgU0tJUF9QUk9MT0dVRShpcCkgICB7KGlwKSA9IGg4MzAwX3NraXBfcHJvbG9ndWUoaXApO30KK2V4dGVybiBDT1JFX0FERFIgaDgzMDBfc2tpcF9wcm9sb2d1ZSAoKTsKKworLyogSW1tZWRpYXRlbHkgYWZ0ZXIgYSBmdW5jdGlvbiBjYWxsLCByZXR1cm4gdGhlIHNhdmVkIHBjLgorICAgQ2FuJ3QgYWx3YXlzIGdvIHRocm91Z2ggdGhlIGZyYW1lcyBmb3IgdGhpcyBiZWNhdXNlIG9uIHNvbWUgbWFjaGluZXMKKyAgIHRoZSBuZXcgZnJhbWUgaXMgbm90IHNldCB1cCB1bnRpbCB0aGUgbmV3IGZ1bmN0aW9uIGV4ZWN1dGVzCisgICBzb21lIGluc3RydWN0aW9ucy4gICovCisKKyNkZWZpbmUgU0FWRURfUENfQUZURVJfQ0FMTChmcmFtZSkgXAorICByZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyIChyZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pLCBCSU5XT1JEKQorCisvKiBTdGFjayBncm93cyBkb3dud2FyZC4gICovCisKKyNkZWZpbmUgSU5ORVJfVEhBTihsaHMscmhzKSAoKGxocykgPCAocmhzKSkKKworLyojZGVmaW5lIEJSRUFLUE9JTlQgezB4N0EsIDB4RkZ9Ki8KKyNkZWZpbmUgQlJFQUtQT0lOVCB7MHgwMSwgMHg4MH0gIC8qIFNsZWVwICovCisjZGVmaW5lIFJFTU9URV9CUkVBS1BPSU5UIHsgMHg1NywgMHgzMH0gIC8qIHRyYXBhICMzICovCisvKiBJZiB5b3VyIGtlcm5lbCByZXNldHMgdGhlIHBjIGFmdGVyIHRoZSB0cmFwIGhhcHBlbnMgeW91IG1heSBuZWVkIHRvCisgICBkZWZpbmUgdGhpcyBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZS4gICAgKi8KKworI2RlZmluZSBERUNSX1BDX0FGVEVSX0JSRUFLIDAKKworLyogU2F5IGhvdyBsb25nIHJlZ2lzdGVycyBhcmUuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1NJWkUgNAorCisjZGVmaW5lIE5VTV9SRUdTIDEzICAKKworI2RlZmluZSBSRUdJU1RFUl9CWVRFUyAoTlVNX1JFR1MgKiA0KQorCisvKiBJbmRleCB3aXRoaW4gYHJlZ2lzdGVycycgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNwYWNlIGZvcgorICAgcmVnaXN0ZXIgTi4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfQllURShOKSAgKChOKSAqIDQpCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBhY3R1YWwgbWFjaGluZSByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICBPbiB0aGUgSDgvMzAwLCBhbGwgcmVncyBhcmUgMiBieXRlcy4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfUkFXX1NJWkUoTikgKGg4MzAwaG1vZGUgPyA0IDogMikKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIHByb2dyYW0ncyByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfU0laRShOKSAoaDgzMDBobW9kZSA/IDQgOiAyKQorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1JBV19TSVpFIGNhbiBoYXZlLiAgKi8KKworI2RlZmluZSBNQVhfUkVHSVNURVJfUkFXX1NJWkUgNAorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1ZJUlRVQUxfU0laRSBjYW4gaGF2ZS4gICovCisKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1ZJUlRVQUxfU0laRSA0CisKKy8qIFJldHVybiB0aGUgR0RCIHR5cGUgb2JqZWN0IGZvciB0aGUgInN0YW5kYXJkIiBkYXRhIHR5cGUKKyAgIG9mIGRhdGEgaW4gcmVnaXN0ZXIgTi4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9UWVBFKE4pIFwKKyhoODMwMGhtb2RlID8gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmcgOiBidWlsdGluX3R5cGVfdW5zaWduZWRfc2hvcnQpCisKKy8qIEluaXRpYWxpemVyIGZvciBhbiBhcnJheSBvZiBuYW1lcyBvZiByZWdpc3RlcnMuCisgICBFbnRyaWVzIGJleW9uZCB0aGUgZmlyc3QgTlVNX1JFR1MgYXJlIGlnbm9yZWQuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX05BTUVTIFwKKyAgeyJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJzcCIsICJjY3IiLCJwYyIsImN5Y2xlcyIsInRpY2siLCJpbnN0In0KKworLyogQW4gYXJyYXkgb2YgbmFtZXMgb2YgcmVnaXN0ZXJzLiAqLworCitleHRlcm4gY2hhciAqKmg4MzAwX3JlZ2lzdGVyX25hbWVzOworI2RlZmluZSBSRUdJU1RFUl9OQU1FKGkpIGg4MzAwX3JlZ2lzdGVyX25hbWVzW2ldCisKKy8qIFJlZ2lzdGVyIG51bWJlcnMgb2YgdmFyaW91cyBpbXBvcnRhbnQgcmVnaXN0ZXJzLgorICAgTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2UgdmFsdWVzIGFyZSAicmVhbCIgcmVnaXN0ZXIgbnVtYmVycywKKyAgIGFuZCBjb3JyZXNwb25kIHRvIHRoZSBnZW5lcmFsIHJlZ2lzdGVycyBvZiB0aGUgbWFjaGluZSwKKyAgIGFuZCBzb21lIGFyZSAicGhvbnkiIHJlZ2lzdGVyIG51bWJlcnMgd2hpY2ggYXJlIHRvbyBsYXJnZQorICAgdG8gYmUgYWN0dWFsIHJlZ2lzdGVyIG51bWJlcnMgYXMgZmFyIGFzIHRoZSB1c2VyIGlzIGNvbmNlcm5lZAorICAgYnV0IGRvIHNlcnZlIHRvIGdldCB0aGUgZGVzaXJlZCB2YWx1ZXMgd2hlbiBwYXNzZWQgdG8gcmVhZF9yZWdpc3Rlci4gICovCisKKyNkZWZpbmUgQVJHMF9SRUdOVU0gICAgMAkvKiBmaXJzdCByZWcgaW4gd2hpY2ggYW4gYXJnIG1heSBiZSBwYXNzZWQgKi8KKyNkZWZpbmUgQVJHTEFTVF9SRUdOVU0gMgkvKiBsYXN0ICByZWcgaW4gd2hpY2ggYW4gYXJnIG1heSBiZSBwYXNzZWQgKi8KKyNkZWZpbmUgRlBfUkVHTlVNICAgICAgNgkvKiBDb250YWluIHNhZGRyZXNzIG9mIGV4ZWN1dGluZyBzdGFjayBmcmFtZSAqLworI2RlZmluZSBTUF9SRUdOVU0gICAgICA3CS8qIENvbnRhaW5zIGFkZHJlc3Mgb2YgdG9wIG9mIHN0YWNrICovCisjZGVmaW5lIENDUl9SRUdOVU0gICAgIDgJLyogQ29udGFpbnMgcHJvY2Vzc29yIHN0YXR1cyAqLworI2RlZmluZSBQQ19SRUdOVU0gICAgICA5CS8qIENvbnRhaW5zIHByb2dyYW0gY291bnRlciAqLworCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwgZm9ybWF0LAorICAgaW50byBWQUxCVUYuICAqLworCisvKiBGSVhNRTogV29uJ3Qgd29yayB3aXRoIGJvdGggaDgvMzAwJ3MuICAqLworCitleHRlcm4gdm9pZCBoODMwMF9leHRyYWN0X3JldHVybl92YWx1ZSBQQVJBTVMoKHN0cnVjdCB0eXBlICosIGNoYXIgKiwgY2hhciAqKSk7CisjZGVmaW5lIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKFRZUEUsUkVHQlVGLFZBTEJVRikgXAorICAgIGg4MzAwX2V4dHJhY3RfcmV0dXJuX3ZhbHVlIChUWVBFLCAoY2hhciAqKShSRUdCVUYpLCAoY2hhciAqKShWQUxCVUYpKQorCisvKiBXcml0ZSBpbnRvIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZQorICAgb2YgdHlwZSBUWVBFLCBnaXZlbiBpbiB2aXJ0dWFsIGZvcm1hdC4gIEFzc3VtZXMgZmxvYXRzIGFyZSBwYXNzZWQKKyAgIGluIGQwL2QxLiAgKi8KKy8qIEZJWE1FOiBXb24ndCB3b3JrIHdpdGggYm90aCBoOC8zMDAncy4gICovCisKK2V4dGVybiB2b2lkIGg4MzAwX3N0b3JlX3JldHVybl92YWx1ZSBQQVJBTVMoKHN0cnVjdCB0eXBlICosIGNoYXIgKikpOworI2RlZmluZSBTVE9SRV9SRVRVUk5fVkFMVUUoVFlQRSxWQUxCVUYpIFwKKyAgICBoODMwMF9zdG9yZV9yZXR1cm5fdmFsdWUoVFlQRSwgKGNoYXIgKikgKFZBTEJVRikpCisKKy8qIHN0cnVjdCBwYXNzaW5nIGFuZCByZXR1cm5pbmcgc3R1ZmYgKi8KKyNkZWZpbmUgU1RPUkVfU1RSVUNUX1JFVFVSTihTVFJVQ1RfQUREUiwgU1ApCVwKKwl3cml0ZV9yZWdpc3RlciAoMCwgU1RSVUNUX0FERFIpCisKKyNkZWZpbmUgVVNFX1NUUlVDVF9DT05WRU5USU9OKGdjY19wLCB0eXBlKQkoMSkKKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgdGhlIGFkZHJlc3MgaW4gd2hpY2ggYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGl0cyBzdHJ1Y3R1cmUgdmFsdWUsCisgICBhcyBhIENPUkVfQUREUiAob3IgYW4gZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIG9uZSkuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MoUkVHQlVGKSBcCisgICAgIGV4dHJhY3RfYWRkcmVzcyAoUkVHQlVGICsgUkVHSVNURVJfQllURSAoMCksIFwKKwkJICAgICAgUkVHSVNURVJfUkFXX1NJWkUgKDApKQorICAgICAKKy8qIERlc2NyaWJlIHRoZSBwb2ludGVyIGluIGVhY2ggc3RhY2sgZnJhbWUgdG8gdGhlIHByZXZpb3VzIHN0YWNrIGZyYW1lCisgICAoaXRzIGNhbGxlcikuICAqLworCisvKiBGUkFNRV9DSEFJTiB0YWtlcyBhIGZyYW1lJ3Mgbm9taW5hbCBhZGRyZXNzCisgICBhbmQgcHJvZHVjZXMgdGhlIGZyYW1lJ3MgY2hhaW4tcG9pbnRlci4KKworICAgSG93ZXZlciwgaWYgRlJBTUVfQ0hBSU5fVkFMSUQgcmV0dXJucyB6ZXJvLAorICAgaXQgbWVhbnMgdGhlIGdpdmVuIGZyYW1lIGlzIHRoZSBvdXRlcm1vc3Qgb25lIGFuZCBoYXMgbm8gY2FsbGVyLiAgKi8KKworI2RlZmluZSBGUkFNRV9DSEFJTihGUkFNRSkgaDgzMDBfZnJhbWVfY2hhaW4oRlJBTUUpCitDT1JFX0FERFIgaDgzMDBfZnJhbWVfY2hhaW4gUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworCisvKiBJbiB0aGUgY2FzZSBvZiB0aGUgSDgvMzAwLCB0aGUgZnJhbWUncyBub21pbmFsIGFkZHJlc3MKKyAgIGlzIHRoZSBhZGRyZXNzIG9mIGEgMi1ieXRlIHdvcmQgY29udGFpbmluZyB0aGUgY2FsbGluZyBmcmFtZSdzIGFkZHJlc3MuICAqLworCisvKiBVc2UgdGhlIGFsdGVybmF0ZSBtZXRob2Qgb2YgYXZvaWRpbmcgcnVubmluZyB1cCBvZmYgdGhlIGVuZCBvZgorICAgdGhlIGZyYW1lIGNoYWluIG9yIGZvbGxvd2luZyBmcmFtZXMgYmFjayBpbnRvIHRoZSBzdGFydHVwIGNvZGUuCisgICBTZWUgdGhlIGNvbW1lbnRzIGluIG9iamZpbGUuaCAqLworCisjZGVmaW5lIEZSQU1FX0NIQUlOX1ZBTElEKGZwLGZpKSBhbHRlcm5hdGVfZnJhbWVfY2hhaW5fdmFsaWQgKGZwLCBmaSkKKworLyogRGVmaW5lIG90aGVyIGFzcGVjdHMgb2YgdGhlIHN0YWNrIGZyYW1lLiAgKi8KKworLyogQSBtYWNybyB0aGF0IHRlbGxzIHVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGludm9jYXRpb24gcmVwcmVzZW50ZWQKKyAgIGJ5IEZJIGRvZXMgbm90IGhhdmUgYSBmcmFtZSBvbiB0aGUgc3RhY2sgYXNzb2NpYXRlZCB3aXRoIGl0LiAgSWYgaXQKKyAgIGRvZXMgbm90LCBGUkFNRUxFU1MgaXMgc2V0IHRvIDEsIGVsc2UgMC4gICovCisjZGVmaW5lIEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OKEZJLCBGUkFNRUxFU1MpIFwKKyAgKEZSQU1FTEVTUykgPSBmcmFtZWxlc3NfbG9va19mb3JfcHJvbG9ndWUoRkkpCisKKy8qIEFueSBmdW5jdGlvbiB3aXRoIGEgZnJhbWUgbG9va3MgbGlrZSB0aGlzCisgICBTRUNPTkQgQVJHCisgICBGSVJTVCBBUkcKKyAgIFJFVCBQQworICAgU0FWRUQgUjIKKyAgIFNBVkVEIFIzCisgICBTQVZFRCBGUCAgIDwtRlAgUE9JTlRTIEhFUkUKKyAgIExPQ0FMUzAKKyAgIExPQ0FMUzEgICAgPC1TUCBQT0lOVFMgSEVSRQorICAgKi8KKworI2RlZmluZSBGUkFNRV9TQVZFRF9QQyhGUkFNRSkgaDgzMDBfZnJhbWVfc2F2ZWRfcGMoRlJBTUUpCisKKyNkZWZpbmUgRlJBTUVfQVJHU19BRERSRVNTKGZpKSBmcmFtZV9hcmdzX2FkZHJlc3MoZmkpCisKKyNkZWZpbmUgRlJBTUVfTE9DQUxTX0FERFJFU1MoZmkpIGZyYW1lX2xvY2Fsc19hZGRyZXNzKGZpKTsKKworLyogU2V0IFZBTCB0byB0aGUgbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvIGZyYW1lIGRlc2NyaWJlZCBieSBGSS4KKyAgIENhbiBzZXQgVkFMIHRvIC0xLCBtZWFuaW5nIG5vIHdheSB0byB0ZWxsLiAgKi8KKworLyogV2UgY2FuJ3QgdGVsbCBob3cgbWFueSBhcmdzIHRoZXJlIGFyZQorICAgbm93IHRoYXQgdGhlIEMgY29tcGlsZXIgZGVsYXlzIHBvcHBpbmcgdGhlbS4gICovCisKKyNkZWZpbmUgRlJBTUVfTlVNX0FSR1ModmFsLGZpKSAodmFsID0gLTEpCisKKy8qIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgYXQgc3RhcnQgb2YgYXJnbGlzdCB0aGF0IGFyZSBub3QgcmVhbGx5IGFyZ3MuICAqLworCisjZGVmaW5lIEZSQU1FX0FSR1NfU0tJUCAwCisKKy8qIFB1dCBoZXJlIHRoZSBjb2RlIHRvIHN0b3JlLCBpbnRvIGEgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MsCisgICB0aGUgYWRkcmVzc2VzIG9mIHRoZSBzYXZlZCByZWdpc3RlcnMgb2YgZnJhbWUgZGVzY3JpYmVkIGJ5IEZSQU1FX0lORk8uCisgICBUaGlzIGluY2x1ZGVzIHNwZWNpYWwgcmVnaXN0ZXJzIHN1Y2ggYXMgcGMgYW5kIGZwIHNhdmVkIGluIHNwZWNpYWwKKyAgIHdheXMgaW4gdGhlIHN0YWNrIGZyYW1lLiAgc3AgaXMgZXZlbiBtb3JlIHNwZWNpYWw6CisgICB0aGUgYWRkcmVzcyB3ZSByZXR1cm4gZm9yIGl0IElTIHRoZSBzcCBmb3IgdGhlIG5leHQgZnJhbWUuICAqLworCisjZGVmaW5lIEZSQU1FX0ZJTkRfU0FWRURfUkVHUyhmcmFtZV9pbmZvLCBmcmFtZV9zYXZlZF9yZWdzKQkgICAgXAorICAgaDgzMDBfZnJhbWVfZmluZF9zYXZlZF9yZWdzKGZyYW1lX2luZm8sICYoZnJhbWVfc2F2ZWRfcmVncykpCisMCisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgSU5TTl9XT1JEOworCisKKyNkZWZpbmUJUFJJTlRfUkVHSVNURVJfSE9PSyhyZWdubykgcHJpbnRfcmVnaXN0ZXJfaG9vayhyZWdubykKKworI2RlZmluZSBHREJfVEFSR0VUX0lTX0g4MzAwCisKKyNkZWZpbmUgTlVNX1JFQUxSRUdTIDEwCisjZGVmaW5lIE5PUCB7IDB4MDEsIDB4ODB9IC8qIEEgc2xlZXAgaW5zbiAqLworCisjZGVmaW5lIEJFTElFVkVfUENDX1BST01PVElPTiAxCisKKy8qCisgKiBDQUxMX0RVTU1ZIHN0dWZmOgorICovCisKKyNkZWZpbmUgVVNFX0dFTkVSSUNfRFVNTVlfRlJBTUVTCisjZGVmaW5lIENBTExfRFVNTVkJCQl7MH0KKyNkZWZpbmUgQ0FMTF9EVU1NWV9MRU5HVEgJCSgwKQorI2RlZmluZSBDQUxMX0RVTU1ZX0FERFJFU1MoKQkJZW50cnlfcG9pbnRfYWRkcmVzcyAoKQorI2RlZmluZSBDQUxMX0RVTU1ZX0xPQ0FUSU9OCQlBVF9FTlRSWV9QT0lOVAorI2RlZmluZSBDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVAkJKDApCisjZGVmaW5lIENBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQJKDApCisKK2V4dGVybiBDT1JFX0FERFIgaDgzMDBfcHVzaF9hcmd1bWVudHMgUEFSQU1TICgoaW50IG5hcmdzLCAKKwkJCQkJICAgICAgIHN0cnVjdCB2YWx1ZSAqKmFyZ3MsIAorCQkJCQkgICAgICAgQ09SRV9BRERSIHNwLAorCQkJCQkgICAgICAgdW5zaWduZWQgY2hhciBzdHJ1Y3RfcmV0dXJuLAorCQkJCQkgICAgICAgQ09SRV9BRERSIHN0cnVjdF9hZGRyKSk7CitleHRlcm4gQ09SRV9BRERSIGg4MzAwX3B1c2hfcmV0dXJuX2FkZHJlc3MgUEFSQU1TICgoQ09SRV9BRERSLCBDT1JFX0FERFIpKTsKKworI2RlZmluZSBQQ19JTl9DQUxMX0RVTU1ZKFBDLCBTUCwgRlApCWdlbmVyaWNfcGNfaW5fY2FsbF9kdW1teSAoUEMsIFNQKQorI2RlZmluZSBGSVhfQ0FMTF9EVU1NWShEVU1NWSwgU1RBUlRfU1AsIEZVTkFERFIsIE5BUkdTLCBBUkdTLCBUWVBFLCBHQ0NQKQorI2RlZmluZSBQVVNIX0FSR1VNRU5UUyhOQVJHUywgQVJHUywgU1AsIFNUUlVDVF9SRVRVUk4sIFNUUlVDVF9BRERSKSBcCisgIChTUCkgPSBoODMwMF9wdXNoX2FyZ3VtZW50cyAoTkFSR1MsIEFSR1MsIFNQLCBTVFJVQ1RfUkVUVVJOLCBTVFJVQ1RfQUREUikKKy8qIFB1c2ggYW4gZW1wdHkgc3RhY2sgZnJhbWUsIHRvIHJlY29yZCB0aGUgY3VycmVudCBQQywgZXRjLiAgKi8KKyNkZWZpbmUgUFVTSF9EVU1NWV9GUkFNRQlnZW5lcmljX3B1c2hfZHVtbXlfZnJhbWUgKCkKKy8qIERpc2NhcmQgZnJvbSB0aGUgc3RhY2sgdGhlIGlubmVybW9zdCBmcmFtZSwgcmVzdG9yaW5nIGFsbCByZWdpc3RlcnMuICAqLworI2RlZmluZSBQT1BfRlJBTUUJCWg4MzAwX3BvcF9mcmFtZSAoKQorI2RlZmluZSBQVVNIX1JFVFVSTl9BRERSRVNTKFBDLCBTUCkJaDgzMDBfcHVzaF9yZXR1cm5fYWRkcmVzcyAoUEMsIFNQKQorCisvKiBvdmVycmlkZSB0aGUgc3RhbmRhcmQgZ2V0X3NhdmVkX3JlZ2lzdGVyIGZ1bmN0aW9uIHdpdGggCisgICBvbmUgdGhhdCB0YWtlcyBhY2NvdW50IG9mIGdlbmVyaWMgQ0FMTF9EVU1NWSBmcmFtZXMgKi8KKyNkZWZpbmUgR0VUX1NBVkVEX1JFR0lTVEVSCisKKwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9oODUwMC9oODUwMC5tdCBiL2dkYi9jb25maWcvaDg1MDAvaDg1MDAubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmNmI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaDg1MDAvaDg1MDAubXQKQEAgLTAsMCArMSw2IEBACisjIFRhcmdldDogSDg1MDAgd2l0aCBITVMgbW9uaXRvciBhbmQgSDggc2ltdWxhdG9yCitUREVQRklMRVM9IGg4NTAwLXRkZXAubyBtb25pdG9yLm8gcmVtb3RlLWhtcy5vIGRzcmVjLm8KK1RNX0ZJTEU9IHRtLWg4NTAwLmgKKworU0lNX09CUyA9IHJlbW90ZS1zaW0ubworU0lNID0gLi4vc2ltL2g4NTAwL2xpYnNpbS5hCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2g4NTAwL3RtLWg4NTAwLmggYi9nZGIvY29uZmlnL2g4NTAwL3RtLWg4NTAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3ZDk2NgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaDg1MDAvdG0taDg1MDAuaApAQCAtMCwwICsxLDI5MyBAQAorLyogUGFyYW1ldGVycyBmb3IgZXhlY3V0aW9uIG9uIGEgSDgvNTAwIHNlcmllcyBtYWNoaW5lLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHNhY0BjeWdudXMuY29tICovCisKKyNkZWZpbmUgR0RCX1RBUkdFVF9JU19IODUwMAorCisjZGVmaW5lIElFRUVfRkxPQVQgMQorCisvKiBEZWZpbmUgdGhlIGJpdCwgYnl0ZSwgYW5kIHdvcmQgb3JkZXJpbmcgb2YgdGhlIG1hY2hpbmUuICAqLworCisjZGVmaW5lIFRBUkdFVF9CWVRFX09SREVSIEJJR19FTkRJQU4KKworLyogRGVmaW5lIHRoZSBzaXplcyBvZiBpbnRlZ2VycyBhbmQgcG9pbnRlcnMuICAqLworCisjZGVmaW5lIFRBUkdFVF9JTlRfQklUIDE2CisKKyNkZWZpbmUgVEFSR0VUX0xPTkdfQklUIDMyCisKKyNkZWZpbmUgVEFSR0VUX1BUUl9CSVQgKG1pbmltdW1fbW9kZSA/IDE2IDogMzIpCisKKy8qIE9mZnNldCBmcm9tIGFkZHJlc3Mgb2YgZnVuY3Rpb24gdG8gc3RhcnQgb2YgaXRzIGNvZGUuCisgICBaZXJvIG9uIG1vc3QgbWFjaGluZXMuICAqLworCisjZGVmaW5lIEZVTkNUSU9OX1NUQVJUX09GRlNFVCAwCisKKy8qIEFkdmFuY2UgUEMgYWNyb3NzIGFueSBmdW5jdGlvbiBlbnRyeSBwcm9sb2d1ZSBpbnN0cnVjdGlvbnMKKyAgIHRvIHJlYWNoIHNvbWUgInJlYWwiIGNvZGUuICAqLworCisjZGVmaW5lIFNLSVBfUFJPTE9HVUUoaXApICAgeyAoaXApID0gaDg1MDBfc2tpcF9wcm9sb2d1ZShpcCk7IH0KK2V4dGVybiBDT1JFX0FERFIgaDg1MDBfc2tpcF9wcm9sb2d1ZSBQQVJBTVMgKChDT1JFX0FERFIpKTsKKworLyogSW1tZWRpYXRlbHkgYWZ0ZXIgYSBmdW5jdGlvbiBjYWxsLCByZXR1cm4gdGhlIHNhdmVkIHBjLgorICAgQ2FuJ3QgYWx3YXlzIGdvIHRocm91Z2ggdGhlIGZyYW1lcyBmb3IgdGhpcyBiZWNhdXNlIG9uIHNvbWUgbWFjaGluZXMKKyAgIHRoZSBuZXcgZnJhbWUgaXMgbm90IHNldCB1cCB1bnRpbCB0aGUgbmV3IGZ1bmN0aW9uIGV4ZWN1dGVzCisgICBzb21lIGluc3RydWN0aW9ucy4gICovCisKKyNkZWZpbmUgU0FWRURfUENfQUZURVJfQ0FMTChmcmFtZSkgc2F2ZWRfcGNfYWZ0ZXJfY2FsbCgpCitleHRlcm4gQ09SRV9BRERSIHNhdmVkX3BjX2FmdGVyX2NhbGwgUEFSQU1TICgodm9pZCkpOworCisvKiBTdGFjayBncm93cyBkb3dud2FyZC4gICovCisKKyNkZWZpbmUgSU5ORVJfVEhBTihsaHMscmhzKSAoKGxocykgPCAocmhzKSkKKworLyogSWxsZWdhbCBpbnN0cnVjdGlvbiAtIHVzZWQgYnkgdGhlIHNpbXVsYXRvciBmb3IgYnJlYWtwb2ludAorICAgZGV0ZWN0aW9uICovCisKKyNkZWZpbmUgQlJFQUtQT0lOVCB7MHgwYn0KKworLyogSWYgeW91ciBrZXJuZWwgcmVzZXRzIHRoZSBwYyBhZnRlciB0aGUgdHJhcCBoYXBwZW5zIHlvdSBtYXkgbmVlZCB0bworICAgZGVmaW5lIHRoaXMgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUuICAqLworCisjZGVmaW5lIERFQ1JfUENfQUZURVJfQlJFQUsgMAorCisvKiBTYXkgaG93IGxvbmcgcmVnaXN0ZXJzIGFyZS4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfVFlQRSAgdW5zaWduZWQgbG9uZworCisvKiBTYXkgaG93IG11Y2ggbWVtb3J5IGlzIG5lZWRlZCB0byBzdG9yZSBhIGNvcHkgb2YgdGhlIHJlZ2lzdGVyIHNldCAqLworCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTICAgIChOVU1fUkVHUyAqIDQpIAorCisvKiBJbmRleCB3aXRoaW4gYHJlZ2lzdGVycycgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNwYWNlIGZvcgorICAgcmVnaXN0ZXIgTi4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfQllURShOKSAgKChOKSo0KQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgYWN0dWFsIG1hY2hpbmUgcmVwcmVzZW50YXRpb24KKyAgIGZvciByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9SQVdfU0laRShOKSBoODUwMF9yZWdpc3Rlcl9zaXplKE4pCitleHRlcm4gaW50IGg4NTAwX3JlZ2lzdGVyX3NpemUgUEFSQU1TICgoaW50IHJlZ25vKSk7CisKKyNkZWZpbmUgUkVHSVNURVJfU0laRSA0CisKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9TSVpFKE4pIGg4NTAwX3JlZ2lzdGVyX3NpemUoTikKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9SQVdfU0laRSBjYW4gaGF2ZS4gICovCisKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1JBV19TSVpFIDQKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUgNAorCisvKiBSZXR1cm4gdGhlIEdEQiB0eXBlIG9iamVjdCBmb3IgdGhlICJzdGFuZGFyZCIgZGF0YSB0eXBlCisgICBvZiBkYXRhIGluIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRShOKSBoODUwMF9yZWdpc3Rlcl92aXJ0dWFsX3R5cGUoTikKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqaDg1MDBfcmVnaXN0ZXJfdmlydHVhbF90eXBlIFBBUkFNUyAoKGludCByZWdubykpOworCisvKiBJbml0aWFsaXplciBmb3IgYW4gYXJyYXkgb2YgbmFtZXMgb2YgcmVnaXN0ZXJzLgorICAgRW50cmllcyBiZXlvbmQgdGhlIGZpcnN0IE5VTV9SRUdTIGFyZSBpZ25vcmVkLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyBcCisgIHsgInIwIiwgInIxIiwgInIyIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwgXAorICAgInByMCIsInByMSIsInByMiIsInByMyIsInByNCIsInByNSIsInByNiIsInByNyIsIFwKKyAgICAiY3AiLCAiZHAiLCAiZXAiLCAidHAiLCAic3IiLCAicGMifQorCisvKiBSZWdpc3RlciBudW1iZXJzIG9mIHZhcmlvdXMgaW1wb3J0YW50IHJlZ2lzdGVycy4gIE5vdGUgdGhhdCBzb21lIG9mCisgICB0aGVzZSB2YWx1ZXMgYXJlICJyZWFsIiByZWdpc3RlciBudW1iZXJzLCBhbmQgY29ycmVzcG9uZCB0byB0aGUKKyAgIGdlbmVyYWwgcmVnaXN0ZXJzIG9mIHRoZSBtYWNoaW5lLCBhbmQgc29tZSBhcmUgInBob255IiByZWdpc3RlcgorICAgbnVtYmVycyB3aGljaCBhcmUgdG9vIGxhcmdlIHRvIGJlIGFjdHVhbCByZWdpc3RlciBudW1iZXJzIGFzIGZhciBhcworICAgdGhlIHVzZXIgaXMgY29uY2VybmVkIGJ1dCBkbyBzZXJ2ZSB0byBnZXQgdGhlIGRlc2lyZWQgdmFsdWVzIHdoZW4KKyAgIHBhc3NlZCB0byByZWFkX3JlZ2lzdGVyLiAgKi8KKworI2RlZmluZSBSMF9SRUdOVU0JMAorI2RlZmluZSBSMV9SRUdOVU0JMQorI2RlZmluZSBSMl9SRUdOVU0JMgorI2RlZmluZSBSM19SRUdOVU0JMworI2RlZmluZSBSNF9SRUdOVU0JNAorI2RlZmluZSBSNV9SRUdOVU0JNQorI2RlZmluZSBSNl9SRUdOVU0JNgorI2RlZmluZSBSN19SRUdOVU0JNworCisjZGVmaW5lIFBSMF9SRUdOVU0JOAorI2RlZmluZSBQUjFfUkVHTlVNCTkKKyNkZWZpbmUgUFIyX1JFR05VTQkxMAorI2RlZmluZSBQUjNfUkVHTlVNCTExCisjZGVmaW5lIFBSNF9SRUdOVU0JMTIKKyNkZWZpbmUgUFI1X1JFR05VTQkxMworI2RlZmluZSBQUjZfUkVHTlVNCTE0CisjZGVmaW5lIFBSN19SRUdOVU0JMTUKKworI2RlZmluZSBTRUdfQ19SRUdOVU0JMTYJLyogU2VnbWVudCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU0VHX0RfUkVHTlVNCTE3CisjZGVmaW5lIFNFR19FX1JFR05VTQkxOAorI2RlZmluZSBTRUdfVF9SRUdOVU0JMTkKKworI2RlZmluZSBDQ1JfUkVHTlVNICAgICAgMjAJLyogQ29udGFpbnMgcHJvY2Vzc29yIHN0YXR1cyAqLworI2RlZmluZSBQQ19SRUdOVU0gICAgICAgMjEJLyogQ29udGFpbnMgcHJvZ3JhbSBjb3VudGVyICovCisKKyNkZWZpbmUgTlVNX1JFR1MgCTIyCisKKyNkZWZpbmUgU1BfUkVHTlVNICAgICAgIFBSN19SRUdOVU0gLyogQ29udGFpbnMgYWRkcmVzcyBvZiB0b3Agb2Ygc3RhY2sgKi8KKyNkZWZpbmUgRlBfUkVHTlVNICAgICAgIFBSNl9SRUdOVU0gLyogQ29udGFpbnMgYWRkcmVzcyBvZiBleGVjdXRpbmcgc3RhY2sgZnJhbWUgKi8KKworI2RlZmluZSBQVFJfU0laRSAobWluaW11bV9tb2RlID8gMiA6IDQpCisjZGVmaW5lIFBUUl9NQVNLIChtaW5pbXVtX21vZGUgPyAweDAwMDBmZmZmIDogMHgwMGZmZmZmZikKKworLyogU3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIHBsYWNlIGluIHdoaWNoIHRvIGNvcHkgdGhlIHN0cnVjdHVyZSB0aGUKKyAgIHN1YnJvdXRpbmUgd2lsbCByZXR1cm4uICBUaGlzIGlzIGNhbGxlZCBmcm9tIGNhbGxfZnVuY3Rpb24uICovCisKKy8qI2RlZmluZSBTVE9SRV9TVFJVQ1RfUkVUVVJOKEFERFIsIFNQKSBcCisgIHsgd3JpdGVfcmVnaXN0ZXIgKDAsIChBRERSKSk7IGFib3J0KCk7IH0qLworCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwgZm9ybWF0LAorICAgaW50byBWQUxCVUYuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKFRZUEUsUkVHQlVGLFZBTEJVRikgXAorICBtZW1jcHkgKFZBTEJVRiwgKGNoYXIgKikoUkVHQlVGKSwgVFlQRV9MRU5HVEgoVFlQRSkpCisKKy8qIFdyaXRlIGludG8gYXBwcm9wcmlhdGUgcmVnaXN0ZXJzIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlCisgICBvZiB0eXBlIFRZUEUsIGdpdmVuIGluIHZpcnR1YWwgZm9ybWF0LiAgKi8KKworI2RlZmluZSBTVE9SRV9SRVRVUk5fVkFMVUUoVFlQRSxWQUxCVUYpIFwKKyAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKDAsIFZBTEJVRiwgVFlQRV9MRU5HVEggKFRZUEUpKQorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICB0aGUgYWRkcmVzcyBpbiB3aGljaCBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gaXRzIHN0cnVjdHVyZSB2YWx1ZSwKKyAgIGFzIGEgQ09SRV9BRERSIChvciBhbiBleHByZXNzaW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgb25lKS4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyhSRUdCVUYpICgqKENPUkVfQUREUiAqKShSRUdCVUYpKQorCisMCisvKiBEZWZpbmUgb3RoZXIgYXNwZWN0cyBvZiB0aGUgc3RhY2sgZnJhbWUuICAqLworCisvKiBBIG1hY3JvIHRoYXQgdGVsbHMgdXMgd2hldGhlciB0aGUgZnVuY3Rpb24gaW52b2NhdGlvbiByZXByZXNlbnRlZAorICAgYnkgRkkgZG9lcyBub3QgaGF2ZSBhIGZyYW1lIG9uIHRoZSBzdGFjayBhc3NvY2lhdGVkIHdpdGggaXQuICBJZiBpdAorICAgZG9lcyBub3QsIEZSQU1FTEVTUyBpcyBzZXQgdG8gMSwgZWxzZSAwLiAgKi8KKworI2RlZmluZSBGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTihGSSwgRlJBTUVMRVNTKSBcCisgIChGUkFNRUxFU1MpID0gZnJhbWVsZXNzX2xvb2tfZm9yX3Byb2xvZ3VlKEZJKQorCisvKiBBbnkgZnVuY3Rpb24gd2l0aCBhIGZyYW1lIGxvb2tzIGxpa2UgdGhpcworICAgU0VDT05EIEFSRworICAgRklSU1QgQVJHCisgICBSRVQgUEMKKyAgIFNBVkVEIFIyCisgICBTQVZFRCBSMworICAgU0FWRUQgRlAgICA8LUZQIFBPSU5UUyBIRVJFCisgICBMT0NBTFMwCisgICBMT0NBTFMxICAgIDwtU1AgUE9JTlRTIEhFUkUKKyAgIAorICAgKi8KKworI2RlZmluZSBJTklUX0VYVFJBX0ZSQU1FX0lORk8oZnJvbWxlYWYsIGZjaSkgIDsKKy8qICAgICAgIChmY2kpLT5mcmFtZSB8PSByZWFkX3JlZ2lzdGVyKFNFR19UX1JFR05VTSkgPDwgMTY7Ki8KKworI2RlZmluZSBGUkFNRV9DSEFJTihGUkFNRSkgaDg1MDBfZnJhbWVfY2hhaW4oRlJBTUUpCitzdHJ1Y3QgZnJhbWVfaW5mbzsKK2V4dGVybiBDT1JFX0FERFIgaDg1MDBfZnJhbWVfY2hhaW4gUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworCisjZGVmaW5lIEZSQU1FX1NBVkVEX1BDKEZSQU1FKSBmcmFtZV9zYXZlZF9wYyhGUkFNRSkKK2V4dGVybiBDT1JFX0FERFIgZnJhbWVfc2F2ZWRfcGMgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lKSk7CisKKyNkZWZpbmUgRlJBTUVfQVJHU19BRERSRVNTKGZpKSAoKGZpKS0+ZnJhbWUpCisKKyNkZWZpbmUgRlJBTUVfTE9DQUxTX0FERFJFU1MoZmkpICgoZmkpLT5mcmFtZSkKKworLyogU2V0IFZBTCB0byB0aGUgbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvIGZyYW1lIGRlc2NyaWJlZCBieSBGSS4KKyAgIENhbiBzZXQgVkFMIHRvIC0xLCBtZWFuaW5nIG5vIHdheSB0byB0ZWxsLiAgKi8KKworLyogV2UgY2FuJ3QgdGVsbCBob3cgbWFueSBhcmdzIHRoZXJlIGFyZQorICAgbm93IHRoYXQgdGhlIEMgY29tcGlsZXIgZGVsYXlzIHBvcHBpbmcgdGhlbS4gICovCisKKyNkZWZpbmUgRlJBTUVfTlVNX0FSR1ModmFsLGZpKSAodmFsID0gLTEpCisKKy8qIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgYXQgc3RhcnQgb2YgYXJnbGlzdCB0aGF0IGFyZSBub3QgcmVhbGx5IGFyZ3MuICAqLworCisjZGVmaW5lIEZSQU1FX0FSR1NfU0tJUCAwCisKKy8qIFB1dCBoZXJlIHRoZSBjb2RlIHRvIHN0b3JlLCBpbnRvIGEgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MsCisgICB0aGUgYWRkcmVzc2VzIG9mIHRoZSBzYXZlZCByZWdpc3RlcnMgb2YgZnJhbWUgZGVzY3JpYmVkIGJ5IEZSQU1FX0lORk8uCisgICBUaGlzIGluY2x1ZGVzIHNwZWNpYWwgcmVnaXN0ZXJzIHN1Y2ggYXMgcGMgYW5kIGZwIHNhdmVkIGluIHNwZWNpYWwKKyAgIHdheXMgaW4gdGhlIHN0YWNrIGZyYW1lLiAgc3AgaXMgZXZlbiBtb3JlIHNwZWNpYWw6CisgICB0aGUgYWRkcmVzcyB3ZSByZXR1cm4gZm9yIGl0IElTIHRoZSBzcCBmb3IgdGhlIG5leHQgZnJhbWUuICAqLworCisjZGVmaW5lIEZSQU1FX0ZJTkRfU0FWRURfUkVHUyhmcmFtZV9pbmZvLCBmcmFtZV9zYXZlZF9yZWdzKQkgICAgXAorICAgZnJhbWVfZmluZF9zYXZlZF9yZWdzKGZyYW1lX2luZm8sICYoZnJhbWVfc2F2ZWRfcmVncykpCitzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVnczsKK2V4dGVybiB2b2lkIGZyYW1lX2ZpbmRfc2F2ZWRfcmVncyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWVfaW5mbywgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKmZyYW1lX3NhdmVkX3JlZ3MpKTsKKwwKKworLyogRGlzY2FyZCBmcm9tIHRoZSBzdGFjayB0aGUgaW5uZXJtb3N0IGZyYW1lLCByZXN0b3JpbmcgYWxsIHJlZ2lzdGVycy4gICovCisKKyNkZWZpbmUgUE9QX0ZSQU1FIHsgaDg1MDBfcG9wX2ZyYW1lICgpOyB9CitleHRlcm4gdm9pZCBoODUwMF9wb3BfZnJhbWUgUEFSQU1TICgodm9pZCkpOworCisjZGVmaW5lIFNIT1JUX0lOVF9NQVggMzI3NjcKKyNkZWZpbmUgU0hPUlRfSU5UX01JTiAtMzI3NjgKKworI2RlZmluZSBOQU1FU19IQVZFX1VOREVSU0NPUkUKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBJTlNOX1dPUkQ7CisKK2V4dGVybiBDT1JFX0FERFIgaDg1MDBfYWRkcl9iaXRzX3JlbW92ZSBQQVJBTVMgKChDT1JFX0FERFIpKTsKKyNkZWZpbmUgQUREUl9CSVRTX1JFTU9WRShhZGRyKSBoODUwMF9hZGRyX2JpdHNfcmVtb3ZlIChhZGRyKQorCisjZGVmaW5lIHJlYWRfbWVtb3J5X3Nob3J0KHgpICAocmVhZF9tZW1vcnlfaW50ZWdlcih4LDIpICYgMHhmZmZmKQorCisjZGVmaW5lCVBSSU5UX1JFR0lTVEVSX0hPT0socmVnbm8pIHByaW50X3JlZ2lzdGVyX2hvb2socmVnbm8pCitleHRlcm4gdm9pZCBwcmludF9yZWdpc3Rlcl9ob29rIFBBUkFNUyAoKGludCkpOworCitleHRlcm4gaW50IG1pbmltdW1fbW9kZTsKKworI2RlZmluZSBDQUxMX0RVTU1ZX0xFTkdUSCAxMAorCisvKiBGYWtlIHZhcmlhYmxlcyB0byBtYWtlIGl0IGVhc3kgdG8gdXNlIDI0IGJpdCByZWdpc3RlciBwb2ludGVycyAqLworCisjZGVmaW5lIElTX1RSQVBQRURfSU5URVJOQUxWQVIgaDg1MDBfaXNfdHJhcHBlZF9pbnRlcm5hbHZhcgorZXh0ZXJuIGludCBoODUwMF9pc190cmFwcGVkX2ludGVybmFsdmFyIFBBUkFNUyAoKGNoYXIgKm5hbWUpKTsKKworI2RlZmluZSBWQUxVRV9PRl9UUkFQUEVEX0lOVEVSTkFMVkFSIGg4NTAwX3ZhbHVlX29mX3RyYXBwZWRfaW50ZXJuYWx2YXIKK2V4dGVybiBzdHJ1Y3QgdmFsdWUgKiBoODUwMF92YWx1ZV9vZl90cmFwcGVkX2ludGVybmFsdmFyICgvKiBzdHJ1Y3QgaW50ZXJuYWx2YXIgKnZhciAqLyk7CisKKyNkZWZpbmUgU0VUX1RSQVBQRURfSU5URVJOQUxWQVIgaDg1MDBfc2V0X3RyYXBwZWRfaW50ZXJuYWx2YXIKK2V4dGVybiB2b2lkIGg4NTAwX3NldF90cmFwcGVkX2ludGVybmFsdmFyICgvKiBzdHJ1Y3QgaW50ZXJuYWx2YXIgKnZhciwgdmFsdWUgbmV3dmFsLCBpbnQgYml0cG9zLCBpbnQgYml0c2l6ZSwgaW50IG9mZnNldCAqLyk7CisKK2V4dGVybiBDT1JFX0FERFIgaDg1MDBfcmVhZF9zcCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBoODUwMF93cml0ZV9zcCBQQVJBTVMgKChDT1JFX0FERFIpKTsKKworZXh0ZXJuIENPUkVfQUREUiBoODUwMF9yZWFkX2ZwIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGg4NTAwX3dyaXRlX2ZwIFBBUkFNUyAoKENPUkVfQUREUikpOworCitleHRlcm4gQ09SRV9BRERSIGg4NTAwX3JlYWRfcGMgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCBoODUwMF93cml0ZV9wYyBQQVJBTVMgKChDT1JFX0FERFIsIGludCkpOworCisjZGVmaW5lIFRBUkdFVF9SRUFEX1NQKCkgaDg1MDBfcmVhZF9zcCgpCisjZGVmaW5lIFRBUkdFVF9XUklURV9TUCh4KSBoODUwMF93cml0ZV9zcCh4KQorCisjZGVmaW5lIFRBUkdFVF9SRUFEX1BDKHBpZCkgaDg1MDBfcmVhZF9wYyhwaWQpCisjZGVmaW5lIFRBUkdFVF9XUklURV9QQyh4LHBpZCkgaDg1MDBfd3JpdGVfcGMoeCxwaWQpCisKKyNkZWZpbmUgVEFSR0VUX1JFQURfRlAoKSBoODUwMF9yZWFkX2ZwKCkKKyNkZWZpbmUgVEFSR0VUX1dSSVRFX0ZQKHgpIGg4NTAwX3dyaXRlX2ZwKHgpCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvY3lnd2luLm1oIGIvZ2RiL2NvbmZpZy9pMzg2L2N5Z3dpbi5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTNhY2I2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L2N5Z3dpbi5taApAQCAtMCwwICsxLDYgQEAKK01IX0NGTEFHUz0KK1hNX0ZJTEU9eG0tY3lnd2luLmgKK1hERVBGSUxFUz1zZXItdGNwLm8KK05BVERFUEZJTEVTPSB3aW4zMi1uYXQubworTkFUX0ZJTEU9Li4vbm0tZW1wdHkuaAorWE1fQ0xJQlM9CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvY3lnd2luLm10IGIvZ2RiL2NvbmZpZy9pMzg2L2N5Z3dpbi5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGZjMGMyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L2N5Z3dpbi5tdApAQCAtMCwwICsxLDYgQEAKKyMgVGFyZ2V0OiBJbnRlbCAzODYgcnVuIHdpbjMyCitUREVQRklMRVM9IGkzODYtdGRlcC5vIGkzODctdGRlcC5vCitUTV9GSUxFPSB0bS1jeWd3aW4uaAorCisKKwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L2Zic2QubWggYi9nZGIvY29uZmlnL2kzODYvZmJzZC5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTllZDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L2Zic2QubWgKQEAgLTAsMCArMSw1IEBACisjIEhvc3Q6IEludGVsIDM4NiBydW5uaW5nIEZyZWVCU0QKK1hERVBGSUxFUz0gc2VyLXRjcC5vCitOQVRERVBGSUxFUz0gZm9yay1jaGlsZC5vIGluZnB0cmFjZS5vIGluZnRhcmcubyBjb3JlbG93Lm8gY29yZS1hb3V0Lm8gaTM4NmItbmF0Lm8KK1hNX0ZJTEU9IHhtLWkzODZic2QuaAorTkFUX0ZJTEU9IG5tLWZic2QuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L2Zic2QubXQgYi9nZGIvY29uZmlnL2kzODYvZmJzZC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjQ0ZjFjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L2Zic2QubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogSW50ZWwgMzg2IHJ1bm5pbmcgRnJlZUJTRAorVERFUEZJTEVTPSBpMzg2LXRkZXAubyBpMzg3LXRkZXAubyBzb2xpYi5vCitUTV9GSUxFPSB0bS1mYnNkLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9nZGJzZXJ2ZS5tdCBiL2dkYi9jb25maWcvaTM4Ni9nZGJzZXJ2ZS5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGE3Y2JhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L2dkYnNlcnZlLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IEdEQlNFUlZFLk5MTSBydW5uaW5nIG9uIGEgaTM4NgorVERFUEZJTEVTPQlpMzg2Lm8KK0NQVV9GSUxFPQlpMzg2CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvZ28zMi5taCBiL2dkYi9jb25maWcvaTM4Ni9nbzMyLm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMWVlMWMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvZ28zMi5taApAQCAtMCwwICsxLDggQEAKK01IX0NGTEFHUz0tRF9fR08zMl9fIC1EX19NU0RPU19fCitYREVQRklMRVM9IGdvMzIteGRlcC5vCitYTV9GSUxFPSB4bS1nbzMyLmgKK0hPU1RfSVBDPS1ERE9TX0lQQworU0VSX0hBUkRXSVJFPSBzZXItZ28zMi5vCitDQz1pMzg2LWdvMzItZ2NjIC1PMiAtZm5vLW9taXQtZnJhbWUtcG9pbnRlcgorCisKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9pMzg2YWl4Lm1oIGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZhaXgubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhMDVmMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9pMzg2YWl4Lm1oCkBAIC0wLDAgKzEsMTAgQEAKKyMgSG9zdDogSUJNIFBTLzIgKGkzODYpIHJ1bm5pbmcgQUlYIFBTLzIKKworWE1fRklMRT0geG0taTM4NmFpeC5oCitYREVQRklMRVM9IAorCitOQVRfRklMRT0gbm0taTM4NmFpeC5oCitOQVRERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBjb3JlbG93Lm8gaTM4NmFpeC1uYXQubworCisjIFVzZSBnY2MuIE9ubHkgY29mZiBvdXRwdXQgY2FuIGJlIGRlYnVnZ2VkCitDQz1nY2MKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9pMzg2YWl4Lm10IGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZhaXgubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJlMGUxZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9pMzg2YWl4Lm10CkBAIC0wLDAgKzEsNyBAQAorIyBUaGlzIHBvcnQsIGZvciBhaXggcHMvMiAoaTM4NiksIHdpbGwgYWxsb3cgeW91IHRvIGRlYnVnIHRoZSBjb2ZmCisjIG91dHB1dCBnZW5lcmF0ZWQgZ2NjLTIuMy4zICsgZ2FzLiAgSXQgd2lsbCBub3QgdW5kZXJzdGFuZCBJQk0ncworIyBwcm9wcmlldGFyeSBkZWJ1ZyBpbmZvLgorIworIyBUYXJnZXQ6IElCTSBQUy8yIChpMzg2KSBydW5uaW5nIEFJWCBQUy8yCitUREVQRklMRVM9IGkzODYtdGRlcC5vIGkzODctdGRlcC5vCitUTV9GSUxFPSB0bS1pMzg2YWl4LmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9pMzg2YW91dC5tdCBiL2dkYi9jb25maWcvaTM4Ni9pMzg2YW91dC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzk0YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZhb3V0Lm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IEludGVsIDM4NiB3aXRoIGEub3V0CitUREVQRklMRVM9IGkzODYtdGRlcC5vCitUTV9GSUxFPSB0bS1pMzg2di5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvaTM4NmJzZC5taCBiL2dkYi9jb25maWcvaTM4Ni9pMzg2YnNkLm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NWM2ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvaTM4NmJzZC5taApAQCAtMCwwICsxLDcgQEAKKyMgSG9zdDogSW50ZWwgMzg2IHJ1bm5pbmcgMzg2QlNECisKK1hNX0ZJTEU9IHhtLWkzODZic2QuaAorWERFUEZJTEVTPSAKKworTkFUX0ZJTEU9IG5tLWkzODZic2QuaAorTkFUREVQRklMRVM9IGZvcmstY2hpbGQubyBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gY29yZWxvdy5vIGNvcmUtYW91dC5vIGkzODZiLW5hdC5vCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvaTM4NmJzZC5tdCBiL2dkYi9jb25maWcvaTM4Ni9pMzg2YnNkLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjE3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvaTM4NmJzZC5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBJbnRlbCAzODYgcnVubmluZyBCU0QKK1RNX0ZJTEU9IHRtLWkzODZic2QuaAorVERFUEZJTEVTPSBpMzg2LXRkZXAubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L2kzODZkZ3V4Lm1oIGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZkZ3V4Lm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNWViY2QKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvaTM4NmRndXgubWgKQEAgLTAsMCArMSw5IEBACisjIEhvc3Q6IEludGVsIDM4NiBydW5uaW5nIERHVVgsIGNsb25lZCBmcm9tIFNWUjQKKworWE1fRklMRT0geG0taTM4NnY0LmgKK1hERVBGSUxFUz0gc2VyLXRjcC5vCisjIGZvciBuZXR3b3JrIGNvbW11bmljYXRpb24KK1hNX0NMSUJTPSAtbHNvY2tldCAtbG5zbAorCitOQVRfRklMRT0gbm0taTM4NnY0LmgKK05BVERFUEZJTEVTPSBjb3JlbG93Lm8gY29yZS1yZWdzZXQubyBzb2xpYi5vIHByb2Nmcy5vIGZvcmstY2hpbGQubyBpMzg2djQtbmF0Lm8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9pMzg2Z251Lm1oIGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZnbnUubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlYWM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9pMzg2Z251Lm1oCkBAIC0wLDAgKzEsMzEgQEAKKyMgSG9zdDogSW50ZWwgMzg2IHJ1bm5pbmcgdGhlIEdOVSBIdXJkCitYREVQRklMRVM9IGkzODctdGRlcC5vCitOQVRERVBGSUxFUz0gaTM4NmdudS1uYXQubyBnbnUtbmF0Lm8gZm9yay1jaGlsZC5vIHNvbGliLm8gY29yZWxvdy5vIG5vdGlmeV9TLm8gcHJvY2Vzc19yZXBseV9TLm8gbXNnX3JlcGx5X1MubyBtc2dfVS5vIGV4Y19yZXF1ZXN0X1UubyBleGNfcmVxdWVzdF9TLm8KK1hNX0ZJTEU9IHhtLWkzODZnbnUuaAorTkFUX0ZJTEU9IG5tLWdudS5oCitNSF9DRkxBR1MgPSAtRF9HTlVfU09VUkNFCisKK1hNX0NMSUJTID0gLWxzaG91bGRiZWlubGliYworCisjIFVzZSBvdXIgb3duIHVzZXIgc3R1YnMgZm9yIHRoZSBtc2cgcnBjcywgc28gd2UgY2FuIG1ha2UgdGhlbSB0aW1lIG91dCwgaW4KKyMgY2FzZSB0aGUgcHJvZ3JhbSBpcyBmdWNrZWQsIG9yIHdlIGd1ZXNzIHRoZSB3cm9uZyBzaWduYWwgdGhyZWFkLgorbXNnLU1JR1VGTEFHUyA9IC1EJ01TR19JTVBPUlRTPXdhaXR0aW1lIDEwMDA7JworCisjIGljaworTUlHID0gbWlnCitNSUdDT00gPSAkKE1JRykgLWNjIGNhdCAtIC9kZXYvbnVsbAorCisjIFJlcGx5IHNlcnZlcnMgbmVlZCBzcGVjaWFsIG1hc3NhZ2luZyBvZiB0aGUgY29kZSBtaWcgZ2VuZXJhdGVzLCB0byBtYWtlCisjIHRoZW0gd29yayBjb3JyZWN0bHkgZm9yIGVycm9yIHJldHVybnMgaW4gc29tZSBjYXNlcy4KKyVfcmVwbHlfUy5oICVfcmVwbHlfUy5jOiAlX3JlcGx5LmRlZnMKKwkkKENQUCkgJChDUFBGTEFHUykgLURTRVJWRVJQUkVGSVg9U18gLXggYyAkPCBcCisJfCAkKE1JR0NPTSkgLXNoZWFkZXIgJCpfcmVwbHlfUy5oIC1zZXJ2ZXIgJCpfcmVwbHlfUy5yYXcgLXVzZXIgL2Rldi9udWxsIC1oZWFkZXIgL2Rldi9udWxsIFwKKwkmJiAkKEFXSykgLWYgJChzcmNkaXIpL3JlcGx5X21pZ19oYWNrLmF3ayA8ICQqX3JlcGx5X1MucmF3ID4gJCpfcmVwbHlfUy5jCisjIE5vcm1hbCBzZXJ2ZXJzCislX1MuaCAlX1MuYzogJS5kZWZzCisJJChDUFApICQoQ1BQRkxBR1MpIC1EU0VSVkVSUFJFRklYPVNfIC14IGMgJDwgXAorCXwgJChNSUdDT00pIC1zaGVhZGVyICQqX1MuaCAtc2VydmVyICQqX1MuYyAtdXNlciAvZGV2L251bGwgLWhlYWRlciAvZGV2L251bGwKKyMgVXNlciBycGMgc3R1YnMKKyVfVS5oICVfVS5jOiAlLmRlZnMKKwkkKENQUCkgJChDUFBGTEFHUykgJCgkKi1NSUdVRkxBR1MpIC14IGMgJDwgXAorCXwgJChNSUdDT00pIC1zaGVhZGVyIC9kZXYvbnVsbCAtc2VydmVyIC9kZXYvbnVsbCAtdXNlciAkKl9VLmMgLWhlYWRlciAkKl9VLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9pMzg2Z251Lm10IGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZnbnUubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRmYjAxOAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9pMzg2Z251Lm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IEludGVsIDM4Ni9lbGYvR05VIEh1cmQKK1RERVBGSUxFUz0gaTM4Ni10ZGVwLm8KK1RNX0ZJTEU9IHRtLWkzODZnbnUuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L2kzODZseW54Lm1oIGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZseW54Lm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYjA4NmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvaTM4Nmx5bngubWgKQEAgLTAsMCArMSwxMSBAQAorIyBIb3N0OiBJbnRlbCAzODYgcnVubmluZyBMeW54T1MKKworWE1fRklMRT0geG0taTM4Nmx5bnguaAorWE1fQ0xJQlM9IC1sYnNkCitYREVQRklMRVM9IHNlci10Y3AubworCitOQVRfRklMRT0gbm0taTM4Nmx5bnguaAorTkFUREVQRklMRVM9IGZvcmstY2hpbGQubyBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gY29yZWxvdy5vIGx5bngtbmF0Lm8KKworR0RCU0VSVkVSX0xJQlM9IC1sYnNkCitHREJTRVJWRVJfREVQRklMRVM9IGxvdy1seW54Lm8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9pMzg2bHlueC5tdCBiL2dkYi9jb25maWcvaTM4Ni9pMzg2bHlueC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzA0YjQzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZseW54Lm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IEludGVsIDM4NiBydW5uaW5nIEx5bnhPUworVERFUEZJTEVTPSBjb2ZmLXNvbGliLm8gaTM4Ni10ZGVwLm8gaTM4Nmx5LXRkZXAubworVE1fRklMRT0gdG0taTM4Nmx5bnguaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L2kzODZtMy5taCBiL2dkYi9jb25maWcvaTM4Ni9pMzg2bTMubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4M2ViZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9pMzg2bTMubWgKQEAgLTAsMCArMSw3IEBACisjIEhvc3Q6IEludGVsIDM4NiBydW5uaW5nIE1hY2gzCisKK1hERVBGSUxFUz0gaTM4Ny10ZGVwLm8gY29yZS1hb3V0Lm8KK05BVERFUEZJTEVTPSBpMzg2bTMtbmF0Lm8gbTMtbmF0Lm8gZm9yay1jaGlsZC5vCitOQVRfQ0xJQlM9IC1sbWFjaGlkIC1sbmV0bmFtZSAtbG1hY2gKK1hNX0ZJTEU9IHhtLWkzODZtMy5oCitOQVRfRklMRT0gbm0tbTMuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L2kzODZtMy5tdCBiL2dkYi9jb25maWcvaTM4Ni9pMzg2bTMubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4NWFlMwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9pMzg2bTMubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogSW50ZWwgMzg2IHdpdGggYS5vdXQgdW5kZXIgTWFjaCAzCitUREVQRklMRVM9IGkzODYtdGRlcC5vIAorVE1fRklMRT0gdG0taTM4Nm0zLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9pMzg2bWFjaC5taCBiL2dkYi9jb25maWcvaTM4Ni9pMzg2bWFjaC5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDc2NmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZtYWNoLm1oCkBAIC0wLDAgKzEsMTAgQEAKKyMgSG9zdDogSW50ZWwgMzg2IHJ1bm5pbmcgTWFjaAorCisjIFRoaXMgaXMgZm9yIG1hY2gyLCBtYXliZSwgb3IgaXMgb2Jzb2xldGUgKGFuZCBzZWVtcyB0byBoYXZlIG9ubHkKKyMgaG9zdCBhbmQgbmF0aXZlLCBub3QgdGFyZ2V0KS4gIE9uY2Ugd2UgZ2V0IHRoZSBtYWNoMyBzdHVmZiB3b3JraW5nLAorIyBJIHRoaW5rIGl0IGNhbiBnbyBhd2F5LgorCitYREVQRklMRVM9IAorWE1fRklMRT0geG0taTM4Nm1hY2guaAorTkFUX0ZJTEU9IG5tLWkzODZtYWNoLmgKK05BVERFUEZJTEVTPSBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gZm9yay1jaGlsZC5vIGkzODZtYWNoLW5hdC5vCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvaTM4Nm1rLm1oIGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZtay5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDk2NzdjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZtay5taApAQCAtMCwwICsxLDQgQEAKKyMgSG9zdDogSW50ZWwgMzg2IHJ1bm5pbmcgTWFjaDMgd2l0aCBPU0YgMS9NSworCitYREVQRklMRVM9IG9zLW1hY2gzLm8gaTM4Nm1hY2gzLXhkZXAubyBpMzg3LXRkZXAubworWE1fRklMRT0geG0taTM4Nm9zZjFtay5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvaTM4Nm1rLm10IGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZtay5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzU5NDQyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZtay5tdApAQCAtMCwwICsxLDYgQEAKKyMgVGFyZ2V0OiBJbnRlbCAzODYgd2l0aCBhLm91dCBpbiBvc2YgMS9taworVERFUEZJTEVTPSBpMzg2LXRkZXAubyAKK1RNX0ZJTEU9IHRtLWkzODZvc2YxbWsuaAorCitUTV9DRkxBR1M9IC1JL3Vzci9tYWNoMy9pbmNsdWRlCitUTV9DTElCUz0gL3Vzci9tYWNoMy9jY3MvbGliL2xpYm1hY2hpZC5hIC91c3IvbWFjaDMvY2NzL2xpYi9saWJuZXRuYW1lLmEgL3Vzci9tYWNoMy9jY3MvbGliL2xpYm1hY2guYQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L2kzODZudy5tdCBiL2dkYi9jb25maWcvaTM4Ni9pMzg2bncubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwOWM0MgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9pMzg2bncubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogSW50ZWwgMzg2IHJ1bm5pbmcgTmV0V2FyZQorVERFUEZJTEVTPSBpMzg2LXRkZXAubyBpMzg3LXRkZXAubworVE1fRklMRT0gdG0taTM4Nm53LmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9pMzg2b3M5ay5tdCBiL2dkYi9jb25maWcvaTM4Ni9pMzg2b3M5ay5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTg3OTRkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZvczlrLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IEludGVsIDM4NiBydW5uaW5nIE9TOTAwMAorVERFUEZJTEVTPSBpMzg2LXRkZXAubyByZW1vdGUtb3M5ay5vCitUTV9GSUxFPSB0bS1pMzg2b3M5ay5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvaTM4NnNjby5taCBiL2dkYi9jb25maWcvaTM4Ni9pMzg2c2NvLm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MDc2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvaTM4NnNjby5taApAQCAtMCwwICsxLDEzIEBACisjIEhvc3Q6IEludGVsIDM4NiBydW5uaW5nIFNDTyBVbml4IChwcmUtU1ZSNCkKKworWE1fRklMRT0geG0taTM4NnNjby5oCitYREVQRklMRVM9IAorWE1fQ0xJQlM9IC1sUFcKKworTkFUX0ZJTEU9IG5tLWkzODZzY28uaAorTkFUREVQRklMRVM9IGluZnB0cmFjZS5vIGluZnRhcmcubyBmb3JrLWNoaWxkLm8gY29yZWxvdy5vIGNvcmUtYW91dC5vIGkzODZ2LW5hdC5vCisKKyNtc2cgVGhlIFNDTyBDIGNvbXBpbGVyIGNhbm5vdCBwYXJzZSBzeW10YWIuaCB3aGVuIHZhbHVlLmggaGFzIGJlZW4gaW5jbHVkZWQuCisjbXNnIFRoaXMgaXMgYSBidWcgaW4gdGhlIGNvbXBpbGVyOyB0aGUgY29kZSBpcyB2YWxpZC4KKyNtc2cgVGhlcmVmb3JlLCB5b3UgbXVzdCB1c2UgR0NDIHRvIGNvbXBpbGUgR0RCIG9uIFNDTyBtYWNoaW5lcy4KK0NDPWdjYyAtRF9QT1NJWF9TT1VSQ0U9MQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L2kzODZzY280Lm1oIGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZzY280Lm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExM2Y5OTMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvaTM4NnNjbzQubWgKQEAgLTAsMCArMSwxMiBAQAorIyBIb3N0OiBJbnRlbCAzODYgcnVubmluZyBTQ08gVW5peCAzLjJ2NAorCitYTV9GSUxFPSB4bS1pMzg2c2NvLmgKK1hERVBGSUxFUz0gCitYTV9DTElCUz0gLWxQVworCitOQVRfRklMRT0gbm0taTM4NnNjbzQuaAorTkFUREVQRklMRVM9IGluZnB0cmFjZS5vIGluZnRhcmcubyBmb3JrLWNoaWxkLm8gY29yZWxvdy5vIGNvcmUtYW91dC5vIGkzODZ2LW5hdC5vCisKKyMgVGhlIGNjIGNvbXBpbGVyIG1pc2hhbmRsZXMgY29uc3QgaW4gY2FzZXMgbGlrZSAKKyMgc3RydWN0IHR5cGUgKiogY29uc3QgKGNfYnVpbHRpbl90eXBlc1tdKSA9IAorTUhfQ0ZMQUdTPS1EY29uc3Q9CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvaTM4NnNjbzUubWggYi9nZGIvY29uZmlnL2kzODYvaTM4NnNjbzUubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlYTg3YQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9pMzg2c2NvNS5taApAQCAtMCwwICsxLDE3IEBACisjIEhvc3Q6IEludGVsIDM4NiBydW5uaW5nIFNDTyBPcGVuU2VydmVyIDUKKyMgTXVjaCBsaWtlIDMuMnY0LCBleGNlcHQgd2UgZG9uJ3QgaGF2ZSB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGNvbnN0CisKK1hNX0ZJTEU9IHhtLWkzODZzY28uaAorCisjCisjIE5vdCBhbGwgY29uZmlndXJhdGlvbnMgb2YgU0NPIE9wZW5TZXJ2ZXIgNSBjb21lIHdpdGggdGhlIFRDUC9JUCAKKyMgcnVudGltZSwgYnV0IGFsbCBjb21lIHdpdGggdGhlIGRldmVsb3BtZW50IHN5c3RlbSwgc28gd2UgYWx3YXlzCisjIGhhdmUgc29ja2V0KCksIGdldGhvc3RieW5hbWUoKSwgYW5kIGZyaWVuZHMuCisjCitYREVQRklMRVM9IHNlci10Y3AubworWE1fQ0xJQlM9IC1sUFcgLWxzb2NrZXQKKworTkFUX0ZJTEU9IG5tLWkzODZzY281LmgKK05BVERFUEZJTEVTPSBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gZm9yay1jaGlsZC5vIGNvcmVmaWxlLm8gY29yZS1hb3V0Lm8gXAorCWNvcmVsb3cubyBpMzg2di1uYXQubyBzb2xpYi5vCisKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9pMzg2c2NvNS5tdCBiL2dkYi9jb25maWcvaTM4Ni9pMzg2c2NvNS5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRjNjhkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZzY281Lm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IEludGVsIDM4NiBydW5uaW5nIFNDTyBPcGVuIFNlcnZlciA1CitUREVQRklMRVM9IGkzODYtdGRlcC5vIGkzODctdGRlcC5vCitUTV9GSUxFPSB0bS1pMzg2c2NvNS5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvaTM4NnNvbDIubWggYi9nZGIvY29uZmlnL2kzODYvaTM4NnNvbDIubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyNDI5NAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9pMzg2c29sMi5taApAQCAtMCwwICsxLDcgQEAKKyMgSG9zdDogSW50ZWwgMzg2IHJ1bm5pbmcgU29sYXJpcyAyIChTVlI0KQorCitYTV9GSUxFPSB4bS1pMzg2djQuaAorWERFUEZJTEVTPSAKKworTkFUX0ZJTEU9IG5tLWkzODZzb2wyLmgKK05BVERFUEZJTEVTPSBjb3JlLXJlZ3NldC5vIHByb2Nmcy5vIGZvcmstY2hpbGQubyBpMzg2djQtbmF0Lm8gY29yZWxvdy5vCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvaTM4NnNvbDIubXQgYi9nZGIvY29uZmlnL2kzODYvaTM4NnNvbDIubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiNTc2ZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9pMzg2c29sMi5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBJbnRlbCAzODYgcnVubmluZyBTVlI0CitUREVQRklMRVM9IGkzODYtdGRlcC5vIGkzODctdGRlcC5vIHNvbGliLm8KK1RNX0ZJTEU9IHRtLWkzODZzb2wyLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9pMzg2di5taCBiL2dkYi9jb25maWcvaTM4Ni9pMzg2di5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjdhMzBmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZ2Lm1oCkBAIC0wLDAgKzEsOCBAQAorIyBIb3N0OiBJbnRlbCAzODYgcnVubmluZyBTeXN0ZW0gVgorCitYTV9GSUxFPSB4bS1pMzg2di5oCitYREVQRklMRVM9IAorWE1fQ0xJQlM9IC1sUFcKKworTkFUX0ZJTEU9IG5tLWkzODZ2LmgKK05BVERFUEZJTEVTPSBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gZm9yay1jaGlsZC5vIGNvcmVsb3cubyBjb3JlLWFvdXQubyBpMzg2di1uYXQubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L2kzODZ2Lm10IGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZ2Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNDJkM2UKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvaTM4NnYubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogSW50ZWwgMzg2IHJ1bm5pbmcgU3lzdGVtIFYKK1RERVBGSUxFUz0gaTM4Ni10ZGVwLm8gaTM4Ny10ZGVwLm8KK1RNX0ZJTEU9IHRtLWkzODZ2LmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9pMzg2djMyLm1oIGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZ2MzIubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0MTc1ZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9pMzg2djMyLm1oCkBAIC0wLDAgKzEsOSBAQAorIyBIb3N0OiBJbnRlbCAzODYgcnVubmluZyBTeXN0ZW0gViByZWxlYXNlIDMuMgorCitYTV9GSUxFPSB4bS1pMzg2djMyLmgKK1hERVBGSUxFUz0gCitYTV9DTElCUz0gLWxQVworCitOQVRfRklMRT0gbm0taTM4NnYuaAorTkFUREVQRklMRVM9IGluZnB0cmFjZS5vIGluZnRhcmcubyBmb3JrLWNoaWxkLm8gY29yZWxvdy5vIGNvcmUtYW91dC5vIGkzODZ2LW5hdC5vCisKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9pMzg2djQubWggYi9nZGIvY29uZmlnL2kzODYvaTM4NnY0Lm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTM4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvaTM4NnY0Lm1oCkBAIC0wLDAgKzEsOSBAQAorIyBIb3N0OiBJbnRlbCAzODYgcnVubmluZyBTVlI0CisKK1hNX0ZJTEU9IHhtLWkzODZ2NC5oCitYREVQRklMRVM9IAorIyBmb3IgbmV0d29yayBjb21tdW5pY2F0aW9uCitYTV9DTElCUz0gLWxzb2NrZXQgLWxuc2wKKworTkFUX0ZJTEU9IG5tLWkzODZ2NC5oCitOQVRERVBGSUxFUz0gY29yZWxvdy5vIGNvcmUtcmVnc2V0Lm8gc29saWIubyBwcm9jZnMubyBmb3JrLWNoaWxkLm8gaTM4NnY0LW5hdC5vCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvaTM4NnY0Lm10IGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZ2NC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjJiNjc1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L2kzODZ2NC5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBJbnRlbCAzODYgcnVubmluZyBTVlI0CitUREVQRklMRVM9IGkzODYtdGRlcC5vIGkzODctdGRlcC5vCitUTV9GSUxFPSB0bS1pMzg2djQuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L2kzODZ2NDJtcC5taCBiL2dkYi9jb25maWcvaTM4Ni9pMzg2djQybXAubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiNmMwNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9pMzg2djQybXAubWgKQEAgLTAsMCArMSwxMSBAQAorIyBIb3N0OiBJbnRlbCAzODYgcnVubmluZyBTVlI0CisKK1hNX0ZJTEU9IHhtLWkzODZ2NC5oCitYREVQRklMRVM9IAorIyBmb3IgbmV0d29yayBjb21tdW5pY2F0aW9uCitYTV9DTElCUz0gLWxzb2NrZXQgLWxuc2wKKworIyB3ZSBkb24ndCB3YW50IG5tLWkzODZ2NC5oIHNpbmNlIHRoYXQgZGVmaW5lcyBMT1NJTkdfUE9MTCB3aGljaCBpc24ndAorIyBhcHByb3ByaWF0ZSBmb3IgaTM4NnY0Mm1wCitOQVRfRklMRT0gbm0taTM4NnY0Mm1wLmgKK05BVERFUEZJTEVTPSBjb3JlbG93Lm8gY29yZS1yZWdzZXQubyBzb2xpYi5vIHByb2Nmcy5vIGZvcmstY2hpbGQubyBpMzg2djQtbmF0Lm8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9pMzg2djQybXAubXQgYi9nZGIvY29uZmlnL2kzODYvaTM4NnY0Mm1wLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMmRlYTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvaTM4NnY0Mm1wLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IEludGVsIDM4NiBydW5uaW5nIFNWUjQuMk1QCitUREVQRklMRVM9IGkzODYtdGRlcC5vIGkzODctdGRlcC5vCitUTV9GSUxFPSB0bS1pMzg2djQybXAuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L2xpbnV4Lm1oIGIvZ2RiL2NvbmZpZy9pMzg2L2xpbnV4Lm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZGU5MWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvbGludXgubWgKQEAgLTAsMCArMSw3IEBACisjIEhvc3Q6IEludGVsIDM4NiBydW5uaW5nIEdOVS9MaW51eAorCitYTV9GSUxFPSB4bS1saW51eC5oCitYREVQRklMRVM9IHNlci10Y3AubworCitOQVRfRklMRT0gbm0tbGludXguaAorTkFUREVQRklMRVM9IGluZnB0cmFjZS5vIHNvbGliLm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBjb3JlbG93Lm8gY29yZS1hb3V0Lm8gY29yZS1yZWdzZXQubyBpMzg2di1uYXQubyBpMzg2djQtbmF0Lm8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9saW51eC5tdCBiL2dkYi9jb25maWcvaTM4Ni9saW51eC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmNjOTdkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L2xpbnV4Lm10CkBAIC0wLDAgKzEsNSBAQAorIyBUYXJnZXQ6IEludGVsIDM4NiBydW5uaW5nIEdOVS9MaW51eAorVERFUEZJTEVTPSBpMzg2LXRkZXAubyBpMzg3LXRkZXAubworVE1fRklMRT0gdG0tbGludXguaAorCitHREJTRVJWRVJfREVQRklMRVM9IGxvdy1saW51eC5vCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvbmJzZC5taCBiL2dkYi9jb25maWcvaTM4Ni9uYnNkLm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NmI4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvbmJzZC5taApAQCAtMCwwICsxLDUgQEAKKyMgSG9zdDogSW50ZWwgMzg2IHJ1bm5pbmcgTmV0QlNECitYREVQRklMRVM9IHNlci10Y3AubworTkFUREVQRklMRVM9IGZvcmstY2hpbGQubyBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gY29yZWxvdy5vIGkzODZiLW5hdC5vCitYTV9GSUxFPSB4bS1uYnNkLmgKK05BVF9GSUxFPSBubS1uYnNkLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9uYnNkLm10IGIvZ2RiL2NvbmZpZy9pMzg2L25ic2QubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3MDg1MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9uYnNkLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IEludGVsIDM4NiBydW5uaW5nIE5ldEJTRAorVERFUEZJTEVTPSBpMzg2LXRkZXAubyBpMzg3LXRkZXAubyBzb2xpYi5vCitUTV9GSUxFPSB0bS1uYnNkLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9uY3IzMDAwLm1oIGIvZ2RiL2NvbmZpZy9pMzg2L25jcjMwMDAubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY2MDc1NgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9uY3IzMDAwLm1oCkBAIC0wLDAgKzEsMTYgQEAKKyMgSG9zdDogTkNSIDMwMDAgKEludGVsIDM4NiBydW5uaW5nIFNWUjQpCisKKyMgVGhlIE5DUiAzMDAwIHNoaXBzIHdpdGggYSBNZXRhV2FyZSBjb21waWxlciBpbnN0YWxsZWQgYXMgL2Jpbi9jYy4KKyMgVGhpcyBjb21waWxlciBub3Qgb25seSBlbWl0cyBvYm5veGlvdXMgY29weXJpZ2h0IG1lc3NhZ2VzIGV2ZXJ5IHRpbWUKKyMgeW91IHJ1biBpdCwgYnV0IGl0IGNob2tlcyBhbmQgZGllcyBvbiBhIHdob2xlIGJ1bmNoIG9mIEdOVSBzb3VyY2UKKyMgZmlsZXMuICBEZWZhdWx0IHRvIHVzaW5nIHRoZSBBVCZUIGNvbXBpbGVyIGluc3RhbGxlZCBpbiAvdXNyL2Njcy9BVFQvY2MuCisjIFVuZm9ydHVuYXRlbHkgdGhvdWdoLCB0aGUgQVQmVCBjb21waWxlciBzb21ldGltZXMgZ2VuZXJhdGVzIGNvZGUgdGhhdAorIyB0aGUgYXNzZW1ibGVyIGJhcmZzIG9uIGlmIC1nIGlzIHVzZWQsIHNvIGRpc2FibGUgaXQgYnkgZGVmYXVsdCBhcyB3ZWxsLgorQ0MgPSAvdXNyL2Njcy9BVFQvY2MKK0NGTEFHUyA9CisKK1hNX0ZJTEU9IHhtLWkzODZ2NC5oCitYREVQRklMRVM9IAorCitOQVRfRklMRT0gbm0taTM4NnY0LmgKK05BVERFUEZJTEVTPSBjb3JlbG93Lm8gY29yZS1yZWdzZXQubyBwcm9jZnMubyBmb3JrLWNoaWxkLm8gaTM4NnY0LW5hdC5vCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvbmNyMzAwMC5tdCBiL2dkYi9jb25maWcvaTM4Ni9uY3IzMDAwLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYmY5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvbmNyMzAwMC5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBJbnRlbCAzODYgcnVubmluZyBTVlI0CitUREVQRklMRVM9IGkzODYtdGRlcC5vIGkzODctdGRlcC5vIHNvbGliLm8KK1RNX0ZJTEU9IHRtLWkzODZ2NC5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvbm0tZmJzZC5oIGIvZ2RiL2NvbmZpZy9pMzg2L25tLWZic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjc2MjNjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L25tLWZic2QuaApAQCAtMCwwICsxLDk4IEBACisvKiBOYXRpdmUtZGVwZW5kZW50IGRlZmluaXRpb25zIGZvciBJbnRlbCAzODYgcnVubmluZyBCU0QgVW5peCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkyLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgTk1fRlJFRUJTRF9ICisjZGVmaW5lIE5NX0ZSRUVCU0RfSAorCisvKiBCZSBzaGFyZWQgbGliIGF3YXJlICovCisjaW5jbHVkZSAic29saWIuaCIKKworLyogVGhpcyBpcyB0aGUgYW1vdW50IHRvIHN1YnRyYWN0IGZyb20gdS51X2FyMAorICAgdG8gZ2V0IHRoZSBvZmZzZXQgaW4gdGhlIGNvcmUgZmlsZSBvZiB0aGUgcmVnaXN0ZXIgdmFsdWVzLiAgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgorI2RlZmluZSBLRVJORUxfVV9BRERSIFVTUlNUQUNLCisKKyNkZWZpbmUgUkVHSVNURVJfVV9BRERSKGFkZHIsIGJsb2NrZW5kLCByZWdubykgXAorCShhZGRyKSA9IGkzODZfcmVnaXN0ZXJfdV9hZGRyICgoYmxvY2tlbmQpLChyZWdubykpOworCitleHRlcm4gaW50CitpMzg2X3JlZ2lzdGVyX3VfYWRkciBQQVJBTVMgKChpbnQsIGludCkpOworCisjZGVmaW5lIFBUUkFDRV9BUkczX1RZUEUgY2hhcioKKworLyogbWFrZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgbWF0Y2ggdXAgd2l0aCB0aG9zZSBleHBlY3RlZCBpbiBzb2xpYi5jICovCisjZGVmaW5lIGxpbmtfb2JqZWN0CXNvZAorI2RlZmluZSBsb19uYW1lCQlzb2RfbmFtZQorI2RlZmluZSBsb19saWJyYXJ5CXNvZF9saWJyYXJ5CisjZGVmaW5lIGxvX3VudXNlZAlzb2RfcmVzZXJ2ZWQKKyNkZWZpbmUgbG9fbWFqb3IJc29kX21ham9yCisjZGVmaW5lIGxvX21pbm9yCXNvZF9taW5vcgorI2RlZmluZSBsb19uZXh0CQlzb2RfbmV4dAorCisjZGVmaW5lIGxpbmtfbWFwCXNvX21hcAorI2RlZmluZSBsbV9hZGRyCQlzb21fYWRkcgorI2RlZmluZSBsbV9uYW1lCQlzb21fcGF0aAorI2RlZmluZSBsbV9uZXh0CQlzb21fbmV4dAorI2RlZmluZSBsbV9sb3AJCXNvbV9zb2QKKyNkZWZpbmUgbG1fbG9iCQlzb21fc29kYmFzZQorI2RlZmluZSBsbV9yd3QJCXNvbV93cml0ZQorI2RlZmluZSBsbV9sZAkJc29tX2R5bmFtaWMKKyNkZWZpbmUgbG1fbHBkCQlzb21fc3BkCisKKyNkZWZpbmUgbGlua19keW5hbWljXzIJc2VjdGlvbl9kaXNwYXRjaF90YWJsZQorI2RlZmluZSBsZF9sb2FkZWQJc2R0X2xvYWRlZAorI2RlZmluZSBsZF9uZWVkCQlzZHRfc29kcworI2RlZmluZSBsZF9ydWxlcwlzZHRfZmlsbGVyMQorI2RlZmluZSBsZF9nb3QJCXNkdF9nb3QKKyNkZWZpbmUgbGRfcGx0CQlzZHRfcGx0CisjZGVmaW5lIGxkX3JlbAkJc2R0X3JlbAorI2RlZmluZSBsZF9oYXNoCQlzZHRfaGFzaAorI2RlZmluZSBsZF9zdGFiCQlzZHRfbnpsaXN0CisjZGVmaW5lIGxkX3N0YWJfaGFzaAlzZHRfZmlsbGVyMgorI2RlZmluZSBsZF9idWNrZXRzCXNkdF9idWNrZXRzCisjZGVmaW5lIGxkX3N5bWJvbHMJc2R0X3N0cmluZ3MKKyNkZWZpbmUgbGRfc3ltYl9zaXplCXNkdF9zdHJfc3oKKyNkZWZpbmUgbGRfdGV4dAkJc2R0X3RleHRfc3oKKyNkZWZpbmUgbGRfcGx0X3N6CXNkdF9wbHRfc3oKKworI2RlZmluZSBydGNfc3ltYglydF9zeW1ib2wKKyNkZWZpbmUgcnRjX3NwCQlydF9zcAorI2RlZmluZSBydGNfbmV4dAlydF9uZXh0CisKKyNkZWZpbmUgbGRfZGVidWcJc29fZGVidWcKKyNkZWZpbmUgbGRkX3ZlcnNpb24JZGRfdmVyc2lvbgorI2RlZmluZSBsZGRfaW5fZGVidWdnZXIJZGRfaW5fZGVidWdnZXIKKyNkZWZpbmUgbGRkX3N5bV9sb2FkZWQJZGRfc3ltX2xvYWRlZAorI2RlZmluZSBsZGRfYnBfYWRkcglkZF9icHRfYWRkcgorI2RlZmluZSBsZGRfYnBfaW5zdAlkZF9icHRfc2hhZG93CisjZGVmaW5lIGxkZF9jcAkJZGRfY2MKKworI2RlZmluZSBsaW5rX2R5bmFtaWMJX2R5bmFtaWMKKyNkZWZpbmUgbGRfdmVyc2lvbglkX3ZlcnNpb24KKyNkZWZpbmUgbGRkCQlkX2RlYnVnCisjZGVmaW5lIGxkX3VuCQlkX3VuCisjZGVmaW5lIGxkXzIJCWRfc2R0CisKKy8qIFJldHVybiBzaXplb2YgdXNlciBzdHJ1Y3QgdG8gY2FsbGVycyBpbiBsZXNzIG1hY2hpbmUgZGVwZW5kZW50IHJvdXRpbmVzICovCisKKyNkZWZpbmUgS0VSTkVMX1VfU0laRSBrZXJuZWxfdV9zaXplKCkKK2V4dGVybiBpbnQga2VybmVsX3Vfc2l6ZSBQQVJBTVMgKCh2b2lkKSk7CisKKyNlbmRpZiAvKiBOTV9GUkVFQlNEX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9ubS1nbnUuaCBiL2dkYi9jb25maWcvaTM4Ni9ubS1nbnUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWYyNWE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L25tLWdudS5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qIE5hdGl2ZS1kZXBlbmRlbnQgZGVmaW5pdGlvbnMgZm9yIEludGVsIDM4NiBydW5uaW5nIHRoZSBHTlUgSHVyZAorICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogSW5jbHVkZSB0aGUgZ2VuZXJpYyBodXJkIGRlZmluaXRpb25zLiAgKi8KKworI2luY2x1ZGUgIm5tLWdudS5oIgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L25tLWkzODZhaXguaCBiL2dkYi9jb25maWcvaTM4Ni9ubS1pMzg2YWl4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI0MDM5MwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9ubS1pMzg2YWl4LmgKQEAgLTAsMCArMSw0MiBAQAorLyogTmF0aXZlIHN1cHBvcnQgZm9yIGkzODYgYWl4IHBzLzIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICogQ2hhbmdlcyBmb3IgSUJNIEFJWCBQUy8yIGJ5IE1pbmggVHJhbi1MZSAodHJhbmxlQGludGVsbGljb3JwLmNvbSkKKyAqIFJldmlzaW9uOgkgNS1NYXktOTMgMDA6MTE6MzUKKyAqLworCisjaWZuZGVmIE5NX0kzODZBSVhfSAorI2RlZmluZSBOTV9JMzg2QUlYX0ggMQorCisvKiBjb2RlIHRvIGV4ZWN1dGUgdG8gcHJpbnQgaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgKiBmbG9hdGluZyBwb2ludCBwcm9jZXNzb3IgKGlmIGFueSkKKyAqIE5vIG5lZWQgdG8gZGVmaW5lIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCisgKi8KKyNkZWZpbmUgRkxPQVRfSU5GTyB7IGkzODZfZmxvYXRfaW5mbyAoKTsgfQorCisvKiBUaGlzIGlzIHRoZSBhbW91bnQgdG8gc3VidHJhY3QgZnJvbSB1LnVfYXIwCisgICB0byBnZXQgdGhlIG9mZnNldCBpbiB0aGUgY29yZSBmaWxlIG9mIHRoZSByZWdpc3RlciB2YWx1ZXMuICAqLworI3VuZGVmICBLRVJORUxfVV9BRERSCisjZGVmaW5lIEtFUk5FTF9VX0FERFIgMHhmMDNmZDAwMAorCisvKiBPdmVycmlkZSBjb3BpZXMgb2Yge2ZldGNoLHN0b3JlfV9pbmZlcmlvcl9yZWdpc3RlcnMgaW4gaW5mcHRyYWNlLmMuICAqLworI2RlZmluZSBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMKKworI2VuZGlmIC8qIE5NX0kzODZBSVhfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L25tLWkzODZic2QuaCBiL2dkYi9jb25maWcvaTM4Ni9ubS1pMzg2YnNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2NmYyZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9ubS1pMzg2YnNkLmgKQEAgLTAsMCArMSwzOSBAQAorLyogTmF0aXZlLWRlcGVuZGVudCBkZWZpbml0aW9ucyBmb3IgSW50ZWwgMzg2IHJ1bm5pbmcgQlNEIFVuaXgsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIE5NX0kzODZCU0RfSAorI2RlZmluZSBOTV9JMzg2QlNEX0gKKworLyogVGhpcyBpcyB0aGUgYW1vdW50IHRvIHN1YnRyYWN0IGZyb20gdS51X2FyMAorICAgdG8gZ2V0IHRoZSBvZmZzZXQgaW4gdGhlIGNvcmUgZmlsZSBvZiB0aGUgcmVnaXN0ZXIgdmFsdWVzLiAgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgorI2RlZmluZSBLRVJORUxfVV9BRERSIFVTUlNUQUNLCisKKyN1bmRlZiBGTE9BVF9JTkZPCS8qIE5vIGZsb2F0IGluZm8geWV0ICovCisKKyNkZWZpbmUgUkVHSVNURVJfVV9BRERSKGFkZHIsIGJsb2NrZW5kLCByZWdubykgXAorCShhZGRyKSA9IGkzODZfcmVnaXN0ZXJfdV9hZGRyICgoYmxvY2tlbmQpLChyZWdubykpOworCitleHRlcm4gaW50CitpMzg2X3JlZ2lzdGVyX3VfYWRkciBQQVJBTVMgKChpbnQsIGludCkpOworCisjZGVmaW5lIFBUUkFDRV9BUkczX1RZUEUgY2hhcioKKworI2VuZGlmIC8qIE5NX0kzODZCU0RfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L25tLWkzODZseW54LmggYi9nZGIvY29uZmlnL2kzODYvbm0taTM4Nmx5bnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjk4MjFmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L25tLWkzODZseW54LmgKQEAgLTAsMCArMSwyNSBAQAorLyogTmF0aXZlLWRlcGVuZGVudCBkZWZpbml0aW9ucyBmb3IgSW50ZWwgMzg2IHJ1bm5pbmcgTHlueE9TLgorICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBOTV9JMzg2TFlOWF9ICisjZGVmaW5lIE5NX0kzODZMWU5YX0gKKworI2luY2x1ZGUgIm5tLWx5bnguaCIKKworI2VuZGlmIC8qIE5NX0kzODZMWU5YX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9ubS1pMzg2bWFjaC5oIGIvZ2RiL2NvbmZpZy9pMzg2L25tLWkzODZtYWNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAxZDJiMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9ubS1pMzg2bWFjaC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIE5hdGl2ZSBkZWZpbml0aW9ucyBmb3IgTWFjaCBvbiBhbiBJbnRlbCAzODYKKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBEbyBpbXBsZW1lbnQgdGhlIGF0dGFjaCBhbmQgZGV0YWNoIGNvbW1hbmRzLiAgKi8KKy8qICNkZWZpbmUgQVRUQUNIX0RFVEFDSAkxICovCisKKy8qIE92ZXJyaWRlIGNvcGllcyBvZiB7ZmV0Y2gsc3RvcmV9X2luZmVyaW9yX3JlZ2lzdGVycyBpbiBpbmZwdHJhY2UuYy4gICovCisjZGVmaW5lIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUworCisjZGVmaW5lIENISUxEX1BSRVBBUkVfVE9fU1RPUkUoKSByZWFkX3JlZ2lzdGVyX2J5dGVzICgwLCBOVUxMLCBSRUdJU1RFUl9CWVRFUykKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9ubS1pMzg2c2NvLmggYi9nZGIvY29uZmlnL2kzODYvbm0taTM4NnNjby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYWI2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvbm0taTM4NnNjby5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIE5hdGl2ZSBzdXBwb3J0IGZvciBpMzg2LgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDaGFuZ2VzIGZvciA4MDM4NiBieSBQYWNlIFdpbGxpc3NvbiAocGFjZUBwcmVwLmFpLm1pdC5lZHUpLCBKdWx5IDE5ODguCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmIDAKKy8qIGNvZGUgdG8gZXhlY3V0ZSB0byBwcmludCBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgIGZsb2F0aW5nIHBvaW50IHByb2Nlc3NvciAoaWYgYW55KQorICAgTm8gbmVlZCB0byBkZWZpbmUgaWYgdGhlcmUgaXMgbm90aGluZyB0byBkby4KKyAgIE9uIHRoZSAzODYsIHVuZm9ydHVuYXRlbHkgdGhpcyBjb2RlIGlzIGhvc3QtZGVwZW5kZW50IChhbmQgbGl2ZXMKKyAgIGluIHRoZSBpMzg2LXhkZXAuYyBmaWxlKSwgc28gd2UgY2FuJ3QKKyAgIGRvIHRoaXMgdW5sZXNzIHdlICprbm93KiB3ZSBhcmVuJ3QgY3Jvc3MtZGVidWdnaW5nLiAgRklYTUUuCisgKi8KKyNkZWZpbmUgRkxPQVRfSU5GTyB7IGkzODZfZmxvYXRfaW5mbyAoKTsgfQorI2VuZGlmIC8qMCovCisKKyNkZWZpbmUgUkVHSVNURVJfVV9BRERSKGFkZHIsIGJsb2NrZW5kLCByZWdubykgXAorCShhZGRyKSA9IGkzODZfcmVnaXN0ZXJfdV9hZGRyICgoYmxvY2tlbmQpLChyZWdubykpOworCitleHRlcm4gaW50CitpMzg2X3JlZ2lzdGVyX3VfYWRkciBQQVJBTVMgKChpbnQsIGludCkpOworCisvKiBXaGVuIGNhbGxpbmcgZnVuY3Rpb25zIG9uIFNDTywgc29tZXRpbWVzIHdlIGdldCBhbiBlcnJvciB3cml0aW5nIHNvbWUKKyAgIG9mIHRoZSBzZWdtZW50IHJlZ2lzdGVycy4gIFRoaXMgd291bGQgYXBwZWFyIHRvIGJlIGEga2VybmVsCisgICBidWcvbm9uLWZlYXR1cmUuICAqLworI2RlZmluZSBDQU5OT1RfU1RPUkVfUkVHSVNURVIocmVnbm8pICgocmVnbm8pID09IDE0IHx8IChyZWdubykgPT0gMTUpCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvbm0taTM4NnNjbzQuaCBiL2dkYi9jb25maWcvaTM4Ni9ubS1pMzg2c2NvNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZGFlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvbm0taTM4NnNjbzQuaApAQCAtMCwwICsxLDMyIEBACisvKiBOYXRpdmUgc3VwcG9ydCBmb3IgU0NPIDMuMnY0LgorICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4gIEJ5IElhbiBMYW5jZSBUYXlsb3IKKyAgIDxpYW5AY3lnbnVzLmNvbT4gYmFzZWQgb24gd29yayBieSBNYXJ0aW4gV2Fsa2VyIDxtYXdAbmV0Y29tLmNvbT4uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogU0NPIDMuMnY0IGlzIGFjdHVhbGx5IGp1c3QgbGlrZSBTQ08gMy4ydjIsIGV4Y2VwdCB0aGF0IGl0CisgICBhZGRpdGlvbmFsbHkgc3VwcG9ydHMgYXR0YWNoaW5nIHRvIGEgcHJvY2Vzcy4gICovCisKKyNpbmNsdWRlICJpMzg2L25tLWkzODZzY28uaCIKKworI2RlZmluZSBBVFRBQ0hfREVUQUNICisKKy8qIFNDTywgaW4gaXRzIHdpc2RvbSwgZG9lcyBub3QgcHJvdmlkZSA8c3lzL3B0cmFjZS5oPi4gIGluZnB0cmFjZS5jCisgICBkb2VzIG5vdCBoYXZlIGRlZmF1bHRzIGZvciB0aGVzZSB2YWx1ZXMuICAqLworI2RlZmluZSBQVFJBQ0VfQVRUQUNIIDEwCisjZGVmaW5lIFBUUkFDRV9ERVRBQ0ggMTEKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9ubS1pMzg2c2NvNS5oIGIvZ2RiL2NvbmZpZy9pMzg2L25tLWkzODZzY281LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlNzQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9ubS1pMzg2c2NvNS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qIE5hdGl2ZSBzdXBwb3J0IGZvciBTQ08gT3BlblNlcnZlciA1CisgICBDb3B5cmlnaHQgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFJlLXdyaXR0ZW4gYnkgSi4gS2VhbiBKb2huc3RvbiA8amtqQHNjby5jb20+LgorICAgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFJvYmVydCBMaXBlIDxyb2JlcnRsQGRnaWkuY29tPiwgYmFzZWQgb24gCisgICB3b3JrIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPiBhbmQgCisgICBNYXJ0aW4gV2Fsa2VyIDxtYXdAbmV0Y29tLmNvbT4uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCisKKy8qIEJhc2ljYWxseSwgaXRzIGEgbG90IGxpa2UgdGhlIG9sZGVyIHZlcnNpb25zIC4uLiAqLworI2luY2x1ZGUgImkzODYvbm0taTM4NnNjby5oIgorCisvKiAuLi4gYnV0IGl0IGNhbiBkbyBhIGxvdCBvZiBTVlI0IHR5cGUgc3R1ZmYgdG9vLiAqLworI2RlZmluZSBTVlI0X1NIQVJFRF9MSUJTCisjaW5jbHVkZSAic29saWIuaCIgLyogUGljayB1cCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0ICovCisKKyNkZWZpbmUgQVRUQUNIX0RFVEFDSAorCisvKiBTQ08gZG9lcyBub3QgcHJvdmlkZSA8c3lzL3B0cmFjZS5oPi4gIGluZnB0cmFjZS5jIGRvZXMgbm90IAorICAgaGF2ZSBkZWZhdWx0cyBmb3IgdGhlc2UgdmFsdWVzLiAgKi8KKworI2RlZmluZSBQVFJBQ0VfQVRUQUNIIDEwCisjZGVmaW5lIFBUUkFDRV9ERVRBQ0ggMTEKKworCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvbm0taTM4NnNvbDIuaCBiL2dkYi9jb25maWcvaTM4Ni9ubS1pMzg2c29sMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZTk2NmMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvbm0taTM4NnNvbDIuaApAQCAtMCwwICsxLDM1IEBACisvKiBOYXRpdmUgc3VwcG9ydCBmb3IgaTM4NiBydW5uaW5nIFNvbGFyaXMgMi4KKyAgIENvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJubS1zeXN2NC5oIgorCisjaWZkZWYgSEFWRV9USFJFQURfREJfTElCCisKKyNpZmRlZiBfX1NURENfXworc3RydWN0IG9iamZpbGU7CisjZW5kaWYKKworI2RlZmluZSB0YXJnZXRfbmV3X29iamZpbGUoT0JKRklMRSkgc29sX3RocmVhZF9uZXdfb2JqZmlsZSAoT0JKRklMRSkKKwordm9pZCBzb2xfdGhyZWFkX25ld19vYmpmaWxlIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlKSk7CisKKyNkZWZpbmUgRklORF9ORVdfVEhSRUFEUyBzb2xfZmluZF9uZXdfdGhyZWFkcwordm9pZCBzb2xfZmluZF9uZXdfdGhyZWFkcyBQQVJBTVMgKCh2b2lkKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L25tLWkzODZ2LmggYi9nZGIvY29uZmlnL2kzODYvbm0taTM4NnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTY4NzdlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L25tLWkzODZ2LmgKQEAgLTAsMCArMSwzNiBAQAorLyogTmF0aXZlIHN1cHBvcnQgZm9yIGkzODYuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENoYW5nZXMgZm9yIDgwMzg2IGJ5IFBhY2UgV2lsbGlzc29uIChwYWNlQHByZXAuYWkubWl0LmVkdSksIEp1bHkgMTk4OC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWYgMAorLyogY29kZSB0byBleGVjdXRlIHRvIHByaW50IGludGVyZXN0aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgZmxvYXRpbmcgcG9pbnQgcHJvY2Vzc29yIChpZiBhbnkpCisgICBObyBuZWVkIHRvIGRlZmluZSBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLgorICAgT24gdGhlIDM4NiwgdW5mb3J0dW5hdGVseSB0aGlzIGNvZGUgaXMgaG9zdC1kZXBlbmRlbnQgKGFuZCBsaXZlcworICAgaW4gdGhlIGkzODYteGRlcC5jIGZpbGUpLCBzbyB3ZSBjYW4ndAorICAgZG8gdGhpcyB1bmxlc3Mgd2UgKmtub3cqIHdlIGFyZW4ndCBjcm9zcy1kZWJ1Z2dpbmcuICBGSVhNRS4KKyAqLworI2RlZmluZSBGTE9BVF9JTkZPIHsgaTM4Nl9mbG9hdF9pbmZvICgpOyB9CisjZW5kaWYgLyowKi8KKworI2RlZmluZSBSRUdJU1RFUl9VX0FERFIoYWRkciwgYmxvY2tlbmQsIHJlZ25vKSBcCisJKGFkZHIpID0gaTM4Nl9yZWdpc3Rlcl91X2FkZHIgKChibG9ja2VuZCksKHJlZ25vKSk7CisKK2V4dGVybiBpbnQKK2kzODZfcmVnaXN0ZXJfdV9hZGRyIFBBUkFNUyAoKGludCwgaW50KSk7CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvbm0taTM4NnY0LmggYi9nZGIvY29uZmlnL2kzODYvbm0taTM4NnY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyMmE0MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9ubS1pMzg2djQuaApAQCAtMCwwICsxLDI0IEBACisvKiBOYXRpdmUgc3VwcG9ydCBmb3IgaTM4NiBydW5uaW5nIFNWUjQuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MiwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENoYW5nZXMgZm9yIDgwMzg2IGJ5IFBhY2UgV2lsbGlzc29uIChwYWNlQHByZXAuYWkubWl0LmVkdSksIEp1bHkgMTk4OC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAibm0tc3lzdjQuaCIKKworLyogUG9sbCBjYXVzZXMgR0RCIHRvIGhhbmcsIGF0IGxlYXN0IHVuZGVyIFVuaXh3YXJlIDEuMS4yLiAgKi8KKyNkZWZpbmUgTE9TSU5HX1BPTEwKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9ubS1pMzg2djQybXAuaCBiL2dkYi9jb25maWcvaTM4Ni9ubS1pMzg2djQybXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmZkMTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L25tLWkzODZ2NDJtcC5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qIE5hdGl2ZSBzdXBwb3J0IGZvciBpMzg2IHJ1bm5pbmcgU1ZSNC4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkyLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ2hhbmdlcyBmb3IgODAzODYgYnkgUGFjZSBXaWxsaXNzb24gKHBhY2VAcHJlcC5haS5taXQuZWR1KSwgSnVseSAxOTg4LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJubS1zeXN2NC5oIgorCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvbm0tbGludXguaCBiL2dkYi9jb25maWcvaTM4Ni9ubS1saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMGI4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvbm0tbGludXguaApAQCAtMCwwICsxLDczIEBACisvKiBOYXRpdmUgc3VwcG9ydCBmb3IgR05VL0xpbnV4LCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5LCAxOTkyLCAxOTk2LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIE5NX0xJTlVYX0gKKyNkZWZpbmUgTk1fTElOVVhfSAorCisjaW5jbHVkZSAiaTM4Ni9ubS1pMzg2di5oIgorCisvKiBSZXR1cm4gc2l6ZW9mIHVzZXIgc3RydWN0IHRvIGNhbGxlcnMgaW4gbGVzcyBtYWNoaW5lIGRlcGVuZGVudCByb3V0aW5lcyAqLworCisjZGVmaW5lIEtFUk5FTF9VX1NJWkUga2VybmVsX3Vfc2l6ZSgpCitleHRlcm4gaW50IGtlcm5lbF91X3NpemUgUEFSQU1TICgodm9pZCkpOworCisvKiBUZWxsIGdkYiB0aGF0IHdlIGNhbiBhdHRhY2ggYW5kIGRldGFjaCBvdGhlciBwcm9jZXNzZXMgKi8KKyNkZWZpbmUgQVRUQUNIX0RFVEFDSAorCisjZGVmaW5lIFVfUkVHU19PRkZTRVQgMAorCisvKiBHTlUvTGludXggc3VwcG9ydHMgdGhlIDM4NiBoYXJkd2FyZSBkZWJ1Z2dpbmcgcmVnaXN0ZXJzLiAgKi8KKworI2RlZmluZSBUQVJHRVRfSEFTX0hBUkRXQVJFX1dBVENIUE9JTlRTCisKKyNkZWZpbmUgVEFSR0VUX0NBTl9VU0VfSEFSRFdBUkVfV0FUQ0hQT0lOVCh0eXBlLCBjbnQsIG90KSAxCisKKy8qIEFmdGVyIGEgd2F0Y2hwb2ludCB0cmFwLCB0aGUgUEMgcG9pbnRzIHRvIHRoZSBpbnN0cnVjdGlvbiBhZnRlcgorICAgdGhlIG9uZSB0aGF0IGNhdXNlZCB0aGUgdHJhcC4gIFRoZXJlZm9yZSB3ZSBkb24ndCBuZWVkIHRvIHN0ZXAgb3ZlciBpdC4KKyAgIEJ1dCB3ZSBkbyBuZWVkIHRvIHJlc2V0IHRoZSBzdGF0dXMgcmVnaXN0ZXIgdG8gYXZvaWQgYW5vdGhlciB0cmFwLiAgKi8KKyNkZWZpbmUgSEFWRV9DT05USU5VQUJMRV9XQVRDSFBPSU5UCisKKyNkZWZpbmUgU1RPUFBFRF9CWV9XQVRDSFBPSU5UKFcpICBcCisgIGkzODZfc3RvcHBlZF9ieV93YXRjaHBvaW50IChpbmZlcmlvcl9waWQpCisKKy8qIFVzZSB0aGVzZSBtYWNyb3MgZm9yIHdhdGNocG9pbnQgaW5zZXJ0aW9uL3JlbW92YWwuICAqLworCisjZGVmaW5lIHRhcmdldF9pbnNlcnRfd2F0Y2hwb2ludChhZGRyLCBsZW4sIHR5cGUpICBcCisgIGkzODZfaW5zZXJ0X3dhdGNocG9pbnQgKGluZmVyaW9yX3BpZCwgYWRkciwgbGVuLCB0eXBlKQorCisjZGVmaW5lIHRhcmdldF9yZW1vdmVfd2F0Y2hwb2ludChhZGRyLCBsZW4sIHR5cGUpICBcCisgIGkzODZfcmVtb3ZlX3dhdGNocG9pbnQgKGluZmVyaW9yX3BpZCwgYWRkciwgbGVuKQorCisvKiBXZSBkZWZpbmUgdGhpcyBpZiBsaW5rLmggaXMgYXZhaWxhYmxlLCBiZWNhdXNlIHdpdGggRUxGIHdlIHVzZSBTVlI0IHN0eWxlCisgICBzaGFyZWQgbGlicmFyaWVzLiAqLworCisjaWZkZWYgSEFWRV9MSU5LX0gKKyNkZWZpbmUgU1ZSNF9TSEFSRURfTElCUworI2luY2x1ZGUgInNvbGliLmgiCQkvKiBTdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzLiAqLworI2VuZGlmCisKK2V4dGVybiBDT1JFX0FERFIKK2kzODZfc3RvcHBlZF9ieV93YXRjaHBvaW50IFBBUkFNUyAoKGludCkpOworZXh0ZXJuIGludAoraTM4Nl9pbnNlcnRfd2F0Y2hwb2ludCBQQVJBTVMgKChpbnQgcGlkLCBDT1JFX0FERFIgYWRkciwgaW50IGxlbiwgaW50IHJ3KSk7CitleHRlcm4gaW50CitpMzg2X3JlbW92ZV93YXRjaHBvaW50IFBBUkFNUyAoKGludCBwaWQsIENPUkVfQUREUiBhZGRyLCBpbnQgbGVuKSk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIE5NX0xJTlVYX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9ubS1tMy5oIGIvZ2RiL2NvbmZpZy9pMzg2L25tLW0zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyNzA5MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9ubS1tMy5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qIE5hdGl2ZS1kZXBlbmRlbnQgZGVmaW5pdGlvbnMgZm9yIEludGVsIDM4NiBydW5uaW5nIE1hY2ggMy4KKyAgIENvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEluY2x1ZGUgdGhlIGdlbmVyaWMgTWFjaCAzIGRlZmluaXRpb25zLiAgKi8KKworI2luY2x1ZGUgIm5tLW0zLmgiCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvbm0tbmJzZC5oIGIvZ2RiL2NvbmZpZy9pMzg2L25tLW5ic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTlmZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L25tLW5ic2QuaApAQCAtMCwwICsxLDM0IEBACisvKiBOYXRpdmUtZGVwZW5kZW50IGRlZmluaXRpb25zIGZvciBJbnRlbCAzODYgcnVubmluZyBOZXRCU0QsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MiwgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIE5NX05CU0RfSAorI2RlZmluZSBOTV9OQlNEX0gKKworLyogR2V0IGdlbmVyaWMgTmV0QlNEIG5hdGl2ZSBkZWZpbml0aW9ucy4gKi8KKyNpbmNsdWRlICJubS1uYnNkLmgiCisKKy8qICNkZWZpbmUgRkxPQVRfSU5GTwl7IGkzODZfZmxvYXRfaW5mbygpOyB9ICovCisKKyNkZWZpbmUgUkVHSVNURVJfVV9BRERSKGFkZHIsIGJsb2NrZW5kLCByZWdubykgXAorCShhZGRyKSA9IGkzODZfcmVnaXN0ZXJfdV9hZGRyICgoYmxvY2tlbmQpLChyZWdubykpOworCitleHRlcm4gaW50CitpMzg2X3JlZ2lzdGVyX3VfYWRkciBQQVJBTVMgKChpbnQsIGludCkpOworCisjZW5kaWYgLyogTk1fTkJTRF9IICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvbm0tcHR4NC5oIGIvZ2RiL2NvbmZpZy9pMzg2L25tLXB0eDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTZjZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L25tLXB0eDQuaApAQCAtMCwwICsxLDYyIEBACisvKiBEZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gYSBTZXF1ZW50IFN5bW1ldHJ5IHVuZGVyIHB0eAorICAgd2l0aCBXZWl0ZWsgMTE2NyBhbmQgaTM4NyBzdXBwb3J0LgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTIgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJubS1zeXN2NC5oIgorCisjdW5kZWYgVVNFX1BST0NfRlMKKworI2luY2x1ZGUgIm5tLXN5bW1ldHJ5LmgiCisKKyNkZWZpbmUgUFRSQUNFX1JFQURfUkVHUyhwaWQscmVnYWRkcikgbXB0cmFjZSAoWFBUX1JSRUdTLCAocGlkKSwgKHJlZ2FkZHIpLCAwKQorI2RlZmluZSBQVFJBQ0VfV1JJVEVfUkVHUyhwaWQscmVnYWRkcikgXAorICBtcHRyYWNlIChYUFRfV1JFR1MsIChwaWQpLCAocmVnYWRkciksIDApCisKKy8qIE92ZXJyaWRlIGNvcGllcyBvZiB7ZmV0Y2gsc3RvcmV9X2luZmVyaW9yX3JlZ2lzdGVycyBpbiBpbmZwdHJhY2UuYy4gICovCisKKyNkZWZpbmUgRkVUQ0hfSU5GRVJJT1JfUkVHSVNURVJTCisKKy8qIFdlIG11c3QgZmV0Y2ggYWxsIHRoZSByZWdzIGJlZm9yZSBzdG9yaW5nLCBzaW5jZSB3ZSBzdG9yZSBhbGwgYXQgb25jZS4gICovCisKKyNkZWZpbmUgQ0hJTERfUFJFUEFSRV9UT19TVE9SRSgpIHJlYWRfcmVnaXN0ZXJfYnl0ZXMgKDAsIE5VTEwsIFJFR0lTVEVSX0JZVEVTKQorCisjZGVmaW5lIENISUxEX1dBSVQKK3N0cnVjdCB0YXJnZXRfd2FpdHN0YXR1czsKK2V4dGVybiBpbnQgY2hpbGRfd2FpdCBQQVJBTVMgKChpbnQsIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqKSk7CisKKy8qCisgKiBwdHggZG9lcyBhdHRhY2ggYXMgb2YgcHR4IHZlcnNpb24gMi4xLiAgUHJpb3IgdG8gdGhhdCwgdGhlIGludGVyZmFjZQorICogZXhpc3RzIGJ1dCBkb2VzIG5vdCB3b3JrLgorICoKKyAqIEZJWE1FOiBVc2luZyBhdHRhY2gvZGV0YWNoIHJlcXVpcmVzIHVzaW5nIHRoZSBwdHggTVBERUJVR0dFUgorICogaW50ZXJmYWNlLiAgVGhlcmUgYXJlIHN0aWxsIHByb2JsZW1zIHdpdGggdGhhdCwgc28gZm9yIG5vdyBkb24ndAorICogZW5hYmxlIGF0dGFjaC9kZXRhY2guICBJZiB5b3UgdHVybiBpdCBvbiBhbnl3YXksIGl0IHdpbGwgbW9zdGx5CisgKiB3b3JrLCBidXQgaGFzIGEgbnVtYmVyIG9mIGJ1Z3MuIC1mdWJhciwgMi85NC4KKyAqLworLyojZGVmaW5lIEFUVEFDSF9ERVRBQ0ggMSovCisjdW5kZWYgQVRUQUNIX0RFVEFDSAorI2RlZmluZSBQVFJBQ0VfQVRUQUNIIFhQVF9ERUJVRworI2RlZmluZSBQVFJBQ0VfREVUQUNIIFhQVF9VTkRFQlVHCisvKgorICogVGhlIGZvbGxvd2luZyBkcml2ZWwgaXMgbmVlZGVkIGJlY2F1c2UgdGhlcmUgYXJlIHR3byBwdHJhY2UtaXNoCisgKiBjYWxscyBvbiBwdHg6IHB0cmFjZSgpIGFuZCBtcHRyYWNlKCksIGVhY2ggb2Ygd2hpY2ggZG9lcyBhYm91dCBoYWxmCisgKiBvZiB0aGUgcHRyYWNlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBQVFJBQ0VfQVRUQUNIX0NBTEwocGlkKSAgcHR4X2RvX2F0dGFjaChwaWQpCisjZGVmaW5lIFBUUkFDRV9ERVRBQ0hfQ0FMTChwaWQsIHNpZ25vKSBwdHhfZG9fZGV0YWNoKHBpZCwgc2lnbm8pCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvbm0tc3VuMzg2LmggYi9nZGIvY29uZmlnL2kzODYvbm0tc3VuMzg2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhOTA0YgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9ubS1zdW4zODYuaApAQCAtMCwwICsxLDI3IEBACisvKiBOYXRpdmUgc3VwcG9ydCBmb3IgU3VuIDM4NmksIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogRG8gaW1wbGVtZW50IHRoZSBhdHRhY2ggYW5kIGRldGFjaCBjb21tYW5kcy4gICovCisKKyNkZWZpbmUgQVRUQUNIX0RFVEFDSAorCisvKiBPdmVycmlkZSBjb3BpZXMgb2Yge2ZldGNoLHN0b3JlfV9pbmZlcmlvcl9yZWdpc3RlcnMgaW4gaW5mcHRyYWNlLmMuICAqLworI2RlZmluZSBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMKKworI2RlZmluZSBDSElMRF9QUkVQQVJFX1RPX1NUT1JFKCkgcmVhZF9yZWdpc3Rlcl9ieXRlcyAoMCwgTlVMTCwgUkVHSVNURVJfQllURVMpCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvbm0tc3ltbWV0cnkuaCBiL2dkYi9jb25maWcvaTM4Ni9ubS1zeW1tZXRyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwY2YwOTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvbm0tc3ltbWV0cnkuaApAQCAtMCwwICsxLDQ2IEBACisvKiBEZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gYSBTZXF1ZW50IFN5bW1ldHJ5IHVuZGVyIGR5bml4IDMuMCwKKyAgIHdpdGggV2VpdGVrIDExNjcgYW5kIGkzODcgc3VwcG9ydC4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBPdmVycmlkZSBjb3BpZXMgb2Yge2ZldGNoLHN0b3JlfV9pbmZlcmlvcl9yZWdpc3RlcnMgaW4gaW5mcHRyYWNlLmMuICAqLworCisjZGVmaW5lIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUworCisvKiBXZSBtdXN0IGZldGNoIGFsbCB0aGUgcmVncyBiZWZvcmUgc3RvcmluZywgc2luY2Ugd2Ugc3RvcmUgYWxsIGF0IG9uY2UuICAqLworCisjZGVmaW5lIENISUxEX1BSRVBBUkVfVE9fU1RPUkUoKSByZWFkX3JlZ2lzdGVyX2J5dGVzICgwLCBOVUxMLCBSRUdJU1RFUl9CWVRFUykKKworI2lmZGVmIF9TRVFVRU5UXworI2RlZmluZSBDSElMRF9XQUlUCitleHRlcm4gaW50IGNoaWxkX3dhaXQgUEFSQU1TICgoaW50LCBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKikpOworI2VuZGlmCisKKy8qIFRoaXMgaXMgdGhlIGFtb3VudCB0byBzdWJ0cmFjdCBmcm9tIHUudV9hcjAKKyAgIHRvIGdldCB0aGUgb2Zmc2V0IGluIHRoZSBjb3JlIGZpbGUgb2YgdGhlIHJlZ2lzdGVyIHZhbHVlcy4gICovCisKKyNpZmRlZiBfU0VRVUVOVF8KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvdXNlci5oPgorI2luY2x1ZGUgPHN5cy9tY192bXBhcmFtLmg+CisvKiBWQV9VQVJFQSBpcyBkZWZpbmVkIGluIDxzeXMvbWNfdm1wYXJhbS5oPiwgYW5kIGlzIGRlcGVuZGFudCB1cG9uIAorICAgc2l6ZW9mKHN0cnVjdCB1c2VyKSAqLworI2RlZmluZSBLRVJORUxfVV9BRERSIChWQV9VQVJFQSkgLyogcHR4ICovCisjZWxzZQorI2RlZmluZSBLRVJORUxfVV9BRERSICgweDgwMDAwMDAwIC0gKFVQQUdFUyAqIE5CUEcpKQkvKiBkeW5peCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvcHR4Lm1oIGIvZ2RiL2NvbmZpZy9pMzg2L3B0eC5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjIzNTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3B0eC5taApAQCAtMCwwICsxLDcgQEAKKyMgSG9zdDogU2VxdWVudCBTeW1tZXRyeSBydW5uaW5nIHB0eCAxLjMsIHdpdGggV2VpdGVrIDExNjcgb3IgaTM4NworCitYTV9GSUxFPSB4bS1wdHguaAorWERFUEZJTEVTPSBpbmZ0YXJnLm8gZm9yay1jaGlsZC5vIHN5bW0tbmF0Lm8gY29yZWxvdy5vIGNvcmUtYW91dC5vCitYTV9DTElCUz0gLWxQVyAtbHNlcQorCitOQVRfRklMRT0gbm0tc3ltbWV0cnkuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3B0eC5tdCBiL2dkYi9jb25maWcvaTM4Ni9wdHgubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3ZGYzMwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9wdHgubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogU2VxdWVudCBTeW1tZXRyeSBydW5uaW5nIHB0eCAyLjAsIHdpdGggV2VpdGVrIDExNjcgb3IgaTM4Ny4KK1RERVBGSUxFUz0gc3ltbS10ZGVwLm8gaTM4Ny10ZGVwLm8gaTM4Ni10ZGVwLm8KK1RNX0ZJTEU9IHRtLXB0eC5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvcHR4NC5taCBiL2dkYi9jb25maWcvaTM4Ni9wdHg0Lm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOWQxMWIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvcHR4NC5taApAQCAtMCwwICsxLDcgQEAKKyMgSG9zdDogU2VxdWVudCBTeW1tZXRyeSBydW5uaW5nIHB0eCAxLjMsIHdpdGggV2VpdGVrIDExNjcgb3IgaTM4NworCitYTV9GSUxFPSB4bS1wdHg0LmgKK1hERVBGSUxFUz0gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBzeW1tLW5hdC5vIGNvcmVsb3cubyBjb3JlLWFvdXQubyBzb2xpYi5vIGNvcmUtcmVnc2V0Lm8KK1hNX0NMSUJTPSAtbHNlcQorCitOQVRfRklMRT0gbm0tcHR4NC5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvcHR4NC5tdCBiL2dkYi9jb25maWcvaTM4Ni9wdHg0Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNDc4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvcHR4NC5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBTZXF1ZW50IFN5bW1ldHJ5IHJ1bm5pbmcgcHR4IDQuMCwgd2l0aCBXZWl0ZWsgMTE2NyBvciBpMzg3LgorVERFUEZJTEVTPSBzeW1tLXRkZXAubyBpMzg3LXRkZXAubyBpMzg2LXRkZXAubworVE1fRklMRT0gdG0tcHR4NC5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvc3VuMzg2Lm1oIGIvZ2RiL2NvbmZpZy9pMzg2L3N1bjM4Ni5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjQ5NjYxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3N1bjM4Ni5taApAQCAtMCwwICsxLDUgQEAKKyMgSG9zdDogU3VuIDM4NmkKK1hERVBGSUxFUz0gCitYTV9GSUxFPSB4bS1zdW4zODYuaAorTkFUX0ZJTEU9IG5tLXN1bjM4Ni5oCitOQVRERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBzdW4zODYtbmF0Lm8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni9zdW4zODYubXQgYi9nZGIvY29uZmlnL2kzODYvc3VuMzg2Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NWNhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvc3VuMzg2Lm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IFN1biAzODZpIHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuCitUREVQRklMRVM9IGkzODYtdGRlcC5vIHNvbGliLm8KK1RNX0ZJTEU9IHRtLXN1bjM4Ni5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvc3ltbWV0cnkubWggYi9nZGIvY29uZmlnL2kzODYvc3ltbWV0cnkubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljMDViYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9zeW1tZXRyeS5taApAQCAtMCwwICsxLDUgQEAKKyMgSG9zdDogU2VxdWVudCBTeW1tZXRyeSBydW5uaW5nIER5bml4IDMuMCwgd2l0aCBXZWl0ZWsgMTE2NyBvciBpMzg3LgorWERFUEZJTEVTPQorWE1fRklMRT0geG0tc3ltbWV0cnkuaAorTkFUX0ZJTEU9IG5tLXN5bW1ldHJ5LmgKK05BVERFUEZJTEVTPSBpbmZ0YXJnLm8gZm9yay1jaGlsZC5vIGNvcmVsb3cubyBjb3JlLWFvdXQubyBzeW1tLW5hdC5vCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvc3ltbWV0cnkubXQgYi9nZGIvY29uZmlnL2kzODYvc3ltbWV0cnkubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkYmE3MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni9zeW1tZXRyeS5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBTZXF1ZW50IFN5bW1ldHJ5IHJ1bm5pbmcgRHluaXggMy4wLCB3aXRoIFdlaXRlayAxMTY3IG9yIGkzODcuCitUREVQRklMRVM9IGkzODYtdGRlcC5vIHN5bW0tdGRlcC5vIGkzODctdGRlcC5vCitUTV9GSUxFPSB0bS1zeW1tZXRyeS5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvdG0tY3lnd2luLmggYi9nZGIvY29uZmlnL2kzODYvdG0tY3lnd2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhZDg5NAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni90bS1jeWd3aW4uaApAQCAtMCwwICsxLDEyNyBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIGkzODYgcnVubmluZyB1bmRlciB0aGUgd2luMzIgQVBJIFVuaXguCisgICBDb3B5cmlnaHQgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNpbmNsdWRlICJpMzg2L3RtLWkzODZ2LmgiCisKKyN1bmRlZiBNQVhfUkVHSVNURVJfUkFXX1NJWkUKKyN1bmRlZiBNQVhfUkVHSVNURVJfVklSVFVBTF9TSVpFCisjdW5kZWYgTlVNX1JFR1MKKyN1bmRlZiBSRUdJU1RFUl9CWVRFCisjdW5kZWYgUkVHSVNURVJfQllURVMKKyN1bmRlZiBSRUdJU1RFUl9DT05WRVJUSUJMRQorI3VuZGVmIFJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXCisjdW5kZWYgUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMCisjdW5kZWYgUkVHSVNURVJfTkFNRVMKKyN1bmRlZiBSRUdJU1RFUl9SQVdfU0laRQorI3VuZGVmIFJFR0lTVEVSX1ZJUlRVQUxfU0laRQorI3VuZGVmIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRQorCisvKiBOdW1iZXIgb2YgbWFjaGluZSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBOVU1fUkVHUyAyNAorCisvKiBJbml0aWFsaXplciBmb3IgYW4gYXJyYXkgb2YgbmFtZXMgb2YgcmVnaXN0ZXJzLgorICAgVGhlcmUgc2hvdWxkIGJlIE5VTV9SRUdTIHN0cmluZ3MgaW4gdGhpcyBpbml0aWFsaXplci4gICovCisKKy8qIHRoZSBvcmRlciBvZiB0aGUgZmlyc3QgOCByZWdpc3RlcnMgbXVzdCBtYXRjaCB0aGUgY29tcGlsZXIncyAKKyAqIG51bWJlcmluZyBzY2hlbWUgKHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSAzODYgc2NoZW1lKQorICogYWxzbywgdGhpcyB0YWJsZSBtdXN0IG1hdGNoIHJlZ21hcCBpbiBpMzg2LXBpbnNuLmMuCisgKi8KKworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyB7ICJlYXgiLCAgImVjeCIsICAiZWR4IiwgICJlYngiLCAgXAorCQkJICJlc3AiLCAgImVicCIsICAiZXNpIiwgICJlZGkiLCAgXAorCQkJICJlaXAiLCAgInBzIiwgICAiY3MiLCAgICJzcyIsICAgXAorCQkJICJkcyIsICAgImVzIiwgICAiZnMiLCAgICJncyIsICAgXAorCQkJICJzdCIsICAgInN0KDEpIiwic3QoMikiLCJzdCgzKSIsXAorICAgICAgICAgICAgICAgICAgICAgICAgICJzdCg0KSIsInN0KDUpIiwic3QoNikiLCJzdCg3KSIsfQorCisjZGVmaW5lIEZQMF9SRUdOVU0gMTYKKworLyogVG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCB0byBzdG9yZSBvdXIgY29waWVzIG9mIHRoZSBtYWNoaW5lJ3MKKyAgIHJlZ2lzdGVyIHN0YXRlLCB0aGUgYXJyYXkgYHJlZ2lzdGVycycuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTICgxNiAqIDQgKyA4ICogMTApCisKKy8qIEluZGV4IHdpdGhpbiBgcmVnaXN0ZXJzJyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3BhY2UgZm9yCisgICByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9CWVRFKE4pICgoKE4pIDwgMTYpID8gKE4pICogNCA6ICgoKE4pIC0gMTYpICogMTApICsgKDE2ICogNCkpCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBhY3R1YWwgbWFjaGluZSByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pICgoKE4pIDwgMTYpID8gNCA6IDEwKQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgcHJvZ3JhbSdzIHJlcHJlc2VudGF0aW9uCisgICBmb3IgcmVnaXN0ZXIgTi4gKi8KKworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUoTikgKCgoTikgPCAxNikgPyA0IDogMTApCisKKy8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfUkFXX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9SQVdfU0laRSAxMAorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1ZJUlRVQUxfU0laRSBjYW4gaGF2ZS4gICovCisKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1ZJUlRVQUxfU0laRSAxMAorCisvKiBOb256ZXJvIGlmIHJlZ2lzdGVyIE4gcmVxdWlyZXMgY29udmVyc2lvbgorICAgZnJvbSByYXcgZm9ybWF0IHRvIHZpcnR1YWwgZm9ybWF0LiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9DT05WRVJUSUJMRShOKSBcCisgICgoTiA8IEZQMF9SRUdOVU0pID8gMCA6IDEpCisKKy8qIENvbnZlcnQgZGF0YSBmcm9tIHJhdyBmb3JtYXQgZm9yIHJlZ2lzdGVyIFJFR05VTSBpbiBidWZmZXIgRlJPTQorICAgdG8gdmlydHVhbCBmb3JtYXQgd2l0aCB0eXBlIFRZUEUgaW4gYnVmZmVyIFRPLiAgKi8KK2V4dGVybiB2b2lkCitpMzg3X3RvX2RvdWJsZSBQQVJBTVMgKChjaGFyICosIGNoYXIgKikpOworCisKKyNkZWZpbmUgUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMKFJFR05VTSxUWVBFLEZST00sVE8pIFwKK3sgXAorICBkb3VibGUgdmFsOyBcCisgIGkzODdfdG9fZG91YmxlICgoRlJPTSksIChjaGFyICopJnZhbCk7IFwKKyAgc3RvcmVfZmxvYXRpbmcgKChUTyksIFRZUEVfTEVOR1RIIChUWVBFKSwgdmFsKTsgXAorfQorCitleHRlcm4gdm9pZAorZG91YmxlX3RvX2kzODcgUEFSQU1TICgoY2hhciAqLCBjaGFyICopKTsKKworI2RlZmluZSBSRUdJU1RFUl9DT05WRVJUX1RPX1JBVyhUWVBFLFJFR05VTSxGUk9NLFRPKSBcCit7IFwKKyAgZG91YmxlIHZhbCA9IGV4dHJhY3RfZmxvYXRpbmcgKChGUk9NKSwgVFlQRV9MRU5HVEggKFRZUEUpKTsgXAorICBkb3VibGVfdG9faTM4NygoY2hhciAqKSZ2YWwsIChUTykpOyBcCit9CisKKy8qIFJldHVybiB0aGUgR0RCIHR5cGUgb2JqZWN0IGZvciB0aGUgInN0YW5kYXJkIiBkYXRhIHR5cGUKKyAgIG9mIGRhdGEgaW4gcmVnaXN0ZXIgTi4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9UWVBFKE4pIFwKKyAgKChOIDwgRlAwX1JFR05VTSkgPyBidWlsdGluX3R5cGVfaW50IDogXAorICAgYnVpbHRpbl90eXBlX2RvdWJsZSkKKworI2RlZmluZSBOQU1FU19IQVZFX1VOREVSU0NPUkUKKworI2RlZmluZSBJTl9TT0xJQl9DQUxMX1RSQU1QT0xJTkUocGMsIG5hbWUpIHNraXBfdHJhbXBvbGluZV9jb2RlIChwYywgbmFtZSkKKyNkZWZpbmUgU0tJUF9UUkFNUE9MSU5FX0NPREUocGMpICAgICAgICAgICBza2lwX3RyYW1wb2xpbmVfY29kZSAocGMsIDApCitleHRlcm4gQ09SRV9BRERSIHNraXBfdHJhbXBvbGluZV9jb2RlIFBBUkFNUyAoKENPUkVfQUREUiBwYywgY2hhciAqbmFtZSkpOworCitleHRlcm4gY2hhciAqY3lnd2luX3BpZF90b19zdHIgUEFSQU1TICgoaW50IHBpZCkpOworI2RlZmluZSB0YXJnZXRfcGlkX3RvX3N0cihQSUQpIGN5Z3dpbl9waWRfdG9fc3RyIChQSUQpCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvdG0tZmJzZC5oIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWZic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTMzZTEwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWZic2QuaApAQCAtMCwwICsxLDMyIEBACisvKiBUYXJnZXQgbWFjcm8gZGVmaW5pdGlvbnMgZm9yIGkzODYgcnVubmluZyBGcmVlQlNECisgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCisKKyNpbmNsdWRlICJpMzg2L3RtLWkzODZic2QuaCIKKworCisjdW5kZWYgTlVNX1JFR1MKKyNkZWZpbmUgTlVNX1JFR1MgMTQKKworCisjdW5kZWYgSU5fU09MSUJfQ0FMTF9UUkFNUE9MSU5FCisjZGVmaW5lIElOX1NPTElCX0NBTExfVFJBTVBPTElORShwYywgbmFtZSkgU1RSRVEgKG5hbWUsICJfRFlOQU1JQyIpCisKKworZXh0ZXJuIGkzODZfZmxvYXRfaW5mbyAoKTsKKyNkZWZpbmUgRkxPQVRfSU5GTyAgaTM4Nl9mbG9hdF9pbmZvICgpCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvdG0taTM4Ni5oIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjAzOWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODYuaApAQCAtMCwwICsxLDMwNyBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIEdEQiBvbiBhbiBJbnRlbCBpWzM0NV04Ni4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KKworI2lmbmRlZiBUTV9JMzg2X0gKKyNkZWZpbmUgVE1fSTM4Nl9IIDEKKworI2lmZGVmIF9fU1REQ19fCQkvKiBGb3J3YXJkIGRlY2wncyBmb3IgcHJvdG90eXBlcyAqLworc3RydWN0IGZyYW1lX2luZm87CitzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVnczsKK3N0cnVjdCB0eXBlOworI2VuZGlmCisKKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgorCisvKiBVc2VkIGZvciBleGFtcGxlIGluIHZhbHByaW50LmM6cHJpbnRfZmxvYXRpbmcoKSB0byBlbmFibGUgY2hlY2tpbmcKKyAgIGZvciBOYU4ncyAqLworCisjZGVmaW5lIElFRUVfRkxPQVQKKworLyogTnVtYmVyIG9mIHRyYXBzIHRoYXQgaGFwcGVuIGJldHdlZW4gZXhlYydpbmcgdGhlIHNoZWxsIHRvIHJ1biBhbgorICAgaW5mZXJpb3IsIGFuZCB3aGVuIHdlIGZpbmFsbHkgZ2V0IHRvIHRoZSBpbmZlcmlvciBjb2RlLiAgVGhpcyBpcyAyCisgICBvbiBtb3N0IGltcGxlbWVudGF0aW9ucy4gKi8KKworI2RlZmluZSBTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCAyCisKKy8qIE9mZnNldCBmcm9tIGFkZHJlc3Mgb2YgZnVuY3Rpb24gdG8gc3RhcnQgb2YgaXRzIGNvZGUuCisgICBaZXJvIG9uIG1vc3QgbWFjaGluZXMuICAqLworCisjZGVmaW5lIEZVTkNUSU9OX1NUQVJUX09GRlNFVCAwCisKKy8qIEFkdmFuY2UgUEMgYWNyb3NzIGFueSBmdW5jdGlvbiBlbnRyeSBwcm9sb2d1ZSBpbnN0cnVjdGlvbnMgdG8gcmVhY2ggc29tZQorICAgInJlYWwiIGNvZGUuICAqLworCisjZGVmaW5lIFNLSVBfUFJPTE9HVUUoZnJvbXBjKSAgIHsoZnJvbXBjKSA9IGkzODZfc2tpcF9wcm9sb2d1ZSgoZnJvbXBjKSk7fQorCitleHRlcm4gaW50IGkzODZfc2tpcF9wcm9sb2d1ZSBQQVJBTVMgKChpbnQpKTsKKworLyogSW1tZWRpYXRlbHkgYWZ0ZXIgYSBmdW5jdGlvbiBjYWxsLCByZXR1cm4gdGhlIHNhdmVkIHBjLiAgQ2FuJ3QgYWx3YXlzIGdvCisgICB0aHJvdWdoIHRoZSBmcmFtZXMgZm9yIHRoaXMgYmVjYXVzZSBvbiBzb21lIG1hY2hpbmVzIHRoZSBuZXcgZnJhbWUgaXMgbm90CisgICBzZXQgdXAgdW50aWwgdGhlIG5ldyBmdW5jdGlvbiBleGVjdXRlcyBzb21lIGluc3RydWN0aW9ucy4gICovCisKKyNkZWZpbmUgU0FWRURfUENfQUZURVJfQ0FMTChmcmFtZSkgKHJlYWRfbWVtb3J5X2ludGVnZXIgKHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSksIDQpKQorCisvKiBTdGFjayBncm93cyBkb3dud2FyZC4gICovCisKKyNkZWZpbmUgSU5ORVJfVEhBTihsaHMscmhzKSAoKGxocykgPCAocmhzKSkKKworLyogU2VxdWVuY2Ugb2YgYnl0ZXMgZm9yIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uICAqLworCisjZGVmaW5lIEJSRUFLUE9JTlQgezB4Y2N9CisKKy8qIEFtb3VudCBQQyBtdXN0IGJlIGRlY3JlbWVudGVkIGJ5IGFmdGVyIGEgYnJlYWtwb2ludC4gIFRoaXMgaXMgb2Z0ZW4gdGhlCisgICBudW1iZXIgb2YgYnl0ZXMgaW4gQlJFQUtQT0lOVCBidXQgbm90IGFsd2F5cy4gKi8KKworI2RlZmluZSBERUNSX1BDX0FGVEVSX0JSRUFLIDEKKworLyogU2F5IGhvdyBsb25nIChvcmRpbmFyeSkgcmVnaXN0ZXJzIGFyZS4gIFRoaXMgaXMgYSBwaWVjZSBvZiBib2dvc2l0eQorICAgdXNlZCBpbiBwdXNoX3dvcmQgYW5kIGEgZmV3IG90aGVyIHBsYWNlczsgUkVHSVNURVJfUkFXX1NJWkUgaXMgdGhlCisgICByZWFsIHdheSB0byBrbm93IGhvdyBiaWcgYSByZWdpc3RlciBpcy4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfU0laRSA0CisKKy8qIE51bWJlciBvZiBtYWNoaW5lIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIE5VTV9GUkVHUyAwIC8qOCovCQkvKiBOdW1iZXIgb2YgRlAgcmVncyAqLworI2RlZmluZSBOVU1fUkVHUyAoMTYgKyBOVU1fRlJFR1MpCS8qIEJhc2ljIGkqODYgcmVncyArIEZQIHJlZ3MgKi8KKworLyogSW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIG5hbWVzIG9mIHJlZ2lzdGVycy4gIFRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdAorICAgTlVNX1JFR1Mgc3RyaW5ncyBpbiB0aGlzIGluaXRpYWxpemVyLiAgQW55IGV4Y2VzcyBvbmVzIGFyZSBzaW1wbHkgaWdub3JlZC4KKyAgIFRoZSBvcmRlciBvZiB0aGUgZmlyc3QgOCByZWdpc3RlcnMgbXVzdCBtYXRjaCB0aGUgY29tcGlsZXIncyBudW1iZXJpbmcKKyAgIHNjaGVtZSAod2hpY2ggaXMgdGhlIHNhbWUgYXMgdGhlIDM4NiBzY2hlbWUpIGFuZCBhbHNvIHJlZ21hcCBpbiB0aGUgdmFyaW91cworICAgKi1uYXQuYyBmaWxlcy4gKi8KKworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyB7ICJlYXgiLCAgICJlY3giLCAgICAiZWR4IiwgICAiZWJ4IiwgXAorCQkJICJlc3AiLCAgICJlYnAiLCAgICAiZXNpIiwgICAiZWRpIiwgXAorCQkJICJlaXAiLCAgICJlZmxhZ3MiLCAiY3MiLCAgICAic3MiLCBcCisJCQkgImRzIiwgICAgImVzIiwgICAgICJmcyIsICAgICJncyIsIFwKKwkJCSAic3QwIiwgICAic3QxIiwgICAgInN0MiIsICAgInN0MyIsIFwKKwkJCSAic3Q0IiwgICAic3Q1IiwgICAgInN0NiIsICAgInN0NyIsIFwKKwkJCSB9CisKKy8qIFJlZ2lzdGVyIG51bWJlcnMgb2YgdmFyaW91cyBpbXBvcnRhbnQgcmVnaXN0ZXJzLgorICAgTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2UgdmFsdWVzIGFyZSAicmVhbCIgcmVnaXN0ZXIgbnVtYmVycywKKyAgIGFuZCBjb3JyZXNwb25kIHRvIHRoZSBnZW5lcmFsIHJlZ2lzdGVycyBvZiB0aGUgbWFjaGluZSwKKyAgIGFuZCBzb21lIGFyZSAicGhvbnkiIHJlZ2lzdGVyIG51bWJlcnMgd2hpY2ggYXJlIHRvbyBsYXJnZQorICAgdG8gYmUgYWN0dWFsIHJlZ2lzdGVyIG51bWJlcnMgYXMgZmFyIGFzIHRoZSB1c2VyIGlzIGNvbmNlcm5lZAorICAgYnV0IGRvIHNlcnZlIHRvIGdldCB0aGUgZGVzaXJlZCB2YWx1ZXMgd2hlbiBwYXNzZWQgdG8gcmVhZF9yZWdpc3Rlci4gICovCisKKyNkZWZpbmUgRlBfUkVHTlVNIDUJLyogKGVicCkgQ29udGFpbnMgYWRkcmVzcyBvZiBleGVjdXRpbmcgc3RhY2sgZnJhbWUgKi8KKyNkZWZpbmUgU1BfUkVHTlVNIDQJLyogKHVzcCkgQ29udGFpbnMgYWRkcmVzcyBvZiB0b3Agb2Ygc3RhY2sgKi8KKyNkZWZpbmUgUENfUkVHTlVNIDgJLyogKGVpcCkgQ29udGFpbnMgcHJvZ3JhbSBjb3VudGVyICovCisjZGVmaW5lIFBTX1JFR05VTSA5CS8qIChwcykgIENvbnRhaW5zIHByb2Nlc3NvciBzdGF0dXMgKi8KKworI2RlZmluZSBGUDBfUkVHTlVNIDE2ICAgLyogKHN0MCkgMzg3IHJlZ2lzdGVyICovCisjZGVmaW5lIEZQQ19SRUdOVU0gMjUJLyogODAzODcgY29udHJvbCByZWdpc3RlciAqLworCisvKiBUb3RhbCBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIHRvIHN0b3JlIG91ciBjb3BpZXMgb2YgdGhlIG1hY2hpbmUncyByZWdpc3RlcgorICAgc3RhdGUsIHRoZSBhcnJheSBgcmVnaXN0ZXJzJy4gKi8KKworI2RlZmluZSBSRUdJU1RFUl9CWVRFUyAoKE5VTV9SRUdTIC0gTlVNX0ZSRUdTKSo0ICsgTlVNX0ZSRUdTKjEwKQorCisvKiBJbmRleCB3aXRoaW4gYHJlZ2lzdGVycycgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNwYWNlIGZvciByZWdpc3RlciBOLiAqLworCisjZGVmaW5lIFJFR0lTVEVSX0JZVEUoTikgXAorICAoKChOKSA8IEZQMF9SRUdOVU0pID8gKChOKSAqIDQpIDogKCgoKE4pIC0gRlAwX1JFR05VTSkgKiAxMCkgKyA2NCkpCisgCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgYWN0dWFsIG1hY2hpbmUgcmVwcmVzZW50YXRpb24gZm9yCisgICByZWdpc3RlciBOLiAgQWxsIHJlZ2lzdGVycyBhcmUgNCBieXRlcywgZXhjZXB0IDM4NyBzdCgwKSAtIHN0KDcpLAorICAgd2hpY2ggYXJlIDgwIGJpdHMgZWFjaC4gKi8KKworI2RlZmluZSBSRUdJU1RFUl9SQVdfU0laRShOKSAoKChOKSA8IEZQMF9SRUdOVU0pID8gNCA6IDEwKQorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1JBV19TSVpFIGNhbiBoYXZlLiAgKi8KKworI2RlZmluZSBNQVhfUkVHSVNURVJfUkFXX1NJWkUgMTAKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIHByb2dyYW0ncyByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICovCisKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9TSVpFKE4pICgoKE4pIDwgRlAwX1JFR05VTSkgPyA0IDogOCkKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUgOAorCisvKiBSZXR1cm4gdGhlIEdEQiB0eXBlIG9iamVjdCBmb3IgdGhlICJzdGFuZGFyZCIgZGF0YSB0eXBlIG9mIGRhdGEgaW4gCisgICByZWdpc3RlciBOLiAgUGVyaGFwcyBzaSBhbmQgZGkgc2hvdWxkIGdvIGhlcmUsIGJ1dCBwb3RlbnRpYWxseSB0aGV5CisgICBjb3VsZCBiZSB1c2VkIGZvciB0aGluZ3Mgb3RoZXIgdGhhbiBhZGRyZXNzLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1RZUEUoTikgXAorICAoKChOKSA9PSBQQ19SRUdOVU0gfHwgKE4pID09IEZQX1JFR05VTSB8fCAoTikgPT0gU1BfUkVHTlVNKSBcCisgICA/IGxvb2t1cF9wb2ludGVyX3R5cGUgKGJ1aWx0aW5fdHlwZV92b2lkKSBcCisgICA6ICgoKE4pIDwgRlAwX1JFR05VTSkgXAorICAgICAgPyBidWlsdGluX3R5cGVfaW50IFwKKyAgICAgIDogYnVpbHRpbl90eXBlX2RvdWJsZSkpCisKKy8qIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBwbGFjZSBpbiB3aGljaCB0byBjb3B5IHRoZSBzdHJ1Y3R1cmUgdGhlCisgICBzdWJyb3V0aW5lIHdpbGwgcmV0dXJuLiAgVGhpcyBpcyBjYWxsZWQgZnJvbSBjYWxsX2Z1bmN0aW9uLiAqLworCisjZGVmaW5lIFNUT1JFX1NUUlVDVF9SRVRVUk4oQUREUiwgU1ApIFwKKyAgeyBjaGFyIGJ1ZltSRUdJU1RFUl9TSVpFXTsJXAorICAgIChTUCkgLT0gc2l6ZW9mIChBRERSKTsJXAorICAgIHN0b3JlX2FkZHJlc3MgKGJ1Ziwgc2l6ZW9mIChBRERSKSwgQUREUik7CVwKKyAgICB3cml0ZV9tZW1vcnkgKChTUCksIGJ1Ziwgc2l6ZW9mIChBRERSKSk7IH0KKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgb2YgdHlwZSBUWVBFLCBhbmQgY29weSB0aGF0LCBpbiB2aXJ0dWFsIGZvcm1hdCwKKyAgIGludG8gVkFMQlVGLiAgKi8KKworI2RlZmluZSBFWFRSQUNUX1JFVFVSTl9WQUxVRShUWVBFLFJFR0JVRixWQUxCVUYpIFwKKyAgIGkzODZfZXh0cmFjdF9yZXR1cm5fdmFsdWUgKChUWVBFKSwoUkVHQlVGKSwoVkFMQlVGKSkKKworZXh0ZXJuIHZvaWQgaTM4Nl9leHRyYWN0X3JldHVybl92YWx1ZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBjaGFyIFtdLCBjaGFyICopKTsKKworLyogV3JpdGUgaW50byBhcHByb3ByaWF0ZSByZWdpc3RlcnMgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgb2YgdHlwZSBUWVBFLCBnaXZlbgorICAgaW4gdmlydHVhbCBmb3JtYXQuICAqLworCisjZGVmaW5lIFNUT1JFX1JFVFVSTl9WQUxVRShUWVBFLFZBTEJVRikgXAorICB7ICAgIAkgICAgICAgCSAgICAgICAJICAgICAgIAkgICAgICAgCSAgICAgICAJICAgICAgIAkgICAgICAgCSAgICAgICAJICAgICBcCisgICAgaWYgKFRZUEVfQ09ERSAoVFlQRSkgPT0gVFlQRV9DT0RFX0ZMVCkJCQkJICAgICBcCisgICAgICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSksIChWQUxCVUYpLAkgICAgIFwKKwkJCSAgICBUWVBFX0xFTkdUSCAoVFlQRSkpOwkJCSAgICAgXAorICAgIGVsc2UJCQkJCQkJCSAgICAgXAorICAgICAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKDAsIChWQUxCVUYpLCBUWVBFX0xFTkdUSCAoVFlQRSkpOyAgCQkgICAgIFwKKyAgfQorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlIHRoZSBhZGRyZXNzCisgICBpbiB3aGljaCBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gaXRzIHN0cnVjdHVyZSB2YWx1ZSwgYXMgYSBDT1JFX0FERFIgKG9yIGFuCisgICBleHByZXNzaW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgb25lKS4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyhSRUdCVUYpICgqKGludCAqKShSRUdCVUYpKQorCisvKiBUaGUgZm9sbG93aW5nIHJlZGVmaW5lcyBtYWtlIGJhY2t0cmFjaW5nIHRocm91Z2ggc2lndHJhbXAgd29yay4KKyAgIFRoZXkgbWFudWZhY3R1cmUgYSBmYWtlIHNpZ3RyYW1wIGZyYW1lIGFuZCBvYnRhaW4gdGhlIHNhdmVkIHBjIGluIHNpZ3RyYW1wCisgICBmcm9tIHRoZSBzaWdjb250ZXh0IHN0cnVjdHVyZSB3aGljaCBpcyBwdXNoZWQgYnkgdGhlIGtlcm5lbCBvbiB0aGUKKyAgIHVzZXIgc3RhY2ssIGFsb25nIHdpdGggYSBwb2ludGVyIHRvIGl0LiAgKi8KKworLyogRlJBTUVfQ0hBSU4gdGFrZXMgYSBmcmFtZSdzIG5vbWluYWwgYWRkcmVzcyBhbmQgcHJvZHVjZXMgdGhlIGZyYW1lJ3MKKyAgIGNoYWluLXBvaW50ZXIuCisgICBJbiB0aGUgY2FzZSBvZiB0aGUgaTM4NiwgdGhlIGZyYW1lJ3Mgbm9taW5hbCBhZGRyZXNzCisgICBpcyB0aGUgYWRkcmVzcyBvZiBhIDQtYnl0ZSB3b3JkIGNvbnRhaW5pbmcgdGhlIGNhbGxpbmcgZnJhbWUncyBhZGRyZXNzLiAgKi8KKworI2RlZmluZSBGUkFNRV9DSEFJTih0aGlzZnJhbWUpICBcCisgICgodGhpc2ZyYW1lKS0+c2lnbmFsX2hhbmRsZXJfY2FsbGVyIFwKKyAgID8gKHRoaXNmcmFtZSktPmZyYW1lIFwKKyAgIDogKCFpbnNpZGVfZW50cnlfZmlsZSAoKHRoaXNmcmFtZSktPnBjKSBcCisgICAgICA/IHJlYWRfbWVtb3J5X2ludGVnZXIgKCh0aGlzZnJhbWUpLT5mcmFtZSwgNCkgXAorICAgICAgOiAwKSkKKworLyogQSBtYWNybyB0aGF0IHRlbGxzIHVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGludm9jYXRpb24gcmVwcmVzZW50ZWQKKyAgIGJ5IEZJIGRvZXMgbm90IGhhdmUgYSBmcmFtZSBvbiB0aGUgc3RhY2sgYXNzb2NpYXRlZCB3aXRoIGl0LiAgSWYgaXQKKyAgIGRvZXMgbm90LCBGUkFNRUxFU1MgaXMgc2V0IHRvIDEsIGVsc2UgMC4gICovCisKKyNkZWZpbmUgRlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT04oRkksIEZSQU1FTEVTUykgXAorICBkbyB7IFwKKyAgICBpZiAoKEZJKS0+c2lnbmFsX2hhbmRsZXJfY2FsbGVyKSBcCisgICAgICAoRlJBTUVMRVNTKSA9IDA7IFwKKyAgICBlbHNlIFwKKyAgICAgIChGUkFNRUxFU1MpID0gZnJhbWVsZXNzX2xvb2tfZm9yX3Byb2xvZ3VlKEZJKTsgXAorICB9IHdoaWxlICgwKQorCisvKiBTYXZlZCBQYy4gIEdldCBpdCBmcm9tIHNpZ2NvbnRleHQgaWYgd2l0aGluIHNpZ3RyYW1wLiAgKi8KKworI2RlZmluZSBGUkFNRV9TQVZFRF9QQyhGUkFNRSkgXAorICAoKChGUkFNRSktPnNpZ25hbF9oYW5kbGVyX2NhbGxlciBcCisgICAgPyBzaWd0cmFtcF9zYXZlZF9wYyAoRlJBTUUpIFwKKyAgICA6IHJlYWRfbWVtb3J5X2ludGVnZXIgKChGUkFNRSktPmZyYW1lICsgNCwgNCkpIFwKKyAgICkKKworZXh0ZXJuIENPUkVfQUREUiBzaWd0cmFtcF9zYXZlZF9wYyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisKKyNkZWZpbmUgRlJBTUVfQVJHU19BRERSRVNTKGZpKSAoKGZpKS0+ZnJhbWUpCisKKyNkZWZpbmUgRlJBTUVfTE9DQUxTX0FERFJFU1MoZmkpICgoZmkpLT5mcmFtZSkKKworLyogUmV0dXJuIG51bWJlciBvZiBhcmdzIHBhc3NlZCB0byBhIGZyYW1lLiAgQ2FuIHJldHVybiAtMSwgbWVhbmluZyBubyB3YXkKKyAgIHRvIHRlbGwsIHdoaWNoIGlzIHR5cGljYWwgbm93IHRoYXQgdGhlIEMgY29tcGlsZXIgZGVsYXlzIHBvcHBpbmcgdGhlbS4gICovCisKKyNkZWZpbmUgRlJBTUVfTlVNX0FSR1MobnVtYXJncywgZmkpIChudW1hcmdzKSA9IGkzODZfZnJhbWVfbnVtX2FyZ3MoZmkpCisKK2V4dGVybiBpbnQgaTM4Nl9mcmFtZV9udW1fYXJncyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisKKy8qIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgYXQgc3RhcnQgb2YgYXJnbGlzdCB0aGF0IGFyZSBub3QgcmVhbGx5IGFyZ3MuICAqLworCisjZGVmaW5lIEZSQU1FX0FSR1NfU0tJUCA4CisKKy8qIFB1dCBoZXJlIHRoZSBjb2RlIHRvIHN0b3JlLCBpbnRvIGEgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MsCisgICB0aGUgYWRkcmVzc2VzIG9mIHRoZSBzYXZlZCByZWdpc3RlcnMgb2YgZnJhbWUgZGVzY3JpYmVkIGJ5IEZSQU1FX0lORk8uCisgICBUaGlzIGluY2x1ZGVzIHNwZWNpYWwgcmVnaXN0ZXJzIHN1Y2ggYXMgcGMgYW5kIGZwIHNhdmVkIGluIHNwZWNpYWwKKyAgIHdheXMgaW4gdGhlIHN0YWNrIGZyYW1lLiAgc3AgaXMgZXZlbiBtb3JlIHNwZWNpYWw6CisgICB0aGUgYWRkcmVzcyB3ZSByZXR1cm4gZm9yIGl0IElTIHRoZSBzcCBmb3IgdGhlIG5leHQgZnJhbWUuICAqLworCisjZGVmaW5lIEZSQU1FX0ZJTkRfU0FWRURfUkVHUyhmcmFtZV9pbmZvLCBmcmFtZV9zYXZlZF9yZWdzKSBcCit7IGkzODZfZnJhbWVfZmluZF9zYXZlZF9yZWdzICgoZnJhbWVfaW5mbyksICYoZnJhbWVfc2F2ZWRfcmVncykpOyB9CisKK2V4dGVybiB2b2lkIGkzODZfZnJhbWVfZmluZF9zYXZlZF9yZWdzIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICosCisJCQkJCQlzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqKSk7CisKKwwKKy8qIFRoaW5ncyBuZWVkZWQgZm9yIG1ha2luZyB0aGUgaW5mZXJpb3IgY2FsbCBmdW5jdGlvbnMuICAqLworCisvKiBQdXNoIGFuIGVtcHR5IHN0YWNrIGZyYW1lLCB0byByZWNvcmQgdGhlIGN1cnJlbnQgUEMsIGV0Yy4gICovCisKKyNkZWZpbmUgUFVTSF9EVU1NWV9GUkFNRSB7IGkzODZfcHVzaF9kdW1teV9mcmFtZSAoKTsgfQorCitleHRlcm4gdm9pZCBpMzg2X3B1c2hfZHVtbXlfZnJhbWUgUEFSQU1TICgodm9pZCkpOworCisvKiBEaXNjYXJkIGZyb20gdGhlIHN0YWNrIHRoZSBpbm5lcm1vc3QgZnJhbWUsIHJlc3RvcmluZyBhbGwgcmVnaXN0ZXJzLiAgKi8KKworI2RlZmluZSBQT1BfRlJBTUUgIHsgaTM4Nl9wb3BfZnJhbWUgKCk7IH0KKworZXh0ZXJuIHZvaWQgaTM4Nl9wb3BfZnJhbWUgUEFSQU1TICgodm9pZCkpOworCisMCisvKiB0aGlzIGlzIAorICogICBjYWxsIDExMjIzMzQ0ICgzMiBiaXQgcmVsYXRpdmUpCisgKiAgIGludDMKKyAqLworCisjZGVmaW5lIENBTExfRFVNTVkgeyAweDIyMzM0NGU4LCAweGNjMTEgfQorCisjZGVmaW5lIENBTExfRFVNTVlfTEVOR1RIIDgKKworI2RlZmluZSBDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCAwICAvKiBTdGFydCBleGVjdXRpb24gYXQgYmVnaW5uaW5nIG9mIGR1bW15ICovCisKKyNkZWZpbmUgQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVCA1CisKKy8qIEluc2VydCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBhcmdzIGFuZCBmdW5jdGlvbiBhZGRyZXNzCisgICBpbnRvIGEgY2FsbCBzZXF1ZW5jZSBvZiB0aGUgYWJvdmUgZm9ybSBzdG9yZWQgYXQgRFVNTVlOQU1FLiAgKi8KKworI2RlZmluZSBGSVhfQ0FMTF9EVU1NWShkdW1teW5hbWUsIHBjLCBmdW4sIG5hcmdzLCBhcmdzLCB0eXBlLCBnY2NfcCkgICBcCit7IFwKKwlpbnQgZnJvbSwgdG8sIGRlbHRhLCBsb2M7IFwKKwlsb2MgPSAoaW50KShyZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pIC0gQ0FMTF9EVU1NWV9MRU5HVEgpOyBcCisJZnJvbSA9IGxvYyArIDU7IFwKKwl0byA9IChpbnQpKGZ1bik7IFwKKwlkZWx0YSA9IHRvIC0gZnJvbTsgXAorCSooKGNoYXIgKikoZHVtbXluYW1lKSArIDEpID0gKGRlbHRhICYgMHhmZik7IFwKKwkqKChjaGFyICopKGR1bW15bmFtZSkgKyAyKSA9ICgoZGVsdGEgPj4gOCkgJiAweGZmKTsgXAorCSooKGNoYXIgKikoZHVtbXluYW1lKSArIDMpID0gKChkZWx0YSA+PiAxNikgJiAweGZmKTsgXAorCSooKGNoYXIgKikoZHVtbXluYW1lKSArIDQpID0gKChkZWx0YSA+PiAyNCkgJiAweGZmKTsgXAorfQorCitleHRlcm4gdm9pZCBwcmludF8zODdfY29udHJvbF93b3JkIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOworZXh0ZXJuIHZvaWQgcHJpbnRfMzg3X3N0YXR1c193b3JkIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOworCisvKiBPZmZzZXQgZnJvbSBTUCB0byBmaXJzdCBhcmcgb24gc3RhY2sgYXQgZmlyc3QgaW5zdHJ1Y3Rpb24gb2YgYSBmdW5jdGlvbiAqLworCisjZGVmaW5lIFNQX0FSRzAgKDEgKiA0KQorCisjZW5kaWYgLyogaWZuZGVmIFRNX0kzODZfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZhaXguaCBiL2dkYi9jb25maWcvaTM4Ni90bS1pMzg2YWl4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxMjFmYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni90bS1pMzg2YWl4LmgKQEAgLTAsMCArMSw2NyBAQAorLyogTWFjcm8gZGVmaW50aW9ucyBmb3IgSUJNIEFJWCBQUy8yIChpMzg2KS4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIENoYW5nZXMgZm9yIElCTSBBSVggUFMvMiBieSBNaW5oIFRyYW4tTGUgKHRyYW5sZUBpbnRlbGxpY29ycC5jb20pLiAgKi8KKworI2lmbmRlZiBUTV9JMzg2QUlYX0gKKyNkZWZpbmUgVE1fSTM4NkFJWF9IIDEKKworI2luY2x1ZGUgImkzODYvdG0taTM4Ni5oIgorI2luY2x1ZGUgPHN5cy9yZWcuaD4KKworI2lmbmRlZiBJMzg2CisjIGRlZmluZSBJMzg2IDEKKyNlbmRpZgorI2lmbmRlZiBJMzg2X0FJWF9UQVJHRVQKKyMgZGVmaW5lIEkzODZfQUlYX1RBUkdFVCAxCisjZW5kaWYKKworLyogTm9uemVybyBpZiByZWdpc3RlciBOIHJlcXVpcmVzIGNvbnZlcnNpb24KKyAgIGZyb20gcmF3IGZvcm1hdCB0byB2aXJ0dWFsIGZvcm1hdC4gICovCisKKyN1bmRlZiAgUkVHSVNURVJfQ09OVkVSVElCTEUKKyNkZWZpbmUgUkVHSVNURVJfQ09OVkVSVElCTEUoTikgXAorICAoKE4gPCBGUDBfUkVHTlVNKSA/IDAgOiAxKQorCisvKiBDb252ZXJ0IGRhdGEgZnJvbSByYXcgZm9ybWF0IGZvciByZWdpc3RlciBSRUdOVU0gaW4gYnVmZmVyIEZST00KKyAgIHRvIHZpcnR1YWwgZm9ybWF0IHdpdGggdHlwZSBUWVBFIGluIGJ1ZmZlciBUTy4gICovCisKKyN1bmRlZiBSRUdJU1RFUl9DT05WRVJUX1RPX1ZJUlRVQUwKKyNkZWZpbmUgUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMKFJFR05VTSxUWVBFLEZST00sVE8pIFwKK3sgXAorICBkb3VibGUgdmFsOyBcCisgIGkzODdfdG9fZG91YmxlICgoRlJPTSksIChjaGFyICopJnZhbCk7IFwKKyAgc3RvcmVfZmxvYXRpbmcgKChUTyksIFRZUEVfTEVOR1RIIChUWVBFKSwgdmFsKTsgXAorfQorZXh0ZXJuIHZvaWQKK2kzODdfdG9fZG91YmxlIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKSk7CisKKy8qIENvbnZlcnQgZGF0YSBmcm9tIHZpcnR1YWwgZm9ybWF0IHdpdGggdHlwZSBUWVBFIGluIGJ1ZmZlciBGUk9NCisgICB0byByYXcgZm9ybWF0IGZvciByZWdpc3RlciBSRUdOVU0gaW4gYnVmZmVyIFRPLiAgKi8KKworI3VuZGVmIFJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXCisjZGVmaW5lIFJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXKFRZUEUsUkVHTlVNLEZST00sVE8pIFwKK3sgXAorICBkb3VibGUgdmFsID0gZXh0cmFjdF9mbG9hdGluZyAoKEZST00pLCBUWVBFX0xFTkdUSCAoVFlQRSkpOyBcCisgIGRvdWJsZV90b19pMzg3KChjaGFyICopJnZhbCwgKFRPKSk7IFwKK30KK2V4dGVybiB2b2lkCitkb3VibGVfdG9faTM4NyBQQVJBTVMgKChjaGFyICosIGNoYXIgKikpOworCisjZW5kaWYgLyogVE1fSTM4NkFJWF9IICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvdG0taTM4NmJzZC5oIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjhjM2E5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZic2QuaApAQCAtMCwwICsxLDQzIEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgaTM4NiBydW5uaW5nIHVuZGVyIEJTRCBVbml4LgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTEsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBUTV9JMzg2QlNEX0gKKyNkZWZpbmUgVE1fSTM4NkJTRF9IIDEKKworI2luY2x1ZGUgImkzODYvdG0taTM4Ni5oIgorCisvKiAzODZCU0QgY2Fubm90IGhhbmRsZSB0aGUgc2VnbWVudCByZWdpc3RlcnMuICovCisvKiBCU0RJIGNhbid0IGhhbmRsZSB0aGVtIGVpdGhlci4gICovCisKKyN1bmRlZiBOVU1fUkVHUworI2RlZmluZSBOVU1fUkVHUyAxMAorCisvKiBPbiAzODYgYnNkLCBzaWd0cmFtcCBpcyBhYm92ZSB0aGUgdXNlciBzdGFjayBhbmQgaW1tZWRpYXRlbHkgYmVsb3cKKyAgIHRoZSB1c2VyIGFyZWEuIFVzaW5nIGNvbnN0YW50cyBoZXJlIGFsbG93cyBmb3IgY3Jvc3MgZGVidWdnaW5nLgorICAgVGhlc2UgYXJlIHRlc3RlZCBmb3IgQlNESSBidXQgc2hvdWxkIHdvcmsgb24gMzg2QlNELiAgKi8KKworI2RlZmluZSBTSUdUUkFNUF9TVEFSVChwYykJMHhmZGJmZGZjMAorI2RlZmluZSBTSUdUUkFNUF9FTkQocGMpCTB4ZmRiZmUwMDAKKworLyogU2F2ZWQgUGMuICBHZXQgaXQgZnJvbSBzaWdjb250ZXh0IGlmIHdpdGhpbiBzaWd0cmFtcC4gICovCisKKy8qIE9mZnNldCB0byBzYXZlZCBQQyBpbiBzaWdjb250ZXh0LCBmcm9tIDxzeXMvc2lnbmFsLmg+LiAgKi8KKyNkZWZpbmUgU0lHQ09OVEVYVF9QQ19PRkZTRVQgMjAKKworI2VuZGlmICAvKiBpZm5kZWYgVE1fSTM4NkJTRF9IICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvdG0taTM4NmdudS5oIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZnbnUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmUzYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZnbnUuaApAQCAtMCwwICsxLDQ4IEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgaTM4NiwgR05VIEh1cmQKKyAgIENvcHlyaWdodCAoQykgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBJbmNsdWRlIGNvbW1vbiBkZWZpbml0aW9ucyBmb3IgZ251IHN5c3RlbXMgKi8KKyNpbmNsdWRlICJubS1nbnUuaCIKKworLyogVGhyZWFkIGZsYXZvcnMgdXNlZCBpbiByZS1zZXR0aW5nIHRoZSBUIGJpdC4KKyAqIEBAIHRoaXMgaXMgYWxzbyBiYWQgZm9yIGNyb3NzIGRlYnVnZ2luZy4KKyAqLworI2RlZmluZSBUSFJFQURfU1RBVEVfRkxBVk9SCQlpMzg2X1RIUkVBRF9TVEFURQorI2RlZmluZSBUSFJFQURfU1RBVEVfU0laRQkJaTM4Nl9USFJFQURfU1RBVEVfQ09VTlQKKyNkZWZpbmUgVEhSRUFEX1NUQVRFX1NFVF9UUkFDRUQoc3RhdGUpIFwKKyAgCSgoc3RydWN0IGkzODZfdGhyZWFkX3N0YXRlICopc3RhdGUpLT5lZmwgfD0gMHgxMDAKKyNkZWZpbmUgVEhSRUFEX1NUQVRFX0NMRUFSX1RSQUNFRChzdGF0ZSkgXAorICAJKCgoKHN0cnVjdCBpMzg2X3RocmVhZF9zdGF0ZSAqKXN0YXRlKS0+ZWZsICY9IH4weDEwMCksIDEpCisKKy8qIHdlIGNhbiBkbyBpdCAqLworI2RlZmluZSBBVFRBQ0hfREVUQUNIIDEKKworLyogU2lnaC4gVGhlcmUgc2hvdWxkIGJlIGEgZmlsZSBmb3IgaTM4NiBidXQgbm8gc3lzdiBzdHVmZiBpbiBpdCAqLworI2luY2x1ZGUgImkzODYvdG0taTM4NnYuaCIKKworLyogSSB3YW50IHRvIHRlc3QgdGhpcyBmbG9hdCBpbmZvIGNvZGUuIFNlZSBjb21tZW50IGluIHRtLWkzODZ2LmggKi8KKyN1bmRlZiBGTE9BVF9JTkZPCisjZGVmaW5lIEZMT0FUX0lORk8geyBpMzg2X21hY2gzX2Zsb2F0X2luZm8gKCk7IH0KKworLyogQWRkcmVzcyBvZiBlbmQgb2Ygc3RhY2sgc3BhY2UuCisgKiBmb3IgTUFDSCwgc2VlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KKyAqIEBAQCBJIGRvbid0IGtub3cgd2hhdCBpcyBpbiB0aGUgNSBpbnRzLi4uCisgKi8KKyN1bmRlZiAgU1RBQ0tfRU5EX0FERFIKKyNkZWZpbmUgU1RBQ0tfRU5EX0FERFIgKDB4YzAwMDAwMDAtc2l6ZW9mKGludCBbNV0pKQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZseW54LmggYi9nZGIvY29uZmlnL2kzODYvdG0taTM4Nmx5bnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTczMmIzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZseW54LmgKQEAgLTAsMCArMSwzMyBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIEludGVsIDM4NiBydW5uaW5nIHVuZGVyIEx5bnhPUy4KKyAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgVE1fSTM4NkxZTlhfSAorI2RlZmluZSBUTV9JMzg2TFlOWF9ICisKKyNpbmNsdWRlICJ0bS1seW54LmgiCisKKy8qIE1vc3QgZGVmaW5pdGlvbnMgZnJvbSBzeXN2IGNvdWxkIGJlIHVzZWQuICovCisjaW5jbHVkZSAiaTM4Ni90bS1pMzg2LmgiCisKKyN1bmRlZiBTQVZFRF9QQ19BRlRFUl9DQUxMCisKKyNkZWZpbmUgU0FWRURfUENfQUZURVJfQ0FMTCBpMzg2bHlueF9zYXZlZF9wY19hZnRlcl9jYWxsCitDT1JFX0FERFIgaTM4Nmx5bnhfc2F2ZWRfcGNfYWZ0ZXJfY2FsbCAoKTsKKworI2VuZGlmIC8qIFRNX0kzODZMWU5YX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni90bS1pMzg2bTMuaCBiL2dkYi9jb25maWcvaTM4Ni90bS1pMzg2bTMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjk3NTA1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZtMy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIE1hY3JvIGRlZmluaXRpb25zIGZvciBpMzg2LCBNYWNoIDMuMAorICAgQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEluY2x1ZGUgY29tbW9uIGRlZmluaXRpb25zIGZvciBNYWNoMyBzeXN0ZW1zICovCisjaW5jbHVkZSAibm0tbTMuaCIKKworLyogRGVmaW5lIG9mZnNldHMgdG8gYWNjZXNzIENQUk9DIHN0YWNrIHdoZW4gaXQgZG9lcyBub3QgaGF2ZQorICogYSBrZXJuZWwgdGhyZWFkLgorICovCisjZGVmaW5lIE1BQ0hJTkVfQ1BST0NfU1BfT0ZGU0VUIDIwCisjZGVmaW5lIE1BQ0hJTkVfQ1BST0NfUENfT0ZGU0VUIDE2CisjZGVmaW5lIE1BQ0hJTkVfQ1BST0NfRlBfT0ZGU0VUIDEyCisKKy8qIFRocmVhZCBmbGF2b3JzIHVzZWQgaW4gcmUtc2V0dGluZyB0aGUgVCBiaXQuCisgKiBAQCB0aGlzIGlzIGFsc28gYmFkIGZvciBjcm9zcyBkZWJ1Z2dpbmcuCisgKi8KKyNkZWZpbmUgVFJBQ0VfRkxBVk9SCQlpMzg2X1RIUkVBRF9TVEFURQorI2RlZmluZSBUUkFDRV9GTEFWT1JfU0laRQlpMzg2X1RIUkVBRF9TVEFURV9DT1VOVAorI2RlZmluZSBUUkFDRV9TRVQoeCxzdGF0ZSkgXAorICAJKChzdHJ1Y3QgaTM4Nl90aHJlYWRfc3RhdGUgKilzdGF0ZSktPmVmbCB8PSAweDEwMAorI2RlZmluZSBUUkFDRV9DTEVBUih4LHN0YXRlKSBcCisgIAkoKCgoc3RydWN0IGkzODZfdGhyZWFkX3N0YXRlICopc3RhdGUpLT5lZmwgJj0gfjB4MTAwKSwgMSkKKworLyogd2UgY2FuIGRvIGl0ICovCisjZGVmaW5lIEFUVEFDSF9ERVRBQ0ggMQorCisvKiBEZWZpbmUgdGhpcyBpZiB0aGUgQyBjb21waWxlciBwdXRzIGFuIHVuZGVyc2NvcmUgYXQgdGhlIGZyb250CisgICBvZiBleHRlcm5hbCBuYW1lcyBiZWZvcmUgZ2l2aW5nIHRoZW0gdG8gdGhlIGxpbmtlci4gICovCisKKyNkZWZpbmUgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCisKKy8qIFNpZ2guIFRoZXJlIHNob3VsZCBiZSBhIGZpbGUgZm9yIGkzODYgYnV0IG5vIHN5c3Ygc3R1ZmYgaW4gaXQgKi8KKyNpbmNsdWRlICJpMzg2L3RtLWkzODYuaCIKKworLyogSSB3YW50IHRvIHRlc3QgdGhpcyBmbG9hdCBpbmZvIGNvZGUuIFNlZSBjb21tZW50IGluIHRtLWkzODZ2LmggKi8KKyN1bmRlZiBGTE9BVF9JTkZPCisjZGVmaW5lIEZMT0FUX0lORk8geyBpMzg2X21hY2gzX2Zsb2F0X2luZm8gKCk7IH0KKworLyogQWRkcmVzcyBvZiBlbmQgb2Ygc3RhY2sgc3BhY2UuCisgKiBmb3IgTUFDSCwgc2VlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KKyAqIEBAQCBJIGRvbid0IGtub3cgd2hhdCBpcyBpbiB0aGUgNSBpbnRzLi4uCisgKi8KKyN1bmRlZiAgU1RBQ0tfRU5EX0FERFIKKyNkZWZpbmUgU1RBQ0tfRU5EX0FERFIgKDB4YzAwMDAwMDAtc2l6ZW9mKGludCBbNV0pKQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZtay5oIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZtay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MjVlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvdG0taTM4Nm1rLmgKQEAgLTAsMCArMSwyNSBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIGkzODYsIE1hY2ggMy4wLCBPU0YgMS9NSworICAgQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFVudGlsIE9TRiBzd2l0Y2hlcyB0byBhIG5ld2VyIE1hY2gga2VybmVsIHRoYXQgaGFzCisgKiBhIGRpZmZlcmVudCBnZXRfZW11bF92ZWN0b3IoKSBpbnRlcmZhY2UuCisgKi8KKyNkZWZpbmUgTUs2NyAxCisKKyNpbmNsdWRlICJpMzg2L3RtLWkzODZtMy5oIgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZudy5oIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZudy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1Y2RhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvdG0taTM4Nm53LmgKQEAgLTAsMCArMSw0OSBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIGkzODYgcnVubmluZyBOZXRXYXJlLgorICAgQ29weXJpZ2h0IDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBUTV9JMzg2TldfSAorI2RlZmluZSBUTV9JMzg2TldfSCAxCisKKyNpbmNsdWRlICJpMzg2L3RtLWkzODYuaCIKKworLyogU3RvcCBiYWNrdHJhY2luZyB3aGVuIHdlIHdhbmRlciBpbnRvIG1haW4uICAqLworCisjZGVmaW5lIEZSQU1FX0NIQUlOX1ZBTElEKGZwLGZpKSBhbHRlcm5hdGVfZnJhbWVfY2hhaW5fdmFsaWQgKGZwLCBmaSkKKworCisvKiBPZmZzZXRzIChpbiB0YXJnZXQgaW50cykgaW50byBqbXBfYnVmLiAgTm90IGRlZmluZWQgaW4gYW55IHN5c3RlbSBoZWFkZXIKKyAgIGZpbGUsIHNvIHdlIGhhdmUgdG8gc3RlcCB0aHJvdWdoIHNldGptcC9sb25nam1wIHdpdGggYSBkZWJ1Z2dlciBhbmQgZmlndXJlCisgICB0aGVtIG91dC4gICovCisKKyNkZWZpbmUgSkJfRUxFTUVOVF9TSVpFIDQJLyogam1wX2J1ZltdIGlzIGFycmF5IG9mIGludHMgKi8KKworI2RlZmluZSBKQl9QQwk2CQkvKiBTZXRqbXAoKSdzIHJldHVybiBQQyBzYXZlZCBoZXJlICovCisKKy8qIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIGxvbmdqbXAgd2lsbCBsYW5kLiAgU2x1cnAgdGhlIGFyZ3Mgb3V0IG9mIHRoZSBzdGFjay4KKyAgIFdlIGV4cGVjdCB0aGUgZmlyc3QgYXJnIHRvIGJlIGEgcG9pbnRlciB0byB0aGUgam1wX2J1ZiBzdHJ1Y3R1cmUgZnJvbSB3aGljaAorICAgd2UgZXh0cmFjdCB0aGUgcGMgKEpCX1BDKSB0aGF0IHdlIHdpbGwgbGFuZCBhdC4gIFRoZSBwYyBpcyBjb3BpZWQgaW50byBBRERSLgorICAgVGhpcyByb3V0aW5lIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzICovCisKK2V4dGVybiBpbnQKK2dldF9sb25nam1wX3RhcmdldCBQQVJBTVMgKChDT1JFX0FERFIgKikpOworCisjZGVmaW5lIEdFVF9MT05HSk1QX1RBUkdFVChBRERSKSBnZXRfbG9uZ2ptcF90YXJnZXQoQUREUikKKworI2VuZGlmICAvKiBpZm5kZWYgVE1fSTM4Nk5XX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZvczlrLmggYi9nZGIvY29uZmlnL2kzODYvdG0taTM4Nm9zOWsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjQ4NjQxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZvczlrLmgKQEAgLTAsMCArMSw2MyBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIGkzODYgcnVubmluZyB1bmRlciBCU0QgVW5peC4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgVE1fSTM4Nk9TOUtfSAorI2RlZmluZSBUTV9JMzg2T1M5S19IIDEKKworI2luY2x1ZGUgImkzODYvdG0taTM4Ni5oIgorCisvKiBOdW1iZXIgb2YgbWFjaGluZSByZWdpc3RlcnMgKi8KKworI3VuZGVmICBOVU1fUkVHUworI2RlZmluZSBOVU1fUkVHUyAoMTYpCS8qIEJhc2ljIGkqODYgcmVncyAqLworCisvKiBJbml0aWFsaXplciBmb3IgYW4gYXJyYXkgb2YgbmFtZXMgb2YgcmVnaXN0ZXJzLiAgVGhlcmUgc2hvdWxkIGJlIGF0IGxlYXN0CisgICBOVU1fUkVHUyBzdHJpbmdzIGluIHRoaXMgaW5pdGlhbGl6ZXIuICBBbnkgZXhjZXNzIG9uZXMgYXJlIHNpbXBseSBpZ25vcmVkLgorICAgVGhlIG9yZGVyIG9mIHRoZSBmaXJzdCA4IHJlZ2lzdGVycyBtdXN0IG1hdGNoIHRoZSBjb21waWxlcidzIG51bWJlcmluZworICAgc2NoZW1lICh3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUgMzg2IHNjaGVtZSkgYW5kIGFsc28gcmVnbWFwIGluIHRoZSB2YXJpb3VzCisgICAqLW5hdC5jIGZpbGVzLiAqLworCisjdW5kZWYgIFJFR0lTVEVSX05BTUVTCisjZGVmaW5lIFJFR0lTVEVSX05BTUVTIHsgImVheCIsICJlY3giLCAiZWR4IiwgImVieCIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXNwIiwgImVicCIsICJlc2kiLCAiZWRpIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJlaXAiLCAiZWZsYWdzIiwgImNzIiwgInNzIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJkcyIsICJlcyIsICJmcyIsICJncyIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyNkZWZpbmUgREFUQUJBU0VfUkVHIAkzCQkvKiBlYnggKi8KKworLyogQW1vdW50IFBDIG11c3QgYmUgZGVjcmVtZW50ZWQgYnkgYWZ0ZXIgYSBicmVha3BvaW50LiAgVGhpcyBpcyBvZnRlbiB0aGUKKyAgIG51bWJlciBvZiBieXRlcyBpbiBCUkVBS1BPSU5UIGJ1dCBub3QgYWx3YXlzIChzdWNoIGFzIG5vdykuICovCisKKyN1bmRlZiBERUNSX1BDX0FGVEVSX0JSRUFLCisjZGVmaW5lIERFQ1JfUENfQUZURVJfQlJFQUsgMAorCisvKiBPbiAzODYgYnNkLCBzaWd0cmFtcCBpcyBhYm92ZSB0aGUgdXNlciBzdGFjayBhbmQgaW1tZWRpYXRlbHkgYmVsb3cKKyAgIHRoZSB1c2VyIGFyZWEuIFVzaW5nIGNvbnN0YW50cyBoZXJlIGFsbG93cyBmb3IgY3Jvc3MgZGVidWdnaW5nLgorICAgVGhlc2UgYXJlIHRlc3RlZCBmb3IgQlNESSBidXQgc2hvdWxkIHdvcmsgb24gMzg2QlNELiAgKi8KKyNkZWZpbmUgU0lHVFJBTVBfU1RBUlQocGMpCTB4ZmRiZmRmYzAKKyNkZWZpbmUgU0lHVFJBTVBfRU5EKHBjKQkweGZkYmZlMDAwCisKKy8qIFNhdmVkIFBjLiAgR2V0IGl0IGZyb20gc2lnY29udGV4dCBpZiB3aXRoaW4gc2lndHJhbXAuICAqLworCisvKiBPZmZzZXQgdG8gc2F2ZWQgUEMgaW4gc2lnY29udGV4dCwgZnJvbSA8c3lzL3NpZ25hbC5oPi4gICovCisjZGVmaW5lIFNJR0NPTlRFWFRfUENfT0ZGU0VUIDIwCisKKyNkZWZpbmUgQkVMSUVWRV9QQ0NfUFJPTU9USU9OIDEKKworI2VuZGlmCS8qICNpZm5kZWYgVE1fSTM4Nk9TOUtfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZzY281LmggYi9nZGIvY29uZmlnL2kzODYvdG0taTM4NnNjbzUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmFjNWIzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZzY281LmgKQEAgLTAsMCArMSw2MiBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIEdEQiBvbiBhbiBJbnRlbCBpMzg2IHJ1bm5pbmcgU0NPIE9wZW4gU2VydmVyIDUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEouIEtlYW4gSm9obnN0b24gKGprakBzY28uY29tKS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIFRNX0kzODZTQ081X0gKKyNkZWZpbmUgVE1fSTM4NlNDTzVfSCAxCisKKy8qIFBpY2sgdXAgbW9zdCBvZiB3aGF0IHdlIG5lZWQgZnJvbSB0aGUgZ2VuZXJpYyBpMzg2IHRhcmdldCBpbmNsdWRlIGZpbGUuICovCisKKyNpbmNsdWRlICJpMzg2L3RtLWkzODYuaCIKKworLyogUGljayB1cCBtb3JlIHN0dWZmIGZyb20gdGhlIGdlbmVyaWMgU1lTViBhbmQgU1ZSNCBob3N0IGluY2x1ZGUgZmlsZXMuICovCisjaW5jbHVkZSAiaTM4Ni90bS1pMzg2di5oIgorI2luY2x1ZGUgInRtLXN5c3Y0LmgiCisKKyNkZWZpbmUgS0VSTkVMX1VfU0laRSBrZXJuZWxfdV9zaXplKCkKKworLyoKKyAqIFNDTyBpcyB1bmxpa2Ugb3RoZXIgU1ZSMyB0YXJnZXRzIGluIHRoYXQgaXQgaGFzIFNWUjQgc3R5bGUgc2hhcmVkCisgKiBsaWJzLCB3aXRoIGEgc2xpZ2h0IHR3aXN0LiBXZSBleHBlY3QgMyB0cmFwcyAoMiBmb3IgdGhlIGV4ZWMgYW5kCisgKiBvbmUgZm9yIHRoZSBkeW5hbWljIGxvYWRlcikuICBBZnRlciB0aGUgdGhpcmQgdHJhcCB3ZSBpbnNlcnQgdGhlCisgKiBTT0xJQiBicmVha3BvaW50cywgdGhlbiB3YWl0IGZvciB0aGUgNHRoIHRyYXAuCisgKi8KKyN1bmRlZiBTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRAorI2RlZmluZSBTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCAzCisKKy8qIFdlIGNhbiBhbHNvIGRvIGhhcmR3YXJlIHdhdGNocG9pbnRzICovCisjZGVmaW5lIFRBUkdFVF9IQVNfSEFSRFdBUkVfV0FUQ0hQT0lOVFMKKyNkZWZpbmUgVEFSR0VUX0NBTl9VU0VfSEFSRFdBUkVfV0FUQ0hQT0lOVCh0eXBlLCBjbnQsIG90KSAxCisKKy8qIEFmdGVyIGEgd2F0Y2hwb2ludCB0cmFwLCB0aGUgUEMgcG9pbnRzIHRvIHRoZSBpbnN0cnVjdGlvbiB3aGljaAorICAgY2F1c2VkIHRoZSB0cmFwLiAgQnV0IHdlIGNhbiBjb250aW51ZSBvdmVyIGl0IHdpdGhvdXQgZGlzYWJsaW5nIHRoZQorICAgdHJhcC4gKi8KKyNkZWZpbmUgSEFWRV9DT05USU5VQUJMRV9XQVRDSFBPSU5UCisjZGVmaW5lIEhBVkVfU1RFUFBBQkxFX1dBVENIUE9JTlQKKworI2RlZmluZSBTVE9QUEVEX0JZX1dBVENIUE9JTlQoVykgIFwKKyAgaTM4Nl9zdG9wcGVkX2J5X3dhdGNocG9pbnQgKGluZmVyaW9yX3BpZCkKKworI2RlZmluZSB0YXJnZXRfaW5zZXJ0X3dhdGNocG9pbnQoYWRkciwgbGVuLCB0eXBlKSAgXAorICBpMzg2X2luc2VydF93YXRjaHBvaW50IChpbmZlcmlvcl9waWQsIGFkZHIsIGxlbiwgdHlwZSkKKworI2RlZmluZSB0YXJnZXRfcmVtb3ZlX3dhdGNocG9pbnQoYWRkciwgbGVuLCB0eXBlKSAgXAorICBpMzg2X3JlbW92ZV93YXRjaHBvaW50IChpbmZlcmlvcl9waWQsIGFkZHIsIGxlbikKKworI2VuZGlmICAvKiBpZm5kZWYgVE1fSTM4NlNDTzVfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZzb2wyLmggYi9nZGIvY29uZmlnL2kzODYvdG0taTM4NnNvbDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmQ2MzE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZzb2wyLmgKQEAgLTAsMCArMSw2NCBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIEdEQiBvbiBhbiBJbnRlbCBpMzg2IHJ1bm5pbmcgU29sYXJpcyAyLgorICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgVE1fSTM4NlNPTDJfSAorI2RlZmluZSBUTV9JMzg2U09MMl9IIDEKKworI2luY2x1ZGUgImkzODYvdG0taTM4NnY0LmgiCisgCisvKiBTaWduYWwgaGFuZGxlciBmcmFtZXMgdW5kZXIgU29sYXJpcyAyIGFyZSByZWNvZ25pemVkIGJ5IGEgcmV0dXJuIGFkZHJlc3MKKyAgIG9mIDB4RkZGRkZGRkYsIHRoZSB0aGlyZCBwYXJhbWV0ZXIgb24gdGhlIHNpZ25hbCBoYW5kbGVyIHN0YWNrIGlzCisgICBhIHBvaW50ZXIgdG8gYW4gdWNvbnRleHQuICAqLworI3VuZGVmIHNpZ3RyYW1wX3NhdmVkX3BjCisjdW5kZWYgSTM4NlY0X1NJR1RSQU1QX1NBVkVEX1BDCisjZGVmaW5lIFNJR0NPTlRFWFRfUENfT0ZGU0VUICgzNiArIDE0ICogNCkKKyN1bmRlZiBJTl9TSUdUUkFNUAorI2RlZmluZSBJTl9TSUdUUkFNUChwYywgbmFtZSkgKHBjID09IDB4RkZGRkZGRkYpCisKKy8qIFRoZSBTdW5QUk8gY29tcGlsZXIgcHV0cyBvdXQgMCBpbnN0ZWFkIG9mIHRoZSBhZGRyZXNzIGluIE5fU08gc3ltYm9scywKKyAgIGFuZCBmb3IgU3VuUFJPIDMuMCwgTl9GVU4gc3ltYm9scyB0b28uICAqLworI2RlZmluZSBTT0ZVTl9BRERSRVNTX01BWUJFX01JU1NJTkcKKworZXh0ZXJuIGNoYXIgKnN1bnByb19zdGF0aWNfdHJhbnNmb3JtX25hbWUgUEFSQU1TICgoY2hhciAqKSk7CisjZGVmaW5lIFNUQVRJQ19UUkFOU0ZPUk1fTkFNRSh4KSBzdW5wcm9fc3RhdGljX3RyYW5zZm9ybV9uYW1lICh4KQorI2RlZmluZSBJU19TVEFUSUNfVFJBTlNGT1JNX05BTUUobmFtZSkgKChuYW1lKVswXSA9PSAnLicpCisKKyNkZWZpbmUgRkFVTFRFRF9VU0VfU0lHSU5GTworCisvKiBNYWNyb3MgdG8gZXh0cmFjdCBwcm9jZXNzIGlkIGFuZCB0aHJlYWQgaWQgZnJvbSBhIGNvbXBvc2l0ZSBwaWQvdGlkICovCisjZGVmaW5lIFBJREdFVChwaWQpICgocGlkKSAmIDB4ZmZmZikKKyNkZWZpbmUgVElER0VUKHBpZCkgKCgocGlkKSA+PiAxNikgJiAweGZmZmYpCisKKy8qIE1hY3JvIHRvIGV4dHJhY3QgY2FycnkgZnJvbSBnaXZlbiByZWdzZXQuICAqLworI2RlZmluZSBQU19GTEFHX0NBUlJZIDB4MQkvKiBDYXJyeSBiaXQgaW4gUFMgKi8KKyNkZWZpbmUgUFJPQ0ZTX0dFVF9DQVJSWShyZWdzZXQpICgocmVnc2V0KVtFRkxdICYgUFNfRkxBR19DQVJSWSkKKworI2lmZGVmIEhBVkVfVEhSRUFEX0RCX0xJQgorCitleHRlcm4gY2hhciAqc29sYXJpc19waWRfdG9fc3RyIFBBUkFNUyAoKGludCBwaWQpKTsKKyNkZWZpbmUgdGFyZ2V0X3BpZF90b19zdHIoUElEKSBzb2xhcmlzX3BpZF90b19zdHIgKFBJRCkKKworI2Vsc2UKKworZXh0ZXJuIGNoYXIgKnByb2Nmc19waWRfdG9fc3RyIFBBUkFNUyAoKGludCBwaWQpKTsKKyNkZWZpbmUgdGFyZ2V0X3BpZF90b19zdHIoUElEKSBwcm9jZnNfcGlkX3RvX3N0ciAoUElEKQorCisjZW5kaWYKKworI2VuZGlmICAvKiBpZm5kZWYgVE1fSTM4NlNPTDJfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZ2LmggYi9nZGIvY29uZmlnL2kzODYvdG0taTM4NnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjMxY2IwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZ2LmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qIE1hY3JvIGRlZmluaXRpb25zIGZvciBpMzg2LCBVbml4IFN5c3RlbSBWLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTEsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBUTV9JMzg2Vl9ICisjZGVmaW5lIFRNX0kzODZWX0ggMQorCisvKiBGaXJzdCBwaWNrIHVwIHRoZSBnZW5lcmljICo4NiB0YXJnZXQgZmlsZS4gKi8KKworI2luY2x1ZGUgImkzODYvdG0taTM4Ni5oIgorCisvKiBOdW1iZXIgb2YgdHJhcHMgdGhhdCBoYXBwZW4gYmV0d2VlbiBleGVjJ2luZyB0aGUgc2hlbGwgdG8gcnVuIGFuCisgICBpbmZlcmlvciwgYW5kIHdoZW4gd2UgZmluYWxseSBnZXQgdG8gdGhlIGluZmVyaW9yIGNvZGUuICBUaGlzIGlzCisgICAyIG9uIG1vc3QgaW1wbGVtZW50YXRpb25zLiAgT3ZlcnJpZGUgaGVyZSB0byA0LiAqLworCisjdW5kZWYgIFNUQVJUX0lORkVSSU9SX1RSQVBTX0VYUEVDVEVECisjZGVmaW5lIFNUQVJUX0lORkVSSU9SX1RSQVBTX0VYUEVDVEVEIDQKKworLyogTnVtYmVyIG9mIG1hY2hpbmUgcmVnaXN0ZXJzICovCisKKyN1bmRlZiAgTlVNX1JFR1MKKyNkZWZpbmUgTlVNX1JFR1MgMTYKKworLyogSW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIG5hbWVzIG9mIHJlZ2lzdGVycy4KKyAgIFRoZXJlIHNob3VsZCBiZSBOVU1fUkVHUyBzdHJpbmdzIGluIHRoaXMgaW5pdGlhbGl6ZXIuICAqLworCisvKiB0aGUgb3JkZXIgb2YgdGhlIGZpcnN0IDggcmVnaXN0ZXJzIG11c3QgbWF0Y2ggdGhlIGNvbXBpbGVyJ3MgCisgKiBudW1iZXJpbmcgc2NoZW1lICh3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUgMzg2IHNjaGVtZSkKKyAqIGFsc28sIHRoaXMgdGFibGUgbXVzdCBtYXRjaCByZWdtYXAgaW4gaTM4Ni1waW5zbi5jLgorICovCisKKyN1bmRlZiAgUkVHSVNURVJfTkFNRVMKKyNkZWZpbmUgUkVHSVNURVJfTkFNRVMgeyAiZWF4IiwgImVjeCIsICJlZHgiLCAiZWJ4IiwgXAorCQkJICJlc3AiLCAiZWJwIiwgImVzaSIsICJlZGkiLCBcCisJCQkgImVpcCIsICJwcyIsICJjcyIsICJzcyIsIFwKKwkJCSAiZHMiLCAiZXMiLCAiZnMiLCAiZ3MiLCBcCisJCQkgfQorCisvKiBUb3RhbCBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIHRvIHN0b3JlIG91ciBjb3BpZXMgb2YgdGhlIG1hY2hpbmUncworICAgcmVnaXN0ZXIgc3RhdGUsIHRoZSBhcnJheSBgcmVnaXN0ZXJzJy4gICovCisKKyN1bmRlZiAgUkVHSVNURVJfQllURVMKKyNkZWZpbmUgUkVHSVNURVJfQllURVMgKE5VTV9SRUdTICogNCkKKworLyogSW5kZXggd2l0aGluIGByZWdpc3RlcnMnIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzcGFjZSBmb3IKKyAgIHJlZ2lzdGVyIE4uICAqLworCisjdW5kZWYgIFJFR0lTVEVSX0JZVEUKKyNkZWZpbmUgUkVHSVNURVJfQllURShOKSAoKE4pKjQpCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBhY3R1YWwgbWFjaGluZSByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICAqLworCisjdW5kZWYgIFJFR0lTVEVSX1JBV19TSVpFCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pICg0KQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgcHJvZ3JhbSdzIHJlcHJlc2VudGF0aW9uCisgICBmb3IgcmVnaXN0ZXIgTi4gKi8KKworI3VuZGVmICBSRUdJU1RFUl9WSVJUVUFMX1NJWkUKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9TSVpFKE4pICg0KQorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1JBV19TSVpFIGNhbiBoYXZlLiAgKi8KKworI3VuZGVmICBNQVhfUkVHSVNURVJfUkFXX1NJWkUKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1JBV19TSVpFIDQKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUgY2FuIGhhdmUuICAqLworCisjdW5kZWYgIE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1ZJUlRVQUxfU0laRSA0CisKKy8qIFJldHVybiB0aGUgR0RCIHR5cGUgb2JqZWN0IGZvciB0aGUgInN0YW5kYXJkIiBkYXRhIHR5cGUKKyAgIG9mIGRhdGEgaW4gcmVnaXN0ZXIgTi4gICovCisvKiBQZXJoYXBzIHNpIGFuZCBkaSBzaG91bGQgZ28gaGVyZSwgYnV0IHBvdGVudGlhbGx5IHRoZXkgY291bGQgYmUKKyAgIHVzZWQgZm9yIHRoaW5ncyBvdGhlciB0aGFuIGFkZHJlc3MuICAqLworCisjdW5kZWYgIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRQorI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1RZUEUoTikgXAorICAoKE4pID09IFBDX1JFR05VTSB8fCAoTikgPT0gRlBfUkVHTlVNIHx8IChOKSA9PSBTUF9SRUdOVU0gPyAgICAgICAgIFwKKyAgIGxvb2t1cF9wb2ludGVyX3R5cGUgKGJ1aWx0aW5fdHlwZV92b2lkKSA6IGJ1aWx0aW5fdHlwZV9pbnQpCisKKy8qIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBwbGFjZSBpbiB3aGljaCB0byBjb3B5IHRoZSBzdHJ1Y3R1cmUgdGhlCisgICBzdWJyb3V0aW5lIHdpbGwgcmV0dXJuLiAgVGhpcyBpcyBjYWxsZWQgZnJvbSBjYWxsX2Z1bmN0aW9uLiAqLworCisjdW5kZWYgIFNUT1JFX1NUUlVDVF9SRVRVUk4KKyNkZWZpbmUgU1RPUkVfU1RSVUNUX1JFVFVSTihBRERSLCBTUCkgXAorICB7IGNoYXIgYnVmW1JFR0lTVEVSX1NJWkVdOwlcCisgICAgKFNQKSAtPSBzaXplb2YgKEFERFIpOwlcCisgICAgc3RvcmVfYWRkcmVzcyAoYnVmLCBzaXplb2YgKEFERFIpLCBBRERSKTsJXAorICAgIHdyaXRlX21lbW9yeSAoKFNQKSwgYnVmLCBzaXplb2YgKEFERFIpKTsgfQorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwgZm9ybWF0LAorICAgaW50byBWQUxCVUYuICAqLworCisjdW5kZWYgIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFCisjZGVmaW5lIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKFRZUEUsUkVHQlVGLFZBTEJVRikgXAorICBtZW1jcHkgKChWQUxCVUYpLCAoUkVHQlVGKSwgVFlQRV9MRU5HVEggKFRZUEUpKQorCisvKiBXcml0ZSBpbnRvIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZQorICAgb2YgdHlwZSBUWVBFLCBnaXZlbiBpbiB2aXJ0dWFsIGZvcm1hdC4gICovCisKKyN1bmRlZiAgU1RPUkVfUkVUVVJOX1ZBTFVFCisjZGVmaW5lIFNUT1JFX1JFVFVSTl9WQUxVRShUWVBFLFZBTEJVRikgXAorICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoMCwgVkFMQlVGLCBUWVBFX0xFTkdUSCAoVFlQRSkpCisKKwwKKy8qIERlc2NyaWJlIHRoZSBwb2ludGVyIGluIGVhY2ggc3RhY2sgZnJhbWUgdG8gdGhlIHByZXZpb3VzIHN0YWNrIGZyYW1lCisgICAoaXRzIGNhbGxlcikuICAqLworCisvKiBGUkFNRV9DSEFJTiB0YWtlcyBhIGZyYW1lJ3Mgbm9taW5hbCBhZGRyZXNzCisgICBhbmQgcHJvZHVjZXMgdGhlIGZyYW1lJ3MgY2hhaW4tcG9pbnRlci4gKi8KKworI3VuZGVmICBGUkFNRV9DSEFJTgorI2RlZmluZSBGUkFNRV9DSEFJTih0aGlzZnJhbWUpIFwKKyAgKCFpbnNpZGVfZW50cnlfZmlsZSAoKHRoaXNmcmFtZSktPnBjKSA/IFwKKyAgIHJlYWRfbWVtb3J5X2ludGVnZXIgKCh0aGlzZnJhbWUpLT5mcmFtZSwgNCkgOlwKKyAgIDApCisKKy8qIERlZmluZSBvdGhlciBhc3BlY3RzIG9mIHRoZSBzdGFjayBmcmFtZS4gICovCisKKy8qIEEgbWFjcm8gdGhhdCB0ZWxscyB1cyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpbnZvY2F0aW9uIHJlcHJlc2VudGVkCisgICBieSBGSSBkb2VzIG5vdCBoYXZlIGEgZnJhbWUgb24gdGhlIHN0YWNrIGFzc29jaWF0ZWQgd2l0aCBpdC4gIElmIGl0CisgICBkb2VzIG5vdCwgRlJBTUVMRVNTIGlzIHNldCB0byAxLCBlbHNlIDAuICAqLworCisjdW5kZWYgIEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OCisjZGVmaW5lIEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OKEZJLCBGUkFNRUxFU1MpIFwKKyAgKEZSQU1FTEVTUykgPSBmcmFtZWxlc3NfbG9va19mb3JfcHJvbG9ndWUoRkkpCisKKyN1bmRlZiAgRlJBTUVfU0FWRURfUEMKKyNkZWZpbmUgRlJBTUVfU0FWRURfUEMoRlJBTUUpIChyZWFkX21lbW9yeV9pbnRlZ2VyICgoRlJBTUUpLT5mcmFtZSArIDQsIDQpKQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvIGEgZnJhbWUuCisgICBDYW4gcmV0dXJuIC0xLCBtZWFuaW5nIG5vIHdheSB0byB0ZWxsLiAgKi8KKworI3VuZGVmICBGUkFNRV9OVU1fQVJHUworI2RlZmluZSBGUkFNRV9OVU1fQVJHUyhudW1hcmdzLCBmaSkgKG51bWFyZ3MpID0gLTEKKworI2lmZGVmIF9fU1REQ19fCQkvKiBGb3J3YXJkIGRlY2wncyBmb3IgcHJvdG90eXBlcyAqLworc3RydWN0IGZyYW1lX2luZm87CitzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVnczsKKyNlbmRpZgorCitleHRlcm4gaW50CitpMzg2X2ZyYW1lX251bV9hcmdzIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworI2VuZGlmCS8qIGlmbmRlZiBUTV9JMzg2Vl9IICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvdG0taTM4NnY0LmggYi9nZGIvY29uZmlnL2kzODYvdG0taTM4NnY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFmZmYwMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni90bS1pMzg2djQuaApAQCAtMCwwICsxLDc4IEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgR0RCIG9uIGFuIEludGVsIGkzODYgcnVubmluZyBTVlI0LgorICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggYXQgQ3lnbnVzIFN1cHBvcnQgKGZuZkBjeWdudXMuY29tKQorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgVE1fSTM4NlY0X0gKKyNkZWZpbmUgVE1fSTM4NlY0X0ggMQorCisvKiBQaWNrIHVwIG1vc3Qgb2Ygd2hhdCB3ZSBuZWVkIGZyb20gdGhlIGdlbmVyaWMgaTM4NiB0YXJnZXQgaW5jbHVkZSBmaWxlLiAqLworCisjaW5jbHVkZSAiaTM4Ni90bS1pMzg2LmgiCisKKy8qIFBpY2sgdXAgbW9yZSBzdHVmZiBmcm9tIHRoZSBnZW5lcmljIFNWUjQgaG9zdCBpbmNsdWRlIGZpbGUuICovCisKKyNpbmNsdWRlICJ0bS1zeXN2NC5oIgorCisvKiBVc2UgdGhlIGFsdGVybmF0ZSBtZXRob2Qgb2YgZGV0ZXJtaW5pbmcgdmFsaWQgZnJhbWUgY2hhaW5zLiAqLworCisjZGVmaW5lIEZSQU1FX0NIQUlOX1ZBTElEKGZwLGZpKSBhbHRlcm5hdGVfZnJhbWVfY2hhaW5fdmFsaWQgKGZwLCBmaSkKKworLyogT2Zmc2V0cyAoaW4gdGFyZ2V0IGludHMpIGludG8gam1wX2J1Zi4gIE5vdCBkZWZpbmVkIGluIGFueSBzeXN0ZW0gaGVhZGVyCisgICBmaWxlLCBzbyB3ZSBoYXZlIHRvIHN0ZXAgdGhyb3VnaCBzZXRqbXAvbG9uZ2ptcCB3aXRoIGEgZGVidWdnZXIgYW5kIGZpZ3VyZQorICAgdGhlbSBvdXQuICBOb3RlIHRoYXQgPHNldGptcD4gZGVmaW5lcyBfSkJMRU4gYXMgMTAsIHdoaWNoIGlzIHRoZSBkZWZhdWx0CisgICBpZiBubyBzcGVjaWZpYyBtYWNoaW5lIGlzIHNlbGVjdGVkLCBldmVuIHRob3VnaCB3ZSBvbmx5IHVzZSA2IHNsb3RzLiAqLworCisjZGVmaW5lIEpCX0VMRU1FTlRfU0laRSBzaXplb2YoaW50KQkvKiBqbXBfYnVmW19KQkxFTl0gaXMgYXJyYXkgb2YgaW50cyAqLworCisjZGVmaW5lIEpCX0VCWAkwCisjZGVmaW5lIEpCX0VTSQkxCisjZGVmaW5lIEpCX0VESQkyCisjZGVmaW5lIEpCX0VCUAkzCisjZGVmaW5lIEpCX0VTUAk0CisjZGVmaW5lIEpCX0VEWAk1CisKKyNkZWZpbmUgSkJfUEMJSkJfRURYCS8qIFNldGptcCgpJ3MgcmV0dXJuIFBDIHNhdmVkIGluIEVEWCAqLworCisvKiBGaWd1cmUgb3V0IHdoZXJlIHRoZSBsb25nam1wIHdpbGwgbGFuZC4gIFNsdXJwIHRoZSBhcmdzIG91dCBvZiB0aGUgc3RhY2suCisgICBXZSBleHBlY3QgdGhlIGZpcnN0IGFyZyB0byBiZSBhIHBvaW50ZXIgdG8gdGhlIGptcF9idWYgc3RydWN0dXJlIGZyb20gd2hpY2gKKyAgIHdlIGV4dHJhY3QgdGhlIHBjIChKQl9QQykgdGhhdCB3ZSB3aWxsIGxhbmQgYXQuICBUaGUgcGMgaXMgY29waWVkIGludG8gQUREUi4KKyAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRydWUgb24gc3VjY2VzcyAqLworCitleHRlcm4gaW50CitnZXRfbG9uZ2ptcF90YXJnZXQgUEFSQU1TICgoQ09SRV9BRERSICopKTsKKworI2RlZmluZSBHRVRfTE9OR0pNUF9UQVJHRVQoQUREUikgZ2V0X2xvbmdqbXBfdGFyZ2V0KEFERFIpCisKKy8qIFRoZSBmb2xsb3dpbmcgcmVkZWZpbmVzIG1ha2UgYmFja3RyYWNpbmcgdGhyb3VnaCBzaWd0cmFtcCB3b3JrLgorICAgVGhleSBtYW51ZmFjdHVyZSBhIGZha2Ugc2lndHJhbXAgZnJhbWUgYW5kIG9idGFpbiB0aGUgc2F2ZWQgcGMgaW4gc2lndHJhbXAKKyAgIGZyb20gdGhlIHVjb250ZXh0IHN0cnVjdHVyZSB3aGljaCBpcyBwdXNoZWQgYnkgdGhlIGtlcm5lbCBvbiB0aGUKKyAgIHVzZXIgc3RhY2suIFVuZm9ydHVuYXRlbHkgdGhlcmUgYXJlIHRocmVlIHZhcmlhbnRzIG9mIHNpZ3RyYW1wIGhhbmRsZXJzLiAgKi8KKworI2RlZmluZSBJMzg2VjRfU0lHVFJBTVBfU0FWRURfUEMKKyNkZWZpbmUgSU5fU0lHVFJBTVAocGMsIG5hbWUpICgobmFtZSkJCQkJCVwKKwkJCSAgICAgICAmJiAoU1RSRVEgKCJfc2lncmV0dXJuIiwgbmFtZSkJCVwKKwkJCQkgICB8fCBTVFJFUSAoIl9zaWdhY3RoYW5kbGVyIiwgbmFtZSkJXAorCQkJCSAgIHx8IFNUUkVRICgic2lndmVjaGFuZGxlciIsIG5hbWUpKSkKKworLyogU2F2ZWQgUGMuICBHZXQgaXQgZnJvbSB1Y29udGV4dCBpZiB3aXRoaW4gc2lndHJhbXAuICAqLworCisjZGVmaW5lIHNpZ3RyYW1wX3NhdmVkX3BjIGkzODZ2NF9zaWd0cmFtcF9zYXZlZF9wYworZXh0ZXJuIENPUkVfQUREUiBpMzg2djRfc2lndHJhbXBfc2F2ZWRfcGMgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworCisjZW5kaWYgIC8qIGlmbmRlZiBUTV9JMzg2VjRfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZ2NDJtcC5oIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWkzODZ2NDJtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZGY4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvdG0taTM4NnY0Mm1wLmgKQEAgLTAsMCArMSw0NCBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIEdEQiBvbiBhbiBJbnRlbCBpMzg2IHJ1bm5pbmcgU1ZSNC4yTVAKKyAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIGF0IEN5Z251cyBTdXBwb3J0IChmbmZAY3lnbnVzLmNvbSkKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIFRNX0kzODZWNDJNUF9ICisjZGVmaW5lIFRNX0kzODZWNDJNUF9IIDEKKworLyogcGljayB1cCBtb3JlIGdlbmVyaWMgeDg2IHN5c3Y0IHN0dWZmICovCisKKyNpbmNsdWRlICJpMzg2L3RtLWkzODZ2NC5oIgorCisvKiBwcm9jZnMgb24gdGhpcyBhcmNoaXRlY3R1cmUgaGFzIG11bHRpcGxlIGZkcyAoY3RsLCBhcywgbWFwLCBzdGF0dXMpCisJaW5jbHVkaW5nIGEgY29udHJvbCBmZCAqLworCisjaWZuZGVmIEhBVkVfTVVMVElQTEVfUFJPQ19GRFMKKyNkZWZpbmUgSEFWRV9NVUxUSVBMRV9QUk9DX0ZEUworI2VuZGlmCisKKy8qIHByb2NmcyBvbiB0aGlzIGFyY2hpdGVjdHVyZSBjb21tdW5pY2F0ZXMgd2l0aCByZWFkL3dyaXRlIGluc3RlYWQKKwlvZiBpb2N0bCAqLworCisjZGVmaW5lIFBST0NGU19VU0VfUkVBRF9XUklURQorCisvKiBkZWZpbmUgdG8gc2VsZWN0IGZvciBvdGhlciBzeXN2NC4ybXAgd2VpcmRuZXNzICovCisKKyNkZWZpbmUgVU5JWFdBUkUKKworI2VuZGlmICAvKiBpZm5kZWYgVE1fSTM4NlY0Mk1QX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni90bS1saW51eC5oIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLWxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3ZDE1MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni90bS1saW51eC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIERlZmluaXRpb25zIHRvIHRhcmdldCBHREIgdG8gR05VL0xpbnV4IG9uIDM4Ni4KKyAgIENvcHlyaWdodCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgVE1fTElOVVhfSAorI2RlZmluZSBUTV9MSU5VWF9ICisKKy8qIEZJWE1FOiAgSWYgbm90aGluZyBlbHNlIGdldHMgYWRkZWQgdG8gdGhpcyBmaWxlLCBpdCBjb3VsZCBiZSByZW1vdmVkCisgICBhbmQgY29uZmlndXJlIGNvdWxkIGp1c3QgdXNlIHRtLWkzODYuaCBpbnN0ZWFkLiAtZm5mICovCisKKyNpbmNsdWRlICJpMzg2L3RtLWkzODYuaCIKKworLyogT2Zmc2V0IHRvIHNhdmVkIFBDIGluIHNpZ2NvbnRleHQsIGZyb20gPGxpbnV4L3NpZ25hbC5oPi4gICovCisjZGVmaW5lIFNJR0NPTlRFWFRfUENfT0ZGU0VUIDM4CisKKy8qIFdlIG5lZWQgdGhpcyBmaWxlIGZvciB0aGUgU09MSUJfVFJBTVBPTElORSBzdHVmZi4gKi8KKworI2luY2x1ZGUgInRtLXN5c3Y0LmgiCisKKy8qIFRoZSBmb2xsb3dpbmcgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSB3aXRoIC91c3IvaW5jbHVkZS9zeXMvcHJvY2ZzLmggICovCisjZGVmaW5lIHN5c19xdW90YWN0bCAxCisKKyNlbmRpZiAgLyogI2lmbmRlZiBUTV9MSU5VWF9IICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvdG0tbmJzZC5oIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLW5ic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjUxNTlmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLW5ic2QuaApAQCAtMCwwICsxLDQyIEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgaTM4NiBydW5uaW5nIHVuZGVyIE5ldEJTRC4KKyAgIENvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgVE1fTkJTRF9ICisjZGVmaW5lIFRNX05CU0RfSAorCisjaW5jbHVkZSAiaTM4Ni90bS1pMzg2YnNkLmgiCisjaW5jbHVkZSAidG0tbmJzZC5oIgorCisjdW5kZWYgTlVNX1JFR1MKKyNkZWZpbmUgTlVNX1JFR1MgMTYKKworI2RlZmluZSBKQl9FTEVNRU5UX1NJWkUgc2l6ZW9mKGludCkJLyogam1wX2J1ZltfSkJMRU5dIGlzIGFycmF5IG9mIGludHMgKi8KKyNkZWZpbmUgSkJfUEMJMAkJCS8qIFNldGptcCgpJ3MgcmV0dXJuIFBDIHNhdmVkIGhlcmUgKi8KKworLyogRmlndXJlIG91dCB3aGVyZSB0aGUgbG9uZ2ptcCB3aWxsIGxhbmQuICBTbHVycCB0aGUgYXJncyBvdXQgb2YgdGhlIHN0YWNrLgorICAgV2UgZXhwZWN0IHRoZSBmaXJzdCBhcmcgdG8gYmUgYSBwb2ludGVyIHRvIHRoZSBqbXBfYnVmIHN0cnVjdHVyZSBmcm9tIHdoaWNoCisgICB3ZSBleHRyYWN0IHRoZSBwYyAoSkJfUEMpIHRoYXQgd2Ugd2lsbCBsYW5kIGF0LiAgVGhlIHBjIGlzIGNvcGllZCBpbnRvIEFERFIuCisgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MgKi8KKworZXh0ZXJuIGludAorZ2V0X2xvbmdqbXBfdGFyZ2V0IFBBUkFNUyAoKENPUkVfQUREUiAqKSk7CisKKyNkZWZpbmUgR0VUX0xPTkdKTVBfVEFSR0VUKEFERFIpIGdldF9sb25nam1wX3RhcmdldChBRERSKQorCisjZW5kaWYgLyogVE1fTkJTRF9IICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvdG0tcHR4LmggYi9nZGIvY29uZmlnL2kzODYvdG0tcHR4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlmNjdkNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni90bS1wdHguaApAQCAtMCwwICsxLDIzMiBAQAorLyogVGFyZ2V0IG1hY2hpbmUgZGVmaW5pdGlvbnMgZm9yIEdEQiBvbiBhIFNlcXVlbnQgU3ltbWV0cnkgdW5kZXIgcHR4CisgICB3aXRoIFdlaXRlayAxMTY3IGFuZCBpMzg3IHN1cHBvcnQuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFN5bW1ldHJ5IHZlcnNpb24gYnkgSmF5IFZvc2J1cmdoIChmdWJhckBzZXF1ZW50LmNvbSkuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBUTV9QVFhfSAorI2RlZmluZSBUTV9QVFhfSCAxCisKKy8qIEkgZG9uJ3Qga25vdyBpZiB0aGlzIHdpbGwgd29yayBmb3IgY3Jvc3MtZGVidWdnaW5nLCBldmVuIGlmIHlvdSBkbyBnZXQKKyAgIGEgY29weSBvZiB0aGUgcmlnaHQgaW5jbHVkZSBmaWxlLiAgKi8KKworI2luY2x1ZGUgPHN5cy9yZWcuaD4KKworI2lmZGVmIFNFUVVFTlRfUFRYNAorI2luY2x1ZGUgImkzODYvdG0taTM4NnY0LmgiCisjZWxzZSAvKiAhU0VRVUVOVF9QVFg0ICovCisjaW5jbHVkZSAiaTM4Ni90bS1pMzg2di5oIgorI2VuZGlmCisKKy8qIE51bWJlciBvZiB0cmFwcyB0aGF0IGhhcHBlbiBiZXR3ZWVuIGV4ZWMnaW5nIHRoZSBzaGVsbCB0byBydW4gYW4KKyAgIGluZmVyaW9yLCBhbmQgd2hlbiB3ZSBmaW5hbGx5IGdldCB0byB0aGUgaW5mZXJpb3IgY29kZS4gIFRoaXMgaXMgMgorICAgb24gbW9zdCBpbXBsZW1lbnRhdGlvbnMuIEhlcmUgd2UgaGF2ZSB0byB1bmRvIHdoYXQgdG0taTM4NnYuaCBnYXZlCisgICB1cyBhbmQgcmVzdG9yZSB0aGUgZGVmYXVsdC4gKi8KKworI3VuZGVmIFNUQVJUX0lORkVSSU9SX1RSQVBTX0VYUEVDVEVECisjZGVmaW5lIFNUQVJUX0lORkVSSU9SX1RSQVBTX0VYUEVDVEVEIDIKKworLyogQW1vdW50IFBDIG11c3QgYmUgZGVjcmVtZW50ZWQgYnkgYWZ0ZXIgYSBicmVha3BvaW50LiAgVGhpcyBpcyBvZnRlbiB0aGUKKyAgIG51bWJlciBvZiBieXRlcyBpbiBCUkVBS1BPSU5UIGJ1dCBub3QgYWx3YXlzIChzdWNoIGFzIG5vdykuICovCisKKyN1bmRlZiBERUNSX1BDX0FGVEVSX0JSRUFLCisjZGVmaW5lIERFQ1JfUENfQUZURVJfQlJFQUsgMAorCisjaWYgMAorIC0tLSB0aGlzIGNvZGUgY2FuJ3QgYmUgdXNlZCB1bmxlc3Mgd2Uga25vdyB3ZSBhcmUgcnVubmluZyBuYXRpdmUsCisgICAgIHNpbmNlIGl0IHVzZXMgaG9zdCBzcGVjaWZpYyBwdHJhY2UgY2FsbHMuCisvKiBjb2RlIGZvciA4MDM4NyBmcHUuICBGdW5jdGlvbnMgYXJlIGZyb20gaTM4Ni1kZXAuYywgY29waWVkIGludG8KKyAqIHN5bW0tZGVwLmMuCisgKi8KKyNkZWZpbmUgRkxPQVRfSU5GTyB7IGkzODZfZmxvYXRfaW5mbygpOyB9CisjZW5kaWYKKworLyogTnVtYmVyIG9mIG1hY2hpbmUgcmVnaXN0ZXJzICovCisKKyN1bmRlZiAgTlVNX1JFR1MKKyNkZWZpbmUgTlVNX1JFR1MgNDkKKworLyogSW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIG5hbWVzIG9mIHJlZ2lzdGVycy4gIFRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdAorICAgTlVNX1JFR1Mgc3RyaW5ncyBpbiB0aGlzIGluaXRpYWxpemVyLiAgQW55IGV4Y2VzcyBvbmVzIGFyZSBzaW1wbHkgaWdub3JlZC4KKyAgIFRoZSBvcmRlciBvZiB0aGUgZmlyc3QgOCByZWdpc3RlcnMgbXVzdCBtYXRjaCB0aGUgY29tcGlsZXIncyBudW1iZXJpbmcKKyAgIHNjaGVtZSAod2hpY2ggaXMgdGhlIHNhbWUgYXMgdGhlIDM4NiBzY2hlbWUpIGFuZCBhbHNvIHJlZ21hcCBpbiB0aGUgdmFyaW91cworICAgKi1uYXQuYyBmaWxlcy4gKi8KKworI3VuZGVmICBSRUdJU1RFUl9OQU1FUworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyB7ICJlYXgiLCAgImVjeCIsICAgICJlZHgiLCAgImVieCIsICBcCisJCQkgImVzcCIsICAiZWJwIiwgICAgImVzaSIsICAiZWRpIiwgIFwKKwkJCSAiZWlwIiwgICJlZmxhZ3MiLCAic3QwIiwgICJzdDEiLCAgXAorCQkJICJzdDIiLCAgInN0MyIsICAgICJzdDQiLCAgInN0NSIsICBcCisJCQkgInN0NiIsICAic3Q3IiwgICAgImZwMSIsICAiZnAyIiwgIFwKKwkJCSAiZnAzIiwgICJmcDQiLCAgICAiZnA1IiwgICJmcDYiLCAgXAorCQkJICJmcDciLCAgImZwOCIsICAgICJmcDkiLCAgImZwMTAiLCBcCisJCQkgImZwMTEiLCAiZnAxMiIsICAgImZwMTMiLCAiZnAxNCIsIFwKKwkJCSAiZnAxNSIsICJmcDE2IiwgICAiZnAxNyIsICJmcDE4IiwgXAorCQkJICJmcDE5IiwgImZwMjAiLCAgICJmcDIxIiwgImZwMjIiLCBcCisJCQkgImZwMjMiLCAiZnAyNCIsICAgImZwMjUiLCAiZnAyNiIsIFwKKwkJCSAiZnAyNyIsICJmcDI4IiwgICAiZnAyOSIsICJmcDMwIiwgXAorCQkJICJmcDMxIiB9CisKKy8qIFJlZ2lzdGVyIG51bWJlcnMgb2YgdmFyaW91cyBpbXBvcnRhbnQgcmVnaXN0ZXJzLgorICAgTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2UgdmFsdWVzIGFyZSAicmVhbCIgcmVnaXN0ZXIgbnVtYmVycywKKyAgIGFuZCBjb3JyZXNwb25kIHRvIHRoZSBnZW5lcmFsIHJlZ2lzdGVycyBvZiB0aGUgbWFjaGluZSwKKyAgIGFuZCBzb21lIGFyZSAicGhvbnkiIHJlZ2lzdGVyIG51bWJlcnMgd2hpY2ggYXJlIHRvbyBsYXJnZQorICAgdG8gYmUgYWN0dWFsIHJlZ2lzdGVyIG51bWJlcnMgYXMgZmFyIGFzIHRoZSB1c2VyIGlzIGNvbmNlcm5lZAorICAgYnV0IGRvIHNlcnZlIHRvIGdldCB0aGUgZGVzaXJlZCB2YWx1ZXMgd2hlbiBwYXNzZWQgdG8gcmVhZF9yZWdpc3Rlci4gICovCisKKyNkZWZpbmUgRUFYX1JFR05VTQkwCisjZGVmaW5lIEVDWF9SRUdOVU0JMQorI2RlZmluZSBFRFhfUkVHTlVNCTIKKyNkZWZpbmUgRUJYX1JFR05VTQkzCisKKyNkZWZpbmUgRVNQX1JFR05VTQk0CisjZGVmaW5lIEVCUF9SRUdOVU0JNQorCisjZGVmaW5lIEVTSV9SRUdOVU0JNgorI2RlZmluZSBFRElfUkVHTlVNCTcKKworI2RlZmluZSBFSVBfUkVHTlVNCTgKKyNkZWZpbmUgRUZMQUdTX1JFR05VTQk5CisKKyNkZWZpbmUgU1QwX1JFR05VTQkxMAorI2RlZmluZSBTVDFfUkVHTlVNCTExCisjZGVmaW5lIFNUMl9SRUdOVU0JMTIKKyNkZWZpbmUgU1QzX1JFR05VTQkxMworCisjZGVmaW5lIFNUNF9SRUdOVU0JMTQKKyNkZWZpbmUgU1Q1X1JFR05VTQkxNQorI2RlZmluZSBTVDZfUkVHTlVNCTE2CisjZGVmaW5lIFNUN19SRUdOVU0JMTcKKworI2RlZmluZSBGUDFfUkVHTlVNIDE4CQkvKiBmaXJzdCAxMTY3IHJlZ2lzdGVyICovCisvKiBHZXQgJWZwMiAtICVmcDMxIGJ5IGFkZGl0aW9uLCBzaW5jZSB0aGV5IGFyZSBjb250aWd1b3VzICovCisKKyN1bmRlZiAgU1BfUkVHTlVNCisjZGVmaW5lIFNQX1JFR05VTSBFU1BfUkVHTlVNCS8qIENvbnRhaW5zIGFkZHJlc3Mgb2YgdG9wIG9mIHN0YWNrICovCisjdW5kZWYgIEZQX1JFR05VTQorI2RlZmluZSBGUF9SRUdOVU0gRUJQX1JFR05VTQkvKiBDb250YWlucyBhZGRyZXNzIG9mIGV4ZWN1dGluZyBzdGFjayBmcmFtZSAqLworI3VuZGVmICBQQ19SRUdOVU0KKyNkZWZpbmUgUENfUkVHTlVNIEVJUF9SRUdOVU0JLyogQ29udGFpbnMgcHJvZ3JhbSBjb3VudGVyICovCisjdW5kZWYgIFBTX1JFR05VTQorI2RlZmluZSBQU19SRUdOVU0gRUZMQUdTX1JFR05VTQkvKiBDb250YWlucyBwcm9jZXNzb3Igc3RhdHVzICovCisKKy8qCisgKiBGb3IgcHR4LCB0aGlzIGlzIGEgbGl0dGxlIGJpdCBiaXphcnJlLCBzaW5jZSB0aGUgcmVnaXN0ZXIgYmxvY2sKKyAqIGlzIGJlbG93IHRoZSB1IGFyZWEgaW4gbWVtb3J5LiAgVGhpcyBtZWFucyB0aGF0IGJsb2NrZW5kIGhlcmUgZW5kcworICogdXAgYmVpbmcgbmVnYXRpdmUgKGZvciB0aGUgY2FsbCBmcm9tIGNvcmVkZXAuYykgc2luY2UgdGhlIHZhbHVlIGluCisgKiB1LnVfYXIwIHdpbGwgYmUgbGVzcyB0aGFuIEtFUk5FTF9VX0FERFIgKGFuZCBjb3JlZGVwLmMgcGFzc2VzIHVzCisgKiB1LnVfYXIwIC0gS0VSTkVMX1VfQUREUiBpbiBibG9ja2VuZCkuICBTaW5jZSB3ZSBhbHNvIGRlZmluZQorICogRkVUQ0hfSU5GRVJJT1JfUkVHSVNURVJTIChhbmQgc3VwcGx5IG91ciBvd24gZnVuY3Rpb25zIGZvciB0aGF0KSwKKyAqIHRoZSBjb3JlIGZpbGUgY2FzZSB3aWxsIGJlIHRoZSBvbmx5IHVzZSBvZiB0aGlzIGZ1bmN0aW9uLgorICovCisKKyNkZWZpbmUgUkVHSVNURVJfVV9BRERSKGFkZHIsIGJsb2NrZW5kLCByZWdubykgXAoreyAoYWRkcikgPSBwdHhfcmVnaXN0ZXJfdV9hZGRyKChibG9ja2VuZCksIChyZWdubykpOyB9CisKK2V4dGVybiBpbnQKK3B0eF9yZWdpc3Rlcl91X2FkZHIgUEFSQU1TICgoaW50LCBpbnQpKTsKKworLyogVG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCB0byBzdG9yZSBvdXIgY29waWVzIG9mIHRoZSBtYWNoaW5lJ3MKKyAgIHJlZ2lzdGVyIHN0YXRlLCB0aGUgYXJyYXkgYHJlZ2lzdGVycycuICAxMCBpKjg2IHJlZ2lzdGVycywgOCBpMzg3CisgICByZWdpc3RlcnMsIGFuZCAzMSBXZWl0ZWsgMTE2NyByZWdpc3RlcnMgKi8KKworI3VuZGVmICBSRUdJU1RFUl9CWVRFUworI2RlZmluZSBSRUdJU1RFUl9CWVRFUyAoKDEwICogNCkgKyAoOCAqIDEwKSArICgzMSAqIDQpKQorCisvKiBJbmRleCB3aXRoaW4gYHJlZ2lzdGVycycgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNwYWNlIGZvciByZWdpc3RlciBOLiAqLworCisjdW5kZWYgIFJFR0lTVEVSX0JZVEUKKyNkZWZpbmUgUkVHSVNURVJfQllURShOKSAJCVwKKygoKE4pIDwgU1QwX1JFR05VTSkgPyAoKE4pICogNCkgOiBcCisgKChOKSA8IEZQMV9SRUdOVU0pID8gKDQwICsgKCgoTikgLSBTVDBfUkVHTlVNKSAqIDEwKSkgOiBcCisgKDQwICsgODAgKyAoKChOKSAtIEZQMV9SRUdOVU0pICogNCkpKQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgYWN0dWFsIG1hY2hpbmUgcmVwcmVzZW50YXRpb24gZm9yCisgICByZWdpc3RlciBOLiAgQWxsIHJlZ2lzdGVycyBhcmUgNCBieXRlcywgZXhjZXB0IDM4NyBzdCgwKSAtIHN0KDcpLAorICAgd2hpY2ggYXJlIDgwIGJpdHMgZWFjaC4gKi8KKworI3VuZGVmICBSRUdJU1RFUl9SQVdfU0laRQorI2RlZmluZSBSRUdJU1RFUl9SQVdfU0laRShOKSBcCisoKChOKSA8IFNUMF9SRUdOVU0pID8gNCA6IFwKKyAoKE4pIDwgRlAxX1JFR05VTSkgPyAxMCA6IFwKKyA0KQorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1JBV19TSVpFIGNhbiBoYXZlLiAgKi8KKworI3VuZGVmICBNQVhfUkVHSVNURVJfUkFXX1NJWkUKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1JBV19TSVpFIDEwCisKKy8qIE5vbnplcm8gaWYgcmVnaXN0ZXIgTiByZXF1aXJlcyBjb252ZXJzaW9uCisgICBmcm9tIHJhdyBmb3JtYXQgdG8gdmlydHVhbCBmb3JtYXQuICAqLworCisjdW5kZWYgUkVHSVNURVJfQ09OVkVSVElCTEUKKyNkZWZpbmUgUkVHSVNURVJfQ09OVkVSVElCTEUoTikgXAorKChOIDwgU1QwX1JFR05VTSkgPyAwIDogXAorIChOIDwgRlAxX1JFR05VTSkgPyAxIDogXAorIDApCisgIAorLyogQ29udmVydCBkYXRhIGZyb20gcmF3IGZvcm1hdCBmb3IgcmVnaXN0ZXIgUkVHTlVNCisgICB0byB2aXJ0dWFsIGZvcm1hdCBmb3IgcmVnaXN0ZXIgUkVHTlVNLiAgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaTM4N19leHQ7IC8qIGZyb20gZmxvYXRmb3JtYXQuaCAqLworCisjdW5kZWYgUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMCisjZGVmaW5lIFJFR0lTVEVSX0NPTlZFUlRfVE9fVklSVFVBTChSRUdOVU0sVFlQRSxGUk9NLFRPKQlcCisoKFJFR05VTSA8IFNUMF9SRUdOVU0pID8gICh2b2lkKW1lbWNweSAoKFRPKSwgKEZST00pLCA0KSA6IFwKKyAoUkVHTlVNIDwgRlAxX1JFR05VTSkgPyAodm9pZClmbG9hdGZvcm1hdF90b19kb3VibGUoJmZsb2F0Zm9ybWF0X2kzODdfZXh0LCBcCisJCQkJCQkgICAgICAgKEZST00pLChUTykpIDogXAorICh2b2lkKW1lbWNweSAoKFRPKSwgKEZST00pLCA0KSkKKyAKKy8qIENvbnZlcnQgZGF0YSBmcm9tIHZpcnR1YWwgZm9ybWF0IGZvciByZWdpc3RlciBSRUdOVU0KKyAgIHRvIHJhdyBmb3JtYXQgZm9yIHJlZ2lzdGVyIFJFR05VTS4gICovCisKKyN1bmRlZiBSRUdJU1RFUl9DT05WRVJUX1RPX1JBVworI2RlZmluZSBSRUdJU1RFUl9DT05WRVJUX1RPX1JBVyhUWVBFLFJFR05VTSxGUk9NLFRPKQlcCisoKFJFR05VTSA8IFNUMF9SRUdOVU0pID8gICh2b2lkKW1lbWNweSAoKFRPKSwgKEZST00pLCA0KSA6IFwKKyAoUkVHTlVNIDwgRlAxX1JFR05VTSkgPyAodm9pZClmbG9hdGZvcm1hdF9mcm9tX2RvdWJsZSgmZmxvYXRmb3JtYXRfaTM4N19leHQsIFwKKwkJCQkJCSAgICAgICAoRlJPTSksKFRPKSkgOiBcCisgKHZvaWQpbWVtY3B5ICgoVE8pLCAoRlJPTSksIDQpKQorCisvKiBSZXR1cm4gdGhlIEdEQiB0eXBlIG9iamVjdCBmb3IgdGhlICJzdGFuZGFyZCIgZGF0YSB0eXBlCisgICBvZiBkYXRhIGluIHJlZ2lzdGVyIE4uICAqLworLyoKKyAqIE5vdGU6IHRoZSAxMTY3IHJlZ2lzdGVycyAodGhlIGxhc3QgbGluZSwgYnVpbHRpbl90eXBlX2Zsb2F0KSBhcmUKKyAqIGdlbmVyYWxseSB1c2VkIGluIHBhaXJzLCB3aXRoIGVhY2ggcGFpciBiZWluZyB0cmVhdGVkIGFzIGEgZG91YmxlLgorICogSXQgaXQgYWxzbyBwb3NzaWJsZSB0byB1c2UgdGhlbSBzaW5nbHkgYXMgZmxvYXRzLiAgSSdtIG5vdCBzdXJlIGhvdworICogaW4gZ2RiIHRvIHRyZWF0IHRoZSByZWdpc3RlciBwYWlyIHBzZXVkby1kb3VibGVzLiAtZnViYXIKKyAqLworI3VuZGVmIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRQorI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1RZUEUoTikgXAorKChOIDwgU1QwX1JFR05VTSkgPyBidWlsdGluX3R5cGVfaW50IDogXAorIChOIDwgRlAxX1JFR05VTSkgPyBidWlsdGluX3R5cGVfZG91YmxlIDogXAorIGJ1aWx0aW5fdHlwZV9mbG9hdCkKKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgb2YgdHlwZSBUWVBFLCBhbmQgY29weSB0aGF0LCBpbiB2aXJ0dWFsIGZvcm1hdCwKKyAgIGludG8gVkFMQlVGLiAgKi8KKworI3VuZGVmICBFWFRSQUNUX1JFVFVSTl9WQUxVRQorI2RlZmluZSBFWFRSQUNUX1JFVFVSTl9WQUxVRShUWVBFLFJFR0JVRixWQUxCVUYpIFwKKyAgc3ltbWV0cnlfZXh0cmFjdF9yZXR1cm5fdmFsdWUoVFlQRSwgUkVHQlVGLCBWQUxCVUYpCisKKy8qCisjdW5kZWYgIEZSQU1FX0ZJTkRfU0FWRURfUkVHUworI2RlZmluZSBGUkFNRV9GSU5EX1NBVkVEX1JFR1MoZnJhbWVfaW5mbywgZnJhbWVfc2F2ZWRfcmVncykgXAoreyBwdHhfZnJhbWVfZmluZF9zYXZlZF9yZWdzKChmcmFtZV9pbmZvKSwgJihmcmFtZV9zYXZlZF9yZWdzKSk7IH0KKyovCisKKyNlbmRpZiAgLyogaWZuZGVmIFRNX1BUWF9IICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvdG0tcHR4NC5oIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLXB0eDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTc2YWNjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3RtLXB0eDQuaApAQCAtMCwwICsxLDI0IEBACisvKiBUYXJnZXQgbWFjaGluZSBkZWZpbml0aW9ucyBmb3IgR0RCIG9uIGEgU2VxdWVudCBTeW1tZXRyeSB1bmRlciBwdHgKKyAgIHdpdGggV2VpdGVrIDExNjcgYW5kIGkzODcgc3VwcG9ydC4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgU3ltbWV0cnkgdmVyc2lvbiBieSBKYXkgVm9zYnVyZ2ggKGZ1YmFyQHNlcXVlbnQuY29tKS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFNFUVVFTlRfUFRYNAorCisjaW5jbHVkZSAidG0tcHR4LmgiCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvdG0tc3VuMzg2LmggYi9nZGIvY29uZmlnL2kzODYvdG0tc3VuMzg2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5ZmQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni90bS1zdW4zODYuaApAQCAtMCwwICsxLDIwNSBAQAorLyogUGFyYW1ldGVycyBmb3IgYSBTdW4gMzg2aSB0YXJnZXQgbWFjaGluZSwgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCAoVE1fU1VOMzg2X0gpCisjZGVmaW5lIFRNX1NVTjM4Nl9IIDEKKworI2luY2x1ZGUgImkzODYvdG0taTM4Ni5oIgorCisjaWZuZGVmIHN1bjM4NgorI2RlZmluZSBzdW4zODYKKyNlbmRpZgorI2RlZmluZSBHREJfVEFSR0VUX0lTX1NVTjM4NiAxCisjZGVmaW5lIFNVTk9TNAorI2RlZmluZSBVU0VfTUFDSElORV9SRUdfSAorCisvKiBQZXJoYXBzIHNvbWUgZGF5IHRoaXMgd2lsbCB3b3JrIGV2ZW4gd2l0aG91dCB0aGUgZm9sbG93aW5nICNkZWZpbmUgKi8KKyNkZWZpbmUgQ09GRl9FTkNBUFNVTEFURQorCisjaWZkZWYgQ09GRl9FTkNBUFNVTEFURQorLyogQXZvaWQgY29uZmxpY3RzIGJldHdlZW4gb3VyIGluY2x1ZGUgZmlsZXMgYW5kIDxzeXMvZXhlYy5oPgorICAgKG1heWJlIG5vdCBuZWVkZWQgYW55bW9yZSkuICAqLworI2RlZmluZSBfRVhFQ18KKyNlbmRpZgorCisvKiBzdW4zODYgcHRyYWNlIHNlZW1zIHVuYWJsZSB0byBjaGFuZ2UgdGhlIGZyYW1lIHBvaW50ZXIgKi8KKyNkZWZpbmUgUFRSQUNFX0ZQX0JVRworCisvKiBBZGRyZXNzIG9mIGVuZCBvZiBzdGFjayBzcGFjZS4gICovCisKKyNkZWZpbmUgU1RBQ0tfRU5EX0FERFIgMHhmYzAwMDAwMAorCisvKiBOdW1iZXIgb2YgbWFjaGluZSByZWdpc3RlcnMgKi8KKworI3VuZGVmICBOVU1fUkVHUworI2RlZmluZSBOVU1fUkVHUyAzNQorCisvKiBJbml0aWFsaXplciBmb3IgYW4gYXJyYXkgb2YgbmFtZXMgb2YgcmVnaXN0ZXJzLiAgVGhlcmUgc2hvdWxkIGJlIE5VTV9SRUdTCisgICBzdHJpbmdzIGluIHRoaXMgaW5pdGlhbGl6ZXIuICBUaGUgb3JkZXIgb2YgdGhlIGZpcnN0IDggcmVnaXN0ZXJzIG11c3QgbWF0Y2gKKyAgIHRoZSBjb21waWxlcidzIG51bWJlcmluZyBzY2hlbWUgKHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSAzODYgc2NoZW1lKSBhbHNvLAorICAgdGhpcyB0YWJsZSBtdXN0IG1hdGNoIHJlZ21hcCBpbiBpMzg2LXBpbnNuLmMuICovCisKKyN1bmRlZiAgUkVHSVNURVJfTkFNRVMKKyNkZWZpbmUgUkVHSVNURVJfTkFNRVMgeyAiZ3MiLCAiZnMiLCAiZXMiLCAiZHMiLAkJXAorCQkJICJlZGkiLCAiZXNpIiwgImVicCIsICJlc3AiLAkJXAorCQkJICJlYngiLCAiZWR4IiwgImVjeCIsICJlYXgiLAkJXAorCQkJICJyZXRhZGRyIiwgInRyYXBudW0iLCAiZXJyY29kZSIsICJpcCIsCVwKKwkJCSAiY3MiLCAicHMiLCAic3AiLCAic3MiLAkJXAorCQkJICJmc3QwIiwgImZzdDEiLCAiZnN0MiIsICJmc3QzIiwJXAorCQkJICJmc3Q0IiwgImZzdDUiLCAiZnN0NiIsICJmc3Q3IiwJXAorCQkJICJmY3RybCIsICJmc3RhdCIsICJmdGFnIiwgImZpcCIsCVwKKwkJCSAiZmNzIiwgImZvcG9mZiIsICJmb3BzZWwiCQlcCisJCQkgfQorCisvKiBSZWdpc3RlciBudW1iZXJzIG9mIHZhcmlvdXMgaW1wb3J0YW50IHJlZ2lzdGVycy4KKyAgIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgInJlYWwiIHJlZ2lzdGVyIG51bWJlcnMsCisgICBhbmQgY29ycmVzcG9uZCB0byB0aGUgZ2VuZXJhbCByZWdpc3RlcnMgb2YgdGhlIG1hY2hpbmUsCisgICBhbmQgc29tZSBhcmUgInBob255IiByZWdpc3RlciBudW1iZXJzIHdoaWNoIGFyZSB0b28gbGFyZ2UKKyAgIHRvIGJlIGFjdHVhbCByZWdpc3RlciBudW1iZXJzIGFzIGZhciBhcyB0aGUgdXNlciBpcyBjb25jZXJuZWQKKyAgIGJ1dCBkbyBzZXJ2ZSB0byBnZXQgdGhlIGRlc2lyZWQgdmFsdWVzIHdoZW4gcGFzc2VkIHRvIHJlYWRfcmVnaXN0ZXIuICAqLworCisjdW5kZWYgIEZQX1JFR05VTQorI2RlZmluZSBGUF9SRUdOVU0gICA2CS8qIChlYnApIENvbnRhaW5zIGFkZHJlc3Mgb2YgZXhlY3V0aW5nIHN0YWNrIGZyYW1lICovCisjdW5kZWYgIFNQX1JFR05VTQorI2RlZmluZSBTUF9SRUdOVU0gIDE4CS8qICh1c3ApIENvbnRhaW5zIGFkZHJlc3Mgb2YgdG9wIG9mIHN0YWNrICovCisjdW5kZWYgIFBTX1JFR05VTQorI2RlZmluZSBQU19SRUdOVU0gIDE3CS8qIChwcykgIENvbnRhaW5zIHByb2Nlc3NvciBzdGF0dXMgKi8KKyN1bmRlZiAgUENfUkVHTlVNCisjZGVmaW5lIFBDX1JFR05VTSAgMTUJLyogKGVpcCkgQ29udGFpbnMgcHJvZ3JhbSBjb3VudGVyICovCisjdW5kZWYgIEZQMF9SRUdOVU0KKyNkZWZpbmUgRlAwX1JFR05VTSAyMAkvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlciAwICovCisjdW5kZWYgIEZQQ19SRUdOVU0KKyNkZWZpbmUgRlBDX1JFR05VTSAyOAkvKiA4MDM4NyBjb250cm9sIHJlZ2lzdGVyICovCisKKy8qIFRvdGFsIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgdG8gc3RvcmUgb3VyIGNvcGllcyBvZiB0aGUgbWFjaGluZSdzCisgICByZWdpc3RlciBzdGF0ZSwgdGhlIGFycmF5IGByZWdpc3RlcnMnLiAgKi8KKworI3VuZGVmICBSRUdJU1RFUl9CWVRFUworI2RlZmluZSBSRUdJU1RFUl9CWVRFUyAoMjAqNCs4KjEwKzcqNCkKKworLyogSW5kZXggd2l0aGluIGByZWdpc3RlcnMnIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzcGFjZSBmb3IKKyAgIHJlZ2lzdGVyIE4uICAqLworCisjdW5kZWYgIFJFR0lTVEVSX0JZVEUKKyNkZWZpbmUgUkVHSVNURVJfQllURShOKSBcCisgKChOKSA+PSBGUENfUkVHTlVNID8gKCgoTikgLSBGUENfUkVHTlVNKSAqIDQpICsgMTYwCVwKKyAgOiAoTikgPj0gRlAwX1JFR05VTSA/ICgoKE4pIC0gRlAwX1JFR05VTSkgKiAxMCkgKyA4MAlcCisgIDogKE4pICogNCkKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIGFjdHVhbCBtYWNoaW5lIHJlcHJlc2VudGF0aW9uCisgICBmb3IgcmVnaXN0ZXIgTi4gICovCisKKyN1bmRlZiAgUkVHSVNURVJfUkFXX1NJWkUKKyNkZWZpbmUgUkVHSVNURVJfUkFXX1NJWkUoTikgKCgodW5zaWduZWQpKChOKSAtIEZQMF9SRUdOVU0pKSA8IDggPyAxMCA6IDQpCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBwcm9ncmFtJ3MgcmVwcmVzZW50YXRpb24KKyAgIGZvciByZWdpc3RlciBOLiAqLworCisjdW5kZWYgIFJFR0lTVEVSX1ZJUlRVQUxfU0laRQorI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUoTikgKCgodW5zaWduZWQpKChOKSAtIEZQMF9SRUdOVU0pKSA8IDggPyA4IDogNCkKKworLyogTm9uemVybyBpZiByZWdpc3RlciBOIHJlcXVpcmVzIGNvbnZlcnNpb24KKyAgIGZyb20gcmF3IGZvcm1hdCB0byB2aXJ0dWFsIGZvcm1hdC4gICovCisKKyN1bmRlZiAgUkVHSVNURVJfQ09OVkVSVElCTEUKKyNkZWZpbmUgUkVHSVNURVJfQ09OVkVSVElCTEUoTikgKCgodW5zaWduZWQpKChOKSAtIEZQMF9SRUdOVU0pKSA8IDgpCisKKy8qIENvbnZlcnQgZGF0YSBmcm9tIHJhdyBmb3JtYXQgZm9yIHJlZ2lzdGVyIFJFR05VTSBpbiBidWZmZXIgRlJPTQorICAgdG8gdmlydHVhbCBmb3JtYXQgd2l0aCB0eXBlIFRZUEUgaW4gYnVmZmVyIFRPLiAgKi8KKworI3VuZGVmICBSRUdJU1RFUl9DT05WRVJUX1RPX1ZJUlRVQUwKKyNkZWZpbmUgUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMKFJFR05VTSxUWVBFLEZST00sVE8pIFwKK3sgXAorICBkb3VibGUgdmFsOyBcCisgIGkzODdfdG9fZG91YmxlICgoRlJPTSksIChjaGFyICopJnZhbCk7IFwKKyAgc3RvcmVfZmxvYXRpbmcgKChUTyksIFRZUEVfTEVOR1RIIChUWVBFKSwgdmFsKTsgXAorfQorZXh0ZXJuIHZvaWQKK2kzODdfdG9fZG91YmxlIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKSk7CisKKy8qIENvbnZlcnQgZGF0YSBmcm9tIHZpcnR1YWwgZm9ybWF0IHdpdGggdHlwZSBUWVBFIGluIGJ1ZmZlciBGUk9NCisgICB0byByYXcgZm9ybWF0IGZvciByZWdpc3RlciBSRUdOVU0gaW4gYnVmZmVyIFRPLiAgKi8KKworI3VuZGVmICBSRUdJU1RFUl9DT05WRVJUX1RPX1JBVworI2RlZmluZSBSRUdJU1RFUl9DT05WRVJUX1RPX1JBVyhUWVBFLFJFR05VTSxGUk9NLFRPKSBcCit7IFwKKyAgZG91YmxlIHZhbCA9IGV4dHJhY3RfZmxvYXRpbmcgKChGUk9NKSwgVFlQRV9MRU5HVEggKFRZUEUpKTsgXAorICBkb3VibGVfdG9faTM4NygoY2hhciAqKSZ2YWwsIChUTykpOyBcCit9CitleHRlcm4gdm9pZAorZG91YmxlX3RvX2kzODcgUEFSQU1TICgoY2hhciAqLCBjaGFyICopKTsKKworLyogUmV0dXJuIHRoZSBHREIgdHlwZSBvYmplY3QgZm9yIHRoZSAic3RhbmRhcmQiIGRhdGEgdHlwZQorICAgb2YgZGF0YSBpbiByZWdpc3RlciBOLiAgKi8KKworI3VuZGVmICBSRUdJU1RFUl9WSVJUVUFMX1RZUEUKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9UWVBFKE4pIFwKKyAoKCh1bnNpZ25lZCkoKE4pIC0gRlAwX1JFR05VTSkpIDwgOCA/IGJ1aWx0aW5fdHlwZV9kb3VibGUgOiBidWlsdGluX3R5cGVfaW50KQorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwgZm9ybWF0LAorICAgaW50byBWQUxCVUYuICAqLworCisjdW5kZWYgIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFCisjZGVmaW5lIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKFRZUEUsUkVHQlVGLFZBTEJVRikgXAorICBtZW1jcHkgKFZBTEJVRiwgUkVHQlVGICsgUkVHSVNURVJfQllURSAoVFlQRV9DT0RFIChUWVBFKSA9PSBUWVBFX0NPREVfRkxUID8gRlAwX1JFR05VTSA6IDExKSwgVFlQRV9MRU5HVEggKFRZUEUpKQorCisvKiBXcml0ZSBpbnRvIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZQorICAgb2YgdHlwZSBUWVBFLCBnaXZlbiBpbiB2aXJ0dWFsIGZvcm1hdC4gICovCisKKyN1bmRlZiAgU1RPUkVfUkVUVVJOX1ZBTFVFCisjZGVmaW5lIFNUT1JFX1JFVFVSTl9WQUxVRShUWVBFLFZBTEJVRikgXAorICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSAoVFlQRV9DT0RFIChUWVBFKSA9PSBUWVBFX0NPREVfRkxUID8gRlAwX1JFR05VTSA6IDExKSwgVkFMQlVGLCBUWVBFX0xFTkdUSCAoVFlQRSkpCisKKy8qIERlc2NyaWJlIHRoZSBwb2ludGVyIGluIGVhY2ggc3RhY2sgZnJhbWUgdG8gdGhlIHByZXZpb3VzIHN0YWNrIGZyYW1lCisgICAoaXRzIGNhbGxlcikuICAqLworCisvKiBGUkFNRV9DSEFJTiB0YWtlcyBhIGZyYW1lJ3Mgbm9taW5hbCBhZGRyZXNzCisgICBhbmQgcHJvZHVjZXMgdGhlIGZyYW1lJ3MgY2hhaW4tcG9pbnRlci4gKi8KKworI3VuZGVmICBGUkFNRV9DSEFJTgorI2RlZmluZSBGUkFNRV9DSEFJTih0aGlzZnJhbWUpIFwKKyAgKCFpbnNpZGVfZW50cnlfZmlsZSAoKHRoaXNmcmFtZSktPnBjKSA/IFwKKyAgIHJlYWRfbWVtb3J5X2ludGVnZXIgKCh0aGlzZnJhbWUpLT5mcmFtZSwgNCkgOlwKKyAgIDApCisKKy8qIERlZmluZSBvdGhlciBhc3BlY3RzIG9mIHRoZSBzdGFjayBmcmFtZS4gICovCisKKy8qIEEgbWFjcm8gdGhhdCB0ZWxscyB1cyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpbnZvY2F0aW9uIHJlcHJlc2VudGVkCisgICBieSBGSSBkb2VzIG5vdCBoYXZlIGEgZnJhbWUgb24gdGhlIHN0YWNrIGFzc29jaWF0ZWQgd2l0aCBpdC4gIElmIGl0CisgICBkb2VzIG5vdCwgRlJBTUVMRVNTIGlzIHNldCB0byAxLCBlbHNlIDAuICAqLworCisjdW5kZWYgIEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OCisjZGVmaW5lIEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OKEZJLCBGUkFNRUxFU1MpIFwKK3sgKEZSQU1FTEVTUykgPSBmcmFtZWxlc3NfbG9va19mb3JfcHJvbG9ndWUgKEZJKTsgfQorCisjdW5kZWYgIEZSQU1FX1NBVkVEX1BDCisjZGVmaW5lIEZSQU1FX1NBVkVEX1BDKEZSQU1FKSAocmVhZF9tZW1vcnlfaW50ZWdlciAoKEZSQU1FKS0+ZnJhbWUgKyA0LCA0KSkKKworLyogSW5zZXJ0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGFyZ3MgYW5kIGZ1bmN0aW9uIGFkZHJlc3MKKyAgIGludG8gYSBjYWxsIHNlcXVlbmNlIG9mIHRoZSBhYm92ZSBmb3JtIHN0b3JlZCBhdCBEVU1NWU5BTUUuICAqLworCisjdW5kZWYgIEZJWF9DQUxMX0RVTU1ZCisjZGVmaW5lIEZJWF9DQUxMX0RVTU1ZKGR1bW15bmFtZSwgcGMsIGZ1biwgbmFyZ3MsIGFyZ3MsIHR5cGUsIGdjY19wKSAgIFwKK3sgXAorCSooaW50ICopKChjaGFyICopKGR1bW15bmFtZSkgKyAxKSA9IChpbnQpKGZ1bikgLSAocGMpIC0gNTsgXAorfQorCisjZW5kaWYgLyogIWRlZmluZWQgKFRNX1NVTjM4Nl9IKSAqLworCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYvdG0tc3ltbWV0cnkuaCBiL2dkYi9jb25maWcvaTM4Ni90bS1zeW1tZXRyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOTMxZDQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYvdG0tc3ltbWV0cnkuaApAQCAtMCwwICsxLDMyMSBAQAorLyogVGFyZ2V0IG1hY2hpbmUgZGVmaW5pdGlvbnMgZm9yIEdEQiBvbiBhIFNlcXVlbnQgU3ltbWV0cnkgdW5kZXIgZHluaXggMy4wLAorICAgd2l0aCBXZWl0ZWsgMTE2NyBhbmQgaTM4NyBzdXBwb3J0LgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgU3ltbWV0cnkgdmVyc2lvbiBieSBKYXkgVm9zYnVyZ2ggKGZ1YmFyQHNlcXVlbnQuY29tKS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIFRNX1NZTU1FVFJZX0gKKyNkZWZpbmUgVE1fU1lNTUVUUllfSCAxCisKKy8qIEkgZG9uJ3Qga25vdyBpZiB0aGlzIHdpbGwgd29yayBmb3IgY3Jvc3MtZGVidWdnaW5nLCBldmVuIGlmIHlvdSBkbyBnZXQKKyAgIGEgY29weSBvZiB0aGUgcmlnaHQgaW5jbHVkZSBmaWxlLiAgKi8KKyNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgorCisjaW5jbHVkZSAiaTM4Ni90bS1pMzg2di5oIgorCisjdW5kZWYgU1RBUlRfSU5GRVJJT1JfVFJBUFNfRVhQRUNURUQKKyNkZWZpbmUgU1RBUlRfSU5GRVJJT1JfVFJBUFNfRVhQRUNURUQgMgorCisvKiBBbW91bnQgUEMgbXVzdCBiZSBkZWNyZW1lbnRlZCBieSBhZnRlciBhIGJyZWFrcG9pbnQuICBUaGlzIGlzIG9mdGVuIHRoZQorICAgbnVtYmVyIG9mIGJ5dGVzIGluIEJSRUFLUE9JTlQgYnV0IG5vdCBhbHdheXMgKHN1Y2ggYXMgbm93KS4gKi8KKworI3VuZGVmIERFQ1JfUENfQUZURVJfQlJFQUsKKyNkZWZpbmUgREVDUl9QQ19BRlRFUl9CUkVBSyAwCisKKyNpZiAwCisvKiAtLS0gdGhpcyBjb2RlIGNhbid0IGJlIHVzZWQgdW5sZXNzIHdlIGtub3cgd2UgYXJlIHJ1bm5pbmcgbmF0aXZlLAorICAgICAgIHNpbmNlIGl0IHVzZXMgaG9zdCBzcGVjaWZpYyBwdHJhY2UgY2FsbHMuICovCisvKiBjb2RlIGZvciA4MDM4NyBmcHUuICBGdW5jdGlvbnMgYXJlIGZyb20gaTM4Ni1kZXAuYywgY29waWVkIGludG8KKyAqIHN5bW0tZGVwLmMuCisgKi8KKyNkZWZpbmUgRkxPQVRfSU5GTyB7IGkzODZfZmxvYXRfaW5mbygpOyB9CisjZW5kaWYKKworLyogTnVtYmVyIG9mIG1hY2hpbmUgcmVnaXN0ZXJzICovCisKKyN1bmRlZiBOVU1fUkVHUworI2RlZmluZSBOVU1fUkVHUyA0OQorCisvKiBJbml0aWFsaXplciBmb3IgYW4gYXJyYXkgb2YgbmFtZXMgb2YgcmVnaXN0ZXJzLgorICAgVGhlcmUgc2hvdWxkIGJlIE5VTV9SRUdTIHN0cmluZ3MgaW4gdGhpcyBpbml0aWFsaXplci4gICovCisKKy8qIEluaXRpYWxpemVyIGZvciBhbiBhcnJheSBvZiBuYW1lcyBvZiByZWdpc3RlcnMuICBUaGVyZSBzaG91bGQgYmUgYXQgbGVhc3QKKyAgIE5VTV9SRUdTIHN0cmluZ3MgaW4gdGhpcyBpbml0aWFsaXplci4gIEFueSBleGNlc3Mgb25lcyBhcmUgc2ltcGx5IGlnbm9yZWQuCisgICBTeW1tZXRyeSByZWdpc3RlcnMgYXJlIGluIHRoaXMgd2VpcmQgb3JkZXIgdG8gbWF0Y2ggdGhlIHJlZ2lzdGVyIG51bWJlcnMKKyAgIGluIHRoZSBzeW1ib2wgdGFibGUgZW50cmllcy4gIElmIHlvdSBjaGFuZ2UgdGhlIG9yZGVyLCB0aGluZ3Mgd2lsbCBwcm9iYWJseQorICAgYnJlYWsgbXlzdGVyaW91c2x5IGZvciBubyBhcHBhcmVudCByZWFzb24uICBBbHNvIG5vdGUgdGhhdCB0aGUgc3QoMCkuLi4KKyAgIHN0KDcpIDM4NyByZWdpc3RlcnMgYXJlIHJlcHJlc2VudGVkIGFzIHN0MC4uLnN0Ny4gICovCisKKyN1bmRlZiAgUkVHSVNURVJfTkFNRVMKKyNkZWZpbmUgUkVHSVNURVJfTkFNRVMgeyAgICAgImVheCIsICAiZWR4IiwgICJlY3giLCAgICJzdDAiLCAgInN0MSIsIFwKKwkJCSAgICAgImVieCIsICAiZXNpIiwgICJlZGkiLCAgICJzdDIiLCAgInN0MyIsIFwKKwkJCSAgICAgInN0NCIsICAic3Q1IiwgICJzdDYiLCAgICJzdDciLCAgImVzcCIsIFwKKwkJCSAgICAgImVicCIsICAiZWlwIiwgICJlZmxhZ3MiLCJmcDEiLCAgImZwMiIsIFwKKwkJCSAgICAgImZwMyIsICAiZnA0IiwgICJmcDUiLCAgICJmcDYiLCAgImZwNyIsIFwKKwkJCSAgICAgImZwOCIsICAiZnA5IiwgICJmcDEwIiwgICJmcDExIiwgImZwMTIiLCBcCisJCQkgICAgICJmcDEzIiwgImZwMTQiLCAiZnAxNSIsICAiZnAxNiIsICJmcDE3IiwgXAorCQkJICAgICAiZnAxOCIsICJmcDE5IiwgImZwMjAiLCAgImZwMjEiLCAiZnAyMiIsIFwKKwkJCSAgICAgImZwMjMiLCAiZnAyNCIsICJmcDI1IiwgICJmcDI2IiwgImZwMjciLCBcCisJCQkgICAgICJmcDI4IiwgImZwMjkiLCAiZnAzMCIsICAiZnAzMSIgfQorCisvKiBSZWdpc3RlciBudW1iZXJzIG9mIHZhcmlvdXMgaW1wb3J0YW50IHJlZ2lzdGVycy4KKyAgIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgInJlYWwiIHJlZ2lzdGVyIG51bWJlcnMsCisgICBhbmQgY29ycmVzcG9uZCB0byB0aGUgZ2VuZXJhbCByZWdpc3RlcnMgb2YgdGhlIG1hY2hpbmUsCisgICBhbmQgc29tZSBhcmUgInBob255IiByZWdpc3RlciBudW1iZXJzIHdoaWNoIGFyZSB0b28gbGFyZ2UKKyAgIHRvIGJlIGFjdHVhbCByZWdpc3RlciBudW1iZXJzIGFzIGZhciBhcyB0aGUgdXNlciBpcyBjb25jZXJuZWQKKyAgIGJ1dCBkbyBzZXJ2ZSB0byBnZXQgdGhlIGRlc2lyZWQgdmFsdWVzIHdoZW4gcGFzc2VkIHRvIHJlYWRfcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIEVBWF9SRUdOVU0JMAorI2RlZmluZSBFRFhfUkVHTlVNCTEKKyNkZWZpbmUgRUNYX1JFR05VTQkyCisjZGVmaW5lIFNUMF9SRUdOVU0JMworI2RlZmluZSBTVDFfUkVHTlVNCTQKKyNkZWZpbmUgRUJYX1JFR05VTQk1CisjZGVmaW5lIEVTSV9SRUdOVU0JNgorI2RlZmluZSBFRElfUkVHTlVNCTcKKyNkZWZpbmUgU1QyX1JFR05VTQk4CisjZGVmaW5lIFNUM19SRUdOVU0JOQorCisjZGVmaW5lIFNUNF9SRUdOVU0JMTAKKyNkZWZpbmUgU1Q1X1JFR05VTQkxMQorI2RlZmluZSBTVDZfUkVHTlVNCTEyCisjZGVmaW5lIFNUN19SRUdOVU0JMTMKKworI2RlZmluZSBGUDFfUkVHTlVNIDE4CQkvKiBmaXJzdCAxMTY3IHJlZ2lzdGVyICovCisvKiBHZXQgJWZwMiAtICVmcDMxIGJ5IGFkZGl0aW9uLCBzaW5jZSB0aGV5IGFyZSBjb250aWd1b3VzICovCisKKyN1bmRlZiAgU1BfUkVHTlVNCisjZGVmaW5lIFNQX1JFR05VTSAxNAkvKiAodXNwKSBDb250YWlucyBhZGRyZXNzIG9mIHRvcCBvZiBzdGFjayAqLworI2RlZmluZSBFU1BfUkVHTlVNIDE0CisjdW5kZWYgIEZQX1JFR05VTQorI2RlZmluZSBGUF9SRUdOVU0gMTUJLyogKGVicCkgQ29udGFpbnMgYWRkcmVzcyBvZiBleGVjdXRpbmcgc3RhY2sgZnJhbWUgKi8KKyNkZWZpbmUgRUJQX1JFR05VTSAxNQorI3VuZGVmICBQQ19SRUdOVU0KKyNkZWZpbmUgUENfUkVHTlVNIDE2CS8qIChlaXApIENvbnRhaW5zIHByb2dyYW0gY291bnRlciAqLworI2RlZmluZSBFSVBfUkVHTlVNIDE2CisjdW5kZWYgIFBTX1JFR05VTQorI2RlZmluZSBQU19SRUdOVU0gMTcJLyogKHBzKSAgQ29udGFpbnMgcHJvY2Vzc29yIHN0YXR1cyAqLworI2RlZmluZSBFRkxBR1NfUkVHTlVNIDE3CisKKy8qCisgKiBGb2xsb3dpbmcgbWFjcm8gdHJhbnNsYXRlcyBpMzg2IG9wY29kZSByZWdpc3RlciBudW1iZXJzIHRvIFN5bW1ldHJ5CisgKiByZWdpc3RlciBudW1iZXJzLiAgVGhpcyBpcyB1c2VkIGJ5IGkzODZfZnJhbWVfZmluZF9zYXZlZF9yZWdzLgorICoKKyAqICAgICAgICAgICAlZWF4ICAlZWN4ICAlZWR4ICAlZWJ4ICAlZXNwICAlZWJwICAlZXNpICAlZWRpCisgKiBpMzg2ICAgICAgICAwICAgICAxICAgICAyICAgICAzICAgICA0ICAgICA1ICAgICA2ICAgICA3CisgKiBTeW1tZXRyeSAgICAwICAgICAyICAgICAxICAgICA1ICAgIDE0ICAgIDE1ICAgICA2ICAgICA3CisgKgorICovCisjZGVmaW5lIEkzODZfUkVHTk9fVE9fU1lNTUVUUlkobikgXAorKChuKT09MD8wIDoobik9PTE/MiA6KG4pPT0yPzEgOihuKT09Mz81IDoobik9PTQ/MTQgOihuKT09NT8xNSA6KG4pKQorCisvKiBUaGUgbWFnaWMgbnVtYmVycyBiZWxvdyBhcmUgb2Zmc2V0cyBpbnRvIHVfYXIwIGluIHRoZSB1c2VyIHN0cnVjdC4KKyAqIFRoZXkgbGl2ZSBpbiA8bWFjaGluZS9yZWcuaD4uICBHZGIgY2FsbHMgdGhpcyBtYWNybyB3aXRoIGJsb2NrZW5kCisgKiBob2xkaW5nIHUudV9hcjAgLSBLRVJORUxfVV9BRERSLiAgT25seSB0aGUgcmVnaXN0ZXJzIGxpc3RlZCBhcmUKKyAqIHNhdmVkIGluIHRoZSB1IGFyZWEgKGFsb25nIHdpdGggYSBmZXcgb3RoZXJzIHRoYXQgYXJlbid0IHVzZWZ1bAorICogaGVyZS4gIFNlZSA8bWFjaGluZS9yZWcuaD4pLgorICovCisKKyNkZWZpbmUgUkVHSVNURVJfVV9BRERSKGFkZHIsIGJsb2NrZW5kLCByZWdubykgXAoreyBzdHJ1Y3QgdXNlciBmb287CS8qIG5lZWRlZCBmb3IgZmluZGluZyBmcHUgcmVncyAqLyBcCitzd2l0Y2ggKHJlZ25vKSB7IFwKKyAgICBjYXNlIDA6IFwKKyAgICAgIGFkZHIgPSBibG9ja2VuZCArIEVBWCAqIHNpemVvZihpbnQpOyBicmVhazsgXAorICBjYXNlIDE6IFwKKyAgICAgIGFkZHIgPSBibG9ja2VuZCArIEVEWCAqIHNpemVvZihpbnQpOyBicmVhazsgXAorICBjYXNlIDI6IFwKKyAgICAgIGFkZHIgPSBibG9ja2VuZCArIEVDWCAqIHNpemVvZihpbnQpOyBicmVhazsgXAorICBjYXNlIDM6CQkJLyogc3QoMCkgKi8gXAorICAgICAgYWRkciA9ICgoaW50KSZmb28udV9mcHVzYXZlLmZwdV9zdGFja1swXVswXSAtIChpbnQpJmZvbyk7IFwKKyAgICAgIGJyZWFrOyBcCisgIGNhc2UgNDoJCQkvKiBzdCgxKSAqLyBcCisgICAgICBhZGRyID0gKChpbnQpICZmb28udV9mcHVzYXZlLmZwdV9zdGFja1sxXVswXSAtIChpbnQpJmZvbyk7IFwKKyAgICAgIGJyZWFrOyBcCisgIGNhc2UgNTogXAorICAgICAgYWRkciA9IGJsb2NrZW5kICsgRUJYICogc2l6ZW9mKGludCk7IGJyZWFrOyBcCisgIGNhc2UgNjogXAorICAgICAgYWRkciA9IGJsb2NrZW5kICsgRVNJICogc2l6ZW9mKGludCk7IGJyZWFrOyBcCisgIGNhc2UgNzogXAorICAgICAgYWRkciA9IGJsb2NrZW5kICsgRURJICogc2l6ZW9mKGludCk7IGJyZWFrOyBcCisgIGNhc2UgODoJCQkvKiBzdCgyKSAqLyBcCisgICAgICBhZGRyID0gKChpbnQpICZmb28udV9mcHVzYXZlLmZwdV9zdGFja1syXVswXSAtIChpbnQpJmZvbyk7IFwKKyAgICAgIGJyZWFrOyBcCisgIGNhc2UgOToJCQkvKiBzdCgzKSAqLyBcCisgICAgICBhZGRyID0gKChpbnQpICZmb28udV9mcHVzYXZlLmZwdV9zdGFja1szXVswXSAtIChpbnQpJmZvbyk7IFwKKyAgICAgIGJyZWFrOyBcCisgIGNhc2UgMTA6CQkJLyogc3QoNCkgKi8gXAorICAgICAgYWRkciA9ICgoaW50KSAmZm9vLnVfZnB1c2F2ZS5mcHVfc3RhY2tbNF1bMF0gLSAoaW50KSZmb28pOyBcCisgICAgICBicmVhazsgXAorICBjYXNlIDExOgkJCS8qIHN0KDUpICovIFwKKyAgICAgIGFkZHIgPSAoKGludCkgJmZvby51X2ZwdXNhdmUuZnB1X3N0YWNrWzVdWzBdIC0gKGludCkmZm9vKTsgXAorICAgICAgYnJlYWs7IFwKKyAgY2FzZSAxMjoJCQkvKiBzdCg2KSAqLyBcCisgICAgICBhZGRyID0gKChpbnQpICZmb28udV9mcHVzYXZlLmZwdV9zdGFja1s2XVswXSAtIChpbnQpJmZvbyk7IFwKKyAgICAgIGJyZWFrOyBcCisgIGNhc2UgMTM6CQkJLyogc3QoNykgKi8gXAorICAgICAgYWRkciA9ICgoaW50KSAmZm9vLnVfZnB1c2F2ZS5mcHVfc3RhY2tbN11bMF0gLSAoaW50KSZmb28pOyBcCisgICAgICBicmVhazsgXAorICBjYXNlIDE0OiBcCisgICAgICBhZGRyID0gYmxvY2tlbmQgKyBFU1AgKiBzaXplb2YoaW50KTsgYnJlYWs7IFwKKyAgY2FzZSAxNTogXAorICAgICAgYWRkciA9IGJsb2NrZW5kICsgRUJQICogc2l6ZW9mKGludCk7IGJyZWFrOyBcCisgIGNhc2UgMTY6IFwKKyAgICAgIGFkZHIgPSBibG9ja2VuZCArIEVJUCAqIHNpemVvZihpbnQpOyBicmVhazsgXAorICBjYXNlIDE3OiBcCisgICAgICBhZGRyID0gYmxvY2tlbmQgKyBGTEFHUyAqIHNpemVvZihpbnQpOyBicmVhazsgXAorICBjYXNlIDE4OgkJCS8qIGZwMSAqLyBcCisgIGNhc2UgMTk6CQkJLyogZnAyICovIFwKKyAgY2FzZSAyMDoJCQkvKiBmcDMgKi8gXAorICBjYXNlIDIxOgkJCS8qIGZwNCAqLyBcCisgIGNhc2UgMjI6CQkJLyogZnA1ICovIFwKKyAgY2FzZSAyMzoJCQkvKiBmcDYgKi8gXAorICBjYXNlIDI0OgkJCS8qIGZwNyAqLyBcCisgIGNhc2UgMjU6CQkJLyogZnA4ICovIFwKKyAgY2FzZSAyNjoJCQkvKiBmcDkgKi8gXAorICBjYXNlIDI3OgkJCS8qIGZwMTAgKi8gXAorICBjYXNlIDI4OgkJCS8qIGZwMTEgKi8gXAorICBjYXNlIDI5OgkJCS8qIGZwMTIgKi8gXAorICBjYXNlIDMwOgkJCS8qIGZwMTMgKi8gXAorICBjYXNlIDMxOgkJCS8qIGZwMTQgKi8gXAorICBjYXNlIDMyOgkJCS8qIGZwMTUgKi8gXAorICBjYXNlIDMzOgkJCS8qIGZwMTYgKi8gXAorICBjYXNlIDM0OgkJCS8qIGZwMTcgKi8gXAorICBjYXNlIDM1OgkJCS8qIGZwMTggKi8gXAorICBjYXNlIDM2OgkJCS8qIGZwMTkgKi8gXAorICBjYXNlIDM3OgkJCS8qIGZwMjAgKi8gXAorICBjYXNlIDM4OgkJCS8qIGZwMjEgKi8gXAorICBjYXNlIDM5OgkJCS8qIGZwMjIgKi8gXAorICBjYXNlIDQwOgkJCS8qIGZwMjMgKi8gXAorICBjYXNlIDQxOgkJCS8qIGZwMjQgKi8gXAorICBjYXNlIDQyOgkJCS8qIGZwMjUgKi8gXAorICBjYXNlIDQzOgkJCS8qIGZwMjYgKi8gXAorICBjYXNlIDQ0OgkJCS8qIGZwMjcgKi8gXAorICBjYXNlIDQ1OgkJCS8qIGZwMjggKi8gXAorICBjYXNlIDQ2OgkJCS8qIGZwMjkgKi8gXAorICBjYXNlIDQ3OgkJCS8qIGZwMzAgKi8gXAorICBjYXNlIDQ4OgkJCS8qIGZwMzEgKi8gXAorICAgICBhZGRyID0gKChpbnQpICZmb28udV9mcGFzYXZlLmZwYV9yZWdzWyhyZWdubyktMThdIC0gKGludCkmZm9vKTsgXAorICB9IFwKK30KKworLyogVG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCB0byBzdG9yZSBvdXIgY29waWVzIG9mIHRoZSBtYWNoaW5lJ3MKKyAgIHJlZ2lzdGVyIHN0YXRlLCB0aGUgYXJyYXkgYHJlZ2lzdGVycycuICAxMCBpKjg2IHJlZ2lzdGVycywgOCBpMzg3CisgICByZWdpc3RlcnMsIGFuZCAzMSBXZWl0ZWsgMTE2NyByZWdpc3RlcnMgKi8KKworI3VuZGVmICBSRUdJU1RFUl9CWVRFUworI2RlZmluZSBSRUdJU1RFUl9CWVRFUyAoKDEwICogNCkgKyAoOCAqIDEwKSArICgzMSAqIDQpKQorCisvKiBJbmRleCB3aXRoaW4gYHJlZ2lzdGVycycgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNwYWNlIGZvcgorICAgcmVnaXN0ZXIgTi4gICovCisKKyN1bmRlZiAgUkVHSVNURVJfQllURQorI2RlZmluZSBSRUdJU1RFUl9CWVRFKE4pIAkJXAorKCgoTikgPCAzKSA/ICgoTikgKiA0KSA6CQlcCisoKE4pIDwgNSkgPyAoKCgoTikgLSAyKSAqIDEwKSArIDIpIDoJXAorKChOKSA8IDgpID8gKCgoKE4pIC0gNSkgKiA0KSArIDMyKSA6CVwKKygoTikgPCAxNCkgPyAoKCgoTikgLSA4KSAqIDEwKSArIDQ0KSA6CVwKKyAgICAoKCgoTikgLSAxNCkgKiA0KSArIDEwNCkpCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBhY3R1YWwgbWFjaGluZSByZXByZXNlbnRhdGlvbgorICogZm9yIHJlZ2lzdGVyIE4uICBBbGwgcmVnaXN0ZXJzIGFyZSA0IGJ5dGVzLCBleGNlcHQgMzg3IHN0KDApIC0gc3QoNyksCisgKiB3aGljaCBhcmUgODAgYml0cyBlYWNoLiAKKyAqLworCisjdW5kZWYgIFJFR0lTVEVSX1JBV19TSVpFCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pIFwKKygoKE4pIDwgMykgPyA0IDoJXAorKChOKSA8IDUpID8gMTAgOglcCisoKE4pIDwgOCkgPyA0IDoJCVwKKygoTikgPCAxNCkgPyAxMCA6CVwKKyAgICA0KQorCisvKiBOb256ZXJvIGlmIHJlZ2lzdGVyIE4gcmVxdWlyZXMgY29udmVyc2lvbgorICAgZnJvbSByYXcgZm9ybWF0IHRvIHZpcnR1YWwgZm9ybWF0LiAgKi8KKworI3VuZGVmICBSRUdJU1RFUl9DT05WRVJUSUJMRQorI2RlZmluZSBSRUdJU1RFUl9DT05WRVJUSUJMRShOKSBcCisoKChOKSA8IDMpID8gMCA6IFwKKygoTikgPCA1KSA/IDEgIDogXAorKChOKSA8IDgpID8gMCAgOiBcCisoKE4pIDwgMTQpID8gMSA6IFwKKyAgICAwKQorCisjaW5jbHVkZSAiZmxvYXRmb3JtYXQuaCIKKworLyogQ29udmVydCBkYXRhIGZyb20gcmF3IGZvcm1hdCBmb3IgcmVnaXN0ZXIgUkVHTlVNIGluIGJ1ZmZlciBGUk9NCisgICB0byB2aXJ0dWFsIGZvcm1hdCB3aXRoIHR5cGUgVFlQRSBpbiBidWZmZXIgVE8uICAqLworCisjdW5kZWYgUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMCisjZGVmaW5lIFJFR0lTVEVSX0NPTlZFUlRfVE9fVklSVFVBTChSRUdOVU0sVFlQRSxGUk9NLFRPKSBcCit7IFwKKyAgZG91YmxlIHZhbDsgXAorICBmbG9hdGZvcm1hdF90b19kb3VibGUgKCZmbG9hdGZvcm1hdF9pMzg3X2V4dCwgKEZST00pLCAmdmFsKTsgXAorICBzdG9yZV9mbG9hdGluZyAoKFRPKSwgVFlQRV9MRU5HVEggKFRZUEUpLCB2YWwpOyBcCit9CisKKy8qIENvbnZlcnQgZGF0YSBmcm9tIHZpcnR1YWwgZm9ybWF0IHdpdGggdHlwZSBUWVBFIGluIGJ1ZmZlciBGUk9NCisgICB0byByYXcgZm9ybWF0IGZvciByZWdpc3RlciBSRUdOVU0gaW4gYnVmZmVyIFRPLiAgKi8KKworI3VuZGVmIFJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXCisjZGVmaW5lIFJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXKFRZUEUsUkVHTlVNLEZST00sVE8pIFwKK3sgXAorICBkb3VibGUgdmFsID0gZXh0cmFjdF9mbG9hdGluZyAoKEZST00pLCBUWVBFX0xFTkdUSCAoVFlQRSkpOyBcCisgIGZsb2F0Zm9ybWF0X2Zyb21fZG91YmxlICgmZmxvYXRmb3JtYXRfaTM4N19leHQsICZ2YWwsIChUTykpOyBcCit9CisKKy8qIFJldHVybiB0aGUgR0RCIHR5cGUgb2JqZWN0IGZvciB0aGUgInN0YW5kYXJkIiBkYXRhIHR5cGUKKyAgIG9mIGRhdGEgaW4gcmVnaXN0ZXIgTi4gICovCisKKyN1bmRlZiBSRUdJU1RFUl9WSVJUVUFMX1RZUEUKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9UWVBFKE4pIFwKKygoTiA8IDMpID8gYnVpbHRpbl90eXBlX2ludCA6IFwKKyhOIDwgNSkgPyBidWlsdGluX3R5cGVfZG91YmxlIDogXAorKE4gPCA4KSA/IGJ1aWx0aW5fdHlwZV9pbnQgOiBcCisoTiA8IDE0KSA/IGJ1aWx0aW5fdHlwZV9kb3VibGUgOiBcCisgICAgYnVpbHRpbl90eXBlX2ludCkKKworLyogU3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIHBsYWNlIGluIHdoaWNoIHRvIGNvcHkgdGhlIHN0cnVjdHVyZSB0aGUKKyAgIHN1YnJvdXRpbmUgd2lsbCByZXR1cm4uICBUaGlzIGlzIGNhbGxlZCBmcm9tIGNhbGxfZnVuY3Rpb24uCisgICBOYXRpdmUgY2MgcGFzc2VzIHRoZSBhZGRyZXNzIGluIGVheCwgZ2NjICh1cCB0byB2ZXJzaW9uIDIuNS44KQorICAgcGFzc2VzIGl0IG9uIHRoZSBzdGFjay4gIGdjYyBzaG91bGQgYmUgZml4ZWQgaW4gZnV0dXJlIHZlcnNpb25zIHRvCisgICBhZG9wdCBuYXRpdmUgY2MgY29udmVudGlvbnMuICAqLworCisjdW5kZWYgIFNUT1JFX1NUUlVDVF9SRVRVUk4KKyNkZWZpbmUgU1RPUkVfU1RSVUNUX1JFVFVSTihBRERSLCBTUCkgd3JpdGVfcmVnaXN0ZXIoMCwgKEFERFIpKQorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwgZm9ybWF0LAorICAgaW50byBWQUxCVUYuICAqLworCisjdW5kZWYgIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFCisjZGVmaW5lIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKFRZUEUsUkVHQlVGLFZBTEJVRikgXAorICBzeW1tZXRyeV9leHRyYWN0X3JldHVybl92YWx1ZShUWVBFLCBSRUdCVUYsIFZBTEJVRikKKworLyogVGhlIGZvbGxvd2luZyByZWRlZmluZXMgbWFrZSBiYWNrdHJhY2luZyB0aHJvdWdoIHNpZ3RyYW1wIHdvcmsuCisgICBUaGV5IG1hbnVmYWN0dXJlIGEgZmFrZSBzaWd0cmFtcCBmcmFtZSBhbmQgb2J0YWluIHRoZSBzYXZlZCBwYyBpbiBzaWd0cmFtcAorICAgZnJvbSB0aGUgc2lnY29udGV4dCBzdHJ1Y3R1cmUgd2hpY2ggaXMgcHVzaGVkIGJ5IHRoZSBrZXJuZWwgb24gdGhlCisgICB1c2VyIHN0YWNrLCBhbG9uZyB3aXRoIGEgcG9pbnRlciB0byBpdC4gICovCisKKyNkZWZpbmUgSU5fU0lHVFJBTVAocGMsIG5hbWUpICgobmFtZSkgJiYgU1RSRVEgKCJfc2lnY29kZSIsIG5hbWUpKQorCisvKiBPZmZzZXQgdG8gc2F2ZWQgUEMgaW4gc2lnY29udGV4dCwgZnJvbSA8c2lnbmFsLmg+LiAgKi8KKyNkZWZpbmUgU0lHQ09OVEVYVF9QQ19PRkZTRVQgMTYKKworI2VuZGlmCS8qIGlmbmRlZiBUTV9TWU1NRVRSWV9IICovCisKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni94bS1jeWd3aW4uaCBiL2dkYi9jb25maWcvaTM4Ni94bS1jeWd3aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGI4MjI3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3htLWN5Z3dpbi5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIERlZmluaXRpb25zIGZvciBob3N0aW5nIG9uIFdJTjMyLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgorCisjaW5jbHVkZSAiZm9wZW4tYmluLmgiCisKKyNkZWZpbmUgR0RCSU5JVF9GSUxFTkFNRSAiZ2RiLmluaSIKKworI2RlZmluZSBTTEFTSF9QKFgpICgoWCk9PSdcXCcgfHwgKFgpID09ICcvJykKKyNkZWZpbmUgUk9PVEVEX1AoWCkgKChTTEFTSF9QKChYKVswXSkpfHwgKChYKVsxXSA9PSc6JykpCisjZGVmaW5lIFNMQVNIX0NIQVIgJy8nCisjZGVmaW5lIFNMQVNIX1NUUklORyAiLyIKKworLyogRGVmaW5lIHRoaXMgaWYgc291cmNlIGZpbGVzIHVzZSBcclxuIHJhdGhlciB0aGFuIGp1c3QgXG4uICAqLworI2RlZmluZSBDUkxGX1NPVVJDRV9GSUxFUworCisjZGVmaW5lIEhBVkVfU0lHU0VUTUFTSyAwCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYveG0tZ28zMi5oIGIvZ2RiL2NvbmZpZy9pMzg2L3htLWdvMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzk3ODMzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3htLWdvMzIuaApAQCAtMCwwICsxLDMxIEBACisvKiBEZWZpbml0aW9ucyBmb3IgaG9zdGluZyBvbiBHTzMyLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgorI2luY2x1ZGUgImZvcGVuLWJpbi5oIgorCisvKiBEZWZpbmUgdGhpcyBsc2VlayhuKSAhPSBudGggYnl0ZSBvZiBmaWxlICovCisjZGVmaW5lIExTRUVLX05PVF9MSU5FQVIKKworI2RlZmluZSBDQU5UX0ZPUksKKworI3VuZGVmIFFVSVQKKyNkZWZpbmUgUVVJVCAgeyBwb2xscXVpdCgpOyB9CisKKyNkZWZpbmUgR0RCSU5JVF9GSUxFTkFNRSAiZ2RiLmluaSIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni94bS1pMzg2YWl4LmggYi9nZGIvY29uZmlnL2kzODYveG0taTM4NmFpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MmExNDkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYveG0taTM4NmFpeC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIE1hY3JvIGRlZmludGlvbnMgZm9yIEFJWCBQUy8yIChpMzg2KQorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKyAqIENoYW5nZWQgZm9yIElCTSBBSVggcHMvMiBieSBNaW5oIFRyYW4gTGUgKHRyYW5sZUBpbnRlbGxpY29ycC5jb20pCisgKiBSZXZpc2lvbjoJMjMtT2N0LTkyIDE3OjQyOjQ5CisgKi8KKworI2luY2x1ZGUgImkzODYveG0taTM4NnYuaCIKKworI3VuZGVmIEhBVkVfVEVSTUlPCisjZGVmaW5lIEhBVkVfU0dUVFkKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisvKiBVc2Ugc2V0cGdpZCBpbnN0ZWFkIG9mIHNldHBncnAgb24gQUlYICovCisjZGVmaW5lIE5FRURfUE9TSVhfU0VUUEdJRApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3htLWkzODZic2QuaCBiL2dkYi9jb25maWcvaTM4Ni94bS1pMzg2YnNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjNGM4OQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni94bS1pMzg2YnNkLmgKQEAgLTAsMCArMSwyMiBAQAorLyogSG9zdC1kZXBlbmRlbnQgZGVmaW5pdGlvbnMgZm9yIEludGVsIDM4NiBydW5uaW5nIEJTRCBVbml4LCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgorCisjaW5jbHVkZSA8bWFjaGluZS9saW1pdHMuaD4JCS8qIGZvciBJTlRfTUlOICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYveG0taTM4NmdudS5oIGIvZ2RiL2NvbmZpZy9pMzg2L3htLWkzODZnbnUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDMwN2IyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3htLWkzODZnbnUuaApAQCAtMCwwICsxLDIzIEBACisvKiBEZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gdGhlIEdOVSBIdXJkIG9uIGFuIEludGVsIDM4NgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgSE9TVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKworLyogRG8gaW1wbGVtZW50IHRoZSBhdHRhY2ggYW5kIGRldGFjaCBjb21tYW5kcy4gICovCisjZGVmaW5lIEFUVEFDSF9ERVRBQ0gJMQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3htLWkzODZseW54LmggYi9nZGIvY29uZmlnL2kzODYveG0taTM4Nmx5bnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDc4Y2I2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3htLWkzODZseW54LmgKQEAgLTAsMCArMSwyNCBAQAorLyogSG9zdC1kZXBlbmRlbnQgZGVmaW5pdGlvbnMgZm9yIEludGVsIDM4NiBydW5uaW5nIEx5bnhPUy4KKyAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgSE9TVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKworLyogR2V0IGdlbmVyaWMgTHlueE9TIGhvc3QgZGVmaW5pdGlvbnMuICovCisKKyNpbmNsdWRlICJ4bS1seW54LmgiCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYveG0taTM4Nm0zLmggYi9nZGIvY29uZmlnL2kzODYveG0taTM4Nm0zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2NzQwOQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni94bS1pMzg2bTMuaApAQCAtMCwwICsxLDMzIEBACisvKiBEZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gTWFjaCAzIG9uIGFuIEludGVsIDM4NgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgSE9TVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKworLyogRG8gaW1wbGVtZW50IHRoZSBhdHRhY2ggYW5kIGRldGFjaCBjb21tYW5kcy4gICovCisjZGVmaW5lIEFUVEFDSF9ERVRBQ0gJMQorCisvKiBOb3QgbmVlZGVlZCAqLworI2RlZmluZSBLRVJORUxfVV9BRERSIDAKKworI2lmbmRlZiBFTVVMQVRPUl9CQVNFCisvKiBGb3IgRU1VTEFUT1JfQkFTRSBhbmQgRU1VTEFUT1JfRU5ELgorICogT1NGIDEvTUsgaGFzIGRpZmZlcmVudCB2YWx1ZXMgaW4gc29tZSBvdGhlciBwbGFjZS4KKyAqLworI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgorI2VuZGlmIC8qIEVNVUxBVE9SX0JBU0UgKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni94bS1pMzg2bWFjaC5oIGIvZ2RiL2NvbmZpZy9pMzg2L3htLWkzODZtYWNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0N2JmYgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni94bS1pMzg2bWFjaC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIERlZmluaXRpb25zIHRvIG1ha2UgR0RCIHJ1biBvbiBNYWNoIG9uIGFuIEludGVsIDM4NgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5LCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgSE9TVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKworLyogVGhpcyBpcyB0aGUgYW1vdW50IHRvIHN1YnRyYWN0IGZyb20gdS51X2FyMAorICAgdG8gZ2V0IHRoZSBvZmZzZXQgaW4gdGhlIGNvcmUgZmlsZSBvZiB0aGUgcmVnaXN0ZXIgdmFsdWVzLiAgKi8KKworI2RlZmluZSBLRVJORUxfVV9BRERSICgweDgwMDAwMDAwIC0gKFVQQUdFUyAqIE5CUEcpKQorCisvKiA8ZXJybm8uaD4gb25seSBkZWZpbmVzIHRoaXMgaWYgX19TVERDX18hISEgKi8KK2V4dGVybiBpbnQgZXJybm87CisKK2V4dGVybiBjaGFyICpzdHJkdXAoKTsKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni94bS1pMzg2bWsuaCBiL2dkYi9jb25maWcvaTM4Ni94bS1pMzg2bWsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjFjOWNiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3htLWkzODZtay5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIERlZmluaXRpb25zIHRvIG1ha2UgR0RCIHJ1biBvbiBNYWNoIDMgT1NGIDEvTUsgb24gYW4gSW50ZWwgMzg2CisgICBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBIQVZFX1RFUk1JTwkxCisKKyNkZWZpbmUgRU1VTEFUT1JfQkFTRQkweGEwMDAwMDAwCisjZGVmaW5lIEVNVUxBVE9SX0VORAkweGEwMDQwMDAwCisKKyNpbmNsdWRlICJpMzg2L3htLWkzODZtMy5oIgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3htLWkzODZzY28uaCBiL2dkYi9jb25maWcvaTM4Ni94bS1pMzg2c2NvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFmYTdlNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni94bS1pMzg2c2NvLmgKQEAgLTAsMCArMSw0MiBAQAorLyogTWFjcm8gZGVmaW50aW9ucyBmb3IgaTM4NiwgcnVubmluZyBTQ08gVW5peCBTeXN0ZW0gVi8zODYgMy4yLgorICAgQ29weXJpZ2h0IChDKSAxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEluIDMuMnY0IDxzeXMvdXNlci5oPiByZXF1aXJlcyBvbiA8c3lzL2Rpci5oPi4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2Rpci5oPgorCisjaW5jbHVkZSAiaTM4Ni94bS1pMzg2di5oIgorCisvKiBBcHBhcmVudGx5IHRoZXJlIGlzIGluY29uc2lzdGVuY3kgYW1vbmcgdmFyaW91cyBTeXN0ZW0gVidzIGFib3V0IHdoYXQKKyAgIHRoZSBuYW1lIG9mIHRoaXMgZmllbGQgaXMuICAqLworI2RlZmluZSBVX0ZQU1RBVEUodSkgdS51X2Zwcy51X2Zwc3RhdGUKKworLyogU0NPIDMuMnYyIGFuZCBsYXRlciBoYXZlIGpvYiBjb250cm9sLiAgKi8KKy8qIFNDTyAzLjJ2NCBJIGtub3cgaGFzIHRlcm1pb3M7IEknbSBub3Qgc3VyZSBhYm91dCBlYXJsaWVyIHZlcnNpb25zLgorICAgR0RCIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IHRoZSB0ZXJtaW8vam9iIGNvbnRyb2wgY29tYmluYXRpb24uICAqLworI3VuZGVmIEhBVkVfVEVSTUlPCisjZGVmaW5lIEhBVkVfVEVSTUlPUworCisvKiBTQ08ncyBhc3NlbWJsZXIgZG9lc24ndCBncm9rIGRvbGxhciBzaWducyBpbiBpZGVudGlmaWVycy4KKyAgIFNvIHdlIHVzZSBkb3RzIGluc3RlYWQuICBUaGlzIGl0ZW0gbXVzdCBiZSBjb29yZGluYXRlZCB3aXRoIEcrKy4gKi8KKyN1bmRlZiBDUExVU19NQVJLRVIKKyNkZWZpbmUgQ1BMVVNfTUFSS0VSICcuJworCisvKiBVc2Ugc2V0cGdpZCBpbnN0ZWFkIG9mIHNldHBncnAgb24gU0NPICovCisjZGVmaW5lIE5FRURfUE9TSVhfU0VUUEdJRApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3htLWkzODZ2LmggYi9nZGIvY29uZmlnL2kzODYveG0taTM4NnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODBkZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3htLWkzODZ2LmgKQEAgLTAsMCArMSw0NSBAQAorLyogSG9zdCBzdXBwb3J0IGZvciBpMzg2LgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDaGFuZ2VzIGZvciA4MDM4NiBieSBQYWNlIFdpbGxpc3NvbiAocGFjZUBwcmVwLmFpLm1pdC5lZHUpLCBKdWx5IDE5ODguCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgorCisvKiBJJ20gcnVubmluZyBnZGIgMy40IHVuZGVyIDM4Ni9peCAyLjAuMiwgd2hpY2ggaXMgYSBkZXJpdmF0aXZlIG9mIEFUJlQncworU3lzIFYvMzg2IDMuMi4KKworT24gc29tZSBtYWNoaW5lcywgZ2RiIGNyYXNoZXMgd2hlbiBpdCdzIHN0YXJ0aW5nIHVwIHdoaWxlIGNhbGxpbmcgdGhlCit2ZW5kb3IncyB0ZXJtaW8gdGdldGVudCgpIHJvdXRpbmUuICBJdCBhbHdheXMgd29ya3Mgd2hlbiBydW4gdW5kZXIKK2l0c2VsZiAoYWN0dWFsbHksIHVuZGVyIDMuMiwgaXQncyBub3QgYW4gaW5maW5pdGVseSByZWN1cnNpdmUgYnVnLikKK0FmdGVyIHNvbWUgcG9raW5nIGFyb3VuZCwgaXQgYXBwZWFycyB0aGF0IGRlcGVuZGluZyBvbiB0aGUgZW52aXJvbm1lbnQKK3NpemUsIG9yIHdoZXRoZXIgeW91J3JlIHJ1bm5pbmcgWVAsIG9yIHRoZSBwaGFzZSBvZiB0aGUgbW9vbiBvciBzb21ldGhpbmcsCit0aGUgc3RhY2sgaXMgbm90IGFsd2F5cyBsb25nLWFsaWduZWQgd2hlbiBtYWluKCkgaXMgY2FsbGVkLCBhbmQgdGdldGVudCgpCit0YWtlcyBzdHJvbmcgb2ZmZW5zZSBhdCB0aGF0LiAgT24gc29tZSBtYWNoaW5lcyB0aGlzIGJ1ZyBuZXZlciBhcHBlYXJzLCBidXQKK29uIHRob3NlIHdoZXJlIGl0IGRvZXMsIGl0IG9jY3VycyBxdWl0ZSByZWxpYWJseS4gICovCisjZGVmaW5lIEFMSUdOX1NUQUNLX09OX1NUQVJUVVAKKworLyogZGVmaW5lIFVTRyBpZiB5b3UgYXJlIHVzaW5nIHN5czUgL3Vzci9pbmNsdWRlJ3MgKi8KKyNkZWZpbmUgVVNHCisKKyNkZWZpbmUgSEFWRV9URVJNSU8KKworLyogVGhpcyBpcyB0aGUgYW1vdW50IHRvIHN1YnRyYWN0IGZyb20gdS51X2FyMAorICAgdG8gZ2V0IHRoZSBvZmZzZXQgaW4gdGhlIGNvcmUgZmlsZSBvZiB0aGUgcmVnaXN0ZXIgdmFsdWVzLiAgKi8KKworI2RlZmluZSBLRVJORUxfVV9BRERSIDB4ZTAwMDAwMDAKKwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3htLWkzODZ2MzIuaCBiL2dkYi9jb25maWcvaTM4Ni94bS1pMzg2djMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFhYWM4MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni94bS1pMzg2djMyLmgKQEAgLTAsMCArMSwyNCBAQAorLyogTWFjcm8gZGVmaW50aW9ucyBmb3IgaTM4NiwgcnVubmluZyBTeXN0ZW0gViAzLjIuCisgICBDb3B5cmlnaHQgKEMpIDE5ODkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImkzODYveG0taTM4NnYuaCIKKworLyogQXBwYXJlbnRseSB0aGVyZSBpcyBpbmNvbnNpc3RlbmN5IGFtb25nIHZhcmlvdXMgU3lzdGVtIFYncyBhYm91dCB3aGF0CisgICB0aGUgbmFtZSBvZiB0aGlzIGZpZWxkIGlzLiAgKi8KKyNkZWZpbmUgVV9GUFNUQVRFKHUpIHUudV9mcHMudV9mcHN0YXRlCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYveG0taTM4NnY0LmggYi9nZGIvY29uZmlnL2kzODYveG0taTM4NnY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3ODJkYgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni94bS1pMzg2djQuaApAQCAtMCwwICsxLDI3IEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgR0RCIG9uIGFuIEludGVsIGkzODYgcnVubmluZyBTVlI0LgorICAgQ29weXJpZ2h0IDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBhdCBDeWdudXMgU3VwcG9ydCAoZm5mQGN5Z251cy5jb20pLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFBpY2sgdXAgbW9zdCBvZiB3aGF0IHdlIG5lZWQgZnJvbSB0aGUgZ2VuZXJpYyBpMzg2IGhvc3QgaW5jbHVkZSBmaWxlLiAqLworCisjaW5jbHVkZSAiaTM4Ni94bS1pMzg2di5oIgorCisvKiBQaWNrIHVwIG1vcmUgc3R1ZmYgZnJvbSB0aGUgZ2VuZXJpYyBTVlI0IGhvc3QgaW5jbHVkZSBmaWxlLiAqLworCisjaW5jbHVkZSAieG0tc3lzdjQuaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni94bS1saW51eC5oIGIvZ2RiL2NvbmZpZy9pMzg2L3htLWxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3YzZkNAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni94bS1saW51eC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIE5hdGl2ZSBzdXBwb3J0IGZvciBHTlUvTGludXgsIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBYTV9MSU5VWF9ICisjZGVmaW5lIFhNX0xJTlVYX0gKKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgorCisjZGVmaW5lIEhBVkVfVEVSTUlPUworCisvKiBUaGlzIGlzIHRoZSBhbW91bnQgdG8gc3VidHJhY3QgZnJvbSB1LnVfYXIwCisgICB0byBnZXQgdGhlIG9mZnNldCBpbiB0aGUgY29yZSBmaWxlIG9mIHRoZSByZWdpc3RlciB2YWx1ZXMuICAqLworI2RlZmluZSBLRVJORUxfVV9BRERSIDB4MAorCisjZGVmaW5lIE5FRURfUE9TSVhfU0VUUEdJRAorCisvKiBOZWVkIFJfT0sgZXRjLCBidXQgVVNHIGlzbid0IGRlZmluZWQuICAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZW5kaWYJLyogI2lmbmRlZiBYTV9MSU5VWF9IICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYveG0tbmJzZC5oIGIvZ2RiL2NvbmZpZy9pMzg2L3htLW5ic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTYyNGFjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3htLW5ic2QuaApAQCAtMCwwICsxLDIxIEBACisvKiBQYXJhbWV0ZXJzIGZvciBleGVjdXRpb24gb24gYSBpMzg2IHJ1bm5pbmcgTmV0QlNELCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogR2V0IGdlbmVyaWMgTmV0QlNEIGhvc3QgZGVmaW5pdGlvbnMuICovCisjaW5jbHVkZSAieG0tbmJzZC5oIgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3htLXB0eC5oIGIvZ2RiL2NvbmZpZy9pMzg2L3htLXB0eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YjQ2Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYveG0tcHR4LmgKQEAgLTAsMCArMSw0MSBAQAorLyogRGVmaW5pdGlvbnMgdG8gbWFrZSBHREIgcnVuIG9uIGEgU2VxdWVudCBTeW1tZXRyeSB1bmRlciBwdHgsIHdpdGgKKyAgIFdlaXRlayAxMTY3IGFuZCBpMzg3IHN1cHBvcnQuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MiwgMTk5MywgMTk5NgorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogU3ltbWV0cnkgdmVyc2lvbiBieSBKYXkgVm9zYnVyZ2ggKGZ1YmFyQHNlcXVlbnQuY29tKSAqLworCisjaWZkZWYgX1NFUVVFTlRfUFRYNF8KKyNpbmNsdWRlICJ4bS1zeXN2NC5oIgorI2VuZGlmIC8qIF9TRVFVRU5UX1BUWDRfICovCisKKy8qIFRoaXMgbWFjaGluZSBkb2Vzbid0IGhhdmUgdGhlIHNpZ2ludGVycnVwdCBjYWxsLiAgKi8KKyNkZWZpbmUgTk9fU0lHSU5URVJSVVBUCisKKyNkZWZpbmUgSEFWRV9XQUlUX1NUUlVDVAorCisjdW5kZWYgSEFWRV9URVJNSU8KKyNkZWZpbmUgSEFWRV9URVJNSU9TCisjZGVmaW5lIFVTRworCisjZGVmaW5lIE5FRURfUE9TSVhfU0VUUEdJRAorCisjZGVmaW5lIFVTRV9PX05PQ1RUWQorCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYveG0tcHR4NC5oIGIvZ2RiL2NvbmZpZy9pMzg2L3htLXB0eDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGJkZWZkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pMzg2L3htLXB0eDQuaApAQCAtMCwwICsxLDI1IEBACisvKiBEZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gYSBTZXF1ZW50IFN5bW1ldHJ5IHVuZGVyIHB0eCwgd2l0aAorICAgV2VpdGVrIDExNjcgYW5kIGkzODcgc3VwcG9ydC4gIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkyLAorICAgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBTeW1tZXRyeSB2ZXJzaW9uIGJ5IEpheSBWb3NidXJnaCAoZnViYXJAc2VxdWVudC5jb20pICovCisKKyNpbmNsdWRlICJ4bS1zeXN2NC5oIgorCisjaW5jbHVkZSAieG0tcHR4LmgiCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2kzODYveG0tc3VuMzg2LmggYi9nZGIvY29uZmlnL2kzODYveG0tc3VuMzg2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjM2I1OAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni94bS1zdW4zODYuaApAQCAtMCwwICsxLDIwIEBACisvKiBIb3N0IHN1cHBvcnQgZm9yIFN1biAzODZpLCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5LCAxOTkyLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgSE9TVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni94bS1zeW1tZXRyeS5oIGIvZ2RiL2NvbmZpZy9pMzg2L3htLXN5bW1ldHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJlOWE5YQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTM4Ni94bS1zeW1tZXRyeS5oCkBAIC0wLDAgKzEsMjggQEAKKy8qIERlZmluaXRpb25zIHRvIG1ha2UgR0RCIHJ1biBvbiBhIFNlcXVlbnQgU3ltbWV0cnkgdW5kZXIKKyAgIGR5bml4IDMuMSwgd2l0aCBXZWl0ZWsgMTE2NyBhbmQgaTM4NyBzdXBwb3J0LgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTIsIDE5OTMsIDE5OTQgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFN5bW1ldHJ5IHZlcnNpb24gYnkgSmF5IFZvc2J1cmdoIChmdWJhckBzZXF1ZW50LmNvbSkgKi8KKworLyogVGhpcyBtYWNoaW5lIGRvZXNuJ3QgaGF2ZSB0aGUgc2lnaW50ZXJydXB0IGNhbGwuICAqLworI2RlZmluZSBOT19TSUdJTlRFUlJVUFQKKworI2RlZmluZSBIQVZFX1dBSVRfU1RSVUNUCisKKyNkZWZpbmUgSE9TVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTM4Ni94bS13aW5kb3dzLmggYi9nZGIvY29uZmlnL2kzODYveG0td2luZG93cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwODMwMTAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2kzODYveG0td2luZG93cy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIERlZmluaXRpb25zIGZvciBob3N0aW5nIG9uIFdJTjMyLCBidWlsdCB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgQy9DKyssIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiaTM4Ni94bS1jeWd3aW4uaCIKKworI3VuZGVmIFBSSU5URl9IQVNfTE9OR19MT05HCisjdW5kZWYgSEFWRV9VTklTVERfSAorI3VuZGVmIEhBVkVfVEVSTUlPX0gKKyN1bmRlZiBIQVZFX1RFUk1JT1NfSAorI3VuZGVmIEhBVkVfU0dUVFlfSAorI3VuZGVmIEhBVkVfU0JSSworI2RlZmluZSBDQU5UX0ZPUksKKworI2RlZmluZSBNQUxMT0NfSU5DT01QQVRJQkxFCisKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKworI2RlZmluZSBTSUdRVUlUIDMKKyNkZWZpbmUgU0lHVFJBUCA1CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2k5NjAvbW9uOTYwLm10IGIvZ2RiL2NvbmZpZy9pOTYwL21vbjk2MC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2Q3MzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pOTYwL21vbjk2MC5tdApAQCAtMCwwICsxLDYgQEAKKyMgVGFyZ2V0OiBJbnRlbCA5NjAgcm9tIG1vbml0b3IKK1RERVBGSUxFUz0gaTk2MC10ZGVwLm8gbW9uaXRvci5vIG1vbjk2MC1yb20ubyB0dHlmbHVzaC5vIHhtb2RlbS5vIGRzcmVjLm8KK1RNX0ZJTEU9IHRtLW1vbjk2MC5oCitTSU1fT0JTID0gcmVtb3RlLXNpbS5vCitTSU0gPSAuLi9zaW0vaTk2MC9saWJzaW0uYQorCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2k5NjAvbmluZHk5NjAubXQgYi9nZGIvY29uZmlnL2k5NjAvbmluZHk5NjAubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3YzFkYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvaTk2MC9uaW5keTk2MC5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBJbnRlbCA4MDk2MCwgaW4gYW4gZW1iZWRkZWQgc3lzdGVtIHVuZGVyIHRoZSBOSU5EWSBtb25pdG9yCitUREVQRklMRVM9IGk5NjAtdGRlcC5vIG5pbmR5LXRkZXAubyByZW1vdGUtbmluZHkubyBuaW5keS5vIE9uaW5keS5vIHR0eWZsdXNoLm8KK1RNX0ZJTEU9IHRtLW5pbmR5OTYwLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTk2MC90bS1pOTYwLmggYi9nZGIvY29uZmlnL2k5NjAvdG0taTk2MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZDkzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2k5NjAvdG0taTk2MC5oCkBAIC0wLDAgKzEsMzcyIEBACisvKiBQYXJhbWV0ZXJzIGZvciB0YXJnZXQgbWFjaGluZSBJbnRlbCA5NjAsIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBJbnRlbCBDb3Jwb3JhdGlvbi4KK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogRGVmaW5pdGlvbnMgdG8gdGFyZ2V0IEdEQiB0byBhbnkgaTk2MC4gICovCisKKyNpZm5kZWYgSTgwOTYwCisjZGVmaW5lIEk4MDk2MAorI2VuZGlmCisKKy8qIEhvb2sgZm9yIHRoZSBTWU1CT0xfQ0xBU1Mgb2YgYSBwYXJhbWV0ZXIgd2hlbiBkZWNvZGluZyBEQlggc3ltYm9sCisgICBpbmZvcm1hdGlvbi4gIEluIHRoZSBpOTYwLCBwYXJhbWV0ZXJzIGNhbiBiZSBzdG9yZWQgYXMgbG9jYWxzIG9yIGFzCisgICBhcmdzLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgdGhlIGRlYnVnIHJlY29yZC4KKworICAgRnJvbSBlbXBpcmljYWwgb2JzZXJ2YXRpb24sIGdjYzk2MCB1c2VzIE5fTFNZTSB0byBpbmRpY2F0ZQorICAgYXJndW1lbnRzIHBhc3NlZCBpbiByZWdpc3RlcnMgYW5kIHRoZW4gY29waWVkIGltbWVkaWF0ZWx5CisgICB0byB0aGUgZnJhbWUsIGFuZCBOX1BTWU0gdG8gaW5kaWNhdGUgYXJndW1lbnRzIHBhc3NlZCBpbiBhCisgICBnMTQtcmVsYXRpdmUgYXJndW1lbnQgYmxvY2suICAqLworCisjZGVmaW5lCURCWF9QQVJNX1NZTUJPTF9DTEFTUyh0eXBlKSAoKHR5cGUgPT0gTl9MU1lNKT8gTE9DX0xPQ0FMX0FSRzogTE9DX0FSRykKKworLyogQnl0ZSBvcmRlciBpcyBjb25maWd1cmFibGUsIGJ1dCB0aGlzIG1hY2hpbmUgcnVucyBsaXR0bGUtZW5kaWFuLiAgKi8KKyNkZWZpbmUJVEFSR0VUX0JZVEVfT1JERVIJTElUVExFX0VORElBTgorCisvKiBXZSBoYXZlIElFRUUgZmxvYXRpbmcgcG9pbnQsIGlmIHdlIGhhdmUgYW55IGZsb2F0IGF0IGFsbC4gICovCisKKyNkZWZpbmUgSUVFRV9GTE9BVAorCisvKiBPZmZzZXQgZnJvbSBhZGRyZXNzIG9mIGZ1bmN0aW9uIHRvIHN0YXJ0IG9mIGl0cyBjb2RlLgorICAgWmVybyBvbiBtb3N0IG1hY2hpbmVzLiAgKi8KKworI2RlZmluZSBGVU5DVElPTl9TVEFSVF9PRkZTRVQgMAorCisvKiBBZHZhbmNlIGlwIGFjcm9zcyBhbnkgZnVuY3Rpb24gZW50cnkgcHJvbG9ndWUgaW5zdHJ1Y3Rpb25zCisgICB0byByZWFjaCBzb21lICJyZWFsIiBjb2RlLiAgKi8KKworI2RlZmluZSBTS0lQX1BST0xPR1VFKGlwKQl7IGlwID0gc2tpcF9wcm9sb2d1ZSAoaXApOyB9CitleHRlcm4gQ09SRV9BRERSIHNraXBfcHJvbG9ndWUgKCk7CisKKy8qIEltbWVkaWF0ZWx5IGFmdGVyIGEgZnVuY3Rpb24gY2FsbCwgcmV0dXJuIHRoZSBzYXZlZCBpcC4KKyAgIENhbid0IGFsd2F5cyBnbyB0aHJvdWdoIHRoZSBmcmFtZXMgZm9yIHRoaXMgYmVjYXVzZSBvbiBzb21lIG1hY2hpbmVzCisgICB0aGUgbmV3IGZyYW1lIGlzIG5vdCBzZXQgdXAgdW50aWwgdGhlIG5ldyBmdW5jdGlvbgorICAgZXhlY3V0ZXMgc29tZSBpbnN0cnVjdGlvbnMuICAqLworCisjZGVmaW5lIFNBVkVEX1BDX0FGVEVSX0NBTEwoZnJhbWUpIChzYXZlZF9wY19hZnRlcl9jYWxsIChmcmFtZSkpCitleHRlcm4gQ09SRV9BRERSIHNhdmVkX3BjX2FmdGVyX2NhbGwgKCk7CisKKy8qIFN0YWNrIGdyb3dzIHVwd2FyZCAqLworCisjZGVmaW5lIElOTkVSX1RIQU4obGhzLHJocykgKChsaHMpID4gKHJocykpCisKKy8qIFNheSBob3cgbG9uZyAob3JkaW5hcnkpIHJlZ2lzdGVycyBhcmUuICBUaGlzIGlzIGEgcGllY2Ugb2YgYm9nb3NpdHkKKyAgIHVzZWQgaW4gcHVzaF93b3JkIGFuZCBhIGZldyBvdGhlciBwbGFjZXM7IFJFR0lTVEVSX1JBV19TSVpFIGlzIHRoZQorICAgcmVhbCB3YXkgdG8ga25vdyBob3cgYmlnIGEgcmVnaXN0ZXIgaXMuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1NJWkUgNAorCisvKiBOdW1iZXIgb2YgbWFjaGluZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlVNX1JFR1MgNDAKKworLyogSW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIG5hbWVzIG9mIHJlZ2lzdGVycy4KKyAgIFRoZXJlIHNob3VsZCBiZSBOVU1fUkVHUyBzdHJpbmdzIGluIHRoaXMgaW5pdGlhbGl6ZXIuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX05BTUVTIHsgXAorCS8qICAwICovICJwZnAiLCAic3AiLCAgInJpcCIsICJyMyIsICAicjQiLCAgInI1IiwgICJyNiIsICAicjciLCBcCisJLyogIDggKi8gInI4IiwgICJyOSIsICAicjEwIiwgInIxMSIsICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUiLFwKKwkvKiAxNiAqLyAiZzAiLCAgImcxIiwgICJnMiIsICAiZzMiLCAgImc0IiwgICJnNSIsICAiZzYiLCAgImc3IiwgXAorCS8qIDI0ICovICJnOCIsICAiZzkiLCAgImcxMCIsICJnMTEiLCAiZzEyIiwgImcxMyIsICJnMTQiLCAiZnAiLCBcCisJLyogMzIgKi8gInBjdyIsICJhYyIsICAidGMiLCAgImlwIiwgICJmcDAiLCAiZnAxIiwgImZwMiIsICJmcDMiLFwKK30KKworLyogUmVnaXN0ZXIgbnVtYmVycyBvZiB2YXJpb3VzIGltcG9ydGFudCByZWdpc3RlcnMgKHVzZWQgdG8gaW5kZXgKKyAgIGludG8gYXJyYXlzIG9mIHJlZ2lzdGVyIG5hbWVzIGFuZCByZWdpc3RlciB2YWx1ZXMpLiAgKi8KKworI2RlZmluZSBSMF9SRUdOVU0gICAwCS8qIEZpcnN0IGxvY2FsIHJlZ2lzdGVyCQkqLworI2RlZmluZSBTUF9SRUdOVU0gICAxCS8qIENvbnRhaW5zIGFkZHJlc3Mgb2YgdG9wIG9mIHN0YWNrICovCisjZGVmaW5lIFJJUF9SRUdOVU0gIDIJLyogUmV0dXJuIGluc3RydWN0aW9uIHBvaW50ZXIgKGxvY2FsIHIyKSAqLworI2RlZmluZSBSMTVfUkVHTlVNIDE1CS8qIExhc3QgbG9jYWwgcmVnaXN0ZXIJCSovCisjZGVmaW5lIEcwX1JFR05VTSAgMTYJLyogRmlyc3QgZ2xvYmFsIHJlZ2lzdGVyCSovCisjZGVmaW5lIEcxM19SRUdOVU0gMjkJLyogZzEzIC0gaG9sZHMgc3RydWN0IHJldHVybiBhZGRyZXNzICovCisjZGVmaW5lIEcxNF9SRUdOVU0gMzAJLyogZzE0IC0gcHRyIHRvIGFyZyBibG9jayAvIGxlYWZwcm9jIHJldHVybiBhZGRyZXNzICovCisjZGVmaW5lIEZQX1JFR05VTSAgMzEJLyogQ29udGFpbnMgYWRkcmVzcyBvZiBleGVjdXRpbmcgc3RhY2sgZnJhbWUgKi8KKyNkZWZpbmUJUENXX1JFR05VTSAzMgkvKiBwcm9jZXNzIGNvbnRyb2wgd29yZCAqLworI2RlZmluZQlBQ1dfUkVHTlVNIDMzCS8qIGFyaXRobWV0aWMgY29udHJvbCB3b3JkICovCisjZGVmaW5lCVRDV19SRUdOVU0gMzQJLyogdHJhY2UgY29udHJvbCB3b3JkICovCisjZGVmaW5lIElQX1JFR05VTSAgMzUJLyogaW5zdHJ1Y3Rpb24gcG9pbnRlciAqLworI2RlZmluZSBGUDBfUkVHTlVNIDM2CS8qIEZpcnN0IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyICovCisKKy8qIFNvbWUgcmVnaXN0ZXJzIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lICovCisKKyNkZWZpbmUgUENfUkVHTlVNICBJUF9SRUdOVU0JLyogR0RCIHJlZmVycyB0byBpcCBhcyB0aGUgUHJvZ3JhbSBDb3VudGVyICovCisjZGVmaW5lIFBGUF9SRUdOVU0gUjBfUkVHTlVNCS8qIFByZXZpb3VzIGZyYW1lIHBvaW50ZXIJKi8KKworLyogVG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCB0byBzdG9yZSBvdXIgY29waWVzIG9mIHRoZSBtYWNoaW5lJ3MKKyAgIHJlZ2lzdGVyIHN0YXRlLCB0aGUgYXJyYXkgYHJlZ2lzdGVycycuICAqLworI2RlZmluZSBSRUdJU1RFUl9CWVRFUyAoKDM2KjQpICsgKDQqMTApKQorCisvKiBJbmRleCB3aXRoaW4gYHJlZ2lzdGVycycgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNwYWNlIGZvciByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9CWVRFKE4pICggKE4pIDwgRlAwX1JFR05VTSA/IFwKKwkJCQkoNCooTikpIDogKCgxMCooTikpIC0gKDYqRlAwX1JFR05VTSkpICkKKworLyogVGhlIGk5NjAgaGFzIHJlZ2lzdGVyIHdpbmRvd3MsIHNvcnQgb2YuICAqLworCisjZGVmaW5lIEhBVkVfUkVHSVNURVJfV0lORE9XUworCisvKiBJcyB0aGlzIHJlZ2lzdGVyIHBhcnQgb2YgdGhlIHJlZ2lzdGVyIHdpbmRvdyBzeXN0ZW0/ICBBIHllcyBhbnN3ZXIKKyAgIGltcGxpZXMgdGhhdCAxKSBUaGUgbmFtZSBvZiB0aGlzIHJlZ2lzdGVyIHdpbGwgbm90IGJlIHRoZSBzYW1lIGluCisgICBvdGhlciBmcmFtZXMsIGFuZCAyKSBUaGlzIHJlZ2lzdGVyIGlzIGF1dG9tYXRpY2FsbHkgInNhdmVkIiB1cG9uCisgICBzdWJyb3V0aW5lIGNhbGxzIGFuZCB0aHVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2VhcmNoIG1vcmUgdGhhbiBvbmUKKyAgIHN0YWNrIGZyYW1lIGZvciBpdC4KKyAgIAorICAgT24gdGhlIGk5NjAsIGluIGZhY3QsIHRoZSBuYW1lIG9mIHRoaXMgcmVnaXN0ZXIgaW4gYW5vdGhlciBmcmFtZSBpcworICAgIm11ZCIgLS0gdGhlcmUgaXMgbm8gb3ZlcmxhcCBiZXR3ZWVuIHRoZSB3aW5kb3dzLiAgRWFjaCB3aW5kb3cgaXMKKyAgIHNpbXBseSBzYXZlZCBpbnRvIHRoZSBzdGFjayAodHJ1ZSBmb3Igb3VyIHB1cnBvc2VzLCBhZnRlciBoYXZpbmcgYmVlbgorICAgZmx1c2hlZDsgbm9ybWFsbHkgdGhleSByZXNpZGUgb24tY2hpcCBhbmQgYXJlIHJlc3RvcmVkIGZyb20gb24tY2hpcAorICAgd2l0aG91dCBldmVyIGdvaW5nIHRvIG1lbW9yeSkuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0lOX1dJTkRPV19QKHJlZ251bSkJKChyZWdudW0pIDw9IFIxNV9SRUdOVU0pCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBhY3R1YWwgbWFjaGluZSByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICBPbiB0aGUgaTk2MCwgYWxsIHJlZ3MgYXJlIDQgYnl0ZXMgZXhjZXB0IGZvciBmbG9hdGluZworICAgcG9pbnQsIHdoaWNoIGFyZSAxMC4gIE5JTkRZIG9ubHkgc2VuZHMgdXMgOCBieXRlIHZhbHVlcyBmb3IgdGhlc2UsCisgICB3aGljaCBpcyBhIHBhaW4sIGJ1dCBWeFdvcmtzIGhhbmRsZXMgdGhpcyBjb3JyZWN0bHksIHNvIHdlIG11c3QuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pCQkoIChOKSA8IEZQMF9SRUdOVU0gPyA0IDogMTAgKQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgcHJvZ3JhbSdzIHJlcHJlc2VudGF0aW9uIGZvciByZWdpc3RlciBOLiAqLworCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfU0laRShOKQkoIChOKSA8IEZQMF9SRUdOVU0gPyA0IDogOCApCisKKy8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfUkFXX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9SQVdfU0laRSAxMAorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1ZJUlRVQUxfU0laRSBjYW4gaGF2ZS4gICovCisKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1ZJUlRVQUxfU0laRSA4CisKKy8qIE5vbnplcm8gaWYgcmVnaXN0ZXIgTiByZXF1aXJlcyBjb252ZXJzaW9uIGZyb20gcmF3IGZvcm1hdCB0byB2aXJ0dWFsCisgICBmb3JtYXQuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0NPTlZFUlRJQkxFKE4pICgoTikgPj0gRlAwX1JFR05VTSkKKworI2luY2x1ZGUgImZsb2F0Zm9ybWF0LmgiCisKKyNkZWZpbmUgVEFSR0VUX0xPTkdfRE9VQkxFX0ZPUk1BVCAmZmxvYXRmb3JtYXRfaTk2MF9leHQKKworLyogQ29udmVydCBkYXRhIGZyb20gcmF3IGZvcm1hdCBmb3IgcmVnaXN0ZXIgUkVHTlVNIGluIGJ1ZmZlciBGUk9NCisgICB0byB2aXJ0dWFsIGZvcm1hdCB3aXRoIHR5cGUgVFlQRSBpbiBidWZmZXIgVE8uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0NPTlZFUlRfVE9fVklSVFVBTChSRUdOVU0sVFlQRSxGUk9NLFRPKQlcCit7IFwKKyAgRE9VQkxFU1QgdmFsOyBcCisgIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZXN0ICgmZmxvYXRmb3JtYXRfaTk2MF9leHQsIChGUk9NKSwgJnZhbCk7IFwKKyAgc3RvcmVfZmxvYXRpbmcgKChUTyksIFRZUEVfTEVOR1RIIChUWVBFKSwgdmFsKTsgXAorfQorCisvKiBDb252ZXJ0IGRhdGEgZnJvbSB2aXJ0dWFsIGZvcm1hdCB3aXRoIHR5cGUgVFlQRSBpbiBidWZmZXIgRlJPTQorICAgdG8gcmF3IGZvcm1hdCBmb3IgcmVnaXN0ZXIgUkVHTlVNIGluIGJ1ZmZlciBUTy4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfQ09OVkVSVF9UT19SQVcoVFlQRSxSRUdOVU0sRlJPTSxUTykJXAoreyBcCisgIERPVUJMRVNUIHZhbCA9IGV4dHJhY3RfZmxvYXRpbmcgKChGUk9NKSwgVFlQRV9MRU5HVEggKFRZUEUpKTsgXAorICBmbG9hdGZvcm1hdF9mcm9tX2RvdWJsZXN0ICgmZmxvYXRmb3JtYXRfaTk2MF9leHQsICZ2YWwsIChUTykpOyBcCit9CisKKy8qIFJldHVybiB0aGUgR0RCIHR5cGUgb2JqZWN0IGZvciB0aGUgInN0YW5kYXJkIiBkYXRhIHR5cGUKKyAgIG9mIGRhdGEgaW4gcmVnaXN0ZXIgTi4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9UWVBFKE4pICgoTikgPCBGUDBfUkVHTlVNID8gXAorCQkJCQlidWlsdGluX3R5cGVfaW50IDogYnVpbHRpbl90eXBlX2RvdWJsZSkKKwwKKy8qIE1hY3JvcyBmb3IgdW5kZXJzdGFuZGluZyBmdW5jdGlvbiByZXR1cm4gdmFsdWVzLi4uICovCisKKy8qIERvZXMgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiB1c2UgdGhlICJzdHJ1Y3QgcmV0dXJuaW5nIiBjb252ZW50aW9uCisgICBvciB0aGUgInZhbHVlIHJldHVybmluZyIgY29udmVudGlvbj8gIFRoZSAidmFsdWUgcmV0dXJuaW5nIiBjb252ZW50aW9uCisgICBhbG1vc3QgaW52YXJpYWJseSByZXR1cm5zIHRoZSBlbnRpcmUgdmFsdWUgaW4gcmVnaXN0ZXJzLiAgVGhlCisgICAic3RydWN0IHJldHVybmluZyIgY29udmVudGlvbiBvZnRlbiByZXR1cm5zIHRoZSBlbnRpcmUgdmFsdWUgaW4KKyAgIG1lbW9yeSwgYW5kIHBhc3NlcyBhIHBvaW50ZXIgKG91dCBvZiBvciBpbnRvIHRoZSBmdW5jdGlvbikgc2F5aW5nCisgICB3aGVyZSB0aGUgdmFsdWUgKGlzIG9yIHNob3VsZCBnbykuCisKKyAgIFNpbmNlIHRoaXMgc29tZXRpbWVzIGRlcGVuZHMgb24gd2hldGhlciBpdCB3YXMgY29tcGlsZWQgd2l0aCBHQ0MsCisgICB0aGlzIGlzIGFsc28gYW4gYXJndW1lbnQuICBUaGlzIGlzIHVzZWQgaW4gY2FsbF9mdW5jdGlvbiB0byBidWlsZCBhCisgICBzdGFjaywgYW5kIGluIHZhbHVlX2JlaW5nX3JldHVybmVkIHRvIHByaW50IHJldHVybiB2YWx1ZXMuCisKKyAgIE9uIGk5NjAsIGEgc3RydWN0dXJlIGlzIHJldHVybmVkIGluIHJlZ2lzdGVycyBnMC1nMywgaWYgaXQgd2lsbCBmaXQuCisgICBJZiBpdCdzIG1vcmUgdGhhbiAxNiBieXRlcyBsb25nLCBnMTMgcG9pbnRlZCB0byBpdCBvbiBlbnRyeS4gICovCisKK2V4dGVybiB1c2Vfc3RydWN0X2NvbnZlbnRpb25fZm4gaTk2MF91c2Vfc3RydWN0X2NvbnZlbnRpb247CisjZGVmaW5lIFVTRV9TVFJVQ1RfQ09OVkVOVElPTihnY2NfcCwgdHlwZSkgaTk2MF91c2Vfc3RydWN0X2NvbnZlbnRpb24gKGdjY19wLCB0eXBlKQorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwgZm9ybWF0LAorICAgaW50byBWQUxCVUYuICBUaGlzIGlzIG9ubHkgY2FsbGVkIGlmIFVTRV9TVFJVQ1RfQ09OVkVOVElPTiBmb3IgdGhpcworICAgdHlwZSBpcyAwLgorCisgICBPbiB0aGUgaTk2MCB3ZSBqdXN0IHRha2UgYXMgbWFueSBieXRlcyBhcyB3ZSBuZWVkIGZyb20gRzAgdGhyb3VnaCBHMy4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9SRVRVUk5fVkFMVUUoVFlQRSxSRUdCVUYsVkFMQlVGKSBcCisJbWVtY3B5KFZBTEJVRiwgUkVHQlVGK1JFR0lTVEVSX0JZVEUoRzBfUkVHTlVNKSwgVFlQRV9MRU5HVEggKFRZUEUpKQorCisvKiBJZiBVU0VfU1RSVUNUX0NPTlZFTlRJT04gcHJvZHVjZXMgYSAxLCAKKyAgIGV4dHJhY3QgZnJvbSBhbiBhcnJheSBSRUdCVUYgY29udGFpbmluZyB0aGUgKHJhdykgcmVnaXN0ZXIgc3RhdGUKKyAgIHRoZSBhZGRyZXNzIGluIHdoaWNoIGEgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBpdHMgc3RydWN0dXJlIHZhbHVlLAorICAgYXMgYSBDT1JFX0FERFIgKG9yIGFuIGV4cHJlc3Npb24gdGhhdCBjYW4gYmUgdXNlZCBhcyBvbmUpLgorCisgICBBZGRyZXNzIG9mIHdoZXJlIHRvIHB1dCBzdHJ1Y3R1cmUgd2FzIHBhc3NlZCBpbiBpbiBnbG9iYWwKKyAgIHJlZ2lzdGVyIGcxMyBvbiBlbnRyeS4gIEdvZCBrbm93cyB3aGF0J3MgaW4gZzEzIG5vdy4gIFRoZQorICAgKC4uLiwgMCkgYmVsb3cgaXMgdG8gbWFrZSBpdCBhcHBlYXIgdG8gcmV0dXJuIGEgdmFsdWUsIHRob3VnaAorICAgYWN0dWFsbHkgYWxsIGl0IGRvZXMgaXMgY2FsbCBlcnJvcigpLiAgKi8KKworI2RlZmluZSBFWFRSQUNUX1NUUlVDVF9WQUxVRV9BRERSRVNTKFJFR0JVRikgXAorICAgKGVycm9yKCJEb24ndCBrbm93IHdoZXJlIGxhcmdlIHN0cnVjdHVyZSBpcyByZXR1cm5lZCBvbiBpOTYwIiksIDApCisKKy8qIFdyaXRlIGludG8gYXBwcm9wcmlhdGUgcmVnaXN0ZXJzIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlCisgICBvZiB0eXBlIFRZUEUsIGdpdmVuIGluIHZpcnR1YWwgZm9ybWF0LCBmb3IgInZhbHVlIHJldHVybmluZyIgZnVuY3Rpb25zLgorICAKKyAgIEZvciAncmV0dXJuJyBjb21tYW5kOiAgbm90ICh5ZXQpIGltcGxlbWVudGVkIGZvciBpOTYwLiAgKi8KKworI2RlZmluZSBTVE9SRV9SRVRVUk5fVkFMVUUoVFlQRSxWQUxCVUYpIFwKKyAgICBlcnJvciAoIlJldHVybmluZyB2YWx1ZXMgZnJvbSBmdW5jdGlvbnMgaXMgbm90IGltcGxlbWVudGVkIGluIGk5NjAgZ2RiIikKKworLyogU3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIHBsYWNlIGluIHdoaWNoIHRvIGNvcHkgdGhlIHN0cnVjdHVyZSB0aGUKKyAgIHN1YnJvdXRpbmUgd2lsbCByZXR1cm4uICBUaGlzIGlzIGNhbGxlZCBmcm9tIGNhbGxfZnVuY3Rpb24uICovCisKKyNkZWZpbmUgU1RPUkVfU1RSVUNUX1JFVFVSTihBRERSLCBTUCkgXAorICAgIGVycm9yICgiUmV0dXJuaW5nIHZhbHVlcyBmcm9tIGZ1bmN0aW9ucyBpcyBub3QgaW1wbGVtZW50ZWQgaW4gaTk2MCBnZGIiKQorDAorLyogRGVzY3JpYmUgdGhlIHBvaW50ZXIgaW4gZWFjaCBzdGFjayBmcmFtZSB0byB0aGUgcHJldmlvdXMgc3RhY2sgZnJhbWUKKyAgIChpdHMgY2FsbGVyKS4gICovCisKKy8qIEZSQU1FX0NIQUlOIHRha2VzIGEgZnJhbWUncyBub21pbmFsIGFkZHJlc3MKKyAgIGFuZCBwcm9kdWNlcyB0aGUgZnJhbWUncyBjaGFpbi1wb2ludGVyLgorCisgICBIb3dldmVyLCBpZiBGUkFNRV9DSEFJTl9WQUxJRCByZXR1cm5zIHplcm8sCisgICBpdCBtZWFucyB0aGUgZ2l2ZW4gZnJhbWUgaXMgdGhlIG91dGVybW9zdCBvbmUgYW5kIGhhcyBubyBjYWxsZXIuICAqLworCisvKiBXZSBjYWNoZSBpbmZvcm1hdGlvbiBhYm91dCBzYXZlZCByZWdpc3RlcnMgaW4gdGhlIGZyYW1lIHN0cnVjdHVyZSwKKyAgIHRvIHNhdmUgdXMgZnJvbSBoYXZpbmcgdG8gcmUtc2NhbiBmdW5jdGlvbiBwcm9sb2d1ZXMgZXZlcnkgdGltZQorICAgYSByZWdpc3RlciBpbiBhIG5vbi1jdXJyZW50IGZyYW1lIGlzIGFjY2Vzc2VkLiAgKi8KKworI2RlZmluZSBFWFRSQV9GUkFNRV9JTkZPIAlcCisJc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKmZzcjsJXAorCUNPUkVfQUREUiBhcmdfcG9pbnRlcjsKKworLyogWmVybyB0aGUgZnJhbWVfc2F2ZWRfcmVncyBwb2ludGVyIHdoZW4gdGhlIGZyYW1lIGlzIGluaXRpYWxpemVkLAorICAgc28gdGhhdCBGUkFNRV9GSU5EX1NBVkVEX1JFR1MgKCkgd2lsbCBrbm93IHRvIGFsbG9jYXRlIGFuZAorICAgaW5pdGlhbGl6ZSBhIGZyYW1lX3NhdmVkX3JlZ3Mgc3RydWN0IHRoZSBmaXJzdCB0aW1lIGl0IGlzIGNhbGxlZC4KKyAgIFNldCB0aGUgYXJnX3BvaW50ZXIgdG8gLTEsIHdoaWNoIGlzIG5vdCB2YWxpZDsgMCBhbmQgb3RoZXIgdmFsdWVzCisgICBpbmRpY2F0ZSByZWFsLCBjYWNoZWQgdmFsdWVzLiAgKi8KKworI2RlZmluZSBJTklUX0VYVFJBX0ZSQU1FX0lORk8oZnJvbWxlYWYsIGZpKSBcCisJKChmaSktPmZzciA9IDAsIChmaSktPmFyZ19wb2ludGVyID0gLTEpCisKKy8qIE9uIHRoZSBpOTYwLCB3ZSBnZXQgdGhlIGNoYWluIHBvaW50ZXIgYnkgcmVhZGluZyB0aGUgUEZQIHNhdmVkCisgICBvbiB0aGUgc3RhY2sgYW5kIGNsZWFyaW5nIHRoZSBzdGF0dXMgYml0cy4gICovCisKKyNkZWZpbmUgRlJBTUVfQ0hBSU4odGhpc2ZyYW1lKSBcCisgIChyZWFkX21lbW9yeV9pbnRlZ2VyIChGUkFNRV9GUCh0aGlzZnJhbWUpLCA0KSAmIH4weGYpCisKKy8qIEZSQU1FX0NIQUlOX1ZBTElEIHJldHVybnMgemVybyBpZiB0aGUgZ2l2ZW4gZnJhbWUgaXMgdGhlIG91dGVybW9zdCBvbmUKKyAgIGFuZCBoYXMgbm8gY2FsbGVyLgorCisgICBPbiB0aGUgaTk2MCwgZWFjaCB2YXJpb3VzIHRhcmdldCBzeXN0ZW0gdHlwZSBtdXN0IGRlZmluZSBGUkFNRV9DSEFJTl9WQUxJRCwKKyAgIHNpbmNlIGl0IGRpZmZlcnMgYmV0d2VlbiBOSU5EWSBhbmQgVnhXb3JrcywgdGhlIHR3byBjdXJyZW50bHkgc3VwcG9ydGVkCisgICB0YXJnZXRzIHR5cGVzLiAgV2UgbGVhdmUgaXQgdW5kZWZpbmVkIGhlcmUuICAqLworCisKKy8qIEEgbWFjcm8gdGhhdCB0ZWxscyB1cyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpbnZvY2F0aW9uIHJlcHJlc2VudGVkCisgICBieSBGSSBkb2VzIG5vdCBoYXZlIGEgZnJhbWUgb24gdGhlIHN0YWNrIGFzc29jaWF0ZWQgd2l0aCBpdC4gIElmIGl0CisgICBkb2VzIG5vdCwgRlJBTUVMRVNTIGlzIHNldCB0byAxLCBlbHNlIDAuICAqLworCisjZGVmaW5lIEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OKEZJLCBGUkFNRUxFU1MpIFwKKyAgeyAoRlJBTUVMRVNTKSA9IChsZWFmcHJvY19yZXR1cm4gKChGSSktPnBjKSAhPSAwKTsgfQorCisvKiBOb3RlIHRoYXQgaW4gdGhlIGk5NjAgYXJjaGl0ZWN0dXJlIHRoZSByZXR1cm4gcG9pbnRlciBpcyBzYXZlZCBpbiB0aGUKKyAgICpjYWxsZXIncyogc3RhY2sgZnJhbWUuCisgIAorICAgTWFrZSBzdXJlIHRvIHplcm8gbG93LW9yZGVyIGJpdHMgYmVjYXVzZSBvZiBidWcgaW4gOTYwQ0EgQS1zdGVwIHBhcnQKKyAgIChpbnN0cnVjdGlvbiBhZGRyZXNzZXMgc2hvdWxkIGFsd2F5cyBiZSB3b3JkLWFsaWduZWQgYW55d2F5KS4gICovCisKKyNkZWZpbmUgRlJBTUVfU0FWRURfUEMoZnJhbWUpIFwKKwkJCSgocmVhZF9tZW1vcnlfaW50ZWdlcihGUkFNRV9DSEFJTihmcmFtZSkrOCw0KSkgJiB+MykKKworLyogT24gdGhlIGk5NjAsIEZSQU1FX0FSR1NfQUREUkVTUyBzaG91bGQgcmV0dXJuIHRoZSB2YWx1ZSBvZgorICAgZzE0IGFzIHBhc3NlZCBpbnRvIHRoZSBmcmFtZSwgaWYga25vd24uICBXZSBuZWVkIGEgZnVuY3Rpb24gZm9yIHRoaXMuCisgICBXZSBjYWNoZSB0aGlzIHZhbHVlIGluIHRoZSBmcmFtZSBpbmZvIGlmIHdlJ3ZlIGFscmVhZHkgbG9va2VkIGl0IHVwLiAgKi8KKworI2RlZmluZSBGUkFNRV9BUkdTX0FERFJFU1MoZmkpIAlcCisgICgoKGZpKS0+YXJnX3BvaW50ZXIgIT0gLTEpPyAoZmkpLT5hcmdfcG9pbnRlcjogZnJhbWVfYXJnc19hZGRyZXNzIChmaSwgMCkpCitleHRlcm4gQ09SRV9BRERSIGZyYW1lX2FyZ3NfYWRkcmVzcyAoKTsJCS8qIGk5NjAtdGRlcC5jICovCisKKy8qIFRoaXMgaXMgdGhlIHNhbWUgZXhjZXB0IGl0IHNob3VsZCByZXR1cm4gMCB3aGVuCisgICBpdCBkb2VzIG5vdCByZWFsbHkga25vdyB3aGVyZSB0aGUgYXJncyBhcmUsIHJhdGhlciB0aGFuIGd1ZXNzaW5nLgorICAgVGhpcyB2YWx1ZSBpcyBub3QgY2FjaGVkIHNpbmNlIGl0IGlzIG9ubHkgdXNlZCBpbmZyZXF1ZW50bHkuICAqLworCisjZGVmaW5lCUZSQU1FX0FSR1NfQUREUkVTU19DT1JSRUNUKGZpKQkoZnJhbWVfYXJnc19hZGRyZXNzIChmaSwgMSkpCisKKyNkZWZpbmUgRlJBTUVfTE9DQUxTX0FERFJFU1MoZmkpCShmaSktPmZyYW1lCisKKy8qIFNldCBOVU1BUkdTIHRvIHRoZSBudW1iZXIgb2YgYXJncyBwYXNzZWQgdG8gYSBmcmFtZS4KKyAgIENhbiByZXR1cm4gLTEsIG1lYW5pbmcgbm8gd2F5IHRvIHRlbGwuICAqLworCisjZGVmaW5lIEZSQU1FX05VTV9BUkdTKG51bWFyZ3MsIGZpKQkobnVtYXJncyA9IC0xKQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGF0IHN0YXJ0IG9mIGFyZ2xpc3QgdGhhdCBhcmUgbm90IHJlYWxseSBhcmdzLiAgKi8KKworI2RlZmluZSBGUkFNRV9BUkdTX1NLSVAgMAorCisvKiBQcm9kdWNlIHRoZSBwb3NpdGlvbnMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBpbiBhIHN0YWNrIGZyYW1lLiAgKi8KKworI2RlZmluZSBGUkFNRV9GSU5EX1NBVkVEX1JFR1MoZnJhbWVfaW5mb19hZGRyLCBzcikgXAorCWZyYW1lX2ZpbmRfc2F2ZWRfcmVncyAoZnJhbWVfaW5mb19hZGRyLCAmc3IpCitleHRlcm4gdm9pZCBmcmFtZV9maW5kX3NhdmVkX3JlZ3MoKTsJCS8qIFNlZSBpOTYwLXRkZXAuYyAqLworDAorLyogVGhpbmdzIG5lZWRlZCBmb3IgbWFraW5nIGNhbGxzIHRvIGZ1bmN0aW9ucyBpbiB0aGUgaW5mZXJpb3IgcHJvY2VzcyAqLworCisvKiBQdXNoIGFuIGVtcHR5IHN0YWNrIGZyYW1lLCB0byByZWNvcmQgdGhlIGN1cnJlbnQgaXAsIGV0Yy4KKyAgCisgICBOb3QgKHlldD8pIGltcGxlbWVudGVkIGZvciBpOTYwLiAgKi8KKworI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FCVwKK2Vycm9yKCJGdW5jdGlvbiBjYWxscyBpbnRvIHRoZSBpbmZlcmlvciBwcm9jZXNzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoZSBpOTYwIikKKworLyogRGlzY2FyZCBmcm9tIHRoZSBzdGFjayB0aGUgaW5uZXJtb3N0IGZyYW1lLCByZXN0b3JpbmcgYWxsIHJlZ2lzdGVycy4gICovCisKKyNkZWZpbmUgUE9QX0ZSQU1FIFwKKwlwb3BfZnJhbWUgKCkKKworCisvKiBUaGlzIHNlcXVlbmNlIG9mIHdvcmRzIGlzIHRoZSBpbnN0cnVjdGlvbnMKKyAgCisgIAljYWxseCAweDAwMDAwMDAwCisgIAlmbWFyaworICovCisKKy8qICNkZWZpbmUgQ0FMTF9EVU1NWSB7IDB4ODYwMDMwMDAsIDB4MDAwMDAwMDAsIDB4NjYwMDNlMDAgfSAqLworCisvKiAjZGVmaW5lIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUIDAgKi8vKiBTdGFydCBleGVjdXRpb24gYXQgYmVnaW5uaW5nIG9mIGR1bW15ICovCisKKy8qIEluZGljYXRlIHRoYXQgd2UgZG9uJ3Qgc3VwcG9ydCBjYWxsaW5nIGluZmVyaW9yIGNoaWxkIGZ1bmN0aW9ucy4gICovCisKKyN1bmRlZiBDQUxMX0RVTU1ZCisKKy8qIEluc2VydCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBhcmdzIGFuZCBmdW5jdGlvbiBhZGRyZXNzCisgICBpbnRvIGEgY2FsbCBzZXF1ZW5jZSBvZiB0aGUgYWJvdmUgZm9ybSBzdG9yZWQgYXQgJ2R1bW15bmFtZScuCisgIAorICAgSWdub3JlIGFyZyBjb3VudCBvbiBpOTYwLiAgKi8KKworLyogI2RlZmluZSBGSVhfQ0FMTF9EVU1NWShkdW1teW5hbWUsIGZ1biwgbmFyZ3MpICooKChpbnQgKilkdW1teW5hbWUpKzEpID0gZnVuICovCisKKyN1bmRlZiBGSVhfQ0FMTF9EVU1NWQorCisKKy8qIEludGVyZmFjZSBkZWZpbml0aW9ucyBmb3Iga2VybmVsIGRlYnVnZ2VyIEtEQiAqLworLyogKE5vdCByZWxldmFudCB0byBpOTYwLikgKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvaTk2MC90bS1tb245NjAuaCBiL2dkYi9jb25maWcvaTk2MC90bS1tb245NjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDQxZTA1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9pOTYwL3RtLW1vbjk2MC5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIEludGVsIDk2MCBydW5uaW5nIE1PTjk2MCBtb25pdG9yLCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IChDKSAxOTkwLTE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBJbnRlbCBDb3Jwb3JhdGlvbiBhbmQgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZWZpbml0aW9ucyB0byB0YXJnZXQgR0RCIHRvIGFuIGk5NjAgZGVidWdnZWQgb3ZlciBhIHNlcmlhbCBsaW5lLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImk5NjAvdG0taTk2MC5oIgorCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworI2lmZGVmIF9fU1REQ19fCitzdHJ1Y3QgZnJhbWVfaW5mbzsKKyNlbmRpZgorCisvKiByZWRlZmluZWQgZnJvbSB0bS1pOTYwLmggKi8KKy8qIE51bWJlciBvZiBtYWNoaW5lIHJlZ2lzdGVycyAqLworI3VuZGVmIE5VTV9SRUdTIAorI2RlZmluZSBOVU1fUkVHUyA0MAorCisvKiBJbml0aWFsaXplciBmb3IgYW4gYXJyYXkgb2YgbmFtZXMgb2YgcmVnaXN0ZXJzLgorICAgVGhlcmUgc2hvdWxkIGJlIE5VTV9SRUdTIHN0cmluZ3MgaW4gdGhpcyBpbml0aWFsaXplci4gICovCisjdW5kZWYgUkVHSVNURVJfTkFNRVMgCisjZGVmaW5lIFJFR0lTVEVSX05BTUVTIHsgXAorCS8qICAwICovICJwZnAiLCAic3AiLCAgInJpcCIsICJyMyIsICAicjQiLCAgInI1IiwgICJyNiIsICAicjciLCBcCisJLyogIDggKi8gInI4IiwgICJyOSIsICAicjEwIiwgInIxMSIsICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUiLFwKKwkvKiAxNiAqLyAiZzAiLCAgImcxIiwgICJnMiIsICAiZzMiLCAgImc0IiwgICJnNSIsICAiZzYiLCAgImc3IiwgXAorCS8qIDI0ICovICJnOCIsICAiZzkiLCAgImcxMCIsICJnMTEiLCAiZzEyIiwgImcxMyIsICJnMTQiLCAiZnAiLCBcCisJLyogMzIgKi8gInBjIiwgICJhYyIsICAidGMiLCAgImlwIiwgICJmcDAiLCAiZnAxIiwgImZwMiIsICJmcDMiLFwKK30KKworLyogT3ZlcnJpZGUgdGhlIHN0YW5kYXJkIGdkYiBwcm9tcHQgd2hlbiBjb21waWxlZCBmb3IgdGhpcyB0YXJnZXQuICAqLworCisjZGVmaW5lCURFRkFVTFRfUFJPTVBUCSIoZ2RiOTYwKSAiCisKKy8qIEZSQU1FX0NIQUlOX1ZBTElEIHJldHVybnMgemVybyBpZiB0aGUgZ2l2ZW4gZnJhbWUgaXMgdGhlIG91dGVybW9zdCBvbmUKKyAgIGFuZCBoYXMgbm8gY2FsbGVyLgorCisgICBPbiB0aGUgaTk2MCwgZWFjaCB2YXJpb3VzIHRhcmdldCBzeXN0ZW0gdHlwZSBkZWZpbmVzIEZSQU1FX0NIQUlOX1ZBTElELAorICAgc2luY2UgaXQgZGlmZmVycyBiZXR3ZWVuIE5pbmR5LCBNb245NjAgYW5kIFZ4V29ya3MsIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkCisgICB0YXJnZXQgdHlwZXMuICAqLworCitleHRlcm4gaW50IG1vbjk2MF9mcmFtZV9jaGFpbl92YWxpZCBQQVJBTVMgKChDT1JFX0FERFIsIHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKyNkZWZpbmUJRlJBTUVfQ0hBSU5fVkFMSUQoY2hhaW4sIHRoaXNmcmFtZSkgbW9uOTYwX2ZyYW1lX2NoYWluX3ZhbGlkIChjaGFpbiwgdGhpc2ZyYW1lKQorCisvKiBTZXF1ZW5jZSBvZiBieXRlcyBmb3IgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiAqLworCisjZGVmaW5lIEJSRUFLUE9JTlQgezB4MDAsIDB4M2UsIDB4MDAsIDB4NjZ9CisKKy8qIEFtb3VudCBpcCBtdXN0IGJlIGRlY3JlbWVudGVkIGJ5IGFmdGVyIGEgYnJlYWtwb2ludC4KKyAqIFRoaXMgaXMgb2Z0ZW4gdGhlIG51bWJlciBvZiBieXRlcyBpbiBCUkVBS1BPSU5UIGJ1dCBub3QgYWx3YXlzLgorICovCisKKyNkZWZpbmUgREVDUl9QQ19BRlRFUl9CUkVBSyA0CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2k5NjAvdG0tbmluZHk5NjAuaCBiL2dkYi9jb25maWcvaTk2MC90bS1uaW5keTk2MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYzQ2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2k5NjAvdG0tbmluZHk5NjAuaApAQCAtMCwwICsxLDEwNiBAQAorLyogUGFyYW1ldGVycyBmb3IgSW50ZWwgOTYwIHJ1bm5pbmcgTklORFkgbW9uaXRvciwgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAoQykgMTk5MC0xOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgSW50ZWwgQ29ycG9yYXRpb24gYW5kIEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVmaW5pdGlvbnMgdG8gdGFyZ2V0IEdEQiB0byBhbiBpOTYwIGRlYnVnZ2VkIG92ZXIgYSBzZXJpYWwgbGluZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJpOTYwL3RtLWk5NjAuaCIKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KKyNpZmRlZiBfX1NURENfXworc3RydWN0IGZyYW1lX2luZm87CisjZW5kaWYKKworLyogT3ZlcnJpZGUgdGhlIHN0YW5kYXJkIGdkYiBwcm9tcHQgd2hlbiBjb21waWxlZCBmb3IgdGhpcyB0YXJnZXQuICAqLworCisjZGVmaW5lCURFRkFVTFRfUFJPTVBUCSIoZ2RiOTYwKSAiCisKKy8qIEFkZGl0aW9uYWwgY29tbWFuZCBsaW5lIG9wdGlvbnMgYWNjZXB0ZWQgYnkgbmluZHkgZ2RiJ3MsIGZvciBoYW5kbGluZworICAgdGhlIHJlbW90ZS1uaW5keS5jIGludGVyZmFjZS4gIFRoZXNlIHNob3VsZCByZWFsbHkgYmUgdGFyZ2V0LXNwZWNpZmljCisgICByYXRoZXIgdGhhbiBhcmNoaXRlY3R1cmUtc3BlY2lmaWMuICAqLworCitleHRlcm4gaW50IG5pbmR5X29sZF9wcm90b2NvbDsJLyogbm9uemVybyBpZiBvbGQgTklORFkgc2VyaWFsIHByb3RvY29sICovCitleHRlcm4gaW50IG5pbmR5X2luaXRpYWxfYnJrOwkvKiBTZW5kIGEgQlJFQUsgdG8gcmVzZXQgYm9hcmQgZmlyc3QgKi8KK2V4dGVybiBjaGFyICpuaW5keV90dHluYW1lOwkvKiBOYW1lIG9mIHNlcmlhbCBwb3J0IHRvIHRhbGsgdG8gbmluZHkgKi8KKworI2RlZmluZQlBRERJVElPTkFMX09QVElPTlMgXAorCXsiTyIsIG5vX2FyZ3VtZW50LCAmbmluZHlfb2xkX3Byb3RvY29sLCAxfSwJXAorCXsiYnJrIiwgbm9fYXJndW1lbnQsICZuaW5keV9pbml0aWFsX2JyaywgMX0sCVwKKwl7InNlciIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAxMDA0fSwgIC8qIDEwMDQgaXMgbWFnaWMgY29va2llIGZvciBBRERMX0NBU0VTICovCisKKyNkZWZpbmUJQURESVRJT05BTF9PUFRJT05fQ0FTRVMJXAorCWNhc2UgMTAwNDoJLyogLXNlciBvcHRpb246ICByZW1vdGUgbmluZHkgYXV0by1zdGFydCAqLwlcCisJICBuaW5keV90dHluYW1lID0gb3B0YXJnOwlcCisJICBicmVhazsKKworI2RlZmluZQlBRERJVElPTkFMX09QVElPTl9IRUxQIFwKKwkiXAorICAtTyAgICAgICAgICAgICAgICBVc2Ugb2xkIHByb3RvY29sIHRvIHRhbGsgdG8gYSBOaW5keSB0YXJnZXRcblwKKyAgLWJyayAgICAgICAgICAgICAgU2VuZCBhIGJyZWFrIHRvIGEgTmluZHkgdGFyZ2V0IHRvIHJlc2V0IGl0LlxuXAorICAtc2VyIFNFUklBTCAgICAgICBPcGVuIHJlbW90ZSBOaW5keSBzZXNzaW9uIHRvIFNFUklBTCBwb3J0LlxuXAorIgorCisvKiBJZiBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgb3BlbiB0dHkgZm9yIHRhbGtpbmcgdG8gbmluZHksCisgICBhbmQgZG93bmxvYWQgdGhlIGV4ZWN1dGFibGUgZmlsZSBpZiBvbmUgd2FzIHNwZWNpZmllZC4gICovCisKKyNkZWZpbmUJQURESVRJT05BTF9PUFRJT05fSEFORExFUglcCisJaWYgKCFTRVRfVE9QX0xFVkVMICgpICYmIG5pbmR5X3R0eW5hbWUpIHsJCVwKKwkgIG5pbmR5X29wZW4gKG5pbmR5X3R0eW5hbWUsICFiYXRjaCk7CQkJXAorCSAgaWYgKCFTRVRfVE9QX0xFVkVMICgpICYmIGV4ZWNhcmcpIHsJCQlcCisJCXRhcmdldF9sb2FkIChleGVjYXJnLCAhYmF0Y2gpOwkJCVwKKwkgIH0JCQkJCQkJXAorCX0KKworLyogSWYgY29uZmlndXJlZCBmb3IgaTk2MCB0YXJnZXQsIHdlIHRha2UgY29udHJvbCBiZWZvcmUgbWFpbiBsb29wCisgICBhbmQgZGVtYW5kIHRoYXQgd2UgY29uZmlndXJlIGZvciBhIG5pbmR5IHRhcmdldC4gICovCisKKyNkZWZpbmUJQkVGT1JFX01BSU5fTE9PUF9IT09LCVwKKyAgbmluZHlfYmVmb3JlX21haW5fbG9vcCgpOworCitleHRlcm4gdm9pZAorbmluZHlfYmVmb3JlX21haW5fbG9vcCgpOwkJLyogSW4gcmVtb3RlLW5pbmR5LmMgKi8KKworLyogRlJBTUVfQ0hBSU5fVkFMSUQgcmV0dXJucyB6ZXJvIGlmIHRoZSBnaXZlbiBmcmFtZSBpcyB0aGUgb3V0ZXJtb3N0IG9uZQorICAgYW5kIGhhcyBubyBjYWxsZXIuCisKKyAgIE9uIHRoZSBpOTYwLCBlYWNoIHZhcmlvdXMgdGFyZ2V0IHN5c3RlbSB0eXBlIGRlZmluZXMgRlJBTUVfQ0hBSU5fVkFMSUQsCisgICBzaW5jZSBpdCBkaWZmZXJzIGJldHdlZW4gTklORFkgYW5kIFZ4V29ya3MsIHRoZSB0d28gY3VycmVudGx5IHN1cHBvcnRlZAorICAgdGFyZ2V0cyB0eXBlcy4gICovCisKK2V4dGVybiBpbnQgbmluZHlfZnJhbWVfY2hhaW5fdmFsaWQgUEFSQU1TICgoQ09SRV9BRERSLCBzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisjZGVmaW5lCUZSQU1FX0NIQUlOX1ZBTElEKGNoYWluLCB0aGlzZnJhbWUpIG5pbmR5X2ZyYW1lX2NoYWluX3ZhbGlkIChjaGFpbiwgdGhpc2ZyYW1lKQorCitleHRlcm4gaW50CituaW5keV9mcmFtZV9jaGFpbl92YWxpZCgpOwkJLyogU2VlIG5pbmR5LXRkZXAuYyAqLworCisvKiBTZXF1ZW5jZSBvZiBieXRlcyBmb3IgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiAqLworCisjZGVmaW5lIEJSRUFLUE9JTlQgezB4MDAsIDB4M2UsIDB4MDAsIDB4NjZ9CisKKy8qIEFtb3VudCBpcCBtdXN0IGJlIGRlY3JlbWVudGVkIGJ5IGFmdGVyIGEgYnJlYWtwb2ludC4KKyAqIFRoaXMgaXMgb2Z0ZW4gdGhlIG51bWJlciBvZiBieXRlcyBpbiBCUkVBS1BPSU5UIGJ1dCBub3QgYWx3YXlzLgorICovCisKKyNkZWZpbmUgREVDUl9QQ19BRlRFUl9CUkVBSyAwCisKKyN1bmRlZiBSRUdJU1RFUl9DT05WRVJUX1RPX1ZJUlRVQUwKKyN1bmRlZiBSRUdJU1RFUl9DT05WRVJUX1RPX1JBVworI3VuZGVmIFJFR0lTVEVSX0NPTlZFUlRJQkxFCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2k5NjAvdG0tdng5NjAuaCBiL2dkYi9jb25maWcvaTk2MC90bS12eDk2MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZTI4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2k5NjAvdG0tdng5NjAuaApAQCAtMCwwICsxLDUzIEBACisvKiBQYXJhbWV0ZXJzIGZvciBWeFdvcmtzIEludGVsIDk2MCdzLCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IChDKSAxOTg2LTE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiaTk2MC90bS1pOTYwLmgiCisKKy8qIFVuZGVyIFZ4V29ya3MgdGhlIElQIGlzbid0IGZpbGxlZCBpbi4gIFNraXAgaXQsIGdvIHdpdGggUklQLCB3aGljaCBoYXMKKyAgIHRoZSByZWFsIHZhbHVlLiAgKi8KKyN1bmRlZiBQQ19SRUdOVU0KKyNkZWZpbmUgUENfUkVHTlVNIFJJUF9SRUdOVU0KKworI2RlZmluZQlHREJJTklUX0ZJTEVOQU1FCSIudnhnZGJpbml0IgorCisjZGVmaW5lCURFRkFVTFRfUFJPTVBUCQkiKHZ4Z2RiKSAiCisKKy8qIFdlIGhhdmUgbW9yZSBjb21wbGV4LCB1c2VmdWwgYnJlYWtwb2ludHMgb24gdGhlIHRhcmdldC4KKyAgIEFtb3VudCBpcCBtdXN0IGJlIGRlY3JlbWVudGVkIGJ5IGFmdGVyIGEgYnJlYWtwb2ludC4gICovCisKKyNkZWZpbmUJREVDUl9QQ19BRlRFUl9CUkVBSwkwCisKKy8qIFdlIGFyZSBndWFyYW50ZWVkIHRvIGhhdmUgYSB6ZXJvIGZyYW1lIHBvaW50ZXIgYXQgYm90dG9tIG9mIHN0YWNrLCB0b28uICovCisKKyNkZWZpbmUgRlJBTUVfQ0hBSU5fVkFMSUQoY2hhaW4sIHRoaXNmcmFtZSkgbm9ubnVsbF9mcmFtZV9jaGFpbl92YWxpZCAoY2hhaW4sIHRoaXNmcmFtZSkKKworLyogQnJlYWtwb2ludCBwYXRjaGluZyBpcyBoYW5kbGVkIGF0IHRoZSB0YXJnZXQgZW5kIGluIFZ4V29ya3MuICAqLworLyogI2RlZmluZSBCUkVBS1BPSU5UIHsweDAwLCAweDNlLCAweDAwLCAweDY2fSAqLworCisvKiBOdW1iZXIgb2YgcmVnaXN0ZXJzIGluIGEgcHRyYWNlX2dldHJlZ3MgY2FsbC4gKi8KKworI2RlZmluZSBWWF9OVU1fUkVHUyAoMTYgKyAxNiArIDMpCisKKy8qIE51bWJlciBvZiByZWdpc3RlcnMgaW4gYSBwdHJhY2VfZ2V0ZnByZWdzIGNhbGwuICovCisKKyAgICAvKiBAQCBDYW4ndCB1c2UgdGhpcyAtLSB0aGUgcmRiIGxpYnJhcnkgZm9yIHRoZSA5NjAgdGFyZ2V0CisgICAgICAgZG9lc24ndCBzdXBwb3J0IHNldHRpbmcgb3IgcmV0cmlldmluZyBGUCByZWdzLiAgS1IgICovCisKKy8qICNkZWZpbmUgVlhfU0laRV9GUFJFR1MgKFJFR0lTVEVSX1JBV19TSVpFIChGUDBfUkVHTlVNKSAqIDQpICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL2k5NjAvdnh3b3Jrczk2MC5tdCBiL2dkYi9jb25maWcvaTk2MC92eHdvcmtzOTYwLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMzI5MzQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL2k5NjAvdnh3b3Jrczk2MC5tdApAQCAtMCwwICsxLDYgQEAKKyMgVGFyZ2V0OiBWeFdvcmtzIHJ1bm5pbmcgb24gYW4gSW50ZWwgOTYwCitUREVQRklMRVM9IGk5NjAtdGRlcC5vIHJlbW90ZS12eC5vIHJlbW90ZS12eDk2MC5vIHhkcl9sZC5vIHhkcl9wdHJhY2UubyB4ZHJfcmRiLm8KK1RNX0ZJTEU9IHRtLXZ4OTYwLmgKKworIyBEZWZpbmUgdGhpcyBmb3IgdGhlIHZ4LXNoYXJlIHJvdXRpbmVzLCB3aGljaCBkb24ndCBzZWUgcGFyYW0uaC4KK01UX0NGTEFHUz0gLURJODA5NjAKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTMyci9tMzJyLm10IGIvZ2RiL2NvbmZpZy9tMzJyL20zMnIubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5NTcwNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTMyci9tMzJyLm10CkBAIC0wLDAgKzEsNyBAQAorIyBUYXJnZXQ6IE1pdHN1YmlzaGkgbTMyciBwcm9jZXNzb3IKK1RERVBGSUxFUz0gbTMyci10ZGVwLm8gbW9uaXRvci5vIG0zMnItcm9tLm8gZHNyZWMubworVE1fRklMRT0gdG0tbTMyci5oCitTSU1fT0JTID0gcmVtb3RlLXNpbS5vCitTSU0gPSAuLi9zaW0vbTMyci9saWJzaW0uYQorR0RCU0VSVkVSX0RFUEZJTEVTPSBsb3ctc2ltLm8KK0dEQlNFUlZFUl9MSUJTID0gLi4vLi4vc2ltL20zMnIvbGlic2ltLmEgLi4vLi4vYmZkL2xpYmJmZC5hIC4uLy4uL2xpYmliZXJ0eS9saWJpYmVydHkuYSAuLi8uLi9vcGNvZGVzL2xpYm9wY29kZXMuYQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tMzJyL3RtLW0zMnIuaCBiL2dkYi9jb25maWcvbTMyci90bS1tMzJyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3M2I0ZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTMyci90bS1tMzJyLmgKQEAgLTAsMCArMSwyMzQgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIGV4ZWN1dGlvbiBvbiBhIE1pdHN1YmlzaGkgbTMyciBwcm9jZXNzb3IuCisgICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVXNlZCBieSBtc3dpbi4gICovCisjZGVmaW5lIFRBUkdFVF9NMzJSIDEKKworLyogbXZzX2NoZWNrIFRBUkdFVF9CWVRFX09SREVSIEJJR19FTkRJQU4gKi8KKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVIgQklHX0VORElBTgorCisvKiBtdnNfY2hlY2sgUkVHSVNURVJfTkFNRVMgKi8KKyNkZWZpbmUgUkVHSVNURVJfTkFNRVMgXAoreyAicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLCBcCisgICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJmcCIsICJsciIsICJzcCIsIFwKKyAgInBzdyIsICJjYnIiLCAic3BpIiwgInNwdSIsICJicGMiLCAicGMiLCAiYWNjbCIsICJhY2NoIiwgXAorICAgIC8qICAiY29uZCIsICJzbSIsICJic20iLCAiaWUiLCAiYmllIiwgImJjYXJyeSIsICAqLyBcCit9CisvKiBtdnNfY2hlY2sgIE5VTV9SRUdTICovCisjZGVmaW5lIE5VTV9SRUdTIAkJCTI0CisKKy8qIG12c19jaGVjayAgUkVHSVNURVJfU0laRSAqLworI2RlZmluZSBSRUdJU1RFUl9TSVpFIAkJCTQKKy8qIG12c19jaGVjayAgTUFYX1JFR0lTVEVSX1JBV19TSVpFICovCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9SQVdfU0laRQkJNAorCisvKiBtdnNfY2hlY2sgICpfUkVHTlVNICovCisjZGVmaW5lIFIwX1JFR05VTQkwCisjZGVmaW5lIFNUUlVDVF9SRVRVUk5fUkVHTlVNIDAKKyNkZWZpbmUgQVJHMF9SRUdOVU0JMAorI2RlZmluZSBBUkdMQVNUX1JFR05VTQkzCisjZGVmaW5lIFYwX1JFR05VTQkwCisjZGVmaW5lIFYxX1JFR05VTQkxCisjZGVmaW5lIEZQX1JFR05VTQkxMworI2RlZmluZSBSUF9SRUdOVU0JMTQKKyNkZWZpbmUgU1BfUkVHTlVNCTE1CisjZGVmaW5lIFBTV19SRUdOVU0JMTYKKyNkZWZpbmUgQ0JSX1JFR05VTQkxNworI2RlZmluZSBTUElfUkVHTlVNCTE4CisjZGVmaW5lIFNQVV9SRUdOVU0JMTkKKyNkZWZpbmUgQlBDX1JFR05VTQkyMAorI2RlZmluZSBQQ19SRUdOVU0JMjEKKyNkZWZpbmUgQUNDTF9SRUdOVU0JMjIKKyNkZWZpbmUgQUNDSF9SRUdOVU0JMjMKKworLyogbXZzX2NoZWNrICBSRUdJU1RFUl9CWVRFUyAqLworI2RlZmluZSBSRUdJU1RFUl9CWVRFUwkJCShOVU1fUkVHUyAqIDQpCisKKy8qIG12c19jaGVjayAgUkVHSVNURVJfVklSVFVBTF9UWVBFICovCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRShSRUcpCWJ1aWx0aW5fdHlwZV9pbnQKKworLyogbXZzX2NoZWNrICBSRUdJU1RFUl9CWVRFICovCisjZGVmaW5lIFJFR0lTVEVSX0JZVEUoUkVHKSAJCSgoUkVHKSAqIDQpCisvKiBtdnNfY2hlY2sgIFJFR0lTVEVSX1ZJUlRVQUxfU0laRSAqLworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUoUkVHKSAJNAorLyogbXZzX2NoZWNrICBSRUdJU1RFUl9SQVdfU0laRSAqLworI2RlZmluZSBSRUdJU1RFUl9SQVdfU0laRShSRUcpICAgICAJNAorCisvKiBtdnNfY2hlY2sgIE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUgKi8KKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1ZJUlRVQUxfU0laRSAJNAorCisvKiBtdnNfY2hlY2sgIEJSRUFLUE9JTlQgKi8KKyNkZWZpbmUgQlJFQUtQT0lOVCB7MHgxMCwgMHhmMX0KKworLyogbXZzX25vX2NoZWNrICBGVU5DVElPTl9TVEFSVF9PRkZTRVQgKi8KKyNkZWZpbmUgRlVOQ1RJT05fU1RBUlRfT0ZGU0VUIDAKKworLyogbXZzX2NoZWNrICBERUNSX1BDX0FGVEVSX0JSRUFLICovCisjZGVmaW5lIERFQ1JfUENfQUZURVJfQlJFQUsgMAorCisvKiBtdnNfY2hlY2sgIElOTkVSX1RIQU4gKi8KKyNkZWZpbmUgSU5ORVJfVEhBTihsaHMscmhzKSAoKGxocykgPCAocmhzKSkKKworLyogbXZzX2NoZWNrICBTQVZFRF9QQ19BRlRFUl9DQUxMICovCisjZGVmaW5lIFNBVkVEX1BDX0FGVEVSX0NBTEwoZmkpIHJlYWRfcmVnaXN0ZXIgKFJQX1JFR05VTSkKKworI2lmZGVmIF9fU1REQ19fCitzdHJ1Y3QgZnJhbWVfaW5mbzsKK3N0cnVjdCBmcmFtZV9zYXZlZF9yZWdzOworc3RydWN0IHR5cGU7CitzdHJ1Y3QgdmFsdWU7CisjZW5kaWYKKworLyogRGVmaW5lIG90aGVyIGFzcGVjdHMgb2YgdGhlIHN0YWNrIGZyYW1lLiAKKyAgIFdlIGtlZXAgdGhlIG9mZnNldHMgb2YgYWxsIHNhdmVkIHJlZ2lzdGVycywgJ2NhdXNlIHdlIG5lZWQgJ2VtIGEgbG90IQorICAgV2UgYWxzbyBrZWVwIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIHN0YWNrIGZyYW1lLCBhbmQgd2hldGhlciAKKyAgIHRoZSBmcmFtZSBwb2ludGVyIGlzIHZhbGlkIChmb3IgZnJhbWVsZXNzIGZ1bmN0aW9ucywgYW5kIHdoZW4gd2UncmUKKyAgIHN0aWxsIGluIHRoZSBwcm9sb2d1ZSBvZiBhIGZ1bmN0aW9uIHdpdGggYSBmcmFtZSkgKi8KKworLyogbXZzX2NoZWNrICBFWFRSQV9GUkFNRV9JTkZPICovCisjZGVmaW5lIEVYVFJBX0ZSQU1FX0lORk8gIAlcCisgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzIGZzcjsJXAorICBpbnQgZnJhbWVzaXplOwkJXAorICBpbnQgdXNpbmdfZnJhbWVfcG9pbnRlcjsKKworCitleHRlcm4gdm9pZCBtMzJyX2luaXRfZXh0cmFfZnJhbWVfaW5mbyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqZmkpKTsKKy8qIG12c19jaGVjayAgSU5JVF9FWFRSQV9GUkFNRV9JTkZPICovCisjZGVmaW5lIElOSVRfRVhUUkFfRlJBTUVfSU5GTyhmcm9tbGVhZiwgZmkpIG0zMnJfaW5pdF9leHRyYV9mcmFtZV9pbmZvIChmaSkKKy8qIG12c19ub19jaGVjayAgSU5JVF9GUkFNRV9QQyAqLworI2RlZmluZSBJTklUX0ZSQU1FX1BDCQkvKiBOb3QgbmVjZXNzYXJ5ICovCisKK2V4dGVybiB2b2lkIAorbTMycl9mcmFtZV9maW5kX3NhdmVkX3JlZ3MgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKmZpLCAKKwkJCQkgICAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKnJlZ2FkZHIpKTsKKworLyogUHV0IGhlcmUgdGhlIGNvZGUgdG8gc3RvcmUsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywKKyAgIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4KKyAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbAorICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDoKKyAgIHRoZSBhZGRyZXNzIHdlIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4gICovCisKKy8qIG12c19jaGVjayAgRlJBTUVfRklORF9TQVZFRF9SRUdTICovCisjZGVmaW5lIEZSQU1FX0ZJTkRfU0FWRURfUkVHUyhmcmFtZV9pbmZvLCBmcmFtZV9zYXZlZF9yZWdzKQkgICAgXAorICAgbTMycl9mcmFtZV9maW5kX3NhdmVkX3JlZ3MoZnJhbWVfaW5mbywgJihmcmFtZV9zYXZlZF9yZWdzKSkKKworZXh0ZXJuIENPUkVfQUREUiBtMzJyX2ZyYW1lX2NoYWluIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICpmaSkpOworLyogbXZzX2NoZWNrICBGUkFNRV9DSEFJTiAqLworI2RlZmluZSBGUkFNRV9DSEFJTihmaSkgCQltMzJyX2ZyYW1lX2NoYWluIChmaSkKKworI2RlZmluZSBGUkFNRV9DSEFJTl9WQUxJRChmcCwgZnJhbWUpCWdlbmVyaWNfZnJhbWVfY2hhaW5fdmFsaWQgKGZwLCBmcmFtZSkKKworZXh0ZXJuIENPUkVfQUREUiBtMzJyX2ZpbmRfY2FsbGVyc19yZWcgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKmZpLCAKKwkJCQkJCWludCByZWdudW0pKTsKK2V4dGVybiBDT1JFX0FERFIgbTMycl9mcmFtZV9zYXZlZF9wYyBQQVJBTVMoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKy8qIG12c19jaGVjayAgRlJBTUVfU0FWRURfUEMgKi8KKyNkZWZpbmUgRlJBTUVfU0FWRURfUEMoZmkpCQltMzJyX2ZyYW1lX3NhdmVkX3BjIChmaSkKKworLyogbXZzX2NoZWNrICBFWFRSQUNUX1JFVFVSTl9WQUxVRSAqLworI2RlZmluZSBFWFRSQUNUX1JFVFVSTl9WQUxVRShUWVBFLCBSRUdCVUYsIFZBTEJVRikgXAorICBtZW1jcHkgKChWQUxCVUYpLCBcCisJICAoY2hhciAqKShSRUdCVUYpICsgUkVHSVNURVJfQllURSAoVjBfUkVHTlVNKSArIFwKKwkgICgoVFlQRV9MRU5HVEggKFRZUEUpID4gNCA/IDggOiA0KSAtIFRZUEVfTEVOR1RIIChUWVBFKSksIFwKKwkgIFRZUEVfTEVOR1RIIChUWVBFKSkKKworLyogbXZzX2NoZWNrICBTVE9SRV9SRVRVUk5fVkFMVUUgKi8KKyNkZWZpbmUgU1RPUkVfUkVUVVJOX1ZBTFVFKFRZUEUsIFZBTEJVRikgXAorICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyhSRUdJU1RFUl9CWVRFIChWMF9SRUdOVU0pICsgXAorCQkgICAgICAgKChUWVBFX0xFTkdUSCAoVFlQRSkgPiA0ID8gODo0KSAtIFRZUEVfTEVOR1RIIChUWVBFKSksXAorCQkgICAgICAgKFZBTEJVRiksIFRZUEVfTEVOR1RIIChUWVBFKSk7CisKK2V4dGVybiBDT1JFX0FERFIgbTMycl9za2lwX3Byb2xvZ3VlIFBBUkFNUyAoKENPUkVfQUREUiBwYykpOworLyogbXZzX2NoZWNrICBTS0lQX1BST0xPR1VFICovCisjZGVmaW5lIFNLSVBfUFJPTE9HVUUocGMpIHBjID0gbTMycl9za2lwX3Byb2xvZ3VlIChwYykKKworLyogbXZzX25vX2NoZWNrICBGUkFNRV9BUkdTX1NLSVAgKi8KKyNkZWZpbmUgRlJBTUVfQVJHU19TS0lQIDAKKworLyogbXZzX25vX2NoZWNrICBGUkFNRV9BUkdTX0FERFJFU1MgKi8KKyNkZWZpbmUgRlJBTUVfQVJHU19BRERSRVNTKGZpKSAoKGZpKS0+ZnJhbWUpCisvKiBtdnNfbm9fY2hlY2sgIEZSQU1FX0xPQ0FMU19BRERSRVNTICovCisjZGVmaW5lIEZSQU1FX0xPQ0FMU19BRERSRVNTKGZpKSAoKGZpKS0+ZnJhbWUpCisvKiBtdnNfbm9fY2hlY2sgIEZSQU1FX05VTV9BUkdTICovCisjZGVmaW5lIEZSQU1FX05VTV9BUkdTKHZhbCwgZmkpICgodmFsKSA9IC0xKQorCisjZGVmaW5lIENPRVJDRV9GTE9BVF9UT19ET1VCTEUgMQorCisjZGVmaW5lIFRBUkdFVF9XUklURV9TUCBtMzJyX3dyaXRlX3NwCisKKworCisKKworCisvKiBzdHJ1Y3QgcGFzc2luZyBhbmQgcmV0dXJuaW5nIHN0dWZmICovCisjZGVmaW5lIFNUT1JFX1NUUlVDVF9SRVRVUk4oU1RSVUNUX0FERFIsIFNQKQlcCisJd3JpdGVfcmVnaXN0ZXIgKDAsIFNUUlVDVF9BRERSKQorCitleHRlcm4gdXNlX3N0cnVjdF9jb252ZW50aW9uX2ZuIG0zMnJfdXNlX3N0cnVjdF9jb252ZW50aW9uOworI2RlZmluZSBVU0VfU1RSVUNUX0NPTlZFTlRJT04oR0NDX1AsIFRZUEUpIG0zMnJfdXNlX3N0cnVjdF9jb252ZW50aW9uIChHQ0NfUCwgVFlQRSkKKworI2RlZmluZSBFWFRSQUNUX1NUUlVDVF9WQUxVRV9BRERSRVNTKFJFR0JVRikgXAorICBleHRyYWN0X2FkZHJlc3MgKFJFR0JVRiArIFJFR0lTVEVSX0JZVEUgKFYwX1JFR05VTSksIFwKKwkJICAgUkVHSVNURVJfUkFXX1NJWkUgKFYwX1JFR05VTSkpCisKKyNkZWZpbmUgUkVHX1NUUlVDVF9IQVNfQUREUihnY2NfcCx0eXBlKSAgICAgKFRZUEVfTEVOR1RIICh0eXBlKSA+IDgpCisKKworLyogZ2VuZXJpYyBkdW1teSBmcmFtZSBzdHVmZiAqLworCisjZGVmaW5lIFBVU0hfRFVNTVlfRlJBTUUgICAgICAgICAgICAgZ2VuZXJpY19wdXNoX2R1bW15X2ZyYW1lICgpCisjZGVmaW5lIFBDX0lOX0NBTExfRFVNTVkoUEMsIFNQLCBGUCkgZ2VuZXJpY19wY19pbl9jYWxsX2R1bW15IChQQywgU1ApCisKKworLyogdGFyZ2V0LXNwZWNpZmljIGR1bW15X2ZyYW1lIHN0dWZmICovCisKK2V4dGVybiBzdHJ1Y3QgZnJhbWVfaW5mbyAqbTMycl9wb3BfZnJhbWUgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lKSk7CisvKiBtdnNfY2hlY2sgIFBPUF9GUkFNRSAqLworI2RlZmluZSBQT1BfRlJBTUUgbTMycl9wb3BfZnJhbWUgKGdldF9jdXJyZW50X2ZyYW1lICgpKQorCisvKiBtdnNfbm9fY2hlY2sgIFNUQUNLX0FMSUdOICovCisvKiAjZGVmaW5lIFNUQUNLX0FMSUdOKHgpICgoeCArIDMpICYgfjMpICovCisKK2V4dGVybiBDT1JFX0FERFIgbTMycl9wdXNoX3JldHVybl9hZGRyZXNzIFBBUkFNUyAoKENPUkVfQUREUiwgQ09SRV9BRERSKSk7CitleHRlcm4gQ09SRV9BRERSIG0zMnJfcHVzaF9hcmd1bWVudHMgUEFSQU1TICgoaW50IG5hcmdzLCAKKwkJCQkJICAgICAgc3RydWN0IHZhbHVlICoqYXJncywgCisJCQkJCSAgICAgIENPUkVfQUREUiBzcCwKKwkJCQkJICAgICAgdW5zaWduZWQgY2hhciBzdHJ1Y3RfcmV0dXJuLAorCQkJCQkgICAgICBDT1JFX0FERFIgc3RydWN0X2FkZHIpKTsKKworCisKKy8qIG12c19ub19jaGVjayAgUFVTSF9BUkdVTUVOVFMgKi8KKyNkZWZpbmUgUFVTSF9BUkdVTUVOVFMoTkFSR1MsIEFSR1MsIFNQLCBTVFJVQ1RfUkVUVVJOLCBTVFJVQ1RfQUREUikgXAorICAoU1ApID0gbTMycl9wdXNoX2FyZ3VtZW50cyAoTkFSR1MsIEFSR1MsIFNQLCBTVFJVQ1RfUkVUVVJOLCBTVFJVQ1RfQUREUikKKworI2RlZmluZSBQVVNIX1JFVFVSTl9BRERSRVNTKFBDLCBTUCkgICAgICBtMzJyX3B1c2hfcmV0dXJuX2FkZHJlc3MgKFBDLCBTUCkKKworLyogb3ZlcnJpZGUgdGhlIHN0YW5kYXJkIGdldF9zYXZlZF9yZWdpc3RlciBmdW5jdGlvbiB3aXRoIAorICAgb25lIHRoYXQgdGFrZXMgYWNjb3VudCBvZiBnZW5lcmljIENBTExfRFVNTVkgZnJhbWVzICovCisjZGVmaW5lIEdFVF9TQVZFRF9SRUdJU1RFUgorCisjZGVmaW5lIFVTRV9HRU5FUklDX0RVTU1ZX0ZSQU1FUworI2RlZmluZSBDQUxMX0RVTU1ZICAgICAgICAgICAgICAgICAgIHswfQorI2RlZmluZSBDQUxMX0RVTU1ZX0xFTkdUSCAgICAgICAgICAgICgwKQorI2RlZmluZSBDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCAgICAgICgwKQorI2RlZmluZSBDQUxMX0RVTU1ZX0JSRUFLUE9JTlRfT0ZGU0VUICgwKQorI2RlZmluZSBGSVhfQ0FMTF9EVU1NWShEVU1NWTEsIFNUQVJUQUREUiwgRlVOQUREUiwgTkFSR1MsIEFSR1MsIFRZUEUsIEdDQ1ApCisjZGVmaW5lIENBTExfRFVNTVlfTE9DQVRJT04gICAgICAgICAgQVRfRU5UUllfUE9JTlQKKyNkZWZpbmUgQ0FMTF9EVU1NWV9BRERSRVNTKCkgICAgICAgICBlbnRyeV9wb2ludF9hZGRyZXNzICgpCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvM2IxLm1oIGIvZ2RiL2NvbmZpZy9tNjhrLzNiMS5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTE2Y2NlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrLzNiMS5taApAQCAtMCwwICsxLDEyIEBACisjIEhvc3Q6IEFUJlQgM2IxL1VuaXggcGMKKyMgSSBkb24ndCB0aGluayBjYyBoYXMgYmVlbiB0cmllZC4gIC10cmFkaXRpb25hbCBmb3IgPHN5cy9pb2N0bC5oPgorIyAobm90IHN1cmUgd2hldGhlciBuZWNlc3NhcnkpLgorQ0M9IGdjYyAtdHJhZGl0aW9uYWwKKyMgR0NDIHJ1bnMgb3V0IG9mIHZpcnR1YWwgbWVtb3J5LgorIyBBIHNlcGFyYXRlIENDIGZvciBwaW5zbiByb3V0aW5lcyBpcyBubyBsb25nZXIgc3VwcG9ydGVkLCB0aG91Z2guCisjIEZJWE1FIC0tIHNvbWVvbmUgdW5sdWNreSBlbm91Z2ggdG8gaGF2ZSBhIDNCMSwgbGV0IGJ1Zy1nY2NAcHJlcC5haS5taXQuZWR1CisjIGtub3cgd2hhdCB3b3JrcyBhbmQgd2hhdCBmYWlscyBvbiB0aGUgM0IxLgorI1BJTlNOX0NDPSBjYworCitYREVQRklMRVM9IGluZnB0cmFjZS5vIGluZnRhcmcubyBmb3JrLWNoaWxkLm8gY29yZWxvdy5vIGNvcmUtYW91dC5vCitYTV9GSUxFPSB4bS0zYjEuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrLzNiMS5tdCBiL2dkYi9jb25maWcvbTY4ay8zYjEubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM1ZDlkNAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay8zYjEubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogQVQmVCAzYjEvVW5peCBwYworVERFUEZJTEVTPSBtNjhrLXRkZXAubworVE1fRklMRT0gdG0tM2IxLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay9hbHRvcy5taCBiL2dkYi9jb25maWcvbTY4ay9hbHRvcy5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDczNzUxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL2FsdG9zLm1oCkBAIC0wLDAgKzEsNSBAQAorIyBIb3N0OiBBbHRvcyAzMDY4IChtNjhrLCBTeXN0ZW0gViByZWxlYXNlIDIpCisKK1hNX0ZJTEU9IHhtLWFsdG9zLmgKK1hERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBhbHRvcy14ZGVwLm8KKwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL2FsdG9zLm10IGIvZ2RiL2NvbmZpZy9tNjhrL2FsdG9zLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMWU5NTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvYWx0b3MubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogQWx0b3MgMzA2OCAobTY4aywgU3lzdGVtIFYgcmVsZWFzZSAyKQorVERFUEZJTEVTPSBtNjhrLXRkZXAubworVE1fRklMRT0gdG0tYWx0b3MuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL2Fwb2xsbzY4Yi5taCBiL2dkYi9jb25maWcvbTY4ay9hcG9sbG82OGIubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY1NTQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay9hcG9sbG82OGIubWgKQEAgLTAsMCArMSw2IEBACisjIEhvc3Q6IEFwb2xsbyBtNjhrLCBCU0QgbW9kZS4KKworWE1fRklMRT0geG0tYXBvbGxvNjhiLmgKK1hERVBGSUxFUz0gCitOQVRfRklMRT0gbm0tYXBvbGxvNjhiLmgKK05BVERFUEZJTEVTPSBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gZm9yay1jaGlsZC5vIGE2OHYtbmF0Lm8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay9hcG9sbG82OGIubXQgYi9nZGIvY29uZmlnL202OGsvYXBvbGxvNjhiLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzODNkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvYXBvbGxvNjhiLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IEFwb2xsbyBtNjhrIGluIEJTRCBtb2RlCitUREVQRklMRVM9IG02OGstdGRlcC5vIGRzdHJlYWQubworVE1fRklMRT0gdG0tYXBvbGxvNjhiLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay9hcG9sbG82OHYubWggYi9nZGIvY29uZmlnL202OGsvYXBvbGxvNjh2Lm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMDRmMTEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvYXBvbGxvNjh2Lm1oCkBAIC0wLDAgKzEsMTEgQEAKKyMgSG9zdDogQXBvbGxvLCBTeXN0ZW0gViBtb2RlICg/KQorCitYTV9GSUxFPSB4bS1hcG9sbG82OHYuaAorWE1fQ0xJQlM9IC1sUFcKK1hERVBGSUxFUz0gCisKK05BVF9GSUxFPSBubS1hcG9sbG82OHYuaAorTkFUREVQRklMRVM9IGluZnB0cmFjZS5vIGluZnRhcmcubyBmb3JrLWNoaWxkLm8gYTY4di1uYXQubworCitSQU5MSUI9ZWNobyA+L2Rldi9udWxsCitDQz0gY2MgLUEgYW5zaSAtQSBydW50eXBlLGFueSAtQSBzeXN0eXBlLGFueSAtVV9fU1REQ19fIC1ETk9fU1lTX0ZJTEUKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay9jaXNjby5tdCBiL2dkYi9jb25maWcvbTY4ay9jaXNjby5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzJlOTIxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL2Npc2NvLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IENpc2NvIFJvdXRlciB3aXRoIDY4SyBwcm9jZXNzb3IKK1RERVBGSUxFUz0gbTY4ay10ZGVwLm8gY29yZWxvdy5vIGNvcmUtYW91dC5vCitUTV9GSUxFPSB0bS1jaXNjby5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvZGVsdGE2OC5taCBiL2dkYi9jb25maWcvbTY4ay9kZWx0YTY4Lm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OTJhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvZGVsdGE2OC5taApAQCAtMCwwICsxLDUgQEAKKyMgSG9zdDogTW90b3JvbGEgRGVsdGEgU2VyaWVzIHN5c1Y2OCBSM1Y3LjEKKworWE1fRklMRT0geG0tZGVsdGE2OC5oCitOQVRfRklMRT0gbm0tZGVsdGE2OC5oCitOQVRERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBjb3JlbG93Lm8gY29yZS1hb3V0Lm8gZGVsdGE2OC1uYXQubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL2RlbHRhNjgubXQgYi9nZGIvY29uZmlnL202OGsvZGVsdGE2OC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzYxMzI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL2RlbHRhNjgubXQKQEAgLTAsMCArMSwzIEBACisjIE1vdG9yb2xhIERlbHRhIFNlcmllcyBzeXNWNjggUjNWNy4xCitUREVQRklMRVM9IG02OGstdGRlcC5vCitUTV9GSUxFPSB0bS1kZWx0YTY4LmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay9kcHgyLm1oIGIvZ2RiL2NvbmZpZy9tNjhrL2RweDIubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYyMmVkNTMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvZHB4Mi5taApAQCAtMCwwICsxLDcgQEAKKyMgSG9zdDogQnVsbCBEUFgyICg2OGssIFN5c3RlbSBWIHJlbGVhc2UgMykKKworWE1fRklMRT0geG0tZHB4Mi5oCitYREVQRklMRVM9CisKK05BVF9GSUxFPSBubS1kcHgyLmgKK05BVERFUEZJTEVTPSBpbmZwdHJhY2UubyBjb3JlbG93Lm8gY29yZS1hb3V0Lm8gaW5mdGFyZy5vIGRweDItbmF0Lm8gZm9yay1jaGlsZC5vCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvZHB4Mi5tdCBiL2dkYi9jb25maWcvbTY4ay9kcHgyLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYmJiZTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvZHB4Mi5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBCdWxsIERQWDIgKDY4aywgU3lzdGVtIFYgcmVsZWFzZSAzKQorVERFUEZJTEVTPSBtNjhrLXRkZXAubworVE1fRklMRT0gdG0tZHB4Mi5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvZXMxODAwLm10IGIvZ2RiL2NvbmZpZy9tNjhrL2VzMTgwMC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODA5YzYxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL2VzMTgwMC5tdApAQCAtMCwwICsxLDkgQEAKKyMgVGFyZ2V0OiAgRXJpY3Nzb24gRVMtMTgwMCBlbXVsYXRvciAocmVtb3RlKSBmb3IgbTY4ay4KKworIyByZW1vdGUtZXMubyBzaG91bGQgcGVyaGFwcyBiZSBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBtb25pdG9yLm10CisjIGNvbmZpZ3VyYXRpb24sIGlmIGl0IGlzIGRlc2lyYWJsZSB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQKKyMgY29uZmlndXJhdGlvbnMuICBIb3dldmVyLCBiZWZvcmUgdGhhdCBoYXBwZW5zIHJlbW90ZS1lcy5jIGhhcyB0byBiZQorIyBmaXhlZCB0byBjb21waWxlIG9uIGEgRE9TIGhvc3QuCisKK1RERVBGSUxFUz0gbTY4ay10ZGVwLm8gcmVtb3RlLWVzLm8gCitUTV9GSUxFPSB0bS1lczE4MDAuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL2hwMzAwYnNkLm1oIGIvZ2RiL2NvbmZpZy9tNjhrL2hwMzAwYnNkLm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYTAzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvaHAzMDBic2QubWgKQEAgLTAsMCArMSw3IEBACisjIEhvc3Q6IEhld2xldHQtUGFja2FyZCA5MDAwIHNlcmllcyAzMDAsIHJ1bm5pbmcgQlNECisKK1hNX0ZJTEU9IHhtLWhwMzAwYnNkLmgKK1hERVBGSUxFUz0gCisKK05BVF9GSUxFPSBubS1ocDMwMGJzZC5oCitOQVRERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBjb3JlbG93Lm8gY29yZS1hb3V0Lm8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay9ocDMwMGJzZC5tdCBiL2dkYi9jb25maWcvbTY4ay9ocDMwMGJzZC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmNjNWVkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL2hwMzAwYnNkLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IEhld2xldHQtUGFja2FyZCA5MDAwIHNlcmllcyAzMDAsIHJ1bm5pbmcgQlNECitUREVQRklMRVM9IG02OGstdGRlcC5vCitUTV9GSUxFPSB0bS1ocDMwMGJzZC5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvaHAzMDBocHV4Lm1oIGIvZ2RiL2NvbmZpZy9tNjhrL2hwMzAwaHB1eC5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2ViMTg3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL2hwMzAwaHB1eC5taApAQCAtMCwwICsxLDggQEAKKyMgSG9zdDogSGV3bGV0dC1QYWNrYXJkIDkwMDAgc2VyaWVzIDMwMCwgcnVubmluZyBIUFVYCisjIFRoZSBmb2xsb3dpbmcgaXMgdHJ1ZSBiZWNhdXNlIGdjYyB1c2VzIGEgZGlmZmVyZW50IC5vIGZpbGUgZm9ybWF0CisjIHRoYW4gdGhlIG5hdGl2ZSBIUFVYIGNvbXBpbGVyCisKK1hNX0ZJTEU9IHhtLWhwMzAwaHB1eC5oCisKK05BVF9GSUxFPSBubS1ocDMwMGhwdXguaAorTkFUREVQRklMRVM9IGluZnB0cmFjZS5vIGluZnRhcmcubyBmb3JrLWNoaWxkLm8gaHAzMDB1eC1uYXQubyBjb3JlbG93Lm8gY29yZS1hb3V0Lm8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay9ocDMwMGhwdXgubXQgYi9nZGIvY29uZmlnL202OGsvaHAzMDBocHV4Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYTgwMWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvaHAzMDBocHV4Lm10CkBAIC0wLDAgKzEsOCBAQAorIyBUYXJnZXQ6IEhld2xldHQtUGFja2FyZCA5MDAwIHNlcmllcyAzMDAsIHJ1bm5pbmcgSFBVWAorCisjbXNnIE5vdGUgdGhhdCBHREIgY2FuIG9ubHkgcmVhZCBzeW1ib2xzIGZyb20gcHJvZ3JhbXMgdGhhdCB3ZXJlCisjbXNnIGNvbXBpbGVkIHdpdGggR0NDIHVzaW5nIEdBUy4KKyNtc2cKKworVERFUEZJTEVTPSBtNjhrLXRkZXAubworVE1fRklMRT0gdG0taHAzMDBocHV4LmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay9pc2kubWggYi9nZGIvY29uZmlnL202OGsvaXNpLm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MDZiNGMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvaXNpLm1oCkBAIC0wLDAgKzEsNSBAQAorIyBIb3N0OiBJU0kgT3B0aW11bSBWICgzLjA1KSB1bmRlciA0LjNic2QuCisjIGNvcmVsb3cubyBjb21tZW50ZWQgb3V0IGJlY2F1c2UgY29yZSBkdW1wcyBhcmUgYnJva2VuIG9uIHRoaXMgbWFjaGluZSwKKyMgYXMgb2YgR0RCIDQuOCwgYWNjb3JkaW5nIHRvIGxhbUB0ZnMuY29tCitYREVQRklMRVM9IGluZnB0cmFjZS5vIGluZnRhcmcubyBmb3JrLWNoaWxkLm8gY29yZS1hb3V0Lm8gaXNpLXhkZXAubworWE1fRklMRT0geG0taXNpLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay9pc2kubXQgYi9nZGIvY29uZmlnL202OGsvaXNpLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNGNkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvaXNpLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IElTSSBPcHRpbXVtIFYgKDMuMDUpIHVuZGVyIDQuM2JzZC4KK1RERVBGSUxFUz0KK1RNX0ZJTEU9IHRtLWlzaS5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvbGludXgubWggYi9nZGIvY29uZmlnL202OGsvbGludXgubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4NTBiMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay9saW51eC5taApAQCAtMCwwICsxLDkgQEAKKyMgSG9zdDogTW90b3JvbGEgbTY4ayBydW5uaW5nIExpbnV4CisKK1hNX0ZJTEU9IHhtLWxpbnV4LmgKK1hERVBGSUxFUz0gc2VyLXRjcC5vCisKK05BVF9GSUxFPSBubS1saW51eC5oCitOQVRERVBGSUxFUz0gaW5mcHRyYWNlLm8gc29saWIubyBpbmZ0YXJnLm8gZm9yay1jaGlsZC5vIGNvcmVsb3cubyBjb3JlLWFvdXQubyBjb3JlLXJlZ3NldC5vIG02OGtsaW51eC1uYXQubworCitHREJTRVJWRVJfREVQRklMRVM9IGxvdy1saW51eC5vCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvbGludXgubXQgYi9nZGIvY29uZmlnL202OGsvbGludXgubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMwYTE0OQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay9saW51eC5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBNb3Rvcm9sYSBtNjhrIHdpdGggYS5vdXQgYW5kIEVMRgorVERFUEZJTEVTPSBtNjhrLXRkZXAubworVE1fRklMRT0gdG0tbGludXguaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL202OGtseW54Lm1oIGIvZ2RiL2NvbmZpZy9tNjhrL202OGtseW54Lm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZmRmMjkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvbTY4a2x5bngubWgKQEAgLTAsMCArMSwxMSBAQAorIyBIb3N0OiBNb3Rvcm9sYSA2ODB4MCBydW5uaW5nIEx5bnhPUworCitYTV9GSUxFPSB4bS1tNjhrbHlueC5oCitYTV9DTElCUz0gLWxic2QKK1hERVBGSUxFUz0gc2VyLXRjcC5vCisKK05BVF9GSUxFPSBubS1tNjhrbHlueC5oCitOQVRERVBGSUxFUz0gZm9yay1jaGlsZC5vIGluZnB0cmFjZS5vIGluZnRhcmcubyBjb3JlbG93Lm8gbHlueC1uYXQubworCitHREJTRVJWRVJfTElCUz0gLWxic2QKK0dEQlNFUlZFUl9ERVBGSUxFUz0gbG93LWx5bngubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL202OGtseW54Lm10IGIvZ2RiL2NvbmZpZy9tNjhrL202OGtseW54Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZWFjOTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvbTY4a2x5bngubXQKQEAgLTAsMCArMSw0IEBACisjIFRhcmdldDogTW90b3JvbGEgNjgweDAgcnVubmluZyBMeW54T1MKK1RERVBGSUxFUz0gY29mZi1zb2xpYi5vIG02OGstdGRlcC5vCisjIG02OGtseS10ZGVwLm8KK1RNX0ZJTEU9IHRtLW02OGtseW54LmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay9tNjhrdjQubWggYi9nZGIvY29uZmlnL202OGsvbTY4a3Y0Lm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZGIzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvbTY4a3Y0Lm1oCkBAIC0wLDAgKzEsNyBAQAorIyBIb3N0OiBNb3Rvcm9sYSA2ODB4MCBydW5uaW5nIFNWUjQgKENvbW1vZG9yZSBBbWlnYSBhbWl4IG9yIEF0YXJpIFRUIEFTVikKKworWE1fRklMRT0geG0tbTY4a3Y0LmgKK1hERVBGSUxFUz0KKworTkFUX0ZJTEU9IG5tLXN5c3Y0LmgKK05BVERFUEZJTEVTPSBjb3JlbG93Lm8gY29yZS1yZWdzZXQubyBzb2xpYi5vIHByb2Nmcy5vIGZvcmstY2hpbGQubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL202OGt2NC5tdCBiL2dkYi9jb25maWcvbTY4ay9tNjhrdjQubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhYmIxNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay9tNjhrdjQubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogTW90b3JvbGEgNjgweDAgcnVubmluZyBTVlI0IChDb21tb2RvcmUgQW1pZ2EgYW1peCBvciBBdGFyaSBUVCBBU1YpCitUREVQRklMRVM9IG02OGstdGRlcC5vCitUTV9GSUxFPSB0bS1tNjhrdjQuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL21vbml0b3IubXQgYi9nZGIvY29uZmlnL202OGsvbW9uaXRvci5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmIxYzU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL21vbml0b3IubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogTW90b3JvbGEgbTY4ayBlbWJlZGRlZCAoRVNUIGVtdWxhdG9yLCByb202OGsgYW5kIGJ1ZyBtb25pdG9ycykKK1RERVBGSUxFUz0gbTY4ay10ZGVwLm8gbW9uaXRvci5vIHJlbW90ZS1lc3QubyBjcHUzMmJ1Zy1yb20ubyByb202OGstcm9tLm8gYWJ1Zy1yb20ubyBkYnVnLXJvbS5vIGRzcmVjLm8KK1RNX0ZJTEU9IHRtLW1vbml0b3IuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL25ic2QubWggYi9nZGIvY29uZmlnL202OGsvbmJzZC5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWUzOTQyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL25ic2QubWgKQEAgLTAsMCArMSw1IEBACisjIEhvc3Q6IE1vdG9yb2xhIG02OGsgcnVubmluZyBOZXRCU0QKK1hERVBGSUxFUz0gc2VyLXRjcC5vCitOQVRERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBjb3JlbG93Lm8gbTY4a25ic2QtbmF0Lm8KK1hNX0ZJTEU9IHhtLW5ic2QuaAorTkFUX0ZJTEU9IG5tLW5ic2QuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL25ic2QubXQgYi9nZGIvY29uZmlnL202OGsvbmJzZC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWQyODgyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL25ic2QubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogTW90b3JvbGEgbTY4ayBydW5uaW5nIE5ldEJTRAorVERFUEZJTEVTPSBtNjhrLXRkZXAubyBzb2xpYi5vCitUTV9GSUxFPSB0bS1uYnNkLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay9uZXdzLm1oIGIvZ2RiL2NvbmZpZy9tNjhrL25ld3MubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0YWYxOAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay9uZXdzLm1oCkBAIC0wLDAgKzEsNSBAQAorIyBIb3N0OiBTb255IG5ld3Mgc2VyaWVzIDcwMC84MDAvOTAwICg2ODAyMCkgcnVubmluZyBOZXdzT1MgdmVyc2lvbiAzLgorWERFUEZJTEVTPSBuZXdzLXhkZXAubworWE1fRklMRT0geG0tbmV3cy5oCitOQVRfRklMRT0gbm0tbmV3cy5oCitOQVRERVBGSUxFUz0gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBjb3JlbG93Lm8gY29yZS1hb3V0Lm8gaW5mcHRyYWNlLm8gCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvbmV3cy5tdCBiL2dkYi9jb25maWcvbTY4ay9uZXdzLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZjI0MTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvbmV3cy5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBTb255IG5ld3Mgc2VyaWVzIDcwMC84MDAvOTAwICg2ODAyMCkgcnVubmluZyBOZXdzT1MgdmVyc2lvbiAzLgorVERFUEZJTEVTPSBtNjhrLXRkZXAubworVE1fRklMRT0gdG0tbmV3cy5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvbmV3czEwMDAubWggYi9nZGIvY29uZmlnL202OGsvbmV3czEwMDAubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFiZjBhNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay9uZXdzMTAwMC5taApAQCAtMCwwICsxLDMgQEAKKyMgSG9zdDogU29ueSBuZXdzIHNlcmllcyAxMDAwICg2ODAzMCkgcnVubmluZyBOZXdzT1MgdmVyc2lvbiAzLgorWERFUEZJTEVTPSBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gZm9yay1jaGlsZC5vIGNvcmVsb3cubyBjb3JlLWFvdXQubyBuZXdzLXhkZXAubworWE1fRklMRT0geG0tbmV3czEwMDAuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL25tLWFwb2xsbzY4Yi5oIGIvZ2RiL2NvbmZpZy9tNjhrL25tLWFwb2xsbzY4Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNDhhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvbm0tYXBvbGxvNjhiLmgKQEAgLTAsMCArMSw0MSBAQAorLyogTWFjcm8gZGVmaW50aW9ucyBmb3IgYW4gQXBvbGxvIG02OGsgaW4gQlNEIG1vZGUKKyAgIENvcHlyaWdodCAoQykgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lCUZFVENIX0lORkVSSU9SX1JFR0lTVEVSUworCisvKiBUZWxsIGdkYiB0aGF0IHdlIGNhbiBhdHRhY2ggYW5kIGRldGFjaCBvdGhlciBwcm9jZXNzZXMgKi8KKyNkZWZpbmUgQVRUQUNIX0RFVEFDSAorCisjZGVmaW5lIFVfUkVHU19PRkZTRVQgNgorCisvKiBUaGlzIGlzIHRoZSBhbW91bnQgdG8gc3VidHJhY3QgZnJvbSB1LnVfYXIwCisgICB0byBnZXQgdGhlIG9mZnNldCBpbiB0aGUgY29yZSBmaWxlIG9mIHRoZSByZWdpc3RlciB2YWx1ZXMuICAqLworCisjZGVmaW5lIEtFUk5FTF9VX0FERFIgMAorCisjdW5kZWYgRkxPQVRfSU5GTwkvKiBObyBmbG9hdCBpbmZvIHlldCAqLworCisjZGVmaW5lIFJFR0lTVEVSX1VfQUREUihhZGRyLCBibG9ja2VuZCwgcmVnbm8pIFwKKwkoYWRkcikgPSAoNiArIDQgKiAocmVnbm8pKQorCisvKiBBcG9sbG9zIGRvbid0IHJlYWxseSBoYXZlIGEgVVNFUiBhcmVhLHNvIHRyeWluZyB0byByZWFkIGl0IGZyb20gdGhlCisgKiBwcm9jZXNzIGFkZHJlc3Mgc3BhY2Ugd2lsbCBmYWlsLiBJdCBkb2VzIHN1cHBvcnQgYSByZWFkIGZyb20gYSBmYWtlZAorICogVVNFUiBhcmVhIHVzaW5nIHRoZSAiUEVFS1VTRVIiIHB0cmFjZSBjYWxsLgorICovCisjZGVmaW5lIFBUX1JFQURfVSAzCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvbm0tYXBvbGxvNjh2LmggYi9nZGIvY29uZmlnL202OGsvbm0tYXBvbGxvNjh2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1NmY0YQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay9ubS1hcG9sbG82OHYuaApAQCAtMCwwICsxLDIwIEBACisvKiBNYWNybyBkZWZpbnRpb25zIGZvciBhbiBBcG9sbG8uCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZQlGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay9ubS1kZWx0YTY4LmggYi9nZGIvY29uZmlnL202OGsvbm0tZGVsdGE2OC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiN2ZmYmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvbm0tZGVsdGE2OC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qIE1hY3JvIGRlZmluaXRpb25zIGZvciBhIE1vdG9yb2xhIERlbHRhIFNlcmllcyBzeXNWNjggUjNWNy4xLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2RlZmluZSBLRVJORUxfVV9TSVpFIGtlcm5lbF91X3NpemUoKQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL25tLWRweDIuaCBiL2dkYi9jb25maWcvbTY4ay9ubS1kcHgyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkYTI2OAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay9ubS1kcHgyLmgKQEAgLTAsMCArMSwyOSBAQAorLyogTmF0aXZlIHN1cHBvcnQgZm9yIGEgQnVsbCBEUFgyLgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEtFUk5FTF9VX0FERFIgaXMgZGV0ZXJtaW5lZCB1cG9uIHN0YXJ0dXAgaW4gZHB4Mi14ZGVwLmMuICovCisKKyNkZWZpbmUgUkVHSVNURVJfVV9BRERSKGFkZHIsIGJsb2NrZW5kLCByZWdubykgXAorCShhZGRyKSA9IGRweDJfcmVnaXN0ZXJfdV9hZGRyICgoYmxvY2tlbmQpLChyZWdubykpOworCitleHRlcm4gaW50CitkcHgyX3JlZ2lzdGVyX3VfYWRkciBQQVJBTVMgKChpbnQsIGludCkpOworCisvKiBLZXJuZWwgaXMgYSBiaXQgdGVuYWNpb3VzIGFib3V0IHNoYXJpbmcgdGV4dCBzZWdtZW50cywgZGlzYWxsb3dpbmcgYnB0cy4gICovCisjZGVmaW5lCU9ORV9QUk9DRVNTX1dSSVRFVEVYVApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL25tLWhwMzAwYnNkLmggYi9nZGIvY29uZmlnL202OGsvbm0taHAzMDBic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWFjYmIxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL25tLWhwMzAwYnNkLmgKQEAgLTAsMCArMSw4OCBAQAorLyogUGFyYW1ldGVycyBmb3IgSGV3bGV0dC1QYWNrYXJkIDkwMDAvMzAwIG5hdGl2ZSBzdXBwb3J0IHVuZGVyIGJzZC4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkxLCAxOTkyLCAxOTkzICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBEZXRlY3Qgd2hldGhlciB0aGlzIGlzIDQuMyBvciA0LjQuICAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpZmRlZglCU0Q0XzQKKworLyogQlNEIDQuNCBhbHBoYSBvciBiZXR0ZXIgKi8KKworLyogV2UgY2FuIGF0dGFjaCB0byBwcm9jZXNzZXMgdXNpbmcgcHRyYWNlLiAgKi8KKworI2RlZmluZQlBVFRBQ0hfREVUQUNICisjZGVmaW5lCVBUUkFDRV9BVFRBQ0gJMTAKKyNkZWZpbmUJUFRSQUNFX0RFVEFDSAkxMQorCisvKiBUaGUgdGhpcmQgYXJndW1lbnQgb2YgcHRyYWNlIGlzIGRlY2xhcmVkIGFzIHRoaXMgdHlwZS4gICovCisKKyNkZWZpbmUJUFRSQUNFX0FSRzNfVFlQRQljYWRkcl90CisKKy8qIFVfUkVHU19PRkZTRVQgaXMgdGhlIG9mZnNldCBvZiB0aGUgcmVnaXN0ZXJzIHdpdGhpbiB0aGUgdSBhcmVhIGZvcgorICAgcHRyYWNlIHB1cnBvc2VzLiAgKi8KKyNkZWZpbmUgVV9SRUdTX09GRlNFVCBcCisgIHB0cmFjZSAoUFRfUkVBRF9VLCBpbmZlcmlvcl9waWQsIFwKKwkgIChQVFJBQ0VfQVJHM19UWVBFKSBcCisJICAgKG9mZnNldG9mIChzdHJ1Y3QgdXNlciwgdV9rcHJvYy5rcF9wcm9jLnBfbWQubWRfcmVncykpLCAwKSBcCisgICAgLSBVU1JTVEFDSworCisvKiBObyB1c2VyIHN0cnVjdHVyZSBpbiA0LjQsIHJlZ2lzdGVycyBhcmUgcmVsYXRpdmUgdG8ga2VybmVsIHN0YWNrCisgICB3aGljaCBpcyBmaXhlZC4gICovCisjZGVmaW5lIEtFUk5FTF9VX0FERFIJMHhGRkYwMDAwMAorCisvKiBGSVhNRTogSXMgT05FX1BST0NFU1NfV1JJVEVURVhUIHN0aWxsIHRydWUgbm93IHRoYXQgdGhlIGtlcm5lbCBoYXMKKyAgIGNvcHktb24td3JpdGU/ICBJdCBub3QsIG1vdmUgaXQgdG8gdGhlIDQuMy1zcGVjaWZpYyBzZWN0aW9uIGJlbG93CisgICAobm93IGl0IGlzIGluIHhtLWhwMzAwYnNkLmgpLiAgKi8KKworI2Vsc2UKKworLyogVGhpcyBpcyBCU0QgNC4zIG9yIHNvbWV0aGluZyBsaWtlIGl0LiAgKi8KKworLyogR2V0IGtlcm5lbCB1IGFyZWEgYWRkcmVzcyBhdCBydW4tdGltZSB1c2luZyBCU0Qgc3R5bGUgbmxpc3QgKCkuICAqLworI2RlZmluZSBLRVJORUxfVV9BRERSX0JTRAorCisjZW5kaWYKKworLyogVGhpcyB3YXMgb25jZSBicm9rZW4gZm9yIDQuNCwgYnV0IHByb2JhYmx5IGJlY2F1c2Ugd2UgaGFkIHRoZSB3cm9uZworICAgS0VSTkVMX1VfQUREUi4gICovCisKKy8qIFRoaXMgaXMgYSBwaWVjZSBvZiBtYWdpYyB0aGF0IGlzIGdpdmVuIGEgcmVnaXN0ZXIgbnVtYmVyIFJFR05PCisgICBhbmQgYXMgQkxPQ0tFTkQgdGhlIGFkZHJlc3MgaW4gdGhlIHN5c3RlbSBvZiB0aGUgZW5kIG9mIHRoZSB1c2VyIHN0cnVjdHVyZQorICAgYW5kIHN0b3JlcyBpbiBBRERSIHRoZSBhZGRyZXNzIGluIHRoZSBrZXJuZWwgb3IgY29yZSBkdW1wCisgICBvZiB0aGF0IHJlZ2lzdGVyLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9VX0FERFIoYWRkciwgYmxvY2tlbmQsIHJlZ25vKQkJCQlcCit7CQkJCQkJCQkJXAorICBpZiAocmVnbm8gPCBQU19SRUdOVU0pCQkJCQkJXAorICAgIGFkZHIgPSAoaW50KSAmKChzdHJ1Y3QgZnJhbWUgKikoYmxvY2tlbmQpKS0+Zl9yZWdzW3JlZ25vXTsJCVwKKyAgZWxzZSBpZiAocmVnbm8gPT0gUFNfUkVHTlVNKQkJCQkJCVwKKyAgICBhZGRyID0gKGludCkgJigoc3RydWN0IGZyYW1lICopKGJsb2NrZW5kKSktPmZfc3RhY2thZGo7CQlcCisgIGVsc2UgaWYgKHJlZ25vID09IFBDX1JFR05VTSkJCQkJCQlcCisgICAgYWRkciA9IChpbnQpICYoKHN0cnVjdCBmcmFtZSAqKShibG9ja2VuZCkpLT5mX3BjOwkJCVwKKyAgZWxzZSBpZiAocmVnbm8gPCBGUENfUkVHTlVNKQkJCQkJCVwKKyAgICBhZGRyID0gKGludCkJCQkJCQkJXAorICAgICAgJigoc3RydWN0IHVzZXIgKikwKS0+dV9wY2IucGNiX2ZwcmVncy5mcGZfcmVnc1soKHJlZ25vKS1GUDBfUkVHTlVNKSozXTtcCisgIGVsc2UgaWYgKHJlZ25vID09IEZQQ19SRUdOVU0pCQkJCQkJXAorICAgIGFkZHIgPSAoaW50KSAmKChzdHJ1Y3QgdXNlciAqKTApLT51X3BjYi5wY2JfZnByZWdzLmZwZl9mcGNyOwlcCisgIGVsc2UgaWYgKHJlZ25vID09IEZQU19SRUdOVU0pCQkJCQkJXAorICAgIGFkZHIgPSAoaW50KSAmKChzdHJ1Y3QgdXNlciAqKTApLT51X3BjYi5wY2JfZnByZWdzLmZwZl9mcHNyOwlcCisgIGVsc2UJCQkJCQkJCQlcCisgICAgYWRkciA9IChpbnQpICYoKHN0cnVjdCB1c2VyICopMCktPnVfcGNiLnBjYl9mcHJlZ3MuZnBmX2ZwaWFyOwlcCit9CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvbm0taHAzMDBocHV4LmggYi9nZGIvY29uZmlnL202OGsvbm0taHAzMDBocHV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNlN2IyYgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay9ubS1ocDMwMGhwdXguaApAQCAtMCwwICsxLDUzIEBACisvKiBQYXJhbWV0ZXJzIGZvciBuYXRpdmUgc3VwcG9ydCBvbiBIUCA5MDAwIG1vZGVsIDMyMCwgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBEbyBpbXBsZW1lbnQgdGhlIGF0dGFjaCBhbmQgZGV0YWNoIGNvbW1hbmRzLiAgKi8KKworI2RlZmluZSBBVFRBQ0hfREVUQUNICisKKy8qIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyBpcyBpbiBuYXQtaHAzMDBocHV4LmMuICAqLworI2RlZmluZSBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMKKworLyogR2V0IHJlZ2lzdGVycyBmcm9tIGEgY29yZSBmaWxlLiAgVGhlIGZsb2F0aW5nIHBvaW50IHN0dWZmIGlzIGp1c3QKKyAgIGd1ZXNzZXMuICAqLworI2RlZmluZSBORUVEX1NZU19DT1JFX0gKKyNkZWZpbmUgUkVHSVNURVJfVV9BRERSKGFkZHIsIGJsb2NrZW5kLCByZWdubykJCQkJXAorewkJCQkJCQkJCVwKKyAgaWYgKHJlZ25vIDwgUFNfUkVHTlVNKQkJCQkJCVwKKyAgICBhZGRyID0gKGludCkgKCYoKHN0cnVjdCBwcm9jX3JlZ3MgKikoYmxvY2tlbmQpKS0+ZDAgKyByZWdubyk7CVwKKyAgZWxzZSBpZiAocmVnbm8gPT0gUFNfUkVHTlVNKQkJCQkJCVwKKyAgICBhZGRyID0gKGludCkgKChjaGFyICopICgmKChzdHJ1Y3QgcHJvY19yZWdzICopKGJsb2NrZW5kKSktPnBzKSAtIDIpOyBcCisgIGVsc2UgaWYgKHJlZ25vID09IFBDX1JFR05VTSkJCQkJCQlcCisgICAgYWRkciA9IChpbnQpICYoKHN0cnVjdCBwcm9jX3JlZ3MgKikoYmxvY2tlbmQpKS0+cGM7CQkJXAorICBlbHNlIGlmIChyZWdubyA8IEZQQ19SRUdOVU0pCQkJCQkJXAorICAgIGFkZHIgPSAoaW50KSAoKChzdHJ1Y3QgcHJvY19yZWdzICopKGJsb2NrZW5kKSktPm1jNjg4ODEJCVwKKwkJICArICgocmVnbm8pIC0gRlAwX1JFR05VTSkgLyAyKTsJCQlcCisgIGVsc2UJCQkJCQkJCQlcCisgICAgYWRkciA9IChpbnQpICgoKHN0cnVjdCBwcm9jX3JlZ3MgKikoYmxvY2tlbmQpKS0+cF9mbG9hdAkJXAorCQkgICsgKHJlZ25vKSAtIEZQQ19SRUdOVU0pOwkJCQlcCit9CisKKy8qIEhQVVggOC4wLCBpbiBpdHMgaW5maW5pdGUgd2lzZG9tLCBoYXMgY2hvc2VuIHRvIHByb3RvdHlwZSBwdHJhY2UKKyAgIHdpdGggZml2ZSBhcmd1bWVudHMsIHNvIHByb2dyYW1zIHdyaXR0ZW4gZm9yIG5vcm1hbCBwdHJhY2UgbG9zZS4KKworICAgSWRpb3RzLgorCisgICAoVGhleSBzaG91bGQgaGF2ZSBqdXN0IG1hZGUgaXQgdmFyYWRpYykuICAqLworCisjZGVmaW5lIEZJVkVfQVJHX1BUUkFDRQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL25tLWxpbnV4LmggYi9nZGIvY29uZmlnL202OGsvbm0tbGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2E0NGVjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL25tLWxpbnV4LmgKQEAgLTAsMCArMSw0NyBAQAorLyogTmF0aXZlIHN1cHBvcnQgZm9yIGxpbnV4LCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBOTV9MSU5VWF9ICisjZGVmaW5lIE5NX0xJTlVYX0gKKworLyogUmV0dXJuIHNpemVvZiB1c2VyIHN0cnVjdCB0byBjYWxsZXJzIGluIGxlc3MgbWFjaGluZSBkZXBlbmRlbnQgcm91dGluZXMgKi8KKworI2RlZmluZSBLRVJORUxfVV9TSVpFIGtlcm5lbF91X3NpemUoKQorZXh0ZXJuIGludCBrZXJuZWxfdV9zaXplIFBBUkFNUyAoKHZvaWQpKTsKKworLyogVGVsbCBnZGIgdGhhdCB3ZSBjYW4gYXR0YWNoIGFuZCBkZXRhY2ggb3RoZXIgcHJvY2Vzc2VzICovCisjZGVmaW5lIEFUVEFDSF9ERVRBQ0gKKworI2RlZmluZSBVX1JFR1NfT0ZGU0VUIDAKKworLyogV2UgZGVmaW5lIHRoaXMgaWYgbGluay5oIGlzIGF2YWlsYWJsZSwgYmVjYXVzZSB3aXRoIEVMRiB3ZSB1c2UgU1ZSNCBzdHlsZQorICAgc2hhcmVkIGxpYnJhcmllcy4gKi8KKworI2lmZGVmIEhBVkVfTElOS19ICisjZGVmaW5lIFNWUjRfU0hBUkVEX0xJQlMKKyNpbmNsdWRlICJzb2xpYi5oIgkJLyogU3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcy4gKi8KKyNlbmRpZgorCisjZGVmaW5lIFJFR0lTVEVSX1VfQUREUihhZGRyLCBibG9ja2VuZCwgcmVnbm8pIFwKKwkoYWRkcikgPSBtNjhrX2xpbnV4X3JlZ2lzdGVyX3VfYWRkciAoKGJsb2NrZW5kKSwocmVnbm8pKTsKKworZXh0ZXJuIGludAorbTY4a19saW51eF9yZWdpc3Rlcl91X2FkZHIgUEFSQU1TICgoaW50LCBpbnQpKTsKKworI2VuZGlmIC8qICNpZm5kZWYgTk1fTElOVVhfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL25tLW02OGtseW54LmggYi9nZGIvY29uZmlnL202OGsvbm0tbTY4a2x5bnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmI4ZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL25tLW02OGtseW54LmgKQEAgLTAsMCArMSwyNSBAQAorLyogTmF0aXZlLWRlcGVuZGVudCBkZWZpbml0aW9ucyBmb3IgTW90b3JvbGEgNjgweDAgcnVubmluZyBMeW54T1MuCisgICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIE5NX002OEtMWU5YX0gKKyNkZWZpbmUgTk1fTTY4S0xZTlhfSAorCisjaW5jbHVkZSAibm0tbHlueC5oIgorCisjZW5kaWYgLyogTk1fTTY4S0xZTlhfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL25tLW5ic2QuaCBiL2dkYi9jb25maWcvbTY4ay9ubS1uYnNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyMmM0ZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay9ubS1uYnNkLmgKQEAgLTAsMCArMSwyMSBAQAorLyogTmF0aXZlLWRlcGVuZGVudCBkZWZpbml0aW9ucyBmb3IgTW90b3JvbGEgbTY4ayBydW5uaW5nIE5ldEJTRCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEdldCBnZW5lcmljIE5ldEJTRCBuYXRpdmUgZGVmaW5pdGlvbnMuICovCisjaW5jbHVkZSAibm0tbmJzZC5oIgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL25tLW5ld3MuaCBiL2dkYi9jb25maWcvbTY4ay9ubS1uZXdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzZDIxNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay9ubS1uZXdzLmgKQEAgLTAsMCArMSwyNiBAQAorLyogUGFyYW1ldGVycyBmb3IgZXhlY3V0aW9uIG9uIGEgU29ueS9ORVdTLCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5ODcsIDE5ODksIDE5OTIsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBOTV9IRVdTX0gKKyNkZWZpbmUgTk1fTkVXU19IIDEKKworLyogU3VwcGx5IG1pc3NpbmcgdHlwZWRlZiBuZWVkZWQgaW4gaW5mdGFyZy5jICovCit0eXBlZGVmIGludCBwaWRfdDsKKworI2VuZGlmCS8qIE5NX05FV1NfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL25tLXN1bjIuaCBiL2dkYi9jb25maWcvbTY4ay9ubS1zdW4yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAzNTI1MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay9ubS1zdW4yLmgKQEAgLTAsMCArMSwzMyBAQAorLyogUGFyYW1ldGVycyBmb3IgZXhlY3V0aW9uIG9uIGEgU3VuMiwgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBEbyBpbXBsZW1lbnQgdGhlIGF0dGFjaCBhbmQgZGV0YWNoIGNvbW1hbmRzLiAgKi8KKworI2RlZmluZSBBVFRBQ0hfREVUQUNICisKKy8qIE92ZXJyaWRlIGNvcGllcyBvZiB7ZmV0Y2gsc3RvcmV9X2luZmVyaW9yX3JlZ2lzdGVycyBpbiBpbmZwdHJhY2UuYy4gICovCisjZGVmaW5lIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUworCisvKiBUaGlzIGlzIGEgcGllY2Ugb2YgbWFnaWMgdGhhdCBpcyBnaXZlbiBhIHJlZ2lzdGVyIG51bWJlciBSRUdOTworICAgYW5kIGFzIEJMT0NLRU5EIHRoZSBhZGRyZXNzIGluIHRoZSBzeXN0ZW0gb2YgdGhlIGVuZCBvZiB0aGUgdXNlciBzdHJ1Y3R1cmUKKyAgIGFuZCBzdG9yZXMgaW4gQUREUiB0aGUgYWRkcmVzcyBpbiB0aGUga2VybmVsIG9yIGNvcmUgZHVtcAorICAgb2YgdGhhdCByZWdpc3Rlci4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfVV9BRERSKGFkZHIsIGJsb2NrZW5kLCByZWdubykJCVwKK3sgYWRkciA9IGJsb2NrZW5kICsgcmVnbm8gKiA0OyB9CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvbm0tc3VuMy5oIGIvZ2RiL2NvbmZpZy9tNjhrL25tLXN1bjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGVmOGY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL25tLXN1bjMuaApAQCAtMCwwICsxLDMxIEBACisvKiBOYXRpdmUtb25seSBkZWZpbml0aW9ucyBmb3IgU3VuLTMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSwgMTk5MiwgMTk5NgorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogRG8gaW1wbGVtZW50IHRoZSBhdHRhY2ggYW5kIGRldGFjaCBjb21tYW5kcy4gICovCisKKyNkZWZpbmUgQVRUQUNIX0RFVEFDSAorCisvKiBPdmVycmlkZSBjb3BpZXMgb2Yge2ZldGNoLHN0b3JlfV9pbmZlcmlvcl9yZWdpc3RlcnMgaW4gaW5mcHRyYWNlLmMuICAqLworCisjZGVmaW5lIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUworCisvKiBXZSBoYXZlIHRvIGdyYWIgdGhlIHJlZ3Mgc2luY2Ugd2Ugc3RvcmUgYWxsIHJlZ3MgYXQgb25jZS4gICovCisKKyNkZWZpbmUgQ0hJTERfUFJFUEFSRV9UT19TVE9SRSgpIHJlYWRfcmVnaXN0ZXJfYnl0ZXMgKDAsIE5VTEwsIFJFR0lTVEVSX0JZVEVTKQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL25tLXN5c3Y0LmggYi9nZGIvY29uZmlnL202OGsvbm0tc3lzdjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzczMTMxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL25tLXN5c3Y0LmgKQEAgLTAsMCArMSwyMiBAQAorLyogTmF0aXZlLWRlcGVuZGVudCBkZWZpbml0aW9ucyBmb3IgTW90b3JvbGEgNjgweDAgcnVubmluZyBTVlI0LgorICAgQ29weXJpZ2h0IDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogSW5jbHVkZSB0aGUgZ2VuZXJpYyBTVlI0IGRlZmluaXRpb25zLiAgKi8KKworI2luY2x1ZGUgIm5tLXN5c3Y0LmgiCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvb3M2OGsubXQgYi9nZGIvY29uZmlnL202OGsvb3M2OGsubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxZGQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay9vczY4ay5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBWeFdvcmtzIHJ1bm5pbmcgb24gYSA2ODAwMAorVERFUEZJTEVTPSBtNjhrLXRkZXAubworVE1fRklMRT0gdG0tb3M2OGsuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3N0MjAwMC5tdCBiL2dkYi9jb25maWcvbTY4ay9zdDIwMDAubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkZmU1YwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay9zdDIwMDAubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogVGFuZGVtIFNULTIwMDAgcGhvbmUgc3dpdGNoCitUREVQRklMRVM9IG02OGstdGRlcC5vIHJlbW90ZS1zdC5vCitUTV9GSUxFPSB0bS1zdDIwMDAuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3N1bjJvczMubWggYi9nZGIvY29uZmlnL202OGsvc3VuMm9zMy5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2VmNjI3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3N1bjJvczMubWgKQEAgLTAsMCArMSw1IEBACisjIEhvc3Q6IFN1biAyLCBydW5uaW5nIFN1bk9TIDMKK1hERVBGSUxFUz0gCitYTV9GSUxFPSB4bS1zdW4yLmgKK05BVF9GSUxFPSBubS1zdW4yLmgKK05BVERFUEZJTEVTPSBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gZm9yay1jaGlsZC5vIGNvcmVsb3cubyBzdW4zLW5hdC5vCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvc3VuMm9zMy5tdCBiL2dkYi9jb25maWcvbTY4ay9zdW4yb3MzLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjdjN2YKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvc3VuMm9zMy5tdApAQCAtMCwwICsxLDcgQEAKKyMgVGFyZ2V0OiBTdW4gMiwgcnVubmluZyBTdW5PUyAzCisjIFRoZSBzeXN0ZW0tc3VwcGxpZWQgYXNzZW1ibGVyIHJlLW9yZGVycyB0aGUgc3ltYm9scyBzbyB0aGF0IGdkYgorIyBjYW4ndCBmaW5kICJnY2NfY29tcGlsZWQuIi4KKyNtc2cgSWYgeW91IGNvbXBpbGUgeW91ciBwcm9ncmFtIHdpdGggR0NDLCB1c2UgdGhlIEdOVSBhc3NlbWJsZXIuCisjbXNnCitUREVQRklMRVM9IG02OGstdGRlcC5vCitUTV9GSUxFPSB0bS1zdW4yLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay9zdW4yb3M0Lm1oIGIvZ2RiL2NvbmZpZy9tNjhrL3N1bjJvczQubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3NjQyZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay9zdW4yb3M0Lm1oCkBAIC0wLDAgKzEsNSBAQAorIyBIb3N0OiBTdW4gMiwgcnVubmluZyBTdW5PUyA0CitYREVQRklMRVM9IAorWE1fRklMRT0geG0tc3VuMi5oCitOQVRfRklMRT0gbm0tc3VuMi5oCitOQVRERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBjb3JlbG93Lm8gc3VuMy1uYXQubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3N1bjJvczQubXQgYi9nZGIvY29uZmlnL202OGsvc3VuMm9zNC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGM1NmZlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3N1bjJvczQubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogU3VuIDIsIHJ1bm5pbmcgU3VuT1MgNAorVERFUEZJTEVTPSBzb2xpYi5vIG02OGstdGRlcC5vCitUTV9GSUxFPSB0bS1zdW4yb3M0LmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay9zdW4zb3MzLm1oIGIvZ2RiL2NvbmZpZy9tNjhrL3N1bjNvczMubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5Mzc5MwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay9zdW4zb3MzLm1oCkBAIC0wLDAgKzEsNSBAQAorIyBIb3N0OiBTdW4gMywgcnVubmluZyBTdW5PUyAzCitYREVQRklMRVM9IAorWE1fRklMRT0geG0tc3VuMy5oCitOQVRfRklMRT0gbm0tc3VuMy5oCitOQVRERVBGSUxFUz0gZm9yay1jaGlsZC5vIGluZnRhcmcubyBpbmZwdHJhY2UubyBjb3JlbG93Lm8gc3VuMy1uYXQubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3N1bjNvczMubXQgYi9nZGIvY29uZmlnL202OGsvc3VuM29zMy5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjlkYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3N1bjNvczMubXQKQEAgLTAsMCArMSw4IEBACisjIFRhcmdldDogU3VuIDMsIHJ1bm5pbmcgU3VuT1MgMworIyBUaGUgc3lzdGVtLXN1cHBsaWVkIGFzc2VtYmxlciByZS1vcmRlcnMgdGhlIHN5bWJvbHMgc28gdGhhdCBnZGIKKyMgY2FuJ3QgZmluZCAiZ2NjX2NvbXBpbGVkLiIuCisjbXNnIElmIHlvdSBjb21waWxlIHlvdXIgcHJvZ3JhbSB3aXRoIEdDQywgdXNlIHRoZSBHTlUgYXNzZW1ibGVyLgorI21zZworCitUREVQRklMRVM9IG02OGstdGRlcC5vCitUTV9GSUxFPSB0bS1zdW4zLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay9zdW4zb3M0Lm1oIGIvZ2RiL2NvbmZpZy9tNjhrL3N1bjNvczQubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxYmY1MgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay9zdW4zb3M0Lm1oCkBAIC0wLDAgKzEsNiBAQAorIyBIb3N0OiBTdW4gMywgcnVubmluZyBTdW5PUyA0CitYREVQRklMRVM9IAorWE1fRklMRT0geG0tc3VuM29zNC5oCitOQVRfRklMRT0gbm0tc3VuMy5oCitOQVRERVBGSUxFUz0gZm9yay1jaGlsZC5vIGluZnRhcmcubyBpbmZwdHJhY2UubyBjb3JlbG93Lm8gc3VuMy1uYXQubworR0RCU0VSVkVSX0RFUEZJTEVTPSBsb3ctc3VuMy5vCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvc3VuM29zNC5tdCBiL2dkYi9jb25maWcvbTY4ay9zdW4zb3M0Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYzI2NWYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvc3VuM29zNC5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBTdW4gMywgcnVubmluZyBTdW5PUyA0LCBhcyBhIHRhcmdldCBzeXN0ZW0KK1RERVBGSUxFUz0gc29saWIubyBtNjhrLXRkZXAubworVE1fRklMRT0gdG0tc3VuM29zNC5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvdG0tM2IxLmggYi9nZGIvY29uZmlnL202OGsvdG0tM2IxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxNzc2MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay90bS0zYjEuaApAQCAtMCwwICsxLDMyIEBACisvKiBQYXJhbWV0ZXJzIGZvciB0YXJnZXRpbmcgR0RCIHRvIGEgM2IxLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhlIGNoaWxkIHRhcmdldCBjYW4ndCBkZWFsIHdpdGggZmxvYXRpbmcgcmVnaXN0ZXJzLiAgKi8KKyNkZWZpbmUgQ0FOTk9UX1NUT1JFX1JFR0lTVEVSKHJlZ25vKSAoKHJlZ25vKSA+PSBGUDBfUkVHTlVNKQorCisvKiBEZWZpbmUgQlBUX1ZFQ1RPUiBpZiBpdCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgZGVmYXVsdC4KKyAgIFRoaXMgaXMgdGhlIHZlY3RvciBudW1iZXIgdXNlZCBieSB0cmFwcyB0byBpbmRpY2F0ZSBhIGJyZWFrcG9pbnQuICovCisKKyNkZWZpbmUgQlBUX1ZFQ1RPUiAweDEKKworLyogQWRkcmVzcyBvZiBlbmQgb2Ygc3RhY2sgc3BhY2UuICAqLworCisjZGVmaW5lIFNUQUNLX0VORF9BRERSIDB4MzAwMDAwCisKKyNpbmNsdWRlICJtNjhrL3RtLW02OGsuaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay90bS1hbHRvcy5oIGIvZ2RiL2NvbmZpZy9tNjhrL3RtLWFsdG9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3N2ZlYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay90bS1hbHRvcy5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qIFRhcmdldCBkZWZpbml0aW9ucyBmb3IgR0RCIG9uIGFuIEFsdG9zIDMwNjggKG02OGsgcnVubmluZyBTVlIyKQorICAgQ29weXJpZ2h0IDE5ODcsIDE5ODksIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhlIGNoaWxkIHRhcmdldCBjYW4ndCBkZWFsIHdpdGggZmxvYXRpbmcgcmVnaXN0ZXJzLiAgKi8KKyNkZWZpbmUgQ0FOTk9UX1NUT1JFX1JFR0lTVEVSKHJlZ25vKSAoKHJlZ25vKSA+PSBGUDBfUkVHTlVNKQorCisvKiBEZWZpbmUgQlBUX1ZFQ1RPUiBpZiBpdCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgZGVmYXVsdC4KKyAgIFRoaXMgaXMgdGhlIHZlY3RvciBudW1iZXIgdXNlZCBieSB0cmFwcyB0byBpbmRpY2F0ZSBhIGJyZWFrcG9pbnQuICovCisKKyNkZWZpbmUgQlBUX1ZFQ1RPUiAweGUKKworLyogQWRkcmVzcyBvZiBlbmQgb2Ygc3RhY2sgc3BhY2UuICAqLworCisvKiNkZWZpbmUgU1RBQ0tfRU5EX0FERFIgKDB4ZmZmZmZmKSovCisjZGVmaW5lIFNUQUNLX0VORF9BRERSICgweDEwMDAwMDApCisKKy8qIEFtb3VudCBQQyBtdXN0IGJlIGRlY3JlbWVudGVkIGJ5IGFmdGVyIGEgYnJlYWtwb2ludC4KKyAgIE9uIHRoZSBBbHRvcywgdGhlIGtlcm5lbCByZXNldHMgdGhlIHBjIHRvIHRoZSB0cmFwIGluc3RyICovCisKKyNkZWZpbmUgREVDUl9QQ19BRlRFUl9CUkVBSyAwCisKKy8qIFRoZSBvbmx5IHJlYXNvbiB0aGlzIGlzIGhlcmUgaXMgdGhlIHRtLWFsdG9zLmggcmVmZXJlbmNlIGJlbG93LiAgSXQKKyAgIHdhcyBtb3ZlZCBiYWNrIGhlcmUgZnJvbSB0bS1tNjhrLmguICBGSVhNRT8gKi8KKworI2RlZmluZSBTS0lQX1BST0xPR1VFKHBjKSAgIFwKK3sgcmVnaXN0ZXIgaW50IG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDIpOwlcCisgIGlmIChvcCA9PSAwMDQ3MTI2KQkJCQkJXAorICAgIHBjICs9IDQ7ICAgLyogU2tpcCBsaW5rICN3b3JkICovCQkJXAorICBlbHNlIGlmIChvcCA9PSAwMDQ0MDE2KQkJCQlcCisgICAgcGMgKz0gNjsgICAvKiBTa2lwIGxpbmsgI2xvbmcgKi8JCQlcCisgIC8qIE5vdCBzdXJlIHdoeSBicmFuY2hlcyBhcmUgaGVyZS4gICovCQlcCisgIC8qIEZyb20gdG0taXNpLmgsIHRtLWFsdG9zLmggKi8JCQlcCisgIGVsc2UgaWYgKG9wID09IDAwNjAwMDApCQkJCVwKKyAgICBwYyArPSA0OyAgIC8qIFNraXAgYnJhICN3b3JkICovCQkJXAorICBlbHNlIGlmIChvcCA9PSAwMDYwMDM3NykJCQkJXAorICAgIHBjICs9IDY7ICAgLyogc2tpcCBicmEgI2xvbmcgKi8JCQlcCisgIGVsc2UgaWYgKChvcCAmIDAxNzc0MDApID09IDAwNjAwMDApCQkJXAorICAgIHBjICs9IDI7ICAgLyogc2tpcCBicmEgI2NoYXIgKi8JCQlcCit9CisKKyNpbmNsdWRlICJtNjhrL3RtLW02OGsuaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay90bS1hcG9sbG82OGIuaCBiL2dkYi9jb25maWcvbTY4ay90bS1hcG9sbG82OGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTEwNDEwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3RtLWFwb2xsbzY4Yi5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIGV4ZWN1dGlvbiBvbiBBcG9sbG8gNjhrIHJ1bm5pbmcgQlNELgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogQXBvbGxvcyB1c2UgdmVjdG9yIDB4YiBmb3IgdGhlIGJyZWFrcG9pbnQgdmVjdG9yICovCisKKyNkZWZpbmUgQlBUX1ZFQ1RPUiAweGIKKworI2luY2x1ZGUgIm02OGsvdG0tbTY4ay5oIgorCisjZGVmaW5lIEZSQU1FX0NIQUlOX1ZBTElEKGNoYWluLCB0aGlzZnJhbWUpIG5vbm51bGxfZnJhbWVfY2hhaW5fdmFsaWQgKGNoYWluLCB0aGlzZnJhbWUpCisKKy8qIFRoZXNlIGFyZSB0aGUgam1wX2J1ZiByZWdpc3RlcnMgSSBjb3VsZCBndWVzcy4gVGhlcmUgYXJlIDEzIHJlZ2lzdGVycworICogaW4gdGhlIGJ1ZmZlci4gVGhlcmUgYXJlIDggZGF0YSByZWdpc3RlcnMsIDYgZ2VuZXJhbCBhZGRyZXNzIHJlZ2lzdGVycywKKyAqIHRoZSBGcmFtZSBQb2ludGVyLCB0aGUgU3RhY2sgUG9pbnRlciwgdGhlIFBDIGFuZCB0aGUgU1IgaW4gdGhlIGNoaXAuIEkgd291bGQKKyAqIGd1ZXNzIHRoYXQgMTIgaXMgdGhlIFNSLCBidXQgd2UgZG9uJ3QgbmVlZCB0aGF0IGFueXdheS4gMCBhbmQgMSBoYXZlCisgKiBtZSBzdHVtcGVkLiA0IGFwcGVhcnMgdG8gYmUgYTUgZm9yIHNvbWUgdW5rbm93biByZWFzb24uIElmIHlvdSBjYXJlCisgKiBhYm91dCB0aGlzLCBkaXNhc3NlbWJsZSBzZXRqbXAgdG8gZmluZCBvdXQuIEJ1dCBkb24ndCBkbyBpdCB3aXRoIGdkYiA6KQorICovCisKKyN1bmRlZiBKQl9TUAorI3VuZGVmIEpCX0ZQCisjdW5kZWYgSkJfUEMKKyN1bmRlZiBKQl9EMAorI3VuZGVmIEpCX0QxCisjdW5kZWYgSkJfRDIKKyN1bmRlZiBKQl9EMworI3VuZGVmIEpCX0Q0CisjdW5kZWYgSkJfRDUKKworI2RlZmluZSBKQl9TUCAyCisjZGVmaW5lIEpCX0ZQIDMKKyNkZWZpbmUgSkJfUEMgNQorI2RlZmluZSBKQl9EMCA2CisjZGVmaW5lIEpCX0QxIDcKKyNkZWZpbmUgSkJfRDIgOAorI2RlZmluZSBKQl9EMyA5CisjZGVmaW5lIEpCX0Q0IDEwCisjZGVmaW5lIEpCX0Q1IDExCisKKy8qIEhvdyB0byBkZWNpZGUgaWYgd2UncmUgaW4gYSBzaGFyZWQgbGlicmFyeSBmdW5jdGlvbi4gIChQcm9iYWJseSBhIHdyb25nCisgICBkZWZpbmludGlvbiBpbmhlcml0ZWQgZnJvbSB0aGUgVnhXb3JrcyBjb25maWcgZmlsZSkuICAqLworI2RlZmluZQlJTl9TT0xJQl9DQUxMX1RSQU1QT0xJTkUocGMsIG5hbWUpIChuYW1lICYmIHN0cmNtcChuYW1lLCAiPGVuZF9vZl9wcm9ncmFtPiIpID09IDApCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvdG0tY2lzY28uaCBiL2dkYi9jb25maWcvbTY4ay90bS1jaXNjby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNjI4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvdG0tY2lzY28uaApAQCAtMCwwICsxLDU1IEBACisvKiBQYXJhbWV0ZXJzIGZvciBDSVNDTyBtNjhrLgorICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgR0RCSU5JVF9GSUxFTkFNRQkiLmNpc2NvLWdkYmluaXQiCS8qIEluaXQgZmlsZSAqLworCisjZGVmaW5lIERFRkFVTFRfUFJPTVBUCQkiKGNpc2NvLTY4ay1nZGIpICIJLyogRGVmYXVsdCBwcm9tcHQgKi8KKworI2luY2x1ZGUgIm02OGsvdG0tbTY4ay5oIgorCisvKiBPZmZzZXRzIChpbiB0YXJnZXQgaW50cykgaW50byBqbXBfYnVmLiAgRGVmaW5lZCBpbiAvY3NjL3N5cy9zdW4vYXNtLlMuICovCisKKyNkZWZpbmUgSkJfRUxFTUVOVF9TSVpFIDQKKworI2RlZmluZSBKQl9QQyAwCisjZGVmaW5lIEpCX0QyIDEKKyNkZWZpbmUgSkJfRDMgMgorI2RlZmluZSBKQl9ENCAzCisjZGVmaW5lIEpCX0Q1IDQKKyNkZWZpbmUgSkJfRDYgNQorI2RlZmluZSBKQl9ENyA2CisjZGVmaW5lIEpCX0EyIDcKKyNkZWZpbmUgSkJfQTMgOAorI2RlZmluZSBKQl9BNCA5CisjZGVmaW5lIEpCX0E1IDEwCisjZGVmaW5lIEpCX0E2IDExCisjZGVmaW5lIEpCX1NQIDEyCisKKy8qIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIGxvbmdqbXAgd2lsbCBsYW5kLiAgU2x1cnAgdGhlIGFyZ3Mgb3V0IG9mIHRoZSBzdGFjay4KKyAgIFdlIGV4cGVjdCB0aGUgZmlyc3QgYXJnIHRvIGJlIGEgcG9pbnRlciB0byB0aGUgam1wX2J1ZiBzdHJ1Y3R1cmUgZnJvbSB3aGljaAorICAgd2UgZXh0cmFjdCB0aGUgcGMgKEpCX1BDKSB0aGF0IHdlIHdpbGwgbGFuZCBhdC4gIFRoZSBwYyBpcyBjb3BpZWQgaW50byBBRERSLgorICAgVGhpcyByb3V0aW5lIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzICovCisKKyNkZWZpbmUgR0VUX0xPTkdKTVBfVEFSR0VUKEFERFIpIGdldF9sb25nam1wX3RhcmdldChBRERSKQorZXh0ZXJuIGludCBnZXRfbG9uZ2ptcF90YXJnZXQgUEFSQU1TICgoQ09SRV9BRERSICopKTsKKworLyogQkZEIGhhbmRsZXMgZmluZGluZyB0aGUgcmVnaXN0ZXJzIGluIHRoZSBjb3JlIGZpbGUsIHNvIHRoZXkgYXJlIGF0CisgICB0aGUgc3RhcnQgb2YgdGhlIEJGRCAucmVnIHNlY3Rpb24uICAqLworI2RlZmluZSBSRUdJU1RFUl9VX0FERFIoYWRkcixibG9ja2VuZCxyZWdubykgKGFkZHIgPSBSRUdJU1RFUl9CWVRFIChyZWdubykpCisjZGVmaW5lIEtFUk5FTF9VX0FERFIgMApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3RtLWRlbHRhNjguaCBiL2dkYi9jb25maWcvbTY4ay90bS1kZWx0YTY4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2NWJiNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay90bS1kZWx0YTY4LmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qIFRhcmdldCBkZWZpbml0aW9ucyBmb3IgZGVsdGE2OC4KKyAgIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIERlZmluZSBCUFRfVkVDVE9SIGlmIGl0IGlzIGRpZmZlcmVudCB0aGFuIHRoZSBkZWZhdWx0LgorICAgVGhpcyBpcyB0aGUgdmVjdG9yIG51bWJlciB1c2VkIGJ5IHRyYXBzIHRvIGluZGljYXRlIGEgYnJlYWtwb2ludC4gKi8KKworI2RlZmluZSBCUFRfVkVDVE9SIDB4MQorCisjZGVmaW5lIEdDQ19DT01QSUxFRF9GTEFHX1NZTUJPTCAiZ2NjX2NvbXBpbGVkJSIKKyNkZWZpbmUgR0NDMl9DT01QSUxFRF9GTEFHX1NZTUJPTCAiZ2NjMl9jb21waWxlZCUiCisKKy8qIEFtb3VudCBQQyBtdXN0IGJlIGRlY3JlbWVudGVkIGJ5IGFmdGVyIGEgYnJlYWtwb2ludC4KKyAgIE9uIHRoZSBEZWx0YSwgdGhlIGtlcm5lbCBkZWNyZW1lbnRzIGl0IGZvciB1cy4gICovCisKKyNkZWZpbmUgREVDUl9QQ19BRlRFUl9CUkVBSyAwCisKKy8qIE5vdCBzdXJlIHdoYXQgaGFwcGVucyBpZiB3ZSB0cnkgdG8gc3RvcmUgdGhpcyByZWdpc3RlciwgYnV0CisgICBwaGRtQGluZm8udWNsLmFjLmJlIHNheXMgd2UgbmVlZCB0aGlzIGRlZmluZS4gICovCisKKyNkZWZpbmUgQ0FOTk9UX1NUT1JFX1JFR0lTVEVSKHJlZ25vKQkocmVnbm8gPT0gRlBJX1JFR05VTSkKKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgb2YgdHlwZSBUWVBFLCBhbmQgY29weSB0aGF0LCBpbiB2aXJ0dWFsIGZvcm1hdCwKKyAgIGludG8gVkFMQlVGLiAgKi8KKworLyogV2hlbiBpdCByZXR1cm5zIGEgZmxvYXQvZG91YmxlIHZhbHVlLCB1c2UgZnAwIGluIHN5c1Y2OC4gICovCisvKiBXaGVuIGl0IHJldHVybnMgYSBwb2ludGVyIHZhbHVlLCB1c2UgYTAgaW4gc3lzVjY4LiAgKi8KKworI2RlZmluZSBFWFRSQUNUX1JFVFVSTl9WQUxVRShUWVBFLFJFR0JVRixWQUxCVUYpCQkJXAorICBpZiAoVFlQRV9DT0RFIChUWVBFKSA9PSBUWVBFX0NPREVfRkxUKQkJCQlcCisgICAgUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMIChGUDBfUkVHTlVNLCBUWVBFLAkJCVwKKwkJCQkgJlJFR0JVRltSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNKV0sCVwKKwkJCQkgVkFMQlVGKTsJCQkJXAorICBlbHNlCQkJCQkJCQkJXAorICAgIG1lbWNweSAoKFZBTEJVRiksCQkJCQkJCVwKKwkgICAgKGNoYXIgKikgKChSRUdCVUYpICsJCQkJCVwKKwkJICAgICAgKFRZUEVfQ09ERShUWVBFKSA9PSBUWVBFX0NPREVfUFRSID8gOCAqIDQgOglcCisJCSAgICAgICAoVFlQRV9MRU5HVEgoVFlQRSkgPj0gNCA/IDAgOiA0IC0gVFlQRV9MRU5HVEgoVFlQRSkpKSksIFwKKwkgICAgVFlQRV9MRU5HVEgoVFlQRSkpCisKKy8qIFdyaXRlIGludG8gYXBwcm9wcmlhdGUgcmVnaXN0ZXJzIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlCisgICBvZiB0eXBlIFRZUEUsIGdpdmVuIGluIHZpcnR1YWwgZm9ybWF0LiAgKi8KKworLyogV2hlbiBpdCByZXR1cm5zIGEgZmxvYXQvZG91YmxlIHZhbHVlLCB1c2UgZnAwIGluIHN5c1Y2OC4gICovCisvKiBXaGVuIGl0IHJldHVybnMgYSBwb2ludGVyIHZhbHVlLCB1c2UgYTAgaW4gc3lzVjY4LiAgKi8KKworI2RlZmluZSBTVE9SRV9SRVRVUk5fVkFMVUUoVFlQRSxWQUxCVUYpIFwKKyAgaWYgKFRZUEVfQ09ERSAoVFlQRSkgPT0gVFlQRV9DT0RFX0ZMVCkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwljaGFyIHJhd19idWZbUkVHSVNURVJfUkFXX1NJWkUgKEZQMF9SRUdOVU0pXTsJCQlcCisJUkVHSVNURVJfQ09OVkVSVF9UT19SQVcgKFRZUEUsIEZQMF9SRUdOVU0sIFZBTEJVRiwgcmF3X2J1Zik7CVwKKwl3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSksCQlcCisJCQkgICAgICByYXdfYnVmLCBSRUdJU1RFUl9SQVdfU0laRSAoRlAwX1JFR05VTSkpOyBcCisgICAgICB9CQkJCQkJCQkJXAorICBlbHNlCQkJCQkJCQkJXAorICAgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzICgoVFlQRV9DT0RFKFRZUEUpID09IFRZUEVfQ09ERV9QVFIgPyA4ICogNCA6IDApLCBcCisJCQkgIFZBTEJVRiwgVFlQRV9MRU5HVEggKFRZUEUpKQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvIGEgZnJhbWUuCisgICBDYW4gcmV0dXJuIC0xLCBtZWFuaW5nIG5vIHdheSB0byB0ZWxsLiAgKi8KKworI2RlZmluZSBGUkFNRV9OVU1fQVJHUyh2YWwsIGZpKSAgXAoreyByZWdpc3RlciBDT1JFX0FERFIgcGMgPSBGUkFNRV9TQVZFRF9QQyAoZmkpOwkJCVwKKyAgcmVnaXN0ZXIgaW50IGluc24gPSAwMTc3Nzc3ICYgcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDIpOwlcCisgIHZhbCA9IDA7CQkJCQkJCVwKKyAgaWYgKGluc24gPT0gMDA0Nzc1NyB8fCBpbnNuID09IDAxNTczNzQpICAvKiBsZWEgVyhzcCksc3Agb3IgYWRkYXcgI1csc3AgKi8gXAorICAgIHZhbCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjICsgMiwgMik7CQkJXAorICBlbHNlIGlmICgoaW5zbiAmIDAxNzA3NzcpID09IDAwNTAyMTcgLyogYWRkcWwgI04sIHNwICovCVwKKwkgICB8fCAoaW5zbiAmIDAxNzA3NzcpID09IDAwNTAxMTcpICAvKiBhZGRxdyAqLwkJXAorICAgIHsgdmFsID0gKGluc24gPj4gOSkgJiA3OyBpZiAodmFsID09IDApIHZhbCA9IDg7IH0JCVwKKyAgZWxzZSBpZiAoaW5zbiA9PSAwMTU3Nzc0KSAvKiBhZGRhbCAjV1csIHNwICovCQkJXAorICAgIHZhbCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjICsgMiwgNCk7CQkJXAorICB2YWwgPj49IDI7IH0KKworLyogT24gTTY4MDQwIHZlcnNpb25zIG9mIHN5c1Y2OCBSM1Y3LjEsIHB0cmFjZShQVF9XUklURV9JKSBkb2VzIG5vdCBjbGVhcgorICAgdGhlIHByb2Nlc3NvcidzIGluc3RydWN0aW9uIGNhY2hlIGFzIGl0IHNob3VsZC4gICovCisjZGVmaW5lIENMRUFSX0lOU05fQ0FDSEUoKQljbGVhcl9pbnNuX2NhY2hlKCkKKworI2luY2x1ZGUgIm02OGsvdG0tbTY4ay5oIgorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICB0aGUgYWRkcmVzcyBpbiB3aGljaCBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gaXRzIHN0cnVjdHVyZSB2YWx1ZSwKKyAgIGFzIGEgQ09SRV9BRERSIChvciBhbiBleHByZXNzaW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgb25lKS4gICovCisKKyN1bmRlZiBFWFRSQUNUX1NUUlVDVF9WQUxVRV9BRERSRVNTCisjZGVmaW5lIEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MoUkVHQlVGKVwKKwkoKihDT1JFX0FERFIgKikoKGNoYXIqKShSRUdCVUYpICsgOCAqIDQpKQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3RtLWRweDIuaCBiL2dkYi9jb25maWcvbTY4ay90bS1kcHgyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxYmZkYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay90bS1kcHgyLmgKQEAgLTAsMCArMSwzMyBAQAorLyogUGFyYW1ldGVycyBmb3IgdGFyZ2V0aW5nIHRvIGEgQnVsbCBEUFgyLgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5LCAxOTkxLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIERlZmluZSBCUFRfVkVDVE9SIGlmIGl0IGlzIGRpZmZlcmVudCB0aGFuIHRoZSBkZWZhdWx0LgorICAgVGhpcyBpcyB0aGUgdmVjdG9yIG51bWJlciB1c2VkIGJ5IHRyYXBzIHRvIGluZGljYXRlIGEgYnJlYWtwb2ludC4gKi8KKworI2RlZmluZSBCUFRfVkVDVE9SIDB4ZQorCisvKiBOZWVkIHRvIGdldCBmdW5jdGlvbiBlbmRzIGJ5IGFkZGluZyB0aGlzIHRvIGVwaWxvZ3VlIGFkZHJlc3MgZnJvbSAuYmYKKyAgIHJlY29yZCwgbm90IHVzaW5nIHhfZnNpemUgZmllbGQuICAqLworI2RlZmluZSBGVU5DVElPTl9FUElMT0dVRV9TSVpFIDQKKworLyogVGhlIGNoaWxkIHRhcmdldCBjYW4ndCBkZWFsIHdpdGggd3JpdGluZyBmbG9hdGluZyByZWdpc3RlcnMuICAqLworI2RlZmluZSBDQU5OT1RfU1RPUkVfUkVHSVNURVIocmVnbm8pICgocmVnbm8pID49IEZQMF9SRUdOVU0pCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlICJtNjhrL3RtLW02OGsuaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay90bS1lczE4MDAuaCBiL2dkYi9jb25maWcvbTY4ay90bS1lczE4MDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTJhZjFkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3RtLWVzMTgwMC5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIGV4ZWN1dGlvbiBvbiBFUy0xODAwIGVtdWxhdG9yIGZvciA2ODAwMC4KKyAgIFRoZSBjb2RlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgSm9oYW4gSG9sbWJlcmcgVFQvU0ogRXJpY3Nzb24gVGVsZWNvbQorICAgQUIgYW5kIGxhdGVyIG1vZGlmaWVkIGJ5IEpvaGFuIEhlbnJpa3Nzb24gVFQvU0ouIEl0IHdhcyBhZGFwdGVkIHRvIEdEQiA0LjAKKyAgIGJ5IEphbiBOb3JkZW4gVFgvREsuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitHREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lCUdEQklOSVRfRklMRU5BTUUJIi5lc2dkYmluaXQiCisKKyNkZWZpbmUJREVGQVVMVF9QUk9NUFQJCSIoZXNnZGIpICIKKworI2luY2x1ZGUgIm02OGsvdG0tbTY4ay5oIgorCisvKiBMb25nam1wIHN0dWZmIGJvcnJvd2VkIGZyb20gc3VuMyBjb25maWd1cmF0aW9uLiAgRG9uJ3Qga25vdyBpZiBjb3JyZWN0LiAKKyAgIEZJWE1FLiAgKi8KKy8qIE9mZnNldHMgKGluIHRhcmdldCBpbnRzKSBpbnRvIGptcF9idWYuICBOb3QgZGVmaW5lZCBieSBTdW4sIGJ1dCBhdCBsZWFzdAorICAgZG9jdW1lbnRlZCBpbiBhIGNvbW1lbnQgaW4gPG1hY2hpbmUvc2V0am1wLmg+ISAqLworCisjZGVmaW5lIEpCX0VMRU1FTlRfU0laRSA0CisKKyNkZWZpbmUgSkJfT05TU1RBQ0sgMAorI2RlZmluZSBKQl9TSUdNQVNLIDEKKyNkZWZpbmUgSkJfU1AgMgorI2RlZmluZSBKQl9QQyAzCisjZGVmaW5lIEpCX1BTTCA0CisjZGVmaW5lIEpCX0QyIDUKKyNkZWZpbmUgSkJfRDMgNgorI2RlZmluZSBKQl9ENCA3CisjZGVmaW5lIEpCX0Q1IDgKKyNkZWZpbmUgSkJfRDYgOQorI2RlZmluZSBKQl9ENyAxMAorI2RlZmluZSBKQl9BMiAxMQorI2RlZmluZSBKQl9BMyAxMgorI2RlZmluZSBKQl9BNCAxMworI2RlZmluZSBKQl9BNSAxNAorI2RlZmluZSBKQl9BNiAxNQorCisvKiBGaWd1cmUgb3V0IHdoZXJlIHRoZSBsb25nam1wIHdpbGwgbGFuZC4gIFNsdXJwIHRoZSBhcmdzIG91dCBvZiB0aGUgc3RhY2suCisgICBXZSBleHBlY3QgdGhlIGZpcnN0IGFyZyB0byBiZSBhIHBvaW50ZXIgdG8gdGhlIGptcF9idWYgc3RydWN0dXJlIGZyb20gd2hpY2gKKyAgIHdlIGV4dHJhY3QgdGhlIHBjIChKQl9QQykgdGhhdCB3ZSB3aWxsIGxhbmQgYXQuICBUaGUgcGMgaXMgY29waWVkIGludG8gQUREUi4KKyAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRydWUgb24gc3VjY2VzcyAqLworCisjZGVmaW5lIEdFVF9MT05HSk1QX1RBUkdFVChBRERSKSBnZXRfbG9uZ2ptcF90YXJnZXQoQUREUikKK2V4dGVybiBpbnQgZ2V0X2xvbmdqbXBfdGFyZ2V0IFBBUkFNUyAoKENPUkVfQUREUiAqKSk7CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvdG0taHAzMDBic2QuaCBiL2dkYi9jb25maWcvbTY4ay90bS1ocDMwMGJzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZDc1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvdG0taHAzMDBic2QuaApAQCAtMCwwICsxLDYyIEBACisvKiBQYXJhbWV0ZXJzIGZvciB0YXJnZXQgbWFjaGluZSBIZXdsZXR0LVBhY2thcmQgOTAwMC8zMDAsIHJ1bm5pbmcgYnNkLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTEsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogQ29uZmlndXJhdGlvbiBmaWxlIGZvciBIUDkwMDAvMzAwIHNlcmllcyBtYWNoaW5lIHJ1bm5pbmcgQlNELAorICAgaW5jbHVkaW5nIFV0YWgsIE10LiBYaW51IG9yIEJlcmtlbGV5IHZhcmlhbnRzLiAgVGhpcyBpcyBOT1QgZm9yIEhQLVVYLgorICAgUHJvYmxlbXMgdG8gaHBic2QtYnVnc0Bjcy51dGFoLmVkdS4gICovCisKKy8qIEdDQyBpcyB0aGUgb25seSBjb21waWxlciB1c2VkIG9uIHRoaXMgT1MuICBTbyBnZXQgdGhpcyByaWdodCBldmVuIGlmCisgICB0aGUgY29kZSB3aGljaCBkZXRlY3RzIGdjYzJfY29tcGlsZWQuIGlzIHN0aWxsIGJyb2tlbi4gICovCisKKyNkZWZpbmUgQkVMSUVWRV9QQ0NfUFJPTU9USU9OIDEKKworLyogRGVmaW5lIEJQVF9WRUNUT1IgaWYgaXQgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGRlZmF1bHQuCisgICBUaGlzIGlzIHRoZSB2ZWN0b3IgbnVtYmVyIHVzZWQgYnkgdHJhcHMgdG8gaW5kaWNhdGUgYSBicmVha3BvaW50LgorCisgICBGb3IgaHAzMDBic2QgdGhlIG5vcm1hbCBicmVha3BvaW50IHZlY3RvciBpcyAweDIgKGZvciBkZWJ1Z2dpbmcgdmlhCisgICBwdHJhY2UpOyBmb3IgcmVtb3RlIGtlcm5lbCBkZWJ1Z2dpbmcgdGhlIGJyZWFrcG9pbnQgdmVjdG9yIGlzIDB4Zi4gICovCisKKyNkZWZpbmUgQlBUX1ZFQ1RPUiAweDIKKyNkZWZpbmUgUkVNT1RFX0JQVF9WRUNUT1IgMHhmCisKKyNkZWZpbmUgVEFSR0VUX05CUEcgNDA5NgorCisvKiBGb3IgNC40IHRoaXMgd291bGQgYmUgMiwgYnV0IGl0IGlzIE9LIGZvciB1cyB0byBkZXRlY3QgYW4gYXJlYSBhCisgICBiaXQgYmlnZ2VyIHRoYW4gbmVjZXNzYXJ5LiAgVGhpcyB3YXkgdGhlIHNhbWUgZ2RiIGJpbmFyeSBjYW4gdGFyZ2V0CisgICBlaXRoZXIgNC4zIG9yIDQuNC4gICovCisKKyNkZWZpbmUgVEFSR0VUX1VQQUdFUyAzCisKKy8qIE9uIHRoZSBIUDMwMCwgc2lndHJhbXAgaXMgaW4gdGhlIHUgYXJlYS4gIEdhayEgIFVzZXIgc3RydWN0IGlzIG5vdAorICAgbWFwcGVkIHRvIHRoZSBzYW1lIHZpcnR1YWwgYWRkcmVzcyBpbiB1c2VyL2tlcm5lbCBhZGRyZXNzIHNwYWNlCisgICAoaGVuY2UgU1RBQ0tfRU5EX0FERFIgYXMgb3Bwb3NlZCB0byBLRVJORUxfVV9BRERSKS4gIFRoaXMgdGVzdHMKKyAgIGZvciB0aGUgd2hvbGUgdSBhcmVhLCBzaW5jZSB3ZSBkb24ndCBuZWNlc3NhcmlseSBoYXZlIGhwMzAwYnNkCisgICBpbmNsdWRlIGZpbGVzIGFyb3VuZC4gICovCisKKy8qIEZvciA0LjQsIGl0IGlzIGFjdHVhbGx5IHJpZ2h0IDIwIGJ5dGVzICpiZWZvcmUqIFNUQUNLX0VORF9BRERSLCBzbworICAgaW5jbHVkZSB0aGF0IGluIHRoZSBhcmVhIHdlIHRlc3QgZm9yLiAgKi8KKworI2RlZmluZSBTSUdUUkFNUF9TVEFSVChwYykgKFNUQUNLX0VORF9BRERSIC0gMjApCisjZGVmaW5lIFNJR1RSQU1QX0VORChwYykgKFNUQUNLX0VORF9BRERSICsgVEFSR0VUX1VQQUdFUyAqIFRBUkdFVF9OQlBHKQorCisvKiBBZGRyZXNzIG9mIGVuZCBvZiBzdGFjayBzcGFjZS4gICovCisKKyNkZWZpbmUgU1RBQ0tfRU5EX0FERFIgMHhmZmYwMDAwMAorCisjaW5jbHVkZSAibTY4ay90bS1tNjhrLmgiCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvdG0taHAzMDBocHV4LmggYi9nZGIvY29uZmlnL202OGsvdG0taHAzMDBocHV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlMGQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay90bS1ocDMwMGhwdXguaApAQCAtMCwwICsxLDMxIEBACisvKiBQYXJhbWV0ZXJzIGZvciBleGVjdXRpb24gb24gYW4gSFAgOTAwMCBtb2RlbCAzMjAsIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBHQ0MgaXMgdGhlIG9ubHkgY29tcGlsZXIgdXNlZCBmb3Igc3RhYnMgb24gdGhpcyBPUy4gIFNvIGdldCB0aGlzCisgICByaWdodCBldmVuIGlmIHRoZSBjb2RlIHdoaWNoIGRldGVjdHMgZ2NjMl9jb21waWxlZC4gaXMgc3RpbGwKKyAgIGJyb2tlbi4gICovCisKKyNkZWZpbmUgQkVMSUVWRV9QQ0NfUFJPTU9USU9OIDEKKworLyogRGVmaW5lIEJQVF9WRUNUT1IgaWYgaXQgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGRlZmF1bHQuCisgICBUaGlzIGlzIHRoZSB2ZWN0b3IgbnVtYmVyIHVzZWQgYnkgdHJhcHMgdG8gaW5kaWNhdGUgYSBicmVha3BvaW50LiAqLworCisjZGVmaW5lIEJQVF9WRUNUT1IgMHgxCisKKyNpbmNsdWRlICJtNjhrL3RtLW02OGsuaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay90bS1pc2kuaCBiL2dkYi9jb25maWcvbTY4ay90bS1pc2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTk0NTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3RtLWlzaS5oCkBAIC0wLDAgKzEsMTUwIEBACisvKiBEZWZpbml0aW9ucyB0byB0YXJnZXQgR0RCIG9uIGFuIElTSSBPcHRpbXVtIFYgKDMuMDUpIHVuZGVyIDQuM2JzZC4KKyAgIENvcHlyaWdodCAoQykgMTk4NywgMTk4OSwgMTk5MSwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGhhcyBub3QgYmVlbiB0ZXN0ZWQgb24gSVNJJ3MgcnVubmluZyBCU0QgNC4yLCBidXQgaXQgd2lsbCBwcm9iYWJseQorICAgd29yay4gICovCisKKy8qIERhdGEgc2VnbWVudCBzdGFydHMgYXQgZXRleHQgcm91bmRlZCB1cCB0byBEQVRBUk9VTkQgaW4ge04sWn1NQUdJQyBmaWxlcyAqLworCisjZGVmaW5lIERBVEFST1VORAkweDIwMDAwCisjZGVmaW5lIE5fREFUQUREUihoZHIpCShoZHIuYV9tYWdpYyAhPSBPTUFHSUMgPyBcCisJKGhkci5hX3RleHQgKyBEQVRBUk9VTkQpICYgfihEQVRBUk9VTkQtMSkgOiBoZHIuYV90ZXh0KQorCisvKiBUZXh0IHNlZ21lbnQgc3RhcnRzIGF0IHNpemVvZiAoc3RydWN0IGV4ZWMpIGluIHtOLFp9TUFHSUMgZmlsZXMgKi8KKworI2RlZmluZSBOX1RYVEFERFIoaGRyKQkoaGRyLmFfbWFnaWMgIT0gT01BR0lDID8gc2l6ZW9mIChzdHJ1Y3QgZXhlYykgOiAwKQorCisvKiBBbW91bnQgUEMgbXVzdCBiZSBkZWNyZW1lbnRlZCBieSBhZnRlciBhIGJyZWFrcG9pbnQuCisgICBUaGlzIGlzIG9mdGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gQlJFQUtQT0lOVAorICAgYnV0IG5vdCBhbHdheXMuCisgICBPbiB0aGUgSVNJLCB0aGUga2VybmVsIHJlc2V0cyB0aGUgcGMgdG8gdGhlIHRyYXAgaW5zdHIgKi8KKworI2RlZmluZSBERUNSX1BDX0FGVEVSX0JSRUFLIDAKKworDAorLyogUmV0dXJuIG51bWJlciBvZiBhcmdzIHBhc3NlZCB0byBhIGZyYW1lLgorICAgQ2FuIHJldHVybiAtMSwgbWVhbmluZyBubyB3YXkgdG8gdGVsbC4gICovCisKKyNkZWZpbmUgRlJBTUVfTlVNX0FSR1ModmFsLCBmaSkgIFwKK3sgcmVnaXN0ZXIgQ09SRV9BRERSIHBjID0gRlJBTUVfU0FWRURfUEMgKGZpKTsJCQlcCisgIHJlZ2lzdGVyIGludCBpbnNuID0gMDE3Nzc3NyAmIHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAyKTsJXAorICB2YWwgPSAwOwkJCQkJCQlcCisgIGlmIChpbnNuID09IDAwNDc3NTcgfHwgaW5zbiA9PSAwMTU3Mzc0KSAgLyogbGVhIFcoc3ApLHNwIG9yIGFkZGF3ICNXLHNwICovIFwKKyAgICB2YWwgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYyArIDIsIDIpOwkJCVwKKyAgZWxzZSBpZiAoKGluc24gJiAwMTcwNzc3KSA9PSAwMDUwMjE3IC8qIGFkZHFsICNOLCBzcCAqLwlcCisJICAgfHwgKGluc24gJiAwMTcwNzc3KSA9PSAwMDUwMTE3KSAgLyogYWRkcXcgKi8JCVwKKyAgICB7IHZhbCA9IChpbnNuID4+IDkpICYgNzsgaWYgKHZhbCA9PSAwKSB2YWwgPSA4OyB9CQlcCisgIGVsc2UgaWYgKGluc24gPT0gMDE1Nzc3NCkgLyogYWRkYWwgI1dXLCBzcCAqLwkJCVwKKyAgICB2YWwgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYyArIDIsIDQpOwkJCVwKKyAgdmFsID4+PSAyOyB9CisKKy8qIFB1dCBoZXJlIHRoZSBjb2RlIHRvIHN0b3JlLCBpbnRvIGEgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MsCisgICB0aGUgYWRkcmVzc2VzIG9mIHRoZSBzYXZlZCByZWdpc3RlcnMgb2YgZnJhbWUgZGVzY3JpYmVkIGJ5IEZSQU1FX0lORk8uCisgICBUaGlzIGluY2x1ZGVzIHNwZWNpYWwgcmVnaXN0ZXJzIHN1Y2ggYXMgcGMgYW5kIGZwIHNhdmVkIGluIHNwZWNpYWwKKyAgIHdheXMgaW4gdGhlIHN0YWNrIGZyYW1lLiAgc3AgaXMgZXZlbiBtb3JlIHNwZWNpYWw6CisgICB0aGUgYWRkcmVzcyB3ZSByZXR1cm4gZm9yIGl0IElTIHRoZSBzcCBmb3IgdGhlIG5leHQgZnJhbWUuICAqLworCisjZGVmaW5lIEZSQU1FX0ZJTkRfU0FWRURfUkVHUyhmcmFtZV9pbmZvLCBmcmFtZV9zYXZlZF9yZWdzKQkJXAoreyByZWdpc3RlciBpbnQgcmVnbnVtOwkJCQkJCQlcCisgIHJlZ2lzdGVyIGludCByZWdtYXNrOwkJCQkJCQlcCisgIHJlZ2lzdGVyIENPUkVfQUREUiBuZXh0X2FkZHI7CQkJCQkJXAorICByZWdpc3RlciBDT1JFX0FERFIgcGM7CQkJCQkJXAorICByZWdpc3RlciBpbnQgaW5zbjsJCQkJCQkJXAorICByZWdpc3RlciBpbnQgb2Zmc2V0OwkJCQkJCQlcCisgIG1lbXNldCAoJmZyYW1lX3NhdmVkX3JlZ3MsICdcMCcsIHNpemVvZiBmcmFtZV9zYXZlZF9yZWdzKTsJCQlcCisgIGlmICgoZnJhbWVfaW5mbyktPnBjID49IChmcmFtZV9pbmZvKS0+ZnJhbWUgLSBDQUxMX0RVTU1ZX0xFTkdUSCAtIEZQX1JFR05VTSo0IC0gOCoxMiAtIDQgXAorICAgICAgJiYgKGZyYW1lX2luZm8pLT5wYyA8PSAoZnJhbWVfaW5mbyktPmZyYW1lKQkJCQlcCisgICAgeyBuZXh0X2FkZHIgPSAoZnJhbWVfaW5mbyktPmZyYW1lOwkJCQkJXAorICAgICAgcGMgPSAoZnJhbWVfaW5mbyktPmZyYW1lIC0gQ0FMTF9EVU1NWV9MRU5HVEggLSBGUF9SRUdOVU0gKiA0IC0gOCoxMiAtIDQ7IH1cCisgIGVsc2UgICAJCQkJCQkJCVwKKyAgICB7IHBjID0gZ2V0X3BjX2Z1bmN0aW9uX3N0YXJ0ICgoZnJhbWVfaW5mbyktPnBjKTsgCQkJXAorICAgICAgLyogVmVyaWZ5IHdlIGhhdmUgYSBsaW5rIGE2IGluc3RydWN0aW9uIG5leHQsCQkJXAorCSBvciBhIGJyYW5jaCBmb2xsb3dlZCBieSBhIGxpbmsgYTYgaW5zdHJ1Y3Rpb247CQkJXAorCSBpZiBub3Qgd2UgbG9zZS4gIElmIHdlIHdpbiwgZmluZCB0aGUgYWRkcmVzcyBhYm92ZSB0aGUgc2F2ZWQgICBcCisJIHJlZ3MgdXNpbmcgdGhlIGFtb3VudCBvZiBzdG9yYWdlIGZyb20gdGhlIGxpbmsgaW5zdHJ1Y3Rpb24uICAqL1wKK3JldHJ5OgkJCQkJCQkJCVwKKyAgICAgIGluc24gPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgMik7CQkJCVwKKyAgICAgIGlmIChpbnNuID09IDA0NDAxNikJCQkJCQlcCisJbmV4dF9hZGRyID0gKGZyYW1lX2luZm8pLT5mcmFtZSAtIHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjICs9IDIsIDQpLCBwYys9NDsgXAorICAgICAgZWxzZSBpZiAoaW5zbiA9PSAwNDcxMjYpCQkJCQkJXAorCW5leHRfYWRkciA9IChmcmFtZV9pbmZvKS0+ZnJhbWUgLSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYyArPSAyLCAyKSwgcGMrPTI7IFwKKyAgICAgIGVsc2UgaWYgKChpbnNuICYgMDE3NzQwMCkgPT0gMDYwMDAwKQkvKiBicmEgaW5zbiAqLwkJXAorCXsgb2Zmc2V0ID0gaW5zbiAmIDAzNzc7CQkJCQkJXAorICAgICAgICAgIHBjICs9IDI7CQkJCS8qIGFkdmFuY2UgcGFzdCBicmEgKi8JXAorCSAgaWYgKG9mZnNldCA9PSAwKQkJCS8qIGJyYSAjd29yZCAqLwkJXAorCSAgICBvZmZzZXQgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgMiksIHBjICs9IDI7CQlcCisJICBlbHNlIGlmIChvZmZzZXQgPT0gMDM3NykJCS8qIGJyYSAjbG9uZyAqLwkJXAorCSAgICBvZmZzZXQgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgNCksIHBjICs9IDQ7CQlcCisJICBwYyArPSBvZmZzZXQ7CQkJCQkJCVwKKwkgIGdvdG8gcmV0cnk7CQkJCQkJCVwKKyAgICAgIH0gZWxzZSBnb3RvIGxvc2U7CQkJCQkJCVwKKyAgICAgIC8qIElmIGhhdmUgYW4gYWRkYWwgIy1uLCBzcCBuZXh0LCBhZGp1c3QgbmV4dF9hZGRyLiAgKi8JCVwKKyAgICAgIGlmICgoMDE3Nzc3NyAmIHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAyKSkgPT0gMDE1Nzc3NCkJCVwKKwluZXh0X2FkZHIgKz0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMgKz0gMiwgNCksIHBjICs9IDQ7CQlcCisgICAgfQkJCQkJCQkJCVwKKyAgLyogbmV4dCBzaG91bGQgYmUgYSBtb3ZlbWwgdG8gKHNwKSBvciAtKHNwKSBvciBhIG1vdmwgciwtKHNwKSAqLwlcCisgIGluc24gPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgMiksIHBjICs9IDI7CQkJCVwKKyAgcmVnbWFzayA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAyKTsJCQkJXAorICBpZiAoKGluc24gJiAwMTc3NzYwKSA9PSAwMjI3MDApCS8qIG1vdmwgcm4sIChzcCkgKi8JCVwKKyAgICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1soaW5zbiY3KSArICgoaW5zbiYwMTApPzg6MCldID0gbmV4dF9hZGRyOwlcCisgIGVsc2UgaWYgKChpbnNuICYgMDE3Nzc2MCkgPT0gMDI0NzAwKQkvKiBtb3ZsIHJuLCAtKHNwKSAqLwkJXAorICAgIChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzWyhpbnNuJjcpICsgKChpbnNuJjAxMCk/ODowKV0gPSBuZXh0X2FkZHItPTQ7IFwKKyAgZWxzZSBpZiAoaW5zbiA9PSAwMDQ0MzI3KQkJLyogbW92ZW1sIG1hc2ssIChzcCkgKi8JCVwKKyAgICB7IHBjICs9IDI7CQkJCQkJCQlcCisgICAgICAvKiBSZWdtYXNrJ3MgbG93IGJpdCBpcyBmb3IgcmVnaXN0ZXIgMCwgdGhlIGZpcnN0IHdyaXR0ZW4gKi8JXAorICAgICAgbmV4dF9hZGRyIC09IDQ7CQkJCQkJCVwKKyAgICAgIGZvciAocmVnbnVtID0gMDsgcmVnbnVtIDwgMTY7IHJlZ251bSsrLCByZWdtYXNrID4+PSAxKQkJXAorCWlmIChyZWdtYXNrICYgMSkJCQkJCQlcCisgICAgICAgICAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbcmVnbnVtXSA9IChuZXh0X2FkZHIgKz0gNCk7CQlcCisgIH0gZWxzZSBpZiAoaW5zbiA9PSAwMDQ0MzQ3KQkJLyogbW92ZW1sIG1hc2ssIC0oc3ApICovCVwKKyAgICB7IHBjICs9IDI7CQkJCQkJCQlcCisgICAgICAvKiBSZWdtYXNrJ3MgbG93IGJpdCBpcyBmb3IgcmVnaXN0ZXIgMTUsIHRoZSBmaXJzdCBwdXNoZWQgKi8JXAorICAgICAgZm9yIChyZWdudW0gPSAxNTsgcmVnbnVtID49IDA7IHJlZ251bS0tLCByZWdtYXNrID4+PSAxKQkJXAorCWlmIChyZWdtYXNrICYgMSkJCQkJCQlcCisgICAgICAgICAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbcmVnbnVtXSA9IChuZXh0X2FkZHIgLT0gNCk7IH0JCVwKKyAgLyogY2xydyAtKHNwKTsgbW92dyBjY3IsLShzcCkgbWF5IGZvbGxvdy4gICovCQkJCVwKKyAgaWYgKHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAyKSA9PSAwNDExNDcgCQkJCVwKKyAgICAgICYmIHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjKzIsIDIpID09IDA0MjM0NykJCQlcCisgICAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbUFNfUkVHTlVNXSA9IChuZXh0X2FkZHIgLT0gNCk7CQlcCisgIGxvc2U6IDsJCQkJCQkJCVwKKyAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbU1BfUkVHTlVNXSA9IChmcmFtZV9pbmZvKS0+ZnJhbWUgKyA4OwkJXAorICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tGUF9SRUdOVU1dID0gKGZyYW1lX2luZm8pLT5mcmFtZTsJCVwKKyAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbUENfUkVHTlVNXSA9IChmcmFtZV9pbmZvKS0+ZnJhbWUgKyA0OwkJXAorfQorCisvKiBUaGUgb25seSByZWFzb24gdGhpcyBpcyBoZXJlIGlzIHRoZSB0bS1pc2kuaCByZWZlcmVuY2UgYmVsb3cuICBJdAorICAgd2FzIG1vdmVkIGJhY2sgaGVyZSBmcm9tIHRtLW02OGsuaC4gIEZJWE1FPyAqLworCisjZGVmaW5lIFNLSVBfUFJPTE9HVUUocGMpICAgXAoreyByZWdpc3RlciBpbnQgb3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgMik7CVwKKyAgaWYgKG9wID09IDAwNDcxMjYpCQkJCQlcCisgICAgcGMgKz0gNDsgICAvKiBTa2lwIGxpbmsgI3dvcmQgKi8JCQlcCisgIGVsc2UgaWYgKG9wID09IDAwNDQwMTYpCQkJCVwKKyAgICBwYyArPSA2OyAgIC8qIFNraXAgbGluayAjbG9uZyAqLwkJCVwKKyAgLyogTm90IHN1cmUgd2h5IGJyYW5jaGVzIGFyZSBoZXJlLiAgKi8JCVwKKyAgLyogRnJvbSB0bS1pc2kuaCwgdG0tYWx0b3MuaCAqLwkJCVwKKyAgZWxzZSBpZiAob3AgPT0gMDA2MDAwMCkJCQkJXAorICAgIHBjICs9IDQ7ICAgLyogU2tpcCBicmEgI3dvcmQgKi8JCQlcCisgIGVsc2UgaWYgKG9wID09IDAwNjAwMzc3KQkJCQlcCisgICAgcGMgKz0gNjsgICAvKiBza2lwIGJyYSAjbG9uZyAqLwkJCVwKKyAgZWxzZSBpZiAoKG9wICYgMDE3NzQwMCkgPT0gMDA2MDAwMCkJCQlcCisgICAgcGMgKz0gMjsgICAvKiBza2lwIGJyYSAjY2hhciAqLwkJCVwKK30KKworI2luY2x1ZGUgIm02OGsvdG0tbTY4ay5oIgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3RtLWxpbnV4LmggYi9nZGIvY29uZmlnL202OGsvdG0tbGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzExOTk4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3RtLWxpbnV4LmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qIERlZmluaXRpb25zIHRvIHRhcmdldCBHREIgdG8gTGludXggb24gbTY4MHgwCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBOdW1iZXIgb2YgdHJhcHMgdGhhdCBoYXBwZW4gYmV0d2VlbiBleGVjJ2luZyB0aGUgc2hlbGwgdG8gcnVuIGFuCisgICBpbmZlcmlvciwgYW5kIHdoZW4gd2UgZmluYWxseSBnZXQgdG8gdGhlIGluZmVyaW9yIGNvZGUuICBUaGlzIGlzIDIKKyAgIG9uIG1vc3QgaW1wbGVtZW50YXRpb25zLiAgKi8KKworI2RlZmluZSBTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCAyCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgYXJlIGFwcHJvcHJpYXRlIHdoZW4gdXNpbmcgdGhlIEVMRgorICAgZm9ybWF0LCB3aGVyZSBmbG9hdGluZyBwb2ludCB2YWx1ZXMgYXJlIHJldHVybmVkIGluIGZwMCwgcG9pbnRlcgorICAgdmFsdWVzIGluIGEwIGFuZCBvdGhlciB2YWx1ZXMgaW4gZDAuICAqLworCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlIGEKKyAgIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwKKyAgIGZvcm1hdCwgaW50byBWQUxCVUYuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKFRZUEUsUkVHQlVGLFZBTEJVRikgXAorewkJCQkJCQkJCVwKKyAgaWYgKFRZUEVfQ09ERSAoVFlQRSkgPT0gVFlQRV9DT0RFX0ZMVCkJCQkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICAgUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMIChGUDBfUkVHTlVNLCBUWVBFLAkJCVwKKwkJCQkgICAgKChjaGFyICopIChSRUdCVUYpCQkJXAorCQkJCSAgICAgKyBSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNKSksCVwKKwkJCQkgICAgVkFMQlVGKTsJCQkJXAorICAgIH0JCQkJCQkJCQlcCisgIGVsc2UgaWYgKFRZUEVfQ09ERSAoVFlQRSkgPT0gVFlQRV9DT0RFX1BUUikJCQkJXAorICAgIG1lbWNweSAoVkFMQlVGLCAoY2hhciAqKSAoUkVHQlVGKSArIFJFR0lTVEVSX0JZVEUgKEEwX1JFR05VTSksCVwKKwkgICAgVFlQRV9MRU5HVEggKFRZUEUpKTsJCQkJCVwKKyAgZWxzZQkJCQkJCQkJCVwKKyAgICBtZW1jcHkgKFZBTEJVRiwJCQkJCQkJXAorCSAgICAoKGNoYXIgKikgKFJFR0JVRikJCQkJCQlcCisJICAgICArIChUWVBFX0xFTkdUSCAoVFlQRSkgPj0gNCA/IDAgOiA0IC0gVFlQRV9MRU5HVEggKFRZUEUpKSksCVwKKwkgICAgVFlQRV9MRU5HVEggKFRZUEUpKTsJCQkJCVwKK30KKworLyogV3JpdGUgaW50byBhcHByb3ByaWF0ZSByZWdpc3RlcnMgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgb2YgdHlwZQorICAgVFlQRSwgZ2l2ZW4gaW4gdmlydHVhbCBmb3JtYXQuICAqLworCisjZGVmaW5lIFNUT1JFX1JFVFVSTl9WQUxVRShUWVBFLFZBTEJVRikgXAorewkJCQkJCQkJCVwKKyAgaWYgKFRZUEVfQ09ERSAoVFlQRSkgPT0gVFlQRV9DT0RFX0ZMVCkJCQkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBjaGFyIHJhd19idWZmZXJbUkVHSVNURVJfUkFXX1NJWkUgKEZQMF9SRUdOVU0pXTsJCQlcCisgICAgICBSRUdJU1RFUl9DT05WRVJUX1RPX1JBVyAoVFlQRSwgRlAwX1JFR05VTSwgVkFMQlVGLCByYXdfYnVmZmVyKTsJXAorICAgICAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKFJFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pLAkJCVwKKwkJCSAgICByYXdfYnVmZmVyLCBUWVBFX0xFTkdUSCAoVFlQRSkpOwkJXAorICAgIH0JCQkJCQkJCQlcCisgIGVsc2UJCQkJCQkJCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIGlmIChUWVBFX0NPREUgKFRZUEUpID09IFRZUEVfQ09ERV9QVFIpCQkJCVwKKwl3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSAoQTBfUkVHTlVNKSwgVkFMQlVGLAlcCisJCQkgICAgICBUWVBFX0xFTkdUSCAoVFlQRSkpOwkJCVwKKyAgICAgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzICgwLCBWQUxCVUYsIFRZUEVfTEVOR1RIIChUWVBFKSk7CQlcCisgICAgfQkJCQkJCQkJCVwKK30KKworI2luY2x1ZGUgInRtLXN5c3Y0LmgiCisjaW5jbHVkZSAibTY4ay90bS1tNjhrLmgiCisKKy8qIEV4dHJhY3QgZnJvbSBhbiBhcnJheSBSRUdCVUYgY29udGFpbmluZyB0aGUgKHJhdykgcmVnaXN0ZXIgc3RhdGUKKyAgIHRoZSBhZGRyZXNzIGluIHdoaWNoIGEgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBpdHMgc3RydWN0dXJlIHZhbHVlLAorICAgYXMgYSBDT1JFX0FERFIgKG9yIGFuIGV4cHJlc3Npb24gdGhhdCBjYW4gYmUgdXNlZCBhcyBvbmUpLiAgKi8KKworI3VuZGVmIEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MKKyNkZWZpbmUgRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyhSRUdCVUYpIFwKKyAgKCooQ09SRV9BRERSICopKChjaGFyICopIChSRUdCVUYpICsgUkVHSVNURVJfQllURSAoQTBfUkVHTlVNKSkpCisKKy8qIE9mZnNldHMgKGluIHRhcmdldCBpbnRzKSBpbnRvIGptcF9idWYuICAqLworCisjZGVmaW5lIEpCX0VMRU1FTlRfU0laRSA0CisjZGVmaW5lIEpCX1BDIDcKKworLyogRmlndXJlIG91dCB3aGVyZSB0aGUgbG9uZ2ptcCB3aWxsIGxhbmQuICBTbHVycCB0aGUgYXJncyBvdXQgb2YgdGhlIHN0YWNrLgorICAgV2UgZXhwZWN0IHRoZSBmaXJzdCBhcmcgdG8gYmUgYSBwb2ludGVyIHRvIHRoZSBqbXBfYnVmIHN0cnVjdHVyZSBmcm9tIHdoaWNoCisgICB3ZSBleHRyYWN0IHRoZSBwYyAoSkJfUEMpIHRoYXQgd2Ugd2lsbCBsYW5kIGF0LiAgVGhlIHBjIGlzIGNvcGllZCBpbnRvIEFERFIuCisgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MgKi8KKworI2RlZmluZSBHRVRfTE9OR0pNUF9UQVJHRVQoQUREUikgZ2V0X2xvbmdqbXBfdGFyZ2V0KEFERFIpCisKKy8qIE9mZnNldCB0byBzYXZlZCBQQyBpbiBzaWdjb250ZXh0LCBmcm9tIDxhc20vc2lnY29udGV4dC5oPi4gICovCisjZGVmaW5lIFNJR0NPTlRFWFRfUENfT0ZGU0VUIDI2CisKKyN1bmRlZiBGUkFNRV9TQVZFRF9QQworI2RlZmluZSBGUkFNRV9TQVZFRF9QQyhGUkFNRSkgXAorICAoKChGUkFNRSktPnNpZ25hbF9oYW5kbGVyX2NhbGxlciBcCisgICAgPyBzaWd0cmFtcF9zYXZlZF9wYyAoRlJBTUUpIFwKKyAgICA6IHJlYWRfbWVtb3J5X2ludGVnZXIgKChGUkFNRSktPmZyYW1lICsgNCwgNCkpKQorCitleHRlcm4gQ09SRV9BRERSIHNpZ3RyYW1wX3NhdmVkX3BjIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworI2RlZmluZSBJTl9TSUdUUkFNUChwYyxuYW1lKSBpbl9zaWd0cmFtcCAocGMpCitleHRlcm4gaW50IGluX3NpZ3RyYW1wIFBBUkFNUyAoKENPUkVfQUREUiBwYykpOwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3RtLW02OGsuaCBiL2dkYi9jb25maWcvbTY4ay90bS1tNjhrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4NTAwYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay90bS1tNjhrLmgKQEAgLTAsMCArMSwzOTMgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIGV4ZWN1dGlvbiBvbiBhIDY4MDAwIHNlcmllcyBtYWNoaW5lLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTAsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogR2VuZXJpYyA2ODAwMCBzdHVmZiwgdG8gYmUgaW5jbHVkZWQgYnkgb3RoZXIgdG0tKi5oIGZpbGVzLiAgKi8KKworI2RlZmluZSBJRUVFX0ZMT0FUIDEKKworLyogRGVmaW5lIHRoZSBiaXQsIGJ5dGUsIGFuZCB3b3JkIG9yZGVyaW5nIG9mIHRoZSBtYWNoaW5lLiAgKi8KKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVIgQklHX0VORElBTgorCisvKiBPZmZzZXQgZnJvbSBhZGRyZXNzIG9mIGZ1bmN0aW9uIHRvIHN0YXJ0IG9mIGl0cyBjb2RlLgorICAgWmVybyBvbiBtb3N0IG1hY2hpbmVzLiAgKi8KKworI2RlZmluZSBGVU5DVElPTl9TVEFSVF9PRkZTRVQgMAorCisvKiBBZHZhbmNlIFBDIGFjcm9zcyBhbnkgZnVuY3Rpb24gZW50cnkgcHJvbG9ndWUgaW5zdHJ1Y3Rpb25zCisgICB0byByZWFjaCBzb21lICJyZWFsIiBjb2RlLiAgKi8KKworI2lmICFkZWZpbmVkKFNLSVBfUFJPTE9HVUUpCisjZGVmaW5lIFNLSVBfUFJPTE9HVUUoaXApICAgeyhpcCkgPSBtNjhrX3NraXBfcHJvbG9ndWUoaXApO30KK2V4dGVybiBDT1JFX0FERFIgbTY4a19za2lwX3Byb2xvZ3VlIFBBUkFNUyAoKENPUkVfQUREUiBpcCkpOworI2VuZGlmCisKKy8qIEltbWVkaWF0ZWx5IGFmdGVyIGEgZnVuY3Rpb24gY2FsbCwgcmV0dXJuIHRoZSBzYXZlZCBwYy4KKyAgIENhbid0IGFsd2F5cyBnbyB0aHJvdWdoIHRoZSBmcmFtZXMgZm9yIHRoaXMgYmVjYXVzZSBvbiBzb21lIG1hY2hpbmVzCisgICB0aGUgbmV3IGZyYW1lIGlzIG5vdCBzZXQgdXAgdW50aWwgdGhlIG5ldyBmdW5jdGlvbiBleGVjdXRlcworICAgc29tZSBpbnN0cnVjdGlvbnMuICAqLworCisjaWZkZWYgX19TVERDX18KK3N0cnVjdCBmcmFtZV9pbmZvOworc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3M7CisjZW5kaWYKKworZXh0ZXJuIENPUkVfQUREUiBtNjhrX3NhdmVkX3BjX2FmdGVyX2NhbGwgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworZXh0ZXJuIHZvaWQgbTY4a19maW5kX3NhdmVkX3JlZ3MgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKiwgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKikpOworCisjZGVmaW5lIFNBVkVEX1BDX0FGVEVSX0NBTEwoZnJhbWUpIFwKKyAgbTY4a19zYXZlZF9wY19hZnRlcl9jYWxsKGZyYW1lKQorCisvKiBTdGFjayBncm93cyBkb3dud2FyZC4gICovCisKKyNkZWZpbmUgSU5ORVJfVEhBTihsaHMscmhzKSAoKGxocykgPCAocmhzKSkKKworLyogU3RhY2sgbXVzdCBiZSBrZXB0IHNob3J0IGFsaWduZWQgd2hlbiBkb2luZyBmdW5jdGlvbiBjYWxscy4gICovCisKKyNkZWZpbmUgU1RBQ0tfQUxJR04oQUREUikgKCgoQUREUikgKyAxKSAmIH4xKQorCisvKiBTZXF1ZW5jZSBvZiBieXRlcyBmb3IgYnJlYWtwb2ludCBpbnN0cnVjdGlvbi4KKyAgIFRoaXMgaXMgYSBUUkFQIGluc3RydWN0aW9uLiAgVGhlIGxhc3QgNCBiaXRzICgweGYgYmVsb3cpIGlzIHRoZQorICAgdmVjdG9yLiAgU3lzdGVtcyB3aGljaCBkb24ndCB1c2UgMHhmIHNob3VsZCBkZWZpbmUgQlBUX1ZFQ1RPUgorICAgdGhlbXNlbHZlcyBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZS4gICovCisKKyNpZiAhZGVmaW5lZCAoQlBUX1ZFQ1RPUikKKyNkZWZpbmUgQlBUX1ZFQ1RPUiAweGYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKEJSRUFLUE9JTlQpCisjZGVmaW5lIEJSRUFLUE9JTlQgezB4NGUsICgweDQwIHwgQlBUX1ZFQ1RPUil9CisjZW5kaWYKKworLyogV2UgZGVmYXVsdCB0byB2ZWN0b3IgMSBmb3IgdGhlICJyZW1vdGUiIHRhcmdldCwgYnV0IGFsbG93IHRhcmdldHMKKyAgIHRvIG92ZXJyaWRlLiAgKi8KKyNpZiAhZGVmaW5lZCAoUkVNT1RFX0JQVF9WRUNUT1IpCisjZGVmaW5lIFJFTU9URV9CUFRfVkVDVE9SIDEKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKFJFTU9URV9CUkVBS1BPSU5UKQorI2RlZmluZSBSRU1PVEVfQlJFQUtQT0lOVCB7MHg0ZSwgKDB4NDAgfCBSRU1PVEVfQlBUX1ZFQ1RPUil9CisjZW5kaWYKKworLyogSWYgeW91ciBrZXJuZWwgcmVzZXRzIHRoZSBwYyBhZnRlciB0aGUgdHJhcCBoYXBwZW5zIHlvdSBtYXkgbmVlZCB0bworICAgZGVmaW5lIHRoaXMgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUuICAqLworCisjaWYgIWRlZmluZWQgKERFQ1JfUENfQUZURVJfQlJFQUspCisjZGVmaW5lIERFQ1JfUENfQUZURVJfQlJFQUsgMgorI2VuZGlmCisKKy8qIFNheSBob3cgbG9uZyAob3JkaW5hcnkpIHJlZ2lzdGVycyBhcmUuICBUaGlzIGlzIGEgcGllY2Ugb2YgYm9nb3NpdHkKKyAgIHVzZWQgaW4gcHVzaF93b3JkIGFuZCBhIGZldyBvdGhlciBwbGFjZXM7IFJFR0lTVEVSX1JBV19TSVpFIGlzIHRoZQorICAgcmVhbCB3YXkgdG8ga25vdyBob3cgYmlnIGEgcmVnaXN0ZXIgaXMuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1NJWkUgNAorCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTX0ZQICgxNio0ICsgOCArIDgqMTIgKyAzKjQpCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTX05PRlAgKDE2KjQgKyA4KQorCisjaWZuZGVmIE5VTV9SRUdTCisjZGVmaW5lIE5VTV9SRUdTIDI5CisjZW5kaWYKKworI2RlZmluZSBOVU1fRlJFR1MgKE5VTV9SRUdTLTI0KQorCisjaWZuZGVmIFJFR0lTVEVSX0JZVEVTX09LCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTX09LKGIpIFwKKyAgICgoYikgPT0gUkVHSVNURVJfQllURVNfRlAgXAorICAgIHx8IChiKSA9PSBSRUdJU1RFUl9CWVRFU19OT0ZQKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHSVNURVJfQllURVMKKyNkZWZpbmUgUkVHSVNURVJfQllURVMgKDE2KjQgKyA4ICsgOCoxMiArIDMqNCkKKyNlbmRpZgorCisvKiBJbmRleCB3aXRoaW4gYHJlZ2lzdGVycycgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNwYWNlIGZvcgorICAgcmVnaXN0ZXIgTi4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfQllURShOKSAgXAorICgoTikgPj0gRlBDX1JFR05VTSA/ICgoKE4pIC0gRlBDX1JFR05VTSkgKiA0KSArIDE2OAlcCisgIDogKE4pID49IEZQMF9SRUdOVU0gPyAoKChOKSAtIEZQMF9SRUdOVU0pICogMTIpICsgNzIJXAorICA6IChOKSAqIDQpCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBhY3R1YWwgbWFjaGluZSByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICBPbiB0aGUgNjgwMDAsIGFsbCByZWdzIGFyZSA0IGJ5dGVzCisgICBleGNlcHQgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ3Mgd2hpY2ggYXJlIDEyIGJ5dGVzLiAgKi8KKy8qIE5vdGUgdGhhdCB0aGUgdW5zaWduZWQgY2FzdCBoZXJlIGZvcmNlcyB0aGUgcmVzdWx0IG9mIHRoZQorICAgc3VidHJhY3Rpb24gdG8gdmVyeSBoaWdoIHBvc2l0aXZlIHZhbHVlcyBpZiBOIDwgRlAwX1JFR05VTSAqLworCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pICgoKHVuc2lnbmVkKShOKSAtIEZQMF9SRUdOVU0pIDwgOCA/IDEyIDogNCkKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIHByb2dyYW0ncyByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICBPbiB0aGUgNjgwMDAsIGFsbCByZWdzIGFyZSA0IGJ5dGVzCisgICBleGNlcHQgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ3Mgd2hpY2ggYXJlIDgtYnl0ZSBkb3VibGVzLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUoTikgKCgodW5zaWduZWQpKE4pIC0gRlAwX1JFR05VTSkgPCA4ID8gOCA6IDQpCisKKy8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfUkFXX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9SQVdfU0laRSAxMgorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1ZJUlRVQUxfU0laRSBjYW4gaGF2ZS4gICovCisKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1ZJUlRVQUxfU0laRSA4CisKKy8qIE5vbnplcm8gaWYgcmVnaXN0ZXIgTiByZXF1aXJlcyBjb252ZXJzaW9uCisgICBmcm9tIHJhdyBmb3JtYXQgdG8gdmlydHVhbCBmb3JtYXQuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0NPTlZFUlRJQkxFKE4pICgoKHVuc2lnbmVkKShOKSAtIEZQMF9SRUdOVU0pIDwgOCkKKworI2luY2x1ZGUgImZsb2F0Zm9ybWF0LmgiCisKKy8qIENvbnZlcnQgZGF0YSBmcm9tIHJhdyBmb3JtYXQgZm9yIHJlZ2lzdGVyIFJFR05VTSBpbiBidWZmZXIgRlJPTQorICAgdG8gdmlydHVhbCBmb3JtYXQgd2l0aCB0eXBlIFRZUEUgaW4gYnVmZmVyIFRPLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9DT05WRVJUX1RPX1ZJUlRVQUwoUkVHTlVNLFRZUEUsRlJPTSxUTykgXAorZG8JCQkJCQkJCQlcCisgIHsJCQkJCQkJCQlcCisgICAgRE9VQkxFU1QgZGJsX3RtcF92YWw7CQkJCQkJCVwKKyAgICBmbG9hdGZvcm1hdF90b19kb3VibGVzdCAoJmZsb2F0Zm9ybWF0X202ODg4MV9leHQsIChGUk9NKSwgJmRibF90bXBfdmFsKTsgXAorICAgIHN0b3JlX2Zsb2F0aW5nICgoVE8pLCBUWVBFX0xFTkdUSCAoVFlQRSksIGRibF90bXBfdmFsKTsJCVwKKyAgfSB3aGlsZSAoMCkKKworLyogQ29udmVydCBkYXRhIGZyb20gdmlydHVhbCBmb3JtYXQgd2l0aCB0eXBlIFRZUEUgaW4gYnVmZmVyIEZST00KKyAgIHRvIHJhdyBmb3JtYXQgZm9yIHJlZ2lzdGVyIFJFR05VTSBpbiBidWZmZXIgVE8uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXKFRZUEUsUkVHTlVNLEZST00sVE8pCVwKK2RvCQkJCQkJCQkJXAorICB7CQkJCQkJCQkJXAorICAgIERPVUJMRVNUIGRibF90bXBfdmFsOwkJCQkJCVwKKyAgICBkYmxfdG1wX3ZhbCA9IGV4dHJhY3RfZmxvYXRpbmcgKChGUk9NKSwgVFlQRV9MRU5HVEggKFRZUEUpKTsJXAorICAgIGZsb2F0Zm9ybWF0X2Zyb21fZG91Ymxlc3QgKCZmbG9hdGZvcm1hdF9tNjg4ODFfZXh0LCAmZGJsX3RtcF92YWwsIChUTykpOyBcCisgIH0gd2hpbGUgKDApCisKKy8qIFJldHVybiB0aGUgR0RCIHR5cGUgb2JqZWN0IGZvciB0aGUgInN0YW5kYXJkIiBkYXRhIHR5cGUgb2YgZGF0YSAKKyAgIGluIHJlZ2lzdGVyIE4uICBUaGlzIHNob3VsZCBiZSBpbnQgZm9yIEQwLUQ3LCBkb3VibGUgZm9yIEZQMC1GUDcsCisgICBhbmQgdm9pZCBwb2ludGVyIGZvciBhbGwgb3RoZXJzIChBMC1BNywgUEMsIFNSLCBGUENPTlRST0wgZXRjKS4KKyAgIE5vdGUsIGZvciByZWdpc3RlcnMgd2hpY2ggY29udGFpbiBhZGRyZXNzZXMgcmV0dXJuIHBvaW50ZXIgdG8gdm9pZCwgCisgICBub3QgcG9pbnRlciB0byBjaGFyLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gYXR0ZW1wdCB0byBwcmludCAKKyAgIHRoZSBzdHJpbmcgYWZ0ZXIgcHJpbnRpbmcgdGhlIGFkZHJlc3MuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRShOKSBcCisgICgodW5zaWduZWQpIChOKSA+PSBGUENfUkVHTlVNID8gbG9va3VwX3BvaW50ZXJfdHlwZSAoYnVpbHRpbl90eXBlX3ZvaWQpIDogXAorICAgKHVuc2lnbmVkKSAoTikgPj0gRlAwX1JFR05VTSA/IGJ1aWx0aW5fdHlwZV9kb3VibGUgOiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICh1bnNpZ25lZCkgKE4pID49ICBBMF9SRUdOVU0gPyBsb29rdXBfcG9pbnRlcl90eXBlIChidWlsdGluX3R5cGVfdm9pZCkgOiBcCisgICBidWlsdGluX3R5cGVfaW50KQorCisvKiBJbml0aWFsaXplciBmb3IgYW4gYXJyYXkgb2YgbmFtZXMgb2YgcmVnaXN0ZXJzLgorICAgRW50cmllcyBiZXlvbmQgdGhlIGZpcnN0IE5VTV9SRUdTIGFyZSBpZ25vcmVkLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyAgXAorIHsiZDAiLCAiZDEiLCAiZDIiLCAiZDMiLCAiZDQiLCAiZDUiLCAiZDYiLCAiZDciLCBcCisgICJhMCIsICJhMSIsICJhMiIsICJhMyIsICJhNCIsICJhNSIsICJmcCIsICJzcCIsIFwKKyAgInBzIiwgInBjIiwgIFwKKyAgImZwMCIsICJmcDEiLCAiZnAyIiwgImZwMyIsICJmcDQiLCAiZnA1IiwgImZwNiIsICJmcDciLCBcCisgICJmcGNvbnRyb2wiLCAiZnBzdGF0dXMiLCAiZnBpYWRkciIsICJmcGNvZGUiLCAiZnBmbGFncyIgfQorCisvKiBSZWdpc3RlciBudW1iZXJzIG9mIHZhcmlvdXMgaW1wb3J0YW50IHJlZ2lzdGVycy4KKyAgIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgInJlYWwiIHJlZ2lzdGVyIG51bWJlcnMsCisgICBhbmQgY29ycmVzcG9uZCB0byB0aGUgZ2VuZXJhbCByZWdpc3RlcnMgb2YgdGhlIG1hY2hpbmUsCisgICBhbmQgc29tZSBhcmUgInBob255IiByZWdpc3RlciBudW1iZXJzIHdoaWNoIGFyZSB0b28gbGFyZ2UKKyAgIHRvIGJlIGFjdHVhbCByZWdpc3RlciBudW1iZXJzIGFzIGZhciBhcyB0aGUgdXNlciBpcyBjb25jZXJuZWQKKyAgIGJ1dCBkbyBzZXJ2ZSB0byBnZXQgdGhlIGRlc2lyZWQgdmFsdWVzIHdoZW4gcGFzc2VkIHRvIHJlYWRfcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIEQwX1JFR05VTSAwCisjZGVmaW5lIEEwX1JFR05VTSA4CisjZGVmaW5lIEExX1JFR05VTSA5CisjZGVmaW5lIEZQX1JFR05VTSAxNAkJLyogQ29udGFpbnMgYWRkcmVzcyBvZiBleGVjdXRpbmcgc3RhY2sgZnJhbWUgKi8KKyNkZWZpbmUgU1BfUkVHTlVNIDE1CQkvKiBDb250YWlucyBhZGRyZXNzIG9mIHRvcCBvZiBzdGFjayAqLworI2RlZmluZSBQU19SRUdOVU0gMTYJCS8qIENvbnRhaW5zIHByb2Nlc3NvciBzdGF0dXMgKi8KKyNkZWZpbmUgUENfUkVHTlVNIDE3CQkvKiBDb250YWlucyBwcm9ncmFtIGNvdW50ZXIgKi8KKyNkZWZpbmUgRlAwX1JFR05VTSAxOAkJLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgMCAqLworI2RlZmluZSBGUENfUkVHTlVNIDI2CQkvKiA2ODg4MSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEZQU19SRUdOVU0gMjcJCS8qIDY4ODgxIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBGUElfUkVHTlVNIDI4CQkvKiA2ODg4MSBpYWRkciByZWdpc3RlciAqLworCisvKiBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUgcGxhY2UgaW4gd2hpY2ggdG8gY29weSB0aGUgc3RydWN0dXJlIHRoZQorICAgc3Vicm91dGluZSB3aWxsIHJldHVybi4gIFRoaXMgaXMgY2FsbGVkIGZyb20gY2FsbF9mdW5jdGlvbi4gKi8KKworI2RlZmluZSBTVE9SRV9TVFJVQ1RfUkVUVVJOKEFERFIsIFNQKSBcCisgIHsgd3JpdGVfcmVnaXN0ZXIgKEExX1JFR05VTSwgKEFERFIpKTsgfQorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwgZm9ybWF0LAorICAgaW50byBWQUxCVUYuICBUaGlzIGlzIGFzc3VtaW5nIHRoYXQgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIGFyZSByZXR1cm5lZAorICAgYXMgZG91YmxlcyBpbiBkMC9kMS4gICovCisKKyNpZiAhZGVmaW5lZCAoRVhUUkFDVF9SRVRVUk5fVkFMVUUpCisjZGVmaW5lIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKFRZUEUsUkVHQlVGLFZBTEJVRikgXAorICBtZW1jcHkgKChWQUxCVUYpLAkJCQkJCQlcCisJICAoY2hhciAqKShSRUdCVUYpICsJCQkJCQlcCisJICAgICAgICAgKFRZUEVfTEVOR1RIKFRZUEUpID49IDQgPyAwIDogNCAtIFRZUEVfTEVOR1RIKFRZUEUpKSwJXAorCSAgVFlQRV9MRU5HVEgoVFlQRSkpCisjZW5kaWYKKworLyogV3JpdGUgaW50byBhcHByb3ByaWF0ZSByZWdpc3RlcnMgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUKKyAgIG9mIHR5cGUgVFlQRSwgZ2l2ZW4gaW4gdmlydHVhbCBmb3JtYXQuICBBc3N1bWVzIGZsb2F0cyBhcmUgcGFzc2VkCisgICBpbiBkMC9kMS4gICovCisKKyNpZiAhZGVmaW5lZCAoU1RPUkVfUkVUVVJOX1ZBTFVFKQorI2RlZmluZSBTVE9SRV9SRVRVUk5fVkFMVUUoVFlQRSxWQUxCVUYpIFwKKyAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKDAsIFZBTEJVRiwgVFlQRV9MRU5HVEggKFRZUEUpKQorI2VuZGlmCisKKy8qIEV4dHJhY3QgZnJvbSBhbiBhcnJheSBSRUdCVUYgY29udGFpbmluZyB0aGUgKHJhdykgcmVnaXN0ZXIgc3RhdGUKKyAgIHRoZSBhZGRyZXNzIGluIHdoaWNoIGEgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBpdHMgc3RydWN0dXJlIHZhbHVlLAorICAgYXMgYSBDT1JFX0FERFIgKG9yIGFuIGV4cHJlc3Npb24gdGhhdCBjYW4gYmUgdXNlZCBhcyBvbmUpLiAgKi8KKworI2RlZmluZSBFWFRSQUNUX1NUUlVDVF9WQUxVRV9BRERSRVNTKFJFR0JVRikgKCooQ09SRV9BRERSICopKFJFR0JVRikpCisMCisvKiBEZXNjcmliZSB0aGUgcG9pbnRlciBpbiBlYWNoIHN0YWNrIGZyYW1lIHRvIHRoZSBwcmV2aW91cyBzdGFjayBmcmFtZQorICAgKGl0cyBjYWxsZXIpLiAgKi8KKworLyogRlJBTUVfQ0hBSU4gdGFrZXMgYSBmcmFtZSdzIG5vbWluYWwgYWRkcmVzcyBhbmQgcHJvZHVjZXMgdGhlIGZyYW1lJ3MKKyAgIGNoYWluLXBvaW50ZXIuCisgICBJbiB0aGUgY2FzZSBvZiB0aGUgNjgwMDAsIHRoZSBmcmFtZSdzIG5vbWluYWwgYWRkcmVzcworICAgaXMgdGhlIGFkZHJlc3Mgb2YgYSA0LWJ5dGUgd29yZCBjb250YWluaW5nIHRoZSBjYWxsaW5nIGZyYW1lJ3MgYWRkcmVzcy4gICovCisKKy8qIElmIHdlIGFyZSBjaGFpbmluZyBmcm9tIHNpZ3RyYW1wLCB0aGVuIG1hbnVmYWN0dXJlIGEgc2lndHJhbXAgZnJhbWUKKyAgICh3aGljaCBpc24ndCByZWFsbHkgb24gdGhlIHN0YWNrLiAgSSdtIG5vdCBzdXJlIHRoaXMgaXMgcmlnaHQgZm9yIGFueXRoaW5nCisgICBidXQgQlNENC4zIG9uIGFuIGhwMzAwLiAgKi8KKyNkZWZpbmUgRlJBTUVfQ0hBSU4odGhpc2ZyYW1lKSAgXAorICAodGhpc2ZyYW1lLT5zaWduYWxfaGFuZGxlcl9jYWxsZXIgXAorICAgPyB0aGlzZnJhbWUtPmZyYW1lIFwKKyAgIDogKCFpbnNpZGVfZW50cnlfZmlsZSAoKHRoaXNmcmFtZSktPnBjKSBcCisgICAgICA/IHJlYWRfbWVtb3J5X2ludGVnZXIgKCh0aGlzZnJhbWUpLT5mcmFtZSwgNCkgXAorICAgICAgOiAwKSkKKworLyogRGVmaW5lIG90aGVyIGFzcGVjdHMgb2YgdGhlIHN0YWNrIGZyYW1lLiAgKi8KKworLyogQSBtYWNybyB0aGF0IHRlbGxzIHVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGludm9jYXRpb24gcmVwcmVzZW50ZWQKKyAgIGJ5IEZJIGRvZXMgbm90IGhhdmUgYSBmcmFtZSBvbiB0aGUgc3RhY2sgYXNzb2NpYXRlZCB3aXRoIGl0LiAgSWYgaXQKKyAgIGRvZXMgbm90LCBGUkFNRUxFU1MgaXMgc2V0IHRvIDEsIGVsc2UgMC4gICovCisjZGVmaW5lIEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OKEZJLCBGUkFNRUxFU1MpIFwKKyAgZG8geyBcCisgICAgaWYgKChGSSktPnNpZ25hbF9oYW5kbGVyX2NhbGxlcikgXAorICAgICAgKEZSQU1FTEVTUykgPSAwOyBcCisgICAgZWxzZSBcCisgICAgICAoRlJBTUVMRVNTKSA9IGZyYW1lbGVzc19sb29rX2Zvcl9wcm9sb2d1ZShGSSk7IFwKKyAgfSB3aGlsZSAoMCkKKworLyogVGhpcyB3YXMgZGV0ZXJtaW5lZCBieSBleHBlcmltZW50YXRpb24gb24gaHAzMDAgQlNEIDQuMy4gIFBlcmhhcHMKKyAgIGl0IGNvcnJlc3BvbmRzIHRvIHNvbWUgb2Zmc2V0IGluIC91c3IvaW5jbHVkZS9zeXMvdXNlci5oIG9yCisgICBzb21ldGhpbmcgbGlrZSB0aGF0LiAgVXNpbmcgc29tZSBzeXN0ZW0gaW5jbHVkZSBmaWxlIHdvdWxkCisgICBoYXZlIHRoZSBhZHZhbnRhZ2Ugb2YgcHJvYmFibHkgYmVpbmcgbW9yZSByb2J1c3QgaW4gdGhlIGZhY2UKKyAgIG9mIE9TIHVwZ3JhZGVzLCBidXQgdGhlIGRpc2FkdmFudGFnZSBvZiBiZWluZyB3cm9uZyBmb3IKKyAgIGNyb3NzLWRlYnVnZ2luZy4gICovCisKKyNkZWZpbmUgU0lHX1BDX0ZQX09GRlNFVCA1MzAKKworI2RlZmluZSBGUkFNRV9TQVZFRF9QQyhGUkFNRSkgXAorICAoKChGUkFNRSktPnNpZ25hbF9oYW5kbGVyX2NhbGxlciBcCisgICAgPyAoKEZSQU1FKS0+bmV4dCBcCisgICAgICAgPyByZWFkX21lbW9yeV9pbnRlZ2VyICgoRlJBTUUpLT5uZXh0LT5mcmFtZSArIFNJR19QQ19GUF9PRkZTRVQsIDQpIFwKKyAgICAgICA6IHJlYWRfbWVtb3J5X2ludGVnZXIgKHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSkgXAorCQkJICAgICAgKyBTSUdfUENfRlBfT0ZGU0VUIC0gOCwgNCkgXAorICAgICAgICkgXAorICAgIDogcmVhZF9tZW1vcnlfaW50ZWdlciAoKEZSQU1FKS0+ZnJhbWUgKyA0LCA0KSkgXAorICAgKQorCisjZGVmaW5lIEZSQU1FX0FSR1NfQUREUkVTUyhmaSkgKChmaSktPmZyYW1lKQorCisjZGVmaW5lIEZSQU1FX0xPQ0FMU19BRERSRVNTKGZpKSAoKGZpKS0+ZnJhbWUpCisKKy8qIFNldCBWQUwgdG8gdGhlIG51bWJlciBvZiBhcmdzIHBhc3NlZCB0byBmcmFtZSBkZXNjcmliZWQgYnkgRkkuCisgICBDYW4gc2V0IFZBTCB0byAtMSwgbWVhbmluZyBubyB3YXkgdG8gdGVsbC4gICovCisKKy8qIFdlIGNhbid0IHRlbGwgaG93IG1hbnkgYXJncyB0aGVyZSBhcmUKKyAgIG5vdyB0aGF0IHRoZSBDIGNvbXBpbGVyIGRlbGF5cyBwb3BwaW5nIHRoZW0uICAqLworI2lmICFkZWZpbmVkIChGUkFNRV9OVU1fQVJHUykKKyNkZWZpbmUgRlJBTUVfTlVNX0FSR1ModmFsLGZpKSAodmFsID0gLTEpCisjZW5kaWYKKworLyogUmV0dXJuIG51bWJlciBvZiBieXRlcyBhdCBzdGFydCBvZiBhcmdsaXN0IHRoYXQgYXJlIG5vdCByZWFsbHkgYXJncy4gICovCisKKyNkZWZpbmUgRlJBTUVfQVJHU19TS0lQIDgKKworLyogUHV0IGhlcmUgdGhlIGNvZGUgdG8gc3RvcmUsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywKKyAgIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4KKyAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbAorICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDoKKyAgIHRoZSBhZGRyZXNzIHdlIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4gICovCisKKyNpZiAhZGVmaW5lZCAoRlJBTUVfRklORF9TQVZFRF9SRUdTKQorI2RlZmluZSBGUkFNRV9GSU5EX1NBVkVEX1JFR1MoZmksZnNyKSBtNjhrX2ZpbmRfc2F2ZWRfcmVncyAoKGZpKSwgJihmc3IpKQorI2VuZGlmIC8qIG5vIEZJTkRfRlJBTUVfU0FWRURfUkVHUy4gICovCisKKwwKKy8qIFRoaW5ncyBuZWVkZWQgZm9yIG1ha2luZyB0aGUgaW5mZXJpb3IgY2FsbCBmdW5jdGlvbnMuICAqLworCisvKiBUaGUgQ0FMTF9EVU1NWSBtYWNybyBpcyB0aGUgc2VxdWVuY2Ugb2YgaW5zdHJ1Y3Rpb25zLCBhcyBkaXNhc3NlbWJsZWQKKyAgIGJ5IGdkYiBpdHNlbGY6CisKKyAgIFRoZXNlIGluc3RydWN0aW9ucyBleGlzdCBvbmx5IHNvIHRoYXQgbTY4a19maW5kX3NhdmVkX3JlZ3MgY2FuIHBhcnNlCisgICB0aGVtIGFzIGEgInByb2xvZ3VlIjsgdGhleSBhcmUgbmV2ZXIgZXhlY3V0ZWQuCisKKwlmbW92ZW14IGZwMC1mcDcsc3BALQkJCTB4ZjIyNyAweGUwZmYKKwltb3ZlbWwgZDAtYTUsc3BALQkJCTB4NDhlNyAweGZmZmMKKwljbHJ3IHNwQC0JCQkJMHg0MjY3CisJbW92ZXcgY2NyLHNwQC0JCQkJMHg0MmU3CisKKyAgIFRoZSBhcmd1bWVudHMgYXJlIHB1c2hlZCBhdCB0aGlzIHBvaW50IGJ5IEdEQjsgbm8gY29kZSBpcyBuZWVkZWQgaW4KKyAgIHRoZSBkdW1teSBmb3IgdGhpcy4gIFRoZSBDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCBnaXZlcyB0aGUgcG9zaXRpb24KKyAgIG9mIHRoZSBmb2xsb3dpbmcganNyIGluc3RydWN0aW9uLiAgVGhhdCBpcyB3aGVyZSB3ZSBzdGFydAorICAgZXhlY3V0aW5nLgorCisJanNyIEAjMHgzMjMyMzIzMgkJCTB4NGViOSAweDMyMzIgMHgzMjMyCisJYWRkYWwgIzB4Njk2OTY5Njksc3AJCQkweGRmZmMgMHg2OTY5IDB4Njk2OQorCXRyYXAgIzx5b3VyIEJQVF9WRUNUT1IgbnVtYmVyIGhlcmU+CTB4NGU0PworCW5vcAkJCQkJMHg0ZTcxCisKKyAgIE5vdGUgdGhpcyBpcyBDQUxMX0RVTU1ZX0xFTkdUSCBieXRlcyAoMjggZm9yIHRoZSBhYm92ZSBleGFtcGxlKS4KKworICAgVGhlIGR1bW15IGZyYW1lIGFsd2F5cyBzYXZlcyB0aGUgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzLCB3aGV0aGVyIHRoZXkKKyAgIGFjdHVhbGx5IGV4aXN0IG9uIHRoaXMgdGFyZ2V0IG9yIG5vdC4gICovCisKKy8qIEZJWE1FOiBXcm9uZyB0byBoYXJkd2lyZSB0aGlzIGFzIEJQVF9WRUNUT1Igd2hlbiBzb21ldGltZXMgaXQKKyAgIHNob3VsZCBiZSBSRU1PVEVfQlBUX1ZFQ1RPUi4gIEJlc3Qgd2F5IHRvIGZpeCBpdCB3b3VsZCBiZSB0byBkZWZpbmUKKyAgIENBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQuICAqLworCisjZGVmaW5lIENBTExfRFVNTVkgezB4ZjIyN2UwZmYsIDB4NDhlN2ZmZmMsIDB4NDI2NzQyZTcsIDB4NGViOTMyMzIsIDB4MzIzMmRmZmMsIDB4Njk2OTY5NjksICgweDRlNDA0ZTcxIHwgKEJQVF9WRUNUT1IgPDwgMTYpKX0KKyNkZWZpbmUgQ0FMTF9EVU1NWV9MRU5HVEggMjgJCS8qIFNpemUgb2YgQ0FMTF9EVU1NWSAqLworI2RlZmluZSBDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCAxMgkvKiBPZmZzZXQgdG8ganNyIGluc3RydWN0aW9uKi8KKyNkZWZpbmUgQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVCAoQ0FMTF9EVU1NWV9TVEFSVF9PRkZTRVQgKyAxMikKKworLyogSW5zZXJ0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGFyZ3MgYW5kIGZ1bmN0aW9uIGFkZHJlc3MKKyAgIGludG8gYSBjYWxsIHNlcXVlbmNlIG9mIHRoZSBhYm92ZSBmb3JtIHN0b3JlZCBhdCBEVU1NWU5BTUUuCisgICBXZSB1c2UgdGhlIEJGRCByb3V0aW5lcyB0byBzdG9yZSBhIGJpZy1lbmRpYW4gdmFsdWUgb2Yga25vd24gc2l6ZS4gICovCisKKyNkZWZpbmUgRklYX0NBTExfRFVNTVkoZHVtbXluYW1lLCBwYywgZnVuLCBuYXJncywgYXJncywgdHlwZSwgZ2NjX3ApICAgICBcCit7IGJmZF9wdXRiMzIgKGZ1biwgICAgICh1bnNpZ25lZCBjaGFyICopIGR1bW15bmFtZSArIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUICsgMik7ICBcCisgIGJmZF9wdXRiMzIgKG5hcmdzKjQsICh1bnNpZ25lZCBjaGFyICopIGR1bW15bmFtZSArIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUICsgOCk7IH0KKworLyogUHVzaCBhbiBlbXB0eSBzdGFjayBmcmFtZSwgdG8gcmVjb3JkIHRoZSBjdXJyZW50IFBDLCBldGMuICAqLworCisjZGVmaW5lIFBVU0hfRFVNTVlfRlJBTUUJeyBtNjhrX3B1c2hfZHVtbXlfZnJhbWUgKCk7IH0KKworZXh0ZXJuIHZvaWQgbTY4a19wdXNoX2R1bW15X2ZyYW1lIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgbTY4a19wb3BfZnJhbWUgUEFSQU1TICgodm9pZCkpOworCisvKiBEaXNjYXJkIGZyb20gdGhlIHN0YWNrIHRoZSBpbm5lcm1vc3QgZnJhbWUsIHJlc3RvcmluZyBhbGwgcmVnaXN0ZXJzLiAgKi8KKworI2RlZmluZSBQT1BfRlJBTUUJCXsgbTY4a19wb3BfZnJhbWUgKCk7IH0KKworLyogT2Zmc2V0IGZyb20gU1AgdG8gZmlyc3QgYXJnIG9uIHN0YWNrIGF0IGZpcnN0IGluc3RydWN0aW9uIG9mIGEgZnVuY3Rpb24gKi8KKworI2RlZmluZSBTUF9BUkcwICgxICogNCkKKworI2RlZmluZSBUQVJHRVRfTTY4SwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3RtLW02OGtseW54LmggYi9nZGIvY29uZmlnL202OGsvdG0tbTY4a2x5bnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmU1NzA3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3RtLW02OGtseW54LmgKQEAgLTAsMCArMSwzOCBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIE1vdG9yb2xhIDY4MHgwIHJ1bm5pbmcgdW5kZXIgTHlueE9TLgorICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBUTV9NNjhLTFlOWF9ICisjZGVmaW5lIFRNX002OEtMWU5YX0gKKworI2luY2x1ZGUgInRtLWx5bnguaCIKKworLyogSWYgUEMtMiBjb250YWlucyB0aGlzIGluc3RydWN0aW9uLCB0aGVuIHdlIGtub3cgd2hhdCB3ZSBhcmUgaW4gYSBzeXN0ZW0KKyAgIGNhbGwgc3R1YiwgYW5kIHRoZSByZXR1cm4gUEMgaXMgaXMgYXQgU1ArNCwgaW5zdGVhZCBvZiBTUC4gKi8KKworI2RlZmluZSBTWVNDQUxMX1RSQVAgMHg0ZTRhCS8qIHRyYXAgIzEwICovCisjZGVmaW5lIFNZU0NBTExfVFJBUF9PRkZTRVQgMgkvKiBQQyBpcyBhZnRlciB0cmFwIGluc3RydWN0aW9uICovCisKKy8qIFVzZSB0aGUgZ2VuZXJpYyA2OGsgZGVmaW5pdGlvbnMuICovCisKKyNpbmNsdWRlICJtNjhrL3RtLW02OGsuaCIKKworLyogRGlzYWJsZSBkdW1ic2hpdCBhbHRlcm5hdGUgYnJlYWtwb2ludCBtZWNoYW5pc20gbmVlZGVkIGJ5IDY4ayBzdHViLiAqLworI3VuZGVmIFJFTU9URV9CUkVBS1BPSU5UCisKKyNlbmRpZiAvKiBUTV9NNjhLTFlOWF9IICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvdG0tbTY4a3Y0LmggYi9nZGIvY29uZmlnL202OGsvdG0tbTY4a3Y0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczMDYwNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay90bS1tNjhrdjQuaApAQCAtMCwwICsxLDcwIEBACisvKiBUYXJnZXQgZGVmaW5pdGlvbnMgZm9yIEdEQiBvbiBhIE1vdG9yb2xhIDY4MHgwIHJ1bm5pbmcgU1ZSNC4KKyAgIChDb21tb2RvcmUgQW1pZ2Egd2l0aCBhbWl4IG9yIEF0YXJpIFRUIHdpdGggQVNWKQorICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggYXQgQ3lnbnVzIFN1cHBvcnQgKGZuZkBjeWdpbnQpCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogRGVmaW5lIEJQVF9WRUNUT1IgaWYgaXQgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGRlZmF1bHQuCisgICBUaGlzIGlzIHRoZSB2ZWN0b3IgbnVtYmVyIHVzZWQgYnkgdHJhcHMgdG8gaW5kaWNhdGUgYSBicmVha3BvaW50LiAqLworCisjZGVmaW5lIEJQVF9WRUNUT1IgMHgxCisKKy8qIEhvdyBtdWNoIHRvIGRlY3JlbWVudCB0aGUgUEMgYWZ0ZXIgYSB0cmFwLiAgRGVwZW5kcyBvbiBrZXJuZWwuICovCisKKyNkZWZpbmUgREVDUl9QQ19BRlRFUl9CUkVBSyAwCQkvKiBObyBkZWNyZW1lbnQgcmVxdWlyZWQgKi8KKworLyogVXNlIHRoZSBhbHRlcm5hdGUgbWV0aG9kIG9mIGRldGVybWluaW5nIHZhbGlkIGZyYW1lIGNoYWlucy4gKi8KKworI2RlZmluZSBGUkFNRV9DSEFJTl9WQUxJRChmcCxmaSkgYWx0ZXJuYXRlX2ZyYW1lX2NoYWluX3ZhbGlkIChmcCwgZmkpCisKKyNpbmNsdWRlICJ0bS1zeXN2NC5oIgorI2luY2x1ZGUgIm02OGsvdG0tbTY4ay5oIgorCisvKiBPZmZzZXRzIChpbiB0YXJnZXQgaW50cykgaW50byBqbXBfYnVmLiAgTm90IGRlZmluZWQgaW4gYW55IHN5c3RlbSBoZWFkZXIKKyAgIGZpbGUsIHNvIHdlIGhhdmUgdG8gc3RlcCB0aHJvdWdoIHNldGptcC9sb25nam1wIHdpdGggYSBkZWJ1Z2dlciBhbmQgZmlndXJlCisgICB0aGVtIG91dC4gIEFzIGEgZG91YmxlIGNoZWNrLCBub3RlIHRoYXQgPHNldGptcD4gZGVmaW5lcyBfSkJMRU4gYXMgMTMsCisgICB3aGljaCBtYXRjaGVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgd2Ugc2VlIHNhdmVkIGJ5IHNldGptcCgpLiAqLworCisjZGVmaW5lIEpCX0VMRU1FTlRfU0laRSBzaXplb2YoaW50KQkvKiBqbXBfYnVmW19KQkxFTl0gaXMgYXJyYXkgb2YgaW50cyAqLworCisjZGVmaW5lIEpCX0QyCTAKKyNkZWZpbmUgSkJfRDMJMQorI2RlZmluZSBKQl9ENAkyCisjZGVmaW5lIEpCX0Q1CTMKKyNkZWZpbmUgSkJfRDYJNAorI2RlZmluZSBKQl9ENwk1CisjZGVmaW5lIEpCX0ExCTYKKyNkZWZpbmUgSkJfQTIJNworI2RlZmluZSBKQl9BMwk4CisjZGVmaW5lIEpCX0E0CTkKKyNkZWZpbmUgSkJfQTUJMTAKKyNkZWZpbmUgSkJfQTYJMTEKKyNkZWZpbmUgSkJfQTcJMTIKKworI2RlZmluZSBKQl9QQwlKQl9BMQkvKiBTZXRqbXAoKSdzIHJldHVybiBQQyBzYXZlZCBpbiBBMSAqLworCisvKiBGaWd1cmUgb3V0IHdoZXJlIHRoZSBsb25nam1wIHdpbGwgbGFuZC4gIFNsdXJwIHRoZSBhcmdzIG91dCBvZiB0aGUgc3RhY2suCisgICBXZSBleHBlY3QgdGhlIGZpcnN0IGFyZyB0byBiZSBhIHBvaW50ZXIgdG8gdGhlIGptcF9idWYgc3RydWN0dXJlIGZyb20gd2hpY2gKKyAgIHdlIGV4dHJhY3QgdGhlIHBjIChKQl9QQykgdGhhdCB3ZSB3aWxsIGxhbmQgYXQuICBUaGUgcGMgaXMgY29waWVkIGludG8gQUREUi4KKyAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRydWUgb24gc3VjY2VzcyAqLworCisjZGVmaW5lIEdFVF9MT05HSk1QX1RBUkdFVChBRERSKSBnZXRfbG9uZ2ptcF90YXJnZXQoQUREUikKK2V4dGVybiBpbnQgZ2V0X2xvbmdqbXBfdGFyZ2V0IFBBUkFNUyAoKENPUkVfQUREUiAqKSk7CisKKy8qIENvbnZlcnQgYSBEV0FSRiByZWdpc3RlciBudW1iZXIgdG8gYSBnZGIgUkVHTlVNLiAgKi8KKyNkZWZpbmUgRFdBUkZfUkVHX1RPX1JFR05VTShudW0pICgobnVtKSA8IDE2ID8gKG51bSkgOiAobnVtKStGUDBfUkVHTlVNLTE2KQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3RtLW1hYy5oIGIvZ2RiL2NvbmZpZy9tNjhrL3RtLW1hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjRmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvdG0tbWFjLmgKQEAgLTAsMCArMSwyMCBAQAorLyogVGFyZ2V0LWRlcGVuZGVudCBkZWZpbml0aW9ucyBmb3IgTWFjIHJ1bm5pbmcgTWFjT1MuCisgICBDb3B5cmlnaHQgKEMpIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgIm02OGsvdG0tbTY4ay5oIgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3RtLW1vbml0b3IuaCBiL2dkYi9jb25maWcvbTY4ay90bS1tb25pdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0OGQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay90bS1tb25pdG9yLmgKQEAgLTAsMCArMSw0NCBAQAorLyogVGFyZ2V0IG1hY2hpbmUgZGVmaW5pdGlvbnMgZm9yIGEgZ2VuZXJpYyBtNjhrIG1vbml0b3IvZW11bGF0b3IuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODksIDE5OTMsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhlIGRlZmluaXRpb25zIGhlcmUgYXJlIGFwcHJvcHJpYXRlIGZvciBzZXZlcmFsIGVtYmVkZGVkIG02OGstYmFzZWQKKyAgIHRhcmdldHMsIGluY2x1ZGluZyBJRFAgKHJvbTY4ayksIEJDQyAoY3B1MzJidWcpLCBhbmQgRVNUJ3MgZW11bGF0b3IuICAqLworCisvKiBHQ0MgaXMgcHJvYmFibHkgdGhlIG9ubHkgY29tcGlsZXIgdXNlZCBvbiB0aGlzIGNvbmZpZ3VyYXRpb24uICBTbworICAgZ2V0IHRoaXMgcmlnaHQgZXZlbiBpZiB0aGUgY29kZSB3aGljaCBkZXRlY3RzIGdjYzJfY29tcGlsZWQuIGlzCisgICBzdGlsbCBicm9rZW4uICAqLworCisjZGVmaW5lIEJFTElFVkVfUENDX1BST01PVElPTiAxCisKKy8qIFRoZSB0YXJnZXQgc3lzdGVtIGhhbmRsZXMgYnJlYWtwb2ludHMuICAqLworCisjZGVmaW5lIERFQ1JfUENfQUZURVJfQlJFQUsgMAorCisvKiBObyBmbG9hdCByZWdpc3RlcnMuICAqLworCisvKiNkZWZpbmUgTlVNX1JFR1MgMTgqLworCisjaW5jbHVkZSAibTY4ay90bS1tNjhrLmgiCisKKy8qIE5lZWQgdG8gZG8gdGhpcyBmb3IgRUxGIHRhcmdldHMsIHdoZXJlIHdlIGNhbid0IGZpZ3VyZSBvdXQgdGhlIGJvdW5kYXJpZXMgb2YKKyAgIHRoZSBlbnRyeSBmaWxlLiAgVGhpcyBtZXRob2Qgc3RvcHMgdGhlIGJhY2t0cmFjZSB3aGVuIHdlIHJlYWNoIG1haW4uICAqLworCisjZGVmaW5lIEZSQU1FX0NIQUlOX1ZBTElEKGZwLGZpKSBhbHRlcm5hdGVfZnJhbWVfY2hhaW5fdmFsaWQgKGZwLCBmaSkKKworLyogRklYTUUsIHNob3VsZCBkbyBHRVRfTE9OR0pNUF9UQVJHRVQgZm9yIG5ld2xpYi4gICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvdG0tbmJzZC5oIGIvZ2RiL2NvbmZpZy9tNjhrL3RtLW5ic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzg2Y2M4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3RtLW5ic2QuaApAQCAtMCwwICsxLDQxIEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgaTM4NiBydW5uaW5nIHVuZGVyIE5ldEJTRC4KKyAgIENvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgVE1fTkJTRF9ICisjZGVmaW5lIFRNX05CU0RfSAorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+CisKKy8qIERlZmluZSBCUFRfVkVDVE9SIGlmIGl0IGlzIGRpZmZlcmVudCB0aGFuIHRoZSBkZWZhdWx0LgorICAgVGhpcyBpcyB0aGUgdmVjdG9yIG51bWJlciB1c2VkIGJ5IHRyYXBzIHRvIGluZGljYXRlIGEgYnJlYWtwb2ludC4gKi8KKworI2RlZmluZSBCUFRfVkVDVE9SIDB4MgorCisvKiBBZGRyZXNzIG9mIGVuZCBvZiBzdGFjayBzcGFjZS4gICovCisjZGVmaW5lIFNUQUNLX0VORF9BRERSIFVTUlNUQUNLCisKKy8qIEZvciBOZXRCU0QsIHNpZ3RyYW1wIGlzIDMyIGJ5dGVzIGJlZm9yZSBTVEFDS19FTkRfQUREUi4gICovCisjZGVmaW5lIFNJR1RSQU1QX1NUQVJUKHBjKSAoU1RBQ0tfRU5EX0FERFIgLSAzMikKKyNkZWZpbmUgU0lHVFJBTVBfRU5EKHBjKSAoU1RBQ0tfRU5EX0FERFIpCisKKyNpbmNsdWRlICJtNjhrL3RtLW02OGsuaCIKKyNpbmNsdWRlICJ0bS1uYnNkLmgiCisKKyNlbmRpZiAvKiBUTV9OQlNEX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay90bS1uZXdzLmggYi9nZGIvY29uZmlnL202OGsvdG0tbmV3cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmY2E0NDYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvdG0tbmV3cy5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIGV4ZWN1dGlvbiBvbiBhIFNvbnkvTkVXUywgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTg3LCAxOTg5LCAxOTkxLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFNlZSBmb2xsb3dpbmcgY3B1IHR5cGUgZGV0ZXJtaW5hdGlvbiBtYWNybyB0byBnZXQgdGhlIG1hY2hpbmUgdHlwZS4KKworSGVyZSBpcyBhbiBtLW5ld3MuaCBmaWxlIGZvciBnZGIuICBJdCBzdXBwb3J0cyB0aGUgNjg4ODEgcmVnaXN0ZXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGhpa2ljaGlAc3JhdmEuc3JhLmp1bmV0CisKKyogUHRyYWNlIGZvciBoYW5kbGluZyBmbG9hdGluZyByZWdpc3RlciBoYXMgYSBidWcoYmVmb3JlIE5FV1MgT1MgdmVyc2lvbiAyLjIpLAorKiBBZnRlciBORVdTIE9TIHZlcnNpb24gMy4yLCBzb21lIG9mIHB0cmFjZSdzIGJ1ZyBpcyBmaXhlZC4KKyAgQnV0IHdlIGNhbm5vdCBjaGFuZ2UgdGhlIGZsb2F0aW5nIHJlZ2lzdGVyKHNlZSBhZGIoMSkgaW4gT1MgMy4yKSB5ZXQuICAqLworCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwgZm9ybWF0LAorICAgaW50byBWQUxCVUYuICAqLworCisvKiB3aGVuIGl0IHJldHVybiB0aGUgZmxvYXRpbmcgdmFsdWUsIHVzZSB0aGUgRlAwIGluIE5FV1MuICAqLworI2RlZmluZSBFWFRSQUNUX1JFVFVSTl9WQUxVRShUWVBFLFJFR0JVRixWQUxCVUYpIFwKKyAgeyBpZiAoVFlQRV9DT0RFIChUWVBFKSA9PSBUWVBFX0NPREVfRkxUKSBcCisgICAgICB7IFwKKwlSRUdJU1RFUl9DT05WRVJUX1RPX1ZJUlRVQUwgKEZQMF9SRUdOVU0sIFRZUEUsIFwKKwkJCSAgICAgICAgICAgICAmUkVHQlVGW1JFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pXSwgXAorCQkJCSAgICAgVkFMQlVGKTsgXAorICAgICAgfSBcCisgICAgZWxzZSBcCisgICAgICBtZW1jcHkgKFZBTEJVRiwgUkVHQlVGLCBUWVBFX0xFTkdUSCAoVFlQRSkpOyB9CisKKy8qIFdyaXRlIGludG8gYXBwcm9wcmlhdGUgcmVnaXN0ZXJzIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlCisgICBvZiB0eXBlIFRZUEUsIGdpdmVuIGluIHZpcnR1YWwgZm9ybWF0LiAgKi8KKworLyogd2hlbiBpdCByZXR1cm4gdGhlIGZsb2F0aW5nIHZhbHVlLCB1c2UgdGhlIEZQMCBpbiBORVdTLiAgKi8KKyNkZWZpbmUgU1RPUkVfUkVUVVJOX1ZBTFVFKFRZUEUsVkFMQlVGKSBcCisgIHsgaWYgKFRZUEVfQ09ERSAoVFlQRSkgPT0gVFlQRV9DT0RFX0ZMVCkgXAorICAgICAgeyBcCisJY2hhciByYXdfYnVmW1JFR0lTVEVSX1JBV19TSVpFIChGUDBfUkVHTlVNKV07IFwKKwlSRUdJU1RFUl9DT05WRVJUX1RPX1JBVyAoVFlQRSwgRlAwX1JFR05VTSwgVkFMQlVGLCByYXdfYnVmKTsgXAorCXdyaXRlX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNKSwgXAorCQkJICAgICAgcmF3X2J1ZiwgUkVHSVNURVJfUkFXX1NJWkUgKEZQMF9SRUdOVU0pKTsgXAorICAgICAgfSBcCisgICAgZWxzZSBcCisgICAgICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoMCwgVkFMQlVGLCBUWVBFX0xFTkdUSCAoVFlQRSkpOyB9CisKKy8qIFJldHVybiBudW1iZXIgb2YgYXJncyBwYXNzZWQgdG8gYSBmcmFtZS4KKyAgIENhbiByZXR1cm4gLTEsIG1lYW5pbmcgbm8gd2F5IHRvIHRlbGwuICAqLworCisjZGVmaW5lIEZSQU1FX05VTV9BUkdTKHZhbCwgZmkpICBcCit7IHJlZ2lzdGVyIENPUkVfQUREUiBwYyA9IEZSQU1FX1NBVkVEX1BDIChmaSk7CQkJXAorICByZWdpc3RlciBpbnQgaW5zbiA9IDAxNzc3NzcgJiByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgMik7CVwKKyAgdmFsID0gMDsJCQkJCQkJXAorICBpZiAoaW5zbiA9PSAwMDQ3NzU3IHx8IGluc24gPT0gMDE1NzM3NCkgIC8qIGxlYSBXKHNwKSxzcCBvciBhZGRhdyAjVyxzcCAqLyBcCisgICAgdmFsID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMgKyAyLCAyKTsJCQlcCisgIGVsc2UgaWYgKChpbnNuICYgMDE3MDc3NykgPT0gMDA1MDIxNyAvKiBhZGRxbCAjTiwgc3AgKi8JXAorCSAgIHx8IChpbnNuICYgMDE3MDc3NykgPT0gMDA1MDExNykgIC8qIGFkZHF3ICovCQlcCisgICAgeyB2YWwgPSAoaW5zbiA+PiA5KSAmIDc7IGlmICh2YWwgPT0gMCkgdmFsID0gODsgfQkJXAorICBlbHNlIGlmIChpbnNuID09IDAxNTc3NzQpIC8qIGFkZGFsICNXVywgc3AgKi8JCQlcCisgICAgdmFsID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMgKyAyLCA0KTsJCQlcCisgIHZhbCA+Pj0gMjsgfQorCisjaW5jbHVkZSAibTY4ay90bS1tNjhrLmgiCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvdG0tb3M2OGsuaCBiL2dkYi9jb25maWcvbTY4ay90bS1vczY4ay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OTU3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvdG0tb3M2OGsuaApAQCAtMCwwICsxLDQ2IEBACisvKiBQYXJhbWV0ZXJzIGZvciBleGVjdXRpb24gb24gVnhXb3JrcyBtNjhrJ3MsIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lCUdEQklOSVRfRklMRU5BTUUJIi5vczY4Z2RiaW5pdCIKKworI2RlZmluZQlERUZBVUxUX1BST01QVAkJIihvczY4aykgIgorCisjaW5jbHVkZSAibTY4ay90bS1tNjhrLmgiCisKKy8qIFdlIGhhdmUgbW9yZSBjb21wbGV4LCB1c2VmdWwgYnJlYWtwb2ludHMgb24gdGhlIHRhcmdldC4gICovCisjdW5kZWYgREVDUl9QQ19BRlRFUl9CUkVBSworI2RlZmluZQlERUNSX1BDX0FGVEVSX0JSRUFLCTAKKworLyogVGFrZXMgdGhlIGN1cnJlbnQgZnJhbWUtc3RydWN0IHBvaW50ZXIgYW5kIHJldHVybnMgdGhlIGNoYWluLXBvaW50ZXIKKyAgIHRvIGdldCB0byB0aGUgY2FsbGluZyBmcmFtZS4KKworICAgSWYgb3VyIGN1cnJlbnQgZnJhbWUgcG9pbnRlciBpcyB6ZXJvLCB3ZSdyZSBhdCB0aGUgdG9wOyBlbHNlIHJlYWQgb3V0CisgICB0aGUgc2F2ZWQgRlAgZnJvbSBtZW1vcnkgcG9pbnRlZCB0byBieSB0aGUgY3VycmVudCBGUC4gICovCisKKyN1bmRlZglGUkFNRV9DSEFJTgorI2RlZmluZSBGUkFNRV9DSEFJTih0aGlzZnJhbWUpICgodGhpc2ZyYW1lKS0+ZnJhbWU/IHJlYWRfbWVtb3J5X2ludGVnZXIgKCh0aGlzZnJhbWUpLT5mcmFtZSwgNCk6IDApCisKKy8qIElmIHRoZSBjaGFpbiBwb2ludGVyIGlzIHplcm8gKGVpdGhlciBiZWNhdXNlIHRoZSBzYXZlZCB2YWx1ZSBmZXRjaGVkCisgICBieSBGUkFNRV9DSEFJTiB3YXMgemVybywgb3IgYmVjYXVzZSB0aGUgY3VycmVudCBGUCB3YXMgemVybyBzbyBGUkFNRV9DSEFJTgorICAgbmV2ZXIgZmV0Y2hlZCBhbnl0aGluZyksIHdlIGFyZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay4gICovCisvKiBXZSBhcmUgZ3VhcmFudGVlZCB0byBoYXZlIGEgemVybyBmcmFtZSBwb2ludGVyIGF0IGJvdHRvbSBvZiBzdGFjaywgdG9vLiAqLworCisjdW5kZWYgRlJBTUVfQ0hBSU5fVkFMSUQKKyNkZWZpbmUgRlJBTUVfQ0hBSU5fVkFMSUQoY2hhaW4sIHRoaXNmcmFtZSkgbm9ubnVsbF9mcmFtZV9jaGFpbl92YWxpZCAoY2hhaW4sIHRoaXNmcmFtZSkKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay90bS1zdDIwMDAuaCBiL2dkYi9jb25maWcvbTY4ay90bS1zdDIwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGRmMGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3RtLXN0MjAwMC5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIGEgVGFuZGVtIFNUMjAwMCBwaG9uZSBzd2l0Y2guCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODksIDE5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAibTY4ay90bS1tNjhrLmgiCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvdG0tc3VuMi5oIGIvZ2RiL2NvbmZpZy9tNjhrL3RtLXN1bjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTcwZjFlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3RtLXN1bjIuaApAQCAtMCwwICsxLDIzIEBACisvKiBQYXJhbWV0ZXJzIGZvciBleGVjdXRpb24gb24gYSBTdW4sIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhlIGNoaWxkIHRhcmdldCBjYW4ndCBkZWFsIHdpdGggZmxvYXRpbmcgcmVnaXN0ZXJzLiAgKi8KKyNkZWZpbmUgQ0FOTk9UX1NUT1JFX1JFR0lTVEVSKHJlZ25vKSAoKHJlZ25vKSA+PSBGUDBfUkVHTlVNKQorCisjaW5jbHVkZSAibTY4ay90bS1tNjhrLmgiCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsvdG0tc3VuMm9zNC5oIGIvZ2RiL2NvbmZpZy9tNjhrL3RtLXN1bjJvczQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmM3Zjk5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3RtLXN1bjJvczQuaApAQCAtMCwwICsxLDIwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTAsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJtNjhrL3RtLXN1bjIuaCIKKyNpbmNsdWRlICJ0bS1zdW5vcy5oIgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3RtLXN1bjMuaCBiL2dkYi9jb25maWcvbTY4ay90bS1zdW4zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU0NWRiNAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay90bS1zdW4zLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIGV4ZWN1dGlvbiBvbiBhIFN1biwgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIFRNX1NVTjNfSAorI2RlZmluZSBUTV9TVU4zX0gKKworLyogU3VuMyBzdGF0dXMgaW5jbHVkZXMgZnBmbGFncywgd2hpY2ggc2hvd3Mgd2hldGhlciB0aGUgRlBVIGhhcyBiZWVuIHVzZWQKKyAgIGJ5IHRoZSBwcm9jZXNzLCBhbmQgd2hldGhlciB0aGUgRlBVIHdhcyBkb25lIHdpdGggYW4gaW5zdHJ1Y3Rpb24gb3IgCisgICB3YXMgaW50ZXJydXB0ZWQgaW4gdGhlIG1pZGRsZSBvZiBhIGxvbmcgaW5zdHJ1Y3Rpb24uICBTZWUKKyAgIDxtYWNoaW5lL3JlZy5oPi4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICBhJmQsIHBjLHNyLCBmcCwgZnBzdGF0LCBmcGZsYWdzICAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9CWVRFUyAoMTYqNCArIDggKyA4KjEyICsgMyo0ICsgNCkKKworI2RlZmluZSBOVU1fUkVHUyAzMQorCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTX09LKGIpIFwKKyAgICAgKChiKSA9PSBSRUdJU1RFUl9CWVRFUyBcCisgICAgICB8fCAoYikgPT0gUkVHSVNURVJfQllURVNfRlAgXAorICAgICAgfHwgKGIpID09IFJFR0lTVEVSX0JZVEVTX05PRlApCisKKy8qIElmIFBDIGNvbnRhaW5zIHRoaXMgaW5zdHJ1Y3Rpb24sIHRoZW4gd2Uga25vdyB3aGF0IHdlIGFyZSBpbiBhIHN5c3RlbQorICAgY2FsbCBzdHViLCBhbmQgdGhlIHJldHVybiBQQyBpcyBpcyBhdCBTUCs0LCBpbnN0ZWFkIG9mIFNQLiAqLworCisjZGVmaW5lIFNZU0NBTExfVFJBUCAweDRlNDAJLyogdHJhcCAjMCAqLworI2RlZmluZSBTWVNDQUxMX1RSQVBfT0ZGU0VUIDAJLyogUEMgcG9pbnRzIGF0IHRyYXAgaW5zdHJ1Y3Rpb24gKi8KKworI2luY2x1ZGUgIm02OGsvdG0tbTY4ay5oIgorCisvKiBEaXNhYmxlIGFsdGVybmF0ZSBicmVha3BvaW50IG1lY2hhbmlzbSBuZWVkZWQgYnkgNjhrIHN0dWIuICovCisjdW5kZWYgUkVNT1RFX0JSRUFLUE9JTlQKKworLyogT2Zmc2V0cyAoaW4gdGFyZ2V0IGludHMpIGludG8gam1wX2J1Zi4gIE5vdCBkZWZpbmVkIGJ5IFN1biwgYnV0IGF0IGxlYXN0CisgICBkb2N1bWVudGVkIGluIGEgY29tbWVudCBpbiA8bWFjaGluZS9zZXRqbXAuaD4hICovCisKKyNkZWZpbmUgSkJfRUxFTUVOVF9TSVpFIDQKKworI2RlZmluZSBKQl9PTlNTVEFDSyAwCisjZGVmaW5lIEpCX1NJR01BU0sgMQorI2RlZmluZSBKQl9TUCAyCisjZGVmaW5lIEpCX1BDIDMKKyNkZWZpbmUgSkJfUFNMIDQKKyNkZWZpbmUgSkJfRDIgNQorI2RlZmluZSBKQl9EMyA2CisjZGVmaW5lIEpCX0Q0IDcKKyNkZWZpbmUgSkJfRDUgOAorI2RlZmluZSBKQl9ENiA5CisjZGVmaW5lIEpCX0Q3IDEwCisjZGVmaW5lIEpCX0EyIDExCisjZGVmaW5lIEpCX0EzIDEyCisjZGVmaW5lIEpCX0E0IDEzCisjZGVmaW5lIEpCX0E1IDE0CisjZGVmaW5lIEpCX0E2IDE1CisKKy8qIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIGxvbmdqbXAgd2lsbCBsYW5kLiAgU2x1cnAgdGhlIGFyZ3Mgb3V0IG9mIHRoZSBzdGFjay4KKyAgIFdlIGV4cGVjdCB0aGUgZmlyc3QgYXJnIHRvIGJlIGEgcG9pbnRlciB0byB0aGUgam1wX2J1ZiBzdHJ1Y3R1cmUgZnJvbSB3aGljaAorICAgd2UgZXh0cmFjdCB0aGUgcGMgKEpCX1BDKSB0aGF0IHdlIHdpbGwgbGFuZCBhdC4gIFRoZSBwYyBpcyBjb3BpZWQgaW50byBBRERSLgorICAgVGhpcyByb3V0aW5lIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzICovCisKKyNkZWZpbmUgR0VUX0xPTkdKTVBfVEFSR0VUKEFERFIpIGdldF9sb25nam1wX3RhcmdldChBRERSKQorZXh0ZXJuIGludCBnZXRfbG9uZ2ptcF90YXJnZXQgUEFSQU1TICgoQ09SRV9BRERSICopKTsKKworLyogSWYgc3VuMyBwY2Mgc2F5cyB0aGF0IGEgcGFyYW1ldGVyIGlzIGEgc2hvcnQsIGl0J3MgYSBzaG9ydC4gICovCisjZGVmaW5lIEJFTElFVkVfUENDX1BST01PVElPTl9UWVBFCisKKy8qIENhbid0IGRlZmluZSBCRUxJRVZFX1BDQ19QUk9NT1RJT04gZm9yIFN1bk9TIC9iaW4vY2Mgb2YgU3VuT1MgNC4xLjEuCisgICBBcHBhcmVudGx5IFN1biBmaXhlZCB0aGlzIGZvciB0aGUgc3BhcmMgYnV0IG5vdCB0aGUgc3VuMy4gICovCisKKy8qIFRoZSBjb2RlIHdoaWNoIHRyaWVzIHRvIGRlYWwgd2l0aCB0aGlzIGJ1ZyBpcyBuZXZlciBoYXJtZnVsIG9uIGEgc3VuMy4gICovCisjZGVmaW5lIFNVTl9GSVhFRF9MQlJBQ19CVUcgKDApCisKKy8qIE9uIHRoZSBzdW4zIHRoZSBrZXJuZWwgcHVzaGVzIGEgc2lnY29udGV4dCBvbiB0aGUgdXNlciBzdGFjayBhbmQgdGhlbgorICAgYGNhbGxzJyBfc2lndHJhbXAgaW4gdXNlciBjb2RlLiBfc2lndHJhbXAgc2F2ZXMgdGhlIGZsb2F0aW5nIHBvaW50IHN0YXR1cworICAgb24gdGhlIHN0YWNrIGFuZCBjYWxscyB0aGUgc2lnbmFsIGhhbmRsZXIgZnVuY3Rpb24uIFRoZSBzdGFjayBkb2VzIG5vdAorICAgY29udGFpbiBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYWxsb3cgYSBub3JtYWwgYmFja3RyYWNlLCBidXQgc2lnY29udGV4dAorICAgY29udGFpbnMgdGhlIHNhdmVkIHVzZXIgcGMvc3AuIEZSQU1FX0NIQUlOIGFuZCBmcmllbmRzIGluIHRtLW02OGsuaCBhbmQKKyAgIG02OGtfZmluZF9zYXZlZF9yZWdzIGRlYWwgd2l0aCB0aGlzIHNpdHVhdGlvbiBieSBtYW51ZmFjdHVyaW5nIGEgZmFrZSBmcmFtZQorICAgZm9yIF9zaWd0cmFtcC4KKyAgIFNJR19QQ19GUF9PRkZTRVQgaXMgdGhlIG9mZnNldCBmcm9tIHRoZSBzaWduYWwgaGFuZGxlciBmcmFtZSB0byB0aGUKKyAgIHNhdmVkIHBjIGluIHNpZ2NvbnRleHQuCisgICBTSUdfU1BfRlBfT0ZGU0VUIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUgc2lnbmFsIGhhbmRsZXIgZnJhbWUgdG8gdGhlIGVuZAorICAgb2Ygc2lnY29udGV4dCB3aGljaCBpcyBpZGVudGljYWwgdG8gdGhlIHNhdmVkIHNwIGF0IFNJR19QQ19GUF9PRkZTRVQgLSA0LgorCisgICBQbGVhc2Ugbm90ZSB0aGF0IGl0IGlzIGltcG9zc2libGUgdG8gY29ycmVjdGx5IGJhY2t0cmFjZSBmcm9tIGEgYnJlYWtwb2ludAorICAgaW4gX3NpZ3RyYW1wIGFzIF9zaWd0cmFtcCBtb2RpZmllcyB0aGUgc3RhY2sgcG9pbnRlciBhIGZldyB0aW1lcy4gICovCisKKyN1bmRlZiBTSUdfUENfRlBfT0ZGU0VUCisjZGVmaW5lIFNJR19QQ19GUF9PRkZTRVQgMzI0CisjZGVmaW5lIFNJR19TUF9GUF9PRkZTRVQgMzMyCisKKyNlbmRpZiAvKiBUTV9TVU4zX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay90bS1zdW4zb3M0LmggYi9nZGIvY29uZmlnL202OGsvdG0tc3VuM29zNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNzU4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvdG0tc3VuM29zNC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qIFRhcmdldCBtYWNoaW5lIHBhcmFtZXRlcnMgZm9yIFN1bi0zIHVuZGVyIFN1bk9TIDQueCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAibTY4ay90bS1zdW4zLmgiCisjaW5jbHVkZSAidG0tc3Vub3MuaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay90bS12eDY4LmggYi9nZGIvY29uZmlnL202OGsvdG0tdng2OC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MDFiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvdG0tdng2OC5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qIFRhcmdldCBtYWNoaW5lIGRlc2NyaXB0aW9uIGZvciBWeFdvcmtzIG02OGsncywgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZQlHREJJTklUX0ZJTEVOQU1FCSIudnhnZGJpbml0IgorCisjZGVmaW5lCURFRkFVTFRfUFJPTVBUCQkiKHZ4Z2RiKSAiCisKKy8qIEdDQyBpcyBwcm9iYWJseSB0aGUgb25seSBjb21waWxlciB1c2VkIG9uIHRoaXMgY29uZmlndXJhdGlvbi4gIFNvCisgICBnZXQgdGhpcyByaWdodCBldmVuIGlmIHRoZSBjb2RlIHdoaWNoIGRldGVjdHMgZ2NjMl9jb21waWxlZC4gaXMKKyAgIHN0aWxsIGJyb2tlbi4gICovCisKKyNkZWZpbmUgQkVMSUVWRV9QQ0NfUFJPTU9USU9OIDEKKworLyogV2UgaGF2ZSBtb3JlIGNvbXBsZXgsIHVzZWZ1bCBicmVha3BvaW50cyBvbiB0aGUgdGFyZ2V0LiAgKi8KKyNkZWZpbmUJREVDUl9QQ19BRlRFUl9CUkVBSwkwCisKKyNpbmNsdWRlICJtNjhrL3RtLW02OGsuaCIKKworLyogVGFrZXMgdGhlIGN1cnJlbnQgZnJhbWUtc3RydWN0IHBvaW50ZXIgYW5kIHJldHVybnMgdGhlIGNoYWluLXBvaW50ZXIKKyAgIHRvIGdldCB0byB0aGUgY2FsbGluZyBmcmFtZS4KKworICAgSWYgb3VyIGN1cnJlbnQgZnJhbWUgcG9pbnRlciBpcyB6ZXJvLCB3ZSdyZSBhdCB0aGUgdG9wOyBlbHNlIHJlYWQgb3V0CisgICB0aGUgc2F2ZWQgRlAgZnJvbSBtZW1vcnkgcG9pbnRlZCB0byBieSB0aGUgY3VycmVudCBGUC4gICovCisKKyN1bmRlZglGUkFNRV9DSEFJTgorI2RlZmluZSBGUkFNRV9DSEFJTih0aGlzZnJhbWUpICgodGhpc2ZyYW1lKS0+ZnJhbWU/IHJlYWRfbWVtb3J5X2ludGVnZXIgKCh0aGlzZnJhbWUpLT5mcmFtZSwgNCk6IDApCisKKy8qIElmIHRoZSBjaGFpbiBwb2ludGVyIGlzIHplcm8gKGVpdGhlciBiZWNhdXNlIHRoZSBzYXZlZCB2YWx1ZSBmZXRjaGVkCisgICBieSBGUkFNRV9DSEFJTiB3YXMgemVybywgb3IgYmVjYXVzZSB0aGUgY3VycmVudCBGUCB3YXMgemVybyBzbyBGUkFNRV9DSEFJTgorICAgbmV2ZXIgZmV0Y2hlZCBhbnl0aGluZyksIHdlIGFyZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay4gICovCisvKiBXZSBhcmUgZ3VhcmFudGVlZCB0byBoYXZlIGEgemVybyBmcmFtZSBwb2ludGVyIGF0IGJvdHRvbSBvZiBzdGFjaywgdG9vLiAqLworCisjdW5kZWYJRlJBTUVfQ0hBSU5fVkFMSUQKKyNkZWZpbmUgRlJBTUVfQ0hBSU5fVkFMSUQoY2hhaW4sIHRoaXNmcmFtZSkgbm9ubnVsbF9mcmFtZV9jaGFpbl92YWxpZCAoY2hhaW4sIHRoaXNmcmFtZSkKKworLyogRklYTUUsIExvbmdqbXAgaW5mb3JtYXRpb24gc3RvbGVuIGZyb20gU3VuLTMgY29uZmlnLiAgRHVubm8gaWYgcmlnaHQuICAqLworLyogT2Zmc2V0cyAoaW4gdGFyZ2V0IGludHMpIGludG8gam1wX2J1Zi4gIE5vdCBkZWZpbmVkIGJ5IFN1biwgYnV0IGF0IGxlYXN0CisgICBkb2N1bWVudGVkIGluIGEgY29tbWVudCBpbiA8bWFjaGluZS9zZXRqbXAuaD4hICovCisKKyNkZWZpbmUgSkJfRUxFTUVOVF9TSVpFIDQKKworI2RlZmluZSBKQl9PTlNTVEFDSyAwCisjZGVmaW5lIEpCX1NJR01BU0sgMQorI2RlZmluZSBKQl9TUCAyCisjZGVmaW5lIEpCX1BDIDMKKyNkZWZpbmUgSkJfUFNMIDQKKyNkZWZpbmUgSkJfRDIgNQorI2RlZmluZSBKQl9EMyA2CisjZGVmaW5lIEpCX0Q0IDcKKyNkZWZpbmUgSkJfRDUgOAorI2RlZmluZSBKQl9ENiA5CisjZGVmaW5lIEpCX0Q3IDEwCisjZGVmaW5lIEpCX0EyIDExCisjZGVmaW5lIEpCX0EzIDEyCisjZGVmaW5lIEpCX0E0IDEzCisjZGVmaW5lIEpCX0E1IDE0CisjZGVmaW5lIEpCX0E2IDE1CisKKy8qIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIGxvbmdqbXAgd2lsbCBsYW5kLiAgU2x1cnAgdGhlIGFyZ3Mgb3V0IG9mIHRoZSBzdGFjay4KKyAgIFdlIGV4cGVjdCB0aGUgZmlyc3QgYXJnIHRvIGJlIGEgcG9pbnRlciB0byB0aGUgam1wX2J1ZiBzdHJ1Y3R1cmUgZnJvbSB3aGljaAorICAgd2UgZXh0cmFjdCB0aGUgcGMgKEpCX1BDKSB0aGF0IHdlIHdpbGwgbGFuZCBhdC4gIFRoZSBwYyBpcyBjb3BpZWQgaW50byBBRERSLgorICAgVGhpcyByb3V0aW5lIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzICovCisKKyNkZWZpbmUgR0VUX0xPTkdKTVBfVEFSR0VUKEFERFIpIGdldF9sb25nam1wX3RhcmdldChBRERSKQorZXh0ZXJuIGludCBnZXRfbG9uZ2ptcF90YXJnZXQgUEFSQU1TICgoQ09SRV9BRERSICopKTsKKworLyogTnVtYmVyIG9mIHJlZ2lzdGVycyBpbiBhIHB0cmFjZV9nZXRyZWdzIGNhbGwuICovCisKKyNkZWZpbmUgVlhfTlVNX1JFR1MgKDE4KQorCisvKiBOdW1iZXIgb2YgcmVnaXN0ZXJzIGluIGEgcHRyYWNlX2dldGZwcmVncyBjYWxsLiAqLworCisjZGVmaW5lIFZYX1NJWkVfRlBSRUdTICg4ICogUkVHSVNURVJfUkFXX1NJWkUgKEZQMF9SRUdOVU0pIFwKKwkJCSsgKDMgKiBSRUdJU1RFUl9TSVpFKSkKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay92eHdvcmtzNjgubXQgYi9nZGIvY29uZmlnL202OGsvdnh3b3JrczY4Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOTc3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsvdnh3b3JrczY4Lm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IE1vdG9yb2xhIG02OGsgcnVubmluZyBWeFdvcmtzCitUREVQRklMRVM9IG02OGstdGRlcC5vIHJlbW90ZS12eC5vIHJlbW90ZS12eDY4Lm8geGRyX2xkLm8geGRyX3B0cmFjZS5vIHhkcl9yZGIubworVE1fRklMRT0gdG0tdng2OC5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsveG0tM2IxLmggYi9nZGIvY29uZmlnL202OGsveG0tM2IxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjYzdmMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay94bS0zYjEuaApAQCAtMCwwICsxLDg1IEBACisvKiBQYXJhbWV0ZXJzIGZvciBleGVjdXRpb24gb24gYSAzYjEuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgQklHX0VORElBTgorCisjZGVmaW5lIEhBVkVfVEVSTUlPCisjZGVmaW5lIFVTRworCisvKiBUaGlzIGlzIHRoZSBhbW91bnQgdG8gc3VidHJhY3QgZnJvbSB1LnVfYXIwCisgICB0byBnZXQgdGhlIG9mZnNldCBpbiB0aGUgY29yZSBmaWxlIG9mIHRoZSByZWdpc3RlciB2YWx1ZXMuICAqLworCisjZGVmaW5lIEtFUk5FTF9VX0FERFIgMHg3MDAwMAorCisjZGVmaW5lIFJFR0lTVEVSX1VfQUREUihhZGRyLCBibG9ja2VuZCwgcmVnbm8pCQlcCit7IGFkZHIgPSBibG9ja2VuZCArIHJlZ25vICogNDsgfQorDAorLyogSW50ZXJmYWNlIGRlZmluaXRpb25zIGZvciBrZXJuZWwgZGVidWdnZXIgS0RCLiAgKi8KKworLyogTWFwIG1hY2hpbmUgZmF1bHQgY29kZXMgaW50byBzaWduYWwgbnVtYmVycy4KKyAgIEZpcnN0IHN1YnRyYWN0IDAsIGRpdmlkZSBieSA0LCB0aGVuIGluZGV4IGluIGEgdGFibGUuCisgICBGYXVsdHMgZm9yIHdoaWNoIHRoZSBlbnRyeSBpbiB0aGlzIHRhYmxlIGlzIDAKKyAgIGFyZSBub3QgaGFuZGxlZCBieSBLREI7IHRoZSBwcm9ncmFtJ3Mgb3duIHRyYXAgaGFuZGxlcgorICAgZ2V0cyB0byBoYW5kbGUgdGhlbi4gICovCisKKyNkZWZpbmUgRkFVTFRfQ09ERV9PUklHSU4gMAorI2RlZmluZSBGQVVMVF9DT0RFX1VOSVRTIDQKKyNkZWZpbmUgRkFVTFRfVEFCTEUgICAgXAoreyAwLCAwLCAwLCAwLCBTSUdUUkFQLCAwLCAwLCAwLCBcCisgIDAsIFNJR1RSQVAsIDAsIDAsIDAsIDAsIDAsIFNJR0tJTEwsIFwKKyAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgXAorICBTSUdJTEwgfQorCisvKiBTdGFydCBydW5uaW5nIHdpdGggYSBzdGFjayBzdHJldGNoaW5nIGZyb20gQkVHIHRvIEVORC4KKyAgIEJFRyBhbmQgRU5EIHNob3VsZCBiZSBzeW1ib2xzIG1lYW5pbmdmdWwgdG8gdGhlIGFzc2VtYmxlci4KKyAgIFRoaXMgaXMgdXNlZCBvbmx5IGZvciBrZGIuICAqLworCisjZGVmaW5lIElOSVRfU1RBQ0soYmVnLCBlbmQpICBcCit7IGFzbSAoIi5nbG9ibCBlbmQiKTsgICAgICAgICBcCisgIGFzbSAoIm1vdmVsICQgZW5kLCBzcCIpOyAgICAgIFwKKyAgYXNtICgiY2xybCBmcCIpOyB9CisKKy8qIFB1c2ggdGhlIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIgb24gdGhlIHN0YWNrLiAgKi8KKyNkZWZpbmUgUFVTSF9GUkFNRV9QVFIgICAgICAgIFwKKyAgYXNtICgibW92ZWwgZnAsIC0oc3ApIik7CisKKy8qIENvcHkgdGhlIHRvcC1vZi1zdGFjayB0byB0aGUgZnJhbWUgcG9pbnRlciByZWdpc3Rlci4gICovCisjZGVmaW5lIFBPUF9GUkFNRV9QVFIgIFwKKyAgYXNtICgibW92bCAoc3ApLCBmcCIpOworCisvKiBBZnRlciBLREIgaXMgZW50ZXJlZCBieSBhIGZhdWx0LCBwdXNoIGFsbCByZWdpc3RlcnMKKyAgIHRoYXQgR0RCIHRoaW5rcyBhYm91dCAoYWxsIE5VTV9SRUdTIG9mIHRoZW0pLAorICAgc28gdGhhdCB0aGV5IGFwcGVhciBpbiBvcmRlciBvZiBhc2NlbmRpbmcgR0RCIHJlZ2lzdGVyIG51bWJlci4KKyAgIFRoZSBmYXVsdCBjb2RlIHdpbGwgYmUgb24gdGhlIHN0YWNrIGJleW9uZCB0aGUgbGFzdCByZWdpc3Rlci4gICovCisKKyNkZWZpbmUgUFVTSF9SRUdJU1RFUlMgICAgICAgIFwKK3sgYXNtICgiY2xydyAtKHNwKSIpOwkgICAgICBcCisgIGFzbSAoInBlYSAxMChzcCkiKTsJICAgICAgXAorICBhc20gKCJtb3ZlbSAkIDB4ZmZmZSwtKHNwKSIpOyB9CisKKy8qIEFzc3VtaW5nIHRoZSByZWdpc3RlcnMgKGluY2x1ZGluZyBwcm9jZXNzb3Igc3RhdHVzKSBoYXZlIGJlZW4KKyAgIHB1c2hlZCBvbiB0aGUgc3RhY2sgaW4gb3JkZXIgb2YgYXNjZW5kaW5nIEdEQiByZWdpc3RlciBudW1iZXIsCisgICByZXN0b3JlIHRoZW0gYW5kIHJldHVybiB0byB0aGUgYWRkcmVzcyBpbiB0aGUgc2F2ZWQgUEMgcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIFBPUF9SRUdJU1RFUlMgICAgICAgICAgXAoreyBhc20gKCJzdWJpbCAkOCwyOChzcCkiKTsgICAgIFwKKyAgYXNtICgibW92ZW0gKHNwKSwkIDB4ZmZmZiIpOyBcCisgIGFzbSAoInJ0ZSIpOyB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3htLWFsdG9zLmggYi9nZGIvY29uZmlnL202OGsveG0tYWx0b3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTkzYmQxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3htLWFsdG9zLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qIERlZmluaXRpb25zIHRvIG1ha2UgR0RCIHJ1biBvbiBhbiBBbHRvcyAzMDY4IChtNjhrIHJ1bm5pbmcgU1ZSMikKKyAgIENvcHlyaWdodCAoQykgMTk4NywxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgSE9TVF9CWVRFX09SREVSIEJJR19FTkRJQU4KKworLyogVGhlIGFsdG9zIHN1cHBvcnQgd291bGQgbWFrZSBhIGdvb2QgYmFzZSBmb3IgYSBwb3J0IHRvIG90aGVyIFVTR1IyIHN5c3RlbXMKKyAgIChsaWtlIHRoZSAzYjEgYW5kIHRoZSBDb252ZXJnZW50IG1pbmlmcmFtZSkuICAqLworCisvKiBUaGlzIGlzIG9ubHkgbmVlZGVkIGluIG9uZSBmaWxlLCBidXQgaXQncyBjbGVhbmVyIHRvIHB1dCBpdCBoZXJlIHRoYW4KKyAgIHB1dHRpbmcgaW4gbW9yZSAjaWZkZWYncy4gICovCisjaW5jbHVkZSA8c3lzL3BhZ2UuaD4KKyNpbmNsdWRlIDxzeXMvbmV0Lmg+CisKKyNkZWZpbmUgVVNHCisKKyNkZWZpbmUgSEFWRV9URVJNSU8KKworI2RlZmluZSBDQlJFQUsgWFRBQlMJLyogSXQgdGFrZXMgYWxsIGtpbmRzLi4uICovCisKKyNpZm5kZWYgUl9PSworI2RlZmluZSBSX09LIDQKKyNkZWZpbmUgV19PSyAyCisjZGVmaW5lIFhfT0sgMQorI2RlZmluZSBGX09LIDAKKyNlbmRpZgorCisvKiBHZXQgc3lzL3dhaXQuaCBpZS4gZnJvbSBhIFN1biBhbmQgZWRpdCBpdCBhIGxpdHRsZSAobWM2ODAwMCB0byBtNjhrKSAqLworLyogV2h5IGJvdGhlcj8gICovCisjaWYgMAorI2RlZmluZSBIQVZFX1dBSVRfU1RSVUNUCisjZW5kaWYKKworLyogVGhpcyBpcyB0aGUgYW1vdW50IHRvIHN1YnRyYWN0IGZyb20gdS51X2FyMAorICAgdG8gZ2V0IHRoZSBvZmZzZXQgaW4gdGhlIGNvcmUgZmlsZSBvZiB0aGUgcmVnaXN0ZXIgdmFsdWVzLiAqLworCisjZGVmaW5lIEtFUk5FTF9VX0FERFIgMHgxZmJmMDAwCisKKyNkZWZpbmUgUkVHSVNURVJfVV9BRERSKGFkZHIsIGJsb2NrZW5kLCByZWdubykJCVwKK3sJaWYgKHJlZ25vIDw9IFNQX1JFR05VTSkgXAorCSAgYWRkciA9IGJsb2NrZW5kICsgcmVnbm8gKiA0OyBcCisJZWxzZSBpZiAocmVnbm8gPT0gUFNfUkVHTlVNKSBcCisJICBhZGRyID0gYmxvY2tlbmQgKyByZWdubyAqIDQgKyA0OyBcCisJZWxzZSBpZiAocmVnbm8gPT0gUENfUkVHTlVNKSBcCisJICBhZGRyID0gYmxvY2tlbmQgKyByZWdubyAqIDQgKyAyOyBcCit9CisKKyNkZWZpbmUgUkVHSVNURVJfQUREUih1X2FyMCwgcmVnbm8pCQkJCQlcCisgICgoKHJlZ25vKSA8IFBTX1JFR05VTSkJCQkJCQlcCisgICA/ICgmKChzdHJ1Y3QgZXhjZXB0aW9uX3N0YWNrICopICh1X2FyMCkpLT5lX3JlZ3NbKHJlZ25vICsgUjApXSkJXAorICAgOiAoKChyZWdubykgPT0gUFNfUkVHTlVNKQkJCQkJCVwKKyAgICAgID8gKChpbnQgKikgKCYoKHN0cnVjdCBleGNlcHRpb25fc3RhY2sgKikgKHVfYXIwKSktPmVfUFMpKQkJXAorICAgICAgOiAoJigoc3RydWN0IGV4Y2VwdGlvbl9zdGFjayAqKSAodV9hcjApKS0+ZV9QQykpKQorCisjZGVmaW5lIEZQX1JFR0lTVEVSX0FERFIodSwgcmVnbm8pCQkJCQlcCisgICgoKGNoYXIgKikJCQkJCQkJCVwKKyAgICAoKChyZWdubykgPCBGUENfUkVHTlVNKQkJCQkJCVwKKyAgICAgPyAoJnUudV9wY2IucGNiX21jNjg4ODFbRk1DNjg4ODFfUjAgKyAoKChyZWdubykgLSBGUDBfUkVHTlVNKSAqIDMpXSkgXAorICAgICA6ICgmdS51X3BjYi5wY2JfbWM2ODg4MVtGTUM2ODg4MV9DICsgKChyZWdubykgLSBGUENfUkVHTlVNKV0pKSkJXAorICAgLSAoKGNoYXIgKikgKCYgdSkpKQorCisMCisjaWZuZGVmIF9fR05VQ19fCisjdW5kZWYgVVNFX0dBUworI2RlZmluZSBBTFRPU19BUworI2Vsc2UKKyNkZWZpbmUgVVNFX0dBUworI2VuZGlmCisKKy8qIE1vdG9yb2xhIGFzc2VtYmx5IGZvcm1hdCAqLworI2lmICFkZWZpbmVkKFVTRV9HQVMpICYmICFkZWZpbmVkKEFMVE9TKQorI2RlZmluZSBNT1RPUk9MQQorI2VuZGlmCisKKy8qIEludGVyZmFjZSBkZWZpbml0aW9ucyBmb3Iga2VybmVsIGRlYnVnZ2VyIEtEQi4gICovCisKKy8qIE1hcCBtYWNoaW5lIGZhdWx0IGNvZGVzIGludG8gc2lnbmFsIG51bWJlcnMuCisgICBGaXJzdCBzdWJ0cmFjdCAwLCBkaXZpZGUgYnkgNCwgdGhlbiBpbmRleCBpbiBhIHRhYmxlLgorICAgRmF1bHRzIGZvciB3aGljaCB0aGUgZW50cnkgaW4gdGhpcyB0YWJsZSBpcyAwCisgICBhcmUgbm90IGhhbmRsZWQgYnkgS0RCOyB0aGUgcHJvZ3JhbSdzIG93biB0cmFwIGhhbmRsZXIKKyAgIGdldHMgdG8gaGFuZGxlIHRoZW4uICAqLworCisjZGVmaW5lIEZBVUxUX0NPREVfT1JJR0lOIDAKKyNkZWZpbmUgRkFVTFRfQ09ERV9VTklUUyA0CisjZGVmaW5lIEZBVUxUX1RBQkxFICAgIFwKK3sgMCwgMCwgMCwgMCwgU0lHVFJBUCwgMCwgMCwgMCwgXAorICAwLCBTSUdUUkFQLCAwLCAwLCAwLCAwLCAwLCBTSUdLSUxMLCBcCisgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFwKKyAgU0lHSUxMIH0KKworLyogU3RhcnQgcnVubmluZyB3aXRoIGEgc3RhY2sgc3RyZXRjaGluZyBmcm9tIEJFRyB0byBFTkQuCisgICBCRUcgYW5kIEVORCBzaG91bGQgYmUgc3ltYm9scyBtZWFuaW5nZnVsIHRvIHRoZSBhc3NlbWJsZXIuCisgICBUaGlzIGlzIHVzZWQgb25seSBmb3Iga2RiLiAgKi8KKworI2lmZGVmIE1PVE9ST0xBCisjZGVmaW5lIElOSVRfU1RBQ0soYmVnLCBlbmQpICBcCit7IGFzbSAoIi5nbG9ibCBlbmQiKTsgICAgICAgICBcCisgIGFzbSAoIm1vdmUubCAkIGVuZCwgc3AiKTsgICAgICBcCisgIGFzbSAoImNsci5sIGZwIik7IH0KKyNlbHNlCisjaWZkZWYgQUxUT1NfQVMKKyNkZWZpbmUgSU5JVF9TVEFDSyhiZWcsIGVuZCkgIFwKK3sgYXNtICgiZ2xvYmFsIGVuZCIpOyAgICAgICAgIFwKKyAgYXNtICgibW92LmwgJmVuZCwlc3AiKTsgICAgICBcCisgIGFzbSAoImNsci5sICVmcCIpOyB9CisjZWxzZQorI2RlZmluZSBJTklUX1NUQUNLKGJlZywgZW5kKSAgXAoreyBhc20gKCIuZ2xvYmwgZW5kIik7ICAgICAgICAgXAorICBhc20gKCJtb3ZlbCAkIGVuZCwgc3AiKTsgICAgICBcCisgIGFzbSAoImNscmwgZnAiKTsgfQorI2VuZGlmCisjZW5kaWYKKworLyogUHVzaCB0aGUgZnJhbWUgcG9pbnRlciByZWdpc3RlciBvbiB0aGUgc3RhY2suICAqLworI2lmZGVmIE1PVE9ST0xBCisjZGVmaW5lIFBVU0hfRlJBTUVfUFRSICAgICAgICBcCisgIGFzbSAoIm1vdmUubCBmcCwgLShzcCkiKTsKKyNlbHNlCisjaWZkZWYgQUxUT1NfQVMKKyNkZWZpbmUgUFVTSF9GUkFNRV9QVFIgICAgICAgIFwKKyAgYXNtICgibW92LmwgJWZwLCAtKCVzcCkiKTsKKyNlbHNlCisjZGVmaW5lIFBVU0hfRlJBTUVfUFRSICAgICAgICBcCisgIGFzbSAoIm1vdmVsIGZwLCAtKHNwKSIpOworI2VuZGlmCisjZW5kaWYKKworLyogQ29weSB0aGUgdG9wLW9mLXN0YWNrIHRvIHRoZSBmcmFtZSBwb2ludGVyIHJlZ2lzdGVyLiAgKi8KKyNpZmRlZiBNT1RPUk9MQQorI2RlZmluZSBQT1BfRlJBTUVfUFRSICBcCisgIGFzbSAoIm1vdmUubCAoc3ApLCBmcCIpOworI2Vsc2UKKyNpZmRlZiBBTFRPU19BUworI2RlZmluZSBQT1BfRlJBTUVfUFRSICBcCisgIGFzbSAoIm1vdi5sICglc3ApLCAlZnAiKTsKKyNlbHNlCisjZGVmaW5lIFBPUF9GUkFNRV9QVFIgIFwKKyAgYXNtICgibW92bCAoc3ApLCBmcCIpOworI2VuZGlmCisjZW5kaWYKKworLyogQWZ0ZXIgS0RCIGlzIGVudGVyZWQgYnkgYSBmYXVsdCwgcHVzaCBhbGwgcmVnaXN0ZXJzCisgICB0aGF0IEdEQiB0aGlua3MgYWJvdXQgKGFsbCBOVU1fUkVHUyBvZiB0aGVtKSwKKyAgIHNvIHRoYXQgdGhleSBhcHBlYXIgaW4gb3JkZXIgb2YgYXNjZW5kaW5nIEdEQiByZWdpc3RlciBudW1iZXIuCisgICBUaGUgZmF1bHQgY29kZSB3aWxsIGJlIG9uIHRoZSBzdGFjayBiZXlvbmQgdGhlIGxhc3QgcmVnaXN0ZXIuICAqLworCisjaWZkZWYgTU9UT1JPTEEKKyNkZWZpbmUgUFVTSF9SRUdJU1RFUlMgICAgICAgIFwKK3sgYXNtICgiY2xyLncgLShzcCkiKTsJICAgICAgXAorICBhc20gKCJwZWEgKDEwLHNwKSIpOwkgICAgICBcCisgIGFzbSAoIm1vdmVtICQgMHhmZmZlLC0oc3ApIik7IH0KKyNlbHNlCisjaWZkZWYgQUxUT1NfQVMKKyNkZWZpbmUgUFVTSF9SRUdJU1RFUlMgICAgICAgIFwKK3sgYXNtICgiY2xyLncgLSglc3ApIik7CSAgICAgIFwKKyAgYXNtICgicGVhICgxMCwlc3ApIik7CSAgICAgIFwKKyAgYXNtICgibW92bS5sICYweGZmZmUsLSglc3ApIik7IH0KKyNlbHNlCisjZGVmaW5lIFBVU0hfUkVHSVNURVJTICAgICAgICBcCit7IGFzbSAoImNscncgLShzcCkiKTsJICAgICAgXAorICBhc20gKCJwZWEgMTAoc3ApIik7CSAgICAgIFwKKyAgYXNtICgibW92ZW0gJCAweGZmZmUsLShzcCkiKTsgfQorI2VuZGlmCisjZW5kaWYKKworLyogQXNzdW1pbmcgdGhlIHJlZ2lzdGVycyAoaW5jbHVkaW5nIHByb2Nlc3NvciBzdGF0dXMpIGhhdmUgYmVlbgorICAgcHVzaGVkIG9uIHRoZSBzdGFjayBpbiBvcmRlciBvZiBhc2NlbmRpbmcgR0RCIHJlZ2lzdGVyIG51bWJlciwKKyAgIHJlc3RvcmUgdGhlbSBhbmQgcmV0dXJuIHRvIHRoZSBhZGRyZXNzIGluIHRoZSBzYXZlZCBQQyByZWdpc3Rlci4gICovCisKKyNpZmRlZiBNT1RPUk9MQQorI2RlZmluZSBQT1BfUkVHSVNURVJTICAgICAgICAgIFwKK3sgYXNtICgic3ViaS5sICQ4LDI4KHNwKSIpOyAgICAgXAorICBhc20gKCJtb3ZlbSAoc3ApLCQgMHhmZmZmIik7IFwKKyAgYXNtICgicnRlIik7IH0KKyNlbHNlCisjaWZkZWYgQUxUT1NfQVMKKyNkZWZpbmUgUE9QX1JFR0lTVEVSUyAgICAgICAgICBcCit7IGFzbSAoInN1Yi5sICY4LDI4KCVzcCkiKTsgICAgIFwKKyAgYXNtICgibW92ZW0gKCVzcCksJjB4ZmZmZiIpOyBcCisgIGFzbSAoInJ0ZSIpOyB9CisjZWxzZQorI2RlZmluZSBQT1BfUkVHSVNURVJTICAgICAgICAgIFwKK3sgYXNtICgic3ViaWwgJDgsMjgoc3ApIik7ICAgICBcCisgIGFzbSAoIm1vdmVtIChzcCksJCAweGZmZmYiKTsgXAorICBhc20gKCJydGUiKTsgfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay94bS1hcG9sbG82OGIuaCBiL2dkYi9jb25maWcvbTY4ay94bS1hcG9sbG82OGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRlZmRhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3htLWFwb2xsbzY4Yi5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qIE1hY3JvIGRlZmluaXRpb25zIGZvciBhbiBBcG9sbG8gbTY4ayBpbiBCU0QgbW9kZQorICAgQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgSE9TVF9CWVRFX09SREVSIEJJR19FTkRJQU4KKworI2RlZmluZSBBTElHTl9TVEFDS19PTl9TVEFSVFVQCisKK2V4dGVybiBjaGFyICpzdHJkdXAoKTsKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay94bS1hcG9sbG82OHYuaCBiL2dkYi9jb25maWcvbTY4ay94bS1hcG9sbG82OHYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODdmZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3htLWFwb2xsbzY4di5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qIE1hY3JvIGRlZmludGlvbnMgZm9yIGFuIEFwb2xsby4KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICogQ2hhbmdlcyBmb3IgODAzODYgYnkgUGFjZSBXaWxsaXNzb24gKHBhY2VAcHJlcC5haS5taXQuZWR1KQorICogSnVseSAxOTg4CisgKi8KKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgQklHX0VORElBTgorCisvKiBJJ20gcnVubmluZyBnZGIgMy40IHVuZGVyIDM4Ni9peCAyLjAuMiwgd2hpY2ggaXMgYSBkZXJpdmF0aXZlIG9mIEFUJlQncworU3lzIFYvMzg2IDMuMi4KKworT24gc29tZSBtYWNoaW5lcywgZ2RiIGNyYXNoZXMgd2hlbiBpdCdzIHN0YXJ0aW5nIHVwIHdoaWxlIGNhbGxpbmcgdGhlCit2ZW5kb3IncyB0ZXJtaW8gdGdldGVudCgpIHJvdXRpbmUuICBJdCBhbHdheXMgd29ya3Mgd2hlbiBydW4gdW5kZXIKK2l0c2VsZiAoYWN0dWFsbHksIHVuZGVyIDMuMiwgaXQncyBub3QgYW4gaW5maW5pdGVseSByZWN1cnNpdmUgYnVnLikKK0FmdGVyIHNvbWUgcG9raW5nIGFyb3VuZCwgaXQgYXBwZWFycyB0aGF0IGRlcGVuZGluZyBvbiB0aGUgZW52aXJvbm1lbnQKK3NpemUsIG9yIHdoZXRoZXIgeW91J3JlIHJ1bm5pbmcgWVAsIG9yIHRoZSBwaGFzZSBvZiB0aGUgbW9vbiBvciBzb21ldGhpbmcsCit0aGUgc3RhY2sgaXMgbm90IGFsd2F5cyBsb25nLWFsaWduZWQgd2hlbiBtYWluKCkgaXMgY2FsbGVkLCBhbmQgdGdldGVudCgpCit0YWtlcyBzdHJvbmcgb2ZmZW5zZSBhdCB0aGF0LiAgT24gc29tZSBtYWNoaW5lcyB0aGlzIGJ1ZyBuZXZlciBhcHBlYXJzLCBidXQKK29uIHRob3NlIHdoZXJlIGl0IGRvZXMsIGl0IG9jY3VycyBxdWl0ZSByZWxpYWJseS4gICovCisjZGVmaW5lIEFMSUdOX1NUQUNLX09OX1NUQVJUVVAKKworLyogZGVmaW5lIFVTRyBpZiB5b3UgYXJlIHVzaW5nIHN5czUgL3Vzci9pbmNsdWRlJ3MgKi8KKyNkZWZpbmUgVVNHCisKKyNkZWZpbmUgSEFWRV9URVJNSU8KKwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3htLWRlbHRhNjguaCBiL2dkYi9jb25maWcvbTY4ay94bS1kZWx0YTY4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlNzA1YwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay94bS1kZWx0YTY4LmgKQEAgLTAsMCArMSwzNiBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIGEgRGVsdGEuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgQklHX0VORElBTgorCisvKiBJJ20gcnVubmluZyBnZGIgNC45IHVuZGVyIHN5c1Y2OCBSM1Y3LjEuCisKKyAgIE9uIHNvbWUgbWFjaGluZXMsIGdkYiBjcmFzaGVzIHdoZW4gaXQncyBzdGFydGluZyB1cCB3aGlsZSBjYWxsaW5nIHRoZQorICAgdmVuZG9yJ3MgdGVybWlvIHRnZXRlbnQoKSByb3V0aW5lLiAgSXQgYWx3YXlzIHdvcmtzIHdoZW4gcnVuIHVuZGVyCisgICBpdHNlbGYgKGFjdHVhbGx5LCB1bmRlciAzLjIsIGl0J3Mgbm90IGFuIGluZmluaXRlbHkgcmVjdXJzaXZlIGJ1Zy4pCisgICBBZnRlciBzb21lIHBva2luZyBhcm91bmQsIGl0IGFwcGVhcnMgdGhhdCBkZXBlbmRpbmcgb24gdGhlIGVudmlyb25tZW50CisgICBzaXplLCBvciB3aGV0aGVyIHlvdSdyZSBydW5uaW5nIFlQLCBvciB0aGUgcGhhc2Ugb2YgdGhlIG1vb24gb3Igc29tZXRoaW5nLAorICAgdGhlIHN0YWNrIGlzIG5vdCBhbHdheXMgbG9uZy1hbGlnbmVkIHdoZW4gbWFpbigpIGlzIGNhbGxlZCwgYW5kIHRnZXRlbnQoKQorICAgdGFrZXMgc3Ryb25nIG9mZmVuc2UgYXQgdGhhdC4gIE9uIHNvbWUgbWFjaGluZXMgdGhpcyBidWcgbmV2ZXIgYXBwZWFycywgYnV0CisgICBvbiB0aG9zZSB3aGVyZSBpdCBkb2VzLCBpdCBvY2N1cnMgcXVpdGUgcmVsaWFibHkuICAqLworI2RlZmluZSBBTElHTl9TVEFDS19PTl9TVEFSVFVQCisKKyNkZWZpbmUgVVNHCisKKyNkZWZpbmUgSEFWRV9URVJNSU8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay94bS1kcHgyLmggYi9nZGIvY29uZmlnL202OGsveG0tZHB4Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTMyZTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsveG0tZHB4Mi5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIGV4ZWN1dGlvbiBvbiBhIEJ1bGwgRFBYMi4KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBCSUdfRU5ESUFOCisKKyNkZWZpbmUgSEFWRV9URVJNSU9TCisjZGVmaW5lIFVTRworCisvKiBBdm9pZCByZWRlZmluaXRpb24gZXJyb3JzICovCisjaW5jbHVkZSA8bGltaXRzLmg+CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsveG0taHAzMDBic2QuaCBiL2dkYi9jb25maWcvbTY4ay94bS1ocDMwMGJzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNjc3OTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsveG0taHAzMDBic2QuaApAQCAtMCwwICsxLDg1IEBACisvKiBQYXJhbWV0ZXJzIGZvciBob3N0aW5nIG9uIGEgSGV3bGV0dC1QYWNrYXJkIDkwMDAvMzAwLCBydW5uaW5nIGJzZC4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkxLCAxOTkyLCAxOTkzICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICogQ29uZmlndXJhdGlvbiBmaWxlIGZvciBIUDkwMDAvMzAwIHNlcmllcyBtYWNoaW5lIHJ1bm5pbmcKKyAqIFVuaXZlcnNpdHkgb2YgVXRhaCdzIDQuM2JzZCAob3IgNC40QlNEKSBwb3J0LiAgVGhpcyBpcyBOT1QgZm9yIEhQLVVYLgorICogUHJvYmxlbXMgdG8gaHBic2QtYnVnc0Bjcy51dGFoLmVkdQorICovCisKKyNkZWZpbmUJSE9TVF9CWVRFX09SREVSCUJJR19FTkRJQU4KKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgkvKiBGb3IgSU5UX01JTiAqLworCisvKiBLZXJuZWwgaXMgYSBiaXQgdGVuYWNpb3VzIGFib3V0IHNoYXJpbmcgdGV4dCBzZWdtZW50cywgZGlzYWxsb3dpbmcgYnB0cy4gICovCisjZGVmaW5lCU9ORV9QUk9DRVNTX1dSSVRFVEVYVAorCitleHRlcm4gY2hhciAqc3RyZHVwIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworDAorLyogSW50ZXJmYWNlIGRlZmluaXRpb25zIGZvciBrZXJuZWwgZGVidWdnZXIgS0RCLiAgKi8KKworLyogTWFwIG1hY2hpbmUgZmF1bHQgY29kZXMgaW50byBzaWduYWwgbnVtYmVycy4KKyAgIEZpcnN0IHN1YnRyYWN0IDAsIGRpdmlkZSBieSA0LCB0aGVuIGluZGV4IGluIGEgdGFibGUuCisgICBGYXVsdHMgZm9yIHdoaWNoIHRoZSBlbnRyeSBpbiB0aGlzIHRhYmxlIGlzIDAKKyAgIGFyZSBub3QgaGFuZGxlZCBieSBLREI7IHRoZSBwcm9ncmFtJ3Mgb3duIHRyYXAgaGFuZGxlcgorICAgZ2V0cyB0byBoYW5kbGUgdGhlbi4gICovCisKKyNkZWZpbmUgRkFVTFRfQ09ERV9PUklHSU4gMAorI2RlZmluZSBGQVVMVF9DT0RFX1VOSVRTIDQKKyNkZWZpbmUgRkFVTFRfVEFCTEUgICAgXAoreyAwLCAwLCAwLCAwLCBTSUdUUkFQLCAwLCAwLCAwLCBcCisgIDAsIFNJR1RSQVAsIDAsIDAsIDAsIDAsIDAsIFNJR0tJTEwsIFwKKyAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgXAorICBTSUdJTEwgfQorCisvKiBTdGFydCBydW5uaW5nIHdpdGggYSBzdGFjayBzdHJldGNoaW5nIGZyb20gQkVHIHRvIEVORC4KKyAgIEJFRyBhbmQgRU5EIHNob3VsZCBiZSBzeW1ib2xzIG1lYW5pbmdmdWwgdG8gdGhlIGFzc2VtYmxlci4KKyAgIFRoaXMgaXMgdXNlZCBvbmx5IGZvciBrZGIuICAqLworCisjZGVmaW5lIElOSVRfU1RBQ0soYmVnLCBlbmQpICBcCit7IGFzbSAoIi5nbG9ibCBlbmQiKTsgICAgICAgICBcCisgIGFzbSAoIm1vdmVsICNlbmQsIHNwIik7ICAgICAgXAorICBhc20gKCJtb3ZlbCAjMCxhNiIpOyB9CisKKy8qIFB1c2ggdGhlIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIgb24gdGhlIHN0YWNrLiAgKi8KKyNkZWZpbmUgUFVTSF9GUkFNRV9QVFIgICAgICAgIFwKKyAgYXNtICgibW92ZWwgYTYsc3BALSIpOworCisvKiBDb3B5IHRoZSB0b3Atb2Ytc3RhY2sgdG8gdGhlIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIuICAqLworI2RlZmluZSBQT1BfRlJBTUVfUFRSICBcCisgIGFzbSAoIm1vdmwgc3BALGE2Iik7CisKKy8qIEFmdGVyIEtEQiBpcyBlbnRlcmVkIGJ5IGEgZmF1bHQsIHB1c2ggYWxsIHJlZ2lzdGVycworICAgdGhhdCBHREIgdGhpbmtzIGFib3V0IChhbGwgTlVNX1JFR1Mgb2YgdGhlbSksCisgICBzbyB0aGF0IHRoZXkgYXBwZWFyIGluIG9yZGVyIG9mIGFzY2VuZGluZyBHREIgcmVnaXN0ZXIgbnVtYmVyLgorICAgVGhlIGZhdWx0IGNvZGUgd2lsbCBiZSBvbiB0aGUgc3RhY2sgYmV5b25kIHRoZSBsYXN0IHJlZ2lzdGVyLiAgKi8KKworI2RlZmluZSBQVVNIX1JFR0lTVEVSUyAgICAgICAgXAoreyBhc20gKCJjbHJ3IC0oc3ApIik7CSAgICAgIFwKKyAgYXNtICgicGVhIHNwQCgxMCkiKTsJICAgICAgXAorICBhc20gKCJtb3ZlbSAjMHhmZmZlLHNwQC0iKTsgfQorCisvKiBBc3N1bWluZyB0aGUgcmVnaXN0ZXJzIChpbmNsdWRpbmcgcHJvY2Vzc29yIHN0YXR1cykgaGF2ZSBiZWVuCisgICBwdXNoZWQgb24gdGhlIHN0YWNrIGluIG9yZGVyIG9mIGFzY2VuZGluZyBHREIgcmVnaXN0ZXIgbnVtYmVyLAorICAgcmVzdG9yZSB0aGVtIGFuZCByZXR1cm4gdG8gdGhlIGFkZHJlc3MgaW4gdGhlIHNhdmVkIFBDIHJlZ2lzdGVyLiAgKi8KKworI2RlZmluZSBQT1BfUkVHSVNURVJTICAgICAgICAgIFwKK3sgYXNtICgic3ViaWwgIzgsc3BAKDI4KSIpOyAgICAgXAorICBhc20gKCJtb3ZlbSBzcEAsIzB4ZmZmZiIpOyBcCisgIGFzbSAoInJ0ZSIpOyB9CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsveG0taHAzMDBocHV4LmggYi9nZGIvY29uZmlnL202OGsveG0taHAzMDBocHV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkNzVkNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay94bS1ocDMwMGhwdXguaApAQCAtMCwwICsxLDE1MCBAQAorLyogUGFyYW1ldGVycyBmb3IgSFAgOTAwMCBtb2RlbCAzMjAgaG9zdGluZywgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBCSUdfRU5ESUFOCisKKy8qIERlZmluZSB0aGlzIHRvIGluZGljYXRlIHByb2JsZW1zIHdpdGggdHJhcHMgYWZ0ZXIgY29udGludWluZy4gICovCisjZGVmaW5lIEhQX09TX0JVRworCisvKiBTZXQgZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIEhQJ3MgYXNzZW1ibGVyIGlzIGluIHVzZS4gKi8KKyNpZmRlZiBfX0dOVUNfXworI2lmZGVmIF9fSFBVWF9BU01fXworI2RlZmluZSBIUFVYX0FTTQorI2VuZGlmCisjZWxzZSAvKiBub3QgR05VIEMuICAqLworI2RlZmluZSBIUFVYX0FTTQorI2VuZGlmIC8qIG5vdCBHTlUgQy4gICovCisKKy8qIERlZmluZSB0aGlzIGZvciB2ZXJzaW9ucyBvZiBocC11eCBvbGRlciB0aGFuIDYuMCAqLworLyogI2RlZmluZSBIUFVYX1ZFUlNJT05fNSAqLworCisvKiBkZWZpbmUgVVNHIGlmIHlvdSBhcmUgdXNpbmcgc3lzNSAvdXNyL2luY2x1ZGUncyAqLworI3VuZGVmIFVTRwkvKiBJbiBjYXNlIGl0IHdhcyBkZWZpbmVkIGluIHRoZSBNYWtlZmlsZSBmb3IgY3BsdXMtZGVtLmMgKi8KKyNkZWZpbmUgVVNHCisKKyNkZWZpbmUgSEFWRV9URVJNSU9TCisKKyNkZWZpbmUgUkVHSVNURVJfQUREUih1X2FyMCwgcmVnbm8pCQkJCQlcCisgICh1bnNpZ25lZCBpbnQpCQkJCQkJCVwKKyAgKCgocmVnbm8pIDwgUFNfUkVHTlVNKQkJCQkJCVwKKyAgID8gKCYoKHN0cnVjdCBleGNlcHRpb25fc3RhY2sgKikgKHVfYXIwKSktPmVfcmVnc1socmVnbm8gKyBSMCldKQlcCisgICA6ICgoKHJlZ25vKSA9PSBQU19SRUdOVU0pCQkJCQkJXAorICAgICAgPyAoKGludCAqKSAoJigoc3RydWN0IGV4Y2VwdGlvbl9zdGFjayAqKSAodV9hcjApKS0+ZV9QUykpCQlcCisgICAgICA6ICgmKChzdHJ1Y3QgZXhjZXB0aW9uX3N0YWNrICopICh1X2FyMCkpLT5lX1BDKSkpCisKKyNkZWZpbmUgRlBfUkVHSVNURVJfQUREUih1LCByZWdubykJCQkJCVwKKyAgKCgoY2hhciAqKQkJCQkJCQkJXAorICAgICgoKHJlZ25vKSA8IEZQQ19SRUdOVU0pCQkJCQkJXAorICAgICA/ICgmdS51X3BjYi5wY2JfbWM2ODg4MVtGTUM2ODg4MV9SMCArICgoKHJlZ25vKSAtIEZQMF9SRUdOVU0pICogMyldKSBcCisgICAgIDogKCZ1LnVfcGNiLnBjYl9tYzY4ODgxW0ZNQzY4ODgxX0MgKyAoKHJlZ25vKSAtIEZQQ19SRUdOVU0pXSkpKQlcCisgICAtICgoY2hhciAqKSAoJiB1KSkpCisMCisvKiBJbnRlcmZhY2UgZGVmaW5pdGlvbnMgZm9yIGtlcm5lbCBkZWJ1Z2dlciBLREIuICAqLworCisvKiBNYXAgbWFjaGluZSBmYXVsdCBjb2RlcyBpbnRvIHNpZ25hbCBudW1iZXJzLgorICAgRmlyc3Qgc3VidHJhY3QgMCwgZGl2aWRlIGJ5IDQsIHRoZW4gaW5kZXggaW4gYSB0YWJsZS4KKyAgIEZhdWx0cyBmb3Igd2hpY2ggdGhlIGVudHJ5IGluIHRoaXMgdGFibGUgaXMgMAorICAgYXJlIG5vdCBoYW5kbGVkIGJ5IEtEQjsgdGhlIHByb2dyYW0ncyBvd24gdHJhcCBoYW5kbGVyCisgICBnZXRzIHRvIGhhbmRsZSB0aGVuLiAgKi8KKworI2RlZmluZSBGQVVMVF9DT0RFX09SSUdJTiAwCisjZGVmaW5lIEZBVUxUX0NPREVfVU5JVFMgNAorI2RlZmluZSBGQVVMVF9UQUJMRSAgICBcCit7IDAsIDAsIDAsIDAsIFNJR1RSQVAsIDAsIDAsIDAsIFwKKyAgMCwgU0lHVFJBUCwgMCwgMCwgMCwgMCwgMCwgU0lHS0lMTCwgXAorICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBcCisgIFNJR0lMTCB9CisKKyNpZm5kZWYgSFBVWF9BU00KKworLyogU3RhcnQgcnVubmluZyB3aXRoIGEgc3RhY2sgc3RyZXRjaGluZyBmcm9tIEJFRyB0byBFTkQuCisgICBCRUcgYW5kIEVORCBzaG91bGQgYmUgc3ltYm9scyBtZWFuaW5nZnVsIHRvIHRoZSBhc3NlbWJsZXIuCisgICBUaGlzIGlzIHVzZWQgb25seSBmb3Iga2RiLiAgKi8KKworI2RlZmluZSBJTklUX1NUQUNLKGJlZywgZW5kKSAgXAoreyBhc20gKCIuZ2xvYmwgZW5kIik7ICAgICAgICAgXAorICBhc20gKCJtb3ZlbCAkIGVuZCwgc3AiKTsgICAgICBcCisgIGFzbSAoImNscmwgZnAiKTsgfQorCisvKiBQdXNoIHRoZSBmcmFtZSBwb2ludGVyIHJlZ2lzdGVyIG9uIHRoZSBzdGFjay4gICovCisjZGVmaW5lIFBVU0hfRlJBTUVfUFRSICAgICAgICBcCisgIGFzbSAoIm1vdmVsIGZwLCAtKHNwKSIpOworCisvKiBDb3B5IHRoZSB0b3Atb2Ytc3RhY2sgdG8gdGhlIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIuICAqLworI2RlZmluZSBQT1BfRlJBTUVfUFRSICBcCisgIGFzbSAoIm1vdmwgKHNwKSwgZnAiKTsKKworLyogQWZ0ZXIgS0RCIGlzIGVudGVyZWQgYnkgYSBmYXVsdCwgcHVzaCBhbGwgcmVnaXN0ZXJzCisgICB0aGF0IEdEQiB0aGlua3MgYWJvdXQgKGFsbCBOVU1fUkVHUyBvZiB0aGVtKSwKKyAgIHNvIHRoYXQgdGhleSBhcHBlYXIgaW4gb3JkZXIgb2YgYXNjZW5kaW5nIEdEQiByZWdpc3RlciBudW1iZXIuCisgICBUaGUgZmF1bHQgY29kZSB3aWxsIGJlIG9uIHRoZSBzdGFjayBiZXlvbmQgdGhlIGxhc3QgcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIFBVU0hfUkVHSVNURVJTICAgICAgICBcCit7IGFzbSAoImNscncgLShzcCkiKTsJICAgICAgXAorICBhc20gKCJwZWEgMTAoc3ApIik7CSAgICAgIFwKKyAgYXNtICgibW92ZW0gJCAweGZmZmUsLShzcCkiKTsgfQorCisvKiBBc3N1bWluZyB0aGUgcmVnaXN0ZXJzIChpbmNsdWRpbmcgcHJvY2Vzc29yIHN0YXR1cykgaGF2ZSBiZWVuCisgICBwdXNoZWQgb24gdGhlIHN0YWNrIGluIG9yZGVyIG9mIGFzY2VuZGluZyBHREIgcmVnaXN0ZXIgbnVtYmVyLAorICAgcmVzdG9yZSB0aGVtIGFuZCByZXR1cm4gdG8gdGhlIGFkZHJlc3MgaW4gdGhlIHNhdmVkIFBDIHJlZ2lzdGVyLiAgKi8KKworI2RlZmluZSBQT1BfUkVHSVNURVJTICAgICAgICAgIFwKK3sgYXNtICgic3ViaWwgJDgsMjgoc3ApIik7ICAgICBcCisgIGFzbSAoIm1vdmVtIChzcCksJCAweGZmZmYiKTsgXAorICBhc20gKCJydGUiKTsgfQorCisjZWxzZSAvKiBIUFVYX0FTTSAqLworCisvKiBTdGFydCBydW5uaW5nIHdpdGggYSBzdGFjayBzdHJldGNoaW5nIGZyb20gQkVHIHRvIEVORC4KKyAgIEJFRyBhbmQgRU5EIHNob3VsZCBiZSBzeW1ib2xzIG1lYW5pbmdmdWwgdG8gdGhlIGFzc2VtYmxlci4KKyAgIFRoaXMgaXMgdXNlZCBvbmx5IGZvciBrZGIuICAqLworCisjZGVmaW5lIElOSVRfU1RBQ0soYmVnLCBlbmQpCQkJCQkJXAoreyBhc20gKCJnbG9iYWwgZW5kIik7CQkJCQkJCVwKKyAgYXNtICgibW92LmwgJmVuZCwlc3AiKTsJCQkJCQlcCisgIGFzbSAoImNsci5sICVhNiIpOyB9CisKKy8qIFB1c2ggdGhlIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIgb24gdGhlIHN0YWNrLiAgKi8KKyNkZWZpbmUgUFVTSF9GUkFNRV9QVFIJCQkJCQkJXAorICBhc20gKCJtb3YubCAlZnAsLSglc3ApIik7CisKKy8qIENvcHkgdGhlIHRvcC1vZi1zdGFjayB0byB0aGUgZnJhbWUgcG9pbnRlciByZWdpc3Rlci4gICovCisjZGVmaW5lIFBPUF9GUkFNRV9QVFIJCQkJCQkJXAorICBhc20gKCJtb3YubCAoJXNwKSwlZnAiKTsKKworLyogQWZ0ZXIgS0RCIGlzIGVudGVyZWQgYnkgYSBmYXVsdCwgcHVzaCBhbGwgcmVnaXN0ZXJzCisgICB0aGF0IEdEQiB0aGlua3MgYWJvdXQgKGFsbCBOVU1fUkVHUyBvZiB0aGVtKSwKKyAgIHNvIHRoYXQgdGhleSBhcHBlYXIgaW4gb3JkZXIgb2YgYXNjZW5kaW5nIEdEQiByZWdpc3RlciBudW1iZXIuCisgICBUaGUgZmF1bHQgY29kZSB3aWxsIGJlIG9uIHRoZSBzdGFjayBiZXlvbmQgdGhlIGxhc3QgcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIFBVU0hfUkVHSVNURVJTCQkJCQkJCVwKK3sgYXNtICgiY2xyLncgLSglc3ApIik7CQkJCQkJCVwKKyAgYXNtICgicGVhIDEwKCVzcCkiKTsJCQkJCQkJXAorICBhc20gKCJtb3ZtLmwgJjB4ZmZmZSwtKCVzcCkiKTsgfQorCisvKiBBc3N1bWluZyB0aGUgcmVnaXN0ZXJzIChpbmNsdWRpbmcgcHJvY2Vzc29yIHN0YXR1cykgaGF2ZSBiZWVuCisgICBwdXNoZWQgb24gdGhlIHN0YWNrIGluIG9yZGVyIG9mIGFzY2VuZGluZyBHREIgcmVnaXN0ZXIgbnVtYmVyLAorICAgcmVzdG9yZSB0aGVtIGFuZCByZXR1cm4gdG8gdGhlIGFkZHJlc3MgaW4gdGhlIHNhdmVkIFBDIHJlZ2lzdGVyLiAgKi8KKworI2RlZmluZSBQT1BfUkVHSVNURVJTCQkJCQkJCVwKK3sgYXNtICgic3ViaS5sICY4LDI4KCVzcCkiKTsJCQkJCQlcCisgIGFzbSAoIm1vdi5tICglc3ApLCYweGZmZmYiKTsJCQkJCQlcCisgIGFzbSAoInJ0ZSIpOyB9CisKKyNlbmRpZiAvKiBIUFVYX0FTTSAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3htLWlzaS5oIGIvZ2RiL2NvbmZpZy9tNjhrL3htLWlzaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNzUzMzMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsveG0taXNpLmgKQEAgLTAsMCArMSw5MiBAQAorLyogRGVmaW5pdGlvbnMgdG8gbWFrZSBHREIgcnVuIG9uIGFuIElTSSBPcHRpbXVtIFYgKDMuMDUpIHVuZGVyIDQuM2JzZC4KKyAgIENvcHlyaWdodCAxOTg3LCAxOTg5LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgSE9TVF9CWVRFX09SREVSIEJJR19FTkRJQU4KKworLyogVGhpcyBoYXMgbm90IGJlZW4gdGVzdGVkIG9uIElTSSdzIHJ1bm5pbmcgQlNEIDQuMiwgYnV0IGl0IHdpbGwgcHJvYmFibHkKKyAgIHdvcmsuICAqLworCisvKiBUaGlzIGlzIHRoZSBhbW91bnQgdG8gc3VidHJhY3QgZnJvbSB1LnVfYXIwCisgICB0byBnZXQgdGhlIG9mZnNldCBpbiB0aGUgY29yZSBmaWxlIG9mIHRoZSByZWdpc3RlciB2YWx1ZXMuICAqLworCisvKiNkZWZpbmUgS0VSTkVMX1VfQUREUiAweDEwODAwMDAwKi8KKyNkZWZpbmUgS0VSTkVMX1VfQUREUiAwCisKKy8qIGV4cGVjdHMgYmxvY2tlbmQgdG8gYmUgdS51X2FyMCAqLworZXh0ZXJuIGludCBybG9jW107ICAJLyogRGVmaW5lZCBpbiBpc2ktZGVwLmMgKi8KKyNkZWZpbmUgUkVHSVNURVJfVV9BRERSKGFkZHIsIGJsb2NrZW5kLCByZWdubykgICAgICAgICAgICAgICAgICBcCit7ICAgICAgIGJsb2NrZW5kICY9IFVQQUdFUypOQlBHIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmIChyZWdubyA8IDE4KSBhZGRyID0gKGludClibG9ja2VuZCArIHJsb2NbcmVnbm9dKjQ7ICAJXAorICAgICAgICBlbHNlIGlmIChyZWdubyA8IDI2KSBhZGRyID0gKGludCkgJigoc3RydWN0IHVzZXIgKikwKS0+dV82ODg4MV9yZWdzIFwKKyAgICAgICAgICAgICsgKHJlZ25vIC0gMTgpICogMTI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgaWYgKHJlZ25vIDwgMjkpIGFkZHIgPSAoaW50KSAmKChzdHJ1Y3QgdXNlciAqKTApLT51XzY4ODgxX3JlZ3MgXAorICAgICAgICAgICAgKyA4ICogMTIgKyAocmVnbm8gLSAyNikgKiA0OyAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKwwKKy8qIEludGVyZmFjZSBkZWZpbml0aW9ucyBmb3Iga2VybmVsIGRlYnVnZ2VyIEtEQi4gICovCisKKy8qIE1hcCBtYWNoaW5lIGZhdWx0IGNvZGVzIGludG8gc2lnbmFsIG51bWJlcnMuCisgICBGaXJzdCBzdWJ0cmFjdCAwLCBkaXZpZGUgYnkgNCwgdGhlbiBpbmRleCBpbiBhIHRhYmxlLgorICAgRmF1bHRzIGZvciB3aGljaCB0aGUgZW50cnkgaW4gdGhpcyB0YWJsZSBpcyAwCisgICBhcmUgbm90IGhhbmRsZWQgYnkgS0RCOyB0aGUgcHJvZ3JhbSdzIG93biB0cmFwIGhhbmRsZXIKKyAgIGdldHMgdG8gaGFuZGxlIHRoZW4uICAqLworCisjZGVmaW5lIEZBVUxUX0NPREVfT1JJR0lOIDAKKyNkZWZpbmUgRkFVTFRfQ09ERV9VTklUUyA0CisjZGVmaW5lIEZBVUxUX1RBQkxFICAgIFwKK3sgMCwgMCwgMCwgMCwgU0lHVFJBUCwgMCwgMCwgMCwgXAorICAwLCBTSUdUUkFQLCAwLCAwLCAwLCAwLCAwLCBTSUdLSUxMLCBcCisgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFwKKyAgU0lHSUxMIH0KKworLyogU3RhcnQgcnVubmluZyB3aXRoIGEgc3RhY2sgc3RyZXRjaGluZyBmcm9tIEJFRyB0byBFTkQuCisgICBCRUcgYW5kIEVORCBzaG91bGQgYmUgc3ltYm9scyBtZWFuaW5nZnVsIHRvIHRoZSBhc3NlbWJsZXIuCisgICBUaGlzIGlzIHVzZWQgb25seSBmb3Iga2RiLiAgKi8KKworI2RlZmluZSBJTklUX1NUQUNLKGJlZywgZW5kKSAgXAoreyBhc20gKCIuZ2xvYmwgZW5kIik7ICAgICAgICAgXAorICBhc20gKCJtb3ZsICQgZW5kLCBzcCIpOyAgICAgIFwKKyAgYXNtICgiY2xybCBmcCIpOyB9CisKKy8qIFB1c2ggdGhlIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIgb24gdGhlIHN0YWNrLiAgKi8KKyNkZWZpbmUgUFVTSF9GUkFNRV9QVFIgICAgICAgIFwKKyAgYXNtICgibW92ZWwgZnAsIC0oc3ApIik7CisKKy8qIENvcHkgdGhlIHRvcC1vZi1zdGFjayB0byB0aGUgZnJhbWUgcG9pbnRlciByZWdpc3Rlci4gICovCisjZGVmaW5lIFBPUF9GUkFNRV9QVFIgIFwKKyAgYXNtICgibW92bCAoc3ApLCBmcCIpOworCisvKiBBZnRlciBLREIgaXMgZW50ZXJlZCBieSBhIGZhdWx0LCBwdXNoIGFsbCByZWdpc3RlcnMKKyAgIHRoYXQgR0RCIHRoaW5rcyBhYm91dCAoYWxsIE5VTV9SRUdTIG9mIHRoZW0pLAorICAgc28gdGhhdCB0aGV5IGFwcGVhciBpbiBvcmRlciBvZiBhc2NlbmRpbmcgR0RCIHJlZ2lzdGVyIG51bWJlci4KKyAgIFRoZSBmYXVsdCBjb2RlIHdpbGwgYmUgb24gdGhlIHN0YWNrIGJleW9uZCB0aGUgbGFzdCByZWdpc3Rlci4gICovCisKKyNkZWZpbmUgUFVTSF9SRUdJU1RFUlMgICAgICAgIFwKK3sgYXNtICgiY2xydyAtKHNwKSIpOwkgICAgICBcCisgIGFzbSAoInBlYSAxMChzcCkiKTsJICAgICAgXAorICBhc20gKCJtb3ZlbSAkIDB4ZmZmZSwtKHNwKSIpOyB9CisKKy8qIEFzc3VtaW5nIHRoZSByZWdpc3RlcnMgKGluY2x1ZGluZyBwcm9jZXNzb3Igc3RhdHVzKSBoYXZlIGJlZW4KKyAgIHB1c2hlZCBvbiB0aGUgc3RhY2sgaW4gb3JkZXIgb2YgYXNjZW5kaW5nIEdEQiByZWdpc3RlciBudW1iZXIsCisgICByZXN0b3JlIHRoZW0gYW5kIHJldHVybiB0byB0aGUgYWRkcmVzcyBpbiB0aGUgc2F2ZWQgUEMgcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIFBPUF9SRUdJU1RFUlMgICAgICAgICAgXAoreyBhc20gKCJzdWJpbCAkOCwyOChzcCkiKTsgICAgIFwKKyAgYXNtICgibW92ZW0gKHNwKSwkIDB4ZmZmZiIpOyBcCisgIGFzbSAoInJ0ZSIpOyB9CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsveG0tbGludXguaCBiL2dkYi9jb25maWcvbTY4ay94bS1saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNjZjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsveG0tbGludXguaApAQCAtMCwwICsxLDQwIEBACisvKiBOYXRpdmUgc3VwcG9ydCBmb3IgbGludXgsIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIFhNX0xJTlVYX0gKKyNkZWZpbmUgWE1fTElOVVhfSAorCisvKiBQaWNrIHVwIG1vc3Qgb2Ygd2hhdCB3ZSBuZWVkIGZyb20gdGhlIGdlbmVyaWMgbTY4ayBob3N0IGluY2x1ZGUgZmlsZS4gKi8KKworI2luY2x1ZGUgIm02OGsveG0tbTY4ay5oIgorCisvKiBUaGlzIGlzIHRoZSBhbW91bnQgdG8gc3VidHJhY3QgZnJvbSB1LnVfYXIwCisgICB0byBnZXQgdGhlIG9mZnNldCBpbiB0aGUgY29yZSBmaWxlIG9mIHRoZSByZWdpc3RlciB2YWx1ZXMuICAqLworI2RlZmluZSBLRVJORUxfVV9BRERSIDB4MAorCisjZGVmaW5lIEhBVkVfVEVSTUlPUworI2RlZmluZSBORUVEX1BPU0lYX1NFVFBHSUQKKworLyogTGludXggaGFzIHNpZ3NldGptcCBhbmQgc2lnbG9uZ2ptcCAqLworI2RlZmluZSBIQVZFX1NJR1NFVEpNUAorCisvKiBOZWVkIFJfT0sgZXRjLCBidXQgVVNHIGlzbid0IGRlZmluZWQuICAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZW5kaWYJLyogI2lmbmRlZiBYTV9MSU5VWF9IICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsveG0tbTY4ay5oIGIvZ2RiL2NvbmZpZy9tNjhrL3htLW02OGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDc5NDA4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3htLW02OGsuaApAQCAtMCwwICsxLDIyIEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgcnVubmluZyBnZGIgb24gaG9zdCBtYWNoaW5lcyB3aXRoIG02OGsgY3B1J3MuCisgICBDb3B5cmlnaHQgKEMpIDE5OTEsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggYXQgQ3lnbnVzIFN1cHBvcnQgKGZuZkBjeWdpbnQpCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgQklHX0VORElBTgorCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsveG0tbTY4a2x5bnguaCBiL2dkYi9jb25maWcvbTY4ay94bS1tNjhrbHlueC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZDY4NDQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsveG0tbTY4a2x5bnguaApAQCAtMCwwICsxLDI0IEBACisvKiBIb3N0LWRlcGVuZGVudCBkZWZpbml0aW9ucyBmb3IgTW90b3JvbGEgNjgweDAgcnVubmluZyBMeW54T1MsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBCSUdfRU5ESUFOCisKKy8qIEdldCBnZW5lcmljIEx5bnhPUyBob3N0IGRlZmluaXRpb25zLiAqLworCisjaW5jbHVkZSAieG0tbHlueC5oIgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3htLW02OGt2NC5oIGIvZ2RiL2NvbmZpZy9tNjhrL3htLW02OGt2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNDljOGYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsveG0tbTY4a3Y0LmgKQEAgLTAsMCArMSwyOCBAQAorLyogSG9zdCBkZWZpbml0aW9ucyBmb3IgR0RCIG9uIGEgTW90b3JvbGEgNjgweDAgcnVubmluZyBTVlI0LgorICAgKENvbW1vZG9yZSBBbWlnYSB3aXRoIGFtaXggb3IgQXRhcmkgVFQgd2l0aCBBU1YpCisgICBDb3B5cmlnaHQgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIGF0IEN5Z251cyBTdXBwb3J0IChmbmZAY3lnbnVzLmNvbSkKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBQaWNrIHVwIG1vc3Qgb2Ygd2hhdCB3ZSBuZWVkIGZyb20gdGhlIGdlbmVyaWMgbTY4ayBob3N0IGluY2x1ZGUgZmlsZS4gKi8KKworI2luY2x1ZGUgIm02OGsveG0tbTY4ay5oIgorCisvKiBQaWNrIHVwIG1vcmUgc3R1ZmYgZnJvbSB0aGUgZ2VuZXJpYyBTVlI0IGhvc3QgaW5jbHVkZSBmaWxlLiAqLworCisjaW5jbHVkZSAieG0tc3lzdjQuaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay94bS1tcHcuaCBiL2dkYi9jb25maWcvbTY4ay94bS1tcHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDU4NWIzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3htLW1wdy5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qIE1hY3JvIGRlZmluaXRpb25zIGZvciBydW5uaW5nIEdEQiBvbiBBcHBsZSA2OGstYmFzZWQgTWFjaW50b3NoZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgQklHX0VORElBTgorCisvKiBVc2UgYW5nbGUgYnJhY2tldHMgc28gdGhhdCB0aGUgY29tbW9uIHhtLW1wdy5oIGlzIGZvdW5kLiAgKi8KKworI2luY2x1ZGUgPHhtLW1wdy5oPgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3htLW5ic2QuaCBiL2dkYi9jb25maWcvbTY4ay94bS1uYnNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyOGUxOQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay94bS1uYnNkLmgKQEAgLTAsMCArMSwyMSBAQAorLyogUGFyYW1ldGVycyBmb3IgZXhlY3V0aW9uIG9uIGEgTW90b3JvbGEgbTY4ayBydW5uaW5nIE5ldEJTRCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEdldCBnZW5lcmljIE5ldEJTRCBob3N0IGRlZmluaXRpb25zLiAqLworI2luY2x1ZGUgInhtLW5ic2QuaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTY4ay94bS1uZXdzLmggYi9nZGIvY29uZmlnL202OGsveG0tbmV3cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTMzN2IKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL202OGsveG0tbmV3cy5oCkBAIC0wLDAgKzEsMTM3IEBACisvKiBQYXJhbWV0ZXJzIGZvciBleGVjdXRpb24gb24gYSBTb255L05FV1MsIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk4NywgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBCSUdfRU5ESUFOCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4JLyogRm9yIElOVF9NSU4gKi8KKworI2RlZmluZSBIQVZFX1dBSVRfU1RSVUNUCisKKy8qIFdlIGNhbid0IHVzZSAiaXNhdHR5IiBvciAiZmlsZW5vIiBvbiB0aGlzIG1hY2hpbmUuICBUaGlzIGlzbid0IGdvb2QsCisgICBidXQgaXQgd2lsbCBoYXZlIHRvIGRvLiAgKi8KKyNkZWZpbmUgSVNBVFRZKEZQKQkoKEZQKSA9PSBzdGRpbiB8fCAoRlApID09IHN0ZG91dCkKKworLyogVEhpcyBpcyB0aGUgYW1vdW50IHRvIHN1YnRyYWN0IGZyb20gdS51X2FyMAorICAgdG8gZ2V0IHRoZSBvZmZzZXQgaW4gdGhlIGNvcmUgZmlsZSBvZiB0aGUgcmVnaXN0ZXIgdmFsdWVzLiAqLworCisjZGVmaW5lIEtFUk5FTF9VX0FERFIgVUFERFIKKworLyogVGhlIG9mZnNldHMgaW4gdGhpcyBtYWNybyBhcmUgZnJvbSAvdXNyL2luY2x1ZGUvbWFjaGluZS9yZWcuaCAqLworCisjZGVmaW5lIFJFR0lTVEVSX1VfQUREUihhZGRyLCBibG9ja2VuZCwgcmVnbm8pCQlcCit7ICAgc3RhdGljIGNoYXIgb2Zmc2V0c1tdID0geyBcCisJLypkMC1kNzoqLzEsMiwzLDQsNSw2LDcsOCwgXAorCS8qYTAtYTY6Ki85LDEwLDExLDEyLDEzLDE0LDE1LCAvKnNwOiovLTQsIC8qcHM6Ki8wLCAvKnBjOiovLTEsIFwKKwkvKmZwMC1mcDc6Ki8xOSwyMiwyNSwyOCwzMSwzNCwzNyw0MCwgLypmcGM6Ki8xNiwxNywxOCB9OyBcCisJYWRkciA9IGJsb2NrZW5kICsgNCAqIG9mZnNldHNbcmVnbm9dOyBcCit9CisKKy8qIE5ld3NPUyAzLjMgZG9lcyBub3QgZGVmaW5lIGVycm5vIGluIDxlcnJuby5oPi4gICovCitleHRlcm4gaW50IGVycm5vOworDAorLyogSW50ZXJmYWNlIGRlZmluaXRpb25zIGZvciBrZXJuZWwgZGVidWdnZXIgS0RCLiAgKi8KKworLyogVXNlIEdOVSBhc3NlbWJsZXIgaW5zdGVhZCBvZiBzdGFuZGFyZCBhc3NlbWJsZXIgKi8KKyNkZWZpbmUgVVNFX0dBUworCisvKiBNb3Rvcm9sYSBhc3NlbWJseSBmb3JtYXQgKi8KKyNpZm5kZWYgVVNFX0dBUworI2RlZmluZSBNT1RPUk9MQQorI2VuZGlmCisKKy8qIE1hcCBtYWNoaW5lIGZhdWx0IGNvZGVzIGludG8gc2lnbmFsIG51bWJlcnMuCisgICBGaXJzdCBzdWJ0cmFjdCAwLCBkaXZpZGUgYnkgNCwgdGhlbiBpbmRleCBpbiBhIHRhYmxlLgorICAgRmF1bHRzIGZvciB3aGljaCB0aGUgZW50cnkgaW4gdGhpcyB0YWJsZSBpcyAwCisgICBhcmUgbm90IGhhbmRsZWQgYnkgS0RCOyB0aGUgcHJvZ3JhbSdzIG93biB0cmFwIGhhbmRsZXIKKyAgIGdldHMgdG8gaGFuZGxlIHRoZW4uICAqLworCisjZGVmaW5lIEZBVUxUX0NPREVfT1JJR0lOIDAKKyNkZWZpbmUgRkFVTFRfQ09ERV9VTklUUyA0CisjZGVmaW5lIEZBVUxUX1RBQkxFICAgIFwKK3sgMCwgMCwgMCwgMCwgU0lHVFJBUCwgMCwgMCwgMCwgXAorICAwLCBTSUdUUkFQLCAwLCAwLCAwLCAwLCAwLCBTSUdLSUxMLCBcCisgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFwKKyAgU0lHSUxMIH0KKworLyogU3RhcnQgcnVubmluZyB3aXRoIGEgc3RhY2sgc3RyZXRjaGluZyBmcm9tIEJFRyB0byBFTkQuCisgICBCRUcgYW5kIEVORCBzaG91bGQgYmUgc3ltYm9scyBtZWFuaW5nZnVsIHRvIHRoZSBhc3NlbWJsZXIuCisgICBUaGlzIGlzIHVzZWQgb25seSBmb3Iga2RiLiAgKi8KKworI2lmZGVmIE1PVE9ST0xBCisjZGVmaW5lIElOSVRfU1RBQ0soYmVnLCBlbmQpICBcCit7IGFzbSAoIi5nbG9ibCBlbmQiKTsgICAgICAgICBcCisgIGFzbSAoIm1vdmUubCAkIGVuZCwgc3AiKTsgICAgICBcCisgIGFzbSAoImNsci5sIGZwIik7IH0KKyNlbHNlCisjZGVmaW5lIElOSVRfU1RBQ0soYmVnLCBlbmQpICBcCit7IGFzbSAoIi5nbG9ibCBlbmQiKTsgICAgICAgICBcCisgIGFzbSAoIm1vdmVsICQgZW5kLCBzcCIpOyAgICAgIFwKKyAgYXNtICgiY2xybCBmcCIpOyB9CisjZW5kaWYKKworLyogUHVzaCB0aGUgZnJhbWUgcG9pbnRlciByZWdpc3RlciBvbiB0aGUgc3RhY2suICAqLworI2lmZGVmIE1PVE9ST0xBCisjZGVmaW5lIFBVU0hfRlJBTUVfUFRSICAgICAgICBcCisgIGFzbSAoIm1vdmUubCBmcCwgLShzcCkiKTsKKyNlbHNlCisjZGVmaW5lIFBVU0hfRlJBTUVfUFRSICAgICAgICBcCisgIGFzbSAoIm1vdmVsIGZwLCAtKHNwKSIpOworI2VuZGlmCisKKy8qIENvcHkgdGhlIHRvcC1vZi1zdGFjayB0byB0aGUgZnJhbWUgcG9pbnRlciByZWdpc3Rlci4gICovCisjaWZkZWYgTU9UT1JPTEEKKyNkZWZpbmUgUE9QX0ZSQU1FX1BUUiAgXAorICBhc20gKCJtb3ZlLmwgKHNwKSwgZnAiKTsKKyNlbHNlCisjZGVmaW5lIFBPUF9GUkFNRV9QVFIgIFwKKyAgYXNtICgibW92bCAoc3ApLCBmcCIpOworI2VuZGlmCisKKy8qIEFmdGVyIEtEQiBpcyBlbnRlcmVkIGJ5IGEgZmF1bHQsIHB1c2ggYWxsIHJlZ2lzdGVycworICAgdGhhdCBHREIgdGhpbmtzIGFib3V0IChhbGwgTlVNX1JFR1Mgb2YgdGhlbSksCisgICBzbyB0aGF0IHRoZXkgYXBwZWFyIGluIG9yZGVyIG9mIGFzY2VuZGluZyBHREIgcmVnaXN0ZXIgbnVtYmVyLgorICAgVGhlIGZhdWx0IGNvZGUgd2lsbCBiZSBvbiB0aGUgc3RhY2sgYmV5b25kIHRoZSBsYXN0IHJlZ2lzdGVyLiAgKi8KKworI2lmZGVmIE1PVE9ST0xBCisjZGVmaW5lIFBVU0hfUkVHSVNURVJTICAgICAgICBcCit7IGFzbSAoImNsci53IC0oc3ApIik7CSAgICAgIFwKKyAgYXNtICgicGVhICgxMCxzcCkiKTsJICAgICAgXAorICBhc20gKCJtb3ZlbSAkIDB4ZmZmZSwtKHNwKSIpOyB9CisjZWxzZQorI2RlZmluZSBQVVNIX1JFR0lTVEVSUyAgICAgICAgXAoreyBhc20gKCJjbHJ3IC0oc3ApIik7CSAgICAgIFwKKyAgYXNtICgicGVhIDEwKHNwKSIpOwkgICAgICBcCisgIGFzbSAoIm1vdmVtICQgMHhmZmZlLC0oc3ApIik7IH0KKyNlbmRpZgorCisvKiBBc3N1bWluZyB0aGUgcmVnaXN0ZXJzIChpbmNsdWRpbmcgcHJvY2Vzc29yIHN0YXR1cykgaGF2ZSBiZWVuCisgICBwdXNoZWQgb24gdGhlIHN0YWNrIGluIG9yZGVyIG9mIGFzY2VuZGluZyBHREIgcmVnaXN0ZXIgbnVtYmVyLAorICAgcmVzdG9yZSB0aGVtIGFuZCByZXR1cm4gdG8gdGhlIGFkZHJlc3MgaW4gdGhlIHNhdmVkIFBDIHJlZ2lzdGVyLiAgKi8KKworI2lmZGVmIE1PVE9ST0xBCisjZGVmaW5lIFBPUF9SRUdJU1RFUlMgICAgICAgICAgXAoreyBhc20gKCJzdWJpLmwgJDgsMjgoc3ApIik7ICAgICBcCisgIGFzbSAoIm1vdmVtIChzcCksJCAweGZmZmYiKTsgXAorICBhc20gKCJydGUiKTsgfQorI2Vsc2UKKyNkZWZpbmUgUE9QX1JFR0lTVEVSUyAgICAgICAgICBcCit7IGFzbSAoInN1YmlsICQ4LDI4KHNwKSIpOyAgICAgXAorICBhc20gKCJtb3ZlbSAoc3ApLCQgMHhmZmZmIik7IFwKKyAgYXNtICgicnRlIik7IH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3htLW5ld3MxMDAwLmggYi9nZGIvY29uZmlnL202OGsveG0tbmV3czEwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzAyMzRjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3htLW5ld3MxMDAwLmgKQEAgLTAsMCArMSwyNiBAQAorLyogUGFyYW1ldGVycyBmb3IgYSBTb255L05FV1Mgc2VyaWVzIDEwMDAgd2l0aCBOZXdzLU9TIHZlcnNpb24gMywKKyAgIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBpcyByZXF1aXJlZCBieSBTb255IGluY2x1ZGUgZmlsZXMgbGlrZSA8c3lzL3VzZXIuaD4gc28gd2UKKyAgIGdldCB0aGUgcmlnaHQgb2Zmc2V0IGludG8gdGhlIHUgYXJlYS4gIFJlbHlpbmcgb24gdGhlIGNvbXBpbGVyCisgICB0byBkZWZpbmUgdGhpcyBvbmx5IHdvcmtzIGZvciBjYywgbm90IGdjYy4gICovCisjdW5kZWYgbWM2ODAzMAorI2RlZmluZSBtYzY4MDMwCisjaW5jbHVkZSAibTY4ay94bS1uZXdzLmgiCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsveG0tc3VuMi5oIGIvZ2RiL2NvbmZpZy9tNjhrL3htLXN1bjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTc0NTFjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3htLXN1bjIuaApAQCAtMCwwICsxLDc4IEBACisvKiBQYXJhbWV0ZXJzIGZvciBleGVjdXRpb24gb24gYSBTdW4sIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODksIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgQklHX0VORElBTgorCisvKiBUaGlzIGlzIHRoZSBhbW91bnQgdG8gc3VidHJhY3QgZnJvbSB1LnVfYXIwCisgICB0byBnZXQgdGhlIG9mZnNldCBpbiB0aGUgY29yZSBmaWxlIG9mIHRoZSByZWdpc3RlciB2YWx1ZXMuICAqLworCisjZGVmaW5lIEtFUk5FTF9VX0FERFIgMHgyODAwCisKKwwKKy8qIEludGVyZmFjZSBkZWZpbml0aW9ucyBmb3Iga2VybmVsIGRlYnVnZ2VyIEtEQi4gICovCisKKy8qIE1hcCBtYWNoaW5lIGZhdWx0IGNvZGVzIGludG8gc2lnbmFsIG51bWJlcnMuCisgICBGaXJzdCBzdWJ0cmFjdCAwLCBkaXZpZGUgYnkgNCwgdGhlbiBpbmRleCBpbiBhIHRhYmxlLgorICAgRmF1bHRzIGZvciB3aGljaCB0aGUgZW50cnkgaW4gdGhpcyB0YWJsZSBpcyAwCisgICBhcmUgbm90IGhhbmRsZWQgYnkgS0RCOyB0aGUgcHJvZ3JhbSdzIG93biB0cmFwIGhhbmRsZXIKKyAgIGdldHMgdG8gaGFuZGxlIHRoZW4uICAqLworCisjZGVmaW5lIEZBVUxUX0NPREVfT1JJR0lOIDAKKyNkZWZpbmUgRkFVTFRfQ09ERV9VTklUUyA0CisjZGVmaW5lIEZBVUxUX1RBQkxFICAgIFwKK3sgMCwgMCwgMCwgMCwgU0lHVFJBUCwgMCwgMCwgMCwgXAorICAwLCBTSUdUUkFQLCAwLCAwLCAwLCAwLCAwLCBTSUdLSUxMLCBcCisgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFwKKyAgU0lHSUxMIH0KKworLyogU3RhcnQgcnVubmluZyB3aXRoIGEgc3RhY2sgc3RyZXRjaGluZyBmcm9tIEJFRyB0byBFTkQuCisgICBCRUcgYW5kIEVORCBzaG91bGQgYmUgc3ltYm9scyBtZWFuaW5nZnVsIHRvIHRoZSBhc3NlbWJsZXIuCisgICBUaGlzIGlzIHVzZWQgb25seSBmb3Iga2RiLiAgKi8KKworI2RlZmluZSBJTklUX1NUQUNLKGJlZywgZW5kKSAgXAoreyBhc20gKCIuZ2xvYmwgZW5kIik7ICAgICAgICAgXAorICBhc20gKCJtb3ZlbCAkIGVuZCwgc3AiKTsgICAgICBcCisgIGFzbSAoImNscmwgZnAiKTsgfQorCisvKiBQdXNoIHRoZSBmcmFtZSBwb2ludGVyIHJlZ2lzdGVyIG9uIHRoZSBzdGFjay4gICovCisjZGVmaW5lIFBVU0hfRlJBTUVfUFRSICAgICAgICBcCisgIGFzbSAoIm1vdmVsIGZwLCAtKHNwKSIpOworCisvKiBDb3B5IHRoZSB0b3Atb2Ytc3RhY2sgdG8gdGhlIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIuICAqLworI2RlZmluZSBQT1BfRlJBTUVfUFRSICBcCisgIGFzbSAoIm1vdmwgKHNwKSwgZnAiKTsKKworLyogQWZ0ZXIgS0RCIGlzIGVudGVyZWQgYnkgYSBmYXVsdCwgcHVzaCBhbGwgcmVnaXN0ZXJzCisgICB0aGF0IEdEQiB0aGlua3MgYWJvdXQgKGFsbCBOVU1fUkVHUyBvZiB0aGVtKSwKKyAgIHNvIHRoYXQgdGhleSBhcHBlYXIgaW4gb3JkZXIgb2YgYXNjZW5kaW5nIEdEQiByZWdpc3RlciBudW1iZXIuCisgICBUaGUgZmF1bHQgY29kZSB3aWxsIGJlIG9uIHRoZSBzdGFjayBiZXlvbmQgdGhlIGxhc3QgcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIFBVU0hfUkVHSVNURVJTICAgICAgICBcCit7IGFzbSAoImNscncgLShzcCkiKTsJICAgICAgXAorICBhc20gKCJwZWEgMTAoc3ApIik7CSAgICAgIFwKKyAgYXNtICgibW92ZW0gJCAweGZmZmUsLShzcCkiKTsgfQorCisvKiBBc3N1bWluZyB0aGUgcmVnaXN0ZXJzIChpbmNsdWRpbmcgcHJvY2Vzc29yIHN0YXR1cykgaGF2ZSBiZWVuCisgICBwdXNoZWQgb24gdGhlIHN0YWNrIGluIG9yZGVyIG9mIGFzY2VuZGluZyBHREIgcmVnaXN0ZXIgbnVtYmVyLAorICAgcmVzdG9yZSB0aGVtIGFuZCByZXR1cm4gdG8gdGhlIGFkZHJlc3MgaW4gdGhlIHNhdmVkIFBDIHJlZ2lzdGVyLiAgKi8KKworI2RlZmluZSBQT1BfUkVHSVNURVJTICAgICAgICAgIFwKK3sgYXNtICgic3ViaWwgJDgsMjgoc3ApIik7ICAgICBcCisgIGFzbSAoIm1vdmVtIChzcCksJCAweGZmZmYiKTsgXAorICBhc20gKCJydGUiKTsgfQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tNjhrL3htLXN1bjMuaCBiL2dkYi9jb25maWcvbTY4ay94bS1zdW4zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlNzQ0NgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTY4ay94bS1zdW4zLmgKQEAgLTAsMCArMSw3MyBAQAorLyogUGFyYW1ldGVycyBmb3IgZXhlY3V0aW9uIG9uIGEgU3VuLCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgSE9TVF9CWVRFX09SREVSIEJJR19FTkRJQU4KKworDAorLyogSW50ZXJmYWNlIGRlZmluaXRpb25zIGZvciBrZXJuZWwgZGVidWdnZXIgS0RCLiAgKi8KKworLyogTWFwIG1hY2hpbmUgZmF1bHQgY29kZXMgaW50byBzaWduYWwgbnVtYmVycy4KKyAgIEZpcnN0IHN1YnRyYWN0IDAsIGRpdmlkZSBieSA0LCB0aGVuIGluZGV4IGluIGEgdGFibGUuCisgICBGYXVsdHMgZm9yIHdoaWNoIHRoZSBlbnRyeSBpbiB0aGlzIHRhYmxlIGlzIDAKKyAgIGFyZSBub3QgaGFuZGxlZCBieSBLREI7IHRoZSBwcm9ncmFtJ3Mgb3duIHRyYXAgaGFuZGxlcgorICAgZ2V0cyB0byBoYW5kbGUgdGhlbi4gICovCisKKyNkZWZpbmUgRkFVTFRfQ09ERV9PUklHSU4gMAorI2RlZmluZSBGQVVMVF9DT0RFX1VOSVRTIDQKKyNkZWZpbmUgRkFVTFRfVEFCTEUgICAgXAoreyAwLCAwLCAwLCAwLCBTSUdUUkFQLCAwLCAwLCAwLCBcCisgIDAsIFNJR1RSQVAsIDAsIDAsIDAsIDAsIDAsIFNJR0tJTEwsIFwKKyAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgXAorICBTSUdJTEwgfQorCisvKiBTdGFydCBydW5uaW5nIHdpdGggYSBzdGFjayBzdHJldGNoaW5nIGZyb20gQkVHIHRvIEVORC4KKyAgIEJFRyBhbmQgRU5EIHNob3VsZCBiZSBzeW1ib2xzIG1lYW5pbmdmdWwgdG8gdGhlIGFzc2VtYmxlci4KKyAgIFRoaXMgaXMgdXNlZCBvbmx5IGZvciBrZGIuICAqLworCisjZGVmaW5lIElOSVRfU1RBQ0soYmVnLCBlbmQpICBcCit7IGFzbSAoIi5nbG9ibCBlbmQiKTsgICAgICAgICBcCisgIGFzbSAoIm1vdmVsICNlbmQsIHNwIik7ICAgICAgXAorICBhc20gKCJtb3ZlbCAjMCxhNiIpOyB9CisKKy8qIFB1c2ggdGhlIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIgb24gdGhlIHN0YWNrLiAgKi8KKyNkZWZpbmUgUFVTSF9GUkFNRV9QVFIgICAgICAgIFwKKyAgYXNtICgibW92ZWwgYTYsc3BALSIpOworCisvKiBDb3B5IHRoZSB0b3Atb2Ytc3RhY2sgdG8gdGhlIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIuICAqLworI2RlZmluZSBQT1BfRlJBTUVfUFRSICBcCisgIGFzbSAoIm1vdmwgc3BALGE2Iik7CisKKy8qIEFmdGVyIEtEQiBpcyBlbnRlcmVkIGJ5IGEgZmF1bHQsIHB1c2ggYWxsIHJlZ2lzdGVycworICAgdGhhdCBHREIgdGhpbmtzIGFib3V0IChhbGwgTlVNX1JFR1Mgb2YgdGhlbSksCisgICBzbyB0aGF0IHRoZXkgYXBwZWFyIGluIG9yZGVyIG9mIGFzY2VuZGluZyBHREIgcmVnaXN0ZXIgbnVtYmVyLgorICAgVGhlIGZhdWx0IGNvZGUgd2lsbCBiZSBvbiB0aGUgc3RhY2sgYmV5b25kIHRoZSBsYXN0IHJlZ2lzdGVyLiAgKi8KKworI2RlZmluZSBQVVNIX1JFR0lTVEVSUyAgICAgICAgXAoreyBhc20gKCJjbHJ3IC0oc3ApIik7CSAgICAgIFwKKyAgYXNtICgicGVhIHNwQCgxMCkiKTsJICAgICAgXAorICBhc20gKCJtb3ZlbSAjMHhmZmZlLHNwQC0iKTsgfQorCisvKiBBc3N1bWluZyB0aGUgcmVnaXN0ZXJzIChpbmNsdWRpbmcgcHJvY2Vzc29yIHN0YXR1cykgaGF2ZSBiZWVuCisgICBwdXNoZWQgb24gdGhlIHN0YWNrIGluIG9yZGVyIG9mIGFzY2VuZGluZyBHREIgcmVnaXN0ZXIgbnVtYmVyLAorICAgcmVzdG9yZSB0aGVtIGFuZCByZXR1cm4gdG8gdGhlIGFkZHJlc3MgaW4gdGhlIHNhdmVkIFBDIHJlZ2lzdGVyLiAgKi8KKworI2RlZmluZSBQT1BfUkVHSVNURVJTICAgICAgICAgIFwKK3sgYXNtICgic3ViaWwgIzgsc3BAKDI4KSIpOyAgICAgXAorICBhc20gKCJtb3ZlbSBzcEAsIzB4ZmZmZiIpOyBcCisgIGFzbSAoInJ0ZSIpOyB9CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL202OGsveG0tc3VuM29zNC5oIGIvZ2RiL2NvbmZpZy9tNjhrL3htLXN1bjNvczQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWYzYjdkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tNjhrL3htLXN1bjNvczQuaApAQCAtMCwwICsxLDIxIEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgYSBzdW4gMyBydW5uaW5nIG9zIDQuCisgICBDb3B5cmlnaHQgKEMpIDE5ODksIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJtNjhrL3htLXN1bjMuaCIKKyNkZWZpbmUgRlBVCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL204OGsvY3h1eC5taCBiL2dkYi9jb25maWcvbTg4ay9jeHV4Lm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMDIyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL204OGsvY3h1eC5taApAQCAtMCwwICsxLDcgQEAKKyMgSG9zdDogTW90b3JvbGEgODhrIHJ1bm5pbmcgQ1gvVVgKKworWE1fRklMRT0geG0tY3h1eC5oCitYREVQRklMRVM9IAorCitOQVRfRklMRT0gbm0tY3h1eC5oCitOQVRERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBjeHV4LW5hdC5vIGNvcmVsb3cubyBjb3JlLWFvdXQubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tODhrL2N4dXgubXQgYi9nZGIvY29uZmlnL204OGsvY3h1eC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTVkZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tODhrL2N4dXgubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogTW90b3JvbGEgODhrIHJ1bm5pbmcgSGFycmlzIENYL1VYCitUREVQRklMRVM9IG04OGstdGRlcC5vIHJlbW90ZS1idWcubworVE1fRklMRT0gdG0tY3h1eC5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL204OGsvZGVsdGE4OC5taCBiL2dkYi9jb25maWcvbTg4ay9kZWx0YTg4Lm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNDk2N2EKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL204OGsvZGVsdGE4OC5taApAQCAtMCwwICsxLDcgQEAKKyMgSG9zdDogTW90b3JvbGEgODhrIHJ1bm5pbmcgU1ZSMworCitYTV9GSUxFPSB4bS1kZWx0YTg4LmgKK1hERVBGSUxFUz0gCisKK05BVF9GSUxFPSBubS1tODhrLmgKK05BVERFUEZJTEVTPSBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gZm9yay1jaGlsZC5vIG04OGstbmF0Lm8gY29yZWxvdy5vIGNvcmUtYW91dC5vCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL204OGsvZGVsdGE4OC5tdCBiL2dkYi9jb25maWcvbTg4ay9kZWx0YTg4Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZTY2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL204OGsvZGVsdGE4OC5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBNb3Rvcm9sYSA4OGsgcnVubmluZyBTVlIzCitUREVQRklMRVM9IG04OGstdGRlcC5vCitUTV9GSUxFPSB0bS1kZWx0YTg4LmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTg4ay9kZWx0YTg4djQubWggYi9nZGIvY29uZmlnL204OGsvZGVsdGE4OHY0Lm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYmU4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL204OGsvZGVsdGE4OHY0Lm1oCkBAIC0wLDAgKzEsNyBAQAorIyBIb3N0OiBNb3Rvcm9sYSA4OGsgcnVubmluZyBTVlI0CisKK1hNX0ZJTEU9IHhtLWRlbHRhODh2NC5oCitYREVQRklMRVM9IAorCitOQVRfRklMRT0gbm0tZGVsdGE4OHY0LmgKK05BVERFUEZJTEVTPSBmb3JrLWNoaWxkLm8gbTg4ay1uYXQubyBjb3JlbG93Lm8gY29yZS1yZWdzZXQubyBwcm9jZnMubyBzb2xpYi5vCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL204OGsvZGVsdGE4OHY0Lm10IGIvZ2RiL2NvbmZpZy9tODhrL2RlbHRhODh2NC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzk3ZDRiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tODhrL2RlbHRhODh2NC5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBNb3Rvcm9sYSA4OGsgcnVubmluZyBTVlI0CitUREVQRklMRVM9IG04OGstdGRlcC5vCitUTV9GSUxFPSB0bS1kZWx0YTg4djQuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tODhrL204OGsubWggYi9nZGIvY29uZmlnL204OGsvbTg4ay5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTMzMjY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tODhrL204OGsubWgKQEAgLTAsMCArMSw1IEBACisjIEhvc3Q6IE1vdG9yb2xhIDg4MDAwIHJ1bm5pbmcgREdVWAorWERFUEZJTEVTPSAKK1hNX0ZJTEU9IHhtLWRndXguaAorTkFUX0ZJTEU9IG5tLW04OGsuaAorTkFUREVQRklMRVM9IGluZnB0cmFjZS5vIGluZnRhcmcubyBmb3JrLWNoaWxkLm8gbTg4ay1uYXQubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tODhrL204OGsubXQgYi9nZGIvY29uZmlnL204OGsvbTg4ay5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTNmYWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tODhrL204OGsubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogTW90b3JvbGEgODhrIEJpbmFyeSBDb21wYXRpYmlsaXR5IFN0YW5kYXJkCitUREVQRklMRVM9IG04OGstdGRlcC5vIHJlbW90ZS1idWcubworVE1fRklMRT0gdG0tbTg4ay5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL204OGsvbm0tY3h1eC5oIGIvZ2RiL2NvbmZpZy9tODhrL25tLWN4dXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWM5NTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tODhrL25tLWN4dXguaApAQCAtMCwwICsxLDMyIEBACisvKiBOYXRpdmUgZGVmaW5pdGlvbnMgZm9yIE1vdG9yb2xhIDg4SyBydW5uaW5nIEhhcnJpcyBDWC9VWAorICAgQ29weXJpZ2h0IDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogT3ZlcnJpZGUgdGhlIHN0YW5kYXJkIGZldGNoL3N0b3JlIGRlZmluaXRpb25zLiAgKi8KKworI2RlZmluZSBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMKKworI2RlZmluZSBSRUdJU1RFUl9VX0FERFIoYWRkciwgYmxvY2tlbmQsIHJlZ25vKSBcCisgICAgICAgIChhZGRyKSA9IG04OGtfcmVnaXN0ZXJfdV9hZGRyICgoYmxvY2tlbmQpLChyZWdubykpOworCisjZGVmaW5lIEFUVEFDSF9ERVRBQ0gKKworI2RlZmluZSBQVFJBQ0VfQVRUQUNIIDEyOAorI2RlZmluZSBQVFJBQ0VfREVUQUNIIDEyOQorCisKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTg4ay9ubS1kZWx0YTg4djQuaCBiL2dkYi9jb25maWcvbTg4ay9ubS1kZWx0YTg4djQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzFhMzBlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tODhrL25tLWRlbHRhODh2NC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qIE5hdGl2ZSBtYWNoaW5lIGRlc2NyaXB0aW9uIGZvciBNb3Rvcm9sYSBEZWx0YSA4OCBib3gsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAibTg4ay9ubS1tODhrLmgiCisjaW5jbHVkZSAibm0tc3lzdjQuaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTg4ay9ubS1tODhrLmggYi9nZGIvY29uZmlnL204OGsvbm0tbTg4ay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZWNhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL204OGsvbm0tbTg4ay5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qIE5hdGl2ZSBzdXBwb3J0IG1hY3JvcyBmb3IgbTg4aywgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUworCisjZGVmaW5lIFJFR0lTVEVSX1VfQUREUihhZGRyLCBibG9ja2VuZCwgcmVnbm8pIFwKKyAgICAgICAgKGFkZHIpID0gbTg4a19yZWdpc3Rlcl91X2FkZHIgKChibG9ja2VuZCksKHJlZ25vKSk7CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL204OGsvdG0tY3h1eC5oIGIvZ2RiL2NvbmZpZy9tODhrL3RtLWN4dXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTljNmRhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tODhrL3RtLWN4dXguaApAQCAtMCwwICsxLDU5IEBACisvKiBUYXJnZXQgZGVmaW5pdGlvbnMgZm9yIG04OGsgcnVubmluZyBIYXJyaXMgQ1gvVVguCisgICBDb3B5cmlnaHQgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEhBUlJJU19UQVJHRVQgMQorCisjZGVmaW5lIENYVVhfVEFSR0VUIDEKKworLyogVHlwZSBvZiBYIHJlZ2lzdGVycywgYXMgc3VwcGxpZWQgYnkgdGhlIE9TICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIGxvbmcgdzEsIHcyLCB3MywgdzQ7Cit9IFhfUkVHSVNURVJfUkFXX1RZUEU7CisKKyNkZWZpbmUgWF9SRUdJU1RFUl9WSVJUVUFMX1RZUEUgZG91YmxlCisKKyNpbmNsdWRlICJtODhrL3RtLW04OGsuaCIKKworI2RlZmluZSBBRERfU0hBUkVEX1NZTUJPTF9GSUxFUyhhcmdzLGhhdmVfdHR5KSAgYWRkX3NoYXJlZF9zeW1ib2xfZmlsZXMgKCkKKworI2RlZmluZSBDT05WRVJUX1JFR0lTVEVSX0FERFJFU1MKKworLyogQWx3YXlzIGFsbG9jYXRlIHNwYWNlIGZvciBib3RoLCBidXQgcmVjb2duaXplIHRoYXQgdGhlIG04ODEwMCBoYXMgbm8KKyAgIEZQX1JFR1MuICAqLworCisjdW5kZWYgQVJDSF9OVU1fUkVHUworI2RlZmluZSBBUkNIX05VTV9SRUdTICh0YXJnZXRfaXNfbTg4MTEwID8gKEdQX1JFR1MgKyBGUF9SRUdTKSA6IChHUF9SRUdTKSkKKworLyogRG9uJ3QgbmVlZCB0aGlzIGdyb3Rlc3F1ZXJpZS4gICovCisKKyN1bmRlZiBTSElGVF9JTlNUX1JFR1MKKworLyogRXh0ZW5kZWQgcmVnaXN0ZXJzIGFyZSB0cmVhdGVkIGFzIDE2IGJ5dGVzIGJ5IEhhcnJpcycgT1Mncy4gCisgICBXZSB0cmVhdCB0aGVtIGFzIDE2IGJ5dGVzIGhlcmUgZm9yIGNvbnNpc3RlbmN5J3Mgc2FrZS4gICovCisKKyN1bmRlZiBSRUdJU1RFUl9SQVdfU0laRQorI2RlZmluZSBSRUdJU1RFUl9SQVdfU0laRShOKSAoKE4pIDwgWEZQX1JFR05VTSA/IDQgOiAxNikKKworI3VuZGVmIFJFR0lTVEVSX0JZVEUKKyNkZWZpbmUgUkVHSVNURVJfQllURShOKSBcCisgICgoTikgPj0gWEZQX1JFR05VTSBcCisgICA/ICgoKEdQX1JFR1MpICogUkVHSVNURVJfUkFXX1NJWkUoMCkpICsgXAorICAgICAgKCgoTikgLSBYRlBfUkVHTlVNKSAqIFJFR0lTVEVSX1JBV19TSVpFKFhGUF9SRUdOVU0pKSkgXAorICAgOiAoKE4pICogUkVHSVNURVJfUkFXX1NJWkUoMCkpKQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tODhrL3RtLWRlbHRhODguaCBiL2dkYi9jb25maWcvbTg4ay90bS1kZWx0YTg4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhOWM0YQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTg4ay90bS1kZWx0YTg4LmgKQEAgLTAsMCArMSwyNiBAQAorLyogVGFyZ2V0IG1hY2hpbmUgZGVzY3JpcHRpb24gZm9yIE1vdG9yb2xhIERlbHRhIDg4IGJveCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJtODhrL3RtLW04OGsuaCIKKworI2RlZmluZSBERUxUQTg4CisKKyNkZWZpbmUgSU5fU0lHVFJBTVAocGMsIG5hbWUpICgobmFtZSkgJiYgU1RSRVEgKCJfc2lnY29kZSIsIChuYW1lKSkpCisjZGVmaW5lIFNJR1RSQU1QX0ZSQU1FX0ZJWFVQKGZyYW1lKSAoZnJhbWUpICs9IDB4MjAKKyNkZWZpbmUgU0lHVFJBTVBfU1BfRklYVVAoc3ApIChzcCkgPSByZWFkX21lbW9yeV9pbnRlZ2VyKChzcCksIDQpCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL204OGsvdG0tZGVsdGE4OHY0LmggYi9nZGIvY29uZmlnL204OGsvdG0tZGVsdGE4OHY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEyYTRhNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTg4ay90bS1kZWx0YTg4djQuaApAQCAtMCwwICsxLDMwIEBACisvKiBUYXJnZXQgbWFjaGluZSBkZXNjcmlwdGlvbiBmb3IgTW90b3JvbGEgRGVsdGEgODggYm94LCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBERUxUQTg4CisKKyNpbmNsdWRlICJtODhrL3RtLW04OGsuaCIKKyNpbmNsdWRlICJ0bS1zeXN2NC5oIgorCisvKiBJZiB3ZSBkb24ndCBkZWZpbmUgdGhpcywgYmFja3RyYWNlcyBnbyBvbiBmb3JldmVyLiAgKi8KKyNkZWZpbmUgRlJBTUVfQ0hBSU5fVkFMSUQoZnAsZmkpIGFsdGVybmF0ZV9mcmFtZV9jaGFpbl92YWxpZCAoZnAsIGZpKQorCisjZGVmaW5lIElOX1NJR1RSQU1QKHBjLCBuYW1lKSAoKG5hbWUpICYmIChTVFJFUSAoInNpZ25hbGhhbmRsZXIiLCAobmFtZSkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFNUUkVRKCJzaWdhY3RoYW5kbGVyIiwgKG5hbWUpKSkpCisjZGVmaW5lIFNJR1RSQU1QX1NQX0ZJWFVQKHNwKSAoc3ApID0gcmVhZF9tZW1vcnlfaW50ZWdlcigoc3ApKzB4Y2Q4LCA0KQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tODhrL3RtLW04OGsuaCBiL2dkYi9jb25maWcvbTg4ay90bS1tODhrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwY2RlZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTg4ay90bS1tODhrLmgKQEAgLTAsMCArMSw2MjAgQEAKKy8qIFRhcmdldCBtYWNoaW5lIGRlc2NyaXB0aW9uIGZvciBnZW5lcmljIE1vdG9yb2xhIDg4MDAwLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTMKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIGcrKyBzdXBwb3J0IGlzIG5vdCB5ZXQgaW5jbHVkZWQuICAqLworCisvKiBEZWZpbmUgdGhlIGJpdCwgYnl0ZSwgYW5kIHdvcmQgb3JkZXJpbmcgb2YgdGhlIG1hY2hpbmUuICAqLworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUiBCSUdfRU5ESUFOCisKKy8qIFdlIGNhY2hlIGluZm9ybWF0aW9uIGFib3V0IHNhdmVkIHJlZ2lzdGVycyBpbiB0aGUgZnJhbWUgc3RydWN0dXJlLAorICAgdG8gc2F2ZSB1cyBmcm9tIGhhdmluZyB0byByZS1zY2FuIGZ1bmN0aW9uIHByb2xvZ3VlcyBldmVyeSB0aW1lCisgICBhIHJlZ2lzdGVyIGluIGEgbm9uLWN1cnJlbnQgZnJhbWUgaXMgYWNjZXNzZWQuICAqLworCisjZGVmaW5lIEVYVFJBX0ZSQU1FX0lORk8gCVwKKwlzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqZnNyOwlcCisJQ09SRV9BRERSIGxvY2Fsc19wb2ludGVyOwlcCisJQ09SRV9BRERSIGFyZ3NfcG9pbnRlcjsKKworLyogWmVybyB0aGUgZnJhbWVfc2F2ZWRfcmVncyBwb2ludGVyIHdoZW4gdGhlIGZyYW1lIGlzIGluaXRpYWxpemVkLAorICAgc28gdGhhdCBGUkFNRV9GSU5EX1NBVkVEX1JFR1MgKCkgd2lsbCBrbm93IHRvIGFsbG9jYXRlIGFuZAorICAgaW5pdGlhbGl6ZSBhIGZyYW1lX3NhdmVkX3JlZ3Mgc3RydWN0IHRoZSBmaXJzdCB0aW1lIGl0IGlzIGNhbGxlZC4KKyAgIFNldCB0aGUgYXJnX3BvaW50ZXIgdG8gLTEsIHdoaWNoIGlzIG5vdCB2YWxpZDsgMCBhbmQgb3RoZXIgdmFsdWVzCisgICBpbmRpY2F0ZSByZWFsLCBjYWNoZWQgdmFsdWVzLiAgKi8KKworI2RlZmluZSBJTklUX0VYVFJBX0ZSQU1FX0lORk8oZnJvbWxlYWYsIGZpKSBcCisJaW5pdF9leHRyYV9mcmFtZV9pbmZvIChmcm9tbGVhZiwgZmkpCitleHRlcm4gdm9pZCBpbml0X2V4dHJhX2ZyYW1lX2luZm8gKCk7CisKKyNkZWZpbmUgSUVFRV9GTE9BVAorCisvKiBPZmZzZXQgZnJvbSBhZGRyZXNzIG9mIGZ1bmN0aW9uIHRvIHN0YXJ0IG9mIGl0cyBjb2RlLgorICAgWmVybyBvbiBtb3N0IG1hY2hpbmVzLiAgKi8KKworI2RlZmluZSBGVU5DVElPTl9TVEFSVF9PRkZTRVQgMAorCisvKiBBZHZhbmNlIFBDIGFjcm9zcyBhbnkgZnVuY3Rpb24gZW50cnkgcHJvbG9ndWUgaW5zdHJ1Y3Rpb25zCisgICB0byByZWFjaCBzb21lICJyZWFsIiBjb2RlLiAgKi8KKworI2RlZmluZSBTS0lQX1BST0xPR1VFKGZyb21wYykgICBcCisJeyAoZnJvbXBjKSA9IHNraXBfcHJvbG9ndWUgKGZyb21wYyk7IH0KK2V4dGVybiBDT1JFX0FERFIgc2tpcF9wcm9sb2d1ZSAoKTsKKworLyogVGhlIG04OGsga2VybmVsIGFsaWducyBhbGwgaW5zdHJ1Y3Rpb25zIG9uIDQtYnl0ZSBib3VuZGFyaWVzLiAgVGhlCisgICBrZXJuZWwgYWxzbyB1c2VzIHRoZSBsZWFzdCBzaWduaWZpY2FudCB0d28gYml0cyBmb3IgaXRzIG93biBob2N1cworICAgcG9jdXMuICBXaGVuIGdkYiByZWNlaXZlcyBhbiBhZGRyZXNzIGZyb20gdGhlIGtlcm5lbCwgaXQgbmVlZHMgdG8KKyAgIHByZXNlcnZlIHRob3NlIHJpZ2h0LW1vc3QgdHdvIGJpdHMsIGJ1dCBnZGIgYWxzbyBuZWVkcyB0byBiZSBjYXJlZnVsCisgICB0byByZWFsaXplIHRoYXQgdGhvc2UgdHdvIGJpdHMgYXJlIG5vdCByZWFsbHkgYSBwYXJ0IG9mIHRoZSBhZGRyZXNzCisgICBvZiBhbiBpbnN0cnVjdGlvbi4gIFNocnVnLiAgKi8KKworZXh0ZXJuIENPUkVfQUREUiBtODhrX2FkZHJfYml0c19yZW1vdmUgUEFSQU1TICgoQ09SRV9BRERSKSk7CisjZGVmaW5lIEFERFJfQklUU19SRU1PVkUoYWRkcikgbTg4a19hZGRyX2JpdHNfcmVtb3ZlIChhZGRyKQorCisvKiBJbW1lZGlhdGVseSBhZnRlciBhIGZ1bmN0aW9uIGNhbGwsIHJldHVybiB0aGUgc2F2ZWQgcGMuCisgICBDYW4ndCBhbHdheXMgZ28gdGhyb3VnaCB0aGUgZnJhbWVzIGZvciB0aGlzIGJlY2F1c2Ugb24gc29tZSBtYWNoaW5lcworICAgdGhlIG5ldyBmcmFtZSBpcyBub3Qgc2V0IHVwIHVudGlsIHRoZSBuZXcgZnVuY3Rpb24gZXhlY3V0ZXMKKyAgIHNvbWUgaW5zdHJ1Y3Rpb25zLiAgKi8KKworI2RlZmluZSBTQVZFRF9QQ19BRlRFUl9DQUxMKGZyYW1lKSBcCisgIChBRERSX0JJVFNfUkVNT1ZFIChyZWFkX3JlZ2lzdGVyIChTUlBfUkVHTlVNKSkpCisKKy8qIFN0YWNrIGdyb3dzIGRvd253YXJkLiAgKi8KKworI2RlZmluZSBJTk5FUl9USEFOKGxocyxyaHMpICgobGhzKSA8IChyaHMpKQorCisvKiBTZXF1ZW5jZSBvZiBieXRlcyBmb3IgYnJlYWtwb2ludCBpbnN0cnVjdGlvbi4gICovCisKKy8qIGluc3RydWN0aW9uIDB4RjAwMEQxRkYgaXMgJ3RiMCAwLHIwLDUxMScKKyAgIElmIEJpdCBiaXQgMCBvZiByMCBpcyBjbGVhciAoYWx3YXlzIHRydWUpLAorICAgaW5pdGlhdGUgZXhjZXB0aW9uIHByb2Nlc3NpbmcgKHRyYXApLgorICovCisjZGVmaW5lIEJSRUFLUE9JTlQgezB4RjAsIDB4MDAsIDB4RDEsIDB4RkZ9CisKKy8qIEFtb3VudCBQQyBtdXN0IGJlIGRlY3JlbWVudGVkIGJ5IGFmdGVyIGEgYnJlYWtwb2ludC4KKyAgIFRoaXMgaXMgb2Z0ZW4gdGhlIG51bWJlciBvZiBieXRlcyBpbiBCUkVBS1BPSU5UCisgICBidXQgbm90IGFsd2F5cy4gICovCisKKyNkZWZpbmUgREVDUl9QQ19BRlRFUl9CUkVBSyAwCisKKy8qIFNheSBob3cgbG9uZyAob3JkaW5hcnkpIHJlZ2lzdGVycyBhcmUuICBUaGlzIGlzIGEgcGllY2Ugb2YgYm9nb3NpdHkKKyAgIHVzZWQgaW4gcHVzaF93b3JkIGFuZCBhIGZldyBvdGhlciBwbGFjZXM7IFJFR0lTVEVSX1JBV19TSVpFIGlzIHRoZQorICAgcmVhbCB3YXkgdG8ga25vdyBob3cgYmlnIGEgcmVnaXN0ZXIgaXMuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1NJWkUgNAorCisvKiBOdW1iZXIgb2YgbWFjaGluZSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBHUF9SRUdTICgzOCkKKyNkZWZpbmUgRlBfUkVHUyAoMzIpCisjZGVmaW5lIE5VTV9SRUdTIChHUF9SRUdTICsgRlBfUkVHUykKKworLyogSW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIG5hbWVzIG9mIHJlZ2lzdGVycy4KKyAgIFRoZXJlIHNob3VsZCBiZSBOVU1fUkVHUyBzdHJpbmdzIGluIHRoaXMgaW5pdGlhbGl6ZXIuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX05BTUVTIHtcCisJCQkgICJyMCIsXAorCQkJICAicjEiLFwKKwkJCSAgInIyIixcCisJCQkgICJyMyIsXAorCQkJICAicjQiLFwKKwkJCSAgInI1IixcCisJCQkgICJyNiIsXAorCQkJICAicjciLFwKKwkJCSAgInI4IixcCisJCQkgICJyOSIsXAorCQkJICAicjEwIixcCisJCQkgICJyMTEiLFwKKwkJCSAgInIxMiIsXAorCQkJICAicjEzIixcCisJCQkgICJyMTQiLFwKKwkJCSAgInIxNSIsXAorCQkJICAicjE2IixcCisJCQkgICJyMTciLFwKKwkJCSAgInIxOCIsXAorCQkJICAicjE5IixcCisJCQkgICJyMjAiLFwKKwkJCSAgInIyMSIsXAorCQkJICAicjIyIixcCisJCQkgICJyMjMiLFwKKwkJCSAgInIyNCIsXAorCQkJICAicjI1IixcCisJCQkgICJyMjYiLFwKKwkJCSAgInIyNyIsXAorCQkJICAicjI4IixcCisJCQkgICJyMjkiLFwKKwkJCSAgInIzMCIsXAorCQkJICAicjMxIixcCisJCQkgICJwc3IiLFwKKwkJCSAgImZwc3IiLFwKKwkJCSAgImZwY3IiLFwKKwkJCSAgInN4aXAiLFwKKwkJCSAgInNuaXAiLFwKKwkJCSAgInNmaXAiLFwKKwkJCSAgIngwIixcCisJCQkgICJ4MSIsXAorCQkJICAieDIiLFwKKwkJCSAgIngzIixcCisJCQkgICJ4NCIsXAorCQkJICAieDUiLFwKKwkJCSAgIng2IixcCisJCQkgICJ4NyIsXAorCQkJICAieDgiLFwKKwkJCSAgIng5IixcCisJCQkgICJ4MTAiLFwKKwkJCSAgIngxMSIsXAorCQkJICAieDEyIixcCisJCQkgICJ4MTMiLFwKKwkJCSAgIngxNCIsXAorCQkJICAieDE1IixcCisJCQkgICJ4MTYiLFwKKwkJCSAgIngxNyIsXAorCQkJICAieDE4IixcCisJCQkgICJ4MTkiLFwKKwkJCSAgIngyMCIsXAorCQkJICAieDIxIixcCisJCQkgICJ4MjIiLFwKKwkJCSAgIngyMyIsXAorCQkJICAieDI0IixcCisJCQkgICJ4MjUiLFwKKwkJCSAgIngyNiIsXAorCQkJICAieDI3IixcCisJCQkgICJ4MjgiLFwKKwkJCSAgIngyOSIsXAorCQkJICAieDMwIixcCisJCQkgICJ4MzEiLFwKKwkJCSAgInZiciIsXAorCQkJICAiZG10MCIsXAorCQkJICAiZG1kMCIsXAorCQkJICAiZG1hMCIsXAorCQkJICAiZG10MSIsXAorCQkJICAiZG1kMSIsXAorCQkJICAiZG1hMSIsXAorCQkJICAiZG10MiIsXAorCQkJICAiZG1kMiIsXAorCQkJICAiZG1hMiIsXAorCQkJICAic3IwIixcCisJCQkgICJzcjEiLFwKKwkJCSAgInNyMiIsXAorCQkJICAic3IzIixcCisJCQkgICJmcGVjciIsXAorCQkJICAiZnBoczEiLFwKKwkJCSAgImZwbHMxIixcCisJCQkgICJmcGhzMiIsXAorCQkJICAiZnBsczIiLFwKKwkJCSAgImZwcHQiLFwKKwkJCSAgImZwcmgiLFwKKwkJCSAgImZwcmwiLFwKKwkJCSAgImZwaXQiLFwKKwkJCSAgImZwc3IiLFwKKwkJCSAgImZwY3IiLFwKKwkJICAgICAgfQorCisKKy8qIFJlZ2lzdGVyIG51bWJlcnMgb2YgdmFyaW91cyBpbXBvcnRhbnQgcmVnaXN0ZXJzLgorICAgTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2UgdmFsdWVzIGFyZSAicmVhbCIgcmVnaXN0ZXIgbnVtYmVycywKKyAgIGFuZCBjb3JyZXNwb25kIHRvIHRoZSBnZW5lcmFsIHJlZ2lzdGVycyBvZiB0aGUgbWFjaGluZSwKKyAgIGFuZCBzb21lIGFyZSAicGhvbnkiIHJlZ2lzdGVyIG51bWJlcnMgd2hpY2ggYXJlIHRvbyBsYXJnZQorICAgdG8gYmUgYWN0dWFsIHJlZ2lzdGVyIG51bWJlcnMgYXMgZmFyIGFzIHRoZSB1c2VyIGlzIGNvbmNlcm5lZAorICAgYnV0IGRvIHNlcnZlIHRvIGdldCB0aGUgZGVzaXJlZCB2YWx1ZXMgd2hlbiBwYXNzZWQgdG8gcmVhZF9yZWdpc3Rlci4gICovCisKKyNkZWZpbmUgUjBfUkVHTlVNIDAJCS8qIENvbnRhaW5zIHRoZSBjb25zdGFudCB6ZXJvICovCisjZGVmaW5lIFNSUF9SRUdOVU0gMQkJLyogQ29udGFpbnMgc3Vicm91dGluZSByZXR1cm4gcG9pbnRlciAqLworI2RlZmluZSBSVl9SRUdOVU0gMgkJLyogQ29udGFpbnMgc2ltcGxlIHJldHVybiB2YWx1ZXMgKi8KKyNkZWZpbmUgU1JBX1JFR05VTSAxMgkJLyogQ29udGFpbnMgYWRkcmVzcyBvZiBzdHJ1Y3QgcmV0dXJuIHZhbHVlcyAqLworI2RlZmluZSBTUF9SRUdOVU0gMzEJCS8qIENvbnRhaW5zIGFkZHJlc3Mgb2YgdG9wIG9mIHN0YWNrICovCisKKy8qIEluc3RydWN0aW9uIHBvaW50ZXIgbm90ZXMuLi4KKworICAgT24gdGhlIG04ODEwMDoKKworICAgKiBjcjA0ID0gc3hpcC4gIE9uIGV4Y2VwdGlvbiwgY29udGFpbnMgdGhlIGV4Y2VwdGluZyBwYyAocHJvYmFibHkpLgorICAgT24gcnRlLCBpcyBpZ25vcmVkLgorCisgICAqIGNyMDUgPSBzbmlwLiAgT24gZXhjZXB0aW9uLCBjb250YWlucyB0aGUgTlBDIChuZXh0IHBjKS4gIE9uIHJ0ZSwKKyAgIHBjIGlzIGxvYWRlZCBmcm9tIGhlcmUuCisKKyAgICogY3IwNiA9IHNmaXAuICBPbiBleGNlcHRpb24sIGNvbnRhaW5zIHRoZSBOTlBDIChuZXh0IG5leHQgcGMpLiAgT24KKyAgIHJ0ZSwgdGhlIE5QQyBpcyBsb2FkZWQgZnJvbSBoZXJlLgorCisgICAqIGxvd2VyIHR3byBiaXRzIG9mIGVhY2ggYXJlIGZsYWcgYml0cy4gIEJpdCAxIGlzIFYgbWVhbnMgYWRkcmVzcworICAgaXMgdmFsaWQuICBJZiBhZGRyZXNzIGlzIG5vdCB2YWxpZCwgYml0IDAgaXMgaWdub3JlZC4gIE90aGVyd2lzZSwKKyAgIGJpdCAwIGlzIEUgYW5kIGFza3MgZm9yIGFuIGV4Y2VwdGlvbiB0byBiZSB0YWtlbiBpZiB0aGlzCisgICBpbnN0cnVjdGlvbiBpcyBleGVjdXRlZC4KKworICAgT24gdGhlIG04ODExMDoKKworICAgKiBjcjA0ID0gZXhpcC4gIE9uIGV4Y2VwdGlvbiwgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGV4Y2VwdGluZworICAgcGMgKGFsd2F5cykuICBPbiBydGUsIHBjIGlzIGxvYWRlZCBmcm9tIGhlcmUuICBCaXQgMCwgYWthIHRoZSBECisgICBiaXQsIGlzIGEgZmxhZyBzYXlpbmcgdGhhdCB0aGUgb2ZmZW5kaW5nIGluc3RydWN0aW9uIHdhcyBpbiBhCisgICBicmFuY2ggZGVsYXkgc2xvdC4gIElmIHNldCwgdGhlbiBjcjA1IGNvbnRhaW5zIHRoZSBOUEMuCisKKyAgICogY3IwNSA9IGVuaXAuICBPbiBleGNlcHRpb24sIGlmIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVkIHRvIGJ5IGNyMDQKKyAgIHdhcyBpbiBhIGRlbGF5IHNsb3QgYXMgaW5kaWNhdGVkIGJ5IHRoZSBiaXQgMCBvZiBjcjA0LCBha2EgdGhlIEQKKyAgIGJpdCwgdGhlIGNyMDUgY29udGFpbnMgdGhlIE5QQy4gIE90aGVyd2lzZSBpZ25vcmVkLgorCisgICAqIGNyMDYgaXMgaW52YWxpZCAgKi8KKworLyogTm90ZSB0aGF0IHRoZSBIYXJyaXMgVW5peCBrZXJuZWxzIGVtdWxhdGUgdGhlIG04ODEwMCdzIGJlaGF2aW9yIG9uCisgICB0aGUgbTg4MTEwLiAgKi8KKworI2RlZmluZSBTWElQX1JFR05VTSAzNQkJLyogT24gbTg4MTAwLCBDb250YWlucyBTaGFkb3cgRXhlY3V0ZQorCQkJCSAgIEluc3RydWN0aW9uIFBvaW50ZXIuICAqLworI2RlZmluZSBTTklQX1JFR05VTSAzNgkJLyogT24gbTg4MTAwLCBDb250YWlucyBTaGFkb3cgTmV4dAorCQkJCSAgIEluc3RydWN0aW9uIFBvaW50ZXIuICAqLworI2RlZmluZSBTRklQX1JFR05VTSAzNwkJLyogT24gbTg4MTAwLCBDb250YWlucyBTaGFkb3cgRmV0Y2hlZAorCQkJCSAgIEludHJ1Y3Rpb24gcG9pbnRlci4gICovCisKKyNkZWZpbmUgRVhJUF9SRUdOVU0gMzUJCS8qIE9uIG04ODExMCwgQ29udGFpbnMgRXhjZXB0aW9uCisJCQkJICAgRXhlY3V0aW5nIEluc3RydWN0aW9uIFBvaW50ZXIuICAqLworI2RlZmluZSBFTklQX1JFR05VTSAzNgkJLyogT24gbTg4MTEwLCBDb250YWlucyB0aGUgRXhjZXB0aW9uCisJCQkJICAgTmV4dCBJbnN0cnVjdGlvbiBQb2ludGVyLiAgKi8KKworI2RlZmluZSBQQ19SRUdOVU0gU1hJUF9SRUdOVU0JLyogUHJvZ3JhbSBDb3VudGVyICovCisjZGVmaW5lIE5QQ19SRUdOVU0gU05JUF9SRUdOVU0JLyogTmV4dCBQcm9ncmFtIENvdW50ZXIgKi8KKyNkZWZpbmUgTk5QQ19SRUdOVU0gU0ZJUF9SRUdOVU0gLyogTmV4dCBOZXh0IFByb2dyYW0gQ291bnRlciAqLworCisjZGVmaW5lIFBTUl9SRUdOVU0gMzIgICAgICAgICAgIC8qIFByb2Nlc3NvciBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRlBTUl9SRUdOVU0gMzMJCS8qIEZsb2F0aW5nIFBvaW50IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBGUENSX1JFR05VTSAzNAkJLyogRmxvYXRpbmcgUG9pbnQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBYRlBfUkVHTlVNIDM4CQkvKiBGaXJzdCBFeHRlbmRlZCBGbG9hdCBSZWdpc3RlciAqLworI2RlZmluZSBYMF9SRUdOVU0gWEZQX1JFR05VTQkvKiBXaGljaCBhbHNvIGNvbnRhaW5zIHRoZSBjb25zdGFudCB6ZXJvICovCisKKy8qIFRoaXMgaXMgcmF0aGVyIGEgY29uZnVzaW5nIGxpZS4gIE91ciBtODhrIHBvcnQgdXNpbmcgYSBzdGFjayBwb2ludGVyIHZhbHVlCisgICBmb3IgdGhlIGZyYW1lIGFkZHJlc3MuICBIZW5jZSwgdGhlIGZyYW1lIGFkZHJlc3MgYW5kIHRoZSBmcmFtZSBwb2ludGVyIGFyZQorICAgb25seSBpbmRpcmVjdGx5IHJlbGF0ZWQuICBUaGUgdmFsdWUgb2YgdGhpcyBtYWNybyBpcyB0aGUgcmVnaXN0ZXIgbnVtYmVyCisgICBmZXRjaGVkIGJ5IHRoZSBtYWNoaW5lICJpbmRlcGVuZGVudCIgcG9ydGlvbnMgb2YgZ2RiIHdoZW4gdGhleSB3YW50IHRvIGtub3cKKyAgIGFib3V0IGEgZnJhbWUgYWRkcmVzcy4gIFRodXMsIHdlIGxpZSBoZXJlIGFuZCBjbGFpbSB0aGF0IEZQX1JFR05VTSBpcworICAgU1BfUkVHTlVNLiAgKi8KKyNkZWZpbmUgRlBfUkVHTlVNIFNQX1JFR05VTQkvKiBSZWcgZmV0Y2hlZCB0byBsb2NhdGUgZnJhbWUgd2hlbiBwZ20gc3RvcHMgKi8KKyNkZWZpbmUgQUNUVUFMX0ZQX1JFR05VTSAzMAorCisvKiBQU1Igc3RhdHVzIGJpdCBkZWZpbml0aW9ucy4gICovCisKKyNkZWZpbmUgUFNSX01PREUJCTB4ODAwMDAwMDAKKyNkZWZpbmUgUFNSX0JZVEVfT1JERVIJCTB4NDAwMDAwMDAKKyNkZWZpbmUgUFNSX1NFUklBTF9NT0RFCQkweDIwMDAwMDAwCisjZGVmaW5lIFBTUl9DQVJSWQkJMHgxMDAwMDAwMAorI2RlZmluZSBQU1JfU0ZVX0RJU0FCTEUJCTB4MDAwMDAzZjAKKyNkZWZpbmUgUFNSX1NGVTFfRElTQUJMRQkweDAwMDAwMDA4CisjZGVmaW5lIFBTUl9NWE0JCQkweDAwMDAwMDA0CisjZGVmaW5lIFBTUl9JTkQJCQkweDAwMDAwMDAyCisjZGVmaW5lIFBTUl9TRlJaCQkweDAwMDAwMDAxCisKKworCisvKiBUaGUgZm9sbG93aW5nIHR3byBjb21tZW50cyBjb21lIGZyb20gdGhlIGRheXMgcHJpb3IgdG8gdGhlIG04ODExMAorICAgcG9ydC4gIFRoZSBtODgxMTAgaGFuZGxlcyB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlcnMgZGlmZmVyZW50bHkuICBJCisgICBkbyBub3Qga25vdyB3aGF0IGFueSBtODgxMTAga2VybmVscyBkbyBhcyB0aGUgbTg4MTEwIHBvcnQgSSdtCisgICB3b3JraW5nIHdpdGggaXMgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbS4gIHJpY2hAY3lnbnVzLmNvbQorICAgMTMtc2VwdC05My4gICovCisKKy8qIEJDUyByZXF1aXJlcyB0aGF0IHRoZSBTWElQX1JFR05VTSAob3IgUENfUkVHTlVNKSBjb250YWluIHRoZQorICAgYWRkcmVzcyBvZiB0aGUgbmV4dCBpbnN0ciB0byBiZSBleGVjdXRlZCB3aGVuIGEgYnJlYWtwb2ludCBvY2N1cnMuCisgICBCZWNhdXNlIHRoZSBrZXJuZWwgZ2V0cyB0aGUgbmV4dCBpbnN0ciAoU05JUF9SRUdOVU0pLCB0aGUgaW5zdHIgaW4KKyAgIFNOSVAgbmVlZHMgdG8gYmUgcHV0IGJhY2sgaW50byBTRklQLCBhbmQgdGhlIGluc3RyIGluIFNYSVAgc2hvdWxkCisgICBiZSBzaGlmdGVkIHRvIFNOSVAgKi8KKworLyogQXJlIHlvdSBzaXR0aW5nIGRvd24/ICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgODhLIEJDUyAoYmluYXJ5CisgICBjb21wYXRpYmlsaXR5IHN0YW5kYXJkKSBmb2xrcyBvcmlnaW5hbGx5IGZlbHQgdGhhdCB0aGUgZGVidWdnZXIKKyAgIHNob3VsZCBiZSByZXNwb25zaWJsZSBmb3IgYmFja2luZyB1cCB0aGUgSVBzLCBub3QgdGhlIGtlcm5lbCAoYXMgaXMKKyAgIHVzdWFsbHkgZG9uZSkuICBXZWxsLCB0aGV5IGhhdmUgcmV2ZXJzZWQgdGhlaXIgZGVjaXNpb24sIGFuZCBpbgorICAgZnV0dXJlIHJlbGVhc2VzIG91ciBrZXJuZWwgd2lsbCBiZSBoYW5kbGluZyB0aGUgYmFja2luZyB1cCBvZiB0aGUKKyAgIElQcy4gIFNvLCBldmVudHVhbGx5LCB3ZSB3b24ndCBuZWVkIHRvIGRvIHRoZSBTSElGVF9JTlNUX1JFR1MKKyAgIHN0dWZmLiAgQnV0LCBmb3Igbm93LCBzaW5jZSB0aGVyZSBhcmUgODhLIHN5c3RlbXMgb3V0IHRoZXJlIHRoYXQgZG8KKyAgIG5lZWQgdGhlIGRlYnVnZ2VyIHRvIGRvIHRoZSBJUCBzaGlmdGluZywgYW5kIHNpbmNlIHRoZXJlIHdpbGwgYmUKKyAgIHN5c3RlbXMgd2hlcmUgdGhlIGtlcm5lbCBkb2VzIHRoZSBzaGlmdGluZywgdGhlIGNvZGUgaXMgYSBsaXR0bGUKKyAgIG1vcmUgY29tcGxleCB0aGFuIHBlcmhhcHMgaXQgbmVlZHMgdG8gYmUgKHdlIHN0aWxsIGdvIGluc2lkZQorICAgU0hJRlRfSU5TVF9SRUdTLCBhbmQgaWYgdGhlIHNoaWZ0aW5nIGhhc24ndCBvY2N1cnJlZCB0aGVuIGdkYiBnb2VzCisgICBhaGVhZCBhbmQgc2hpZnRzKS4gICovCisKK2V4dGVybiBpbnQgdGFyZ2V0X2lzX204ODExMDsKKyNkZWZpbmUgU0hJRlRfSU5TVF9SRUdTKCkgXAoraWYgKCF0YXJnZXRfaXNfbTg4MTEwKSBcCit7IFwKKyAgICBDT1JFX0FERFIgcGMgPSByZWFkX3JlZ2lzdGVyIChQQ19SRUdOVU0pOyBcCisgICAgQ09SRV9BRERSIG5wYyA9IHJlYWRfcmVnaXN0ZXIgKE5QQ19SRUdOVU0pOyBcCisgICAgaWYgKHBjICE9IG5wYykgXAorICAgIHsgXAorCXdyaXRlX3JlZ2lzdGVyIChOTlBDX1JFR05VTSwgbnBjKTsgXAorCXdyaXRlX3JlZ2lzdGVyIChOUENfUkVHTlVNLCBwYyk7IFwKKyAgICB9IFwKK30KKworICAgIC8qIFN0b3JpbmcgdGhlIGZvbGxvd2luZyByZWdpc3RlcnMgaXMgYSBuby1vcC4gKi8KKyNkZWZpbmUgQ0FOTk9UX1NUT1JFX1JFR0lTVEVSKHJlZ25vKQkoKChyZWdubykgPT0gUjBfUkVHTlVNKSBcCisJCQkJCSB8fCAoKHJlZ25vKSA9PSBYMF9SRUdOVU0pKQorCisgIC8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBhY3R1YWwgbWFjaGluZSByZXByZXNlbnRhdGlvbgorICAgICBmb3IgcmVnaXN0ZXIgTi4gIE9uIHRoZSBtODhrLCAgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgYXJlIDQKKyAgICAgYnl0ZXMgYW5kIHRoZSA4ODExMCBleHRlbmRlZCByZWdpc3RlcnMgYXJlIDEwIGJ5dGVzLiAqLworCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pICgoTikgPCBYRlBfUkVHTlVNID8gNCA6IDEwKQorCisgIC8qIFRvdGFsIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgdG8gc3RvcmUgb3VyIGNvcGllcyBvZiB0aGUgbWFjaGluZSdzCisgICAgIHJlZ2lzdGVyIHN0YXRlLCB0aGUgYXJyYXkgYHJlZ2lzdGVycycuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTICgoR1BfUkVHUyAqIFJFR0lTVEVSX1JBV19TSVpFKDApKSBcCisJCQkrIChGUF9SRUdTICogUkVHSVNURVJfUkFXX1NJWkUoWEZQX1JFR05VTSkpKQorCisgIC8qIEluZGV4IHdpdGhpbiBgcmVnaXN0ZXJzJyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3BhY2UgZm9yCisgICAgIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0JZVEUoTikgKCgoTikgKiBSRUdJU1RFUl9SQVdfU0laRSgwKSkgXAorCQkJICArICgoTikgPj0gWEZQX1JFR05VTSBcCisJCQkgICAgID8gKCgoTikgLSBYRlBfUkVHTlVNKSBcCisJCQkJKiBSRUdJU1RFUl9SQVdfU0laRShYRlBfUkVHTlVNKSkgXAorCQkJICAgICA6IDApKQorCisgIC8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBwcm9ncmFtJ3MgcmVwcmVzZW50YXRpb24gZm9yCisgICAgIHJlZ2lzdGVyIE4uICBPbiB0aGUgbTg4aywgYWxsIHJlZ2lzdGVycyBhcmUgNCBieXRlcyBleGNlcHRpbmcgdGhlCisgICAgIG04ODExMCBleHRlbmRlZCByZWdpc3RlcnMgd2hpY2ggYXJlIDggYnl0ZSBkb3VibGVzLiAqLworCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfU0laRShOKSAoKE4pIDwgWEZQX1JFR05VTSA/IDQgOiA4KQorCisgIC8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfUkFXX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9SQVdfU0laRSAoUkVHSVNURVJfUkFXX1NJWkUoWEZQX1JFR05VTSkpCisKKyAgLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUgY2FuIGhhdmUuCisgICAgIEFyZSBGUFMxLCBGUFMyLCBGUFIgInZpcnR1YWwiIHJlZ2lzZXJzPyAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUgKFJFR0lTVEVSX1JBV19TSVpFKFhGUF9SRUdOVU0pKQorCisgIC8qIE5vbnplcm8gaWYgcmVnaXN0ZXIgTiByZXF1aXJlcyBjb252ZXJzaW9uCisgICAgIGZyb20gcmF3IGZvcm1hdCB0byB2aXJ0dWFsIGZvcm1hdC4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfQ09OVkVSVElCTEUoTikgKChOKSA+PSBYRlBfUkVHTlVNKQorCisjaW5jbHVkZSAiZmxvYXRmb3JtYXQuaCIKKworLyogQ29udmVydCBkYXRhIGZyb20gcmF3IGZvcm1hdCBmb3IgcmVnaXN0ZXIgUkVHTlVNIGluIGJ1ZmZlciBGUk9NCisgICB0byB2aXJ0dWFsIGZvcm1hdCB3aXRoIHR5cGUgVFlQRSBpbiBidWZmZXIgVE8uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0NPTlZFUlRfVE9fVklSVFVBTChSRUdOVU0sVFlQRSxGUk9NLFRPKSBcCit7IFwKKyAgZG91YmxlIHZhbDsgXAorICBmbG9hdGZvcm1hdF90b19kb3VibGUgKCZmbG9hdGZvcm1hdF9tODgxMTBfZXh0LCAoRlJPTSksICZ2YWwpOyBcCisgIHN0b3JlX2Zsb2F0aW5nICgoVE8pLCBUWVBFX0xFTkdUSCAoVFlQRSksIHZhbCk7IFwKK30KKworLyogQ29udmVydCBkYXRhIGZyb20gdmlydHVhbCBmb3JtYXQgd2l0aCB0eXBlIFRZUEUgaW4gYnVmZmVyIEZST00KKyAgIHRvIHJhdyBmb3JtYXQgZm9yIHJlZ2lzdGVyIFJFR05VTSBpbiBidWZmZXIgVE8uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0NPTlZFUlRfVE9fUkFXKFRZUEUsUkVHTlVNLEZST00sVE8pCVwKK3sgXAorICBkb3VibGUgdmFsID0gZXh0cmFjdF9mbG9hdGluZyAoKEZST00pLCBUWVBFX0xFTkdUSCAoVFlQRSkpOyBcCisgIGZsb2F0Zm9ybWF0X2Zyb21fZG91YmxlICgmZmxvYXRmb3JtYXRfbTg4MTEwX2V4dCwgJnZhbCwgKFRPKSk7IFwKK30KKworLyogUmV0dXJuIHRoZSBHREIgdHlwZSBvYmplY3QgZm9yIHRoZSAic3RhbmRhcmQiIGRhdGEgdHlwZQorICAgb2YgZGF0YSBpbiByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1RZUEUoTikgXAorKChOKSA+PSBYRlBfUkVHTlVNIFwKKyA/IGJ1aWx0aW5fdHlwZV9kb3VibGUgXAorIDogKChOKSA9PSBQQ19SRUdOVU0gfHwgKE4pID09IEZQX1JFR05VTSB8fCAoTikgPT0gU1BfUkVHTlVNIFwKKyAgICA/IGxvb2t1cF9wb2ludGVyX3R5cGUgKGJ1aWx0aW5fdHlwZV92b2lkKSA6IGJ1aWx0aW5fdHlwZV9pbnQpKQorCisvKiBUaGUgODhrIGNhbGwvcmV0dXJuIGNvbnZlbnRpb25zIGNhbGwgZm9yICJzbWFsbCIgdmFsdWVzIHRvIGJlIHJldHVybmVkCisgICBpbnRvIGNvbnNlY3V0aXZlIHJlZ2lzdGVycyBzdGFydGluZyBmcm9tIHIyLiAgKi8KKworI2RlZmluZSBFWFRSQUNUX1JFVFVSTl9WQUxVRShUWVBFLFJFR0JVRixWQUxCVUYpIFwKKyAgbWVtY3B5ICgoVkFMQlVGKSwgJigoKGNoYXIgKilSRUdCVUYpW1JFR0lTVEVSX0JZVEUoUlZfUkVHTlVNKV0pLCBUWVBFX0xFTkdUSCAoVFlQRSkpCisKKyNkZWZpbmUgRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyhSRUdCVUYpICgqKGludCAqKShSRUdCVUYpKQorCisvKiBXcml0ZSBpbnRvIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZQorICAgb2YgdHlwZSBUWVBFLCBnaXZlbiBpbiB2aXJ0dWFsIGZvcm1hdC4gICovCisKKyNkZWZpbmUgU1RPUkVfUkVUVVJOX1ZBTFVFKFRZUEUsVkFMQlVGKSBcCisgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzICgyKlJFR0lTVEVSX1JBV19TSVpFKDApLCAoVkFMQlVGKSwgVFlQRV9MRU5HVEggKFRZUEUpKQorCisvKiBJbiBDT0ZGLCBpZiBQQ0Mgc2F5cyBhIHBhcmFtZXRlciBpcyBhIHNob3J0IG9yIGEgY2hhciwgZG8gbm90CisgICBjaGFuZ2UgaXQgdG8gaW50IChpdCBzZWVtcyB0aGUgY29udmVudGlvbiBpcyB0byBjaGFuZ2UgaXQpLiAqLworCisjZGVmaW5lIEJFTElFVkVfUENDX1BST01PVElPTiAxCisKKy8qIERlc2NyaWJlIHRoZSBwb2ludGVyIGluIGVhY2ggc3RhY2sgZnJhbWUgdG8gdGhlIHByZXZpb3VzIHN0YWNrIGZyYW1lCisgICAoaXRzIGNhbGxlcikuICAqLworCisvKiBGUkFNRV9DSEFJTiB0YWtlcyBhIGZyYW1lJ3Mgbm9taW5hbCBhZGRyZXNzCisgICBhbmQgcHJvZHVjZXMgdGhlIGZyYW1lJ3MgY2hhaW4tcG9pbnRlci4KKworICAgSG93ZXZlciwgaWYgRlJBTUVfQ0hBSU5fVkFMSUQgcmV0dXJucyB6ZXJvLAorICAgaXQgbWVhbnMgdGhlIGdpdmVuIGZyYW1lIGlzIHRoZSBvdXRlcm1vc3Qgb25lIGFuZCBoYXMgbm8gY2FsbGVyLiAgKi8KKworZXh0ZXJuIENPUkVfQUREUiBmcmFtZV9jaGFpbiAoKTsKK2V4dGVybiBpbnQgZnJhbWVfY2hhaW5fdmFsaWQgKCk7CitleHRlcm4gaW50IGZyYW1lbGVzc19mdW5jdGlvbl9pbnZvY2F0aW9uICgpOworCisjZGVmaW5lIEZSQU1FX0NIQUlOKHRoaXNmcmFtZSkgXAorCWZyYW1lX2NoYWluICh0aGlzZnJhbWUpCisKKyNkZWZpbmUJRlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT04oZnJhbWUsIGZyb21sZWFmKQlcCisJZnJvbWxlYWYgPSBmcmFtZWxlc3NfZnVuY3Rpb25faW52b2NhdGlvbiAoZnJhbWUpCisKKy8qIERlZmluZSBvdGhlciBhc3BlY3RzIG9mIHRoZSBzdGFjayBmcmFtZS4gICovCisKKyNkZWZpbmUgRlJBTUVfU0FWRURfUEMoRlJBTUUpCVwKKwlmcmFtZV9zYXZlZF9wYyAoRlJBTUUpCitleHRlcm4gQ09SRV9BRERSIGZyYW1lX3NhdmVkX3BjICgpOworCisjZGVmaW5lIEZSQU1FX0FSR1NfQUREUkVTUyhmaSkJXAorCWZyYW1lX2FyZ3NfYWRkcmVzcyAoZmkpCitleHRlcm4gQ09SRV9BRERSIGZyYW1lX2FyZ3NfYWRkcmVzcyAoKTsKKworI2RlZmluZSBGUkFNRV9MT0NBTFNfQUREUkVTUyhmaSkgXAorCWZyYW1lX2xvY2Fsc19hZGRyZXNzIChmaSkKK2V4dGVybiBDT1JFX0FERFIgZnJhbWVfbG9jYWxzX2FkZHJlc3MgKCk7CisKKy8qIFJldHVybiBudW1iZXIgb2YgYXJncyBwYXNzZWQgdG8gYSBmcmFtZS4KKyAgIENhbiByZXR1cm4gLTEsIG1lYW5pbmcgbm8gd2F5IHRvIHRlbGwuICAqLworCisjZGVmaW5lIEZSQU1FX05VTV9BUkdTKG51bWFyZ3MsIGZpKSAgKChudW1hcmdzKSA9IC0xKQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGF0IHN0YXJ0IG9mIGFyZ2xpc3QgdGhhdCBhcmUgbm90IHJlYWxseSBhcmdzLiAgKi8KKworI2RlZmluZSBGUkFNRV9BUkdTX1NLSVAgMAorCisvKiBQdXQgaGVyZSB0aGUgY29kZSB0byBzdG9yZSwgaW50byBhIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzLAorICAgdGhlIGFkZHJlc3NlcyBvZiB0aGUgc2F2ZWQgcmVnaXN0ZXJzIG9mIGZyYW1lIGRlc2NyaWJlZCBieSBGUkFNRV9JTkZPLgorICAgVGhpcyBpbmNsdWRlcyBzcGVjaWFsIHJlZ2lzdGVycyBzdWNoIGFzIHBjIGFuZCBmcCBzYXZlZCBpbiBzcGVjaWFsCisgICB3YXlzIGluIHRoZSBzdGFjayBmcmFtZS4gIHNwIGlzIGV2ZW4gbW9yZSBzcGVjaWFsOgorICAgdGhlIGFkZHJlc3Mgd2UgcmV0dXJuIGZvciBpdCBJUyB0aGUgc3AgZm9yIHRoZSBuZXh0IGZyYW1lLiAgKi8KKworLyogT24gdGhlIDg4aywgcGFyYW1ldGVyIHJlZ2lzdGVycyBnZXQgc3RvcmVkIGludG8gdGhlIHNvIGNhbGxlZCAiaG9taW5nIgorICAgYXJlYS4gIFRoaXMgKmFsd2F5cyogaGFwcGVucyB3aGVuIHlvdSBjb21waWxlZCB3aXRoIEdDQyBhbmQgdXNlIC1nLgorICAgQWxzbywgKHdpdGggR0NDIGFuZCAtZykgdGhlIHNhdmluZyBvZiB0aGUgcGFyYW1ldGVyIHJlZ2lzdGVyIHZhbHVlcworICAgYWx3YXlzIGhhcHBlbnMgcmlnaHQgd2l0aGluIHRoZSBmdW5jdGlvbiBwcm9sb2d1ZSBjb2RlLCBzbyB0aGVzZSByZWdpc3RlcgorICAgdmFsdWVzIGNhbiBnZW5lcmFsbHkgYmUgcmVsaWVkIHVwb24gdG8gYmUgYWxyZWFkeSBjb3BpZWQgaW50byB0aGVpcgorICAgcmVzcGVjdGl2ZSBob21pbmcgc2xvdHMgYnkgdGhlIHRpbWUgeW91IHdpbGwgbm9ybWFsbHkgdHJ5IHRvIGxvb2sgYXQKKyAgIHRoZW0gKHdlIGhvcGUpLgorCisgICBOb3RlIHRoYXQgaG9taW5nIGFyZWEgc3RhY2sgc2xvdHMgYXJlIGFsd2F5cyBhdCAqcG9zaXRpdmUqIG9mZnNldHMgZnJvbQorICAgdGhlIGZyYW1lIHBvaW50ZXIuICBUaHVzLCB0aGUgaG9taW5nIGFyZWEgc3RhY2sgc2xvdHMgZm9yIHRoZSBwYXJhbWV0ZXIKKyAgIHJlZ2lzdGVycyAocGFzc2VkIHZhbHVlcykgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24gYXJlIGFjdHVhbGx5IHBhcnQgb2YgdGhlCisgICBmcmFtZSBhcmVhIG9mIHRoZSBjYWxsZXIuICBUaGlzIGlzIHVudXN1YWwsIGJ1dCBpdCBzaG91bGQgbm90IHByZXNlbnQKKyAgIGFueSBzcGVjaWFsIHByb2JsZW1zIGZvciBHREIuCisKKyAgIE5vdGUgYWxzbyB0aGF0IG9uIHRoZSA4OGssIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gZmluZGluZyB0aGUKKyAgIHJlZ2lzdGVycyB0aGF0IG1pZ2h0IGhhdmUgYmVlbiBzYXZlZCBpbiBtZW1vcnkuICBUaGlzIGlzIGEgc3Vic2V0IG9mCisgICB0aGUgd2hvbGUgc2V0IG9mIHJlZ2lzdGVycyBiZWNhdXNlIHRoZSBzdGFuZGFyZCBjYWxsaW5nIHNlcXVlbmNlIGFsbG93cworICAgdGhlIGNhbGxlZCByb3V0aW5lIHRvIGNsb2JiZXIgbWFueSByZWdpc3RlcnMuCisKKyAgIFdlIGNvdWxkIG1hbmFnZSB0byBsb2NhdGUgdmFsdWVzIGZvciBhbGwgb2YgdGhlIHNvIGNhbGxlZCAicHJlc2VydmVkIgorICAgcmVnaXN0ZXJzIChzb21lIG9mIHdoaWNoIG1heSBnZXQgc2F2ZWQgd2l0aGluIGFueSBwYXJ0aWN1bGFyIGZyYW1lKSBidXQKKyAgIHRoYXQgd291bGQgcmVxdWlyZSBkZWNvZGluZyBhbGwgb2YgdGhlIHRkZXNjIGluZm9ybWF0aW9uLiAgVGhhdCB3b3VsZCBiZQorICAgbmljZSBpbmZvcm1hdGlvbiBmb3IgR0RCIHRvIGhhdmUsIGJ1dCBpdCBpcyBub3Qgc3RyaWN0bHkgbWFuZGl0b3J5IGlmIHdlCisgICBjYW4gbGl2ZSB3aXRob3V0IHRoZSBhYmlsaXR5IHRvIGxvb2sgYXQgdmFsdWVzIHdpdGhpbiAob3IgYmFja3VwIHRvKQorICAgcHJldmlvdXMgZnJhbWVzLgorKi8KKworc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3M7CitzdHJ1Y3QgZnJhbWVfaW5mbzsKKwordm9pZCBmcmFtZV9maW5kX3NhdmVkX3JlZ3MgUEFSQU1TKChzdHJ1Y3QgZnJhbWVfaW5mbyAqZmksCisJCQkJICAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKmZzcikpOworCisjZGVmaW5lIEZSQU1FX0ZJTkRfU0FWRURfUkVHUyhmcmFtZV9pbmZvLCBmcmFtZV9zYXZlZF9yZWdzKSBcCisgICAgICAgIGZyYW1lX2ZpbmRfc2F2ZWRfcmVncyAoZnJhbWVfaW5mbywgJmZyYW1lX3NhdmVkX3JlZ3MpCisKKwwKKyNkZWZpbmUgUE9QX0ZSQU1FIHBvcF9mcmFtZSAoKQorZXh0ZXJuIHZvaWQgcG9wX2ZyYW1lICgpOworCisvKiBDYWxsIGZ1bmN0aW9uIHN0dWZmIGNvbnRyaWJ1dGVkIGJ5IEtldmluIEJ1ZXR0bmVyIG9mIE1vdG9yb2xhLiAgKi8KKworI2RlZmluZSBDQUxMX0RVTU1ZX0xPQ0FUSU9OIEFGVEVSX1RFWFRfRU5ECisKK2V4dGVybiB2b2lkIG04OGtfcHVzaF9kdW1teV9mcmFtZSgpOworI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FCW04OGtfcHVzaF9kdW1teV9mcmFtZSgpCisKKyNkZWZpbmUgQ0FMTF9EVU1NWSB7IAkJCQlcCisweDY3ZmYwMGMwLAkvKiAgIDA6ICAgc3VidQkjc3AsI3NwLDB4YzAgKi8gXAorMHgyNDNmMDAwNCwJLyogICA0OiAgIHN0CSNyMSwjc3AsMHg0ICovIFwKKzB4MjQ1ZjAwMDgsCS8qICAgODogICBzdAkjcjIsI3NwLDB4OCAqLyBcCisweDI0N2YwMDBjLAkvKiAgIGM6ICAgc3QJI3IzLCNzcCwweGMgKi8gXAorMHgyNDlmMDAxMCwJLyogIDEwOiAgIHN0CSNyNCwjc3AsMHgxMCAqLyBcCisweDI0YmYwMDE0LAkvKiAgMTQ6ICAgc3QJI3I1LCNzcCwweDE0ICovIFwKKzB4MjRkZjAwMTgsCS8qICAxODogICBzdAkjcjYsI3NwLDB4MTggKi8gXAorMHgyNGZmMDAxYywJLyogIDFjOiAgIHN0CSNyNywjc3AsMHgxYyAqLyBcCisweDI1MWYwMDIwLAkvKiAgMjA6ICAgc3QJI3I4LCNzcCwweDIwICovIFwKKzB4MjUzZjAwMjQsCS8qICAyNDogICBzdAkjcjksI3NwLDB4MjQgKi8gXAorMHgyNTVmMDAyOCwJLyogIDI4OiAgIHN0CSNyMTAsI3NwLDB4MjggKi8gXAorMHgyNTdmMDAyYywJLyogIDJjOiAgIHN0CSNyMTEsI3NwLDB4MmMgKi8gXAorMHgyNTlmMDAzMCwJLyogIDMwOiAgIHN0CSNyMTIsI3NwLDB4MzAgKi8gXAorMHgyNWJmMDAzNCwJLyogIDM0OiAgIHN0CSNyMTMsI3NwLDB4MzQgKi8gXAorMHgyNWRmMDAzOCwJLyogIDM4OiAgIHN0CSNyMTQsI3NwLDB4MzggKi8gXAorMHgyNWZmMDAzYywJLyogIDNjOiAgIHN0CSNyMTUsI3NwLDB4M2MgKi8gXAorMHgyNjFmMDA0MCwJLyogIDQwOiAgIHN0CSNyMTYsI3NwLDB4NDAgKi8gXAorMHgyNjNmMDA0NCwJLyogIDQ0OiAgIHN0CSNyMTcsI3NwLDB4NDQgKi8gXAorMHgyNjVmMDA0OCwJLyogIDQ4OiAgIHN0CSNyMTgsI3NwLDB4NDggKi8gXAorMHgyNjdmMDA0YywJLyogIDRjOiAgIHN0CSNyMTksI3NwLDB4NGMgKi8gXAorMHgyNjlmMDA1MCwJLyogIDUwOiAgIHN0CSNyMjAsI3NwLDB4NTAgKi8gXAorMHgyNmJmMDA1NCwJLyogIDU0OiAgIHN0CSNyMjEsI3NwLDB4NTQgKi8gXAorMHgyNmRmMDA1OCwJLyogIDU4OiAgIHN0CSNyMjIsI3NwLDB4NTggKi8gXAorMHgyNmZmMDA1YywJLyogIDVjOiAgIHN0CSNyMjMsI3NwLDB4NWMgKi8gXAorMHgyNzFmMDA2MCwJLyogIDYwOiAgIHN0CSNyMjQsI3NwLDB4NjAgKi8gXAorMHgyNzNmMDA2NCwJLyogIDY0OiAgIHN0CSNyMjUsI3NwLDB4NjQgKi8gXAorMHgyNzVmMDA2OCwJLyogIDY4OiAgIHN0CSNyMjYsI3NwLDB4NjggKi8gXAorMHgyNzdmMDA2YywJLyogIDZjOiAgIHN0CSNyMjcsI3NwLDB4NmMgKi8gXAorMHgyNzlmMDA3MCwJLyogIDcwOiAgIHN0CSNyMjgsI3NwLDB4NzAgKi8gXAorMHgyN2JmMDA3NCwJLyogIDc0OiAgIHN0CSNyMjksI3NwLDB4NzQgKi8gXAorMHgyN2RmMDA3OCwJLyogIDc4OiAgIHN0CSNyMzAsI3NwLDB4NzggKi8gXAorMHg2M2RmMDAwMCwJLyogIDdjOiAgIGFkZHUJI3IzMCwjc3AsMHgwICovIFwKKzB4MTQ1ZjAwMDAsCS8qICA4MDogICBsZAkjcjIsI3NwLDB4MCAqLyBcCisweDE0N2YwMDA0LAkvKiAgODQ6ICAgbGQJI3IzLCNzcCwweDQgKi8gXAorMHgxNDlmMDAwOCwJLyogIDg4OiAgIGxkCSNyNCwjc3AsMHg4ICovIFwKKzB4MTRiZjAwMGMsCS8qICA4YzogICBsZAkjcjUsI3NwLDB4YyAqLyBcCisweDE0ZGYwMDEwLAkvKiAgOTA6ICAgbGQJI3I2LCNzcCwweDEwICovIFwKKzB4MTRmZjAwMTQsCS8qICA5NDogICBsZAkjcjcsI3NwLDB4MTQgKi8gXAorMHgxNTFmMDAxOCwJLyogIDk4OiAgIGxkCSNyOCwjc3AsMHgxOCAqLyBcCisweDE1M2YwMDFjLAkvKiAgOWM6ICAgbGQJI3I5LCNzcCwweDFjICovIFwKKzB4NWMyMDAwMDAsCS8qICBhMDogICBvci51CSNyMSwjcjAsMHgwICovIFwKKzB4NTgyMTAwMDAsCS8qICBhNDogICBvcgkjcjEsI3IxLDB4MCAqLyBcCisweGY0MDBjODAxLAkvKiAgYTg6ICAganNyCSNyMSAqLyBcCisweGYwMDBkMWZmCS8qICBhYzogICB0YjAJMHgwLCNyMCwweDFmZiAqLyBcCit9CisKKyNkZWZpbmUgQ0FMTF9EVU1NWV9TVEFSVF9PRkZTRVQgMHg4MAorI2RlZmluZSBDQUxMX0RVTU1ZX0xFTkdUSCAweGIwCisKKy8qIEZJWE1FOiBieXRlc3dhcHBpbmcuICAqLworI2RlZmluZSBGSVhfQ0FMTF9EVU1NWShkdW1teSwgcGMsIGZ1biwgbmFyZ3MsIGFyZ3MsIHR5cGUsIGdjY19wKQlcCit7IAkJCQkJCQkJCVwKKyAgKih1bnNpZ25lZCBsb25nICopKChjaGFyICopIChkdW1teSkgKyAweGEwKSB8PQkJCVwKKwkoKCh1bnNpZ25lZCBsb25nKSAoZnVuKSkgPj4gMTYpOwkJCQlcCisgICoodW5zaWduZWQgbG9uZyAqKSgoY2hhciAqKSAoZHVtbXkpICsgMHhhNCkgfD0JCQlcCisJKCgodW5zaWduZWQgbG9uZykgKGZ1bikpICYgMHhmZmZmKTsJCQkJXAorICBwYyA9IHRleHRfZW5kOwkJCQkJCQlcCit9CisKKy8qIFN0YWNrIG11c3QgYmUgYWxpZ25lZCBvbiA2NC1iaXQgYm91bmRhcmllcyB3aGVuIHN5bnRoZXNpemluZworICAgZnVuY3Rpb24gY2FsbHMuICovCisKKyNkZWZpbmUgU1RBQ0tfQUxJR04oYWRkcikgKCgoYWRkcikgKyA3KSAmIC04KQorCisjZGVmaW5lIFNUT1JFX1NUUlVDVF9SRVRVUk4oYWRkciwgc3ApIFwKKyAgICB3cml0ZV9yZWdpc3RlciAoU1JBX1JFR05VTSwgKGFkZHIpKQorCisjZGVmaW5lIE5FRURfVEVYVF9TVEFSVF9FTkQgMQorCisvKiBBY2NvcmRpbmcgdG8gdGhlIE1DODgxMDAgUklTQyBNaWNyb3Byb2Nlc3NvciBVc2VyJ3MgTWFudWFsLCBzZWN0aW9uCisgICA2LjQuMy4xLjI6CisKKyAgIAkuLi4gY2FuIGJlIG1hZGUgdG8gcmV0dXJuIHRvIGEgcGFydGljdWxhciBpbnN0cnVjdGlvbiBieSBwbGFjaW5nIGEKKwl2YWxpZCBpbnN0cnVjdGlvbiBhZGRyZXNzIGluIHRoZSBTTklQIGFuZCB0aGUgbmV4dCBzZXF1ZW50aWFsCisJaW5zdHJ1Y3Rpb24gYWRkcmVzcyBpbiB0aGUgU0ZJUCAod2l0aCBWIGJpdHMgc2V0IGFuZCBFIGJpdHMgY2xlYXIpLgorCVRoZSBydGUgcmVzdW1lcyBleGVjdXRpb24gYXQgdGhlIGluc3RydWN0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIAorCVNOSVAsIHRoZW4gdGhlIFNGSVAuCisKKyAgIFRoZSBFIGJpdCBpcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IChiaXQgMCkuICBUaGUgViAodmFsaWQpIGJpdCBpcworICAgYml0IDEuICBUaGlzIGlzIHdoeSB3ZSBsb2dpY2FsIG9yIDIgaW50byB0aGUgdmFsdWVzIHdlIGFyZSB3cml0aW5nCisgICBiZWxvdy4gIEl0IHR1cm5zIG91dCB0aGF0IFNYSVAgcGxheXMgbm8gcm9sZSB3aGVuIHJldHVybmluZyBmcm9tIGFuCisgICBleGNlcHRpb24gc28gbm90aGluZyBzcGVjaWFsIGhhcyB0byBiZSBkb25lIHdpdGggaXQuICBXZSBjb3VsZCBldmVuCisgICAocHJlc3VtYWJseSkgZ2l2ZSBpdCBhIHRvdGFsbHkgYm9ndXMgdmFsdWUuCisKKyAgIC0tIEtldmluIEJ1ZXR0bmVyCisqLworIAorI2RlZmluZSBUQVJHRVRfV1JJVEVfUEModmFsLCBwaWQpIHsgXAorICB3cml0ZV9yZWdpc3Rlcl9waWQoU1hJUF9SRUdOVU0sIChsb25nKSB2YWwsIHBpZCk7IFwKKyAgd3JpdGVfcmVnaXN0ZXJfcGlkKFNOSVBfUkVHTlVNLCAobG9uZykgdmFsIHwgMiwgcGlkKTsgXAorICB3cml0ZV9yZWdpc3Rlcl9waWQoU0ZJUF9SRUdOVU0sICgobG9uZykgdmFsIHwgMikgKyA0LCBwaWQpOyBcCit9CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL204OGsveG0tY3h1eC5oIGIvZ2RiL2NvbmZpZy9tODhrL3htLWN4dXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODJjNjEzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tODhrL3htLWN4dXguaApAQCAtMCwwICsxLDY2IEBACisvKiBIb3N0LW1hY2hpbmUgZGVwZW5kZW50IHBhcmFtZXRlcnMgZm9yIE1vdG9yb2xhIDg4MDAwLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTMKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJtODhrL3htLW04OGsuaCIKKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgQklHX0VORElBTgorCisjaWYgIWRlZmluZWQgKFVTRykKKyNkZWZpbmUgVVNHIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNkZWZpbmUgeF9mb2ZmIF94X3guX3hfb2Zmc2V0CisjZGVmaW5lIHhfZm5hbWUgX3hfbmFtZQorI2RlZmluZSBVU0VSIHB0cmFjZV91c2VyCisvKgorI2RlZmluZSBfQlNEX1dBSVRfRkxBVk9SCisqLworCisjZGVmaW5lIEhBVkVfVEVSTUlPCisKKyNpZm5kZWYgVVNJWkUKKyNkZWZpbmUgVVNJWkUgMjA0OAorI2lmbmRlZiBVUEFHRVMKKyNkZWZpbmUgVVBBR0VTIFVTSVpFCisjZW5kaWYKKyNlbmRpZgorI2RlZmluZSBOQlBHIE5CUEMKKworLyogR2V0IHJpZCBvZiBhbnkgc3lzdGVtLWltcG9zZWQgc3RhY2sgbGltaXQgaWYgcG9zc2libGUuICAqLworCisjZGVmaW5lIFNFVF9TVEFDS19MSU1JVF9IVUdFCisKKy8qIFRoaXMgaXMgdGhlIGFtb3VudCB0byBzdWJ0cmFjdCBmcm9tIHUudV9hcjAKKyAgIHRvIGdldCB0aGUgb2Zmc2V0IGluIHRoZSBjb3JlIGZpbGUgb2YgdGhlIHJlZ2lzdGVyIHZhbHVlcy4gICovCisKKy8qIFNpbmNlIHJlZ2lzdGVycyByMCB0aHJvdWdoIHIzMSBhcmUgc3RvcmVkIGRpcmVjdGx5IGluIHRoZSBzdHJ1Y3QgcHRyYWNlX3VzZXIsCisgICAoZm9yIG04OGsgQkNTKQorICAgdGhlIHB0cmFjZV91c2VyIG9mZnNldHMgYXJlIHN1ZmZpY2llbnQgYW5kIEtFUk5FTF9VX0FERFJFU1MgY2FuIGJlIDAgKi8KKworI2RlZmluZSBLRVJORUxfVV9BRERSIDAKKworLyogVGhlIENYL1VYIEMgY29tcGlsZXIgZG9lc24ndCBwZXJtaXQgY29tcGxleCBleHByZXNzaW9ucyBhcyBhcnJheSBib3VuZHMuICovCisjZGVmaW5lIFNUUklDVF9BTlNJX0JPVU5EUworCisjZGVmaW5lIENPUkVfUkVHSVNURVJfQUREUihyZWdubywgcmVnX3B0cikgXAorICAgbTg4a19oYXJyaXNfY29yZV9yZWdpc3Rlcl9hZGRyKHJlZ25vLCByZWdfcHRyKQorCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL204OGsveG0tZGVsdGE4OC5oIGIvZ2RiL2NvbmZpZy9tODhrL3htLWRlbHRhODguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTY2OTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tODhrL3htLWRlbHRhODguaApAQCAtMCwwICsxLDQ1IEBACisvKiBIb3N0IG1hY2hpbmUgZGVzY3JpcHRpb24gZm9yIE1vdG9yb2xhIERlbHRhIDg4IHN5c3RlbSwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAibTg4ay94bS1tODhrLmgiCisKKyNpZiAhZGVmaW5lZCAoVVNHKQorI2RlZmluZSBVU0cgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjZGVmaW5lIEhBVkVfVEVSTUlPCisKKy8qI2RlZmluZSBVU0laRSAyMDQ4Ki8KKy8qI2RlZmluZSBOQlBHIE5CUEMqLworLyogTWlnaHQgYmUgZGVmaW5lZCBpbiA8c3lzL3BhcmFtLmg+LiAgSSBzdXNwZWN0IHRoaXMgZGVmaW5lIHdhcyBhIHJlbGljCisgICBmcm9tIGJlZm9yZSB3aGVuIEJGRCBkaWQgY29yZSBmaWxlcy4gICovCisvKiAjZGVmaW5lIFVQQUdFUyBVU0laRSAqLworCisvKiBUaGlzIGlzIHRoZSBhbW91bnQgdG8gc3VidHJhY3QgZnJvbSB1LnVfYXIwCisgICB0byBnZXQgdGhlIG9mZnNldCBpbiB0aGUgY29yZSBmaWxlIG9mIHRoZSByZWdpc3RlciB2YWx1ZXMuICAqLworCisvKiBTaW5jZSByZWdpc3RlcnMgcjAgdGhyb3VnaCByMzEgYXJlIHN0b3JlZCBkaXJlY3RseSBpbiB0aGUgc3RydWN0IHB0cmFjZV91c2VyLAorICAgKGZvciBtODhrIEJDUykKKyAgIHRoZSBwdHJhY2VfdXNlciBvZmZzZXRzIGFyZSBzdWZmaWNpZW50IGFuZCBLRVJORUxfVV9BRERSRVNTIGNhbiBiZSAwICovCisKKyNkZWZpbmUgS0VSTkVMX1VfQUREUiAwCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL204OGsveG0tZGVsdGE4OHY0LmggYi9nZGIvY29uZmlnL204OGsveG0tZGVsdGE4OHY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjOWUyZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbTg4ay94bS1kZWx0YTg4djQuaApAQCAtMCwwICsxLDIyIEBACisvKiBIb3N0IG1hY2hpbmUgZGVzY3JpcHRpb24gZm9yIE1vdG9yb2xhIERlbHRhIDg4IGJveCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJtODhrL3htLW04OGsuaCIKKworI2luY2x1ZGUgInhtLXN5c3Y0LmgiCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL204OGsveG0tZGd1eC5oIGIvZ2RiL2NvbmZpZy9tODhrL3htLWRndXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzYwOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tODhrL3htLWRndXguaApAQCAtMCwwICsxLDU4IEBACisvKiBIb3N0LW1hY2hpbmUgZGVwZW5kZW50IHBhcmFtZXRlcnMgZm9yIE1vdG9yb2xhIDg4MDAwLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTMKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJtODhrL3htLW04OGsuaCIKKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgQklHX0VORElBTgorCisjaWYgIWRlZmluZWQgKFVTRykKKyNkZWZpbmUgVVNHIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBtZW1jcHkgX19idWlsdGluX21lbWNweQorLyogZ2NjIGRvZXNuJ3QgaGF2ZSB0aGlzLCBhdCBsZWFzdCBub3QgZ2NjIDEuOTIuICAqLworLyogI2RlZmluZSBtZW1zZXQgX19idWlsdGluX21lbXNldCAqLworI2RlZmluZSBzdHJjbXAgX19idWlsdGluX3N0cmNtcAorI2VuZGlmCisKKyNkZWZpbmUgeF9mb2ZmIF94X3guX3hfb2Zmc2V0CisjZGVmaW5lIHhfZm5hbWUgX3hfbmFtZQorI2RlZmluZSBVU0VSIHB0cmFjZV91c2VyCisjZGVmaW5lIF9CU0RfV0FJVF9GTEFWT1IKKworI2RlZmluZSBIQVZFX1RFUk1JTworCisjaWZuZGVmIFVTSVpFCisjZGVmaW5lIFVTSVpFIDIwNDgKKyNlbmRpZgorI2RlZmluZSBOQlBHIE5CUEMKKyNkZWZpbmUgVVBBR0VTIFVTSVpFCisKKy8qIFRoaXMgaXMgdGhlIGFtb3VudCB0byBzdWJ0cmFjdCBmcm9tIHUudV9hcjAKKyAgIHRvIGdldCB0aGUgb2Zmc2V0IGluIHRoZSBjb3JlIGZpbGUgb2YgdGhlIHJlZ2lzdGVyIHZhbHVlcy4gICovCisKKy8qIFNpbmNlIHJlZ2lzdGVycyByMCB0aHJvdWdoIHIzMSBhcmUgc3RvcmVkIGRpcmVjdGx5IGluIHRoZSBzdHJ1Y3QgcHRyYWNlX3VzZXIsCisgICAoZm9yIG04OGsgQkNTKQorICAgdGhlIHB0cmFjZV91c2VyIG9mZnNldHMgYXJlIHN1ZmZpY2llbnQgYW5kIEtFUk5FTF9VX0FERFJFU1MgY2FuIGJlIDAgKi8KKworI2RlZmluZSBLRVJORUxfVV9BRERSIDAKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbTg4ay94bS1tODhrLmggYi9nZGIvY29uZmlnL204OGsveG0tbTg4ay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NjIwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL204OGsveG0tbTg4ay5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qIEhvc3QtbWFjaGluZSBkZXBlbmRlbnQgcGFyYW1ldGVycyBmb3IgTW90b3JvbGEgODgwMDAsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBCSUdfRU5ESUFOCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvYmlnbWlwcy5tdCBiL2dkYi9jb25maWcvbWlwcy9iaWdtaXBzLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZjAzZjIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21pcHMvYmlnbWlwcy5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBCaWctZW5kaWFuIE1JUFMgbWFjaGluZSBzdWNoIGFzIFNvbnkgTmV3cworVERFUEZJTEVTPSBtaXBzLXRkZXAubworVE1fRklMRT0gdG0tYmlnbWlwcy5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvYmlnbWlwczY0Lm10IGIvZ2RiL2NvbmZpZy9taXBzL2JpZ21pcHM2NC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2I3YjIxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL2JpZ21pcHM2NC5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBCaWctZW5kaWFuIE1JUFMgbWFjaGluZSBzdWNoIGFzIFNvbnkgTmV3cworVERFUEZJTEVTPSBtaXBzLXRkZXAubworVE1fRklMRT0gdG0tYmlnbWlwczY0LmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy9kZWNzdGF0aW9uLm1oIGIvZ2RiL2NvbmZpZy9taXBzL2RlY3N0YXRpb24ubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE0MTdiMgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy9kZWNzdGF0aW9uLm1oCkBAIC0wLDAgKzEsNSBAQAorIyBIb3N0OiBMaXR0bGUtZW5kaWFuIE1JUFMgbWFjaGluZSBzdWNoIGFzIERFQ3N0YXRpb24uCitYREVQRklMRVM9IAorWE1fRklMRT0geG0tbWlwcy5oCitOQVRfRklMRT0gbm0tbWlwcy5oCitOQVRERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGNvcmVsb3cubyBtaXBzLW5hdC5vIGZvcmstY2hpbGQubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL2RlY3N0YXRpb24ubXQgYi9nZGIvY29uZmlnL21pcHMvZGVjc3RhdGlvbi5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTg0NzIyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL2RlY3N0YXRpb24ubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogTGl0dGxlLWVuZGlhbiBNSVBTIG1hY2hpbmUgc3VjaCBhcyBERUNzdGF0aW9uLgorVERFUEZJTEVTPSBtaXBzLXRkZXAubworVE1fRklMRT0gdG0tbWlwcy5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvZW1iZWQubXQgYi9nZGIvY29uZmlnL21pcHMvZW1iZWQubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJhYjRhYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy9lbWJlZC5tdApAQCAtMCwwICsxLDUgQEAKKyMgVGFyZ2V0OiBCaWctZW5kaWFuIG1pcHMgYm9hcmQsIHR5cGljYWxseSBhbiBJRFQuCitUREVQRklMRVM9IG1pcHMtdGRlcC5vIHJlbW90ZS1taXBzLm8gcmVtb3RlLWFycmF5Lm8KK1RNX0ZJTEU9IHRtLWVtYmVkLmgKK1NJTV9PQlMgPSByZW1vdGUtc2ltLm8KK1NJTSA9IC4uL3NpbS9taXBzL2xpYnNpbS5hCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvZW1iZWQ2NC5tdCBiL2dkYi9jb25maWcvbWlwcy9lbWJlZDY0Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNjBmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21pcHMvZW1iZWQ2NC5tdApAQCAtMCwwICsxLDUgQEAKKyMgVGFyZ2V0OiBCaWctZW5kaWFuIG1pcHMgYm9hcmQsIHR5cGljYWxseSBhbiBJRFQuCitUREVQRklMRVM9IG1pcHMtdGRlcC5vIHJlbW90ZS1taXBzLm8gcmVtb3RlLWFycmF5Lm8KK1RNX0ZJTEU9IHRtLWVtYmVkNjQuaAorU0lNX09CUyA9IHJlbW90ZS1zaW0ubworU0lNID0gLi4vc2ltL21pcHMvbGlic2ltLmEKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy9lbWJlZGwubXQgYi9nZGIvY29uZmlnL21pcHMvZW1iZWRsLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZDhiOGQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21pcHMvZW1iZWRsLm10CkBAIC0wLDAgKzEsNSBAQAorIyBUYXJnZXQ6IEJpZy1lbmRpYW4gbWlwcyBib2FyZCwgdHlwaWNhbGx5IGFuIElEVC4KK1RERVBGSUxFUz0gbWlwcy10ZGVwLm8gcmVtb3RlLW1pcHMubyByZW1vdGUtYXJyYXkubworVE1fRklMRT0gdG0tZW1iZWRsLmgKK1NJTV9PQlMgPSByZW1vdGUtc2ltLm8KK1NJTSA9IC4uL3NpbS9taXBzL2xpYnNpbS5hCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvZW1iZWRsNjQubXQgYi9nZGIvY29uZmlnL21pcHMvZW1iZWRsNjQubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjNDFiZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy9lbWJlZGw2NC5tdApAQCAtMCwwICsxLDUgQEAKKyMgVGFyZ2V0OiBCaWctZW5kaWFuIG1pcHMgYm9hcmQsIHR5cGljYWxseSBhbiBJRFQuCitUREVQRklMRVM9IG1pcHMtdGRlcC5vIHJlbW90ZS1taXBzLm8gcmVtb3RlLWFycmF5Lm8KK1RNX0ZJTEU9IHRtLWVtYmVkbDY0LmgKK1NJTV9PQlMgPSByZW1vdGUtc2ltLm8KK1NJTSA9IC4uL3NpbS9taXBzL2xpYnNpbS5hCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvaXJpeDMubWggYi9nZGIvY29uZmlnL21pcHMvaXJpeDMubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzExZDY5NwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy9pcml4My5taApAQCAtMCwwICsxLDYgQEAKKyMgSG9zdDogU0dJIElyaXMgcnVubmluZyBpcml4IDMueAorWERFUEZJTEVTPSAKK1hNX0ZJTEU9IHhtLWlyaXgzLmgKK05BVF9GSUxFPSBubS1pcml4My5oCitOQVRERVBGSUxFUz0gZm9yay1jaGlsZC5vIGNvcmVsb3cubyBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gbWlwcy1uYXQubworWE1fQ0xJQlM9LWxic2QKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy9pcml4My5tdCBiL2dkYi9jb25maWcvbWlwcy9pcml4My5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2ZhNGRkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL2lyaXgzLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IE1JUFMgU0dJIHJ1bm5pbmcgSXJpeCAzCitUREVQRklMRVM9IG1pcHMtdGRlcC5vCitUTV9GSUxFPSB0bS1pcml4My5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvaXJpeDQubWggYi9nZGIvY29uZmlnL21pcHMvaXJpeDQubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1MTFlNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy9pcml4NC5taApAQCAtMCwwICsxLDggQEAKKyMgSG9zdDogU0dJIElyaXMgcnVubmluZyBpcml4IDQueAorWERFUEZJTEVTPSBzZXItdGNwLm8KK1hNX0ZJTEU9IHhtLWlyaXg0LmgKK05BVF9GSUxFPSBubS1pcml4NC5oCitOQVRERVBGSUxFUz0gZm9yay1jaGlsZC5vIHByb2Nmcy5vIGlyaXg0LW5hdC5vIGNvcmVsb3cubworWE1fQ0xJQlM9LWxic2QgLWxzdW4KKyMgdXNlIGNjIGluIEsmUiBtb2RlLCBidW1wIHVwIHNvbWUgc3RhdGljIGNvbXBpbGVyIHRhYmxlcy4KK0NDID0gY2MgLWNja3IgLVdmLC1YTmcxNTAwIC1XZiwtWE5rMTAwMCAtV2YsLVhOaDExMDAKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy9pcml4NS5taCBiL2dkYi9jb25maWcvbWlwcy9pcml4NS5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTI3Njg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL2lyaXg1Lm1oCkBAIC0wLDAgKzEsNiBAQAorIyBIb3N0OiBTR0kgSXJpcyBydW5uaW5nIGlyaXggNS54CitYREVQRklMRVM9IHNlci10Y3AubworWE1fRklMRT0geG0taXJpeDUuaAorTkFUX0ZJTEU9IG5tLWlyaXg1LmgKK05BVERFUEZJTEVTPSBmb3JrLWNoaWxkLm8gcHJvY2ZzLm8gaXJpeDUtbmF0Lm8gY29yZWxvdy5vCitYTV9DTElCUz0tbGJzZCAtbHN1bgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL2lyaXg1Lm10IGIvZ2RiL2NvbmZpZy9taXBzL2lyaXg1Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMTdiY2QKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21pcHMvaXJpeDUubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogTUlQUyBTR0kgcnVubmluZyBJcml4IDUKK1RERVBGSUxFUz0gbWlwcy10ZGVwLm8KK1RNX0ZJTEU9IHRtLWlyaXg1LmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy9saXR0bGVtaXBzLm1oIGIvZ2RiL2NvbmZpZy9taXBzL2xpdHRsZW1pcHMubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAzOTE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy9saXR0bGVtaXBzLm1oCkBAIC0wLDAgKzEsMyBAQAorIyBIb3N0OiBMaXR0bGUtZW5kaWFuIE1JUFMgbWFjaGluZSBzdWNoIGFzIERFQ3N0YXRpb24uCitYREVQRklMRVM9IGluZnB0cmFjZS5vIGluZnRhcmcubyBmb3JrLWNoaWxkLm8gY29yZWxvdy5vIGNvcmUtYW91dC5vCitYTV9GSUxFPSB4bS1taXBzLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy9saXR0bGVtaXBzLm10IGIvZ2RiL2NvbmZpZy9taXBzL2xpdHRsZW1pcHMubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk4NDcyMgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy9saXR0bGVtaXBzLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IExpdHRsZS1lbmRpYW4gTUlQUyBtYWNoaW5lIHN1Y2ggYXMgREVDc3RhdGlvbi4KK1RERVBGSUxFUz0gbWlwcy10ZGVwLm8KK1RNX0ZJTEU9IHRtLW1pcHMuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL21pcHNtMy5taCBiL2dkYi9jb25maWcvbWlwcy9taXBzbTMubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0OWQ2OAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy9taXBzbTMubWgKQEAgLTAsMCArMSw3IEBACisjIEhvc3Q6IExpdHRsZSBlbmRpYW4gTUlQUyBtYWNoaW5lIHN1Y2ggYXMgcG1heAorIyBydW5uaW5nIE1hY2ggMy4wIG9wZXJhdGluZyBzeXN0ZW0KKworWERFUEZJTEVTPSBjb3JlLWFvdXQubworTkFUREVQRklMRVM9IG1pcHNtMy1uYXQubyBtMy1uYXQubworWE1fRklMRT0geG0tbWlwc20zLmgKK05BVF9GSUxFPSAuLi9ubS1tMy5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvbWlwc20zLm10IGIvZ2RiL2NvbmZpZy9taXBzL21pcHNtMy5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njg1NmQxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL21pcHNtMy5tdApAQCAtMCwwICsxLDQgQEAKKyMgVGFyZ2V0OiBMaXR0bGUtZW5kaWFuIE1JUFMgbWFjaGluZSBzdWNoIGFzIHBtYXgKKyMgcnVubmluZyBNYWNoIDMuMCBvcGVyYXRpbmcgc3lzdGVtCitUREVQRklMRVM9IG1pcHMtdGRlcC5vCitUTV9GSUxFPSB0bS1taXBzbTMuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL21pcHN2NC5taCBiL2dkYi9jb25maWcvbWlwcy9taXBzdjQubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjYjdlNAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy9taXBzdjQubWgKQEAgLTAsMCArMSw0IEBACisjIEhvc3Q6IE1pcHMgcnVubmluZyBTVlI0CitYTV9GSUxFPSB4bS1taXBzdjQuaAorTkFUX0ZJTEU9IC4uL25tLXN5c3Y0LmgKK05BVERFUEZJTEVTPSBmb3JrLWNoaWxkLm8gcHJvY2ZzLm8gbWlwc3Y0LW5hdC5vIGNvcmVsb3cubyBjb3JlLXJlZ3NldC5vIHNvbGliLm8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy9taXBzdjQubXQgYi9nZGIvY29uZmlnL21pcHMvbWlwc3Y0Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkM2I0N2QKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21pcHMvbWlwc3Y0Lm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IE1JUFMgcnVubmluZyBTVlI0CitUREVQRklMRVM9IG1pcHMtdGRlcC5vCitUTV9GSUxFPSB0bS1taXBzdjQuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL25ld3MtbWlwcy5taCBiL2dkYi9jb25maWcvbWlwcy9uZXdzLW1pcHMubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwZmJhYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy9uZXdzLW1pcHMubWgKQEAgLTAsMCArMSw0IEBACisjIEhvc3Q6IEJpZy1lbmRpYW4gTUlQUyBtYWNoaW5lIHN1Y2ggYXMgU29ueSBOZXdzCitOQVRERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBjb3JlbG93Lm8gbWlwcy1uYXQubworWE1fRklMRT0geG0tbmV3cy1taXBzLmgKK05BVF9GSUxFPSBubS1uZXdzLW1pcHMuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL25tLWlyaXgzLmggYi9nZGIvY29uZmlnL21pcHMvbm0taXJpeDMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjRiMDY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL25tLWlyaXgzLmgKQEAgLTAsMCArMSwzNyBAQAorLyogRGVmaW5pdGlvbnMgZm9yIFNHSSBpcml4MyBuYXRpdmUgc3VwcG9ydC4KKyAgIENvcHlyaWdodCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIERvbid0IG5lZWQgc3BlY2lhbCByb3V0aW5lcyBmb3IgSXJpeCB2MyAtLSB3ZSBjYW4gdXNlIGluZnB0cmFjZS5jICovCisjdW5kZWYgRkVUQ0hfSU5GRVJJT1JfUkVHSVNURVJTCisKKyNkZWZpbmUgVV9SRUdTX09GRlNFVCAwCisKKy8qIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIGxvbmdqbXAgd2lsbCBsYW5kLiAgV2UgZXhwZWN0IHRoYXQgd2UgaGF2ZSBqdXN0IGVudGVyZWQKKyAgIGxvbmdqbXAgYW5kIGhhdmVuJ3QgeWV0IHNldHVwIHRoZSBzdGFjayBmcmFtZSwgc28gdGhlIGFyZ3MgYXJlIHN0aWxsIGluIHRoZQorICAgYXJndW1lbnQgcmVncy4gIGEwIChDQUxMX0FSRzApIHBvaW50cyBhdCB0aGUgam1wX2J1ZiBzdHJ1Y3R1cmUgZnJvbSB3aGljaCB3ZQorICAgZXh0cmFjdCB0aGUgcGMgKEpCX1BDKSB0aGF0IHdlIHdpbGwgbGFuZCBhdC4gIFRoZSBwYyBpcyBjb3BpZWQgaW50byBBRERSLgorICAgVGhpcyByb3V0aW5lIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzICovCisKKyNkZWZpbmUgR0VUX0xPTkdKTVBfVEFSR0VUKEFERFIpIGdldF9sb25nam1wX3RhcmdldChBRERSKQorZXh0ZXJuIGludCBnZXRfbG9uZ2ptcF90YXJnZXQgUEFSQU1TICgoQ09SRV9BRERSICopKTsKKworLyogSXMgdGhpcyByZWFsbHkgdHJ1ZSBvciBpcyB0aGlzIGp1c3QgYSBsZWZ0b3ZlciBmcm9tIGEgREVDc3RhdGlvbgorICAgY29uZmlnIGZpbGU/ICAqLworCisjZGVmaW5lCU9ORV9QUk9DRVNTX1dSSVRFVEVYVApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL25tLWlyaXg0LmggYi9nZGIvY29uZmlnL21pcHMvbm0taXJpeDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTc2OTVjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL25tLWlyaXg0LmgKQEAgLTAsMCArMSw2MSBAQAorLyogRGVmaW5pdGlvbnMgZm9yIG5hdGl2ZSBzdXBwb3J0IG9mIGlyaXg0LgorCitDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKyAqIExldCdzIHVzZSAvZGVidWcgaW5zdGVhZCBvZiBhbGwgdGhpcyBkYW5nZXJvdXMgbXVja2luZyBhYm91dAorICogd2l0aCBwdHJhY2UoKSwgd2hpY2ggc2VlbXMgKmV4dHJlbWVseSogZnJhZ2lsZSwgYW55d2F5LgorICovCisjZGVmaW5lIFVTRV9QUk9DX0ZTCisjZGVmaW5lIENUTF9QUk9DX05BTUVfRk1UICIvZGVidWcvJWQiCisjZGVmaW5lIEFTX1BST0NfTkFNRV9GTVQgIi9kZWJ1Zy8lZCIKKyNkZWZpbmUgTUFQX1BST0NfTkFNRV9GTVQgIi9kZWJ1Zy8lZCIKKyNkZWZpbmUgU1RBVFVTX1BST0NfTkFNRV9GTVQgIi9kZWJ1Zy8lZCIKKworLyogRG9uJ3QgbmVlZCBzcGVjaWFsIHJvdXRpbmVzIGZvciB0aGUgU0dJIC0tIHdlIGNhbiB1c2UgaW5mcHRyYWNlLmMgKi8KKyN1bmRlZiBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMKKworI2RlZmluZSBVX1JFR1NfT0ZGU0VUIDAKKworLyogSXMgdGhpcyByZWFsbHkgdHJ1ZSBvciBpcyB0aGlzIGp1c3QgYSBsZWZ0b3ZlciBmcm9tIGEgREVDc3RhdGlvbgorICAgY29uZmlnIGZpbGU/ICAqLworCisjZGVmaW5lCU9ORV9QUk9DRVNTX1dSSVRFVEVYVAorCisjZGVmaW5lIFRBUkdFVF9IQVNfSEFSRFdBUkVfV0FUQ0hQT0lOVFMKKworLyogVGVtcG9yYXJ5IG5ldyB3YXRjaHBvaW50IHN0dWZmICovCisjZGVmaW5lIFRBUkdFVF9DQU5fVVNFX0hBUkRXQVJFX1dBVENIUE9JTlQodHlwZSwgY250LCBvdCkgXAorCSgodHlwZSkgPT0gYnBfaGFyZHdhcmVfd2F0Y2hwb2ludCkKKworLyogV2hlbiBhIGhhcmR3YXJlIHdhdGNocG9pbnQgZmlyZXMgb2ZmIHRoZSBQQyB3aWxsIGJlIGxlZnQgYXQgdGhlCisgICBpbnN0cnVjdGlvbiB3aGljaCBjYXVzZWQgdGhlIHdhdGNocG9pbnQuICBJdCB3aWxsIGJlIG5lY2Vzc2FyeSBmb3IKKyAgIEdEQiB0byBzdGVwIG92ZXIgdGhlIHdhdGNocG9pbnQuICovCisKKyNkZWZpbmUgU1RPUFBFRF9CWV9XQVRDSFBPSU5UKFcpIFwKKyAgcHJvY2ZzX3N0b3BwZWRfYnlfd2F0Y2hwb2ludChpbmZlcmlvcl9waWQpCitleHRlcm4gaW50IHByb2Nmc19zdG9wcGVkX2J5X3dhdGNocG9pbnQgUEFSQU1TICgoaW50KSk7CisKKyNkZWZpbmUgSEFWRV9OT05TVEVQUEFCTEVfV0FUQ0hQT0lOVAorCisvKiBVc2UgdGhlc2UgbWFjcm9zIGZvciB3YXRjaHBvaW50IGluc2VydGlvbi9kZWxldGlvbi4gICovCisvKiB0eXBlIGNhbiBiZSAwOiB3cml0ZSB3YXRjaCwgMTogcmVhZCB3YXRjaCwgMjogYWNjZXNzIHdhdGNoIChyZWFkL3dyaXRlKSAqLworI2RlZmluZSB0YXJnZXRfaW5zZXJ0X3dhdGNocG9pbnQoYWRkciwgbGVuLCB0eXBlKSBwcm9jZnNfc2V0X3dhdGNocG9pbnQgKGluZmVyaW9yX3BpZCwgYWRkciwgbGVuLCAyKQorI2RlZmluZSB0YXJnZXRfcmVtb3ZlX3dhdGNocG9pbnQoYWRkciwgbGVuLCB0eXBlKSBwcm9jZnNfc2V0X3dhdGNocG9pbnQgKGluZmVyaW9yX3BpZCwgYWRkciwgMCwgMCkKK2V4dGVybiBpbnQgcHJvY2ZzX3NldF93YXRjaHBvaW50IFBBUkFNUyAoKGludCwgQ09SRV9BRERSLCBpbnQsIGludCkpOwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL25tLWlyaXg1LmggYi9nZGIvY29uZmlnL21pcHMvbm0taXJpeDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGQ0NTRiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL25tLWlyaXg1LmgKQEAgLTAsMCArMSw0NCBAQAorLyogRGVmaW5pdGlvbnMgZm9yIG5hdGl2ZSBzdXBwb3J0IG9mIGlyaXg1LgorCitDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgIm5tLXN5c3Y0LmgiCisjdW5kZWYgSU5fU09MSUJfRFlOU1lNX1JFU09MVkVfQ09ERQorCisjZGVmaW5lIFRBUkdFVF9IQVNfSEFSRFdBUkVfV0FUQ0hQT0lOVFMKKworLyogVGVtcG9yYXJ5IG5ldyB3YXRjaHBvaW50IHN0dWZmICovCisjZGVmaW5lIFRBUkdFVF9DQU5fVVNFX0hBUkRXQVJFX1dBVENIUE9JTlQodHlwZSwgY250LCBvdCkgXAorCSgodHlwZSkgPT0gYnBfaGFyZHdhcmVfd2F0Y2hwb2ludCkKKworLyogV2hlbiBhIGhhcmR3YXJlIHdhdGNocG9pbnQgZmlyZXMgb2ZmIHRoZSBQQyB3aWxsIGJlIGxlZnQgYXQgdGhlCisgICBpbnN0cnVjdGlvbiB3aGljaCBjYXVzZWQgdGhlIHdhdGNocG9pbnQuICBJdCB3aWxsIGJlIG5lY2Vzc2FyeSBmb3IKKyAgIEdEQiB0byBzdGVwIG92ZXIgdGhlIHdhdGNocG9pbnQuICovCisKKyNkZWZpbmUgU1RPUFBFRF9CWV9XQVRDSFBPSU5UKFcpIFwKKyAgcHJvY2ZzX3N0b3BwZWRfYnlfd2F0Y2hwb2ludChpbmZlcmlvcl9waWQpCitleHRlcm4gaW50IHByb2Nmc19zdG9wcGVkX2J5X3dhdGNocG9pbnQgUEFSQU1TICgoaW50KSk7CisKKyNkZWZpbmUgSEFWRV9OT05TVEVQUEFCTEVfV0FUQ0hQT0lOVAorCisvKiBVc2UgdGhlc2UgbWFjcm9zIGZvciB3YXRjaHBvaW50IGluc2VydGlvbi9kZWxldGlvbi4gICovCisvKiB0eXBlIGNhbiBiZSAwOiB3cml0ZSB3YXRjaCwgMTogcmVhZCB3YXRjaCwgMjogYWNjZXNzIHdhdGNoIChyZWFkL3dyaXRlKSAqLworI2RlZmluZSB0YXJnZXRfaW5zZXJ0X3dhdGNocG9pbnQoYWRkciwgbGVuLCB0eXBlKSBwcm9jZnNfc2V0X3dhdGNocG9pbnQgKGluZmVyaW9yX3BpZCwgYWRkciwgbGVuLCAyKQorI2RlZmluZSB0YXJnZXRfcmVtb3ZlX3dhdGNocG9pbnQoYWRkciwgbGVuLCB0eXBlKSBwcm9jZnNfc2V0X3dhdGNocG9pbnQgKGluZmVyaW9yX3BpZCwgYWRkciwgMCwgMCkKK2V4dGVybiBpbnQgcHJvY2ZzX3NldF93YXRjaHBvaW50IFBBUkFNUyAoKGludCwgQ09SRV9BRERSLCBpbnQsIGludCkpOwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL25tLW1pcHMuaCBiL2dkYi9jb25maWcvbWlwcy9ubS1taXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxOGI4NgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy9ubS1taXBzLmgKQEAgLTAsMCArMSwzMiBAQAorLyogTmF0aXZlIGRlZmluaXRpb25zIGZvciBHREIgb24gREVDc3RhdGlvbnMsIFNvbnkgTmV3cy4gYW5kIE1JUFMgUmlzY29zIHN5c3RlbXMKKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IFBlciBCb3RobmVyKGJvdGhuZXJAY3Mud2lzYy5lZHUpIGF0IFUuV2lzY29uc2luCisgICBhbmQgYnkgQWxlc3NhbmRybyBGb3JpbihhZkBjcy5jbXUuZWR1KSBhdCBDTVUKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBPdmVycmlkZSBjb3BpZXMgb2Yge2ZldGNoLHN0b3JlfV9pbmZlcmlvcl9yZWdpc3RlcnMgaW4gaW5mcHRyYWNlLmMuICAqLworI2RlZmluZSBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMKKworLyogRmlndXJlIG91dCB3aGVyZSB0aGUgbG9uZ2ptcCB3aWxsIGxhbmQuICBXZSBleHBlY3QgdGhhdCB3ZSBoYXZlIGp1c3QgZW50ZXJlZAorICAgbG9uZ2ptcCBhbmQgaGF2ZW4ndCB5ZXQgc2V0dXAgdGhlIHN0YWNrIGZyYW1lLCBzbyB0aGUgYXJncyBhcmUgc3RpbGwgaW4gdGhlCisgICBhcmd1bWVudCByZWdzLiAgYTAgKENBTExfQVJHMCkgcG9pbnRzIGF0IHRoZSBqbXBfYnVmIHN0cnVjdHVyZSBmcm9tIHdoaWNoIHdlCisgICBleHRyYWN0IHRoZSBwYyAoSkJfUEMpIHRoYXQgd2Ugd2lsbCBsYW5kIGF0LiAgVGhlIHBjIGlzIGNvcGllZCBpbnRvIEFERFIuCisgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MgKi8KKworI2RlZmluZSBHRVRfTE9OR0pNUF9UQVJHRVQoQUREUikgZ2V0X2xvbmdqbXBfdGFyZ2V0KEFERFIpCitleHRlcm4gaW50IGdldF9sb25nam1wX3RhcmdldCBQQVJBTVMgKChDT1JFX0FERFIgKikpOwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL25tLW5ld3MtbWlwcy5oIGIvZ2RiL2NvbmZpZy9taXBzL25tLW5ld3MtbWlwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjYzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21pcHMvbm0tbmV3cy1taXBzLmgKQEAgLTAsMCArMSw0MiBAQAorLyogRGVmaW5pdGlvbnMgdG8gbWFrZSBHREIgcnVuIG9uIGEgbWlwcyBib3ggdW5kZXIgNC4zYnNkLgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgUGVyIEJvdGhuZXIoYm90aG5lckBjcy53aXNjLmVkdSkgYXQgVS5XaXNjb25zaW4KKyAgIGFuZCBieSBBbGVzc2FuZHJvIEZvcmluKGFmQGNzLmNtdS5lZHUpIGF0IENNVQorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgTk1fTkVXU19NSVBTX0gKKyNkZWZpbmUgTk1fTkVXU19NSVBTX0ggMQorCisvKiBOZWVkZWQgZm9yIFJJU0MgTkVXUyBjb3JlIGZpbGVzLiAgKi8KKyNpbmNsdWRlIDxtYWNoaW5lL21hY2hwYXJhbS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2RlZmluZSBLRVJORUxfVV9BRERSIFVBRERSCisKKyNkZWZpbmUgUkVHSVNURVJfVV9BRERSKGFkZHIsIGJsb2NrZW5kLCByZWdubykgCQlcCisJaWYgKHJlZ25vIDwgMzgpIGFkZHIgPSAoTkJQRypVUEFHRVMpICsgKHJlZ25vIC0gMzgpKnNpemVvZihpbnQpO1wKKwllbHNlIGFkZHIgPSAwOyAvKiAuLnNvbWV3aGVyZSBpbiB0aGUgcGNiICovCisKKy8qIEtlcm5lbCBpcyBhIGJpdCB0ZW5hY2lvdXMgYWJvdXQgc2hhcmluZyB0ZXh0IHNlZ21lbnRzLCBkaXNhbGxvd2luZyBicHRzLiAgKi8KKyNkZWZpbmUJT05FX1BST0NFU1NfV1JJVEVURVhUCisKKyNpbmNsdWRlICJtaXBzL25tLW1pcHMuaCIKKworLyogQXBwYXJlbnRseSBub3QgaW4gPHN5cy90eXBlcy5oPiAqLwordHlwZWRlZiBpbnQgcGlkX3Q7CisKKyNlbmRpZgkvKiBOTV9ORVdTX01JUFNfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL25tLXJpc2Nvcy5oIGIvZ2RiL2NvbmZpZy9taXBzL25tLXJpc2Nvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNTQzNDUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21pcHMvbm0tcmlzY29zLmgKQEAgLTAsMCArMSw1OSBAQAorLyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogTUlQUyBydW5uaW5nIFJJU0Mvb3MgNC41MkMuICAqLworCisjZGVmaW5lIFBDQl9PRkZTRVQoRklFTEQpICgoaW50KSYoKHN0cnVjdCB1c2VyKikwKS0+dV9wY2IuRklFTEQpCisKKy8qIFJJU0Mvb3MgNS4wIGRlZmluZXMgdGhpcyBpbiBtYWNocGFyYW0uaC4gICovCisjaW5jbHVkZSA8YnNkNDMvbWFjaGluZS9tYWNocGFyYW0uaD4KKyNkZWZpbmUgTkJQRyBCU0Q0M19OQlBHCisjZGVmaW5lIFVQQUdFUyBCU0Q0M19VUEFHRVMKKworLyogV2hlcmUgaXMgdGhpcyB1c2VkPyAgSSBkb24ndCBzZWUgYW55IHVzZXMgaW4gbWlwcy1uYXQuYywgYW5kIEkgZG9uJ3QgdGhpbmsKKyAgIHRoZSB1c2VzIGluIGluZnB0cmFjZS5jIGFyZSB1c2VkIGlmIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUyBpcyBkZWZpbmVkLgorICAgRG9lcyB0aGUgY29tcGlsZXIgcmVhY3QgYmFkbHkgdG8gImV4dGVybiBDT1JFX0FERFIga2VybmVsX3VfYWRkciIgKGV2ZW4KKyAgIGlmIG5ldmVyIHJlZmVyZW5jZWQpPyAgKi8KKyNkZWZpbmUgS0VSTkVMX1VfQUREUiBCU0Q0M19VQUREUgorCisjZGVmaW5lIFJFR0lTVEVSX1VfQUREUihhZGRyLCBibG9ja2VuZCwgcmVnbm8pIAkJXAorCSAgICAgIGlmIChyZWdubyA8IEZQMF9SRUdOVU0pIFwKKwkJICBhZGRyID0gIFVQQUdFUypOQlBHLUVGX1NJWkUrNCooKHJlZ25vKStFRl9BVC0xKTsgXAorCSAgICAgIGVsc2UgaWYgKHJlZ25vIDwgUENfUkVHTlVNKSBcCisJCSAgYWRkciA9IFBDQl9PRkZTRVQocGNiX2ZwcmVnc1swXSkgKyA0KihyZWduby1GUDBfUkVHTlVNKTsgXAorICAgICAgICAgICAgICBlbHNlIGlmIChyZWdubyA9PSBQU19SRUdOVU0pIFwKKyAgICAgICAgICAgICAgICAgIGFkZHIgPSBVUEFHRVMqTkJQRy1FRl9TSVpFKzQqRUZfU1I7IFwKKyAgICAgICAgICAgICAgZWxzZSBpZiAocmVnbm8gPT0gQkFEVkFERFJfUkVHTlVNKSBcCisgIAkJICBhZGRyID0gVVBBR0VTKk5CUEctRUZfU0laRSs0KkVGX0JBRFZBRERSOyBcCisJICAgICAgZWxzZSBpZiAocmVnbm8gPT0gTE9fUkVHTlVNKSBcCisJCSAgYWRkciA9IFVQQUdFUypOQlBHLUVGX1NJWkUrNCpFRl9NRExPOyBcCisJICAgICAgZWxzZSBpZiAocmVnbm8gPT0gSElfUkVHTlVNKSBcCisJCSAgYWRkciA9IFVQQUdFUypOQlBHLUVGX1NJWkUrNCpFRl9NREhJOyBcCisJICAgICAgZWxzZSBpZiAocmVnbm8gPT0gQ0FVU0VfUkVHTlVNKSBcCisJCSAgYWRkciA9IFVQQUdFUypOQlBHLUVGX1NJWkUrNCpFRl9DQVVTRTsgXAorCSAgICAgIGVsc2UgaWYgKHJlZ25vID09IFBDX1JFR05VTSkgXAorCQkgIGFkZHIgPSBVUEFHRVMqTkJQRy1FRl9TSVpFKzQqRUZfRVBDOyBcCisgICAgICAgICAgICAgIGVsc2UgaWYgKHJlZ25vIDwgRkNSQ1NfUkVHTlVNKSBcCisJCSAgYWRkciA9IFBDQl9PRkZTRVQocGNiX2ZwcmVnc1swXSkgKyA0KihyZWduby1GUDBfUkVHTlVNKTsgXAorCSAgICAgIGVsc2UgaWYgKHJlZ25vID09IEZDUkNTX1JFR05VTSkgXAorCQkgIGFkZHIgPSBQQ0JfT0ZGU0VUKHBjYl9mcGNfY3NyKTsgXAorCSAgICAgIGVsc2UgaWYgKHJlZ25vID09IEZDUklSX1JFR05VTSkgXAorCQkgIGFkZHIgPSBQQ0JfT0ZGU0VUKHBjYl9mcGNfZWlyKTsgXAorICAgICAgICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgICAgICAgIGFkZHIgPSAwOworCisjaW5jbHVkZSAibWlwcy9ubS1taXBzLmgiCisKKy8qIE92ZXJyaWRlIGNvcGllcyBvZiB7ZmV0Y2gsc3RvcmV9X2luZmVyaW9yX3JlZ2lzdGVycyBpbiBpbmZwdHJhY2UuYy4gICovCisjZGVmaW5lIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL3Jpc2Nvcy5taCBiL2dkYi9jb25maWcvbWlwcy9yaXNjb3MubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEzMTkyZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy9yaXNjb3MubWgKQEAgLTAsMCArMSwxNiBAQAorIyBIb3N0OiBNSVBTIHJ1bm5pbmcgUklTQy9vcworCitYTV9GSUxFPSB4bS1yaXNjb3MuaAorCitOQVRfRklMRT0gbm0tcmlzY29zLmgKK05BVERFUEZJTEVTPSBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gZm9yay1jaGlsZC5vIGNvcmVsb3cubyBtaXBzLW5hdC5vCisKK01IX0NGTEFHUz0tV2YsLVhOaDEwMDAwCisKKyMgcHRyYWNlKDIpIGFwcGFyZW50bHkgaGFzIHByb2JsZW1zIGluIHRoZSBCU0QgZW52aXJvbm1lbnQuICBObyB3b3JrYXJvdW5kIGlzCisjIGtub3duIGV4Y2VwdCB0byBzZWxlY3QgdGhlIHN5c3YgZW52aXJvbm1lbnQuICBDb3VsZCB3ZSB1c2UgL3Byb2MgaW5zdGVhZD8KKyMgVGhlc2UgInN5c3YgZW52aXJvbm1lbnRzIiBhbmQgImJzZCBlbnZpcm9ubWVudHMiIG9mdGVuIGVuZCB1cCBiZWluZyBhIHBhaW4uCisjCisjIFRoaXMgaXMgbm90IHBhcnQgb2YgQ0ZMQUdTIGJlY2F1c2UgcGVyaGFwcyBub3QgYWxsIEMgY29tcGlsZXJzIGhhdmUgdGhpcworIyBvcHRpb24uCitDQz0gY2MgLXN5c3R5cGUgc3lzdgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL3RtLWJpZ21pcHMuaCBiL2dkYi9jb25maWcvbWlwcy90bS1iaWdtaXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxY2ViMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy90bS1iaWdtaXBzLmgKQEAgLTAsMCArMSwyMSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVJfREVGQVVMVCBCSUdfRU5ESUFOCisKKyNpbmNsdWRlICJtaXBzL3RtLW1pcHMuaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy90bS1iaWdtaXBzNjQuaCBiL2dkYi9jb25maWcvbWlwcy90bS1iaWdtaXBzNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjI1NWE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL3RtLWJpZ21pcHM2NC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qIFRhcmdldCBtYWNoaW5lIHBhcmFtZXRlcnMgZm9yIE1JUFMgcjQwMDAKKyAgIENvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgSWFuIExhbmNlIFRheWxvciAoaWFuQGN5Z251cy5jb20pCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUl9ERUZBVUxUIEJJR19FTkRJQU4KKworI2luY2x1ZGUgIm1pcHMvdG0tbWlwczY0LmgiCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvdG0tZW1iZWQuaCBiL2dkYi9jb25maWcvbWlwcy90bS1lbWJlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZjE3NTkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21pcHMvdG0tZW1iZWQuaApAQCAtMCwwICsxLDQ5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFX1AgMQorCisjaW5jbHVkZSAibWlwcy90bS1iaWdtaXBzLmgiCisKKyN1bmRlZiBERUZBVUxUX01JUFNfVFlQRQorI2RlZmluZSBERUZBVUxUX01JUFNfVFlQRSAicjMwNTEiCisKKy8qIFdhdGNocG9pbnQgc3VwcG9ydCAqLworCisjZGVmaW5lIFRBUkdFVF9IQVNfSEFSRFdBUkVfV0FUQ0hQT0lOVFMKKworLyogVXNlIHRoZXNlIG1hY3JvcyBmb3Igd2F0Y2hwb2ludCBpbnNlcnRpb24vZGVsZXRpb24uICAqLworLyogdHlwZSBjYW4gYmUgMDogd3JpdGUgd2F0Y2gsIDE6IHJlYWQgd2F0Y2gsIDI6IGFjY2VzcyB3YXRjaCAocmVhZC93cml0ZSkgKi8KKworI2RlZmluZSB0YXJnZXRfaW5zZXJ0X3dhdGNocG9pbnQoYWRkciwgbGVuLCB0eXBlKSBcCisJcmVtb3RlX21pcHNfc2V0X3dhdGNocG9pbnQgKGFkZHIsIGxlbiwgdHlwZSkKK2ludCByZW1vdGVfbWlwc19zZXRfd2F0Y2hwb2ludCBQQVJBTVMgKChDT1JFX0FERFIgYWRkciwgaW50IGxlbiwgaW50IHR5cGUpKTsKKworI2RlZmluZSB0YXJnZXRfcmVtb3ZlX3dhdGNocG9pbnQoYWRkciwgbGVuLCB0eXBlKSBcCisJcmVtb3RlX21pcHNfcmVtb3ZlX3dhdGNocG9pbnQgKGFkZHIsIGxlbiwgdHlwZSkKK2ludCByZW1vdGVfbWlwc19yZW1vdmVfd2F0Y2hwb2ludCBQQVJBTVMgKChDT1JFX0FERFIgYWRkciwgaW50IGxlbiwgaW50IHR5cGUpKTsKKworLyogV2UgbmVlZCB0byByZW1vdmUgd2F0Y2hwb2ludHMgd2hlbiBzdGVwcGluZywgZWxzZSB3ZSBoaXQgdGhlbSBhZ2FpbiEgKi8KKworI2RlZmluZSBIQVZFX05PTlNURVBQQUJMRV9XQVRDSFBPSU5UCisKKyNkZWZpbmUgU1RPUFBFRF9CWV9XQVRDSFBPSU5UKHcpIHJlbW90ZV9taXBzX3N0b3BwZWRfYnlfd2F0Y2hwb2ludCAoKQorCisjZGVmaW5lIFRBUkdFVF9DQU5fVVNFX0hBUkRXQVJFX1dBVENIUE9JTlQodHlwZSwgY250LCBvdCkgXAorICByZW1vdGVfbWlwc19jYW5fdXNlX2hhcmR3YXJlX3dhdGNocG9pbnQoY250KQoraW50IHJlbW90ZV9taXBzX2Nhbl91c2VfaGFyZHdhcmVfd2F0Y2hwb2ludCBQQVJBTVMgKChpbnQgY250KSk7CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvdG0tZW1iZWQ2NC5oIGIvZ2RiL2NvbmZpZy9taXBzL3RtLWVtYmVkNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjkwZjU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL3RtLWVtYmVkNjQuaApAQCAtMCwwICsxLDIxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFX1AgMQorCisjaW5jbHVkZSAibWlwcy90bS1iaWdtaXBzNjQuaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy90bS1lbWJlZGwuaCBiL2dkYi9jb25maWcvbWlwcy90bS1lbWJlZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2FiY2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL3RtLWVtYmVkbC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRBUkdFVF9CWVRFX09SREVSX1NFTEVDVEFCTEVfUCAxCisKKyNpbmNsdWRlICJtaXBzL3RtLW1pcHMuaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy90bS1lbWJlZGw2NC5oIGIvZ2RiL2NvbmZpZy9taXBzL3RtLWVtYmVkbDY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkY2ExOQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy90bS1lbWJlZGw2NC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRBUkdFVF9CWVRFX09SREVSX1NFTEVDVEFCTEVfUCAxCisKKyNpbmNsdWRlICJtaXBzL3RtLW1pcHM2NC5oIgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL3RtLWlyaXgzLmggYi9nZGIvY29uZmlnL21pcHMvdG0taXJpeDMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZThlNTNlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL3RtLWlyaXgzLmgKQEAgLTAsMCArMSw4MSBAQAorLyogVGFyZ2V0IG1hY2hpbmUgZGVzY3JpcHRpb24gZm9yIFNHSSBJcmlzIHVuZGVyIElyaXgsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAibWlwcy90bS1iaWdtaXBzLmgiCisKKy8qIFNHSSdzIGFzc2VtYmxlciBkb2Vzbid0IGdyb2sgZG9sbGFyIHNpZ25zIGluIGlkZW50aWZpZXJzLgorICAgU28gd2UgdXNlIGRvdHMgaW5zdGVhZC4gIFRoaXMgaXRlbSBtdXN0IGJlIGNvb3JkaW5hdGVkIHdpdGggRysrLiAqLworI3VuZGVmIENQTFVTX01BUktFUgorI2RlZmluZSBDUExVU19NQVJLRVIgJy4nCisKKy8qIFJlZGVmaW5lIHJlZ2lzdGVyIG51bWJlcnMgZm9yIFNHSS4gKi8KKworI3VuZGVmIE5VTV9SRUdTCisjdW5kZWYgUkVHSVNURVJfTkFNRVMKKyN1bmRlZiBGUDBfUkVHTlVNCisjdW5kZWYgUENfUkVHTlVNCisjdW5kZWYgUFNfUkVHTlVNCisjdW5kZWYgSElfUkVHTlVNCisjdW5kZWYgTE9fUkVHTlVNCisjdW5kZWYgQ0FVU0VfUkVHTlVNCisjdW5kZWYgQkFEVkFERFJfUkVHTlVNCisjdW5kZWYgRkNSQ1NfUkVHTlVNCisjdW5kZWYgRkNSSVJfUkVHTlVNCisKKy8qIE51bWJlciBvZiBtYWNoaW5lIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIE5VTV9SRUdTIDcxCisKKy8qIEluaXRpYWxpemVyIGZvciBhbiBhcnJheSBvZiBuYW1lcyBvZiByZWdpc3RlcnMuCisgICBUaGVyZSBzaG91bGQgYmUgTlVNX1JFR1Mgc3RyaW5ncyBpbiB0aGlzIGluaXRpYWxpemVyLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyAJXAorICAgIHsJInplcm8iLAkiYXQiLAkidjAiLAkidjEiLAkiYTAiLAkiYTEiLAkiYTIiLAkiYTMiLCBcCisJInQwIiwJInQxIiwJInQyIiwJInQzIiwJInQ0IiwJInQ1IiwJInQ2IiwJInQ3IiwgXAorCSJzMCIsCSJzMSIsCSJzMiIsCSJzMyIsCSJzNCIsCSJzNSIsCSJzNiIsCSJzNyIsIFwKKwkidDgiLAkidDkiLAkiazAiLAkiazEiLAkiZ3AiLAkic3AiLAkiZnAiLAkicmEiLCBcCisJImYwIiwgICAiZjEiLCAgICJmMiIsICAgImYzIiwgICAiZjQiLCAgICJmNSIsICAgImY2IiwgICAiZjciLCBcCisJImY4IiwgICAiZjkiLCAgICJmMTAiLCAgImYxMSIsICAiZjEyIiwgICJmMTMiLCAgImYxNCIsICAiZjE1IiwgXAorCSJmMTYiLCAgImYxNyIsICAiZjE4IiwgICJmMTkiLCAgImYyMCIsICAiZjIxIiwgICJmMjIiLCAgImYyMyIsXAorCSJmMjQiLCAgImYyNSIsICAiZjI2IiwgICJmMjciLCAgImYyOCIsICAiZjI5IiwgICJmMzAiLCAgImYzMSIsXAorCSJwYyIsCSJjYXVzZSIsICJiYWQiLAkiaGkiLAkibG8iLAkiZnNyIiwgICJmaXIiIFwKKyAgICB9CisKKy8qIFJlZ2lzdGVyIG51bWJlcnMgb2YgdmFyaW91cyBpbXBvcnRhbnQgcmVnaXN0ZXJzLgorICAgTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2UgdmFsdWVzIGFyZSAicmVhbCIgcmVnaXN0ZXIgbnVtYmVycywKKyAgIGFuZCBjb3JyZXNwb25kIHRvIHRoZSBnZW5lcmFsIHJlZ2lzdGVycyBvZiB0aGUgbWFjaGluZSwKKyAgIGFuZCBzb21lIGFyZSAicGhvbnkiIHJlZ2lzdGVyIG51bWJlcnMgd2hpY2ggYXJlIHRvbyBsYXJnZQorICAgdG8gYmUgYWN0dWFsIHJlZ2lzdGVyIG51bWJlcnMgYXMgZmFyIGFzIHRoZSB1c2VyIGlzIGNvbmNlcm5lZAorICAgYnV0IGRvIHNlcnZlIHRvIGdldCB0aGUgZGVzaXJlZCB2YWx1ZXMgd2hlbiBwYXNzZWQgdG8gcmVhZF9yZWdpc3Rlci4gICovCisKKyNkZWZpbmUgRlAwX1JFR05VTSAzMgkJLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgMCAoc2luZ2xlIGZsb2F0KSAqLworI2RlZmluZSBQQ19SRUdOVU0gNjQJCS8qIENvbnRhaW5zIHByb2dyYW0gY291bnRlciAqLworI2RlZmluZSBDQVVTRV9SRUdOVU0gNjUJCS8qIGRlc2NyaWJlcyBsYXN0IGV4Y2VwdGlvbiAqLworI2RlZmluZSBCQURWQUREUl9SRUdOVU0gNjYJLyogYmFkIHZhZGRyIGZvciBhZGRyZXNzaW5nIGV4Y2VwdGlvbiAqLworI2RlZmluZSBISV9SRUdOVU0gNjcJCS8qIE11bHRpcGxlL2RpdmlkZSB0ZW1wICovCisjZGVmaW5lIExPX1JFR05VTSA2OAkJLyogLi4uICovCisjZGVmaW5lIEZDUkNTX1JFR05VTSA2OQkJLyogRlAgY29udHJvbC9zdGF0dXMgKi8KKyNkZWZpbmUgRkNSSVJfUkVHTlVNIDcwCQkvKiBGUCBpbXBsZW1lbnRhdGlvbi9yZXZpc2lvbiAqLworCisvKiBPZmZzZXRzIGZvciByZWdpc3RlciB2YWx1ZXMgaW4gX3NpZ3RyYW1wIGZyYW1lLgorICAgc2lnY29udGV4dCBpcyBpbW1lZGlhdGVseSBhYm92ZSB0aGUgX3NpZ3RyYW1wIGZyYW1lIG9uIElyaXguICAqLworI2RlZmluZSBTSUdGUkFNRV9CQVNFCQkweDAgCisjZGVmaW5lIFNJR0ZSQU1FX1BDX09GRgkJKFNJR0ZSQU1FX0JBU0UgKyAyICogNCkKKyNkZWZpbmUgU0lHRlJBTUVfUkVHU0FWRV9PRkYJKFNJR0ZSQU1FX0JBU0UgKyAzICogNCkKKyNkZWZpbmUgU0lHRlJBTUVfRlBSRUdTQVZFX09GRgkoU0lHRlJBTUVfQkFTRSArIDMgKiA0ICsgMzIgKiA0ICsgNCkKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy90bS1pcml4NS5oIGIvZ2RiL2NvbmZpZy9taXBzL3RtLWlyaXg1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ5OGU4OAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy90bS1pcml4NS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIFRhcmdldCBtYWNoaW5lIGRlc2NyaXB0aW9uIGZvciBTR0kgSXJpcyB1bmRlciBJcml4IDUsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAibWlwcy90bS1pcml4My5oIgorCisjaWYgZGVmaW5lZCAoX01JUFNfU0lNX05BQkkzMikgJiYgX01JUFNfU0lNID09IF9NSVBTX1NJTV9OQUJJMzIKKy8qCisgKiBJcml4IDYgKG4zMiBBQkkpIGhhcyAzMi1iaXQgR1AgcmVncyBhbmQgNjQtYml0IEZQIHJlZ3MKKyAqLworCisjdW5kZWYgIFJFR0lTVEVSX0JZVEVTCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTIChNSVBTX05VTVJFR1MgKiA4ICsgKE5VTV9SRUdTIC0gTUlQU19OVU1SRUdTKSAqIE1JUFNfUkVHU0laRSkKKworI3VuZGVmICBSRUdJU1RFUl9CWVRFCisjZGVmaW5lIFJFR0lTVEVSX0JZVEUoTikgXAorICAgICAoKChOKSA8IEZQMF9SRUdOVU0pID8gKE4pICogTUlQU19SRUdTSVpFIDogXAorICAgICAgKChOKSA8IEZQMF9SRUdOVU0gKyAzMikgPyAgICAgXAorICAgICAgRlAwX1JFR05VTSAqIE1JUFNfUkVHU0laRSArIFwKKyAgICAgICgoTikgLSBGUDBfUkVHTlVNKSAqIHNpemVvZihkb3VibGUpIDogXAorICAgICAgMzIgKiBzaXplb2YoZG91YmxlKSArICgoTikgLSAzMikgKiBNSVBTX1JFR1NJWkUpCisKKyN1bmRlZiAgUkVHSVNURVJfVklSVFVBTF9UWVBFCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRShOKSBcCisJKCgoTikgPj0gRlAwX1JFR05VTSAmJiAoTikgPCBGUDBfUkVHTlVNKzMyKSA/IGJ1aWx0aW5fdHlwZV9kb3VibGUgXAorCSA6ICgoTikgPT0gMzIgLypTUiovKSA/IGJ1aWx0aW5fdHlwZV91aW50MzIgXAorCSA6ICgoTikgPj0gNzAgJiYgKE4pIDw9IDg5KSA/IGJ1aWx0aW5fdHlwZV91aW50MzIgXAorCSA6IGJ1aWx0aW5fdHlwZV9pbnQpCisKKyN1bmRlZiAgTUlQU19MQVNUX0FSR19SRUdOVU0KKyNkZWZpbmUgTUlQU19MQVNUX0FSR19SRUdOVU0gMTEgIC8qIE4zMiB1c2VzIFI0IHRocm91Z2ggUjExIGZvciBhcmdzICovCisKKyN1bmRlZiAgTUlQU19OVU1fQVJHX1JFR1MKKyNkZWZpbmUgTUlQU19OVU1fQVJHX1JFR1MgOAorCisjZW5kaWYgLyogTjMyICovCisKKy8qIFdoZW4gY2FsbGluZyBmdW5jdGlvbnMgb24gSXJpeCA1IChvciBhbnkgTUlQUyBTVlI0IEFCSSBjb21wbGlhbnQKKyAgIHBsYXRmb3JtKSAkMjUgbXVzdCBob2xkIHRoZSBmdW5jdGlvbiBhZGRyZXNzLiAgRGVzdF9SZWcgaXMgYSBtYWNybworICAgdXNlZCBpbiBDQUxMX0RVTU1ZIGluIHRtLW1pcHMuaC4gICovCisjdW5kZWYgRGVzdF9SZWcKKyNkZWZpbmUgRGVzdF9SZWcgMjUKKworLyogVGhlIHNpZ25hbCBoYW5kbGVyIHRyYW1wb2xpbmUgaXMgY2FsbGVkIF9zaWd0cmFtcC4gICovCisjdW5kZWYgSU5fU0lHVFJBTVAKKyNkZWZpbmUgSU5fU0lHVFJBTVAocGMsIG5hbWUpICgobmFtZSkgJiYgU1RSRVEgKCJfc2lndHJhbXAiLCBuYW1lKSkKKworLyogSXJpeCA1IHNhdmVzIGEgZnVsbCA2NCBiaXRzIGZvciBlYWNoIHJlZ2lzdGVyLiAgV2Ugc2tpcCAyICogNCB0bworICAgZ2V0IHRvIHRoZSBzYXZlZCBQQyAodGhlIHJlZ2lzdGVyIG1hc2sgYW5kIHN0YXR1cyByZWdpc3RlciBhcmUgYm90aAorICAgMzIgYml0cykgYW5kIHRoZW4gYW5vdGhlciA0IHRvIGdldCB0byB0aGUgbG93ZXIgMzIgYml0cy4gIFdlIHNraXAKKyAgIHRoZSBzYW1lIDQgYnl0ZXMsIHBsdXMgdGhlIDggYnl0ZXMgZm9yIHRoZSBQQyB0byBnZXQgdG8gdGhlCisgICByZWdpc3RlcnMsIGFuZCBhZGQgYW5vdGhlciA0IHRvIGdldCB0byB0aGUgbG93ZXIgMzIgYml0cy4gIFdlIHNraXAKKyAgIDggYnl0ZXMgcGVyIHJlZ2lzdGVyLiAgKi8KKyN1bmRlZiBTSUdGUkFNRV9QQ19PRkYKKyNkZWZpbmUgU0lHRlJBTUVfUENfT0ZGCQkoU0lHRlJBTUVfQkFTRSArIDIgKiA0ICsgNCkKKyN1bmRlZiBTSUdGUkFNRV9SRUdTQVZFX09GRgorI2RlZmluZSBTSUdGUkFNRV9SRUdTQVZFX09GRgkoU0lHRlJBTUVfQkFTRSArIDIgKiA0ICsgOCArIDQpCisjdW5kZWYgU0lHRlJBTUVfRlBSRUdTQVZFX09GRgorI2RlZmluZSBTSUdGUkFNRV9GUFJFR1NBVkVfT0ZGCShTSUdGUkFNRV9CQVNFICsgMiAqIDQgKyA4ICsgMzIgKiA4ICsgNCkKKyNkZWZpbmUgU0lHRlJBTUVfUkVHX1NJWkUJOApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL3RtLW1pcHMuaCBiL2dkYi9jb25maWcvbWlwcy90bS1taXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3MDkxYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy90bS1taXBzLmgKQEAgLTAsMCArMSw1NjAgQEAKKy8qIERlZmluaXRpb25zIHRvIG1ha2UgR0RCIHJ1biBvbiBhIG1pcHMgYm94IHVuZGVyIDQuM2JzZC4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IFBlciBCb3RobmVyIChib3RobmVyQGNzLndpc2MuZWR1KSBhdCBVLldpc2NvbnNpbgorICAgYW5kIGJ5IEFsZXNzYW5kcm8gRm9yaW4gKGFmQGNzLmNtdS5lZHUpIGF0IENNVS4uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBUTV9NSVBTX0gKKyNkZWZpbmUgVE1fTUlQU19IIDEKKworI2lmZGVmIF9fU1REQ19fCitzdHJ1Y3QgZnJhbWVfaW5mbzsKK3N0cnVjdCBzeW1ib2w7CitzdHJ1Y3QgdHlwZTsKK3N0cnVjdCB2YWx1ZTsKKyNlbmRpZgorCisjaW5jbHVkZSA8YmZkLmg+CisjaW5jbHVkZSAiY29mZi9zeW0uaCIJCS8qIE5lZWRlZCBmb3IgUERSIGJlbG93LiAgKi8KKyNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCisKKyNpZiAhZGVmaW5lZCAoVEFSR0VUX0JZVEVfT1JERVJfREVGQVVMVCkKKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVJfREVGQVVMVCBMSVRUTEVfRU5ESUFOCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChHREJfVEFSR0VUX0lTX01JUFM2NCkKKyNkZWZpbmUgR0RCX1RBUkdFVF9JU19NSVBTNjQgMAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoTUlQU19FQUJJKQorI2RlZmluZSBNSVBTX0VBQkkgMAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoVEFSR0VUX01PTklUT1JfUFJPTVBUKQorI2RlZmluZSBUQVJHRVRfTU9OSVRPUl9QUk9NUFQgIjxJRFQ+IgorI2VuZGlmCisKKy8qIFBDIHNob3VsZCBiZSBtYXNrZWQgdG8gcmVtb3ZlIHBvc3NpYmxlIE1JUFMxNiBmbGFnICovCisjaWYgIWRlZmluZWQgKEdEQl9UQVJHRVRfTUFTS19ESVNBU19QQykKKyNkZWZpbmUgR0RCX1RBUkdFVF9NQVNLX0RJU0FTX1BDKGFkZHIpIFVOTUFLRV9NSVBTMTZfQUREUihhZGRyKQorI2VuZGlmCisjaWYgIWRlZmluZWQgKEdEQl9UQVJHRVRfVU5NQVNLX0RJU0FTX1BDKQorI2RlZmluZSBHREJfVEFSR0VUX1VOTUFTS19ESVNBU19QQyhhZGRyKSBNQUtFX01JUFMxNl9BRERSKGFkZHIpCisjZW5kaWYKKworLyogRmxvYXRpbmcgcG9pbnQgaXMgSUVFRSBjb21wbGlhbnQgKi8KKyNkZWZpbmUgSUVFRV9GTE9BVAorCisvKiBUaGUgbmFtZSBvZiB0aGUgdXN1YWwgdHlwZSBvZiBNSVBTIHByb2Nlc3NvciB0aGF0IGlzIGluIHRoZSB0YXJnZXQKKyAgIHN5c3RlbS4gICovCisKKyNkZWZpbmUgREVGQVVMVF9NSVBTX1RZUEUgImdlbmVyaWMiCisKKy8qIFJlbW92ZSB1c2VsZXNzIGJpdHMgZnJvbSBhbiBpbnN0cnVjdGlvbiBhZGRyZXNzLiAgKi8KKworI2RlZmluZSBBRERSX0JJVFNfUkVNT1ZFKGFkZHIpIG1pcHNfYWRkcl9iaXRzX3JlbW92ZShhZGRyKQorQ09SRV9BRERSIG1pcHNfYWRkcl9iaXRzX3JlbW92ZSBQQVJBTVMgKChDT1JFX0FERFIgYWRkcikpOworCisvKiBSZW1vdmUgdXNlbGVzcyBiaXRzIGZyb20gdGhlIHN0YWNrIHBvaW50ZXIuICAqLworCisjZGVmaW5lIFRBUkdFVF9SRUFEX1NQKCkgQUREUl9CSVRTX1JFTU9WRSAocmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKSkKKworLyogT2Zmc2V0IGZyb20gYWRkcmVzcyBvZiBmdW5jdGlvbiB0byBzdGFydCBvZiBpdHMgY29kZS4KKyAgIFplcm8gb24gbW9zdCBtYWNoaW5lcy4gICovCisKKyNkZWZpbmUgRlVOQ1RJT05fU1RBUlRfT0ZGU0VUIDAKKworLyogQWR2YW5jZSBQQyBhY3Jvc3MgYW55IGZ1bmN0aW9uIGVudHJ5IHByb2xvZ3VlIGluc3RydWN0aW9ucworICAgdG8gcmVhY2ggc29tZSAicmVhbCIgY29kZS4gICovCisKKyNkZWZpbmUgU0tJUF9QUk9MT0dVRShwYykJcGMgPSBtaXBzX3NraXBfcHJvbG9ndWUgKHBjLCAwKQorZXh0ZXJuIENPUkVfQUREUiBtaXBzX3NraXBfcHJvbG9ndWUgUEFSQU1TICgoQ09SRV9BRERSIGFkZHIsIGludCBsZW5pZW50KSk7CisKKy8qIFJldHVybiBub24temVybyBpZiBQQyBwb2ludHMgdG8gYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggd2lsbCBjYXVzZSBhIHN0ZXAKKyAgIHRvIGV4ZWN1dGUgYm90aCB0aGUgaW5zdHJ1Y3Rpb24gYXQgUEMgYW5kIGFuIGluc3RydWN0aW9uIGF0IFBDKzQuICAqLworZXh0ZXJuIGludCBtaXBzX3N0ZXBfc2tpcHNfZGVsYXkgUEFSQU1TICgoQ09SRV9BRERSKSk7CisjZGVmaW5lIFNURVBfU0tJUFNfREVMQVlfUCAoMSkKKyNkZWZpbmUgU1RFUF9TS0lQU19ERUxBWShwYykgKG1pcHNfc3RlcF9za2lwc19kZWxheSAocGMpKQorCisvKiBJbW1lZGlhdGVseSBhZnRlciBhIGZ1bmN0aW9uIGNhbGwsIHJldHVybiB0aGUgc2F2ZWQgcGMuCisgICBDYW4ndCBhbHdheXMgZ28gdGhyb3VnaCB0aGUgZnJhbWVzIGZvciB0aGlzIGJlY2F1c2Ugb24gc29tZSBtYWNoaW5lcworICAgdGhlIG5ldyBmcmFtZSBpcyBub3Qgc2V0IHVwIHVudGlsIHRoZSBuZXcgZnVuY3Rpb24gZXhlY3V0ZXMKKyAgIHNvbWUgaW5zdHJ1Y3Rpb25zLiAgKi8KKworI2RlZmluZSBTQVZFRF9QQ19BRlRFUl9DQUxMKGZyYW1lKQlyZWFkX3JlZ2lzdGVyKFJBX1JFR05VTSkKKworLyogQXJlIHdlIGN1cnJlbnRseSBoYW5kbGluZyBhIHNpZ25hbCAqLworCitleHRlcm4gaW50IGluX3NpZ3RyYW1wIFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqKSk7CisjZGVmaW5lIElOX1NJR1RSQU1QKHBjLCBuYW1lKQlpbl9zaWd0cmFtcChwYywgbmFtZSkKKworLyogU3RhY2sgZ3Jvd3MgZG93bndhcmQuICAqLworCisjZGVmaW5lIElOTkVSX1RIQU4obGhzLHJocykgKChsaHMpIDwgKHJocykpCisKKyNkZWZpbmUgQklHX0VORElBTiA0MzIxCisKKy8qIEJSRUFLUE9JTlRfRlJPTV9QQyB1c2VzIHRoZSBwcm9ncmFtIGNvdW50ZXIgdmFsdWUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYQorICAgMTYtIG9yIDMyLWJpdCBicmVha3BvaW50IHNob3VsZCBiZSB1c2VkLiAgSXQgcmV0dXJucyBhIHBvaW50ZXIKKyAgIHRvIGEgc3RyaW5nIG9mIGJ5dGVzIHRoYXQgZW5jb2RlIGEgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiwgc3RvcmVzCisgICB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdG8gKmxlbnB0ciwgYW5kIGFkanVzdHMgdGhlIHBjIChpZiBuZWNlc3NhcnkpIHRvCisgICBwb2ludCB0byB0aGUgYWN0dWFsIG1lbW9yeSBsb2NhdGlvbiB3aGVyZSB0aGUgYnJlYWtwb2ludCBzaG91bGQgYmUKKyAgIGluc2VydGVkLiAgKi8KKworZXh0ZXJuIGJyZWFrcG9pbnRfZnJvbV9wY19mbiBtaXBzX2JyZWFrcG9pbnRfZnJvbV9wYzsKKyNkZWZpbmUgQlJFQUtQT0lOVF9GUk9NX1BDKHBjcHRyLCBsZW5wdHIpIG1pcHNfYnJlYWtwb2ludF9mcm9tX3BjKHBjcHRyLCBsZW5wdHIpCisKKy8qIEFtb3VudCBQQyBtdXN0IGJlIGRlY3JlbWVudGVkIGJ5IGFmdGVyIGEgYnJlYWtwb2ludC4KKyAgIFRoaXMgaXMgb2Z0ZW4gdGhlIG51bWJlciBvZiBieXRlcyBpbiBCUkVBS1BPSU5UCisgICBidXQgbm90IGFsd2F5cy4gICovCisKKyNkZWZpbmUgREVDUl9QQ19BRlRFUl9CUkVBSyAwCisKKy8qIFNheSBob3cgbG9uZyAob3JkaW5hcnkpIHJlZ2lzdGVycyBhcmUuICBUaGlzIGlzIGEgcGllY2Ugb2YgYm9nb3NpdHkKKyAgIHVzZWQgaW4gcHVzaF93b3JkIGFuZCBhIGZldyBvdGhlciBwbGFjZXM7IFJFR0lTVEVSX1JBV19TSVpFIGlzIHRoZQorICAgcmVhbCB3YXkgdG8ga25vdyBob3cgYmlnIGEgcmVnaXN0ZXIgaXMuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1NJWkUgNAorCisvKiBUaGUgc2l6ZSBvZiBhIHJlZ2lzdGVyLiAgVGhpcyBpcyBwcmVkZWZpbmVkIGluIHRtLW1pcHM2NC5oLiAgV2UKKyAgIGNhbid0IHVzZSBSRUdJU1RFUl9TSVpFIGJlY2F1c2UgdGhhdCBpcyB1c2VkIGZvciB2YXJpb3VzIG90aGVyCisgICB0aGluZ3MuICAqLworCisjaWZuZGVmIE1JUFNfUkVHU0laRQorI2RlZmluZSBNSVBTX1JFR1NJWkUgNAorI2VuZGlmCisKKy8qIFRoZSBzaXplcyBvZiBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMuICAqLworCisjZGVmaW5lIE1JUFNfRlBVX1NJTkdMRV9SRUdTSVpFIDQKKyNkZWZpbmUgTUlQU19GUFVfRE9VQkxFX1JFR1NJWkUgOAorCisvKiBOdW1iZXIgb2YgbWFjaGluZSByZWdpc3RlcnMgKi8KKworI2lmbmRlZiBOVU1fUkVHUworI2RlZmluZSBOVU1fUkVHUyA5MAorI2VuZGlmCisKKy8qIEluaXRpYWxpemVyIGZvciBhbiBhcnJheSBvZiBuYW1lcyBvZiByZWdpc3RlcnMuCisgICBUaGVyZSBzaG91bGQgYmUgTlVNX1JFR1Mgc3RyaW5ncyBpbiB0aGlzIGluaXRpYWxpemVyLiAgKi8KKworI2lmbmRlZiBSRUdJU1RFUl9OQU1FUworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyAJXAorICAgIHsJInplcm8iLAkiYXQiLAkidjAiLAkidjEiLAkiYTAiLAkiYTEiLAkiYTIiLAkiYTMiLCBcCisJInQwIiwJInQxIiwJInQyIiwJInQzIiwJInQ0IiwJInQ1IiwJInQ2IiwJInQ3IiwgXAorCSJzMCIsCSJzMSIsCSJzMiIsCSJzMyIsCSJzNCIsCSJzNSIsCSJzNiIsCSJzNyIsIFwKKwkidDgiLAkidDkiLAkiazAiLAkiazEiLAkiZ3AiLAkic3AiLAkiczgiLAkicmEiLCBcCisJInNyIiwJImxvIiwJImhpIiwJImJhZCIsCSJjYXVzZSIsInBjIiwgICAgXAorCSJmMCIsICAgImYxIiwgICAiZjIiLCAgICJmMyIsICAgImY0IiwgICAiZjUiLCAgICJmNiIsICAgImY3IiwgXAorCSJmOCIsICAgImY5IiwgICAiZjEwIiwgICJmMTEiLCAgImYxMiIsICAiZjEzIiwgICJmMTQiLCAgImYxNSIsIFwKKwkiZjE2IiwgICJmMTciLCAgImYxOCIsICAiZjE5IiwgICJmMjAiLCAgImYyMSIsICAiZjIyIiwgICJmMjMiLFwKKwkiZjI0IiwgICJmMjUiLCAgImYyNiIsICAiZjI3IiwgICJmMjgiLCAgImYyOSIsICAiZjMwIiwgICJmMzEiLFwKKwkiZnNyIiwgICJmaXIiLCAgImZwIiwJIiIsIFwKKwkiIiwJIiIsCSIiLAkiIiwJIiIsCSIiLAkiIiwJIiIsIFwKKwkiIiwJIiIsCSIiLAkiIiwJIiIsCSIiLAkiIiwJIiIsIFwKKyAgICB9CisjZW5kaWYKKworLyogUmVnaXN0ZXIgbnVtYmVycyBvZiB2YXJpb3VzIGltcG9ydGFudCByZWdpc3RlcnMuCisgICBOb3RlIHRoYXQgc29tZSBvZiB0aGVzZSB2YWx1ZXMgYXJlICJyZWFsIiByZWdpc3RlciBudW1iZXJzLAorICAgYW5kIGNvcnJlc3BvbmQgdG8gdGhlIGdlbmVyYWwgcmVnaXN0ZXJzIG9mIHRoZSBtYWNoaW5lLAorICAgYW5kIHNvbWUgYXJlICJwaG9ueSIgcmVnaXN0ZXIgbnVtYmVycyB3aGljaCBhcmUgdG9vIGxhcmdlCisgICB0byBiZSBhY3R1YWwgcmVnaXN0ZXIgbnVtYmVycyBhcyBmYXIgYXMgdGhlIHVzZXIgaXMgY29uY2VybmVkCisgICBidXQgZG8gc2VydmUgdG8gZ2V0IHRoZSBkZXNpcmVkIHZhbHVlcyB3aGVuIHBhc3NlZCB0byByZWFkX3JlZ2lzdGVyLiAgKi8KKworI2RlZmluZSBaRVJPX1JFR05VTSAwCQkvKiByZWFkLW9ubHkgcmVnaXN0ZXIsIGFsd2F5cyAwICovCisjZGVmaW5lIFYwX1JFR05VTSAyCQkvKiBGdW5jdGlvbiBpbnRlZ2VyIHJldHVybiB2YWx1ZSAqLworI2RlZmluZSBBMF9SRUdOVU0gNAkJLyogTG9jIG9mIGZpcnN0IGFyZyBkdXJpbmcgYSBzdWJyIGNhbGwgKi8KKyNpZiBNSVBTX0VBQkkKKyMgIGRlZmluZSBNSVBTX0xBU1RfQVJHX1JFR05VTSAxMSAvKiBFQUJJIHVzZXMgUjQgdGhyb3VnaCBSMTEgZm9yIGFyZ3MgKi8KKyMgIGRlZmluZSBNSVBTX05VTV9BUkdfUkVHUyA4CisjZWxzZQorIyAgZGVmaW5lIE1JUFNfTEFTVF9BUkdfUkVHTlVNIDcgIC8qIG9sZCBBQkkgdXNlcyBSNCB0aHJvdWdoIFI3IGZvciBhcmdzICovCisjICBkZWZpbmUgTUlQU19OVU1fQVJHX1JFR1MgNAorI2VuZGlmCisjZGVmaW5lIFQ5X1JFR05VTSAyNQkJLyogQ29udGFpbnMgYWRkcmVzcyBvZiBjYWxsZWUgaW4gUElDICovCisjZGVmaW5lIFNQX1JFR05VTSAyOQkJLyogQ29udGFpbnMgYWRkcmVzcyBvZiB0b3Agb2Ygc3RhY2sgKi8KKyNkZWZpbmUgUkFfUkVHTlVNIDMxCQkvKiBDb250YWlucyByZXR1cm4gYWRkcmVzcyB2YWx1ZSAqLworI2RlZmluZSBQU19SRUdOVU0gMzIJCS8qIENvbnRhaW5zIHByb2Nlc3NvciBzdGF0dXMgKi8KKyNkZWZpbmUgSElfUkVHTlVNIDM0ICAgICAgICAgICAgLyogTXVsdGlwbGUvZGl2aWRlIHRlbXAgKi8KKyNkZWZpbmUgTE9fUkVHTlVNIDMzICAgICAgICAgICAgLyogLi4uICovCisjZGVmaW5lIEJBRFZBRERSX1JFR05VTSAzNQkvKiBiYWQgdmFkZHIgZm9yIGFkZHJlc3NpbmcgZXhjZXB0aW9uICovCisjZGVmaW5lIENBVVNFX1JFR05VTSAzNgkJLyogZGVzY3JpYmVzIGxhc3QgZXhjZXB0aW9uICovCisjZGVmaW5lIFBDX1JFR05VTSAzNwkJLyogQ29udGFpbnMgcHJvZ3JhbSBjb3VudGVyICovCisjZGVmaW5lIEZQMF9SRUdOVU0gMzggICAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIDAgKHNpbmdsZSBmbG9hdCkgKi8KKyNkZWZpbmUgRlBBMF9SRUdOVU0gKEZQMF9SRUdOVU0rMTIpIC8qIEZpcnN0IGZsb2F0IGFyZ3VtZW50IHJlZ2lzdGVyICovCisjaWYgTUlQU19FQUJJCQkJLyogRUFCSSB1c2VzIEYxMiB0aHJvdWdoIEYxOSBmb3IgYXJncyAqLworIyAgZGVmaW5lIE1JUFNfTEFTVF9GUF9BUkdfUkVHTlVNIChGUDBfUkVHTlVNKzE5KQorIyAgZGVmaW5lIE1JUFNfTlVNX0ZQX0FSR19SRUdTIDgKKyNlbHNlCQkJCS8qIG9sZCBBQkkgdXNlcyBGMTIgdGhyb3VnaCBGMTUgZm9yIGFyZ3MgKi8KKyMgIGRlZmluZSBNSVBTX0xBU1RfRlBfQVJHX1JFR05VTSAoRlAwX1JFR05VTSsxNSkKKyMgIGRlZmluZSBNSVBTX05VTV9GUF9BUkdfUkVHUyA0CisjZW5kaWYKKyNkZWZpbmUgRkNSQ1NfUkVHTlVNIDcwICAgICAgICAgLyogRlAgY29udHJvbC9zdGF0dXMgKi8KKyNkZWZpbmUgRkNSSVJfUkVHTlVNIDcxICAgICAgICAgLyogRlAgaW1wbGVtZW50YXRpb24vcmV2aXNpb24gKi8KKyNkZWZpbmUgRlBfUkVHTlVNIDcyCQkvKiBQc2V1ZG8gcmVnaXN0ZXIgdGhhdCBjb250YWlucyB0cnVlIGFkZHJlc3Mgb2YgZXhlY3V0aW5nIHN0YWNrIGZyYW1lICovCisjZGVmaW5lCVVOVVNFRF9SRUdOVU0gNzMJLyogTmV2ZXIgdXNlZCwgRklYTUUgKi8KKyNkZWZpbmUJRklSU1RfRU1CRURfUkVHTlVNIDc0CS8qIEZpcnN0IENQMCByZWdpc3RlciBmb3IgZW1iZWRkZWQgdXNlICovCisjZGVmaW5lCVBSSURfUkVHTlVNIDg5CQkvKiBQcm9jZXNzb3IgSUQgKi8KKyNkZWZpbmUJTEFTVF9FTUJFRF9SRUdOVU0gODkJLyogTGFzdCBvbmUgKi8KKworLyogRGVmaW5lIERPX1JFR0lTVEVSU19JTkZPKCkgdG8gZG8gbWFjaGluZS1zcGVjaWZpYyBmb3JtYXR0aW5nCisgICBvZiByZWdpc3RlciBkdW1wcy4gKi8KKworI2RlZmluZSBET19SRUdJU1RFUlNfSU5GTyhfcmVnbnVtLCBmcCkgbWlwc19kb19yZWdpc3RlcnNfaW5mbyhfcmVnbnVtLCBmcCkKK2V4dGVybiB2b2lkIG1pcHNfZG9fcmVnaXN0ZXJzX2luZm8gUEFSQU1TICgoaW50LCBpbnQpKTsKKworLyogVG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCB0byBzdG9yZSBvdXIgY29waWVzIG9mIHRoZSBtYWNoaW5lJ3MKKyAgIHJlZ2lzdGVyIHN0YXRlLCB0aGUgYXJyYXkgYHJlZ2lzdGVycycuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTIChOVU1fUkVHUypNSVBTX1JFR1NJWkUpCisKKy8qIEluZGV4IHdpdGhpbiBgcmVnaXN0ZXJzJyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3BhY2UgZm9yCisgICByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9CWVRFKE4pICgoTikgKiBNSVBTX1JFR1NJWkUpCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBhY3R1YWwgbWFjaGluZSByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICovCisKKyNkZWZpbmUgUkVHSVNURVJfUkFXX1NJWkUoTikgUkVHSVNURVJfVklSVFVBTF9TSVpFKE4pCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBwcm9ncmFtJ3MgcmVwcmVzZW50YXRpb24KKyAgIGZvciByZWdpc3RlciBOLiAqLworCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfU0laRShOKSBUWVBFX0xFTkdUSCAoUkVHSVNURVJfVklSVFVBTF9UWVBFIChOKSkKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9SQVdfU0laRSBjYW4gaGF2ZS4gICovCisKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1JBV19TSVpFIDgKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUgOAorCisvKiBSZXR1cm4gdGhlIEdEQiB0eXBlIG9iamVjdCBmb3IgdGhlICJzdGFuZGFyZCIgZGF0YSB0eXBlIG9mIGRhdGEgaW4KKyAgIHJlZ2lzdGVyIE4uICAqLworCisjaWZuZGVmIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRQorI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1RZUEUoTikgXAorCSgoKE4pID49IEZQMF9SRUdOVU0gJiYgKE4pIDwgRlAwX1JFR05VTSszMikgPyBidWlsdGluX3R5cGVfZmxvYXQgXAorCSA6ICgoTikgPT0gMzIgLypTUiovKSA/IGJ1aWx0aW5fdHlwZV91aW50MzIgXAorCSA6ICgoTikgPj0gNzAgJiYgKE4pIDw9IDg5KSA/IGJ1aWx0aW5fdHlwZV91aW50MzIgXAorCSA6IGJ1aWx0aW5fdHlwZV9pbnQpCisjZW5kaWYKKworLyogQWxsIG1pcHMgdGFyZ2V0cyBzdG9yZSBkb3VibGVzIGluIGEgcmVnaXN0ZXIgcGFpciB3aXRoIHRoZSBsZWFzdAorICAgc2lnbmlmaWNhbnQgcmVnaXN0ZXIgaW4gdGhlIGxvd2VyIG51bWJlcmVkIHJlZ2lzdGVyLgorICAgSWYgdGhlIHRhcmdldCBpcyBiaWcgZW5kaWFuLCBkb3VibGUgcmVnaXN0ZXIgdmFsdWVzIG5lZWQgY29udmVyc2lvbgorICAgYmV0d2VlbiBtZW1vcnkgYW5kIHJlZ2lzdGVyIGZvcm1hdHMuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0NPTlZFUlRfVE9fVFlQRShuLCB0eXBlLCBidWZmZXIpCQkJXAorICBkbyB7aWYgKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4JCQkJXAorCSAgJiYgUkVHSVNURVJfUkFXX1NJWkUgKG4pID09IDQJCQkJCVwKKwkgICYmIChuKSA+PSBGUDBfUkVHTlVNICYmIChuKSA8IEZQMF9SRUdOVU0gKyAzMgkJCVwKKwkgICYmIFRZUEVfQ09ERSh0eXBlKSA9PSBUWVBFX0NPREVfRkxUCQkJCVwKKwkgICYmIFRZUEVfTEVOR1RIKHR5cGUpID09IDgpIHsJCQkJCVwKKyAgICAgICAgY2hhciBfX3RlbXBbNF07CQkJCQkJCVwKKwltZW1jcHkgKF9fdGVtcCwgKChjaGFyICopKGJ1ZmZlcikpKzQsIDQpOwkJCVwKKwltZW1jcHkgKCgoY2hhciAqKShidWZmZXIpKSs0LCAoYnVmZmVyKSwgNCk7IAkJCVwKKwltZW1jcHkgKCgoY2hhciAqKShidWZmZXIpKSwgX190ZW1wLCA0KTsgfX0gd2hpbGUgKDApCisKKyNkZWZpbmUgUkVHSVNURVJfQ09OVkVSVF9GUk9NX1RZUEUobiwgdHlwZSwgYnVmZmVyKQkJCVwKKyAgZG8ge2lmIChUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCQkJCVwKKwkgICYmIFJFR0lTVEVSX1JBV19TSVpFIChuKSA9PSA0CQkJCQlcCisJICAmJiAobikgPj0gRlAwX1JFR05VTSAmJiAobikgPCBGUDBfUkVHTlVNICsgMzIJCQlcCisJICAmJiBUWVBFX0NPREUodHlwZSkgPT0gVFlQRV9DT0RFX0ZMVAkJCQlcCisJICAmJiBUWVBFX0xFTkdUSCh0eXBlKSA9PSA4KSB7CQkJCQlcCisgICAgICAgIGNoYXIgX190ZW1wWzRdOwkJCQkJCQlcCisJbWVtY3B5IChfX3RlbXAsICgoY2hhciAqKShidWZmZXIpKSs0LCA0KTsJCQlcCisJbWVtY3B5ICgoKGNoYXIgKikoYnVmZmVyKSkrNCwgKGJ1ZmZlciksIDQpOyAJCQlcCisJbWVtY3B5ICgoKGNoYXIgKikoYnVmZmVyKSksIF9fdGVtcCwgNCk7IH19IHdoaWxlICgwKQorCisvKiBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUgcGxhY2UgaW4gd2hpY2ggdG8gY29weSB0aGUgc3RydWN0dXJlIHRoZQorICAgc3Vicm91dGluZSB3aWxsIHJldHVybi4gIEhhbmRsZWQgYnkgbWlwc19wdXNoX2FyZ3VtZW50cy4gICovCisKKyNkZWZpbmUgU1RPUkVfU1RSVUNUX1JFVFVSTihhZGRyLCBzcCkJLyoqLworCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwgZm9ybWF0LAorICAgaW50byBWQUxCVUYuICBYWFggZmxvYXRzICovCisKKyNkZWZpbmUgRVhUUkFDVF9SRVRVUk5fVkFMVUUoVFlQRSxSRUdCVUYsVkFMQlVGKSBcCisgIG1pcHNfZXh0cmFjdF9yZXR1cm5fdmFsdWUoVFlQRSwgUkVHQlVGLCBWQUxCVUYpCitleHRlcm4gdm9pZAorbWlwc19leHRyYWN0X3JldHVybl92YWx1ZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBjaGFyIFtdLCBjaGFyICopKTsKKworLyogV3JpdGUgaW50byBhcHByb3ByaWF0ZSByZWdpc3RlcnMgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUKKyAgIG9mIHR5cGUgVFlQRSwgZ2l2ZW4gaW4gdmlydHVhbCBmb3JtYXQuICAqLworCisjZGVmaW5lIFNUT1JFX1JFVFVSTl9WQUxVRShUWVBFLFZBTEJVRikgXAorICBtaXBzX3N0b3JlX3JldHVybl92YWx1ZShUWVBFLCBWQUxCVUYpCitleHRlcm4gdm9pZCBtaXBzX3N0b3JlX3JldHVybl92YWx1ZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBjaGFyICopKTsKKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgdGhlIGFkZHJlc3MgaW4gd2hpY2ggYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGl0cyBzdHJ1Y3R1cmUgdmFsdWUsCisgICBhcyBhIENPUkVfQUREUiAob3IgYW4gZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIG9uZSkuICAqLworLyogVGhlIGFkZHJlc3MgaXMgcGFzc2VkIGluIGEwIHVwb24gZW50cnkgdG8gdGhlIGZ1bmN0aW9uLCBidXQgd2hlbgorICAgdGhlIGZ1bmN0aW9uIGV4aXRzLCB0aGUgY29tcGlsZXIgaGFzIGNvcGllZCB0aGUgdmFsdWUgdG8gdjAuICBUaGlzCisgICBjb252ZW50aW9uIGlzIHNwZWNpZmllZCBieSB0aGUgU3lzdGVtIFYgQUJJLCBzbyBJIHRoaW5rIHdlIGNhbiByZWx5CisgICBvbiBpdC4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyhSRUdCVUYpIFwKKyAgKGV4dHJhY3RfYWRkcmVzcyAoUkVHQlVGICsgUkVHSVNURVJfQllURSAoVjBfUkVHTlVNKSwgXAorCQkgICAgUkVHSVNURVJfUkFXX1NJWkUgKFYwX1JFR05VTSkpKQorCitleHRlcm4gdXNlX3N0cnVjdF9jb252ZW50aW9uX2ZuIG1pcHNfdXNlX3N0cnVjdF9jb252ZW50aW9uOworI2RlZmluZSBVU0VfU1RSVUNUX0NPTlZFTlRJT04oZ2NjX3AsIHR5cGUpIG1pcHNfdXNlX3N0cnVjdF9jb252ZW50aW9uIChnY2NfcCwgdHlwZSkKKwwKKy8qIERlc2NyaWJlIHRoZSBwb2ludGVyIGluIGVhY2ggc3RhY2sgZnJhbWUgdG8gdGhlIHByZXZpb3VzIHN0YWNrIGZyYW1lCisgICAoaXRzIGNhbGxlcikuICAqLworCisvKiBGUkFNRV9DSEFJTiB0YWtlcyBhIGZyYW1lJ3Mgbm9taW5hbCBhZGRyZXNzCisgICBhbmQgcHJvZHVjZXMgdGhlIGZyYW1lJ3MgY2hhaW4tcG9pbnRlci4gKi8KKworI2RlZmluZSBGUkFNRV9DSEFJTih0aGlzZnJhbWUpIChDT1JFX0FERFIpIG1pcHNfZnJhbWVfY2hhaW4gKHRoaXNmcmFtZSkKK2V4dGVybiBDT1JFX0FERFIgbWlwc19mcmFtZV9jaGFpbiBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisKKy8qIERlZmluZSBvdGhlciBhc3BlY3RzIG9mIHRoZSBzdGFjayBmcmFtZS4gICovCisKKworLyogQSBtYWNybyB0aGF0IHRlbGxzIHVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGludm9jYXRpb24gcmVwcmVzZW50ZWQKKyAgIGJ5IEZJIGRvZXMgbm90IGhhdmUgYSBmcmFtZSBvbiB0aGUgc3RhY2sgYXNzb2NpYXRlZCB3aXRoIGl0LiAgSWYgaXQKKyAgIGRvZXMgbm90LCBGUkFNRUxFU1MgaXMgc2V0IHRvIDEsIGVsc2UgMC4gICovCisvKiBXZSBoYW5kbGUgdGhpcyBkaWZmZXJlbnRseSBmb3IgbWlwcywgYW5kIG1heWJlIHdlIHNob3VsZCBub3QgKi8KKworI2RlZmluZSBGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTihGSSwgRlJBTUVMRVNTKSAgeyhGUkFNRUxFU1MpID0gMDt9CisKKy8qIFNhdmVkIFBjLiAgKi8KKworI2RlZmluZSBGUkFNRV9TQVZFRF9QQyhGUkFNRSkJKG1pcHNfZnJhbWVfc2F2ZWRfcGMoRlJBTUUpKQorZXh0ZXJuIENPUkVfQUREUiBtaXBzX2ZyYW1lX3NhdmVkX3BjIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworI2RlZmluZSBGUkFNRV9BUkdTX0FERFJFU1MoZmkpCShmaSktPmZyYW1lCisKKyNkZWZpbmUgRlJBTUVfTE9DQUxTX0FERFJFU1MoZmkpIChmaSktPmZyYW1lCisKKy8qIFJldHVybiBudW1iZXIgb2YgYXJncyBwYXNzZWQgdG8gYSBmcmFtZS4KKyAgIENhbiByZXR1cm4gLTEsIG1lYW5pbmcgbm8gd2F5IHRvIHRlbGwuICAqLworCisjZGVmaW5lIEZSQU1FX05VTV9BUkdTKG51bSwgZmkpCShudW0gPSBtaXBzX2ZyYW1lX251bV9hcmdzKGZpKSkKK2V4dGVybiBpbnQgbWlwc19mcmFtZV9udW1fYXJncyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisKKy8qIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgYXQgc3RhcnQgb2YgYXJnbGlzdCB0aGF0IGFyZSBub3QgcmVhbGx5IGFyZ3MuICAqLworCisjZGVmaW5lIEZSQU1FX0FSR1NfU0tJUCAwCisKKy8qIFB1dCBoZXJlIHRoZSBjb2RlIHRvIHN0b3JlLCBpbnRvIGEgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MsCisgICB0aGUgYWRkcmVzc2VzIG9mIHRoZSBzYXZlZCByZWdpc3RlcnMgb2YgZnJhbWUgZGVzY3JpYmVkIGJ5IEZSQU1FX0lORk8uCisgICBUaGlzIGluY2x1ZGVzIHNwZWNpYWwgcmVnaXN0ZXJzIHN1Y2ggYXMgcGMgYW5kIGZwIHNhdmVkIGluIHNwZWNpYWwKKyAgIHdheXMgaW4gdGhlIHN0YWNrIGZyYW1lLiAgc3AgaXMgZXZlbiBtb3JlIHNwZWNpYWw6CisgICB0aGUgYWRkcmVzcyB3ZSByZXR1cm4gZm9yIGl0IElTIHRoZSBzcCBmb3IgdGhlIG5leHQgZnJhbWUuICAqLworCisjZGVmaW5lIEZSQU1FX0lOSVRfU0FWRURfUkVHUyhmcmFtZV9pbmZvKSBcCisgIGRvIHsgXAorICAgIGlmICgoZnJhbWVfaW5mbyktPnNhdmVkX3JlZ3MgPT0gTlVMTCkgXAorICAgICAgbWlwc19maW5kX3NhdmVkX3JlZ3MgKGZyYW1lX2luZm8pOyBcCisgICAgKGZyYW1lX2luZm8pLT5zYXZlZF9yZWdzW1NQX1JFR05VTV0gPSAoZnJhbWVfaW5mbyktPmZyYW1lOyBcCisgIH0gd2hpbGUgKDApCitleHRlcm4gdm9pZCBtaXBzX2ZpbmRfc2F2ZWRfcmVncyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisKKwwKKy8qIFRoaW5ncyBuZWVkZWQgZm9yIG1ha2luZyB0aGUgaW5mZXJpb3IgY2FsbCBmdW5jdGlvbnMuICAqLworCisvKiBTdGFjayBtdXN0IGJlIGFsaWduZWQgb24gMzItYml0IGJvdW5kYXJpZXMgd2hlbiBzeW50aGVzaXppbmcKKyAgIGZ1bmN0aW9uIGNhbGxzLiAgV2UgZG9uJ3QgbmVlZCBTVEFDS19BTElHTiwgUFVTSF9BUkdVTUVOVFMgd2lsbAorICAgaGFuZGxlIGl0LiAqLworCisjZGVmaW5lIFBVU0hfQVJHVU1FTlRTKG5hcmdzLCBhcmdzLCBzcCwgc3RydWN0X3JldHVybiwgc3RydWN0X2FkZHIpIFwKKyAgICBzcCA9IG1pcHNfcHVzaF9hcmd1bWVudHMoKG5hcmdzKSwgKGFyZ3MpLCAoc3ApLCAoc3RydWN0X3JldHVybiksIChzdHJ1Y3RfYWRkcikpCitleHRlcm4gQ09SRV9BRERSCittaXBzX3B1c2hfYXJndW1lbnRzIFBBUkFNUyAoKGludCwgc3RydWN0IHZhbHVlICoqLCBDT1JFX0FERFIsIGludCwgQ09SRV9BRERSKSk7CisKKy8qIFB1c2ggYW4gZW1wdHkgc3RhY2sgZnJhbWUsIHRvIHJlY29yZCB0aGUgY3VycmVudCBQQywgZXRjLiAgKi8KKworI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FIAltaXBzX3B1c2hfZHVtbXlfZnJhbWUoKQorZXh0ZXJuIHZvaWQgbWlwc19wdXNoX2R1bW15X2ZyYW1lIFBBUkFNUyAoKHZvaWQpKTsKKworLyogRGlzY2FyZCBmcm9tIHRoZSBzdGFjayB0aGUgaW5uZXJtb3N0IGZyYW1lLCByZXN0b3JpbmcgYWxsIHJlZ2lzdGVycy4gICovCisKKyNkZWZpbmUgUE9QX0ZSQU1FCQltaXBzX3BvcF9mcmFtZSgpCitleHRlcm4gdm9pZCBtaXBzX3BvcF9mcmFtZSBQQVJBTVMgKCh2b2lkKSk7CisKKyNkZWZpbmUgQ0FMTF9EVU1NWSB7IDAgfQorCisjZGVmaW5lIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUICgwKQorCisjZGVmaW5lIENBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQgKDApCisKKy8qIE9uIElyaXgsICR0OSAoJDI1KSBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGUgY2FsbGVlICh1c2VkIGZvciBQSUMpLgorICAgSXQgZG9lc24ndCBodXJ0IHRvIGRvIHRoaXMgb24gb3RoZXIgc3lzdGVtczsgJHQ5IHdpbGwgYmUgaWdub3JlZC4gICovCisjZGVmaW5lIEZJWF9DQUxMX0RVTU1ZKGR1bW15bmFtZSwgc3RhcnRfc3AsIGZ1biwgbmFyZ3MsIGFyZ3MsIHJldHR5cGUsIGdjY19wKSBcCisgICAgd3JpdGVfcmVnaXN0ZXIoVDlfUkVHTlVNLCBmdW4pCisKKyNkZWZpbmUgQ0FMTF9EVU1NWV9MT0NBVElPTiBBVF9FTlRSWV9QT0lOVAorCisjZGVmaW5lIENBTExfRFVNTVlfQUREUkVTUygpIChtaXBzX2NhbGxfZHVtbXlfYWRkcmVzcyAoKSkKK2V4dGVybiBDT1JFX0FERFIgbWlwc19jYWxsX2R1bW15X2FkZHJlc3MgUEFSQU1TICgodm9pZCkpOworCisvKiBUaGVyZSdzIGEgbWVzcyBpbiBzdGFjayBmcmFtZSBjcmVhdGlvbi4gIFNlZSBjb21tZW50cyBpbiBibG9ja2ZyYW1lLmMKKyAgIG5lYXIgcmVmZXJlbmNlIHRvIElOSVRfRlJBTUVfUENfRklSU1QuICAqLworCisjZGVmaW5lCUlOSVRfRlJBTUVfUEMoZnJvbWxlYWYsIHByZXYpIC8qIG5hZGEgKi8KKworI2RlZmluZSBJTklUX0ZSQU1FX1BDX0ZJUlNUKGZyb21sZWFmLCBwcmV2KSBcCisgICBtaXBzX2luaXRfZnJhbWVfcGNfZmlyc3QoZnJvbWxlYWYsIHByZXYpCitleHRlcm4gdm9pZCBtaXBzX2luaXRfZnJhbWVfcGNfZmlyc3QgUEFSQU1TICgoaW50LCBzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisKKy8qIFNwZWNpYWwgc3ltYm9sIGZvdW5kIGluIGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggcm91dGluZXMuICBXZSBjYW4gaGFuZworICAgbWlwc19leHRyYV9mdW5jX2luZm9fdCdzIG9mZiBvZiB0aGlzLiAgKi8KKworI2RlZmluZSBNSVBTX0VGSV9TWU1CT0xfTkFNRSAiX19HREJfRUZJX0lORk9fXyIKK2V4dGVybiB2b2lkIGVjb2ZmX3JlbG9jYXRlX2VmaSBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICosIENPUkVfQUREUikpOworCisvKiBTcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCBhIHByb2NlZHVyZS4KKyAgIFRoaXMgb3ZlcmxheXMgdGhlIE1JUFMncyBQRFIgcmVjb3JkcywgCisgICBtaXBzcmVhZC5jIChhYil1c2VzIHRoaXMgdG8gc2F2ZSBtZW1vcnkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbWlwc19leHRyYV9mdW5jX2luZm8geworCWxvbmcJbnVtYXJnczsJLyogbnVtYmVyIG9mIGFyZ3MgdG8gcHJvY2VkdXJlICh3YXMgaW9wdCkgKi8KKwliZmRfdm1hIGhpZ2hfYWRkcjsgICAgICAvKiB1cHBlciBhZGRyZXNzIGJvdW5kICovCisJbG9uZwlmcmFtZV9hZGp1c3Q7CS8qIG9mZnNldCBvZiBGUCBmcm9tIFNQICh1c2VkIG9uIE1JUFMxNikgKi8KKwlQRFIJcGRyOwkJLyogUHJvY2VkdXJlIGRlc2NyaXB0b3IgcmVjb3JkICovCit9ICptaXBzX2V4dHJhX2Z1bmNfaW5mb190OworCisjZGVmaW5lIEVYVFJBX0ZSQU1FX0lORk8gXAorICBtaXBzX2V4dHJhX2Z1bmNfaW5mb190IHByb2NfZGVzYzsgXAorICBpbnQgbnVtX2FyZ3M7CisKKyNkZWZpbmUgSU5JVF9FWFRSQV9GUkFNRV9JTkZPKGZyb21sZWFmLCBmY2kpIGluaXRfZXh0cmFfZnJhbWVfaW5mbyhmY2kpCitleHRlcm4gdm9pZCBpbml0X2V4dHJhX2ZyYW1lX2luZm8gUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworCisjZGVmaW5lCVBSSU5UX0VYVFJBX0ZSQU1FX0lORk8oZmkpIFwKKyAgeyBcCisgICAgaWYgKGZpICYmIGZpLT5wcm9jX2Rlc2MgJiYgZmktPnByb2NfZGVzYy0+cGRyLmZyYW1lcmVnIDwgTlVNX1JFR1MpIFwKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiBmcmFtZSBwb2ludGVyIGlzIGF0ICVzKyVkXG4iLCBcCisgICAgICAgICAgICAgICAgICAgICAgIFJFR0lTVEVSX05BTUUgKGZpLT5wcm9jX2Rlc2MtPnBkci5mcmFtZXJlZyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpLT5wcm9jX2Rlc2MtPnBkci5mcmFtZW9mZnNldCk7IFwKKyAgfQorCisvKiBJdCB0YWtlcyB0d28gdmFsdWVzIHRvIHNwZWNpZnkgYSBmcmFtZSBvbiB0aGUgTUlQUy4KKworICAgSW4gZmFjdCwgdGhlICpQQyogaXMgdGhlIHByaW1hcnkgdmFsdWUgdGhhdCBzZXRzIHVwIGEgZnJhbWUuICBUaGUKKyAgIFBDIGlzIGxvb2tlZCB1cCB0byBzZWUgd2hhdCBmdW5jdGlvbiBpdCdzIGluOyBzeW1ib2wgaW5mb3JtYXRpb24KKyAgIGZyb20gdGhhdCBmdW5jdGlvbiB0ZWxscyB1cyB3aGljaCByZWdpc3RlciBpcyB0aGUgZnJhbWUgcG9pbnRlcgorICAgYmFzZSwgYW5kIHdoYXQgb2Zmc2V0IGZyb20gdGhlcmUgaXMgdGhlICJ2aXJ0dWFsIGZyYW1lIHBvaW50ZXIiLgorICAgKFRoaXMgaXMgdXN1YWxseSBhbiBvZmZzZXQgZnJvbSBTUC4pICBPbiBtb3N0IG5vbi1NSVBTIG1hY2hpbmVzLAorICAgdGhlIHByaW1hcnkgdmFsdWUgaXMgdGhlIFNQLCBhbmQgdGhlIFBDLCBpZiBuZWVkZWQsIGRpc2FtYmlndWF0ZXMKKyAgIG11bHRpcGxlIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIFNQLiAgQnV0IG9uIHRoZSBNSVBTIHdlIGNhbid0IGRvCisgICB0aGF0IHNpbmNlIHRoZSBQQyBpcyBub3Qgc3RvcmVkIGluIHRoZSBzYW1lIHBhcnQgb2YgdGhlIGZyYW1lIGV2ZXJ5CisgICB0aW1lLiAgVGhpcyBkb2VzIG5vdCBzZWVtIHRvIGJlIGEgdmVyeSBjbGV2ZXIgd2F5IHRvIHNldCB1cCBmcmFtZXMsCisgICBidXQgdGhlcmUgaXMgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhhdCkuICAqLworCisjZGVmaW5lIFNFVFVQX0FSQklUUkFSWV9GUkFNRShhcmdjLCBhcmd2KSBzZXR1cF9hcmJpdHJhcnlfZnJhbWUgKGFyZ2MsIGFyZ3YpCitleHRlcm4gc3RydWN0IGZyYW1lX2luZm8gKnNldHVwX2FyYml0cmFyeV9mcmFtZSBQQVJBTVMgKChpbnQsIENPUkVfQUREUiAqKSk7CisKKy8qIENvbnZlcnQgYSBkYnggc3RhYiByZWdpc3RlciBudW1iZXIgKGZyb20gYHInIGRlY2xhcmF0aW9uKSB0byBhIGdkYiBSRUdOVU0gKi8KKworI2RlZmluZSBTVEFCX1JFR19UT19SRUdOVU0obnVtKSAoKG51bSkgPCAzMiA/IChudW0pIDogKG51bSkrRlAwX1JFR05VTS0zOCkKKworLyogQ29udmVydCBhIGVjb2ZmIHJlZ2lzdGVyIG51bWJlciB0byBhIGdkYiBSRUdOVU0gKi8KKworI2RlZmluZSBFQ09GRl9SRUdfVE9fUkVHTlVNKG51bSkgKChudW0pIDwgMzIgPyAobnVtKSA6IChudW0pK0ZQMF9SRUdOVU0tMzIpCisKKy8qIElmIHRoZSBjdXJyZW50IGdjYyBmb3IgZm9yIHRoaXMgdGFyZ2V0IGRvZXMgbm90IHByb2R1Y2UgY29ycmVjdCBkZWJ1Z2dpbmcKKyAgIGluZm9ybWF0aW9uIGZvciBmbG9hdCBwYXJhbWV0ZXJzLCBib3RoIHByb3RvdHlwZWQgYW5kIHVucHJvdG90eXBlZCwgdGhlbgorICAgZGVmaW5lIHRoaXMgbWFjcm8uICBUaGlzIGZvcmNlcyBnZGIgdG8gIGFsd2F5cyBhc3N1bWUgdGhhdCBmbG9hdHMgYXJlCisgICBwYXNzZWQgYXMgZG91YmxlcyBhbmQgdGhlbiBjb252ZXJ0ZWQgaW4gdGhlIGNhbGxlZS4KKworICAgRm9yIHRoZSBtaXBzIGNoaXAsIGl0IGFwcGVhcnMgdGhhdCB0aGUgZGVidWcgaW5mbyBtYXJrcyB0aGUgcGFyYW1ldGVycyBhcworICAgZmxvYXRzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgZnVuY3Rpb24gaXMgcHJvdG90eXBlZCwgYnV0IHRoZSBhY3R1YWwKKyAgIHZhbHVlcyBhcmUgcGFzc2VkIGFzIGRvdWJsZXMgZm9yIHRoZSBub24tcHJvdG90eXBlZCBjYXNlIGFuZCBmbG9hdHMgZm9yCisgICB0aGUgcHJvdG90eXBlZCBjYXNlLiAgVGh1cyB3ZSBjaG9vc2UgdG8gbWFrZSB0aGUgbm9uLXByb3RvdHlwZWQgY2FzZSB3b3JrCisgICBmb3IgQyBhbmQgYnJlYWsgdGhlIHByb3RvdHlwZWQgY2FzZSwgc2luY2UgdGhlIG5vbi1wcm90b3R5cGVkIGNhc2UgaXMKKyAgIHByb2JhYmx5IG11Y2ggbW9yZSBjb21tb24uICAoRklYTUUpLiAqLworCisjZGVmaW5lIENPRVJDRV9GTE9BVF9UT19ET1VCTEUgKGN1cnJlbnRfbGFuZ3VhZ2UgLT4gbGFfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfYykKKworLyogU2VsZWN0IHRoZSBkZWZhdWx0IG1pcHMgZGlzYXNzZW1ibGVyICovCisKKyNkZWZpbmUgVE1fUFJJTlRfSU5TTl9NQUNIIDAKKworCisvKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiBtZGVidWdyZWFkLmMgYW5kIGFyZSB1c2VkIGluIG1pcHMtdGRlcC5jICAqLworZXh0ZXJuIENPUkVfQUREUiBzaWd0cmFtcF9hZGRyZXNzLCBzaWd0cmFtcF9lbmQ7CitleHRlcm4gdm9pZCBmaXh1cF9zaWd0cmFtcCBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIERlZmluZWQgaW4gbWlwcy10ZGVwLmMgYW5kIHVzZWQgaW4gcmVtb3RlLW1pcHMuYyAqLworZXh0ZXJuIGNoYXIgKm1pcHNfcmVhZF9wcm9jZXNzb3JfdHlwZSBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIEZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIE1JUFMxNiBjYWxsIGFuZCByZXR1cm4gc3R1YnMuICAqLworI2RlZmluZSBJTl9TT0xJQl9DQUxMX1RSQU1QT0xJTkUocGMsIG5hbWUpCW1pcHNfaW5fY2FsbF9zdHViIChwYywgbmFtZSkKKyNkZWZpbmUgSU5fU09MSUJfUkVUVVJOX1RSQU1QT0xJTkUocGMsIG5hbWUpCW1pcHNfaW5fcmV0dXJuX3N0dWIgKHBjLCBuYW1lKQorI2RlZmluZSBTS0lQX1RSQU1QT0xJTkVfQ09ERShwYykJCW1pcHNfc2tpcF9zdHViIChwYykKKyNkZWZpbmUgSUdOT1JFX0hFTFBFUl9DQUxMKHBjKQkJCW1pcHNfaWdub3JlX2hlbHBlciAocGMpCitleHRlcm4gaW50IG1pcHNfaW5fY2FsbF9zdHViIFBBUkFNUyAoKENPUkVfQUREUiBwYywgIGNoYXIgKm5hbWUpKTsKK2V4dGVybiBpbnQgbWlwc19pbl9yZXR1cm5fc3R1YiBQQVJBTVMgKChDT1JFX0FERFIgcGMsICBjaGFyICpuYW1lKSk7CitleHRlcm4gQ09SRV9BRERSIG1pcHNfc2tpcF9zdHViIFBBUkFNUyAoKENPUkVfQUREUiBwYykpOworZXh0ZXJuIGludCBtaXBzX2lnbm9yZV9oZWxwZXIgUEFSQU1TICgoQ09SRV9BRERSIHBjKSk7CisKKyNpZm5kZWYgVEFSR0VUX01JUFMKKyNkZWZpbmUgVEFSR0VUX01JUFMKKyNlbmRpZgorCisvKiBEZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIHVzZWQgYnkgbWlwcy10ZGVwLmMgYW5kIHJlbW90ZS1taXBzLmMgICovCisjZGVmaW5lIE1JUFNfSU5TVExFTiA0CQkvKiBMZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgTUlQUzE2X0lOU1RMRU4gMgkvKiBMZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24gb24gTUlQUzE2Ki8KKyNkZWZpbmUgTUlQU19OVU1SRUdTIDMyCQkvKiBOdW1iZXIgb2YgaW50ZWdlciBvciBmbG9hdCByZWdpc3RlcnMgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB0X2luc3Q7CS8qIEludGVnZXIgYmlnIGVub3VnaCB0byBob2xkIGFuIGluc3RydWN0aW9uICovCisKKy8qIE1JUFMxNiBmdW5jdGlvbiBhZGRyZXNzZXMgYXJlIG9kZCAoYml0IDAgaXMgc2V0KS4gIEhlcmUgYXJlIHNvbWUKKyAgIG1hY3JvcyB0byB0ZXN0LCBzZXQsIG9yIGNsZWFyIGJpdCAwIG9mIGFkZHJlc3Nlcy4gICovCisjZGVmaW5lIElTX01JUFMxNl9BRERSKGFkZHIpCSAoKGFkZHIpICYgMSkKKyNkZWZpbmUgTUFLRV9NSVBTMTZfQUREUihhZGRyKQkgKChhZGRyKSB8IDEpCisjZGVmaW5lIFVOTUFLRV9NSVBTMTZfQUREUihhZGRyKSAoKGFkZHIpICYgfjEpCisKKyNlbmRpZgkvKiBUTV9NSVBTX0ggKi8KKworLyogTWFjcm9zIGZvciBzZXR0aW5nIGFuZCB0ZXN0aW5nIGEgYml0IGluIGEgbWluaW1hbCBzeW1ib2wgdGhhdAorICAgbWFya3MgaXQgYXMgMTYtYml0IGZ1bmN0aW9uLiAgVGhlIE1TQiBvZiB0aGUgbWluaW1hbCBzeW1ib2wncworICAgImluZm8iIGZpZWxkIGlzIHVzZWQgZm9yIHRoaXMgcHVycG9zZS4gVGhpcyBmaWVsZCBpcyBhbHJlYWR5CisgICBiZWluZyB1c2VkIHRvIHN0b3JlIHRoZSBzeW1ib2wgc2l6ZSwgc28gdGhlIGFzc3VtcHRpb24gaXMKKyAgIHRoYXQgdGhlIHN5bWJvbCBzaXplIGNhbm5vdCBleGNlZWQgMl4zMS4KKworICAgRUxGX01BS0VfTVNZTUJPTF9TUEVDSUFMCisJCQl0ZXN0cyB3aGV0aGVyIGFuIEVMRiBzeW1ib2wgaXMgInNwZWNpYWwiLCBpLmUuIHJlZmVycworCQkJdG8gYSAxNi1iaXQgZnVuY3Rpb24sIGFuZCBzZXRzIGEgInNwZWNpYWwiIGJpdCBpbiBhIAorCQkJbWluaW1hbCBzeW1ib2wgdG8gbWFyayBpdCBhcyBhIDE2LWJpdCBmdW5jdGlvbgorICAgTVNZTUJPTF9JU19TUEVDSUFMCXRlc3RzIHRoZSAic3BlY2lhbCIgYml0IGluIGEgbWluaW1hbCBzeW1ib2wKKyAgIE1TWU1CT0xfU0laRQkJcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbWluaW1hbCBzeW1ib2wsIGkuZS4KKwkJCXRoZSAiaW5mbyIgZmllbGQgd2l0aCB0aGUgInNwZWNpYWwiIGJpdCBtYXNrZWQgb3V0CisqLworCisjZGVmaW5lIEVMRl9NQUtFX01TWU1CT0xfU1BFQ0lBTChzeW0sbXN5bSkgXAorIHsgXAorICBpZiAoKChlbGZfc3ltYm9sX3R5cGUgKikoc3ltKSktPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXIgPT0gU1RPX01JUFMxNikgeyBcCisgICAgTVNZTUJPTF9JTkZPIChtc3ltKSA9IChjaGFyICopICgoKGxvbmcpIE1TWU1CT0xfSU5GTyAobXN5bSkpIHwgMHg4MDAwMDAwMCk7IFwKKyAgICBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bSkgfD0gMTsgXAorICB9IFwKKyB9CisgICAKKyNkZWZpbmUgTVNZTUJPTF9JU19TUEVDSUFMKG1zeW0pIFwKKyAgKCgobG9uZykgTVNZTUJPTF9JTkZPIChtc3ltKSAmIDB4ODAwMDAwMDApICE9IDApCisjZGVmaW5lIE1TWU1CT0xfU0laRShtc3ltKSBcCisgICgobG9uZykgTVNZTUJPTF9JTkZPIChtc3ltKSAmIDB4N2ZmZmZmZmYpCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvdG0tbWlwczY0LmggYi9nZGIvY29uZmlnL21pcHMvdG0tbWlwczY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhODkyNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy90bS1taXBzNjQuaApAQCAtMCwwICsxLDU0IEBACisvKiBUYXJnZXQgbWFjaGluZSBwYXJhbWV0ZXJzIGZvciBNSVBTIHI0MDAwCisgICBDb3B5cmlnaHQgMTk5NCwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IgKGlhbkBjeWdudXMuY29tKQorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgR0RCX1RBUkdFVF9JU19NSVBTNjQgMQorCisvKiBVc2UgZWlnaHQgYnl0ZSByZWdpc3RlcnMuICAqLworI2RlZmluZSBNSVBTX1JFR1NJWkUgOAorCisvKiBkZWZpbmUgOCBieXRlIHJlZ2lzdGVyIHR5cGUgKi8KKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9UWVBFKE4pIFwKKyAgICAgICAgKCgoTikgPj0gRlAwX1JFR05VTSAmJiAoTikgPCBGUDBfUkVHTlVNKzMyKSA/IGJ1aWx0aW5fdHlwZV9kb3VibGUgXAorCSA6ICgoTikgPT0gMzIgLypTUiovKSA/IGJ1aWx0aW5fdHlwZV91aW50MzIgXAorCSA6ICgoTikgPj0gNzAgJiYgKE4pIDw9IDg5KSA/IGJ1aWx0aW5fdHlwZV91aW50MzIgXAorCSA6IGJ1aWx0aW5fdHlwZV9sb25nX2xvbmcpCisKKy8qIExvYWQgZG91YmxlIHdvcmRzIGluIENBTExfRFVNTVkuICAqLworI2RlZmluZSBPUF9MREZQUiAwNjUJLyogbGRjMSAqLworI2RlZmluZSBPUF9MREdQUiAwNjcJLyogbGQgKi8KKworI2lmIGRlZmluZWQoTUlQU19FQUJJKSAmJiAoTUlQU19FQUJJICE9IDApCisvKiBEZWZpbmUgc2l6ZXMgZm9yIDY0LWJpdCBkYXRhIHR5cGVzLCBhbGxvdyBzcGVjaWZpYyB0YXJnZXRzIHRvIG92ZXJyaWRlCisgICB0aGVzZSB2YWx1ZXMuICBEb2luZyBzbyBtYXkgdmlvbGF0ZSB0aGUgc3RyaWN0IEVBQkksIGJ1dCBpdCdzIG5lY2Vzc2FyeQorICAgZm9yIHNvbWUgTUlQUyBJSUkgYW5kIE1JUFMgSVYgbWFjaGluZXMgdGhhdCB3YW50IDY0Yml0IGxvbmdzLCBidXQgMzJiaXQKKyAgIHBvaW50ZXJzLiAgKi8KKyNpZm5kZWYgVEFSR0VUX0xPTkdfQklUCisjZGVmaW5lIFRBUkdFVF9MT05HX0JJVCAgICAgIDY0CisjZW5kaWYKKyNpZm5kZWYgVEFSR0VUX0xPTkdfTE9OR19CSVQKKyNkZWZpbmUgVEFSR0VUX0xPTkdfTE9OR19CSVQgNjQKKyNlbmRpZgorI2lmbmRlZiBUQVJHRVRfUFRSX0JJVAorI2RlZmluZSBUQVJHRVRfUFRSX0JJVCAgICAgICA2NAorI2VuZGlmCisjZW5kaWYgLyogTUlQU19FQUJJICovCisKKy8qIEdldCB0aGUgYmFzaWMgTUlQUyBkZWZpbml0aW9ucy4gICovCisjaW5jbHVkZSAidG0tbWlwcy5oIgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL3RtLW1pcHNtMy5oIGIvZ2RiL2NvbmZpZy9taXBzL3RtLW1pcHNtMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MzY2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21pcHMvdG0tbWlwc20zLmgKQEAgLTAsMCArMSw2NiBAQAorLyogRGVmaW5pdGlvbnMgdG8gbWFrZSBHREIgcnVuIG9uIGEgbWlwcyBib3ggdW5kZXIgTWFjaCAzLjAKKyAgIENvcHlyaWdodCAoQykgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBNYWNoIHNwZWNpZmljIGRlZmluaXRpb25zIGZvciBsaXR0bGUgZW5kaWFuIG1pcHMgKGUuZy4gcG1heCkKKyAqIHJ1bm5pbmcgTWFjaCAzLjAKKyAqCisgKiBBdXRob3I6IEp1a2thIFZpcnRhbmVuIDxqdHZAaHV0LmZpPgorICovCisKKy8qIEluY2x1ZGUgY29tbW9uIGRlZmluaXRpb25zIGZvciBNYWNoMyBzeXN0ZW1zICovCisjaW5jbHVkZSAibm0tbTMuaCIKKworLyogRGVmaW5lIG9mZnNldHMgdG8gYWNjZXNzIENQUk9DIHN0YWNrIHdoZW4gaXQgZG9lcyBub3QgaGF2ZQorICogYSBrZXJuZWwgdGhyZWFkLgorICovCisKKy8qIEZyb20gbWsvdXNlci90aHJlYWRzL21pcHMvY3N3LnMgKi8KKyNkZWZpbmUgU0FWRURfRlAJKDEyKjQpCisjZGVmaW5lIFNBVkVEX1BDCSgxMyo0KQorI2RlZmluZSBTQVZFRF9CWVRFUwkoMTQqNCkKKworLyogVXNpbmcgdGhlc2UsIGRlZmluZSBvdXIgb2Zmc2V0cyB0byBpdGVtcyBzdHJvcmVkIGluCisgKiBjcHJvY19zd2l0Y2ggaW4gY3N3LnMKKyAqLworI2RlZmluZSBNQUNISU5FX0NQUk9DX1NQX09GRlNFVCBTQVZFRF9CWVRFUworI2RlZmluZSBNQUNISU5FX0NQUk9DX1BDX09GRlNFVCBTQVZFRF9QQworI2RlZmluZSBNQUNISU5FX0NQUk9DX0ZQX09GRlNFVCBTQVZFRF9GUAorCisvKiBUaHJlYWQgZmxhdm9ycyB1c2VkIGluIHNldHRpbmcgdGhlIFRyYWNlIHN0YXRlLgorICoKKyAqIEluIDxtYWNoL21hY2hpbmUvdGhyZWFkX3N0YXR1cy5oPgorICovCisjZGVmaW5lIFRSQUNFX0ZMQVZPUgkJTUlQU19FWENfU1RBVEUKKyNkZWZpbmUgVFJBQ0VfRkxBVk9SX1NJWkUJTUlQU19FWENfU1RBVEVfQ09VTlQKKyNkZWZpbmUgVFJBQ0VfU0VUKHgsc3RhdGUpCSgoc3RydWN0IG1pcHNfZXhjX3N0YXRlICopc3RhdGUpLT5jYXVzZSA9IEVYQ19TU1Q7CisjZGVmaW5lIFRSQUNFX0NMRUFSKHgsc3RhdGUpCTAKKworLyogTWFjaCBzdXBwb3J0cyBhdHRhY2gvZGV0YWNoICovCisjZGVmaW5lIEFUVEFDSF9ERVRBQ0ggMQorCisjaW5jbHVkZSAibWlwcy90bS1taXBzLmgiCisKKy8qIEFkZHJlc3Mgb2YgZW5kIG9mIHVzZXIgc3RhY2sgc3BhY2UuCisgKiBmb3IgTUFDSCwgc2VlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KKyAqLworI3VuZGVmICBTVEFDS19FTkRfQUREUgorI2RlZmluZSBTVEFDS19FTkRfQUREUiBVU1JTVEFDSworCisvKiBPdXRwdXQgcmVnaXN0ZXJzIGluIHRhYnVsYXIgZm9ybWF0ICovCisjZGVmaW5lIFRBQlVMQVJfUkVHSVNURVJfT1VUUFVUCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvdG0tbWlwc3Y0LmggYi9nZGIvY29uZmlnL21pcHMvdG0tbWlwc3Y0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3YWFhMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy90bS1taXBzdjQuaApAQCAtMCwwICsxLDQ1IEBACisvKiBUYXJnZXQgbWFjaGluZSBkZXNjcmlwdGlvbiBmb3IgTUlQUyBydW5uaW5nIFNWUjQsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAibWlwcy90bS1iaWdtaXBzLmgiCisjaW5jbHVkZSAidG0tc3lzdjQuaCIKKworLyogV2hlbiBjYWxsaW5nIGZ1bmN0aW9ucyBvbiBhIE1JUFMgU1ZSNCBBQkkgY29tcGxpYW50IHBsYXRmb3JtCisgICAkMjUgbXVzdCBob2xkIHRoZSBmdW5jdGlvbiBhZGRyZXNzLiAgRGVzdF9SZWcgaXMgYSBtYWNybworICAgdXNlZCBpbiBDQUxMX0RVTU1ZIGluIHRtLW1pcHMuaC4gICovCisjdW5kZWYgRGVzdF9SZWcKKyNkZWZpbmUgRGVzdF9SZWcgMjUKKworLyogVGhlIHNpZ25hbCBoYW5kbGVyIHRyYW1wb2xpbmUgaXMgY2FsbGVkIF9zaWd0cmFtcC4gICovCisjdW5kZWYgSU5fU0lHVFJBTVAKKyNkZWZpbmUgSU5fU0lHVFJBTVAocGMsIG5hbWUpICgobmFtZSkgJiYgU1RSRVEgKCJfc2lndHJhbXAiLCBuYW1lKSkKKyAKKy8qIE9uIGVudHJ5IHRvIHRoZSBzaWduYWwgaGFuZGxlciB0cmFtcG9saW5lLCBhbiB1Y29udGV4dCBpcyBhbHJlYWR5CisgICBwdXNoZWQgb24gdGhlIHN0YWNrLiBXZSBjYW4gZ2V0IGF0IHRoZSBzYXZlZCByZWdpc3RlcnMgdmlhIHRoZQorICAgbWNvbnRleHQgd2hpY2ggaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgdWNvbnRleHQuICAqLworI2RlZmluZSBTSUdGUkFNRV9CQVNFCTAKKyNkZWZpbmUgU0lHRlJBTUVfUkVHU0FWRV9PRkYJKFNJR0ZSQU1FX0JBU0UgKyA0MCkKKyNkZWZpbmUgU0lHRlJBTUVfUENfT0ZGCQkoU0lHRlJBTUVfQkFTRSArIDQwICsgMzUgKiA0KQorI2RlZmluZSBTSUdGUkFNRV9GUFJFR1NBVkVfT0ZGCShTSUdGUkFNRV9CQVNFICsgNDAgKyAzNiAqIDQpCisKKy8qIFVzZSB0aGUgYWx0ZXJuYXRlIG1ldGhvZCBvZiBkZXRlcm1pbmluZyB2YWxpZCBmcmFtZSBjaGFpbnMuICovCisjZGVmaW5lIEZSQU1FX0NIQUlOX1ZBTElEKGZwLGZpKSBhbHRlcm5hdGVfZnJhbWVfY2hhaW5fdmFsaWQgKGZwLCBmaSkKKworLyogQ29udmVydCBhIERXQVJGIHJlZ2lzdGVyIG51bWJlciB0byBhIGdkYiBSRUdOVU0uICAqLworI2RlZmluZSBEV0FSRl9SRUdfVE9fUkVHTlVNKG51bSkgKChudW0pIDwgMzIgPyAobnVtKSA6IChudW0pK0ZQMF9SRUdOVU0tMzIpCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvdG0tdHgzOS5oIGIvZ2RiL2NvbmZpZy9taXBzL3RtLXR4MzkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTk5YTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL3RtLXR4MzkuaApAQCAtMCwwICsxLDM5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFX1AgMQorI2RlZmluZSBNSVBTX0VBQkkgMQorI2RlZmluZSBNSVBTX0RFRkFVTFRfRlBVX1RZUEUgTUlQU19GUFVfTk9ORQorCisjaW5jbHVkZSAibWlwcy90bS1iaWdtaXBzLmgiCisKKyN1bmRlZiAgUkVHSVNURVJfTkFNRVMKKyNkZWZpbmUgUkVHSVNURVJfTkFNRVMgCVwKKyAgICB7CSJ6ZXJvIiwJImF0IiwJInYwIiwJInYxIiwJImEwIiwJImExIiwJImEyIiwJImEzIiwgXAorCSJ0MCIsCSJ0MSIsCSJ0MiIsCSJ0MyIsCSJ0NCIsCSJ0NSIsCSJ0NiIsCSJ0NyIsIFwKKwkiczAiLAkiczEiLAkiczIiLAkiczMiLAkiczQiLAkiczUiLAkiczYiLAkiczciLCBcCisJInQ4IiwJInQ5IiwJImswIiwJImsxIiwJImdwIiwJInNwIiwJInM4IiwJInJhIiwgXAorCSJzciIsCSJsbyIsCSJoaSIsCSJiYWQiLAkiY2F1c2UiLCJwYyIsIFwKKwkiIiwgICAJIiIsICAgCSIiLCAgIAkiIiwgICAJIiIsICAgCSIiLCAgIAkiIiwgICAJIiIsIFwKKwkiIiwgICAJIiIsICAgCSIiLCAgCSIiLCAgCSIiLCAgCSIiLCAgCSIiLCAgCSIiLCBcCisJIiIsICAJIiIsICAJIiIsICAJIiIsICAJIiIsICAJIiIsICAJIiIsICAJIiIsIFwKKwkiIiwgIAkiIiwgIAkiIiwgIAkiIiwgIAkiIiwgIAkiIiwgIAkiIiwgIAkiIiwgXAorCSIiLCAgCSIiLCAgCSIiLAkiIiwgXAorCSIiLAkiIiwJIiIsCSIiLAkiIiwJIiIsCSIiLAkiIiwgXAorCSIiLAkiIiwgImNvbmZpZyIsICJjYWNoZSIsICJkZWJ1ZyIsICJkZXBjIiwgImVwYyIsCSIiIFwKKyAgICB9CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvdG0tdHgzOWwuaCBiL2dkYi9jb25maWcvbWlwcy90bS10eDM5bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZWVjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21pcHMvdG0tdHgzOWwuaApAQCAtMCwwICsxLDM5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFX1AgMQorI2RlZmluZSBNSVBTX0VBQkkgMQorI2RlZmluZSBNSVBTX0RFRkFVTFRfRlBVX1RZUEUgTUlQU19GUFVfTk9ORQorCisjaW5jbHVkZSAibWlwcy90bS1taXBzLmgiCisKKyN1bmRlZiAgUkVHSVNURVJfTkFNRVMKKyNkZWZpbmUgUkVHSVNURVJfTkFNRVMgCVwKKyAgICB7CSJ6ZXJvIiwJImF0IiwJInYwIiwJInYxIiwJImEwIiwJImExIiwJImEyIiwJImEzIiwgXAorCSJ0MCIsCSJ0MSIsCSJ0MiIsCSJ0MyIsCSJ0NCIsCSJ0NSIsCSJ0NiIsCSJ0NyIsIFwKKwkiczAiLAkiczEiLAkiczIiLAkiczMiLAkiczQiLAkiczUiLAkiczYiLAkiczciLCBcCisJInQ4IiwJInQ5IiwJImswIiwJImsxIiwJImdwIiwJInNwIiwJInM4IiwJInJhIiwgXAorCSJzciIsCSJsbyIsCSJoaSIsCSJiYWQiLAkiY2F1c2UiLCJwYyIsIFwKKwkiIiwgICAJIiIsICAgCSIiLCAgIAkiIiwgICAJIiIsICAgCSIiLCAgIAkiIiwgICAJIiIsIFwKKwkiIiwgICAJIiIsICAgCSIiLCAgCSIiLCAgCSIiLCAgCSIiLCAgCSIiLCAgCSIiLCBcCisJIiIsICAJIiIsICAJIiIsICAJIiIsICAJIiIsICAJIiIsICAJIiIsICAJIiIsIFwKKwkiIiwgIAkiIiwgIAkiIiwgIAkiIiwgIAkiIiwgIAkiIiwgIAkiIiwgIAkiIiwgXAorCSIiLCAgCSIiLCAgCSIiLAkiIiwgXAorCSIiLAkiIiwJIiIsCSIiLAkiIiwJIiIsCSIiLAkiIiwgXAorCSIiLAkiIiwgImNvbmZpZyIsICJjYWNoZSIsICJkZWJ1ZyIsICJkZXBjIiwgImVwYyIsCSIiIFwKKyAgICB9CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvdG0tdnI0MTAwLmggYi9nZGIvY29uZmlnL21pcHMvdG0tdnI0MTAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzZjQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy90bS12cjQxMDAuaApAQCAtMCwwICsxLDI1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFX1AgMQorI2RlZmluZSBNSVBTX0VBQkkgMQorI2RlZmluZSBNSVBTX0RFRkFVTFRfRlBVX1RZUEUgTUlQU19GUFVfTk9ORQorI2RlZmluZSBUQVJHRVRfTU9OSVRPUl9QUk9NUFQgIjxSSVNRPiAiCisjZGVmaW5lIFRBUkdFVF9QVFJfQklUIDY0CisKKyNpbmNsdWRlICJtaXBzL3RtLWJpZ21pcHM2NC5oIgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL3RtLXZyNDMwMC5oIGIvZ2RiL2NvbmZpZy9taXBzL3RtLXZyNDMwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MWNhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21pcHMvdG0tdnI0MzAwLmgKQEAgLTAsMCArMSwyMiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRV9QIDEKKyNkZWZpbmUgVEFSR0VUX01PTklUT1JfUFJPTVBUICI8UklTUT4gIgorCisjaW5jbHVkZSAibWlwcy90bS1iaWdtaXBzNjQuaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy90bS12cjQzMDBlbC5oIGIvZ2RiL2NvbmZpZy9taXBzL3RtLXZyNDMwMGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlODY5MwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy90bS12cjQzMDBlbC5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MywgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRBUkdFVF9CWVRFX09SREVSX1NFTEVDVEFCTEVfUCAxCisjZGVmaW5lIFRBUkdFVF9NT05JVE9SX1BST01QVCAiPFJJU1E+ICIKKworI2luY2x1ZGUgIm1pcHMvdG0tbWlwczY0LmgiCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvdG0tdnI1MDAwLmggYi9nZGIvY29uZmlnL21pcHMvdG0tdnI1MDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzNGE3NwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy90bS12cjUwMDAuaApAQCAtMCwwICsxLDIzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFX1AgMQorI2RlZmluZSBUQVJHRVRfTU9OSVRPUl9QUk9NUFQgIjxSSVNRPiAiCisjZGVmaW5lIE1JUFNfRUFCSSAxCisKKyNpbmNsdWRlICJtaXBzL3RtLWJpZ21pcHM2NC5oIgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL3RtLXZyNTAwMGVsLmggYi9nZGIvY29uZmlnL21pcHMvdG0tdnI1MDAwZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjg5N2QxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL3RtLXZyNTAwMGVsLmgKQEAgLTAsMCArMSwyMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRV9QIDEKKyNkZWZpbmUgVEFSR0VUX01PTklUT1JfUFJPTVBUICI8UklTUT4gIgorI2RlZmluZSBNSVBTX0VBQkkgMQorCisjaW5jbHVkZSAibWlwcy90bS1taXBzNjQuaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy90bS12eG1pcHMuaCBiL2dkYi9jb25maWcvbWlwcy90bS12eG1pcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTJhOTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL3RtLXZ4bWlwcy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qIFRhcmdldCBtYWNoaW5lIGRlc2NyaXB0aW9uIGZvciBWeFdvcmtzIE1JUFMncywgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZQlHREJJTklUX0ZJTEVOQU1FCSIudnhnZGJpbml0IgorCisjZGVmaW5lCURFRkFVTFRfUFJPTVBUCQkiKHZ4Z2RiKSAiCisKKyNpbmNsdWRlICJtaXBzL3RtLW1pcHMuaCIKKworLyogRklYTUU6IFRoZXNlIGFyZSBhbG1vc3QgY2VydGFpbmx5IHdyb25nLiAqLworCisvKiBOdW1iZXIgb2YgcmVnaXN0ZXJzIGluIGEgcHRyYWNlX2dldHJlZ3MgY2FsbC4gKi8KKworI2RlZmluZSBWWF9OVU1fUkVHUyAoTlVNX1JFR1MpCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvdHgzOS5tdCBiL2dkYi9jb25maWcvbWlwcy90eDM5Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNGMxYTkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21pcHMvdHgzOS5tdApAQCAtMCwwICsxLDUgQEAKKyMgVGFyZ2V0OiBCaWctZW5kaWFuIG1pcHMgYm9hcmQsIHR5cGljYWxseSBhbiBJRFQuCitUREVQRklMRVM9IG1pcHMtdGRlcC5vIHJlbW90ZS1taXBzLm8gZHZlMzkwMC1yb20ubyBtb25pdG9yLm8gZHNyZWMubworVE1fRklMRT0gdG0tdHgzOS5oCitTSU1fT0JTID0gcmVtb3RlLXNpbS5vCitTSU0gPSAuLi9zaW0vbWlwcy9saWJzaW0uYQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL3R4MzlsLm10IGIvZ2RiL2NvbmZpZy9taXBzL3R4MzlsLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDgzMjkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21pcHMvdHgzOWwubXQKQEAgLTAsMCArMSw1IEBACisjIFRhcmdldDogQmlnLWVuZGlhbiBtaXBzIGJvYXJkLCB0eXBpY2FsbHkgYW4gSURULgorVERFUEZJTEVTPSBtaXBzLXRkZXAubyByZW1vdGUtbWlwcy5vIGR2ZTM5MDAtcm9tLm8gbW9uaXRvci5vIGRzcmVjLm8KK1RNX0ZJTEU9IHRtLXR4MzlsLmgKK1NJTV9PQlMgPSByZW1vdGUtc2ltLm8KK1NJTSA9IC4uL3NpbS9taXBzL2xpYnNpbS5hCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvdnI0MTAwLm10IGIvZ2RiL2NvbmZpZy9taXBzL3ZyNDEwMC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWFlNGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL3ZyNDEwMC5tdApAQCAtMCwwICsxLDUgQEAKKyMgVGFyZ2V0OiBCaWctZW5kaWFuIFNJTSBtb25pdG9yIGJvYXJkLgorVERFUEZJTEVTPSBtaXBzLXRkZXAubyByZW1vdGUtbWlwcy5vCitUTV9GSUxFPSB0bS12cjQxMDAuaAorU0lNX09CUyA9IHJlbW90ZS1zaW0ubworU0lNID0gLi4vc2ltL21pcHMvbGlic2ltLmEKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy92cjQzMDAubXQgYi9nZGIvY29uZmlnL21pcHMvdnI0MzAwLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyY2IyNWUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21pcHMvdnI0MzAwLm10CkBAIC0wLDAgKzEsNSBAQAorIyBUYXJnZXQ6IEJpZy1lbmRpYW4gU0lNIG1vbml0b3IgYm9hcmQuCitUREVQRklMRVM9IG1pcHMtdGRlcC5vIHJlbW90ZS1taXBzLm8KK1RNX0ZJTEU9IHRtLXZyNDMwMC5oCitTSU1fT0JTID0gcmVtb3RlLXNpbS5vCitTSU0gPSAuLi9zaW0vbWlwcy9saWJzaW0uYQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL3ZyNDMwMGVsLm10IGIvZ2RiL2NvbmZpZy9taXBzL3ZyNDMwMGVsLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZjcyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21pcHMvdnI0MzAwZWwubXQKQEAgLTAsMCArMSw1IEBACisjIFRhcmdldDogTGl0dGxlLWVuZGlhbiBTSU0gbW9uaXRvciBib2FyZC4KK1RERVBGSUxFUz0gbWlwcy10ZGVwLm8gcmVtb3RlLW1pcHMubworVE1fRklMRT0gdG0tdnI0MzAwZWwuaAorU0lNX09CUyA9IHJlbW90ZS1zaW0ubworU0lNID0gLi4vc2ltL21pcHMvbGlic2ltLmEKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy92cjUwMDAubXQgYi9nZGIvY29uZmlnL21pcHMvdnI1MDAwLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNmM1NDgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21pcHMvdnI1MDAwLm10CkBAIC0wLDAgKzEsNyBAQAorIyBUYXJnZXQ6IEJpZy1lbmRpYW4gU0lNIG1vbml0b3IgYm9hcmQuCitUREVQRklMRVM9IG1pcHMtdGRlcC5vIHJlbW90ZS1taXBzLm8KK1RNX0ZJTEU9IHRtLXZyNTAwMC5oCitTSU1fT0JTID0gcmVtb3RlLXNpbS5vCitTSU0gPSAuLi9zaW0vbWlwcy9saWJzaW0uYQorR0RCU0VSVkVSX0RFUEZJTEVTPSBsb3ctc2ltLm8KK0dEQlNFUlZFUl9MSUJTID0gLi4vLi4vc2ltL21pcHMvbGlic2ltLmEgLi4vLi4vYmZkL2xpYmJmZC5hIC4uLy4uL2xpYmliZXJ0eS9saWJpYmVydHkuYSAtbG0KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy92cjUwMDBlbC5tdCBiL2dkYi9jb25maWcvbWlwcy92cjUwMDBlbC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTY4N2VkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL3ZyNTAwMGVsLm10CkBAIC0wLDAgKzEsNSBAQAorIyBUYXJnZXQ6IExpdHRsZS1lbmRpYW4gU0lNIG1vbml0b3IgYm9hcmQuCitUREVQRklMRVM9IG1pcHMtdGRlcC5vIHJlbW90ZS1taXBzLm8KK1RNX0ZJTEU9IHRtLXZyNTAwMGVsLmgKK1NJTV9PQlMgPSByZW1vdGUtc2ltLm8KK1NJTSA9IC4uL3NpbS9taXBzL2xpYnNpbS5hCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMvdnhtaXBzLm10IGIvZ2RiL2NvbmZpZy9taXBzL3Z4bWlwcy5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjBjZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL3Z4bWlwcy5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBNSVBTIHJ1bm5pbmcgVnhXb3JrcworVERFUEZJTEVTPSBtaXBzLXRkZXAubyByZW1vdGUtdngubyByZW1vdGUtdnhtaXBzLm8geGRyX2xkLm8geGRyX3B0cmFjZS5vIHhkcl9yZGIubworVE1fRklMRT0gdG0tdnhtaXBzLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy94bS1pcml4My5oIGIvZ2RiL2NvbmZpZy9taXBzL3htLWlyaXgzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5NjU5NAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy94bS1pcml4My5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGlzIGZvciB0aGUgaXJpcy4gKi8KKworI2RlZmluZSBIQVZFX1RFUk1JTworCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBCSUdfRU5ESUFOCisKKy8qIE92ZXJyaWRlIHJlZ2lzdGVyIGxvY2F0aW9ucyBpbiB1cGFnZSBmb3IgU0dJIG1hY2hpbmVzICovCisjdW5kZWYgUkVHSVNURVJfVV9BRERSCisjZGVmaW5lIFJFR0lTVEVSX1VfQUREUihhZGRyLCBibG9ja2VuZCwgcmVnbm8pIAkJXAorICBpZiAocmVnbm8gPCBQQ19SRUdOVU0pCQkJCVwKKyAgICAgIGFkZHIgPSByZWdubzsJCQkJCVwKKyAgZWxzZQkJCQkJCQlcCisgICAgICBhZGRyID0gcmVnbm8gKyBOU0lHX0hORExSUzsgLyogU2tpcCBvdmVyIHNpZ25hbCBoYW5kbGVycyAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL3htLWlyaXg0LmggYi9nZGIvY29uZmlnL21pcHMveG0taXJpeDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGQyMWYwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL3htLWlyaXg0LmgKQEAgLTAsMCArMSwzMyBAQAorLyogRGVmaW5pdGlvbnMgZm9yIGlyaXg0IGhvc3Rpbmcgc3VwcG9ydC4KKworQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgaXMgZm9yIHRoZSBpcmlzLiAqLworCisjaW5jbHVkZSAibWlwcy94bS1pcml4My5oIgorCisjZGVmaW5lIEJST0tFTl9TSUdJTkZPX0gJLyogPHN5cy9zaWdpbmZvLmg+IHNpX3BpZCAmIHNpX3VpZCBhcmUgYm9ndXMgKi8KKworLyogSXJpeCA0LjAuMSBhbmQgbGF0ZXIgaGF2ZSB0ZXJtaW9zLiAgTm90IHN1cmUgYWJvdXQgZWFybGllciB2ZXJzaW9ucy4gICovCisjdW5kZWYgSEFWRV9URVJNSU8KKyNkZWZpbmUgSEFWRV9URVJNSU9TCisKKy8qIFRoaXMgZW5hYmxlcyByZWxpYWJsZSBzaWduYWxzIChhbmQgdGhlIGFzc29jaWF0ZWQgc2V0am1wL2xvbmdqbXApLCBhbmQgZ2l2ZXMKKyAgIGJzZGlzaCBwcm90b3R5cGVzIGZvciBnZXRwZ3JwL3NldHBncmcvc2V0Z3JvdXBzIGFuZCBpbml0Z3JvdXBzLiAgKi8KKyNkZWZpbmUgX0JTRF9DT01QQVQKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy94bS1pcml4NS5oIGIvZ2RiL2NvbmZpZy9taXBzL3htLWlyaXg1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY0Mjc3YgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy94bS1pcml4NS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIERlZmluaXRpb25zIGZvciBpcml4NSBob3N0aW5nIHN1cHBvcnQuCisKK0NvcHlyaWdodCAoQykgMTk5MywgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAieG0tc3lzdjQuaCIKKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgQklHX0VORElBTgorCisvKiBPdmVycmlkZSByZWdpc3RlciBsb2NhdGlvbnMgaW4gdXBhZ2UgZm9yIFNHSSBtYWNoaW5lcyAqLworI3VuZGVmIFJFR0lTVEVSX1VfQUREUgorI2RlZmluZSBSRUdJU1RFUl9VX0FERFIoYWRkciwgYmxvY2tlbmQsIHJlZ25vKSAJCVwKKyAgaWYgKHJlZ25vIDwgUENfUkVHTlVNKQkJCQlcCisgICAgICBhZGRyID0gcmVnbm87CQkJCQlcCisgIGVsc2UJCQkJCQkJXAorICAgICAgYWRkciA9IHJlZ25vICsgTlNJR19ITkRMUlM7IC8qIFNraXAgb3ZlciBzaWduYWwgaGFuZGxlcnMgKi8KKworLyogVGhpcyBlbmFibGVzIHJlbGlhYmxlIHNpZ25hbHMgKGFuZCB0aGUgYXNzb2NpYXRlZCBzZXRqbXAvbG9uZ2ptcCksIGFuZCBnaXZlcworICAgYnNkaXNoIHByb3RvdHlwZXMgZm9yIGdldHBncnAvc2V0cGdyZy9zZXRncm91cHMgYW5kIGluaXRncm91cHMuICAqLworI2RlZmluZSBfQlNEX0NPTVBBVApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL3htLW1pcHMuaCBiL2dkYi9jb25maWcvbWlwcy94bS1taXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlOWE1MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy94bS1taXBzLmgKQEAgLTAsMCArMSw2MSBAQAorLyogRGVmaW5pdGlvbnMgdG8gbWFrZSBHREIgcnVuIG9uIGEgbWlwcyBib3ggdW5kZXIgNC4zYnNkLgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgUGVyIEJvdGhuZXIoYm90aG5lckBjcy53aXNjLmVkdSkgYXQgVS5XaXNjb25zaW4KKyAgIGFuZCBieSBBbGVzc2FuZHJvIEZvcmluKGFmQGNzLmNtdS5lZHUpIGF0IENNVQorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCAoSE9TVF9CWVRFX09SREVSKQorI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgorI2VuZGlmCisKKyNpZmRlZiB1bHRyaXgKKy8qIE5lZWRlZCBmb3IgREVDc3RhdGlvbiBjb3JlIGZpbGVzLiAgKi8KKyNpbmNsdWRlIDxtYWNoaW5lL3BhcmFtLmg+CisjZGVmaW5lIEtFUk5FTF9VX0FERFIgVUFERFIKKworLyogTmF0aXZlIFVsdHJpeCBjYyBoYXMgYnJva2VuIGxvbmcgbG9uZyBzdXBwb3J0LiAgKi8KKyNpZm5kZWYgX19HTlVDX18KKyN1bmRlZiBDQ19IQVNfTE9OR19MT05HCisjZW5kaWYKKyNlbmRpZgorCisjaWYgISBkZWZpbmVkIChfX1NURENfXykgJiYgISBkZWZpbmVkIChvZmZzZXRvZikKKyMgZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgKCh1bnNpZ25lZCBsb25nKSAmKChUWVBFICopMCktPk1FTUJFUikKKyNlbmRpZgorCisvKiBPbmx5IHVzZWQgZm9yIGNvcmUgZmlsZXMgb24gREVDc3RhdGlvbnMuCisgICBGaXJzdCBmb3VyIHJlZ2lzdGVycyBhdCB1LnVfYXIwIGFyZSBzYXZlZCBhcmd1bWVudHMsIGFuZAorICAgdGhlcmUgaXMgbm8gcjAgc2F2ZWQuICAgRmxvYXQgcmVnaXN0ZXJzIGFyZSBzYXZlZAorICAgaW4gdV9wY2IucGNiX2ZwcmVncywgbm90IHJlbGF0aXZlIHRvIHUudV9hcjAuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1VfQUREUihhZGRyLCBibG9ja2VuZCwgcmVnbm8pIAkJXAorCXsgXAorCSAgaWYgKHJlZ25vIDwgRlAwX1JFR05VTSkgXAorCSAgICBhZGRyID0gYmxvY2tlbmQgKyBzaXplb2YoaW50KSAqICg0ICsgcmVnbm8gLSAxKTsgXAorCSAgZWxzZSBcCisJICAgIGFkZHIgPSBvZmZzZXRvZiAoc3RydWN0IHVzZXIsIHVfcGNiLnBjYl9mcHJlZ3NbMF0pICsgXAorCQkgICBzaXplb2YgKGludCkgKiAocmVnbm8gLSBGUDBfUkVHTlVNKTsgXAorCX0KKworLyogS2VybmVsIGlzIGEgYml0IHRlbmFjaW91cyBhYm91dCBzaGFyaW5nIHRleHQgc2VnbWVudHMsIGRpc2FsbG93aW5nIGJwdHMuICAqLworI2RlZmluZQlPTkVfUFJPQ0VTU19XUklURVRFWFQKKworLyogSEFWRV9TR1RUWSBhbHNvIHdvcmtzLCBsYXN0IHdlIHRyaWVkLgorCisgICBCdXQgd2UgaGF2ZSB0ZXJtaW9zLCBhdCBsZWFzdCBhcyBvZiBVbHRyaXggNC4yQSwgc28gdXNlIGl0LiAgKi8KKyNkZWZpbmUgSEFWRV9URVJNSU9TCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMveG0tbWlwc20zLmggYi9nZGIvY29uZmlnL21pcHMveG0tbWlwc20zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE1YTczYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy94bS1taXBzbTMuaApAQCAtMCwwICsxLDMyIEBACisvKiBEZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gYSBtaXBzIGJveCB1bmRlciA0LjNic2QuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBQZXIgQm90aG5lcihib3RobmVyQGNzLndpc2MuZWR1KSBhdCBVLldpc2NvbnNpbgorICAgYW5kIGJ5IEFsZXNzYW5kcm8gRm9yaW4oYWZAY3MuY211LmVkdSkgYXQgQ01VCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIChIT1NUX0JZVEVfT1JERVIpCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisjZW5kaWYKKworI2RlZmluZSBLRVJORUxfVV9BRERSIDAgLyogTm90IG5lZWRlZC4gKi8KKworLyogT25seSB1c2VkIGZvciBjb3JlIGZpbGVzIG9uIERFQ3N0YXRpb25zLiAqLworCisjZGVmaW5lIFJFR0lTVEVSX1VfQUREUihhZGRyLCBibG9ja2VuZCwgcmVnbm8pIAkJXAorCWlmIChyZWdubyA8IDM4KSBhZGRyID0gKE5CUEcqVVBBR0VTKSArIChyZWdubyAtIDM4KSpzaXplb2YoaW50KTtcCisJZWxzZSBhZGRyID0gMDsgLyogLi5zb21ld2hlcmUgaW4gdGhlIHBjYiAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9taXBzL3htLW1pcHN2NC5oIGIvZ2RiL2NvbmZpZy9taXBzL3htLW1pcHN2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MGJhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21pcHMveG0tbWlwc3Y0LmgKQEAgLTAsMCArMSwyMyBAQAorLyogRGVmaW5pdGlvbnMgZm9yIE1JUFMgcnVubmluZyBTVlI0IGhvc3Rpbmcgc3VwcG9ydC4KKworQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJ4bS1zeXN2NC5oIgorCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBCSUdfRU5ESUFOCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL21pcHMveG0tbmV3cy1taXBzLmggYi9nZGIvY29uZmlnL21pcHMveG0tbmV3cy1taXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhYWMxYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbWlwcy94bS1uZXdzLW1pcHMuaApAQCAtMCwwICsxLDI0IEBACisvKiBEZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gYSBtaXBzIGJveCB1bmRlciA0LjNic2QuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBQZXIgQm90aG5lcihib3RobmVyQGNzLndpc2MuZWR1KSBhdCBVLldpc2NvbnNpbgorICAgYW5kIGJ5IEFsZXNzYW5kcm8gRm9yaW4oYWZAY3MuY211LmVkdSkgYXQgQ01VCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIChIT1NUX0JZVEVfT1JERVIpCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBCSUdfRU5ESUFOCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbWlwcy94bS1yaXNjb3MuaCBiL2dkYi9jb25maWcvbWlwcy94bS1yaXNjb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjdmMzJhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9taXBzL3htLXJpc2Nvcy5oCkBAIC0wLDAgKzEsMjggQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEhBVkVfVEVSTUlPCisKKyNpZiAhZGVmaW5lZCAoSE9TVF9CWVRFX09SREVSKQorI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgQklHX0VORElBTgorI2VuZGlmCisKKyNkZWZpbmUgVVNHIDEKKworLyogc2V0am1wLmggcmVxdWlyZXMgdWlkX3QuICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tbjEwMjAwL21uMTAyMDAubXQgYi9nZGIvY29uZmlnL21uMTAyMDAvbW4xMDIwMC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODVhMmZiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tbjEwMjAwL21uMTAyMDAubXQKQEAgLTAsMCArMSw2IEBACisjIFRhcmdldDogTWF0c3VzaGl0YSBtbjEwMjAwCitUREVQRklMRVM9IG1uMTAyMDAtdGRlcC5vCitUTV9GSUxFPSB0bS1tbjEwMjAwLmgKKworU0lNX09CUyA9IHJlbW90ZS1zaW0ubworU0lNID0gLi4vc2ltL21uMTAyMDAvbGlic2ltLmEKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbW4xMDIwMC90bS1tbjEwMjAwLmggYi9nZGIvY29uZmlnL21uMTAyMDAvdG0tbW4xMDIwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MWI1MzQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21uMTAyMDAvdG0tbW4xMDIwMC5oCkBAIC0wLDAgKzEsMjEyIEBACisvKiBQYXJhbWV0ZXJzIGZvciBleGVjdXRpb24gb24gYSBNYXRzdXNoaXRhIG1uMTAyMDAgcHJvY2Vzc29yLgorICAgQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIAorCisgICBDb250cmlidXRlZCBieSBHZW9mZnJleSBOb2VyIDxub2VyQGN5Z251cy5jb20+CisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhlIG1uMTAyMDAgaXMgbGl0dGxlIGVuZGlhbi4gICovCisjZGVmaW5lIFRBUkdFVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKworLyogaW50cyBhcmUgb25seSAxNmJpdHMgb24gdGhlIG1uMTAyMDAuICAqLworI3VuZGVmIFRBUkdFVF9JTlRfQklUCisjZGVmaW5lIFRBUkdFVF9JTlRfQklUIDE2CisKKy8qIFRoZSBtbjEwMjAwIGRvZXNuJ3Qgc3VwcG9ydCBsb25nIGxvbmcgdHlwZXMuICAqLworI3VuZGVmIFRBUkdFVF9MT05HX0xPTkdfQklUCisjZGVmaW5lIFRBUkdFVF9MT05HX0xPTkdfQklUIDMyCisKKy8qIFRoZSBtbjEwMjAwIGRvZXNuJ3Qgc3VwcG9ydCBkb3VibGUgb3IgbG9uZyBkb3VibGUgZWl0aGVyLiAgKi8KKyN1bmRlZiBUQVJHRVRfRE9VQkxFX0JJVAorI3VuZGVmIFRBUkdFVF9MT05HX0RPVUJMRV9CSVQKKyNkZWZpbmUgVEFSR0VUX0RPVUJMRV9CSVQgMzIKKyNkZWZpbmUgVEFSR0VUX0xPTkdfRE9VQkxFX0JJVCAzMgorCisvKiBOb3Qgc3RyaWN0bHkgY29ycmVjdCwgYnV0IHRoZSBtYWNoaW5lIGluZGVwZW5kZW50IGNvZGUgaXMgbm90CisgICByZWFkeSB0byBoYW5kbGUgYW55IG9mIHRoZSBiYXNpYyBzaXplcyBub3QgYmVpbmcgYSBwb3dlciBvZiB0d28uICAqLworI3VuZGVmIFRBUkdFVF9QVFJfQklUCisjZGVmaW5lIFRBUkdFVF9QVFJfQklUIDMyCisKKy8qIFRoZSBtbjEwMjAwIHJlYWxseSBoYXMgMjQgYml0IHJlZ2lzdGVycyBidXQgdGhlIHNpbXVsYXRvciByZWFkcy93cml0ZXMKKyAgIHRoZW0gYXMgMzJiaXQgdmFsdWVzLCBzbyB3ZSBjbGFpbSB0aGV5J3JlIDMyYml0cyBlYWNoLiAgVGhpcyBtYXkgaGF2ZQorICAgdG8gYmUgdHdlYWtlZCBpZiB0aGUgTWF0c3VzaGl0YSBlbXVsYXRvci9ib2FyZCByZWFsbHkgZGVhbHMgd2l0aCB0aGVtCisgICBhcyAyNGJpdHMgZWFjaC4gICovCisjZGVmaW5lIFJFR0lTVEVSX1NJWkUgNAorCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9SQVdfU0laRSBSRUdJU1RFUl9TSVpFCisjZGVmaW5lIE5VTV9SRUdTIDExCisKKyNkZWZpbmUgUkVHSVNURVJfQllURVMgKE5VTV9SRUdTICogUkVHSVNURVJfU0laRSkKKworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyBcCit7ICJkMCIsICJkMSIsICJkMiIsICJkMyIsICJhMCIsICJhMSIsICJhMiIsICJzcCIsIFwKKyAgInBjIiwgIm1kciIsICJwc3cifQorCisjZGVmaW5lIEZQX1JFR05VTSA2CisjZGVmaW5lIFNQX1JFR05VTSA3CisjZGVmaW5lIFBDX1JFR05VTSA4CisjZGVmaW5lIE1EUl9SRUdOVU0gOQorI2RlZmluZSBQU1dfUkVHTlVNIDEwCisKKy8qIFRyZWF0IHRoZSByZWdpc3RlcnMgYXMgMzJiaXQgdmFsdWVzLiAgKi8KKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9UWVBFKFJFRykgYnVpbHRpbl90eXBlX2xvbmcKKworI2RlZmluZSBSRUdJU1RFUl9CWVRFKFJFRykgKChSRUcpICogUkVHSVNURVJfU0laRSkKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9TSVpFKFJFRykgUkVHSVNURVJfU0laRQorI2RlZmluZSBSRUdJU1RFUl9SQVdfU0laRShSRUcpIFJFR0lTVEVSX1NJWkUKKworI2RlZmluZSBNQVhfUkVHSVNURVJfVklSVFVBTF9TSVpFIFJFR0lTVEVSX1NJWkUKKworLyogVGhlIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gbXVzdCBiZSB0aGUgc2FtZSBzaXplIGFzIHRlIHNtYWxsZXN0CisgICBpbnN0cnVjdGlvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24gc2V0LgorCisgICBUaGUgTWF0c3VzaGl0YSBtbjEweDAwIHByb2Nlc3NvcnMgaGF2ZSBzaW5nbGUgYnl0ZSBpbnN0cnVjdGlvbnMKKyAgIHNvIHdlIG5lZWQgYSBzaW5nbGUgYnl0ZSBicmVha3BvaW50LiAgTWF0c3VzaGl0YSBoYXNuJ3QgZGVmaW5lZAorICAgb25lLCBzbyB3ZSBkZWZpbmVkIGl0IG91cnNlbHZlcy4KKworICAgMHhmZiBpcyB0aGUgb25seSBhdmFpbGFibGUgc2luZ2xlIGJ5dGUgaW5zbiBsZWZ0IG9uIHRoZSBtbjEwMjAwLiAgKi8KKyNkZWZpbmUgQlJFQUtQT0lOVCB7MHhmZn0KKworI2RlZmluZSBGVU5DVElPTl9TVEFSVF9PRkZTRVQgMAorCisjZGVmaW5lIERFQ1JfUENfQUZURVJfQlJFQUsgMAorCisvKiBTdGFja3MgZ3JvdyB0aGUgbm9ybWFsIHdheS4gICovCisjZGVmaW5lIElOTkVSX1RIQU4obGhzLHJocykgKChsaHMpIDwgKHJocykpCisKKyNkZWZpbmUgU0FWRURfUENfQUZURVJfQ0FMTChmcmFtZSkgXAorICAocmVhZF9tZW1vcnlfaW50ZWdlciAocmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKSwgUkVHSVNURVJfU0laRSkgJiAweGZmZmZmZikKKworI2lmZGVmIF9fU1REQ19fCitzdHJ1Y3QgZnJhbWVfaW5mbzsKK3N0cnVjdCBmcmFtZV9zYXZlZF9yZWdzOworc3RydWN0IHR5cGU7CitzdHJ1Y3QgdmFsdWU7CisjZW5kaWYKKworI2RlZmluZSBFWFRSQV9GUkFNRV9JTkZPIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzIGZzcjsgaW50IHN0YXR1czsgaW50IHN0YWNrX3NpemU7CisKK2V4dGVybiB2b2lkIG1uMTAyMDBfaW5pdF9leHRyYV9mcmFtZV9pbmZvIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKyNkZWZpbmUgSU5JVF9FWFRSQV9GUkFNRV9JTkZPKGZyb21sZWFmLCBmaSkgbW4xMDIwMF9pbml0X2V4dHJhX2ZyYW1lX2luZm8gKGZpKQorI2RlZmluZSBJTklUX0ZSQU1FX1BDKHgseSkKKworZXh0ZXJuIHZvaWQgbW4xMDIwMF9mcmFtZV9maW5kX3NhdmVkX3JlZ3MgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKiwKKwkJCQkJCSAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICopKTsKKyNkZWZpbmUgRlJBTUVfRklORF9TQVZFRF9SRUdTKGZpLCByZWdhZGRyKSByZWdhZGRyID0gZmktPmZzcgorCitleHRlcm4gQ09SRV9BRERSIG1uMTAyMDBfZnJhbWVfY2hhaW4gUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworI2RlZmluZSBGUkFNRV9DSEFJTihmaSkgbW4xMDIwMF9mcmFtZV9jaGFpbiAoZmkpCisjZGVmaW5lIEZSQU1FX0NIQUlOX1ZBTElEKEZQLCBGSSkJZ2VuZXJpY19mcmFtZV9jaGFpbl92YWxpZCAoRlAsIEZJKQorCitleHRlcm4gQ09SRV9BRERSIG1uMTAyMDBfZmluZF9jYWxsZXJzX3JlZyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqLCBpbnQpKTsKK2V4dGVybiBDT1JFX0FERFIgbW4xMDIwMF9mcmFtZV9zYXZlZF9wYyAgIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKyNkZWZpbmUgRlJBTUVfU0FWRURfUEMoRkkpIChtbjEwMjAwX2ZyYW1lX3NhdmVkX3BjIChGSSkpCisKKy8qIEV4dHJhY3QgZnJvbSBhbiBhcnJheSBSRUdCVUYgY29udGFpbmluZyB0aGUgKHJhdykgcmVnaXN0ZXIgc3RhdGUKKyAgIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIG9mIHR5cGUgVFlQRSwgYW5kIGNvcHkgdGhhdCwgaW4gdmlydHVhbCBmb3JtYXQsCisgICBpbnRvIFZBTEJVRi4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9SRVRVUk5fVkFMVUUoVFlQRSwgUkVHQlVGLCBWQUxCVUYpIFwKKyAgeyBcCisgICAgaWYgKFRZUEVfTEVOR1RIIChUWVBFKSA+IDgpIFwKKyAgICAgIGFib3J0ICgpOyBcCisgICAgZWxzZSBpZiAoVFlQRV9MRU5HVEggKFRZUEUpID4gMiAmJiBUWVBFX0NPREUgKFRZUEUpICE9IFRZUEVfQ09ERV9QVFIpIFwKKyAgICAgIHsgXAorCW1lbWNweSAoVkFMQlVGLCBSRUdCVUYgKyBSRUdJU1RFUl9CWVRFICgwKSwgMik7IFwKKwltZW1jcHkgKFZBTEJVRiArIDIsIFJFR0JVRiArIFJFR0lTVEVSX0JZVEUgKDEpLCAyKTsgXAorICAgICAgfSBcCisgICAgZWxzZSBpZiAoVFlQRV9DT0RFIChUWVBFKSA9PSBUWVBFX0NPREVfUFRSKVwKKyAgICAgIHsgXAorICAgICAgICBtZW1jcHkgKFZBTEJVRiwgUkVHQlVGICsgUkVHSVNURVJfQllURSAoNCksIFRZUEVfTEVOR1RIIChUWVBFKSk7IFwKKyAgICAgIH0gXAorICAgIGVsc2UgXAorICAgICAgeyBcCisgICAgICAgIG1lbWNweSAoVkFMQlVGLCBSRUdCVUYgKyBSRUdJU1RFUl9CWVRFICgwKSwgVFlQRV9MRU5HVEggKFRZUEUpKTsgXAorICAgICAgfSBcCisgIH0KKworI2RlZmluZSBFWFRSQUNUX1NUUlVDVF9WQUxVRV9BRERSRVNTKFJFR0JVRikgXAorICBleHRyYWN0X2FkZHJlc3MgKFJFR0JVRiArIFJFR0lTVEVSX0JZVEUgKDQpLCBcCisJCSAgIFJFR0lTVEVSX1JBV19TSVpFICg0KSkKKworI2RlZmluZSBTVE9SRV9SRVRVUk5fVkFMVUUoVFlQRSwgVkFMQlVGKSBcCisgIHsgXAorICAgIGlmIChUWVBFX0xFTkdUSCAoVFlQRSkgPiA4KSBcCisgICAgICBhYm9ydCAoKTsgXAorICAgIGVsc2UgaWYgKFRZUEVfTEVOR1RIIChUWVBFKSA+IDIgJiYgVFlQRV9DT0RFIChUWVBFKSAhPSBUWVBFX0NPREVfUFRSKSBcCisgICAgICB7IFwKKwl3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSAoMCksIFZBTEJVRiwgMik7IFwKKwl3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSAoMSksIFZBTEJVRiArIDIsIDIpOyBcCisgICAgICB9IFwKKyAgICBlbHNlIGlmIChUWVBFX0NPREUgKFRZUEUpID09IFRZUEVfQ09ERV9QVFIpXAorICAgICAgeyBcCisgICAgICAgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFICg0KSwgVkFMQlVGLCBUWVBFX0xFTkdUSCAoVFlQRSkpOyBcCisgICAgICB9IFwKKyAgICBlbHNlIFwKKyAgICAgIHsgXAorICAgICAgICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSAoMCksIFZBTEJVRiwgVFlQRV9MRU5HVEggKFRZUEUpKTsgXAorICAgICAgfSBcCisgIH0KKworI2RlZmluZSBTVE9SRV9TVFJVQ1RfUkVUVVJOKFNUUlVDVF9BRERSLCBTUCkgXAorICAoU1ApID0gbW4xMDIwMF9zdG9yZV9zdHJ1Y3RfcmV0dXJuIChTVFJVQ1RfQUREUiwgU1ApCisKK2V4dGVybiBDT1JFX0FERFIgbW4xMDIwMF9za2lwX3Byb2xvZ3VlIFBBUkFNUyAoKENPUkVfQUREUikpOworI2RlZmluZSBTS0lQX1BST0xPR1VFKHBjKSBwYyA9IG1uMTAyMDBfc2tpcF9wcm9sb2d1ZSAocGMpCisKKyNkZWZpbmUgRlJBTUVfQVJHU19TS0lQIDAKKworI2RlZmluZSBGUkFNRV9BUkdTX0FERFJFU1MoZmkpICgoZmkpLT5mcmFtZSkKKyNkZWZpbmUgRlJBTUVfTE9DQUxTX0FERFJFU1MoZmkpICgoZmkpLT5mcmFtZSkKKyNkZWZpbmUgRlJBTUVfTlVNX0FSR1ModmFsLCBmaSkgKCh2YWwpID0gLTEpCisKK2V4dGVybiB2b2lkIG1uMTAyMDBfcG9wX2ZyYW1lIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKyNkZWZpbmUgUE9QX0ZSQU1FIG1uMTAyMDBfcG9wX2ZyYW1lIChnZXRfY3VycmVudF9mcmFtZSAoKSkKKworI2RlZmluZSBVU0VfR0VORVJJQ19EVU1NWV9GUkFNRVMKKyNkZWZpbmUgQ0FMTF9EVU1NWSAgICAgICAgICAgICAgICAgICB7MH0KKyNkZWZpbmUgQ0FMTF9EVU1NWV9TVEFSVF9PRkZTRVQgICAgICAoMCkKKyNkZWZpbmUgQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVCAoMCkKKyNkZWZpbmUgQ0FMTF9EVU1NWV9MT0NBVElPTiAgICAgICAgICBBVF9FTlRSWV9QT0lOVAorI2RlZmluZSBGSVhfQ0FMTF9EVU1NWShEVU1NWSwgU1RBUlQsIEZVTkFERFIsIE5BUkdTLCBBUkdTLCBUWVBFLCBHQ0NQKQorI2RlZmluZSBDQUxMX0RVTU1ZX0FERFJFU1MoKSAgICAgICAgIGVudHJ5X3BvaW50X2FkZHJlc3MgKCkKKworZXh0ZXJuIENPUkVfQUREUiBtbjEwMjAwX3B1c2hfcmV0dXJuX2FkZHJlc3MgUEFSQU1TICgoQ09SRV9BRERSLCBDT1JFX0FERFIpKTsKKyNkZWZpbmUgUFVTSF9SRVRVUk5fQUREUkVTUyhQQywgU1ApICBtbjEwMjAwX3B1c2hfcmV0dXJuX2FkZHJlc3MgKFBDLCBTUCkKKworI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FCWdlbmVyaWNfcHVzaF9kdW1teV9mcmFtZSAoKQorCitleHRlcm4gQ09SRV9BRERSCittbjEwMjAwX3B1c2hfYXJndW1lbnRzIFBBUkFNUyAoKGludCwgc3RydWN0IHZhbHVlICoqLCBDT1JFX0FERFIsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIsIENPUkVfQUREUikpOworI2RlZmluZSBQVVNIX0FSR1VNRU5UUyhOQVJHUywgQVJHUywgU1AsIFNUUlVDVF9SRVRVUk4sIFNUUlVDVF9BRERSKSBcCisgIChTUCkgPSBtbjEwMjAwX3B1c2hfYXJndW1lbnRzIChOQVJHUywgQVJHUywgU1AsIFNUUlVDVF9SRVRVUk4sIFNUUlVDVF9BRERSKQorCisjZGVmaW5lIFBDX0lOX0NBTExfRFVNTVkoUEMsIFNQLCBGUCkgZ2VuZXJpY19wY19pbl9jYWxsX2R1bW15IChQQywgU1ApCisKKyNkZWZpbmUgUkVHX1NUUlVDVF9IQVNfQUREUihnY2NfcCxUWVBFKSBcCisgIAkoVFlQRV9MRU5HVEggKFRZUEUpID4gOCkKKworZXh0ZXJuIHVzZV9zdHJ1Y3RfY29udmVudGlvbl9mbiBtbjEwMjAwX3VzZV9zdHJ1Y3RfY29udmVudGlvbjsKKyNkZWZpbmUgVVNFX1NUUlVDVF9DT05WRU5USU9OKEdDQ19QLCBUWVBFKSBtbjEwMjAwX3VzZV9zdHJ1Y3RfY29udmVudGlvbiAoR0NDX1AsIFRZUEUpCisKKy8qIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGdldF9zYXZlZF9yZWdpc3RlciBmdW5jdGlvbiB3aXRoCisgICBvbmUgdGhhdCB0YWtlcyBhY2NvdW50IG9mIGdlbmVyaWMgQ0FMTF9EVU1NWSBmcmFtZXMuICAqLworI2RlZmluZSBHRVRfU0FWRURfUkVHSVNURVIKKworLyogRGVmaW5lIHRoaXMgZm9yIFdpbmdkYiAqLworI2RlZmluZSBUQVJHRVRfTU4xMDIwMApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9tbjEwMzAwL21uMTAzMDAubXQgYi9nZGIvY29uZmlnL21uMTAzMDAvbW4xMDMwMC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzUwM2JkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9tbjEwMzAwL21uMTAzMDAubXQKQEAgLTAsMCArMSw2IEBACisjIFRhcmdldDogTWF0c3VzaGl0YSBtbjEwMzAwCitUREVQRklMRVM9IG1uMTAzMDAtdGRlcC5vCitUTV9GSUxFPSB0bS1tbjEwMzAwLmgKKworU0lNX09CUyA9IHJlbW90ZS1zaW0ubworU0lNID0gLi4vc2ltL21uMTAzMDAvbGlic2ltLmEKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbW4xMDMwMC90bS1tbjEwMzAwLmggYi9nZGIvY29uZmlnL21uMTAzMDAvdG0tbW4xMDMwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDNmZDcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL21uMTAzMDAvdG0tbW4xMDMwMC5oCkBAIC0wLDAgKzEsMTY1IEBACisvKiBQYXJhbWV0ZXJzIGZvciBleGVjdXRpb24gb24gYSBNYXRzdXNoaXRhIG1uMTAzMDAgcHJvY2Vzc29yLgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIAorCisgICBDb250cmlidXRlZCBieSBHZW9mZnJleSBOb2VyIDxub2VyQGN5Z251cy5jb20+CisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhlIG1uMTAzMDAgaXMgbGl0dGxlIGVuZGlhbi4gICovCisjZGVmaW5lIFRBUkdFVF9CWVRFX09SREVSX0RFRkFVTFQgTElUVExFX0VORElBTgorCisvKiBBbGwgcmVnaXN0ZXJzIGFyZSAzMmJpdHMgKHBoZXchKS4gICovCisjZGVmaW5lIFJFR0lTVEVSX1NJWkUgNAorI2RlZmluZSBNQVhfUkVHSVNURVJfUkFXX1NJWkUgNAorI2RlZmluZSBOVU1fUkVHUyAzMgorCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRShSRUcpIGJ1aWx0aW5fdHlwZV9pbnQKKworI2RlZmluZSBSRUdJU1RFUl9CWVRFKFJFRykgKChSRUcpICogNCkKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9TSVpFKFJFRykgNAorI2RlZmluZSBSRUdJU1RFUl9SQVdfU0laRShSRUcpIDQKKworI2RlZmluZSBNQVhfUkVHSVNURVJfVklSVFVBTF9TSVpFIDQKKworI2RlZmluZSBSRUdJU1RFUl9CWVRFUyAoTlVNX1JFR1MgKiBSRUdJU1RFUl9TSVpFKQorCitleHRlcm4gY2hhciAqKm1uMTAzMDBfcmVnaXN0ZXJfbmFtZXM7CisjZGVmaW5lIFJFR0lTVEVSX05BTUUoaSkgbW4xMDMwMF9yZWdpc3Rlcl9uYW1lc1tpXQorCisjZGVmaW5lIEQyX1JFR05VTSAyCisjZGVmaW5lIEQzX1JFR05VTSAzCisjZGVmaW5lIEEyX1JFR05VTSA2CisjZGVmaW5lIEEzX1JFR05VTSA3CisjZGVmaW5lIFNQX1JFR05VTSA4CisjZGVmaW5lIFBDX1JFR05VTSA5CisjZGVmaW5lIE1EUl9SRUdOVU0gMTAKKyNkZWZpbmUgUFNXX1JFR05VTSAxMQorI2RlZmluZSBMSVJfUkVHTlVNIDEyCisjZGVmaW5lIExBUl9SRUdOVU0gMTMKKworLyogUHNldWRvIHJlZ2lzdGVyIHRoYXQgY29udGFpbnMgdHJ1ZSBhZGRyZXNzIG9mIGV4ZWN1dGluZyBzdGFjayBmcmFtZSAqLworI2RlZmluZSBGUF9SRUdOVU0gMzEKKworLyogQlJFQUtQT0lOVF9GUk9NX1BDIHVzZXMgdGhlIHByb2dyYW0gY291bnRlciB2YWx1ZSB0byBkZXRlcm1pbmUgdGhlCisgICBicmVha3BvaW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgKi8KK2V4dGVybiBicmVha3BvaW50X2Zyb21fcGNfZm4gbW4xMDMwMF9icmVha3BvaW50X2Zyb21fcGM7CisjZGVmaW5lIEJSRUFLUE9JTlRfRlJPTV9QQyhwY3B0ciwgbGVucHRyKSBtbjEwMzAwX2JyZWFrcG9pbnRfZnJvbV9wYyAocGNwdHIsIGxlbnB0cikKKworI2RlZmluZSBGVU5DVElPTl9TVEFSVF9PRkZTRVQgMAorCisjZGVmaW5lIERFQ1JfUENfQUZURVJfQlJFQUsgMAorCisjZGVmaW5lIElOTkVSX1RIQU4obGhzLHJocykgKChsaHMpIDwgKHJocykpCisKKyNkZWZpbmUgU0FWRURfUENfQUZURVJfQ0FMTChmcmFtZSkgXAorICByZWFkX21lbW9yeV9pbnRlZ2VyIChyZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pLCA0KQorCisjaWZkZWYgX19TVERDX18KK3N0cnVjdCBmcmFtZV9pbmZvOworc3RydWN0IHR5cGU7CitzdHJ1Y3QgdmFsdWU7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgbW4xMDMwMF9pbml0X2V4dHJhX2ZyYW1lX2luZm8gUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworI2RlZmluZSBJTklUX0VYVFJBX0ZSQU1FX0lORk8oZnJvbWxlYWYsIGZpKSBtbjEwMzAwX2luaXRfZXh0cmFfZnJhbWVfaW5mbyAoZmkpCisjZGVmaW5lIElOSVRfRlJBTUVfUEMJCS8qIE5vdCBuZWNlc3NhcnkgKi8KKworI2RlZmluZSBGUkFNRV9JTklUX1NBVkVEX1JFR1MoZmkpIC8qIGhhbmRsZWQgYnkgaW5pdF9leHRyYV9mcmFtZV9pbmZvICovCisKK2V4dGVybiBDT1JFX0FERFIgbW4xMDMwMF9mcmFtZV9jaGFpbiBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisjZGVmaW5lIEZSQU1FX0NIQUlOKGZpKSBtbjEwMzAwX2ZyYW1lX2NoYWluIChmaSkKKyNkZWZpbmUgRlJBTUVfQ0hBSU5fVkFMSUQoRlAsIEZJKQlnZW5lcmljX2ZyYW1lX2NoYWluX3ZhbGlkIChGUCwgRkkpCisKK2V4dGVybiBDT1JFX0FERFIgbW4xMDMwMF9maW5kX2NhbGxlcnNfcmVnIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICosIGludCkpOworZXh0ZXJuIENPUkVfQUREUiBtbjEwMzAwX2ZyYW1lX3NhdmVkX3BjICAgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworI2RlZmluZSBGUkFNRV9TQVZFRF9QQyhGSSkgKG1uMTAzMDBfZnJhbWVfc2F2ZWRfcGMgKEZJKSkKKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgb2YgdHlwZSBUWVBFLCBhbmQgY29weSB0aGF0LCBpbiB2aXJ0dWFsIGZvcm1hdCwKKyAgIGludG8gVkFMQlVGLiAqLworCisjZGVmaW5lIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKFRZUEUsIFJFR0JVRiwgVkFMQlVGKSBcCisgIGlmIChUWVBFX0NPREUgKFRZUEUpID09IFRZUEVfQ09ERV9QVFIpIFwKKyAgICBtZW1jcHkgKFZBTEJVRiwgUkVHQlVGICsgUkVHSVNURVJfQllURSAoNCksIFRZUEVfTEVOR1RIIChUWVBFKSk7IFwKKyAgZWxzZSBcCisgICAgbWVtY3B5IChWQUxCVUYsIFJFR0JVRiArIFJFR0lTVEVSX0JZVEUgKDApLCBUWVBFX0xFTkdUSCAoVFlQRSkpOworCisKKyNkZWZpbmUgRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyhSRUdCVUYpIFwKKyAgZXh0cmFjdF9hZGRyZXNzIChSRUdCVUYgKyBSRUdJU1RFUl9CWVRFICg0KSwgXAorCQkgICBSRUdJU1RFUl9SQVdfU0laRSAoNCkpCisKKyNkZWZpbmUgU1RPUkVfUkVUVVJOX1ZBTFVFKFRZUEUsIFZBTEJVRikgXAorICBpZiAoVFlQRV9DT0RFIChUWVBFKSA9PSBUWVBFX0NPREVfUFRSKSBcCisgICAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMoUkVHSVNURVJfQllURSAoNCksIFZBTEJVRiwgVFlQRV9MRU5HVEggKFRZUEUpKTsgXAorICBlbHNlIFwKKyAgICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyhSRUdJU1RFUl9CWVRFICgwKSwgVkFMQlVGLCBUWVBFX0xFTkdUSCAoVFlQRSkpOworCisjZGVmaW5lIFNUT1JFX1NUUlVDVF9SRVRVUk4oU1RSVUNUX0FERFIsIFNQKSBcCisgIChTUCkgPSBtbjEwMzAwX3N0b3JlX3N0cnVjdF9yZXR1cm4gKFNUUlVDVF9BRERSLCBTUCkKKworZXh0ZXJuIENPUkVfQUREUiBtbjEwMzAwX3NraXBfcHJvbG9ndWUgUEFSQU1TICgoQ09SRV9BRERSKSk7CisjZGVmaW5lIFNLSVBfUFJPTE9HVUUocGMpIHBjID0gbW4xMDMwMF9za2lwX3Byb2xvZ3VlIChwYykKKworI2RlZmluZSBGUkFNRV9BUkdTX1NLSVAgMAorCisjZGVmaW5lIEZSQU1FX0FSR1NfQUREUkVTUyhmaSkgKChmaSktPmZyYW1lKQorI2RlZmluZSBGUkFNRV9MT0NBTFNfQUREUkVTUyhmaSkgKChmaSktPmZyYW1lKQorI2RlZmluZSBGUkFNRV9OVU1fQVJHUyh2YWwsIGZpKSAoKHZhbCkgPSAtMSkKKworZXh0ZXJuIHZvaWQgbW4xMDMwMF9wb3BfZnJhbWUgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworI2RlZmluZSBQT1BfRlJBTUUgbW4xMDMwMF9wb3BfZnJhbWUgKGdldF9jdXJyZW50X2ZyYW1lICgpKQorCisjZGVmaW5lIFVTRV9HRU5FUklDX0RVTU1ZX0ZSQU1FUworI2RlZmluZSBDQUxMX0RVTU1ZICAgICAgICAgICAgICAgICAgIHswfQorI2RlZmluZSBDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCAgICAgICgwKQorI2RlZmluZSBDQUxMX0RVTU1ZX0JSRUFLUE9JTlRfT0ZGU0VUICgwKQorI2RlZmluZSBDQUxMX0RVTU1ZX0xPQ0FUSU9OICAgICAgICAgIEFUX0VOVFJZX1BPSU5UCisjZGVmaW5lIEZJWF9DQUxMX0RVTU1ZKERVTU1ZLCBTVEFSVCwgRlVOQUREUiwgTkFSR1MsIEFSR1MsIFRZUEUsIEdDQ1ApCisjZGVmaW5lIENBTExfRFVNTVlfQUREUkVTUygpICAgICAgICAgZW50cnlfcG9pbnRfYWRkcmVzcyAoKQorCitleHRlcm4gQ09SRV9BRERSIG1uMTAzMDBfcHVzaF9yZXR1cm5fYWRkcmVzcyBQQVJBTVMgKChDT1JFX0FERFIsIENPUkVfQUREUikpOworI2RlZmluZSBQVVNIX1JFVFVSTl9BRERSRVNTKFBDLCBTUCkgIG1uMTAzMDBfcHVzaF9yZXR1cm5fYWRkcmVzcyAoUEMsIFNQKQorCisjZGVmaW5lIFBVU0hfRFVNTVlfRlJBTUUJZ2VuZXJpY19wdXNoX2R1bW15X2ZyYW1lICgpCisKK2V4dGVybiBDT1JFX0FERFIKK21uMTAzMDBfcHVzaF9hcmd1bWVudHMgUEFSQU1TICgoaW50LCBzdHJ1Y3QgdmFsdWUgKiosIENPUkVfQUREUiwKKwkJCQl1bnNpZ25lZCBjaGFyLCBDT1JFX0FERFIgKSk7CisjZGVmaW5lIFBVU0hfQVJHVU1FTlRTKE5BUkdTLCBBUkdTLCBTUCwgU1RSVUNUX1JFVFVSTiwgU1RSVUNUX0FERFIpIFwKKyAgKFNQKSA9IG1uMTAzMDBfcHVzaF9hcmd1bWVudHMgKE5BUkdTLCBBUkdTLCBTUCwgU1RSVUNUX1JFVFVSTiwgU1RSVUNUX0FERFIpCisKKyNkZWZpbmUgUENfSU5fQ0FMTF9EVU1NWShQQywgU1AsIEZQKSBnZW5lcmljX3BjX2luX2NhbGxfZHVtbXkgKFBDLCBTUCkKKworI2RlZmluZSBSRUdfU1RSVUNUX0hBU19BRERSKGdjY19wLFRZUEUpIFwKKwkoVFlQRV9MRU5HVEggKFRZUEUpID4gOCkKKworZXh0ZXJuIHVzZV9zdHJ1Y3RfY29udmVudGlvbl9mbiBtbjEwMzAwX3VzZV9zdHJ1Y3RfY29udmVudGlvbjsKKyNkZWZpbmUgVVNFX1NUUlVDVF9DT05WRU5USU9OKEdDQ19QLCBUWVBFKSBtbjEwMzAwX3VzZV9zdHJ1Y3RfY29udmVudGlvbiAoR0NDX1AsIFRZUEUpCisKKy8qIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGdldF9zYXZlZF9yZWdpc3RlciBmdW5jdGlvbiB3aXRoCisgICBvbmUgdGhhdCB0YWtlcyBhY2NvdW50IG9mIGdlbmVyaWMgQ0FMTF9EVU1NWSBmcmFtZXMgKi8KKyNkZWZpbmUgR0VUX1NBVkVEX1JFR0lTVEVSCisKKy8qIENvbnMgdXAgdmlydHVhbCBmcmFtZSBwb2ludGVyIGZvciB0cmFjZSAqLworZXh0ZXJuIHZvaWQgbW4xMDMwMF92aXJ0dWFsX2ZyYW1lX3BvaW50ZXIgUEFSQU1TICgoQ09SRV9BRERSLCBsb25nICosIGxvbmcgKikpOworI2RlZmluZSBUQVJHRVRfVklSVFVBTF9GUkFNRV9QT0lOVEVSKFBDLCBSRUdQLCBPRkZQKSBcCisJbW4xMDMwMF92aXJ0dWFsX2ZyYW1lX3BvaW50ZXIgKChQQyksIChSRUdQKSwgKE9GRlApKQorCisvKiBEZWZpbmUgdGhpcyBmb3IgV2luZ2RiICovCisKKyNkZWZpbmUgVEFSR0VUX01OMTAzMDAKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbm0tZW1wdHkuaCBiL2dkYi9jb25maWcvbm0tZW1wdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDY5ZDhjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9ubS1lbXB0eS5oCkBAIC0wLDAgKzEsMiBAQAorLyogVGhpcyBpcyBqdXN0IGEgZHVtbXkgZmlsZSB0byBzeW1saW5rIHRvIHdoZW4gR0RCIGlzIGNvbmZpZ3VyZWQgYXMgYQorICAgY3Jvc3Mtb25seSBkZWJ1Z2dlci4gICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL25tLWdudS5oIGIvZ2RiL2NvbmZpZy9ubS1nbnUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2VlNGRjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9ubS1nbnUuaApAQCAtMCwwICsxLDQ1IEBACisvKiBDb21tb24gZGVjbGFyYXRpb25zIGZvciB0aGUgR05VIEh1cmQKKworICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBXcml0dGVuIGJ5IE1pbGVzIEJhZGVyIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KKworICAgVGhlIEdOVSBIdXJkIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBIdXJkIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gKi8KKworI2lmbmRlZiBfX05NX0dOVV9IX18KKyNkZWZpbmUgX19OTV9HTlVfSF9fCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxtYWNoLmg+CisjaW5jbHVkZSA8bWFjaC9leGNlcHRpb24uaD4KKworI3VuZGVmIHRhcmdldF9waWRfdG9fc3RyCisjZGVmaW5lIHRhcmdldF9waWRfdG9fc3RyKHBpZCkgZ251X3RhcmdldF9waWRfdG9fc3RyKHBpZCkKK2V4dGVybiBjaGFyICpnbnVfdGFyZ2V0X3BpZF90b19zdHIgKGludCBwaWQpOworCisvKiBCZWZvcmUgc3RvcmluZywgd2UgbmVlZCB0byByZWFkIGFsbCB0aGUgcmVnaXN0ZXJzLiAgKi8KKyNkZWZpbmUgQ0hJTERfUFJFUEFSRV9UT19TVE9SRSgpIHJlYWRfcmVnaXN0ZXJfYnl0ZXMgKDAsIE5VTEwsIFJFR0lTVEVSX0JZVEVTKQorCisvKiBEb24ndCBkbyB3YWl0X2Zvcl9pbmZlcmlvciBvbiBhdHRhY2guICAqLworI2RlZmluZSBBVFRBQ0hfTk9fV0FJVAorCisvKiBVc2UgU1ZSNCBzdHlsZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0ICovCisjZGVmaW5lIFNWUjRfU0hBUkVEX0xJQlMKKyNpbmNsdWRlICJzb2xpYi5oIgorI2RlZmluZSBOT19DT1JFX09QUworCisjZGVmaW5lIE1BSU5URU5BTkNFX0NNRFMgMQorCisjZW5kaWYgLyogX19OTV9HTlVfSF9fICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL25tLWx5bnguaCBiL2dkYi9jb25maWcvbm0tbHlueC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYWYwZmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL25tLWx5bnguaApAQCAtMCwwICsxLDgzIEBACisvKiBOYXRpdmUtZGVwZW5kZW50IGRlZmluaXRpb25zIGZvciBMeW54T1MuCisgICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIE5NX0xZTlhfSAorI2RlZmluZSBOTV9MWU5YX0gKKworI2luY2x1ZGUgPHN5cy9jb25mLmg+CisjaW5jbHVkZSA8c3lzL2tlcm5lbC5oPgorLyogc3lzL2tlcm5lbC5oIHNob3VsZCBkZWZpbmUgdGhpcywgYnV0IGRvZXNuJ3QgYWx3YXlzLCBzaWdoLiAqLworI2lmbmRlZiBfX0xZTlhPUworI2RlZmluZSBfX0xZTlhPUworI2VuZGlmCisjaW5jbHVkZSA8c3lzL21lbS5oPgorI2luY2x1ZGUgPHN5cy9zaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy9pdGltZXIuaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPHN5cy9wcm9jLmg+CisjaW5jbHVkZSAiZ2RidGhyZWFkLmgiCisKKy8qIFRoaXMgaXMgdGhlIGFtb3VudCB0byBzdWJ0cmFjdCBmcm9tIHUudV9hcjAgdG8gZ2V0IHRoZSBvZmZzZXQgaW4KKyAgIHRoZSBjb3JlIGZpbGUgb2YgdGhlIHJlZ2lzdGVyIHZhbHVlcy4gICovCisKKyNkZWZpbmUgS0VSTkVMX1VfQUREUiBVU1JTVEFDSworCisjdW5kZWYgRkxPQVRfSU5GTwkvKiBObyBmbG9hdCBpbmZvIHlldCAqLworCisvKiBBcyBvZiBMeW54T1MgMi4yLjIgKGJldGEgOC8xNS85NCksIHRoaXMgaXMgaW50LiAgUHJldmlvdXMgdmVyc2lvbnMgc2VlbSB0bworICAgaGF2ZSBoYWQgbm8gcHJvdG90eXBlLCBzbyBJJ20gbm90IHN1cmUgd2h5IEdEQiB1c2VkIHRvIGRlZmluZSB0aGlzIHRvCisgICBjaGFyICouICAqLworI2RlZmluZSBQVFJBQ0VfQVJHM19UWVBFIGludAorCisvKiBPdmVycmlkZSBjb3BpZXMgb2Yge2ZldGNoLHN0b3JlfV9pbmZlcmlvcl9yZWdpc3RlcnMgaW4gaW5mcHRyYWNlLmMuICAqLworCisjZGVmaW5lIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUworCisvKiBUaHJlYWQgSUQgb2Ygc3RvcHBlZCB0aHJlYWQuICAqLworCisjZGVmaW5lIFdJRlRJRCh4KSAoKCh1bmlvbiB3YWl0ICopJngpLT53X3RpZCkKKworLyogT3ZlcnJpZGUgY2hpbGRfd2FpdCBpbiBpbmZ0YXJnLmMgKi8KKworI2RlZmluZSBDSElMRF9XQUlUCisKKy8qIE92ZXJyaWRlIGNoaWxkX3Jlc3VtZSBpbiBpbmZwdHJhY2UuYyAqLworCisjZGVmaW5lIENISUxEX1JFU1VNRQorCisvKiBPdmVycmlkZSBjaGlsZF90aHJlYWRfYWxpdmUgaW4gaW50YXJnLmMgKi8KKworI2RlZmluZSBDSElMRF9USFJFQURfQUxJVkUKKworI2luY2x1ZGUgInRhcmdldC5oIgorCitleHRlcm4gaW50IGNoaWxkX3dhaXQgUEFSQU1TICgoaW50IHBpZCwgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpzdGF0dXMpKTsKKworLyogTHlueCBuZWVkcyBhIHNwZWNpYWwgZGVmaW5pdGlvbiBvZiB0aGlzIHNvIHRoYXQgd2UgY2FuCisgICBwcmludCBvdXQgdGhlIHBpZCBhbmQgdGhyZWFkIG51bWJlciBzZXBlcmF0bHkuICAqLworCisjdW5kZWYgdGFyZ2V0X3BpZF90b19zdHIKKworI2RlZmluZSB0YXJnZXRfcGlkX3RvX3N0cihQSUQpIGx5bnhfcGlkX3RvX3N0ciAoUElEKQorCitleHRlcm4gY2hhciAqbHlueF9waWRfdG9fc3RyIFBBUkFNUyAoKGludCBwaWQpKTsKKworI2VuZGlmIC8qIE5NX0xZTlhfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9ubS1tMy5oIGIvZ2RiL2NvbmZpZy9ubS1tMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYTUyNTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL25tLW0zLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qIE1hY2ggMy4wIGNvbW1vbiBkZWZpbml0aW9ucyBhbmQgZ2xvYmFsIHZhcnMuCisKKyAgIENvcHlyaWdodCAoQykgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIE5NX00zX0gKKyNkZWZpbmUgTk1fTTNfSAorCisjaW5jbHVkZSA8bWFjaC5oPgorCisvKiBNYWNoMyBkb2Vzbid0IGRlY2xhcmUgZXJybm8gaW4gPGVycm5vLmg+LiAgKi8KK2V4dGVybiBpbnQgZXJybm87CisKKy8qIFRhc2sgcG9ydCBvZiBvdXIgZGVidWdnZWQgaW5mZXJpb3IuICovCisKK2V4dGVybiB0YXNrX3QgaW5mZXJpb3JfdGFzazsKKworLyogVGhyZWFkIHBvcnQgb2YgdGhlIGN1cnJlbnQgdGhyZWFkIGluIHRoZSBpbmZlcmlvci4gKi8KKworZXh0ZXJuIHRocmVhZF90IGN1cnJlbnRfdGhyZWFkOworCisvKiBJZiBub256ZXJvLCB3ZSBtdXN0IHN1c3BlbmQvYWJvcnQgJiYgcmVzdW1lIHRocmVhZHMKKyAqIHdoZW4gc2V0dGluZyBvciBnZXR0aW5nIHRoZSBzdGF0ZS4KKyAqLworZXh0ZXJuIGludCBtdXN0X3N1c3BlbmRfdGhyZWFkOworCisjZGVmaW5lIFBSRVBBUkVfVE9fUFJPQ0VFRChzZWxlY3RfaXQpIG1hY2gzX3ByZXBhcmVfdG9fcHJvY2VlZChzZWxlY3RfaXQpCisKKy8qIFRyeSB0byBnZXQgdGhlIHByaXZpbGVnZWQgaG9zdCBwb3J0IGZvciBhdXRoZW50aWNhdGlvbiB0byBtYWNoaWQKKyAqCisgKiBJZiB5b3UgY2FuIGdldCB0aGlzLCB5b3UgbWF5IGRlYnVnIGFueXRoaW5nIG9uIHRoaXMgaG9zdC4KKyAqCisgKiBJZiB5b3UgY2FuJ3QsIGdkYiBnaXZlcyBpdCdzIG93biB0YXNrIHBvcnQgYXMgdGhlCisgKiBhdXRoZW50aWNhdGlvbiBwb3J0CisgKi8KKyNkZWZpbmUgIG1hY2hfcHJpdmlsZWdlZF9ob3N0X3BvcnQoKSB0YXNrX2J5X3BpZCgtMSkKKworLyoKKyAqIFRoaXMgaXMgdGhlIE1JRyBJRCBudW1iZXIgb2YgdGhlIGVtdWxhdG9yL3NlcnZlciBic2RfZXhlY3ZlKCkgUlBDIGNhbGwuCisgKgorICogSXQgU0hPVUxEIG5ldmVyIGNoYW5nZSwgYnV0IGlmIGl0IGRvZXMsIGdkYiBgcnVuJworICogY29tbWFuZCB3b24ndCB3b3JrIHVudGlsIHlvdSBmaXggdGhpcyBkZWZpbmUuCisgKiAKKyAqLworI2RlZmluZSBNSUdfRVhFQ19TWVNDQUxMX0lECQkxMDEwMDAKKworLyogSWYgb3VyX21lc3NhZ2VfcG9ydCBnZXRzIGEgbXNnIHdpdGggdGhpcyBJRCwKKyAqIEdEQiBzdXNwZW5kcyBpdCdzIGluZmVyaW9yIGFuZCBlbnRlcnMgY29tbWFuZCBsZXZlbC4KKyAqIChVc2VmdWwgYXQgbGVhc3QgaWYgXkMgZG9lcyBub3Qgd29yaykKKyAqLworI2RlZmluZSBHREJfTUVTU0FHRV9JRF9TVE9QCQkJMHg0MTE1MQorCisvKiB3YWl0MyBXTk9IQU5HIGlzIGRlZmluZWQgaW4gPHN5cy93YWl0Lmg+IGJ1dAorICogZm9yIHNvbWUgcmVhc29uIGdkYiBkb2VzIG5vdCB3YW50IHRvIGluY2x1ZGUKKyAqIHRoYXQgZmlsZS4KKyAqCisgKiBJZiB5b3VyIHN5c3RlbSBkZWZpbmVzIFdOT0hBTkcgZGlmZmVyZW50bHksIHRoaXMgaGFzIHRvIGJlIGNoYW5nZWQuCisgKi8KKyNkZWZpbmUgV05PSEFORyAxCisKKy8qIEJlZm9yZSBzdG9yaW5nLCB3ZSBuZWVkIHRvIHJlYWQgYWxsIHRoZSByZWdpc3RlcnMuICAqLworCisjZGVmaW5lIENISUxEX1BSRVBBUkVfVE9fU1RPUkUoKSByZWFkX3JlZ2lzdGVyX2J5dGVzICgwLCBOVUxMLCBSRUdJU1RFUl9CWVRFUykKKworLyogQ2hlY2sgaWYgdGhlIGluZmVyaW9yIGV4aXN0cyAqLworI2RlZmluZSBNQUNIX0VSUk9SX05PX0lORkVSSU9SIFwKKyAgZG8gaWYgKCFNQUNIX1BPUlRfVkFMSUQgKGluZmVyaW9yX3Rhc2spKSBcCisgIAllcnJvciAoIkluZmVyaW9yIHRhc2sgZG9lcyBub3QgZXhpc3QuIik7IHdoaWxlKDApCisKKy8qIEVycm9yIGhhbmRsZXIgZm9yIG1hY2ggY2FsbHMgKi8KKyNkZWZpbmUgQ0hLKHN0cixyZXQpCVwKKyAgZG8gaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpIFwKKyAgICAgICBlcnJvciAoIkdkYiAlcyBbJWRdICVzIDogJXNcbiIsX19GSUxFX18sX19MSU5FX18sc3RyLCBcCisJICAgICAgbWFjaF9lcnJvcl9zdHJpbmcocmV0KSk7IHdoaWxlKDApCisKKy8qIFRoaXMgaXMgZnJvbSBQT0U5IGVtdWxhdG9yL2VtdWxfc3RhY2suaAorICovCisvKgorICogVG9wIG9mIGVtdWxhdG9yIHN0YWNrIGhvbGRzIGxpbmsgYW5kIHJlcGx5IHBvcnQuCisgKi8KK3N0cnVjdCBlbXVsX3N0YWNrX3RvcCB7CisJc3RydWN0IGVtdWxfc3RhY2tfdG9wCSpsaW5rOworCW1hY2hfcG9ydF90CQlyZXBseV9wb3J0OworfTsKKworI2RlZmluZSBFTVVMQVRPUl9TVEFDS19TSVpFICg0MDk2KjQpCisKKyNkZWZpbmUgVEhSRUFEX0FMTE9XRURfVE9fQlJFQUsobWlkKSBtYWNoX3RocmVhZF9mb3JfYnJlYWtwb2ludCAobWlkKQorCisjZGVmaW5lIFRIUkVBRF9QQVJTRV9JRChhcmcpIG1hY2hfdGhyZWFkX3BhcnNlX2lkIChhcmcpCisKKyNkZWZpbmUgVEhSRUFEX09VVFBVVF9JRChtaWQpIG1hY2hfdGhyZWFkX291dHB1dF9pZCAobWlkKQorCisjZGVmaW5lIEFUVEFDSF9UT19USFJFQUQgYXR0YWNoX3RvX3RocmVhZAorCisvKiBEb24ndCBkbyB3YWl0X2Zvcl9pbmZlcmlvciBvbiBhdHRhY2guICAqLworI2RlZmluZSBBVFRBQ0hfTk9fV0FJVAorCisvKiBEbyBNYWNoIDMgZGVwZW5kZW50IG9wZXJhdGlvbnMgd2hlbiBeQyBvciBhIFNUT1AgaXMgcmVxdWVzdGVkICovCisjZGVmaW5lIERPX1FVSVQoKSBtYWNoM19xdWl0ICgpCisKKyNpZiAwCisvKiBUaGlzIGlzIGJvZ3VzLiAgSXQgaXMgTk9UIE9LIHRvIHF1aXQgb3V0IG9mIHRhcmdldF93YWl0LiAgKi8KKy8qIElmIGluIG1hY2hfbXNnKCkgYW5kIF5DIGlzIHR5cGVkIHNldCBpbW1lZGlhdGVfcXVpdCAqLworI2RlZmluZSBSRVFVRVNUX1FVSVQoKSBtYWNoM19yZXF1ZXN0X3F1aXQgKCkKKyNlbmRpZgorCisjZW5kaWYgLyogTk1fTTNfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9ubS1uYnNkLmggYi9nZGIvY29uZmlnL25tLW5ic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzFkNmE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9ubS1uYnNkLmgKQEAgLTAsMCArMSw4NiBAQAorLyogTmF0aXZlLWRlcGVuZGVudCBkZWZpbml0aW9ucyBmb3IgTmV0QlNELgorICAgQ29weXJpZ2h0IDE5OTQsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBpcyB0aGUgYW1vdW50IHRvIHN1YnRyYWN0IGZyb20gdS51X2FyMAorICAgdG8gZ2V0IHRoZSBvZmZzZXQgaW4gdGhlIGNvcmUgZmlsZSBvZiB0aGUgcmVnaXN0ZXIgdmFsdWVzLiAgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgorCisjZGVmaW5lIEtFUk5FTF9VX0FERFIgVVNSU1RBQ0sKKworI2RlZmluZSBQVFJBQ0VfQVJHM19UWVBFIGNoYXIqCisKKyNkZWZpbmUgRkVUQ0hfSU5GRVJJT1JfUkVHSVNURVJTCisKKyNkZWZpbmUgQVRUQUNIX0RFVEFDSAorCisjaW5jbHVkZSAic29saWIuaCIgICAgICAvKiBTdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzLiAqLworCisvKiBtYWtlIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBtYXRjaCB1cCB3aXRoIHRob3NlIGV4cGVjdGVkIGluIHNvbGliLmMgKi8KKyNkZWZpbmUgbGlua19vYmplY3QJc29kCisjZGVmaW5lIGxvX25hbWUJCXNvZF9uYW1lCisjZGVmaW5lIGxvX2xpYnJhcnkJc29kX2xpYnJhcnkKKyNkZWZpbmUgbG9fdW51c2VkCXNvZF9yZXNlcnZlZAorI2RlZmluZSBsb19tYWpvcglzb2RfbWFqb3IKKyNkZWZpbmUgbG9fbWlub3IJc29kX21pbm9yCisjZGVmaW5lIGxvX25leHQJCXNvZF9uZXh0CisKKyNkZWZpbmUgbGlua19tYXAJc29fbWFwCisjZGVmaW5lIGxtX2FkZHIJCXNvbV9hZGRyCisjZGVmaW5lIGxtX25hbWUJCXNvbV9wYXRoCisjZGVmaW5lIGxtX25leHQJCXNvbV9uZXh0CisjZGVmaW5lIGxtX2xvcAkJc29tX3NvZAorI2RlZmluZSBsbV9sb2IJCXNvbV9zb2RiYXNlCisjZGVmaW5lIGxtX3J3dAkJc29tX3dyaXRlCisjZGVmaW5lIGxtX2xkCQlzb21fZHluYW1pYworI2RlZmluZSBsbV9scGQJCXNvbV9zcGQKKworI2RlZmluZSBsaW5rX2R5bmFtaWNfMglzZWN0aW9uX2Rpc3BhdGNoX3RhYmxlCisjZGVmaW5lIGxkX2xvYWRlZAlzZHRfbG9hZGVkCisjZGVmaW5lIGxkX25lZWQJCXNkdF9zb2RzCisjZGVmaW5lIGxkX3J1bGVzCXNkdF9maWxsZXIxCisjZGVmaW5lIGxkX2dvdAkJc2R0X2dvdAorI2RlZmluZSBsZF9wbHQJCXNkdF9wbHQKKyNkZWZpbmUgbGRfcmVsCQlzZHRfcmVsCisjZGVmaW5lIGxkX2hhc2gJCXNkdF9oYXNoCisjZGVmaW5lIGxkX3N0YWIJCXNkdF9uemxpc3QKKyNkZWZpbmUgbGRfc3RhYl9oYXNoCXNkdF9maWxsZXIyCisjZGVmaW5lIGxkX2J1Y2tldHMJc2R0X2J1Y2tldHMKKyNkZWZpbmUgbGRfc3ltYm9scwlzZHRfc3RyaW5ncworI2RlZmluZSBsZF9zeW1iX3NpemUJc2R0X3N0cl9zegorI2RlZmluZSBsZF90ZXh0CQlzZHRfdGV4dF9zegorI2RlZmluZSBsZF9wbHRfc3oJc2R0X3BsdF9zegorCisjZGVmaW5lIHJ0Y19zeW1iCXJ0X3N5bWJvbAorI2RlZmluZSBydGNfc3AJCXJ0X3NwCisjZGVmaW5lIHJ0Y19uZXh0CXJ0X25leHQKKworI2RlZmluZSBsZF9kZWJ1Zwlzb19kZWJ1ZworI2RlZmluZSBsZGRfdmVyc2lvbglkZF92ZXJzaW9uCisjZGVmaW5lIGxkZF9pbl9kZWJ1Z2dlcglkZF9pbl9kZWJ1Z2dlcgorI2RlZmluZSBsZGRfc3ltX2xvYWRlZAlkZF9zeW1fbG9hZGVkCisjZGVmaW5lIGxkZF9icF9hZGRyCWRkX2JwdF9hZGRyCisjZGVmaW5lIGxkZF9icF9pbnN0CWRkX2JwdF9zaGFkb3cKKyNkZWZpbmUgbGRkX2NwCQlkZF9jYworCisjZGVmaW5lIGxpbmtfZHluYW1pYwlfZHluYW1pYworI2RlZmluZSBsZF92ZXJzaW9uCWRfdmVyc2lvbgorI2RlZmluZSBsZGQJCWRfZGVidWcKKyNkZWZpbmUgbGRfdW4JCWRfdW4KKyNkZWZpbmUgbGRfMgkJZF9zZHQKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbm0tc3lzdjQuaCBiL2dkYi9jb25maWcvbm0tc3lzdjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODkxZDRkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9ubS1zeXN2NC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIERlZmluaXRpb25zIGZvciBydW5uaW5nIGdkYiBvbiBhIGhvc3QgbWFjaGluZSBydW5uaW5nIGFueSBmbGF2b3Igb2YgU1ZSNC4KKyAgIENvcHlyaWdodCAxOTkxLCAxOTkyLCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggYXQgQ3lnbnVzIFN1cHBvcnQgKGZuZkBjeWdudXMuY29tKS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBVc2UgU1ZSNCBzdHlsZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0ICovCisKKyNkZWZpbmUgU1ZSNF9TSEFSRURfTElCUworI2luY2x1ZGUgInNvbGliLmgiCisKKy8qIFNWUjQgaGFzIC9wcm9jIHN1cHBvcnQsIHNvIHVzZSBpdCBpbnN0ZWFkIG9mIHB0cmFjZS4gKi8KKworI2RlZmluZSBVU0VfUFJPQ19GUworCisvKiBTVlI0IG1hY2hpbmVzIGNhbiBlYXNpbHkgZG8gYXR0YWNoIGFuZCBkZXRhY2ggdmlhIC9wcm9jIChwcm9jZnMuYykKKyAgIHN1cHBvcnQgKi8KKworI2RlZmluZSBBVFRBQ0hfREVUQUNICmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL25vbmUvbm0tbm9uZS5oIGIvZ2RiL2NvbmZpZy9ub25lL25tLW5vbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDYzMGYzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9ub25lL25tLW5vbmUuaApAQCAtMCwwICsxLDE4IEBACisvKiBEZWZpbmVzIG5lZWRlZCB3aGVuIGNvbmZpZ3VyaW5nIGZvciAibm9uZSIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbm9uZS9ub25lLm1oIGIvZ2RiL2NvbmZpZy9ub25lL25vbmUubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkNWU0YQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbm9uZS9ub25lLm1oCkBAIC0wLDAgKzEsNSBAQAorIyBIb3N0OiAibm8gdGFyZ2V0Ii4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gYnVpbGQgeW91CisjIGEgTWFrZWZpbGUgdGhhdCBvbmx5IHJ1bnMgYWRtaW5pc3RyYXRpdmUgY29tbWFuZHMgbGlrZSAnY2xlYW4nLAorIyAnZ2RiLnRhci5aJywgZXRjLgorTkFUX0ZJTEU9IG5tLW5vbmUuaAorWE1fRklMRT0geG0tbm9uZS5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL25vbmUvbm9uZS5tdCBiL2dkYi9jb25maWcvbm9uZS9ub25lLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMGUyZGMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL25vbmUvbm9uZS5tdApAQCAtMCwwICsxLDQgQEAKKyMgVGFyZ2V0OiAibm8gdGFyZ2V0Ii4KKyMgVGhpcyBjYW4gYmUgdXNlZCB0byBidWlsZCB5b3UgYSBNYWtlZmlsZSB0aGF0IG9ubHkgcnVucyBhZG1pbmlzdHJhdGl2ZQorIyBjb21tYW5kcyBsaWtlICdjbGVhbicsICdnZGIudGFyLlonLCBldGMuCitUTV9GSUxFPSB0bS1ub25lLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbm9uZS90bS1ub25lLmggYi9nZGIvY29uZmlnL25vbmUvdG0tbm9uZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTZiM2IKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL25vbmUvdG0tbm9uZS5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qIERlZmluZXMgbmVlZGVkIHdoZW4gY29uZmlndXJpbmcgZm9yICJub25lIi4KKyAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGRlZmluZSBpcyBuZWVkZWQgc28gdGhhdCAiZ2NjIC1NTSIgZG9lc24ndCBnZXQgZXJyb3JzIGFuZCBmYWlsIG9uCisgICBzb3VyY2UgZmlsZXMgdGhhdCB1c2UgdGhlIHZhbHVlIG9mIElOTkVSX1RIQU4gaW4gcHJlcHJvY2Vzc29yIGxpbmVzLiAqLworCisjZGVmaW5lIElOTkVSX1RIQU4obGhzLHJocykgKChsaHMpIDwgKHJocykpCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL25vbmUveG0tbm9uZS5oIGIvZ2RiL2NvbmZpZy9ub25lL3htLW5vbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDYzMGYzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9ub25lL3htLW5vbmUuaApAQCAtMCwwICsxLDE4IEBACisvKiBEZWZpbmVzIG5lZWRlZCB3aGVuIGNvbmZpZ3VyaW5nIGZvciAibm9uZSIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbnMzMmsvbWVybGluLm1oIGIvZ2RiL2NvbmZpZy9uczMyay9tZXJsaW4ubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljM2U3YgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbnMzMmsvbWVybGluLm1oCkBAIC0wLDAgKzEsMTYgQEAKKyMgSG9zdDogTWVybGluIHJ1bm5pbmcgdXRlayAyLjEKK1hERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBjb3JlbG93Lm8gY29yZS1hb3V0Lm8KK1hNX0ZJTEU9IHhtLW1lcmxpbi5oCisKKyMgRklYTUU6IE1fSU5TVEFMTCBpcyBnb25lIGZyb20gdGhlIGdkYiBtYWtlZmlsZS4gIElmIGFueW9uZSBjYXJlcworIyBhYm91dCB0aGUgTWVybGluIGFueW1vcmUsIGFuZCB0aGUgYnVnIHdoaWNoIGluc3BpcmVkCisjIFNIRUxMX0ZJTEUvZ2RiLXNoIGlzIHN0aWxsIHRoZXJlLCB3aWxsIG5lZWQgdG8gcmVpbnN0YXRlIGl0LiAgQWxzbywKKyMgdGhpcyBzaG91bGQgYmUgZG9uZSBmb3IgbmF0aXZlIG9ubHkuCisKKyMgU2VlIFNIRUxMX0ZJTEUgaW4geG0tbWVybGluLmggZm9yIGEgZXhwbGFuYXRpb24gb2YgdGhpcy4KKworIyBGSVhNRTogVGhpcyBzaG91bGQgdXNlICRwcmVmaXgsIGJ1dCBvbmx5IGlmIFNIRUxMX0ZJTEUgZG9lcyB0b28uCisKK01fSU5TVEFMTD1jcCAvYmluL3NoIC91c3IvbG9jYWwvbGliL2dkYi1zaDsgXAorY2htb2Qgb2d1K3J3IC91c3IvbG9jYWwvbGliL2dkYi1zaAorTV9VTklOU1RBTEwgPSBybSAtZiAvdXNyL2xvY2FsL2xpYi9nZGItc2gKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbnMzMmsvbWVybGluLm10IGIvZ2RiL2NvbmZpZy9uczMyay9tZXJsaW4ubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0NjA3NwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvbnMzMmsvbWVybGluLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IE1lcmxpbiBydW5uaW5nIHV0ZWsgMi4xCitUREVQRklMRVM9IG5zMzJrLXRkZXAubworVE1fRklMRT0gdG0tbWVybGluLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbnMzMmsvbmJzZC5taCBiL2dkYi9jb25maWcvbnMzMmsvbmJzZC5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWUwMjViCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9uczMyay9uYnNkLm1oCkBAIC0wLDAgKzEsNSBAQAorIyBIb3N0OiBQQzUzMiBydW5uaW5nIE5ldEJTRAorWERFUEZJTEVTPSBzZXItdGNwLm8KK1hNX0ZJTEU9IHhtLW5ic2QuaAorTkFUX0ZJTEU9IG5tLW5ic2QuaAorTkFUREVQRklMRVM9IGZvcmstY2hpbGQubyBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gY29yZWxvdy5vIG5zMzJrbmJzZC1uYXQubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9uczMyay9uYnNkLm10IGIvZ2RiL2NvbmZpZy9uczMyay9uYnNkLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMjEzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL25zMzJrL25ic2QubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogUEM1MzIgcnVubmluZyBOZXRCU0QKK1RERVBGSUxFUz0gbnMzMmstdGRlcC5vIHNvbGliLm8KK1RNX0ZJTEU9IHRtLW5ic2QuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9uczMyay9ubS1uYnNkLmggYi9nZGIvY29uZmlnL25zMzJrL25tLW5ic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWY1MzZlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9uczMyay9ubS1uYnNkLmgKQEAgLTAsMCArMSwzNiBAQAorLyogTmF0aXZlLWRlcGVuZGVudCBkZWZpbml0aW9ucyBmb3IgbnMzMmsgcnVubmluZyBOZXRCU0QsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MiwgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIE5NX05CU0RfSAorI2RlZmluZSBOTV9OQlNEX0gKKworLyogR2V0IGdlbmVyaWMgTmV0QlNEIG5hdGl2ZSBkZWZpbml0aW9ucy4gKi8KKyNpbmNsdWRlICJubS1uYnNkLmgiCisKKyNpZiAwCisjZGVmaW5lIEZMT0FUX0lORk8JeyBleHRlcm4gbnMzMmtfZmxvYXRfaW5mbygpOyBuczMya19mbG9hdF9pbmZvKCk7IH0KKyNlbmRpZgorCisjZGVmaW5lIFJFR0lTVEVSX1VfQUREUihhZGRyLCBibG9ja2VuZCwgcmVnbm8pIFwKKwkoYWRkcikgPSBuczMya19yZWdpc3Rlcl91X2FkZHIgKChibG9ja2VuZCksKHJlZ25vKSk7CisKK2V4dGVybiBpbnQKK25zMzJrX3JlZ2lzdGVyX3VfYWRkciBQQVJBTVMgKChpbnQsIGludCkpOworCisjZW5kaWYgLyogTk1fTkJTRF9IICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL25zMzJrL25tLXVtYXguaCBiL2dkYi9jb25maWcvbnMzMmsvbm0tdW1heC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZDZlNzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL25zMzJrL25tLXVtYXguaApAQCAtMCwwICsxLDU0IEBACisvKiBEZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gYW4gZW5jb3JlIHVuZGVyIHVtYXggNC4yCisgICBDb3B5cmlnaHQgMTk4NywgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBEbyBpbXBsZW1lbnQgdGhlIGF0dGFjaCBhbmQgZGV0YWNoIGNvbW1hbmRzLi4uICAqLworI2RlZmluZSBBVFRBQ0hfREVUQUNICisKKy8qIE9mZnNldCBvZiByZWdpc3RlcnMgd2l0aGluIHUgYXJlYS4gICovCisjZGVmaW5lIFVfUkVHU19PRkZTRVQgMAorCisvKiBjYWxsZWQgZnJvbSByZWdpc3Rlcl9hZGRyKCkgLS0gYmxvY2tlbmQgbm90IHVzZWQgZm9yIG5vdyAqLworI2RlZmluZSBSRUdJU1RFUl9VX0FERFIoYWRkciwgYmxvY2tlbmQsIHJlZ25vKSBcCit7IAkJCQkJCQkJCVwKKyAgc3dpdGNoIChyZWdubykgewkJCQkJCQlcCisgIGNhc2UgMDogY2FzZSAxOiBjYXNlIDI6IGNhc2UgMzogY2FzZSA0OiBjYXNlIDU6IGNhc2UgNjogY2FzZSA3OglcCisJYWRkciA9IFBVX1IwIC0gKHJlZ25vICogc2l6ZW9mIChpbnQpKTsgYnJlYWs7CQkJXAorICBjYXNlIFNQX1JFR05VTToJCQkJCQkJXAorICAJYWRkciA9IFBVX1NQOyBicmVhazsJCQkJCQlcCisgIGNhc2UgUENfUkVHTlVNOgkJCQkJCQlcCisgIAlhZGRyID0gUFVfUEM7IGJyZWFrOwkJCQkJCVwKKyAgY2FzZSBGUF9SRUdOVU06CQkJCQkJCVwKKyAgCWFkZHIgPSBQVV9GUDsgYnJlYWs7CQkJCQkJXAorICBjYXNlIFBTX1JFR05VTToJCQkJCQkJXAorICAJYWRkciA9IFBVX1BTTDsgYnJlYWs7CQkJCQkJXAorICBjYXNlIEZQU19SRUdOVU06CQkJCQkJCVwKKyAgCWFkZHIgPSBQVV9GU1I7IGJyZWFrOwkJCQkJCVwKKyAgY2FzZSBGUDBfUkVHTlVNICsgMDogY2FzZSBGUDBfUkVHTlVNICsgMToJCQkJXAorICBjYXNlIEZQMF9SRUdOVU0gKyAyOiBjYXNlIEZQMF9SRUdOVU0gKyAzOiAJCQkJXAorICBjYXNlIEZQMF9SRUdOVU0gKyA0OiBjYXNlIEZQMF9SRUdOVU0gKyA1OiAJCQkJXAorICBjYXNlIEZQMF9SRUdOVU0gKyA2OiBjYXNlIEZQMF9SRUdOVU0gKyA3OiAJCQkJXAorICAJYWRkciA9IFBVX0YwICsgKHJlZ25vIC0gRlAwX1JFR05VTSkgKiBzaXplb2YgKGZsb2F0KTsgYnJlYWs7CVwKKyAgY2FzZSBMUDBfUkVHTlVNICsgMDogY2FzZSBMUDBfUkVHTlVNICsgMToJCQkJXAorICBjYXNlIExQMF9SRUdOVU0gKyAyOiBjYXNlIExQMF9SRUdOVU0gKyAzOgkJCQlcCisgIAlhZGRyID0gUFVfRjAgKyAocmVnbm8gLSBMUDBfUkVHTlVNKSAqIHNpemVvZiAoZG91YmxlKTsgYnJlYWs7CVwKKyAgZGVmYXVsdDoJCQkJCQkJCVwKKyAgCXByaW50ZiAoImJhZCBhcmd1bWVudCB0byBSRUdJU1RFUl9VX0FERFIgJWRcbiIsIHJlZ25vKTsJCVwKKwlhYm9ydCAoKTsJCQkJCQkJXAorICB9CQkJCQkJCQkJXAorfQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9uczMyay9uczMya20zLm1oIGIvZ2RiL2NvbmZpZy9uczMyay9uczMya20zLm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMDk5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL25zMzJrL25zMzJrbTMubWgKQEAgLTAsMCArMSw3IEBACisjIEhvc3Q6IG5zMzJrIHJ1bm5pbmcgTWFjaDMKKworWERFUEZJTEVTPQorTkFUREVQRklMRVM9IG0zLW5hdC5vIG5zMzJrbTMtbmF0Lm8gZm9yay1jaGlsZC5vIGNvcmVsb3cubyBjb3JlLWFvdXQubworTkFUX0NMSUJTPSAtTC91c3IvbWFjaC9saWIgLWxuZXRuYW1lIC1sbWFjaGlkIC1sbWFjaAorWE1fRklMRT0geG0tbnMzMmttMy5oCitOQVRfRklMRT0gbm0tbTMuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9uczMyay9uczMya20zLm10IGIvZ2RiL2NvbmZpZy9uczMyay9uczMya20zLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOTExNzYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL25zMzJrL25zMzJrbTMubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogbnMzMmsgd2l0aCBhLm91dCBvbiBNYWNoIDMKK1RERVBGSUxFUz0gbnMzMmstdGRlcC5vIAorVE1fRklMRT0gdG0tbnMzMmttMy5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL25zMzJrL3RtLW1lcmxpbi5oIGIvZ2RiL2NvbmZpZy9uczMyay90bS1tZXJsaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTBjNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9uczMyay90bS1tZXJsaW4uaApAQCAtMCwwICsxLDMxMyBAQAorLyogRGVmaW5pdGlvbnMgdG8gdGFyZ2V0IEdEQiB0byBhIG1lcmxpbiB1bmRlciB1dGVrIDIuMQorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisKKy8qIE9mZnNldCBmcm9tIGFkZHJlc3Mgb2YgZnVuY3Rpb24gdG8gc3RhcnQgb2YgaXRzIGNvZGUuCisgICBaZXJvIG9uIG1vc3QgbWFjaGluZXMuICAqLworCisjZGVmaW5lIEZVTkNUSU9OX1NUQVJUX09GRlNFVCAwCisKKy8qIEFkdmFuY2UgUEMgYWNyb3NzIGFueSBmdW5jdGlvbiBlbnRyeSBwcm9sb2d1ZSBpbnN0cnVjdGlvbnMKKyAgIHRvIHJlYWNoIHNvbWUgInJlYWwiIGNvZGUuICAqLworCisjZGVmaW5lIFNLSVBfUFJPTE9HVUUocGMpICAgCQkJCVwKK3sgcmVnaXN0ZXIgaW50IG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDEpOwlcCisgIGlmIChvcCA9PSAweDgyKQkJCQkJXAorICAgIHsgb3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYysyLDEpOwkJXAorICAgICAgaWYgKChvcCAmIDB4ODApID09IDApIHBjICs9IDM7CQkJXAorICAgICAgZWxzZSBpZiAoKG9wICYgMHhjMCkgPT0gMHg4MCkgcGMgKz0gNDsJCVwKKyAgICAgIGVsc2UgcGMgKz0gNjsJCQkJCVwKKyAgICB9fQorCisvKiBJbW1lZGlhdGVseSBhZnRlciBhIGZ1bmN0aW9uIGNhbGwsIHJldHVybiB0aGUgc2F2ZWQgcGMuCisgICBDYW4ndCBhbHdheXMgZ28gdGhyb3VnaCB0aGUgZnJhbWVzIGZvciB0aGlzIGJlY2F1c2Ugb24gc29tZSBtYWNoaW5lcworICAgdGhlIG5ldyBmcmFtZSBpcyBub3Qgc2V0IHVwIHVudGlsIHRoZSBuZXcgZnVuY3Rpb24gZXhlY3V0ZXMKKyAgIHNvbWUgaW5zdHJ1Y3Rpb25zLiAgKi8KKworI2RlZmluZSBTQVZFRF9QQ19BRlRFUl9DQUxMKGZyYW1lKSBcCisJcmVhZF9tZW1vcnlfaW50ZWdlciAocmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKSwgNCkKKworLyogQWRkcmVzcyBvZiBlbmQgb2Ygc3RhY2sgc3BhY2UuICAqLworCisjZGVmaW5lIFNUQUNLX0VORF9BRERSICgweDgwMDAwMCkKKworLyogU3RhY2sgZ3Jvd3MgZG93bndhcmQuICAqLworCisjZGVmaW5lIElOTkVSX1RIQU4obGhzLHJocykgKChsaHMpIDwgKHJocykpCisKKy8qIFNlcXVlbmNlIG9mIGJ5dGVzIGZvciBicmVha3BvaW50IGluc3RydWN0aW9uLiAgKi8KKworI2RlZmluZSBCUkVBS1BPSU5UIHsweGYyfQorCisvKiBBbW91bnQgUEMgbXVzdCBiZSBkZWNyZW1lbnRlZCBieSBhZnRlciBhIGJyZWFrcG9pbnQuCisgICBUaGlzIGlzIG9mdGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gQlJFQUtQT0lOVAorICAgYnV0IG5vdCBhbHdheXMuICAqLworCisjZGVmaW5lIERFQ1JfUENfQUZURVJfQlJFQUsgMAorCisvKiBEZWZpbmUgdGhpcyB0byBzYXkgdGhhdCB0aGUgInN2YyIgaW5zbiBpcyBmb2xsb3dlZCBieQorICAgY29kZXMgaW4gbWVtb3J5IHNheWluZyB3aGljaCBraW5kIG9mIHN5c3RlbSBjYWxsIGl0IGlzLiAgKi8KKworI2RlZmluZSBOUzMyS19TVkNfSU1NRURfT1BFUkFORFMKKworLyogU2F5IGhvdyBsb25nIChvcmRpbmFyeSkgcmVnaXN0ZXJzIGFyZS4gIFRoaXMgaXMgYSBwaWVjZSBvZiBib2dvc2l0eQorICAgdXNlZCBpbiBwdXNoX3dvcmQgYW5kIGEgZmV3IG90aGVyIHBsYWNlczsgUkVHSVNURVJfUkFXX1NJWkUgaXMgdGhlCisgICByZWFsIHdheSB0byBrbm93IGhvdyBiaWcgYSByZWdpc3RlciBpcy4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfU0laRSA0CisKKy8qIE51bWJlciBvZiBtYWNoaW5lIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIE5VTV9SRUdTCQkyNQorCisjZGVmaW5lIE5VTV9HRU5FUkFMX1JFR1MJOAorCisvKiBJbml0aWFsaXplciBmb3IgYW4gYXJyYXkgb2YgbmFtZXMgb2YgcmVnaXN0ZXJzLgorICAgVGhlcmUgc2hvdWxkIGJlIE5VTV9SRUdTIHN0cmluZ3MgaW4gdGhpcyBpbml0aWFsaXplci4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfTkFNRVMgeyJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsCVwKKwkJCSJwYyIsICJzcCIsICJmcCIsICJwcyIsCQkJCVwKKyAJCQkiZnNyIiwJCQkJCQlcCisgCQkJImYwIiwgImYxIiwgImYyIiwgImYzIiwgImY0IiwgImY1IiwgImY2IiwgImY3IiwJXAorCQkJImwwIiwgImwxIiwgImwyIiwgImwzIiwgImw0IiwJCQlcCisgCQkJfQorCisvKiBSZWdpc3RlciBudW1iZXJzIG9mIHZhcmlvdXMgaW1wb3J0YW50IHJlZ2lzdGVycy4KKyAgIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgInJlYWwiIHJlZ2lzdGVyIG51bWJlcnMsCisgICBhbmQgY29ycmVzcG9uZCB0byB0aGUgZ2VuZXJhbCByZWdpc3RlcnMgb2YgdGhlIG1hY2hpbmUsCisgICBhbmQgc29tZSBhcmUgInBob255IiByZWdpc3RlciBudW1iZXJzIHdoaWNoIGFyZSB0b28gbGFyZ2UKKyAgIHRvIGJlIGFjdHVhbCByZWdpc3RlciBudW1iZXJzIGFzIGZhciBhcyB0aGUgdXNlciBpcyBjb25jZXJuZWQKKyAgIGJ1dCBkbyBzZXJ2ZSB0byBnZXQgdGhlIGRlc2lyZWQgdmFsdWVzIHdoZW4gcGFzc2VkIHRvIHJlYWRfcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIEFQX1JFR05VTSBGUF9SRUdOVU0KKyNkZWZpbmUgRlBfUkVHTlVNIDEwCQkvKiBDb250YWlucyBhZGRyZXNzIG9mIGV4ZWN1dGluZyBzdGFjayBmcmFtZSAqLworI2RlZmluZSBTUF9SRUdOVU0gOQkJLyogQ29udGFpbnMgYWRkcmVzcyBvZiB0b3Agb2Ygc3RhY2sgKi8KKyNkZWZpbmUgUENfUkVHTlVNIDgJCS8qIENvbnRhaW5zIHByb2dyYW0gY291bnRlciAqLworI2RlZmluZSBQU19SRUdOVU0gMTEJCS8qIENvbnRhaW5zIHByb2Nlc3NvciBzdGF0dXMgKi8KKyNkZWZpbmUgRlBTX1JFR05VTSAxMgkJLyogRmxvYXRpbmcgcG9pbnQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIEZQMF9SRUdOVU0gMTMJCS8qIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgTFAwX1JFR05VTSAyMQkJLyogRG91YmxlIHJlZ2lzdGVyIDAgKHNhbWUgYXMgRlAwKSAqLworCisvKiBUb3RhbCBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIHRvIHN0b3JlIG91ciBjb3BpZXMgb2YgdGhlIG1hY2hpbmUncworICAgcmVnaXN0ZXIgc3RhdGUsIHRoZSBhcnJheSBgcmVnaXN0ZXJzJy4gICovCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTICgoTlVNX1JFR1MgLSA0KSAqIHNpemVvZiAoaW50KSArIDQgKiBzaXplb2YgKGRvdWJsZSkpCisKKy8qIEluZGV4IHdpdGhpbiBgcmVnaXN0ZXJzJyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3BhY2UgZm9yCisgICByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9CWVRFKE4pICgoTikgPj0gTFAwX1JFR05VTSA/IFwKKwlMUDBfUkVHTlVNICogNCArICgoTikgLSBMUDBfUkVHTlVNKSAqIDggOiAoTikgKiA0KQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgYWN0dWFsIG1hY2hpbmUgcmVwcmVzZW50YXRpb24KKyAgIGZvciByZWdpc3RlciBOLiAgT24gdGhlIDMyMDAwLCBhbGwgcmVncyBhcmUgNCBieXRlcworICAgZXhjZXB0IGZvciB0aGUgZG91YmxlZCBmbG9hdGluZyByZWdpc3RlcnMuICovCisKKyNkZWZpbmUgUkVHSVNURVJfUkFXX1NJWkUoTikgKChOKSA+PSBMUDBfUkVHTlVNID8gOCA6IDQpCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBwcm9ncmFtJ3MgcmVwcmVzZW50YXRpb24KKyAgIGZvciByZWdpc3RlciBOLiAgT24gdGhlIDMyMDAwLCBhbGwgcmVncyBhcmUgNCBieXRlcworICAgZXhjZXB0IGZvciB0aGUgZG91YmxlZCBmbG9hdGluZyByZWdpc3RlcnMuICovCisKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9TSVpFKE4pICgoTikgPj0gTFAwX1JFR05VTSA/IDggOiA0KQorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1JBV19TSVpFIGNhbiBoYXZlLiAgKi8KKworI2RlZmluZSBNQVhfUkVHSVNURVJfUkFXX1NJWkUgOAorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1ZJUlRVQUxfU0laRSBjYW4gaGF2ZS4gICovCisKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1ZJUlRVQUxfU0laRSA4CisKKy8qIFJldHVybiB0aGUgR0RCIHR5cGUgb2JqZWN0IGZvciB0aGUgInN0YW5kYXJkIiBkYXRhIHR5cGUKKyAgIG9mIGRhdGEgaW4gcmVnaXN0ZXIgTi4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9UWVBFKE4pIFwKKyAgKChOKSA+PSBGUDBfUkVHTlVNID8JCVwKKyAgICAoKE4pID49IExQMF9SRUdOVU0gPwlcCisgICAgIGJ1aWx0aW5fdHlwZV9kb3VibGUJXAorICAgICA6IGJ1aWx0aW5fdHlwZV9mbG9hdCkJXAorICAgOiBidWlsdGluX3R5cGVfaW50KQkKKworLyogU3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIHBsYWNlIGluIHdoaWNoIHRvIGNvcHkgdGhlIHN0cnVjdHVyZSB0aGUKKyAgIHN1YnJvdXRpbmUgd2lsbCByZXR1cm4uICBUaGlzIGlzIGNhbGxlZCBmcm9tIGNhbGxfZnVuY3Rpb24uCisKKyAgIE9uIHRoaXMgbWFjaGluZSB0aGlzIGlzIGEgbm8tb3AsIGFzIGdjYyBkb2Vzbid0IHJ1biBvbiBpdCB5ZXQuCisgICBUaGlzIGNhbGxpbmcgY29udmVudGlvbiBpcyBub3QgdXNlZC4gKi8KKworI2RlZmluZSBTVE9SRV9TVFJVQ1RfUkVUVVJOKEFERFIsIFNQKQorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwgZm9ybWF0LAorICAgaW50byBWQUxCVUYuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKFRZUEUsUkVHQlVGLFZBTEJVRikgXAorICBtZW1jcHkgKFZBTEJVRiwgUkVHQlVGLCBUWVBFX0xFTkdUSCAoVFlQRSkpCisKKy8qIFdyaXRlIGludG8gYXBwcm9wcmlhdGUgcmVnaXN0ZXJzIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlCisgICBvZiB0eXBlIFRZUEUsIGdpdmVuIGluIHZpcnR1YWwgZm9ybWF0LiAgKi8KKworI2RlZmluZSBTVE9SRV9SRVRVUk5fVkFMVUUoVFlQRSxWQUxCVUYpIFwKKyAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKDAsIFZBTEJVRiwgVFlQRV9MRU5HVEggKFRZUEUpKQorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICB0aGUgYWRkcmVzcyBpbiB3aGljaCBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gaXRzIHN0cnVjdHVyZSB2YWx1ZSwKKyAgIGFzIGEgQ09SRV9BRERSIChvciBhbiBleHByZXNzaW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgb25lKS4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyhSRUdCVUYpICgqKGludCAqKShSRUdCVUYpKQorDAorLyogRGVzY3JpYmUgdGhlIHBvaW50ZXIgaW4gZWFjaCBzdGFjayBmcmFtZSB0byB0aGUgcHJldmlvdXMgc3RhY2sgZnJhbWUKKyAgIChpdHMgY2FsbGVyKS4gICovCisKKy8qIEZSQU1FX0NIQUlOIHRha2VzIGEgZnJhbWUncyBub21pbmFsIGFkZHJlc3MKKyAgIGFuZCBwcm9kdWNlcyB0aGUgZnJhbWUncyBjaGFpbi1wb2ludGVyLiAqLworCisvKiBJbiB0aGUgY2FzZSBvZiB0aGUgTWVybGluLCB0aGUgZnJhbWUncyBub21pbmFsIGFkZHJlc3MgaXMgdGhlIEZQIHZhbHVlLAorICAgYW5kIGF0IHRoYXQgYWRkcmVzcyBpcyBzYXZlZCBwcmV2aW91cyBGUCB2YWx1ZSBhcyBhIDQtYnl0ZSB3b3JkLiAgKi8KKworI2RlZmluZSBGUkFNRV9DSEFJTih0aGlzZnJhbWUpICBcCisgICghaW5zaWRlX2VudHJ5X2ZpbGUgKCh0aGlzZnJhbWUpLT5wYykgPyBcCisgICByZWFkX21lbW9yeV9pbnRlZ2VyICgodGhpc2ZyYW1lKS0+ZnJhbWUsIDQpIDpcCisgICAwKQorCisvKiBEZWZpbmUgb3RoZXIgYXNwZWN0cyBvZiB0aGUgc3RhY2sgZnJhbWUuICAqLworCisjZGVmaW5lIEZSQU1FX1NBVkVEX1BDKEZSQU1FKSAocmVhZF9tZW1vcnlfaW50ZWdlciAoKEZSQU1FKS0+ZnJhbWUgKyA0LCA0KSkKKworLyogY29tcHV0ZSBiYXNlIG9mIGFyZ3VtZW50cyAqLworI2RlZmluZSBGUkFNRV9BUkdTX0FERFJFU1MoZmkpICgoZmkpLT5mcmFtZSkKKworI2RlZmluZSBGUkFNRV9MT0NBTFNfQUREUkVTUyhmaSkgKChmaSktPmZyYW1lKQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvIGEgZnJhbWUuCisgICBDYW4gcmV0dXJuIC0xLCBtZWFuaW5nIG5vIHdheSB0byB0ZWxsLiAgKi8KKworI2RlZmluZSBGUkFNRV9OVU1fQVJHUyhudW1hcmdzLCBmaSkJCQlcCit7IENPUkVfQUREUiBwYzsJCQkJCQlcCisgIGludCBpbnNuOwkJCQkJCVwKKyAgaW50IGFkZHJfbW9kZTsJCQkJCVwKKyAgaW50IHdpZHRoOwkJCQkJCVwKKwkJCQkJCQlcCisgIHBjID0gRlJBTUVfU0FWRURfUEMgKGZpKTsJCQkJXAorICBpbnNuID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsMik7CQkJXAorICBhZGRyX21vZGUgPSAoaW5zbiA+PiAxMSkgJiAweDFmOwkJCVwKKyAgaW5zbiA9IGluc24gJiAweDdmZjsJCQkJCVwKKyAgaWYgKChpbnNuICYgMHg3ZmMpID09IDB4NTdjCQkJCVwKKyAgICAgICYmIGFkZHJfbW9kZSA9PSAweDE0KSAvKiBpbW1lZGlhdGUgKi8JCVwKKyAgICB7IGlmIChpbnNuID09IDB4NTdjKSAvKiBhZGpzcGIgKi8JCQlcCisJd2lkdGggPSAxOwkJCQkJXAorICAgICAgZWxzZSBpZiAoaW5zbiA9PSAweDU3ZCkgLyogYWRqc3B3ICovCQlcCisJd2lkdGggPSAyOwkJCQkJXAorICAgICAgZWxzZSBpZiAoaW5zbiA9PSAweDU3ZikgLyogYWRqc3BkICovCQlcCisJd2lkdGggPSA0OwkJCQkJXAorICAgICAgbnVtYXJncyA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjKzIsd2lkdGgpOwlcCisgICAgICBpZiAod2lkdGggPiAxKQkJCQkJXAorCWZsaXBfYnl0ZXMgKCZudW1hcmdzLCB3aWR0aCk7CQkJXAorICAgICAgbnVtYXJncyA9IC0gc2lnbl9leHRlbmQgKG51bWFyZ3MsIHdpZHRoKjgpIC8gNDsgfQlcCisgIGVsc2UgbnVtYXJncyA9IC0xOwkJCQkJXAorfQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGF0IHN0YXJ0IG9mIGFyZ2xpc3QgdGhhdCBhcmUgbm90IHJlYWxseSBhcmdzLiAgKi8KKworI2RlZmluZSBGUkFNRV9BUkdTX1NLSVAgOAorCisvKiBQdXQgaGVyZSB0aGUgY29kZSB0byBzdG9yZSwgaW50byBhIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzLAorICAgdGhlIGFkZHJlc3NlcyBvZiB0aGUgc2F2ZWQgcmVnaXN0ZXJzIG9mIGZyYW1lIGRlc2NyaWJlZCBieSBGUkFNRV9JTkZPLgorICAgVGhpcyBpbmNsdWRlcyBzcGVjaWFsIHJlZ2lzdGVycyBzdWNoIGFzIHBjIGFuZCBmcCBzYXZlZCBpbiBzcGVjaWFsCisgICB3YXlzIGluIHRoZSBzdGFjayBmcmFtZS4gIHNwIGlzIGV2ZW4gbW9yZSBzcGVjaWFsOgorICAgdGhlIGFkZHJlc3Mgd2UgcmV0dXJuIGZvciBpdCBJUyB0aGUgc3AgZm9yIHRoZSBuZXh0IGZyYW1lLiAgKi8KKworI2RlZmluZSBGUkFNRV9GSU5EX1NBVkVEX1JFR1MoZnJhbWVfaW5mbywgZnJhbWVfc2F2ZWRfcmVncykgXAoreyBpbnQgcmVnbWFzayxyZWdudW07CQkJCQkJXAorICBpbnQgbG9jYWxjb3VudDsJCQkJCQlcCisgIENPUkVfQUREUiBlbnRlcl9hZGRyOwkJCQkJCVwKKyAgQ09SRV9BRERSIG5leHRfYWRkcjsJCQkJCQlcCisJCQkJCQkJCVwKKyAgZW50ZXJfYWRkciA9IGdldF9wY19mdW5jdGlvbl9zdGFydCAoKGZyYW1lX2luZm8pLT5wYyk7CVwKKyAgcmVnbWFzayA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKGVudGVyX2FkZHIrMSwgMSk7CQlcCisgIGxvY2FsY291bnQgPSBuczMya19sb2NhbGNvdW50IChlbnRlcl9hZGRyKTsJCQlcCisgIG5leHRfYWRkciA9IChmcmFtZV9pbmZvKS0+ZnJhbWUgKyBsb2NhbGNvdW50OwkJCVwKKyAgZm9yIChyZWdudW0gPSAwOyByZWdudW0gPCA4OyByZWdudW0rKywgcmVnbWFzayA+Pj0gMSkJCVwKKyAgICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tyZWdudW1dCQkJCVwKKyAgICAgID0gKHJlZ21hc2sgJiAxKSA/IChuZXh0X2FkZHIgLT0gNCkgOiAwOwkJCVwKKyAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbU1BfUkVHTlVNXSA9IChmcmFtZV9pbmZvKS0+ZnJhbWUgKyA0OwlcCisgIChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzW1BDX1JFR05VTV0gPSAoZnJhbWVfaW5mbyktPmZyYW1lICsgNDsJXAorICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tGUF9SRUdOVU1dCQkJCVwKKyAgICAgPSByZWFkX21lbW9yeV9pbnRlZ2VyICgoZnJhbWVfaW5mbyktPmZyYW1lLCA0KTsgfQorCisMCisvKiBUaGluZ3MgbmVlZGVkIGZvciBtYWtpbmcgdGhlIGluZmVyaW9yIGNhbGwgZnVuY3Rpb25zLiAgKi8KKworLyogUHVzaCBhbiBlbXB0eSBzdGFjayBmcmFtZSwgdG8gcmVjb3JkIHRoZSBjdXJyZW50IFBDLCBldGMuICAqLworCisjZGVmaW5lIFBVU0hfRFVNTVlfRlJBTUUgXAoreyByZWdpc3RlciBDT1JFX0FERFIgc3AgPSByZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pOwlcCisgIHJlZ2lzdGVyIGludCByZWdudW07CQkJCQlcCisgIHNwID0gcHVzaF93b3JkIChzcCwgcmVhZF9yZWdpc3RlciAoUENfUkVHTlVNKSk7CVwKKyAgc3AgPSBwdXNoX3dvcmQgKHNwLCByZWFkX3JlZ2lzdGVyIChGUF9SRUdOVU0pKTsJXAorICB3cml0ZV9yZWdpc3RlciAoRlBfUkVHTlVNLCBzcCk7CQkJXAorICBmb3IgKHJlZ251bSA9IDA7IHJlZ251bSA8IDg7IHJlZ251bSsrKSAgCQlcCisgICAgc3AgPSBwdXNoX3dvcmQgKHNwLCByZWFkX3JlZ2lzdGVyIChyZWdudW0pKTsJXAorICB3cml0ZV9yZWdpc3RlciAoU1BfUkVHTlVNLCBzcCk7ICAJCQlcCit9CisKKy8qIERpc2NhcmQgZnJvbSB0aGUgc3RhY2sgdGhlIGlubmVybW9zdCBmcmFtZSwgcmVzdG9yaW5nIGFsbCByZWdpc3RlcnMuICAqLworCisjZGVmaW5lIFBPUF9GUkFNRSAgXAoreyByZWdpc3RlciBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWUgPSBnZXRfY3VycmVudF9mcmFtZSAoKTsJIFwKKyAgcmVnaXN0ZXIgQ09SRV9BRERSIGZwOwkJCQkJIFwKKyAgcmVnaXN0ZXIgaW50IHJlZ251bTsJCQkJCQkgXAorICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyBmc3I7CQkJCQkgXAorICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7CQkJCQkJIFwKKyAgZnAgPSBmcmFtZS0+ZnJhbWU7CQkJCQkJIFwKKyAgZ2V0X2ZyYW1lX3NhdmVkX3JlZ3MgKGZyYW1lLCAmZnNyKTsJCQkJIFwKKyAgZm9yIChyZWdudW0gPSAwOyByZWdudW0gPCA4OyByZWdudW0rKykJCQkgXAorICAgIGlmIChmc3IucmVnc1tyZWdudW1dKQkJCQkJIFwKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChyZWdudW0sIHJlYWRfbWVtb3J5X2ludGVnZXIgKGZzci5yZWdzW3JlZ251bV0sIDQpKTsgXAorICB3cml0ZV9yZWdpc3RlciAoRlBfUkVHTlVNLCByZWFkX21lbW9yeV9pbnRlZ2VyIChmcCwgNCkpOwkgXAorICB3cml0ZV9yZWdpc3RlciAoUENfUkVHTlVNLCByZWFkX21lbW9yeV9pbnRlZ2VyIChmcCArIDQsIDQpKTsgICBcCisgIHdyaXRlX3JlZ2lzdGVyIChTUF9SRUdOVU0sIGZwICsgOCk7CQkJCSBcCisgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7CQkJCQkgXAorfQorCisvKiBUaGlzIHNlcXVlbmNlIG9mIHdvcmRzIGlzIHRoZSBpbnN0cnVjdGlvbnMKKyAgICAgZW50ZXIJMHhmZiwwCQk4MiBmZiAwMAorICAgICBqc3IJQDB4MDAwMTAyMDMJN2YgYWUgYzAgMDEgMDIgMDMKKyAgICAgYWRqc3BkCTB4Njk2OTY5NjkJN2YgYTUgMDEgMDIgMDMgMDQKKyAgICAgYnB0CQkJZjIKKyAgIE5vdGUgdGhpcyBpcyAxNiBieXRlcy4gICovCisKKyNkZWZpbmUgQ0FMTF9EVU1NWSB7IDB4N2YwMGZmODIsIDB4MDIwMWMwYWUsIDB4MDFhNTdmMDMsIDB4ZjIwNDAzMDIgfQorCisjZGVmaW5lIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUCTMKKyNkZWZpbmUgQ0FMTF9EVU1NWV9MRU5HVEgJMTYKKyNkZWZpbmUgQ0FMTF9EVU1NWV9BRERSCQk1CisjZGVmaW5lIENBTExfRFVNTVlfTkFSR1MJMTEKKworLyogSW5zZXJ0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGFyZ3MgYW5kIGZ1bmN0aW9uIGFkZHJlc3MKKyAgIGludG8gYSBjYWxsIHNlcXVlbmNlIG9mIHRoZSBhYm92ZSBmb3JtIHN0b3JlZCBhdCBEVU1NWU5BTUUuICAqLworCisjZGVmaW5lIEZJWF9DQUxMX0RVTU1ZKGR1bW15bmFtZSwgcGMsIGZ1biwgbmFyZ3MsIGFyZ3MsIHR5cGUsIGdjY19wKSAgIAkJXAoreyBpbnQgZmxpcHBlZCA9IGZ1biB8IDB4YzAwMDAwMDA7CQkJCVwKKyAgZmxpcF9ieXRlcyAoJmZsaXBwZWQsIDQpOwkJCQkJXAorICAqKChpbnQgKikgKCgoY2hhciAqKSBkdW1teW5hbWUpK0NBTExfRFVNTVlfQUREUikpID0gZmxpcHBlZDsJXAorICBmbGlwcGVkID0gLSBuYXJncyAqIDQ7CQkJCQlcCisgIGZsaXBfYnl0ZXMgKCZmbGlwcGVkLCA0KTsJCQkJCVwKKyAgKigoaW50ICopICgoKGNoYXIgKikgZHVtbXluYW1lKStDQUxMX0RVTU1ZX05BUkdTKSkgPSBmbGlwcGVkOwlcCit9CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL25zMzJrL3RtLW5ic2QuaCBiL2dkYi9jb25maWcvbnMzMmsvdG0tbmJzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNjFkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL25zMzJrL3RtLW5ic2QuaApAQCAtMCwwICsxLDc5IEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgbnMzMmsgcnVubmluZyB1bmRlciBOZXRCU0QuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBPdmVycmlkZSBudW1iZXIgb2YgZXhwZWN0ZWQgdHJhcHMgZnJvbSBzeXN2LiAqLworI2RlZmluZSBTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCAyCisKKy8qIE1vc3QgZGVmaW5pdGlvbnMgZnJvbSB1bWF4IGNvdWxkIGJlIHVzZWQuICovCisKKyNpbmNsdWRlICJuczMyay90bS11bWF4LmgiCisKKy8qIEdlbmVyaWMgTmV0QlNEIGRlZmluaXRpb25zLiAgKi8KKworI2luY2x1ZGUgInRtLW5ic2QuaCIKKworLyogU2F2ZWQgUGMuICBHZXQgaXQgZnJvbSBzaWdjb250ZXh0IGlmIHdpdGhpbiBzaWd0cmFtcC4gICovCisKKy8qIE9mZnNldCB0byBzYXZlZCBQQyBpbiBzaWdjb250ZXh0LCBmcm9tIDxtYWNoaW5lL3NpZ25hbC5oPi4gICovCisjZGVmaW5lIFNJR0NPTlRFWFRfUENfT0ZGU0VUIDIwCisKKyN1bmRlZiBGUkFNRV9TQVZFRF9QQyhGUkFNRSkKKyNkZWZpbmUgRlJBTUVfU0FWRURfUEMoRlJBTUUpIFwKKyAgKCgoRlJBTUUpLT5zaWduYWxfaGFuZGxlcl9jYWxsZXIgXAorICAgID8gc2lndHJhbXBfc2F2ZWRfcGMgKEZSQU1FKSBcCisgICAgOiByZWFkX21lbW9yeV9pbnRlZ2VyICgoRlJBTUUpLT5mcmFtZSArIDQsIDQpKSBcCisgICApCisKKworLyogdG0tdW1heC5oIGFzc3VtZXMgYSAzMjA4MiBmcHUuIFdlIGhhdmUgYSAzMjM4MiBmcHUuICovCisjdW5kZWYgUkVHSVNURVJfTkFNRVMKKyN1bmRlZiBOVU1fUkVHUworI3VuZGVmIFJFR0lTVEVSX0JZVEVTCisjdW5kZWYgIFJFR0lTVEVSX0JZVEUKKy8qIEluaXRpYWxpemVyIGZvciBhbiBhcnJheSBvZiBuYW1lcyBvZiByZWdpc3RlcnMuCisgICBUaGVyZSBzaG91bGQgYmUgTlVNX1JFR1Mgc3RyaW5ncyBpbiB0aGlzIGluaXRpYWxpemVyLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyB7InIwIiwgInIxIiwgInIyIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwJXAorIAkJCSJmMCIsICJmMSIsICJmMiIsICJmMyIsICJmNCIsICJmNSIsICJmNiIsICJmNyIsCVwKKwkJCSJzcCIsICJmcCIsICJwYyIsICJwcyIsCQkJCVwKKyAJCQkiZnNyIiwJCQkJCQlcCisJCQkibDAiLCAibDEiLCAibDIiLCAibDMiLCAibDQiLCAibDUiLCAibDYiLCAibDciLCAieHgiLAkJCVwKKyAJCQl9CisKKyNkZWZpbmUgTlVNX1JFR1MJCTI5CisKKy8qIFRvdGFsIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgdG8gc3RvcmUgb3VyIGNvcGllcyBvZiB0aGUgbWFjaGluZSdzCisgICByZWdpc3RlciBzdGF0ZSwgdGhlIGFycmF5IGByZWdpc3RlcnMnLiAgKi8KKyNkZWZpbmUgUkVHSVNURVJfQllURVMgXAorICAoKE5VTV9SRUdTIC0gNCkgKiBSRUdJU1RFUl9SQVdfU0laRShSMF9SRUdOVU0pIFwKKyAgICsgOCAgICAgICAgICAgICogUkVHSVNURVJfUkFXX1NJWkUoTFAwX1JFR05VTSkpCisKKy8qIEluZGV4IHdpdGhpbiBgcmVnaXN0ZXJzJyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3BhY2UgZm9yCisgICByZWdpc3RlciBOLiAgKi8KKworLyogVGhpcyBpcyBhIGJpdCB5dWNrLiBUaGUgZXZlbiBudW1iZXJlZCBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nCisgICBwb2ludCBsb25nIHJlZ2lzdGVycyBvY2N1cHkgdGhlIHNhbWUgc3BhY2UgYXMgdGhlIGV2ZW46b2RkIG51bWJlcmVkCisgICBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycywgYnV0IHRoZSBleHRyYSAzMjM4MSBmcHUKKyAgIHJlZ2lzdGVycyBhcmUgYXQgdGhlIGVuZC4gRG9pbmcgaXQgdGhpcyB3YXkgaXMgY29tcGF0YWJsZSBmb3IgYm90aAorICAgMzIwODEgYW5kIDMyMzgxIGVxdWlwZWQgbWFjaGluZXMuICovCisKKyNkZWZpbmUgUkVHSVNURVJfQllURShOKSAoKChOKSA8IExQMF9SRUdOVU0/IChOKVwKKwkJCSAgIDogKChOKSAtIExQMF9SRUdOVU0pICYgMT8gKE4pIC0gMSBcCisJCQkgICA6ICgoTikgLSBMUDBfUkVHTlVNICsgRlAwX1JFR05VTSkpICogNCkKKwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9uczMyay90bS1uczMya20zLmggYi9nZGIvY29uZmlnL25zMzJrL3RtLW5zMzJrbTMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2QwN2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9uczMyay90bS1uczMya20zLmgKQEAgLTAsMCArMSw3MyBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIG5zNTMyLCBNYWNoIDMuMAorICAgQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEluY2x1ZGUgY29tbW9uIGRlZmluaXRpb25zIGZvciBNYWNoMyBzeXN0ZW1zICovCisjaW5jbHVkZSAibm0tbTMuaCIKKworLyogRGVmaW5lIG9mZnNldHMgdG8gYWNjZXNzIENQUk9DIHN0YWNrIHdoZW4gaXQgZG9lcyBub3QgaGF2ZQorICogYSBrZXJuZWwgdGhyZWFkLgorICovCisjZGVmaW5lIE1BQ0hJTkVfQ1BST0NfU1BfT0ZGU0VUIDIwCisjZGVmaW5lIE1BQ0hJTkVfQ1BST0NfUENfT0ZGU0VUIDE2CisjZGVmaW5lIE1BQ0hJTkVfQ1BST0NfRlBfT0ZGU0VUIDEyCisKKyNpbmNsdWRlIDxuczUzMi9wc2wuaD4KKyNpbmNsdWRlIDxuczUzMi92bXBhcmFtLmg+CisKKy8qIFRocmVhZCBmbGF2b3JzIHVzZWQgaW4gcmUtc2V0dGluZyB0aGUgVCBiaXQuCisgKiBAQCB0aGlzIGlzIGFsc28gYmFkIGZvciBjcm9zcyBkZWJ1Z2dpbmcuCisgKi8KKyNkZWZpbmUgVFJBQ0VfRkxBVk9SCQlOUzUzMl9USFJFQURfU1RBVEUKKyNkZWZpbmUgVFJBQ0VfRkxBVk9SX1NJWkUJTlM1MzJfVEhSRUFEX1NUQVRFX0NPVU5UCisjZGVmaW5lIFRSQUNFX1NFVCh4LHN0YXRlKSBcCisgIAkoKHN0cnVjdCBuczUzMl90aHJlYWRfc3RhdGUgKilzdGF0ZSktPnBzciB8PSBQU1JfVAorI2RlZmluZSBUUkFDRV9DTEVBUih4LHN0YXRlKSBcCisgIAkoKCgoc3RydWN0IG5zNTMyX3RocmVhZF9zdGF0ZSAqKXN0YXRlKS0+cHNyICY9IH5QU1JfVCksIDEpCisKKy8qIHdlIGNhbiBkbyBpdCAqLworI2RlZmluZSBBVFRBQ0hfREVUQUNIIDEKKworLyogQWRkcmVzcyBvZiBlbmQgb2Ygc3RhY2sgc3BhY2UuCisgKiBmb3IgTUFDSCwgc2VlIDxuczUzMi92bXBhcmFtLmg+CisgKi8KKyNkZWZpbmUgU1RBQ0tfRU5EX0FERFIgVVNSU1RBQ0sKKworI2luY2x1ZGUgIm5zMzJrL3RtLXVtYXguaCIKKworLyogdG0tdW1heC5oIGFzc3VtZXMgYSAzMjA4MiBmcHUuIFdlIGhhdmUgYSAzMjM4MiBmcHUuICovCisjdW5kZWYgUkVHSVNURVJfTkFNRVMKKyN1bmRlZiBOVU1fUkVHUworI3VuZGVmIFJFR0lTVEVSX0JZVEVTCisvKiBJbml0aWFsaXplciBmb3IgYW4gYXJyYXkgb2YgbmFtZXMgb2YgcmVnaXN0ZXJzLgorICAgVGhlcmUgc2hvdWxkIGJlIE5VTV9SRUdTIHN0cmluZ3MgaW4gdGhpcyBpbml0aWFsaXplci4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfTkFNRVMgeyJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsCVwKKyAJCQkiZjAiLCAiZjEiLCAiZjIiLCAiZjMiLCAiZjQiLCAiZjUiLCAiZjYiLCAiZjciLAlcCisJCQkic3AiLCAiZnAiLCAicGMiLCAicHMiLAkJCQlcCisgCQkJImZzciIsCQkJCQkJXAorCQkJImwwIiwgImwxIiwgImwyIiwgImwzIiwgImw0IiwgImw1IiwgImw2IiwgImw3IiwgInh4IiwJCQlcCisgCQkJfQorCisjZGVmaW5lIE5VTV9SRUdTCQkyOQorCisvKiBUb3RhbCBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIHRvIHN0b3JlIG91ciBjb3BpZXMgb2YgdGhlIG1hY2hpbmUncworICAgcmVnaXN0ZXIgc3RhdGUsIHRoZSBhcnJheSBgcmVnaXN0ZXJzJy4gICovCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTIFwKKyAgKChOVU1fUkVHUyAtIDQpICogUkVHSVNURVJfUkFXX1NJWkUoUjBfUkVHTlVNKSBcCisgICArIDggICAgICAgICAgICAqIFJFR0lTVEVSX1JBV19TSVpFKExQMF9SRUdOVU0pKQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9uczMyay90bS11bWF4LmggYi9nZGIvY29uZmlnL25zMzJrL3RtLXVtYXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmRmYjJmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9uczMyay90bS11bWF4LmgKQEAgLTAsMCArMSwzNzAgQEAKKy8qIERlZmluaXRpb25zIHRvIG1ha2UgR0RCIHJ1biBvbiBhbiBlbmNvcmUgdW5kZXIgdW1heCA0LjIKKyAgIENvcHlyaWdodCAxOTg3LCAxOTg5LCAxOTkxLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgaXMgYWxzbyBpbmNsdWRlZCBieSB0bS1uczMya20zLmgsIGFzIHdlbGwgYXMgYmVpbmcgdXNlZCBieSB1bWF4LiAgKi8KKworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisKKy8qIE5lZWQgdG8gZ2V0IGZ1bmN0aW9uIGVuZHMgYnkgYWRkaW5nIHRoaXMgdG8gZXBpbG9ndWUgYWRkcmVzcyBmcm9tIC5iZgorICAgcmVjb3JkLCBub3QgdXNpbmcgeF9mc2l6ZSBmaWVsZC4gICovCisjZGVmaW5lIEZVTkNUSU9OX0VQSUxPR1VFX1NJWkUgNAorCisvKiBPZmZzZXQgZnJvbSBhZGRyZXNzIG9mIGZ1bmN0aW9uIHRvIHN0YXJ0IG9mIGl0cyBjb2RlLgorICAgWmVybyBvbiBtb3N0IG1hY2hpbmVzLiAgKi8KKworI2RlZmluZSBGVU5DVElPTl9TVEFSVF9PRkZTRVQgMAorCisvKiBBZHZhbmNlIFBDIGFjcm9zcyBhbnkgZnVuY3Rpb24gZW50cnkgcHJvbG9ndWUgaW5zdHJ1Y3Rpb25zCisgICB0byByZWFjaCBzb21lICJyZWFsIiBjb2RlLiAgKi8KKworI2RlZmluZSBTS0lQX1BST0xPR1VFKHBjKSAgIAkJCQlcCit7IHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgb3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgMSk7CVwKKyAgaWYgKG9wID09IDB4ODIpIHsgb3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYysyLDEpOyAgXAorICAJCSAgICBpZiAoKG9wICYgMHg4MCkgPT0gMCkgcGMgKz0gMzsJXAorCQkgICAgZWxzZSBpZiAoKG9wICYgMHhjMCkgPT0gMHg4MCkgcGMgKz0gNDsJXAorCQkgICAgZWxzZSBwYyArPSA2OwkJCVwKKwkJICAgfQkJCQkJXAorfQorCisvKiBJbW1lZGlhdGVseSBhZnRlciBhIGZ1bmN0aW9uIGNhbGwsIHJldHVybiB0aGUgc2F2ZWQgcGMuCisgICBDYW4ndCBhbHdheXMgZ28gdGhyb3VnaCB0aGUgZnJhbWVzIGZvciB0aGlzIGJlY2F1c2Ugb24gc29tZSBtYWNoaW5lcworICAgdGhlIG5ldyBmcmFtZSBpcyBub3Qgc2V0IHVwIHVudGlsIHRoZSBuZXcgZnVuY3Rpb24gZXhlY3V0ZXMKKyAgIHNvbWUgaW5zdHJ1Y3Rpb25zLiAgKi8KKworI2RlZmluZSBTQVZFRF9QQ19BRlRFUl9DQUxMKGZyYW1lKSBcCisJcmVhZF9tZW1vcnlfaW50ZWdlciAocmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKSwgNCkKKworLyogQWRkcmVzcyBvZiBlbmQgb2Ygc3RhY2sgc3BhY2UuICAqLworCisjaWZuZGVmIFNUQUNLX0VORF9BRERSCisjZGVmaW5lIFNUQUNLX0VORF9BRERSICgweGZmZmZmMDAwKQorI2VuZGlmCisKKy8qIFN0YWNrIGdyb3dzIGRvd253YXJkLiAgKi8KKworI2RlZmluZSBJTk5FUl9USEFOKGxocyxyaHMpICgobGhzKSA8IChyaHMpKQorCisvKiBTZXF1ZW5jZSBvZiBieXRlcyBmb3IgYnJlYWtwb2ludCBpbnN0cnVjdGlvbi4gICovCisKKyNkZWZpbmUgQlJFQUtQT0lOVCB7MHhmMn0KKworLyogQW1vdW50IFBDIG11c3QgYmUgZGVjcmVtZW50ZWQgYnkgYWZ0ZXIgYSBicmVha3BvaW50LgorICAgVGhpcyBpcyBvZnRlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIEJSRUFLUE9JTlQKKyAgIGJ1dCBub3QgYWx3YXlzLiAgKi8KKworI2RlZmluZSBERUNSX1BDX0FGVEVSX0JSRUFLIDAKKworI2lmIDAgLyogRGlzYWJsZSB1bnRpbCBmaXhlZCAqY29ycmVjdGx5Ki4gICovCisjaWZuZGVmIElOVkFMSURfRkxPQVQKKyNpZm5kZWYgTmFOCisjaW5jbHVkZSA8bmFuLmg+CisjZW5kaWYgTmFOCisKKy8qIFJldHVybiAxIGlmIFAgcG9pbnRzIHRvIGFuIGludmFsaWQgZmxvYXRpbmcgcG9pbnQgdmFsdWUuICAqLworLyogU3VyZWx5IHdyb25nIGZvciBjcm9zcy1kZWJ1Z2dpbmcuICAqLworI2RlZmluZSBJTlZBTElEX0ZMT0FUKHAsIHMpIFwKKwkgKChzID09IHNpemVvZiAoZmxvYXQpKT8JXAorCQlOYUYgKCooZmxvYXQgKikgcCkgOglcCisJCU5hRCAoKihkb3VibGUgKikgcCkpCisjZW5kaWYgLyogSU5WQUxJRF9GTE9BVCAqLworI2VuZGlmCisKKy8qIFNheSBob3cgbG9uZyAob3JkaW5hcnkpIHJlZ2lzdGVycyBhcmUuICBUaGlzIGlzIGEgcGllY2Ugb2YgYm9nb3NpdHkKKyAgIHVzZWQgaW4gcHVzaF93b3JkIGFuZCBhIGZldyBvdGhlciBwbGFjZXM7IFJFR0lTVEVSX1JBV19TSVpFIGlzIHRoZQorICAgcmVhbCB3YXkgdG8ga25vdyBob3cgYmlnIGEgcmVnaXN0ZXIgaXMuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1NJWkUgNAorCisvKiBOdW1iZXIgb2YgbWFjaGluZSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBOVU1fUkVHUwkJMjUKKworI2RlZmluZSBOVU1fR0VORVJBTF9SRUdTCTgKKworLyogSW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIG5hbWVzIG9mIHJlZ2lzdGVycy4KKyAgIFRoZXJlIHNob3VsZCBiZSBOVU1fUkVHUyBzdHJpbmdzIGluIHRoaXMgaW5pdGlhbGl6ZXIuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX05BTUVTIHsicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLAlcCisgCQkJImYwIiwgImYxIiwgImYyIiwgImYzIiwgImY0IiwgImY1IiwgImY2IiwgImY3IiwJXAorCQkJInNwIiwgImZwIiwgInBjIiwgInBzIiwJCQkJXAorIAkJCSJmc3IiLAkJCQkJCVwKKwkJCSJsMCIsICJsMSIsICJsMiIsICJsMyIsICJ4eCIsCQkJXAorIAkJCX0KKworLyogUmVnaXN0ZXIgbnVtYmVycyBvZiB2YXJpb3VzIGltcG9ydGFudCByZWdpc3RlcnMuCisgICBOb3RlIHRoYXQgc29tZSBvZiB0aGVzZSB2YWx1ZXMgYXJlICJyZWFsIiByZWdpc3RlciBudW1iZXJzLAorICAgYW5kIGNvcnJlc3BvbmQgdG8gdGhlIGdlbmVyYWwgcmVnaXN0ZXJzIG9mIHRoZSBtYWNoaW5lLAorICAgYW5kIHNvbWUgYXJlICJwaG9ueSIgcmVnaXN0ZXIgbnVtYmVycyB3aGljaCBhcmUgdG9vIGxhcmdlCisgICB0byBiZSBhY3R1YWwgcmVnaXN0ZXIgbnVtYmVycyBhcyBmYXIgYXMgdGhlIHVzZXIgaXMgY29uY2VybmVkCisgICBidXQgZG8gc2VydmUgdG8gZ2V0IHRoZSBkZXNpcmVkIHZhbHVlcyB3aGVuIHBhc3NlZCB0byByZWFkX3JlZ2lzdGVyLiAgKi8KKworI2RlZmluZQlSMF9SRUdOVU0gMAkJLyogR2VuZXJhbCByZWdpc3RlciAwICovCisjZGVmaW5lIEZQMF9SRUdOVU0gOAkJLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgMCAqLworI2RlZmluZSBTUF9SRUdOVU0gMTYJCS8qIENvbnRhaW5zIGFkZHJlc3Mgb2YgdG9wIG9mIHN0YWNrICovCisjZGVmaW5lIEFQX1JFR05VTSBGUF9SRUdOVU0KKyNkZWZpbmUgRlBfUkVHTlVNIDE3CQkvKiBDb250YWlucyBhZGRyZXNzIG9mIGV4ZWN1dGluZyBzdGFjayBmcmFtZSAqLworI2RlZmluZSBQQ19SRUdOVU0gMTgJCS8qIENvbnRhaW5zIHByb2dyYW0gY291bnRlciAqLworI2RlZmluZSBQU19SRUdOVU0gMTkJCS8qIENvbnRhaW5zIHByb2Nlc3NvciBzdGF0dXMgKi8KKyNkZWZpbmUgRlBTX1JFR05VTSAyMAkJLyogRmxvYXRpbmcgcG9pbnQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIExQMF9SRUdOVU0gMjEJCS8qIERvdWJsZSByZWdpc3RlciAwIChzYW1lIGFzIEZQMCkgKi8KKworLyogVG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCB0byBzdG9yZSBvdXIgY29waWVzIG9mIHRoZSBtYWNoaW5lJ3MKKyAgIHJlZ2lzdGVyIHN0YXRlLCB0aGUgYXJyYXkgYHJlZ2lzdGVycycuICAqLworI2RlZmluZSBSRUdJU1RFUl9CWVRFUyBcCisgICgoTlVNX1JFR1MgLSA0KSAqIFJFR0lTVEVSX1JBV19TSVpFKFIwX1JFR05VTSkgXAorICAgKyA0ICAgICAgICAgICAgKiBSRUdJU1RFUl9SQVdfU0laRShMUDBfUkVHTlVNKSkKKworLyogSW5kZXggd2l0aGluIGByZWdpc3RlcnMnIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzcGFjZSBmb3IKKyAgIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0JZVEUoTikgKChOKSA+PSBMUDBfUkVHTlVNID8gXAorCUxQMF9SRUdOVU0gKiA0ICsgKChOKSAtIExQMF9SRUdOVU0pICogOCA6IChOKSAqIDQpCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBhY3R1YWwgbWFjaGluZSByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICBPbiB0aGUgMzIwMDAsIGFsbCByZWdzIGFyZSA0IGJ5dGVzCisgICBleGNlcHQgZm9yIHRoZSBkb3VibGVkIGZsb2F0aW5nIHJlZ2lzdGVycy4gKi8KKworI2RlZmluZSBSRUdJU1RFUl9SQVdfU0laRShOKSAoKE4pID49IExQMF9SRUdOVU0gPyA4IDogNCkKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIHByb2dyYW0ncyByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICBPbiB0aGUgMzIwMDAsIGFsbCByZWdzIGFyZSA0IGJ5dGVzCisgICBleGNlcHQgZm9yIHRoZSBkb3VibGVkIGZsb2F0aW5nIHJlZ2lzdGVycy4gKi8KKworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUoTikgKChOKSA+PSBMUDBfUkVHTlVNID8gOCA6IDQpCisKKy8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfUkFXX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9SQVdfU0laRSA4CisKKy8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfVklSVFVBTF9TSVpFIGNhbiBoYXZlLiAgKi8KKworI2RlZmluZSBNQVhfUkVHSVNURVJfVklSVFVBTF9TSVpFIDgKKworLyogUmV0dXJuIHRoZSBHREIgdHlwZSBvYmplY3QgZm9yIHRoZSAic3RhbmRhcmQiIGRhdGEgdHlwZQorICAgb2YgZGF0YSBpbiByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1RZUEUoTikgXAorCSgoKE4pIDwgRlAwX1JFR05VTSkgPwkJCQlcCisJCWJ1aWx0aW5fdHlwZV9pbnQgOgkJCVwKKwkJKChOKSA8IEZQMF9SRUdOVU0gKyA4KSA/CQlcCisJCQlidWlsdGluX3R5cGVfZmxvYXQgOgkJXAorCQkJKChOKSA8IExQMF9SRUdOVU0pID8JCVwKKwkJCQlidWlsdGluX3R5cGVfaW50IDoJXAorCQkJCWJ1aWx0aW5fdHlwZV9kb3VibGUpCisKKy8qIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBwbGFjZSBpbiB3aGljaCB0byBjb3B5IHRoZSBzdHJ1Y3R1cmUgdGhlCisgICBzdWJyb3V0aW5lIHdpbGwgcmV0dXJuLiAgVGhpcyBpcyBjYWxsZWQgZnJvbSBjYWxsX2Z1bmN0aW9uLgorCisgICBPbiB0aGlzIG1hY2hpbmUgdGhpcyBpcyBhIG5vLW9wLCBiZWNhdXNlIGdjYyBpc24ndCB1c2VkIG9uIGl0CisgICB5ZXQuICBTbyB0aGlzIGNhbGxpbmcgY29udmVudGlvbiBpcyBub3QgdXNlZC4gKi8KKworI2RlZmluZSBTVE9SRV9TVFJVQ1RfUkVUVVJOKEFERFIsIFNQKQorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwgZm9ybWF0LAorICAgaW50byBWQUxCVUYuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKFRZUEUsUkVHQlVGLFZBTEJVRikgXAorICBtZW1jcHkgKFZBTEJVRiwgUkVHQlVGK1JFR0lTVEVSX0JZVEUgKFRZUEVfQ09ERSAoVFlQRSkgPT0gVFlQRV9DT0RFX0ZMVCA/IEZQMF9SRUdOVU0gOiAwKSwgVFlQRV9MRU5HVEggKFRZUEUpKQorCisvKiBXcml0ZSBpbnRvIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZQorICAgb2YgdHlwZSBUWVBFLCBnaXZlbiBpbiB2aXJ0dWFsIGZvcm1hdC4gICovCisKKyNkZWZpbmUgU1RPUkVfUkVUVVJOX1ZBTFVFKFRZUEUsVkFMQlVGKSBcCisgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFIChUWVBFX0NPREUgKFRZUEUpID09IFRZUEVfQ09ERV9GTFQgPyBGUDBfUkVHTlVNIDogMCksIFZBTEJVRiwgVFlQRV9MRU5HVEggKFRZUEUpKQorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICB0aGUgYWRkcmVzcyBpbiB3aGljaCBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gaXRzIHN0cnVjdHVyZSB2YWx1ZSwKKyAgIGFzIGEgQ09SRV9BRERSIChvciBhbiBleHByZXNzaW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgb25lKS4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyhSRUdCVUYpICgqKGludCAqKShSRUdCVUYpKQorDAorLyogRGVzY3JpYmUgdGhlIHBvaW50ZXIgaW4gZWFjaCBzdGFjayBmcmFtZSB0byB0aGUgcHJldmlvdXMgc3RhY2sgZnJhbWUKKyAgIChpdHMgY2FsbGVyKS4gICovCisKKy8qIEZSQU1FX0NIQUlOIHRha2VzIGEgZnJhbWUncyBub21pbmFsIGFkZHJlc3MKKyAgIGFuZCBwcm9kdWNlcyB0aGUgZnJhbWUncyBjaGFpbi1wb2ludGVyLiAqLworCisvKiBJbiB0aGUgY2FzZSBvZiB0aGUgbnMzMjAwMCBzZXJpZXMsIHRoZSBmcmFtZSdzIG5vbWluYWwgYWRkcmVzcyBpcyB0aGUgRlAKKyAgIHZhbHVlLCBhbmQgYXQgdGhhdCBhZGRyZXNzIGlzIHNhdmVkIHByZXZpb3VzIEZQIHZhbHVlIGFzIGEgNC1ieXRlIHdvcmQuICAqLworCisjZGVmaW5lIEZSQU1FX0NIQUlOKHRoaXNmcmFtZSkgIFwKKyAgKCFpbnNpZGVfZW50cnlfZmlsZSAoKHRoaXNmcmFtZSktPnBjKSA/IFwKKyAgIHJlYWRfbWVtb3J5X2ludGVnZXIgKCh0aGlzZnJhbWUpLT5mcmFtZSwgNCkgOlwKKyAgIDApCisKKy8qIERlZmluZSBvdGhlciBhc3BlY3RzIG9mIHRoZSBzdGFjayBmcmFtZS4gICovCisKKyNkZWZpbmUgRlJBTUVfU0FWRURfUEMoRlJBTUUpIChyZWFkX21lbW9yeV9pbnRlZ2VyICgoRlJBTUUpLT5mcmFtZSArIDQsIDQpKQorCisvKiBDb21wdXRlIGJhc2Ugb2YgYXJndW1lbnRzLiAqLworCisjZGVmaW5lIEZSQU1FX0FSR1NfQUREUkVTUyhmaSkJXAorICAoKG5zMzJrX2dldF9lbnRlcl9hZGRyICgoZmkpLT5wYykgPiAxKSA/IFwKKwkoKGZpKS0+ZnJhbWUpIDogKHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSkgLSA0KSkKKworI2RlZmluZSBGUkFNRV9MT0NBTFNfQUREUkVTUyhmaSkgKChmaSktPmZyYW1lKQorCisvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGVudGVyIG9wY29kZSBmb3IgdGhpcyBmdW5jdGlvbiwgaWYgaXQgaXMgYWN0aXZlLgorICAgUmV0dXJucyBwb3NpdGl2ZSBhZGRyZXNzID4gMSBpZiBwYyBpcyBiZXR3ZWVuIGVudGVyL2V4aXQsCisgICAxIGlmIHBjIGJlZm9yZSBlbnRlciBvciBhZnRlciBleGl0LCAwIG90aGVyd2lzZS4gKi8KKworZXh0ZXJuIENPUkVfQUREUiBuczMya19nZXRfZW50ZXJfYWRkciAoKTsKKworLyogUmV0dXJuIG51bWJlciBvZiBhcmdzIHBhc3NlZCB0byBhIGZyYW1lLgorICAgQ2FuIHJldHVybiAtMSwgbWVhbmluZyBubyB3YXkgdG8gdGVsbC4KKyAgIEVuY29yZSdzIEMgY29tcGlsZXIgb2Z0ZW4gcmV1c2VzIHNhbWUgYXJlYSBvbiBzdGFjayBmb3IgYXJncywKKyAgIHNvIHRoaXMgd2lsbCBvZnRlbiBub3Qgd29yayBwcm9wZXJseS4gIElmIHRoZSBhcmcgbmFtZXMKKyAgIGFyZSBrbm93biwgaXQncyBsaWtlbHkgbW9zdCBvZiB0aGVtIHdpbGwgYmUgcHJpbnRlZC4gKi8KKworI2RlZmluZSBGUkFNRV9OVU1fQVJHUyhudW1hcmdzLCBmaSkJCQlcCit7IENPUkVfQUREUglwYzsJCQkJCVwKKyAgQ09SRV9BRERSCWVudGVyX2FkZHI7CQkJCVwKKyAgdW5zaWduZWQgaW50CWluc247CQkJCQlcCisgIHVuc2lnbmVkIGludAlhZGRyX21vZGU7CQkJCVwKKyAgaW50IHdpZHRoOwkJCQkJCVwKKwkJCQkJCQlcCisgIG51bWFyZ3MgPSAtMTsJCQkJCQlcCisgIGVudGVyX2FkZHIgPSBuczMya19nZXRfZW50ZXJfYWRkciAoKGZpKS0+cGMpOwkJXAorICBpZiAoZW50ZXJfYWRkciA+IDApCQkJCQlcCisgICAgewkJCQkJCQlcCisgICAgICBwYyA9IChlbnRlcl9hZGRyID09IDEpID8JCQkJXAorCVNBVkVEX1BDX0FGVEVSX0NBTEwgKGZpKSA6CQkJXAorCUZSQU1FX1NBVkVEX1BDIChmaSk7CQkJCVwKKyAgICAgIGluc24gPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywyKTsJCVwKKyAgICAgIGFkZHJfbW9kZSA9IChpbnNuID4+IDExKSAmIDB4MWY7CQkJXAorICAgICAgaW5zbiA9IGluc24gJiAweDdmZjsJCQkJXAorICAgICAgaWYgKChpbnNuICYgMHg3ZmMpID09IDB4NTdjICYmCQkJXAorCQlhZGRyX21vZGUgPT0gMHgxNCkgLyogaW1tZWRpYXRlICovCVwKKwl7CQkJCQkJXAorCSAgaWYgKGluc24gPT0gMHg1N2MpIC8qIGFkanNwYiAqLwkJXAorICAJCXdpZHRoID0gMTsJCQkJXAorCSAgZWxzZSBpZiAoaW5zbiA9PSAweDU3ZCkgLyogYWRqc3B3ICovCQlcCisgIAkJd2lkdGggPSAyOwkJCQlcCisJICBlbHNlIGlmIChpbnNuID09IDB4NTdmKSAvKiBhZGpzcGQgKi8JCVwKKyAgCQl3aWR0aCA9IDQ7CQkJCVwKKwkgIG51bWFyZ3MgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYysyLHdpZHRoKTsJXAorCSAgaWYgKHdpZHRoID4gMSkJCQkJXAorCSAgICBmbGlwX2J5dGVzICgmbnVtYXJncywgd2lkdGgpOwkJXAorCSAgbnVtYXJncyA9IC0gc2lnbl9leHRlbmQgKG51bWFyZ3MsIHdpZHRoKjgpIC8gNDtcCisJfQkJCQkJCVwKKyAgICB9CQkJCQkJCVwKK30KKworLyogUmV0dXJuIG51bWJlciBvZiBieXRlcyBhdCBzdGFydCBvZiBhcmdsaXN0IHRoYXQgYXJlIG5vdCByZWFsbHkgYXJncy4gICovCisKKyNkZWZpbmUgRlJBTUVfQVJHU19TS0lQIDgKKworLyogUHV0IGhlcmUgdGhlIGNvZGUgdG8gc3RvcmUsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywKKyAgIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4KKyAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbAorICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDoKKyAgIHRoZSBhZGRyZXNzIHdlIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4gICovCisKKyNkZWZpbmUgRlJBTUVfRklORF9TQVZFRF9SRUdTKGZyYW1lX2luZm8sIGZyYW1lX3NhdmVkX3JlZ3MpCVwKK3sgCQkJCQkJCQlcCisgIHJlZ2lzdGVyIGludAlyZWdtYXNrLCByZWdudW07CQkJCVwKKyAgaW50CQlsb2NhbGNvdW50OwkJCQkJXAorICByZWdpc3RlciBDT1JFX0FERFIJZW50ZXJfYWRkcjsJCQkJXAorICByZWdpc3RlciBDT1JFX0FERFIJbmV4dF9hZGRyOwkJCQlcCisJCQkJCQkJCVwKKyAgbWVtc2V0ICgmKGZyYW1lX3NhdmVkX3JlZ3MpLCAnXDAnLCBzaXplb2YgKGZyYW1lX3NhdmVkX3JlZ3MpKTsJXAorICBlbnRlcl9hZGRyID0gbnMzMmtfZ2V0X2VudGVyX2FkZHIgKChmcmFtZV9pbmZvKS0+cGMpOwkJXAorICBpZiAoZW50ZXJfYWRkciA+IDEpCQkJCQkJXAorICAgIHsJCQkJCQkJCVwKKyAgICAgIHJlZ21hc2sgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChlbnRlcl9hZGRyKzEsIDEpICYgMHhmZjsJXAorICAgICAgbG9jYWxjb3VudCA9IG5zMzJrX2xvY2FsY291bnQgKGVudGVyX2FkZHIpOwkJXAorICAgICAgbmV4dF9hZGRyID0gKGZyYW1lX2luZm8pLT5mcmFtZSArIGxvY2FsY291bnQ7CQlcCisgICAgICBmb3IgKHJlZ251bSA9IDA7IHJlZ251bSA8IDg7IHJlZ251bSsrLCByZWdtYXNrID4+PSAxKQlcCisJKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbcmVnbnVtXSA9IChyZWdtYXNrICYgMSkgPwlcCisJCQkJCSAgKG5leHRfYWRkciAtPSA0KSA6IDA7CVwKKyAgICAgIChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzW1NQX1JFR05VTV0gPSAoZnJhbWVfaW5mbyktPmZyYW1lICsgNDtcCisgICAgICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tQQ19SRUdOVU1dID0gKGZyYW1lX2luZm8pLT5mcmFtZSArIDQ7XAorICAgICAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbRlBfUkVHTlVNXSA9CQkJXAorCQkgIChyZWFkX21lbW9yeV9pbnRlZ2VyICgoZnJhbWVfaW5mbyktPmZyYW1lLCA0KSk7XAorICAgIH0JCQkJCQkJCVwKKyAgZWxzZSBpZiAoZW50ZXJfYWRkciA9PSAxKQkJCQkJXAorICAgIHsJCQkJCQkJCVwKKyAgICAgIENPUkVfQUREUiBzcCA9IHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSk7CQkJXAorICAgICAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbUENfUkVHTlVNXSA9IHNwOwkJCVwKKyAgICAgIChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzW1NQX1JFR05VTV0gPSBzcCArIDQ7CQlcCisgICAgfQkJCQkJCQkJXAorfQorDAorLyogVGhpbmdzIG5lZWRlZCBmb3IgbWFraW5nIHRoZSBpbmZlcmlvciBjYWxsIGZ1bmN0aW9ucy4gICovCisKKy8qIFB1c2ggYW4gZW1wdHkgc3RhY2sgZnJhbWUsIHRvIHJlY29yZCB0aGUgY3VycmVudCBQQywgZXRjLiAgKi8KKworI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FIFwKK3sgcmVnaXN0ZXIgQ09SRV9BRERSIHNwID0gcmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKTtcCisgIHJlZ2lzdGVyIGludCByZWdudW07CQkJCSAgICBcCisgIHNwID0gcHVzaF93b3JkIChzcCwgcmVhZF9yZWdpc3RlciAoUENfUkVHTlVNKSk7ICAgXAorICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKEZQX1JFR05VTSkpOyAgIFwKKyAgd3JpdGVfcmVnaXN0ZXIgKEZQX1JFR05VTSwgc3ApOwkJICAgIFwKKyAgZm9yIChyZWdudW0gPSAwOyByZWdudW0gPCA4OyByZWdudW0rKykgIFwKKyAgICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKHJlZ251bSkpOyAgICBcCisgIHdyaXRlX3JlZ2lzdGVyIChTUF9SRUdOVU0sIHNwKTsgIAkJCVwKK30KKworLyogRGlzY2FyZCBmcm9tIHRoZSBzdGFjayB0aGUgaW5uZXJtb3N0IGZyYW1lLCByZXN0b3JpbmcgYWxsIHJlZ2lzdGVycy4gICovCisKKyNkZWZpbmUgUE9QX0ZSQU1FICBcCit7IHJlZ2lzdGVyIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZSA9IGdldF9jdXJyZW50X2ZyYW1lICgpOwkgXAorICByZWdpc3RlciBDT1JFX0FERFIgZnA7CQkJCQkgXAorICByZWdpc3RlciBpbnQgcmVnbnVtOwkJCQkJCSBcCisgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzIGZzcjsJCQkJCSBcCisgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsJCQkJCQkgXAorICBmcCA9IGZyYW1lLT5mcmFtZTsJCQkJCQkgXAorICBnZXRfZnJhbWVfc2F2ZWRfcmVncyAoZnJhbWUsICZmc3IpOwkJCQkgXAorICBmb3IgKHJlZ251bSA9IDA7IHJlZ251bSA8IDg7IHJlZ251bSsrKQkJCSBcCisgICAgaWYgKGZzci5yZWdzW3JlZ251bV0pCQkJCQkgXAorICAgICAgd3JpdGVfcmVnaXN0ZXIgKHJlZ251bSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnNyLnJlZ3NbcmVnbnVtXSwgNCkpOyBcCisgIHdyaXRlX3JlZ2lzdGVyIChGUF9SRUdOVU0sIHJlYWRfbWVtb3J5X2ludGVnZXIgKGZwLCA0KSk7CSBcCisgIHdyaXRlX3JlZ2lzdGVyIChQQ19SRUdOVU0sIHJlYWRfbWVtb3J5X2ludGVnZXIgKGZwICsgNCwgNCkpOyAgIFwKKyAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgZnAgKyA4KTsJCQkJIFwKKyAgZmx1c2hfY2FjaGVkX2ZyYW1lcyAoKTsJCQkJCSBcCit9CisKKy8qIFRoaXMgc2VxdWVuY2Ugb2Ygd29yZHMgaXMgdGhlIGluc3RydWN0aW9ucworICAgICBlbnRlcgkweGZmLDAJCTgyIGZmIDAwCisgICAgIGpzcglAMHgwMDAxMDIwMwk3ZiBhZSBjMCAwMSAwMiAwMworICAgICBhZGpzcGQJMHg2OTY5Njk2OQk3ZiBhNSAwMSAwMiAwMyAwNAorICAgICBicHQJCQlmMgorICAgTm90ZSB0aGlzIGlzIDE2IGJ5dGVzLiAgKi8KKworI2RlZmluZSBDQUxMX0RVTU1ZIHsgMHg3ZjAwZmY4MiwgMHgwMjAxYzBhZSwgMHgwMWE1N2YwMywgMHhmMjA0MDMwMiB9CisKKyNkZWZpbmUgQ0FMTF9EVU1NWV9TVEFSVF9PRkZTRVQJMworI2RlZmluZSBDQUxMX0RVTU1ZX0xFTkdUSAkxNgorI2RlZmluZSBDQUxMX0RVTU1ZX0FERFIJCTUKKyNkZWZpbmUgQ0FMTF9EVU1NWV9OQVJHUwkxMQorCisvKiBJbnNlcnQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYXJncyBhbmQgZnVuY3Rpb24gYWRkcmVzcworICAgaW50byBhIGNhbGwgc2VxdWVuY2Ugb2YgdGhlIGFib3ZlIGZvcm0gc3RvcmVkIGF0IERVTU1ZTkFNRS4gICovCisKKyNkZWZpbmUgRklYX0NBTExfRFVNTVkoZHVtbXluYW1lLCBwYywgZnVuLCBuYXJncywgYXJncywgdHlwZSwgZ2NjX3ApICAgCQlcCit7CQkJCQkJCQlcCisJaW50CWZsaXBwZWQ7CQkJCQlcCisJZmxpcHBlZCA9IGZ1biB8IDB4YzAwMDAwMDA7CQkJCVwKKwlmbGlwX2J5dGVzICgmZmxpcHBlZCwgNCk7CQkJCVwKKwkqKChpbnQgKikgKCgoY2hhciAqKSBkdW1teW5hbWUpK0NBTExfRFVNTVlfQUREUikpID0gZmxpcHBlZDsJXAorCWZsaXBwZWQgPSAtIG5hcmdzICogNDsJCQkJCVwKKwlmbGlwX2J5dGVzICgmZmxpcHBlZCwgNCk7CQkJCVwKKwkqKChpbnQgKikgKCgoY2hhciAqKSBkdW1teW5hbWUpK0NBTExfRFVNTVlfTkFSR1MpKSA9IGZsaXBwZWQ7CVwKK30KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbnMzMmsvdW1heC5taCBiL2dkYi9jb25maWcvbnMzMmsvdW1heC5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDNmNmVjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9uczMyay91bWF4Lm1oCkBAIC0wLDAgKzEsNSBAQAorIyBIb3N0OiBFbmNvcmUgcnVubmluZyB1bWF4IDQuMgorWERFUEZJTEVTPSB1bWF4LXhkZXAubworWE1fRklMRT0geG0tdW1heC5oCitOQVRfRklMRT0gbm0tdW1heC5oCitOQVRERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9uczMyay91bWF4Lm10IGIvZ2RiL2NvbmZpZy9uczMyay91bWF4Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOTE2OWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL25zMzJrL3VtYXgubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogRW5jb3JlIHJ1bm5pbmcgdW1heCA0LjIKK1RERVBGSUxFUz0gbnMzMmstdGRlcC5vCitUTV9GSUxFPSB0bS11bWF4LmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvbnMzMmsveG0tbWVybGluLmggYi9nZGIvY29uZmlnL25zMzJrL3htLW1lcmxpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MzI5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL25zMzJrL3htLW1lcmxpbi5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIERlZmluaXRpb25zIHRvIG1ha2UgR0RCIHJ1biBvbiBhIG1lcmxpbiB1bmRlciB1dGVrIDIuMQorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvcmVnLmg+CisKKy8qIFRoaXMgbWFjaGluZSBkb2Vzbid0IGhhdmUgdGhlIHNpZ2ludGVycnVwdCBjYWxsLiAgKi8KKyNkZWZpbmUgTk9fU0lHSU5URVJSVVBUCisKKy8qIFVuZGVyIFV0ZWssIGEgcHRyYWNlJ2QgcHJvY2VzcyBjYW4gYmUgdGhlIG9ubHkgYWN0aXZlIHByb2Nlc3MgZm9yCisgICBhbiBleGVjdXRhYmxlLiAgVGhlcmVmb3JlIGluc3RlYWQgb2YgL2Jpbi9zaCB1c2UgZ2RiLXNoICh3aGljaCBzaG91bGQKKyAgIGp1c3QgYmUgYSBjb3B5IG9mIC9iaW4vc2ggd2hpY2ggaXMgd29ybGQgcmVhZGFibGUgYW5kIHdyaXRlYWJsZSkuICAqLworLyogRklYTUU6IG5hbWUgc2hvdWxkIGJlIHBhc3NlZCBpbiBmcm9tIE1ha2VmaWxlIHNvIGl0IGNhbiB1c2UgcHJlZml4LiAgKi8KKyNkZWZpbmUgU0hFTExfRklMRSAiL3Vzci9sb2NhbC9saWIvZ2RiLXNoIgorCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisKKy8qIFRoaXMgaXMgdGhlIGFtb3VudCB0byBzdWJ0cmFjdCBmcm9tIHUudV9hcjAKKyAgIHRvIGdldCB0aGUgb2Zmc2V0IGluIHRoZSBjb3JlIGZpbGUgb2YgdGhlIHJlZ2lzdGVyIHZhbHVlcy4gICovCisKKyNkZWZpbmUgS0VSTkVMX1VfQUREUiAoMHhmZWYwMDApCisKKyNkZWZpbmUgUkVHSVNURVJfVV9BRERSKGFkZHIsIGJsb2NrZW5kLCByZWdubykgXAoreyAJCQkJCQkJCQlcCisgIHN3aXRjaCAocmVnbm8pIHsJCQkJCQkJXAorICBjYXNlIDA6IGNhc2UgMTogY2FzZSAyOiBjYXNlIDM6IGNhc2UgNDogY2FzZSA1OiBjYXNlIDY6IGNhc2UgNzoJXAorCWFkZHIgPSBibG9ja2VuZCArIChSMCAtIHJlZ25vKSAqIHNpemVvZiAoaW50KTsgYnJlYWs7CQlcCisgIGNhc2UgUENfUkVHTlVNOgkJCQkJCQlcCisgIAlhZGRyID0gYmxvY2tlbmQgKyBQQyAqIHNpemVvZiAoaW50KTsgYnJlYWs7CQkJXAorICBjYXNlIFNQX1JFR05VTToJCQkJCQkJXAorICAJYWRkciA9IGJsb2NrZW5kICsgU1AgKiBzaXplb2YgKGludCk7IGJyZWFrOwkJCVwKKyAgY2FzZSBGUF9SRUdOVU06CQkJCQkJCVwKKyAgCWFkZHIgPSBibG9ja2VuZCArIEZQICogc2l6ZW9mIChpbnQpOyBicmVhazsJCQlcCisgIGNhc2UgUFNfUkVHTlVNOgkJCQkJCQlcCisgIAlhZGRyID0gYmxvY2tlbmQgKyAxMiAqIHNpemVvZiAoaW50KTsgYnJlYWs7CQkJXAorICBjYXNlIEZQU19SRUdOVU06CQkJCQkJCVwKKyAgCWFkZHIgPSAxMDg7IGJyZWFrOwkJCQkJCVwKKyAgY2FzZSBGUDBfUkVHTlVNICsgMDogY2FzZSBGUDBfUkVHTlVNICsgMToJCQkJXAorICBjYXNlIEZQMF9SRUdOVU0gKyAyOiBjYXNlIEZQMF9SRUdOVU0gKyAzOiAJCQkJXAorICBjYXNlIEZQMF9SRUdOVU0gKyA0OiBjYXNlIEZQMF9SRUdOVU0gKyA1OiAJCQkJXAorICBjYXNlIEZQMF9SRUdOVU0gKyA2OiBjYXNlIEZQMF9SRUdOVU0gKyA3OiAJCQkJXAorICAJYWRkciA9IDc2ICsgKHJlZ25vIC0gRlAwX1JFR05VTSkgKiBzaXplb2YgKGZsb2F0KTsgYnJlYWs7CVwKKyAgY2FzZSBMUDBfUkVHTlVNICsgMDogY2FzZSBMUDBfUkVHTlVNICsgMToJCQkJXAorICBjYXNlIExQMF9SRUdOVU0gKyAyOiBjYXNlIExQMF9SRUdOVU0gKyAzOgkJCQlcCisgIAlhZGRyID0gNzYgKyAocmVnbm8gLSBMUDBfUkVHTlVNKSAqIHNpemVvZiAoZG91YmxlKTsgYnJlYWs7CVwKKyAgZGVmYXVsdDoJCQkJCQkJCVwKKyAgCXByaW50ZiAoImJhZCBhcmd1bWVudCB0byBSRUdJU1RFUl9VX0FERFIgJWRcbiIsIHJlZ25vKTsJCVwKKwlhYm9ydCAoKTsJCQkJCQkJXAorICB9CQkJCQkJCQkJXAorfQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9uczMyay94bS1uYnNkLmggYi9nZGIvY29uZmlnL25zMzJrL3htLW5ic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjhjMGJjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9uczMyay94bS1uYnNkLmgKQEAgLTAsMCArMSwyMSBAQAorLyogUGFyYW1ldGVycyBmb3IgZXhlY3V0aW9uIG9uIGEgbnMzMmsgcnVubmluZyBOZXRCU0QsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBHZXQgZ2VuZXJpYyBOZXRCU0QgaG9zdCBkZWZpbml0aW9ucy4gKi8KKyNpbmNsdWRlICJ4bS1uYnNkLmgiCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL25zMzJrL3htLW5zMzJrbTMuaCBiL2dkYi9jb25maWcvbnMzMmsveG0tbnMzMmttMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMDhlNjcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL25zMzJrL3htLW5zMzJrbTMuaApAQCAtMCwwICsxLDIzIEBACisvKiBEZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gTWFjaCAzIG9uIGFuIE5hdGlvbmFsIG5zMzJrCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgorCisvKiBEbyBpbXBsZW1lbnQgdGhlIGF0dGFjaCBhbmQgZGV0YWNoIGNvbW1hbmRzLiAgKi8KKyNkZWZpbmUgQVRUQUNIX0RFVEFDSAkxCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL25zMzJrL3htLXVtYXguaCBiL2dkYi9jb25maWcvbnMzMmsveG0tdW1heC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYjAwNzEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL25zMzJrL3htLXVtYXguaApAQCAtMCwwICsxLDI2IEBACisvKiBEZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gYW4gZW5jb3JlIHVuZGVyIHVtYXggNC4yCisgICBDb3B5cmlnaHQgMTk4NywgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisKKyNkZWZpbmUgSEFWRV9XQUlUX1NUUlVDVAorCisvKiBEb2Vzbid0IGhhdmUgc2lnaW50ZXJ1cHQuICAqLworI2RlZmluZSBOT19TSUdJTlRFUlJVUFQKKwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9wYS9ocHBhYnNkLm1oIGIvZ2RiL2NvbmZpZy9wYS9ocHBhYnNkLm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDJkNGMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3BhL2hwcGFic2QubWgKQEAgLTAsMCArMSw3IEBACisjIEhvc3Q6IEhld2xldHQtUGFja2FyZCBQQS1SSVNDIG1hY2hpbmUsIHJ1bm5pbmcgQlNECitYREVQRklMRVM9ICBzZXItdGNwLm8KK1hNX0ZJTEU9IHhtLWhwcGFiLmgKK05BVF9GSUxFPSBubS1ocHBhYi5oCitOQVRERVBGSUxFUz0gaHBwYWItbmF0Lm8gY29yZWxvdy5vIGNvcmUtYW91dC5vIGluZnRhcmcubyBmb3JrLWNoaWxkLm8gc29tcmVhZC5vIGluZnB0cmFjZS5vIGhwLXBzeW10YWItcmVhZC5vIGhwLXN5bXRhYi1yZWFkLm8gc29tc29saWIubworCitHREJTRVJWRVJfREVQRklMRVM9IGxvdy1ocHBhYnNkLm8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcGEvaHBwYWJzZC5tdCBiL2dkYi9jb25maWcvcGEvaHBwYWJzZC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmMwMzgwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wYS9ocHBhYnNkLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IEhQIFBBLVJJU0MgcnVubmluZyBic2QKK1RERVBGSUxFUz0gaHBwYS10ZGVwLm8KK1RNX0ZJTEU9IHRtLWhwcGFiLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcGEvaHBwYWhwdXgubWggYi9nZGIvY29uZmlnL3BhL2hwcGFocHV4Lm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMzAyNDQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3BhL2hwcGFocHV4Lm1oCkBAIC0wLDAgKzEsOSBAQAorIyBIb3N0OiBIZXdsZXR0LVBhY2thcmQgUEEtUklTQyBtYWNoaW5lLCBydW5uaW5nIEhQVVgKKworWE1fRklMRT0geG0taHBwYWguaAorWERFUEZJTEVTPSBzZXItdGNwLm8KKworTkFUX0ZJTEU9IG5tLWhwcGFoLmgKK05BVERFUEZJTEVTPSBocHBhaC1uYXQubyBjb3JlbG93Lm8gY29yZS1hb3V0Lm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBzb21yZWFkLm8gaW5mcHRyYWNlLm8gaHAtcHN5bXRhYi1yZWFkLm8gaHAtc3ltdGFiLXJlYWQubyBzb21zb2xpYi5vCisKK0hPU1RfSVBDPS1EQlNEX0lQQyAtRFBPU0lYX1dBSVQKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcGEvaHBwYWhwdXgubXQgYi9nZGIvY29uZmlnL3BhL2hwcGFocHV4Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZGIzZjUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3BhL2hwcGFocHV4Lm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IEhQIFBBLVJJU0MgcnVubmluZyBocHV4CitUREVQRklMRVM9IGhwcGEtdGRlcC5vCitUTV9GSUxFPSB0bS1ocHBhaC5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3BhL2hwcGFvc2YubWggYi9nZGIvY29uZmlnL3BhL2hwcGFvc2YubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkZTljMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcGEvaHBwYW9zZi5taApAQCAtMCwwICsxLDkgQEAKKyMgSG9zdDogSGV3bGV0dC1QYWNrYXJkIFBBLVJJU0MgbWFjaGluZSwgcnVubmluZyBCU0QKK1hERVBGSUxFUz0gc2VyLXRjcC5vCitYTV9GSUxFPSB4bS1ocHBhYi5oCitOQVRfRklMRT0gbm0taHBwYW8uaAorTkFUREVQRklMRVM9IGZvcmstY2hpbGQubyBtMy1uYXQubyBocHBhbTMtbmF0Lm8gc29tcmVhZC5vIGhwLXBzeW10YWItcmVhZC5vIGhwLXN5bXRhYi1yZWFkLm8gc29tc29saWIubworTkFUX0NMSUJTPSAtbG1hY2hpZCAtbG5ldG5hbWUgLWxtYWNoCisKK0dEQlNFUlZFUl9ERVBGSUxFUz0gbG93LWhwcGFic2QubworCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3BhL2hwcGFvc2YubXQgYi9nZGIvY29uZmlnL3BhL2hwcGFvc2YubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1NDAyMwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcGEvaHBwYW9zZi5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBIUCBQQS1SSVNDIHJ1bm5pbmcgT1NGMQorVERFUEZJTEVTPSBocHBhLXRkZXAubworVE1fRklMRT0gdG0taHBwYW8uaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9wYS9ocHBhcHJvLm10IGIvZ2RiL2NvbmZpZy9wYS9ocHBhcHJvLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NTFiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3BhL2hwcGFwcm8ubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogUEEgYmFzZWQgZGVidWcgbW9uaXRvcgorVERFUEZJTEVTPSBocHBhLXRkZXAubyBvcDUwLXJvbS5vIHc4OWstcm9tLm8gbW9uaXRvci5vIHhtb2RlbS5vIGRzcmVjLm8KK1RNX0ZJTEU9IHRtLXByby5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3BhL2hwdXgxMDIwLm1oIGIvZ2RiL2NvbmZpZy9wYS9ocHV4MTAyMC5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGVhZTExCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wYS9ocHV4MTAyMC5taApAQCAtMCwwICsxLDExIEBACisjIEhvc3Q6IEhld2xldHQtUGFja2FyZCBQQS1SSVNDIG1hY2hpbmUsIHJ1bm5pbmcgSFBVWCAxMC4yMAorCitNSF9DRkxBR1MgPSAtRF9fSFBfQ1VSU0VTCisKK1hNX0ZJTEU9IHhtLWhwcGFoLmgKK1hERVBGSUxFUz0gc2VyLXRjcC5vCisKK05BVF9GSUxFPSBubS1ocHBhaC5oCitOQVRERVBGSUxFUz0gaHBwYWgtbmF0Lm8gY29yZWxvdy5vIGNvcmUtYW91dC5vIGluZnRhcmcubyBmb3JrLWNoaWxkLm8gaW5mcHRyYWNlLm8gc29tcmVhZC5vIGhwLXBzeW10YWItcmVhZC5vIGhwLXN5bXRhYi1yZWFkLm8gc29tc29saWIubworCitIT1NUX0lQQz0tREJTRF9JUEMgLURQT1NJWF9XQUlUCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3BhL2hwdXgxMDIwLm10IGIvZ2RiL2NvbmZpZy9wYS9ocHV4MTAyMC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODU2ZDhjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wYS9ocHV4MTAyMC5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBIUCBQQS1SSVNDIHJ1bm5pbmcgaHB1eAorVERFUEZJTEVTPSBocHBhLXRkZXAubyByZW1vdGUtcGEubyBzb21zb2xpYi5vIGNvcmVsb3cubworVE1fRklMRT0gdG0taHBwYWguaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9wYS9ocHV4MTEwMC5taCBiL2dkYi9jb25maWcvcGEvaHB1eDExMDAubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmYmQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcGEvaHB1eDExMDAubWgKQEAgLTAsMCArMSwxMSBAQAorIyBIb3N0OiBIZXdsZXR0LVBhY2thcmQgUEEtUklTQyBtYWNoaW5lLCBydW5uaW5nIEhQVVggMTEuMDAKKworTUhfQ0ZMQUdTID0gLURfX0hQX0NVUlNFUworCitYTV9GSUxFPSB4bS1ocHBhaC5oCitYREVQRklMRVM9IHNlci10Y3AubworCitOQVRfRklMRT0gbm0taHBwYWgxMS5oCitOQVRERVBGSUxFUz0gaHBwYWgtbmF0Lm8gY29yZWxvdy5vIGNvcmUtYW91dC5vIGluZnRhcmcubyBmb3JrLWNoaWxkLm8gaW5mdHRyYWNlLm8gc29tcmVhZC5vIGhwLXBzeW10YWItcmVhZC5vIGhwLXN5bXRhYi1yZWFkLm8gc29tc29saWIubworCitIT1NUX0lQQz0tREJTRF9JUEMgLURQT1NJWF9XQUlUCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3BhL2hwdXgxMTAwLm10IGIvZ2RiL2NvbmZpZy9wYS9ocHV4MTEwMC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDVmNzNhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wYS9ocHV4MTEwMC5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBIUCBQQS1SSVNDIHJ1bm5pbmcgSFBVWCAxMS4wMAorVERFUEZJTEVTPSBocHBhLXRkZXAubyByZW1vdGUtcGEubyBzb21zb2xpYi5vCitUTV9GSUxFPSB0bS1ocHBhaC5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3BhL25tLWhwcGFiLmggYi9nZGIvY29uZmlnL3BhL25tLWhwcGFiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI2MzY3NAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcGEvbm0taHBwYWIuaApAQCAtMCwwICsxLDEzNSBAQAorLyogSFBQQSBQQS1SSVNDIG1hY2hpbmUgbmF0aXZlIHN1cHBvcnQgZm9yIEJTRCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAic29tc29saWIuaCIKKworI2RlZmluZSBVX1JFR1NfT0ZGU0VUIDAKKworI2RlZmluZSBLRVJORUxfVV9BRERSIDAKKworLyogV2hhdCBhIGNvaW5jaWRlbmNlISAqLworI2RlZmluZSBSRUdJU1RFUl9VX0FERFIoYWRkciwgYmxvY2tlbmQsIHJlZ25vKQkJCQlcCit7IGFkZHIgPSAoaW50KShibG9ja2VuZCkgKyBSRUdJU1RFUl9CWVRFIChyZWdubyk7fQorCisvKiAzcmQgYXJndW1lbnQgdG8gcHRyYWNlIGlzIHN1cHBvc2VkIHRvIGJlIGEgY2FkZHJfdC4gICovCisKKyNkZWZpbmUJUFRSQUNFX0FSRzNfVFlQRSBjYWRkcl90CisKKy8qIEhQVVggOC4wLCBpbiBpdHMgaW5maW5pdGUgd2lzZG9tLCBoYXMgY2hvc2VuIHRvIHByb3RvdHlwZSBwdHJhY2UKKyAgIHdpdGggZml2ZSBhcmd1bWVudHMsIHNvIHByb2dyYW1zIHdyaXR0ZW4gZm9yIG5vcm1hbCBwdHJhY2UgbG9zZS4gICovCisjZGVmaW5lIEZJVkVfQVJHX1BUUkFDRQorCisKKy8qIFRoaXMgbWFjcm8gZGVmaW5lcyB0aGUgcmVnaXN0ZXIgbnVtYmVycyAoZnJvbSBSRUdJU1RFUl9OQU1FUykgdGhhdAorICAgYXJlIGVmZmVjdGl2ZWx5IHVuYXZhaWxhYmxlIHRvIHRoZSB1c2VyIHRocm91Z2ggcHRyYWNlKCkuICBJdCBhbGxvd3MKKyAgIHVzIHRvIGluY2x1ZGUgdGhlIHdob2xlIHJlZ2lzdGVyIHNldCBpbiBSRUdJU1RFUl9OQU1FUyAoaW5vcmRlciB0bworICAgYmV0dGVyIHN1cHBvcnQgcmVtb3RlIGRlYnVnZ2luZykuICBJZiBpdCBpcyB1c2VkIGluCisgICBmZXRjaC9zdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMoKSBnZGIgd2lsbCBub3QgY29tcGxhaW4gYWJvdXQgSS9PIGVycm9ycworICAgb24gZmV0Y2hpbmcgdGhlc2UgcmVnaXN0ZXJzLiAgSWYgYWxsIHJlZ2lzdGVycyBpbiBSRUdJU1RFUl9OQU1FUworICAgYXJlIGF2YWlsYWJsZSwgdGhlbiByZXR1cm4gZmFsc2UgKDApLiAgKi8KKworI2RlZmluZSBDQU5OT1RfU1RPUkVfUkVHSVNURVIocmVnbm8pICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICgocmVnbm8pID09IDApIHx8ICAgICBcCisgICAgICAgICAgICAgICAgICAgKChyZWdubykgPT0gUENTUV9IRUFEX1JFR05VTSkgfHwgXAorICAgICAgICAgICAgICAgICAgICgocmVnbm8pID49IFBDU1FfVEFJTF9SRUdOVU0gJiYgKHJlZ25vKSA8IElQU1dfUkVHTlVNKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICgocmVnbm8pID4gSVBTV19SRUdOVU0gJiYgKHJlZ25vKSA8IEZQNF9SRUdOVU0pCisKKy8qIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyBpcyBpbiBocHBhYi1uYXQuYy4gICovCisjZGVmaW5lIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUworCisvKiBhdHRhY2gvZGV0YWNoIHdvcmtzIHRvIHNvbWUgZXh0ZW50IHVuZGVyIEJTRCBhbmQgSFBVWC4gIFNvIGxvbmcKKyAgIGFzIHRoZSBwcm9jZXNzIHlvdSdyZSBhdHRhY2hpbmcgdG8gaXNuJ3QgYmxvY2tlZCB3YWl0aW5nIG9uIGlvLAorICAgYmxvY2tlZCB3YWl0aW5nIG9uIGEgc2lnbmFsLCBvciBpbiBhIHN5c3RlbSBjYWxsIHRoaW5ncyB3b3JrIAorICAgZmluZS4gIChUaGUgcHJvYmxlbXMgaW4gdGhvc2UgY2FzZXMgYXJlIHJlbGF0ZWQgdG8gdGhlIGZhY3QgdGhhdAorICAgdGhlIGtlcm5lbCBjYW4ndCBwcm92aWRlIGNvbXBsZXRlIHJlZ2lzdGVyIGluZm9ybWF0aW9uIGZvciB0aGUKKyAgIHRhcmdldCBwcm9jZXNzLi4uICBXaGljaCByZWFsbHkgcGlzc2VzIG9mZiBHREIuKSAgKi8KKworI2RlZmluZSBBVFRBQ0hfREVUQUNICisKKy8qIFRoZSBQQS1CU0Qga2VybmVsIGhhcyBzdXBwb3J0IGZvciB1c2luZyB0aGUgZGF0YSBtZW1vcnkgYnJlYWsgYml0CisgICB0byBpbXBsZW1lbnQgZmFzdCB3YXRjaHBvaW50cy4KKworICAgV2F0Y2hwb2ludHMgb24gdGhlIFBBIGFjdCBtdWNoIGxpa2UgdHJhZGl0aW9uYWwgcGFnZSBwcm90ZWN0aW9uCisgICBzY2hlbWVzLCBidXQgd2l0aCBzb21lIG5vdGFibGUgZGlmZmVyZW5jZXMuCisKKyAgIEZpcnN0LCBhIHNwZWNpYWwgYml0IGluIHRoZSBwYWdlIHRhYmxlIGVudHJ5IGlzIHVzZWQgdG8gY2F1c2UKKyAgIGEgdHJhcCB3aGVuIGEgc3BlY2lmaWMgcGFnZSBpcyB3cml0dGVuIHRvLiAgVGhpcyBhdm9pZHMgaGF2aW5nCisgICB0byBvdmVybG9hZCB3YXRjaHBvaW50cyBvbiB0aGUgcGFnZSBwcm90ZWN0aW9uIGJpdHMuICBUaGlzIG1ha2VzCisgICBpdCBwb3NzaWJsZSBmb3IgdGhlIGtlcm5lbCB0byBlYXNpbHkgZGVjaWRlIGlmIGEgdHJhcCB3YXMgY2F1c2VkCisgICBieSBhIHdhdGNocG9pbnQgb3IgYnkgdGhlIHVzZXIgd3JpdGluZyB0byBwcm90ZWN0ZWQgbWVtb3J5IGFuZCBjYW4KKyAgIHNpZ25hbCB0aGUgdXNlciBwcm9ncmFtIGRpZmZlcmVudGx5IGluIGVhY2ggY2FzZS4gIAorICAgCisgICBTZWNvbmQsIHRoZSBQQSBoYXMgYSBiaXQgaW4gdGhlIHByb2Nlc3NvciBzdGF0dXMgd29yZCB3aGljaCBjYXVzZXMKKyAgIGRhdGEgbWVtb3J5IGJyZWFrcG9pbnRzIChha2Egd2F0Y2hwb2ludHMpIHRvIGJlIGRpc2FibGVkIGZvciBhIHNpbmdsZQorICAgaW5zdHJ1Y3Rpb24uICBUaGlzIGJpdCBjYW4gYmUgdXNlZCB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgdW5wcm90ZWN0aW5nCisgICBhbmQgcmVwcm90ZWN0aW5nIHBhZ2VzIHdoZW4gaXQgYmVjb21lcyBuZWNlc3NhcnkgdG8gc3RlcCBvdmVyIGEgd2F0Y2hwb2ludC4KKworCisgICBXaGVuIHRoZSBrZXJuZWwgcmVjZWl2ZXMgYSB0cmFwIGluZGljYXRpbmcgYSB3cml0ZSB0byBhIHBhZ2Ugd2hpY2gKKyAgIGlzIGJlaW5nIHdhdGNoZWQsIHRoZSBrZXJuZWwgcGVyZm9ybXMgYSBjb3VwbGUgb2Ygc2ltcGxlIGFjdGlvbnMuICBGaXJzdAorICAgaXMgc2V0cyB0aGUgbWFnaWMgImRpc2FibGUgbWVtb3J5IGJyZWFrcG9pbnQiIGJpdCBpbiB0aGUgcHJvY2Vzc29yCisgICBzdGF0dXMgd29yZCwgaXQgdGhlbiBzZW5kcyBhIFNJR1RSQVAgdG8gdGhlIHByb2Nlc3Mgd2hpY2ggY2F1c2VkIHRoZQorICAgdHJhcC4KKworICAgR0RCIHdpbGwgdGFrZSBjb250cm9sIGFuZCBjYXRjaCB0aGUgc2lnbmFsIGZvciB0aGUgaW5mZXJpb3IuICBHREIgdGhlbgorICAgZXhhbWluZXMgdGhlIFBTVy1YIGJpdCB0byBkZXRlcm1pbmUgaWYgdGhlIFNJR1RSQVAgd2FzIGNhdXNlZCBieSBhIAorICAgd2F0Y2hwb2ludCBmaXJpbmcuICBJZiBzbyBHREIgc2luZ2xlIHN0ZXBzIHRoZSBpbmZlcmlvciBvdmVyIHRoZQorICAgaW5zdHJ1Y3Rpb24gd2hpY2ggY2F1c2VkIHRoZSB3YXRjaHBvaW50IHRvIHRyaWdnZXIgKG5vdGUgYmVjYXVzZSB0aGUKKyAgIGtlcm5lbCBkaXNhYmxlZCB0aGUgZGF0YSBtZW1vcnkgYnJlYWsgYml0IGZvciBvbmUgaW5zdHJ1Y3Rpb24gbm8gdHJhcAorICAgd2lsbCBiZSB0YWtlbiEpLiAgR0RCIHdpbGwgdGhlbiBkZXRlcm1pbmVzIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24gdG8KKyAgIHRha2UuICAodGhpcyBtYXkgaW5jbHVkZSByZXN0YXJ0aW5nIHRoZSBpbmZlcmlvciBpZiB0aGUgd2F0Y2hwb2ludAorICAgZmlyZWQgYmVjYXVzZSBvZiBhIHdyaXRlIHRvIGFuIGFkZHJlc3Mgb24gdGhlIHNhbWUgcGFnZSBhcyBhIHdhdGNocG9pbnQsCisgICBidXQgbm8gd3JpdGUgdG8gdGhlIHdhdGNoZWQgYWRkcmVzcyBvY2N1cmVkKS4gICovCisKKyNkZWZpbmUgVEFSR0VUX0hBU19IQVJEV0FSRV9XQVRDSFBPSU5UUwkvKiBFbmFibGUgdGhlIGNvZGUgaW4gcHJvY2ZzLmMgKi8KKworLyogVGhlIFBBIGNhbiB3YXRjaCBhbnkgbnVtYmVyIG9mIGxvY2F0aW9ucywgdGhlcmUncyBubyBuZWVkIGZvciBpdCB0byByZWplY3QKKyAgIGFueXRoaW5nIChnZW5lcmljIHJvdXRpbmVzIGFscmVhZHkgY2hlY2sgdGhhdCBhbGwgaW50ZXJtZWRpYXRlcyBhcmUKKyAgIGluIG1lbW9yeSkuICAqLworI2RlZmluZSBUQVJHRVRfQ0FOX1VTRV9IQVJEV0FSRV9XQVRDSFBPSU5UKHR5cGUsIGNudCwgb3QpIFwKKwkoKHR5cGUpID09IGJwX2hhcmR3YXJlX3dhdGNocG9pbnQpCisKKy8qIFdoZW4gYSBoYXJkd2FyZSB3YXRjaHBvaW50IGZpcmVzIG9mZiB0aGUgUEMgd2lsbCBiZSBsZWZ0IGF0IHRoZQorICAgaW5zdHJ1Y3Rpb24gd2hpY2ggY2F1c2VkIHRoZSB3YXRjaHBvaW50LiAgSXQgd2lsbCBiZSBuZWNlc3NhcnkgZm9yCisgICBHREIgdG8gc3RlcCBvdmVyIHRoZSB3YXRjaHBvaW50LgorCisgICBPbiBhIFBBIHJ1bm5pbmcgQlNELCBpdCBpcyB0cml2aWFsIHRvIGlkZW50aWZ5IHdoZW4gaXQgd2lsbCBiZQorICAgbmVjZXNzYXJ5IHRvIHN0ZXAgb3ZlciBhIGhhcmR3YXJlIHdhdGNocG9pbnQgYXMgd2UgY2FuIGV4YW1pbmUKKyAgIHRoZSBQU1ctWCBiaXQuICBJZiB0aGUgYml0IGlzIG9uLCB0aGVuIHdlIHRyYXBwZWQgYmVjYXVzZSBvZiBhIAorICAgd2F0Y2hwb2ludCwgZWxzZSB3ZSB0cmFwcGVkIGZvciBzb21lIG90aGVyIHJlYXNvbi4gICovCisjZGVmaW5lIFNUT1BQRURfQllfV0FUQ0hQT0lOVChXKSBcCisgICgoVykua2luZCA9PSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRCBcCisgICAmJiAoVykudmFsdWUuc2lnID09IFRBUkdFVF9TSUdOQUxfVFJBUCBcCisgICAmJiAoKGludCkgcmVhZF9yZWdpc3RlciAoSVBTV19SRUdOVU0pICYgMHgwMDEwMDAwMCkpCisKKy8qIFRoZSBQQSBjYW4gc2luZ2xlIHN0ZXAgb3ZlciBhIHdhdGNocG9pbnQgaWYgdGhlIGtlcm5lbCBoYXMgc2V0IHRoZQorICAgIlgiIGJpdCBpbiB0aGUgcHJvY2Vzc29yIHN0YXR1cyB3b3JkIChkaXNhYmxlIGRhdGEgbWVtb3J5IGJyZWFrcG9pbnQKKyAgIGZvciBvbmUgaW5zdHJ1Y3Rpb24pLgorCisgICBUaGUga2VybmVsIHdpbGwgYWx3YXlzIHNldCB0aGlzIGJpdCBiZWZvcmUgbm90aWZ5aW5nIHRoZSBpbmZlcmlvcgorICAgdGhhdCBpdCBoaXQgYSB3YXRjaHBvaW50LiAgVGh1cywgdGhlIGluZmVyaW9yIGNhbiBzaW5nbGUgc3RlcCBvdmVyCisgICB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggY2F1c2VkIHRoZSB3YXRjaHBvaW50IHRvIGZpcmUuICBUaGlzIGF2b2lkcworICAgdGhlIHRyYWRpdGlvbmFsIG5lZWQgdG8gZGlzYWJsZSB0aGUgd2F0Y2hwb2ludCwgc3RlcCB0aGUgaW5mZXJpb3IsCisgICB0aGVuIGVuYWJsZSB0aGUgd2F0Y2hwb2ludCBhZ2Fpbi4gICovCisjZGVmaW5lIEhBVkVfU1RFUFBBQkxFX1dBVENIUE9JTlQKKworLyogVXNlIHRoZXNlIG1hY3JvcyBmb3Igd2F0Y2hwb2ludCBpbnNlcnRpb24vZGVsZXRpb24uICAqLworLyogdHlwZSBjYW4gYmUgMDogd3JpdGUgd2F0Y2gsIDE6IHJlYWQgd2F0Y2gsIDI6IGFjY2VzcyB3YXRjaCAocmVhZC93cml0ZSkgKi8KKyNkZWZpbmUgdGFyZ2V0X2luc2VydF93YXRjaHBvaW50KGFkZHIsIGxlbiwgdHlwZSkgaHBwYV9zZXRfd2F0Y2hwb2ludCAoYWRkciwgbGVuLCAxKQorI2RlZmluZSB0YXJnZXRfcmVtb3ZlX3dhdGNocG9pbnQoYWRkciwgbGVuLCB0eXBlKSBocHBhX3NldF93YXRjaHBvaW50IChhZGRyLCBsZW4sIDApCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3BhL25tLWhwcGFoLmggYi9nZGIvY29uZmlnL3BhL25tLWhwcGFoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY1ZWYwMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcGEvbm0taHBwYWguaApAQCAtMCwwICsxLDI4MSBAQAorLyogTmF0aXZlIHN1cHBvcnQgZm9yIEhQUEEtUklTQyBtYWNoaW5lIHJ1bm5pbmcgSFBVWCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFVfUkVHU19PRkZTRVQgMAorCisjZGVmaW5lIEtFUk5FTF9VX0FERFIgMAorCisvKiBXaGF0IGEgY29pbmNpZGVuY2UhICovCisjZGVmaW5lIFJFR0lTVEVSX1VfQUREUihhZGRyLCBibG9ja2VuZCwgcmVnbm8pCQkJCVwKK3sgYWRkciA9IChpbnQpKGJsb2NrZW5kKSArIFJFR0lTVEVSX0JZVEUgKHJlZ25vKTt9CisKKy8qIEhQVVggOC4wLCBpbiBpdHMgaW5maW5pdGUgd2lzZG9tLCBoYXMgY2hvc2VuIHRvIHByb3RvdHlwZSBwdHJhY2UKKyAgIHdpdGggZml2ZSBhcmd1bWVudHMsIHNvIHByb2dyYW1zIHdyaXR0ZW4gZm9yIG5vcm1hbCBwdHJhY2UgbG9zZS4gICovCisjZGVmaW5lIEZJVkVfQVJHX1BUUkFDRQorCisvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdGhlIHRleHQgcmVnaW9uIGlzIHNvIHRoYXQgd2UgdXNlIHRoZQorICAgYXBwcm9wcmlhdGUgcHRyYWNlIG9wZXJhdG9yIHRvIG1hbmlwdWxhdGUgdGV4dC4gIFNpbXBseSByZWFkaW5nL3dyaXRpbmcKKyAgIHVzZXIgc3BhY2Ugd2lsbCBjcmFwIG91dCBIUFVYLiAgKi8KKyNkZWZpbmUgTkVFRF9URVhUX1NUQVJUX0VORCAxCisKKy8qIFRoaXMgbWFjcm8gZGVmaW5lcyB0aGUgcmVnaXN0ZXIgbnVtYmVycyAoZnJvbSBSRUdJU1RFUl9OQU1FUykgdGhhdAorICAgYXJlIGVmZmVjdGl2ZWx5IHVuYXZhaWxhYmxlIHRvIHRoZSB1c2VyIHRocm91Z2ggcHRyYWNlKCkuICBJdCBhbGxvd3MKKyAgIHVzIHRvIGluY2x1ZGUgdGhlIHdob2xlIHJlZ2lzdGVyIHNldCBpbiBSRUdJU1RFUl9OQU1FUyAoaW5vcmRlciB0bworICAgYmV0dGVyIHN1cHBvcnQgcmVtb3RlIGRlYnVnZ2luZykuICBJZiBpdCBpcyB1c2VkIGluCisgICBmZXRjaC9zdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMoKSBnZGIgd2lsbCBub3QgY29tcGxhaW4gYWJvdXQgSS9PIGVycm9ycworICAgb24gZmV0Y2hpbmcgdGhlc2UgcmVnaXN0ZXJzLiAgSWYgYWxsIHJlZ2lzdGVycyBpbiBSRUdJU1RFUl9OQU1FUworICAgYXJlIGF2YWlsYWJsZSwgdGhlbiByZXR1cm4gZmFsc2UgKDApLiAgKi8KKworI2RlZmluZSBDQU5OT1RfU1RPUkVfUkVHSVNURVIocmVnbm8pICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICgocmVnbm8pID09IDApIHx8ICAgICBcCisgICAgICAgICAgICAgICAgICAgKChyZWdubykgPT0gUENTUV9IRUFEX1JFR05VTSkgfHwgXAorICAgICAgICAgICAgICAgICAgICgocmVnbm8pID49IFBDU1FfVEFJTF9SRUdOVU0gJiYgKHJlZ25vKSA8IElQU1dfUkVHTlVNKSB8fCAgXAorICAgICAgICAgICAgICAgICAgICgocmVnbm8pID4gSVBTV19SRUdOVU0gJiYgKHJlZ25vKSA8IEZQNF9SRUdOVU0pCisKKy8qIEluIGhwcGFoLW5hdC5jOiAqLworI2RlZmluZSBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMKKyNkZWZpbmUgQ0hJTERfWEZFUl9NRU1PUlkKKyNkZWZpbmUgQ0hJTERfUE9TVF9GT0xMT1dfSU5GRVJJT1JfQllfQ0xPTkUKKyNkZWZpbmUgQ0hJTERfUE9TVF9GT0xMT1dfVkZPUksKKworLyogV2hpbGUgdGhpcyBpcyBmb3IgdXNlIGJ5IHRocmVhZGVkIHByb2dyYW1zLCBpdCBkb2Vzbid0IGFwcGVhcgorICogdG8gaHVydCBub24tdGhyZWFkZWQgb25lcy4gIFRoaXMgaXMgdXNlZCBpbiBpbmZydW4uYzogKi8KKyNkZWZpbmUgUFJFUEFSRV9UT19QUk9DRUVEKCkgaHBwYV9wcmVwYXJlX3RvX3Byb2NlZWQoKQorZXh0ZXJuIGludCBocHBhX3ByZXBhcmVfdG9fcHJvY2VlZCBQQVJBTVMoKCB2b2lkICkpOworCisvKiBJbiBpbmZwdHJhY2UuYyBvciBpbmZ0dHJhY2UuYzogKi8KKyNkZWZpbmUgQ0hJTERfUElEX1RPX0VYRUNfRklMRQorI2RlZmluZSBDSElMRF9QT1NUX1NUQVJUVVBfSU5GRVJJT1IKKyNkZWZpbmUgQ0hJTERfQUNLTk9XTEVER0VfQ1JFQVRFRF9JTkZFUklPUgorI2RlZmluZSBDSElMRF9JTlNFUlRfRk9SS19DQVRDSFBPSU5UCisjZGVmaW5lIENISUxEX1JFTU9WRV9GT1JLX0NBVENIUE9JTlQKKyNkZWZpbmUgQ0hJTERfSU5TRVJUX1ZGT1JLX0NBVENIUE9JTlQKKyNkZWZpbmUgQ0hJTERfUkVNT1ZFX1ZGT1JLX0NBVENIUE9JTlQKKyNkZWZpbmUgQ0hJTERfSEFTX0ZPUktFRAorI2RlZmluZSBDSElMRF9IQVNfVkZPUktFRAorI2RlZmluZSBDSElMRF9DQU5fRk9MTE9XX1ZGT1JLX1BSSU9SX1RPX0VYRUMKKyNkZWZpbmUgQ0hJTERfSU5TRVJUX0VYRUNfQ0FUQ0hQT0lOVAorI2RlZmluZSBDSElMRF9SRU1PVkVfRVhFQ19DQVRDSFBPSU5UCisjZGVmaW5lIENISUxEX0hBU19FWEVDRAorI2RlZmluZSBDSElMRF9SRVBPUlRFRF9FWEVDX0VWRU5UU19QRVJfRVhFQ19DQUxMCisjZGVmaW5lIENISUxEX0hBU19TWVNDQUxMX0VWRU5UCisjZGVmaW5lIENISUxEX1BPU1RfQVRUQUNICisjZGVmaW5lIENISUxEX1RIUkVBRF9BTElWRQorCisjZGVmaW5lIFJFUVVJUkVfQVRUQUNIKHBpZCkgaHBwYV9yZXF1aXJlX2F0dGFjaChwaWQpCitleHRlcm4gaW50IGhwcGFfcmVxdWlyZV9hdHRhY2ggUEFSQU1TICgoaW50KSk7CisKKyNkZWZpbmUgUkVRVUlSRV9ERVRBQ0gocGlkLHNpZ25hbCkgaHBwYV9yZXF1aXJlX2RldGFjaChwaWQsc2lnbmFsKQorZXh0ZXJuIGludCBocHBhX3JlcXVpcmVfZGV0YWNoIFBBUkFNUyAoKGludCxpbnQpKTsKKworLyogU28gd2UgY2FuIGNsZWFubHkgdXNlIGNvZGUgaW4gaW5mcHRyYWNlLmMuICAqLworI2RlZmluZSBQVF9LSUxMCQlQVF9FWElUCisjZGVmaW5lIFBUX1NURVAJCVBUX1NJTkdMRQorI2RlZmluZSBQVF9DT05USU5VRQlQVF9DT05USU4KKworLyogRklYTUUgSFAgTUVSR0UgOiBQcmV2aW91c2x5LCBQVF9SRFVBUkVBLiB0aGlzIGlzIGFjdHVhbGx5IGZpeGVkCisgICBpbiBnZGItaHAtc25hcHNob3QtOTgwNTA5ICAqLworI2RlZmluZSBQVF9SRUFEX1UJUFRfUlVBUkVBCisjZGVmaW5lIFBUX1dSSVRFX1UJUFRfV1VBUkVBCisjZGVmaW5lIFBUX1JFQURfSQlQVF9SSVVTRVIKKyNkZWZpbmUgUFRfUkVBRF9ECVBUX1JEVVNFUgorI2RlZmluZSBQVF9XUklURV9JCVBUX1dJVVNFUgorI2RlZmluZSBQVF9XUklURV9ECVBUX1dEVVNFUgorCisvKiBhdHRhY2gvZGV0YWNoIHdvcmtzIHRvIHNvbWUgZXh0ZW50IHVuZGVyIEJTRCBhbmQgSFBVWC4gIFNvIGxvbmcKKyAgIGFzIHRoZSBwcm9jZXNzIHlvdSdyZSBhdHRhY2hpbmcgdG8gaXNuJ3QgYmxvY2tlZCB3YWl0aW5nIG9uIGlvLAorICAgYmxvY2tlZCB3YWl0aW5nIG9uIGEgc2lnbmFsLCBvciBpbiBhIHN5c3RlbSBjYWxsIHRoaW5ncyB3b3JrIAorICAgZmluZS4gIChUaGUgcHJvYmxlbXMgaW4gdGhvc2UgY2FzZXMgYXJlIHJlbGF0ZWQgdG8gdGhlIGZhY3QgdGhhdAorICAgdGhlIGtlcm5lbCBjYW4ndCBwcm92aWRlIGNvbXBsZXRlIHJlZ2lzdGVyIGluZm9ybWF0aW9uIGZvciB0aGUKKyAgIHRhcmdldCBwcm9jZXNzLi4uICBXaGljaCByZWFsbHkgcGlzc2VzIG9mZiBHREIuKSAgKi8KKworI2RlZmluZSBBVFRBQ0hfREVUQUNICisKKy8qIEluIGluZnB0cmFjZSBvciBpbmZ0dHJhY2UuYzogKi8KKworLyogU3RhcnRpbmcgd2l0aCBIUC1VWCAxMC4zMCwgc3VwcG9ydCBpcyBwcm92aWRlZCAoaW4gdGhlIGZvcm0gb2YKKyAgIHR0cmFjZSByZXF1ZXN0cykgZm9yIG1lbW9yeS1wcm90ZWN0aW9uLWJhc2VkIGhhcmR3YXJlIHdhdGNocG9pbnRzLgorCisgICBUaGUgMTAuMzAgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgZnVuY3Rpb25zIHJlc2lkZSBpbiBpbmZ0dHJhY2UuYy4KKworICAgU3R1YnMgb2YgdGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgcHJvdmlkZWQgaW4gaW5mcHRyYWNlLmMsIHNvIHRoYXQKKyAgIDEwLjIwIHdpbGwgYXQgbGVhc3QgbGluay4gIEhvd2V2ZXIsIHRoZSAiY2FuIEkgdXNlIGEgZmFzdCB3YXRjaHBvaW50PyIKKyAgIHF1ZXJ5IHdpbGwgYWx3YXlzIHJldHVybiAiTm8iIGZvciAxMC4yMC4gKi8KKworI2RlZmluZSBUQVJHRVRfSEFTX0hBUkRXQVJFX1dBVENIUE9JTlRTCisKKy8qIFRoZSBQQSBjYW4gd2F0Y2ggYW55IG51bWJlciBvZiBsb2NhdGlvbnMgKGdlbmVyaWMgcm91dGluZXMgYWxyZWFkeSBjaGVjaworICAgdGhhdCBhbGwgaW50ZXJtZWRpYXRlcyBhcmUgaW4gd2F0Y2hhYmxlIG1lbW9yeSBsb2NhdGlvbnMpLiAqLworI2RlZmluZSBUQVJHRVRfQ0FOX1VTRV9IQVJEV0FSRV9XQVRDSFBPSU5UKHR5cGUsIGNudCwgb3QpIFwKKyAgICAgICAgaHBwYV9jYW5fdXNlX2h3X3dhdGNocG9pbnQodHlwZSwgY250LCBvdCkKKworLyogVGhlIFBBIGNhbiBhbHNvIHdhdGNoIG1lbW9yeSByZWdpb25zIG9mIGFyYml0cmFyeSBzaXplLCBzaW5jZSB3ZSdyZSB1c2luZworICAgYSBwYWdlLXByb3RlY3Rpb24gc2NoZW1lLiAgKE9uIHNvbWUgdGFyZ2V0cywgYXBwYXJlbnRseSB3YXRjaCByZWdpc3RlcnMKKyAgIGFyZSB1c2VkLCB3aGljaCBjYW4gb25seSBhY2NvbW9kYXRlIHJlZ2lvbnMgb2YgUkVHSVNURVJfU0laRS4pICovCisjZGVmaW5lIFRBUkdFVF9SRUdJT05fU0laRV9PS19GT1JfSFdfV0FUQ0hQT0lOVChieXRlX2NvdW50KSBcCisgICAgICAgICgxKQorCisvKiBIb3dldmVyLCBzb21lIGFkZHJlc3NlcyBtYXkgbm90IGJlIHByb2ZpdGFibGUgdG8gdXNlIGhhcmR3YXJlIHRvIHdhdGNoLAorICAgb3IgbWF5IGJlIGRpZmZpY3VsdCB0byB1bmRlcnN0YW5kIHdoZW4gdGhlIGFkZHJlc3NlZCBvYmplY3QgaXMgb3V0IG9mCisgICBzY29wZSwgYW5kIGhlbmNlIHNob3VsZCBiZSB1bndhdGNoZWQuICBPbiBzb21lIHRhcmdldHMsIHRoaXMgbWF5IGhhdmUKKyAgIHNldmVyZSBwZXJmb3JtYW5jZSBwZW5hbHRpZXMsIHN1Y2ggdGhhdCB3ZSBtaWdodCBhcyB3ZWxsIHVzZSByZWd1bGFyCisgICB3YXRjaHBvaW50cywgYW5kIHNhdmUgKHBvc3NpYmx5IHByZWNpb3VzKSBoYXJkd2FyZSB3YXRjaHBvaW50cyBmb3Igb3RoZXIKKyAgIGxvY2F0aW9ucy4KKworICAgT24gSFAtVVgsIHdlIGNob29zZSBub3QgdG8gd2F0Y2ggc3RhY2stYmFzZWQgYWRkcmVzc2VzLCBiZWNhdXNlCisKKyAgIFsxXSBPdXIgaW1wbGVtZW50YXRpb24gcmVsaWVzIG9uIHBhZ2UgcHJvdGVjdGlvbiB0cmFwcy4gIFRoZSBncmFudWxhcml0eQorICAgb2YgdGhlc2UgaXMgbGFyZ2UgYW5kIHNvIGNhbiBnZW5lcmF0ZSBtYW55IGZhbHNlIGhpdHMsIHdoaWNoIGFyZSBleHBlbnNpdmUKKyAgIHRvIHJlc3BvbmQgdG8uCisKKyAgIFsyXSBXYXRjaGVzIG9mICIqcCIgd2hlcmUgd2UgbWF5IG5vdCBrbm93IHRoZSBzeW1ib2wgdGhhdCBwIHBvaW50cyB0bywKKyAgIG1ha2UgaXQgZGlmZmljdWx0IHRvIGtub3cgd2hlbiB0aGUgYWRkcmVzc2VkIG9iamVjdCBpcyBvdXQgb2Ygc2NvcGUsIGFuZAorICAgaGVuY2Ugc2hvdWxkbid0IGJlIHdhdGNoZWQuICBQYWdlIHByb3RlY3Rpb24gdGhhdCBpc24ndCByZW1vdmVkIHdoZW4gdGhlCisgICBhZGRyZXNzZWQgb2JqZWN0IGlzIG91dCBvZiBzY29wZSB3aWxsIGVpdGhlciBkZWdyYWRlIGV4ZWN1dGlvbiBzcGVlZAorICAgKGZhbHNlIGhpdHMpIG9yIGdpdmUgZmFsc2UgdHJpZ2dlcnMgKHdoZW4gdGhlIGFkZHJlc3MgaXMgcmVjeWNsZWQgYnkKKyAgIG90aGVyIGNhbGxzKS4KKworICAgU2luY2UgZWl0aGVyIG9mIHRoZXNlIHBvaW50cyByZXN1bHRzIGluIGEgc2xvdy1ydW5uaW5nIGluZmVyaW9yLCB3ZSBtaWdodAorICAgYXMgd2VsbCB1c2Ugbm9ybWFsIHdhdGNocG9pbnRzLCBha2Egc2luZ2xlLXN0ZXAgJiB0ZXN0LiAqLworI2RlZmluZSBUQVJHRVRfUkFOR0VfUFJPRklUQUJMRV9GT1JfSFdfV0FUQ0hQT0lOVChwaWQsc3RhcnQsbGVuKSBcCisgICAgICAgIGhwcGFfcmFuZ2VfcHJvZml0YWJsZV9mb3JfaHdfd2F0Y2hwb2ludChwaWQsIHN0YXJ0LCAoTE9OR0VTVCkobGVuKSkKKworLyogT24gSFAtVVgsIHdlJ3JlIHVzaW5nIHBhZ2UtcHJvdGVjdGlvbiB0byBpbXBsZW1lbnQgaGFyZHdhcmUgd2F0Y2hwb2ludHMuCisgICBXaGVuIGFuIGluc3RydWN0aW9uIGF0dGVtcHRzIHRvIHdyaXRlIHRvIGEgd3JpdGUtcHJvdGVjdGVkIG1lbW9yeSBwYWdlLAorICAgYSBTSUdCVVMgaXMgcmFpc2VkLiAgQXQgdGhhdCBwb2ludCwgdGhlIHdyaXRlIGhhcyBub3QgYWN0dWFsbHkgb2NjdXJyZWQuCisKKyAgIFdlIG11c3QgdGhlcmVmb3JlIHJlbW92ZSBwYWdlLXByb3RlY3Rpb25zOyBzaW5nbGUtc3RlcCB0aGUgaW5mZXJpb3IgKHRvCisgICBhbGxvdyB0aGUgd3JpdGUgdG8gaGFwcGVuKTsgcmVzdG9yZSBwYWdlLXByb3RlY3Rpb25zOyBhbmQgY2hlY2sgd2hldGhlcgorICAgYW55IHdhdGNocG9pbnQgdHJpZ2dlcmVkLgorCisgICBJZiBub25lIGRpZCwgdGhlbiB0aGUgd3JpdGUgd2FzIHRvIGEgIm5lYXJieSIgbG9jYXRpb24gdGhhdCBqdXN0IGhhcHBlbnMKKyAgIHRvIGZhbGwgb24gdGhlIHNhbWUgcGFnZSBhcyBhIHdhdGNoZWQgbG9jYXRpb24sIGFuZCBzbyBjYW4gYmUgaWdub3JlZC4KKworICAgVGhlIG9ubHkgaW50ZW5kZWQgY2xpZW50IG9mIHRoaXMgbWFjcm8gaXMgd2FpdF9mb3JfaW5mZXJpb3IoKSwgaW4gaW5mcnVuLmMuCisgICBXaGVuIEhBVkVfTk9OU1RFUFBBQkxFX1dBVENIUE9JTlQgaXMgdHJ1ZSwgdGhhdCBmdW5jdGlvbiB3aWxsIHRha2UgY2FyZQorICAgb2YgdGhlIHN0ZXBwaW5nICYgZXRjLiAqLworCisjZGVmaW5lIFNUT1BQRURfQllfV0FUQ0hQT0lOVChXKSBcCisgICAgICAgICgoVy5raW5kID09IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEKSAmJiBcCisgICAgICAgICAoc3RvcF9zaWduYWwgPT0gVEFSR0VUX1NJR05BTF9CVVMpICYmIFwKKyAgICAgICAgICEgc3RlcHBlZF9hZnRlcl9zdG9wcGVkX2J5X3dhdGNocG9pbnQgJiYgXAorICAgICAgICAgYnBzdGF0X2hhdmVfYWN0aXZlX2h3X3dhdGNocG9pbnRzICgpKQorCisvKiBXaGVuIGEgaGFyZHdhcmUgd2F0Y2hwb2ludCB0cmlnZ2Vycywgd2UnbGwgbW92ZSB0aGUgaW5mZXJpb3IgcGFzdCBpdAorICAgYnkgcmVtb3ZpbmcgYWxsIGV2ZW50cG9pbnRzOyBzdGVwcGluZyBwYXN0IHRoZSBpbnN0cnVjdGlvbiB0aGF0IGNhdXNlZAorICAgdGhlIHRyaWdnZXI7IHJlaW5zZXJ0aW5nIGV2ZW50cG9pbnRzOyBhbmQgY2hlY2tpbmcgd2hldGhlciBhbnkgd2F0Y2hlZAorICAgbG9jYXRpb24gY2hhbmdlZC4gKi8KKyNkZWZpbmUgSEFWRV9OT05TVEVQUEFCTEVfV0FUQ0hQT0lOVAorCisvKiBPdXIgaW1wbGVtZW50YXRpb24gb2YgImhhcmR3YXJlIiB3YXRjaHBvaW50cyB1c2VzIG1lbW9yeSBwYWdlLXByb3RlY3Rpb24KKyAgIGZhdWx0cy4gIEhvd2V2ZXIsIEhQLVVYIGhhcyB1bmZvcnR1bmF0ZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiB0aGVzZSBhbmQKKyAgIHN5c3RlbSBjYWxsczsgYmFzaWNhbGx5LCBpdCdzIHVuc2FmZSB0byBoYXZlIHBhZ2UgcHJvdGVjdGlvbnMgb24gd2hlbiBhCisgICBzeXNjYWxsIGlzIHJ1bm5pbmcuICBUaGVyZWZvcmUsIHdlIGFsc28gYXNrIGZvciBub3RpZmljYXRpb24gb2Ygc3lzY2FsbAorICAgZW50cmllcyBhbmQgcmV0dXJucy4gIFdoZW4gdGhlIGluZmVyaW9yIGVudGVycyBhIHN5c2NhbGwsIHdlIGRpc2FibGUKKyAgIGgvdyB3YXRjaHBvaW50cy4gIFdoZW4gdGhlIGluZmVyaW9yIHJldHVybnMgZnJvbSBhIHN5c2NhbGwsIHdlIHJlZW5hYmxlCisgICBoL3cgd2F0Y2hwb2ludHMuCisKKyAgIGluZnB0cmFjZS5jIHN1cHBsaWVzIGR1bW15IHZlcnNpb25zIG9mIHRoZXNlOyBpbmZ0dHJhY2UuYyBpcyB3aGVyZSB0aGUKKyAgIG1lYW5pbmdmdWwgaW1wbGVtZW50YXRpb25zIGFyZS4KKyAgICovCisjZGVmaW5lIFRBUkdFVF9FTkFCTEVfSFdfV0FUQ0hQT0lOVFMocGlkKSBcCisgICAgICAgIGhwcGFfZW5hYmxlX3BhZ2VfcHJvdGVjdGlvbl9ldmVudHMgKHBpZCkKK2V4dGVybiB2b2lkICBocHBhX2VuYWJsZV9wYWdlX3Byb3RlY3Rpb25fZXZlbnRzIFBBUkFNUyAoKGludCkpOworCisjZGVmaW5lIFRBUkdFVF9ESVNBQkxFX0hXX1dBVENIUE9JTlRTKHBpZCkgXAorICAgICAgICBocHBhX2Rpc2FibGVfcGFnZV9wcm90ZWN0aW9uX2V2ZW50cyAocGlkKQorZXh0ZXJuIHZvaWQgIGhwcGFfZGlzYWJsZV9wYWdlX3Byb3RlY3Rpb25fZXZlbnRzIFBBUkFNUyAoKGludCkpOworCisvKiBVc2UgdGhlc2UgbWFjcm9zIGZvciB3YXRjaHBvaW50IGluc2VydGlvbi9kZWxldGlvbi4gICovCisjZGVmaW5lIHRhcmdldF9pbnNlcnRfd2F0Y2hwb2ludChhZGRyLCBsZW4sIHR5cGUpIFwKKyAgICAgICAgaHBwYV9pbnNlcnRfaHdfd2F0Y2hwb2ludCAoaW5mZXJpb3JfcGlkLCBhZGRyLCAoTE9OR0VTVCkobGVuKSwgdHlwZSkKKworI2RlZmluZSB0YXJnZXRfcmVtb3ZlX3dhdGNocG9pbnQoYWRkciwgbGVuLCB0eXBlKSBcCisgICAgICAgIGhwcGFfcmVtb3ZlX2h3X3dhdGNocG9pbnQgKGluZmVyaW9yX3BpZCwgYWRkciwgKExPTkdFU1QpKGxlbiksIHR5cGUpCisKKy8qIFdlIGNhbGwgb3VyIGstdGhyZWFkIHByb2Nlc3NlcyAidGhyZWFkcyIsIHJhdGhlcgorICogdGhhbiBwcm9jZXNzZXMuICBTbyB3ZSBuZWVkIGEgbmV3IHdheSB0byBwcmludAorICogdGhlIHN0cmluZy4gIENvZGUgaXMgaW4gaHBwYWgtbmF0LmMuCisgKi8KKyNkZWZpbmUgdGFyZ2V0X3BpZF90b19zdHIoIHBpZCApIFwKKyAgICAgICAgaHBwYV9waWRfdG9fc3RyKCBwaWQgKQorZXh0ZXJuIGNoYXIgKiBocHBhX3BpZF90b19zdHIgUEFSQU1TICgocGlkX3QpKTsKKworI2RlZmluZSB0YXJnZXRfdGlkX3RvX3N0ciggcGlkICkgXAorICAgICAgICBocHBhX3RpZF90b19zdHIoIHBpZCApCitleHRlcm4gY2hhciAqIGhwcGFfdGlkX3RvX3N0ciBQQVJBTVMgKChwaWRfdCkpOworCisvKiBGb3IgdGhpcywgSUQgY2FuIGJlIGVpdGhlciBhIHByb2Nlc3Mgb3IgdGhyZWFkIElELCBhbmQgdGhlIGZ1bmN0aW9uCisgICB3aWxsIGRlc2NyaWJlIGl0IGFwcHJvcHJpYXRlbHksIHJldHVybmluZyB0aGUgZGVzY3JpcHRpb24gYXMgYSBwcmludGFibGUKKyAgIHN0cmluZy4KKworICAgVGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyB0aGlzIG1hY3JvIGlzIGRlZmluZWQgaW4gaW5mcHRyYWNlLmMgYW5kCisgICBpbmZ0dHJhY2UuYy4KKyAgICovCisjZGVmaW5lIHRhcmdldF9waWRfb3JfdGlkX3RvX3N0cihJRCkgXAorICAgICAgICBocHBhX3BpZF9vcl90aWRfdG9fc3RyIChJRCkKK2V4dGVybiBjaGFyICogaHBwYV9waWRfb3JfdGlkX3RvX3N0ciBQQVJBTVMgKChwaWRfdCkpOworCisvKiBUaGlzIGlzIHVzZWQgd2hlbiBoYW5kbGluZyBldmVudHMgY2F1c2VkIGJ5IGEgY2FsbCB0byB2Zm9yaygpLiAgT24gcHRyYWNlLQorICAgYmFzZWQgSFAtVVhzLCB3aGVuIHlvdSByZXN1bWUgdGhlIHZmb3JrZWQgY2hpbGQsIHRoZSBwYXJlbnQgYXV0b21hZ2ljYWxseQorICAgYmVnaW5zIHJ1bm5pbmcgYWdhaW4uICBUbyBwcmV2ZW50IHRoaXMgcnVuYXdheSwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkLgorCisgICBOb3RlIHRoYXQgZm9yIHZmb3JrIG9uIEhQLVVYLCB3ZSByZWNlaXZlIHRocmVlIGV2ZW50cyBvZiBpbnRlcmVzdDoKKworICAgMS4gdGhlIHZmb3JrIGV2ZW50IGZvciB0aGUgbmV3IGNoaWxkIHByb2Nlc3MKKyAgIDIuIHRoZSBleGl0IG9yIGV4ZWMgZXZlbnQgb2YgdGhlIG5ldyBjaGlsZCBwcm9jZXNzIChhY3R1YWxseSwgeW91IGdldAorICAgICAgdHdvIGV4ZWMgZXZlbnRzIG9uIHB0cmFjZS1iYXNlZCBIUC1VWHMpCisgICAzLiB0aGUgdmZvcmsgZXZlbnQgZm9yIHRoZSBvcmlnaW5hbCBwYXJlbnQgcHJvY2VzcworCisgICBUaGUgZmlyc3QgaXMgYWx3YXlzIHJlY2VpdmVkIGZpcnN0LiAgVGhlIG90aGVyIHR3byBtYXkgYmUgcmVjZWl2ZWQgaW4gYW55CisgICBvcmRlcjsgSFAtVVggZG9lc24ndCBndWFyYW50ZWUgYW4gb3JkZXIuCisgICAqLworI2RlZmluZSBFTlNVUkVfVkZPUktJTkdfUEFSRU5UX1JFTUFJTlNfU1RPUFBFRChQSUQpIFwKKyAgICAgICAgaHBwYV9lbnN1cmVfdmZvcmtpbmdfcGFyZW50X3JlbWFpbnNfc3RvcHBlZCAoUElEKQorZXh0ZXJuIHZvaWQgIGhwcGFfZW5zdXJlX3Zmb3JraW5nX3BhcmVudF9yZW1haW5zX3N0b3BwZWQgUEFSQU1TKChpbnQpKTsKKworLyogVGhpcyBpcyB1c2VkIHdoZW4gaGFuZGxpbmcgZXZlbnRzIGNhdXNlZCBieSBhIGNhbGwgdG8gdmZvcmsoKS4KKworICAgT24gdHRyYWNlLWJhc2VkIEhQLVVYcywgdGhlIHBhcmVudCB2Zm9yayBhbmQgY2hpbGQgZXhlYyBhcnJpdmUgbW9yZSBvciBsZXNzCisgICB0b2dldGhlci4gIFRoYXQgaXMsIHlvdSBjb3VsZCBkbyB0d28gd2FpdCgpcyB3aXRob3V0IHJlc3VtaW5nIGVpdGhlciBwYXJlbnQKKyAgIG9yIGNoaWxkLCBhbmQgZ2V0IGJvdGggZXZlbnRzLgorCisgICBPbiBwdHJhY2UtYmFzZWQgSFAtVVhzLCB5b3UgbXVzdCByZXN1bWUgdGhlIGNoaWxkIGFmdGVyIGl0cyBleGVjIGV2ZW50IGlzCisgICBkZWxpdmVyZWQgb3IgeW91IHdvbid0IGdldCB0aGUgcGFyZW50J3MgdmZvcmsuICBJLmUuLCB5b3UgY2FuJ3QganVzdCB3YWl0KCkKKyAgIGFuZCBnZXQgdGhlIHBhcmVudCB2Zm9yaywgYWZ0ZXIgcmVjZWl2aW5nIHRoZSBjaGlsZCBleGVjLgorICAgKi8KKyNkZWZpbmUgUkVTVU1FX0VYRUNEX1ZGT1JLSU5HX0NISUxEX1RPX0dFVF9QQVJFTlRfVkZPUksoKSBcCisgICAgICAgIGhwcGFfcmVzdW1lX2V4ZWNkX3Zmb3JraW5nX2NoaWxkX3RvX2dldF9wYXJlbnRfdmZvcmsgKCkKK2V4dGVybiBpbnQgIGhwcGFfcmVzdW1lX2V4ZWNkX3Zmb3JraW5nX2NoaWxkX3RvX2dldF9wYXJlbnRfdmZvcmsgUEFSQU1TICgodm9pZCkpOworCisjaWZkZWYgSEFWRV9IUFVYX1RIUkVBRF9TVVBQT1JUCisKKyNpZmRlZiBfX1NURENfXworc3RydWN0IG9iamZpbGU7CisjZW5kaWYKKwordm9pZCBocHV4X3RocmVhZF9uZXdfb2JqZmlsZSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSkpOworI2RlZmluZSB0YXJnZXRfbmV3X29iamZpbGUoT0JKRklMRSkgaHB1eF90aHJlYWRfbmV3X29iamZpbGUgKE9CSkZJTEUpCisKK2V4dGVybiBjaGFyICpocHV4X3BpZF90b19zdHIgUEFSQU1TICgoaW50IHBpZCkpOworI2RlZmluZSB0YXJnZXRfcGlkX3RvX3N0cihQSUQpIGhwdXhfcGlkX3RvX3N0ciAoUElEKQorCisjZW5kaWYgLyogSEFWRV9IUFVYX1RIUkVBRF9TVVBQT1JUICovCisKKyNkZWZpbmUgSFBVWEhQUEEKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcGEvbm0taHBwYWgxMS5oIGIvZ2RiL2NvbmZpZy9wYS9ubS1ocHBhaDExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E3M2MyNAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcGEvbm0taHBwYWgxMS5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qIE5hdGl2ZSBzdXBwb3J0IGZvciBIUFBBLVJJU0MgbWFjaGluZSBydW5uaW5nIEhQVVggMTEueCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEdEQl9OQVRJVkVfSFBVWF8xMQorCisjaW5jbHVkZSAicGEvbm0taHBwYWguaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcGEvbm0taHBwYW8uaCBiL2dkYi9jb25maWcvcGEvbm0taHBwYW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDlkZmQxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wYS9ubS1ocHBhby5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qIEhQUEEgUEEtUklTQyBtYWNoaW5lIG5hdGl2ZSBzdXBwb3J0IGZvciBMaXRlcywgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAibm0tbTMuaCIKKyNkZWZpbmUgVV9SRUdTX09GRlNFVCAwCisKKyNkZWZpbmUgS0VSTkVMX1VfQUREUiAwCisKKy8qIFdoYXQgYSBjb2luY2lkZW5jZSEgKi8KKyNkZWZpbmUgUkVHSVNURVJfVV9BRERSKGFkZHIsIGJsb2NrZW5kLCByZWdubykJCQkJXAoreyBhZGRyID0gKGludCkoYmxvY2tlbmQpICsgUkVHSVNURVJfQllURSAocmVnbm8pO30KKworLyogVGhpcyBtYWNybyBkZWZpbmVzIHRoZSByZWdpc3RlciBudW1iZXJzIChmcm9tIFJFR0lTVEVSX05BTUVTKSB0aGF0CisgICBhcmUgZWZmZWN0aXZlbHkgdW5hdmFpbGFibGUgdG8gdGhlIHVzZXIgdGhyb3VnaCBwdHJhY2UoKS4gIEl0IGFsbG93cworICAgdXMgdG8gaW5jbHVkZSB0aGUgd2hvbGUgcmVnaXN0ZXIgc2V0IGluIFJFR0lTVEVSX05BTUVTIChpbm9yZGVyIHRvCisgICBiZXR0ZXIgc3VwcG9ydCByZW1vdGUgZGVidWdnaW5nKS4gIElmIGl0IGlzIHVzZWQgaW4KKyAgIGZldGNoL3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycygpIGdkYiB3aWxsIG5vdCBjb21wbGFpbiBhYm91dCBJL08gZXJyb3JzCisgICBvbiBmZXRjaGluZyB0aGVzZSByZWdpc3RlcnMuICBJZiBhbGwgcmVnaXN0ZXJzIGluIFJFR0lTVEVSX05BTUVTCisgICBhcmUgYXZhaWxhYmxlLCB0aGVuIHJldHVybiBmYWxzZSAoMCkuICAqLworCisjZGVmaW5lIENBTk5PVF9TVE9SRV9SRUdJU1RFUihyZWdubykgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgKChyZWdubykgPT0gMCkgfHwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAoKHJlZ25vKSA9PSBQQ1NRX0hFQURfUkVHTlVNKSB8fCBcCisgICAgICAgICAgICAgICAgICAgKChyZWdubykgPj0gUENTUV9UQUlMX1JFR05VTSAmJiAocmVnbm8pIDwgSVBTV19SRUdOVU0pIHx8ICBcCisgICAgICAgICAgICAgICAgICAgKChyZWdubykgPiBJUFNXX1JFR05VTSAmJiAocmVnbm8pIDwgRlA0X1JFR05VTSkKKworLyogZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIGlzIGluIGhwcGFiLW5hdC5jLiAgKi8KKyNkZWZpbmUgRkVUQ0hfSU5GRVJJT1JfUkVHSVNURVJTCisKKy8qIGF0dGFjaC9kZXRhY2ggd29ya3MgdG8gc29tZSBleHRlbnQgdW5kZXIgQlNEIGFuZCBIUFVYLiAgU28gbG9uZworICAgYXMgdGhlIHByb2Nlc3MgeW91J3JlIGF0dGFjaGluZyB0byBpc24ndCBibG9ja2VkIHdhaXRpbmcgb24gaW8sCisgICBibG9ja2VkIHdhaXRpbmcgb24gYSBzaWduYWwsIG9yIGluIGEgc3lzdGVtIGNhbGwgdGhpbmdzIHdvcmsgCisgICBmaW5lLiAgKFRoZSBwcm9ibGVtcyBpbiB0aG9zZSBjYXNlcyBhcmUgcmVsYXRlZCB0byB0aGUgZmFjdCB0aGF0CisgICB0aGUga2VybmVsIGNhbid0IHByb3ZpZGUgY29tcGxldGUgcmVnaXN0ZXIgaW5mb3JtYXRpb24gZm9yIHRoZQorICAgdGFyZ2V0IHByb2Nlc3MuLi4gIFdoaWNoIHJlYWxseSBwaXNzZXMgb2ZmIEdEQi4pICAqLworCisjZGVmaW5lIEFUVEFDSF9ERVRBQ0gKKworI2RlZmluZSBFTVVMQVRPUl9CQVNFIDB4OTAxMDAwMDAKKyNkZWZpbmUgRU1VTEFUT1JfRU5EICAweDkwMjAwMDAwCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3BhL3RtLWhwcGEuaCBiL2dkYi9jb25maWcvcGEvdG0taHBwYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OTUzNGEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3BhL3RtLWhwcGEuaApAQCAtMCwwICsxLDc4OCBAQAorLyogUGFyYW1ldGVycyBmb3IgZXhlY3V0aW9uIG9uIGFueSBIZXdsZXR0LVBhY2thcmQgUEEtUklTQyBtYWNoaW5lLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAKKworICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKKyAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIHNvbWUgdHlwZXMgd2UgdXNlIGluIHByb3RvdHlwZXMgKi8KKworI2lmZGVmIF9fU1REQ19fCitzdHJ1Y3QgZnJhbWVfaW5mbzsKK3N0cnVjdCBmcmFtZV9zYXZlZF9yZWdzOworc3RydWN0IHZhbHVlOworc3RydWN0IHR5cGU7CitzdHJ1Y3QgaW5mZXJpb3Jfc3RhdHVzOworI2VuZGlmCisKKy8qIFRhcmdldCBzeXN0ZW0gYnl0ZSBvcmRlci4gKi8KKworI2RlZmluZQlUQVJHRVRfQllURV9PUkRFUglCSUdfRU5ESUFOCisKKy8qIEJ5IGRlZmF1bHQgYXNzdW1lIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc29mdHdhcmUgZmxvYXRpbmcgcG9pbnQuICAqLworI2lmbmRlZiBTT0ZUX0ZMT0FUCisjZGVmaW5lIFNPRlRfRkxPQVQgMAorI2VuZGlmCisKKy8qIEdldCBhdCB2YXJpb3VzIHJlbGV2ZW50IGZpZWxkcyBvZiBhbiBpbnN0cnVjdGlvbiB3b3JkLiAqLworCisjZGVmaW5lIE1BU0tfNSAweDFmCisjZGVmaW5lIE1BU0tfMTEgMHg3ZmYKKyNkZWZpbmUgTUFTS18xNCAweDNmZmYKKyNkZWZpbmUgTUFTS18yMSAweDFmZmZmZgorCisvKiBUaGlzIG1hY3JvIGdldHMgYml0IGZpZWxkcyB1c2luZyBIUCdzIG51bWJlcmluZyAoTVNCID0gMCkgKi8KKyNpZm5kZWYgR0VUX0ZJRUxECisjZGVmaW5lIEdFVF9GSUVMRChYLCBGUk9NLCBUTykgXAorICAoKFgpID4+ICgzMSAtIChUTykpICYgKCgxIDw8ICgoVE8pIC0gKEZST00pICsgMSkpIC0gMSkpCisjZW5kaWYKKworLyogV2F0Y2ggb3V0IGZvciBOYU5zICovCisKKyNkZWZpbmUgSUVFRV9GTE9BVAorCisvKiBPbiB0aGUgUEEsIGFueSBwYXNzLWJ5LXZhbHVlIHN0cnVjdHVyZSA+IDggYnl0ZXMgaXMgYWN0dWFsbHkKKyAgIHBhc3NlZCB2aWEgYSBwb2ludGVyIHJlZ2FyZGxlc3Mgb2YgaXRzIHR5cGUgb3IgdGhlIGNvbXBpbGVyCisgICB1c2VkLiAgKi8KKworI2RlZmluZSBSRUdfU1RSVUNUX0hBU19BRERSKGdjY19wLHR5cGUpIFwKKyAgKFRZUEVfTEVOR1RIICh0eXBlKSA+IDgpCisKKy8qIE9mZnNldCBmcm9tIGFkZHJlc3Mgb2YgZnVuY3Rpb24gdG8gc3RhcnQgb2YgaXRzIGNvZGUuCisgICBaZXJvIG9uIG1vc3QgbWFjaGluZXMuICAqLworCisjZGVmaW5lIEZVTkNUSU9OX1NUQVJUX09GRlNFVCAwCisgICAgIAorLyogQWR2YW5jZSBQQyBhY3Jvc3MgYW55IGZ1bmN0aW9uIGVudHJ5IHByb2xvZ3VlIGluc3RydWN0aW9ucworICAgdG8gcmVhY2ggc29tZSAicmVhbCIgY29kZS4gICovCisKKyNkZWZpbmUgU0tJUF9QUk9MT0dVRShwYykgcGMgPSBza2lwX3Byb2xvZ3VlIChwYykKK2V4dGVybiBDT1JFX0FERFIgc2tpcF9wcm9sb2d1ZSBQQVJBTVMgKChDT1JFX0FERFIpKTsKKworLyogSWYgUEMgaXMgaW4gc29tZSBmdW5jdGlvbi1jYWxsIHRyYW1wb2xpbmUgY29kZSwgcmV0dXJuIHRoZSBQQworICAgd2hlcmUgdGhlIGZ1bmN0aW9uIGl0c2VsZiBhY3R1YWxseSBzdGFydHMuICBJZiBub3QsIHJldHVybiBOVUxMLiAgKi8KKworI2RlZmluZQlTS0lQX1RSQU1QT0xJTkVfQ09ERShwYykgc2tpcF90cmFtcG9saW5lX2NvZGUgKHBjLCBOVUxMKQorZXh0ZXJuIENPUkVfQUREUiBza2lwX3RyYW1wb2xpbmVfY29kZSBQQVJBTVMgKChDT1JFX0FERFIsIGNoYXIgKikpOworCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgd2UgYXJlIGluIGFuIGFwcHJvcHJpYXRlIHRyYW1wb2xpbmUuICovCisKKyNkZWZpbmUgSU5fU09MSUJfQ0FMTF9UUkFNUE9MSU5FKHBjLCBuYW1lKSBcCisgICBpbl9zb2xpYl9jYWxsX3RyYW1wb2xpbmUgKHBjLCBuYW1lKQorZXh0ZXJuIGludCBpbl9zb2xpYl9jYWxsX3RyYW1wb2xpbmUgUEFSQU1TICgoQ09SRV9BRERSLCBjaGFyICopKTsKKworI2RlZmluZSBJTl9TT0xJQl9SRVRVUk5fVFJBTVBPTElORShwYywgbmFtZSkgXAorICBpbl9zb2xpYl9yZXR1cm5fdHJhbXBvbGluZSAocGMsIG5hbWUpCitleHRlcm4gaW50IGluX3NvbGliX3JldHVybl90cmFtcG9saW5lIFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqKSk7CisKKy8qIEltbWVkaWF0ZWx5IGFmdGVyIGEgZnVuY3Rpb24gY2FsbCwgcmV0dXJuIHRoZSBzYXZlZCBwYy4KKyAgIENhbid0IGdvIHRocm91Z2ggdGhlIGZyYW1lcyBmb3IgdGhpcyBiZWNhdXNlIG9uIHNvbWUgbWFjaGluZXMKKyAgIHRoZSBuZXcgZnJhbWUgaXMgbm90IHNldCB1cCB1bnRpbCB0aGUgbmV3IGZ1bmN0aW9uIGV4ZWN1dGVzCisgICBzb21lIGluc3RydWN0aW9ucy4gICovCisKKyN1bmRlZglTQVZFRF9QQ19BRlRFUl9DQUxMCisjZGVmaW5lIFNBVkVEX1BDX0FGVEVSX0NBTEwoZnJhbWUpIHNhdmVkX3BjX2FmdGVyX2NhbGwgKGZyYW1lKQorZXh0ZXJuIENPUkVfQUREUiBzYXZlZF9wY19hZnRlcl9jYWxsIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworLyogU3RhY2sgZ3Jvd3MgdXB3YXJkICovCisjZGVmaW5lIElOTkVSX1RIQU4obGhzLHJocykgKChsaHMpID4gKHJocykpCisKKy8qIGVsejogYWRqdXN0IHRoZSBxdWFudGl0eSB0byB0aGUgbmV4dCBoaWdoZXN0IHZhbHVlIHdoaWNoIGlzIDY0LWJpdCBhbGlnbmVkLgorICAgVGhpcyBpcyB1c2VkIGluIHZhbG9wcy5jLCB3aGVuIHRoZSBzcCBpcyBhZGp1c3RlZC4KKyAgIE9uIGhwcGEgdGhlIHNwIG11c3QgYWx3YXlzIGJlIGtlcHQgNjQtYml0IGFsaWduZWQqLworCisjZGVmaW5lIFNUQUNLX0FMSUdOKGFyZykgKCAoKGFyZyklOCkgPyAoKChhcmcpKzcpJi04KSA6IChhcmcpKQorI2RlZmluZSBOT19FWFRSQV9BTElHTk1FTlRfTkVFREVEIDEgCisKKy8qIFNlcXVlbmNlIG9mIGJ5dGVzIGZvciBicmVha3BvaW50IGluc3RydWN0aW9uLiAgKi8KKworI2RlZmluZSBCUkVBS1BPSU5UIHsweDAwLCAweDAxLCAweDAwLCAweDA0fQorI2RlZmluZSBCUkVBS1BPSU5UMzIgMHgxMDAwNAorCisvKiBBbW91bnQgUEMgbXVzdCBiZSBkZWNyZW1lbnRlZCBieSBhZnRlciBhIGJyZWFrcG9pbnQuCisgICBUaGlzIGlzIG9mdGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gQlJFQUtQT0lOVAorICAgYnV0IG5vdCBhbHdheXMuCisKKyAgIE5vdCBvbiB0aGUgUEEtUklTQyAqLworCisjZGVmaW5lIERFQ1JfUENfQUZURVJfQlJFQUsgMAorCisvKiBTb21ldGltZXMgd2UgbWF5IHBsdWNrIG91dCBhIG1pbmltYWwgc3ltYm9sIHRoYXQgaGFzIGEgbmVnYXRpdmUKKyAgIGFkZHJlc3MuCisKKyAgIEFuIGV4YW1wbGUgb2YgdGhpcyBvY2N1cnMgd2hlbiBhbiBhLm91dCBpcyBsaW5rZWQgYWdhaW5zdCBhIGZvby5zbC4KKyAgIFRoZSBmb28uc2wgZGVmaW5lcyBhIGdsb2JhbCBiYXIoKSwgYW5kIHRoZSBhLm91dCBkZWNsYXJlcyBhIHNpZ25hdHVyZQorICAgZm9yIGJhcigpLiAgSG93ZXZlciwgdGhlIGEub3V0IGRvZXNuJ3QgZGlyZWN0bHkgY2FsbCBiYXIoKSwgYnV0IHBhc3NlcworICAgaXRzIGFkZHJlc3MgaW4gYW5vdGhlciBjYWxsLgorCisgICBJZiB5b3UgaGF2ZSB0aGlzIHNjZW5hcmlvIGFuZCBhdHRlbXB0IHRvICJicmVhayBiYXIiIGJlZm9yZSBydW5uaW5nLAorICAgZ2RiIHdpbGwgZmluZCBhIG1pbmltYWwgc3ltYm9sIGZvciBiYXIoKSBpbiB0aGUgYS5vdXQuICBCdXQgdGhhdAorICAgc3ltYm9sJ3MgYWRkcmVzcyB3aWxsIGJlIG5lZ2F0aXZlLiAgV2hhdCB0aGlzIGFwcGVhcnMgdG8gZGVub3RlIGlzCisgICBhbiBpbmRleCBiYWNrd2FyZHMgZnJvbSB0aGUgYmFzZSBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgKFBMVCkKKyAgIGludG8gdGhlIGRhdGEgbGlua2FnZSB0YWJsZSAoRExUKSwgdGhlIGVuZCBvZiB3aGljaCBpcyBjb250aWd1b3VzCisgICB3aXRoIHRoZSBzdGFydCBvZiB0aGUgUExULiAgVGhpcyBpcyBjbGVhcmx5IG5vdCBhIHZhbGlkIGFkZHJlc3MgZm9yCisgICB1cyB0byBzZXQgYSBicmVha3BvaW50IG9uLgorCisgICBOb3RlIHRoYXQgb25lIG11c3QgYmUgY2FyZWZ1bCBpbiBob3cgb25lIGNoZWNrcyBmb3IgYSBuZWdhdGl2ZSBhZGRyZXNzLgorICAgMHhjMDAwMDAwMCBpcyBhIGxlZ2l0aW1hdGUgYWRkcmVzcyBvZiBzb21ldGhpbmcgaW4gYSBzaGFyZWQgdGV4dAorICAgc2VnbWVudCwgZm9yIGV4YW1wbGUuICBTaW5jZSBJIGRvbid0IGtub3cgd2hhdCB0aGUgcG9zc2libGUgcmFuZ2UKKyAgIGlzIG9mIHRoZXNlICJyZWFsbHksIHRydWx5IG5lZ2F0aXZlIiBhZGRyZXNzZXMgdGhhdCBjb21lIGZyb20gdGhlCisgICBtaW5pbWFsIHN5bWJvbHMsIEknbSByZXNvcnRpbmcgdG8gdGhlIGdyb3NzIGhhY2sgb2YgY2hlY2tpbmcgdGhlCisgICB0b3AgYnl0ZSBvZiB0aGUgYWRkcmVzcyBmb3IgYWxsIDEncy4gIFNpZ2guCisgICAqLworI2RlZmluZSBQQ19SRVFVSVJFU19SVU5fQkVGT1JFX1VTRShwYykgXAorICAoISB0YXJnZXRfaGFzX3N0YWNrICYmIChwYyAmIDB4RkYwMDAwMDApKQorCisvKiByZXR1cm4gaW5zdHJ1Y3Rpb24gaXMgYnYgcjAocnApIG9yIGJ2LG4gcjAocnApKi8KKworI2RlZmluZSBBQk9VVF9UT19SRVRVUk4ocGMpICgocmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDQpIHwgMHgyKSA9PSAweEU4NDBDMDAyKQorCisvKiBTYXkgaG93IGxvbmcgKG9yZGluYXJ5KSByZWdpc3RlcnMgYXJlLiAgVGhpcyBpcyBhIHBpZWNlIG9mIGJvZ29zaXR5CisgICB1c2VkIGluIHB1c2hfd29yZCBhbmQgYSBmZXcgb3RoZXIgcGxhY2VzOyBSRUdJU1RFUl9SQVdfU0laRSBpcyB0aGUKKyAgIHJlYWwgd2F5IHRvIGtub3cgaG93IGJpZyBhIHJlZ2lzdGVyIGlzLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9TSVpFIDQKKworLyogTnVtYmVyIG9mIG1hY2hpbmUgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTlVNX1JFR1MgMTI4CisKKy8qIEluaXRpYWxpemVyIGZvciBhbiBhcnJheSBvZiBuYW1lcyBvZiByZWdpc3RlcnMuCisgICBUaGVyZSBzaG91bGQgYmUgTlVNX1JFR1Mgc3RyaW5ncyBpbiB0aGlzIGluaXRpYWxpemVyLgorICAgVGhleSBhcmUgaW4gcm93cyBvZiBlaWdodCBlbnRyaWVzICAqLworCisjZGVmaW5lIFJFR0lTVEVSX05BTUVTCVwKKyB7ImZsYWdzIiwgICJyMSIsICAgICAgInJwIiwgICAgICAicjMiLCAgICAicjQiLCAgICAgInI1IiwgICAgICAicjYiLCAgICAgInI3IiwgICAgXAorICAicjgiLCAgICAgInI5IiwgICAgICAicjEwIiwgICAgICJyMTEiLCAgICJyMTIiLCAgICAicjEzIiwgICAgICJyMTQiLCAgICAicjE1IiwgICBcCisgICJyMTYiLCAgICAicjE3IiwgICAgICJyMTgiLCAgICAgInIxOSIsICAgInIyMCIsICAgICJyMjEiLCAgICAgInIyMiIsICAgICJyMjMiLCAgIFwKKyAgInIyNCIsICAgICJyMjUiLCAgICAgInIyNiIsICAgICAiZHAiLCAgICAicmV0MCIsICAgInJldDEiLCAgICAic3AiLCAgICAgInIzMSIsICAgXAorICAic2FyIiwgICAgInBjb3FoIiwgICAicGNzcWgiLCAgICJwY29xdCIsICJwY3NxdCIsICAiZWllbSIsICAgICJpaXIiLCAgICAiaXNyIiwgICBcCisgICJpb3IiLCAgICAiaXBzdyIsICAgICJnb3RvIiwgICAgInNyNCIsICAgInNyMCIsICAgICJzcjEiLCAgICAgInNyMiIsICAgICJzcjMiLCAgIFwKKyAgInNyNSIsICAgICJzcjYiLCAgICAgInNyNyIsICAgICAiY3IwIiwgICAiY3I4IiwgICAgImNyOSIsICAgICAiY2NyIiwgICAgImNyMTIiLCAgXAorICAiY3IxMyIsICAgImNyMjQiLCAgICAiY3IyNSIsICAgICJjcjI2IiwgICJtcHNmdV9oaWdoIiwibXBzZnVfbG93IiwibXBzZnVfb3ZmbG8iLCJwYWQiLFwKKyAgImZwc3IiLCAgICAiZnBlMSIsICAgImZwZTIiLCAgICAiZnBlMyIsICAiZnBlNCIsICAgImZwZTUiLCAgICAiZnBlNiIsICAgImZwZTciLCAgXAorICAiZnI0IiwgICAgICJmcjRSIiwgICAiZnI1IiwgICAgICJmcjVSIiwgICJmcjYiLCAgICAiZnI2UiIsICAgICJmcjciLCAgICAiZnI3UiIsICBcCisgICJmcjgiLCAgICAgImZyOFIiLCAgICJmcjkiLCAgICAgImZyOVIiLCAgImZyMTAiLCAgICJmcjEwUiIsICAgImZyMTEiLCAgICJmcjExUiIsIFwKKyAgImZyMTIiLCAgICAiZnIxMlIiLCAgImZyMTMiLCAgICAiZnIxM1IiLCAiZnIxNCIsICAgImZyMTRSIiwgICAiZnIxNSIsICAgImZyMTVSIiwgXAorICAiZnIxNiIsICAgICJmcjE2UiIsICAiZnIxNyIsICAgICJmcjE3UiIsICJmcjE4IiwgICAiZnIxOFIiLCAgICJmcjE5IiwgICAiZnIxOVIiLCBcCisgICJmcjIwIiwgICAgImZyMjBSIiwgICJmcjIxIiwgICAgImZyMjFSIiwgImZyMjIiLCAgICJmcjIyUiIsICAgImZyMjMiLCAgICJmcjIzUiIsIFwKKyAgImZyMjQiLCAgICAiZnIyNFIiLCAgImZyMjUiLCAgICAiZnIyNVIiLCAiZnIyNiIsICAgImZyMjZSIiwgICAiZnIyNyIsICAgImZyMjdSIiwgXAorICAiZnIyOCIsICAgICJmcjI4UiIsICAiZnIyOSIsICAgICJmcjI5UiIsICJmcjMwIiwgICAiZnIzMFIiLCAgICJmcjMxIiwgICAiZnIzMVIifQorCisvKiBSZWdpc3RlciBudW1iZXJzIG9mIHZhcmlvdXMgaW1wb3J0YW50IHJlZ2lzdGVycy4KKyAgIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgInJlYWwiIHJlZ2lzdGVyIG51bWJlcnMsCisgICBhbmQgY29ycmVzcG9uZCB0byB0aGUgZ2VuZXJhbCByZWdpc3RlcnMgb2YgdGhlIG1hY2hpbmUsCisgICBhbmQgc29tZSBhcmUgInBob255IiByZWdpc3RlciBudW1iZXJzIHdoaWNoIGFyZSB0b28gbGFyZ2UKKyAgIHRvIGJlIGFjdHVhbCByZWdpc3RlciBudW1iZXJzIGFzIGZhciBhcyB0aGUgdXNlciBpcyBjb25jZXJuZWQKKyAgIGJ1dCBkbyBzZXJ2ZSB0byBnZXQgdGhlIGRlc2lyZWQgdmFsdWVzIHdoZW4gcGFzc2VkIHRvIHJlYWRfcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIFIwX1JFR05VTSAwCQkvKiBEb2Vzbid0IGFjdHVhbGx5IGV4aXN0LCB1c2VkIGFzIGJhc2UgZm9yCisJCQkJICAgb3RoZXIgciByZWdpc3RlcnMuICAqLworI2RlZmluZSBGTEFHU19SRUdOVU0gMAkJLyogVmFyaW91cyBzdGF0dXMgZmxhZ3MgKi8KKyNkZWZpbmUgUlBfUkVHTlVNIDIJCS8qIHJldHVybiBwb2ludGVyICovCisjZGVmaW5lIEZQX1JFR05VTSAzCQkvKiBDb250YWlucyBhZGRyZXNzIG9mIGV4ZWN1dGluZyBzdGFjayAqLworCQkJCS8qIGZyYW1lICovCisjZGVmaW5lIFNQX1JFR05VTSAzMAkJLyogQ29udGFpbnMgYWRkcmVzcyBvZiB0b3Agb2Ygc3RhY2sgKi8KKyNkZWZpbmUgU0FSX1JFR05VTSAzMgkJLyogU2hpZnQgQW1vdW50IFJlZ2lzdGVyICovCisjZGVmaW5lIElQU1dfUkVHTlVNIDQxCQkvKiBJbnRlcnJ1cHQgUHJvY2Vzc29yIFN0YXR1cyBXb3JkICovCisjZGVmaW5lIFBDT1FfSEVBRF9SRUdOVU0gMzMJLyogaW5zdHJ1Y3Rpb24gb2Zmc2V0IHF1ZXVlIGhlYWQgKi8KKyNkZWZpbmUgUENTUV9IRUFEX1JFR05VTSAzNAkvKiBpbnN0cnVjdGlvbiBzcGFjZSBxdWV1ZSBoZWFkICovCisjZGVmaW5lIFBDT1FfVEFJTF9SRUdOVU0gMzUJLyogaW5zdHJ1Y3Rpb24gb2Zmc2V0IHF1ZXVlIHRhaWwgKi8KKyNkZWZpbmUgUENTUV9UQUlMX1JFR05VTSAzNgkvKiBpbnN0cnVjdGlvbiBzcGFjZSBxdWV1ZSB0YWlsICovCisjZGVmaW5lIEVJRU1fUkVHTlVNIDM3CQkvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgRW5hYmxlIE1hc2sgKi8KKyNkZWZpbmUgSUlSX1JFR05VTSAzOAkJLyogSW50ZXJydXB0IEluc3RydWN0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIElPUl9SRUdOVU0gNDAJCS8qIEludGVycnVwdCBPZmZzZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1I0X1JFR05VTSA0MwkJLyogc3BhY2UgcmVnaXN0ZXIgNCAqLworI2RlZmluZSBSQ1JfUkVHTlVNIDUxCQkvKiBSZWNvdmVyIENvdW50ZXIgKGFsc28ga25vd24gYXMgY3IwKSAqLworI2RlZmluZSBDQ1JfUkVHTlVNIDU0CQkvKiBDb3Byb2Nlc3NvciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFRSMF9SRUdOVU0gNTcJCS8qIFRlbXBvcmFyeSBSZWdpc3RlcnMgKGNyMjQgLT4gY3IzMSkgKi8KKyNkZWZpbmUgQ1IyN19SRUdOVU0gNjAgICAgICAgICAgLyogQmFzZSByZWdpc3RlciBmb3IgdGhyZWFkLWxvY2FsIHN0b3JhZ2UsIGNyMjcgKi8KKyNkZWZpbmUgRlAwX1JFR05VTSA2NAkJLyogZmxvYXRpbmcgcG9pbnQgcmVnLiAwIChmc3ByKSovCisjZGVmaW5lIEZQNF9SRUdOVU0gNzIKKworI2RlZmluZSBBUkcwX1JFR05VTSAyNiAgICAgICAgICAvKiBUaGUgZmlyc3QgYXJndW1lbnQgb2YgYSBjYWxsZWUuICovCisjZGVmaW5lIEFSRzFfUkVHTlVNIDI1ICAgICAgICAgIC8qIFRoZSBzZWNvbmQgYXJndW1lbnQgb2YgYSBjYWxsZWUuICovCisjZGVmaW5lIEFSRzJfUkVHTlVNIDI0ICAgICAgICAgIC8qIFRoZSB0aGlyZCBhcmd1bWVudCBvZiBhIGNhbGxlZS4gKi8KKyNkZWZpbmUgQVJHM19SRUdOVU0gMjMgICAgICAgICAgLyogVGhlIGZvdXJ0aCBhcmd1bWVudCBvZiBhIGNhbGxlZS4gKi8KKworLyogY29tcGF0aWJpbGl0eSB3aXRoIHRoZSByZXN0IG9mIGdkYi4gKi8KKyNkZWZpbmUgUENfUkVHTlVNIFBDT1FfSEVBRF9SRUdOVU0KKyNkZWZpbmUgTlBDX1JFR05VTSBQQ09RX1RBSUxfUkVHTlVNCisKKy8qCisgKiBQcm9jZXNzb3IgU3RhdHVzIFdvcmQgTWFza3MKKyAqLworCisjZGVmaW5lIFBTV19UICAgMHgwMTAwMDAwMCAgICAgIC8qIFRha2VuIEJyYW5jaCBUcmFwIEVuYWJsZSAqLworI2RlZmluZSBQU1dfSCAgIDB4MDA4MDAwMDAgICAgICAvKiBIaWdoZXItUHJpdmlsZWdlIFRyYW5zZmVyIFRyYXAgRW5hYmxlICovCisjZGVmaW5lIFBTV19MICAgMHgwMDQwMDAwMCAgICAgIC8qIExvd2VyLVByaXZpbGVnZSBUcmFuc2ZlciBUcmFwIEVuYWJsZSAqLworI2RlZmluZSBQU1dfTiAgIDB4MDAyMDAwMDAgICAgICAvKiBQQyBRdWV1ZSBGcm9udCBJbnN0cnVjdGlvbiBOdWxsaWZpZWQgKi8KKyNkZWZpbmUgUFNXX1ggICAweDAwMTAwMDAwICAgICAgLyogRGF0YSBNZW1vcnkgQnJlYWsgRGlzYWJsZSAqLworI2RlZmluZSBQU1dfQiAgIDB4MDAwODAwMDAgICAgICAvKiBUYWtlbiBCcmFuY2ggaW4gUHJldmlvdXMgQ3ljbGUgKi8KKyNkZWZpbmUgUFNXX0MgICAweDAwMDQwMDAwICAgICAgLyogQ29kZSBBZGRyZXNzIFRyYW5zbGF0aW9uIEVuYWJsZSAqLworI2RlZmluZSBQU1dfViAgIDB4MDAwMjAwMDAgICAgICAvKiBEaXZpZGUgU3RlcCBDb3JyZWN0aW9uICovCisjZGVmaW5lIFBTV19NICAgMHgwMDAxMDAwMCAgICAgIC8qIEhpZ2gtUHJpb3JpdHkgTWFjaGluZSBDaGVjayBEaXNhYmxlICovCisjZGVmaW5lIFBTV19DQiAgMHgwMDAwZmYwMCAgICAgIC8qIENhcnJ5L0JvcnJvdyBCaXRzICovCisjZGVmaW5lIFBTV19SICAgMHgwMDAwMDAxMCAgICAgIC8qIFJlY292ZXJ5IENvdW50ZXIgRW5hYmxlICovCisjZGVmaW5lIFBTV19RICAgMHgwMDAwMDAwOCAgICAgIC8qIEludGVycnVwdGlvbiBTdGF0ZSBDb2xsZWN0aW9uIEVuYWJsZSAqLworI2RlZmluZSBQU1dfUCAgIDB4MDAwMDAwMDQgICAgICAvKiBQcm90ZWN0aW9uIElEIFZhbGlkYXRpb24gRW5hYmxlICovCisjZGVmaW5lIFBTV19EICAgMHgwMDAwMDAwMiAgICAgIC8qIERhdGEgQWRkcmVzcyBUcmFuc2xhdGlvbiBFbmFibGUgKi8KKyNkZWZpbmUgUFNXX0kgICAweDAwMDAwMDAxICAgICAgLyogRXh0ZXJuYWwsIFBvd2VyIEZhaWx1cmUsIExvdy1Qcmlvcml0eSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNoaW5lIENoZWNrIEludGVycnVwdGlvbiBFbmFibGUgKi8KKworLyogV2hlbiBmZXRjaGluZyByZWdpc3RlciB2YWx1ZXMgZnJvbSBhbiBpbmZlcmlvciBvciBhIGNvcmUgZmlsZSwKKyAgIGNsZWFuIHRoZW0gdXAgdXNpbmcgdGhpcyBtYWNyby4gIEJVRiBpcyBhIGNoYXIgcG9pbnRlciB0bworICAgdGhlIHJhdyB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgaW4gdGhlIHJlZ2lzdGVyc1tdIGFycmF5LiAgKi8KKworI2RlZmluZQlDTEVBTl9VUF9SRUdJU1RFUl9WQUxVRShyZWdubywgYnVmKSBcCisgIGRvIHsJXAorICAgIGlmICgocmVnbm8pID09IFBDT1FfSEVBRF9SRUdOVU0gfHwgKHJlZ25vKSA9PSBQQ09RX1RBSUxfUkVHTlVNKSBcCisgICAgICAoYnVmKVszXSAmPSB+MHgzOwlcCisgIH0gd2hpbGUgKDApCisKKy8qIERlZmluZSBET19SRUdJU1RFUlNfSU5GTygpIHRvIGRvIG1hY2hpbmUtc3BlY2lmaWMgZm9ybWF0dGluZworICAgb2YgcmVnaXN0ZXIgZHVtcHMuICovCisKKyNkZWZpbmUgRE9fUkVHSVNURVJTX0lORk8oX3JlZ251bSwgZnApIHBhX2RvX3JlZ2lzdGVyc19pbmZvIChfcmVnbnVtLCBmcCkKK2V4dGVybiB2b2lkIHBhX2RvX3JlZ2lzdGVyc19pbmZvIFBBUkFNUyAoKGludCwgaW50KSk7CisKKyNpZiAwCisjZGVmaW5lIFNUUkNBVF9SRUdJU1RFUihyZWdudW0sIGZwcmVncywgc3RyZWFtLCBwcmVjaXNpb24pIHBhX2RvX3N0cmNhdF9yZWdpc3RlcnNfaW5mbyAocmVnbnVtLCBmcHJlZ3MsIHN0cmVhbSwgcHJlY2lzaW9uKQorZXh0ZXJuIHZvaWQgcGFfZG9fc3RyY2F0X3JlZ2lzdGVyc19pbmZvIFBBUkFNUyAoKGludCwgaW50LCBHREJfRklMRSAqLCBlbnVtIHByZWNpc2lvbl90eXBlKSk7CisjZW5kaWYKKworLyogUEEgc3BlY2lmaWMgbWFjcm8gdG8gc2VlIGlmIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIGlzIG51bGxpZmllZC4gKi8KKyNpZm5kZWYgSU5TVFJVQ1RJT05fTlVMTElGSUVECisjZGVmaW5lIElOU1RSVUNUSU9OX05VTExJRklFRCBcCisgICAgKCgoaW50KXJlYWRfcmVnaXN0ZXIgKElQU1dfUkVHTlVNKSAmIDB4MDAyMDAwMDApICYmIFwKKyAgICAgISgoaW50KXJlYWRfcmVnaXN0ZXIgKEZMQUdTX1JFR05VTSkgJiAweDIpKQorI2VuZGlmCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBhY3R1YWwgbWFjaGluZSByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICBPbiB0aGUgUEEtUklTQywgYWxsIHJlZ3MgYXJlIDQgYnl0ZXMsIGluY2x1ZGluZworICAgdGhlIEZQIHJlZ2lzdGVycyAodGhleSdyZSBhY2Nlc3NlZCBhcyB0d28gNCBieXRlIGhhbHZlcykuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pIDQKKworLyogVG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCB0byBzdG9yZSBvdXIgY29waWVzIG9mIHRoZSBtYWNoaW5lJ3MKKyAgIHJlZ2lzdGVyIHN0YXRlLCB0aGUgYXJyYXkgYHJlZ2lzdGVycycuICAqLworI2RlZmluZSBSRUdJU1RFUl9CWVRFUyAoTlVNX1JFR1MgKiA0KQorCisvKiBJbmRleCB3aXRoaW4gYHJlZ2lzdGVycycgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNwYWNlIGZvcgorICAgcmVnaXN0ZXIgTi4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfQllURShOKSAoTikgKiA0CisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBwcm9ncmFtJ3MgcmVwcmVzZW50YXRpb24KKyAgIGZvciByZWdpc3RlciBOLiAqLworCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfU0laRShOKSBSRUdJU1RFUl9SQVdfU0laRShOKQorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1JBV19TSVpFIGNhbiBoYXZlLiAgKi8KKworI2RlZmluZSBNQVhfUkVHSVNURVJfUkFXX1NJWkUgNAorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1ZJUlRVQUxfU0laRSBjYW4gaGF2ZS4gICovCisKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1ZJUlRVQUxfU0laRSA4CisKKy8qIFJldHVybiB0aGUgR0RCIHR5cGUgb2JqZWN0IGZvciB0aGUgInN0YW5kYXJkIiBkYXRhIHR5cGUKKyAgIG9mIGRhdGEgaW4gcmVnaXN0ZXIgTi4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9UWVBFKE4pIFwKKyAoKE4pIDwgRlA0X1JFR05VTSA/IGJ1aWx0aW5fdHlwZV9pbnQgOiBidWlsdGluX3R5cGVfZmxvYXQpCisKKy8qIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBwbGFjZSBpbiB3aGljaCB0byBjb3B5IHRoZSBzdHJ1Y3R1cmUgdGhlCisgICBzdWJyb3V0aW5lIHdpbGwgcmV0dXJuLiAgVGhpcyBpcyBjYWxsZWQgZnJvbSBjYWxsX2Z1bmN0aW9uLiAqLworCisjZGVmaW5lIFNUT1JFX1NUUlVDVF9SRVRVUk4oQUREUiwgU1ApIHt3cml0ZV9yZWdpc3RlciAoMjgsIChBRERSKSk7IH0KKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgb2YgdHlwZSBUWVBFLCBhbmQgY29weSB0aGF0LCBpbiB2aXJ0dWFsIGZvcm1hdCwKKyAgIGludG8gVkFMQlVGLiAKKworICAgZWx6OiBjaGFuZ2VkIHdoYXQgdG8gcmV0dXJuIHdoZW4gbGVuZ3RoIGlzID4gNDogdGhlIHN0b3JlZCByZXN1bHQgaXMgCisgICBpbiByZWdpc3RlciAyOCBhbmQgaW4gcmVnaXN0ZXIgMjksIHdpdGggdGhlIGxvd2VyIG9yZGVyIHdvcmQgYmVpbmcgaW4gcmVnIDI5LCAKKyAgIHNvIHdlIG11c3Qgc3RhcnQgcmVhZGluZyBpdCBmcm9tIHNvbWVoZXJlIGluIHRoZSBtaWRkbGUgb2YgcmVnMjgKKworICAgRklYTUU6IE5vdCBzdXJlIHdoYXQgdG8gZG8gZm9yIHNvZnQgZmxvYXQgaGVyZS4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9SRVRVUk5fVkFMVUUoVFlQRSxSRUdCVUYsVkFMQlVGKSBcCisgIHsgXAorICAgIGlmIChUWVBFX0NPREUgKFRZUEUpID09IFRZUEVfQ09ERV9GTFQgJiYgIVNPRlRfRkxPQVQpIFwKKyAgICAgIG1lbWNweSAoKFZBTEJVRiksIFwKKwkgICAgICAoKGNoYXIgKikoUkVHQlVGKSkgKyBSRUdJU1RFUl9CWVRFIChGUDRfUkVHTlVNKSwgXAorCSAgICAgIFRZUEVfTEVOR1RIIChUWVBFKSk7IFwKKyAgICBlbHNlIFwKKyAgICAgIG1lbWNweSAoKFZBTEJVRiksIFwKKwkgICAgICAoY2hhciAqKShSRUdCVUYpICsgUkVHSVNURVJfQllURSAoMjgpICsgXAorCSAgICAgIChUWVBFX0xFTkdUSCAoVFlQRSkgPiA0ID8gKDggLSBUWVBFX0xFTkdUSCAoVFlQRSkpIDogKDQgLSBUWVBFX0xFTkdUSCAoVFlQRSkpKSwgXAorCSAgICAgIFRZUEVfTEVOR1RIIChUWVBFKSk7IFwKKyAgfQorCisKKyAvKiBlbHo6IGRlY2lkZSB3aGV0aGVyIHRoZSBmdW5jdGlvbiByZXR1cm5pbmcgYSB2YWx1ZSBvZiB0eXBlIHR5cGUKKyAgICB3aWxsIHB1dCBpdCBvbiB0aGUgc3RhY2sgb3IgaW4gdGhlIHJlZ2lzdGVycy4KKyAgICBUaGUgcGEgY2FsbGluZyBjb252ZW50aW9uIHNheXMgdGhhdDoKKyAgICByZWdpc3RlciAyOCAoY2FsbGVkIHJldDAgYnkgZ2RiKSBjb250YWlucyBhbnkgQVNDSUkgY2hhciwKKyAgICBhbmQgYW55IG5vbl9mbG9hdGluZyBwb2ludCB2YWx1ZSB1cCB0byAzMi1iaXRzLgorICAgIHJlZyAyOCBhbmQgMjkgY29udGFpbiBub24tZmxvYXRpbmcgcG9pbnQgdXAgdHAgNjQgYml0cyBhbmQgbGFyZ2VyCisgICAgdGhhbiAzMiBiaXRzLiAoaGlnZXIgb3JkZXIgd29yZCBpbiByZWcgMjgpLgorICAgIGZyNDogZmxvYXRpbmcgcG9pbnQgdXAgdG8gNjQgYml0cworICAgIHNyMTogc3BhY2UgaWRlbnRpZmllciAoMzItYml0KQorICAgIHN0YWNrOiBhbnkgbGFnZXIgdGhhbiA2NC1iaXQsIHdpdGggdGhlIGFkZHJlc3MgaW4gcjI4CisgKi8KK2V4dGVybiB1c2Vfc3RydWN0X2NvbnZlbnRpb25fZm4gaHBwYV91c2Vfc3RydWN0X2NvbnZlbnRpb247CisjZGVmaW5lIFVTRV9TVFJVQ1RfQ09OVkVOVElPTihnY2NfcCx0eXBlKSBocHBhX3VzZV9zdHJ1Y3RfY29udmVudGlvbiAoZ2NjX3AsdHlwZSkKKworLyogV3JpdGUgaW50byBhcHByb3ByaWF0ZSByZWdpc3RlcnMgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUKKyAgIG9mIHR5cGUgVFlQRSwgZ2l2ZW4gaW4gdmlydHVhbCBmb3JtYXQuCisKKyAgIEZvciBzb2Z0d2FyZSBmbG9hdGluZyBwb2ludCB0aGUgcmV0dXJuIHZhbHVlIGdvZXMgaW50byB0aGUgaW50ZWdlcgorICAgcmVnaXN0ZXJzLiAgQnV0IHdlIGRvbid0IGhhdmUgYW55IGZsYWcgdG8ga2V5IHRoaXMgb24sIHNvIHdlIGFsd2F5cworICAgc3RvcmUgdGhlIHZhbHVlIGludG8gdGhlIGludGVnZXIgcmVnaXN0ZXJzLCBhbmQgaWYgaXQncyBhIGZsb2F0IHZhbHVlLAorICAgdGhlbiB3ZSBwdXQgaXQgaW4gdGhlIGZsb2F0IHJlZ2lzdGVycyB0b28uICAqLworCisjZGVmaW5lIFNUT1JFX1JFVFVSTl9WQUxVRShUWVBFLFZBTEJVRikgXAorICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSAoMjgpLChWQUxCVUYpLCBUWVBFX0xFTkdUSCAoVFlQRSkpIDsgXAorICBpZiAoIVNPRlRfRkxPQVQpIFwKKyAgICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoKFRZUEVfQ09ERShUWVBFKSA9PSBUWVBFX0NPREVfRkxUIFwKKwkJCSAgID8gUkVHSVNURVJfQllURSAoRlA0X1JFR05VTSkgXAorCQkJICAgOiBSRUdJU1RFUl9CWVRFICgyOCkpLAkJXAorCQkJICAoVkFMQlVGKSwgVFlQRV9MRU5HVEggKFRZUEUpKQorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICB0aGUgYWRkcmVzcyBpbiB3aGljaCBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gaXRzIHN0cnVjdHVyZSB2YWx1ZSwKKyAgIGFzIGEgQ09SRV9BRERSIChvciBhbiBleHByZXNzaW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgb25lKS4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyhSRUdCVUYpIFwKKyAgKCooaW50ICopKChSRUdCVUYpICsgUkVHSVNURVJfQllURSAoMjgpKSkKKworLyogZWx6OiBSZXR1cm4gYSBsYXJnZSB2YWx1ZSwgd2hpY2ggaXMgc3RvcmVkIG9uIHRoZSBzdGFjayBhdCBhZGRyLgorICAgVGhpcyBpcyBkZWZpbmVkIG9ubHkgZm9yIHRoZSBocHBhLCBhdCB0aGlzIG1vbWVudC4gCisgICBUaGUgYWJvdmUgbWFjcm8gRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyBpcyBub3QgY2FsbGVkIGFueW1vcmUsCisgICBiZWNhdXNlIGl0IGFzc3VtZXMgdGhhdCBvbiBleGl0IGZyb20gYSBjYWxsZWQgZnVuY3Rpb24gd2hpY2ggcmV0dXJucworICAgYSBsYXJnZSBzdHJ1Y3R1cmUgb24gdGhlIHN0YWNrLCB0aGUgYWRkcmVzcyBvZiB0aGUgcmV0IHN0cnVjdHVyZSBpcyAKKyAgIHN0aWxsIGluIHJlZ2lzdGVyIDI4LiBVbmZvcnR1bmF0ZWx5IHRoaXMgcmVnaXN0ZXIgaXMgdXN1YWxseSBvdmVyd3JpdHRlbgorICAgYnkgdGhlIGNhbGxlZCBmdW5jdGlvbiBpdHNlbGYsIG9uIGhwcGEuIFRoaXMgaXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsaW5nCisgICBjb252ZW50aW9uIGRvYy4gQXMgZmFyIGFzIEkga25vdywgdGhlIG9ubHkgd2F5IHRvIGdldCB0aGUgcmV0dXJuIHZhbHVlCisgICBpcyB0byBoYXZlIHRoZSBjYWxsZXIgdGVsbCB1cyB3aGVyZSBpdCB0b2xkIHRoZSBjYWxsZWUgdG8gcHV0IGl0LCByYXRoZXIKKyAgIHRoYW4gaGF2ZSB0aGUgY2FsbGVlIHRlbGwgdXMuCisqLworI2RlZmluZSBWQUxVRV9SRVRVUk5FRF9GUk9NX1NUQUNLKHZhbHR5cGUsYWRkcikgXAorICBocHBhX3ZhbHVlX3JldHVybmVkX2Zyb21fc3RhY2sgKHZhbHR5cGUsIGFkZHIpCisKKy8qCisgKiBUaGlzIG1hY3JvIGRlZmluZXMgdGhlIHJlZ2lzdGVyIG51bWJlcnMgKGZyb20gUkVHSVNURVJfTkFNRVMpIHRoYXQKKyAqIGFyZSBlZmZlY3RpdmVseSB1bmF2YWlsYWJsZSB0byB0aGUgdXNlciB0aHJvdWdoIHB0cmFjZSgpLiAgSXQgYWxsb3dzCisgKiB1cyB0byBpbmNsdWRlIHRoZSB3aG9sZSByZWdpc3RlciBzZXQgaW4gUkVHSVNURVJfTkFNRVMgKGlub3JkZXIgdG8KKyAqIGJldHRlciBzdXBwb3J0IHJlbW90ZSBkZWJ1Z2dpbmcpLiAgSWYgaXQgaXMgdXNlZCBpbgorICogZmV0Y2gvc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKCkgZ2RiIHdpbGwgbm90IGNvbXBsYWluIGFib3V0IEkvTyBlcnJvcnMKKyAqIG9uIGZldGNoaW5nIHRoZXNlIHJlZ2lzdGVycy4gIElmIGFsbCByZWdpc3RlcnMgaW4gUkVHSVNURVJfTkFNRVMKKyAqIGFyZSBhdmFpbGFibGUsIHRoZW4gcmV0dXJuIGZhbHNlICgwKS4KKyAqLworCisjZGVmaW5lIENBTk5PVF9TVE9SRV9SRUdJU1RFUihyZWdubykgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgKChyZWdubykgPT0gMCkgfHwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAoKHJlZ25vKSA9PSBQQ1NRX0hFQURfUkVHTlVNKSB8fCBcCisgICAgICAgICAgICAgICAgICAgKChyZWdubykgPj0gUENTUV9UQUlMX1JFR05VTSAmJiAocmVnbm8pIDwgSVBTV19SRUdOVU0pIHx8ICBcCisgICAgICAgICAgICAgICAgICAgKChyZWdubykgPiBJUFNXX1JFR05VTSAmJiAocmVnbm8pIDwgRlA0X1JFR05VTSkKKworI2RlZmluZSBJTklUX0VYVFJBX0ZSQU1FX0lORk8oZnJvbWxlYWYsIGZyYW1lKSBpbml0X2V4dHJhX2ZyYW1lX2luZm8gKGZyb21sZWFmLCBmcmFtZSkKK2V4dGVybiB2b2lkIGluaXRfZXh0cmFfZnJhbWVfaW5mbyBQQVJBTVMgKChpbnQsIHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworLyogRGVzY3JpYmUgdGhlIHBvaW50ZXIgaW4gZWFjaCBzdGFjayBmcmFtZSB0byB0aGUgcHJldmlvdXMgc3RhY2sgZnJhbWUKKyAgIChpdHMgY2FsbGVyKS4gICovCisKKy8qIEZSQU1FX0NIQUlOIHRha2VzIGEgZnJhbWUncyBub21pbmFsIGFkZHJlc3MKKyAgIGFuZCBwcm9kdWNlcyB0aGUgZnJhbWUncyBjaGFpbi1wb2ludGVyLgorCisgICBGUkFNRV9DSEFJTl9DT01CSU5FIHRha2VzIHRoZSBjaGFpbiBwb2ludGVyIGFuZCB0aGUgZnJhbWUncyBub21pbmFsIGFkZHJlc3MKKyAgIGFuZCBwcm9kdWNlcyB0aGUgbm9taW5hbCBhZGRyZXNzIG9mIHRoZSBjYWxsZXIgZnJhbWUuCisKKyAgIEhvd2V2ZXIsIGlmIEZSQU1FX0NIQUlOX1ZBTElEIHJldHVybnMgemVybywKKyAgIGl0IG1lYW5zIHRoZSBnaXZlbiBmcmFtZSBpcyB0aGUgb3V0ZXJtb3N0IG9uZSBhbmQgaGFzIG5vIGNhbGxlci4KKyAgIEluIHRoYXQgY2FzZSwgRlJBTUVfQ0hBSU5fQ09NQklORSBpcyBub3QgdXNlZC4gICovCisKKy8qIEluIHRoZSBjYXNlIG9mIHRoZSBQQS1SSVNDLCB0aGUgZnJhbWUncyBub21pbmFsIGFkZHJlc3MKKyAgIGlzIHRoZSBhZGRyZXNzIG9mIGEgNC1ieXRlIHdvcmQgY29udGFpbmluZyB0aGUgY2FsbGluZyBmcmFtZSdzCisgICBhZGRyZXNzIChwcmV2aW91cyBGUCkuICAqLworCisjZGVmaW5lIEZSQU1FX0NIQUlOKHRoaXNmcmFtZSkgZnJhbWVfY2hhaW4gKHRoaXNmcmFtZSkKK2V4dGVybiBDT1JFX0FERFIgZnJhbWVfY2hhaW4gUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworCitleHRlcm4gaW50IGhwcGFfZnJhbWVfY2hhaW5fdmFsaWQgUEFSQU1TICgoQ09SRV9BRERSLCBzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisjZGVmaW5lIEZSQU1FX0NIQUlOX1ZBTElEKGNoYWluLCB0aGlzZnJhbWUpIGhwcGFfZnJhbWVfY2hhaW5fdmFsaWQgKGNoYWluLCB0aGlzZnJhbWUpCisKKyNkZWZpbmUgRlJBTUVfQ0hBSU5fQ09NQklORShjaGFpbiwgdGhpc2ZyYW1lKSAoY2hhaW4pCisKKy8qIERlZmluZSBvdGhlciBhc3BlY3RzIG9mIHRoZSBzdGFjayBmcmFtZS4gICovCisKKy8qIEEgbWFjcm8gdGhhdCB0ZWxscyB1cyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpbnZvY2F0aW9uIHJlcHJlc2VudGVkCisgICBieSBGSSBkb2VzIG5vdCBoYXZlIGEgZnJhbWUgb24gdGhlIHN0YWNrIGFzc29jaWF0ZWQgd2l0aCBpdC4gIElmIGl0CisgICBkb2VzIG5vdCwgRlJBTUVMRVNTIGlzIHNldCB0byAxLCBlbHNlIDAuICAqLworI2RlZmluZSBGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTihGSSwgRlJBTUVMRVNTKSBcCisgIChGUkFNRUxFU1MpID0gZnJhbWVsZXNzX2Z1bmN0aW9uX2ludm9jYXRpb24oRkkpCitleHRlcm4gaW50IGZyYW1lbGVzc19mdW5jdGlvbl9pbnZvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworZXh0ZXJuIENPUkVfQUREUiBocHBhX2ZyYW1lX3NhdmVkX3BjIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZSkpOworI2RlZmluZSBGUkFNRV9TQVZFRF9QQyhGUkFNRSkgaHBwYV9mcmFtZV9zYXZlZF9wYyAoRlJBTUUpCisKKyNkZWZpbmUgRlJBTUVfQVJHU19BRERSRVNTKGZpKSAoKGZpKS0+ZnJhbWUpCisKKyNkZWZpbmUgRlJBTUVfTE9DQUxTX0FERFJFU1MoZmkpICgoZmkpLT5mcmFtZSkKKy8qIFNldCBWQUwgdG8gdGhlIG51bWJlciBvZiBhcmdzIHBhc3NlZCB0byBmcmFtZSBkZXNjcmliZWQgYnkgRkkuCisgICBDYW4gc2V0IFZBTCB0byAtMSwgbWVhbmluZyBubyB3YXkgdG8gdGVsbC4gICovCisKKy8qIFdlIGNhbid0IHRlbGwgaG93IG1hbnkgYXJncyB0aGVyZSBhcmUKKyAgIG5vdyB0aGF0IHRoZSBDIGNvbXBpbGVyIGRlbGF5cyBwb3BwaW5nIHRoZW0uICAqLworI2RlZmluZSBGUkFNRV9OVU1fQVJHUyh2YWwsZmkpICh2YWwgPSAtMSkKKworLyogUmV0dXJuIG51bWJlciBvZiBieXRlcyBhdCBzdGFydCBvZiBhcmdsaXN0IHRoYXQgYXJlIG5vdCByZWFsbHkgYXJncy4gICovCisKKyNkZWZpbmUgRlJBTUVfQVJHU19TS0lQIDAKKworI2RlZmluZSBGUkFNRV9GSU5EX1NBVkVEX1JFR1MoZnJhbWVfaW5mbywgZnJhbWVfc2F2ZWRfcmVncykgXAorICBocHBhX2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyAoZnJhbWVfaW5mbywgJmZyYW1lX3NhdmVkX3JlZ3MpCitleHRlcm4gdm9pZAoraHBwYV9mcmFtZV9maW5kX3NhdmVkX3JlZ3MgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKiwKKwkJCQkgICAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKikpOworCisMCisvKiBUaGluZ3MgbmVlZGVkIGZvciBtYWtpbmcgdGhlIGluZmVyaW9yIGNhbGwgZnVuY3Rpb25zLiAgKi8KKworLyogUHVzaCBhbiBlbXB0eSBzdGFjayBmcmFtZSwgdG8gcmVjb3JkIHRoZSBjdXJyZW50IFBDLCBldGMuICovCisKKyNkZWZpbmUgUFVTSF9EVU1NWV9GUkFNRSBwdXNoX2R1bW15X2ZyYW1lICgmaW5mX3N0YXR1cykKK2V4dGVybiB2b2lkIHB1c2hfZHVtbXlfZnJhbWUgUEFSQU1TICgoc3RydWN0IGluZmVyaW9yX3N0YXR1cyAqKSk7CisKKy8qIERpc2NhcmQgZnJvbSB0aGUgc3RhY2sgdGhlIGlubmVybW9zdCBmcmFtZSwgCisgICByZXN0b3JpbmcgYWxsIHNhdmVkIHJlZ2lzdGVycy4gICovCisjZGVmaW5lIFBPUF9GUkFNRSAgaHBwYV9wb3BfZnJhbWUgKCkKK2V4dGVybiB2b2lkIGhwcGFfcG9wX2ZyYW1lIFBBUkFNUyAoKHZvaWQpKTsKKworI2RlZmluZSBJTlNUUlVDVElPTl9TSVpFIDQKKworI2lmbmRlZiBQQV9MRVZFTF8wCisKKy8qIE5vbi1sZXZlbCB6ZXJvIFBBJ3MgaGF2ZSBzcGFjZSByZWdpc3RlcnMgKGJ1dCB0aGV5IGRvbid0IGFsd2F5cyBoYXZlCisgICBmbG9hdGluZy1wb2ludCwgZG8gdGhleT8/Pz8gICovCisKKy8qIFRoaXMgc2VxdWVuY2Ugb2Ygd29yZHMgaXMgdGhlIGluc3RydWN0aW9ucworCis7IENhbGwgc3RhY2sgZnJhbWUgaGFzIGFscmVhZHkgYmVlbiBidWlsdCBieSBnZGIuIFNpbmNlIHdlIGNvdWxkIGJlIGNhbGxpbmcgCis7IGEgdmFyYXJncyBmdW5jdGlvbiwgYW5kIHdlIGRvIG5vdCBoYXZlIHRoZSBiZW5lZml0IG9mIGEgc3R1YiB0byBwdXQgdGhpbmdzIGluCis7IHRoZSByaWdodCBwbGFjZSwgd2UgbG9hZCB0aGUgZmlyc3QgNCB3b3JkIG9mIGFyZ3VtZW50cyBpbnRvIGJvdGggdGhlIGdlbmVyYWwKKzsgYW5kIGZwIHJlZ2lzdGVycy4KK2NhbGxfZHVtbXkKKwlsZHcgLTM2KHNwKSwgYXJnMAorCWxkdyAtNDAoc3ApLCBhcmcxCisJbGR3IC00NChzcCksIGFyZzIKKwlsZHcgLTQ4KHNwKSwgYXJnMworCWxkbyAtMzYoc3ApLCByMQorCWZsZHdzIDAoMCwgcjEpLCBmcjQKKwlmbGRkcyAtNCgwLCByMSksIGZyNQorCWZsZHdzIC04KDAsIHIxKSwgZnI2CisJZmxkZHMgLTEyKDAsIHIxKSwgZnI3CisJbGRpbCAwLCByMjIJCQk7IEZVTkNfTERJTF9PRkZTRVQgbXVzdCBwb2ludCBoZXJlCisJbGRvIDAocjIyKSwgcjIyCQkJOyBGVU5DX0xET19PRkZTRVQgbXVzdCBwb2ludCBoZXJlCisJbGRzaWQgKDAscjIyKSwgcjQKKwlsZGlsIDAsIHIxCQkJOyBTUjRFWFBPUlRfTERJTF9PRkZTRVQgbXVzdCBwb2ludCBoZXJlCisJbGRvIDAocjEpLCByMQkJCTsgU1I0RVhQT1JUX0xET19PRkZTRVQgbXVzdCBwb2ludCBoZXJlCisJbGRzaWQgKDAscjEpLCByMjAKKwljb21idCw9LG4gcjQsIHIyMCwgdGV4dF9zcGFjZQk7IElmIHRhcmdldCBpcyBpbiBkYXRhIHNwYWNlLCBkbyBhCisJYmxlIDAoc3I1LCByMjIpCQkJOyAibm9ybWFsIiBwcm9jZWR1cmUgY2FsbAorCWNvcHkgcjMxLCByMgorCWJyZWFrIDQsIDggCisJbXRzcCByMjEsIHNyMAorCWJsZSxuIDAoc3IwLCByMjIpCit0ZXh0X3NwYWNlCQkJCTsgT3RoZXJ3aXNlLCBnbyB0aHJvdWdoIF9zcjRleHBvcnQsCisJYmxlIChzcjQsIHIxKQkJCTsgd2hpY2ggd2lsbCByZXR1cm4gYmFjayBoZXJlLgorCXN0dyByMzEsLTI0KHIzMCkKKwlicmVhayA0LCA4CisJbXRzcCByMjEsIHNyMAorCWJsZSxuIDAoc3IwLCByMjIpCisJbm9wCQkJCTsgVG8gYXZvaWQga2VybmVsIGJ1Z3MgCisJbm9wCQkJCTsgYW5kIGtlZXAgdGhlIGR1bW15IDggYnl0ZSBhbGlnbmVkCisKKyAgIFRoZSBkdW1teSBkZWNpZGVzIGlmIHRoZSB0YXJnZXQgaXMgaW4gdGV4dCBzcGFjZSBvciBkYXRhIHNwYWNlLiBJZgorICAgaXQncyBpbiBkYXRhIHNwYWNlLCB0aGVyZSdzIG5vIHByb2JsZW0gYmVjYXVzZSB0aGUgdGFyZ2V0IGNhbgorICAgcmV0dXJuIGJhY2sgdG8gdGhlIGR1bW15LiBIb3dldmVyLCBpZiB0aGUgdGFyZ2V0IGlzIGluIHRleHQgc3BhY2UsCisgICB0aGUgZHVtbXkgY2FsbHMgdGhlIHNlY3JldCwgdW5kb2N1bWVudGVkIHJvdXRpbmUgX3NyNGV4cG9ydCwgd2hpY2gKKyAgIGNhbGxzIGEgZnVuY3Rpb24gaW4gdGV4dCBzcGFjZSBhbmQgY2FuIHJldHVybiB0byBhbnkgc3BhY2UuIEluc3RlYWQKKyAgIG9mIGluY2x1ZGluZyBmYWtlIGluc3RydWN0aW9ucyB0byByZXByZXNlbnQgc2F2ZWQgcmVnaXN0ZXJzLCB3ZQorICAga25vdyB0aGF0IHRoZSBmcmFtZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGwgZHVtbXkgYW5kIHRyZWF0IGl0CisgICBzcGVjaWFsbHkuCisKKyAgIFRoZSB0cmFpbGluZyBOT1BzIGFyZSBuZWVkZWQgdG8gYXZvaWQgYSBidWcgaW4gSFBVWCwgQlNEIGFuZCBPU0YxIAorICAga2VybmVscy4gICBJZiB0aGUgbWVtb3J5IGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSBQQyBpcworICAgMHhmZmZmZmZmZiB0aGVuIGEgcHRyYWNlIHN0ZXAgY2FsbCB3aWxsIGZhaWwgKGV2ZW4gaWYgdGhlIGluc3RydWN0aW9uCisgICBpcyBudWxsaWZpZWQpLgorCisgICBUaGUgY29kZSB0byBwb3AgYSBkdW1teSBmcmFtZSBzaW5nbGUgc3RlcHMgdGhyZWUgaW5zdHJ1Y3Rpb25zCisgICBzdGFydGluZyB3aXRoIHRoZSBsYXN0IG10c3AuICBUaGlzIGluY2x1ZGVzIHRoZSBudWxsaWZpZWQgImluc3RydWN0aW9uIgorICAgZm9sbG93aW5nIHRoZSBibGUgKHdoaWNoIGlzIHVuaW5pdGlhbGl6ZWQganVuaykuICBJZiB0aGUgCisgICAiaW5zdHJ1Y3Rpb24iIGZvbGxvd2luZyB0aGUgbGFzdCBCTEUgaXMgMHhmZmZmZmZmZiwgdGhlbiB0aGUgcHRyYWNlCisgICB3aWxsIGZhaWwgYW5kIHRoZSBkdW1teSBmcmFtZSBpcyBub3QgY29ycmVjdGx5IHBvcHBlZC4KKworICAgQnkgcGxhY2luZyBhIE5PUCBpbiB0aGUgZGVsYXkgc2xvdCBvZiB0aGUgQkxFIGluc3RydWN0aW9uIHdlIGNhbiBiZSAKKyAgIHN1cmUgdGhhdCB3ZSBuZXZlciB0cnkgdG8gZXhlY3V0ZSBhIDB4ZmZmZmZmZmYgaW5zdHJ1Y3Rpb24gYW5kCisgICBhdm9pZCB0aGUga2VybmVsIGJ1Zy4gIFRoZSBzZWNvbmQgTk9QIGlzIG5lZWRlZCB0byBrZWVwIHRoZSBjYWxsCisgICBkdW1teSA4IGJ5dGUgYWxpZ25lZC4gICovCisKKy8qIERlZmluZSBvZmZzZXRzIGludG8gdGhlIGNhbGwgZHVtbXkgZm9yIHRoZSB0YXJnZXQgZnVuY3Rpb24gYWRkcmVzcyAqLworI2RlZmluZSBGVU5DX0xESUxfT0ZGU0VUIChJTlNUUlVDVElPTl9TSVpFICogOSkKKyNkZWZpbmUgRlVOQ19MRE9fT0ZGU0VUIChJTlNUUlVDVElPTl9TSVpFICogMTApCisKKy8qIERlZmluZSBvZmZzZXRzIGludG8gdGhlIGNhbGwgZHVtbXkgZm9yIHRoZSBfc3I0ZXhwb3J0IGFkZHJlc3MgKi8KKyNkZWZpbmUgU1I0RVhQT1JUX0xESUxfT0ZGU0VUIChJTlNUUlVDVElPTl9TSVpFICogMTIpCisjZGVmaW5lIFNSNEVYUE9SVF9MRE9fT0ZGU0VUIChJTlNUUlVDVElPTl9TSVpFICogMTMpCisKKyNkZWZpbmUgQ0FMTF9EVU1NWSB7MHg0QkRBM0ZCOSwgMHg0QkQ5M0ZCMSwgMHg0QkQ4M0ZBOSwgMHg0QkQ3M0ZBMSxcCisgICAgICAgICAgICAgICAgICAgIDB4MzdDMTNGQjksIDB4MjQyMDEwMDQsIDB4MkMzOTEwMDUsIDB4MjQzMTEwMDYsXAorICAgICAgICAgICAgICAgICAgICAweDJDMjkxMDA3LCAweDIyQzAwMDAwLCAweDM2RDYwMDAwLCAweDAyQzAxMEE0LFwKKyAgICAgICAgICAgICAgICAgICAgMHgyMDIwMDAwMCwgMHgzNDIxMDAwMCwgMHgwMDIwMTBiNCwgMHg4Mjg0MjAyMixcCisgICAgICAgICAgICAgICAgICAgIDB4ZTZjMDYwMDAsIDB4MDgxZjAyNDIsIDB4MDAwMTAwMDQsIDB4MDAxNTE4MjAsXAorICAgICAgICAgICAgICAgICAgICAweGU2YzAwMDAyLCAweGU0MjAyMDAwLCAweDZiZGYzZmQxLCAweDAwMDEwMDA0LFwKKyAgICAgICAgICAgICAgICAgICAgMHgwMDE1MTgyMCwgMHhlNmMwMDAwMiwgMHgwODAwMDI0MCwgMHgwODAwMDI0MH0KKworI2RlZmluZSBDQUxMX0RVTU1ZX0xFTkdUSCAoSU5TVFJVQ1RJT05fU0laRSAqIDI4KQorCisjZWxzZSAvKiBkZWZpbmVkIFBBX0xFVkVMXzAgKi8KKworLyogVGhpcyBpcyB0aGUgY2FsbCBkdW1teSBmb3IgYSBsZXZlbCAwIFBBLiAgTGV2ZWwgMCdzIGRvbid0IGhhdmUgc3BhY2UKKyAgIHJlZ2lzdGVycyAob3IgZmxvYXRpbmcgcG9pbnQ/PyksIHNvIHdlIHNraXAgYWxsIHRoYXQgaW50ZXItc3BhY2UgY2FsbCBzdHVmZiwKKyAgIGFuZCBhdm9pZCB0b3VjaGluZyB0aGUgZnAgcmVncy4KKworY2FsbF9kdW1teQorCisJbGR3IC0zNiglc3ApLCAlYXJnMAorCWxkdyAtNDAoJXNwKSwgJWFyZzEKKwlsZHcgLTQ0KCVzcCksICVhcmcyCisJbGR3IC00OCglc3ApLCAlYXJnMworCWxkaWwgMCwgJXIzMQkJCTsgRlVOQ19MRElMX09GRlNFVCBtdXN0IHBvaW50IGhlcmUKKwlsZG8gMCglcjMxKSwgJXIzMQkJOyBGVU5DX0xET19PRkZTRVQgbXVzdCBwb2ludCBoZXJlCisJYmxlIDAoJXNyMCwgJXIzMSkKKwljb3B5ICVyMzEsICVyMgorCWJyZWFrIDQsIDggCisJbm9wCQkJCTsgcmVzdG9yZV9wY19xdWV1ZSBleHBlY3RzIHRoZXNlCisJYnYsbiAwKCVyMjIpCQkJOyBpbnN0cnVjdGlvbnMgdG8gYmUgaGVyZS4uLgorCW5vcAorKi8KKworLyogRGVmaW5lIG9mZnNldHMgaW50byB0aGUgY2FsbCBkdW1teSBmb3IgdGhlIHRhcmdldCBmdW5jdGlvbiBhZGRyZXNzICovCisjZGVmaW5lIEZVTkNfTERJTF9PRkZTRVQgKElOU1RSVUNUSU9OX1NJWkUgKiA0KQorI2RlZmluZSBGVU5DX0xET19PRkZTRVQgKElOU1RSVUNUSU9OX1NJWkUgKiA1KQorCisjZGVmaW5lIENBTExfRFVNTVkgezB4NGJkYTNmYjksIDB4NGJkOTNmYjEsIDB4NGJkODNmYTksIDB4NGJkNzNmYTEsXAorCQkgICAgMHgyM2UwMDAwMCwgMHgzN2ZmMDAwMCwgMHhlN2UwMDAwMCwgMHgwODFmMDI0MixcCisJCSAgICAweDAwMDEwMDA0LCAweDA4MDAwMjQwLCAweGVhYzBjMDAyLCAweDA4MDAwMjQwfQorCisjZGVmaW5lIENBTExfRFVNTVlfTEVOR1RIIChJTlNUUlVDVElPTl9TSVpFICogMTIpCisKKyNlbmRpZgorCisjZGVmaW5lIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUIDAKKworLyogSWYgd2UndmUgcmVhY2hlZCBhIHRyYXAgaW5zdHJ1Y3Rpb24gd2l0aGluIHRoZSBjYWxsIGR1bW15LCB0aGVuCisgICB3ZSdsbCBjb25zaWRlciB0aGF0IHRvIG1lYW4gdGhhdCB3ZSd2ZSByZWFjaGVkIHRoZSBjYWxsIGR1bW15J3MKKyAgIGVuZCBhZnRlciBpdHMgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLiAqLworI2RlZmluZSBDQUxMX0RVTU1ZX0hBU19DT01QTEVURUQocGMsIHNwLCBmcmFtZV9hZGRyZXNzKSBcCisgIChQQ19JTl9DQUxMX0RVTU1ZKChwYyksIChzcCksIChmcmFtZV9hZGRyZXNzKSkgJiYgXAorICAgKHJlYWRfbWVtb3J5X2ludGVnZXIoKHBjKSwgNCkgPT0gQlJFQUtQT0lOVDMyKSkKKworLyoKKyAqIEluc2VydCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBhcmdzIGFuZCBmdW5jdGlvbiBhZGRyZXNzCisgKiBpbnRvIGEgY2FsbCBzZXF1ZW5jZSBvZiB0aGUgYWJvdmUgZm9ybSBzdG9yZWQgYXQgRFVNTVlOQU1FLgorICoKKyAqIE9uIHRoZSBocHBhIHdlIG5lZWQgdG8gY2FsbCB0aGUgc3RhY2sgZHVtbXkgdGhyb3VnaCAkJGR5bmNhbGwuCisgKiBUaGVyZWZvcmUgb3VyIHZlcnNpb24gb2YgRklYX0NBTExfRFVNTVkgdGFrZXMgYW4gZXh0cmEgYXJndW1lbnQsCisgKiByZWFsX3BjLCB3aGljaCBpcyB0aGUgbG9jYXRpb24gd2hlcmUgZ2RiIHNob3VsZCBzdGFydCB1cCB0aGUKKyAqIGluZmVyaW9yIHRvIGRvIHRoZSBmdW5jdGlvbiBjYWxsLgorICovCisKKyNkZWZpbmUgRklYX0NBTExfRFVNTVkgaHBwYV9maXhfY2FsbF9kdW1teQorCitleHRlcm4gQ09SRV9BRERSCitocHBhX2ZpeF9jYWxsX2R1bW15IFBBUkFNUyAoKGNoYXIgKiwgQ09SRV9BRERSLCBDT1JFX0FERFIsIGludCwKKwkJCSAgICAgc3RydWN0IHZhbHVlICoqLCBzdHJ1Y3QgdHlwZSAqLCBpbnQpKTsKKworI2RlZmluZSBQVVNIX0FSR1VNRU5UUyhuYXJncywgYXJncywgc3AsIHN0cnVjdF9yZXR1cm4sIHN0cnVjdF9hZGRyKSBcCisgICAgc3AgPSBocHBhX3B1c2hfYXJndW1lbnRzKChuYXJncyksIChhcmdzKSwgKHNwKSwgKHN0cnVjdF9yZXR1cm4pLCAoc3RydWN0X2FkZHIpKQorZXh0ZXJuIENPUkVfQUREUgoraHBwYV9wdXNoX2FyZ3VtZW50cyBQQVJBTVMgKChpbnQsIHN0cnVjdCB2YWx1ZSAqKiwgQ09SRV9BRERSLCBpbnQsCisJCQkgICAgIENPUkVfQUREUikpOworDAorLyogVGhlIGxvdyB0d28gYml0cyBvZiB0aGUgUEMgb24gdGhlIFBBIGNvbnRhaW4gdGhlIHByaXZpbGVnZSBsZXZlbC4gIFNvbWUKKyAgIGdlbml1cyBpbXBsZW1lbnRpbmcgYSAobm9uLUdDQykgY29tcGlsZXIgYXBwYXJlbnRseSBkZWNpZGVkIHRoaXMgbWVhbnMKKyAgIHRoYXQgImFkZHJlc3NlcyIgaW4gYSB0ZXh0IHNlY3Rpb24gdGhlcmVmb3JlIGluY2x1ZGUgYSBwcml2aWxlZ2UgbGV2ZWwsCisgICBhbmQgdGh1cyBzeW1ib2wgdGFibGVzIHNob3VsZCBjb250YWluIHRoZXNlIGJpdHMuICBUaGlzIHNlZW1zIGxpa2UgYQorICAgYm9uZWhlYWQgdGhpbmcgdG8gZG8tLWFueXdheSwgaXQgc2VlbXMgdG8gd29yayBmb3Igb3VyIHB1cnBvc2VzIHRvIGp1c3QKKyAgIGlnbm9yZSB0aG9zZSBiaXRzLiAgKi8KKyNkZWZpbmUgU01BU0hfVEVYVF9BRERSRVNTKGFkZHIpICgoYWRkcikgJj0gfjB4MykKKworI2RlZmluZQlHREJfVEFSR0VUX0lTX0hQUEEKKworI2RlZmluZSBCRUxJRVZFX1BDQ19QUk9NT1RJT04gMQorCisvKgorICogVW53aW5kIHRhYmxlIGFuZCBkZXNjcmlwdG9yLgorICovCisKK3N0cnVjdCB1bndpbmRfdGFibGVfZW50cnkgeworICB1bnNpZ25lZCBpbnQgcmVnaW9uX3N0YXJ0OworICB1bnNpZ25lZCBpbnQgcmVnaW9uX2VuZDsKKworICB1bnNpZ25lZCBpbnQgQ2Fubm90X3Vud2luZCAgICAgICAgIDogIDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIDAgKi8KKyAgdW5zaWduZWQgaW50IE1pbGxpY29kZSAgICAgICAgICAgICA6ICAxOyAgICAgICAgICAgICAgICAgICAgICAvKiAxICovCisgIHVuc2lnbmVkIGludCBNaWxsaWNvZGVfc2F2ZV9zcjAgICAgOiAgMTsgICAgICAgICAgICAgICAgICAgICAgLyogMiAqLworICB1bnNpZ25lZCBpbnQgUmVnaW9uX2Rlc2NyaXB0aW9uICAgIDogIDI7ICAgICAgICAgICAgICAgICAgICAgIC8qIDMuLjQgKi8KKyAgdW5zaWduZWQgaW50IHJlc2VydmVkMSAgICAgICAgICAgICA6ICAxOyAgICAgICAgICAgICAgICAgICAgICAvKiA1ICovCisgIHVuc2lnbmVkIGludCBFbnRyeV9TUiAgICAgICAgICAgICAgOiAgMTsgICAgICAgICAgICAgICAgICAgICAgLyogNiAqLworICB1bnNpZ25lZCBpbnQgRW50cnlfRlIgICAgICAgICAgICAgIDogIDQ7IC8qIG51bWJlciBzYXZlZCAqLyAgIC8qIDcuLjEwICovCisgIHVuc2lnbmVkIGludCBFbnRyeV9HUiAgICAgICAgICAgICAgOiAgNTsgLyogbnVtYmVyIHNhdmVkICovICAgLyogMTEuLjE1ICovCisgIHVuc2lnbmVkIGludCBBcmdzX3N0b3JlZCAgICAgICAgICAgOiAgMTsgICAgICAgICAgICAgICAgICAgICAgLyogMTYgKi8KKyAgdW5zaWduZWQgaW50IFZhcmlhYmxlX0ZyYW1lCSAgICAgOiAgMTsgICAgICAgICAgICAgICAgICAgICAgLyogMTcgKi8KKyAgdW5zaWduZWQgaW50IFNlcGFyYXRlX1BhY2thZ2VfQm9keSA6ICAxOyAgICAgICAgICAgICAgICAgICAgICAvKiAxOCAqLworICB1bnNpZ25lZCBpbnQgRnJhbWVfRXh0ZW5zaW9uX01pbGxpY29kZToxOyAgICAgICAgICAgICAgICAgICAgIC8qIDE5ICovCisgIHVuc2lnbmVkIGludCBTdGFja19PdmVyZmxvd19DaGVjayAgOiAgMTsgICAgICAgICAgICAgICAgICAgICAgLyogMjAgKi8KKyAgdW5zaWduZWQgaW50IFR3b19JbnN0cnVjdGlvbl9TUF9JbmNyZW1lbnQ6MTsgICAgICAgICAgICAgICAgICAvKiAyMSAqLworICB1bnNpZ25lZCBpbnQgQWRhX1JlZ2lvbgkgICAgIDogIDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIDIyICovCisgIHVuc2lnbmVkIGludCBjeHhfaW5mbyAgICAgICAgICAgICAgOiAgMTsgICAgICAgICAgICAgICAgICAgICAgLyogMjMgKi8KKyAgdW5zaWduZWQgaW50IGN4eF90cnlfY2F0Y2ggICAgICAgICA6ICAxOyAgICAgICAgICAgICAgICAgICAgICAvKiAyNCAqLworICB1bnNpZ25lZCBpbnQgc2NoZWRfZW50cnlfc2VxICAgICAgIDogIDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIDI1ICovCisgIHVuc2lnbmVkIGludCByZXNlcnZlZDIJICAgICA6ICAxOyAgICAgICAgICAgICAgICAgICAgICAvKiAyNiAqLworICB1bnNpZ25lZCBpbnQgU2F2ZV9TUCAgICAgICAgICAgICAgIDogIDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIDI3ICovCisgIHVuc2lnbmVkIGludCBTYXZlX1JQICAgICAgICAgICAgICAgOiAgMTsgICAgICAgICAgICAgICAgICAgICAgLyogMjggKi8KKyAgdW5zaWduZWQgaW50IFNhdmVfTVJQX2luX2ZyYW1lICAgICA6ICAxOyAgICAgICAgICAgICAgICAgICAgICAvKiAyOSAqLworICB1bnNpZ25lZCBpbnQgZXh0bl9wdHJfZGVmaW5lZCAgICAgIDogIDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIDMwICovCisgIHVuc2lnbmVkIGludCBDbGVhbnVwX2RlZmluZWQgICAgICAgOiAgMTsgICAgICAgICAgICAgICAgICAgICAgLyogMzEgKi8KKworICB1bnNpZ25lZCBpbnQgTVBFX1hMX2ludGVycnVwdF9tYXJrZXI6IDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIDAgKi8KKyAgdW5zaWduZWQgaW50IEhQX1VYX2ludGVycnVwdF9tYXJrZXI6ICAxOyAgICAgICAgICAgICAgICAgICAgICAvKiAxICovCisgIHVuc2lnbmVkIGludCBMYXJnZV9mcmFtZQkgICAgIDogIDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIDIgKi8KKyAgdW5zaWduZWQgaW50IFBzZXVkb19TUF9TZXQgICAgICAgICA6ICAxOyAgICAgICAgICAgICAgICAgICAgICAvKiAzICovCisgIHVuc2lnbmVkIGludCByZXNlcnZlZDQgICAgICAgICAgICAgOiAgMTsgICAgICAgICAgICAgICAgICAgICAgLyogNCAqLworICB1bnNpZ25lZCBpbnQgVG90YWxfZnJhbWVfc2l6ZSAgICAgIDogMjc7ICAgICAgICAgICAgICAgICAgICAgIC8qIDUuLjMxICovCisKKyAgLyogVGhpcyBpcyAqTk9UKiBwYXJ0IG9mIGFuIGFjdHVhbCB1bndpbmRfZGVzY3JpcHRvciBpbiBhbiBvYmplY3QKKyAgICAgZmlsZS4gIEl0IGlzICpPTkxZKiBwYXJ0IG9mIHRoZSAiaW50ZXJuYWxpemVkIiBkZXNjcmlwdG9ycyB0aGF0CisgICAgIHdlIGNyZWF0ZSBmcm9tIHRob3NlIGluIGEgZmlsZS4KKyAgICAgKi8KKyAgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgIHN0dWJfdHlwZSAgICAgICAgICA6IDQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiAwLi4zICovCisgICAgdW5zaWduZWQgaW50ICBwYWRkaW5nICAgICAgICAgICAgOiAyODsgICAgICAgICAgICAgICAgICAgICAgLyogNC4uMzEgKi8KKyAgfSBzdHViX3Vud2luZDsKK307CisKKy8qIEhQIGxpbmtlcnMgYWxzbyBnZW5lcmF0ZSB1bndpbmRzIGZvciB2YXJpb3VzIGxpbmtlci1nZW5lcmF0ZWQgc3R1YnMuCisgICBHREIgcmVhZHMgaW4gdGhlIHN0dWJzIGZyb20gdGhlICRVTldJTkRfRU5EJCBzdWJzcGFjZSwgdGhlbiAKKyAgICJjb252ZXJ0cyIgdGhlbSBpbnRvIG5vcm1hbCB1bndpbmQgZW50cmllcyB1c2luZyBzb21lIG9mIHRoZSByZXNlcnZlZAorICAgZmllbGRzIHRvIHN0b3JlIHRoZSBzdHViIHR5cGUuICAqLworCitzdHJ1Y3Qgc3R1Yl91bndpbmRfZW50cnkKK3sKKyAgLyogVGhlIG9mZnNldCB3aXRoaW4gdGhlIGV4ZWN1dGFibGUgZm9yIHRoZSBhc3NvY2lhdGVkIHN0dWIuICAqLworICB1bnNpZ25lZCBzdHViX29mZnNldDsKKworICAvKiBUaGUgdHlwZSBvZiBzdHViIHRoaXMgdW53aW5kIGVudHJ5IGRlc2NyaWJlcy4gICovCisgIGNoYXIgdHlwZTsKKworICAvKiBVbmtub3duLiAgTm90IG5lZWRlZCBieSBHREIgYXQgdGhpcyB0aW1lLiAgKi8KKyAgY2hhciBwcnNfaW5mbzsKKworICAvKiBMZW5ndGggKGluIGluc3RydWN0aW9ucykgb2YgdGhlIGFzc29jaWF0ZWQgc3R1Yi4gICovCisgIHNob3J0IHN0dWJfbGVuZ3RoOworfTsKKworLyogU2l6ZXMgKGluIGJ5dGVzKSBvZiB0aGUgbmF0aXZlIHVud2luZCBlbnRyaWVzLiAgKi8KKyNkZWZpbmUgVU5XSU5EX0VOVFJZX1NJWkUgMTYKKyNkZWZpbmUgU1RVQl9VTldJTkRfRU5UUllfU0laRSA4CisKKy8qIFRoZSBnYXBzIHJlcHJlc2VudCBsaW5rZXIgc3R1YnMgdXNlZCBpbiBNUEUgYW5kIHNwYWNlIGZvciBmdXR1cmUKKyAgIGV4cGFuc2lvbi4gICovCitlbnVtIHVud2luZF9zdHViX3R5cGVzCit7CisgIExPTkdfQlJBTkNIID0gMSwKKyAgUEFSQU1FVEVSX1JFTE9DQVRJT04gPSAyLAorICBFWFBPUlQgPSAxMCwKKyAgSU1QT1JUID0gMTEsCit9OworCisvKiBXZSB1c2UgdGhlIG9iamZpbGUtPm9ial9wcml2YXRlIHBvaW50ZXIgZm9yIHR3byB0aGluZ3M6CisgKgorICogMS4gIEFuIHVud2luZCB0YWJsZTsKKyAqCisgKiAyLiAgQSBwb2ludGVyIHRvIGFueSBhc3NvY2lhdGVkIHNoYXJlZCBsaWJyYXJ5IG9iamVjdC4KKyAqCisgKiAjZGVmaW5lcyBhcmUgdXNlZCB0byBoZWxwIHJlZmVyIHRvIHRoZXNlIG9iamVjdHMuCisgKi8KKyAKKy8qIEluZm8gYWJvdXQgdGhlIHVud2luZCB0YWJsZSBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0IGZpbGUuCisgKgorICogVGhpcyBpcyBodW5nIG9mZiBvZiB0aGUgIm9iamZpbGUtPm9ial9wcml2YXRlIiBwb2ludGVyLCBhbmQKKyAqIGlzIGFsbG9jYXRlZCBpbiB0aGUgb2JqZmlsZSdzIHBzeW1ib2wgb2JzdGFjay4gIFRoaXMgYWxsb3dzCisgKiB1cyB0byBoYXZlIHVuaXF1ZSB1bndpbmQgaW5mbyBmb3IgZWFjaCBleGVjdXRhYmxlIGFuZCBzaGFyZWQKKyAqIGxpYnJhcnkgdGhhdCB3ZSBhcmUgZGVidWdnaW5nLgorICovCitzdHJ1Y3Qgb2JqX3Vud2luZF9pbmZvIHsKKyAgc3RydWN0IHVud2luZF90YWJsZV9lbnRyeSAqdGFibGU7IC8qIFBvaW50ZXIgdG8gdW53aW5kIGluZm8gKi8KKyAgc3RydWN0IHVud2luZF90YWJsZV9lbnRyeSAqY2FjaGU7IC8qIFBvaW50ZXIgdG8gbGFzdCBlbnRyeSB3ZSBmb3VuZCAqLworICBpbnQgbGFzdDsJCSAgIAkgICAgLyogSW5kZXggb2YgbGFzdCBlbnRyeSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgb2JqX3ByaXZhdGVfc3RydWN0IHsKKyAgIHN0cnVjdCBvYmpfdW53aW5kX2luZm8gKnVud2luZF9pbmZvOyAvKiBhIHBvaW50ZXIgKi8KKyAgIHN0cnVjdCBzb19saXN0ICAgICAgICAgKnNvX2luZm87ICAgICAvKiBhIHBvaW50ZXIgICovCit9IG9ial9wcml2YXRlX2RhdGFfdDsKKworI2lmIDAKK2V4dGVybiB2b2lkIHRhcmdldF93cml0ZV9wYyBQQVJBTVMgKChDT1JFX0FERFIsIGludCkpCitleHRlcm4gQ09SRV9BRERSIHRhcmdldF9yZWFkX3BjIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIENPUkVfQUREUiBza2lwX3RyYW1wb2xpbmVfY29kZSBQQVJBTVMgKChDT1JFX0FERFIsIGNoYXIgKikpOworI2VuZGlmCisKKyNkZWZpbmUgVEFSR0VUX1JFQURfUEMocGlkKSB0YXJnZXRfcmVhZF9wYyAocGlkKQorZXh0ZXJuIENPUkVfQUREUiB0YXJnZXRfcmVhZF9wYyBQQVJBTVMgKChpbnQpKTsKKworI2RlZmluZSBUQVJHRVRfV1JJVEVfUEModixwaWQpIHRhcmdldF93cml0ZV9wYyAodixwaWQpCitleHRlcm4gdm9pZCB0YXJnZXRfd3JpdGVfcGMgUEFSQU1TICgoQ09SRV9BRERSLCBpbnQpKTsKKworI2RlZmluZSBUQVJHRVRfUkVBRF9GUCgpIHRhcmdldF9yZWFkX2ZwIChpbmZlcmlvcl9waWQpCitleHRlcm4gQ09SRV9BRERSICB0YXJnZXRfcmVhZF9mcCBQQVJBTVMgKChpbnQpKTsKKworLyogRm9yIGEgbnVtYmVyIG9mIGhvcnJpYmxlIHJlYXNvbnMgd2UgbWF5IGhhdmUgdG8gYWRqdXN0IHRoZSBsb2NhdGlvbgorICAgb2YgdmFyaWFibGVzIG9uIHRoZSBzdGFjay4gIFVnaC4gICovCisjZGVmaW5lIEhQUkVBRF9BREpVU1RfU1RBQ0tfQUREUkVTUyhBRERSKSBocHJlYWRfYWRqdXN0X3N0YWNrX2FkZHJlc3MoQUREUikKKworZXh0ZXJuIGludCBocHJlYWRfYWRqdXN0X3N0YWNrX2FkZHJlc3MgUEFSQU1TICgoQ09SRV9BRERSKSk7CisKKy8qIElmIHRoZSBjdXJyZW50IGdjYyBmb3IgZm9yIHRoaXMgdGFyZ2V0IGRvZXMgbm90IHByb2R1Y2UgY29ycmVjdCBkZWJ1Z2dpbmcKKyAgIGluZm9ybWF0aW9uIGZvciBmbG9hdCBwYXJhbWV0ZXJzLCBib3RoIHByb3RvdHlwZWQgYW5kIHVucHJvdG90eXBlZCwgdGhlbgorICAgZGVmaW5lIHRoaXMgbWFjcm8uICBUaGlzIGZvcmNlcyBnZGIgdG8gIGFsd2F5cyBhc3N1bWUgdGhhdCBmbG9hdHMgYXJlCisgICBwYXNzZWQgYXMgZG91YmxlcyBhbmQgdGhlbiBjb252ZXJ0ZWQgaW4gdGhlIGNhbGxlZS4KKworICAgRm9yIHRoZSBwYSwgaXQgYXBwZWFycyB0aGF0IHRoZSBkZWJ1ZyBpbmZvIG1hcmtzIHRoZSBwYXJhbWV0ZXJzIGFzCisgICBmbG9hdHMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpcyBwcm90b3R5cGVkLCBidXQgdGhlIGFjdHVhbAorICAgdmFsdWVzIGFyZSBwYXNzZWQgYXMgZG91YmxlcyBmb3IgdGhlIG5vbi1wcm90b3R5cGVkIGNhc2UgYW5kIGZsb2F0cyBmb3IKKyAgIHRoZSBwcm90b3R5cGVkIGNhc2UuICBUaHVzIHdlIGNob29zZSB0byBtYWtlIHRoZSBub24tcHJvdG90eXBlZCBjYXNlIHdvcmsKKyAgIGZvciBDIGFuZCBicmVhayB0aGUgcHJvdG90eXBlZCBjYXNlLCBzaW5jZSB0aGUgbm9uLXByb3RvdHlwZWQgY2FzZSBpcworICAgcHJvYmFibHkgbXVjaCBtb3JlIGNvbW1vbi4gIChGSVhNRSkuICovCisKKyNkZWZpbmUgQ09FUkNFX0ZMT0FUX1RPX0RPVUJMRSAoY3VycmVudF9sYW5ndWFnZSAtPiBsYV9sYW5ndWFnZSA9PSBsYW5ndWFnZV9jKQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9wYS90bS1ocHBhYi5oIGIvZ2RiL2NvbmZpZy9wYS90bS1ocHBhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZDQzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3BhL3RtLWhwcGFiLmgKQEAgLTAsMCArMSw0NyBAQAorLyogUGFyYW1ldGVycyBmb3IgZXhlY3V0aW9uIG9uIGFuIEhQIFBBLVJJU0MgbWFjaGluZSBydW5uaW5nIEJTRCwgZm9yIEdEQi4KKyAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlCisgICBVbml2ZXJzaXR5IG9mIFV0YWggKHBhLWdkYi1idWdzQGNzLnV0YWguZWR1KS4gICovCisKKy8qIEZvciBCU0Q6CisKKyAgIFRoZSBzaWduYWwgY29udGV4dCBzdHJ1Y3R1cmUgcG9pbnRlciBpcyBhbHdheXMgc2F2ZWQgYXQgdGhlIGJhc2UKKyAgIG9mIHRoZSBmcmFtZSArIDB4NC4KKworICAgV2UgZ2V0IHRoZSBQQyAmIFNQIGRpcmVjdGx5IGZyb20gdGhlIHNpZ2NvbnRleHQgc3RydWN0dXJlIGl0c2VsZi4KKyAgIEZvciBvdGhlciByZWdpc3RlcnMgd2UgaGF2ZSB0byBkaXZlIGluIGEgbGl0dGxlIGRlZXBlcjogCisKKyAgIFRoZSBoYXJkd2FyZSBzYXZlIHN0YXRlIHBvaW50ZXIgaXMgYXQgb2Zmc2V0IDB4MTAgd2l0aGluIHRoZSAKKyAgIHNpZ25hbCBjb250ZXh0IHN0cnVjdHVyZS4KKworICAgV2l0aGluIHRoZSBoYXJkd2FyZSBzYXZlIHN0YXRlLCByZWdpc3RlcnMgYXJlIGZvdW5kIGluIHRoZSBzYW1lIG9yZGVyCisgICBhcyB0aGUgcmVnaXN0ZXIgbnVtYmVycyBpbiBHREIuICovCisKKyNkZWZpbmUgRlJBTUVfU0FWRURfUENfSU5fU0lHVFJBTVAoRlJBTUUsIFRNUCkgXAoreyBcCisgICooVE1QKSA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKChGUkFNRSktPmZyYW1lICsgMHg0LCA0KTsgXAorICAqKFRNUCkgPSByZWFkX21lbW9yeV9pbnRlZ2VyICgqKFRNUCkgKyAweDE4LCA0KTsgXAorfQorCisjZGVmaW5lIEZSQU1FX0JBU0VfQkVGT1JFX1NJR1RSQU1QKEZSQU1FLCBUTVApIFwKK3sgXAorICAqKFRNUCkgPSByZWFkX21lbW9yeV9pbnRlZ2VyICgoRlJBTUUpLT5mcmFtZSArIDB4NCwgNCk7IFwKKyAgKihUTVApID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoKihUTVApICsgMHg4LCA0KTsgXAorfQorCisjZGVmaW5lIEZSQU1FX0ZJTkRfU0FWRURfUkVHU19JTl9TSUdUUkFNUChGUkFNRSwgRlNSKSBcCit7IFwKKyAgaW50IGk7IFwKKyAgQ09SRV9BRERSIFRNUDsgXAorICBUTVAgPSByZWFkX21lbW9yeV9pbnRlZ2VyICgoRlJBTUUpLT5mcmFtZSArIDB4NCwgNCk7IFwKKyAgVE1QID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoVE1QICsgMHgxMCwgNCk7IFwKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9SRUdTOyBpKyspIFwKKyAgICB7IFwKKyAgICAgIGlmIChpID09IFNQX1JFR05VTSkgXAorCShGU1IpLT5yZWdzW1NQX1JFR05VTV0gPSByZWFkX21lbW9yeV9pbnRlZ2VyIChUTVAgKyBTUF9SRUdOVU0gKiA0LCA0KTsgXAorICAgICAgZWxzZSBcCisJKEZTUiktPnJlZ3NbaV0gPSBUTVAgKyBpICogNDsgXAorICAgIH0gXAorfQorCisvKiBJdCdzIG1vc3RseSBqdXN0IHRoZSBjb21tb24gc3R1ZmYuICAqLworI2luY2x1ZGUgInBhL3RtLWhwcGEuaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcGEvdG0taHBwYWguaCBiL2dkYi9jb25maWcvcGEvdG0taHBwYWguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGYxMTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wYS90bS1ocHBhaC5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIGV4ZWN1dGlvbiBvbiBhbiBIUCBQQS1SSVNDIG1hY2hpbmUsIHJ1bm5pbmcgSFBVWCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAKKworICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKKyAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgSFBVWF9TTkFQMQorI2RlZmluZSBIUFVYX1NOQVAyCisKKyNpbmNsdWRlICJzb21zb2xpYi5oIgorCisvKiBBY3R1YWxseSwgZm9yIGEgUEEgcnVubmluZyBIUFVYIHRoZSBrZXJuZWwgY2FsbHMgdGhlIHNpZ25hbCBoYW5kbGVyCisgICB3aXRob3V0IGFuIGludGVybWVkaWF0ZSB0cmFtcG9saW5lLiAgTHVja2lseSB0aGUga2VybmVsIGFsd2F5cyBzZXRzCisgICB0aGUgcmV0dXJuIHBvaW50ZXIgZm9yIHRoZSBzaWduYWwgaGFuZGxlciB0byBwb2ludCB0byBfc2lncmV0dXJuLiAgKi8KKyNkZWZpbmUgSU5fU0lHVFJBTVAocGMsIG5hbWUpIChuYW1lICYmIFNUUkVRICgiX3NpZ3JldHVybiIsIG5hbWUpKQorCisvKiBGb3IgSFBVWDoKKworICAgVGhlIHNpZ25hbCBjb250ZXh0IHN0cnVjdHVyZSBwb2ludGVyIGlzIGFsd2F5cyBzYXZlZCBhdCB0aGUgYmFzZQorICAgb2YgdGhlIGZyYW1lIHdoaWNoICJjYWxscyIgdGhlIHNpZ25hbCBoYW5kbGVyLiAgV2Ugb25seSB3YW50IHRvIGZpbmQKKyAgIHRoZSBoYXJkd2FyZSBzYXZlIHN0YXRlIHN0cnVjdHVyZSwgd2hpY2ggbGl2ZXMgMTAgMzJiaXQgd29yZHMgaW50bworICAgc2lnY29udGV4dCBzdHJ1Y3R1cmUuCisKKyAgIFdpdGhpbiB0aGUgaGFyZHdhcmUgc2F2ZSBzdGF0ZSBzdHJ1Y3R1cmUsIHJlZ2lzdGVycyBhcmUgZm91bmQgaW4gdGhlCisgICBzYW1lIG9yZGVyIGFzIHRoZSByZWdpc3RlciBudW1iZXJzIGluIEdEQi4KKworICAgQXQgb25lIHRpbWUgd2UgcGVla2VkIGF0ICVyMzEgcmF0aGVyIHRoYW4gdGhlIFBDIHF1ZXVlcyB0byBkZXRlcm1pbmUKKyAgIHdoYXQgaW5zdHJ1Y3Rpb24gdG9vayB0aGUgZmF1bHQuICBUaGlzIHdhcyBkb25lIG9uIHB1cnBvc2UsIGJ1dCBJIGRvbid0CisgICByZW1lbWJlciB3aHkuICBMb29raW5nIGF0IHRoZSBQQyBxdWV1ZXMgaXMgcmVhbGx5IHRoZSByaWdodCB3YXksIGFuZAorICAgSSBkb24ndCByZW1lbWJlciB3aHkgdGhhdCBkaWRuJ3Qgd29yayB3aGVuIHRoaXMgY29kZSB3YXMgb3JpZ2luYWxseQorICAgd3JpdHRlbi4gICovCisKKyNkZWZpbmUgRlJBTUVfU0FWRURfUENfSU5fU0lHVFJBTVAoRlJBTUUsIFRNUCkgXAoreyBcCisgICooVE1QKSA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKChGUkFNRSktPmZyYW1lICsgKDQzICogNCkgLCA0KTsgXAorfQorCisjZGVmaW5lIEZSQU1FX0JBU0VfQkVGT1JFX1NJR1RSQU1QKEZSQU1FLCBUTVApIFwKK3sgXAorICAqKFRNUCkgPSByZWFkX21lbW9yeV9pbnRlZ2VyICgoRlJBTUUpLT5mcmFtZSArICg0MCAqIDQpLCA0KTsgXAorfQorCisjZGVmaW5lIEZSQU1FX0ZJTkRfU0FWRURfUkVHU19JTl9TSUdUUkFNUChGUkFNRSwgRlNSKSBcCit7IFwKKyAgaW50IGk7IFwKKyAgQ09SRV9BRERSIFRNUDsgXAorICBUTVAgPSAoRlJBTUUpLT5mcmFtZSArICgxMCAqIDQpOyBcCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fUkVHUzsgaSsrKSBcCisgICAgeyBcCisgICAgICBpZiAoaSA9PSBTUF9SRUdOVU0pIFwKKwkoRlNSKS0+cmVnc1tTUF9SRUdOVU1dID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoVE1QICsgU1BfUkVHTlVNICogNCwgNCk7IFwKKyAgICAgIGVsc2UgXAorCShGU1IpLT5yZWdzW2ldID0gVE1QICsgaSAqIDQ7IFwKKyAgICB9IFwKK30KKworLyogRm9yIEhQLVVYIG9uIFBBLVJJU0Mgd2UgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbgorICAgZm9yIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgdGFyZ2V0IG9wIChpbiBocHBhLXRkZXAuYykgKi8KKyNkZWZpbmUgQ0hJTERfRU5BQkxFX0VYQ0VQVElPTl9DQUxMQkFDSworI2RlZmluZSBDSElMRF9HRVRfQ1VSUkVOVF9FWENFUFRJT05fRVZFTlQKKworLyogTW9zdGx5IGl0J3MgY29tbW9uIHRvIGFsbCBIUFBBJ3MuICAqLworI2luY2x1ZGUgInBhL3RtLWhwcGEuaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcGEvdG0taHBwYW8uaCBiL2dkYi9jb25maWcvcGEvdG0taHBwYW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGY0MjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wYS90bS1ocHBhby5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIGV4ZWN1dGlvbiBvbiBhbiBIUCBQQS1SSVNDIG1hY2hpbmUgcnVubmluZyBPU0YxLCBmb3IgR0RCLgorICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKKyAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLiAgKi8KKworLyogRGVmaW5lIG9mZnNldHMgdG8gYWNjZXNzIENQUk9DIHN0YWNrIHdoZW4gaXQgZG9lcyBub3QgaGF2ZQorICogYSBrZXJuZWwgdGhyZWFkLgorICovCisjZGVmaW5lIE1BQ0hJTkVfQ1BST0NfU1BfT0ZGU0VUIDIwCisjZGVmaW5lIE1BQ0hJTkVfQ1BST0NfUENfT0ZGU0VUIDE2CisjZGVmaW5lIE1BQ0hJTkVfQ1BST0NfRlBfT0ZGU0VUIDEyCisKKy8qCisgKiBTb2Z0d2FyZSBkZWZpbmVkIFBTVyBtYXNrcy4KKyAqLworI2RlZmluZSBQU1dfU1MgIDB4MTAwMDAwMDAgICAgICAvKiBLZXJuZWwgbWFuYWdlZCBzaW5nbGUgc3RlcCAqLworCisvKiBUaHJlYWQgZmxhdm9ycyB1c2VkIGluIHJlLXNldHRpbmcgdGhlIFQgYml0LgorICogQEAgdGhpcyBpcyBhbHNvIGJhZCBmb3IgY3Jvc3MgZGVidWdnaW5nLgorICovCisjZGVmaW5lIFRSQUNFX0ZMQVZPUgkJSFA4MDBfVEhSRUFEX1NUQVRFCisjZGVmaW5lIFRSQUNFX0ZMQVZPUl9TSVpFCUhQODAwX1RIUkVBRF9TVEFURV9DT1VOVAorI2RlZmluZSBUUkFDRV9TRVQoeCxzdGF0ZSkgXAorCSgoc3RydWN0IGhwODAwX3RocmVhZF9zdGF0ZSAqKXN0YXRlKS0+Y3IyMiB8PSBQU1dfU1MKKyNkZWZpbmUgVFJBQ0VfQ0xFQVIoeCxzdGF0ZSkgXAorICAJKCgoKHN0cnVjdCBocDgwMF90aHJlYWRfc3RhdGUgKilzdGF0ZSktPmNyMjIgJj0gflBTV19TUyksIDEpCisKKy8qIEZvciBPU0YxIChTaG91bGQgYmUgY2xvc2UgaWYgbm90IGlkZW50aWNhbCB0byBCU0QsIGJ1dCBJIGhhdmVuJ3QKKyAgIHRlc3RlZCBpdCB5ZXQpOgorCisgICBUaGUgc2lnbmFsIGNvbnRleHQgc3RydWN0dXJlIHBvaW50ZXIgaXMgYWx3YXlzIHNhdmVkIGF0IHRoZSBiYXNlCisgICBvZiB0aGUgZnJhbWUgKyAweDQuCisKKyAgIFdlIGdldCB0aGUgUEMgJiBTUCBkaXJlY3RseSBmcm9tIHRoZSBzaWdjb250ZXh0IHN0cnVjdHVyZSBpdHNlbGYuCisgICBGb3Igb3RoZXIgcmVnaXN0ZXJzIHdlIGhhdmUgdG8gZGl2ZSBpbiBhIGxpdHRsZSBkZWVwZXI6IAorCisgICBUaGUgaGFyZHdhcmUgc2F2ZSBzdGF0ZSBwb2ludGVyIGlzIGF0IG9mZnNldCAweDEwIHdpdGhpbiB0aGUgCisgICBzaWduYWwgY29udGV4dCBzdHJ1Y3R1cmUuCisKKyAgIFdpdGhpbiB0aGUgaGFyZHdhcmUgc2F2ZSBzdGF0ZSwgcmVnaXN0ZXJzIGFyZSBmb3VuZCBpbiB0aGUgc2FtZSBvcmRlcgorICAgYXMgdGhlIHJlZ2lzdGVyIG51bWJlcnMgaW4gR0RCLiAqLworCisjZGVmaW5lIEZSQU1FX1NBVkVEX1BDX0lOX1NJR1RSQU1QKEZSQU1FLCBUTVApIFwKK3sgXAorICAqKFRNUCkgPSByZWFkX21lbW9yeV9pbnRlZ2VyICgoRlJBTUUpLT5mcmFtZSArIDB4NCwgNCk7IFwKKyAgKihUTVApID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoKihUTVApICsgMHgxOCwgNCk7IFwKK30KKworI2RlZmluZSBGUkFNRV9CQVNFX0JFRk9SRV9TSUdUUkFNUChGUkFNRSwgVE1QKSBcCit7IFwKKyAgKihUTVApID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoKEZSQU1FKS0+ZnJhbWUgKyAweDQsIDQpOyBcCisgICooVE1QKSA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKCooVE1QKSArIDB4OCwgNCk7IFwKK30KKworI2RlZmluZSBGUkFNRV9GSU5EX1NBVkVEX1JFR1NfSU5fU0lHVFJBTVAoRlJBTUUsIEZTUikgXAoreyBcCisgIGludCBpOyBcCisgIENPUkVfQUREUiBUTVA7IFwKKyAgVE1QID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoKEZSQU1FKS0+ZnJhbWUgKyAweDQsIDQpOyBcCisgIFRNUCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKFRNUCArIDB4MTAsIDQpOyBcCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fUkVHUzsgaSsrKSBcCisgICAgeyBcCisgICAgICBpZiAoaSA9PSBTUF9SRUdOVU0pIFwKKwkoRlNSKS0+cmVnc1tTUF9SRUdOVU1dID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoVE1QICsgU1BfUkVHTlVNICogNCwgNCk7IFwKKyAgICAgIGVsc2UgXAorCShGU1IpLT5yZWdzW2ldID0gVE1QICsgaSAqIDQ7IFwKKyAgICB9IFwKK30KKworLyogT1NGMSBkb2VzIG5vdCBuZWVkIHRoZSBwYyBzcGFjZSBxdWV1ZSByZXN0b3JlZC4gICovCisjZGVmaW5lIE5PX1BDX1NQQUNFX1FVRVVFX1JFU1RPUkUKKworLyogVGhlIG1hY2gga2VybmVsIHVzZXMgdGhlIHJlY292ZXJ5IGNvdW50ZXIgdG8gaW1wbGVtZW50IHNpbmdsZQorICAgc3RlcHBpbmcuICBXaGlsZSB0aGlzIGdyZWF0bHkgc2ltcGxpZmllcyB0aGUga2VybmVsIHN1cHBvcnQKKyAgIG5lY2Vzc2FyeSBmb3Igc2luZ2xlIHN0ZXBwaW5nLCBpdCB1bmZvcnR1bmF0ZWx5IGRvZXMgdGhlIHdyb25nCisgICB0aGluZyBpbiB0aGUgcHJlc2Vuc2Ugb2YgYSBudWxsaWZpZWQgaW5zdHJ1Y3Rpb24gKGdpdmVzIGNvbnRyb2wKKyAgIGJhY2sgdHdvIGluc25zIGFmdGVyIHRoZSBudWxsaWZlZCBpbnNuKS4gIFRoaXMgaXMgYW4gYXJ0aWZhY3QKKyAgIG9mIHRoZSBIUCBhcmNoaXRlY3R1cmUgKHJlY292ZXJ5IGNvdW50ZXIgZG9lc24ndCB0aWNrIGZvcgorICAgbnVsbGlmaWVkIGluc25zKS4KKworICAgRG8gb3VyIGJlc3QgdG8gYXZvaWQgbG9zaW5nIGluIHN1Y2ggc2l0dWF0aW9ucy4gICovCisjZGVmaW5lIElOU1RSVUNUSU9OX05VTExJRklFRCBcCisoKHsgXAorICAgIGludCBpcHN3ID0gKGludClyZWFkX3JlZ2lzdGVyKElQU1dfUkVHTlVNKTsgXAorICAgIGlmIChpcHN3ICYgUFNXX04pICBcCisgICAgICB7IFwKKyAgICAgICAgaW50IHBjb3F0ID0gKGludClyZWFkX3JlZ2lzdGVyKFBDT1FfVEFJTF9SRUdOVU0pOyBcCisgICAgICAgIHdyaXRlX3JlZ2lzdGVyKFBDT1FfSEVBRF9SRUdOVU0sIHBjb3F0KTsgXAorICAgICAgICB3cml0ZV9yZWdpc3RlcihQQ09RX1RBSUxfUkVHTlVNLCBwY29xdCArIDB4NCk7IFwKKyAgICAgICAgd3JpdGVfcmVnaXN0ZXIoSVBTV19SRUdOVU0sIGlwc3cgJiB+KFBTV19OIHwgUFNXX0IgfCBQU1dfWCkpOyBcCisgICAgICAgIHN0b3BfcGMgPSBwY29xdDsgXAorICAgICAgfSBcCisgICB9KSwgMCkgCisKKy8qIEl0J3MgbW9zdGx5IGp1c3QgdGhlIGNvbW1vbiBzdHVmZi4gICovCisKKyNpbmNsdWRlICJwYS90bS1ocHBhLmgiCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3BhL3RtLXByby5oIGIvZ2RiL2NvbmZpZy9wYS90bS1wcm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWVjYjYyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wYS90bS1wcm8uaApAQCAtMCwwICsxLDE0IEBACisvKiBQYXJhbWV0ZXJzIGZvciBleGVjdXRpb24gb24gYW4gSFAgUEEtUklTQyBsZXZlbCAwIGVtYmVkZGVkIHN5c3RlbS4KKyAgIFRoaXMgaXMgYmFzZWQgb24gdG0taHBwYWIuaC4KKyAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlCisgICBVbml2ZXJzaXR5IG9mIFV0YWggKHBhLWdkYi1idWdzQGNzLnV0YWguZWR1KS4gICovCisKKyNkZWZpbmUgUEFfTEVWRUxfMAkJLyogRGlzYWJsZXMgdG91Y2hpbmcgc3BhY2UgcmVncyBhbmQgZnAgKi8KKworLyogQWxsIHRoZSBQUk8gdGFyZ2V0cyB1c2Ugc29mdHdhcmUgZmxvYXRpbmcgcG9pbnQgYXQgdGhlIG1vbWVudC4gICovCisjZGVmaW5lIFNPRlRfRkxPQVQgMQorCisvKiBJdCdzIG1vc3RseSBqdXN0IHRoZSBjb21tb24gc3R1ZmYuICAqLworI2luY2x1ZGUgInBhL3RtLWhwcGEuaCIKKworI2RlZmluZSBHREJfVEFSR0VUX0lTX1BBX0VMRgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9wYS94bS1ocHBhYi5oIGIvZ2RiL2NvbmZpZy9wYS94bS1ocHBhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNjQ2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3BhL3htLWhwcGFiLmgKQEAgLTAsMCArMSwyNyBAQAorLyogUGFyYW1ldGVycyBmb3IgaG9zdGluZyBvbiBhbiBIUFBBIFBBLVJJU0MgbWFjaGluZSwgcnVubmluZyBCU0QsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gCisKKyAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlCisgICBVbml2ZXJzaXR5IG9mIFV0YWggKHBhLWdkYi1idWdzQGNzLnV0YWguZWR1KS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGlzIGEgYmlnLWVuZGlhbiBob3N0LiAgKi8KKworI2RlZmluZQlIT1NUX0JZVEVfT1JERVIJQklHX0VORElBTgorCisjaW5jbHVkZSAicGEveG0tcGEuaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcGEveG0taHBwYWguaCBiL2dkYi9jb25maWcvcGEveG0taHBwYWguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2Q0N2RkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wYS94bS1ocHBhaC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIGhvc3Rpbmcgb24gYW4gSFBQQS1SSVNDIG1hY2hpbmUgcnVubmluZyBIUFVYLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIAorCisgICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQorICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogSG9zdCBpcyBiaWctZW5kaWFuLiAqLworI2RlZmluZQlIT1NUX0JZVEVfT1JERVIJQklHX0VORElBTgorCisjaW5jbHVkZSAicGEveG0tcGEuaCIKKworI2RlZmluZSBVU0cKKworI2lmbmRlZiBfX1NURENfXworLyogVGhpcyBkZWZpbmUgaXMgZGlzY3Vzc2VkIGluIGRlY29kZV9saW5lXzEgaW4gc3ltdGFiLmMgICovCisjZGVmaW5lIEhQUEFfQ09NUElMRVJfQlVHCisjZW5kaWYKKworI2RlZmluZSBIQVZFX1RFUk1JT1MKKworLyogSFAgZGVmaW5lcyBtYWxsb2MgYW5kIHJlYWxsb2MgYXMgcmV0dXJuaW5nIHZvaWQgKiwgZXZlbiBmb3Igbm9uLUFOU0kKKyAgIGNvbXBpbGF0aW9ucyAoc3VjaCBhcyB3aXRoIHRoZSBuYXRpdmUgY29tcGlsZXIpLiAqLworCisjZGVmaW5lIE1BTExPQ19JTkNPTVBBVElCTEUKKworZXh0ZXJuIHZvaWQgKgorbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOworCitleHRlcm4gdm9pZCAqCityZWFsbG9jIFBBUkFNUyAoKHZvaWQgKiwgc2l6ZV90KSk7CisKK2V4dGVybiB2b2lkCitmcmVlIFBBUkFNUyAoKHZvaWQgKikpOwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9wYS94bS1wYS5oIGIvZ2RiL2NvbmZpZy9wYS94bS1wYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OTYwOWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3BhL3htLXBhLmgKQEAgLTAsMCArMSw1IEBACisvKiBEZWZpbml0aW9ucyBmb3IgYWxsIFBBIG1hY2hpbmVzLiAgKi8KKworLyogVGhpcyB3YXMgY3JlYXRlZCBmb3IgIm1ha2V2YSIsIHdoaWNoIGlzIG9ic29sZXRlLiAgVGhpcyBmaWxlIGNhbgorICAgcHJvYmFibHkgZ28gYXdheSAodW5sZXNzIHNvbWVvbmUgY2FuIHRoaW5rIG9mIHNvbWUgb3RoZXIgaG9zdCB0aGluZworICAgd2hpY2ggaXMgY29tbW9uIHRvIHZhcmlvdXMgcGEgbWFjaGluZXMpLiAgKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcG93ZXJwYy9haXgubWggYi9nZGIvY29uZmlnL3Bvd2VycGMvYWl4Lm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYzNlMzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3Bvd2VycGMvYWl4Lm1oCkBAIC0wLDAgKzEsMTEgQEAKKyMgSG9zdDogSUJNIFBvd2VyUEMgcnVubmluZyBBSVgKKworWE1fRklMRT0geG0tYWl4LmgKK1hERVBGSUxFUz0gCisKK05BVF9GSUxFPSBubS1haXguaAorTkFUREVQRklMRVM9IGZvcmstY2hpbGQubyBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gY29yZWxvdy5vIHJzNjAwMC1uYXQubyB4Y29mZnJlYWQubworCisjIFdoZW4gY29tcGlsZWQgd2l0aCBjYywgZm9yIGRlYnVnZ2luZywgdGhpcyBhcmd1bWVudCBzaG91bGQgYmUgcGFzc2VkLgorIyBXZSBoYXZlIG5vIGlkZWEgd2hvIG91ciBjdXJyZW50IGNvbXBpbGVyIGlzIHRob3VnaCwgc28gd2Ugc2tpcCBpdC4KKyMgTUhfQ0ZMQUdTID0gLWJub2RlbGNzZWN0CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3Bvd2VycGMvYWl4Lm10IGIvZ2RiL2NvbmZpZy9wb3dlcnBjL2FpeC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDAzYjdkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wb3dlcnBjL2FpeC5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBQb3dlclBDIHJ1bm5pbmcgQUlYCitUREVQRklMRVM9IHJzNjAwMC10ZGVwLm8geGNvZmZzb2xpYi5vCitUTV9GSUxFPSB0bS1wcGMtYWl4LmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcG93ZXJwYy9jeWd3aW4ubWggYi9nZGIvY29uZmlnL3Bvd2VycGMvY3lnd2luLm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMjU3MDkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3Bvd2VycGMvY3lnd2luLm1oCkBAIC0wLDAgKzEsNSBAQAorTUhfQ0ZMQUdTPQorWE1fRklMRT14bS1jeWd3aW4uaAorWERFUF9GSUxFUz1zZXItdGNwLm8KK05BVERFUEZJTEVTPXdpbjMyLW5hdC5vCitYTV9DTElCUz0tbGtlcm5lbDMyCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3Bvd2VycGMvY3lnd2luLm10IGIvZ2RiL2NvbmZpZy9wb3dlcnBjL2N5Z3dpbi5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODZiMmFmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wb3dlcnBjL2N5Z3dpbi5tdApAQCAtMCwwICsxLDYgQEAKKyMgVGFyZ2V0OiBQb3dlcnBjIHJ1bm5pbmcgY3lnbnVzJ3MgdW5peCBhcGkgb3ZlciB3aW4zMgorVERFUEZJTEVTPSByczYwMDAtdGRlcC5vCitUTV9GSUxFPSB0bS1jeWd3aW4uaAorCisKKwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9wb3dlcnBjL2dkYnNlcnZlLm10IGIvZ2RiL2NvbmZpZy9wb3dlcnBjL2dkYnNlcnZlLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Mjg0MDcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3Bvd2VycGMvZ2Ric2VydmUubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogR0RCU0VSVkUuTkxNIHJ1bm5pbmcgb24gYSBQb3dlci1QQworVERFUEZJTEVTPSBwcGMubyAKK0NQVV9GSUxFPSBwcGMKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcG93ZXJwYy9saW51eC5taCBiL2dkYi9jb25maWcvcG93ZXJwYy9saW51eC5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGUwZTIwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wb3dlcnBjL2xpbnV4Lm1oCkBAIC0wLDAgKzEsMTAgQEAKKyMgSG9zdDogUG93ZXJQQywgcnVubmluZyBMaW51eAorCitYTV9GSUxFPSB4bS1saW51eC5oCitYREVQRklMRVM9IHNlci10Y3AubworWE1fQ0xJQlM9CisKK05BVF9GSUxFPSAuLi9ubS1zeXN2NC5oCitOQVRERVBGSUxFUz0gc29saWIubyBjb3JlbG93Lm8gIyBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gZm9yay1jaGlsZC5vIGNvcmUtYW91dC5vIGNvcmUtcmVnc2V0Lm8KKworR0RCU0VSVkVSX0RFUEZJTEVTPSBsb3ctbGludXgubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9wb3dlcnBjL21hY29zLm1oIGIvZ2RiL2NvbmZpZy9wb3dlcnBjL21hY29zLm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYjA2NDgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3Bvd2VycGMvbWFjb3MubWgKQEAgLTAsMCArMSw0IEBACisjIEhvc3Q6IFBvd2VyTWFjIChQb3dlclBDIHJ1bm5pbmcgTWFjT1MpCisKK05BVERFUEZJTEVTPSBtYWMtbmF0Lm8KK05BVF9GSUxFPSBubS1tYWNvcy5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3Bvd2VycGMvbWFjb3MubXQgYi9nZGIvY29uZmlnL3Bvd2VycGMvbWFjb3MubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhZDBkMgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcG93ZXJwYy9tYWNvcy5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBQb3dlck1hYyAoUG93ZXJQQyBydW5uaW5nIE1hY09TKQorVERFUEZJTEVTPSByczYwMDAtdGRlcC5vIHhjb2ZmcmVhZC5vCitUTV9GSUxFPSB0bS1tYWNvcy5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3Bvd2VycGMvbm0tYWl4LmggYi9nZGIvY29uZmlnL3Bvd2VycGMvbm0tYWl4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2MWQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcG93ZXJwYy9ubS1haXguaApAQCAtMCwwICsxLDIyIEBACisvKiBJQk0gUG93ZXJQQyBuYXRpdmUtZGVwZW5kZW50IG1hY3JvcyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCisKKyNpbmNsdWRlICJyczYwMDAvbm0tcnM2MDAwLmgiCisKKyNkZWZpbmUgUFRSQUNFX0FSRzNfVFlQRSBpbnQqCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3Bvd2VycGMvbm0tbWFjb3MuaCBiL2dkYi9jb25maWcvcG93ZXJwYy9ubS1tYWNvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYTNkOWUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3Bvd2VycGMvbm0tbWFjb3MuaApAQCAtMCwwICsxLDIwIEBACisvKiBQb3dlck1hYyBuYXRpdmUtZGVwZW5kZW50IG1hY3JvcyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIE5vdGhpbmcgbmVlZGVkLCBhdCBsZWFzdCBzbyBmYXIuICAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9wb3dlcnBjL25tLXNvbGFyaXMuaCBiL2dkYi9jb25maWcvcG93ZXJwYy9ubS1zb2xhcmlzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI3NmE3MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcG93ZXJwYy9ubS1zb2xhcmlzLmgKQEAgLTAsMCArMSwzMCBAQAorLyogTmF0aXZlLWRlcGVuZGVudCBkZWZpbml0aW9ucyBmb3IgUG93ZXJQQyBydW5uaW5nIFNvbGFyaXMuCisgICBDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBJbmNsdWRlIHRoZSBnZW5lcmljIFNWUjQgZGVmaW5pdGlvbnMuICAqLworCisjaW5jbHVkZSA8bm0tc3lzdjQuaD4KKworLyogQmVmb3JlIHN0b3JpbmcsIHdlIG5lZWQgdG8gcmVhZCBhbGwgdGhlIHJlZ2lzdGVycy4gICovCisKKyNkZWZpbmUgQ0hJTERfUFJFUEFSRV9UT19TVE9SRSgpIHJlYWRfcmVnaXN0ZXJfYnl0ZXMgKDAsIE5VTEwsIFJFR0lTVEVSX0JZVEVTKQorCisvKiBTb2xhcmlzIFBTUlZBRERSIHN1cHBvcnQgZG9lcyBub3Qgc2VlbSB0byBpbmNsdWRlIGEgcGxhY2UgZm9yIG5QQy4gICovCisKKyNkZWZpbmUgUFJTVkFERFJfQlJPS0VOCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3Bvd2VycGMvcHBjLWVhYmkubXQgYi9nZGIvY29uZmlnL3Bvd2VycGMvcHBjLWVhYmkubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlMjFjOAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcG93ZXJwYy9wcGMtZWFiaS5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBQb3dlclBDIHJ1bm5pbmcgZWFiaQorVERFUEZJTEVTPSBzZXItb2NkLm8gcnM2MDAwLXRkZXAubyBtb25pdG9yLm8gZHNyZWMubyBwcGNidWctcm9tLm8gZGluazMyLXJvbS5vIHBwYy1iZG0ubyBvY2QubyByZW1vdGUtc2RzLm8KK1RNX0ZJTEU9IHRtLXBwYy1lYWJpLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcG93ZXJwYy9wcGMtbncubXQgYi9nZGIvY29uZmlnL3Bvd2VycGMvcHBjLW53Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYWEyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3Bvd2VycGMvcHBjLW53Lm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IFBvd2VyUEMgcnVubmluZyBOZXR3YXJlCitUREVQRklMRVM9IHJzNjAwMC10ZGVwLm8KK1RNX0ZJTEU9IHRtLXBwYy1udy5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3Bvd2VycGMvcHBjLXNpbS5tdCBiL2dkYi9jb25maWcvcG93ZXJwYy9wcGMtc2ltLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3M2ZlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3Bvd2VycGMvcHBjLXNpbS5tdApAQCAtMCwwICsxLDYgQEAKKyMgVGFyZ2V0OiBQb3dlclBDIHJ1bm5pbmcgZWFiaSBhbmQgaW5jbHVkaW5nIHRoZSBzaW11bGF0b3IKK1RERVBGSUxFUz0gc2VyLW9jZC5vIHJzNjAwMC10ZGVwLm8gbW9uaXRvci5vIGRzcmVjLm8gcHBjYnVnLXJvbS5vIGRpbmszMi1yb20ubyBwcGMtYmRtLm8gb2NkLm8gcmVtb3RlLXNkcy5vCitUTV9GSUxFPSB0bS1wcGMtZWFiaS5oCisKK1NJTV9PQlMgPSByZW1vdGUtc2ltLm8KK1NJTSA9IC4uL3NpbS9wcGMvbGlic2ltLmEKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcG93ZXJwYy9wcGNsZS1lYWJpLm10IGIvZ2RiL2NvbmZpZy9wb3dlcnBjL3BwY2xlLWVhYmkubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzNmExMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcG93ZXJwYy9wcGNsZS1lYWJpLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IFBvd2VyUEMgcnVubmluZyBlYWJpIGluIGxpdHRsZSBlbmRpYW4gbW9kZQorVERFUEZJTEVTPSBzZXItb2NkLm8gcnM2MDAwLXRkZXAubyBtb25pdG9yLm8gZHNyZWMubyBwcGNidWctcm9tLm8gcHBjLWJkbS5vIG9jZC5vCitUTV9GSUxFPSB0bS1wcGNsZS1lYWJpLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcG93ZXJwYy9wcGNsZS1zaW0ubXQgYi9nZGIvY29uZmlnL3Bvd2VycGMvcHBjbGUtc2ltLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwOGRhZmUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3Bvd2VycGMvcHBjbGUtc2ltLm10CkBAIC0wLDAgKzEsNiBAQAorIyBUYXJnZXQ6IFBvd2VyUEMgcnVubmluZyBlYWJpIGluIGxpdHRsZSBlbmRpYW4gbW9kZSB1bmRlciB0aGUgc2ltdWxhdG9yCitUREVQRklMRVM9IHNlci1vY2QubyByczYwMDAtdGRlcC5vIG1vbml0b3IubyBkc3JlYy5vIHBwY2J1Zy1yb20ubyBwcGMtYmRtLm8gb2NkLm8KK1RNX0ZJTEU9IHRtLXBwY2xlLWVhYmkuaAorCitTSU1fT0JTID0gcmVtb3RlLXNpbS5vCitTSU0gPSAuLi9zaW0vcHBjL2xpYnNpbS5hCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3Bvd2VycGMvc29sYXJpcy5taCBiL2dkYi9jb25maWcvcG93ZXJwYy9zb2xhcmlzLm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMzQ0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3Bvd2VycGMvc29sYXJpcy5taApAQCAtMCwwICsxLDE4IEBACisjIEhvc3Q6IFBvd2VyUEMsIHJ1bm5pbmcgU29sYXJpcyAyCisKK1hNX0ZJTEU9IHhtLXNvbGFyaXMuaAorWERFUEZJTEVTPSBzZXItdGNwLm8KK1hNX0NMSUJTPSAtbHNvY2tldCAtbG5zbAorCitOQVRfRklMRT0gbm0tc29sYXJpcy5oCitOQVRERVBGSUxFUz0gY29yZWxvdy5vIGNvcmUtc29sMi5vIHNvbGliLm8gcHJvY2ZzLm8gZm9yay1jaGlsZC5vCisKKyMgSWYgeW91IGFyZSBjb21waWxpbmcgd2l0aCBTdW4ncyBjb21waWxlciwgYWRkIHRoZSAteHMgb3B0aW9uIHRvIENDCisjIChlLmcuIGBtYWtlIENDPSJjYyAteHMiJykuCisjIFN1bidzIGNvbXBpbGVycyByZXF1aXJlIHRoZSAteHMgb3B0aW9uIHRvIHByb2R1Y2UgZGVidWcgaW5mb3JtYXRpb24KKyMgaW4gdGhlIGZpbmFsIGxpbmtlZCBleGVjdXRhYmxlLiAgT3RoZXJ3aXNlIHRoZXkgbGVhdmUgaXQgaW4gdGhlIC5vCisjIGZpbGVzIG9ubHksIHdpdGggdW5kb2N1bWVudGVkIHBvaW50ZXJzIHRvIGl0IGluIHRoZSBsaW5rZWQgZXhlY3V0YWJsZS4KKyMgVGhpcyBpcyBjb21tZW50ZWQgb3V0IGJlY2F1c2Ugd2UgZG9uJ3QgYXNzdW1lIHRoYXQgdGhlIFN1biBjb21waWxlcgorIyBpcyBpbiB1c2UuCisjTUhfQ0ZMQUdTPS14cworSE9TVF9JUEM9LURCU0RfSVBDCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3Bvd2VycGMvc29sYXJpcy5tdCBiL2dkYi9jb25maWcvcG93ZXJwYy9zb2xhcmlzLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZTQyMWUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3Bvd2VycGMvc29sYXJpcy5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBQb3dlclBDLCBydW5uaW5nIFNvbGFyaXMgMgorVERFUEZJTEVTPSByczYwMDAtdGRlcC5vCitUTV9GSUxFPSB0bS1zb2xhcmlzLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcG93ZXJwYy90bS1jeWd3aW4uaCBiL2dkYi9jb25maWcvcG93ZXJwYy90bS1jeWd3aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2FlMjRhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wb3dlcnBjL3RtLWN5Z3dpbi5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qIE1hY3JvIGRlZmluaXRpb25zIFBvd2VyUEMgcnVubmluZyB1bmRlciB0aGUgQ3lnd2luIEFQSS4KKyAgIENvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJwb3dlcnBjL3RtLXBwY2xlLWVhYmkuaCIKKwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9wb3dlcnBjL3RtLW1hY29zLmggYi9nZGIvY29uZmlnL3Bvd2VycGMvdG0tbWFjb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjlkMjg1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wb3dlcnBjL3RtLW1hY29zLmgKQEAgLTAsMCArMSwyNiBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIFBvd2VyIFBDIHJ1bm5pbmcgTWFjT1MuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCisKKy8qIFVzZSBnZW5lcmljIFJTNjAwMCBkZWZpbml0aW9ucy4gKi8KKyNpbmNsdWRlICJyczYwMDAvdG0tcnM2MDAwLmgiCisKKyNkZWZpbmUgR0RCX1RBUkdFVF9QT1dFUlBDCisKKy8qIFRoaXMgaXMgbm8gdXNlIHRvIHVzLiAgKi8KKyN1bmRlZiBQQ19MT0FEX1NFR01FTlQKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcG93ZXJwYy90bS1wcGMtYWl4LmggYi9nZGIvY29uZmlnL3Bvd2VycGMvdG0tcHBjLWFpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZmIzYzQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3Bvd2VycGMvdG0tcHBjLWFpeC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qIE1hY3JvIGRlZmluaXRpb25zIGZvciBQb3dlciBQQyBydW5uaW5nIEFJWC4KKyAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLworCisjaWZuZGVmIFRNX1BQQ19BSVhfSAorI2RlZmluZSBUTV9QUENfQUlYX0gKKworLyogVXNlIGdlbmVyaWMgUlM2MDAwIGRlZmluaXRpb25zLiAqLworI2luY2x1ZGUgInJzNjAwMC90bS1yczYwMDAuaCIKKworI2RlZmluZSBHREJfVEFSR0VUX1BPV0VSUEMKKworI2VuZGlmIC8qIFRNX1BQQ19BSVhfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9wb3dlcnBjL3RtLXBwYy1lYWJpLmggYi9nZGIvY29uZmlnL3Bvd2VycGMvdG0tcHBjLWVhYmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjgyOGIyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wb3dlcnBjL3RtLXBwYy1lYWJpLmgKQEAgLTAsMCArMSw4NCBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIFBvd2VyIFBDIHJ1bm5pbmcgZW1iZWRkZWQgQUJJLgorICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBUTV9QUENfRUFCSV9ICisjZGVmaW5lIFRNX1BQQ19FQUJJX0gKKworLyogVXNlIGdlbmVyaWMgUlM2MDAwIGRlZmluaXRpb25zLiAqLworI2luY2x1ZGUgInJzNjAwMC90bS1yczYwMDAuaCIKKy8qIGV4Y2VwdCB3ZSB3YW50IHRvIGFsbG93IHNpbmdsZSBzdGVwcGluZyAqLworI3VuZGVmIFNPRlRXQVJFX1NJTkdMRV9TVEVQX1AKKyNkZWZpbmUgU09GVFdBUkVfU0lOR0xFX1NURVBfUCAwCisKKyN1bmRlZglERUZBVUxUX0xSX1NBVkUKKyNkZWZpbmUJREVGQVVMVF9MUl9TQVZFIDQJLyogZWFiaSBzYXZlcyBMUiBhdCA0IG9mZiBvZiBTUCAqLworCisjZGVmaW5lIEdEQl9UQVJHRVRfUE9XRVJQQworCisjdW5kZWYgUENfTE9BRF9TRUdNRU5UCisjdW5kZWYgUFJPQ0VTU19MSU5FTlVNQkVSX0hPT0sKKworI3VuZGVmIFRFWFRfU0VHTUVOVF9CQVNFCisjZGVmaW5lIFRFWFRfU0VHTUVOVF9CQVNFIDEKKworLyogU2F5IHRoYXQgd2UncmUgdXNpbmcgRUxGLCBub3QgWENPRkYuICAqLworI2RlZmluZSBFTEZfT0JKRUNUX0ZPUk1BVCAxCisKKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRV9QIDEKKworLyogcmV0dXJuIHRydWUgaWYgYSBnaXZlbiBgcGMnIHZhbHVlIGlzIGluIGBjYWxsIGR1bW15JyBmdW5jdGlvbi4gKi8KKy8qIEZJWE1FOiBUaGlzIGp1c3QgY2hlY2tzIGZvciB0aGUgZW5kIG9mIHRoZSBzdGFjaywgd2hpY2ggaXMgYnJva2VuCisgICBmb3IgdGhpbmdzIGxpa2Ugc3RlcHBpbmcgdGhyb3VnaCBnY2MgbmVzdGVkIGZ1bmN0aW9uIHN0dWJzLiAgKi8KKyN1bmRlZiBQQ19JTl9DQUxMX0RVTU1ZCisjZGVmaW5lCVBDX0lOX0NBTExfRFVNTVkoU1RPUF9QQywgU1RPUF9TUCwgU1RPUF9GUkFNRV9BRERSKQlcCisJKFNUT1BfU1AgPCBTVE9QX1BDKQorCisvKiBnZW5lcmljIGR1bW15IGZyYW1lIHN0dWZmICovCisKKworCisvKiB0YXJnZXQtc3BlY2lmaWMgZHVtbXlfZnJhbWUgc3R1ZmYgKi8KKworZXh0ZXJuIHN0cnVjdCBmcmFtZV9pbmZvICpyczYwMDBfcG9wX2ZyYW1lIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZSkpOworCitleHRlcm4gQ09SRV9BRERSIHBwY19wdXNoX3JldHVybl9hZGRyZXNzIFBBUkFNUyAoKENPUkVfQUREUiwgQ09SRV9BRERSKSk7CitleHRlcm4gQ09SRV9BRERSIHJzNjAwMF9wdXNoX2FyZ3VtZW50cyBQQVJBTVMgKChpbnQgbmFyZ3MsIAorCQkJCQkgICAgICBzdHJ1Y3QgdmFsdWUgKiphcmdzLCAKKwkJCQkJICAgICAgQ09SRV9BRERSIHNwLAorCQkJCQkgICAgICB1bnNpZ25lZCBjaGFyIHN0cnVjdF9yZXR1cm4sCisJCQkJCSAgICAgIENPUkVfQUREUiBzdHJ1Y3RfYWRkcikpOworCisjdW5kZWYgUFVTSF9EVU1NWV9GUkFNRQorI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FICAgICAgICAgICAgIGdlbmVyaWNfcHVzaF9kdW1teV9mcmFtZSAoKQorCisjZGVmaW5lIFBVU0hfUkVUVVJOX0FERFJFU1MoUEMsIFNQKSAgICAgIHBwY19wdXNoX3JldHVybl9hZGRyZXNzIChQQywgU1ApCisKKy8qIG92ZXJyaWRlIHRoZSBzdGFuZGFyZCBnZXRfc2F2ZWRfcmVnaXN0ZXIgZnVuY3Rpb24gd2l0aCAKKyAgIG9uZSB0aGF0IHRha2VzIGFjY291bnQgb2YgZ2VuZXJpYyBDQUxMX0RVTU1ZIGZyYW1lcyAqLworI2RlZmluZSBHRVRfU0FWRURfUkVHSVNURVIKKworI2RlZmluZSBVU0VfR0VORVJJQ19EVU1NWV9GUkFNRVMKKyNkZWZpbmUgQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVCAoMCkKKyNkZWZpbmUgQ0FMTF9EVU1NWV9MT0NBVElPTiAgICAgICAgICBBVF9FTlRSWV9QT0lOVAorI2RlZmluZSBDQUxMX0RVTU1ZX0FERFJFU1MoKSAgICAgICAgIGVudHJ5X3BvaW50X2FkZHJlc3MgKCkKKyN1bmRlZiBDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVAorI2RlZmluZSBDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCAgICAgIDAKKworCisjZW5kaWYgLyogVE1fUFBDX0VBQklfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9wb3dlcnBjL3RtLXBwYy1udy5oIGIvZ2RiL2NvbmZpZy9wb3dlcnBjL3RtLXBwYy1udy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZjcyMTEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3Bvd2VycGMvdG0tcHBjLW53LmgKQEAgLTAsMCArMSwzMSBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIFBvd2VyIFBDIHJ1bm5pbmcgTmV0d2FyZS4KKyAgIENvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgVE1fUFBDX05XX0gKKyNkZWZpbmUgVE1fUFBDX05XX0gKKworLyogVXNlIGdlbmVyaWMgUlM2MDAwIGRlZmluaXRpb25zLiAqLworI2luY2x1ZGUgInJzNjAwMC90bS1yczYwMDAuaCIKKworI2RlZmluZSBHREJfVEFSR0VUX1BPV0VSUEMKKworI3VuZGVmIFBDX0xPQURfU0VHTUVOVAorI3VuZGVmIFBST0NFU1NfTElORU5VTUJFUl9IT09LCisKKyNlbmRpZiAvKiBUTV9QUENfTldfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9wb3dlcnBjL3RtLXBwYy1zaW0uaCBiL2dkYi9jb25maWcvcG93ZXJwYy90bS1wcGMtc2ltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQxMTZiYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcG93ZXJwYy90bS1wcGMtc2ltLmgKQEAgLTAsMCArMSwyNiBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIFBvd2VyIFBDIHJ1bm5pbmcgZW1iZWRkZWQgQUJJIHVuZGVyIHRoZSBzaW11bGF0b3IuCisgICBDb3B5cmlnaHQgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIFRNX1BQQ19TSU1fSAorI2RlZmluZSBUTV9QUENfU0lNX0gKKworI2luY2x1ZGUgInBvd2VycGMvdG0tcHBjLWVhYmkuaCIKKworI2VuZGlmIC8qIFRNX1BQQ19TSU1fSCAqLworCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3Bvd2VycGMvdG0tcHBjbGUtZWFiaS5oIGIvZ2RiL2NvbmZpZy9wb3dlcnBjL3RtLXBwY2xlLWVhYmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTUxOTVkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wb3dlcnBjL3RtLXBwY2xlLWVhYmkuaApAQCAtMCwwICsxLDMwIEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgUG93ZXIgUEMgcnVubmluZyBlbWJlZGRlZCBBQkkKKyAgIGluIGxpdHRsZSBlbmRpYW4gbW9kZS4KKyAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgVE1fUFBDTEVfRUFCSV9ICisjZGVmaW5lIFRNX1BQQ0xFX0VBQklfSAorCisvKiBVc2Ugbm9ybWFsIHBwYy1lYWJpIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAicG93ZXJwYy90bS1wcGMtZWFiaS5oIgorCisjdW5kZWYgIFRBUkdFVF9CWVRFX09SREVSX0RFRkFVTFQKKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVJfREVGQVVMVAlMSVRUTEVfRU5ESUFOCisKKyNlbmRpZiAvKiBUTV9QUENMRV9FQUJJX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcG93ZXJwYy90bS1wcGNsZS1zaW0uaCBiL2dkYi9jb25maWcvcG93ZXJwYy90bS1wcGNsZS1zaW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjU2NGYyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wb3dlcnBjL3RtLXBwY2xlLXNpbS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIE1hY3JvIGRlZmluaXRpb25zIGZvciBQb3dlciBQQyBydW5uaW5nIGVtYmVkZGVkIEFCSSB1bmRlciB0aGUgc2ltdWxhdG9yLgorICAgQ29weXJpZ2h0IDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBUTV9QUENMRV9TSU1fSAorI2RlZmluZSBUTV9QUENMRV9TSU1fSAorCisjaW5jbHVkZSAicG93ZXJwYy90bS1wcGNsZS1lYWJpLmgiCisKKyNlbmRpZiAvKiBUTV9QUENMRV9TSU1fSCAqLworCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3Bvd2VycGMvdG0tc29sYXJpcy5oIGIvZ2RiL2NvbmZpZy9wb3dlcnBjL3RtLXNvbGFyaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDkzNzNmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wb3dlcnBjL3RtLXNvbGFyaXMuaApAQCAtMCwwICsxLDc0IEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgR0RCIGZvciBhIFBvd2VyUEMgcnVubmluZyBTb2xhcmlzIDIKKyAgIENvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJwb3dlcnBjL3RtLXBwYy1lYWJpLmgiCisgCisvKiBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCBzaWduYWwgaGFuZGxlciB0cmFtcG9saW5lcyBpbiBTb2xhcmlzMi4gICovCisjZGVmaW5lIElOX1NJR1RSQU1QKHBjLCBuYW1lKSBcCisgICgobmFtZSkgXAorICAgJiYgKFNUUkVRICgic2lnYWN0aGFuZGxlciIsIG5hbWUpIHx8IFNUUkVRICgidWNic2lndmVjaGFuZGxlciIsIG5hbWUpKSkKKyAKKy8qIFRoZSBzaWduYWwgaGFuZGxlciBnZXRzIGEgcG9pbnRlciB0byBhbiB1Y29udGV4dCBhcyB0aGlyZCBhcmd1bWVudAorICAgaWYgaXQgaXMgY2FsbGVkIGZyb20gc2lnYWN0aGFuZGxlci4gIFRoaXMgaXMgdGhlIG9mZnNldCB0byB0aGUgc2F2ZWQKKyAgIFBDIHdpdGhpbiBpdC4gIHNwYXJjX2ZyYW1lX3NhdmVkX3BjIGtub3dzIGhvdyB0byBkZWFsIHdpdGgKKyAgIHVjYnNpZ3ZlY2hhbmRsZXIuICAqLyAgCisjZGVmaW5lIFNJR0NPTlRFWFRfUENfT0ZGU0VUIDQ0CisKKyNpZiAwCS8qIEZJWE1FIFNldGptcC9sb25nam1wIGFyZSBub3QgYXMgd2VsbCBkb2MnZCBpbiBTdW5PUyA1LnggeWV0ICovCisKKy8qIE9mZnNldHMgaW50byBqbXBfYnVmLiAgTm90IGRlZmluZWQgYnkgU3VuLCBidXQgYXQgbGVhc3QgZG9jdW1lbnRlZCBpbiBhCisgICBjb21tZW50IGluIDxtYWNoaW5lL3NldGptcC5oPiEgKi8KKworI2RlZmluZSBKQl9FTEVNRU5UX1NJWkUgNAkvKiBTaXplIG9mIGVhY2ggZWxlbWVudCBpbiBqbXBfYnVmICovCisKKyNkZWZpbmUgSkJfT05TU1RBQ0sgMAorI2RlZmluZSBKQl9TSUdNQVNLIDEKKyNkZWZpbmUgSkJfU1AgMgorI2RlZmluZSBKQl9QQyAzCisjZGVmaW5lIEpCX05QQyA0CisjZGVmaW5lIEpCX1BTUiA1CisjZGVmaW5lIEpCX0cxIDYKKyNkZWZpbmUgSkJfTzAgNworI2RlZmluZSBKQl9XQkNOVCA4CisKKy8qIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIGxvbmdqbXAgd2lsbCBsYW5kLiAgV2UgZXhwZWN0IHRoYXQgd2UgaGF2ZSBqdXN0IGVudGVyZWQKKyAgIGxvbmdqbXAgYW5kIGhhdmVuJ3QgeWV0IHNldHVwIHRoZSBzdGFjayBmcmFtZSwgc28gdGhlIGFyZ3MgYXJlIHN0aWxsIGluIHRoZQorICAgb3V0cHV0IHJlZ3MuICAlbzAgKE8wX1JFR05VTSkgcG9pbnRzIGF0IHRoZSBqbXBfYnVmIHN0cnVjdHVyZSBmcm9tIHdoaWNoIHdlCisgICBleHRyYWN0IHRoZSBwYyAoSkJfUEMpIHRoYXQgd2Ugd2lsbCBsYW5kIGF0LiAgVGhlIHBjIGlzIGNvcGllZCBpbnRvIEFERFIuCisgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MgKi8KKworZXh0ZXJuIGludAorZ2V0X2xvbmdqbXBfdGFyZ2V0IFBBUkFNUyAoKENPUkVfQUREUiAqKSk7CisKKyNkZWZpbmUgR0VUX0xPTkdKTVBfVEFSR0VUKEFERFIpIGdldF9sb25nam1wX3RhcmdldChBRERSKQorI2VuZGlmICAvKiAwICovCisKKy8qIFRoZSBTdW5QUk8gY29tcGlsZXIgcHV0cyBvdXQgMCBpbnN0ZWFkIG9mIHRoZSBhZGRyZXNzIGluIE5fU08gc3ltYm9scywKKyAgIGFuZCBmb3IgU3VuUFJPIDMuMCwgTl9GVU4gc3ltYm9scyB0b28uICAqLworI2RlZmluZSBTT0ZVTl9BRERSRVNTX01BWUJFX01JU1NJTkcKKworI2lmIDAKK2V4dGVybiBjaGFyICpzdW5wcm9fc3RhdGljX3RyYW5zZm9ybV9uYW1lIFBBUkFNUyAoKGNoYXIgKikpOworI2RlZmluZSBTVEFUSUNfVFJBTlNGT1JNX05BTUUoeCkgc3VucHJvX3N0YXRpY190cmFuc2Zvcm1fbmFtZSAoeCkKKyNlbmRpZgorCisjZGVmaW5lIEZBVUxURURfVVNFX1NJR0lORk8KKworLyogRW5hYmxlIGhhbmRsaW5nIG9mIHNoYXJlZCBsaWJyYXJpZXMgZm9yIGEub3V0IGV4ZWN1dGFibGVzLiAgKi8KKyNkZWZpbmUgSEFORExFX1NWUjRfRVhFQ19FTVVMQVRPUlMKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcG93ZXJwYy94bS1haXguaCBiL2dkYi9jb25maWcvcG93ZXJwYy94bS1haXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmQwZTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9wb3dlcnBjL3htLWFpeC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIGhvc3Rpbmcgb24gYW4gUG93ZXJQQywgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIENvcnBvcmF0aW9uLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLworCisjaW5jbHVkZSAieG0tYWl4NC5oIgorCisvKiBUaGlzIGRvZXNuJ3Qgc2VlbSB0byBiZSBkZWNsYXJlZCBpbiBhbnkgaGVhZGVyIGZpbGUgSSBjYW4gZmluZC4gICovCitjaGFyICp0ZXJtZGVmIFBBUkFNUyAoKGludCwgaW50KSk7CisKKy8qIFVJTlRfTUFYIGlzIGRlZmluZWQgaW4gPHN5cy9saW1pdHMuaD4gYXMgYSBkZWNpbWFsIGNvbnN0YW50ICg0Mjk0OTY3Mjk1KQorICAgd2hpY2ggaXMgdG9vIGxhcmdlIHRvIGZpdCBpbiBhIHNpZ25lZCBpbnQgd2hlbiBpdCBpcyBwYXJzZWQgYnkgdGhlCisgICBjb21waWxlciwgc28gaXQgaXNzdWVzIGEgZGlhZ25vc3RpYy4gIEp1c3QgdW5kZWYgaXQgaGVyZSBzbyB0aGF0IHdlCisgICB1c2UgZ2RiJ3MgdmVyc2lvbiBpbiBkZWZzLmggKi8KKyN1bmRlZiBVSU5UX01BWApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9wb3dlcnBjL3htLWN5Z3dpbi5oIGIvZ2RiL2NvbmZpZy9wb3dlcnBjL3htLWN5Z3dpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYWEwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3Bvd2VycGMveG0tY3lnd2luLmgKQEAgLTAsMCArMSwzMiBAQAorLyogRGVmaW5pdGlvbnMgZm9yIGhvc3Rpbmcgb24gV0lOMzIsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisKKyNpbmNsdWRlICJmb3Blbi1iaW4uaCIKKworI2RlZmluZSBHREJJTklUX0ZJTEVOQU1FICJnZGIuaW5pIgorCisjZGVmaW5lIFNMQVNIX1AoWCkgKChYKT09J1xcJyB8fCAoWCkgPT0gJy8nKQorI2RlZmluZSBST09URURfUChYKSAoKFNMQVNIX1AoKFgpWzBdKSl8fCAoKFgpWzFdID09JzonKSkKKyNkZWZpbmUgU0xBU0hfQ0hBUiAnLycKKyNkZWZpbmUgU0xBU0hfU1RSSU5HICIvIgorCisvKiBEZWZpbmUgdGhpcyBsc2VlayhuKSAhPSBudGggYnl0ZSBvZiBmaWxlICovCisjZGVmaW5lIExTRUVLX05PVF9MSU5FQVIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcG93ZXJwYy94bS1saW51eC5oIGIvZ2RiL2NvbmZpZy9wb3dlcnBjL3htLWxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFjOGJhNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcG93ZXJwYy94bS1saW51eC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qIEhvc3QgZGVmaW5pdGlvbnMgZm9yIGEgU3VuIDQsIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk5NgorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgQklHX0VORElBTgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9wb3dlcnBjL3htLW1wdy5oIGIvZ2RiL2NvbmZpZy9wb3dlcnBjL3htLW1wdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMzNjYTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3Bvd2VycGMveG0tbXB3LmgKQEAgLTAsMCArMSwyMiBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIHJ1bm5pbmcgR0RCIG9uIEFwcGxlIFBvd2VyIE1hY2ludG9zaGVzLgorICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgSE9TVF9CWVRFX09SREVSIEJJR19FTkRJQU4KKworI2luY2x1ZGUgPHhtLW1wdy5oPgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9wb3dlcnBjL3htLXNvbGFyaXMuaCBiL2dkYi9jb25maWcvcG93ZXJwYy94bS1zb2xhcmlzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhZDg3YQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcG93ZXJwYy94bS1zb2xhcmlzLmgKQEAgLTAsMCArMSwyMSBAQAorLyogSG9zdCBkZWZpbml0aW9ucyBmb3IgYSBTdW4gNCwgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTk2CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3B5ci9weXJhbWlkLm1oIGIvZ2RiL2NvbmZpZy9weXIvcHlyYW1pZC5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDI1ZTU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9weXIvcHlyYW1pZC5taApAQCAtMCwwICsxLDggQEAKKyMgSG9zdDogUHlyYW1pZCB1bmRlciBPU3ggNC4wICg0LjJic2QpLgorCisjbXNnIElmIHlvdSBkb24ndCBjb21waWxlIEdEQiB3aXRoIEdDQywgeW91J2xsIG5lZWQgdG8gYWRkCisjbXNnIEFMTE9DQT1hbGxvY2EubyBhbmQgQUxMT0NBMT1hbGxvY2EubyB0byB0aGUgTWFrZWZpbGUuCisjbXNnIAorCitYREVQRklMRVM9IHB5ci14ZGVwLm8gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubworWE1fRklMRT0geG0tcHlyLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcHlyL3B5cmFtaWQubXQgYi9nZGIvY29uZmlnL3B5ci9weXJhbWlkLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Zjk1NTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3B5ci9weXJhbWlkLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IFB5cmFtaWQgdW5kZXIgT1N4IDQuMCAoNC4yYnNkKS4KK1RERVBGSUxFUz0gcHlyLXRkZXAubworVE1fRklMRT0gdG0tcHlyLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcHlyL3RtLXB5ci5oIGIvZ2RiL2NvbmZpZy9weXIvdG0tcHlyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk3ZWJlNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcHlyL3RtLXB5ci5oCkBAIC0wLDAgKzEsNDgzIEBACisvKiBEZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gYSBQeXJhbWlkIHVuZGVyIE9TeCA0LjAgKDQuMmJzZCkuCisgICBDb3B5cmlnaHQgMTk4OCwgMTk4OSwgMTk5MSwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFRBUkdFVF9CWVRFX09SREVSIEJJR19FTkRJQU4KKworLyogVHJhZGl0aW9uYWwgVW5peCB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2VzIGhhdmUgdGhyZSByZWdpb25zOiB0ZXh0LAorICAgZGF0YSBhbmQgc3RhY2suICBUaGUgdGV4dCwgaW5pdGlhbGlzZWQgZGF0YSwgYW5kIHVuaW5pdGlhbGlzZWQgZGF0YQorICAgYXJlIHJlcHJlc2VudGVkIGluIHNlcGFyYXRlIHNlZ21lbnRzIG9mIHRoZSBhLm91dCBmaWxlLgorICAgV2hlbiBhIHByb2Nlc3MgZHVtcHMgY29yZSwgdGhlIGRhdGEgYW5kIHN0YWNrIHJlZ2lvbnMgYXJlIHdyaXR0ZW4KKyAgIHRvIGEgY29yZSBmaWxlLiAgVGhpcyBnaXZlcyBhIGRlYnVnZ2VyIGVub3VnaCBpbmZvcm1hdGlvbiB0bworICAgcmVjb25zdHJ1Y3QgKGFuZCBkZWJ1ZykgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBhdCB0aGUgdGltZSBvZgorICAgdGhlIGNvcmVkdW1wLgorICAgUHlyYW1pZHMgaGF2ZSBhbiBkaXN0aW5jdCBmb3VydGggcmVnaW9uIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3MKKyAgIHNwYWNlLCBpbiB3aGljaCB0aGUgY29udGVudHMgb2YgdGhlIHdpbmRvd2VkIHJlZ2lzdGVycyBhcmUgc3RhY2tlZAorICAgaW4gZml4ZWQtc2l6ZSBmcmFtZXMuICBQeXJhbWlkIHJlZmVyIHRvIHRoaXMgcmVnaW9uIGFzIHRoZSBjb250cm9sCisgICBzdGFjay4gIEVhY2ggY2FsbCAob3IgdHJhcCkgYXV0b21hdGljYWxseSBhbGxvY2F0ZXMgYSBuZXcgcmVnaXN0ZXIKKyAgIGZyYW1lOyBlYWNoIHJldHVybiBkZWFsbG9jYXRlcyB0aGUgY3VycmVudCBmcmFtZSBhbmQgcmVzdG9yZXMgdGhlCisgICB3aW5kb3dlZCByZWdpc3RlcnMgdG8gdGhlaXIgdmFsdWVzIGJlZm9yZSB0aGUgY2FsbC4KKworICAgV2hlbiBkdW1waW5nIGNvcmUsIHRoZSBjb250cm9sIHN0YWNrIGlzIHdyaXR0ZW4gdG8gYSBjb3JlIGZpbGVzIGFzCisgICBhIHRoaXJkIHNlZ21lbnQuIFRoZSBjb3JlLWhhbmRsaW5nIGZ1bmN0aW9ucyBuZWVkIHRvIGtub3cgdG8gZGVhbAorICAgd2l0aCBpdC4gKi8gCisKKy8qIFRlbGwgY29yZWZpbGUuYyB0aGVyZSBpcyBhbiBleHRyYSBzZWdtZW50LiAgKi8KKyNkZWZpbmUgUkVHX1NUQUNLX1NFR01FTlQKKworLyogRmxvYXRpbmcgcG9pbnQgaXMgSUVFRSBjb21wYXRpYmxlIG9uIG1vc3QgUHlyYW1pZCBoYXJkd2FyZQorICAgKE9sZGVyIHByb2Nlc3NvcnMgZG8gbm90IGhhdmUgSUVFRSBOYU5zKS4gICovCisjZGVmaW5lIElFRUVfRkxPQVQKKworLyogT2Zmc2V0IGZyb20gYWRkcmVzcyBvZiBmdW5jdGlvbiB0byBzdGFydCBvZiBpdHMgY29kZS4KKyAgIFplcm8gb24gbW9zdCBtYWNoaW5lcy4gICovCisKKyNkZWZpbmUgRlVOQ1RJT05fU1RBUlRfT0ZGU0VUIDAKKworLyogQWR2YW5jZSBQQyBhY3Jvc3MgYW55IGZ1bmN0aW9uIGVudHJ5IHByb2xvZ3VlIGluc3RydWN0aW9ucworICAgdG8gcmVhY2ggc29tZSAicmVhbCIgY29kZS4gICovCisKKy8qIEZJWE1FIC0tIGRvIHdlIHdhbnQgdG8gc2tpcCBpbnNucyB0byBhbGxvY2F0ZSB0aGUgbG9jYWwgZnJhbWU/CisgICBJZiBzbywgd2hhdCBkbyB0aGV5IGxvb2sgbGlrZT8KKyAgIFRoaXMgaXMgYmVjb21pbmcgaGFyZGVyLCBzaW5jZSB0ZWdlQHNpY3MuU0Ugd2FudHMgdG8gY2hhbmdlCisgICBnY2MgdG8gbm90IG91dHB1dCBhIHByb2xvZ3VlIHdoZW4gbm8gZnJhbWUgaXMgbmVlZGVkLiAgICovCisjZGVmaW5lIFNLSVBfUFJPTE9HVUUocGMpICBkbyB7fSB3aGlsZSAoMCkKKworCisvKiBJbW1lZGlhdGVseSBhZnRlciBhIGZ1bmN0aW9uIGNhbGwsIHJldHVybiB0aGUgc2F2ZWQgcGMuCisgICBDYW4ndCBhbHdheXMgZ28gdGhyb3VnaCB0aGUgZnJhbWVzIGZvciB0aGlzIGJlY2F1c2Ugb24gc29tZSBtYWNoaW5lcworICAgdGhlIG5ldyBmcmFtZSBpcyBub3Qgc2V0IHVwIHVudGlsIHRoZSBuZXcgZnVuY3Rpb24gZXhlY3V0ZXMKKyAgIHNvbWUgaW5zdHJ1Y3Rpb25zLiAgKi8KKworI2RlZmluZSBTQVZFRF9QQ19BRlRFUl9DQUxMKGZyYW1lKSBGUkFNRV9TQVZFRF9QQyhmcmFtZSkKKworLyogQWRkcmVzcyBvZiBlbmQgb2Ygc3RhY2sgc3BhY2UuICAqLworLyogVGhpcyBzZWVtcyB0byBiZSByaWdodCBmb3IgdGhlIDkweCBjb21wLnZ1dy5hYy5uei4KKyAgIFRoZSBjb3JyZWN0IHZhbHVlIGF0IGFueSBzaXRlIG1heSBiZSBhIGZ1bmN0aW9uIG9mIHRoZSBjb25maWd1cmVkCisgICBtYXhpbXVtIGNvbnRyb2wgc3RhY2sgZGVwdGguICBJZiBzbywgSSBkb24ndCBrbm93IHdoZXJlIHRoZQorICAgY29udHJvbC1zdGFjayBkZXB0aCBpcyBjb25maWd1cmVkLCBzbyBJIGNhbid0ICNpbmNsdWRlIGl0IGhlcmUuICovIAorI2RlZmluZSBTVEFDS19FTkRfQUREUiAoMHhjMDBjYzAwMCkKKworLyogUmVnaXN0ZXIgd2luZG93IHN0YWNrIChDb250cm9sIHN0YWNrKSBzdGFjayBkZWZpbml0aW9ucworICAgIC0gQWRkcmVzcyBvZiBiZWdpbm5pbmcgb2YgY29udHJvbCBzdGFjay4KKyAgICAtIHNpemUgb2YgY29udHJvbCBzdGFjayBmcmFtZQorICAgKE5vdGUgdGhhdCBzaW5jZSBjcnRzMCBpcyB1c3VhbGx5IHRoZSBmaXJzdCBmdW5jdGlvbiBjYWxsZWQsCisgICAgbWFpbigpJ3MgY29udHJvbCBzdGFjayBpcyBvbmUgZnJhbWUgKDB4ODAgYnl0ZXMpIGJleW9uZCB0aGlzIHZhbHVlLiAgKi8KKworI2RlZmluZSBDT05UUk9MX1NUQUNLX0FERFIgKDB4YzAwY2QwMDApCisKKy8qIEJ5dGVzIGluIGEgcmVnaXN0ZXIgd2luZG93IC0tIDE2IHBhcmFtZXRlciByZWdzLCAxNiBsb2NhbCByZWdzCisgICBmb3IgZWFjaCBjYWxsLCBpcyAzMiByZWdzICogNCBieXRlcyAqLworCisjZGVmaW5lIENPTlRST0xfU1RBQ0tfRlJBTUVfU0laRSAoMzIqNCkKKworLyogRklYTUUuICBPbiBhIHB5ciwgRGF0YSBTdGFjayBncm93cyBkb3dud2FyZDsgY29udHJvbCBzdGFjayBnb2VzIHVwd2FyZHMuIAorICAgV2hpY2ggZGlyZWN0aW9uIHNob3VsZCB3ZSB1c2UgZm9yIElOTkVSX1RIQU4sIFBDX0lOTkVSX1RIQU4gPz8gKi8KKworI2RlZmluZSBJTk5FUl9USEFOKGxocyxyaHMpICgobGhzKSA8IChyaHMpKQorCisvKiBTdGFjayBtdXN0IGJlIGFsaWduZWQgb24gMzItYml0IGJvdW5kYXJpZXMgd2hlbiBzeW50aGVzaXppbmcKKyAgIGZ1bmN0aW9uIGNhbGxzLiAqLworCisjZGVmaW5lIFNUQUNLX0FMSUdOKEFERFIpICgoKEFERFIpICsgMykgJiAtNCkKKworLyogU2VxdWVuY2Ugb2YgYnl0ZXMgZm9yIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uICAqLworCisjZGVmaW5lIEJSRUFLUE9JTlQgezB4ZjAsIDAwLCAwMCwgMDB9CisKKy8qIEFtb3VudCBQQyBtdXN0IGJlIGRlY3JlbWVudGVkIGJ5IGFmdGVyIGEgYnJlYWtwb2ludC4KKyAgIFRoaXMgaXMgb2Z0ZW4gdGhlIG51bWJlciBvZiBieXRlcyBpbiBCUkVBS1BPSU5UCisgICBidXQgbm90IGFsd2F5cy4gICovCisKKyNkZWZpbmUgREVDUl9QQ19BRlRFUl9CUkVBSyAwCisKKy8qIFNheSBob3cgbG9uZyAob3JkaW5hcnkpIHJlZ2lzdGVycyBhcmUuICBUaGlzIGlzIGEgcGllY2Ugb2YgYm9nb3NpdHkKKyAgIHVzZWQgaW4gcHVzaF93b3JkIGFuZCBhIGZldyBvdGhlciBwbGFjZXM7IFJFR0lTVEVSX1JBV19TSVpFIGlzIHRoZQorICAgcmVhbCB3YXkgdG8ga25vdyBob3cgYmlnIGEgcmVnaXN0ZXIgaXMuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1NJWkUgNAorCisvKiBOdW1iZXIgb2YgbWFjaGluZSByZWdpc3RlcnMgKi8KKy8qIHB5cmFtaWRzIGhhdmUgNjQsIHBsdXMgb25lIGZvciB0aGUgUFNXOyBwbHVzIHBlcmhhcHMgb25lIG1vcmUgZm9yIHRoZQorICAga2VybmVsIHN0YWNrIHBvaW50ZXIgKGtzcCkgYW5kIGNvbnRyb2wtc3RhY2sgcG9pbnRlciAoQ1NQKSAqLworCisjZGVmaW5lIE5VTV9SRUdTIDY3CisKKy8qIEluaXRpYWxpemVyIGZvciBhbiBhcnJheSBvZiBuYW1lcyBvZiByZWdpc3RlcnMuCisgICBUaGVyZSBzaG91bGQgYmUgTlVNX1JFR1Mgc3RyaW5ncyBpbiB0aGlzIGluaXRpYWxpemVyLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyBcCit7ImdyMCIsICJncjEiLCAiZ3IyIiwgImdyMyIsICJncjQiLCAiZ3I1IiwgImdyNiIsICJncjciLCBcCisgImdyOCIsICJncjkiLCAiZ3IxMCIsICJncjExIiwgImxvZ3BzdyIsICJjZnAiLCAic3AiLCAicGMiLCBcCisgInByMCIsICJwcjEiLCAicHIyIiwgInByMyIsICJwcjQiLCAicHI1IiwgInByNiIsICJwcjciLCBcCisgInByOCIsICJwcjkiLCAicHIxMCIsICJwcjExIiwgInByMTIiLCAicHIxMyIsICJwcjE0IiwgInByMTUiLCBcCisgImxyMCIsICJscjEiLCAibHIyIiwgImxyMyIsICJscjQiLCAibHI1IiwgImxyNiIsICJscjciLCBcCisgImxyOCIsICJscjkiLCAibHIxMCIsICJscjExIiwgImxyMTIiLCAibHIxMyIsICJscjE0IiwgImxyMTUiLCBcCisgInRyMCIsICJ0cjEiLCAidHIyIiwgInRyMyIsICJ0cjQiLCAidHI1IiwgInRyNiIsICJ0cjciLCBcCisgInRyOCIsICJ0cjkiLCAidHIxMCIsICJ0cjExIiwgInRyMTIiLCAidHIxMyIsICJ0cjE0IiwgInRyMTUiLCBcCisgICJwc3ciLCAia3NwIiwgImNzcCJ9CisKKy8qIFJlZ2lzdGVyIG51bWJlcnMgb2YgdmFyaW91cyBpbXBvcnRhbnQgcmVnaXN0ZXJzLgorICAgTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2UgdmFsdWVzIGFyZSAicmVhbCIgcmVnaXN0ZXIgbnVtYmVycywKKyAgIGFuZCBjb3JyZXNwb25kIHRvIHRoZSBnZW5lcmFsIHJlZ2lzdGVycyBvZiB0aGUgbWFjaGluZSwKKyAgIGFuZCBzb21lIGFyZSAicGhvbnkiIHJlZ2lzdGVyIG51bWJlcnMgd2hpY2ggYXJlIHRvbyBsYXJnZQorICAgdG8gYmUgYWN0dWFsIHJlZ2lzdGVyIG51bWJlcnMgYXMgZmFyIGFzIHRoZSB1c2VyIGlzIGNvbmNlcm5lZAorICAgYnV0IGRvIHNlcnZlIHRvIGdldCB0aGUgZGVzaXJlZCB2YWx1ZXMgd2hlbiBwYXNzZWQgdG8gcmVhZF9yZWdpc3Rlci4gICovCisKKy8qIHBzZXVkby1yZWdpc3RlcnM6ICovCisjZGVmaW5lIFBTX1JFR05VTSA2NAkJLyogQ29udGFpbnMgcHJvY2Vzc29yIHN0YXR1cyAqLworI2RlZmluZSBQU1dfUkVHTlVNIDY0CQkvKiBDb250YWlucyBjdXJyZW50IHBzdywgd2hhdGV2ZXIgaXQgaXMuKi8KKyNkZWZpbmUgQ1NQX1JFR05VTSA2NQkJLyogYWRkcmVzcyBvZiB0aGlzIGNvbnRyb2wgc3RhY2sgZnJhbWUqLworI2RlZmluZSBLU1BfUkVHTlVNIDY2CQkvKiBDb250YWlucyBwcm9jZXNzJ3MgS2VybmVsIFN0YWNrIFBvaW50ZXIgKi8KKworI2RlZmluZSBDRlBfUkVHTlVNIDEzCQkvKiBDdXJyZW50IGRhdGEtc3RhY2sgZnJhbWUgcHRyICovCisjZGVmaW5lIFRSMF9SRUdOVU0gNDgJCS8qIEFmdGVyIGZ1bmN0aW9uIGNhbGwsIGNvbnRhaW5zCisJCQkJICAgZnVuY3Rpb24gcmVzdWx0ICovCisKKy8qIFJlZ2lzdGVycyBpbnRlcmVzdGluZyB0byB0aGUgbWFjaGluZS1pbmRlcGVuZGVudCBwYXJ0IG9mIGdkYiovCisKKyNkZWZpbmUgRlBfUkVHTlVNIENTUF9SRUdOVU0JLyogQ29udGFpbnMgYWRkcmVzcyBvZiBleGVjdXRpbmcgKGNvbnRyb2wpCisJCQkJICAgc3RhY2sgZnJhbWUgKi8KKyNkZWZpbmUgU1BfUkVHTlVNIDE0CQkvKiBDb250YWlucyBhZGRyZXNzIG9mIHRvcCBvZiBzdGFjayAtPz8qLworI2RlZmluZSBQQ19SRUdOVU0gMTUJCS8qIENvbnRhaW5zIHByb2dyYW0gY291bnRlciAqLworCisvKiBEZWZpbmUgRE9fUkVHSVNURVJTX0lORk8oKSB0byBkbyBtYWNoaW5lLXNwZWNpZmljIGZvcm1hdHRpbmcKKyAgIG9mIHJlZ2lzdGVyIGR1bXBzLiAqLworCisjZGVmaW5lIERPX1JFR0lTVEVSU19JTkZPKF9yZWdudW0sIGZwKSBweXJfZG9fcmVnaXN0ZXJzX2luZm8oX3JlZ251bSwgZnApCisKKy8qIG5lZWQgdGhpcyBzbyB3ZSBjYW4gZmluZCB0aGUgZ2xvYmFsIHJlZ2lzdGVyczogdGhleSBuZXZlciBnZXQgc2F2ZWQuICovCitleHRlcm4gdW5zaWduZWQgaW50IGdsb2JhbF9yZWdfb2Zmc2V0OworZXh0ZXJuIHVuc2lnbmVkIGludCBsYXN0X2ZyYW1lX29mZnNldDsKKworLyogVG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCB0byBzdG9yZSBvdXIgY29waWVzIG9mIHRoZSBtYWNoaW5lJ3MKKyAgIHJlZ2lzdGVyIHN0YXRlLCB0aGUgYXJyYXkgYHJlZ2lzdGVycycuICAqLworI2RlZmluZSBSRUdJU1RFUl9CWVRFUyAoTlVNX1JFR1MqNCkKKworLyogdGhlIFB5cmFtaWQgaGFzIHJlZ2lzdGVyIHdpbmRvd3MuICAqLworCisjZGVmaW5lIEhBVkVfUkVHSVNURVJfV0lORE9XUworCisvKiBJcyB0aGlzIHJlZ2lzdGVyIHBhcnQgb2YgdGhlIHJlZ2lzdGVyIHdpbmRvdyBzeXN0ZW0/ICBBIHllcyBhbnN3ZXIKKyAgIGltcGxpZXMgdGhhdCAxKSBUaGUgbmFtZSBvZiB0aGlzIHJlZ2lzdGVyIHdpbGwgbm90IGJlIHRoZSBzYW1lIGluCisgICBvdGhlciBmcmFtZXMsIGFuZCAyKSBUaGlzIHJlZ2lzdGVyIGlzIGF1dG9tYXRpY2FsbHkgInNhdmVkIiAob3V0CisgICByZWdpc3RlcnMgc2hpZnRpbmcgaW50byBpbnMgY291bnRzKSB1cG9uIHN1YnJvdXRpbmUgY2FsbHMgYW5kIHRodXMKKyAgIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2VhcmNoIG1vcmUgdGhhbiBvbmUgc3RhY2sgZnJhbWUgZm9yIGl0LiAqLworCisjZGVmaW5lIFJFR0lTVEVSX0lOX1dJTkRPV19QKHJlZ251bSkJXAorICAoKHJlZ251bSkgPj0gMTYgJiYgKHJlZ251bSkgPCA2NCkKKworLyogSW5kZXggd2l0aGluIGByZWdpc3RlcnMnIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzcGFjZSBmb3IKKyAgIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX0JZVEUoTikgKChOKSAqIDQpCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBhY3R1YWwgbWFjaGluZSByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICBPbiB0aGUgUHlyYW1pZCwgYWxsIHJlZ3MgYXJlIDQgYnl0ZXMuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pIDQKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIHByb2dyYW0ncyByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICBPbiB0aGUgUHlyYW1pZCwgYWxsIHJlZ3MgYXJlIDQgYnl0ZXMuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfU0laRShOKSA0CisKKy8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfUkFXX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9SQVdfU0laRSA0CisKKy8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfVklSVFVBTF9TSVpFIGNhbiBoYXZlLiAgKi8KKworI2RlZmluZSBNQVhfUkVHSVNURVJfVklSVFVBTF9TSVpFIDQKKworLyogUmV0dXJuIHRoZSBHREIgdHlwZSBvYmplY3QgZm9yIHRoZSAic3RhbmRhcmQiIGRhdGEgdHlwZQorICAgb2YgZGF0YSBpbiByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1RZUEUoTikgYnVpbHRpbl90eXBlX2ludAorCisvKiBGSVhNRTogSXQgc2VlbXMgaW1wb3NzaWJsZSBmb3IgYm90aCBFWFRSQUNUX1JFVFVSTl9WQUxVRSBhbmQKKyAgIFNUT1JFX1JFVFVSTl9WQUxVRSB0byBiZSBjb3JyZWN0LiAqLworCisvKiBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUgcGxhY2UgaW4gd2hpY2ggdG8gY29weSB0aGUgc3RydWN0dXJlIHRoZQorICAgc3Vicm91dGluZSB3aWxsIHJldHVybi4gIFRoaXMgaXMgY2FsbGVkIGZyb20gY2FsbF9mdW5jdGlvbi4gKi8KKworLyoqKipGSVhNRSoqKiovCisjZGVmaW5lIFNUT1JFX1NUUlVDVF9SRVRVUk4oQUREUiwgU1ApIFwKKyAgeyB3cml0ZV9yZWdpc3RlciAoVFIwX1JFR05VTSwgKEFERFIpKTsgfQorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwgZm9ybWF0LAorICAgaW50byBWQUxCVUYuICAqLworCisvKiBOb3RlIHRoYXQgb24gYSByZWdpc3Rlci13aW5kb3dpbmcgbWFjaGluZSAoZWcsIFB5ciwgU1BBUkMpLCB0aGlzIGlzCisgICB3aGVyZSB0aGUgdmFsdWUgaXMgZm91bmQgYWZ0ZXIgdGhlIGZ1bmN0aW9uIGNhbGwgLS0gaWUsIGl0IHNob3VsZAorICAgY29ycmVzcG9uZCB0byBHTlUgQ0MncyBGVU5DVElPTl9WQUxVRSByYXRoZXIgdGhhbiBGVU5DVElPTl9PVVRHT0lOR19WQUxVRS4qLworCisjZGVmaW5lIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKFRZUEUsUkVHQlVGLFZBTEJVRikgXAorICBtZW1jcHkgKFZBTEJVRiwgKChpbnQgKikoUkVHQlVGKSkrVFIwX1JFR05VTSwgVFlQRV9MRU5HVEggKFRZUEUpKQorCisvKiBXcml0ZSBpbnRvIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZQorICAgb2YgdHlwZSBUWVBFLCBnaXZlbiBpbiB2aXJ0dWFsIGZvcm1hdC4gICovCisvKiBvbiBweXJzLCB2YWx1ZXMgYXJlIHJldHVybmVkIGluICovCisKKyNkZWZpbmUgU1RPUkVfUkVUVVJOX1ZBTFVFKFRZUEUsVkFMQlVGKSBcCisgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFKFRSMF9SRUdOVU0pLCBWQUxCVUYsIFRZUEVfTEVOR1RIIChUWVBFKSkKKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgdGhlIGFkZHJlc3MgaW4gd2hpY2ggYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGl0cyBzdHJ1Y3R1cmUgdmFsdWUsCisgICBhcyBhIENPUkVfQUREUiAob3IgYW4gZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIG9uZSkuICAqLworLyogRklYTUUgKi8KKyNkZWZpbmUgRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyhSRUdCVUYpIFwKKyAgKCAoKGludCAqKShSRUdCVUYpKSBbVFIwX1JFR05VTV0pCisKKwwKKy8qIERlc2NyaWJlIHRoZSBwb2ludGVyIGluIGVhY2ggc3RhY2sgZnJhbWUgdG8gdGhlIHByZXZpb3VzIHN0YWNrIGZyYW1lCisgICAoaXRzIGNhbGxlcikuICAqLworCisjZGVmaW5lIEVYVFJBX0ZSQU1FX0lORk8gXAorCUNPUkVfQUREUiBib3R0b207CVwKKwlDT1JFX0FERFIgZnJhbWVfY2ZwOwlcCisJQ09SRV9BRERSIGZyYW1lX3dpbmRvd19hZGRyOworCisvKiBUaGUgYm90dG9tIGZpZWxkIGlzIG1pc25hbWVkLCBzaW5jZSBpdCBtaWdodCBpbXBseSB0aGF0IG1lbW9yeSBmcm9tCisgICBib3R0b20gdG8gZnJhbWUgY29udGFpbnMgdGhpcyBmcmFtZS4gIFRoYXQgbmVlZCBub3QgYmUgdHJ1ZSBpZgorICAgc3RhY2sgZnJhbWVzIGFyZSBhbGxvY2F0ZWQgaW4gZGlmZmVyZW50IHNlZ21lbnRzIChlLmcuIHNvbWUgb24gYQorICAgc3RhY2ssIHNvbWUgb24gYSBoZWFwIGluIHRoZSBkYXRhIHNlZ21lbnQpLiAgKi8KKworI2RlZmluZSBJTklUX0VYVFJBX0ZSQU1FX0lORk8oZnJvbWxlYWYsIGZjaSkgIFwKK2RvIHsJCQkJCQkJCVwKKyAgKGZjaSktPmZyYW1lX3dpbmRvd19hZGRyID0gKGZjaSktPmZyYW1lOwkJCVwKKyAgKGZjaSktPmJvdHRvbSA9CQkJCQkJXAorCSAgKChmY2kpLT5uZXh0ID8JCQkJCVwKKwkgICAoKGZjaSktPmZyYW1lID09IChmY2kpLT5uZXh0LT5mcmFtZSA/CQkJXAorCSAgICAoZmNpKS0+bmV4dC0+Ym90dG9tIDogKGZjaSktPm5leHQtPmZyYW1lKSA6CQlcCisJICAgcmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKSk7CQkJCVwKKyAgKGZjaSktPmZyYW1lX2NmcCA9CQkJCQkJXAorCSAgcmVhZF9yZWdpc3RlciAoQ0ZQX1JFR05VTSk7CQkJCVwKKyAgLyoqKmZwcmludGYgKHN0ZGVyciwJCQkJCQlcCisJICAgIltbY3JlYXRpbmcgbmV3IGZyYW1lIGZvciAlMHgscGM9JTB4LGNzcD0lMHhdXVxuIiwJXAorCSAgIChmY2kpLT5mcmFtZSwgKGZjaSktPnBjLChmY2kpLT5mcmFtZV9jZnApOyovCQlcCit9IHdoaWxlICgwKTsKKworLyogRlJBTUVfQ0hBSU4gdGFrZXMgYSBmcmFtZSdzIG5vbWluYWwgYWRkcmVzcworICAgYW5kIHByb2R1Y2VzIHRoZSBmcmFtZSdzIGNoYWluLXBvaW50ZXIuICovCisKKy8qIEluIHRoZSBjYXNlIG9mIHRoZSBweXIsIHRoZSBmcmFtZSdzIG5vbWluYWwgYWRkcmVzcyBpcyB0aGUgYWRkcmVzcworICAgb2YgcGFyYW1ldGVyIHJlZ2lzdGVyIDAuICBUaGUgcHJldmlvdXMgZnJhbWUgaXMgZm91bmQgMzIgd29yZHMgdXAuICAgKi8KKworI2RlZmluZSBGUkFNRV9DSEFJTih0aGlzZnJhbWUpCVwKKyAgKCAodGhpc2ZyYW1lKSAtPiBmcmFtZSAtIENPTlRST0xfU1RBQ0tfRlJBTUVfU0laRSkKKworIC8qKCh0aGlzZnJhbWUpID49IENPTlRST0xfU1RBQ0tfQUREUikpKi8KKworLyogRGVmaW5lIG90aGVyIGFzcGVjdHMgb2YgdGhlIHN0YWNrIGZyYW1lLiAgKi8KKworLyogQSBtYWNybyB0aGF0IHRlbGxzIHVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGludm9jYXRpb24gcmVwcmVzZW50ZWQKKyAgIGJ5IEZJIGRvZXMgbm90IGhhdmUgYSBmcmFtZSBvbiB0aGUgc3RhY2sgYXNzb2NpYXRlZCB3aXRoIGl0LiAgSWYgaXQKKyAgIGRvZXMgbm90LCBGUkFNRUxFU1MgaXMgc2V0IHRvIDEsIGVsc2UgMC4KKworICAgSSBkbyBub3QgdW5kZXJzdGFuZCB3aGF0IHRoaXMgbWVhbnMgb24gYSBQeXJhbWlkLCB3aGVyZSBmdW5jdGlvbnMKKyAgICphbHdheXMqIGhhdmUgYSBjb250cm9sLXN0YWNrIGZyYW1lLCBidXQgbWF5IG9yIG1heSBub3QgaGF2ZSBhCisgICBmcmFtZSBvbiB0aGUgZGF0YSBzdGFjay4gIFNpbmNlIEdCRCB1c2VzIHRoZSB2YWx1ZSBvZiB0aGUKKyAgIGNvbnRyb2wgc3RhY2sgcG9pbnRlciBhcyBpdHMgImFkZHJlc3MiIG9mIGEgZnJhbWUsIEZSQU1FTEVTUworICAgaXMgYWx3YXlzIDEsIHNvIGRvZXMgbm90IG5lZWQgdG8gYmUgZGVmaW5lZC4gICovCisKKworLyogV2hlcmUgaXMgdGhlIFBDIGZvciBhIHNwZWNpZmljIGZyYW1lICovCisKKyNkZWZpbmUgRlJBTUVfU0FWRURfUEMoZmkpIFwKKyAgKChDT1JFX0FERFIpIChyZWFkX21lbW9yeV9pbnRlZ2VyICggKGZpKSAtPiBmcmFtZSArIDYwLCA0KSkpCisKKy8qIFRoZXJlIG1heSBiZSBidWdzIGluIEZSQU1FX0FSR1NfQUREUkVTUyBhbmQgRlJBTUVfTE9DQUxTX0FERFJFU1M7CisgICBvciB0aGVyZSBtYXkgYmUgYnVncyBpbiBhY2Nlc3NpbmcgdGhlIHJlZ2lzdGVycyB0aGF0IGJyZWFrCisgICB0aGVpciBkZWZpbml0aW9ucy4KKyAgIEhhdmluZyB0aGUgbWFjcm9zIGV4cGFuZCBpbnRvIGZ1bmN0aW9ucyBtYWtlcyB0aGVtIGVhc2llciB0byBkZWJ1Zy4KKyAgIFdoZW4gdGhlIGJ1ZyBpcyBmaW5hbGx5IGxvY2F0ZWQsIHRoZSBpbmxpbmUgbWFjcm8gZGVmaW50aW9ucyBjYW4KKyAgIGJlIHVuLSNpZiAwZWQsIGFuZCBmcmFtZV9hcmdzX2FkZHIgYW5kIGZyYW1lX2xvY2Fsc19hZGRyZXNzIGNhbgorICAgYmUgZGVsZXRlZCBmcm9tIHB5ci1kZXAuYyAqLyAKKworLyogSWYgdGhlIGFyZ3VtZW50IGlzIG9uIHRoZSBzdGFjaywgaXQgd2lsbCBiZSBoZXJlLiAgKi8KKyNkZWZpbmUgRlJBTUVfQVJHU19BRERSRVNTKGZpKSBcCisgIGZyYW1lX2FyZ3NfYWRkcihmaSkKKworI2RlZmluZSBGUkFNRV9MT0NBTFNfQUREUkVTUyhmaSkgXAorICBmcmFtZV9sb2NhbHNfYWRkcmVzcyhmaSkKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBkb2Vzbid0IHNlZW0gdG8gd29yay4KKyAgIEkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkuICovCisjaWYgMAorI2RlZmluZSBGUkFNRV9BUkdTX0FERFJFU1MoZmkpIFwKKyAgIC8qKEZSQU1FX0ZQKGZpKSArICgxMyo0KSkqLyAocmVhZF9yZWdpc3RlciAoQ0ZQX1JFR05VTSkpCisKKyNkZWZpbmUgRlJBTUVfTE9DQUxTX0FERFJFU1MoZmkpIFwKKyAgKChmaSktPmZyYW1lICsoMTYqNCkpCisKKyNlbmRpZiAvKiAwICovCisKKy8qIFJldHVybiBudW1iZXIgb2YgYXJncyBwYXNzZWQgdG8gYSBmcmFtZS4KKyAgIENhbiByZXR1cm4gLTEsIG1lYW5pbmcgbm8gd2F5IHRvIHRlbGwuICAqLworCisjZGVmaW5lIEZSQU1FX05VTV9BUkdTKHZhbCwgZmkpICAodmFsID0gLTEpCisKKy8qIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgYXQgc3RhcnQgb2YgYXJnbGlzdCB0aGF0IGFyZSBub3QgcmVhbGx5IGFyZ3MuICAqLworCisjZGVmaW5lIEZSQU1FX0FSR1NfU0tJUCAwCisKKy8qIFB1dCBoZXJlIHRoZSBjb2RlIHRvIHN0b3JlLCBpbnRvIGEgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MsCisgICB0aGUgYWRkcmVzc2VzIG9mIHRoZSBzYXZlZCByZWdpc3RlcnMgb2YgZnJhbWUgZGVzY3JpYmVkIGJ5IEZSQU1FX0lORk8uCisgICBUaGlzIGluY2x1ZGVzIHNwZWNpYWwgcmVnaXN0ZXJzIHN1Y2ggYXMgcGMgYW5kIGZwIHNhdmVkIGluIHNwZWNpYWwKKyAgIHdheXMgaW4gdGhlIHN0YWNrIGZyYW1lLiAgc3AgaXMgZXZlbiBtb3JlIHNwZWNpYWw6CisgICB0aGUgYWRkcmVzcyB3ZSByZXR1cm4gZm9yIGl0IElTIHRoZSBzcCBmb3IgdGhlIG5leHQgZnJhbWUuCisKKyAgIE5vdGUgdGhhdCBvbiByZWdpc3RlciB3aW5kb3cgbWFjaGluZXMsIHdlIGFyZSBjdXJyZW50bHkgbWFraW5nIHRoZQorICAgYXNzdW1wdGlvbiB0aGF0IHdpbmRvdyByZWdpc3RlcnMgYXJlIGJlaW5nIHNhdmVkIHNvbWV3aGVyZSBpbiB0aGUKKyAgIGZyYW1lIGluIHdoaWNoIHRoZXkgYXJlIGJlaW5nIHVzZWQuICBJZiB0aGV5IGFyZSBzdG9yZWQgaW4gYW4KKyAgIGluZmVyaW9yIGZyYW1lLCBmaW5kX3NhdmVkX3JlZ2lzdGVyIHdpbGwgYnJlYWsuCisKKyAgIE9uIHB5cnMsIGZyYW1lcyBvZiB3aW5kb3cgcmVnaXN0ZXJzIGFyZSBzdG9yZWQgY29udGlndW91c2x5IG9uIGEKKyAgIHNlcGFyYXRlIHN0YWNrLiAgQWxsIHdpbmRvdyByZWdpc3RlcnMgYXJlIGFsd2F5cyBzdG9yZWQuCisgICBUaGUgcGMgYW5kIHBzdyAoZ3IxNSBhbmQgZ3IxNCkgIGFyZSBhbHNvIGFsd2F5cyBzYXZlZDogdGhlIGNhbGwKKyAgIGluc24gc2F2ZXMgdGhlbSBpbiBwcjE1IGFuZCBwcjE0IG9mIHRoZSBuZXcgZnJhbWUgKHRyMTUsdHIxNCBvZiB0aGUKKyAgIG9sZCBmcmFtZSkuICAKKyAgIFRoZSBkYXRhLXN0YWNrIGZyYW1lIHBvaW50ZXIgKENGUCkgaXMgb25seSBzYXZlZCBpbiBmdW5jdGlvbnMgd2hpY2gKKyAgIGFsbG9jYXRlIGEgKGRhdGEpc3RhY2sgZnJhbWUgKHdpdGggImFkc2YiKS4gIFdlIGRldGVjdCB0aGVtIGJ5CisgICBsb29raW5nIGF0IHRoZSBmaXJzdCBpbnNuIG9mIHRoZSBwcm9jZWR1cmUuIAorCisgICBPdGhlciBub24td2luZG93IHJlZ2lzdGVycyAoZ3IwLWdyMTEpIGFyZSBuZXZlciBzYXZlZC4gIFB5cmFtaWQncyBDCisgICBjb21waWxlciBhbmQgZ2NjIGN1cnJlbnRseSBpZ25vcmUgdGhlbSwgc28gaXQncyBub3QgYW4gaXNzdWUuICAgKi8gCisKKyNkZWZpbmUgRlJBTUVfRklORF9TQVZFRF9SRUdTKGZpX3AsIGZyYW1lX3NhdmVkX3JlZ3MpIFwKK3sgIHJlZ2lzdGVyIGludCByZWdudW07CQkJCQkJCVwKKyAgcmVnaXN0ZXIgQ09SRV9BRERSIHBjOwkJCQkJCVwKKyAgcmVnaXN0ZXIgQ09SRV9BRERSIGZuX3N0YXJ0X3BjOwkJCQkJXAorICByZWdpc3RlciBpbnQgZmlyc3RfaW5zbjsJCQkJCQlcCisgIHJlZ2lzdGVyIENPUkVfQUREUiBwcmV2X2NmX2FkZHI7CQkJCQlcCisgIHJlZ2lzdGVyIGludCB3aW5kb3dfcHRyOwkJCQkJCVwKKyAgaWYgKCFmaV9wKSBmYXRhbCAoIkJhZCBmcmFtZSBpbmZvIHN0cnVjdCBpbiBGUkFNRV9GSU5EX1NBVkVEX1JFR1MiKTsJXAorICBtZW1zZXQgKCYoZnJhbWVfc2F2ZWRfcmVncyksICdcMCcsIHNpemVvZiAoZnJhbWVfc2F2ZWRfcmVncykpOwkJXAorCQkJCQkJCQkJXAorICB3aW5kb3dfcHRyID0gcHJldl9jZl9hZGRyID0gRlJBTUVfRlAoZmlfcCk7CQkJCVwKKwkJCQkJCQkJCVwKKyAgZm9yIChyZWdudW0gPSAxNiA7IHJlZ251bSA8IDY0OyByZWdudW0rKyx3aW5kb3dfcHRyKz00KQkJXAorICB7CQkJCQkJCQkJXAorICAgIChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzW3JlZ251bV0gPSB3aW5kb3dfcHRyOwkJCVwKKyAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgLyogSW4gZWFjaCB3aW5kb3csIHBzdywgYW5kIHBjIGFyZSAic2F2ZWQiIGluIHRyMTQsdHIxNS4gKi8JCVwKKyAgLyoqKiBwc3cgaXMgc29tZXRpbWVzIHNhdmVkIGluIGdyMTIgKHNvIHNleiA8c3lzL3BjYi5oPikgKi8JCVwKKyAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbUFNfUkVHTlVNXSA9IEZSQU1FX0ZQKGZpX3ApICsgKDE0KjQpOyAgCVwKKwkJCQkJCQkJCVwKKy8qKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbUENfUkVHTlVNXSA9IChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzWzMxXTsqLwlcCisgIChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzW1BDX1JFR05VTV0gPSBGUkFNRV9GUChmaV9wKSArICgoMTUrMzIpKjQpOwlcCisJCQkJCQkJCQlcCisgIC8qIEZ1bmN0aW9ucyB0aGF0IGFsbG9jYXRlIGEgZnJhbWUgc2F2ZSBzcCAqd2hlcmUqPyAqLwkJXAorLypmaXJzdF9pbnNuID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoZ2V0X3BjX2Z1bmN0aW9uX3N0YXJ0ICgoZmlfcCktPnBjKSw0KTsgKi8gXAorCQkJCQkJCQkJXAorICBmbl9zdGFydF9wYyA9IChnZXRfcGNfZnVuY3Rpb25fc3RhcnQgKChmaV9wKS0+cGMpKTsJCQlcCisgIGZpcnN0X2luc24gPSByZWFkX21lbW9yeV9pbnRlZ2VyKGZuX3N0YXJ0X3BjLCA0KTsJCQlcCisJCQkJCQkJCQlcCisgIGlmICgweDA4ID09ICgoZmlyc3RfaW5zbiA+PiAyMCkgJjB4MGZmKSkgewkJCQlcCisgICAgLyogTkI6IGJlY2F1c2UgV0lORE9XX1JFR0lTVEVSX1AoY2ZwKSBpcyBmYWxzZSwgYSBzYXZlZCBjZnAJCVwKKyAgICAgICBpbiB0aGlzIGZyYW1lIGlzIG9ubHkgdmlzaWJsZSBpbiB0aGlzIGZyYW1lJ3MgY2FsbGVycy4JCVwKKyAgICAgICBUaGF0IG1lYW5zIHRoZSBjZnAgd2UgbWFyayBzYXZlZCBpcyBteSBjYWxsZXIncyBjZnAsIGllIHByMTMuCVwKKyAgICAgICBJIGRvbid0IHVuZGVyc3RhbmQgd2h5IHdlIGRvbid0IGhhdmUgdG8gZG8gdGhhdCBmb3IgcGMsIHRvby4gICovCVwKKwkJCQkJCQkJCVwKKyAgICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tDRlBfUkVHTlVNXSA9IEZSQU1FX0ZQKGZpX3ApKygxMyo0KTsJXAorCQkJCQkJCQkJXAorICAgIChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzW1NQX1JFR05VTV0gPQkJCQlcCisJICByZWFkX21lbW9yeV9pbnRlZ2VyIChGUkFNRV9GUChmaV9wKSsoKDEzKzMyKSo0KSw0KTsJCVwKKyAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKy8qCQkJCQkJCQkJXAorICooZnJhbWVfc2F2ZWRfcmVncykucmVnc1tDRlBfUkVHTlVNXSA9IChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzWzYxXTsJXAorICogKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbU1BfUkVHTlVNXSA9CQkJCQlcCisgKgkgIHJlYWRfbWVtb3J5X2ludGVnZXIgKEZSQU1FX0ZQKGZpX3ApKygoMTMrMzIpKjQpLDQpOwkJXAorICovCQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tDU1BfUkVHTlVNXSA9IHByZXZfY2ZfYWRkcjsJCQlcCit9CisMCisvKiBUaGluZ3MgbmVlZGVkIGZvciBtYWtpbmcgdGhlIGluZmVyaW9yIGNhbGwgZnVuY3Rpb25zLiAgKi8KKyNpZiAwCisvKiBUaGVzZSBhcmUgYWxsIGxpZXMuICBUaGVzZSBtYWNybyBkZWZpbml0aW9ucyBhcmUgYXBwcm9wcmlhdGUgZm9yIGEKKyAgICBTUEFSQy4gT24gYSBweXJhbWlkLCBwdXNoaW5nIGEgZHVtbXkgZnJhbWUgd2lsbAorICAgc3VyZWx5IGludm9sdmUgd3JpdGluZyB0aGUgY29udHJvbCBzdGFjayBwb2ludGVyLAorICAgdGhlbiBzYXZpbmcgdGhlIHBjLiAgVGhpcyByZXF1aXJlcyBhIHByaXZpbGVnZWQgaW5zdHJ1Y3Rpb24uCisgICBNYXliZSBvbmUgZGF5IFB5cmFtaWQgY2FuIGJlIHBlcnN1YWRlZCB0byBhZGQgYSBzeXNjYWxsIHRvIGRvIHRoaXMuCisgICBVbnRpbCB0aGVuLCB3ZSBhcmUgb3V0IG9mIGx1Y2suICovCisKKy8qIFB1c2ggYW4gZW1wdHkgc3RhY2sgZnJhbWUsIHRvIHJlY29yZCB0aGUgY3VycmVudCBQQywgZXRjLiAgKi8KKworI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FIFwKK3sgcmVnaXN0ZXIgQ09SRV9BRERSIHNwID0gcmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKTtcCisgIHJlZ2lzdGVyIGludCByZWdudW07CQkJCSAgICBcCisgIHNwID0gcHVzaF93b3JkIChzcCwgMCk7IC8qIGFyZ2xpc3QgKi8JCSAgICBcCisgIGZvciAocmVnbnVtID0gMTE7IHJlZ251bSA+PSAwOyByZWdudW0tLSkJICAgIFwKKyAgICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKHJlZ251bSkpOyAgICBcCisgIHNwID0gcHVzaF93b3JkIChzcCwgcmVhZF9yZWdpc3RlciAoUENfUkVHTlVNKSk7ICAgXAorICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKEZQX1JFR05VTSkpOyAgIFwKKy8qICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKEFQX1JFR05VTSkpOyovICAgXAorICBzcCA9IHB1c2hfd29yZCAoc3AsIChyZWFkX3JlZ2lzdGVyIChQU19SRUdOVU0pICYgMHhmZmVmKSAgIFwKKwkJICAgICAgKyAweDJmZmYwMDAwKTsJCSAgICBcCisgIHNwID0gcHVzaF93b3JkIChzcCwgMCk7IAkJCSAgICBcCisgIHdyaXRlX3JlZ2lzdGVyIChTUF9SRUdOVU0sIHNwKTsJCSAgICBcCisgIHdyaXRlX3JlZ2lzdGVyIChGUF9SRUdOVU0sIHNwKTsJCSAgICBcCisvKiAgd3JpdGVfcmVnaXN0ZXIgKEFQX1JFR05VTSwgc3AgKyAxNyAqIHNpemVvZiAoaW50KSk7Ki8gfQorCisvKiBEaXNjYXJkIGZyb20gdGhlIHN0YWNrIHRoZSBpbm5lcm1vc3QgZnJhbWUsIHJlc3RvcmluZyBhbGwgcmVnaXN0ZXJzLiAgKi8KKworI2RlZmluZSBQT1BfRlJBTUUgIFwKK3sgcmVnaXN0ZXIgQ09SRV9BRERSIGZwID0gcmVhZF9yZWdpc3RlciAoRlBfUkVHTlVNKTsJCSBcCisgIHJlZ2lzdGVyIGludCByZWdudW07CQkJCQkJIFwKKyAgcmVnaXN0ZXIgaW50IHJlZ21hc2sgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChmcCArIDQsIDQpOwkgXAorICB3cml0ZV9yZWdpc3RlciAoUFNfUkVHTlVNLCAJCQkJCSBcCisJCSAgKHJlZ21hc2sgJiAweGZmZmYpCQkJCSBcCisJCSAgfCAocmVhZF9yZWdpc3RlciAoUFNfUkVHTlVNKSAmIDB4ZmZmZjAwMDApKTsJIFwKKyAgd3JpdGVfcmVnaXN0ZXIgKFBDX1JFR05VTSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnAgKyAxNiwgNCkpOyAgXAorICB3cml0ZV9yZWdpc3RlciAoRlBfUkVHTlVNLCByZWFkX21lbW9yeV9pbnRlZ2VyIChmcCArIDEyLCA0KSk7ICBcCisvKiAgd3JpdGVfcmVnaXN0ZXIgKEFQX1JFR05VTSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnAgKyA4LCA0KSk7Ki8gICBcCisgIGZwICs9IDE2OwkJCQkJCQkgXAorICBmb3IgKHJlZ251bSA9IDA7IHJlZ251bSA8IDEyOyByZWdudW0rKykJCQkgXAorICAgIGlmIChyZWdtYXNrICYgKDB4MTAwMDAgPDwgcmVnbnVtKSkJCQkJIFwKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChyZWdudW0sIHJlYWRfbWVtb3J5X2ludGVnZXIgKGZwICs9IDQsIDQpKTsgXAorICBmcCA9IGZwICsgNCArICgocmVnbWFzayA+PiAzMCkgJiAzKTsJCQkJIFwKKyAgaWYgKHJlZ21hc2sgJiAweDIwMDAwMDAwKQkJCQkJIFwKKyAgICB7IHJlZ251bSA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKGZwLCA0KTsJCQkgXAorICAgICAgZnAgKz0gKHJlZ251bSArIDEpICogNDsgfQkJCQkJIFwKKyAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgZnApOwkJCQkgXAorICBzZXRfY3VycmVudF9mcmFtZSAocmVhZF9yZWdpc3RlciAoRlBfUkVHTlVNKSk7IH0KKworLyogVGhpcyBzZXF1ZW5jZSBvZiB3b3JkcyBpcyB0aGUgaW5zdHJ1Y3Rpb25zCisgICAgIGNhbGxzICM2OSwgQCMzMjMyMzIzMgorICAgICBicHQKKyAgIE5vdGUgdGhpcyBpcyA4IGJ5dGVzLiAgKi8KKworI2RlZmluZSBDQUxMX0RVTU1ZIHsweDMyOWY2OWZiLCAweDAzMzIzMjMyfQorCisjZGVmaW5lIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUIDAgIC8qIFN0YXJ0IGV4ZWN1dGlvbiBhdCBiZWdpbm5pbmcgb2YgZHVtbXkgKi8KKworLyogSW5zZXJ0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGFyZ3MgYW5kIGZ1bmN0aW9uIGFkZHJlc3MKKyAgIGludG8gYSBjYWxsIHNlcXVlbmNlIG9mIHRoZSBhYm92ZSBmb3JtIHN0b3JlZCBhdCBEVU1NWU5BTUUuICAqLworCisjZGVmaW5lIEZJWF9DQUxMX0RVTU1ZKGR1bW15bmFtZSwgcGMsIGZ1biwgbmFyZ3MsIGFyZ3MsIHR5cGUsIGdjY19wKSAgIFwKK3sgKigoY2hhciAqKSBkdW1teW5hbWUgKyAxKSA9IG5hcmdzOwkJXAorICAqKGludCAqKSgoY2hhciAqKSBkdW1teW5hbWUgKyAzKSA9IGZ1bjsgfQorI2VuZGlmIC8qIDAgKi8KKworI2RlZmluZSBQT1BfRlJBTUUgXAorICB7IGVycm9yICgiVGhlIHJldHVybiBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBtYWNoaW5lLiIpOyB9CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3B5ci94bS1weXIuaCBiL2dkYi9jb25maWcvcHlyL3htLXB5ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NWQxMGEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3B5ci94bS1weXIuaApAQCAtMCwwICsxLDkyIEBACisvKiBEZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gYSBQeXJhbWlkYXggdW5kZXIgT1N4IDQuMCAoNC4yYnNkKS4KKyAgIENvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBCSUdfRU5ESUFOCisKKy8qIERlZmluZSBQWVJBTUlEX0NPTlRST0xfRlJBTUVfREVCVUdHSU5HIHRvIGdldCBjb3Bpb3VzIG1lc3NhZ2VzCisgICBhYm91dCByZWFkaW5nIHRoZSBjb250cm9sIHN0YWNrIG9uIHN0YW5kYXJkIG91dHB1dC4gVGhpcworICAgbWFrZXMgZ2RiIHVudXNhYmxlIGFzIGEgZGVidWdnZXIuICovCisKKy8qICNkZWZpbmUgUFlSQU1JRF9DT05UUk9MX0ZSQU1FX0RFQlVHR0lORyAqLworCisvKiBEZWZpbmUgUFlSQU1JRF9GUkFNRV9ERUJVR0dJTkcgZm9yID8gKi8KKworLyogdXNlIFB5cmFtaWQncyBzbGlnaHRseSBzdHJhbmdlIHB0cmFjZSAqLworI2RlZmluZSBQWVJBTUlEX1BUUkFDRQorCisvKiBUcmFkaXRpb25hbCBVbml4IHZpcnR1YWwgYWRkcmVzcyBzcGFjZXMgaGF2ZSB0aHJlIHJlZ2lvbnM6IHRleHQsCisgICBkYXRhIGFuZCBzdGFjay4gIFRoZSB0ZXh0LCBpbml0aWFsaXNlZCBkYXRhLCBhbmQgdW5pbml0aWFsaXNlZCBkYXRhCisgICBhcmUgcmVwcmVzZW50ZWQgaW4gc2VwYXJhdGUgc2VnbWVudHMgb2YgdGhlIGEub3V0IGZpbGUuCisgICBXaGVuIGEgcHJvY2VzcyBkdW1wcyBjb3JlLCB0aGUgZGF0YSBhbmQgc3RhY2sgcmVnaW9ucyBhcmUgd3JpdHRlbgorICAgdG8gYSBjb3JlIGZpbGUuICBUaGlzIGdpdmVzIGEgZGVidWdnZXIgZW5vdWdoIGluZm9ybWF0aW9uIHRvCisgICByZWNvbnN0cnVjdCAoYW5kIGRlYnVnKSB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIGF0IHRoZSB0aW1lIG9mCisgICB0aGUgY29yZWR1bXAuCisgICBQeXJhbWlkcyBoYXZlIGFuIGRpc3RpbmN0IGZvdXJ0aCByZWdpb24gb2YgdGhlIHZpcnR1YWwgYWRkcmVzcworICAgc3BhY2UsIGluIHdoaWNoIHRoZSBjb250ZW50cyBvZiB0aGUgd2luZG93ZWQgcmVnaXN0ZXJzIGFyZSBzdGFja2VkCisgICBpbiBmaXhlZC1zaXplIGZyYW1lcy4gIFB5cmFtaWQgcmVmZXIgdG8gdGhpcyByZWdpb24gYXMgdGhlIGNvbnRyb2wKKyAgIHN0YWNrLiAgRWFjaCBjYWxsIChvciB0cmFwKSBhdXRvbWF0aWNhbGx5IGFsbG9jYXRlcyBhIG5ldyByZWdpc3RlcgorICAgZnJhbWU7IGVhY2ggcmV0dXJuIGRlYWxsb2NhdGVzIHRoZSBjdXJyZW50IGZyYW1lIGFuZCByZXN0b3JlcyB0aGUKKyAgIHdpbmRvd2VkIHJlZ2lzdGVycyB0byB0aGVpciB2YWx1ZXMgYmVmb3JlIHRoZSBjYWxsLgorCisgICBXaGVuIGR1bXBpbmcgY29yZSwgdGhlIGNvbnRyb2wgc3RhY2sgaXMgd3JpdHRlbiB0byBhIGNvcmUgZmlsZXMgYXMKKyAgIGEgdGhpcmQgc2VnbWVudC4gVGhlIGNvcmUtaGFuZGxpbmcgZnVuY3Rpb25zIG5lZWQgdG8ga25vdyB0byBkZWFsCisgICB3aXRoIGl0LiAqLyAKKworLyogVGVsbCBkZXAuYyB3aGF0IHRoZSBleHRyYSBzZWdtZW50IGlzLiAgKi8KKyNkZWZpbmUgUFlSQU1JRF9DT1JFCisKKyNkZWZpbmUgTk9fU0lHSU5URVJSVVBUCisKKyNkZWZpbmUgSEFWRV9XQUlUX1NUUlVDVAorCisvKiBUaGlzIGlzIHRoZSBhbW91bnQgdG8gc3VidHJhY3QgZnJvbSB1LnVfYXIwCisgICB0byBnZXQgdGhlIG9mZnNldCBpbiB0aGUgY29yZSBmaWxlIG9mIHRoZSByZWdpc3RlciB2YWx1ZXMuICAqLworCisjZGVmaW5lIEtFUk5FTF9VX0FERFIgKDB4ODAwMDAwMDAgLSAoVVBBR0VTICogTkJQRykpCisKKy8qIERlZmluZSBvZmZzZXRzIG9mIHJlZ2lzdGVycyBpbiB0aGUgY29yZSBmaWxlIChvciBtYXliZSB1IGFyZWEpICovCisjZGVmaW5lIFJFR0lTVEVSX1VfQUREUihhZGRyLCBibG9ja2VuZCwgcmVnbm8pCVwKK3sgc3RydWN0IHVzZXIgX191OwkJCQkJXAorICBhZGRyID0gYmxvY2tlbmQgICsgKHJlZ25vIC0gMTYgKSAqIDQ7CQkJXAorICBpZiAocmVnbm8gPT0gNjcpIHsgICAJCQkJCVwKKyAgICAgIHByaW50ZigiXFxnZXRpbmcgcmVnIDY3XFwiKTsJCQlcCisgICAgICBhZGRyID0gKGludCkoJl9fdS51X3BjYi5wY2JfY3NwKSAtIChpbnQpICZfX3U7CVwKKyAgfSBlbHNlIGlmIChyZWdubyA9PSBLU1BfUkVHTlVNKSB7CQkJXAorICAgICAgcHJpbnRmKCJcXGdldGluZyBLU1AgKHJlZyAlZClcXCIsIEtTUF9SRUdOVU0pOwlcCisgICAgICBhZGRyID0gKGludCkoJl9fdS51X3BjYi5wY2Jfa3NwKSAtIChpbnQpICZfX3U7CVwKKyAgfSBlbHNlIGlmIChyZWdubyA9PSBDU1BfUkVHTlVNKSB7CQkJXAorICAgICAgcHJpbnRmKCJcXGdldGluZyBDU1AgKHJlZyAlZFxcIixDU1BfUkVHTlVNKTsJXAorICAgICAgYWRkciA9IChpbnQpKCZfX3UudV9wY2IucGNiX2NzcCkgLSAoaW50KSAmX191OwlcCisgIH0gZWxzZSBpZiAocmVnbm8gPT0gNjQpIHsJCQkJXAorICAgICAgcHJpbnRmKCJcXGdldGluZyByZWcgNjRcXCIpOwkJCVwKKyAgICAgIGFkZHIgPSAoaW50KSgmX191LnVfcGNiLnBjYl9jc3ApIC0gKGludCkgJl9fdTsJXAorICAgfSBlbHNlIGlmIChyZWdubyA9PSBQU19SRUdOVU0pCQkJXAorICAgICAgYWRkciA9IGJsb2NrZW5kIC0gNDsJCQkJXAorICBlbHNlIGlmICgxICYmICgoMTYgPiByZWdubykgJiYgKHJlZ25vID4gMTEpKSkJCVwKKyAgICAgIGFkZHIgPSBsYXN0X2ZyYW1lX29mZnNldCArICg0ICoocmVnbm8rMzIpKTsJXAorICBlbHNlIGlmICgwICYmICgxMiA+IHJlZ25vKSkgCQkJCVwKKyAgICAgIGFkZHIgPSBnbG9iYWxfcmVnX29mZnNldCArICg0ICpyZWdubyk7CQlcCisgIGVsc2UgaWYgKDE2ID4gcmVnbm8pCSAJCQkJXAorICAgICAgYWRkciA9IGdsb2JhbF9yZWdfb2Zmc2V0ICsgKDQgKnJlZ25vKTsJCVwKKyBlbHNlCQkJCQkJCVwKKyAgICAgIGFkZHIgPSBibG9ja2VuZCAgKyAocmVnbm8gLSAxNiApICogNDsJCVwKK30KKworLyogT3ZlcnJpZGUgY29waWVzIG9mIHtmZXRjaCxzdG9yZX1faW5mZXJpb3JfcmVnaXN0ZXJzIGluIGluZnB0cmFjZS5jLiAgKi8KKyNkZWZpbmUgRkVUQ0hfSU5GRVJJT1JfUkVHSVNURVJTCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3JvbXAvcnRic2QubWggYi9nZGIvY29uZmlnL3JvbXAvcnRic2QubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzYzQyZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcm9tcC9ydGJzZC5taApAQCAtMCwwICsxLDggQEAKKyMgSUJNIFJUL1BDIHJ1bm5pbmcgQlNEIHVuaXguIAorIyBUaGlzIGZpbGUgY29udHJpYnV0ZWQgYXQgTllVLCB3aGVyZSB3ZSBhcmUgdXNpbmcgdGhlIFJUIHRvIHJlbW90ZQorIyBkZWJ1ZyBhbiBhMjlrIHJ1bm5pbmcgdW5peC4gIE5vIGF0dGVtcHQsIGFzIG9mIDcvMTYvOTEsIGhhcyBiZWVuIG1hZGUKKyMgdG8gc3VwcG9ydCBkZWJ1Z2dpbmcgb2YgUlQgZXhlY3V0YWJsZXMuCitYREVQRklMRVMgY29yZWxvdy5vIGNvcmUtYW91dC5vIGluZnB0cmFjZS5vIGluZnRhcmcubyBmb3JrLWNoaWxkLm8KK01IX0NGTEFHUz0tREhPU1RJTkdfT05MWQkjIE5vIGRlYnVnZ2luZyBvZiBSVCBleGVjdXRhYmxlcyAKK1hNX0ZJTEU9IHhtLXJ0YnNkLmgKK0NDPWdjYyAtdHJhZGl0aW9uYWwJCSMgaGMvcGNjIGp1c3QgY2FuJ3QgY3V0IGl0LgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9yb21wL3htLXJ0YnNkLmggYi9nZGIvY29uZmlnL3JvbXAveG0tcnRic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTliNTdmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9yb21wL3htLXJ0YnNkLmgKQEAgLTAsMCArMSw0MCBAQAorLyogRGVmaW5pdGlvbnMgdG8gaG9zdCBHREIgb24gYW4gSUJNIFJUL1BDIHJ1bm5pbmcgQlNEIFVuaXguIAorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTEsIDE5OTIgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgV29vZCBAIE5ldyBZb3JrIFVuaXZlcnNpdHkgKHdvb2RAbGFiLnVsdHJhLm55dS5lZHUpLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgbWFjaGluZSBpcyBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKi8KKyNkZWZpbmUgSE9TVF9CWVRFX09SREVSIEJJR19FTkRJQU4KKworLyogVGhpcyBPUyBoYXMgdGhlIHdhaXQgc3RydWN0dXJlICovCisjZGVmaW5lIEhBVkVfV0FJVF9TVFJVQ1QKKworI2lmZGVmIEhPU1RJTkdfT05MWQorLyoKKyAqIFRoaXMgbmV4dCB0d28gZGVmaW5lcyBhcmUgdG8gZ2V0IEdEQiB1cCBhbmQgcnVubmluZyBhcyBhIGhvc3QgdG8KKyAqIGRvIHJlbW90ZSBkZWJ1Z2dpbmcuICBJIGtub3cgdGhlcmUgaXMgYSBnZGIgZm9yIHRoZSBSVCwgYnV0IHRoZXJlIHdhc24ndAorICogYW4geGNvbmZpZy9ydCogZmlsZS4gIAorICovCisjZGVmaW5lIEtFUk5FTF9VX0FERFJfQlNEICAvKiBUaGlzIG1heSBiZSBjb3JyZWN0LCBidXQgaGFzbid0IGJlZW4gdGVzdGVkICovCisjZGVmaW5lIFJFR0lTVEVSX1VfQUREUihhLGIsYykJICAgXAorCShwcmludGYoIkdEQiBjYW4gbm90IGRlYnVnIElCTSBSVC9QQyBCU0QgZXhlY3V0YWJsZXMgKHlldClcbiIpLFwKKwlxdWl0KCksMCkKKyNlbHNlCisjIGluY2x1ZGUJIkdEQiBmb3IgdGhlIFJUIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgZGlzdHJpYnV0aW9uIiAKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3JzNjAwMC9haXg0Lm1oIGIvZ2RiL2NvbmZpZy9yczYwMDAvYWl4NC5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWJjMmRhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9yczYwMDAvYWl4NC5taApAQCAtMCwwICsxLDExIEBACisjIEhvc3Q6IElCTSBSUy82MDAwIHJ1bm5pbmcgQUlYNAorCitYTV9GSUxFPSB4bS1haXg0LmgKK1hERVBGSUxFUz0gCisKK05BVF9GSUxFPSBubS1yczYwMDAuaAorTkFUREVQRklMRVM9IGZvcmstY2hpbGQubyBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gY29yZWxvdy5vIHJzNjAwMC1uYXQubworCisjIFdoZW4gY29tcGlsZWQgd2l0aCBjYywgZm9yIGRlYnVnZ2luZywgdGhpcyBhcmd1bWVudCBzaG91bGQgYmUgcGFzc2VkLgorIyBXZSBoYXZlIG5vIGlkZWEgd2hvIG91ciBjdXJyZW50IGNvbXBpbGVyIGlzIHRob3VnaCwgc28gd2Ugc2tpcCBpdC4KKyMgTUhfQ0ZMQUdTID0gLWJub2RlbGNzZWN0CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3JzNjAwMC9haXg0Lm10IGIvZ2RiL2NvbmZpZy9yczYwMDAvYWl4NC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjEzZjBmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9yczYwMDAvYWl4NC5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBJQk0gUlMvNjAwMCBydW5uaW5nIEFJWDQKK1RERVBGSUxFUz0gcnM2MDAwLXRkZXAubyB4Y29mZnNvbGliLm8geGNvZmZyZWFkLm8KK1RNX0ZJTEU9IHRtLXJzNjAwMC1haXg0LmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcnM2MDAwL25tLXJzNjAwMC5oIGIvZ2RiL2NvbmZpZy9yczYwMDAvbm0tcnM2MDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwZDUzZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcnM2MDAwL25tLXJzNjAwMC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIElCTSBSUy82MDAwIG5hdGl2ZS1kZXBlbmRlbnQgbWFjcm9zIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSwgMTk5MiwgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBEbyBpbXBsZW1lbnQgdGhlIGF0dGFjaCBhbmQgZGV0YWNoIGNvbW1hbmRzLiAgKi8KKworI2RlZmluZSBBVFRBQ0hfREVUQUNICisKKyNkZWZpbmUgUFRSQUNFX0FUVEFDSCBQVF9BVFRBQ0gKKyNkZWZpbmUgUFRSQUNFX0RFVEFDSCBQVF9ERVRBQ0gKKworLyogT3ZlcnJpZGUgY29waWVzIG9mIHtmZXRjaCxzdG9yZX1faW5mZXJpb3JfcmVnaXN0ZXJzIGluIGluZnB0cmFjZS5jLiAgKi8KKworI2RlZmluZSBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMKKworLyogV2hlbiBhIGNoaWxkIHByb2Nlc3MgaXMganVzdCBzdGFydGluZywgd2Ugc25lYWsgaW4gYW5kIHJlbG9jYXRlCisgICB0aGUgc3ltYm9sIHRhYmxlIChhbmQgb3RoZXIgc3R1ZmYpIGFmdGVyIHRoZSBkeW5hbWljIGxpbmtlciBoYXMKKyAgIGZpZ3VyZWQgb3V0IHdoZXJlIHRoZXkgZ28uICAqLworCisjZGVmaW5lCVNPTElCX0NSRUFURV9JTkZFUklPUl9IT09LKFBJRCkJXAorICBkbyB7CQkJCQlcCisgICAgeGNvZmZfcmVsb2NhdGVfc3ltdGFiIChQSUQpOwlcCisgIH0gd2hpbGUgKDApCisKKy8qIFdoZW4gYSB0YXJnZXQgcHJvY2VzcyBvciBjb3JlLWZpbGUgaGFzIGJlZW4gYXR0YWNoZWQsIHdlIHNuZWFrIGluCisgICBhbmQgZmlndXJlIG91dCB3aGVyZSB0aGUgc2hhcmVkIGxpYnJhcmllcyBoYXZlIGdvdCB0by4gICovCisKKyNkZWZpbmUJU09MSUJfQUREKGEsIGIsIGMpCVwKKyAgaWYgKGluZmVyaW9yX3BpZCkJXAorICAgIC8qIEF0dGFjaCB0byBwcm9jZXNzLiAgKi8gIFwKKyAgICB4Y29mZl9yZWxvY2F0ZV9zeW10YWIgKGluZmVyaW9yX3BpZCk7IFwKKyAgZWxzZQkJXAorICAgIC8qIENvcmUgZmlsZS4gICovIFwKKyAgICB4Y29mZl9yZWxvY2F0ZV9jb3JlIChjKTsKKworZXh0ZXJuIHZvaWQgeGNvZmZfcmVsb2NhdGVfc3ltdGFiIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOworI2lmZGVmIF9fU1REQ19fCitzdHJ1Y3QgdGFyZ2V0X29wczsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgeGNvZmZfcmVsb2NhdGVfY29yZSBQQVJBTVMgKChzdHJ1Y3QgdGFyZ2V0X29wcyAqKSk7CisKKy8qIFJldHVybiBzaXplb2YgdXNlciBzdHJ1Y3QgdG8gY2FsbGVycyBpbiBsZXNzIG1hY2hpbmUgZGVwZW5kZW50IHJvdXRpbmVzICovCisKKyNkZWZpbmUgS0VSTkVMX1VfU0laRSBrZXJuZWxfdV9zaXplKCkKK2V4dGVybiBpbnQga2VybmVsX3Vfc2l6ZSBQQVJBTVMgKCh2b2lkKSk7CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3JzNjAwMC9ubS1yczYwMDBseS5oIGIvZ2RiL2NvbmZpZy9yczYwMDAvbm0tcnM2MDAwbHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTU5ODIyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9yczYwMDAvbm0tcnM2MDAwbHkuaApAQCAtMCwwICsxLDI1IEBACisvKiBOYXRpdmUtZGVwZW5kZW50IGRlZmluaXRpb25zIGZvciBSUzYwMDAgcnVubmluZyBMeW54T1MuCisgICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIE5NX1JTNjAwMExZTlhfSAorI2RlZmluZSBOTV9SUzYwMDBMWU5YX0gKKworI2luY2x1ZGUgIm5tLWx5bnguaCIKKworI2VuZGlmIC8qIE5NX1JTNjAwMExZTlhfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9yczYwMDAvcnM2MDAwLm1oIGIvZ2RiL2NvbmZpZy9yczYwMDAvcnM2MDAwLm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMGQ2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3JzNjAwMC9yczYwMDAubWgKQEAgLTAsMCArMSwxMSBAQAorIyBIb3N0OiBJQk0gUlMvNjAwMCBydW5uaW5nIEFJWAorCitYTV9GSUxFPSB4bS1yczYwMDAuaAorWERFUEZJTEVTPSAKKworTkFUX0ZJTEU9IG5tLXJzNjAwMC5oCitOQVRERVBGSUxFUz0gZm9yay1jaGlsZC5vIGluZnB0cmFjZS5vIGluZnRhcmcubyBjb3JlbG93Lm8gcnM2MDAwLW5hdC5vCisKKyMgV2hlbiBjb21waWxlZCB3aXRoIGNjLCBmb3IgZGVidWdnaW5nLCB0aGlzIGFyZ3VtZW50IHNob3VsZCBiZSBwYXNzZWQuCisjIFdlIGhhdmUgbm8gaWRlYSB3aG8gb3VyIGN1cnJlbnQgY29tcGlsZXIgaXMgdGhvdWdoLCBzbyB3ZSBza2lwIGl0LgorIyBNSF9DRkxBR1MgPSAtYm5vZGVsY3NlY3QKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcnM2MDAwL3JzNjAwMC5tdCBiL2dkYi9jb25maWcvcnM2MDAwL3JzNjAwMC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjI5NGIyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9yczYwMDAvcnM2MDAwLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IElCTSBSUy82MDAwIHJ1bm5pbmcgQUlYCitUREVQRklMRVM9IHJzNjAwMC10ZGVwLm8geGNvZmZzb2xpYi5vIHhjb2ZmcmVhZC5vCitUTV9GSUxFPSB0bS1yczYwMDAuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9yczYwMDAvcnM2MDAwbHlueC5taCBiL2dkYi9jb25maWcvcnM2MDAwL3JzNjAwMGx5bngubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzODE1MgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcnM2MDAwL3JzNjAwMGx5bngubWgKQEAgLTAsMCArMSwxMSBAQAorIyBIb3N0OiBSUzYwMDAgcnVubmluZyBMeW54T1MKKworWE1fRklMRT0geG0tcnM2MDAwbHkuaAorWERFUEZJTEVTPSBzZXItdGNwLm8KK1hNX0NMSUJTPSAtbGJzZAorCitOQVRfRklMRT0gbm0tcnM2MDAwbHkuaAorTkFUREVQRklMRVM9IGZvcmstY2hpbGQubyBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gY29yZWxvdy5vIGx5bngtbmF0Lm8geGNvZmZyZWFkLm8KKworR0RCU0VSVkVSX0xJQlM9IC1sYnNkCitHREJTRVJWRVJfREVQRklMRVM9IGxvdy1seW54Lm8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcnM2MDAwL3JzNjAwMGx5bngubXQgYi9nZGIvY29uZmlnL3JzNjAwMC9yczYwMDBseW54Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODAzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3JzNjAwMC9yczYwMDBseW54Lm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IElCTSBSUzYwMDAgcnVubmluZyBMeW54T1MKK1RERVBGSUxFUz0gY29mZi1zb2xpYi5vIHJzNjAwMC10ZGVwLm8KK1RNX0ZJTEU9IHRtLXJzNjAwMGx5LmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvcnM2MDAwL3RtLXJzNjAwMC1haXg0LmggYi9nZGIvY29uZmlnL3JzNjAwMC90bS1yczYwMDAtYWl4NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWVhZTMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3JzNjAwMC90bS1yczYwMDAtYWl4NC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIE1hY3JvIGRlZmluaXRpb25zIGZvciBSUy82MDAwIHJ1bm5pbmcgQUlYNC4KKyAgIENvcHlyaWdodCAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLworCisjaWZuZGVmIFRNX1JTNjAwMF9BSVg0X0gKKyNkZWZpbmUgVE1fUlM2MDAwX0FJWDRfSAorCisvKiBVc2UgZ2VuZXJpYyBSUzYwMDAgZGVmaW5pdGlvbnMuICovCisjaW5jbHVkZSAicnM2MDAwL3RtLXJzNjAwMC5oIgorCisjZW5kaWYgLyogVE1fUlM2MDAwX0FJWDRfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9yczYwMDAvdG0tcnM2MDAwLmggYi9nZGIvY29uZmlnL3JzNjAwMC90bS1yczYwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmJlZWMxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9yczYwMDAvdG0tcnM2MDAwLmgKQEAgLTAsMCArMSw1NjQgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIHRhcmdldCBleGVjdXRpb24gb24gYW4gUlM2MDAwLCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTcKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgSUJNIENvcnBvcmF0aW9uLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBfX1NURENfXwkJLyogRm9yd2FyZCBkZWNscyBmb3IgcHJvdG90eXBlcyAqLworc3RydWN0IGZyYW1lX2luZm87CitzdHJ1Y3QgdHlwZTsKK3N0cnVjdCB2YWx1ZTsKKyNlbmRpZgorCisvKiBNaW5pbXVtIHBvc3NpYmxlIHRleHQgYWRkcmVzcyBpbiBBSVggKi8KKworI2RlZmluZSBURVhUX1NFR01FTlRfQkFTRQkweDEwMDAwMDAwCisKKy8qIExvYWQgc2VnbWVudCBvZiBhIGdpdmVuIHBjIHZhbHVlLiAqLworCisjZGVmaW5lCVBDX0xPQURfU0VHTUVOVChQQykJcGNfbG9hZF9zZWdtZW50X25hbWUoUEMpCitleHRlcm4gY2hhciAqcGNfbG9hZF9zZWdtZW50X25hbWUgUEFSQU1TICgoQ09SRV9BRERSKSk7CisKKy8qIEFJWCBjYyBzZWVtcyB0byBnZXQgdGhpcyByaWdodC4gICovCisKKyNkZWZpbmUgQkVMSUVWRV9QQ0NfUFJPTU9USU9OIDEKKworLyogcmV0dXJuIHRydWUgaWYgYSBnaXZlbiBgcGMnIHZhbHVlIGlzIGluIGBjYWxsIGR1bW15JyBmdW5jdGlvbi4gKi8KKy8qIEZJWE1FOiBUaGlzIGp1c3QgY2hlY2tzIGZvciB0aGUgZW5kIG9mIHRoZSBzdGFjaywgd2hpY2ggaXMgYnJva2VuCisgICBmb3IgdGhpbmdzIGxpa2Ugc3RlcHBpbmcgdGhyb3VnaCBnY2MgbmVzdGVkIGZ1bmN0aW9uIHN0dWJzLiAgKi8KKyNkZWZpbmUJUENfSU5fQ0FMTF9EVU1NWShTVE9QX1BDLCBTVE9QX1NQLCBTVE9QX0ZSQU1FX0FERFIpCVwKKwkoU1RPUF9TUCA8IFNUT1BfUEMgJiYgU1RPUF9QQyA8IFNUQUNLX0VORF9BRERSKQorCisjaWYgMAorZXh0ZXJuIHVuc2lnbmVkIGludCB0ZXh0X3N0YXJ0LCBkYXRhX3N0YXJ0OworZXh0ZXJuIGNoYXIgKmNvcmVmaWxlOworI2VuZGlmCitleHRlcm4gaW50IGluZmVyaW9yX3BpZDsKKworLyogV2UgYXJlIG1pc3NpbmcgcmVnaXN0ZXIgZGVzY3JpcHRpb25zIGluIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzLiBTaWdoISAqLworCitzdHJ1Y3QgcmVncyB7CisJaW50CWdyZWdzIFszMl07CQkvKiBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzICovCisJaW50CXBjOwkJCS8qIHByb2dyYW0gY29udGVyCSovCisJaW50CXBzOwkJCS8qIHByb2Nlc3NvciBzdGF0dXMsIG9yIG1hY2hpbmUgc3RhdGUgKi8KK307CisKK3N0cnVjdCBmcF9zdGF0dXMgeworCWRvdWJsZQlmcHJlZ3MgWzMyXTsJCS8qIGZsb2F0aW5nIEdQIHJlZ2lzdGVycyAqLworfTsKKworCisvKiBUbyBiZSB1c2VkIGJ5IHNraXBfcHJvbG9ndWUuICovCisKK3N0cnVjdCByczYwMDBfZnJhbWVkYXRhIHsKKyAgaW50CW9mZnNldDsJCQkJLyogdG90YWwgc2l6ZSBvZiBmcmFtZSAtLS0gdGhlIGRpc3RhbmNlCisJCQkJCSAgIGJ5IHdoaWNoIHdlIGRlY3JlbWVudCBzcCB0byBhbGxvY2F0ZQorCQkJCQkgICB0aGUgZnJhbWUgKi8KKyAgaW50CXNhdmVkX2dwcjsJCQkvKiBzbWFsbGVzdCAjIG9mIHNhdmVkIGdwciAqLworICBpbnQJc2F2ZWRfZnByOwkJCS8qIHNtYWxsZXN0ICMgb2Ygc2F2ZWQgZnByICovCisgIGludAlhbGxvY2FfcmVnOwkJCS8qIGFsbG9jYSByZWdpc3RlciBudW1iZXIgKGZyYW1lIHB0cikgKi8KKyAgY2hhcglmcmFtZWxlc3M7CQkJLyogdHJ1ZSBpZiBmcmFtZWxlc3MgZnVuY3Rpb25zLiAqLworICBjaGFyCW5vc2F2ZWRwYzsJCQkvKiB0cnVlIGlmIHBjIG5vdCBzYXZlZC4gKi8KKyAgaW50CWdwcl9vZmZzZXQ7CQkJLyogb2Zmc2V0IG9mIHNhdmVkIGdwcnMgZnJvbSBwcmV2IHNwICovCisgIGludAlmcHJfb2Zmc2V0OwkJCS8qIG9mZnNldCBvZiBzYXZlZCBmcHJzIGZyb20gcHJldiBzcCAqLworICBpbnQJbHJfb2Zmc2V0OwkJCS8qIG9mZnNldCBvZiBzYXZlZCBsciAqLworICBpbnQJY3Jfb2Zmc2V0OwkJCS8qIG9mZnNldCBvZiBzYXZlZCBjciAqLworfTsKKworLyogRGVmaW5lIHRoZSBieXRlIG9yZGVyIG9mIHRoZSBtYWNoaW5lLiAgKi8KKworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUl9ERUZBVUxUCUJJR19FTkRJQU4KKworLyogQUlYJ3MgYXNzZW1ibGVyIGRvZXNuJ3QgZ3JvayBkb2xsYXIgc2lnbnMgaW4gaWRlbnRpZmllcnMuCisgICBTbyB3ZSB1c2UgZG90cyBpbnN0ZWFkLiAgVGhpcyBpdGVtIG11c3QgYmUgY29vcmRpbmF0ZWQgd2l0aCBHKysuICovCisjdW5kZWYgQ1BMVVNfTUFSS0VSCisjZGVmaW5lIENQTFVTX01BUktFUiAnLicKKworLyogT2Zmc2V0IGZyb20gYWRkcmVzcyBvZiBmdW5jdGlvbiB0byBzdGFydCBvZiBpdHMgY29kZS4KKyAgIFplcm8gb24gbW9zdCBtYWNoaW5lcy4gICovCisKKyNkZWZpbmUgRlVOQ1RJT05fU1RBUlRfT0ZGU0VUIDAKKworLyogQWR2YW5jZSBQQyBhY3Jvc3MgYW55IGZ1bmN0aW9uIGVudHJ5IHByb2xvZ3VlIGluc3RydWN0aW9ucworICAgdG8gcmVhY2ggc29tZSAicmVhbCIgY29kZS4gICovCisKKyNkZWZpbmUgU0tJUF9QUk9MT0dVRShwYykJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICBzdHJ1Y3QgcnM2MDAwX2ZyYW1lZGF0YSBfZnJhbWU7CQkJCQlcCisgIHBjID0gc2tpcF9wcm9sb2d1ZSAocGMsICZfZnJhbWUpOwkJCQkJXAorfSB3aGlsZSAoMCkKKworZXh0ZXJuIENPUkVfQUREUiBza2lwX3Byb2xvZ3VlIFBBUkFNUygoQ09SRV9BRERSLCBzdHJ1Y3QgcnM2MDAwX2ZyYW1lZGF0YSAqKSk7CisKKworLyogSWYgUEMgaXMgaW4gc29tZSBmdW5jdGlvbi1jYWxsIHRyYW1wb2xpbmUgY29kZSwgcmV0dXJuIHRoZSBQQworICAgd2hlcmUgdGhlIGZ1bmN0aW9uIGl0c2VsZiBhY3R1YWxseSBzdGFydHMuICBJZiBub3QsIHJldHVybiBOVUxMLiAgKi8KKworI2RlZmluZQlTS0lQX1RSQU1QT0xJTkVfQ09ERShwYykJc2tpcF90cmFtcG9saW5lX2NvZGUgKHBjKQorZXh0ZXJuIENPUkVfQUREUiBza2lwX3RyYW1wb2xpbmVfY29kZSBQQVJBTVMgKChDT1JFX0FERFIpKTsKKworLyogTnVtYmVyIG9mIHRyYXAgc2lnbmFscyB3ZSBuZWVkIHRvIHNraXAgb3Zlciwgb25jZSB0aGUgaW5mZXJpb3IgcHJvY2VzcworICAgc3RhcnRzIHJ1bm5pbmcuICovCisKKyNkZWZpbmUJU1RBUlRfSU5GRVJJT1JfVFJBUFNfRVhQRUNURUQJMgorCisvKiBBSVggaGFzIGEgY291cGxlIG9mIHN0cmFuZ2UgcmV0dXJucyBmcm9tIHdhaXQoKS4gICovCisKKyNkZWZpbmUgQ0hJTERfU1BFQ0lBTF9XQUlUU1RBVFVTKG91cnN0YXR1cywgaG9zdHN0YXR1cykgKCBcCisgIC8qICJzdG9wIGFmdGVyIGxvYWQiIHN0YXR1cy4gICovIFwKKyAgKGhvc3RzdGF0dXMpID09IDB4NTdjID8gKG91cnN0YXR1cyktPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfTE9BREVELCAxIDogXAorICBcCisgIC8qIHNpZ25hbCAwLiBJIGhhdmUgbm8gaWRlYSB3aHkgd2FpdCgyKSByZXR1cm5zIHdpdGggdGhpcyBzdGF0dXMgd29yZC4gICovIFwKKyAgLyogSXQgbG9va3MgaGFybWxlc3MuICovIFwKKyAgKGhvc3RzdGF0dXMpID09IDB4N2YgPyAob3Vyc3RhdHVzKS0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TUFVSSU9VUywgMSA6IFwKKyAgXAorICAvKiBBIG5vcm1hbCB3YWl0c3RhdHVzLiAgTGV0IHRoZSB1c3VhbCBtYWNyb3MgZGVhbCB3aXRoIGl0LiAgKi8gXAorICAwKQorCisvKiBJbiB4Y29mZiwgd2UgY2Fubm90IHByb2Nlc3MgbGluZSBudW1iZXJzIHdoZW4gd2Ugc2VlIHRoZW0uIFRoaXMgaXMKKyAgIG1haW5seSBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGluY2x1ZGUgZmlsZXMuIFNvLAorICAgd2UgcG9zdHBvbmUgdGhhdCwgYW5kIHRoZW4gZW50ZXIgYW5kIHNvcnQoPykgdGhlIHdob2xlIGxpbmUgdGFibGUgYXQKKyAgIG9uY2UsIHdoZW4gd2UgYXJlIGNsb3NpbmcgdGhlIGN1cnJlbnQgc3ltYm9sIHRhYmxlIGluIGVuZF9zeW10YWIoKS4gKi8KKworI2RlZmluZQlQUk9DRVNTX0xJTkVOVU1CRVJfSE9PSygpCWFpeF9wcm9jZXNzX2xpbmVub3MgKCkKK2V4dGVybiB2b2lkIGFpeF9wcm9jZXNzX2xpbmVub3MgUEFSQU1TICgodm9pZCkpOworICAgCisvKiBJbW1lZGlhdGVseSBhZnRlciBhIGZ1bmN0aW9uIGNhbGwsIHJldHVybiB0aGUgc2F2ZWQgcGMuCisgICBDYW4ndCBnbyB0aHJvdWdoIHRoZSBmcmFtZXMgZm9yIHRoaXMgYmVjYXVzZSBvbiBzb21lIG1hY2hpbmVzCisgICB0aGUgbmV3IGZyYW1lIGlzIG5vdCBzZXQgdXAgdW50aWwgdGhlIG5ldyBmdW5jdGlvbiBleGVjdXRlcworICAgc29tZSBpbnN0cnVjdGlvbnMuICAqLworCisjZGVmaW5lCVNBVkVEX1BDX0FGVEVSX0NBTEwoZnJhbWUpIHJlYWRfcmVnaXN0ZXIgKExSX1JFR05VTSkKKworLyogQWRkcmVzcyBvZiBlbmQgb2Ygc3RhY2sgc3BhY2UuICAqLworCisjZGVmaW5lIFNUQUNLX0VORF9BRERSIDB4MmZmODAwMDAKKworLyogU3RhY2sgZ3Jvd3MgZG93bndhcmQuICAqLworCisjZGVmaW5lIElOTkVSX1RIQU4obGhzLHJocykgKChsaHMpIDwgKHJocykpCisKKy8qIFRoaXMgaXMgaG93IGFyZ3VtZW50cyBwdXNoZWQgb250byBzdGFjayBvciBwYXNzZWQgaW4gcmVnaXN0ZXJzLgorICAgU3RhY2sgbXVzdCBiZSBhbGlnbmVkIG9uIDY0LWJpdCBib3VuZGFyaWVzIHdoZW4gc3ludGhlc2l6aW5nCisgICBmdW5jdGlvbiBjYWxscy4gIFdlIGRvbid0IG5lZWQgU1RBQ0tfQUxJR04sIFBVU0hfQVJHVU1FTlRTIHdpbGwKKyAgIGhhbmRsZSBpdC4gKi8KKworI2RlZmluZQlQVVNIX0FSR1VNRU5UUyhuYXJncywgYXJncywgc3AsIHN0cnVjdF9yZXR1cm4sIHN0cnVjdF9hZGRyKSBcCisgIHNwID0gcHVzaF9hcmd1bWVudHMoKG5hcmdzKSwgKGFyZ3MpLCAoc3ApLCAoc3RydWN0X3JldHVybiksIChzdHJ1Y3RfYWRkcikpCitleHRlcm4gQ09SRV9BRERSIHB1c2hfYXJndW1lbnRzIFBBUkFNUyAoKGludCwgc3RydWN0IHZhbHVlICoqLCBDT1JFX0FERFIsCisJCQkJCSBpbnQsIENPUkVfQUREUikpOworCisvKiBCUkVBS1BPSU5UX0ZST01fUEMgdXNlcyB0aGUgcHJvZ3JhbSBjb3VudGVyIHZhbHVlIHRvIGRldGVybWluZSB0aGUKKyAgIGJyZWFrcG9pbnQgdGhhdCBzaG91bGQgYmUgdXNlZCAqLworZXh0ZXJuIGJyZWFrcG9pbnRfZnJvbV9wY19mbiByczYwMDBfYnJlYWtwb2ludF9mcm9tX3BjOworI2RlZmluZSBCUkVBS1BPSU5UX0ZST01fUEMocGNwdHIsIGxlbnB0cikgcnM2MDAwX2JyZWFrcG9pbnRfZnJvbV9wYyAocGNwdHIsIGxlbnB0cikKKworLyogQW1vdW50IFBDIG11c3QgYmUgZGVjcmVtZW50ZWQgYnkgYWZ0ZXIgYSBicmVha3BvaW50LgorICAgVGhpcyBpcyBvZnRlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIEJSRUFLUE9JTlQKKyAgIGJ1dCBub3QgYWx3YXlzLiAgKi8KKworI2RlZmluZSBERUNSX1BDX0FGVEVSX0JSRUFLIDAKKworLyogU2F5IGhvdyBsb25nIChvcmRpbmFyeSkgcmVnaXN0ZXJzIGFyZS4gIFRoaXMgaXMgYSBwaWVjZSBvZiBib2dvc2l0eQorICAgdXNlZCBpbiBwdXNoX3dvcmQgYW5kIGEgZmV3IG90aGVyIHBsYWNlczsgUkVHSVNURVJfUkFXX1NJWkUgaXMgdGhlCisgICByZWFsIHdheSB0byBrbm93IGhvdyBiaWcgYSByZWdpc3RlciBpcy4gICovCisjZGVmaW5lIFJFR0lTVEVSX1NJWkUgNAorCisKKy8qIFJldHVybiB0aGUgbmFtZSBvZiByZWdpc3RlciBudW1iZXIgUkVHLiAgVGhpcyBtYXkgcmV0dXJuICIiIHRvCisgICBpbmRpY2F0ZSBhIHJlZ2lzdGVyIG51bWJlciB0aGF0J3Mgbm90IHVzZWQgb24gdGhpcyB2YXJpYW50LgorICAgKFJlZ2lzdGVyIG51bWJlcnMgbWF5IGJlIHNwYXJzZSBmb3IgY29uc2lzdGVuY3kgYmV0d2VlbiB2YXJpYW50cy4pICAqLworI2RlZmluZSBSRUdJU1RFUl9OQU1FKHJlZykgKHJzNjAwMF9yZWdpc3Rlcl9uYW1lKHJlZykpCitleHRlcm4gY2hhciAqcnM2MDAwX3JlZ2lzdGVyX25hbWUgKGludCByZWcpOworCisvKiBOdW1iZXIgb2YgbWFjaGluZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlVNX1JFR1MgMTgzCisKKy8qIFJlZ2lzdGVyIG51bWJlcnMgb2YgdmFyaW91cyBpbXBvcnRhbnQgcmVnaXN0ZXJzLgorICAgTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2UgdmFsdWVzIGFyZSAicmVhbCIgcmVnaXN0ZXIgbnVtYmVycywKKyAgIGFuZCBjb3JyZXNwb25kIHRvIHRoZSBnZW5lcmFsIHJlZ2lzdGVycyBvZiB0aGUgbWFjaGluZSwKKyAgIGFuZCBzb21lIGFyZSAicGhvbnkiIHJlZ2lzdGVyIG51bWJlcnMgd2hpY2ggYXJlIHRvbyBsYXJnZQorICAgdG8gYmUgYWN0dWFsIHJlZ2lzdGVyIG51bWJlcnMgYXMgZmFyIGFzIHRoZSB1c2VyIGlzIGNvbmNlcm5lZAorICAgYnV0IGRvIHNlcnZlIHRvIGdldCB0aGUgZGVzaXJlZCB2YWx1ZXMgd2hlbiBwYXNzZWQgdG8gcmVhZF9yZWdpc3Rlci4gICovCisKKyNkZWZpbmUgRlBfUkVHTlVNIDEJCS8qIENvbnRhaW5zIGFkZHJlc3Mgb2YgZXhlY3V0aW5nIHN0YWNrIGZyYW1lICovCisjZGVmaW5lIFNQX1JFR05VTSAxCQkvKiBDb250YWlucyBhZGRyZXNzIG9mIHRvcCBvZiBzdGFjayAqLworI2RlZmluZQlUT0NfUkVHTlVNIDIJCS8qIFRPQyByZWdpc3RlciAqLworI2RlZmluZSBGUDBfUkVHTlVNIDMyCQkvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlciAwICovCisjZGVmaW5lCUdQMF9SRUdOVU0gMAkJLyogR1BSIHJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgRlAwX1JFR05VTSAzMgkJLyogRlBSIChGbG9hdGluZyBwb2ludCkgcmVnaXN0ZXIgMCAqLworI2RlZmluZSBGUExBU1RfUkVHTlVNIDYzCS8qIExhc3QgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKi8gIAorCisvKiBTcGVjaWFsIHB1cnBvc2UgcmVnaXN0ZXJzLi4uICovCisvKiBQLlMuIGtlZXAgdGhlc2UgaW4gdGhlIHNhbWUgb3JkZXIgYXMgaW4gL3Vzci9tc3RzYXZlLmggYG1zdHNhdmUnCisgICBzdHJ1Y3R1cmUsIGZvciBlYXNpZXIgcHJvY2Vzc2luZyAqLworCisjZGVmaW5lIFBDX1JFR05VTSA2NAkJLyogUHJvZ3JhbSBjb3VudGVyIChpbnN0cnVjdGlvbiBhZGRyZXNzICVpYXIpKi8KKyNkZWZpbmUgUFNfUkVHTlVNIDY1CQkvKiBQcm9jZXNzb3IgKG9yIG1hY2hpbmUpIHN0YXR1cyAoJW1zcikgKi8KKyNkZWZpbmUJQ1JfUkVHTlVNIDY2CQkvKiBDb25kaXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUJTFJfUkVHTlVNIDY3CQkvKiBMaW5rIHJlZ2lzdGVyICovCisjZGVmaW5lCUNUUl9SRUdOVU0gNjgJCS8qIENvdW50IHJlZ2lzdGVyICovCisjZGVmaW5lCVhFUl9SRUdOVU0gNjkJCS8qIEZpeGVkIHBvaW50IGV4Y2VwdGlvbiByZWdpc3RlcnMgKi8KKyNkZWZpbmUJTVFfUkVHTlVNIDcwCQkvKiBNdWx0aXBseS9xdW90aWVudCByZWdpc3RlciAqLworCisvKiBUaGVzZSAjZGVmaW5lcyBhcmUgdXNlZCB0byBwYXJzZSBjb3JlIGZpbGVzIGFuZCB0YWxrIHRvIHB0cmFjZSwgc28gdGhleQorICAgbXVzdCByZW1haW4gZml4ZWQuICAqLworI2RlZmluZQlGSVJTVF9VSVNBX1NQX1JFR05VTSA2NAkvKiBmaXJzdCBzcGVjaWFsIHJlZ2lzdGVyIG51bWJlciAqLworI2RlZmluZSBMQVNUX1VJU0FfU1BfUkVHTlVNICA3MAkvKiBsYXN0IHNwZWNpYWwgcmVnaXN0ZXIgbnVtYmVyICovCisKKy8qIFRoaXMgaXMgdGhlIG9mZnNldCBpbiBSRUdfTkFNRVMgYXQgd2hpY2ggdGhlIGBzZXQgcHJvY2Vzc29yJworICAgY29tbWFuZCBzdGFydHMgcGx1Z2dpbmcgaW4gaXRzIG5hbWVzLiAgKi8KKyNkZWZpbmUgRklSU1RfVkFSSUFOVF9SRUdJU1RFUiA2NgorCisvKiBUb3RhbCBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIHRvIHN0b3JlIG91ciBjb3BpZXMgb2YgdGhlIG1hY2hpbmUncworICAgcmVnaXN0ZXIgc3RhdGUsIHRoZSBhcnJheSBgcmVnaXN0ZXJzJy4KKwkgICAgIDMyIDQtYnl0ZSBncHIncworCSAgICAgMzIgOC1ieXRlIGZwcidzCisJICAgICA3ICA0LWJ5dGUgVUlTQSBzcGVjaWFsIHB1cnBvc2UgcmVnaXN0ZXJzLCAKKwkgICAgIDE2IDQtYnl0ZSBzZWdtZW50IHJlZ2lzdGVycywKKwkgICAgIDMyIDQtYnl0ZSBzdGFuZGFyZCBPRUEgc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVycywKKyAgIGFuZCB1cCB0byA2NCA0LWJ5dGUgbm9uLXN0YW5kYXJkIE9FQSBzcGVjaWFsIHB1cnBvc2UgcmVncy4KKyAgIHRvdGFsOiAoKyAoKiAzMiA0KSAoKiAzMiA4KSAoKiA3IDQpICgqIDE2IDQpICgqIDMyIDQpICgqIDY0IDQpKSA4NjAgYnl0ZXMKKyAgIEtlZXAgc29tZSBleHRyYSBzcGFjZSBmb3Igbm93LCBpbiBjYXNlIHRvIGFkZCBtb3JlLiAqLworI2RlZmluZSBSRUdJU1RFUl9CWVRFUyA4ODAKKworCisvKiBJbmRleCB3aXRoaW4gYHJlZ2lzdGVycycgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNwYWNlIGZvcgorICAgcmVnaXN0ZXIgTi4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfQllURShOKSAgXAorICgJCQkJCQkJCVwKKyAgKChOKSA+IEZQTEFTVF9SRUdOVU0pID8gKCgoKE4pIC0gRlBMQVNUX1JFR05VTSAtMSkgKiA0KSArIDM4NClcCisgIDooKE4pID49IEZQMF9SRUdOVU0pID8gKCgoKE4pIC0gRlAwX1JFR05VTSkgKiA4KSArIDEyOCkJXAorICA6KChOKSAqIDQpICkKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIGFjdHVhbCBtYWNoaW5lIHJlcHJlc2VudGF0aW9uCisgICBmb3IgcmVnaXN0ZXIgTi4gKi8KKy8qIE5vdGUgdGhhdCB0aGUgdW5zaWduZWQgY2FzdCBoZXJlIGZvcmNlcyB0aGUgcmVzdWx0IG9mIHRoZQorICAgc3VidHJhY3Rpb24gdG8gdmVyeSBoaWdoIHBvc2l0aXZlIHZhbHVlcyBpZiBOIDwgRlAwX1JFR05VTSAqLworCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pICgoKHVuc2lnbmVkKShOKSAtIEZQMF9SRUdOVU0pIDwgMzIgPyA4IDogNCkKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIHByb2dyYW0ncyByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICBPbiB0aGUgUlM2MDAwLCBhbGwgcmVncyBhcmUgNCBieXRlcworICAgZXhjZXB0IHRoZSBmbG9hdGluZyBwb2ludCByZWdzIHdoaWNoIGFyZSA4LWJ5dGUgZG91Ymxlcy4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9TSVpFKE4pICgoKHVuc2lnbmVkKShOKSAtIEZQMF9SRUdOVU0pIDwgMzIgPyA4IDogNCkKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9SQVdfU0laRSBjYW4gaGF2ZS4gICovCisKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1JBV19TSVpFIDgKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUgOAorCisvKiBjb252ZXJ0IGEgZGJ4IHN0YWIgcmVnaXN0ZXIgbnVtYmVyIChmcm9tIGByJyBkZWNsYXJhdGlvbikgdG8gYSBnZGIgUkVHTlVNICovCisKKyNkZWZpbmUgU1RBQl9SRUdfVE9fUkVHTlVNKHZhbHVlKQkodmFsdWUpCisKKy8qIE5vbnplcm8gaWYgcmVnaXN0ZXIgTiByZXF1aXJlcyBjb252ZXJzaW9uCisgICBmcm9tIHJhdyBmb3JtYXQgdG8gdmlydHVhbCBmb3JtYXQuCisgICBUaGUgcmVnaXN0ZXIgZm9ybWF0IGZvciByczYwMDAgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGlzIGFsd2F5cworICAgZG91YmxlLCB3ZSBuZWVkIGEgY29udmVyc2lvbiBpZiB0aGUgbWVtb3J5IGZvcm1hdCBpcyBmbG9hdC4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfQ09OVkVSVElCTEUoTikgKChOKSA+PSBGUDBfUkVHTlVNICYmIChOKSA8PSBGUExBU1RfUkVHTlVNKQorCisvKiBDb252ZXJ0IGRhdGEgZnJvbSByYXcgZm9ybWF0IGZvciByZWdpc3RlciBSRUdOVU0gaW4gYnVmZmVyIEZST00KKyAgIHRvIHZpcnR1YWwgZm9ybWF0IHdpdGggdHlwZSBUWVBFIGluIGJ1ZmZlciBUTy4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMKFJFR05VTSxUWVBFLEZST00sVE8pIFwKK3sgXAorICBpZiAoVFlQRV9MRU5HVEggKFRZUEUpICE9IFJFR0lTVEVSX1JBV19TSVpFIChSRUdOVU0pKSBcCisgICAgeyBcCisgICAgICBkb3VibGUgdmFsID0gZXh0cmFjdF9mbG9hdGluZyAoKEZST00pLCBSRUdJU1RFUl9SQVdfU0laRSAoUkVHTlVNKSk7IFwKKyAgICAgIHN0b3JlX2Zsb2F0aW5nICgoVE8pLCBUWVBFX0xFTkdUSCAoVFlQRSksIHZhbCk7IFwKKyAgICB9IFwKKyAgZWxzZSBcCisgICAgbWVtY3B5ICgoVE8pLCAoRlJPTSksIFJFR0lTVEVSX1JBV19TSVpFIChSRUdOVU0pKTsgXAorfQorCisvKiBDb252ZXJ0IGRhdGEgZnJvbSB2aXJ0dWFsIGZvcm1hdCB3aXRoIHR5cGUgVFlQRSBpbiBidWZmZXIgRlJPTQorICAgdG8gcmF3IGZvcm1hdCBmb3IgcmVnaXN0ZXIgUkVHTlVNIGluIGJ1ZmZlciBUTy4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfQ09OVkVSVF9UT19SQVcoVFlQRSxSRUdOVU0sRlJPTSxUTykJXAoreyBcCisgIGlmIChUWVBFX0xFTkdUSCAoVFlQRSkgIT0gUkVHSVNURVJfUkFXX1NJWkUgKFJFR05VTSkpIFwKKyAgICB7IFwKKyAgICAgIGRvdWJsZSB2YWwgPSBleHRyYWN0X2Zsb2F0aW5nICgoRlJPTSksIFRZUEVfTEVOR1RIIChUWVBFKSk7IFwKKyAgICAgIHN0b3JlX2Zsb2F0aW5nICgoVE8pLCBSRUdJU1RFUl9SQVdfU0laRSAoUkVHTlVNKSwgdmFsKTsgXAorICAgIH0gXAorICBlbHNlIFwKKyAgICBtZW1jcHkgKChUTyksIChGUk9NKSwgUkVHSVNURVJfUkFXX1NJWkUgKFJFR05VTSkpOyBcCit9CisKKy8qIFJldHVybiB0aGUgR0RCIHR5cGUgb2JqZWN0IGZvciB0aGUgInN0YW5kYXJkIiBkYXRhIHR5cGUKKyAgIG9mIGRhdGEgaW4gcmVnaXN0ZXIgTi4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9UWVBFKE4pIFwKKyAoKCh1bnNpZ25lZCkoTikgLSBGUDBfUkVHTlVNKSA8IDMyID8gYnVpbHRpbl90eXBlX2RvdWJsZSA6IGJ1aWx0aW5fdHlwZV9pbnQpCisKKy8qIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBwbGFjZSBpbiB3aGljaCB0byBjb3B5IHRoZSBzdHJ1Y3R1cmUgdGhlCisgICBzdWJyb3V0aW5lIHdpbGwgcmV0dXJuLiAgVGhpcyBpcyBjYWxsZWQgZnJvbSBjYWxsX2Z1bmN0aW9uLiAqLworLyogaW4gUlM2MDAwLCBzdHJ1Y3QgcmV0dXJuIGFkZHJlc3NlcyBhcmUgcGFzc2VkIGFzIGFuIGV4dHJhIHBhcmFtZXRlciBpbiByMy4KKyAgIEluIGZ1bmN0aW9uIHJldHVybiwgY2FsbGVlIGlzIG5vdCByZXNwb25zaWJsZSBvZiByZXR1cm5pbmcgdGhpcyBhZGRyZXNzIGJhY2suCisgICBTaW5jZSBnZGIgbmVlZHMgdG8gZmluZCBpdCwgd2Ugd2lsbCBzdG9yZSBpbiBhIGRlc2lnbmF0ZWQgdmFyaWFibGUKKyAgIGByczYwMDBfc3RydWN0X3JldHVybl9hZGRyZXNzJy4gKi8KKworZXh0ZXJuIENPUkVfQUREUiByczYwMDBfc3RydWN0X3JldHVybl9hZGRyZXNzOworCisjZGVmaW5lIFNUT1JFX1NUUlVDVF9SRVRVUk4oQUREUiwgU1ApCVwKKyAgeyB3cml0ZV9yZWdpc3RlciAoMywgKEFERFIpKTsJCVwKKyAgICByczYwMDBfc3RydWN0X3JldHVybl9hZGRyZXNzID0gKEFERFIpOyB9CisKKy8qIEV4dHJhY3QgZnJvbSBhbiBhcnJheSBSRUdCVUYgY29udGFpbmluZyB0aGUgKHJhdykgcmVnaXN0ZXIgc3RhdGUKKyAgIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIG9mIHR5cGUgVFlQRSwgYW5kIGNvcHkgdGhhdCwgaW4gdmlydHVhbCBmb3JtYXQsCisgICBpbnRvIFZBTEJVRi4gICovCisKKy8qICNkZWZpbmUgRVhUUkFDVF9SRVRVUk5fVkFMVUUoVFlQRSxSRUdCVUYsVkFMQlVGKSBcCisgIG1lbWNweSAoVkFMQlVGLCBSRUdCVUYsIFRZUEVfTEVOR1RIIChUWVBFKSkgKi8KKworI2RlZmluZSBFWFRSQUNUX1JFVFVSTl9WQUxVRShUWVBFLFJFR0JVRixWQUxCVUYpIFwKKyAgZXh0cmFjdF9yZXR1cm5fdmFsdWUoVFlQRSxSRUdCVUYsVkFMQlVGKQorZXh0ZXJuIHZvaWQgZXh0cmFjdF9yZXR1cm5fdmFsdWUgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciBbXSwgY2hhciAqKSk7CisKKy8qIFdyaXRlIGludG8gYXBwcm9wcmlhdGUgcmVnaXN0ZXJzIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlCisgICBvZiB0eXBlIFRZUEUsIGdpdmVuIGluIHZpcnR1YWwgZm9ybWF0LiAgKi8KKworI2RlZmluZSBTVE9SRV9SRVRVUk5fVkFMVUUoVFlQRSxWQUxCVUYpIFwKKyAgewkJCQkJCQkJCVwKKyAgICBpZiAoVFlQRV9DT0RFIChUWVBFKSA9PSBUWVBFX0NPREVfRkxUKQkJCQlcCisJCQkJCQkJCQlcCisgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlcyBhcmUgcmV0dXJuZWQgc3RhcnRpbmcgZnJvbSBGUFIxIGFuZCB1cC4JXAorCVNheSBhIGRvdWJsZV9kb3VibGVfZG91YmxlIHR5cGUgY291bGQgYmUgcmV0dXJuZWQgaW4JCVwKKwlGUFIxL0ZQUjIvRlBSMyB0cmlwbGUuICovCQkJCQlcCisJCQkJCQkJCQlcCisgICAgICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSsxKSwgKFZBTEJVRiksCVwKKwkJCQkJCVRZUEVfTEVOR1RIIChUWVBFKSk7CVwKKyAgICBlbHNlCQkJCQkJCQlcCisgICAgICAvKiBFdmVyeXRoaW5nIGVsc2UgaXMgcmV0dXJuZWQgaW4gR1BSMyBhbmQgdXAuICovCQkJXAorICAgICAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKFJFR0lTVEVSX0JZVEUgKEdQMF9SRUdOVU0rMyksIChWQUxCVUYpLAlcCisJCQkJCQlUWVBFX0xFTkdUSCAoVFlQRSkpOwlcCisgIH0KKworCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICB0aGUgYWRkcmVzcyBpbiB3aGljaCBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gaXRzIHN0cnVjdHVyZSB2YWx1ZSwKKyAgIGFzIGEgQ09SRV9BRERSIChvciBhbiBleHByZXNzaW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgb25lKS4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyhSRUdCVUYpCXJzNjAwMF9zdHJ1Y3RfcmV0dXJuX2FkZHJlc3MKKwwKKy8qIERlc2NyaWJlIHRoZSBwb2ludGVyIGluIGVhY2ggc3RhY2sgZnJhbWUgdG8gdGhlIHByZXZpb3VzIHN0YWNrIGZyYW1lCisgICAoaXRzIGNhbGxlcikuICAqLworCisvKiBGUkFNRV9DSEFJTiB0YWtlcyBhIGZyYW1lJ3Mgbm9taW5hbCBhZGRyZXNzCisgICBhbmQgcHJvZHVjZXMgdGhlIGZyYW1lJ3MgY2hhaW4tcG9pbnRlci4gKi8KKworLyogSW4gdGhlIGNhc2Ugb2YgdGhlIFJTNjAwMCwgdGhlIGZyYW1lJ3Mgbm9taW5hbCBhZGRyZXNzCisgICBpcyB0aGUgYWRkcmVzcyBvZiBhIDQtYnl0ZSB3b3JkIGNvbnRhaW5pbmcgdGhlIGNhbGxpbmcgZnJhbWUncyBhZGRyZXNzLiAgKi8KKworI2RlZmluZSBGUkFNRV9DSEFJTih0aGlzZnJhbWUpIHJzNjAwMF9mcmFtZV9jaGFpbiAodGhpc2ZyYW1lKQorQ09SRV9BRERSIHJzNjAwMF9mcmFtZV9jaGFpbiBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisKKy8qIERlZmluZSBvdGhlciBhc3BlY3RzIG9mIHRoZSBzdGFjayBmcmFtZS4gICovCisKKy8qIEEgbWFjcm8gdGhhdCB0ZWxscyB1cyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpbnZvY2F0aW9uIHJlcHJlc2VudGVkCisgICBieSBGSSBkb2VzIG5vdCBoYXZlIGEgZnJhbWUgb24gdGhlIHN0YWNrIGFzc29jaWF0ZWQgd2l0aCBpdC4gIElmIGl0CisgICBkb2VzIG5vdCwgRlJBTUVMRVNTIGlzIHNldCB0byAxLCBlbHNlIDAuICAqLworCisjZGVmaW5lIEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OKEZJLCBGUkFNRUxFU1MpIFwKKyAgRlJBTUVMRVNTID0gZnJhbWVsZXNzX2Z1bmN0aW9uX2ludm9jYXRpb24gKEZJKQorCitleHRlcm4gaW50IGZyYW1lbGVzc19mdW5jdGlvbl9pbnZvY2F0aW9uIFBBUkFNUygoc3RydWN0IGZyYW1lX2luZm8gKikpOworCisjZGVmaW5lIElOSVRfRlJBTUVfUENfRklSU1QoZnJvbWxlYWYsIHByZXYpIFwKKyAgcHJldi0+cGMgPSAoZnJvbWxlYWYgPyBTQVZFRF9QQ19BRlRFUl9DQUxMIChwcmV2LT5uZXh0KSA6IFwKKwkgICAgICBwcmV2LT5uZXh0ID8gRlJBTUVfU0FWRURfUEMgKHByZXYtPm5leHQpIDogcmVhZF9wYyAoKSk7CisjZGVmaW5lIElOSVRfRlJBTUVfUEMoZnJvbWxlYWYsIHByZXYpIC8qIG5vdGhpbmcgKi8KK2V4dGVybiB2b2lkIHJzNjAwMF9pbml0X2V4dHJhX2ZyYW1lX2luZm8gKGludCBmcm9tbGVhZiwgc3RydWN0IGZyYW1lX2luZm8gKik7CisjZGVmaW5lCUlOSVRfRVhUUkFfRlJBTUVfSU5GTyhmcm9tbGVhZiwgZmkpIHJzNjAwMF9pbml0X2V4dHJhX2ZyYW1lX2luZm8gKGZyb21sZWFmLCBmaSkKKworLyogSWYgdGhlIGtlcm5lbCBoYXMgdG8gZGVsaXZlciBhIHNpZ25hbCwgaXQgcHVzaGVzIGEgc2lnY29udGV4dAorICAgc3RydWN0dXJlIG9uIHRoZSBzdGFjayBhbmQgdGhlbiBjYWxscyB0aGUgc2lnbmFsIGhhbmRsZXIsIHBhc3NpbmcKKyAgIHRoZSBhZGRyZXNzIG9mIHRoZSBzaWdjb250ZXh0IGluIGFuIGFyZ3VtZW50IHJlZ2lzdGVyLiBVc3VhbGx5CisgICB0aGUgc2lnbmFsIGhhbmRsZXIgZG9lc24ndCBzYXZlIHRoaXMgcmVnaXN0ZXIsIHNvIHdlIGhhdmUgdG8KKyAgIGFjY2VzcyB0aGUgc2lnY29udGV4dCBzdHJ1Y3R1cmUgdmlhIGFuIG9mZnNldCBmcm9tIHRoZSBzaWduYWwgaGFuZGxlcgorICAgZnJhbWUuCisgICBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyB3ZXJlIGRldGVybWluZWQgYnkgZXhwZXJpbWVudGF0aW9uIG9uIEFJWCAzLjIuICAqLworI2RlZmluZSBTSUdfRlJBTUVfUENfT0ZGU0VUIDk2CisjZGVmaW5lIFNJR19GUkFNRV9MUl9PRkZTRVQgMTA4CisjZGVmaW5lIFNJR19GUkFNRV9GUF9PRkZTRVQgMjg0CisKKy8qIERlZmF1bHQgb2Zmc2V0IGZyb20gU1Agd2hlcmUgdGhlIExSIGlzIHN0b3JlZCAqLworI2RlZmluZQlERUZBVUxUX0xSX1NBVkUgOAorCisvKiBSZXR1cm4gc2F2ZWQgUEMgZnJvbSBhIGZyYW1lICovCisjZGVmaW5lIEZSQU1FX1NBVkVEX1BDKEZSQU1FKSAgZnJhbWVfc2F2ZWRfcGMgKEZSQU1FKQorCitleHRlcm4gdW5zaWduZWQgbG9uZyBmcmFtZV9zYXZlZF9wYyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisKK2V4dGVybiBDT1JFX0FERFIgcnM2MDAwX2ZyYW1lX2FyZ3NfYWRkcmVzcyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisjZGVmaW5lIEZSQU1FX0FSR1NfQUREUkVTUyhGSSkgcnM2MDAwX2ZyYW1lX2FyZ3NfYWRkcmVzcyAoRkkpCisKKyNkZWZpbmUgRlJBTUVfTE9DQUxTX0FERFJFU1MoRkkpCUZSQU1FX0FSR1NfQUREUkVTUyhGSSkKKworCisvKiBTZXQgVkFMIHRvIHRoZSBudW1iZXIgb2YgYXJncyBwYXNzZWQgdG8gZnJhbWUgZGVzY3JpYmVkIGJ5IEZJLgorICAgQ2FuIHNldCBWQUwgdG8gLTEsIG1lYW5pbmcgbm8gd2F5IHRvIHRlbGwuICAqLworCisvKiBXZSBjYW4ndCB0ZWxsIGhvdyBtYW55IGFyZ3MgdGhlcmUgYXJlCisgICBub3cgdGhhdCB0aGUgQyBjb21waWxlciBkZWxheXMgcG9wcGluZyB0aGVtLiAgKi8KKworI2RlZmluZSBGUkFNRV9OVU1fQVJHUyh2YWwsZmkpICh2YWwgPSAtMSkKKworLyogUmV0dXJuIG51bWJlciBvZiBieXRlcyBhdCBzdGFydCBvZiBhcmdsaXN0IHRoYXQgYXJlIG5vdCByZWFsbHkgYXJncy4gICovCisKKyNkZWZpbmUgRlJBTUVfQVJHU19TS0lQIDgJLyogTm90IHN1cmUgb24gdGhpcy4gRklYTUVtZ28gKi8KKworLyogUHV0IGhlcmUgdGhlIGNvZGUgdG8gc3RvcmUsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywKKyAgIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4KKyAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbAorICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDoKKyAgIHRoZSBhZGRyZXNzIHdlIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4gICovCisvKiBJbiB0aGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9uIGZvciBSUzYwMDAsIHdlIGRpZCAqbm90KiBzYXZlIHNwLiBJIGFtCisgICBub3Qgc3VyZSBpZiBpdCB3aWxsIGJlIG5lZWRlZC4gVGhlIGZvbGxvd2luZyBtYWNybyB0YWtlcyBjYXJlIG9mIGdwcidzCisgICBhbmQgZnByJ3Mgb25seS4gKi8KKworZXh0ZXJuIHZvaWQgcnM2MDAwX2ZyYW1lX2luaXRfc2F2ZWRfcmVncyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisjZGVmaW5lIEZSQU1FX0lOSVRfU0FWRURfUkVHUyhGSSkgcnM2MDAwX2ZyYW1lX2luaXRfc2F2ZWRfcmVncyAoRkkpCisKKy8qIFRoaW5ncyBuZWVkZWQgZm9yIG1ha2luZyB0aGUgaW5mZXJpb3IgY2FsbCBmdW5jdGlvbnMuICAqLworCisvKiBQdXNoIGFuIGVtcHR5IHN0YWNrIGZyYW1lLCB0byByZWNvcmQgdGhlIGN1cnJlbnQgUEMsIGV0Yy4gICovCisvKiBDaGFuZ2UgdGhlc2UgbmFtZXMgaW50byByczZrX3twdXNoLCBwb3B9X2ZyYW1lKCkuIEZJWE1FbWdvLiAqLworCisjZGVmaW5lIFBVU0hfRFVNTVlfRlJBTUUJcHVzaF9kdW1teV9mcmFtZSAoKQorZXh0ZXJuIHZvaWQgcHVzaF9kdW1teV9mcmFtZSBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIERpc2NhcmQgZnJvbSB0aGUgc3RhY2sgdGhlIGlubmVybW9zdCBmcmFtZSwgCisgICByZXN0b3JpbmcgYWxsIHNhdmVkIHJlZ2lzdGVycy4gICovCisKKyNkZWZpbmUgUE9QX0ZSQU1FCXBvcF9mcmFtZSAoKQorZXh0ZXJuIHZvaWQgcG9wX2ZyYW1lIFBBUkFNUyAoKHZvaWQpKTsKKworLyogVGhpcyBzZXF1ZW5jZSBvZiB3b3JkcyBpcyB0aGUgaW5zdHJ1Y3Rpb25zOgorCisJbWZscglyMAkJLy8gMHg3YzA4MDJhNgorCQkJCS8vIHNhdmUgZnByJ3MKKwlzdGZkCXI/LCBudW0ocjEpCS8vIDB4ZDgwMTAwMDAgdGhlcmUgc2hvdWxkIGJlIDMyIG9mIHRoaXM/PworCQkJCS8vIHNhdmUgZ3ByJ3MKKwlzdG0JcjAsIG51bShyMSkJLy8gMHhiYzAxMDAwMAorCXN0dQlyMSwgbnVtKHIxKQkvLyAweDk0MjEwMDAwCisKKwkvLyB0aGUgZnVuY3Rpb24gd2Ugd2FudCB0byBicmFuY2ggbWlnaHQgYmUgaW4gYSBkaWZmZXJlbnQgbG9hZCAKKwkvLyBzZWdtZW50LiByZXNldCB0aGUgdG9jIHJlZ2lzdGVyLiBOb3RlIHRoYXQgdGhlIGFjdHVhbCB0b2MgYWRkcmVzcworCS8vIHdpbGwgYmUgZml4IGJ5IGZpeF9jYWxsX2R1bW15ICgpIGFsb25nIHdpdGggZnVuY3Rpb24gYWRkcmVzcy4KKworCXN0CXIyLCAweDE0KHIxKQkvLyAweDkwNDEwMDE0IHNhdmUgdG9jIHJlZ2lzdGVyCisJbGl1CXIyLCAweDEyMzQJLy8gMHgzYzQwMTIzNCByZXNldCBhIG5ldyB0b2MgdmFsdWUgMHgxMjM0NTY3OAorCW9yaWwJcjIsIHIyLDB4NTY3OCAgIC8vIDB4NjA0MjU2NzgJCisKKwkJCQkvLyBsb2FkIGFic29sdXRlIGFkZHJlc3MgMHgxMjM0NTY3OCB0byByMAorCWxpdQlyMCwgMHgxMjM0CS8vIDB4M2MwMDEyMzQKKwlvcmlsCXIwLCByMCwweDU2NzgJLy8gMHg2MDAwNTY3OAorCW10Y3RyCXIwCQkvLyAweDdjMDkwM2E2IGN0ciA8LSByMAorCWJjdHJsCQkJLy8gMHg0ZTgwMDQyMSBqdW1wIHN1YnJvdXRpbmUgMHgxMjM0NTY3OCAoJWN0cikKKwljcm9yCTB4ZiwgMHhmLCAweGYJLy8gMHg0ZGVmN2I4MgorCWJycHQJCQkvLyAweDdkODIxMDA4LCBicmVha3BvaW50CisJY3JvcgkweGYsIDB4ZiwgMHhmCS8vIDB4NGRlZjdiODIgKGZvciA4IGJ5dGUgYWxpZ25tZW50KQorCisKKyAgV2UgYWN0dWFsbHkgc3RhcnQgZXhlY3V0aW5nIGJ5IHNhdmluZyB0aGUgdG9jIHJlZ2lzdGVyIGZpcnN0LCBzaW5jZSB0aGUgcHVzaGluZyAKKyAgb2YgdGhlIHJlZ2lzdGVycyBpcyBkb25lIGJ5IFBVU0hfRFVNTVlfRlJBTUUuICBJZiB0aGlzIHdlcmUgcmVhbCBjb2RlLAorICB0aGUgYXJndW1lbnRzIGZvciB0aGUgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSBgYmN0cmwnIHdvdWxkIGJlIHB1c2hlZAorICBiZXR3ZWVuIHRoZSBgc3R1JyBhbmQgdGhlIGBiY3RybCcsIGFuZCB3ZSBjb3VsZCBhbGxvdyBpdCB0byBleGVjdXRlIHRocm91Z2guCisgIEJ1dCB0aGUgYXJndW1lbnRzIGhhdmUgdG8gYmUgcHVzaGVkIGJ5IEdEQiBhZnRlciB0aGUgUFVTSF9EVU1NWV9GUkFNRSBpcyBkb25lLAorICBhbmQgd2UgY2Fubm90IGFsbG93IHRvIHB1c2ggdGhlIHJlZ2lzdGVycyBhZ2Fpbi4KKyovCisJCisjZGVmaW5lIENBTExfRFVNTVkgezB4N2MwODAyYTYsIDB4ZDgwMTAwMDAsIDB4YmMwMTAwMDAsIDB4OTQyMTAwMDAsIFwKKwkJICAgIDB4OTA0MTAwMTQsIDB4M2M0MDEyMzQsIDB4NjA0MjU2NzgsCQkgICAgXAorCQkgICAgMHgzYzAwMTIzNCwgMHg2MDAwNTY3OCwgMHg3YzA5MDNhNiwgMHg0ZTgwMDQyMSwgXAorCQkgICAgMHg0ZGVmN2I4MiwgMHg3ZDgyMTAwOCwgMHg0ZGVmN2I4MiB9CisKKworLyoga2VlcCB0aGlzIGFzIG11bHRpcGxlIG9mIDggKCVzcCByZXF1aXJlcyA4IGJ5dGUgYWxpZ25tZW50KSAqLworI2RlZmluZSBDQUxMX0RVTU1ZX0xFTkdUSCA1NgorCisjZGVmaW5lIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUIDE2CisKKy8qIEluc2VydCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBhcmdzIGFuZCBmdW5jdGlvbiBhZGRyZXNzIGludG8gYQorICAgY2FsbCBzZXF1ZW5jZSBvZiB0aGUgYWJvdmUgZm9ybSBzdG9yZWQgYXQgRFVNTVlOQU1FLiAgKi8KKworI2RlZmluZSBGSVhfQ0FMTF9EVU1NWShkdW1teW5hbWUsIHBjLCBmdW4sIG5hcmdzLCBhcmdzLCB0eXBlLCBnY2NfcCkgXAorICByczYwMDBfZml4X2NhbGxfZHVtbXkgKGR1bW15bmFtZSwgcGMsIGZ1biwgbmFyZ3MsIGFyZ3MsIHR5cGUsIGdjY19wKQorZXh0ZXJuIHZvaWQgcnM2MDAwX2ZpeF9jYWxsX2R1bW15IFBBUkFNUyAoKGNoYXIgKiwgQ09SRV9BRERSLCBDT1JFX0FERFIsCisJCQkJCSAgIGludCwgc3RydWN0IHZhbHVlICoqLAorCQkJCQkgICBzdHJ1Y3QgdHlwZSAqLCBpbnQpKTsKKworLyogSG9vayBpbiByczYwMDAtdGRlcC5jIGZvciBkZXRlcm1pbmluZyB0aGUgVE9DIGFkZHJlc3Mgd2hlbgorICAgY2FsbGluZyBmdW5jdGlvbnMgaW4gdGhlIGluZmVyaW9yLiAgKi8KK2V4dGVybiBDT1JFX0FERFIgKCpmaW5kX3RvY19hZGRyZXNzX2hvb2spIFBBUkFNUyAoKENPUkVfQUREUikpOworCisvKiB4Y29mZnJlYWQuYyBwcm92aWRlcyBhIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgVE9DIG9mZnNldAorICAgZm9yIGEgZ2l2ZW4gb2JqZWN0IGZpbGUuCisgICBJdCBpcyB1c2VkIHVuZGVyIG5hdGl2ZSBBSVggY29uZmlndXJhdGlvbnMgZm9yIGRldGVybWluaW5nIHRoZQorICAgVE9DIGFkZHJlc3Mgd2hlbiBjYWxsaW5nIGZ1bmN0aW9ucyBpbiB0aGUgaW5mZXJpb3IuICAqLworI2lmZGVmIF9fU1REQ19fCitzdHJ1Y3Qgb2JqZmlsZTsKKyNlbmRpZgorZXh0ZXJuIENPUkVfQUREUiBnZXRfdG9jX29mZnNldCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKKy8qIFVzdWFsbHkgYSBmdW5jdGlvbiBwb2ludGVyJ3MgcmVwcmVzZW50YXRpb24gaXMgc2ltcGx5IHRoZSBhZGRyZXNzCisgICBvZiB0aGUgZnVuY3Rpb24uIE9uIHRoZSBSUy82MDAwIGhvd2V2ZXIsIGEgZnVuY3Rpb24gcG9pbnRlciBpcworICAgcmVwcmVzZW50ZWQgYnkgYSBwb2ludGVyIHRvIGEgVE9DIGVudHJ5LiBUaGlzIFRPQyBlbnRyeSBjb250YWlucworICAgdGhyZWUgd29yZHMsIHRoZSBmaXJzdCB3b3JkIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiwgdGhlCisgICBzZWNvbmQgd29yZCBpcyB0aGUgVE9DIHBvaW50ZXIgKHIyKSwgYW5kIHRoZSB0aGlyZCB3b3JkIGlzIHRoZQorICAgc3RhdGljIGNoYWluIHZhbHVlLiAgVGhyb3VnaG91dCBHREIgaXQgaXMgY3VycmVudGx5IGFzc3VtZWQgdGhhdCBhCisgICBmdW5jdGlvbiBwb2ludGVyIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiwgd2hpY2ggaXMgbm90CisgICBlYXN5IHRvIGZpeC4gIEluIGFkZGl0aW9uLCB0aGUgY29udmVyc2lvbiBvZiBhIGZ1bmN0aW9uIGFkZHJlc3MgdG8KKyAgIGEgZnVuY3Rpb24gcG9pbnRlciB3b3VsZCByZXF1aXJlIGFsbG9jYXRpb24gb2YgYSBUT0MgZW50cnkgaW4gdGhlCisgICBpbmZlcmlvcidzIG1lbW9yeSBzcGFjZSwgd2l0aCBhbGwgaXRzIGRyYXdiYWNrcy4gIFRvIGJlIGFibGUgdG8KKyAgIGNhbGwgQysrIHZpcnR1YWwgbWV0aG9kcyBpbiB0aGUgaW5mZXJpb3IgKHdoaWNoIGFyZSBjYWxsZWQgdmlhCisgICBmdW5jdGlvbiBwb2ludGVycyksIGZpbmRfZnVuY3Rpb25fYWRkciB1c2VzIHRoaXMgbWFjcm8gdG8gZ2V0IHRoZQorICAgZnVuY3Rpb24gYWRkcmVzcyBmcm9tIGEgZnVuY3Rpb24gcG9pbnRlci4gICovCisKKyNkZWZpbmUgQ09OVkVSVF9GUk9NX0ZVTkNfUFRSX0FERFIoQUREUikgXAorICAoaXNfbWFnaWNfZnVuY3Rpb25fcG9pbnRlciAoQUREUikgPyByZWFkX21lbW9yeV9pbnRlZ2VyIChBRERSLCA0KSA6IChBRERSKSkKK2V4dGVybiBpbnQgaXNfbWFnaWNfZnVuY3Rpb25fcG9pbnRlciBQQVJBTVMgKChDT1JFX0FERFIpKTsKKworLyogRmxhZyBmb3IgbWFjaGluZS1zcGVjaWZpYyBzdHVmZiBpbiBzaGFyZWQgZmlsZXMuICBGSVhNRSAqLworI2RlZmluZSBJQk02MDAwX1RBUkdFVAorCisvKiBSUzYwMDAvQUlYIGRvZXMgbm90IHN1cHBvcnQgUFRfU1RFUC4gIEhhcyB0byBiZSBzaW11bGF0ZWQuICAqLworCisjZGVmaW5lIFNPRlRXQVJFX1NJTkdMRV9TVEVQX1AgMQorZXh0ZXJuIHZvaWQgcnM2MDAwX3NvZnR3YXJlX3NpbmdsZV9zdGVwIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgaW50KSk7CisjZGVmaW5lIFNPRlRXQVJFX1NJTkdMRV9TVEVQKHNpZyxicF9wKSByczYwMDBfc29mdHdhcmVfc2luZ2xlX3N0ZXAgKHNpZywgYnBfcCkKKworLyogSWYgdGhlIGN1cnJlbnQgZ2NjIGZvciBmb3IgdGhpcyB0YXJnZXQgZG9lcyBub3QgcHJvZHVjZSBjb3JyZWN0IGRlYnVnZ2luZworICAgaW5mb3JtYXRpb24gZm9yIGZsb2F0IHBhcmFtZXRlcnMsIGJvdGggcHJvdG90eXBlZCBhbmQgdW5wcm90b3R5cGVkLCB0aGVuCisgICBkZWZpbmUgdGhpcyBtYWNyby4gIFRoaXMgZm9yY2VzIGdkYiB0byAgYWx3YXlzIGFzc3VtZSB0aGF0IGZsb2F0cyBhcmUKKyAgIHBhc3NlZCBhcyBkb3VibGVzIGFuZCB0aGVuIGNvbnZlcnRlZCBpbiB0aGUgY2FsbGVlLgorCisgICBGb3IgdGhlIFBvd2VyUEMsIGl0IGFwcGVhcnMgdGhhdCB0aGUgZGVidWcgaW5mbyBtYXJrcyB0aGUgcGFyYW1ldGVycyBhcworICAgZmxvYXRzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgZnVuY3Rpb24gaXMgcHJvdG90eXBlZCwgYnV0IHRoZSBhY3R1YWwKKyAgIHZhbHVlcyBhcmUgYWx3YXlzIHBhc3NlZCBpbiBhcyBkb3VibGVzLiAgVGh1cyBieSBzZXR0aW5nIHRoaXMgdG8gMSwgYm90aAorICAgdHlwZXMgb2YgY2FsbHMgd2lsbCB3b3JrLiAqLworCisjZGVmaW5lIENPRVJDRV9GTE9BVF9UT19ET1VCTEUgMQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9yczYwMDAvdG0tcnM2MDAwbHkuaCBiL2dkYi9jb25maWcvcnM2MDAwL3RtLXJzNjAwMGx5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk0NmIwZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcnM2MDAwL3RtLXJzNjAwMGx5LmgKQEAgLTAsMCArMSwzMiBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIFJTNjAwMCBydW5uaW5nIHVuZGVyIEx5bnhPUy4KKyAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgVE1fUlM2MDAwTFlOWF9ICisjZGVmaW5lIFRNX1JTNjAwMExZTlhfSAorCisjaW5jbHVkZSAidG0tbHlueC5oIgorCisvKiBVc2UgZ2VuZXJpYyBSUzYwMDAgZGVmaW5pdGlvbnMuICovCisjaW5jbHVkZSAicnM2MDAwL3RtLXJzNjAwMC5oIgorCisjdW5kZWYgUENfTE9BRF9TRUdNRU5UCisKKyNkZWZpbmUgQ0FOTk9UX1NUT1JFX1JFR0lTVEVSKHJlZ25vKSAocmVnbm8gPT0gUFNfUkVHTlVNKQorCisjZW5kaWYgLyogVE1fUlM2MDAwTFlOWF9IICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3JzNjAwMC94bS1haXg0LmggYi9nZGIvY29uZmlnL3JzNjAwMC94bS1haXg0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjNWNhZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcnM2MDAwL3htLWFpeDQuaApAQCAtMCwwICsxLDI2IEBACisvKiBQYXJhbWV0ZXJzIGZvciBob3N0aW5nIG9uIGFuIFJTNjAwMCwgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgSUJNIENvcnBvcmF0aW9uLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJ4bS1haXg0LmgiCisKKy8qIEFJWCA0LnggdXNlcyBub25zdGFuZGFyZCAiaW50ICoiIGFzIHR5cGUgb2YgdGhpcmQgYXJndW1lbnQgdG8gcHRyYWNlKCkgKi8KKworI2RlZmluZSBQVFJBQ0VfQVJHM19UWVBFIGludCoKKwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9yczYwMDAveG0tcnM2MDAwLmggYi9nZGIvY29uZmlnL3JzNjAwMC94bS1yczYwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGI4YjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9yczYwMDAveG0tcnM2MDAwLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIGhvc3Rpbmcgb24gYW4gUlM2MDAwLCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5ODYtODcsIDE5ODksIDE5OTEtOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBJQk0gQ29ycG9yYXRpb24uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhlIGZvbGxvd2luZyB0ZXh0IGlzIHRha2VuIGZyb20gY29uZmlnL3JzNjAwMC5taDoKKyAqICMgVGhlIElCTSB2ZXJzaW9uIG9mIC91c3IvaW5jbHVkZS9ycGMvcnBjLmggaGFzIGEgYnVnIC0tIGl0IHNheXMKKyAqICMgYGV4dGVybiBmZF9zZXQgc3ZjX2Zkc2V0Oycgd2l0aG91dCBldmVyIGRlZmluaW5nIHRoZSB0eXBlIGZkX3NldC4KKyAqICMgVW5mb3J0dW5hdGVseSB0aGlzIG9jY3VycyBpbiB0aGUgdngtc2hhcmUgY29kZSwgd2hpY2ggaXMgbm90IGNvbmZpZ3VyZWQKKyAqICMgbGlrZSB0aGUgcmVzdCBvZiBHREIgKGUuZy4gaXQgZG9lc24ndCBpbmNsdWRlICJkZWZzLmgiKS4KKyAqICMgV2UgY2lyY3VtdmVudCB0aGlzIGJ1ZyBieSAjZGVmaW5lLWluZyBmZF9zZXQgaGVyZSwgYnV0IHVuZGVmaW5pbmcgaXQgaW4KKyAqICMgdGhlIHhtLXJzNjAwMC5oIGZpbGUgYmVmb3JlIG9yZGluYXJ5IG1vZHVsZXMgdHJ5IHRvIHVzZSBpdC4gIEZJWE1FLCBJQk0hCisgKiBNSF9DRkxBR1M9Jy1EZmRfc2V0PWludCcKKyAqIFNvLCBoZXJlIHdlIGRvIHRoZSB1bmRlZmluZS4uLndoaWNoIGhhcyB0byBvY2N1ciBiZWZvcmUgd2UgaW5jbHVkZQorICogPHN5cy9zZWxlY3QuaD4gYmVsb3cuCisgKi8KKyN1bmRlZiBmZF9zZXQKKworI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKworLyogQmlnIGVuZCBpcyBhdCB0aGUgbG93IGFkZHJlc3MgKi8KKworI2RlZmluZQlIT1NUX0JZVEVfT1JERVIJQklHX0VORElBTgorCisvKiBBdCBsZWFzdCBhcyBvZiBBSVggMy4yLCB3ZSBoYXZlIHRlcm1pb3MuICAqLworI2RlZmluZQlIQVZFX1RFUk1JT1MgMQorLyogI2RlZmluZSBIQVZFX1RFUk1JTyAxICovCisKKyNkZWZpbmUJVVNHIDEKKyNkZWZpbmUJSEFWRV9TSUdTRVRNQVNLCTEKKworI2RlZmluZSBGSVZFX0FSR19QVFJBQ0UKKworLyogVGhpcyBzeXN0ZW0gcmVxdWlyZXMgdGhhdCB3ZSBvcGVuIGEgdGVybWluYWwgd2l0aCBPX05PQ1RUWSBmb3IgaXQgdG8KKyAgIG5vdCBiZWNvbWUgb3VyIGNvbnRyb2xsaW5nIHRlcm1pbmFsLiAgKi8KKworI2RlZmluZQlVU0VfT19OT0NUVFkKKworLyogQnJhaW4gZGVhdGggaW5oZXJpdGVkIGZyb20gUEMncyBwZXJ2YWRlcy4gICovCisjdW5kZWYgTlVMTAorI2RlZmluZSBOVUxMIDAKKworLyogVGhlIElCTSBjb21waWxlciByZXF1aXJlcyB0aGlzIGluIG9yZGVyIHRvIHByb3Blcmx5IGNvbXBpbGUgYWxsb2NhKCkuICAqLworI3ByYWdtYSBhbGxvY2EKKworLyogVGhlcmUgaXMgbm8gdmZvcmsuICAqLworCisjZGVmaW5lCXZmb3JrCWZvcmsKKworLyogU2V0cGdycCgpIHRha2VzIGFyZ3VtZW50cywgdW5saWtlIG9yZGluYXJ5IFN5cyBWJ3MuICAqLworCisjZGVmaW5lCVNFVFBHUlBfQVJHUyAxCisKKy8qIEFJWCBkb2Vzbid0IGhhdmUgc3RyZHVwLCBzbyB3ZSBuZWVkIHRvIGRlY2xhcmUgaXQgZm9yIGxpYmliZXJ0eSAqLworZXh0ZXJuIGNoYXIgKnN0cmR1cCBQQVJBTVMgKChjaGFyICopKTsKKworLyogU2lnbmFsIGhhbmRsZXIgZm9yIFNJR1dJTkNIIGB3aW5kb3cgc2l6ZSBjaGFuZ2VkJy4gKi8KKworI2RlZmluZQlTSUdXSU5DSF9IQU5ETEVSICBhaXhfcmVzaXpld2luZG93CitleHRlcm4gdm9pZCBhaXhfcmVzaXpld2luZG93IFBBUkFNUyAoKGludCkpOworCisvKiBUaGlzIGRvZXNuJ3Qgc2VlbSB0byBiZSBkZWNsYXJlZCBpbiBhbnkgaGVhZGVyIGZpbGUgSSBjYW4gZmluZC4gICovCitjaGFyICp0ZXJtZGVmIFBBUkFNUyAoKGludCwgaW50KSk7CisKKy8qIGBsaW5lc19wZXJfcGFnZScgYW5kIGBjaGFyc19wZXJfbGluZScgYXJlIGxvY2FsIHRvIHV0aWxzLmMuIFJlY3RpZnkgdGhpcy4gKi8KKworI2RlZmluZQlTSUdXSU5DSF9IQU5ETEVSX0JPRFkJXAorCQkJCQkJCQkJXAorLyogUmVzcG9uZCB0byBTSUdXSU5DSCBgd2luZG93IHNpemUgY2hhbmdlZCcgc2lnbmFsLCBhbmQgcmVzZXQgR0RCJ3MJXAorICAgd2luZG93IHNldHRpbmdzIGFwcHJvcHJpYXRlbHkuICovCQkJCQlcCisJCQkJCQkJCQlcCit2b2lkIAkJCQkJCVwKK2FpeF9yZXNpemV3aW5kb3cgKHNpZ25vKQkJCVwKKyAgICAgaW50IHNpZ25vOwkJCQkJXAorewkJCQkJCVwKKyAgaW50IGZkID0gZmlsZW5vIChzdGRvdXQpOwkJCVwKKyAgaWYgKGlzYXR0eSAoZmQpKSB7CQkJCVwKKyAgICBpbnQgdmFsOwkJCQkJXAorCQkJCQkJXAorICAgIHZhbCA9IGF0b2kgKHRlcm1kZWYgKGZkLCAnbCcpKTsJCVwKKyAgICBpZiAodmFsID4gMCkJCQkJXAorICAgICAgbGluZXNfcGVyX3BhZ2UgPSB2YWw7CQkJXAorICAgIHZhbCA9IGF0b2kgKHRlcm1kZWYgKGZkLCAnYycpKTsJCVwKKyAgICBpZiAodmFsID4gMCkJCQkJXAorICAgICAgY2hhcnNfcGVyX2xpbmUgPSB2YWw7CQkJXAorICB9CQkJCQkJXAorfQorCisvKiBzZXRwZ3JwKCkgbWVzc2VzIHVwIGNvbnRyb2xpbmcgdGVybWluYWwuIFRoZSBvdGhlciB2ZXJzaW9uIG9mIGl0CisgICByZXF1aXJlcyBsaWJic2QuYS4gKi8KKyNkZWZpbmUJc2V0cGdycChYWCxZWSkJCXNldHBnaWQgKFhYLCBZWSkKKwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9yczYwMDAveG0tcnM2MDAwbHkuaCBiL2dkYi9jb25maWcvcnM2MDAwL3htLXJzNjAwMGx5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1Y2ZhYgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvcnM2MDAwL3htLXJzNjAwMGx5LmgKQEAgLTAsMCArMSwyOSBAQAorLyogSG9zdC1kZXBlbmRlbnQgZGVmaW5pdGlvbnMgZm9yIFJTNjAwMCBydW5uaW5nIEx5bnhPUywgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgWE1fUlM2MDAwTFlOWF9ICisjZGVmaW5lIFhNX1JTNjAwMExZTlhfSAorCisjZGVmaW5lIEhPU1RfQllURV9PUkRFUiBCSUdfRU5ESUFOCisKKy8qIEdldCBnZW5lcmljIEx5bnhPUyBob3N0IGRlZmluaXRpb25zLiAqLworCisjaW5jbHVkZSAieG0tbHlueC5oIgorCisjZW5kaWYgLyogWE1fUlM2MDAwTFlOWF9IICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3NoL3NoLm10IGIvZ2RiL2NvbmZpZy9zaC9zaC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjYwNGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9zaC9zaC5tdApAQCAtMCwwICsxLDYgQEAKKyMgVGFyZ2V0OiBIaXRhY2hpIFN1cGVyLUggd2l0aCBJQ0UgYW5kIHNpbXVsYXRvcgorVERFUEZJTEVTPSBzaC10ZGVwLm8gbW9uaXRvci5vIHNoMy1yb20ubyByZW1vdGUtZTcwMDAubyBzZXItZTdrcGMubyBkc3JlYy5vCitUTV9GSUxFPSB0bS1zaC5oCisKK1NJTV9PQlMgPSByZW1vdGUtc2ltLm8KK1NJTSA9IC4uL3NpbS9zaC9saWJzaW0uYQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9zaC90bS1zaC5oIGIvZ2RiL2NvbmZpZy9zaC90bS1zaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNzc5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NoL3RtLXNoLmgKQEAgLTAsMCArMSwyODEgQEAKKy8qIFRhcmdldC1zcGVjaWZpYyBkZWZpbml0aW9uIGZvciBhIEhpdGFjaGkgU3VwZXItSC4KKyAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBDb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBzYWNAY3lnbnVzLmNvbSAqLworCisjaWZkZWYgX19TVERDX18KK3N0cnVjdCBmcmFtZV9pbmZvOworc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3M7CitzdHJ1Y3QgdmFsdWU7CitzdHJ1Y3QgdHlwZTsKKyNlbmRpZgorCisjZGVmaW5lIEdEQl9UQVJHRVRfSVNfU0gKKworI2RlZmluZSBJRUVFX0ZMT0FUIDEKKworLyogRGVmaW5lIHRoZSBiaXQsIGJ5dGUsIGFuZCB3b3JkIG9yZGVyaW5nIG9mIHRoZSBtYWNoaW5lLiAgKi8KKworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFCisKKworLyogT2Zmc2V0IGZyb20gYWRkcmVzcyBvZiBmdW5jdGlvbiB0byBzdGFydCBvZiBpdHMgY29kZS4KKyAgIFplcm8gb24gbW9zdCBtYWNoaW5lcy4gICovCisKKyNkZWZpbmUgRlVOQ1RJT05fU1RBUlRfT0ZGU0VUIDAKKworLyogQWR2YW5jZSBQQyBhY3Jvc3MgYW55IGZ1bmN0aW9uIGVudHJ5IHByb2xvZ3VlIGluc3RydWN0aW9ucworICAgdG8gcmVhY2ggc29tZSAicmVhbCIgY29kZS4gICovCisKK2V4dGVybiBDT1JFX0FERFIgc2hfc2tpcF9wcm9sb2d1ZSAoKTsKKyNkZWZpbmUgU0tJUF9QUk9MT0dVRShpcCkgXAorICAgIHsoaXApID0gc2hfc2tpcF9wcm9sb2d1ZShpcCk7fQorCisKKy8qIEltbWVkaWF0ZWx5IGFmdGVyIGEgZnVuY3Rpb24gY2FsbCwgcmV0dXJuIHRoZSBzYXZlZCBwYy4KKyAgIENhbid0IGFsd2F5cyBnbyB0aHJvdWdoIHRoZSBmcmFtZXMgZm9yIHRoaXMgYmVjYXVzZSBvbiBzb21lIG1hY2hpbmVzCisgICB0aGUgbmV3IGZyYW1lIGlzIG5vdCBzZXQgdXAgdW50aWwgdGhlIG5ldyBmdW5jdGlvbiBleGVjdXRlcworICAgc29tZSBpbnN0cnVjdGlvbnMuIAorCisgICBUaGUgcmV0dXJuIGFkZHJlc3MgaXMgdGhlIHZhbHVlIHNhdmVkIGluIHRoZSBQUiByZWdpc3RlciArIDQgICovCisKKyNkZWZpbmUgU0FWRURfUENfQUZURVJfQ0FMTChmcmFtZSkgKEFERFJfQklUU19SRU1PVkUocmVhZF9yZWdpc3RlcihQUl9SRUdOVU0pKSkKKworLyogU3RhY2sgZ3Jvd3MgZG93bndhcmQuICAqLworCisjZGVmaW5lIElOTkVSX1RIQU4obGhzLHJocykgKChsaHMpIDwgKHJocykpCisKKy8qIElsbGVnYWwgaW5zdHJ1Y3Rpb24gLSB1c2VkIGJ5IHRoZSBzaW11bGF0b3IgZm9yIGJyZWFrcG9pbnQKKyAgIGRldGVjdGlvbiAqLworCisjZGVmaW5lIEJSRUFLUE9JTlQgezB4YzMsIDB4YzN9ICAvKiAweGMzYzMgaXMgdHJhcGEgI2MzLCBhbmQgaXQgd29ya3MgaW4gYmlnIAorCQkJCSAgICBhbmQgbGl0dGxlIGVuZGlhbiBtb2RlcyAgKi8KKworI2RlZmluZSBCSUdfUkVNT1RFX0JSRUFLUE9JTlQgICAgeyAweGMzLCAweDIwIH0KKyNkZWZpbmUgTElUVExFX1JFTU9URV9CUkVBS1BPSU5UIHsgMHgyMCwgMHhjMyB9CisKKy8qIElmIHlvdXIga2VybmVsIHJlc2V0cyB0aGUgcGMgYWZ0ZXIgdGhlIHRyYXAgaGFwcGVucyB5b3UgbWF5IG5lZWQgdG8KKyAgIGRlZmluZSB0aGlzIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlLiAgKi8KKyNkZWZpbmUgREVDUl9QQ19BRlRFUl9CUkVBSyAwCisKKy8qIFNheSBob3cgbG9uZyByZWdpc3RlcnMgYXJlLiAgKi8KKyNkZWZpbmUgUkVHSVNURVJfVFlQRSAgbG9uZworCisvKiBTYXkgaG93IG11Y2ggbWVtb3J5IGlzIG5lZWRlZCB0byBzdG9yZSBhIGNvcHkgb2YgdGhlIHJlZ2lzdGVyIHNldCAqLworI2RlZmluZSBSRUdJU1RFUl9CWVRFUyAgICAoTlVNX1JFR1MqNCkgCisKKy8qIEluZGV4IHdpdGhpbiBgcmVnaXN0ZXJzJyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3BhY2UgZm9yCisgICByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9CWVRFKE4pICAoKE4pKjQpCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBhY3R1YWwgbWFjaGluZSByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pIDQKKworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUoTikgNAorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1JBV19TSVpFIGNhbiBoYXZlLiAgKi8KKworI2RlZmluZSBNQVhfUkVHSVNURVJfUkFXX1NJWkUgNAorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1ZJUlRVQUxfU0laRSBjYW4gaGF2ZS4gICovCisKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1ZJUlRVQUxfU0laRSA0CisKKy8qIFJldHVybiB0aGUgR0RCIHR5cGUgb2JqZWN0IGZvciB0aGUgInN0YW5kYXJkIiBkYXRhIHR5cGUKKyAgIG9mIGRhdGEgaW4gcmVnaXN0ZXIgTi4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9UWVBFKE4pIFwKKwkoKCgoTikgPj0gRlAwX1JFR05VTSAmJiAoTikgPD0gRlAxNV9SRUdOVU0pCVwKKwkgIHx8IChOKSA9PSBGUFVMX1JFR05VTSkJCQlcCisJID8gYnVpbHRpbl90eXBlX2Zsb2F0IDogYnVpbHRpbl90eXBlX2ludCkKKworLyogSW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIG5hbWVzIG9mIHJlZ2lzdGVycy4KKyAgIEVudHJpZXMgYmV5b25kIHRoZSBmaXJzdCBOVU1fUkVHUyBhcmUgaWdub3JlZC4gICovCisKK2V4dGVybiBjaGFyICoqc2hfcmVnaXN0ZXJfbmFtZXM7CisjZGVmaW5lIFJFR0lTVEVSX05BTUUoaSkgc2hfcmVnaXN0ZXJfbmFtZXNbaV0KKworI2RlZmluZSBOVU1fUkVHUyA1OQorCisvKiBSZWdpc3RlciBudW1iZXJzIG9mIHZhcmlvdXMgaW1wb3J0YW50IHJlZ2lzdGVycy4gIE5vdGUgdGhhdCBzb21lIG9mCisgICB0aGVzZSB2YWx1ZXMgYXJlICJyZWFsIiByZWdpc3RlciBudW1iZXJzLCBhbmQgY29ycmVzcG9uZCB0byB0aGUKKyAgIGdlbmVyYWwgcmVnaXN0ZXJzIG9mIHRoZSBtYWNoaW5lLCBhbmQgc29tZSBhcmUgInBob255IiByZWdpc3RlcgorICAgbnVtYmVycyB3aGljaCBhcmUgdG9vIGxhcmdlIHRvIGJlIGFjdHVhbCByZWdpc3RlciBudW1iZXJzIGFzIGZhciBhcworICAgdGhlIHVzZXIgaXMgY29uY2VybmVkIGJ1dCBkbyBzZXJ2ZSB0byBnZXQgdGhlIGRlc2lyZWQgdmFsdWVzIHdoZW4KKyAgIHBhc3NlZCB0byByZWFkX3JlZ2lzdGVyLiAgKi8KKworI2RlZmluZSBSMF9SRUdOVU0JMAorI2RlZmluZSBTVFJVQ1RfUkVUVVJOX1JFR05VTSAyCisjZGVmaW5lIEFSRzBfUkVHTlVNICAgICA0CisjZGVmaW5lIEFSR0xBU1RfUkVHTlVNICA3CisjZGVmaW5lIEZQX1JFR05VTSAJMTQKKyNkZWZpbmUgU1BfUkVHTlVNIAkxNQorI2RlZmluZSBQQ19SRUdOVU0gCTE2CisjZGVmaW5lIFBSX1JFR05VTSAJMTcKKyNkZWZpbmUgR0JSX1JFR05VTSAJMTgKKyNkZWZpbmUgVkJSX1JFR05VTSAJMTkKKyNkZWZpbmUgTUFDSF9SRUdOVU0gCTIwCisjZGVmaW5lIE1BQ0xfUkVHTlVNIAkyMQorI2RlZmluZSBTUl9SRUdOVU0gCTIyCisjZGVmaW5lIEZQVUxfUkVHTlVNCTIzCisjZGVmaW5lIEZQU0NSX1JFR05VTQkyNAorI2RlZmluZSBGUDBfUkVHTlVNCTI1CisjZGVmaW5lIEZQMTVfUkVHTlVNCTQwCisjZGVmaW5lIFNTUl9SRUdOVU0JNDEKKyNkZWZpbmUgU1BDX1JFR05VTQk0MgorI2RlZmluZSBSMEIwX1JFR05VTQk0MworI2RlZmluZSBSMEIxX1JFR05VTQk1MQorCisjZGVmaW5lIE5VTV9SRUFMUkVHUwk1OQorCisvKiBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUgcGxhY2UgaW4gd2hpY2ggdG8gY29weSB0aGUgc3RydWN0dXJlIHRoZQorICAgc3Vicm91dGluZSB3aWxsIHJldHVybi4gIFRoaXMgaXMgY2FsbGVkIGZyb20gY2FsbF9mdW5jdGlvbi4gCisKKyAgIFdlIHN0b3JlIHN0cnVjdHMgdGhyb3VnaCBhIHBvaW50ZXIgcGFzc2VkIGluIFIwICovCisKKyNkZWZpbmUgU1RPUkVfU1RSVUNUX1JFVFVSTihBRERSLCBTUCkgXAorICAgIHsgd3JpdGVfcmVnaXN0ZXIgKFNUUlVDVF9SRVRVUk5fUkVHTlVNLCAoQUREUikpOyAgfQorCitleHRlcm4gdXNlX3N0cnVjdF9jb252ZW50aW9uX2ZuIHNoX3VzZV9zdHJ1Y3RfY29udmVudGlvbjsKKyNkZWZpbmUgVVNFX1NUUlVDVF9DT05WRU5USU9OKGdjY19wLCB0eXBlKSBzaF91c2Vfc3RydWN0X2NvbnZlbnRpb24gKGdjY19wLCB0eXBlKQorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwgZm9ybWF0LAorICAgaW50byBWQUxCVUYuICAqLworCitleHRlcm4gdm9pZCBzaF9leHRyYWN0X3JldHVybl92YWx1ZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCB2b2lkICosIHZvaWQgKikpOworI2RlZmluZSBFWFRSQUNUX1JFVFVSTl9WQUxVRShUWVBFLFJFR0JVRixWQUxCVUYpIFwKKwlzaF9leHRyYWN0X3JldHVybl92YWx1ZSAoVFlQRSwgUkVHQlVGLCBWQUxCVUYpCisKKy8qIFdyaXRlIGludG8gYXBwcm9wcmlhdGUgcmVnaXN0ZXJzIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlCisgICBvZiB0eXBlIFRZUEUsIGdpdmVuIGluIHZpcnR1YWwgZm9ybWF0LiAgCisKKyAgIFRoaW5ncyBhbHdheXMgZ2V0IHJldHVybmVkIGluIFIwL1IxICovCisKKyNkZWZpbmUgU1RPUkVfUkVUVVJOX1ZBTFVFKFRZUEUsVkFMQlVGKSBcCisgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFKDApLCBWQUxCVUYsIFRZUEVfTEVOR1RIIChUWVBFKSkKKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgdGhlIGFkZHJlc3MgaW4gd2hpY2ggYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGl0cyBzdHJ1Y3R1cmUgdmFsdWUsCisgICBhcyBhIENPUkVfQUREUiAob3IgYW4gZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIG9uZSkuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MoUkVHQlVGKSBcCisgICAgIGV4dHJhY3RfYWRkcmVzcyAoUkVHQlVGLCBSRUdJU1RFUl9SQVdfU0laRSAoMCkpCisKKworLyogRGVmaW5lIG90aGVyIGFzcGVjdHMgb2YgdGhlIHN0YWNrIGZyYW1lLiAKKyAgIHdlIGtlZXAgYSBjb3B5IG9mIHRoZSB3b3JrZWQgb3V0IHJldHVybiBwYyBseWluZyBhcm91bmQsIHNpbmNlIGl0CisgICBpcyBhIHVzZWZ1bCBiaXQgb2YgaW5mbyAqLworCisjZGVmaW5lIEVYVFJBX0ZSQU1FX0lORk8gXAorICAgIENPUkVfQUREUiByZXR1cm5fcGM7IFwKKyAgICBpbnQgbGVhZl9mdW5jdGlvbjsgICBcCisgICAgaW50IGZfb2Zmc2V0OyAgICAKKworI2RlZmluZSBJTklUX0VYVFJBX0ZSQU1FX0lORk8oZnJvbWxlYWYsIGZpKSBcCisgICAgc2hfaW5pdF9leHRyYV9mcmFtZV9pbmZvKGZyb21sZWFmLCBmaSkgCitleHRlcm4gdm9pZCBzaF9pbml0X2V4dHJhX2ZyYW1lX2luZm8gUEFSQU1TICgoaW50LCBzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisKKy8qIEEgbWFjcm8gdGhhdCB0ZWxscyB1cyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpbnZvY2F0aW9uIHJlcHJlc2VudGVkCisgICBieSBGSSBkb2VzIG5vdCBoYXZlIGEgZnJhbWUgb24gdGhlIHN0YWNrIGFzc29jaWF0ZWQgd2l0aCBpdC4gIElmIGl0CisgICBkb2VzIG5vdCwgRlJBTUVMRVNTIGlzIHNldCB0byAxLCBlbHNlIDAuICAqLworCisjZGVmaW5lIEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OKEZJLCBGUkFNRUxFU1MpIFwKKyAgKEZSQU1FTEVTUykgPSBmcmFtZWxlc3NfbG9va19mb3JfcHJvbG9ndWUoRkkpCisKKyNkZWZpbmUgRlJBTUVfU0FWRURfUEMoRlJBTUUpCQkoKEZSQU1FKS0+cmV0dXJuX3BjKQorI2RlZmluZSBGUkFNRV9BUkdTX0FERFJFU1MoZmkpICAgCSgoZmkpLT5mcmFtZSkKKyNkZWZpbmUgRlJBTUVfTE9DQUxTX0FERFJFU1MoZmkpIAkoKGZpKS0+ZnJhbWUpCisKKy8qIFNldCBWQUwgdG8gdGhlIG51bWJlciBvZiBhcmdzIHBhc3NlZCB0byBmcmFtZSBkZXNjcmliZWQgYnkgRkkuCisgICBDYW4gc2V0IFZBTCB0byAtMSwgbWVhbmluZyBubyB3YXkgdG8gdGVsbC4gICovCisKKy8qIFdlIGNhbid0IHRlbGwgaG93IG1hbnkgYXJncyB0aGVyZSBhcmUgKi8KKworI2RlZmluZSBGUkFNRV9OVU1fQVJHUyh2YWwsZmkpICh2YWwgPSAtMSkKKworLyogUmV0dXJuIG51bWJlciBvZiBieXRlcyBhdCBzdGFydCBvZiBhcmdsaXN0IHRoYXQgYXJlIG5vdCByZWFsbHkgYXJncy4gICovCisKKyNkZWZpbmUgRlJBTUVfQVJHU19TS0lQIDAKKworZXh0ZXJuIHZvaWQgc2hfZnJhbWVfZmluZF9zYXZlZF9yZWdzIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICpmaSwgCisJCQkJCSAgICAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICpmc3IpKTsKKworLyogUHV0IGhlcmUgdGhlIGNvZGUgdG8gc3RvcmUsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywKKyAgIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4KKyAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbAorICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDoKKyAgIHRoZSBhZGRyZXNzIHdlIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4gICovCisKKyNkZWZpbmUgRlJBTUVfRklORF9TQVZFRF9SRUdTKGZyYW1lX2luZm8sIGZyYW1lX3NhdmVkX3JlZ3MpCSAgICBcCisgICBzaF9mcmFtZV9maW5kX3NhdmVkX3JlZ3MoZnJhbWVfaW5mbywgJihmcmFtZV9zYXZlZF9yZWdzKSkKKworI2RlZmluZSBOQU1FU19IQVZFX1VOREVSU0NPUkUKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBJTlNOX1dPUkQ7CisKK2V4dGVybiBDT1JFX0FERFIgc2hfcHVzaF9hcmd1bWVudHMgUEFSQU1TICgoaW50IG5hcmdzLCAKKwkJCQkJICAgIHN0cnVjdCB2YWx1ZSAqKmFyZ3MsIAorCQkJCQkgICAgQ09SRV9BRERSIHNwLAorCQkJCQkgICAgdW5zaWduZWQgY2hhciBzdHJ1Y3RfcmV0dXJuLAorCQkJCQkgICAgQ09SRV9BRERSIHN0cnVjdF9hZGRyKSk7CisKKyNkZWZpbmUgVVNFX0dFTkVSSUNfRFVNTVlfRlJBTUVTCisjZGVmaW5lIENBTExfRFVNTVkgICAgICAgICAgICAgICAgICAgezB9CisjZGVmaW5lIENBTExfRFVNTVlfTEVOR1RIICAgICAgICAgICAgKDApCisjZGVmaW5lIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUICAgICAgKDApCisjZGVmaW5lIENBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQgKDApCisjZGVmaW5lIEZJWF9DQUxMX0RVTU1ZKERVTU1ZLCBTVEFSVEFERFIsIEZVTkFERFIsIE5BUkdTLCBBUkdTLCBUWVBFLCBHQ0NQKSAKKyNkZWZpbmUgQ0FMTF9EVU1NWV9MT0NBVElPTiAgICAgICAgICBBVF9FTlRSWV9QT0lOVAorI2RlZmluZSBDQUxMX0RVTU1ZX0FERFJFU1MoKSAgICAgICAgIGVudHJ5X3BvaW50X2FkZHJlc3MgKCkKK2V4dGVybiBDT1JFX0FERFIgc2hfcHVzaF9yZXR1cm5fYWRkcmVzcyAgIFBBUkFNUyAoKENPUkVfQUREUiwgQ09SRV9BRERSKSk7CisjZGVmaW5lIFBVU0hfUkVUVVJOX0FERFJFU1MoUEMsIFNQKSAgc2hfcHVzaF9yZXR1cm5fYWRkcmVzcyAoUEMsIFNQKQorCisKK2V4dGVybiBDT1JFX0FERFIgc2hfZnJhbWVfY2hhaW4gUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworI2RlZmluZSBGUkFNRV9DSEFJTihGUkFNRSkgICAgICAgICAgIHNoX2ZyYW1lX2NoYWluKEZSQU1FKQorI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FICAgICAgICAgICAgIGdlbmVyaWNfcHVzaF9kdW1teV9mcmFtZSAoKQorI2RlZmluZSBGUkFNRV9DSEFJTl9WQUxJRChGUCwgRlJBTUUpIGdlbmVyaWNfZnJhbWVfY2hhaW5fdmFsaWQgKEZQLCBGUkFNRSkKKyNkZWZpbmUgUENfSU5fQ0FMTF9EVU1NWShQQywgU1AsIEZQKSBnZW5lcmljX3BjX2luX2NhbGxfZHVtbXkgKFBDLCBTUCkKKyNkZWZpbmUgUFVTSF9BUkdVTUVOVFMoTkFSR1MsIEFSR1MsIFNQLCBTVFJVQ1RfUkVUVVJOLCBTVFJVQ1RfQUREUikgXAorICAgIChTUCkgPSBzaF9wdXNoX2FyZ3VtZW50cyAoTkFSR1MsIEFSR1MsIFNQLCBTVFJVQ1RfUkVUVVJOLCBTVFJVQ1RfQUREUikKKworLyogb3ZlcnJpZGUgdGhlIHN0YW5kYXJkIGdldF9zYXZlZF9yZWdpc3RlciBmdW5jdGlvbiB3aXRoIAorICAgb25lIHRoYXQgdGFrZXMgYWNjb3VudCBvZiBnZW5lcmljIENBTExfRFVNTVkgZnJhbWVzICovCisjZGVmaW5lIEdFVF9TQVZFRF9SRUdJU1RFUgorCisvKiBEaXNjYXJkIGZyb20gdGhlIHN0YWNrIHRoZSBpbm5lcm1vc3QgZnJhbWUsIHJlc3RvcmluZyBhbGwgc2F2ZWQKKyAgIHJlZ2lzdGVycy4gICovCisKK2V4dGVybiB2b2lkIHNoX3BvcF9mcmFtZSBQQVJBTVMgKCh2b2lkKSk7CisjZGVmaW5lIFBPUF9GUkFNRSBzaF9wb3BfZnJhbWUoKTsKKworI2RlZmluZSBOT1AgICB7MHgyMCwgMHgwYn0KKworI2RlZmluZSBSRUdJU1RFUl9TSVpFIDQKKworI2RlZmluZSBDT0VSQ0VfRkxPQVRfVE9fRE9VQkxFIDEKKworI2RlZmluZSBCRUxJRVZFX1BDQ19QUk9NT1RJT04gMQorCisvKiBOZWVkIHRoaXMgZm9yIFdpbkdEQi4gIFNlZSBnZGIvbXN3aW4ve3JlZ2RvYy5oLCBnZGJ3aW4uYywgZ3VpLmNwcH0uICAqLworI2RlZmluZSBUQVJHRVRfU0gKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvc3BhcmMvbGludXgubWggYi9nZGIvY29uZmlnL3NwYXJjL2xpbnV4Lm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDM5OGYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NwYXJjL2xpbnV4Lm1oCkBAIC0wLDAgKzEsNyBAQAorIyBIb3N0OiBTcGFyY3N0YXRpb24sIHJ1bm5pbmcgTGludXgKK1hERVBGSUxFUz0gc2VyLXRjcC5vCitYTV9GSUxFPSB4bS1saW51eC5oCitOQVRfRklMRT0gbm0tbGludXguaAorTkFUREVQRklMRVM9IGZvcmstY2hpbGQubyBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gY29yZWxvdy5vIHNwYXJjLW5hdC5vCitIT1NUX0lQQz0tREJTRF9JUEMKK0dEQlNFUlZFUl9ERVBGSUxFUz0gbG93LXNwYXJjLm8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvc3BhcmMvbGludXgubXQgYi9nZGIvY29uZmlnL3NwYXJjL2xpbnV4Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNDIyZTkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NwYXJjL2xpbnV4Lm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IFNwYXJjc3RhdGlvbiwgcnVubmluZyBMaW51eAorVERFUEZJTEVTPSBzcGFyYy10ZGVwLm8gc29saWIubworVE1fRklMRT0gdG0tbGludXguaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9zcGFyYy9uYnNkLm1oIGIvZ2RiL2NvbmZpZy9zcGFyYy9uYnNkLm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMDgzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NwYXJjL25ic2QubWgKQEAgLTAsMCArMSw2IEBACisjIEhvc3Q6IFN1biA0IG9yIFNwYXJjc3RhdGlvbiwgcnVubmluZyBOZXRCU0QKK1hERVBGSUxFUz0gc2VyLXRjcC5vCitYTV9GSUxFPSB4bS1uYnNkLmgKK05BVF9GSUxFPSBubS1uYnNkLmgKK05BVERFUEZJTEVTPSBmb3JrLWNoaWxkLm8gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGNvcmVsb3cubyBzcGFyYy1uYXQubworSE9TVF9JUEM9LURCU0RfSVBDCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3NwYXJjL25ic2QubXQgYi9nZGIvY29uZmlnL3NwYXJjL25ic2QubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4YTM0OAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvc3BhcmMvbmJzZC5tdApAQCAtMCwwICsxLDMgQEAKKyMgVGFyZ2V0OiBTdW4gNCBvciBTcGFyY3N0YXRpb24sIHJ1bm5pbmcgTmV0QlNECitUREVQRklMRVM9IHNwYXJjLXRkZXAubyBzb2xpYi5vCitUTV9GSUxFPSB0bS1uYnNkLmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvc3BhcmMvbm0tbGludXguaCBiL2dkYi9jb25maWcvc3BhcmMvbm0tbGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmIyYTkxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9zcGFyYy9ubS1saW51eC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qIE1hY3JvIGRlZmluaXRpb25zIGZvciBydW5uaW5nIGdkYiBvbiBhIFNwYXJjIHJ1bm5pbmcgTGludXguCisgICBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTIsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPG5tLXN5c3Y0Lmg+CisjaW5jbHVkZSAic29saWIuaCIKKworI2RlZmluZSBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMKKworLyogUmV0dXJuIHNpemVvZiB1c2VyIHN0cnVjdCB0byBjYWxsZXJzIGluIGxlc3MgbWFjaGluZSBkZXBlbmRlbnQgcm91dGluZXMgKi8KKworI2RlZmluZSBLRVJORUxfVV9TSVpFIGtlcm5lbF91X3NpemUoKQorZXh0ZXJuIGludCBrZXJuZWxfdV9zaXplIFBBUkFNUyAoKHZvaWQpKTsKKworLyogTGludXggaXMgc3ZyNGlzaCBidXQgbm90IHRoYXQgbXVjaCAqLworI3VuZGVmIFVTRV9QUk9DX0ZTICAgICAgCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3NwYXJjL25tLW5ic2QuaCBiL2dkYi9jb25maWcvc3BhcmMvbm0tbmJzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNjc3MmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NwYXJjL25tLW5ic2QuaApAQCAtMCwwICsxLDU3IEBACisvKiBOYXRpdmUtZGVwZW5kZW50IGRlZmluaXRpb25zIGZvciBTcGFyYyBydW5uaW5nIE5ldEJTRCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSwgMTk5MiwgMTk5NSwgMTk5NgorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBOTV9OQlNEX0gKKyNkZWZpbmUgTk1fTkJTRF9ICisKKy8qIEdldCBnZW5lcmljIE5ldEJTRCBuYXRpdmUgZGVmaW5pdGlvbnMuICovCisKKyNpbmNsdWRlICJubS1uYnNkLmgiCisKKyNkZWZpbmUgRkVUQ0hfSU5GRVJJT1JfUkVHSVNURVJTCisKKy8qIEJlZm9yZSBzdG9yaW5nLCB3ZSBuZWVkIHRvIHJlYWQgYWxsIHRoZSByZWdpc3RlcnMuICAqLworCisjZGVmaW5lIENISUxEX1BSRVBBUkVfVE9fU1RPUkUoKSByZWFkX3JlZ2lzdGVyX2J5dGVzICgwLCBOVUxMLCBSRUdJU1RFUl9CWVRFUykKKworLyogTWFrZSB0aGluZ3MgbWF0Y2ggdXAgd2l0aCB3aGF0IGlzIGV4cGVjdGVkIGluIHNwYXJjLW5hdC5jLiAgKi8KKworI2RlZmluZSByZWdzCQl0cmFwZnJhbWUKKyNkZWZpbmUgZnBfc3RhdHVzCWZwc3RhdGUKKworI2RlZmluZSByX2cxCQl0Zl9nbG9iYWxbMV0KKyNkZWZpbmUgcl9wcwkJdGZfcHNyCisjZGVmaW5lIHJfcGMJCXRmX3BjCisjZGVmaW5lIHJfbnBjCQl0Zl9ucGMKKyNkZWZpbmUgcl95CQl0Zl95CisKKyNkZWZpbmUgZnB1CQlmcHN0YXRlCisjZGVmaW5lIGZwdV9yZWdzCWZzX3JlZ3MKKyNkZWZpbmUgZnB1X2ZzcgkJZnNfZnNyCisjZGVmaW5lIGZwdV9mcgkJZnNfcmVncworI2RlZmluZSBGcHVfZnNyCQlmc19mc3IKKyNkZWZpbmUgRlBVX0ZTUl9UWVBFCWludAorCisjZGVmaW5lIFBUUkFDRV9HRVRSRUdTCSBQVF9HRVRSRUdTCisjZGVmaW5lIFBUUkFDRV9HRVRGUFJFR1MgUFRfR0VURlBSRUdTCisjZGVmaW5lIFBUUkFDRV9TRVRSRUdTCSBQVF9TRVRSRUdTCisjZGVmaW5lIFBUUkFDRV9TRVRGUFJFR1MgUFRfU0VURlBSRUdTCisKKyNlbmRpZiAvKiBOTV9OQlNEX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvc3BhcmMvbm0tc3BhcmNseW54LmggYi9nZGIvY29uZmlnL3NwYXJjL25tLXNwYXJjbHlueC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MDExZGMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NwYXJjL25tLXNwYXJjbHlueC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIE5hdGl2ZS1kZXBlbmRlbnQgZGVmaW5pdGlvbnMgZm9yIFNwYXJjIHJ1bm5pbmcgTHlueE9TLgorICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBOTV9TUEFSQ0xZTlhfSAorI2RlZmluZSBOTV9TUEFSQ0xZTlhfSAorCisjaW5jbHVkZSAibm0tbHlueC5oIgorCisjZW5kaWYgLyogTk1fU1BBUkNMWU5YX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvc3BhcmMvbm0tc3VuNG9zNC5oIGIvZ2RiL2NvbmZpZy9zcGFyYy9ubS1zdW40b3M0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRhOTZiZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvc3BhcmMvbm0tc3VuNG9zNC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIE1hY3JvIGRlZmluaXRpb25zIGZvciBydW5uaW5nIGdkYiBvbiBhIFN1biA0IHJ1bm5pbmcgc3Vub3MgNC4KKyAgIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MiwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBEbyBpbXBsZW1lbnQgdGhlIGF0dGFjaCBhbmQgZGV0YWNoIGNvbW1hbmRzLiAgKi8KKworI2RlZmluZSBBVFRBQ0hfREVUQUNICisKKy8qIE92ZXJyaWRlIGNvcGllcyBvZiB7ZmV0Y2gsc3RvcmV9X2luZmVyaW9yX3JlZ2lzdGVycyBpbiBpbmZwdHJhY2UuYy4gICovCisKKyNkZWZpbmUgRkVUQ0hfSU5GRVJJT1JfUkVHSVNURVJTCisKKy8qIEJlZm9yZSBzdG9yaW5nLCB3ZSBuZWVkIHRvIHJlYWQgYWxsIHRoZSByZWdpc3RlcnMuICAqLworCisjZGVmaW5lIENISUxEX1BSRVBBUkVfVE9fU1RPUkUoKSByZWFkX3JlZ2lzdGVyX2J5dGVzICgwLCBOVUxMLCBSRUdJU1RFUl9CWVRFUykKKworLyogUmV0dXJuIHNpemVvZiB1c2VyIHN0cnVjdCB0byBjYWxsZXJzIGluIGxlc3MgbWFjaGluZSBkZXBlbmRlbnQgcm91dGluZXMgKi8KKworI2RlZmluZSBLRVJORUxfVV9TSVpFIGtlcm5lbF91X3NpemUoKQorZXh0ZXJuIGludCBrZXJuZWxfdV9zaXplIFBBUkFNUyAoKHZvaWQpKTsKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvc3BhcmMvbm0tc3VuNHNvbDIuaCBiL2dkYi9jb25maWcvc3BhcmMvbm0tc3VuNHNvbDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjgzM2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9zcGFyYy9ubS1zdW40c29sMi5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qIE5hdGl2ZS1kZXBlbmRlbnQgZGVmaW5pdGlvbnMgZm9yIFNwYXJjIHJ1bm5pbmcgU1ZSNC4KKyAgIENvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEluY2x1ZGUgdGhlIGdlbmVyaWMgU1ZSNCBkZWZpbml0aW9ucy4gICovCisKKyNpbmNsdWRlIDxubS1zeXN2NC5oPgorCisvKiBCZWZvcmUgc3RvcmluZywgd2UgbmVlZCB0byByZWFkIGFsbCB0aGUgcmVnaXN0ZXJzLiAgKi8KKworI2RlZmluZSBDSElMRF9QUkVQQVJFX1RPX1NUT1JFKCkgcmVhZF9yZWdpc3Rlcl9ieXRlcyAoMCwgTlVMTCwgUkVHSVNURVJfQllURVMpCisKKy8qIFNvbGFyaXMgUFNSVkFERFIgc3VwcG9ydCBkb2VzIG5vdCBzZWVtIHRvIGluY2x1ZGUgYSBwbGFjZSBmb3IgblBDLiAgKi8KKworI2RlZmluZSBQUlNWQUREUl9CUk9LRU4KKworI2lmZGVmIEhBVkVfVEhSRUFEX0RCX0xJQgorCisjaWZkZWYgX19TVERDX18KK3N0cnVjdCBvYmpmaWxlOworI2VuZGlmCisKKyNkZWZpbmUgdGFyZ2V0X25ld19vYmpmaWxlKE9CSkZJTEUpIHNvbF90aHJlYWRfbmV3X29iamZpbGUgKE9CSkZJTEUpCisKK3ZvaWQgc29sX3RocmVhZF9uZXdfb2JqZmlsZSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSkpOworCisjZGVmaW5lIEZJTkRfTkVXX1RIUkVBRFMgc29sX2ZpbmRfbmV3X3RocmVhZHMKK3ZvaWQgc29sX2ZpbmRfbmV3X3RocmVhZHMgUEFSQU1TICgodm9pZCkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvc3BhcmMvc3A2NC5tdCBiL2dkYi9jb25maWcvc3BhcmMvc3A2NC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmIxZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9zcGFyYy9zcDY0Lm10CkBAIC0wLDAgKzEsOSBAQAorIyBUYXJnZXQ6IFNQQVJDNjQKKyMgc29saWIubyBhbmQgcHJvY2ZzLm8gdGFrZW4gb3V0IGZvciBub3cuICBXZSBkb24ndCBoYXZlIHNoYXJlZCBsaWJyYXJpZXMgeWV0LAorIyBhbmQgdGhlIGVsZiB2ZXJzaW9uIHJlcXVpcmVzIHByb2Nmcy5vIGJ1dCB0aGUgYS5vdXQgdmVyc2lvbiBkb2Vzbid0LgorIyBUaGVuIGFnYWluLCBoYXZpbmcgcHJvY2ZzLm8gaW4gYSB0YXJnZXQgbWFrZWZpbGUgZnJhZ21lbnQgc2VlbXMgd3JvbmcuCitUREVQRklMRVMgPSBzcGFyYy10ZGVwLm8KK1RNX0ZJTEU9IHRtLXNwNjQuaAorCisjIE5lZWQgZ2NjIGZvciBsb25nIGxvbmcgc3VwcG9ydC4KK0NDID0gZ2NjCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3NwYXJjL3NwNjRzaW0ubXQgYi9nZGIvY29uZmlnL3NwYXJjL3NwNjRzaW0ubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTljNWFjOQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvc3BhcmMvc3A2NHNpbS5tdApAQCAtMCwwICsxLDEzIEBACisjIFRhcmdldDogU1BBUkM2NCAod2l0aCBzaW11bGF0b3IpCisjIHNvbGliLm8gYW5kIHByb2Nmcy5vIHRha2VuIG91dCBmb3Igbm93LiAgV2UgZG9uJ3QgaGF2ZSBzaGFyZWQgbGlicmFyaWVzIHlldCwKKyMgYW5kIHRoZSBlbGYgdmVyc2lvbiByZXF1aXJlcyBwcm9jZnMubyBidXQgdGhlIGEub3V0IHZlcnNpb24gZG9lc24ndC4KKyMgVGhlbiBhZ2FpbiwgaGF2aW5nIHByb2Nmcy5vIGluIGEgdGFyZ2V0IG1ha2VmaWxlIGZyYWdtZW50IHNlZW1zIHdyb25nLgorVERFUEZJTEVTID0gc3BhcmMtdGRlcC5vCitUTV9GSUxFPSB0bS1zcDY0LmgKKworIyBOZWVkIGdjYyBmb3IgbG9uZyBsb25nIHN1cHBvcnQuCitDQyA9IGdjYworCitNSF9DRkxBR1MgPSAtSSR7c3JjZGlyfS8uLi9zaW0vc3A2NAorU0lNX09CUyA9IHJlbW90ZS1zaW0ubworU0lNID0gLi4vc2ltL3NwNjQvbGlic2ltLmEKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvc3BhcmMvc3A2NHNvbDIubXQgYi9nZGIvY29uZmlnL3NwYXJjL3NwNjRzb2wyLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMmYwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NwYXJjL3NwNjRzb2wyLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IFVsdHJhc3BhcmMsIHJ1bm5pbmcgU29sYXJpcyAyCitUREVQRklMRVM9IHNwYXJjLXRkZXAubworVE1fRklMRT0gdG0tc3VuNHNvbDIuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9zcGFyYy9zcGFyYy1lbS5tdCBiL2dkYi9jb25maWcvc3BhcmMvc3BhcmMtZW0ubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiMGM2YQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvc3BhcmMvc3BhcmMtZW0ubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogU1BBUkMgZW1iZWRkZWQKK1RERVBGSUxFUz0gc3BhcmMtdGRlcC5vCitUTV9GSUxFPSB0bS1zcGMtZW0uaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9zcGFyYy9zcGFyY2xldC5tdCBiL2dkYi9jb25maWcvc3BhcmMvc3BhcmNsZXQubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA4Y2ZkNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvc3BhcmMvc3BhcmNsZXQubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogU1BBUkMgZW1iZWRkZWQgU3BhcmNsZXQgbW9uaXRvcgorVERFUEZJTEVTPSBzcGFyYy10ZGVwLm8gbW9uaXRvci5vIHNwYXJjbGV0LXJvbS5vIGRzcmVjLm8KK1RNX0ZJTEU9IHRtLXNwYXJjbGV0LmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvc3BhcmMvc3BhcmNsaXRlLm10IGIvZ2RiL2NvbmZpZy9zcGFyYy9zcGFyY2xpdGUubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjYjM4YwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvc3BhcmMvc3BhcmNsaXRlLm10CkBAIC0wLDAgKzEsNSBAQAorIyBUYXJnZXQ6IEZ1aml0c3UgU1BBUkNsaXRlIHByb2Nlc3NvcgorVERFUEZJTEVTPSBzcGFyYy10ZGVwLm8gc3BhcmNsLXRkZXAubyAKK1RNX0ZJTEU9IHRtLXNwYXJjbGl0ZS5oCitTSU1fT0JTID0gcmVtb3RlLXNpbS5vCitTSU0gPSAuLi9zaW0vZXJjMzIvbGlic2ltLmEKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvc3BhcmMvc3BhcmNseW54Lm1oIGIvZ2RiL2NvbmZpZy9zcGFyYy9zcGFyY2x5bngubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkZGRkZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvc3BhcmMvc3BhcmNseW54Lm1oCkBAIC0wLDAgKzEsMTEgQEAKKyMgSG9zdDogU3BhcmMgcnVubmluZyBMeW54T1MKKworWE1fRklMRT0geG0tc3BhcmNseW54LmgKK1hERVBGSUxFUz0gc2VyLXRjcC5vCitYTV9DTElCUz0gLWxic2QKKworTkFUX0ZJTEU9IG5tLXNwYXJjbHlueC5oCitOQVRERVBGSUxFUz0gZm9yay1jaGlsZC5vIGluZnB0cmFjZS5vIGluZnRhcmcubyBjb3JlbG93Lm8gbHlueC1uYXQubworCitHREJTRVJWRVJfTElCUz0gLWxic2QKK0dEQlNFUlZFUl9ERVBGSUxFUz0gbG93LWx5bngubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9zcGFyYy9zcGFyY2x5bngubXQgYi9nZGIvY29uZmlnL3NwYXJjL3NwYXJjbHlueC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTYxNjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9zcGFyYy9zcGFyY2x5bngubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogU3BhcmMgcnVubmluZyBMeW54T1MKK1RERVBGSUxFUz0gY29mZi1zb2xpYi5vIHNwYXJjLXRkZXAubworVE1fRklMRT0gdG0tc3BhcmNseW54LmgKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvc3BhcmMvc3VuNG9zNC5taCBiL2dkYi9jb25maWcvc3BhcmMvc3VuNG9zNC5taApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQ3YzVjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9zcGFyYy9zdW40b3M0Lm1oCkBAIC0wLDAgKzEsMTEgQEAKKyMgSG9zdDogU3VuIDQgb3IgU3BhcmNzdGF0aW9uLCBydW5uaW5nIFN1bk9TIDQKK1hERVBGSUxFUz0gc2VyLXRjcC5vCitYTV9GSUxFPSB4bS1zdW40b3M0LmgKK05BVF9GSUxFPSBubS1zdW40b3M0LmgKK05BVERFUEZJTEVTPSBmb3JrLWNoaWxkLm8gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGNvcmVsb3cubyBzcGFyYy1uYXQubworSE9TVF9JUEM9LURCU0RfSVBDCitHREJTRVJWRVJfREVQRklMRVM9IGxvdy1zcGFyYy5vCisjIFNldHRpbmcgWE1fQ0xJQlM9LWxyZXNvbHYgd291bGQgbGV0IHVzIHVzZSB0aGUgRE5TLCBidXQgdGhhdCB3b3VsZCBzY3JldworIyBhbnlvbmUgd2hvIHdhbnRzIHRvIHVzZSBOSVMsIHdoaWNoIGluY2x1ZGVzIGF0IGxlYXN0IG9uZSBDeWdudXMgY3VzdG9tZXIKKyMgKFBSIDM1OTMpLiAgU28gbGVhdmUgaXQgdGhpcyB3YXkgdW50aWwvdW5sZXNzIHdlIGZpbmQgYSByZXNvbHZlciB3aGljaCBjYW4KKyMgZ2V0IG5hbWVzIGZyb20gZWl0aGVyIEROUyBvciBOSVMgZnJvbSB0aGUgc2FtZSBHREIgYmluYXJ5LgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9zcGFyYy9zdW40b3M0Lm10IGIvZ2RiL2NvbmZpZy9zcGFyYy9zdW40b3M0Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNGVjYjkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NwYXJjL3N1bjRvczQubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogU3VuIDQgb3IgU3BhcmNzdGF0aW9uLCBydW5uaW5nIFN1bk9TIDQKK1RERVBGSUxFUz0gc3BhcmMtdGRlcC5vIHNvbGliLm8KK1RNX0ZJTEU9IHRtLXN1bjRvczQuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9zcGFyYy9zdW40c29sMi5taCBiL2dkYi9jb25maWcvc3BhcmMvc3VuNHNvbDIubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY4YjM2MgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvc3BhcmMvc3VuNHNvbDIubWgKQEAgLTAsMCArMSwxOCBAQAorIyBIb3N0OiBTdW4gNCBvciBTcGFyY3N0YXRpb24sIHJ1bm5pbmcgU29sYXJpcyAyCisKK1hNX0ZJTEU9IHhtLXN1bjRzb2wyLmgKK1hERVBGSUxFUz0gc2VyLXRjcC5vCitYTV9DTElCUz0gLWxzb2NrZXQgLWxuc2wKKworTkFUX0ZJTEU9IG5tLXN1bjRzb2wyLmgKK05BVERFUEZJTEVTPSBjb3JlbG93Lm8gY29yZS1zb2wyLm8gc29saWIubyBwcm9jZnMubyBmb3JrLWNoaWxkLm8KKworIyBJZiB5b3UgYXJlIGNvbXBpbGluZyB3aXRoIFN1bidzIGNvbXBpbGVyLCBhZGQgdGhlIC14cyBvcHRpb24gdG8gQ0MKKyMgKGUuZy4gYG1ha2UgQ0M9ImNjIC14cyInKS4KKyMgU3VuJ3MgY29tcGlsZXJzIHJlcXVpcmUgdGhlIC14cyBvcHRpb24gdG8gcHJvZHVjZSBkZWJ1ZyBpbmZvcm1hdGlvbgorIyBpbiB0aGUgZmluYWwgbGlua2VkIGV4ZWN1dGFibGUuICBPdGhlcndpc2UgdGhleSBsZWF2ZSBpdCBpbiB0aGUgLm8KKyMgZmlsZXMgb25seSwgd2l0aCB1bmRvY3VtZW50ZWQgcG9pbnRlcnMgdG8gaXQgaW4gdGhlIGxpbmtlZCBleGVjdXRhYmxlLgorIyBUaGlzIGlzIGNvbW1lbnRlZCBvdXQgYmVjYXVzZSB3ZSBkb24ndCBhc3N1bWUgdGhhdCB0aGUgU3VuIGNvbXBpbGVyCisjIGlzIGluIHVzZS4KKyNNSF9DRkxBR1M9LXhzCitIT1NUX0lQQz0tREJTRF9JUEMKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvc3BhcmMvc3VuNHNvbDIubXQgYi9nZGIvY29uZmlnL3NwYXJjL3N1bjRzb2wyLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNzBlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NwYXJjL3N1bjRzb2wyLm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IFN1biA0IG9yIFNwYXJjc3RhdGlvbiwgcnVubmluZyBTb2xhcmlzIDIKK1RERVBGSUxFUz0gc3BhcmMtdGRlcC5vCitUTV9GSUxFPSB0bS1zdW40c29sMi5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3NwYXJjL3RtLWxpbnV4LmggYi9nZGIvY29uZmlnL3NwYXJjL3RtLWxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNjNzA4YQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvc3BhcmMvdG0tbGludXguaApAQCAtMCwwICsxLDI5IEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgR0RCIGZvciBhIFNwYXJjIHJ1bm5pbmcgTGludXguCisgICBDb3B5cmlnaHQgMTk4OSwgMTk5MiwgMTk5NCwgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIFRNX1NQQVJDTElOVVhfSAorI2RlZmluZSBUTV9TUEFSQ0xJTlVYX0gKKworI2luY2x1ZGUgInNwYXJjL3RtLXNwYXJjLmgiCisKKyNkZWZpbmUgU0lHQ09OVEVYVF9QQ19PRkZTRVQgMTIKKworI2luY2x1ZGUgInRtLXN5c3Y0LmgiCisKKyNlbmRpZiAvKiBUTV9TUEFSQ0xJTlVYX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvc3BhcmMvdG0tbmJzZC5oIGIvZ2RiL2NvbmZpZy9zcGFyYy90bS1uYnNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzMTA4NAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvc3BhcmMvdG0tbmJzZC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qIE1hY3JvIGRlZmluaXRpb25zIGZvciBTcGFyYyBydW5uaW5nIHVuZGVyIE5ldEJTRC4KKyAgIENvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgVE1fTkJTRF9ICisjZGVmaW5lIFRNX05CU0RfSAorCisjaW5jbHVkZSAic3BhcmMvdG0tc3BhcmMuaCIKKworI2luY2x1ZGUgInRtLW5ic2QuaCIKKworI2VuZGlmIC8qIFRNX05CU0RfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9zcGFyYy90bS1zcDY0LmggYi9nZGIvY29uZmlnL3NwYXJjL3RtLXNwNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGE5YTYyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9zcGFyYy90bS1zcDY0LmgKQEAgLTAsMCArMSwzNzggQEAKKy8qIFRhcmdldCBtYWNoaW5lIHN1Yi1wYXJhbWV0ZXJzIGZvciBTUEFSQzY0LCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgVGhpcyBpcyBpbmNsdWRlZCBieSBvdGhlciB0bS0qLmggZmlsZXMgdG8gZGVmaW5lIFNQQVJDNjQgY3B1LXJlbGF0ZWQgaW5mby4KKyAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBpcyAob2J2aW91c2x5KSBiYXNlZCBvbiB0aGUgU1BBUkMgVm4gKG48OSkgcG9ydC4KKyAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KKyAgIEZ1cnRoZXIgbW9kaWZpZWQgYnkgQm9iIE1hbnNvbiAobWFuc29uQGN5Z251cy5jb20pLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgR0RCX1RBUkdFVF9JU19TUEFSQzY0CisKKyNpZmRlZiBfX1NURENfXworc3RydWN0IHZhbHVlOworI2VuZGlmCisKKy8qIEVlZWV3LiBPaywgd2UgaGF2ZSB0byBhc3N1bWUgKGZvciBub3cpIHRoYXQgdGhlIHByb2Nlc3NvciByZWFsbHkgaXMKKyAgIGluIHNwYXJjNjQgbW9kZS4gV2hpbGUgdGhpcyBpcyB0aGUgc2FtZSBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBhcworICAgb24gdGhlIFNwYXJjLCB0aGUgc3RhY2sgZnJhbWVzIGFyZSBvZmZzZXQgYnkgKzIwNDcgKGFuZCB0aGUgYXJndW1lbnRzCisgICBhcmUgOCBieXRlcyBpbnN0ZWFkIG9mIDQpLiAqLworLyogSW5zdHJ1Y3Rpb25zIGFyZToKKyAgIHN0ZCAgJWYxMCwgWyAlZnAgKyAweDdhNyBdCisgICBzdGQgICVmOCwgWyAlZnAgKyAweDc5ZiBdCisgICBzdGQgICVmNiwgWyAlZnAgKyAweDc5NyBdCisgICBzdGQgICVmNCwgWyAlZnAgKyAweDc4ZiBdCisgICBzdGQgICVmMiwgWyAlZnAgKyAweDc4NyBdCisgICBzdGQgICVmMCwgWyAlZnAgKyAweDc3ZiBdCisgICBzdGQgICVnNiwgWyAlZnAgKyAweDc3NyBdCisgICBzdGQgICVnNCwgWyAlZnAgKyAweDc2ZiBdCisgICBzdGQgICVnMiwgWyAlZnAgKyAweDc2NyBdCisgICBzdGQgICVnMCwgWyAlZnAgKyAweDc1ZiBdCisgICBzdGQgICVmcCwgWyAlZnAgKyAweDc1NyBdCisgICBzdGQgICVpNCwgWyAlZnAgKyAweDc0ZiBdCisgICBzdGQgICVpMiwgWyAlZnAgKyAweDc0NyBdCisgICBzdGQgICVpMCwgWyAlZnAgKyAweDczZiBdCisgICBub3AKKyAgIG5vcAorICAgbm9wCisgICBub3AKKyAgIHJkICAldGJyLCAlbzAKKyAgIHN0ICAlbzAsIFsgJWZwICsgMHg3MmIgXQorICAgcmQgICV0cGMsICVvMAorICAgc3QgICVvMCwgWyAlZnAgKyAweDcyNyBdCisgICByZCAgJXBzciwgJW8wCisgICBzdCAgJW8wLCBbICVmcCArIDB4NzIzIF0KKyAgIHJkICAleSwgJW8wCisgICBzdCAgJW8wLCBbICVmcCArIDB4NzFmIF0KKyAgIGxkeCAgWyAlc3AgKyAweDhhNyBdLCAlbzUKKyAgIGxkeCAgWyAlc3AgKyAweDg5ZiBdLCAlbzQKKyAgIGxkeCAgWyAlc3AgKyAweDg5NyBdLCAlbzMKKyAgIGxkeCAgWyAlc3AgKyAweDg4ZiBdLCAlbzIKKyAgIGxkeCAgWyAlc3AgKyAweDg4NyBdLCAlbzEKKyAgIGNhbGwgICVnMAorICAgbGR4ICBbICVzcCArIDB4ODdmIF0sICVvMAorICAgbm9wCisgICB0YSAgMQorICAgbm9wCisgICBub3AKKyAgICovCisKKyNkZWZpbmUgQ0FMTF9EVU1NWSB7CQkgMHg5ZGUzYmVjMGZkM2ZhN2Y3TEwsIDB4ZjkzZmE3ZWZmNTNmYTdlN0xMLFwKKwkJCQkgMHhmMTNmYTdkZmVkM2ZhN2Q3TEwsIDB4ZTkzZmE3Y2ZlNTNmYTdjN0xMLFwKKwkJCQkgMHhlMTNmYTdiZmRkM2ZhN2I3TEwsIDB4ZDkzZmE3YWZkNTNmYTdhN0xMLFwKKwkJCQkgMHhkMTNmYTc5ZmNkM2ZhNzk3TEwsIDB4YzkzZmE3OGZjNTNmYTc4N0xMLFwKKwkJCQkgMHhjMTNmYTc3ZmNjM2ZhNzc3TEwsIDB4YzgzZmE3NmZjNDNmYTc2N0xMLFwKKwkJCQkgMHhjMDNmYTc1ZmZjM2ZhNzU3TEwsIDB4ZjgzZmE3NGZmNDNmYTc0N0xMLFwKKwkJCQkgMHhmMDNmYTczZjAxMDAwMDAwTEwsIDB4MDEwMDAwMDAwMTAwMDAwMExMLFwKKwkJCQkgMHgwMTAwMDAwMDkxNTgwMDAwTEwsIDB4ZDAyN2E3MmI5MzUwMDAwMExMLFwKKwkJCQkgMHhkMDI3YTcyNzkxNDgwMDAwTEwsIDB4ZDAyN2E3MjM5MTQwMDAwMExMLFwKKwkJCQkgMHhkMDI3YTcxZmRhNWJhOGE3TEwsIDB4ZDg1YmE4OWZkNjViYTg5N0xMLFwKKwkJCQkgMHhkNDViYTg4ZmQyNWJhODg3TEwsIDB4OWZjMDIwMDBkMDViYTg3ZkxMLFwKKwkJCQkgMHgwMTAwMDAwMDkxZDAyMDAxTEwsIDB4MDEwMDAwMDAwMTAwMDAwMExMIH0KKworCisvKiAxMjggaXMgdG8gcmVzZXJ2ZSBzcGFjZSB0byB3cml0ZSB0aGUgJWkvJWwgcmVnaXN0ZXJzIHRoYXQgd2lsbCBiZSByZXN0b3JlZAorICAgd2hlbiB3ZSByZXN1bWUuICovCisjZGVmaW5lIENBTExfRFVNTVlfU1RBQ0tfQURKVVNUIDEyOAorCisjZGVmaW5lIENBTExfRFVNTVlfTEVOR1RIIDE5MgorCisjZGVmaW5lIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUIDE0OAorCisjZGVmaW5lIENBTExfRFVNTVlfQ0FMTF9PRkZTRVQgKENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUICsgKDUgKiA0KSkKKworI2RlZmluZSBDQUxMX0RVTU1ZX0JSRUFLUE9JTlRfT0ZGU0VUIChDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCArICg4ICogNCkpCisKKyNpbmNsdWRlICJzcGFyYy90bS1zcGFyYy5oIgorCisvKiBTdGFjayBtdXN0IGJlIGFsaWduZWQgb24gMTI4LWJpdCBib3VuZGFyaWVzIHdoZW4gc3ludGhlc2l6aW5nCisgICBmdW5jdGlvbiBjYWxscy4gKi8KKworI3VuZGVmICBTVEFDS19BTElHTgorI2RlZmluZSBTVEFDS19BTElHTihBRERSKSAoKChBRERSKSArIDE1ICkgJiAtMTYpCisKKy8qIE51bWJlciBvZiBtYWNoaW5lIHJlZ2lzdGVycy4gICovCisKKyN1bmRlZiAgTlVNX1JFR1MKKyNkZWZpbmUgTlVNX1JFR1MgMTI1CisKKy8qIEluaXRpYWxpemVyIGZvciBhbiBhcnJheSBvZiBuYW1lcyBvZiByZWdpc3RlcnMuCisgICBUaGVyZSBzaG91bGQgYmUgTlVNX1JFR1Mgc3RyaW5ncyBpbiB0aGlzIGluaXRpYWxpemVyLiAgKi8KKy8qIFNvbWUgb2YgdGhlc2UgcmVnaXN0ZXJzIGFyZSBvbmx5IGFjY2Vzc2libGUgZnJvbSBwcml2aWxlZGdlZCBtb2RlLgorICAgVGhleSBhcmUgaGVyZSBmb3Iga2VybmVsIGRlYnVnZ2VycywgZXRjLiAgKi8KKy8qIEZJWE1FOiBpY2MgYW5kIHhjYyBhcmUgY3VycmVudGx5IGNvbnNpZGVyZWQgc2VwYXJhdGUgcmVnaXN0ZXJzLgorICAgVGhpcyBtYXkgaGF2ZSB0byBjaGFuZ2UgYW5kIGNvbnNpZGVyIHRoZW0gYXMganVzdCBvbmUgKGNjcikuCisgICBMZXQncyBwb3N0cG9uZSB0aGlzIGFzIGxvbmcgYXMgd2UgY2FuLiAgSXQncyBuaWNlIHRvIGJlIGFibGUgdG8gc2V0CisgICB0aGVtIGluZGl2aWR1YWxseS4gICovCisvKiBGSVhNRTogZmNjMC0zIGFyZSBjdXJyZW50bHkgc2VwYXJhdGUsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIGFsc28gcGFydCBvZgorICAgZnNyLiAgTWF5IGhhdmUgdG8gcmVtb3ZlIHRoZW0gYnV0IGxldCdzIHBvc3Rwb25lIHRoaXMgYXMgbG9uZyBhcworICAgcG9zc2libGUuICBJdCdzIG5pY2UgdG8gYmUgYWJsZSB0byBzZXQgdGhlbSBpbmRpdmlkdWFsbHkuICAqLworLyogRklYTUU6IFdoZXRoZXIgdG8gaW5jbHVkZSBmMzMsIGYzNSwgZXRjLiBoZXJlIGlzIG5vdCBjbGVhci4KKyAgIFRoZXJlIGFyZSBhZHZhbnRhZ2VzIGFuZCBkaXNhZHZhbnRhZ2VzLiAgKi8KKworI3VuZGVmICBSRUdJU1RFUl9OQU1FUworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyAgXAoreyAiZzAiLCAiZzEiLCAiZzIiLCAiZzMiLCAiZzQiLCAiZzUiLCAiZzYiLCAiZzciLAlcCisgICJvMCIsICJvMSIsICJvMiIsICJvMyIsICJvNCIsICJvNSIsICJzcCIsICJvNyIsCVwKKyAgImwwIiwgImwxIiwgImwyIiwgImwzIiwgImw0IiwgImw1IiwgImw2IiwgImw3IiwJXAorICAiaTAiLCAiaTEiLCAiaTIiLCAiaTMiLCAiaTQiLCAiaTUiLCAiZnAiLCAiaTciLAlcCisJCQkJCQkJCVwKKyAgImYwIiwgImYxIiwgImYyIiwgImYzIiwgImY0IiwgImY1IiwgImY2IiwgImY3IiwJCVwKKyAgImY4IiwgImY5IiwgImYxMCIsICJmMTEiLCAiZjEyIiwgImYxMyIsICJmMTQiLCAiZjE1IiwJCVwKKyAgImYxNiIsICJmMTciLCAiZjE4IiwgImYxOSIsICJmMjAiLCAiZjIxIiwgImYyMiIsICJmMjMiLAlcCisgICJmMjQiLCAiZjI1IiwgImYyNiIsICJmMjciLCAiZjI4IiwgImYyOSIsICJmMzAiLCAiZjMxIiwJXAorICAiZjMyIiwgImYzNCIsICJmMzYiLCAiZjM4IiwgImY0MCIsICJmNDIiLCAiZjQ0IiwgImY0NiIsCVwKKyAgImY0OCIsICJmNTAiLCAiZjUyIiwgImY1NCIsICJmNTYiLCAiZjU4IiwgImY2MCIsICJmNjIiLAlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAicGMiLCAibnBjIiwgImNjciIsICJmc3IiLCAiZnBycyIsICJ5IiwgImFzaSIsCQlcCisgICJ2ZXIiLCAidGljayIsICJwaWwiLCAicHN0YXRlIiwJCQkJXAorICAidHN0YXRlIiwgInRiYSIsICJ0bCIsICJ0dCIsICJ0cGMiLCAidG5wYyIsICJ3c3RhdGUiLAkJXAorICAiY3dwIiwgImNhbnNhdmUiLCAiY2FucmVzdG9yZSIsICJjbGVhbndpbiIsICJvdGhlcndpbiIsCVwKKyAgImFzcjE2IiwgImFzcjE3IiwgImFzcjE4IiwgImFzcjE5IiwgImFzcjIwIiwgImFzcjIxIiwJCVwKKyAgImFzcjIyIiwgImFzcjIzIiwgImFzcjI0IiwgImFzcjI1IiwgImFzcjI2IiwgImFzcjI3IiwJCVwKKyAgImFzcjI4IiwgImFzcjI5IiwgImFzcjMwIiwgImFzcjMxIiwJCQkJXAorICAvKiBUaGVzZSBhcmUgaGVyZSBhdCB0aGUgZW5kIHRvIHNpbXBsaWZ5IHJlbW92aW5nIHRoZW0gaWYgd2UgaGF2ZSB0by4gICovIFwKKyAgImljYyIsICJ4Y2MiLCAiZmNjMCIsICJmY2MxIiwgImZjYzIiLCAiZmNjMyIJCQlcCit9CisKKy8qIFJlZ2lzdGVyIG51bWJlcnMgb2YgdmFyaW91cyBpbXBvcnRhbnQgcmVnaXN0ZXJzLgorICAgTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2UgdmFsdWVzIGFyZSAicmVhbCIgcmVnaXN0ZXIgbnVtYmVycywKKyAgIGFuZCBjb3JyZXNwb25kIHRvIHRoZSBnZW5lcmFsIHJlZ2lzdGVycyBvZiB0aGUgbWFjaGluZSwKKyAgIGFuZCBzb21lIGFyZSAicGhvbnkiIHJlZ2lzdGVyIG51bWJlcnMgd2hpY2ggYXJlIHRvbyBsYXJnZQorICAgdG8gYmUgYWN0dWFsIHJlZ2lzdGVyIG51bWJlcnMgYXMgZmFyIGFzIHRoZSB1c2VyIGlzIGNvbmNlcm5lZAorICAgYnV0IGRvIHNlcnZlIHRvIGdldCB0aGUgZGVzaXJlZCB2YWx1ZXMgd2hlbiBwYXNzZWQgdG8gcmVhZF9yZWdpc3Rlci4gICovCisKKyNpZiAwIC8qIGRlZmluZWQgaW4gdG0tc3BhcmMuaCwgcmVwbGljYXRlZCBmb3IgZG9jIHB1cnBvc2VzICovCisjZGVmaW5lCUcwX1JFR05VTSAwICAgICAgICAgICAgIC8qICVnMCAqLworI2RlZmluZQlHMV9SRUdOVU0gMQkJLyogJWcxICovCisjZGVmaW5lIE8wX1JFR05VTSA4CQkvKiAlbzAgKi8KKyNkZWZpbmUJU1BfUkVHTlVNIDE0CQkvKiBDb250YWlucyBhZGRyZXNzIG9mIHRvcCBvZiBzdGFjaywgXAorCQkJCSAgIHdoaWNoIGlzIGFsc28gdGhlIGJvdHRvbSBvZiB0aGUgZnJhbWUuICAqLworI2RlZmluZQlSUF9SRUdOVU0gMTUJCS8qIENvbnRhaW5zIHJldHVybiBhZGRyZXNzIHZhbHVlLCAqYmVmb3JlKiBcCisJCQkJICAgYW55IHdpbmRvd3MgZ2V0IHN3aXRjaGVkLiAgKi8KKyNkZWZpbmUJTzdfUkVHTlVNIDE1CQkvKiBMYXN0IGxvY2FsIHJlZyBub3Qgc2F2ZWQgb24gc3RhY2sgZnJhbWUgKi8KKyNkZWZpbmUJTDBfUkVHTlVNIDE2CQkvKiBGaXJzdCBsb2NhbCByZWcgdGhhdCdzIHNhdmVkIG9uIHN0YWNrIGZyYW1lCisJCQkJICAgcmF0aGVyIHRoYW4gaW4gbWFjaGluZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUJSTBfUkVHTlVNIDI0CQkvKiAlaTAgKi8KKyNkZWZpbmUJRlBfUkVHTlVNIDMwCQkvKiBDb250YWlucyBhZGRyZXNzIG9mIGV4ZWN1dGluZyBzdGFjayBmcmFtZSAqLworI2RlZmluZQlJN19SRUdOVU0gMzEJCS8qIExhc3QgbG9jYWwgcmVnIHNhdmVkIG9uIHN0YWNrIGZyYW1lICovCisjZGVmaW5lCUZQMF9SRUdOVU0gMzIJCS8qIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIDAgKi8KKyNlbmRpZgorCisjZGVmaW5lIEZQX01BWF9SRUdOVU0gODAJLyogMSArIGxhc3QgZnAgcmVnIG51bWJlciAqLworCisvKiAjdW5kZWYgdjggbWlzYy4gcmVncyAqLworCisjdW5kZWYgWV9SRUdOVU0KKyN1bmRlZiBQU19SRUdOVU0KKyN1bmRlZiBXSU1fUkVHTlVNCisjdW5kZWYgVEJSX1JFR05VTQorI3VuZGVmIFBDX1JFR05VTQorI3VuZGVmIE5QQ19SRUdOVU0KKyN1bmRlZiBGUFNfUkVHTlVNCisjdW5kZWYgQ1BTX1JFR05VTQorCisvKiB2OSBtaXNjLiBhbmQgcHJpdi4gcmVncyAqLworCisjZGVmaW5lIEMwX1JFR05VTSBGUF9NQVhfUkVHTlVNCQkJLyogU3RhcnQgb2YgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENfUkVHTlVNIChDMF9SRUdOVU0gKyAwKQkJLyogQ3VycmVudCBQQyAqLworI2RlZmluZSBOUENfUkVHTlVNIChDMF9SRUdOVU0gKyAxKQkJLyogTmV4dCBQQyAqLworI2RlZmluZSBDQ1JfUkVHTlVNIChDMF9SRUdOVU0gKyAyKQkJLyogQ29uZGl0aW9uIENvZGUgUmVnaXN0ZXIgKCV4Y2MsJWljYykgKi8KKyNkZWZpbmUgRlNSX1JFR05VTSAoQzBfUkVHTlVNICsgMykJCS8qIEZsb2F0aW5nIFBvaW50IFN0YXRlICovCisjZGVmaW5lIEZQUlNfUkVHTlVNIChDMF9SRUdOVU0gKyA0KQkJLyogRmxvYXRpbmcgUG9pbnQgUmVnaXN0ZXJzIFN0YXRlICovCisjZGVmaW5lCVlfUkVHTlVNIChDMF9SRUdOVU0gKyA1KQkJLyogVGVtcCByZWdpc3RlciBmb3IgbXVsdGlwbGljYXRpb24sIGV0Yy4gICovCisjZGVmaW5lIEFTSV9SRUdOVU0gKEMwX1JFR05VTSArIDYpCQkvKiBBbHRlcm5hdGUgU3BhY2UgSWRlbnRpZmllciAqLworI2RlZmluZSBWRVJfUkVHTlVNIChDMF9SRUdOVU0gKyA3KQkJLyogVmVyc2lvbiByZWdpc3RlciAqLworI2RlZmluZSBUSUNLX1JFR05VTSAoQzBfUkVHTlVNICsgOCkJCS8qIFRpY2sgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElMX1JFR05VTSAoQzBfUkVHTlVNICsgOSkJCS8qIFByb2Nlc3NvciBJbnRlcnJ1cHQgTGV2ZWwgKi8KKyNkZWZpbmUgUFNUQVRFX1JFR05VTSAoQzBfUkVHTlVNICsgMTApCQkvKiBQcm9jZXNzb3IgU3RhdGUgKi8KKyNkZWZpbmUgVFNUQVRFX1JFR05VTSAoQzBfUkVHTlVNICsgMTEpCQkvKiBUcmFwIFN0YXRlICovCisjZGVmaW5lIFRCQV9SRUdOVU0gKEMwX1JFR05VTSArIDEyKQkJLyogVHJhcCBCYXNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgVExfUkVHTlVNIChDMF9SRUdOVU0gKyAxMykJCS8qIFRyYXAgTGV2ZWwgKi8KKyNkZWZpbmUgVFRfUkVHTlVNIChDMF9SRUdOVU0gKyAxNCkJCS8qIFRyYXAgVHlwZSAqLworI2RlZmluZSBUUENfUkVHTlVNIChDMF9SRUdOVU0gKyAxNSkJCS8qIFRyYXAgcGMgKi8KKyNkZWZpbmUgVE5QQ19SRUdOVU0gKEMwX1JFR05VTSArIDE2KQkJLyogVHJhcCBucGMgKi8KKyNkZWZpbmUgV1NUQVRFX1JFR05VTSAoQzBfUkVHTlVNICsgMTcpCQkvKiBXaW5kb3cgU3RhdGUgKi8KKyNkZWZpbmUgQ1dQX1JFR05VTSAoQzBfUkVHTlVNICsgMTgpCQkvKiBDdXJyZW50IFdpbmRvdyBQb2ludGVyICovCisjZGVmaW5lIENBTlNBVkVfUkVHTlVNIChDMF9SRUdOVU0gKyAxOSkJCS8qIFNhdmFibGUgV2luZG93cyAqLworI2RlZmluZSBDQU5SRVNUT1JFX1JFR05VTSAoQzBfUkVHTlVNICsgMjApCS8qIFJlc3RvcmFibGUgV2luZG93cyAqLworI2RlZmluZSBDTEVBTldJTl9SRUdOVU0gKEMwX1JFR05VTSArIDIxKQkvKiBDbGVhbiBXaW5kb3dzICovCisjZGVmaW5lIE9USEVSV0lOX1JFR05VTSAoQzBfUkVHTlVNICsgMjIpCS8qIE90aGVyIFdpbmRvd3MgKi8KKyNkZWZpbmUgQVNSX1JFR05VTShuKSAoQzBfUkVHTlVNKygyMy0xNikrKG4pKQkvKiBBbmNpbGxhcnkgU3RhdGUgUmVnaXN0ZXIKKwkJCQkJCSAgIChuID0gMTYuLi4zMSkgKi8KKyNkZWZpbmUgSUNDX1JFR05VTSAoQzBfUkVHTlVNICsgMzkpCQkvKiAzMiBiaXQgY29uZGl0aW9uIGNvZGVzICovCisjZGVmaW5lIFhDQ19SRUdOVU0gKEMwX1JFR05VTSArIDQwKQkJLyogNjQgYml0IGNvbmRpdGlvbiBjb2RlcyAqLworI2RlZmluZSBGQ0MwX1JFR05VTSAoQzBfUkVHTlVNICsgNDEpCQkvKiBmcCBjYyByZWcgMCAqLworI2RlZmluZSBGQ0MxX1JFR05VTSAoQzBfUkVHTlVNICsgNDIpCQkvKiBmcCBjYyByZWcgMSAqLworI2RlZmluZSBGQ0MyX1JFR05VTSAoQzBfUkVHTlVNICsgNDMpCQkvKiBmcCBjYyByZWcgMiAqLworI2RlZmluZSBGQ0MzX1JFR05VTSAoQzBfUkVHTlVNICsgNDQpCQkvKiBmcCBjYyByZWcgMyAqLworCisvKiBUb3RhbCBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIHRvIHN0b3JlIG91ciBjb3BpZXMgb2YgdGhlIG1hY2hpbmUncworICAgcmVnaXN0ZXIgc3RhdGUsIHRoZSBhcnJheSBgcmVnaXN0ZXJzJy4KKyAgIFNvbWUgb2YgdGhlIHJlZ2lzdGVycyBhcmVuJ3QgNjQgYml0cywgYnV0IGl0J3MgYSBsb3Qgc2ltcGxlciBqdXN0IHRvIGFzc3VtZQorICAgdGhleSBhbGwgYXJlIChzaW5jZSBtb3N0IG9mIHRoZW0gYXJlKS4gICovCisjdW5kZWYgIFJFR0lTVEVSX0JZVEVTCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTICgzMio4KzMyKjgrNDUqOCkKKworLyogSW5kZXggd2l0aGluIGByZWdpc3RlcnMnIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzcGFjZSBmb3IKKyAgIHJlZ2lzdGVyIE4uICAqLworI3VuZGVmICBSRUdJU1RFUl9CWVRFCisjZGVmaW5lIFJFR0lTVEVSX0JZVEUoTikgXAorICAoKE4pIDwgMzIgPyAoTikqOAkJCQlcCisgICA6IChOKSA8IDY0ID8gMzIqOCArICgoTiktMzIpKjQJCVwKKyAgIDogKE4pIDwgQzBfUkVHTlVNID8gMzIqOCArIDMyKjQgKyAoKE4pLTY0KSo4CVwKKyAgIDogNjQqOCArICgoTiktQzBfUkVHTlVNKSo4KQorCisvKiBTYXkgaG93IGxvbmcgKG9yZGluYXJ5KSByZWdpc3RlcnMgYXJlLiAgVGhpcyBpcyBhIHBpZWNlIG9mIGJvZ29zaXR5CisgICB1c2VkIGluIHB1c2hfd29yZCBhbmQgYSBmZXcgb3RoZXIgcGxhY2VzOyBSRUdJU1RFUl9SQVdfU0laRSBpcyB0aGUKKyAgIHJlYWwgd2F5IHRvIGtub3cgaG93IGJpZyBhIHJlZ2lzdGVyIGlzLiAgKi8KKworI3VuZGVmICBSRUdJU1RFUl9TSVpFCisjZGVmaW5lIFJFR0lTVEVSX1NJWkUgOAorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgYWN0dWFsIG1hY2hpbmUgcmVwcmVzZW50YXRpb24KKyAgIGZvciByZWdpc3RlciBOLiAgKi8KKworI3VuZGVmICBSRUdJU1RFUl9SQVdfU0laRQorI2RlZmluZSBSRUdJU1RFUl9SQVdfU0laRShOKSBcCisgICgoTikgPCAzMiA/IDggOiAoTikgPCA2NCA/IDQgOiA4KQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgcHJvZ3JhbSdzIHJlcHJlc2VudGF0aW9uCisgICBmb3IgcmVnaXN0ZXIgTi4gICovCisKKyN1bmRlZiAgUkVHSVNURVJfVklSVFVBTF9TSVpFCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfU0laRShOKSBcCisgICgoTikgPCAzMiA/IDggOiAoTikgPCA2NCA/IDQgOiA4KQorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1JBV19TSVpFIGNhbiBoYXZlLiAgKi8KKy8qIHRtLXNwYXJjLmggZGVmaW5lcyB0aGlzIGFzIDgsIGJ1dCBwbGF5IGl0IHNhZmUuICAqLworCisjdW5kZWYgIE1BWF9SRUdJU1RFUl9SQVdfU0laRQorI2RlZmluZSBNQVhfUkVHSVNURVJfUkFXX1NJWkUgOAorCisvKiBMYXJnZXN0IHZhbHVlIFJFR0lTVEVSX1ZJUlRVQUxfU0laRSBjYW4gaGF2ZS4gICovCisvKiB0bS1zcGFyYy5oIGRlZmluZXMgdGhpcyBhcyA4LCBidXQgcGxheSBpdCBzYWZlLiAgKi8KKworI3VuZGVmICBNQVhfUkVHSVNURVJfVklSVFVBTF9TSVpFCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUgOAorCisvKiBSZXR1cm4gdGhlIEdEQiB0eXBlIG9iamVjdCBmb3IgdGhlICJzdGFuZGFyZCIgZGF0YSB0eXBlCisgICBvZiBkYXRhIGluIHJlZ2lzdGVyIE4uICAqLworCisjdW5kZWYgIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRQorI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1RZUEUoTikgXAorICgoTikgPCAzMiA/IGJ1aWx0aW5fdHlwZV9sb25nX2xvbmcgXAorICA6IChOKSA8IDY0ID8gYnVpbHRpbl90eXBlX2Zsb2F0IFwKKyAgOiAoTikgPCA4MCA/IGJ1aWx0aW5fdHlwZV9kb3VibGUgXAorICA6IGJ1aWx0aW5fdHlwZV9sb25nX2xvbmcpCisKKy8qIFdlIHVzZSB0byBzdXBwb3J0IGJvdGggMzIgYml0IGFuZCA2NCBiaXQgcG9pbnRlcnMuCisgICBXZSBjYW4ndCBhbnltb3JlIGJlY2F1c2UgVEFSR0VUX1BUUl9CSVQgbXVzdCBub3cgYmUgYSBjb25zdGFudC4gICovCisjdW5kZWYgIFRBUkdFVF9QVFJfQklUCisjZGVmaW5lIFRBUkdFVF9QVFJfQklUIDY0CisKKy8qIExvbmdzIGFyZSA2NCBiaXRzLiAqLworI3VuZGVmIFRBUkdFVF9MT05HX0JJVAorI2RlZmluZSBUQVJHRVRfTE9OR19CSVQgNjQKKworI3VuZGVmIFRBUkdFVF9MT05HX0xPTkdfQklUCisjZGVmaW5lIFRBUkdFVF9MT05HX0xPTkdfQklUIDY0CisKKy8qIERvZXMgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiB1c2UgdGhlICJzdHJ1Y3QgcmV0dXJuaW5nIiBjb252ZW50aW9uCisgICBvciB0aGUgInZhbHVlIHJldHVybmluZyIgY29udmVudGlvbj8gIFRoZSAidmFsdWUgcmV0dXJuaW5nIiBjb252ZW50aW9uCisgICBhbG1vc3QgaW52YXJpYWJseSByZXR1cm5zIHRoZSBlbnRpcmUgdmFsdWUgaW4gcmVnaXN0ZXJzLiAgVGhlCisgICAic3RydWN0IHJldHVybmluZyIgY29udmVudGlvbiBvZnRlbiByZXR1cm5zIHRoZSBlbnRpcmUgdmFsdWUgaW4KKyAgIG1lbW9yeSwgYW5kIHBhc3NlcyBhIHBvaW50ZXIgKG91dCBvZiBvciBpbnRvIHRoZSBmdW5jdGlvbikgc2F5aW5nCisgICB3aGVyZSB0aGUgdmFsdWUgKGlzIG9yIHNob3VsZCBnbykuCisKKyAgIFNpbmNlIHRoaXMgc29tZXRpbWVzIGRlcGVuZHMgb24gd2hldGhlciBpdCB3YXMgY29tcGlsZWQgd2l0aCBHQ0MsCisgICB0aGlzIGlzIGFsc28gYW4gYXJndW1lbnQuICBUaGlzIGlzIHVzZWQgaW4gY2FsbF9mdW5jdGlvbiB0byBidWlsZCBhCisgICBzdGFjaywgYW5kIGluIHZhbHVlX2JlaW5nX3JldHVybmVkIHRvIHByaW50IHJldHVybiB2YWx1ZXMuIAorCisgICBPbiBTcGFyYzY0LCB3ZSBvbmx5IHBhc3MgcG9pbnRlcnMgdG8gc3RydWN0cyBpZiB0aGV5J3JlIGxhcmdlciB0aGVuCisgICAzMiBieXRlcy4gT3RoZXJ3aXNlIHRoZXkncmUgc3RvcmVkIGluICVvMC0lbzMgKGZsb2F0aW5nLXBvaW50CisgICB2YWx1ZXMgZ28gaW50byAlZnAwLSVmcDMpLiAgKi8KKworCisjdW5kZWYgIFVTRV9TVFJVQ1RfQ09OVkVOVElPTgorI2RlZmluZSBVU0VfU1RSVUNUX0NPTlZFTlRJT04oZ2NjX3AsIHR5cGUpIChUWVBFX0xFTkdUSCAodHlwZSkgPiAzMikKKworI3VuZGVmIFJFR19TVFJVQ1RfSEFTX0FERFIKKyNkZWZpbmUgUkVHX1NUUlVDVF9IQVNfQUREUihnY2NfcCx0eXBlKSAoVFlQRV9MRU5HVEggKHR5cGUpID4gMzIpCisKKy8qIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBwbGFjZSBpbiB3aGljaCB0byBjb3B5IHRoZSBzdHJ1Y3R1cmUgdGhlCisgICBzdWJyb3V0aW5lIHdpbGwgcmV0dXJuLiAgVGhpcyBpcyBjYWxsZWQgZnJvbSBjYWxsX2Z1bmN0aW9uLiAqLworLyogRklYTUU6IFY5IHVzZXMgJW8wIGZvciB0aGlzLiAgKi8KKworI3VuZGVmICBTVE9SRV9TVFJVQ1RfUkVUVVJOCisjZGVmaW5lIFNUT1JFX1NUUlVDVF9SRVRVUk4oQUREUiwgU1ApIFwKKyAgeyB0YXJnZXRfd3JpdGVfbWVtb3J5ICgoU1ApKygxNio4KSwgKGNoYXIgKikmKEFERFIpLCA4KTsgfQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGF0IHN0YXJ0IG9mIGFyZ2xpc3QgdGhhdCBhcmUgbm90IHJlYWxseSBhcmdzLiAgKi8KKworI3VuZGVmICBGUkFNRV9BUkdTX1NLSVAKKyNkZWZpbmUgRlJBTUVfQVJHU19TS0lQIDEzNgorDAorLyogT2Zmc2V0cyBpbnRvIGptcF9idWYuCisgICBGSVhNRTogVGhpcyB3YXMgYm9ycm93ZWQgZnJvbSB0aGUgdjggc3R1ZmYgYW5kIHdpbGwgcHJvYmFibHkgaGF2ZSB0byBjaGFuZ2UKKyAgIGZvciB2OS4gICovCisKKyNkZWZpbmUgSkJfRUxFTUVOVF9TSVpFIDgJLyogU2l6ZSBvZiBlYWNoIGVsZW1lbnQgaW4gam1wX2J1ZiAqLworCisjZGVmaW5lIEpCX09OU1NUQUNLIDAKKyNkZWZpbmUgSkJfU0lHTUFTSyAxCisjZGVmaW5lIEpCX1NQIDIKKyNkZWZpbmUgSkJfUEMgMworI2RlZmluZSBKQl9OUEMgNAorI2RlZmluZSBKQl9QU1IgNQorI2RlZmluZSBKQl9HMSA2CisjZGVmaW5lIEpCX08wIDcKKyNkZWZpbmUgSkJfV0JDTlQgOAorCisvKiBGaWd1cmUgb3V0IHdoZXJlIHRoZSBsb25nam1wIHdpbGwgbGFuZC4gIFdlIGV4cGVjdCB0aGF0IHdlIGhhdmUganVzdCBlbnRlcmVkCisgICBsb25nam1wIGFuZCBoYXZlbid0IHlldCBzZXR1cCB0aGUgc3RhY2sgZnJhbWUsIHNvIHRoZSBhcmdzIGFyZSBzdGlsbCBpbiB0aGUKKyAgIG91dHB1dCByZWdzLiAgJW8wIChPMF9SRUdOVU0pIHBvaW50cyBhdCB0aGUgam1wX2J1ZiBzdHJ1Y3R1cmUgZnJvbSB3aGljaCB3ZQorICAgZXh0cmFjdCB0aGUgcGMgKEpCX1BDKSB0aGF0IHdlIHdpbGwgbGFuZCBhdC4gIFRoZSBwYyBpcyBjb3BpZWQgaW50byBBRERSLgorICAgVGhpcyByb3V0aW5lIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzICovCisKK2V4dGVybiBpbnQKK2dldF9sb25nam1wX3RhcmdldCBQQVJBTVMgKChDT1JFX0FERFIgKikpOworCisjZGVmaW5lIEdFVF9MT05HSk1QX1RBUkdFVChBRERSKSBnZXRfbG9uZ2ptcF90YXJnZXQoQUREUikKKworZXh0ZXJuIENPUkVfQUREUiBzcGFyYzY0X3JlYWRfc3AgKCk7CitleHRlcm4gQ09SRV9BRERSIHNwYXJjNjRfcmVhZF9mcCAoKTsKK2V4dGVybiB2b2lkIHNwYXJjNjRfd3JpdGVfc3AgUEFSQU1TICgoQ09SRV9BRERSKSk7CitleHRlcm4gdm9pZCBzcGFyYzY0X3dyaXRlX2ZwIFBBUkFNUyAoKENPUkVfQUREUikpOworCisjZGVmaW5lIFRBUkdFVF9SRUFEX1NQKCkgKHNwYXJjNjRfcmVhZF9zcCAoKSkKKyNkZWZpbmUgVEFSR0VUX1JFQURfRlAoKSAoc3BhcmM2NF9yZWFkX2ZwICgpKQorI2RlZmluZSBUQVJHRVRfV1JJVEVfU1AoWCkgKHNwYXJjNjRfd3JpdGVfc3AgKFgpKQorI2RlZmluZSBUQVJHRVRfV1JJVEVfRlAoWCkgKHNwYXJjNjRfd3JpdGVfZnAgKFgpKQorCisjdW5kZWYgVE1fUFJJTlRfSU5TTl9NQUNICisjZGVmaW5lIFRNX1BSSU5UX0lOU05fTUFDSCBiZmRfbWFjaF9zcGFyY192OWEKKworQ09SRV9BRERSIHNwNjRfcHVzaF9hcmd1bWVudHMgUEFSQU1TICgoaW50LCBzdHJ1Y3QgdmFsdWUgKiosIENPUkVfQUREUiwgdW5zaWduZWQgY2hhciwgQ09SRV9BRERSKSk7CisjdW5kZWYgUFVTSF9BUkdVTUVOVFMKKyNkZWZpbmUgUFVTSF9BUkdVTUVOVFMoQSxCLEMsRCxFKSAoc3AgPSBzcDY0X3B1c2hfYXJndW1lbnRzICgoQSksIChCKSwgKEMpLCAoRCksIChFKSkpCisKKyN1bmRlZiBFWFRSQUNUX1JFVFVSTl9WQUxVRQorI2RlZmluZSBFWFRSQUNUX1JFVFVSTl9WQUxVRShUWVBFLFJFR0JVRixWQUxCVUYpIFwKKyAgc3BhcmM2NF9leHRyYWN0X3JldHVybl92YWx1ZShUWVBFLCBSRUdCVUYsIFZBTEJVRiwgMCkKK2V4dGVybiB2b2lkCitzcGFyYzY0X2V4dHJhY3RfcmV0dXJuX3ZhbHVlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIGNoYXIgW10sIGNoYXIgKiwgaW50KSk7CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3NwYXJjL3RtLXNwNjRzaW0uaCBiL2dkYi9jb25maWcvc3BhcmMvdG0tc3A2NHNpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NDVmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NwYXJjL3RtLXNwNjRzaW0uaApAQCAtMCwwICsxLDUwIEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgR0RCIHdpdGggdGhlIFNQQVJDNjQgU2ltdWxhdG9yLgorICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogPz8/IFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0bS1zcGMtZW0uaC4gIE91ciBjb250ZW50cyBhcmUgcHJvYmFibHkgYm9ndXMKKyAgIGJ1dCBpdCdzIGEgZ29vZCBzdGFydC4gICovCisKKyNpbmNsdWRlICJzcGFyYy90bS1zcDY0LmgiCisjaW5jbHVkZSAidG0tc3Vub3MuaCIKKworLyogT2Zmc2V0cyBpbnRvIGptcF9idWYuICBOb3QgZGVmaW5lZCBieSBTdW4sIGJ1dCBhdCBsZWFzdCBkb2N1bWVudGVkIGluIGEKKyAgIGNvbW1lbnQgaW4gPG1hY2hpbmUvc2V0am1wLmg+ISAqLworCisjZGVmaW5lIEpCX0VMRU1FTlRfU0laRSA4CS8qIFNpemUgb2YgZWFjaCBlbGVtZW50IGluIGptcF9idWYgKi8KKworI2RlZmluZSBKQl9PTlNTVEFDSyAwCisjZGVmaW5lIEpCX1NJR01BU0sgMQorI2RlZmluZSBKQl9TUCAyCisjZGVmaW5lIEpCX1BDIDMKKyNkZWZpbmUgSkJfTlBDIDQKKyNkZWZpbmUgSkJfUFNSIDUKKyNkZWZpbmUgSkJfRzEgNgorI2RlZmluZSBKQl9PMCA3CisjZGVmaW5lIEpCX1dCQ05UIDgKKworLyogRmlndXJlIG91dCB3aGVyZSB0aGUgbG9uZ2ptcCB3aWxsIGxhbmQuICBXZSBleHBlY3QgdGhhdCB3ZSBoYXZlIGp1c3QgZW50ZXJlZAorICAgbG9uZ2ptcCBhbmQgaGF2ZW4ndCB5ZXQgc2V0dXAgdGhlIHN0YWNrIGZyYW1lLCBzbyB0aGUgYXJncyBhcmUgc3RpbGwgaW4gdGhlCisgICBvdXRwdXQgcmVncy4gICVvMCAoTzBfUkVHTlVNKSBwb2ludHMgYXQgdGhlIGptcF9idWYgc3RydWN0dXJlIGZyb20gd2hpY2ggd2UKKyAgIGV4dHJhY3QgdGhlIHBjIChKQl9QQykgdGhhdCB3ZSB3aWxsIGxhbmQgYXQuICBUaGUgcGMgaXMgY29waWVkIGludG8gQUREUi4KKyAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRydWUgb24gc3VjY2VzcyAqLworCitleHRlcm4gaW50CitnZXRfbG9uZ2ptcF90YXJnZXQgUEFSQU1TICgoQ09SRV9BRERSICopKTsKKworI2RlZmluZSBHRVRfTE9OR0pNUF9UQVJHRVQoQUREUikgZ2V0X2xvbmdqbXBfdGFyZ2V0KEFERFIpCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3NwYXJjL3RtLXNwYXJjLmggYi9nZGIvY29uZmlnL3NwYXJjL3RtLXNwYXJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiZTllMgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvc3BhcmMvdG0tc3BhcmMuaApAQCAtMCwwICsxLDU4NCBAQAorLyogVGFyZ2V0IG1hY2hpbmUgc3ViLXBhcmFtZXRlcnMgZm9yIFNQQVJDLCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgVGhpcyBpcyBpbmNsdWRlZCBieSBvdGhlciB0bS0qLmggZmlsZXMgdG8gZGVmaW5lIFNQQVJDIGNwdS1yZWxhdGVkIGluZm8uCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBNaWNoYWVsIFRpZW1hbm4gKHRpZW1hbm5AbWNjLmNvbSkKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgX19TVERDX18KK3N0cnVjdCBmcmFtZV9pbmZvOworc3RydWN0IHR5cGU7CitzdHJ1Y3QgdmFsdWU7CisjZW5kaWYKKworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUiBCSUdfRU5ESUFOCisKKy8qIEZsb2F0aW5nIHBvaW50IGlzIElFRUUgY29tcGF0aWJsZS4gICovCisjZGVmaW5lIElFRUVfRkxPQVQKKworLyogSWYgYW4gYXJndW1lbnQgaXMgZGVjbGFyZWQgInJlZ2lzdGVyIiwgU3VuIGNjIHdpbGwga2VlcCBpdCBpbiBhIHJlZ2lzdGVyLAorICAgbmV2ZXIgc2F2aW5nIGl0IG9udG8gdGhlIHN0YWNrLiAgU28gd2UgYmV0dGVyIG5vdCBiZWxpZXZlIHRoZSAicCIgc3ltYm9sCisgICBkZXNjcmlwdG9yIHN0YWIuICAqLworCisjZGVmaW5lIFVTRV9SRUdJU1RFUl9OT1RfQVJHCisKKy8qIFdoZW4gcGFzc2luZyBhIHN0cnVjdHVyZSB0byBhIGZ1bmN0aW9uLCBTdW4gY2MgcGFzc2VzIHRoZSBhZGRyZXNzCisgICBub3QgdGhlIHN0cnVjdHVyZSBpdHNlbGYuICBJdCAodW5kZXIgU3VuT1M0KSBjcmVhdGVzIHR3byBzeW1ib2xzLAorICAgd2hpY2ggd2UgbmVlZCB0byBjb21iaW5lIHRvIGEgTE9DX1JFR1BBUk0uICBHY2MgdmVyc2lvbiB0d28gKGFzIG9mCisgICAxLjkyKSBiZWhhdmVzIGxpa2Ugc3VuIGNjLiAgUkVHX1NUUlVDVF9IQVNfQUREUiBpcyBzbWFydCBlbm91Z2ggdG8KKyAgIGRpc3Rpbmd1aXNoIGJldHdlZW4gU3VuIGNjLCBnY2MgdmVyc2lvbiAxIGFuZCBnY2MgdmVyc2lvbiAyLiAgKi8KKworI2RlZmluZSBSRUdfU1RSVUNUX0hBU19BRERSKGdjY19wLHR5cGUpIChnY2NfcCAhPSAxKQorCisvKiBTdW4gL2Jpbi9jYyBnZXRzIHRoaXMgcmlnaHQgYXMgb2YgU3VuT1MgNC4xLnguICBXZSBuZWVkIHRvIGRlZmluZQorICAgQkVMSUVWRV9QQ0NfUFJPTU9USU9OIHRvIGdldCB0aGlzIHJpZ2h0IG5vdyB0aGF0IHRoZSBjb2RlIHdoaWNoCisgICBkZXRlY3RzIGdjYzJfY29tcGlsZWQuIGlzIGJyb2tlbi4gIFRoaXMgbG9zZXMgZm9yIFN1bk9TIDQuMC54IGFuZAorICAgZWFybGllci4gICovCisKKyNkZWZpbmUgQkVMSUVWRV9QQ0NfUFJPTU9USU9OIDEKKworLyogRm9yIGFjYywgdGhlcmUncyBubyBuZWVkIHRvIGNvcnJlY3QgTEJSQUMgZW50cmllcyBieSBndWVzc2luZyBob3cKKyAgIHRoZXkgc2hvdWxkIHdvcmsuICBJbiBmYWN0LCB0aGlzIGlzIGhhcm1mdWwgYmVjYXVzZSB0aGUgTEJSQUMKKyAgIGVudHJpZXMgbm93IGFsbCBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIG5vdCBpbnRlcm1peGVkCisgICB3aXRoIHRoZSBTTElORSBlbnRyaWVzLiAgbl9vcHRfZm91bmQgZGV0ZWN0cyBhY2MgZm9yIFNvbGFyaXMgYmluYXJpZXM7CisgICBmdW5jdGlvbl9zdGFiX3R5cGUgZGV0ZWN0cyBhY2MgZm9yIFN1bk9TNCBiaW5hcmllcy4KKworICAgRm9yIGJpbmFyeSBmcm9tIFN1bk9TNCAvYmluL2NjLCBuZWVkIHRvIGNvcnJlY3QgTEJSQUMncy4KKworICAgRm9yIGdjYywgbGlrZSBhY2MsIGRvbid0IGNvcnJlY3QuICAqLworCisjZGVmaW5lCVNVTl9GSVhFRF9MQlJBQ19CVUcgXAorICAobl9vcHRfZm91bmQgXAorICAgfHwgZnVuY3Rpb25fc3RhYl90eXBlID09IE5fU1RTWU0gXAorICAgfHwgZnVuY3Rpb25fc3RhYl90eXBlID09IE5fR1NZTSBcCisgICB8fCBwcm9jZXNzaW5nX2djY19jb21waWxhdGlvbikKKworLyogRG8gdmFyaWFibGVzIGluIHRoZSBkZWJ1ZyBzdGFicyBvY2N1ciBhZnRlciB0aGUgTl9MQlJBQyBvciBiZWZvcmUgaXQ/CisgICBhY2M6IGFmdGVyLCBnY2M6IGJlZm9yZSwgU3VuT1M0IC9iaW4vY2M6IGJlZm9yZS4gICovCisKKyNkZWZpbmUgVkFSSUFCTEVTX0lOU0lERV9CTE9DSyhkZXNjLCBnY2NfcCkgXAorICAoIShnY2NfcCkgXAorICAgJiYgKG5fb3B0X2ZvdW5kIFwKKyAgICAgICB8fCBmdW5jdGlvbl9zdGFiX3R5cGUgPT0gTl9TVFNZTSBcCisgICAgICAgfHwgZnVuY3Rpb25fc3RhYl90eXBlID09IE5fR1NZTSkpCisKKy8qIE9mZnNldCBmcm9tIGFkZHJlc3Mgb2YgZnVuY3Rpb24gdG8gc3RhcnQgb2YgaXRzIGNvZGUuCisgICBaZXJvIG9uIG1vc3QgbWFjaGluZXMuICAqLworCisjZGVmaW5lIEZVTkNUSU9OX1NUQVJUX09GRlNFVCAwCisKKy8qIEFkdmFuY2UgUEMgYWNyb3NzIGFueSBmdW5jdGlvbiBlbnRyeSBwcm9sb2d1ZSBpbnN0cnVjdGlvbnMKKyAgIHRvIHJlYWNoIHNvbWUgInJlYWwiIGNvZGUuICBTS0lQX1BST0xPR1VFX0ZSQU1FTEVTU19QIGFkdmFuY2VzCisgICB0aGUgUEMgcGFzdCBzb21lIG9mIHRoZSBwcm9sb2d1ZSwgYnV0IHN0b3BzIGFzIHNvb24gYXMgaXQKKyAgIGtub3dzIHRoYXQgdGhlIGZ1bmN0aW9uIGhhcyBhIGZyYW1lLiAgSXRzIHJlc3VsdCBpcyBlcXVhbAorICAgdG8gaXRzIGlucHV0IFBDIGlmIHRoZSBmdW5jdGlvbiBpcyBmcmFtZWxlc3MsIHVuZXF1YWwgb3RoZXJ3aXNlLiAgKi8KKworI2RlZmluZSBTS0lQX1BST0xPR1VFKHBjKSBcCisgIHsgcGMgPSBza2lwX3Byb2xvZ3VlIChwYywgMCk7IH0KKyNkZWZpbmUgU0tJUF9QUk9MT0dVRV9GUkFNRUxFU1NfUChwYykgXAorICB7IHBjID0gc2tpcF9wcm9sb2d1ZSAocGMsIDEpOyB9CitleHRlcm4gQ09SRV9BRERSIHNraXBfcHJvbG9ndWUgUEFSQU1TICgoQ09SRV9BRERSLCBpbnQpKTsKKworLyogSW1tZWRpYXRlbHkgYWZ0ZXIgYSBmdW5jdGlvbiBjYWxsLCByZXR1cm4gdGhlIHNhdmVkIHBjLgorICAgQ2FuJ3QgZ28gdGhyb3VnaCB0aGUgZnJhbWVzIGZvciB0aGlzIGJlY2F1c2Ugb24gc29tZSBtYWNoaW5lcworICAgdGhlIG5ldyBmcmFtZSBpcyBub3Qgc2V0IHVwIHVudGlsIHRoZSBuZXcgZnVuY3Rpb24gZXhlY3V0ZXMKKyAgIHNvbWUgaW5zdHJ1Y3Rpb25zLiAgKi8KKworLyogT24gdGhlIFN1biA0IHVuZGVyIFN1bk9TLCB0aGUgY29tcGlsZSB3aWxsIGxlYXZlIGEgZmFrZSBpbnNuIHdoaWNoCisgICBlbmNvZGVzIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBiZWluZyByZXR1cm5lZC4gIElmIHdlIGRldGVjdCBzdWNoCisgICBhIGZha2UgaW5zbiwgc3RlcCBwYXN0IGl0LiAgKi8KKworI2RlZmluZSBQQ19BREpVU1QocGMpIHNwYXJjX3BjX2FkanVzdChwYykKK2V4dGVybiBDT1JFX0FERFIgc3BhcmNfcGNfYWRqdXN0IFBBUkFNUyAoKENPUkVfQUREUikpOworCisjZGVmaW5lIFNBVkVEX1BDX0FGVEVSX0NBTEwoZnJhbWUpIFBDX0FESlVTVCAocmVhZF9yZWdpc3RlciAoUlBfUkVHTlVNKSkKKworLyogU3RhY2sgZ3Jvd3MgZG93bndhcmQuICAqLworCisjZGVmaW5lIElOTkVSX1RIQU4obGhzLHJocykgKChsaHMpIDwgKHJocykpCisKKy8qIFN0YWNrIG11c3QgYmUgYWxpZ25lZCBvbiA2NC1iaXQgYm91bmRhcmllcyB3aGVuIHN5bnRoZXNpemluZworICAgZnVuY3Rpb24gY2FsbHMuICovCisKKyNkZWZpbmUgU1RBQ0tfQUxJR04oQUREUikgKCgoQUREUikgKyA3KSAmIC04KQorCisvKiBTZXF1ZW5jZSBvZiBieXRlcyBmb3IgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiAodGEgMSkuICovCisKKyNkZWZpbmUgQlJFQUtQT0lOVCB7MHg5MSwgMHhkMCwgMHgyMCwgMHgwMX0KKworLyogQW1vdW50IFBDIG11c3QgYmUgZGVjcmVtZW50ZWQgYnkgYWZ0ZXIgYSBicmVha3BvaW50LgorICAgVGhpcyBpcyBvZnRlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIEJSRUFLUE9JTlQKKyAgIGJ1dCBub3QgYWx3YXlzLiAgKi8KKworI2RlZmluZSBERUNSX1BDX0FGVEVSX0JSRUFLIDAKKworLyogU2F5IGhvdyBsb25nIChvcmRpbmFyeSkgcmVnaXN0ZXJzIGFyZS4gIFRoaXMgaXMgYSBwaWVjZSBvZiBib2dvc2l0eQorICAgdXNlZCBpbiBwdXNoX3dvcmQgYW5kIGEgZmV3IG90aGVyIHBsYWNlczsgUkVHSVNURVJfUkFXX1NJWkUgaXMgdGhlCisgICByZWFsIHdheSB0byBrbm93IGhvdyBiaWcgYSByZWdpc3RlciBpcy4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfU0laRSA0CisKKy8qIE51bWJlciBvZiBtYWNoaW5lIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIE5VTV9SRUdTIDcyCisKKy8qIEluaXRpYWxpemVyIGZvciBhbiBhcnJheSBvZiBuYW1lcyBvZiByZWdpc3RlcnMuCisgICBUaGVyZSBzaG91bGQgYmUgTlVNX1JFR1Mgc3RyaW5ncyBpbiB0aGlzIGluaXRpYWxpemVyLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyAgXAoreyAiZzAiLCAiZzEiLCAiZzIiLCAiZzMiLCAiZzQiLCAiZzUiLCAiZzYiLCAiZzciLAlcCisgICJvMCIsICJvMSIsICJvMiIsICJvMyIsICJvNCIsICJvNSIsICJzcCIsICJvNyIsCVwKKyAgImwwIiwgImwxIiwgImwyIiwgImwzIiwgImw0IiwgImw1IiwgImw2IiwgImw3IiwJXAorICAiaTAiLCAiaTEiLCAiaTIiLCAiaTMiLCAiaTQiLCAiaTUiLCAiZnAiLCAiaTciLAlcCisJCQkJCQkJCVwKKyAgImYwIiwgImYxIiwgImYyIiwgImYzIiwgImY0IiwgImY1IiwgImY2IiwgImY3IiwJXAorICAiZjgiLCAiZjkiLCAiZjEwIiwgImYxMSIsICJmMTIiLCAiZjEzIiwgImYxNCIsICJmMTUiLAlcCisgICJmMTYiLCAiZjE3IiwgImYxOCIsICJmMTkiLCAiZjIwIiwgImYyMSIsICJmMjIiLCAiZjIzIiwJXAorICAiZjI0IiwgImYyNSIsICJmMjYiLCAiZjI3IiwgImYyOCIsICJmMjkiLCAiZjMwIiwgImYzMSIsCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ5IiwgInBzciIsICJ3aW0iLCAidGJyIiwgInBjIiwgIm5wYyIsICJmcHNyIiwgImNwc3IiIH0KKworLyogUmVnaXN0ZXIgbnVtYmVycyBvZiB2YXJpb3VzIGltcG9ydGFudCByZWdpc3RlcnMuCisgICBOb3RlIHRoYXQgc29tZSBvZiB0aGVzZSB2YWx1ZXMgYXJlICJyZWFsIiByZWdpc3RlciBudW1iZXJzLAorICAgYW5kIGNvcnJlc3BvbmQgdG8gdGhlIGdlbmVyYWwgcmVnaXN0ZXJzIG9mIHRoZSBtYWNoaW5lLAorICAgYW5kIHNvbWUgYXJlICJwaG9ueSIgcmVnaXN0ZXIgbnVtYmVycyB3aGljaCBhcmUgdG9vIGxhcmdlCisgICB0byBiZSBhY3R1YWwgcmVnaXN0ZXIgbnVtYmVycyBhcyBmYXIgYXMgdGhlIHVzZXIgaXMgY29uY2VybmVkCisgICBidXQgZG8gc2VydmUgdG8gZ2V0IHRoZSBkZXNpcmVkIHZhbHVlcyB3aGVuIHBhc3NlZCB0byByZWFkX3JlZ2lzdGVyLiAgKi8KKworI2RlZmluZQlHMF9SRUdOVU0gMCAgICAgICAgICAgICAvKiAlZzAgKi8KKyNkZWZpbmUJRzFfUkVHTlVNIDEJCS8qICVnMSAqLworI2RlZmluZSBPMF9SRUdOVU0gOAkJLyogJW8wICovCisjZGVmaW5lCVNQX1JFR05VTSAxNAkJLyogQ29udGFpbnMgYWRkcmVzcyBvZiB0b3Agb2Ygc3RhY2ssIFwKKwkJCQkgICB3aGljaCBpcyBhbHNvIHRoZSBib3R0b20gb2YgdGhlIGZyYW1lLiAgKi8KKyNkZWZpbmUJUlBfUkVHTlVNIDE1CQkvKiBDb250YWlucyByZXR1cm4gYWRkcmVzcyB2YWx1ZSwgKmJlZm9yZSogXAorCQkJCSAgIGFueSB3aW5kb3dzIGdldCBzd2l0Y2hlZC4gICovCisjZGVmaW5lCU83X1JFR05VTSAxNQkJLyogTGFzdCBsb2NhbCByZWcgbm90IHNhdmVkIG9uIHN0YWNrIGZyYW1lICovCisjZGVmaW5lCUwwX1JFR05VTSAxNgkJLyogRmlyc3QgbG9jYWwgcmVnIHRoYXQncyBzYXZlZCBvbiBzdGFjayBmcmFtZQorCQkJCSAgIHJhdGhlciB0aGFuIGluIG1hY2hpbmUgcmVnaXN0ZXJzICovCisjZGVmaW5lCUkwX1JFR05VTSAyNAkJLyogJWkwICovCisjZGVmaW5lCUZQX1JFR05VTSAzMAkJLyogQ29udGFpbnMgYWRkcmVzcyBvZiBleGVjdXRpbmcgc3RhY2sgZnJhbWUgKi8KKyNkZWZpbmUJSTdfUkVHTlVNIDMxCQkvKiBMYXN0IGxvY2FsIHJlZyBzYXZlZCBvbiBzdGFjayBmcmFtZSAqLworI2RlZmluZQlGUDBfUkVHTlVNIDMyCQkvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlciAwICovCisjZGVmaW5lCVlfUkVHTlVNIDY0CQkvKiBUZW1wIHJlZ2lzdGVyIGZvciBtdWx0aXBsaWNhdGlvbiwgZXRjLiAgKi8KKyNkZWZpbmUJUFNfUkVHTlVNIDY1CQkvKiBDb250YWlucyBwcm9jZXNzb3Igc3RhdHVzICovCisjZGVmaW5lIFBTX0ZMQUdfQ0FSUlkgMHgxMDAwMDAJLyogQ2FycnkgYml0IGluIFBTICovCisjZGVmaW5lCVdJTV9SRUdOVU0gNjYJCS8qIFdpbmRvdyBJbnZhbGlkIE1hc2sgKG5vdCByZWFsbHkgc3VwcG9ydGVkKSAqLworI2RlZmluZQlUQlJfUkVHTlVNIDY3CQkvKiBUcmFwIEJhc2UgUmVnaXN0ZXIgKG5vdCByZWFsbHkgc3VwcG9ydGVkKSAqLworI2RlZmluZQlQQ19SRUdOVU0gNjgJCS8qIENvbnRhaW5zIHByb2dyYW0gY291bnRlciAqLworI2RlZmluZQlOUENfUkVHTlVNIDY5ICAgICAgICAgICAvKiBDb250YWlucyBuZXh0IFBDICovCisjZGVmaW5lCUZQU19SRUdOVU0gNzAJCS8qIEZsb2F0aW5nIHBvaW50IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZQlDUFNfUkVHTlVNIDcxCQkvKiBDb3Byb2Nlc3NvciBzdGF0dXMgcmVnaXN0ZXIgKi8KKworLyogVG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCB0byBzdG9yZSBvdXIgY29waWVzIG9mIHRoZSBtYWNoaW5lJ3MKKyAgIHJlZ2lzdGVyIHN0YXRlLCB0aGUgYXJyYXkgYHJlZ2lzdGVycycuICBPbiB0aGUgc3BhcmMsIGByZWdpc3RlcnMnCisgICBjb250YWlucyB0aGUgaW5zIGFuZCBsb2NhbHMsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHNhdmVkIG9uIHRoZQorICAgc3RhY2sgcmF0aGVyIHRoYW4gd2l0aCB0aGUgb3RoZXIgcmVnaXN0ZXJzLCBhbmQgdGhpcyBjYXVzZXMgaGFpcgorICAgYW5kIGNvbmZ1c2lvbiBpbiBwbGFjZXMgbGlrZSBwb3BfZnJhbWUuICBJdCBtaWdodCBiZQorICAgYmV0dGVyIHRvIHJlbW92ZSB0aGUgaW5zIGFuZCBsb2NhbHMgZnJvbSBgcmVnaXN0ZXJzJywgbWFrZSBzdXJlCisgICB0aGF0IGdldF9zYXZlZF9yZWdpc3RlciBjYW4gZ2V0IHRoZW0gZnJvbSB0aGUgc3RhY2sgKGV2ZW4gaW4gdGhlCisgICBpbm5lcm1vc3QgZnJhbWUpLCBhbmQgbWFrZSB0aGlzIHRoZSB3YXkgdG8gYWNjZXNzIHRoZW0uICBGb3IgdGhlCisgICBmcmFtZSBwb2ludGVyIHdlIHdvdWxkIGRvIHRoYXQgdmlhIFRBUkdFVF9SRUFEX0ZQLiAgT24gdGhlIG90aGVyIGhhbmQsCisgICB0aGF0IGlzIGxpa2VseSB0byBiZSBjb25mdXNpbmcgb3Igd29yc2UgZm9yIGZsYXQgZnJhbWVzLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9CWVRFUyAoMzIqNCszMio0KzgqNCkKKworLyogSW5kZXggd2l0aGluIGByZWdpc3RlcnMnIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzcGFjZSBmb3IKKyAgIHJlZ2lzdGVyIE4uICAqLworLyogPz8gKi8KKyNkZWZpbmUgUkVHSVNURVJfQllURShOKSAgKChOKSo0KQorCisvKiBXZSBuZWVkIHRvIG92ZXJyaWRlIEdFVF9TQVZFRF9SRUdJU1RFUiBzbyB0aGF0IHdlIGNhbiBkZWFsIHdpdGggdGhlIHdheQorICAgb3V0cyBjaGFuZ2UgaW50byBpbnMgaW4gZGlmZmVyZW50IGZyYW1lcy4gIEhBVkVfUkVHSVNURVJfV0lORE9XUyBjYW4ndAorICAgZGVhbCB3aXRoIHRoaXMgY2FzZSBhbmQgYWxzbyBoYW5kbGUgZmxhdCBmcmFtZXMgYXQgdGhlIHNhbWUgdGltZS4gICovCisKKyNkZWZpbmUgR0VUX1NBVkVEX1JFR0lTVEVSIDEKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIGFjdHVhbCBtYWNoaW5lIHJlcHJlc2VudGF0aW9uCisgICBmb3IgcmVnaXN0ZXIgTi4gICovCisKKy8qIE9uIHRoZSBTUEFSQywgYWxsIHJlZ3MgYXJlIDQgYnl0ZXMuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pICg0KQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgcHJvZ3JhbSdzIHJlcHJlc2VudGF0aW9uCisgICBmb3IgcmVnaXN0ZXIgTi4gICovCisKKy8qIE9uIHRoZSBTUEFSQywgYWxsIHJlZ3MgYXJlIDQgYnl0ZXMuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfU0laRShOKSAoNCkKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9SQVdfU0laRSBjYW4gaGF2ZS4gICovCisKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1JBV19TSVpFIDgKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUgOAorCisvKiBSZXR1cm4gdGhlIEdEQiB0eXBlIG9iamVjdCBmb3IgdGhlICJzdGFuZGFyZCIgZGF0YSB0eXBlCisgICBvZiBkYXRhIGluIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRShOKSBcCisgKChOKSA8IDMyID8gYnVpbHRpbl90eXBlX2ludCA6IChOKSA8IDY0ID8gYnVpbHRpbl90eXBlX2Zsb2F0IDogXAorICBidWlsdGluX3R5cGVfaW50KQorCisvKiBXcml0aW5nIHRvICVnMCBpcyBhIG5vb3AgKG5vdCBhbiBlcnJvciBvciBleGNlcHRpb24gb3IgYW55dGhpbmcgbGlrZQorICAgdGhhdCwgaG93ZXZlcikuICAqLworCisjZGVmaW5lIENBTk5PVF9TVE9SRV9SRUdJU1RFUihyZWdubykgKChyZWdubykgPT0gRzBfUkVHTlVNKQorCisvKiBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUgcGxhY2UgaW4gd2hpY2ggdG8gY29weSB0aGUgc3RydWN0dXJlIHRoZQorICAgc3Vicm91dGluZSB3aWxsIHJldHVybi4gIFRoaXMgaXMgY2FsbGVkIGZyb20gY2FsbF9mdW5jdGlvbl9ieV9oYW5kLiAKKyAgIFRoZSB1bHRpbWF0ZSBteXN0ZXJ5IGlzLCB0aG8sIHdoYXQgaXMgdGhlIHZhbHVlICIxNiI/ICAqLworCisjZGVmaW5lIFNUT1JFX1NUUlVDVF9SRVRVUk4oQUREUiwgU1ApIFwKKyAgeyBjaGFyIHZhbFs0XTsgXAorICAgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKHZhbCwgNCwgKEFERFIpKTsgXAorICAgIHdyaXRlX21lbW9yeSAoKFNQKSsoMTYqNCksIHZhbCwgNCk7IH0KKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgb2YgdHlwZSBUWVBFLCBhbmQgY29weSB0aGF0LCBpbiB2aXJ0dWFsIGZvcm1hdCwKKyAgIGludG8gVkFMQlVGLiAgKi8KKworI2RlZmluZSBFWFRSQUNUX1JFVFVSTl9WQUxVRShUWVBFLFJFR0JVRixWQUxCVUYpIFwKKyAgc3BhcmNfZXh0cmFjdF9yZXR1cm5fdmFsdWUoVFlQRSwgUkVHQlVGLCBWQUxCVUYpCitleHRlcm4gdm9pZAorc3BhcmNfZXh0cmFjdF9yZXR1cm5fdmFsdWUgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciBbXSwgY2hhciAqKSk7CisKKy8qIFdyaXRlIGludG8gYXBwcm9wcmlhdGUgcmVnaXN0ZXJzIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlCisgICBvZiB0eXBlIFRZUEUsIGdpdmVuIGluIHZpcnR1YWwgZm9ybWF0LiAgKi8KKyNkZWZpbmUgU1RPUkVfUkVUVVJOX1ZBTFVFKFRZUEUsVkFMQlVGKSBcCisgIHNwYXJjX3N0b3JlX3JldHVybl92YWx1ZShUWVBFLCBWQUxCVUYpCitleHRlcm4gdm9pZCBzcGFyY19zdG9yZV9yZXR1cm5fdmFsdWUgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqKSk7CisKKy8qIEV4dHJhY3QgZnJvbSBhbiBhcnJheSBSRUdCVUYgY29udGFpbmluZyB0aGUgKHJhdykgcmVnaXN0ZXIgc3RhdGUKKyAgIHRoZSBhZGRyZXNzIGluIHdoaWNoIGEgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBpdHMgc3RydWN0dXJlIHZhbHVlLAorICAgYXMgYSBDT1JFX0FERFIgKG9yIGFuIGV4cHJlc3Npb24gdGhhdCBjYW4gYmUgdXNlZCBhcyBvbmUpLiAgKi8KKworI2RlZmluZSBFWFRSQUNUX1NUUlVDVF9WQUxVRV9BRERSRVNTKFJFR0JVRikgXAorICAoc3BhcmNfZXh0cmFjdF9zdHJ1Y3RfdmFsdWVfYWRkcmVzcyAoUkVHQlVGKSkKKworZXh0ZXJuIENPUkVfQUREUgorc3BhcmNfZXh0cmFjdF9zdHJ1Y3RfdmFsdWVfYWRkcmVzcyBQQVJBTVMgKChjaGFyIFtSRUdJU1RFUl9CWVRFU10pKTsKKworDAorLyogRGVzY3JpYmUgdGhlIHBvaW50ZXIgaW4gZWFjaCBzdGFjayBmcmFtZSB0byB0aGUgcHJldmlvdXMgc3RhY2sgZnJhbWUKKyAgIChpdHMgY2FsbGVyKS4gICovCisKKy8qIEZSQU1FX0NIQUlOIHRha2VzIGEgZnJhbWUncyBub21pbmFsIGFkZHJlc3MKKyAgIGFuZCBwcm9kdWNlcyB0aGUgZnJhbWUncyBjaGFpbi1wb2ludGVyLiAqLworCisvKiBJbiB0aGUgY2FzZSBvZiB0aGUgU3VuIDQsIHRoZSBmcmFtZS1jaGFpbidzIG5vbWluYWwgYWRkcmVzcworICAgaXMgaGVsZCBpbiB0aGUgZnJhbWUgcG9pbnRlciByZWdpc3Rlci4KKworICAgT24gdGhlIFN1bjQsIHRoZSBmcmFtZSAoaW4gJWZwKSBpcyAlc3AgZm9yIHRoZSBwcmV2aW91cyBmcmFtZS4KKyAgIEZyb20gdGhlIHByZXZpb3VzIGZyYW1lJ3MgJXNwLCB3ZSBjYW4gZmluZCB0aGUgcHJldmlvdXMgZnJhbWUncworICAgJWZwOiBpdCBpcyBpbiB0aGUgc2F2ZSBhcmVhIGp1c3QgYWJvdmUgdGhlIHByZXZpb3VzIGZyYW1lJ3MgJXNwLgorCisgICBJZiB3ZSBhcmUgc2V0dGluZyB1cCBhbiBhcmJpdHJhcnkgZnJhbWUsIHdlJ2xsIG5lZWQgdG8ga25vdyB3aGVyZQorICAgaXQgZW5kcy4gIEhlbmNlIHRoZSBmb2xsb3dpbmcuICBUaGlzIHBhcnQgb2YgdGhlIGZyYW1lIGNhY2hlCisgICBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGNoZWNrZWQgYmVmb3JlIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGlzIGZyYW1lJ3MKKyAgIGJvdHRvbSBpcyBpbiB0aGUgc3RhY2sgcG9pbnRlci4KKworICAgSWYgdGhlcmUgaXNuJ3QgYSBmcmFtZSBiZWxvdyB0aGlzIG9uZSwgdGhlIGJvdHRvbSBvZiB0aGlzIGZyYW1lIGlzCisgICBpbiB0aGUgc3RhY2sgcG9pbnRlci4KKworICAgSWYgdGhlcmUgaXMgYSBmcmFtZSBiZWxvdyB0aGlzIG9uZSwgYW5kIHRoZSBmcmFtZSBwb2ludGVycyBhcmUKKyAgIGlkZW50aWNhbCwgaXQncyBhIGxlYWYgZnJhbWUgYW5kIHRoZSBib3R0b21zIGFyZSB0aGUgc2FtZSBhbHNvLgorCisgICBPdGhlcndpc2UgdGhlIGJvdHRvbSBvZiB0aGlzIGZyYW1lIGlzIHRoZSB0b3Agb2YgdGhlIG5leHQgZnJhbWUuCisKKyAgIFRoZSBib3R0b20gZmllbGQgaXMgbWlzbmFtZWQsIHNpbmNlIGl0IG1pZ2h0IGltcGx5IHRoYXQgbWVtb3J5IGZyb20KKyAgIGJvdHRvbSB0byBmcmFtZSBjb250YWlucyB0aGlzIGZyYW1lLiAgVGhhdCBuZWVkIG5vdCBiZSB0cnVlIGlmCisgICBzdGFjayBmcmFtZXMgYXJlIGFsbG9jYXRlZCBpbiBkaWZmZXJlbnQgc2VnbWVudHMgKGUuZy4gc29tZSBvbiBhCisgICBzdGFjaywgc29tZSBvbiBhIGhlYXAgaW4gdGhlIGRhdGEgc2VnbWVudCkuCisKKyAgIEdDQyAyLjYgYW5kIGxhdGVyIGNhbiBnZW5lcmF0ZSBgYGZsYXQgcmVnaXN0ZXIgd2luZG93JycgY29kZSB0aGF0CisgICBtYWtlcyBmcmFtZXMgYnkgZXhwbGljaXRseSBzYXZpbmcgdGhvc2UgcmVnaXN0ZXJzIHRoYXQgbmVlZCB0byBiZQorICAgc2F2ZWQuICAlaTcgaXMgdXNlZCBhcyB0aGUgZnJhbWUgcG9pbnRlciwgYW5kIHRoZSBmcmFtZSBpcyBsYWlkIG91dCBzbworICAgdGhhdCBmbGF0IGFuZCBub24tZmxhdCBjYWxscyBjYW4gYmUgaW50ZXJtaXhlZCBmcmVlbHkgd2l0aGluIGEKKyAgIHByb2dyYW0uICBVbmZvcnR1bmF0ZWx5IGZvciBHREIsIHRoaXMgbWVhbnMgaXQgbXVzdCBkZXRlY3QgYW5kIHJlY29yZAorICAgdGhlIGZsYXRuZXNzIG9mIGZyYW1lcy4KKworICAgU2luY2UgdGhlIHByb2xvZ3VlIGluIGEgZmxhdCBmcmFtZSBhbHNvIHRlbGxzIHVzIHdoZXJlIGZwIGFuZCBwYworICAgaGF2ZSBiZWVuIHN0YXNoZWQgKHRoZSBmcmFtZSBpcyBvZiB2YXJpYWJsZSBzaXplLCBzbyB0aGVpciBsb2NhdGlvbgorICAgaXMgbm90IGZpeGVkKSwgaXQncyBjb252ZW5pZW50IHRvIHJlY29yZCB0aGVtIGluIHRoZSBmcmFtZSBpbmZvLiAgKi8KKworI2RlZmluZSBFWFRSQV9GUkFNRV9JTkZPICBcCisgIENPUkVfQUREUiBib3R0b207ICBcCisgIGludCBpbl9wcm9sb2d1ZTsgXAorICBpbnQgZmxhdDsgIFwKKyAgLyogRm9sbG93aW5nIGZpZWxkcyBvbmx5IHJlbGV2YW50IGZvciBmbGF0IGZyYW1lcy4gICovIFwKKyAgQ09SRV9BRERSIHBjX2FkZHI7ICBcCisgIENPUkVfQUREUiBmcF9hZGRyOyAgXAorICAvKiBBZGQgdGhpcyB0byAtPmZyYW1lIHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIHN0YWNrIHBvaW50ZXIgYXQgdGhlICovIFwKKyAgLyogdGltZSBvZiB0aGUgcmVnaXN0ZXIgc2F2ZXMuICAqLyBcCisgIGludCBzcF9vZmZzZXQ7CisKKyNkZWZpbmUgRlJBTUVfSU5JVF9TQVZFRF9SRUdTKGZwKSAvKm5vLW9wKi8KKworI2RlZmluZSBJTklUX0VYVFJBX0ZSQU1FX0lORk8oZnJvbWxlYWYsIGZjaSkgXAorICBzcGFyY19pbml0X2V4dHJhX2ZyYW1lX2luZm8gKGZyb21sZWFmLCBmY2kpCitleHRlcm4gdm9pZCBzcGFyY19pbml0X2V4dHJhX2ZyYW1lX2luZm8gUEFSQU1TKChpbnQsIHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworI2RlZmluZQlQUklOVF9FWFRSQV9GUkFNRV9JTkZPKGZpKSBcCisgIHsgXAorICAgIGlmICgoZmkpICYmIChmaSktPmZsYXQpIFwKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiBmbGF0LCBwYyBzYXZlZCBhdCAweCV4LCBmcCBzYXZlZCBhdCAweCV4XG4iLCBcCisgICAgICAgICAgICAgICAgICAgICAgIChmaSktPnBjX2FkZHIsIChmaSktPmZwX2FkZHIpOyBcCisgIH0KKworI2RlZmluZSBGUkFNRV9DSEFJTih0aGlzZnJhbWUpIChzcGFyY19mcmFtZV9jaGFpbiAodGhpc2ZyYW1lKSkKK2V4dGVybiBDT1JFX0FERFIgc3BhcmNfZnJhbWVfY2hhaW4gUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworCisvKiBJTklUX0VYVFJBX0ZSQU1FX0lORk8gbmVlZHMgdGhlIFBDIHRvIGRldGVjdCBmbGF0IGZyYW1lcy4gICovCisKKyNkZWZpbmUJSU5JVF9GUkFNRV9QQyhmcm9tbGVhZiwgcHJldikgLyogbm90aGluZyAqLworI2RlZmluZSBJTklUX0ZSQU1FX1BDX0ZJUlNUKGZyb21sZWFmLCBwcmV2KSBcCisgIChwcmV2KS0+cGMgPSAoKGZyb21sZWFmKSA/IFNBVkVEX1BDX0FGVEVSX0NBTEwgKChwcmV2KS0+bmV4dCkgOiBcCisJICAgICAgKHByZXYpLT5uZXh0ID8gRlJBTUVfU0FWRURfUEMgKChwcmV2KS0+bmV4dCkgOiByZWFkX3BjICgpKTsKKworLyogRGVmaW5lIG90aGVyIGFzcGVjdHMgb2YgdGhlIHN0YWNrIGZyYW1lLiAgKi8KKworLyogQSBtYWNybyB0aGF0IHRlbGxzIHVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGludm9jYXRpb24gcmVwcmVzZW50ZWQKKyAgIGJ5IEZJIGRvZXMgbm90IGhhdmUgYSBmcmFtZSBvbiB0aGUgc3RhY2sgYXNzb2NpYXRlZCB3aXRoIGl0LiAgSWYgaXQKKyAgIGRvZXMgbm90LCBGUkFNRUxFU1MgaXMgc2V0IHRvIDEsIGVsc2UgMC4gICovCisjZGVmaW5lIEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OKEZJLCBGUkFNRUxFU1MpIFwKKyAgKEZSQU1FTEVTUykgPSBmcmFtZWxlc3NfbG9va19mb3JfcHJvbG9ndWUoRkkpCisKKy8qIFRoZSBsb2NhdGlvbiBvZiBJMCB3LnIudCBTUC4gIFRoaXMgaXMgYWN0dWFsbHkgZGVwZW5kZW50IG9uIGhvdyB0aGUgc3lzdGVtJ3MKKyAgIHdpbmRvdyBvdmVyZmxvdy91bmRlcmZsb3cgcm91dGluZXMgYXJlIHdyaXR0ZW4uICBNb3N0IHZlbmRvcnMgc2F2ZSB0aGUgTCByZWdzCisgICBmb2xsb3dlZCBieSB0aGUgSSByZWdzIChhdCB0aGUgaGlnaGVyIGFkZHJlc3MpLiAgU29tZSB2ZW5kb3JzIGdldCBpdCB3cm9uZy4KKyAqLworCisjZGVmaW5lCUZSQU1FX1NBVkVEX0wwCTAKKyNkZWZpbmUJRlJBTUVfU0FWRURfSTAJKDggKiBSRUdJU1RFUl9SQVdfU0laRSAoTDBfUkVHTlVNKSkKKworLyogV2hlcmUgaXMgdGhlIFBDIGZvciBhIHNwZWNpZmljIGZyYW1lICovCisKKyNkZWZpbmUgRlJBTUVfU0FWRURfUEMoRlJBTUUpIHNwYXJjX2ZyYW1lX3NhdmVkX3BjIChGUkFNRSkKK2V4dGVybiBDT1JFX0FERFIgc3BhcmNfZnJhbWVfc2F2ZWRfcGMgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworCisvKiBJZiB0aGUgYXJndW1lbnQgaXMgb24gdGhlIHN0YWNrLCBpdCB3aWxsIGJlIGhlcmUuICAqLworI2RlZmluZSBGUkFNRV9BUkdTX0FERFJFU1MoZmkpICgoZmkpLT5mcmFtZSkKKworI2RlZmluZSBGUkFNRV9TVFJVQ1RfQVJHU19BRERSRVNTKGZpKSAoKGZpKS0+ZnJhbWUpCisKKyNkZWZpbmUgRlJBTUVfTE9DQUxTX0FERFJFU1MoZmkpICgoZmkpLT5mcmFtZSkKKworLyogU2V0IFZBTCB0byB0aGUgbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvIGZyYW1lIGRlc2NyaWJlZCBieSBGSS4KKyAgIENhbiBzZXQgVkFMIHRvIC0xLCBtZWFuaW5nIG5vIHdheSB0byB0ZWxsLiAgKi8KKworLyogV2UgY2FuJ3QgdGVsbCBob3cgbWFueSBhcmdzIHRoZXJlIGFyZQorICAgbm93IHRoYXQgdGhlIEMgY29tcGlsZXIgZGVsYXlzIHBvcHBpbmcgdGhlbS4gICovCisjZGVmaW5lIEZSQU1FX05VTV9BUkdTKHZhbCxmaSkgKHZhbCA9IC0xKQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGF0IHN0YXJ0IG9mIGFyZ2xpc3QgdGhhdCBhcmUgbm90IHJlYWxseSBhcmdzLiAgKi8KKworI2RlZmluZSBGUkFNRV9BUkdTX1NLSVAgNjgKKwwKKy8qIFRoaW5ncyBuZWVkZWQgZm9yIG1ha2luZyB0aGUgaW5mZXJpb3IgY2FsbCBmdW5jdGlvbnMuICAqLworLyoKKyAqIEZpcnN0IG9mIGFsbCwgbGV0IG1lIGdpdmUgbXkgb3BpbmlvbiBvZiB3aGF0IHRoZSBEVU1NWV9GUkFNRQorICogYWN0dWFsbHkgbG9va3MgbGlrZS4KKyAqCisgKiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICsgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSArPC0tIGZwIChsZXZlbCAwKQorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICB8ICBGcmFtZSBvZiBpbm5lcm1vc3QgcHJvZ3JhbSAgICAgfAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICBmdW5jdGlvbiAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDwtLSBzcCAobGV2ZWwgMCksIGZwIChjKQorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgIERVTU1ZICAgICB8ICAgICAgICAgICAgIGZwMC0zMSAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAgICAgfDwtLSBmcCAtIDB4ODAKKyAqICAgICBGUkFNRSAgICAgfCAgICAgICAgICAgICAgZzAtNyAgICAgICAgICAgICAgIHw8LS0gZnAgLSAweGEwCisgKiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIGkwLTcgICAgICAgICAgICAgICB8PC0tIGZwIC0gMHhjMAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgIG90aGVyICAgICAgICAgICAgICAgfDwtLSBmcCAtIDB4ZTAKKyAqICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgID8gICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgID8gICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8LS0gc3AnID0gZnAgLSAweDE0MAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogeGN1dGlvbiBzdGFydCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogc3AnICsgMHg5NCAtLT58ICAgICAgICBDQUxMX0RVTU1ZICh4IGNvZGUpICAgICAgfAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDwtLSBzcCcnID0gZnAgLSAweDIwMAorICogICAgICAgICAgICAgICB8ICBhbGlnbiBzcCB0byA4IGJ5dGUgYm91bmRhcnkgICAgfAorICogICAgICAgICAgICAgICB8ICAgICA9PT4gYXJncyB0byBmbiA8PT0gICAgICAgICAgfAorICogIFJvb20gZm9yICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogaSAmIGwncyArIGFnZyB8IENBTExfRFVNTVlfU1RBQ0tfQURKVVNUID0gMHgweDQ0fAorICogICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDwtLSBmaW5hbCBzcCAodmFyaWFibGUpCisgKiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgIHwgICBXaGVyZSBmdW5jdGlvbiBjYWxsZWQgd2lsbCAgICB8CisgKiAgICAgICAgICAgICAgIHwgICAgICAgICAgIGJ1aWxkIGZyYW1lLiAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKgorICogICBJIHVuZGVyc3RhbmQgZXZlcnl0aGluZyBpbiB0aGlzIHBpY3R1cmUgZXhjZXB0IHdoYXQgdGhlIHNwYWNlCisgKiBiZXR3ZWVuIGZwIC0gMHhlMCBhbmQgZnAgLSAweDE0MCBpcyB1c2VkIGZvci4gIE9oLCBhbmQgSSBkb24ndAorICogdW5kZXJzdGFuZCB3aHkgdGhlcmUncyBhIGxhcmdlIGNodW5rIG9mIENBTExfRFVNTVkgdGhhdCBuZXZlciBnZXRzCisgKiBleGVjdXRlZCAoaXRzIGZ1bmN0aW9uIGlzIHN1cGVyY2VlZGVkIGJ5IFBVU0hfRFVNTVlfRlJBTUU7IHRoZXkKKyAqIGFyZSBkZXNpZ25lZCB0byBkbyB0aGUgc2FtZSB0aGluZykuCisgKgorICogICBQVVNIX0RVTU1ZX0ZSQU1FIHNhdmVzIHRoZSByZWdpc3RlcnMgYWJvdmUgc3AnIGFuZCBwdXNoZXMgdGhlCisgKiByZWdpc3RlciBmaWxlIHN0YWNrIGRvd24gb25lLgorICoKKyAqICAgY2FsbF9mdW5jdGlvbiB0aGVuIHdyaXRlcyBDQUxMX0RVTU1ZLCBwdXNoZXMgdGhlIGFyZ3Mgb250byB0aGUKKyAqIHN0YWNrLCBhbmQgYWRqdXN0cyB0aGUgc3RhY2sgcG9pbnRlci4KKyAqCisgKiAgIHJ1bl9zdGFja19kdW1teSB0aGVuIHN0YXJ0cyBleGVjdXRpb24gKGluIHRoZSBtaWRkbGUgb2YKKyAqIENBTExfRFVNTVksIGFzIGRpcmVjdGVkIGJ5IGNhbGxfZnVuY3Rpb24pLgorICovCisKKy8qIFB1c2ggYW4gZW1wdHkgc3RhY2sgZnJhbWUsIHRvIHJlY29yZCB0aGUgY3VycmVudCBQQywgZXRjLiAgKi8KKworI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FCXNwYXJjX3B1c2hfZHVtbXlfZnJhbWUgKCkKKyNkZWZpbmUgUE9QX0ZSQU1FCXNwYXJjX3BvcF9mcmFtZSAoKQorCit2b2lkIHNwYXJjX3B1c2hfZHVtbXlfZnJhbWUgUEFSQU1TICgodm9pZCkpLCBzcGFyY19wb3BfZnJhbWUgUEFSQU1TICgodm9pZCkpOworCisjaWZuZGVmIENBTExfRFVNTVkKKy8qIFRoaXMgc2VxdWVuY2Ugb2Ygd29yZHMgaXMgdGhlIGluc3RydWN0aW9ucworCisgICAwOiAgIGJjIDEwIDAwIDAxICAgICBtb3YgICVnMSwgJWZwCisgICA0OiAgIDlkIGUzIDgwIDAwICAgICBzYXZlICAlc3AsICVnMCwgJXNwCisgICA4OiAgIGJjIDEwIDAwIDAyICAgICBtb3YgICVnMiwgJWZwCisgICBjOiAgIGJlIDEwIDAwIDAzICAgICBtb3YgICVnMywgJWk3CisgIDEwOiAgIGRhIDAzIGEwIDU4ICAgICBsZCAgWyAlc3AgKyAweDU4IF0sICVvNQorICAxNDogICBkOCAwMyBhMCA1NCAgICAgbGQgIFsgJXNwICsgMHg1NCBdLCAlbzQKKyAgMTg6ICAgZDYgMDMgYTAgNTAgICAgIGxkICBbICVzcCArIDB4NTAgXSwgJW8zCisgIDFjOiAgIGQ0IDAzIGEwIDRjICAgICBsZCAgWyAlc3AgKyAweDRjIF0sICVvMgorICAyMDogICBkMiAwMyBhMCA0OCAgICAgbGQgIFsgJXNwICsgMHg0OCBdLCAlbzEKKyAgMjQ6ICAgNDAgMDAgMDAgMDAgICAgIGNhbGwgIDxmdW4+CisgIDI4OiAgIGQwIDAzIGEwIDQ0ICAgICBsZCAgWyAlc3AgKyAweDQ0IF0sICVvMAorICAyYzogICAwMSAwMCAwMCAwMCAgICAgbm9wIAorICAzMDogICA5MSBkMCAyMCAwMSAgICAgdGEgIDEKKyAgMzQ6ICAgMDEgMDAgMDAgMDAgICAgIG5vcAorCisgICBOT1RFUzoKKwkqIHRoZSBmaXJzdCBmb3VyIGluc3RydWN0aW9ucyBhcmUgbmVjZXNzYXJ5IG9ubHkgb24gdGhlIHNpbXVsYXRvci4KKwkqIHRoaXMgaXMgYSBtdWx0aXBsZSBvZiA4IChub3Qgb25seSA0KSBieXRlcy4KKwkqIHRoZSBgY2FsbCcgaW5zbiBpcyBhIHJlbGF0aXZlLCBub3QgYW4gYWJzb2x1dGUgY2FsbC4KKwkqIHRoZSBgbm9wJyBhdCB0aGUgZW5kIGlzIG5lZWRlZCB0byBrZWVwIHRoZSB0cmFwIGZyb20KKwkgIGNsb2JiZXJpbmcgdGhpbmdzIChpZiBOUEMgcG9pbnRlZCB0byBnYXJiYWdlIGluc3RlYWQpLgorKi8KKworI2RlZmluZSBDQUxMX0RVTU1ZIHsgMHhiYzEwMDAwMSwgMHg5ZGUzODAwMCwgMHhiYzEwMDAwMiwgMHhiZTEwMDAwMywJXAorCQkgICAgIDB4ZGEwM2EwNTgsIDB4ZDgwM2EwNTQsIDB4ZDYwM2EwNTAsIDB4ZDQwM2EwNGMsCVwKKwkJICAgICAweGQyMDNhMDQ4LCAweDQwMDAwMDAwLCAweGQwMDNhMDQ0LCAweDAxMDAwMDAwLAlcCisJCSAgICAgMHg5MWQwMjAwMSwgMHgwMTAwMDAwMCB9CisKKworLyogU2l6ZSBvZiB0aGUgY2FsbCBkdW1teSBpbiBieXRlcy4gKi8KKworI2RlZmluZSBDQUxMX0RVTU1ZX0xFTkdUSCAweDM4CisKKy8qIE9mZnNldCB3aXRoaW4gY2FsbCBkdW1teSBvZiBmaXJzdCBpbnN0cnVjdGlvbiB0byBleGVjdXRlLiAqLworCisjZGVmaW5lIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUIDAKKworLyogT2Zmc2V0IHdpdGhpbiBDQUxMX0RVTU1ZIG9mIHRoZSAnY2FsbCcgaW5zdHJ1Y3Rpb24uICovCisKKyNkZWZpbmUgQ0FMTF9EVU1NWV9DQUxMX09GRlNFVCAoQ0FMTF9EVU1NWV9TVEFSVF9PRkZTRVQgKyAweDI0KQorCisvKiBPZmZzZXQgd2l0aGluIENBTExfRFVNTVkgb2YgdGhlICd0YSAxJyBpbnN0cnVjdGlvbi4gKi8KKworI2RlZmluZSBDQUxMX0RVTU1ZX0JSRUFLUE9JTlRfT0ZGU0VUIChDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCArIDB4MzApCisKKyNkZWZpbmUgQ0FMTF9EVU1NWV9TVEFDS19BREpVU1QgNjgKKworI2VuZGlmCisvKiBJbnNlcnQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYXJncyBhbmQgZnVuY3Rpb24gYWRkcmVzcworICAgaW50byBhIGNhbGwgc2VxdWVuY2Ugb2YgdGhlIGFib3ZlIGZvcm0gc3RvcmVkIGF0IERVTU1ZTkFNRS4gICovCisKKyNkZWZpbmUgRklYX0NBTExfRFVNTVkoZHVtbXluYW1lLCBwYywgZnVuLCBuYXJncywgYXJncywgdHlwZSwgZ2NjX3ApIFwKKyBzcGFyY19maXhfY2FsbF9kdW1teSAoZHVtbXluYW1lLCBwYywgZnVuLCB0eXBlLCBnY2NfcCkKK3ZvaWQgc3BhcmNfZml4X2NhbGxfZHVtbXkgUEFSQU1TICgoY2hhciAqZHVtbXksIENPUkVfQUREUiBwYywgQ09SRV9BRERSIGZ1biwKKwkJCQkgICBzdHJ1Y3QgdHlwZSAqdmFsdWVfdHlwZSwgaW50IHVzaW5nX2djYykpOworCisvKiBUaGUgU3BhcmMgcmV0dXJucyBsb25nIGRvdWJsZXMgb24gdGhlIHN0YWNrLiAgKi8KKworI2RlZmluZSBSRVRVUk5fVkFMVUVfT05fU1RBQ0soVFlQRSkgXAorICAoVFlQRV9DT0RFKFRZUEUpID09IFRZUEVfQ09ERV9GTFQgXAorICAgJiYgVFlQRV9MRU5HVEgoVFlQRSkgPiA4KQorDAorLyogU3BhcmMgaGFzIG5vIHJlbGlhYmxlIHNpbmdsZSBzdGVwIHB0cmFjZSBjYWxsICovCisKKyNkZWZpbmUgU09GVFdBUkVfU0lOR0xFX1NURVBfUCAxCitleHRlcm4gdm9pZCBzcGFyY19zb2Z0d2FyZV9zaW5nbGVfc3RlcCBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGludCkpOworI2RlZmluZSBTT0ZUV0FSRV9TSU5HTEVfU1RFUChzaWcsYnBfcCkgc3BhcmNfc29mdHdhcmVfc2luZ2xlX3N0ZXAgKHNpZyxicF9wKQorCisvKiBXZSBuZWVkIG1vcmUgYXJndW1lbnRzIGluIGEgZnJhbWUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlCisgICAiZnJhbWUiIG9yICJpbmZvIGZyYW1lIiBjb21tYW5kLiAgKi8KKworI2RlZmluZSBTRVRVUF9BUkJJVFJBUllfRlJBTUUoYXJnYywgYXJndikgc2V0dXBfYXJiaXRyYXJ5X2ZyYW1lIChhcmdjLCBhcmd2KQorZXh0ZXJuIHN0cnVjdCBmcmFtZV9pbmZvICpzZXR1cF9hcmJpdHJhcnlfZnJhbWUgUEFSQU1TICgoaW50LCBDT1JFX0FERFIgKikpOworCisvKiBUbyBwcmludCBldmVyeSBwYWlyIG9mIGZsb2F0IHJlZ2lzdGVycyBhcyBhIGRvdWJsZSwgd2UgdXNlIHRoaXMgaG9vay4KKyAgIFdlIGFsc28gcHJpbnQgdGhlIGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVycyBpbiBhIHJlYWRhYmxlIGZvcm1hdAorICAgKEZJWE1FOiBjYW4gZXhwYW5kIHRoaXMgdG8gYWxsIGNvbnRyb2wgcmVncykuICAqLworCisjdW5kZWYgCVBSSU5UX1JFR0lTVEVSX0hPT0sKKyNkZWZpbmUJUFJJTlRfUkVHSVNURVJfSE9PSyhyZWdubykJXAorICBzcGFyY19wcmludF9yZWdpc3Rlcl9ob29rIChyZWdubykKK2V4dGVybiB2b2lkIHNwYXJjX3ByaW50X3JlZ2lzdGVyX2hvb2sgUEFSQU1TICgoaW50IHJlZ25vKSk7CisKKworLyogT3B0aW1pemF0aW9uIGZvciBzdG9yaW5nIHJlZ2lzdGVycyB0byB0aGUgaW5mZXJpb3IuICBUaGUgaG9vaworICAgRE9fREVGRVJSRURfU1RPUkVTCisgICBhY3R1YWxseSBleGVjdXRlcyBhbnkgZGVmZXJyZWQgc3RvcmVzLiAgSXQgaXMgY2FsbGVkIGFueSB0aW1lCisgICB3ZSBhcmUgZ29pbmcgdG8gcHJvY2VlZCB0aGUgY2hpbGQsIG9yIHJlYWQgaXRzIHJlZ2lzdGVycy4KKyAgIFRoZSBob29rIENMRUFSX0RFRkVSUkVEX1NUT1JFUyBpcyBjYWxsZWQgd2hlbiB3ZSB3YW50IHRvIHRocm93CisgICBhd2F5IHRoZSBpbmZlcmlvciBwcm9jZXNzLCBlLmcuIHdoZW4gaXQgZGllcyBvciB3ZSBraWxsIGl0LgorICAgRklYTUUsIHRoaXMgZG9lcyBub3QgaGFuZGxlIHJlbW90ZSBkZWJ1Z2dpbmcgY2xlYW5seS4gICovCisKK2V4dGVybiBpbnQgZGVmZXJyZWRfc3RvcmVzOworI2RlZmluZQlET19ERUZFUlJFRF9TVE9SRVMJXAorICBpZiAoZGVmZXJyZWRfc3RvcmVzKQkJXAorICAgIHRhcmdldF9zdG9yZV9yZWdpc3RlcnMgKC0yKTsKKyNkZWZpbmUJQ0xFQVJfREVGRVJSRURfU1RPUkVTCVwKKyAgZGVmZXJyZWRfc3RvcmVzID0gMDsKKworLyogSWYgdGhlIGN1cnJlbnQgZ2NjIGZvciBmb3IgdGhpcyB0YXJnZXQgZG9lcyBub3QgcHJvZHVjZSBjb3JyZWN0IGRlYnVnZ2luZworICAgaW5mb3JtYXRpb24gZm9yIGZsb2F0IHBhcmFtZXRlcnMsIGJvdGggcHJvdG90eXBlZCBhbmQgdW5wcm90b3R5cGVkLCB0aGVuCisgICBkZWZpbmUgdGhpcyBtYWNyby4gIFRoaXMgZm9yY2VzIGdkYiB0byAgYWx3YXlzIGFzc3VtZSB0aGF0IGZsb2F0cyBhcmUKKyAgIHBhc3NlZCBhcyBkb3VibGVzIGFuZCB0aGVuIGNvbnZlcnRlZCBpbiB0aGUgY2FsbGVlLiAqLworCisjZGVmaW5lIENPRVJDRV9GTE9BVF9UT19ET1VCTEUgMQorCisvKiBTZWxlY3QgdGhlIHNwYXJjIGRpc2Fzc2VtYmxlciAqLworCisjZGVmaW5lIFRNX1BSSU5UX0lOU05fTUFDSCBiZmRfbWFjaF9zcGFyYworCisvKiBBcmd1bWVudHMgc21hbGxlciB0aGFuIGFuIGludCBtdXN0IHByb21vdGVkIHRvIGludHMgd2hlbiBzeW50aGVzaXppbmcKKyAgIGZ1bmN0aW9uIGNhbGxzLiAgKi8KKworI2RlZmluZSBQVVNIX0FSR1VNRU5UUyhuYXJncywgYXJncywgc3AsIHN0cnVjdF9yZXR1cm4sIHN0cnVjdF9hZGRyKSBcCisgICAgc3AgPSBzcGFyY19wdXNoX2FyZ3VtZW50cygobmFyZ3MpLCAoYXJncyksIChzcCksIChzdHJ1Y3RfcmV0dXJuKSwgKHN0cnVjdF9hZGRyKSkKK2V4dGVybiBDT1JFX0FERFIKK3NwYXJjX3B1c2hfYXJndW1lbnRzIFBBUkFNUyAoKGludCwgc3RydWN0IHZhbHVlICoqLCBDT1JFX0FERFIsIGludCwgQ09SRV9BRERSKSk7CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3NwYXJjL3RtLXNwYXJjbGV0LmggYi9nZGIvY29uZmlnL3NwYXJjL3RtLXNwYXJjbGV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0MzA4MwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvc3BhcmMvdG0tc3BhcmNsZXQuaApAQCAtMCwwICsxLDEzMiBAQAorLyogVGFyZ2V0IG1hY2hpbmUgZGVmaW5pdGlvbnMgZm9yIEdEQiBmb3IgYW4gZW1iZWRkZWQgU1BBUkMuCisgICBDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAic3BhcmMvdG0tc3BhcmMuaCIKKworI2RlZmluZSBUQVJHRVRfU1BBUkNMRVQgMQorCisvKiBTZWxlY3QgdGhlIHNwYXJjbGV0IGRpc2Fzc2VtYmxlci4gIFNsaWdodGx5IGRpZmZlcmVudCBpbnN0cnVjdGlvbiBzZXQgZnJvbQorICAgdGhlIFY4IHNwYXJjLiAgKi8KKworI3VuZGVmIFRNX1BSSU5UX0lOU05fTUFDSAorI2RlZmluZSBUTV9QUklOVF9JTlNOX01BQ0ggYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQKKworLyogb3ZlcnJpZGVzIG9mIHRtLXNwYXJjLmggKi8KKworI3VuZGVmIFRBUkdFVF9CWVRFX09SREVSCisjZGVmaW5lIFRBUkdFVF9CWVRFX09SREVSX1NFTEVDVEFCTEUKKworLyogU2VxdWVuY2Ugb2YgYnl0ZXMgZm9yIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gKHRhIDEpLiAqLworI3VuZGVmIEJSRUFLUE9JTlQKKyNkZWZpbmUgQklHX0JSRUFLUE9JTlQgezB4OTEsIDB4ZDAsIDB4MjAsIDB4MDF9CisjZGVmaW5lIExJVFRMRV9CUkVBS1BPSU5UIHsweDAxLCAweDIwLCAweGQwLCAweDkxfQorCisjdW5kZWYgIE5VTV9SRUdTIC8qIGZvcm1lcmx5ICI3MiIgKi8KKy8qICAgICAgICAgICAgICAgIFdJTiAgRlAgICBDUFUgIENDUCAgQVNSICBBV1IgIEFQU1IgKi8KKyNkZWZpbmUgTlVNX1JFR1MgKDMyICsgMzIgKyA4ICArIDggICsgOC8qKyAzMiArIDEqLykKKworI3VuZGVmICBSRUdJU1RFUl9CWVRFUyAvKiBmb3JtZXJseSAiKDMyKjQgKyAzMio0ICsgOCo0KSIgKi8KKyNkZWZpbmUgUkVHSVNURVJfQllURVMgKDMyKjQgKyAzMio0ICsgOCo0ICsgOCo0ICsgOCo0LyogKyAzMio0ICsgMSo0Ki8pCisKKy8qIEluaXRpYWxpemVyIGZvciBhbiBhcnJheSBvZiBuYW1lcyBvZiByZWdpc3RlcnMuCisgICBUaGVyZSBzaG91bGQgYmUgTlVNX1JFR1Mgc3RyaW5ncyBpbiB0aGlzIGluaXRpYWxpemVyLiAgKi8KKy8qIFNwYXJjbGV0IGhhcyBubyBmcCEgKi8KKy8qIENvbXBpbGVyIG1hcHMgdHlwZXMgZm9yIGZsb2F0cyBieSBudW1iZXIsIHNvIGNhbid0IAorICAgY2hhbmdlIHRoZSBudW1iZXJzIGhlcmUuICovCisKKyN1bmRlZiBSRUdJU1RFUl9OQU1FUworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyAgXAoreyAiZzAiLCAiZzEiLCAiZzIiLCAiZzMiLCAiZzQiLCAiZzUiLCAiZzYiLCAiZzciLAlcCisgICJvMCIsICJvMSIsICJvMiIsICJvMyIsICJvNCIsICJvNSIsICJvNiIsICJvNyIsCVwKKyAgImwwIiwgImwxIiwgImwyIiwgImwzIiwgImw0IiwgImw1IiwgImw2IiwgImw3IiwJXAorICAiaTAiLCAiaTEiLCAiaTIiLCAiaTMiLCAiaTQiLCAiaTUiLCAiaTYiLCAiaTciLAlcCisJCQkJCQkJXAorICAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsIC8qIG5vIEZQVSByZWdzICovCVwKKyAgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAJCQlcCisgICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgCQkJXAorICAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsIAkJCVwKKwkJCQkgIC8qIG5vIENQU1IsIEZQU1IgKi8JXAorICAieSIsICJwc3IiLCAid2ltIiwgInRiciIsICJwYyIsICJucGMiLCAiIiwgIiIsIAlcCisJCQkJCQkJXAorICAiY2NzciIsICJjY3ByIiwgImNjY3JjciIsICJjY29yIiwgImNjb2JyIiwgImNjaWJyIiwgImNjaXIiLCAiIiwgXAorCQkJCQkJCQkgIFwKKyAgLyogICAgICAgQVNSMTUgICAgICAgICAgICAgICAgIEFTUjE5IChkb24ndCBkaXNwbGF5IHRoZW0pICovICAgIFwKKyAgImFzcjEiLCAgIiIsICJhc3IxNyIsICJhc3IxOCIsICIiLCAiYXNyMjAiLCAiYXNyMjEiLCAiYXNyMjIiLCAgIFwKKy8qCQkJCQkJCQkJICBcCisgICJhd3IwIiwgICJhd3IxIiwgICJhd3IyIiwgICJhd3IzIiwgICJhd3I0IiwgICJhd3I1IiwgICJhd3I2IiwgICJhd3I3IiwgIFwKKyAgImF3cjgiLCAgImF3cjkiLCAgImF3cjEwIiwgImF3cjExIiwgImF3cjEyIiwgImF3cjEzIiwgImF3cjE0IiwgImF3cjE1IiwgXAorICAiYXdyMTYiLCAiYXdyMTciLCAiYXdyMTgiLCAiYXdyMTkiLCAiYXdyMjAiLCAiYXdyMjEiLCAiYXdyMjIiLCAiYXdyMjMiLCBcCisgICJhd3IyNCIsICJhd3IyNSIsICJhd3IyNiIsICJhd3IyNyIsICJhd3IyOCIsICJhd3IyOSIsICJhd3IzMCIsICJhd3IzMSIsIFwKKyAgImFwc3IiLAkJCQkJCQkJICBcCisgKi8JCQkJCQkJCQkgIFwKK30KKworLyogUmVtb3ZlIEZQIGRlcGVuZGFudCBjb2RlIHdoaWNoIHdhcyBkZWZpbmVkIGluIHRtLXNwYXJjLmggKi8KKyN1bmRlZglGUDBfUkVHTlVNIC8qIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIDAgKi8KKyN1bmRlZglGUFNfUkVHTlVNIC8qIEZsb2F0aW5nIHBvaW50IHN0YXR1cyByZWdpc3RlciAqLworI3VuZGVmIAlDUFNfUkVHTlVNIC8qIENvcHJvY2Vzc29yIHN0YXR1cyByZWdpc3RlciAqLworCisvKiBzcGFyY2xldCByZWdpc3RlciBudW1iZXJzICovCisjZGVmaW5lIENDU1JfUkVHTlVNIDcyCisKKyN1bmRlZiBFWFRSQUNUX1JFVFVSTl9WQUxVRQorI2RlZmluZSBFWFRSQUNUX1JFVFVSTl9WQUxVRShUWVBFLFJFR0JVRixWQUxCVUYpICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZW1jcHkgKChWQUxCVUYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAoY2hhciAqKShSRUdCVUYpICsgUkVHSVNURVJfUkFXX1NJWkUgKE8wX1JFR05VTSkgKiA4ICsgICAgIFwKKwkgICAgKFRZUEVfTEVOR1RIKFRZUEUpID49IFJFR0lTVEVSX1JBV19TSVpFIChPMF9SRUdOVU0pICAgICAgICBcCisJICAgICA/IDAgOiBSRUdJU1RFUl9SQVdfU0laRSAoTzBfUkVHTlVNKSAtIFRZUEVfTEVOR1RIKFRZUEUpKSwgXAorCSAgICBUWVBFX0xFTkdUSChUWVBFKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI3VuZGVmIFNUT1JFX1JFVFVSTl9WQUxVRQorI2RlZmluZSBTVE9SRV9SRVRVUk5fVkFMVUUoVFlQRSxWQUxCVUYpIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIE90aGVyIHZhbHVlcyBhcmUgcmV0dXJuZWQgaW4gcmVnaXN0ZXIgJW8wLiAgKi8gICAgICAgICAgICAgICAgICBcCisgICAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKFJFR0lTVEVSX0JZVEUgKE8wX1JFR05VTSksIChWQUxCVUYpLCAgICAgICAgIFwKKwkJCSAgVFlQRV9MRU5HVEggKFRZUEUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyN1bmRlZiBQUklOVF9SRUdJU1RFUl9IT09LCisjZGVmaW5lIFBSSU5UX1JFR0lTVEVSX0hPT0socmVnbm8pCisKKy8qIE9mZnNldHMgaW50byBqbXBfYnVmLiAgTm90IGRlZmluZWQgYnkgU3VuLCBidXQgYXQgbGVhc3QgZG9jdW1lbnRlZCBpbiBhCisgICBjb21tZW50IGluIDxtYWNoaW5lL3NldGptcC5oPiEgKi8KKworI2RlZmluZSBKQl9FTEVNRU5UX1NJWkUgNAkvKiBTaXplIG9mIGVhY2ggZWxlbWVudCBpbiBqbXBfYnVmICovCisKKyNkZWZpbmUgSkJfT05TU1RBQ0sgMAorI2RlZmluZSBKQl9TSUdNQVNLIDEKKyNkZWZpbmUgSkJfU1AgMgorI2RlZmluZSBKQl9QQyAzCisjZGVmaW5lIEpCX05QQyA0CisjZGVmaW5lIEpCX1BTUiA1CisjZGVmaW5lIEpCX0cxIDYKKyNkZWZpbmUgSkJfTzAgNworI2RlZmluZSBKQl9XQkNOVCA4CisKKy8qIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIGxvbmdqbXAgd2lsbCBsYW5kLiAgV2UgZXhwZWN0IHRoYXQgd2UgaGF2ZSBqdXN0IGVudGVyZWQKKyAgIGxvbmdqbXAgYW5kIGhhdmVuJ3QgeWV0IHNldHVwIHRoZSBzdGFjayBmcmFtZSwgc28gdGhlIGFyZ3MgYXJlIHN0aWxsIGluIHRoZQorICAgb3V0cHV0IHJlZ3MuICAlbzAgKE8wX1JFR05VTSkgcG9pbnRzIGF0IHRoZSBqbXBfYnVmIHN0cnVjdHVyZSBmcm9tIHdoaWNoIHdlCisgICBleHRyYWN0IHRoZSBwYyAoSkJfUEMpIHRoYXQgd2Ugd2lsbCBsYW5kIGF0LiAgVGhlIHBjIGlzIGNvcGllZCBpbnRvIEFERFIuCisgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MgKi8KKworZXh0ZXJuIGludAorZ2V0X2xvbmdqbXBfdGFyZ2V0IFBBUkFNUyAoKENPUkVfQUREUiAqKSk7CisKKyNkZWZpbmUgR0VUX0xPTkdKTVBfVEFSR0VUKEFERFIpIGdldF9sb25nam1wX3RhcmdldChBRERSKQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9zcGFyYy90bS1zcGFyY2xpdGUuaCBiL2dkYi9jb25maWcvc3BhcmMvdG0tc3BhcmNsaXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0MWY4OQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvc3BhcmMvdG0tc3BhcmNsaXRlLmgKQEAgLTAsMCArMSw5OCBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIEdEQiBmb3IgYSBGdWppdHN1IFNQQVJDbGl0ZS4KKyAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgVEFSR0VUX1NQQVJDTElURSAxCisKKyNpbmNsdWRlICJzcGFyYy90bS1zcGFyYy5oIgorCisvKiBvdmVycmlkZXMgb2YgdG0tc3BhcmMuaCAqLworCisjdW5kZWYgVEFSR0VUX0JZVEVfT1JERVIKKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRQorCisvKiBTZWxlY3QgdGhlIHNwYXJjbGl0ZSBkaXNhc3NlbWJsZXIuICBTbGlnaHRseSBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb24gc2V0IGZyb20KKyAgIHRoZSBWOCBzcGFyYy4gICovCisKKyN1bmRlZiBUTV9QUklOVF9JTlNOX01BQ0gKKyNkZWZpbmUgVE1fUFJJTlRfSU5TTl9NQUNIIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZQorCisvKiBBbW91bnQgUEMgbXVzdCBiZSBkZWNyZW1lbnRlZCBieSBhZnRlciBhIGhhcmR3YXJlIGluc3RydWN0aW9uIGJyZWFrcG9pbnQuCisgICBUaGlzIGlzIG9mdGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gQlJFQUtQT0lOVAorICAgYnV0IG5vdCBhbHdheXMuICAqLworCisjZGVmaW5lIERFQ1JfUENfQUZURVJfSFdfQlJFQUsgNAorCisjZGVmaW5lIEZSQU1FX0NIQUlOX1ZBTElEKGZwLGZpKSBhbHRlcm5hdGVfZnJhbWVfY2hhaW5fdmFsaWQgKGZwLCBmaSkKKworI3VuZGVmIE5VTV9SRUdTIAorI2RlZmluZSBOVU1fUkVHUyA4MCAKKworI3VuZGVmIFJFR0lTVEVSX0JZVEVTCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTICgzMio0KzMyKjQrOCo0KzgqNCkKKworI3VuZGVmIFJFR0lTVEVSX05BTUVTCisjZGVmaW5lIFJFR0lTVEVSX05BTUVTICBcCit7ICJnMCIsICJnMSIsICJnMiIsICJnMyIsICJnNCIsICJnNSIsICJnNiIsICJnNyIsICAgICAgIFwKKyAgIm8wIiwgIm8xIiwgIm8yIiwgIm8zIiwgIm80IiwgIm81IiwgInNwIiwgIm83IiwgICAgICAgXAorICAibDAiLCAibDEiLCAibDIiLCAibDMiLCAibDQiLCAibDUiLCAibDYiLCAibDciLCAgICAgICBcCisgICJpMCIsICJpMSIsICJpMiIsICJpMyIsICJpNCIsICJpNSIsICJmcCIsICJpNyIsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJmMCIsICJmMSIsICJmMiIsICJmMyIsICJmNCIsICJmNSIsICJmNiIsICJmNyIsICAgICAgIFwKKyAgImY4IiwgImY5IiwgImYxMCIsICJmMTEiLCAiZjEyIiwgImYxMyIsICJmMTQiLCAiZjE1IiwgXAorICAiZjE2IiwgImYxNyIsICJmMTgiLCAiZjE5IiwgImYyMCIsICJmMjEiLCAiZjIyIiwgImYyMyIsICAgICAgIFwKKyAgImYyNCIsICJmMjUiLCAiZjI2IiwgImYyNyIsICJmMjgiLCAiZjI5IiwgImYzMCIsICJmMzEiLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAieSIsICJwc3IiLCAid2ltIiwgInRiciIsICJwYyIsICJucGMiLCAiZnBzciIsICJjcHNyIiwgICAgICAgIFwKKyAgImRpYTEiLCAiZGlhMiIsICJkZGExIiwgImRkYTIiLCAiZGR2MSIsICJkZHYyIiwgImRjciIsICJkc3IiIH0KKworI2RlZmluZSBESUExX1JFR05VTSA3MiAgICAgICAgICAvKiBkZWJ1ZyBpbnN0ciBhZGRyZXNzIHJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgRElBMl9SRUdOVU0gNzMgICAgICAgICAgLyogZGVidWcgaW5zdHIgYWRkcmVzcyByZWdpc3RlciAyICovCisjZGVmaW5lIEREQTFfUkVHTlVNIDc0ICAgICAgICAgIC8qIGRlYnVnIGRhdGEgYWRkcmVzcyByZWdpc3RlciAxICovCisjZGVmaW5lIEREQTJfUkVHTlVNIDc1ICAgICAgICAgIC8qIGRlYnVnIGRhdGEgYWRkcmVzcyByZWdpc3RlciAyICovCisjZGVmaW5lIEREVjFfUkVHTlVNIDc2ICAgICAgICAgIC8qIGRlYnVnIGRhdGEgdmFsdWUgcmVnaXN0ZXIgMSAqLworI2RlZmluZSBERFYyX1JFR05VTSA3NyAgICAgICAgICAvKiBkZWJ1ZyBkYXRhIHZhbHVlIHJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgRENSX1JFR05VTSA3OCAgICAgICAgICAgLyogZGVidWcgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBEU1JfUkVHTlVNIDc5ICAgICAgICAgICAvKiBkZWJ1ZyBzdGF0dXMgcmVnc2l0ZXIgKi8KKworI2RlZmluZSBUQVJHRVRfSFdfQlJFQUtfTElNSVQgMgorI2RlZmluZSBUQVJHRVRfSFdfV0FUQ0hfTElNSVQgMgorCisvKiBFbmFibGUgd2F0Y2hwb2ludCBtYWNybydzICovCisKKyNkZWZpbmUgVEFSR0VUX0hBU19IQVJEV0FSRV9XQVRDSFBPSU5UUworCisjZGVmaW5lIFRBUkdFVF9DQU5fVVNFX0hBUkRXQVJFX1dBVENIUE9JTlQodHlwZSwgY250LCBvdCkgXAorCXNwYXJjbGl0ZV9jaGVja193YXRjaF9yZXNvdXJjZXMgKHR5cGUsIGNudCwgb3QpCisKKy8qIFdoZW4gYSBoYXJkd2FyZSB3YXRjaHBvaW50IGZpcmVzIG9mZiB0aGUgUEMgd2lsbCBiZSBsZWZ0IGF0IHRoZQorICAgaW5zdHJ1Y3Rpb24gd2hpY2ggY2F1c2VkIHRoZSB3YXRjaHBvaW50LiAgSXQgd2lsbCBiZSBuZWNlc3NhcnkgZm9yCisgICBHREIgdG8gc3RlcCBvdmVyIHRoZSB3YXRjaHBvaW50LiAqKioKKworI2RlZmluZSBTVE9QUEVEX0JZX1dBVENIUE9JTlQoVykgXAorICAoKFcpLmtpbmQgPT0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQgXAorICAgJiYgKFcpLnZhbHVlLnNpZyA9PSBUQVJHRVRfU0lHTkFMX1RSQVAgXAorICAgJiYgKChpbnQpIHJlYWRfcmVnaXN0ZXIgKElQU1dfUkVHTlVNKSAmIDB4MDAxMDAwMDApKQorKi8KKworLyogVXNlIHRoZXNlIG1hY3JvcyBmb3Igd2F0Y2hwb2ludCBpbnNlcnRpb24vZGVsZXRpb24uICAqLworI2RlZmluZSB0YXJnZXRfaW5zZXJ0X3dhdGNocG9pbnQoYWRkciwgbGVuLCB0eXBlKSBzcGFyY2xpdGVfaW5zZXJ0X3dhdGNocG9pbnQgKGFkZHIsIGxlbiwgdHlwZSkKKyNkZWZpbmUgdGFyZ2V0X3JlbW92ZV93YXRjaHBvaW50KGFkZHIsIGxlbiwgdHlwZSkgc3BhcmNsaXRlX3JlbW92ZV93YXRjaHBvaW50IChhZGRyLCBsZW4sIHR5cGUpCisjZGVmaW5lIHRhcmdldF9pbnNlcnRfaHdfYnJlYWtwb2ludChhZGRyLCBsZW4pIHNwYXJjbGl0ZV9pbnNlcnRfaHdfYnJlYWtwb2ludCAoYWRkciwgbGVuKQorI2RlZmluZSB0YXJnZXRfcmVtb3ZlX2h3X2JyZWFrcG9pbnQoYWRkciwgbGVuKSBzcGFyY2xpdGVfcmVtb3ZlX2h3X2JyZWFrcG9pbnQgKGFkZHIsIGxlbikKKyNkZWZpbmUgdGFyZ2V0X3N0b3BwZWRfZGF0YV9hZGRyZXNzKCkgc3BhcmNsaXRlX3N0b3BwZWRfZGF0YV9hZGRyZXNzKCkKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvc3BhcmMvdG0tc3BhcmNseW54LmggYi9nZGIvY29uZmlnL3NwYXJjL3RtLXNwYXJjbHlueC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMGQ5MDgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NwYXJjL3RtLXNwYXJjbHlueC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIE1hY3JvIGRlZmluaXRpb25zIGZvciBTcGFyYyBydW5uaW5nIHVuZGVyIEx5bnhPUy4KKyAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgVE1fU1BBUkNMWU5YX0gKKyNkZWZpbmUgVE1fU1BBUkNMWU5YX0gKKworI2luY2x1ZGUgInRtLWx5bnguaCIKKworLyogVXNlIGdlbmVyaWMgU3BhcmMgZGVmaW5pdGlvbnMuICovCisjaW5jbHVkZSAic3BhcmMvdG0tc3BhcmMuaCIKKworLyogTHlueCBkb2VzIHRoaXMgYmFja3dhcmRzIGZyb20gZXZlcnlib2R5IGVsc2UgKi8KKworI3VuZGVmIEZSQU1FX1NBVkVEX0kwCisjdW5kZWYgRlJBTUVfU0FWRURfTDAKKworI2RlZmluZSBGUkFNRV9TQVZFRF9JMCAwCisjZGVmaW5lIEZSQU1FX1NBVkVEX0wwICg4ICogUkVHSVNURVJfUkFXX1NJWkUgKEkwX1JFR05VTSkpCisKKyNlbmRpZiAvKiBUTV9TUEFSQ0xZTlhfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9zcGFyYy90bS1zcGMtZW0uaCBiL2dkYi9jb25maWcvc3BhcmMvdG0tc3BjLWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5YjQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvc3BhcmMvdG0tc3BjLWVtLmgKQEAgLTAsMCArMSw0NiBAQAorLyogVGFyZ2V0IG1hY2hpbmUgZGVmaW5pdGlvbnMgZm9yIEdEQiBmb3IgYW4gZW1iZWRkZWQgU1BBUkMuCisgICBDb3B5cmlnaHQgMTk4OSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAic3BhcmMvdG0tc3BhcmMuaCIKKworLyogT2Zmc2V0cyBpbnRvIGptcF9idWYuICBOb3QgZGVmaW5lZCBieSBTdW4sIGJ1dCBhdCBsZWFzdCBkb2N1bWVudGVkIGluIGEKKyAgIGNvbW1lbnQgaW4gPG1hY2hpbmUvc2V0am1wLmg+ISAqLworCisjZGVmaW5lIEpCX0VMRU1FTlRfU0laRSA0CS8qIFNpemUgb2YgZWFjaCBlbGVtZW50IGluIGptcF9idWYgKi8KKworI2RlZmluZSBKQl9PTlNTVEFDSyAwCisjZGVmaW5lIEpCX1NJR01BU0sgMQorI2RlZmluZSBKQl9TUCAyCisjZGVmaW5lIEpCX1BDIDMKKyNkZWZpbmUgSkJfTlBDIDQKKyNkZWZpbmUgSkJfUFNSIDUKKyNkZWZpbmUgSkJfRzEgNgorI2RlZmluZSBKQl9PMCA3CisjZGVmaW5lIEpCX1dCQ05UIDgKKworLyogRmlndXJlIG91dCB3aGVyZSB0aGUgbG9uZ2ptcCB3aWxsIGxhbmQuICBXZSBleHBlY3QgdGhhdCB3ZSBoYXZlIGp1c3QgZW50ZXJlZAorICAgbG9uZ2ptcCBhbmQgaGF2ZW4ndCB5ZXQgc2V0dXAgdGhlIHN0YWNrIGZyYW1lLCBzbyB0aGUgYXJncyBhcmUgc3RpbGwgaW4gdGhlCisgICBvdXRwdXQgcmVncy4gICVvMCAoTzBfUkVHTlVNKSBwb2ludHMgYXQgdGhlIGptcF9idWYgc3RydWN0dXJlIGZyb20gd2hpY2ggd2UKKyAgIGV4dHJhY3QgdGhlIHBjIChKQl9QQykgdGhhdCB3ZSB3aWxsIGxhbmQgYXQuICBUaGUgcGMgaXMgY29waWVkIGludG8gQUREUi4KKyAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRydWUgb24gc3VjY2VzcyAqLworCitleHRlcm4gaW50CitnZXRfbG9uZ2ptcF90YXJnZXQgUEFSQU1TICgoQ09SRV9BRERSICopKTsKKworI2RlZmluZSBHRVRfTE9OR0pNUF9UQVJHRVQoQUREUikgZ2V0X2xvbmdqbXBfdGFyZ2V0KEFERFIpCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3NwYXJjL3RtLXN1bjRvczQuaCBiL2dkYi9jb25maWcvc3BhcmMvdG0tc3VuNG9zNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NWUxOGMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NwYXJjL3RtLXN1bjRvczQuaApAQCAtMCwwICsxLDU4IEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgR0RCIGZvciBhIFN1biA0IHJ1bm5pbmcgc3Vub3MgNC4KKyAgIENvcHlyaWdodCAxOTg5LCAxOTkyLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJzcGFyYy90bS1zcGFyYy5oIgorI2luY2x1ZGUgInRtLXN1bm9zLmgiCisKKy8qIFJlZGVmaW5lIFNLSVBfVFJBTVBPTElORV9DT0RFIHRvIGhhbmRsZSBQSUMgY29tcGlsZWQgbW9kdWxlcworICAgaW4gbWFpbiBleGVjdXRhYmxlcy4gICovCisKKyN1bmRlZiBTS0lQX1RSQU1QT0xJTkVfQ09ERQorI2RlZmluZSBTS0lQX1RSQU1QT0xJTkVfQ09ERShwYykgIHN1bm9zNF9za2lwX3RyYW1wb2xpbmVfY29kZSAocGMpCitleHRlcm4gQ09SRV9BRERSIHN1bm9zNF9za2lwX3RyYW1wb2xpbmVfY29kZSBQQVJBTVMgKChDT1JFX0FERFIpKTsKKworLyogT2Zmc2V0cyBpbnRvIGptcF9idWYuICBOb3QgZGVmaW5lZCBieSBTdW4sIGJ1dCBhdCBsZWFzdCBkb2N1bWVudGVkIGluIGEKKyAgIGNvbW1lbnQgaW4gPG1hY2hpbmUvc2V0am1wLmg+ISAqLworCisjZGVmaW5lIEpCX0VMRU1FTlRfU0laRSA0CS8qIFNpemUgb2YgZWFjaCBlbGVtZW50IGluIGptcF9idWYgKi8KKworI2RlZmluZSBKQl9PTlNTVEFDSyAwCisjZGVmaW5lIEpCX1NJR01BU0sgMQorI2RlZmluZSBKQl9TUCAyCisjZGVmaW5lIEpCX1BDIDMKKyNkZWZpbmUgSkJfTlBDIDQKKyNkZWZpbmUgSkJfUFNSIDUKKyNkZWZpbmUgSkJfRzEgNgorI2RlZmluZSBKQl9PMCA3CisjZGVmaW5lIEpCX1dCQ05UIDgKKworLyogRmlndXJlIG91dCB3aGVyZSB0aGUgbG9uZ2ptcCB3aWxsIGxhbmQuICBXZSBleHBlY3QgdGhhdCB3ZSBoYXZlIGp1c3QgZW50ZXJlZAorICAgbG9uZ2ptcCBhbmQgaGF2ZW4ndCB5ZXQgc2V0dXAgdGhlIHN0YWNrIGZyYW1lLCBzbyB0aGUgYXJncyBhcmUgc3RpbGwgaW4gdGhlCisgICBvdXRwdXQgcmVncy4gICVvMCAoTzBfUkVHTlVNKSBwb2ludHMgYXQgdGhlIGptcF9idWYgc3RydWN0dXJlIGZyb20gd2hpY2ggd2UKKyAgIGV4dHJhY3QgdGhlIHBjIChKQl9QQykgdGhhdCB3ZSB3aWxsIGxhbmQgYXQuICBUaGUgcGMgaXMgY29waWVkIGludG8gQUREUi4KKyAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRydWUgb24gc3VjY2VzcyAqLworCitleHRlcm4gaW50CitnZXRfbG9uZ2ptcF90YXJnZXQgUEFSQU1TICgoQ09SRV9BRERSICopKTsKKworI2RlZmluZSBHRVRfTE9OR0pNUF9UQVJHRVQoQUREUikgZ2V0X2xvbmdqbXBfdGFyZ2V0KEFERFIpCisKK2V4dGVybiBjaGFyICpzdW5wcm9fc3RhdGljX3RyYW5zZm9ybV9uYW1lIFBBUkFNUyAoKGNoYXIgKikpOworI2RlZmluZSBTVEFUSUNfVFJBTlNGT1JNX05BTUUoeCkgc3VucHJvX3N0YXRpY190cmFuc2Zvcm1fbmFtZSAoeCkKKyNkZWZpbmUgSVNfU1RBVElDX1RSQU5TRk9STV9OQU1FKG5hbWUpICgobmFtZSlbMF0gPT0gJyQnKQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9zcGFyYy90bS1zdW40c29sMi5oIGIvZ2RiL2NvbmZpZy9zcGFyYy90bS1zdW40c29sMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYWI2ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NwYXJjL3RtLXN1bjRzb2wyLmgKQEAgLTAsMCArMSw5NCBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIEdEQiBmb3IgYSBTdW4gNCBydW5uaW5nIFNvbGFyaXMgMgorICAgQ29weXJpZ2h0IDE5ODksIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJzcGFyYy90bS1zcGFyYy5oIgorI2luY2x1ZGUgInRtLXN5c3Y0LmgiCisgCisvKiBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCBzaWduYWwgaGFuZGxlciB0cmFtcG9saW5lcyBpbiBTb2xhcmlzMi4gICovCisjZGVmaW5lIElOX1NJR1RSQU1QKHBjLCBuYW1lKSBcCisgICgobmFtZSkgXAorICAgJiYgKFNUUkVRICgic2lnYWN0aGFuZGxlciIsIG5hbWUpIHx8IFNUUkVRICgidWNic2lndmVjaGFuZGxlciIsIG5hbWUpKSkKKyAKKy8qIFRoZSBzaWduYWwgaGFuZGxlciBnZXRzIGEgcG9pbnRlciB0byBhbiB1Y29udGV4dCBhcyB0aGlyZCBhcmd1bWVudAorICAgaWYgaXQgaXMgY2FsbGVkIGZyb20gc2lnYWN0aGFuZGxlci4gIFRoaXMgaXMgdGhlIG9mZnNldCB0byB0aGUgc2F2ZWQKKyAgIFBDIHdpdGhpbiBpdC4gIHNwYXJjX2ZyYW1lX3NhdmVkX3BjIGtub3dzIGhvdyB0byBkZWFsIHdpdGgKKyAgIHVjYnNpZ3ZlY2hhbmRsZXIuICAqLyAgCisjZGVmaW5lIFNJR0NPTlRFWFRfUENfT0ZGU0VUIDQ0CisKKyNpZiAwCS8qIEZJWE1FIFNldGptcC9sb25nam1wIGFyZSBub3QgYXMgd2VsbCBkb2MnZCBpbiBTdW5PUyA1LnggeWV0ICovCisKKy8qIE9mZnNldHMgaW50byBqbXBfYnVmLiAgTm90IGRlZmluZWQgYnkgU3VuLCBidXQgYXQgbGVhc3QgZG9jdW1lbnRlZCBpbiBhCisgICBjb21tZW50IGluIDxtYWNoaW5lL3NldGptcC5oPiEgKi8KKworI2RlZmluZSBKQl9FTEVNRU5UX1NJWkUgNAkvKiBTaXplIG9mIGVhY2ggZWxlbWVudCBpbiBqbXBfYnVmICovCisKKyNkZWZpbmUgSkJfT05TU1RBQ0sgMAorI2RlZmluZSBKQl9TSUdNQVNLIDEKKyNkZWZpbmUgSkJfU1AgMgorI2RlZmluZSBKQl9QQyAzCisjZGVmaW5lIEpCX05QQyA0CisjZGVmaW5lIEpCX1BTUiA1CisjZGVmaW5lIEpCX0cxIDYKKyNkZWZpbmUgSkJfTzAgNworI2RlZmluZSBKQl9XQkNOVCA4CisKKy8qIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIGxvbmdqbXAgd2lsbCBsYW5kLiAgV2UgZXhwZWN0IHRoYXQgd2UgaGF2ZSBqdXN0IGVudGVyZWQKKyAgIGxvbmdqbXAgYW5kIGhhdmVuJ3QgeWV0IHNldHVwIHRoZSBzdGFjayBmcmFtZSwgc28gdGhlIGFyZ3MgYXJlIHN0aWxsIGluIHRoZQorICAgb3V0cHV0IHJlZ3MuICAlbzAgKE8wX1JFR05VTSkgcG9pbnRzIGF0IHRoZSBqbXBfYnVmIHN0cnVjdHVyZSBmcm9tIHdoaWNoIHdlCisgICBleHRyYWN0IHRoZSBwYyAoSkJfUEMpIHRoYXQgd2Ugd2lsbCBsYW5kIGF0LiAgVGhlIHBjIGlzIGNvcGllZCBpbnRvIEFERFIuCisgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MgKi8KKworZXh0ZXJuIGludAorZ2V0X2xvbmdqbXBfdGFyZ2V0IFBBUkFNUyAoKENPUkVfQUREUiAqKSk7CisKKyNkZWZpbmUgR0VUX0xPTkdKTVBfVEFSR0VUKEFERFIpIGdldF9sb25nam1wX3RhcmdldChBRERSKQorI2VuZGlmICAvKiAwICovCisKKy8qIFRoZSBTdW5QUk8gY29tcGlsZXIgcHV0cyBvdXQgMCBpbnN0ZWFkIG9mIHRoZSBhZGRyZXNzIGluIE5fU08gc3ltYm9scywKKyAgIGFuZCBmb3IgU3VuUFJPIDMuMCwgTl9GVU4gc3ltYm9scyB0b28uICAqLworI2RlZmluZSBTT0ZVTl9BRERSRVNTX01BWUJFX01JU1NJTkcKKworZXh0ZXJuIGNoYXIgKnN1bnByb19zdGF0aWNfdHJhbnNmb3JtX25hbWUgUEFSQU1TICgoY2hhciAqKSk7CisjZGVmaW5lIFNUQVRJQ19UUkFOU0ZPUk1fTkFNRSh4KSBzdW5wcm9fc3RhdGljX3RyYW5zZm9ybV9uYW1lICh4KQorI2RlZmluZSBJU19TVEFUSUNfVFJBTlNGT1JNX05BTUUobmFtZSkgKChuYW1lKVswXSA9PSAnJCcpCisKKyNkZWZpbmUgRkFVTFRFRF9VU0VfU0lHSU5GTworCisvKiBFbmFibGUgaGFuZGxpbmcgb2Ygc2hhcmVkIGxpYnJhcmllcyBmb3IgYS5vdXQgZXhlY3V0YWJsZXMuICAqLworI2RlZmluZSBIQU5ETEVfU1ZSNF9FWEVDX0VNVUxBVE9SUworCisvKiBNYWNyb3MgdG8gZXh0cmFjdCBwcm9jZXNzIGlkIGFuZCB0aHJlYWQgaWQgZnJvbSBhIGNvbXBvc2l0ZSBwaWQvdGlkICovCisjZGVmaW5lIFBJREdFVChwaWQpICgocGlkKSAmIDB4ZmZmZikKKyNkZWZpbmUgVElER0VUKHBpZCkgKCgocGlkKSA+PiAxNikgJiAweGZmZmYpCisKKy8qIE1hY3JvIHRvIGV4dHJhY3QgY2FycnkgZnJvbSBnaXZlbiByZWdzZXQuICAqLworI2RlZmluZSBQUk9DRlNfR0VUX0NBUlJZKHJlZ3NldCkgKChyZWdzZXQpW1JfUFNSXSAmIFBTX0ZMQUdfQ0FSUlkpCisKKyNpZmRlZiBIQVZFX1RIUkVBRF9EQl9MSUIKKworZXh0ZXJuIGNoYXIgKnNvbGFyaXNfcGlkX3RvX3N0ciBQQVJBTVMgKChpbnQgcGlkKSk7CisjZGVmaW5lIHRhcmdldF9waWRfdG9fc3RyKFBJRCkgc29sYXJpc19waWRfdG9fc3RyIChQSUQpCisKKyNlbHNlCisKK2V4dGVybiBjaGFyICpwcm9jZnNfcGlkX3RvX3N0ciBQQVJBTVMgKChpbnQgcGlkKSk7CisjZGVmaW5lIHRhcmdldF9waWRfdG9fc3RyKFBJRCkgcHJvY2ZzX3BpZF90b19zdHIgKFBJRCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3NwYXJjL3RtLXZ4c3BhcmMuaCBiL2dkYi9jb25maWcvc3BhcmMvdG0tdnhzcGFyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MTI5NDMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NwYXJjL3RtLXZ4c3BhcmMuaApAQCAtMCwwICsxLDM2IEBACisvKiBUYXJnZXQgbWFjaGluZSBkZXNjcmlwdGlvbiBmb3IgVnhXb3JrcyBzcGFyYydzLCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lCUdEQklOSVRfRklMRU5BTUUJIi52eGdkYmluaXQiCisKKyNkZWZpbmUJREVGQVVMVF9QUk9NUFQJCSIodnhnZGIpICIKKworI2luY2x1ZGUgInNwYXJjL3RtLXNwYy1lbS5oIgorCisvKiBGSVhNRTogVGhlc2UgYXJlIGFsbW9zdCBjZXJ0YWlubHkgd3JvbmcuICovCisKKy8qIE51bWJlciBvZiByZWdpc3RlcnMgaW4gYSBwdHJhY2VfZ2V0cmVncyBjYWxsLiAqLworCisjZGVmaW5lIFZYX05VTV9SRUdTIChOVU1fUkVHUykKKworLyogTnVtYmVyIG9mIHJlZ2lzdGVycyBpbiBhIHB0cmFjZV9nZXRmcHJlZ3MgY2FsbC4gKi8KKworLyogI2RlZmluZSBWWF9TSVpFX0ZQUkVHUyAoZG9uJ3Qga25vdyBob3cgbWFueSkgKi8KKwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9zcGFyYy92eHNwYXJjLm10IGIvZ2RiL2NvbmZpZy9zcGFyYy92eHNwYXJjLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYWRkMTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NwYXJjL3Z4c3BhcmMubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogU1BBUkMgcnVubmluZyBWeFdvcmtzCitUREVQRklMRVM9IHNwYXJjLXRkZXAubyByZW1vdGUtdngubyByZW1vdGUtdnhzcGFyYy5vIHhkcl9sZC5vIHhkcl9wdHJhY2UubyB4ZHJfcmRiLm8KK1RNX0ZJTEU9IHRtLXZ4c3BhcmMuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9zcGFyYy94bS1saW51eC5oIGIvZ2RiL2NvbmZpZy9zcGFyYy94bS1saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNjhiNjMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NwYXJjL3htLWxpbnV4LmgKQEAgLTAsMCArMSw0OCBAQAorLyogTWFjcm8gZGVmaW5pdGlvbnMgZm9yIHJ1bm5pbmcgZ2RiIG9uIGEgU3BhcmMgcnVubmluZyBMaW51eC4KKyAgIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBYTV9TUEFSQ0xJTlVYX0gKKyNkZWZpbmUgWE1fU1BBUkNMSU5VWF9ICisKKyNpbmNsdWRlICJzcGFyYy94bS1zcGFyYy5oIgorCisjZGVmaW5lIEhBVkVfVEVSTUlPUworLyogVGhpcyBpcyB0aGUgYW1vdW50IHRvIHN1YnRyYWN0IGZyb20gdS51X2FyMAorICAgdG8gZ2V0IHRoZSBvZmZzZXQgaW4gdGhlIGNvcmUgZmlsZSBvZiB0aGUgcmVnaXN0ZXIgdmFsdWVzLiAgKi8KKyNkZWZpbmUgS0VSTkVMX1VfQUREUiAweDAKKworI2RlZmluZSBVX1JFR1NfT0ZGU0VUIDAKKworI2RlZmluZSBORUVEX1BPU0lYX1NFVFBHSUQKKworLyogTmVlZCBSX09LIGV0YywgYnV0IFVTRyBpc24ndCBkZWZpbmVkLiAgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyogSWYgeW91IGV4cGVjdCB0byB1c2UgdGhlIG1tYWxsb2MgcGFja2FnZSB0byBvYnRhaW4gbWFwcGVkIHN5bWJvbCBmaWxlcywKKyAgIGZvciBub3cgeW91IGhhdmUgdG8gc3BlY2lmeSBzb21lIHBhcmFtZXRlcnMgdGhhdCBkZXRlcm1pbmUgaG93IGdkYiBwbGFjZXMKKyAgIHRoZSBtYXBwaW5ncyBpbiBpdCdzIGFkZHJlc3Mgc3BhY2UuICBTZWUgdGhlIGNvbW1lbnRzIGluIG1hcF90b19hZGRyZXNzKCkKKyAgIGZvciBkZXRhaWxzLiAgVGhpcyBpcyBleHBlY3RlZCB0byBvbmx5IGJlIGEgc2hvcnQgdGVybSBzb2x1dGlvbi4gIFllcyBpdAorICAgaXMgYSBrbHVkZ2UuCisgICBGSVhNRTogIE1ha2UgdGhpcyBtb3JlIGF1dG9tYXRpYy4gKi8KKworI2RlZmluZSBNTUFQX0JBU0VfQUREUkVTUyAgICAgIDB4RTAwMDAwMDAgICAgICAvKiBGaXJzdCBtYXBwaW5nIGhlcmUgKi8KKyNkZWZpbmUgTU1BUF9JTkNSRU1FTlQgICAgICAgICAweDAxMDAwMDAwICAgICAgLyogSW5jcmVtZW50IHRvIG5leHQgbWFwcGluZyAqLworCisjZW5kaWYgLyogX1hNX1NQQVJDTElOVVhfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9zcGFyYy94bS1uYnNkLmggYi9nZGIvY29uZmlnL3NwYXJjL3htLW5ic2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWZlODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy9zcGFyYy94bS1uYnNkLmgKQEAgLTAsMCArMSwyMSBAQAorLyogUGFyYW1ldGVycyBmb3IgZXhlY3V0aW9uIG9uIGEgU3BhcmMgcnVubmluZyBOZXRCU0QsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBHZXQgZ2VuZXJpYyBOZXRCU0QgaG9zdCBkZWZpbml0aW9ucy4gKi8KKyNpbmNsdWRlICJ4bS1uYnNkLmgiCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3NwYXJjL3htLXNwYXJjLmggYi9nZGIvY29uZmlnL3NwYXJjL3htLXNwYXJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjMjQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvc3BhcmMveG0tc3BhcmMuaApAQCAtMCwwICsxLDIyIEBACisvKiBIb3N0IGRlZmluaXRpb25zIGZvciBhIFN1biA0LCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTEsIDE5OTIsIDE5OTYKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgTWljaGFlbCBUaWVtYW5uICh0aWVtYW5uQG1jYy5jb20pLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgSE9TVF9CWVRFX09SREVSIEJJR19FTkRJQU4KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvc3BhcmMveG0tc3BhcmNseW54LmggYi9nZGIvY29uZmlnL3NwYXJjL3htLXNwYXJjbHlueC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNjI2MjgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NwYXJjL3htLXNwYXJjbHlueC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qIEhvc3QtZGVwZW5kZW50IGRlZmluaXRpb25zIGZvciBTcGFyYyBydW5uaW5nIEx5bnhPUywgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgSE9TVF9CWVRFX09SREVSIEJJR19FTkRJQU4KKworLyogR2V0IGdlbmVyaWMgTHlueE9TIGhvc3QgZGVmaW5pdGlvbnMuICovCisKKyNpbmNsdWRlICJ4bS1seW54LmgiCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3NwYXJjL3htLXN1bjRvczQuaCBiL2dkYi9jb25maWcvc3BhcmMveG0tc3VuNG9zNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MGEyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3NwYXJjL3htLXN1bjRvczQuaApAQCAtMCwwICsxLDM0IEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgcnVubmluZyBnZGIgb24gYSBTdW4gNCBydW5uaW5nIHN1bm9zIDQuCisgICBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJzcGFyYy94bS1zcGFyYy5oIgorCisjZGVmaW5lIEZQVQorCisvKiAvdXNyL2luY2x1ZGUvbWFsbG9jLmggaXMgaW5jbHVkZWQgYnkgdngtc2hhcmUveGRyX2xkLCBhbmQgbWlnaHQKKyAgIGRlY2xhcmUgdGhlc2UgdXNpbmcgY2hhciAqIG5vdCB2b2lkICouICBUaGUgZm9sbG93aW5nIHNob3VsZCB3b3JrIHdpdGgKKyAgIGFjYywgZ2NjLCBvciAvYmluL2NjLiAgKi8KKworI2RlZmluZSBNQUxMT0NfSU5DT01QQVRJQkxFCisjaW5jbHVkZSA8bWFsbG9jLmg+CisKKy8qIFN1bk9TIDQueCB1c2VzIG5vbnN0YW5kYXJkICJjaGFyICoiIGFzIHR5cGUgb2YgdGhpcmQgYXJndW1lbnQgdG8gcHRyYWNlKCkgKi8KKworI2RlZmluZSBQVFJBQ0VfQVJHM19UWVBFIGNoYXIqCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3NwYXJjL3htLXN1bjRzb2wyLmggYi9nZGIvY29uZmlnL3NwYXJjL3htLXN1bjRzb2wyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0OWNlNAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvc3BhcmMveG0tc3VuNHNvbDIuaApAQCAtMCwwICsxLDQ5IEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgcnVubmluZyBnZGIgb24gYSBTdW4gNCBydW5uaW5nIFNvbGFyaXMgMi4KKyAgIENvcHlyaWdodCAxOTg5LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIE1vc3Qgb2Ygd2hhdCB3ZSBrbm93IGlzIGdlbmVyaWMgdG8gU1BBUkMgaG9zdHMuICAqLworCisjaW5jbHVkZSAic3BhcmMveG0tc3BhcmMuaCIKKworLyogUGljayB1cCBtb3JlIHN0dWZmIGZyb20gdGhlIGdlbmVyaWMgU1ZSNCBob3N0IGluY2x1ZGUgZmlsZS4gKi8KKworI2luY2x1ZGUgInhtLXN5c3Y0LmgiCisKKy8qIGdkYiB3YW50cyB0byB1c2UgdGhlIHByZ3JlZ3NldF90IGludGVyZmFjZSByYXRoZXIgdGhhbgorICAgdGhlIGdyZWdzZXRfdCBpbnRlcmZhY2UsIHBhcnRseSBiZWNhdXNlIHRoYXQncyB3aGF0J3MKKyAgIHVzZWQgaW4gY29yZS1zb2wyLmMgKi8KKworI2RlZmluZSBHREJfR1JFR1NFVF9UWVBFIHByZ3JlZ3NldF90CisjZGVmaW5lIEdEQl9GUFJFR1NFVF9UWVBFIHByZnByZWdzZXRfdAorCisvKiBUaGVzZSBhcmUgbm90IGN1cnJlbnRseSB1c2VkIGluIFNWUjQgKGJ1dCBzaG91bGQgYmUsIEZJWE1FISkuICAqLworI3VuZGVmCURPX0RFRkVSUkVEX1NUT1JFUworI3VuZGVmCUNMRUFSX0RFRkVSUkVEX1NUT1JFUworCisvKiBNYXkgYmUgbmVlZGVkLCBtYXkgYmUgbm90PyAgRnJvbSBQYWNlIFdpbGxpc3NvbidzIHBvcnQuICBGSVhNRS4gICovCisjZGVmaW5lIE5FRURfUE9TSVhfU0VUUEdJRAorCisvKiBzb2xhcmlzIGRvZXNuJ3QgaGF2ZSBzaWdpbnRlcnJ1cHQsIHRob3VnaCBpdCBoYXMgc2lnYWN0aW9uOyBob3dldmVyLAorICAgaW4gdGhpcyBjYXNlIHNpZ2ludGVycnVwdCB3b3VsZCBqdXN0IGJlIHNldHRpbmcgdGhlIGRlZmF1bHQuICovCisjZGVmaW5lIE5PX1NJR0lOVEVSUlVQVAorCisvKiBPbiBzb2wyLjcsIDxjdXJzZXMuaD4gZW1pdHMgYSBidW5jaCBvZiAnbWFjcm8gcmVkZWZpbmVkJworICAgd2FybmluZ3MsIHdoaWNoIG1ha2VzIGF1dG9jb25mIHRoaW5rIGN1cnNlcy5oIGRvZXNuJ3QKKyAgIGV4aXN0LiAgQ29tcGVuc2F0ZSBmb3QgdGhhdCBoZXJlLiAqLworI2RlZmluZSBIQVZFX0NVUlNFU19IIDEKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvdGFob2UvdGFob2UubWggYi9nZGIvY29uZmlnL3RhaG9lL3RhaG9lLm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTRjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3RhaG9lL3RhaG9lLm1oCkBAIC0wLDAgKzEsNCBAQAorIyBIb3N0OiBDQ0kgb3IgSGFycmlzIFRhaG9lIHJ1bm5pbmcgQlNEIFVuaXgKKworWE1fRklMRT0geG0tdGFob2UuaAorWERFUEZJTEVTPSBpbmZwdHJhY2UubyBpbmZ0YXJnLm8gZm9yay1jaGlsZC5vIGNvcmVsb3cubyBjb3JlLWFvdXQubwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy90YWhvZS90YWhvZS5tdCBiL2dkYi9jb25maWcvdGFob2UvdGFob2UubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxYTc3ZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvdGFob2UvdGFob2UubXQKQEAgLTAsMCArMSwzIEBACisjIFRhcmdldDogQ0NJIG9yIEhhcnJpcyBUYWhvZSBydW5uaW5nIEJTRCBVbml4CitUREVQRklMRVM9IHRhaG9lLXRkZXAubworVE1fRklMRT0gdG0tdGFob2UuaApkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy90YWhvZS90bS10YWhvZS5oIGIvZ2RiL2NvbmZpZy90YWhvZS90bS10YWhvZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZGYzNzQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3RhaG9lL3RtLXRhaG9lLmgKQEAgLTAsMCArMSwyODkgQEAKKy8qIERlZmluaXRpb25zIHRvIG1ha2UgR0RCIHRhcmdldCBmb3IgYSB0YWhvZSBydW5uaW5nIDQuMy1SZW5vLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTEsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKyAqIFBvcnRlZCBieSB0aGUgU3RhdGUgVW5pdmVyc2l0eSBvZiBOZXcgWW9yayBhdCBCdWZmYWxvIGJ5IHRoZSBEaXN0cmlidXRlZAorICogQ29tcHV0ZXIgU3lzdGVtcyBMYWIsIERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZSwgMTk5MS4KKyAqLworCisjZGVmaW5lIFRBUkdFVF9CWVRFX09SREVSIEJJR19FTkRJQU4KKyNkZWZpbmUgQklUU19CSUdfRU5ESUFOIDAKKworLyogT2Zmc2V0IGZyb20gYWRkcmVzcyBvZiBmdW5jdGlvbiB0byBzdGFydCBvZiBpdHMgY29kZS4KKyAgIFplcm8gb24gbW9zdCBtYWNoaW5lcy4gICovCisKKyNkZWZpbmUgRlVOQ1RJT05fU1RBUlRfT0ZGU0VUIDIKKworLyogQWR2YW5jZSBQQyBhY3Jvc3MgYW55IGZ1bmN0aW9uIGVudHJ5IHByb2xvZ3VlIGluc3RydWN0aW9ucworICAgdG8gcmVhY2ggc29tZSAicmVhbCIgY29kZS4gICovCisKKyNkZWZpbmUgU0tJUF9QUk9MT0dVRShwYykJXAoreyByZWdpc3RlciBpbnQgb3AgPSAodW5zaWduZWQgY2hhcikgcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDEpOyAgXAorICBpZiAob3AgPT0gMHgxMSkgcGMgKz0gMjsgIC8qIHNraXAgYnJiICovCQkJICBcCisgIGlmIChvcCA9PSAweDEzKSBwYyArPSAzOyAgLyogc2tpcCBicncgKi8JCQkgIFwKKyAgaWYgKG9wID09IDB4MmMgJiYJCQkJCQkgIFwKKyAgICAgICgodW5zaWduZWQgY2hhcikgcmVhZF9tZW1vcnlfaW50ZWdlciAocGMrMiwgMSkpID09IDB4NWUpCSAgXAorICAgIHBjICs9IDM7ICAvKiBza2lwIHN1YmwyICovCQkJCQkgIFwKKyAgaWYgKG9wID09IDB4ZTkgJiYJCQkJCQkgIFwKKyAgICAgICgodW5zaWduZWQgY2hhcikgcmVhZF9tZW1vcnlfaW50ZWdlciAocGMrMSwgMSkpID09IDB4YWUgJiYgIFwKKyAgICAgICgodW5zaWduZWQgY2hhcikgcmVhZF9tZW1vcnlfaW50ZWdlcihwYyszLCAxKSkgPT0gMHg1ZSkJICBcCisgICAgIHBjICs9IDQ7ICAvKiBza2lwIG1vdmFiICovCQkJCQkgIFwKKyAgaWYgKG9wID09IDB4ZTkgJiYJCQkJCQkgIFwKKyAgICAgICgodW5zaWduZWQgY2hhcikgcmVhZF9tZW1vcnlfaW50ZWdlciAocGMrMSwgMSkpID09IDB4Y2UgJiYgIFwKKyAgICAgICgodW5zaWduZWQgY2hhcikgcmVhZF9tZW1vcnlfaW50ZWdlcihwYys0LCAxKSkgPT0gMHg1ZSkJICBcCisgICAgcGMgKz0gNTsgIC8qIHNraXAgbW92YWIgKi8JCQkJCSAgXAorICBpZiAob3AgPT0gMHhlOSAmJgkJCQkJCSAgXAorICAgICAgKCh1bnNpZ25lZCBjaGFyKSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYysxLCAxKSkgPT0gMHhlZSAmJiAgXAorICAgICAgKCh1bnNpZ25lZCBjaGFyKSByZWFkX21lbW9yeV9pbnRlZ2VyKHBjKzYsIDEpKSA9PSAweDVlKQkgIFwKKyAgICBwYyArPSA3OyAgLyogc2tpcCBtb3ZhYiAqLwkJCQkJICBcCit9CisKKy8qIEltbWVkaWF0ZWx5IGFmdGVyIGEgZnVuY3Rpb24gY2FsbCwgcmV0dXJuIHRoZSBzYXZlZCBwYy4KKyAgIENhbid0IGFsd2F5cyBnbyB0aHJvdWdoIHRoZSBmcmFtZXMgZm9yIHRoaXMgYmVjYXVzZSBvbiBzb21lIG1hY2hpbmVzCisgICB0aGUgbmV3IGZyYW1lIGlzIG5vdCBzZXQgdXAgdW50aWwgdGhlIG5ldyBmdW5jdGlvbiBleGVjdXRlcworICAgc29tZSBpbnN0cnVjdGlvbnMuICAqLworCisjZGVmaW5lIFNBVkVEX1BDX0FGVEVSX0NBTEwoZnJhbWUpIEZSQU1FX1NBVkVEX1BDKGZyYW1lKQorCisvKiBXcm9uZyBmb3IgY3Jvc3MtZGVidWdnaW5nLiAgSSBkb24ndCBrbm93IHRoZSByZWFsIHZhbHVlcy4gICovCisjaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgorI2RlZmluZSBUQVJHRVRfVVBBR0VTIFVQQUdFUworI2RlZmluZSBUQVJHRVRfTkJQRyBOQlBHCisKKy8qIEFkZHJlc3Mgb2YgZW5kIG9mIHN0YWNrIHNwYWNlLiAgKi8KKworI2RlZmluZSBTVEFDS19FTkRfQUREUiAoMHhjMDAwMDAwMCAtIChUQVJHRVRfVVBBR0VTICogVEFSR0VUX05CUEcpKQorCisvKiBPbiBCU0QsIHNpZ3RyYW1wIGlzIGluIHRoZSB1IGFyZWEuICBDYW4ndCBjaGVjayB0aGUgZXhhY3QKKyAgIGFkZHJlc3NlcyBiZWNhdXNlIGZvciBjcm9zcy1kZWJ1Z2dpbmcgd2UgZG9uJ3QgaGF2ZSB0YXJnZXQgaW5jbHVkZQorICAgZmlsZXMgYXJvdW5kLiAgVGhpcyBzaG91bGQgYmUgY2xvc2UgZW5vdWdoLiAgKi8KKyNkZWZpbmUgSU5fU0lHVFJBTVAocGMsIG5hbWUpICgocGMpID49IFNUQUNLX0VORF9BRERSICYmIChwYyA8IDB4YzAwMDAwMDApKQorCisvKiBTdGFjayBncm93cyBkb3dud2FyZC4gICovCisKKyNkZWZpbmUgSU5ORVJfVEhBTihsaHMscmhzKSAoKGxocykgPCAocmhzKSkKKworLyogU2VxdWVuY2Ugb2YgYnl0ZXMgZm9yIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uICAqLworCisjZGVmaW5lIEJSRUFLUE9JTlQgezB4MzB9CisKKy8qIEFtb3VudCBQQyBtdXN0IGJlIGRlY3JlbWVudGVkIGJ5IGFmdGVyIGEgYnJlYWtwb2ludC4KKyAgIFRoaXMgaXMgb2Z0ZW4gdGhlIG51bWJlciBvZiBieXRlcyBpbiBCUkVBS1BPSU5UCisgICBidXQgbm90IGFsd2F5cy4gICovCisKKyNkZWZpbmUgREVDUl9QQ19BRlRFUl9CUkVBSyAwCisKKy8qIFJldHVybiAxIGlmIFAgcG9pbnRzIHRvIGFuIGludmFsaWQgZmxvYXRpbmcgcG9pbnQgdmFsdWUuCisgICBMRU4gaXMgdGhlIGxlbmd0aCBpbiBieXRlcyAtLSBub3QgcmVsZXZhbnQgb24gdGhlIFRhaG9lLiAqLworCisjZGVmaW5lIElOVkFMSURfRkxPQVQocCwgbGVuKSAoKCooc2hvcnQgKikgcCAmIDB4ZmY4MCkgPT0gMHg4MDAwKQorCisvKiBTYXkgaG93IGxvbmcgKG9yZGluYXJ5KSByZWdpc3RlcnMgYXJlLiAgVGhpcyBpcyBhIHBpZWNlIG9mIGJvZ29zaXR5CisgICB1c2VkIGluIHB1c2hfd29yZCBhbmQgYSBmZXcgb3RoZXIgcGxhY2VzOyBSRUdJU1RFUl9SQVdfU0laRSBpcyB0aGUKKyAgIHJlYWwgd2F5IHRvIGtub3cgaG93IGJpZyBhIHJlZ2lzdGVyIGlzLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9TSVpFIDQKKworLyogTnVtYmVyIG9mIG1hY2hpbmUgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTlVNX1JFR1MgMTkKKworLyogSW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIG5hbWVzIG9mIHJlZ2lzdGVycy4KKyAgIFRoZXJlIHNob3VsZCBiZSBOVU1fUkVHUyBzdHJpbmdzIGluIHRoaXMgaW5pdGlhbGl6ZXIuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX05BTUVTIHsicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLCAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsICJyMTIiLCAiZnAiLCAic3AiLCAicGMiLCAicHMiLCAiYWwiLCAiYWgifQorCisjZGVmaW5lIEZQX1JFR05VTSAxMwkJLyogQ29udGFpbnMgYWRkcmVzcyBvZiBleGVjdXRpbmcgc3RhY2sgZnJhbWUgKi8KKyNkZWZpbmUgU1BfUkVHTlVNIDE0CQkvKiBDb250YWlucyBhZGRyZXNzIG9mIHRvcCBvZiBzdGFjayAqLworI2RlZmluZSBQQ19SRUdOVU0gMTUJCS8qIENvbnRhaW5zIHByb2dyYW0gY291bnRlciAqLworI2RlZmluZSBQU19SRUdOVU0gMTYJCS8qIENvbnRhaW5zIHByb2Nlc3NvciBzdGF0dXMgKi8KKworI2RlZmluZSBBTF9SRUdOVU0gMTcJCS8qIENvbnRhaW5zIGFjY3VtdWxhdG9yICovCisjZGVmaW5lIEFIX1JFR05VTSAxOAorCisvKiBUb3RhbCBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIHRvIHN0b3JlIG91ciBjb3BpZXMgb2YgdGhlIG1hY2hpbmUncworICAgcmVnaXN0ZXIgc3RhdGUsIHRoZSBhcnJheSBgcmVnaXN0ZXJzJy4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfQllURVMgKDE5KjQpCisKKy8qIEluZGV4IHdpdGhpbiBgcmVnaXN0ZXJzJyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3BhY2UgZm9yCisgICByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9CWVRFKE4pICgoTikgKiA0KQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgYWN0dWFsIG1hY2hpbmUgcmVwcmVzZW50YXRpb24KKyAgIGZvciByZWdpc3RlciBOLiAgT24gdGhlIHRhaG9lLCBhbGwgcmVncyBhcmUgNCBieXRlcy4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfUkFXX1NJWkUoTikgNAorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgcHJvZ3JhbSdzIHJlcHJlc2VudGF0aW9uCisgICBmb3IgcmVnaXN0ZXIgTi4gIE9uIHRoZSB0YWhvZSwgYWxsIHJlZ3MgYXJlIDQgYnl0ZXMuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfU0laRShOKSA0CisKKy8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfUkFXX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9SQVdfU0laRSA0CisKKy8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfVklSVFVBTF9TSVpFIGNhbiBoYXZlLiAgKi8KKworI2RlZmluZSBNQVhfUkVHSVNURVJfVklSVFVBTF9TSVpFIDQKKworLyogUmV0dXJuIHRoZSBHREIgdHlwZSBvYmplY3QgZm9yIHRoZSAic3RhbmRhcmQiIGRhdGEgdHlwZQorICAgb2YgZGF0YSBpbiByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1RZUEUoTikgYnVpbHRpbl90eXBlX2ludAorCisvKiBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUgcGxhY2UgaW4gd2hpY2ggdG8gY29weSB0aGUgc3RydWN0dXJlIHRoZQorICAgc3Vicm91dGluZSB3aWxsIHJldHVybi4gIFRoaXMgaXMgY2FsbGVkIGZyb20gY2FsbF9mdW5jdGlvbi4gKi8KKworI2RlZmluZSBTVE9SRV9TVFJVQ1RfUkVUVVJOKEFERFIsIFNQKSBcCisgIHsgd3JpdGVfcmVnaXN0ZXIgKDEsIChBRERSKSk7IH0KKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgb2YgdHlwZSBUWVBFLCBhbmQgY29weSB0aGF0LCBpbiB2aXJ0dWFsIGZvcm1hdCwKKyAgIGludG8gVkFMQlVGLiAgKi8KKworI2RlZmluZSBFWFRSQUNUX1JFVFVSTl9WQUxVRShUWVBFLFJFR0JVRixWQUxCVUYpIFwKKyAgbWVtY3B5IChWQUxCVUYsIFJFR0JVRiwgVFlQRV9MRU5HVEggKFRZUEUpKQorCisvKiBXcml0ZSBpbnRvIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZQorICAgb2YgdHlwZSBUWVBFLCBnaXZlbiBpbiB2aXJ0dWFsIGZvcm1hdC4gICovCisKKyNkZWZpbmUgU1RPUkVfUkVUVVJOX1ZBTFVFKFRZUEUsVkFMQlVGKSBcCisgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzICgwLCBWQUxCVUYsIFRZUEVfTEVOR1RIIChUWVBFKSkKKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgdGhlIGFkZHJlc3MgaW4gd2hpY2ggYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGl0cyBzdHJ1Y3R1cmUgdmFsdWUsCisgICBhcyBhIENPUkVfQUREUiAob3IgYW4gZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIG9uZSkuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MoUkVHQlVGKSAoKihpbnQgKikoUkVHQlVGKSkKKworLyogRGVzY3JpYmUgdGhlIHBvaW50ZXIgaW4gZWFjaCBzdGFjayBmcmFtZSB0byB0aGUgcHJldmlvdXMgc3RhY2sgZnJhbWUKKyAgIChpdHMgY2FsbGVyKS4KKworICAgRlJBTUVfQ0hBSU4gdGFrZXMgYSBmcmFtZSdzIG5vbWluYWwgYWRkcmVzcworICAgYW5kIHByb2R1Y2VzIHRoZSBmcmFtZSdzIGNoYWluLXBvaW50ZXIuICovCisKKy8qIEluIHRoZSBjYXNlIG9mIHRoZSBUYWhvZSwgdGhlIGZyYW1lJ3Mgbm9taW5hbCBhZGRyZXNzIGlzIHRoZSBGUCB2YWx1ZSwKKyAgIGFuZCBpdCBwb2ludHMgdG8gdGhlIG9sZCBGUCAqLworCisjZGVmaW5lIEZSQU1FX0NIQUlOKHRoaXNmcmFtZSkgIFwKKyAgKCFpbnNpZGVfZW50cnlfZmlsZSAoKHRoaXNmcmFtZSktPnBjKSA/IFwKKyAgIHJlYWRfbWVtb3J5X2ludGVnZXIgKCh0aGlzZnJhbWUpLT5mcmFtZSwgNCkgOlwKKyAgIDApCisKKy8qIERlZmluZSBvdGhlciBhc3BlY3RzIG9mIHRoZSBzdGFjayBmcmFtZS4gICovCisKKy8qIFNhdmVkIFBDICovCisKKyNkZWZpbmUgRlJBTUVfU0FWRURfUEMoRlJBTUUpIChyZWFkX21lbW9yeV9pbnRlZ2VyICgoRlJBTUUpLT5mcmFtZSAtIDgsIDQpKQorCisvKiBJbiBtb3N0IG9mIEdEQiwgZ2V0dGluZyB0aGUgYXJncyBhZGRyZXNzIGlzIHRvbyBpbXBvcnRhbnQgdG8KKyAgIGp1c3Qgc2F5ICJJIGRvbid0IGtub3ciLiAqLworCisjZGVmaW5lIEZSQU1FX0FSR1NfQUREUkVTUyhmaSkgKChmaSktPmZyYW1lKQorCisvKiBBZGRyZXNzIHRvIHVzZSBhcyBhbiBhbmNob3IgZm9yIGZpbmRpbmcgbG9jYWwgdmFyaWFibGVzICovCisKKyNkZWZpbmUgRlJBTUVfTE9DQUxTX0FERFJFU1MoZmkpICgoZmkpLT5mcmFtZSkKKworLyogUmV0dXJuIG51bWJlciBvZiBhcmdzIHBhc3NlZCB0byBhIGZyYW1lLgorICAgQ2FuIHJldHVybiAtMSwgbWVhbmluZyBubyB3YXkgdG8gdGVsbC4gICovCisKKyNkZWZpbmUgRlJBTUVfTlVNX0FSR1MobnVtYXJncywgZmkpICBcCit7IG51bWFyZ3MgPSAoKDB4ZmZmZiAmIHJlYWRfbWVtb3J5X2ludGVnZXIoKChmaSktPmZyYW1lLTQpLDQpKSAtIDQpID4+IDI7IH0KKworLyogUmV0dXJuIG51bWJlciBvZiBieXRlcyBhdCBzdGFydCBvZiBhcmdsaXN0IHRoYXQgYXJlIG5vdCByZWFsbHkgYXJncy4gICovCisKKyNkZWZpbmUgRlJBTUVfQVJHU19TS0lQIDAKKworLyogUHV0IGhlcmUgdGhlIGNvZGUgdG8gc3RvcmUsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywKKyAgIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4KKyAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbAorICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDoKKyAgIHRoZSBhZGRyZXNzIHdlIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4gICovCisKKyNkZWZpbmUgRlJBTUVfRklORF9TQVZFRF9SRUdTKGZyYW1lX2luZm8sIGZyYW1lX3NhdmVkX3JlZ3MpIFwKK3sgcmVnaXN0ZXIgaW50IHJlZ251bTsgICAgIFwKKyAgcmVnaXN0ZXIgaW50IHJtYXNrID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoKGZyYW1lX2luZm8pLT5mcmFtZS00LCA0KSA+PiAxNjtcCisgIHJlZ2lzdGVyIENPUkVfQUREUiBuZXh0X2FkZHI7ICAgICBcCisgIG1lbXNldCAoJmZyYW1lX3NhdmVkX3JlZ3MsICdcMCcsIHNpemVvZiBmcmFtZV9zYXZlZF9yZWdzKTsgICAgIFwKKyAgbmV4dF9hZGRyID0gKGZyYW1lX2luZm8pLT5mcmFtZSAtIDg7ICAgICBcCisgIGZvciAocmVnbnVtID0gMTI7IHJlZ251bSA+PSAwOyByZWdudW0tLSwgcm1hc2sgPDw9IDEpICBcCisgICAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbcmVnbnVtXSA9IChybWFzayAmIDB4MTAwMCkgPyAobmV4dF9hZGRyIC09IDQpIDogMDtcCisgIChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzW1NQX1JFR05VTV0gPSAoZnJhbWVfaW5mbyktPmZyYW1lICsgNDsgIFwKKyAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbUENfUkVHTlVNXSA9IChmcmFtZV9pbmZvKS0+ZnJhbWUgLSA4OyAgXAorICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tGUF9SRUdOVU1dID0gKGZyYW1lX2luZm8pLT5mcmFtZTsgICAgICBcCit9CisKKy8qIFRoaW5ncyBuZWVkZWQgZm9yIG1ha2luZyB0aGUgaW5mZXJpb3IgY2FsbCBmdW5jdGlvbnMuICAqLworCisvKiBQdXNoIGFuIGVtcHR5IHN0YWNrIGZyYW1lLCB0byByZWNvcmQgdGhlIGN1cnJlbnQgUEMsIGV0Yy4gICovCisKKyNkZWZpbmUgUFVTSF9EVU1NWV9GUkFNRSBcCit7IHJlZ2lzdGVyIENPUkVfQUREUiBzcCA9IHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSk7CVwKKyAgcmVnaXN0ZXIgaW50IHJlZ251bTsJCQkJCVwKK3ByaW50ZigiUFVTSF9EVU1NWV9GUkFNRVxuIik7CQkJCVwKKyAgc3AgPSBwdXNoX3dvcmQgKHNwLCByZWFkX3JlZ2lzdGVyIChGUF9SRUdOVU0pKTsJXAorICB3cml0ZV9yZWdpc3RlciAoRlBfUkVHTlVNLCBzcCk7CQkJXAorICBzcCA9IHB1c2hfd29yZCAoc3AsIDB4MWZmZjAwMDQpOyAgIC8qU0FWRSBNQVNLKi8JXAorICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKFBDX1JFR05VTSkpOwlcCisgIGZvciAocmVnbnVtID0gMTI7IHJlZ251bSA+PSAwOyByZWdudW0tLSkJCVwKKyAgICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKHJlZ251bSkpOwlcCisgIHdyaXRlX3JlZ2lzdGVyIChTUF9SRUdOVU0sIHNwKTsJCQlcCit9CisKKy8qIERpc2NhcmQgZnJvbSB0aGUgc3RhY2sgdGhlIGlubmVybW9zdCBmcmFtZSwgcmVzdG9yaW5nIGFsbCByZWdpc3RlcnMuICAqLworCisjZGVmaW5lIFBPUF9GUkFNRSAgXAoreyByZWdpc3RlciBDT1JFX0FERFIgZnAgPSByZWFkX3JlZ2lzdGVyIChGUF9SRUdOVU0pOwkJCVwKKyAgcmVnaXN0ZXIgaW50IHJlZ251bTsJCQkJCQkJXAorICByZWdpc3RlciBpbnQgcmVnbWFzayA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKGZwLTQsIDQpOwkJCVwKK3ByaW50ZigiUE9QX0ZSQU1FXG4iKTsJCQkJCQkJXAorICByZWdtYXNrID4+PSAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisgIHdyaXRlX3JlZ2lzdGVyIChTUF9SRUdOVU0sIGZwKzQpOwkgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAorICB3cml0ZV9yZWdpc3RlciAoUENfUkVHTlVNLCByZWFkX21lbW9yeV9pbnRlZ2VyKGZwLTgsIDQpKTsJICAJXAorICB3cml0ZV9yZWdpc3RlciAoRlBfUkVHTlVNLCByZWFkX21lbW9yeV9pbnRlZ2VyKGZwLCA0KSk7ICAJCVwKKyAgZnAgLT0gODsJCQkJCQkJCVwKKyAgZm9yIChyZWdudW0gPSAxMjsgcmVnbnVtID49IDA7IHJlZ251bS0tLCByZWdtYXNrIDw8PSAxKQkJXAorICAgIGlmIChyZWdtYXNrICYgMHgxMDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChyZWdudW0sIHJlYWRfbWVtb3J5X2ludGVnZXIgKGZwLT00LCA0KSk7CQlcCisgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7CQkJCQkJXAorfQorCisvKiBUaGlzIHNlcXVlbmNlIG9mIHdvcmRzIGlzIHRoZSBpbnN0cnVjdGlvbnMKKyAgICAgY2FsbHMgIzY5LCBAIzMyMzIzMjMyCisgICAgIGJwdAorICAgTm90ZSB0aGlzIGlzIDggYnl0ZXMuICAqLworCisjZGVmaW5lIENBTExfRFVNTVkgezB4YmY2OTlmMzIsIDB4MzIzMjMyMzB9CisKKy8qIFN0YXJ0IGV4ZWN1dGlvbiBhdCBiZWdpbm5pbmcgb2YgZHVtbXkgKi8KKworI2RlZmluZSBDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCAwCisKKy8qIEluc2VydCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBhcmdzIGFuZCBmdW5jdGlvbiBhZGRyZXNzCisgICBpbnRvIGEgY2FsbCBzZXF1ZW5jZSBvZiB0aGUgYWJvdmUgZm9ybSBzdG9yZWQgYXQgRFVNTVlOQU1FLiAgKi8KKworI2RlZmluZSBGSVhfQ0FMTF9EVU1NWShkdW1teW5hbWUsIHBjLCBmdW4sIG5hcmdzLCBhcmdzLCB2YWx0eXBlLCB1c2luZ19nY2MpIFwKK3sgaW50IHRlbXAgPSAoaW50KSBmdW47CQkJCVwKKyAgKigoY2hhciAqKSBkdW1teW5hbWUgKyAxKSA9IG5hcmdzOwkJXAorICBtZW1jcHkoKGNoYXIgKilkdW1teW5hbWUrMywmdGVtcCw0KTsgfQorCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3RhaG9lL3htLXRhaG9lLmggYi9nZGIvY29uZmlnL3RhaG9lL3htLXRhaG9lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlhZjM0NAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvdGFob2UveG0tdGFob2UuaApAQCAtMCwwICsxLDEzNiBAQAorLyogRGVmaW5pdGlvbnMgdG8gbWFrZSBHREIgaG9zdGVkIG9uIGEgdGFob2UgcnVubmluZyA0LjMtUmVubworICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSB0aGUgU3RhdGUgVW5pdmVyc2l0eSBvZiBOZXcgWW9yayBhdCBCdWZmYWxvLCBieSB0aGUKKyAgIERpc3RyaWJ1dGVkIENvbXB1dGVyIFN5c3RlbXMgTGFiLCBEZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UsIDE5OTEuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogTWFrZSBzdXJlIHRoZSBzeXN0ZW0gaW5jbHVkZSBmaWxlcyBkZWZpbmUgQklHX0VORElBTiwgVUlOVF9NQVgsIGNvbnN0LAorICAgZXRjLCByYXRoZXIgdGhhbiBHREIncyBmaWxlcy4gICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworLyogSG9zdCBpcyBiaWctZW5kaWFuICovCisKKyNkZWZpbmUJSE9TVF9CWVRFX09SREVSCUJJR19FTkRJQU4KKworLyogVGhpcyBpcyB0aGUgYW1vdW50IHRvIHN1YnRyYWN0IGZyb20gdS51X2FyMAorICAgdG8gZ2V0IHRoZSBvZmZzZXQgaW4gdGhlIGNvcmUgZmlsZSBvZiB0aGUgcmVnaXN0ZXIgdmFsdWVzLiAgKi8KKworI2RlZmluZSBLRVJORUxfVV9BRERSICgweGMwMDAwMDAwIC0gKFRBUkdFVF9VUEFHRVMgKiBUQVJHRVRfTkJQRykpCisKKyNkZWZpbmUgUkVHSVNURVJfVV9BRERSKGFkZHIsIGJsb2NrZW5kLCByZWdubykJCVwKK3sgYWRkciA9IGJsb2NrZW5kIC0gMTAwICsgcmVnbm8gKiA0OwkJCVwKKyAgaWYgKHJlZ25vID09IFBDX1JFR05VTSkgYWRkciA9IGJsb2NrZW5kIC0gODsJCVwKKyAgaWYgKHJlZ25vID09IFBTX1JFR05VTSkgYWRkciA9IGJsb2NrZW5kIC0gNDsJCVwKKyAgaWYgKHJlZ25vID09IEZQX1JFR05VTSkgYWRkciA9IGJsb2NrZW5kIC0gNDA7CSAgICAgICAgXAorICBpZiAocmVnbm8gPT0gU1BfUkVHTlVNKSBhZGRyID0gYmxvY2tlbmQgLSAzNjsgICAgICAgICBcCisgIGlmIChyZWdubyA9PSBBTF9SRUdOVU0pIGFkZHIgPSBibG9ja2VuZCAtIDIwOyAgICAgICBcCisgIGlmIChyZWdubyA9PSBBSF9SRUdOVU0pIGFkZHIgPSBibG9ja2VuZCAtIDI0O30KKworLyogSW50ZXJmYWNlIGRlZmluaXRpb25zIGZvciBrZXJuZWwgZGVidWdnZXIgS0RCLiAgKi8KKworLyogTWFwIG1hY2hpbmUgZmF1bHQgY29kZXMgaW50byBzaWduYWwgbnVtYmVycy4KKyAgIEZpcnN0IHN1YnRyYWN0IDAsIGRpdmlkZSBieSA0LCB0aGVuIGluZGV4IGluIGEgdGFibGUuCisgICBGYXVsdHMgZm9yIHdoaWNoIHRoZSBlbnRyeSBpbiB0aGlzIHRhYmxlIGlzIDAKKyAgIGFyZSBub3QgaGFuZGxlZCBieSBLREI7IHRoZSBwcm9ncmFtJ3Mgb3duIHRyYXAgaGFuZGxlcgorICAgZ2V0cyB0byBoYW5kbGUgdGhlbi4gICovCisKKyNkZWZpbmUgRkFVTFRfQ09ERV9PUklHSU4gMAorI2RlZmluZSBGQVVMVF9DT0RFX1VOSVRTIDQKKyNkZWZpbmUgRkFVTFRfVEFCTEUgICAgXAoreyAwLCBTSUdLSUxMLCBTSUdTRUdWLCAwLCAwLCAwLCAwLCAwLCBcCisgIDAsIDAsIFNJR1RSQVAsIFNJR1RSQVAsIDAsIDAsIDAsIDAsIFwKKyAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KKworLyogU3RhcnQgcnVubmluZyB3aXRoIGEgc3RhY2sgc3RyZXRjaGluZyBmcm9tIEJFRyB0byBFTkQuCisgICBCRUcgYW5kIEVORCBzaG91bGQgYmUgc3ltYm9scyBtZWFuaW5nZnVsIHRvIHRoZSBhc3NlbWJsZXIuCisgICBUaGlzIGlzIHVzZWQgb25seSBmb3Iga2RiLiAgKi8KKworI2RlZmluZSBJTklUX1NUQUNLKGJlZywgZW5kKSAgXAoreyBhc20gKCIuZ2xvYmwgZW5kIik7ICAgICAgICAgXAorICBhc20gKCJtb3ZsICQgZW5kLCBzcCIpOyAgICAgIFwKKyAgYXNtICgiY2xybCBmcCIpOyB9CisKKy8qIFB1c2ggdGhlIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIgb24gdGhlIHN0YWNrLiAgKi8KKworI2RlZmluZSBQVVNIX0ZSQU1FX1BUUiAgICAgICAgXAorICBhc20gKCJwdXNobCBmcCIpOworCisvKiBDb3B5IHRoZSB0b3Atb2Ytc3RhY2sgdG8gdGhlIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIFBPUF9GUkFNRV9QVFIgIFwKKyAgYXNtICgibW92bCAoc3ApLCBmcCIpOworCisvKiBBZnRlciBLREIgaXMgZW50ZXJlZCBieSBhIGZhdWx0LCBwdXNoIGFsbCByZWdpc3RlcnMKKyAgIHRoYXQgR0RCIHRoaW5rcyBhYm91dCAoYWxsIE5VTV9SRUdTIG9mIHRoZW0pLAorICAgc28gdGhhdCB0aGV5IGFwcGVhciBpbiBvcmRlciBvZiBhc2NlbmRpbmcgR0RCIHJlZ2lzdGVyIG51bWJlci4KKyAgIFRoZSBmYXVsdCBjb2RlIHdpbGwgYmUgb24gdGhlIHN0YWNrIGJleW9uZCB0aGUgbGFzdCByZWdpc3Rlci4gICovCisKKyNkZWZpbmUgUFVTSF9SRUdJU1RFUlMgICAgICAgIFwKK3sgYXNtICgicHVzaGwgOChzcCkiKTsgICAgICAgIFwKKyAgYXNtICgicHVzaGwgOChzcCkiKTsgICAgICAgIFwKKyAgYXNtICgicHVzaGFsIDB4NDEoc3ApIik7ICAgIFwKKyAgYXNtICgicHVzaGwgcjAiICk7ICAgICAgIFwKKyAgYXNtICgicHVzaGwgcjEiICk7ICAgICAgIFwKKyAgYXNtICgicHVzaGwgcjIiICk7ICAgICAgIFwKKyAgYXNtICgicHVzaGwgcjMiICk7ICAgICAgIFwKKyAgYXNtICgicHVzaGwgcjQiICk7ICAgICAgIFwKKyAgYXNtICgicHVzaGwgcjUiICk7ICAgICAgIFwKKyAgYXNtICgicHVzaGwgcjYiICk7ICAgICAgIFwKKyAgYXNtICgicHVzaGwgcjciICk7ICAgICAgIFwKKyAgYXNtICgicHVzaGwgcjgiICk7ICAgICAgIFwKKyAgYXNtICgicHVzaGwgcjkiICk7ICAgICAgIFwKKyAgYXNtICgicHVzaGwgcjEwIiApOyAgICAgICBcCisgIGFzbSAoInB1c2hsIHIxMSIgKTsgICAgICAgXAorICBhc20gKCJwdXNobCByMTIiICk7ICAgICAgIFwKKyAgYXNtICgicHVzaGwgZnAiICk7ICAgICAgIFwKKyAgYXNtICgicHVzaGwgc3AiICk7ICAgICAgIFwKKyAgYXNtICgicHVzaGwgcGMiICk7ICAgICAgIFwKKyAgYXNtICgicHVzaGwgcHMiICk7ICAgICAgIFwKKyAgYXNtICgicHVzaGwgYWNsbyIgKTsgICAgICAgXAorICBhc20gKCJwdXNobCBhY2hpIiApOyAgICAgICBcCit9CisKKy8qIEFzc3VtaW5nIHRoZSByZWdpc3RlcnMgKGluY2x1ZGluZyBwcm9jZXNzb3Igc3RhdHVzKSBoYXZlIGJlZW4KKyAgIHB1c2hlZCBvbiB0aGUgc3RhY2sgaW4gb3JkZXIgb2YgYXNjZW5kaW5nIEdEQiByZWdpc3RlciBudW1iZXIsCisgICByZXN0b3JlIHRoZW0gYW5kIHJldHVybiB0byB0aGUgYWRkcmVzcyBpbiB0aGUgc2F2ZWQgUEMgcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIFBPUF9SRUdJU1RFUlMgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzbSAoIm1vdmwgKHNwKSssIGFjaGkiKTsgICBcCisgIGFzbSAoIm1vdmwgKHNwKSssIGFjbG8iKTsgICBcCisgIGFzbSAoIm1vdmwgKHNwKSssIHBzIik7ICAgXAorICBhc20gKCJtb3ZsIChzcCkrLCBwYyIpOyAgIFwKKyAgYXNtICgibW92bCAoc3ApKywgc3AiKTsgICBcCisgIGFzbSAoIm1vdmwgKHNwKSssIGZwIik7ICAgXAorICBhc20gKCJtb3ZsIChzcCkrLCByMTIiKTsgICBcCisgIGFzbSAoIm1vdmwgKHNwKSssIHIxMSIpOyAgIFwKKyAgYXNtICgibW92bCAoc3ApKywgcjEwIik7ICAgXAorICBhc20gKCJtb3ZsIChzcCkrLCByOSIpOyAgIFwKKyAgYXNtICgibW92bCAoc3ApKywgcjgiKTsgICBcCisgIGFzbSAoIm1vdmwgKHNwKSssIHI3Iik7ICAgXAorICBhc20gKCJtb3ZsIChzcCkrLCByNiIpOyAgIFwKKyAgYXNtICgibW92bCAoc3ApKywgcjUiKTsgICBcCisgIGFzbSAoIm1vdmwgKHNwKSssIHI0Iik7ICAgXAorICBhc20gKCJtb3ZsIChzcCkrLCByMyIpOyAgIFwKKyAgYXNtICgibW92bCAoc3ApKywgcjIiKTsgICBcCisgIGFzbSAoIm1vdmwgKHNwKSssIHIxIik7ICAgXAorICBhc20gKCJtb3ZsIChzcCkrLCByMCIpOyAgIFwKKyAgYXNtICgic3VibDIgJDgsKHNwKSIpOyAgIFwKKyAgYXNtICgibW92bCAoc3ApLHNwIik7ICAgIFwKKyAgYXNtICgicmVpIik7IH0KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvdG0tbHlueC5oIGIvZ2RiL2NvbmZpZy90bS1seW54LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwNzI0MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvdG0tbHlueC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIE1hY3JvIGRlZmluaXRpb25zIGZvciBMeW54T1MgdGFyZ2V0cy4KKyAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgVE1fTFlOWF9ICisjZGVmaW5lIFRNX0xZTlhfSAorCisvKiBPdmVycmlkZSBudW1iZXIgb2YgZXhwZWN0ZWQgdHJhcHMgZnJvbSBzeXN2LiAqLworI2RlZmluZSBTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCAyCisKKyNpbmNsdWRlICJjb2ZmLXNvbGliLmgiCQkvKiBDT0ZGIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgKi8KKworLyogTHlueCdzIHNpZ25hbC5oIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIGFueSBtYWNyb3MgZm9yIHdoYXQgc2lnbmFsIG51bWJlcnMKKyAgIHRoZSByZWFsLXRpbWUgZXZlbnRzIGFyZS4gICovCisjZGVmaW5lIFJFQUxUSU1FX0xPIDMzCisvKiBPbmUgbW9yZSB0aGFuIHRoZSBsYXN0IG9uZS4gICovCisjZGVmaW5lIFJFQUxUSU1FX0hJIDY0CisKKyNlbmRpZiAvKiBUTV9MWU5YX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvdG0tbmJzZC5oIGIvZ2RiL2NvbmZpZy90bS1uYnNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI5NWQ4NQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvdG0tbmJzZC5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qIFRhcmdldCBtYWNoaW5lIHN1Yi1kZXNjcmlwdGlvbiBmb3IgTmV0QlNELgorICAgVGhpcyBpcyBpbmNsdWRlZCBieSBvdGhlciB0bS0qLmggZmlsZXMgdG8gc3BlY2lmeSBOZXRCU0Qtc3BlY2lmaWMgc3R1ZmYuCisgICBDb3B5cmlnaHQgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy90bS1zdW5vcy5oIGIvZ2RiL2NvbmZpZy90bS1zdW5vcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZWMzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3RtLXN1bm9zLmgKQEAgLTAsMCArMSwzMSBAQAorLyogVGFyZ2V0IG1hY2hpbmUgc3ViLWRlc2NyaXB0aW9uIGZvciBTdW5PUyB2ZXJzaW9uIDQuCisgICBUaGlzIGlzIGluY2x1ZGVkIGJ5IG90aGVyIHRtLSouaCBmaWxlcyB0byBzcGVjaWZ5IFN1bk9TLXNwZWNpZmljIHN0dWZmLgorICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgInNvbGliLmgiCS8qIFN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMuICovCisKKy8qIFJldHVybiBub24temVybyBpZiB3ZSBhcmUgaW4gYSBzaGFyZWQgbGlicmFyeSB0cmFtcG9saW5lIGNvZGUgc3R1Yi4gKi8KKworI2RlZmluZSBJTl9TT0xJQl9DQUxMX1RSQU1QT0xJTkUocGMsIG5hbWUpIFwKKyAgbG9va3VwX3NvbGliX3RyYW1wb2xpbmVfc3ltYm9sX2J5X3BjIChwYykKKworLyogSWYgUEMgaXMgaW4gYSBzaGFyZWQgbGlicmFyeSB0cmFtcG9saW5lIGNvZGUsIHJldHVybiB0aGUgUEMKKyAgIHdoZXJlIHRoZSBmdW5jdGlvbiBpdHNlbGYgYWN0dWFsbHkgc3RhcnRzLiAgSWYgbm90LCByZXR1cm4gMC4gICovCisKKyNkZWZpbmUgU0tJUF9UUkFNUE9MSU5FX0NPREUocGMpICBmaW5kX3NvbGliX3RyYW1wb2xpbmVfdGFyZ2V0IChwYykKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvdG0tc3lzdjQuaCBiL2dkYi9jb25maWcvdG0tc3lzdjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzA4NTQxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy90bS1zeXN2NC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qIE1hY3JvIGRlZmluaXRpb25zIGZvciBHREIgb24gYWxsIFNWUjQgdGFyZ2V0IHN5c3RlbXMuCisgICBDb3B5cmlnaHQgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIGF0IEN5Z251cyBTdXBwb3J0IChmbmZAY3lnbnVzLmNvbSkuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogRm9yIFNWUjQgc2hhcmVkIGxpYnJhcmllcywgZWFjaCBjYWxsIHRvIGEgbGlicmFyeSByb3V0aW5lIGdvZXMgdGhyb3VnaAorICAgYSBzbWFsbCBwaWVjZSBvZiB0cmFtcG9saW5lIGNvZGUgaW4gdGhlICIucGx0IiBzZWN0aW9uLgorICAgVGhlIGhvcnJpYmx5IHVnbHkgd2FpdF9mb3JfaW5mZXJpb3IoKSByb3V0aW5lIHVzZXMgdGhpcyBtYWNybyB0byBkZXRlY3QKKyAgIHdoZW4gd2UgaGF2ZSBzdGVwcGVkIGludG8gb25lIG9mIHRoZXNlIGZyYWdtZW50cy4KKyAgIFdlIGRvIG5vdCB1c2UgbG9va3VwX3NvbGliX3RyYW1wb2xpbmVfc3ltYm9sX2J5X3BjLCBiZWNhdXNlCisgICB3ZSBjYW5ub3QgYWx3YXlzIGZpbmQgdGhlIHNoYXJlZCBsaWJyYXJ5IHRyYW1wb2xpbmUgc3ltYm9scworICAgKGUuZy4gb24gSXJpeDUpLiAgKi8KKworI2RlZmluZSBJTl9TT0xJQl9DQUxMX1RSQU1QT0xJTkUocGMsIG5hbWUpIGluX3BsdF9zZWN0aW9uKChwYyksIChuYW1lKSkKK2V4dGVybiBpbnQgaW5fcGx0X3NlY3Rpb24gUEFSQU1TICgoQ09SRV9BRERSLCBjaGFyICopKTsKKworLyogSWYgUEMgaXMgaW4gYSBzaGFyZWQgbGlicmFyeSB0cmFtcG9saW5lIGNvZGUsIHJldHVybiB0aGUgUEMKKyAgIHdoZXJlIHRoZSBmdW5jdGlvbiBpdHNlbGYgYWN0dWFsbHkgc3RhcnRzLiAgSWYgbm90LCByZXR1cm4gMC4gICovCisKKyNkZWZpbmUgU0tJUF9UUkFNUE9MSU5FX0NPREUocGMpICBmaW5kX3NvbGliX3RyYW1wb2xpbmVfdGFyZ2V0IChwYykKKworLyogSXQgaXMgdW5rbm93biB3aGljaCwgaWYgYW55LCBTVlI0IGFzc2VtYmxlcnMgZG8gbm90IGFjY2VwdCBkb2xsYXIgc2lnbnMKKyAgIGluIGlkZW50aWZpZXJzLiAgVGhlIGRlZmF1bHQgaW4gRysrIGlzIHRvIHVzZSBkb3RzIGluc3RlYWQsIGZvciBhbGwgU1ZSNAorICAgc3lzdGVtcywgc28gd2UgbWFrZSB0aGF0IG91ciBkZWZhdWx0IGFsc28uICBGSVhNRTogVGhlcmUgc2hvdWxkIGJlIHNvbWUKKyAgIHdheSB0byBnZXQgRysrIHRvIHRlbGwgdXMgd2hhdCBDUExVU19NQVJLRVIgaXQgaXMgdXNpbmcsIHBlcmhhcHMgYnkKKyAgIHN0YXNoaW5nIGl0IGluIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYXMgcGFydCBvZiB0aGUgbmFtZSBvZiBhbgorICAgaW52ZW50ZWQgc3ltYm9sICgiZ2NjX2NwbHVzX21hcmtlciQiIGZvciBleGFtcGxlKS4gKi8KKworI3VuZGVmIENQTFVTX01BUktFUgorI2RlZmluZSBDUExVU19NQVJLRVIgJy4nCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3Y4NTAvdG0tdjg1MC5oIGIvZ2RiL2NvbmZpZy92ODUwL3RtLXY4NTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGRkN2YwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy92ODUwL3RtLXY4NTAuaApAQCAtMCwwICsxLDE3NCBAQAorLyogUGFyYW1ldGVycyBmb3IgZXhlY3V0aW9uIG9uIGFuIE5FQyBWODUwIHByb2Nlc3Nvci4KKyAgIENvcHlyaWdodCAxOTk2CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisKKyNkZWZpbmUgTlVNX1JFR1MgNjYKKworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyBcCit7ICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsIFwKKyAgInI4IiwgInI5IiwgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IiwgXAorICAicjE2IiwgInIxNyIsICJyMTgiLCAicjE5IiwgInIyMCIsICJyMjEiLCAicjIyIiwgInIyMyIsIFwKKyAgInIyNCIsICJyMjUiLCAicjI2IiwgInIyNyIsICJyMjgiLCAicjI5IiwgInIzMCIsICJyMzEiLCBcCisgICAgXAorICAiZWlwYyIsICJlaXBzdyIsICJmZXBjIiwgImZlcHN3IiwgImVjciIsICJwc3ciLCAic3I2IiwgInNyNyIsIFwKKyAgInNyOCIsICJzcjkiLCAic3IxMCIsICJzcjExIiwgInNyMTIiLCAic3IxMyIsICJzcjE0IiwgInNyMTUiLCBcCisgICJzcjE2IiwgInNyMTciLCAic3IxOCIsICJzcjE5IiwgInNyMjAiLCAic3IyMSIsICJzcjIyIiwgInNyMjMiLCBcCisgICJzcjI0IiwgInNyMjUiLCAic3IyNiIsICJzcjI3IiwgInNyMjgiLCAic3IyOSIsICJzcjMwIiwgInNyMzEiLCBcCisgICAgXAorICAicGMiLCAiZnAiIH0KKworLyogSW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIG5hbWVzIG9mIHJlZ2lzdGVycy4KKyAgIEVudHJpZXMgYmV5b25kIHRoZSBmaXJzdCBOVU1fUkVHUyBhcmUgaWdub3JlZC4gICovCisKK2V4dGVybiBjaGFyICoqdjg1MF9yZWdpc3Rlcl9uYW1lczsKKyNkZWZpbmUgUkVHSVNURVJfTkFNRShpKSB2ODUwX3JlZ2lzdGVyX25hbWVzW2ldCisKKworI2RlZmluZSBSRUdJU1RFUl9CWVRFUyAoTlVNX1JFR1MgKiA0KQorCisjZGVmaW5lIFJFR0lTVEVSX1NJWkUgNAorI2RlZmluZSBNQVhfUkVHSVNURVJfUkFXX1NJWkUgNAorCisjZGVmaW5lIFIwX1JFR05VTSAwCisjZGVmaW5lIFIxX1JFR05VTSAxCisjZGVmaW5lIFNBVkUxX1NUQVJUX1JFR05VTSAyCisjZGVmaW5lIFNBVkUxX0VORF9SRUdOVU0gMgorI2RlZmluZSBTUF9SRUdOVU0gMworI2RlZmluZSBBUkcwX1JFR05VTSA2CisjZGVmaW5lIEFSR0xBU1RfUkVHTlVNIDkKKyNkZWZpbmUgVjBfUkVHTlVNIDEwCisjZGVmaW5lIFYxX1JFR05VTSAxMQorI2RlZmluZSBSMTJfUkVHTlVNIDEyCisjZGVmaW5lIFNBVkUyX1NUQVJUX1JFR05VTSAyMAorI2RlZmluZSBTQVZFMl9FTkRfUkVHTlVNIDI5CisjZGVmaW5lIEVQX1JFR05VTSAzMAorI2RlZmluZSBTQVZFM19TVEFSVF9SRUdOVU0gMzEKKyNkZWZpbmUgU0FWRTNfRU5EX1JFR05VTSAzMQorI2RlZmluZSBSUF9SRUdOVU0gMzEKKyNkZWZpbmUgU1IwX1JFR05VTSAzMgorI2RlZmluZSBQU19SRUdOVU0gKFNSMF9SRUdOVU0rNSkKKyNkZWZpbmUgQ1RCUF9SRUdOVU0gKFNSMF9SRUdOVU0rMjApCisjZGVmaW5lIFBDX1JFR05VTSA2NAorI2RlZmluZSBGUF9SRUdOVU0gNjUKKyNkZWZpbmUgRlBfUkFXX1JFR05VTSAyOQorCisjZGVmaW5lIFRBUkdFVF9SRUFEX0ZQKCkgcmVhZF9yZWdpc3RlciAoRlBfUkFXX1JFR05VTSkKKyNkZWZpbmUgVEFSR0VUX1dSSVRFX0ZQKFZBTCkgd3JpdGVfcmVnaXN0ZXIgKEZQX1JFR05VTSwgKFZBTCkpCisKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9UWVBFKFJFRykgYnVpbHRpbl90eXBlX2ludAorCisjZGVmaW5lIFJFR0lTVEVSX0JZVEUoUkVHKSAoKFJFRykgKiA0KQorI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUoUkVHKSA0CisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKFJFRykgNAorCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUgNAorCisjZGVmaW5lIEJSRUFLUE9JTlQgezB4NDAsIDB4Rjh9IC8qIGxpdHRsZS1lbmRlZCAqLworCisjZGVmaW5lIEZVTkNUSU9OX1NUQVJUX09GRlNFVCAwCisKKyNkZWZpbmUgREVDUl9QQ19BRlRFUl9CUkVBSyAwCisKKyNkZWZpbmUgSU5ORVJfVEhBTihsaHMscmhzKSAoKGxocykgPCAocmhzKSkKKworI2RlZmluZSBTQVZFRF9QQ19BRlRFUl9DQUxMKGZpKSByZWFkX3JlZ2lzdGVyIChSUF9SRUdOVU0pCisKKyNpZmRlZiBfX1NURENfXworc3RydWN0IGZyYW1lX2luZm87CitzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVnczsKK3N0cnVjdCB0eXBlOworc3RydWN0IHZhbHVlOworI2VuZGlmCisKKyNkZWZpbmUgRVhUUkFfRlJBTUVfSU5GTyBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyBmc3I7CisKK2V4dGVybiB2b2lkIHY4NTBfaW5pdF9leHRyYV9mcmFtZV9pbmZvIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICpmaSkpOworI2RlZmluZSBJTklUX0VYVFJBX0ZSQU1FX0lORk8oZnJvbWxlYWYsIGZpKSB2ODUwX2luaXRfZXh0cmFfZnJhbWVfaW5mbyAoZmkpCisjZGVmaW5lIElOSVRfRlJBTUVfUEMJCS8qIE5vdCBuZWNlc3NhcnkgKi8KKworZXh0ZXJuIHZvaWQgdjg1MF9mcmFtZV9maW5kX3NhdmVkX3JlZ3MgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKmZpLCBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqcmVnYWRkcikpOworI2RlZmluZSBGUkFNRV9GSU5EX1NBVkVEX1JFR1MoZmksIHJlZ2FkZHIpIHJlZ2FkZHIgPSBmaS0+ZnNyCisKK2V4dGVybiBDT1JFX0FERFIgdjg1MF9mcmFtZV9jaGFpbiBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqZmkpKTsKKyNkZWZpbmUgRlJBTUVfQ0hBSU4oZmkpIHY4NTBfZnJhbWVfY2hhaW4gKGZpKQorI2RlZmluZSBGUkFNRV9DSEFJTl9WQUxJRChGUCwgRkkpCWdlbmVyaWNfZnJhbWVfY2hhaW5fdmFsaWQgKEZQLCBGSSkKKworZXh0ZXJuIENPUkVfQUREUiB2ODUwX2ZpbmRfY2FsbGVyc19yZWcgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKmZpLCBpbnQgcmVnbnVtKSk7CitleHRlcm4gQ09SRV9BRERSIHY4NTBfZnJhbWVfc2F2ZWRfcGMgICBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisjZGVmaW5lIEZSQU1FX1NBVkVEX1BDKEZJKSAodjg1MF9mcmFtZV9zYXZlZF9wYyAoRkkpKQorCisjZGVmaW5lIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKFRZUEUsIFJFR0JVRiwgVkFMQlVGKSBcCisgIG1lbWNweSAoVkFMQlVGLCBSRUdCVUYgKyBSRUdJU1RFUl9CWVRFIChWMF9SRUdOVU0pLCBUWVBFX0xFTkdUSCAoVFlQRSkpCisKKyNkZWZpbmUgRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyhSRUdCVUYpIFwKKyAgZXh0cmFjdF9hZGRyZXNzIChSRUdCVUYgKyBSRUdJU1RFUl9CWVRFIChWMF9SRUdOVU0pLCBcCisJCSAgIFJFR0lTVEVSX1JBV19TSVpFIChWMF9SRUdOVU0pKQorCisjZGVmaW5lIFNUT1JFX1JFVFVSTl9WQUxVRShUWVBFLCBWQUxCVUYpIFwKKyAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMoUkVHSVNURVJfQllURSAoVjBfUkVHTlVNKSwgVkFMQlVGLCBUWVBFX0xFTkdUSCAoVFlQRSkpOworCitleHRlcm4gQ09SRV9BRERSIHY4NTBfc2tpcF9wcm9sb2d1ZSBQQVJBTVMgKChDT1JFX0FERFIgcGMpKTsKKyNkZWZpbmUgU0tJUF9QUk9MT0dVRShwYykgcGMgPSB2ODUwX3NraXBfcHJvbG9ndWUgKHBjKQorCisjZGVmaW5lIEZSQU1FX0FSR1NfU0tJUCAwCisKKyNkZWZpbmUgRlJBTUVfQVJHU19BRERSRVNTKGZpKSAoKGZpKS0+ZnJhbWUpCisjZGVmaW5lIEZSQU1FX0xPQ0FMU19BRERSRVNTKGZpKSAoKGZpKS0+ZnJhbWUpCisjZGVmaW5lIEZSQU1FX05VTV9BUkdTKHZhbCwgZmkpICgodmFsKSA9IC0xKQorCitleHRlcm4gdm9pZCB2ODUwX3BvcF9mcmFtZSBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWUpKTsKKyNkZWZpbmUgUE9QX0ZSQU1FIHY4NTBfcG9wX2ZyYW1lIChnZXRfY3VycmVudF9mcmFtZSAoKSkKKworI2RlZmluZSBVU0VfR0VORVJJQ19EVU1NWV9GUkFNRVMKKyNkZWZpbmUgQ0FMTF9EVU1NWSAgICAgICAgICAgICAgICAgICB7MH0KKyNkZWZpbmUgQ0FMTF9EVU1NWV9TVEFSVF9PRkZTRVQgICAgICAoMCkKKyNkZWZpbmUgQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVCAoMCkKKyNkZWZpbmUgQ0FMTF9EVU1NWV9MT0NBVElPTiAgICAgICAgICBBVF9FTlRSWV9QT0lOVAorI2RlZmluZSBGSVhfQ0FMTF9EVU1NWShEVU1NWSwgU1RBUlQsIEZVTkFERFIsIE5BUkdTLCBBUkdTLCBUWVBFLCBHQ0NQKQorI2RlZmluZSBDQUxMX0RVTU1ZX0FERFJFU1MoKSAgICAgICAgIGVudHJ5X3BvaW50X2FkZHJlc3MgKCkKK2V4dGVybiBDT1JFX0FERFIgdjg1MF9wdXNoX3JldHVybl9hZGRyZXNzIFBBUkFNUyAoKENPUkVfQUREUiwgQ09SRV9BRERSKSk7CisjZGVmaW5lIFBVU0hfUkVUVVJOX0FERFJFU1MoUEMsIFNQKSAgdjg1MF9wdXNoX3JldHVybl9hZGRyZXNzIChQQywgU1ApCisKKworI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FCWdlbmVyaWNfcHVzaF9kdW1teV9mcmFtZSAoKQorCitleHRlcm4gQ09SRV9BRERSCit2ODUwX3B1c2hfYXJndW1lbnRzIFBBUkFNUyAoKGludCBuYXJncywgc3RydWN0IHZhbHVlICoqYXJncywgQ09SRV9BRERSIHNwLAorCQkJICAgICB1bnNpZ25lZCBjaGFyIHN0cnVjdF9yZXR1cm4sCisJCQkgICAgIENPUkVfQUREUiBzdHJ1Y3RfYWRkcikpOworI2RlZmluZSBQVVNIX0FSR1VNRU5UUyhOQVJHUywgQVJHUywgU1AsIFNUUlVDVF9SRVRVUk4sIFNUUlVDVF9BRERSKSBcCisgIChTUCkgPSB2ODUwX3B1c2hfYXJndW1lbnRzIChOQVJHUywgQVJHUywgU1AsIFNUUlVDVF9SRVRVUk4sIFNUUlVDVF9BRERSKQorCisjZGVmaW5lIFNUT1JFX1NUUlVDVF9SRVRVUk4oU1RSVUNUX0FERFIsIFNQKQorCisKKyNkZWZpbmUgUENfSU5fQ0FMTF9EVU1NWShQQywgU1AsIEZQKSBnZW5lcmljX3BjX2luX2NhbGxfZHVtbXkgKFBDLCBTUCkKKworZXh0ZXJuIHVzZV9zdHJ1Y3RfY29udmVudGlvbl9mbiB2ODUwX3VzZV9zdHJ1Y3RfY29udmVudGlvbjsKKyNkZWZpbmUgVVNFX1NUUlVDVF9DT05WRU5USU9OKEdDQ19QLCBUWVBFKSB2ODUwX3VzZV9zdHJ1Y3RfY29udmVudGlvbiAoR0NDX1AsIFRZUEUpOworCisvKiBvdmVycmlkZSB0aGUgZGVmYXVsdCBnZXRfc2F2ZWRfcmVnaXN0ZXIgZnVuY3Rpb24gd2l0aAorICAgb25lIHRoYXQgdGFrZXMgYWNjb3VudCBvZiBnZW5lcmljIENBTExfRFVNTVkgZnJhbWVzICovCisjZGVmaW5lIEdFVF9TQVZFRF9SRUdJU1RFUgorCisvKiBEZWZpbmUgdGhpcyBmb3IgV2luZ2RiICovCisKKyNkZWZpbmUgVEFSR0VUX1Y4NTAKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvdjg1MC92ODUwLm10IGIvZ2RiL2NvbmZpZy92ODUwL3Y4NTAubXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ4YmM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvdjg1MC92ODUwLm10CkBAIC0wLDAgKzEsNSBAQAorIyBUYXJnZXQ6IE5FQyBWODUwIHByb2Nlc3NvcgorVERFUEZJTEVTPSB2ODUwLXRkZXAubworVE1fRklMRT0gdG0tdjg1MC5oCitTSU1fT0JTID0gcmVtb3RlLXNpbS5vCitTSU0gPSAuLi9zaW0vdjg1MC9saWJzaW0uYQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy92YXgvbm0tdmF4LmggYi9nZGIvY29uZmlnL3ZheC9ubS12YXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWY3ZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy92YXgvbm0tdmF4LmgKQEAgLTAsMCArMSwyOCBAQAorLyogQ29tbW9uIGRlZmluaXRpb25zIGZvciBHREIgbmF0aXZlIHN1cHBvcnQgb24gVmF4ZW4gdW5kZXIgNC4yYnNkIGFuZCBVbHRyaXguCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9VX0FERFIoYWRkciwgYmxvY2tlbmQsIHJlZ25vKQkJXAoreyBhZGRyID0gYmxvY2tlbmQgLSAwMTEwICsgcmVnbm8gKiA0OwkJCVwKKyAgaWYgKHJlZ25vID09IFBDX1JFR05VTSkgYWRkciA9IGJsb2NrZW5kIC0gODsJCVwKKyAgaWYgKHJlZ25vID09IFBTX1JFR05VTSkgYWRkciA9IGJsb2NrZW5kIC0gNDsJCVwKKyAgaWYgKHJlZ25vID09IEZQX1JFR05VTSkgYWRkciA9IGJsb2NrZW5kIC0gMDEyMDsJXAorICBpZiAocmVnbm8gPT0gQVBfUkVHTlVNKSBhZGRyID0gYmxvY2tlbmQgLSAwMTI0OwlcCisgIGlmIChyZWdubyA9PSBTUF9SRUdOVU0pIGFkZHIgPSBibG9ja2VuZCAtIDIwOyB9CisKKwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy92YXgvdG0tdmF4LmggYi9nZGIvY29uZmlnL3ZheC90bS12YXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDEwZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy92YXgvdG0tdmF4LmgKQEAgLTAsMCArMSwzMzAgQEAKKy8qIERlZmluaXRpb25zIHRvIG1ha2UgR0RCIHJ1biBvbiBhIHZheCB1bmRlciA0LjJic2QuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgorCisvKiBPZmZzZXQgZnJvbSBhZGRyZXNzIG9mIGZ1bmN0aW9uIHRvIHN0YXJ0IG9mIGl0cyBjb2RlLgorICAgWmVybyBvbiBtb3N0IG1hY2hpbmVzLiAgKi8KKworI2RlZmluZSBGVU5DVElPTl9TVEFSVF9PRkZTRVQgMgorCisvKiBBZHZhbmNlIFBDIGFjcm9zcyBhbnkgZnVuY3Rpb24gZW50cnkgcHJvbG9ndWUgaW5zdHJ1Y3Rpb25zCisgICB0byByZWFjaCBzb21lICJyZWFsIiBjb2RlLiAgKi8KKworI2RlZmluZSBTS0lQX1BST0xPR1VFKHBjKQlcCit7IHJlZ2lzdGVyIGludCBvcCA9ICh1bnNpZ25lZCBjaGFyKSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgMSk7ICBcCisgIGlmIChvcCA9PSAweDExKSBwYyArPSAyOyAgLyogc2tpcCBicmIgKi8JCQkgIFwKKyAgaWYgKG9wID09IDB4MzEpIHBjICs9IDM7ICAvKiBza2lwIGJydyAqLwkJCSAgXAorICBpZiAob3AgPT0gMHhDMiAmJgkJCQkJCSAgXAorICAgICAgKCh1bnNpZ25lZCBjaGFyKSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYysyLCAxKSkgPT0gMHg1RSkJICBcCisgICAgcGMgKz0gMzsgIC8qIHNraXAgc3VibDIgKi8JCQkJCSAgXAorICBpZiAob3AgPT0gMHg5RSAmJgkJCQkJCSAgXAorICAgICAgKCh1bnNpZ25lZCBjaGFyKSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYysxLCAxKSkgPT0gMHhBRSAmJiAgXAorICAgICAgKCh1bnNpZ25lZCBjaGFyKSByZWFkX21lbW9yeV9pbnRlZ2VyKHBjKzMsIDEpKSA9PSAweDVFKQkgIFwKKyAgICAgcGMgKz0gNDsgIC8qIHNraXAgbW92YWIgKi8JCQkJCSAgXAorICBpZiAob3AgPT0gMHg5RSAmJgkJCQkJCSAgXAorICAgICAgKCh1bnNpZ25lZCBjaGFyKSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYysxLCAxKSkgPT0gMHhDRSAmJiAgXAorICAgICAgKCh1bnNpZ25lZCBjaGFyKSByZWFkX21lbW9yeV9pbnRlZ2VyKHBjKzQsIDEpKSA9PSAweDVFKQkgIFwKKyAgICBwYyArPSA1OyAgLyogc2tpcCBtb3ZhYiAqLwkJCQkJICBcCisgIGlmIChvcCA9PSAweDlFICYmCQkJCQkJICBcCisgICAgICAoKHVuc2lnbmVkIGNoYXIpIHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjKzEsIDEpKSA9PSAweEVFICYmICBcCisgICAgICAoKHVuc2lnbmVkIGNoYXIpIHJlYWRfbWVtb3J5X2ludGVnZXIocGMrNiwgMSkpID09IDB4NUUpCSAgXAorICAgIHBjICs9IDc7ICAvKiBza2lwIG1vdmFiICovCQkJCQkgIFwKK30KKworLyogSW1tZWRpYXRlbHkgYWZ0ZXIgYSBmdW5jdGlvbiBjYWxsLCByZXR1cm4gdGhlIHNhdmVkIHBjLgorICAgQ2FuJ3QgYWx3YXlzIGdvIHRocm91Z2ggdGhlIGZyYW1lcyBmb3IgdGhpcyBiZWNhdXNlIG9uIHNvbWUgbWFjaGluZXMKKyAgIHRoZSBuZXcgZnJhbWUgaXMgbm90IHNldCB1cCB1bnRpbCB0aGUgbmV3IGZ1bmN0aW9uIGV4ZWN1dGVzCisgICBzb21lIGluc3RydWN0aW9ucy4gICovCisKKyNkZWZpbmUgU0FWRURfUENfQUZURVJfQ0FMTChmcmFtZSkgRlJBTUVfU0FWRURfUEMoZnJhbWUpCisKKyNkZWZpbmUgVEFSR0VUX1VQQUdFUyAxNAorI2RlZmluZSBUQVJHRVRfTkJQRyA1MTIKKyNkZWZpbmUgU1RBQ0tfRU5EX0FERFIgKDB4ODAwMDAwMDAgLSAoVEFSR0VUX1VQQUdFUyAqIFRBUkdFVF9OQlBHKSkKKworLyogT24gdGhlIFZBWCwgc2lndHJhbXAgaXMgaW4gdGhlIHUgYXJlYS4gIENhbid0IGNoZWNrIHRoZSBleGFjdAorICAgYWRkcmVzc2VzIGJlY2F1c2UgZm9yIGNyb3NzLWRlYnVnZ2luZyB3ZSBkb24ndCBoYXZlIFZBWCBpbmNsdWRlCisgICBmaWxlcyBhcm91bmQuICBUaGlzIHNob3VsZCBiZSBjbG9zZSBlbm91Z2guICAqLworI2RlZmluZSBTSUdUUkFNUF9TVEFSVChwYykJU1RBQ0tfRU5EX0FERFIKKyNkZWZpbmUgU0lHVFJBTVBfRU5EKHBjKQkweDgwMDAwMDAwCisKKy8qIFN0YWNrIGdyb3dzIGRvd253YXJkLiAgKi8KKworI2RlZmluZSBJTk5FUl9USEFOKGxocyxyaHMpICgobGhzKSA8IChyaHMpKQorCisvKiBTZXF1ZW5jZSBvZiBieXRlcyBmb3IgYnJlYWtwb2ludCBpbnN0cnVjdGlvbi4gICovCisKKyNkZWZpbmUgQlJFQUtQT0lOVCB7M30KKworLyogQW1vdW50IFBDIG11c3QgYmUgZGVjcmVtZW50ZWQgYnkgYWZ0ZXIgYSBicmVha3BvaW50LgorICAgVGhpcyBpcyBvZnRlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIEJSRUFLUE9JTlQKKyAgIGJ1dCBub3QgYWx3YXlzLiAgKi8KKworI2RlZmluZSBERUNSX1BDX0FGVEVSX0JSRUFLIDAKKworLyogUmV0dXJuIDEgaWYgUCBwb2ludHMgdG8gYW4gaW52YWxpZCBmbG9hdGluZyBwb2ludCB2YWx1ZS4KKyAgIExFTiBpcyB0aGUgbGVuZ3RoIGluIGJ5dGVzIC0tIG5vdCByZWxldmFudCBvbiB0aGUgVmF4LiAgKi8KKworI2RlZmluZSBJTlZBTElEX0ZMT0FUKHAsIGxlbikgKCgqKHNob3J0ICopIHAgJiAweGZmODApID09IDB4ODAwMCkKKworLyogU2F5IGhvdyBsb25nIChvcmRpbmFyeSkgcmVnaXN0ZXJzIGFyZS4gIFRoaXMgaXMgYSBwaWVjZSBvZiBib2dvc2l0eQorICAgdXNlZCBpbiBwdXNoX3dvcmQgYW5kIGEgZmV3IG90aGVyIHBsYWNlczsgUkVHSVNURVJfUkFXX1NJWkUgaXMgdGhlCisgICByZWFsIHdheSB0byBrbm93IGhvdyBiaWcgYSByZWdpc3RlciBpcy4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfU0laRSA0CisKKy8qIE51bWJlciBvZiBtYWNoaW5lIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIE5VTV9SRUdTIDE3CisKKy8qIEluaXRpYWxpemVyIGZvciBhbiBhcnJheSBvZiBuYW1lcyBvZiByZWdpc3RlcnMuCisgICBUaGVyZSBzaG91bGQgYmUgTlVNX1JFR1Mgc3RyaW5ncyBpbiB0aGlzIGluaXRpYWxpemVyLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyB7InIwIiwgInIxIiwgInIyIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwgInI4IiwgInI5IiwgInIxMCIsICJyMTEiLCAiYXAiLCAiZnAiLCAic3AiLCAicGMiLCAicHMifQorCisvKiBSZWdpc3RlciBudW1iZXJzIG9mIHZhcmlvdXMgaW1wb3J0YW50IHJlZ2lzdGVycy4KKyAgIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgInJlYWwiIHJlZ2lzdGVyIG51bWJlcnMsCisgICBhbmQgY29ycmVzcG9uZCB0byB0aGUgZ2VuZXJhbCByZWdpc3RlcnMgb2YgdGhlIG1hY2hpbmUsCisgICBhbmQgc29tZSBhcmUgInBob255IiByZWdpc3RlciBudW1iZXJzIHdoaWNoIGFyZSB0b28gbGFyZ2UKKyAgIHRvIGJlIGFjdHVhbCByZWdpc3RlciBudW1iZXJzIGFzIGZhciBhcyB0aGUgdXNlciBpcyBjb25jZXJuZWQKKyAgIGJ1dCBkbyBzZXJ2ZSB0byBnZXQgdGhlIGRlc2lyZWQgdmFsdWVzIHdoZW4gcGFzc2VkIHRvIHJlYWRfcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIEFQX1JFR05VTSAxMgorI2RlZmluZSBGUF9SRUdOVU0gMTMJCS8qIENvbnRhaW5zIGFkZHJlc3Mgb2YgZXhlY3V0aW5nIHN0YWNrIGZyYW1lICovCisjZGVmaW5lIFNQX1JFR05VTSAxNAkJLyogQ29udGFpbnMgYWRkcmVzcyBvZiB0b3Agb2Ygc3RhY2sgKi8KKyNkZWZpbmUgUENfUkVHTlVNIDE1CQkvKiBDb250YWlucyBwcm9ncmFtIGNvdW50ZXIgKi8KKyNkZWZpbmUgUFNfUkVHTlVNIDE2CQkvKiBDb250YWlucyBwcm9jZXNzb3Igc3RhdHVzICovCisKKy8qIFRvdGFsIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgdG8gc3RvcmUgb3VyIGNvcGllcyBvZiB0aGUgbWFjaGluZSdzCisgICByZWdpc3RlciBzdGF0ZSwgdGhlIGFycmF5IGByZWdpc3RlcnMnLiAgKi8KKyNkZWZpbmUgUkVHSVNURVJfQllURVMgKDE3KjQpCisKKy8qIEluZGV4IHdpdGhpbiBgcmVnaXN0ZXJzJyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3BhY2UgZm9yCisgICByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9CWVRFKE4pICgoTikgKiA0KQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgYWN0dWFsIG1hY2hpbmUgcmVwcmVzZW50YXRpb24KKyAgIGZvciByZWdpc3RlciBOLiAgT24gdGhlIHZheCwgYWxsIHJlZ3MgYXJlIDQgYnl0ZXMuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pIDQKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHN0b3JhZ2UgaW4gdGhlIHByb2dyYW0ncyByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICBPbiB0aGUgdmF4LCBhbGwgcmVncyBhcmUgNCBieXRlcy4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfVklSVFVBTF9TSVpFKE4pIDQKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9SQVdfU0laRSBjYW4gaGF2ZS4gICovCisKKyNkZWZpbmUgTUFYX1JFR0lTVEVSX1JBV19TSVpFIDQKKworLyogTGFyZ2VzdCB2YWx1ZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkUgNAorCisvKiBSZXR1cm4gdGhlIEdEQiB0eXBlIG9iamVjdCBmb3IgdGhlICJzdGFuZGFyZCIgZGF0YSB0eXBlCisgICBvZiBkYXRhIGluIHJlZ2lzdGVyIE4uICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRShOKSBidWlsdGluX3R5cGVfaW50CisKKy8qIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBwbGFjZSBpbiB3aGljaCB0byBjb3B5IHRoZSBzdHJ1Y3R1cmUgdGhlCisgICBzdWJyb3V0aW5lIHdpbGwgcmV0dXJuLiAgVGhpcyBpcyBjYWxsZWQgZnJvbSBjYWxsX2Z1bmN0aW9uLiAqLworCisjZGVmaW5lIFNUT1JFX1NUUlVDVF9SRVRVUk4oQUREUiwgU1ApIFwKKyAgeyB3cml0ZV9yZWdpc3RlciAoMSwgKEFERFIpKTsgfQorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlIFRZUEUsIGFuZCBjb3B5IHRoYXQsIGluIHZpcnR1YWwgZm9ybWF0LAorICAgaW50byBWQUxCVUYuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfUkVUVVJOX1ZBTFVFKFRZUEUsUkVHQlVGLFZBTEJVRikgXAorICBtZW1jcHkgKFZBTEJVRiwgUkVHQlVGLCBUWVBFX0xFTkdUSCAoVFlQRSkpCisKKy8qIFdyaXRlIGludG8gYXBwcm9wcmlhdGUgcmVnaXN0ZXJzIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlCisgICBvZiB0eXBlIFRZUEUsIGdpdmVuIGluIHZpcnR1YWwgZm9ybWF0LiAgKi8KKworI2RlZmluZSBTVE9SRV9SRVRVUk5fVkFMVUUoVFlQRSxWQUxCVUYpIFwKKyAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKDAsIFZBTEJVRiwgVFlQRV9MRU5HVEggKFRZUEUpKQorCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICB0aGUgYWRkcmVzcyBpbiB3aGljaCBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gaXRzIHN0cnVjdHVyZSB2YWx1ZSwKKyAgIGFzIGEgQ09SRV9BRERSIChvciBhbiBleHByZXNzaW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgb25lKS4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyhSRUdCVUYpICgqKGludCAqKShSRUdCVUYpKQorCisMCisvKiBEZXNjcmliZSB0aGUgcG9pbnRlciBpbiBlYWNoIHN0YWNrIGZyYW1lIHRvIHRoZSBwcmV2aW91cyBzdGFjayBmcmFtZQorICAgKGl0cyBjYWxsZXIpLiAgKi8KKworLyogRlJBTUVfQ0hBSU4gdGFrZXMgYSBmcmFtZSdzIG5vbWluYWwgYWRkcmVzcworICAgYW5kIHByb2R1Y2VzIHRoZSBmcmFtZSdzIGNoYWluLXBvaW50ZXIuICovCisKKy8qIEluIHRoZSBjYXNlIG9mIHRoZSBWYXgsIHRoZSBmcmFtZSdzIG5vbWluYWwgYWRkcmVzcyBpcyB0aGUgRlAgdmFsdWUsCisgICBhbmQgMTIgYnl0ZXMgbGF0ZXIgY29tZXMgdGhlIHNhdmVkIHByZXZpb3VzIEZQIHZhbHVlIGFzIGEgNC1ieXRlIHdvcmQuICAqLworCisjZGVmaW5lIEZSQU1FX0NIQUlOKHRoaXNmcmFtZSkgIFwKKyAgKCFpbnNpZGVfZW50cnlfZmlsZSAoKHRoaXNmcmFtZSktPnBjKSA/IFwKKyAgIHJlYWRfbWVtb3J5X2ludGVnZXIgKCh0aGlzZnJhbWUpLT5mcmFtZSArIDEyLCA0KSA6XAorICAgMCkKKworLyogRGVmaW5lIG90aGVyIGFzcGVjdHMgb2YgdGhlIHN0YWNrIGZyYW1lLiAgKi8KKworLyogQSBtYWNybyB0aGF0IHRlbGxzIHVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGludm9jYXRpb24gcmVwcmVzZW50ZWQKKyAgIGJ5IEZJIGRvZXMgbm90IGhhdmUgYSBmcmFtZSBvbiB0aGUgc3RhY2sgYXNzb2NpYXRlZCB3aXRoIGl0LiAgSWYgaXQKKyAgIGRvZXMgbm90LCBGUkFNRUxFU1MgaXMgc2V0IHRvIDEsIGVsc2UgMC4gICovCisvKiBPbiB0aGUgdmF4LCBhbGwgZnVuY3Rpb25zIGhhdmUgZnJhbWVzLiAgKi8KKyNkZWZpbmUgRlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT04oRkksIEZSQU1FTEVTUykgIHsoRlJBTUVMRVNTKSA9IDA7fQorCisvKiBTYXZlZCBQYy4gIEdldCBpdCBmcm9tIHNpZ2NvbnRleHQgaWYgd2l0aGluIHNpZ3RyYW1wLiAgKi8KKworLyogT2Zmc2V0IHRvIHNhdmVkIFBDIGluIHNpZ2NvbnRleHQsIGZyb20gPHN5cy9zaWduYWwuaD4uICAqLworI2RlZmluZSBTSUdDT05URVhUX1BDX09GRlNFVCAxMgorCisjZGVmaW5lIEZSQU1FX1NBVkVEX1BDKEZSQU1FKSBcCisgICgoKEZSQU1FKS0+c2lnbmFsX2hhbmRsZXJfY2FsbGVyIFwKKyAgICA/IHNpZ3RyYW1wX3NhdmVkX3BjIChGUkFNRSkgXAorICAgIDogcmVhZF9tZW1vcnlfaW50ZWdlciAoKEZSQU1FKS0+ZnJhbWUgKyAxNiwgNCkpIFwKKyAgICkKKworLyogQ2Fubm90IGZpbmQgdGhlIEFQIHJlZ2lzdGVyIHZhbHVlIGRpcmVjdGx5IGZyb20gdGhlIEZQIHZhbHVlLiAgTXVzdAorICAgZmluZCBpdCBzYXZlZCBpbiB0aGUgZnJhbWUgY2FsbGVkIGJ5IHRoaXMgb25lLCBvciBpbiB0aGUgQVAKKyAgIHJlZ2lzdGVyIGZvciB0aGUgaW5uZXJtb3N0IGZyYW1lLiAgSG93ZXZlciwgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwKKyAgIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGlubmVybW9zdCBmcmFtZSBhbmQgYSBmcmFtZSBmb3Igd2hpY2ggd2UKKyAgIGp1c3QgZG9uJ3Qga25vdyB0aGUgZnJhbWUgdGhhdCBpdCBjYWxsZWQgKGUuZy4gImluZm8gZnJhbWUKKyAgIDB4N2ZmZWM3ODkiKS4gIEZvciB0aGUgc2FrZSBvZiBhcmd1bWVudCBzdXBwb3NlIHRoYXQgdGhlIHN0YWNrIGlzCisgICBzb21ld2hhdCB0cmFzaGVkICh3aGljaCBpcyBvbmUgcmVhc29uIHRoYXQgImluZm8gZnJhbWUiIGV4aXN0cykuCisgICBTbyByZXR1cm4gMCAoaW5kaWNhdGluZyB3ZSBkb24ndCBrbm93IHRoZSBhZGRyZXNzIG9mCisgICB0aGUgYXJnbGlzdCkgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IGZyYW1lIHRoaXMgZnJhbWUgY2FsbHMuICAqLworI2RlZmluZSBGUkFNRV9BUkdTX0FERFJFU1NfQ09SUkVDVChmaSkgXAorICgoKGZpKS0+bmV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICA/IHJlYWRfbWVtb3J5X2ludGVnZXIgKChmaSktPm5leHQtPmZyYW1lICsgOCwgNCkgICBcCisgICA6IC8qIHJlYWRfcmVnaXN0ZXIgKEFQX1JFR05VTSkgKi8gMCkpCisKKy8qIEluIG1vc3Qgb2YgR0RCLCBnZXR0aW5nIHRoZSBhcmdzIGFkZHJlc3MgaXMgdG9vIGltcG9ydGFudCB0bworICAganVzdCBzYXkgIkkgZG9uJ3Qga25vdyIuICBUaGlzIGlzIHNvbWV0aW1lcyB3cm9uZyBmb3IgZnVuY3Rpb25zCisgICB0aGF0IGFyZW4ndCBvbiB0b3Agb2YgdGhlIHN0YWNrLCBidXQgYydlc3QgbGEgdmllLiAgKi8KKyNkZWZpbmUgRlJBTUVfQVJHU19BRERSRVNTKGZpKSBcCisgKCgoZmkpLT5uZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgID8gcmVhZF9tZW1vcnlfaW50ZWdlciAoKGZpKS0+bmV4dC0+ZnJhbWUgKyA4LCA0KSAgIFwKKyAgIDogcmVhZF9yZWdpc3RlciAoQVBfUkVHTlVNKSAvKiAwICovKSkKKworI2RlZmluZSBGUkFNRV9MT0NBTFNfQUREUkVTUyhmaSkgKChmaSktPmZyYW1lKQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvIGEgZnJhbWUuCisgICBDYW4gcmV0dXJuIC0xLCBtZWFuaW5nIG5vIHdheSB0byB0ZWxsLiAgKi8KKworI2RlZmluZSBGUkFNRV9OVU1fQVJHUyhudW1hcmdzLCBmaSkgIFwKK3sgbnVtYXJncyA9ICgweGZmICYgcmVhZF9tZW1vcnlfaW50ZWdlciAoRlJBTUVfQVJHU19BRERSRVNTIChmaSksIDEpKTsgfQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGF0IHN0YXJ0IG9mIGFyZ2xpc3QgdGhhdCBhcmUgbm90IHJlYWxseSBhcmdzLiAgKi8KKworI2RlZmluZSBGUkFNRV9BUkdTX1NLSVAgNAorCisvKiBQdXQgaGVyZSB0aGUgY29kZSB0byBzdG9yZSwgaW50byBhIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzLAorICAgdGhlIGFkZHJlc3NlcyBvZiB0aGUgc2F2ZWQgcmVnaXN0ZXJzIG9mIGZyYW1lIGRlc2NyaWJlZCBieSBGUkFNRV9JTkZPLgorICAgVGhpcyBpbmNsdWRlcyBzcGVjaWFsIHJlZ2lzdGVycyBzdWNoIGFzIHBjIGFuZCBmcCBzYXZlZCBpbiBzcGVjaWFsCisgICB3YXlzIGluIHRoZSBzdGFjayBmcmFtZS4gIHNwIGlzIGV2ZW4gbW9yZSBzcGVjaWFsOgorICAgdGhlIGFkZHJlc3Mgd2UgcmV0dXJuIGZvciBpdCBJUyB0aGUgc3AgZm9yIHRoZSBuZXh0IGZyYW1lLiAgKi8KKworI2RlZmluZSBGUkFNRV9GSU5EX1NBVkVEX1JFR1MoZnJhbWVfaW5mbywgZnJhbWVfc2F2ZWRfcmVncykgXAoreyByZWdpc3RlciBpbnQgcmVnbnVtOyAgICAgXAorICByZWdpc3RlciBpbnQgcmVnbWFzayA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKChmcmFtZV9pbmZvKS0+ZnJhbWUrNCwgNCkgPj4gMTY7IFwKKyAgcmVnaXN0ZXIgQ09SRV9BRERSIG5leHRfYWRkcjsgICAgIFwKKyAgbWVtc2V0ICgmZnJhbWVfc2F2ZWRfcmVncywgJ1wwJywgc2l6ZW9mIGZyYW1lX3NhdmVkX3JlZ3MpOyAgICAgXAorICBuZXh0X2FkZHIgPSAoZnJhbWVfaW5mbyktPmZyYW1lICsgMTY7ICAgICBcCisgIC8qIFJlZ21hc2sncyBsb3cgYml0IGlzIGZvciByZWdpc3RlciAwLCAgICAgXAorICAgICB3aGljaCBpcyB0aGUgZmlyc3Qgb25lIHRoYXQgd291bGQgYmUgcHVzaGVkLiAgKi8gICAgIFwKKyAgZm9yIChyZWdudW0gPSAwOyByZWdudW0gPCAxMjsgcmVnbnVtKyssIHJlZ21hc2sgPj49IDEpICBcCisgICAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbcmVnbnVtXSA9IChyZWdtYXNrICYgMSkgPyAobmV4dF9hZGRyICs9IDQpIDogMDsgIFwKKyAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbU1BfUkVHTlVNXSA9IG5leHRfYWRkciArIDQ7ICBcCisgIGlmIChyZWFkX21lbW9yeV9pbnRlZ2VyICgoZnJhbWVfaW5mbyktPmZyYW1lICsgNCwgNCkgJiAweDIwMDAwMDAwKSAgIFwKKyAgICAoZnJhbWVfc2F2ZWRfcmVncykucmVnc1tTUF9SRUdOVU1dICs9IDQgKyA0ICogcmVhZF9tZW1vcnlfaW50ZWdlciAobmV4dF9hZGRyICsgNCwgNCk7ICBcCisgIChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzW1BDX1JFR05VTV0gPSAoZnJhbWVfaW5mbyktPmZyYW1lICsgMTY7ICBcCisgIChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzW0ZQX1JFR05VTV0gPSAoZnJhbWVfaW5mbyktPmZyYW1lICsgMTI7ICBcCisgIChmcmFtZV9zYXZlZF9yZWdzKS5yZWdzW0FQX1JFR05VTV0gPSAoZnJhbWVfaW5mbyktPmZyYW1lICsgODsgIFwKKyAgKGZyYW1lX3NhdmVkX3JlZ3MpLnJlZ3NbUFNfUkVHTlVNXSA9IChmcmFtZV9pbmZvKS0+ZnJhbWUgKyA0OyAgXAorfQorDAorLyogVGhpbmdzIG5lZWRlZCBmb3IgbWFraW5nIHRoZSBpbmZlcmlvciBjYWxsIGZ1bmN0aW9ucy4gICovCisKKy8qIFB1c2ggYW4gZW1wdHkgc3RhY2sgZnJhbWUsIHRvIHJlY29yZCB0aGUgY3VycmVudCBQQywgZXRjLiAgKi8KKworI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FIFwKK3sgcmVnaXN0ZXIgQ09SRV9BRERSIHNwID0gcmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKTtcCisgIHJlZ2lzdGVyIGludCByZWdudW07CQkJCSAgICBcCisgIHNwID0gcHVzaF93b3JkIChzcCwgMCk7IC8qIGFyZ2xpc3QgKi8JCSAgICBcCisgIGZvciAocmVnbnVtID0gMTE7IHJlZ251bSA+PSAwOyByZWdudW0tLSkJICAgIFwKKyAgICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKHJlZ251bSkpOyAgICBcCisgIHNwID0gcHVzaF93b3JkIChzcCwgcmVhZF9yZWdpc3RlciAoUENfUkVHTlVNKSk7ICAgXAorICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKEZQX1JFR05VTSkpOyAgIFwKKyAgc3AgPSBwdXNoX3dvcmQgKHNwLCByZWFkX3JlZ2lzdGVyIChBUF9SRUdOVU0pKTsgICBcCisgIHNwID0gcHVzaF93b3JkIChzcCwgKHJlYWRfcmVnaXN0ZXIgKFBTX1JFR05VTSkgJiAweGZmZWYpICAgXAorCQkgICAgICArIDB4MmZmZjAwMDApOwkJICAgIFwKKyAgc3AgPSBwdXNoX3dvcmQgKHNwLCAwKTsgCQkJICAgIFwKKyAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgc3ApOwkJICAgIFwKKyAgd3JpdGVfcmVnaXN0ZXIgKEZQX1JFR05VTSwgc3ApOwkJICAgIFwKKyAgd3JpdGVfcmVnaXN0ZXIgKEFQX1JFR05VTSwgc3AgKyAxNyAqIHNpemVvZiAoaW50KSk7IH0KKworLyogRGlzY2FyZCBmcm9tIHRoZSBzdGFjayB0aGUgaW5uZXJtb3N0IGZyYW1lLCByZXN0b3JpbmcgYWxsIHJlZ2lzdGVycy4gICovCisKKyNkZWZpbmUgUE9QX0ZSQU1FICBcCit7IHJlZ2lzdGVyIENPUkVfQUREUiBmcCA9IHJlYWRfcmVnaXN0ZXIgKEZQX1JFR05VTSk7CQkgXAorICByZWdpc3RlciBpbnQgcmVnbnVtOwkJCQkJCSBcCisgIHJlZ2lzdGVyIGludCByZWdtYXNrID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoZnAgKyA0LCA0KTsJIFwKKyAgd3JpdGVfcmVnaXN0ZXIgKFBTX1JFR05VTSwgCQkJCQkgXAorCQkgIChyZWdtYXNrICYgMHhmZmZmKQkJCQkgXAorCQkgIHwgKHJlYWRfcmVnaXN0ZXIgKFBTX1JFR05VTSkgJiAweGZmZmYwMDAwKSk7CSBcCisgIHdyaXRlX3JlZ2lzdGVyIChQQ19SRUdOVU0sIHJlYWRfbWVtb3J5X2ludGVnZXIgKGZwICsgMTYsIDQpKTsgIFwKKyAgd3JpdGVfcmVnaXN0ZXIgKEZQX1JFR05VTSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnAgKyAxMiwgNCkpOyAgXAorICB3cml0ZV9yZWdpc3RlciAoQVBfUkVHTlVNLCByZWFkX21lbW9yeV9pbnRlZ2VyIChmcCArIDgsIDQpKTsgICBcCisgIGZwICs9IDE2OwkJCQkJCQkgXAorICBmb3IgKHJlZ251bSA9IDA7IHJlZ251bSA8IDEyOyByZWdudW0rKykJCQkgXAorICAgIGlmIChyZWdtYXNrICYgKDB4MTAwMDAgPDwgcmVnbnVtKSkJCQkJIFwKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChyZWdudW0sIHJlYWRfbWVtb3J5X2ludGVnZXIgKGZwICs9IDQsIDQpKTsgXAorICBmcCA9IGZwICsgNCArICgocmVnbWFzayA+PiAzMCkgJiAzKTsJCQkJIFwKKyAgaWYgKHJlZ21hc2sgJiAweDIwMDAwMDAwKQkJCQkJIFwKKyAgICB7IHJlZ251bSA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKGZwLCA0KTsJCQkgXAorICAgICAgZnAgKz0gKHJlZ251bSArIDEpICogNDsgfQkJCQkJIFwKKyAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgZnApOwkJCQkgXAorICBmbHVzaF9jYWNoZWRfZnJhbWVzICgpOwkJCQkJIFwKK30KKworLyogVGhpcyBzZXF1ZW5jZSBvZiB3b3JkcyBpcyB0aGUgaW5zdHJ1Y3Rpb25zCisgICAgIGNhbGxzICM2OSwgQCMzMjMyMzIzMgorICAgICBicHQKKyAgIE5vdGUgdGhpcyBpcyA4IGJ5dGVzLiAgKi8KKworI2RlZmluZSBDQUxMX0RVTU1ZIHsweDMyOWY2OWZiLCAweDAzMzIzMjMyfQorCisjZGVmaW5lIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUIDAgIC8qIFN0YXJ0IGV4ZWN1dGlvbiBhdCBiZWdpbm5pbmcgb2YgZHVtbXkgKi8KKworI2RlZmluZSBDQUxMX0RVTU1ZX0JSRUFLUE9JTlRfT0ZGU0VUIDcKKworLyogSW5zZXJ0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGFyZ3MgYW5kIGZ1bmN0aW9uIGFkZHJlc3MKKyAgIGludG8gYSBjYWxsIHNlcXVlbmNlIG9mIHRoZSBhYm92ZSBmb3JtIHN0b3JlZCBhdCBEVU1NWU5BTUUuICAqLworCisjZGVmaW5lIEZJWF9DQUxMX0RVTU1ZKGR1bW15bmFtZSwgcGMsIGZ1biwgbmFyZ3MsIGFyZ3MsIHR5cGUsIGdjY19wKSAgIFwKK3sgKigoY2hhciAqKSBkdW1teW5hbWUgKyAxKSA9IG5hcmdzOwkJXAorICAqKGludCAqKSgoY2hhciAqKSBkdW1teW5hbWUgKyAzKSA9IGZ1bjsgfQorCisvKiBJZiB2YXggcGNjIHNheXMgQ0hBUiBvciBTSE9SVCwgaXQgcHJvdmlkZXMgdGhlIGNvcnJlY3QgYWRkcmVzcy4gICovCisKKyNkZWZpbmUgQkVMSUVWRV9QQ0NfUFJPTU9USU9OIDEKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvdmF4L3ZheC5tdCBiL2dkYi9jb25maWcvdmF4L3ZheC5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmRmOTQyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy92YXgvdmF4Lm10CkBAIC0wLDAgKzEsMyBAQAorIyBUYXJnZXQ6IERFQyBWQVggcnVubmluZyBCU0Qgb3IgVWx0cml4CitUREVQRklMRVM9IHZheC10ZGVwLm8KK1RNX0ZJTEU9IHRtLXZheC5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3ZheC92YXhic2QubWggYi9nZGIvY29uZmlnL3ZheC92YXhic2QubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4Njg3ZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvdmF4L3ZheGJzZC5taApAQCAtMCwwICsxLDEzIEBACisjIEhvc3Q6IERFQyBWQVggcnVubmluZyBCU0QKKworIyBUaGUgZm9sbG93aW5nIHR5cGVzIG9mIC9iaW4vY2MgZmFpbHVyZXMgaGF2ZSBiZWVuIG9ic2VydmVkOgorIyAxLiAgU29tZXRoaW5nIGluIHJlYWRsaW5lLmMgd2hpY2ggSSBoYXZlIG5ldmVyIHNlZW4KKyMgMi4gIGBgInZhbHVlcy5jIiwgbGluZSA4MTY6IGNvbXBpbGVyIGVycm9yOiBzY2hhaW4gYm90Y2gnJworI21zZyAvYmluL2NjIGhhcyBiZWVuIGtub3duIHRvIGZhaWwgb24gVkFYZW4gcnVubmluZyBCU0Q0LjMKKyNtc2cgSWYgdGhpcyBvY2N1cnMsIHVzZSBnY2MKKyNtc2cgIChidXQgc2VlIGNvbW1lbnRzIGluIE1ha2VmaWxlLmRpc3QgYWJvdXQgY29tcGlsaW5nIHdpdGggZ2NjKS4KKworWE1fRklMRT0geG0tdmF4YnNkLmgKK1hERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBjb3JlbG93Lm8gY29yZS1hb3V0Lm8KKworTkFUX0ZJTEU9IG5tLXZheC5oCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3ZheC92YXh1bHQubWggYi9nZGIvY29uZmlnL3ZheC92YXh1bHQubWgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmY2JjOAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvdmF4L3ZheHVsdC5taApAQCAtMCwwICsxLDcgQEAKKyMgSG9zdDogREVDIFZBWCBydW5uaW5nIFVsdHJpeAorCitYTV9GSUxFPSB4bS12YXh1bHQuaAorWERFUEZJTEVTPSAKKworTkFUX0ZJTEU9IG5tLXZheC5oCitOQVRERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBjb3JlbG93Lm8gY29yZS1hb3V0Lm8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvdmF4L3ZheHVsdDIubWggYi9nZGIvY29uZmlnL3ZheC92YXh1bHQyLm1oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYzczZDYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3ZheC92YXh1bHQyLm1oCkBAIC0wLDAgKzEsNyBAQAorIyBIb3N0OiBERUMgVkFYIHJ1bm5pbmcgVWx0cml4CisKK1hNX0ZJTEU9IHhtLXZheHVsdDIuaAorWERFUEZJTEVTPSAKKworTkFUX0ZJTEU9IG5tLXZheC5oCitOQVRERVBGSUxFUz0gaW5mcHRyYWNlLm8gaW5mdGFyZy5vIGZvcmstY2hpbGQubyBjb3JlbG93Lm8gY29yZS1hb3V0Lm8KZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvdmF4L3htLXZheC5oIGIvZ2RiL2NvbmZpZy92YXgveG0tdmF4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhMTFjNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvdmF4L3htLXZheC5oCkBAIC0wLDAgKzEsODEgQEAKKy8qIENvbW1vbiBkZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gVmF4ZW4gdW5kZXIgNC4yYnNkIGFuZCBVbHRyaXguCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODksIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgorCisvKiBUaGlzIGlzIHRoZSBhbW91bnQgdG8gc3VidHJhY3QgZnJvbSB1LnVfYXIwCisgICB0byBnZXQgdGhlIG9mZnNldCBpbiB0aGUgY29yZSBmaWxlIG9mIHRoZSByZWdpc3RlciB2YWx1ZXMuICAqLworCisjZGVmaW5lIEtFUk5FTF9VX0FERFIgKDB4ODAwMDAwMDAgLSAoVVBBR0VTICogTkJQRykpCisKKy8qIEtlcm5lbCBpcyBhIGJpdCB0ZW5hY2lvdXMgYWJvdXQgc2hhcmluZyB0ZXh0IHNlZ21lbnRzLCBkaXNhbGxvd2luZyBicHRzLiAgKi8KKyNkZWZpbmUJT05FX1BST0NFU1NfV1JJVEVURVhUCisKKy8qIEludGVyZmFjZSBkZWZpbml0aW9ucyBmb3Iga2VybmVsIGRlYnVnZ2VyIEtEQi4gICovCisKKy8qIE1hcCBtYWNoaW5lIGZhdWx0IGNvZGVzIGludG8gc2lnbmFsIG51bWJlcnMuCisgICBGaXJzdCBzdWJ0cmFjdCAwLCBkaXZpZGUgYnkgNCwgdGhlbiBpbmRleCBpbiBhIHRhYmxlLgorICAgRmF1bHRzIGZvciB3aGljaCB0aGUgZW50cnkgaW4gdGhpcyB0YWJsZSBpcyAwCisgICBhcmUgbm90IGhhbmRsZWQgYnkgS0RCOyB0aGUgcHJvZ3JhbSdzIG93biB0cmFwIGhhbmRsZXIKKyAgIGdldHMgdG8gaGFuZGxlIHRoZW4uICAqLworCisjZGVmaW5lIEZBVUxUX0NPREVfT1JJR0lOIDAKKyNkZWZpbmUgRkFVTFRfQ09ERV9VTklUUyA0CisjZGVmaW5lIEZBVUxUX1RBQkxFICAgIFwKK3sgMCwgU0lHS0lMTCwgU0lHU0VHViwgMCwgMCwgMCwgMCwgMCwgXAorICAwLCAwLCBTSUdUUkFQLCBTSUdUUkFQLCAwLCAwLCAwLCAwLCBcCisgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CisKKy8qIFN0YXJ0IHJ1bm5pbmcgd2l0aCBhIHN0YWNrIHN0cmV0Y2hpbmcgZnJvbSBCRUcgdG8gRU5ELgorICAgQkVHIGFuZCBFTkQgc2hvdWxkIGJlIHN5bWJvbHMgbWVhbmluZ2Z1bCB0byB0aGUgYXNzZW1ibGVyLgorICAgVGhpcyBpcyB1c2VkIG9ubHkgZm9yIGtkYi4gICovCisKKyNkZWZpbmUgSU5JVF9TVEFDSyhiZWcsIGVuZCkgIFwKK3sgYXNtICgiLmdsb2JsIGVuZCIpOyAgICAgICAgIFwKKyAgYXNtICgibW92bCAkIGVuZCwgc3AiKTsgICAgICBcCisgIGFzbSAoImNscmwgZnAiKTsgfQorCisvKiBQdXNoIHRoZSBmcmFtZSBwb2ludGVyIHJlZ2lzdGVyIG9uIHRoZSBzdGFjay4gICovCisjZGVmaW5lIFBVU0hfRlJBTUVfUFRSICAgICAgICBcCisgIGFzbSAoInB1c2hsIGZwIik7CisKKy8qIENvcHkgdGhlIHRvcC1vZi1zdGFjayB0byB0aGUgZnJhbWUgcG9pbnRlciByZWdpc3Rlci4gICovCisjZGVmaW5lIFBPUF9GUkFNRV9QVFIgIFwKKyAgYXNtICgibW92bCAoc3ApLCBmcCIpOworCisvKiBBZnRlciBLREIgaXMgZW50ZXJlZCBieSBhIGZhdWx0LCBwdXNoIGFsbCByZWdpc3RlcnMKKyAgIHRoYXQgR0RCIHRoaW5rcyBhYm91dCAoYWxsIE5VTV9SRUdTIG9mIHRoZW0pLAorICAgc28gdGhhdCB0aGV5IGFwcGVhciBpbiBvcmRlciBvZiBhc2NlbmRpbmcgR0RCIHJlZ2lzdGVyIG51bWJlci4KKyAgIFRoZSBmYXVsdCBjb2RlIHdpbGwgYmUgb24gdGhlIHN0YWNrIGJleW9uZCB0aGUgbGFzdCByZWdpc3Rlci4gICovCisKKyNkZWZpbmUgUFVTSF9SRUdJU1RFUlMgICAgICAgIFwKK3sgYXNtICgicHVzaGwgOChzcCkiKTsgICAgICAgIFwKKyAgYXNtICgicHVzaGwgOChzcCkiKTsgICAgICAgIFwKKyAgYXNtICgicHVzaGFsIDB4MTQoc3ApIik7ICAgIFwKKyAgYXNtICgicHVzaHIgJDAzNzc3NyIpOyB9CisKKy8qIEFzc3VtaW5nIHRoZSByZWdpc3RlcnMgKGluY2x1ZGluZyBwcm9jZXNzb3Igc3RhdHVzKSBoYXZlIGJlZW4KKyAgIHB1c2hlZCBvbiB0aGUgc3RhY2sgaW4gb3JkZXIgb2YgYXNjZW5kaW5nIEdEQiByZWdpc3RlciBudW1iZXIsCisgICByZXN0b3JlIHRoZW0gYW5kIHJldHVybiB0byB0aGUgYWRkcmVzcyBpbiB0aGUgc2F2ZWQgUEMgcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIFBPUF9SRUdJU1RFUlMgICAgICBcCit7IGFzbSAoInBvcHIgJDAzNzc3NyIpOyAgICBcCisgIGFzbSAoInN1YmwyICQ4LChzcCkiKTsgICBcCisgIGFzbSAoIm1vdmwgKHNwKSxzcCIpOyAgICBcCisgIGFzbSAoInJlaSIpOyB9CmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3ZheC94bS12YXhic2QuaCBiL2dkYi9jb25maWcvdmF4L3htLXZheGJzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MmJkNzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3ZheC94bS12YXhic2QuaApAQCAtMCwwICsxLDEwIEBACisvKiBEZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gYSB2YXggdW5kZXIgQlNELCA0LjMgb3IgNC40LiAqLworCisvKiBXZSBoYXZlIHRvIGluY2x1ZGUgdGhlc2UgZmlsZXMgbm93LCBzbyB0aGF0IEdEQiB3aWxsIG5vdCBtYWtlCisgICBjb21wZXRpbmcgZGVmaW5pdGlvbnMgaW4gZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxtYWNoaW5lL2VuZGlhbi5oPgorLyogVGhpcyBzaG91bGQgZXhpc3Qgb24gZWl0aGVyIDQuMyBvciA0LjQuICA0LjMgZG9lc24ndCBoYXZlIGxpbWl0cy5oCisgICBvciBtYWNoaW5lL2xpbWl0cy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgInZheC94bS12YXguaCIKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcvdmF4L3htLXZheHVsdC5oIGIvZ2RiL2NvbmZpZy92YXgveG0tdmF4dWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjNjQzNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvdmF4L3htLXZheHVsdC5oCkBAIC0wLDAgKzEsMTIgQEAKKy8qIERlZmluaXRpb25zIHRvIG1ha2UgR0RCIHJ1biBvbiBhIHZheCB1bmRlciBVbHRyaXguICovCisKKyNpbmNsdWRlICJ2YXgveG0tdmF4LmgiCitleHRlcm4gY2hhciAqc3RyZHVwKCk7CisKKy8qIFRoaXMgaXMgcmVxdWlyZWQgZm9yIFVsdHJpeCAzLjFiLCBub3QgZm9yIGxhdGVyIHZlcnNpb25zLiAgVWx0cml4CisgICAzLjFiIGNhbid0IGp1c3QgdXNlIHhtLXZheHVsdDIuaCBiZWNhdXNlIFVsdHJpeCAzLjFiIGRvZXMgZGVmaW5lCisgICBGRF9TRVQuICBTdXJlLCB3ZSBjb3VsZCBoYXZlIHNlcGFyYXRlIGNvbmZpZ3VyYXRpb25zIGZvciB2YXh1bHQyLAorICAgdmF4dWx0MywgYW5kIHZheHVsdCwgYnV0IHdoeSBib3RoZXI/ICBEZWZpbmluZyB0aGUgcHRyYWNlIGNvbnN0YW50cworICAgaW4gaW5mcHRyYWNlLmMgaXNuJ3QgZ29pbmcgdG8gZG8gYW55IGhhcm07IGl0J3Mgbm90IGxpa2UgdGhleSBhcmUKKyAgIGdvaW5nIHRvIGNoYW5nZS4gICovCisjZGVmaW5lIE5PX1BUUkFDRV9ICmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3ZheC94bS12YXh1bHQyLmggYi9nZGIvY29uZmlnL3ZheC94bS12YXh1bHQyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkM2Q2MgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcvdmF4L3htLXZheHVsdDIuaApAQCAtMCwwICsxLDExIEBACisvKiBEZWZpbml0aW9ucyB0byBtYWtlIEdEQiBydW4gb24gYSB2YXggdW5kZXIgVWx0cml4LiAqLworCisjaW5jbHVkZSAidmF4L3htLXZheC5oIgorZXh0ZXJuIGNoYXIgKnN0cmR1cCgpOworCisjZGVmaW5lIE5PX1BUUkFDRV9ICisKKy8qIE9sZCB2ZXJzaW9ucyBvZiB1bHRyaXggaGF2ZSBmZF9zZXQgYnV0IG5vdCB0aGUgRkRfKiBtYWNyb3MuICAqLworCisjZGVmaW5lIEZEX1NFVChiaXQsZmRzZXRwKSAoKGZkc2V0cCktPmZkc19iaXRzWyhuKSAvIDMyXSB8PSAoMSA8PCAoKG4pICUgMzIpKSkKKyNkZWZpbmUgRkRfWkVSTyhmZHNldHApIG1lbXNldCAoZmRzZXRwLCAwLCBzaXplb2YgKCpmZHNldHApKQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy93NjUvdG0tdzY1LmggYi9nZGIvY29uZmlnL3c2NS90bS13NjUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTM1NGJiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy93NjUvdG0tdzY1LmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIGV4ZWN1dGlvbiBvbiBhIFdEQyA2NTgxNiBtYWNoaW5lLgorICAgQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHNhY0BjeWdudXMuY29tICovCisKKyNkZWZpbmUgR0RCX1RBUkdFVF9JU19XNjUKKworI2RlZmluZSBJRUVFX0ZMT0FUIDEKKworLyogRGVmaW5lIHRoZSBiaXQsIGJ5dGUsIGFuZCB3b3JkIG9yZGVyaW5nIG9mIHRoZSBtYWNoaW5lLiAgKi8KKworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisKKworLyogT2Zmc2V0IGZyb20gYWRkcmVzcyBvZiBmdW5jdGlvbiB0byBzdGFydCBvZiBpdHMgY29kZS4KKyAgIFplcm8gb24gbW9zdCBtYWNoaW5lcy4gICovCisKKyNkZWZpbmUgRlVOQ1RJT05fU1RBUlRfT0ZGU0VUIDAKKworLyogQWR2YW5jZSBQQyBhY3Jvc3MgYW55IGZ1bmN0aW9uIGVudHJ5IHByb2xvZ3VlIGluc3RydWN0aW9ucworICAgdG8gcmVhY2ggc29tZSAicmVhbCIgY29kZS4gICovCisKK2V4dGVybiBDT1JFX0FERFIgdzY1X3NraXBfcHJvbG9ndWUgKCk7CisKKyNkZWZpbmUgU0tJUF9QUk9MT0dVRShpcCkgXAorICAgIHsoaXApID0gdzY1X3NraXBfcHJvbG9ndWUoaXApO30KKworCisvKiBJbW1lZGlhdGVseSBhZnRlciBhIGZ1bmN0aW9uIGNhbGwsIHJldHVybiB0aGUgc2F2ZWQgcGMuCisgICBDYW4ndCBhbHdheXMgZ28gdGhyb3VnaCB0aGUgZnJhbWVzIGZvciB0aGlzIGJlY2F1c2Ugb24gc29tZSBtYWNoaW5lcworICAgdGhlIG5ldyBmcmFtZSBpcyBub3Qgc2V0IHVwIHVudGlsIHRoZSBuZXcgZnVuY3Rpb24gZXhlY3V0ZXMKKyAgIHNvbWUgaW5zdHJ1Y3Rpb25zLiAKKworICAgVGhlIHJldHVybiBhZGRyZXNzIGlzIHRoZSB2YWx1ZSBzYXZlZCBpbiB0aGUgUFIgcmVnaXN0ZXIgKyA0ICAqLworCisjZGVmaW5lIFNBVkVEX1BDX0FGVEVSX0NBTEwoZnJhbWUpIFwKKyAgc2F2ZWRfcGNfYWZ0ZXJfY2FsbChmcmFtZSkKKworCisvKiBTdGFjayBncm93cyBkb3dud2FyZC4gICovCisKKyNkZWZpbmUgSU5ORVJfVEhBTihsaHMscmhzKSAoKGxocykgPCAocmhzKSkKKworLyogSWxsZWdhbCBpbnN0cnVjdGlvbiAtIHVzZWQgYnkgdGhlIHNpbXVsYXRvciBmb3IgYnJlYWtwb2ludAorICAgZGV0ZWN0aW9uICovCisKKyNkZWZpbmUgQlJFQUtQT0lOVCB7MHhjYn0gLyogV0FJICovCisKKy8qIElmIHlvdXIga2VybmVsIHJlc2V0cyB0aGUgcGMgYWZ0ZXIgdGhlIHRyYXAgaGFwcGVucyB5b3UgbWF5IG5lZWQgdG8KKyAgIGRlZmluZSB0aGlzIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlLiAgKi8KKyNkZWZpbmUgREVDUl9QQ19BRlRFUl9CUkVBSyAwCisKKy8qIFJldHVybiAxIGlmIFAgcG9pbnRzIHRvIGFuIGludmFsaWQgZmxvYXRpbmcgcG9pbnQgdmFsdWUuICAqLworCisjZGVmaW5lIElOVkFMSURfRkxPQVQocCwgbGVuKSAwICAgLyogSnVzdCBhIGZpcnN0IGd1ZXNzOyBub3QgY2hlY2tlZCAqLworCisvKiBTYXkgaG93IGxvbmcgcmVnaXN0ZXJzIGFyZS4gICovCisvKiNkZWZpbmUgUkVHSVNURVJfVFlQRSAgaW50Ki8KKworLyogU2F5IGhvdyBtdWNoIG1lbW9yeSBpcyBuZWVkZWQgdG8gc3RvcmUgYSBjb3B5IG9mIHRoZSByZWdpc3RlciBzZXQgKi8KKyNkZWZpbmUgUkVHSVNURVJfQllURVMgICAgKE5VTV9SRUdTKjQpIAorCisvKiBJbmRleCB3aXRoaW4gYHJlZ2lzdGVycycgb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNwYWNlIGZvcgorICAgcmVnaXN0ZXIgTi4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfQllURShOKSAgKChOKSo0KQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSBpbiB0aGUgYWN0dWFsIG1hY2hpbmUgcmVwcmVzZW50YXRpb24KKyAgIGZvciByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9SQVdfU0laRShOKSAgICAgKCgoTikgPCAxNikgPyAyIDogNCkKKworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUoTikgIFJFR0lTVEVSX1JBV19TSVpFKE4pCisKKy8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfUkFXX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9SQVdfU0laRSA0CisKKy8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfVklSVFVBTF9TSVpFIGNhbiBoYXZlLiAgKi8KKworI2RlZmluZSBNQVhfUkVHSVNURVJfVklSVFVBTF9TSVpFIDQKKworLyogUmV0dXJuIHRoZSBHREIgdHlwZSBvYmplY3QgZm9yIHRoZSAic3RhbmRhcmQiIGRhdGEgdHlwZQorICAgb2YgZGF0YSBpbiByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1RZUEUoTikgXAorICAoUkVHSVNURVJfVklSVFVBTF9TSVpFKE4pID09IDIgPyBidWlsdGluX3R5cGVfdW5zaWduZWRfc2hvcnQgOiBidWlsdGluX3R5cGVfdW5zaWduZWRfbG9uZykKKworLyogSW5pdGlhbGl6ZXIgZm9yIGFuIGFycmF5IG9mIG5hbWVzIG9mIHJlZ2lzdGVycy4KKyAgIEVudHJpZXMgYmV5b25kIHRoZSBmaXJzdCBOVU1fUkVHUyBhcmUgaWdub3JlZC4gICovCisKKyNkZWZpbmUgUkVHSVNURVJfTkFNRVMgXAorICB7InIwIiwicjEiLCJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsICBcCisgICAicjgiLCJyOSIsInIxMCIsInIxMSIsInIxMiIsInIxMyIsInIxNCIsInIxNSIsIFwKKyAgICJwYyIsImEiLCAieCIsICAieSIsICAiZGJyIiwiZCIsICAicyIsICAicCIsICAgXAorICAgInRpY2tzIiwiY3ljbGVzIiwiaW5zdHMifQorCisvKiBSZWdpc3RlciBudW1iZXJzIG9mIHZhcmlvdXMgaW1wb3J0YW50IHJlZ2lzdGVycy4KKyAgIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgInJlYWwiIHJlZ2lzdGVyIG51bWJlcnMsCisgICBhbmQgY29ycmVzcG9uZCB0byB0aGUgZ2VuZXJhbCByZWdpc3RlcnMgb2YgdGhlIG1hY2hpbmUsCisgICBhbmQgc29tZSBhcmUgInBob255IiByZWdpc3RlciBudW1iZXJzIHdoaWNoIGFyZSB0b28gbGFyZ2UKKyAgIHRvIGJlIGFjdHVhbCByZWdpc3RlciBudW1iZXJzIGFzIGZhciBhcyB0aGUgdXNlciBpcyBjb25jZXJuZWQKKyAgIGJ1dCBkbyBzZXJ2ZSB0byBnZXQgdGhlIGRlc2lyZWQgdmFsdWVzIHdoZW4gcGFzc2VkIHRvIHJlYWRfcmVnaXN0ZXIuICAqLworCisjZGVmaW5lIFNQX1JFR05VTSAgMjIKKyNkZWZpbmUgRlBfUkVHTlVNICAxNQorI2RlZmluZSBOVU1fUkVHUyAgIDI3CisjZGVmaW5lIFBDX1JFR05VTSAgMTYKKyNkZWZpbmUgUF9SRUdOVU0gICAyMworCisvKiBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUgcGxhY2UgaW4gd2hpY2ggdG8gY29weSB0aGUgc3RydWN0dXJlIHRoZQorICAgc3Vicm91dGluZSB3aWxsIHJldHVybi4gIFRoaXMgaXMgY2FsbGVkIGZyb20gY2FsbF9mdW5jdGlvbi4gCisKKyAgIFdlIHN0b3JlIHN0cnVjdHMgdGhyb3VnaCBhIHBvaW50ZXIgcGFzc2VkIGluIFI0ICovCisKKyNkZWZpbmUgU1RPUkVfU1RSVUNUX1JFVFVSTihBRERSLCBTUCkgXAorICAgIHsgd3JpdGVfcmVnaXN0ZXIgKDQsIChBRERSKSk7ICB9CisKKy8qIEV4dHJhY3QgZnJvbSBhbiBhcnJheSBSRUdCVUYgY29udGFpbmluZyB0aGUgKHJhdykgcmVnaXN0ZXIgc3RhdGUKKyAgIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIG9mIHR5cGUgVFlQRSwgYW5kIGNvcHkgdGhhdCwgaW4gdmlydHVhbCBmb3JtYXQsCisgICBpbnRvIFZBTEJVRi4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9SRVRVUk5fVkFMVUUoVFlQRSxSRUdCVUYsVkFMQlVGKSBcCisgIG1lbWNweSAoVkFMQlVGLCAoY2hhciAqKShSRUdCVUYpLCBUWVBFX0xFTkdUSChUWVBFKSkKKworCisvKiBXcml0ZSBpbnRvIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHJldHVybiB2YWx1ZQorICAgb2YgdHlwZSBUWVBFLCBnaXZlbiBpbiB2aXJ0dWFsIGZvcm1hdC4gIAorCisgICBUaGluZ3MgYWx3YXlzIGdldCByZXR1cm5lZCBpbiBSNC9SNSAqLworCisjZGVmaW5lIFNUT1JFX1JFVFVSTl9WQUxVRShUWVBFLFZBTEJVRikgXAorICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSg0KSwgVkFMQlVGLCBUWVBFX0xFTkdUSCAoVFlQRSkpCisKKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgdGhlIGFkZHJlc3MgaW4gd2hpY2ggYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGl0cyBzdHJ1Y3R1cmUgdmFsdWUsCisgICBhcyBhIENPUkVfQUREUiAob3IgYW4gZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIG9uZSkuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MoUkVHQlVGKSAoKihDT1JFX0FERFIgKikoUkVHQlVGKSkKKworLyogQSBtYWNybyB0aGF0IHRlbGxzIHVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGludm9jYXRpb24gcmVwcmVzZW50ZWQKKyAgIGJ5IEZJIGRvZXMgbm90IGhhdmUgYSBmcmFtZSBvbiB0aGUgc3RhY2sgYXNzb2NpYXRlZCB3aXRoIGl0LiAgSWYgaXQKKyAgIGRvZXMgbm90LCBGUkFNRUxFU1MgaXMgc2V0IHRvIDEsIGVsc2UgMC4gICovCisKKyNkZWZpbmUgRlJBTUVMRVNTX0ZVTkNUSU9OX0lOVk9DQVRJT04oRkksIEZSQU1FTEVTUykgXAorICAoRlJBTUVMRVNTKSA9IGZyYW1lbGVzc19sb29rX2Zvcl9wcm9sb2d1ZShGSSkKKworI2RlZmluZSBGUkFNRV9DSEFJTihGUkFNRSkgICAgICAgdzY1X2ZyYW1lX2NoYWluKEZSQU1FKQorI2RlZmluZSBGUkFNRV9TQVZFRF9QQyhGUkFNRSkgICAgKHc2NV9mcmFtZV9zYXZlZF9wYyhGUkFNRSkpCisjZGVmaW5lIEZSQU1FX0FSR1NfQUREUkVTUyhmaSkgICAoZmkpLT5mcmFtZQorI2RlZmluZSBGUkFNRV9MT0NBTFNfQUREUkVTUyhmaSkgKGZpKS0+ZnJhbWUKKworLyogU2V0IFZBTCB0byB0aGUgbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvIGZyYW1lIGRlc2NyaWJlZCBieSBGSS4KKyAgIENhbiBzZXQgVkFMIHRvIC0xLCBtZWFuaW5nIG5vIHdheSB0byB0ZWxsLiAgKi8KKworLyogV2UgY2FuJ3QgdGVsbCBob3cgbWFueSBhcmdzIHRoZXJlIGFyZSAqLworCisjZGVmaW5lIEZSQU1FX05VTV9BUkdTKHZhbCxmaSkgKHZhbCA9IC0xKQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGF0IHN0YXJ0IG9mIGFyZ2xpc3QgdGhhdCBhcmUgbm90IHJlYWxseSBhcmdzLiAgKi8KKworI2RlZmluZSBGUkFNRV9BUkdTX1NLSVAgMAorCisvKiBQdXQgaGVyZSB0aGUgY29kZSB0byBzdG9yZSwgaW50byBhIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzLAorICAgdGhlIGFkZHJlc3NlcyBvZiB0aGUgc2F2ZWQgcmVnaXN0ZXJzIG9mIGZyYW1lIGRlc2NyaWJlZCBieSBGUkFNRV9JTkZPLgorICAgVGhpcyBpbmNsdWRlcyBzcGVjaWFsIHJlZ2lzdGVycyBzdWNoIGFzIHBjIGFuZCBmcCBzYXZlZCBpbiBzcGVjaWFsCisgICB3YXlzIGluIHRoZSBzdGFjayBmcmFtZS4gIHNwIGlzIGV2ZW4gbW9yZSBzcGVjaWFsOgorICAgdGhlIGFkZHJlc3Mgd2UgcmV0dXJuIGZvciBpdCBJUyB0aGUgc3AgZm9yIHRoZSBuZXh0IGZyYW1lLiAgKi8KKworI2RlZmluZSBGUkFNRV9GSU5EX1NBVkVEX1JFR1MoZnJhbWVfaW5mbywgZnJhbWVfc2F2ZWRfcmVncykJICAgIFwKKyAgIGZyYW1lX2ZpbmRfc2F2ZWRfcmVncyhmcmFtZV9pbmZvLCAmKGZyYW1lX3NhdmVkX3JlZ3MpKQorCisjZGVmaW5lIE5BTUVTX0hBVkVfVU5ERVJTQ09SRQorCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IElOU05fV09SRDsKKworZXh0ZXJuIENPUkVfQUREUiB3NjVfYWRkcl9iaXRzX3JlbW92ZSBQQVJBTVMgKChDT1JFX0FERFIpKTsKKyNkZWZpbmUgQUREUl9CSVRTX1JFTU9WRShhZGRyKSB3NjVfYWRkcl9iaXRzX3JlbW92ZSAoYWRkcikKKworI2RlZmluZSBDQUxMX0RVTU1ZX0xFTkdUSCAxMAorCisvKiBEaXNjYXJkIGZyb20gdGhlIHN0YWNrIHRoZSBpbm5lcm1vc3QgZnJhbWUsCisgICByZXN0b3JpbmcgYWxsIHNhdmVkIHJlZ2lzdGVycy4gICovCisKKyNkZWZpbmUgUE9QX0ZSQU1FIHBvcF9mcmFtZSgpOworCisKKyNkZWZpbmUgTk9QICAgezB4ZWF9CisKKyNkZWZpbmUgUkVHSVNURVJfU0laRSA0CisKKyNkZWZpbmUJUFJJTlRfUkVHSVNURVJfSE9PSyhyZWdubykgcHJpbnRfcmVnaXN0ZXJfaG9vayhyZWdubykKKworI2RlZmluZSBUQVJHRVRfSU5UX0JJVCAgMTYKKyNkZWZpbmUgVEFSR0VUX0xPTkdfQklUIDMyCisjZGVmaW5lIFRBUkdFVF9QVFJfQklUICAzMgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy93NjUvdzY1Lm10IGIvZ2RiL2NvbmZpZy93NjUvdzY1Lm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZDIzMjUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3c2NS93NjUubXQKQEAgLTAsMCArMSw4IEBACisjIFRhcmdldDogV0RDIDY1ODE2IHdpdGggc2ltdWxhdG9yCitUREVQRklMRVM9IHc2NS10ZGVwLm8KK1RNX0ZJTEU9IHRtLXc2NS5oCisKK1NJTV9PQlMgPSByZW1vdGUtc2ltLm8KK1NJTSA9IC4uL3NpbS93NjUvbGlic2ltLmEKKworCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3htLWFpeDQuaCBiL2dkYi9jb25maWcveG0tYWl4NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MDYyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3htLWFpeDQuaApAQCAtMCwwICsxLDk5IEBACisvKiBQYXJhbWV0ZXJzIGZvciBob3N0aW5nIG9uIGFuIFBvd2VyUEMsIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBDb3Jwb3JhdGlvbi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGUgZm9sbG93aW5nIHRleHQgaXMgdGFrZW4gZnJvbSBjb25maWcvcnM2MDAwLm1oOgorICogIyBUaGUgSUJNIHZlcnNpb24gb2YgL3Vzci9pbmNsdWRlL3JwYy9ycGMuaCBoYXMgYSBidWcgLS0gaXQgc2F5cworICogIyBgZXh0ZXJuIGZkX3NldCBzdmNfZmRzZXQ7JyB3aXRob3V0IGV2ZXIgZGVmaW5pbmcgdGhlIHR5cGUgZmRfc2V0LgorICogIyBVbmZvcnR1bmF0ZWx5IHRoaXMgb2NjdXJzIGluIHRoZSB2eC1zaGFyZSBjb2RlLCB3aGljaCBpcyBub3QgY29uZmlndXJlZAorICogIyBsaWtlIHRoZSByZXN0IG9mIEdEQiAoZS5nLiBpdCBkb2Vzbid0IGluY2x1ZGUgImRlZnMuaCIpLgorICogIyBXZSBjaXJjdW12ZW50IHRoaXMgYnVnIGJ5ICNkZWZpbmUtaW5nIGZkX3NldCBoZXJlLCBidXQgdW5kZWZpbmluZyBpdCBpbgorICogIyB0aGUgeG0tcnM2MDAwLmggZmlsZSBiZWZvcmUgb3JkaW5hcnkgbW9kdWxlcyB0cnkgdG8gdXNlIGl0LiAgRklYTUUsIElCTSEKKyAqIE1IX0NGTEFHUz0nLURmZF9zZXQ9aW50JworICogU28sIGhlcmUgd2UgZG8gdGhlIHVuZGVmaW5lLi4ud2hpY2ggaGFzIHRvIG9jY3VyIGJlZm9yZSB3ZSBpbmNsdWRlCisgKiA8c3lzL3NlbGVjdC5oPiBiZWxvdy4KKyAqLworI3VuZGVmIGZkX3NldAorCisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorCisvKiBCaWcgZW5kIGlzIGF0IHRoZSBsb3cgYWRkcmVzcyAqLworCisjZGVmaW5lCUhPU1RfQllURV9PUkRFUglCSUdfRU5ESUFOCisKKy8qIEF0IGxlYXN0IGFzIG9mIEFJWCAzLjIsIHdlIGhhdmUgdGVybWlvcy4gICovCisjZGVmaW5lCUhBVkVfVEVSTUlPUyAxCisvKiAjZGVmaW5lIEhBVkVfVEVSTUlPIDEgKi8KKworI2RlZmluZQlVU0cgMQorI2RlZmluZQlIQVZFX1NJR1NFVE1BU0sJMQorCisjZGVmaW5lIEZJVkVfQVJHX1BUUkFDRQorCisvKiBBSVggZGVjbGFyZXMgdGhlIG1lbSBmdW5jdGlvbnMgZGlmZmVyZW50bHkgdGhhbiBkZWZzLmggZG9lcy4gIEFJWCBpcworICAgcmlnaHQsIGJ1dCBkZWZzLmggd29ya3Mgb24gbW9yZSBvbGQgc3lzdGVtcy4gIEZvciBub3csIG92ZXJyaWRlIGl0LiAgKi8KKworI2RlZmluZSBNRU1fRk5TX0RFQ0xBUkVEIDEKKworLyogVGhpcyBzeXN0ZW0gcmVxdWlyZXMgdGhhdCB3ZSBvcGVuIGEgdGVybWluYWwgd2l0aCBPX05PQ1RUWSBmb3IgaXQgdG8KKyAgIG5vdCBiZWNvbWUgb3VyIGNvbnRyb2xsaW5nIHRlcm1pbmFsLiAgKi8KKworI2RlZmluZQlVU0VfT19OT0NUVFkKKworLyogQnJhaW4gZGVhdGggaW5oZXJpdGVkIGZyb20gUEMncyBwZXJ2YWRlcy4gICovCisjdW5kZWYgTlVMTAorI2RlZmluZSBOVUxMIDAKKworLyogVGhlIElCTSBjb21waWxlciByZXF1aXJlcyB0aGlzIGluIG9yZGVyIHRvIHByb3Blcmx5IGNvbXBpbGUgYWxsb2NhKCkuICAqLworI3ByYWdtYSBhbGxvY2EKKworLyogVGhlcmUgaXMgbm8gdmZvcmsuICAqLworCisjZGVmaW5lCXZmb3JrCWZvcmsKKworY2hhciAqdGVybWRlZigpOworCisvKiBTaWduYWwgaGFuZGxlciBmb3IgU0lHV0lOQ0ggYHdpbmRvdyBzaXplIGNoYW5nZWQnLiAqLworCisjZGVmaW5lCVNJR1dJTkNIX0hBTkRMRVIgIGFpeF9yZXNpemV3aW5kb3cKK2V4dGVybiB2b2lkIGFpeF9yZXNpemV3aW5kb3cgUEFSQU1TICgoaW50KSk7CisKKy8qIGBsaW5lc19wZXJfcGFnZScgYW5kIGBjaGFyc19wZXJfbGluZScgYXJlIGxvY2FsIHRvIHV0aWxzLmMuIFJlY3RpZnkgdGhpcy4gKi8KKworI2RlZmluZQlTSUdXSU5DSF9IQU5ETEVSX0JPRFkJXAorCQkJCQkJCQkJXAorLyogUmVzcG9uZCB0byBTSUdXSU5DSCBgd2luZG93IHNpemUgY2hhbmdlZCcgc2lnbmFsLCBhbmQgcmVzZXQgR0RCJ3MJXAorICAgd2luZG93IHNldHRpbmdzIGFwcHJvcHJpYXRlbHkuICovCQkJCQlcCisJCQkJCQkJCQlcCit2b2lkIAkJCQkJCVwKK2FpeF9yZXNpemV3aW5kb3cgKHNpZ25vKQkJCVwKKyAgICAgaW50IHNpZ25vOwkJCQkJXAorewkJCQkJCVwKKyAgaW50IGZkID0gZmlsZW5vIChzdGRvdXQpOwkJCVwKKyAgaWYgKGlzYXR0eSAoZmQpKSB7CQkJCVwKKyAgICBpbnQgdmFsOwkJCQkJXAorCQkJCQkJXAorICAgIHZhbCA9IGF0b2kgKHRlcm1kZWYgKGZkLCAnbCcpKTsJCVwKKyAgICBpZiAodmFsID4gMCkJCQkJXAorICAgICAgbGluZXNfcGVyX3BhZ2UgPSB2YWw7CQkJXAorICAgIHZhbCA9IGF0b2kgKHRlcm1kZWYgKGZkLCAnYycpKTsJCVwKKyAgICBpZiAodmFsID4gMCkJCQkJXAorICAgICAgY2hhcnNfcGVyX2xpbmUgPSB2YWw7CQkJXAorICB9CQkJCQkJXAorfQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy94bS1seW54LmggYi9nZGIvY29uZmlnL3htLWx5bnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzNlMmMxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy94bS1seW54LmgKQEAgLTAsMCArMSwyMCBAQAorLyogSG9zdC1kZXBlbmRlbnQgZGVmaW5pdGlvbnMgZm9yIGFueSBDUFUgcnVubmluZyBMeW54T1MuCisgICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CS8qIGZvciBJTlRfTUlOICovCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3htLW1wdy5oIGIvZ2RiL2NvbmZpZy94bS1tcHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzQ3M2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy94bS1tcHcuaApAQCAtMCwwICsxLDgxIEBACisvKiBNYWNybyBkZWZpbml0aW9ucyBmb3IgcnVubmluZyBHREIgb24gQXBwbGUgTWFjaW50b3NoZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgIm1wdy5oIgorCisjaW5jbHVkZSAiZm9wZW4tYmluLmgiCisKKyNpbmNsdWRlICJzcGluLmgiCisKKyNkZWZpbmUgQ0FOVF9GT1JLCisKKy8qIE1hcCB0aGVzZSBzdGFuZGFyZCBmdW5jdGlvbnMgdG8gdmVyc2lvbnMgdGhhdCBjYW4gZG8gSS9PIGluIGEgY29uc29sZQorICAgd2luZG93LiAqLworCisjZGVmaW5lIHByaW50ZiBoYWNrZWRfcHJpbnRmCisjZGVmaW5lIGZwcmludGYgaGFja2VkX2ZwcmludGYKKyNkZWZpbmUgdnByaW50ZiBoYWNrZWRfdmZwcmludGYKKyNkZWZpbmUgZnB1dHMgaGFja2VkX2ZwdXRzCisjZGVmaW5lIGZwdXRjIGhhY2tlZF9mcHV0YworI3VuZGVmIHB1dGMKKyNkZWZpbmUgcHV0YyBoYWNrZWRfcHV0YworI2RlZmluZSBmZmx1c2ggaGFja2VkX2ZmbHVzaAorCisjZGVmaW5lIGZnZXRjIGhhY2tlZF9mZ2V0YworCisjZGVmaW5lIFBPU0lYX1VUSU1FCisKKy8qIE5vIGRlY2xhcmF0aW9uIG9mIHN0cmR1cCBpbiBNUFcncyBzdHJpbmcuaCwgb2RkbHkgZW5vdWdoLiAqLworCitjaGFyICpzdHJkdXAgKGNoYXIgKnMxKTsKKworLyogJy4nIGluZGljYXRlcyBkcml2ZXJzIG9uIHRoZSBNYWMsIHNvIHdlIG5lZWQgYSBkaWZmZXJlbnQgZmlsZW5hbWUuICovCisKKyNkZWZpbmUgR0RCSU5JVF9GSUxFTkFNRSAiX2dkYmluaXQiCisKKy8qIENvbW1hcyBhcmUgbW9yZSBjb21tb24gdG8gc2VwYXJhdGUgZGlybmFtZXMgaW4gYSBwYXRoIG9uIE1hY3MuICovCisKKyNkZWZpbmUgRElSTkFNRV9TRVBBUkFUT1IgJywnCisKKy8qIFRoaXMgaXMgYSByZWFsIGNydWZ0eSBoYWNrLiAqLworCisjZGVmaW5lIEhBVkVfVEVSTUlPCisKKy8qIEFkZG9ucyB0byB0aGUgYmFzaWMgTVBXLXN1cHBvcnRlZCBzaWduYWwgbGlzdC4gKi8KKworI2lmbmRlZiBTSUdRVUlUCisjZGVmaW5lIFNJR1FVSVQgKDE8PDYpCisjZW5kaWYKKyNpZm5kZWYgU0lHSFVQCisjZGVmaW5lIFNJR0hVUCAoMTw8NykKKyNlbmRpZgorCisvKiBJZiBfX1NURENfXyBpcyBvbiwgdGhlbiB0aGlzIGRlZmluaXRpb24gd2lsbCBiZSBtaXNzaW5nLiAqLworCisjaWZuZGVmIGZpbGVubworI2RlZmluZSBmaWxlbm8ocCkJKHApLT5fZmlsZQorI2VuZGlmCisKKyNpZm5kZWYgUl9PSworI2RlZmluZSBSX09LIDQKKyNlbmRpZgorCitleHRlcm4gaW50IFN0YW5kQWxvbmU7CisKK2V4dGVybiBpbnQgbWFjX2FwcDsKZGlmZiAtLWdpdCBhL2dkYi9jb25maWcveG0tbmJzZC5oIGIvZ2RiL2NvbmZpZy94bS1uYnNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMzMmJiNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcveG0tbmJzZC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qIEhvc3QtZGVwZW5kZW50IGRlZmluaXRpb25zIGZvciBhbnkgQ1BVIHJ1bm5pbmcgTmV0QlNELgorICAgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogV2UgaGF2ZSB0byBpbmNsdWRlIHRoZXNlIGZpbGVzIG5vdywgc28gdGhhdCBHREIgd2lsbCBub3QgbWFrZQorICAgY29tcGV0aW5nIGRlZmluaXRpb25zIGluIGRlZnMuaC4gICovCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxtYWNoaW5lL2VuZGlhbi5oPgorI2lmIEJZVEVfT1JERVIgPT0gQklHX0VORElBTgorI2RlZmluZSBIT1NUX0JZVEVfT1JERVIgQklHX0VORElBTgorI2Vsc2UKKyNkZWZpbmUgSE9TVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyNlbmRpZgorCisvKiBOZXRCU0QgaGFzIHRlcm1pb3MgZmFjaWxpdGllcy4gKi8KKyNkZWZpbmUgSEFWRV9URVJNSU9TCmRpZmYgLS1naXQgYS9nZGIvY29uZmlnL3htLXN5c3Y0LmggYi9nZGIvY29uZmlnL3htLXN5c3Y0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyMTVlNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWcveG0tc3lzdjQuaApAQCAtMCwwICsxLDM5IEBACisvKiBEZWZpbml0aW9ucyBmb3IgcnVubmluZyBnZGIgb24gYSBob3N0IG1hY2hpbmUgcnVubmluZyBhbnkgZmxhdm9yIG9mIFNWUjQuCisgICBDb3B5cmlnaHQgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIGF0IEN5Z251cyBTdXBwb3J0IChmbmZAY3lnbnVzLmNvbSkuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogU1ZSNCBoYXMgdGVybWlvcyBmYWNpbGl0aWVzLiAqLworCisjdW5kZWYgSEFWRV9URVJNSU8KKyNkZWZpbmUgSEFWRV9URVJNSU9TCisKKy8qIFNWUjQgaXMgYSBkZXJpdmF0aXZlIG9mIFN5c3RlbSBWIFJlbGVhc2UgMyAoVVNHKSAqLworCisjZGVmaW5lIFVTRworCisvKiBVc2Ugc2V0cGdpZCgwLDApIHRvIHJ1biBpbmZlcmlvciBpbiBhIHNlcGFyYXRlIHByb2Nlc3MgZ3JvdXAgKi8KKworI2RlZmluZSBORUVEX1BPU0lYX1NFVFBHSUQKKworLyogU1ZSNCBoYXMgc2lnc2V0am1wIGFuZCBzaWdsb25nam1wICovCisjZGVmaW5lIEhBVkVfU0lHU0VUSk1QCisKKy8qIFdlIGhhdmUgdG8gaW5jbHVkZSB0aGVzZSBmaWxlcyBub3csIHNvIHRoYXQgR0RCIHdpbGwgbm90IG1ha2UKKyAgIGNvbXBldGluZyBkZWZpbml0aW9ucyBpbiBkZWZzLmguICAqLworI2luY2x1ZGUgPGxpbWl0cy5oPgpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy96OGsvdG0tejhrLmggYi9nZGIvY29uZmlnL3o4ay90bS16OGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWJkZTkwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZy96OGsvdG0tejhrLmgKQEAgLTAsMCArMSwyODcgQEAKKy8qIFBhcmFtZXRlcnMgZm9yIGV4ZWN1dGlvbiBvbiBhIHo4MDAwIHNlcmllcyBtYWNoaW5lLgorICAgQ29weXJpZ2h0IDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBJRUVFX0ZMT0FUIDEKKworI3VuZGVmIFRBUkdFVF9JTlRfQklUCisjdW5kZWYgVEFSR0VUX0xPTkdfQklUCisjdW5kZWYgVEFSR0VUX1NIT1JUX0JJVAorI3VuZGVmIFRBUkdFVF9QVFJfQklUCisKKyNkZWZpbmUgVEFSR0VUX1NIT1JUX0JJVCAxNgorI2RlZmluZSBUQVJHRVRfSU5UX0JJVCAxNgorI2RlZmluZSBUQVJHRVRfTE9OR19CSVQgMzIKKyNkZWZpbmUgVEFSR0VUX1BUUl9CSVQgKEJJRyA/IDMyOiAxNikKKworLyogRGVmaW5lIHRoZSBiaXQsIGJ5dGUsIGFuZCB3b3JkIG9yZGVyaW5nIG9mIHRoZSBtYWNoaW5lLiAgKi8KKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVIgQklHX0VORElBTgorCisvKiBPZmZzZXQgZnJvbSBhZGRyZXNzIG9mIGZ1bmN0aW9uIHRvIHN0YXJ0IG9mIGl0cyBjb2RlLgorICAgWmVybyBvbiBtb3N0IG1hY2hpbmVzLiAgKi8KKworI2RlZmluZSBGVU5DVElPTl9TVEFSVF9PRkZTRVQgMAorCisvKiBBZHZhbmNlIFBDIGFjcm9zcyBhbnkgZnVuY3Rpb24gZW50cnkgcHJvbG9ndWUgaW5zdHJ1Y3Rpb25zCisgICB0byByZWFjaCBzb21lICJyZWFsIiBjb2RlLiAgKi8KKworI2RlZmluZSBTS0lQX1BST0xPR1VFKGlwKSAgIHsoaXApID0gejhrX3NraXBfcHJvbG9ndWUoaXApO30KK2V4dGVybiBDT1JFX0FERFIgbXo4a19za2lwX3Byb2xvZ3VlIFBBUkFNUyAoKENPUkVfQUREUiBpcCkpOworCisKKy8qIEltbWVkaWF0ZWx5IGFmdGVyIGEgZnVuY3Rpb24gY2FsbCwgcmV0dXJuIHRoZSBzYXZlZCBwYy4KKyAgIENhbid0IGFsd2F5cyBnbyB0aHJvdWdoIHRoZSBmcmFtZXMgZm9yIHRoaXMgYmVjYXVzZSBvbiBzb21lIG1hY2hpbmVzCisgICB0aGUgbmV3IGZyYW1lIGlzIG5vdCBzZXQgdXAgdW50aWwgdGhlIG5ldyBmdW5jdGlvbiBleGVjdXRlcworICAgc29tZSBpbnN0cnVjdGlvbnMuICAqLworCisjZGVmaW5lIFNBVkVEX1BDX0FGVEVSX0NBTEwoZnJhbWUpIHNhdmVkX3BjX2FmdGVyX2NhbGwoZnJhbWUpCisKKy8qIFN0YWNrIGdyb3dzIGRvd253YXJkLiAgKi8KKworI2RlZmluZSBJTk5FUl9USEFOKGxocyxyaHMpICgobGhzKSA8IChyaHMpKQorCisvKiBTZXF1ZW5jZSBvZiBieXRlcyBmb3IgYnJlYWtwb2ludCBpbnN0cnVjdGlvbi4gKi8KKworI2RlZmluZSBCUkVBS1BPSU5UIHsweDM2LDB4MDB9CisKKy8qIElmIHlvdXIga2VybmVsIHJlc2V0cyB0aGUgcGMgYWZ0ZXIgdGhlIHRyYXAgaGFwcGVucyB5b3UgbWF5IG5lZWQgdG8KKyAgIGRlZmluZSB0aGlzIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlLiAgKi8KKworI2RlZmluZSBERUNSX1BDX0FGVEVSX0JSRUFLIDAKKworLyogU2F5IGhvdyBsb25nIHJlZ2lzdGVycyBhcmUuICAqLworCisjZGVmaW5lIFJFR0lTVEVSX1RZUEUgdW5zaWduZWQgaW50CisKKyNkZWZpbmUgTlVNX1JFR1MgCTIzICAgLyogMTYgcmVnaXN0ZXJzICsgMSBjY3IgKyAxIHBjICsgMyBkZWJ1ZworCQkJCXJlZ3MgKyBmYWtlIGZwICsgZmFrZSBzcCovCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTICAoTlVNX1JFR1MgKjQpCisKKy8qIEluZGV4IHdpdGhpbiBgcmVnaXN0ZXJzJyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3BhY2UgZm9yCisgICByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9CWVRFKE4pICAoKE4pKjQpCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBhY3R1YWwgbWFjaGluZSByZXByZXNlbnRhdGlvbgorICAgZm9yIHJlZ2lzdGVyIE4uICBPbiB0aGUgejhrLCBhbGwgYnV0IHRoZSBwYyBhcmUgMiBieXRlcywgYnV0IHdlCisgICBrZWVwIHRoZW0gYWxsIGFzIDQgYnl0ZXMgYW5kIHRyaW0gdGhlbSBvbiBJL08gKi8KKworCisjZGVmaW5lIFJFR0lTVEVSX1JBV19TSVpFKE4pICgoKE4pIDwgMTYpPyAyOjQpCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiBzdG9yYWdlIGluIHRoZSBwcm9ncmFtJ3MgcmVwcmVzZW50YXRpb24KKyAgIGZvciByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1NJWkUoTikgUkVHSVNURVJfUkFXX1NJWkUoTikgCisKKy8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfUkFXX1NJWkUgY2FuIGhhdmUuICAqLworCisjZGVmaW5lIE1BWF9SRUdJU1RFUl9SQVdfU0laRSA0CisKKy8qIExhcmdlc3QgdmFsdWUgUkVHSVNURVJfVklSVFVBTF9TSVpFIGNhbiBoYXZlLiAgKi8KKworI2RlZmluZSBNQVhfUkVHSVNURVJfVklSVFVBTF9TSVpFIDQKKworLyogUmV0dXJuIHRoZSBHREIgdHlwZSBvYmplY3QgZm9yIHRoZSAic3RhbmRhcmQiIGRhdGEgdHlwZQorICAgb2YgZGF0YSBpbiByZWdpc3RlciBOLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9WSVJUVUFMX1RZUEUoTikgXAorIChSRUdJU1RFUl9WSVJUVUFMX1NJWkUoTikgPT0gMj8gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2ludCA6IGJ1aWx0aW5fdHlwZV9sb25nKQorCisvKiNkZWZpbmUgSU5JVF9GUkFNRV9QQyh4LHkpIGluaXRfZnJhbWVfcGMoeCx5KSovCisvKiBJbml0aWFsaXplciBmb3IgYW4gYXJyYXkgb2YgbmFtZXMgb2YgcmVnaXN0ZXJzLgorICAgRW50cmllcyBiZXlvbmQgdGhlIGZpcnN0IE5VTV9SRUdTIGFyZSBpZ25vcmVkLiAgKi8KKworI2RlZmluZSBSRUdJU1RFUl9OQU1FUyAgXAorIHsicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLCBcCisgICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIsIFwKKyAgImNjciIsICJwYyIsICJjeWNsZXMiLCJpbnN0cyIsInRpbWUiLCJmcCIsInNwIn0KKworLyogUmVnaXN0ZXIgbnVtYmVycyBvZiB2YXJpb3VzIGltcG9ydGFudCByZWdpc3RlcnMuCisgICBOb3RlIHRoYXQgc29tZSBvZiB0aGVzZSB2YWx1ZXMgYXJlICJyZWFsIiByZWdpc3RlciBudW1iZXJzLAorICAgYW5kIGNvcnJlc3BvbmQgdG8gdGhlIGdlbmVyYWwgcmVnaXN0ZXJzIG9mIHRoZSBtYWNoaW5lLAorICAgYW5kIHNvbWUgYXJlICJwaG9ueSIgcmVnaXN0ZXIgbnVtYmVycyB3aGljaCBhcmUgdG9vIGxhcmdlCisgICB0byBiZSBhY3R1YWwgcmVnaXN0ZXIgbnVtYmVycyBhcyBmYXIgYXMgdGhlIHVzZXIgaXMgY29uY2VybmVkCisgICBidXQgZG8gc2VydmUgdG8gZ2V0IHRoZSBkZXNpcmVkIHZhbHVlcyB3aGVuIHBhc3NlZCB0byByZWFkX3JlZ2lzdGVyLiAgKi8KKworI2RlZmluZSBDQ1JfUkVHTlVNIAkxNgkvKiBDb250YWlucyBwcm9jZXNzb3Igc3RhdHVzICovCisjZGVmaW5lIFBDX1JFR05VTSAJMTcJLyogQ29udGFpbnMgcHJvZ3JhbSBjb3VudGVyICovCisjZGVmaW5lIENZQ0xFU19SRUdOVU0gCTE4CisjZGVmaW5lIElOU1RTX1JFR05VTSAJMTkKKyNkZWZpbmUgVElNRV9SRUdOVU0gCTIwCisjZGVmaW5lIEZQX1JFR05VTSAJMjEJLyogQ29udGFpbnMgZnAsIHdoYXRldmVyIG1lbW9yeSBtb2RlbCAqLworI2RlZmluZSBTUF9SRUdOVU0gCTIyCS8qIENvbmF0aW5zIHNwLCB3aGF0ZXZlciBtZW1vcnkgbW9kZWwgKi8KKworCisKKyNkZWZpbmUgUFRSX1NJWkUgKEJJRyA/IDQ6IDIpCisjZGVmaW5lIFBUUl9NQVNLIChCSUcgPyAweGZmMDBmZmZmIDogMHgwMDAwZmZmZikKKworLyogU3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIHBsYWNlIGluIHdoaWNoIHRvIGNvcHkgdGhlIHN0cnVjdHVyZSB0aGUKKyAgIHN1YnJvdXRpbmUgd2lsbCByZXR1cm4uICBUaGlzIGlzIGNhbGxlZCBmcm9tIGNhbGxfZnVuY3Rpb24uICovCisKKyNkZWZpbmUgU1RPUkVfU1RSVUNUX1JFVFVSTihBRERSLCBTUCkgYWJvcnQoKTsKKworLyogRXh0cmFjdCBmcm9tIGFuIGFycmF5IFJFR0JVRiBjb250YWluaW5nIHRoZSAocmF3KSByZWdpc3RlciBzdGF0ZQorICAgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgb2YgdHlwZSBUWVBFLCBhbmQgY29weSB0aGF0LCBpbiB2aXJ0dWFsIGZvcm1hdCwKKyAgIGludG8gVkFMQlVGLiAgVGhpcyBpcyBhc3N1bWluZyB0aGF0IGZsb2F0aW5nIHBvaW50IHZhbHVlcyBhcmUgcmV0dXJuZWQKKyAgIGFzIGRvdWJsZXMgaW4gZDAvZDEuICAqLworCisKKyNkZWZpbmUgRVhUUkFDVF9SRVRVUk5fVkFMVUUoVFlQRSxSRUdCVUYsVkFMQlVGKSBcCisgIG1lbWNweShWQUxCVUYsIFJFR0JVRiArIFJFR0lTVEVSX0JZVEUoMiksIFRZUEVfTEVOR1RIKFRZUEUpKTsKKworLyogV3JpdGUgaW50byBhcHByb3ByaWF0ZSByZWdpc3RlcnMgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUKKyAgIG9mIHR5cGUgVFlQRSwgZ2l2ZW4gaW4gdmlydHVhbCBmb3JtYXQuICovCisKKyNkZWZpbmUgU1RPUkVfUkVUVVJOX1ZBTFVFKFRZUEUsVkFMQlVGKSBhYm9ydCgpOworCisvKiBFeHRyYWN0IGZyb20gYW4gYXJyYXkgUkVHQlVGIGNvbnRhaW5pbmcgdGhlIChyYXcpIHJlZ2lzdGVyIHN0YXRlCisgICB0aGUgYWRkcmVzcyBpbiB3aGljaCBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gaXRzIHN0cnVjdHVyZSB2YWx1ZSwKKyAgIGFzIGEgQ09SRV9BRERSIChvciBhbiBleHByZXNzaW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgb25lKS4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyhSRUdCVUYpICgqKENPUkVfQUREUiAqKShSRUdCVUYpKQorDAorLyogRGVzY3JpYmUgdGhlIHBvaW50ZXIgaW4gZWFjaCBzdGFjayBmcmFtZSB0byB0aGUgcHJldmlvdXMgc3RhY2sgZnJhbWUKKyAgIChpdHMgY2FsbGVyKS4gICovCisKKy8qIEZSQU1FX0NIQUlOIHRha2VzIGEgZnJhbWUncyBub21pbmFsIGFkZHJlc3MgYW5kIHByb2R1Y2VzIHRoZSBmcmFtZSdzCisgICBjaGFpbi1wb2ludGVyLgorICAgSW4gdGhlIGNhc2Ugb2YgdGhlIFo4MDAwLCB0aGUgZnJhbWUncyBub21pbmFsIGFkZHJlc3MKKyAgIGlzIHRoZSBhZGRyZXNzIG9mIGEgcHRyIHNpemVkIGJ5dGUgd29yZCBjb250YWluaW5nIHRoZSBjYWxsaW5nCisgICBmcmFtZSdzIGFkZHJlc3MuICAqLworCisjZGVmaW5lIEZSQU1FX0NIQUlOKHRoaXNmcmFtZSkgZnJhbWVfY2hhaW4odGhpc2ZyYW1lKTsKKworCisKKy8qIERlZmluZSBvdGhlciBhc3BlY3RzIG9mIHRoZSBzdGFjayBmcmFtZS4gICovCisKKy8qIEEgbWFjcm8gdGhhdCB0ZWxscyB1cyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpbnZvY2F0aW9uIHJlcHJlc2VudGVkCisgICBieSBGSSBkb2VzIG5vdCBoYXZlIGEgZnJhbWUgb24gdGhlIHN0YWNrIGFzc29jaWF0ZWQgd2l0aCBpdC4gIElmIGl0CisgICBkb2VzIG5vdCwgRlJBTUVMRVNTIGlzIHNldCB0byAxLCBlbHNlIDAuICAqLworI2RlZmluZSBGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTihGSSwgRlJBTUVMRVNTKSBcCisgIChGUkFNRUxFU1MpID0gZnJhbWVsZXNzX2xvb2tfZm9yX3Byb2xvZ3VlKEZJKQorCisjZGVmaW5lIEZSQU1FX1NBVkVEX1BDKEZSQU1FKSBmcmFtZV9zYXZlZF9wYyhGUkFNRSkKKworI2RlZmluZSBGUkFNRV9BUkdTX0FERFJFU1MoZmkpICgoZmkpLT5mcmFtZSkKKworI2RlZmluZSBGUkFNRV9MT0NBTFNfQUREUkVTUyhmaSkgKChmaSktPmZyYW1lKQorCisvKiBTZXQgVkFMIHRvIHRoZSBudW1iZXIgb2YgYXJncyBwYXNzZWQgdG8gZnJhbWUgZGVzY3JpYmVkIGJ5IEZJLgorICAgQ2FuIHNldCBWQUwgdG8gLTEsIG1lYW5pbmcgbm8gd2F5IHRvIHRlbGwuICAqLworCisvKiBXZSBjYW4ndCB0ZWxsIGhvdyBtYW55IGFyZ3MgdGhlcmUgYXJlCisgICBub3cgdGhhdCB0aGUgQyBjb21waWxlciBkZWxheXMgcG9wcGluZyB0aGVtLiAgKi8KKyNpZiAhZGVmaW5lZCAoRlJBTUVfTlVNX0FSR1MpCisjZGVmaW5lIEZSQU1FX05VTV9BUkdTKHZhbCxmaSkgKHZhbCA9IC0xKQorI2VuZGlmCisKKy8qIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgYXQgc3RhcnQgb2YgYXJnbGlzdCB0aGF0IGFyZSBub3QgcmVhbGx5IGFyZ3MuICAqLworCisjZGVmaW5lIEZSQU1FX0FSR1NfU0tJUCA4CisKKyNpZmRlZiBfX1NURENfXworc3RydWN0IGZyYW1lX2luZm87CisjZW5kaWYKK2V4dGVybiB2b2lkIHo4a19mcmFtZV9pbml0X3NhdmVkX3JlZ3MgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworI2RlZmluZSBGUkFNRV9JTklUX1NBVkVEX1JFR1MoZmkpIHo4a19mcmFtZV9pbml0X3NhdmVkX3JlZ3MgKGZpKQorCisMCisvKiBUaGluZ3MgbmVlZGVkIGZvciBtYWtpbmcgdGhlIGluZmVyaW9yIGNhbGwgZnVuY3Rpb25zLgorICAgSXQgc2VlbXMgbGlrZSBldmVyeSBtNjhrIGJhc2VkIG1hY2hpbmUgaGFzIGFsbW9zdCBpZGVudGljYWwgZGVmaW5pdGlvbnMKKyAgIGluIHRoZSBpbmRpdmlkdWFsIG1hY2hpbmUncyBjb25maWd1cmF0aW9uIGZpbGVzLiAgTW9zdCBvdGhlciBjcHUgdHlwZXMKKyAgIChtaXBzLCBpMzg2LCBldGMpIGhhdmUgcm91dGluZXMgaW4gdGhlaXIgKi10ZGVwLmMgZmlsZXMgdG8gaGFuZGxlIHRoaXMKKyAgIGZvciBtb3N0IGNvbmZpZ3VyYXRpb25zLiAgVGhlIG02OGsgZmFtaWx5IHNob3VsZCBiZSBhYmxlIHRvIGRvIHRoaXMgYXMKKyAgIHdlbGwuICBUaGVzZSBtYWNyb3MgY2FuIHN0aWxsIGJlIG92ZXJyaWRkZW4gd2hlbiBuZWNlc3NhcnkuICAqLworCisvKiBUaGUgQ0FMTF9EVU1NWSBtYWNybyBpcyB0aGUgc2VxdWVuY2Ugb2YgaW5zdHJ1Y3Rpb25zLCBhcyBkaXNhc3NlbWJsZWQKKyAgIGJ5IGdkYiBpdHNlbGY6CisKKwlmbW92ZW14IGZwMC1mcDcsc3BALQkJCTB4ZjIyNyAweGUwZmYKKwltb3ZlbWwgZDAtYTUsc3BALQkJCTB4NDhlNyAweGZmZmMKKwljbHJ3IHNwQC0JCQkJMHg0MjY3CisJbW92ZXcgY2NyLHNwQC0JCQkJMHg0MmU3CisKKwkvLi4qIFRoZSBhcmd1bWVudHMgYXJlIHB1c2hlZCBhdCB0aGlzIHBvaW50IGJ5IEdEQjsKKwlubyBjb2RlIGlzIG5lZWRlZCBpbiB0aGUgZHVtbXkgZm9yIHRoaXMuCisJVGhlIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VUIGdpdmVzIHRoZSBwb3NpdGlvbiBvZiAKKwl0aGUgZm9sbG93aW5nIGpzciBpbnN0cnVjdGlvbi4gICouLi8KKworCWpzciBAIzB4MzIzMjMyMzIJCQkweDRlYjkgMHgzMjMyIDB4MzIzMgorCWFkZGFsICMweDY5Njk2OTY5LHNwCQkJMHhkZmZjIDB4Njk2OSAweDY5NjkKKwl0cmFwICM8eW91ciBCUFRfVkVDVE9SIG51bWJlciBoZXJlPgkweDRlND8KKwlub3AJCQkJCTB4NGU3MQorCisgICBOb3RlIHRoaXMgaXMgQ0FMTF9EVU1NWV9MRU5HVEggYnl0ZXMgKDI4IGZvciB0aGUgYWJvdmUgZXhhbXBsZSkuCisgICBXZSBhY3R1YWxseSBzdGFydCBleGVjdXRpbmcgYXQgdGhlIGpzciwgc2luY2UgdGhlIHB1c2hpbmcgb2YgdGhlCisgICByZWdpc3RlcnMgaXMgZG9uZSBieSBQVVNIX0RVTU1ZX0ZSQU1FLiAgSWYgdGhpcyB3ZXJlIHJlYWwgY29kZSwKKyAgIHRoZSBhcmd1bWVudHMgZm9yIHRoZSBmdW5jdGlvbiBjYWxsZWQgYnkgdGhlIGpzciB3b3VsZCBiZSBwdXNoZWQKKyAgIGJldHdlZW4gdGhlIG1vdmVtbCBhbmQgdGhlIGpzciwgYW5kIHdlIGNvdWxkIGFsbG93IGl0IHRvIGV4ZWN1dGUgdGhyb3VnaC4KKyAgIEJ1dCB0aGUgYXJndW1lbnRzIGhhdmUgdG8gYmUgcHVzaGVkIGJ5IEdEQiBhZnRlciB0aGUgUFVTSF9EVU1NWV9GUkFNRSBpcworICAgZG9uZSwgYW5kIHdlIGNhbm5vdCBhbGxvdyB0aGUgbW92ZW1sIHRvIHB1c2ggdGhlIHJlZ2lzdGVycyBhZ2FpbiBsZXN0CisgICB0aGV5IGJlIHRha2VuIGZvciB0aGUgYXJndW1lbnRzLiAgKi8KKworCisjZGVmaW5lIENBTExfRFVNTVkgeyAwIH0KKyNkZWZpbmUgQ0FMTF9EVU1NWV9MRU5HVEggMjQJCS8qIFNpemUgb2YgQ0FMTF9EVU1NWSAqLworI2RlZmluZSBDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCA4CS8qIE9mZnNldCB0byBqc3IgaW5zdHJ1Y3Rpb24qLworCisKKy8qIEluc2VydCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBhcmdzIGFuZCBmdW5jdGlvbiBhZGRyZXNzCisgICBpbnRvIGEgY2FsbCBzZXF1ZW5jZSBvZiB0aGUgYWJvdmUgZm9ybSBzdG9yZWQgYXQgRFVNTVlOQU1FLgorICAgV2UgdXNlIHRoZSBCRkQgcm91dGluZXMgdG8gc3RvcmUgYSBiaWctZW5kaWFuIHZhbHVlIG9mIGtub3duIHNpemUuICAqLworCisjZGVmaW5lIEZJWF9DQUxMX0RVTU1ZKGR1bW15bmFtZSwgcGMsIGZ1biwgbmFyZ3MsIGFyZ3MsIHR5cGUsIGdjY19wKSAgICAgXAoreyBiZmRfcHV0YjMyIChmdW4sICAgICAoY2hhciAqKSBkdW1teW5hbWUgKyBDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCArIDIpOyAgXAorICBiZmRfcHV0YjMyIChuYXJncyo0LCAoY2hhciAqKSBkdW1teW5hbWUgKyBDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCArIDgpOyB9CisKKy8qIFB1c2ggYW4gZW1wdHkgc3RhY2sgZnJhbWUsIHRvIHJlY29yZCB0aGUgY3VycmVudCBQQywgZXRjLiAgKi8KKworI2RlZmluZSBQVVNIX0RVTU1ZX0ZSQU1FCXsgejhrX3B1c2hfZHVtbXlfZnJhbWUgKCk7IH0KKworZXh0ZXJuIHZvaWQgejhrX3B1c2hfZHVtbXlfZnJhbWUgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCB6OGtfcG9wX2ZyYW1lIFBBUkFNUyAoKHZvaWQpKTsKKworLyogRGlzY2FyZCBmcm9tIHRoZSBzdGFjayB0aGUgaW5uZXJtb3N0IGZyYW1lLCByZXN0b3JpbmcgYWxsIHJlZ2lzdGVycy4gICovCisKKyNkZWZpbmUgUE9QX0ZSQU1FCQl7IHo4a19wb3BfZnJhbWUgKCk7IH0KKworLyogT2Zmc2V0IGZyb20gU1AgdG8gZmlyc3QgYXJnIG9uIHN0YWNrIGF0IGZpcnN0IGluc3RydWN0aW9uIG9mIGEgZnVuY3Rpb24gKi8KKworI2RlZmluZSBTUF9BUkcwICgxICogNCkKKworZXh0ZXJuIENPUkVfQUREUiB6OGtfYWRkcl9iaXRzX3JlbW92ZSBQQVJBTVMgKChDT1JFX0FERFIpKTsKKyNkZWZpbmUgQUREUl9CSVRTX1JFTU9WRShhZGRyKSB6OGtfYWRkcl9iaXRzX3JlbW92ZSAoYWRkcikKK2ludCBzaW1fejgwMDFfbW9kZTsKKyNkZWZpbmUgQklHIChzaW1fejgwMDFfbW9kZSkKKworI2RlZmluZSByZWFkX21lbW9yeV9zaG9ydCh4KSAgKHJlYWRfbWVtb3J5X2ludGVnZXIoeCwyKSAmIDB4ZmZmZikKKworI2RlZmluZSBOT19TVERfUkVHUworCisjZGVmaW5lCVBSSU5UX1JFR0lTVEVSX0hPT0socmVnbm8pIHByaW50X3JlZ2lzdGVyX2hvb2socmVnbm8pCisKKworI2RlZmluZSBJTklUX0VYVFJBX1NZTVRBQl9JTkZPIFwKKyAgejhrX3NldF9wb2ludGVyX3NpemUob2JqZmlsZS0+b2JmZC0+YXJjaF9pbmZvLT5iaXRzX3Blcl9hZGRyZXNzKTsKKworI2RlZmluZSBSRUdJU1RFUl9TSVpFIDQKKwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy96OGsvejhrLm10IGIvZ2RiL2NvbmZpZy96OGsvejhrLm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiOGQwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlnL3o4ay96OGsubXQKQEAgLTAsMCArMSw3IEBACisjIFRhcmdldDogWjgwMDAgd2l0aCBzaW11bGF0b3IKK1RERVBGSUxFUz0gejhrLXRkZXAubworVE1fRklMRT0gdG0tejhrLmgKKworU0lNX09CUyA9IHJlbW90ZS1zaW0ubworU0lNID0gLi4vc2ltL3o4ay9saWJzaW0uYQorCmRpZmYgLS1naXQgYS9nZGIvY29uZmlndXJlIGIvZ2RiL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNzBkMDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDYyNzkgQEAKKyMhIC9iaW4vc2gKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCisjIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworIyBEZWZhdWx0czoKK2FjX2hlbHA9CithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCisjIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46CithY19oZWxwPSIkYWNfaGVscAorICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS10dWkgICAgICAgICAgICBFbmFibGUgZnVsbC1zY3JlZW4gdGVybWluYWwgdXNlciBpbnRlcmZhY2UiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1uZXRyb20gICAgICAgICBFbmFibGUgTmV0Uk9NIHN1cHBvcnQiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1idWlsZC13YXJuaW5ncyBFbmFibGUgYnVpbGQtdGltZSBjb21waWxlciB3YXJuaW5ncyBpZiBnY2MgaXMgdXNlZCIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1tbWFsbG9jICAgICAgICAgIFVzZSBtZW1vcnkgbWFwcGVkIG1hbGxvYyBwYWNrYWdlIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLXggICAgICAgICAgICAgICAgdXNlIHRoZSBYIFdpbmRvdyBTeXN0ZW0iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaGFyZWQgICAgICAgICBVc2Ugc2hhcmVkIGxpYnJhcmllcyIKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2J1aWxkPU5PTkUKK2NhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2V4ZWNfcHJlZml4PU5PTkUKK2hvc3Q9Tk9ORQorbm9fY3JlYXRlPQorbm9ub3B0PU5PTkUKK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3RhcmdldD1OT05FCit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorc3ViZGlycz0KK01GTEFHUz0gTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCisgICAgZXhpdCAwIDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Li9jb25maWcubG9nCisKK2VjaG8gIlwKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorIiAxPiY1CisKKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCithY19jb25maWd1cmVfYXJncz0KK2ZvciBhY19hcmcKK2RvCisgIGNhc2UgIiRhY19hcmciIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBlc2FjCitkb25lCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKyMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCisjIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCitpZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID4gY29uZmRlZnMuaAorCisjIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0CisjIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorYWNfdW5pcXVlX2ZpbGU9bWFpbi5jCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19wcm9nPSQwCisgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCisKKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgLiAkY2FjaGVfZmlsZQorZWxzZQorICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgPiAkY2FjaGVfZmlsZQorZmkKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworYWNfZXhlZXh0PQorYWNfb2JqZXh0PW8KK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTQ2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1NzY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2Mjc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY1OTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKKworI2xpbmUgNjcwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworbWFpbigpe3JldHVybigwKTt9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Njc1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKyAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisgIGVsc2UKKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcworICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjcwMTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Citjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjcwNjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzE1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjczNDogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKK2lmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfY2NfZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc2NjogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAorICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgorICBDUFA9IiR7Q0MtY2N9IC1FIgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3ODEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjc4NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzk4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MDQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDgxNSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODIxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPS9saWIvY3BwCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKKyAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCitlbHNlCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKK2VjaG8gIiRhY190IiIkQ1BQIiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBBSVgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjg0NjogY2hlY2tpbmcgZm9yIEFJWCIgPiY1CitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4NDggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2lmZGVmIF9BSVgKKyAgeWVzCisjZW5kaWYKKworRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJ5ZXMiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjY7IGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBfQUxMX1NPVVJDRSAxCitFT0YKKworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4NzA6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKK2lmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgorICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQorRU9GCisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDQz0iJENDIC1wb3NpeCIKKyAgZWxzZQorICAgIENDPSIkQ0MgLVhwIgorICBmaQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgSVNDPQorZmkKKworCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICR7Q0MtY2N9IG9wdGlvbiB0byBhY2NlcHQgQU5TSSBDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4OTQ6IGNoZWNraW5nIGZvciAke0NDLWNjfSBvcHRpb24gdG8gYWNjZXB0IEFOU0kgQyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfcHJvZ19jY19zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYW1fY3ZfcHJvZ19jY19zdGRjPW5vCithY19zYXZlX0NDPSIkQ0MiCisjIERvbid0IHRyeSBnY2MgLWFuc2k7IHRoYXQgdHVybnMgb2ZmIHVzZWZ1bCBleHRlbnNpb25zIGFuZAorIyBicmVha3Mgc29tZSBzeXN0ZW1zJyBoZWFkZXIgZmlsZXMuCisjIEFJWAkJCS1xbGFuZ2x2bD1hbnNpCisjIFVsdHJpeCBhbmQgT1NGLzEJLXN0ZDEKKyMgSFAtVVgJCQktQWEgLURfSFBVWF9TT1VSQ0UKKyMgU1ZSNAkJCS1YYyAtRF9fRVhURU5TSU9OU19fCitmb3IgYWNfYXJnIGluICIiIC1xbGFuZ2x2bD1hbnNpIC1zdGQxICItQWEgLURfSFBVWF9TT1VSQ0UiICItWGMgLURfX0VYVEVOU0lPTlNfXyIKK2RvCisgIENDPSIkYWNfc2F2ZV9DQyAkYWNfYXJnIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5MTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKy8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZyb20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KK3N0cnVjdCBidWYgeyBpbnQgeDsgfTsKK0ZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7CitzdGF0aWMgY2hhciAqZSAocCwgaSkKKyAgICAgY2hhciAqKnA7CisgICAgIGludCBpOworeworICByZXR1cm4gcFtpXTsKK30KK3N0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAoY2hhciAqKiwgaW50KSwgY2hhciAqKnAsIC4uLikKK3sKKyAgY2hhciAqczsKKyAgdmFfbGlzdCB2OworICB2YV9zdGFydCAodixwKTsKKyAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKKyAgdmFfZW5kICh2KTsKKyAgcmV0dXJuIHM7Cit9CitpbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKK3N0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9Oworc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307CitpbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKK2ludCBhcmdjOworY2hhciAqKmFyZ3Y7CisKK2ludCBtYWluKCkgeworCityZXR1cm4gZiAoZSwgYXJndiwgMCkgIT0gYXJndlswXSAgfHwgIGYgKGUsIGFyZ3YsIDEpICE9IGFyZ3ZbMV07CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5NDc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhbV9jdl9wcm9nX2NjX3N0ZGM9IiRhY19hcmciOyBicmVhaworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2RvbmUKK0NDPSIkYWNfc2F2ZV9DQyIKKworZmkKKworaWYgdGVzdCAteiAiJGFtX2N2X3Byb2dfY2Nfc3RkYyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIm5vbmUgbmVlZGVkIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiIkYW1fY3ZfcHJvZ19jY19zdGRjIiAxPiY2CitmaQorY2FzZSAieCRhbV9jdl9wcm9nX2NjX3N0ZGMiIGluCisgIHh8eG5vKSA7OworICAqKSBDQz0iJENDICRhbV9jdl9wcm9nX2NjX3N0ZGMiIDs7Citlc2FjCisKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gYGNkICRzcmNkaXI7cHdkYC8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworCisjIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KKyMgVGhlIGlucHV0cyBhcmU6CisjICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKKyMKKyMgVGhlIHJ1bGVzIGFyZToKKyMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCisjICAgIHNhbWUgdGltZS4KKyMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCisjIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKKyMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCisjIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCisjIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgorCisjIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCisjIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCitjYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KK05PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKKyopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KK2lmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKK2Vsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDE4OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKKworaG9zdF9hbGlhcz0kaG9zdAorY2FzZSAiJGhvc3RfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkKKyAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6CisgICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkgOzsKKyAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCitob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkaG9zdCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwMzk6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1CisKK3RhcmdldF9hbGlhcz0kdGFyZ2V0CitjYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK3RhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKK3RhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCit0YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAordGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwNTc6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKworYnVpbGRfYWxpYXM9JGJ1aWxkCitjYXNlICIkYnVpbGRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2J1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCitidWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2J1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAorYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKKwordGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgorICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCisgICAgTk9ORU5PTkVzLHgseCwgJiYKKyAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQorCisKK0FMTF9MSU5HVUFTPQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA4MjogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1CitzZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgorYWxsOgorCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCitFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCitpZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcworZWxzZQorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0bWFrZQorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgU0VUX01BS0U9CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExMTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTEzOTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTE0NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTE1MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTY5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExODcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTIwOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQoraWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKK2V4aXQgKDApOyB9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjE5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNURENfSEVBREVSUyAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyNDM6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTI0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwordHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OworLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK2NoYXIgY29uc3QgKmNvbnN0ICpjY3A7CitjaGFyICoqcDsKKy8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCitzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CitzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKKy8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KKyAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQorICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KK2NvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKK2NjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKy8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCisrK2NjcDsKK3AgPSAoY2hhcioqKSBjY3A7CitjY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKK3sgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgKnQ7CisgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7CisKKyAgKnQrKyA9IDA7Cit9Cit7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLworICBpbnQgeFtdID0gezI1LCAxN307CisgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICsrZm9vOworfQoreyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOworICBpcHRyIHAgPSAwOworICArK3A7Cit9Cit7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKKyAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OworICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Cit9Cit7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLworICBjb25zdCBpbnQgZm9vID0gMTA7Cit9CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjk3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGNvbnN0IAorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzMTg6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfY3ZfY19pbmxpbmU9bm8KK2ZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTMyNSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworfSAkYWNfa3cgZm9vKCkgeworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMzI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZG9uZQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2CitjYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCisgIGlubGluZSB8IHllcykgOzsKKyAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBpbmxpbmUgCitFT0YKKyA7OworICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQorRU9GCisgOzsKK2VzYWMKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzU4OiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMzYzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgb2ZmX3QgbG9uZworRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzOTE6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM5NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCitFT0YKKworZmkKKworIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKKyMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTQyNjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE0MzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFsbG9jYS5oPgoraW50IG1haW4oKSB7CitjaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQzODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0NTk6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTQ2NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBIQVZFX0FMTE9DQV9ICisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLworY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKK2ludCBtYWluKCkgeworY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDkyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQSAxCitFT0YKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgorICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucworICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKKyAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCisgICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgorICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgQ19BTExPQ0EgMQorRU9GCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTUyNDogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE1MjkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQord2ViZWNyYXkKKyNlbHNlCit3ZW5vdGJlY3JheQorI2VuZGlmCisKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KK2ZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNTU0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNTU5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1ODI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKK0VPRgorCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZG9uZQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTYwOTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE2MTcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorZmluZF9zdGFja19kaXJlY3Rpb24gKCkKK3sKKyAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOworICBhdXRvIGNoYXIgZHVtbXk7CisgIGlmIChhZGRyID09IDApCisgICAgeworICAgICAgYWRkciA9ICZkdW1teTsKKyAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOworfQorbWFpbiAoKQoreworICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYzNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgorRU9GCisKK2ZpCisKK2ZvciBhY19oZHIgaW4gdW5pc3RkLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjYxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTY2NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTY3MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzAwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNzA1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3Mjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3NTM6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE3NjEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisvKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KKyAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgorCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKwltbWFwIHNoYXJlZCBub3QgZml4ZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisgICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQorICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAorICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5CisgICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCisgICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKKyAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCisgICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAorICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCisKKyAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KKyAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6CisgICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKKyAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKy8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KKyNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQorIyBpZmRlZiBIQVZFX1VOSVNURF9ICisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgZW5kaWYKKworLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KKyMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKKyMgZW5kaWYKKworIyBpZmRlZiBfU0NfUEFHRVNJWkUKKyMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQorIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLworIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKKyMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQorIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgICBpZmRlZiBOQlBHCisjICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCisjICAgICBpZm5kZWYgQ0xTSVpFCisjICAgICAgZGVmaW5lIENMU0laRSAxCisjICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KKyMgICAgZWxzZSAvKiBubyBOQlBHICovCisjICAgICBpZmRlZiBOQlBDCisjICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQworIyAgICAgZWxzZSAvKiBubyBOQlBDICovCisjICAgICAgaWZkZWYgUEFHRVNJWkUKKyMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKKyMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLworIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLworIyAgICBlbmRpZiAvKiBubyBOQlBHICovCisjICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KKyMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCisKKyNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KKyNlbHNlCitjaGFyICptYWxsb2MoKTsKKyNlbmRpZgorCitpbnQKK21haW4oKQoreworCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOworCWludCBpLCBwYWdlc2l6ZTsKKwlpbnQgZmQ7CisKKwlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisKKwkvKgorCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KKwkgKi8KKwlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YSArIGkpID0gcmFuZCgpOworCXVtYXNrKDApOworCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCisJLyoKKwkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKKwkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCisJICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KKwkgKi8KKwlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgxKTsKKwlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOworCWlmICghZGF0YTIpCisJCWV4aXQoMSk7CisJZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOworCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCisJCQlleGl0KDEpOworCisJLyoKKwkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQorCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KKwkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKKwlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhMykKKwkJZXhpdCgxKTsKKwlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKKwkJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCXVubGluaygiY29uZnRlc3RtbWFwIik7CisJZXhpdCgwKTsKK30KKworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5MDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9NTUFQIDEKK0VPRgorCitmaQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAordW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTI5OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTkzNCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTkzOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAorX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5Njk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE5NzQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk5NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCisgICAgIGZvciBhY19mdW5jIGluIHN0cGNweQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjAyNjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjAzMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDU0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmaQorICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KKyAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1RQQ1BZIDEKK0VPRgorCisgICBmaQorCisgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwODg6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjA5MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bG9jYWxlLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiBMQ19NRVNTQUdFUworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgorICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQorRU9GCisKKyAgICBmaQorICBmaQorICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMTIxOiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCisgIFVTRV9OTFM9JGVuYWJsZXZhbAorZWxzZQorICBVU0VfTkxTPXllcworZmkKKworICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgorICAgIAorCisgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KKworICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEVOQUJMRV9OTFMgMQorRU9GCisKKyAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIxNDE6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKK2Vsc2UKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubworZmkKKworICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2CisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KKwlubHNfY3ZfaGVhZGVyX2xpYmd0PQorCUNBVE9CSkVYVD1OT05FCisKKwlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjE2MDogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjE2NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTcwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjE4NzogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMTkyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTk5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKwkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyMTU6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQorYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1saW50bCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMjIzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgYmluZHRleHRkb21haW4oKTsKKworaW50IG1haW4oKSB7CitiaW5kdGV4dGRvbWFpbigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIzNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjI1MDogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMjU1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI2MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0dFVFRFWFQgMQorRU9GCisKKwkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyOTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisJICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgorCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMjQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzMjkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM1MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjM3OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0MTU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjQ0NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ1NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ0FUT0JKRVhUPS5nbW8KKwkJICAgREFUQURJUk5BTUU9c2hhcmUKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ0FUT0JKRVhUPS5tbworCQkgICBEQVRBRElSTkFNRT1saWIKK2ZpCitybSAtZiBjb25mdGVzdCoKKwkJSU5TVE9CSkVYVD0ubW8KKwkgICAgICBmaQorCSAgICBmaQorCQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworCSAgICAgICAgCisgICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCisJICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcworICAgICAgICBmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KKyAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgorICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0ODc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgorICA7OworZXNhYworZmkKK01TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgoraWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTIxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRHTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgID86LyopCQkJIAorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjU1NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAKKwlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICAgICAgQ0FUT0JKRVhUPS5nbW8KKyAgICAgICAgSU5TVE9CSkVYVD0ubW8KKyAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKKwlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJworCUlOVExMSUJTPSRJTlRMREVQUworCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAorICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCisgICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgorCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgorCSAgOiA7CisJZWxzZQorCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgorCSAgWEdFVFRFWFQ9IjoiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgorICAgICAgUE9TVUI9cG8KKyAgICBlbHNlCisgICAgICBEQVRBRElSTkFNRT1zaGFyZQorICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKKyAgICBmaQorCisgICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJworICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCisgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgorICAgICAgVVNFX05MUz15ZXMKKyAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgIGZpCisKKyAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKKyAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgorICAgIGRvbmUKKworICAgICAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgCisKKyAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KKyAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KKyAgICAgICBMSU5HVUFTPQorICAgICBlbHNlCisgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjY0NzogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1CisgICAgICAgTkVXX0xJTkdVQVM9CisgICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCisgICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCisgICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKKyAgICAgICAgIGVzYWMKKyAgICAgICBkb25lCisgICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKKyAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKKyAgICAgZmkKKworICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgorICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKKyAgICAgZmkKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgorICAgZWxzZQorICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCisvKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCisgICBmaQorICAgCisKKyAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgorCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjY3NTogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjY4MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjg1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgbXNnZm9ybWF0PWxpbnV4CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorbXNnZm9ybWF0PXhvcGVuCitmaQorCisKKwkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKKyAgICAgIGZpCisgICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKKwkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAorICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCisgICAgIEdUX05PPSIjTk8jIgorICAgICBHVF9ZRVM9CisgICBlbHNlCisgICAgIEdUX05PPQorICAgICBHVF9ZRVM9IiNZRVMjIgorICAgZmkKKyAgIAorICAgCisKKyAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKKyAgIAorCisgICAgICBsPQorICAgCisKKyAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgorICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbworICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KKwkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KKwkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgorCSBlbHNlCisJICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKKwkgZmkKKyAgICAgIGVsc2UKKwkgcG9zcmNwcmVmaXg9Ii4uLyIKKyAgICAgIGZpCisgICAgICBybSAtZiBwby9QT1RGSUxFUworICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCisJIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCisgICBmaQorICAKKworCitDT05GSUdfT0JTPQorQ09ORklHX0RFUFM9CitDT05GSUdfU1JDUz0KKworY29uZmlnZGlycz0iZG9jIHRlc3RzdWl0ZSIKKworCisuICR7c3JjZGlyfS9jb25maWd1cmUuaG9zdAorCisuICR7c3JjZGlyfS9jb25maWd1cmUudGd0CisKKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNzcyOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KKyAgICBjYXNlICIkYWNfZGlyLyIgaW4KKyAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKKyAgICAqKQorICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKyAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICAgIyBieSBkZWZhdWx0LgorICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbworICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisgICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJICAgIDoKKwkgIGVsc2UKKwkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgorCSAgICBicmVhayAyCisJICBmaQorCWZpCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX0lGUyIKKworZmkKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQorICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KKyAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKKyAgZmkKK2ZpCitlY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCitpZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgorICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQorZWxzZQorICBhY190b29sX3ByZWZpeD0KK2ZpCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hcjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyODMzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCisgIGFjX2N2X3Byb2dfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQVI9IiR7YWNfdG9vbF9wcmVmaXh9YXIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX0FSIiAmJiBhY19jdl9wcm9nX0FSPSJhciIKK2ZpCitmaQorQVI9IiRhY19jdl9wcm9nX0FSIgoraWYgdGVzdCAtbiAiJEFSIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEFSIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI4NjU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI4OTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlbHNlCisgIFJBTkxJQj0iOiIKK2ZpCitmaQorCitmb3IgYWNfcHJvZyBpbiAnYmlzb24gLXknIGJ5YWNjCitkbworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjkzNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1lBQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19ZQUNDPSIkWUFDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfWUFDQz0iJGFjX3Byb2ciCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK1lBQ0M9IiRhY19jdl9wcm9nX1lBQ0MiCitpZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRZQUNDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKwordGVzdCAtbiAiJFlBQ0MiICYmIGJyZWFrCitkb25lCit0ZXN0IC1uICIkWUFDQyIgfHwgWUFDQz0ieWFjYyIKKworCitpZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KK2Vsc2UKKyAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCitzLFxcLFxcXFwsZzsgcyxcJCwkJCxnCitFT0ZfU0VECisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCisgIHJtIC1mIGNvbmZ0ZXN0c2VkCitmaQordGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCit0ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisKKyMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KK3Rlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKKworCitlY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5ODY6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTkxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBzaWduYWwKKyN1bmRlZiBzaWduYWwKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7CisjZWxzZQordm9pZCAoKnNpZ25hbCAoKSkgKCk7CisjZW5kaWYKKworaW50IG1haW4oKSB7CitpbnQgaTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDA4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpZ25hbD1pbnQKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCitFT0YKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMDI4OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDMzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDQxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMwNTggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzA3NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDk3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCitpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOworZXhpdCAoMCk7IH0KKworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgOgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKK0VPRgorCitmaQorCisKK2ZvciBhY19oZHIgaW4gY3R5cGUuaCBjdXJzZXMuaCBlbmRpYW4uaCBsaW5rLmggXAorCW1lbW9yeS5oIG9iamxpc3QuaCBwdHJhY2UuaCBzZ3R0eS5oIHN0ZGRlZi5oIHN0ZGxpYi5oIFwKKwlzdHJpbmcuaCBzeXMvcHJvY2ZzLmggc3lzL3B0cmFjZS5oIHN5cy9yZWcuaCBcCisJdGVybS5oIHRlcm1pby5oIHRlcm1pb3MuaCB1bmlzdGQuaCB3YWl0Lmggc3lzL3dhaXQuaCBcCisJd2NoYXIuaCB3Y3R5cGUuaCBhc20vZGVidWdyZWcuaCBzeXMvZGVidWdyZWcuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMxNDA6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMTQ1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTUwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzE3NzogY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0YXRfYnJva2VuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzE4MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2lmIGRlZmluZWQoU19JU0JMSykgJiYgZGVmaW5lZChTX0lGRElSKQorIyBpZiBTX0lTQkxLIChTX0lGRElSKQorWW91IGxvc2UuCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoU19JU0JMSykgJiYgZGVmaW5lZChTX0lGQ0hSKQorIyBpZiBTX0lTQkxLIChTX0lGQ0hSKQorWW91IGxvc2UuCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoU19JU0xOSykgJiYgZGVmaW5lZChTX0lGUkVHKQorIyBpZiBTX0lTTE5LIChTX0lGUkVHKQorWW91IGxvc2UuCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoU19JU1NPQ0spICYmIGRlZmluZWQoU19JRlJFRykKKyMgaWYgU19JU1NPQ0sgKFNfSUZSRUcpCitZb3UgbG9zZS4KKyMgZW5kaWYKKyNlbmRpZgorCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIllvdSBsb3NlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RhdF9icm9rZW49eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0YXRfYnJva2VuPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0YXRfYnJva2VuIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RhdF9icm9rZW4gPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNUQVRfTUFDUk9TX0JST0tFTiAxCitFT0YKKworZmkKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzIzNDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMjM5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKy8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCit0eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7CisvKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLworY2hhciBjb25zdCAqY29uc3QgKmNjcDsKK2NoYXIgKipwOworLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3N0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKK3N0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OworLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgorICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCisgICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLworY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOworY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOworLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KKysrY2NwOworcCA9IChjaGFyKiopIGNjcDsKK2NjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOworeyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgY2hhciAqdDsKKyAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKKworICAqdCsrID0gMDsKK30KK3sgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCisgIGludCB4W10gPSB7MjUsIDE3fTsKKyAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKKyAgKytmb287Cit9Cit7IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KKyAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7CisgIGlwdHIgcCA9IDA7CisgICsrcDsKK30KK3sgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZworICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCisgIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07CisgIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKK30KK3sgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCisgIGNvbnN0IGludCBmb28gPSAxMDsKK30KKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyODg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgY29uc3QgCitFT0YKKworZmkKKworCitmb3IgYWNfZnVuYyBpbiBzZXRwZ2lkIHNicmsgc2lnYWN0aW9uIGlzYXNjaWkgYnplcm8gYmNvcHkgYnRvd2MKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMzMTI6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMzMTcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM0MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKKyMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzM2NzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMzNzIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFsbG9jYS5oPgoraW50IG1haW4oKSB7CitjaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM3OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM0MDA6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzQwNSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBIQVZFX0FMTE9DQV9ICisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLworY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKK2ludCBtYWluKCkgeworY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDMzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQSAxCitFT0YKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgorICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucworICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKKyAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCisgICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgorICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgQ19BTExPQ0EgMQorRU9GCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzQ2NTogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM0NzAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQord2ViZWNyYXkKKyNlbHNlCit3ZW5vdGJlY3JheQorI2VuZGlmCisKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KK2ZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNDk1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNTAwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1MjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKK0VPRgorCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZG9uZQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzU1MDogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM1NTggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorZmluZF9zdGFja19kaXJlY3Rpb24gKCkKK3sKKyAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOworICBhdXRvIGNoYXIgZHVtbXk7CisgIGlmIChhZGRyID09IDApCisgICAgeworICAgICAgYWRkciA9ICZkdW1teTsKKyAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOworfQorbWFpbiAoKQoreworICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU3NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgorRU9GCisKK2ZpCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBtYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzYwMDogY2hlY2tpbmcgd2hldGhlciBtYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM2MDUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKK2ludCBtYWluKCkgeworY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgbWFsbG9jCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzYyNjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9tYWxsb2M9bm8KK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYz15ZXMKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYyIgMT4mNgoraWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MgMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgcmVhbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNjQ3OiBjaGVja2luZyB3aGV0aGVyIHJlYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNjUyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCitpbnQgbWFpbigpIHsKK2NoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHJlYWxsb2MKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjczOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2M9bm8KK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2M9eWVzCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9yZWFsbG9jIiAxPiY2CitpZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9SRUFMTE9DIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzY5NDogY2hlY2tpbmcgd2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9mcmVlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzY5OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgoraW50IG1haW4oKSB7CitjaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBmcmVlCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzcyMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlPW5vCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlPXllcworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZSIgMT4mNgoraWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRlJFRSAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdHJlcnJvciBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNzQxOiBjaGVja2luZyB3aGV0aGVyIHN0cmVycm9yIG11c3QgYmUgZGVjbGFyZWQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9zdHJlcnJvcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM3NDYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKK2ludCBtYWluKCkgeworY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc3RyZXJyb3IKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzY3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cmVycm9yPW5vCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJlcnJvcj15ZXMKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3N0cmVycm9yIiAxPiY2CitpZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfc3RyZXJyb3IgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU1RSRVJST1IgMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3RyZHVwIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM3ODg6IGNoZWNraW5nIHdoZXRoZXIgc3RyZHVwIG11c3QgYmUgZGVjbGFyZWQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9zdHJkdXAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNzkzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCitpbnQgbWFpbigpIHsKK2NoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHN0cmR1cAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4MTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3RyZHVwPW5vCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9kZWNsX25lZWRlZF9zdHJkdXA9eWVzCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJkdXAiIDE+JjYKK2lmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zdHJkdXAgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU1RSRFVQIDEKK0VPRgorCitmaQorCisKKworIyBUaGUgZm9sbG93aW5nIHNhdmVfc3RhdGVfdCBjaGVja2VyeSBpcyBvbmx5IG5lY2Vzc2FyeSBmb3IgSFBVWCAKKyMgdmVyc2lvbnMgZWFybGllciB0aGFuIDEwLjIwLiAgV2hlbiB0aG9zZSBmYWRlIGZyb20gbWVtb3J5LCB0aGlzIAorIyBjb3VsZCBiZSBleHB1bmdlZC4gLS1qc20gMTk5OS0wMy0yMgorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgSFBVWCBzYXZlX3N0YXRlIHN0cnVjdHVyZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mzg0MTogY2hlY2tpbmcgZm9yIEhQVVggc2F2ZV9zdGF0ZSBzdHJ1Y3R1cmUiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzg0MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bWFjaGluZS9zYXZlX3N0YXRlLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgInNhdmVfc3RhdGVfdCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ2RiX2N2X2hwdXhfc2F2ZXN0YXRlPXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGdkYl9jdl9ocHV4X3NhdmVzdGF0ZT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzODU4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxtYWNoaW5lL3NhdmVfc3RhdGUuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAic3Nfd2lkZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ2RiX2N2X2hwdXhfc3N3aWRlPXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGdkYl9jdl9ocHV4X3Nzd2lkZT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitpZiB0ZXN0ICRnZGJfY3ZfaHB1eF9zYXZlc3RhdGUgPSB5ZXMKK3RoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1RSVUNUX1NBVkVfU1RBVEVfVCAxCitFT0YKKworZmkKK2lmIHRlc3QgJGdkYl9jdl9ocHV4X3Nzd2lkZSA9IHllcwordGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TVFJVQ1RfTUVNQkVSX1NTX1dJREUgMQorRU9GCisKK2ZpCitlY2hvICIkYWNfdCIiJGdkYl9jdl9ocHV4X3Nzd2lkZSIgMT4mNgorCisKKyMgSWYgd2UgYXJlIGNvbmZpZ3VyZWQgbmF0aXZlIG9uIEdOVS9MaW51eCwgd29yayBhcm91bmQgcHJvYmxlbXMgd2l0aAorIyBzeXMvcHJvY2ZzLmgKKyMgQWxzbyBkZXRlY3Qgd2hpY2ggdHlwZSBvZiAvcHJvYyBpcyBpbiB1c2UsIHN1Y2ggYXMgZm9yIFVuaXh3YXJlLgorCitpZiB0ZXN0ICIke3RhcmdldH0iID0gIiR7aG9zdH0iOyB0aGVuCisgIGNhc2UgIiR7aG9zdH0iIGluCisgIGlbMzQ1Nl04Ni0qLWxpbnV4KikKKwljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgU1RBUlRfSU5GRVJJT1JfVFJBUFNfRVhQRUNURUQgMgorRU9GCisKKwljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgc3lzX3F1b3RhY3RsIDEKK0VPRgorCisJOzsKKyAgZXNhYworICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZGlyZWN0b3J5IHByb2MgZW50cmllcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzkwNzogY2hlY2tpbmcgZm9yIGRpcmVjdG9yeSBwcm9jIGVudHJpZXMiID4mNQorIyBUaGUgW2dkYl9ob3N0ICE9IHN1bjRzb2wyXSBoYWNrIGlzIGJlY2F1c2UgU29sYXJpcyBkb2VzIHByb3ZpZGUgdGhlCisjIG11bHRpcGxlIHByb2NmcyBmaWxlcyBhcyBvZiBTb2xhcmlzIDIuNiwgYnV0IEdEQiBjYW4ndCB1c2UgaXQgcmlnaHQgbm93LgorICBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19wcm9jZnNfaCIgPSB5ZXMgLWEgIiRnZGJfaG9zdCIgIT0gc3VuNHNvbDIgXAorICAtYSAtZCAvcHJvYy8kJCBcCisgIC1hIC1mIC9wcm9jLyQkL2N0bCBcCisgIC1hIC1mIC9wcm9jLyQkL2FzIFwKKyAgLWEgLWYgL3Byb2MvJCQvbWFwIFwKKyAgLWEgLWYgL3Byb2MvJCQvc3RhdHVzOyB0aGVuCisgICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX01VTFRJUExFX1BST0NfRkRTIDEKK0VPRgorCisgIGVsc2UKKyAgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgZmkKK2ZpCisKK2lmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX3Byb2Nmc19oIiA9IHllczsgdGhlbgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzkyODogY2hlY2tpbmcgZm9yIHBzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQorIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzkzMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgoraW50IG1haW4oKSB7Citwc3RhdHVzX3QgYXZhcgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5NDA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190PW5vCisgICAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKKyBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190ID0geWVzOyB0aGVuCisgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9QU1RBVFVTX1QgMQorRU9GCisKKyBmaQorIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzdGF0dXNfdCIgMT4mNgorCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwcnJ1bl90IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mzk2MjogY2hlY2tpbmcgZm9yIHBycnVuX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKKyBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycnVuX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzOTY3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+CitpbnQgbWFpbigpIHsKK3BycnVuX3QgYXZhcgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5NzQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJydW5fdD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycnVuX3Q9bm8KKyAgIAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnJ1bl90ID0geWVzOyB0aGVuCisgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9QUlJVTl9UIDEKK0VPRgorCisgZmkKKyBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnJ1bl90IiAxPiY2CisKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdyZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM5OTY6IGNoZWNraW5nIGZvciBncmVnc2V0X3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKKyBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2dyZWdzZXRfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQwMDEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KK2ludCBtYWluKCkgeworZ3JlZ3NldF90IGF2YXIKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDA4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2dyZWdzZXRfdD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2dyZWdzZXRfdD1ubworICAgCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCisgaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2dyZWdzZXRfdCA9IHllczsgdGhlbgorICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfR1JFR1NFVF9UIDEKK0VPRgorCisgZmkKKyBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9ncmVnc2V0X3QiIDE+JjYKKworICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZnByZWdzZXRfdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQwMzA6IGNoZWNraW5nIGZvciBmcHJlZ3NldF90IGluIHN5cy9wcm9jZnMuaCIgPiY1CisgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9mcHJlZ3NldF90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDAzNSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgoraW50IG1haW4oKSB7CitmcHJlZ3NldF90IGF2YXIKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDQyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2ZwcmVnc2V0X3Q9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9mcHJlZ3NldF90PW5vCisgICAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKKyBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfZnByZWdzZXRfdCA9IHllczsgdGhlbgorICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfRlBSRUdTRVRfVCAxCitFT0YKKworIGZpCisgZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfZnByZWdzZXRfdCIgMT4mNgorCisKKyAgCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQSU9DU0VUIGlvY3RsIGVudHJ5IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDA2NjogY2hlY2tpbmcgZm9yIFBJT0NTRVQgaW9jdGwgZW50cnkgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKKyAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9oYXZlX3Byb2Nmc19waW9jc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDA3MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgorCitpbnQgbWFpbigpIHsKKworICAgIGludCBkdW1teTs7CisgICAgZHVtbXkgPSBpb2N0bCgwLCBQSU9DU0VULCAmZHVtbXkpOworICAKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MDg0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ2RiX2N2X2hhdmVfcHJvY2ZzX3Bpb2NzZXQ9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGdkYl9jdl9oYXZlX3Byb2Nmc19waW9jc2V0PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCisgIGVjaG8gIiRhY190IiIkZ2RiX2N2X2hhdmVfcHJvY2ZzX3Bpb2NzZXQiIDE+JjYKKyAgaWYgdGVzdCAkZ2RiX2N2X2hhdmVfcHJvY2ZzX3Bpb2NzZXQgPSB5ZXM7IHRoZW4KKyAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9QUk9DRlNfUElPQ1NFVCAxCitFT0YKKworICBmaQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1haW4gaW4gLWxtIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MTA2OiBjaGVja2luZyBmb3IgbWFpbiBpbiAtbG0iID4mNQorYWNfbGliX3Zhcj1gZWNobyBtJ18nbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxtICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQxMTQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK21haW4oKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxMjE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbSB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9saWIgMQorRU9GCisKKyAgTElCUz0iLWxtICRMSUJTIgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd2N0eXBlIGluIC1sYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDE1MDogY2hlY2tpbmcgZm9yIHdjdHlwZSBpbiAtbGMiID4mNQorYWNfbGliX3Zhcj1gZWNobyBjJ18nd2N0eXBlIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbGMgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDE1OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIHdjdHlwZSgpOworCitpbnQgbWFpbigpIHsKK3djdHlwZSgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDE2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgOiAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd2N0eXBlIGluIC1sdyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDE4ODogY2hlY2tpbmcgZm9yIHdjdHlwZSBpbiAtbHciID4mNQorYWNfbGliX3Zhcj1gZWNobyB3J18nd2N0eXBlIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbHcgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDE5NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIHdjdHlwZSgpOworCitpbnQgbWFpbigpIHsKK3djdHlwZSgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDIwNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyB3IHwgc2VkIC1lICdzL15hLXpBLVowLTlfL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9saWIgMQorRU9GCisKKyAgTElCUz0iLWx3ICRMSUJTIgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZmkKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsb25nIGxvbmcgc3VwcG9ydCBpbiBjb21waWxlciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDIzOTogY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyBzdXBwb3J0IGluIGNvbXBpbGVyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnZGJfY3ZfY19sb25nX2xvbmcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0MjQ0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKyAgZXh0ZXJuIGxvbmcgbG9uZyBmb287CisgIHN3aXRjaCAoZm9vICYgMikgeyBjYXNlIDA6IHJldHVybiAxOyB9CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MjU0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ2RiX2N2X2NfbG9uZ19sb25nPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBnZGJfY3ZfY19sb25nX2xvbmc9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ2RiX2N2X2NfbG9uZ19sb25nIiAxPiY2CitpZiB0ZXN0ICRnZGJfY3ZfY19sb25nX2xvbmcgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIENDX0hBU19MT05HX0xPTkcgMQorRU9GCisKK2ZpCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyBzdXBwb3J0IGluIHByaW50ZiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDI3NjogY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyBzdXBwb3J0IGluIHByaW50ZiIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19sb25nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19sb25nPW5vCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQyODQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbiAoKSB7CisgIGNoYXIgYnVmWzMyXTsKKyAgbG9uZyBsb25nIGwgPSAwOworICBsID0gKGwgPDwgMTYpICsgMHgwMTIzOworICBsID0gKGwgPDwgMTYpICsgMHg0NTY3OworICBsID0gKGwgPDwgMTYpICsgMHg4OWFiOworICBsID0gKGwgPDwgMTYpICsgMHhjZGVmOworICBzcHJpbnRmIChidWYsICIweCUwMTZsbHgiLCBsKTsKKyAgcmV0dXJuIChzdHJjbXAgKCIweDAxMjM0NTY3ODlhYmNkZWYiLCBidWYpKTsKK30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Mjk4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGdkYl9jdl9wcmludGZfaGFzX2xvbmdfbG9uZz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19sb25nPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworaWYgdGVzdCAkZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19sb25nID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBQUklOVEZfSEFTX0xPTkdfTE9ORyAxCitFT0YKKworZmkKK2VjaG8gIiRhY190IiIkZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19sb25nIiAxPiY2CisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQgaW4gY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQzMjI6IGNoZWNraW5nIGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIGNvbXBpbGVyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2xvbmdfZG91YmxlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDMyNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworbG9uZyBkb3VibGUgZm9vOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzMzQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2xvbmdfZG91YmxlPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2xvbmdfZG91YmxlPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfbG9uZ19kb3VibGUiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2NfbG9uZ19kb3VibGUgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTE9OR19ET1VCTEUgMQorRU9GCisKK2ZpCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQgaW4gcHJpbnRmIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MzU2OiBjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgc3VwcG9ydCBpbiBwcmludGYiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9wcmludGZfaGFzX2xvbmdfZG91YmxlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19kb3VibGU9bm8KK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDM2NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluICgpIHsKKyAgY2hhciBidWZbMTZdOworICBsb25nIGRvdWJsZSBmID0gMy4xNDE1OTI2NTM7CisgIHNwcmludGYgKGJ1ZiwgIiVMZyIsIGYpOworICByZXR1cm4gKHN0cm5jbXAgKCIzLjE0MTU5IiwgYnVmLCA3KSk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM3NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2RvdWJsZT15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19kb3VibGU9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitpZiB0ZXN0ICRnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2RvdWJsZSA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgUFJJTlRGX0hBU19MT05HX0RPVUJMRSAxCitFT0YKKworZmkKK2VjaG8gIiRhY190IiIkZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19kb3VibGUiIDE+JjYKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgbG9uZyBkb3VibGUgc3VwcG9ydCBpbiBzY2FuZiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDM5ODogY2hlY2tpbmcgZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQgaW4gc2NhbmYiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dkYl9jdl9zY2FuZl9oYXNfbG9uZ19kb3VibGUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBnZGJfY3Zfc2NhbmZfaGFzX2xvbmdfZG91YmxlPW5vCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ0MDYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbiAoKSB7CisgIGNoYXIgKmJ1ZiA9ICIzLjE0MTU5MjY1MyI7CisgIGxvbmcgZG91YmxlIGYgPSAwOworICBzc2NhbmYgKGJ1ZiwgIiVMZyIsICZmKTsKKyAgcmV0dXJuICEoZiA+IDMuMTQxNTkgJiYgZiA8IDMuMTQxNjApOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0MTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgZ2RiX2N2X3NjYW5mX2hhc19sb25nX2RvdWJsZT15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgZ2RiX2N2X3NjYW5mX2hhc19sb25nX2RvdWJsZT1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2lmIHRlc3QgJGdkYl9jdl9zY2FuZl9oYXNfbG9uZ19kb3VibGUgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNDQU5GX0hBU19MT05HX0RPVUJMRSAxCitFT0YKKworZmkKK2VjaG8gIiRhY190IiIkZ2RiX2N2X3NjYW5mX2hhc19sb25nX2RvdWJsZSIgMT4mNgorCitmb3IgYWNfaGRyIGluIHVuaXN0ZC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDQ0MjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ0NDcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0NTI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDQ4MTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDQ4NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTA5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NTM0OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0NTQyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCisgICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKKwltbWFwIHByaXZhdGUgbm90IGZpeGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisJbW1hcCBzaGFyZWQgbm90IGZpeGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKKyAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKKyAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQorICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQorICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCisgICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQorICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKKyAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgorCisgICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCisgICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgorICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCisgICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisvKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCisjaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKyMgaWZkZWYgSEFWRV9VTklTVERfSAorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGVuZGlmCisKKy8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCisjIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisjIGVuZGlmCisKKyMgaWZkZWYgX1NDX1BBR0VTSVpFCisjICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKKyMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKyMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCisjICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKKyMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgICAgaWZkZWYgTkJQRworIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQorIyAgICAgaWZuZGVmIENMU0laRQorIyAgICAgIGRlZmluZSBDTFNJWkUgMQorIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCisjICAgIGVsc2UgLyogbm8gTkJQRyAqLworIyAgICAgaWZkZWYgTkJQQworIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKKyMgICAgIGVsc2UgLyogbm8gTkJQQyAqLworIyAgICAgIGlmZGVmIFBBR0VTSVpFCisjICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCisjICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KKyMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KKyMgICAgZW5kaWYgLyogbm8gTkJQRyAqLworIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCisjICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLworCisjZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9CisjZWxzZQorY2hhciAqbWFsbG9jKCk7CisjZW5kaWYKKworaW50CittYWluKCkKK3sKKwljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKKwlpbnQgaSwgcGFnZXNpemU7CisJaW50IGZkOworCisJcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOworCisJLyoKKwkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCisJICovCisJZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKKwl1bWFzaygwKTsKKwlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKworCS8qCisJICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCisJICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAorCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCisJICovCisJZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEyKQorCQlleGl0KDEpOworCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKKwlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQorCQkJZXhpdCgxKTsKKworCS8qCisJICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKKwkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCisJICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCisJICovCisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7CisJZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YTMpCisJCWV4aXQoMSk7CisJaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCisJCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOworCWV4aXQoMCk7Cit9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjgyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTU1BUCAxCitFT0YKKworZmkKKworCisKKworaWYgdGVzdCAke2J1aWxkfSA9ICR7aG9zdH0gLWEgJHtob3N0fSA9ICR7dGFyZ2V0fSA7IHRoZW4KKyAgIGNhc2UgJHtob3N0X29zfSBpbgorICAgaHB1eCopCisgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgSFBVWC9PU0YgdGhyZWFkIHN1cHBvcnQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ3MTE6IGNoZWNraW5nIGZvciBIUFVYL09TRiB0aHJlYWQgc3VwcG9ydCIgPiY1CisgICAgICBpZiB0ZXN0IC1mIC91c3IvaW5jbHVkZS9kY2UvY21hX2NvbmZpZy5oIDsgdGhlbgorICAgICAgICAgaWYgdGVzdCAiJEdDQyIgPSAieWVzIiA7IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICAgICAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0hQVVhfVEhSRUFEX1NVUFBPUlQgMQorRU9GCisKKyAgICAgICAgICAgIENPTkZJR19PQlM9IiR7Q09ORklHX09KU30gaHB1eC10aHJlYWQubyIKKyAgICAgICAgICAgIENPTkZJR19TUkNTPSIke0NPTkZJR19TUkNTfSBocHV4LXRocmVhZC5jIgorICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiJGFjX3QiIm5vIChzdXBwcmVzc2VkIGJlY2F1c2UgeW91IGFyZSBub3QgdXNpbmcgR0NDKSIgMT4mNgorICAgICAgICAgZmkKKyAgICAgIGVsc2UKKyAgICAgICAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICAgICAgZmkKKyAgICAgIDs7CisgICBzb2xhcmlzKikKKyAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBTb2xhcmlzIHRocmVhZCBkZWJ1Z2dpbmcgbGlicmFyeSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDczMDogY2hlY2tpbmcgZm9yIFNvbGFyaXMgdGhyZWFkIGRlYnVnZ2luZyBsaWJyYXJ5IiA+JjUKKyAgICAgIGlmIHRlc3QgLWYgL3Vzci9saWIvbGlidGhyZWFkX2RiLnNvLjEgOyB0aGVuCisgICAgICAgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9USFJFQURfREJfTElCIDEKK0VPRgorCisgICAgICAgICBDT05GSUdfT0JTPSIke0NPTkZJR19PQlN9IHNvbC10aHJlYWQubyIKKyAgICAgICAgIENPTkZJR19TUkNTPSIke0NPTkZJR19TUkNTfSBzb2wtdGhyZWFkLmMiCisgICAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ3NDA6IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1CithY19saWJfdmFyPWBlY2hvIGRsJ18nZGxvcGVuIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbGRsICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ3NDggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBkbG9wZW4oKTsKKworaW50IG1haW4oKSB7CitkbG9wZW4oKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3NTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gZGwgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKKyAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfbGliIDEKK0VPRgorCisgIExJQlM9Ii1sZGwgJExJQlMiCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICBpZiB0ZXN0ICIkR0NDIiA9ICJ5ZXMiIDsgdGhlbgorICAgICAgICAgICAgIyBUaGUgR05VIGxpbmtlciByZXF1aXJlcyB0aGUgLWV4cG9ydC1keW5hbWljIG9wdGlvbiB0byBtYWtlCisgICAgICAgICAgICAjIGFsbCBzeW1ib2xzIHZpc2libGUgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgorICAgICAgICAgICAgaG9sZF9sZGZsYWdzPSRMREZMQUdTCisgICAgICAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdGhlIGxkIC1leHBvcnQtZHluYW1pYyBmbGFnIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NzkxOiBjaGVja2luZyBmb3IgdGhlIGxkIC1leHBvcnQtZHluYW1pYyBmbGFnIiA+JjUKKyAgICAgICAgICAgIExERkxBR1M9IiR7TERGTEFHU30gLVdsLC1leHBvcnQtZHluYW1pYyIKKyAgICAgICAgICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ3OTQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK2ludCBpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ4MDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGZvdW5kPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBmb3VuZD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICAgICAgICAgICAgTERGTEFHUz0kaG9sZF9sZGZsYWdzCisgICAgICAgICAgICBlY2hvICIkYWNfdCIiJGZvdW5kIiAxPiY2CisgICAgICAgICAgICBpZiB0ZXN0ICRmb3VuZCA9IHllczsgdGhlbgorICAgICAgICAgICAgICAgQ09ORklHX0xERkxBR1M9IiR7Q09ORklHX0xERkxBR1N9IC1XbCwtZXhwb3J0LWR5bmFtaWMiCisgICAgICAgICAgICBmaQorICAgICAgICAgZmkKKwkgIyBTdW4gcmFuZG9tbHkgdHdlYWtlZCB0aGUgcHJvdG90eXBlcyBpbiA8cHJvY19zZXJ2aWNlLmg+CisJICMgYXQgb25lIHBvaW50LgorCSBlY2hvICRhY19uICJjaGVja2luZyBpZiA8cHJvY19zZXJ2aWNlLmg+IGlzIG9sZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDgyMDogY2hlY2tpbmcgaWYgPHByb2Nfc2VydmljZS5oPiBpcyBvbGQiID4mNQorCSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2RiX2N2X3Byb2Nfc2VydmljZV9pc19vbGQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAKKwkgICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDgyNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKwkJI2luY2x1ZGUgPHByb2Nfc2VydmljZS5oPgorCQlwc19lcnJfZSBwc19wZHdyaXRlCisJCSAgICAoc3RydWN0IHBzX3Byb2NoYW5kbGUqLCBwc2FkZHJfdCwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisJICAgIAoraW50IG1haW4oKSB7CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODM3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ2RiX2N2X3Byb2Nfc2VydmljZV9pc19vbGQ9bm8KK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ2RiX2N2X3Byb2Nfc2VydmljZV9pc19vbGQ9eWVzCitmaQorcm0gLWYgY29uZnRlc3QqCisJIAorZmkKKworCSBlY2hvICIkYWNfdCIiJGdkYl9jdl9wcm9jX3NlcnZpY2VfaXNfb2xkIiAxPiY2CisJIGlmIHRlc3QgJGdkYl9jdl9wcm9jX3NlcnZpY2VfaXNfb2xkID0geWVzOyB0aGVuCisJICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBQUk9DX1NFUlZJQ0VfSVNfT0xEIDEKK0VPRgorCisJIGZpCisgICAgICBlbHNlCisgICAgICAgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgICAgIGZpCisgICAgICA7OworICAgZXNhYworICAgCitmaQorCitFTkFCTEVfQ0ZMQUdTPQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdHVpIG9yIC0tZGlzYWJsZS10dWkgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfdHVpK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV90dWkiCisgIAorICBjYXNlICIke2VuYWJsZV90dWl9IiBpbgorICAgIHllcyB8IG5vKSA7OworICAgICIiKSAgZW5hYmxlX3R1aT15ZXMgOzsKKyAgICAqKQorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBCYWQgdmFsdWUgZm9yIC0tZW5hYmxlLXR1aTogJHtlbmFibGV2YWx9IiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworICBlc2FjCisKK2ZpCisKK2Nhc2UgJHtlbmFibGVfdHVpfSBpbgorICAieWVzIiApCisgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFRVSSAxCitFT0YKKworICAgIEJVSUxEX1RVST1hbGwtdHVpCisgICAgVFVJX0xJQlJBUlk9dHVpL2xpYnR1aS5hCisgIDs7CisgICogKQorICAgIEJVSUxEX1RVST0KKyAgICBUVUlfTElCUkFSWT0KKyAgOzsKK2VzYWMKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1uZXRyb20gb3IgLS1kaXNhYmxlLW5ldHJvbSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9uZXRyb20rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX25ldHJvbSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgoreWVzKQllbmFibGVfbmV0cm9tPXllcyA7Oworbm8pCWVuYWJsZV9uZXRyb209bm8gOzsKKyopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBnaXZlbiBmb3IgbmV0cm9tIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCitmaQorCisKK2lmIHRlc3QgIiR7ZW5hYmxlX25ldHJvbX0iID0gInllcyI7IHRoZW4KKwlDT05GSUdfT0JTPSIke0NPTkZJR19PQlN9IHJlbW90ZS1ucm9tLm8iIAorICAgICAgICBDT05GSUdfU1JDUz0iJHtDT05GSUdfU1JDU30gcmVtb3RlLW5yb20uYyIKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1idWlsZC13YXJuaW5ncyBvciAtLWRpc2FibGUtYnVpbGQtd2FybmluZ3Mgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfYnVpbGRfd2FybmluZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2J1aWxkX3dhcm5pbmdzIgorICBidWlsZF93YXJuaW5ncz0iLVdhbGwgLVdwb2ludGVyLWFyaXRoIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyIKK2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQk7OworICBubykJYnVpbGRfd2FybmluZ3M9Ii13Ijs7CisgICwqKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAorICAgICAgICBidWlsZF93YXJuaW5ncz0iJHtidWlsZF93YXJuaW5nc30gJHt0fSI7OworICAqLCkgICB0PWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImAKKyAgICAgICAgYnVpbGRfd2FybmluZ3M9IiR7dH0gJHtidWlsZF93YXJuaW5nc30iOzsKKyAgKikgICAgYnVpbGRfd2FybmluZ3M9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYDs7Citlc2FjCitlbHNlCisgIGJ1aWxkX3dhcm5pbmdzPSIiCitmaQorCitpZiB0ZXN0ICJ4JHtidWlsZF93YXJuaW5nc30iICE9IHggLWEgIngkR0NDIiA9IHh5ZXMKK3RoZW4KKyAgIFdBUk5fQ0ZMQUdTPSIke2J1aWxkX3dhcm5pbmdzfSIKK2Vsc2UKKyAgIFdBUk5fQ0ZMQUdTPSIiCitmaQorCisKK01NQUxMT0NfQ0ZMQUdTPQorTU1BTExPQz0KKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbW1hbGxvYyBvciAtLXdpdGhvdXQtbW1hbGxvYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfbW1hbGxvYytzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9tbWFsbG9jIgorICBjYXNlICIke3dpdGh2YWx9IiBpbgorICB5ZXMpICB3YW50X21tYWxsb2M9dHJ1ZSA7OworICBubykgICB3YW50X21tYWxsb2M9ZmFsc2U7OworICAqKSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciBHREIgd2l0aC1tbWFsbG9jIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCitlbHNlCisgIHdhbnRfbW1hbGxvYz1mYWxzZQorZmkKKworaWYgdGVzdCB4JHdhbnRfbW1hbGxvYyA9IHh0cnVlOyB0aGVuCisgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgVVNFX01NQUxMT0MgMQorRU9GCisKKyAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBNTUNIRUNLX0ZPUkNFIDEKK0VPRgorCisgICBNTUFMTE9DX0NGTEFHUz0iLUkkc3JjZGlyLy4uL21tYWxsb2MiCisgICBNTUFMTE9DPScuLi9tbWFsbG9jL2xpYm1tYWxsb2MuYScKK2ZpCisKK2lmIHRlc3QgeCRnZGJfY3Zfb3NfY3lnd2luID0geHllczsgdGhlbgorICBURVJNX0xJQj0nYGlmIHRlc3QgLXIgLi4vbGlidGVybWNhcC9saWJ0ZXJtY2FwLmE7IHRoZW4gZWNobyAuLi9saWJ0ZXJtY2FwL2xpYnRlcm1jYXAuYTsgZWxzZSBlY2hvIC1sdGVybWNhcDsgZmlgJworZWxzZQorICBURVJNX0xJQj0KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxuY3Vyc2VzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0OTc0OiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbG5jdXJzZXMiID4mNQorYWNfbGliX3Zhcj1gZWNobyBuY3Vyc2VzJ18ndGdldGVudCB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxuY3Vyc2VzICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ5ODIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciB0Z2V0ZW50KCk7CisKK2ludCBtYWluKCkgewordGdldGVudCgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDk5MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgVEVSTV9MSUI9LWxuY3Vyc2VzCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxIY3Vyc2VzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1MDEyOiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbEhjdXJzZXMiID4mNQorYWNfbGliX3Zhcj1gZWNobyBIY3Vyc2VzJ18ndGdldGVudCB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxIY3Vyc2VzICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDUwMjAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciB0Z2V0ZW50KCk7CisKK2ludCBtYWluKCkgewordGdldGVudCgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTAzMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgVEVSTV9MSUI9LWxIY3Vyc2VzCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWx0ZXJtbGliIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1MDUwOiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1saWIiID4mNQorYWNfbGliX3Zhcj1gZWNobyB0ZXJtbGliJ18ndGdldGVudCB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWx0ZXJtbGliICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDUwNTggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciB0Z2V0ZW50KCk7CisKK2ludCBtYWluKCkgewordGdldGVudCgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgVEVSTV9MSUI9LWx0ZXJtbGliCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWx0ZXJtY2FwIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1MDg4OiBjaGVja2luZyBmb3IgdGdldGVudCBpbiAtbHRlcm1jYXAiID4mNQorYWNfbGliX3Zhcj1gZWNobyB0ZXJtY2FwJ18ndGdldGVudCB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWx0ZXJtY2FwICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDUwOTYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciB0Z2V0ZW50KCk7CisKK2ludCBtYWluKCkgewordGdldGVudCgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTEwNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgVEVSTV9MSUI9LWx0ZXJtY2FwCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRnZXRlbnQgaW4gLWxjdXJzZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjUxMjY6IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sY3Vyc2VzIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gY3Vyc2VzJ18ndGdldGVudCB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxjdXJzZXMgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTEzNCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIHRnZXRlbnQoKTsKKworaW50IG1haW4oKSB7Cit0Z2V0ZW50KCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MTQ1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBURVJNX0xJQj0tbGN1cnNlcworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sdGVybWluZm8iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjUxNjQ6IGNoZWNraW5nIGZvciB0Z2V0ZW50IGluIC1sdGVybWluZm8iID4mNQorYWNfbGliX3Zhcj1gZWNobyB0ZXJtaW5mbydfJ3RnZXRlbnQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sdGVybWluZm8gICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTE3MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIHRnZXRlbnQoKTsKKworaW50IG1haW4oKSB7Cit0Z2V0ZW50KCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MTgzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBURVJNX0xJQj0tbHRlcm1pbmZvCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZmkKKworZmkKKworZmkKKworZmkKKworZmkKKworCisgIGlmIHRlc3QgIngkVEVSTV9MSUIiID0geAorICB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBDb3VsZCBub3QgZmluZCBhIHRlcm0gbGlicmFyeSIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorCisKKworIyBJZiB3ZSBmaW5kIFgsIHNldCBzaGVsbCB2YXJzIHhfaW5jbHVkZXMgYW5kIHhfbGlicmFyaWVzIHRvIHRoZQorIyBwYXRocywgb3RoZXJ3aXNlIHNldCBub194PXllcy4KKyMgVXNlcyBhY18gdmFycyBhcyB0ZW1wcyB0byBhbGxvdyBjb21tYW5kIGxpbmUgdG8gb3ZlcnJpZGUgY2FjaGUgYW5kIGNoZWNrcy4KKyMgLS13aXRob3V0LXggb3ZlcnJpZGVzIGV2ZXJ5dGhpbmcgZWxzZSwgYnV0IGRvZXMgbm90IHRvdWNoIHRoZSBjYWNoZS4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBYIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1MjI3OiBjaGVja2luZyBmb3IgWCIgPiY1CisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgteCBvciAtLXdpdGhvdXQteCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfeCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF94IgorICA6CitmaQorCisjICRoYXZlX3ggaXMgYHllcycsIGBubycsIGBkaXNhYmxlZCcsIG9yIGVtcHR5IHdoZW4gd2UgZG8gbm90IHlldCBrbm93LgoraWYgdGVzdCAieCR3aXRoX3giID0geG5vOyB0aGVuCisgICMgVGhlIHVzZXIgZXhwbGljaXRseSBkaXNhYmxlZCBYLgorICBoYXZlX3g9ZGlzYWJsZWQKK2Vsc2UKKyAgaWYgdGVzdCAieCR4X2luY2x1ZGVzIiAhPSB4Tk9ORSAmJiB0ZXN0ICJ4JHhfbGlicmFyaWVzIiAhPSB4Tk9ORTsgdGhlbgorICAgICMgQm90aCB2YXJpYWJsZXMgYXJlIGFscmVhZHkgc2V0LgorICAgIGhhdmVfeD15ZXMKKyAgZWxzZQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hhdmVfeCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICMgT25lIG9yIGJvdGggb2YgdGhlIHZhcnMgYXJlIG5vdCBzZXQsIGFuZCB0aGVyZSBpcyBubyBjYWNoZWQgdmFsdWUuCithY194X2luY2x1ZGVzPU5PIGFjX3hfbGlicmFyaWVzPU5PCitybSAtZnIgY29uZnRlc3RkaXIKK2lmIG1rZGlyIGNvbmZ0ZXN0ZGlyOyB0aGVuCisgIGNkIGNvbmZ0ZXN0ZGlyCisgICMgTWFrZSBzdXJlIHRvIG5vdCBwdXQgIm1ha2UiIGluIHRoZSBJbWFrZWZpbGUgcnVsZXMsIHNpbmNlIHdlIGdyZXAgaXQgb3V0LgorICBjYXQgPiBJbWFrZWZpbGUgPDwnRU9GJworYWNmaW5keDoKKwlAZWNobyAnYWNfaW1faW5jcm9vdD0iJHtJTkNST09UfSI7IGFjX2ltX3VzcmxpYmRpcj0iJHtVU1JMSUJESVJ9IjsgYWNfaW1fbGliZGlyPSIke0xJQkRJUn0iJworRU9GCisgIGlmICh4bWttZikgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCAmJiB0ZXN0IC1mIE1ha2VmaWxlOyB0aGVuCisgICAgIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCisgICAgZXZhbCBgJHtNQUtFLW1ha2V9IGFjZmluZHggMj4vZGV2L251bGwgfCBncmVwIC12IG1ha2VgCisgICAgIyBPcGVuIFdpbmRvd3MgeG1rbWYgcmVwb3J0ZWRseSBzZXRzIExJQkRJUiBpbnN0ZWFkIG9mIFVTUkxJQkRJUi4KKyAgICBmb3IgYWNfZXh0ZW5zaW9uIGluIGEgc28gc2w7IGRvCisgICAgICBpZiB0ZXN0ICEgLWYgJGFjX2ltX3VzcmxpYmRpci9saWJYMTEuJGFjX2V4dGVuc2lvbiAmJgorICAgICAgICB0ZXN0IC1mICRhY19pbV9saWJkaXIvbGliWDExLiRhY19leHRlbnNpb247IHRoZW4KKyAgICAgICAgYWNfaW1fdXNybGliZGlyPSRhY19pbV9saWJkaXI7IGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgICAjIFNjcmVlbiBvdXQgYm9ndXMgdmFsdWVzIGZyb20gdGhlIGltYWtlIGNvbmZpZ3VyYXRpb24uICBUaGV5IGFyZQorICAgICMgYm9ndXMgYm90aCBiZWNhdXNlIHRoZXkgYXJlIHRoZSBkZWZhdWx0IGFueXdheSwgYW5kIGJlY2F1c2UKKyAgICAjIHVzaW5nIHRoZW0gd291bGQgYnJlYWsgZ2NjIG9uIHN5c3RlbXMgd2hlcmUgaXQgbmVlZHMgZml4ZWQgaW5jbHVkZXMuCisgICAgY2FzZSAiJGFjX2ltX2luY3Jvb3QiIGluCisJL3Vzci9pbmNsdWRlKSA7OworCSopIHRlc3QgLWYgIiRhY19pbV9pbmNyb290L1gxMS9Yb3MuaCIgJiYgYWNfeF9pbmNsdWRlcz0iJGFjX2ltX2luY3Jvb3QiIDs7CisgICAgZXNhYworICAgIGNhc2UgIiRhY19pbV91c3JsaWJkaXIiIGluCisJL3Vzci9saWIgfCAvbGliKSA7OworCSopIHRlc3QgLWQgIiRhY19pbV91c3JsaWJkaXIiICYmIGFjX3hfbGlicmFyaWVzPSIkYWNfaW1fdXNybGliZGlyIiA7OworICAgIGVzYWMKKyAgZmkKKyAgY2QgLi4KKyAgcm0gLWZyIGNvbmZ0ZXN0ZGlyCitmaQorCitpZiB0ZXN0ICIkYWNfeF9pbmNsdWRlcyIgPSBOTzsgdGhlbgorICAjIEd1ZXNzIHdoZXJlIHRvIGZpbmQgaW5jbHVkZSBmaWxlcywgYnkgbG9va2luZyBmb3IgdGhpcyBvbmUgWDExIC5oIGZpbGUuCisgIHRlc3QgLXogIiR4X2RpcmVjdF90ZXN0X2luY2x1ZGUiICYmIHhfZGlyZWN0X3Rlc3RfaW5jbHVkZT1YMTEvSW50cmluc2ljLmgKKworICAjIEZpcnN0LCB0cnkgdXNpbmcgdGhhdCBmaWxlIHdpdGggbm8gc3BlY2lhbCBkaXJlY3Rvcnkgc3BlY2lmaWVkLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTI4OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JHhfZGlyZWN0X3Rlc3RfaW5jbHVkZT4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NTI5NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgIyBXZSBjYW4gY29tcGlsZSB1c2luZyBYIGhlYWRlcnMgd2l0aCBubyBzcGVjaWFsIGluY2x1ZGUgZGlyZWN0b3J5LgorYWNfeF9pbmNsdWRlcz0KK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgICMgTG9vayBmb3IgdGhlIGhlYWRlciBmaWxlIGluIGEgc3RhbmRhcmQgc2V0IG9mIGNvbW1vbiBkaXJlY3Rvcmllcy4KKyMgQ2hlY2sgWDExIGJlZm9yZSBYMTFSbiBiZWNhdXNlIGl0IGlzIG9mdGVuIGEgc3ltbGluayB0byB0aGUgY3VycmVudCByZWxlYXNlLgorICBmb3IgYWNfZGlyIGluICAgICAgICAgICAgICAgXAorICAgIC91c3IvWDExL2luY2x1ZGUgICAgICAgICAgXAorICAgIC91c3IvWDExUjYvaW5jbHVkZSAgICAgICAgXAorICAgIC91c3IvWDExUjUvaW5jbHVkZSAgICAgICAgXAorICAgIC91c3IvWDExUjQvaW5jbHVkZSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvaW5jbHVkZS9YMTEgICAgICAgICAgXAorICAgIC91c3IvaW5jbHVkZS9YMTFSNiAgICAgICAgXAorICAgIC91c3IvaW5jbHVkZS9YMTFSNSAgICAgICAgXAorICAgIC91c3IvaW5jbHVkZS9YMTFSNCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvbG9jYWwvWDExL2luY2x1ZGUgICAgXAorICAgIC91c3IvbG9jYWwvWDExUjYvaW5jbHVkZSAgXAorICAgIC91c3IvbG9jYWwvWDExUjUvaW5jbHVkZSAgXAorICAgIC91c3IvbG9jYWwvWDExUjQvaW5jbHVkZSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvbG9jYWwvaW5jbHVkZS9YMTEgICAgXAorICAgIC91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNiAgXAorICAgIC91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNSAgXAorICAgIC91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvWDM4Ni9pbmNsdWRlICAgICAgICAgXAorICAgIC91c3IveDM4Ni9pbmNsdWRlICAgICAgICAgXAorICAgIC91c3IvWEZyZWU4Ni9pbmNsdWRlL1gxMSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvaW5jbHVkZSAgICAgICAgICAgICAgXAorICAgIC91c3IvbG9jYWwvaW5jbHVkZSAgICAgICAgXAorICAgIC91c3IvdW5zdXBwb3J0ZWQvaW5jbHVkZSAgXAorICAgIC91c3IvYXRoZW5hL2luY2x1ZGUgICAgICAgXAorICAgIC91c3IvbG9jYWwveDExcjUvaW5jbHVkZSAgXAorICAgIC91c3IvbHBwL1hhbXBsZXMvaW5jbHVkZSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3Ivb3Blbndpbi9pbmNsdWRlICAgICAgXAorICAgIC91c3Ivb3Blbndpbi9zaGFyZS9pbmNsdWRlIFwKKyAgICA7IFwKKyAgZG8KKyAgICBpZiB0ZXN0IC1yICIkYWNfZGlyLyR4X2RpcmVjdF90ZXN0X2luY2x1ZGUiOyB0aGVuCisgICAgICBhY194X2luY2x1ZGVzPSRhY19kaXIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkgIyAkYWNfeF9pbmNsdWRlcyA9IE5PCisKK2lmIHRlc3QgIiRhY194X2xpYnJhcmllcyIgPSBOTzsgdGhlbgorICAjIENoZWNrIGZvciB0aGUgbGlicmFyaWVzLgorCisgIHRlc3QgLXogIiR4X2RpcmVjdF90ZXN0X2xpYnJhcnkiICYmIHhfZGlyZWN0X3Rlc3RfbGlicmFyeT1YdAorICB0ZXN0IC16ICIkeF9kaXJlY3RfdGVzdF9mdW5jdGlvbiIgJiYgeF9kaXJlY3RfdGVzdF9mdW5jdGlvbj1YdE1hbGxvYworCisgICMgU2VlIGlmIHdlIGZpbmQgdGhlbSB3aXRob3V0IGFueSBzcGVjaWFsIG9wdGlvbnMuCisgICMgRG9uJ3QgYWRkIHRvICRMSUJTIHBlcm1hbmVudGx5LgorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorICBMSUJTPSItbCR4X2RpcmVjdF90ZXN0X2xpYnJhcnkgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA1MzYzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7Ciske3hfZGlyZWN0X3Rlc3RfZnVuY3Rpb259KCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MzcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorIyBXZSBjYW4gbGluayBYIHByb2dyYW1zIHdpdGggbm8gc3BlY2lhbCBsaWJyYXJ5IHBhdGguCithY194X2xpYnJhcmllcz0KK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyMgRmlyc3Qgc2VlIGlmIHJlcGxhY2luZyB0aGUgaW5jbHVkZSBieSBsaWIgd29ya3MuCisjIENoZWNrIFgxMSBiZWZvcmUgWDExUm4gYmVjYXVzZSBpdCBpcyBvZnRlbiBhIHN5bWxpbmsgdG8gdGhlIGN1cnJlbnQgcmVsZWFzZS4KK2ZvciBhY19kaXIgaW4gYGVjaG8gIiRhY194X2luY2x1ZGVzIiB8IHNlZCBzL2luY2x1ZGUvbGliL2AgXAorICAgIC91c3IvWDExL2xpYiAgICAgICAgICBcCisgICAgL3Vzci9YMTFSNi9saWIgICAgICAgIFwKKyAgICAvdXNyL1gxMVI1L2xpYiAgICAgICAgXAorICAgIC91c3IvWDExUjQvbGliICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvdXNyL2xpYi9YMTEgICAgICAgICAgXAorICAgIC91c3IvbGliL1gxMVI2ICAgICAgICBcCisgICAgL3Vzci9saWIvWDExUjUgICAgICAgIFwKKyAgICAvdXNyL2xpYi9YMTFSNCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgL3Vzci9sb2NhbC9YMTEvbGliICAgIFwKKyAgICAvdXNyL2xvY2FsL1gxMVI2L2xpYiAgXAorICAgIC91c3IvbG9jYWwvWDExUjUvbGliICBcCisgICAgL3Vzci9sb2NhbC9YMTFSNC9saWIgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvbG9jYWwvbGliL1gxMSAgICBcCisgICAgL3Vzci9sb2NhbC9saWIvWDExUjYgIFwKKyAgICAvdXNyL2xvY2FsL2xpYi9YMTFSNSAgXAorICAgIC91c3IvbG9jYWwvbGliL1gxMVI0ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvdXNyL1gzODYvbGliICAgICAgICAgXAorICAgIC91c3IveDM4Ni9saWIgICAgICAgICBcCisgICAgL3Vzci9YRnJlZTg2L2xpYi9YMTEgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvbGliICAgICAgICAgICAgICBcCisgICAgL3Vzci9sb2NhbC9saWIgICAgICAgIFwKKyAgICAvdXNyL3Vuc3VwcG9ydGVkL2xpYiAgXAorICAgIC91c3IvYXRoZW5hL2xpYiAgICAgICBcCisgICAgL3Vzci9sb2NhbC94MTFyNS9saWIgIFwKKyAgICAvdXNyL2xwcC9YYW1wbGVzL2xpYiAgXAorICAgIC9saWIvdXNyL2xpYi9YMTEJICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvdXNyL29wZW53aW4vbGliICAgICAgXAorICAgIC91c3Ivb3Blbndpbi9zaGFyZS9saWIgXAorICAgIDsgXAorZG8KKyAgZm9yIGFjX2V4dGVuc2lvbiBpbiBhIHNvIHNsOyBkbworICAgIGlmIHRlc3QgLXIgJGFjX2Rpci9saWIke3hfZGlyZWN0X3Rlc3RfbGlicmFyeX0uJGFjX2V4dGVuc2lvbjsgdGhlbgorICAgICAgYWNfeF9saWJyYXJpZXM9JGFjX2RpcgorICAgICAgYnJlYWsgMgorICAgIGZpCisgIGRvbmUKK2RvbmUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpICMgJGFjX3hfbGlicmFyaWVzID0gTk8KKworaWYgdGVzdCAiJGFjX3hfaW5jbHVkZXMiID0gTk8gfHwgdGVzdCAiJGFjX3hfbGlicmFyaWVzIiA9IE5POyB0aGVuCisgICMgRGlkbid0IGZpbmQgWCBhbnl3aGVyZS4gIENhY2hlIHRoZSBrbm93biBhYnNlbmNlIG9mIFguCisgIGFjX2N2X2hhdmVfeD0iaGF2ZV94PW5vIgorZWxzZQorICAjIFJlY29yZCB3aGVyZSB3ZSBmb3VuZCBYIGZvciB0aGUgY2FjaGUuCisgIGFjX2N2X2hhdmVfeD0iaGF2ZV94PXllcyBcCisJICAgICAgICBhY194X2luY2x1ZGVzPSRhY194X2luY2x1ZGVzIGFjX3hfbGlicmFyaWVzPSRhY194X2xpYnJhcmllcyIKK2ZpCitmaQorICBmaQorICBldmFsICIkYWNfY3ZfaGF2ZV94IgorZmkgIyAkd2l0aF94ICE9IG5vCisKK2lmIHRlc3QgIiRoYXZlX3giICE9IHllczsgdGhlbgorICBlY2hvICIkYWNfdCIiJGhhdmVfeCIgMT4mNgorICBub194PXllcworZWxzZQorICAjIElmIGVhY2ggb2YgdGhlIHZhbHVlcyB3YXMgb24gdGhlIGNvbW1hbmQgbGluZSwgaXQgb3ZlcnJpZGVzIGVhY2ggZ3Vlc3MuCisgIHRlc3QgIngkeF9pbmNsdWRlcyIgPSB4Tk9ORSAmJiB4X2luY2x1ZGVzPSRhY194X2luY2x1ZGVzCisgIHRlc3QgIngkeF9saWJyYXJpZXMiID0geE5PTkUgJiYgeF9saWJyYXJpZXM9JGFjX3hfbGlicmFyaWVzCisgICMgVXBkYXRlIHRoZSBjYWNoZSB2YWx1ZSB0byByZWZsZWN0IHRoZSBjb21tYW5kIGxpbmUgdmFsdWVzLgorICBhY19jdl9oYXZlX3g9ImhhdmVfeD15ZXMgXAorCQlhY194X2luY2x1ZGVzPSR4X2luY2x1ZGVzIGFjX3hfbGlicmFyaWVzPSR4X2xpYnJhcmllcyIKKyAgZWNobyAiJGFjX3QiImxpYnJhcmllcyAkeF9saWJyYXJpZXMsIGhlYWRlcnMgJHhfaW5jbHVkZXMiIDE+JjYKK2ZpCisKKworCisKKworCisKKworIyBCZWdpbiBzdHVmZiB0byBzdXBwb3J0IC0tZW5hYmxlLXNoYXJlZAorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykgc2hhcmVkPXRydWUgOzsKKyAgbm8pICBzaGFyZWQ9ZmFsc2UgOzsKKyAgKikgc2hhcmVkPXRydWUgOzsKK2VzYWMKK2ZpCisKK0hMREZMQUdTPQorSExERU5WPQorIyBJZiB3ZSBoYXZlIHNoYXJlZCBsaWJyYXJpZXMsIHRyeSB0byBzZXQgcnBhdGggcmVhc29uYWJseS4KK2lmIHRlc3QgIiR7c2hhcmVkfSIgPSAidHJ1ZSI7IHRoZW4KKyAgY2FzZSAiJHtob3N0fSIgaW4KKyAgKi0qLWhwdXgqKQorICAgIEhMREZMQUdTPSctV2wsK3MsK2IsJChsaWJkaXIpJworICAgIDs7CisgICotKi1pcml4NSogfCAqLSotaXJpeDYqKQorICAgIEhMREZMQUdTPSctV2wsLXJwYXRoLCQobGliZGlyKScKKyAgICA7OworICAqLSotbGludXgqYW91dCopCisgICAgOzsKKyAgKi0qLWxpbnV4KiB8ICotcGMtbGludXgtZ251KQorICAgIEhMREZMQUdTPSctV2wsLXJwYXRoLCQobGliZGlyKScKKyAgICA7OworICAqLSotc29sYXJpcyopCisgICAgSExERkxBR1M9Jy1SICQobGliZGlyKScKKyAgICA7OworICAqLSotc3lzdjQqKQorICAgIEhMREVOVj0naWYgdGVzdCAteiAiJCR7TERfUlVOX1BBVEh9IjsgdGhlbiBMRF9SVU5fUEFUSD0kKGxpYmRpcik7IGVsc2UgTERfUlVOX1BBVEg9JCR7TERfUlVOX1BBVEh9OiQobGliZGlyKTsgZmk7IGV4cG9ydCBMRF9SVU5fUEFUSDsnCisgICAgOzsKKyAgZXNhYworZmkKKworIyBPbiBTdW5PUywgaWYgdGhlIGxpbmtlciBzdXBwb3J0cyB0aGUgLXJwYXRoIG9wdGlvbiwgdXNlIGl0IHRvCisjIHByZXZlbnQgLi4vYmZkIGFuZCAuLi9vcGNvZGVzIGZyb20gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIHJ1biB0aW1lCisjIHNlYXJjaCBwYXRoLgorY2FzZSAiJHtob3N0fSIgaW4KKyAgKi0qLXN1bm9zKikKKyAgICBlY2hvICdtYWluICgpIHsgfScgPiBjb25mdGVzdC5jCisgICAgJHtDQ30gLW8gY29uZnRlc3QgLVdsLC1ycGF0aD0gY29uZnRlc3QuYyA+L2Rldi9udWxsIDI+Y29uZnRlc3QudAorICAgIGlmIGdyZXAgJ3VucmVjb2duaXplZCcgY29uZnRlc3QudCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIDoKKyAgICBlbGlmIGdyZXAgJ05vIHN1Y2ggZmlsZScgY29uZnRlc3QudCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIDoKKyAgICBlbGlmIGdyZXAgJ2RvIG5vdCBtaXgnIGNvbmZ0ZXN0LnQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICA6CisgICAgZWxpZiBncmVwICdzb21lIHRleHQgYWxyZWFkeSBsb2FkZWQnIGNvbmZ0ZXN0LnQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICA6CisgICAgZWxpZiB0ZXN0ICIke3NoYXJlZH0iID0gInRydWUiOyB0aGVuCisgICAgICBITERGTEFHUz0nLVdsLC1ycGF0aD0kKGxpYmRpciknCisgICAgZWxzZQorICAgICAgSExERkxBR1M9Jy1XbCwtcnBhdGg9JworICAgIGZpCisgICAgcm0gLWYgY29uZnRlc3QudCBjb25mdGVzdC5jIGNvbmZ0ZXN0CisgICAgOzsKK2VzYWMKKworCisjIEVuZCBzdHVmZiB0byBzdXBwb3J0IC0tZW5hYmxlLXNoYXJlZAorCisjIHRhcmdldF9zdWJkaXIgaXMgdXNlZCBieSB0aGUgdGVzdHN1aXRlIHRvIGZpbmQgdGhlIHRhcmdldCBsaWJyYXJpZXMuCit0YXJnZXRfc3ViZGlyPQoraWYgdGVzdCAiJHtob3N0fSIgIT0gIiR7dGFyZ2V0fSI7IHRoZW4KKyAgICB0YXJnZXRfc3ViZGlyPSIke3RhcmdldF9hbGlhc30vIgorZmkKKworCitmcmFncz0KK2hvc3RfbWFrZWZpbGVfZnJhZz0ke3NyY2Rpcn0vY29uZmlnLyR7Z2RiX2hvc3RfY3B1fS8ke2dkYl9ob3N0fS5taAoraWYgdGVzdCAhIC1mICR7aG9zdF9tYWtlZmlsZV9mcmFnfTsgdGhlbgoreyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiKioqIEdkYiBkb2VzIG5vdCBzdXBwb3J0IGhvc3QgJHtob3N0fSIiIDE+JjI7IGV4aXQgMTsgfQorZmkKK2ZyYWdzPSIkZnJhZ3MgJGhvc3RfbWFrZWZpbGVfZnJhZyIKKwordGFyZ2V0X21ha2VmaWxlX2ZyYWc9JHtzcmNkaXJ9L2NvbmZpZy8ke2dkYl90YXJnZXRfY3B1fS8ke2dkYl90YXJnZXR9Lm10CitpZiB0ZXN0ICEgLWYgJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ307IHRoZW4KK3sgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIioqKiBHZGIgZG9lcyBub3Qgc3VwcG9ydCB0YXJnZXQgJHt0YXJnZXR9IiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZnJhZ3M9IiRmcmFncyAkdGFyZ2V0X21ha2VmaWxlX2ZyYWciCisKKworCisKKworaG9zdGZpbGU9YHNlZCAtbiAnCitzL1hNX0ZJTEVbIAldKj1bIAldKlwoW14gCV0qXCkvXDEvcAorJyAke2hvc3RfbWFrZWZpbGVfZnJhZ31gCisKK3RhcmdldGZpbGU9YHNlZCAtbiAnCitzL1RNX0ZJTEVbIAldKj1bIAldKlwoW14gCV0qXCkvXDEvcAorJyAke3RhcmdldF9tYWtlZmlsZV9mcmFnfWAKKworIyB0aGVzZSByZWFsbHkgYXJlbid0IG9ydGhvZ29uYWwgdHJ1ZS9mYWxzZSB2YWx1ZXMgb2YgdGhlIHNhbWUgY29uZGl0aW9uLAorIyBidXQgc2hlbGxzIGFyZSBzbG93IGVub3VnaCB0aGF0IEkgbGlrZSB0byByZXVzZSB0aGUgdGVzdCBjb25kaXRpb25zCisjIHdoZW5ldmVyIHBvc3NpYmxlCitpZiB0ZXN0ICIke3RhcmdldH0iID0gIiR7aG9zdH0iOyB0aGVuCituYXRpdmVmaWxlPWBzZWQgLW4gJworcy9OQVRfRklMRVsgCV0qPVsgCV0qXChbXiAJXSpcKS9cMS9wCisnICR7aG9zdF9tYWtlZmlsZV9mcmFnfWAKKyMgZWxzZQorIyBHREJzZXJ2ZXIgaXMgb25seSB1c2VmdWwgaW4gYSAibmF0aXZlIiBlbnZpcm9tZW50CisjIGNvbmZpZ2RpcnM9YGVjaG8gJGNvbmZpZ2RpcnMgfCBzZWQgJ3MvZ2Ric2VydmVyLy8nYAorZmkKKworCisjIElmIGhvc3RmaWxlIChYTV9GSUxFKSBhbmQvb3IgdGFyZ2V0ZmlsZSAoVE1fRklMRSkgYW5kL29yIG5hdGl2ZWZpbGUKKyMgKE5BVF9GSUxFKSBpcyBub3Qgc2V0IGluIGNvbmZpZy8qLyoubVtodF0gZmlsZXMsIHdlIGRvbid0IG1ha2UgdGhlCisjIGNvcnJlc3BvbmRpbmcgbGlua3MuICBCdXQgd2UgaGF2ZSB0byByZW1vdmUgdGhlIHhtLmggZmlsZXMgYW5kIHRtLmgKKyMgZmlsZXMgYW55d2F5LCBlLmcuIHdoZW4gc3dpdGNoaW5nIGZyb20gImNvbmZpZ3VyZSBob3N0IiB0bworIyAiY29uZmlndXJlIG5vbmUiLgorCitmaWxlcz0KK2xpbmtzPQorcm0gLWYgeG0uaAoraWYgdGVzdCAiJHtob3N0ZmlsZX0iICE9ICIiOyB0aGVuCitmaWxlcz0iJHtmaWxlc30gY29uZmlnLyR7Z2RiX2hvc3RfY3B1fS8ke2hvc3RmaWxlfSIKK2xpbmtzPSIke2xpbmtzfSB4bS5oIgorZmkKK3JtIC1mIHRtLmgKK2lmIHRlc3QgIiR7dGFyZ2V0ZmlsZX0iICE9ICIiOyB0aGVuCitmaWxlcz0iJHtmaWxlc30gY29uZmlnLyR7Z2RiX3RhcmdldF9jcHV9LyR7dGFyZ2V0ZmlsZX0iCitsaW5rcz0iJHtsaW5rc30gdG0uaCIKK2ZpCitybSAtZiBubS5oCitpZiB0ZXN0ICIke25hdGl2ZWZpbGV9IiAhPSAiIjsgdGhlbgorZmlsZXM9IiR7ZmlsZXN9IGNvbmZpZy8ke2dkYl9ob3N0X2NwdX0vJHtuYXRpdmVmaWxlfSIKK2xpbmtzPSIke2xpbmtzfSBubS5oIgorZWxzZQorIyBBIGNyb3NzLW9ubHkgY29uZmlndXJhdGlvbi4KK2ZpbGVzPSIke2ZpbGVzfSBjb25maWcvbm0tZW1wdHkuaCIKK2xpbmtzPSIke2xpbmtzfSBubS5oIgorZmkKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU2MDI6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDU2MDcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKworI2lmbmRlZiBfX0NZR1dJTl9fCisjZGVmaW5lIF9fQ1lHV0lOX18gX19DWUdXSU4zMl9fCisjZW5kaWYKK3JldHVybiBfX0NZR1dJTl9fOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU2MTg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jeWd3aW49eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2N5Z3dpbj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0Kgorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2N5Z3dpbiIgMT4mNgorQ1lHV0lOPQordGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU2MzU6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTY0MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworcmV0dXJuIF9fTUlOR1czMl9fOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU2NDc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9taW5ndzMyPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9taW5ndzMyPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfbWluZ3czMiIgMT4mNgorTUlOR1czMj0KK3Rlc3QgIiRhY19jdl9taW5ndzMyIiA9IHllcyAmJiBNSU5HVzMyPXllcworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTY2NjogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfZXhlZXh0PS5leGUKK2Vsc2UKKyAgcm0gLWYgY29uZnRlc3QqCisgIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuJGFjX2V4dAorICBhY19jdl9leGVleHQ9CisgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTY3NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgorICAgIGZvciBmaWxlIGluIGNvbmZ0ZXN0Lio7IGRvCisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAqLmMgfCAqLm8gfCAqLm9iaiB8ICouaWxrIHwgKi5wZGIpIDs7CisgICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OworICAgICAgZXNhYworICAgIGRvbmUKKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorICBmaQorICBybSAtZiBjb25mdGVzdCoKKyAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubworZmkKK2ZpCisKK0VYRUVYVD0iIgordGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KK2VjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKK2FjX2V4ZWV4dD0kRVhFRVhUCisKKworc3ViZGlycz0iJGNvbmZpZ2RpcnMiCisKK3RyYXAgJycgMSAyIDE1CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KKyAgKmFjX3NwYWNlPVwgKikKKyAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgc2VkIC1uIFwKKyAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCisgICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCisgICAgOzsKKyAgKikKKyAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKyAgICA7OworICBlc2FjID4+IGNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCisjIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KKyMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJworZmkKKwordHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorCitERUZTPS1ESEFWRV9DT05GSUdfSAorCisjIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKworZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUworcm0gLWYgJENPTkZJR19TVEFUVVMKK2NhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisjISAvYmluL3NoCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAorIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMKKyMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCisjCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKK2ZvciBhY19vcHRpb24KK2RvCisgIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCisgICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQorICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCithY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSB0dWkvTWFrZWZpbGUgLmdkYmluaXQ6Z2RiaW5pdC5pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAU0hFTExAJSRTSEVMTCVnCitzJUBDRkxBR1NAJSRDRkxBR1MlZworcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCitzJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKK3MlQEZGTEFHU0AlJEZGTEFHUyVnCitzJUBERUZTQCUkREVGUyVnCitzJUBMREZMQUdTQCUkTERGTEFHUyVnCitzJUBMSUJTQCUkTElCUyVnCitzJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKK3MlQHByZWZpeEAlJHByZWZpeCVnCitzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCitzJUBiaW5kaXJAJSRiaW5kaXIlZworcyVAc2JpbmRpckAlJHNiaW5kaXIlZworcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworcyVAZGF0YWRpckAlJGRhdGFkaXIlZworcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZworcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCitzJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCitzJUBsaWJkaXJAJSRsaWJkaXIlZworcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworcyVAaW5mb2RpckAlJGluZm9kaXIlZworcyVAbWFuZGlyQCUkbWFuZGlyJWcKK3MlQENDQCUkQ0MlZworcyVAQ1BQQCUkQ1BQJWcKK3MlQGhvc3RAJSRob3N0JWcKK3MlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKK3MlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCitzJUBob3N0X29zQCUkaG9zdF9vcyVnCitzJUB0YXJnZXRAJSR0YXJnZXQlZworcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKK3MlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKK3MlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKK3MlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCitzJUBidWlsZEAlJGJ1aWxkJWcKK3MlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZworcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKK3MlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCitzJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKK3MlQFNFVF9NQUtFQCUkU0VUX01BS0UlZworcyVAUkFOTElCQCUkUkFOTElCJWcKK3MlQEFMTE9DQUAlJEFMTE9DQSVnCitzJUBVU0VfTkxTQCUkVVNFX05MUyVnCitzJUBNU0dGTVRAJSRNU0dGTVQlZworcyVAR01TR0ZNVEAlJEdNU0dGTVQlZworcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCitzJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKK3MlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZworcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKK3MlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZworcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCitzJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCitzJUBJTlRMREVQU0AlJElOVExERVBTJWcKK3MlQElOVExMSUJTQCUkSU5UTExJQlMlZworcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCitzJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCitzJUBQT1NVQkAlJFBPU1VCJWcKK3MlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKK3MlQEdUX05PQCUkR1RfTk8lZworcyVAR1RfWUVTQCUkR1RfWUVTJWcKK3MlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKK3MlQGxAJSRsJWcKK3MlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCitzJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKK3MlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCitzJUBBUkAlJEFSJWcKK3MlQFlBQ0NAJSRZQUNDJWcKK3MlQENPTkZJR19MREZMQUdTQCUkQ09ORklHX0xERkxBR1MlZworcyVAQlVJTERfVFVJQCUkQlVJTERfVFVJJWcKK3MlQFRVSV9MSUJSQVJZQCUkVFVJX0xJQlJBUlklZworcyVAV0FSTl9DRkxBR1NAJSRXQVJOX0NGTEFHUyVnCitzJUBNTUFMTE9DX0NGTEFHU0AlJE1NQUxMT0NfQ0ZMQUdTJWcKK3MlQE1NQUxMT0NAJSRNTUFMTE9DJWcKK3MlQFRFUk1fTElCQCUkVEVSTV9MSUIlZworcyVARU5BQkxFX0NGTEFHU0AlJEVOQUJMRV9DRkxBR1MlZworcyVAQ09ORklHX09CU0AlJENPTkZJR19PQlMlZworcyVAQ09ORklHX0RFUFNAJSRDT05GSUdfREVQUyVnCitzJUBDT05GSUdfU1JDU0AlJENPTkZJR19TUkNTJWcKK3MlQEhMREZMQUdTQCUkSExERkxBR1MlZworcyVASExERU5WQCUkSExERU5WJWcKK3MlQHRhcmdldF9zdWJkaXJAJSR0YXJnZXRfc3ViZGlyJWcKKy9AaG9zdF9tYWtlZmlsZV9mcmFnQC9yICRob3N0X21ha2VmaWxlX2ZyYWcKK3MlQGhvc3RfbWFrZWZpbGVfZnJhZ0AlJWcKKy9AdGFyZ2V0X21ha2VmaWxlX2ZyYWdAL3IgJHRhcmdldF9tYWtlZmlsZV9mcmFnCitzJUB0YXJnZXRfbWFrZWZpbGVfZnJhZ0AlJWcKK3MlQGZyYWdzQCUkZnJhZ3MlZworcyVARVhFRVhUQCUkRVhFRVhUJWcKK3MlQHN1YmRpcnNAJSRzdWJkaXJzJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIHR1aS9NYWtlZmlsZSAuZ2RiaW5pdDpnZGJpbml0LmluIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KKyAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OworICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKK3MlQElOU1RBTExAJSRJTlNUQUxMJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCisjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgorIworIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCithY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKK2FjX2RDPSdcMycKK2FjX2REPSclZycKKyMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJworYWNfdUM9JyAnCithY191RD0nXDQlZycKKyMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX2VCPSckJVwxI1wyZGVmaW5lXDMnCithY19lQz0nICcKK2FjX2VEPSclZycKKworaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisgIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZpCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICRhY19maWxlCisKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCisKK0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcworIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6CisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgorcm0gLWYgY29uZnRlc3QudmFscworY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgorcy9bXFwmJV0vXFwmL2cKK3MlW1xcJGBdJVxcJiVnCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAorcyVhY19kJWFjX3UlZ3AKK3MlYWNfdSVhY19lJWdwCitFT0YKK3NlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKK3JtIC1mIGNvbmZ0ZXN0LmhkcgorCisjIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCisjIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCisjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KK2NhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgorcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKK0VPRgorCisjIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KKyMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCisKK3JtIC1mIGNvbmZ0ZXN0LnRhaWwKK3doaWxlIDoKK2RvCisgIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKKyAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgorICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCisgICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgorICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKKyAgZWNobyAnQ0VPRgorICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAorICBybSAtZiBjb25mdGVzdC5pbgorICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KKycgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKKyAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCitkb25lCitybSAtZiBjb25mdGVzdC52YWxzCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCisgIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAorICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAorICBybSAtZiBjb25mdGVzdC5pbgorICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKKyAgICBybSAtZiBjb25mdGVzdC5oCisgIGVsc2UKKyAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGZpCisgICAgcm0gLWYgJGFjX2ZpbGUKKyAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCisgIGZpCitmaTsgZG9uZQorCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCithY19zb3VyY2VzPSIkZmlsZXMiCithY19kZXN0cz0iJGxpbmtzIgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK3NyY2Rpcj0kYWNfZ2l2ZW5fc3JjZGlyCit3aGlsZSB0ZXN0IC1uICIkYWNfc291cmNlcyI7IGRvCisgIHNldCAkYWNfZGVzdHM7IGFjX2Rlc3Q9JDE7IHNoaWZ0OyBhY19kZXN0cz0kKgorICBzZXQgJGFjX3NvdXJjZXM7IGFjX3NvdXJjZT0kMTsgc2hpZnQ7IGFjX3NvdXJjZXM9JCoKKworICBlY2hvICJsaW5raW5nICRzcmNkaXIvJGFjX3NvdXJjZSB0byAkYWNfZGVzdCIKKworICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfc291cmNlOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkc3JjZGlyLyRhY19zb3VyY2U6IEZpbGUgbm90IGZvdW5kIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKKyAgcm0gLWYgJGFjX2Rlc3QKKworICAjIE1ha2UgcmVsYXRpdmUgc3ltbGlua3MuCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kZXN0X2Rpcj1gZWNobyAkYWNfZGVzdHxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gIiRhY19kZXN0IiAmJiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBkZXN0IGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGVzdF9kaXIiICYmIG1rZGlyICIkYWNfZGVzdF9kaXIiCisgICAgYWNfZGVzdF9kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2Rlc3RfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kZXN0X2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGVzdF9kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGVzdF9kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRzcmNkaXIiIGluCisgIFsvJF0qKSBhY19yZWxfc291cmNlPSIkc3JjZGlyLyRhY19zb3VyY2UiIDs7CisgICopIGFjX3JlbF9zb3VyY2U9IiRhY19kb3RzJHNyY2Rpci8kYWNfc291cmNlIiA7OworICBlc2FjCisKKyAgIyBNYWtlIGEgc3ltbGluayBpZiBwb3NzaWJsZTsgb3RoZXJ3aXNlIHRyeSBhIGhhcmQgbGluay4KKyAgaWYgbG4gLXMgJGFjX3JlbF9zb3VyY2UgJGFjX2Rlc3QgMj4vZGV2L251bGwgfHwKKyAgICBsbiAkc3JjZGlyLyRhY19zb3VyY2UgJGFjX2Rlc3Q7IHRoZW4gOgorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGxpbmsgJGFjX2Rlc3QgdG8gJHNyY2Rpci8kYWNfc291cmNlIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2RvbmUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK2dkYl9ob3N0X2NwdT0kZ2RiX2hvc3RfY3B1CitnZGJfdGFyZ2V0X2NwdT0kZ2RiX3RhcmdldF9jcHUKK25hdGl2ZWZpbGU9JG5hdGl2ZWZpbGUKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKK2lmIHRlc3QgIiR7bmF0aXZlZmlsZX0iID0gIiI7IHRoZW4KK3NlZCAtZSAnL15OQVRERVBGSUxFU1sgCV0qPVsgCV0qL3MvLyMgTkFUREVQRklMRVM9LycgXAorCTwgTWFrZWZpbGUgPiBNYWtlZmlsZS50ZW0KK212IC1mIE1ha2VmaWxlLnRlbSBNYWtlZmlsZQorZmkKKworc2VkIC1lICcvXlRNX0ZJTEVbIAldKj0vcyxeVE1fRklMRVsgCV0qPVsgCV0qLCZjb25maWcvJyIke2dkYl90YXJnZXRfY3B1fSInLywKKy9eWE1fRklMRVsgCV0qPS9zLF5YTV9GSUxFWyAJXSo9WyAJXSosJmNvbmZpZy8nIiR7Z2RiX2hvc3RfY3B1fSInLywKKy9eTkFUX0ZJTEVbIAldKj0vcyxeTkFUX0ZJTEVbIAldKj1bIAldKiwmY29uZmlnLyciJHtnZGJfaG9zdF9jcHV9IicvLCcgPE1ha2VmaWxlID5NYWtlZmlsZS50bXAKK212IC1mIE1ha2VmaWxlLnRtcCBNYWtlZmlsZQorCitjYXNlIHgkQ09ORklHX0hFQURFUlMgaW4KK3hjb25maWcuaDpjb25maWcuaW4pCitlY2hvID4gc3RhbXAtaCA7OworZXNhYworCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKworaWYgdGVzdCAiJG5vX3JlY3Vyc2lvbiIgIT0geWVzOyB0aGVuCisKKyAgIyBSZW1vdmUgLS1jYWNoZS1maWxlIGFuZCAtLXNyY2RpciBhcmd1bWVudHMgc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyAgYWNfc3ViX2NvbmZpZ3VyZV9hcmdzPQorICBhY19wcmV2PQorICBmb3IgYWNfYXJnIGluICRhY19jb25maWd1cmVfYXJnczsgZG8KKyAgICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICAgIGFjX3ByZXY9CisgICAgICBjb250aW51ZQorICAgIGZpCisgICAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgICAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgICAgOzsKKyAgICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgICAgOzsKKyAgICAqKSBhY19zdWJfY29uZmlndXJlX2FyZ3M9IiRhY19zdWJfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgICBlc2FjCisgIGRvbmUKKworICBmb3IgYWNfY29uZmlnX2RpciBpbiAkY29uZmlnZGlyczsgZG8KKworICAgICMgRG8gbm90IGNvbXBsYWluLCBzbyBhIGNvbmZpZ3VyZSBzY3JpcHQgY2FuIGNvbmZpZ3VyZSB3aGljaGV2ZXIKKyAgICAjIHBhcnRzIG9mIGEgbGFyZ2Ugc291cmNlIHRyZWUgYXJlIHByZXNlbnQuCisgICAgaWYgdGVzdCAhIC1kICRzcmNkaXIvJGFjX2NvbmZpZ19kaXI7IHRoZW4KKyAgICAgIGNvbnRpbnVlCisgICAgZmkKKworICAgIGVjaG8gY29uZmlndXJpbmcgaW4gJGFjX2NvbmZpZ19kaXIKKworICAgIGNhc2UgIiRzcmNkaXIiIGluCisgICAgLikgOzsKKyAgICAqKQorICAgICAgaWYgdGVzdCAtZCAuLyRhY19jb25maWdfZGlyIHx8IG1rZGlyIC4vJGFjX2NvbmZpZ19kaXI7IHRoZW4gOjsKKyAgICAgIGVsc2UKKyAgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGNyZWF0ZSBgcHdkYC8kYWNfY29uZmlnX2RpciIgMT4mMjsgZXhpdCAxOyB9CisgICAgICBmaQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBhY19wb3BkaXI9YHB3ZGAKKyAgICBjZCAkYWNfY29uZmlnX2RpcgorCisgICAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluIC8kYWNfY29uZmlnX2Rpci4KKyAgICAgIGFjX2RvdHM9YGVjaG8gJGFjX2NvbmZpZ19kaXJ8c2VkIC1lICdzJV5cLi8lJScgLWUgJ3MlW14vXSQlJi8lJyAtZSAncyVbXi9dKi8lLi4vJWcnYAorCisgICAgY2FzZSAiJHNyY2RpciIgaW4KKyAgICAuKSAjIE5vIC0tc3JjZGlyIG9wdGlvbi4gIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgICAgIGFjX3N1Yl9zcmNkaXI9JHNyY2RpciA7OworICAgIC8qKSAjIEFic29sdXRlIHBhdGguCisgICAgICBhY19zdWJfc3JjZGlyPSRzcmNkaXIvJGFjX2NvbmZpZ19kaXIgOzsKKyAgICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgICBhY19zdWJfc3JjZGlyPSRhY19kb3RzJHNyY2Rpci8kYWNfY29uZmlnX2RpciA7OworICAgIGVzYWMKKworICAgICMgQ2hlY2sgZm9yIGd1ZXN0ZWQgY29uZmlndXJlOyBvdGhlcndpc2UgZ2V0IEN5Z251cyBzdHlsZSBjb25maWd1cmUuCisgICAgaWYgdGVzdCAtZiAkYWNfc3ViX3NyY2Rpci9jb25maWd1cmU7IHRoZW4KKyAgICAgIGFjX3N1Yl9jb25maWd1cmU9JGFjX3N1Yl9zcmNkaXIvY29uZmlndXJlCisgICAgZWxpZiB0ZXN0IC1mICRhY19zdWJfc3JjZGlyL2NvbmZpZ3VyZS5pbjsgdGhlbgorICAgICAgYWNfc3ViX2NvbmZpZ3VyZT0kYWNfY29uZmlndXJlCisgICAgZWxzZQorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19jb25maWdfZGlyIiAxPiYyCisgICAgICBhY19zdWJfY29uZmlndXJlPQorICAgIGZpCisKKyAgICAjIFRoZSByZWN1cnNpb24gaXMgaGVyZS4KKyAgICBpZiB0ZXN0IC1uICIkYWNfc3ViX2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBNYWtlIHRoZSBjYWNoZSBmaWxlIG5hbWUgY29ycmVjdCByZWxhdGl2ZSB0byB0aGUgc3ViZGlyZWN0b3J5LgorICAgICAgY2FzZSAiJGNhY2hlX2ZpbGUiIGluCisgICAgICAvKikgYWNfc3ViX2NhY2hlX2ZpbGU9JGNhY2hlX2ZpbGUgOzsKKyAgICAgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICAgICAgYWNfc3ViX2NhY2hlX2ZpbGU9IiRhY19kb3RzJGNhY2hlX2ZpbGUiIDs7CisgICAgICBlc2FjCisgIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgorICAgICAgICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgICAgICAgICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgICAgICAgIGVzYWMKKworICAgICAgZWNobyAicnVubmluZyAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfc3ViX2NvbmZpZ3VyZSAkYWNfc3ViX2NvbmZpZ3VyZV9hcmdzIC0tY2FjaGUtZmlsZT0kYWNfc3ViX2NhY2hlX2ZpbGUgLS1zcmNkaXI9JGFjX3N1Yl9zcmNkaXIiCisgICAgICAjIFRoZSBldmFsIG1ha2VzIHF1b3RpbmcgYXJndW1lbnRzIHdvcmsuCisgICAgICBpZiBldmFsICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19zdWJfY29uZmlndXJlICRhY19zdWJfY29uZmlndXJlX2FyZ3MgLS1jYWNoZS1maWxlPSRhY19zdWJfY2FjaGVfZmlsZSAtLXNyY2Rpcj0kYWNfc3ViX3NyY2RpcgorICAgICAgdGhlbiA6CisgICAgICBlbHNlCisgICAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3N1Yl9jb25maWd1cmUgZmFpbGVkIGZvciAkYWNfY29uZmlnX2RpciIgMT4mMjsgZXhpdCAxOyB9CisgICAgICBmaQorICAgIGZpCisKKyAgICBjZCAkYWNfcG9wZGlyCisgIGRvbmUKK2ZpCisKKworZXhpdCAwCmRpZmYgLS1naXQgYS9nZGIvY29uZmlndXJlLmhvc3QgYi9nZGIvY29uZmlndXJlLmhvc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhNjNlNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWd1cmUuaG9zdApAQCAtMCwwICsxLDE2MiBAQAorIyBNYXBwaW5nIG9mIGNvbmZpZ3VyYXRpb25zIGludG8gR0RCIGhvc3QgZGVmaW5pdGlvbnMuICBUaGlzIGlzCisjIGludm9rZWQgZnJvbSB0aGUgYXV0b2NvbmYgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQuCisKKyMgVGhpcyBmaWxlIHNldHMgdGhlIGZvbGxvd2luZyBzaGVsbCB2YXJpYWJsZXM6CisjICBnZGJfaG9zdF9jcHUJCWdlbmVyaWMgbmFtZSBvZiBob3N0J3MgQ1BVCisjICBnZGJfaG9zdAkJbmFtZSBvZiBHREIgaG9zdCBkZWZpbml0aW9uIHRvIHVzZQorCisjIE1hcCBob3N0IGNwdSBpbnRvIHRoZSBjb25maWcgY3B1IHN1YmRpcmVjdG9yeSBuYW1lLgorIyBUaGUgZGVmYXVsdCBpcyAkaG9zdF9jcHUuCisKK2Nhc2UgIiR7aG9zdF9jcHV9IiBpbgorCithbHBoYSopCQkJZ2RiX2hvc3RfY3B1PWFscGhhIDs7CitjWzEyXSkJCQlnZGJfaG9zdF9jcHU9Y29udmV4IDs7CitocHBhKikJCQlnZGJfaG9zdF9jcHU9cGEgOzsKK2lbMzQ1Nl04NiopCQlnZGJfaG9zdF9jcHU9aTM4NiA7OworbTY4KikJCQlnZGJfaG9zdF9jcHU9bTY4ayA7OworbTg4KikJCQlnZGJfaG9zdF9jcHU9bTg4ayA7OworIyBPQlNPTEVURSBucDEpCQkJZ2RiX2hvc3RfY3B1PWdvdWxkIDs7CitweXJhbWlkKQkJZ2RiX2hvc3RfY3B1PXB5ciA7OworcG93ZXJwYyopCQlnZGJfaG9zdF9jcHU9cG93ZXJwYyA7Oworc3BhcmM2NCkJCWdkYl9ob3N0X2NwdT1zcGFyYyA7OworKikJCQlnZGJfaG9zdF9jcHU9JGhvc3RfY3B1IDs7CisKK2VzYWMKKworIyBtYXAgaG9zdCBpbmZvIGludG8gZ2RiIG5hbWVzLgorCitjYXNlICIke2hvc3R9IiBpbgorCithMjlrLSotKikJCWdkYl9ob3N0PXVsdHJhMyA7OworCithbHBoYSotKi1vc2YxKikJCWdkYl9ob3N0PWFscGhhLW9zZjEgOzsKK2FscGhhKi0qLW9zZjIqKQkJZ2RiX2hvc3Q9YWxwaGEtb3NmMiA7OworYWxwaGEqLSotb3NmWzM0NTY3ODldKikJZ2RiX2hvc3Q9YWxwaGEtb3NmMyA7OworYWxwaGEqLSotbGludXgqKQlnZGJfaG9zdD1hbHBoYS1saW51eCA7OworCithcm0tKi0qKQkJZ2RiX2hvc3Q9YXJtIDs7CisKK2NbMTJdLSotKikJCWdkYl9ob3N0PWNvbnZleCA7OworCitocHBhKi0qLWJzZCopCQlnZGJfaG9zdD1ocHBhYnNkIDs7CitocHBhKi0qLWhpdXgqKQkJZ2RiX2hvc3Q9aHBwYWhwdXggOzsKK2hwcGEqLSotaHB1eDEwLjIwKQlnZGJfaG9zdD1ocHV4MTAyMCA7OworaHBwYSotKi1ocHV4MTEuMCopCWdkYl9ob3N0PWhwdXgxMTAwIDs7CitocHBhKi0qLWhwdXgqKQkJZ2RiX2hvc3Q9aHBwYWhwdXggOzsKK2hwcGEqLSotb3NmKikJCWdkYl9ob3N0PWhwcGFvc2YgOzsKKworaVszNDU2XTg2LW5jci0qKQlnZGJfaG9zdD1uY3IzMDAwIDs7CitpWzM0NTZdODYtc2VxdWVudC1ic2QqKQlnZGJfaG9zdD1zeW1tZXRyeSA7OyAgIyBkeW5peAoraVszNDU2XTg2LXNlcXVlbnQtc3lzdjQqKSBnZGJfaG9zdD1wdHg0IDs7CitpWzM0NTZdODYtc2VxdWVudC1zeXN2KikgZ2RiX2hvc3Q9cHR4IDs7CitpWzM0NTZdODYtKi1haXgqKQlnZGJfaG9zdD1pMzg2YWl4IDs7CitpWzM0NTZdODYtKi1ic2QqKQlnZGJfaG9zdD1pMzg2YnNkIDs7CitpWzM0NTZdODYtKi1kZ3V4KikJZ2RiX2hvc3Q9aTM4NmRndXggOzsKK2lbMzQ1Nl04Ni0qLWZyZWVic2QqKQlnZGJfaG9zdD1mYnNkIDs7CitpWzM0NTZdODYtKi1uZXRic2QqKQlnZGJfaG9zdD1uYnNkIDs7CitpWzM0NTZdODYtKi1nbzMyKikJZ2RiX2hvc3Q9Z28zMiA7OworaVszNDU2XTg2LSotbGludXgqKQlnZGJfaG9zdD1saW51eCA7OworaVszNDU2XTg2LSotbHlueG9zKikJZ2RiX2hvc3Q9aTM4Nmx5bnggOzsKK2lbMzQ1Nl04Ni0qLW1hY2gzKikJZ2RiX2hvc3Q9aTM4Nm0zIDs7CitpWzM0NTZdODYtKi1tYWNoKikJZ2RiX2hvc3Q9aTM4Nm1hY2ggOzsKK2lbMzQ1Nl04Ni0qLWdudSopCWdkYl9ob3N0PWkzODZnbnUgOzsKK2lbMzQ1Nl04Ni0qLW9zZjFtayopCWdkYl9ob3N0PWkzODZtayA7OworaVszNDU2XTg2LSotc2NvMy4ydjUqKQlnZGJfaG9zdD1pMzg2c2NvNSA7OworaVszNDU2XTg2LSotc2NvMy4ydjQqKQlnZGJfaG9zdD1pMzg2c2NvNCA7OworaVszNDU2XTg2LSotc2NvKikJZ2RiX2hvc3Q9aTM4NnNjbyA7OworaVszNDU2XTg2LSotc29sYXJpcyopCWdkYl9ob3N0PWkzODZzb2wyIDs7CitpWzM0NTZdODYtKi1zdW5vcyopCWdkYl9ob3N0PXN1bjM4NiA7OworaVszNDU2XTg2LSotc3lzdjMuMiopCWdkYl9ob3N0PWkzODZ2MzIgOzsKK2lbMzQ1Nl04Ni0qLXN5c3YzMiopCWdkYl9ob3N0PWkzODZ2MzIgOzsKK2lbMzQ1Nl04Ni0qLXN5c3Y0LjIqKQlnZGJfaG9zdD1pMzg2djQybXAgOzsKK2lbMzQ1Nl04Ni0qLXN5c3Y0KikJZ2RiX2hvc3Q9aTM4NnY0IDs7CitpWzM0NTZdODYtKi1zeXN2NSopCWdkYl9ob3N0PWkzODZ2NDJtcCA7OworaVszNDU2XTg2LSotdW5peHdhcmUyKikJZ2RiX2hvc3Q9aTM4NnY0Mm1wIDs7CitpWzM0NTZdODYtKi11bml4d2FyZSopCWdkYl9ob3N0PWkzODZ2NCA7OworaVszNDU2XTg2LSotc3lzdiopCWdkYl9ob3N0PWkzODZ2IDs7CitpWzM0NTZdODYtKi1pc2MqKQlnZGJfaG9zdD1pMzg2djMyIDs7CitpWzM0NTZdODYtKi1jeWd3aW4qKQlnZGJfaG9zdD1jeWd3aW4gOzsKK202ODBbMDFdMC1zdW4tc3Vub3MzKikJZ2RiX2hvc3Q9c3VuMm9zMyA7OworbTY4MFswMV0wLXN1bi1zdW5vczQqKQlnZGJfaG9zdD1zdW4yb3M0IDs7CittNjgwMzAtc29ueS0qKQkJZ2RiX2hvc3Q9bmV3czEwMDAgOzsKKworbTY4Ki1hbHRvcy0qKQkJZ2RiX2hvc3Q9YWx0b3MgOzsKK202OCotYXBvbGxvKi1zeXN2KikJZ2RiX2hvc3Q9YXBvbGxvNjh2IDs7CittNjgqLWFwb2xsbyotYnNkKikJZ2RiX2hvc3Q9YXBvbGxvNjhiIDs7CittNjgqLWF0dC0qKQkJZ2RiX2hvc3Q9M2IxIDs7CittNjgqLWJ1bGwqLXN5c3YqKQlnZGJfaG9zdD1kcHgyIDs7CittNjgqLWhwLWJzZCopCQlnZGJfaG9zdD1ocDMwMGJzZCA7OworbTY4Ki1ocC1ocHV4KikJCWdkYl9ob3N0PWhwMzAwaHB1eCA7OworbTY4Ki1pc2ktKikJCWdkYl9ob3N0PWlzaSA7OworbTY4Ki0qLWxpbnV4KikJCWdkYl9ob3N0PWxpbnV4IDs7CittNjgqLSotbHlueG9zKikJCWdkYl9ob3N0PW02OGtseW54IDs7CittNjgqLSotbmV0YnNkKikJCWdkYl9ob3N0PW5ic2QgOzsKK202OCotKi1zeXN2NCopCQlnZGJfaG9zdD1tNjhrdjQgOzsKK202OCotbW90b3JvbGEtKikJZ2RiX2hvc3Q9ZGVsdGE2OCA7OworbTY4Ki1zb255LSopCQlnZGJfaG9zdD1uZXdzIDs7CittNjgqLXN1bi1zdW5vczMqKQlnZGJfaG9zdD1zdW4zb3MzIDs7CittNjgqLXN1bi1zdW5vczQqKQlnZGJfaG9zdD1zdW4zb3M0IDs7CittNjgqLXN1bi0qKQkJZ2RiX2hvc3Q9c3VuM29zNCA7OworCittODgqLWhhcnJpcy1jeHV4KikJZ2RiX2hvc3Q9Y3h1eCA7OworbTg4Ki1tb3Rvcm9sYS1zeXN2NCopCWdkYl9ob3N0PWRlbHRhODh2NCA7OworbTg4Ki1tb3Rvcm9sYS1zeXN2KikJZ2RiX2hvc3Q9ZGVsdGE4OCA7OworbTg4Ki0qLSopCQlnZGJfaG9zdD1tODhrIDs7CisKK21pcHMtZGVjLW1hY2gzKikJZ2RiX2hvc3Q9bWFjaDMgOzsKK21pcHMtZGVjLSopCQlnZGJfaG9zdD1kZWNzdGF0aW9uIDs7CittaXBzLWxpdHRsZS0qKQkJZ2RiX2hvc3Q9bGl0dGxlbWlwcyA7OworbWlwcy1zZ2ktaXJpeDMqKQlnZGJfaG9zdD1pcml4MyA7OworbWlwcy1zZ2ktaXJpeDQqKQlnZGJfaG9zdD1pcml4NCA7OworbWlwcy1zZ2ktaXJpeDUqKQlnZGJfaG9zdD1pcml4NSA7OworIyBDbG9zZSBlbm91Z2ggZm9yIG5vdy4KK21pcHMtc2dpLWlyaXg2KikJZ2RiX2hvc3Q9aXJpeDUgOzsKK21pcHMtc29ueS0qKQkJZ2RiX2hvc3Q9bmV3cy1taXBzIDs7CittaXBzLSotbWFjaDMqKQkJZ2RiX2hvc3Q9bWlwc20zIDs7CittaXBzLSotc3lzdjQqKQkJZ2RiX2hvc3Q9bWlwc3Y0IDs7CittaXBzLSotc3lzdiopCQlnZGJfaG9zdD1yaXNjb3MgOzsKK21pcHMtKi1yaXNjb3MqKQkJZ2RiX2hvc3Q9cmlzY29zIDs7CisKK25vbmUtKi0qKQkJZ2RiX2hvc3Q9bm9uZSA7OworCisjIE9CU09MRVRFIG5wMS0qLSopCQlnZGJfaG9zdD1ucDEgOzsKKworbnMzMmstKi1tYWNoMyopCQlnZGJfaG9zdD1uczMya20zIDs7CituczMyay0qLW5ldGJzZCopCWdkYl9ob3N0PW5ic2QgOzsKK25zMzJrLXVtYXgtKikJCWdkYl9ob3N0PXVtYXggOzsKK25zMzJrLXV0ZWstc3lzdiopCWdkYl9ob3N0PW1lcmxpbiA7OworCitwb3dlcnBjLSotYWl4KikJCWdkYl9ob3N0PWFpeCA7OworcG93ZXJwY2xlLSotY3lnd2luKikJZ2RiX2hvc3Q9Y3lnd2luIDs7Citwb3dlcnBjbGUtKi1zb2xhcmlzKikJZ2RiX2hvc3Q9c29sYXJpcyA7OworcG93ZXJwYy0qLWxpbnV4KikJZ2RiX2hvc3Q9bGludXggOzsKKworIyBPQlNPTEVURSBwbi0qLSopCQkJZ2RiX2hvc3Q9cG4gOzsKKworcHlyYW1pZC0qLSopCQlnZGJfaG9zdD1weXJhbWlkIDs7CisKK3JvbXAtKi0qKQkJZ2RiX2hvc3Q9cnRic2QgOzsKKworcnM2MDAwLSotbHlueG9zKikJZ2RiX2hvc3Q9cnM2MDAwbHlueCA7OworcnM2MDAwLSotYWl4NCopCQlnZGJfaG9zdD1haXg0IDs7CityczYwMDAtKi0qKQkJZ2RiX2hvc3Q9cnM2MDAwIDs7CisKK3NwYXJjLSotbGludXgqKQkJZ2RiX2hvc3Q9bGludXggOzsKK3NwYXJjLSotbHlueG9zKikJZ2RiX2hvc3Q9c3BhcmNseW54IDs7CitzcGFyYy0qLW5ldGJzZCopCWdkYl9ob3N0PW5ic2QgOzsKK3NwYXJjLSotc29sYXJpczIqKQlnZGJfaG9zdD1zdW40c29sMiA7Oworc3BhcmMtKi1zdW5vczQqKQlnZGJfaG9zdD1zdW40b3M0IDs7CitzcGFyYy0qLXN1bm9zNSopCWdkYl9ob3N0PXN1bjRzb2wyIDs7CitzcGFyYy0qLSopCQlnZGJfaG9zdD1zdW40b3M0IDs7CitzcGFyYzY0LSotKikJCWdkYl9ob3N0PXN1bjRzb2wyIDs7CisKK3N0cm9uZ2FybS0qLSopCQlnZGJfaG9zdD1hcm0gOzsKKwordGFob2UtKi0qKQkJZ2RiX2hvc3Q9dGFob2UgOzsKKwordmF4LSotYnNkKikJCWdkYl9ob3N0PXZheGJzZCA7OwordmF4LSotdWx0cml4MiopCQlnZGJfaG9zdD12YXh1bHQyIDs7Cit2YXgtKi11bHRyaXgqKQkJZ2RiX2hvc3Q9dmF4dWx0IDs7CisKK2VzYWMKZGlmZiAtLWdpdCBhL2dkYi9jb25maWd1cmUuaW4gYi9nZGIvY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NTgxMTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsNjA2IEBACitkbmwgQXV0b2NvbmYgY29uZmlndXJlIHNjcmlwdCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorZG5sIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sCitkbmwgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorZG5sIAorZG5sIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitkbmwgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK2RubCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorZG5sIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCitkbmwgCitkbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitkbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK2RubCBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitkbmwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KK2RubCAKK2RubCBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZG5sIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitkbmwgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCisKK0FDX1BSRVJFUSgyLjEzKWRubAorQUNfSU5JVChtYWluLmMpCitBQ19DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKKworQUNfUFJPR19DQworQUNfQUlYCitBQ19JU0NfUE9TSVgKK0FNX1BST0dfQ0NfU1REQworCitBQ19DT05GSUdfQVVYX0RJUihgY2QgJHNyY2Rpcjtwd2RgLy4uKQorQUNfQ0FOT05JQ0FMX1NZU1RFTQorCitkbmwgZ2RiIGRvZXNuJ3QgdXNlIGdldHRleHQsIGJ1dCBiZmQgZG9lcy4gIFdlIGNhbGwgdGhpcyB0byBlbnN1cmUgd2UKK2RubCBsaW5rIHdpdGggdGhlIGNvcnJlY3QgbGlicmFyaWVzLgorQUxMX0xJTkdVQVM9CitDWV9HTlVfR0VUVEVYVAorCitkbmwgTGlzdCBvZiBvYmplY3QgZmlsZXMgYWRkZWQgYnkgY29uZmlndXJlLgorCitDT05GSUdfT0JTPQorQ09ORklHX0RFUFM9CitDT05GSUdfU1JDUz0KKworY29uZmlnZGlycz0iZG9jIHRlc3RzdWl0ZSIKKworZG5sCitjaGFuZ2VxdW90ZSgsKWRubAorCisuICR7c3JjZGlyfS9jb25maWd1cmUuaG9zdAorCisuICR7c3JjZGlyfS9jb25maWd1cmUudGd0CisKK2RubAorY2hhbmdlcXVvdGUoWyxdKWRubAorCitBQ19QUk9HX0lOU1RBTEwKK0FDX0NIRUNLX1RPT0woQVIsIGFyKQorQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgOikKK0FDX1BST0dfWUFDQworCitBQ19BUkdfUFJPR1JBTQorCitBQ19UWVBFX1NJR05BTAorCitBQ19IRUFERVJfU1REQworCitBQ19DSEVDS19IRUFERVJTKGN0eXBlLmggY3Vyc2VzLmggZW5kaWFuLmggbGluay5oIFwKKwltZW1vcnkuaCBvYmpsaXN0LmggcHRyYWNlLmggc2d0dHkuaCBzdGRkZWYuaCBzdGRsaWIuaCBcCisJc3RyaW5nLmggc3lzL3Byb2Nmcy5oIHN5cy9wdHJhY2UuaCBzeXMvcmVnLmggXAorCXRlcm0uaCB0ZXJtaW8uaCB0ZXJtaW9zLmggdW5pc3RkLmggd2FpdC5oIHN5cy93YWl0LmggXAorCXdjaGFyLmggd2N0eXBlLmggYXNtL2RlYnVncmVnLmggc3lzL2RlYnVncmVnLmgpCitBQ19IRUFERVJfU1RBVAorCitBQ19DX0NPTlNUCisKK0FDX0NIRUNLX0ZVTkNTKHNldHBnaWQgc2JyayBzaWdhY3Rpb24gaXNhc2NpaSBiemVybyBiY29weSBidG93YykKK0FDX0ZVTkNfQUxMT0NBCisKK0JGRF9ORUVEX0RFQ0xBUkFUSU9OKG1hbGxvYykKK0JGRF9ORUVEX0RFQ0xBUkFUSU9OKHJlYWxsb2MpCitCRkRfTkVFRF9ERUNMQVJBVElPTihmcmVlKQorQkZEX05FRURfREVDTEFSQVRJT04oc3RyZXJyb3IpCitCRkRfTkVFRF9ERUNMQVJBVElPTihzdHJkdXApCisKKworIyBUaGUgZm9sbG93aW5nIHNhdmVfc3RhdGVfdCBjaGVja2VyeSBpcyBvbmx5IG5lY2Vzc2FyeSBmb3IgSFBVWCAKKyMgdmVyc2lvbnMgZWFybGllciB0aGFuIDEwLjIwLiAgV2hlbiB0aG9zZSBmYWRlIGZyb20gbWVtb3J5LCB0aGlzIAorIyBjb3VsZCBiZSBleHB1bmdlZC4gLS1qc20gMTk5OS0wMy0yMgorCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIEhQVVggc2F2ZV9zdGF0ZSBzdHJ1Y3R1cmUpCitBQ19FR1JFUF9IRUFERVIoc2F2ZV9zdGF0ZV90LCBtYWNoaW5lL3NhdmVfc3RhdGUuaCwgCisgICAgICAgICAgICAgICAgZ2RiX2N2X2hwdXhfc2F2ZXN0YXRlPXllcywgZ2RiX2N2X2hwdXhfc2F2ZXN0YXRlPW5vKQorQUNfRUdSRVBfSEVBREVSKHNzX3dpZGUsIG1hY2hpbmUvc2F2ZV9zdGF0ZS5oLCBnZGJfY3ZfaHB1eF9zc3dpZGU9eWVzLAorICAgICAgICAgICAgICAgIGdkYl9jdl9ocHV4X3Nzd2lkZT1ubykKK2lmIHRlc3QgJGdkYl9jdl9ocHV4X3NhdmVzdGF0ZSA9IHllcwordGhlbgorICBBQ19ERUZJTkUoSEFWRV9TVFJVQ1RfU0FWRV9TVEFURV9ULCAxKQorZmkKK2lmIHRlc3QgJGdkYl9jdl9ocHV4X3Nzd2lkZSA9IHllcwordGhlbgorICBBQ19ERUZJTkUoSEFWRV9TVFJVQ1RfTUVNQkVSX1NTX1dJREUsIDEpCitmaQorQUNfTVNHX1JFU1VMVCgkZ2RiX2N2X2hwdXhfc3N3aWRlKQorCisKKyMgSWYgd2UgYXJlIGNvbmZpZ3VyZWQgbmF0aXZlIG9uIEdOVS9MaW51eCwgd29yayBhcm91bmQgcHJvYmxlbXMgd2l0aAorIyBzeXMvcHJvY2ZzLmgKKyMgQWxzbyBkZXRlY3Qgd2hpY2ggdHlwZSBvZiAvcHJvYyBpcyBpbiB1c2UsIHN1Y2ggYXMgZm9yIFVuaXh3YXJlLgorCitpZiB0ZXN0ICIke3RhcmdldH0iID0gIiR7aG9zdH0iOyB0aGVuCisgIGNhc2UgIiR7aG9zdH0iIGluCisgIGlbWzM0NTZdXTg2LSotbGludXgqKQorCUFDX0RFRklORShTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCwyKQorCUFDX0RFRklORShzeXNfcXVvdGFjdGwpCisJOzsKKyAgZXNhYworICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGRpcmVjdG9yeSBwcm9jIGVudHJpZXMpCisjIFRoZSBbZ2RiX2hvc3QgIT0gc3VuNHNvbDJdIGhhY2sgaXMgYmVjYXVzZSBTb2xhcmlzIGRvZXMgcHJvdmlkZSB0aGUKKyMgbXVsdGlwbGUgcHJvY2ZzIGZpbGVzIGFzIG9mIFNvbGFyaXMgMi42LCBidXQgR0RCIGNhbid0IHVzZSBpdCByaWdodCBub3cuCisgIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX3Byb2Nmc19oIiA9IHllcyAtYSAiJGdkYl9ob3N0IiAhPSBzdW40c29sMiBcCisgIC1hIC1kIC9wcm9jLyQkIFwKKyAgLWEgLWYgL3Byb2MvJCQvY3RsIFwKKyAgLWEgLWYgL3Byb2MvJCQvYXMgXAorICAtYSAtZiAvcHJvYy8kJC9tYXAgXAorICAtYSAtZiAvcHJvYy8kJC9zdGF0dXM7IHRoZW4KKyAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICBBQ19ERUZJTkUoSEFWRV9NVUxUSVBMRV9QUk9DX0ZEUykKKyAgZWxzZQorICAgIEFDX01TR19SRVNVTFQobm8pCisgIGZpCitmaQorCitpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19wcm9jZnNfaCIgPSB5ZXM7IHRoZW4KKyAgQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFKHBzdGF0dXNfdCkKKyAgQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFKHBycnVuX3QpCisgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShncmVnc2V0X3QpCisgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShmcHJlZ3NldF90KQorCisgIGRubCBDaGVjayBmb3IgUElPQ1NFVCBpb2N0bCBlbnRyeSAKKworICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIFBJT0NTRVQgaW9jdGwgZW50cnkgaW4gc3lzL3Byb2Nmcy5oKQorICBBQ19DQUNIRV9WQUwoZ2RiX2N2X2hhdmVfcHJvY2ZzX3Bpb2NzZXQsCisgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KK10sIFsKKyAgICBpbnQgZHVtbXk7OworICAgIGR1bW15ID0gaW9jdGwoMCwgUElPQ1NFVCwgJmR1bW15KTsKKyAgXSwKKyAgZ2RiX2N2X2hhdmVfcHJvY2ZzX3Bpb2NzZXQ9eWVzLCBnZGJfY3ZfaGF2ZV9wcm9jZnNfcGlvY3NldD1ubyldKQorICBBQ19NU0dfUkVTVUxUKCRnZGJfY3ZfaGF2ZV9wcm9jZnNfcGlvY3NldCkKKyAgaWYgdGVzdCAkZ2RiX2N2X2hhdmVfcHJvY2ZzX3Bpb2NzZXQgPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9QUk9DRlNfUElPQ1NFVCkKKyAgZmkKK2ZpCisKK2RubCBTZWUgaWYgaG9zdCBoYXMgbGlibS4gIFRoaXMgaXMgdXN1YWxseSBuZWVkZWQgYnkgc2ltdWxhdG9ycy4KK0FDX0NIRUNLX0xJQihtLCBtYWluKQorCitkbmwgU29sYXJpcyBwdXRzIHdjdHlwZSBpbiAvdXNyL2xpYi9saWJ3LmEgYmVmb3JlIFNvbGFyaXMgMi42LgorZG5sCitkbmwgQSBidWcgaW4gR05VIGxkIDIuOS4xIGNhdXNlcyBhIHByb2JsZW0gaWYgd2UgbGluayBpbiAtbHcgCitkbmwgdW5kZXIgU29sYXJpcyAyLjYgYmVjYXVzZSBpdCBpcyBzb21lIGZ1bmt5IGVtcHR5IGxpYnJhcnkuCitkbmwgU28gb25seSBsaW5rIGluIGxpYncgaWYgd2UgaGF2ZSB0by4KK0FDX0NIRUNLX0xJQihjLCB3Y3R5cGUsOiAsQUNfQ0hFQ0tfTElCKHcsIHdjdHlwZSkpCisKK2RubCBTZWUgaWYgY29tcGlsZXIgc3VwcG9ydHMgImxvbmcgbG9uZyIgdHlwZS4KKworQUNfTVNHX0NIRUNLSU5HKGZvciBsb25nIGxvbmcgc3VwcG9ydCBpbiBjb21waWxlcikKK0FDX0NBQ0hFX1ZBTChnZGJfY3ZfY19sb25nX2xvbmcsCitbQUNfVFJZX0NPTVBJTEUoLCBbCisgIGV4dGVybiBsb25nIGxvbmcgZm9vOworICBzd2l0Y2ggKGZvbyAmIDIpIHsgY2FzZSAwOiByZXR1cm4gMTsgfQorXSwKK2dkYl9jdl9jX2xvbmdfbG9uZz15ZXMsIGdkYl9jdl9jX2xvbmdfbG9uZz1ubyldKQorQUNfTVNHX1JFU1VMVCgkZ2RiX2N2X2NfbG9uZ19sb25nKQoraWYgdGVzdCAkZ2RiX2N2X2NfbG9uZ19sb25nID0geWVzOyB0aGVuCisgIEFDX0RFRklORShDQ19IQVNfTE9OR19MT05HKQorZmkKKworZG5sIFNlZSBpZiB0aGUgY29tcGlsZXIgYW5kIHJ1bnRpbWUgc3VwcG9ydCBwcmludGluZyBsb25nIGxvbmcKKworQUNfTVNHX0NIRUNLSU5HKGZvciBsb25nIGxvbmcgc3VwcG9ydCBpbiBwcmludGYpCitBQ19DQUNIRV9WQUwoZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19sb25nLAorW0FDX1RSWV9SVU4oWworaW50IG1haW4gKCkgeworICBjaGFyIGJ1ZlszMl07CisgIGxvbmcgbG9uZyBsID0gMDsKKyAgbCA9IChsIDw8IDE2KSArIDB4MDEyMzsKKyAgbCA9IChsIDw8IDE2KSArIDB4NDU2NzsKKyAgbCA9IChsIDw8IDE2KSArIDB4ODlhYjsKKyAgbCA9IChsIDw8IDE2KSArIDB4Y2RlZjsKKyAgc3ByaW50ZiAoYnVmLCAiMHglMDE2bGx4IiwgbCk7CisgIHJldHVybiAoc3RyY21wICgiMHgwMTIzNDU2Nzg5YWJjZGVmIiwgYnVmKSk7Cit9XSwKK2dkYl9jdl9wcmludGZfaGFzX2xvbmdfbG9uZz15ZXMsCitnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2xvbmc9bm8sCitnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2xvbmc9bm8pXSkKK2lmIHRlc3QgJGdkYl9jdl9wcmludGZfaGFzX2xvbmdfbG9uZyA9IHllczsgdGhlbgorICBBQ19ERUZJTkUoUFJJTlRGX0hBU19MT05HX0xPTkcpCitmaQorQUNfTVNHX1JFU1VMVCgkZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19sb25nKQorCitkbmwgU2VlIGlmIGNvbXBpbGVyIHN1cHBvcnRzICJsb25nIGRvdWJsZSIgdHlwZS4gIENhbid0IHVzZSBBQ19DX0xPTkdfRE9VQkxFCitkbmwgYmVjYXVzZSBhdXRvY29uZiBjb21wbGFpbnMgYWJvdXQgY3Jvc3MtY29tcGlsYXRpb24gaXNzdWVzLiAgSG93ZXZlciwgdGhpcworZG5sIGNvZGUgdXNlcyB0aGUgc2FtZSB2YXJpYWJsZXMgYXMgdGhlIG1hY3JvIGZvciBjb21wYXRpYmlsaXR5LgorCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIGxvbmcgZG91YmxlIHN1cHBvcnQgaW4gY29tcGlsZXIpCitBQ19DQUNIRV9WQUwoYWNfY3ZfY19sb25nX2RvdWJsZSwKK1tBQ19UUllfQ09NUElMRSgsIFtsb25nIGRvdWJsZSBmb287XSwKK2FjX2N2X2NfbG9uZ19kb3VibGU9eWVzLCBhY19jdl9jX2xvbmdfZG91YmxlPW5vKV0pCitBQ19NU0dfUkVTVUxUKCRhY19jdl9jX2xvbmdfZG91YmxlKQoraWYgdGVzdCAkYWNfY3ZfY19sb25nX2RvdWJsZSA9IHllczsgdGhlbgorICBBQ19ERUZJTkUoSEFWRV9MT05HX0RPVUJMRSkKK2ZpCisKK2RubCBTZWUgaWYgdGhlIGNvbXBpbGVyIGFuZCBydW50aW1lIHN1cHBvcnQgcHJpbnRpbmcgbG9uZyBkb3VibGVzCisKK0FDX01TR19DSEVDS0lORyhmb3IgbG9uZyBkb3VibGUgc3VwcG9ydCBpbiBwcmludGYpCitBQ19DQUNIRV9WQUwoZ2RiX2N2X3ByaW50Zl9oYXNfbG9uZ19kb3VibGUsCitbQUNfVFJZX1JVTihbCitpbnQgbWFpbiAoKSB7CisgIGNoYXIgYnVmWzE2XTsKKyAgbG9uZyBkb3VibGUgZiA9IDMuMTQxNTkyNjUzOworICBzcHJpbnRmIChidWYsICIlTGciLCBmKTsKKyAgcmV0dXJuIChzdHJuY21wICgiMy4xNDE1OSIsIGJ1ZiwgNykpOworfV0sCitnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2RvdWJsZT15ZXMsCitnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2RvdWJsZT1ubywKK2dkYl9jdl9wcmludGZfaGFzX2xvbmdfZG91YmxlPW5vKV0pCitpZiB0ZXN0ICRnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2RvdWJsZSA9IHllczsgdGhlbgorICBBQ19ERUZJTkUoUFJJTlRGX0hBU19MT05HX0RPVUJMRSkKK2ZpCitBQ19NU0dfUkVTVUxUKCRnZGJfY3ZfcHJpbnRmX2hhc19sb25nX2RvdWJsZSkKKworZG5sIFNlZSBpZiB0aGUgY29tcGlsZXIgYW5kIHJ1bnRpbWUgc3VwcG9ydCBzY2FubmluZyBsb25nIGRvdWJsZXMKKworQUNfTVNHX0NIRUNLSU5HKGZvciBsb25nIGRvdWJsZSBzdXBwb3J0IGluIHNjYW5mKQorQUNfQ0FDSEVfVkFMKGdkYl9jdl9zY2FuZl9oYXNfbG9uZ19kb3VibGUsCitbQUNfVFJZX1JVTihbCitpbnQgbWFpbiAoKSB7CisgIGNoYXIgKmJ1ZiA9ICIzLjE0MTU5MjY1MyI7CisgIGxvbmcgZG91YmxlIGYgPSAwOworICBzc2NhbmYgKGJ1ZiwgIiVMZyIsICZmKTsKKyAgcmV0dXJuICEoZiA+IDMuMTQxNTkgJiYgZiA8IDMuMTQxNjApOworfV0sCitnZGJfY3Zfc2NhbmZfaGFzX2xvbmdfZG91YmxlPXllcywKK2dkYl9jdl9zY2FuZl9oYXNfbG9uZ19kb3VibGU9bm8sCitnZGJfY3Zfc2NhbmZfaGFzX2xvbmdfZG91YmxlPW5vKV0pCitpZiB0ZXN0ICRnZGJfY3Zfc2NhbmZfaGFzX2xvbmdfZG91YmxlID0geWVzOyB0aGVuCisgIEFDX0RFRklORShTQ0FORl9IQVNfTE9OR19ET1VCTEUpCitmaQorQUNfTVNHX1JFU1VMVCgkZ2RiX2N2X3NjYW5mX2hhc19sb25nX2RvdWJsZSkKKworQUNfRlVOQ19NTUFQCisKK2RubCBTZWUgaWYgdGhyZWFkX2RiIGxpYnJhcnkgaXMgYXJvdW5kIGZvciBTb2xhcmlzIHRocmVhZCBkZWJ1Z2dpbmcuICBOb3RlIHRoYXQKK2RubCB3ZSBtdXN0IGV4cGxpY2l0bHkgdGVzdCBmb3IgdmVyc2lvbiAxIG9mIHRoZSBsaWJyYXJ5IGJlY2F1c2UgdmVyc2lvbiAwCitkbmwgKHByZXNlbnQgb24gU29sYXJpcyAyLjQgb3IgZWFybGllcikgZG9lc24ndCBoYXZlIHRoZSBzYW1lIEFQSS4KKworZG5sIE5vdGUgdGhhdCB3ZSBvbmx5IHdhbnQgdGhpcyBpZiB3ZSBhcmUgYm90aCBuYXRpdmUgKGhvc3QgPT0gdGFyZ2V0KSwgYW5kCitkbmwgbm90IGRvaW5nIGEgY2FuYWRpYW4gY3Jvc3MgYnVpbGQgKGJ1aWxkID09IGhvc3QpLgorCitpZiB0ZXN0ICR7YnVpbGR9ID0gJHtob3N0fSAtYSAke2hvc3R9ID0gJHt0YXJnZXR9IDsgdGhlbgorICAgY2FzZSAke2hvc3Rfb3N9IGluCisgICBocHV4KikKKyAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgSFBVWC9PU0YgdGhyZWFkIHN1cHBvcnQpCisgICAgICBpZiB0ZXN0IC1mIC91c3IvaW5jbHVkZS9kY2UvY21hX2NvbmZpZy5oIDsgdGhlbgorICAgICAgICAgaWYgdGVzdCAiJEdDQyIgPSAieWVzIiA7IHRoZW4KKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICAgICAgICAgQUNfREVGSU5FKEhBVkVfSFBVWF9USFJFQURfU1VQUE9SVCkKKyAgICAgICAgICAgIENPTkZJR19PQlM9IiR7Q09ORklHX09KU30gaHB1eC10aHJlYWQubyIKKyAgICAgICAgICAgIENPTkZJR19TUkNTPSIke0NPTkZJR19TUkNTfSBocHV4LXRocmVhZC5jIgorICAgICAgICAgZWxzZQorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubyAoc3VwcHJlc3NlZCBiZWNhdXNlIHlvdSBhcmUgbm90IHVzaW5nIEdDQykpCisgICAgICAgICBmaQorICAgICAgZWxzZQorICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgIGZpCisgICAgICA7OworICAgc29sYXJpcyopCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIFNvbGFyaXMgdGhyZWFkIGRlYnVnZ2luZyBsaWJyYXJ5KQorICAgICAgaWYgdGVzdCAtZiAvdXNyL2xpYi9saWJ0aHJlYWRfZGIuc28uMSA7IHRoZW4KKyAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICAgICAgQUNfREVGSU5FKEhBVkVfVEhSRUFEX0RCX0xJQikKKyAgICAgICAgIENPTkZJR19PQlM9IiR7Q09ORklHX09CU30gc29sLXRocmVhZC5vIgorICAgICAgICAgQ09ORklHX1NSQ1M9IiR7Q09ORklHX1NSQ1N9IHNvbC10aHJlYWQuYyIKKyAgICAgICAgIEFDX0NIRUNLX0xJQihkbCwgZGxvcGVuKQorICAgICAgICAgaWYgdGVzdCAiJEdDQyIgPSAieWVzIiA7IHRoZW4KKyAgICAgICAgICAgICMgVGhlIEdOVSBsaW5rZXIgcmVxdWlyZXMgdGhlIC1leHBvcnQtZHluYW1pYyBvcHRpb24gdG8gbWFrZQorICAgICAgICAgICAgIyBhbGwgc3ltYm9scyB2aXNpYmxlIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KKyAgICAgICAgICAgIGhvbGRfbGRmbGFncz0kTERGTEFHUworICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgbGQgLWV4cG9ydC1keW5hbWljIGZsYWcpCisgICAgICAgICAgICBMREZMQUdTPSIke0xERkxBR1N9IC1XbCwtZXhwb3J0LWR5bmFtaWMiCisgICAgICAgICAgICBBQ19UUllfTElOSygsIFtpbnQgaTtdLCBmb3VuZD15ZXMsIGZvdW5kPW5vKQorICAgICAgICAgICAgTERGTEFHUz0kaG9sZF9sZGZsYWdzCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKCRmb3VuZCkKKyAgICAgICAgICAgIGlmIHRlc3QgJGZvdW5kID0geWVzOyB0aGVuCisgICAgICAgICAgICAgICBDT05GSUdfTERGTEFHUz0iJHtDT05GSUdfTERGTEFHU30gLVdsLC1leHBvcnQtZHluYW1pYyIKKyAgICAgICAgICAgIGZpCisgICAgICAgICBmaQorCSAjIFN1biByYW5kb21seSB0d2Vha2VkIHRoZSBwcm90b3R5cGVzIGluIDxwcm9jX3NlcnZpY2UuaD4KKwkgIyBhdCBvbmUgcG9pbnQuCisJIEFDX01TR19DSEVDS0lORyhpZiA8cHJvY19zZXJ2aWNlLmg+IGlzIG9sZCkKKwkgQUNfQ0FDSEVfVkFMKGdkYl9jdl9wcm9jX3NlcnZpY2VfaXNfb2xkLFsKKwkgICAgQUNfVFJZX0NPTVBJTEUoWworCQkjaW5jbHVkZSA8cHJvY19zZXJ2aWNlLmg+CisJCXBzX2Vycl9lIHBzX3Bkd3JpdGUKKwkJICAgIChzdHJ1Y3QgcHNfcHJvY2hhbmRsZSosIHBzYWRkcl90LCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKwkgICAgXSwsIGdkYl9jdl9wcm9jX3NlcnZpY2VfaXNfb2xkPW5vLAorCSAgICAgICAgZ2RiX2N2X3Byb2Nfc2VydmljZV9pc19vbGQ9eWVzKQorCSBdKQorCSBBQ19NU0dfUkVTVUxUKCRnZGJfY3ZfcHJvY19zZXJ2aWNlX2lzX29sZCkKKwkgaWYgdGVzdCAkZ2RiX2N2X3Byb2Nfc2VydmljZV9pc19vbGQgPSB5ZXM7IHRoZW4KKwkgICAgQUNfREVGSU5FKFBST0NfU0VSVklDRV9JU19PTEQpCisJIGZpCisgICAgICBlbHNlCisgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICAgZmkKKyAgICAgIDs7CisgICBlc2FjCisgICBBQ19TVUJTVChDT05GSUdfTERGTEFHUykKK2ZpCisKK2RubCBIYW5kbGUgb3B0aW9uYWwgZmVhdHVyZXMgdGhhdCBjYW4gYmUgZW5hYmxlZC4KK0VOQUJMRV9DRkxBR1M9CisKK0FDX0FSR19FTkFCTEUodHVpLAorWyAgLS1lbmFibGUtdHVpICAgICAgICAgICAgRW5hYmxlIGZ1bGwtc2NyZWVuIHRlcm1pbmFsIHVzZXIgaW50ZXJmYWNlXSwKK1sKKyAgY2FzZSAiJHtlbmFibGVfdHVpfSIgaW4KKyAgICB5ZXMgfCBubykgOzsKKyAgICAiIikgIGVuYWJsZV90dWk9eWVzIDs7CisgICAgKikKKyAgICAgIEFDX01TR19FUlJPUihCYWQgdmFsdWUgZm9yIC0tZW5hYmxlLXR1aTogJHtlbmFibGV2YWx9KQorICAgIDs7CisgIGVzYWMKK10pCitjYXNlICR7ZW5hYmxlX3R1aX0gaW4KKyAgInllcyIgKQorICAgIEFDX0RFRklORShUVUkpCisgICAgQlVJTERfVFVJPWFsbC10dWkKKyAgICBUVUlfTElCUkFSWT10dWkvbGlidHVpLmEKKyAgOzsKKyAgKiApCisgICAgQlVJTERfVFVJPQorICAgIFRVSV9MSUJSQVJZPQorICA7OworZXNhYworQUNfU1VCU1QoQlVJTERfVFVJKQorQUNfU1VCU1QoVFVJX0xJQlJBUlkpCisKK0FDX0FSR19FTkFCTEUobmV0cm9tLAorWyAgLS1lbmFibGUtbmV0cm9tICAgICAgICAgRW5hYmxlIE5ldFJPTSBzdXBwb3J0XSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCit5ZXMpCWVuYWJsZV9uZXRyb209eWVzIDs7CitubykJZW5hYmxlX25ldHJvbT1ubyA7OworKikJQUNfTVNHX0VSUk9SKGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZ2l2ZW4gZm9yIG5ldHJvbSBvcHRpb24pIDs7Citlc2FjXSkKKworaWYgdGVzdCAiJHtlbmFibGVfbmV0cm9tfSIgPSAieWVzIjsgdGhlbgorCUNPTkZJR19PQlM9IiR7Q09ORklHX09CU30gcmVtb3RlLW5yb20ubyIgCisgICAgICAgIENPTkZJR19TUkNTPSIke0NPTkZJR19TUkNTfSByZW1vdGUtbnJvbS5jIgorZmkKKworQUNfQVJHX0VOQUJMRShidWlsZC13YXJuaW5ncywKK1sgIC0tZW5hYmxlLWJ1aWxkLXdhcm5pbmdzIEVuYWJsZSBidWlsZC10aW1lIGNvbXBpbGVyIHdhcm5pbmdzIGlmIGdjYyBpcyB1c2VkXSwKK1tidWlsZF93YXJuaW5ncz0iLVdhbGwgLVdwb2ludGVyLWFyaXRoIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyIKK2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQk7OworICBubykJYnVpbGRfd2FybmluZ3M9Ii13Ijs7CisgICwqKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAorICAgICAgICBidWlsZF93YXJuaW5ncz0iJHtidWlsZF93YXJuaW5nc30gJHt0fSI7OworICAqLCkgICB0PWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImAKKyAgICAgICAgYnVpbGRfd2FybmluZ3M9IiR7dH0gJHtidWlsZF93YXJuaW5nc30iOzsKKyAgKikgICAgYnVpbGRfd2FybmluZ3M9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYDs7Citlc2FjXSxbYnVpbGRfd2FybmluZ3M9IiJdKWRubAorCitpZiB0ZXN0ICJ4JHtidWlsZF93YXJuaW5nc30iICE9IHggLWEgIngkR0NDIiA9IHh5ZXMKK3RoZW4KKyAgIFdBUk5fQ0ZMQUdTPSIke2J1aWxkX3dhcm5pbmdzfSIKK2Vsc2UKKyAgIFdBUk5fQ0ZMQUdTPSIiCitmaQorQUNfU1VCU1QoV0FSTl9DRkxBR1MpCisKK01NQUxMT0NfQ0ZMQUdTPQorTU1BTExPQz0KK0FDX1NVQlNUKE1NQUxMT0NfQ0ZMQUdTKQorQUNfU1VCU1QoTU1BTExPQykKKworQUNfQVJHX1dJVEgobW1hbGxvYywKK1sgIC0td2l0aC1tbWFsbG9jICAgICAgICAgIFVzZSBtZW1vcnkgbWFwcGVkIG1hbGxvYyBwYWNrYWdlXSwKK1tjYXNlICIke3dpdGh2YWx9IiBpbgorICB5ZXMpICB3YW50X21tYWxsb2M9dHJ1ZSA7OworICBubykgICB3YW50X21tYWxsb2M9ZmFsc2U7OworICAqKSAgICBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7d2l0aHZhbH0gZm9yIEdEQiB3aXRoLW1tYWxsb2Mgb3B0aW9uKSA7OworZXNhY10sW3dhbnRfbW1hbGxvYz1mYWxzZV0pZG5sCisKK2lmIHRlc3QgeCR3YW50X21tYWxsb2MgPSB4dHJ1ZTsgdGhlbgorICAgQUNfREVGSU5FKFVTRV9NTUFMTE9DKQorICAgQUNfREVGSU5FKE1NQ0hFQ0tfRk9SQ0UpCisgICBNTUFMTE9DX0NGTEFHUz0iLUkkc3JjZGlyLy4uL21tYWxsb2MiCisgICBNTUFMTE9DPScuLi9tbWFsbG9jL2xpYm1tYWxsb2MuYScKK2ZpCisKK2RubCBGaWd1cmUgb3V0IHdoaWNoIHRlcm0gbGlicmFyeSB0byB1c2UuCitpZiB0ZXN0IHgkZ2RiX2N2X29zX2N5Z3dpbiA9IHh5ZXM7IHRoZW4KKyAgVEVSTV9MSUI9J2BpZiB0ZXN0IC1yIC4uL2xpYnRlcm1jYXAvbGlidGVybWNhcC5hOyB0aGVuIGVjaG8gLi4vbGlidGVybWNhcC9saWJ0ZXJtY2FwLmE7IGVsc2UgZWNobyAtbHRlcm1jYXA7IGZpYCcKK2Vsc2UKKyAgVEVSTV9MSUI9CisgIEFDX0NIRUNLX0xJQihuY3Vyc2VzLCB0Z2V0ZW50LCBURVJNX0xJQj0tbG5jdXJzZXMsCisgICAgQUNfQ0hFQ0tfTElCKEhjdXJzZXMsIHRnZXRlbnQsIFRFUk1fTElCPS1sSGN1cnNlcywKKyAgICAgIEFDX0NIRUNLX0xJQih0ZXJtbGliLCB0Z2V0ZW50LCBURVJNX0xJQj0tbHRlcm1saWIsCisgICAgICAgIEFDX0NIRUNLX0xJQih0ZXJtY2FwLCB0Z2V0ZW50LCBURVJNX0xJQj0tbHRlcm1jYXAsCisJICBBQ19DSEVDS19MSUIoY3Vyc2VzLCB0Z2V0ZW50LCBURVJNX0xJQj0tbGN1cnNlcywKKwkgICAgQUNfQ0hFQ0tfTElCKHRlcm1pbmZvLCB0Z2V0ZW50LCBURVJNX0xJQj0tbHRlcm1pbmZvKSkpKSkpCisKKyAgaWYgdGVzdCAieCRURVJNX0xJQiIgPSB4CisgIHRoZW4KKyAgICBBQ19NU0dfRVJST1IoQ291bGQgbm90IGZpbmQgYSB0ZXJtIGxpYnJhcnksIGUuZy4gdGVybWNhcCBvciB0ZXJtbGliISkKKyAgZmkKK2ZpCitBQ19TVUJTVChURVJNX0xJQikKKworCitBQ19QQVRIX1gKKworQUNfU1VCU1QoRU5BQkxFX0NGTEFHUykKKworQUNfU1VCU1QoQ09ORklHX09CUykKK0FDX1NVQlNUKENPTkZJR19ERVBTKQorQUNfU1VCU1QoQ09ORklHX1NSQ1MpCisKKyMgQmVnaW4gc3R1ZmYgdG8gc3VwcG9ydCAtLWVuYWJsZS1zaGFyZWQKK0FDX0FSR19FTkFCTEUoc2hhcmVkLAorWyAgLS1lbmFibGUtc2hhcmVkICAgICAgICAgVXNlIHNoYXJlZCBsaWJyYXJpZXNdLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKSBzaGFyZWQ9dHJ1ZSA7OworICBubykgIHNoYXJlZD1mYWxzZSA7OworICAqKSBzaGFyZWQ9dHJ1ZSA7OworZXNhY10pZG5sCisKK0hMREZMQUdTPQorSExERU5WPQorIyBJZiB3ZSBoYXZlIHNoYXJlZCBsaWJyYXJpZXMsIHRyeSB0byBzZXQgcnBhdGggcmVhc29uYWJseS4KK2lmIHRlc3QgIiR7c2hhcmVkfSIgPSAidHJ1ZSI7IHRoZW4KKyAgY2FzZSAiJHtob3N0fSIgaW4KKyAgKi0qLWhwdXgqKQorICAgIEhMREZMQUdTPSctV2wsK3MsK2IsJChsaWJkaXIpJworICAgIDs7CisgICotKi1pcml4NSogfCAqLSotaXJpeDYqKQorICAgIEhMREZMQUdTPSctV2wsLXJwYXRoLCQobGliZGlyKScKKyAgICA7OworICAqLSotbGludXgqYW91dCopCisgICAgOzsKKyAgKi0qLWxpbnV4KiB8ICotcGMtbGludXgtZ251KQorICAgIEhMREZMQUdTPSctV2wsLXJwYXRoLCQobGliZGlyKScKKyAgICA7OworICAqLSotc29sYXJpcyopCisgICAgSExERkxBR1M9Jy1SICQobGliZGlyKScKKyAgICA7OworICAqLSotc3lzdjQqKQorICAgIEhMREVOVj0naWYgdGVzdCAteiAiJCR7TERfUlVOX1BBVEh9IjsgdGhlbiBMRF9SVU5fUEFUSD0kKGxpYmRpcik7IGVsc2UgTERfUlVOX1BBVEg9JCR7TERfUlVOX1BBVEh9OiQobGliZGlyKTsgZmk7IGV4cG9ydCBMRF9SVU5fUEFUSDsnCisgICAgOzsKKyAgZXNhYworZmkKKworIyBPbiBTdW5PUywgaWYgdGhlIGxpbmtlciBzdXBwb3J0cyB0aGUgLXJwYXRoIG9wdGlvbiwgdXNlIGl0IHRvCisjIHByZXZlbnQgLi4vYmZkIGFuZCAuLi9vcGNvZGVzIGZyb20gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIHJ1biB0aW1lCisjIHNlYXJjaCBwYXRoLgorY2FzZSAiJHtob3N0fSIgaW4KKyAgKi0qLXN1bm9zKikKKyAgICBlY2hvICdtYWluICgpIHsgfScgPiBjb25mdGVzdC5jCisgICAgJHtDQ30gLW8gY29uZnRlc3QgLVdsLC1ycGF0aD0gY29uZnRlc3QuYyA+L2Rldi9udWxsIDI+Y29uZnRlc3QudAorICAgIGlmIGdyZXAgJ3VucmVjb2duaXplZCcgY29uZnRlc3QudCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIDoKKyAgICBlbGlmIGdyZXAgJ05vIHN1Y2ggZmlsZScgY29uZnRlc3QudCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIDoKKyAgICBlbGlmIGdyZXAgJ2RvIG5vdCBtaXgnIGNvbmZ0ZXN0LnQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICA6CisgICAgZWxpZiBncmVwICdzb21lIHRleHQgYWxyZWFkeSBsb2FkZWQnIGNvbmZ0ZXN0LnQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICA6CisgICAgZWxpZiB0ZXN0ICIke3NoYXJlZH0iID0gInRydWUiOyB0aGVuCisgICAgICBITERGTEFHUz0nLVdsLC1ycGF0aD0kKGxpYmRpciknCisgICAgZWxzZQorICAgICAgSExERkxBR1M9Jy1XbCwtcnBhdGg9JworICAgIGZpCisgICAgcm0gLWYgY29uZnRlc3QudCBjb25mdGVzdC5jIGNvbmZ0ZXN0CisgICAgOzsKK2VzYWMKK0FDX1NVQlNUKEhMREZMQUdTKQorQUNfU1VCU1QoSExERU5WKQorIyBFbmQgc3R1ZmYgdG8gc3VwcG9ydCAtLWVuYWJsZS1zaGFyZWQKKworIyB0YXJnZXRfc3ViZGlyIGlzIHVzZWQgYnkgdGhlIHRlc3RzdWl0ZSB0byBmaW5kIHRoZSB0YXJnZXQgbGlicmFyaWVzLgordGFyZ2V0X3N1YmRpcj0KK2lmIHRlc3QgIiR7aG9zdH0iICE9ICIke3RhcmdldH0iOyB0aGVuCisgICAgdGFyZ2V0X3N1YmRpcj0iJHt0YXJnZXRfYWxpYXN9LyIKK2ZpCitBQ19TVUJTVCh0YXJnZXRfc3ViZGlyKQorCitmcmFncz0KK2hvc3RfbWFrZWZpbGVfZnJhZz0ke3NyY2Rpcn0vY29uZmlnLyR7Z2RiX2hvc3RfY3B1fS8ke2dkYl9ob3N0fS5taAoraWYgdGVzdCAhIC1mICR7aG9zdF9tYWtlZmlsZV9mcmFnfTsgdGhlbgorQUNfTVNHX0VSUk9SKCIqKiogR2RiIGRvZXMgbm90IHN1cHBvcnQgaG9zdCAke2hvc3R9IikKK2ZpCitmcmFncz0iJGZyYWdzICRob3N0X21ha2VmaWxlX2ZyYWciCisKK3RhcmdldF9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS9jb25maWcvJHtnZGJfdGFyZ2V0X2NwdX0vJHtnZGJfdGFyZ2V0fS5tdAoraWYgdGVzdCAhIC1mICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9OyB0aGVuCitBQ19NU0dfRVJST1IoIioqKiBHZGIgZG9lcyBub3Qgc3VwcG9ydCB0YXJnZXQgJHt0YXJnZXR9IikKK2ZpCitmcmFncz0iJGZyYWdzICR0YXJnZXRfbWFrZWZpbGVfZnJhZyIKKworQUNfU1VCU1RfRklMRShob3N0X21ha2VmaWxlX2ZyYWcpCitBQ19TVUJTVF9GSUxFKHRhcmdldF9tYWtlZmlsZV9mcmFnKQorQUNfU1VCU1QoZnJhZ3MpCisKK2NoYW5nZXF1b3RlKCwpZG5sCitob3N0ZmlsZT1gc2VkIC1uICcKK3MvWE1fRklMRVsgCV0qPVsgCV0qXChbXiAJXSpcKS9cMS9wCisnICR7aG9zdF9tYWtlZmlsZV9mcmFnfWAKKwordGFyZ2V0ZmlsZT1gc2VkIC1uICcKK3MvVE1fRklMRVsgCV0qPVsgCV0qXChbXiAJXSpcKS9cMS9wCisnICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9YAorCisjIHRoZXNlIHJlYWxseSBhcmVuJ3Qgb3J0aG9nb25hbCB0cnVlL2ZhbHNlIHZhbHVlcyBvZiB0aGUgc2FtZSBjb25kaXRpb24sCisjIGJ1dCBzaGVsbHMgYXJlIHNsb3cgZW5vdWdoIHRoYXQgSSBsaWtlIHRvIHJldXNlIHRoZSB0ZXN0IGNvbmRpdGlvbnMKKyMgd2hlbmV2ZXIgcG9zc2libGUKK2lmIHRlc3QgIiR7dGFyZ2V0fSIgPSAiJHtob3N0fSI7IHRoZW4KK25hdGl2ZWZpbGU9YHNlZCAtbiAnCitzL05BVF9GSUxFWyAJXSo9WyAJXSpcKFteIAldKlwpL1wxL3AKKycgJHtob3N0X21ha2VmaWxlX2ZyYWd9YAorIyBlbHNlCisjIEdEQnNlcnZlciBpcyBvbmx5IHVzZWZ1bCBpbiBhICJuYXRpdmUiIGVudmlyb21lbnQKKyMgY29uZmlnZGlycz1gZWNobyAkY29uZmlnZGlycyB8IHNlZCAncy9nZGJzZXJ2ZXIvLydgCitmaQorY2hhbmdlcXVvdGUoWyxdKQorCisjIElmIGhvc3RmaWxlIChYTV9GSUxFKSBhbmQvb3IgdGFyZ2V0ZmlsZSAoVE1fRklMRSkgYW5kL29yIG5hdGl2ZWZpbGUKKyMgKE5BVF9GSUxFKSBpcyBub3Qgc2V0IGluIGNvbmZpZy8qLyoubVtodF0gZmlsZXMsIHdlIGRvbid0IG1ha2UgdGhlCisjIGNvcnJlc3BvbmRpbmcgbGlua3MuICBCdXQgd2UgaGF2ZSB0byByZW1vdmUgdGhlIHhtLmggZmlsZXMgYW5kIHRtLmgKKyMgZmlsZXMgYW55d2F5LCBlLmcuIHdoZW4gc3dpdGNoaW5nIGZyb20gImNvbmZpZ3VyZSBob3N0IiB0bworIyAiY29uZmlndXJlIG5vbmUiLgorCitmaWxlcz0KK2xpbmtzPQorcm0gLWYgeG0uaAoraWYgdGVzdCAiJHtob3N0ZmlsZX0iICE9ICIiOyB0aGVuCitmaWxlcz0iJHtmaWxlc30gY29uZmlnLyR7Z2RiX2hvc3RfY3B1fS8ke2hvc3RmaWxlfSIKK2xpbmtzPSIke2xpbmtzfSB4bS5oIgorZmkKK3JtIC1mIHRtLmgKK2lmIHRlc3QgIiR7dGFyZ2V0ZmlsZX0iICE9ICIiOyB0aGVuCitmaWxlcz0iJHtmaWxlc30gY29uZmlnLyR7Z2RiX3RhcmdldF9jcHV9LyR7dGFyZ2V0ZmlsZX0iCitsaW5rcz0iJHtsaW5rc30gdG0uaCIKK2ZpCitybSAtZiBubS5oCitpZiB0ZXN0ICIke25hdGl2ZWZpbGV9IiAhPSAiIjsgdGhlbgorZmlsZXM9IiR7ZmlsZXN9IGNvbmZpZy8ke2dkYl9ob3N0X2NwdX0vJHtuYXRpdmVmaWxlfSIKK2xpbmtzPSIke2xpbmtzfSBubS5oIgorZWxzZQorIyBBIGNyb3NzLW9ubHkgY29uZmlndXJhdGlvbi4KK2ZpbGVzPSIke2ZpbGVzfSBjb25maWcvbm0tZW1wdHkuaCIKK2xpbmtzPSIke2xpbmtzfSBubS5oIgorZmkKKworQUNfTElOS19GSUxFUygkZmlsZXMsICRsaW5rcykKKworZG5sIENoZWNrIGZvciBleGUgZXh0ZW5zaW9uIHNldCBvbiBjZXJ0YWluIGhvc3RzIChlLmcuIFdpbjMyKQorQUNfRVhFRVhUCisKK0FDX0NPTkZJR19TVUJESVJTKCRjb25maWdkaXJzKQorQUNfT1VUUFVUKE1ha2VmaWxlIHR1aS9NYWtlZmlsZSAuZ2RiaW5pdDpnZGJpbml0LmluLAorWworZG5sIEF1dG9jb25mIGRvZXNuJ3QgcHJvdmlkZSBhIG1lY2hhbmlzbSBmb3IgbW9kaWZ5aW5nIGRlZmluaXRpb25zIAorZG5sIHByb3ZpZGVkIGJ5IG1ha2VmaWxlIGZyYWdtZW50cy4KK2RubAoraWYgdGVzdCAiJHtuYXRpdmVmaWxlfSIgPSAiIjsgdGhlbgorc2VkIC1lICcvXk5BVERFUEZJTEVTW1sgCV1dKj1bWyAJXV0qL3MvLyMgTkFUREVQRklMRVM9LycgXAorCTwgTWFrZWZpbGUgPiBNYWtlZmlsZS50ZW0KK212IC1mIE1ha2VmaWxlLnRlbSBNYWtlZmlsZQorZmkKKworY2hhbmdlcXVvdGUoLClkbmwKK3NlZCAtZSAnL15UTV9GSUxFWyAJXSo9L3MsXlRNX0ZJTEVbIAldKj1bIAldKiwmY29uZmlnLyciJHtnZGJfdGFyZ2V0X2NwdX0iJy8sCisvXlhNX0ZJTEVbIAldKj0vcyxeWE1fRklMRVsgCV0qPVsgCV0qLCZjb25maWcvJyIke2dkYl9ob3N0X2NwdX0iJy8sCisvXk5BVF9GSUxFWyAJXSo9L3MsXk5BVF9GSUxFWyAJXSo9WyAJXSosJmNvbmZpZy8nIiR7Z2RiX2hvc3RfY3B1fSInLywnIDxNYWtlZmlsZSA+TWFrZWZpbGUudG1wCittdiAtZiBNYWtlZmlsZS50bXAgTWFrZWZpbGUKK2NoYW5nZXF1b3RlKFssXSlkbmwKKworY2FzZSB4JENPTkZJR19IRUFERVJTIGluCit4Y29uZmlnLmg6Y29uZmlnLmluKQorZWNobyA+IHN0YW1wLWggOzsKK2VzYWMKK10sCitbCitnZGJfaG9zdF9jcHU9JGdkYl9ob3N0X2NwdQorZ2RiX3RhcmdldF9jcHU9JGdkYl90YXJnZXRfY3B1CituYXRpdmVmaWxlPSRuYXRpdmVmaWxlCitdKQorCitleGl0IDAKZGlmZiAtLWdpdCBhL2dkYi9jb25maWd1cmUudGd0IGIvZ2RiL2NvbmZpZ3VyZS50Z3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmYzI3NAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb25maWd1cmUudGd0CkBAIC0wLDAgKzEsMjgyIEBACisjIE1hcHBpbmdzIGZyb20gY29uZmlndXJhdGlvbnMgdG8gR0RCIHRhcmdldCBkZWZpbml0aW9ucy4gIFRoaXMgaXMKKyMgaW52b2tlZCBmcm9tIHRoZSBhdXRvY29uZiBnZW5lcmF0ZWQgY29uZmlndXJlIHNjcmlwdC4KKworIyBUaGlzIGZpbGUgc2V0cyB0aGUgZm9sbG93aW5nIHNoZWxsIHZhcmlhYmxlczoKKyMgIGdkYl90YXJnZXRfY3B1CWdlbmVyaWMgbmFtZSBvZiBDUFUKKyMgIGdkYl90YXJnZXQJCW5hbWUgb2YgR0RCIHRhcmdldCBkZWZpbml0aW9uIHRvIHVzZQorCisjIFRoaXMgZmlsZSBtYXkgYWxzbyBtb2RpZnkgY29uZmlnZGlycy4KKworIyBNYXAgdGFyZ2V0IGNwdSBpbnRvIHRoZSBjb25maWcgY3B1IHN1YmRpcmVjdG9yeSBuYW1lLgorIyBUaGUgZGVmYXVsdCBpcyAkdGFyZ2V0X2NwdS4KKworY2FzZSAiJHt0YXJnZXRfY3B1fSIgaW4KKworYWxwaGEqKQkJCWdkYl90YXJnZXRfY3B1PWFscGhhIDs7CitjWzEyXSkJCQlnZGJfdGFyZ2V0X2NwdT1jb252ZXggOzsKK2hwcGEqKQkJCWdkYl90YXJnZXRfY3B1PXBhIDs7CitpWzM0NTZdODYqKQkJZ2RiX3RhcmdldF9jcHU9aTM4NiA7OworbTY4KikJCQlnZGJfdGFyZ2V0X2NwdT1tNjhrIDs7CittODgqKQkJCWdkYl90YXJnZXRfY3B1PW04OGsgOzsKK21pcHMqKQkJCWdkYl90YXJnZXRfY3B1PW1pcHMgOzsKKyMgT0JTT0xFVEUgbnAxKQkJCWdkYl90YXJnZXRfY3B1PWdvdWxkIDs7Citwb3dlcnBjKikJCWdkYl90YXJnZXRfY3B1PXBvd2VycGMgOzsKKyMgT0JTT0xFVEUgcG4pCQkJZ2RiX3RhcmdldF9jcHU9Z291bGQgOzsKK3B5cmFtaWQpCQlnZGJfdGFyZ2V0X2NwdT1weXIgOzsKK3NwYXJjKikJCQlnZGJfdGFyZ2V0X2NwdT1zcGFyYyA7OwordGh1bWIqKQkJCWdkYl90YXJnZXRfY3B1PWFybSA7Oworc3Ryb25nYXJtKikJCWdkYl90YXJnZXRfY3B1PWFybSA7Owordjg1MCopCQkJZ2RiX3RhcmdldF9jcHU9djg1MCA7OworKikJCQlnZGJfdGFyZ2V0X2NwdT0kdGFyZ2V0X2NwdSA7OworCitlc2FjCisKKyMgbWFwIHRhcmdldCBpbmZvIGludG8gZ2RiIG5hbWVzLgorCitjYXNlICIke3RhcmdldH0iIGluCisKK2EyOWstKi1hb3V0KikJCWdkYl90YXJnZXQ9YTI5ayA7OworYTI5ay0qLWNvZmYqKQkJZ2RiX3RhcmdldD1hMjlrIDs7CithMjlrLSotZWxmKikJCWdkYl90YXJnZXQ9YTI5ayA7OworYTI5ay0qLWVibW9uKikJCWdkYl90YXJnZXQ9YTI5ayA7OworYTI5ay0qLWtlcm4qKQkJZ2RiX3RhcmdldD1hMjlrLWtlcm4gOzsKK2EyOWstKi1ub25lKikJCWdkYl90YXJnZXQ9YTI5ayA7OworYTI5ay0qLXN5bTEqKQkJZ2RiX3RhcmdldD11bHRyYTMgOzsKK2EyOWstKi11ZGkqKQkJZ2RiX3RhcmdldD1hMjlrLXVkaSA7OworYTI5ay0qLXZ4d29ya3MqKSAgICAgICAgZ2RiX3RhcmdldD12eDI5ayA7OworCithbHBoYSotKi1vc2YqKQkJZ2RiX3RhcmdldD1hbHBoYS1vc2YxIDs7CithbHBoYSotKi1saW51eCopCWdkYl90YXJnZXQ9YWxwaGEtbGludXggOzsKKworYXJjLSotKikJCWdkYl90YXJnZXQ9YXJjIDs7CisKK2FybS0qLSogfCB0aHVtYi0qLSogfCBzdHJvbmdhcm0tKi0qKQlnZGJfdGFyZ2V0PWFybQorCisJCQkjIHJkaSBkb2Vzbid0IHdvcmsgZm9yIHdpbmdkYiB5ZXQKKwkJCWNhc2UgJGdkYl9ob3N0IGluCisJCQl3aW5kb3dzKSA7OworCQkJKikKKwkJCSAgICBjb25maWdkaXJzPSIkY29uZmlnZGlycyByZGktc2hhcmUiCisJCQkgICAgQ09ORklHX09CUz0iJENPTkZJR19PQlMgcmVtb3RlLXJkaS5vIHJkaS1zaGFyZS9saWJhbmdzZC5hIgorCQkJICAgIDs7CisJCQllc2FjCisJCQk7OworCitjMS0qLSopCQkJZ2RiX3RhcmdldD1jb252ZXggOzsKK2MyLSotKikJCQlnZGJfdGFyZ2V0PWNvbnZleCA7OworCitkMTB2LSotKikJCWdkYl90YXJnZXQ9ZDEwdiA7OworZDMwdi0qLSopCQlnZGJfdGFyZ2V0PWQzMHYgOzsKKworaDgzMDAtKi0qKQkJZ2RiX3RhcmdldD1oODMwMCA7OworaDg1MDAtKi0qKQkJZ2RiX3RhcmdldD1oODUwMCA7OworCitzaC0qLSopCQkJZ2RiX3RhcmdldD1zaCA7OworCitmcjMwLSotZWxmKikJCWdkYl90YXJnZXQ9ZnIzMCA7OworCitocHBhKi0qLWJzZCopCQlnZGJfdGFyZ2V0PWhwcGFic2QgOzsKK2hwcGEqLSotcHJvKikJCWdkYl90YXJnZXQ9aHBwYXBybyA7OworaHBwYSotKi1ocHV4KikJCWdkYl90YXJnZXQ9aHBwYWhwdXggOzsKK2hwcGEqLSotaGl1eCopCQlnZGJfdGFyZ2V0PWhwcGFocHV4IDs7CitocHBhKi0qLW9zZiopCQlnZGJfdGFyZ2V0PWhwcGFvc2YgOzsKKworaVszNDU2XTg2LXNlcXVlbnQtYnNkKikJZ2RiX3RhcmdldD1zeW1tZXRyeSA7OworaVszNDU2XTg2LXNlcXVlbnQtc3lzdjQqKSBnZGJfdGFyZ2V0PXB0eDQgOzsKK2lbMzQ1Nl04Ni1zZXF1ZW50LXN5c3YqKSBnZGJfdGFyZ2V0PXB0eCA7OworaVszNDU2XTg2LW5jci0qKQlnZGJfdGFyZ2V0PW5jcjMwMDAgOzsKK2lbMzQ1Nl04Ni0qLWFvdXQqKQlnZGJfdGFyZ2V0PWkzODZhb3V0IDs7CitpWzM0NTZdODYtKi1jb2ZmKikJZ2RiX3RhcmdldD1pMzg2diA7OworaVszNDU2XTg2LSotZWxmKikJZ2RiX3RhcmdldD1pMzg2diA7OworaVszNDU2XTg2LSotYWl4KikJZ2RiX3RhcmdldD1pMzg2YWl4IDs7CitpWzM0NTZdODYtKi1ic2QqKQlnZGJfdGFyZ2V0PWkzODZic2QgOzsKK2lbMzQ1Nl04Ni0qLWZyZWVic2QqKQlnZGJfdGFyZ2V0PWZic2QgOzsKK2lbMzQ1Nl04Ni0qLW5ldGJzZCopCWdkYl90YXJnZXQ9bmJzZCA7OworaVszNDU2XTg2LSotb3M5aykJZ2RiX3RhcmdldD1pMzg2b3M5ayA7OworaVszNDU2XTg2LSotZ28zMiopCWdkYl90YXJnZXQ9aTM4NmFvdXQgOzsKK2lbMzQ1Nl04Ni0qLWx5bnhvcyopCWdkYl90YXJnZXQ9aTM4Nmx5bngKKwkJY29uZmlnZGlycz0iJHtjb25maWdkaXJzfSBnZGJzZXJ2ZXIiIDs7CitpWzM0NTZdODYtKi1zb2xhcmlzKikJZ2RiX3RhcmdldD1pMzg2c29sMiA7OworaVszNDU2XTg2LSotc3Vub3MqKQlnZGJfdGFyZ2V0PXN1bjM4NiA7OworaVszNDU2XTg2LSotc3lzdjQuMk1QKQlnZGJfdGFyZ2V0PWkzODZ2NDJtcCA7OworaVszNDU2XTg2LSotc3lzdjQuMnV3MiopCWdkYl90YXJnZXQ9aTM4NnY0Mm1wIDs7CitpWzM0NTZdODYtKi1zeXN2NCopCWdkYl90YXJnZXQ9aTM4NnY0IDs7CitpWzM0NTZdODYtKi11bml4d2FyZTIqKQlnZGJfdGFyZ2V0PWkzODZ2NDJtcCA7OworaVszNDU2XTg2LSotdW5peHdhcmUqKQlnZGJfdGFyZ2V0PWkzODZ2NCA7OworaVszNDU2XTg2LSotc2NvMy4ydjQqKQlnZGJfdGFyZ2V0PWkzODZzY280IDs7CitpWzM0NTZdODYtKi1zY28zLjJ2NSopCWdkYl90YXJnZXQ9aTM4NnNjbzUgOzsKK2lbMzQ1Nl04Ni0qLXNjbyopCWdkYl90YXJnZXQ9aTM4NnYgOzsKK2lbMzQ1Nl04Ni0qLXN5c3YqKQlnZGJfdGFyZ2V0PWkzODZ2IDs7CitpWzM0NTZdODYtKi1saW51eCopCWdkYl90YXJnZXQ9bGludXgKKwkJY29uZmlnZGlycz0iJHtjb25maWdkaXJzfSBnZGJzZXJ2ZXIiIDs7CitpWzM0NTZdODYtcGMtbGludXgtZ251KQlnZGJfdGFyZ2V0PWxpbnV4CisJCWNvbmZpZ2RpcnM9IiR7Y29uZmlnZGlyc30gZ2Ric2VydmVyIiA7OworaVszNDU2XTg2LSotaXNjKikJZ2RiX3RhcmdldD1pMzg2diA7OworaVszNDU2XTg2LSotbWFjaDMqKQlnZGJfdGFyZ2V0PWkzODZtMyA7OworaVszNDU2XTg2LSotZ251KikJZ2RiX3RhcmdldD1pMzg2Z251IDs7CitpWzM0NTZdODYtKi1uZXR3YXJlKikJZ2RiX3RhcmdldD1pMzg2bncKKwkJY29uZmlnZGlycz0iJHtjb25maWdkaXJzfSBubG0iIDs7CitpWzM0NTZdODYtKi1vc2YxbWsqKQlnZGJfdGFyZ2V0PWkzODZtayA7OworaVszNDU2XTg2LSotY3lnd2luKikJZ2RiX3RhcmdldD1jeWd3aW4gIDs7CitpOTYwLSotYm91dCopCQlnZGJfdGFyZ2V0PXZ4d29ya3M5NjAgOzsKK2k5NjAtbmluZHktY29mZiopCWdkYl90YXJnZXQ9bmluZHk5NjAgOzsKK2k5NjAtKi1jb2ZmKikJCWdkYl90YXJnZXQ9bW9uOTYwIDs7CitpOTYwLW5pbmR5LWVsZiopCWdkYl90YXJnZXQ9bmluZHk5NjAgOzsKK2k5NjAtKi1lbGYqKQkJZ2RiX3RhcmdldD1tb245NjAgOzsKKworaTk2MC0qLW5pbmR5KikJCWdkYl90YXJnZXQ9bmluZHk5NjAgOzsKK2k5NjAtKi12eHdvcmtzKikJZ2RiX3RhcmdldD12eHdvcmtzOTYwIDs7CisKK20zMnItKi1lbGYqKQkJZ2RiX3RhcmdldD1tMzJyIDs7CisKK202ODAwMC0qLXN1bm9zMyopCWdkYl90YXJnZXQ9c3VuMm9zMyA7OworbTY4MDAwLSotc3Vub3M0KikJZ2RiX3RhcmdldD1zdW4yb3M0IDs7CisKK202OCotYXBvbGxvKi1ic2QqKQlnZGJfdGFyZ2V0PWFwb2xsbzY4YiA7OworbTY4Ki1idWxsLXN5c3YqKQlnZGJfdGFyZ2V0PWRweDIgOzsKK202OCotaHAtYnNkKikJCWdkYl90YXJnZXQ9aHAzMDBic2QgOzsKK202OCotaHAtaHB1eCopCQlnZGJfdGFyZ2V0PWhwMzAwaHB1eCA7OworbTY4Ki1hbHRvcy0qKQkJZ2RiX3RhcmdldD1hbHRvcyA7OworbTY4Ki1hdHQtKikJCWdkYl90YXJnZXQ9M2IxIDs7CittNjgqLWNpc2NvKi0qKQkJZ2RiX3RhcmdldD1jaXNjbyA7OworbTY4Ki1lcmljc3Nvbi0qKQlnZGJfdGFyZ2V0PWVzMTgwMCA7OworbTY4Ki1pc2ktKikJCWdkYl90YXJnZXQ9aXNpIDs7CittNjgqLW1vdG9yb2xhLSopCWdkYl90YXJnZXQ9ZGVsdGE2OCA7OworbTY4Ki1uZXR4LSopCQlnZGJfdGFyZ2V0PXZ4d29ya3M2OCA7OworbTY4Ki1zb255LSopCQlnZGJfdGFyZ2V0PW5ld3MgOzsKK202OCotdGFuZGVtLSopCQlnZGJfdGFyZ2V0PXN0MjAwMCA7OworbTY4Ki1yb202OGstKikgICAgICAgICAgZ2RiX3RhcmdldD1tb25pdG9yIDs7CittNjgqLSpidWctKikgICAgICAgICAgICBnZGJfdGFyZ2V0PW1vbml0b3IgOzsKK202OCotbW9uaXRvci0qKSAgICAgICAgIGdkYl90YXJnZXQ9bW9uaXRvciA7OworbTY4Ki1lc3QtKikJCWdkYl90YXJnZXQ9bW9uaXRvciA7OworbTY4Ki0qLWFvdXQqKQkJZ2RiX3RhcmdldD1tb25pdG9yIDs7CittNjgqLSotY29mZiopCQlnZGJfdGFyZ2V0PW1vbml0b3IgOzsKK202OCotKi1lbGYqKQkJZ2RiX3RhcmdldD1tb25pdG9yIDs7CittNjgqLSotbGludXgqKQkJZ2RiX3RhcmdldD1saW51eAorCQljb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9IGdkYnNlcnZlciIgOzsKK202OCotKi1seW54b3MqKQkJZ2RiX3RhcmdldD1tNjhrbHlueAorCQljb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9IGdkYnNlcnZlciIgOzsKK202OCotKi1uZXRic2QqKQkJZ2RiX3RhcmdldD1uYnNkIDs7CittNjgqLSotb3M2OGsqKQkJZ2RiX3RhcmdldD1vczY4ayA7OworbTY4Ki0qLXN1bm9zMyopCQlnZGJfdGFyZ2V0PXN1bjNvczMgOzsKK202OCotKi1zdW5vczQqKQkJZ2RiX3RhcmdldD1zdW4zb3M0IDs7CittNjgqLSotc3lzdjQqKQkJZ2RiX3RhcmdldD1tNjhrdjQgOzsKK202OCotKi12eHdvcmtzKikJZ2RiX3RhcmdldD12eHdvcmtzNjggOzsKKworbTg4Ki1oYXJyaXMtY3h1eCopCWdkYl90YXJnZXQ9Y3h1eCA7OworbTg4Ki1tb3Rvcm9sYS1zeXN2NCopCWdkYl90YXJnZXQ9ZGVsdGE4OHY0IDs7CittODgqLW1vdG9yb2xhLSopCWdkYl90YXJnZXQ9ZGVsdGE4OCA7OworbTg4Ki0qLSopCQlnZGJfdGFyZ2V0PW04OGsgOzsKKworbWlwczY0Ki1iaWctKikJCWdkYl90YXJnZXQ9YmlnbWlwczY0IDs7CittaXBzKi1iaWctKikJCWdkYl90YXJnZXQ9YmlnbWlwcyA7OworbWlwcyotZGVjLW1hY2gzKikJZ2RiX3RhcmdldD1tYWNoMyA7OworbWlwcyotZGVjLSopCQlnZGJfdGFyZ2V0PWRlY3N0YXRpb24gOzsKK21pcHM2NCplbC0qLWVjb2ZmKikJZ2RiX3RhcmdldD1lbWJlZGw2NCA7OworbWlwczY0Ki0qLWVjb2ZmKikJZ2RiX3RhcmdldD1lbWJlZDY0IDs7CittaXBzNjQqdnI0MzAwKmVsLSotZWxmKikJZ2RiX3RhcmdldD12cjQzMDBlbCA7OworbWlwczY0KnZyNDMwMCotKi1lbGYqKQlnZGJfdGFyZ2V0PXZyNDMwMCA7OworbWlwczY0KnZyNDEwMCplbC0qLWVsZiopCWdkYl90YXJnZXQ9dnI0MzAwZWwgOzsKK21pcHM2NCp2cjQxMDAqLSotZWxmKikJZ2RiX3RhcmdldD12cjQxMDAgOzsKK21pcHM2NCp2cjUwMDAqZWwtKi1lbGYqKQlnZGJfdGFyZ2V0PXZyNTAwMGVsIDs7CittaXBzNjQqdnI1MDAwKi0qLWVsZiopCWdkYl90YXJnZXQ9dnI1MDAwCisJCWNvbmZpZ2RpcnM9IiR7Y29uZmlnZGlyc30gZ2Ric2VydmVyIiA7OworbWlwcyp0eDM5KmVsKi1lbGYqKQlnZGJfdGFyZ2V0PXR4MzlsIDs7CittaXBzKnR4MzkqLWVsZiopCWdkYl90YXJnZXQ9dHgzOSA7OworbWlwczY0KmVsLSotZWxmKikJZ2RiX3RhcmdldD1lbWJlZGw2NCA7OworbWlwczY0Ki0qLWVsZiopCQlnZGJfdGFyZ2V0PWVtYmVkNjQgOzsKK21pcHMqZWwtKi1lY29mZiopCWdkYl90YXJnZXQ9ZW1iZWRsIDs7CittaXBzKi0qLWVjb2ZmKikJCWdkYl90YXJnZXQ9ZW1iZWQgOzsKK21pcHMqZWwtKi1lbGYqKQkJZ2RiX3RhcmdldD1lbWJlZGwgOzsKK21pcHMqLSotZWxmKikJCWdkYl90YXJnZXQ9ZW1iZWQgOzsKK21pcHMqLWxpdHRsZS0qKQkJZ2RiX3RhcmdldD1saXR0bGVtaXBzIDs7CittaXBzKi0qLWxuZXdzKikJCWdkYl90YXJnZXQ9ZW1iZWRsIDs7CittaXBzKi1zZ2ktaXJpeDUqKQlnZGJfdGFyZ2V0PWlyaXg1IDs7CittaXBzKi1zZ2ktaXJpeDYqKQlnZGJfdGFyZ2V0PWlyaXg1IDs7CittaXBzKi1zZ2ktKikJCWdkYl90YXJnZXQ9aXJpeDMgOzsKK21pcHMqLXNvbnktKikJCWdkYl90YXJnZXQ9YmlnbWlwcyA7OworbWlwcyotKi1tYWNoMyopCQlnZGJfdGFyZ2V0PW1pcHNtMyA7OworbWlwcyotKi1zeXN2NCopCQlnZGJfdGFyZ2V0PW1pcHN2NCA7OworbWlwcyotKi1zeXN2KikJCWdkYl90YXJnZXQ9YmlnbWlwcyA7OworbWlwcyotKi1yaXNjb3MqKQlnZGJfdGFyZ2V0PWJpZ21pcHMgOzsKK21pcHMqLSotdnh3b3JrcyopICAgICAgIGdkYl90YXJnZXQ9dnhtaXBzIDs7CisKK21uMTAyMDAtKi0qKQkJZ2RiX3RhcmdldD1tbjEwMjAwIDs7CittbjEwMzAwLSotKikJCWdkYl90YXJnZXQ9bW4xMDMwMCA7OworCitub25lLSotKikJCWdkYl90YXJnZXQ9bm9uZSA7OworCisjIE9CU09MRVRFIG5wMS0qLSopCQlnZGJfdGFyZ2V0PW5wMSA7OworCituczMyay0qLW1hY2gzKikJCWdkYl90YXJnZXQ9bnMzMmttMyA7OworbnMzMmstKi1uZXRic2QqKQlnZGJfdGFyZ2V0PW5ic2QgOzsKK25zMzJrLXV0ZWstc3lzdiopCWdkYl90YXJnZXQ9bWVybGluIDs7CituczMyay11dGVrLSopCQlnZGJfdGFyZ2V0PXVtYXggOzsKKworIyBPQlNPTEVURSBwbi0qLSopCQkJZ2RiX3RhcmdldD1wbiA7OworCitwb3dlcnBjLSotbWFjb3MqKQlnZGJfdGFyZ2V0PW1hY29zIDs7Citwb3dlcnBjLSotbmV0d2FyZSopCWdkYl90YXJnZXQ9cHBjLW53CisJCQljb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9IG5sbSIgOzsKKworcG93ZXJwYy0qLWFpeCopCQlnZGJfdGFyZ2V0PWFpeCA7OworcG93ZXJwY2xlLSotY3lnd2luKikJZ2RiX3RhcmdldD1jeWd3aW4gOzsKK3Bvd2VycGNsZS0qLXNvbGFyaXMqKQlnZGJfdGFyZ2V0PXNvbGFyaXMgOzsKK3Bvd2VycGMtKi1lYWJpKiB8IHBvd2VycGMtKi1saW51eCogfCBwb3dlcnBjLSotc3lzdiogfCBwb3dlcnBjLSotZWxmKikKKwkJCWlmIHRlc3QgLWYgLi4vc2ltL3BwYy9NYWtlZmlsZTsgdGhlbgorCQkJICBnZGJfdGFyZ2V0PXBwYy1zaW0KKwkJCWVsc2UKKwkJCSAgZ2RiX3RhcmdldD1wcGMtZWFiaQorCQkJZmkgOzsKK3Bvd2VycGNsZS0qLWVhYmkqIHwgcG93ZXJwY2xlLSotc3lzdiogfCBwb3dlcnBjbGUtKi1lbGYqKQorCQkJaWYgdGVzdCAtZiAuLi9zaW0vcHBjL01ha2VmaWxlOyB0aGVuCisJCQkgIGdkYl90YXJnZXQ9cHBjbGUtc2ltCisJCQllbHNlCisJCQkgIGdkYl90YXJnZXQ9cHBjbGUtZWFiaQorCQkJZmkgOzsKKworcHlyYW1pZC0qLSopCQlnZGJfdGFyZ2V0PXB5cmFtaWQgOzsKKworcnM2MDAwLSotbHlueG9zKikJZ2RiX3RhcmdldD1yczYwMDBseW54IDs7CityczYwMDAtKi1haXg0KikJCWdkYl90YXJnZXQ9YWl4NCA7OworcnM2MDAwLSotKikJCWdkYl90YXJnZXQ9cnM2MDAwIDs7CisKK3NwYXJjLSotYW91dCopCQlnZGJfdGFyZ2V0PXNwYXJjLWVtIDs7CitzcGFyYy0qLWNvZmYqKQkJZ2RiX3RhcmdldD1zcGFyYy1lbSA7Oworc3BhcmMtKi1lbGYqKQkJZ2RiX3RhcmdldD1zcGFyYy1lbSA7Oworc3BhcmMtKi1saW51eCopCQlnZGJfdGFyZ2V0PWxpbnV4IDs7CitzcGFyYy0qLWx5bnhvcyopCWdkYl90YXJnZXQ9c3BhcmNseW54CisJCWNvbmZpZ2RpcnM9IiR7Y29uZmlnZGlyc30gZ2Ric2VydmVyIiA7Oworc3BhcmMtKi1uZXRic2QqKQlnZGJfdGFyZ2V0PW5ic2QgOzsKK3NwYXJjLSotc29sYXJpczIqKQlnZGJfdGFyZ2V0PXN1bjRzb2wyIDs7CitzcGFyYy0qLXN1bm9zNCopCWdkYl90YXJnZXQ9c3VuNG9zNCA7Oworc3BhcmMtKi1zdW5vczUqKQlnZGJfdGFyZ2V0PXN1bjRzb2wyIDs7CitzcGFyYy0qLXZ4d29ya3MqKQlnZGJfdGFyZ2V0PXZ4c3BhcmMgOzsKK3NwYXJjLSotKikJCWdkYl90YXJnZXQ9c3VuNG9zNCA7Oworc3BhcmNsZXQtKi0qKQkJZ2RiX3RhcmdldD1zcGFyY2xldDs7CitzcGFyY2xpdGUtKi0qKQkJZ2RiX3RhcmdldD1zcGFyY2xpdGUgOzsKK3NwYXJjODZ4LSotKikJCWdkYl90YXJnZXQ9c3BhcmNsaXRlIDs7CisjIEl0J3Mgbm90IGNsZWFyIHdoYXQgdGhlIHJpZ2h0IHNvbHV0aW9uIGZvciAidjhwbHVzIiBzeXN0ZW1zIGlzIHlldC4KKyMgRm9yIG5vdywgc3RpY2sgd2l0aCBzcGFyYy1zdW4tc29sYXJpczIgc2luY2UgdGhhdCdzIHdoYXQgY29uZmlnLmd1ZXNzCisjIHNob3VsZCByZXR1cm4uICBXb3JrIGlzIHN0aWxsIG5lZWRlZCB0byBnZXQgZ2RiIHRvIHByaW50IHRoZSA2NCBiaXQKKyMgcmVncyAoc29tZSBvZiB3aGljaCBhcmUgdXNhYmxlIGluIHY4cGx1cykgc28gc3A2NHNvbC5tdCBoYXNuJ3QgYmVlbgorIyBkZWxldGVkIHRob3VnaCBwcmVzdW1hYmx5IGl0IHNob3VsZCBiZSBldmVudHVhbGx5LgorI3NwYXJjNjQtKi1zb2xhcmlzMiopCWdkYl90YXJnZXQ9c3A2NHNvbDIgOzsKK3NwYXJjNjQtKi0qKQkJZ2RiX3RhcmdldD1zcDY0IDs7CisKK3RhaG9lLSotKikJCWdkYl90YXJnZXQ9dGFob2UgOzsKKworCit2YXgtKi0qKQkJZ2RiX3RhcmdldD12YXggOzsKKworZnIzMC0qLSopCQlnZGJfdGFyZ2V0PWZyMzAKKwkJCTs7CisKK3Y4NTAqLSotKikJCWdkYl90YXJnZXQ9djg1MAorCQkJOzsKKwordzY1LSotKikJCWdkYl90YXJnZXQ9dzY1IDs7CisKK3o4ay0qLWNvZmYqKQkJZ2RiX3RhcmdldD16OGsgOzsKKworZXNhYwpkaWZmIC0tZ2l0IGEvZ2RiL2NvbnZleC10ZGVwLmMgYi9nZGIvY29udmV4LXRkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWViMmIzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbnZleC10ZGVwLmMKQEAgLTAsMCArMSwxMjE3IEBACisvKiBDb252ZXggc3R1ZmYgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJ3YWl0LmgiCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9kaXIuaD4KKyNpbmNsdWRlIDxzeXMvdXNlci5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9wY250bC5oPgorI2luY2x1ZGUgPHN5cy90aHJlYWQuaD4KKyNpbmNsdWRlIDxzeXMvcHJvYy5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSAiZ2RiX3N0YXQuaCIKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjaW5jbHVkZSAiZ2RiY21kLmgiCisKK2V4ZWNfZmlsZV9jb21tYW5kIChmaWxlbmFtZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmZpbGVuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGludCB2YWw7CisgIGludCBuOworICBzdHJ1Y3Qgc3RhdCBzdF9leGVjOworCisgIC8qIEVsaW1pbmF0ZSBhbGwgdHJhY2VzIG9mIG9sZCBleGVjIGZpbGUuCisgICAgIE1hcmsgdGV4dCBzZWdtZW50IGFzIGVtcHR5LiAgKi8KKworICBpZiAoZXhlY2ZpbGUpCisgICAgZnJlZSAoZXhlY2ZpbGUpOworICBleGVjZmlsZSA9IDA7CisgIGRhdGFfc3RhcnQgPSAwOworICBkYXRhX2VuZCA9IDA7CisgIHRleHRfc3RhcnQgPSAwOworICB0ZXh0X2VuZCA9IDA7CisgIGV4ZWNfZGF0YV9zdGFydCA9IDA7CisgIGV4ZWNfZGF0YV9lbmQgPSAwOworICBpZiAoZXhlY2NoYW4gPj0gMCkKKyAgICBjbG9zZSAoZXhlY2NoYW4pOworICBleGVjY2hhbiA9IC0xOworCisgIG5fZXhlYyA9IDA7CisKKyAgLyogTm93IG9wZW4gYW5kIGRpZ2VzdCB0aGUgZmlsZSB0aGUgdXNlciByZXF1ZXN0ZWQsIGlmIGFueS4gICovCisKKyAgaWYgKGZpbGVuYW1lKQorICAgIHsKKyAgICAgIGZpbGVuYW1lID0gdGlsZGVfZXhwYW5kIChmaWxlbmFtZSk7CisgICAgICBtYWtlX2NsZWFudXAgKGZyZWUsIGZpbGVuYW1lKTsKKyAgICAgIAorICAgICAgZXhlY2NoYW4gPSBvcGVucCAoZ2V0ZW52ICgiUEFUSCIpLCAxLCBmaWxlbmFtZSwgT19SRE9OTFksIDAsCisJCQkmZXhlY2ZpbGUpOworICAgICAgaWYgKGV4ZWNjaGFuIDwgMCkKKwlwZXJyb3Jfd2l0aF9uYW1lIChmaWxlbmFtZSk7CisKKyAgICAgIGlmIChteXJlYWQgKGV4ZWNjaGFuLCAmZmlsZWhkciwgc2l6ZW9mIGZpbGVoZHIpIDwgMCkKKwlwZXJyb3Jfd2l0aF9uYW1lIChmaWxlbmFtZSk7CisKKyAgICAgIGlmICghIElTX1NPRkZfTUFHSUMgKGZpbGVoZHIuaF9tYWdpYykpCisJZXJyb3IgKCIlczogbm90IGFuIGV4ZWN1dGFibGUgZmlsZS4iLCBmaWxlbmFtZSk7CisKKyAgICAgIGlmIChteXJlYWQgKGV4ZWNjaGFuLCAmb3B0aGRyLCBmaWxlaGRyLmhfb3B0aGRyKSA8PSAwKQorCXBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKKworICAgICAgLyogUmVhZCB0aHJvdWdoIHRoZSBzZWN0aW9uIGhlYWRlcnMuCisJIEZvciB0ZXh0LCBkYXRhLCBldGMsIHJlY29yZCBhbiBlbnRyeSBpbiB0aGUgZXhlYyBmaWxlIG1hcC4KKwkgUmVjb3JkIHRleHRfc3RhcnQgYW5kIHRleHRfZW5kLiAgKi8KKworICAgICAgbHNlZWsgKGV4ZWNjaGFuLCAobG9uZykgZmlsZWhkci5oX3NjbnB0ciwgMCk7CisKKyAgICAgIGZvciAobiA9IDA7IG4gPCBmaWxlaGRyLmhfbnNjbnM7IG4rKykKKwl7CisJICBpZiAobXlyZWFkIChleGVjY2hhbiwgJnNjbmhkciwgc2l6ZW9mIHNjbmhkcikgPCAwKQorCSAgICBwZXJyb3Jfd2l0aF9uYW1lIChmaWxlbmFtZSk7CisKKwkgIGlmICgoc2NuaGRyLnNfZmxhZ3MgJiBTX1RZUE1BU0spID49IFNfVEVYVAorCSAgICAgICYmIChzY25oZHIuc19mbGFncyAmIFNfVFlQTUFTSykgPD0gU19DT01PTikKKwkgICAgeworCSAgICAgIGV4ZWNfbWFwW25fZXhlY10ubWVtX2FkZHIgPSBzY25oZHIuc192YWRkcjsKKwkgICAgICBleGVjX21hcFtuX2V4ZWNdLm1lbV9lbmQgPSBzY25oZHIuc192YWRkciArIHNjbmhkci5zX3NpemU7CisJICAgICAgZXhlY19tYXBbbl9leGVjXS5maWxlX2FkZHIgPSBzY25oZHIuc19zY25wdHI7CisJICAgICAgZXhlY19tYXBbbl9leGVjXS50eXBlID0gc2NuaGRyLnNfZmxhZ3MgJiBTX1RZUE1BU0s7CisJICAgICAgbl9leGVjKys7CisKKwkgICAgICBpZiAoKHNjbmhkci5zX2ZsYWdzICYgU19UWVBNQVNLKSA9PSBTX1RFWFQpCisJCXsKKwkJICB0ZXh0X3N0YXJ0ID0gc2NuaGRyLnNfdmFkZHI7CisJCSAgdGV4dF9lbmQgPSAgc2NuaGRyLnNfdmFkZHIgKyBzY25oZHIuc19zaXplOworCQl9CisJICAgIH0KKwl9CisKKyAgICAgIGZzdGF0IChleGVjY2hhbiwgJnN0X2V4ZWMpOworICAgICAgZXhlY19tdGltZSA9IHN0X2V4ZWMuc3RfbXRpbWU7CisgICAgICAKKyAgICAgIHZhbGlkYXRlX2ZpbGVzICgpOworICAgIH0KKyAgZWxzZSBpZiAoZnJvbV90dHkpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiTm8gZXhlY3V0YWJsZSBmaWxlIG5vdy5cbiIpOworCisgIC8qIFRlbGwgZGlzcGxheSBjb2RlIChpZiBhbnkpIGFib3V0IHRoZSBjaGFuZ2VkIGZpbGUgbmFtZS4gICovCisgIGlmIChleGVjX2ZpbGVfZGlzcGxheV9ob29rKQorICAgICgqZXhlY19maWxlX2Rpc3BsYXlfaG9vaykgKGZpbGVuYW1lKTsKK30KKworI2lmIDAKKy8qIFJlYWQgZGF0YSBmcm9tIFNPRkYgZXhlYyBvciBjb3JlIGZpbGUuCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBFSU8gaWYgYWRkcmVzcyBvdXQgb2YgYm91bmRzLiAqLworCitpbnQKK3hmZXJfY29yZV9maWxlIChtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIGludCBuOworICByZWdpc3RlciBpbnQgdmFsOworICBpbnQgeGZlcmNoYW47CisgIGNoYXIgKip4ZmVyZmlsZTsKKyAgaW50IGZpbGVwdHI7CisgIGludCByZXR1cm52YWwgPSAwOworCisgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgIHhmZXJmaWxlID0gMDsKKyAgICAgIHhmZXJjaGFuID0gMDsKKworICAgICAgLyogRGV0ZXJtaW5lIHdoaWNoIGZpbGUgdGhlIG5leHQgYnVuY2ggb2YgYWRkcmVzc2VzIHJlc2lkZSBpbiwKKwkgYW5kIHdoZXJlIGluIHRoZSBmaWxlLiAgU2V0IHRoZSBmaWxlJ3MgcmVhZC93cml0ZSBwb2ludGVyCisJIHRvIHBvaW50IGF0IHRoZSBwcm9wZXIgcGxhY2UgZm9yIHRoZSBkZXNpcmVkIGFkZHJlc3MKKwkgYW5kIHNldCB4ZmVyZmlsZSBhbmQgeGZlcmNoYW4gZm9yIHRoZSBjb3JyZWN0IGZpbGUuCisJIElmIGRlc2lyZWQgYWRkcmVzcyBpcyBub25leGlzdGVudCwgbGVhdmUgdGhlbSB6ZXJvLgorCSBpIGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIGhhbmRsZWQKKwkgYWxvbmcgd2l0aCB0aGUgbmV4dCBhZGRyZXNzLiAgKi8KKworICAgICAgaSA9IGxlbjsKKworICAgICAgZm9yIChuID0gMDsgbiA8IG5fY29yZTsgbisrKQorCXsKKwkgIGlmIChtZW1hZGRyID49IGNvcmVfbWFwW25dLm1lbV9hZGRyICYmIG1lbWFkZHIgPCBjb3JlX21hcFtuXS5tZW1fZW5kCisJICAgICAgJiYgKGNvcmVfbWFwW25dLnRocmVhZCA9PSAtMQorCQkgIHx8IGNvcmVfbWFwW25dLnRocmVhZCA9PSBpbmZlcmlvcl90aHJlYWQpKQorCSAgICB7CisJICAgICAgaSA9IG1pbiAobGVuLCBjb3JlX21hcFtuXS5tZW1fZW5kIC0gbWVtYWRkcik7CisJICAgICAgZmlsZXB0ciA9IGNvcmVfbWFwW25dLmZpbGVfYWRkciArIG1lbWFkZHIgLSBjb3JlX21hcFtuXS5tZW1fYWRkcjsKKwkgICAgICBpZiAoY29yZV9tYXBbbl0uZmlsZV9hZGRyKQorCQl7CisJCSAgeGZlcmZpbGUgPSAmY29yZWZpbGU7CisJCSAgeGZlcmNoYW4gPSBjb3JlY2hhbjsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICB9CisJICBlbHNlIGlmIChjb3JlX21hcFtuXS5tZW1fYWRkciA+PSBtZW1hZGRyCisJCSAgICYmIGNvcmVfbWFwW25dLm1lbV9hZGRyIDwgbWVtYWRkciArIGkpCisgCSAgICBpID0gY29yZV9tYXBbbl0ubWVtX2FkZHIgLSBtZW1hZGRyOworICAgICAgICB9CisKKyAgICAgIGlmICgheGZlcmZpbGUpIAorCWZvciAobiA9IDA7IG4gPCBuX2V4ZWM7IG4rKykKKwkgIHsKKwkgICAgaWYgKG1lbWFkZHIgPj0gZXhlY19tYXBbbl0ubWVtX2FkZHIKKwkJJiYgbWVtYWRkciA8IGV4ZWNfbWFwW25dLm1lbV9lbmQpCisJICAgICAgeworCQlpID0gbWluIChsZW4sIGV4ZWNfbWFwW25dLm1lbV9lbmQgLSBtZW1hZGRyKTsKKwkJZmlsZXB0ciA9IGV4ZWNfbWFwW25dLmZpbGVfYWRkciArIG1lbWFkZHIKKwkJICAtIGV4ZWNfbWFwW25dLm1lbV9hZGRyOworCQlpZiAoZXhlY19tYXBbbl0uZmlsZV9hZGRyKQorCQkgIHsKKwkJICAgIHhmZXJmaWxlID0gJmV4ZWNmaWxlOworCQkgICAgeGZlcmNoYW4gPSBleGVjY2hhbjsKKwkJICB9CisJCWJyZWFrOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoZXhlY19tYXBbbl0ubWVtX2FkZHIgPj0gbWVtYWRkcgorCQkgICAgICYmIGV4ZWNfbWFwW25dLm1lbV9hZGRyIDwgbWVtYWRkciArIGkpCisJICAgICAgaSA9IGV4ZWNfbWFwW25dLm1lbV9hZGRyIC0gbWVtYWRkcjsKKwkgIH0KKworICAgICAgLyogTm93IHdlIGtub3cgd2hpY2ggZmlsZSB0byB1c2UuCisJIFNldCB1cCBpdHMgcG9pbnRlciBhbmQgdHJhbnNmZXIgdGhlIGRhdGEuICAqLworICAgICAgaWYgKHhmZXJmaWxlKQorCXsKKwkgIGlmICgqeGZlcmZpbGUgPT0gMCkKKwkgICAgaWYgKHhmZXJmaWxlID09ICZleGVjZmlsZSkKKwkgICAgICBlcnJvciAoIk5vIHByb2dyYW0gZmlsZSB0byBleGFtaW5lLiIpOworCSAgICBlbHNlCisJICAgICAgZXJyb3IgKCJObyBjb3JlIGR1bXAgZmlsZSBvciBydW5uaW5nIHByb2dyYW0gdG8gZXhhbWluZS4iKTsKKwkgIHZhbCA9IGxzZWVrICh4ZmVyY2hhbiwgZmlsZXB0ciwgMCk7CisJICBpZiAodmFsIDwgMCkKKwkgICAgcGVycm9yX3dpdGhfbmFtZSAoKnhmZXJmaWxlKTsKKwkgIHZhbCA9IG15cmVhZCAoeGZlcmNoYW4sIG15YWRkciwgaSk7CisJICBpZiAodmFsIDwgMCkKKwkgICAgcGVycm9yX3dpdGhfbmFtZSAoKnhmZXJmaWxlKTsKKwl9CisgICAgICAvKiBJZiB0aGlzIGFkZHJlc3MgaXMgZm9yIG5vbmV4aXN0ZW50IG1lbW9yeSwKKwkgcmVhZCB6ZXJvcyBpZiByZWFkaW5nLCBvciBkbyBub3RoaW5nIGlmIHdyaXRpbmcuICAqLworICAgICAgZWxzZQorCXsKKwkgIG1lbXNldCAobXlhZGRyLCAnXDAnLCBpKTsKKwkgIHJldHVybnZhbCA9IEVJTzsKKwl9CisKKyAgICAgIG1lbWFkZHIgKz0gaTsKKyAgICAgIG15YWRkciArPSBpOworICAgICAgbGVuIC09IGk7CisgICAgfQorICByZXR1cm4gcmV0dXJudmFsOworfQorI2VuZGlmCisKKy8qIEhlcmUgZnJvbSBpbmZvIGZpbGVzIGNvbW1hbmQgdG8gcHJpbnQgYW4gYWRkcmVzcyBtYXAuICAqLworCitwcmludF9tYXBzICgpCit7CisgIHN0cnVjdCBwbWFwIHB0cnNbMjAwXTsKKyAgaW50IG47CisKKyAgLyogSUQgc3RyaW5ncyBmb3IgY29yZSBhbmQgZXhlY3V0YWJsZSBmaWxlIHNlY3Rpb25zICovCisKKyAgc3RhdGljIGNoYXIgKmlkc3RyW10gPQorICAgIHsKKyAgICAgICIwIiwgInRleHQiLCAiZGF0YSIsICJ0ZGF0YSIsICJic3MiLCAidGJzcyIsIAorICAgICAgImNvbW1vbiIsICJ0dGV4dCIsICJjdHgiLCAidGN0eCIsICIxMCIsICIxMSIsICIxMiIsCisgICAgfTsKKworICBmb3IgKG4gPSAwOyBuIDwgbl9jb3JlOyBuKyspCisgICAgeworICAgICAgY29yZV9tYXBbbl0ud2hpY2ggPSAwOworICAgICAgcHRyc1tuXSA9IGNvcmVfbWFwW25dOworICAgIH0KKyAgZm9yIChuID0gMDsgbiA8IG5fZXhlYzsgbisrKQorICAgIHsKKyAgICAgIGV4ZWNfbWFwW25dLndoaWNoID0gMTsKKyAgICAgIHB0cnNbbl9jb3JlK25dID0gZXhlY19tYXBbbl07CisgICAgfQorCisgIHFzb3J0IChwdHJzLCBuX2NvcmUgKyBuX2V4ZWMsIHNpemVvZiAqcHRycywgcHRyX2NtcCk7CisKKyAgZm9yIChuID0gMDsgbiA8IG5fY29yZSArIG5fZXhlYzsgbisrKQorICAgIHsKKyAgICAgIHN0cnVjdCBwbWFwICpwID0gJnB0cnNbbl07CisgICAgICBpZiAobiA+IDApCisJeworCSAgaWYgKHAtPm1lbV9hZGRyIDwgcHRyc1tuLTFdLm1lbV9lbmQpCisJICAgIHAtPm1lbV9hZGRyID0gcHRyc1tuLTFdLm1lbV9lbmQ7CisJICBpZiAocC0+bWVtX2FkZHIgPj0gcC0+bWVtX2VuZCkKKwkgICAgY29udGludWU7CisJfQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiJTA4eCAuLiAlMDh4ICAlLTZzICAlc1xuIiwKKwkJICAgICAgIHAtPm1lbV9hZGRyLCBwLT5tZW1fZW5kLCBpZHN0cltwLT50eXBlXSwKKwkJICAgICAgIHAtPndoaWNoID8gZXhlY2ZpbGUgOiBjb3JlZmlsZSk7CisgICAgfQorfQorCisvKiBDb21wYXJlIHJvdXRpbmUgdG8gcHV0IGZpbGUgc2VjdGlvbnMgaW4gb3JkZXIuCisgICBTb3J0IGludG8gaW5jcmVhc2luZyBvcmRlciBvbiBhZGRyZXNzLCBhbmQgcHV0IGNvcmUgZmlsZSBzZWN0aW9ucworICAgYmVmb3JlIGV4ZWMgZmlsZSBzZWN0aW9ucyBpZiBib3RoIGZpbGVzIGNvbnRhaW4gdGhlIHNhbWUgYWRkcmVzc2VzLiAgKi8KKworc3RhdGljIHB0cl9jbXAgKGEsIGIpCisgICAgIHN0cnVjdCBwbWFwICphLCAqYjsKK3sKKyAgaWYgKGEtPm1lbV9hZGRyICE9IGItPm1lbV9hZGRyKSByZXR1cm4gYS0+bWVtX2FkZHIgLSBiLT5tZW1fYWRkcjsKKyAgcmV0dXJuIGEtPndoaWNoIC0gYi0+d2hpY2g7Cit9CisMCisvKiBUcmFwcGVkIGludGVybmFsIHZhcmlhYmxlcyBhcmUgdXNlZCB0byBoYW5kbGUgc3BlY2lhbCByZWdpc3RlcnMuCisgICBBIHRyYXBwZWQgaS52LiBjYWxscyBhIGhvb2sgaGVyZSBldmVyeSB0aW1lIGl0IGlzIGRlcmVmZXJlbmNlZCwKKyAgIHRvIHByb3ZpZGUgYSBuZXcgdmFsdWUgZm9yIHRoZSB2YXJpYWJsZSwgYW5kIGl0IGNhbGxzIGEgaG9vayBoZXJlCisgICB3aGVuIGEgbmV3IHZhbHVlIGlzIGFzc2lnbmVkLCB0byBkbyBzb21ldGhpbmcgd2l0aCB0aGUgdmFsdWUuCisgICAKKyAgIFRoZSB2ZWN0b3IgcmVnaXN0ZXJzIGFyZSAkdmwsICR2cywgJHZtLCAkdk4sICRWTiAoTiBpbiAwLi43KS4KKyAgIFRoZSBjb21tdW5pY2F0aW9uIHJlZ2lzdGVycyBhcmUgJGNOLCAkQ04gKE4gaW4gMC4uNjMpLgorICAgVGhleSBub3QgaGFuZGxlZCBhcyByZWd1bGFyIHJlZ2lzdGVycyBiZWNhdXNlIGl0J3MgZXhwZW5zaXZlIHRvCisgICByZWFkIHRoZW0sIGFuZCB0aGVpciBzaXplIHZhcmllcywgYW5kIHRoZXkgaGF2ZSB0b28gbWFueSBuYW1lcy4gICovCisKKworLyogUmV0dXJuIDEgaWYgTkFNRSBpcyBhIHRyYXBwZWQgaW50ZXJuYWwgdmFyaWFibGUsIGVsc2UgMC4gKi8KKworaW50Citpc190cmFwcGVkX2ludGVybmFsdmFyIChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICAgIGlmICgobmFtZVswXSA9PSAnYycgfHwgbmFtZVswXSA9PSAnQycpCisJJiYgbmFtZVsxXSA+PSAnMCcgJiYgbmFtZVsxXSA8PSAnOScKKwkmJiAobmFtZVsyXSA9PSAnXDAnCisJICAgIHx8IChuYW1lWzJdID49ICcwJyAmJiBuYW1lWzJdIDw9ICc5JworCQkmJiBuYW1lWzNdID09ICdcMCcgJiYgbmFtZVsxXSAhPSAnMCcpKQorCSYmIGF0b2kgKCZuYW1lWzFdKSA8IDY0KSByZXR1cm4gMTsKKworICBpZiAoKG5hbWVbMF0gPT0gJ3YnIHx8IG5hbWVbMF0gPT0gJ1YnKQorICAgICAgJiYgKCgobmFtZVsxXSAmIC04KSA9PSAnMCcgJiYgbmFtZVsyXSA9PSAnXDAnKQorCSAgfHwgU1RSRVEgKG5hbWUsICJ2bCIpCisJICB8fCBTVFJFUSAobmFtZSwgInZzIikgCisJICB8fCBTVFJFUSAobmFtZSwgInZtIikpKQorICAgIHJldHVybiAxOworICBlbHNlIHJldHVybiAwOworfQorCisvKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRyYXBwZWQgaW50ZXJuYWwgdmFyaWFibGUgVkFSICovCisKK3ZhbHVlCit2YWx1ZV9vZl90cmFwcGVkX2ludGVybmFsdmFyICh2YXIpCisgICAgIHN0cnVjdCBpbnRlcm5hbHZhciAqdmFyOworeworICBjaGFyICpuYW1lID0gdmFyLT5uYW1lOworICB2YWx1ZSB2YWw7CisgIHN0cnVjdCB0eXBlICp0eXBlOworICBzdHJ1Y3QgdHlwZSAqcmFuZ2VfdHlwZTsKKyAgbG9uZyBsZW4gPSAqcmVhZF92ZWN0b3JfcmVnaXN0ZXIgKFZMX1JFR05VTSk7CisgIGlmIChsZW4gPD0gMCB8fCBsZW4gPiAxMjgpIGxlbiA9IDEyODsKKworICBpZiAoU1RSRVEgKG5hbWUsICJ2bCIpKQorICAgIHsKKyAgICAgIHZhbCA9IHZhbHVlX2Zyb21fbG9uZ2VzdCAoYnVpbHRpbl90eXBlX2ludCwKKwkJCSAgICAgKExPTkdFU1QpICpyZWFkX3ZlY3Rvcl9yZWdpc3Rlcl8xIChWTF9SRUdOVU0pKTsKKyAgICB9CisgIGVsc2UgaWYgKFNUUkVRIChuYW1lLCAidnMiKSkKKyAgICB7CisgICAgICB2YWwgPSB2YWx1ZV9mcm9tX2xvbmdlc3QgKGJ1aWx0aW5fdHlwZV9pbnQsCisJCQkgICAgIChMT05HRVNUKSAqcmVhZF92ZWN0b3JfcmVnaXN0ZXJfMSAoVlNfUkVHTlVNKSk7CisgICAgfQorICBlbHNlIGlmIChTVFJFUSAobmFtZSwgInZtIikpCisgICAgeworICAgICAgbG9uZyB2bVs0XTsKKyAgICAgIGxvbmcgaSwgKnA7CisgICAgICBtZW1jcHkgKHZtLCByZWFkX3ZlY3Rvcl9yZWdpc3Rlcl8xIChWTV9SRUdOVU0pLCBzaXplb2Ygdm0pOworICAgICAgcmFuZ2VfdHlwZSA9CisJY3JlYXRlX3JhbmdlX3R5cGUgKChzdHJ1Y3QgdHlwZSAqKSBOVUxMLCBidWlsdGluX3R5cGVfaW50LCAwLCBsZW4gLSAxKTsKKyAgICAgIHR5cGUgPQorCWNyZWF0ZV9hcnJheV90eXBlICgoc3RydWN0IHR5cGUgKikgTlVMTCwgYnVpbHRpbl90eXBlX2ludCwgcmFuZ2VfdHlwZSk7CisgICAgICB2YWwgPSBhbGxvY2F0ZV92YWx1ZSAodHlwZSk7CisgICAgICBwID0gKGxvbmcgKikgVkFMVUVfQ09OVEVOVFMgKHZhbCk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIAorCSpwKysgPSAhISAodm1bMyAtIChpID4+IDUpXSAmICgxIDw8IChpICYgMDM3KSkpOworICAgIH0KKyAgZWxzZSBpZiAobmFtZVswXSA9PSAnVicpCisgICAgeworICAgICAgcmFuZ2VfdHlwZSA9CisJY3JlYXRlX3JhbmdlX3R5cGUgKChzdHJ1Y3QgdHlwZSAqKSBOVUxMLCBidWlsdGluX3R5cGVfaW50IDAsIGxlbiAtIDEpOworICAgICAgdHlwZSA9CisJY3JlYXRlX2FycmF5X3R5cGUgKChzdHJ1Y3QgdHlwZSAqKSBOVUxMLCBidWlsdGluX3R5cGVfbG9uZ19sb25nLAorCQkJICAgcmFuZ2VfdHlwZSk7CisgICAgICB2YWwgPSBhbGxvY2F0ZV92YWx1ZSAodHlwZSk7CisgICAgICBtZW1jcHkgKFZBTFVFX0NPTlRFTlRTICh2YWwpLAorCSAgICAgcmVhZF92ZWN0b3JfcmVnaXN0ZXJfMSAobmFtZVsxXSAtICcwJyksCisJICAgICBUWVBFX0xFTkdUSCAodHlwZSkpOworICAgIH0KKyAgZWxzZSBpZiAobmFtZVswXSA9PSAndicpCisgICAgeworICAgICAgbG9uZyAqcDEsICpwMjsKKyAgICAgIHJhbmdlX3R5cGUgPQorCWNyZWF0ZV9yYW5nZV90eXBlICgoc3RydWN0IHR5cGUgKikgTlVMTCwgYnVpbHRpbl90eXBlX2ludCAwLCBsZW4gLSAxKTsKKyAgICAgIHR5cGUgPQorCWNyZWF0ZV9hcnJheV90eXBlICgoc3RydWN0IHR5cGUgKikgTlVMTCwgYnVpbHRpbl90eXBlX2xvbmcsCisJCQkgICByYW5nZV90eXBlKTsKKyAgICAgIHZhbCA9IGFsbG9jYXRlX3ZhbHVlICh0eXBlKTsKKyAgICAgIHAxID0gcmVhZF92ZWN0b3JfcmVnaXN0ZXJfMSAobmFtZVsxXSAtICcwJyk7CisgICAgICBwMiA9IChsb25nICopIFZBTFVFX0NPTlRFTlRTICh2YWwpOworICAgICAgd2hpbGUgKC0tbGVuID49IDApIHtwMSsrOyAqcDIrKyA9ICpwMSsrO30KKyAgICB9CisKKyAgZWxzZSBpZiAobmFtZVswXSA9PSAnYycpCisgICAgdmFsID0gdmFsdWVfZnJvbV9sb25nZXN0IChidWlsdGluX3R5cGVfaW50LAorCQkJICAgcmVhZF9jb21tX3JlZ2lzdGVyIChhdG9pICgmbmFtZVsxXSkpKTsKKyAgZWxzZSBpZiAobmFtZVswXSA9PSAnQycpCisgICAgdmFsID0gdmFsdWVfZnJvbV9sb25nZXN0IChidWlsdGluX3R5cGVfbG9uZ19sb25nLAorCQkJICAgcmVhZF9jb21tX3JlZ2lzdGVyIChhdG9pICgmbmFtZVsxXSkpKTsKKworICBWQUxVRV9MVkFMICh2YWwpID0gbHZhbF9pbnRlcm5hbHZhcjsKKyAgVkFMVUVfSU5URVJOQUxWQVIgKHZhbCkgPSB2YXI7CisgIHJldHVybiB2YWw7Cit9CisKKy8qIEhhbmRsZSBhIG5ldyB2YWx1ZSBhc3NpZ25lZCB0byBhIHRyYXBwZWQgaW50ZXJuYWwgdmFyaWFibGUgKi8KKwordm9pZAorc2V0X3RyYXBwZWRfaW50ZXJuYWx2YXIgKHZhciwgdmFsLCBiaXRwb3MsIGJpdHNpemUsIG9mZnNldCkKKyAgICAgc3RydWN0IGludGVybmFsdmFyICp2YXI7CisgICAgIHZhbHVlIHZhbDsKKyAgICAgaW50IGJpdHBvcywgYml0c2l6ZSwgb2Zmc2V0OworeyAKKyAgY2hhciAqbmFtZSA9IHZhci0+bmFtZTsKKyAgbG9uZyBsb25nIG5ld3ZhbCA9IHZhbHVlX2FzX2xvbmcgKHZhbCk7CisKKyAgaWYgKFNUUkVRIChuYW1lLCAidmwiKSkgCisgICAgd3JpdGVfdmVjdG9yX3JlZ2lzdGVyIChWTF9SRUdOVU0sIDAsIG5ld3ZhbCk7CisgIGVsc2UgaWYgKFNUUkVRIChuYW1lLCAidnMiKSkKKyAgICB3cml0ZV92ZWN0b3JfcmVnaXN0ZXIgKFZTX1JFR05VTSwgMCwgbmV3dmFsKTsKKyAgZWxzZSBpZiAobmFtZVswXSA9PSAnYycgfHwgbmFtZVswXSA9PSAnQycpCisgICAgd3JpdGVfY29tbV9yZWdpc3RlciAoYXRvaSAoJm5hbWVbMV0pLCBuZXd2YWwpOworICBlbHNlIGlmIChTVFJFUSAobmFtZSwgInZtIikpCisgICAgZXJyb3IgKCJjYW4ndCBhc3NpZ24gdG8gJHZtIik7CisgIGVsc2UKKyAgICB7CisgICAgICBvZmZzZXQgLz0gYml0c2l6ZSAvIDg7CisgICAgICB3cml0ZV92ZWN0b3JfcmVnaXN0ZXIgKG5hbWVbMV0gLSAnMCcsIG9mZnNldCwgbmV3dmFsKTsKKyAgICB9Cit9CisKKy8qIFByaW50IGFuIGludGVnZXIgdmFsdWUgd2hlbiBubyBmb3JtYXQgd2FzIHNwZWNpZmllZC4gIGdkYiBub3JtYWxseQorICAgcHJpbnRzIHRoZXNlIHZhbHVlcyBpbiBkZWNpbWFsLCBidXQgdGhlIHRoZSBsZWFkaW5nIDB4ODAwMDAwMDAgb2YKKyAgIHBvaW50ZXJzIHByb2R1Y2VzIGludG9sZXJhYmxlIDEwLWRpZ2l0IG5lZ2F0aXZlIG51bWJlcnMuCisgICBJZiBpdCBsb29rcyBsaWtlIGFuIGFkZHJlc3MsIHByaW50IGl0IGluIGhleCBpbnN0ZWFkLiAgKi8KKworZGVjb3V0IChzdHJlYW0sIHR5cGUsIHZhbCkKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIExPTkdFU1QgdmFsOworeworICBsb25nIGx2ID0gdmFsOworCisgIHN3aXRjaCAob3V0cHV0X3JhZGl4KQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBpZiAoKGx2ID09IHZhbCB8fCAodW5zaWduZWQpIGx2ID09IHZhbCkKKwkgICYmICgobHYgJiAweGYwMDAwMDAwKSA9PSAweDgwMDAwMDAwCisJICAgICAgfHwgKChsdiAmIDB4ZjAwMDAwMDApID09IDB4ZjAwMDAwMDAgJiYgbHYgPCBTVEFDS19FTkRfQUREUikpKQorCXsKKwkgIHByaW50X2xvbmdlc3QgKHN0cmVhbSwgIngiLCAwLCB2YWwpOworCSAgcmV0dXJuOworCX0KKworICAgIGNhc2UgMTA6CisgICAgICBwcmludF9sb25nZXN0IChzdHJlYW0sIFRZUEVfVU5TSUdORUQgKHR5cGUpID8gInUiIDogImQiLCAwLCB2YWwpOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSA4OgorICAgICAgcHJpbnRfbG9uZ2VzdCAoc3RyZWFtLCAibyIsIDAsIHZhbCk7CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIDE2OgorICAgICAgcHJpbnRfbG9uZ2VzdCAoc3RyZWFtLCAieCIsIDAsIHZhbCk7CisgICAgICByZXR1cm47CisgICAgfQorfQorCisvKiBDaGFuZ2UgdGhlIGRlZmF1bHQgb3V0cHV0IHJhZGl4IHRvIDEwIG9yIDE2LCBvciBzZXQgaXQgdG8gMCAoaGV1cmlzdGljKS4KKyAgIFRoaXMgY29tbWFuZCBpcyBtb3N0bHkgb2Jzb2xldGUgbm93IHRoYXQgdGhlIHByaW50IGNvbW1hbmQgYWxsb3dzCisgICBmb3JtYXRzIHRvIGFwcGx5IHRvIGFnZ3JlZ2F0ZXMsIGJ1dCBpcyBzdGlsbCBoYW5keSBvY2Nhc2lvbmFsbHkuICAqLworCitzdGF0aWMgdm9pZAorc2V0X2Jhc2VfY29tbWFuZCAoYXJnKQorICAgIGNoYXIgKmFyZzsKK3sKKyAgaW50IG5ld19yYWRpeDsKKworICBpZiAoIWFyZykKKyAgICBvdXRwdXRfcmFkaXggPSAwOworICBlbHNlCisgICAgeworICAgICAgbmV3X3JhZGl4ID0gYXRvaSAoYXJnKTsKKyAgICAgIGlmIChuZXdfcmFkaXggIT0gMTAgJiYgbmV3X3JhZGl4ICE9IDE2ICYmIG5ld19yYWRpeCAhPSA4KSAKKwllcnJvciAoImJhc2UgbXVzdCBiZSA4LCAxMCBvciAxNiwgb3IgbnVsbCIpOworICAgICAgZWxzZSBvdXRwdXRfcmFkaXggPSBuZXdfcmFkaXg7CisgICAgfQorfQorCisvKiBUdXJuIHBpcGVsaW5pbmcgb24gb3Igb2ZmIGluIHRoZSBpbmZlcmlvci4gKi8KKworc3RhdGljIHZvaWQKK3NldF9waXBlbGluaW5nX2NvbW1hbmQgKGFyZykKKyAgICBjaGFyICphcmc7Cit7CisgIGlmICghYXJnKQorICAgIHsKKyAgICAgIHNlcXVlbnRpYWwgPSAhc2VxdWVudGlhbDsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiVzXG4iLCBzZXF1ZW50aWFsID8gIm9mZiIgOiAib24iKTsKKyAgICB9CisgIGVsc2UgaWYgKFNUUkVRIChhcmcsICJvbiIpKQorICAgIHNlcXVlbnRpYWwgPSAwOworICBlbHNlIGlmIChTVFJFUSAoYXJnLCAib2ZmIikpCisgICAgc2VxdWVudGlhbCA9IDE7CisgIGVsc2UgZXJyb3IgKCJ2YWxpZCBhcmdzIGFyZSBgb24nLCB0byBhbGxvdyBpbnN0cnVjdGlvbnMgdG8gb3ZlcmxhcCwgb3JcblwKK2BvZmYnLCB0byBwcmV2ZW50IGl0IGFuZCB0aGVyZWJ5IHBpbnBvaW50IGV4Y2VwdGlvbnMuIik7Cit9CisKKy8qIEVuYWJsZSwgZGlzYWJsZSwgb3IgZm9yY2UgcGFyYWxsZWwgZXhlY3V0aW9uIGluIHRoZSBpbmZlcmlvci4gICovCisKK3N0YXRpYyB2b2lkCitzZXRfcGFyYWxsZWxfY29tbWFuZCAoYXJnKQorICAgICBjaGFyICphcmc7Cit7CisgIHN0cnVjdCBybGltaXQgcmw7CisgIGludCBwcmV2cGFyYWxsZWwgPSBwYXJhbGxlbDsKKworICBpZiAoIXN0cm5jbXAgKGFyZywgImZpeGVkIiwgc3RybGVuIChhcmcpKSkKKyAgICBwYXJhbGxlbCA9IDI7ICAKKyAgZWxzZSBpZiAoU1RSRVEgKGFyZywgIm9uIikpCisgICAgcGFyYWxsZWwgPSAxOworICBlbHNlIGlmIChTVFJFUSAoYXJnLCAib2ZmIikpCisgICAgcGFyYWxsZWwgPSAwOworICBlbHNlIGVycm9yICgidmFsaWQgYXJncyBhcmUgYG9uJywgdG8gYWxsb3cgbXVsdGlwbGUgdGhyZWFkcywgb3JcblwKK2BmaXhlZCcsIHRvIGZvcmNlIG11bHRpcGxlIHRocmVhZHMsIG9yXG5cCitgb2ZmJywgdG8gcnVuIHdpdGggb25lIHRocmVhZCBvbmx5LiIpOworCisgIGlmICgocHJldnBhcmFsbGVsID09IDApICE9IChwYXJhbGxlbCA9PSAwKSAmJiBpbmZlcmlvcl9waWQpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgid2lsbCB0YWtlIGVmZmVjdCBhdCBuZXh0IHJ1bi5cbiIpOworCisgIGdldHJsaW1pdCAoUkxJTUlUX0NPTkNVUiwgJnJsKTsKKyAgcmwucmxpbV9jdXIgPSBwYXJhbGxlbCA/IHJsLnJsaW1fbWF4IDogMTsKKyAgc2V0cmxpbWl0IChSTElNSVRfQ09OQ1VSLCAmcmwpOworCisgIGlmIChpbmZlcmlvcl9waWQpCisgICAgc2V0X2ZpeGVkX3NjaGVkdWxpbmcgKGluZmVyaW9yX3BpZCwgcGFyYWxsZWwgPT0gMik7Cit9CisKKy8qIEFkZCBhIG5ldyBuYW1lIGZvciBhbiBleGlzdGluZyBjb21tYW5kLiAgKi8KKworc3RhdGljIHZvaWQgCithbGlhc19jb21tYW5kIChhcmcpCisgICAgY2hhciAqYXJnOworeworICAgIHN0YXRpYyBjaGFyICphbGlhc2VyciA9ICJ1c2FnZSBpcyBgYWxpYXMgTkVXIE9MRCcsIG5vIGFyZ3MgYWxsb3dlZCI7CisgICAgY2hhciAqbmV3bmFtZSA9IGFyZzsKKyAgICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqbmV3LCAqb2xkOworCisgICAgaWYgKCFhcmcpCisgICAgICBlcnJvcl9ub19hcmcgKCJuZXduYW1lIG9sZG5hbWUiKTsKKwkKKyAgICBuZXcgPSBsb29rdXBfY21kICgmYXJnLCBjbWRsaXN0LCAiIiwgLTEpOworICAgIGlmIChuZXcgJiYgIXN0cm5jbXAgKG5ld25hbWUsIG5ldy0+bmFtZSwgc3RybGVuIChuZXctPm5hbWUpKSkKKyAgICAgIHsKKwluZXduYW1lID0gbmV3LT5uYW1lOworCWlmICghKCphcmcgPT0gJy0nIAorCSAgICAgIHx8ICgqYXJnID49ICdhJyAmJiAqYXJnIDw9ICd6JykKKwkgICAgICB8fCAoKmFyZyA+PSAnQScgJiYgKmFyZyA8PSAnWicpCisJICAgICAgfHwgKCphcmcgPj0gJzAnICYmICphcmcgPD0gJzknKSkpCisJICBlcnJvciAoYWxpYXNlcnIpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwlhcmcgPSBuZXduYW1lOworCXdoaWxlICgqYXJnID09ICctJyAKKwkgICAgICAgfHwgKCphcmcgPj0gJ2EnICYmICphcmcgPD0gJ3onKQorCSAgICAgICB8fCAoKmFyZyA+PSAnQScgJiYgKmFyZyA8PSAnWicpCisJICAgICAgIHx8ICgqYXJnID49ICcwJyAmJiAqYXJnIDw9ICc5JykpCisJICBhcmcrKzsKKwlpZiAoKmFyZyAhPSAnICcgJiYgKmFyZyAhPSAnXHQnKQorCSAgZXJyb3IgKGFsaWFzZXJyKTsKKwkqYXJnID0gJ1wwJzsKKwlhcmcrKzsKKyAgICAgIH0KKworICAgIG9sZCA9IGxvb2t1cF9jbWQgKCZhcmcsIGNtZGxpc3QsICIiLCAwKTsKKworICAgIGlmICgqYXJnICE9ICdcMCcpCisgICAgICBlcnJvciAoYWxpYXNlcnIpOworCisgICAgaWYgKG5ldyAmJiAhc3RybmNtcCAobmV3bmFtZSwgbmV3LT5uYW1lLCBzdHJsZW4gKG5ldy0+bmFtZSkpKQorICAgICAgeworCWNoYXIgKnRlbTsKKwlpZiAobmV3LT5jbGFzcyA9PSAoaW50KSBjbGFzc191c2VyIHx8IG5ldy0+Y2xhc3MgPT0gKGludCkgY2xhc3NfYWxpYXMpCisJICB0ZW0gPSAiUmVkZWZpbmUgY29tbWFuZCBcIiVzXCI/ICI7CisJZWxzZQorCSAgdGVtID0gIlJlYWxseSByZWRlZmluZSBidWlsdC1pbiBjb21tYW5kIFwiJXNcIj8gIjsKKwlpZiAoIXF1ZXJ5ICh0ZW0sIG5ldy0+bmFtZSkpCisJICBlcnJvciAoIkNvbW1hbmQgXCIlc1wiIG5vdCByZWRlZmluZWQuIiwgbmV3LT5uYW1lKTsKKyAgICAgIH0KKworICAgIGFkZF9jb20gKG5ld25hbWUsIGNsYXNzX2FsaWFzLCBvbGQtPmZ1bmN0aW9uLCBvbGQtPmRvYyk7Cit9CisKKworCisvKiBQcmludCB0aGUgY3VycmVudCB0aHJlYWQgbnVtYmVyLCBhbmQgYW55IHRocmVhZHMgd2l0aCBzaWduYWxzIGluIHRoZQorICAgcXVldWUuICAqLworCit0aHJlYWRfaW5mbyAoKQoreworICBzdHJ1Y3QgdGhyZWFkcGlkICpwOworCisgIGlmIChoYXZlX2luZmVyaW9yX3AgKCkpCisgICAgeworICAgICAgcHMucGlfYnVmZmVyID0gKGNoYXIgKikgJmNvbW1fcmVnaXN0ZXJzOworICAgICAgcHMucGlfbmJ5dGVzID0gc2l6ZW9mIGNvbW1fcmVnaXN0ZXJzOworICAgICAgcHMucGlfb2Zmc2V0ID0gMDsKKyAgICAgIHBzLnBpX3RocmVhZCA9IGluZmVyaW9yX3RocmVhZDsKKyAgICAgIGlvY3RsIChpbmZlcmlvcl9mZCwgUElYUkRDUkVHUywgJnBzKTsKKyAgICB9CisKKyAgLyogRklYTUU6IHN0b3Bfc2lnbmFsIGlzIGZyb20gdGFyZ2V0LmggYnV0IHN0b3Bfc2lnY29kZSBpcyBhCisgICAgIGNvbnZleC1zcGVjaWZpYyB0aGluZy4gICovCisgIHByaW50Zl9maWx0ZXJlZCAoIkN1cnJlbnQgdGhyZWFkICVkIHN0b3BwZWQgd2l0aCBzaWduYWwgJWQuJWQgKCVzKS5cbiIsCisJCSAgIGluZmVyaW9yX3RocmVhZCwgc3RvcF9zaWduYWwsIHN0b3Bfc2lnY29kZSwKKwkJICAgc3Vic2lnX25hbWUgKHN0b3Bfc2lnbmFsLCBzdG9wX3NpZ2NvZGUpKTsKKyAgCisgIGZvciAocCA9IHNpZ25hbF9zdGFjazsgcC0+cGlkOyBwLS0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiVGhyZWFkICVkIHN0b3BwZWQgd2l0aCBzaWduYWwgJWQuJWQgKCVzKS5cbiIsCisJCSAgICAgcC0+dGhyZWFkLCBwLT5zaWdubywgcC0+c3Vic2lnLAorCQkgICAgIHN1YnNpZ19uYW1lIChwLT5zaWdubywgcC0+c3Vic2lnKSk7CisJCQorICBpZiAoaXNjcmxiaXQgKGNvbW1fcmVnaXN0ZXJzLmNyY3RsLmxiaXRzLmNjLCA2NCsxMykpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiTmV3IHRocmVhZCBzdGFydCBwYyAlI3hcbiIsCisJCSAgICAgKGxvbmcpIChjb21tX3JlZ2lzdGVycy5jcnJlZy5wY3BzdyA+PiAzMikpOworfQorCisvKiBSZXR1cm4gc3RyaW5nIGRlc2NyaWJpbmcgYSBzaWduYWwuc3ViY29kZSBudW1iZXIgKi8KKworc3RhdGljIGNoYXIgKgorc3Vic2lnX25hbWUgKHNpZ25vLCBzdWJjb2RlKQorICAgICBpbnQgc2lnbm8sIHN1YmNvZGU7Cit7CisgIHN0YXRpYyBjaGFyICpzdWJzaWc0W10gPSB7CisgICAgImVycm9yIGV4aXQiLCAicHJpdmlsZWdlZCBpbnN0cnVjdGlvbiIsICJ1bmtub3duIiwKKyAgICAidW5rbm93biIsICJ1bmRlZmluZWQgb3Bjb2RlIiwKKyAgICAwfTsKKyAgc3RhdGljIGNoYXIgKnN1YnNpZzVbXSA9IHswLAorICAgICJicmVha3BvaW50IiwgInNpbmdsZSBzdGVwIiwgImZvcmsgdHJhcCIsICJleGVjIHRyYXAiLCAicGZvcmsgdHJhcCIsCisgICAgImpvaW4gdHJhcCIsICJpZGxlIHRyYXAiLCAibGFzdCB0aHJlYWQiLCAid2ZvcmsgdHJhcCIsCisgICAgInByb2Nlc3MgYnJlYWtwb2ludCIsICJ0cmFwIGluc3RydWN0aW9uIiwKKyAgICAwfTsKKyAgc3RhdGljIGNoYXIgKnN1YnNpZzhbXSA9IHswLAorICAgICJpbnQgb3ZlcmZsb3ciLCAiaW50IGRpdmlkZSBjaGVjayIsICJmbG9hdCBvdmVyZmxvdyIsCisgICAgImZsb2F0IGRpdmlkZSBjaGVjayIsICJmbG9hdCB1bmRlcmZsb3ciLCAicmVzZXJ2ZWQgb3BlcmFuZCIsCisgICAgInNxcnQgZXJyb3IiLCAiZXhwIGVycm9yIiwgImxuIGVycm9yIiwgInNpbiBlcnJvciIsICJjb3MgZXJyb3IiLAorICAgIDB9OworICBzdGF0aWMgY2hhciAqc3Vic2lnMTBbXSA9IHswLAorICAgICJpbnZhbGlkIGlud2FyZCByaW5nIGFkZHJlc3MiLCAiaW52YWxpZCBvdXR3YXJkIHJpbmcgY2FsbCIsCisgICAgImludmFsaWQgaW53YXJkIHJpbmcgcmV0dXJuIiwgImludmFsaWQgc3lzY2FsbCBnYXRlIiwKKyAgICAiaW52YWxpZCBydG4gZnJhbWUgbGVuZ3RoIiwgImludmFsaWQgY29tbSByZWcgYWRkcmVzcyIsCisgICAgImludmFsaWQgdHJhcCBnYXRlIiwKKyAgICAwfTsKKyAgc3RhdGljIGNoYXIgKnN1YnNpZzExW10gPSB7MCwKKyAgICAicmVhZCBhY2Nlc3MgZGVuaWVkIiwgIndyaXRlIGFjY2VzcyBkZW5pZWQiLCAiZXhlY3V0ZSBhY2Nlc3MgZGVuaWVkIiwKKyAgICAic2VnbWVudCBkZXNjcmlwdG9yIGZhdWx0IiwgInBhZ2UgdGFibGUgZmF1bHQiLCAiZGF0YSByZWZlcmVuY2UgZmF1bHQiLAorICAgICJpL28gYWNjZXNzIGRlbmllZCIsICJsZXZ0IHB0ZSBpbnZhbGlkIiwKKyAgICAwfTsKKworICBzdGF0aWMgY2hhciAqKnN1YnNpZ19saXN0W10gPSAKKyAgICB7MCwgMCwgMCwgMCwgc3Vic2lnNCwgc3Vic2lnNSwgMCwgMCwgc3Vic2lnOCwgMCwgc3Vic2lnMTAsIHN1YnNpZzExLCAwfTsKKworICBpbnQgaTsKKyAgY2hhciAqcDsKKworICBpZiAoKHAgPSBzdHJzaWduYWwgKHNpZ25vKSkgPT0gTlVMTCkKKyAgICBwID0gInVua25vd24iOworICBpZiAoc2lnbm8gPj0gKHNpemVvZiBzdWJzaWdfbGlzdCAvIHNpemVvZiAqc3Vic2lnX2xpc3QpCisgICAgICB8fCAhc3Vic2lnX2xpc3Rbc2lnbm9dKQorICAgIHJldHVybiBwOworICBmb3IgKGkgPSAxOyBzdWJzaWdfbGlzdFtzaWdub11baV07IGkrKykKKyAgICBpZiAoaSA9PSBzdWJjb2RlKQorICAgICAgcmV0dXJuIHN1YnNpZ19saXN0W3NpZ25vXVtzdWJjb2RlXTsKKyAgcmV0dXJuIHA7Cit9CisKKworLyogUHJpbnQgYSBjb21wYWN0IGRpc3BsYXkgb2YgdGhyZWFkIHN0YXR1cywgZXNzZW50aWFsbHkgeC9pICRwYworICAgZm9yIGFsbCBhY3RpdmUgdGhyZWFkcy4gICovCisKK3N0YXRpYyB2b2lkCit0aHJlYWRzdGF0ICgpCit7CisgIGludCB0OworCisgIGZvciAodCA9IDA7IHQgPCBuX3RocmVhZHM7IHQrKykKKyAgICBpZiAodGhyZWFkX3N0YXRlW3RdID09IFBJX1RBTElWRSkKKyAgICAgIHsKKwlwcmludGZfZmlsdGVyZWQgKCIlZCVjICUwOHglYyAlZC4lZCAiLCB0LAorCQkJICh0ID09IGluZmVyaW9yX3RocmVhZCA/ICcqJyA6ICcgJyksIHRocmVhZF9wY1t0XSwKKwkJCSAodGhyZWFkX2lzX2luX2tlcm5lbFt0XSA/ICcjJyA6ICcgJyksCisJCQkgdGhyZWFkX3NpZ25hbFt0XSwgdGhyZWFkX3NpZ2NvZGVbdF0pOworCXByaW50X2luc24gKHRocmVhZF9wY1t0XSwgc3Rkb3V0KTsKKwlwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICAgICAgfQorfQorCisvKiBDaGFuZ2UgdGhlIGN1cnJlbnQgdGhyZWFkIHRvIEFSRy4gICovCisKK3NldF90aHJlYWRfY29tbWFuZCAoYXJnKQorICAgICBjaGFyICphcmc7Cit7CisgICAgaW50IHRocmVhZDsKKworICAgIGlmICghYXJnKQorICAgICAgeworCXRocmVhZHN0YXQgKCk7CisJcmV0dXJuOworICAgICAgfQorCisgICAgdGhyZWFkID0gcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAoYXJnKTsKKworICAgIGlmICh0aHJlYWQgPCAwIHx8IHRocmVhZCA+IG5fdGhyZWFkcyB8fCB0aHJlYWRfc3RhdGVbdGhyZWFkXSAhPSBQSV9UQUxJVkUpCisgICAgICBlcnJvciAoIm5vIHN1Y2ggdGhyZWFkLiIpOworCisgICAgc2VsZWN0X3RocmVhZCAodGhyZWFkKTsKKworICAgIHN0b3BfcGMgPSByZWFkX3BjICgpOworICAgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7CisgICAgc2VsZWN0X2ZyYW1lIChnZXRfY3VycmVudF9mcmFtZSAoKSwgMCk7CisgICAgcHJpbnRfc3RhY2tfZnJhbWUgKHNlbGVjdGVkX2ZyYW1lLCBzZWxlY3RlZF9mcmFtZV9sZXZlbCwgLTEpOworfQorCisvKiBIZXJlIG9uIENPTlQgY29tbWFuZDsgZ2RiJ3MgZGlzcGF0Y2ggYWRkcmVzcyBpcyBjaGFuZ2VkIHRvIGNvbWUgaGVyZS4KKyAgIFNldCBnbG9iYWwgdmFyaWFibGUgQUxMX0NPTlRJTlVFIHRvIHRlbGwgcmVzdW1lKCkgdGhhdCBpdCBzaG91bGQKKyAgIHN0YXJ0IHVwIGFsbCB0aHJlYWRzLCBhbmQgdGhhdCBhIHRocmVhZCBzd2l0Y2ggd2lsbCBub3QgYmxvdyBnZGIncworICAgbWluZC4gICovCisKK3N0YXRpYyB2b2lkCitjb252ZXhfY29udF9jb21tYW5kIChwcm9jX2NvdW50X2V4cCwgZnJvbV90dHkpCisgICAgIGNoYXIgKnByb2NfY291bnRfZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGFsbF9jb250aW51ZSA9IDE7CisgIGNvbnRfY29tbWFuZCAocHJvY19jb3VudF9leHAsIGZyb21fdHR5KTsKK30KKworLyogSGVyZSBvbiAxQ09OVCBjb21tYW5kLiAgUmVzdW1lIG9ubHkgdGhlIGN1cnJlbnQgdGhyZWFkLiAgKi8KKworb25lX2NvbnRfY29tbWFuZCAocHJvY19jb3VudF9leHAsIGZyb21fdHR5KQorICAgICBjaGFyICpwcm9jX2NvdW50X2V4cDsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjb250X2NvbW1hbmQgKHByb2NfY291bnRfZXhwLCBmcm9tX3R0eSk7Cit9CisKKy8qIFByaW50IHRoZSBjb250ZW50cyBhbmQgbG9jayBiaXRzIG9mIGFsbCBjb21tdW5pY2F0aW9uIHJlZ2lzdGVycywKKyAgIG9yIGp1c3QgcmVnaXN0ZXIgQVJHIGlmIEFSRyBpcyBhIGNvbW11bmljYXRpb24gcmVnaXN0ZXIsCisgICBvciB0aGUgMy13b3JkIHJlc291cmNlIHN0cnVjdHVyZSBpbiBtZW1vcnkgYXQgYWRkcmVzcyBBUkcuICAqLworCitjb21tX3JlZ2lzdGVyc19pbmZvIChhcmcpCisgICAgY2hhciAqYXJnOworeworICBpbnQgaSwgcmVnbnVtOworCisgIGlmIChhcmcpCisgICAgeworICAgICAgICAgICAgIGlmIChzc2NhbmYgKGFyZywgIiRjJWQiLCAmcmVnbnVtKSA9PSAxKSB7CisJOworICAgICAgfSBlbHNlIGlmIChzc2NhbmYgKGFyZywgIiRDJWQiLCAmcmVnbnVtKSA9PSAxKSB7CisJOworICAgICAgfSBlbHNlIHsKKwlyZWdudW0gPSBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIChhcmcpOworCWlmIChyZWdudW0gPiAwKQorCSAgcmVnbnVtICY9IH4weDgwMDA7CisgICAgICB9CisKKyAgICAgIGlmIChyZWdudW0gPj0gNjQpCisJZXJyb3IgKCIlczogaW52YWxpZCByZWdpc3RlciBuYW1lLiIsIGFyZyk7CisKKyAgICAgIC8qIGlmIHdlIGdvdCBhICh1c2VyKSBhZGRyZXNzLCBleGFtaW5lIHRoZSByZXNvdXJjZSBzdHJ1Y3QgdGhlcmUgKi8KKworICAgICAgaWYgKHJlZ251bSA8IDApCisJeworCSAgc3RhdGljIGludCBidWZbM107CisJICByZWFkX21lbW9yeSAocmVnbnVtLCBidWYsIHNpemVvZiBidWYpOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiJTA4eCAgJTA4eCUwOHglc1xuIiwgcmVnbnVtLCBidWZbMV0sIGJ1ZlsyXSwKKwkJCSAgIGJ1ZlswXSAmIDB4ZmYgPyAiIGxvY2tlZCIgOiAiIik7CisJICByZXR1cm47CisJfQorICAgIH0KKworICBwcy5waV9idWZmZXIgPSAoY2hhciAqKSAmY29tbV9yZWdpc3RlcnM7CisgIHBzLnBpX25ieXRlcyA9IHNpemVvZiBjb21tX3JlZ2lzdGVyczsKKyAgcHMucGlfb2Zmc2V0ID0gMDsKKyAgcHMucGlfdGhyZWFkID0gaW5mZXJpb3JfdGhyZWFkOworICBpb2N0bCAoaW5mZXJpb3JfZmQsIFBJWFJEQ1JFR1MsICZwcyk7CisKKyAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgaWYgKCFhcmcgfHwgaSA9PSByZWdudW0pCisgICAgICBwcmludGZfZmlsdGVyZWQgKCIlMmQgMHg4JTAzeCAlMDE2bGx4JXNcbiIsIGksIGksCisJCSAgICAgICBjb21tX3JlZ2lzdGVycy5jcnJlZy5yNFtpXSwKKwkJICAgICAgIChpc2NybGJpdCAoY29tbV9yZWdpc3RlcnMuY3JjdGwubGJpdHMuY2MsIGkpCisJCQk/ICIgbG9ja2VkIiA6ICIiKSk7Cit9CisKKy8qIFByaW50IHRoZSBwc3cgKi8KKworc3RhdGljIHZvaWQgCitwc3dfaW5mbyAoYXJnKQorICAgIGNoYXIgKmFyZzsKK3sKKyAgc3RydWN0IHBzd2JpdAorICAgIHsKKyAgICAgIGludCBiaXQ7CisgICAgICBpbnQgcG9zOworICAgICAgY2hhciAqdGV4dDsKKyAgICB9OworCisgIHN0YXRpYyBzdHJ1Y3QgcHN3Yml0IHBzd2JpdFtdID0KKyAgICB7CisgICAgICB7IDB4ODAwMDAwMDAsIC0xLCAiQSBjYXJyeSIgfSwgCisgICAgICB7IDB4NDAwMDAwMDAsIC0xLCAiQSBpbnRlZ2VyIG92ZXJmbG93IiB9LCAKKyAgICAgIHsgMHgyMDAwMDAwMCwgLTEsICJBIHplcm8gZGl2aWRlIiB9LCAKKyAgICAgIHsgMHgxMDAwMDAwMCwgLTEsICJJbnRlZ2VyIG92ZXJmbG93IGVuYWJsZSIgfSwgCisgICAgICB7IDB4MDgwMDAwMDAsIC0xLCAiVHJhY2UiIH0sIAorICAgICAgeyAweDA2MDAwMDAwLCAyNSwgIkZyYW1lIGxlbmd0aCIgfSwgCisgICAgICB7IDB4MDEwMDAwMDAsIC0xLCAiU2VxdWVudGlhbCIgfSwgCisgICAgICB7IDB4MDA4MDAwMDAsIC0xLCAiUyBjYXJyeSIgfSwgCisgICAgICB7IDB4MDA0MDAwMDAsIC0xLCAiUyBpbnRlZ2VyIG92ZXJmbG93IiB9LCAKKyAgICAgIHsgMHgwMDIwMDAwMCwgLTEsICJTIHplcm8gZGl2aWRlIiB9LCAKKyAgICAgIHsgMHgwMDEwMDAwMCwgLTEsICJaZXJvIGRpdmlkZSBlbmFibGUiIH0sIAorICAgICAgeyAweDAwMDgwMDAwLCAtMSwgIkZsb2F0aW5nIHVuZGVyZmxvdyIgfSwgCisgICAgICB7IDB4MDAwNDAwMDAsIC0xLCAiRmxvYXRpbmcgb3ZlcmZsb3ciIH0sIAorICAgICAgeyAweDAwMDIwMDAwLCAtMSwgIkZsb2F0aW5nIHJlc2VydmVkIG9wZXJhbmQiIH0sIAorICAgICAgeyAweDAwMDEwMDAwLCAtMSwgIkZsb2F0aW5nIHplcm8gZGl2aWRlIiB9LCAKKyAgICAgIHsgMHgwMDAwODAwMCwgLTEsICJGbG9hdGluZyBlcnJvciBlbmFibGUiIH0sIAorICAgICAgeyAweDAwMDA0MDAwLCAtMSwgIkZsb2F0aW5nIHVuZGVyZmxvdyBlbmFibGUiIH0sIAorICAgICAgeyAweDAwMDAyMDAwLCAtMSwgIklFRUUiIH0sIAorICAgICAgeyAweDAwMDAxMDAwLCAtMSwgIlNlcXVlbnRpYWwgc3RvcmVzIiB9LCAKKyAgICAgIHsgMHgwMDAwMDgwMCwgLTEsICJJbnRyaW5zaWMgZXJyb3IiIH0sIAorICAgICAgeyAweDAwMDAwNDAwLCAtMSwgIkludHJpbnNpYyBlcnJvciBlbmFibGUiIH0sIAorICAgICAgeyAweDAwMDAwMjAwLCAtMSwgIlRyYWNlIHRocmVhZCBjcmVhdGVzIiB9LCAKKyAgICAgIHsgMHgwMDAwMDEwMCwgLTEsICJUaHJlYWQgaW5pdCB0cmFwIiB9LCAKKyAgICAgIHsgMHgwMDAwMDBlMCwgIDUsICJSZXNlcnZlZCIgfSwKKyAgICAgIHsgMHgwMDAwMDAxZiwgIDAsICJJbnRyaW5zaWMgZXJyb3IgY29kZSIgfSwKKyAgICAgIHswLCAwLCAwfSwKKyAgICB9OworCisgIGxvbmcgcHN3OworICBzdHJ1Y3QgcHN3Yml0ICpwOworCisgIGlmIChhcmcpCisgICAgcHN3ID0gcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAoYXJnKTsKKyAgZWxzZQorICAgIHBzdyA9IHJlYWRfcmVnaXN0ZXIgKFBTX1JFR05VTSk7CisKKyAgZm9yIChwID0gcHN3Yml0OyBwLT5iaXQ7IHArKykKKyAgICB7CisgICAgICBpZiAocC0+cG9zIDwgMCkKKwlwcmludGZfZmlsdGVyZWQgKCIlMDh4ICAlcyAgJXNcbiIsIHAtPmJpdCwKKwkJCSAocHN3ICYgcC0+Yml0KSA/ICJ5ZXMiIDogIm5vICIsIHAtPnRleHQpOworICAgICAgZWxzZQorCXByaW50Zl9maWx0ZXJlZCAoIiUwOHggJTNkICAgJXNcbiIsIHAtPmJpdCwKKwkJCSAocHN3ICYgcC0+Yml0KSA+PiBwLT5wb3MsIHAtPnRleHQpOworICAgIH0KK30KKwwKKyNpbmNsdWRlICJzeW10YWIuaCIKKworLyogcmVnIChmbXRfZmllbGQsIGluc3RfZmllbGQpIC0tCisgICB0aGUge2ZpcnN0LHNlY29uZCx0aGlyZH0gb3BlcmFuZCBvZiBpbnN0cnVjdGlvbiBhcyBmbXRfZmllbGQgPSBbaWprXQorICAgZ2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIGZyb20gdGhlIFtpamtdIHBvc2l0aW9uIG9mIHRoZSBpbnN0cnVjdGlvbiAqLworCisjZGVmaW5lIHJlZyhhLGIpICgoY2hhciAoKilbM10pKG9wW2ZtdC0+YV0pKVtpbnN0LmYwLmJdCisKKy8qIGxpdCAoZm10X2ZpZWxkKSAtLSBmaWVsZCBbaWprXSBpcyBhIGxpdGVyYWwgKFBTVywgVkwsIGVnKSAqLworCisjZGVmaW5lIGxpdChpKSBvcFtmbXQtPmldCisKKy8qIGFqW2pdIC0tIG5hbWUgZm9yIEEgcmVnaXN0ZXIgaiAqLworCisjZGVmaW5lIGFqICgoY2hhciAoKilbM10pKG9wW0FdKSkKKwwKK3VuaW9uIGluc3QgeworICAgIHN0cnVjdCB7CisJdW5zaWduZWQgICA6IDc7CisJdW5zaWduZWQgaSA6IDM7CisJdW5zaWduZWQgaiA6IDM7CisJdW5zaWduZWQgayA6IDM7CisJdW5zaWduZWQgICA6IDE2OworCXVuc2lnbmVkICAgOiAzMjsKKyAgICB9IGYwOworICAgIHN0cnVjdCB7CisJdW5zaWduZWQgICA6IDg7CisJdW5zaWduZWQgaW5kaXIgOiAxOworCXVuc2lnbmVkIGxlbiA6IDE7CisJdW5zaWduZWQgaiA6IDM7CisJdW5zaWduZWQgayA6IDM7CisJdW5zaWduZWQgICA6IDE2OworCXVuc2lnbmVkICAgOiAzMjsKKyAgICB9IGYxOworICAgIHVuc2lnbmVkIGNoYXIgYnl0ZVs4XTsKKyAgICB1bnNpZ25lZCBzaG9ydCBoYWxmWzRdOworICAgIGNoYXIgc2lnbmVkX2J5dGVbOF07CisgICAgc2hvcnQgc2lnbmVkX2hhbGZbNF07Cit9OworCitzdHJ1Y3Qgb3Bmb3JtIHsKKyAgICBpbnQgbWFzazsJCQkvKiBvcGNvZGUgbWFzayAqLworICAgIGludCBzaGlmdDsJCQkvKiBvcGNvZGUgYWxpZ24gKi8KKyAgICBzdHJ1Y3QgZm9ybXN0ciAqZm9ybXN0clszXTsJLyogU1QsIEUwLCBFMSAqLworfTsKKworc3RydWN0IGZvcm1zdHIgeworICAgIHVuc2lnbmVkIGxvcDo4LCByb3A6NTsJLyogb3Bjb2RlICovCisgICAgdW5zaWduZWQgZm10OjU7CQkvKiBpbnN0IGZvcm1hdCAqLworICAgIHVuc2lnbmVkIGk6NSwgajo1LCBrOjI7CS8qIG9wZXJhbmQgZm9ybWF0cyAqLworfTsKKworI2luY2x1ZGUgIm9wY29kZS9jb252ZXguaCIKKworQ09OU1QgdW5zaWduZWQgY2hhciBmb3JtZGVjb2RlIFtdID0geworICAgIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisgICAgOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSwKKyAgICAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorICAgIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisgICAgMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwKKyAgICAyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLAorICAgIDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsCisgICAgNCw0LDQsNCw0LDQsNCw0LDUsNSw1LDUsNiw2LDcsOCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCit9OworCitDT05TVCBzdHJ1Y3Qgb3Bmb3JtIG9wZGVjb2RlW10gPSB7CisgICAgMHg3ZTAwLCA5LCBmb3JtYXQwLCBlMF9mb3JtYXQwLCBlMV9mb3JtYXQwLAorICAgIDB4M2YwMCwgOCwgZm9ybWF0MSwgZTBfZm9ybWF0MSwgZTFfZm9ybWF0MSwKKyAgICAweDFmYzAsIDYsIGZvcm1hdDIsIGUwX2Zvcm1hdDIsIGUxX2Zvcm1hdDIsCisgICAgMHgwZmMwLCA2LCBmb3JtYXQzLCBlMF9mb3JtYXQzLCBlMV9mb3JtYXQzLAorICAgIDB4MDcwMCwgOCwgZm9ybWF0NCwgZTBfZm9ybWF0NCwgZTFfZm9ybWF0NCwKKyAgICAweDAzYzAsIDYsIGZvcm1hdDUsIGUwX2Zvcm1hdDUsIGUxX2Zvcm1hdDUsCisgICAgMHgwMWY4LCAzLCBmb3JtYXQ2LCBlMF9mb3JtYXQ2LCBlMV9mb3JtYXQ2LAorICAgIDB4MDBmOCwgMywgZm9ybWF0NywgZTBfZm9ybWF0NywgZTFfZm9ybWF0NywKKyAgICAweDAwMDAsIDAsIGZvcm1hdHgsIGZvcm1hdHgsIGZvcm1hdHgsCisgICAgMHgwZjgwLCA3LCBmb3JtYXR4LCBmb3JtYXR4LCBmb3JtYXR4LAorICAgIDB4MGY4MCwgNywgZm9ybWF0eCwgZm9ybWF0eCwgZm9ybWF0eCwKK307CisMCisvKiBQcmludCB0aGUgaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyBNRU1BRERSIGluIGRlYnVnZ2VkIG1lbW9yeSwKKyAgIG9uIFNUUkVBTS4gIFJldHVybnMgbGVuZ3RoIG9mIHRoZSBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMuICAqLworCitpbnQKK2NvbnZleF9wcmludF9pbnNuIChtZW1hZGRyLCBzdHJlYW0pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBGSUxFICpzdHJlYW07Cit7CisgIHVuaW9uIGluc3QgaW5zdDsKKyAgc3RydWN0IGZvcm1zdHIgKmZtdDsKKyAgcmVnaXN0ZXIgaW50IGZvcm1hdCwgb3AxLCBwZng7CisgIGludCBsOworCisgIHJlYWRfbWVtb3J5IChtZW1hZGRyLCAmaW5zdCwgc2l6ZW9mIGluc3QpOworCisgIC8qIFJlbW92ZSBhbmQgbm90ZSBwcmVmaXgsIGlmIHByZXNlbnQgKi8KKyAgICAKKyAgcGZ4ID0gaW5zdC5oYWxmWzBdOworICBpZiAoKHBmeCAmIDB4ZmZmMCkgPT0gMHg3ZWYwKQorICAgIHsKKyAgICAgIHBmeCA9ICgocGZ4ID4+IDMpICYgMSkgKyAxOworICAgICAgKihsb25nIGxvbmcgKikgJmluc3QgPSAqKGxvbmcgbG9uZyAqKSAmaW5zdC5oYWxmWzFdOworICAgIH0KKyAgZWxzZSBwZnggPSAwOworCisgIC8qIFNwbGl0IG9wY29kZSBpbnRvIGZvcm1hdC5vcDEgYW5kIGxvb2sgdXAgaW4gYXBwcm9wcmlhdGUgdGFibGUgKi8KKworICBmb3JtYXQgPSBmb3JtZGVjb2RlW2luc3QuYnl0ZVswXV07CisgIG9wMSA9IChpbnN0LmhhbGZbMF0gJiBvcGRlY29kZVtmb3JtYXRdLm1hc2spID4+IG9wZGVjb2RlW2Zvcm1hdF0uc2hpZnQ7CisgIGlmIChmb3JtYXQgPT0gOSkKKyAgICB7CisgICAgICBpZiAocGZ4KQorCWZtdCA9IGZvcm1hdHg7CisgICAgICBlbHNlIGlmIChpbnN0LmYxLmogPT0gMCkKKwlmbXQgPSAmZm9ybWF0MWFbb3AxXTsKKyAgICAgIGVsc2UgaWYgKGluc3QuZjEuaiA9PSAxKQorCWZtdCA9ICZmb3JtYXQxYltvcDFdOworICAgICAgZWxzZQorCWZtdCA9IGZvcm1hdHg7CisgICAgfQorICBlbHNlCisgICAgZm10ID0gJm9wZGVjb2RlW2Zvcm1hdF0uZm9ybXN0cltwZnhdW29wMV07CisKKyAgLyogUHJpbnQgaXQgKi8KKworICBpZiAoZm10LT5mbXQgPT0geHh4KQorICAgIHsKKyAgICAgIC8qIG5vbmluc3RydWN0aW9uICovCisgICAgICBmcHJpbnRmIChzdHJlYW0sICIweCUwNHgiLCBwZnggPyBwZnggOiBpbnN0LmhhbGZbMF0pOworICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgIGlmIChwZngpCisgICAgcGZ4ID0gMjsKKworICBmcHJpbnRmIChzdHJlYW0sICIlcyVzJXMiLCBsb3BbZm10LT5sb3BdLCByb3BbZm10LT5yb3BdLAorCSAgICYiICAgICAgICAiW3N0cmxlbihsb3BbZm10LT5sb3BdKSArIHN0cmxlbihyb3BbZm10LT5yb3BdKV0pOworCisgIHN3aXRjaCAoZm10LT5mbXQpCisgICAgeworICAgIGNhc2UgcnJyOgkJCS8qIHRocmVlIHJlZ2lzdGVyICovCisgICAgICBmcHJpbnRmIChzdHJlYW0sICIlcywlcywlcyIsIHJlZyhpLGkpLCByZWcoaixqKSwgcmVnKGssaykpOworICAgICAgcmV0dXJuIHBmeCArIDI7CisKKyAgICBjYXNlIHJyOgkJCS8qIHR3byByZWdpc3RlciAqLworICAgICAgZnByaW50ZiAoc3RyZWFtLCAiJXMsJXMiLCByZWcoaSxqKSwgcmVnKGosaykpOworICAgICAgcmV0dXJuIHBmeCArIDI7CisKKyAgICBjYXNlIHJ4cjoJCQkvKiB0d28gcmVnaXN0ZXIsIHJldmVyc2VkIGkgYW5kIGogZmllbGRzICovCisgICAgICBmcHJpbnRmIChzdHJlYW0sICIlcywlcyIsIHJlZyhpLGspLCByZWcoaixqKSk7CisgICAgICByZXR1cm4gcGZ4ICsgMjsKKworICAgIGNhc2UgcjoJCQkvKiBvbmUgcmVnaXN0ZXIgKi8KKyAgICAgIGZwcmludGYgKHN0cmVhbSwgIiVzIiwgcmVnKGksaykpOworICAgICAgcmV0dXJuIHBmeCArIDI7CisKKyAgICBjYXNlIG5vcHM6CQkJLyogbm8gb3BlcmFuZHMgKi8KKyAgICAgIHJldHVybiBwZnggKyAyOworCisgICAgY2FzZSBucjoJCQkvKiBzaG9ydCBpbW1lZGlhdGUsIG9uZSByZWdpc3RlciAqLworICAgICAgZnByaW50ZiAoc3RyZWFtLCAiIyVkLCVzIiwgaW5zdC5mMC5qLCByZWcoaSxrKSk7CisgICAgICByZXR1cm4gcGZ4ICsgMjsKKworICAgIGNhc2UgcGNyZWw6CQkJLyogcGMgcmVsYXRpdmUgKi8KKyAgICAgIHByaW50X2FkZHJlc3MgKG1lbWFkZHIgKyAyICogaW5zdC5zaWduZWRfYnl0ZVsxXSwgc3RyZWFtKTsKKyAgICAgIHJldHVybiBwZnggKyAyOworCisgICAgY2FzZSBscjoJCQkvKiBsaXRlcmFsLCBvbmUgcmVnaXN0ZXIgKi8KKyAgICAgIGZwcmludGYgKHN0cmVhbSwgIiVzLCVzIiwgbGl0KGkpLCByZWcoaixrKSk7CisgICAgICByZXR1cm4gcGZ4ICsgMjsKKworICAgIGNhc2UgcnhsOgkJCS8qIG9uZSByZWdpc3RlciwgbGl0ZXJhbCAqLworICAgICAgZnByaW50ZiAoc3RyZWFtLCAiJXMsJXMiLCByZWcoaSxrKSwgbGl0KGopKTsKKyAgICAgIHJldHVybiBwZnggKyAyOworCisgICAgY2FzZSBybHI6CQkJLyogcmVnaXN0ZXIsIGxpdGVyYWwsIHJlZ2lzdGVyICovCisgICAgICBmcHJpbnRmIChzdHJlYW0sICIlcywlcywlcyIsIHJlZyhpLGopLCBsaXQoaiksIHJlZyhrLGspKTsKKyAgICAgIHJldHVybiBwZnggKyAyOworCisgICAgY2FzZSBycmw6CQkJLyogcmVnaXN0ZXIsIHJlZ2lzdGVyLCBsaXRlcmFsICovCisgICAgICBmcHJpbnRmIChzdHJlYW0sICIlcywlcywlcyIsIHJlZyhpLGopLCByZWcoaixrKSwgbGl0KGspKTsKKyAgICAgIHJldHVybiBwZnggKyAyOworCisgICAgY2FzZSBpbWw6CQkJLyogaW1tZWRpYXRlLCBsaXRlcmFsICovCisgICAgICBpZiAoaW5zdC5mMS5sZW4pCisJeworCSAgZnByaW50ZiAoc3RyZWFtLCAiIyUjeCwlcyIsCisJCSAgIChpbnN0LnNpZ25lZF9oYWxmWzFdIDw8IDE2KSArIGluc3QuaGFsZlsyXSwgbGl0KGkpKTsKKwkgIHJldHVybiBwZnggKyA2OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBmcHJpbnRmIChzdHJlYW0sICIjJWQsJXMiLCBpbnN0LnNpZ25lZF9oYWxmWzFdLCBsaXQoaSkpOworCSAgcmV0dXJuIHBmeCArIDQ7CisJfQorCisgICAgY2FzZSBpbXI6CQkJLyogaW1tZWRpYXRlLCByZWdpc3RlciAqLworICAgICAgaWYgKGluc3QuZjEubGVuKQorCXsKKwkgIGZwcmludGYgKHN0cmVhbSwgIiMlI3gsJXMiLAorCQkgICAoaW5zdC5zaWduZWRfaGFsZlsxXSA8PCAxNikgKyBpbnN0LmhhbGZbMl0sIHJlZyhpLGspKTsKKwkgIHJldHVybiBwZnggKyA2OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBmcHJpbnRmIChzdHJlYW0sICIjJWQsJXMiLCBpbnN0LnNpZ25lZF9oYWxmWzFdLCByZWcoaSxrKSk7CisJICByZXR1cm4gcGZ4ICsgNDsKKwl9CisKKyAgICBjYXNlIGExcjoJCQkvKiBtZW1vcnksIHJlZ2lzdGVyICovCisgICAgICBsID0gcHJpbnRfZWZmYSAoaW5zdCwgc3RyZWFtKTsKKyAgICAgIGZwcmludGYgKHN0cmVhbSwgIiwlcyIsIHJlZyhpLGspKTsKKyAgICAgIHJldHVybiBwZnggKyBsOworCisgICAgY2FzZSBhMWw6CQkJLyogbWVtb3J5LCBsaXRlcmFsICAqLworICAgICAgbCA9IHByaW50X2VmZmEgKGluc3QsIHN0cmVhbSk7CisgICAgICBmcHJpbnRmIChzdHJlYW0sICIsJXMiLCBsaXQoaSkpOworICAgICAgcmV0dXJuIHBmeCArIGw7CisKKyAgICBjYXNlIGEycjoJCQkvKiByZWdpc3RlciwgbWVtb3J5ICovCisgICAgICBmcHJpbnRmIChzdHJlYW0sICIlcywiLCByZWcoaSxrKSk7CisgICAgICByZXR1cm4gcGZ4ICsgcHJpbnRfZWZmYSAoaW5zdCwgc3RyZWFtKTsKKworICAgIGNhc2UgYTJsOgkJCS8qIGxpdGVyYWwsIG1lbW9yeSAqLworICAgICAgZnByaW50ZiAoc3RyZWFtLCAiJXMsIiwgbGl0KGkpKTsKKyAgICAgIHJldHVybiBwZnggKyBwcmludF9lZmZhIChpbnN0LCBzdHJlYW0pOworCisgICAgY2FzZSBhMzoJCQkvKiBtZW1vcnkgKi8KKyAgICAgIHJldHVybiBwZnggKyBwcmludF9lZmZhIChpbnN0LCBzdHJlYW0pOworCisgICAgY2FzZSBhNDoJCQkvKiBzeXN0ZW0gY2FsbCAqLworICAgICAgbCA9IDI5OyBnb3RvIGE0YTU7CisgICAgY2FzZSBhNToJCQkvKiB0cmFwICovCisgICAgICBsID0gMjc7CisgICAgYTRhNToKKyAgICAgIGlmIChpbnN0LmYxLmxlbikKKwl7CisJICB1bnNpZ25lZCBpbnQgbSA9IChpbnN0LnNpZ25lZF9oYWxmWzFdIDw8IDE2KSArIGluc3QuaGFsZlsyXTsKKwkgIGZwcmludGYgKHN0cmVhbSwgIiMlZCwjJWQiLCBtID4+IGwsIG0gJiAoLTEgPj4gKDMyLWwpKSk7CisJICByZXR1cm4gcGZ4ICsgNjsKKwl9CisgICAgICBlbHNlCisJeworCSAgdW5zaWduZWQgaW50IG0gPSBpbnN0LnNpZ25lZF9oYWxmWzFdOworCSAgZnByaW50ZiAoc3RyZWFtLCAiIyVkLCMlZCIsIG0gPj4gbCwgbSAmICgtMSA+PiAoMzItbCkpKTsKKwkgIHJldHVybiBwZnggKyA0OworCX0KKyAgICB9Cit9CisKKworLyogcHJpbnQgZWZmZWN0aXZlIGFkZHJlc3MgQG5ubihhaiksIHJldHVybiBpbnN0cnVjdGlvbiBsZW5ndGggKi8KKworaW50IHByaW50X2VmZmEgKGluc3QsIHN0cmVhbSkKKyAgICAgdW5pb24gaW5zdCBpbnN0OworICAgICBGSUxFICpzdHJlYW07Cit7CisgIGludCBuLCBsOworCisgIGlmIChpbnN0LmYxLmxlbikKKyAgICB7CisgICAgICBuID0gKGluc3Quc2lnbmVkX2hhbGZbMV0gPDwgMTYpICsgaW5zdC5oYWxmWzJdOworICAgICAgbCA9IDY7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbiA9IGluc3Quc2lnbmVkX2hhbGZbMV07CisgICAgICBsID0gNDsKKyAgICB9CisJCisgIGlmIChpbnN0LmYxLmluZGlyKQorICAgIHByaW50ZiAoIkAiKTsKKworICBpZiAoIWluc3QuZjEuaikKKyAgICB7CisgICAgICBwcmludF9hZGRyZXNzIChuLCBzdHJlYW0pOworICAgICAgcmV0dXJuIGw7CisgICAgfQorCisgIGZwcmludGYgKHN0cmVhbSwgKG4gJiAweGYwMDAwMDAwKSA9PSAweDgwMDAwMDAwID8gIiUjeCglcykiIDogIiVkKCVzKSIsCisJICAgbiwgYWpbaW5zdC5mMS5qXSk7CisKKyAgcmV0dXJuIGw7Cit9CisKKwwKK3ZvaWQKK19pbml0aWFsaXplX2NvbnZleF9kZXAgKCkKK3sKKyAgYWRkX2NvbSAoImFsaWFzIiwgY2xhc3Nfc3VwcG9ydCwgYWxpYXNfY29tbWFuZCwKKwkgICAiQWRkIGEgbmV3IG5hbWUgZm9yIGFuIGV4aXN0aW5nIGNvbW1hbmQuIik7CisKKyAgYWRkX2NtZCAoImJhc2UiLCBjbGFzc192YXJzLCBzZXRfYmFzZV9jb21tYW5kLAorCSAgICJDaGFuZ2UgdGhlIGludGVnZXIgb3V0cHV0IHJhZGl4IHRvIDgsIDEwIG9yIDE2XG5cCitvciB1c2UganVzdCBgc2V0IGJhc2UnIHdpdGggbm8gYXJncyB0byByZXR1cm4gdG8gdGhlIGFkLWhvYyBkZWZhdWx0LFxuXAord2hpY2ggaXMgMTYgZm9yIGludGVnZXJzIHRoYXQgbG9vayBsaWtlIGFkZHJlc3NlcywgMTAgb3RoZXJ3aXNlLiIsCisJICAgJnNldGxpc3QpOworCisgIGFkZF9jbWQgKCJwaXBlbGluZSIsIGNsYXNzX3J1biwgc2V0X3BpcGVsaW5pbmdfY29tbWFuZCwKKwkgICAiRW5hYmxlIG9yIGRpc2FibGUgb3ZlcmxhcHBlZCBleGVjdXRpb24gb2YgaW5zdHJ1Y3Rpb25zLlxuXAorV2l0aCBgc2V0IHBpcGUgb2ZmJywgZXhjZXB0aW9ucyBhcmUgcmVwb3J0ZWQgd2l0aFxuXAorJHBjIHBvaW50aW5nIGF0IHRoZSBpbnN0cnVjdGlvbiBhZnRlciB0aGUgZmF1bHRpbmcgb25lLlxuXAorVGhlIGRlZmF1bHQgaXMgYHNldCBwaXBlIG9uJywgd2hpY2ggcnVucyBmYXN0ZXIuIiwKKwkgICAmc2V0bGlzdCk7CisKKyAgYWRkX2NtZCAoInBhcmFsbGVsIiwgY2xhc3NfcnVuLCBzZXRfcGFyYWxsZWxfY29tbWFuZCwKKwkgICAiRW5hYmxlIG9yIGRpc2FibGUgbXVsdGktdGhyZWFkZWQgZXhlY3V0aW9uIG9mIHBhcmFsbGVsIGNvZGUuXG5cCitgc2V0IHBhcmFsbGVsIG9mZicgbWVhbnMgcnVuIHRoZSBwcm9ncmFtIG9uIGEgc2luZ2xlIENQVS5cblwKK2BzZXQgcGFyYWxsZWwgZml4ZWQnIG1lYW5zIHJ1biB0aGUgcHJvZ3JhbSB3aXRoIGFsbCBDUFVzIGFzc2lnbmVkIHRvIGl0LlxuXAorYHNldCBwYXJhbGxlbCBvbicgbWVhbnMgcnVuIHRoZSBwcm9ncmFtIG9uIGFueSBDUFVzIHRoYXQgYXJlIGF2YWlsYWJsZS4iLAorCSAgICZzZXRsaXN0KTsKKworICBhZGRfY29tICgiMWNvbnQiLCBjbGFzc19ydW4sIG9uZV9jb250X2NvbW1hbmQsCisJICAgIkNvbnRpbnVlIHRoZSBwcm9ncmFtLCBhY3RpdmF0aW5nIG9ubHkgdGhlIGN1cnJlbnQgdGhyZWFkLlxuXAorQXJncyBhcmUgdGhlIHNhbWUgYXMgdGhlIGBjb250JyBjb21tYW5kLiIpOworCisgIGFkZF9jb20gKCJ0aHJlYWQiLCBjbGFzc19ydW4sIHNldF90aHJlYWRfY29tbWFuZCwKKwkgICAiQ2hhbmdlIHRoZSBjdXJyZW50IHRocmVhZCwgdGhlIG9uZSB1bmRlciBzY3J1dGlueSBhbmQgY29udHJvbC5cblwKK1dpdGggbm8gYXJnLCBzaG93IHRoZSBhY3RpdmUgdGhyZWFkcywgdGhlIGN1cnJlbnQgb25lIG1hcmtlZCB3aXRoICouIik7CisKKyAgYWRkX2luZm8gKCJ0aHJlYWRzIiwgdGhyZWFkX2luZm8sCisJICAgICJMaXN0IHN0YXR1cyBvZiBhY3RpdmUgdGhyZWFkcy4iKTsKKworICBhZGRfaW5mbyAoImNvbW0tcmVnaXN0ZXJzIiwgY29tbV9yZWdpc3RlcnNfaW5mbywKKwkgICAgIkxpc3QgY29tbXVuaWNhdGlvbiByZWdpc3RlcnMgYW5kIHRoZWlyIGNvbnRlbnRzLlxuXAorQSBjb21tdW5pY2F0aW9uIHJlZ2lzdGVyIG5hbWUgYXMgYXJndW1lbnQgbWVhbnMgZGVzY3JpYmUgb25seSB0aGF0IHJlZ2lzdGVyLlxuXAorQW4gYWRkcmVzcyBhcyBhcmd1bWVudCBtZWFucyBkZXNjcmliZSB0aGUgcmVzb3VyY2Ugc3RydWN0dXJlIGF0IHRoYXQgYWRkcmVzcy5cblwKK2BMb2NrZWQnIG1lYW5zIHRoYXQgdGhlIHJlZ2lzdGVyIGhhcyBiZWVuIHNlbnQgdG8gYnV0IG5vdCB5ZXQgcmVjZWl2ZWQgZnJvbS4iKTsKKworICBhZGRfaW5mbyAoInBzdyIsIHBzd19pbmZvLCAKKwkgICAgIkRpc3BsYXkgJHBzLCB0aGUgcHJvY2Vzc29yIHN0YXR1cyB3b3JkLCBiaXQgYnkgYml0LlxuXAorQW4gYXJndW1lbnQgbWVhbnMgZGlzcGxheSB0aGF0IHZhbHVlJ3MgaW50ZXJwcmV0YXRpb24gYXMgYSBwc3cuIik7CisKKyAgYWRkX2NtZCAoImNvbnZleCIsIG5vX2NsYXNzLCAwLCAiQ29udmV4LXNwZWNpZmljIGNvbW1hbmRzLlxuXAorMzItYml0IHJlZ2lzdGVycyAgJHBjICRwcyAkc3AgJGFwICRmcCAkYTEtNSAkczAtNyAkdjAtNyAkdmwgJHZzICR2bSAkYzAtNjNcblwKKzY0LWJpdCByZWdpc3RlcnMgICRTMC03ICRWMC03ICRDMC02M1xuXAorXG5cCitpbmZvIHRocmVhZHMJICAgIGRpc3BsYXkgaW5mbyBvbiBzdG9wcGVkIHRocmVhZHMgd2FpdGluZyB0byBzaWduYWxcblwKK3RocmVhZAkJICAgIGRpc3BsYXkgbGlzdCBvZiBhY3RpdmUgdGhyZWFkc1xuXAordGhyZWFkIE4JICAgIHNlbGVjdCB0aHJlYWQgTiAoaXRzIHJlZ2lzdGVycywgc3RhY2ssIG1lbW9yeSwgZXRjLilcblwKK3N0ZXAsIG5leHQsIGV0YyAgICAgc3RlcCBzZWxlY3RlZCB0aHJlYWQgb25seVxuXAorMWNvbnQJCSAgICBjb250aW51ZSBzZWxlY3RlZCB0aHJlYWQgb25seVxuXAorY29udAkJICAgIGNvbnRpbnVlIGFsbCB0aHJlYWRzXG5cCitpbmZvIGNvbW0tcmVnaXN0ZXJzIGRpc3BsYXkgY29udGVudHMgb2YgY29tbSByZWdpc3RlcihzKSBvciBhIHJlc291cmNlIHN0cnVjdFxuXAoraW5mbyBwc3cJICAgIGRpc3BsYXkgcHJvY2Vzc29yIHN0YXR1cyB3b3JkICRwc1xuXAorc2V0IGJhc2UgTgkgICAgY2hhbmdlIGludGVnZXIgcmFkaXggdXNlZCBieSBgcHJpbnQnIHdpdGhvdXQgYSBmb3JtYXRcblwKK3NldCBwaXBlbGluZSBvZmYgICAgZXhjZXB0aW9ucyBhcmUgcHJlY2lzZSwgJHBjIHBvaW50cyBhZnRlciB0aGUgZmF1bHRpbmcgaW5zblxuXAorc2V0IHBpcGVsaW5lIG9uICAgICBub3JtYWwgbW9kZSwgJHBjIGlzIHNvbWV3aGVyZSBhaGVhZCBvZiBmYXVsdGluZyBpbnNuXG5cCitzZXQgcGFyYWxsZWwgb2ZmICAgIHByb2dyYW0gcnVucyBvbiBhIHNpbmdsZSBDUFVcblwKK3NldCBwYXJhbGxlbCBmaXhlZCAgYWxsIENQVXMgYXJlIGFzc2lnbmVkIHRvIHRoZSBwcm9ncmFtXG5cCitzZXQgcGFyYWxsZWwgb24gICAgIG5vcm1hbCBtb2RlLCBwYXJhbGxlbCBleGVjdXRpb24gb24gcmFuZG9tIGF2YWlsYWJsZSBDUFVzXG5cCisiLAorCSAgICZjbWRsaXN0KTsKKworfQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbnZleC14ZGVwLmMgYi9nZGIvY29udmV4LXhkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmZjMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvbnZleC14ZGVwLmMKQEAgLTAsMCArMSw5NjYgQEAKKy8qIENvbnZleCBob3N0LWRlcGVuZGVudCBjb2RlIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJ3YWl0LmgiCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9kaXIuaD4KKyNpbmNsdWRlIDxzeXMvdXNlci5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9wY250bC5oPgorI2luY2x1ZGUgPHN5cy90aHJlYWQuaD4KKyNpbmNsdWRlIDxzeXMvcHJvYy5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSAiZ2RiX3N0YXQuaCIKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjaW5jbHVkZSA8Y29udmV4L3ZtcGFyYW0uaD4KKyNpbmNsdWRlIDxjb252ZXgvZmlsZWhkci5oPgorI2luY2x1ZGUgPGNvbnZleC9vcHRoZHIuaD4KKyNpbmNsdWRlIDxjb252ZXgvc2NuaGRyLmg+CisjaW5jbHVkZSA8Y29udmV4L2NvcmUuaD4KKworLyogUGVyLXRocmVhZCBkYXRhLCByZWFkIGZyb20gdGhlIGluZmVyaW9yIGF0IGVhY2ggc3RvcCBhbmQgd3JpdHRlbgorICAgYmFjayBhdCBlYWNoIHJlc3VtZS4gICovCisKKy8qIE51bWJlciBvZiBhY3RpdmUgdGhyZWFkcy4KKyAgIFRhYmxlcyBhcmUgdmFsaWQgZm9yIHRocmVhZCBudW1iZXJzIGxlc3MgdGhhbiB0aGlzLiAgKi8KKworc3RhdGljIGludCBuX3RocmVhZHM7CisKKyNkZWZpbmUgTUFYVEhSRUFEUyA4CisJCQorLyogVGhyZWFkIHN0YXRlLiAgVGhlIHJlbWFpbmluZyBkYXRhIGlzIHZhbGlkIG9ubHkgaWYgdGhpcyBpcyBQSV9UQUxJVkUuICAqLworCitzdGF0aWMgaW50IHRocmVhZF9zdGF0ZVtNQVhUSFJFQURTXTsKKworLyogU3RvcCBwYywgc2lnbmFsLCBzaWduYWwgc3ViY29kZSAqLworCitzdGF0aWMgaW50IHRocmVhZF9wY1tNQVhUSFJFQURTXTsKK3N0YXRpYyBpbnQgdGhyZWFkX3NpZ25hbFtNQVhUSFJFQURTXTsKK3N0YXRpYyBpbnQgdGhyZWFkX3NpZ2NvZGVbTUFYVEhSRUFEU107CQorCisvKiBUaHJlYWQgcmVnaXN0ZXJzLgorICAgSWYgdGhyZWFkIGlzIHNlbGVjdGVkLCB0aGUgcmVncyBhcmUgaW4gcmVnaXN0ZXJzW10gaW5zdGVhZC4gICovCisKK3N0YXRpYyBjaGFyIHRocmVhZF9yZWdzW01BWFRIUkVBRFNdW1JFR0lTVEVSX0JZVEVTXTsKKworLyogMSBpZiB0aGUgdG9wIGZyYW1lIG9uIHRoZSB0aHJlYWQncyBzdGFjayB3YXMgYSBjb250ZXh0IGZyYW1lLAorICAgbWVhbmluZyB0aGF0IHRoZSBrZXJuZWwgaXMgdXAgdG8gc29tZXRoaW5nIGFuZCB3ZSBzaG91bGQgbm90CisgICB0b3VjaCB0aGUgdGhyZWFkIGF0IGFsbCBleGNlcHQgdG8gcmVzdW1lIGl0LiAgKi8KKworc3RhdGljIGNoYXIgdGhyZWFkX2lzX2luX2tlcm5lbFtNQVhUSFJFQURTXTsKKworLyogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0aHJlYWQncyBudW1iZXIuICAqLworCitzdGF0aWMgaW50IGluZmVyaW9yX3RocmVhZDsKKworLyogSW5mZXJpb3IgcHJvY2VzcydzIGZpbGUgaGFuZGxlIGFuZCBhIHByb2Nlc3MgY29udHJvbCBibG9jaworICAgdG8gZmVlZCBhcmdzIHRvIGlvY3RsIHdpdGguICAqLworCitzdGF0aWMgaW50IGluZmVyaW9yX2ZkOworc3RhdGljIHN0cnVjdCBwY250bCBwczsKKworLyogU09GRiBmaWxlIGhlYWRlcnMgZm9yIGV4ZWMgb3IgY29yZSBmaWxlLiAgKi8KKworc3RhdGljIEZJTEVIRFIgZmlsZWhkcjsKK3N0YXRpYyBPUFRIRFIgb3B0aGRyOworc3RhdGljIFNDTkhEUiBzY25oZHI7CisKKy8qIEFkZHJlc3MgbWFwcyBjb25zdHJ1Y3RlZCBmcm9tIHNlY3Rpb24gaGVhZGVycyBvZiBleGVjIGFuZCBjb3JlIGZpbGVzLgorICAgRGVmaW5lcyBwcm9jZXNzIGFkZHJlc3MgLT4gZmlsZSBhZGRyZXNzIHRyYW5zbGF0aW9uLiAgKi8KKworc3RydWN0IHBtYXAgCit7CisgICAgbG9uZyBtZW1fYWRkcjsJCS8qIHByb2Nlc3Mgc3RhcnQgYWRkcmVzcyAqLworICAgIGxvbmcgbWVtX2VuZDsJCS8qIHByb2Nlc3MgZW5kKzEgYWRkcmVzcyAqLworICAgIGxvbmcgZmlsZV9hZGRyOwkJLyogZmlsZSBzdGFydCBhZGRyZXNzICovCisgICAgbG9uZyB0aHJlYWQ7CQkvKiAtMSBzaGFyZWQ7IDAsMSwuLi4gdGhyZWFkLWxvY2FsICovCisgICAgbG9uZyB0eXBlOwkJCS8qIFNfVEVYVCBTX0RBVEEgU19CU1MgU19UQlNTIGV0YyAqLworICAgIGxvbmcgd2hpY2g7CQkJLyogdXNlZCB0byBzb3J0IG1hcCBmb3IgaW5mbyBmaWxlcyAqLworfTsKKworc3RhdGljIGludCBuX2V4ZWMsIG5fY29yZTsKK3N0YXRpYyBzdHJ1Y3QgcG1hcCBleGVjX21hcFsxMDBdOworc3RhdGljIHN0cnVjdCBwbWFwIGNvcmVfbWFwWzEwMF07CisKKy8qIE9mZnNldHMgaW4gdGhlIGNvcmUgZmlsZSBvZiBjb3JlX2NvbnRleHQgYW5kIGNvcmVfdGNvbnRleHQgYmxvY2tzLiAgKi8KKworc3RhdGljIGludCBjb250ZXh0X29mZnNldDsKK3N0YXRpYyBpbnQgdGNvbnRleHRfb2Zmc2V0W01BWFRIUkVBRFNdOworCisvKiBDb3JlIGZpbGUgY29udHJvbCBibG9ja3MuICAqLworCitzdGF0aWMgc3RydWN0IGNvcmVfY29udGV4dF92NzAgYzsKK3N0YXRpYyBzdHJ1Y3QgY29yZV90Y29udGV4dF92NzAgdGM7CitzdGF0aWMgc3RydWN0IHVzZXIgdTsKK3N0YXRpYyB0aHJlYWRfdCB0aDsKK3N0YXRpYyBwcm9jX3QgcHI7CisKKy8qIFRoZSByZWdpc3RlcnMgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0aHJlYWQuICAqLworCitleHRlcm4gY2hhciByZWdpc3RlcnNbUkVHSVNURVJfQllURVNdOworCisvKiBWZWN0b3IgYW5kIGNvbW11bmljYXRpb24gcmVnaXN0ZXJzIGZyb20gY29yZSBkdW1wIG9yIGZyb20gaW5mZXJpb3IuCisgICBUaGVzZSBhcmUgcmVhZCBvbiBkZW1hbmQsIGllLCBub3Qgbm9ybWFsbHkgdmFsaWQuICAqLworCitzdGF0aWMgc3RydWN0IHZlY3N0IHZlY3Rvcl9yZWdpc3RlcnM7CitzdGF0aWMgc3RydWN0IGNyZWdfY3R4IGNvbW1fcmVnaXN0ZXJzOworCisvKiBGbGFnLCBzZXQgb24gYSB2YW5pbGxhIENPTlQgY29tbWFuZCBhbmQgY2xlYXJlZCB3aGVuIHRoZSBpbmZlcmlvcgorICAgaXMgY29udGludWVkLiAgKi8KKworc3RhdGljIGludCBhbGxfY29udGludWU7CisKKy8qIEZsYWcsIHNldCB3aGVuIHRoZSBpbmZlcmlvciBpcyBjb250aW51ZWQgYnkgYSB2YW5pbGxhIENPTlQgY29tbWFuZCwKKyAgIGNsZWFyZWQgaWYgaXQgaXMgY29udGludWVkIGZvciBhbnkgb3RoZXIgcHVycG9zZS4gICovCisKK3N0YXRpYyBpbnQgdGhyZWFkX3N3aXRjaF9vazsKKworLyogU3RhY2sgb2Ygc2lnbmFscyByZWNpZXZlZCBmcm9tIHRocmVhZHMgYnV0IG5vdCB5ZXQgZGVsaXZlcmVkIHRvIGdkYi4gICovCisKK3N0cnVjdCB0aHJlYWRwaWQgCit7CisgICAgaW50IHBpZDsKKyAgICBpbnQgdGhyZWFkOworICAgIGludCBzaWdubzsKKyAgICBpbnQgc3Vic2lnOworICAgIGludCBwYzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGhyZWFkcGlkIHNpZ25hbF9zdGFja19ib3RbMTAwXTsKK3N0YXRpYyBzdHJ1Y3QgdGhyZWFkcGlkICpzaWduYWxfc3RhY2sgPSBzaWduYWxfc3RhY2tfYm90OworCisvKiBIb3cgdG8gZGV0ZWN0IGVtcHR5IHN0YWNrIC0tIGJvdHRvbSBmcmFtZSBpcyBhbGwgemVyby4gICovCisKKyNkZWZpbmUgc2lnbmFsX3N0YWNrX2lzX2VtcHR5KCkgKHNpZ25hbF9zdGFjay0+cGlkID09IDApCisKKy8qIE1vZGUgY29udHJvbGxlZCBieSBTRVQgUElQRSBjb21tYW5kLCBjb250cm9scyB0aGUgcHN3IFNFUSBiaXQKKyAgIHdoaWNoIGZvcmNlcyBlYWNoIGluc3RydWN0aW9uIHRvIGNvbXBsZXRlIGJlZm9yZSB0aGUgbmV4dCBvbmUgc3RhcnRzLiAgKi8KKworc3RhdGljIGludCBzZXF1ZW50aWFsID0gMDsKKworLyogTW9kZSBjb250cm9sbGVkIGJ5IHRoZSBTRVQgUEFSQUxMRUwgY29tbWFuZC4gIFZhbHVlcyBhcmU6CisgICAwICBjb25jdXJyZW5jeSBsaW1pdCAxIHRocmVhZCwgZHluYW1pYyBzY2hlZHVsaW5nCisgICAxICBubyBjb25jdXJyZW5jeSBsaW1pdCwgZHluYW1pYyBzY2hlZHVsaW5nCisgICAyICBubyBjb25jdXJyZW5jeSBsaW1pdCwgZml4ZWQgc2NoZWR1bGluZyAgKi8KKworc3RhdGljIGludCBwYXJhbGxlbCA9IDE7CisKKy8qIE1vZGUgY29udHJvbGxlZCBieSBTRVQgQkFTRSBjb21tYW5kLCBvdXRwdXQgcmFkaXggZm9yIHVuZm9ybWF0dGVkCisgICBpbnRlZ2VyIHR5cGVvdXQsIGFzIGluIGFyZ3VtZW50IGxpc3RzLCBhZ2dyZWdhdGVzLCBhbmQgc28gb24uCisgICBaZXJvIG1lYW5zIGd1ZXNzIHdoZXRoZXIgaXQncyBhbiBhZGRyZXNzIChoZXgpIG9yIG5vdCAoZGVjaW1hbCkuICAqLworCitzdGF0aWMgaW50IG91dHB1dF9yYWRpeCA9IDA7CisKKy8qIFNpZ25hbCBzdWJjb2RlIGF0IGxhc3QgdGhyZWFkIHN0b3AuICAqLworCitzdGF0aWMgaW50IHN0b3Bfc2lnY29kZTsKKworLyogSGFjaywgc2VlIHdhaXQoKSBiZWxvdy4gICovCisKK3N0YXRpYyBpbnQgZXhlY190cmFwX3RpbWVyOworCisjaW5jbHVkZSAiZ2RiY21kLmgiCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqdmVjdG9yX3R5cGUgKCk7CitzdGF0aWMgbG9uZyAqcmVhZF92ZWN0b3JfcmVnaXN0ZXIgKCk7CitzdGF0aWMgbG9uZyAqcmVhZF92ZWN0b3JfcmVnaXN0ZXJfMSAoKTsKK3N0YXRpYyB2b2lkIHdyaXRlX3ZlY3Rvcl9yZWdpc3RlciAoKTsKK3N0YXRpYyBVTE9OR0VTVCByZWFkX2NvbW1fcmVnaXN0ZXIgKCk7CitzdGF0aWMgdm9pZCB3cml0ZV9jb21tX3JlZ2lzdGVyICgpOworc3RhdGljIHZvaWQgY29udmV4X2NvbnRfY29tbWFuZCAoKTsKK3N0YXRpYyB2b2lkIHRocmVhZF9jb250aW51ZSAoKTsKK3N0YXRpYyB2b2lkIHNlbGVjdF90aHJlYWQgKCk7CitzdGF0aWMgdm9pZCBzY2FuX3N0YWNrICgpOworc3RhdGljIHZvaWQgc2V0X2ZpeGVkX3NjaGVkdWxpbmcgKCk7CitzdGF0aWMgY2hhciAqc3Vic2lnX25hbWUgKCk7CitzdGF0aWMgdm9pZCBwc3dfaW5mbyAoKTsKK3N0YXRpYyBzaWdfbm9vcCAoKTsKK3N0YXRpYyBwdHJfY21wICgpOworCisMCisvKiBFeGVjdXRlIHB0cmFjZS4gIENvbnZleCBWNyByZXBsYWNlZCBwdHJhY2Ugd2l0aCBwYXR0YWNoLgorICAgQWxsb3cgcHRyYWNlICgwKSBhcyBhIG5vLW9wLiAgKi8KKworaW50CitjYWxsX3B0cmFjZSAocmVxdWVzdCwgcGlkLCBwcm9jYWRkciwgYnVmKQorICAgICBpbnQgcmVxdWVzdCwgcGlkOworICAgICBQVFJBQ0VfQVJHM19UWVBFIHByb2NhZGRyOworICAgICBpbnQgYnVmOworeworICBpZiAocmVxdWVzdCA9PSAwKQorICAgIHJldHVybjsKKyAgZXJyb3IgKCJubyBwdHJhY2UiKTsKK30KKworLyogUmVwbGFjZW1lbnQgZm9yIHN5c3RlbSBleGVjbGUgcm91dGluZS4KKyAgIENvbnZlcnQgaXQgdG8gYW4gZXF1aXZhbGVudCBleGVjdCwgd2hpY2ggcGF0dGFjaCBpbnNpc3RzIG9uLiAgKi8KKworZXhlY2xlIChuYW1lLCBhcmd2KQorICAgICBjaGFyICpuYW1lLCAqYXJndjsKK3sKKyAgY2hhciAqKiplbnZwID0gKGNoYXIgKioqKSAmYXJndjsKKyAgd2hpbGUgKCplbnZwKyspIDsKKworICBzaWduYWwgKFNJR1RSQVAsIHNpZ19ub29wKTsKKyAgZXhlY3QgKG5hbWUsICZhcmd2LCAqZW52cCk7Cit9CisKKy8qIFN0dXBpZCBoYW5kbGVyIGZvciBzdHVwaWQgdHJhY2UgdHJhcCB0aGF0IG90aGVyd2lzZSBjYXVzZXMKKyAgIHN0YXJ0dXAgdG8gc3R1cGlkbHkgaGFuZy4gICovCisKK3N0YXRpYyBzaWdfbm9vcCAoKSAKK3t9CisKKy8qIFJlYWQgcmVnaXN0ZXJzIGZyb20gaW5mZXJpb3IgaW50byByZWdpc3RlcnNbXSBhcnJheS4KKyAgIEZvciBjb252ZXgsIHRoZXkgYXJlIGFscmVhZHkgdGhlcmUsIHJlYWQgaW4gd2hlbiB0aGUgaW5mZXJpb3Igc3RvcHMuICAqLworCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7Cit9CisKKy8qIFN0b3JlIG91ciByZWdpc3RlciB2YWx1ZXMgYmFjayBpbnRvIHRoZSBpbmZlcmlvci4KKyAgIEZvciBDb252ZXgsIGRvIHRoaXMgb25seSBvbmNlLCByaWdodCBiZWZvcmUgcmVzdW1pbmcgaW5mZXJpb3IuICAqLworCit2b2lkCitzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7Cit9CisKKy8qIENvcHkgTEVOIGJ5dGVzIGZyb20gaW5mZXJpb3IncyBtZW1vcnkgc3RhcnRpbmcgYXQgTUVNQUREUgorICAgdG8gZGVidWdnZXIgbWVtb3J5IHN0YXJ0aW5nIGF0IE1ZQUREUi4gCisgICBPbiBmYWlsdXJlIChjYW5ub3QgcmVhZCBmcm9tIGluZmVyaW9yLCB1c3VhbGx5IGJlY2F1c2UgYWRkcmVzcyBpcyBvdXQKKyAgIG9mIGJvdW5kcykgcmV0dXJucyB0aGUgdmFsdWUgb2YgZXJybm8uICovCisKK2ludAorcmVhZF9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICBlcnJubyA9IDA7CisgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgIC8qIGxpdHRsZS1rbm93biB1bmRvY3VtZW50ZWQgbWF4IHJlcXVlc3Qgc2l6ZSAqLworICAgICAgaW50IGkgPSAobGVuIDwgMTIyODgpID8gbGVuIDogMTIyODg7CisKKyAgICAgIGxzZWVrIChpbmZlcmlvcl9mZCwgbWVtYWRkciwgMCk7CisgICAgICByZWFkIChpbmZlcmlvcl9mZCwgbXlhZGRyLCBpKTsKKworICAgICAgbWVtYWRkciArPSBpOworICAgICAgbXlhZGRyICs9IGk7CisgICAgICBsZW4gLT0gaTsKKyAgICB9CisgIGlmIChlcnJubykgCisgICAgbWVtc2V0IChteWFkZHIsICdcMCcsIGxlbik7CisgIHJldHVybiBlcnJubzsKK30KKworLyogQ29weSBMRU4gYnl0ZXMgb2YgZGF0YSBmcm9tIGRlYnVnZ2VyIG1lbW9yeSBhdCBNWUFERFIKKyAgIHRvIGluZmVyaW9yJ3MgbWVtb3J5IGF0IE1FTUFERFIuCisgICBSZXR1cm5zIGVycm5vIG9uIGZhaWx1cmUgKGNhbm5vdCB3cml0ZSB0aGUgaW5mZXJpb3IpICovCisKK2ludAord3JpdGVfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgZXJybm8gPSAwOworICBsc2VlayAoaW5mZXJpb3JfZmQsIG1lbWFkZHIsIDApOworICB3cml0ZSAoaW5mZXJpb3JfZmQsIG15YWRkciwgbGVuKTsKKyAgcmV0dXJuIGVycm5vOworfQorCisvKiBIZXJlIGZyb20gY3JlYXRlX2luZmVyaW9yIHdoZW4gdGhlIGluZmVyaW9yIHByb2Nlc3MgaGFzIGJlZW4gY3JlYXRlZAorICAgYW5kIHN0YXJ0ZWQgdXAuICBXZSBtdXN0IGRvIGEgcGF0dGFjaCB0byBncmFiIGl0IGZvciBkZWJ1Z2dpbmcuCisKKyAgIEFsc28sIGludGVyY2VwdCB0aGUgQ09OVCBjb21tYW5kIGJ5IGFsdGVyaW5nIGl0cyBkaXNwYXRjaCBhZGRyZXNzLiAgKi8KKy8qIEZJWE1FOiBUaGlzIHVzZWQgdG8gYmUgY2FsbGVkIGZyb20gYSBtYWNybyBDUkVBVEVfSU5GRVJJT1JfSE9PSy4KKyAgIEJ1dCBub3cgaW5pdF90cmFjZV9mdW4gaXMgaW4gdGhlIHNhbWUgcGxhY2UuICBTbyByZS13cml0ZSB0aGlzIHRvCisgICB1c2UgdGhlIGluaXRfdHJhY2VfZnVuIChtYWtpbmcgY29udmV4IGEgZGVidWdnaW5nIHRhcmdldCkuICAqLworCitjcmVhdGVfaW5mZXJpb3JfaG9vayAocGlkKQorICAgIGludCBwaWQ7Cit7CisgIHN0YXRpYyBjaGFyIGNvbnRbXSA9ICJjb250IjsKKyAgc3RhdGljIGNoYXIgY29udDFbXSA9ICJjIjsKKyAgY2hhciAqbGluZXAgPSBjb250OworICBjaGFyICpsaW5lcDEgPSBjb250MTsKKyAgY2hhciAqKmxpbmUgPSAmbGluZXA7CisgIGNoYXIgKipsaW5lMSA9ICZsaW5lcDE7CisgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjOworCisgIGMgPSBsb29rdXBfY21kIChsaW5lLCBjbWRsaXN0LCAiIiwgMCk7CisgIGMtPmZ1bmN0aW9uID0gY29udmV4X2NvbnRfY29tbWFuZDsKKyAgYyA9IGxvb2t1cF9jbWQgKGxpbmUxLCBjbWRsaXN0LCAiIiwgMCk7CisgIGMtPmZ1bmN0aW9uID0gY29udmV4X2NvbnRfY29tbWFuZDsKKworICBpbmZlcmlvcl9mZCA9IHBhdHRhY2ggKHBpZCwgT19FWENMKTsKKyAgaWYgKGluZmVyaW9yX2ZkIDwgMCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgicGF0dGFjaCIpOworICBpbmZlcmlvcl90aHJlYWQgPSAwOworICBzZXRfZml4ZWRfc2NoZWR1bGluZyAocGlkLCBwYXJhbGxlbCA9PSAyKTsKK30KKworLyogQXR0YWNoIHByb2Nlc3MgUElEIGZvciBkZWJ1Z2dpbmcuICAqLworCithdHRhY2ggKHBpZCkKKyAgICBpbnQgcGlkOworeworICBpbnQgZmQgPSBwYXR0YWNoIChwaWQsIE9fRVhDTCk7CisgIGlmIChmZCA8IDApCisgICAgcGVycm9yX3dpdGhfbmFtZSAoInBhdHRhY2giKTsKKyAgYXR0YWNoX2ZsYWcgPSAxOworICAvKiB3YWl0IGZvciBzdHJhbmdlIGtlcm5lbCByZXZlcmJlcmF0aW9ucyB0byBnbyBhd2F5ICovCisgIHNsZWVwICgxKTsKKworICBzZXRwZ3JwIChwaWQsIHBpZCk7CisKKyAgaW5mZXJpb3JfZmQgPSBmZDsKKyAgaW5mZXJpb3JfdGhyZWFkID0gMDsKKyAgcmV0dXJuIHBpZDsKK30KKworLyogU3RvcCBkZWJ1Z2dpbmcgdGhlIHByb2Nlc3Mgd2hvc2UgbnVtYmVyIGlzIFBJRAorICAgYW5kIGNvbnRpbnVlIGl0IHdpdGggc2lnbmFsIG51bWJlciBTSUdOQUwuCisgICBTSUdOQUwgPSAwIG1lYW5zIGp1c3QgY29udGludWUgaXQuICAqLworCit2b2lkCitkZXRhY2ggKHNpZ25hbCkKKyAgICAgaW50IHNpZ25hbDsKK3sKKyAgc2lnbmFsX3N0YWNrID0gc2lnbmFsX3N0YWNrX2JvdDsKKyAgdGhyZWFkX2NvbnRpbnVlICgtMSwgMCwgc2lnbmFsKTsKKyAgaW9jdGwgKGluZmVyaW9yX2ZkLCBQSVhERVRBQ0gsICZwcyk7CisgIGNsb3NlIChpbmZlcmlvcl9mZCk7CisgIGluZmVyaW9yX2ZkID0gMDsKKyAgYXR0YWNoX2ZsYWcgPSAwOworfQorCisvKiBLaWxsIG9mZiB0aGUgaW5mZXJpb3IgcHJvY2Vzcy4gICovCisKK2tpbGxfaW5mZXJpb3IgKCkKK3sKKyAgaWYgKGluZmVyaW9yX3BpZCA9PSAwKQorICAgIHJldHVybjsKKyAgaW9jdGwgKGluZmVyaW9yX2ZkLCBQSVhURVJNSU5BVEUsIDApOworICB3YWl0ICgwKTsKKyAgdGFyZ2V0X21vdXJuX2luZmVyaW9yICgpOworfQorCisvKiBSZWFkIHZlY3RvciByZWdpc3RlciBSRUcsIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB2YWx1ZS4gICovCisKK3N0YXRpYyBsb25nICoKK3JlYWRfdmVjdG9yX3JlZ2lzdGVyIChyZWcpCisgICAgaW50IHJlZzsKK3sKKyAgaWYgKGhhdmVfaW5mZXJpb3JfcCAoKSkKKyAgICB7CisgICAgICBlcnJubyA9IDA7CisgICAgICBwcy5waV9idWZmZXIgPSAoY2hhciAqKSAmdmVjdG9yX3JlZ2lzdGVyczsKKyAgICAgIHBzLnBpX25ieXRlcyA9IHNpemVvZiB2ZWN0b3JfcmVnaXN0ZXJzOworICAgICAgcHMucGlfb2Zmc2V0ID0gMDsKKyAgICAgIHBzLnBpX3RocmVhZCA9IGluZmVyaW9yX3RocmVhZDsKKyAgICAgIGlvY3RsIChpbmZlcmlvcl9mZCwgUElYUkRWUkVHUywgJnBzKTsKKyAgICAgIGlmIChlcnJubykKKwltZW1zZXQgKCZ2ZWN0b3JfcmVnaXN0ZXJzLCAnXDAnLCBzaXplb2YgdmVjdG9yX3JlZ2lzdGVycyk7CisgICAgfQorICBlbHNlIGlmIChjb3JlY2hhbiA+PSAwKQorICAgIHsKKyAgICAgIGxzZWVrIChjb3JlY2hhbiwgdGNvbnRleHRfb2Zmc2V0W2luZmVyaW9yX3RocmVhZF0sIDApOworICAgICAgaWYgKG15cmVhZCAoY29yZWNoYW4sICZ0Yywgc2l6ZW9mIHRjKSA8IDApCisJcGVycm9yX3dpdGhfbmFtZSAoY29yZWZpbGUpOworICAgICAgbHNlZWsgKGNvcmVjaGFuLCB0Yy5jb3JlX3RocmVhZF9wLCAwKTsKKyAgICAgIGlmIChteXJlYWQgKGNvcmVjaGFuLCAmdGgsIHNpemVvZiB0aCkgPCAwKQorCXBlcnJvcl93aXRoX25hbWUgKGNvcmVmaWxlKTsKKyAgICAgIGxzZWVrIChjb3JlY2hhbiwgdGMuY29yZV92cmVnc19wLCAwKTsKKyAgICAgIGlmIChteXJlYWQgKGNvcmVjaGFuLCAmdmVjdG9yX3JlZ2lzdGVycywgMTYqMTI4KSA8IDApCisJcGVycm9yX3dpdGhfbmFtZSAoY29yZWZpbGUpOworICAgICAgdmVjdG9yX3JlZ2lzdGVycy52bVswXSA9IHRoLnRfdmVjdF9jdHgudmNfdm1bMF07CisgICAgICB2ZWN0b3JfcmVnaXN0ZXJzLnZtWzFdID0gdGgudF92ZWN0X2N0eC52Y192bVsxXTsKKyAgICAgIHZlY3Rvcl9yZWdpc3RlcnMudmxzID0gdGgudF92ZWN0X2N0eC52Y192bHM7CisgICAgfQorCisgIHJldHVybiByZWFkX3ZlY3Rvcl9yZWdpc3Rlcl8xIChyZWcpOworfQorCisvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHZlY3RvciByZWdpc3RlciBSRUcsIHdoaWNoIG11c3QgYWxyZWFkeSBoYXZlIGJlZW4KKyAgIGZldGNoZWQgZnJvbSB0aGUgaW5mZXJpb3Igb3IgY29yZSBmaWxlLiAgKi8KKworc3RhdGljIGxvbmcgKgorcmVhZF92ZWN0b3JfcmVnaXN0ZXJfMSAocmVnKSAKKyAgICBpbnQgcmVnOworeworICBzd2l0Y2ggKHJlZykKKyAgICB7CisgICAgY2FzZSBWTV9SRUdOVU06CisgICAgICByZXR1cm4gKGxvbmcgKikgdmVjdG9yX3JlZ2lzdGVycy52bTsKKyAgICBjYXNlIFZTX1JFR05VTToKKyAgICAgIHJldHVybiAobG9uZyAqKSAmdmVjdG9yX3JlZ2lzdGVycy52bHM7CisgICAgY2FzZSBWTF9SRUdOVU06CisgICAgICByZXR1cm4gMSArIChsb25nICopICZ2ZWN0b3JfcmVnaXN0ZXJzLnZsczsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIChsb25nICopICZ2ZWN0b3JfcmVnaXN0ZXJzLnZyW3JlZ107CisgICAgfQorfQorCisvKiBXcml0ZSB2ZWN0b3IgcmVnaXN0ZXIgUkVHLCBlbGVtZW50IEVMRU1FTlQsIG5ldyB2YWx1ZSBWQUwuCisgICBOQjogbXVzdCB1c2UgcmVhZC1tb2RpZnktd3JpdGUgb24gdGhlIGVudGlyZSB2ZWN0b3Igc3RhdGUsCisgICBzaW5jZSBwYXR0YWNoIGRvZXMgbm90IGRvIG9mZnNldHRlZCB3cml0ZXMgY29ycmVjdGx5LiAgKi8KKworc3RhdGljIHZvaWQKK3dyaXRlX3ZlY3Rvcl9yZWdpc3RlciAocmVnLCBlbGVtZW50LCB2YWwpCisgICAgaW50IHJlZywgZWxlbWVudDsKKyAgICBVTE9OR0VTVCB2YWw7Cit7CisgIGlmIChoYXZlX2luZmVyaW9yX3AgKCkpCisgICAgeworICAgICAgZXJybm8gPSAwOworICAgICAgcHMucGlfdGhyZWFkID0gaW5mZXJpb3JfdGhyZWFkOworICAgICAgcHMucGlfb2Zmc2V0ID0gMDsKKyAgICAgIHBzLnBpX2J1ZmZlciA9IChjaGFyICopICZ2ZWN0b3JfcmVnaXN0ZXJzOworICAgICAgcHMucGlfbmJ5dGVzID0gc2l6ZW9mIHZlY3Rvcl9yZWdpc3RlcnM7CisKKyAgICAgIGlvY3RsIChpbmZlcmlvcl9mZCwgUElYUkRWUkVHUywgJnBzKTsKKworICAgICAgc3dpdGNoIChyZWcpCisJeworCWNhc2UgVkxfUkVHTlVNOgorCSAgdmVjdG9yX3JlZ2lzdGVycy52bHMgPQorCSAgICAodmVjdG9yX3JlZ2lzdGVycy52bHMgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkKKwkgICAgICArICh1bnNpZ25lZCBsb25nKSB2YWw7CisJICBicmVhazsKKworCWNhc2UgVlNfUkVHTlVNOgorCSAgdmVjdG9yX3JlZ2lzdGVycy52bHMgPQorCSAgICAodmFsIDw8IDMyKSArICh1bnNpZ25lZCBsb25nKSB2ZWN0b3JfcmVnaXN0ZXJzLnZsczsKKwkgIGJyZWFrOworCSAgICAKKwlkZWZhdWx0OgorCSAgdmVjdG9yX3JlZ2lzdGVycy52cltyZWddLmVsW2VsZW1lbnRdID0gdmFsOworCSAgYnJlYWs7CisJfQorCisgICAgICBpb2N0bCAoaW5mZXJpb3JfZmQsIFBJWFdSVlJFR1MsICZwcyk7CisKKyAgICAgIGlmIChlcnJubykKKwlwZXJyb3Jfd2l0aF9uYW1lICgid3JpdGluZyB2ZWN0b3IgcmVnaXN0ZXIiKTsKKyAgICB9Cit9CisKKy8qIFJldHVybiB0aGUgY29udGVudHMgb2YgY29tbXVuaWNhdGlvbiByZWdpc3RlciBOVU0uICAqLyAKKworc3RhdGljIFVMT05HRVNUIAorcmVhZF9jb21tX3JlZ2lzdGVyIChudW0pCisgICAgIGludCBudW07Cit7CisgIGlmIChoYXZlX2luZmVyaW9yX3AgKCkpCisgICAgeworICAgICAgcHMucGlfYnVmZmVyID0gKGNoYXIgKikgJmNvbW1fcmVnaXN0ZXJzOworICAgICAgcHMucGlfbmJ5dGVzID0gc2l6ZW9mIGNvbW1fcmVnaXN0ZXJzOworICAgICAgcHMucGlfb2Zmc2V0ID0gMDsKKyAgICAgIHBzLnBpX3RocmVhZCA9IGluZmVyaW9yX3RocmVhZDsKKyAgICAgIGlvY3RsIChpbmZlcmlvcl9mZCwgUElYUkRDUkVHUywgJnBzKTsKKyAgICB9CisgIHJldHVybiBjb21tX3JlZ2lzdGVycy5jcnJlZy5yNFtudW1dOworfQorCisvKiBTdG9yZSBhIG5ldyB2YWx1ZSBWQUwgaW50byBjb21tdW5pY2F0aW9uIHJlZ2lzdGVyIE5VTS4gIAorICAgTkI6IE11c3QgdXNlIHJlYWQtbW9kaWZ5LXdyaXRlIG9uIHRoZSB3aG9sZSBjb21tIHJlZ2lzdGVyIHNldAorICAgc2luY2UgcGF0dGFjaCBkb2VzIG5vdCBkbyBvZmZzZXR0ZWQgd3JpdGVzIGNvcnJlY3RseS4gICovCisKK3N0YXRpYyB2b2lkCit3cml0ZV9jb21tX3JlZ2lzdGVyIChudW0sIHZhbCkKKyAgICAgaW50IG51bTsKKyAgICAgVUxPTkdFU1QgdmFsOworeworICBpZiAoaGF2ZV9pbmZlcmlvcl9wICgpKQorICAgIHsKKyAgICAgIHBzLnBpX2J1ZmZlciA9IChjaGFyICopICZjb21tX3JlZ2lzdGVyczsKKyAgICAgIHBzLnBpX25ieXRlcyA9IHNpemVvZiBjb21tX3JlZ2lzdGVyczsKKyAgICAgIHBzLnBpX29mZnNldCA9IDA7CisgICAgICBwcy5waV90aHJlYWQgPSBpbmZlcmlvcl90aHJlYWQ7CisgICAgICBpb2N0bCAoaW5mZXJpb3JfZmQsIFBJWFJEQ1JFR1MsICZwcyk7CisgICAgICBjb21tX3JlZ2lzdGVycy5jcnJlZy5yNFtudW1dID0gdmFsOworICAgICAgaW9jdGwgKGluZmVyaW9yX2ZkLCBQSVhXUkNSRUdTLCAmcHMpOworICAgIH0KK30KKworLyogUmVzdW1lIGV4ZWN1dGlvbiBvZiB0aGUgaW5mZXJpb3IgcHJvY2Vzcy4KKyAgIElmIFNURVAgaXMgbm9uemVybywgc2luZ2xlLXN0ZXAgaXQuCisgICBJZiBTSUdOQUwgaXMgbm9uemVybywgZ2l2ZSBpdCB0aGF0IHNpZ25hbC4gICovCisKK3ZvaWQKK3Jlc3VtZSAoc3RlcCwgc2lnbmFsKQorICAgICBpbnQgc3RlcDsKKyAgICAgaW50IHNpZ25hbDsKK3sKKyAgZXJybm8gPSAwOworICBpZiAoc3RlcCB8fCBzaWduYWwpCisgICAgdGhyZWFkX2NvbnRpbnVlIChpbmZlcmlvcl90aHJlYWQsIHN0ZXAsIHNpZ25hbCk7CisgIGVsc2UKKyAgICB0aHJlYWRfY29udGludWUgKC0xLCAwLCAwKTsKK30KKworLyogTWF5YmUgcmVzdW1lIHNvbWUgdGhyZWFkcy4KKyAgIFRIUkVBRCBpcyB3aGljaCB0aHJlYWQgdG8gcmVzdW1lLCBvciAtMSB0byByZXN1bWUgdGhlbSBhbGwuCisgICBTVEVQIGFuZCBTSUdOQUwgYXJlIGFzIGluIHJlc3VtZS4KKworICAgR2xvYmFsIHZhcmlhYmxlIEFMTF9DT05USU5VRSBpcyBzZXQgd2hlbiB3ZSBhcmUgaGVyZSB0byBkbyBhCisgICBgY29udCcgY29tbWFuZDsgb3RoZXJ3aXNlIHdlIG1heSBiZSBkb2luZyBgZmluaXNoJyBvciBhIGNhbGwgb3IKKyAgIHNvbWV0aGluZyBlbHNlIHRoYXQgd2lsbCBub3QgdG9sZXJhdGUgYW4gYXV0b21hdGljIHRocmVhZCBzd2l0Y2guCisKKyAgIElmIHRoZXJlIGFyZSBzdG9wcGVkIHRocmVhZHMgd2FpdGluZyB0byBkZWxpdmVyIHNpZ25hbHMsIGFuZAorICAgQUxMX0NPTlRJTlVFLCBkbyBub3QgYWN0dWFsbHkgcmVzdW1lIGFueXRoaW5nLiAgZ2RiIHdpbGwgZG8gYSB3YWl0CisgICBhbmQgc2VlIG9uZSBvZiB0aGUgc3RvcHBlZCB0aHJlYWRzIGluIHRoZSBxdWV1ZS4gICovCisKK3N0YXRpYyB2b2lkCit0aHJlYWRfY29udGludWUgKHRocmVhZCwgc3RlcCwgc2lnbmFsKQorICAgICBpbnQgdGhyZWFkLCBzdGVwLCBzaWduYWw7Cit7CisgIGludCBuOworCisgIC8qIElmIHdlIGFyZSB0byBjb250aW51ZSBhbGwgdGhyZWFkcywgYnV0IG5vdCBmb3IgdGhlIENPTlRJTlVFIGNvbW1hbmQsCisgICAgIHBheSBubyBhdHRlbnRpb24gYW5kIGNvbnRpbnVlIG9ubHkgdGhlIHNlbGVjdGVkIHRocmVhZC4gICovCisKKyAgaWYgKHRocmVhZCA8IDAgJiYgISBhbGxfY29udGludWUpCisgICAgdGhyZWFkID0gaW5mZXJpb3JfdGhyZWFkOworCisgIC8qIElmIHdlIGFyZSBub3Qgc3RlcHBpbmcsIHdlIGhhdmUgbm93IGV4ZWN1dGVkIHRoZSBjb250aW51ZSBwYXJ0CisgICAgIG9mIGEgQ09OVElOVUUgY29tbWFuZC4gICovCisKKyAgaWYgKCEgc3RlcCkKKyAgICBhbGxfY29udGludWUgPSAwOworCisgIC8qIEFsbG93IHdhaXQoKSB0byBzd2l0Y2ggdGhyZWFkcyBpZiB0aGlzIGlzIGFuIGFsbC1vdXQgY29udGludWUuICAqLworCisgIHRocmVhZF9zd2l0Y2hfb2sgPSB0aHJlYWQgPCAwOworCisgIC8qIElmIHRoZXJlIGFyZSB0aHJlYWRzIHF1ZXVlZCB1cCwgZG9uJ3QgcmVzdW1lLiAgKi8KKworICBpZiAodGhyZWFkX3N3aXRjaF9vayAmJiAhIHNpZ25hbF9zdGFja19pc19lbXB0eSAoKSkKKyAgICByZXR1cm47CisKKyAgLyogT0ssIGRvIGl0LiAgKi8KKworICBmb3IgKG4gPSAwOyBuIDwgbl90aHJlYWRzOyBuKyspCisgICAgaWYgKHRocmVhZF9zdGF0ZVtuXSA9PSBQSV9UQUxJVkUpCisgICAgICB7CisJc2VsZWN0X3RocmVhZCAobik7CisKKwlpZiAoKHRocmVhZCA8IDAgfHwgbiA9PSB0aHJlYWQpICYmICEgdGhyZWFkX2lzX2luX2tlcm5lbFtuXSkKKwkgIHsKKwkgICAgLyogQmxhbSB0aGUgdHJhY2UgYml0cyBpbiB0aGUgc3RhY2sncyBzYXZlZCBwc3dzIHRvIG1hdGNoIAorCSAgICAgICB0aGUgZGVzaXJlZCBzdGVwIG1vZGUuICBUaGlzIGlzIHJlcXVpcmVkIHNvIHRoYXQKKwkgICAgICAgc2luZ2xlLXN0ZXBwaW5nIGEgcmV0dXJuIGRvZXNuJ3QgcmVzdG9yZSBhIHBzdyB3aXRoIGEKKwkgICAgICAgY2xlYXIgdHJhY2UgYml0IGFuZCBmbHkgYXdheSwgYW5kIGNvbnZlcnNlbHksCisJICAgICAgIHByb2NlZWRpbmcgdGhyb3VnaCBhIHJldHVybiBpbiBhIHJvdXRpbmUgdGhhdCB3YXMKKwkgICAgICAgc3RlcHBlZCBpbnRvIGRvZXNuJ3QgY2F1c2UgYSBwaGFudG9tIGJyZWFrIGJ5IHJlc3RvcmluZworCSAgICAgICBhIHBzdyB3aXRoIHRoZSB0cmFjZSBiaXQgc2V0LiAqLworCSAgICBzY2FuX3N0YWNrIChQU1dfVF9CSVQsIHN0ZXApOworCSAgICBzY2FuX3N0YWNrIChQU1dfU19CSVQsIHNlcXVlbnRpYWwpOworCSAgfQorCisJcHMucGlfYnVmZmVyID0gcmVnaXN0ZXJzOworCXBzLnBpX25ieXRlcyA9IFJFR0lTVEVSX0JZVEVTOworCXBzLnBpX29mZnNldCA9IDA7CisJcHMucGlfdGhyZWFkID0gbjsKKwlpZiAoISB0aHJlYWRfaXNfaW5fa2VybmVsW25dKQorCSAgaWYgKGlvY3RsIChpbmZlcmlvcl9mZCwgUElYV1JSRUdTLCAmcHMpKQorCSAgICBwZXJyb3Jfd2l0aF9uYW1lICgiUElYV1JSRUdTIik7CisKKwlpZiAodGhyZWFkIDwgMCB8fCBuID09IHRocmVhZCkKKwkgIHsKKwkgICAgcHMucGlfcGMgPSAxOworCSAgICBwcy5waV9zaWdubyA9IHNpZ25hbDsKKwkgICAgaWYgKGlvY3RsIChpbmZlcmlvcl9mZCwgc3RlcCA/IFBJWFNURVAgOiBQSVhDT05USU5VRSwgJnBzKSA8IDApCisJICAgICAgcGVycm9yX3dpdGhfbmFtZSAoIlBJWENPTlRJTlVFIik7CisJICB9CisgICAgICB9CisKKyAgaWYgKGlvY3RsIChpbmZlcmlvcl9mZCwgUElYUlVOLCAmcHMpIDwgMCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgiUElYUlVOIik7Cit9CisKKy8qIFJlcGxhY2VtZW50IGZvciBzeXN0ZW0gd2FpdCByb3V0aW5lLiAgCisKKyAgIFRoZSBzeXN0ZW0gd2FpdCByZXR1cm5zIHdpdGggb25lIG9yIG1vcmUgdGhyZWFkcyBzdG9wcGVkIGJ5CisgICBzaWduYWxzLiAgUHV0IHN0b3BwZWQgdGhyZWFkcyBvbiBhIHN0YWNrIGFuZCByZXR1cm4gdGhlbSBvbmUgYnkKKyAgIG9uZSwgc28gdGhhdCBpdCBhcHBlYXJzIHRoYXQgd2FpdCByZXR1cm5zIG9uZSB0aHJlYWQgYXQgYSB0aW1lLgorCisgICBHbG9iYWwgdmFyaWFibGUgVEhSRUFEX1NXSVRDSF9PSyBpcyBzZXQgd2hlbiBnZGIgY2FuIHRvbGVyYXRlIHdhaXQKKyAgIHJldHVybmluZyBhIG5ldyB0aHJlYWQuICBJZiBpdCBpcyBmYWxzZSwgdGhlbiBvbmx5IG9uZSB0aHJlYWQgaXMKKyAgIHJ1bm5pbmc7IHdlIHdpbGwgZG8gYSByZWFsIHdhaXQsIHRoZSB0aHJlYWQgd2lsbCBkbyBzb21ldGhpbmcsIGFuZAorICAgd2Ugd2lsbCByZXR1cm4gdGhhdC4gICovCisKK3BpZF90Cit3YWl0ICh3KQorICAgIHVuaW9uIHdhaXQgKnc7Cit7CisgIGludCBwaWQ7CisKKyAgaWYgKCF3KQorICAgIHJldHVybiB3YWl0MyAoMCwgMCwgMCk7CisKKyAgLyogRG8gYSByZWFsIHdhaXQgaWYgd2Ugd2VyZSB0b2xkIHRvLCBvciBpZiB0aGVyZSBhcmUgbm8gcXVldWVkIHRocmVhZHMuICAqLworCisgIGlmICghIHRocmVhZF9zd2l0Y2hfb2sgfHwgc2lnbmFsX3N0YWNrX2lzX2VtcHR5ICgpKQorICAgIHsKKyAgICAgIGludCB0aHJlYWQ7CisKKyAgICAgIHBpZCA9IHdhaXQzICh3LCAwLCAwKTsKKworICAgICAgaWYgKCFXSUZTVE9QUEVEICgqdykgfHwgcGlkICE9IGluZmVyaW9yX3BpZCkKKwlyZXR1cm4gcGlkOworCisgICAgICAvKiBUaGUgaW5mZXJpb3IgaGFzIGRvbmUgc29tZXRoaW5nIGFuZCBzdG9wcGVkLiAgUmVhZCBpbiBhbGwgdGhlCisJIHRocmVhZHMnIHJlZ2lzdGVycywgYW5kIHF1ZXVlIHVwIGFueSBzaWduYWxzIHRoYXQgaGFwcGVuZWQuICAqLworCisgICAgICBpZiAoaW9jdGwgKGluZmVyaW9yX2ZkLCBQSVhHRVRUSENPVU5ULCAmcHMpIDwgMCkKKwlwZXJyb3Jfd2l0aF9uYW1lICgiUElYR0VUVEhDT1VOVCIpOworICAgICAgCisgICAgICBuX3RocmVhZHMgPSBwcy5waV9vdGhkY250OworICAgICAgZm9yICh0aHJlYWQgPSAwOyB0aHJlYWQgPCBuX3RocmVhZHM7IHRocmVhZCsrKQorCXsKKwkgIHBzLnBpX3RocmVhZCA9IHRocmVhZDsKKwkgIGlmIChpb2N0bCAoaW5mZXJpb3JfZmQsIFBJWEdFVFNVQkNPREUsICZwcykgPCAwKQorCSAgICBwZXJyb3Jfd2l0aF9uYW1lICgiUElYR0VUU1VCQ09ERSIpOworCSAgdGhyZWFkX3N0YXRlW3RocmVhZF0gPSBwcy5waV9vdHN0YXRlOworCisJICBpZiAocHMucGlfb3RzdGF0ZSA9PSBQSV9UQUxJVkUpCisJICAgIHsKKwkgICAgICBzZWxlY3RfdGhyZWFkICh0aHJlYWQpOworCSAgICAgIHBzLnBpX2J1ZmZlciA9IHJlZ2lzdGVyczsKKwkgICAgICBwcy5waV9uYnl0ZXMgPSBSRUdJU1RFUl9CWVRFUzsKKwkgICAgICBwcy5waV9vZmZzZXQgPSAwOworCSAgICAgIHBzLnBpX3RocmVhZCA9IHRocmVhZDsKKwkgICAgICBpZiAoaW9jdGwgKGluZmVyaW9yX2ZkLCBQSVhSRFJFR1MsICZwcykgPCAwKQorCQlwZXJyb3Jfd2l0aF9uYW1lICgiUElYUkRSRUdTIik7CisKKwkgICAgICByZWdpc3RlcnNfZmV0Y2hlZCAoKTsKKworCSAgICAgIHRocmVhZF9wY1t0aHJlYWRdID0gcmVhZF9wYyAoKTsKKwkgICAgICB0aHJlYWRfc2lnbmFsW3RocmVhZF0gPSBwcy5waV9vc2lnbm87CisJICAgICAgdGhyZWFkX3NpZ2NvZGVbdGhyZWFkXSA9IHBzLnBpX29zaWdjb2RlOworCisJICAgICAgLyogSWYgdGhlIHRocmVhZCdzIHN0YWNrIGhhcyBhIGNvbnRleHQgZnJhbWUKKwkJIG9uIHRvcCwgc29tZXRoaW5nIGZ1Y2tlZCBpcyBnb2luZyBvbi4gIEkgZG8gbm90CisJCSBrbm93IHdoYXQsIGJ1dCBkbyBJIGtub3cgdGhpczogdGhlIG9ubHkgdGhpbmcgeW91CisJCSBjYW4gZG8gd2l0aCBzdWNoIGEgdGhyZWFkIGlzIGNvbnRpbnVlIGl0LiAgKi8KKworCSAgICAgIHRocmVhZF9pc19pbl9rZXJuZWxbdGhyZWFkXSA9IAorCQkoKHJlYWRfcmVnaXN0ZXIgKFBTX1JFR05VTSkgPj4gMjUpICYgMykgPT0gMDsKKworCSAgICAgIC8qIFNpZ25hbHMgcHVzaCBhbiBleHRlbmRlZCBmcmFtZSBhbmQgdGhlbiBmYXVsdAorCQkgd2l0aCBhIHJpZGljdWxvdXMgcGMuICBQb3AgdGhlIGZyYW1lLiAgKi8KKworCSAgICAgIGlmICh0aHJlYWRfcGNbdGhyZWFkXSA+IFNUQUNLX0VORF9BRERSKQorCQl7CisJCSAgUE9QX0ZSQU1FOworCQkgIGlmIChpc19icmVha19wYyAodGhyZWFkX3BjW3RocmVhZF0pKQorCQkgICAgdGhyZWFkX3BjW3RocmVhZF0gPSByZWFkX3BjICgpIC0gMjsKKwkJICBlbHNlCisJCSAgICB0aHJlYWRfcGNbdGhyZWFkXSA9IHJlYWRfcGMgKCk7CisJCSAgd3JpdGVfcmVnaXN0ZXIgKFBDX1JFR05VTSwgdGhyZWFkX3BjW3RocmVhZF0pOworCQl9CisJICAgICAgCisJICAgICAgaWYgKHBzLnBpX29zaWdubyB8fCBwcy5waV9vc2lnY29kZSkKKwkJeworCQkgIHNpZ25hbF9zdGFjaysrOworCQkgIHNpZ25hbF9zdGFjay0+cGlkID0gcGlkOworCQkgIHNpZ25hbF9zdGFjay0+dGhyZWFkID0gdGhyZWFkOworCQkgIHNpZ25hbF9zdGFjay0+c2lnbm8gPSB0aHJlYWRfc2lnbmFsW3RocmVhZF07CisJCSAgc2lnbmFsX3N0YWNrLT5zdWJzaWcgPSB0aHJlYWRfc2lnY29kZVt0aHJlYWRdOworCQkgIHNpZ25hbF9zdGFjay0+cGMgPSB0aHJlYWRfcGNbdGhyZWFkXTsKKwkJfQorCisJICAgICAgLyogVGhlIGZvbGxvd2luZyBoYWNrZXJ5IGlzIGNhdXNlZCBieSBhIHVuaXggNy4xIGZlYXR1cmU6CisJCSB0aGUgaW5mZXJpb3IncyBmaXhlZCBzY2hlZHVsaW5nIG1vZGUgaXMgY2xlYXJlZCB3aGVuCisJCSBpdCBleGVjcyB0aGUgc2hlbGwgKHNpbmNlIHRoZSBzaGVsbCBpcyBub3QgYSBwYXJhbGxlbAorCQkgcHJvZ3JhbSkuICBTbywgbm90ZSB0aGUgNS40IHRyYXAgd2UgZ2V0IHdoZW4KKwkJIHRoZSBzaGVsbCBkb2VzIGl0cyBleGVjLCB0aGVuIGNhdGNoIHRoZSA1LjAgdHJhcCAKKwkJIHRoYXQgb2NjdXJzIHdoZW4gdGhlIGRlYnVnZ2VlIHN0YXJ0cywgYW5kIHNldCBmaXhlZAorCQkgc2NoZWR1bGluZyBtb2RlIHByb3Blcmx5LiAgKi8KKworCSAgICAgIGlmIChwcy5waV9vc2lnbm8gPT0gNSAmJiBwcy5waV9vc2lnY29kZSA9PSA0KQorCQlleGVjX3RyYXBfdGltZXIgPSAxOworCSAgICAgIGVsc2UKKwkJZXhlY190cmFwX3RpbWVyLS07CisJICAgICAgCisJICAgICAgaWYgKHBzLnBpX29zaWdubyA9PSA1ICYmIGV4ZWNfdHJhcF90aW1lciA9PSAwKQorCQlzZXRfZml4ZWRfc2NoZWR1bGluZyAocGlkLCBwYXJhbGxlbCA9PSAyKTsKKwkgICAgfQorCX0KKworICAgICAgaWYgKHNpZ25hbF9zdGFja19pc19lbXB0eSAoKSkKKwllcnJvciAoIm5vIGFjdGl2ZSB0aHJlYWRzPyEiKTsKKyAgICB9CisKKyAgLyogU2VsZWN0IHRoZSB0aHJlYWQgdGhhdCBzdG9wcGVkLCBhbmQgcmV0dXJuICp3IHNheWluZyB3aHkuICAqLworCisgIHNlbGVjdF90aHJlYWQgKHNpZ25hbF9zdGFjay0+dGhyZWFkKTsKKworIEZJWE1FOiBuZWVkIHRvIGNvbnZlcnQgZnJvbSBob3N0IHNpZy4KKyAgc3RvcF9zaWduYWwgPSBzaWduYWxfc3RhY2stPnNpZ25vOworICBzdG9wX3NpZ2NvZGUgPSBzaWduYWxfc3RhY2stPnN1YnNpZzsKKworICBXU0VUU1RPUCAoKncsIHNpZ25hbF9zdGFjay0+c2lnbm8pOworICB3LT53X3RocmVhZCA9IHNpZ25hbF9zdGFjay0+dGhyZWFkOworICByZXR1cm4gKHNpZ25hbF9zdGFjay0tKS0+cGlkOworfQorCisvKiBTZWxlY3QgdGhyZWFkIFRIUkVBRCAtLSBpdHMgcmVnaXN0ZXJzLCBzdGFjaywgcGVyLXRocmVhZCBtZW1vcnkuCisgICBUaGlzIGlzIHRoZSBvbmx5IHJvdXRpbmUgdGhhdCBtYXkgYXNzaWduIHRvIGluZmVyaW9yX3RocmVhZAorICAgb3IgdGhyZWFkX3JlZ3NbXS4gICovCisKK3N0YXRpYyB2b2lkCitzZWxlY3RfdGhyZWFkICh0aHJlYWQpCisgICAgIGludCB0aHJlYWQ7Cit7CisgIGlmICh0aHJlYWQgPT0gaW5mZXJpb3JfdGhyZWFkKQorICAgIHJldHVybjsKKworICBtZW1jcHkgKHRocmVhZF9yZWdzW2luZmVyaW9yX3RocmVhZF0sIHJlZ2lzdGVycywgUkVHSVNURVJfQllURVMpOworICBwcy5waV90aHJlYWQgPSBpbmZlcmlvcl90aHJlYWQgPSB0aHJlYWQ7CisgIGlmIChoYXZlX2luZmVyaW9yX3AgKCkpCisgICAgaW9jdGwgKGluZmVyaW9yX2ZkLCBQSVNFVFJXVElELCAmcHMpOworICBtZW1jcHkgKHJlZ2lzdGVycywgdGhyZWFkX3JlZ3NbdGhyZWFkXSwgUkVHSVNURVJfQllURVMpOworfQorICAKKy8qIFJvdXRpbmUgdG8gc2V0IG9yIGNsZWFyIGEgcHN3IGJpdCBpbiB0aGUgcHN3IGFuZCBhbHNvIGFsbCBwc3dzCisgICBzYXZlZCBvbiB0aGUgc3RhY2suICBRdWl0cyB3aGVuIHdlIGdldCB0byBhIGZyYW1lIGluIHdoaWNoIHRoZQorICAgc2F2ZWQgcHN3IGlzIGNvcnJlY3QuICovCisKK3N0YXRpYyB2b2lkCitzY2FuX3N0YWNrIChiaXQsIHZhbCkKKyAgICBsb25nIGJpdCwgdmFsOworeworICBsb25nIHBzID0gcmVhZF9yZWdpc3RlciAoUFNfUkVHTlVNKTsKKyAgbG9uZyBmcDsKKyAgaWYgKHZhbCA/ICEocHMgJiBiaXQpIDogKHBzICYgYml0KSkKKyAgICB7ICAgIAorICAgICAgcHMgXj0gYml0OworICAgICAgd3JpdGVfcmVnaXN0ZXIgKFBTX1JFR05VTSwgcHMpOworCisgICAgICBmcCA9IHJlYWRfcmVnaXN0ZXIgKEZQX1JFR05VTSk7CisgICAgICB3aGlsZSAoZnAgJiAweDgwMDAwMDAwKQorCXsKKwkgIHBzID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoZnAgKyA0LCA0KTsKKwkgIGlmICh2YWwgPyAocHMgJiBiaXQpIDogIShwcyAmIGJpdCkpCisJICAgIGJyZWFrOworCSAgcHMgXj0gYml0OworCSAgd3JpdGVfbWVtb3J5IChmcCArIDQsICZwcywgNCk7CisJICBmcCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKGZwICsgOCwgNCk7CisJfQorICAgIH0KK30KKworLyogU2V0IGZpeGVkIHNjaGVkdWxpbmcgKGFsbGlhbnQgbW9kZSkgb2YgcHJvY2VzcyBQSUQgdG8gQVJHICgwIG9yIDEpLiAgKi8KKworc3RhdGljIHZvaWQKK3NldF9maXhlZF9zY2hlZHVsaW5nIChwaWQsIGFyZykKKyAgICAgIGludCBhcmc7Cit7CisgIHN0cnVjdCBwYXR0cmlidXRlcyBwYXR0cjsKKyAgZ2V0cGF0dHIgKHBpZCwgJnBhdHRyKTsKKyAgcGF0dHIucGF0dHJfcGZpeGVkID0gYXJnOworICBzZXRwYXR0ciAocGlkLCAmcGF0dHIpOworfQorDAordm9pZAorY29yZV9maWxlX2NvbW1hbmQgKGZpbGVuYW1lLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqZmlsZW5hbWU7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IG47CisKKyAgLyogRGlzY2FyZCBhbGwgdmVzdGlnZXMgb2YgYW55IHByZXZpb3VzIGNvcmUgZmlsZQorICAgICBhbmQgbWFyayBkYXRhIGFuZCBzdGFjayBzcGFjZXMgYXMgZW1wdHkuICAqLworCisgIGlmIChjb3JlZmlsZSkKKyAgICBmcmVlIChjb3JlZmlsZSk7CisgIGNvcmVmaWxlID0gMDsKKworICBpZiAoY29yZWNoYW4gPj0gMCkKKyAgICBjbG9zZSAoY29yZWNoYW4pOworICBjb3JlY2hhbiA9IC0xOworCisgIGRhdGFfc3RhcnQgPSAwOworICBkYXRhX2VuZCA9IDA7CisgIHN0YWNrX3N0YXJ0ID0gU1RBQ0tfRU5EX0FERFI7CisgIHN0YWNrX2VuZCA9IFNUQUNLX0VORF9BRERSOworICBuX2NvcmUgPSAwOworCisgIC8qIE5vdywgaWYgYSBuZXcgY29yZSBmaWxlIHdhcyBzcGVjaWZpZWQsIG9wZW4gaXQgYW5kIGRpZ2VzdCBpdC4gICovCisKKyAgaWYgKGZpbGVuYW1lKQorICAgIHsKKyAgICAgIGZpbGVuYW1lID0gdGlsZGVfZXhwYW5kIChmaWxlbmFtZSk7CisgICAgICBtYWtlX2NsZWFudXAgKGZyZWUsIGZpbGVuYW1lKTsKKyAgICAgIAorICAgICAgaWYgKGhhdmVfaW5mZXJpb3JfcCAoKSkKKwllcnJvciAoIlRvIGxvb2sgYXQgYSBjb3JlIGZpbGUsIHlvdSBtdXN0IGtpbGwgdGhlIHByb2dyYW0gd2l0aCBcImtpbGxcIi4iKTsKKyAgICAgIGNvcmVjaGFuID0gb3BlbiAoZmlsZW5hbWUsIE9fUkRPTkxZLCAwKTsKKyAgICAgIGlmIChjb3JlY2hhbiA8IDApCisJcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworCisgICAgICBpZiAobXlyZWFkIChjb3JlY2hhbiwgJmZpbGVoZHIsIHNpemVvZiBmaWxlaGRyKSA8IDApCisJcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworCisgICAgICBpZiAoIUlTX0NPUkVfU09GRl9NQUdJQyAoZmlsZWhkci5oX21hZ2ljKSkKKwllcnJvciAoIiVzOiBub3QgYSBjb3JlIGZpbGUuXG4iLCBmaWxlbmFtZSk7CisKKyAgICAgIGlmIChteXJlYWQgKGNvcmVjaGFuLCAmb3B0aGRyLCBmaWxlaGRyLmhfb3B0aGRyKSA8IDApCisJcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworCisgICAgICAvKiBSZWFkIHRocm91Z2ggdGhlIHNlY3Rpb24gaGVhZGVycy4KKwkgRm9yIHRleHQsIGRhdGEsIGV0YywgcmVjb3JkIGFuIGVudHJ5IGluIHRoZSBjb3JlIGZpbGUgbWFwLgorCSBGb3IgY29udGV4dCBhbmQgdGNvbnRleHQsIHJlY29yZCB0aGUgZmlsZSBhZGRyZXNzIG9mCisJIHRoZSBjb250ZXh0IGJsb2Nrcy4gICovCisKKyAgICAgIGxzZWVrIChjb3JlY2hhbiwgKGxvbmcpIGZpbGVoZHIuaF9zY25wdHIsIDApOworCisgICAgICBuX3RocmVhZHMgPSAwOworICAgICAgZm9yIChuID0gMDsgbiA8IGZpbGVoZHIuaF9uc2NuczsgbisrKQorCXsKKwkgIGlmIChteXJlYWQgKGNvcmVjaGFuLCAmc2NuaGRyLCBzaXplb2Ygc2NuaGRyKSA8IDApCisJICAgIHBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKKwkgIGlmICgoc2NuaGRyLnNfZmxhZ3MgJiBTX1RZUE1BU0spID49IFNfVEVYVAorCSAgICAgICYmIChzY25oZHIuc19mbGFncyAmIFNfVFlQTUFTSykgPD0gU19DT01PTikKKwkgICAgeworCSAgICAgIGNvcmVfbWFwW25fY29yZV0ubWVtX2FkZHIgPSBzY25oZHIuc192YWRkcjsKKwkgICAgICBjb3JlX21hcFtuX2NvcmVdLm1lbV9lbmQgPSBzY25oZHIuc192YWRkciArIHNjbmhkci5zX3NpemU7CisJICAgICAgY29yZV9tYXBbbl9jb3JlXS5maWxlX2FkZHIgPSBzY25oZHIuc19zY25wdHI7CisJICAgICAgY29yZV9tYXBbbl9jb3JlXS50eXBlID0gc2NuaGRyLnNfZmxhZ3MgJiBTX1RZUE1BU0s7CisJICAgICAgaWYgKGNvcmVfbWFwW25fY29yZV0udHlwZSAhPSBTX1RCU1MKKwkJICAmJiBjb3JlX21hcFtuX2NvcmVdLnR5cGUgIT0gU19UREFUQQorCQkgICYmIGNvcmVfbWFwW25fY29yZV0udHlwZSAhPSBTX1RURVhUKQorCQljb3JlX21hcFtuX2NvcmVdLnRocmVhZCA9IC0xOworCSAgICAgIGVsc2UgaWYgKG5fY29yZSA9PSAwCisJCSAgICAgICB8fCBjb3JlX21hcFtuX2NvcmUtMV0ubWVtX2FkZHIgIT0gc2NuaGRyLnNfdmFkZHIpCisJCWNvcmVfbWFwW25fY29yZV0udGhyZWFkID0gMDsKKwkgICAgICBlbHNlIAorCQljb3JlX21hcFtuX2NvcmVdLnRocmVhZCA9IGNvcmVfbWFwW25fY29yZS0xXS50aHJlYWQgKyAxOworCSAgICAgIG5fY29yZSsrOworCSAgICB9CisJICBlbHNlIGlmICgoc2NuaGRyLnNfZmxhZ3MgJiBTX1RZUE1BU0spID09IFNfQ09OVEVYVCkKKwkgICAgY29udGV4dF9vZmZzZXQgPSBzY25oZHIuc19zY25wdHI7CisJICBlbHNlIGlmICgoc2NuaGRyLnNfZmxhZ3MgJiBTX1RZUE1BU0spID09IFNfVENPTlRFWFQpIAorCSAgICB0Y29udGV4dF9vZmZzZXRbbl90aHJlYWRzKytdID0gc2NuaGRyLnNfc2NucHRyOworCX0KKworICAgICAgLyogUmVhZCB0aGUgY29udGV4dCBibG9jaywgc3RydWN0IHVzZXIsIHN0cnVjdCBwcm9jLAorCSBhbmQgdGhlIGNvbW0gcmVncy4gICovCisKKyAgICAgIGxzZWVrIChjb3JlY2hhbiwgY29udGV4dF9vZmZzZXQsIDApOworICAgICAgaWYgKG15cmVhZCAoY29yZWNoYW4sICZjLCBzaXplb2YgYykgPCAwKQorCXBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKKyAgICAgIGxzZWVrIChjb3JlY2hhbiwgYy5jb3JlX3VzZXJfcCwgMCk7CisgICAgICBpZiAobXlyZWFkIChjb3JlY2hhbiwgJnUsIHNpemVvZiB1KSA8IDApCisJcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworICAgICAgbHNlZWsgKGNvcmVjaGFuLCBjLmNvcmVfcHJvY19wLCAwKTsKKyAgICAgIGlmIChteXJlYWQgKGNvcmVjaGFuLCAmcHIsIHNpemVvZiBwcikgPCAwKQorCXBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKKyAgICAgIGNvbW1fcmVnaXN0ZXJzID0gcHIucF9jcmVnOworCisgICAgICAvKiBDb3JlIGZpbGUgYXBwYXJlbnRseSBpcyByZWFsbHkgdGhlcmUuICBNYWtlIGl0IHJlYWxseSBleGlzdAorCSBmb3IgeGZlcl9jb3JlX2ZpbGUgc28gd2UgY2FuIGRvIHJlYWRfbWVtb3J5IG9uIGl0LiAqLworCisgICAgICBpZiAoZmlsZW5hbWVbMF0gPT0gJy8nKQorCWNvcmVmaWxlID0gc2F2ZXN0cmluZyAoZmlsZW5hbWUsIHN0cmxlbiAoZmlsZW5hbWUpKTsKKyAgICAgIGVsc2UKKwljb3JlZmlsZSA9IGNvbmNhdCAoY3VycmVudF9kaXJlY3RvcnksICIvIiwgZmlsZW5hbWUsIE5VTEwpOworCisgICAgICBwcmludGZfZmlsdGVyZWQgKCJQcm9ncmFtICVzICIsIHUudV9jb21tKTsKKworICAgICAgLyogUmVhZCB0aGUgdGhyZWFkIHJlZ2lzdGVycyBhbmQgZmlsbCBpbiB0aGUgdGhyZWFkX3h4eFtdIGRhdGEuICAqLworCisgICAgICBmb3IgKG4gPSAwOyBuIDwgbl90aHJlYWRzOyBuKyspCisJeworCSAgc2VsZWN0X3RocmVhZCAobik7CisKKwkgIGxzZWVrIChjb3JlY2hhbiwgdGNvbnRleHRfb2Zmc2V0W25dLCAwKTsKKwkgIGlmIChteXJlYWQgKGNvcmVjaGFuLCAmdGMsIHNpemVvZiB0YykgPCAwKQorCSAgICBwZXJyb3Jfd2l0aF9uYW1lIChjb3JlZmlsZSk7CisJICBsc2VlayAoY29yZWNoYW4sIHRjLmNvcmVfdGhyZWFkX3AsIDApOworCSAgaWYgKG15cmVhZCAoY29yZWNoYW4sICZ0aCwgc2l6ZW9mIHRoKSA8IDApCisJICAgIHBlcnJvcl93aXRoX25hbWUgKGNvcmVmaWxlKTsKKworCSAgbHNlZWsgKGNvcmVjaGFuLCB0Yy5jb3JlX3N5c2NhbGxfY29udGV4dF9wLCAwKTsKKwkgIGlmIChteXJlYWQgKGNvcmVjaGFuLCByZWdpc3RlcnMsIFJFR0lTVEVSX0JZVEVTKSA8IDApCisJICAgIHBlcnJvcl93aXRoX25hbWUgKGNvcmVmaWxlKTsKKworCSAgdGhyZWFkX3NpZ25hbFtuXSA9IHRoLnRfY3Vyc2lnOworCSAgdGhyZWFkX3NpZ2NvZGVbbl0gPSB0aC50X2NvZGU7CisJICB0aHJlYWRfc3RhdGVbbl0gPSB0aC50X3N0YXRlOworCSAgdGhyZWFkX3BjW25dID0gcmVhZF9wYyAoKTsKKworCSAgaWYgKHRocmVhZF9wY1tuXSA+IFNUQUNLX0VORF9BRERSKQorCSAgICB7CisJICAgICAgUE9QX0ZSQU1FOworCSAgICAgIGlmIChpc19icmVha19wYyAodGhyZWFkX3BjW25dKSkKKwkJdGhyZWFkX3BjW25dID0gcmVhZF9wYyAoKSAtIDI7CisJICAgICAgZWxzZQorCQl0aHJlYWRfcGNbbl0gPSByZWFkX3BjICgpOworCSAgICAgIHdyaXRlX3JlZ2lzdGVyIChQQ19SRUdOVU0sIHRocmVhZF9wY1tuXSk7CisJICAgIH0KKworCSAgcHJpbnRmX2ZpbHRlcmVkICgidGhyZWFkICVkIHJlY2VpdmVkIHNpZ25hbCAlZCwgJXNcbiIsCisJCQkgICBuLCB0aHJlYWRfc2lnbmFsW25dLAorCQkJICAgc2FmZV9zdHJzaWduYWwgKHRocmVhZF9zaWduYWxbbl0pKTsKKwl9CisKKyAgICAgIC8qIFNlbGVjdCBhbiBpbnRlcmVzdGluZyB0aHJlYWQgLS0gYWxzby1yYW5zIGRpZWQgd2l0aCBTSUdLSUxMLAorCSBzbyBmaW5kIG9uZSB0aGF0IGRpZG4ndC4gICovCisKKyAgICAgIGZvciAobiA9IDA7IG4gPCBuX3RocmVhZHM7IG4rKykKKwlpZiAodGhyZWFkX3NpZ25hbFtuXSAhPSAwICYmIHRocmVhZF9zaWduYWxbbl0gIT0gU0lHS0lMTCkKKwkgIHsKKwkgICAgc2VsZWN0X3RocmVhZCAobik7CisJICAgIHN0b3Bfc2lnbmFsID0gdGhyZWFkX3NpZ25hbFtuXTsKKwkgICAgc3RvcF9zaWdjb2RlID0gdGhyZWFkX3NpZ2NvZGVbbl07CisJICAgIGJyZWFrOworCSAgfQorCisgICAgICBjb3JlX2FvdXRoZHIuYV9tYWdpYyA9IDA7CisKKyAgICAgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7CisgICAgICBzZWxlY3RfZnJhbWUgKGdldF9jdXJyZW50X2ZyYW1lICgpLCAwKTsKKyAgICAgIHZhbGlkYXRlX2ZpbGVzICgpOworCisgICAgICBwcmludF9zdGFja19mcmFtZSAoc2VsZWN0ZWRfZnJhbWUsIHNlbGVjdGVkX2ZyYW1lX2xldmVsLCAtMSk7CisgICAgfQorICBlbHNlIGlmIChmcm9tX3R0eSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJObyBjb3JlIGZpbGUgbm93LlxuIik7Cit9CmRpZmYgLS1naXQgYS9nZGIvY29weWluZy5hd2sgYi9nZGIvY29weWluZy5hd2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1M2U5MgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb3B5aW5nLmF3awpAQCAtMCwwICsxLDc3IEBACitCRUdJTgl7CisJICBGUz0iXCIiOworCSAgcHJpbnQgIi8qID09PiBEbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSEhICBJdCBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkiOworCSAgcHJpbnQgIiAgIGJ5IGNvcHlpbmcuYXdrLiAgTW9kaWZ5IGNvcHlpbmcuYXdrIGluc3RlYWQuICA8PT0gKi8iOworCSAgcHJpbnQgIiIKKwkgIHByaW50ICIjaW5jbHVkZSBcImRlZnMuaFwiIgorCSAgcHJpbnQgIiNpbmNsdWRlIFwiY29tbWFuZC5oXCIiCisJICBwcmludCAiI2luY2x1ZGUgXCJnZGJjbWQuaFwiIgorCSAgcHJpbnQgIiIKKwkgIHByaW50ICJzdGF0aWMgdm9pZCBzaG93X2NvcHlpbmdfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOyIKKwkgIHByaW50ICIiCisJICBwcmludCAic3RhdGljIHZvaWQgc2hvd193YXJyYW50eV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7IgorCSAgcHJpbnQgIiIKKwkgIHByaW50ICJ2b2lkIF9pbml0aWFsaXplX2NvcHlpbmcgUEFSQU1TICgodm9pZCkpOyIKKwkgIHByaW50ICIiCisJICBwcmludCAiZXh0ZXJuIGludCBpbW1lZGlhdGVfcXVpdDsiOworCSAgcHJpbnQgInN0YXRpYyB2b2lkIjsKKwkgIHByaW50ICJzaG93X2NvcHlpbmdfY29tbWFuZCAoaWdub3JlLCBmcm9tX3R0eSkiOworCSAgcHJpbnQgIiAgICAgY2hhciAqaWdub3JlOyI7CisJICBwcmludCAiICAgICBpbnQgZnJvbV90dHk7IjsKKwkgIHByaW50ICJ7IjsKKwkgIHByaW50ICIgIGltbWVkaWF0ZV9xdWl0Kys7IjsKKwl9CitOUiA9PSAxLC9eWyAJXSpOTyBXQVJSQU5UWVsgCV0qJC8JeworCSAgaWYgKCQwIH4gLwwvKQorCSAgICB7CisJICAgICAgcHJpbnRmICIgIHByaW50Zl9maWx0ZXJlZCAoXCJcXG5cIik7XG4iOworCSAgICB9CisJICBlbHNlIGlmICgkMCAhfiAvXlsgCV0qTk8gV0FSUkFOVFlbIAldKiQvKSAKKwkgICAgeworCSAgICAgIHByaW50ZiAiICBwcmludGZfZmlsdGVyZWQgKFwiIjsKKwkgICAgICBmb3IgKGkgPSAxOyBpIDwgTkY7IGkrKykKKwkJcHJpbnRmICIlc1xcXCIiLCAkaTsKKwkgICAgICBwcmludGYgIiVzXFxuXCIpO1xuIiwgJE5GOworCSAgICB9CisJfQorL15bCSBdKk5PIFdBUlJBTlRZWyAJXSokLwl7CisJICBwcmludCAiICBpbW1lZGlhdGVfcXVpdC0tOyI7CisJICBwcmludCAifSI7CisJICBwcmludCAiIjsKKwkgIHByaW50ICJzdGF0aWMgdm9pZCI7CisJICBwcmludCAic2hvd193YXJyYW50eV9jb21tYW5kIChpZ25vcmUsIGZyb21fdHR5KSI7CisJICBwcmludCAiICAgICBjaGFyICppZ25vcmU7IjsKKwkgIHByaW50ICIgICAgIGludCBmcm9tX3R0eTsiOworCSAgcHJpbnQgInsiOworCSAgcHJpbnQgIiAgaW1tZWRpYXRlX3F1aXQrKzsiOworCX0KKy9eWyAJXSpOTyBXQVJSQU5UWVsgCV0qJC8sIC9eWyAJXSpFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlNbIAldKiQveyAgCisJICBpZiAoISAoJDAgfiAvXlsgCV0qRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TWyAJXSokLykpIAorCSAgICB7CisJICAgICAgcHJpbnRmICIgIHByaW50Zl9maWx0ZXJlZCAoXCIiOworCSAgICAgIGZvciAoaSA9IDE7IGkgPCBORjsgaSsrKQorCQlwcmludGYgIiVzXFxcIiIsICRpOworCSAgICAgIHByaW50ZiAiJXNcXG5cIik7XG4iLCAkTkY7CisJICAgIH0KKwl9CitFTkQJeworCSAgcHJpbnQgIiAgaW1tZWRpYXRlX3F1aXQtLTsiOworCSAgcHJpbnQgIn0iOworCSAgcHJpbnQgIiI7CisJICBwcmludCAidm9pZCIKKwkgIHByaW50ICJfaW5pdGlhbGl6ZV9jb3B5aW5nICgpIjsKKwkgIHByaW50ICJ7IjsKKwkgIHByaW50ICIgIGFkZF9jbWQgKFwiY29weWluZ1wiLCBub19jbGFzcywgc2hvd19jb3B5aW5nX2NvbW1hbmQsIjsKKwkgIHByaW50ICIJICAgXCJDb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGluZyBjb3BpZXMgb2YgR0RCLlwiLCI7CisJICBwcmludCAiCSAgICZzaG93bGlzdCk7IjsKKwkgIHByaW50ICIgIGFkZF9jbWQgKFwid2FycmFudHlcIiwgbm9fY2xhc3MsIHNob3dfd2FycmFudHlfY29tbWFuZCwiOworCSAgcHJpbnQgIgkgICBcIlZhcmlvdXMga2luZHMgb2Ygd2FycmFudHkgeW91IGRvIG5vdCBoYXZlLlwiLCI7CisJICBwcmludCAiCSAgICZzaG93bGlzdCk7IjsKKwkgIHByaW50ICIiOworCSAgcHJpbnQgIiAgLyogRm9yIG9sZC10aW1lcnMsIGFsbG93IFwiaW5mbyBjb3B5aW5nXCIsIGV0Yy4gICovIjsKKwkgIHByaW50ICIgIGFkZF9pbmZvIChcImNvcHlpbmdcIiwgc2hvd19jb3B5aW5nX2NvbW1hbmQsIjsKKwkgIHByaW50ICIJICAgIFwiQ29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpbmcgY29waWVzIG9mIEdEQi5cIik7IjsKKwkgIHByaW50ICIgIGFkZF9pbmZvIChcIndhcnJhbnR5XCIsIHNob3dfd2FycmFudHlfY29tbWFuZCwiOworCSAgcHJpbnQgIgkgICAgXCJWYXJpb3VzIGtpbmRzIG9mIHdhcnJhbnR5IHlvdSBkbyBub3QgaGF2ZS5cIik7IjsKKwkgIHByaW50ICJ9IjsKKwl9CmRpZmYgLS1naXQgYS9nZGIvY29weWluZy5jIGIvZ2RiL2NvcHlpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzZkYjFmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvcHlpbmcuYwpAQCAtMCwwICsxLDMyNyBAQAorLyogPT0+IERvIG5vdCBtb2RpZnkgdGhpcyBmaWxlISEgIEl0IGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseQorICAgYnkgY29weWluZy5hd2suICBNb2RpZnkgY29weWluZy5hd2sgaW5zdGVhZC4gIDw9PSAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKworc3RhdGljIHZvaWQgc2hvd19jb3B5aW5nX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgc2hvd193YXJyYW50eV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3ZvaWQgX2luaXRpYWxpemVfY29weWluZyBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBpbnQgaW1tZWRpYXRlX3F1aXQ7CitzdGF0aWMgdm9pZAorc2hvd19jb3B5aW5nX2NvbW1hbmQgKGlnbm9yZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmlnbm9yZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpbW1lZGlhdGVfcXVpdCsrOworICBwcmludGZfZmlsdGVyZWQgKCIJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIgkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0FcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIgkJCSAgICBQcmVhbWJsZVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91clxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmVcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgidXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0b1xuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInlvdXIgcHJvZ3JhbXMsIHRvby5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3RcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91XG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvclxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdFxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0XG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZFxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXJcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXRcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJ5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXJcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJyaWdodHMuXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSxcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJ0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIndhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgidGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWxcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJhdXRob3JzJyByZXB1dGF0aW9ucy5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgicGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGVcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnlcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmRcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJtb2RpZmljYXRpb24gZm9sbG93LlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIgkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWRcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJ1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlIFwiUHJvZ3JhbVwiLCBiZWxvdyxcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJyZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSBcIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW1cIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIm1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6XG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgidGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCxcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlclxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJ0aGUgdGVybSBcIm1vZGlmaWNhdGlvblwiLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzIFwieW91XCIuXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3RcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgicnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0nc1xuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGVcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgibm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5O1xuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2VcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIllvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZFxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgib2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZFxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlc1xuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55XG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0XG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb25cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgidGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZFxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIm9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdFxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0b1xuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvclxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIndpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgidGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LFxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnNcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGVcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91XG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2hcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvclxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIm1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnlcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJhc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG9cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgic3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnlcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIm9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50XG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiaXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIklmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmdcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJhY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50XG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90XG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHRcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXNcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJ2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXJcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJ0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaFxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdFxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgicHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIm1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZ1xuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgib3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0b1xuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgicmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIllvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgidGhpcyBMaWNlbnNlLlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudFxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvclxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIm90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3RcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdFxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXNcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91XG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgibWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudFxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnlcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJhbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJ0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgicmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXJcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJhbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXJcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJjaXJjdW1zdGFuY2VzLlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIkl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnlcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGVcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXNcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGVcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgidGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXRcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgidG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90XG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiaW1wb3NlIHRoYXQgY2hvaWNlLlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0b1xuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGVcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgibWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgidGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZ1xuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoImNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlc1xuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnNcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGxcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG9cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgic3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kIFwiYW55XG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgibGF0ZXIgdmVyc2lvblwiLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnNcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2ZcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJ0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiRm91bmRhdGlvbi5cbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCIgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWVcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgidG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgibWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHNcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgib2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgaW1tZWRpYXRlX3F1aXQtLTsKK30KKworc3RhdGljIHZvaWQKK3Nob3dfd2FycmFudHlfY29tbWFuZCAoaWdub3JlLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqaWdub3JlOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGltbWVkaWF0ZV9xdWl0Kys7CisgIHByaW50Zl9maWx0ZXJlZCAoIgkJCSAgICBOTyBXQVJSQU5UWVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFU1xuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlBST1ZJREUgVEhFIFBST0dSQU0gXCJBUyBJU1wiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRURcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIk1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVNcbiIpOworICBwcmludGZfZmlsdGVyZWQgKCJUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiUkVQQUlSIE9SIENPUlJFQ1RJT04uXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRFxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIllPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIGltbWVkaWF0ZV9xdWl0LS07Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX2NvcHlpbmcgKCkKK3sKKyAgYWRkX2NtZCAoImNvcHlpbmciLCBub19jbGFzcywgc2hvd19jb3B5aW5nX2NvbW1hbmQsCisJICAgIkNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW5nIGNvcGllcyBvZiBHREIuIiwKKwkgICAmc2hvd2xpc3QpOworICBhZGRfY21kICgid2FycmFudHkiLCBub19jbGFzcywgc2hvd193YXJyYW50eV9jb21tYW5kLAorCSAgICJWYXJpb3VzIGtpbmRzIG9mIHdhcnJhbnR5IHlvdSBkbyBub3QgaGF2ZS4iLAorCSAgICZzaG93bGlzdCk7CisKKyAgLyogRm9yIG9sZC10aW1lcnMsIGFsbG93ICJpbmZvIGNvcHlpbmciLCBldGMuICAqLworICBhZGRfaW5mbyAoImNvcHlpbmciLCBzaG93X2NvcHlpbmdfY29tbWFuZCwKKwkgICAgIkNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW5nIGNvcGllcyBvZiBHREIuIik7CisgIGFkZF9pbmZvICgid2FycmFudHkiLCBzaG93X3dhcnJhbnR5X2NvbW1hbmQsCisJICAgICJWYXJpb3VzIGtpbmRzIG9mIHdhcnJhbnR5IHlvdSBkbyBub3QgaGF2ZS4iKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9jb3JlLWFvdXQuYyBiL2dkYi9jb3JlLWFvdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzFkNDk5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NvcmUtYW91dC5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKiBFeHRyYWN0IHJlZ2lzdGVycyBmcm9tIGEgInN0YW5kYXJkIiBjb3JlIGZpbGUsIGZvciBHREIuCisgICBDb3B5cmlnaHQgKEMpIDE5ODgtMTk5OCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVHlwaWNhbGx5IHVzZWQgb24gc3lzdGVtcyB0aGF0IGhhdmUgYS5vdXQgZm9ybWF0IGV4ZWN1dGFibGVzLgorICAgY29yZWZpbGUuYyBpcyBzdXBwb3NlZCB0byBjb250YWluIHRoZSBtb3JlIG1hY2hpbmUtaW5kZXBlbmRlbnQKKyAgIGFzcGVjdHMgb2YgcmVhZGluZyByZWdpc3RlcnMgZnJvbSBjb3JlIGZpbGVzLCB3aGlsZSB0aGlzIGZpbGUgaXMKKyAgIG1vcmUgbWFjaGluZSBzcGVjaWZpYy4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisKKyNpZmRlZiBIQVZFX1BUUkFDRV9ICisjIGluY2x1ZGUgPHB0cmFjZS5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TWVNfUFRSQUNFX0gKKyMgIGluY2x1ZGUgPHN5cy9wdHJhY2UuaD4KKyMgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgInZhbHVlLmgiIC8qIEZvciBzdXBwbHlfcmVnaXN0ZXIuICAqLworI2luY2x1ZGUgImluZmVyaW9yLmgiIC8qIEZvciBBUkNIX05VTV9SRUdTLiAqLworCisvKiBUaGVzZSBhcmUgbmVlZGVkIG9uIHZhcmlvdXMgc3lzdGVtcyB0byBleHBhbmQgUkVHSVNURVJfVV9BRERSLiAgKi8KKyNpZm5kZWYgVVNHCisjaW5jbHVkZSA8c3lzL2Rpci5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSAiZ2RiX3N0YXQuaCIKKyNpbmNsdWRlIDxzeXMvdXNlci5oPgorI2VuZGlmCisKKyNpZm5kZWYgQ09SRV9SRUdJU1RFUl9BRERSCisjZGVmaW5lIENPUkVfUkVHSVNURVJfQUREUihyZWdubywgcmVncHRyKSByZWdpc3Rlcl9hZGRyKHJlZ25vLCByZWdwdHIpCisjZW5kaWYgLyogQ09SRV9SRUdJU1RFUl9BRERSICovCisKKyNpZmRlZiBORUVEX1NZU19DT1JFX0gKKyNpbmNsdWRlIDxzeXMvY29yZS5oPgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGZldGNoX2NvcmVfcmVnaXN0ZXJzIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQsIGludCwgQ09SRV9BRERSKSk7CisKK3ZvaWQgX2luaXRpYWxpemVfY29yZV9hb3V0IFBBUkFNUyAoKHZvaWQpKTsKKworLyogRXh0cmFjdCB0aGUgcmVnaXN0ZXIgdmFsdWVzIG91dCBvZiB0aGUgY29yZSBmaWxlIGFuZCBzdG9yZQorICAgdGhlbSB3aGVyZSBgcmVhZF9yZWdpc3Rlcicgd2lsbCBmaW5kIHRoZW0uCisKKyAgIENPUkVfUkVHX1NFQ1QgcG9pbnRzIHRvIHRoZSByZWdpc3RlciB2YWx1ZXMgdGhlbXNlbHZlcywgcmVhZCBpbnRvIG1lbW9yeS4KKyAgIENPUkVfUkVHX1NJWkUgaXMgdGhlIHNpemUgb2YgdGhhdCBhcmVhLgorICAgV0hJQ0ggc2F5cyB3aGljaCBzZXQgb2YgcmVnaXN0ZXJzIHdlIGFyZSBoYW5kbGluZyAoMCA9IGludCwgMiA9IGZsb2F0CisgICAgICAgICBvbiBtYWNoaW5lcyB3aGVyZSB0aGV5IGFyZSBkaXNjb250aWd1b3VzKS4KKyAgIFJFR19BRERSIGlzIHRoZSBvZmZzZXQgZnJvbSB1LnVfYXIwIHRvIHRoZSByZWdpc3RlciB2YWx1ZXMgcmVsYXRpdmUgdG8KKyAgICAgICAgICAgIGNvcmVfcmVnX3NlY3QuICBUaGlzIGlzIHVzZWQgd2l0aCBvbGQtZmFzaGlvbmVkIGNvcmUgZmlsZXMgdG8KKwkgICAgbG9jYXRlIHRoZSByZWdpc3RlcnMgaW4gYSBsYXJnZSB1cGFnZS1wbHVzLXN0YWNrICIucmVnIiBzZWN0aW9uLgorCSAgICBPcmlnaW5hbCB1cGFnZSBhZGRyZXNzIFggaXMgYXQgbG9jYXRpb24gY29yZV9yZWdfc2VjdCt4K3JlZ19hZGRyLgorICovCisKK3N0YXRpYyB2b2lkCitmZXRjaF9jb3JlX3JlZ2lzdGVycyAoY29yZV9yZWdfc2VjdCwgY29yZV9yZWdfc2l6ZSwgd2hpY2gsIHJlZ19hZGRyKQorICAgICBjaGFyICpjb3JlX3JlZ19zZWN0OworICAgICB1bnNpZ25lZCBjb3JlX3JlZ19zaXplOworICAgICBpbnQgd2hpY2g7CisgICAgIENPUkVfQUREUiByZWdfYWRkcjsKK3sKKyAgaW50IHJlZ25vOworICBDT1JFX0FERFIgYWRkcjsKKyAgaW50IGJhZF9yZWcgPSAtMTsKKyAgQ09SRV9BRERSIHJlZ19wdHIgPSAtcmVnX2FkZHI7IC8qIE9yaWdpbmFsIHUudV9hcjAgaXMgLXJlZ19hZGRyLiAqLworICBpbnQgbnVtcmVncyA9IEFSQ0hfTlVNX1JFR1M7CisKKyAgLyogSWYgdS51X2FyMCB3YXMgYW4gYWJzb2x1dGUgYWRkcmVzcyBpbiB0aGUgY29yZSBmaWxlLCByZWxhdGl2aXplIGl0IG5vdywKKyAgICAgc28gd2UgY2FuIHVzZSBpdCBhcyBhbiBvZmZzZXQgaW50byBjb3JlX3JlZ19zZWN0LiAgV2hlbiB3ZSdyZSBkb25lLAorICAgICAicmVnaXN0ZXIgMCIgd2lsbCBiZSBhdCBjb3JlX3JlZ19zZWN0K3JlZ19wdHIsIGFuZCB3ZSBjYW4gdXNlCisgICAgIENPUkVfUkVHSVNURVJfQUREUiB0byBvZmZzZXQgdG8gdGhlIG90aGVyIHJlZ2lzdGVycy4gIElmIHRoaXMgaXMgYSBtb2Rlcm4KKyAgICAgY29yZSBmaWxlIHdpdGhvdXQgYSB1cGFnZSwgcmVnX3B0ciB3aWxsIGJlIHplcm8gYW5kIHRoaXMgaXMgYWxsIGEgYmlnCisgICAgIE5PUC4gICovCisgIGlmIChyZWdfcHRyID4gY29yZV9yZWdfc2l6ZSkKKyAgICByZWdfcHRyIC09IEtFUk5FTF9VX0FERFI7CisKKyAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgbnVtcmVnczsgcmVnbm8rKykKKyAgICB7CisgICAgICBhZGRyID0gQ09SRV9SRUdJU1RFUl9BRERSIChyZWdubywgcmVnX3B0cik7CisgICAgICBpZiAoYWRkciA+PSBjb3JlX3JlZ19zaXplCisJICAmJiBiYWRfcmVnIDwgMCkKKwliYWRfcmVnID0gcmVnbm87CisgICAgZWxzZQorICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgY29yZV9yZWdfc2VjdCArIGFkZHIpOworICAgIH0KKworICBpZiAoYmFkX3JlZyA+PSAwKQorICAgIGVycm9yICgiUmVnaXN0ZXIgJXMgbm90IGZvdW5kIGluIGNvcmUgZmlsZS4iLCBSRUdJU1RFUl9OQU1FIChiYWRfcmVnKSk7Cit9CisKKworI2lmZGVmIFJFR0lTVEVSX1VfQUREUgorCisvKiBSZXR1cm4gdGhlIGFkZHJlc3MgaW4gdGhlIGNvcmUgZHVtcCBvciBpbmZlcmlvciBvZiByZWdpc3RlciBSRUdOTy4KKyAgIEJMT0NLRU5EIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIHVzZXIgc3RydWN0dXJlLiAgKi8KKworQ09SRV9BRERSCityZWdpc3Rlcl9hZGRyIChyZWdubywgYmxvY2tlbmQpCisgICAgIGludCByZWdubzsKKyAgICAgQ09SRV9BRERSIGJsb2NrZW5kOworeworICBDT1JFX0FERFIgYWRkcjsKKworICBpZiAocmVnbm8gPCAwIHx8IHJlZ25vID49IEFSQ0hfTlVNX1JFR1MpCisgICAgZXJyb3IgKCJJbnZhbGlkIHJlZ2lzdGVyIG51bWJlciAlZC4iLCByZWdubyk7CisKKyAgUkVHSVNURVJfVV9BRERSIChhZGRyLCBibG9ja2VuZCwgcmVnbm8pOworCisgIHJldHVybiBhZGRyOworfQorCisjZW5kaWYgLyogUkVHSVNURVJfVV9BRERSICovCisKKwwKKy8qIFJlZ2lzdGVyIHRoYXQgd2UgYXJlIGFibGUgdG8gaGFuZGxlIGFvdXQgKHRyYWQtY29yZSkgZmlsZSBmb3JtYXRzLiAgKi8KKworc3RhdGljIHN0cnVjdCBjb3JlX2ZucyBhb3V0X2NvcmVfZm5zID0KK3sKKyAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCisgIGZldGNoX2NvcmVfcmVnaXN0ZXJzLAorICBOVUxMCit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9jb3JlX2FvdXQgKCkKK3sKKyAgYWRkX2NvcmVfZm5zICgmYW91dF9jb3JlX2Zucyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvY29yZS1yZWdzZXQuYyBiL2dkYi9jb3JlLXJlZ3NldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MjVhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29yZS1yZWdzZXQuYwpAQCAtMCwwICsxLDEzNCBAQAorLyogTWFjaGluZSBpbmRlcGVuZGVudCBHREIgc3VwcG9ydCBmb3IgY29yZSBmaWxlcyBvbiBzeXN0ZW1zIHVzaW5nICJyZWdzZXRzIi4KKyAgIENvcHlyaWdodCAxOTkzLTE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisvKgkJCU4gIE8gIFQgIEUgIFMKKworVGhpcyBmaWxlIGlzIHVzZWQgYnkgbW9zdCBzeXN0ZW1zIHRoYXQgaW1wbGVtZW50IC9wcm9jLiAgRm9yIHRoZXNlIHN5c3RlbXMsCit0aGUgZ2VuZXJhbCByZWdpc3RlcnMgYXJlIGxhaWQgb3V0IHRoZSBzYW1lIHdheSBpbiBib3RoIHRoZSBjb3JlIGZpbGUgYW5kCit0aGUgZ3JlZ3NldF9wIHN0cnVjdHVyZS4gIFRoZSBjdXJyZW50IGV4Y2VwdGlvbiB0byB0aGlzIGlzIElyaXgtNC4qLCB3aGVyZQordGhlIGdyZWdzZXRfcCBzdHJ1Y3R1cmUgaXMgc3BsaXQgdXAgaW50byB0d28gcGllY2VzIGluIHRoZSBjb3JlIGZpbGUuCisKK1RoZSBnZW5lcmFsIHJlZ2lzdGVyIGFuZCBmbG9hdGluZyBwb2ludCByZWdpc3RlciBzZXRzIGFyZSBtYW5pcHVsYXRlZCBieQorc2VwYXJhdGUgaW9jdGwncy4gIFRoaXMgZmlsZSBtYWtlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IGlmIEZQMF9SRUdOVU0gaXMKK2RlZmluZWQsIHRoZW4gc3VwcG9ydCBmb3IgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHNldCBpcyBkZXNpcmVkLAorcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgYWN0dWFsIHRhcmdldCBoYXMgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUuCisKKyAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorCisjaW5jbHVkZSA8dGltZS5oPgorI2lmZGVmIEhBVkVfU1lTX1BST0NGU19ICisjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKworI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKworc3RhdGljIHZvaWQgZmV0Y2hfY29yZV9yZWdpc3RlcnMgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCwgaW50LCBDT1JFX0FERFIpKTsKKwordm9pZCBfaW5pdGlhbGl6ZV9jb3JlX3JlZ3NldCBQQVJBTVMgKCh2b2lkKSk7CisKKy8qCisKK0dMT0JBTCBGVU5DVElPTgorCisJZmV0Y2hfY29yZV9yZWdpc3RlcnMgLS0gZmV0Y2ggY3VycmVudCByZWdpc3RlcnMgZnJvbSBjb3JlIGZpbGUKKworU1lOT1BTSVMKKworCXZvaWQgZmV0Y2hfY29yZV9yZWdpc3RlcnMgKGNoYXIgKmNvcmVfcmVnX3NlY3QsCisJCQkJCSAgdW5zaWduZWQgY29yZV9yZWdfc2l6ZSwKKwkJCQkJICBpbnQgd2hpY2gsIENPUkVfQUREUiByZWdfYWRkcikKKworREVTQ1JJUFRJT04KKworCVJlYWQgdGhlIHZhbHVlcyBvZiBlaXRoZXIgdGhlIGdlbmVyYWwgcmVnaXN0ZXIgc2V0IChXSElDSCBlcXVhbHMgMCkKKwlvciB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgc2V0IChXSElDSCBlcXVhbHMgMikgZnJvbSB0aGUgY29yZQorCWZpbGUgZGF0YSAocG9pbnRlZCB0byBieSBDT1JFX1JFR19TRUNUKSwgYW5kIHVwZGF0ZSBnZGIncyBpZGVhIG9mCisJdGhlaXIgY3VycmVudCB2YWx1ZXMuICBUaGUgQ09SRV9SRUdfU0laRSBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KKworTk9URVMKKworCVVzZSB0aGUgaW5kaWNhdGVkIHNpemVzIHRvIHZhbGlkYXRlIHRoZSBncmVnc2V0IGFuZCBmcHJlZ3NldAorCXN0cnVjdHVyZXMuCisqLworCitzdGF0aWMgdm9pZAorZmV0Y2hfY29yZV9yZWdpc3RlcnMgKGNvcmVfcmVnX3NlY3QsIGNvcmVfcmVnX3NpemUsIHdoaWNoLCByZWdfYWRkcikKKyAgICAgY2hhciAqY29yZV9yZWdfc2VjdDsKKyAgICAgdW5zaWduZWQgY29yZV9yZWdfc2l6ZTsKKyAgICAgaW50IHdoaWNoOworICAgICBDT1JFX0FERFIgcmVnX2FkZHI7CS8qIFVudXNlZCBpbiB0aGlzIHZlcnNpb24gKi8KK3sKKyNpZiBkZWZpbmVkIChIQVZFX0dSRUdTRVRfVCkgJiYgZGVmaW5lZCAoSEFWRV9GUFJFR1NFVF9UKQorICBncmVnc2V0X3QgZ3JlZ3NldDsKKyAgZnByZWdzZXRfdCBmcHJlZ3NldDsKKworICBpZiAod2hpY2ggPT0gMCkKKyAgICB7CisgICAgICBpZiAoY29yZV9yZWdfc2l6ZSAhPSBzaXplb2YgKGdyZWdzZXQpKQorCXsKKwkgIHdhcm5pbmcgKCJ3cm9uZyBzaXplIGdyZWdzZXQgc3RydWN0IGluIGNvcmUgZmlsZSIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtZW1jcHkgKChjaGFyICopICZncmVnc2V0LCBjb3JlX3JlZ19zZWN0LCBzaXplb2YgKGdyZWdzZXQpKTsKKwkgIHN1cHBseV9ncmVnc2V0ICgmZ3JlZ3NldCk7CisJfQorICAgIH0KKyAgZWxzZSBpZiAod2hpY2ggPT0gMikKKyAgICB7CisgICAgICBpZiAoY29yZV9yZWdfc2l6ZSAhPSBzaXplb2YgKGZwcmVnc2V0KSkKKwl7CisJICB3YXJuaW5nICgid3Jvbmcgc2l6ZSBmcHJlZ3NldCBzdHJ1Y3QgaW4gY29yZSBmaWxlIik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1lbWNweSAoKGNoYXIgKikgJmZwcmVnc2V0LCBjb3JlX3JlZ19zZWN0LCBzaXplb2YgKGZwcmVnc2V0KSk7CisjaWYgZGVmaW5lZCAoRlAwX1JFR05VTSkKKwkgIHN1cHBseV9mcHJlZ3NldCAoJmZwcmVnc2V0KTsKKyNlbmRpZgorCX0KKyAgICB9CisjZW5kaWYJLyogZGVmaW5lZChIQVZFX0dSRUdTRVRfVCkgJiYgZGVmaW5lZCAoSEFWRV9GUFJFR1NFVF9UKSAqLworfQorCisMCisvKiBSZWdpc3RlciB0aGF0IHdlIGFyZSBhYmxlIHRvIGhhbmRsZSBFTEYgZmlsZSBmb3JtYXRzIHVzaW5nIHN0YW5kYXJkCisgICBwcm9jZnMgInJlZ3NldCIgc3RydWN0dXJlcy4gICovCisKK3N0YXRpYyBzdHJ1Y3QgY29yZV9mbnMgcmVnc2V0X2NvcmVfZm5zID0KK3sKKyAgYmZkX3RhcmdldF9lbGZfZmxhdm91ciwKKyAgZmV0Y2hfY29yZV9yZWdpc3RlcnMsCisgIE5VTEwKK307CisKK3ZvaWQKK19pbml0aWFsaXplX2NvcmVfcmVnc2V0ICgpCit7CisgIGFkZF9jb3JlX2ZucyAoJnJlZ3NldF9jb3JlX2Zucyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvY29yZS1zb2wyLmMgYi9nZGIvY29yZS1zb2wyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2OWU2MwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb3JlLXNvbDIuYwpAQCAtMCwwICsxLDEzMyBAQAorLyogTWFjaGluZSBpbmRlcGVuZGVudCBzdXBwb3J0IGZvciBTb2xhcmlzIDIgY29yZSBmaWxlcyBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisvKiBTb2xhcmlzIGNvbWVzIHdpdGggdHdvIGZsYXZvdXJzIG9mIGNvcmUgZmlsZXMsIGNvcmVzIGdlbmVyYXRlZCBieQorICAgYW4gRUxGIGV4ZWN1dGFibGUgYW5kIGNvcmVzIGdlbmVyYXRlZCBieSBwcm9ncmFtcyB0aGF0IHdlcmUKKyAgIHJ1biB1bmRlciBCQ1AgKHRoZSBwYXJ0IG9mIFNvbGFyaXMgd2hpY2ggYWxsb3dzIGl0IHRvIHJ1biBTdW5PUzQKKyAgIGEub3V0IGZpbGVzKS4KKyAgIFRoaXMgZmlsZSBjb21iaW5lcyB0aGUgY29yZSByZWdpc3RlciBmZXRjaGluZyBmcm9tIGNvcmUtcmVnc2V0LmMKKyAgIGFuZCBzcGFyYy1uYXQuYyB0byBiZSBhYmxlIHRvIHJlYWQgYm90aCBmbGF2b3Vycy4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9yZWdzZXQuaD4KKyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKworI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKworc3RhdGljIHZvaWQgZmV0Y2hfY29yZV9yZWdpc3RlcnMgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCwgaW50LCBDT1JFX0FERFIpKTsKKworc3RhdGljIHZvaWQKK2ZldGNoX2NvcmVfcmVnaXN0ZXJzIChjb3JlX3JlZ19zZWN0LCBjb3JlX3JlZ19zaXplLCB3aGljaCwgcmVnX2FkZHIpCisgICAgIGNoYXIgKmNvcmVfcmVnX3NlY3Q7CisgICAgIHVuc2lnbmVkIGNvcmVfcmVnX3NpemU7CisgICAgIGludCB3aGljaDsKKyAgICAgQ09SRV9BRERSIHJlZ19hZGRyOwkvKiBVbnVzZWQgaW4gdGhpcyB2ZXJzaW9uICovCit7CisgIHByZ3JlZ3NldF90IHByZ3JlZ3NldDsKKyAgcHJmcHJlZ3NldF90IHByZnByZWdzZXQ7CisKKyAgaWYgKHdoaWNoID09IDApCisgICAgeworICAgICAgaWYgKGNvcmVfcmVnX3NpemUgPT0gc2l6ZW9mIChwcmdyZWdzZXQpKQorCXsKKwkgIG1lbWNweSAoKGNoYXIgKikgJnByZ3JlZ3NldCwgY29yZV9yZWdfc2VjdCwgc2l6ZW9mIChwcmdyZWdzZXQpKTsKKwkgIHN1cHBseV9ncmVnc2V0ICgmcHJncmVnc2V0KTsKKwl9CisgICAgICBlbHNlIGlmIChjb3JlX3JlZ19zaXplID09IHNpemVvZiAoc3RydWN0IHJlZ3MpKQorCXsKKyNkZWZpbmUgZ3JlZ3MgKChzdHJ1Y3QgcmVncyAqKWNvcmVfcmVnX3NlY3QpCisJICAvKiBHMCAqYWx3YXlzKiBob2xkcyAwLiAgKi8KKwkgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFICgwKV0gPSAwOworCisJICAvKiBUaGUgZ2xvYmFscyBhbmQgb3V0cHV0IHJlZ2lzdGVycy4gICovCisJICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRzFfUkVHTlVNKV0sICZncmVncy0+cl9nMSwgCisJCSAgMTUgKiBSRUdJU1RFUl9SQVdfU0laRSAoRzFfUkVHTlVNKSk7CisJICAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUFNfUkVHTlVNKV0gPSBncmVncy0+cl9wczsKKwkgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQQ19SRUdOVU0pXSA9IGdyZWdzLT5yX3BjOworCSAgKihpbnQgKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKE5QQ19SRUdOVU0pXSA9IGdyZWdzLT5yX25wYzsKKwkgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChZX1JFR05VTSldID0gZ3JlZ3MtPnJfeTsKKworCSAgLyogTXkgYmVzdCBndWVzcyBhdCB3aGVyZSB0byBnZXQgdGhlIGxvY2FscyBhbmQgaW5wdXQKKwkgICAgIHJlZ2lzdGVycyBpcyBleGFjdGx5IHdoZXJlIHRoZXkgdXN1YWxseSBhcmUsIHJpZ2h0IGFib3ZlCisJICAgICB0aGUgc3RhY2sgcG9pbnRlci4gIElmIHRoZSBjb3JlIGR1bXAgd2FzIGNhdXNlZCBieSBhIGJ1cyBlcnJvcgorCSAgICAgZnJvbSBibG93aW5nIGF3YXkgdGhlIHN0YWNrIHBvaW50ZXIgKGFzIGlzIHBvc3NpYmxlKSB0aGVuIHRoaXMKKwkgICAgIHdvbid0IHdvcmssIGJ1dCBpdCdzIHdvcnRoIHRoZSB0cnkuICovCisJICB7CisJICAgIGludCBzcDsKKworCSAgICBzcCA9ICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChTUF9SRUdOVU0pXTsKKwkgICAgaWYgKDAgIT0gdGFyZ2V0X3JlYWRfbWVtb3J5IChzcCwKKwkJCQkJICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoTDBfUkVHTlVNKV0sIAorCQkJCQkgMTYgKiBSRUdJU1RFUl9SQVdfU0laRSAoTDBfUkVHTlVNKSkpCisJICAgICAgeworCQl3YXJuaW5nICgiY291bGRuJ3QgcmVhZCBpbnB1dCBhbmQgbG9jYWwgcmVnaXN0ZXJzIGZyb20gY29yZSBmaWxlXG4iKTsKKwkgICAgICB9CisJICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIHdhcm5pbmcgKCJ3cm9uZyBzaXplIGdyZWdzZXQgc3RydWN0IGluIGNvcmUgZmlsZSIpOworCX0KKyAgICB9CisgIGVsc2UgaWYgKHdoaWNoID09IDIpCisgICAgeworICAgICAgaWYgKGNvcmVfcmVnX3NpemUgPT0gc2l6ZW9mIChwcmZwcmVnc2V0KSkKKwl7CisJICBtZW1jcHkgKChjaGFyICopICZwcmZwcmVnc2V0LCBjb3JlX3JlZ19zZWN0LCBzaXplb2YgKHByZnByZWdzZXQpKTsKKwkgIHN1cHBseV9mcHJlZ3NldCAoJnByZnByZWdzZXQpOworCX0KKyAgICAgIGVsc2UgaWYgKGNvcmVfcmVnX3NpemUgPj0gc2l6ZW9mIChzdHJ1Y3QgZnB1KSkKKwl7CisjZGVmaW5lIGZwdXJlZ3MgICgoc3RydWN0IGZwdSAqKSBjb3JlX3JlZ19zZWN0KQorCSAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pXSwgJmZwdXJlZ3MtPmZwdV9mciwKKwkJICBzaXplb2YgKGZwdXJlZ3MtPmZwdV9mcikpOworCSAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQU19SRUdOVU0pXSwgJmZwdXJlZ3MtPmZwdV9mc3IsCisJCSAgc2l6ZW9mIChGUFVfRlNSX1RZUEUpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgd2FybmluZyAoIndyb25nIHNpemUgZnByZWdzZXQgc3RydWN0IGluIGNvcmUgZmlsZSIpOworCX0KKyAgICB9Cit9CisKKwwKKy8qIFJlZ2lzdGVyIHRoYXQgd2UgYXJlIGFibGUgdG8gaGFuZGxlIHNvbGFyaXMgY29yZSBmaWxlIGZvcm1hdHMuICovCisKK3N0YXRpYyBzdHJ1Y3QgY29yZV9mbnMgc29sYXJpc19jb3JlX2ZucyA9Cit7CisgIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIsCisgIGZldGNoX2NvcmVfcmVnaXN0ZXJzLAorICBOVUxMCit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9jb3JlX3NvbGFyaXMgKCkKK3sKKyAgYWRkX2NvcmVfZm5zICgmc29sYXJpc19jb3JlX2Zucyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvY29yZWZpbGUuYyBiL2dkYi9jb3JlZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTU2ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvY29yZWZpbGUuYwpAQCAtMCwwICsxLDQ3OSBAQAorLyogQ29yZSBkdW1wIGFuZCBleGVjdXRhYmxlIGZpbGUgZnVuY3Rpb25zIGFib3ZlIHRhcmdldCB2ZWN0b3IsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgImZyYW1lLmgiICAvKiByZXF1aXJlZCBieSBpbmZlcmlvci5oICovCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJjb21tYW5kLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImRpcy1hc20uaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1ZGUgImdkYl9zdGF0LmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgIm9iamZpbGVzLmgiCisKK2V4dGVybiBjaGFyIHJlZ2lzdGVyc1tdOworCisvKiBMb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuICAqLworCitzdGF0aWMgdm9pZCBjYWxsX2V4dHJhX2V4ZWNfZmlsZV9ob29rcyBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOworCisvKiBZb3UgY2FuIGhhdmUgYW55IG51bWJlciBvZiBob29rcyBmb3IgYGV4ZWNfZmlsZV9jb21tYW5kJyBjb21tYW5kIHRvIGNhbGwuCisgICBJZiB0aGVyZSdzIG9ubHkgb25lIGhvb2ssIGl0IGlzIHNldCBpbiBleGVjX2ZpbGVfZGlzcGxheSBob29rLgorICAgSWYgdGhlcmUgYXJlIHR3byBvciBtb3JlIGhvb2tzLCB0aGV5IGFyZSBzZXQgaW4gZXhlY19maWxlX2V4dHJhX2hvb2tzW10sCisgICBhbmQgZXhlY19maWxlX2Rpc3BsYXlfaG9vayBpcyBzZXQgdG8gYSBmdW5jdGlvbiB0aGF0IGNhbGxzIGFsbCBvZiB0aGVtLgorICAgVGhpcyBleHRyYSBjb21wbGV4aXR5IGlzIG5lZWRlZCB0byBwcmVzZXJ2ZSBjb21wYXRpYmlsaXR5IHdpdGgKKyAgIG9sZCBjb2RlIHRoYXQgYXNzdW1lZCB0aGF0IG9ubHkgb25lIGhvb2sgY291bGQgYmUgc2V0LCBhbmQgd2hpY2ggY2FsbGVkCisgICBleGVjX2ZpbGVfZGlzcGxheV9ob29rIGRpcmVjdGx5LiAgKi8KKwordHlwZWRlZiB2b2lkICgqaG9va190eXBlKSBQQVJBTVMgKChjaGFyICopKTsKKworaG9va190eXBlIGV4ZWNfZmlsZV9kaXNwbGF5X2hvb2s7CQkvKiB0aGUgb3JpZ2luYWwgaG9vayAqLworc3RhdGljIGhvb2tfdHlwZSAqZXhlY19maWxlX2V4dHJhX2hvb2tzOwkvKiBhcnJheSBvZiBhZGRpdGlvbmFsIGhvb2tzICovCitzdGF0aWMgaW50IGV4ZWNfZmlsZV9ob29rX2NvdW50ID0gMDsJCS8qIHNpemUgb2YgYXJyYXkgKi8KKworLyogQmluYXJ5IGZpbGUgZGlkZGxpbmcgaGFuZGxlIGZvciB0aGUgY29yZSBmaWxlLiAgKi8KKworYmZkICpjb3JlX2JmZCA9IE5VTEw7CisKKwwKKy8qIEJhY2t3YXJkIGNvbXBhdGFiaWxpdHkgd2l0aCBvbGQgd2F5IG9mIHNwZWNpZnlpbmcgY29yZSBmaWxlcy4gICovCisKK3ZvaWQKK2NvcmVfZmlsZV9jb21tYW5kIChmaWxlbmFtZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmZpbGVuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCB0YXJnZXRfb3BzICp0OworCisgIGRvbnRfcmVwZWF0ICgpOwkJCS8qIEVpdGhlciB3YXksIHNlZW1zIGJvZ3VzLiAqLworCisgIHQgPSBmaW5kX2NvcmVfdGFyZ2V0ICgpOworICBpZiAodCAhPSBOVUxMKQorICAgIGlmICghZmlsZW5hbWUpCisgICAgICAodC0+dG9fZGV0YWNoKSAoZmlsZW5hbWUsIGZyb21fdHR5KTsKKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8qIFllcywgd2Ugd2VyZSBnaXZlbiB0aGUgcGF0aCBvZiBhIGNvcmUgZmlsZS4gIERvIHdlIGFscmVhZHkKKyAgICAgICAgICAgaGF2ZSBhIHN5bWJvbCBmaWxlPyAgSWYgbm90LCBjYW4gd2UgZGV0ZXJtaW5lIGl0IGZyb20gdGhlCisgICAgICAgICAgIGNvcmUgZmlsZT8gIElmIHdlIGNhbiwgZG8gc28uCisgICAgICAgICAgICovCisjaWZkZWYgSFBVWEhQUEEKKyAgICAgICAgaWYgKHN5bWZpbGVfb2JqZmlsZSA9PSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgKiAgc3ltZmlsZTsKKyAgICAgICAgICAgIHN5bWZpbGUgPSB0LT50b19jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUgKGZpbGVuYW1lKTsKKyAgICAgICAgICAgIGlmIChzeW1maWxlKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciAqICBzeW1maWxlX2NvcHkgPSBzdHJkdXAgKHN5bWZpbGUpOworCisgICAgICAgICAgICAgICAgbWFrZV9jbGVhbnVwIChmcmVlLCBzeW1maWxlX2NvcHkpOworICAgICAgICAgICAgICAgIHN5bWJvbF9maWxlX2NvbW1hbmQgKHN5bWZpbGVfY29weSwgZnJvbV90dHkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHdhcm5pbmcgKCJVbmtub3duIHN5bWJvbHMgZm9yICclcyc7IHVzZSB0aGUgJ3N5bWJvbC1maWxlJyBjb21tYW5kLiIsIGZpbGVuYW1lKTsKKyAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgKHQtPnRvX29wZW4pIChmaWxlbmFtZSwgZnJvbV90dHkpOworICAgICAgfQorICBlbHNlCisgICAgZXJyb3IgKCJHREIgY2FuJ3QgcmVhZCBjb3JlIGZpbGVzIG9uIHRoaXMgbWFjaGluZS4iKTsKK30KKworDAorLyogSWYgdGhlcmUgYXJlIHR3byBvciBtb3JlIGZ1bmN0aW9ucyB0aGF0IHdpc2ggdG8gaG9vayBpbnRvIGV4ZWNfZmlsZV9jb21tYW5kLAorICogdGhpcyBmdW5jdGlvbiB3aWxsIGNhbGwgYWxsIG9mIHRoZSBob29rIGZ1bmN0aW9ucy4gKi8KKworc3RhdGljIHZvaWQKK2NhbGxfZXh0cmFfZXhlY19maWxlX2hvb2tzIChmaWxlbmFtZSkKKyAgICAgY2hhciAqZmlsZW5hbWU7Cit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBleGVjX2ZpbGVfaG9va19jb3VudDsgaSsrKQorICAgICgqZXhlY19maWxlX2V4dHJhX2hvb2tzW2ldKShmaWxlbmFtZSk7Cit9CisKKy8qIENhbGwgdGhpcyB0byBzcGVjaWZ5IHRoZSBob29rIGZvciBleGVjX2ZpbGVfY29tbWFuZCB0byBjYWxsIGJhY2suCisgICBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSB4LXdpbmRvdyBkaXNwbGF5IGNvZGUuICAqLworCit2b2lkCitzcGVjaWZ5X2V4ZWNfZmlsZV9ob29rIChob29rKQorICAgICB2b2lkICgqaG9vaykgUEFSQU1TICgoY2hhciAqKSk7Cit7CisgIGhvb2tfdHlwZSAqbmV3X2FycmF5OworCisgIGlmIChleGVjX2ZpbGVfZGlzcGxheV9ob29rICE9IE5VTEwpCisgICAgeworICAgICAgLyogVGhlcmUncyBhbHJlYWR5IGEgaG9vayBpbnN0YWxsZWQuICBBcnJhbmdlIHRvIGhhdmUgYm90aCBpdAorICAgICAgICogYW5kIHRoZSBzdWJzZXF1ZW50IGhvb2tzIGNhbGxlZC4gKi8KKyAgICAgIGlmIChleGVjX2ZpbGVfaG9va19jb3VudCA9PSAwKQorCXsKKwkgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IGV4dHJhIGhvb2ssIGluaXRpYWxpemUgdGhlIGhvb2sgYXJyYXkuICovCisJICBleGVjX2ZpbGVfZXh0cmFfaG9va3MgPSAoaG9va190eXBlICopIHhtYWxsb2MgKHNpemVvZihob29rX3R5cGUpKTsKKwkgIGV4ZWNfZmlsZV9leHRyYV9ob29rc1swXSA9IGV4ZWNfZmlsZV9kaXNwbGF5X2hvb2s7CisJICBleGVjX2ZpbGVfZGlzcGxheV9ob29rID0gY2FsbF9leHRyYV9leGVjX2ZpbGVfaG9va3M7CisJICBleGVjX2ZpbGVfaG9va19jb3VudCA9IDE7CisJfQorCisgICAgICAvKiBHcm93IHRoZSBob29rIGFycmF5IGJ5IG9uZSBhbmQgYWRkIHRoZSBuZXcgaG9vayB0byB0aGUgZW5kLgorICAgICAgICAgWWVzLCBpdCdzIGluZWZmaWNpZW50IHRvIGdyb3cgaXQgYnkgb25lIGVhY2ggdGltZSBidXQgc2luY2UKKyAgICAgICAgIHRoaXMgaXMgaGFyZGx5IGV2ZXIgY2FsbGVkIGl0J3Mgbm90IGEgYmlnIGRlYWwuICAqLworICAgICAgZXhlY19maWxlX2hvb2tfY291bnQrKzsKKyAgICAgIG5ld19hcnJheSA9CisJKGhvb2tfdHlwZSAqKSB4cmVhbGxvYyAoZXhlY19maWxlX2V4dHJhX2hvb2tzLAorCQkJCWV4ZWNfZmlsZV9ob29rX2NvdW50ICogc2l6ZW9mKGhvb2tfdHlwZSkpOworICAgICAgZXhlY19maWxlX2V4dHJhX2hvb2tzID0gbmV3X2FycmF5OworICAgICAgZXhlY19maWxlX2V4dHJhX2hvb2tzW2V4ZWNfZmlsZV9ob29rX2NvdW50IC0gMV0gPSBob29rOworICAgIH0KKyAgZWxzZQorICAgIGV4ZWNfZmlsZV9kaXNwbGF5X2hvb2sgPSBob29rOworfQorCisvKiBUaGUgZXhlYyBmaWxlIG11c3QgYmUgY2xvc2VkIGJlZm9yZSBydW5uaW5nIGFuIGluZmVyaW9yLgorICAgSWYgaXQgaXMgbmVlZGVkIGFnYWluIGFmdGVyIHRoZSBpbmZlcmlvciBkaWVzLCBpdCBtdXN0CisgICBiZSByZW9wZW5lZC4gICovCisKK3ZvaWQKK2Nsb3NlX2V4ZWNfZmlsZSAoKQoreworI2lmIDAgLyogRklYTUUgKi8KKyAgaWYgKGV4ZWNfYmZkKQorICAgIGJmZF90ZW1wY2xvc2UgKGV4ZWNfYmZkKTsKKyNlbmRpZgorfQorCit2b2lkCityZW9wZW5fZXhlY19maWxlICgpCit7CisjaWYgMCAvKiBGSVhNRSAqLworICBpZiAoZXhlY19iZmQpCisgICAgYmZkX3Jlb3BlbiAoZXhlY19iZmQpOworI2Vsc2UKKyAgY2hhciAqZmlsZW5hbWU7CisgIGludCByZXM7CisgIHN0cnVjdCBzdGF0IHN0OworICBsb25nIG10aW1lOworCisgIC8qIERvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBjdXJyZW50IHRhcmdldCBpc24ndCBleGVjLiAqLworICBpZiAoZXhlY19iZmQgPT0gTlVMTCB8fCBzdHJjbXAgKHRhcmdldF9zaG9ydG5hbWUsICJleGVjIikgIT0gMCkKKyAgICByZXR1cm47CisgCisgIC8qIElmIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGV4ZWMgZmlsZSBoYXMgY2hhbmdlZCwgcmVvcGVuIGl0LiAqLworICBmaWxlbmFtZSA9IHN0cmR1cCAoYmZkX2dldF9maWxlbmFtZSAoZXhlY19iZmQpKTsKKyAgbWFrZV9jbGVhbnVwIChmcmVlLCBmaWxlbmFtZSk7CisgIG10aW1lID0gYmZkX2dldF9tdGltZShleGVjX2JmZCk7CisgIHJlcyA9IHN0YXQgKGZpbGVuYW1lLCAmc3QpOworCisgIGlmIChtdGltZSAmJiBtdGltZSAhPSBzdC5zdF9tdGltZSkKKyAgICBleGVjX2ZpbGVfY29tbWFuZCAoZmlsZW5hbWUsIDApOworI2VuZGlmCit9CisMCisvKiBJZiB3ZSBoYXZlIGJvdGggYSBjb3JlIGZpbGUgYW5kIGFuIGV4ZWMgZmlsZSwKKyAgIHByaW50IGEgd2FybmluZyBpZiB0aGV5IGRvbid0IGdvIHRvZ2V0aGVyLiAgKi8KKwordm9pZAordmFsaWRhdGVfZmlsZXMgKCkKK3sKKyAgaWYgKGV4ZWNfYmZkICYmIGNvcmVfYmZkKQorICAgIHsKKyAgICAgIGlmICghY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpKQorCXdhcm5pbmcgKCJjb3JlIGZpbGUgbWF5IG5vdCBtYXRjaCBzcGVjaWZpZWQgZXhlY3V0YWJsZSBmaWxlLiIpOworICAgICAgZWxzZSBpZiAoYmZkX2dldF9tdGltZShleGVjX2JmZCkgPiBiZmRfZ2V0X210aW1lKGNvcmVfYmZkKSkKKwl3YXJuaW5nICgiZXhlYyBmaWxlIGlzIG5ld2VyIHRoYW4gY29yZSBmaWxlLiIpOworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIGZpbGUgYXMgYSBzdHJpbmcuCisgICBFUlIgbm9uemVybyBtZWFucyBnZXQgZXJyb3IgaWYgdGhlcmUgaXMgbm9uZSBzcGVjaWZpZWQ7CisgICBvdGhlcndpc2UgcmV0dXJuIDAgaW4gdGhhdCBjYXNlLiAgKi8KKworY2hhciAqCitnZXRfZXhlY19maWxlIChlcnIpCisgICAgIGludCBlcnI7Cit7CisgIGlmIChleGVjX2JmZCkgcmV0dXJuIGJmZF9nZXRfZmlsZW5hbWUoZXhlY19iZmQpOworICBpZiAoIWVycikgICAgIHJldHVybiBOVUxMOworCisgIGVycm9yICgiTm8gZXhlY3V0YWJsZSBmaWxlIHNwZWNpZmllZC5cblwKK1VzZSB0aGUgXCJmaWxlXCIgb3IgXCJleGVjLWZpbGVcIiBjb21tYW5kLiIpOworICByZXR1cm4gTlVMTDsKK30KKworDAorLyogUmVwb3J0IGEgbWVtb3J5IGVycm9yIHdpdGggZXJyb3IoKS4gICovCisKK3ZvaWQKK21lbW9yeV9lcnJvciAoc3RhdHVzLCBtZW1hZGRyKQorICAgICBpbnQgc3RhdHVzOworICAgICBDT1JFX0FERFIgbWVtYWRkcjsKK3sKKyAgaWYgKHN0YXR1cyA9PSBFSU8pCisgICAgeworICAgICAgLyogQWN0dWFsbHksIGFkZHJlc3MgYmV0d2VlbiBtZW1hZGRyIGFuZCBtZW1hZGRyICsgbGVuCisJIHdhcyBvdXQgb2YgYm91bmRzLiAqLworICAgICAgZXJyb3JfYmVnaW4gKCk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJDYW5ub3QgYWNjZXNzIG1lbW9yeSBhdCBhZGRyZXNzICIpOworICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChtZW1hZGRyLCAxLCBnZGJfc3Rkb3V0KTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIi5cbiIpOworICAgICAgcmV0dXJuX3RvX3RvcF9sZXZlbCAoUkVUVVJOX0VSUk9SKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBlcnJvcl9iZWdpbiAoKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkVycm9yIGFjY2Vzc2luZyBtZW1vcnkgYWRkcmVzcyAiKTsKKyAgICAgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAobWVtYWRkciwgMSwgZ2RiX3N0ZG91dCk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCI6ICVzLlxuIiwKKwkJCSBzYWZlX3N0cmVycm9yIChzdGF0dXMpKTsKKyAgICAgIHJldHVybl90b190b3BfbGV2ZWwgKFJFVFVSTl9FUlJPUik7CisgICAgfQorfQorCisvKiBTYW1lIGFzIHRhcmdldF9yZWFkX21lbW9yeSwgYnV0IHJlcG9ydCBhbiBlcnJvciBpZiBjYW4ndCByZWFkLiAgKi8KK3ZvaWQKK3JlYWRfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaW50IHN0YXR1czsKKyAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbik7CisgIGlmIChzdGF0dXMgIT0gMCkKKyAgICBtZW1vcnlfZXJyb3IgKHN0YXR1cywgbWVtYWRkcik7Cit9CisKK3ZvaWQKK3JlYWRfbWVtb3J5X3NlY3Rpb24gKG1lbWFkZHIsIG15YWRkciwgbGVuLCBiZmRfc2VjdGlvbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgYXNlY3Rpb24gKmJmZF9zZWN0aW9uOworeworICBpbnQgc3RhdHVzOworICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnlfc2VjdGlvbiAobWVtYWRkciwgbXlhZGRyLCBsZW4sIGJmZF9zZWN0aW9uKTsKKyAgaWYgKHN0YXR1cyAhPSAwKQorICAgIG1lbW9yeV9lcnJvciAoc3RhdHVzLCBtZW1hZGRyKTsKK30KKworLyogTGlrZSB0YXJnZXRfcmVhZF9tZW1vcnksIGJ1dCBzbGlnaHRseSBkaWZmZXJlbnQgcGFyYW1ldGVycy4gICovCisKK2ludAorZGlzX2FzbV9yZWFkX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4sIGluZm8pCisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgYmZkX2J5dGUgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgcmV0dXJuIHRhcmdldF9yZWFkX21lbW9yeSAobWVtYWRkciwgKGNoYXIgKikgbXlhZGRyLCBsZW4pOworfQorCisvKiBMaWtlIG1lbW9yeV9lcnJvciB3aXRoIHNsaWdodGx5IGRpZmZlcmVudCBwYXJhbWV0ZXJzLiAgKi8KK3ZvaWQKK2Rpc19hc21fbWVtb3J5X2Vycm9yIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pCisgICAgIGludCBzdGF0dXM7CisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKK3sKKyAgbWVtb3J5X2Vycm9yIChzdGF0dXMsIG1lbWFkZHIpOworfQorCisvKiBMaWtlIHByaW50X2FkZHJlc3Mgd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgcGFyYW1ldGVycy4gICovCit2b2lkCitkaXNfYXNtX3ByaW50X2FkZHJlc3MgKGFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgYWRkcjsKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIHByaW50X2FkZHJlc3MgKGFkZHIsIGluZm8tPnN0cmVhbSk7Cit9CisKKy8qIFNhbWUgYXMgdGFyZ2V0X3dyaXRlX21lbW9yeSwgYnV0IHJlcG9ydCBhbiBlcnJvciBpZiBjYW4ndCB3cml0ZS4gICovCit2b2lkCit3cml0ZV9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICBpbnQgc3RhdHVzOworCisgIHN0YXR1cyA9IHRhcmdldF93cml0ZV9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKTsKKyAgaWYgKHN0YXR1cyAhPSAwKQorICAgIG1lbW9yeV9lcnJvciAoc3RhdHVzLCBtZW1hZGRyKTsKK30KKworLyogUmVhZCBhbiBpbnRlZ2VyIGZyb20gZGVidWdnZWQgbWVtb3J5LCBnaXZlbiBhZGRyZXNzIGFuZCBudW1iZXIgb2YgYnl0ZXMuICAqLworCitMT05HRVNUCityZWFkX21lbW9yeV9pbnRlZ2VyIChtZW1hZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBpbnQgbGVuOworeworICBjaGFyIGJ1ZltzaXplb2YgKExPTkdFU1QpXTsKKworICByZWFkX21lbW9yeSAobWVtYWRkciwgYnVmLCBsZW4pOworICByZXR1cm4gZXh0cmFjdF9zaWduZWRfaW50ZWdlciAoYnVmLCBsZW4pOworfQorCitVTE9OR0VTVAorcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAobWVtYWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgY2hhciBidWZbc2l6ZW9mIChVTE9OR0VTVCldOworCisgIHJlYWRfbWVtb3J5IChtZW1hZGRyLCBidWYsIGxlbik7CisgIHJldHVybiBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgbGVuKTsKK30KKwordm9pZAorcmVhZF9tZW1vcnlfc3RyaW5nIChtZW1hZGRyLCBidWZmZXIsIG1heF9sZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICogYnVmZmVyOworICAgICBpbnQgbWF4X2xlbjsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqIGNwOworICByZWdpc3RlciBpbnQgaTsKKyAgaW50IGNudDsKKworICBjcCA9IGJ1ZmZlcjsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaWYgKGNwIC0gYnVmZmVyID49IG1heF9sZW4pCisgICAgICAgIHsKKyAgICAgICAgICBidWZmZXJbbWF4X2xlbiAtIDFdID0gJ1wwJzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgY250ID0gbWF4X2xlbiAtIChjcCAtIGJ1ZmZlcik7CisgICAgICBpZiAoY250ID4gOCkKKwljbnQgPSA4OworICAgICAgcmVhZF9tZW1vcnkgKG1lbWFkZHIgKyAoaW50KSAoY3AgLSBidWZmZXIpLCBjcCwgY250KTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjbnQgJiYgKmNwOyBpKyssIGNwKyspCisgICAgICAgIDsgLyogbnVsbCBib2R5ICovCisKKyAgICAgIGlmIChpIDwgY250ICYmICEqY3ApCisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworDAorI2lmIDAKKy8qIEVuYWJsZSBhZnRlciA0LjEyLiAgSXQgaXMgbm90IHRlc3RlZC4gICovCisKKy8qIFNlYXJjaCBjb2RlLiAgVGFyZ2V0cyBjYW4ganVzdCBtYWtlIHRoaXMgdGhlaXIgc2VhcmNoIGZ1bmN0aW9uLCBvcgorICAgaWYgdGhlIHByb3RvY29sIGhhcyBhIGxlc3MgZ2VuZXJhbCBzZWFyY2ggZnVuY3Rpb24sIHRoZXkgY2FuIGNhbGwgdGhpcworICAgaW4gdGhlIGNhc2VzIGl0IGNhbid0IGhhbmRsZS4gICovCit2b2lkCitnZW5lcmljX3NlYXJjaCAobGVuLCBkYXRhLCBtYXNrLCBzdGFydGFkZHIsIGluY3JlbWVudCwgbG9yYW5nZSwgaGlyYW5nZQorCQlhZGRyX2ZvdW5kLCBkYXRhX2ZvdW5kKQorICAgICBpbnQgbGVuOworICAgICBjaGFyICpkYXRhOworICAgICBjaGFyICptYXNrOworICAgICBDT1JFX0FERFIgc3RhcnRhZGRyOworICAgICBpbnQgaW5jcmVtZW50OworICAgICBDT1JFX0FERFIgbG9yYW5nZTsKKyAgICAgQ09SRV9BRERSIGhpcmFuZ2U7CisgICAgIENPUkVfQUREUiAqYWRkcl9mb3VuZDsKKyAgICAgY2hhciAqZGF0YV9mb3VuZDsKK3sKKyAgaW50IGk7CisgIENPUkVfQUREUiBjdXJhZGRyID0gc3RhcnRhZGRyOworCisgIHdoaWxlIChjdXJhZGRyID49IGxvcmFuZ2UgJiYgY3VyYWRkciA8IGhpcmFuZ2UpCisgICAgeworICAgICAgcmVhZF9tZW1vcnkgKGN1cmFkZHIsIGRhdGFfZm91bmQsIGxlbik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisJaWYgKChkYXRhX2ZvdW5kW2ldICYgbWFza1tpXSkgIT0gZGF0YVtpXSkKKwkgIGdvdG8gdHJ5X2FnYWluOworICAgICAgLyogSXQgbWF0Y2hlcy4gICovCisgICAgICAqYWRkcl9mb3VuZCA9IGN1cmFkZHI7CisgICAgICByZXR1cm47CisKKyAgICB0cnlfYWdhaW46CisgICAgICBjdXJhZGRyICs9IGluY3JlbWVudDsKKyAgICB9CisgICphZGRyX2ZvdW5kID0gKENPUkVfQUREUikwOworICByZXR1cm47Cit9CisjZW5kaWYgLyogMCAqLworDAorLyogVGhlIGN1cnJlbnQgZGVmYXVsdCBiZmQgdGFyZ2V0LiAgUG9pbnRzIHRvIHN0b3JhZ2UgYWxsb2NhdGVkIGZvcgorICAgZ251dGFyZ2V0X3N0cmluZy4gICovCitjaGFyICpnbnV0YXJnZXQ7CisKKy8qIFNhbWUgdGhpbmcsIGV4Y2VwdCBpdCBpcyAiYXV0byIgbm90IE5VTEwgZm9yIHRoZSBkZWZhdWx0IGNhc2UuICAqLworc3RhdGljIGNoYXIgKmdudXRhcmdldF9zdHJpbmc7CisKK3N0YXRpYyB2b2lkIHNldF9nbnV0YXJnZXRfY29tbWFuZAorICBQQVJBTVMgKChjaGFyICosIGludCwgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKikpOworCitzdGF0aWMgdm9pZAorc2V0X2dudXRhcmdldF9jb21tYW5kIChpZ25vcmUsIGZyb21fdHR5LCBjKQorICAgICBjaGFyICppZ25vcmU7CisgICAgIGludCBmcm9tX3R0eTsKKyAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7Cit7CisgIGlmIChTVFJFUSAoZ251dGFyZ2V0X3N0cmluZywgImF1dG8iKSkKKyAgICBnbnV0YXJnZXQgPSBOVUxMOworICBlbHNlCisgICAgZ251dGFyZ2V0ID0gZ251dGFyZ2V0X3N0cmluZzsKK30KKworLyogU2V0IHRoZSBnbnV0YXJnZXQuICAqLwordm9pZAorc2V0X2dudXRhcmdldCAobmV3dGFyZ2V0KQorICAgICBjaGFyICpuZXd0YXJnZXQ7Cit7CisgIGlmIChnbnV0YXJnZXRfc3RyaW5nICE9IE5VTEwpCisgICAgZnJlZSAoZ251dGFyZ2V0X3N0cmluZyk7CisgIGdudXRhcmdldF9zdHJpbmcgPSBzYXZlc3RyaW5nIChuZXd0YXJnZXQsIHN0cmxlbiAobmV3dGFyZ2V0KSk7CisgIHNldF9nbnV0YXJnZXRfY29tbWFuZCAoTlVMTCwgMCwgTlVMTCk7Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX2NvcmUoKQoreworICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqYzsKKyAgYyA9IGFkZF9jbWQgKCJjb3JlLWZpbGUiLCBjbGFzc19maWxlcywgY29yZV9maWxlX2NvbW1hbmQsCisJICAgICAgICJVc2UgRklMRSBhcyBjb3JlIGR1bXAgZm9yIGV4YW1pbmluZyBtZW1vcnkgYW5kIHJlZ2lzdGVycy5cblwKK05vIGFyZyBtZWFucyBoYXZlIG5vIGNvcmUgZmlsZS4gIFRoaXMgY29tbWFuZCBoYXMgYmVlbiBzdXBlcnNlZGVkIGJ5IHRoZVxuXAorYHRhcmdldCBjb3JlJyBhbmQgYGRldGFjaCcgY29tbWFuZHMuIiwgJmNtZGxpc3QpOworICBjLT5jb21wbGV0ZXIgPSBmaWxlbmFtZV9jb21wbGV0ZXI7CisKKyAgYyA9IGFkZF9zZXRfY21kICgiZ251dGFyZ2V0IiwgY2xhc3NfZmlsZXMsIHZhcl9zdHJpbmdfbm9lc2NhcGUsCisJCSAgKGNoYXIgKikgJmdudXRhcmdldF9zdHJpbmcsCisJCSAgIlNldCB0aGUgY3VycmVudCBCRkQgdGFyZ2V0LlxuXAorVXNlIGBzZXQgZ251dGFyZ2V0IGF1dG8nIHRvIHNwZWNpZnkgYXV0b21hdGljIGRldGVjdGlvbi4iLAorCQkgICZzZXRsaXN0KTsKKyAgYy0+ZnVuY3Rpb24uc2Z1bmMgPSBzZXRfZ251dGFyZ2V0X2NvbW1hbmQ7CisgIGFkZF9zaG93X2Zyb21fc2V0IChjLCAmc2hvd2xpc3QpOworCisgIGlmIChnZXRlbnYgKCJHTlVUQVJHRVQiKSkKKyAgICBzZXRfZ251dGFyZ2V0IChnZXRlbnYgKCJHTlVUQVJHRVQiKSk7CisgIGVsc2UKKyAgICBzZXRfZ251dGFyZ2V0ICgiYXV0byIpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2NvcmVsb3cuYyBiL2dkYi9jb3JlbG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzNTI1NwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jb3JlbG93LmMKQEAgLTAsMCArMSw1MTEgQEAKKy8qIENvcmUgZHVtcCBhbmQgZXhlY3V0YWJsZSBmaWxlIGZ1bmN0aW9ucyBiZWxvdyB0YXJnZXQgdmVjdG9yLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5ODYsIDg3LCA4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJmcmFtZS5oIiAgLyogcmVxdWlyZWQgYnkgaW5mZXJpb3IuaCAqLworI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJnZGJ0aHJlYWQuaCIKKworLyogTGlzdCBvZiBhbGwgYXZhaWxhYmxlIGNvcmVfZm5zLiAgT24gZ2RiIHN0YXJ0dXAsIGVhY2ggY29yZSBmaWxlIHJlZ2lzdGVyCisgICByZWFkZXIgY2FsbHMgYWRkX2NvcmVfZm5zKCkgdG8gcmVnaXN0ZXIgaW5mb3JtYXRpb24gb24gZWFjaCBjb3JlIGZvcm1hdCBpdAorICAgaXMgcHJlcGFyZWQgdG8gcmVhZC4gKi8KKworc3RhdGljIHN0cnVjdCBjb3JlX2ZucyAqY29yZV9maWxlX2ZucyA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIGNvcmVfZmlsZXNfaW5mbyBQQVJBTVMgKChzdHJ1Y3QgdGFyZ2V0X29wcyAqKSk7CisKKyNpZmRlZiBTT0xJQl9BREQKK3N0YXRpYyBpbnQgc29saWJfYWRkX3N0dWIgUEFSQU1TICgoUFRSKSk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgY29yZV9vcGVuIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGNvcmVfZGV0YWNoIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGNvcmVfY2xvc2UgUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyB2b2lkIGdldF9jb3JlX3JlZ2lzdGVycyBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIHZvaWQgYWRkX3RvX3RocmVhZF9saXN0IFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKKworc3RhdGljIGludCBpZ25vcmUgUEFSQU1TICgoQ09SRV9BRERSLCBjaGFyICopKTsKKworc3RhdGljIGNoYXIgKmNvcmVfZmlsZV90b19zeW1fZmlsZSBQQVJBTVMgKChjaGFyICopKTsKKworc3RhdGljIGludCBjb3JlX2ZpbGVfdGhyZWFkX2FsaXZlIFBBUkFNUyAoKGludCB0aWQpKTsKKworc3RhdGljIHZvaWQgaW5pdF9jb3JlX29wcyBQQVJBTVMgKCh2b2lkKSk7CisKK3ZvaWQgX2luaXRpYWxpemVfY29yZWxvdyBQQVJBTVMgKCh2b2lkKSk7CisKK3N0cnVjdCB0YXJnZXRfb3BzIGNvcmVfb3BzOworCisvKiBMaW5rIGEgbmV3IGNvcmVfZm5zIGludG8gdGhlIGdsb2JhbCBjb3JlX2ZpbGVfZm5zIGxpc3QuICBDYWxsZWQgb24gZ2RiCisgICBzdGFydHVwIGJ5IHRoZSBfaW5pdGlhbGl6ZSByb3V0aW5lIGluIGVhY2ggY29yZSBmaWxlIHJlZ2lzdGVyIHJlYWRlciwgdG8KKyAgIHJlZ2lzdGVyIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggZm9ybWF0IHRoZSB0aGUgcmVhZGVyIGlzIHByZXBhcmVkIHRvCisgICBoYW5kbGUuICovCisKK3ZvaWQKK2FkZF9jb3JlX2ZucyAoY2YpCisgICAgIHN0cnVjdCBjb3JlX2ZucyAqY2Y7Cit7CisgIGNmIC0+IG5leHQgPSBjb3JlX2ZpbGVfZm5zOworICBjb3JlX2ZpbGVfZm5zID0gY2Y7Cit9CisKKworLyogRGlzY2FyZCBhbGwgdmVzdGlnZXMgb2YgYW55IHByZXZpb3VzIGNvcmUgZmlsZSBhbmQgbWFyayBkYXRhIGFuZCBzdGFjaworICAgc3BhY2VzIGFzIGVtcHR5LiAgKi8KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitjb3JlX2Nsb3NlIChxdWl0dGluZykKKyAgICAgaW50IHF1aXR0aW5nOworeworICBjaGFyICpuYW1lOworCisgIGlmIChjb3JlX2JmZCkKKyAgICB7CisgICAgICBpbmZlcmlvcl9waWQgPSAwOwkJLyogQXZvaWQgY29uZnVzaW9uIGZyb20gdGhyZWFkIHN0dWZmICovCisKKyAgICAgIG5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChjb3JlX2JmZCk7CisgICAgICBpZiAoIWJmZF9jbG9zZSAoY29yZV9iZmQpKQorCXdhcm5pbmcgKCJjYW5ub3QgY2xvc2UgXCIlc1wiOiAlcyIsCisJCSBuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgICBmcmVlIChuYW1lKTsKKyAgICAgIGNvcmVfYmZkID0gTlVMTDsKKyNpZmRlZiBDTEVBUl9TT0xJQgorICAgICAgQ0xFQVJfU09MSUIgKCk7CisjZW5kaWYKKyAgICAgIGlmIChjb3JlX29wcy50b19zZWN0aW9ucykKKwl7CisJICBmcmVlICgoUFRSKWNvcmVfb3BzLnRvX3NlY3Rpb25zKTsKKwkgIGNvcmVfb3BzLnRvX3NlY3Rpb25zID0gTlVMTDsKKwkgIGNvcmVfb3BzLnRvX3NlY3Rpb25zX2VuZCA9IE5VTEw7CisJfQorICAgIH0KK30KKworI2lmZGVmIFNPTElCX0FERAorLyogU3R1YiBmdW5jdGlvbiBmb3IgY2F0Y2hfZXJyb3JzIGFyb3VuZCBzaGFyZWQgbGlicmFyeSBoYWNraW5nLiAgRlJPTV9UVFlQCisgICBpcyByZWFsbHkgYW4gaW50ICogd2hpY2ggcG9pbnRzIHRvIGZyb21fdHR5LiAgKi8KKworc3RhdGljIGludCAKK3NvbGliX2FkZF9zdHViIChmcm9tX3R0eXApCisgICAgIFBUUiBmcm9tX3R0eXA7Cit7CisgIFNPTElCX0FERCAoTlVMTCwgKihpbnQgKilmcm9tX3R0eXAsICZjdXJyZW50X3RhcmdldCk7CisgIHJlX2VuYWJsZV9icmVha3BvaW50c19pbl9zaGxpYnMgKCk7CisgIHJldHVybiAwOworfQorI2VuZGlmIC8qIFNPTElCX0FERCAqLworCisvKiBMb29rIGZvciBzZWN0aW9ucyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoIGAucmVnLycgc28gdGhhdCB3ZSBjYW4gZXh0cmFjdCB0aGUKKyAgIGxpc3Qgb2YgdGhyZWFkcyBpbiBhIGNvcmUgZmlsZS4gICovCisKK3N0YXRpYyB2b2lkCithZGRfdG9fdGhyZWFkX2xpc3QgKGFiZmQsIGFzZWN0LCByZWdfc2VjdF9hcmcpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKmFzZWN0OworICAgICBQVFIgcmVnX3NlY3RfYXJnOworeworICBpbnQgdGhyZWFkX2lkOworICBhc2VjdGlvbiAqcmVnX3NlY3QgPSAoYXNlY3Rpb24gKikgcmVnX3NlY3RfYXJnOworCisgIGlmIChzdHJuY21wIChiZmRfc2VjdGlvbl9uYW1lIChhYmZkLCBhc2VjdCksICIucmVnLyIsIDUpICE9IDApCisgICAgcmV0dXJuOworCisgIHRocmVhZF9pZCA9IGF0b2kgKGJmZF9zZWN0aW9uX25hbWUgKGFiZmQsIGFzZWN0KSArIDUpOworCisgIGFkZF90aHJlYWQgKHRocmVhZF9pZCk7CisKKy8qIFdhcm5pbmcsIFdpbGwgUm9iaW5zb24sIGxvb2tpbmcgYXQgQkZEIHByaXZhdGUgZGF0YSEgKi8KKworICBpZiAocmVnX3NlY3QgIT0gTlVMTAorICAgICAgJiYgYXNlY3QtPmZpbGVwb3MgPT0gcmVnX3NlY3QtPmZpbGVwb3MpIC8qIERpZCB3ZSBmaW5kIC5yZWc/ICovCisgICAgaW5mZXJpb3JfcGlkID0gdGhyZWFkX2lkOwkvKiBZZXMsIG1ha2UgaXQgY3VycmVudCAqLworfQorCisvKiBUaGlzIHJvdXRpbmUgb3BlbnMgYW5kIHNldHMgdXAgdGhlIGNvcmUgZmlsZSBiZmQuICAqLworCitzdGF0aWMgdm9pZAorY29yZV9vcGVuIChmaWxlbmFtZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmZpbGVuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNvbnN0IGNoYXIgKnA7CisgIGludCBzaWdneTsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKyAgY2hhciAqdGVtcDsKKyAgYmZkICp0ZW1wX2JmZDsKKyAgaW50IG9udG9wOworICBpbnQgc2NyYXRjaF9jaGFuOworCisgIHRhcmdldF9wcmVvcGVuIChmcm9tX3R0eSk7CisgIGlmICghZmlsZW5hbWUpCisgICAgeworICAgICAgZXJyb3IgKGNvcmVfYmZkID8gCisgICAgICAgIk5vIGNvcmUgZmlsZSBzcGVjaWZpZWQuICAoVXNlIGBkZXRhY2gnIHRvIHN0b3AgZGVidWdnaW5nIGEgY29yZSBmaWxlLikiCisgICAgIDogIk5vIGNvcmUgZmlsZSBzcGVjaWZpZWQuIik7CisgICAgfQorCisgIGZpbGVuYW1lID0gdGlsZGVfZXhwYW5kIChmaWxlbmFtZSk7CisgIGlmIChmaWxlbmFtZVswXSAhPSAnLycpCisgICAgeworICAgICAgdGVtcCA9IGNvbmNhdCAoY3VycmVudF9kaXJlY3RvcnksICIvIiwgZmlsZW5hbWUsIE5VTEwpOworICAgICAgZnJlZSAoZmlsZW5hbWUpOworICAgICAgZmlsZW5hbWUgPSB0ZW1wOworICAgIH0KKworICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKGZyZWUsIGZpbGVuYW1lKTsKKworICBzY3JhdGNoX2NoYW4gPSBvcGVuIChmaWxlbmFtZSwgd3JpdGVfZmlsZXMgPyBPX1JEV1IgOiBPX1JET05MWSwgMCk7CisgIGlmIChzY3JhdGNoX2NoYW4gPCAwKQorICAgIHBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKKworICB0ZW1wX2JmZCA9IGJmZF9mZG9wZW5yIChmaWxlbmFtZSwgZ251dGFyZ2V0LCBzY3JhdGNoX2NoYW4pOworICBpZiAodGVtcF9iZmQgPT0gTlVMTCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lIChmaWxlbmFtZSk7CisKKyAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0ICh0ZW1wX2JmZCwgYmZkX2NvcmUpKQorICAgIHsKKyAgICAgIC8qIERvIGl0IGFmdGVyIHRoZSBlcnIgbXNnICovCisgICAgICAvKiBGSVhNRTogc2hvdWxkIGJlIGNoZWNraW5nIGZvciBlcnJvcnMgZnJvbSBiZmRfY2xvc2UgKGZvciBvbmUgdGhpbmcsCisJIG9uIGVycm9yIGl0IGRvZXMgbm90IGZyZWUgYWxsIHRoZSBzdG9yYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUKKwkgYmZkKS4gICovCisgICAgICBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgYmZkX2Nsb3NlLCB0ZW1wX2JmZCk7CisgICAgICBlcnJvciAoIlwiJXNcIiBpcyBub3QgYSBjb3JlIGR1bXA6ICVzIiwKKwkgICAgIGZpbGVuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgfQorCisgIC8qIExvb2tzIHNlbWktcmVhc29uYWJsZS4gIFRvc3MgdGhlIG9sZCBjb3JlIGZpbGUgYW5kIHdvcmsgb24gdGhlIG5ldy4gICovCisKKyAgZGlzY2FyZF9jbGVhbnVwcyAob2xkX2NoYWluKTsJCS8qIERvbid0IGZyZWUgZmlsZW5hbWUgYW55IG1vcmUgKi8KKyAgdW5wdXNoX3RhcmdldCAoJmNvcmVfb3BzKTsKKyAgY29yZV9iZmQgPSB0ZW1wX2JmZDsKKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGNvcmVfY2xvc2UsIGNvcmVfYmZkKTsKKworICB2YWxpZGF0ZV9maWxlcyAoKTsKKworICAvKiBGaW5kIHRoZSBkYXRhIHNlY3Rpb24gKi8KKyAgaWYgKGJ1aWxkX3NlY3Rpb25fdGFibGUgKGNvcmVfYmZkLCAmY29yZV9vcHMudG9fc2VjdGlvbnMsCisJCQkgICAmY29yZV9vcHMudG9fc2VjdGlvbnNfZW5kKSkKKyAgICBlcnJvciAoIlwiJXNcIjogQ2FuJ3QgZmluZCBzZWN0aW9uczogJXMiLAorCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGNvcmVfYmZkKSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCisgIG9udG9wID0gIXB1c2hfdGFyZ2V0ICgmY29yZV9vcHMpOworICBkaXNjYXJkX2NsZWFudXBzIChvbGRfY2hhaW4pOworCisgIHAgPSBiZmRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoY29yZV9iZmQpOworICBpZiAocCkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJDb3JlIHdhcyBnZW5lcmF0ZWQgYnkgYCVzJy5cbiIsIHApOworCisgIHNpZ2d5ID0gYmZkX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoY29yZV9iZmQpOworICBpZiAoc2lnZ3kgPiAwKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlByb2dyYW0gdGVybWluYXRlZCB3aXRoIHNpZ25hbCAlZCwgJXMuXG4iLCBzaWdneSwKKwkJICAgICBzYWZlX3N0cnNpZ25hbCAoc2lnZ3kpKTsKKworICAvKiBCdWlsZCB1cCB0aHJlYWQgbGlzdCBmcm9tIEJGRCBzZWN0aW9ucy4gKi8KKworICBpbml0X3RocmVhZF9saXN0ICgpOworICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGNvcmVfYmZkLCBhZGRfdG9fdGhyZWFkX2xpc3QsCisJCQkgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGNvcmVfYmZkLCAiLnJlZyIpKTsKKworICBpZiAob250b3ApCisgICAgeworICAgICAgLyogRmV0Y2ggYWxsIHJlZ2lzdGVycyBmcm9tIGNvcmUgZmlsZS4gICovCisgICAgICB0YXJnZXRfZmV0Y2hfcmVnaXN0ZXJzICgtMSk7CisKKyAgICAgIC8qIEFkZCBzeW1ib2xzIGFuZCBzZWN0aW9uIG1hcHBpbmdzIGZvciBhbnkgc2hhcmVkIGxpYnJhcmllcy4gICovCisjaWZkZWYgU09MSUJfQURECisgICAgICBjYXRjaF9lcnJvcnMgKHNvbGliX2FkZF9zdHViLCAmZnJvbV90dHksIChjaGFyICopMCwKKwkJICAgIFJFVFVSTl9NQVNLX0FMTCk7CisjZW5kaWYKKworICAgICAgLyogTm93LCBzZXQgdXAgdGhlIGZyYW1lIGNhY2hlLCBhbmQgcHJpbnQgdGhlIHRvcCBvZiBzdGFjay4gICovCisgICAgICBmbHVzaF9jYWNoZWRfZnJhbWVzICgpOworICAgICAgc2VsZWN0X2ZyYW1lIChnZXRfY3VycmVudF9mcmFtZSAoKSwgMCk7CisgICAgICBwcmludF9zdGFja19mcmFtZSAoc2VsZWN0ZWRfZnJhbWUsIHNlbGVjdGVkX2ZyYW1lX2xldmVsLCAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3YXJuaW5nICgKKyJ5b3Ugd29uJ3QgYmUgYWJsZSB0byBhY2Nlc3MgdGhpcyBjb3JlIGZpbGUgdW50aWwgeW91IHRlcm1pbmF0ZVxuXAoreW91ciAlczsgZG8gYGBpbmZvIGZpbGVzJyciLCB0YXJnZXRfbG9uZ25hbWUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NvcmVfZGV0YWNoIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAoYXJncykKKyAgICBlcnJvciAoIlRvbyBtYW55IGFyZ3VtZW50cyIpOworICB1bnB1c2hfdGFyZ2V0ICgmY29yZV9vcHMpOworICByZWluaXRfZnJhbWVfY2FjaGUgKCk7CisgIGlmIChmcm9tX3R0eSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJObyBjb3JlIGZpbGUgbm93LlxuIik7Cit9CisKKy8qIEdldCB0aGUgcmVnaXN0ZXJzIG91dCBvZiBhIGNvcmUgZmlsZS4gIFRoaXMgaXMgdGhlIG1hY2hpbmUtCisgICBpbmRlcGVuZGVudCBwYXJ0LiAgRmV0Y2hfY29yZV9yZWdpc3RlcnMgaXMgdGhlIG1hY2hpbmUtZGVwZW5kZW50CisgICBwYXJ0LCB0eXBpY2FsbHkgaW1wbGVtZW50ZWQgaW4gdGhlIHhtLWZpbGUgZm9yIGVhY2ggYXJjaGl0ZWN0dXJlLiAgKi8KKworLyogV2UganVzdCBnZXQgYWxsIHRoZSByZWdpc3RlcnMsIHNvIHdlIGRvbid0IHVzZSByZWduby4gICovCisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorZ2V0X2NvcmVfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBzZWNfcHRyIHJlZ19zZWM7CisgIHVuc2lnbmVkIHNpemU7CisgIGNoYXIgKnRoZV9yZWdzOworICBjaGFyIHNlY25hbWVbMzBdOworICBlbnVtIGJmZF9mbGF2b3VyIG91cl9mbGF2b3VyID0gYmZkX2dldF9mbGF2b3VyIChjb3JlX2JmZCk7CisgIHN0cnVjdCBjb3JlX2ZucyAqY2YgPSBOVUxMOworCisgIGlmIChjb3JlX2ZpbGVfZm5zID09IE5VTEwpCisgICAgeworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKwkJCSJDYW4ndCBmZXRjaCByZWdpc3RlcnMgZnJvbSB0aGlzIHR5cGUgb2YgY29yZSBmaWxlXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogVGhyZWFkIHN1cHBvcnQuICBJZiBpbmZlcmlvcl9waWQgaXMgbm9uLXplcm8sIHRoZW4gd2UgaGF2ZSBmb3VuZCBhIGNvcmUKKyAgICAgZmlsZSB3aXRoIHRocmVhZHMgKG9yIG11bHRpcGxlIHByb2Nlc3NlcykuICBJbiB0aGF0IGNhc2UsIHdlIG5lZWQgdG8KKyAgICAgdXNlIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlciBzZWN0aW9uLCBlbHNlIHdlIGp1c3QgdXNlIGAucmVnJy4gKi8KKworICAvKiBYWFggLSBzYW1lIHRoaW5nIG5lZWRzIHRvIGJlIGRvbmUgZm9yIGZsb2F0aW5nLXBvaW50ICgucmVnMikgc2VjdGlvbnMuICovCisKKyAgaWYgKGluZmVyaW9yX3BpZCkKKyAgICBzcHJpbnRmIChzZWNuYW1lLCAiLnJlZy8lZCIsIGluZmVyaW9yX3BpZCk7CisgIGVsc2UKKyAgICBzdHJjcHkgKHNlY25hbWUsICIucmVnIik7CisKKyAgcmVnX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChjb3JlX2JmZCwgc2VjbmFtZSk7CisgIGlmICghcmVnX3NlYykKKyAgICBnb3RvIGNhbnQ7CisgIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChjb3JlX2JmZCwgcmVnX3NlYyk7CisgIHRoZV9yZWdzID0gYWxsb2NhIChzaXplKTsKKyAgLyogTG9vayBmb3IgdGhlIGNvcmUgZnVuY3Rpb25zIHRoYXQgbWF0Y2ggdGhpcyBmbGF2b3IuICBEZWZhdWx0IHRvIHRoZQorICAgICBmaXJzdCBvbmUgaWYgbm90aGluZyBtYXRjaGVzLiAqLworICBmb3IgKGNmID0gY29yZV9maWxlX2ZuczsgY2YgIT0gTlVMTDsgY2YgPSBjZiAtPiBuZXh0KQorICAgIHsKKyAgICAgIGlmIChvdXJfZmxhdm91ciA9PSBjZiAtPiBjb3JlX2ZsYXZvdXIpCisJeworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgaWYgKGNmID09IE5VTEwpCisgICAgeworICAgICAgY2YgPSBjb3JlX2ZpbGVfZm5zOworICAgIH0KKyAgaWYgKGNmICE9IE5VTEwgJiYKKyAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoY29yZV9iZmQsIHJlZ19zZWMsIHRoZV9yZWdzLCAoZmlsZV9wdHIpMCwgc2l6ZSkgJiYKKyAgICAgIGNmIC0+IGNvcmVfcmVhZF9yZWdpc3RlcnMgIT0gTlVMTCkKKyAgICB7CisgICAgICAoY2YgLT4gY29yZV9yZWFkX3JlZ2lzdGVycyAodGhlX3JlZ3MsIHNpemUsIDAsCisJCQkJICAodW5zaWduZWQpIGJmZF9zZWN0aW9uX3ZtYSAoYWJmZCxyZWdfc2VjKSkpOworICAgIH0KKyAgZWxzZQorICAgIHsKK2NhbnQ6CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChnZGJfc3RkZXJyLAorCQkJIkNvdWxkbid0IGZldGNoIHJlZ2lzdGVycyBmcm9tIGNvcmUgZmlsZTogJXNcbiIsCisJCQliZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgfQorCisgIC8qIE5vdyBkbyBpdCBhZ2FpbiBmb3IgdGhlIGZsb2F0IHJlZ2lzdGVycywgaWYgdGhleSBleGlzdC4gICovCisgIHJlZ19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoY29yZV9iZmQsICIucmVnMiIpOworICBpZiAocmVnX3NlYykKKyAgICB7CisgICAgICBzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoY29yZV9iZmQsIHJlZ19zZWMpOworICAgICAgdGhlX3JlZ3MgPSBhbGxvY2EgKHNpemUpOworICAgICAgaWYgKGNmICE9IE5VTEwgJiYKKwkgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoY29yZV9iZmQsIHJlZ19zZWMsIHRoZV9yZWdzLCAoZmlsZV9wdHIpMCwgc2l6ZSkgJiYKKwkgIGNmIC0+IGNvcmVfcmVhZF9yZWdpc3RlcnMgIT0gTlVMTCkKKwl7CisJICAoY2YgLT4gY29yZV9yZWFkX3JlZ2lzdGVycyAodGhlX3JlZ3MsIHNpemUsIDIsCisJCQkJICAgICAgKHVuc2lnbmVkKSBiZmRfc2VjdGlvbl92bWEgKGFiZmQscmVnX3NlYykpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgCisJCQkgICAgIkNvdWxkbid0IGZldGNoIHJlZ2lzdGVyIHNldCAyIGZyb20gY29yZSBmaWxlOiAlc1xuIiwKKwkJCSAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisJfQorICAgIH0KKyAgcmVnaXN0ZXJzX2ZldGNoZWQgKCk7Cit9CisKK3N0YXRpYyBjaGFyICoKK2NvcmVfZmlsZV90b19zeW1fZmlsZSAoY29yZSkKKyAgY2hhciAqICBjb3JlOworeworICBDT05TVCBjaGFyICogIGZhaWxpbmdfY29tbWFuZDsKKyAgY2hhciAqICBwOworICBjaGFyICogIHRlbXA7CisgIGJmZCAqICB0ZW1wX2JmZDsKKyAgaW50ICBzY3JhdGNoX2NoYW47CisKKyAgaWYgKCEgY29yZSkKKyAgICBlcnJvciAoIk5vIGNvcmUgZmlsZSBzcGVjaWZpZWQuIik7CisKKyAgY29yZSA9IHRpbGRlX2V4cGFuZCAoY29yZSk7CisgIGlmIChjb3JlWzBdICE9ICcvJykKKyAgICB7CisgICAgICB0ZW1wID0gY29uY2F0IChjdXJyZW50X2RpcmVjdG9yeSwgIi8iLCBjb3JlLCBOVUxMKTsKKyAgICAgIGNvcmUgPSB0ZW1wOworICAgIH0KKworICBzY3JhdGNoX2NoYW4gPSBvcGVuIChjb3JlLCB3cml0ZV9maWxlcyA/IE9fUkRXUiA6IE9fUkRPTkxZLCAwKTsKKyAgaWYgKHNjcmF0Y2hfY2hhbiA8IDApCisgICAgcGVycm9yX3dpdGhfbmFtZSAoY29yZSk7CisKKyAgdGVtcF9iZmQgPSBiZmRfZmRvcGVuciAoY29yZSwgZ251dGFyZ2V0LCBzY3JhdGNoX2NoYW4pOworICBpZiAodGVtcF9iZmQgPT0gTlVMTCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lIChjb3JlKTsKKworICBpZiAoIWJmZF9jaGVja19mb3JtYXQgKHRlbXBfYmZkLCBiZmRfY29yZSkpCisgICAgeworICAgICAgLyogRG8gaXQgYWZ0ZXIgdGhlIGVyciBtc2cgKi8KKyAgICAgIC8qIEZJWE1FOiBzaG91bGQgYmUgY2hlY2tpbmcgZm9yIGVycm9ycyBmcm9tIGJmZF9jbG9zZSAoZm9yIG9uZSB0aGluZywKKwkgb24gZXJyb3IgaXQgZG9lcyBub3QgZnJlZSBhbGwgdGhlIHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZQorCSBiZmQpLiAgKi8KKyAgICAgIG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBiZmRfY2xvc2UsIHRlbXBfYmZkKTsKKyAgICAgIGVycm9yICgiXCIlc1wiIGlzIG5vdCBhIGNvcmUgZHVtcDogJXMiLAorCSAgICAgY29yZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICAgIH0KKworICAvKiBGaW5kIHRoZSBkYXRhIHNlY3Rpb24gKi8KKyAgaWYgKGJ1aWxkX3NlY3Rpb25fdGFibGUgKHRlbXBfYmZkLCAmY29yZV9vcHMudG9fc2VjdGlvbnMsCisJCQkgICAmY29yZV9vcHMudG9fc2VjdGlvbnNfZW5kKSkKKyAgICBlcnJvciAoIlwiJXNcIjogQ2FuJ3QgZmluZCBzZWN0aW9uczogJXMiLAorCSAgIGJmZF9nZXRfZmlsZW5hbWUgKHRlbXBfYmZkKSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCisgIGZhaWxpbmdfY29tbWFuZCA9IGJmZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kICh0ZW1wX2JmZCk7CisKKyAgYmZkX2Nsb3NlICh0ZW1wX2JmZCk7CisKKyAgLyogSWYgd2UgZm91bmQgYSBmaWxlbmFtZSwgcmVtZW1iZXIgdGhhdCBpdCBpcyBwcm9iYWJseSBzYXZlZAorICAgICByZWxhdGl2ZSB0byB0aGUgZXhlY3V0YWJsZSB0aGF0IGNyZWF0ZWQgaXQuICBJZiB3b3JraW5nIGRpcmVjdG9yeQorICAgICBpc24ndCB0aGVyZSBub3csIHdlIG1heSBub3QgYmUgYWJsZSB0byBmaW5kIHRoZSBleGVjdXRhYmxlLiAgUmF0aGVyCisgICAgIHRoYW4gdHJ5aW5nIHRvIGJlIHNhdXZlIGFib3V0IGZpbmRpbmcgaXQsIGp1c3QgY2hlY2sgaWYgdGhlIGZpbGUKKyAgICAgZXhpc3RzIHdoZXJlIHdlIGFyZSBub3cuICBJZiBub3QsIHRoZW4gcHVudCBhbmQgdGVsbCBvdXIgY2xpZW50CisgICAgIHdlIGNvdWxkbid0IGZpbmQgdGhlIHN5bSBmaWxlLgorICAgICAqLworICBwID0gKGNoYXIgKikgZmFpbGluZ19jb21tYW5kOworICBpZiAoKHAgIT0gTlVMTCkgJiYgKGFjY2VzcyAocCwgRl9PSykgIT0gMCkpCisgICAgcCA9IE5VTEw7CisKKyAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyB2b2lkCitjb3JlX2ZpbGVzX2luZm8gKHQpCisgIHN0cnVjdCB0YXJnZXRfb3BzICp0OworeworICBwcmludF9zZWN0aW9uX2luZm8gKHQsIGNvcmVfYmZkKTsKK30KKwwKKy8qIElmIG1vdXJuIGlzIGJlaW5nIGNhbGxlZCBpbiBhbGwgdGhlIHJpZ2h0IHBsYWNlcywgdGhpcyBjb3VsZCBiZSBzYXkKKyAgIGBnZGIgaW50ZXJuYWwgZXJyb3InIChzaW5jZSBnZW5lcmljX21vdXJuIGNhbGxzIGJyZWFrcG9pbnRfaW5pdF9pbmZlcmlvcikuICAqLworCitzdGF0aWMgaW50CitpZ25vcmUgKGFkZHIsIGNvbnRlbnRzKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqY29udGVudHM7Cit7CisgIHJldHVybiAwOworfQorCisKKy8qIE9rYXksIGxldCdzIGJlIGhvbmVzdDogdGhyZWFkcyBnbGVhbmVkIGZyb20gYSBjb3JlIGZpbGUgYXJlbid0CisgICBleGFjdGx5IGxpdmVseSwgYXJlIHRoZXk/ICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgd2UgZG9uJ3QgY2xhaW0KKyAgIHRoYXQgZWFjaCAmIGV2ZXJ5IG9uZSBpcyBhbGl2ZSwgdGhlbiB3ZSBkb24ndCBnZXQgYW55IG9mIHRoZW0KKyAgIHRvIGFwcGVhciBpbiBhbiAiaW5mbyB0aHJlYWQiIGNvbW1hbmQsIHdoaWNoIGlzIHF1aXRlIGEgdXNlZnVsCisgICBiZWhhdmlvdXIuCisgICAqLworc3RhdGljIGludAorY29yZV9maWxlX3RocmVhZF9hbGl2ZSAodGlkKQorICBpbnQgIHRpZDsKK3sKKyAgcmV0dXJuIDE7Cit9CisKKy8qIEZpbGwgaW4gY29yZV9vcHMgd2l0aCBpdHMgZGVmaW5lZCBvcGVyYXRpb25zIGFuZCBwcm9wZXJ0aWVzLiAgKi8KKworc3RhdGljIHZvaWQKK2luaXRfY29yZV9vcHMgKCkKK3sKKyAgY29yZV9vcHMudG9fc2hvcnRuYW1lID0gImNvcmUiOworICBjb3JlX29wcy50b19sb25nbmFtZSA9ICJMb2NhbCBjb3JlIGR1bXAgZmlsZSI7CisgIGNvcmVfb3BzLnRvX2RvYyA9CisgICAgIlVzZSBhIGNvcmUgZmlsZSBhcyBhIHRhcmdldC4gIFNwZWNpZnkgdGhlIGZpbGVuYW1lIG9mIHRoZSBjb3JlIGZpbGUuIjsKKyAgY29yZV9vcHMudG9fb3BlbiA9IGNvcmVfb3BlbjsKKyAgY29yZV9vcHMudG9fY2xvc2UgPSBjb3JlX2Nsb3NlOworICBjb3JlX29wcy50b19hdHRhY2ggPSBmaW5kX2RlZmF1bHRfYXR0YWNoOworICBjb3JlX29wcy50b19yZXF1aXJlX2F0dGFjaCA9IGZpbmRfZGVmYXVsdF9yZXF1aXJlX2F0dGFjaDsKKyAgY29yZV9vcHMudG9fZGV0YWNoID0gY29yZV9kZXRhY2g7CisgIGNvcmVfb3BzLnRvX3JlcXVpcmVfZGV0YWNoID0gZmluZF9kZWZhdWx0X3JlcXVpcmVfZGV0YWNoOworICBjb3JlX29wcy50b19mZXRjaF9yZWdpc3RlcnMgPSBnZXRfY29yZV9yZWdpc3RlcnM7CisgIGNvcmVfb3BzLnRvX3hmZXJfbWVtb3J5ID0geGZlcl9tZW1vcnk7CisgIGNvcmVfb3BzLnRvX2ZpbGVzX2luZm8gPSBjb3JlX2ZpbGVzX2luZm87CisgIGNvcmVfb3BzLnRvX2luc2VydF9icmVha3BvaW50ID0gaWdub3JlOworICBjb3JlX29wcy50b19yZW1vdmVfYnJlYWtwb2ludCA9IGlnbm9yZTsKKyAgY29yZV9vcHMudG9fY3JlYXRlX2luZmVyaW9yID0gZmluZF9kZWZhdWx0X2NyZWF0ZV9pbmZlcmlvcjsKKyAgY29yZV9vcHMudG9fY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciA9IGZpbmRfZGVmYXVsdF9jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yOworICBjb3JlX29wcy50b190aHJlYWRfYWxpdmUgPSBjb3JlX2ZpbGVfdGhyZWFkX2FsaXZlOworICBjb3JlX29wcy50b19jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUgPSBjb3JlX2ZpbGVfdG9fc3ltX2ZpbGU7CisgIGNvcmVfb3BzLnRvX3N0cmF0dW0gPSBjb3JlX3N0cmF0dW07CisgIGNvcmVfb3BzLnRvX2hhc19tZW1vcnkgPSAxOworICBjb3JlX29wcy50b19oYXNfc3RhY2sgPSAxOworICBjb3JlX29wcy50b19oYXNfcmVnaXN0ZXJzID0gMTsKKyAgY29yZV9vcHMudG9fbWFnaWMgPSBPUFNfTUFHSUM7CQorfQorCisvKiBub24temVybyBpZiB3ZSBzaG91bGQgbm90IGRvIHRoZSBhZGRfdGFyZ2V0IGNhbGwgaW4KKyAgIF9pbml0aWFsaXplX2NvcmVsb3c7IG5vdCBpbml0aWFsaXplZCAoaS5lLiwgYnNzKSBzbyB0aGF0CisgICB0aGUgdGFyZ2V0IGNhbiBpbml0aWFsaXplIGl0IChpLmUuLCBkYXRhKSBpZiBhcHByb3ByaWF0ZS4KKyAgIFRoaXMgbmVlZHMgdG8gYmUgc2V0IGF0IGNvbXBpbGUgdGltZSBiZWNhdXNlIHdlIGRvbid0IGtub3cKKyAgIGZvciBzdXJlIHdoZXRoZXIgdGhlIHRhcmdldCdzIGluaXRpYWxpemUgcm91dGluZSBpcyBjYWxsZWQKKyAgIGJlZm9yZSB1cyBvciBhZnRlciB1cy4gKi8KK2ludCBjb3Jlb3BzX3N1cHByZXNzX3RhcmdldDsKKwordm9pZAorX2luaXRpYWxpemVfY29yZWxvdyAoKQoreworICBpbml0X2NvcmVfb3BzICgpOworCisgIGlmICghY29yZW9wc19zdXBwcmVzc190YXJnZXQpCisgICAgYWRkX3RhcmdldCAoJmNvcmVfb3BzKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9jcC12YWxwcmludC5jIGIvZ2RiL2NwLXZhbHByaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVlYjc5ZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jcC12YWxwcmludC5jCkBAIC0wLDAgKzEsODI2IEBACisvKiBTdXBwb3J0IGZvciBwcmludGluZyBDKysgdmFsdWVzIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4OCwgMTk4OSwgMTk5MSwgMTk5NCwgMTk5NSwgMTk5NgorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJvYnN0YWNrLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJjb21tYW5kLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAiZGVtYW5nbGUuaCIKKyNpbmNsdWRlICJhbm5vdGF0ZS5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJjLWxhbmcuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKworLyogSW5kaWNhdGlvbiBvZiBwcmVzZW5jZSBvZiBIUC1jb21waWxlZCBvYmplY3QgZmlsZXMgKi8gCitleHRlcm4gaW50IGhwX3NvbV9zb21fb2JqZWN0X3ByZXNlbnQ7IC8qIGRlZmluZWQgaW4gc3ltdGFiLmMgKi8KKworCitpbnQgdnRibHByaW50OwkJCS8qIENvbnRyb2xzIHByaW50aW5nIG9mIHZ0YmwncyAqLworaW50IG9iamVjdHByaW50OwkJLyogQ29udHJvbHMgbG9va2luZyB1cCBhbiBvYmplY3QncyBkZXJpdmVkIHR5cGUKKwkJCQkgICB1c2luZyB3aGF0IHdlIGZpbmQgaW4gaXRzIHZ0YWJsZXMuICAqLworaW50IHN0YXRpY19maWVsZF9wcmludDsJLyogQ29udHJvbHMgcHJpbnRpbmcgb2Ygc3RhdGljIGZpZWxkcy4gKi8KKworc3RhdGljIHN0cnVjdCBvYnN0YWNrIGRvbnRfcHJpbnRfdmJfb2JzdGFjazsKK3N0YXRpYyBzdHJ1Y3Qgb2JzdGFjayBkb250X3ByaW50X3N0YXRtZW1fb2JzdGFjazsKKworc3RhdGljIHZvaWQKK2NwX3ByaW50X3N0YXRpY19maWVsZCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCB2YWx1ZV9wdHIsIEdEQl9GSUxFICosIGludCwgaW50LAorCQkJICAgICAgIGVudW0gdmFsX3ByZXR0eXByaW50KSk7CisKK3N0YXRpYyB2b2lkCitjcF9wcmludF92YWx1ZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBzdHJ1Y3QgdHlwZSAqLCBjaGFyICosIGludCwgQ09SRV9BRERSLCBHREJfRklMRSAqLAorCQkJaW50LCBpbnQsIGVudW0gdmFsX3ByZXR0eXByaW50LCBzdHJ1Y3QgdHlwZSAqKikpOworCitzdGF0aWMgdm9pZAorY3BfcHJpbnRfaHBhY2NfdmlydHVhbF90YWJsZV9lbnRyaWVzIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIGludCAqLCB2YWx1ZV9wdHIsIEdEQl9GSUxFICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LCBpbnQsIGVudW0gdmFsX3ByZXR0eXByaW50KSk7CisKKwordm9pZAorY3BfcHJpbnRfY2xhc3NfbWV0aG9kICh2YWxhZGRyLCB0eXBlLCBzdHJlYW0pCisgICAgIGNoYXIgKnZhbGFkZHI7CisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBHREJfRklMRSAqc3RyZWFtOworeworICBzdHJ1Y3QgdHlwZSAqZG9tYWluOworICBzdHJ1Y3QgZm5fZmllbGQgKmYgPSBOVUxMOworICBpbnQgaiA9IDA7CisgIGludCBsZW4yOworICBpbnQgb2Zmc2V0OworICBjaGFyICpraW5kID0gIiI7CisgIENPUkVfQUREUiBhZGRyOworICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIHVuc2lnbmVkIGxlbjsKKyAgdW5zaWduZWQgaW50IGk7CisgIHN0cnVjdCB0eXBlICp0YXJnZXRfdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKKworICBkb21haW4gPSBUWVBFX0RPTUFJTl9UWVBFICh0YXJnZXRfdHlwZSk7CisgIGlmIChkb21haW4gPT0gKHN0cnVjdCB0eXBlICopTlVMTCkKKyAgICB7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICI8dW5rbm93bj4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGFkZHIgPSB1bnBhY2tfcG9pbnRlciAobG9va3VwX3BvaW50ZXJfdHlwZSAoYnVpbHRpbl90eXBlX3ZvaWQpLCB2YWxhZGRyKTsKKyAgaWYgKE1FVEhPRF9QVFJfSVNfVklSVFVBTCAoYWRkcikpCisgICAgeworICAgICAgb2Zmc2V0ID0gTUVUSE9EX1BUUl9UT19WT0ZGU0VUIChhZGRyKTsKKyAgICAgIGxlbiA9IFRZUEVfTkZOX0ZJRUxEUyAoZG9tYWluKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwl7CisJICBmID0gVFlQRV9GTl9GSUVMRExJU1QxIChkb21haW4sIGkpOworCSAgbGVuMiA9IFRZUEVfRk5fRklFTERMSVNUX0xFTkdUSCAoZG9tYWluLCBpKTsKKwkgIAorCSAgZm9yIChqID0gMDsgaiA8IGxlbjI7IGorKykKKwkgICAgeworCSAgICAgIFFVSVQ7CisJICAgICAgaWYgKFRZUEVfRk5fRklFTERfVk9GRlNFVCAoZiwgaikgPT0gb2Zmc2V0KQorCQl7CisJCSAgaWYgKFRZUEVfRk5fRklFTERfU1RVQiAoZiwgaikpCisJCSAgICBjaGVja19zdHViX21ldGhvZCAoZG9tYWluLCBpLCBqKTsKKwkJICBraW5kID0gInZpcnR1YWwgIjsKKwkJICBnb3RvIGNvbW1vbjsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN5bSA9IGZpbmRfcGNfZnVuY3Rpb24gKGFkZHIpOworICAgICAgaWYgKHN5bSA9PSAwKQorCXsKKyAgICAgICAgICAvKiAxOTk3LTA4LTAxIEN1cnJlbnRseSB1bnN1cHBvcnRlZCB3aXRoIEhQIGFDQyAqLworICAgICAgICAgIGlmIChocF9zb21fc29tX29iamVjdF9wcmVzZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBmcHV0c19maWx0ZXJlZCAoIj8/IDxub3Qgc3VwcG9ydGVkIHdpdGggSFAgYUNDPiIsIHN0cmVhbSk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwkgIGVycm9yICgiaW52YWxpZCBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiIpOworCX0KKyAgICAgIGxlbiA9IFRZUEVfTkZOX0ZJRUxEUyAoZG9tYWluKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwl7CisJICBmID0gVFlQRV9GTl9GSUVMRExJU1QxIChkb21haW4sIGkpOworCSAgbGVuMiA9IFRZUEVfRk5fRklFTERMSVNUX0xFTkdUSCAoZG9tYWluLCBpKTsKKwkgIAorCSAgZm9yIChqID0gMDsgaiA8IGxlbjI7IGorKykKKwkgICAgeworCSAgICAgIFFVSVQ7CisJICAgICAgaWYgKFRZUEVfRk5fRklFTERfU1RVQiAoZiwgaikpCisJCWNoZWNrX3N0dWJfbWV0aG9kIChkb21haW4sIGksIGopOworCSAgICAgIGlmIChTVFJFUSAoU1lNQk9MX05BTUUgKHN5bSksIFRZUEVfRk5fRklFTERfUEhZU05BTUUgKGYsIGopKSkKKwkJeworCQkgIGdvdG8gY29tbW9uOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICBjb21tb246CisgIGlmIChpIDwgbGVuKQorICAgIHsKKyAgICAgIGNoYXIgKmRlbWFuZ2xlZF9uYW1lOworCisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICImIik7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sIGtpbmQpOworICAgICAgZGVtYW5nbGVkX25hbWUgPSBjcGx1c19kZW1hbmdsZSAoVFlQRV9GTl9GSUVMRF9QSFlTTkFNRSAoZiwgaiksCisJCQkJICAgICAgIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKKyAgICAgIGlmIChkZW1hbmdsZWRfbmFtZSA9PSBOVUxMKQorCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjxiYWRseSBtYW5nbGVkIG5hbWUgJXM+IiwKKwkJCSAgVFlQRV9GTl9GSUVMRF9QSFlTTkFNRSAoZiwgaikpOworICAgICAgZWxzZQorCXsKKwkgIGZwdXRzX2ZpbHRlcmVkIChkZW1hbmdsZWRfbmFtZSwgc3RyZWFtKTsKKwkgIGZyZWUgKGRlbWFuZ2xlZF9uYW1lKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKCIpOworICAgICAgdHlwZV9wcmludCAodHlwZSwgIiIsIHN0cmVhbSwgLTEpOworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKSAlZCIsIChpbnQpIGFkZHIgPj4gMyk7CisgICAgfQorfQorCisvKiBUaGlzIHdhcyB3aGF0IGl0IHdhcyBmb3IgZ2NjIDIuNC41IGFuZCBlYXJsaWVyLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIHZ0YmxfcHRyX25hbWVfb2xkW10gPQorICB7IENQTFVTX01BUktFUiwndicsJ3QnLCdiJywnbCcsJ18nLCdwJywndCcsJ3InLCdfJywndCcsJ3knLCdwJywnZScsIDAgfTsKKy8qIEl0IHdhcyBjaGFuZ2VkIHRvIHRoaXMgYWZ0ZXIgMi40LjUuICAqLworY29uc3QgY2hhciB2dGJsX3B0cl9uYW1lW10gPQorICB7ICdfJywnXycsJ3YnLCd0JywnYicsJ2wnLCdfJywncCcsJ3QnLCdyJywnXycsJ3QnLCd5JywncCcsJ2UnLCAwIH07CisKKy8qIEhQIGFDQyB1c2VzIGRpZmZlcmVudCBuYW1lcyAqLworY29uc3QgY2hhciBocGFjY192dGJsX3B0cl9uYW1lW10gPQorICB7ICdfJywgJ18nLCAndicsICdmJywgJ3AnLCAwIH07Citjb25zdCBjaGFyIGhwYWNjX3Z0YmxfcHRyX3R5cGVfbmFtZVtdID0KKyAgeyAnXycsICdfJywgJ3YnLCAnZicsICd0JywgJ3knLCAncCcsIDAgfTsKKworCisvKiBSZXR1cm4gdHJ1dGggdmFsdWUgZm9yIGFzc2VydGlvbiB0aGF0IFRZUEUgaXMgb2YgdGhlIHR5cGUKKyAgICJwb2ludGVyIHRvIHZpcnR1YWwgZnVuY3Rpb24iLiAgKi8KKworaW50CitjcF9pc192dGJsX3B0cl90eXBlKHR5cGUpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworeworICBjaGFyICp0eXBlbmFtZSA9IHR5cGVfbmFtZV9ub190YWcgKHR5cGUpOworCisgIHJldHVybiAodHlwZW5hbWUgIT0gTlVMTAorCSAgJiYgKFNUUkVRICh0eXBlbmFtZSwgdnRibF9wdHJfbmFtZSkKKwkgICAgICB8fCBTVFJFUSAodHlwZW5hbWUsIHZ0YmxfcHRyX25hbWVfb2xkKSkpOworfQorCisvKiBSZXR1cm4gdHJ1dGggdmFsdWUgZm9yIHRoZSBhc3NlcnRpb24gdGhhdCBUWVBFIGlzIG9mIHRoZSB0eXBlCisgICAicG9pbnRlciB0byB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIi4gICovCisKK2ludAorY3BfaXNfdnRibF9tZW1iZXIodHlwZSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9QVFIpCisgICAgeworICAgICAgdHlwZSA9IFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpOworICAgICAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX0FSUkFZKQorCXsKKwkgIHR5cGUgPSBUWVBFX1RBUkdFVF9UWVBFICh0eXBlKTsKKwkgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9TVFJVQ1QgLyogaWYgbm90IHVzaW5nIHRodW5rcyAqLworCSAgICAgIHx8IFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1BUUikgLyogaWYgdXNpbmcgdGh1bmtzICovCisJICAgIHsKKwkgICAgICAvKiBWaXJ0dWFsIGZ1bmN0aW9ucyB0YWJsZXMgYXJlIGZ1bGwgb2YgcG9pbnRlcnMKKwkJIHRvIHZpcnR1YWwgZnVuY3Rpb25zLiAqLworCSAgICAgIHJldHVybiBjcF9pc192dGJsX3B0cl90eXBlICh0eXBlKTsKKwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBNdXR1YWxseSByZWN1cnNpdmUgc3Vicm91dGluZXMgb2YgY3BfcHJpbnRfdmFsdWUgYW5kIGNfdmFsX3ByaW50IHRvCisgICBwcmludCBvdXQgYSBzdHJ1Y3R1cmUncyBmaWVsZHM6IGNwX3ByaW50X3ZhbHVlX2ZpZWxkcyBhbmQgY3BfcHJpbnRfdmFsdWUuCisgIAorICAgVFlQRSwgVkFMQUREUiwgQUREUkVTUywgU1RSRUFNLCBSRUNVUlNFLCBhbmQgUFJFVFRZIGhhdmUgdGhlCisgICBzYW1lIG1lYW5pbmdzIGFzIGluIGNwX3ByaW50X3ZhbHVlIGFuZCBjX3ZhbF9wcmludC4KKworICAgMm5kIGFyZ3VtZW50IFJFQUxfVFlQRSBpcyB1c2VkIHRvIGNhcnJ5IG92ZXIgdGhlIHR5cGUgb2YgdGhlIGRlcml2ZWQKKyAgIGNsYXNzIGFjcm9zcyB0aGUgcmVjdXJzaW9uIHRvIGJhc2UgY2xhc3Nlcy4gCisKKyAgIERPTlRfUFJJTlQgaXMgYW4gYXJyYXkgb2YgYmFzZWNsYXNzIHR5cGVzIHRoYXQgd2UKKyAgIHNob3VsZCBub3QgcHJpbnQsIG9yIHplcm8gaWYgY2FsbGVkIGZyb20gdG9wIGxldmVsLiAgKi8KKwordm9pZAorY3BfcHJpbnRfdmFsdWVfZmllbGRzICh0eXBlLCByZWFsX3R5cGUsIHZhbGFkZHIsIG9mZnNldCwgYWRkcmVzcywgc3RyZWFtLCBmb3JtYXQsIHJlY3Vyc2UsIHByZXR0eSwKKwkJICAgICAgIGRvbnRfcHJpbnRfdmIsIGRvbnRfcHJpbnRfc3RhdG1lbSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIHN0cnVjdCB0eXBlICpyZWFsX3R5cGU7CisgICAgIGNoYXIgKnZhbGFkZHI7CisgICAgIGludCBvZmZzZXQ7CisgICAgIENPUkVfQUREUiBhZGRyZXNzOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgZm9ybWF0OworICAgICBpbnQgcmVjdXJzZTsKKyAgICAgZW51bSB2YWxfcHJldHR5cHJpbnQgcHJldHR5OworICAgICBzdHJ1Y3QgdHlwZSAqKmRvbnRfcHJpbnRfdmI7CisgICAgIGludCBkb250X3ByaW50X3N0YXRtZW07Cit7CisgIGludCBpLCBsZW4sIG5fYmFzZWNsYXNzZXM7CisgIHN0cnVjdCBvYnN0YWNrIHRtcF9vYnN0YWNrOworICBjaGFyICpsYXN0X2RvbnRfcHJpbnQgPSBvYnN0YWNrX25leHRfZnJlZSAoJmRvbnRfcHJpbnRfc3RhdG1lbV9vYnN0YWNrKTsKKyAgaW50IGZpZWxkc19zZWVuID0gMDsKKworICBDSEVDS19UWVBFREVGICh0eXBlKTsKKworICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJ7Iik7CisgIGxlbiA9IFRZUEVfTkZJRUxEUyAodHlwZSk7CisgIG5fYmFzZWNsYXNzZXMgPSBUWVBFX05fQkFTRUNMQVNTRVMgKHR5cGUpOworCisgIC8qIEZpcnN0LCBwcmludCBvdXQgYmFzZWNsYXNzZXMgc3VjaCB0aGF0IHdlIGRvbid0IHByaW50CisgICAgIGR1cGxpY2F0ZXMgb2YgdmlydHVhbCBiYXNlY2xhc3Nlcy4gICovCisKKyAgaWYgKG5fYmFzZWNsYXNzZXMgPiAwKQorICAgIGNwX3ByaW50X3ZhbHVlICh0eXBlLCByZWFsX3R5cGUsIHZhbGFkZHIsIG9mZnNldCwgYWRkcmVzcywgc3RyZWFtLAorCQkgICAgZm9ybWF0LCByZWN1cnNlKzEsIHByZXR0eSwgZG9udF9wcmludF92Yik7CisKKyAgLyogU2Vjb25kLCBwcmludCBvdXQgZGF0YSBmaWVsZHMgKi8KKworICAvKiBJZiB0aGVyZSBhcmUgbm8gZGF0YSBmaWVsZHMsIG9yIGlmIHRoZSBvbmx5IGZpZWxkIGlzIHRoZQorICAgKiB2dGJsIHBvaW50ZXIsIHNraXAgdGhpcyBwYXJ0ICovIAorICBpZiAoKGxlbiA9PSBuX2Jhc2VjbGFzc2VzKSB8fAorICAgICAgKChsZW4gLSBuX2Jhc2VjbGFzc2VzID09IDEpICYmCisgICAgICAgVFlQRV9IQVNfVlRBQkxFKHR5cGUpICYmCisgICAgICAgU1RSRVFOKFRZUEVfRklFTERfTkFNRSAodHlwZSwgbl9iYXNlY2xhc3NlcyksIGhwYWNjX3Z0YmxfcHRyX25hbWUsIDUpKSB8fCAKKyAgICAgICFsZW4pCisgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiPE5vIGRhdGEgZmllbGRzPiIpOworICBlbHNlCisgICAgeworICAgICAgZXh0ZXJuIGludCBpbnNwZWN0X2l0OworCisgICAgICBpZiAoZG9udF9wcmludF9zdGF0bWVtID09IDApCisJeworCSAgLyogSWYgd2UncmUgYXQgdG9wIGxldmVsLCBjYXJ2ZSBvdXQgYSBjb21wbGV0ZWx5IGZyZXNoCisJICAgICBjaHVuayBvZiB0aGUgb2JzdGFjayBhbmQgdXNlIHRoYXQgdW50aWwgdGhpcyBwYXJ0aWN1bGFyCisJICAgICBpbnZvY2F0aW9uIHJldHVybnMuICAqLworCSAgdG1wX29ic3RhY2sgPSBkb250X3ByaW50X3N0YXRtZW1fb2JzdGFjazsKKwkgIG9ic3RhY2tfZmluaXNoICgmZG9udF9wcmludF9zdGF0bWVtX29ic3RhY2spOworCX0KKworICAgICAgZm9yIChpID0gbl9iYXNlY2xhc3NlczsgaSA8IGxlbjsgaSsrKQorCXsKKwkgIC8qIElmIHJlcXVlc3RlZCwgc2tpcCBwcmludGluZyBvZiBzdGF0aWMgZmllbGRzLiAgKi8KKwkgIGlmICghc3RhdGljX2ZpZWxkX3ByaW50ICYmIFRZUEVfRklFTERfU1RBVElDICh0eXBlLCBpKSkKKwkgICAgY29udGludWU7CisKKyAgICAgICAgICAvKiBJZiBhIHZ0YWJsZSBwb2ludGVyIGFwcGVhcnMsIHdlJ2xsIHByaW50IGl0IG91dCBsYXRlciAqLyAKKyAgICAgICAgICBpZiAoVFlQRV9IQVNfVlRBQkxFKHR5cGUpICYmIFNUUkVRTihUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIGkpLCBocGFjY192dGJsX3B0cl9uYW1lLCA1KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAKKwkgIGlmIChmaWVsZHNfc2VlbikKKwkgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiLCAiKTsKKwkgIGVsc2UgaWYgKG5fYmFzZWNsYXNzZXMgPiAwKQorCSAgICB7CisJICAgICAgaWYgKHByZXR0eSkKKwkJeworCQkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlxuIik7CisJCSAgcHJpbnRfc3BhY2VzX2ZpbHRlcmVkICgyICsgMiAqIHJlY3Vyc2UsIHN0cmVhbSk7CisJCSAgZnB1dHNfZmlsdGVyZWQgKCJtZW1iZXJzIG9mICIsIHN0cmVhbSk7CisJCSAgZnB1dHNfZmlsdGVyZWQgKHR5cGVfbmFtZV9ub190YWcgKHR5cGUpLCBzdHJlYW0pOworCQkgIGZwdXRzX2ZpbHRlcmVkICgiOiAiLCBzdHJlYW0pOworCQl9CisJICAgIH0KKwkgIGZpZWxkc19zZWVuID0gMTsKKworCSAgaWYgKHByZXR0eSkKKwkgICAgeworCSAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlxuIik7CisJICAgICAgcHJpbnRfc3BhY2VzX2ZpbHRlcmVkICgyICsgMiAqIHJlY3Vyc2UsIHN0cmVhbSk7CisJICAgIH0KKwkgIGVsc2UgCisJICAgIHsKKwkgICAgICB3cmFwX2hlcmUgKG5fc3BhY2VzICgyICsgMiAqIHJlY3Vyc2UpKTsKKwkgICAgfQorCSAgaWYgKGluc3BlY3RfaXQpCisJICAgIHsKKwkgICAgICBpZiAoVFlQRV9DT0RFIChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpKSA9PSBUWVBFX0NPREVfUFRSKQorCQlmcHV0c19maWx0ZXJlZCAoIlwiKCBwdHIgXCIiLCBzdHJlYW0pOworCSAgICAgIGVsc2UKKwkJZnB1dHNfZmlsdGVyZWQgKCJcIiggbm9kZWYgXCIiLCBzdHJlYW0pOworCSAgICAgIGlmIChUWVBFX0ZJRUxEX1NUQVRJQyAodHlwZSwgaSkpCisJCWZwdXRzX2ZpbHRlcmVkICgic3RhdGljICIsIHN0cmVhbSk7CisJICAgICAgZnByaW50Zl9zeW1ib2xfZmlsdGVyZWQgKHN0cmVhbSwgVFlQRV9GSUVMRF9OQU1FICh0eXBlLCBpKSwKKwkJCQkgICAgICAgbGFuZ3VhZ2VfY3BsdXMsCisJCQkJICAgICAgIERNR0xfUEFSQU1TIHwgRE1HTF9BTlNJKTsKKwkgICAgICBmcHV0c19maWx0ZXJlZCAoIlwiIFwiIiwgc3RyZWFtKTsKKwkgICAgICBmcHJpbnRmX3N5bWJvbF9maWx0ZXJlZCAoc3RyZWFtLCBUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIGkpLAorCQkJCSAgICAgICBsYW5ndWFnZV9jcGx1cywKKwkJCQkgICAgICAgRE1HTF9QQVJBTVMgfCBETUdMX0FOU0kpOworCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiXCIpIFwiIiwgc3RyZWFtKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgYW5ub3RhdGVfZmllbGRfYmVnaW4gKFRZUEVfRklFTERfVFlQRSAodHlwZSwgaSkpOworCisJICAgICAgaWYgKFRZUEVfRklFTERfU1RBVElDICh0eXBlLCBpKSkKKwkJZnB1dHNfZmlsdGVyZWQgKCJzdGF0aWMgIiwgc3RyZWFtKTsKKwkgICAgICBmcHJpbnRmX3N5bWJvbF9maWx0ZXJlZCAoc3RyZWFtLCBUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIGkpLAorCQkJCSAgICAgICBsYW5ndWFnZV9jcGx1cywKKwkJCQkgICAgICAgRE1HTF9QQVJBTVMgfCBETUdMX0FOU0kpOworCSAgICAgIGFubm90YXRlX2ZpZWxkX25hbWVfZW5kICgpOworCSAgICAgIC8qIGRvIG5vdCBwcmludCBsZWFkaW5nICc9JyBpbiBjYXNlIG9mIGFub255bW91cyB1bmlvbnMgKi8KKwkgICAgICBpZiAoc3RyY21wIChUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIGkpLCAiIikpCisJCWZwdXRzX2ZpbHRlcmVkICgiID0gIiwgc3RyZWFtKTsKKwkgICAgICBhbm5vdGF0ZV9maWVsZF92YWx1ZSAoKTsKKwkgICAgfQorCisJICBpZiAoIVRZUEVfRklFTERfU1RBVElDICh0eXBlLCBpKSAmJiBUWVBFX0ZJRUxEX1BBQ0tFRCAodHlwZSwgaSkpCisJICAgIHsKKwkgICAgICB2YWx1ZV9wdHIgdjsKKworCSAgICAgIC8qIEJpdGZpZWxkcyByZXF1aXJlIHNwZWNpYWwgaGFuZGxpbmcsIGVzcGVjaWFsbHkgZHVlIHRvIGJ5dGUKKwkJIG9yZGVyIHByb2JsZW1zLiAgKi8KKwkgICAgICBpZiAoVFlQRV9GSUVMRF9JR05PUkUgKHR5cGUsIGkpKQorCQl7CisJCSAgIGZwdXRzX2ZpbHRlcmVkICgiPG9wdGltaXplZCBvdXQgb3IgemVybyBsZW5ndGg+Iiwgc3RyZWFtKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCSAgICAgICAgICAgdiA9IHZhbHVlX2Zyb21fbG9uZ2VzdCAoVFlQRV9GSUVMRF9UWVBFICh0eXBlLCBpKSwKKwkJCQkgICB1bnBhY2tfZmllbGRfYXNfbG9uZyAodHlwZSwgdmFsYWRkciArIG9mZnNldCwgaSkpOworCisgICAgICAgICAgICAgICAgICAgdmFsX3ByaW50IChUWVBFX0ZJRUxEX1RZUEUodHlwZSwgaSksIFZBTFVFX0NPTlRFTlRTICh2KSwgMCwgMCwKKwkJCSAgICAgIHN0cmVhbSwgZm9ybWF0LCAwLCByZWN1cnNlICsgMSwgcHJldHR5KTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoVFlQRV9GSUVMRF9JR05PUkUgKHR5cGUsIGkpKQorCQl7CisJCSAgIGZwdXRzX2ZpbHRlcmVkICgiPG9wdGltaXplZCBvdXQgb3IgemVybyBsZW5ndGg+Iiwgc3RyZWFtKTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKFRZUEVfRklFTERfU1RBVElDICh0eXBlLCBpKSkKKwkJeworCQkgIHZhbHVlX3B0ciB2ID0gdmFsdWVfc3RhdGljX2ZpZWxkICh0eXBlLCBpKTsKKwkJICBpZiAodiA9PSBOVUxMKQorCQkgICAgZnB1dHNfZmlsdGVyZWQgKCI8b3B0aW1pemVkIG91dD4iLCBzdHJlYW0pOworCQkgIGVsc2UKKwkJICAgIGNwX3ByaW50X3N0YXRpY19maWVsZCAoVFlQRV9GSUVMRF9UWVBFICh0eXBlLCBpKSwgdiwKKwkJCQkJICAgc3RyZWFtLCBmb3JtYXQsIHJlY3Vyc2UgKyAxLAorCQkJCQkgICBwcmV0dHkpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJICAgICAgICAgICB2YWxfcHJpbnQgKFRZUEVfRklFTERfVFlQRSAodHlwZSwgaSksIAorCQkJICAgICAgdmFsYWRkciwgb2Zmc2V0ICsgVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIGkpIC8gOCwKKwkJCSAgICAgIGFkZHJlc3MgKyBUWVBFX0ZJRUxEX0JJVFBPUyAodHlwZSwgaSkgLyA4LAorCQkJICAgICAgc3RyZWFtLCBmb3JtYXQsIDAsIHJlY3Vyc2UgKyAxLCBwcmV0dHkpOworCQl9CisJICAgIH0KKwkgIGFubm90YXRlX2ZpZWxkX2VuZCAoKTsKKwl9CisKKyAgICAgIGlmIChkb250X3ByaW50X3N0YXRtZW0gPT0gMCkKKwl7CisJICAvKiBGcmVlIHRoZSBzcGFjZSB1c2VkIHRvIGRlYWwgd2l0aCB0aGUgcHJpbnRpbmcKKwkgICAgIG9mIHRoZSBtZW1iZXJzIGZyb20gdG9wIGxldmVsLiAgKi8KKwkgIG9ic3RhY2tfZnJlZSAoJmRvbnRfcHJpbnRfc3RhdG1lbV9vYnN0YWNrLCBsYXN0X2RvbnRfcHJpbnQpOworCSAgZG9udF9wcmludF9zdGF0bWVtX29ic3RhY2sgPSB0bXBfb2JzdGFjazsKKwl9CisKKyAgICAgIGlmIChwcmV0dHkpCisJeworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiXG4iKTsKKwkgIHByaW50X3NwYWNlc19maWx0ZXJlZCAoMiAqIHJlY3Vyc2UsIHN0cmVhbSk7CisJfQorICAgIH0gLyogaWYgdGhlcmUgYXJlIGRhdGEgZmllbGRzICovCisgIC8qIE5vdyBwcmludCBvdXQgdGhlIHZpcnR1YWwgdGFibGUgcG9pbnRlciBpZiB0aGVyZSBpcyBvbmUgKi8gCisgIGlmIChUWVBFX0hBU19WVEFCTEUodHlwZSkgJiYgU1RSRVFOKFRZUEVfRklFTERfTkFNRSAodHlwZSwgbl9iYXNlY2xhc3NlcyksIGhwYWNjX3Z0YmxfcHRyX25hbWUsIDUpKQorICAgIHsKKyAgICAgIHZhbHVlX3B0ciB2OworICAgICAgLyogRmlyc3QgZ2V0IHRoZSB2aXJ0dWFsIHRhYmxlIHBvaW50ZXIgYW5kIHByaW50IGl0IG91dCovIAorCisjaWYgMAorICAgICAgZnB1dHNfZmlsdGVyZWQgKCJfX3ZmcCA9ICIsIHN0cmVhbSk7CisjZW5kaWYKKworICAgICAgZnB1dHNfZmlsdGVyZWQgKCIsIFZpcnR1YWwgdGFibGUgYXQgIiwgc3RyZWFtKTsKKworICAgICAgLyogcGFpOiBGSVhNRSAzMng2NCBwcm9ibGVtPyAqLworICAgICAgLyogTm90IHN1cmUgd2hhdCB0aGUgYmVzdCBub3RhdGlvbiBpcyBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBubworICAgICAgICAgYmFzZWNsYXNzIG5hbWUuICAqLworICAgICAgdiA9IHZhbHVlX2Zyb21fbG9uZ2VzdCAobG9va3VwX3BvaW50ZXJfdHlwZSAoYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAodW5zaWduZWQgbG9uZyAqKSAodmFsYWRkciArIG9mZnNldCkpOworCisgICAgICB2YWxfcHJpbnQgKFZBTFVFX1RZUEUgKHYpLCBWQUxVRV9DT05URU5UUyAodiksIDAsIDAsCisgICAgICAgICAgICAgICAgIHN0cmVhbSwgZm9ybWF0LCAwLCByZWN1cnNlICsgMSwgcHJldHR5KTsKKyAgICAgIGZpZWxkc19zZWVuID0gMTsKKworICAgICAgaWYgKHZ0YmxwcmludCkKKyAgICAgICAgeworICAgICAgICAgIC8qIFByaW50IG91dCBmdW5jdGlvbiBwb2ludGVycyBpbiB2dGFibGUuICovCisKKyAgICAgICAgICAvKiBGSVhNRTogdGhlbi1jbGF1c2UgaXMgZm9yIG5vbi1SUkJDIGxheW91dCBvZiB2aXJ0dWFsCisgICAgICAgICAgICogdGFibGUuICBUaGUgUlJCQyBjYXNlIGluIHRoZSBlbHNlLWNsYXVzZSBpcyB5ZXQgdG8gYmUKKyAgICAgICAgICAgKiBpbXBsZW1lbnRlZC4gIFRoZSBpZiAoMSkgYmVsb3cgc2hvdWxkIGJlIGNoYW5nZWQgdG8gYQorICAgICAgICAgICAqIHRlc3QgZm9yIHdoZXRoZXIgdGhlIGV4ZWN1dGFibGUgd2UgaGF2ZSB3YXMgY29tcGlsZWQKKyAgICAgICAgICAgKiB3aXRoIGEgdmVyc2lvbiBvZiBIUCBhQ0MgdGhhdCBkb2Vzbid0IGhhdmUgUlJCQworICAgICAgICAgICAqIHN1cHBvcnQuICovCisKKyAgICAgICAgICBpZiAoMSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIG5vIFJSQkMgc3VwcG9ydDsgZnVuY3Rpb24gcG9pbnRlcnMgZW1iZWRkZWQgZGlyZWN0bHkgaW4gdnRhYmxlICovCisKKyAgICAgICAgICAgICAgaW50IHZmdW5jcyA9IGNvdW50X3ZpcnR1YWxfZm5zIChyZWFsX3R5cGUpOworCisgICAgICAgICAgICAgIGZwdXRzX2ZpbHRlcmVkICgiIHsiLCBzdHJlYW0pOworCisgICAgICAgICAgICAgIC8qIEZJWE1FIDogZG9lc24ndCB3b3JrIGF0IHByZXNlbnQgKi8gICAgICAgICAgIAorI2lmIDAKKyAgICAgICAgICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJWQgZW50ciVzOiAiLCB2ZnVuY3MsIHZmdW5jcyA9PSAxID8gInkiIDogImllcyIpOworI2Vsc2UKKyAgICAgICAgICAgICAgZnB1dHNfZmlsdGVyZWQgKCJub3QgaW1wbGVtZW50ZWQiLCBzdHJlYW0pOworCisKKyNlbmRpZgorCisgICAgICAgICAgICAgIC8qIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0aGF0IHByaW50cyBhbGwgdmlydHVhbCBmdW5jdGlvbiBlbnRyaWVzICovIAorI2lmIDAKKyAgICAgICAgICAgICAgY3BfcHJpbnRfaHBhY2NfdmlydHVhbF90YWJsZV9lbnRyaWVzIChyZWFsX3R5cGUsICZ2ZnVuY3MsIHYsIHN0cmVhbSwgZm9ybWF0LCByZWN1cnNlLCBwcmV0dHkpOworI2VuZGlmCisgICAgICAgICAgICAgIGZwdXRzX2ZpbHRlcmVkICgifSIsIHN0cmVhbSk7CisgICAgICAgICAgICB9IC8qIG5vbi1SUkJDIGNhc2UgKi8KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEZJWE1FIC0tIHNlZW0gY29tbWVudHMgYWJvdmUgKi8gCisgICAgICAgICAgICAgIC8qIFJSQkMgc3VwcG9ydCBwcmVzZW50OyBmdW5jdGlvbiBwb2ludGVycyBhcmUgZm91bmQKKyAgICAgICAgICAgICAgICogYnkgaW5kaXJlY3Rpb24gdGhyb3VnaCB0aGUgY2xhc3Mgc2VnbWVudCBlbnRyaWVzLiAqLworCisgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSAvKiBSUkJDIGNhc2UgKi8gCisgICAgICAgIH0gLyogaWYgdnRibHByaW50ICovIAorCisgICAgICBpZiAocHJldHR5KQorCXsKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlxuIik7CisJICBwcmludF9zcGFjZXNfZmlsdGVyZWQgKDIgKiByZWN1cnNlLCBzdHJlYW0pOworCX0KKworICAgIH0gLyogaWYgdnRhYmxlIGV4aXN0cyAqLyAKKyAgCisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIn0iKTsKK30KKworLyogU3BlY2lhbCB2YWxfcHJpbnQgcm91dGluZSB0byBhdm9pZCBwcmludGluZyBtdWx0aXBsZSBjb3BpZXMgb2YgdmlydHVhbAorICAgYmFzZWNsYXNzZXMuICAqLworCitzdGF0aWMgdm9pZAorY3BfcHJpbnRfdmFsdWUgKHR5cGUsIHJlYWxfdHlwZSwgdmFsYWRkciwgb2Zmc2V0LCBhZGRyZXNzLCBzdHJlYW0sIGZvcm1hdCwgcmVjdXJzZSwgcHJldHR5LAorCQlkb250X3ByaW50X3ZiKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgc3RydWN0IHR5cGUgKnJlYWxfdHlwZTsKKyAgICAgY2hhciAqdmFsYWRkcjsKKyAgICAgaW50IG9mZnNldDsKKyAgICAgQ09SRV9BRERSIGFkZHJlc3M7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGludCBmb3JtYXQ7CisgICAgIGludCByZWN1cnNlOworICAgICBlbnVtIHZhbF9wcmV0dHlwcmludCBwcmV0dHk7CisgICAgIHN0cnVjdCB0eXBlICoqZG9udF9wcmludF92YjsKK3sKKyAgc3RydWN0IG9ic3RhY2sgdG1wX29ic3RhY2s7CisgIHN0cnVjdCB0eXBlICoqbGFzdF9kb250X3ByaW50CisgICAgPSAoc3RydWN0IHR5cGUgKiopb2JzdGFja19uZXh0X2ZyZWUgKCZkb250X3ByaW50X3ZiX29ic3RhY2spOworICBpbnQgaSwgbl9iYXNlY2xhc3NlcyA9IFRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSk7CisKKyAgaWYgKGRvbnRfcHJpbnRfdmIgPT0gMCkKKyAgICB7CisgICAgICAvKiBJZiB3ZSdyZSBhdCB0b3AgbGV2ZWwsIGNhcnZlIG91dCBhIGNvbXBsZXRlbHkgZnJlc2gKKwkgY2h1bmsgb2YgdGhlIG9ic3RhY2sgYW5kIHVzZSB0aGF0IHVudGlsIHRoaXMgcGFydGljdWxhcgorCSBpbnZvY2F0aW9uIHJldHVybnMuICAqLworICAgICAgdG1wX29ic3RhY2sgPSBkb250X3ByaW50X3ZiX29ic3RhY2s7CisgICAgICAvKiBCdW1wIHVwIHRoZSBoaWdoLXdhdGVyIG1hcmsuICBOb3cgYWxwaGEgaXMgb21lZ2EuICAqLworICAgICAgb2JzdGFja19maW5pc2ggKCZkb250X3ByaW50X3ZiX29ic3RhY2spOworICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbl9iYXNlY2xhc3NlczsgaSsrKQorICAgIHsKKyAgICAgIGludCBib2Zmc2V0OworICAgICAgaW50IHNraXA7CisgICAgICBzdHJ1Y3QgdHlwZSAqYmFzZWNsYXNzID0gY2hlY2tfdHlwZWRlZiAoVFlQRV9CQVNFQ0xBU1MgKHR5cGUsIGkpKTsKKyAgICAgIGNoYXIgKmJhc2VuYW1lID0gVFlQRV9OQU1FIChiYXNlY2xhc3MpOworICAgICAgY2hhciAqYmFzZV92YWxhZGRyOworCisgICAgICBpZiAoQkFTRVRZUEVfVklBX1ZJUlRVQUwgKHR5cGUsIGkpKQorCXsKKwkgIHN0cnVjdCB0eXBlICoqZmlyc3RfZG9udF9wcmludAorCSAgICA9IChzdHJ1Y3QgdHlwZSAqKilvYnN0YWNrX2Jhc2UgKCZkb250X3ByaW50X3ZiX29ic3RhY2spOworCisJICBpbnQgaiA9IChzdHJ1Y3QgdHlwZSAqKilvYnN0YWNrX25leHRfZnJlZSAoJmRvbnRfcHJpbnRfdmJfb2JzdGFjaykKKwkgICAgLSBmaXJzdF9kb250X3ByaW50OworCisJICB3aGlsZSAoLS1qID49IDApCisJICAgIGlmIChiYXNlY2xhc3MgPT0gZmlyc3RfZG9udF9wcmludFtqXSkKKwkgICAgICBnb3RvIGZsdXNoX2l0OworCisJICBvYnN0YWNrX3B0cl9ncm93ICgmZG9udF9wcmludF92Yl9vYnN0YWNrLCBiYXNlY2xhc3MpOworCX0KKworICAgICAgaWYgKFRZUEVfSEFTX1ZUQUJMRSAodHlwZSkgJiYgQkFTRVRZUEVfVklBX1ZJUlRVQUwgKHR5cGUsIGkpKQorICAgICAgICB7CisgICAgICAgICAgLyogQXNzdW1lIEhQL1RhbGlnZW50IHJ1bnRpbWUgY29udmVudGlvbiAqLyAKKyAgICAgICAgICBmaW5kX3J0X3ZiYXNlX29mZnNldCAodHlwZSwgVFlQRV9CQVNFQ0xBU1MgKHR5cGUsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxhZGRyLCBvZmZzZXQsICZib2Zmc2V0LCAmc2tpcCk7CisgICAgICAgICAgaWYgKHNraXAgPj0gMCkKKyAgICAgICAgICAgIGVycm9yICgiVmlydHVhbCBiYXNlIGNsYXNzIG9mZnNldCBub3QgZm91bmQgZnJvbSB2dGFibGUgd2hpbGUgcHJpbnRpbmciKTsKKyAgICAgICAgICBiYXNlX3ZhbGFkZHIgPSB2YWxhZGRyOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBib2Zmc2V0ID0gYmFzZWNsYXNzX29mZnNldCAodHlwZSwgaSAsIHZhbGFkZHIgKyBvZmZzZXQsIGFkZHJlc3MgKyBvZmZzZXQpOworICAgICAgICAgIHNraXAgPSAoKGJvZmZzZXQgPT0gLTEpIHx8IChib2Zmc2V0K29mZnNldCkgPCAwICkgPyAxIDogLTE7CisKKyAgICAgICAgICBpZiAoQkFTRVRZUEVfVklBX1ZJUlRVQUwgKHR5cGUsIGkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBUaGUgdmlydHVhbCBiYXNlIGNsYXNzIHBvaW50ZXIgbWlnaHQgaGF2ZSBiZWVuIGNsb2JiZXJlZCBieSB0aGUKKwkgICAgICAgICB1c2VyIHByb2dyYW0uIE1ha2Ugc3VyZSB0aGF0IGl0IHN0aWxsIHBvaW50cyB0byBhIHZhbGlkIG1lbW9yeQorCSAgICAgICAgIGxvY2F0aW9uLiAgKi8KKworICAgICAgICAgICAgIGlmIChib2Zmc2V0ICE9IC0xICYmICgoYm9mZnNldCtvZmZzZXQpIDwgMCB8fCAoYm9mZnNldCtvZmZzZXQpID49IFRZUEVfTEVOR1RIICh0eXBlKSkpCisJICAgICAgIHsKKwkgICAgICAgICBiYXNlX3ZhbGFkZHIgPSAoY2hhciAqKSBhbGxvY2EgKFRZUEVfTEVOR1RIIChiYXNlY2xhc3MpKTsKKwkgICAgICAgICBpZiAodGFyZ2V0X3JlYWRfbWVtb3J5IChhZGRyZXNzICsgYm9mZnNldCwgYmFzZV92YWxhZGRyLAorCSAgICAJCQkgICAgICBUWVBFX0xFTkdUSCAoYmFzZWNsYXNzKSkgIT0gMCkKKwkgICAgICAgICAgIHNraXAgPSAxOworCSAgICAgICB9CisgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgYmFzZV92YWxhZGRyID0gdmFsYWRkcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgYmFzZV92YWxhZGRyID0gdmFsYWRkcjsKKwl9CisKKyAgICAgIC8qIG5vdyBkbyB0aGUgcHJpbnRpbmcgKi8KKyAgICAgIGlmIChwcmV0dHkpCisJeworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiXG4iKTsKKwkgIHByaW50X3NwYWNlc19maWx0ZXJlZCAoMiAqIHJlY3Vyc2UsIHN0cmVhbSk7CisJfQorICAgICAgZnB1dHNfZmlsdGVyZWQgKCI8Iiwgc3RyZWFtKTsKKyAgICAgIC8qIE5vdCBzdXJlIHdoYXQgdGhlIGJlc3Qgbm90YXRpb24gaXMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgbm8KKwkgYmFzZWNsYXNzIG5hbWUuICAqLworICAgICAgZnB1dHNfZmlsdGVyZWQgKGJhc2VuYW1lID8gYmFzZW5hbWUgOiAiIiwgc3RyZWFtKTsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiPiA9ICIsIHN0cmVhbSk7CisKKworICAgICAgaWYgKHNraXAgPj0gMSkKKwlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICI8aW52YWxpZCBhZGRyZXNzPiIpOworICAgICAgZWxzZQorCWNwX3ByaW50X3ZhbHVlX2ZpZWxkcyAoYmFzZWNsYXNzLCByZWFsX3R5cGUsIGJhc2VfdmFsYWRkciwgb2Zmc2V0ICsgYm9mZnNldCwgYWRkcmVzcywKKwkJCSAgICAgICBzdHJlYW0sIGZvcm1hdCwgcmVjdXJzZSwgcHJldHR5LAorCQkJICAgICAgIChzdHJ1Y3QgdHlwZSAqKikgb2JzdGFja19iYXNlICgmZG9udF9wcmludF92Yl9vYnN0YWNrKSwKKwkJCSAgICAgICAwKTsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiLCAiLCBzdHJlYW0pOworCisgICAgZmx1c2hfaXQ6CisgICAgICA7CisgICAgfQorCisgIGlmIChkb250X3ByaW50X3ZiID09IDApCisgICAgeworICAgICAgLyogRnJlZSB0aGUgc3BhY2UgdXNlZCB0byBkZWFsIHdpdGggdGhlIHByaW50aW5nCisJIG9mIHRoaXMgdHlwZSBmcm9tIHRvcCBsZXZlbC4gICovCisgICAgICBvYnN0YWNrX2ZyZWUgKCZkb250X3ByaW50X3ZiX29ic3RhY2ssIGxhc3RfZG9udF9wcmludCk7CisgICAgICAvKiBSZXNldCB3YXRlcm1hcmsgc28gdGhhdCB3ZSBjYW4gY29udGludWUgcHJvdGVjdGluZworCSBvdXJzZWx2ZXMgZnJvbSB3aGF0ZXZlciB3ZSB3ZXJlIHByb3RlY3Rpbmcgb3Vyc2VsdmVzLiAgKi8KKyAgICAgIGRvbnRfcHJpbnRfdmJfb2JzdGFjayA9IHRtcF9vYnN0YWNrOworICAgIH0KK30KKworLyogUHJpbnQgdmFsdWUgb2YgYSBzdGF0aWMgbWVtYmVyLgorICAgVG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uIHdoZW4gcHJpbnRpbmcgYSBjbGFzcyB0aGF0IGNvbnRhaW5zCisgICBhIHN0YXRpYyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MsIHdlIGtlZXAgdGhlIGFkZHJlc3NlcyBvZiBhbGwgcHJpbnRlZAorICAgc3RhdGljIG1lbWJlciBjbGFzc2VzIGluIGFuIG9ic3RhY2sgYW5kIHJlZnVzZSB0byBwcmludCB0aGVtIG1vcmUKKyAgIHRoYW4gb25jZS4KKworICAgVkFMIGNvbnRhaW5zIHRoZSB2YWx1ZSB0byBwcmludCwgVFlQRSwgU1RSRUFNLCBSRUNVUlNFLCBhbmQgUFJFVFRZCisgICBoYXZlIHRoZSBzYW1lIG1lYW5pbmdzIGFzIGluIGNfdmFsX3ByaW50LiAgKi8KKworc3RhdGljIHZvaWQKK2NwX3ByaW50X3N0YXRpY19maWVsZCAodHlwZSwgdmFsLCBzdHJlYW0sIGZvcm1hdCwgcmVjdXJzZSwgcHJldHR5KQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgdmFsdWVfcHRyIHZhbDsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgaW50IGZvcm1hdDsKKyAgICAgaW50IHJlY3Vyc2U7CisgICAgIGVudW0gdmFsX3ByZXR0eXByaW50IHByZXR0eTsKK3sKKyAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1NUUlVDVCkKKyAgICB7CisgICAgICBDT1JFX0FERFIgKmZpcnN0X2RvbnRfcHJpbnQ7CisgICAgICBpbnQgaTsKKworICAgICAgZmlyc3RfZG9udF9wcmludAorCT0gKENPUkVfQUREUiAqKW9ic3RhY2tfYmFzZSAoJmRvbnRfcHJpbnRfc3RhdG1lbV9vYnN0YWNrKTsKKyAgICAgIGkgPSAoQ09SRV9BRERSICopb2JzdGFja19uZXh0X2ZyZWUgKCZkb250X3ByaW50X3N0YXRtZW1fb2JzdGFjaykKKwktIGZpcnN0X2RvbnRfcHJpbnQ7CisKKyAgICAgIHdoaWxlICgtLWkgPj0gMCkKKwl7CisJICBpZiAoVkFMVUVfQUREUkVTUyAodmFsKSA9PSBmaXJzdF9kb250X3ByaW50W2ldKQorCSAgICB7CisJICAgICAgZnB1dHNfZmlsdGVyZWQgKCI8c2FtZSBhcyBzdGF0aWMgbWVtYmVyIG9mIGFuIGFscmVhZHkgc2VlbiB0eXBlPiIsCisJCQkgICAgICBzdHJlYW0pOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0KKworICAgICAgb2JzdGFja19ncm93ICgmZG9udF9wcmludF9zdGF0bWVtX29ic3RhY2ssIChjaGFyICopICZWQUxVRV9BRERSRVNTICh2YWwpLAorCQkgICAgc2l6ZW9mIChDT1JFX0FERFIpKTsKKworICAgICAgQ0hFQ0tfVFlQRURFRiAodHlwZSk7CisgICAgICBjcF9wcmludF92YWx1ZV9maWVsZHMgKHR5cGUsIHR5cGUsIFZBTFVFX0NPTlRFTlRTX0FMTCAodmFsKSwgVkFMVUVfRU1CRURERURfT0ZGU0VUICh2YWwpLCBWQUxVRV9BRERSRVNTICh2YWwpLAorCQkJICAgICBzdHJlYW0sIGZvcm1hdCwgcmVjdXJzZSwgcHJldHR5LCBOVUxMLCAxKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIHZhbF9wcmludCAodHlwZSwgVkFMVUVfQ09OVEVOVFNfQUxMICh2YWwpLCBWQUxVRV9FTUJFRERFRF9PRkZTRVQgKHZhbCksIFZBTFVFX0FERFJFU1MgKHZhbCksCisJICAgICBzdHJlYW0sIGZvcm1hdCwgMCwgcmVjdXJzZSwgcHJldHR5KTsKK30KKwordm9pZAorY3BfcHJpbnRfY2xhc3NfbWVtYmVyICh2YWxhZGRyLCBkb21haW4sIHN0cmVhbSwgcHJlZml4KQorICAgICBjaGFyICp2YWxhZGRyOworICAgICBzdHJ1Y3QgdHlwZSAqZG9tYWluOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBjaGFyICpwcmVmaXg7Cit7CisgIAorICAvKiBWQUwgaXMgYSBieXRlIG9mZnNldCBpbnRvIHRoZSBzdHJ1Y3R1cmUgdHlwZSBET01BSU4uCisgICAgIEZpbmQgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGZvciB0aGF0IG9mZnNldCBhbmQKKyAgICAgcHJpbnQgaXQuICAqLworICBpbnQgZXh0cmEgPSAwOworICBpbnQgYml0cyA9IDA7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOworICB1bnNpZ25lZCBsZW4gPSBUWVBFX05GSUVMRFMgKGRvbWFpbik7CisKKyAgLyogQEAgTWFrZSBWQUwgaW50byBiaXQgb2Zmc2V0ICovCisKKyAgLyogTm90ZTogSFAgYUNDIGdlbmVyYXRlcyBvZmZzZXRzIHRoYXQgYXJlIHRoZSByZWFsIGJ5dGUgb2Zmc2V0cyBhZGRlZAorICAgICB0byBhIGNvbnN0YW50IGJpYXMgMHgyMDAwMDAwMCAoMSA8PCAyOSkuICBUaGlzIGNvbnN0YW50IGJpYXMgZ2V0cworICAgICBzaGlmdGVkIG91dCBpbiB0aGUgY29kZSBiZWxvdyAtLSBqb3lvdXMgaGFwcGVuc3RhbmNlISAqLworCisgIC8qIE5vdGU6IEhQIGNmcm9udCB1c2VzIGEgY29uc3RhbnQgYmlhcyBvZiAxOyBpZiB3ZSBzdXBwb3J0IHRoaXMKKyAgICAgY29tcGlsZXIgZXZlciwgd2Ugd2lsbCBoYXZlIHRvIGFkanVzdCB0aGUgY29tcHV0YXRpb24gYmVsb3cgKi8gCisgIAorICBMT05HRVNUIHZhbCA9IHVucGFja19sb25nIChidWlsdGluX3R5cGVfaW50LCB2YWxhZGRyKSA8PCAzOworICBmb3IgKGkgPSBUWVBFX05fQkFTRUNMQVNTRVMgKGRvbWFpbik7IGkgPCBsZW47IGkrKykKKyAgICB7CisgICAgICBpbnQgYml0cG9zID0gVFlQRV9GSUVMRF9CSVRQT1MgKGRvbWFpbiwgaSk7CisgICAgICBRVUlUOworICAgICAgaWYgKHZhbCA9PSBiaXRwb3MpCisJYnJlYWs7CisgICAgICBpZiAodmFsIDwgYml0cG9zICYmIGkgIT0gMCkKKwl7CisJICAvKiBTb21laG93IHBvaW50aW5nIGludG8gYSBmaWVsZC4gICovCisJICBpIC09IDE7CisJICBleHRyYSA9ICh2YWwgLSBUWVBFX0ZJRUxEX0JJVFBPUyAoZG9tYWluLCBpKSk7CisJICBpZiAoZXh0cmEgJiAweDcpCisJICAgIGJpdHMgPSAxOworCSAgZWxzZQorCSAgICBleHRyYSA+Pj0gMzsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIGlmIChpIDwgbGVuKQorICAgIHsKKyAgICAgIGNoYXIgKm5hbWU7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sIHByZWZpeCk7CisgICAgICBuYW1lID0gdHlwZV9uYW1lX25vX3RhZyAoZG9tYWluKTsKKyAgICAgIGlmIChuYW1lKQorICAgICAgICBmcHV0c19maWx0ZXJlZCAobmFtZSwgc3RyZWFtKTsKKyAgICAgIGVsc2UKKwljX3R5cGVfcHJpbnRfYmFzZSAoZG9tYWluLCBzdHJlYW0sIDAsIDApOworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiOjoiKTsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkIChUWVBFX0ZJRUxEX05BTUUgKGRvbWFpbiwgaSksIHN0cmVhbSk7CisgICAgICBpZiAoZXh0cmEpCisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiICsgJWQgYnl0ZXMiLCBleHRyYSk7CisgICAgICBpZiAoYml0cykKKwlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIgKG9mZnNldCBpbiBiaXRzKSIpOworICAgIH0KKyAgZWxzZQorICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiVkIiwgdmFsID4+IDMpOworfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gcHJpbnRzIG91dCB2aXJ0dWFsIHRhYmxlIGVudHJpZXMgZm9yIGEgY2xhc3M7IGl0CisgKiByZWN1cnNlcyBvbiB0aGUgYmFzZSBjbGFzc2VzIHRvIGZpbmQgYWxsIHZpcnR1YWwgZnVuY3Rpb25zCisgKiBhdmFpbGFibGUgaW4gYSBjbGFzcy4KKyAqCisgKiBwYWkvMTk5Ny0wNS0yMSBOb3RlOiBBcyB0aGUgbmFtZSBzdWdnZXN0cywgaXQncyBjdXJyZW50bHkKKyAqIGltcGxlbWVudGVkIGZvciBIUCBhQ0MgcnVudGltZSBvbmx5LiBnKysgb2JqZWN0cyBhcmUgaGFuZGxlZAorICogZGlmZmVyZW50bHkgYW5kIEkgaGF2ZSBtYWRlIG5vIGF0dGVtcHQgdG8gZm9sZCB0aGF0IGxvZ2ljIGluCisgKiBoZXJlLiBUaGUgcnVudGltZSBsYXlvdXQgaXMgZGlmZmVyZW50IGZvciB0aGUgdHdvIGNhc2VzLiAgQWxzbywKKyAqIHRoaXMgY3VycmVudGx5IGhhcyBvbmx5IHRoZSBjb2RlIGZvciBub24tUlJCQyBsYXlvdXRzIGdlbmVyYXRlZCBieQorICogdGhlIEhQIGFDQyBjb21waWxlcjsgUlJCQyBjb2RlIGlzIHN0dWJiZWQgb3V0IGFuZCB3aWxsIGhhdmUgdG8gYmUKKyAqIGFkZGVkIGxhdGVyLiAqLworIAorCitzdGF0aWMgdm9pZAorY3BfcHJpbnRfaHBhY2NfdmlydHVhbF90YWJsZV9lbnRyaWVzICh0eXBlLCB2ZnVuY3MsIHYsIHN0cmVhbSwgZm9ybWF0LCByZWN1cnNlLCBwcmV0dHkpCisgIHN0cnVjdCB0eXBlICogdHlwZTsKKyAgaW50ICogdmZ1bmNzOworICB2YWx1ZV9wdHIgdjsKKyAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgaW50IGZvcm1hdDsKKyAgaW50IHJlY3Vyc2U7CisgIGVudW0gdmFsX3ByZXR0eXByaW50IHByZXR0eTsKK3sKKyAgaW50IGZuLCBvaTsKKworICAvKiBwYWk6IEZJWE1FIHRoaXMgZnVuY3Rpb24gZG9lc24ndCB3b3JrLiBJdCBzaG91bGQgaGFuZGxlIGEgZ2l2ZW4KKyAgICogdmlydHVhbCBmdW5jdGlvbiBvbmx5IG9uY2UgKGxhdGVzdCByZWRlZmluaXRpb24gaW4gY2xhc3MgaGllcmFyY2h5KQorICAgKi8KKworICAvKiBSZWN1cnNpb24gb24gb3RoZXIgY2xhc3NlcyB0aGF0IGNhbiBzaGFyZSB0aGUgc2FtZSB2dGFibGUgKi8gCisgIHN0cnVjdCB0eXBlICogcGJjID0gcHJpbWFyeV9iYXNlX2NsYXNzICh0eXBlKTsKKyAgaWYgKHBiYykKKyAgICBjcF9wcmludF9ocGFjY192aXJ0dWFsX3RhYmxlX2VudHJpZXMgKHBiYywgdmZ1bmNzLCB2LCBzdHJlYW0sIGZvcm1hdCwgcmVjdXJzZSwgcHJldHR5KTsKKyAgICAgIAorICAvKiBOb3cgZGVhbCB3aXRoIHZmdW5jcyBkZWNsYXJlZCBpbiB0aGlzIGNsYXNzICovCisgIGZvciAoZm4gPSAwOyBmbiA8IFRZUEVfTkZOX0ZJRUxEUyAodHlwZSk7IGZuKyspCisgICAgZm9yIChvaSA9IDA7IG9pIDwgVFlQRV9GTl9GSUVMRExJU1RfTEVOR1RIICh0eXBlLCBmbik7IG9pKyspCisgICAgICBpZiAoVFlQRV9GTl9GSUVMRF9WSVJUVUFMX1AgKFRZUEVfRk5fRklFTERMSVNUMSAodHlwZSwgZm4pLCBvaSkpCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICogdmZfbmFtZTsKKworICAgICAgICAgIC8qIHZpcnR1YWwgZnVuY3Rpb24gb2Zmc2V0ICovCisgICAgICAgICAgaW50IHZ4ID0gVFlQRV9GTl9GSUVMRF9WT0ZGU0VUIChUWVBFX0ZOX0ZJRUxETElTVDEgKHR5cGUsIGZuKSwgb2kpIC0gMTsKKworICAgICAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdmZ1bmN0aW9uIGVudHJ5ICovIAorICAgICAgICAgIHZhbHVlX3B0ciB2ZiA9IHZhbHVlX2NvcHkgKHYpOworICAgICAgICAgIGlmIChWQUxVRV9MQVpZICh2ZikpCisgICAgICAgICAgICAodm9pZCkgdmFsdWVfZmV0Y2hfbGF6eSAodmYpOworICAgICAgICAgIHZmLT5hbGlnbmVyLmNvbnRlbnRzWzBdICs9IDQgKiAoSFBfQUNDX1ZGVU5DX1NUQVJUICsgdngpOyAgLyogYWRqdXN0IGJ5IG9mZnNldCAqLyAKKyAgICAgICAgICB2ZiA9IHZhbHVlX2luZCAodmYpOyAgICAgICAgICAgICAgIC8qIGdldCB0aGUgZW50cnkgKi8gCisgICAgICAgICAgVkFMVUVfVFlQRSAodmYpID0gVkFMVUVfVFlQRSAodik7ICAvKiBtYWtlIGl0IGEgcG9pbnRlciAqLyAKKworICAgICAgICAgIC8qIHByaW50IG91dCB0aGUgZW50cnkgKi8gCisgICAgICAgICAgdmFsX3ByaW50IChWQUxVRV9UWVBFICh2ZiksIFZBTFVFX0NPTlRFTlRTICh2ZiksIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIGZvcm1hdCwgMCwgcmVjdXJzZSArIDEsIHByZXR0eSk7CisgICAgICAgICAgdmZfbmFtZSA9IGNwbHVzX2RlbWFuZ2xlIChUWVBFX0ZOX0ZJRUxEX1BIWVNOQU1FIChUWVBFX0ZOX0ZJRUxETElTVDEgKHR5cGUsIGZuKSwgb2kpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE1HTF9BUk0pOyAgLyogcGFpOiAodGVtcCkgRklYTUUgTWF5YmUgdGhpcyBzaG91bGQgYmUgRE1HTF9BTlNJICovCisgICAgICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiICVzIiwgdmZfbmFtZSk7CisgICAgICAgICAgaWYgKC0tKCp2ZnVuY3MpID4gMCkKKyAgICAgICAgICAgIGZwdXRzX2ZpbHRlcmVkICgiLCAiLCBzdHJlYW0pOworICAgICAgICB9Cit9CisKKworCit2b2lkCitfaW5pdGlhbGl6ZV9jcF92YWxwcmludCAoKQoreworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoInN0YXRpYy1tZW1iZXJzIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCisJCSAgKGNoYXIgKikmc3RhdGljX2ZpZWxkX3ByaW50LAorCQkgICJTZXQgcHJpbnRpbmcgb2YgQysrIHN0YXRpYyBtZW1iZXJzLiIsCisJCSAgJnNldHByaW50bGlzdCksCisgICAgICZzaG93cHJpbnRsaXN0KTsKKyAgLyogVHVybiBvbiBwcmludGluZyBvZiBzdGF0aWMgZmllbGRzLiAgKi8KKyAgc3RhdGljX2ZpZWxkX3ByaW50ID0gMTsKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoInZ0YmwiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwgKGNoYXIgKikmdnRibHByaW50LAorCQkgICJTZXQgcHJpbnRpbmcgb2YgQysrIHZpcnR1YWwgZnVuY3Rpb24gdGFibGVzLiIsCisJCSAgJnNldHByaW50bGlzdCksCisgICAgICZzaG93cHJpbnRsaXN0KTsKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoIm9iamVjdCIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLCAoY2hhciAqKSZvYmplY3RwcmludCwKKwkgICJTZXQgcHJpbnRpbmcgb2Ygb2JqZWN0J3MgZGVyaXZlZCB0eXBlIGJhc2VkIG9uIHZ0YWJsZSBpbmZvLiIsCisJCSAgJnNldHByaW50bGlzdCksCisgICAgICZzaG93cHJpbnRsaXN0KTsKKworICAvKiBHaXZlIHBlb3BsZSB0aGUgZGVmYXVsdHMgd2hpY2ggdGhleSBhcmUgdXNlZCB0by4gICovCisgIG9iamVjdHByaW50ID0gMDsKKyAgdnRibHByaW50ID0gMDsKKyAgb2JzdGFja19iZWdpbiAoJmRvbnRfcHJpbnRfdmJfb2JzdGFjaywgMzIgKiBzaXplb2YgKHN0cnVjdCB0eXBlICopKTsKKyAgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb24gKCZkb250X3ByaW50X3N0YXRtZW1fb2JzdGFjaywKKwkJCSAgICAgIDMyICogc2l6ZW9mIChDT1JFX0FERFIpLCBzaXplb2YgKENPUkVfQUREUiksCisJCQkgICAgICB4bWFsbG9jLCBmcmVlKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9jcHUzMmJ1Zy1yb20uYyBiL2dkYi9jcHUzMmJ1Zy1yb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NThjOGNhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2NwdTMyYnVnLXJvbS5jCkBAIC0wLDAgKzEsMTY3IEBACisvKiBSZW1vdGUgZGVidWdnaW5nIGludGVyZmFjZSBmb3IgQ1BVMzJCdWcgUm9tIG1vbml0b3IgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBXcml0dGVuIGJ5IFN0dSBHcm9zc21hbiBvZiBDeWdudXMgU3VwcG9ydAorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgIm1vbml0b3IuaCIKKyNpbmNsdWRlICJzZXJpYWwuaCIKKworc3RhdGljIHZvaWQgY3B1MzJidWdfb3BlbiBQQVJBTVMgKChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpKTsKKworc3RhdGljIHZvaWQKK2NwdTMyYnVnX3N1cHBseV9yZWdpc3RlciAocmVnbmFtZSwgcmVnbmFtZWxlbiwgdmFsLCB2YWxsZW4pCisgICAgIGNoYXIgKnJlZ25hbWU7CisgICAgIGludCByZWduYW1lbGVuOworICAgICBjaGFyICp2YWw7CisgICAgIGludCB2YWxsZW47Cit7CisgIGludCByZWdubzsKKworICBpZiAocmVnbmFtZWxlbiAhPSAyKQorICAgIHJldHVybjsKKworICBzd2l0Y2ggKHJlZ25hbWVbMF0pCisgICAgeworICAgIGNhc2UgJ1MnOgorICAgICAgaWYgKHJlZ25hbWVbMV0gIT0gJ1InKQorCXJldHVybjsKKyAgICAgIHJlZ25vID0gUFNfUkVHTlVNOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnUCc6CisgICAgICBpZiAocmVnbmFtZVsxXSAhPSAnQycpCisJcmV0dXJuOworICAgICAgcmVnbm8gPSBQQ19SRUdOVU07CisgICAgICBicmVhazsKKyAgICBjYXNlICdEJzoKKyAgICAgIGlmIChyZWduYW1lWzFdIDwgJzAnIHx8IHJlZ25hbWVbMV0gPiAnNycpCisJcmV0dXJuOworICAgICAgcmVnbm8gPSByZWduYW1lWzFdIC0gJzAnICsgRDBfUkVHTlVNOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnQSc6CisgICAgICBpZiAocmVnbmFtZVsxXSA8ICcwJyB8fCByZWduYW1lWzFdID4gJzcnKQorCXJldHVybjsKKyAgICAgIHJlZ25vID0gcmVnbmFtZVsxXSAtICcwJyArIEEwX1JFR05VTTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm47CisgICAgfQorCisgIG1vbml0b3Jfc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgdmFsKTsKK30KKworLyoKKyAqIFRoaXMgYXJyYXkgb2YgcmVnaXN0ZXJzIG5lZWRzIHRvIG1hdGNoIHRoZSBpbmRleGVzIHVzZWQgYnkgR0RCLiBUaGUKKyAqIHdob2xlIHJlYXNvbiB0aGlzIGV4aXN0cyBpcyBiZWNhdXNlIHRoZSB2YXJpb3VzIFJPTSBtb25pdG9ycyB1c2UKKyAqIGRpZmZlcmVudCBuYW1lcyB0aGFuIEdEQiBkb2VzLCBhbmQgZG9uJ3Qgc3VwcG9ydCBhbGwgdGhlCisgKiByZWdpc3RlcnMgZWl0aGVyLiBTbywgdHlwaW5nICJpbmZvIHJlZyBzcCIgYmVjb21lcyBhbiAiQTciLgorICovCisKK3N0YXRpYyBjaGFyICpjcHUzMmJ1Z19yZWduYW1lc1tOVU1fUkVHU10gPQoreworICAiRDAiLCAiRDEiLCAiRDIiLCAiRDMiLCAiRDQiLCAiRDUiLCAiRDYiLCAiRDciLAorICAiQTAiLCAiQTEiLCAiQTIiLCAiQTMiLCAiQTQiLCAiQTUiLCAiQTYiLCAiQTciLAorICAiU1IiLCAiUEMiLAorfTsKKworLyoKKyAqIERlZmluZSB0aGUgbW9uaXRvciBjb21tYW5kIHN0cmluZ3MuIFNpbmNlIHRoZXNlIGFyZSBwYXNzZWQgZGlyZWN0bHkKKyAqIHRocm91Z2ggdG8gYSBwcmludGYgc3R5bGUgZnVuY3Rpb24sIHdlIG5lZWQgY2FuIGluY2x1ZGUgZm9ybWF0dGluZworICogc3RyaW5ncy4gV2UgYWxzbyBuZWVkIGEgQ1Igb3IgTEYgb24gdGhlIGVuZC4KKyAqLworCitzdGF0aWMgc3RydWN0IHRhcmdldF9vcHMgY3B1MzJidWdfb3BzOworCitzdGF0aWMgY2hhciAqY3B1MzJidWdfaW5pdHNbXSA9IHsiXHIiLCBOVUxMfTsKKworc3RhdGljIHN0cnVjdCBtb25pdG9yX29wcyBjcHUzMmJ1Z19jbWRzIDsKKworc3RhdGljIHZvaWQgCitpbml0X2NwdTMyYnVnX2NtZHModm9pZCkKK3sKKyAgY3B1MzJidWdfY21kcy5mbGFncyA9ICAgTU9fQ0xSX0JSRUFLX1VTRVNfQUREUjsKKyAgY3B1MzJidWdfY21kcy5pbml0ID0gICBjcHUzMmJ1Z19pbml0czsJCS8qIEluaXQgc3RyaW5ncyAqLworICBjcHUzMmJ1Z19jbWRzLmNvbnQgPSAgICJnXHIiOwkJCS8qIGNvbnRpbnVlIGNvbW1hbmQgKi8KKyAgY3B1MzJidWdfY21kcy5zdGVwID0gICAidFxyIjsJCQkvKiBzaW5nbGUgc3RlcCAqLworICBjcHUzMmJ1Z19jbWRzLnN0b3AgPSAgIE5VTEw7CQkJCS8qIGludGVycnVwdCBjb21tYW5kICovCisgIGNwdTMyYnVnX2NtZHMuc2V0X2JyZWFrID0gICAiYnIgJXhcciI7CQkJLyogc2V0IGEgYnJlYWtwb2ludCAqLworICBjcHUzMmJ1Z19jbWRzLmNscl9icmVhayA9ICAgIm5vYnIgJXhcciI7CQkJLyogY2xlYXIgYSBicmVha3BvaW50ICovCisgIGNwdTMyYnVnX2NtZHMuY2xyX2FsbF9icmVhayA9ICAgIm5vYnJcciI7CQkJLyogY2xlYXIgYWxsIGJyZWFrcG9pbnRzICovCisgIGNwdTMyYnVnX2NtZHMuZmlsbCA9ICAgImJmICV4OiV4ICV4O2JcciI7CQkvKiBmaWxsIChzdGFydCBjb3VudCB2YWwpICovCisgIGNwdTMyYnVnX2NtZHMuc2V0bWVtLmNtZGIgPSAgICAgIm1zICV4ICUwMnhcciI7CQkvKiBzZXRtZW0uY21kYiAoYWRkciwgdmFsdWUpICovCisgIGNwdTMyYnVnX2NtZHMuc2V0bWVtLmNtZHcgPSAgICAgIm1zICV4ICUwNHhcciI7CQkvKiBzZXRtZW0uY21kdyAoYWRkciwgdmFsdWUpICovCisgIGNwdTMyYnVnX2NtZHMuc2V0bWVtLmNtZGwgPSAgICAgIm1zICV4ICUwOHhcciI7CQkvKiBzZXRtZW0uY21kbCAoYWRkciwgdmFsdWUpICovCisgIGNwdTMyYnVnX2NtZHMuc2V0bWVtLmNtZGxsID0gICAgIE5VTEw7CQkJLyogc2V0bWVtLmNtZGxsIChhZGRyLCB2YWx1ZSkgKi8KKyAgY3B1MzJidWdfY21kcy5zZXRtZW0ucmVzcF9kZWxpbSA9ICAgICBOVUxMOwkJCS8qIHNldHJlZy5yZXNwX2RlbGltICovCisgIGNwdTMyYnVnX2NtZHMuc2V0bWVtLnRlcm0gPSAgICAgTlVMTDsJCQkvKiBzZXRyZWcudGVybSAqLworICBjcHUzMmJ1Z19jbWRzLnNldG1lbS50ZXJtX2NtZCA9ICAgICBOVUxMOwkJCS8qIHNldHJlZy50ZXJtX2NtZCAqLworICBjcHUzMmJ1Z19jbWRzLmdldG1lbS5jbWRiID0gICAgICJtZCAleDoleDtiXHIiOwkJLyogZ2V0bWVtLmNtZGIgKGFkZHIsIGxlbikgKi8KKyAgY3B1MzJidWdfY21kcy5nZXRtZW0uY21kdyA9ICAgICAibWQgJXg6JXg7YlxyIjsJCS8qIGdldG1lbS5jbWR3IChhZGRyLCBsZW4pICovCisgIGNwdTMyYnVnX2NtZHMuZ2V0bWVtLmNtZGwgPSAgICAgIm1kICV4OiV4O2JcciI7CQkvKiBnZXRtZW0uY21kbCAoYWRkciwgbGVuKSAqLworICBjcHUzMmJ1Z19jbWRzLmdldG1lbS5jbWRsbCA9ICAgICBOVUxMOwkJCS8qIGdldG1lbS5jbWRsbCAoYWRkciwgbGVuKSAqLworICBjcHUzMmJ1Z19jbWRzLmdldG1lbS5yZXNwX2RlbGltID0gICAgICIgIjsJCQkvKiBnZXRtZW0ucmVzcF9kZWxpbSAqLworICBjcHUzMmJ1Z19jbWRzLmdldG1lbS50ZXJtID0gICAgIE5VTEw7CQkJLyogZ2V0bWVtLnRlcm0gKi8KKyAgY3B1MzJidWdfY21kcy5nZXRtZW0udGVybV9jbWQgPSAgICAgTlVMTDsJCQkvKiBnZXRtZW0udGVybV9jbWQgKi8KKyAgY3B1MzJidWdfY21kcy5zZXRyZWcuY21kID0gICAgICJycyAlcyAleFxyIjsJCS8qIHNldHJlZy5jbWQgKG5hbWUsIHZhbHVlKSAqLworICBjcHUzMmJ1Z19jbWRzLnNldHJlZy5yZXNwX2RlbGltID0gICAgIE5VTEw7CQkJLyogc2V0cmVnLnJlc3BfZGVsaW0gKi8KKyAgY3B1MzJidWdfY21kcy5zZXRyZWcudGVybSA9ICAgICBOVUxMOwkJCS8qIHNldHJlZy50ZXJtICovCisgIGNwdTMyYnVnX2NtZHMuc2V0cmVnLnRlcm1fY21kID0gICAgIE5VTEw7CQkJLyogc2V0cmVnLnRlcm1fY21kICovCisgIGNwdTMyYnVnX2NtZHMuZ2V0cmVnLmNtZCA9ICAgICAicnMgJXNcciI7CQkJLyogZ2V0cmVnLmNtZCAobmFtZSkgKi8KKyAgY3B1MzJidWdfY21kcy5nZXRyZWcucmVzcF9kZWxpbSA9ICAgICAiPSI7CQkJLyogZ2V0cmVnLnJlc3BfZGVsaW0gKi8KKyAgY3B1MzJidWdfY21kcy5nZXRyZWcudGVybSA9ICAgICBOVUxMOwkJCS8qIGdldHJlZy50ZXJtICovCisgIGNwdTMyYnVnX2NtZHMuZ2V0cmVnLnRlcm1fY21kID0gICAgIE5VTEwgOwkJCS8qIGdldHJlZy50ZXJtX2NtZCAqLworICBjcHUzMmJ1Z19jbWRzLmR1bXBfcmVnaXN0ZXJzID0gICAicmRcciI7CQkJLyogZHVtcF9yZWdpc3RlcnMgKi8KKyAgY3B1MzJidWdfY21kcy5yZWdpc3Rlcl9wYXR0ZXJuID0gICAiXFwoXFx3K1xcKSArPVxcKFswLTlhLWZBLUZdK1xcYlxcKSI7IC8qIHJlZ2lzdGVyX3BhdHRlcm4gKi8KKyAgY3B1MzJidWdfY21kcy5zdXBwbHlfcmVnaXN0ZXIgPSAgIGNwdTMyYnVnX3N1cHBseV9yZWdpc3RlcjsJLyogc3VwcGx5X3JlZ2lzdGVyICovCisgIGNwdTMyYnVnX2NtZHMubG9hZF9yb3V0aW5lID0gICBOVUxMOwkJCQkvKiBsb2FkX3JvdXRpbmUgKGRlZmF1bHRzIHRvIFNSRUNzKSAqLworICBjcHUzMmJ1Z19jbWRzLmxvYWQgPSAgICJsb1xyIjsJCQkvKiBkb3dubG9hZCBjb21tYW5kICovCisgIGNwdTMyYnVnX2NtZHMubG9hZHJlc3AgPSAgICJcbiI7CQkJCS8qIGxvYWQgcmVzcG9uc2UgKi8KKyAgY3B1MzJidWdfY21kcy5wcm9tcHQgPSAgICJDUFUzMkJ1Zz4iOwkJCS8qIG1vbml0b3IgY29tbWFuZCBwcm9tcHQgKi8KKyAgY3B1MzJidWdfY21kcy5saW5lX3Rlcm0gPSAgICJcciI7CQkJCS8qIGVuZC1vZi1saW5lIHRlcm1pbmF0b3IgKi8KKyAgY3B1MzJidWdfY21kcy5jbWRfZW5kID0gICBOVUxMOwkJCQkvKiBvcHRpb25hbCBjb21tYW5kIHRlcm1pbmF0b3IgKi8KKyAgY3B1MzJidWdfY21kcy50YXJnZXQgPSAgICZjcHUzMmJ1Z19vcHM7CQkvKiB0YXJnZXQgb3BlcmF0aW9ucyAqLworICBjcHUzMmJ1Z19jbWRzLnN0b3BiaXRzID0gICBTRVJJQUxfMV9TVE9QQklUUzsJCS8qIG51bWJlciBvZiBzdG9wIGJpdHMgKi8KKyAgY3B1MzJidWdfY21kcy5yZWduYW1lcyA9ICAgY3B1MzJidWdfcmVnbmFtZXM7CQkvKiByZWdpc3RlcnMgbmFtZXMgKi8KKyAgY3B1MzJidWdfY21kcy5tYWdpYyA9ICAgTU9OSVRPUl9PUFNfTUFHSUM7CQkvKiBtYWdpYyAqLworfTsgLyogaW5pdF9jcHUzMmJ1Z19jbWRzICovCisKK3N0YXRpYyB2b2lkCitjcHUzMmJ1Z19vcGVuKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIG1vbml0b3Jfb3BlbiAoYXJncywgJmNwdTMyYnVnX2NtZHMsIGZyb21fdHR5KTsKK30KKwordm9pZAorX2luaXRpYWxpemVfY3B1MzJidWdfcm9tICgpCit7CisgIGluaXRfY3B1MzJidWdfY21kcygpIDsKKyAgaW5pdF9tb25pdG9yX29wcyAoJmNwdTMyYnVnX29wcyk7CisKKyAgY3B1MzJidWdfb3BzLnRvX3Nob3J0bmFtZSA9ICJjcHUzMmJ1ZyI7CisgIGNwdTMyYnVnX29wcy50b19sb25nbmFtZSA9ICJDUFUzMkJ1ZyBtb25pdG9yIjsKKyAgY3B1MzJidWdfb3BzLnRvX2RvYyA9ICJEZWJ1ZyB2aWEgdGhlIENQVTMyQnVnIG1vbml0b3IuXG5cCitTcGVjaWZ5IHRoZSBzZXJpYWwgZGV2aWNlIGl0IGlzIGNvbm5lY3RlZCB0byAoZS5nLiAvZGV2L3R0eWEpLiI7CisgIGNwdTMyYnVnX29wcy50b19vcGVuID0gY3B1MzJidWdfb3BlbjsKKworICBhZGRfdGFyZ2V0ICgmY3B1MzJidWdfb3BzKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9jeHV4LW5hdC5jIGIvZ2RiL2N4dXgtbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0YjZmMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9jeHV4LW5hdC5jCkBAIC0wLDAgKzEsNTIzIEBACisvKiBOYXRpdmUgc3VwcG9ydCBmb3IgTW90b3JvbGEgODhrIHJ1bm5pbmcgSGFycmlzIENYL1VYLgorICAgQ29weXJpZ2h0IDE5ODgsIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgPHN5cy91c2VyLmg+CisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKworI2lmbmRlZiBVU0VSCQkJLyogYWRkZWQgdG8gc3VwcG9ydCBCQ1MgcHRyYWNlX3VzZXIgKi8KKyNkZWZpbmUgVVNFUiBwdHJhY2VfdXNlcgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgImdkYl9zdGF0LmgiCisKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJzZXRqbXAuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorCisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorCisvKiBDWC9VWCBwcm92aWRlcyB0aGVtIGFscmVhZHksIGJ1dCBhcyB3b3JkIG9mZnNldHMgaW5zdGVhZCBvZiBjaGFyIG9mZnNldHMgKi8KKyNkZWZpbmUgU1hJUF9PRkZTRVQgKFBUX1NYSVAgKiA0KQorI2RlZmluZSBTTklQX09GRlNFVCAoUFRfU05JUCAqIDQpCisjZGVmaW5lIFNGSVBfT0ZGU0VUIChQVF9TRklQICogNCkKKyNkZWZpbmUgUFNSX09GRlNFVCAgKFBUX1BTUiAgKiBzaXplb2YoaW50KSkKKyNkZWZpbmUgRlBTUl9PRkZTRVQgKFBUX0ZQU1IgKiBzaXplb2YoaW50KSkKKyNkZWZpbmUgRlBDUl9PRkZTRVQgKFBUX0ZQQ1IgKiBzaXplb2YoaW50KSkKKworI2RlZmluZSBYUkVHQUREUihyKSAoKChjaGFyICopJnUucHRfeDAtKGNoYXIgKikmdSkgKyBcCisgICAgICAgICAgICAgICAgICAgICAoKHIpLVgwX1JFR05VTSkqc2l6ZW9mKFhfUkVHSVNURVJfUkFXX1RZUEUpKQorCitleHRlcm4gaW50IGhhdmVfc3ltYm9sX2ZpbGVfcCgpOworCitleHRlcm4gam1wX2J1ZiBzdGFja19qbXA7CisKK2V4dGVybiBpbnQgZXJybm87CitleHRlcm4gY2hhciByZWdpc3RlcnNbUkVHSVNURVJfQllURVNdOworCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87CQkvKiBPcmlnaW5hbCB2YWx1ZSBkaXNjYXJkZWQgKi8KK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHJlZ2FkZHI7CisgIGNoYXIgYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisgIHJlZ2lzdGVyIGludCBpOworCisgIHN0cnVjdCBVU0VSIHU7CisgIHVuc2lnbmVkIGludCBvZmZzZXQ7CisKKyAgb2Zmc2V0ID0gKGNoYXIgKikgJnUucHRfcjAgLSAoY2hhciAqKSAmdTsgCisgIHJlZ2FkZHIgPSBvZmZzZXQ7IC8qIGJ5dGUgb2Zmc2V0IHRvIHIwOyovCisKKy8qICBvZmZzZXQgPSBwdHJhY2UgKDMsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIG9mZnNldCwgMCkgLSBLRVJORUxfVV9BRERSOyAqLworICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCBQQ19SRUdOVU07IHJlZ25vKyspCisgICAgeworICAgICAgLypyZWdhZGRyID0gcmVnaXN0ZXJfYWRkciAocmVnbm8sIG9mZnNldCk7Ki8KKwkvKiA4OGsgZW5oYW5jZW1lbnQgICovCisgICAgICAgIAorICAgICAgZm9yIChpID0gMDsgaSA8IFJFR0lTVEVSX1JBV19TSVpFIChyZWdubyk7IGkgKz0gc2l6ZW9mIChpbnQpKQorIAl7CisgCSAgKihpbnQgKikgJmJ1ZltpXSA9IHB0cmFjZSAoMywgaW5mZXJpb3JfcGlkLAorCQkJCSAgICAgKFBUUkFDRV9BUkczX1RZUEUpIHJlZ2FkZHIsIDApOworIAkgIHJlZ2FkZHIgKz0gc2l6ZW9mIChpbnQpOworIAl9CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCBidWYpOworICAgIH0KKyAgICAvKiBub3cgbG9hZCB1cCByZWdpc3RlcnMgMzItMzc7IHNwZWNpYWwgcGMgcmVnaXN0ZXJzICovCisgICAgKihpbnQgKikgJmJ1ZlswXSA9IHB0cmFjZSAoMywgaW5mZXJpb3JfcGlkLAorCQkJICAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSBQU1JfT0ZGU0VULDApOworICAgIHN1cHBseV9yZWdpc3RlciAoUFNSX1JFR05VTSwgYnVmKTsKKyAgICAqKGludCAqKSAmYnVmWzBdID0gcHRyYWNlICgzLCBpbmZlcmlvcl9waWQsCisJCQkgICAgICAgKFBUUkFDRV9BUkczX1RZUEUpIEZQU1JfT0ZGU0VULDApOworICAgIHN1cHBseV9yZWdpc3RlciAoRlBTUl9SRUdOVU0sIGJ1Zik7CisgICAgKihpbnQgKikgJmJ1ZlswXSA9IHB0cmFjZSAoMywgaW5mZXJpb3JfcGlkLAorCQkJICAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSBGUENSX09GRlNFVCwwKTsKKyAgICBzdXBwbHlfcmVnaXN0ZXIgKEZQQ1JfUkVHTlVNLCBidWYpOworICAgICooaW50ICopICZidWZbMF0gPSBwdHJhY2UgKDMsaW5mZXJpb3JfcGlkLAorCQkJICAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSBTWElQX09GRlNFVCAsMCk7CisgICAgc3VwcGx5X3JlZ2lzdGVyIChTWElQX1JFR05VTSwgYnVmKTsKKyAgICAqKGludCAqKSAmYnVmWzBdID0gcHRyYWNlICgzLCBpbmZlcmlvcl9waWQsCisJCQkgICAgICAgKFBUUkFDRV9BUkczX1RZUEUpIFNOSVBfT0ZGU0VULDApOworICAgIHN1cHBseV9yZWdpc3RlciAoU05JUF9SRUdOVU0sIGJ1Zik7CisgICAgKihpbnQgKikgJmJ1ZlswXSA9IHB0cmFjZSAoMywgaW5mZXJpb3JfcGlkLAorCQkJICAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSBTRklQX09GRlNFVCwwKTsKKyAgICBzdXBwbHlfcmVnaXN0ZXIgKFNGSVBfUkVHTlVNLCBidWYpOworCisgICAgaWYgKHRhcmdldF9pc19tODgxMTApIAorICAgICAgeworICAgICAgICBmb3IgKHJlZ2FkZHIgPSBYUkVHQUREUihYMF9SRUdOVU0pLCByZWdubyA9IFgwX1JFR05VTTsKKyAgICAgICAgICAgICByZWdubyA8IE5VTV9SRUdTOyAKKyAgICAgICAgICAgICByZWdubysrLCByZWdhZGRyICs9IDE2KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFhfUkVHSVNURVJfUkFXX1RZUEUgeHZhbDsKKworICAgICAgICAgICAgKihpbnQgKikgJnh2YWwudzEgPSBwdHJhY2UgKDMsIGluZmVyaW9yX3BpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnYWRkciwgMCk7CisgICAgICAgICAgICAqKGludCAqKSAmeHZhbC53MiA9IHB0cmFjZSAoMywgaW5mZXJpb3JfcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSAocmVnYWRkcis0KSwgMCk7CisgICAgICAgICAgICAqKGludCAqKSAmeHZhbC53MyA9IHB0cmFjZSAoMywgaW5mZXJpb3JfcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSAocmVnYWRkcis4KSwgMCk7CisgICAgICAgICAgICAqKGludCAqKSAmeHZhbC53NCA9IHB0cmFjZSAoMywgaW5mZXJpb3JfcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSAocmVnYWRkcisxMiksIDApOworICAgICAgICAgICAgc3VwcGx5X3JlZ2lzdGVyKHJlZ25vLCAodm9pZCAqKSZ4dmFsKTsKKyAgICAgICAgICB9CisgICAgICB9Cit9CisKKy8qIFN0b3JlIG91ciByZWdpc3RlciB2YWx1ZXMgYmFjayBpbnRvIHRoZSBpbmZlcmlvci4KKyAgIElmIFJFR05PIGlzIC0xLCBkbyB0aGlzIGZvciBhbGwgcmVnaXN0ZXJzLgorICAgT3RoZXJ3aXNlLCBSRUdOTyBzcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXIgKHNvIHdlIGNhbiBzYXZlIHRpbWUpLiAgKi8KKwordm9pZAorc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgcmVnYWRkcjsKKyAgY2hhciBidWZbODBdOworCisgIHN0cnVjdCBVU0VSIHU7CisKKyAgdW5zaWduZWQgaW50IG9mZnNldCA9IChjaGFyICopICZ1LnB0X3IwIC0gKGNoYXIgKikgJnU7CisKKyAgcmVnYWRkciA9IG9mZnNldDsKKworICAvKiBEb24ndCB0cnkgdG8gZGVhbCB3aXRoIEVYSVBfUkVHTlVNIG9yIEVOSVBfUkVHTlVNLCBiZWNhdXNlIEkgdGhpbmsgZWl0aGVyCisgICAgIHN2cjMgZG9lc24ndCBydW4gb24gYW4gODgxMTAsIG9yIHRoZSBrZXJuZWwgaXNvbGF0ZXMgdGhlIGRpZmZlcmVudCAobm90CisgICAgIGNvbXBsZXRlbHkgc3VyZSB0aGlzIGlzIHRydWUsIGJ1dCBzZWVtcyB0byBiZS4gICovCisgIGlmIChyZWdubyA+PSAwKQorICAgIHsKKyAgICAgIC8qICAgICAgcmVnYWRkciA9IHJlZ2lzdGVyX2FkZHIgKHJlZ25vLCBvZmZzZXQpOyAqLworICAgICAgaWYgKHJlZ25vIDwgUENfUkVHTlVNKQorCXsgCisJICByZWdhZGRyID0gb2Zmc2V0ICsgcmVnbm8gKiBzaXplb2YgKGludCk7CisJICBlcnJubyA9IDA7CisJICBwdHJhY2UgKDYsIGluZmVyaW9yX3BpZCwKKwkJICAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnYWRkciwgcmVhZF9yZWdpc3RlciAocmVnbm8pKTsKKwkgIGlmIChlcnJubyAhPSAwKQorCSAgICB7CisJICAgICAgc3ByaW50ZiAoYnVmLCAid3JpdGluZyByZWdpc3RlciBudW1iZXIgJWQiLCByZWdubyk7CisJICAgICAgcGVycm9yX3dpdGhfbmFtZSAoYnVmKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKHJlZ25vID09IFBTUl9SRUdOVU0pCisgICAgICAgIHB0cmFjZSAoNiwgaW5mZXJpb3JfcGlkLAorCQkoUFRSQUNFX0FSRzNfVFlQRSkgUFNSX09GRlNFVCwgcmVhZF9yZWdpc3RlcihyZWdubykpOworICAgICAgZWxzZSBpZiAocmVnbm8gPT0gRlBTUl9SRUdOVU0pCisgICAgICAgIHB0cmFjZSAoNiwgaW5mZXJpb3JfcGlkLAorCQkoUFRSQUNFX0FSRzNfVFlQRSkgRlBTUl9PRkZTRVQsIHJlYWRfcmVnaXN0ZXIocmVnbm8pKTsKKyAgICAgIGVsc2UgaWYgKHJlZ25vID09IEZQQ1JfUkVHTlVNKQorICAgICAgICBwdHJhY2UgKDYsIGluZmVyaW9yX3BpZCwKKwkgICAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSBGUENSX09GRlNFVCwgcmVhZF9yZWdpc3RlcihyZWdubykpOworICAgICAgZWxzZSBpZiAocmVnbm8gPT0gU1hJUF9SRUdOVU0pCisJcHRyYWNlICg2LCBpbmZlcmlvcl9waWQsCisJCShQVFJBQ0VfQVJHM19UWVBFKSBTWElQX09GRlNFVCwgcmVhZF9yZWdpc3RlcihyZWdubykpOworICAgICAgZWxzZSBpZiAocmVnbm8gPT0gU05JUF9SRUdOVU0pCisJcHRyYWNlICg2LCBpbmZlcmlvcl9waWQsCisJCShQVFJBQ0VfQVJHM19UWVBFKSBTTklQX09GRlNFVCwgcmVhZF9yZWdpc3RlcihyZWdubykpOworICAgICAgZWxzZSBpZiAocmVnbm8gPT0gU0ZJUF9SRUdOVU0pCisJcHRyYWNlICg2LCBpbmZlcmlvcl9waWQsCisJCShQVFJBQ0VfQVJHM19UWVBFKSBTRklQX09GRlNFVCwgcmVhZF9yZWdpc3RlcihyZWdubykpOworICAgICAgZWxzZSBpZiAodGFyZ2V0X2lzX204ODExMCAmJiByZWdubyA8IE5VTV9SRUdTKQorICAgICAgICB7CisgICAgICAgICAgWF9SRUdJU1RFUl9SQVdfVFlQRSB4dmFsOworICAgICAgICAgIAorICAgICAgICAgIHJlYWRfcmVnaXN0ZXJfYnl0ZXMoUkVHSVNURVJfQllURShyZWdubyksIChjaGFyICopJnh2YWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFhfUkVHSVNURVJfUkFXX1RZUEUpKTsKKyAgICAgICAgICByZWdhZGRyID0gWFJFR0FERFIocmVnbm8pOworICAgICAgICAgIHB0cmFjZSAoNiwgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnYWRkciwgeHZhbC53MSk7CisgICAgICAgICAgcHRyYWNlICg2LCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSByZWdhZGRyKzQsIHh2YWwudzIpOworICAgICAgICAgIHB0cmFjZSAoNiwgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnYWRkcis4LCB4dmFsLnczKTsKKyAgICAgICAgICBwdHJhY2UgKDYsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIHJlZ2FkZHIrMTIsIHh2YWwudzQpOworICAgICAgICB9CisgICAgICBlbHNlCisJcHJpbnRmX3VuZmlsdGVyZWQgKCJCYWQgcmVnaXN0ZXIgbnVtYmVyIGZvciBzdG9yZV9pbmZlcmlvciByb3V0aW5lXG4iKTsKKyAgICB9CisgIGVsc2UKKyAgICB7IAorICAgICAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgUENfUkVHTlVNOyByZWdubysrKQorCXsKKwkgIC8qICAgICAgcmVnYWRkciA9IHJlZ2lzdGVyX2FkZHIgKHJlZ25vLCBvZmZzZXQpOyAqLworCSAgZXJybm8gPSAwOworCSAgcmVnYWRkciA9IG9mZnNldCArIHJlZ25vICogc2l6ZW9mIChpbnQpOworCSAgcHRyYWNlICg2LCBpbmZlcmlvcl9waWQsCisJCSAgKFBUUkFDRV9BUkczX1RZUEUpIHJlZ2FkZHIsIHJlYWRfcmVnaXN0ZXIgKHJlZ25vKSk7CisJICBpZiAoZXJybm8gIT0gMCkKKwkgICAgeworCSAgICAgIHNwcmludGYgKGJ1ZiwgIndyaXRpbmcgcmVnaXN0ZXIgbnVtYmVyICVkIiwgcmVnbm8pOworCSAgICAgIHBlcnJvcl93aXRoX25hbWUgKGJ1Zik7CisJICAgIH0KKwl9CisgICAgICBwdHJhY2UgKDYsIGluZmVyaW9yX3BpZCwKKyAgICAgICAgICAgICAgKFBUUkFDRV9BUkczX1RZUEUpIFBTUl9PRkZTRVQsIHJlYWRfcmVnaXN0ZXIocmVnbm8pKTsKKyAgICAgIHB0cmFjZSAoNiwgaW5mZXJpb3JfcGlkLAorICAgICAgICAgICAgICAoUFRSQUNFX0FSRzNfVFlQRSkgRlBTUl9PRkZTRVQscmVhZF9yZWdpc3RlcihyZWdubykpOworICAgICAgcHRyYWNlICg2LCBpbmZlcmlvcl9waWQsCisgICAgICAgICAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSBGUENSX09GRlNFVCxyZWFkX3JlZ2lzdGVyKHJlZ25vKSk7CisgICAgICBwdHJhY2UgKDYsaW5mZXJpb3JfcGlkLAorCSAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSBTWElQX09GRlNFVCxyZWFkX3JlZ2lzdGVyKFNYSVBfUkVHTlVNKSk7CisgICAgICBwdHJhY2UgKDYsaW5mZXJpb3JfcGlkLAorCSAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSBTTklQX09GRlNFVCxyZWFkX3JlZ2lzdGVyKFNOSVBfUkVHTlVNKSk7CisgICAgICBwdHJhY2UgKDYsaW5mZXJpb3JfcGlkLAorCSAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSBTRklQX09GRlNFVCxyZWFkX3JlZ2lzdGVyKFNGSVBfUkVHTlVNKSk7CisgICAgICBpZiAodGFyZ2V0X2lzX204ODExMCkKKyAgICAgICAgeworICAgICAgICAgIGZvciAocmVnbm8gPSBYMF9SRUdOVU07IHJlZ25vIDwgTlVNX1JFR1M7IHJlZ25vKyspIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICBYX1JFR0lTVEVSX1JBV19UWVBFIHh2YWw7CisgICAgIAorICAgICAgICAgICAgICByZWFkX3JlZ2lzdGVyX2J5dGVzKFJFR0lTVEVSX0JZVEUocmVnbm8pLCAoY2hhciAqKSZ4dmFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoWF9SRUdJU1RFUl9SQVdfVFlQRSkpOworICAgICAgICAgICAgICByZWdhZGRyID0gWFJFR0FERFIocmVnbm8pOworICAgICAgICAgICAgICBwdHJhY2UgKDYsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIHJlZ2FkZHIsIHh2YWwudzEpOworICAgICAgICAgICAgICBwdHJhY2UgKDYsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIChyZWdhZGRyKzQpLCB4dmFsLncyKTsKKyAgICAgICAgICAgICAgcHRyYWNlICg2LCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSAocmVnYWRkcis4KSwgeHZhbC53Myk7CisgICAgICAgICAgICAgIHB0cmFjZSAoNiwgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgKHJlZ2FkZHIrMTIpLCB4dmFsLnc0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyogYmxvY2tlbmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgdXNlciBzdHJ1Y3R1cmUgKi8KKworbTg4a19yZWdpc3Rlcl91X2FkZHIgKGJsb2NrZW5kLCByZWdudW0pCisgICAgIGludCBibG9ja2VuZCwgcmVnbnVtOworeworICBzdHJ1Y3QgVVNFUiB1OworICBpbnQgdXN0YXJ0ID0gYmxvY2tlbmQgLSBzaXplb2YgKHN0cnVjdCBVU0VSKTsKKworICBpZiAocmVnbnVtIDwgUFNSX1JFR05VTSkKKyAgICAgIHJldHVybiAodXN0YXJ0ICsgKChpbnQpICZ1LnB0X3IwIC0gKGludCkgJnUpICsKKyAgICAgICAgICAgICAgUkVHSVNURVJfU0laRSAqIHJlZ251bSk7CisgIGVsc2UgaWYgKHJlZ251bSA9PSBQU1JfUkVHTlVNKQorICAgICAgcmV0dXJuICh1c3RhcnQgKyAoKGludCkgJnUucHRfcHNyKSAtIChpbnQpICZ1KTsKKyAgZWxzZSBpZiAocmVnbnVtID09IEZQU1JfUkVHTlVNKQorICAgICAgcmV0dXJuICh1c3RhcnQgKyAoKGludCkgJnUucHRfZnBzcikgLSAoaW50KSAmdSk7CisgIGVsc2UgaWYgKHJlZ251bSA9PSBGUENSX1JFR05VTSkKKyAgICAgIHJldHVybiAodXN0YXJ0ICsgKChpbnQpICZ1LnB0X2ZwY3IpIC0gKGludCkgJnUpOworICBlbHNlIGlmIChyZWdudW0gPT0gU1hJUF9SRUdOVU0pCisgICAgICByZXR1cm4gKHVzdGFydCArIFNYSVBfT0ZGU0VUKTsKKyAgZWxzZSBpZiAocmVnbnVtID09IFNOSVBfUkVHTlVNKQorICAgICAgcmV0dXJuICh1c3RhcnQgKyBTTklQX09GRlNFVCk7CisgIGVsc2UgaWYgKHJlZ251bSA9PSBTRklQX1JFR05VTSkKKyAgICAgIHJldHVybiAodXN0YXJ0ICsgU0ZJUF9PRkZTRVQpOworICBlbHNlIGlmICh0YXJnZXRfaXNfbTg4MTEwKSAKKyAgICAgIHJldHVybiAodXN0YXJ0ICsgKChpbnQpICZ1LnB0X3gwIC0gKGludCkgJnUpICsgICAvKiBNdXN0IGJlIFggcmVnaXN0ZXIgKi8KKyAgICAgICAgICAgICAgIHNpemVvZih1LnB0X3gwKSAqIChyZWdudW0gLSBYMF9SRUdOVU0pKTsKKyAgZWxzZQorICAgICAgcmV0dXJuIChibG9ja2VuZCArIFJFR0lTVEVSX1NJWkUgKiByZWdudW0pOworfQorCisjaWZkZWYgVVNFX1BST0NfRlMKKworI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KKworLyogIEdpdmVuIGEgcG9pbnRlciB0byBhIGdlbmVyYWwgcmVnaXN0ZXIgc2V0IGluIC9wcm9jIGZvcm1hdCAoZ3JlZ3NldF90ICopLAorICAgIHVucGFjayB0aGUgcmVnaXN0ZXIgY29udGVudHMgYW5kIHN1cHBseSB0aGVtIGFzIGdkYidzIGlkZWEgb2YgdGhlIGN1cnJlbnQKKyAgICByZWdpc3RlciB2YWx1ZXMuICovCisKK3ZvaWQKK3N1cHBseV9ncmVnc2V0IChncmVnc2V0cCkKKyAgICAgZ3JlZ3NldF90ICpncmVnc2V0cDsKK3sKKyAgICByZWdpc3RlciBpbnQgcmVnaTsKKyAgICByZWdpc3RlciBncmVnX3QgKnJlZ3AgPSAoZ3JlZ190ICopIGdyZWdzZXRwOworCisgICAgZm9yIChyZWdpPTA7IHJlZ2kgPD0gU1BfUkVHTlVNOyByZWdpKyspCisJc3VwcGx5X3JlZ2lzdGVyIChyZWdpLCAoY2hhciAqKSAocmVncCArIHJlZ2kpKTsKKworICAgIHN1cHBseV9yZWdpc3RlciAoU1hJUF9SRUdOVU0sIChjaGFyICopIChyZWdwICsgUl9YSVApKTsKKyAgICBzdXBwbHlfcmVnaXN0ZXIgKFNOSVBfUkVHTlVNLCAoY2hhciAqKSAocmVncCArIFJfTklQKSk7CisgICAgc3VwcGx5X3JlZ2lzdGVyIChTRklQX1JFR05VTSwgKGNoYXIgKikgKHJlZ3AgKyBSX0ZJUCkpOworICAgIHN1cHBseV9yZWdpc3RlciAoUFNSX1JFR05VTSwgKGNoYXIgKikgKHJlZ3AgKyBSX1BTUikpOworICAgIHN1cHBseV9yZWdpc3RlciAoRlBTUl9SRUdOVU0sIChjaGFyICopIChyZWdwICsgUl9GUFNSKSk7CisgICAgc3VwcGx5X3JlZ2lzdGVyIChGUENSX1JFR05VTSwgKGNoYXIgKikgKHJlZ3AgKyBSX0ZQQ1IpKTsKK30KKwordm9pZAorZmlsbF9ncmVnc2V0IChncmVnc2V0cCwgcmVnbm8pCisgICAgIGdyZWdzZXRfdCAqZ3JlZ3NldHA7CisgICAgIGludCByZWdubzsKK3sKKyAgICBpbnQgcmVnaTsKKyAgICByZWdpc3RlciBncmVnX3QgKnJlZ3AgPSAoZ3JlZ190ICopIGdyZWdzZXRwOworICAgIGV4dGVybiBjaGFyIHJlZ2lzdGVyc1tdOworCisgICAgZm9yIChyZWdpID0gMCA7IHJlZ2kgPD0gUl9SMzEgOyByZWdpKyspCisJaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IHJlZ2kpKQorCSAgICAqKHJlZ3AgKyByZWdpKSA9ICooaW50ICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURShyZWdpKV07CisKKyAgICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gU1hJUF9SRUdOVU0pKQorCSoocmVncCArIFJfWElQKSA9ICooaW50ICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURShTWElQX1JFR05VTSldOworICAgIGlmICgocmVnbm8gPT0gLTEpIHx8IChyZWdubyA9PSBTTklQX1JFR05VTSkpCisJKihyZWdwICsgUl9OSVApID0gKihpbnQgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKFNOSVBfUkVHTlVNKV07CisgICAgaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IFNGSVBfUkVHTlVNKSkKKwkqKHJlZ3AgKyBSX0ZJUCkgPSAqKGludCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU0ZJUF9SRUdOVU0pXTsKKyAgICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gUFNSX1JFR05VTSkpCisJKihyZWdwICsgUl9QU1IpID0gKihpbnQgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKFBTUl9SRUdOVU0pXTsKKyAgICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gRlBTUl9SRUdOVU0pKQorCSoocmVncCArIFJfRlBTUikgPSAqKGludCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoRlBTUl9SRUdOVU0pXTsKKyAgICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gRlBDUl9SRUdOVU0pKQorCSoocmVncCArIFJfRlBDUikgPSAqKGludCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoRlBDUl9SRUdOVU0pXTsKK30KKworI2VuZGlmIC8qIFVTRV9QUk9DX0ZTICovCisKKy8qIFRoaXMgc3VwcG9ydCBhZGRzIHRoZSBlcXVpdmFsZW50IG9mIGFkYidzICUgY29tbWFuZC4gIFdoZW4KKyAgIHRoZSBgYWRkLXNoYXJlZC1zeW1ib2wtZmlsZXMnIGNvbW1hbmQgaXMgZ2l2ZW4sIHRoaXMgcm91dGluZSBzY2FucyAKKyAgIHRoZSBkeW5hbWljIGxpbmtlcidzIGxpbmsgbWFwIGFuZCByZWFkcyB0aGUgbWluaW1hbCBzeW1ib2xzCisgICBmcm9tIGVhY2ggc2hhcmVkIG9iamVjdCBmaWxlIGxpc3RlZCBpbiB0aGUgbWFwLiAqLworCitzdHJ1Y3QgbGlua19tYXAgeworICB1bnNpZ25lZCBsb25nIGxfYWRkcjsJCS8qIGFkZHJlc3MgYXQgd2hpY2ggb2JqZWN0IGlzIG1hcHBlZCAqLworICBjaGFyICpsX25hbWU7CQkJLyogZnVsbCBuYW1lIG9mIGxvYWRlZCBvYmplY3QgKi8KKyAgdm9pZCAqbF9sZDsJCQkvKiBkeW5hbWljIHN0cnVjdHVyZSBvZiBvYmplY3QgKi8KKyAgc3RydWN0IGxpbmtfbWFwICpsX25leHQ7CS8qIG5leHQgbGluayBvYmplY3QgKi8KKyAgc3RydWN0IGxpbmtfbWFwICpsX3ByZXY7CS8qIHByZXZpb3VzIGxpbmsgb2JqZWN0ICovCit9OworCisjZGVmaW5lIExJTktTX01BUF9QT0lOVEVSICJfbGRfdGFpbCIKKyNkZWZpbmUgTElCQ19GSUxFICIvdXNyL2xpYi9saWJjLnNvLjEiCisjZGVmaW5lIFNIQVJFRF9PRkZTRVQgMHhmMDAwMTAwMAorCisjaWZuZGVmIFBBVEhfTUFYCisjZGVmaW5lIFBBVEhfTUFYIDEwMjMJCS8qIG1heGltdW0gc2l6ZSBvZiBwYXRoIG5hbWUgb24gT1MgKi8KKyNlbmRpZgorCit2b2lkCithZGRfc2hhcmVkX3N5bWJvbF9maWxlcyAoKQoreworICB2b2lkICpkZXNjOworICBzdHJ1Y3QgbGlua19tYXAgKmxkX21hcCwgKmxtLCBsbXM7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbWluc3ltOyAKKyAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgIGNoYXIgKnBhdGhfbmFtZTsKKworICBpZiAoISBpbmZlcmlvcl9waWQpCisgICAgeworICAgICAgd2FybmluZyAoIlRoZSBwcm9ncmFtIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZC4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgb2JqZmlsZSA9IHN5bWJvbF9maWxlX2FkZCAoTElCQ19GSUxFLCAwLCAwLCAwLCAwLCAxLCAwLCAwKTsKKyAgbWluc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sIChMSU5LU19NQVBfUE9JTlRFUiwgb2JqZmlsZSk7CisKKyAgbGRfbWFwID0gKHN0cnVjdCBsaW5rX21hcCAqKQorICAgIHJlYWRfbWVtb3J5X2ludGVnZXIgKCgoaW50KVNZTUJPTF9WQUxVRV9BRERSRVNTKG1pbnN5bSkgKyBTSEFSRURfT0ZGU0VUKSwgNCk7CisgIGxtID0gbGRfbWFwOworICB3aGlsZSAobG0pCisgICAgeworICAgICAgaW50IGxvY2FsX2Vycm5vID0gMDsKKworICAgICAgcmVhZF9tZW1vcnkgKChDT1JFX0FERFIpbG0sIChjaGFyKikmbG1zLCBzaXplb2YgKHN0cnVjdCBsaW5rX21hcCkpOworICAgICAgaWYgKGxtcy5sX25hbWUpCisJeworCSAgaWYgKHRhcmdldF9yZWFkX3N0cmluZyAoKENPUkVfQUREUilsbXMubF9uYW1lLCAmcGF0aF9uYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVRIX01BWCwgJmxvY2FsX2Vycm5vKSkKKwkgICAgeworCSAgICAgIHN5bWJvbF9maWxlX2FkZCAocGF0aF9uYW1lLCAxLCBsbXMubF9hZGRyLCAwLCAwLCAwLCAwLCAwKTsKKyAgICAgICAgICAgICAgZnJlZShwYXRoX25hbWUpOworCSAgICB9CisJfQorICAgICAgLyogdHJhdmVyc2UgbGlua3MgaW4gcmV2ZXJzZSBvcmRlciBzbyB0aGF0IHdlIGdldCB0aGUKKwkgdGhlIHN5bWJvbHMgdGhlIHVzZXIgYWN0dWFsbHkgZ2V0cy4gKi8KKyAgICAgIGxtID0gbG1zLmxfcHJldjsKKyAgICB9CisKKyAgLyogR2V0dGluZyBuZXcgc3ltYm9scyBtYXkgY2hhbmdlIG91ciBvcGluaW9uIGFib3V0IHdoYXQgaXMKKyAgICAgZnJhbWVsZXNzLiAgKi8KKyAgcmVpbml0X2ZyYW1lX2NhY2hlICgpOworfQorCisjaWYgZGVmaW5lZChfRVNfTVApCisKKyNpbmNsdWRlIDxzeXMvcmVnc2V0Lmg+CisKK3Vuc2lnbmVkIGludAorbTg4a19oYXJyaXNfY29yZV9yZWdpc3Rlcl9hZGRyIChyZWdubywgcmVnX3B0cikKKyAgICAgaW50IHJlZ25vLCByZWdfcHRyOworeworICAgdW5zaWduZWQgaW50IHdvcmRfb2Zmc2V0OworCisgICBzd2l0Y2ggKHJlZ25vKQorICAgICB7CisgICAgIGNhc2UgUFNSX1JFR05VTToKKyAgICAgICB3b3JkX29mZnNldCA9IFJfRVBTUjsKKyAgICAgICBicmVhazsKKyAgICAgY2FzZSBGUFNSX1JFR05VTToKKyAgICAgICB3b3JkX29mZnNldCA9IFJfRlBTUjsKKyAgICAgICBicmVhazsKKyAgICAgY2FzZSBGUENSX1JFR05VTToKKyAgICAgICB3b3JkX29mZnNldCA9IFJfRlBDUjsKKyAgICAgICBicmVhazsKKyAgICAgY2FzZSBTWElQX1JFR05VTToKKyAgICAgICB3b3JkX29mZnNldCA9IFJfRVhJUDsKKyAgICAgICBicmVhazsKKyAgICAgY2FzZSBTTklQX1JFR05VTToKKyAgICAgICB3b3JkX29mZnNldCA9IFJfRU5JUDsKKyAgICAgICBicmVhazsKKyAgICAgY2FzZSBTRklQX1JFR05VTToKKyAgICAgICB3b3JkX29mZnNldCA9IFJfRUZJUDsKKyAgICAgICBicmVhazsKKyAgICAgZGVmYXVsdDoKKyAgICAgICBpZiAocmVnbm8gPD0gRlBfUkVHTlVNKSAKKwkgd29yZF9vZmZzZXQgPSByZWdubzsKKyAgICAgICBlbHNlIAorCSB3b3JkX29mZnNldCA9ICgocmVnbm8gLSBYMF9SRUdOVU0pICogNCk7CisgICAgIH0KKyAgIHJldHVybiAod29yZF9vZmZzZXQgKiA0KTsKK30KKworI2VuZGlmIC8qIF9FU19NUCAqLworCit2b2lkCitfaW5pdGlhbGl6ZV9tODhrX25hdCgpCit7CisjaWZkZWYgX0VTX01QCisgICAvKiBFbmFibGUgODgxMTAgc3VwcG9ydCwgYXMgd2UgZG9uJ3Qgc3VwcG9ydCB0aGUgODgxMDAgdW5kZXIgRVMvTVAuICAqLworCisgICB0YXJnZXRfaXNfbTg4MTEwID0gMTsKKyNlbGlmIGRlZmluZWQoX0NYX1VYKQorICAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgd2UncmUgcnVubmluZyBvbiBhbiA4ODEwMCBvciBhbiA4ODExMC4gICovCisgICB0YXJnZXRfaXNfbTg4MTEwID0gKHNpbmZvKFNZU01BQ0hJTkUsMCkgPT0gU1lTNTgwMCk7CisjZW5kaWYgLyogX0NYX1VYICovCit9CisKKyNpZmRlZiBfRVNfTVAKKy8qIEdpdmVuIGEgcG9pbnRlciB0byBhIGdlbmVyYWwgcmVnaXN0ZXIgc2V0IGluIC9wcm9jIGZvcm1hdCAoZ3JlZ3NldF90ICopLAorICAgdW5wYWNrIHRoZSByZWdpc3RlciBjb250ZW50cyBhbmQgc3VwcGx5IHRoZW0gYXMgZ2RiJ3MgaWRlYSBvZiB0aGUgY3VycmVudAorICAgcmVnaXN0ZXIgdmFsdWVzLiAqLworCit2b2lkCitzdXBwbHlfZ3JlZ3NldCAoZ3JlZ3NldHApCisgICAgIGdyZWdzZXRfdCAqZ3JlZ3NldHA7Cit7CisgIHJlZ2lzdGVyIGludCByZWdpOworICByZWdpc3RlciBncmVnX3QgKnJlZ3AgPSAoZ3JlZ190ICopIGdyZWdzZXRwOworCisgIGZvciAocmVnaSA9IDAgOyByZWdpIDwgUl9SMzEgOyByZWdpKyspCisgICAgeworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdpLCAoY2hhciAqKSAocmVncCArIHJlZ2kpKTsKKyAgICB9CisgIHN1cHBseV9yZWdpc3RlciAoUFNSX1JFR05VTSwgIChjaGFyICopIChyZWdwICsgUl9FUFNSKSk7CisgIHN1cHBseV9yZWdpc3RlciAoRlBTUl9SRUdOVU0sIChjaGFyICopIChyZWdwICsgUl9GUFNSKSk7CisgIHN1cHBseV9yZWdpc3RlciAoRlBDUl9SRUdOVU0sIChjaGFyICopIChyZWdwICsgUl9GUENSKSk7CisgIHN1cHBseV9yZWdpc3RlciAoU1hJUF9SRUdOVU0sIChjaGFyICopIChyZWdwICsgUl9FWElQKSk7CisgIHN1cHBseV9yZWdpc3RlciAoU05JUF9SRUdOVU0sIChjaGFyICopIChyZWdwICsgUl9FTklQKSk7CisgIHN1cHBseV9yZWdpc3RlciAoU0ZJUF9SRUdOVU0sIChjaGFyICopIChyZWdwICsgUl9FRklQKSk7Cit9CisKKy8qIEdpdmVuIGEgcG9pbnRlciB0byBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHNldCBpbiAvcHJvYyBmb3JtYXQKKyAgIChmcHJlZ3NldF90ICopLCB1bnBhY2sgdGhlIHJlZ2lzdGVyIGNvbnRlbnRzIGFuZCBzdXBwbHkgdGhlbSBhcyBnZGIncworICAgaWRlYSBvZiB0aGUgY3VycmVudCBmbG9hdGluZyBwb2ludCByZWdpc3RlciB2YWx1ZXMuICAqLworCit2b2lkIAorc3VwcGx5X2ZwcmVnc2V0IChmcHJlZ3NldHApCisgICAgIGZwcmVnc2V0X3QgKmZwcmVnc2V0cDsKK3sKKyAgcmVnaXN0ZXIgaW50IHJlZ2k7CisgIGNoYXIgKmZyb207CisgIAorICBmb3IgKHJlZ2kgPSBGUDBfUkVHTlVNIDsgcmVnaSA8PSBGUExBU1RfUkVHTlVNIDsgcmVnaSsrKQorICAgIHsKKyAgICAgIGZyb20gPSAoY2hhciAqKSAmKCgqZnByZWdzZXRwKVtyZWdpLUZQMF9SRUdOVU1dKTsKKyAgICAgIHN1cHBseV9yZWdpc3RlciAocmVnaSwgZnJvbSk7CisgICAgfQorfQorCisjZW5kaWYgLyogX0VTX01QICovCisKKyNpZmRlZiBfQ1hfVVgKKworI2luY2x1ZGUgPHN5cy9yZWdzZXQuaD4KKwordW5zaWduZWQgaW50IG04OGtfaGFycmlzX2NvcmVfcmVnaXN0ZXJfYWRkcihpbnQgcmVnbm8sIGludCByZWdfcHRyKQoreworICAgdW5zaWduZWQgaW50IHdvcmRfb2Zmc2V0OworCisgICBzd2l0Y2ggKHJlZ25vKSB7CisgICAgY2FzZSBQU1JfUkVHTlVNICA6IHdvcmRfb2Zmc2V0ID0gUl9QU1I7ICBicmVhazsKKyAgICBjYXNlIEZQU1JfUkVHTlVNIDogd29yZF9vZmZzZXQgPSBSX0ZQU1I7IGJyZWFrOworICAgIGNhc2UgRlBDUl9SRUdOVU0gOiB3b3JkX29mZnNldCA9IFJfRlBDUjsgYnJlYWs7CisgICAgY2FzZSBTWElQX1JFR05VTSA6IHdvcmRfb2Zmc2V0ID0gUl9YSVA7ICBicmVhazsKKyAgICBjYXNlIFNOSVBfUkVHTlVNIDogd29yZF9vZmZzZXQgPSBSX05JUDsgIGJyZWFrOworICAgIGNhc2UgU0ZJUF9SRUdOVU0gOiB3b3JkX29mZnNldCA9IFJfRklQOyAgYnJlYWs7CisgICAgZGVmYXVsdCA6CisgICAgICBpZiAocmVnbm8gPD0gRlBfUkVHTlVNKSAKKyAgICAgICAgICAgIHdvcmRfb2Zmc2V0ID0gcmVnbm87CisgICAgICBlbHNlIAorICAgICAgICAgICAgd29yZF9vZmZzZXQgPSAoKHJlZ25vIC0gWDBfUkVHTlVNKSAqIDQpICsgUl9YMDsKKyAgIH0KKyAgIHJldHVybiAod29yZF9vZmZzZXQgKiA0KTsKK30KKworI2VuZGlmIC8qIF9DWF9VWCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2QxMHYtdGRlcC5jIGIvZ2RiL2QxMHYtdGRlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YjUyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZDEwdi10ZGVwLmMKQEAgLTAsMCArMSwxMDI4IEBACisvKiBUYXJnZXQtZGVwZW5kZW50IGNvZGUgZm9yIE1pdHN1YmlzaGkgRDEwViwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiAgQ29udHJpYnV0ZWQgYnkgTWFydGluIEh1bnQsIGh1bnRAY3lnbnVzLmNvbSAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAib2JzdGFjay5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiZGlzLWFzbS5oIiAgCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgIm9iamZpbGVzLmgiCisKK3ZvaWQgZDEwdl9mcmFtZV9maW5kX3NhdmVkX3JlZ3MgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKmZpLAorCQkJCQkgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKmZzcikpOworCitpbnQKK2QxMHZfZnJhbWVfY2hhaW5fdmFsaWQgKGNoYWluLCBmcmFtZSkKKyAgICAgQ09SRV9BRERSIGNoYWluOworICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7ICAgICAgLyogbm90IHVzZWQgaGVyZSAqLworeworICByZXR1cm4gKChjaGFpbikgIT0gMCAmJiAoZnJhbWUpICE9IDAgJiYgKGZyYW1lKS0+cGMgPiBJTUVNX1NUQVJUKTsKK30KKworCisvKiBTaG91bGQgd2UgdXNlIEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MgaW5zdGVhZCBvZgorICAgRVhUUkFDVF9SRVRVUk5fVkFMVUU/ICBHQ0NfUCBpcyB0cnVlIGlmIGNvbXBpbGVkIHdpdGggZ2NjCisgICBhbmQgVFlQRSBpcyB0aGUgdHlwZSAod2hpY2ggaXMga25vd24gdG8gYmUgc3RydWN0LCB1bmlvbiBvciBhcnJheSkuCisKKyAgIFRoZSBkMTB2IHJldHVybnMgYW55dGhpbmcgbGVzcyB0aGFuIDggYnl0ZXMgaW4gc2l6ZSBpbgorICAgcmVnaXN0ZXJzLiAqLworCitpbnQKK2QxMHZfdXNlX3N0cnVjdF9jb252ZW50aW9uIChnY2NfcCwgdHlwZSkKKyAgICAgaW50IGdjY19wOworICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgcmV0dXJuIChUWVBFX0xFTkdUSCAodHlwZSkgPiA4KTsKK30KKworCisvKiBEaXNjYXJkIGZyb20gdGhlIHN0YWNrIHRoZSBpbm5lcm1vc3QgZnJhbWUsIHJlc3RvcmluZyBhbGwgc2F2ZWQKKyAgIHJlZ2lzdGVycy4gICovCisKK3ZvaWQKK2QxMHZfcG9wX2ZyYW1lIChmcmFtZSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworeworICBDT1JFX0FERFIgZnA7CisgIGludCByZWdudW07CisgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzIGZzcjsKKyAgY2hhciByYXdfYnVmZmVyWzhdOworCisgIGZwID0gRlJBTUVfRlAgKGZyYW1lKTsKKyAgLyogZmlsbCBvdXQgZnNyIHdpdGggdGhlIGFkZHJlc3Mgb2Ygd2hlcmUgZWFjaCAqLworICAvKiByZWdpc3RlciB3YXMgc3RvcmVkIGluIHRoZSBmcmFtZSAqLworICBnZXRfZnJhbWVfc2F2ZWRfcmVncyAoZnJhbWUsICZmc3IpOworICAKKyAgLyogbm93IHVwZGF0ZSB0aGUgY3VycmVudCByZWdpc3RlcnMgd2l0aCB0aGUgb2xkIHZhbHVlcyAqLworICBmb3IgKHJlZ251bSA9IEEwX1JFR05VTTsgcmVnbnVtIDwgQTBfUkVHTlVNKzIgOyByZWdudW0rKykKKyAgICB7CisgICAgICBpZiAoZnNyLnJlZ3NbcmVnbnVtXSkKKwl7CisJICByZWFkX21lbW9yeSAoZnNyLnJlZ3NbcmVnbnVtXSwgcmF3X2J1ZmZlciwgIFJFR0lTVEVSX1JBV19TSVpFKHJlZ251bSkpOworCSAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKFJFR0lTVEVSX0JZVEUgKHJlZ251bSksIHJhd19idWZmZXIsICBSRUdJU1RFUl9SQVdfU0laRShyZWdudW0pKTsKKwl9CisgICAgfQorICBmb3IgKHJlZ251bSA9IDA7IHJlZ251bSA8IFNQX1JFR05VTTsgcmVnbnVtKyspCisgICAgeworICAgICAgaWYgKGZzci5yZWdzW3JlZ251bV0pCisJeworCSAgd3JpdGVfcmVnaXN0ZXIgKHJlZ251bSwgcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoZnNyLnJlZ3NbcmVnbnVtXSwgUkVHSVNURVJfUkFXX1NJWkUocmVnbnVtKSkpOworCX0KKyAgICB9CisgIGlmIChmc3IucmVnc1tQU1dfUkVHTlVNXSkKKyAgICB7CisgICAgICB3cml0ZV9yZWdpc3RlciAoUFNXX1JFR05VTSwgcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoZnNyLnJlZ3NbUFNXX1JFR05VTV0sIFJFR0lTVEVSX1JBV19TSVpFKFBTV19SRUdOVU0pKSk7CisgICAgfQorCisgIHdyaXRlX3JlZ2lzdGVyIChQQ19SRUdOVU0sIHJlYWRfcmVnaXN0ZXIgKExSX1JFR05VTSkpOworICB3cml0ZV9yZWdpc3RlciAoU1BfUkVHTlVNLCBmcCArIGZyYW1lLT5zaXplKTsKKyAgdGFyZ2V0X3N0b3JlX3JlZ2lzdGVycyAoLTEpOworICBmbHVzaF9jYWNoZWRfZnJhbWVzICgpOworfQorCitzdGF0aWMgaW50IAorY2hlY2tfcHJvbG9ndWUgKG9wKQorICAgICB1bnNpZ25lZCBzaG9ydCBvcDsKK3sKKyAgLyogc3QgIHJuLCBALXNwICovCisgIGlmICgob3AgJiAweDdFMUYpID09IDB4NkMxRikKKyAgICByZXR1cm4gMTsKKworICAvKiBzdDJ3ICBybiwgQC1zcCAqLworICBpZiAoKG9wICYgMHg3RTNGKSA9PSAweDZFMUYpCisgICAgcmV0dXJuIDE7CisKKyAgLyogc3ViaSAgc3AsIG4gKi8KKyAgaWYgKChvcCAmIDB4N0ZFMSkgPT0gMHgwMUUxKQorICAgIHJldHVybiAxOworCisgIC8qIG12ICByMTEsIHNwICovCisgIGlmIChvcCA9PSAweDQxN0UpCisgICAgcmV0dXJuIDE7CisKKyAgLyogbm9wICovCisgIGlmIChvcCA9PSAweDVFMDApCisgICAgcmV0dXJuIDE7CisKKyAgLyogc3QgIHJuLCBAc3AgKi8KKyAgaWYgKChvcCAmIDB4N0UxRikgPT0gMHg2ODFFKQorICAgIHJldHVybiAxOworCisgIC8qIHN0MncgIHJuLCBAc3AgKi8KKyBpZiAoKG9wICYgMHg3RTNGKSA9PSAweDNBMUUpCisgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworQ09SRV9BRERSCitkMTB2X3NraXBfcHJvbG9ndWUgKHBjKQorICAgICBDT1JFX0FERFIgcGM7Cit7CisgIHVuc2lnbmVkIGxvbmcgb3A7CisgIHVuc2lnbmVkIHNob3J0IG9wMSwgb3AyOworICBDT1JFX0FERFIgZnVuY19hZGRyLCBmdW5jX2VuZDsKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CisKKyAgLyogSWYgd2UgaGF2ZSBsaW5lIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgdGhlbiB0aGUgZW5kIG9mIHRoZSAqLworICAvKiBwcm9sb2d1ZSBzaG91bGQgdGhlIGZpcnN0IGFzc2VtYmx5IGluc3RydWN0aW9uIG9mICB0aGUgZmlyc3Qgc291cmNlIGxpbmUgKi8KKyAgaWYgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAocGMsIE5VTEwsICZmdW5jX2FkZHIsICZmdW5jX2VuZCkpCisgICAgeworICAgICAgc2FsID0gZmluZF9wY19saW5lIChmdW5jX2FkZHIsIDApOworICAgICAgaWYgKCBzYWwuZW5kICYmIHNhbC5lbmQgPCBmdW5jX2VuZCkKKwlyZXR1cm4gc2FsLmVuZDsKKyAgICB9CisgIAorICBpZiAodGFyZ2V0X3JlYWRfbWVtb3J5IChwYywgKGNoYXIgKikmb3AsIDQpKQorICAgIHJldHVybiBwYzsJCQkvKiBDYW4ndCBhY2Nlc3MgaXQgLS0gYXNzdW1lIG5vIHByb2xvZ3VlLiAqLworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIG9wID0gKHVuc2lnbmVkIGxvbmcpcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDQpOworICAgICAgaWYgKChvcCAmIDB4QzAwMDAwMDApID09IDB4QzAwMDAwMDApCisJeworCSAgLyogbG9uZyBpbnN0cnVjdGlvbiAqLworCSAgaWYgKCAoKG9wICYgMHgzRkZGMDAwMCkgIT0gMHgwMUZGMDAwMCkgJiYgICAvKiBhZGQzIHNwLHNwLG4gKi8KKwkgICAgICAgKChvcCAmIDB4M0YwRjAwMDApICE9IDB4MzQwRjAwMDApICYmICAgLyogc3QgIHJuLCBAKG9mZnNldCxzcCkgKi8KKyAJICAgICAgICgob3AgJiAweDNGMUYwMDAwKSAhPSAweDM1MEYwMDAwKSkgICAgIC8qIHN0MncgIHJuLCBAKG9mZnNldCxzcCkgKi8KKwkgICAgYnJlYWs7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIHNob3J0IGluc3RydWN0aW9ucyAqLworCSAgaWYgKChvcCAmIDB4QzAwMDAwMDApID09IDB4ODAwMDAwMDApCisJICAgIHsKKwkgICAgICBvcDIgPSAob3AgJiAweDNGRkY4MDAwKSA+PiAxNTsKKwkgICAgICBvcDEgPSBvcCAmIDB4N0ZGRjsKKwkgICAgfSAKKwkgIGVsc2UgCisJICAgIHsKKwkgICAgICBvcDEgPSAob3AgJiAweDNGRkY4MDAwKSA+PiAxNTsKKwkgICAgICBvcDIgPSBvcCAmIDB4N0ZGRjsKKwkgICAgfQorCSAgaWYgKGNoZWNrX3Byb2xvZ3VlKG9wMSkpCisJICAgIHsKKwkgICAgICBpZiAoIWNoZWNrX3Byb2xvZ3VlKG9wMikpCisJCXsKKwkJICAvKiBpZiB0aGUgcHJldmlvdXMgb3Bjb2RlIHdhcyByZWFsbHkgcGFydCBvZiB0aGUgcHJvbG9ndWUgKi8KKwkJICAvKiBhbmQgbm90IGp1c3QgYSBOT1AsIHRoZW4gd2Ugd2FudCB0byBicmVhayBhZnRlciBib3RoIGluc3RydWN0aW9ucyAqLworCQkgIGlmIChvcDEgIT0gMHg1RTAwKQorCQkgICAgcGMgKz0gNDsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIGJyZWFrOworCX0KKyAgICAgIHBjICs9IDQ7CisgICAgfQorICByZXR1cm4gcGM7Cit9CisKKy8qIEdpdmVuIGEgR0RCIGZyYW1lLCBkZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24ncyBmcmFtZS4KKyAgIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBHREIgZnJhbWUgc3RydWN0LCBhbmQgdGhlbgorICAgSU5JVF9FWFRSQV9GUkFNRV9JTkZPIGFuZCBJTklUX0ZSQU1FX1BDIHdpbGwgYmUgY2FsbGVkIGZvciB0aGUgbmV3IGZyYW1lLgorKi8KKworQ09SRV9BRERSCitkMTB2X2ZyYW1lX2NoYWluIChmcmFtZSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworeworICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyBmc3I7CisKKyAgZDEwdl9mcmFtZV9maW5kX3NhdmVkX3JlZ3MgKGZyYW1lLCAmZnNyKTsKKworICBpZiAoZnJhbWUtPnJldHVybl9wYyA9PSBJTUVNX1NUQVJUIHx8IGluc2lkZV9lbnRyeV9maWxlKGZyYW1lLT5yZXR1cm5fcGMpKQorICAgIHJldHVybiAoQ09SRV9BRERSKTA7CisKKyAgaWYgKCFmc3IucmVnc1tGUF9SRUdOVU1dKQorICAgIHsKKyAgICAgIGlmICghZnNyLnJlZ3NbU1BfUkVHTlVNXSB8fCBmc3IucmVnc1tTUF9SRUdOVU1dID09IFNUQUNLX1NUQVJUKQorCXJldHVybiAoQ09SRV9BRERSKTA7CisgICAgICAKKyAgICAgIHJldHVybiBmc3IucmVnc1tTUF9SRUdOVU1dOworICAgIH0KKworICBpZiAoIXJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIoZnNyLnJlZ3NbRlBfUkVHTlVNXSwgUkVHSVNURVJfUkFXX1NJWkUoRlBfUkVHTlVNKSkpCisgICAgcmV0dXJuIChDT1JFX0FERFIpMDsKKworICByZXR1cm4gRDEwVl9NQUtFX0RBRERSIChyZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyIChmc3IucmVnc1tGUF9SRUdOVU1dLCBSRUdJU1RFUl9SQVdfU0laRSAoRlBfUkVHTlVNKSkpOworfSAgCisKK3N0YXRpYyBpbnQgbmV4dF9hZGRyLCB1c2VzX2ZyYW1lOworCitzdGF0aWMgaW50IAorcHJvbG9ndWVfZmluZF9yZWdzIChvcCwgZnNyLCBhZGRyKQorICAgICB1bnNpZ25lZCBzaG9ydCBvcDsKKyAgICAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKmZzcjsKKyAgICAgQ09SRV9BRERSIGFkZHI7Cit7CisgIGludCBuOworCisgIC8qIHN0ICBybiwgQC1zcCAqLworICBpZiAoKG9wICYgMHg3RTFGKSA9PSAweDZDMUYpCisgICAgeworICAgICAgbiA9IChvcCAmIDB4MUUwKSA+PiA1OworICAgICAgbmV4dF9hZGRyIC09IDI7CisgICAgICBmc3ItPnJlZ3Nbbl0gPSBuZXh0X2FkZHI7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogc3QydyAgcm4sIEAtc3AgKi8KKyAgZWxzZSBpZiAoKG9wICYgMHg3RTNGKSA9PSAweDZFMUYpCisgICAgeworICAgICAgbiA9IChvcCAmIDB4MUUwKSA+PiA1OworICAgICAgbmV4dF9hZGRyIC09IDQ7CisgICAgICBmc3ItPnJlZ3Nbbl0gPSBuZXh0X2FkZHI7CisgICAgICBmc3ItPnJlZ3NbbisxXSA9IG5leHRfYWRkcisyOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIHN1YmkgIHNwLCBuICovCisgIGlmICgob3AgJiAweDdGRTEpID09IDB4MDFFMSkKKyAgICB7CisgICAgICBuID0gKG9wICYgMHgxRSkgPj4gMTsKKyAgICAgIGlmIChuID09IDApCisJbiA9IDE2OworICAgICAgbmV4dF9hZGRyIC09IG47CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogbXYgIHIxMSwgc3AgKi8KKyAgaWYgKG9wID09IDB4NDE3RSkKKyAgICB7CisgICAgICB1c2VzX2ZyYW1lID0gMTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBub3AgKi8KKyAgaWYgKG9wID09IDB4NUUwMCkKKyAgICByZXR1cm4gMTsKKworICAvKiBzdCAgcm4sIEBzcCAqLworICBpZiAoKG9wICYgMHg3RTFGKSA9PSAweDY4MUUpCisgICAgeworICAgICAgbiA9IChvcCAmIDB4MUUwKSA+PiA1OworICAgICAgZnNyLT5yZWdzW25dID0gbmV4dF9hZGRyOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIHN0MncgIHJuLCBAc3AgKi8KKyAgaWYgKChvcCAmIDB4N0UzRikgPT0gMHgzQTFFKQorICAgIHsKKyAgICAgIG4gPSAob3AgJiAweDFFMCkgPj4gNTsKKyAgICAgIGZzci0+cmVnc1tuXSA9IG5leHRfYWRkcjsKKyAgICAgIGZzci0+cmVnc1tuKzFdID0gbmV4dF9hZGRyKzI7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFB1dCBoZXJlIHRoZSBjb2RlIHRvIHN0b3JlLCBpbnRvIGEgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MsIHRoZQorICAgYWRkcmVzc2VzIG9mIHRoZSBzYXZlZCByZWdpc3RlcnMgb2YgZnJhbWUgZGVzY3JpYmVkIGJ5IEZSQU1FX0lORk8uCisgICBUaGlzIGluY2x1ZGVzIHNwZWNpYWwgcmVnaXN0ZXJzIHN1Y2ggYXMgcGMgYW5kIGZwIHNhdmVkIGluIHNwZWNpYWwKKyAgIHdheXMgaW4gdGhlIHN0YWNrIGZyYW1lLiAgc3AgaXMgZXZlbiBtb3JlIHNwZWNpYWw6IHRoZSBhZGRyZXNzIHdlCisgICByZXR1cm4gZm9yIGl0IElTIHRoZSBzcCBmb3IgdGhlIG5leHQgZnJhbWUuICovCit2b2lkCitkMTB2X2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyAoZmksIGZzcikKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworICAgICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqZnNyOworeworICBDT1JFX0FERFIgZnAsIHBjOworICB1bnNpZ25lZCBsb25nIG9wOworICB1bnNpZ25lZCBzaG9ydCBvcDEsIG9wMjsKKyAgaW50IGk7CisKKyAgZnAgPSBmaS0+ZnJhbWU7CisgIG1lbXNldCAoZnNyLCAwLCBzaXplb2YgKCpmc3IpKTsKKyAgbmV4dF9hZGRyID0gMDsKKworICBwYyA9IGdldF9wY19mdW5jdGlvbl9zdGFydCAoZmktPnBjKTsKKworICB1c2VzX2ZyYW1lID0gMDsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgb3AgPSAodW5zaWduZWQgbG9uZylyZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgNCk7CisgICAgICBpZiAoKG9wICYgMHhDMDAwMDAwMCkgPT0gMHhDMDAwMDAwMCkKKwl7CisJICAvKiBsb25nIGluc3RydWN0aW9uICovCisJICBpZiAoKG9wICYgMHgzRkZGMDAwMCkgPT0gMHgwMUZGMDAwMCkKKwkgICAgeworCSAgICAgIC8qIGFkZDMgc3Asc3AsbiAqLworCSAgICAgIHNob3J0IG4gPSBvcCAmIDB4RkZGRjsKKwkgICAgICBuZXh0X2FkZHIgKz0gbjsKKwkgICAgfQorCSAgZWxzZSBpZiAoKG9wICYgMHgzRjBGMDAwMCkgPT0gMHgzNDBGMDAwMCkKKwkgICAgeworCSAgICAgIC8qIHN0ICBybiwgQChvZmZzZXQsc3ApICovCisJICAgICAgc2hvcnQgb2Zmc2V0ID0gb3AgJiAweEZGRkY7CisJICAgICAgc2hvcnQgbiA9IChvcCA+PiAyMCkgJiAweEY7CisJICAgICAgZnNyLT5yZWdzW25dID0gbmV4dF9hZGRyICsgb2Zmc2V0OworCSAgICB9CisJICBlbHNlIGlmICgob3AgJiAweDNGMUYwMDAwKSA9PSAweDM1MEYwMDAwKQorCSAgICB7CisJICAgICAgLyogc3QydyAgcm4sIEAob2Zmc2V0LHNwKSAqLworCSAgICAgIHNob3J0IG9mZnNldCA9IG9wICYgMHhGRkZGOworCSAgICAgIHNob3J0IG4gPSAob3AgPj4gMjApICYgMHhGOworCSAgICAgIGZzci0+cmVnc1tuXSA9IG5leHRfYWRkciArIG9mZnNldDsKKwkgICAgICBmc3ItPnJlZ3NbbisxXSA9IG5leHRfYWRkciArIG9mZnNldCArIDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgYnJlYWs7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIHNob3J0IGluc3RydWN0aW9ucyAqLworCSAgaWYgKChvcCAmIDB4QzAwMDAwMDApID09IDB4ODAwMDAwMDApCisJICAgIHsKKwkgICAgICBvcDIgPSAob3AgJiAweDNGRkY4MDAwKSA+PiAxNTsKKwkgICAgICBvcDEgPSBvcCAmIDB4N0ZGRjsKKwkgICAgfSAKKwkgIGVsc2UgCisJICAgIHsKKwkgICAgICBvcDEgPSAob3AgJiAweDNGRkY4MDAwKSA+PiAxNTsKKwkgICAgICBvcDIgPSBvcCAmIDB4N0ZGRjsKKwkgICAgfQorCSAgaWYgKCFwcm9sb2d1ZV9maW5kX3JlZ3Mob3AxLGZzcixwYykgfHwgIXByb2xvZ3VlX2ZpbmRfcmVncyhvcDIsZnNyLHBjKSkKKwkgICAgYnJlYWs7CisJfQorICAgICAgcGMgKz0gNDsKKyAgICB9CisgIAorICBmaS0+c2l6ZSA9IC1uZXh0X2FkZHI7CisKKyAgaWYgKCEoZnAgJiAweGZmZmYpKQorICAgIGZwID0gRDEwVl9NQUtFX0RBRERSIChyZWFkX3JlZ2lzdGVyKFNQX1JFR05VTSkpOworCisgIGZvciAoaT0wOyBpPE5VTV9SRUdTLTE7IGkrKykKKyAgICBpZiAoZnNyLT5yZWdzW2ldKQorICAgICAgeworCWZzci0+cmVnc1tpXSA9IGZwIC0gKG5leHRfYWRkciAtIGZzci0+cmVnc1tpXSk7IAorICAgICAgfQorCisgIGlmIChmc3ItPnJlZ3NbTFJfUkVHTlVNXSkKKyAgICB7CisgICAgICBDT1JFX0FERFIgcmV0dXJuX3BjID0gcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoZnNyLT5yZWdzW0xSX1JFR05VTV0sIFJFR0lTVEVSX1JBV19TSVpFIChMUl9SRUdOVU0pKTsKKyAgICAgIGZpLT5yZXR1cm5fcGMgPSBEMTBWX01BS0VfSUFERFIgKHJldHVybl9wYyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZmktPnJldHVybl9wYyA9IEQxMFZfTUFLRV9JQUREUiAocmVhZF9yZWdpc3RlcihMUl9SRUdOVU0pKTsKKyAgICB9CisgIAorICAvKiB0aCBTUCBpcyBub3Qgbm9ybWFsbHkgKGV2ZXI/KSBzYXZlZCwgYnV0IGNoZWNrIGFueXdheSAqLworICBpZiAoIWZzci0+cmVnc1tTUF9SRUdOVU1dKQorICAgIHsKKyAgICAgIC8qIGlmIHRoZSBGUCB3YXMgc2F2ZWQsIHRoYXQgbWVhbnMgdGhlIGN1cnJlbnQgRlAgaXMgdmFsaWQsICovCisgICAgICAvKiBvdGhlcndpc2UsIGl0IGlzbid0IGJlaW5nIHVzZWQsIHNvIHdlIHVzZSB0aGUgU1AgaW5zdGVhZCAqLworICAgICAgaWYgKHVzZXNfZnJhbWUpCisJZnNyLT5yZWdzW1NQX1JFR05VTV0gPSByZWFkX3JlZ2lzdGVyKEZQX1JFR05VTSkgKyBmaS0+c2l6ZTsKKyAgICAgIGVsc2UKKwl7CisJICBmc3ItPnJlZ3NbU1BfUkVHTlVNXSA9IGZwICsgZmktPnNpemU7CisJICBmaS0+ZnJhbWVsZXNzID0gMTsKKwkgIGZzci0+cmVnc1tGUF9SRUdOVU1dID0gMDsKKwl9CisgICAgfQorfQorCit2b2lkCitkMTB2X2luaXRfZXh0cmFfZnJhbWVfaW5mbyAoZnJvbWxlYWYsIGZpKQorICAgICBpbnQgZnJvbWxlYWY7CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKK3sKKyAgZmktPmZyYW1lbGVzcyA9IDA7CisgIGZpLT5zaXplID0gMDsKKyAgZmktPnJldHVybl9wYyA9IDA7CisKKyAgLyogVGhlIGNhbGwgZHVtbXkgZG9lc24ndCBzYXZlIGFueSByZWdpc3RlcnMgb24gdGhlIHN0YWNrLCBzbyB3ZSBjYW4KKyAgICAgcmV0dXJuIG5vdy4gICovCisgIGlmIChQQ19JTl9DQUxMX0RVTU1ZIChmaS0+cGMsIGZpLT5mcmFtZSwgZmktPmZyYW1lKSkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgZHVtbXk7CisgICAgICBkMTB2X2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyAoZmksICZkdW1teSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorc2hvd19yZWdzIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpbnQgYTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiUEM9JTA0eCAoMHgleCkgUFNXPSUwNHggUlBUX1M9JTA0eCBSUFRfRT0lMDR4IFJQVF9DPSUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoUENfUkVHTlVNKSwgRDEwVl9NQUtFX0lBRERSIChyZWFkX3JlZ2lzdGVyIChQQ19SRUdOVU0pKSwKKyAgICAgICAgICAgICAgICAgICByZWFkX3JlZ2lzdGVyIChQU1dfUkVHTlVNKSwKKyAgICAgICAgICAgICAgICAgICByZWFkX3JlZ2lzdGVyICgyNCksCisgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoMjUpLAorICAgICAgICAgICAgICAgICAgIHJlYWRfcmVnaXN0ZXIgKDIzKSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIlIwLVI3ICAlMDR4ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4ICUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoMCksCisgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoMSksCisgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoMiksCisgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoMyksCisgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoNCksCisgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoNSksCisgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoNiksCisgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoNykpOworICBwcmludGZfZmlsdGVyZWQgKCJSOC1SMTUgJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4XG4iLAorICAgICAgICAgICAgICAgICAgIHJlYWRfcmVnaXN0ZXIgKDgpLCAKKyAgICAgICAgICAgICAgICAgICByZWFkX3JlZ2lzdGVyICg5KSwKKyAgICAgICAgICAgICAgICAgICByZWFkX3JlZ2lzdGVyICgxMCksCisgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoMTEpLAorICAgICAgICAgICAgICAgICAgIHJlYWRfcmVnaXN0ZXIgKDEyKSwKKyAgICAgICAgICAgICAgICAgICByZWFkX3JlZ2lzdGVyICgxMyksCisgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoMTQpLAorICAgICAgICAgICAgICAgICAgIHJlYWRfcmVnaXN0ZXIgKDE1KSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIklNQVAwICUwNHggICAgSU1BUDEgJTA0eCAgICBETUFQICUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoSU1BUDBfUkVHTlVNKSwKKyAgICAgICAgICAgICAgICAgICByZWFkX3JlZ2lzdGVyIChJTUFQMV9SRUdOVU0pLAorICAgICAgICAgICAgICAgICAgIHJlYWRfcmVnaXN0ZXIgKERNQVBfUkVHTlVNKSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIkEwLUExIik7CisgIGZvciAoYSA9IEEwX1JFR05VTTsgYSA8PSBBMF9SRUdOVU0gKyAxOyBhKyspCisgICAgeworICAgICAgY2hhciBudW1bTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKyAgICAgIGludCBpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiICAiKTsKKyAgICAgIHJlYWRfcmVnaXN0ZXJfZ2VuIChhLCAoY2hhciAqKSZudW0pOworICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9SRUdJU1RFUl9SQVdfU0laRTsgaSsrKQorCXsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIiUwMngiLCAobnVtW2ldICYgMHhmZikpOworCX0KKyAgICB9CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7Cit9CisKK0NPUkVfQUREUgorZDEwdl9yZWFkX3BjIChwaWQpCisgICAgIGludCBwaWQ7Cit7CisgIGludCBzYXZlX3BpZDsKKyAgQ09SRV9BRERSIHBjOworICBDT1JFX0FERFIgcmV0dmFsOworCisgIHNhdmVfcGlkID0gaW5mZXJpb3JfcGlkOworICBpbmZlcmlvcl9waWQgPSBwaWQ7CisgIHBjID0gKGludCkgcmVhZF9yZWdpc3RlciAoUENfUkVHTlVNKTsKKyAgaW5mZXJpb3JfcGlkID0gc2F2ZV9waWQ7CisgIHJldHZhbCA9IEQxMFZfTUFLRV9JQUREUiAocGMpOworICByZXR1cm4gcmV0dmFsOworfQorCit2b2lkCitkMTB2X3dyaXRlX3BjICh2YWwsIHBpZCkKKyAgICAgQ09SRV9BRERSIHZhbDsKKyAgICAgaW50IHBpZDsKK3sKKyAgaW50IHNhdmVfcGlkOworCisgIHNhdmVfcGlkID0gaW5mZXJpb3JfcGlkOworICBpbmZlcmlvcl9waWQgPSBwaWQ7CisgIHdyaXRlX3JlZ2lzdGVyIChQQ19SRUdOVU0sIEQxMFZfQ09OVkVSVF9JQUREUl9UT19SQVcgKHZhbCkpOworICBpbmZlcmlvcl9waWQgPSBzYXZlX3BpZDsKK30KKworQ09SRV9BRERSCitkMTB2X3JlYWRfc3AgKCkKK3sKKyAgcmV0dXJuIChEMTBWX01BS0VfREFERFIgKHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSkpKTsKK30KKwordm9pZAorZDEwdl93cml0ZV9zcCAodmFsKQorICAgICBDT1JFX0FERFIgdmFsOworeworICB3cml0ZV9yZWdpc3RlciAoU1BfUkVHTlVNLCBEMTBWX0NPTlZFUlRfREFERFJfVE9fUkFXICh2YWwpKTsKK30KKwordm9pZAorZDEwdl93cml0ZV9mcCAodmFsKQorICAgICBDT1JFX0FERFIgdmFsOworeworICB3cml0ZV9yZWdpc3RlciAoRlBfUkVHTlVNLCBEMTBWX0NPTlZFUlRfREFERFJfVE9fUkFXICh2YWwpKTsKK30KKworQ09SRV9BRERSCitkMTB2X3JlYWRfZnAgKCkKK3sKKyAgcmV0dXJuIChEMTBWX01BS0VfREFERFIgKHJlYWRfcmVnaXN0ZXIoRlBfUkVHTlVNKSkpOworfQorCisvKiBGdW5jdGlvbjogcHVzaF9yZXR1cm5fYWRkcmVzcyAocGMpCisgICBTZXQgdXAgdGhlIHJldHVybiBhZGRyZXNzIGZvciB0aGUgaW5mZXJpb3IgZnVuY3Rpb24gY2FsbC4KKyAgIE5lZWRlZCBmb3IgdGFyZ2V0cyB3aGVyZSB3ZSBkb24ndCBhY3R1YWxseSBleGVjdXRlIGEgSlNSL0JTUiBpbnN0cnVjdGlvbiAqLworIAorQ09SRV9BRERSCitkMTB2X3B1c2hfcmV0dXJuX2FkZHJlc3MgKHBjLCBzcCkKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBDT1JFX0FERFIgc3A7Cit7CisgIHdyaXRlX3JlZ2lzdGVyIChMUl9SRUdOVU0sIEQxMFZfQ09OVkVSVF9JQUREUl9UT19SQVcgKENBTExfRFVNTVlfQUREUkVTUyAoKSkpOworICByZXR1cm4gc3A7Cit9CisgCisKK0NPUkVfQUREUgorZDEwdl9wdXNoX2FyZ3VtZW50cyAobmFyZ3MsIGFyZ3MsIHNwLCBzdHJ1Y3RfcmV0dXJuLCBzdHJ1Y3RfYWRkcikKKyAgICAgaW50IG5hcmdzOworICAgICB2YWx1ZV9wdHIgKmFyZ3M7CisgICAgIENPUkVfQUREUiBzcDsKKyAgICAgaW50IHN0cnVjdF9yZXR1cm47CisgICAgIENPUkVfQUREUiBzdHJ1Y3RfYWRkcjsKK3sKKyAgaW50IGk7CisgIGludCByZWdudW0gPSBBUkcxX1JFR05VTTsKKyAgCisgIC8qIEZpbGwgaW4gcmVnaXN0ZXJzIGFuZCBhcmcgbGlzdHMgKi8KKyAgZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspCisgICAgeworICAgICAgdmFsdWVfcHRyIGFyZyA9IGFyZ3NbaV07CisgICAgICBzdHJ1Y3QgdHlwZSAqdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZykpOworICAgICAgY2hhciAqY29udGVudHMgPSBWQUxVRV9DT05URU5UUyAoYXJnKTsKKyAgICAgIGludCBsZW4gPSBUWVBFX0xFTkdUSCAodHlwZSk7CisgICAgICAvKiBwcmludGYgKCJwdXNoOiB0eXBlPSVkIGxlbj0lZFxuIiwgdHlwZS0+Y29kZSwgbGVuKTsgKi8KKyAgICAgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9QVFIpCisJeworCSAgLyogcG9pbnRlcnMgcmVxdWlyZSBzcGVjaWFsIGhhbmRsaW5nIC0gZmlyc3QgY29udmVydCBhbmQKKwkgICAgIHRoZW4gc3RvcmUgKi8KKwkgIGxvbmcgdmFsID0gZXh0cmFjdF9zaWduZWRfaW50ZWdlciAoY29udGVudHMsIGxlbik7CisJICBsZW4gPSAyOworCSAgaWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpCisJICAgICAgJiYgKFRZUEVfQ09ERSAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpID09IFRZUEVfQ09ERV9GVU5DKSkKKwkgICAgeworCSAgICAgIC8qIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKwkgICAgICB2YWwgPSBEMTBWX0NPTlZFUlRfSUFERFJfVE9fUkFXICh2YWwpOworCSAgICB9CisJICBlbHNlIGlmIChEMTBWX0lBRERSX1AgKHZhbCkpCisJICAgIHsKKwkgICAgICAvKiBhbHNvIGZ1bmN0aW9uIHBvaW50ZXIhICovCisJICAgICAgdmFsID0gRDEwVl9DT05WRVJUX0RBRERSX1RPX1JBVyAodmFsKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogZGF0YSBwb2ludGVyICovCisJICAgICAgdmFsICY9IDB4RkZGRjsKKwkgICAgfQorCSAgaWYgKHJlZ251bSA8PSBBUkdOX1JFR05VTSkKKwkgICAgd3JpdGVfcmVnaXN0ZXIgKHJlZ251bSsrLCB2YWwgJiAweGZmZmYpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgY2hhciBwdHJbMl07CisJICAgICAgc3AgLT0gMjsKKwkgICAgICBzdG9yZV9hZGRyZXNzIChwdHIsIHZhbCAmIDB4ZmZmZiwgMik7CisJICAgICAgd3JpdGVfbWVtb3J5IChzcCwgcHRyLCAyKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBpbnQgYWxpZ25lZF9yZWdudW0gPSAocmVnbnVtICsgMSkgJiB+MTsKKwkgIGlmIChsZW4gPD0gMiAmJiByZWdudW0gPD0gQVJHTl9SRUdOVU0pCisJICAgIC8qIGZpdHMgaW4gYSBzaW5nbGUgcmVnaXN0ZXIsIGRvIG5vdCBhbGlnbiAqLworCSAgICB7CisJICAgICAgbG9uZyB2YWwgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGNvbnRlbnRzLCBsZW4pOworCSAgICAgIHdyaXRlX3JlZ2lzdGVyIChyZWdudW0rKywgdmFsKTsKKwkgICAgfQorCSAgZWxzZSBpZiAobGVuIDw9IChBUkdOX1JFR05VTSAtIGFsaWduZWRfcmVnbnVtICsgMSkgKiAyKQorCSAgICAvKiB2YWx1ZSBmaXRzIGluIHJlbWFpbmluZyByZWdpc3RlcnMsIHN0b3JlIGtlZXBpbmcgbGVmdAorICAgICAgICAgICAgICAgYWxpZ25lZCAqLworCSAgICB7CisJICAgICAgaW50IGI7CisJICAgICAgcmVnbnVtID0gYWxpZ25lZF9yZWdudW07CisJICAgICAgZm9yIChiID0gMDsgYiA8IChsZW4gJiB+MSk7IGIgKz0gMikKKwkJeworCQkgIGxvbmcgdmFsID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyICgmY29udGVudHNbYl0sIDIpOworCQkgIHdyaXRlX3JlZ2lzdGVyIChyZWdudW0rKywgdmFsKTsKKwkJfQorCSAgICAgIGlmIChiIDwgbGVuKQorCQl7CisJCSAgbG9uZyB2YWwgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKCZjb250ZW50c1tiXSwgMSk7CisJCSAgd3JpdGVfcmVnaXN0ZXIgKHJlZ251bSsrLCAodmFsIDw8IDgpKTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBhcmcgZ29lcyBzdHJhaWdodCBvbiBzdGFjayAqLworCSAgICAgIHJlZ251bSA9IEFSR05fUkVHTlVNICsgMTsKKwkgICAgICBzcCA9IChzcCAtIGxlbikgJiB+MTsKKwkgICAgICB3cml0ZV9tZW1vcnkgKHNwLCBjb250ZW50cywgbGVuKTsKKwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybiBzcDsKK30KKworCisvKiBHaXZlbiBhIHJldHVybiB2YWx1ZSBpbiBgcmVnYnVmJyB3aXRoIGEgdHlwZSBgdmFsdHlwZScsIAorICAgZXh0cmFjdCBhbmQgY29weSBpdHMgdmFsdWUgaW50byBgdmFsYnVmJy4gICovCisKK3ZvaWQKK2QxMHZfZXh0cmFjdF9yZXR1cm5fdmFsdWUgKHR5cGUsIHJlZ2J1ZiwgdmFsYnVmKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgY2hhciByZWdidWZbUkVHSVNURVJfQllURVNdOworICAgICBjaGFyICp2YWxidWY7Cit7CisgIGludCBsZW47CisgIC8qICAgIHByaW50ZigiUkVUOiBUWVBFPSVkIGxlbj0lZCByJWQ9MHgleFxuIix0eXBlLT5jb2RlLCBUWVBFX0xFTkdUSCAodHlwZSksIFJFVDFfUkVHTlVNIC0gUjBfUkVHTlVNLCAoaW50KSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKHJlZ2J1ZiArIFJFR0lTVEVSX0JZVEUoUkVUMV9SRUdOVU0pLCBSRUdJU1RFUl9SQVdfU0laRSAoUkVUMV9SRUdOVU0pKSk7ICAqLworICBpZiAoVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfUFRSCisgICAgICAmJiBUWVBFX1RBUkdFVF9UWVBFICh0eXBlKQorICAgICAgJiYgKFRZUEVfQ09ERSAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpID09IFRZUEVfQ09ERV9GVU5DKSkKKyAgICB7CisgICAgICAvKiBwb2ludGVyIHRvIGZ1bmN0aW9uICovCisgICAgICBpbnQgbnVtOworICAgICAgc2hvcnQgc251bTsKKyAgICAgIHNudW0gPSBleHRyYWN0X2FkZHJlc3MgKHJlZ2J1ZiArIFJFR0lTVEVSX0JZVEUgKFJFVDFfUkVHTlVNKSwgUkVHSVNURVJfUkFXX1NJWkUgKFJFVDFfUkVHTlVNKSk7CisgICAgICBzdG9yZV9hZGRyZXNzICggdmFsYnVmLCA0LCBEMTBWX01BS0VfSUFERFIoc251bSkpOworICAgIH0KKyAgZWxzZSBpZiAoVFlQRV9DT0RFKHR5cGUpID09IFRZUEVfQ09ERV9QVFIpCisgICAgeworICAgICAgLyogcG9pbnRlciB0byBkYXRhICovCisgICAgICBpbnQgbnVtOworICAgICAgc2hvcnQgc251bTsKKyAgICAgIHNudW0gPSBleHRyYWN0X2FkZHJlc3MgKHJlZ2J1ZiArIFJFR0lTVEVSX0JZVEUgKFJFVDFfUkVHTlVNKSwgUkVHSVNURVJfUkFXX1NJWkUgKFJFVDFfUkVHTlVNKSk7CisgICAgICBzdG9yZV9hZGRyZXNzICggdmFsYnVmLCA0LCBEMTBWX01BS0VfREFERFIoc251bSkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxlbiA9IFRZUEVfTEVOR1RIICh0eXBlKTsKKyAgICAgIGlmIChsZW4gPT0gMSkKKwl7CisJICB1bnNpZ25lZCBzaG9ydCBjID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChyZWdidWYgKyBSRUdJU1RFUl9CWVRFIChSRVQxX1JFR05VTSksIFJFR0lTVEVSX1JBV19TSVpFIChSRVQxX1JFR05VTSkpOworCSAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAodmFsYnVmLCAxLCBjKTsKKwl9CisgICAgICBlbHNlIGlmICgobGVuICYgMSkgPT0gMCkKKwltZW1jcHkgKHZhbGJ1ZiwgcmVnYnVmICsgUkVHSVNURVJfQllURSAoUkVUMV9SRUdOVU0pLCBsZW4pOworICAgICAgZWxzZQorCXsKKwkgIC8qIEZvciByZXR1cm4gdmFsdWVzIG9mIG9kZCBzaXplLCB0aGUgZmlyc3QgYnl0ZSBpcyBpbiB0aGUKKyAgICAgICAgICAgICBsZWFzdCBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSBmaXJzdCByZWdpc3Rlci4gIFRoZQorICAgICAgICAgICAgIHJlbWFpbmluZyBieXRlcyBpbiByZW1haW5pbmcgcmVnaXN0ZXJzLiBJbnRlcmVzdGluZ2x5LAorICAgICAgICAgICAgIHdoZW4gc3VjaCB2YWx1ZXMgYXJlIHBhc3NlZCBpbiwgdGhlIGxhc3QgYnl0ZSBpcyBpbiB0aGUKKyAgICAgICAgICAgICBtb3N0IHNpZ25pZmljYW50IGJ5dGUgb2YgdGhhdCBzYW1lIHJlZ2lzdGVyIC0gd2llcmQuICovCisJICBtZW1jcHkgKHZhbGJ1ZiwgcmVnYnVmICsgUkVHSVNURVJfQllURSAoUkVUMV9SRUdOVU0pICsgMSwgbGVuKTsKKwl9CisgICAgfQorfQorCisvKiBUaGUgZm9sbG93aW5nIGNvZGUgaW1wbGVtZW50cyBhY2Nlc3MgdG8sIGFuZCBkaXNwbGF5IG9mLCB0aGUgRDEwVidzCisgICBpbnN0cnVjdGlvbiB0cmFjZSBidWZmZXIuICBUaGUgYnVmZmVyIGNvbnNpc3RzIG9mIDY0SyBvciBtb3JlCisgICA0LWJ5dGUgd29yZHMgb2YgZGF0YSwgb2Ygd2hpY2ggZWFjaCB3b3JkcyBpbmNsdWRlcyBhbiA4LWJpdCBjb3VudCwKKyAgIGFuIDgtYml0IHNlZ21lbnQgbnVtYmVyLCBhbmQgYSAxNi1iaXQgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4KKworICAgSW4gdGhlb3J5LCB0aGUgdHJhY2UgYnVmZmVyIGlzIGNvbnRpbnVvdXNseSBjYXB0dXJpbmcgaW5zdHJ1Y3Rpb24KKyAgIGRhdGEgdGhhdCB0aGUgQ1BVIHByZXNlbnRzIG9uIGl0cyAiZGVidWcgYnVzIiwgYnV0IGluIHByYWN0aWNlLCB0aGUKKyAgIFJPTWlmaWVkIEdEQiBzdHViIG9ubHkgZW5hYmxlcyB0cmFjaW5nIHdoZW4gaXQgY29udGludWVzIG9yIHN0ZXBzCisgICB0aGUgcHJvZ3JhbSwgYW5kIHN0b3BzIHRyYWNpbmcgd2hlbiB0aGUgcHJvZ3JhbSBzdG9wczsgc28gaXQKKyAgIGFjdHVhbGx5IHdvcmtzIGZvciBHREIgdG8gcmVhZCB0aGUgYnVmZmVyIGNvdW50ZXIgb3V0IG9mIG1lbW9yeSBhbmQKKyAgIHRoZW4gcmVhZCBlYWNoIHRyYWNlIHdvcmQuICBUaGUgY291bnRlciByZWNvcmRzIHdoZXJlIHRoZSB0cmFjaW5nCisgICBzdG9wcywgYnV0IHRoZXJlIGlzIG5vIHJlY29yZCBvZiB3aGVyZSBpdCBzdGFydGVkLCBzbyB3ZSByZW1lbWJlcgorICAgdGhlIFBDIHdoZW4gd2UgcmVzdW1lZCBhbmQgdGhlbiBzZWFyY2ggYmFja3dhcmRzIGluIHRoZSB0cmFjZQorICAgYnVmZmVyIGZvciBhIHdvcmQgdGhhdCBpbmNsdWRlcyB0aGF0IGFkZHJlc3MuICBUaGlzIGlzIG5vdCBwZXJmZWN0LAorICAgYmVjYXVzZSB5b3Ugd2lsbCBtaXNzIHRyYWNlIGRhdGEgaWYgdGhlIHJlc3VtcHRpb24gUEMgaXMgdGhlIHRhcmdldAorICAgb2YgYSBicmFuY2guICAoVGhlIHZhbHVlIG9mIHRoZSBidWZmZXIgY291bnRlciBpcyBzZW1pLXJhbmRvbSwgYW55CisgICB0cmFjZSBkYXRhIGZyb20gYSBwcmV2aW91cyBwcm9ncmFtIHN0b3AgaXMgZ29uZS4pICAqLworCisvKiBUaGUgYWRkcmVzcyBvZiB0aGUgbGFzdCB3b3JkIHJlY29yZGVkIGluIHRoZSB0cmFjZSBidWZmZXIuICAqLworCisjZGVmaW5lIERCQkNfQUREUiAoMHhkODAwMDApCisKKy8qIFRoZSBiYXNlIG9mIHRoZSB0cmFjZSBidWZmZXIsIGF0IGxlYXN0IGZvciB0aGUgIkJvYXJkXzAiLiAgKi8KKworI2RlZmluZSBUUkFDRV9CVUZGRVJfQkFTRSAoMHhmNDAwMDApCisKK3N0YXRpYyB2b2lkIHRyYWNlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgdW50cmFjZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHRyYWNlX2luZm8gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgdGRpc2Fzc2VtYmxlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgZGlzcGxheV90cmFjZSBQQVJBTVMgKChpbnQsIGludCkpOworCisvKiBUcnVlIHdoZW4gaW5zdHJ1Y3Rpb24gdHJhY2VzIGFyZSBiZWluZyBjb2xsZWN0ZWQuICAqLworCitzdGF0aWMgaW50IHRyYWNpbmc7CisKKy8qIFJlbWVtYmVyZWQgUEMuICAqLworCitzdGF0aWMgQ09SRV9BRERSIGxhc3RfcGM7CisKKy8qIFRydWUgd2hlbiB0cmFjZSBvdXRwdXQgc2hvdWxkIGJlIGRpc3BsYXllZCB3aGVuZXZlciBwcm9ncmFtIHN0b3BzLiAgKi8KKworc3RhdGljIGludCB0cmFjZV9kaXNwbGF5OworCisvKiBUcnVlIHdoZW4gdHJhY2UgbGlzdGluZyBzaG91bGQgaW5jbHVkZSBzb3VyY2UgbGluZXMuICAqLworCitzdGF0aWMgaW50IGRlZmF1bHRfdHJhY2Vfc2hvd19zb3VyY2UgPSAxOworCitzdHJ1Y3QgdHJhY2VfYnVmZmVyIHsKKyAgaW50IHNpemU7CisgIHNob3J0ICpjb3VudHM7CisgIENPUkVfQUREUiAqYWRkcnM7Cit9IHRyYWNlX2RhdGE7CisKK3N0YXRpYyB2b2lkCit0cmFjZV9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICAvKiBDbGVhciB0aGUgaG9zdC1zaWRlIHRyYWNlIGJ1ZmZlciwgYWxsb2NhdGluZyBzcGFjZSBpZiBuZWVkZWQuICAqLworICB0cmFjZV9kYXRhLnNpemUgPSAwOworICBpZiAodHJhY2VfZGF0YS5jb3VudHMgPT0gTlVMTCkKKyAgICB0cmFjZV9kYXRhLmNvdW50cyA9IChzaG9ydCAqKSB4bWFsbG9jICg2NTUzNiAqIHNpemVvZihzaG9ydCkpOworICBpZiAodHJhY2VfZGF0YS5hZGRycyA9PSBOVUxMKQorICAgIHRyYWNlX2RhdGEuYWRkcnMgPSAoQ09SRV9BRERSICopIHhtYWxsb2MgKDY1NTM2ICogc2l6ZW9mKENPUkVfQUREUikpOworCisgIHRyYWNpbmcgPSAxOworCisgIHByaW50Zl9maWx0ZXJlZCAoIlRyYWNpbmcgaXMgbm93IG9uLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCit1bnRyYWNlX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHRyYWNpbmcgPSAwOworCisgIHByaW50Zl9maWx0ZXJlZCAoIlRyYWNpbmcgaXMgbm93IG9mZi5cbiIpOworfQorCitzdGF0aWMgdm9pZAordHJhY2VfaW5mbyAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IGk7CisKKyAgaWYgKHRyYWNlX2RhdGEuc2l6ZSkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIlZCBlbnRyaWVzIGluIHRyYWNlIGJ1ZmZlcjpcbiIsIHRyYWNlX2RhdGEuc2l6ZSk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0cmFjZV9kYXRhLnNpemU7ICsraSkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCIlZDogJWQgaW5zdHJ1Y3Rpb24lcyBhdCAweCV4XG4iLAorCQkJICAgaSwgdHJhY2VfZGF0YS5jb3VudHNbaV0sCisJCQkgICAodHJhY2VfZGF0YS5jb3VudHNbaV0gPT0gMSA/ICIiIDogInMiKSwKKwkJCSAgIHRyYWNlX2RhdGEuYWRkcnNbaV0pOworCX0KKyAgICB9CisgIGVsc2UKKyAgICBwcmludGZfZmlsdGVyZWQgKCJObyBlbnRyaWVzIGluIHRyYWNlIGJ1ZmZlci5cbiIpOworCisgIHByaW50Zl9maWx0ZXJlZCAoIlRyYWNpbmcgaXMgY3VycmVudGx5ICVzLlxuIiwgKHRyYWNpbmcgPyAib24iIDogIm9mZiIpKTsKK30KKworLyogUHJpbnQgdGhlIGluc3RydWN0aW9uIGF0IGFkZHJlc3MgTUVNQUREUiBpbiBkZWJ1Z2dlZCBtZW1vcnksCisgICBvbiBTVFJFQU0uICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLiAgKi8KKworc3RhdGljIGludAorcHJpbnRfaW5zbiAobWVtYWRkciwgc3RyZWFtKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgLyogSWYgdGhlcmUncyBubyBkaXNhc3NlbWJsZXIsIHNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiAgKi8KKyAgaWYgKHRtX3ByaW50X2luc24gPT0gTlVMTCkKKyAgICBhYm9ydCAoKTsKKworICBpZiAoVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKKyAgICB0bV9wcmludF9pbnNuX2luZm8uZW5kaWFuID0gQkZEX0VORElBTl9CSUc7CisgIGVsc2UKKyAgICB0bV9wcmludF9pbnNuX2luZm8uZW5kaWFuID0gQkZEX0VORElBTl9MSVRUTEU7CisgIHJldHVybiAoKnRtX3ByaW50X2luc24pIChtZW1hZGRyLCAmdG1fcHJpbnRfaW5zbl9pbmZvKTsKK30KKwordm9pZAorZDEwdl9ldmFfcHJlcGFyZV90b190cmFjZSAoKQoreworICBpZiAoIXRyYWNpbmcpCisgICAgcmV0dXJuOworCisgIGxhc3RfcGMgPSByZWFkX3JlZ2lzdGVyIChQQ19SRUdOVU0pOworfQorCisvKiBDb2xsZWN0IHRyYWNlIGRhdGEgZnJvbSB0aGUgdGFyZ2V0IGJvYXJkIGFuZCBmb3JtYXQgaXQgaW50byBhIGZvcm0KKyAgIG1vcmUgdXNlZnVsIGZvciBkaXNwbGF5LiAgKi8KKwordm9pZAorZDEwdl9ldmFfZ2V0X3RyYWNlX2RhdGEgKCkKK3sKKyAgaW50IGNvdW50LCBpLCBqLCBvbGRzaXplOworICBpbnQgdHJhY2VfYWRkciwgdHJhY2Vfc2VnLCB0cmFjZV9jbnQsIG5leHRfY250OworICB1bnNpZ25lZCBpbnQgbGFzdF90cmFjZSwgdHJhY2Vfd29yZCwgbmV4dF93b3JkOworICB1bnNpZ25lZCBpbnQgKnRtcHNwYWNlOworCisgIGlmICghdHJhY2luZykKKyAgICByZXR1cm47CisKKyAgdG1wc3BhY2UgPSB4bWFsbG9jICg2NTUzNiAqIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKworICBsYXN0X3RyYWNlID0gcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoREJCQ19BRERSLCAyKSA8PCAyOworCisgIC8qIENvbGxlY3QgYnVmZmVyIGNvbnRlbnRzIGZyb20gdGhlIHRhcmdldCwgc3RvcHBpbmcgd2hlbiB3ZSByZWFjaAorICAgICB0aGUgd29yZCByZWNvcmRlZCB3aGVuIGV4ZWN1dGlvbiByZXN1bWVkLiAgKi8KKworICBjb3VudCA9IDA7CisgIHdoaWxlIChsYXN0X3RyYWNlID4gMCkKKyAgICB7CisgICAgICBRVUlUOworICAgICAgdHJhY2Vfd29yZCA9CisJcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoVFJBQ0VfQlVGRkVSX0JBU0UgKyBsYXN0X3RyYWNlLCA0KTsKKyAgICAgIHRyYWNlX2FkZHIgPSB0cmFjZV93b3JkICYgMHhmZmZmOworICAgICAgbGFzdF90cmFjZSAtPSA0OworICAgICAgLyogSWdub3JlIGFuIGFwcGFyZW50bHkgbm9uc2Vuc2ljYWwgZW50cnkuICAqLworICAgICAgaWYgKHRyYWNlX2FkZHIgPT0gMHhmZmQ1KQorCWNvbnRpbnVlOworICAgICAgdG1wc3BhY2VbY291bnQrK10gPSB0cmFjZV93b3JkOworICAgICAgaWYgKHRyYWNlX2FkZHIgPT0gbGFzdF9wYykKKwlicmVhazsKKyAgICAgIGlmIChjb3VudCA+IDY1NTM1KQorCWJyZWFrOworICAgIH0KKworICAvKiBNb3ZlIHRoZSBkYXRhIHRvIHRoZSBob3N0LXNpZGUgdHJhY2UgYnVmZmVyLCBhZGp1c3RpbmcgY291bnRzIHRvCisgICAgIGluY2x1ZGUgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gZXhlY3V0ZWQgYW5kIHRyYW5zZm9ybWluZyB0aGUgYWRkcmVzcworICAgICBpbnRvIHNvbWV0aGluZyB0aGF0IEdEQiBsaWtlcy4gICovCisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgeworICAgICAgdHJhY2Vfd29yZCA9IHRtcHNwYWNlW2ldOworICAgICAgbmV4dF93b3JkID0gKChpID09IDApID8gMCA6IHRtcHNwYWNlW2kgLSAxXSk7CisgICAgICB0cmFjZV9hZGRyID0gdHJhY2Vfd29yZCAmIDB4ZmZmZjsKKyAgICAgIG5leHRfY250ID0gKG5leHRfd29yZCA+PiAyNCkgJiAweGZmOworICAgICAgaiA9IHRyYWNlX2RhdGEuc2l6ZSArIGNvdW50IC0gaSAtIDE7CisgICAgICB0cmFjZV9kYXRhLmFkZHJzW2pdID0gKHRyYWNlX2FkZHIgPDwgMikgKyAweDEwMDAwMDA7CisgICAgICB0cmFjZV9kYXRhLmNvdW50c1tqXSA9IG5leHRfY250ICsgMTsKKyAgICB9CisKKyAgb2xkc2l6ZSA9IHRyYWNlX2RhdGEuc2l6ZTsKKyAgdHJhY2VfZGF0YS5zaXplICs9IGNvdW50OworCisgIGZyZWUgKHRtcHNwYWNlKTsKKworICBpZiAodHJhY2VfZGlzcGxheSkKKyAgICBkaXNwbGF5X3RyYWNlIChvbGRzaXplLCB0cmFjZV9kYXRhLnNpemUpOworfQorCitzdGF0aWMgdm9pZAordGRpc2Fzc2VtYmxlX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpbnQgaSwgY291bnQ7CisgIENPUkVfQUREUiBsb3csIGhpZ2g7CisgIGNoYXIgKnNwYWNlX2luZGV4OworCisgIGlmICghYXJnKQorICAgIHsKKyAgICAgIGxvdyA9IDA7CisgICAgICBoaWdoID0gdHJhY2VfZGF0YS5zaXplOworICAgIH0KKyAgZWxzZSBpZiAoIShzcGFjZV9pbmRleCA9IChjaGFyICopIHN0cmNociAoYXJnLCAnICcpKSkKKyAgICB7CisgICAgICBsb3cgPSBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIChhcmcpOworICAgICAgaGlnaCA9IGxvdyArIDU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVHdvIGFyZ3VtZW50cy4gICovCisgICAgICAqc3BhY2VfaW5kZXggPSAnXDAnOworICAgICAgbG93ID0gcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAoYXJnKTsKKyAgICAgIGhpZ2ggPSBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIChzcGFjZV9pbmRleCArIDEpOworICAgICAgaWYgKGhpZ2ggPCBsb3cpCisJaGlnaCA9IGxvdzsKKyAgICB9CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiRHVtcCBvZiB0cmFjZSBmcm9tICVkIHRvICVkOlxuIiwgbG93LCBoaWdoKTsKKworICBkaXNwbGF5X3RyYWNlIChsb3csIGhpZ2gpOworCisgIHByaW50Zl9maWx0ZXJlZCAoIkVuZCBvZiB0cmFjZSBkdW1wLlxuIik7CisgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7Cit9CisKK3N0YXRpYyB2b2lkCitkaXNwbGF5X3RyYWNlIChsb3csIGhpZ2gpCisgICAgIGludCBsb3csIGhpZ2g7Cit7CisgIGludCBpLCBjb3VudCwgdHJhY2Vfc2hvd19zb3VyY2UsIGZpcnN0LCBzdXBwcmVzczsKKyAgQ09SRV9BRERSIG5leHRfYWRkcmVzczsKKworICB0cmFjZV9zaG93X3NvdXJjZSA9IGRlZmF1bHRfdHJhY2Vfc2hvd19zb3VyY2U7CisgIGlmICghaGF2ZV9mdWxsX3N5bWJvbHMgKCkgJiYgIWhhdmVfcGFydGlhbF9zeW1ib2xzKCkpCisgICAgeworICAgICAgdHJhY2Vfc2hvd19zb3VyY2UgPSAwOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiTm8gc3ltYm9sIHRhYmxlIGlzIGxvYWRlZC4gIFVzZSB0aGUgXCJmaWxlXCIgY29tbWFuZC5cbiIpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiVHJhY2Ugd2lsbCBub3QgZGlzcGxheSBhbnkgc291cmNlLlxuIik7CisgICAgfQorCisgIGZpcnN0ID0gMTsKKyAgc3VwcHJlc3MgPSAwOworICBmb3IgKGkgPSBsb3c7IGkgPCBoaWdoOyArK2kpCisgICAgeworICAgICAgbmV4dF9hZGRyZXNzID0gdHJhY2VfZGF0YS5hZGRyc1tpXTsKKyAgICAgIGNvdW50ID0gdHJhY2VfZGF0YS5jb3VudHNbaV07IAorICAgICAgd2hpbGUgKGNvdW50LS0gPiAwKQorCXsKKwkgIFFVSVQ7CisJICBpZiAodHJhY2Vfc2hvd19zb3VyY2UpCisJICAgIHsKKwkgICAgICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbCwgc2FsX3ByZXY7CisKKwkgICAgICBzYWxfcHJldiA9IGZpbmRfcGNfbGluZSAobmV4dF9hZGRyZXNzIC0gNCwgMCk7CisJICAgICAgc2FsID0gZmluZF9wY19saW5lIChuZXh0X2FkZHJlc3MsIDApOworCisJICAgICAgaWYgKHNhbC5zeW10YWIpCisJCXsKKwkJICBpZiAoZmlyc3QgfHwgc2FsLmxpbmUgIT0gc2FsX3ByZXYubGluZSkKKwkJICAgIHByaW50X3NvdXJjZV9saW5lcyAoc2FsLnN5bXRhYiwgc2FsLmxpbmUsIHNhbC5saW5lICsgMSwgMCk7CisJCSAgc3VwcHJlc3MgPSAwOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKCFzdXBwcmVzcykKKwkJICAgIC8qIEZJWE1FLTMyeDY0LS1hc3N1bWVzIHNhbC5wYyBmaXRzIGluIGxvbmcuICAqLworCQkgICAgcHJpbnRmX2ZpbHRlcmVkICgiTm8gc291cmNlIGZpbGUgZm9yIGFkZHJlc3MgJXMuXG4iLAorCQkJCSAgICAgbG9jYWxfaGV4X3N0cmluZygodW5zaWduZWQgbG9uZykgc2FsLnBjKSk7CisJCSAgc3VwcHJlc3MgPSAxOworCQl9CisJICAgIH0KKwkgIGZpcnN0ID0gMDsKKwkgIHByaW50X2FkZHJlc3MgKG5leHRfYWRkcmVzcywgZ2RiX3N0ZG91dCk7CisJICBwcmludGZfZmlsdGVyZWQgKCI6Iik7CisJICBwcmludGZfZmlsdGVyZWQgKCJcdCIpOworCSAgd3JhcF9oZXJlICgiICAgICIpOworCSAgbmV4dF9hZGRyZXNzID0gbmV4dF9hZGRyZXNzICsgcHJpbnRfaW5zbiAobmV4dF9hZGRyZXNzLCBnZGJfc3Rkb3V0KTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisJICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCX0KKyAgICB9Cit9CisKK2V4dGVybiB2b2lkICgqdGFyZ2V0X3Jlc3VtZV9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCAoKnRhcmdldF93YWl0X2xvb3BfaG9vaykgUEFSQU1TICgodm9pZCkpOworCit2b2lkCitfaW5pdGlhbGl6ZV9kMTB2X3RkZXAgKCkKK3sKKyAgdG1fcHJpbnRfaW5zbiA9IHByaW50X2luc25fZDEwdjsKKworICB0YXJnZXRfcmVzdW1lX2hvb2sgPSBkMTB2X2V2YV9wcmVwYXJlX3RvX3RyYWNlOworICB0YXJnZXRfd2FpdF9sb29wX2hvb2sgPSBkMTB2X2V2YV9nZXRfdHJhY2VfZGF0YTsKKworICBhZGRfY29tICgicmVncyIsIGNsYXNzX3ZhcnMsIHNob3dfcmVncywgIlByaW50IGFsbCByZWdpc3RlcnMiKTsKKworICBhZGRfY29tICgidHJhY2UiLCBjbGFzc19zdXBwb3J0LCB0cmFjZV9jb21tYW5kLAorCSAgICJFbmFibGUgdHJhY2luZyBvZiBpbnN0cnVjdGlvbiBleGVjdXRpb24uIik7CisKKyAgYWRkX2NvbSAoInVudHJhY2UiLCBjbGFzc19zdXBwb3J0LCB1bnRyYWNlX2NvbW1hbmQsCisJICAgIkRpc2FibGUgdHJhY2luZyBvZiBpbnN0cnVjdGlvbiBleGVjdXRpb24uIik7CisKKyAgYWRkX2NvbSAoInRkaXNhc3NlbWJsZSIsIGNsYXNzX3ZhcnMsIHRkaXNhc3NlbWJsZV9jb21tYW5kLAorCSAgICJEaXNhc3NlbWJsZSB0aGUgdHJhY2UgYnVmZmVyLlxuXAorVHdvIG9wdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZ5IGEgcmFuZ2Ugb2YgdHJhY2UgYnVmZmVyIGVudHJpZXNcblwKK2FzIHJlcG9ydGVkIGJ5IGluZm8gdHJhY2UgKE5PVCBhZGRyZXNzZXMhKS4iKTsKKworICBhZGRfaW5mbyAoInRyYWNlIiwgdHJhY2VfaW5mbywKKwkgICAgIkRpc3BsYXkgaW5mbyBhYm91dCB0aGUgdHJhY2UgZGF0YSBidWZmZXIuIik7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQgKGFkZF9zZXRfY21kICgidHJhY2VkaXNwbGF5Iiwgbm9fY2xhc3MsCisJCQkJICB2YXJfaW50ZWdlciwgKGNoYXIgKikmdHJhY2VfZGlzcGxheSwKKwkJCQkgICJTZXQgYXV0b21hdGljIGRpc3BsYXkgb2YgdHJhY2UuXG4iLCAmc2V0bGlzdCksCisJCSAgICAgJnNob3dsaXN0KTsKKyAgYWRkX3Nob3dfZnJvbV9zZXQgKGFkZF9zZXRfY21kICgidHJhY2Vzb3VyY2UiLCBub19jbGFzcywKKwkJCQkgIHZhcl9pbnRlZ2VyLCAoY2hhciAqKSZkZWZhdWx0X3RyYWNlX3Nob3dfc291cmNlLAorCQkJCSAgIlNldCBkaXNwbGF5IG9mIHNvdXJjZSBjb2RlIHdpdGggdHJhY2UuXG4iLCAmc2V0bGlzdCksCisJCSAgICAgJnNob3dsaXN0KTsKKworfSAKZGlmZiAtLWdpdCBhL2dkYi9kMzB2LXRkZXAuYyBiL2dkYi9kMzB2LXRkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzQ2NDYzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2QzMHYtdGRlcC5jCkBAIC0wLDAgKzEsMTM5NiBAQAorLyogVGFyZ2V0LWRlcGVuZGVudCBjb2RlIGZvciBNaXRzdWJpc2hpIEQzMFYsIGZvciBHREIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogIENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiBIdW50LCBodW50QGN5Z251cy5jb20gKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgImRpcy1hc20uaCIgIAorI2luY2x1ZGUgInN5bWZpbGUuaCIKKyNpbmNsdWRlICJvYmpmaWxlcy5oIgorCit2b2lkIGQzMHZfZnJhbWVfZmluZF9zYXZlZF9yZWdzIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICpmaSwKKwkJCQkJIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICpmc3IpKTsKK3ZvaWQgZDMwdl9mcmFtZV9maW5kX3NhdmVkX3JlZ3Nfb2Zmc2V0cyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqZmksCisJCQkJCQkgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKmZzcikpOworc3RhdGljIHZvaWQgZDMwdl9wb3BfZHVtbXlfZnJhbWUgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKmZpKSk7CitzdGF0aWMgdm9pZCBkMzB2X3ByaW50X2ZsYWdzIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHByaW50X2ZsYWdzX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworLyogdGhlIGZvbGxvd2luZyBkZWZpbmVzIGFzc3VtZToKKyAgIGZwIGlzIHI2MSwgbHIgaXMgcjYyLCBzcCBpcyByNjMsIGFuZCA/PyBpcyByMjIKKyAgIGlmIHRoYXQgY2hhbmdlcywgdGhleSB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZCAqLworCisjZGVmaW5lIE9QX01BU0tfQUxMX0JVVF9SQQkweDBmZmMwZmZmIC8qIHRocm93IGF3YXkgUmEsIGtlZXAgdGhlIHJlc3QgKi8KKworI2RlZmluZSBPUF9TVFdfU1BNCQkweDA1NGMwZmMwIC8qIHN0dyBSYSwgQChzcC0pICovCisjZGVmaW5lIE9QX1NUV19TUF9SMAkJMHgwNTQwMGZjMCAvKiBzdHcgUmEsIEAoc3AscjApICovCisjZGVmaW5lIE9QX1NUV19TUF9JTU0wCQkweDA1NDgwZmMwIC8qIHN0IFJhLCBAKHNwLCAweDApICovCisjZGVmaW5lIE9QX1NUV19SMjJQX1IwCQkweDA1NDQwNTgwIC8qIHN0dyBSYSwgQChyMjIrLHIwKSAqLworCisjZGVmaW5lIE9QX1NUMldfU1BNCQkweDA1NmMwZmMwIC8qIHN0MncgUmEsIEAoc3AtKSAqLworI2RlZmluZSBPUF9TVDJXX1NQX1IwCQkweDA1NjAwZmMwIC8qIHN0MncgUmEsIEAoc3AsIHIwKSAqLworI2RlZmluZSBPUF9TVDJXX1NQX0lNTTAJCTB4MDU2ODBmYzAgLyogc3QydyBSYSwgQChzcCwgMHgwKSAqLworI2RlZmluZSBPUF9TVDJXX1IyMlBfUjAJCTB4MDU2NDA1ODAgLyogc3QydyBSYSwgQChyMjIrLCByMCkgKi8KKworI2RlZmluZSBPUF9NQVNLX09QQ09ERQkJMHgwZmZjMDAwMCAvKiBqdXN0IHRoZSBvcGNvZGUsIGlnbiBvcGVyYW5kcyAqLworI2RlZmluZSBPUF9OT1AJCQkweDAwZjAwMDAwIC8qIG5vcCAqLworCisjZGVmaW5lIE9QX01BU0tfQUxMX0JVVF9JTU0JMHgwZmZmZmZjMCAvKiB0aHJvdyBhd2F5IGltbSwga2VlcCB0aGUgcmVzdCAqLworI2RlZmluZSBPUF9TVUJfU1BfSU1NCQkweDA4MmJmZmMwIC8qIHN1YiBzcCxzcCxpbW0gKi8KKyNkZWZpbmUgT1BfQUREX1NQX0lNTQkJMHgwODBiZmZjMCAvKiBhZGQgc3Asc3AsaW1tICovCisjZGVmaW5lIE9QX0FERF9SMjJfU1BfSU1NCTB4MDgwOTZmYzAgLyogYWRkIHIyMixzcCxpbW0gKi8KKyNkZWZpbmUgT1BfU1RXX0ZQX1NQX0lNTQkweDA1NGJkZmMwIC8qIHN0dyBmcCxAKHNwLGltbSkgKi8KKyNkZWZpbmUgT1BfT1JfU1BfUjBfSU1NCQkweDAzYWJmMDAwIC8qIG9yIHNwLHIwLGltbSAqLworCisvKiBubyBtYXNrICovCisjZGVmaW5lIE9QX09SX0ZQX1IwX1NQCQkweDAzYTNkMDNmIC8qIG9yIGZwLHIwLHNwICovCisjZGVmaW5lIE9QX09SX0ZQX1NQX1IwCQkweDAzYTNkZmMwIC8qIG9yIGZwLHNwLHIwICovCisjZGVmaW5lIE9QX09SX0ZQX0lNTTBfU1AJMHgwM2FiZDAzZiAvKiBvciBmcCwweDAsc3AgKi8KKyNkZWZpbmUgT1BfU1RXX0ZQX1IyMlBfUjAJMHgwNTQ3ZDU4MCAvKiBzdHcgZnAsQChyMjIrLHIwKSAqLworI2RlZmluZSBPUF9TVFdfTFJfUjIyUF9SMAkweDA1NDdlNTgwIC8qIHN0dyBscixAKHIyMisscjApICovCisKKyNkZWZpbmUgT1BfTUFTS19PUF9BTkRfUkIJMHgwZmY4MGZjMCAvKiBrZWVwIG9wIGFuZCByYix0aHJvdyBhd2F5IHJlc3QgKi8KKyNkZWZpbmUgT1BfU1RXX1NQX0lNTQkJMHgwNTQ4MGZjMCAvKiBzdHcgUmEsQChzcCxpbW0pICovCisjZGVmaW5lIE9QX1NUMldfU1BfSU1NCQkweDA1NjgwZmMwIC8qIHN0MncgUmEsQChzcCxpbW0pICovCisjZGVmaW5lIE9QX1NUV19GUF9JTU0JCTB4MDU0ODBmNDAgLyogc3R3IFJhLEAoZnAsaW1tKSAqLworI2RlZmluZSBPUF9TVFdfRlBfUjAJCTB4MDU0MDBmNDAgLyogc3R3IFJhLEAoZnAscjApICovCisKKyNkZWZpbmUgT1BfTUFTS19GTV9CSVQJCTB4ODAwMDAwMDAKKyNkZWZpbmUgT1BfTUFTS19DQ19CSVRTCQkweDcwMDAwMDAwCisjZGVmaW5lIE9QX01BU0tfU1VCX0lOU1QJMHgwZmZmZmZmZgorCisjZGVmaW5lIEVYVFJBQ1RfUkEob3ApCQkoKChvcCkgPj4gMTIpICYgMHgzZikKKyNkZWZpbmUgRVhUUkFDVF9SQihvcCkJCSgoKG9wKSA+PiA2KSAmIDB4M2YpCisjZGVmaW5lIEVYVFJBQ1RfUkMob3ApCQkoKChvcCkgJiAweDNmKQorI2RlZmluZSBFWFRSQUNUX1VJTU02KG9wKQkoKG9wKSAmIDB4M2YpCisjZGVmaW5lIEVYVFJBQ1RfSU1NNihvcCkJKCgoKGludClFWFRSQUNUX1VJTU02KG9wKSkgPDwgMjYpID4+IDI2KQorI2RlZmluZSBFWFRSQUNUX0lNTTI2KG9wKQkoKCgob3ApJjB4MGZmMDAwMDApID4+IDIpIHwgKChvcCkmMHgwMDAzZmZmZikpCisjZGVmaW5lIEVYVFJBQ1RfSU1NMzIob3BsLCBvcHIpCSgoRVhUUkFDVF9VSU1NNihvcGwpIDw8IDI2KXxFWFRSQUNUX0lNTTI2KG9wcikpCisKKworaW50CitkMzB2X2ZyYW1lX2NoYWluX3ZhbGlkIChjaGFpbiwgZmkpCisgICAgIENPUkVfQUREUiBjaGFpbjsKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOyAgICAgIC8qIG5vdCB1c2VkIGhlcmUgKi8KK3sKKyNpZiAwCisgIHJldHVybiAoKGNoYWluKSAhPSAwICYmIChmaSkgIT0gMCAmJiAoZmkpLT5yZXR1cm5fcGMgIT0gMCk7CisjZWxzZQorICByZXR1cm4gKChjaGFpbikgIT0gMCAmJiAoZmkpICE9IDAgJiYgKGZpKS0+ZnJhbWUgPD0gY2hhaW4pOworI2VuZGlmCit9CisKKy8qIERpc2NhcmQgZnJvbSB0aGUgc3RhY2sgdGhlIGlubmVybW9zdCBmcmFtZSwgcmVzdG9yaW5nIGFsbCBzYXZlZAorICAgcmVnaXN0ZXJzLiAgKi8KKwordm9pZAorZDMwdl9wb3BfZnJhbWUgKCkKK3sKKyAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lID0gZ2V0X2N1cnJlbnRfZnJhbWUgKCk7CisgIENPUkVfQUREUiBmcDsKKyAgaW50IHJlZ251bTsKKyAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgZnNyOworICBjaGFyIHJhd19idWZmZXJbOF07CisKKyAgZnAgPSBGUkFNRV9GUCAoZnJhbWUpOworICBpZiAoZnJhbWUtPmR1bW15KQorICAgIHsKKyAgICAgIGQzMHZfcG9wX2R1bW15X2ZyYW1lKGZyYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogZmlsbCBvdXQgZnNyIHdpdGggdGhlIGFkZHJlc3Mgb2Ygd2hlcmUgZWFjaCAqLworICAvKiByZWdpc3RlciB3YXMgc3RvcmVkIGluIHRoZSBmcmFtZSAqLworICBnZXRfZnJhbWVfc2F2ZWRfcmVncyAoZnJhbWUsICZmc3IpOworICAKKyAgLyogbm93IHVwZGF0ZSB0aGUgY3VycmVudCByZWdpc3RlcnMgd2l0aCB0aGUgb2xkIHZhbHVlcyAqLworICBmb3IgKHJlZ251bSA9IEEwX1JFR05VTTsgcmVnbnVtIDwgQTBfUkVHTlVNKzIgOyByZWdudW0rKykKKyAgICB7CisgICAgICBpZiAoZnNyLnJlZ3NbcmVnbnVtXSkKKwl7CisJICByZWFkX21lbW9yeSAoZnNyLnJlZ3NbcmVnbnVtXSwgcmF3X2J1ZmZlciwgOCk7CisJICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSAocmVnbnVtKSwgcmF3X2J1ZmZlciwgOCk7CisJfQorICAgIH0KKyAgZm9yIChyZWdudW0gPSAwOyByZWdudW0gPCBTUF9SRUdOVU07IHJlZ251bSsrKQorICAgIHsKKyAgICAgIGlmIChmc3IucmVnc1tyZWdudW1dKQorCXsKKwkgIHdyaXRlX3JlZ2lzdGVyIChyZWdudW0sIHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKGZzci5yZWdzW3JlZ251bV0sIDQpKTsKKwl9CisgICAgfQorICBpZiAoZnNyLnJlZ3NbUFNXX1JFR05VTV0pCisgICAgeworICAgICAgd3JpdGVfcmVnaXN0ZXIgKFBTV19SRUdOVU0sIHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKGZzci5yZWdzW1BTV19SRUdOVU1dLCA0KSk7CisgICAgfQorCisgIHdyaXRlX3JlZ2lzdGVyIChQQ19SRUdOVU0sIHJlYWRfcmVnaXN0ZXIoTFJfUkVHTlVNKSk7CisgIHdyaXRlX3JlZ2lzdGVyIChTUF9SRUdOVU0sIGZwICsgZnJhbWUtPnNpemUpOworICB0YXJnZXRfc3RvcmVfcmVnaXN0ZXJzICgtMSk7CisgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7Cit9CisKK3N0YXRpYyBpbnQgCitjaGVja19wcm9sb2d1ZSAob3ApCisgICAgIHVuc2lnbmVkIGxvbmcgb3A7Cit7CisgIC8qIGFkZCBzcCxzcCxpbW0gLS0gb2JzZXJ2ZWQgKi8KKyAgaWYgKChvcCAmIE9QX01BU0tfQUxMX0JVVF9JTU0pID09IE9QX0FERF9TUF9JTU0pCisgICAgcmV0dXJuIDE7CisKKyAgLyogYWRkIHIyMixzcCxpbW0gLS0gb2JzZXJ2ZWQgKi8KKyAgaWYgKChvcCAmIE9QX01BU0tfQUxMX0JVVF9JTU0pID09IE9QX0FERF9SMjJfU1BfSU1NKQorICAgIHJldHVybiAxOworCisgIC8qIG9yICBmcCxyMCxzcCAtLSBvYnNlcnZlZCAqLworICBpZiAob3AgPT0gT1BfT1JfRlBfUjBfU1ApCisgICAgcmV0dXJuIDE7CisKKyAgLyogbm9wICovCisgIGlmICgob3AgJiBPUF9NQVNLX09QQ09ERSkgPT0gT1BfTk9QKQorICAgIHJldHVybiAxOworCisgIC8qIHN0dyAgUmEsQChzcCxyMCkgKi8KKyAgaWYgKChvcCAmIE9QX01BU0tfQUxMX0JVVF9SQSkgPT0gT1BfU1RXX1NQX1IwKQorICAgIHJldHVybiAxOworCisgIC8qIHN0dyAgUmEsQChzcCwweDApICovCisgIGlmICgob3AgJiBPUF9NQVNLX0FMTF9CVVRfUkEpID09IE9QX1NUV19TUF9JTU0wKQorICAgIHJldHVybiAxOworCisgIC8qIHN0MncgIFJhLEAoc3AscjApICovCisgaWYgKChvcCAmIE9QX01BU0tfQUxMX0JVVF9SQSkgPT0gT1BfU1QyV19TUF9SMCkKKyAgIHJldHVybiAxOworCisgIC8qIHN0MncgIFJhLEAoc3AsMHgwKSAqLworIGlmICgob3AgJiBPUF9NQVNLX0FMTF9CVVRfUkEpID09IE9QX1NUMldfU1BfSU1NMCkKKyAgIHJldHVybiAxOworCisgLyogc3R3IGZwLCBAKHIyMisscjApIC0tIG9ic2VydmVkICovCisgaWYgKG9wID09IE9QX1NUV19GUF9SMjJQX1IwKQorICAgcmV0dXJuIDE7CisKKyAvKiBzdHcgcjYyLCBAKHIyMisscjApIC0tIG9ic2VydmVkICovCisgaWYgKG9wID09IE9QX1NUV19MUl9SMjJQX1IwKQorICAgcmV0dXJuIDE7CisKKyAvKiBzdHcgUmEsIEAoZnAscjApIC0tIG9ic2VydmVkICovCisgaWYgKChvcCAmIE9QX01BU0tfQUxMX0JVVF9SQSkgPT0gT1BfU1RXX0ZQX1IwKQorICAgcmV0dXJuIDE7CQkJLyogZmlyc3QgYXJnICovCisKKyAvKiBzdHcgUmEsIEAoZnAsaW1tKSAtLSBvYnNlcnZlZCAqLworIGlmICgob3AgJiBPUF9NQVNLX09QX0FORF9SQikgPT0gT1BfU1RXX0ZQX0lNTSkKKyAgIHJldHVybiAxOwkJCS8qIHNlY29uZCBhbmQgc3Vic2VxdWVudCBhcmdzICovCisKKyAvKiBzdHcgZnAsQChzcCxpbW0pIC0tIG9ic2VydmVkICovCisgaWYgKChvcCAmIE9QX01BU0tfQUxMX0JVVF9JTU0pID09IE9QX1NUV19GUF9TUF9JTU0pCisgICByZXR1cm4gMTsKKworIC8qIHN0MncgUmEsQChyMjIrLHIwKSAqLworIGlmICgob3AgJiBPUF9NQVNLX0FMTF9CVVRfUkEpID09IE9QX1NUMldfUjIyUF9SMCkKKyAgIHJldHVybiAxOworCisgIC8qIHN0dyAgUmEsIEAoc3AtKSAqLworICBpZiAoKG9wICYgT1BfTUFTS19BTExfQlVUX1JBKSA9PSBPUF9TVFdfU1BNKQorICAgIHJldHVybiAxOworCisgIC8qIHN0MncgIFJhLCBAKHNwLSkgKi8KKyAgaWYgKChvcCAmIE9QX01BU0tfQUxMX0JVVF9SQSkgPT0gT1BfU1QyV19TUE0pCisgICAgcmV0dXJuIDE7CisKKyAgLyogc3ViLj8gIHNwLHNwLGltbSAqLworICBpZiAoKG9wICYgT1BfTUFTS19BTExfQlVUX0lNTSkgPT0gT1BfU1VCX1NQX0lNTSkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworQ09SRV9BRERSCitkMzB2X3NraXBfcHJvbG9ndWUgKHBjKQorICAgICBDT1JFX0FERFIgcGM7Cit7CisgIHVuc2lnbmVkIGxvbmcgb3BbMl07CisgIHVuc2lnbmVkIGxvbmcgb3BsLCBvcHI7CS8qIGxlZnQgLyByaWdodCBzdWIgb3BlcmF0aW9ucyAqLworICB1bnNpZ25lZCBsb25nIGZtMCwgZm0xOwkvKiBsZWZ0IC8gcmlnaHQgbW9kZSBiaXRzICovCisgIHVuc2lnbmVkIGxvbmcgY2MwLCBjYzE7CisgIHVuc2lnbmVkIGxvbmcgb3AxLCBvcDI7CisgIENPUkVfQUREUiBmdW5jX2FkZHIsIGZ1bmNfZW5kOworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKworICAvKiBJZiB3ZSBoYXZlIGxpbmUgZGVidWdnaW5nIGluZm9ybWF0aW9uLCB0aGVuIHRoZSBlbmQgb2YgdGhlICovCisgIC8qIHByb2xvZ3VlIHNob3VsZCB0aGUgZmlyc3QgYXNzZW1ibHkgaW5zdHJ1Y3Rpb24gb2YgIHRoZSBmaXJzdCBzb3VyY2UgbGluZSAqLworICBpZiAoZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIChwYywgTlVMTCwgJmZ1bmNfYWRkciwgJmZ1bmNfZW5kKSkKKyAgICB7CisgICAgICBzYWwgPSBmaW5kX3BjX2xpbmUgKGZ1bmNfYWRkciwgMCk7CisgICAgICBpZiAoIHNhbC5lbmQgJiYgc2FsLmVuZCA8IGZ1bmNfZW5kKQorCXJldHVybiBzYWwuZW5kOworICAgIH0KKyAgCisgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkgKHBjLCAoY2hhciAqKSZvcFswXSwgOCkpCisgICAgcmV0dXJuIHBjOwkJCS8qIENhbid0IGFjY2VzcyBpdCAtLSBhc3N1bWUgbm8gcHJvbG9ndWUuICovCisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgb3BsID0gKHVuc2lnbmVkIGxvbmcpcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDQpOworICAgICAgb3ByID0gKHVuc2lnbmVkIGxvbmcpcmVhZF9tZW1vcnlfaW50ZWdlciAocGMrNCwgNCk7CisKKyAgICAgIGZtMCA9IChvcGwgJiBPUF9NQVNLX0ZNX0JJVCk7CisgICAgICBmbTEgPSAob3ByICYgT1BfTUFTS19GTV9CSVQpOworCisgICAgICBjYzAgPSAob3BsICYgT1BfTUFTS19DQ19CSVRTKTsKKyAgICAgIGNjMSA9IChvcHIgJiBPUF9NQVNLX0NDX0JJVFMpOworCisgICAgICBvcGwgPSAob3BsICYgT1BfTUFTS19TVUJfSU5TVCk7CisgICAgICBvcHIgPSAob3ByICYgT1BfTUFTS19TVUJfSU5TVCk7CisKKyAgICAgIGlmIChmbTAgJiYgZm0xKQorCXsKKwkgIC8qIGxvbmcgaW5zdHJ1Y3Rpb24gKG9wbCBjb250YWlucyB0aGUgb3Bjb2RlKSAqLworCSAgaWYgKCgob3BsICYgT1BfTUFTS19BTExfQlVUX0lNTSkgIT0gT1BfQUREX1NQX0lNTSkgJiYgLyogYWRkIHNwLHNwLGltbSAqLworCSAgICAgICgob3BsICYgT1BfTUFTS19BTExfQlVUX0lNTSkgIT0gT1BfQUREX1IyMl9TUF9JTU0pICYmIC8qIGFkZCByMjIsc3AsaW1tICovCisJICAgICAgKChvcGwgJiBPUF9NQVNLX09QX0FORF9SQikgIT0gT1BfU1RXX1NQX0lNTSkgJiYgLyogc3R3IFJhLCBAKHNwLGltbSkgKi8KKwkgICAgICAoKG9wbCAmIE9QX01BU0tfT1BfQU5EX1JCKSAhPSBPUF9TVDJXX1NQX0lNTSkpIC8qIHN0MncgUmEsIEAoc3AsaW1tKSAqLworCSAgICBicmVhazsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogc2hvcnQgaW5zdHJ1Y3Rpb25zICovCisJICBpZiAoZm0wICYmICFmbTEpCisJICAgIHsKKwkgICAgICBvcDEgPSBvcHI7CisJICAgICAgb3AyID0gb3BsOworCSAgICB9IAorCSAgZWxzZSAKKwkgICAgeworCSAgICAgIG9wMSA9IG9wbDsKKwkgICAgICBvcDIgPSBvcHI7CisJICAgIH0KKwkgIGlmIChjaGVja19wcm9sb2d1ZShvcDEpKQorCSAgICB7CisJICAgICAgaWYgKCFjaGVja19wcm9sb2d1ZShvcDIpKQorCQl7CisJCSAgLyogaWYgdGhlIHByZXZpb3VzIG9wY29kZSB3YXMgcmVhbGx5IHBhcnQgb2YgdGhlIHByb2xvZ3VlICovCisJCSAgLyogYW5kIG5vdCBqdXN0IGEgTk9QLCB0aGVuIHdlIHdhbnQgdG8gYnJlYWsgYWZ0ZXIgYm90aCBpbnN0cnVjdGlvbnMgKi8KKwkJICBpZiAoKG9wMSAmIE9QX01BU0tfT1BDT0RFKSAhPSBPUF9OT1ApCisJCSAgICBwYyArPSA4OworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgYnJlYWs7CisJfQorICAgICAgcGMgKz0gODsKKyAgICB9CisgIHJldHVybiBwYzsKK30KKworc3RhdGljIGludCBlbmRfb2Zfc3RhY2s7CisKKy8qIEdpdmVuIGEgR0RCIGZyYW1lLCBkZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24ncyBmcmFtZS4KKyAgIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBHREIgZnJhbWUgc3RydWN0LCBhbmQgdGhlbgorICAgSU5JVF9FWFRSQV9GUkFNRV9JTkZPIGFuZCBJTklUX0ZSQU1FX1BDIHdpbGwgYmUgY2FsbGVkIGZvciB0aGUgbmV3IGZyYW1lLgorKi8KKworQ09SRV9BRERSCitkMzB2X2ZyYW1lX2NoYWluIChmcmFtZSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworeworICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyBmc3I7CisKKyAgZDMwdl9mcmFtZV9maW5kX3NhdmVkX3JlZ3MgKGZyYW1lLCAmZnNyKTsKKworICBpZiAoZW5kX29mX3N0YWNrKQorICAgIHJldHVybiAoQ09SRV9BRERSKTA7CisKKyAgaWYgKGZyYW1lLT5yZXR1cm5fcGMgPT0gSU1FTV9TVEFSVCkKKyAgICByZXR1cm4gKENPUkVfQUREUikwOworCisgIGlmICghZnNyLnJlZ3NbRlBfUkVHTlVNXSkKKyAgICB7CisgICAgICBpZiAoIWZzci5yZWdzW1NQX1JFR05VTV0gfHwgZnNyLnJlZ3NbU1BfUkVHTlVNXSA9PSBTVEFDS19TVEFSVCkKKwlyZXR1cm4gKENPUkVfQUREUikwOworICAgICAgCisgICAgICByZXR1cm4gZnNyLnJlZ3NbU1BfUkVHTlVNXTsKKyAgICB9CisKKyAgaWYgKCFyZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyKGZzci5yZWdzW0ZQX1JFR05VTV0sNCkpCisgICAgcmV0dXJuIChDT1JFX0FERFIpMDsKKworICByZXR1cm4gcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlcihmc3IucmVnc1tGUF9SRUdOVU1dLDQpOworfSAgCisKK3N0YXRpYyBpbnQgbmV4dF9hZGRyLCB1c2VzX2ZyYW1lOworc3RhdGljIGludCBmcmFtZV9zaXplOworCitzdGF0aWMgaW50IAorcHJvbG9ndWVfZmluZF9yZWdzIChvcCwgZnNyLCBhZGRyKQorICAgICB1bnNpZ25lZCBsb25nIG9wOworICAgICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqZnNyOworICAgICBDT1JFX0FERFIgYWRkcjsKK3sKKyAgaW50IG47CisgIGludCBvZmZzZXQ7CisKKyAgLyogYWRkIHNwLHNwLGltbSAtLSBvYnNlcnZlZCAqLworICBpZiAoKG9wICYgT1BfTUFTS19BTExfQlVUX0lNTSkgPT0gT1BfQUREX1NQX0lNTSkKKyAgICB7CisgICAgICBvZmZzZXQgPSBFWFRSQUNUX0lNTTYob3ApOworICAgICAgLypuZXh0X2FkZHIgKz0gb2Zmc2V0OyovCisgICAgICBmcmFtZV9zaXplICs9IC1vZmZzZXQ7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogYWRkIHIyMixzcCxpbW0gLS0gb2JzZXJ2ZWQgKi8KKyAgaWYgKChvcCAmIE9QX01BU0tfQUxMX0JVVF9JTU0pID09IE9QX0FERF9SMjJfU1BfSU1NKQorICAgIHsKKyAgICAgIG9mZnNldCA9IEVYVFJBQ1RfSU1NNihvcCk7CisgICAgICBuZXh0X2FkZHIgPSAob2Zmc2V0IC0gZnJhbWVfc2l6ZSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogc3R3IFJhLCBAKGZwLCBvZmZzZXQpIC0tIG9ic2VydmVkICovCisgIGlmICgob3AgJiBPUF9NQVNLX09QX0FORF9SQikgPT0gT1BfU1RXX0ZQX0lNTSkKKyAgICB7CisgICAgICBuID0gRVhUUkFDVF9SQShvcCk7CisgICAgICBvZmZzZXQgPSBFWFRSQUNUX0lNTTYob3ApOworICAgICAgZnNyLT5yZWdzW25dID0gKG9mZnNldCAtIGZyYW1lX3NpemUpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIHN0dyBSYSwgQChmcCwgcjApIC0tIG9ic2VydmVkICovCisgIGlmICgob3AgJiBPUF9NQVNLX0FMTF9CVVRfUkEpID09IE9QX1NUV19GUF9SMCkKKyAgICB7CisgICAgICBuID0gRVhUUkFDVF9SQShvcCk7CisgICAgICBmc3ItPnJlZ3Nbbl0gPSAoLSBmcmFtZV9zaXplKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBvciAgZnAsMCxzcCAtLSBvYnNlcnZlZCAqLworICBpZiAoKG9wID09IE9QX09SX0ZQX1IwX1NQKSB8fAorICAgICAgKG9wID09IE9QX09SX0ZQX1NQX1IwKSB8fAorICAgICAgKG9wID09IE9QX09SX0ZQX0lNTTBfU1ApKQorICAgIHsKKyAgICAgIHVzZXNfZnJhbWUgPSAxOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIG5vcCAqLworICBpZiAoKG9wICYgT1BfTUFTS19PUENPREUpID09IE9QX05PUCkKKyAgICByZXR1cm4gMTsKKworICAvKiBzdHcgUmEsQChyMjIrLHIwKSAtLSBvYnNlcnZlZCAqLworICBpZiAoKG9wICYgT1BfTUFTS19BTExfQlVUX1JBKSA9PSBPUF9TVFdfUjIyUF9SMCkKKyAgICB7CisgICAgICBuID0gRVhUUkFDVF9SQShvcCk7CisgICAgICBmc3ItPnJlZ3Nbbl0gPSBuZXh0X2FkZHI7CisgICAgICBuZXh0X2FkZHIgKz0gNDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyNpZiAwCQkJCS8qIHN1YnN1bWVkIGluIHBhdHRlcm4gYWJvdmUgKi8KKyAgLyogc3R3IGZwLEAocjIyKyxyMCkgLS0gb2JzZXJ2ZWQgKi8KKyAgaWYgKG9wID09IE9QX1NUV19GUF9SMjJQX1IwKQorICAgIHsKKyAgICAgIGZzci0+cmVnc1tGUF9SRUdOVU1dID0gbmV4dF9hZGRyOwkvKiBYWFggKi8KKyAgICAgIG5leHRfYWRkciArPSA0OworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIHN0dyByNjIsQChyMjIrLHIwKSAtLSBvYnNlcnZlZCAqLworICBpZiAob3AgPT0gT1BfU1RXX0xSX1IyMlBfUjApCisgICAgeworICAgICAgZnNyLT5yZWdzW0xSX1JFR05VTV0gPSBuZXh0X2FkZHI7CisgICAgICBuZXh0X2FkZHIgKz0gNDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZgorICAvKiBzdDJ3IFJhLEAocjIyKyxyMCkgLS0gb2JzZXJ2ZWQgKi8KKyAgaWYgKChvcCAmIE9QX01BU0tfQUxMX0JVVF9SQSkgPT0gT1BfU1QyV19SMjJQX1IwKQorICAgIHsKKyAgICAgIG4gPSBFWFRSQUNUX1JBKG9wKTsKKyAgICAgIGZzci0+cmVnc1tuXSA9IG5leHRfYWRkcjsKKyAgICAgIGZzci0+cmVnc1tuKzFdID0gbmV4dF9hZGRyICsgNDsKKyAgICAgIG5leHRfYWRkciArPSA4OworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIHN0dyAgcm4sIEAoc3AtKSAqLworICBpZiAoKG9wICYgT1BfTUFTS19BTExfQlVUX1JBKSA9PSBPUF9TVFdfU1BNKQorICAgIHsKKyAgICAgIG4gPSBFWFRSQUNUX1JBKG9wKTsKKyAgICAgIGZzci0+cmVnc1tuXSA9IG5leHRfYWRkcjsKKyAgICAgIG5leHRfYWRkciAtPSA0OworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIHN0MncgIFJhLCBAKHNwLSkgKi8KKyAgZWxzZSBpZiAoKG9wICYgT1BfTUFTS19BTExfQlVUX1JBKSA9PSBPUF9TVDJXX1NQTSkKKyAgICB7CisgICAgICBuID0gRVhUUkFDVF9SQShvcCk7CisgICAgICBmc3ItPnJlZ3Nbbl0gPSBuZXh0X2FkZHI7CisgICAgICBmc3ItPnJlZ3NbbisxXSA9IG5leHRfYWRkcis0OworICAgICAgbmV4dF9hZGRyIC09IDg7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogc3ViICBzcCxzcCxpbW0gKi8KKyAgaWYgKChvcCAmIE9QX01BU0tfQUxMX0JVVF9JTU0pID09IE9QX1NVQl9TUF9JTU0pCisgICAgeworICAgICAgb2Zmc2V0ID0gRVhUUkFDVF9JTU02KG9wKTsKKyAgICAgIGZyYW1lX3NpemUgKz0gLW9mZnNldDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBzdCAgcm4sIEAoc3AsMCkgLS0gb2JzZXJ2ZWQgKi8KKyAgaWYgKCgob3AgJiBPUF9NQVNLX0FMTF9CVVRfUkEpID09IE9QX1NUV19TUF9SMCkgfHwKKyAgICAgICgob3AgJiBPUF9NQVNLX0FMTF9CVVRfUkEpID09IE9QX1NUV19TUF9JTU0wKSkKKyAgICB7CisgICAgICBuID0gRVhUUkFDVF9SQShvcCk7CisgICAgICBmc3ItPnJlZ3Nbbl0gPSAoLSBmcmFtZV9zaXplKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBzdDJ3ICBybiwgQChzcCwwKSAqLworICBpZiAoKChvcCAmIE9QX01BU0tfQUxMX0JVVF9SQSkgPT0gT1BfU1QyV19TUF9SMCkgfHwKKyAgICAgICgob3AgJiBPUF9NQVNLX0FMTF9CVVRfUkEpID09IE9QX1NUMldfU1BfSU1NMCkpCisgICAgeworICAgICAgbiA9IEVYVFJBQ1RfUkEob3ApOworICAgICAgZnNyLT5yZWdzW25dID0gKC0gZnJhbWVfc2l6ZSk7CisgICAgICBmc3ItPnJlZ3NbbisxXSA9ICgtIGZyYW1lX3NpemUpICsgNDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBzdHcgZnAsQChzcCxpbW0pIC0tIG9ic2VydmVkICovCisgIGlmICgob3AgJiBPUF9NQVNLX0FMTF9CVVRfSU1NKSA9PSBPUF9TVFdfRlBfU1BfSU1NKQorICAgIHsKKyAgICAgIG9mZnNldCA9IEVYVFJBQ1RfSU1NNihvcCk7CisgICAgICBmc3ItPnJlZ3NbRlBfUkVHTlVNXSA9IChvZmZzZXQgLSBmcmFtZV9zaXplKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFB1dCBoZXJlIHRoZSBjb2RlIHRvIHN0b3JlLCBpbnRvIGEgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MsIHRoZQorICAgYWRkcmVzc2VzIG9mIHRoZSBzYXZlZCByZWdpc3RlcnMgb2YgZnJhbWUgZGVzY3JpYmVkIGJ5IEZSQU1FX0lORk8uCisgICBUaGlzIGluY2x1ZGVzIHNwZWNpYWwgcmVnaXN0ZXJzIHN1Y2ggYXMgcGMgYW5kIGZwIHNhdmVkIGluIHNwZWNpYWwKKyAgIHdheXMgaW4gdGhlIHN0YWNrIGZyYW1lLiAgc3AgaXMgZXZlbiBtb3JlIHNwZWNpYWw6IHRoZSBhZGRyZXNzIHdlCisgICByZXR1cm4gZm9yIGl0IElTIHRoZSBzcCBmb3IgdGhlIG5leHQgZnJhbWUuICovCit2b2lkCitkMzB2X2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyAoZmksIGZzcikKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworICAgICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqZnNyOworeworICBDT1JFX0FERFIgZnAsIHBjOworICB1bnNpZ25lZCBsb25nIG9wbCwgb3ByOworICB1bnNpZ25lZCBsb25nIG9wMSwgb3AyOworICB1bnNpZ25lZCBsb25nIGZtMCwgZm0xOworICBpbnQgaTsKKworICBmcCA9IGZpLT5mcmFtZTsKKyAgbWVtc2V0IChmc3IsIDAsIHNpemVvZiAoKmZzcikpOworICBuZXh0X2FkZHIgPSAwOworICBmcmFtZV9zaXplID0gMDsKKyAgZW5kX29mX3N0YWNrID0gMDsKKworICB1c2VzX2ZyYW1lID0gMDsKKworICBkMzB2X2ZyYW1lX2ZpbmRfc2F2ZWRfcmVnc19vZmZzZXRzIChmaSwgZnNyKTsKKyAgCisgIGZpLT5zaXplID0gZnJhbWVfc2l6ZTsKKworICBpZiAoIWZwKQorICAgIGZwID0gcmVhZF9yZWdpc3RlcihTUF9SRUdOVU0pOworCisgIGZvciAoaT0wOyBpPE5VTV9SRUdTLTE7IGkrKykKKyAgICBpZiAoZnNyLT5yZWdzW2ldKQorICAgICAgeworCWZzci0+cmVnc1tpXSA9IGZzci0+cmVnc1tpXSArIGZwICsgZnJhbWVfc2l6ZTsKKyAgICAgIH0KKworICBpZiAoZnNyLT5yZWdzW0xSX1JFR05VTV0pCisgICAgZmktPnJldHVybl9wYyA9IHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIoZnNyLT5yZWdzW0xSX1JFR05VTV0sNCk7CisgIGVsc2UKKyAgICBmaS0+cmV0dXJuX3BjID0gcmVhZF9yZWdpc3RlcihMUl9SRUdOVU0pOworICAKKyAgLyogdGhlIFNQIGlzIG5vdCBub3JtYWxseSAoZXZlcj8pIHNhdmVkLCBidXQgY2hlY2sgYW55d2F5ICovCisgIGlmICghZnNyLT5yZWdzW1NQX1JFR05VTV0pCisgICAgeworICAgICAgLyogaWYgdGhlIEZQIHdhcyBzYXZlZCwgdGhhdCBtZWFucyB0aGUgY3VycmVudCBGUCBpcyB2YWxpZCwgKi8KKyAgICAgIC8qIG90aGVyd2lzZSwgaXQgaXNuJ3QgYmVpbmcgdXNlZCwgc28gd2UgdXNlIHRoZSBTUCBpbnN0ZWFkICovCisgICAgICBpZiAodXNlc19mcmFtZSkKKwlmc3ItPnJlZ3NbU1BfUkVHTlVNXSA9IHJlYWRfcmVnaXN0ZXIoRlBfUkVHTlVNKSArIGZpLT5zaXplOworICAgICAgZWxzZQorCXsKKwkgIGZzci0+cmVnc1tTUF9SRUdOVU1dID0gZnAgKyBmaS0+c2l6ZTsKKwkgIGZpLT5mcmFtZWxlc3MgPSAxOworCSAgZnNyLT5yZWdzW0ZQX1JFR05VTV0gPSAwOworCX0KKyAgICB9Cit9CisKK3ZvaWQKK2QzMHZfZnJhbWVfZmluZF9zYXZlZF9yZWdzX29mZnNldHMgKGZpLCBmc3IpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKKyAgICAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKmZzcjsKK3sKKyAgQ09SRV9BRERSIGZwLCBwYzsKKyAgdW5zaWduZWQgbG9uZyBvcGwsIG9wcjsKKyAgdW5zaWduZWQgbG9uZyBvcDEsIG9wMjsKKyAgdW5zaWduZWQgbG9uZyBmbTAsIGZtMTsKKyAgaW50IGk7CisKKyAgZnAgPSBmaS0+ZnJhbWU7CisgIG1lbXNldCAoZnNyLCAwLCBzaXplb2YgKCpmc3IpKTsKKyAgbmV4dF9hZGRyID0gMDsKKyAgZnJhbWVfc2l6ZSA9IDA7CisgIGVuZF9vZl9zdGFjayA9IDA7CisKKyAgcGMgPSBnZXRfcGNfZnVuY3Rpb25fc3RhcnQgKGZpLT5wYyk7CisKKyAgdXNlc19mcmFtZSA9IDA7CisgIHdoaWxlIChwYyA8IGZpLT5wYykKKyAgICB7CisgICAgICBvcGwgPSAodW5zaWduZWQgbG9uZylyZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgNCk7CisgICAgICBvcHIgPSAodW5zaWduZWQgbG9uZylyZWFkX21lbW9yeV9pbnRlZ2VyIChwYys0LCA0KTsKKworICAgICAgZm0wID0gKG9wbCAmIE9QX01BU0tfRk1fQklUKTsKKyAgICAgIGZtMSA9IChvcHIgJiBPUF9NQVNLX0ZNX0JJVCk7CisKKyAgICAgIG9wbCA9IChvcGwgJiBPUF9NQVNLX1NVQl9JTlNUKTsKKyAgICAgIG9wciA9IChvcHIgJiBPUF9NQVNLX1NVQl9JTlNUKTsKKworICAgICAgaWYgKGZtMCAmJiBmbTEpCisJeworCSAgLyogbG9uZyBpbnN0cnVjdGlvbiAqLworCSAgaWYgKChvcGwgJiBPUF9NQVNLX0FMTF9CVVRfSU1NKSA9PSBPUF9BRERfU1BfSU1NKQorCSAgICB7CisJICAgICAgLyogYWRkIHNwLHNwLG4gKi8KKwkgICAgICBsb25nIG9mZnNldCA9IEVYVFJBQ1RfSU1NMzIob3BsLCBvcHIpOworCSAgICAgIGZyYW1lX3NpemUgKz0gLW9mZnNldDsKKwkgICAgfQorCSAgZWxzZSBpZiAoKG9wbCAmIE9QX01BU0tfQUxMX0JVVF9JTU0pID09IE9QX0FERF9SMjJfU1BfSU1NKQorCSAgICB7CisJICAgICAgLyogYWRkIHIyMixzcCxvZmZzZXQgKi8KKwkgICAgICBsb25nIG9mZnNldCA9IEVYVFJBQ1RfSU1NMzIob3BsLG9wcik7CisJICAgICAgbmV4dF9hZGRyID0gKG9mZnNldCAtIGZyYW1lX3NpemUpOworCSAgICB9CisJICBlbHNlIGlmICgob3BsICYgT1BfTUFTS19PUF9BTkRfUkIpID09IE9QX1NUV19TUF9JTU0pCisJICAgIHsKKwkgICAgICAvKiBzdCBSYSwgQChzcCxpbW0pICovCisJICAgICAgbG9uZyBvZmZzZXQgPSBFWFRSQUNUX0lNTTMyKG9wbCwgb3ByKTsKKwkgICAgICBzaG9ydCBuID0gRVhUUkFDVF9SQShvcGwpOworCSAgICAgIGZzci0+cmVnc1tuXSA9IChvZmZzZXQgLSBmcmFtZV9zaXplKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoKG9wbCAmIE9QX01BU0tfT1BfQU5EX1JCKSA9PSBPUF9TVDJXX1NQX0lNTSkKKwkgICAgeworCSAgICAgIC8qIHN0MncgUmEsIEAoc3Asb2Zmc2V0KSAqLworCSAgICAgIGxvbmcgb2Zmc2V0ID0gRVhUUkFDVF9JTU0zMihvcGwsIG9wcik7CisJICAgICAgc2hvcnQgbiA9IEVYVFJBQ1RfUkEob3BsKTsKKwkgICAgICBmc3ItPnJlZ3Nbbl0gPSAob2Zmc2V0IC0gZnJhbWVfc2l6ZSk7CisJICAgICAgZnNyLT5yZWdzW24rMV0gPSAob2Zmc2V0IC0gZnJhbWVfc2l6ZSkgKyA0OworCSAgICB9CisJICBlbHNlIGlmICgob3BsICYgT1BfTUFTS19BTExfQlVUX0lNTSkgPT0gT1BfT1JfU1BfUjBfSU1NKQorCSAgICB7CisJICAgICAgZW5kX29mX3N0YWNrID0gMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBicmVhazsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogc2hvcnQgaW5zdHJ1Y3Rpb25zICovCisJICBpZiAoZm0wICYmICFmbTEpCisJICAgIHsKKwkgICAgICBvcDIgPSBvcGw7CisJICAgICAgb3AxID0gb3ByOworCSAgICB9IAorCSAgZWxzZSAKKwkgICAgeworCSAgICAgIG9wMSA9IG9wbDsKKwkgICAgICBvcDIgPSBvcHI7CisJICAgIH0KKwkgIGlmICghcHJvbG9ndWVfZmluZF9yZWdzKG9wMSxmc3IscGMpIHx8ICFwcm9sb2d1ZV9maW5kX3JlZ3Mob3AyLGZzcixwYykpCisJICAgIGJyZWFrOworCX0KKyAgICAgIHBjICs9IDg7CisgICAgfQorICAKKyNpZiAwCisgIGZpLT5zaXplID0gZnJhbWVfc2l6ZTsKKworICBpZiAoIWZwKQorICAgIGZwID0gcmVhZF9yZWdpc3RlcihTUF9SRUdOVU0pOworCisgIGZvciAoaT0wOyBpPE5VTV9SRUdTLTE7IGkrKykKKyAgICBpZiAoZnNyLT5yZWdzW2ldKQorICAgICAgeworCWZzci0+cmVnc1tpXSA9IGZzci0+cmVnc1tpXSArIGZwICsgZnJhbWVfc2l6ZTsKKyAgICAgIH0KKworICBpZiAoZnNyLT5yZWdzW0xSX1JFR05VTV0pCisgICAgZmktPnJldHVybl9wYyA9IHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIoZnNyLT5yZWdzW0xSX1JFR05VTV0sNCk7CisgIGVsc2UKKyAgICBmaS0+cmV0dXJuX3BjID0gcmVhZF9yZWdpc3RlcihMUl9SRUdOVU0pOworICAKKyAgLyogdGhlIFNQIGlzIG5vdCBub3JtYWxseSAoZXZlcj8pIHNhdmVkLCBidXQgY2hlY2sgYW55d2F5ICovCisgIGlmICghZnNyLT5yZWdzW1NQX1JFR05VTV0pCisgICAgeworICAgICAgLyogaWYgdGhlIEZQIHdhcyBzYXZlZCwgdGhhdCBtZWFucyB0aGUgY3VycmVudCBGUCBpcyB2YWxpZCwgKi8KKyAgICAgIC8qIG90aGVyd2lzZSwgaXQgaXNuJ3QgYmVpbmcgdXNlZCwgc28gd2UgdXNlIHRoZSBTUCBpbnN0ZWFkICovCisgICAgICBpZiAodXNlc19mcmFtZSkKKwlmc3ItPnJlZ3NbU1BfUkVHTlVNXSA9IHJlYWRfcmVnaXN0ZXIoRlBfUkVHTlVNKSArIGZpLT5zaXplOworICAgICAgZWxzZQorCXsKKwkgIGZzci0+cmVnc1tTUF9SRUdOVU1dID0gZnAgKyBmaS0+c2l6ZTsKKwkgIGZpLT5mcmFtZWxlc3MgPSAxOworCSAgZnNyLT5yZWdzW0ZQX1JFR05VTV0gPSAwOworCX0KKyAgICB9CisjZW5kaWYKK30KKwordm9pZAorZDMwdl9pbml0X2V4dHJhX2ZyYW1lX2luZm8gKGZyb21sZWFmLCBmaSkKKyAgICAgaW50IGZyb21sZWFmOworICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7Cit7CisgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzIGR1bW15OworCisgIGlmIChmaS0+bmV4dCAmJiAoZmktPnBjID09IDApKQorICAgIGZpLT5wYyA9IGZpLT5uZXh0LT5yZXR1cm5fcGM7IAorCisgIGQzMHZfZnJhbWVfZmluZF9zYXZlZF9yZWdzX29mZnNldHMgKGZpLCAmZHVtbXkpOworCisgIGlmICh1c2VzX2ZyYW1lID09IDApCisgICAgZmktPmZyYW1lbGVzcyA9IDE7CisgIGVsc2UKKyAgICBmaS0+ZnJhbWVsZXNzID0gMDsKKworICBpZiAoKGZpLT5uZXh0ID09IDApICYmICh1c2VzX2ZyYW1lID09IDApKQorICAgIC8qIGlubmVybW9zdCBmcmFtZSBhbmQgaXQncyAiZnJhbWVsZXNzIiwKKyAgICAgICBzbyB0aGUgZmktPmZyYW1lIGZpZWxkIGlzIHdyb25nLCBmaXggaXQhICovCisgICAgZmktPmZyYW1lID0gcmVhZF9zcCAoKTsKKworICBpZiAoZHVtbXkucmVnc1tMUl9SRUdOVU1dKQorICAgIHsKKyAgICAgIC8qIGl0IHdhcyBzYXZlZCwgZ3JhYiBpdCEgKi8KKyAgICAgIGR1bW15LnJlZ3NbTFJfUkVHTlVNXSArPSAoZmktPmZyYW1lICsgZnJhbWVfc2l6ZSk7CisgICAgICBmaS0+cmV0dXJuX3BjID0gcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlcihkdW1teS5yZWdzW0xSX1JFR05VTV0sNCk7CisgICAgfQorICBlbHNlCisgICAgZmktPnJldHVybl9wYyA9IHJlYWRfcmVnaXN0ZXIoTFJfUkVHTlVNKTsKK30KKwordm9pZAorZDMwdl9pbml0X2ZyYW1lX3BjIChmcm9tbGVhZiwgcHJldikKKyAgICAgaW50IGZyb21sZWFmOworICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqcHJldjsKK3sKKyAgLyogZGVmYXVsdCB2YWx1ZSwgcHV0IGhlcmUgc28gd2UgY2FuIGJyZWFrcG9pbnQgb24gaXQgYW5kCisgICAgIHNlZSBpZiB0aGUgZGVmYXVsdCB2YWx1ZSBpcyByZWFsbHkgdGhlIHJpZ2h0IHRoaW5nIHRvIHVzZSAqLworICBwcmV2LT5wYyA9IChmcm9tbGVhZiA/IFNBVkVEX1BDX0FGVEVSX0NBTEwgKHByZXYtPm5leHQpIDogXAorCSAgICAgIHByZXYtPm5leHQgPyBGUkFNRV9TQVZFRF9QQyAocHJldi0+bmV4dCkgOiByZWFkX3BjICgpKTsKK30KKworc3RhdGljIHZvaWQgZDMwdl9wcmludF9yZWdpc3RlciBQQVJBTVMgKChpbnQgcmVnbnVtLCBpbnQgdGFidWxhcikpOworCitzdGF0aWMgdm9pZAorZDMwdl9wcmludF9yZWdpc3RlciAocmVnbnVtLCB0YWJ1bGFyKQorICAgICBpbnQgcmVnbnVtOworICAgICBpbnQgdGFidWxhcjsKK3sKKyAgaWYgKHJlZ251bSA8IEEwX1JFR05VTSkKKyAgICB7CisgICAgICBpZiAodGFidWxhcikKKwlwcmludGZfZmlsdGVyZWQgKCIlMDh4IiwgcmVhZF9yZWdpc3RlciAocmVnbnVtKSk7CisgICAgICBlbHNlCisJcHJpbnRmX2ZpbHRlcmVkICgiMHgleAklZCIsIHJlYWRfcmVnaXN0ZXIgKHJlZ251bSksCisJCQkgcmVhZF9yZWdpc3RlciAocmVnbnVtKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciByZWdidWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKworICAgICAgcmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMgKHJlZ251bSwgcmVnYnVmKTsKKworICAgICAgdmFsX3ByaW50IChSRUdJU1RFUl9WSVJUVUFMX1RZUEUgKHJlZ251bSksIHJlZ2J1ZiwgMCwgMCwKKwkJIGdkYl9zdGRvdXQsICd4JywgMSwgMCwgVmFsX3ByZXR0eV9kZWZhdWx0KTsKKworICAgICAgaWYgKCF0YWJ1bGFyKQorCXsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIgkiKTsKKwkgIHZhbF9wcmludCAoUkVHSVNURVJfVklSVFVBTF9UWVBFIChyZWdudW0pLCByZWdidWYsIDAsIDAsCisJCSBnZGJfc3Rkb3V0LCAnZCcsIDEsIDAsIFZhbF9wcmV0dHlfZGVmYXVsdCk7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK2QzMHZfcHJpbnRfZmxhZ3MgKCkKK3sKKyAgbG9uZyBwc3cgPSByZWFkX3JlZ2lzdGVyIChQU1dfUkVHTlVNKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiZmxhZ3MgIzEiKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgKHNtKSAlZCIsIChwc3cgJiBQU1dfU00pICE9IDApOworICBwcmludGZfZmlsdGVyZWQgKCIgICAoZWEpICVkIiwgKHBzdyAmIFBTV19FQSkgIT0gMCk7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgIChkYikgJWQiLCAocHN3ICYgUFNXX0RCKSAhPSAwKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgKGRzKSAlZCIsIChwc3cgJiBQU1dfRFMpICE9IDApOworICBwcmludGZfZmlsdGVyZWQgKCIgICAoaWUpICVkIiwgKHBzdyAmIFBTV19JRSkgIT0gMCk7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgIChycCkgJWQiLCAocHN3ICYgUFNXX1JQKSAhPSAwKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgKG1kKSAlZFxuIiwgKHBzdyAmIFBTV19NRCkgIT0gMCk7CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiZmxhZ3MgIzIiKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgKGYwKSAlZCIsIChwc3cgJiBQU1dfRjApICE9IDApOworICBwcmludGZfZmlsdGVyZWQgKCIgICAoZjEpICVkIiwgKHBzdyAmIFBTV19GMSkgIT0gMCk7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgIChmMikgJWQiLCAocHN3ICYgUFNXX0YyKSAhPSAwKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgKGYzKSAlZCIsIChwc3cgJiBQU1dfRjMpICE9IDApOworICBwcmludGZfZmlsdGVyZWQgKCIgICAgKHMpICVkIiwgKHBzdyAmIFBTV19TKSAhPSAwKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgICh2KSAlZCIsIChwc3cgJiBQU1dfVikgIT0gMCk7CisgIHByaW50Zl9maWx0ZXJlZCAoIiAgICh2YSkgJWQiLCAocHN3ICYgUFNXX1ZBKSAhPSAwKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIChjKSAlZFxuIiwgKHBzdyAmIFBTV19DKSAhPSAwKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2ZsYWdzX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGQzMHZfcHJpbnRfZmxhZ3MgKCk7Cit9CisKK3ZvaWQKK2QzMHZfZG9fcmVnaXN0ZXJzX2luZm8gKHJlZ251bSwgZnByZWdzKQorICAgICBpbnQgcmVnbnVtOworICAgICBpbnQgZnByZWdzOworeworICBsb25nIGxvbmcgbnVtMSwgbnVtMjsKKyAgbG9uZyBwc3c7CisKKyAgaWYgKHJlZ251bSAhPSAtMSkKKyAgICB7CisgICAgICBpZiAoUkVHSVNURVJfTkFNRSAoMCkgPT0gTlVMTCB8fCBSRUdJU1RFUl9OQU1FICgwKVswXSA9PSAnXDAwMCcpCisJcmV0dXJuOworCisgICAgICBwcmludGZfZmlsdGVyZWQgKCIlcyAiLCBSRUdJU1RFUl9OQU1FIChyZWdudW0pKTsKKyAgICAgIGQzMHZfcHJpbnRfcmVnaXN0ZXIgKHJlZ251bSwgMCk7CisKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIEhhdmUgdG8gcHJpbnQgYWxsIHRoZSByZWdpc3RlcnMuICBGb3JtYXQgdGhlbSBuaWNlbHkuICAqLworCisgIHByaW50Zl9maWx0ZXJlZCAoIlBDPSIpOworICBwcmludF9hZGRyZXNzIChyZWFkX3BjICgpLCBnZGJfc3Rkb3V0KTsKKworICBwcmludGZfZmlsdGVyZWQgKCIgUFNXPSIpOworICBkMzB2X3ByaW50X3JlZ2lzdGVyIChQU1dfUkVHTlVNLCAxKTsKKworICBwcmludGZfZmlsdGVyZWQgKCIgQlBDPSIpOworICBwcmludF9hZGRyZXNzIChyZWFkX3JlZ2lzdGVyIChCUENfUkVHTlVNKSwgZ2RiX3N0ZG91dCk7CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiIEJQU1c9Iik7CisgIGQzMHZfcHJpbnRfcmVnaXN0ZXIgKEJQU1dfUkVHTlVNLCAxKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKworICBwcmludGZfZmlsdGVyZWQgKCJEUEM9Iik7CisgIHByaW50X2FkZHJlc3MgKHJlYWRfcmVnaXN0ZXIgKERQQ19SRUdOVU0pLCBnZGJfc3Rkb3V0KTsKKworICBwcmludGZfZmlsdGVyZWQgKCIgRFBTVz0iKTsKKyAgZDMwdl9wcmludF9yZWdpc3RlciAoRFBTV19SRUdOVU0sIDEpOworCisgIHByaW50Zl9maWx0ZXJlZCAoIiBJQkE9Iik7CisgIHByaW50X2FkZHJlc3MgKHJlYWRfcmVnaXN0ZXIgKElCQV9SRUdOVU0pLCBnZGJfc3Rkb3V0KTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKworICBwcmludGZfZmlsdGVyZWQgKCJSUFRfQz0iKTsKKyAgZDMwdl9wcmludF9yZWdpc3RlciAoUlBUX0NfUkVHTlVNLCAxKTsKKworICBwcmludGZfZmlsdGVyZWQgKCIgUlBUX1M9Iik7CisgIHByaW50X2FkZHJlc3MgKHJlYWRfcmVnaXN0ZXIgKFJQVF9TX1JFR05VTSksIGdkYl9zdGRvdXQpOworCisgIHByaW50Zl9maWx0ZXJlZCAoIiBSUFRfRT0iKTsKKyAgcHJpbnRfYWRkcmVzcyAocmVhZF9yZWdpc3RlciAoUlBUX0VfUkVHTlVNKSwgZ2RiX3N0ZG91dCk7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiTU9EX1M9Iik7CisgIHByaW50X2FkZHJlc3MgKHJlYWRfcmVnaXN0ZXIgKE1PRF9TX1JFR05VTSksIGdkYl9zdGRvdXQpOworCisgIHByaW50Zl9maWx0ZXJlZCAoIiBNT0RfRT0iKTsKKyAgcHJpbnRfYWRkcmVzcyAocmVhZF9yZWdpc3RlciAoTU9EX0VfUkVHTlVNKSwgZ2RiX3N0ZG91dCk7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiRUlUX1ZCPSIpOworICBwcmludF9hZGRyZXNzIChyZWFkX3JlZ2lzdGVyIChFSVRfVkJfUkVHTlVNKSwgZ2RiX3N0ZG91dCk7CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiIElOVF9TPSIpOworICBkMzB2X3ByaW50X3JlZ2lzdGVyIChJTlRfU19SRUdOVU0sIDEpOworCisgIHByaW50Zl9maWx0ZXJlZCAoIiBJTlRfTT0iKTsKKyAgZDMwdl9wcmludF9yZWdpc3RlciAoSU5UX01fUkVHTlVNLCAxKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKworICBkMzB2X3ByaW50X2ZsYWdzICgpOworICBmb3IgKHJlZ251bSA9IDA7IHJlZ251bSA8PSA2MzspCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlIlZC1SJWQgIiwgcmVnbnVtLCByZWdudW0gKyA3KTsKKyAgICAgIGlmIChyZWdudW0gPCAxMCkKKwlwcmludGZfZmlsdGVyZWQgKCIgIik7CisgICAgICBpZiAocmVnbnVtICsgNyA8IDEwKQorCXByaW50Zl9maWx0ZXJlZCAoIiAiKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCIgIik7CisJICBkMzB2X3ByaW50X3JlZ2lzdGVyIChyZWdudW0rKywgMSk7CisJfQorCisgICAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICAgIH0KKworICBwcmludGZfZmlsdGVyZWQgKCJBMC1BMSAgICAiKTsKKworICBkMzB2X3ByaW50X3JlZ2lzdGVyIChBMF9SRUdOVU0sIDEpOworICBwcmludGZfZmlsdGVyZWQgKCIgICAgIik7CisgIGQzMHZfcHJpbnRfcmVnaXN0ZXIgKEExX1JFR05VTSwgMSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7Cit9CisKK0NPUkVfQUREUgorZDMwdl9maXhfY2FsbF9kdW1teSAoZHVtbXluYW1lLCBzdGFydF9zcCwgZnVuLCBuYXJncywgYXJncywgdHlwZSwgZ2NjX3ApCisgICAgIGNoYXIgKmR1bW15bmFtZTsKKyAgICAgQ09SRV9BRERSIHN0YXJ0X3NwOworICAgICBDT1JFX0FERFIgZnVuOworICAgICBpbnQgbmFyZ3M7CisgICAgIHZhbHVlX3B0ciAqYXJnczsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGludCBnY2NfcDsKK3sKKyAgaW50IHJlZ251bTsKKyAgQ09SRV9BRERSIHNwOworICBjaGFyIGJ1ZmZlcltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWUgPSBnZXRfY3VycmVudF9mcmFtZSAoKTsKKyAgZnJhbWUtPmR1bW15ID0gc3RhcnRfc3A7CisgIC8qc3RhcnRfc3AgfD0gRE1FTV9TVEFSVDsqLworCisgIHNwID0gc3RhcnRfc3A7CisgIGZvciAocmVnbnVtID0gMDsgcmVnbnVtIDwgTlVNX1JFR1M7IHJlZ251bSsrKQorICAgIHsKKyAgICAgIHNwIC09IFJFR0lTVEVSX1JBV19TSVpFKHJlZ251bSk7CisgICAgICBzdG9yZV9hZGRyZXNzIChidWZmZXIsIFJFR0lTVEVSX1JBV19TSVpFKHJlZ251bSksIHJlYWRfcmVnaXN0ZXIocmVnbnVtKSk7CisgICAgICB3cml0ZV9tZW1vcnkgKHNwLCBidWZmZXIsIFJFR0lTVEVSX1JBV19TSVpFKHJlZ251bSkpOworICAgIH0KKyAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgKExPTkdFU1Qpc3ApOworICAvKiBub3cgd2UgbmVlZCB0byBsb2FkIExSIHdpdGggdGhlIHJldHVybiBhZGRyZXNzICovCisgIHdyaXRlX3JlZ2lzdGVyIChMUl9SRUdOVU0sIChMT05HRVNUKWQzMHZfY2FsbF9kdW1teV9hZGRyZXNzKCkpOyAgCisgIHJldHVybiBzcDsKK30KKworc3RhdGljIHZvaWQKK2QzMHZfcG9wX2R1bW15X2ZyYW1lIChmaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworeworICBDT1JFX0FERFIgc3AgPSBmaS0+ZHVtbXk7CisgIGludCByZWdudW07CisKKyAgZm9yIChyZWdudW0gPSAwOyByZWdudW0gPCBOVU1fUkVHUzsgcmVnbnVtKyspCisgICAgeworICAgICAgc3AgLT0gUkVHSVNURVJfUkFXX1NJWkUocmVnbnVtKTsKKyAgICAgIHdyaXRlX3JlZ2lzdGVyKHJlZ251bSwgcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoc3AsIFJFR0lTVEVSX1JBV19TSVpFKHJlZ251bSkpKTsKKyAgICB9CisgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7IC8qIG5lZWRlZD8gKi8KK30KKworCitDT1JFX0FERFIKK2QzMHZfcHVzaF9hcmd1bWVudHMgKG5hcmdzLCBhcmdzLCBzcCwgc3RydWN0X3JldHVybiwgc3RydWN0X2FkZHIpCisgICAgIGludCBuYXJnczsKKyAgICAgdmFsdWVfcHRyICphcmdzOworICAgICBDT1JFX0FERFIgc3A7CisgICAgIGludCBzdHJ1Y3RfcmV0dXJuOworICAgICBDT1JFX0FERFIgc3RydWN0X2FkZHI7Cit7CisgIGludCBpLCBsZW4sIGluZGV4PTAsIHJlZ251bT0yOworICBjaGFyIGJ1ZmZlcls0XSwgKmNvbnRlbnRzOworICBMT05HRVNUIHZhbDsKKyAgQ09SRV9BRERSIHB0cnNbMTBdOworCisjaWYgMAorICAvKiBQYXNzIDEuIFB1dCBhbGwgbGFyZ2UgYXJncyBvbiBzdGFjayAqLworICBmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKKyAgICB7CisgICAgICB2YWx1ZV9wdHIgYXJnID0gYXJnc1tpXTsKKyAgICAgIHN0cnVjdCB0eXBlICphcmdfdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZykpOworICAgICAgbGVuID0gVFlQRV9MRU5HVEggKGFyZ190eXBlKTsKKyAgICAgIGNvbnRlbnRzID0gVkFMVUVfQ09OVEVOVFMoYXJnKTsKKyAgICAgIHZhbCA9IGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKGNvbnRlbnRzLCBsZW4pOworICAgICAgaWYgKGxlbiA+IDQpCisJeworCSAgLyogcHV0IG9uIHN0YWNrIGFuZCBwYXNzIHBvaW50ZXJzICovCisJICBzcCAtPSBsZW47CisJICB3cml0ZV9tZW1vcnkgKHNwLCBjb250ZW50cywgbGVuKTsKKwkgIHB0cnNbaW5kZXgrK10gPSBzcDsKKwl9CisgICAgfQorI2VuZGlmCisgIGluZGV4ID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKKyAgICB7CisgICAgICB2YWx1ZV9wdHIgYXJnID0gYXJnc1tpXTsKKyAgICAgIHN0cnVjdCB0eXBlICphcmdfdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZykpOworICAgICAgbGVuID0gVFlQRV9MRU5HVEggKGFyZ190eXBlKTsKKyAgICAgIGNvbnRlbnRzID0gVkFMVUVfQ09OVEVOVFMoYXJnKTsKKyAgICAgIGlmIChsZW4gPiA0KQorCXsKKwkgIC8qIHdlIG5lZWQgbXVsdGlwbGUgcmVnaXN0ZXJzICovCisJICBpbnQgbmR4OworCisJICBmb3IgKG5keCA9IDA7IGxlbiA+IDA7IG5keCArPSA4LCBsZW4gLT0gOCkKKwkgICAgeworCSAgICAgIGlmIChyZWdudW0gJiAxKQorCQlyZWdudW0rKzsJLyogYWxsIGFyZ3MgPiA0IGJ5dGVzIHN0YXJ0IGluIGV2ZW4gcmVnaXN0ZXIgKi8KKworCSAgICAgIGlmIChyZWdudW0gPCAxOCkKKwkJeworCQkgIHZhbCA9IGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKCZjb250ZW50c1tuZHhdLCA0KTsKKwkJICB3cml0ZV9yZWdpc3RlciAocmVnbnVtKyssIHZhbCk7CisKKwkJICBpZiAobGVuID49IDgpCisJCSAgICB2YWwgPSBleHRyYWN0X3NpZ25lZF9pbnRlZ2VyICgmY29udGVudHNbbmR4KzRdLCA0KTsKKwkJICBlbHNlCisJCSAgICB2YWwgPSBleHRyYWN0X3NpZ25lZF9pbnRlZ2VyICgmY29udGVudHNbbmR4KzRdLCBsZW4tNCk7CisJCSAgd3JpdGVfcmVnaXN0ZXIgKHJlZ251bSsrLCB2YWwpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogbm8gbW9yZSByZWdpc3RlcnMgYXZhaWxhYmxlLiAgcHV0IGl0IG9uIHRoZSBzdGFjayAqLworCisJCSAgLyogYWxsIGFyZ3MgPiA0IGJ5dGVzIGFyZSBwYWRkZWQgdG8gYSBtdWx0aXBsZSBvZiA4IGJ5dGVzCisJCSAgIGFuZCBzdGFydCBvbiBhbiA4IGJ5dGUgYm91bmRhcnkgKi8KKwkJICBpZiAoc3AgJiA3KQorCQkgICAgc3AgLT0gKHNwICYgNyk7IC8qIGFsaWduIGl0ICovCisKKwkJICBzcCAtPSAoKGxlbiArIDcpICYgfjcpOyAvKiBhbGxvY2F0ZSBzcGFjZSAqLworCQkgIHdyaXRlX21lbW9yeSAoc3AsICZjb250ZW50c1tuZHhdLCBsZW4pOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKHJlZ251bSA8IDE4ICkKKwkgICAgeworCSAgICAgIHZhbCA9IGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKGNvbnRlbnRzLCBsZW4pOworCSAgICAgIHdyaXRlX3JlZ2lzdGVyIChyZWdudW0rKywgdmFsKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogYWxsIGFyZ3MgYXJlIHBhZGRlZCB0byBhIG11bHRpcGxlIG9mIDQgYnl0ZXMgKGF0IGxlYXN0KSAqLworCSAgICAgIHNwIC09ICgobGVuICsgMykgJiB+Myk7CisJICAgICAgd3JpdGVfbWVtb3J5IChzcCwgY29udGVudHMsIGxlbik7CisJICAgIH0KKwl9CisgICAgfQorICBpZiAoc3AgJiA3KQorICAgIC8qIHN0YWNrIHBvaW50ZXIgaXMgbm90IG9uIGFuIDggYnl0ZSBib3VuZGFyeSAtLSBhbGlnbiBpdCAqLworICAgIHNwIC09IChzcCAmIDcpOworICByZXR1cm4gc3A7Cit9CisKKworLyogcGljayBhbiBvdXQtb2YtdGhlLXdheSBwbGFjZSB0byBzZXQgdGhlIHJldHVybiB2YWx1ZSAqLworLyogZm9yIGFuIGluZmVyaW9yIGZ1bmN0aW9uIGNhbGwuICBUaGUgbGluayByZWdpc3RlciBpcyBzZXQgdG8gdGhpcyAgKi8KKy8qIHZhbHVlIGFuZCBhIG1vbWVudGFyeSBicmVha3BvaW50IGlzIHNldCB0aGVyZS4gIFdoZW4gdGhlIGJyZWFrcG9pbnQgKi8KKy8qIGlzIGhpdCwgdGhlIGR1bW15IGZyYW1lIGlzIHBvcHBlZCBhbmQgdGhlIHByZXZpb3VzIGVudmlyb25tZW50IGlzICovCisvKiByZXN0b3JlZC4gKi8KKworQ09SRV9BRERSCitkMzB2X2NhbGxfZHVtbXlfYWRkcmVzcyAoKQoreworICBDT1JFX0FERFIgZW50cnk7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqc3ltOworCisgIGVudHJ5ID0gZW50cnlfcG9pbnRfYWRkcmVzcyAoKTsKKworICBpZiAoZW50cnkgIT0gMCkKKyAgICByZXR1cm4gZW50cnk7CisKKyAgc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sICgiX3N0YXJ0IiwgTlVMTCwgc3ltZmlsZV9vYmpmaWxlKTsKKworICBpZiAoIXN5bSB8fCBNU1lNQk9MX1RZUEUgKHN5bSkgIT0gbXN0X3RleHQpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICByZXR1cm4gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKHN5bSk7Cit9CisKKy8qIEdpdmVuIGEgcmV0dXJuIHZhbHVlIGluIGByZWdidWYnIHdpdGggYSB0eXBlIGB2YWx0eXBlJywgCisgICBleHRyYWN0IGFuZCBjb3B5IGl0cyB2YWx1ZSBpbnRvIGB2YWxidWYnLiAgKi8KKwordm9pZAorZDMwdl9leHRyYWN0X3JldHVybl92YWx1ZSAodmFsdHlwZSwgcmVnYnVmLCB2YWxidWYpCisgICAgIHN0cnVjdCB0eXBlICp2YWx0eXBlOworICAgICBjaGFyIHJlZ2J1ZltSRUdJU1RFUl9CWVRFU107CisgICAgIGNoYXIgKnZhbGJ1ZjsKK3sKKyAgbWVtY3B5ICh2YWxidWYsIHJlZ2J1ZiArIFJFR0lTVEVSX0JZVEUgKDIpLCBUWVBFX0xFTkdUSCAodmFsdHlwZSkpOworfQorCisvKiBUaGUgZm9sbG93aW5nIGNvZGUgaW1wbGVtZW50cyBhY2Nlc3MgdG8sIGFuZCBkaXNwbGF5IG9mLCB0aGUgRDMwVidzCisgICBpbnN0cnVjdGlvbiB0cmFjZSBidWZmZXIuICBUaGUgYnVmZmVyIGNvbnNpc3RzIG9mIDY0SyBvciBtb3JlCisgICA0LWJ5dGUgd29yZHMgb2YgZGF0YSwgb2Ygd2hpY2ggZWFjaCB3b3JkcyBpbmNsdWRlcyBhbiA4LWJpdCBjb3VudCwKKyAgIGFuIDgtYml0IHNlZ21lbnQgbnVtYmVyLCBhbmQgYSAxNi1iaXQgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4KKworICAgSW4gdGhlb3J5LCB0aGUgdHJhY2UgYnVmZmVyIGlzIGNvbnRpbnVvdXNseSBjYXB0dXJpbmcgaW5zdHJ1Y3Rpb24KKyAgIGRhdGEgdGhhdCB0aGUgQ1BVIHByZXNlbnRzIG9uIGl0cyAiZGVidWcgYnVzIiwgYnV0IGluIHByYWN0aWNlLCB0aGUKKyAgIFJPTWlmaWVkIEdEQiBzdHViIG9ubHkgZW5hYmxlcyB0cmFjaW5nIHdoZW4gaXQgY29udGludWVzIG9yIHN0ZXBzCisgICB0aGUgcHJvZ3JhbSwgYW5kIHN0b3BzIHRyYWNpbmcgd2hlbiB0aGUgcHJvZ3JhbSBzdG9wczsgc28gaXQKKyAgIGFjdHVhbGx5IHdvcmtzIGZvciBHREIgdG8gcmVhZCB0aGUgYnVmZmVyIGNvdW50ZXIgb3V0IG9mIG1lbW9yeSBhbmQKKyAgIHRoZW4gcmVhZCBlYWNoIHRyYWNlIHdvcmQuICBUaGUgY291bnRlciByZWNvcmRzIHdoZXJlIHRoZSB0cmFjaW5nCisgICBzdG9wcywgYnV0IHRoZXJlIGlzIG5vIHJlY29yZCBvZiB3aGVyZSBpdCBzdGFydGVkLCBzbyB3ZSByZW1lbWJlcgorICAgdGhlIFBDIHdoZW4gd2UgcmVzdW1lZCBhbmQgdGhlbiBzZWFyY2ggYmFja3dhcmRzIGluIHRoZSB0cmFjZQorICAgYnVmZmVyIGZvciBhIHdvcmQgdGhhdCBpbmNsdWRlcyB0aGF0IGFkZHJlc3MuICBUaGlzIGlzIG5vdCBwZXJmZWN0LAorICAgYmVjYXVzZSB5b3Ugd2lsbCBtaXNzIHRyYWNlIGRhdGEgaWYgdGhlIHJlc3VtcHRpb24gUEMgaXMgdGhlIHRhcmdldAorICAgb2YgYSBicmFuY2guICAoVGhlIHZhbHVlIG9mIHRoZSBidWZmZXIgY291bnRlciBpcyBzZW1pLXJhbmRvbSwgYW55CisgICB0cmFjZSBkYXRhIGZyb20gYSBwcmV2aW91cyBwcm9ncmFtIHN0b3AgaXMgZ29uZS4pICAqLworCisvKiBUaGUgYWRkcmVzcyBvZiB0aGUgbGFzdCB3b3JkIHJlY29yZGVkIGluIHRoZSB0cmFjZSBidWZmZXIuICAqLworCisjZGVmaW5lIERCQkNfQUREUiAoMHhkODAwMDApCisKKy8qIFRoZSBiYXNlIG9mIHRoZSB0cmFjZSBidWZmZXIsIGF0IGxlYXN0IGZvciB0aGUgIkJvYXJkXzAiLiAgKi8KKworI2RlZmluZSBUUkFDRV9CVUZGRVJfQkFTRSAoMHhmNDAwMDApCisKK3N0YXRpYyB2b2lkIHRyYWNlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgdW50cmFjZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHRyYWNlX2luZm8gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgdGRpc2Fzc2VtYmxlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgZGlzcGxheV90cmFjZSBQQVJBTVMgKChpbnQsIGludCkpOworCisvKiBUcnVlIHdoZW4gaW5zdHJ1Y3Rpb24gdHJhY2VzIGFyZSBiZWluZyBjb2xsZWN0ZWQuICAqLworCitzdGF0aWMgaW50IHRyYWNpbmc7CisKKy8qIFJlbWVtYmVyZWQgUEMuICAqLworCitzdGF0aWMgQ09SRV9BRERSIGxhc3RfcGM7CisKKy8qIFRydWUgd2hlbiB0cmFjZSBvdXRwdXQgc2hvdWxkIGJlIGRpc3BsYXllZCB3aGVuZXZlciBwcm9ncmFtIHN0b3BzLiAgKi8KKworc3RhdGljIGludCB0cmFjZV9kaXNwbGF5OworCisvKiBUcnVlIHdoZW4gdHJhY2UgbGlzdGluZyBzaG91bGQgaW5jbHVkZSBzb3VyY2UgbGluZXMuICAqLworCitzdGF0aWMgaW50IGRlZmF1bHRfdHJhY2Vfc2hvd19zb3VyY2UgPSAxOworCitzdHJ1Y3QgdHJhY2VfYnVmZmVyIHsKKyAgaW50IHNpemU7CisgIHNob3J0ICpjb3VudHM7CisgIENPUkVfQUREUiAqYWRkcnM7Cit9IHRyYWNlX2RhdGE7CisKK3N0YXRpYyB2b2lkCit0cmFjZV9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICAvKiBDbGVhciB0aGUgaG9zdC1zaWRlIHRyYWNlIGJ1ZmZlciwgYWxsb2NhdGluZyBzcGFjZSBpZiBuZWVkZWQuICAqLworICB0cmFjZV9kYXRhLnNpemUgPSAwOworICBpZiAodHJhY2VfZGF0YS5jb3VudHMgPT0gTlVMTCkKKyAgICB0cmFjZV9kYXRhLmNvdW50cyA9IChzaG9ydCAqKSB4bWFsbG9jICg2NTUzNiAqIHNpemVvZihzaG9ydCkpOworICBpZiAodHJhY2VfZGF0YS5hZGRycyA9PSBOVUxMKQorICAgIHRyYWNlX2RhdGEuYWRkcnMgPSAoQ09SRV9BRERSICopIHhtYWxsb2MgKDY1NTM2ICogc2l6ZW9mKENPUkVfQUREUikpOworCisgIHRyYWNpbmcgPSAxOworCisgIHByaW50Zl9maWx0ZXJlZCAoIlRyYWNpbmcgaXMgbm93IG9uLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCit1bnRyYWNlX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHRyYWNpbmcgPSAwOworCisgIHByaW50Zl9maWx0ZXJlZCAoIlRyYWNpbmcgaXMgbm93IG9mZi5cbiIpOworfQorCitzdGF0aWMgdm9pZAordHJhY2VfaW5mbyAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IGk7CisKKyAgaWYgKHRyYWNlX2RhdGEuc2l6ZSkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIlZCBlbnRyaWVzIGluIHRyYWNlIGJ1ZmZlcjpcbiIsIHRyYWNlX2RhdGEuc2l6ZSk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0cmFjZV9kYXRhLnNpemU7ICsraSkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCIlZDogJWQgaW5zdHJ1Y3Rpb24lcyBhdCAweCV4XG4iLAorCQkJICAgaSwgdHJhY2VfZGF0YS5jb3VudHNbaV0sCisJCQkgICAodHJhY2VfZGF0YS5jb3VudHNbaV0gPT0gMSA/ICIiIDogInMiKSwKKwkJCSAgIHRyYWNlX2RhdGEuYWRkcnNbaV0pOworCX0KKyAgICB9CisgIGVsc2UKKyAgICBwcmludGZfZmlsdGVyZWQgKCJObyBlbnRyaWVzIGluIHRyYWNlIGJ1ZmZlci5cbiIpOworCisgIHByaW50Zl9maWx0ZXJlZCAoIlRyYWNpbmcgaXMgY3VycmVudGx5ICVzLlxuIiwgKHRyYWNpbmcgPyAib24iIDogIm9mZiIpKTsKK30KKworLyogUHJpbnQgdGhlIGluc3RydWN0aW9uIGF0IGFkZHJlc3MgTUVNQUREUiBpbiBkZWJ1Z2dlZCBtZW1vcnksCisgICBvbiBTVFJFQU0uICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLiAgKi8KKworc3RhdGljIGludAorcHJpbnRfaW5zbiAobWVtYWRkciwgc3RyZWFtKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgLyogSWYgdGhlcmUncyBubyBkaXNhc3NlbWJsZXIsIHNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiAgKi8KKyAgaWYgKHRtX3ByaW50X2luc24gPT0gTlVMTCkKKyAgICBhYm9ydCAoKTsKKworICBpZiAoVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKKyAgICB0bV9wcmludF9pbnNuX2luZm8uZW5kaWFuID0gQkZEX0VORElBTl9CSUc7CisgIGVsc2UKKyAgICB0bV9wcmludF9pbnNuX2luZm8uZW5kaWFuID0gQkZEX0VORElBTl9MSVRUTEU7CisgIHJldHVybiAoKnRtX3ByaW50X2luc24pIChtZW1hZGRyLCAmdG1fcHJpbnRfaW5zbl9pbmZvKTsKK30KKwordm9pZAorZDMwdl9ldmFfcHJlcGFyZV90b190cmFjZSAoKQoreworICBpZiAoIXRyYWNpbmcpCisgICAgcmV0dXJuOworCisgIGxhc3RfcGMgPSByZWFkX3JlZ2lzdGVyIChQQ19SRUdOVU0pOworfQorCisvKiBDb2xsZWN0IHRyYWNlIGRhdGEgZnJvbSB0aGUgdGFyZ2V0IGJvYXJkIGFuZCBmb3JtYXQgaXQgaW50byBhIGZvcm0KKyAgIG1vcmUgdXNlZnVsIGZvciBkaXNwbGF5LiAgKi8KKwordm9pZAorZDMwdl9ldmFfZ2V0X3RyYWNlX2RhdGEgKCkKK3sKKyAgaW50IGNvdW50LCBpLCBqLCBvbGRzaXplOworICBpbnQgdHJhY2VfYWRkciwgdHJhY2Vfc2VnLCB0cmFjZV9jbnQsIG5leHRfY250OworICB1bnNpZ25lZCBpbnQgbGFzdF90cmFjZSwgdHJhY2Vfd29yZCwgbmV4dF93b3JkOworICB1bnNpZ25lZCBpbnQgKnRtcHNwYWNlOworCisgIGlmICghdHJhY2luZykKKyAgICByZXR1cm47CisKKyAgdG1wc3BhY2UgPSB4bWFsbG9jICg2NTUzNiAqIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKworICBsYXN0X3RyYWNlID0gcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoREJCQ19BRERSLCAyKSA8PCAyOworCisgIC8qIENvbGxlY3QgYnVmZmVyIGNvbnRlbnRzIGZyb20gdGhlIHRhcmdldCwgc3RvcHBpbmcgd2hlbiB3ZSByZWFjaAorICAgICB0aGUgd29yZCByZWNvcmRlZCB3aGVuIGV4ZWN1dGlvbiByZXN1bWVkLiAgKi8KKworICBjb3VudCA9IDA7CisgIHdoaWxlIChsYXN0X3RyYWNlID4gMCkKKyAgICB7CisgICAgICBRVUlUOworICAgICAgdHJhY2Vfd29yZCA9CisJcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoVFJBQ0VfQlVGRkVSX0JBU0UgKyBsYXN0X3RyYWNlLCA0KTsKKyAgICAgIHRyYWNlX2FkZHIgPSB0cmFjZV93b3JkICYgMHhmZmZmOworICAgICAgbGFzdF90cmFjZSAtPSA0OworICAgICAgLyogSWdub3JlIGFuIGFwcGFyZW50bHkgbm9uc2Vuc2ljYWwgZW50cnkuICAqLworICAgICAgaWYgKHRyYWNlX2FkZHIgPT0gMHhmZmQ1KQorCWNvbnRpbnVlOworICAgICAgdG1wc3BhY2VbY291bnQrK10gPSB0cmFjZV93b3JkOworICAgICAgaWYgKHRyYWNlX2FkZHIgPT0gbGFzdF9wYykKKwlicmVhazsKKyAgICAgIGlmIChjb3VudCA+IDY1NTM1KQorCWJyZWFrOworICAgIH0KKworICAvKiBNb3ZlIHRoZSBkYXRhIHRvIHRoZSBob3N0LXNpZGUgdHJhY2UgYnVmZmVyLCBhZGp1c3RpbmcgY291bnRzIHRvCisgICAgIGluY2x1ZGUgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gZXhlY3V0ZWQgYW5kIHRyYW5zZm9ybWluZyB0aGUgYWRkcmVzcworICAgICBpbnRvIHNvbWV0aGluZyB0aGF0IEdEQiBsaWtlcy4gICovCisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgeworICAgICAgdHJhY2Vfd29yZCA9IHRtcHNwYWNlW2ldOworICAgICAgbmV4dF93b3JkID0gKChpID09IDApID8gMCA6IHRtcHNwYWNlW2kgLSAxXSk7CisgICAgICB0cmFjZV9hZGRyID0gdHJhY2Vfd29yZCAmIDB4ZmZmZjsKKyAgICAgIG5leHRfY250ID0gKG5leHRfd29yZCA+PiAyNCkgJiAweGZmOworICAgICAgaiA9IHRyYWNlX2RhdGEuc2l6ZSArIGNvdW50IC0gaSAtIDE7CisgICAgICB0cmFjZV9kYXRhLmFkZHJzW2pdID0gKHRyYWNlX2FkZHIgPDwgMikgKyAweDEwMDAwMDA7CisgICAgICB0cmFjZV9kYXRhLmNvdW50c1tqXSA9IG5leHRfY250ICsgMTsKKyAgICB9CisKKyAgb2xkc2l6ZSA9IHRyYWNlX2RhdGEuc2l6ZTsKKyAgdHJhY2VfZGF0YS5zaXplICs9IGNvdW50OworCisgIGZyZWUgKHRtcHNwYWNlKTsKKworICBpZiAodHJhY2VfZGlzcGxheSkKKyAgICBkaXNwbGF5X3RyYWNlIChvbGRzaXplLCB0cmFjZV9kYXRhLnNpemUpOworfQorCitzdGF0aWMgdm9pZAordGRpc2Fzc2VtYmxlX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpbnQgaSwgY291bnQ7CisgIENPUkVfQUREUiBsb3csIGhpZ2g7CisgIGNoYXIgKnNwYWNlX2luZGV4OworCisgIGlmICghYXJnKQorICAgIHsKKyAgICAgIGxvdyA9IDA7CisgICAgICBoaWdoID0gdHJhY2VfZGF0YS5zaXplOworICAgIH0KKyAgZWxzZSBpZiAoIShzcGFjZV9pbmRleCA9IChjaGFyICopIHN0cmNociAoYXJnLCAnICcpKSkKKyAgICB7CisgICAgICBsb3cgPSBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIChhcmcpOworICAgICAgaGlnaCA9IGxvdyArIDU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVHdvIGFyZ3VtZW50cy4gICovCisgICAgICAqc3BhY2VfaW5kZXggPSAnXDAnOworICAgICAgbG93ID0gcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAoYXJnKTsKKyAgICAgIGhpZ2ggPSBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIChzcGFjZV9pbmRleCArIDEpOworICAgICAgaWYgKGhpZ2ggPCBsb3cpCisJaGlnaCA9IGxvdzsKKyAgICB9CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiRHVtcCBvZiB0cmFjZSBmcm9tICVkIHRvICVkOlxuIiwgbG93LCBoaWdoKTsKKworICBkaXNwbGF5X3RyYWNlIChsb3csIGhpZ2gpOworCisgIHByaW50Zl9maWx0ZXJlZCAoIkVuZCBvZiB0cmFjZSBkdW1wLlxuIik7CisgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7Cit9CisKK3N0YXRpYyB2b2lkCitkaXNwbGF5X3RyYWNlIChsb3csIGhpZ2gpCisgICAgIGludCBsb3csIGhpZ2g7Cit7CisgIGludCBpLCBjb3VudCwgdHJhY2Vfc2hvd19zb3VyY2UsIGZpcnN0LCBzdXBwcmVzczsKKyAgQ09SRV9BRERSIG5leHRfYWRkcmVzczsKKworICB0cmFjZV9zaG93X3NvdXJjZSA9IGRlZmF1bHRfdHJhY2Vfc2hvd19zb3VyY2U7CisgIGlmICghaGF2ZV9mdWxsX3N5bWJvbHMgKCkgJiYgIWhhdmVfcGFydGlhbF9zeW1ib2xzKCkpCisgICAgeworICAgICAgdHJhY2Vfc2hvd19zb3VyY2UgPSAwOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiTm8gc3ltYm9sIHRhYmxlIGlzIGxvYWRlZC4gIFVzZSB0aGUgXCJmaWxlXCIgY29tbWFuZC5cbiIpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiVHJhY2Ugd2lsbCBub3QgZGlzcGxheSBhbnkgc291cmNlLlxuIik7CisgICAgfQorCisgIGZpcnN0ID0gMTsKKyAgc3VwcHJlc3MgPSAwOworICBmb3IgKGkgPSBsb3c7IGkgPCBoaWdoOyArK2kpCisgICAgeworICAgICAgbmV4dF9hZGRyZXNzID0gdHJhY2VfZGF0YS5hZGRyc1tpXTsKKyAgICAgIGNvdW50ID0gdHJhY2VfZGF0YS5jb3VudHNbaV07IAorICAgICAgd2hpbGUgKGNvdW50LS0gPiAwKQorCXsKKwkgIFFVSVQ7CisJICBpZiAodHJhY2Vfc2hvd19zb3VyY2UpCisJICAgIHsKKwkgICAgICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbCwgc2FsX3ByZXY7CisKKwkgICAgICBzYWxfcHJldiA9IGZpbmRfcGNfbGluZSAobmV4dF9hZGRyZXNzIC0gNCwgMCk7CisJICAgICAgc2FsID0gZmluZF9wY19saW5lIChuZXh0X2FkZHJlc3MsIDApOworCisJICAgICAgaWYgKHNhbC5zeW10YWIpCisJCXsKKwkJICBpZiAoZmlyc3QgfHwgc2FsLmxpbmUgIT0gc2FsX3ByZXYubGluZSkKKwkJICAgIHByaW50X3NvdXJjZV9saW5lcyAoc2FsLnN5bXRhYiwgc2FsLmxpbmUsIHNhbC5saW5lICsgMSwgMCk7CisJCSAgc3VwcHJlc3MgPSAwOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKCFzdXBwcmVzcykKKwkJICAgIC8qIEZJWE1FLTMyeDY0LS1hc3N1bWVzIHNhbC5wYyBmaXRzIGluIGxvbmcuICAqLworCQkgICAgcHJpbnRmX2ZpbHRlcmVkICgiTm8gc291cmNlIGZpbGUgZm9yIGFkZHJlc3MgJXMuXG4iLAorCQkJCSAgICAgbG9jYWxfaGV4X3N0cmluZygodW5zaWduZWQgbG9uZykgc2FsLnBjKSk7CisJCSAgc3VwcHJlc3MgPSAxOworCQl9CisJICAgIH0KKwkgIGZpcnN0ID0gMDsKKwkgIHByaW50X2FkZHJlc3MgKG5leHRfYWRkcmVzcywgZ2RiX3N0ZG91dCk7CisJICBwcmludGZfZmlsdGVyZWQgKCI6Iik7CisJICBwcmludGZfZmlsdGVyZWQgKCJcdCIpOworCSAgd3JhcF9oZXJlICgiICAgICIpOworCSAgbmV4dF9hZGRyZXNzID0gbmV4dF9hZGRyZXNzICsgcHJpbnRfaW5zbiAobmV4dF9hZGRyZXNzLCBnZGJfc3Rkb3V0KTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisJICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCX0KKyAgICB9Cit9CisKK2V4dGVybiB2b2lkICgqdGFyZ2V0X3Jlc3VtZV9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCAoKnRhcmdldF93YWl0X2xvb3BfaG9vaykgUEFSQU1TICgodm9pZCkpOworCit2b2lkCitfaW5pdGlhbGl6ZV9kMzB2X3RkZXAgKCkKK3sKKyAgdG1fcHJpbnRfaW5zbiA9IHByaW50X2luc25fZDMwdjsKKworICB0YXJnZXRfcmVzdW1lX2hvb2sgPSBkMzB2X2V2YV9wcmVwYXJlX3RvX3RyYWNlOworICB0YXJnZXRfd2FpdF9sb29wX2hvb2sgPSBkMzB2X2V2YV9nZXRfdHJhY2VfZGF0YTsKKworICBhZGRfaW5mbyAoImZsYWdzIiwgcHJpbnRfZmxhZ3NfY29tbWFuZCwgIlByaW50IGQzMHYgZmxhZ3MuIik7CisKKyAgYWRkX2NvbSAoInRyYWNlIiwgY2xhc3Nfc3VwcG9ydCwgdHJhY2VfY29tbWFuZCwKKwkgICAiRW5hYmxlIHRyYWNpbmcgb2YgaW5zdHJ1Y3Rpb24gZXhlY3V0aW9uLiIpOworCisgIGFkZF9jb20gKCJ1bnRyYWNlIiwgY2xhc3Nfc3VwcG9ydCwgdW50cmFjZV9jb21tYW5kLAorIAkgICAiRGlzYWJsZSB0cmFjaW5nIG9mIGluc3RydWN0aW9uIGV4ZWN1dGlvbi4iKTsKKworICBhZGRfY29tICgidGRpc2Fzc2VtYmxlIiwgY2xhc3NfdmFycywgdGRpc2Fzc2VtYmxlX2NvbW1hbmQsCisJICAgIkRpc2Fzc2VtYmxlIHRoZSB0cmFjZSBidWZmZXIuXG5cCitUd28gb3B0aW9uYWwgYXJndW1lbnRzIHNwZWNpZnkgYSByYW5nZSBvZiB0cmFjZSBidWZmZXIgZW50cmllc1xuXAorYXMgcmVwb3J0ZWQgYnkgaW5mbyB0cmFjZSAoTk9UIGFkZHJlc3NlcyEpLiIpOworCisgIGFkZF9pbmZvICgidHJhY2UiLCB0cmFjZV9pbmZvLAorCSAgICAiRGlzcGxheSBpbmZvIGFib3V0IHRoZSB0cmFjZSBkYXRhIGJ1ZmZlci4iKTsKKworICBhZGRfc2hvd19mcm9tX3NldCAoYWRkX3NldF9jbWQgKCJ0cmFjZWRpc3BsYXkiLCBub19jbGFzcywKKwkJCQkgIHZhcl9pbnRlZ2VyLCAoY2hhciAqKSZ0cmFjZV9kaXNwbGF5LAorCQkJCSAgIlNldCBhdXRvbWF0aWMgZGlzcGxheSBvZiB0cmFjZS5cbiIsICZzZXRsaXN0KSwKKwkJICAgICAmc2hvd2xpc3QpOworICBhZGRfc2hvd19mcm9tX3NldCAoYWRkX3NldF9jbWQgKCJ0cmFjZXNvdXJjZSIsIG5vX2NsYXNzLAorCQkJCSAgdmFyX2ludGVnZXIsIChjaGFyICopJmRlZmF1bHRfdHJhY2Vfc2hvd19zb3VyY2UsCisJCQkJICAiU2V0IGRpc3BsYXkgb2Ygc291cmNlIGNvZGUgd2l0aCB0cmFjZS5cbiIsICZzZXRsaXN0KSwKKwkJICAgICAmc2hvd2xpc3QpOworCit9IApkaWZmIC0tZ2l0IGEvZ2RiL2RidWctcm9tLmMgYi9nZGIvZGJ1Zy1yb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTljOTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2RidWctcm9tLmMKQEAgLTAsMCArMSwxNjQgQEAKKy8qIFJlbW90ZSBkZWJ1Z2dpbmcgaW50ZXJmYWNlIHRvIGRCVUcgUk9NIG1vbml0b3IgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBXcml0dGVuIGJ5IFN0YW4gU2hlYnMgb2YgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogZEJVRyBpcyBhIG1vbml0b3Igc3VwcGxpZWQgb24gdmFyaW91cyBNb3Rvcm9sYSBib2FyZHMsIGluY2x1ZGluZworICAgbTY4aywgQ29sZEZpcmUsIGFuZCBQb3dlclBDLWJhc2VkIGRlc2lnbnMuICBUaGUgY29kZSBoZXJlIGFzc3VtZXMKKyAgIHRoZSBDb2xkRmlyZSwgYW5kIChhcyBvZiA5LzI1Lzk2KSBoYXMgb25seSBiZWVuIHRlc3RlZCB3aXRoIGEKKyAgIENvbGRGaXJlIElEUCBib2FyZC4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgIm1vbml0b3IuaCIKKyNpbmNsdWRlICJzZXJpYWwuaCIKKworc3RhdGljIHZvaWQgZGJ1Z19vcGVuIFBBUkFNUyAoKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkpOworCitzdGF0aWMgdm9pZAorZGJ1Z19zdXBwbHlfcmVnaXN0ZXIgKHJlZ25hbWUsIHJlZ25hbWVsZW4sIHZhbCwgdmFsbGVuKQorICAgICBjaGFyICpyZWduYW1lOworICAgICBpbnQgcmVnbmFtZWxlbjsKKyAgICAgY2hhciAqdmFsOworICAgICBpbnQgdmFsbGVuOworeworICBpbnQgcmVnbm87CisKKyAgaWYgKHJlZ25hbWVsZW4gIT0gMikKKyAgICByZXR1cm47CisKKyAgc3dpdGNoIChyZWduYW1lWzBdKQorICAgIHsKKyAgICBjYXNlICdTJzoKKyAgICAgIGlmIChyZWduYW1lWzFdICE9ICdSJykKKwlyZXR1cm47CisgICAgICByZWdubyA9IFBTX1JFR05VTTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1AnOgorICAgICAgaWYgKHJlZ25hbWVbMV0gIT0gJ0MnKQorCXJldHVybjsKKyAgICAgIHJlZ25vID0gUENfUkVHTlVNOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnRCc6CisgICAgICBpZiAocmVnbmFtZVsxXSA8ICcwJyB8fCByZWduYW1lWzFdID4gJzcnKQorCXJldHVybjsKKyAgICAgIHJlZ25vID0gcmVnbmFtZVsxXSAtICcwJyArIEQwX1JFR05VTTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0EnOgorICAgICAgaWYgKHJlZ25hbWVbMV0gPCAnMCcgfHwgcmVnbmFtZVsxXSA+ICc3JykKKwlyZXR1cm47CisgICAgICByZWdubyA9IHJlZ25hbWVbMV0gLSAnMCcgKyBBMF9SRUdOVU07CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuOworICAgIH0KKworICBtb25pdG9yX3N1cHBseV9yZWdpc3RlciAocmVnbm8sIHZhbCk7Cit9CisKKy8qIFRoaXMgYXJyYXkgb2YgcmVnaXN0ZXJzIG5lZWRzIHRvIG1hdGNoIHRoZSBpbmRleGVzIHVzZWQgYnkgR0RCLiBUaGUKKyAgIHdob2xlIHJlYXNvbiB0aGlzIGV4aXN0cyBpcyBiZWNhdXNlIHRoZSB2YXJpb3VzIFJPTSBtb25pdG9ycyB1c2UKKyAgIGRpZmZlcmVudCBuYW1lcyB0aGFuIEdEQiBkb2VzLCBhbmQgZG9uJ3Qgc3VwcG9ydCBhbGwgdGhlIHJlZ2lzdGVycworICAgZWl0aGVyLiBTbywgdHlwaW5nICJpbmZvIHJlZyBzcCIgYmVjb21lcyBhbiAiQTciLiAqLworCitzdGF0aWMgY2hhciAqZGJ1Z19yZWduYW1lc1tOVU1fUkVHU10gPQoreworICAiRDAiLCAiRDEiLCAiRDIiLCAiRDMiLCAiRDQiLCAiRDUiLCAiRDYiLCAiRDciLAorICAiQTAiLCAiQTEiLCAiQTIiLCAiQTMiLCAiQTQiLCAiQTUiLCAiQTYiLCAiQTciLAorICAiU1IiLCAiUEMiCisgIC8qIG5vIGZsb2F0IHJlZ2lzdGVycyAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgdGFyZ2V0X29wcyBkYnVnX29wczsKK3N0YXRpYyBzdHJ1Y3QgbW9uaXRvcl9vcHMgZGJ1Z19jbWRzIDsKKworc3RhdGljIGNoYXIgKmRidWdfaW5pdHNbXSA9IHsiXHIiLCBOVUxMfTsKKworCitzdGF0aWMgdm9pZCAKK2luaXRfZGJ1Z19jbWRzKHZvaWQpCit7CisgIGRidWdfY21kcy5mbGFncyA9ICAgTU9fQ0xSX0JSRUFLX1VTRVNfQUREUiB8IE1PX0dFVE1FTV9ORUVEU19SQU5HRSB8IE1PX0ZJTExfVVNFU19BRERSOworICBkYnVnX2NtZHMuaW5pdCA9ICAgZGJ1Z19pbml0czsJCQkvKiBJbml0IHN0cmluZ3MgKi8KKyAgZGJ1Z19jbWRzLmNvbnQgPSAgICJnb1xyIjsJCQkvKiBjb250aW51ZSBjb21tYW5kICovCisgIGRidWdfY21kcy5zdGVwID0gICAic3RlcFxyIjsJCQkvKiBzaW5nbGUgc3RlcCAqLworICBkYnVnX2NtZHMuc3RvcCA9ICAgTlVMTDsJCQkJLyogaW50ZXJydXB0IGNvbW1hbmQgKi8KKyAgZGJ1Z19jbWRzLnNldF9icmVhayA9ICAgImJyICV4XHIiOwkJCS8qIHNldCBhIGJyZWFrcG9pbnQgKi8KKyAgZGJ1Z19jbWRzLmNscl9icmVhayA9ICAgImJyIC1jICV4XHIiOwkJCS8qIGNsZWFyIGEgYnJlYWtwb2ludCAqLworICBkYnVnX2NtZHMuY2xyX2FsbF9icmVhayA9ICAgImJyIC1jXHIiOwkJCS8qIGNsZWFyIGFsbCBicmVha3BvaW50cyAqLworICBkYnVnX2NtZHMuZmlsbCA9ICAgImJmLmIgJXggJXggJXgiOwkJLyogZmlsbCAoc3RhcnQgZW5kIHZhbCkgKi8KKyAgZGJ1Z19jbWRzLnNldG1lbS5jbWRiID0gICAgICJtbS5iICV4ICV4XHIiOwkJLyogc2V0bWVtLmNtZGIgKGFkZHIsIHZhbHVlKSAqLworICBkYnVnX2NtZHMuc2V0bWVtLmNtZHcgPSAgICAgIm1tLncgJXggJXhcciI7CQkvKiBzZXRtZW0uY21kdyAoYWRkciwgdmFsdWUpICovCisgIGRidWdfY21kcy5zZXRtZW0uY21kbCA9ICAgICAibW0ubCAleCAleFxyIjsJCS8qIHNldG1lbS5jbWRsIChhZGRyLCB2YWx1ZSkgKi8KKyAgZGJ1Z19jbWRzLnNldG1lbS5jbWRsbCA9ICAgICBOVUxMOwkJCS8qIHNldG1lbS5jbWRsbCAoYWRkciwgdmFsdWUpICovCisgIGRidWdfY21kcy5zZXRtZW0ucmVzcF9kZWxpbSA9ICAgICBOVUxMOwkJCS8qIHNldG1lbS5yZXNwX2RlbGltICovCisgIGRidWdfY21kcy5zZXRtZW0udGVybSA9ICAgICBOVUxMOwkJCS8qIHNldG1lbS50ZXJtICovCisgIGRidWdfY21kcy5zZXRtZW0udGVybV9jbWQgPSAgICAgTlVMTDsJCQkvKiBzZXRtZW0udGVybV9jbWQgKi8KKyAgZGJ1Z19jbWRzLmdldG1lbS5jbWRiID0gICAgICJtZC5iICV4ICV4XHIiOwkJLyogZ2V0bWVtLmNtZGIgKGFkZHIsIGFkZHIyKSAqLworICBkYnVnX2NtZHMuZ2V0bWVtLmNtZHcgPSAgICAgIm1kLncgJXggJXhcciI7CQkvKiBnZXRtZW0uY21kdyAoYWRkciwgYWRkcjIpICovCisgIGRidWdfY21kcy5nZXRtZW0uY21kbCA9ICAgICAibWQubCAleCAleFxyIjsJCS8qIGdldG1lbS5jbWRsIChhZGRyLCBhZGRyMikgKi8KKyAgZGJ1Z19jbWRzLmdldG1lbS5jbWRsbCA9ICAgICBOVUxMOwkJCS8qIGdldG1lbS5jbWRsbCAoYWRkciwgYWRkcjIpICovCisgIGRidWdfY21kcy5nZXRtZW0ucmVzcF9kZWxpbSA9ICAgICAiOiI7CQkJLyogZ2V0bWVtLnJlc3BfZGVsaW0gKi8KKyAgZGJ1Z19jbWRzLmdldG1lbS50ZXJtID0gICAgIE5VTEw7CQkJLyogZ2V0bWVtLnRlcm0gKi8KKyAgZGJ1Z19jbWRzLmdldG1lbS50ZXJtX2NtZCA9ICAgICBOVUxMOwkJCS8qIGdldG1lbS50ZXJtX2NtZCAqLworICBkYnVnX2NtZHMuc2V0cmVnLmNtZCA9ICAgICAicm0gJXMgJXhcciI7CQkvKiBzZXRyZWcuY21kIChuYW1lLCB2YWx1ZSkgKi8KKyAgZGJ1Z19jbWRzLnNldHJlZy5yZXNwX2RlbGltID0gICAgIE5VTEw7CQkJLyogc2V0cmVnLnJlc3BfZGVsaW0gKi8KKyAgZGJ1Z19jbWRzLnNldHJlZy50ZXJtID0gICAgIE5VTEw7CQkJLyogc2V0cmVnLnRlcm0gKi8KKyAgZGJ1Z19jbWRzLnNldHJlZy50ZXJtX2NtZCA9ICAgICBOVUxMOwkJCS8qIHNldHJlZy50ZXJtX2NtZCAqLworICBkYnVnX2NtZHMuZ2V0cmVnLmNtZCA9ICAgICAicmQgJXNcciI7CQkJLyogZ2V0cmVnLmNtZCAobmFtZSkgKi8KKyAgZGJ1Z19jbWRzLmdldHJlZy5yZXNwX2RlbGltID0gICAgICI6IjsJCQkvKiBnZXRyZWcucmVzcF9kZWxpbSAqLworICBkYnVnX2NtZHMuZ2V0cmVnLnRlcm0gPSAgICAgTlVMTDsJCQkvKiBnZXRyZWcudGVybSAqLworICBkYnVnX2NtZHMuZ2V0cmVnLnRlcm1fY21kID0gICAgIE5VTEw7CQkJLyogZ2V0cmVnLnRlcm1fY21kICovCisgIGRidWdfY21kcy5kdW1wX3JlZ2lzdGVycyA9ICAgInJkXHIiOwkJCS8qIGR1bXBfcmVnaXN0ZXJzICovCisgIGRidWdfY21kcy5yZWdpc3Rlcl9wYXR0ZXJuID0gICAiXFwoXFx3K1xcKSArOlxcKFswLTlhLWZBLUZdK1xcYlxcKSI7IC8qIHJlZ2lzdGVyX3BhdHRlcm4gKi8KKyAgZGJ1Z19jbWRzLnN1cHBseV9yZWdpc3RlciA9ICAgZGJ1Z19zdXBwbHlfcmVnaXN0ZXI7CQkvKiBzdXBwbHlfcmVnaXN0ZXIgKi8KKyAgZGJ1Z19jbWRzLmxvYWRfcm91dGluZSA9ICAgTlVMTDsJCQkJLyogbG9hZF9yb3V0aW5lIChkZWZhdWx0cyB0byBTUkVDcykgKi8KKyAgZGJ1Z19jbWRzLmxvYWQgPSAgICJkbFxyIjsJCQkvKiBkb3dubG9hZCBjb21tYW5kICovCisgIGRidWdfY21kcy5sb2FkcmVzcCA9ICAgIlxuIjsJCQkJLyogbG9hZCByZXNwb25zZSAqLworICBkYnVnX2NtZHMucHJvbXB0ID0gICAiZEJVRz4iOwkJCS8qIG1vbml0b3IgY29tbWFuZCBwcm9tcHQgKi8KKyAgZGJ1Z19jbWRzLmxpbmVfdGVybSA9ICAgIlxyIjsJCQkJLyogZW5kLW9mLWxpbmUgdGVybWluYXRvciAqLworICBkYnVnX2NtZHMuY21kX2VuZCA9ICAgTlVMTDsJCQkJLyogb3B0aW9uYWwgY29tbWFuZCB0ZXJtaW5hdG9yICovCisgIGRidWdfY21kcy50YXJnZXQgPSAgICZkYnVnX29wcyA7CQkJLyogdGFyZ2V0IG9wZXJhdGlvbnMgKi8KKyAgZGJ1Z19jbWRzLnN0b3BiaXRzID0gICBTRVJJQUxfMV9TVE9QQklUUzsJCS8qIG51bWJlciBvZiBzdG9wIGJpdHMgKi8KKyAgZGJ1Z19jbWRzLnJlZ25hbWVzID0gICBkYnVnX3JlZ25hbWVzOwkJLyogcmVnaXN0ZXJzIG5hbWVzICovCisgIGRidWdfY21kcy5tYWdpYyA9ICAgTU9OSVRPUl9PUFNfTUFHSUMJOwkvKiBtYWdpYyAqLworfSAvKiBpbml0X2RlYnVnX29wcyAqLworCitzdGF0aWMgdm9pZAorZGJ1Z19vcGVuKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIG1vbml0b3Jfb3BlbiAoYXJncywgJmRidWdfY21kcywgZnJvbV90dHkpOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9kYnVnX3JvbSAoKQoreworICBpbml0X2RidWdfY21kcygpIDsKKyAgaW5pdF9tb25pdG9yX29wcyAoJmRidWdfb3BzKTsKKworICBkYnVnX29wcy50b19zaG9ydG5hbWUgPSAiZGJ1ZyI7CisgIGRidWdfb3BzLnRvX2xvbmduYW1lID0gImRCVUcgbW9uaXRvciI7CisgIGRidWdfb3BzLnRvX2RvYyA9ICJEZWJ1ZyB2aWEgdGhlIGRCVUcgbW9uaXRvci5cblwKK1NwZWNpZnkgdGhlIHNlcmlhbCBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvIChlLmcuIC9kZXYvdHR5YSkuIjsKKyAgZGJ1Z19vcHMudG9fb3BlbiA9IGRidWdfb3BlbjsKKworICBhZGRfdGFyZ2V0ICgmZGJ1Z19vcHMpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2RieHJlYWQuYyBiL2dkYi9kYnhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0OTQxMgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9kYnhyZWFkLmMKQEAgLTAsMCArMSwyNzM4IEBACisvKiBSZWFkIGRieCBzeW1ib2wgdGFibGVzIGFuZCBjb252ZXJ0IHRvIGludGVybmFsIGZvcm1hdCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRocmVlIGZ1bmN0aW9uczogZGJ4X3N5bWZpbGVfaW5pdCwKKyAgIHdoaWNoIGluaXRpYWxpemVzIHRvIHJlYWQgYSBzeW1ib2wgZmlsZTsgZGJ4X25ld19pbml0LCB3aGljaCAKKyAgIGRpc2NhcmRzIGV4aXN0aW5nIGNhY2hlZCBpbmZvcm1hdGlvbiB3aGVuIGFsbCBzeW1ib2xzIGFyZSBiZWluZworICAgZGlzY2FyZGVkOyBhbmQgZGJ4X3N5bWZpbGVfcmVhZCwgd2hpY2ggcmVhZHMgYSBzeW1ib2wgdGFibGUKKyAgIGZyb20gYSBmaWxlLgorCisgICBkYnhfc3ltZmlsZV9yZWFkIG9ubHkgZG9lcyB0aGUgbWluaW11bSB3b3JrIG5lY2Vzc2FyeSBmb3IgbGV0dGluZyB0aGUKKyAgIHVzZXIgIm5hbWUiIHRoaW5ncyBzeW1ib2xpY2FsbHk7IGl0IGRvZXMgbm90IHJlYWQgdGhlIGVudGlyZSBzeW10YWIuCisgICBJbnN0ZWFkLCBpdCByZWFkcyB0aGUgZXh0ZXJuYWwgYW5kIHN0YXRpYyBzeW1ib2xzIGFuZCBwdXRzIHRoZW0gaW4gcGFydGlhbAorICAgc3ltYm9sIHRhYmxlcy4gIFdoZW4gbW9yZSBleHRlbnNpdmUgaW5mb3JtYXRpb24gaXMgcmVxdWVzdGVkIG9mIGEKKyAgIGZpbGUsIHRoZSBjb3JyZXNwb25kaW5nIHBhcnRpYWwgc3ltYm9sIHRhYmxlIGlzIG11dGF0ZWQgaW50byBhIGZ1bGwKKyAgIGZsZWRnZWQgc3ltYm9sIHRhYmxlIGJ5IGdvaW5nIGJhY2sgYW5kIHJlYWRpbmcgdGhlIHN5bWJvbHMKKyAgIGZvciByZWFsLiAgZGJ4X3BzeW10YWJfdG9fc3ltdGFiKCkgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGlzICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorCisjaWYgZGVmaW5lZChVU0cpIHx8IGRlZmluZWQoX19DWUdOVVNDTElCX18pCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAib2JzdGFjay5oIgorI2luY2x1ZGUgImdkYl9zdGF0LmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJicmVha3BvaW50LmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIJCS8qIGZvciBiZmQgc3R1ZmYgKi8KKyNpbmNsdWRlICJsaWJhb3V0LmgiCSAJLyogRklYTUUgU2VjcmV0IGludGVybmFsIEJGRCBzdHVmZiBmb3IgYS5vdXQgKi8KKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJidWlsZHN5bS5oIgorI2luY2x1ZGUgInN0YWJzcmVhZC5oIgorI2luY2x1ZGUgImdkYi1zdGFicy5oIgorI2luY2x1ZGUgImRlbWFuZ2xlLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIJCS8qIE5lZWRlZCBpbnNpZGUgcGFydGlhbC1zdGFiLmggKi8KKyNpbmNsdWRlICJjb21wbGFpbnRzLmgiCisKKyNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgorI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIJLyogV2UgYWx3YXlzIHVzZSBHTlUgc3RhYnMsIG5vdCBuYXRpdmUsIG5vdyAqLworCisMCisvKiBUaGlzIG1hY3JvIHJldHVybnMgdGhlIHNpemUgZmllbGQgb2YgYSBtaW5pbWFsIHN5bWJvbCwgd2hpY2ggaXMgbm9ybWFsbHkKKyAgIHN0b3JlZCBpbiB0aGUgImluZm8iIGZpZWxkLiAgVGhlIG1hY3JvIGNhbiBiZSBvdmVycmlkZGVuIGZvciBzcGVjaWZpYworICAgdGFyZ2V0cyAoZS5nLiBNSVBTMTYpIHRoYXQgdXNlIHRoZSBpbmZvIGZpZWxkIGZvciBvdGhlciBwdXJwb3Nlcy4gICovCisjaWZuZGVmIE1TWU1CT0xfU0laRQorI2RlZmluZSBNU1lNQk9MX1NJWkUobXN5bSkgKChsb25nKSBNU1lNQk9MX0lORk8gKG1zeW0pKQorI2VuZGlmCisKKworLyogV2UgcHV0IGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSBpbiB0aGUgcmVhZF9zeW10YWJfcHJpdmF0ZSBmaWVsZAorICAgb2YgdGhlIHBzeW10YWIuICAqLworCitzdHJ1Y3Qgc3ltbG9jIHsKKworICAvKiBPZmZzZXQgd2l0aGluIHRoZSBmaWxlIHN5bWJvbCB0YWJsZSBvZiBmaXJzdCBsb2NhbCBzeW1ib2wgZm9yIHRoaXMKKyAgICAgZmlsZS4gICovCisKKyAgaW50IGxkc3ltb2ZmOworCisgIC8qIExlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoZSBzZWN0aW9uIG9mIHRoZSBzeW1ib2wgdGFibGUgZGV2b3RlZCB0bworICAgICB0aGlzIGZpbGUncyBzeW1ib2xzIChhY3R1YWxseSwgdGhlIHNlY3Rpb24gYnJhY2tldGVkIG1heSBjb250YWluCisgICAgIG1vcmUgdGhhbiBqdXN0IHRoaXMgZmlsZSdzIHN5bWJvbHMpLiAgSWYgbGRzeW1sZW4gaXMgMCwgdGhlIG9ubHkKKyAgICAgcmVhc29uIGZvciB0aGlzIHRoaW5nJ3MgZXhpc3RlbmNlIGlzIHRoZSBkZXBlbmRlbmN5IGxpc3QuICBOb3RoaW5nCisgICAgIGVsc2Ugd2lsbCBoYXBwZW4gd2hlbiBpdCBpcyByZWFkIGluLiAgKi8KKworICBpbnQgbGRzeW1sZW47CisKKyAgLyogVGhlIHNpemUgb2YgZWFjaCBzeW1ib2wgaW4gdGhlIHN5bWJvbCBmaWxlIChpbiBleHRlcm5hbCBmb3JtKS4gICovCisKKyAgaW50IHN5bWJvbF9zaXplOworCisgIC8qIEZ1cnRoZXIgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGxvY2F0ZSB0aGUgc3ltYm9scyBpZiB0aGV5IGFyZSBpbgorICAgICBhbiBFTEYgZmlsZS4gICovCisKKyAgaW50IHN5bWJvbF9vZmZzZXQ7CisgIGludCBzdHJpbmdfb2Zmc2V0OworICBpbnQgZmlsZV9zdHJpbmdfb2Zmc2V0OworfTsKKworI2RlZmluZSBMRFNZTU9GRihwKSAoKChzdHJ1Y3Qgc3ltbG9jICopKChwKS0+cmVhZF9zeW10YWJfcHJpdmF0ZSkpLT5sZHN5bW9mZikKKyNkZWZpbmUgTERTWU1MRU4ocCkgKCgoc3RydWN0IHN5bWxvYyAqKSgocCktPnJlYWRfc3ltdGFiX3ByaXZhdGUpKS0+bGRzeW1sZW4pCisjZGVmaW5lIFNZTUxPQyhwKSAoKHN0cnVjdCBzeW1sb2MgKikoKHApLT5yZWFkX3N5bXRhYl9wcml2YXRlKSkKKyNkZWZpbmUgU1lNQk9MX1NJWkUocCkgKFNZTUxPQyhwKS0+c3ltYm9sX3NpemUpCisjZGVmaW5lIFNZTUJPTF9PRkZTRVQocCkgKFNZTUxPQyhwKS0+c3ltYm9sX29mZnNldCkKKyNkZWZpbmUgU1RSSU5HX09GRlNFVChwKSAoU1lNTE9DKHApLT5zdHJpbmdfb2Zmc2V0KQorI2RlZmluZSBGSUxFX1NUUklOR19PRkZTRVQocCkgKFNZTUxPQyhwKS0+ZmlsZV9zdHJpbmdfb2Zmc2V0KQorCisMCisvKiBSZW1lbWJlciB3aGF0IHdlIGRlZHVjZWQgdG8gYmUgdGhlIHNvdXJjZSBsYW5ndWFnZSBvZiB0aGlzIHBzeW10YWIuICovCisKK3N0YXRpYyBlbnVtIGxhbmd1YWdlIHBzeW10YWJfbGFuZ3VhZ2UgPSBsYW5ndWFnZV91bmtub3duOworCisvKiBOb256ZXJvIG1lYW5zIGdpdmUgdmVyYm9zZSBpbmZvIG9uIGdkYiBhY3Rpb24uICBGcm9tIG1haW4uYy4gICovCisKK2V4dGVybiBpbnQgaW5mb192ZXJib3NlOworCisvKiBUaGUgQkZEIGZvciB0aGlzIGZpbGUgLS0gaW1wbGljaXQgcGFyYW1ldGVyIHRvIG5leHRfc3ltYm9sX3RleHQuICAqLworCitzdGF0aWMgYmZkICpzeW1maWxlX2JmZDsKKworLyogVGhlIHNpemUgb2YgZWFjaCBzeW1ib2wgaW4gdGhlIHN5bWJvbCBmaWxlIChpbiBleHRlcm5hbCBmb3JtKS4KKyAgIFRoaXMgaXMgc2V0IGJ5IGRieF9zeW1maWxlX3JlYWQgd2hlbiBidWlsZGluZyBwc3ltdGFicywgYW5kIGJ5CisgICBkYnhfcHN5bXRhYl90b19zeW10YWIgd2hlbiBidWlsZGluZyBzeW10YWJzLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIHN5bWJvbF9zaXplOworCisvKiBUaGlzIGlzIHRoZSBvZmZzZXQgb2YgdGhlIHN5bWJvbCB0YWJsZSBpbiB0aGUgZXhlY3V0YWJsZSBmaWxlLiAqLworCitzdGF0aWMgdW5zaWduZWQgc3ltYm9sX3RhYmxlX29mZnNldDsKKworLyogVGhpcyBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBzdHJpbmcgdGFibGUgaW4gdGhlIGV4ZWN1dGFibGUgZmlsZS4gKi8KKworc3RhdGljIHVuc2lnbmVkIHN0cmluZ190YWJsZV9vZmZzZXQ7CisKKy8qIEZvciBlbGYrc3RhYiBleGVjdXRhYmxlcywgdGhlIG5fc3RyeCBmaWVsZCBpcyBub3QgYSBzaW1wbGUgaW5kZXgKKyAgIGludG8gdGhlIHN0cmluZyB0YWJsZS4gIEluc3RlYWQsIGVhY2ggLm8gZmlsZSBoYXMgYSBiYXNlIG9mZnNldCBpbgorICAgdGhlIHN0cmluZyB0YWJsZSwgYW5kIHRoZSBhc3NvY2lhdGVkIHN5bWJvbHMgY29udGFpbiBvZmZzZXRzIGZyb20KKyAgIHRoaXMgYmFzZS4gIFRoZSBmb2xsb3dpbmcgdHdvIHZhcmlhYmxlcyBjb250YWluIHRoZSBiYXNlIG9mZnNldCBmb3IKKyAgIHRoZSBjdXJyZW50IGFuZCBuZXh0IC5vIGZpbGVzLiAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGZpbGVfc3RyaW5nX3RhYmxlX29mZnNldDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmV4dF9maWxlX3N0cmluZ190YWJsZV9vZmZzZXQ7CisKKy8qIC5vIGFuZCBOTE0gZmlsZXMgY29udGFpbiB1bnJlbG9jYXRlZCBhZGRyZXNzZXMgd2hpY2ggYXJlIGJhc2VkIGF0CisgICAwLiAgV2hlbiBub24temVybywgdGhpcyBmbGFnIGRpc2FibGVzIHNvbWUgb2YgdGhlIHNwZWNpYWwgY2FzZXMgZm9yCisgICBTb2xhcmlzIGVsZitzdGFiIHRleHQgYWRkcmVzc2VzIGF0IGxvY2F0aW9uIDAuICovCisKK3N0YXRpYyBpbnQgc3ltZmlsZV9yZWxvY2F0YWJsZSA9IDA7CisKKy8qIElmIHRoaXMgaXMgbm9uemVybywgTl9MQlJBQywgTl9SQlJBQywgYW5kIE5fU0xJTkUgZW50cmllcyBhcmUKKyAgIHJlbGF0aXZlIHRvIHRoZSBmdW5jdGlvbiBzdGFydCBhZGRyZXNzLiAgKi8KKworc3RhdGljIGludCBibG9ja19hZGRyZXNzX2Z1bmN0aW9uX3JlbGF0aXZlID0gMDsKKwwKKy8qIFRoZSBsb3dlc3QgdGV4dCBhZGRyZXNzIHdlIGhhdmUgeWV0IGVuY291bnRlcmVkLiAgVGhpcyBpcyBuZWVkZWQKKyAgIGJlY2F1c2UgaW4gYW4gYS5vdXQgZmlsZSwgdGhlcmUgaXMgbm8gaGVhZGVyIGZpZWxkIHdoaWNoIHRlbGxzIHVzCisgICB3aGF0IGFkZHJlc3MgdGhlIHByb2dyYW0gaXMgYWN0dWFsbHkgZ29pbmcgdG8gYmUgbG9hZGVkIGF0LCBzbyB3ZQorICAgbmVlZCB0byBtYWtlIGd1ZXNzZXMgYmFzZWQgb24gdGhlIHN5bWJvbHMgKHdoaWNoICphcmUqIHJlbG9jYXRlZCB0bworICAgcmVmbGVjdCB0aGUgYWRkcmVzcyBpdCB3aWxsIGJlIGxvYWRlZCBhdCkuICAqLworCitzdGF0aWMgQ09SRV9BRERSIGxvd2VzdF90ZXh0X2FkZHJlc3M7CisKKy8qIE5vbi16ZXJvIGlmIHRoZXJlIGlzIGFueSBsaW5lIG51bWJlciBpbmZvIGluIHRoZSBvYmpmaWxlLiAgUHJldmVudHMKKyAgIGVuZF9wc3ltdGFiIGZyb20gZGlzY2FyZGluZyBhbiBvdGhlcndpc2UgZW1wdHkgcHN5bXRhYi4gICovCisKK3N0YXRpYyBpbnQgaGFzX2xpbmVfbnVtYmVyczsKKworLyogQ29tcGxhaW50cyBhYm91dCB0aGUgc3ltYm9scyB3ZSBoYXZlIGVuY291bnRlcmVkLiAgKi8KKworc3RydWN0IGNvbXBsYWludCBsYnJhY19jb21wbGFpbnQgPSAKKyAgeyJiYWQgYmxvY2sgc3RhcnQgYWRkcmVzcyBwYXRjaGVkIiwgMCwgMH07CisKK3N0cnVjdCBjb21wbGFpbnQgc3RyaW5nX3RhYmxlX29mZnNldF9jb21wbGFpbnQgPQorICB7ImJhZCBzdHJpbmcgdGFibGUgb2Zmc2V0IGluIHN5bWJvbCAlZCIsIDAsIDB9OworCitzdHJ1Y3QgY29tcGxhaW50IHVua25vd25fc3ltdHlwZV9jb21wbGFpbnQgPQorICB7InVua25vd24gc3ltYm9sIHR5cGUgJXMiLCAwLCAwfTsKKworc3RydWN0IGNvbXBsYWludCB1bmtub3duX3N5bWNoYXJfY29tcGxhaW50ID0KKyAgeyJ1bmtub3duIHN5bWJvbCBkZXNjcmlwdG9yIGAlYyciLCAwLCAwfTsKKworc3RydWN0IGNvbXBsYWludCBsYnJhY19yYnJhY19jb21wbGFpbnQgPQorICB7ImJsb2NrIHN0YXJ0IGxhcmdlciB0aGFuIGJsb2NrIGVuZCIsIDAsIDB9OworCitzdHJ1Y3QgY29tcGxhaW50IGxicmFjX3VubWF0Y2hlZF9jb21wbGFpbnQgPQorICB7InVubWF0Y2hlZCBOX0xCUkFDIGJlZm9yZSBzeW10YWIgcG9zICVkIiwgMCwgMH07CisKK3N0cnVjdCBjb21wbGFpbnQgbGJyYWNfbWlzbWF0Y2hfY29tcGxhaW50ID0KKyAgeyJOX0xCUkFDL05fUkJSQUMgc3ltYm9sIG1pc21hdGNoIGF0IHN5bXRhYiBwb3MgJWQiLCAwLCAwfTsKKworc3RydWN0IGNvbXBsYWludCByZXBlYXRlZF9oZWFkZXJfY29tcGxhaW50ID0KKyAgeyJcInJlcGVhdGVkXCIgaGVhZGVyIGZpbGUgJXMgbm90IHByZXZpb3VzbHkgc2VlbiwgYXQgc3ltdGFiIHBvcyAlZCIsIDAsIDB9OworCitzdHJ1Y3QgY29tcGxhaW50IHVuY2xhaW1lZF9iaW5jbF9jb21wbGFpbnQgPQorICB7Ik5fQklOQ0wgJXMgbm90IGluIGVudHJpZXMgZm9yIGFueSBmaWxlLCBhdCBzeW10YWIgcG9zICVkIiwgMCwgMH07CisMCisvKiBEdXJpbmcgaW5pdGlhbCBzeW1ib2wgcmVhZGluLCB3ZSBuZWVkIHRvIGhhdmUgYSBzdHJ1Y3R1cmUgdG8ga2VlcAorICAgdHJhY2sgb2Ygd2hpY2ggcHN5bXRhYnMgaGF2ZSB3aGljaCBiaW5jbHMgaW4gdGhlbS4gIFRoaXMgc3RydWN0dXJlCisgICBpcyB1c2VkIGR1cmluZyByZWFkaW4gdG8gc2V0dXAgdGhlIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIHdpdGhpbiBlYWNoCisgICBwYXJ0aWFsIHN5bWJvbCB0YWJsZS4gKi8KKworc3RydWN0IGhlYWRlcl9maWxlX2xvY2F0aW9uCit7CisgIGNoYXIgKm5hbWU7CQkJLyogTmFtZSBvZiBoZWFkZXIgZmlsZSAqLworICBpbnQgaW5zdGFuY2U7CQkJLyogU2VlIGFib3ZlICovCisgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN0OwkvKiBQYXJ0aWFsIHN5bXRhYiB0aGF0IGhhcyB0aGUKKwkJCQkgICBCSU5DTC9FSU5DTCBkZWZzIGZvciB0aGlzIGZpbGUgKi8KK307CisKKy8qIFRoZSBhY3R1YWwgbGlzdCBhbmQgY29udHJvbGluZyB2YXJpYWJsZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgaGVhZGVyX2ZpbGVfbG9jYXRpb24gKmJpbmNsX2xpc3QsICpuZXh0X2JpbmNsOworc3RhdGljIGludCBiaW5jbHNfYWxsb2NhdGVkOworCisvKiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCisKK3N0YXRpYyB2b2lkIAorcHJvY2Vzc19ub3cgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZAorZnJlZV9oZWFkZXJfZmlsZXMgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZAoraW5pdF9oZWFkZXJfZmlsZXMgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZAorcmVhZF9vZmlsZV9zeW10YWIgUEFSQU1TICgoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKKworc3RhdGljIHZvaWQKK2RieF9wc3ltdGFiX3RvX3N5bXRhYiBQQVJBTVMgKChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworCitzdGF0aWMgdm9pZAorZGJ4X3BzeW10YWJfdG9fc3ltdGFiXzEgUEFSQU1TICgoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKKworc3RhdGljIHZvaWQKK3JlYWRfZGJ4X2R5bmFtaWNfc3ltdGFiIFBBUkFNUyAoKHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKiwKKwkJCQkgc3RydWN0IG9iamZpbGUgKm9iamZpbGUpKTsKKworc3RhdGljIHZvaWQKK3JlYWRfZGJ4X3N5bXRhYiBQQVJBTVMgKChzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICosIHN0cnVjdCBvYmpmaWxlICosCisJCQkgQ09SRV9BRERSLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2ZyZWVfYmluY2xfbGlzdCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKgorZmluZF9jb3JyZXNwb25kaW5nX2JpbmNsX3BzeW10YWIgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2FkZF9iaW5jbF90b19saXN0IFBBUkFNUyAoKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqLCBjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZAoraW5pdF9iaW5jbF9saXN0IFBBUkFNUyAoKGludCwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgY2hhciAqCitkYnhfbmV4dF9zeW1ib2xfdGV4dCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCitmaWxsX3N5bWJ1ZiBQQVJBTVMgKChiZmQgKikpOworCitzdGF0aWMgdm9pZAorZGJ4X3N5bWZpbGVfaW5pdCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCitkYnhfbmV3X2luaXQgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZAorZGJ4X3N5bWZpbGVfcmVhZCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICosIGludCkpOworCitzdGF0aWMgdm9pZAorZGJ4X3N5bWZpbGVfZmluaXNoIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQKK3JlY29yZF9taW5pbWFsX3N5bWJvbCBQQVJBTVMgKChjaGFyICosIENPUkVfQUREUiwgaW50LCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCithZGRfbmV3X2hlYWRlcl9maWxlIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCithZGRfb2xkX2hlYWRlcl9maWxlIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCithZGRfdGhpc19vYmplY3RfaGVhZGVyX2ZpbGUgUEFSQU1TICgoaW50KSk7CisKKy8qIEZyZWUgdXAgb2xkIGhlYWRlciBmaWxlIHRhYmxlcyAqLworCitzdGF0aWMgdm9pZAorZnJlZV9oZWFkZXJfZmlsZXMgKCkKK3sKKyAgaWYgKHRoaXNfb2JqZWN0X2hlYWRlcl9maWxlcykKKyAgICB7CisgICAgICBmcmVlICgoUFRSKXRoaXNfb2JqZWN0X2hlYWRlcl9maWxlcyk7CisgICAgICB0aGlzX29iamVjdF9oZWFkZXJfZmlsZXMgPSBOVUxMOworICAgIH0KKyAgbl9hbGxvY2F0ZWRfdGhpc19vYmplY3RfaGVhZGVyX2ZpbGVzID0gMDsKK30KKworLyogQWxsb2NhdGUgbmV3IGhlYWRlciBmaWxlIHRhYmxlcyAqLworCitzdGF0aWMgdm9pZAoraW5pdF9oZWFkZXJfZmlsZXMgKCkKK3sKKyAgbl9hbGxvY2F0ZWRfdGhpc19vYmplY3RfaGVhZGVyX2ZpbGVzID0gMTA7CisgIHRoaXNfb2JqZWN0X2hlYWRlcl9maWxlcyA9IChpbnQgKikgeG1hbGxvYyAoMTAgKiBzaXplb2YgKGludCkpOworfQorCisvKiBBZGQgaGVhZGVyIGZpbGUgbnVtYmVyIEkgZm9yIHRoaXMgb2JqZWN0IGZpbGUKKyAgIGF0IHRoZSBuZXh0IHN1Y2Nlc3NpdmUgRklMRU5VTS4gICovCisKK3N0YXRpYyB2b2lkCithZGRfdGhpc19vYmplY3RfaGVhZGVyX2ZpbGUgKGkpCisgICAgIGludCBpOworeworICBpZiAobl90aGlzX29iamVjdF9oZWFkZXJfZmlsZXMgPT0gbl9hbGxvY2F0ZWRfdGhpc19vYmplY3RfaGVhZGVyX2ZpbGVzKQorICAgIHsKKyAgICAgIG5fYWxsb2NhdGVkX3RoaXNfb2JqZWN0X2hlYWRlcl9maWxlcyAqPSAyOworICAgICAgdGhpc19vYmplY3RfaGVhZGVyX2ZpbGVzCisJPSAoaW50ICopIHhyZWFsbG9jICgoY2hhciAqKSB0aGlzX29iamVjdF9oZWFkZXJfZmlsZXMsCisJCQkgICAgbl9hbGxvY2F0ZWRfdGhpc19vYmplY3RfaGVhZGVyX2ZpbGVzICogc2l6ZW9mIChpbnQpKTsKKyAgICB9CisKKyAgdGhpc19vYmplY3RfaGVhZGVyX2ZpbGVzW25fdGhpc19vYmplY3RfaGVhZGVyX2ZpbGVzKytdID0gaTsKK30KKworLyogQWRkIHRvIHRoaXMgZmlsZSBhbiAib2xkIiBoZWFkZXIgZmlsZSwgb25lIGFscmVhZHkgc2VlbiBpbgorICAgYSBwcmV2aW91cyBvYmplY3QgZmlsZS4gIE5BTUUgaXMgdGhlIGhlYWRlciBmaWxlJ3MgbmFtZS4KKyAgIElOU1RBTkNFIGlzIGl0cyBpbnN0YW5jZSBjb2RlLCB0byBzZWxlY3QgYW1vbmcgbXVsdGlwbGUKKyAgIHN5bWJvbCB0YWJsZXMgZm9yIHRoZSBzYW1lIGhlYWRlciBmaWxlLiAgKi8KKworc3RhdGljIHZvaWQKK2FkZF9vbGRfaGVhZGVyX2ZpbGUgKG5hbWUsIGluc3RhbmNlKQorICAgICBjaGFyICpuYW1lOworICAgICBpbnQgaW5zdGFuY2U7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBoZWFkZXJfZmlsZSAqcCA9IEhFQURFUl9GSUxFUyAoY3VycmVudF9vYmpmaWxlKTsKKyAgcmVnaXN0ZXIgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IE5fSEVBREVSX0ZJTEVTIChjdXJyZW50X29iamZpbGUpOyBpKyspCisgICAgaWYgKFNUUkVRIChwW2ldLm5hbWUsIG5hbWUpICYmIGluc3RhbmNlID09IHBbaV0uaW5zdGFuY2UpCisgICAgICB7CisJYWRkX3RoaXNfb2JqZWN0X2hlYWRlcl9maWxlIChpKTsKKwlyZXR1cm47CisgICAgICB9CisgIGNvbXBsYWluICgmcmVwZWF0ZWRfaGVhZGVyX2NvbXBsYWludCwgbmFtZSwgc3ltbnVtKTsKK30KKworLyogQWRkIHRvIHRoaXMgZmlsZSBhICJuZXciIGhlYWRlciBmaWxlOiBkZWZpbml0aW9ucyBmb3IgaXRzIHR5cGVzIGZvbGxvdy4KKyAgIE5BTUUgaXMgdGhlIGhlYWRlciBmaWxlJ3MgbmFtZS4KKyAgIE1vc3Qgb2Z0ZW4gdGhpcyBoYXBwZW5zIG9ubHkgb25jZSBmb3IgZWFjaCBkaXN0aW5jdCBoZWFkZXIgZmlsZSwKKyAgIGJ1dCBub3QgbmVjZXNzYXJpbHkuICBJZiBpdCBoYXBwZW5zIG1vcmUgdGhhbiBvbmNlLCBJTlNUQU5DRSBoYXMKKyAgIGEgZGlmZmVyZW50IHZhbHVlIGVhY2ggdGltZSwgYW5kIHJlZmVyZW5jZXMgdG8gdGhlIGhlYWRlciBmaWxlCisgICB1c2UgSU5TVEFOQ0UgdmFsdWVzIHRvIHNlbGVjdCBhbW9uZyB0aGVtLgorCisgICBkYnggb3V0cHV0IGNvbnRhaW5zICJiZWdpbiIgYW5kICJlbmQiIG1hcmtlcnMgZm9yIGVhY2ggbmV3IGhlYWRlciBmaWxlLAorICAgYnV0IGF0IHRoaXMgbGV2ZWwgd2UganVzdCBuZWVkIHRvIGtub3cgd2hpY2ggZmlsZXMgdGhlcmUgaGF2ZSBiZWVuOworICAgc28gd2UgcmVjb3JkIHRoZSBmaWxlIHdoZW4gaXRzICJiZWdpbiIgaXMgc2VlbiBhbmQgaWdub3JlIHRoZSAiZW5kIi4gICovCisKK3N0YXRpYyB2b2lkCithZGRfbmV3X2hlYWRlcl9maWxlIChuYW1lLCBpbnN0YW5jZSkKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgaW50IGluc3RhbmNlOworeworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgc3RydWN0IGhlYWRlcl9maWxlICpoZmlsZTsKKworICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgcm9vbSBmb3Igb25lIG1vcmUgaGVhZGVyIGZpbGUuICAqLworCisgIGkgPSBOX0FMTE9DQVRFRF9IRUFERVJfRklMRVMgKGN1cnJlbnRfb2JqZmlsZSk7CisKKyAgaWYgKE5fSEVBREVSX0ZJTEVTIChjdXJyZW50X29iamZpbGUpID09IGkpCisgICAgeworICAgICAgaWYgKGkgPT0gMCkKKwl7CisJICBOX0FMTE9DQVRFRF9IRUFERVJfRklMRVMgKGN1cnJlbnRfb2JqZmlsZSkgPSAxMDsKKwkgIEhFQURFUl9GSUxFUyAoY3VycmVudF9vYmpmaWxlKSA9IChzdHJ1Y3QgaGVhZGVyX2ZpbGUgKikKKwkgICAgeG1hbGxvYyAoMTAgKiBzaXplb2YgKHN0cnVjdCBoZWFkZXJfZmlsZSkpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpICo9IDI7CisJICBOX0FMTE9DQVRFRF9IRUFERVJfRklMRVMgKGN1cnJlbnRfb2JqZmlsZSkgPSBpOworCSAgSEVBREVSX0ZJTEVTIChjdXJyZW50X29iamZpbGUpID0gKHN0cnVjdCBoZWFkZXJfZmlsZSAqKQorCSAgICB4cmVhbGxvYyAoKGNoYXIgKikgSEVBREVSX0ZJTEVTIChjdXJyZW50X29iamZpbGUpLAorCQkgICAgICAoaSAqIHNpemVvZiAoc3RydWN0IGhlYWRlcl9maWxlKSkpOworCX0KKyAgICB9CisKKyAgLyogQ3JlYXRlIGFuIGVudHJ5IGZvciB0aGlzIGhlYWRlciBmaWxlLiAgKi8KKworICBpID0gTl9IRUFERVJfRklMRVMgKGN1cnJlbnRfb2JqZmlsZSkrKzsKKyAgaGZpbGUgPSBIRUFERVJfRklMRVMgKGN1cnJlbnRfb2JqZmlsZSkgKyBpOworICBoZmlsZS0+bmFtZSA9IHNhdmVzdHJpbmcgKG5hbWUsIHN0cmxlbihuYW1lKSk7CisgIGhmaWxlLT5pbnN0YW5jZSA9IGluc3RhbmNlOworICBoZmlsZS0+bGVuZ3RoID0gMTA7CisgIGhmaWxlLT52ZWN0b3IKKyAgICA9IChzdHJ1Y3QgdHlwZSAqKikgeG1hbGxvYyAoMTAgKiBzaXplb2YgKHN0cnVjdCB0eXBlICopKTsKKyAgbWVtc2V0IChoZmlsZS0+dmVjdG9yLCAwLCAxMCAqIHNpemVvZiAoc3RydWN0IHR5cGUgKikpOworCisgIGFkZF90aGlzX29iamVjdF9oZWFkZXJfZmlsZSAoaSk7Cit9CisKKyNpZiAwCitzdGF0aWMgc3RydWN0IHR5cGUgKioKK2V4cGxpY2l0X2xvb2t1cF90eXBlIChyZWFsX2ZpbGVudW0sIGluZGV4KQorICAgICBpbnQgcmVhbF9maWxlbnVtLCBpbmRleDsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGhlYWRlcl9maWxlICpmID0gJkhFQURFUl9GSUxFUyAoY3VycmVudF9vYmpmaWxlKVtyZWFsX2ZpbGVudW1dOworCisgIGlmIChpbmRleCA+PSBmLT5sZW5ndGgpCisgICAgeworICAgICAgZi0+bGVuZ3RoICo9IDI7CisgICAgICBmLT52ZWN0b3IgPSAoc3RydWN0IHR5cGUgKiopCisJeHJlYWxsb2MgKGYtPnZlY3RvciwgZi0+bGVuZ3RoICogc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSk7CisgICAgICBtZW1zZXQgKCZmLT52ZWN0b3JbZi0+bGVuZ3RoIC8gMl0sCisJICAgICAnXDAnLCBmLT5sZW5ndGggKiBzaXplb2YgKHN0cnVjdCB0eXBlICopIC8gMik7CisgICAgfQorICByZXR1cm4gJmYtPnZlY3RvcltpbmRleF07Cit9CisjZW5kaWYKKwwKK3N0YXRpYyB2b2lkCityZWNvcmRfbWluaW1hbF9zeW1ib2wgKG5hbWUsIGFkZHJlc3MsIHR5cGUsIG9iamZpbGUpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIENPUkVfQUREUiBhZGRyZXNzOworICAgICBpbnQgdHlwZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIGVudW0gbWluaW1hbF9zeW1ib2xfdHlwZSBtc190eXBlOworICBpbnQgc2VjdGlvbjsKKyAgYXNlY3Rpb24gKmJmZF9zZWN0aW9uOworCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSBOX1RFWFQgfCBOX0VYVDoKKyAgICAgIG1zX3R5cGUgPSBtc3RfdGV4dDsKKyAgICAgIHNlY3Rpb24gPSBTRUNUX09GRl9URVhUOworICAgICAgYmZkX3NlY3Rpb24gPSBEQlhfVEVYVF9TRUNUSU9OIChvYmpmaWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6CisgICAgICBtc190eXBlID0gbXN0X2RhdGE7CisgICAgICBzZWN0aW9uID0gU0VDVF9PRkZfREFUQTsKKyAgICAgIGJmZF9zZWN0aW9uID0gREJYX0RBVEFfU0VDVElPTiAob2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5fQlNTIHwgTl9FWFQ6CisgICAgICBtc190eXBlID0gbXN0X2JzczsKKyAgICAgIHNlY3Rpb24gPSBTRUNUX09GRl9CU1M7CisgICAgICBiZmRfc2VjdGlvbiA9IERCWF9CU1NfU0VDVElPTiAob2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6CisgICAgICBtc190eXBlID0gbXN0X2FiczsKKyAgICAgIHNlY3Rpb24gPSAtMTsKKyAgICAgIGJmZF9zZWN0aW9uID0gTlVMTDsKKyAgICAgIGJyZWFrOworI2lmZGVmIE5fU0VUVgorICAgIGNhc2UgTl9TRVRWIHwgTl9FWFQ6CisgICAgICBtc190eXBlID0gbXN0X2RhdGE7CisgICAgICBzZWN0aW9uID0gU0VDVF9PRkZfREFUQTsKKyAgICAgIGJmZF9zZWN0aW9uID0gREJYX0RBVEFfU0VDVElPTiAob2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5fU0VUVjoKKyAgICAgIC8qIEkgZG9uJ3QgdGhpbmsgdGhpcyB0eXBlIGFjdHVhbGx5IGV4aXN0czsgc2luY2UgYSBOX1NFVFYgaXMgdGhlIHJlc3VsdAorCSBvZiBnb2luZyBvdmVyIG1hbnkgLm8gZmlsZXMsIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBoYXZlIG9uZQorCSBmaWxlIGxvY2FsLiAgKi8KKyAgICAgIG1zX3R5cGUgPSBtc3RfZmlsZV9kYXRhOworICAgICAgc2VjdGlvbiA9IFNFQ1RfT0ZGX0RBVEE7CisgICAgICBiZmRfc2VjdGlvbiA9IERCWF9EQVRBX1NFQ1RJT04gKG9iamZpbGUpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIE5fVEVYVDoKKyAgICBjYXNlIE5fTkJURVhUOgorICAgIGNhc2UgTl9GTjoKKyAgICBjYXNlIE5fRk5fU0VROgorICAgICAgbXNfdHlwZSA9IG1zdF9maWxlX3RleHQ7CisgICAgICBzZWN0aW9uID0gU0VDVF9PRkZfVEVYVDsKKyAgICAgIGJmZF9zZWN0aW9uID0gREJYX1RFWFRfU0VDVElPTiAob2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5fREFUQToKKyAgICAgIG1zX3R5cGUgPSBtc3RfZmlsZV9kYXRhOworCisgICAgICAvKiBDaGVjayBmb3IgX19EWU5BTUlDLCB3aGljaCBpcyB1c2VkIGJ5IFN1biBzaGFyZWQgbGlicmFyaWVzLiAKKwkgUmVjb3JkIGl0IGFzIGdsb2JhbCBldmVuIGlmIGl0J3MgbG9jYWwsIG5vdCBnbG9iYWwsIHNvCisJIGxvb2t1cF9taW5pbWFsX3N5bWJvbCBjYW4gZmluZCBpdC4gIFdlIGRvbid0IGNoZWNrIHN5bWJvbF9sZWFkaW5nX2NoYXIKKwkgYmVjYXVzZSBmb3IgU3VuT1M0IGl0IGFsd2F5cyBpcyAnXycuICAqLworICAgICAgaWYgKG5hbWVbOF0gPT0gJ0MnICYmIFNUUkVRICgiX19EWU5BTUlDIiwgbmFtZSkpCisJbXNfdHlwZSA9IG1zdF9kYXRhOworCisgICAgICAvKiBTYW1lIHdpdGggdmlydHVhbCBmdW5jdGlvbiB0YWJsZXMsIGJvdGggZ2xvYmFsIGFuZCBzdGF0aWMuICAqLworICAgICAgeworCWNoYXIgKnRlbXBzdHJpbmcgPSBuYW1lOworCWlmICh0ZW1wc3RyaW5nWzBdID09IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAob2JqZmlsZS0+b2JmZCkpCisJICArK3RlbXBzdHJpbmc7CisJaWYgKFZUQkxfUFJFRklYX1AgKCh0ZW1wc3RyaW5nKSkpCisJICBtc190eXBlID0gbXN0X2RhdGE7CisgICAgICB9CisgICAgICBzZWN0aW9uID0gU0VDVF9PRkZfREFUQTsKKyAgICAgIGJmZF9zZWN0aW9uID0gREJYX0RBVEFfU0VDVElPTiAob2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5fQlNTOgorICAgICAgbXNfdHlwZSA9IG1zdF9maWxlX2JzczsKKyAgICAgIHNlY3Rpb24gPSBTRUNUX09GRl9CU1M7CisgICAgICBiZmRfc2VjdGlvbiA9IERCWF9CU1NfU0VDVElPTiAob2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbXNfdHlwZSA9IG1zdF91bmtub3duOworICAgICAgc2VjdGlvbiA9IC0xOworICAgICAgYmZkX3NlY3Rpb24gPSBOVUxMOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoKG1zX3R5cGUgPT0gbXN0X2ZpbGVfdGV4dCB8fCBtc190eXBlID09IG1zdF90ZXh0KQorICAgICAgJiYgYWRkcmVzcyA8IGxvd2VzdF90ZXh0X2FkZHJlc3MpCisgICAgbG93ZXN0X3RleHRfYWRkcmVzcyA9IGFkZHJlc3M7CisKKyAgcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2xfYW5kX2luZm8KKyAgICAobmFtZSwgYWRkcmVzcywgbXNfdHlwZSwgTlVMTCwgc2VjdGlvbiwgYmZkX3NlY3Rpb24sIG9iamZpbGUpOworfQorDAorLyogU2NhbiBhbmQgYnVpbGQgcGFydGlhbCBzeW1ib2xzIGZvciBhIHN5bWJvbCBmaWxlLgorICAgV2UgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJ5IGEgY2FsbCB0byBkYnhfc3ltZmlsZV9pbml0LCB3aGljaCAKKyAgIHB1dCBhbGwgdGhlIHJlbGV2YW50IGluZm8gaW50byBhICJzdHJ1Y3QgZGJ4X3N5bWZpbGVfaW5mbyIsCisgICBodW5nIG9mZiB0aGUgb2JqZmlsZSBzdHJ1Y3R1cmUuCisKKyAgIFNFQ1RJT05fT0ZGU0VUUyBjb250YWlucyBvZmZzZXRzIHJlbGF0aXZlIHRvIHdoaWNoIHRoZSBzeW1ib2xzIGluIHRoZQorICAgdmFyaW91cyBzZWN0aW9ucyBhcmUgKGRlcGVuZGluZyB3aGVyZSB0aGUgc2VjdGlvbnMgd2VyZSBhY3R1YWxseSBsb2FkZWQpLgorICAgTUFJTkxJTkUgaXMgdHJ1ZSBpZiB3ZSBhcmUgcmVhZGluZyB0aGUgbWFpbiBzeW1ib2wKKyAgIHRhYmxlIChhcyBvcHBvc2VkIHRvIGEgc2hhcmVkIGxpYiBvciBkeW5hbWljYWxseSBsb2FkZWQgZmlsZSkuICAqLworCitzdGF0aWMgdm9pZAorZGJ4X3N5bWZpbGVfcmVhZCAob2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzLCBtYWlubGluZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKyAgICAgaW50IG1haW5saW5lOwkvKiBGSVhNRSBjb21tZW50cyBhYm92ZSAqLworeworICBiZmQgKnN5bV9iZmQ7CisgIGludCB2YWw7CisgIHN0cnVjdCBjbGVhbnVwICpiYWNrX3RvOworCisgIHZhbCA9IHN0cmxlbiAob2JqZmlsZS0+bmFtZSk7CisKKyAgc3ltX2JmZCA9IG9iamZpbGUtPm9iZmQ7CisKKyAgLyogLm8gYW5kIC5ubG0gZmlsZXMgYXJlIHJlbG9jYXRhYmxlcyB3aXRoIHRleHQsIGRhdGEgYW5kIGJzcyBzZWdzIGJhc2VkIGF0CisgICAgIDAuICBUaGlzIGZsYWcgZGlzYWJsZXMgc3BlY2lhbCAoU29sYXJpcyBzdGFicy1pbi1lbGYgb25seSkgZml4dXBzIGZvcgorICAgICBzeW1ib2xzIHdpdGggYSB2YWx1ZSBvZiAwLiAgKi8KKworICBzeW1maWxlX3JlbG9jYXRhYmxlID0gYmZkX2dldF9maWxlX2ZsYWdzIChzeW1fYmZkKSAmIEhBU19SRUxPQzsKKworICAvKiBUaGlzIGlzIHRydWUgZm9yIFNvbGFyaXMgKGFuZCBhbGwgb3RoZXIgc3lzdGVtcyB3aGljaCBwdXQgc3RhYnMKKyAgICAgaW4gc2VjdGlvbnMsIGhvcGVmdWxseSwgc2luY2UgaXQgd291bGQgYmUgc2lsbHkgdG8gZG8gdGhpbmdzCisgICAgIGRpZmZlcmVudGx5IGZyb20gU29sYXJpcyksIGFuZCBmYWxzZSBmb3IgU3VuT1M0IGFuZCBvdGhlciBhLm91dAorICAgICBmaWxlIGZvcm1hdHMuICAqLworICBibG9ja19hZGRyZXNzX2Z1bmN0aW9uX3JlbGF0aXZlID0KKyAgICAoKDAgPT0gc3RybmNtcCAoYmZkX2dldF90YXJnZXQgKHN5bV9iZmQpLCAiZWxmIiwgMykpCisgICAgIHx8ICgwID09IHN0cm5jbXAgKGJmZF9nZXRfdGFyZ2V0IChzeW1fYmZkKSwgInNvbSIsIDMpKQorICAgICB8fCAoMCA9PSBzdHJuY21wIChiZmRfZ2V0X3RhcmdldCAoc3ltX2JmZCksICJjb2ZmIiwgNCkpCisgICAgIHx8ICgwID09IHN0cm5jbXAgKGJmZF9nZXRfdGFyZ2V0IChzeW1fYmZkKSwgInBlIiwgMikpCisgICAgIHx8ICgwID09IHN0cm5jbXAgKGJmZF9nZXRfdGFyZ2V0IChzeW1fYmZkKSwgIm5sbSIsIDMpKSk7CisKKyAgdmFsID0gYmZkX3NlZWsgKHN5bV9iZmQsIERCWF9TWU1UQUJfT0ZGU0VUIChvYmpmaWxlKSwgU0VFS19TRVQpOworICBpZiAodmFsIDwgMCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lIChvYmpmaWxlLT5uYW1lKTsKKworICAvKiBJZiB3ZSBhcmUgcmVpbml0aWFsaXppbmcsIG9yIGlmIHdlIGhhdmUgbmV2ZXIgbG9hZGVkIHN5bXMgeWV0LCBpbml0ICovCisgIGlmIChtYWlubGluZQorICAgICAgfHwgb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLnNpemUgPT0gMAorICAgICAgfHwgb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLnNpemUgPT0gMCkKKyAgICBpbml0X3BzeW1ib2xfbGlzdCAob2JqZmlsZSwgREJYX1NZTUNPVU5UIChvYmpmaWxlKSk7CisKKyAgc3ltYm9sX3NpemUgPSBEQlhfU1lNQk9MX1NJWkUgKG9iamZpbGUpOworICBzeW1ib2xfdGFibGVfb2Zmc2V0ID0gREJYX1NZTVRBQl9PRkZTRVQgKG9iamZpbGUpOworCisgIGZyZWVfcGVuZGluZ19ibG9ja3MgKCk7CisgIGJhY2tfdG8gPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgcmVhbGx5X2ZyZWVfcGVuZGluZ3MsIDApOworCisgIGluaXRfbWluaW1hbF9zeW1ib2xfY29sbGVjdGlvbiAoKTsKKyAgbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGRpc2NhcmRfbWluaW1hbF9zeW1ib2xzLCAwKTsKKworICAvKiBOb3cgdGhhdCB0aGUgc3ltYm9sIHRhYmxlIGRhdGEgb2YgdGhlIGV4ZWN1dGFibGUgZmlsZSBhcmUgYWxsIGluIGNvcmUsCisgICAgIHByb2Nlc3MgdGhlbSBhbmQgZGVmaW5lIHN5bWJvbHMgYWNjb3JkaW5nbHkuICAqLworCisgIHJlYWRfZGJ4X3N5bXRhYiAoc2VjdGlvbl9vZmZzZXRzLCBvYmpmaWxlLAorCQkgICBEQlhfVEVYVF9BRERSIChvYmpmaWxlKSwKKwkJICAgREJYX1RFWFRfU0laRSAob2JqZmlsZSkpOworCisgIC8qIEFkZCB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KKworICByZWFkX2RieF9keW5hbWljX3N5bXRhYiAoc2VjdGlvbl9vZmZzZXRzLCBvYmpmaWxlKTsKKworICAvKiBJbnN0YWxsIGFueSBtaW5pbWFsIHN5bWJvbHMgdGhhdCBoYXZlIGJlZW4gY29sbGVjdGVkIGFzIHRoZSBjdXJyZW50CisgICAgIG1pbmltYWwgc3ltYm9scyBmb3IgdGhpcyBvYmpmaWxlLiAqLworCisgIGluc3RhbGxfbWluaW1hbF9zeW1ib2xzIChvYmpmaWxlKTsKKworICBkb19jbGVhbnVwcyAoYmFja190byk7Cit9CisKKy8qIEluaXRpYWxpemUgYW55dGhpbmcgdGhhdCBuZWVkcyBpbml0aWFsaXppbmcgd2hlbiBhIGNvbXBsZXRlbHkgbmV3CisgICBzeW1ib2wgZmlsZSBpcyBzcGVjaWZpZWQgKG5vdCBqdXN0IGFkZGluZyBzb21lIHN5bWJvbHMgZnJvbSBhbm90aGVyCisgICBmaWxlLCBlLmcuIGEgc2hhcmVkIGxpYnJhcnkpLiAgKi8KKworc3RhdGljIHZvaWQKK2RieF9uZXdfaW5pdCAoaWdub3JlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqaWdub3JlOworeworICBzdGFic3JlYWRfbmV3X2luaXQgKCk7CisgIGJ1aWxkc3ltX25ld19pbml0ICgpOworICBpbml0X2hlYWRlcl9maWxlcyAoKTsKK30KKworCisvKiBkYnhfc3ltZmlsZV9pbml0ICgpCisgICBpcyB0aGUgZGJ4LXNwZWNpZmljIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIHJlYWRpbmcgc3ltYm9scy4KKyAgIEl0IGlzIHBhc3NlZCBhIHN0cnVjdCBvYmpmaWxlIHdoaWNoIGNvbnRhaW5zLCBhbW9uZyBvdGhlciB0aGluZ3MsCisgICB0aGUgQkZEIGZvciB0aGUgZmlsZSB3aG9zZSBzeW1ib2xzIGFyZSBiZWluZyByZWFkLCBhbmQgYSBzbG90IGZvciBhIHBvaW50ZXIKKyAgIHRvICJwcml2YXRlIGRhdGEiIHdoaWNoIHdlIGZpbGwgd2l0aCBnb29kaWVzLgorCisgICBXZSByZWFkIHRoZSBzdHJpbmcgdGFibGUgaW50byBtYWxsb2MnZCBzcGFjZSBhbmQgc3Rhc2ggYSBwb2ludGVyIHRvIGl0LgorCisgICBTaW5jZSBCRkQgZG9lc24ndCBrbm93IGhvdyB0byByZWFkIGRlYnVnIHN5bWJvbHMgaW4gYSBmb3JtYXQtaW5kZXBlbmRlbnQKKyAgIHdheSAoYW5kIG1heSBuZXZlciBkbyBzby4uLiksIHdlIGhhdmUgdG8gZG8gaXQgb3Vyc2VsdmVzLiAgV2Ugd2lsbCBuZXZlcgorICAgYmUgY2FsbGVkIHVubGVzcyB0aGlzIGlzIGFuIGEub3V0IChvciB2ZXJ5IHNpbWlsYXIpIGZpbGUuIAorICAgRklYTUUsIHRoZXJlIHNob3VsZCBiZSBhIGNsZWFuZXIgcGVlcGhvbGUgaW50byB0aGUgQkZEIGVudmlyb25tZW50IGhlcmUuICAqLworCisjZGVmaW5lIERCWF9TVFJJTkdUQUJfU0laRV9TSVpFIHNpemVvZihsb25nKSAgIC8qIEZJWE1FICovCisKK3N0YXRpYyB2b2lkCitkYnhfc3ltZmlsZV9pbml0IChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaW50IHZhbDsKKyAgYmZkICpzeW1fYmZkID0gb2JqZmlsZS0+b2JmZDsKKyAgY2hhciAqbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKHN5bV9iZmQpOworICBhc2VjdGlvbiAqdGV4dF9zZWN0OworICB1bnNpZ25lZCBjaGFyIHNpemVfdGVtcFtEQlhfU1RSSU5HVEFCX1NJWkVfU0laRV07CisKKyAgLyogQWxsb2NhdGUgc3RydWN0IHRvIGtlZXAgdHJhY2sgb2YgdGhlIHN5bWZpbGUgKi8KKyAgb2JqZmlsZS0+c3ltX3N0YWJfaW5mbyA9IChzdHJ1Y3QgZGJ4X3N5bWZpbGVfaW5mbyAqKQorICAgIHhtbWFsbG9jIChvYmpmaWxlIC0+IG1kLCBzaXplb2YgKHN0cnVjdCBkYnhfc3ltZmlsZV9pbmZvKSk7CisgIG1lbXNldCAoKFBUUikgb2JqZmlsZS0+c3ltX3N0YWJfaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3QgZGJ4X3N5bWZpbGVfaW5mbykpOworCisgIERCWF9URVhUX1NFQ1RJT04gKG9iamZpbGUpID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN5bV9iZmQsICIudGV4dCIpOworICBEQlhfREFUQV9TRUNUSU9OIChvYmpmaWxlKSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzeW1fYmZkLCAiLmRhdGEiKTsKKyAgREJYX0JTU19TRUNUSU9OIChvYmpmaWxlKSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzeW1fYmZkLCAiLmJzcyIpOworCisgIC8qIEZJWE1FIFBPS0lORyBJTlNJREUgQkZEIERBVEEgU1RSVUNUVVJFUyAqLworI2RlZmluZQlTVFJJTkdfVEFCTEVfT0ZGU0VUCShzeW1fYmZkLT5vcmlnaW4gKyBvYmpfc3RyX2ZpbGVwb3MgKHN5bV9iZmQpKQorI2RlZmluZQlTWU1CT0xfVEFCTEVfT0ZGU0VUCShzeW1fYmZkLT5vcmlnaW4gKyBvYmpfc3ltX2ZpbGVwb3MgKHN5bV9iZmQpKQorCisgIC8qIEZJWE1FIFBPS0lORyBJTlNJREUgQkZEIERBVEEgU1RSVUNUVVJFUyAqLworCisgIERCWF9TWU1GSUxFX0lORk8gKG9iamZpbGUpLT5zdGFiX3NlY3Rpb25faW5mbyA9IE5VTEw7CisgIAorICB0ZXh0X3NlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3ltX2JmZCwgIi50ZXh0Iik7CisgIGlmICghdGV4dF9zZWN0KQorICAgIGVycm9yICgiQ2FuJ3QgZmluZCAudGV4dCBzZWN0aW9uIGluIHN5bWJvbCBmaWxlIik7CisgIERCWF9URVhUX0FERFIgKG9iamZpbGUpID0gYmZkX3NlY3Rpb25fdm1hIChzeW1fYmZkLCB0ZXh0X3NlY3QpOworICBEQlhfVEVYVF9TSVpFIChvYmpmaWxlKSA9IGJmZF9zZWN0aW9uX3NpemUgKHN5bV9iZmQsIHRleHRfc2VjdCk7CisKKyAgREJYX1NZTUJPTF9TSVpFIChvYmpmaWxlKSA9IG9ial9zeW1ib2xfZW50cnlfc2l6ZSAoc3ltX2JmZCk7CisgIERCWF9TWU1DT1VOVCAob2JqZmlsZSkgPSBiZmRfZ2V0X3N5bWNvdW50IChzeW1fYmZkKTsKKyAgREJYX1NZTVRBQl9PRkZTRVQgKG9iamZpbGUpID0gU1lNQk9MX1RBQkxFX09GRlNFVDsKKworICAvKiBSZWFkIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN0YXNoIGl0IGF3YXkgaW4gdGhlIHBzeW1ib2xfb2JzdGFjay4gIEl0IGlzCisgICAgIG9ubHkgbmVlZGVkIGFzIGxvbmcgYXMgd2UgbmVlZCB0byBleHBhbmQgcHN5bWJvbHMgaW50byBmdWxsIHN5bWJvbHMsCisgICAgIHNvIHdoZW4gd2UgYmxvdyBhd2F5IHRoZSBwc3ltYm9sIHRoZSBzdHJpbmcgdGFibGUgZ29lcyBhd2F5IGFzIHdlbGwuCisgICAgIE5vdGUgdGhhdCBnZGIgdXNlZCB0byB1c2UgdGhlIHJlc3VsdHMgb2YgYXR0ZW1wdGluZyB0byBtYWxsb2MgdGhlCisgICAgIHN0cmluZyB0YWJsZSwgYmFzZWQgb24gdGhlIHNpemUgaXQgcmVhZCwgYXMgYSBmb3JtIG9mIHNhbml0eSBjaGVjaworICAgICBmb3IgYm90Y2hlZCBieXRlIHN3YXBwaW5nLCBvbiB0aGUgdGhlb3J5IHRoYXQgYSBieXRlIHN3YXBwZWQgc3RyaW5nCisgICAgIHRhYmxlIHNpemUgd291bGQgYmUgc28gdG90YWxseSBib2d1cyB0aGF0IHRoZSBtYWxsb2Mgd291bGQgZmFpbC4gIE5vdworICAgICB0aGF0IHdlIHB1dCBpbiBvbiB0aGUgcHN5bWJvbF9vYnN0YWNrLCB3ZSBjYW4ndCBkbyB0aGlzIHNpbmNlIGdkYiBnZXRzCisgICAgIGEgZmF0YWwgZXJyb3IgKG91dCBvZiB2aXJ0dWFsIG1lbW9yeSkgaWYgdGhlIHNpemUgaXMgYm9ndXMuICBXZSBjYW4KKyAgICAgaG93ZXZlciBhdCBsZWFzdCBjaGVjayB0byBzZWUgaWYgdGhlIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBzaXplIG9mCisgICAgIHRoZSBzaXplIGZpZWxkIGl0c2VsZiwgb3IgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGVudGlyZSBmaWxlLgorICAgICBOb3RlIHRoYXQgYWxsIHZhbGlkIHN0cmluZyB0YWJsZXMgaGF2ZSBhIHNpemUgZ3JlYXRlciB0aGFuIHplcm8sIHNpbmNlCisgICAgIHRoZSBieXRlcyB1c2VkIHRvIGhvbGQgdGhlIHNpemUgYXJlIGluY2x1ZGVkIGluIHRoZSBjb3VudC4gKi8KKworICBpZiAoU1RSSU5HX1RBQkxFX09GRlNFVCA9PSAwKQorICAgIHsKKyAgICAgIC8qIEl0IGFwcGVhcnMgdGhhdCB3aXRoIHRoZSBleGlzdGluZyBiZmQgY29kZSwgU1RSSU5HX1RBQkxFX09GRlNFVAorCSB3aWxsIG5ldmVyIGJlIHplcm8sIGV2ZW4gd2hlbiB0aGVyZSBpcyBubyBzdHJpbmcgdGFibGUuICBUaGlzCisJIHdvdWxkIGFwcGVhciB0byBiZSBhIGJ1ZyBpbiBiZmQuICovCisgICAgICBEQlhfU1RSSU5HVEFCX1NJWkUgKG9iamZpbGUpID0gMDsKKyAgICAgIERCWF9TVFJJTkdUQUIgKG9iamZpbGUpID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB2YWwgPSBiZmRfc2VlayAoc3ltX2JmZCwgU1RSSU5HX1RBQkxFX09GRlNFVCwgU0VFS19TRVQpOworICAgICAgaWYgKHZhbCA8IDApCisJcGVycm9yX3dpdGhfbmFtZSAobmFtZSk7CisgICAgICAKKyAgICAgIG1lbXNldCAoKFBUUikgc2l6ZV90ZW1wLCAwLCBzaXplb2YgKHNpemVfdGVtcCkpOworICAgICAgdmFsID0gYmZkX3JlYWQgKChQVFIpIHNpemVfdGVtcCwgc2l6ZW9mIChzaXplX3RlbXApLCAxLCBzeW1fYmZkKTsKKyAgICAgIGlmICh2YWwgPCAwKQorCXsKKwkgIHBlcnJvcl93aXRoX25hbWUgKG5hbWUpOworCX0KKyAgICAgIGVsc2UgaWYgKHZhbCA9PSAwKQorCXsKKwkgIC8qIFdpdGggdGhlIGV4aXN0aW5nIGJmZCBjb2RlLCBTVFJJTkdfVEFCTEVfT0ZGU0VUIHdpbGwgYmUgc2V0IHRvCisJICAgICBFT0YgaWYgdGhlcmUgaXMgbm8gc3RyaW5nIHRhYmxlLCBhbmQgYXR0ZW1wdGluZyB0byByZWFkIHRoZSBzaXplCisJICAgICBmcm9tIEVPRiB3aWxsIHJlYWQgemVybyBieXRlcy4gKi8KKwkgIERCWF9TVFJJTkdUQUJfU0laRSAob2JqZmlsZSkgPSAwOworCSAgREJYX1NUUklOR1RBQiAob2JqZmlsZSkgPSBOVUxMOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBSZWFkIHNvbWUgZGF0YSB0aGF0IHdvdWxkIGFwcGVhciB0byBiZSB0aGUgc3RyaW5nIHRhYmxlIHNpemUuCisJICAgICBJZiB0aGVyZSByZWFsbHkgaXMgYSBzdHJpbmcgdGFibGUsIHRoZW4gaXQgaXMgcHJvYmFibHkgdGhlIHJpZ2h0CisJICAgICBzaXplLiAgQnl0ZXN3YXAgaWYgbmVjZXNzYXJ5IGFuZCB2YWxpZGF0ZSB0aGUgc2l6ZS4gIE5vdGUgdGhhdAorCSAgICAgdGhlIG1pbmltdW0gaXMgREJYX1NUUklOR1RBQl9TSVpFX1NJWkUuICBJZiB3ZSBqdXN0IHJlYWQgc29tZQorCSAgICAgcmFuZG9tIGRhdGEgdGhhdCBoYXBwZW5lZCB0byBiZSBhdCBTVFJJTkdfVEFCTEVfT0ZGU0VULCBiZWNhdXNlCisJICAgICBiZmQgY2FuJ3QgdGVsbCB1cyB0aGVyZSBpcyBubyBzdHJpbmcgdGFibGUsIHRoZSBzYW5pdHkgY2hlY2tzIG1heQorCSAgICAgb3IgbWF5IG5vdCBjYXRjaCB0aGlzLiAqLworCSAgREJYX1NUUklOR1RBQl9TSVpFIChvYmpmaWxlKSA9IGJmZF9oX2dldF8zMiAoc3ltX2JmZCwgc2l6ZV90ZW1wKTsKKwkgIAorCSAgaWYgKERCWF9TVFJJTkdUQUJfU0laRSAob2JqZmlsZSkgPCBzaXplb2YgKHNpemVfdGVtcCkKKwkgICAgICB8fCBEQlhfU1RSSU5HVEFCX1NJWkUgKG9iamZpbGUpID4gYmZkX2dldF9zaXplIChzeW1fYmZkKSkKKwkgICAgZXJyb3IgKCJyaWRpY3Vsb3VzIHN0cmluZyB0YWJsZSBzaXplICglZCBieXRlcykuIiwKKwkJICAgREJYX1NUUklOR1RBQl9TSVpFIChvYmpmaWxlKSk7CisJICAKKwkgIERCWF9TVFJJTkdUQUIgKG9iamZpbGUpID0KKwkgICAgKGNoYXIgKikgb2JzdGFja19hbGxvYyAoJm9iamZpbGUgLT4gcHN5bWJvbF9vYnN0YWNrLAorCQkJCSAgICBEQlhfU1RSSU5HVEFCX1NJWkUgKG9iamZpbGUpKTsKKwkgIE9CSlNUQVQgKG9iamZpbGUsIHN6X3N0cnRhYiArPSBEQlhfU1RSSU5HVEFCX1NJWkUgKG9iamZpbGUpKTsKKwkgIAorCSAgLyogTm93IHJlYWQgaW4gdGhlIHN0cmluZyB0YWJsZSBpbiBvbmUgYmlnIGd1bHAuICAqLworCSAgCisJICB2YWwgPSBiZmRfc2VlayAoc3ltX2JmZCwgU1RSSU5HX1RBQkxFX09GRlNFVCwgU0VFS19TRVQpOworCSAgaWYgKHZhbCA8IDApCisJICAgIHBlcnJvcl93aXRoX25hbWUgKG5hbWUpOworCSAgdmFsID0gYmZkX3JlYWQgKERCWF9TVFJJTkdUQUIgKG9iamZpbGUpLCBEQlhfU1RSSU5HVEFCX1NJWkUgKG9iamZpbGUpLCAxLAorCQkJICBzeW1fYmZkKTsKKwkgIGlmICh2YWwgIT0gREJYX1NUUklOR1RBQl9TSVpFIChvYmpmaWxlKSkKKwkgICAgcGVycm9yX3dpdGhfbmFtZSAobmFtZSk7CisJfQorICAgIH0KK30KKworLyogUGVyZm9ybSBhbnkgbG9jYWwgY2xlYW51cHMgcmVxdWlyZWQgd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIGEgcGFydGljdWxhcgorICAgb2JqZmlsZS4gIEkuRSwgd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGRpc2NhcmRpbmcgYWxsIHN5bWJvbCBpbmZvcm1hdGlvbgorICAgZm9yIGFuIG9iamZpbGUsIGZyZWVpbmcgdXAgYWxsIG1lbW9yeSBoZWxkIGZvciBpdCwgYW5kIHVubGlua2luZyB0aGUKKyAgIG9iamZpbGUgc3RydWN0IGZyb20gdGhlIGdsb2JhbCBsaXN0IG9mIGtub3duIG9iamZpbGVzLiAqLworCitzdGF0aWMgdm9pZAorZGJ4X3N5bWZpbGVfZmluaXNoIChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaWYgKG9iamZpbGUtPnN5bV9zdGFiX2luZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoSEVBREVSX0ZJTEVTIChvYmpmaWxlKSAhPSBOVUxMKQorCXsKKwkgIHJlZ2lzdGVyIGludCBpID0gTl9IRUFERVJfRklMRVMgKG9iamZpbGUpOworCSAgcmVnaXN0ZXIgc3RydWN0IGhlYWRlcl9maWxlICpoZmlsZXMgPSBIRUFERVJfRklMRVMgKG9iamZpbGUpOworCisJICB3aGlsZSAoLS1pID49IDApCisJICAgIHsKKwkgICAgICBmcmVlIChoZmlsZXMgW2ldLm5hbWUpOworCSAgICAgIGZyZWUgKGhmaWxlcyBbaV0udmVjdG9yKTsKKwkgICAgfQorCSAgZnJlZSAoKFBUUikgaGZpbGVzKTsKKwl9CisgICAgICBtZnJlZSAob2JqZmlsZSAtPiBtZCwgb2JqZmlsZS0+c3ltX3N0YWJfaW5mbyk7CisgICAgfQorICBmcmVlX2hlYWRlcl9maWxlcyAoKTsKK30KKworDAorLyogQnVmZmVyIGZvciByZWFkaW5nIHRoZSBzeW1ib2wgdGFibGUgZW50cmllcy4gICovCitzdGF0aWMgc3RydWN0IGV4dGVybmFsX25saXN0IHN5bWJ1Zls0MDk2XTsKK3N0YXRpYyBpbnQgc3ltYnVmX2lkeDsKK3N0YXRpYyBpbnQgc3ltYnVmX2VuZDsKKworLyogY29udF9lbGVtIGlzIHVzZWQgZm9yIGNvbnRpbnVpbmcgaW5mb3JtYXRpb24gaW4gY2Zyb250LgorICAgSXQgc2F2ZXMgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggdHlwZXMgbmVlZCB0byBiZSBmaXhlZCB1cCBhbmQgCisgICBjb21wbGV0ZWQgYWZ0ZXIgYWxsIHRoZSBzdGFicyBhcmUgcmVhZC4gICovCitzdHJ1Y3QgY29udF9lbGVtIAorICB7CisgICAgLyogc3ltIGFuZCBzdGFic3N0cmluZyBmb3IgY29udGludWluZyBpbmZvcm1hdGlvbiBpbiBjZnJvbnQgKi8KKyAgICBzdHJ1Y3Qgc3ltYm9sICogc3ltOworICAgIGNoYXIgKiBzdGFiczsKKyAgICAvKiBzdGF0ZSBkZXBlbmRhbmNpZXMgKHN0YXRpY3MgdGhhdCBtdXN0IGJlIHByZXNlcnZlZCkgKi8KKyAgICBpbnQgc3ltX2lkeDsKKyAgICBpbnQgc3ltX2VuZDsKKyAgICBpbnQgc3ltbnVtOworICAgIGludCAoKmZ1bmMpIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIHN0cnVjdCBzeW1ib2wgKiwgY2hhciAqKSk7CisgICAgLyogb3RoZXIgc3RhdGUgZGVwZW5kYW5jaWVzIGluY2x1ZGU6CisgICAgICAgKGFzc3VtcHRpb24gaXMgdGhhdCB0aGVzZSB3aWxsIG5vdCBjaGFuZ2Ugc2luY2UgcHJvY2Vzc19ub3cgRklYTUUhISkKKyAgICAgICAgc3RyaW5ndGFiX2dsb2JhbAorICAgICAgICBuX3N0YWJzCisgICAgICAgIG9iamZpbGUKKyAgICAgICAgc3ltZmlsZV9iZmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgY29udF9lbGVtICpjb250X2xpc3QgPSAwOworc3RhdGljIGludCBjb250X2xpbWl0ID0gMDsKK3N0YXRpYyBpbnQgY29udF9jb3VudCA9IDA7CisKKy8qIEFycmFuZ2UgZm9yIGZ1bmN0aW9uIEYgdG8gYmUgY2FsbGVkIHdpdGggYXJndW1lbnRzIFNZTSBhbmQgUCBsYXRlcgorICAgaW4gdGhlIHN0YWJzIHJlYWRpbmcgcHJvY2Vzcy4gICovCit2b2lkIAorcHJvY2Vzc19sYXRlciAoc3ltLCBwLCBmKQorICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIGNoYXIgKnA7CisgIGludCAoKmYpIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIHN0cnVjdCBzeW1ib2wgKiwgY2hhciAqKSk7Cit7CisKKyAgLyogQWxsb2NhdGUgbW9yZSBzcGFjZSBmb3IgdGhlIGRlZmVycmVkIGxpc3QuICAqLworICBpZiAoY29udF9jb3VudCA+PSBjb250X2xpbWl0IC0gMSkKKyAgICB7CisgICAgICBjb250X2xpbWl0ICs9IDMyOwkvKiBjaHVuayBzaXplICovCisKKyAgICAgIGNvbnRfbGlzdAorCT0gKHN0cnVjdCBjb250X2VsZW0gKikgeHJlYWxsb2MgKGNvbnRfbGlzdCwgCisJCQkJCSAgKGNvbnRfbGltaXQKKwkJCQkJICAgKiBzaXplb2YgKHN0cnVjdCBjb250X2VsZW0pKSk7CisgICAgICBpZiAoIWNvbnRfbGlzdCkKKyAgICAgICAgZXJyb3IgKCJWaXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWRcbiIpOworICAgIH0KKworICAvKiBTYXZlIHN0YXRlIHZhcmlhYmxlcyBzbyB3ZSBjYW4gcHJvY2VzcyB0aGVzZSBzdGFicyBsYXRlci4gICovCisgIGNvbnRfbGlzdFtjb250X2NvdW50XS5zeW1faWR4ID0gc3ltYnVmX2lkeDsKKyAgY29udF9saXN0W2NvbnRfY291bnRdLnN5bV9lbmQgPSBzeW1idWZfZW5kOworICBjb250X2xpc3RbY29udF9jb3VudF0uc3ltbnVtID0gc3ltbnVtOworICBjb250X2xpc3RbY29udF9jb3VudF0uc3ltID0gc3ltOworICBjb250X2xpc3RbY29udF9jb3VudF0uc3RhYnMgPSBwOworICBjb250X2xpc3RbY29udF9jb3VudF0uZnVuYyA9IGY7CisgIGNvbnRfY291bnQrKzsKK30KKworLyogQ2FsbCBkZWZlcnJlZCBmdW50aW9ucyBpbiBDT05UX0xJU1QuICAqLworCitzdGF0aWMgdm9pZCAKK3Byb2Nlc3Nfbm93IChvYmpmaWxlKSAKKyAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIGludCBpOworICBpbnQgc2F2ZV9zeW1idWZfaWR4OworICBpbnQgc2F2ZV9zeW1idWZfZW5kOworICBpbnQgc2F2ZV9zeW1udW07CisgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgY2hhciAqc3RhYnM7CisgIGludCBlcnI7CisgIGludCAoKmZ1bmMpIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIHN0cnVjdCBzeW1ib2wgKiwgY2hhciAqKSk7CisKKyAgLyogU2F2ZSB0aGUgc3RhdGUgb2Ygb3VyIGNhbGxlciwgd2UnbGwgd2FudCB0byByZXN0b3JlIGl0IGJlZm9yZQorICAgICByZXR1cm5pbmcuICAqLworICBzYXZlX3N5bWJ1Zl9pZHggPSBzeW1idWZfaWR4OworICBzYXZlX3N5bWJ1Zl9lbmQgPSBzeW1idWZfZW5kOworICBzYXZlX3N5bW51bSA9IHN5bW51bTsKKworICAvKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSBkZWZlcnJlZCBzdGFicy4gICovCisgIGZvciAoaSA9IDA7IGkgPCBjb250X2NvdW50OyBpKyspCisgICAgeworICAgICAgLyogUmVzdG9yZSB0aGUgc3RhdGUgZm9yIHRoaXMgZGVmZXJyZWQgc3RhYi4gICovCisgICAgICBzeW1idWZfaWR4ID0gY29udF9saXN0W2ldLnN5bV9pZHg7CisgICAgICBzeW1idWZfZW5kID0gY29udF9saXN0W2ldLnN5bV9lbmQ7ICAKKyAgICAgIHN5bW51bSA9IGNvbnRfbGlzdFtpXS5zeW1udW07ICAKKyAgICAgIHN5bSA9IGNvbnRfbGlzdFtpXS5zeW07CisgICAgICBzdGFicyA9IGNvbnRfbGlzdFtpXS5zdGFiczsKKyAgICAgIGZ1bmMgPSBjb250X2xpc3RbaV0uZnVuYzsKKworICAgICAgLyogQ2FsbCB0aGUgZnVuY3Rpb24gdG8gaGFuZGxlIHRoaXMgZGVmZXJyZCBzdGFiLiAgKi8KKyAgICAgIGVyciA9ICgqZnVuYykgKG9iamZpbGUsIHN5bSwgc3RhYnMpOworICAgICAgaWYgKGVycikKKwllcnJvciAoIkludGVybmFsIGVycm9yOiB1bmFibGUgdG8gcmVzb2x2ZSBzdGFiLlxuIik7CisgICAgfQorCisgIC8qIFJlc3RvcmUgb3VyIGNhbGxlcidzIHN0YXRlLiAgKi8KKyAgc3ltYnVmX2lkeCA9IHNhdmVfc3ltYnVmX2lkeDsKKyAgc3ltYnVmX2VuZCA9IHNhdmVfc3ltYnVmX2VuZDsKKyAgc3ltbnVtID0gc2F2ZV9zeW1udW07CisgIGNvbnRfY291bnQgPSAwOworfQorCisKKy8qIE5hbWUgb2YgbGFzdCBmdW5jdGlvbiBlbmNvdW50ZXJlZC4gIFVzZWQgaW4gU29sYXJpcyB0byBhcHByb3hpbWF0ZQorICAgb2JqZWN0IGZpbGUgYm91bmRhcmllcy4gICovCitzdGF0aWMgY2hhciAqbGFzdF9mdW5jdGlvbl9uYW1lOworCisvKiBUaGUgYWRkcmVzcyBpbiBtZW1vcnkgb2YgdGhlIHN0cmluZyB0YWJsZSBvZiB0aGUgb2JqZWN0IGZpbGUgd2UgYXJlCisgICByZWFkaW5nICh3aGljaCBtaWdodCBub3QgYmUgdGhlICJtYWluIiBvYmplY3QgZmlsZSwgYnV0IG1pZ2h0IGJlIGEKKyAgIHNoYXJlZCBsaWJyYXJ5IG9yIHNvbWUgb3RoZXIgZHluYW1pY2FsbHkgbG9hZGVkIHRoaW5nKS4gIFRoaXMgaXMKKyAgIHNldCBieSByZWFkX2RieF9zeW10YWIgd2hlbiBidWlsZGluZyBwc3ltdGFicywgYW5kIGJ5CisgICByZWFkX29maWxlX3N5bXRhYiB3aGVuIGJ1aWxkaW5nIHN5bXRhYnMsIGFuZCBpcyB1c2VkIG9ubHkgYnkKKyAgIG5leHRfc3ltYm9sX3RleHQuICBGSVhNRTogSWYgdGhhdCBpcyB0cnVlLCB3ZSBkb24ndCBuZWVkIGl0IHdoZW4KKyAgIGJ1aWxkaW5nIHBzeW10YWJzLCByaWdodD8gICovCitzdGF0aWMgY2hhciAqc3RyaW5ndGFiX2dsb2JhbDsKKworLyogVGhlc2UgdmFyaWFibGVzIGFyZSB1c2VkIHRvIGNvbnRyb2wgZmlsbF9zeW1idWYgd2hlbiB0aGUgc3RhYnMKKyAgIHN5bWJvbHMgYXJlIG5vdCBjb250aWd1b3VzIChhcyBtYXkgYmUgdGhlIGNhc2Ugd2hlbiBhIENPRkYgZmlsZSBpcworICAgbGlua2VkIHVzaW5nIC0tc3BsaXQtYnktcmVsb2MpLiAgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2xpc3QgKnN5bWJ1Zl9zZWN0aW9uczsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3ltYnVmX2xlZnQ7CitzdGF0aWMgdW5zaWduZWQgaW50IHN5bWJ1Zl9yZWFkOworCisvKiBSZWZpbGwgdGhlIHN5bWJvbCB0YWJsZSBpbnB1dCBidWZmZXIKKyAgIGFuZCBzZXQgdGhlIHZhcmlhYmxlcyB0aGF0IGNvbnRyb2wgZmV0Y2hpbmcgZW50cmllcyBmcm9tIGl0LgorICAgUmVwb3J0cyBhbiBlcnJvciBpZiBubyBkYXRhIGF2YWlsYWJsZS4KKyAgIFRoaXMgZnVuY3Rpb24gY2FuIHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBzeW1ib2wgdGFibGUKKyAgIChpbnRvIHRoZSBzdHJpbmcgdGFibGUpIGJ1dCB0aGlzIGRvZXMgbm8gaGFybS4gICovCisKK3N0YXRpYyB2b2lkCitmaWxsX3N5bWJ1ZiAoc3ltX2JmZCkKKyAgICAgYmZkICpzeW1fYmZkOworeworICB1bnNpZ25lZCBpbnQgY291bnQ7CisgIGludCBuYnl0ZXM7CisKKyAgaWYgKHN5bWJ1Zl9zZWN0aW9ucyA9PSBOVUxMKQorICAgIGNvdW50ID0gc2l6ZW9mIChzeW1idWYpOworICBlbHNlCisgICAgeworICAgICAgaWYgKHN5bWJ1Zl9sZWZ0IDw9IDApCisJeworCSAgZmlsZV9wdHIgZmlsZXBvcyA9IHN5bWJ1Zl9zZWN0aW9ucy0+c2VjdGlvbi0+ZmlsZXBvczsKKwkgIGlmIChiZmRfc2VlayAoc3ltX2JmZCwgZmlsZXBvcywgU0VFS19TRVQpICE9IDApCisJICAgIHBlcnJvcl93aXRoX25hbWUgKGJmZF9nZXRfZmlsZW5hbWUgKHN5bV9iZmQpKTsKKwkgIHN5bWJ1Zl9sZWZ0ID0gYmZkX3NlY3Rpb25fc2l6ZSAoc3ltX2JmZCwgc3ltYnVmX3NlY3Rpb25zLT5zZWN0aW9uKTsKKwkgIHN5bWJvbF90YWJsZV9vZmZzZXQgPSBmaWxlcG9zIC0gc3ltYnVmX3JlYWQ7CisJICBzeW1idWZfc2VjdGlvbnMgPSBzeW1idWZfc2VjdGlvbnMtPm5leHQ7CisJfQorCisgICAgICBjb3VudCA9IHN5bWJ1Zl9sZWZ0OworICAgICAgaWYgKGNvdW50ID4gc2l6ZW9mIChzeW1idWYpKQorCWNvdW50ID0gc2l6ZW9mIChzeW1idWYpOworICAgIH0KKworICBuYnl0ZXMgPSBiZmRfcmVhZCAoKFBUUilzeW1idWYsIGNvdW50LCAxLCBzeW1fYmZkKTsKKyAgaWYgKG5ieXRlcyA8IDApCisgICAgcGVycm9yX3dpdGhfbmFtZSAoYmZkX2dldF9maWxlbmFtZSAoc3ltX2JmZCkpOworICBlbHNlIGlmIChuYnl0ZXMgPT0gMCkKKyAgICBlcnJvciAoIlByZW1hdHVyZSBlbmQgb2YgZmlsZSByZWFkaW5nIHN5bWJvbCB0YWJsZSIpOworICBzeW1idWZfZW5kID0gbmJ5dGVzIC8gc3ltYm9sX3NpemU7CisgIHN5bWJ1Zl9pZHggPSAwOworICBzeW1idWZfbGVmdCAtPSBuYnl0ZXM7CisgIHN5bWJ1Zl9yZWFkICs9IG5ieXRlczsKK30KKworI2RlZmluZSBTV0FQX1NZTUJPTChzeW1wLCBhYmZkKSBcCisgIHsgXAorICAgIChzeW1wKS0+bl9zdHJ4ID0gYmZkX2hfZ2V0XzMyKGFiZmQsCQkJXAorCQkJCSh1bnNpZ25lZCBjaGFyICopJihzeW1wKS0+bl9zdHJ4KTsJXAorICAgIChzeW1wKS0+bl9kZXNjID0gYmZkX2hfZ2V0XzE2IChhYmZkLAkJCVwKKwkJCQkodW5zaWduZWQgY2hhciAqKSYoc3ltcCktPm5fZGVzYyk7ICAJXAorICAgIChzeW1wKS0+bl92YWx1ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwJCQlcCisJCQkJKHVuc2lnbmVkIGNoYXIgKikmKHN5bXApLT5uX3ZhbHVlKTsgCVwKKyAgfQorCisjZGVmaW5lIElOVEVSTkFMSVpFX1NZTUJPTChpbnRlcm4sIGV4dGVybiwgYWJmZCkJCQlcCisgIHsJCQkJCQkJCQlcCisgICAgKGludGVybikubl90eXBlID0gYmZkX2hfZ2V0XzggKGFiZmQsIChleHRlcm4pLT5lX3R5cGUpOwkJXAorICAgIChpbnRlcm4pLm5fc3RyeCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGV4dGVybiktPmVfc3RyeCk7CQlcCisgICAgKGludGVybikubl9kZXNjID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoZXh0ZXJuKS0+ZV9kZXNjKTsgIAkJXAorICAgIChpbnRlcm4pLm5fdmFsdWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChleHRlcm4pLT5lX3ZhbHVlKTsJCVwKKyAgfQorCisvKiBJbnZhcmlhbnQ6IFRoZSBzeW1ib2wgcG9pbnRlZCB0byBieSBzeW1idWZfaWR4IGlzIHRoZSBmaXJzdCBvbmUKKyAgIHRoYXQgaGFzbid0IGJlZW4gc3dhcHBlZC4gIFN3YXAgdGhlIHN5bWJvbCBhdCB0aGUgc2FtZSB0aW1lCisgICB0aGF0IHN5bWJ1Zl9pZHggaXMgaW5jcmVtZW50ZWQuICAqLworCisvKiBkYnggYWxsb3dzIHRoZSB0ZXh0IG9mIGEgc3ltYm9sIG5hbWUgdG8gYmUgY29udGludWVkIGludG8gdGhlCisgICBuZXh0IHN5bWJvbCBuYW1lISAgV2hlbiBzdWNoIGEgY29udGludWF0aW9uIGlzIGVuY291bnRlcmVkCisgICAoYSBcIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQgb2YgYSBuYW1lKQorICAgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGdldCB0aGUgY29udGludWF0aW9uLiAgKi8KKworc3RhdGljIGNoYXIgKgorZGJ4X25leHRfc3ltYm9sX3RleHQgKG9iamZpbGUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBzdHJ1Y3QgaW50ZXJuYWxfbmxpc3Qgbmxpc3Q7CisKKyAgaWYgKHN5bWJ1Zl9pZHggPT0gc3ltYnVmX2VuZCkKKyAgICBmaWxsX3N5bWJ1ZiAoc3ltZmlsZV9iZmQpOworCisgIHN5bW51bSsrOworICBJTlRFUk5BTElaRV9TWU1CT0wobmxpc3QsICZzeW1idWZbc3ltYnVmX2lkeF0sIHN5bWZpbGVfYmZkKTsKKyAgT0JKU1RBVCAob2JqZmlsZSwgbl9zdGFicysrKTsKKworICBzeW1idWZfaWR4Kys7CisKKyAgcmV0dXJuIG5saXN0Lm5fc3RyeCArIHN0cmluZ3RhYl9nbG9iYWwgKyBmaWxlX3N0cmluZ190YWJsZV9vZmZzZXQ7Cit9CisMCisvKiBJbml0aWFsaXplIHRoZSBsaXN0IG9mIGJpbmNscyB0byBjb250YWluIG5vbmUgYW5kIGhhdmUgc29tZQorICAgYWxsb2NhdGVkLiAgKi8KKworc3RhdGljIHZvaWQKK2luaXRfYmluY2xfbGlzdCAobnVtYmVyLCBvYmpmaWxlKQorICAgICBpbnQgbnVtYmVyOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgYmluY2xzX2FsbG9jYXRlZCA9IG51bWJlcjsKKyAgbmV4dF9iaW5jbCA9IGJpbmNsX2xpc3QgPSAoc3RydWN0IGhlYWRlcl9maWxlX2xvY2F0aW9uICopCisgICAgeG1tYWxsb2MgKG9iamZpbGUgLT4gbWQsIGJpbmNsc19hbGxvY2F0ZWQgKiBzaXplb2Yoc3RydWN0IGhlYWRlcl9maWxlX2xvY2F0aW9uKSk7Cit9CisKKy8qIEFkZCBhIGJpbmNsIHRvIHRoZSBsaXN0LiAgKi8KKworc3RhdGljIHZvaWQKK2FkZF9iaW5jbF90b19saXN0IChwc3QsIG5hbWUsIGluc3RhbmNlKQorICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdDsKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgaW50IGluc3RhbmNlOworeworICBpZiAobmV4dF9iaW5jbCA+PSBiaW5jbF9saXN0ICsgYmluY2xzX2FsbG9jYXRlZCkKKyAgICB7CisgICAgICBpbnQgb2Zmc2V0ID0gbmV4dF9iaW5jbCAtIGJpbmNsX2xpc3Q7CisgICAgICBiaW5jbHNfYWxsb2NhdGVkICo9IDI7CisgICAgICBiaW5jbF9saXN0ID0gKHN0cnVjdCBoZWFkZXJfZmlsZV9sb2NhdGlvbiAqKQorCXhtcmVhbGxvYyAocHN0LT5vYmpmaWxlLT5tZCwgKGNoYXIgKiliaW5jbF9saXN0LAorCQkgIGJpbmNsc19hbGxvY2F0ZWQgKiBzaXplb2YgKHN0cnVjdCBoZWFkZXJfZmlsZV9sb2NhdGlvbikpOworICAgICAgbmV4dF9iaW5jbCA9IGJpbmNsX2xpc3QgKyBvZmZzZXQ7CisgICAgfQorICBuZXh0X2JpbmNsLT5wc3QgPSBwc3Q7CisgIG5leHRfYmluY2wtPmluc3RhbmNlID0gaW5zdGFuY2U7CisgIG5leHRfYmluY2wrKy0+bmFtZSA9IG5hbWU7Cit9CisKKy8qIEdpdmVuIGEgbmFtZSwgdmFsdWUgcGFpciwgZmluZCB0aGUgY29ycmVzcG9uZGluZworICAgYmluY2wgaW4gdGhlIGxpc3QuICBSZXR1cm4gdGhlIHBhcnRpYWwgc3ltdGFiIGFzc29jaWF0ZWQKKyAgIHdpdGggdGhhdCBoZWFkZXJfZmlsZV9sb2NhdGlvbi4gICovCisKK3N0YXRpYyBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKgorZmluZF9jb3JyZXNwb25kaW5nX2JpbmNsX3BzeW10YWIgKG5hbWUsIGluc3RhbmNlKQorICAgICBjaGFyICpuYW1lOworICAgICBpbnQgaW5zdGFuY2U7Cit7CisgIHN0cnVjdCBoZWFkZXJfZmlsZV9sb2NhdGlvbiAqYmluY2w7CisKKyAgZm9yIChiaW5jbCA9IGJpbmNsX2xpc3Q7IGJpbmNsIDwgbmV4dF9iaW5jbDsgYmluY2wrKykKKyAgICBpZiAoYmluY2wtPmluc3RhbmNlID09IGluc3RhbmNlCisJJiYgU1RSRVEgKG5hbWUsIGJpbmNsLT5uYW1lKSkKKyAgICAgIHJldHVybiBiaW5jbC0+cHN0OworCisgIGNvbXBsYWluICgmcmVwZWF0ZWRfaGVhZGVyX2NvbXBsYWludCwgbmFtZSwgc3ltbnVtKTsKKyAgcmV0dXJuIChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikgMDsKK30KKworLyogRnJlZSB0aGUgc3RvcmFnZSBhbGxvY2F0ZWQgZm9yIHRoZSBiaW5jbCBsaXN0LiAgKi8KKworc3RhdGljIHZvaWQKK2ZyZWVfYmluY2xfbGlzdCAob2JqZmlsZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIG1mcmVlIChvYmpmaWxlIC0+IG1kLCAoUFRSKWJpbmNsX2xpc3QpOworICBiaW5jbHNfYWxsb2NhdGVkID0gMDsKK30KKworLyogU2NhbiBhIFN1bk9zIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGZvciBzeW1ib2xzIG9mIGludGVyZXN0IGFuZAorICAgYWRkIHRoZW0gdG8gdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlLiAgKi8KKworc3RhdGljIHZvaWQKK3JlYWRfZGJ4X2R5bmFtaWNfc3ltdGFiIChzZWN0aW9uX29mZnNldHMsIG9iamZpbGUpCisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIGJmZCAqYWJmZCA9IG9iamZpbGUtPm9iZmQ7CisgIHN0cnVjdCBjbGVhbnVwICpiYWNrX3RvOworICBpbnQgY291bnRlcjsKKyAgbG9uZyBkeW5zeW1fc2l6ZTsKKyAgbG9uZyBkeW5zeW1fY291bnQ7CisgIGFzeW1ib2wgKipkeW5zeW1zOworICBhc3ltYm9sICoqc3ltcHRyOworICBhcmVsZW50ICoqcmVscHRyOworICBsb25nIGR5bnJlbF9zaXplOworICBsb25nIGR5bnJlbF9jb3VudDsKKyAgYXJlbGVudCAqKmR5bnJlbHM7CisgIENPUkVfQUREUiBzeW1fdmFsdWU7CisgIGNoYXIgKm5hbWU7CisKKyAgLyogQ2hlY2sgdGhhdCB0aGUgc3ltYm9sIGZpbGUgaGFzIGR5bmFtaWMgc3ltYm9scyB0aGF0IHdlIGtub3cgYWJvdXQuCisgICAgIGJmZF9hcmNoX3Vua25vd24gY2FuIGhhcHBlbiBpZiB3ZSBhcmUgcmVhZGluZyBhIHN1bjMgc3ltYm9sIGZpbGUKKyAgICAgb24gYSBzdW40IGhvc3QgKGFuZCB2aWNlIHZlcnNhKSBhbmQgYmZkIGlzIG5vdCBjb25maWd1cmVkCisgICAgIC0td2l0aC10YXJnZXQ9YWxsLiAgVGhpcyB3b3VsZCB0cmlnZ2VyIGFuIGFzc2VydGlvbiBpbiBiZmQvc3Vub3MuYywKKyAgICAgc28gd2UgaWdub3JlIHRoZSBkeW5hbWljIHN5bWJvbHMgaW4gdGhpcyBjYXNlLiAgKi8KKyAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgIT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIKKyAgICAgIHx8IChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRFlOQU1JQykgPT0gMAorICAgICAgfHwgYmZkX2dldF9hcmNoIChhYmZkKSA9PSBiZmRfYXJjaF91bmtub3duKQorICAgIHJldHVybjsKKworICBkeW5zeW1fc2l6ZSA9IGJmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOworICBpZiAoZHluc3ltX3NpemUgPCAwKQorICAgIHJldHVybjsKKworICBkeW5zeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKGR5bnN5bV9zaXplKTsKKyAgYmFja190byA9IG1ha2VfY2xlYW51cCAoZnJlZSwgZHluc3ltcyk7CisKKyAgZHluc3ltX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgZHluc3ltcyk7CisgIGlmIChkeW5zeW1fY291bnQgPCAwKQorICAgIHsKKyAgICAgIGRvX2NsZWFudXBzIChiYWNrX3RvKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogRW50ZXIgZHluYW1pYyBzeW1ib2xzIGludG8gdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlCisgICAgIGlmIHRoaXMgaXMgYSBzdHJpcHBlZCBleGVjdXRhYmxlLiAgKi8KKyAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpIDw9IDApCisgICAgeworICAgICAgc3ltcHRyID0gZHluc3ltczsKKyAgICAgIGZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBkeW5zeW1fY291bnQ7IGNvdW50ZXIrKywgc3ltcHRyKyspCisJeworCSAgYXN5bWJvbCAqc3ltID0gKnN5bXB0cjsKKwkgIGFzZWN0aW9uICpzZWM7CisJICBpbnQgdHlwZTsKKworCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uIChzeW0pOworCisJICAvKiBCRkQgc3ltYm9scyBhcmUgc2VjdGlvbiByZWxhdGl2ZS4gICovCisJICBzeW1fdmFsdWUgPSBzeW0tPnZhbHVlICsgc2VjLT52bWE7CisKKwkgIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQ09ERSkKKwkgICAgeworCSAgICAgIHN5bV92YWx1ZSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKTsKKwkgICAgICB0eXBlID0gTl9URVhUOworCSAgICB9CisJICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfREFUQSkKKwkgICAgeworCSAgICAgIHN5bV92YWx1ZSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9EQVRBKTsKKwkgICAgICB0eXBlID0gTl9EQVRBOworCSAgICB9CisJICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQUxMT0MpCisJICAgIHsKKwkgICAgICBzeW1fdmFsdWUgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfQlNTKTsKKwkgICAgICB0eXBlID0gTl9CU1M7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgY29udGludWU7CisKKwkgIGlmIChzeW0tPmZsYWdzICYgQlNGX0dMT0JBTCkKKwkgICAgdHlwZSB8PSBOX0VYVDsKKworCSAgcmVjb3JkX21pbmltYWxfc3ltYm9sICgoY2hhciAqKSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCBzeW1fdmFsdWUsCisJCQkJIHR5cGUsIG9iamZpbGUpOworCX0KKyAgICB9CisKKyAgLyogU3ltYm9scyBmcm9tIHNoYXJlZCBsaWJyYXJpZXMgaGF2ZSBhIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyeQorICAgICB0aGF0IHBvaW50cyB0byB0aGUgYXNzb2NpYXRlZCBzbG90IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4KKyAgICAgV2UgbWFrZSBhIG1pbmluYWwgc3ltYm9sIHRhYmxlIGVudHJ5IHdpdGggdHlwZSBtc3Rfc29saWJfdHJhbXBvbGluZQorICAgICBhdCB0aGUgYWRkcmVzcyBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLworICBkeW5yZWxfc2l6ZSA9IGJmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCAoYWJmZCk7CisgIGlmIChkeW5yZWxfc2l6ZSA8IDApCisgICAgeworICAgICAgZG9fY2xlYW51cHMgKGJhY2tfdG8pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgCisgIGR5bnJlbHMgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAoZHlucmVsX3NpemUpOworICBtYWtlX2NsZWFudXAgKGZyZWUsIGR5bnJlbHMpOworCisgIGR5bnJlbF9jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyAoYWJmZCwgZHlucmVscywgZHluc3ltcyk7CisgIGlmIChkeW5yZWxfY291bnQgPCAwKQorICAgIHsKKyAgICAgIGRvX2NsZWFudXBzIChiYWNrX3RvKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZm9yIChjb3VudGVyID0gMCwgcmVscHRyID0gZHlucmVsczsKKyAgICAgICBjb3VudGVyIDwgZHlucmVsX2NvdW50OworICAgICAgIGNvdW50ZXIrKywgcmVscHRyKyspCisgICAgeworICAgICAgYXJlbGVudCAqcmVsID0gKnJlbHB0cjsKKyAgICAgIENPUkVfQUREUiBhZGRyZXNzID0KKwlyZWwtPmFkZHJlc3MgKyBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9EQVRBKTsKKworICAgICAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQorCXsKKwljYXNlIGJmZF9hcmNoX3NwYXJjOgorCSAgaWYgKHJlbC0+aG93dG8tPnR5cGUgIT0gUkVMT0NfSk1QX1NMT1QpCisJICAgIGNvbnRpbnVlOworCSAgYnJlYWs7CisJY2FzZSBiZmRfYXJjaF9tNjhrOgorCSAgLyogYDE2JyBpcyB0aGUgdHlwZSBCRkQgcHJvZHVjZXMgZm9yIGEganVtcCB0YWJsZSByZWxvY2F0aW9uLiAgKi8KKwkgIGlmIChyZWwtPmhvd3RvLT50eXBlICE9IDE2KQorCSAgICBjb250aW51ZTsKKworCSAgLyogQWRqdXN0IGFkZHJlc3MgaW4gdGhlIGp1bXAgdGFibGUgdG8gcG9pbnQgdG8KKwkgICAgIHRoZSBzdGFydCBvZiB0aGUgYnNyIGluc3RydWN0aW9uLiAgKi8KKwkgIGFkZHJlc3MgLT0gMjsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIG5hbWUgPSAoY2hhciAqKSBiZmRfYXN5bWJvbF9uYW1lICgqcmVsLT5zeW1fcHRyX3B0cik7CisgICAgICBwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbCAobmFtZSwgYWRkcmVzcywgbXN0X3NvbGliX3RyYW1wb2xpbmUsCisJCQkJICBvYmpmaWxlKTsKKyAgICB9CisKKyAgZG9fY2xlYW51cHMgKGJhY2tfdG8pOworfQorCisvKiBHaXZlbiBwb2ludGVycyB0byBhbiBhLm91dCBzeW1ib2wgdGFibGUgaW4gY29yZSBjb250YWluaW5nIGRieAorICAgc3R5bGUgZGF0YSwgc2V0dXAgcGFydGlhbF9zeW10YWIncyBkZXNjcmliaW5nIGVhY2ggc291cmNlIGZpbGUgZm9yCisgICB3aGljaCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLgorICAgU1lNRklMRV9OQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHdlIGFyZSByZWFkaW5nIGZyb20KKyAgIGFuZCBTRUNUSU9OX09GRlNFVFMgaXMgdGhlIHNldCBvZiBvZmZzZXRzIGZvciB0aGUgdmFyaW91cyBzZWN0aW9ucworICAgb2YgdGhlIGZpbGUgKGEgc2V0IG9mIHplcm9zIGlmIHRoZSBtYWlubGluZSBwcm9ncmFtKS4gICovCisKK3N0YXRpYyB2b2lkCityZWFkX2RieF9zeW10YWIgKHNlY3Rpb25fb2Zmc2V0cywgb2JqZmlsZSwgdGV4dF9hZGRyLCB0ZXh0X3NpemUpCisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIENPUkVfQUREUiB0ZXh0X2FkZHI7CisgICAgIGludCB0ZXh0X3NpemU7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqYnVmcCA9IDA7CS8qID0wIGF2b2lkcyBnY2MgLVdhbGwgZ2xpdGNoICovCisgIHN0cnVjdCBpbnRlcm5hbF9ubGlzdCBubGlzdDsKKworICByZWdpc3RlciBjaGFyICpuYW1lc3RyaW5nOworICBpbnQgbnNsOworICBpbnQgcGFzdF9maXJzdF9zb3VyY2VfZmlsZSA9IDA7CisgIENPUkVfQUREUiBsYXN0X29fZmlsZV9zdGFydCA9IDA7CisgIENPUkVfQUREUiBsYXN0X2Z1bmN0aW9uX3N0YXJ0ID0gMDsKKyAgc3RydWN0IGNsZWFudXAgKmJhY2tfdG87CisgIGJmZCAqYWJmZDsKKyAgaW50IHRleHRsb3dfbm90X3NldDsKKworICAvKiBDdXJyZW50IHBhcnRpYWwgc3ltdGFiICovCisgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN0OworCisgIC8qIExpc3Qgb2YgY3VycmVudCBwc3ltdGFiJ3MgaW5jbHVkZSBmaWxlcyAqLworICBjaGFyICoqcHN5bXRhYl9pbmNsdWRlX2xpc3Q7CisgIGludCBpbmNsdWRlc19hbGxvY2F0ZWQ7CisgIGludCBpbmNsdWRlc191c2VkOworCisgIC8qIEluZGV4IHdpdGhpbiBjdXJyZW50IHBzeW10YWIgZGVwZW5kZW5jeSBsaXN0ICovCisgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKmRlcGVuZGVuY3lfbGlzdDsKKyAgaW50IGRlcGVuZGVuY2llc191c2VkLCBkZXBlbmRlbmNpZXNfYWxsb2NhdGVkOworCisgIC8qIEZJWE1FLiAgV2UgcHJvYmFibHkgd2FudCB0byBjaGFuZ2Ugc3RyaW5ndGFiX2dsb2JhbCByYXRoZXIgdGhhbiBhZGQgdGhpcworICAgICB3aGlsZSBwcm9jZXNzaW5nIGV2ZXJ5IHN5bWJvbCBlbnRyeS4gIEZJWE1FLiAgKi8KKyAgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0ID0gMDsKKyAgbmV4dF9maWxlX3N0cmluZ190YWJsZV9vZmZzZXQgPSAwOworCisgIHN0cmluZ3RhYl9nbG9iYWwgPSBEQlhfU1RSSU5HVEFCIChvYmpmaWxlKTsKKyAgCisgIHBzdCA9IChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikgMDsKKworICBpbmNsdWRlc19hbGxvY2F0ZWQgPSAzMDsKKyAgaW5jbHVkZXNfdXNlZCA9IDA7CisgIHBzeW10YWJfaW5jbHVkZV9saXN0ID0gKGNoYXIgKiopIGFsbG9jYSAoaW5jbHVkZXNfYWxsb2NhdGVkICoKKwkJCQkJICAgc2l6ZW9mIChjaGFyICopKTsKKworICBkZXBlbmRlbmNpZXNfYWxsb2NhdGVkID0gMzA7CisgIGRlcGVuZGVuY2llc191c2VkID0gMDsKKyAgZGVwZW5kZW5jeV9saXN0ID0KKyAgICAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICoqKSBhbGxvY2EgKGRlcGVuZGVuY2llc19hbGxvY2F0ZWQgKgorCQkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSk7CisKKyAgLyogSW5pdCBiaW5jbCBsaXN0ICovCisgIGluaXRfYmluY2xfbGlzdCAoMjAsIG9iamZpbGUpOworICBiYWNrX3RvID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfYmluY2xfbGlzdCwgb2JqZmlsZSk7CisKKyAgbGFzdF9zb3VyY2VfZmlsZSA9IE5VTEw7CisKKyAgbG93ZXN0X3RleHRfYWRkcmVzcyA9IChDT1JFX0FERFIpLTE7CisKKyAgc3ltZmlsZV9iZmQgPSBvYmpmaWxlLT5vYmZkOwkvKiBGb3IgbmV4dF90ZXh0X3N5bWJvbCAqLworICBhYmZkID0gb2JqZmlsZS0+b2JmZDsKKyAgc3ltYnVmX2VuZCA9IHN5bWJ1Zl9pZHggPSAwOworICBuZXh0X3N5bWJvbF90ZXh0X2Z1bmMgPSBkYnhfbmV4dF9zeW1ib2xfdGV4dDsKKyAgdGV4dGxvd19ub3Rfc2V0ID0gMTsKKyAgaGFzX2xpbmVfbnVtYmVycyA9IDA7CisKKyAgZm9yIChzeW1udW0gPSAwOyBzeW1udW0gPCBEQlhfU1lNQ09VTlQgKG9iamZpbGUpOyBzeW1udW0rKykKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIHN5bWJvbCBmb3IgdGhpcyBydW4gYW5kIHB1bGwgb3V0IHNvbWUgaW5mbyAqLworICAgICAgUVVJVDsJLyogYWxsb3cgdGhpcyB0byBiZSBpbnRlcnJ1cHRhYmxlICovCisgICAgICBpZiAoc3ltYnVmX2lkeCA9PSBzeW1idWZfZW5kKQorCWZpbGxfc3ltYnVmIChhYmZkKTsKKyAgICAgIGJ1ZnAgPSAmc3ltYnVmW3N5bWJ1Zl9pZHgrK107CisKKyAgICAgIC8qCisgICAgICAgKiBTcGVjaWFsIGNhc2UgdG8gc3BlZWQgdXAgcmVhZGluLgorICAgICAgICovCisgICAgICBpZiAoYmZkX2hfZ2V0XzggKGFiZmQsIGJ1ZnAtPmVfdHlwZSkgPT0gTl9TTElORSkKKwl7CisJICBoYXNfbGluZV9udW1iZXJzID0gMTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgSU5URVJOQUxJWkVfU1lNQk9MIChubGlzdCwgYnVmcCwgYWJmZCk7CisgICAgICBPQkpTVEFUIChvYmpmaWxlLCBuX3N0YWJzKyspOworCisgICAgICAvKiBPay4gIFRoZXJlIGlzIGEgbG90IG9mIGNvZGUgZHVwbGljYXRlZCBpbiB0aGUgcmVzdCBvZiB0aGlzCisgICAgICAgICBzd2l0Y2ggc3RhdGVtZW50IChmb3IgZWZmaWNpZW5jeSByZWFzb25zKS4gIFNpbmNlIEkgZG9uJ3QKKyAgICAgICAgIGxpa2UgZHVwbGljYXRpbmcgY29kZSwgSSB3aWxsIGRvIG15IHBlbmFuY2UgaGVyZSwgYW5kCisgICAgICAgICBkZXNjcmliZSB0aGUgY29kZSB3aGljaCBpcyBkdXBsaWNhdGVkOgorCisJICopIFRoZSBhc3NpZ25tZW50IHRvIG5hbWVzdHJpbmcuCisJICopIFRoZSBjYWxsIHRvIHN0cmNoci4KKwkgKikgVGhlIGFkZGl0aW9uIG9mIGEgcGFydGlhbCBzeW1ib2wgdGhlIHRoZSB0d28gcGFydGlhbAorCSAgICBzeW1ib2wgbGlzdHMuICBUaGlzIGxhc3QgaXMgYSBsYXJnZSBzZWN0aW9uIG9mIGNvZGUsIHNvCisJICAgIEkndmUgaW1iZWRkZWQgaXQgaW4gdGhlIGZvbGxvd2luZyBtYWNyby4KKwkgKi8KKyAgICAgIAorLyogU2V0IG5hbWVzdHJpbmcgYmFzZWQgb24gbmxpc3QuICBJZiB0aGUgc3RyaW5nIHRhYmxlIGluZGV4IGlzIGludmFsaWQsIAorICAgZ2l2ZSBhIGZha2UgbmFtZSwgYW5kIHByaW50IGEgc2luZ2xlIGVycm9yIG1lc3NhZ2UgcGVyIHN5bWJvbCBmaWxlIHJlYWQsCisgICByYXRoZXIgdGhhbiBhYm9ydCB0aGUgc3ltYm9sIHJlYWRpbmcgb3IgZmxvb2QgdGhlIHVzZXIgd2l0aCBtZXNzYWdlcy4gICovCisKKy8qRklYTUU6IFRvbyBtYW55IGFkZHMgYW5kIGluZGlyZWN0aW9ucyBpbiBoZXJlIGZvciB0aGUgaW5uZXIgbG9vcC4gICovCisjZGVmaW5lIFNFVF9OQU1FU1RSSU5HKClcCisgIGlmICgoKHVuc2lnbmVkKUNVUl9TWU1CT0xfU1RSWCArIGZpbGVfc3RyaW5nX3RhYmxlX29mZnNldCkgPj0JCVwKKyAgICAgIERCWF9TVFJJTkdUQUJfU0laRSAob2JqZmlsZSkpIHsJCQkJCVwKKyAgICBjb21wbGFpbiAoJnN0cmluZ190YWJsZV9vZmZzZXRfY29tcGxhaW50LCBzeW1udW0pOwkJCVwKKyAgICBuYW1lc3RyaW5nID0gIjxiYWQgc3RyaW5nIHRhYmxlIG9mZnNldD4iOwkJCQlcCisgIH0gZWxzZQkJCQkJCQkJXAorICAgIG5hbWVzdHJpbmcgPSBDVVJfU1lNQk9MX1NUUlggKyBmaWxlX3N0cmluZ190YWJsZV9vZmZzZXQgKwkJXAorCQkgREJYX1NUUklOR1RBQiAob2JqZmlsZSkKKworI2RlZmluZSBDVVJfU1lNQk9MX1RZUEUgbmxpc3Qubl90eXBlCisjZGVmaW5lIENVUl9TWU1CT0xfVkFMVUUgbmxpc3Qubl92YWx1ZQorI2RlZmluZSBDVVJfU1lNQk9MX1NUUlggbmxpc3Qubl9zdHJ4CisjZGVmaW5lIERCWFJFQURfT05MWQorI2RlZmluZSBTVEFSVF9QU1lNVEFCKG9maWxlLHNlY29mZixmbmFtZSxsb3csc3ltb2ZmLGdsb2JhbF9zeW1zLHN0YXRpY19zeW1zKVwKKyAgc3RhcnRfcHN5bXRhYihvZmlsZSwgc2Vjb2ZmLCBmbmFtZSwgbG93LCBzeW1vZmYsIGdsb2JhbF9zeW1zLCBzdGF0aWNfc3ltcykKKyNkZWZpbmUgRU5EX1BTWU1UQUIocHN0LGlsaXN0LG5pbmMsY19vZmYsY190ZXh0LGRlcF9saXN0LG5fZGVwcyx0ZXh0bG93X25vdF9zZXQpXAorICBlbmRfcHN5bXRhYihwc3QsaWxpc3QsbmluYyxjX29mZixjX3RleHQsZGVwX2xpc3Qsbl9kZXBzLHRleHRsb3dfbm90X3NldCkKKworI2luY2x1ZGUgInBhcnRpYWwtc3RhYi5oIgorICAgIH0KKworICAvKiBJZiB0aGVyZSdzIHN0dWZmIHRvIGJlIGNsZWFuZWQgdXAsIGNsZWFuIGl0IHVwLiAgKi8KKyAgaWYgKERCWF9TWU1DT1VOVCAob2JqZmlsZSkgPiAwCQkJLyogV2UgaGF2ZSBzb21lIHN5bXMgKi8KKy8qRklYTUUsIGRvZXMgdGhpcyBoYXZlIGEgYnVnIGF0IHN0YXJ0IGFkZHJlc3MgMD8gKi8KKyAgICAgICYmIGxhc3Rfb19maWxlX3N0YXJ0CisgICAgICAmJiBvYmpmaWxlIC0+IGVpLmVudHJ5X3BvaW50IDwgbmxpc3Qubl92YWx1ZQorICAgICAgJiYgb2JqZmlsZSAtPiBlaS5lbnRyeV9wb2ludCA+PSBsYXN0X29fZmlsZV9zdGFydCkKKyAgICB7CisgICAgICBvYmpmaWxlIC0+IGVpLmVudHJ5X2ZpbGVfbG93cGMgPSBsYXN0X29fZmlsZV9zdGFydDsKKyAgICAgIG9iamZpbGUgLT4gZWkuZW50cnlfZmlsZV9oaWdocGMgPSBubGlzdC5uX3ZhbHVlOworICAgIH0KKworICBpZiAocHN0KQorICAgIHsKKyAgICAgIC8qIERvbid0IHNldCBwc3QtPnRleHRoaWdoIGxvd2VyIHRoYW4gaXQgYWxyZWFkeSBpcy4gICovCisgICAgICBDT1JFX0FERFIgdGV4dF9lbmQgPQorCShsb3dlc3RfdGV4dF9hZGRyZXNzID09IChDT1JFX0FERFIpLTEKKwkgPyAodGV4dF9hZGRyICsgc2VjdGlvbl9vZmZzZXRzLT5vZmZzZXRzW1NFQ1RfT0ZGX1RFWFRdKQorCSA6IGxvd2VzdF90ZXh0X2FkZHJlc3MpCisJKyB0ZXh0X3NpemU7CisKKyAgICAgIGVuZF9wc3ltdGFiIChwc3QsIHBzeW10YWJfaW5jbHVkZV9saXN0LCBpbmNsdWRlc191c2VkLAorCQkgICBzeW1udW0gKiBzeW1ib2xfc2l6ZSwKKwkJICAgdGV4dF9lbmQgPiBwc3QtPnRleHRoaWdoID8gdGV4dF9lbmQgOiBwc3QtPnRleHRoaWdoLAorCQkgICBkZXBlbmRlbmN5X2xpc3QsIGRlcGVuZGVuY2llc191c2VkLCB0ZXh0bG93X25vdF9zZXQpOworICAgIH0KKworICBkb19jbGVhbnVwcyAoYmFja190byk7Cit9CisKKy8qIEFsbG9jYXRlIGFuZCBwYXJ0aWFsbHkgZmlsbCBhIHBhcnRpYWwgc3ltdGFiLiAgSXQgd2lsbCBiZQorICAgY29tcGxldGVseSBmaWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIGxpc3QuCisKKyAgIFNZTUZJTEVfTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sLWZpbGUgd2UgYXJlIHJlYWRpbmcgZnJvbSwgYW5kIEFERFIKKyAgIGlzIHRoZSBhZGRyZXNzIHJlbGF0aXZlIHRvIHdoaWNoIGl0cyBzeW1ib2xzIGFyZSAoaW5jcmVtZW50YWwpIG9yIDAKKyAgIChub3JtYWwpLiAqLworCisKK3N0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqCitzdGFydF9wc3ltdGFiIChvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMsCisJICAgICAgIGZpbGVuYW1lLCB0ZXh0bG93LCBsZHN5bW9mZiwgZ2xvYmFsX3N5bXMsIHN0YXRpY19zeW1zKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworICAgICBjaGFyICpmaWxlbmFtZTsKKyAgICAgQ09SRV9BRERSIHRleHRsb3c7CisgICAgIGludCBsZHN5bW9mZjsKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqZ2xvYmFsX3N5bXM7CisgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKnN0YXRpY19zeW1zOworeworICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnJlc3VsdCA9CisgICAgICBzdGFydF9wc3ltdGFiX2NvbW1vbihvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMsCisJCQkgICBmaWxlbmFtZSwgdGV4dGxvdywgZ2xvYmFsX3N5bXMsIHN0YXRpY19zeW1zKTsKKworICByZXN1bHQtPnJlYWRfc3ltdGFiX3ByaXZhdGUgPSAoY2hhciAqKQorICAgIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlIC0+IHBzeW1ib2xfb2JzdGFjaywgc2l6ZW9mIChzdHJ1Y3Qgc3ltbG9jKSk7CisgIExEU1lNT0ZGKHJlc3VsdCkgPSBsZHN5bW9mZjsKKyAgcmVzdWx0LT5yZWFkX3N5bXRhYiA9IGRieF9wc3ltdGFiX3RvX3N5bXRhYjsKKyAgU1lNQk9MX1NJWkUocmVzdWx0KSA9IHN5bWJvbF9zaXplOworICBTWU1CT0xfT0ZGU0VUKHJlc3VsdCkgPSBzeW1ib2xfdGFibGVfb2Zmc2V0OworICBTVFJJTkdfT0ZGU0VUKHJlc3VsdCkgPSBzdHJpbmdfdGFibGVfb2Zmc2V0OworICBGSUxFX1NUUklOR19PRkZTRVQocmVzdWx0KSA9IGZpbGVfc3RyaW5nX3RhYmxlX29mZnNldDsKKworICAvKiBJZiB3ZSdyZSBoYW5kbGluZyBhbiBFTEYgZmlsZSwgZHJhZyBzb21lIHNlY3Rpb24tcmVsb2NhdGlvbiBpbmZvCisgICAgIGZvciB0aGlzIHNvdXJjZSBmaWxlIG91dCBvZiB0aGUgRUxGIHN5bWJvbCB0YWJsZSwgdG8gY29tcGVuc2F0ZSBmb3IKKyAgICAgU3VuIGJyYWluIGRlYXRoLiAgVGhpcyByZXBsYWNlcyB0aGUgc2VjdGlvbl9vZmZzZXRzIGluIHRoaXMgcHN5bXRhYiwKKyAgICAgaWYgc3VjY2Vzc2Z1bC4gICovCisgIGVsZnN0YWJfb2Zmc2V0X3NlY3Rpb25zIChvYmpmaWxlLCByZXN1bHQpOworCisgIC8qIERlZHVjZSB0aGUgc291cmNlIGxhbmd1YWdlIGZyb20gdGhlIGZpbGVuYW1lIGZvciB0aGlzIHBzeW10YWIuICovCisgIHBzeW10YWJfbGFuZ3VhZ2UgPSBkZWR1Y2VfbGFuZ3VhZ2VfZnJvbV9maWxlbmFtZSAoZmlsZW5hbWUpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIENsb3NlIG9mZiB0aGUgY3VycmVudCB1c2FnZSBvZiBQU1QuICAKKyAgIFJldHVybnMgUFNUIG9yIE5VTEwgaWYgdGhlIHBhcnRpYWwgc3ltdGFiIHdhcyBlbXB0eSBhbmQgdGhyb3duIGF3YXkuCisKKyAgIEZJWE1FOiAgTGlzdCB2YXJpYWJsZXMgYW5kIHBlY3VsaWFyaXRpZXMgb2Ygc2FtZS4gICovCisKK3N0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqCitlbmRfcHN5bXRhYiAocHN0LCBpbmNsdWRlX2xpc3QsIG51bV9pbmNsdWRlcywgY2FwcGluZ19zeW1ib2xfb2Zmc2V0LAorCSAgICAgY2FwcGluZ190ZXh0LCBkZXBlbmRlbmN5X2xpc3QsIG51bWJlcl9kZXBlbmRlbmNpZXMsIHRleHRsb3dfbm90X3NldCkKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7CisgICAgIGNoYXIgKippbmNsdWRlX2xpc3Q7CisgICAgIGludCBudW1faW5jbHVkZXM7CisgICAgIGludCBjYXBwaW5nX3N5bWJvbF9vZmZzZXQ7CisgICAgIENPUkVfQUREUiBjYXBwaW5nX3RleHQ7CisgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKmRlcGVuZGVuY3lfbGlzdDsKKyAgICAgaW50IG51bWJlcl9kZXBlbmRlbmNpZXM7CisgICAgIGludCB0ZXh0bG93X25vdF9zZXQ7Cit7CisgIGludCBpOworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSA9IHBzdCAtPiBvYmpmaWxlOworCisgIGlmIChjYXBwaW5nX3N5bWJvbF9vZmZzZXQgIT0gLTEpCisgICAgTERTWU1MRU4ocHN0KSA9IGNhcHBpbmdfc3ltYm9sX29mZnNldCAtIExEU1lNT0ZGKHBzdCk7CisgIHBzdC0+dGV4dGhpZ2ggPSBjYXBwaW5nX3RleHQ7CisKKyNpZmRlZiBTT0ZVTl9BRERSRVNTX01BWUJFX01JU1NJTkcKKyAgLyogVW5kZXIgU29sYXJpcywgdGhlIE5fU08gc3ltYm9scyBhbHdheXMgaGF2ZSBhIHZhbHVlIG9mIDAsCisgICAgIGluc3RlYWQgb2YgdGhlIHVzdWFsIGFkZHJlc3Mgb2YgdGhlIC5vIGZpbGUuICBUaGVyZWZvcmUsCisgICAgIHdlIGhhdmUgdG8gZG8gc29tZSB0cmlja3MgdG8gZmlsbCBpbiB0ZXh0aGlnaCBhbmQgdGV4dGxvdy4KKyAgICAgVGhlIGZpcnN0IHRyaWNrIGlzIGluIHBhcnRpYWwtc3RhYi5oOiBpZiB3ZSBzZWUgYSBzdGF0aWMKKyAgICAgb3IgZ2xvYmFsIGZ1bmN0aW9uLCBhbmQgdGhlIHRleHRsb3cgZm9yIHRoZSBjdXJyZW50IHBzdAorICAgICBpcyBub3Qgc2V0IChpZTogdGV4dGxvd19ub3Rfc2V0KSwgdGhlbiB3ZSB1c2UgdGhhdCBmdW5jdGlvbidzCisgICAgIGFkZHJlc3MgZm9yIHRoZSB0ZXh0bG93IG9mIHRoZSBwc3QuICAqLworCisgIC8qIE5vdywgdG8gZmlsbCBpbiB0ZXh0aGlnaCwgd2UgcmVtZW1iZXIgdGhlIGxhc3QgZnVuY3Rpb24gc2VlbgorICAgICBpbiB0aGUgLm8gZmlsZSAoYWxzbyBpbiBwYXJ0aWFsLXN0YWIuaCkuICBBbHNvLCB0aGVyZSdzIGEgaGFjayBpbgorICAgICBiZmQvZWxmLmMgYW5kIGdkYi9lbGZyZWFkLmMgdG8gcGFzcyB0aGUgRUxGIHN0X3NpemUgZmllbGQKKyAgICAgdG8gaGVyZSB2aWEgdGhlIG1pc2NfaW5mbyBmaWVsZC4gIFRoZXJlZm9yZSwgd2UgY2FuIGZpbGwgaW4KKyAgICAgYSByZWxpYWJsZSB0ZXh0aGlnaCBieSB0YWtpbmcgdGhlIGFkZHJlc3MgcGx1cyBzaXplIG9mIHRoZQorICAgICBsYXN0IGZ1bmN0aW9uIGluIHRoZSBmaWxlLiAgKi8KKworICBpZiAocHN0LT50ZXh0aGlnaCA9PSAwICYmIGxhc3RfZnVuY3Rpb25fbmFtZSkKKyAgICB7CisgICAgICBjaGFyICpwOworICAgICAgaW50IG47CisgICAgICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1pbnN5bTsKKworICAgICAgcCA9IHN0cmNociAobGFzdF9mdW5jdGlvbl9uYW1lLCAnOicpOworICAgICAgaWYgKHAgPT0gTlVMTCkKKwlwID0gbGFzdF9mdW5jdGlvbl9uYW1lOworICAgICAgbiA9IHAgLSBsYXN0X2Z1bmN0aW9uX25hbWU7CisgICAgICBwID0gYWxsb2NhIChuICsgMik7CisgICAgICBzdHJuY3B5IChwLCBsYXN0X2Z1bmN0aW9uX25hbWUsIG4pOworICAgICAgcFtuXSA9IDA7CisgICAgCisgICAgICBtaW5zeW0gPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKHAsIHBzdC0+ZmlsZW5hbWUsIG9iamZpbGUpOworICAgICAgaWYgKG1pbnN5bSA9PSBOVUxMKQorCXsKKwkgIC8qIFN1biBGb3J0cmFuIGFwcGVuZHMgYW4gdW5kZXJzY29yZSB0byB0aGUgbWluaW1hbCBzeW1ib2wgbmFtZSwKKwkgICAgIHRyeSBhZ2FpbiB3aXRoIGFuIGFwcGVuZGVkIHVuZGVyc2NvcmUgaWYgdGhlIG1pbmltYWwgc3ltYm9sCisJICAgICB3YXMgbm90IGZvdW5kLiAgKi8KKwkgIHBbbl0gPSAnXyc7CisJICBwW24gKyAxXSA9IDA7CisJICBtaW5zeW0gPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKHAsIHBzdC0+ZmlsZW5hbWUsIG9iamZpbGUpOworCX0KKworICAgICAgaWYgKG1pbnN5bSkKKwlwc3QtPnRleHRoaWdoID0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1pbnN5bSkgKyBNU1lNQk9MX1NJWkUgKG1pbnN5bSk7CisKKyAgICAgIGxhc3RfZnVuY3Rpb25fbmFtZSA9IE5VTEw7CisgICAgfQorCisgIC8qIHRoaXMgdGVzdCB3aWxsIGJlIHRydWUgaWYgdGhlIGxhc3QgLm8gZmlsZSBpcyBvbmx5IGRhdGEgKi8KKyAgaWYgKHRleHRsb3dfbm90X3NldCkKKyAgICBwc3QtPnRleHRsb3cgPSBwc3QtPnRleHRoaWdoOworICBlbHNlCisgICAgeworICAgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwMTsKKworICAgICAgLyogSWYgd2Uga25vdyBvdXIgb3duIHN0YXJ0aW5nIHRleHQgYWRkcmVzcywgdGhlbiB3YWxrIHRocm91Z2ggYWxsIG90aGVyCisJIHBzeW10YWJzIGZvciB0aGlzIG9iamZpbGUsIGFuZCBpZiBhbnkgZGlkbid0IGtub3cgdGhlaXIgZW5kaW5nIHRleHQKKwkgYWRkcmVzcywgc2V0IGl0IHRvIG91ciBzdGFydGluZyBhZGRyZXNzLiAgVGFrZSBjYXJlIHRvIG5vdCBzZXQgb3VyCisJIG93biBlbmRpbmcgYWRkcmVzcyB0byBvdXIgc3RhcnRpbmcgYWRkcmVzcywgbm9yIHRvIHNldCBhZGRyZXNzZXMgb24KKwkgYGRlcGVuZGVuY3knIGZpbGVzIHRoYXQgaGF2ZSBib3RoIHRleHRsb3cgYW5kIHRleHRoaWdoIHplcm8uICAqLworCisgICAgICBBTExfT0JKRklMRV9QU1lNVEFCUyAob2JqZmlsZSwgcDEpCisJeworCSAgaWYgKHAxLT50ZXh0aGlnaCA9PSAwICAmJiBwMS0+dGV4dGxvdyAhPSAwICYmIHAxICE9IHBzdCkKKwkgICAgeworCSAgICAgIHAxLT50ZXh0aGlnaCA9IHBzdC0+dGV4dGxvdzsKKwkgICAgICAvKiBpZiB0aGlzIGZpbGUgaGFzIG9ubHkgZGF0YSwgdGhlbiBtYWtlIHRleHRsb3cgbWF0Y2ggdGV4dGhpZ2ggKi8KKwkgICAgICBpZiAocDEtPnRleHRsb3cgPT0gMCkKKwkJcDEtPnRleHRsb3cgPSBwMS0+dGV4dGhpZ2g7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIEVuZCBvZiBrbHVkZ2UgZm9yIHBhdGNoaW5nIFNvbGFyaXMgdGV4dGxvdyBhbmQgdGV4dGhpZ2guICAqLworI2VuZGlmIC8qIFNPRlVOX0FERFJFU1NfTUFZQkVfTUlTU0lORy4gICovCisKKyAgcHN0LT5uX2dsb2JhbF9zeW1zID0KKyAgICBvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMubmV4dCAtIChvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMubGlzdCArIHBzdC0+Z2xvYmFsc19vZmZzZXQpOworICBwc3QtPm5fc3RhdGljX3N5bXMgPQorICAgIG9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5uZXh0IC0gKG9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5saXN0ICsgcHN0LT5zdGF0aWNzX29mZnNldCk7CisKKyAgcHN0LT5udW1iZXJfb2ZfZGVwZW5kZW5jaWVzID0gbnVtYmVyX2RlcGVuZGVuY2llczsKKyAgaWYgKG51bWJlcl9kZXBlbmRlbmNpZXMpCisgICAgeworICAgICAgcHN0LT5kZXBlbmRlbmNpZXMgPSAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICoqKQorCW9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5wc3ltYm9sX29ic3RhY2ssCisJCSAgICAgICBudW1iZXJfZGVwZW5kZW5jaWVzICogc2l6ZW9mIChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworICAgICAgbWVtY3B5IChwc3QtPmRlcGVuZGVuY2llcywgZGVwZW5kZW5jeV9saXN0LAorCSAgICAgbnVtYmVyX2RlcGVuZGVuY2llcyAqIHNpemVvZiAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKKyAgICB9CisgIGVsc2UKKyAgICBwc3QtPmRlcGVuZGVuY2llcyA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9pbmNsdWRlczsgaSsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqc3VicHN0ID0KKwlhbGxvY2F0ZV9wc3ltdGFiIChpbmNsdWRlX2xpc3RbaV0sIG9iamZpbGUpOworCisgICAgICBzdWJwc3QtPnNlY3Rpb25fb2Zmc2V0cyA9IHBzdC0+c2VjdGlvbl9vZmZzZXRzOworICAgICAgc3VicHN0LT5yZWFkX3N5bXRhYl9wcml2YXRlID0KKwkgIChjaGFyICopIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5wc3ltYm9sX29ic3RhY2ssCisJCQkJICBzaXplb2YgKHN0cnVjdCBzeW1sb2MpKTsKKyAgICAgIExEU1lNT0ZGKHN1YnBzdCkgPQorCUxEU1lNTEVOKHN1YnBzdCkgPQorCSAgc3VicHN0LT50ZXh0bG93ID0KKwkgICAgc3VicHN0LT50ZXh0aGlnaCA9IDA7CisKKyAgICAgIC8qIFdlIGNvdWxkIHNhdmUgc2xpZ2h0IGJpdHMgb2Ygc3BhY2UgYnkgb25seSBtYWtpbmcgb25lIG9mIHRoZXNlLAorCSBzaGFyZWQgYnkgdGhlIGVudGlyZSBzZXQgb2YgaW5jbHVkZSBmaWxlcy4gIEZJWE1FLXNvbWVkYXkuICAqLworICAgICAgc3VicHN0LT5kZXBlbmRlbmNpZXMgPSAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICoqKQorCW9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5wc3ltYm9sX29ic3RhY2ssCisJCSAgICAgICBzaXplb2YgKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSk7CisgICAgICBzdWJwc3QtPmRlcGVuZGVuY2llc1swXSA9IHBzdDsKKyAgICAgIHN1YnBzdC0+bnVtYmVyX29mX2RlcGVuZGVuY2llcyA9IDE7CisKKyAgICAgIHN1YnBzdC0+Z2xvYmFsc19vZmZzZXQgPQorCXN1YnBzdC0+bl9nbG9iYWxfc3ltcyA9CisJICBzdWJwc3QtPnN0YXRpY3Nfb2Zmc2V0ID0KKwkgICAgc3VicHN0LT5uX3N0YXRpY19zeW1zID0gMDsKKworICAgICAgc3VicHN0LT5yZWFkaW4gPSAwOworICAgICAgc3VicHN0LT5zeW10YWIgPSAwOworICAgICAgc3VicHN0LT5yZWFkX3N5bXRhYiA9IHBzdC0+cmVhZF9zeW10YWI7CisgICAgfQorCisgIHNvcnRfcHN0X3N5bWJvbHMgKHBzdCk7CisKKyAgLyogSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHBzeW10YWIgb3Igc3ltdGFiIGZvciBhIGZpbGUgb2YgdGhpcyBuYW1lLCByZW1vdmUgaXQuCisgICAgIChJZiB0aGVyZSBpcyBhIHN5bXRhYiwgbW9yZSBkcmFzdGljIHRoaW5ncyBhbHNvIGhhcHBlbi4pCisgICAgIFRoaXMgaGFwcGVucyBpbiBWeFdvcmtzLiAgKi8KKyAgZnJlZV9uYW1lZF9zeW10YWJzIChwc3QtPmZpbGVuYW1lKTsKKworICBpZiAobnVtX2luY2x1ZGVzID09IDAKKyAgICAgICYmIG51bWJlcl9kZXBlbmRlbmNpZXMgPT0gMAorICAgICAgJiYgcHN0LT5uX2dsb2JhbF9zeW1zID09IDAKKyAgICAgICYmIHBzdC0+bl9zdGF0aWNfc3ltcyA9PSAwCisgICAgICAmJiBoYXNfbGluZV9udW1iZXJzID09IDApCisgICAgeworICAgICAgLyogVGhyb3cgYXdheSB0aGlzIHBzeW10YWIsIGl0J3MgZW1wdHkuICBXZSBjYW4ndCBkZWFsbG9jYXRlIGl0LCBzaW5jZQorCSBpdCBpcyBvbiB0aGUgb2JzdGFjaywgYnV0IHdlIGNhbiBmb3JnZXQgdG8gY2hhaW4gaXQgb24gdGhlIGxpc3QuICAqLworICAgICAgLyogRW1wdHkgcHN5bXRhYnMgaGFwcGVuIGFzIGEgcmVzdWx0IG9mIGhlYWRlciBmaWxlcyB3aGljaCBkb24ndCBoYXZlCisJIGFueSBzeW1ib2xzIGluIHRoZW0uICBUaGVyZSBjYW4gYmUgYSBsb3Qgb2YgdGhlbS4gIEJ1dCB0aGlzIGNoZWNrCisJIGlzIHdyb25nLCBpbiB0aGF0IGEgcHN5bXRhYiB3aXRoIE5fU0xJTkUgZW50cmllcyBidXQgbm90aGluZyBlbHNlCisJIGlzIG5vdCBlbXB0eSwgYnV0IHdlIGRvbid0IHJlYWxpemUgdGhhdC4gIEZpeGluZyB0aGF0IHdpdGhvdXQgc2xvd2luZworCSB0aGluZ3MgZG93biBtaWdodCBiZSB0cmlja3kuICAqLworCisgICAgICBkaXNjYXJkX3BzeW10YWIgKHBzdCk7CisKKyAgICAgIC8qIEluZGljYXRlIHRoYXQgcHN5bXRhYiB3YXMgdGhyb3duIGF3YXkuICAqLworICAgICAgcHN0ID0gKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKU5VTEw7CisgICAgfQorICByZXR1cm4gcHN0OworfQorDAorc3RhdGljIHZvaWQKK2RieF9wc3ltdGFiX3RvX3N5bXRhYl8xIChwc3QpCisgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN0OworeworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworICBpbnQgaTsKKyAgCisgIGlmICghcHN0KQorICAgIHJldHVybjsKKworICBpZiAocHN0LT5yZWFkaW4pCisgICAgeworICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiUHN5bXRhYiBmb3IgJXMgYWxyZWFkeSByZWFkIGluLiAgU2hvdWxkbid0IGhhcHBlbi5cbiIsCisJICAgICAgIHBzdC0+ZmlsZW5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBSZWFkIGluIGFsbCBwYXJ0aWFsIHN5bXRhYnMgb24gd2hpY2ggdGhpcyBvbmUgaXMgZGVwZW5kZW50ICovCisgIGZvciAoaSA9IDA7IGkgPCBwc3QtPm51bWJlcl9vZl9kZXBlbmRlbmNpZXM7IGkrKykKKyAgICBpZiAoIXBzdC0+ZGVwZW5kZW5jaWVzW2ldLT5yZWFkaW4pCisgICAgICB7CisJLyogSW5mb3JtIGFib3V0IGFkZGl0aW9uYWwgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIHJlYWQgaW4uICAqLworCWlmIChpbmZvX3ZlcmJvc2UpCisJICB7CisJICAgIGZwdXRzX2ZpbHRlcmVkICgiICIsIGdkYl9zdGRvdXQpOworCSAgICB3cmFwX2hlcmUgKCIiKTsKKwkgICAgZnB1dHNfZmlsdGVyZWQgKCJhbmQgIiwgZ2RiX3N0ZG91dCk7CisJICAgIHdyYXBfaGVyZSAoIiIpOworCSAgICBwcmludGZfZmlsdGVyZWQgKCIlcy4uLiIsIHBzdC0+ZGVwZW5kZW5jaWVzW2ldLT5maWxlbmFtZSk7CisJICAgIHdyYXBfaGVyZSAoIiIpOwkJLyogRmx1c2ggb3V0cHV0ICovCisJICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisJICB9CisJZGJ4X3BzeW10YWJfdG9fc3ltdGFiXzEgKHBzdC0+ZGVwZW5kZW5jaWVzW2ldKTsKKyAgICAgIH0KKworICBpZiAoTERTWU1MRU4ocHN0KSkJCS8qIE90aGVyd2lzZSBpdCdzIGEgZHVtbXkgKi8KKyAgICB7CisgICAgICAvKiBJbml0IHN0dWZmIG5lY2Vzc2FyeSBmb3IgcmVhZGluZyBpbiBzeW1ib2xzICovCisgICAgICBzdGFic3JlYWRfaW5pdCAoKTsKKyAgICAgIGJ1aWxkc3ltX2luaXQgKCk7CisgICAgICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgcmVhbGx5X2ZyZWVfcGVuZGluZ3MsIDApOworICAgICAgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0ID0gRklMRV9TVFJJTkdfT0ZGU0VUIChwc3QpOworICAgICAgc3ltYm9sX3NpemUgPSBTWU1CT0xfU0laRSAocHN0KTsKKworICAgICAgLyogUmVhZCBpbiB0aGlzIGZpbGUncyBzeW1ib2xzICovCisgICAgICBiZmRfc2VlayAocHN0LT5vYmpmaWxlLT5vYmZkLCBTWU1CT0xfT0ZGU0VUIChwc3QpLCBTRUVLX1NFVCk7CisgICAgICByZWFkX29maWxlX3N5bXRhYiAocHN0KTsKKyAgICAgIHNvcnRfc3ltdGFiX3N5bXMgKHBzdC0+c3ltdGFiKTsKKworICAgICAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisgICAgfQorCisgIHBzdC0+cmVhZGluID0gMTsKK30KKworLyogUmVhZCBpbiBhbGwgb2YgdGhlIHN5bWJvbHMgZm9yIGEgZ2l2ZW4gcHN5bXRhYiBmb3IgcmVhbC4KKyAgIEJlIHZlcmJvc2UgYWJvdXQgaXQgaWYgdGhlIHVzZXIgd2FudHMgdGhhdC4gICovCisKK3N0YXRpYyB2b2lkCitkYnhfcHN5bXRhYl90b19zeW10YWIgKHBzdCkKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7Cit7CisgIGJmZCAqc3ltX2JmZDsKKworICBpZiAoIXBzdCkKKyAgICByZXR1cm47CisKKyAgaWYgKHBzdC0+cmVhZGluKQorICAgIHsKKyAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlBzeW10YWIgZm9yICVzIGFscmVhZHkgcmVhZCBpbi4gIFNob3VsZG4ndCBoYXBwZW4uXG4iLAorCSAgICAgICBwc3QtPmZpbGVuYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKExEU1lNTEVOKHBzdCkgfHwgcHN0LT5udW1iZXJfb2ZfZGVwZW5kZW5jaWVzKQorICAgIHsKKyAgICAgIC8qIFByaW50IHRoZSBtZXNzYWdlIG5vdywgYmVmb3JlIHJlYWRpbmcgdGhlIHN0cmluZyB0YWJsZSwKKwkgdG8gYXZvaWQgZGlzY29uY2VydGluZyBwYXVzZXMuICAqLworICAgICAgaWYgKGluZm9fdmVyYm9zZSkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCJSZWFkaW5nIGluIHN5bWJvbHMgZm9yICVzLi4uIiwgcHN0LT5maWxlbmFtZSk7CisJICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCX0KKworICAgICAgc3ltX2JmZCA9IHBzdC0+b2JqZmlsZS0+b2JmZDsKKworICAgICAgbmV4dF9zeW1ib2xfdGV4dF9mdW5jID0gZGJ4X25leHRfc3ltYm9sX3RleHQ7CisKKyAgICAgIGRieF9wc3ltdGFiX3RvX3N5bXRhYl8xIChwc3QpOworCisgICAgICAvKiBNYXRjaCB3aXRoIGdsb2JhbCBzeW1ib2xzLiAgVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgb25jZSwKKyAgICAgICAgIGFmdGVyIGFsbCBvZiB0aGUgc3ltdGFicyBhbmQgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiByZWFkIGluLiAgICovCisgICAgICBzY2FuX2ZpbGVfZ2xvYmFscyAocHN0LT5vYmpmaWxlKTsKKworICAgICAgLyogRmluaXNoIHVwIHRoZSBkZWJ1ZyBlcnJvciBtZXNzYWdlLiAgKi8KKyAgICAgIGlmIChpbmZvX3ZlcmJvc2UpCisJcHJpbnRmX2ZpbHRlcmVkICgiZG9uZS5cbiIpOworICAgIH0KK30KKworLyogUmVhZCBpbiBhIGRlZmluZWQgc2VjdGlvbiBvZiBhIHNwZWNpZmljIG9iamVjdCBmaWxlJ3Mgc3ltYm9scy4gKi8KKyAgCitzdGF0aWMgdm9pZAorcmVhZF9vZmlsZV9zeW10YWIgKHBzdCkKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKm5hbWVzdHJpbmc7CisgIHJlZ2lzdGVyIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqYnVmcDsKKyAgc3RydWN0IGludGVybmFsX25saXN0IG5saXN0OworICB1bnNpZ25lZCBjaGFyIHR5cGU7CisgIHVuc2lnbmVkIG1heF9zeW1udW07CisgIHJlZ2lzdGVyIGJmZCAqYWJmZDsKKyAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgIGludCBzeW1fb2Zmc2V0OwkJLyogT2Zmc2V0IHRvIHN0YXJ0IG9mIHN5bWJvbHMgdG8gcmVhZCAqLworICBpbnQgc3ltX3NpemU7CQkJLyogU2l6ZSBvZiBzeW1ib2xzIHRvIHJlYWQgKi8KKyAgQ09SRV9BRERSIHRleHRfb2Zmc2V0OwkvKiBTdGFydCBvZiB0ZXh0IHNlZ21lbnQgZm9yIHN5bWJvbHMgKi8KKyAgaW50IHRleHRfc2l6ZTsJCS8qIFNpemUgb2YgdGV4dCBzZWdtZW50IGZvciBzeW1ib2xzICovCisgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKworICBvYmpmaWxlID0gcHN0LT5vYmpmaWxlOworICBzeW1fb2Zmc2V0ID0gTERTWU1PRkYocHN0KTsKKyAgc3ltX3NpemUgPSBMRFNZTUxFTihwc3QpOworICB0ZXh0X29mZnNldCA9IHBzdC0+dGV4dGxvdzsKKyAgdGV4dF9zaXplID0gcHN0LT50ZXh0aGlnaCAtIHBzdC0+dGV4dGxvdzsKKyAgc2VjdGlvbl9vZmZzZXRzID0gcHN0LT5zZWN0aW9uX29mZnNldHM7CisKKyAgY3VycmVudF9vYmpmaWxlID0gb2JqZmlsZTsKKyAgc3ViZmlsZV9zdGFjayA9IE5VTEw7CisKKyAgc3RyaW5ndGFiX2dsb2JhbCA9IERCWF9TVFJJTkdUQUIgKG9iamZpbGUpOworICBsYXN0X3NvdXJjZV9maWxlID0gTlVMTDsKKworICBhYmZkID0gb2JqZmlsZS0+b2JmZDsKKyAgc3ltZmlsZV9iZmQgPSBvYmpmaWxlLT5vYmZkOwkvKiBJbXBsaWNpdCBwYXJhbSB0byBuZXh0X3RleHRfc3ltYm9sICovCisgIHN5bWJ1Zl9lbmQgPSBzeW1idWZfaWR4ID0gMDsKKworICAvKiBJdCBpcyBuZWNlc3NhcnkgdG8gYWN0dWFsbHkgcmVhZCBvbmUgc3ltYm9sICpiZWZvcmUqIHRoZSBzdGFydAorICAgICBvZiB0aGlzIHN5bXRhYidzIHN5bWJvbHMsIGJlY2F1c2UgdGhlIEdDQ19DT01QSUxFRF9GTEFHX1NZTUJPTAorICAgICBvY2N1cnMgYmVmb3JlIHRoZSBOX1NPIHN5bWJvbC4KKworICAgICBEZXRlY3RpbmcgdGhpcyBpbiByZWFkX2RieF9zeW10YWIKKyAgICAgd291bGQgc2xvdyBkb3duIGluaXRpYWwgcmVhZGluLCBzbyB3ZSBsb29rIGZvciBpdCBoZXJlIGluc3RlYWQuICAqLworICBpZiAoIXByb2Nlc3NpbmdfYWNjX2NvbXBpbGF0aW9uICYmIHN5bV9vZmZzZXQgPj0gKGludClzeW1ib2xfc2l6ZSkKKyAgICB7CisgICAgICBiZmRfc2VlayAoc3ltZmlsZV9iZmQsIHN5bV9vZmZzZXQgLSBzeW1ib2xfc2l6ZSwgU0VFS19DVVIpOworICAgICAgZmlsbF9zeW1idWYgKGFiZmQpOworICAgICAgYnVmcCA9ICZzeW1idWZbc3ltYnVmX2lkeCsrXTsKKyAgICAgIElOVEVSTkFMSVpFX1NZTUJPTCAobmxpc3QsIGJ1ZnAsIGFiZmQpOworICAgICAgT0JKU1RBVCAob2JqZmlsZSwgbl9zdGFicysrKTsKKworICAgICAgU0VUX05BTUVTVFJJTkcgKCk7CisKKyAgICAgIHByb2Nlc3NpbmdfZ2NjX2NvbXBpbGF0aW9uID0gMDsKKyAgICAgIGlmIChubGlzdC5uX3R5cGUgPT0gTl9URVhUKQorCXsKKwkgIGNvbnN0IGNoYXIgKnRlbXBzdHJpbmcgPSBuYW1lc3RyaW5nOworCisJICBpZiAoU1RSRVEgKG5hbWVzdHJpbmcsIEdDQ19DT01QSUxFRF9GTEFHX1NZTUJPTCkpCisJICAgIHByb2Nlc3NpbmdfZ2NjX2NvbXBpbGF0aW9uID0gMTsKKwkgIGVsc2UgaWYgKFNUUkVRIChuYW1lc3RyaW5nLCBHQ0MyX0NPTVBJTEVEX0ZMQUdfU1lNQk9MKSkKKwkgICAgcHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24gPSAyOworCSAgaWYgKHRlbXBzdHJpbmdbMF0gPT0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChzeW1maWxlX2JmZCkpCisJICAgICsrdGVtcHN0cmluZzsKKwkgIGlmIChTVFJFUU4gKHRlbXBzdHJpbmcsICJfX2dudV9jb21waWxlZCIsIDE0KSkKKwkgICAgcHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24gPSAyOworCX0KKworICAgICAgLyogVHJ5IHRvIHNlbGVjdCBhIEMrKyBkZW1hbmdsaW5nIGJhc2VkIG9uIHRoZSBjb21waWxhdGlvbiB1bml0CisJIHByb2R1Y2VyLiAqLworCisgICAgICBpZiAocHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24pCisJeworCSAgaWYgKEFVVE9fREVNQU5HTElORykKKwkgICAgeworCSAgICAgIHNldF9kZW1hbmdsaW5nX3N0eWxlIChHTlVfREVNQU5HTElOR19TVFlMRV9TVFJJTkcpOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFRoZSBOX1NPIHN0YXJ0aW5nIHRoaXMgc3ltdGFiIGlzIHRoZSBmaXJzdCBzeW1ib2wsIHNvIHdlCisJIGJldHRlciBub3QgY2hlY2sgdGhlIHN5bWJvbCBiZWZvcmUgaXQuICBJJ20gbm90IHRoaXMgY2FuCisJIGhhcHBlbiwgYnV0IGl0IGRvZXNuJ3QgaHVydCB0byBjaGVjayBmb3IgaXQuICAqLworICAgICAgYmZkX3NlZWsgKHN5bWZpbGVfYmZkLCBzeW1fb2Zmc2V0LCBTRUVLX0NVUik7CisgICAgICBwcm9jZXNzaW5nX2djY19jb21waWxhdGlvbiA9IDA7CisgICAgfQorCisgIGlmIChzeW1idWZfaWR4ID09IHN5bWJ1Zl9lbmQpCisgICAgZmlsbF9zeW1idWYgKGFiZmQpOworICBidWZwID0gJnN5bWJ1ZltzeW1idWZfaWR4XTsKKyAgaWYgKGJmZF9oX2dldF84IChhYmZkLCBidWZwLT5lX3R5cGUpICE9IE5fU08pCisgICAgZXJyb3IoIkZpcnN0IHN5bWJvbCBpbiBzZWdtZW50IG9mIGV4ZWN1dGFibGUgbm90IGEgc291cmNlIHN5bWJvbCIpOworCisgIG1heF9zeW1udW0gPSBzeW1fc2l6ZSAvIHN5bWJvbF9zaXplOworCisgIGZvciAoc3ltbnVtID0gMDsKKyAgICAgICBzeW1udW0gPCBtYXhfc3ltbnVtOworICAgICAgIHN5bW51bSsrKQorICAgIHsKKyAgICAgIFFVSVQ7CQkJLyogQWxsb3cgdGhpcyB0byBiZSBpbnRlcnJ1cHRhYmxlICovCisgICAgICBpZiAoc3ltYnVmX2lkeCA9PSBzeW1idWZfZW5kKQorCWZpbGxfc3ltYnVmKGFiZmQpOworICAgICAgYnVmcCA9ICZzeW1idWZbc3ltYnVmX2lkeCsrXTsKKyAgICAgIElOVEVSTkFMSVpFX1NZTUJPTCAobmxpc3QsIGJ1ZnAsIGFiZmQpOworICAgICAgT0JKU1RBVCAob2JqZmlsZSwgbl9zdGFicysrKTsKKworICAgICAgdHlwZSA9IGJmZF9oX2dldF84IChhYmZkLCBidWZwLT5lX3R5cGUpOworCisgICAgICBTRVRfTkFNRVNUUklORyAoKTsKKworICAgICAgaWYgKHR5cGUgJiBOX1NUQUIpIHsKKwkgIHByb2Nlc3Nfb25lX3N5bWJvbCAodHlwZSwgbmxpc3Qubl9kZXNjLCBubGlzdC5uX3ZhbHVlLAorCQkJICAgICAgbmFtZXN0cmluZywgc2VjdGlvbl9vZmZzZXRzLCBvYmpmaWxlKTsKKyAgICAgIH0KKyAgICAgIC8qIFdlIHNraXAgY2hlY2tpbmcgZm9yIGEgbmV3IC5vIG9yIC1sIGZpbGU7IHRoYXQgc2hvdWxkIG5ldmVyCisgICAgICAgICBoYXBwZW4gaW4gdGhpcyByb3V0aW5lLiAqLworICAgICAgZWxzZSBpZiAodHlwZSA9PSBOX1RFWFQpCisJeworCSAgLyogSSBkb24ndCB0aGluayB0aGlzIGNvZGUgd2lsbCBldmVyIGJlIGV4ZWN1dGVkLCBiZWNhdXNlCisJICAgICB0aGUgR0NDX0NPTVBJTEVEX0ZMQUdfU1lNQk9MIHVzdWFsbHkgaXMgcmlnaHQgYmVmb3JlCisJICAgICB0aGUgTl9TTyBzeW1ib2wgd2hpY2ggc3RhcnRzIHRoaXMgc291cmNlIGZpbGUuCisJICAgICBIb3dldmVyLCB0aGVyZSBpcyBubyByZWFzb24gbm90IHRvIGFjY2VwdAorCSAgICAgdGhlIEdDQ19DT01QSUxFRF9GTEFHX1NZTUJPTCBhbnl3aGVyZS4gICovCisKKwkgIGlmIChTVFJFUSAobmFtZXN0cmluZywgR0NDX0NPTVBJTEVEX0ZMQUdfU1lNQk9MKSkKKwkgICAgcHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24gPSAxOworCSAgZWxzZSBpZiAoU1RSRVEgKG5hbWVzdHJpbmcsIEdDQzJfQ09NUElMRURfRkxBR19TWU1CT0wpKQorCSAgICBwcm9jZXNzaW5nX2djY19jb21waWxhdGlvbiA9IDI7CisKKwkgIGlmIChBVVRPX0RFTUFOR0xJTkcpCisJICAgIHsKKwkgICAgICBzZXRfZGVtYW5nbGluZ19zdHlsZSAoR05VX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKHR5cGUgJiBOX0VYVCB8fCB0eXBlID09ICh1bnNpZ25lZCBjaGFyKU5fVEVYVAorCSAgICAgICB8fCB0eXBlID09ICh1bnNpZ25lZCBjaGFyKU5fTkJURVhUCisJICAgICAgICkgeworCSAgLyogR2xvYmFsIHN5bWJvbDogc2VlIGlmIHdlIGNhbWUgYWNyb3NzIGEgZGJ4IGRlZmludGlvbiBmb3IKKwkgICAgIGEgY29ycmVzcG9uZGluZyBzeW1ib2wuICBJZiBzbywgc3RvcmUgdGhlIHZhbHVlLiAgUmVtb3ZlCisJICAgICBzeW1zIGZyb20gdGhlIGNoYWluIHdoZW4gdGhlaXIgdmFsdWVzIGFyZSBzdG9yZWQsIGJ1dAorCSAgICAgc2VhcmNoIHRoZSB3aG9sZSBjaGFpbiwgYXMgdGhlcmUgbWF5IGJlIHNldmVyYWwgc3ltcyBmcm9tCisJICAgICBkaWZmZXJlbnQgZmlsZXMgd2l0aCB0aGUgc2FtZSBuYW1lLiAqLworCSAgLyogVGhpcyBpcyBwcm9iYWJseSBub3QgdHJ1ZS4gIFNpbmNlIHRoZSBmaWxlcyB3aWxsIGJlIHJlYWQKKwkgICAgIGluIG9uZSBhdCBhIHRpbWUsIGVhY2ggcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIHN5bWJvbCB3aWxsCisJICAgICBiZSBzYXRpc2ZpZWQgaW4gZWFjaCBmaWxlIGFzIGl0IGFwcGVhcnMuIFNvIHdlIHNraXAgdGhpcworCSAgICAgc2VjdGlvbi4gKi8KKwkgIDsKKyAgICAgICAgfQorICAgIH0KKworICBjdXJyZW50X29iamZpbGUgPSBOVUxMOworCisgIC8qIEluIGEgU29sYXJpcyBlbGYgZmlsZSwgdGhpcyB2YXJpYWJsZSwgd2hpY2ggY29tZXMgZnJvbSB0aGUKKyAgICAgdmFsdWUgb2YgdGhlIE5fU08gc3ltYm9sLCB3aWxsIHN0aWxsIGJlIDAuICBMdWNraWx5LCB0ZXh0X29mZnNldCwKKyAgICAgd2hpY2ggY29tZXMgZnJvbSBwc3QtPnRleHRsb3cgaXMgY29ycmVjdC4gKi8KKyAgaWYgKGxhc3Rfc291cmNlX3N0YXJ0X2FkZHIgPT0gMCkKKyAgICBsYXN0X3NvdXJjZV9zdGFydF9hZGRyID0gdGV4dF9vZmZzZXQ7CisKKyAgLyogSW4gcmVvcmRlcmVkIGV4ZWN1dGFibGVzIGxhc3Rfc291cmNlX3N0YXJ0X2FkZHIgbWF5IG5vdCBiZSB0aGUKKyAgICAgbG93ZXIgYm91bmQgZm9yIHRoaXMgc3ltdGFiLCBpbnN0ZWFkIHVzZSB0ZXh0X29mZnNldCB3aGljaCBjb21lcworICAgICBmcm9tIHBzdC0+dGV4dGxvdyB3aGljaCBpcyBjb3JyZWN0LiAgKi8KKyAgaWYgKGxhc3Rfc291cmNlX3N0YXJ0X2FkZHIgPiB0ZXh0X29mZnNldCkKKyAgICBsYXN0X3NvdXJjZV9zdGFydF9hZGRyID0gdGV4dF9vZmZzZXQ7CisKKyAgcHN0LT5zeW10YWIgPSBlbmRfc3ltdGFiICh0ZXh0X29mZnNldCArIHRleHRfc2l6ZSwgb2JqZmlsZSwgU0VDVF9PRkZfVEVYVCk7CisKKyAgLyogUHJvY2VzcyBpdGVtcyB3aGljaCB3ZSBoYWQgdG8gInByb2Nlc3NfbGF0ZXIiIGR1ZSB0byBkZXBlbmRhbmNpZXMgCisgICAgIG9uIG90aGVyIHN0YWJzLiAgKi8KKyAgcHJvY2Vzc19ub3cgKG9iamZpbGUpOwkKKworICBlbmRfc3RhYnMgKCk7Cit9CisKKwwKKy8qIFRoaXMgaGFuZGxlcyBhIHNpbmdsZSBzeW1ib2wgZnJvbSB0aGUgc3ltYm9sLWZpbGUsIGJ1aWxkaW5nIHN5bWJvbHMKKyAgIGludG8gYSBHREIgc3ltdGFiLiAgSXQgdGFrZXMgdGhlc2UgYXJndW1lbnRzIGFuZCBhbiBpbXBsaWNpdCBhcmd1bWVudC4KKworICAgVFlQRSBpcyB0aGUgdHlwZSBmaWVsZCBvZiB0aGUgIi5zdGFiIiBzeW1ib2wgZW50cnkuCisgICBERVNDIGlzIHRoZSBkZXNjIGZpZWxkIG9mIHRoZSAiLnN0YWIiIGVudHJ5LgorICAgVkFMVSBpcyB0aGUgdmFsdWUgZmllbGQgb2YgdGhlICIuc3RhYiIgZW50cnkuCisgICBOQU1FIGlzIHRoZSBzeW1ib2wgbmFtZSwgaW4gb3VyIGFkZHJlc3Mgc3BhY2UuCisgICBTRUNUSU9OX09GRlNFVFMgaXMgYSBzZXQgb2YgYW1vdW50cyBieSB3aGljaCB0aGUgc2VjdGlvbnMgb2YgdGhpcyBvYmplY3QKKyAgICAgICAgICBmaWxlIHdlcmUgcmVsb2NhdGVkIHdoZW4gaXQgd2FzIGxvYWRlZCBpbnRvIG1lbW9yeS4KKyAgICAgICAgICBBbGwgc3ltYm9scyB0aGF0IHJlZmVyCisJICB0byBtZW1vcnkgbG9jYXRpb25zIG5lZWQgdG8gYmUgb2Zmc2V0IGJ5IHRoZXNlIGFtb3VudHMuCisgICBPQkpGSUxFIGlzIHRoZSBvYmplY3QgZmlsZSBmcm9tIHdoaWNoIHdlIGFyZSByZWFkaW5nIHN5bWJvbHMuCisgCSAgICAgICBJdCBpcyB1c2VkIGluIGVuZF9zeW10YWIuICAqLworCit2b2lkCitwcm9jZXNzX29uZV9zeW1ib2wgKHR5cGUsIGRlc2MsIHZhbHUsIG5hbWUsIHNlY3Rpb25fb2Zmc2V0cywgb2JqZmlsZSkKKyAgICAgaW50IHR5cGUsIGRlc2M7CisgICAgIENPUkVfQUREUiB2YWx1OworICAgICBjaGFyICpuYW1lOworICAgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHM7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworI2lmZGVmIFNVTl9GSVhFRF9MQlJBQ19CVUcKKyAgLyogSWYgU1VOX0ZJWEVEX0xCUkFDX0JVRyBpcyBkZWZpbmVkLCB0aGVuIGl0IHRlbGxzIHVzIHdoZXRoZXIgd2UgbmVlZAorICAgICB0byBjb3JyZWN0IHRoZSBhZGRyZXNzIG9mIE5fTEJSQUMncy4gIElmIGl0IGlzIG5vdCBkZWZpbmVkLCB0aGVuCisgICAgIHdlIG5ldmVyIG5lZWQgdG8gY29ycmVjdCB0aGUgYWRkcmVzc2VzLiAgKi8KKworICAvKiBUaGlzIHJlY29yZHMgdGhlIGxhc3QgcGMgYWRkcmVzcyB3ZSd2ZSBzZWVuLiAgV2UgZGVwZW5kIG9uIHRoZXJlIGJlaW5nCisgICAgIGFuIFNMSU5FIG9yIEZVTiBvciBTTyBiZWZvcmUgdGhlIGZpcnN0IExCUkFDLCBzaW5jZSB0aGUgdmFyaWFibGUgZG9lcworICAgICBub3QgZ2V0IHJlc2V0IGluIGJldHdlZW4gcmVhZHMgb2YgZGlmZmVyZW50IHN5bWJvbCBmaWxlcy4gICovCisgIHN0YXRpYyBDT1JFX0FERFIgbGFzdF9wY19hZGRyZXNzOworI2VuZGlmCisKKyAgcmVnaXN0ZXIgc3RydWN0IGNvbnRleHRfc3RhY2sgKm5ldzsKKyAgLyogVGhpcyByZW1lbWJlcnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24uICBJdCBpcyB1c2VkCisgICAgIGJlY2F1c2UgaW4gU29sYXJpcyAyLCBOX0xCUkFDLCBOX1JCUkFDLCBhbmQgTl9TTElORSBlbnRyaWVzIGFyZQorICAgICByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBmdW5jdGlvbidzIHN0YXJ0IGFkZHJlc3MuICBPbiBzeXN0ZW1zCisgICAgIG90aGVyIHRoYW4gU29sYXJpcyAyLCB0aGlzIGp1c3QgaG9sZHMgdGhlIFNFQ1RfT0ZGX1RFWFQgdmFsdWUsIGFuZCBpcworICAgICB1c2VkIHRvIHJlbG9jYXRlIHRoZXNlIHN5bWJvbCB0eXBlcyByYXRoZXIgdGhhbiBTRUNUSU9OX09GRlNFVFMuICAqLworICBzdGF0aWMgQ09SRV9BRERSIGZ1bmN0aW9uX3N0YXJ0X29mZnNldDsKKworICAvKiBJZiB0aGlzIGlzIG5vbnplcm8sIHdlJ3ZlIHNlZW4gYSBub24tZ2NjIE5fT1BUIHN5bWJvbCBmb3IgdGhpcyBzb3VyY2UKKyAgICAgZmlsZS4gIFVzZWQgdG8gZGV0ZWN0IHRoZSBTdW5QUk8gc29sYXJpcyBjb21waWxlci4gICovCisgIHN0YXRpYyBpbnQgbl9vcHRfZm91bmQ7CisKKyAgLyogVGhlIHN0YWIgdHlwZSB1c2VkIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgbGFzdCBmdW5jdGlvbi4KKyAgICAgTl9TVFNZTSBvciBOX0dTWU0gZm9yIFN1bk9TNCBhY2M7IE5fRlVOIGZvciBvdGhlciBjb21waWxlcnMuICAqLworICBzdGF0aWMgaW50IGZ1bmN0aW9uX3N0YWJfdHlwZSA9IDA7CisKKyAgaWYgKCFibG9ja19hZGRyZXNzX2Z1bmN0aW9uX3JlbGF0aXZlKQorICAgIC8qIE5fTEJSQUMsIE5fUkJSQUMgYW5kIE5fU0xJTkUgZW50cmllcyBhcmUgbm90IHJlbGF0aXZlIHRvIHRoZQorICAgICAgIGZ1bmN0aW9uIHN0YXJ0IGFkZHJlc3MsIHNvIGp1c3QgdXNlIHRoZSB0ZXh0IG9mZnNldC4gICovCisgICAgZnVuY3Rpb25fc3RhcnRfb2Zmc2V0ID0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCk7CisKKyAgLyogU29tZXRoaW5nIGlzIHdyb25nIGlmIHdlIHNlZSByZWFsIGRhdGEgYmVmb3JlCisgICAgIHNlZWluZyBhIHNvdXJjZSBmaWxlIG5hbWUuICAqLworCisgIGlmIChsYXN0X3NvdXJjZV9maWxlID09IE5VTEwgJiYgdHlwZSAhPSAodW5zaWduZWQgY2hhcilOX1NPKQorICAgIHsKKyAgICAgIC8qIElnbm9yZSBhbnkgc3ltYm9scyB3aGljaCBhcHBlYXIgYmVmb3JlIGFuIE5fU08gc3ltYm9sLgorCSBDdXJyZW50bHkgbm8gb25lIHB1dHMgc3ltYm9scyB0aGVyZSwgYnV0IHdlIHNob3VsZCBkZWFsCisJIGdyYWNlZnVsbHkgd2l0aCB0aGUgY2FzZS4gIEEgY29tcGxhaW4oKXQgbWlnaHQgYmUgaW4gb3JkZXIsCisJIGJ1dCB0aGlzIHNob3VsZCBub3QgYmUgYW4gZXJyb3IgKCkuICAqLworICAgICAgcmV0dXJuOworICAgIH0KKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgTl9GVU46CisgICAgY2FzZSBOX0ZOQU1FOgorCisgICAgICBpZiAoKm5hbWUgPT0gJ1wwMDAnKQorCXsKKwkgIC8qIFRoaXMgTl9GVU4gbWFya3MgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uLiAgVGhpcyBjbG9zZXMgb2ZmIHRoZQorCSAgICAgY3VycmVudCBibG9jay4gICovCisJICB3aXRoaW5fZnVuY3Rpb24gPSAwOworCSAgbmV3ID0gcG9wX2NvbnRleHQgKCk7CisKKwkgIC8qIE1ha2UgYSBibG9jayBmb3IgdGhlIGxvY2FsIHN5bWJvbHMgd2l0aGluLiAgKi8KKwkgIGZpbmlzaF9ibG9jayAobmV3LT5uYW1lLCAmbG9jYWxfc3ltYm9scywgbmV3LT5vbGRfYmxvY2tzLAorCQkJbmV3LT5zdGFydF9hZGRyLCBuZXctPnN0YXJ0X2FkZHIgKyB2YWx1LAorCQkJb2JqZmlsZSk7CisKKwkgIC8qIE1heSBiZSBzd2l0Y2hpbmcgdG8gYW4gYXNzZW1ibGVyIGZpbGUgd2hpY2ggbWF5IG5vdCBiZSB1c2luZworCSAgICAgYmxvY2sgcmVsYXRpdmUgc3RhYnMsIHNvIHJlc2V0IHRoZSBvZmZzZXQuICAqLworCSAgaWYgKGJsb2NrX2FkZHJlc3NfZnVuY3Rpb25fcmVsYXRpdmUpCisJICAgIGZ1bmN0aW9uX3N0YXJ0X29mZnNldCA9IDA7CisKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogUmVsb2NhdGUgZm9yIGR5bmFtaWMgbG9hZGluZyAqLworICAgICAgdmFsdSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKTsKKyNpZmRlZiBTTUFTSF9URVhUX0FERFJFU1MKKyAgICAgIFNNQVNIX1RFWFRfQUREUkVTUyAodmFsdSk7CisjZW5kaWYKKyAgICAgIGdvdG8gZGVmaW5lX2Ffc3ltYm9sOworCisgICAgY2FzZSBOX0xCUkFDOgorICAgICAgLyogVGhpcyAic3ltYm9sIiBqdXN0IGluZGljYXRlcyB0aGUgc3RhcnQgb2YgYW4gaW5uZXIgbGV4aWNhbAorCSBjb250ZXh0IHdpdGhpbiBhIGZ1bmN0aW9uLiAgKi8KKworICAgICAgLyogSWdub3JlIGV4dHJhIG91dGVybW9zdCBjb250ZXh0IGZyb20gU3VuUFJPIGNjIGFuZCBhY2MuICAqLworICAgICAgaWYgKG5fb3B0X2ZvdW5kICYmIGRlc2MgPT0gMSkKKwlicmVhazsKKworICAgICAgaWYgKGJsb2NrX2FkZHJlc3NfZnVuY3Rpb25fcmVsYXRpdmUpCisJLyogUmVsb2NhdGUgZm9yIFN1biBFTEYgYWNjIGZuLXJlbGF0aXZlIHN5bXMuICAqLworCXZhbHUgKz0gZnVuY3Rpb25fc3RhcnRfb2Zmc2V0OworICAgICAgZWxzZQorCS8qIE9uIG1vc3QgbWFjaGluZXMsIHRoZSBibG9jayBhZGRyZXNzZXMgYXJlIHJlbGF0aXZlIHRvIHRoZQorCSAgIE5fU08sIHRoZSBsaW5rZXIgZGlkIG5vdCByZWxvY2F0ZSB0aGVtIChzaWdoKS4gICovCisJdmFsdSArPSBsYXN0X3NvdXJjZV9zdGFydF9hZGRyOworCisjaWZkZWYgU1VOX0ZJWEVEX0xCUkFDX0JVRworICAgICAgaWYgKCFTVU5fRklYRURfTEJSQUNfQlVHICYmIHZhbHUgPCBsYXN0X3BjX2FkZHJlc3MpIHsKKwkvKiBQYXRjaCBjdXJyZW50IExCUkFDIHBjIHZhbHVlIHRvIG1hdGNoIGxhc3QgaGFuZHkgcGMgdmFsdWUgKi8KKyAJY29tcGxhaW4gKCZsYnJhY19jb21wbGFpbnQpOworCXZhbHUgPSBsYXN0X3BjX2FkZHJlc3M7CisgICAgICB9CisjZW5kaWYKKyAgICAgIG5ldyA9IHB1c2hfY29udGV4dCAoZGVzYywgdmFsdSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTl9SQlJBQzoKKyAgICAgIC8qIFRoaXMgInN5bWJvbCIganVzdCBpbmRpY2F0ZXMgdGhlIGVuZCBvZiBhbiBpbm5lciBsZXhpY2FsCisJIGNvbnRleHQgdGhhdCB3YXMgc3RhcnRlZCB3aXRoIE5fTEJSQUMuICAqLworCisgICAgICAvKiBJZ25vcmUgZXh0cmEgb3V0ZXJtb3N0IGNvbnRleHQgZnJvbSBTdW5QUk8gY2MgYW5kIGFjYy4gICovCisgICAgICBpZiAobl9vcHRfZm91bmQgJiYgZGVzYyA9PSAxKQorCWJyZWFrOworCisgICAgICBpZiAoYmxvY2tfYWRkcmVzc19mdW5jdGlvbl9yZWxhdGl2ZSkKKwkvKiBSZWxvY2F0ZSBmb3IgU3VuIEVMRiBhY2MgZm4tcmVsYXRpdmUgc3ltcy4gICovCisJdmFsdSArPSBmdW5jdGlvbl9zdGFydF9vZmZzZXQ7CisgICAgICBlbHNlCisJLyogT24gbW9zdCBtYWNoaW5lcywgdGhlIGJsb2NrIGFkZHJlc3NlcyBhcmUgcmVsYXRpdmUgdG8gdGhlCisJICAgTl9TTywgdGhlIGxpbmtlciBkaWQgbm90IHJlbG9jYXRlIHRoZW0gKHNpZ2gpLiAgKi8KKwl2YWx1ICs9IGxhc3Rfc291cmNlX3N0YXJ0X2FkZHI7CisKKyAgICAgIG5ldyA9IHBvcF9jb250ZXh0KCk7CisgICAgICBpZiAoZGVzYyAhPSBuZXctPmRlcHRoKQorCWNvbXBsYWluICgmbGJyYWNfbWlzbWF0Y2hfY29tcGxhaW50LCBzeW1udW0pOworCisgICAgICAvKiBTb21lIGNvbXBpbGVycyBwdXQgdGhlIHZhcmlhYmxlIGRlY2xzIGluc2lkZSBvZiBhbgorICAgICAgICAgTEJSQUMvUkJSQUMgYmxvY2suICBUaGlzIG1hY3JvIHNob3VsZCBiZSBub256ZXJvIGlmIHRoaXMKKwkgaXMgdHJ1ZS4gIERFU0MgaXMgTl9ERVNDIGZyb20gdGhlIE5fUkJSQUMgc3ltYm9sLgorCSBHQ0NfUCBpcyB0cnVlIGlmIHdlJ3ZlIGRldGVjdGVkIHRoZSBHQ0NfQ09NUElMRURfU1lNQk9MCisJIG9yIHRoZSBHQ0MyX0NPTVBJTEVEX1NZTUJPTC4gICovCisjaWYgIWRlZmluZWQgKFZBUklBQkxFU19JTlNJREVfQkxPQ0spCisjZGVmaW5lIFZBUklBQkxFU19JTlNJREVfQkxPQ0soZGVzYywgZ2NjX3ApIDAKKyNlbmRpZgorCisgICAgICAvKiBDYW4gb25seSB1c2UgbmV3LT5sb2NhbHMgYXMgbG9jYWwgc3ltYm9scyBoZXJlIGlmIHdlJ3JlIGluCisgICAgICAgICBnY2Mgb3Igb24gYSBtYWNoaW5lIHRoYXQgcHV0cyB0aGVtIGJlZm9yZSB0aGUgbGJyYWNrLiAgKi8KKyAgICAgIGlmICghVkFSSUFCTEVTX0lOU0lERV9CTE9DSyhkZXNjLCBwcm9jZXNzaW5nX2djY19jb21waWxhdGlvbikpCisJbG9jYWxfc3ltYm9scyA9IG5ldy0+bG9jYWxzOworCisgICAgICBpZiAoY29udGV4dF9zdGFja19kZXB0aAorCSAgPiAhVkFSSUFCTEVTX0lOU0lERV9CTE9DSyhkZXNjLCBwcm9jZXNzaW5nX2djY19jb21waWxhdGlvbikpCisJeworCSAgLyogVGhpcyBpcyBub3QgdGhlIG91dGVybW9zdCBMQlJBQy4uLlJCUkFDIHBhaXIgaW4gdGhlIGZ1bmN0aW9uLAorCSAgICAgaXRzIGxvY2FsIHN5bWJvbHMgcHJlY2VkZWQgaXQsIGFuZCBhcmUgdGhlIG9uZXMganVzdCByZWNvdmVyZWQKKwkgICAgIGZyb20gdGhlIGNvbnRleHQgc3RhY2suICBEZWZpbmUgdGhlIGJsb2NrIGZvciB0aGVtIChidXQgZG9uJ3QKKwkgICAgIGJvdGhlciBpZiB0aGUgYmxvY2sgY29udGFpbnMgbm8gc3ltYm9scy4gIFNob3VsZCB3ZSBjb21wbGFpbgorCSAgICAgb24gYmxvY2tzIHdpdGhvdXQgc3ltYm9scz8gIEkgY2FuJ3QgdGhpbmsgb2YgYW55IHVzZWZ1bCBwdXJwb3NlCisJICAgICBmb3IgdGhlbSkuICAqLworCSAgaWYgKGxvY2FsX3N5bWJvbHMgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIC8qIE11enpsZSBhIGNvbXBpbGVyIGJ1ZyB0aGF0IG1ha2VzIGVuZCA8IHN0YXJ0LiAgKHdoaWNoCisJCSBjb21waWxlcnM/ICBJcyB0aGlzIGV2ZXIgaGFybWZ1bD8pLiAgKi8KKwkgICAgICBpZiAobmV3LT5zdGFydF9hZGRyID4gdmFsdSkKKwkJeworCQkgIGNvbXBsYWluICgmbGJyYWNfcmJyYWNfY29tcGxhaW50KTsKKwkJICBuZXctPnN0YXJ0X2FkZHIgPSB2YWx1OworCQl9CisJICAgICAgLyogTWFrZSBhIGJsb2NrIGZvciB0aGUgbG9jYWwgc3ltYm9scyB3aXRoaW4uICAqLworCSAgICAgIGZpbmlzaF9ibG9jayAoMCwgJmxvY2FsX3N5bWJvbHMsIG5ldy0+b2xkX2Jsb2NrcywKKwkJCSAgICBuZXctPnN0YXJ0X2FkZHIsIHZhbHUsIG9iamZpbGUpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFRoaXMgaXMgdGhlIG91dGVybW9zdCBMQlJBQy4uLlJCUkFDIHBhaXIuICBUaGVyZSBpcyBubworCSAgICAgbmVlZCB0byBkbyBhbnl0aGluZzsgbGVhdmUgdGhlIHN5bWJvbHMgdGhhdCBwcmVjZWRlZCBpdAorCSAgICAgdG8gYmUgYXR0YWNoZWQgdG8gdGhlIGZ1bmN0aW9uJ3Mgb3duIGJsb2NrLiAgV2UgbmVlZCB0bworCSAgICAgaW5kaWNhdGUgdGhhdCB3ZSBqdXN0IG1vdmVkIG91dHNpZGUgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KKwkgIHdpdGhpbl9mdW5jdGlvbiA9IDA7CisJfQorCisgICAgICBpZiAoVkFSSUFCTEVTX0lOU0lERV9CTE9DSyhkZXNjLCBwcm9jZXNzaW5nX2djY19jb21waWxhdGlvbikpCisJLyogTm93IHBvcCBsb2NhbHMgb2YgYmxvY2sganVzdCBmaW5pc2hlZC4gICovCisJbG9jYWxfc3ltYm9scyA9IG5ldy0+bG9jYWxzOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5fRk46CisgICAgY2FzZSBOX0ZOX1NFUToKKyAgICAgIC8qIFRoaXMga2luZCBvZiBzeW1ib2wgaW5kaWNhdGVzIHRoZSBzdGFydCBvZiBhbiBvYmplY3QgZmlsZS4gICovCisgICAgICAvKiBSZWxvY2F0ZSBmb3IgZHluYW1pYyBsb2FkaW5nICovCisgICAgICB2YWx1ICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5fU086CisgICAgICAvKiBUaGlzIHR5cGUgb2Ygc3ltYm9sIGluZGljYXRlcyB0aGUgc3RhcnQgb2YgZGF0YQorCSBmb3Igb25lIHNvdXJjZSBmaWxlLgorCSBGaW5pc2ggdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUgcHJldmlvdXMgc291cmNlIGZpbGUKKwkgKGlmIGFueSkgYW5kIHN0YXJ0IGFjY3VtdWxhdGluZyBhIG5ldyBzeW1ib2wgdGFibGUuICAqLworICAgICAgLyogUmVsb2NhdGUgZm9yIGR5bmFtaWMgbG9hZGluZyAqLworICAgICAgdmFsdSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKTsKKworICAgICAgbl9vcHRfZm91bmQgPSAwOworCisjaWZkZWYgU1VOX0ZJWEVEX0xCUkFDX0JVRworICAgICAgbGFzdF9wY19hZGRyZXNzID0gdmFsdTsJLyogU2F2ZSBmb3IgU3VuT1MgYnVnIGNpcmN1bWNpc2lvbiAqLworI2VuZGlmCisKKyNpZmRlZiBQQ0NfU09MX0JST0tFTgorICAgICAgLyogcGNjIGJ1Zywgb2NjYXNpb25hbGx5IHB1dHMgb3V0IFNPIGZvciBTT0wuICAqLworICAgICAgaWYgKGNvbnRleHRfc3RhY2tfZGVwdGggPiAwKQorCXsKKwkgIHN0YXJ0X3N1YmZpbGUgKG5hbWUsIE5VTEwpOworCSAgYnJlYWs7CisJfQorI2VuZGlmCisgICAgICBpZiAobGFzdF9zb3VyY2VfZmlsZSkKKwl7CisJICAvKiBDaGVjayBpZiBwcmV2aW91cyBzeW1ib2wgd2FzIGFsc28gYW4gTl9TTyAod2l0aCBzb21lCisJICAgICBzYW5pdHkgY2hlY2tzKS4gIElmIHNvLCB0aGF0IG9uZSB3YXMgYWN0dWFsbHkgdGhlIGRpcmVjdG9yeQorCSAgICAgbmFtZSwgYW5kIHRoZSBjdXJyZW50IG9uZSBpcyB0aGUgcmVhbCBmaWxlIG5hbWUuCisJICAgICBQYXRjaCB0aGluZ3MgdXAuICovCSAgIAorCSAgaWYgKHByZXZpb3VzX3N0YWJfY29kZSA9PSAodW5zaWduZWQgY2hhcikgTl9TTykKKwkgICAgeworCSAgICAgIHBhdGNoX3N1YmZpbGVfbmFtZXMgKGN1cnJlbnRfc3ViZmlsZSwgbmFtZSk7CisJICAgICAgYnJlYWs7CQkvKiBJZ25vcmUgcmVwZWF0ZWQgU09zICovCisJICAgIH0KKwkgIGVuZF9zeW10YWIgKHZhbHUsIG9iamZpbGUsIFNFQ1RfT0ZGX1RFWFQpOworCSAgZW5kX3N0YWJzICgpOworCX0KKworICAgICAgLyogTnVsbCBuYW1lIG1lYW5zIHRoaXMganVzdCBtYXJrcyB0aGUgZW5kIG9mIHRleHQgZm9yIHRoaXMgLm8gZmlsZS4KKwkgRG9uJ3Qgc3RhcnQgYSBuZXcgc3ltdGFiIGluIHRoaXMgY2FzZS4gICovCisgICAgICBpZiAoKm5hbWUgPT0gJ1wwMDAnKQorCWJyZWFrOworCisgICAgICBpZiAoYmxvY2tfYWRkcmVzc19mdW5jdGlvbl9yZWxhdGl2ZSkKKyAgICAgICAgZnVuY3Rpb25fc3RhcnRfb2Zmc2V0ID0gMDsKKworICAgICAgc3RhcnRfc3RhYnMgKCk7CisgICAgICBzdGFydF9zeW10YWIgKG5hbWUsIE5VTEwsIHZhbHUpOworICAgICAgcmVjb3JkX2RlYnVnZm9ybWF0ICgic3RhYnMiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOX1NPTDoKKyAgICAgIC8qIFRoaXMgdHlwZSBvZiBzeW1ib2wgaW5kaWNhdGVzIHRoZSBzdGFydCBvZiBkYXRhIGZvcgorCSBhIHN1Yi1zb3VyY2UtZmlsZSwgb25lIHdob3NlIGNvbnRlbnRzIHdlcmUgY29waWVkIG9yCisJIGluY2x1ZGVkIGluIHRoZSBjb21waWxhdGlvbiBvZiB0aGUgbWFpbiBzb3VyY2UgZmlsZQorCSAod2hvc2UgbmFtZSB3YXMgZ2l2ZW4gaW4gdGhlIE5fU08gc3ltYm9sLikgICovCisgICAgICAvKiBSZWxvY2F0ZSBmb3IgZHluYW1pYyBsb2FkaW5nICovCisgICAgICB2YWx1ICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOworICAgICAgc3RhcnRfc3ViZmlsZSAobmFtZSwgY3VycmVudF9zdWJmaWxlLT5kaXJuYW1lKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOX0JJTkNMOgorICAgICAgcHVzaF9zdWJmaWxlICgpOworICAgICAgYWRkX25ld19oZWFkZXJfZmlsZSAobmFtZSwgdmFsdSk7CisgICAgICBzdGFydF9zdWJmaWxlIChuYW1lLCBjdXJyZW50X3N1YmZpbGUtPmRpcm5hbWUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5fRUlOQ0w6CisgICAgICBzdGFydF9zdWJmaWxlIChwb3Bfc3ViZmlsZSAoKSwgY3VycmVudF9zdWJmaWxlLT5kaXJuYW1lKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOX0VYQ0w6CisgICAgICBhZGRfb2xkX2hlYWRlcl9maWxlIChuYW1lLCB2YWx1KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOX1NMSU5FOgorICAgICAgLyogVGhpcyB0eXBlIG9mICJzeW1ib2wiIHJlYWxseSBqdXN0IHJlY29yZHMKKwkgb25lIGxpbmUtbnVtYmVyIC0tIGNvcmUtYWRkcmVzcyBjb3JyZXNwb25kZW5jZS4KKwkgRW50ZXIgaXQgaW4gdGhlIGxpbmUgbGlzdCBmb3IgdGhpcyBzeW1ib2wgdGFibGUuICAqLworCisgICAgICAvKiBSZWxvY2F0ZSBmb3IgZHluYW1pYyBsb2FkaW5nIGFuZCBmb3IgRUxGIGFjYyBmbi1yZWxhdGl2ZSBzeW1zLiAgKi8KKyAgICAgIHZhbHUgKz0gZnVuY3Rpb25fc3RhcnRfb2Zmc2V0OworCisjaWZkZWYgU1VOX0ZJWEVEX0xCUkFDX0JVRworICAgICAgbGFzdF9wY19hZGRyZXNzID0gdmFsdTsJLyogU2F2ZSBmb3IgU3VuT1MgYnVnIGNpcmN1bWNpc2lvbiAqLworI2VuZGlmCisgICAgICByZWNvcmRfbGluZSAoY3VycmVudF9zdWJmaWxlLCBkZXNjLCB2YWx1KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOX0JDT01NOgorICAgICAgY29tbW9uX2Jsb2NrX3N0YXJ0IChuYW1lLCBvYmpmaWxlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOX0VDT01NOgorICAgICAgY29tbW9uX2Jsb2NrX2VuZCAob2JqZmlsZSk7CisgICAgICBicmVhazsKKworICAgIC8qIFRoZSBmb2xsb3dpbmcgc3ltYm9sIHR5cGVzIG5lZWQgdG8gaGF2ZSB0aGUgYXBwcm9wcmlhdGUgb2Zmc2V0IGFkZGVkCisgICAgICAgdG8gdGhlaXIgdmFsdWU7IHRoZW4gd2UgcHJvY2VzcyBzeW1ib2wgZGVmaW5pdGlvbnMgaW4gdGhlIG5hbWUuICAqLworCisgICAgY2FzZSBOX1NUU1lNOgkJLyogU3RhdGljIHN5bWJvbCBpbiBkYXRhIHNlZyAqLworICAgIGNhc2UgTl9MQ1NZTToJCS8qIFN0YXRpYyBzeW1ib2wgaW4gQlNTIHNlZyAqLworICAgIGNhc2UgTl9ST1NZTToJCS8qIFN0YXRpYyBzeW1ib2wgaW4gUmVhZC1vbmx5IGRhdGEgc2VnICovCisgICAgIC8qIEhPUlJJRCBIQUNLIERFUFQuICBIb3dldmVyLCBpdCdzIFN1bidzIGZ1cmdpbicgZmF1bHQuCisJU29sYXJpczIncyBzdGFicy1pbi1lbGYgbWFrZXMgKm1vc3QqIHN5bWJvbHMgcmVsYXRpdmUKKwlidXQgbGVhdmVzIGEgZmV3IGFic29sdXRlIChhdCBsZWFzdCBmb3IgU29sYXJpcyAyLjEgYW5kIHZlcnNpb24KKwkyLjAuMSBvZiB0aGUgU3VuUFJPIGNvbXBpbGVyKS4gIE5fU1RTWU0gYW5kIGZyaWVuZHMgc2l0IG9uIHRoZSBmZW5jZS4KKwkuc3RhYiAiZm9vOlMuLi4iLE5fU1RTWU0gCWlzIGFic29sdXRlIChsZCByZWxvY2F0ZXMgaXQpCisJLnN0YWIgImZvbzpWLi4uIixOX1NUU1lNCWlzIHJlbGF0aXZlIChzZWN0aW9uIGJhc2Ugc3VidHJhY3RlZCkuCisJVGhpcyBsZWF2ZXMgdXMgbm8gY2hvaWNlIGJ1dCB0byBzZWFyY2ggZm9yIHRoZSAnUycgb3IgJ1YnLi4uCisJKG9yIHBhc3MgdGhlIHdob2xlIHNlY3Rpb25fb2Zmc2V0cyBzdHVmZiBkb3duIE9ORSBNT1JFIGZ1bmN0aW9uCisJY2FsbCBsZXZlbCwgd2hpY2ggd2UgcmVhbGx5IGRvbid0IHdhbnQgdG8gZG8pLiAgKi8KKyAgICAgIHsKKwljaGFyICpwOworCisJLyogLm8gZmlsZXMgYW5kIE5MTXMgaGF2ZSBub24temVybyB0ZXh0IHNlZyBvZmZzZXRzLCBidXQgZG9uJ3QgbmVlZAorCSAgIHRoZWlyIHN0YXRpYyBzeW1zIG9mZnNldCBpbiB0aGlzIGZhc2hpb24uICBYWFggLSBUaGlzIGlzIHJlYWxseSBhCisJICAgY3JvY2sgdGhhdCBzaG91bGQgYmUgZml4ZWQgaW4gdGhlIHNvbGliIGhhbmRsaW5nIGNvZGUgc28gdGhhdCBJCisJICAgZG9uJ3QgaGF2ZSB0byB3b3JrIGFyb3VuZCBpdCBoZXJlLiAqLworCisJaWYgKCFzeW1maWxlX3JlbG9jYXRhYmxlKQorCSAgeworCSAgICBwID0gc3RyY2hyIChuYW1lLCAnOicpOworCSAgICBpZiAocCAhPSAwICYmIHBbMV0gPT0gJ1MnKQorCSAgICAgIHsKKwkJLyogVGhlIGxpbmtlciByZWxvY2F0ZWQgaXQuICBXZSBkb24ndCB3YW50IHRvIGFkZCBhbgorCQkgICBlbGZzdGFiX29mZnNldF9zZWN0aW9ucy10eXBlIG9mZnNldCwgYnV0IHdlICpkbyogd2FudAorCQkgICB0byBhZGQgd2hhdGV2ZXIgc29saWIuYyBwYXNzZWQgdG8gc3ltYm9sX2ZpbGVfYWRkIGFzCisJCSAgIGFkZHIgKHRoaXMgaXMga25vd24gdG8gYWZmZWN0IFN1bk9TNCwgYW5kIEkgc3VzcGVjdCBFTEYKKwkJICAgdG9vKS4gIFNpbmNlIGVsZnN0YWJfb2Zmc2V0X3NlY3Rpb25zIGN1cnJlbnRseSBkb2VzIG5vdAorCQkgICBtdWNrIHdpdGggdGhlIHRleHQgb2Zmc2V0ICh0aGVyZSBpcyBubyBUdGV4dC50ZXh0CisJCSAgIHN5bWJvbCksIHdlIGNhbiBnZXQgYWRkciBmcm9tIHRoZSB0ZXh0IG9mZnNldC4gIElmCisJCSAgIGVsZnN0YWJfb2Zmc2V0X3NlY3Rpb25zIGV2ZXIgc3RhcnRzIGRlYWxpbmcgd2l0aCB0aGUKKwkJICAgdGV4dCBvZmZzZXQsIGFuZCB3ZSBzdGlsbCBuZWVkIHRvIGRvIHRoaXMsIHdlIG5lZWQgdG8KKwkJICAgaW52ZW50IGEgU0VDVF9PRkZfQUREUl9LTFVER0Ugb3Igc29tZXRoaW5nLiAgKi8KKwkJdmFsdSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKTsKKwkJZ290byBkZWZpbmVfYV9zeW1ib2w7CisJICAgICAgfQorCSAgfQorCS8qIFNpbmNlIGl0J3Mgbm90IHRoZSBrbHVkZ2UgY2FzZSwgcmUtZGlzcGF0Y2ggdG8gdGhlIHJpZ2h0IGhhbmRsZXIuICovCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBOX1NUU1lNOiAJZ290byBjYXNlX05fU1RTWU07CisJY2FzZSBOX0xDU1lNOglnb3RvIGNhc2VfTl9MQ1NZTTsKKwljYXNlIE5fUk9TWU06CWdvdG8gY2FzZV9OX1JPU1lNOworCWRlZmF1bHQ6CWFib3J0KCk7CisJfQorICAgICAgfQorCisgICAgY2FzZV9OX1NUU1lNOgkJLyogU3RhdGljIHN5bWJvbCBpbiBkYXRhIHNlZyAqLworICAgIGNhc2UgTl9EU0xJTkU6CQkvKiBTb3VyY2UgbGluZSBudW1iZXIsIGRhdGEgc2VnICovCisgICAgICB2YWx1ICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX0RBVEEpOworICAgICAgZ290byBkZWZpbmVfYV9zeW1ib2w7CisKKyAgICBjYXNlX05fTENTWU06CQkvKiBTdGF0aWMgc3ltYm9sIGluIEJTUyBzZWcgKi8KKyAgICBjYXNlIE5fQlNMSU5FOgkJLyogU291cmNlIGxpbmUgbnVtYmVyLCBic3Mgc2VnICovCisgICAgLyogICBOX0JST1dTOglvdmVybGFwcyB3aXRoIE5fQlNMSU5FICovCisgICAgICB2YWx1ICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX0JTUyk7CisgICAgICBnb3RvIGRlZmluZV9hX3N5bWJvbDsKKworICAgIGNhc2VfTl9ST1NZTToJCS8qIFN0YXRpYyBzeW1ib2wgaW4gUmVhZC1vbmx5IGRhdGEgc2VnICovCisgICAgICB2YWx1ICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1JPREFUQSk7CisgICAgICBnb3RvIGRlZmluZV9hX3N5bWJvbDsKKworICAgIGNhc2UgTl9FTlRSWToJCS8qIEFsdGVybmF0ZSBlbnRyeSBwb2ludCAqLworICAgICAgLyogUmVsb2NhdGUgZm9yIGR5bmFtaWMgbG9hZGluZyAqLworICAgICAgdmFsdSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKTsKKyAgICAgIGdvdG8gZGVmaW5lX2Ffc3ltYm9sOworCisgICAgLyogVGhlIGZvbGxvd2luZyBzeW1ib2wgdHlwZXMgd2UgZG9uJ3Qga25vdyBob3cgdG8gcHJvY2Vzcy4gIEhhbmRsZQorICAgICAgIHRoZW0gaW4gYSAiZGVmYXVsdCIgd2F5LCBidXQgY29tcGxhaW4gdG8gcGVvcGxlIHdobyBjYXJlLiAgKi8KKyAgICBkZWZhdWx0OgorICAgIGNhc2UgTl9DQVRDSDoJCS8qIEV4Y2VwdGlvbiBoYW5kbGVyIGNhdGNoZXIgKi8KKyAgICBjYXNlIE5fRUhERUNMOgkJLyogRXhjZXB0aW9uIGhhbmRsZXIgbmFtZSAqLworICAgIGNhc2UgTl9QQzoJCQkvKiBHbG9iYWwgc3ltYm9sIGluIFBhc2NhbCAqLworICAgIGNhc2UgTl9NMkM6CQkJLyogTW9kdWxhLTIgY29tcGlsYXRpb24gdW5pdCAqLworICAgIC8qICAgTl9NT0QyOglvdmVybGFwcyB3aXRoIE5fRUhERUNMICovCisgICAgY2FzZSBOX1NDT1BFOgkJLyogTW9kdWxhLTIgc2NvcGUgaW5mb3JtYXRpb24gKi8KKyAgICBjYXNlIE5fRUNPTUw6CQkvKiBFbmQgY29tbW9uIChsb2NhbCBuYW1lKSAqLworICAgIGNhc2UgTl9OQlRFWFQ6CQkvKiBHb3VsZCBOb24tQmFzZS1SZWdpc3RlciBzeW1ib2xzPz8/ICovCisgICAgY2FzZSBOX05CREFUQToKKyAgICBjYXNlIE5fTkJCU1M6CisgICAgY2FzZSBOX05CU1RTOgorICAgIGNhc2UgTl9OQkxDUzoKKyAgICAgIGNvbXBsYWluICgmdW5rbm93bl9zeW10eXBlX2NvbXBsYWludCwgbG9jYWxfaGV4X3N0cmluZyAodHlwZSkpOworICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKworICAgIC8qIFRoZSBmb2xsb3dpbmcgc3ltYm9sIHR5cGVzIGRvbid0IG5lZWQgdGhlIGFkZHJlc3MgZmllbGQgcmVsb2NhdGVkLAorICAgICAgIHNpbmNlIGl0IGlzIGVpdGhlciB1bnVzZWQsIG9yIGlzIGFic29sdXRlLiAgKi8KKyAgICBkZWZpbmVfYV9zeW1ib2w6CisgICAgY2FzZSBOX0dTWU06CQkvKiBHbG9iYWwgdmFyaWFibGUgKi8KKyAgICBjYXNlIE5fTlNZTVM6CQkvKiBOdW1iZXIgb2Ygc3ltYm9scyAodWx0cml4KSAqLworICAgIGNhc2UgTl9OT01BUDoJCS8qIE5vIG1hcD8gICh1bHRyaXgpICovCisgICAgY2FzZSBOX1JTWU06CQkvKiBSZWdpc3RlciB2YXJpYWJsZSAqLworICAgIGNhc2UgTl9ERUZEOgkJLyogTW9kdWxhLTIgR05VIG1vZHVsZSBkZXBlbmRlbmN5ICovCisgICAgY2FzZSBOX1NTWU06CQkvKiBTdHJ1Y3Qgb3IgdW5pb24gZWxlbWVudCAqLworICAgIGNhc2UgTl9MU1lNOgkJLyogTG9jYWwgc3ltYm9sIGluIHN0YWNrICovCisgICAgY2FzZSBOX1BTWU06CQkvKiBQYXJhbWV0ZXIgdmFyaWFibGUgKi8KKyAgICBjYXNlIE5fTEVORzoJCS8qIExlbmd0aCBvZiBwcmVjZWRpbmcgc3ltYm9sIHR5cGUgKi8KKyAgICAgIGlmIChuYW1lKQorCXsKKwkgIGludCBkZWZ0eXBlOworCSAgY2hhciAqY29sb25fcG9zID0gc3RyY2hyIChuYW1lLCAnOicpOworCSAgaWYgKGNvbG9uX3BvcyA9PSBOVUxMKQorCSAgICBkZWZ0eXBlID0gJ1wwJzsKKwkgIGVsc2UKKwkgICAgZGVmdHlwZSA9IGNvbG9uX3Bvc1sxXTsKKworCSAgc3dpdGNoIChkZWZ0eXBlKQorCSAgICB7CisJICAgIGNhc2UgJ2YnOgorCSAgICBjYXNlICdGJzoKKwkgICAgICBmdW5jdGlvbl9zdGFiX3R5cGUgPSB0eXBlOworCisjaWZkZWYgU09GVU5fQUREUkVTU19NQVlCRV9NSVNTSU5HCisJICAgICAgLyogRGVhbCB3aXRoIHRoZSBTdW5QUk8gMy4wIGNvbXBpbGVyIHdoaWNoIG9taXRzIHRoZSBhZGRyZXNzCisgICAgICAgICAgICAgICAgIGZyb20gTl9GVU4gc3ltYm9scy4gICovCisJICAgICAgaWYgKHR5cGUgPT0gTl9GVU4KKwkJICAmJiB2YWx1ID09IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpKQorCQl7CisJCSAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltOworCQkgIGNoYXIgKnA7CisJCSAgaW50IG47CisKKwkJICBwID0gc3RyY2hyIChuYW1lLCAnOicpOworCQkgIGlmIChwID09IE5VTEwpCisJCSAgICBwID0gbmFtZTsKKwkJICBuID0gcCAtIG5hbWU7CisJCSAgcCA9IGFsbG9jYSAobiArIDIpOworCQkgIHN0cm5jcHkgKHAsIG5hbWUsIG4pOworCQkgIHBbbl0gPSAwOworCisJCSAgbXN5bSA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAocCwgbGFzdF9zb3VyY2VfZmlsZSwKKwkJCQkJCW9iamZpbGUpOworCQkgIGlmIChtc3ltID09IE5VTEwpCisJCSAgICB7CisJCSAgICAgIC8qIFN1biBGb3J0cmFuIGFwcGVuZHMgYW4gdW5kZXJzY29yZSB0byB0aGUgbWluaW1hbAorCQkJIHN5bWJvbCBuYW1lLCB0cnkgYWdhaW4gd2l0aCBhbiBhcHBlbmRlZCB1bmRlcnNjb3JlCisJCQkgaWYgdGhlIG1pbmltYWwgc3ltYm9sIHdhcyBub3QgZm91bmQuICAqLworCQkgICAgICBwW25dID0gJ18nOworCQkgICAgICBwW24gKyAxXSA9IDA7CisJCSAgICAgIG1zeW0gPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKHAsIGxhc3Rfc291cmNlX2ZpbGUsCisJCQkJCQkgICAgb2JqZmlsZSk7CisJCSAgICB9CisJCSAgaWYgKG1zeW0pCisJCSAgICB2YWx1ID0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW0pOworCQl9CisjZW5kaWYKKworI2lmZGVmIFNVTl9GSVhFRF9MQlJBQ19CVUcKKwkgICAgICAvKiBUaGUgU3VuIGFjYyBjb21waWxlciwgdW5kZXIgU3VuT1M0LCBwdXRzIG91dAorCQkgZnVuY3Rpb25zIHdpdGggTl9HU1lNIG9yIE5fU1RTWU0uICBUaGUgcHJvYmxlbSBpcworCQkgdGhhdCB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIGlzIG5vIGdvb2QgKGZvciBOX0dTWU0KKwkJIGl0IGRvZXNuJ3QgZXZlbiBhdHRlcHQgYW4gYWRkcmVzczsgZm9yIE5fU1RTWU0gaXQKKwkJIHB1dHMgb3V0IGFuIGFkZHJlc3MgYnV0IHRoZW4gaXQgZ2V0cyByZWxvY2F0ZWQKKwkJIHJlbGF0aXZlIHRvIHRoZSBkYXRhIHNlZ21lbnQsIG5vdCB0aGUgdGV4dCBzZWdtZW50KS4KKwkJIEN1cnJlbnRseSB3ZSBjYW4ndCBmaXggdGhpcyB1cCBsYXRlciBhcyB3ZSBkbyBmb3IKKwkJIHNvbWUgdHlwZXMgb2Ygc3ltYm9sIGluIHNjYW5fZmlsZV9nbG9iYWxzLgorCQkgRm9ydHVuYXRlbHkgd2UgZG8gaGF2ZSBhIHdheSBvZiBmaW5kaW5nIHRoZSBhZGRyZXNzIC0KKwkJIHdlIGtub3cgdGhhdCB0aGUgdmFsdWUgaW4gbGFzdF9wY19hZGRyZXNzIGlzIGVpdGhlcgorCQkgdGhlIG9uZSB3ZSB3YW50IChpZiB3ZSdyZSBkZWFsaW5nIHdpdGggdGhlIGZpcnN0CisJCSBmdW5jdGlvbiBpbiBhbiBvYmplY3QgZmlsZSksIG9yIHNvbWV3aGVyZSBpbiB0aGUKKwkJIHByZXZpb3VzIGZ1bmN0aW9uLiBUaGlzIG1lYW5zIHRoYXQgd2UgY2FuIHVzZSB0aGUKKwkJIG1pbmltYWwgc3ltYm9sIHRhYmxlIHRvIGdldCB0aGUgYWRkcmVzcy4gICovCisKKwkgICAgICAvKiBTdGFydGluZyB3aXRoIHJlbGVhc2UgMy4wLCB0aGUgU3VuIGFjYyBjb21waWxlciwKKwkJIHVuZGVyIFN1bk9TNCwgcHV0cyBvdXQgZnVuY3Rpb25zIHdpdGggTl9GVU4gYW5kIGEgdmFsdWUKKwkJIG9mIHplcm8uIFRoaXMgZ2V0cyByZWxvY2F0ZWQgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0CisJCSBzZWdtZW50IG9mIHRoZSBtb2R1bGUsIHdoaWNoIGlzIG5vIGdvb2QgZWl0aGVyLgorCQkgVW5kZXIgU3VuT1M0IHdlIGNhbiBkZWFsIHdpdGggdGhpcyBhcyBOX1NMSU5FIGFuZCBOX1NPCisJCSBlbnRyaWVzIGNvbnRhaW4gdmFsaWQgYWJzb2x1dGUgYWRkcmVzc2VzLgorCQkgUmVsZWFzZSAzLjAgYWNjIGFsc28gcHV0cyBvdXQgTl9PUFQgZW50cmllcywgd2hpY2ggbWFrZXMKKwkJIGl0IHBvc3NpYmxlIHRvIGRpc2Nlcm4gYWNjIGZyb20gY2Mgb3IgZ2NjLiAgKi8KKworCSAgICAgIGlmICh0eXBlID09IE5fR1NZTSB8fCB0eXBlID09IE5fU1RTWU0KKwkJICB8fCAodHlwZSA9PSBOX0ZVTgorCQkgICAgICAmJiBuX29wdF9mb3VuZCAmJiAhYmxvY2tfYWRkcmVzc19mdW5jdGlvbl9yZWxhdGl2ZSkpCisJCXsKKwkJICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm07CisJCSAgaW50IGwgPSBjb2xvbl9wb3MgLSBuYW1lOworCisJCSAgbSA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbF9ieV9wYyAobGFzdF9wY19hZGRyZXNzKTsKKwkJICBpZiAobSAmJiBTVFJFUU4gKFNZTUJPTF9OQU1FIChtKSwgbmFtZSwgbCkKKwkJICAgICAgJiYgU1lNQk9MX05BTUUgKG0pIFtsXSA9PSAnXDAnKQorCQkgICAgLyogbGFzdF9wY19hZGRyZXNzIHdhcyBpbiB0aGlzIGZ1bmN0aW9uICovCisJCSAgICB2YWx1ID0gU1lNQk9MX1ZBTFVFIChtKTsKKwkJICBlbHNlIGlmIChtICYmIFNZTUJPTF9OQU1FIChtKzEpCisJCQkgICAmJiBTVFJFUU4gKFNZTUJPTF9OQU1FIChtKzEpLCBuYW1lLCBsKQorCQkJICAgJiYgU1lNQk9MX05BTUUgKG0rMSkgW2xdID09ICdcMCcpCisJCSAgICAvKiBsYXN0X3BjX2FkZHJlc3Mgd2FzIGluIGxhc3QgZnVuY3Rpb24gKi8KKwkJICAgIHZhbHUgPSBTWU1CT0xfVkFMVUUgKG0rMSk7CisJCSAgZWxzZQorCQkgICAgLyogTm90IGZvdW5kIC0gdXNlIGxhc3RfcGNfYWRkcmVzcyAoZm9yIGZpbmlzaF9ibG9jaykgKi8KKwkJICAgIHZhbHUgPSBsYXN0X3BjX2FkZHJlc3M7CisJCX0KKworCSAgICAgIGxhc3RfcGNfYWRkcmVzcyA9IHZhbHU7CS8qIFNhdmUgZm9yIFN1bk9TIGJ1ZyBjaXJjdW1jaXNpb24gKi8KKyNlbmRpZgorCisJICAgICAgaWYgKGJsb2NrX2FkZHJlc3NfZnVuY3Rpb25fcmVsYXRpdmUpCisJCS8qIEZvciBTb2xhcmlzIDIuMCBjb21waWxlcnMsIHRoZSBibG9jayBhZGRyZXNzZXMgYW5kCisJCSAgIE5fU0xJTkUncyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZQorCQkgICBmdW5jdGlvbi4gIE9uIG5vcm1hbCBzeXN0ZW1zLCBhbmQgd2hlbiB1c2luZyBnY2Mgb24KKwkJICAgU29sYXJpcyAyLjAsIHRoZXNlIGFkZHJlc3NlcyBhcmUganVzdCBhYnNvbHV0ZSwgb3IKKwkJICAgcmVsYXRpdmUgdG8gdGhlIE5fU08sIGRlcGVuZGluZyBvbgorCQkgICBCTE9DS19BRERSRVNTX0FCU09MVVRFLiAgKi8KKwkJZnVuY3Rpb25fc3RhcnRfb2Zmc2V0ID0gdmFsdTsJCisKKwkgICAgICB3aXRoaW5fZnVuY3Rpb24gPSAxOworCSAgICAgIGlmIChjb250ZXh0X3N0YWNrX2RlcHRoID4gMCkKKwkJeworCQkgIG5ldyA9IHBvcF9jb250ZXh0ICgpOworCQkgIC8qIE1ha2UgYSBibG9jayBmb3IgdGhlIGxvY2FsIHN5bWJvbHMgd2l0aGluLiAgKi8KKwkJICBmaW5pc2hfYmxvY2sgKG5ldy0+bmFtZSwgJmxvY2FsX3N5bWJvbHMsIG5ldy0+b2xkX2Jsb2NrcywKKwkJCQluZXctPnN0YXJ0X2FkZHIsIHZhbHUsIG9iamZpbGUpOworCQl9CisJICAgICAgLyogU3RhY2sgbXVzdCBiZSBlbXB0eSBub3cuICAqLworCSAgICAgIGlmIChjb250ZXh0X3N0YWNrX2RlcHRoICE9IDApCisJCWNvbXBsYWluICgmbGJyYWNfdW5tYXRjaGVkX2NvbXBsYWludCwgc3ltbnVtKTsKKworCSAgICAgIG5ldyA9IHB1c2hfY29udGV4dCAoMCwgdmFsdSk7CisJICAgICAgbmV3LT5uYW1lID0gZGVmaW5lX3N5bWJvbCAodmFsdSwgbmFtZSwgZGVzYywgdHlwZSwgb2JqZmlsZSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBkZWZpbmVfc3ltYm9sICh2YWx1LCBuYW1lLCBkZXNjLCB0eXBlLCBvYmpmaWxlKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGJyZWFrOworCisgICAgLyogV2UgdXNlIE5fT1BUIHRvIGNhcnJ5IHRoZSBnY2MyX2NvbXBpbGVkIGZsYWcuICBTdW4gdXNlcyBpdAorICAgICAgIGZvciBhIGJ1bmNoIG9mIG90aGVyIGZsYWdzLCB0b28uICBTb21lZGF5IHdlIG1heSBwYXJzZSB0aGVpcgorICAgICAgIGZsYWdzOyBmb3Igbm93IHdlIGlnbm9yZSB0aGVpcnMgYW5kIGhvcGUgdGhleSdsbCBpZ25vcmUgb3Vycy4gICovCisgICAgY2FzZSBOX09QVDoJCQkvKiBTb2xhcmlzIDI6ICBDb21waWxlciBvcHRpb25zICovCisgICAgICBpZiAobmFtZSkKKwl7CisJICBpZiAoU1RSRVEgKG5hbWUsIEdDQzJfQ09NUElMRURfRkxBR19TWU1CT0wpKQorCSAgICB7CisJICAgICAgcHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24gPSAyOworI2lmIDEJICAgICAgLyogV29ya3MsIGJ1dCBpcyBleHBlcmltZW50YWwuICAtZm5mICovCisJICAgICAgaWYgKEFVVE9fREVNQU5HTElORykKKwkJeworCQkgIHNldF9kZW1hbmdsaW5nX3N0eWxlIChHTlVfREVNQU5HTElOR19TVFlMRV9TVFJJTkcpOworCQl9CisjZW5kaWYKKwkgICAgfQorCSAgZWxzZQorCSAgICBuX29wdF9mb3VuZCA9IDE7CisJfQorICAgICAgYnJlYWs7CisKKyAgICAvKiBUaGUgZm9sbG93aW5nIHN5bWJvbCB0eXBlcyBjYW4gYmUgaWdub3JlZC4gICovCisgICAgY2FzZSBOX09CSjoJCQkvKiBTb2xhcmlzIDI6ICBPYmplY3QgZmlsZSBkaXIgYW5kIG5hbWUgKi8KKyAgICAvKiAgIE5fVU5ERjogCQkgICBTb2xhcmlzIDI6ICBmaWxlIHNlcGFyYXRvciBtYXJrICovCisgICAgLyogICBOX1VOREY6IC0tIHdlIHdpbGwgbmV2ZXIgZW5jb3VudGVyIGl0LCBzaW5jZSB3ZSBvbmx5IHByb2Nlc3Mgb25lCisJCSAgICBmaWxlJ3Mgc3ltYm9scyBhdCBvbmNlLiAgKi8KKyAgICBjYXNlIE5fRU5ETToJCS8qIFNvbGFyaXMgMjogIEVuZCBvZiBtb2R1bGUgKi8KKyAgICBjYXNlIE5fTUFJTjoJCS8qIE5hbWUgb2YgbWFpbiByb3V0aW5lLiAgKi8KKyAgICBjYXNlIE5fQUxJQVM6CQkvKiBTdW5Qcm8gRjc3OiBhbGlhcyBuYW1lLCBpZ25vcmUgZm9yIG5vdy4gICovCisgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogJyMnIGlzIGEgR05VIEMgZXh0ZW5zaW9uIHRvIGFsbG93IG9uZSBzeW1ib2wgdG8gcmVmZXIgdG8gYW5vdGhlcgorICAgICByZWxhdGVkIHN5bWJvbC4KKworICAgICBHZW5lcmFsbHkgdGhpcyBpcyB1c2VkIHNvIHRoYXQgYW4gYWxpYXMgY2FuIHJlZmVyIHRvIGl0cyBtYWluCisgICAgIHN5bWJvbC4gICovICAKKyAgaWYgKG5hbWVbMF0gPT0gJyMnKQorICAgIHsKKyAgICAgIC8qIEluaXRpYWxpemUgc3ltYm9sIHJlZmVyZW5jZSBuYW1lcyBhbmQgZGV0ZXJtaW5lIGlmIHRoaXMgaXMgCisgICAgICAgICBhIGRlZmluaXRpb24uICBJZiBzeW1ib2wgcmVmZXJlbmNlIGlzIGJlaW5nIGRlZmluZWQsIGdvIAorICAgICAgICAgYWhlYWQgYW5kIGFkZCBpdC4gIE90aGVyd2lzZSwganVzdCByZXR1cm4gc3ltLiAqLworCisgICAgICBjaGFyICpzID0gbmFtZTsKKyAgICAgIGludCByZWZudW07CisKKyAgICAgIC8qIElmIHRoaXMgc3RhYiBkZWZpbmVzIGEgbmV3IHJlZmVyZW5jZSBJRCB0aGF0IGlzIG5vdCBvbiB0aGUKKwkgcmVmZXJlbmNlIGxpc3QsIHRoZW4gcHV0IGl0IG9uIHRoZSByZWZlcmVuY2UgbGlzdC4KKworCSBXZSBnbyBhaGVhZCBhbmQgYWR2YW5jZSBOQU1FIHBhc3QgdGhlIHJlZmVyZW5jZSwgZXZlbiB0aG91Z2gKKwkgaXQgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSBhdCB0aGlzIHRpbWUuICAqLworICAgICAgcmVmbnVtID0gc3ltYm9sX3JlZmVyZW5jZV9kZWZpbmVkICgmcyk7CisgICAgICBpZiAocmVmbnVtID49IDApCisJaWYgKCFyZWZfc2VhcmNoIChyZWZudW0pKQorCSAgcmVmX2FkZCAocmVmbnVtLCAwLCBuYW1lLCB2YWx1KTsKKyAgICAgIG5hbWUgPSBzOworICAgIH0KKworCisgIHByZXZpb3VzX3N0YWJfY29kZSA9IHR5cGU7Cit9CisMCisvKiBGSVhNRTogVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIGVsZnN0YWJfYnVpbGRfcHN5bXRhYnMKKyAgIGlzIHRoZSBjYWxsIHRvIGluc3RhbGxfbWluaW1hbF9zeW1ib2xzIGZvciBlbGYsIGFuZCB0aGUgc3VwcG9ydCBmb3IKKyAgIHNwbGl0IHNlY3Rpb25zLiAgSWYgdGhlIGRpZmZlcmVuY2VzIGFyZSByZWFsbHkgdGhhdCBzbWFsbCwgdGhlIGNvZGUKKyAgIHNob3VsZCBiZSBzaGFyZWQuICAqLworCisvKiBTY2FuIGFuZCBidWlsZCBwYXJ0aWFsIHN5bWJvbHMgZm9yIGFuIGNvZmYgc3ltYm9sIGZpbGUuCisgICBUaGUgY29mZiBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIHRvIGdldCBpdHMgbWluaW1hbCBzeW1ib2xzLgorCisgICBUaGlzIHJvdXRpbmUgaXMgdGhlIGVxdWl2YWxlbnQgb2YgZGJ4X3N5bWZpbGVfaW5pdCBhbmQgZGJ4X3N5bWZpbGVfcmVhZAorICAgcm9sbGVkIGludG8gb25lLgorCisgICBPQkpGSUxFIGlzIHRoZSBvYmplY3QgZmlsZSB3ZSBhcmUgcmVhZGluZyBzeW1ib2xzIGZyb20uCisgICBBRERSIGlzIHRoZSBhZGRyZXNzIHJlbGF0aXZlIHRvIHdoaWNoIHRoZSBzeW1ib2xzIGFyZSAoZS5nLgorICAgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgdGV4dCBzZWdtZW50KS4KKyAgIE1BSU5MSU5FIGlzIHRydWUgaWYgd2UgYXJlIHJlYWRpbmcgdGhlIG1haW4gc3ltYm9sCisgICB0YWJsZSAoYXMgb3Bwb3NlZCB0byBhIHNoYXJlZCBsaWIgb3IgZHluYW1pY2FsbHkgbG9hZGVkIGZpbGUpLgorICAgVEVYVEFERFIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHRleHQgc2VjdGlvbi4KKyAgIFRFWFRTSVpFIGlzIHRoZSBzaXplIG9mIHRoZSB0ZXh0IHNlY3Rpb24uCisgICBTVEFCU0VDVFMgaXMgdGhlIGxpc3Qgb2YgLnN0YWIgc2VjdGlvbnMgaW4gT0JKRklMRS4KKyAgIFNUQUJTVFJPRkZTRVQgYW5kIFNUQUJTVFJTSVpFIGRlZmluZSB0aGUgbG9jYXRpb24gaW4gT0JKRklMRSB3aGVyZSB0aGUKKyAgIC5zdGFic3RyIHNlY3Rpb24gZXhpc3RzLgorCisgICBUaGlzIHJvdXRpbmUgaXMgbW9zdGx5IGNvcGllZCBmcm9tIGRieF9zeW1maWxlX2luaXQgYW5kIGRieF9zeW1maWxlX3JlYWQsCisgICBhZGp1c3RlZCBmb3IgY29mZiBkZXRhaWxzLiAqLworCit2b2lkCitjb2Zmc3RhYl9idWlsZF9wc3ltdGFicyAob2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzLCBtYWlubGluZSwgCisJCQkgICAgICAgdGV4dGFkZHIsIHRleHRzaXplLCBzdGFic2VjdHMsCisJCQkgICAgICAgc3RhYnN0cm9mZnNldCwgc3RhYnN0cnNpemUpCisgICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKyAgICAgIGludCBtYWlubGluZTsKKyAgICAgIENPUkVfQUREUiB0ZXh0YWRkcjsKKyAgICAgIHVuc2lnbmVkIGludCB0ZXh0c2l6ZTsKKyAgICAgIHN0cnVjdCBzdGFiX3NlY3Rpb25fbGlzdCAqc3RhYnNlY3RzOworICAgICAgZmlsZV9wdHIgc3RhYnN0cm9mZnNldDsKKyAgICAgIHVuc2lnbmVkIGludCBzdGFic3Ryc2l6ZTsKK3sKKyAgaW50IHZhbDsKKyAgYmZkICpzeW1fYmZkID0gb2JqZmlsZS0+b2JmZDsKKyAgY2hhciAqbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKHN5bV9iZmQpOworICBzdHJ1Y3QgZGJ4X3N5bWZpbGVfaW5mbyAqaW5mbzsKKyAgdW5zaWduZWQgaW50IHN0YWJzaXplOworCisgIC8qIFRoZXJlIGlzIGFscmVhZHkgYSBkYnhfc3ltZmlsZV9pbmZvIGFsbG9jYXRlZCBieSBvdXIgY2FsbGVyLgorICAgICBJdCBtaWdodCBldmVuIGNvbnRhaW4gc29tZSBpbmZvIGZyb20gdGhlIGNvZmYgc3ltdGFiIHRvIGhlbHAgdXMuICAqLworICBpbmZvID0gb2JqZmlsZS0+c3ltX3N0YWJfaW5mbzsKKworICBEQlhfVEVYVF9BRERSIChvYmpmaWxlKSA9IHRleHRhZGRyOworICBEQlhfVEVYVF9TSVpFIChvYmpmaWxlKSA9IHRleHRzaXplOworCisjZGVmaW5lCUNPRkZfU1RBQlNfU1lNQk9MX1NJWkUJMTIJLyogWFhYIEZJWE1FIFhYWCAqLworICBEQlhfU1lNQk9MX1NJWkUgICAgKG9iamZpbGUpID0gQ09GRl9TVEFCU19TWU1CT0xfU0laRTsKKyAgREJYX1NUUklOR1RBQl9TSVpFIChvYmpmaWxlKSA9IHN0YWJzdHJzaXplOworICAKKyAgaWYgKHN0YWJzdHJzaXplID4gYmZkX2dldF9zaXplIChzeW1fYmZkKSkKKyAgICBlcnJvciAoInJpZGljdWxvdXMgc3RyaW5nIHRhYmxlIHNpemU6ICVkIGJ5dGVzIiwgc3RhYnN0cnNpemUpOworICBEQlhfU1RSSU5HVEFCIChvYmpmaWxlKSA9IChjaGFyICopCisgICAgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnBzeW1ib2xfb2JzdGFjaywgc3RhYnN0cnNpemUrMSk7CisgIE9CSlNUQVQgKG9iamZpbGUsIHN6X3N0cnRhYiArPSBzdGFic3Ryc2l6ZSsxKTsKKworICAvKiBOb3cgcmVhZCBpbiB0aGUgc3RyaW5nIHRhYmxlIGluIG9uZSBiaWcgZ3VscC4gICovCisKKyAgdmFsID0gYmZkX3NlZWsgKHN5bV9iZmQsIHN0YWJzdHJvZmZzZXQsIFNFRUtfU0VUKTsKKyAgaWYgKHZhbCA8IDApCisgICAgcGVycm9yX3dpdGhfbmFtZSAobmFtZSk7CisgIHZhbCA9IGJmZF9yZWFkIChEQlhfU1RSSU5HVEFCIChvYmpmaWxlKSwgc3RhYnN0cnNpemUsIDEsIHN5bV9iZmQpOworICBpZiAodmFsICE9IHN0YWJzdHJzaXplKQorICAgIHBlcnJvcl93aXRoX25hbWUgKG5hbWUpOworCisgIHN0YWJzcmVhZF9uZXdfaW5pdCAoKTsKKyAgYnVpbGRzeW1fbmV3X2luaXQgKCk7CisgIGZyZWVfaGVhZGVyX2ZpbGVzICgpOworICBpbml0X2hlYWRlcl9maWxlcyAoKTsKKworICBwcm9jZXNzaW5nX2FjY19jb21waWxhdGlvbiA9IDE7CisKKyAgLyogSW4gYSBjb2ZmIGZpbGUsIHdlJ3ZlIGFscmVhZHkgaW5zdGFsbGVkIHRoZSBtaW5pbWFsIHN5bWJvbHMgdGhhdCBjYW1lCisgICAgIGZyb20gdGhlIGNvZmYgKG5vbi1zdGFiKSBzeW1ib2wgdGFibGUsIHNvIGFsd2F5cyBhY3QgbGlrZSBhbgorICAgICBpbmNyZW1lbnRhbCBsb2FkIGhlcmUuICovCisgIGlmIChzdGFic2VjdHMtPm5leHQgPT0gTlVMTCkKKyAgICB7CisgICAgICBzdGFic2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKHN5bV9iZmQsIHN0YWJzZWN0cy0+c2VjdGlvbik7CisgICAgICBEQlhfU1lNQ09VTlQgKG9iamZpbGUpID0gc3RhYnNpemUgLyBEQlhfU1lNQk9MX1NJWkUgKG9iamZpbGUpOworICAgICAgREJYX1NZTVRBQl9PRkZTRVQgKG9iamZpbGUpID0gc3RhYnNlY3RzLT5zZWN0aW9uLT5maWxlcG9zOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCBzdGFiX3NlY3Rpb25fbGlzdCAqc3RhYnNlY3Q7CisKKyAgICAgIERCWF9TWU1DT1VOVCAob2JqZmlsZSkgPSAwOworICAgICAgZm9yIChzdGFic2VjdCA9IHN0YWJzZWN0czsgc3RhYnNlY3QgIT0gTlVMTDsgc3RhYnNlY3QgPSBzdGFic2VjdC0+bmV4dCkKKwl7CisJICBzdGFic2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKHN5bV9iZmQsIHN0YWJzZWN0LT5zZWN0aW9uKTsKKwkgIERCWF9TWU1DT1VOVCAob2JqZmlsZSkgKz0gc3RhYnNpemUgLyBEQlhfU1lNQk9MX1NJWkUgKG9iamZpbGUpOworCX0KKworICAgICAgREJYX1NZTVRBQl9PRkZTRVQgKG9iamZpbGUpID0gc3RhYnNlY3RzLT5zZWN0aW9uLT5maWxlcG9zOworCisgICAgICBzeW1idWZfc2VjdGlvbnMgPSBzdGFic2VjdHMtPm5leHQ7CisgICAgICBzeW1idWZfbGVmdCA9IGJmZF9zZWN0aW9uX3NpemUgKHN5bV9iZmQsIHN0YWJzZWN0cy0+c2VjdGlvbik7CisgICAgICBzeW1idWZfcmVhZCA9IDA7CisgICAgfQorCisgIGRieF9zeW1maWxlX3JlYWQgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywgMCk7Cit9CisMCisvKiBTY2FuIGFuZCBidWlsZCBwYXJ0aWFsIHN5bWJvbHMgZm9yIGFuIEVMRiBzeW1ib2wgZmlsZS4KKyAgIFRoaXMgRUxGIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgdG8gZ2V0IGl0cyBtaW5pbWFsIHN5bWJvbHMsCisgICBhbmQgYW55IERXQVJGIHN5bWJvbHMgdGhhdCB3ZXJlIGluIGl0LgorCisgICBUaGlzIHJvdXRpbmUgaXMgdGhlIGVxdWl2YWxlbnQgb2YgZGJ4X3N5bWZpbGVfaW5pdCBhbmQgZGJ4X3N5bWZpbGVfcmVhZAorICAgcm9sbGVkIGludG8gb25lLgorCisgICBPQkpGSUxFIGlzIHRoZSBvYmplY3QgZmlsZSB3ZSBhcmUgcmVhZGluZyBzeW1ib2xzIGZyb20uCisgICBBRERSIGlzIHRoZSBhZGRyZXNzIHJlbGF0aXZlIHRvIHdoaWNoIHRoZSBzeW1ib2xzIGFyZSAoZS5nLgorICAgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgdGV4dCBzZWdtZW50KS4KKyAgIE1BSU5MSU5FIGlzIHRydWUgaWYgd2UgYXJlIHJlYWRpbmcgdGhlIG1haW4gc3ltYm9sCisgICB0YWJsZSAoYXMgb3Bwb3NlZCB0byBhIHNoYXJlZCBsaWIgb3IgZHluYW1pY2FsbHkgbG9hZGVkIGZpbGUpLgorICAgU1RBQk9GRlNFVCBhbmQgU1RBQlNJWkUgZGVmaW5lIHRoZSBsb2NhdGlvbiBpbiBPQkpGSUxFIHdoZXJlIHRoZSAuc3RhYgorICAgc2VjdGlvbiBleGlzdHMuCisgICBTVEFCU1RST0ZGU0VUIGFuZCBTVEFCU1RSU0laRSBkZWZpbmUgdGhlIGxvY2F0aW9uIGluIE9CSkZJTEUgd2hlcmUgdGhlCisgICAuc3RhYnN0ciBzZWN0aW9uIGV4aXN0cy4KKworICAgVGhpcyByb3V0aW5lIGlzIG1vc3RseSBjb3BpZWQgZnJvbSBkYnhfc3ltZmlsZV9pbml0IGFuZCBkYnhfc3ltZmlsZV9yZWFkLAorICAgYWRqdXN0ZWQgZm9yIGVsZiBkZXRhaWxzLiAqLworCit2b2lkCitlbGZzdGFiX2J1aWxkX3BzeW10YWJzIChvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMsIG1haW5saW5lLCAKKwkJCSAgICAgICBzdGFib2Zmc2V0LCBzdGFic2l6ZSwKKwkJCSAgICAgICBzdGFic3Ryb2Zmc2V0LCBzdGFic3Ryc2l6ZSkKKyAgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworICAgICAgaW50IG1haW5saW5lOworICAgICAgZmlsZV9wdHIgc3RhYm9mZnNldDsKKyAgICAgIHVuc2lnbmVkIGludCBzdGFic2l6ZTsKKyAgICAgIGZpbGVfcHRyIHN0YWJzdHJvZmZzZXQ7CisgICAgICB1bnNpZ25lZCBpbnQgc3RhYnN0cnNpemU7Cit7CisgIGludCB2YWw7CisgIGJmZCAqc3ltX2JmZCA9IG9iamZpbGUtPm9iZmQ7CisgIGNoYXIgKm5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChzeW1fYmZkKTsKKyAgc3RydWN0IGRieF9zeW1maWxlX2luZm8gKmluZm87CisgIGFzZWN0aW9uICp0ZXh0X3NlY3Q7CisKKyAgLyogVGhlcmUgaXMgYWxyZWFkeSBhIGRieF9zeW1maWxlX2luZm8gYWxsb2NhdGVkIGJ5IG91ciBjYWxsZXIuCisgICAgIEl0IG1pZ2h0IGV2ZW4gY29udGFpbiBzb21lIGluZm8gZnJvbSB0aGUgRUxGIHN5bXRhYiB0byBoZWxwIHVzLiAgKi8KKyAgaW5mbyA9IG9iamZpbGUtPnN5bV9zdGFiX2luZm87CisKKyAgdGV4dF9zZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN5bV9iZmQsICIudGV4dCIpOworICBpZiAoIXRleHRfc2VjdCkKKyAgICBlcnJvciAoIkNhbid0IGZpbmQgLnRleHQgc2VjdGlvbiBpbiBzeW1ib2wgZmlsZSIpOworICBEQlhfVEVYVF9BRERSIChvYmpmaWxlKSA9IGJmZF9zZWN0aW9uX3ZtYSAoc3ltX2JmZCwgdGV4dF9zZWN0KTsKKyAgREJYX1RFWFRfU0laRSAob2JqZmlsZSkgPSBiZmRfc2VjdGlvbl9zaXplIChzeW1fYmZkLCB0ZXh0X3NlY3QpOworCisjZGVmaW5lCUVMRl9TVEFCU19TWU1CT0xfU0laRQkxMgkvKiBYWFggRklYTUUgWFhYICovCisgIERCWF9TWU1CT0xfU0laRSAgICAob2JqZmlsZSkgPSBFTEZfU1RBQlNfU1lNQk9MX1NJWkU7CisgIERCWF9TWU1DT1VOVCAgICAgICAob2JqZmlsZSkgPSBzdGFic2l6ZSAvIERCWF9TWU1CT0xfU0laRSAob2JqZmlsZSk7CisgIERCWF9TVFJJTkdUQUJfU0laRSAob2JqZmlsZSkgPSBzdGFic3Ryc2l6ZTsKKyAgREJYX1NZTVRBQl9PRkZTRVQgIChvYmpmaWxlKSA9IHN0YWJvZmZzZXQ7CisgIAorICBpZiAoc3RhYnN0cnNpemUgPiBiZmRfZ2V0X3NpemUgKHN5bV9iZmQpKQorICAgIGVycm9yICgicmlkaWN1bG91cyBzdHJpbmcgdGFibGUgc2l6ZTogJWQgYnl0ZXMiLCBzdGFic3Ryc2l6ZSk7CisgIERCWF9TVFJJTkdUQUIgKG9iamZpbGUpID0gKGNoYXIgKikKKyAgICBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+cHN5bWJvbF9vYnN0YWNrLCBzdGFic3Ryc2l6ZSsxKTsKKyAgT0JKU1RBVCAob2JqZmlsZSwgc3pfc3RydGFiICs9IHN0YWJzdHJzaXplKzEpOworCisgIC8qIE5vdyByZWFkIGluIHRoZSBzdHJpbmcgdGFibGUgaW4gb25lIGJpZyBndWxwLiAgKi8KKworICB2YWwgPSBiZmRfc2VlayAoc3ltX2JmZCwgc3RhYnN0cm9mZnNldCwgU0VFS19TRVQpOworICBpZiAodmFsIDwgMCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lIChuYW1lKTsKKyAgdmFsID0gYmZkX3JlYWQgKERCWF9TVFJJTkdUQUIgKG9iamZpbGUpLCBzdGFic3Ryc2l6ZSwgMSwgc3ltX2JmZCk7CisgIGlmICh2YWwgIT0gc3RhYnN0cnNpemUpCisgICAgcGVycm9yX3dpdGhfbmFtZSAobmFtZSk7CisKKyAgc3RhYnNyZWFkX25ld19pbml0ICgpOworICBidWlsZHN5bV9uZXdfaW5pdCAoKTsKKyAgZnJlZV9oZWFkZXJfZmlsZXMgKCk7CisgIGluaXRfaGVhZGVyX2ZpbGVzICgpOworICBpbnN0YWxsX21pbmltYWxfc3ltYm9scyAob2JqZmlsZSk7CisKKyAgcHJvY2Vzc2luZ19hY2NfY29tcGlsYXRpb24gPSAxOworCisgIC8qIEluIGFuIGVsZiBmaWxlLCB3ZSd2ZSBhbHJlYWR5IGluc3RhbGxlZCB0aGUgbWluaW1hbCBzeW1ib2xzIHRoYXQgY2FtZQorICAgICBmcm9tIHRoZSBlbGYgKG5vbi1zdGFiKSBzeW1ib2wgdGFibGUsIHNvIGFsd2F5cyBhY3QgbGlrZSBhbgorICAgICBpbmNyZW1lbnRhbCBsb2FkIGhlcmUuICovCisgIGRieF9zeW1maWxlX3JlYWQgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywgMCk7Cit9CisMCisvKiBTY2FuIGFuZCBidWlsZCBwYXJ0aWFsIHN5bWJvbHMgZm9yIGEgZmlsZSB3aXRoIHNwZWNpYWwgc2VjdGlvbnMgZm9yIHN0YWJzCisgICBhbmQgc3RhYnN0cmluZ3MuICBUaGUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCB0byBnZXQgaXRzIG1pbmltYWwKKyAgIHN5bWJvbHMsIGFuZCBhbnkgb3RoZXIgc3ltYm9scyB0aGF0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byByZXNvbHZlIEdTWU1zLgorCisgICBUaGlzIHJvdXRpbmUgaXMgdGhlIGVxdWl2YWxlbnQgb2YgZGJ4X3N5bWZpbGVfaW5pdCBhbmQgZGJ4X3N5bWZpbGVfcmVhZAorICAgcm9sbGVkIGludG8gb25lLgorCisgICBPQkpGSUxFIGlzIHRoZSBvYmplY3QgZmlsZSB3ZSBhcmUgcmVhZGluZyBzeW1ib2xzIGZyb20uCisgICBBRERSIGlzIHRoZSBhZGRyZXNzIHJlbGF0aXZlIHRvIHdoaWNoIHRoZSBzeW1ib2xzIGFyZSAoZS5nLiB0aGUgYmFzZSBhZGRyZXNzCisJb2YgdGhlIHRleHQgc2VnbWVudCkuCisgICBNQUlOTElORSBpcyB0cnVlIGlmIHdlIGFyZSByZWFkaW5nIHRoZSBtYWluIHN5bWJvbCB0YWJsZSAoYXMgb3Bwb3NlZCB0byBhCisJICAgIHNoYXJlZCBsaWIgb3IgZHluYW1pY2FsbHkgbG9hZGVkIGZpbGUpLgorICAgU1RBQl9OQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlIHN0YWJzLgorICAgU1RBQlNUUl9OQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlIHN0YWIgc3RyaW5ncy4KKworICAgVGhpcyByb3V0aW5lIGlzIG1vc3RseSBjb3BpZWQgZnJvbSBkYnhfc3ltZmlsZV9pbml0IGFuZCBkYnhfc3ltZmlsZV9yZWFkLiAqLworCit2b2lkCitzdGFic2VjdF9idWlsZF9wc3ltdGFicyAob2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzLCBtYWlubGluZSwgc3RhYl9uYW1lLAorCQkJIHN0YWJzdHJfbmFtZSwgdGV4dF9uYW1lKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworICAgICBpbnQgbWFpbmxpbmU7CisgICAgIGNoYXIgKnN0YWJfbmFtZTsKKyAgICAgY2hhciAqc3RhYnN0cl9uYW1lOworICAgICBjaGFyICp0ZXh0X25hbWU7Cit7CisgIGludCB2YWw7CisgIGJmZCAqc3ltX2JmZCA9IG9iamZpbGUtPm9iZmQ7CisgIGNoYXIgKm5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChzeW1fYmZkKTsKKyAgYXNlY3Rpb24gKnN0YWJzZWN0OworICBhc2VjdGlvbiAqc3RhYnN0cnNlY3Q7CisgIGFzZWN0aW9uICp0ZXh0X3NlY3Q7CisKKyAgc3RhYnNlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3ltX2JmZCwgc3RhYl9uYW1lKTsKKyAgc3RhYnN0cnNlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3ltX2JmZCwgc3RhYnN0cl9uYW1lKTsKKworICBpZiAoIXN0YWJzZWN0KQorICAgIHJldHVybjsKKworICBpZiAoIXN0YWJzdHJzZWN0KQorICAgIGVycm9yICgic3RhYnNlY3RfYnVpbGRfcHN5bXRhYnM6ICBGb3VuZCBzdGFicyAoJXMpLCBidXQgbm90IHN0cmluZyBzZWN0aW9uICglcykiLAorCSAgIHN0YWJfbmFtZSwgc3RhYnN0cl9uYW1lKTsKKworICBvYmpmaWxlLT5zeW1fc3RhYl9pbmZvID0gKHN0cnVjdCBkYnhfc3ltZmlsZV9pbmZvICopCisgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZGJ4X3N5bWZpbGVfaW5mbykpOworICBtZW1zZXQgKG9iamZpbGUtPnN5bV9zdGFiX2luZm8sIDAsIHNpemVvZiAoc3RydWN0IGRieF9zeW1maWxlX2luZm8pKTsKKworICB0ZXh0X3NlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3ltX2JmZCwgdGV4dF9uYW1lKTsKKyAgaWYgKCF0ZXh0X3NlY3QpCisgICAgZXJyb3IgKCJDYW4ndCBmaW5kICVzIHNlY3Rpb24gaW4gc3ltYm9sIGZpbGUiLCB0ZXh0X25hbWUpOworICBEQlhfVEVYVF9BRERSIChvYmpmaWxlKSA9IGJmZF9zZWN0aW9uX3ZtYSAoc3ltX2JmZCwgdGV4dF9zZWN0KTsKKyAgREJYX1RFWFRfU0laRSAob2JqZmlsZSkgPSBiZmRfc2VjdGlvbl9zaXplIChzeW1fYmZkLCB0ZXh0X3NlY3QpOworCisgIERCWF9TWU1CT0xfU0laRSAgICAob2JqZmlsZSkgPSBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCk7CisgIERCWF9TWU1DT1VOVCAgICAgICAob2JqZmlsZSkgPSBiZmRfc2VjdGlvbl9zaXplIChzeW1fYmZkLCBzdGFic2VjdCkKKyAgICAvIERCWF9TWU1CT0xfU0laRSAob2JqZmlsZSk7CisgIERCWF9TVFJJTkdUQUJfU0laRSAob2JqZmlsZSkgPSBiZmRfc2VjdGlvbl9zaXplIChzeW1fYmZkLCBzdGFic3Ryc2VjdCk7CisgIERCWF9TWU1UQUJfT0ZGU0VUICAob2JqZmlsZSkgPSBzdGFic2VjdC0+ZmlsZXBvczsgLyogWFhYIC0gRklYTUU6IFBPS0lORyBJTlNJREUgQkZEIERBVEEgU1RSVUNUVVJFUyAqLworICAKKyAgaWYgKERCWF9TVFJJTkdUQUJfU0laRSAob2JqZmlsZSkgPiBiZmRfZ2V0X3NpemUgKHN5bV9iZmQpKQorICAgIGVycm9yICgicmlkaWN1bG91cyBzdHJpbmcgdGFibGUgc2l6ZTogJWQgYnl0ZXMiLCBEQlhfU1RSSU5HVEFCX1NJWkUgKG9iamZpbGUpKTsKKyAgREJYX1NUUklOR1RBQiAob2JqZmlsZSkgPSAoY2hhciAqKQorICAgIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5wc3ltYm9sX29ic3RhY2ssIERCWF9TVFJJTkdUQUJfU0laRSAob2JqZmlsZSkgKyAxKTsKKyAgT0JKU1RBVCAob2JqZmlsZSwgc3pfc3RydGFiICs9IERCWF9TVFJJTkdUQUJfU0laRSAob2JqZmlsZSkgKyAxKTsKKworICAvKiBOb3cgcmVhZCBpbiB0aGUgc3RyaW5nIHRhYmxlIGluIG9uZSBiaWcgZ3VscC4gICovCisKKyAgdmFsID0gYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChzeW1fYmZkLCAvKiBiZmQgKi8KKwkJCQkgIHN0YWJzdHJzZWN0LCAvKiBiZmQgc2VjdGlvbiAqLworCQkJCSAgREJYX1NUUklOR1RBQiAob2JqZmlsZSksIC8qIGlucHV0IGJ1ZmZlciAqLworCQkJCSAgMCwgLyogb2Zmc2V0IGludG8gc2VjdGlvbiAqLworCQkJCSAgREJYX1NUUklOR1RBQl9TSVpFIChvYmpmaWxlKSk7IC8qIGFtb3VudCB0byByZWFkICovCisKKyAgaWYgKCF2YWwpCisgICAgcGVycm9yX3dpdGhfbmFtZSAobmFtZSk7CisKKyAgc3RhYnNyZWFkX25ld19pbml0ICgpOworICBidWlsZHN5bV9uZXdfaW5pdCAoKTsKKyAgZnJlZV9oZWFkZXJfZmlsZXMgKCk7CisgIGluaXRfaGVhZGVyX2ZpbGVzICgpOworICBpbnN0YWxsX21pbmltYWxfc3ltYm9scyAob2JqZmlsZSk7CisKKyAgLyogTm93LCBkbyBhbiBpbmNyZW1lbnRhbCBsb2FkICovCisKKyAgcHJvY2Vzc2luZ19hY2NfY29tcGlsYXRpb24gPSAxOworICBkYnhfc3ltZmlsZV9yZWFkIChvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMsIDApOworfQorDAorc3RhdGljIHN0cnVjdCBzeW1fZm5zIGFvdXRfc3ltX2ZucyA9Cit7CisgIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAorICBkYnhfbmV3X2luaXQsCQkvKiBzeW1fbmV3X2luaXQ6IGluaXQgYW55dGhpbmcgZ2JsIHRvIGVudGlyZSBzeW10YWIgKi8KKyAgZGJ4X3N5bWZpbGVfaW5pdCwJLyogc3ltX2luaXQ6IHJlYWQgaW5pdGlhbCBpbmZvLCBzZXR1cCBmb3Igc3ltX3JlYWQoKSAqLworICBkYnhfc3ltZmlsZV9yZWFkLAkvKiBzeW1fcmVhZDogcmVhZCBhIHN5bWJvbCBmaWxlIGludG8gc3ltdGFiICovCisgIGRieF9zeW1maWxlX2ZpbmlzaCwJLyogc3ltX2ZpbmlzaDogZmluaXNoZWQgd2l0aCBmaWxlLCBjbGVhbnVwICovCisgIGRlZmF1bHRfc3ltZmlsZV9vZmZzZXRzLAorCQkJLyogc3ltX29mZnNldHM6IHBhcnNlIHVzZXIncyBvZmZzZXRzIHRvIGludGVybmFsIGZvcm0gKi8KKyAgTlVMTAkJCS8qIG5leHQ6IHBvaW50ZXIgdG8gbmV4dCBzdHJ1Y3Qgc3ltX2ZucyAqLworfTsKKwordm9pZAorX2luaXRpYWxpemVfZGJ4cmVhZCAoKQoreworICBhZGRfc3ltdGFiX2ZucygmYW91dF9zeW1fZm5zKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9kY2FjaGUuYyBiL2dkYi9kY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTdhOTQwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2RjYWNoZS5jCkBAIC0wLDAgKzEsNTU4IEBACisvKiBDYWNoaW5nIGNvZGUuICBUeXBpY2FsbHkgdXNlZCBieSByZW1vdGUgYmFjayBlbmRzIGZvcgorICAgY2FjaGluZyByZW1vdGUgbWVtb3J5LgorCisgICBDb3B5cmlnaHQgMTk5MiwgMTk5MywgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImRjYWNoZS5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisKKy8qIAorICAgVGhlIGRhdGEgY2FjaGUgY291bGQgbGVhZCB0byBpbmNvcnJlY3QgcmVzdWx0cyBiZWNhdXNlIGl0IGRvZXNuJ3Qga25vdworICAgYWJvdXQgdm9sYXRpbGUgdmFyaWFibGVzLCB0aHVzIG1ha2luZyBpdCBpbXBvc3NpYmxlIHRvIGRlYnVnCisgICBmdW5jdGlvbnMgd2hpY2ggdXNlIG1lbW9yeSBtYXBwZWQgSS9PIGRldmljZXMuCisKKyAgIHNldCByZW1vdGVjYWNoZSAwCisKKyAgIEluIHRob3NlIGNhc2VzLgorCisgICBJbiBnZW5lcmFsIHRoZSBkY2FjaGUgc3BlZWRzIHVwIHBlcmZvcm1hbmNlLCBzb21lIHNwZWVkIGltcHJvdmVtZW50CisgICBjb21lcyBmcm9tIHRoZSBhY3R1YWwgY2FjaGluZyBtZWNoYW5pc20sIGJ1dCB0aGUgbWFqb3IgZ2FpbiBpcyBpbgorICAgdGhlIHJlZHVjdGlvbiBvZiB0aGUgcmVtb3RlIHByb3RvY29sIG92ZXJoZWFkOyBpbnN0ZWFkIG9mIHJlYWRpbmcKKyAgIG9yIHdyaXRpbmcgYSBsYXJnZSBhcmVhIG9mIG1lbW9yeSBpbiA0IGJ5dGUgcmVxdWVzdHMsIHRoZSBjYWNoZQorICAgYnVuZGxlcyB1cCB0aGUgcmVxdWVzdHMgaW50byAzMiBieXRlIChhY3R1YWxseSBMSU5FX1NJWkUpIGNodW5rcy4KKyAgIFJlZHVjaW5nIHRoZSBvdmVyaGVhZCB0byBhbiBlaWdodGggb2Ygd2hhdCBpdCB3YXMuICBUaGlzIGlzIHZlcnkKKyAgIG9idmlvdXMgd2hlbiBkaXNwbGF5aW5nIGEgbGFyZ2UgYW1vdW50IG9mIGRhdGEsCisKKyAgIGVnLCB4LzIwMHggMCAKKworICAgY2FjaGluZyAgICAgfCAgIG5vICAgIHllcyAKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICBmaXJzdCB0aW1lICB8ICAgNCBzZWMgIDIgc2VjIGltcHJvdmVtZW50IGR1ZSB0byBjaHVua2luZyAKKyAgIHNlY29uZCB0aW1lIHwgICA0IHNlYyAgMCBzZWMgaW1wcm92ZW1lbnQgZHVlIHRvIGNhY2hpbmcKKworICAgVGhlIGNhY2hlIHN0cnVjdHVyZSBpcyB1bnVzdWFsLCB3ZSBrZWVwIGEgbnVtYmVyIG9mIGNhY2hlIGJsb2NrcworICAgKERDQUNIRV9TSVpFKSBhbmQgZWFjaCBvbmUgY2FjaGVzIGEgTElORV9TSVpFZWQgYXJlYSBvZiBtZW1vcnkuCisgICBXaXRoaW4gZWFjaCBsaW5lIHdlIHJlbWVtYmVyIHRoZSBhZGRyZXNzIG9mIHRoZSBsaW5lIChhbHdheXMgYQorICAgbXVsdGlwbGUgb2YgdGhlIExJTkVfU0laRSkgYW5kIGEgdmVjdG9yIG9mIGJ5dGVzIG92ZXIgdGhlIHJhbmdlLgorICAgVGhlcmUncyBhbm90aGVyIHZlY3RvciB3aGljaCBjb250YWlucyB0aGUgc3RhdGUgb2YgdGhlIGJ5dGVzLgorCisgICBFTlRSWV9CQUQgbWVhbnMgdGhhdCB0aGUgYnl0ZSBpcyBqdXN0IHBsYWluIHdyb25nLCBhbmQgaGFzIG5vCisgICBjb3JyZXNwb25kZW5jZSB3aXRoIGFueXRoaW5nIGVsc2UgKGFzIGl0IHdvdWxkIHdoZW4gdGhlIGNhY2hlIGlzCisgICB0dXJuZWQgb24sIGJ1dCBub3RoaW5nIGhhcyBiZWVuIGRvbmUgdG8gaXQuCisKKyAgIEVOVFJZX0RJUlRZIG1lYW5zIHRoYXQgdGhlIGJ5dGUgaGFzIHNvbWUgZGF0YSBpbiBpdCB3aGljaCBzaG91bGQgYmUKKyAgIHdyaXR0ZW4gb3V0IHRvIHRoZSByZW1vdGUgdGFyZ2V0IG9uZSBkYXksIGJ1dCBjb250YWlucyBjb3JyZWN0CisgICBkYXRhLiAgRU5UUllfT0sgbWVhbnMgdGhhdCB0aGUgZGF0YSBpcyB0aGUgc2FtZSBpbiB0aGUgY2FjaGUgYXMgaXQKKyAgIGlzIGluIHJlbW90ZSBtZW1vcnkuCisKKworICAgVGhlIEVOVFJZX0RJUlRZIHN0YXRlIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIEdEQiBsaWtlcyB0byB3cml0ZSBsYXJnZQorICAgbHVtcHMgb2YgbWVtb3J5IGluIHNtYWxsIGJpdHMuICBJZiB0aGUgY2FjaGluZyBtZWNoYW5pc20gZGlkbid0CisgICBtYWludGFpbiB0aGUgRElSVFkgaW5mb3JtYXRpb24sIHRoZW4gc29tZXRoaW5nIGxpa2UgYSB0d28gYnl0ZQorICAgd3JpdGUgd291bGQgbWVhbiB0aGF0IHRoZSBlbnRpcmUgY2FjaGUgbGluZSB3b3VsZCBoYXZlIHRvIGJlIHJlYWQsCisgICB0aGUgdHdvIGJ5dGVzIG1vZGlmaWVkIGFuZCB0aGVuIHdyaXR0ZW4gb3V0IGFnYWluLiAgVGhlIGFsdGVybmF0aXZlCisgICB3b3VsZCBiZSB0byBub3QgcmVhZCBpbiB0aGUgY2FjaGUgbGluZSBpbiB0aGUgZmlyc3QgcGxhY2UsIGFuZCBqdXN0CisgICB3cml0ZSB0aGUgdHdvIGJ5dGVzIGRpcmVjdGx5IGludG8gdGFyZ2V0IG1lbW9yeS4gIFRoZSB0cm91YmxlIHdpdGgKKyAgIHRoYXQgaXMgdGhhdCBpdCByZWFsbHkgbmFpbHMgcGVyZm9ybWFuY2UsIGJlY2F1c2Ugb2YgdGhlIHJlbW90ZQorICAgcHJvdG9jb2wgb3ZlcmhlYWQuICBUaGlzIHdheSwgYWxsIHRob3NlIGxpdHRsZSB3cml0ZXMgYXJlIGJ1bmRsZWQKKyAgIHVwIGludG8gYW4gZW50aXJlIGNhY2hlIGxpbmUgd3JpdGUgaW4gb25lIGdvLCB3aXRob3V0IGhhdmluZyB0bworICAgcmVhZCB0aGUgY2FjaGUgbGluZSBpbiB0aGUgZmlyc3QgcGxhY2UuCisKKworICAqLworCisKKy8qIFRoaXMgdmFsdWUgcmVndWxhdGVzIHRoZSBudW1iZXIgb2YgY2FjaGUgYmxvY2tzIHN0b3JlZC4KKyAgIFNtYWxsZXIgdmFsdWVzIHJlZHVjZSB0aGUgdGltZSBzcGVudCBzZWFyY2hpbmcgZm9yIGEgY2FjaGUKKyAgIGxpbmUsIGFuZCByZWR1Y2UgbWVtb3J5IHJlcXVpcmVtZW50cywgYnV0IGluY3JlYXNlIHRoZSByaXNrCisgICBvZiBhIGxpbmUgbm90IGJlaW5nIGluIG1lbW9yeSAqLworCisjZGVmaW5lIERDQUNIRV9TSVpFIDY0IAorCisvKiBUaGlzIHZhbHVlIHJlZ3VsYXRlcyB0aGUgc2l6ZSBvZiBhIGNhY2hlIGxpbmUuICBTbWFsbGVyIHZhbHVlcworICAgcmVkdWNlIHRoZSB0aW1lIHRha2VuIHRvIHJlYWQgYSBzaW5nbGUgYnl0ZSwgYnV0IHJlZHVjZSBvdmVyYWxsCisgICB0aHJvdWdocHV0LiAgKi8KKworI2RlZmluZSBMSU5FX1NJWkVfUE9XRVIgKDUpIAorI2RlZmluZSBMSU5FX1NJWkUgKDEgPDwgTElORV9TSVpFX1BPV0VSKQorCisvKiBFYWNoIGNhY2hlIGJsb2NrIGhvbGRzIExJTkVfU0laRSBieXRlcyBvZiBkYXRhCisgICBzdGFydGluZyBhdCBhIG11bHRpcGxlLW9mLUxJTkVfU0laRSBhZGRyZXNzLiAgKi8KKworI2RlZmluZSBMSU5FX1NJWkVfTUFTSyAgKChMSU5FX1NJWkUgLSAxKSkJCisjZGVmaW5lIFhGT1JNKHgpIAkoKHgpICYgTElORV9TSVpFX01BU0spCisjZGVmaW5lIE1BU0soeCkgICAgICAgICAoKHgpICYgfkxJTkVfU0laRV9NQVNLKQorCisKKyNkZWZpbmUgRU5UUllfQkFEICAgMCAgLyogZGF0YSBhdCB0aGlzIGJ5dGUgaXMgd3JvbmcgKi8KKyNkZWZpbmUgRU5UUllfRElSVFkgMSAgLyogZGF0YSBhdCB0aGlzIGJ5dGUgbmVlZHMgdG8gYmUgd3JpdHRlbiBiYWNrICovCisjZGVmaW5lIEVOVFJZX09LICAgIDIgIC8qIGRhdGEgYXQgdGhpcyBieXRlIGlzIHNhbWUgYXMgaW4gbWVtb3J5ICovCisKKworc3RydWN0IGRjYWNoZV9ibG9jaworeworICBzdHJ1Y3QgZGNhY2hlX2Jsb2NrICpwOwkvKiBuZXh0IGluIGxpc3QgKi8KKyAgQ09SRV9BRERSIGFkZHI7CQkvKiBBZGRyZXNzIGZvciB3aGljaCBkYXRhIGlzIHJlY29yZGVkLiAgKi8KKyAgY2hhciBkYXRhW0xJTkVfU0laRV07CQkvKiBieXRlcyBhdCBnaXZlbiBhZGRyZXNzICovCisgIHVuc2lnbmVkIGNoYXIgc3RhdGVbTElORV9TSVpFXTsgLyogd2hhdCBzdGF0ZSB0aGUgZGF0YSBpcyBpbiAqLworCisgIC8qIHdoZXRoZXIgYW55dGhpbmcgaW4gc3RhdGUgaXMgZGlydHkgLSB1c2VkIHRvIHNwZWVkIHVwIHRoZSAKKyAgICAgZGlydHkgc2Nhbi4gKi8KKyAgaW50IGFueWRpcnR5OwkJCQorCisgIGludCByZWZzOworfTsKKworCitzdHJ1Y3QgZGNhY2hlX3N0cnVjdCAKK3sKKyAgLyogRnVuY3Rpb24gdG8gYWN0dWFsbHkgcmVhZCB0aGUgdGFyZ2V0IG1lbW9yeS4gKi8KKyAgbWVteGZlcmZ1bmMgcmVhZF9tZW1vcnk7CisKKyAgLyogRnVuY3Rpb24gdG8gYWN0dWFsbHkgd3JpdGUgdGhlIHRhcmdldCBtZW1vcnkgKi8KKyAgbWVteGZlcmZ1bmMgd3JpdGVfbWVtb3J5OworCisgIC8qIGZyZWUgbGlzdCAqLworICBzdHJ1Y3QgZGNhY2hlX2Jsb2NrICpmcmVlX2hlYWQ7CisgIHN0cnVjdCBkY2FjaGVfYmxvY2sgKmZyZWVfdGFpbDsKKworICAvKiBpbiB1c2UgbGlzdCAqLworICBzdHJ1Y3QgZGNhY2hlX2Jsb2NrICp2YWxpZF9oZWFkOworICBzdHJ1Y3QgZGNhY2hlX2Jsb2NrICp2YWxpZF90YWlsOworCisgIC8qIFRoZSBjYWNoZSBpdHNlbGYuICovCisgIHN0cnVjdCBkY2FjaGVfYmxvY2sgKnRoZV9jYWNoZTsKKworICAvKiBwb3RlbnRpYWxseSwgaWYgdGhlIGNhY2hlIHdhcyBlbmFibGVkLCBhbmQgdGhlbiB0dXJuZWQgb2ZmLCBhbmQKKyAgICAgdGhlbiB0dXJuZWQgb24gYWdhaW4sIHRoZSBzdHVmZiBpbiBpdCBjb3VsZCBiZSBzdGFsZSwgc28gdGhpcyBpcworICAgICB1c2VkIHRvIG1hcmsgaXQgKi8KKyAgaW50IGNhY2hlX2hhc19zdHVmZjsKK30gOworCitzdGF0aWMgaW50IGRjYWNoZV9wb2tlX2J5dGUgUEFSQU1TICgoRENBQ0hFICpkY2FjaGUsIENPUkVfQUREUiBhZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwdHIpKTsKKworc3RhdGljIGludCBkY2FjaGVfcGVla19ieXRlIFBBUkFNUyAoKERDQUNIRSAqZGNhY2hlLCBDT1JFX0FERFIgYWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcHRyKSk7CisKK3N0YXRpYyBzdHJ1Y3QgZGNhY2hlX2Jsb2NrICpkY2FjaGVfaGl0IFBBUkFNUyAoKERDQUNIRSAqZGNhY2hlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPUkVfQUREUiBhZGRyKSk7CisKK3N0YXRpYyBpbnQgZGNhY2hlX3dyaXRlX2xpbmUgUEFSQU1TICgoRENBQ0hFICpkY2FjaGUsc3RydWN0IGRjYWNoZV9ibG9jayAqZGIpKTsKKworc3RhdGljIHN0cnVjdCBkY2FjaGVfYmxvY2sgKmRjYWNoZV9hbGxvYyBQQVJBTVMgKChEQ0FDSEUgKmRjYWNoZSkpOworCitzdGF0aWMgaW50IGRjYWNoZV93cml0ZWJhY2sgUEFSQU1TICgoRENBQ0hFICpkY2FjaGUpKTsKKworc3RhdGljIHZvaWQgZGNhY2hlX2luZm8gUEFSQU1TICgoY2hhciAqZXhwLCBpbnQgdHR5KSk7CisKK3ZvaWQgX2luaXRpYWxpemVfZGNhY2hlIFBBUkFNUyAoKHZvaWQpKTsKKworaW50IHJlbW90ZV9kY2FjaGUgPSAwOworCitEQ0FDSEUgKmxhc3RfY2FjaGU7IC8qIFVzZWQgYnkgaW5mbyBkY2FjaGUgKi8KKworCisvKiBGcmVlIGFsbCB0aGUgZGF0YSBjYWNoZSBibG9ja3MsIHRodXMgZGlzY2FyZGluZyBhbGwgY2FjaGVkIGRhdGEuICAqLworCit2b2lkCitkY2FjaGVfZmx1c2ggKGRjYWNoZSkKKyAgICAgRENBQ0hFICpkY2FjaGU7Cit7CisgIGludCBpOworICBkY2FjaGUtPnZhbGlkX2hlYWQgPSAwOworICBkY2FjaGUtPnZhbGlkX3RhaWwgPSAwOworCisgIGRjYWNoZS0+ZnJlZV9oZWFkID0gMDsKKyAgZGNhY2hlLT5mcmVlX3RhaWwgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBEQ0FDSEVfU0laRTsgaSsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBkY2FjaGVfYmxvY2sgKmRiID0gZGNhY2hlLT50aGVfY2FjaGUgKyBpOworCisgICAgICBpZiAoIWRjYWNoZS0+ZnJlZV9oZWFkKQorCWRjYWNoZS0+ZnJlZV9oZWFkID0gZGI7CisgICAgICBlbHNlCisJZGNhY2hlLT5mcmVlX3RhaWwtPnAgPSBkYjsKKyAgICAgIGRjYWNoZS0+ZnJlZV90YWlsID0gZGI7CisgICAgICBkYi0+cCA9IDA7CisgICAgfQorCisgIGRjYWNoZS0+Y2FjaGVfaGFzX3N0dWZmID0gMDsKKworICByZXR1cm47Cit9CisKKy8qIElmIGFkZHIgaXMgcHJlc2VudCBpbiB0aGUgZGNhY2hlLCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGJsb2NrCisgICBjb250YWluaW5nIGl0LiAqLworCitzdGF0aWMgc3RydWN0IGRjYWNoZV9ibG9jayAqCitkY2FjaGVfaGl0IChkY2FjaGUsIGFkZHIpCisgICAgIERDQUNIRSAqZGNhY2hlOworICAgICBDT1JFX0FERFIgYWRkcjsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGRjYWNoZV9ibG9jayAqZGI7CisKKyAgLyogU2VhcmNoIGFsbCBjYWNoZSBibG9ja3MgZm9yIG9uZSB0aGF0IGlzIGF0IHRoaXMgYWRkcmVzcy4gICovCisgIGRiID0gZGNhY2hlLT52YWxpZF9oZWFkOworCisgIHdoaWxlIChkYikKKyAgICB7CisgICAgICBpZiAoTUFTSyhhZGRyKSA9PSBkYi0+YWRkcikKKwl7CisJICBkYi0+cmVmcysrOworCSAgcmV0dXJuIGRiOworCX0KKyAgICAgIGRiID0gZGItPnA7CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCisvKiBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBpbiB0aGlzIGxpbmUgd2hpY2ggbmVlZHMgdG8KKyAgIGJlIHdyaXR0ZW4gaXMuICovCisKK3N0YXRpYyBpbnQKK2RjYWNoZV93cml0ZV9saW5lIChkY2FjaGUsIGRiKQorICAgICBEQ0FDSEUgKmRjYWNoZTsKKyAgICAgcmVnaXN0ZXIgc3RydWN0IGRjYWNoZV9ibG9jayAqZGI7Cit7CisgIGludCBzOworICBpbnQgZTsKKyAgcyA9IDA7CisgIGlmIChkYi0+YW55ZGlydHkpCisgICAgeworICAgICAgZm9yIChzID0gMDsgcyA8IExJTkVfU0laRTsgcysrKQorCXsKKwkgIGlmIChkYi0+c3RhdGVbc10gPT0gRU5UUllfRElSVFkpCisJICAgIHsKKwkgICAgICBpbnQgbGVuID0gMDsKKwkgICAgICBmb3IgKGUgPSBzIDsgZSA8IExJTkVfU0laRTsgZSsrLCBsZW4rKykKKwkJaWYgKGRiLT5zdGF0ZVtlXSAhPSBFTlRSWV9ESVJUWSkKKwkJICBicmVhazsKKwkgICAgICB7CisJCS8qIGFsbCBieXRlcyBmcm9tIHMuLnMrbGVuLTEgbmVlZCB0bworCQkgICBiZSB3cml0dGVuIG91dCAqLworCQlpbnQgZG9uZSA9IDA7CisJCXdoaWxlIChkb25lIDwgbGVuKSB7CisJCSAgaW50IHQgPSBkY2FjaGUtPndyaXRlX21lbW9yeSAoZGItPmFkZHIgKyBzICsgZG9uZSwKKwkJCQkJCWRiLT5kYXRhICsgcyArIGRvbmUsCisJCQkJCQlsZW4gLSBkb25lKTsKKwkJICBpZiAodCA9PSAwKQorCQkgICAgcmV0dXJuIDA7CisJCSAgZG9uZSArPSB0OworCQl9CisJCW1lbXNldCAoZGItPnN0YXRlICsgcywgRU5UUllfT0ssIGxlbik7CisJCXMgPSBlOworCSAgICAgIH0KKwkgICAgfQorCX0KKyAgICAgIGRiLT5hbnlkaXJ0eSA9IDA7CisgICAgfQorICByZXR1cm4gMTsKK30KKworCisvKiBHZXQgYSBmcmVlIGNhY2hlIGJsb2NrLCBwdXQgb3Iga2VlcCBpdCBvbiB0aGUgdmFsaWQgbGlzdCwKKyAgIGFuZCByZXR1cm4gaXRzIGFkZHJlc3MuICBUaGUgY2FsbGVyIHNob3VsZCBzdG9yZSBpbnRvIHRoZSBibG9jaworICAgdGhlIGFkZHJlc3MgYW5kIGRhdGEgdGhhdCBpdCBkZXNjcmliZXMsIHRoZW4gcmVtcXVlIGl0IGZyb20gdGhlCisgICBmcmVlIGxpc3QgYW5kIGluc2VydCBpdCBpbnRvIHRoZSB2YWxpZCBsaXN0LiAgVGhpcyBwcm9jZWR1cmUKKyAgIHByZXZlbnRzIGVycm9ycyBmcm9tIGNyZWVwaW5nIGluIGlmIGEgbWVtb3J5IHJldHJpZXZhbCBpcworICAgaW50ZXJydXB0ZWQgKHdoaWNoIHVzZWQgdG8gcHV0IGdhcmJhZ2UgYmxvY2tzIGluIHRoZSB2YWxpZAorICAgbGlzdC4uLikuICAqLworCitzdGF0aWMgc3RydWN0IGRjYWNoZV9ibG9jayAqCitkY2FjaGVfYWxsb2MgKGRjYWNoZSkKKyAgICAgRENBQ0hFICpkY2FjaGU7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBkY2FjaGVfYmxvY2sgKmRiOworCisgIGlmIChyZW1vdGVfZGNhY2hlID09IDApCisgICAgYWJvcnQgKCk7CisKKyAgLyogVGFrZSBzb21ldGhpbmcgZnJvbSB0aGUgZnJlZSBsaXN0ICovCisgIGRiID0gZGNhY2hlLT5mcmVlX2hlYWQ7CisgIGlmIChkYikKKyAgICB7CisgICAgICBkY2FjaGUtPmZyZWVfaGVhZCA9IGRiLT5wOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgbGVmdCBvbiBmcmVlIGxpc3QsIHNvIGdyYWIgb25lIGZyb20gdGhlIHZhbGlkIGxpc3QgKi8KKyAgICAgIGRiID0gZGNhY2hlLT52YWxpZF9oZWFkOworICAgICAgZGNhY2hlLT52YWxpZF9oZWFkID0gZGItPnA7CisKKyAgICAgIGRjYWNoZV93cml0ZV9saW5lIChkY2FjaGUsIGRiKTsKKyAgICB9CisKKyAgLyogYXBwZW5kIHRoaXMgbGluZSB0byBlbmQgb2YgdmFsaWQgbGlzdCAqLworICBpZiAoIWRjYWNoZS0+dmFsaWRfaGVhZCkKKyAgICBkY2FjaGUtPnZhbGlkX2hlYWQgPSBkYjsKKyAgZWxzZQorICAgIGRjYWNoZS0+dmFsaWRfdGFpbC0+cCA9IGRiOworICBkY2FjaGUtPnZhbGlkX3RhaWwgPSBkYjsKKyAgZGItPnAgPSAwOworCisgIHJldHVybiBkYjsKK30KKworLyogVXNpbmcgdGhlIGRhdGEgY2FjaGUgRENBQ0hFIHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGJ5dGUgYXQKKyAgIGFkZHJlc3MgQUREUiBpbiB0aGUgcmVtb3RlIG1hY2hpbmUuICAKKworICAgUmV0dXJucyAwIG9uIGVycm9yLiAqLworCitzdGF0aWMgaW50CitkY2FjaGVfcGVla19ieXRlIChkY2FjaGUsIGFkZHIsIHB0cikKKyAgICAgRENBQ0hFICpkY2FjaGU7CisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpwdHI7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBkY2FjaGVfYmxvY2sgKmRiID0gZGNhY2hlX2hpdCAoZGNhY2hlLCBhZGRyKTsKKyAgaW50IG9rPTE7CisgIGludCBkb25lID0gMDsKKyAgaWYgKGRiID09IDAKKyAgICAgIHx8IGRiLT5zdGF0ZVtYRk9STSAoYWRkcildID09IEVOVFJZX0JBRCkKKyAgICB7CisgICAgICBpZiAoZGIpCisJeworCSAgZGNhY2hlX3dyaXRlX2xpbmUgKGRjYWNoZSwgZGIpOworCX0KKyAgICBlbHNlCisgICAgICBkYiA9IGRjYWNoZV9hbGxvYyAoZGNhY2hlKTsKKyAgICAgIGltbWVkaWF0ZV9xdWl0Kys7CisgICAgICBkYi0+YWRkciA9IE1BU0sgKGFkZHIpOworICAgICAgd2hpbGUgKGRvbmUgPCBMSU5FX1NJWkUpIAorCXsKKwkgIGludCB0cnkgPQorCSAgICAoKmRjYWNoZS0+cmVhZF9tZW1vcnkpCisJICAgICAgKGRiLT5hZGRyICsgZG9uZSwKKwkgICAgICAgZGItPmRhdGEgKyBkb25lLAorCSAgICAgICBMSU5FX1NJWkUgLSBkb25lKTsKKwkgIGlmICh0cnkgPT0gMCkKKwkgICAgcmV0dXJuIDA7CisJICBkb25lICs9IHRyeTsKKwl9CisgICAgICBpbW1lZGlhdGVfcXVpdC0tOworICAgICAKKyAgICAgIG1lbXNldCAoZGItPnN0YXRlLCBFTlRSWV9PSywgc2l6ZW9mIChkYi0+ZGF0YSkpOworICAgICAgZGItPmFueWRpcnR5ID0gMDsKKyAgICB9CisgICpwdHIgPSBkYi0+ZGF0YVtYRk9STSAoYWRkcildOworICByZXR1cm4gb2s7Cit9CisKKy8qIFdyaXRlYmFjayBhbnkgZGlydHkgbGluZXMgdG8gdGhlIHJlbW90ZS4gKi8KK3N0YXRpYyBpbnQKK2RjYWNoZV93cml0ZWJhY2sgKGRjYWNoZSkKKyAgICAgRENBQ0hFICpkY2FjaGU7Cit7CisgIHN0cnVjdCBkY2FjaGVfYmxvY2sgKmRiOworCisgIGRiID0gZGNhY2hlLT52YWxpZF9oZWFkOworCisgIHdoaWxlIChkYikKKyAgICB7CisgICAgICBpZiAoIWRjYWNoZV93cml0ZV9saW5lIChkY2FjaGUsIGRiKSkKKwlyZXR1cm4gMDsKKyAgICAgIGRiID0gZGItPnA7CisgICAgfQorICByZXR1cm4gMTsKK30KKworCisvKiBVc2luZyB0aGUgZGF0YSBjYWNoZSBEQ0FDSEUgcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgd29yZCBhdAorICAgYWRkcmVzcyBBRERSIGluIHRoZSByZW1vdGUgbWFjaGluZS4gICovCitpbnQKK2RjYWNoZV9mZXRjaCAoZGNhY2hlLCBhZGRyKQorICAgICBEQ0FDSEUgKmRjYWNoZTsKKyAgICAgQ09SRV9BRERSIGFkZHI7Cit7CisgIGludCByZXM7CisKKyAgaWYgKGRjYWNoZV94ZmVyX21lbW9yeSAoZGNhY2hlLCBhZGRyLCAoY2hhciAqKSZyZXMsIHNpemVvZiByZXMsIDApICE9IHNpemVvZiByZXMpCisgICAgbWVtb3J5X2Vycm9yIChFSU8sIGFkZHIpOworCisgIHJldHVybiByZXM7Cit9CisKKworLyogV3JpdGUgdGhlIGJ5dGUgYXQgUFRSIGludG8gQUREUiBpbiB0aGUgZGF0YSBjYWNoZS4KKyAgIFJldHVybiB6ZXJvIG9uIHdyaXRlIGVycm9yLgorICovCisKK3N0YXRpYyBpbnQKK2RjYWNoZV9wb2tlX2J5dGUgKGRjYWNoZSwgYWRkciwgcHRyKQorICAgICBEQ0FDSEUgKmRjYWNoZTsKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGNoYXIgKnB0cjsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGRjYWNoZV9ibG9jayAqZGIgPSBkY2FjaGVfaGl0IChkY2FjaGUsIGFkZHIpOworCisgIGlmICghZGIpCisgICAgeworICAgICAgZGIgPSBkY2FjaGVfYWxsb2MgKGRjYWNoZSk7CisgICAgICBkYi0+YWRkciA9IE1BU0sgKGFkZHIpOworICAgICAgbWVtc2V0IChkYi0+c3RhdGUsIEVOVFJZX0JBRCwgc2l6ZW9mIChkYi0+ZGF0YSkpOworICAgIH0KKworICBkYi0+ZGF0YVtYRk9STSAoYWRkcildID0gKnB0cjsKKyAgZGItPnN0YXRlW1hGT1JNIChhZGRyKV0gPSBFTlRSWV9ESVJUWTsKKyAgZGItPmFueWRpcnR5ID0gMTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFdyaXRlIHRoZSB3b3JkIGF0IEFERFIgYm90aCBpbiB0aGUgZGF0YSBjYWNoZSBhbmQgaW4gdGhlIHJlbW90ZSBtYWNoaW5lLiAgCisgICBSZXR1cm4gemVybyBvbiB3cml0ZSBlcnJvci4KKyAqLworCitpbnQKK2RjYWNoZV9wb2tlIChkY2FjaGUsIGFkZHIsIGRhdGEpCisgICAgIERDQUNIRSAqZGNhY2hlOworICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgaW50IGRhdGE7Cit7CisgIGlmIChkY2FjaGVfeGZlcl9tZW1vcnkgKGRjYWNoZSwgYWRkciwgKGNoYXIgKikmZGF0YSwgc2l6ZW9mIGRhdGEsIDEpICE9IHNpemVvZiBkYXRhKQorICAgIHJldHVybiAwOworCisgIHJldHVybiBkY2FjaGVfd3JpdGViYWNrIChkY2FjaGUpOworfQorCisKKy8qIEluaXRpYWxpemUgdGhlIGRhdGEgY2FjaGUuICAqLworRENBQ0hFICoKK2RjYWNoZV9pbml0IChyZWFkaW5nLCB3cml0aW5nKQorICAgICBtZW14ZmVyZnVuYyByZWFkaW5nOworICAgICBtZW14ZmVyZnVuYyB3cml0aW5nOworeworICBpbnQgY3NpemUgPSBzaXplb2YgKHN0cnVjdCBkY2FjaGVfYmxvY2spICogRENBQ0hFX1NJWkU7CisgIERDQUNIRSAqZGNhY2hlOworCisgIGRjYWNoZSA9IChEQ0FDSEUgKikgeG1hbGxvYyAoc2l6ZW9mICgqZGNhY2hlKSk7CisgIGRjYWNoZS0+cmVhZF9tZW1vcnkgPSByZWFkaW5nOworICBkY2FjaGUtPndyaXRlX21lbW9yeSA9IHdyaXRpbmc7CisKKyAgZGNhY2hlLT50aGVfY2FjaGUgPSAoc3RydWN0IGRjYWNoZV9ibG9jayAqKSB4bWFsbG9jIChjc2l6ZSk7CisgIG1lbXNldCAoZGNhY2hlLT50aGVfY2FjaGUsIDAsIGNzaXplKTsKKworICBkY2FjaGVfZmx1c2ggKGRjYWNoZSk7CisKKyAgbGFzdF9jYWNoZSA9IGRjYWNoZTsKKyAgcmV0dXJuIGRjYWNoZTsKK30KKworLyogUmVhZCBvciB3cml0ZSBMRU4gYnl0ZXMgZnJvbSBpbmZlcmlvciBtZW1vcnkgYXQgTUVNQUREUiwgdHJhbnNmZXJyaW5nCisgICB0byBvciBmcm9tIGRlYnVnZ2VyIGFkZHJlc3MgTVlBRERSLiAgV3JpdGUgdG8gaW5mZXJpb3IgaWYgU0hPVUxEX1dSSVRFIGlzCisgICBub256ZXJvLiAKKworICAgUmV0dXJucyBsZW5ndGggb2YgZGF0YSB3cml0dGVuIG9yIHJlYWQ7IDAgZm9yIGVycm9yLiAgCisKKyAgIFRoaXMgcm91dGluZSBpcyBpbmRlbmRlZCB0byBiZSBjYWxsZWQgYnkgcmVtb3RlX3hmZXJfIGZ1bmN0aW9ucy4gKi8KKworaW50CitkY2FjaGVfeGZlcl9tZW1vcnkgKGRjYWNoZSwgbWVtYWRkciwgbXlhZGRyLCBsZW4sIHNob3VsZF93cml0ZSkKKyAgICAgRENBQ0hFICpkY2FjaGU7CisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47CisgICAgIGludCBzaG91bGRfd3JpdGU7Cit7CisgIGludCBpOworCisgIGlmIChyZW1vdGVfZGNhY2hlKSAKKyAgICB7CisgICAgICBpbnQgKCp4ZnVuYykgUEFSQU1TICgoRENBQ0hFICpkY2FjaGUsIENPUkVfQUREUiBhZGRyLCBjaGFyICpwdHIpKTsKKyAgICAgIHhmdW5jID0gc2hvdWxkX3dyaXRlID8gZGNhY2hlX3Bva2VfYnl0ZSA6IGRjYWNoZV9wZWVrX2J5dGU7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwl7CisJICBpZiAoIXhmdW5jIChkY2FjaGUsIG1lbWFkZHIgKyBpLCBteWFkZHIgKyBpKSkKKwkgICAgcmV0dXJuIDA7CisJfQorICAgICAgZGNhY2hlLT5jYWNoZV9oYXNfc3R1ZmYgPSAxOworICAgICAgZGNhY2hlX3dyaXRlYmFjayAoZGNhY2hlKTsKKyAgICB9CisgIGVsc2UgCisgICAgeworICAgICAgbWVteGZlcmZ1bmMgeGZ1bmM7CisgICAgICB4ZnVuYyA9IHNob3VsZF93cml0ZSA/IGRjYWNoZS0+d3JpdGVfbWVtb3J5IDogZGNhY2hlLT5yZWFkX21lbW9yeTsKKworICAgICAgaWYgKGRjYWNoZS0+Y2FjaGVfaGFzX3N0dWZmKQorCWRjYWNoZV9mbHVzaCAoZGNhY2hlKTsKKworICAgICAgbGVuID0geGZ1bmMgKG1lbWFkZHIsIG15YWRkciwgbGVuKTsKKyAgICB9CisgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyB2b2lkIAorZGNhY2hlX2luZm8gKGV4cCwgdHR5KQorICAgICBjaGFyICpleHA7CisgICAgIGludCB0dHk7Cit7CisgIHN0cnVjdCBkY2FjaGVfYmxvY2sgKnA7CisKKyAgaWYgKCFyZW1vdGVfZGNhY2hlKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkRjYWNoZSBub3QgZW5hYmxlZFxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICBwcmludGZfZmlsdGVyZWQgKCJEY2FjaGUgZW5hYmxlZCwgbGluZSB3aWR0aCAlZCwgZGVwdGggJWRcbiIsCisJCSAgIExJTkVfU0laRSwgRENBQ0hFX1NJWkUpOworCisgIHByaW50Zl9maWx0ZXJlZCAoIkNhY2hlIHN0YXRlOlxuIik7CisKKyAgZm9yIChwID0gbGFzdF9jYWNoZS0+dmFsaWRfaGVhZDsgcDsgcCA9IHAtPnApCisgICAgeworICAgICAgaW50IGo7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJMaW5lIGF0ICUwOHhkLCByZWZlcmVuY2VkICVkIHRpbWVzXG4iLAorCQkgICAgICAgcC0+YWRkciwgcC0+cmVmcyk7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBMSU5FX1NJWkU7IGorKykKKwlwcmludGZfZmlsdGVyZWQgKCIlMDJ4IiwgcC0+ZGF0YVtqXSAmIDB4RkYpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IExJTkVfU0laRTsgaisrKQorCXByaW50Zl9maWx0ZXJlZCAoIiAlMngiLCBwLT5zdGF0ZVtqXSk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICAgIH0KK30KKwordm9pZAorX2luaXRpYWxpemVfZGNhY2hlICgpCit7CisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgicmVtb3RlY2FjaGUiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKKwkJICAoY2hhciAqKSAmcmVtb3RlX2RjYWNoZSwKKwkJICAiXAorU2V0IGNhY2hlIHVzZSBmb3IgcmVtb3RlIHRhcmdldHMuXG5cCitXaGVuIG9uLCB1c2UgZGF0YSBjYWNoaW5nIGZvciByZW1vdGUgdGFyZ2V0cy4gIEZvciBtYW55IHJlbW90ZSB0YXJnZXRzXG5cCit0aGlzIG9wdGlvbiBjYW4gb2ZmZXIgYmV0dGVyIHRocm91Z2hwdXQgZm9yIHJlYWRpbmcgdGFyZ2V0IG1lbW9yeS5cblwKK1VuZm9ydHVuYXRlbHksIGdkYiBkb2VzIG5vdCBjdXJyZW50bHkga25vdyBhbnl0aGluZyBhYm91dCB2b2xhdGlsZVxuXAorcmVnaXN0ZXJzIGFuZCB0aHVzIGRhdGEgY2FjaGluZyB3aWxsIHByb2R1Y2UgaW5jb3JyZWN0IHJlc3VsdHMgd2l0aFxuXAordm9sYXRpbGUgcmVnaXN0ZXJzIGFyZSBpbiB1c2UuICBCeSBkZWZhdWx0LCB0aGlzIG9wdGlvbiBpcyBvbi4iLAorCQkgICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKKworICBhZGRfaW5mbyAoImRjYWNoZSIsIGRjYWNoZV9pbmZvLAorCSAgICAiUHJpbnQgaW5mb3JtYXRpb24gb24gdGhlIGRjYWNoZSBwZXJmb3JtYW5jZS4iKTsKKworfQpkaWZmIC0tZ2l0IGEvZ2RiL2RjYWNoZS5oIGIvZ2RiL2RjYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYjc2MmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZGNhY2hlLmgKQEAgLTAsMCArMSw1MCBAQAorLyogRGVjbGFyYXRpb25zIGZvciBjYWNoaW5nLiAgVHlwaWNhbGx5IHVzZWQgYnkgcmVtb3RlIGJhY2sgZW5kcyBmb3IKKyAgIGNhY2hpbmcgcmVtb3RlIG1lbW9yeS4KKworICAgQ29weXJpZ2h0IDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBEQ0FDSEVfSAorI2RlZmluZSBEQ0FDSEVfSAorCit0eXBlZGVmIGludCAoKm1lbXhmZXJmdW5jKSBQQVJBTVMoKENPUkVfQUREUiBtZW1hZGRyLAorCQkJICAgICBjaGFyICpteWFkZHIsCisJCQkgICAgIGludCBsZW4pKTsKKwordHlwZWRlZiBzdHJ1Y3QgZGNhY2hlX3N0cnVjdCBEQ0FDSEU7CisKKy8qIFVzaW5nIHRoZSBkYXRhIGNhY2hlIERDQUNIRSByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSB3b3JkIGF0CisgICBhZGRyZXNzIEFERFIgaW4gdGhlIHJlbW90ZSBtYWNoaW5lLiAgKi8KK2ludCBkY2FjaGVfZmV0Y2ggUEFSQU1TKChEQ0FDSEUgKmRjYWNoZSwgQ09SRV9BRERSIGFkZHIpKTsKKworLyogRmx1c2ggRENBQ0hFLiAqLwordm9pZCBkY2FjaGVfZmx1c2ggUEFSQU1TKChEQ0FDSEUgKmRjYWNoZSkpOworCisvKiBJbml0aWFsaXplIERDQUNIRS4gKi8KK0RDQUNIRSAqZGNhY2hlX2luaXQgUEFSQU1TKChtZW14ZmVyZnVuYyByZWFkaW5nLCBtZW14ZmVyZnVuYyB3cml0aW5nKSk7CisKKy8qIFdyaXRlIHRoZSB3b3JkIGF0IEFERFIgYm90aCBpbiB0aGUgZGF0YSBjYWNoZSBhbmQgaW4gdGhlIHJlbW90ZSBtYWNoaW5lLiAgKi8KK2ludCBkY2FjaGVfcG9rZSBQQVJBTVMoKERDQUNIRSAqZGNhY2hlLCBDT1JFX0FERFIgYWRkciwgaW50IGRhdGEpKTsKKworLyogU2ltcGxlIHRvIGNhbGwgZnJvbSA8cmVtb3RlPl94ZmVyX21lbW9yeSAqLworCitpbnQgZGNhY2hlX3hmZXJfbWVtb3J5IFBBUkFNUygoRENBQ0hFICpjYWNoZSwgQ09SRV9BRERSIG1lbSwgY2hhciAqbXksIGludCBsZW4sIGludCBzaG91bGRfd3JpdGUpKTsKKworLyogV3JpdGUgdGhlIGJ5dGVzIGF0IEFERFIgaW50byB0aGUgZGF0YSBjYWNoZSBhbmQgdGhlIHJlbW90ZSBtYWNoaW5lLiAqLworaW50IGRjYWNoZV9wb2tlX2Jsb2NrIFBBUkFNUygoRENBQ0hFICpjYWNoZSwgQ09SRV9BRERSIG1lbSwgY2hhciogbXksIGludCBsZW4pKTsKKyNlbmRpZiAvKiBEQ0FDSEVfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2RlYnVnaWZ5LmMgYi9nZGIvZGVidWdpZnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDFiNTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2RlYnVnaWZ5LmMKQEAgLTAsMCArMSwxMDkgQEAKKworLyogRGVidWcgbWFjcm9zIGZvciBkZXZlbG9wZW1udC4KKyAgIENvcHlyaWdodCAxOTk3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIERFQlVHSUZZCisjaW5jbHVkZSAiZGVidWdpZnkuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKworI2RlZmluZSBSRURJUkVDVAorCitzdGF0aWMgRklMRSAqZm91dCA9IE5VTEw7CitzdGF0aWMgY2hhciBmbmFtZVsxMjhdOworc3RhdGljIGludCBmaWxlX2NudCA9IDA7CS8qIGNvdW50IG51bWJlciBvZiBvcGVuIGZpbGVzICovCisKK3ZvaWQgCitwdXRzX2RiZyAoZGF0YSkKKyAgY29uc3QgY2hhciAqZGF0YTsKK3sKKyAgRklMRSAqZmRiZzsKKworICBmZGJnID0gZm9wZW4gKCJkYmcubG9nIiwgImErIik7CisgIGlmIChmZGJnID09IE5VTEwpCisgICAgcmV0dXJuOworICBmcHJpbnRmIChmZGJnLCBkYXRhKTsKKyAgZmNsb3NlIChmZGJnKTsKK30KKworLyogQ2FuJ3QgZWFzaWx5IGdldCB0aGUgbWVzc2FnZSBiYWNrIHRvIGdkYi4uLiB3cml0ZSB0byBhIGxvZyBpbnN0ZWFkLiAqLwordm9pZCAKK2ZwdXRzX2RiZyAoZGF0YSwgZmFrZXN0cmVhbSkKKyAgY29uc3QgY2hhciAqZGF0YTsKKyAgRklMRSAqZmFrZXN0cmVhbTsKK3sKKyNpZmRlZiBSRURJUkVDVAorICBwdXRzX2RiZyAoZGF0YSk7CisjZWxzZSAvKiBSRURJUkVDVCAqLworCisgIGlmIChmYWtlc3RyZWFtID09IHN0ZG91dCB8fCBmYWtlc3RyZWFtID09IHN0ZGVyciB8fCBmYWtlc3RyZWFtID09IE5VTEwpCisgICAgeworICAgICAgaWYgKGZvdXQgPT0gTlVMTCkKKwl7CisJICBmb3IgKGZpbGVfY250ID0gMDsgZmlsZV9jbnQgPCAyMDsgZmlsZV9jbnQrKykKKwkgICAgeworCSAgICAgIHNwcmludGYgKGZuYW1lLCAiZGJnJWQubG9nIiwgZmlsZV9jbnQpOworCSAgICAgIGlmICgoZm91dCA9IGZvcGVuIChmbmFtZSksICJyIikgIT0gTlVMTCkKKwkJZmNsb3NlIChmb3V0KTsKKwkgICAgICBlbHNlCisJCWJyZWFrOworCSAgICB9CisJICBmb3V0ID0gZm9wZW4gKGZuYW1lLCAidyIpOworCSAgaWYgKGZvdXQgPT0gTlVMTCkKKwkgICAgcmV0dXJuOworCX0KKyAgICAgIGZha2VzdHJlYW0gPSBmb3V0OworICAgIH0KKyAgZnByaW50ZiAoZmFrZXN0cmVhbSwgZGF0YSk7CisgIGZmbHVzaCAoZmFrZXN0cmVhbSk7CisjZW5kaWYgLyogUkVESVJFQ1QgKi8KK30KKwordm9pZCAKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKK3ByaW50Zl9kYmcgKGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pCisjZWxzZQorcHJpbnRmX2RiZyAodmFfYWxpc3QpIAorICAgICB2YV9kY2wKKyNlbmRpZgoreworICB2YV9saXN0IGFyZ3M7CisgIGNoYXIgYnVmWzI1Nl07CisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworI2Vsc2UKKyAgY2hhciAqZm9ybWF0OworCisgIHZhX3N0YXJ0IChhcmdzKTsKKyAgZm9ybWF0ID0gdmFfYXJnIChhcmdzLCBjaGFyICopOyAKKyNlbmRpZgorICB2c3ByaW50ZiAoYnVmLCBmb3JtYXQsIGFyZ3MpOworICBwdXRzX2RiZyAoYnVmKTsKKyAgdmFfZW5kIChhcmdzKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9kZWJ1Z2lmeS5oIGIvZ2RiL2RlYnVnaWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhZTkyYgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9kZWJ1Z2lmeS5oCkBAIC0wLDAgKzEsODMgQEAKKworLyogRGVidWcgbWFjcm9zIGZvciBkZXZlbG9wbWVudC4KKyAgIENvcHlyaWdodCAxOTk3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIF9ERUJVR0lGWV9IXworI2RlZmluZSBfREVCVUdJRllfSF8KKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8dmFyYXJncy5oPgorI2VuZGlmCisKKyNpZmRlZiBERUJVR0lGWQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2lmZGVmIFRPX1NDUkVFTgorI2lmZGVmIF9XaW4zMgorI2RlZmluZSBEQkcoeCkgT3V0cHV0RGVidWdTdHJpbmcgeAorI2Vsc2UKKyNkZWZpbmUgREJHKHgpIHByaW50ZiB4CisjZW5kaWYKKyNlbGlmIFRPX0dEQgorI2RlZmluZSBEQkcoeCkgcHJpbnRmX3VuZmlsdGVyZWQgeAorI2VsaWYgVE9fUE9QVVAKKyNpZmRlZiBfV2luMzIKKyNkZWZpbmUgREJHKHgpIE1lc3NhZ2VCb3ggeAorI2Vsc2UKKyNkZWZpbmUgREJHKHgpIHByaW50ZiB4CisjZW5kaWYKKyNlbHNlIC8qIGRlZmF1bHQ6IFRPX0ZJTEUgImdkYi5sb2ciICovCisjZGVmaW5lIERCRyh4KSBwcmludGZfZGJnIHgKKyNlbmRpZgorCisjZGVmaW5lIEFTU0VSVCh4KSBhc3NlcnQoeCkKKworI2Vsc2UgLyogREVCVUdJRlkgKi8KKyNkZWZpbmUgREJHKHgpCisjZGVmaW5lIEFTU0VSVCh4KQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKyNpZmRlZiBSRURJUkVDVAorI2RlZmluZSBwcmludGZfdW5maWx0ZXJlZCBwcmludGZfZGJnCisjZGVmaW5lIGZwdXRzX3VuZmlsdGVyZWQgZnB1dHNfZGJnCisgIGV4dGVybiB2b2lkIGZwdXRzX2RiZyBQQVJBTVMgKChjb25zdCBjaGFyICpmbXQsIEZJTEUgKiBmYWtlc3RyZWFtKSk7CisjZW5kaWYgLyogUkVESVJFQ1QgKi8KKworICBleHRlcm4gdm9pZCBwdXRzX2RiZyBQQVJBTVMgKChjb25zdCBjaGFyICpmbXQpKTsKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyAgZXh0ZXJuIHZvaWQgcHJpbnRmX2RiZyBQQVJBTVMgKChjb25zdCBjaGFyICpmbXQsLi4uKSk7CisjZWxzZQorICBleHRlcm4gdm9pZCBwcmludGZfZGJnIFBBUkFNUyAoKHZhX2FsaXN0IHZhX2RjbCkpOworI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9ERUJVR0lGWV9IXyAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2RlZnMuaCBiL2dkYi9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA1NTJhMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9kZWZzLmgKQEAgLTAsMCArMSwxMTM5IEBACisvKiBCYXNpYywgaG9zdC1zcGVjaWZpYywgYW5kIHRhcmdldC1zcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IgR0RCLgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCA4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTgsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgREVGU19ICisjZGVmaW5lIERFRlNfSAorCisjaW5jbHVkZSAiY29uZmlnLmgiCQkvKiBHZW5lcmF0ZWQgYnkgY29uZmlndXJlICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgkJLyogU3lzdGVtIGNhbGwgZXJyb3IgcmV0dXJuIHN0YXR1cyAqLworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaWZkZWYgSEFWRV9TVERERUZfSAorIyAgaW5jbHVkZSA8c3RkZGVmLmg+CisjZWxzZQorIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAgLyogZm9yIHNpemVfdCAqLworI2VuZGlmCisKKy8qIEp1c3QgaW4gY2FzZSB0aGV5J3JlIG5vdCBkZWZpbmVkIGluIHN0ZGlvLmguICovCisKKyNpZm5kZWYgU0VFS19TRVQKKyNkZWZpbmUgU0VFS19TRVQgMAorI2VuZGlmCisjaWZuZGVmIFNFRUtfQ1VSCisjZGVmaW5lIFNFRUtfQ1VSIDEKKyNlbmRpZgorCisvKiBGaXJzdCBpbmNsdWRlIGFuc2lkZWNsLmggc28gd2UgY2FuIHVzZSB0aGUgdmFyaW91cyBtYWNybyBkZWZpbml0aW9ucworICAgaGVyZSBhbmQgaW4gYWxsIHN1YnNlcXVlbnQgZmlsZSBpbmNsdXNpb25zLiAgKi8KKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8dmFyYXJncy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKworLyogbGliaWJlcnR5LmggY2FuJ3QgZGVjbGFyZSB0aGlzIG9uZSwgYnV0IGV2aWRlbnRseSB3ZSBjYW4uICAqLworZXh0ZXJuIGNoYXIgKnN0cnNpZ25hbCBQQVJBTVMgKChpbnQpKTsKKworI2luY2x1ZGUgInByb2dyZXNzLmgiCisKKyNpZmRlZiBVU0VfTU1BTExPQworI2luY2x1ZGUgIm1tYWxsb2MuaCIKKyNlbmRpZgorCisvKiBGb3IgQkZENjQgYW5kIGJmZF92bWEuICAqLworI2luY2x1ZGUgImJmZC5oIgorCisvKiBBbiBhZGRyZXNzIGluIHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkLiAgSG9zdCBieXRlIG9yZGVyLiAgUmF0aGVyCisgICB0aGFuIGR1cGxpY2F0ZSBhbGwgdGhlIGxvZ2ljIGluIEJGRCB3aGljaCBmaWd1cmVzIG91dCB3aGF0IHR5cGUKKyAgIHRoaXMgaXMgKGxvbmcsIGxvbmcgbG9uZywgZXRjLikgYW5kIHdoZXRoZXIgaXQgbmVlZHMgdG8gYmUgNjQKKyAgIGJpdHMgKHRoZSBob3N0L3RhcmdldCBpbnRlcmFjdGlvbnMgYXJlIHN1YnRsZSksIHdlIGp1c3QgdXNlCisgICBiZmRfdm1hLiAgKi8KKwordHlwZWRlZiBiZmRfdm1hIENPUkVfQUREUjsKKworI2lmbmRlZiBtaW4KKyNkZWZpbmUgbWluKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisjZW5kaWYKKyNpZm5kZWYgbWF4CisjZGVmaW5lIG1heChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisKKy8qIEdkYiBkb2VzICpsb3RzKiBvZiBzdHJpbmcgY29tcGFyZXMuICBVc2UgbWFjcm9zIHRvIHNwZWVkIHRoZW0gdXAgYnkKKyAgIGF2b2lkaW5nIGZ1bmN0aW9uIGNhbGxzIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXJzIGFyZSBub3QgdGhlIHNhbWUuICovCisKKyNkZWZpbmUgU1RSQ01QKGEsYikgKCooYSkgPT0gKihiKSA/IHN0cmNtcCAoKGEpLCAoYikpIDogKGludCkqKGEpIC0gKGludCkqKGIpKQorI2RlZmluZSBTVFJFUShhLGIpICgqKGEpID09ICooYikgPyAhc3RyY21wICgoYSksIChiKSkgOiAwKQorI2RlZmluZSBTVFJFUU4oYSxiLGMpICgqKGEpID09ICooYikgPyAhc3RybmNtcCAoKGEpLCAoYiksIChjKSkgOiAwKQorCisvKiBUaGUgY2hhcmFjdGVyIEdOVSBDKysgdXNlcyB0byBidWlsZCBpZGVudGlmaWVycyB0aGF0IG11c3QgYmUgdW5pcXVlIGZyb20KKyAgIHRoZSBwcm9ncmFtJ3MgaWRlbnRpZmllcnMgKHN1Y2ggYXMgJHRoaXMgYW5kICQkdnB0cikuICAqLworI2RlZmluZSBDUExVU19NQVJLRVIgJyQnCS8qIE1heSBiZSBvdmVycmlkZGVuIHRvICcuJyBmb3IgU3lzViAqLworCisvKiBDaGVjayBpZiBhIGNoYXJhY3RlciBpcyBvbmUgb2YgdGhlIGNvbW1vbmx5IHVzZWQgQysrIG1hcmtlciBjaGFyYWN0ZXJzLiAgKi8KK2V4dGVybiBpbnQgaXNfY3BsdXNfbWFya2VyIFBBUkFNUyAoKGludCkpOworCisvKiB1c2UgdHVpIGludGVyZmFjZSBpZiBub24temVybyAqLworZXh0ZXJuIGludCB0dWlfdmVyc2lvbjsKKworI2lmIGRlZmluZWQoVFVJKQorLyogYWxsIGludm9jYXRpb25zIG9mIFRVSURPIHNob3VsZCBoYXZlIHR3byBzZXRzIG9mIHBhcmVucyAqLworI2RlZmluZSBUVUlETyh4KQl0dWlEbyB4CisjZWxzZQorI2RlZmluZSBUVUlETyh4KQorI2VuZGlmCisKKy8qIGVuYWJsZSB4ZGIgY29tbWFuZHMgaWYgc2V0ICovCitleHRlcm4gaW50IHhkYl9jb21tYW5kczsKKworLyogZW5hYmxlIGRieCBjb21tYW5kcyBpZiBzZXQgKi8KK2V4dGVybiBpbnQgZGJ4X2NvbW1hbmRzOworCitleHRlcm4gaW50IHF1aXRfZmxhZzsKK2V4dGVybiBpbnQgaW1tZWRpYXRlX3F1aXQ7CitleHRlcm4gaW50IHNldmVuYml0X3N0cmluZ3M7CisKK2V4dGVybiB2b2lkIHF1aXQgUEFSQU1TICgodm9pZCkpOworCisjaWZkZWYgUVVJVAorLyogZG8gdHdpY2UgdG8gZm9yY2UgY29tcGlsZXIgd2FybmluZyAqLworI2RlZmluZSBRVUlUX0ZJWE1FICJGSVhNRSIKKyNkZWZpbmUgUVVJVF9GSVhNRSAiaWdub3JpbmcgcmVkZWZpbml0aW9uIG9mIFFVSVQiCisjZWxzZQorI2RlZmluZSBRVUlUIHsgXAorICBpZiAocXVpdF9mbGFnKSBxdWl0ICgpOyBcCisgIGlmIChpbnRlcmFjdGl2ZV9ob29rKSBpbnRlcmFjdGl2ZV9ob29rICgpOyBcCisgIFBST0dSRVNTICgxKTsgXAorfQorI2VuZGlmCisKKy8qIENvbW1hbmQgY2xhc3NlcyBhcmUgdG9wLWxldmVsIGNhdGVnb3JpZXMgaW50byB3aGljaCBjb21tYW5kcyBhcmUgYnJva2VuCisgICBkb3duIGZvciAiaGVscCIgcHVycG9zZXMuICAKKyAgIE5vdGVzIG9uIGNsYXNzZXM6IGNsYXNzX2FsaWFzIGlzIGZvciBhbGlhcyBjb21tYW5kcyB3aGljaCBhcmUgbm90CisgICBhYmJyZXZpYXRpb25zIG9mIHRoZSBvcmlnaW5hbCBjb21tYW5kLiAgY2xhc3MtcHNldWRvIGlzIGZvciBjb21tYW5kcworICAgd2hpY2ggYXJlIG5vdCByZWFsbHkgY29tbWFuZHMgbm9yIGhlbHAgdG9waWNzICgic3RvcCIpLiAgKi8KKworZW51bSBjb21tYW5kX2NsYXNzCit7CisgIC8qIFNwZWNpYWwgYXJncyB0byBoZWxwX2xpc3QgKi8KKyAgYWxsX2NsYXNzZXMgPSAtMiwgYWxsX2NvbW1hbmRzID0gLTEsCisgIC8qIENsYXNzZXMgb2YgY29tbWFuZHMgKi8KKyAgbm9fY2xhc3MgPSAtMSwgY2xhc3NfcnVuID0gMCwgY2xhc3NfdmFycywgY2xhc3Nfc3RhY2ssCisgIGNsYXNzX2ZpbGVzLCBjbGFzc19zdXBwb3J0LCBjbGFzc19pbmZvLCBjbGFzc19icmVha3BvaW50LCBjbGFzc190cmFjZSwKKyAgY2xhc3NfYWxpYXMsIGNsYXNzX29ic2N1cmUsIGNsYXNzX3VzZXIsIGNsYXNzX21haW50ZW5hbmNlLAorICBjbGFzc19wc2V1ZG8sIGNsYXNzX3R1aSwgY2xhc3NfeGRiCit9OworCisvKiBMYW5ndWFnZXMgcmVwcmVzZW50ZWQgaW4gdGhlIHN5bWJvbCB0YWJsZSBhbmQgZWxzZXdoZXJlLgorICAgVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgaW4gbGFuZ3VhZ2UuaCwgYnV0IHNpbmNlIGVudW0ncyBjYW4ndAorICAgYmUgZm9yd2FyZCBkZWNsYXJlZCB0byBzYXRpc2Z5IG9wYXF1ZSByZWZlcmVuY2VzIGJlZm9yZSB0aGVpcgorICAgYWN0dWFsIGRlZmluaXRpb24sIG5lZWRzIHRvIGJlIGhlcmUuICovCisKK2VudW0gbGFuZ3VhZ2UgCit7CisgICBsYW5ndWFnZV91bmtub3duLCAJCS8qIExhbmd1YWdlIG5vdCBrbm93biAqLworICAgbGFuZ3VhZ2VfYXV0bywJCS8qIFBsYWNlaG9sZGVyIGZvciBhdXRvbWF0aWMgc2V0dGluZyAqLworICAgbGFuZ3VhZ2VfYywgCQkJLyogQyAqLworICAgbGFuZ3VhZ2VfY3BsdXMsIAkJLyogQysrICovCisgICBsYW5ndWFnZV9qYXZhLAkJLyogSmF2YSAqLworICAgbGFuZ3VhZ2VfY2hpbGwsCQkvKiBDaGlsbCAqLworICAgbGFuZ3VhZ2VfZm9ydHJhbiwJCS8qIEZvcnRyYW4gKi8KKyAgIGxhbmd1YWdlX20yLAkJCS8qIE1vZHVsYS0yICovCisgICBsYW5ndWFnZV9hc20sCQkvKiBBc3NlbWJseSBsYW5ndWFnZSAqLworICAgbGFuZ3VhZ2Vfc2NtCQkJLyogU2NoZW1lIC8gR3VpbGUgKi8KK307CisKK2VudW0gcHJlY2lzaW9uX3R5cGUKK3sKKyAgc2luZ2xlX3ByZWNpc2lvbiwKKyAgZG91YmxlX3ByZWNpc2lvbiwKKyAgdW5zcGVjaWZpZWRfcHJlY2lzaW9uCit9OworICAgCisvKiB0aGUgY2xlYW51cCBsaXN0IHJlY29yZHMgdGhpbmdzIHRoYXQgaGF2ZSB0byBiZSB1bmRvbmUKKyAgIGlmIGFuIGVycm9yIGhhcHBlbnMgKGRlc2NyaXB0b3JzIHRvIGJlIGNsb3NlZCwgbWVtb3J5IHRvIGJlIGZyZWVkLCBldGMuKQorICAgRWFjaCBsaW5rIGluIHRoZSBjaGFpbiByZWNvcmRzIGEgZnVuY3Rpb24gdG8gY2FsbCBhbmQgYW4KKyAgIGFyZ3VtZW50IHRvIGdpdmUgaXQuCisKKyAgIFVzZSBtYWtlX2NsZWFudXAgdG8gYWRkIGFuIGVsZW1lbnQgdG8gdGhlIGNsZWFudXAgY2hhaW4uCisgICBVc2UgZG9fY2xlYW51cHMgdG8gZG8gYWxsIGNsZWFudXAgYWN0aW9ucyBiYWNrIHRvIGEgZ2l2ZW4KKyAgIHBvaW50IGluIHRoZSBjaGFpbi4gIFVzZSBkaXNjYXJkX2NsZWFudXBzIHRvIHJlbW92ZSBjbGVhbnVwcworICAgZnJvbSB0aGUgY2hhaW4gYmFjayB0byBhIGdpdmVuIHBvaW50LCBub3QgZG9pbmcgdGhlbS4gICovCisKK3N0cnVjdCBjbGVhbnVwCit7CisgIHN0cnVjdCBjbGVhbnVwICpuZXh0OworICB2b2lkICgqZnVuY3Rpb24pIFBBUkFNUyAoKFBUUikpOworICBQVFIgYXJnOworfTsKKworCisvKiBUaGUgYWJpbGl0eSB0byBkZWNsYXJlIHRoYXQgYSBmdW5jdGlvbiBuZXZlciByZXR1cm5zIGlzIHVzZWZ1bCwgYnV0CisgICBub3QgcmVhbGx5IHJlcXVpcmVkIHRvIGNvbXBpbGUgR0RCIHN1Y2Nlc3NmdWxseSwgc28gdGhlIE5PUkVUVVJOIGFuZAorICAgQVRUUl9OT1JFVFVSTiBtYWNyb3Mgbm9ybWFsbHkgZXhwYW5kIGludG8gbm90aGluZy4gICovCisKKy8qIElmIGNvbXBpbGluZyB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIEdDQywgYSBmdW5jdGlvbiBtYXkgYmUgZGVjbGFyZWQKKyAgICJ2b2xhdGlsZSIgdG8gaW5kaWNhdGUgdGhhdCBpdCBkb2VzIG5vdCByZXR1cm4uICAqLworCisjaWZuZGVmIE5PUkVUVVJOCisjIGlmIGRlZmluZWQoX19HTlVDX18pIFwKKyAgICAgJiYgKF9fR05VQ19fID09IDEgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA3KSkKKyMgIGRlZmluZSBOT1JFVFVSTiB2b2xhdGlsZQorIyBlbHNlCisjICBkZWZpbmUgTk9SRVRVUk4gLyogbm90aGluZyAqLworIyBlbmRpZgorI2VuZGlmCisKKy8qIEdDQyAyLjUgYW5kIGxhdGVyIHZlcnNpb25zIGRlZmluZSBhIGZ1bmN0aW9uIGF0dHJpYnV0ZSAibm9yZXR1cm4iLAorICAgd2hpY2ggaXMgdGhlIHByZWZlcnJlZCB3YXkgdG8gZGVjbGFyZSB0aGF0IGEgZnVuY3Rpb24gbmV2ZXIgcmV0dXJucy4KKyAgIEhvd2V2ZXIgR0NDIDIuNyBhcHBlYXJzIHRvIGJlIHRoZSBmaXJzdCB2ZXJzaW9uIGluIHdoaWNoIHRoaXMgZnVsbHkKKyAgIHdvcmtzIGV2ZXJ5d2hlcmUgd2UgdXNlIGl0LiAqLworCisjaWZuZGVmIEFUVFJfTk9SRVRVUk4KKyMgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA3CisjICBkZWZpbmUgQVRUUl9OT1JFVFVSTiBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKQorIyBlbHNlCisjICBkZWZpbmUgQVRUUl9OT1JFVFVSTiAvKiBub3RoaW5nICovCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBBVFRSX0ZPUk1BVAorIyBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDQgJiYgZGVmaW5lZCAoX19BTlNJX1BST1RPVFlQRVMpCisjICBkZWZpbmUgQVRUUl9GT1JNQVQodHlwZSwgeCwgeSkgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCh0eXBlLCB4LCB5KSkpCisjIGVsc2UKKyMgIGRlZmluZSBBVFRSX0ZPUk1BVCh0eXBlLCB4LCB5KSAvKiBub3RoaW5nICovCisjIGVuZGlmCisjZW5kaWYKKworLyogTmVlZGVkIGZvciB2YXJpb3VzIHByb3RvdHlwZXMgKi8KKworI2lmZGVmIF9fU1REQ19fCitzdHJ1Y3Qgc3ltdGFiOworc3RydWN0IGJyZWFrcG9pbnQ7CisjZW5kaWYKKworLyogRnJvbSBibG9ja2ZyYW1lLmMgKi8KKworZXh0ZXJuIGludCBpbnNpZGVfZW50cnlfZnVuYyBQQVJBTVMgKChDT1JFX0FERFIpKTsKKworZXh0ZXJuIGludCBpbnNpZGVfZW50cnlfZmlsZSBQQVJBTVMgKChDT1JFX0FERFIgYWRkcikpOworCitleHRlcm4gaW50IGluc2lkZV9tYWluX2Z1bmMgUEFSQU1TICgoQ09SRV9BRERSIHBjKSk7CisKKy8qIEZyb20gY2gtbGFuZy5jLCBmb3IgdGhlIG1vbWVudC4gKEZJWE1FKSAqLworCitleHRlcm4gY2hhciAqY2hpbGxfZGVtYW5nbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CisKKy8qIEZyb20gdXRpbHMuYyAqLworCitleHRlcm4gdm9pZCBub3RpY2VfcXVpdCBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBpbnQgc3RyY21wX2l3IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CisKK2V4dGVybiBjaGFyICpzYWZlX3N0cmVycm9yIFBBUkFNUyAoKGludCkpOworCitleHRlcm4gY2hhciAqc2FmZV9zdHJzaWduYWwgUEFSQU1TICgoaW50KSk7CisKK2V4dGVybiB2b2lkIGluaXRfbWFsbG9jIFBBUkFNUyAoKHZvaWQgKikpOworCitleHRlcm4gdm9pZCByZXF1ZXN0X3F1aXQgUEFSQU1TICgoaW50KSk7CisKK2V4dGVybiB2b2lkIGRvX2NsZWFudXBzIFBBUkFNUyAoKHN0cnVjdCBjbGVhbnVwICopKTsKK2V4dGVybiB2b2lkIGRvX2ZpbmFsX2NsZWFudXBzIFBBUkFNUyAoKHN0cnVjdCBjbGVhbnVwICopKTsKK2V4dGVybiB2b2lkIGRvX215X2NsZWFudXBzIFBBUkFNUyAoKHN0cnVjdCBjbGVhbnVwICoqLCBzdHJ1Y3QgY2xlYW51cCAqKSk7CitleHRlcm4gdm9pZCBkb19ydW5fY2xlYW51cHMgUEFSQU1TICgoc3RydWN0IGNsZWFudXAgKikpOworCitleHRlcm4gdm9pZCBkaXNjYXJkX2NsZWFudXBzIFBBUkFNUyAoKHN0cnVjdCBjbGVhbnVwICopKTsKK2V4dGVybiB2b2lkIGRpc2NhcmRfZmluYWxfY2xlYW51cHMgUEFSQU1TICgoc3RydWN0IGNsZWFudXAgKikpOworZXh0ZXJuIHZvaWQgZGlzY2FyZF9teV9jbGVhbnVwcyBQQVJBTVMgKChzdHJ1Y3QgY2xlYW51cCAqKiwgc3RydWN0IGNsZWFudXAgKikpOworCit0eXBlZGVmIHZvaWQgKCptYWtlX2NsZWFudXBfZnVuYykgUEFSQU1TICgodm9pZCAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgY2xlYW51cCAqbWFrZV9jbGVhbnVwIFBBUkFNUyAoKG1ha2VfY2xlYW51cF9mdW5jLCB2b2lkICopKTsKKworZXh0ZXJuIHN0cnVjdCBjbGVhbnVwICptYWtlX2ZpbmFsX2NsZWFudXAgUEFSQU1TICgobWFrZV9jbGVhbnVwX2Z1bmMsIHZvaWQgKikpOworCitleHRlcm4gc3RydWN0IGNsZWFudXAgKm1ha2VfbXlfY2xlYW51cCBQQVJBTVMgKChzdHJ1Y3QgY2xlYW51cCAqKiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX2NsZWFudXBfZnVuYywgdm9pZCAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgY2xlYW51cCAqbWFrZV9ydW5fY2xlYW51cCBQQVJBTVMgKChtYWtlX2NsZWFudXBfZnVuYywgdm9pZCAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgY2xlYW51cCAqc2F2ZV9jbGVhbnVwcyBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gc3RydWN0IGNsZWFudXAgKnNhdmVfZmluYWxfY2xlYW51cHMgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHN0cnVjdCBjbGVhbnVwICpzYXZlX215X2NsZWFudXBzIFBBUkFNUyAoKHN0cnVjdCBjbGVhbnVwICoqKSk7CisKK2V4dGVybiB2b2lkIHJlc3RvcmVfY2xlYW51cHMgUEFSQU1TICgoc3RydWN0IGNsZWFudXAgKikpOworZXh0ZXJuIHZvaWQgcmVzdG9yZV9maW5hbF9jbGVhbnVwcyBQQVJBTVMgKChzdHJ1Y3QgY2xlYW51cCAqKSk7CitleHRlcm4gdm9pZCByZXN0b3JlX215X2NsZWFudXBzIFBBUkFNUyAoKHN0cnVjdCBjbGVhbnVwICoqLCBzdHJ1Y3QgY2xlYW51cCAqKSk7CisKK2V4dGVybiB2b2lkIGZyZWVfY3VycmVudF9jb250ZW50cyBQQVJBTVMgKChjaGFyICoqKSk7CisKK2V4dGVybiB2b2lkIG51bGxfY2xlYW51cCBQQVJBTVMgKChQVFIpKTsKKworZXh0ZXJuIGludCBteXJlYWQgUEFSQU1TICgoaW50LCBjaGFyICosIGludCkpOworCitleHRlcm4gaW50IHF1ZXJ5IFBBUkFNUygoY2hhciAqLCAuLi4pKQorICAgICBBVFRSX0ZPUk1BVChwcmludGYsIDEsIDIpOworCisjaWYgIWRlZmluZWQgKFVTRV9NTUFMTE9DKQorZXh0ZXJuIFBUUiBtbWFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7CitleHRlcm4gUFRSIG1yZWFsbG9jIFBBUkFNUyAoKFBUUiwgUFRSLCBzaXplX3QpKTsKK2V4dGVybiB2b2lkIG1mcmVlIFBBUkFNUyAoKFBUUiwgUFRSKSk7CisjZW5kaWYKKworLyogRnJvbSBkZW1hbmdsZS5jICovCisKK2V4dGVybiB2b2lkIHNldF9kZW1hbmdsaW5nX3N0eWxlIFBBUkFNUyAoKGNoYXIgKikpOworCisvKiBGcm9tIHRtLmggKi8KKworc3RydWN0IHR5cGU7Cit0eXBlZGVmIGludCAodXNlX3N0cnVjdF9jb252ZW50aW9uX2ZuKSBQQVJBTVMgKChpbnQgZ2NjX3AsIHN0cnVjdCB0eXBlICp2YWx1ZV90eXBlKSk7CitleHRlcm4gdXNlX3N0cnVjdF9jb252ZW50aW9uX2ZuIGdlbmVyaWNfdXNlX3N0cnVjdF9jb252ZW50aW9uOworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgKihicmVha3BvaW50X2Zyb21fcGNfZm4pIFBBUkFNUyAoKENPUkVfQUREUiAqcGNwdHIsIGludCAqbGVucHRyKSk7CisKKworDAorLyogQW5ub3RhdGlvbiBzdHVmZi4gICovCisKK2V4dGVybiBpbnQgYW5ub3RhdGlvbl9sZXZlbDsgLyogaW4gc3RhY2suYyAqLworDAorZXh0ZXJuIHZvaWQgYmVnaW5fbGluZSBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIHdyYXBfaGVyZSBQQVJBTVMgKChjaGFyICopKTsKKworZXh0ZXJuIHZvaWQgcmVpbml0aWFsaXplX21vcmVfZmlsdGVyIFBBUkFNUyAoKHZvaWQpKTsKKworLyogbmV3ICovCitlbnVtIHN0cmVhbXR5cGUKK3sKKyAgYWZpbGUsCisgIGFzdHJpbmcKK307CisKKy8qIG5ldyAqLwordHlwZWRlZiBzdHJ1Y3QgdHVpX3N0cmVhbQoreworICBlbnVtIHN0cmVhbXR5cGUgdHNfc3RyZWFtdHlwZTsKKyAgRklMRSAqdHNfZmlsZXN0cmVhbTsKKyAgY2hhciAqdHNfc3RyYnVmOworICBpbnQgdHNfYnVmbGVuOworfSBHREJfRklMRTsKKworZXh0ZXJuIEdEQl9GSUxFICpnZGJfc3Rkb3V0OworZXh0ZXJuIEdEQl9GSUxFICpnZGJfc3RkZXJyOworCisjaWYgMAordHlwZWRlZiBGSUxFIEdEQl9GSUxFOworI2RlZmluZSBnZGJfc3Rkb3V0IHN0ZG91dAorI2RlZmluZSBnZGJfc3RkZXJyIHN0ZGVycgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFRVSSkKKyNpbmNsdWRlICJ0dWkuaCIKKyNpbmNsdWRlICJ0dWlDb21tYW5kLmgiCisjaW5jbHVkZSAidHVpRGF0YS5oIgorI2luY2x1ZGUgInR1aUlPLmgiCisjaW5jbHVkZSAidHVpTGF5b3V0LmgiCisjaW5jbHVkZSAidHVpV2luLmgiCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgZ2RiX2ZjbG9zZSBQQVJBTVMgKChHREJfRklMRSAqKikpOworCitleHRlcm4gdm9pZCBnZGJfZmx1c2ggUEFSQU1TICgoR0RCX0ZJTEUgKikpOworCitleHRlcm4gR0RCX0ZJTEUgKmdkYl9mb3BlbiBQQVJBTVMgKChjaGFyICogbmFtZSwgY2hhciAqIG1vZGUpKTsKKworZXh0ZXJuIHZvaWQgZnB1dHNfZmlsdGVyZWQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBHREJfRklMRSAqKSk7CisKK2V4dGVybiB2b2lkIGZwdXRzX3VuZmlsdGVyZWQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBHREJfRklMRSAqKSk7CisKK2V4dGVybiBpbnQgZnB1dGNfZmlsdGVyZWQgUEFSQU1TICgoaW50IGMsIEdEQl9GSUxFICopKTsKKworZXh0ZXJuIGludCBmcHV0Y191bmZpbHRlcmVkIFBBUkFNUyAoKGludCBjLCBHREJfRklMRSAqKSk7CisKK2V4dGVybiBpbnQgcHV0Y2hhcl91bmZpbHRlcmVkIFBBUkFNUyAoKGludCBjKSk7CisKK2V4dGVybiB2b2lkIHB1dHNfZmlsdGVyZWQgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CisKK2V4dGVybiB2b2lkIHB1dHNfdW5maWx0ZXJlZCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKKworZXh0ZXJuIHZvaWQgcHV0c19kZWJ1ZyBQQVJBTVMgKChjaGFyICpwcmVmaXgsIGNoYXIgKnN0cmluZywgY2hhciAqc3VmZml4KSk7CisKK2V4dGVybiB2b2lkIHZwcmludGZfZmlsdGVyZWQgUEFSQU1TICgoY29uc3QgY2hhciAqLCB2YV9saXN0KSkKKyAgICAgQVRUUl9GT1JNQVQocHJpbnRmLCAxLCAwKTsKKworZXh0ZXJuIHZvaWQgdmZwcmludGZfZmlsdGVyZWQgUEFSQU1TICgoR0RCX0ZJTEUgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KSkKKyAgICAgQVRUUl9GT1JNQVQocHJpbnRmLCAyLCAwKTsKKworZXh0ZXJuIHZvaWQgZnByaW50Zl9maWx0ZXJlZCBQQVJBTVMgKChHREJfRklMRSAqLCBjb25zdCBjaGFyICosIC4uLikpCisgICAgIEFUVFJfRk9STUFUKHByaW50ZiwgMiwgMyk7CisKK2V4dGVybiB2b2lkIGZwcmludGZpX2ZpbHRlcmVkIFBBUkFNUyAoKGludCwgR0RCX0ZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pKQorICAgICBBVFRSX0ZPUk1BVChwcmludGYsIDMsIDQpOworCitleHRlcm4gdm9pZCBwcmludGZfZmlsdGVyZWQgUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKQorICAgICBBVFRSX0ZPUk1BVChwcmludGYsIDEsIDIpOworCitleHRlcm4gdm9pZCBwcmludGZpX2ZpbHRlcmVkIFBBUkFNUyAoKGludCwgY29uc3QgY2hhciAqLCAuLi4pKQorICAgICBBVFRSX0ZPUk1BVChwcmludGYsIDIsIDMpOworCitleHRlcm4gdm9pZCB2cHJpbnRmX3VuZmlsdGVyZWQgUEFSQU1TICgoY29uc3QgY2hhciAqLCB2YV9saXN0KSkKKyAgICAgQVRUUl9GT1JNQVQocHJpbnRmLCAxLCAwKTsKKworZXh0ZXJuIHZvaWQgdmZwcmludGZfdW5maWx0ZXJlZCBQQVJBTVMgKChHREJfRklMRSAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKQorICAgICBBVFRSX0ZPUk1BVChwcmludGYsIDIsIDApOworCitleHRlcm4gdm9pZCBmcHJpbnRmX3VuZmlsdGVyZWQgUEFSQU1TICgoR0RCX0ZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pKQorICAgICBBVFRSX0ZPUk1BVChwcmludGYsIDIsIDMpOworCitleHRlcm4gdm9pZCBwcmludGZfdW5maWx0ZXJlZCBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpCisgICAgIEFUVFJfRk9STUFUKHByaW50ZiwgMSwgMik7CisKK2V4dGVybiBpbnQgZ2RiX2ZpbGVfaXNhdHR5IFBBUkFNUyAoKEdEQl9GSUxFICopKTsKKworZXh0ZXJuIEdEQl9GSUxFICpnZGJfZmlsZV9pbml0X2FzdHJpbmcgUEFSQU1TICgoaW50KSk7CisKK2V4dGVybiB2b2lkIGdkYl9maWxlX2RlYWxsb2NhdGUgUEFSQU1TICgoR0RCX0ZJTEUgKiopKTsKKworZXh0ZXJuIGNoYXIgKmdkYl9maWxlX2dldF9zdHJidWYgUEFSQU1TICgoR0RCX0ZJTEUgKikpOworCitleHRlcm4gdm9pZCBnZGJfZmlsZV9hZGp1c3Rfc3RyYnVmIFBBUkFNUyAoKGludCwgR0RCX0ZJTEUgKikpOworCitleHRlcm4gdm9pZCBwcmludF9zcGFjZXMgUEFSQU1TICgoaW50LCBHREJfRklMRSAqKSk7CisKK2V4dGVybiB2b2lkIHByaW50X3NwYWNlc19maWx0ZXJlZCBQQVJBTVMgKChpbnQsIEdEQl9GSUxFICopKTsKKworZXh0ZXJuIGNoYXIgKm5fc3BhY2VzIFBBUkFNUyAoKGludCkpOworCitleHRlcm4gdm9pZCBnZGJfcHJpbnRjaGFyIFBBUkFNUyAoKGludCwgR0RCX0ZJTEUgKiwgaW50KSk7CisKK2V4dGVybiB2b2lkIGdkYl9wcmludF9hZGRyZXNzIFBBUkFNUyAoKHZvaWQgKiwgR0RCX0ZJTEUgKikpOworCit0eXBlZGVmIGJmZF92bWEgdF9hZGRyOwordHlwZWRlZiBiZmRfdm1hIHRfcmVnOworZXh0ZXJuIGNoYXIqIHBhZGRyIFBBUkFNUyAoKHRfYWRkciBhZGRyKSk7CisKK2V4dGVybiBjaGFyKiBwcmVnIFBBUkFNUyAoKHRfcmVnIHJlZykpOworCitleHRlcm4gY2hhciogcGFkZHJfbnogUEFSQU1TICgodF9hZGRyIGFkZHIpKTsKKworZXh0ZXJuIGNoYXIqIHByZWdfbnogUEFSQU1TICgodF9yZWcgcmVnKSk7CisKK2V4dGVybiB2b2lkIGZwcmludGZfc3ltYm9sX2ZpbHRlcmVkIFBBUkFNUyAoKEdEQl9GSUxFICosIGNoYXIgKiwKKwkJCQkJICAgICBlbnVtIGxhbmd1YWdlLCBpbnQpKTsKKworZXh0ZXJuIE5PUkVUVVJOIHZvaWQgcGVycm9yX3dpdGhfbmFtZSBQQVJBTVMgKChjaGFyICopKSBBVFRSX05PUkVUVVJOOworCitleHRlcm4gdm9pZCBwcmludF9zeXNfZXJybXNnIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKKy8qIEZyb20gcmVnZXguYyBvciBsaWJjLiAgQlNEIDQuNCBkZWNsYXJlcyB0aGlzIHdpdGggdGhlIGFyZ3VtZW50IHR5cGUgYXMKKyAgICJjb25zdCBjaGFyICoiIGluIHVuaXN0ZC5oLCBzbyB3ZSBjYW4ndCBkZWNsYXJlIHRoZSBhcmd1bWVudAorICAgYXMgImNoYXIgKiIuICAqLworCitleHRlcm4gY2hhciAqcmVfY29tcCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKKworLyogRnJvbSBzeW1maWxlLmMgKi8KKworZXh0ZXJuIHZvaWQgc3ltYm9sX2ZpbGVfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCisvKiBGcm9tIHRvcC5jICovCisKK2V4dGVybiBjaGFyICpza2lwX3F1b3RlZCBQQVJBTVMgKChjaGFyICopKTsKKworZXh0ZXJuIGNoYXIgKmdkYl9yZWFkbGluZSBQQVJBTVMgKChjaGFyICopKTsKKworZXh0ZXJuIGNoYXIgKmNvbW1hbmRfbGluZV9pbnB1dCBQQVJBTVMgKChjaGFyICosIGludCwgY2hhciAqKSk7CisKK2V4dGVybiB2b2lkIHByaW50X3Byb21wdCBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBpbnQgaW5wdXRfZnJvbV90ZXJtaW5hbF9wIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIGludCBpbmZvX3ZlcmJvc2U7CisKKy8qIEZyb20gcHJpbnRjbWQuYyAqLworCitleHRlcm4gdm9pZCBzZXRfbmV4dF9hZGRyZXNzIFBBUkFNUyAoKENPUkVfQUREUikpOworCitleHRlcm4gdm9pZCBwcmludF9hZGRyZXNzX3N5bWJvbGljIFBBUkFNUyAoKENPUkVfQUREUiwgR0RCX0ZJTEUgKiwgaW50LAorCQkJCQkgICAgY2hhciAqKSk7CisKK2V4dGVybiB2b2lkIHByaW50X2FkZHJlc3NfbnVtZXJpYyBQQVJBTVMgKChDT1JFX0FERFIsIGludCwgR0RCX0ZJTEUgKikpOworCitleHRlcm4gdm9pZCBwcmludF9hZGRyZXNzIFBBUkFNUyAoKENPUkVfQUREUiwgR0RCX0ZJTEUgKikpOworCisvKiBGcm9tIHNvdXJjZS5jICovCisKK2V4dGVybiBpbnQgb3BlbnAgUEFSQU1TICgoY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50LCBpbnQsIGNoYXIgKiopKTsKKworZXh0ZXJuIGludCBzb3VyY2VfZnVsbF9wYXRoX29mIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKikpOworCitleHRlcm4gdm9pZCBtb2RfcGF0aCBQQVJBTVMgKChjaGFyICosIGNoYXIgKiopKTsKKworZXh0ZXJuIHZvaWQgZGlyZWN0b3J5X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworZXh0ZXJuIHZvaWQgaW5pdF9zb3VyY2VfcGF0aCBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBjaGFyICpzeW10YWJfdG9fZmlsZW5hbWUgUEFSQU1TICgoc3RydWN0IHN5bXRhYiAqKSk7CisKKy8qIEZyb20gZmluZHZhci5jICovCisKK2V4dGVybiBpbnQgcmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMgUEFSQU1TICgoaW50LCBjaGFyICopKTsKKworLyogRnJvbSByZWFkbGluZSAoYnV0IG5vdCBpbiBhbnkgcmVhZGxpbmUgLmggZmlsZXMpLiAgKi8KKworZXh0ZXJuIGNoYXIgKnRpbGRlX2V4cGFuZCBQQVJBTVMgKChjaGFyICopKTsKKworLyogQ29udHJvbCB0eXBlcyBmb3IgY29tbWFuZHMgKi8KKworZW51bSBtaXNjX2NvbW1hbmRfdHlwZQoreworICBva19jb21tYW5kLAorICBlbmRfY29tbWFuZCwKKyAgZWxzZV9jb21tYW5kLAorICBub3BfY29tbWFuZAorfTsKKworZW51bSBjb21tYW5kX2NvbnRyb2xfdHlwZQoreworICBzaW1wbGVfY29udHJvbCwKKyAgYnJlYWtfY29udHJvbCwKKyAgY29udGludWVfY29udHJvbCwKKyAgd2hpbGVfY29udHJvbCwKKyAgaWZfY29udHJvbCwKKyAgaW52YWxpZF9jb250cm9sCit9OworCisvKiBTdHJ1Y3R1cmUgZm9yIHNhdmVkIGNvbW1hbmRzIGxpbmVzCisgICAoZm9yIGJyZWFrcG9pbnRzLCBkZWZpbmVkIGNvbW1hbmRzLCBldGMpLiAgKi8KKworc3RydWN0IGNvbW1hbmRfbGluZQoreworICBzdHJ1Y3QgY29tbWFuZF9saW5lICpuZXh0OworICBjaGFyICpsaW5lOworICBlbnVtIGNvbW1hbmRfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKKyAgaW50IGJvZHlfY291bnQ7CisgIHN0cnVjdCBjb21tYW5kX2xpbmUgKipib2R5X2xpc3Q7Cit9OworCitleHRlcm4gc3RydWN0IGNvbW1hbmRfbGluZSAqcmVhZF9jb21tYW5kX2xpbmVzIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK2V4dGVybiB2b2lkIGZyZWVfY29tbWFuZF9saW5lcyBQQVJBTVMgKChzdHJ1Y3QgY29tbWFuZF9saW5lICoqKSk7CisKKy8qIFN0cmluZyBjb250YWluaW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAod2hhdCBnZXR3ZCB3b3VsZCByZXR1cm4pLiAgKi8KKworZXh0ZXJuIGNoYXIgKmN1cnJlbnRfZGlyZWN0b3J5OworCisvKiBEZWZhdWx0IHJhZGl4ZXMgZm9yIGlucHV0IGFuZCBvdXRwdXQuICBPbmx5IHNvbWUgdmFsdWVzIHN1cHBvcnRlZC4gICovCitleHRlcm4gdW5zaWduZWQgaW5wdXRfcmFkaXg7CitleHRlcm4gdW5zaWduZWQgb3V0cHV0X3JhZGl4OworCisvKiBQb3NzaWJpbGl0aWVzIGZvciBwcmV0dHlwcmludCBwYXJhbWV0ZXJzIHRvIHJvdXRpbmVzIHdoaWNoIHByaW50CisgICB0aGluZ3MuICBMaWtlIGVudW0gbGFuZ3VhZ2UsIHRoaXMgc2hvdWxkIGJlIGluIHZhbHVlLmgsIGJ1dCBuZWVkcworICAgdG8gYmUgaGVyZSBmb3IgdGhlIHNhbWUgcmVhc29uLiAgRklYTUU6ICBJZiB3ZSBjYW4gZWxpbWluYXRlIHRoaXMKKyAgIGFzIGFuIGFyZyB0byBMQV9WQUxfUFJJTlQsIHRoZW4gd2UgY2FuIHByb2JhYmx5IG1vdmUgaXQgYmFjayB0bworICAgdmFsdWUuaC4gKi8KKworZW51bSB2YWxfcHJldHR5cHJpbnQKK3sKKyAgVmFsX25vX3ByZXR0eXByaW50ID0gMCwKKyAgVmFsX3ByZXR0eXByaW50LAorICAvKiBVc2UgdGhlIGRlZmF1bHQgc2V0dGluZyB3aGljaCB0aGUgdXNlciBoYXMgc3BlY2lmaWVkLiAgKi8KKyAgVmFsX3ByZXR0eV9kZWZhdWx0Cit9OworCisMCisvKiBIb3N0IG1hY2hpbmUgZGVmaW5pdGlvbi4gIFRoaXMgd2lsbCBiZSBhIHN5bWxpbmsgdG8gb25lIG9mIHRoZQorICAgeG0tKi5oIGZpbGVzLCBidWlsdCBieSB0aGUgYGNvbmZpZ3VyZScgc2NyaXB0LiAgKi8KKworI2luY2x1ZGUgInhtLmgiCisKKy8qIE5hdGl2ZSBtYWNoaW5lIHN1cHBvcnQuICBUaGlzIHdpbGwgYmUgYSBzeW1saW5rIHRvIG9uZSBvZiB0aGUKKyAgIG5tLSouaCBmaWxlcywgYnVpbHQgYnkgdGhlIGBjb25maWd1cmUnIHNjcmlwdC4gICovCisKKyNpbmNsdWRlICJubS5oIgorCisvKiBUYXJnZXQgbWFjaGluZSBkZWZpbml0aW9uLiAgVGhpcyB3aWxsIGJlIGEgc3ltbGluayB0byBvbmUgb2YgdGhlCisgICB0bS0qLmggZmlsZXMsIGJ1aWx0IGJ5IHRoZSBgY29uZmlndXJlJyBzY3JpcHQuICAqLworCisjaW5jbHVkZSAidG0uaCIKKworLyogSWYgdGhlIHhtLmggZmlsZSBkaWQgbm90IGRlZmluZSB0aGUgbW9kZSBzdHJpbmcgdXNlZCB0byBvcGVuIHRoZQorICAgZmlsZXMsIGFzc3VtZSB0aGF0IGJpbmFyeSBmaWxlcyBhcmUgb3BlbmVkIHRoZSBzYW1lIHdheSBhcyB0ZXh0CisgICBmaWxlcyAqLworI2lmbmRlZiBGT1BFTl9SQgorI2luY2x1ZGUgImZvcGVuLXNhbWUuaCIKKyNlbmRpZgorCisvKiBNaWNyb3NvZnQgQyBjYW4ndCBkZWFsIHdpdGggY29uc3QgcG9pbnRlcnMgKi8KKworI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIENPTlNUX1BUUgorI2Vsc2UKKyNkZWZpbmUgQ09OU1RfUFRSIGNvbnN0CisjZW5kaWYKKworLyoKKyAqIEFsbG93IHRoaW5ncyBpbiBnZGIgdG8gYmUgZGVjbGFyZWQgInZvbGF0aWxlIi4gIElmIGNvbXBpbGluZyBBTlNJLCBpdAorICoganVzdCB3b3Jrcy4gIElmIGNvbXBpbGluZyB3aXRoIGdjYyBidXQgbm9uLWFuc2ksIHJlZGVmaW5lIHRvIF9fdm9sYXRpbGVfXy4KKyAqIElmIG5vbi1hbnNpLCBub24tZ2NjLCB0aGVuIGVsaW1pbmF0ZSAidm9sYXRpbGUiIGVudGlyZWx5LCBtYWtpbmcgdGhvc2UKKyAqIG9iamVjdHMgYmUgcmVhZC13cml0ZSByYXRoZXIgdGhhbiByZWFkLW9ubHkuCisgKi8KKworI2lmbmRlZiB2b2xhdGlsZQorI2lmbmRlZiBfX1NURENfXworIyBpZmRlZiBfX0dOVUNfXworIyAgZGVmaW5lIHZvbGF0aWxlIF9fdm9sYXRpbGVfXworIyBlbHNlCisjICBkZWZpbmUgdm9sYXRpbGUgLypub3RoaW5nKi8KKyMgZW5kaWYgLyogR05VQyAqLworI2VuZGlmIC8qIFNUREMgKi8KKyNlbmRpZiAvKiB2b2xhdGlsZSAqLworCisvKiBEZWZhdWx0cyBmb3Igc3lzdGVtLXdpZGUgY29uc3RhbnRzIChpZiBub3QgZGVmaW5lZCBieSB4bS5oLCB3ZSBmYWtlIGl0KS4KKyAgIEZJWE1FOiBBc3N1bWVzIDIncyBjb21wbGVtZW50IGFyaXRobWV0aWMgKi8KKworI2lmICFkZWZpbmVkIChVSU5UX01BWCkKKyNkZWZpbmUJVUlOVF9NQVggKCh1bnNpZ25lZCBpbnQpKH4wKSkJCS8qIDB4RkZGRkZGRkYgZm9yIDMyLWJpdHMgKi8KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKElOVF9NQVgpCisjZGVmaW5lCUlOVF9NQVggKChpbnQpKFVJTlRfTUFYID4+IDEpKQkJLyogMHg3RkZGRkZGRiBmb3IgMzItYml0cyAqLworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoSU5UX01JTikKKyNkZWZpbmUgSU5UX01JTiAoKGludCkoKGludCkgfjAgXiBJTlRfTUFYKSkJLyogMHg4MDAwMDAwMCBmb3IgMzItYml0cyAqLworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoVUxPTkdfTUFYKQorI2RlZmluZQlVTE9OR19NQVggKCh1bnNpZ25lZCBsb25nKSh+MEwpKQkvKiAweEZGRkZGRkZGIGZvciAzMi1iaXRzICovCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChMT05HX01BWCkKKyNkZWZpbmUJTE9OR19NQVggKChsb25nKShVTE9OR19NQVggPj4gMSkpCS8qIDB4N0ZGRkZGRkYgZm9yIDMyLWJpdHMgKi8KKyNlbmRpZgorCisjaWZuZGVmIExPTkdFU1QKKworI2lmZGVmIEJGRDY0CisKKy8qIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHRoYXQgTE9OR0VTVCBpcyBhdCBsZWFzdCBhcyBiaWcgYXMgQ09SRV9BRERSLiAgKi8KKworI2RlZmluZSBMT05HRVNUIEJGRF9IT1NUXzY0X0JJVAorI2RlZmluZSBVTE9OR0VTVCBCRkRfSE9TVF9VXzY0X0JJVAorCisjZWxzZSAvKiBObyBCRkQ2NCAqLworCisjICBpZmRlZiBDQ19IQVNfTE9OR19MT05HCisjICAgIGRlZmluZSBMT05HRVNUIGxvbmcgbG9uZworIyAgICBkZWZpbmUgVUxPTkdFU1QgdW5zaWduZWQgbG9uZyBsb25nCisjICBlbHNlCisvKiBCRkRfSE9TVF82NF9CSVQgaXMgZGVmaW5lZCBmb3Igc29tZSBob3N0cyB0aGF0IGRvbid0IGhhdmUgbG9uZyBsb25nCisgICAoZS5nLiBpMzg2LXdpbmRvd3MpIHNvIHRyeSBpdC4gICovCisjICAgIGlmZGVmIEJGRF9IT1NUXzY0X0JJVAorIyAgICAgIGRlZmluZSBMT05HRVNUIEJGRF9IT1NUXzY0X0JJVAorIyAgICAgIGRlZmluZSBVTE9OR0VTVCBCRkRfSE9TVF9VXzY0X0JJVAorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIExPTkdFU1QgbG9uZworIyAgICAgIGRlZmluZSBVTE9OR0VTVCB1bnNpZ25lZCBsb25nCisjICAgIGVuZGlmCisjICBlbmRpZgorCisjZW5kaWYgLyogTm8gQkZENjQgKi8KKworI2VuZGlmIC8qICEgTE9OR0VTVCAqLworCisvKiBDb252ZXJ0IGEgTE9OR0VTVCB0byBhbiBpbnQuICBUaGlzIGlzIHVzZWQgaW4gY29udGV4dHMgKGUuZy4gbnVtYmVyIG9mCisgICBhcmd1bWVudHMgdG8gYSBmdW5jdGlvbiwgbnVtYmVyIGluIGEgdmFsdWUgaGlzdG9yeSwgcmVnaXN0ZXIgbnVtYmVyLCBldGMuKQorICAgd2hlcmUgdGhlIHZhbHVlIG11c3Qgbm90IGJlIGxhcmdlciB0aGFuIGNhbiBmaXQgaW4gYW4gaW50LiAgKi8KKworZXh0ZXJuIGludCBsb25nZXN0X3RvX2ludCBQQVJBTVMgKChMT05HRVNUKSk7CisKKy8qIEFzc29ydGVkIGZ1bmN0aW9ucyB3ZSBjYW4gZGVjbGFyZSwgbm93IHRoYXQgY29uc3QgYW5kIHZvbGF0aWxlIGFyZSAKKyAgIGRlZmluZWQuICAqLworCitleHRlcm4gY2hhciAqc2F2ZXN0cmluZyBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOworCitleHRlcm4gY2hhciAqbXNhdmVzdHJpbmcgUEFSQU1TICgodm9pZCAqLCBjb25zdCBjaGFyICosIGludCkpOworCitleHRlcm4gY2hhciAqc3Ryc2F2ZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKKworZXh0ZXJuIGNoYXIgKm1zdHJzYXZlIFBBUkFNUyAoKHZvaWQgKiwgY29uc3QgY2hhciAqKSk7CisKKyNpZmRlZiBfTVNDX1ZFUiAvKiBGSVhNRTsgd2FzIGxvbmcsIGJ1dCB0aGlzIGNhdXNlcyBjb21waWxlIGVycm9ycyBpbiBtc3ZjIGlmIGFscmVhZHkgZGVmaW5lZCAqLworZXh0ZXJuIFBUUiB4bW1hbGxvYyBQQVJBTVMgKChQVFIsIHNpemVfdCkpOworCitleHRlcm4gUFRSIHhtcmVhbGxvYyBQQVJBTVMgKChQVFIsIFBUUiwgc2l6ZV90KSk7CisjZWxzZQorZXh0ZXJuIFBUUiB4bW1hbGxvYyBQQVJBTVMgKChQVFIsIGxvbmcpKTsKKworZXh0ZXJuIFBUUiB4bXJlYWxsb2MgUEFSQU1TICgoUFRSLCBQVFIsIGxvbmcpKTsKKyNlbmRpZgorCitleHRlcm4gaW50IHBhcnNlX2VzY2FwZSBQQVJBTVMgKChjaGFyICoqKSk7CisKKy8qIGNvbXBhdCAtIGhhbmRsZSBvbGQgdGFyZ2V0cyB0aGF0IGp1c3QgZGVmaW5lIFJFR0lTVEVSX05BTUVTICovCisjaWZuZGVmIFJFR0lTVEVSX05BTUUKK2V4dGVybiBjaGFyICpnZGJfcmVnaXN0ZXJfbmFtZXNbXTsKKyNkZWZpbmUgUkVHSVNURVJfTkFNRShpKSBnZGJfcmVnaXN0ZXJfbmFtZXNbaV0KKyNlbmRpZgorCisvKiBNZXNzYWdlIHRvIGJlIHByaW50ZWQgYmVmb3JlIHRoZSBlcnJvciBtZXNzYWdlLCB3aGVuIGFuIGVycm9yIG9jY3Vycy4gICovCisKK2V4dGVybiBjaGFyICplcnJvcl9wcmVfcHJpbnQ7CisKKy8qIE1lc3NhZ2UgdG8gYmUgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yIG1lc3NhZ2UsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLiAgKi8KKworZXh0ZXJuIGNoYXIgKnF1aXRfcHJlX3ByaW50OworCisvKiBNZXNzYWdlIHRvIGJlIHByaW50ZWQgYmVmb3JlIHRoZSB3YXJuaW5nIG1lc3NhZ2UsIHdoZW4gYSB3YXJuaW5nIG9jY3Vycy4gICovCisKK2V4dGVybiBjaGFyICp3YXJuaW5nX3ByZV9wcmludDsKKworZXh0ZXJuIE5PUkVUVVJOIHZvaWQgZXJyb3IgUEFSQU1TKChjb25zdCBjaGFyICosIC4uLikpIEFUVFJfTk9SRVRVUk47CisKK2V4dGVybiB2b2lkIGVycm9yX2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIE5PUkVUVVJOIHZvaWQgZmF0YWwgUEFSQU1TKChjaGFyICosIC4uLikpIEFUVFJfTk9SRVRVUk47CisKK2V4dGVybiBOT1JFVFVSTiB2b2lkIG5vbWVtIFBBUkFNUyAoKGxvbmcpKSBBVFRSX05PUkVUVVJOOworCisvKiBSZWFzb25zIGZvciBjYWxsaW5nIHJldHVybl90b190b3BfbGV2ZWwuICAqLworZW51bSByZXR1cm5fcmVhc29uIHsKKyAgLyogVXNlciBpbnRlcnJ1cHQuICAqLworICBSRVRVUk5fUVVJVCwKKworICAvKiBBbnkgb3RoZXIgZXJyb3IuICAqLworICBSRVRVUk5fRVJST1IKK307CisKKyNkZWZpbmUgUkVUVVJOX01BU0tfUVVJVCAoMSA8PCAoaW50KVJFVFVSTl9RVUlUKQorI2RlZmluZSBSRVRVUk5fTUFTS19FUlJPUiAoMSA8PCAoaW50KVJFVFVSTl9FUlJPUikKKyNkZWZpbmUgUkVUVVJOX01BU0tfQUxMIChSRVRVUk5fTUFTS19RVUlUIHwgUkVUVVJOX01BU0tfRVJST1IpCit0eXBlZGVmIGludCByZXR1cm5fbWFzazsKKworZXh0ZXJuIE5PUkVUVVJOIHZvaWQKK3JldHVybl90b190b3BfbGV2ZWwgUEFSQU1TICgoZW51bSByZXR1cm5fcmVhc29uKSkgQVRUUl9OT1JFVFVSTjsKKwordHlwZWRlZiBpbnQgKGNhdGNoX2Vycm9yc19mdHlwZSkgUEFSQU1TICgoUFRSKSk7CitleHRlcm4gaW50IGNhdGNoX2Vycm9ycyBQQVJBTVMgKChjYXRjaF9lcnJvcnNfZnR5cGUgKiwgUFRSLCBjaGFyICosIHJldHVybl9tYXNrKSk7CisKK2V4dGVybiB2b2lkIHdhcm5pbmdfYmVnaW4gUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCB3YXJuaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSkKKyAgICAgQVRUUl9GT1JNQVQocHJpbnRmLCAxLCAyKTsKKworLyogR2xvYmFsIGZ1bmN0aW9ucyBmcm9tIG90aGVyLCBub24tZ2RiIEdOVSB0aGluZ2llcy4KKyAgIExpYmliZXJ0eSB0aGluZ2llcyBhcmUgbm8gbG9uZ2VyIGRlY2xhcmVkIGhlcmUuICBXZSBpbmNsdWRlIGxpYmliZXJ0eS5oCisgICBhYm92ZSwgaW5zdGVhZC4gICovCisKKyNpZm5kZWYgR0VURU5WX1BST1ZJREVECitleHRlcm4gY2hhciAqZ2V0ZW52IFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworI2VuZGlmCisKKy8qIEZyb20gb3RoZXIgc3lzdGVtIGxpYnJhcmllcyAqLworCisjaWZkZWYgSEFWRV9TVERERUZfSAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX19jcGx1c3BsdXMpCisvKiBtc3ZjIGRlZmluZXMgdGhlc2UgaW4gc3RkbGliLmggZm9yIGMgY29kZSAqLworI3VuZGVmIG1pbgorI3VuZGVmIG1heAorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpZm5kZWYgbWluCisjZGVmaW5lIG1pbihhLCBiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisjaWZuZGVmIG1heAorI2RlZmluZSBtYXgoYSwgYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKKyNlbmRpZgorCisKKy8qIFdlIHRha2UgdGhlIGFkZHJlc3Mgb2YgZmNsb3NlIGxhdGVyLCBidXQgc29tZSBzdGRpbydzIGZvcmdldAorICAgdG8gZGVjbGFyZSB0aGlzLiAgV2UgY2FuJ3QgYWx3YXlzIGRlY2xhcmUgaXQgc2luY2UgdGhlcmUncworICAgbm8gd2F5IHRvIGRlY2xhcmUgdGhlIHBhcmFtZXRlcnMgd2l0aG91dCB1cHNldHRpbmcgc29tZSBjb21waWxlcgorICAgc29tZXdoZXJlLiAqLworCisjaWZuZGVmIEZDTE9TRV9QUk9WSURFRAorZXh0ZXJuIGludCBmY2xvc2UgUEFSQU1TICgoRklMRSAqKSk7CisjZW5kaWYKKworI2lmbmRlZiBhdG9mCitleHRlcm4gZG91YmxlIGF0b2YgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CS8qIFgzLjE1OS0xOTg5ICA0LjEwLjEuMSAqLworI2VuZGlmCisKKyNpZm5kZWYgTUFMTE9DX0lOQ09NUEFUSUJMRQorCisjaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MKK2V4dGVybiBQVFIgbWFsbG9jICgpOworI2VuZGlmCisKKyNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MKK2V4dGVybiBQVFIgcmVhbGxvYyAoKTsKKyNlbmRpZgorCisjaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCitleHRlcm4gdm9pZCBmcmVlICgpOworI2VuZGlmCisKKyNlbmRpZiAvKiBNQUxMT0NfSU5DT01QQVRJQkxFICovCisKKy8qIFZhcmlvdXMgcG9zc2liaWxpdGllcyBmb3IgYWxsb2NhLiAgKi8KKyNpZm5kZWYgYWxsb2NhCisjIGlmZGVmIF9fR05VQ19fCisjICBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyMgZWxzZSAvKiBOb3QgR05VIEMgKi8KKyMgIGlmZGVmIEhBVkVfQUxMT0NBX0gKKyMgICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgIGVsc2UKKyMgICBpZmRlZiBfQUlYCisgI3ByYWdtYSBhbGxvY2EKKyMgICBlbHNlCisKKy8qIFdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBub3QgdG8gZGVjbGFyZSB0aGlzIGluIGEgd2F5IHdoaWNoIGNvbmZsaWN0cyB3aXRoCisgICBiaXNvbi4gIEJpc29uIG5ldmVyIGRlY2xhcmVzIGl0IGFzIGNoYXIgKiwgYnV0IHVuZGVyIHZhcmlvdXMgY2lyY3Vtc3RhbmNlcworICAgKGxpa2UgX19ocHV4KSB3ZSBuZWVkIHRvIHVzZSB2b2lkICouICAqLworIyAgICBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19ocHV4KQorICAgZXh0ZXJuIHZvaWQgKmFsbG9jYSAoKTsKKyMgICAgZWxzZSAvKiBEb24ndCB1c2Ugdm9pZCAqLiAgKi8KKyAgIGV4dGVybiBjaGFyICphbGxvY2EgKCk7CisjICAgIGVuZGlmIC8qIERvbid0IHVzZSB2b2lkICouICAqLworIyAgIGVuZGlmIC8qIE5vdCBfQUlYICovCisjICBlbmRpZiAvKiBOb3QgSEFWRV9BTExPQ0FfSCAqLworIyBlbmRpZiAvKiBOb3QgR05VIEMgKi8KKyNlbmRpZiAvKiBhbGxvY2Egbm90IGRlZmluZWQgKi8KKworLyogSE9TVF9CWVRFX09SREVSIG11c3QgYmUgZGVmaW5lZCB0byBvbmUgb2YgdGhlc2UuICAqLworCisjaWZkZWYgSEFWRV9FTkRJQU5fSAorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoQklHX0VORElBTikKKyNkZWZpbmUgQklHX0VORElBTiA0MzIxCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChMSVRUTEVfRU5ESUFOKQorI2RlZmluZSBMSVRUTEVfRU5ESUFOIDEyMzQKKyNlbmRpZgorCisvKiBEeW5hbWljIHRhcmdldC1zeXN0ZW0tZGVwZW5kZW50IHBhcmFtZXRlcnMgZm9yIEdEQi4gKi8KKyNpbmNsdWRlICJnZGJhcmNoLmgiCisKKy8qIFN0YXRpYyB0YXJnZXQtc3lzdGVtLWRlcGVuZGVudCBwYXJhbWV0ZXJzIGZvciBHREIuICovCisKKy8qIE51bWJlciBvZiBiaXRzIGluIGEgY2hhciBvciB1bnNpZ25lZCBjaGFyIGZvciB0aGUgdGFyZ2V0IG1hY2hpbmUuCisgICBKdXN0IGxpa2UgQ0hBUl9CSVQgaW4gPGxpbWl0cy5oPiBidXQgZGVzY3JpYmVzIHRoZSB0YXJnZXQgbWFjaGluZS4gICovCisjaWYgIWRlZmluZWQgKFRBUkdFVF9DSEFSX0JJVCkKKyNkZWZpbmUgVEFSR0VUX0NIQVJfQklUIDgKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgYml0cyBpbiBhIHNob3J0IG9yIHVuc2lnbmVkIHNob3J0IGZvciB0aGUgdGFyZ2V0IG1hY2hpbmUuICovCisjaWYgIWRlZmluZWQgKFRBUkdFVF9TSE9SVF9CSVQpCisjZGVmaW5lIFRBUkdFVF9TSE9SVF9CSVQgKDIgKiBUQVJHRVRfQ0hBUl9CSVQpCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYW4gaW50IG9yIHVuc2lnbmVkIGludCBmb3IgdGhlIHRhcmdldCBtYWNoaW5lLiAqLworI2lmICFkZWZpbmVkIChUQVJHRVRfSU5UX0JJVCkKKyNkZWZpbmUgVEFSR0VUX0lOVF9CSVQgKDQgKiBUQVJHRVRfQ0hBUl9CSVQpCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSBsb25nIG9yIHVuc2lnbmVkIGxvbmcgZm9yIHRoZSB0YXJnZXQgbWFjaGluZS4gKi8KKyNpZiAhZGVmaW5lZCAoVEFSR0VUX0xPTkdfQklUKQorI2RlZmluZSBUQVJHRVRfTE9OR19CSVQgKDQgKiBUQVJHRVRfQ0hBUl9CSVQpCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSBsb25nIGxvbmcgb3IgdW5zaWduZWQgbG9uZyBsb25nIGZvciB0aGUgdGFyZ2V0IG1hY2hpbmUuICovCisjaWYgIWRlZmluZWQgKFRBUkdFVF9MT05HX0xPTkdfQklUKQorI2RlZmluZSBUQVJHRVRfTE9OR19MT05HX0JJVCAoMiAqIFRBUkdFVF9MT05HX0JJVCkKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgYml0cyBpbiBhIGZsb2F0IGZvciB0aGUgdGFyZ2V0IG1hY2hpbmUuICovCisjaWYgIWRlZmluZWQgKFRBUkdFVF9GTE9BVF9CSVQpCisjZGVmaW5lIFRBUkdFVF9GTE9BVF9CSVQgKDQgKiBUQVJHRVRfQ0hBUl9CSVQpCisjZW5kaWYKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSBkb3VibGUgZm9yIHRoZSB0YXJnZXQgbWFjaGluZS4gKi8KKyNpZiAhZGVmaW5lZCAoVEFSR0VUX0RPVUJMRV9CSVQpCisjZGVmaW5lIFRBUkdFVF9ET1VCTEVfQklUICg4ICogVEFSR0VUX0NIQVJfQklUKQorI2VuZGlmCisKKy8qIE51bWJlciBvZiBiaXRzIGluIGEgbG9uZyBkb3VibGUgZm9yIHRoZSB0YXJnZXQgbWFjaGluZS4gICovCisjaWYgIWRlZmluZWQgKFRBUkdFVF9MT05HX0RPVUJMRV9CSVQpCisjZGVmaW5lIFRBUkdFVF9MT05HX0RPVUJMRV9CSVQgKDIgKiBUQVJHRVRfRE9VQkxFX0JJVCkKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgYml0cyBpbiBhIHBvaW50ZXIgZm9yIHRoZSB0YXJnZXQgbWFjaGluZSAqLworI2lmICFkZWZpbmVkIChUQVJHRVRfUFRSX0JJVCkKKyNkZWZpbmUgVEFSR0VUX1BUUl9CSVQgVEFSR0VUX0lOVF9CSVQKKyNlbmRpZgorCisvKiBJZiB3ZSBwaWNrZWQgdXAgYSBjb3B5IG9mIENIQVJfQklUIGZyb20gYSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICh3aGljaCBtYXkgZ2V0IGl0IGJ5IGluY2x1ZGluZyA8bGltaXRzLmg+KSB0aGVuIHVzZSBpdCB0byBzZXQKKyAgIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhIGhvc3QgY2hhci4gIElmIG5vdCwgdXNlIHRoZSBzYW1lIHNpemUKKyAgIGFzIHRoZSB0YXJnZXQuICovCisKKyNpZiBkZWZpbmVkIChDSEFSX0JJVCkKKyNkZWZpbmUgSE9TVF9DSEFSX0JJVCBDSEFSX0JJVAorI2Vsc2UKKyNkZWZpbmUgSE9TVF9DSEFSX0JJVCBUQVJHRVRfQ0hBUl9CSVQKKyNlbmRpZgorCisvKiBUaGUgYml0IGJ5dGUtb3JkZXIgaGFzIHRvIGRvIGp1c3Qgd2l0aCBudW1iZXJpbmcgb2YgYml0cyBpbgorICAgZGVidWdnaW5nIHN5bWJvbHMgYW5kIHN1Y2guICBDb25jZXB0dWFsbHksIGl0J3MgcXVpdGUgc2VwYXJhdGUKKyAgIGZyb20gYnl0ZS93b3JkIGJ5dGUgb3JkZXIuICAqLworCisjaWYgIWRlZmluZWQgKEJJVFNfQklHX0VORElBTikKKyNkZWZpbmUgQklUU19CSUdfRU5ESUFOIChUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQorI2VuZGlmCisKKy8qIEluIGZpbmR2YXIuYy4gICovCisKK2V4dGVybiBMT05HRVNUIGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgUEFSQU1TICgodm9pZCAqLCBpbnQpKTsKKworZXh0ZXJuIFVMT05HRVNUIGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciBQQVJBTVMgKCh2b2lkICosIGludCkpOworCitleHRlcm4gaW50IGV4dHJhY3RfbG9uZ191bnNpZ25lZF9pbnRlZ2VyIFBBUkFNUyAoKHZvaWQgKiwgaW50LCBMT05HRVNUICopKTsKKworZXh0ZXJuIENPUkVfQUREUiBleHRyYWN0X2FkZHJlc3MgUEFSQU1TICgodm9pZCAqLCBpbnQpKTsKKworZXh0ZXJuIHZvaWQgc3RvcmVfc2lnbmVkX2ludGVnZXIgUEFSQU1TICgoUFRSLCBpbnQsIExPTkdFU1QpKTsKKworZXh0ZXJuIHZvaWQgc3RvcmVfdW5zaWduZWRfaW50ZWdlciBQQVJBTVMgKChQVFIsIGludCwgVUxPTkdFU1QpKTsKKworZXh0ZXJuIHZvaWQgc3RvcmVfYWRkcmVzcyBQQVJBTVMgKChQVFIsIGludCwgTE9OR0VTVCkpOworCisvKiBTZXR1cCBkZWZpbml0aW9ucyBmb3IgaG9zdCBhbmQgdGFyZ2V0IGZsb2F0aW5nIHBvaW50IGZvcm1hdHMuICBXZSBuZWVkIHRvCisgICBjb25zaWRlciB0aGUgZm9ybWF0IGZvciBgZmxvYXQnLCBgZG91YmxlJywgYW5kIGBsb25nIGRvdWJsZScgZm9yIGJvdGggdGFyZ2V0CisgICBhbmQgaG9zdC4gIFdlIG5lZWQgdG8gZG8gdGhpcyBzbyB0aGF0IHdlIGtub3cgd2hhdCBraW5kIG9mIGNvbnZlcnNpb25zIG5lZWQKKyAgIHRvIGJlIGRvbmUgd2hlbiBjb252ZXJ0aW5nIHRhcmdldCBudW1iZXJzIHRvIGFuZCBmcm9tIHRoZSBob3N0cyBET1VCTEVTVAorICAgZGF0YSB0eXBlLiAgKi8KKworLyogVGhpcyBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgd2UgZG9uJ3Qga25vdyB0aGUgZm9ybWF0IG9mIHRoZSBmbG9hdGluZyBwb2ludAorICAgbnVtYmVyLiAgVHlwaWNhbGx5LCB0aGlzIGlzIHVzZWZ1bCBmb3IgbmF0aXZlIHBvcnRzLCB3aGVyZSB0aGUgYWN0dWFsIGZvcm1hdAorICAgaXMgaXJyZWxldmFudCwgc2luY2Ugbm8gY29udmVyc2lvbnMgd2lsbCBiZSB0YWtpbmcgcGxhY2UuICAqLworCitleHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X3Vua25vd247CisKKyNpZiBIT1NUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTgorIyAgaWZuZGVmIEhPU1RfRkxPQVRfRk9STUFUCisjICAgIGRlZmluZSBIT1NUX0ZMT0FUX0ZPUk1BVCAmZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfYmlnCisjICBlbmRpZgorIyAgaWZuZGVmIEhPU1RfRE9VQkxFX0ZPUk1BVAorIyAgICBkZWZpbmUgSE9TVF9ET1VCTEVfRk9STUFUICZmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9iaWcKKyMgIGVuZGlmCisjZWxzZQkJCQkvKiBMSVRUTEVfRU5ESUFOICovCisjICBpZm5kZWYgSE9TVF9GTE9BVF9GT1JNQVQKKyMgICAgZGVmaW5lIEhPU1RfRkxPQVRfRk9STUFUICZmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9saXR0bGUKKyMgIGVuZGlmCisjICBpZm5kZWYgSE9TVF9ET1VCTEVfRk9STUFUCisjICAgIGRlZmluZSBIT1NUX0RPVUJMRV9GT1JNQVQgJmZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEhPU1RfTE9OR19ET1VCTEVfRk9STUFUCisjZGVmaW5lIEhPU1RfTE9OR19ET1VCTEVfRk9STUFUICZmbG9hdGZvcm1hdF91bmtub3duCisjZW5kaWYKKworI2lmbmRlZiBUQVJHRVRfRkxPQVRfRk9STUFUCisjZGVmaW5lIFRBUkdFVF9GTE9BVF9GT1JNQVQgKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4gXAorCQkJICAgICA/ICZmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9iaWcgXAorCQkJICAgICA6ICZmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9saXR0bGUpCisjZW5kaWYKKyNpZm5kZWYgVEFSR0VUX0RPVUJMRV9GT1JNQVQKKyNkZWZpbmUgVEFSR0VUX0RPVUJMRV9GT1JNQVQgKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4gXAorCQkJICAgICAgPyAmZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfYmlnIFwKKwkJCSAgICAgIDogJmZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZSkKKyNlbmRpZgorCisjaWZuZGVmIFRBUkdFVF9MT05HX0RPVUJMRV9GT1JNQVQKKyMgIGRlZmluZSBUQVJHRVRfTE9OR19ET1VCTEVfRk9STUFUICZmbG9hdGZvcm1hdF91bmtub3duCisjZW5kaWYKKworLyogVXNlIGBsb25nIGRvdWJsZScgaWYgdGhlIGhvc3QgY29tcGlsZXIgc3VwcG9ydHMgaXQuICAoTm90ZSB0aGF0IHRoaXMgaXMgbm90CisgICBuZWNlc3NhcmlseSBhbnkgbG9uZ2VyIHRoYW4gYGRvdWJsZScuICBPbiBTdW5PUy9nY2MsIGl0J3MgdGhlIHNhbWUgYXMKKyAgIGRvdWJsZS4pICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIEdEQiBpbnRlcm5hbGx5IGNvbnZlcnRzIGFsbCBmbG9hdGluZworICAgcG9pbnQgdmFsdWVzIHRvIHRoZSB3aWRlc3QgdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIGhvc3QuCisKKyAgIFRoZXJlIGFyZSBwcm9ibGVtcyBob3dldmVyLCB3aGVuIHRoZSB0YXJnZXQgYGxvbmcgZG91YmxlJyBpcyBsb25nZXIgdGhhbiB0aGUKKyAgIGhvc3QncyBgbG9uZyBkb3VibGUnLiAgSW4gZ2VuZXJhbCwgd2UnbGwgcHJvYmFibHkgcmVkdWNlIHRoZSBwcmVjaXNpb24gb2YKKyAgIGFueSBzdWNoIHZhbHVlcyBhbmQgcHJpbnQgYSB3YXJuaW5nLiAgKi8KKworI2lmZGVmIEhBVkVfTE9OR19ET1VCTEUKK3R5cGVkZWYgbG9uZyBkb3VibGUgRE9VQkxFU1Q7CisjZWxzZQordHlwZWRlZiBkb3VibGUgRE9VQkxFU1Q7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgZmxvYXRmb3JtYXRfdG9fZG91Ymxlc3QgUEFSQU1TICgoY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICosCisJCQkJCSAgICAgY2hhciAqLCBET1VCTEVTVCAqKSk7CitleHRlcm4gdm9pZCBmbG9hdGZvcm1hdF9mcm9tX2RvdWJsZXN0IFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCAqLAorCQkJCQkgICAgICAgRE9VQkxFU1QgKiwgY2hhciAqKSk7CitleHRlcm4gRE9VQkxFU1QgZXh0cmFjdF9mbG9hdGluZyBQQVJBTVMgKCh2b2lkICosIGludCkpOworCitleHRlcm4gdm9pZCBzdG9yZV9mbG9hdGluZyBQQVJBTVMgKCh2b2lkICosIGludCwgRE9VQkxFU1QpKTsKKwwKKy8qIE9uIHNvbWUgbWFjaGluZXMgdGhlcmUgYXJlIGJpdHMgaW4gYWRkcmVzc2VzIHdoaWNoIGFyZSBub3QgcmVhbGx5CisgICBwYXJ0IG9mIHRoZSBhZGRyZXNzLCBidXQgYXJlIHVzZWQgYnkgdGhlIGtlcm5lbCwgdGhlIGhhcmR3YXJlLCBldGMuCisgICBmb3Igc3BlY2lhbCBwdXJwb3Nlcy4gIEFERFJfQklUU19SRU1PVkUgdGFrZXMgb3V0IGFueSBzdWNoIGJpdHMKKyAgIHNvIHdlIGdldCBhICJyZWFsIiBhZGRyZXNzIHN1Y2ggYXMgb25lIHdvdWxkIGZpbmQgaW4gYSBzeW1ib2wKKyAgIHRhYmxlLiAgVGhpcyBpcyB1c2VkIG9ubHkgZm9yIGFkZHJlc3NlcyBvZiBpbnN0cnVjdGlvbnMsIGFuZCBldmVuIHRoZW4KKyAgIEknbSBub3Qgc3VyZSBpdCdzIHVzZWQgaW4gYWxsIGNvbnRleHRzLiAgSXQgZXhpc3RzIHRvIGRlYWwgd2l0aCB0aGVyZQorICAgYmVpbmcgYSBmZXcgc3RyYXkgYml0cyBpbiB0aGUgUEMgd2hpY2ggd291bGQgbWlzbGVhZCB1cywgbm90IGFzIHNvbWUgc29ydAorICAgb2YgZ2VuZXJpYyB0aGluZyB0byBoYW5kbGUgYWxpZ25tZW50IG9yIHNlZ21lbnRhdGlvbiAoaXQncyBwb3NzaWJsZSBpdAorICAgc2hvdWxkIGJlIGluIFRBUkdFVF9SRUFEX1BDIGluc3RlYWQpLiAgKi8KKyNpZiAhZGVmaW5lZCAoQUREUl9CSVRTX1JFTU9WRSkKKyNkZWZpbmUgQUREUl9CSVRTX1JFTU9WRShhZGRyKSAoYWRkcikKKyNlbmRpZiAvKiBObyBBRERSX0JJVFNfUkVNT1ZFLiAgKi8KKworLyogRnJvbSB2YWxvcHMuYyAqLworCitleHRlcm4gQ09SRV9BRERSIHB1c2hfYnl0ZXMgUEFSQU1TICgoQ09SRV9BRERSLCBjaGFyICosIGludCkpOworCitleHRlcm4gQ09SRV9BRERSIHB1c2hfd29yZCBQQVJBTVMgKChDT1JFX0FERFIsIFVMT05HRVNUKSk7CisKKy8qIFNvbWUgcGFydHMgb2YgZ2RiIG1pZ2h0IGJlIGNvbnNpZGVyZWQgb3B0aW9uYWwsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkKKyAgIGFyZSBub3QgZXNzZW50aWFsIGZvciBiZWluZyBhYmxlIHRvIGJ1aWxkIGEgd29ya2luZywgdXNhYmxlIGRlYnVnZ2VyCisgICBmb3IgYSBzcGVjaWZpYyBlbnZpcm9ubWVudC4gIEZvciBleGFtcGxlLCB0aGUgbWFpbnRlbmFuY2UgY29tbWFuZHMKKyAgIGFyZSB0aGVyZSBmb3IgdGhlIGJlbmVmaXQgb2YgZ2RiIG1haW50YWluZXJzLiAgQXMgYW5vdGhlciBleGFtcGxlLAorICAgc29tZSBlbnZpcm9ubWVudHMgcmVhbGx5IGRvbid0IG5lZWQgZ2RiJ3MgdGhhdCBhcmUgYWJsZSB0byByZWFkIE4KKyAgIGRpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzLiAgSW4gb3JkZXIgdG8gbWFrZSBpdCBwb3NzaWJsZSAoYnV0CisgICBub3QgbmVjZXNzYXJpbHkgcmVjb21tZW5kZWQpIHRvIGJ1aWxkICJzdHJpcHBlZCBkb3duIiB2ZXJzaW9ucyBvZgorICAgZ2RiLCB0aGUgZm9sbG93aW5nIGRlZmluZXMgY29udHJvbCBzZWxlY3RpdmUgY29tcGlsYXRpb24gb2YgdGhvc2UKKyAgIHBhcnRzIG9mIGdkYiB3aGljaCBjYW4gYmUgc2FmZWx5IGxlZnQgb3V0IHdoZW4gbmVjZXNzYXJ5LiAgTm90ZSB0aGF0CisgICB0aGUgZGVmYXVsdCBpcyB0byBpbmNsdWRlIGV2ZXJ5dGhpbmcuICovCisKKyNpZm5kZWYgTUFJTlRFTkFOQ0VfQ01EUworI2RlZmluZSBNQUlOVEVOQU5DRV9DTURTIDEKKyNlbmRpZgorCisjaWZkZWYgTUFJTlRFTkFOQ0VfQ01EUworZXh0ZXJuIGludCB3YXRjaGRvZzsKKyNlbmRpZgorCisvKiBIb29rcyBmb3IgYWx0ZXJuYXRlIGNvbW1hbmQgaW50ZXJmYWNlcy4gICovCisKKyNpZmRlZiBfX1NURENfXworc3RydWN0IHRhcmdldF93YWl0c3RhdHVzOworc3RydWN0IGNtZF9saXN0X2VsZW1lbnQ7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgKCppbml0X3VpX2hvb2spIFBBUkFNUyAoKGNoYXIgKmFyZ3YwKSk7CitleHRlcm4gdm9pZCAoKmNvbW1hbmRfbG9vcF9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCAoKmZwdXRzX3VuZmlsdGVyZWRfaG9vaykgUEFSQU1TICgoY29uc3QgY2hhciAqbGluZWJ1ZmZlciwKKwkJCQkJICAgICAgR0RCX0ZJTEUgKnN0cmVhbSkpOworZXh0ZXJuIHZvaWQgKCpwcmludF9mcmFtZV9pbmZvX2xpc3RpbmdfaG9vaykgUEFSQU1TICgoc3RydWN0IHN5bXRhYiAqcywKKwkJCQkJCSAgICAgIGludCBsaW5lLCBpbnQgc3RvcGxpbmUsCisJCQkJCQkgICAgICBpbnQgbm9lcnJvcikpOworZXh0ZXJuIHN0cnVjdCBmcmFtZV9pbmZvICpwYXJzZV9mcmFtZV9zcGVjaWZpY2F0aW9uIFBBUkFNUyAoKGNoYXIgKmZyYW1lX2V4cCkpOworZXh0ZXJuIGludCAgKCpxdWVyeV9ob29rKSBQQVJBTVMgKChjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKK2V4dGVybiB2b2lkICgqd2FybmluZ19ob29rKSBQQVJBTVMgKChjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKK2V4dGVybiB2b2lkICgqZmx1c2hfaG9vaykgUEFSQU1TICgoR0RCX0ZJTEUgKnN0cmVhbSkpOworZXh0ZXJuIHZvaWQgKCpjcmVhdGVfYnJlYWtwb2ludF9ob29rKSBQQVJBTVMgKChzdHJ1Y3QgYnJlYWtwb2ludCAqYikpOworZXh0ZXJuIHZvaWQgKCpkZWxldGVfYnJlYWtwb2ludF9ob29rKSBQQVJBTVMgKChzdHJ1Y3QgYnJlYWtwb2ludCAqYnB0KSk7CitleHRlcm4gdm9pZCAoKm1vZGlmeV9icmVha3BvaW50X2hvb2spIFBBUkFNUyAoKHN0cnVjdCBicmVha3BvaW50ICpicHQpKTsKK2V4dGVybiB2b2lkICgqdGFyZ2V0X291dHB1dF9ob29rKSBQQVJBTVMgKChjaGFyICopKTsKK2V4dGVybiB2b2lkICgqaW50ZXJhY3RpdmVfaG9vaykgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgKCpyZWdpc3RlcnNfY2hhbmdlZF9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCAoKnJlYWRsaW5lX2JlZ2luX2hvb2spIFBBUkFNUyAoKGNoYXIgKiwgLi4uKSk7CitleHRlcm4gY2hhciAqICgqcmVhZGxpbmVfaG9vaykgUEFSQU1TICgoY2hhciAqKSk7CitleHRlcm4gdm9pZCAoKnJlYWRsaW5lX2VuZF9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCAoKnJlZ2lzdGVyX2NoYW5nZWRfaG9vaykgUEFSQU1TICgoaW50IHJlZ25vKSk7CitleHRlcm4gdm9pZCAoKm1lbW9yeV9jaGFuZ2VkX2hvb2spIFBBUkFNUyAoKENPUkVfQUREUiBhZGRyLCBpbnQgbGVuKSk7CitleHRlcm4gdm9pZCAoKmNvbnRleHRfaG9vaykgUEFSQU1TICgoaW50KSk7CitleHRlcm4gaW50ICgqdGFyZ2V0X3dhaXRfaG9vaykgUEFSQU1TICgoaW50IHBpZCwKKwkJCQkJc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpzdGF0dXMpKTsKKworZXh0ZXJuIHZvaWQgKCpjYWxsX2NvbW1hbmRfaG9vaykgUEFSQU1TICgoc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmMsCisJCQkJCSAgY2hhciAqY21kLCBpbnQgZnJvbV90dHkpKTsKKworZXh0ZXJuIE5PUkVUVVJOIHZvaWQgKCplcnJvcl9ob29rKSBQQVJBTVMgKCh2b2lkKSkgQVRUUl9OT1JFVFVSTjsKKworZXh0ZXJuIHZvaWQgKCplcnJvcl9iZWdpbl9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CisKKworLyogSW5oaWJpdCB3aW5kb3cgaW50ZXJmYWNlIGlmIG5vbi16ZXJvLiAqLworCitleHRlcm4gaW50IHVzZV93aW5kb3dzOworCisvKiBTeW1ib2xpYyBkZWZpbml0aW9ucyBvZiBmaWxlbmFtZS1yZWxhdGVkIHRoaW5ncy4gICovCisvKiBGSVhNRSwgdGhpcyBkb2Vzbid0IHdvcmsgdmVyeSB3ZWxsIGlmIGhvc3QgYW5kIGV4ZWN1dGFibGUKKyAgIGZpbGVzeXN0ZW1zIGNvbnZlbnRpb25zIGFyZSBkaWZmZXJlbnQuICAqLworCisjaWZuZGVmIERJUk5BTUVfU0VQQVJBVE9SCisjZGVmaW5lIERJUk5BTUVfU0VQQVJBVE9SICc6JworI2VuZGlmCisKKyNpZm5kZWYgU0xBU0hfUAorI2lmIGRlZmluZWQoX19HTzMyX18pfHxkZWZpbmVkKF9XSU4zMikKKyNkZWZpbmUgU0xBU0hfUChYKSAoKFgpPT0nXFwnKQorI2Vsc2UKKyNkZWZpbmUgU0xBU0hfUChYKSAoKFgpPT0nLycpCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNMQVNIX0NIQVIKKyNpZiBkZWZpbmVkKF9fR08zMl9fKXx8ZGVmaW5lZChfV0lOMzIpCisjZGVmaW5lIFNMQVNIX0NIQVIgJ1xcJworI2Vsc2UKKyNkZWZpbmUgU0xBU0hfQ0hBUiAnLycKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU0xBU0hfU1RSSU5HCisjaWYgZGVmaW5lZChfX0dPMzJfXyl8fGRlZmluZWQoX1dJTjMyKQorI2RlZmluZSBTTEFTSF9TVFJJTkcgIlxcIgorI2Vsc2UKKyNkZWZpbmUgU0xBU0hfU1RSSU5HICIvIgorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBST09URURfUAorI2RlZmluZSBST09URURfUChYKSAoU0xBU0hfUCgoWClbMF0pKQorI2VuZGlmCisKKy8qIE9uIHNvbWUgc3lzdGVtcywgUElER0VUIGlzIGRlZmluZWQgdG8gZXh0cmFjdCB0aGUgaW5mZXJpb3IgcGlkIGZyb20KKyAgIGFuIGludGVybmFsIHBpZCB0aGF0IGhhcyB0aGUgdGhyZWFkIGlkIGFuZCBwaWQgaW4gc2VwZXJhdGUgYml0CisgICBmaWVsZHMuICBJZiBub3QgZGVmaW5lZCwgdGhlbiBqdXN0IHVzZSB0aGUgZW50aXJlIGludGVybmFsIHBpZCBhcworICAgdGhlIGFjdHVhbCBwaWQuICovCisKKyNpZm5kZWYgUElER0VUCisjZGVmaW5lIFBJREdFVChwaWQpIChwaWQpCisjZW5kaWYKKworLyogSWYgdW5kZXIgQ3lnd2luLCBwcm92aWRlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIKKyAgIEN5Z3dpbiBjb21waWxlcnMgdGhhdCBkb24ndCBkZWZpbmUgdGhlIGN1cnJlbnQgY3BwIGRlZmluZS4gKi8KKyNpZmRlZiBfX0NZR1dJTjMyX18KKyNpZm5kZWYgX19DWUdXSU5fXworI2RlZmluZSBfX0NZR1dJTl9fCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogI2lmbmRlZiBERUZTX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9kZWx0YTY4LW5hdC5jIGIvZ2RiL2RlbHRhNjgtbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5NWIyMwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9kZWx0YTY4LW5hdC5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qIEZ1bmN0aW9ucyBzcGVjaWZpYyB0byBydW5uaW5nIGdkYiBuYXRpdmUgb24gYSBNb3Rvcm9sYSBEZWx0YSBTZXJpZXMgc3lzVjY4LgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk3LTk4LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgPHN5cy9zaWduYWwuaD4JLyogZm9yIE1BWFNJRyBpbiBzeXMvdXNlci5oICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CS8qIGZvciB1c2hvcnQgaW4gc3lzL2Rpci5oICovCisjaW5jbHVkZSA8c3lzL2Rpci5oPgkvKiBmb3Igc3RydWN0IGRpcmVjdCBpbiBzeXMvdXNlci5oICovCisjaW5jbHVkZSA8c3lzL3VzZXIuaD4KKworI2luY2x1ZGUgPG5saXN0Lmg+CisKKyNpZiAhZGVmaW5lZCAob2Zmc2V0b2YpCisjZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgKCh1bnNpZ25lZCBsb25nKSAmKChUWVBFICopMCktPk1FTUJFUikKKyNlbmRpZgorCisvKiBSZXR1cm4gdGhlIGFkZHJlc3MgaW4gdGhlIGNvcmUgZHVtcCBvciBpbmZlcmlvciBvZiByZWdpc3RlciBSRUdOTy4KKyAgIEJMT0NLRU5EIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIHVzZXIgc3RydWN0dXJlLiAgKi8KKworQ09SRV9BRERSCityZWdpc3Rlcl9hZGRyIChyZWdubywgYmxvY2tlbmQpCisgICAgIGludAlyZWdubzsKKyAgICAgQ09SRV9BRERSCWJsb2NrZW5kOworeworICBzdGF0aWMgaW50CXN5c3Y2OHJlZ1tdID0KKyAgICB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgLTEsIDE1LCAxNiB9OworCisgIGlmIChyZWdubyA+PSAwICYmIHJlZ25vIDwgc2l6ZW9mKHN5c3Y2OHJlZykgLyBzaXplb2Yoc3lzdjY4cmVnWzBdKSkKKyAgICByZXR1cm4gYmxvY2tlbmQgKyBzeXN2NjhyZWdbcmVnbm9dICogNDsgCisgIGVsc2UgaWYgKHJlZ25vIDwgRlBDX1JFR05VTSkKKyAgICByZXR1cm4gb2Zmc2V0b2YgKHN0cnVjdCB1c2VyLCB1X2ZwdS5yZWdzLnJlZ1tyZWdubyAtIEZQMF9SRUdOVU1dWzBdKTsKKyAgZWxzZSBpZiAocmVnbm8gPT0gRlBDX1JFR05VTSkKKyAgICByZXR1cm4gb2Zmc2V0b2YgKHN0cnVjdCB1c2VyLCB1X2ZwdS5yZWdzLmNvbnRyb2wpOworICBlbHNlIGlmIChyZWdubyA9PSBGUFNfUkVHTlVNKQorICAgIHJldHVybiBvZmZzZXRvZiAoc3RydWN0IHVzZXIsIHVfZnB1LnJlZ3Muc3RhdHVzKTsKKyAgZWxzZSBpZiAocmVnbm8gPT0gRlBJX1JFR05VTSkKKyAgICByZXR1cm4gb2Zmc2V0b2YgKHN0cnVjdCB1c2VyLCB1X2ZwdS5yZWdzLmlhZGRyKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlwKK0ludGVybmFsIGVycm9yOiBpbnZhbGlkIHJlZ2lzdGVyIG51bWJlciAlZCBpbiBSRUdJU1RFUl9VX0FERFJcbiIsCisJICAgICAgIHJlZ25vKTsKKyAgICAgIHJldHVybiBibG9ja2VuZDsKKyAgICB9Cit9CisKK0NPUkVfQUREUiBrZXJuZWxfdV9hZGRyOworCisvKiBSZWFkIHRoZSB2YWx1ZSBvZiB0aGUgdSBhcmVhIGZyb20gdGhlIGtlcm5lbC4gICovCit2b2lkCitfaW5pdGlhbGl6ZV9kZWx0YTY4X25hdCAoKQoreworICBzdHJ1Y3Qgbmxpc3QgbmxbMl07CisKKyAgbmxbMF0ubl9uYW1lID0gInUiOworICBubFsxXS5uX25hbWUgPSBOVUxMOworICBpZiAobmxpc3QgKCIvc3lzVjY4IiwgbmwpID09IDAgJiYgbmxbMF0ubl9zY251bSAhPSAwKQorICAgIGtlcm5lbF91X2FkZHIgPSBubFswXS5uX3ZhbHVlOworICBlbHNlCisgICAgeworICAgICAgcGVycm9yICgiQ2Fubm90IGdldCBrZXJuZWwgdSBhcmVhIGFkZHJlc3MiKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KK30KKworY2xlYXJfaW5zbl9jYWNoZSAoKQoreworI2lmZGVmIE1DVF9URVhUIC8qIGluIHN5cy9zaWduYWwuaCBvbiBzeXNWNjggUjNWNy4xICovCisgIG1lbWN0bCgwLCA0MDk2LCBNQ1RfVEVYVCk7CisjZW5kaWYKK30KKwora2VybmVsX3Vfc2l6ZSAoKQoreworICByZXR1cm4gc2l6ZW9mIChzdHJ1Y3QgdXNlcik7Cit9CmRpZmYgLS1naXQgYS9nZGIvZGVtYW5nbGUuYyBiL2dkYi9kZW1hbmdsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OWQ5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZGVtYW5nbGUuYwpAQCAtMCwwICsxLDIzNyBAQAorLyogQmFzaWMgQysrIGRlbWFuZ2xpbmcgc3VwcG9ydCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5OTEsIDE5OTIsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBhdCBDeWdudXMgU3VwcG9ydC4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKy8qICBUaGlzIGZpbGUgY29udGFpbnMgc3VwcG9ydCBjb2RlIGZvciBDKysgZGVtYW5nbGluZyB0aGF0IGlzIGNvbW1vbgorICAgdG8gYSBzdHlsZXMgb2YgZGVtYW5nbGluZywgYW5kIEdEQiBzcGVjaWZpYy4gKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJjb21tYW5kLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAiZGVtYW5nbGUuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisKKy8qIFNlbGVjdCB0aGUgZGVmYXVsdCBDKysgZGVtYW5nbGluZyBzdHlsZSB0byB1c2UuICBUaGUgZGVmYXVsdCBpcyAiYXV0byIsCisgICB3aGljaCBhbGxvd3MgZ2RiIHRvIGF0dGVtcHQgdG8gcGljayBhbiBhcHByb3ByaWF0ZSBkZW1hbmdsaW5nIHN0eWxlIGZvcgorICAgdGhlIGV4ZWN1dGFibGUgaXQgaGFzIGxvYWRlZC4gIEl0IGNhbiBiZSBzZXQgdG8gYSBzcGVjaWZpYyBzdHlsZSAoImdudSIsCisgICAibHVjaWQiLCAiYXJtIiwgImhwIiwgZXRjLikgaW4gd2hpY2ggY2FzZSBnZGIgd2lsbCBuZXZlciBhdHRlbXB0IHRvIGRvIGF1dG8KKyAgIHNlbGVjdGlvbiBvZiB0aGUgc3R5bGUgdW5sZXNzIHlvdSBkbyBhbiBleHBsaWNpdCAic2V0IGRlbWFuZ2xlIGF1dG8iLgorICAgVG8gc2VsZWN0IG9uZSBvZiB0aGVzZSBhcyB0aGUgZGVmYXVsdCwgc2V0IERFRkFVTFRfREVNQU5HTElOR19TVFlMRSBpbgorICAgdGhlIGFwcHJvcHJpYXRlIHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuICovCisKKyNpZm5kZWYgREVGQVVMVF9ERU1BTkdMSU5HX1NUWUxFCisjZGVmaW5lIERFRkFVTFRfREVNQU5HTElOR19TVFlMRSBBVVRPX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCisjZW5kaWYKKworLyogU3RyaW5nIG5hbWUgZm9yIHRoZSBjdXJyZW50IGRlbWFuZ2xpbmcgc3R5bGUuICBTZXQgYnkgdGhlCisgICAic2V0IGRlbWFuZ2xlLXN0eWxlIiBjb21tYW5kLCBwcmludGVkIGFzIHBhcnQgb2YgdGhlIG91dHB1dCBieSB0aGUKKyAgICJzaG93IGRlbWFuZ2xlLXN0eWxlIiBjb21tYW5kLiAqLworCitzdGF0aWMgY2hhciAqY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlX3N0cmluZzsKKworLyogTGlzdCBvZiBzdXBwb3J0ZWQgZGVtYW5nbGluZyBzdHlsZXMuICBDb250YWlucyB0aGUgbmFtZSBvZiB0aGUgc3R5bGUgYXMKKyAgIHNlZW4gYnkgdGhlIHVzZXIsIGFuZCB0aGUgZW51bSB2YWx1ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoYXQgc3R5bGUuICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGVtYW5nbGVyCisgIHsKKyAgICBjaGFyICpkZW1hbmdsaW5nX3N0eWxlX25hbWU7CisgICAgZW51bSBkZW1hbmdsaW5nX3N0eWxlcyBkZW1hbmdsaW5nX3N0eWxlOworICAgIGNoYXIgKmRlbWFuZ2xpbmdfc3R5bGVfZG9jOworICB9CitkZW1hbmdsZXJzW10gPQoreworICB7CisgICAgQVVUT19ERU1BTkdMSU5HX1NUWUxFX1NUUklORywKKyAgICAgIGF1dG9fZGVtYW5nbGluZywKKyAgICAgICJBdXRvbWF0aWMgc2VsZWN0aW9uIGJhc2VkIG9uIGV4ZWN1dGFibGUiCisgIH0KKyAgLAorICB7CisgICAgR05VX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HLAorICAgICAgZ251X2RlbWFuZ2xpbmcsCisgICAgICAiR05VIChnKyspIHN0eWxlIGRlbWFuZ2xpbmciCisgIH0KKyAgLAorICB7CisgICAgTFVDSURfREVNQU5HTElOR19TVFlMRV9TVFJJTkcsCisgICAgICBsdWNpZF9kZW1hbmdsaW5nLAorICAgICAgIkx1Y2lkIChsY2MpIHN0eWxlIGRlbWFuZ2xpbmciCisgIH0KKyAgLAorICB7CisgICAgQVJNX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HLAorICAgICAgYXJtX2RlbWFuZ2xpbmcsCisgICAgICAiQVJNIHN0eWxlIGRlbWFuZ2xpbmciCisgIH0KKyAgLAorICB7CisgICAgSFBfREVNQU5HTElOR19TVFlMRV9TVFJJTkcsCisgICAgICBocF9kZW1hbmdsaW5nLAorICAgICAgIkhQIChhQ0MpIHN0eWxlIGRlbWFuZ2xpbmciCisgIH0KKyAgLAorICB7CisgICAgRURHX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HLAorICAgICAgZWRnX2RlbWFuZ2xpbmcsCisgICAgICAiRURHIHN0eWxlIGRlbWFuZ2xpbmciCisgIH0KKyAgLAorICB7CisgICAgTlVMTCwgdW5rbm93bl9kZW1hbmdsaW5nLCBOVUxMCisgIH0KK307CisKK3N0YXRpYyB2b2lkCitzZXRfZGVtYW5nbGluZ19jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqKSk7CisKKy8qIFNldCBjdXJyZW50IGRlbWFuZ2xpbmcgc3R5bGUuICBDYWxsZWQgYnkgdGhlICJzZXQgZGVtYW5nbGUtc3R5bGUiCisgICBjb21tYW5kIGFmdGVyIGl0IGhhcyB1cGRhdGVkIHRoZSBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGVfc3RyaW5nIHRvCisgICBtYXRjaCB3aGF0IHRoZSB1c2VyIGhhcyBlbnRlcmVkLgorCisgICBJZiB0aGUgdXNlciBoYXMgZW50ZXJlZCBhIHN0cmluZyB0aGF0IG1hdGNoZXMgYSBrbm93biBkZW1hbmdsaW5nIHN0eWxlCisgICBuYW1lIGluIHRoZSBkZW1hbmdsZXJzW10gYXJyYXkgdGhlbiBqdXN0IGxlYXZlIHRoZSBzdHJpbmcgYWxvbmUgYW5kIHVwZGF0ZQorICAgdGhlIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSBlbnVtIHZhbHVlIHRvIG1hdGNoLgorCisgICBJZiB0aGUgdXNlciBoYXMgZW50ZXJlZCBhIHN0cmluZyB0aGF0IGRvZXNuJ3QgbWF0Y2gsIGluY2x1ZGluZyBhbiBlbXB0eQorICAgc3RyaW5nLCB0aGVuIHByaW50IGEgbGlzdCBvZiB0aGUgY3VycmVudGx5IGtub3duIHN0eWxlcyBhbmQgcmVzdG9yZQorICAgdGhlIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZV9zdHJpbmcgdG8gbWF0Y2ggdGhlIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZQorICAgZW51bSB2YWx1ZS4KKworICAgTm90ZTogIEFzc3VtZXMgdGhhdCBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGVfc3RyaW5nIGFsd2F5cyBwb2ludHMgdG8KKyAgIGEgbWFsbG9jJ2Qgc3RyaW5nLCBldmVuIGlmIGl0IGlzIGEgbnVsbC1zdHJpbmcuICovCisKK3N0YXRpYyB2b2lkCitzZXRfZGVtYW5nbGluZ19jb21tYW5kIChpZ25vcmUsIGZyb21fdHR5LCBjKQorICAgICBjaGFyICppZ25vcmU7CisgICAgIGludCBmcm9tX3R0eTsKKyAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7Cit7CisgIGNvbnN0IHN0cnVjdCBkZW1hbmdsZXIgKmRlbTsKKworICAvKiAgRmlyc3QganVzdCB0cnkgdG8gbWF0Y2ggd2hhdGV2ZXIgc3R5bGUgbmFtZSB0aGUgdXNlciBzdXBwbGllZCB3aXRoCisgICAgIG9uZSBvZiB0aGUga25vd24gb25lcy4gIERvbid0IGJvdGhlciBzcGVjaWFsIGNhc2luZyBmb3IgYW4gZW1wdHkKKyAgICAgbmFtZSwgd2UganVzdCB0cmVhdCBpdCBhcyBhbnkgb3RoZXIgc3R5bGUgbmFtZSB0aGF0IGRvZXNuJ3QgbWF0Y2guCisgICAgIElmIHdlIG1hdGNoLCB1cGRhdGUgdGhlIGN1cnJlbnQgZGVtYW5nbGluZyBzdHlsZSBlbnVtLiAqLworCisgIGZvciAoZGVtID0gZGVtYW5nbGVyczsgZGVtLT5kZW1hbmdsaW5nX3N0eWxlX25hbWUgIT0gTlVMTDsgZGVtKyspCisgICAgeworICAgICAgaWYgKFNUUkVRIChjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGVfc3RyaW5nLAorCQkgZGVtLT5kZW1hbmdsaW5nX3N0eWxlX25hbWUpKQorCXsKKwkgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGRlbS0+ZGVtYW5nbGluZ19zdHlsZTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGZvdW5kIGEgbWF0Y2guICBJZiBub3QsIGdyaXBlIGFib3V0IGFueSBub24tZW1wdHkKKyAgICAgc3R5bGUgbmFtZSBhbmQgc3VwcGx5IGEgbGlzdCBvZiB2YWxpZCBvbmVzLiAgRklYTUU6ICBUaGlzIHNob3VsZAorICAgICBwcm9iYWJseSBiZSBkb25lIHdpdGggc29tZSBzb3J0IG9mIGNvbXBsZXRpb24gYW5kIHdpdGggaGVscC4gKi8KKworICBpZiAoZGVtLT5kZW1hbmdsaW5nX3N0eWxlX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoKmN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZV9zdHJpbmcgIT0gJ1wwJykKKwl7CisJICBwcmludGZfdW5maWx0ZXJlZCAoIlVua25vd24gZGVtYW5nbGluZyBzdHlsZSBgJXMnLlxuIiwKKwkJCSAgICAgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlX3N0cmluZyk7CisJfQorICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJUaGUgY3VycmVudGx5IHVuZGVyc3Rvb2Qgc2V0dGluZ3MgYXJlOlxuXG4iKTsKKyAgICAgIGZvciAoZGVtID0gZGVtYW5nbGVyczsgZGVtLT5kZW1hbmdsaW5nX3N0eWxlX25hbWUgIT0gTlVMTDsgZGVtKyspCisJeworCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlLTEwcyAlc1xuIiwgZGVtLT5kZW1hbmdsaW5nX3N0eWxlX25hbWUsCisJCQkgICAgIGRlbS0+ZGVtYW5nbGluZ19zdHlsZV9kb2MpOworCSAgaWYgKGRlbS0+ZGVtYW5nbGluZ19zdHlsZSA9PSBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUpCisJICAgIHsKKwkgICAgICBmcmVlIChjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGVfc3RyaW5nKTsKKwkgICAgICBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGVfc3RyaW5nID0KKwkJc2F2ZXN0cmluZyAoZGVtLT5kZW1hbmdsaW5nX3N0eWxlX25hbWUsCisJCQkgICAgc3RybGVuIChkZW0tPmRlbWFuZ2xpbmdfc3R5bGVfbmFtZSkpOworCSAgICB9CisJfQorICAgICAgaWYgKGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9PSB1bmtub3duX2RlbWFuZ2xpbmcpCisJeworCSAgLyogVGhpcyBjYW4gaGFwcGVuIGR1cmluZyBpbml0aWFsaXphdGlvbiBpZiBnZGIgaXMgY29tcGlsZWQgd2l0aAorCSAgICAgYSBERU1BTkdMSU5HX1NUWUxFIHZhbHVlIHRoYXQgaXMgdW5rbm93biwgc28gcGljayB0aGUgZmlyc3QKKwkgICAgIG9uZSBhcyB0aGUgZGVmYXVsdC4gKi8KKwkgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGRlbWFuZ2xlcnNbMF0uZGVtYW5nbGluZ19zdHlsZTsKKwkgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZV9zdHJpbmcgPQorCSAgICBzYXZlc3RyaW5nIChkZW1hbmdsZXJzWzBdLmRlbWFuZ2xpbmdfc3R5bGVfbmFtZSwKKwkJCXN0cmxlbiAoZGVtYW5nbGVyc1swXS5kZW1hbmdsaW5nX3N0eWxlX25hbWUpKTsKKwkgIHdhcm5pbmcgKCJgJXMnIHN0eWxlIGRlbWFuZ2xpbmcgY2hvc2VuIGFzIHRoZSBkZWZhdWx0LlxuIiwKKwkJICAgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlX3N0cmluZyk7CisJfQorICAgIH0KK30KKworLyogRmFrZSBhICJzZXQgZGVtYW5nbGUtc3R5bGUiIGNvbW1hbmQuICovCisKK3ZvaWQKK3NldF9kZW1hbmdsaW5nX3N0eWxlIChzdHlsZSkKKyAgICAgY2hhciAqc3R5bGU7Cit7CisgIGlmIChjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGVfc3RyaW5nICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAoY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlX3N0cmluZyk7CisgICAgfQorICBjdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGVfc3RyaW5nID0gc2F2ZXN0cmluZyAoc3R5bGUsIHN0cmxlbiAoc3R5bGUpKTsKKyAgc2V0X2RlbWFuZ2xpbmdfY29tbWFuZCAoKGNoYXIgKikgTlVMTCwgMCwgKHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICopIE5VTEwpOworfQorCisvKiBJbiBvcmRlciB0byBhbGxvdyBhIHNpbmdsZSBkZW1hbmdsZXIgZXhlY3V0YWJsZSB0byBkZW1hbmdsZSBzdHJpbmdzCisgICB1c2luZyB2YXJpb3VzIGNvbW1vbiB2YWx1ZXMgb2YgQ1BMVVNfTUFSS0VSLCBhcyB3ZWxsIGFzIGFueSBzcGVjaWZpYworICAgb25lIHNldCBhdCBjb21waWxlIHRpbWUsIHdlIG1haW50YWluIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIHRoZQorICAgY29tbW9ubHkgdXNlZCBvbmVzLCBhbmQgY2hlY2sgdG8gc2VlIGlmIHRoZSBtYXJrZXIgd2UgYXJlIGxvb2tpbmcgZm9yCisgICBpcyBpbiB0aGF0IHN0cmluZy4gIENQTFVTX01BUktFUiBpcyB1c3VhbGx5ICckJyBvbiBzeXN0ZW1zIHdoZXJlIHRoZQorICAgYXNzZW1ibGVyIGNhbiBkZWFsIHdpdGggdGhhdC4gIFdoZXJlIHRoZSBhc3NlbWJsZXIgY2FuJ3QsIGl0J3MgdXN1YWxseQorICAgJy4nIChidXQgb24gbWFueSBzeXN0ZW1zICcuJyBpcyB1c2VkIGZvciBvdGhlciB0aGluZ3MpLiAgV2UgcHV0IHRoZQorICAgY3VycmVudCBkZWZpbmVkIENQTFVTX01BUktFUiBmaXJzdCAod2hpY2ggZGVmYXVsdHMgdG8gJyQnKSwgZm9sbG93ZWQKKyAgIGJ5IHRoZSBuZXh0IG1vc3QgY29tbW9uIHZhbHVlLCBmb2xsb3dlZCBieSBhbiBleHBsaWNpdCAnJCcgaW4gY2FzZQorICAgdGhlIHZhbHVlIG9mIENQTFVTX01BUktFUiBpcyBub3QgJyQnLgorCisgICBXZSBjb3VsZCBhdm9pZCB0aGlzIGlmIHdlIGNvdWxkIGp1c3QgZ2V0IGcrKyB0byB0ZWxsIHVzIHdoYXQgdGhlIGFjdHVhbAorICAgY3BsdXMgbWFya2VyIGNoYXJhY3RlciBpcyBhcyBwYXJ0IG9mIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiwgcGVyaGFwcyBieQorICAgZW5zdXJpbmcgdGhhdCBpdCBpcyB0aGUgY2hhcmFjdGVyIHRoYXQgdGVybWluYXRlcyB0aGUgZ2NjPG4+X2NvbXBpbGVkCisgICBtYXJrZXIgc3ltYm9sIChGSVhNRSkuICovCisKK3N0YXRpYyBjaGFyIGNwbHVzX21hcmtlcnNbXSA9IHtDUExVU19NQVJLRVIsICcuJywgJyQnLCAnXDAnfTsKKworaW50Citpc19jcGx1c19tYXJrZXIgKGMpCisgICAgIGludCBjOworeworICByZXR1cm4gYyAmJiBzdHJjaHIgKGNwbHVzX21hcmtlcnMsIGMpICE9IE5VTEw7Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX2RlbWFuZ2xlciAoKQoreworICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqc2V0LCAqc2hvdzsKKworICBzZXQgPSBhZGRfc2V0X2NtZCAoImRlbWFuZ2xlLXN0eWxlIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX3N0cmluZ19ub2VzY2FwZSwKKwkJICAgICAoY2hhciAqKSAmY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlX3N0cmluZywKKwkJICAgICAiU2V0IHRoZSBjdXJyZW50IEMrKyBkZW1hbmdsaW5nIHN0eWxlLlxuXAorVXNlIGBzZXQgZGVtYW5nbGUtc3R5bGUnIHdpdGhvdXQgYXJndW1lbnRzIGZvciBhIGxpc3Qgb2YgZGVtYW5nbGluZyBzdHlsZXMuIiwKKwkJICAgICAmc2V0bGlzdCk7CisgIHNob3cgPSBhZGRfc2hvd19mcm9tX3NldCAoc2V0LCAmc2hvd2xpc3QpOworICBzZXQtPmZ1bmN0aW9uLnNmdW5jID0gc2V0X2RlbWFuZ2xpbmdfY29tbWFuZDsKKworICAvKiBTZXQgdGhlIGRlZmF1bHQgZGVtYW5nbGluZyBzdHlsZSBjaG9zZW4gYXQgY29tcGlsYXRpb24gdGltZS4gKi8KKyAgc2V0X2RlbWFuZ2xpbmdfc3R5bGUgKERFRkFVTFRfREVNQU5HTElOR19TVFlMRSk7CisgIHNldF9jcGx1c19tYXJrZXJfZm9yX2RlbWFuZ2xpbmcgKENQTFVTX01BUktFUik7Cit9CmRpZmYgLS1naXQgYS9nZGIvZGluazMyLXJvbS5jIGIvZ2RiL2RpbmszMi1yb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGMyZTUxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2RpbmszMi1yb20uYwpAQCAtMCwwICsxLDE5OCBAQAorLyogUmVtb3RlIGRlYnVnZ2luZyBpbnRlcmZhY2UgZm9yIERJTkszMiAoUG93ZXJQQykgUk9NIG1vbml0b3IgZm9yCisgICBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJtb25pdG9yLmgiCisjaW5jbHVkZSAic2VyaWFsLmgiCisKK3N0YXRpYyB2b2lkIGRpbmszMl9vcGVuIFBBUkFNUyAoKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkpOworCitzdGF0aWMgdm9pZAorZGluazMyX3N1cHBseV9yZWdpc3RlciAocmVnbmFtZSwgcmVnbmFtZWxlbiwgdmFsLCB2YWxsZW4pCisgICAgIGNoYXIgKnJlZ25hbWU7CisgICAgIGludCByZWduYW1lbGVuOworICAgICBjaGFyICp2YWw7CisgICAgIGludCB2YWxsZW47Cit7CisgIGludCByZWdubyA9IDAsIGJhc2UgPSAwOworCisgIGlmIChyZWduYW1lbGVuIDwgMiB8fCByZWduYW1lbGVuID4gNCkKKyAgICByZXR1cm47CisKKyAgc3dpdGNoIChyZWduYW1lWzBdKQorICAgIHsKKyAgICBjYXNlICdSJzoKKyAgICAgIGlmIChyZWduYW1lWzFdIDwgJzAnIHx8IHJlZ25hbWVbMV0gPiAnOScpCisJcmV0dXJuOworICAgICAgaWYgKHJlZ25hbWVsZW4gPT0gMikKKwlyZWdubyA9IHJlZ25hbWVbMV0gLSAnMCc7CisgICAgICBlbHNlIGlmIChyZWduYW1lbGVuID09IDMgJiYgcmVnbmFtZVsyXSA+PSAnMCcgJiYgcmVnbmFtZVsyXSA8PSAnOScpCisJcmVnbm8gPSAocmVnbmFtZVsxXSAtICcwJykgKiAxMCArIChyZWduYW1lWzJdIC0gJzAnKTsKKyAgICAgIGVsc2UKKwlyZXR1cm47CisgICAgICBicmVhazsKKyAgICBjYXNlICdGJzoKKyAgICAgIGlmIChyZWduYW1lWzFdICE9ICdSJyB8fCByZWduYW1lWzJdIDwgJzAnIHx8IHJlZ25hbWVbMl0gPiAnOScpCisJcmV0dXJuOworICAgICAgaWYgKHJlZ25hbWVsZW4gPT0gMykKKwlyZWdubyA9IDMyICsgcmVnbmFtZVsyXSAtICcwJzsKKyAgICAgIGVsc2UgaWYgKHJlZ25hbWVsZW4gPT0gNCAmJiByZWduYW1lWzNdID49ICcwJyAmJiByZWduYW1lWzNdIDw9ICc5JykKKwlyZWdubyA9IDMyICsgKHJlZ25hbWVbMl0gLSAnMCcpICogMTAgKyAocmVnbmFtZVszXSAtICcwJyk7CisgICAgICBlbHNlCisJcmV0dXJuOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnSSc6CisgICAgICBpZiAocmVnbmFtZWxlbiAhPSAyIHx8IHJlZ25hbWVbMV0gIT0gJ1AnKQorCXJldHVybjsKKyAgICAgIHJlZ25vID0gNjQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICdNJzoKKyAgICAgIGlmIChyZWduYW1lbGVuICE9IDMgfHwgcmVnbmFtZVsxXSAhPSAnUycgfHwgcmVnbmFtZVsyXSAhPSAnUicpCisJcmV0dXJuOworICAgICAgcmVnbm8gPSA2NTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0MnOgorICAgICAgaWYgKHJlZ25hbWVsZW4gIT0gMiB8fCByZWduYW1lWzFdICE9ICdSJykKKwlyZXR1cm47CisgICAgICByZWdubyA9IDY2OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnUyc6CisgICAgICBpZiAocmVnbmFtZWxlbiAhPSA0IHx8IHJlZ25hbWVbMV0gIT0gJ1AnIHx8IHJlZ25hbWVbMl0gIT0gJ1InKQorCXJldHVybjsKKyAgICAgIGVsc2UgaWYgKHJlZ25hbWVbM10gPT0gJzgnKQorCXJlZ25vID0gNjc7CisgICAgICBlbHNlIGlmIChyZWduYW1lWzNdID09ICc5JykKKwlyZWdubyA9IDY4OworICAgICAgZWxzZSBpZiAocmVnbmFtZVszXSA9PSAnMScpCisJcmVnbm8gPSA2OTsKKyAgICAgIGVsc2UgaWYgKHJlZ25hbWVbM10gPT0gJzAnKQorCXJlZ25vID0gNzA7CisgICAgICBlbHNlCisJcmV0dXJuOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbW9uaXRvcl9zdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCB2YWwpOworfQorCitzdGF0aWMgdm9pZAorZGluazMyX2xvYWQgKG1vbm9wcywgZmlsZW5hbWUsIGZyb21fdHR5KQorICAgICBzdHJ1Y3QgbW9uaXRvcl9vcHMgKm1vbm9wczsKKyAgICAgY2hhciAqZmlsZW5hbWU7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZXh0ZXJuIGludCBpbmZlcmlvcl9waWQ7CisKKyAgZ2VuZXJpY19sb2FkIChmaWxlbmFtZSwgZnJvbV90dHkpOworCisgIC8qIEZpbmFsbHksIG1ha2UgdGhlIFBDIHBvaW50IGF0IHRoZSBzdGFydCBhZGRyZXNzICovCisgIGlmIChleGVjX2JmZCkKKyAgICB3cml0ZV9wYyAoYmZkX2dldF9zdGFydF9hZGRyZXNzIChleGVjX2JmZCkpOworCisgIGluZmVyaW9yX3BpZCA9IDA7ICAgICAgICAgICAgIC8qIE5vIHByb2Nlc3Mgbm93ICovCit9CisKKworLyogVGhpcyBhcnJheSBvZiByZWdpc3RlcnMgbmVlZHMgdG8gbWF0Y2ggdGhlIGluZGV4ZXMgdXNlZCBieSBHREIuIFRoZQorICAgd2hvbGUgcmVhc29uIHRoaXMgZXhpc3RzIGlzIGJlY2F1c2UgdGhlIHZhcmlvdXMgUk9NIG1vbml0b3JzIHVzZQorICAgZGlmZmVyZW50IG5hbWVzIHRoYW4gR0RCIGRvZXMsIGFuZCBkb24ndCBzdXBwb3J0IGFsbCB0aGUgcmVnaXN0ZXJzCisgICBlaXRoZXIuICAqLworCitzdGF0aWMgY2hhciAqZGluazMyX3JlZ25hbWVzW05VTV9SRUdTXSA9Cit7CisgICJyMCIsICAgInIxIiwgICAicjIiLCAgICJyMyIsICAgInI0IiwgICAicjUiLCAgICJyNiIsICAgInI3IiwKKyAgInI4IiwgICAicjkiLCAgICJyMTAiLCAgInIxMSIsICAicjEyIiwgICJyMTMiLCAgInIxNCIsICAicjE1IiwKKyAgInIxNiIsICAicjE3IiwgICJyMTgiLCAgInIxOSIsICAicjIwIiwgICJyMjEiLCAgInIyMiIsICAicjIzIiwKKyAgInIyNCIsICAicjI1IiwgICJyMjYiLCAgInIyNyIsICAicjI4IiwgICJyMjkiLCAgInIzMCIsICAicjMxIiwKKworICAiZjAiLCAgICJmMSIsICAgImYyIiwgICAiZjMiLCAgICJmNCIsICAgImY1IiwgICAiZjYiLCAgICJmNyIsCisgICJmOCIsICAgImY5IiwgICAiZjEwIiwgICJmMTEiLCAgImYxMiIsICAiZjEzIiwgICJmMTQiLCAgImYxNSIsCisgICJmMTYiLCAgImYxNyIsICAiZjE4IiwgICJmMTkiLCAgImYyMCIsICAiZjIxIiwgICJmMjIiLCAgImYyMyIsCisgICJmMjQiLCAgImYyNSIsICAiZjI2IiwgICJmMjciLCAgImYyOCIsICAiZjI5IiwgICJmMzAiLCAgImYzMSIsCisKKyAgInNycjAiLCAibXNyIiwgICJjciIsICAgImxyIiwgICAiY3RyIiwgICJ4ZXIiLCAgInhlciIKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGFyZ2V0X29wcyBkaW5rMzJfb3BzOworCitzdGF0aWMgY2hhciAqZGluazMyX2luaXRzW10gPSB7IlxyIiwgTlVMTH07CisKK3N0YXRpYyBzdHJ1Y3QgbW9uaXRvcl9vcHMgZGluazMyX2NtZHM7CisKK3N0YXRpYyB2b2lkCitkaW5rMzJfb3BlbiAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgbW9uaXRvcl9vcGVuIChhcmdzLCAmZGluazMyX2NtZHMsIGZyb21fdHR5KTsKK30KKwordm9pZAorX2luaXRpYWxpemVfZGluazMyX3JvbSAoKQoreworICBkaW5rMzJfY21kcy5mbGFncyA9IE1PX0hFWF9QUkVGSVggfCBNT19HRVRNRU1fTkVFRFNfUkFOR0UgfCBNT19GSUxMX1VTRVNfQUREUiB8IE1PX0hBTkRMRV9OTCB8IE1PXzMyX1JFR1NfUEFJUkVEIHwgTU9fU0VUUkVHX0lOVEVSQUNUSVZFIHwgTU9fU0VUTUVNX0lOVEVSQUNUSVZFIHwgTU9fR0VUTUVNXzE2X0JPVU5EQVJZIHwgTU9fQ0xSX0JSRUFLXzFfQkFTRUQgfCBNT19TUkVDX0FDSyB8IE1PX1NSRUNfQUNLX1JPVEFURTsKKyAgZGluazMyX2NtZHMuaW5pdCA9IGRpbmszMl9pbml0czsKKyAgZGluazMyX2NtZHMuY29udCA9ICJnbyArXHIiOworICBkaW5rMzJfY21kcy5zdGVwID0gInRyICtcciI7CisgIGRpbmszMl9jbWRzLnNldF9icmVhayA9ICJicCAweCV4XHIiOworICBkaW5rMzJfY21kcy5jbHJfYnJlYWsgPSAiYnAgJWRcciI7CisjaWYgMCAvKiBXb3VsZCBuZWVkIHRvIGZvbGxvdyBzdHJpY3QgYWxpZ25tZW50IHJ1bGVzLi4gKi8KKyAgZGluazMyX2NtZHMuZmlsbCA9ICJtZiAleCAleCAleFxyIjsKKyNlbmRpZgorICBkaW5rMzJfY21kcy5zZXRtZW0uY21kYiA9ICJtbSAtYiAleFxyIjsKKyAgZGluazMyX2NtZHMuc2V0bWVtLmNtZHcgPSAibW0gLXcgJXhcciI7CisgIGRpbmszMl9jbWRzLnNldG1lbS5jbWRsID0gIm1tICV4XHIiOworICBkaW5rMzJfY21kcy5zZXRtZW0udGVybSA9ICIgPyAgIjsKKyAgZGluazMyX2NtZHMuZ2V0bWVtLmNtZGIgPSAibWQgJXhcciI7CisgIGRpbmszMl9jbWRzLmdldG1lbS5yZXNwX2RlbGltID0gIiAgICAgICAgIjsKKyAgZGluazMyX2NtZHMuc2V0cmVnLmNtZCA9ICJybSAlc1xyIjsKKyAgZGluazMyX2NtZHMuc2V0cmVnLnRlcm0gPSAiID8gICI7CisgIGRpbmszMl9jbWRzLmdldHJlZy5jbWQgPSAicmQgJXNcciI7CisgIGRpbmszMl9jbWRzLmdldHJlZy5yZXNwX2RlbGltID0gIjogIjsKKyAgZGluazMyX2NtZHMuZHVtcF9yZWdpc3RlcnMgPSAicmQgclxyIjsKKyAgZGluazMyX2NtZHMucmVnaXN0ZXJfcGF0dGVybiA9ICJcXChcXHcrXFwpICs9XFwoWzAtOWEtZkEtRl0rXFxiXFwpIjsKKyAgZGluazMyX2NtZHMuc3VwcGx5X3JlZ2lzdGVyID0gZGluazMyX3N1cHBseV9yZWdpc3RlcjsKKyAgLyogUy1yZWNvcmQgZG93bmxvYWQsIHZpYSAia2V5Ym9hcmQgcG9ydCIuICAqLworICBkaW5rMzJfY21kcy5sb2FkID0gImRsIC1rXHIiOworICBkaW5rMzJfY21kcy5sb2FkcmVzcCA9ICJTZXQgSW5wdXQgUG9ydCA6IHNldCB0byBLZXlib2FyZCBQb3J0XHIiOworI2lmIDAgLyogc2xvdyBsb2FkIHJvdXRpbmUgbm90IG5lZWRlZCBpZiBTLXJlY29yZHMgd29yay4uLiAqLworICBkaW5rMzJfY21kcy5sb2FkX3JvdXRpbmUgPSBkaW5rMzJfbG9hZDsKKyNlbmRpZgorICBkaW5rMzJfY21kcy5wcm9tcHQgPSAiRElOSzMyXzYwMyA+PiI7CisgIGRpbmszMl9jbWRzLmxpbmVfdGVybSA9ICJcciI7CisgIGRpbmszMl9jbWRzLnRhcmdldCA9ICZkaW5rMzJfb3BzOworICBkaW5rMzJfY21kcy5zdG9wYml0cyA9IFNFUklBTF8xX1NUT1BCSVRTOworICBkaW5rMzJfY21kcy5yZWduYW1lcyA9IGRpbmszMl9yZWduYW1lczsKKyAgZGluazMyX2NtZHMubWFnaWMgPSBNT05JVE9SX09QU19NQUdJQzsKKworICBpbml0X21vbml0b3Jfb3BzICgmZGluazMyX29wcyk7CisKKyAgZGluazMyX29wcy50b19zaG9ydG5hbWUgPSAiZGluazMyIjsKKyAgZGluazMyX29wcy50b19sb25nbmFtZSA9ICJESU5LMzIgbW9uaXRvciI7CisgIGRpbmszMl9vcHMudG9fZG9jID0gIkRlYnVnIHVzaW5nIHRoZSBESU5LMzIgbW9uaXRvci5cblwKK1NwZWNpZnkgdGhlIHNlcmlhbCBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvIChlLmcuIC9kZXYvdHR5YSkuIjsKKyAgZGluazMyX29wcy50b19vcGVuID0gZGluazMyX29wZW47CisKKyAgYWRkX3RhcmdldCAoJmRpbmszMl9vcHMpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2RvYy9DaGFuZ2VMb2cgYi9nZGIvZG9jL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTAzYTgwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2RvYy9DaGFuZ2VMb2cKQEAgLTAsMCArMSwxNDczIEBACitUaHUgRmViIDExIDE4OjAwOjU5IDE5OTkgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogZ2RiLnRleGluZm86IFVwZGF0ZSB0aGUgY3JlZGl0cy4KKworTW9uIEZlYiAgOCAxNzozMzo1NyAxOTk5ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGdkYi50ZXhpbmZvOiBGaXggbWlzdGFrZXMgbm90aWNlZCBpbiBwcmludG91dCBvZiBsYXN0CisJZHJhZnQsIGFkZCBBbHBoYSB0byBkaXNjdXNzaW9uIG9mIGhldXJpc3RpYyBmZW5jZSBwb3N0LgorCitGcmkgRmViICA1IDE3OjIwOjAwIDE5OTkgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogZ2RiLnRleGluZm8sIHJlbW90ZS50ZXhpOiBNYW55IGNoYW5nZXM7IHVwZGF0ZSB0byBTZXZlbnRoCisgCUVkaXRpb24sIG1lcmdlIHNvbWUgSFAgY2hhbmdlcyBpbnRvIG1haW5saW5lLCBkZXNjcmliZSBzb21lCisgCXByZXZpb3VzbHkgdW5kb2N1bWVudGVkIGZlYXR1cmVzLCBkZXNjcmliZSBtb3JlIG9mIHRoZSB0YXJnZXQKKyAJY29tbWFuZHMgYXZhaWxhYmxlLCBlbGltaW5hdGUgb2Jzb2xldGUgc2VjdGlvbiBvbiByZW5hbWVkCisgCWNvbW1hbmRzLgorCSogYWxsLWNmZy50ZXhpLCBIUFBBLWNmZy50ZXhpOiBSZW1vdmUgc29tZSBvYnNvbGV0ZSBjb25kaXRpb25hbHMuCisKK1dlZCBKYW4gMjAgMTc6NDc6NDUgMTk5OSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBnZGIudGV4aW5mbzogTWFrZSBtYW55IEhQUEEgY29uZGl0aW9uYWxzIHVuY29uZGl0aW9uYWwsCisJaW5jbHVkaW5nIGNhdGNocG9pbnQgZGVzY3JpcHRpb24sIHNpbmNlIG5vdyBvbiBmb3IgYWxsIGNvbmZpZ3MuCisJKiBhbGwtY2ZnLnRleGk6IEBjbGVhciBIUFBBLCBzaW5jZSBpcyBtYWlubHkgZm9yIHZlcnkgSFAtc3BlY2lmaWMKKwlzcGVjaWFsaXphdGlvbnMuCisKK1RodSBKYW4gMTQgMTc6MTA6MTIgMTk5OSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoR0RCdm4udGV4aSk6IEZpeCBtYXRjaCBleHByZXNzaW9uIHRvIHdvcmsgd2l0aAorCWN1cnJlbnQgZm9ybWF0IG9mIFZFUlNJT04gaW4gZ2RiL01ha2VmaWxlLmluLgorCSogZ2RiLnRleGluZm86IEZpeCBub2RlIHJlZiB0byBtYXRjaCBuZXcgcmVhZGxpbmUuCisKK1dlZCBKYW4gMTMgMTA6Mzg6NDAgMTk5OSAgRWRpdGggRXBzdGVpbiAgPGVlcHN0ZWluQHNvcGhpYS5jeWdudXMuY29tPgorCisJKiBnZGIudGV4aW5mbzogQ2hhbmdlcyBtYWRlIGFzIHBhcnQgb2YgYSBwcm9qZWN0IHRvIG1lcmdlIGluIAorCSAgY2hhbmdlcyBtYWRlIGJ5IEhQLiBEb2N1bWVudGF0aW9uIG1ha2VzIGV4dGVuc2l2ZSB1c2Ugb2YgCisJICBAaWZjbGVhciBIUFBBIGFuZCBAaWZzZXQgSFBQQS4gVGhlIEhQIG1hbnVhbCBvbWl0cyBkb3VtZW50YXRpb24KKwkgIG9uIHJlbW90ZSBkZWJ1Z2dpbmcuIFRoZXJlIGFyZSBkaWZmZXJlbmNlcyBpbiBkb2N1bWVudGF0aW9uCisgCSAgKEhQIHZzLiAgbm9uLUhQKSBvbiBDKysgc3VwcG9ydCAoYUNDIHZzLiBnbnUgZ2NjKyspLiBBbHNvLAorCSAgdGhlIEhQIG1hbnVhbCBkaXNjdXNzZXMgY2F0Y2hwb2ludHMsIGhhcmR3YXJlIHdhdGNocG9pbnRzLCBhbmQKKwkgIHNvbWUgSFBVWCBzcGVjaWZpYyBsaW1pdGF0aW9ucyBmb3Igc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4KKwkgIAorCSAgVGhlcmUgYXJlIGFsc28gYSBudW1iZXIgb2YgQG5vZGUgY2hhbmdlcy4KKworMTk5OS0wMS0xMiAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBnZGJpbnQudGV4aW5mbyAoRm9ybWF0dGluZyk6IERpc2FtYmlndWF0ZSBhIHNlbnRlbmNlLgorCShDIFVzYWdlKTogU2FtZS4KKworV2VkIEphbiAgNiAxMTo1NTozNCAxOTk5ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KKworCVRoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGUgYnkgRWRpdGggRXBzdGVpbgorIAk8ZWVwc3RlaW5AY3lnbnVzLmNvbT4gYXMgcGFydCBvZiBhIHByb2plY3QgdG8gbWVyZ2UgaW4gY2hhbmdlcworIAltYWRlIGJ5IEhQLgorCQorCSogSFBQQS1jZmcudGV4aTogbmV3IGZpbGUuCisKKwkqIGFsbC1jZmcudGV4aTogc2V0IEhQUEEgZm9yIEhQIFBBLVJJU0MgdGFyZ2V0cy4KKworCSogcmVmY2FyZC50ZXg6IGNoYW5nZSBkb2N1bWVudGF0aW9uIGFib3V0IGNhdGNoLgorCSAgcmVtb3ZlZCBpbmZvIGNhdGNoLgorCitNb24gSmFuICA0IDE4OjI5OjE4IDE5OTkgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogZ2RiaW50LnRleGluZm86IEV4cGFuZCBvbiBHREIncyBjb2Rpbmcgc3RhbmRhcmRzLAorCXNwZWNpZnkgdGhlIHVzZSBvZiBhcmcgbmFtZXMgd2l0aCBwcm90b3R5cGVzLgorCisxOTk4LTEyLTE0ICBKLlQuIENvbmtsaW4gIDxqdGNAcmVkYmFja25ldHdvcmtzLmNvbT4KKworCSogZ2RiLnRleGluZm86IEZpeCB0aXBvLgorCitTdW4gRGVjIDEzIDEwOjI3OjU5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZ2RiaW50LnRleGluZm86IERvY3VtZW50IFRBUkdFVF9CWVRFX09SREVSX0RFRkFVTFQgYW5kCisgCVRBUkdFVF9CWVRFX09SREVSX1NFTEVDVEFCTEVfUC4KKworVGh1IERlYyAxMCAxNjowNzowOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdkYmludC50ZXhpbmZvIChGUkFNRV9GSU5EX1NBVkVEX1JFR1MpOiBEb2N1bWVudC4KKworMTk5OC0xMi0wOSAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgorCisJKiBhZ2VudGV4cHIudGV4aTogTmV3IGZpbGUuCisKK1dlZCBEZWMgIDkgMjE6MTM6NTcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjaG9vaz4KKworCSogZ2RiaW50LnRleGluZm8gKFJFR0lTVEVSX05BTUUpOiBSZXBsYWNlIFJFR0lTVEVSX05BTUVTLgorCisxOTk4LTEyLTAzICBKLlQuIENvbmtsaW4gIDxqdGNAcmVkYmFja25ldHdvcmtzLmNvbT4KKworCSogcmVtb3RlLnRleGk6IENoYW5nZWQgd29yZGluZyB0aGF0IGltcGxpZWQgdGhhdCB0aGUgR0RCIHJlbW90ZQorCXByb3RvY29sIGNhY2hlcyByZWdpc3RlciB2YWx1ZXMgaW5zdGVhZCBvZiBHREIgaXRzZWxmLgorCitUdWUgRGVjICAxIDE3OjQ1OjQzIDE5OTggIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogZ2RiaW50LnRleGluZm86IEFkZCBzb21lIGluZm8gYWJvdXQgc3ltYm9sIHJlYWRlcnMuCisJKENISUxMX1BST0RVQ0VSLCBldGMpOiBDb21tZW50IG91dCBkZXNjcmlwdGlvbnMsIG5vdCB1c2VmdWwuCisJKElOX1NPTElCX0NBTExfVFJBTVBPTElORSk6IFJlbmFtZSBpbmZvIGZyb20gSU5fU09MSUJfVFJBTVBPTElORS4KKwkoSU5fU09MSUJfUkVUVVJOX1RSQU1QT0xJTkUpOiBEZXNjcmliZS4KKwkoS0VSTkVMX0RFQlVHR0lORywgTUlQU0VMKTogTm8gaW5mbyBhYm91dCB0aGVzZSwgcmVtb3ZlLgorCitNb24gTm92IDMwIDExOjMyOjIxIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY2hvb2s+CisKKwkqIGdkYmludC50ZXhpbmZvIChGUkFNRV9DSEFJTl9WQUxJRF9BTFRFUk5BVEUpOiAKKworU2F0IE5vdiAyOCAxMzo0NTo1MyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdkYmludC50ZXhpbmZvIChJTk5FUl9USEFOKTogVXBkYXRlLCBub3cgdGFrZXMgcGFyYW1ldGVycy4KKworRnJpIE5vdiAyNyAxMjozOTo0NSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGNob29rPgorCisJKiBnZGJpbnQudGV4aW5mbyAoTk9fU0lOR0xFX1NURVApOiBSZXBsYWNlIHdpdGgKKyAJU09GVFdBUkVfU0lOR0xFX1NURVBfUCBhbmQgU09GVFdBUkVfU0lOR0xFX1NURVAuCisKK1dlZCBPY3QgMTQgMTA6MDI6NDAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBnZGJpbnQudGV4aW5mbzogRml4IG1pbm9yIHR5cG9zLgorCitXZWQgU2VwIDMwIDE4OjAzOjE5IDE5OTggIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogZ2RiaW50LnRleGluZm86IENvbXBsZXRlIG92ZXJoYXVsLiAgR3JvdXAgZGVzY3JpcHRpb25zIG1vcmUKKwlsb2dpY2FsbHksIGFkZCBtb3JlIGluZm8gb24gZ2VuZXJpYyBhbGdvcml0aG1zLCByZW1vdmUgbXVjaAorCW9ic29sZXRlIGFuZC9vciB3cm9uZyBtYXRlcmlhbC4KKworRnJpIEp1bCAyNCAxNzo1MTozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN0YWJzLnRleGluZm8gKE1ldGhvZCBUeXBlIERlc2NyaXB0b3IpOiBFeHBhbmQgYW5kIGNvcnJlY3QuCisKK01vbiBNYXkgIDQgMTA6Mzc6MTIgMTk5OCAgQnJpYW4gWW91bWFucyAoM2RpZmZAZ251Lm9yZykKKworCSogcmVmY2FyZC50ZXg6ICBDb3B5cmlnaHQsIGFkZHJlc3MgdXBkYXRlcy4KKworVHVlIEFwciAyMSAxODowOTo1NiAxOTk4ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGdkYi50ZXhpbmZvIChFRElUSU9OLCBEQVRFKTogVXBkYXRlIGFuZCBjaGFuZ2UgdG8gdXNlIG9yZGluYWxzCisJZm9yIHRoZSBlZGl0aW9uIGluc3RlYWQgb2YgY29uZnVzaW5nIEdEQi12ZXJzaW9uLWxpa2UgbnVtYmVycy4KKworTW9uIEFwciAxMyAxNDowNTowMCAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiLnRleGluZm8gKGhicmVhaywgd2F0Y2gpOiBGaXggdHlwbywgImRhdGUiIC0+ICJkYXRhIi4KKworVGh1IEFwciAgMiAxNjo1Mjo0NCAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKKworICAgICAgICAqIExSUzogUmVmb3JtYXQgYSBiaXQgdG8ga2VlcCB0ZXh0IHVuZGVyIDgwIGNvbHVtbnMuCisKK1RodSBBcHIgIDIgMTY6MTA6MzYgMTk5OCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBnZGIudGV4aW5mbzogQWRkIHNvbWUgY3JlZGl0cywgbWVudGlvbiBidWcgbW9uaXRvci4KKwkqIHJlbW90ZS50ZXhpOiBNZW50aW9uIG1pcHMgbW9uaXRvciB0YXJnZXRzLgorCSogZ2RiaW50LnRleGluZm86IERlc2NyaWJlIFNQX1JFR05VTSwgU1RFUF9TS0lQU19ERUxBWS4KKwkKK01vbiBGZWIgIDIgMTc6MTM6MDMgMTk5OCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBnZGJpbnQudGV4aW5mbzogUmVtb3ZlIG9ic29sZXRlIG1lbnRpb25zIG9mIHBpbnNuLmMgYW5kIG9wY29kZS5oCisgCWZpbGVzLCBmaW5pc2ggc29ydGluZyBvZiBob3N0IHZzIHRhcmdldCB2cyBuYXRpdmUgbWFjcm9zLCBkZXNjcmliZQorIAlzb21lIG1vcmUgb2YgdGhlbS4KKworVHVlIEphbiAxMyAxNjo0NDo1MCAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiaW50LnRleGluZm8gKEhvc3QgQ29uZGl0aW9uYWxzKTogRG9jdW1lbnQgY2hhbmdlIGZyb20KKwl1c2luZyBOT19NTUFMTE9DIHRvIGl0J3MgaW52ZXJzZSwgVVNFX01NQUxMT0MuCisKK01vbiBOb3YgMjQgMTM6NTU6MjEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBnZGJpbnQudGV4aW5mbyAoSG9zdCBDb25kaXRpb25hbHMpOiBEb2N1bWVudAorIAlQUklOVEZfSEFTX0xPTkdfRE9VQkxFLCBTQ0FORl9IQVNfTE9OR19ET1VCTEUsIEhBVkVfTE9OR19ET1VCTEUuCisKK0ZyaSBKdWwgIDQgMTQ6NTI6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnZGJpbnQudGV4aW5mbyAoSG9zdCBDb25kaXRpb25hbHMpOiBBZGQgQ1JMRl9TT1VSQ0VfTElORVMuCisJRG9jdW1lbnQgTFNFRUtfTk9UX0xJTkVBUi4KKworVHVlIE1hciAyNSAxNDo0NDowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN0YWJzLnRleGluZm8gKFN0YWIgU2VjdGlvbiBCYXNpY3MpOiBNYWtlIGl0IGNsZWFyIHRoYXQgb25seQorCXNvbWUgdmVyc2lvbnMgb2YgdGhlIEdOVSBsaW5rZXIgcmVtb3ZlIHRoZSBsZWFkaW5nIE5fVU5ERiBzeW1ib2wuCisKK1RodSBGZWIgMjcgMTc6NDU6MTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBzdGFicy50ZXhpbmZvIChTdHJpbmcgRmllbGQpOiBEb2N1bWVudCB0eXBlIG51bWJlciBwYWlycyBoZXJlLAorCWluc3RlYWQgb2YgaW4gdGhlIFN1biBzcGVjaWZpYyBzZWN0aW9uLgorCShJbmNsdWRlIEZpbGVzKTogVGhlIEdOVSBsaW5rZXIgc3VwcG9ydHMgdGhlIE5fQklOQ0wKKwlvcHRpbWl6YXRpb24uICBDbGFyaWZ5IHRoZSBOX0JJTkNMIHZhbHVlLCBhbmQgd2hhdCBpdCBpcyB1c2VkCisJZm9yLgorCShQcm9jZWR1cmVzKTogRG9jdW1lbnQgTl9GVU4gd2l0aCBhbiBlbXB0eSBzdHJpbmcgdG8gbWFyayB0aGUgZW5kCisJb2YgYSBmdW5jdGlvbi4KKwkoVHlwZWRlZnMpOiBNZW50aW9uIHRoYXQgU3VuIGNvbXBpbGVycyBtYXkgdXNlIE5fR1NZTSBmb3IgYSB0eXBlLgorCShTdW4gRGlmZmVyZW5jZXMpOiBSZW1vdmUgdGhpcyBub2RlLCBhcyB0aGUgaW5mb3JtYXRpb24gaXMgbm93CisJZWxzZXdoZXJlIGluIHRoZSBtYWluIGRvY3VtZW50LgorCShTdGFiIFNlY3Rpb24gQmFzaWNzKTogTWVudGlvbiB0aGF0IHRoZSBHTlUgbGlua2VyIG1heSBvcHRpbWl6ZQorCXN0YWJzIGFuZCByZW1vdmUgdGhlIGxlYWRpbmcgTl9VTkRGIHN5bWJvbC4KKworTW9uIERlYyAgOSAxMjoyMzozMiAxOTk2ICBSb2xhbmQgUGVzY2ggIDxyb2xhbmRAd3JzLmNvbT4KKworCSogZ2RiLnRleGluZm8sIHJlZmNhcmQudGV4OiBSZXN0b3JlIGF1dGhvciBjcmVkaXQKKworV2VkIE9jdCAgMiAyMjowMTozNiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAZmlzaGZvb2QubmluZW1vb25zLmNvbT4KKworCSogZ2RiaW50LnRleGluZm8gKFNJR1RSQU1QX1NUQVJULCBTSUdUUkFNUF9FTkQpOiBVcGRhdGUKKwlkb2N1bWVudGF0aW9uIHRvIGFjY291bnQgZm9yIFNUQVJUIGFuZCBFTkQgbWFjcm9zIHRha2luZworCW9uZSBhcmcuCisKK1RodSBBdWcgMjIgMTc6NTk6MDMgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwlGcm9tOiBFYmVyaGFyZCBNYXR0ZXMgPG1hdHRlc0BhenUuaW5mb3JtYXRpay51bmktc3R1dHRnYXJ0LmRlPgorCSogZ2RiLnRleGluZm8gKEZyYW1lcyk6IEZpeCB0eXBvLgorCitUdWUgSnVsIDIzIDEwOjA2OjIwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGJpbnQudGV4aW5mbyAoTk9fU0lOR0xFX1NURVApOiBEb2N1bWVudCB0aGF0IHNpbmdsZV9zdGVwIHRha2VzCisJYSB0YXJnZXRfc2lnbmFsIGFzIGFyZyB0eXBlLCBub3QgYSBwaWQuCisKK0ZyaSBKdWwgMTIgMTE6MTA6MDUgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogZ2RiLnRleGluZm86ICBEb2N1bWVudCBgc2V0IGFzc2VtYmx5LWxhbmd1YWdlJy4KKworVGh1IEp1bCAxMSAxMzo1MDoyOCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS50ZXhpOiBVcGRhdGUgbGlzdCBvZiBzdHVicyBpbiB0aGUgR0RCIGRpc3RyaWJ1dGlvbi4KKworRnJpIEp1bCAgNSAxNTozODo1NCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiaW50LnRleGluZm8gKE5PX01NQ0hFQ0spOiBSZW5hbWVkIGZyb20gTk9fTU1BTExPQ19DSEVDSy4KKyAgCUFsc28gZG9jdW1lbnQgdGhhdCBzb21lIHN5c3RlbXMgY2FuIHVzZSBtbWFsbG9jIGJ1dCBtdXN0IGRlZmluZQorIAl0aGlzIGlmIHRoZWlyIEMgcnVudGltZSBhbGxvY2F0ZXMgbWVtb3J5IHRoYXQgaXMgbGF0ZXIgZnJlZWQuCisJKE1NQ0hFQ0tfRk9SQ0UpOiBEb2N1bWVudCBuZXcgbWFjcm8uCisJCitGcmkgSnVuIDI4IDIyOjE3OjEwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KKworCSogcmVtb3RlLnRleGk6IEFkZCBkb2N1bWVudGF0aW9uIGZvciB0YXJnZXQgU3BhcmNsZXQuCisKK01vbiBKdW4gMjQgMTg6MTI6MjIgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKKworCSogTWFrZWZpbGUuaW4gKHNyY2RpciwgVlBBVEgsIHByZWZpeCwgaW5mb2RpciwgSU5TVEFMTCwgCisJSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYgc2V0IHZhbHVlcy4KKwkqIGNvbmZpZ3VyZS5pbjogUmV3cml0dGVuIGZvciBhdXRvY29uZi4KKwkqIGNvbmZpZ3VyZTogTmV3LgorCitNb24gSnVuIDE3IDEwOjQzOjQxIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoRFZJUFMpOiBOZXcgZGVmaW5lLCBzZXQgdG8gZHZpcHMuCisJKGR2aSk6IEFkZCBzdGFicy5kdmkuCisJKHBzKTogTmV3IHRhcmdldC4KKwkoYWxsLWRvYyk6IERlcGVuZCBvbiBpbmZvLCBkdmksIGFuZCBwcyB0YXJnZXRzLgorCShTVEFHRVNUVUZGKTogQWRkICoucHMgYW5kICouZHZpIGZpbGVzLgorCShjbGVhbi1pbmZvLCBjbGVhbi1kdmkpOiBSZW1vdmUuCisJKG1vc3RseWNsZWFuKTogRG9lcyBub3QgZGVwZW5kIHVwb24gY2xlYW4taW5mbyBvciBjbGVhbi1kdmksCisJcnVsZXMgY29tcGxldGVseSByZXdyaXR0ZW4uCisJKG1haW50YWluZXItY2xlYW4pOiBSZW1vdmUgY2xlYW4taW5mbyBhbmQgY2xlYW4tZHZpCisJZGVwZW5kZW5jaWVzIGFuZCBwdXQgdGhlaXIgYWN0aW9ucyBpbiB0aGUgcnVsZXMuCisJKGdkYi5wcyk6IE5ldyB0YXJnZXQKKwkoZ2RiLmR2aSwgZ2RiZ3VpLmR2aSwgZ2RiaW50LmR2aSwgc3RhYnMuZHZpKTogUmVtb3ZlIAorCWludGVybWVkaWF0ZSBUZVggZmlsZXMsIHdoZXRoZXIgdGhleSBoYXZlIDIgb3IgMyBjaGFyYWN0ZXIKKwlleHRlbnNpb25zLgorCShnZGJpbnQucHMpOiBBZGQgdGFyZ2V0IGFuZCBydWxlcy4KKwkoZ2RiLWludGVybmFscyk6IERlbGV0ZSB1bnVzZWQgdGFyZ2V0LgorCShNYWtlZmlsZSk6IERlcGVuZHMgdXBvbiBjb25maWcuc3RhdHVzIGFsc28uCisKK1NhdCBNYXIgMzAgMTU6NDY6NTggMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdkYmludC50ZXhpbmZvIChDQ19IQVNfTE9OR19MT05HKTogQ2xhcmlmeSB3aGVuL2hvdyB0aGlzIGlzCisJc2V0LgorCitTYXQgTWFyIDE2IDE1OjEwOjIwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJRnJvbSBQZXRlciBTY2hhdWVyIDxQZXRlci5TY2hhdWVyQFJlZ2VudC5FLVRlY2huaWsuVFUtTXVlbmNoZW4uREU+CisJKiBnZGIudGV4aW5mbyAoRXhwcmVzc2lvbnMpOiBGaXggZXJyb25lb3VzIGFycmF5IGNvbnN0YW50IGV4YW1wbGUuCisKK1NhdCBNYXIgMTYgMTM6Mjg6NDUgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdkYi50ZXhpbmZvOiBBZGQgbWlzc2luZyAiQGJ1bGxldCIgdG8gc29tZSAiQGl0ZW1pemUiIGNvbW1hbmRzLgorCitTYXQgRmViIDEwIDAzOjI4OjM2IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLnRleGluZm8gKFByaW50IHNldHRpbmdzKTogIERvY3VtZW50CisJYHNldC9zaG93IHByaW50IHN0YXRpYy1tZW1iZXJzJyBjb21tYW5kcy4KKworV2VkIEphbiAxMCAxNDoxNjozNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiaW50LnRleGluZm8gKE5hdGl2ZSk6IERvY3VtZW50IG5hbWUgY2hhbmdlLCBjb3JlZGVwLmMgdG8KKwljb3JlLWFvdXQuYy4KKworV2VkIERlYyAxMyAxMjozNToyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN0YWJzLnRleGluZm8gKEluY2x1ZGUgRmlsZXMpOiBEb2N1bWVudCB0aGUgdmFsdWVzIHRoZSBTdW5PUzQKKwlsaW5rZXIgY3JlYXRlcyBmb3IgTl9CSU5DTC9OX0VJTkNML05fRVhDTCBzdGFicy4KKworRnJpIERlYyAgOCAyMTowODo0NCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiaW50LnRleGluZm8gKFJlbGVhc2VzKTogQ2hhbmdlIGdkYi50YXIuWiB0byBnZGIudGFyLmd6LgorCUZpeCB0eXBvLgorCitGcmkgRGVjICAxIDExOjA3OjUwIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGJpbnQudGV4aW5mbyAoUmVsZWFzZXMpOiBNYWtlICJnZGIudGFyLmd6IiByYXRoZXIgdGhhbgorCSJnZGIudGFyLloiLgorCitXZWQgU2VwIDIwIDEzOjE0OjEwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LCBzeW5vbnltIGZvcgorCXJlYWxjbGVhbi4KKworVGh1IEF1ZyAgMyAxMDo0NTozNyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogVXBkYXRlIGFsbCBGU0YgYWRkcmVzc2VzIGV4Y2VwdCB0aG9zZSBpbiBDT1BZSU5HKiBmaWxlcy4KKworV2VkIEp1bCAxOSAxODo0MzowMyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwlGcm9tIFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51ayk6CisJKiBnZGIudGV4aW5mbyAoY29udmVuaWVuY2UgdmFyaWFibGVzKTogRG9jdW1lbnQgJF9leGl0Y29kZS4KKwkocXVpdCk6IERvY3VtZW50IG9wdGlvbmFsIGV4cHJlc3Npb24gdG8gdXNlIGFzIGV4aXQgY29kZS4KKworVGh1IEp1biAyMiAyMToyNzozMyAxOTk1ICBWaWN0b3JpYSBNaXhvbiAgPHZpY3RvcmlhQGN5Z251cy5jb20+CisKKwkqIGdkYi50ZXhpbmZvLCByZW1vdGUudGV4aTogQnJvdWdodCB1cCB0byBkYXRlIHdpdGggdmFyaW91cworCUdEQiBjaGFuZ2VzLgorCitUdWUgSnVuIDIwIDE0OjM1OjM4IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogZ2RiLnRleGluZm86IFVwZGF0ZSBkYXRlcyBhbmQgdmVyc2lvbnMsIGZpeCBjb21tZW50cyBhYm91dAorCWhhcmR3YXJlIHdhdGNocG9pbnRzIGluIGZ1dHVyZSByZWxlYXNlcyBhbmQgYWJvdXQgdGhlCisJc2hhcmVkbGlicmFyeSBjb21tYW5kLgorCitNb24gTWF5ICA4IDA5OjMwOjM2IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvOiBSZW1vdmUgbm9kZSBgWENPRkYgZGlmZmVyZW5jZXMnLiAgRGVzY3JpYmUgdmFsdWUgb2YKKwlDX0ZVTiBzdGFiLiAgT3RoZXIgY2xlYW51cHMuCisKK1dlZCBBcHIgMTkgMDc6MDI6MTkgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS50ZXhpIChCb290c3RyYXBwaW5nKTogQ2xhcmlmeSB0aGF0IGZsdXNoX2lfY2FjaGUgaXMgb25seQorCWZvciB0aGUgc3BhcmMgc3R1Yi4KKworVHVlIEFwciAxMSAxMTo0MTo0OSAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYW5ub3RhdGUudGV4aTogQ2xhcmlmeSB3aGljaCBhZGRyZXNzZXMgaGF2ZSBkaWZmZXJpbmcgZm9ybWF0cworCWRlcGVuZGluZyBvbiB0aGUgbGFuZ3VhZ2UgYW5kIHdoaWNoIGRvIG5vdC4KKworVHVlIE1hciAyOCAxNjo1NjoyMiAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS50ZXhpIChOZXRXYXJlKTogQ2hhbmdlZCBleGFtcGxlIHRvIHVzZSBCT0FSRD0gaW5zdGVhZCBvZgorCSAgTk9ERT0gYXJndW1lbnQgdG8gcmVmbGVjdCBjb3JyZXNwb2RpbmcgY2hhbmdlIHRvIGdkYnNlcnZlLm5sbS4KKworRnJpIE1hciAxNyAwNjo0NzowMiAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoTmVnYXRpdmUgVHlwZSBOdW1iZXJzKTogTWVudGlvbiB0aGUgZmFjdCB0aGF0CisJR0RCLCBhcyB3ZWxsIGFzIEFJWCBkYngsIHN1cHBvcnRzIHRoZSBzaXplIHR5cGUgYXR0cmlidXRlLgorCitUaHUgTWFyIDE2IDEyOjExOjMyIDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvIChOZWdhdGl2ZSBUeXBlIE51bWJlcnMpOiBEb2N1bWVudCB0eXBlcyAtMzEgdG8gLTM0LgorCitNb24gTWFyIDEzIDE2OjQ5OjEzIDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBnZGIudGV4aW5mbyAoRGVmaW5lKTogIERvY3VtZW50ICRhcmcwLi4uIGFyZ3VtZW50cyB0byBjb21tYW5kcywKKwlhbmQgbmV3ICdpZicgYW5kICd3aGlsZScgY29tbWFuZHMuCisKK0ZyaSBGZWIgMTcgMTU6MjQ6MzUgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIGdkYi50ZXhpbmZvIChBcnRpZmljaWFsIGFycmF5cyk6ICBOb3RlIHVzZSBvZiBjb2VyY2UtdG8tYXJyYXktdHlwZS4KKworV2VkIEZlYiAxNSAxMTo1OToxOCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIGFsbC1jZmcudGV4aTogTmV3IGZsYWcsIEdEQlNFUlZFLCBmb3IgTmV0V2FyZSdzIGdkYnNlcnZlLm5sbS4KKwkqIHJlbW90ZS50ZXhpIChOZXRXYXJlKTogTmV3IG5vZGUsIGhvdyB0byB1c2UgZ2Ric2VydmUubmxtIG9uCisJICBOZXRXYXJlIHRhcmdldHMuICBNb3N0bHkgc3RvbGVuIGZyb20gdGhlIFNlcnZlciBub2RlLgorCitGcmkgRmViIDEwIDIwOjIwOjA4IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbyAoU2V0dGluZyk6IFRhbGsgYWJvdXQgdGhlIGxhbmd1YWdlIG9mIGEgc291cmNlIGZpbGUKKwl2ZXJzdXMgdGhlIHdvcmtpbmcgbGFuZ3VhZ2UuICBUaGUgb2xkIGRvY3VtZW50YXRpb24gZGlkIG5vdCBtYXRjaAorCXdoYXQgR0RCIGRpZC4KKworV2VkIEZlYiAgMSAyMDoyNjozNiAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoU291cmNlIEZpbGVzKTogRG9jdW1lbnQgTl9TTyB1c2VkIHRvIG1hcmsgdGhlIGVuZAorCW9mIGEgc291cmNlIGZpbGUuCisKK01vbiBKYW4gMjMgMTQ6MjM6MzcgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50ZXhpbmZvIChQcm9jZXNzZXMpOiBOZXcgbm9kZS4KKworVHVlIEphbiAxNyAxNDowOTowMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+CisKKwkqIHJlbW90ZS50ZXhpOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBvZiBzZXQvc2hvdyBtaXBzZnB1LgorCisKK1N1biBTZXAgIDQgMTY6NDc6MjEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBnZGJpbnQudGV4aW5mbzogUmVtb3ZlZCBtZW50aW9ucyBvZiBzb21lIGluY29ycmVjdGx5IHBsYWNlZCBhbmQKKwlvYnNvbGV0ZSBjb25kaXRpb25hbHMsIGRlc2NyaWJlZCBzb21lIG90aGVycy4KKworTW9uIEF1ZyAgMSAxNTo0MjozOSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiaW50LnRleGluZm86IFJlbW92ZSByZWZlcmVuY2VzIHRvIEJST0tFTl9MQVJHRV9BTExPQ0EgYW5kCisJU0VUX1NUQUNLX0xJTUlUX0hVR0U7IHRoZXkgd2VyZSByZW1vdmVkIGZyb20gR0RCIDE0IE1heSAxOTk0LgorCitNb24gQXVnICAxIDE1OjEyOjAyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogZ2RiaW50LnRleGluZm86IFB1dCByZWdleCBjb25kaXRpb25hbHMgaW4gdGhlaXIgb3duIHRhYmxlLgorCitUdWUgSnVsIDI2IDE4OjMyOjUyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogZ2RiaW50LnRleGluZm86IFJlbW92ZWQgbWVudGlvbnMgb2YgbWFueSBvYnNvbGV0ZSBjb25kaXRpb25hbHMsCisJZGVzY3JpYmVkIG9yIGZpeGVkIHRoZSBkZXNjcmlwdGlvbnMgb2YgbWFueSBvdGhlcnMuCisKK1N1biBKdWwgMTcgMTQ6MTQ6MDMgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbzogQWRkIHNvbWUgbW9yZSBjcmVkaXRzLgorCSogZ2RiaW50LnRleGluZm86IENhcGl0YWxpemUgR0RCIGNvbnNpc3RlbnRseSwgZGVzY3JpYmUgc29tZQorCW1hY3JvcyBhbmQgcmVtb3ZlIHNvbWUuCisKK1RodSBKdWwgMTQgMTg6NDM6MTcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBnZGJpbnQudGV4aW5mbzogUmVtb3ZlZCBtZW50aW9ucyBvZiBtYW55IGluY29ycmVjdGx5IHBsYWNlZCBhbmQKKwlvYnNvbGV0ZSBjb25kaXRpb25hbHMsIGRlc2NyaWJlZCBzb21lIG90aGVycy4KKworVHVlIEp1bCAxMiAxMjoyMzoxNSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi50ZXhpbmZvIChoZWxwIHRhcmdldHMpOiAgQ2hhbmdlZCB0byBgaGVscCB0YXJnZXQnLCB3aGljaAorCWlzIHRoZSBjb3JyZWN0IGdkYiBjb21tYW5kLgorCitXZWQgSnVuIDIyIDE4OjAwOjUxIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBhbm5vdGF0ZS50ZXhpIChUT0RPKTogTmV3IG5vZGUsIGZvciBrZWVwaW5nIHRyYWNrIG9mIGFubm90YXRpb25zCisJc3VnZ2VzdGVkIGJ1dCBub3QgeWV0IGltcGxlbWVudGVkLgorCitXZWQgSnVuICAxIDE2OjEwOjQ1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvIChTdGF0aWNzKTogVmFsdWUgb2YgeGNvZmYgQ19CU1RBVCBwb2ludHMgdG8KKwlhbm90aGVyIHN5bWJvbCwgaXQgaXMgbm90IHRoZSBhZGRyZXNzIGl0c2VsZi4KKworVGh1IE1heSAgNSAyMDoyMzozNiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm8gKFN0YWIgU2VjdGlvbiBCYXNpY3MpOiBBZGQgY29tbWVudCBhYm91dCBhbGlnbm1lbnQKKwlvZiBzdGFicy1pbi1jb2ZmIHNlY3Rpb25zLgorCitXZWQgTWF5ICA0IDA2OjI2OjExIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBhbm5vdGF0ZS50ZXhpOiBDaGFuZ2UgZWRpdGlvbiB0byAwLjUgYW5kIGRhdGUgdG8gTWF5IDE5OTQuCisJQWRkIGluZGV4LgorCShGcmFtZXMpOiBOZXcgbm9kZSwgZm9yIGZyYW1lIGFubm90YXRpb24uCisJKERpc3BsYXlzKTogTmV3IG5vZGUsIGZvciBkaXNwbGF5IGFubm90YXRpb24uCisKKwkqIHJlbW90ZS50ZXhpIChNSVBTIFJlbW90ZSk6IFNheSB0aGF0IHNldCB0aW1lb3V0IGRvZXNuJ3QgYXBwbHkKKwl3aGVuIHdhaXRpbmcgZm9yIHlvdXIgcHJvZ3JhbSB0byBzdG9wLgorCitGcmkgQXByIDI5IDE4OjI0OjQ2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBhbm5vdGF0ZS50ZXhpIChCcmVha3BvaW50IEluZm8pOiBEb2N1bWVudCBhbm5vdGF0aW9uIG9mIGhlYWRlcgorCWZpZWxkcyBhbmQgcmVjb3JkIGFubm90YXRpb24uCisKK1RodSBBcHIgMjggMDc6NDQ6MjggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGFubm90YXRlLnRleGk6IE5ldyBmaWxlLCB0byBkb2N1bWVudCBhbm5vdGF0aW9ucy4KKworVGh1IEFwciAyMSAxNDoyMDo1MSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogRG9uJ3QgcmVtb3ZlIEdEQnZuLnRleGkgKGFwcGFyZW50bHkgb24gSmFuCisJMTYgSSBtZWFudCB0byBtYWtlIHRoaXMgY2hhbmdlIGJ1dCBkaWQgbm90KS4gIERvIHJlbW92ZSBnZGItY2ZnLnRleGkuCisKK1dlZCBBcHIgMjAgMTE6MjI6NDggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm8gKFN0YWIgU2VjdGlvbiBCYXNpY3MpOiBTYXkgd2hhdCBpcyBpbiAuc3RhYgorCXNlY3Rpb24sIGFuZCBzYXkgbl9zdHJ4IGZpZWxkIGlzIGNvbXBpbGF0aW9uIHVuaXQgcmVsYXRpdmUuCisJKiBzdGFicy50ZXhpbmZvOiBEb24ndCB1c2UgQGNvZGUgZm9yIGEub3V0IHdoZW4gaXQgaXMgdGhlIG5hbWUgb2YKKwlhbiBvYmplY3QgZmlsZSBmb3JtYXQuCisKK1dlZCBBcHIgMTMgMjA6Mjk6NTQgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGdkYi50ZXhpbmZvOiBSZWZlciB0byBmaWxlIG5hbWVzLCBub3QgcGF0aCBuYW1lcywgcGVyIHJtcworCWNvbnZlbnRpb24uCisJKEFyZ3VtZW50cyk6IEZpeCB0eXBvLgorCitUaHUgTWFyIDI0IDA4OjA5OjEyIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvIChHbG9iYWwgVmFyaWFibGVzKTogVGFsayBhYm91dCBzdGFicyBpbiBmaWxlcworCXdoZXJlIHZhcmlhYmxlcyBhcmUgcmVmZXJlbmNlZCwgYnV0IG5vdCBkZWZpbmVkLgorCitXZWQgTWFyIDIzIDA3OjE2OjM2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvOiBNb3ZlIHN0dWZmIG9uIEAgYW5kICMgdHlwZSBkZXNjcmlwdG9ycyBmcm9tIG5vZGUKKwlDcGx1c3BsdXMgdG8gbmV3IG5vZGVzIE1lbWJlciBUeXBlIERlc2NyaXB0b3IgYW5kIE1ldGhvZCBUeXBlCisJRGVzY3JpcHRvci4gIFJlLXdyaXRlIHN0dWZmIGZvciAjLgorCitXZWQgTWFyIDE2IDA4OjIwOjE5IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbyAoUHJpbnQgU2V0dGluZ3MpOiBEb24ndCBkb2N1bWVudCAic2V0IHByaW50CisJZmFzdC1zeW1ib2xpYy1hZGRyIG9mZiIuICBUaGUgYnVnIHdoaWNoIGl0IHdvcmtlZCBhcm91bmQgd2FzIGZpeGVkCisJb24gMjUgRmViIDk0IGluIGNvZmZyZWFkLmMsIHNvIEknbSBudWtpbmcgdGhlIGNvbW1hbmQuCisKKwkqIHN0YWJzLnRleGluZm8gKEFsdGVybmF0ZSBFbnRyeSBQb2ludHMpOiBOZXcgbm9kZSwgcmV3cml0dGVuIGZyb20KKwlOX0VOVFJZIG5vZGUuCisKKwkqIHN0YWJzLnRleGluZm8gKFR5cGUgRGVzY3JpcHRvcnMpOiBBZGQgJ1knIHR5cGUgZGVzY3JpcHRvci4KKworVHVlIE1hciAxNSAwODo0MzowMiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiaW50LnRleGluZm8gKEhvc3QgQ29uZGl0aW9uYWxzLCBUYXJnZXQgQ29uZGl0aW9uYWxzKTogUmVtb3ZlCisJcmVmZXJlbmNlcyB0byBpZWVlLWZsb2F0LmMuCisKK0ZyaSBNYXIgMTEgMDg6MDk6NDAgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50ZXhpbmZvIChTZXQgQnJlYWtzKTogVXBkYXRlIGRvY3VtZW50YXRpb24gZm9yIHRicmVhayB0bworCW1hdGNoIHdoYXQgdGhlIGNvZGUgYWN0dWFsbHkgZG9lcy4KKworV2VkIE1hciAgOSAxOTo0MzowNSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoU3ltYm9sIERlc2NyaXB0b3JzKTogQWRkIE9TOTAwMCBzeW1ib2wgZGVzY3JpcHRvciBzLgorCitUdWUgTWFyICAxIDE3OjA0OjQzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvIChUeXBlIERlc2NyaXB0b3JzKTogQWRkIE9TOTAwMCB0eXBlIGRlc2NyaXB0b3JzIGMsCisJaSwgYW5kIGIuCisKK1dlZCBGZWIgMjMgMTA6NDQ6MTggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvOiBEb2N1bWVudCBOX1JCUkFDIGFzIGZ1bmN0aW9uIHJlbGF0aXZlIGZvciBDT0ZGIGFzCisJd2VsbCBhcyBmb3IgRUxGIGFuZCBTT00uICBVbmlmeSB0aGUgZGVzY3JpcHRpb25zIG9mIEVMRiBhbmQgU09NCisJYXMgInN0YWJzIGluIHNlY3Rpb25zIiByYXRoZXIgdGhhbiBqdXN0IHNheWluZyAiRUxGIGFuZCBTT00iLgorCUFsc28gbWFrZSB0aGF0IHN0dWZmIGFwcGx5IHRvIENPRkYuCisKK0ZyaSBGZWIgMTggMDg6MjU6NTggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50ZXhpbmZvIChGb3JtYXR0aW5nIERvY3VtZW50YXRpb24pOiBDaGFuZ2UgR2hvc3RTY3JpcHQgdG8KKwlHaG9zdHNjcmlwdC4KKworRnJpIEZlYiAgNCAwNjozMTozMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnRleGluZm8gKENvbnRpbnVpbmcgYW5kIFN0ZXBwaW5nKTogV2hlbiB0YWxraW5nIGFib3V0ICJzdGVwIgorCXZlcnN1cyBmdW5jdGlvbnMgd2l0aG91dCBsaW5lIG51bWJlcnMsIGFsc28gbWVudGlvbiBzdGVwcGluZyBpbnRvCisJdGhlbSBhcyB3ZWxsIGFzICJzdGVwIiB3aGVuIHlvdSBhcmUgaW4gdGhlbS4gIFRlbGwgdGhlIHVzZXIgaG93IHRvCisJZGVhbCB3aXRoIHRoZSBzaXR1YXRpb24uICBBZGQgY29tbWVudCBhYm91dCAiZGVidWdnaW5nIGluZm9ybWF0aW9uIi4KKworVGh1IEZlYiAgMyAxMTozOTo1OSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoRW51bWVyYXRpb25zKTogRG9jdW1lbnQgcmVzdHJpY3Rpb24gb24gd2hlcmUKKwllbnVtZXJhdGlvbiB0eXBlcyBjYW4gYXBwZWFyIGFuZCBzdGlsbCB3aW4gd2l0aCBHREIuCisKK1dlZCBGZWIgIDIgMTE6Mjk6MTcgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm8gKE5lZ2F0aXZlIFR5cGUgTnVtYmVycyk6IERvY3VtZW50IGZvcm1hdCBmb3IgdHlwZQorCS0xNi4KKworVGh1IEphbiAyNyAxNjo1Mzo1NiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnRleGluZm8gKFNlbGVjdGlvbiwgRnJhbWUgSW5mbyk6IFVwZGF0ZSBpbmZvcm1hdGlvbiBhYm91dAorCWFyYml0cmFyeSBmcmFtZSBzcGVjZmljaWF0aW9ucy4KKworV2VkIEphbiAyNiAxNTozMTo1NyAxOTk0ICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbywgcmVtb3RlLnRleGk6IGdlbmVyYWwgZWRpdGluZyBwYXNzIHByaW9yIHRvIE5ldCByZWxlYXNlCisKK1R1ZSBKYW4gMjUgMTI6MTI6MDQgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm8gKFN0cmluZyBGaWVsZCk6IERpc2N1c3MgY29udGludWluZyBzdGFicyB3aXRoID8uCisKK1dlZCBKYW4gMTkgMDY6Mzk6MjQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvIChOb24tU3RhYiBTeW1ib2wgVHlwZXMpOiBNZW50aW9uIE5fU0VUKiB8IE5fRVhULgorCitTdW4gSmFuIDE2IDEyOjQzOjMyIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvOiBSZS1kbyBzdHVmZiBhYm91dCBDX0JTVEFUIGFuZCBtb3ZlIGZyb20gWENPRkYKKwlEaWZmZXJlbmNlcyBub2RlIHRvIFN0YXRpY3Mgbm9kZS4KKwkoU3RhdGljcyk6IERpc2N1c3MgWENPRkYgdXNlIG9mIFYgc3ltYm9sIGRlc2NyaXB0b3IuCisKKwkqIE1ha2VmaWxlLmluOiBSZW1vdmUgcmVmY2FyZC5kdmkgYW5kIEdEQnZuLnRleGkgaW4gcmVhbGNsZWFuLAorCW5vdCBjbGVhbi4KKworV2VkIEphbiAxMiAyMToyOTo1NCAxOTk0ICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogZ2RiLnRleGluZm8gKFByaW50IFNldHRpbmdzKTogRG9jdW1lbnQgYHNldCBwcmludAorCWZhc3Qtc3ltYm9saWMtYWRkcicgYW5kIGltcHJvdmUgdGhlIGRvYyBmb3Igc29tZSBvdGhlcgorCWBzZXQgcHJpbnQncy4KKworTW9uIEphbiAgMyAxNzoyMzowNyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoU3RyaW5nIEZpZWxkKTogVGFsayBhYm91dCBkZWZpbmluZyBzZXZlcmFsIHR5cGUKKwludW1iZXJzIGF0IG9uY2UuCisJRml4IGxpbnQgcmVnYXJkaW5nIGNoYW5naW5nIG5vZGUgRUxGIFRyYW5zZm9ybWF0aW9ucyB0bworCUVMRiBhbmQgU09NIFRyYW5zZm9ybWF0aW9ucy4KKworRnJpIERlYyAzMSAwMDo0Mjo0MyAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbzogIEluc2VydCBQZXRlciBLZXNzbGVyJ3MgbmFtZSBhcyBpbnZlbnRvciAoSSB0aGluaykuCisKK1R1ZSBEZWMgMjggMDk6MzA6NDAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm8gKENyb3NzLVJlZmVyZW5jZXMpOiBgOjonIGlzIGZvciBuZXN0ZWQgdHlwZXMgb25seQorCXdpdGhpbiA8Pi4KKwkoU3RydWN0dXJlcyk6IERvY3VtZW50IHN0YXRpYyBtZW1iZXJzLgorCitNb24gRGVjIDI3IDEzOjU1OjA0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvOiBEb2N1bWVudCBTIHR5cGUgYXR0cmlidXRlLgorCitTdW4gRGVjIDI2IDIwOjQ2OjM2IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBzdGFicy50ZXhpbmZvOiBBZGQgbm90ZXMgYWJvdXQgc3RhYnMtaW4tc29tIHdoZXJlIGFwcHJvcHJpYXRlLgorCitGcmkgRGVjICAzIDE5OjEzOjE5IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBnZGJpbnQudGV4aW5mbzogIEZpeCBhIGZldyB0eXBvcy4KKworU3VuIE5vdiAyOCAxODowNjoyNSAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbywgcmVtb3RlLnRleGk6IGZvcm1hdHRpbmcgaW1wcm92ZW1lbnRzCisKKwkqIGdkYi50ZXhpbmZvIChOZXcgRmVhdHVyZXMpOiBtZW50aW9uIHRocmVhZHMuCisJKFN1bW1hcnksIEMpOiBmaXggeHJlZnMgaW4gbmV3bHkgY29udHJpYnV0ZWQgdGV4dC4KKwkoVGhyZWFkcyk6IGluZGV4IGVudHJpZXMsIGNsYXJpZmljYXRpb25zLCBleGFtcGxlCisJKHBhc3NpbSk6IG1pbm9yIHR5cG9zIGZpeGVkLCBwaHJhc2luZyBpbXByb3ZlbWVudHMKKworCSogcmVtb3RlLnRleGkgKEJvb3RzdHJhcHBpbmcpOiByZXBocmFzZSB0ZXh0IG9uIF5DIGFuZCBhZGQgaW5kZXgKKwllbnRyaWVzOyAoU2VydmVyKTogZXhwbGFpbiB1c2Ugb2YgZ2Ric2VydmVyIHcvcmVhbC10aW1lIHN5c3RlbXMsCisJYWRkIGV4YW1wbGUgb2YgY29uZmxpY3RpbmcgVENQIHBvcnQ7IChNSVBTIFJlbW90ZSkgYnJlYWsgdXAKKwlydW5uaW5nIHRleHQgaW50byB0YWJsZSwgaGlnaGxpZ2h0aW5nIGNvbW1hbmRzLCBhbmQgYWRkIGV4YW1wbGUuCisJCitXZWQgTm92IDI0IDE0OjE1OjU2IDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIHJlZmNhcmQudGV4OiBhdm9pZCBiYWQgbGluZWJyZWFrcyBldmVuIHdoZW4gUkVGRURJVFM9cHNyYy5zZWQKKworRnJpIE5vdiAxMiAxNjoxMDo1OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoTmVzdGVkIFN5bWJvbHMpOiBOZXcgbm9kZS4KKwkoU3RyaW5nIEZpZWxkLCBTeW1ib2wgRGVzY3JpcHRvcnMsIENyb3NzLVJlZmVyZW5jZXMpOiBSZWZlciB0byBpdC4KKworVGh1IE5vdiAxMSAxMzoyNjo0NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoU3RhYnMgaW4gRUxGKTogQ2xhcmlmeSBob3cgQmJzcy5ic3Mgd29yayB3aXRoIHJlc3BlY3QKKwl0byBwaWNraW5nIHdoaWNoIEJic3MuYnNzIHN5bWJvbCB0byB1c2UsIGFuZCAoYmVjYXVzZSB0aGVyZSBzZWVtcyB0bworCWJlIG5vIGdvb2Qgd2F5IG9mIGRvaW5nIGl0KSByZS13cml0ZSBzb21lIG9mIHRoZSB0ZXh0IHRvIG1ha2UgaXQKKwlzb3VuZCBsaWtlIEJic3MuYnNzIGlzbid0IHN1Y2ggYSBncmVhdCBpZGVhIGFmdGVyIGFsbCAoYXMgY3VycmVudGx5CisJZGVzaWduZWQpLgorCisJKiBnZGIudGV4aW5mbyAoQyk6IEluIGFkZGl0aW9uIHRvIHNheWluZyBwZW9wbGUgaGF2ZSB0byB1c2UgZysrIGZvcgorCWdvb2QgcmVzdWx0cywgc2F5IHRoZXkgaGF2ZSB0byB1c2Ugc3RhYnMuICBTcGVjaWZpY2FsbHkgc2F5IGNmcm9udAorCWRvZXNuJ3Qgd29yayB3ZWxsLgorCShTdW1tYXJ5KTogTWVyZ2UgaW4gaW5mb3JtYXRpb24gb24gTW9kdWxhLTIsIFBhc2NhbCwgYW5kIENoaWxsIGZyb20KKwl0aGUgZ2RiIFJFQURNRS4gIEFkZCB4cmVmcyB0byBwbGFjZXMgd2hlcmUgdGhlIHN1cHBvcnQgZm9yIHRoZSB2YXJpb3VzCisJbGFuZ3VhZ2VzIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwuCisKK01vbiBOb3YgIDggMTE6NDc6MzQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm86IENsZWFuIHVwIHN0dWZmIGFib3V0IHZpc2liaWxpdHkgYW5kIHZpcnR1YWwKKwljaGFyYWN0ZXJzLgorCisJKiBzdGFicy50ZXhpbmZvIChOX00yQyk6IENpdGUgU3VuIGRvYy4KKworRnJpIE5vdiAgNSAxNjoyNzoyNyAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbzogdXBkYXRlcyByZSB0aHJlYWRzLgorCSogcmVtb3RlLnRleGluZm86IGF2b2lkIGluZGV4IGVudHJpZXMgc3RhcnRpbmcgd2l0aCBkaWdpdHMuCisKK1R1ZSBOb3YgIDIgMDk6MDg6MzcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm8gKEVudW1lcmF0aW9ucyk6IFRhbGsgYWJvdXQgbGFyZ2UsIG5lZ2F0aXZlIGFuZAorCW9jdGFsIHZhbHVlcy4gIENsZWFuIHVwIGNyb3NzIHJlZmVyZW5jZSB0byB0eXBlIGF0dHJpYnV0ZXMuCisJKFN0cmluZyBGaWVsZCk6IFNheSB0aGF0IEdEQiA0LjExIHN1cHBvcnRzIHNpemUgYXR0cmlidXRlLgorCitTdW4gT2N0IDMxIDEzOjMxOjEwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiByZW1vdGUudGV4aSAoVnhXb3JrcyBSZW1vdGUpOiBDbGFyaWZ5IHRoYXQgcmVidWlsZGluZyBWeFdvcmtzIGtlcm5lbAorCWlzIGEgbWFuZGF0b3J5IHN0ZXAuICBNYWtlIHRoZSBzdHVmZiBhYm91dCB0aGF0IG1vcmUgY29uY2lzZS4KKworV2VkIE9jdCAyNyAwMDoyNTo0NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoQ2xhc3MgTmFtZXMpOiBOZXcgbm9kZS4KKworCSogZ2RiLnRleGluZm8gKENvbW1hbmQgRmlsZXMpOiBFeHBsYWluIG9yZGVyIG9mIGluaXQgZmlsZSByZWFkaW5nLgorCisJKiByZW1vdGUudGV4aSAoQm9vdHN0cmFwcGluZyk6IFRhbGsgYWJvdXQgZ2V0dGluZyB0aGUgc2VyaWFsIGRyaXZlcgorCXRvIGRlYWwgd2l0aCBeQyBzZW50IGJ5IGdkYiB0byBzdG9wIHRoZSByZW1vdGUgc3lzdGVtLgorCitNb24gT2N0IDI1IDAzOjI1OjQxIDE5OTMgIFRvbSBMb3JkICAobG9yZEBjeWdudXMuY29tKQorCisJKiBsaWJnZGIudGV4aW5mbyAoSS9PKTogaW5jb3Jwb3JhdGVkIGJldHRlciBwaHJhc2luZyBmcm9tIHJpY2guCisKKwkqIGxpYmdkYi50ZXhpbmZvIChEZWZpbmluZyBDb21tYW5kcyk6IG1hZGUgdGhlIERPQyBhcmcKKwl0byBnZGJfZGVmaW5lX2FwcF9jb21tYW5kIGEgY2hhciAqIGluc3RlYWQgb2YgY2hhciAqKgorCXBlciBhIHN1Z2dlc3Rpb24gZnJvbSBraW5nZG9uLgorCisJKiBsaWJnZGIudGV4aW5mbzogdG90YWwgcmV3cml0ZSBmcm9tIGEgZGlmZmVyZW50IHN0YXJ0aW5nCisJcHJlbWlzZS4KKworV2VkIE9jdCAyMCAxODowNzo0NCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoTG9jYWwgVmFyaWFibGUgUGFyYW1ldGVycyk6IFJlLXdyaXRlIHBhcmFncmFwaCBvbgorCWZsb2F0cyBwYXNzZWQgYXMgZG91YmxlcyAodG8gaW1wcm92ZSBjbGFyaXR5KS4KKworVHVlIE9jdCAxOSAxNDoyMToxOCAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbyAoU291cmNlIFBhdGgpOiBpbmRleCBlbnRyaWVzIGZvciAkY3dkLCAkcGRpcgorCisJKiBhNHJjLnNlZDogdXBkYXRlIHRvIHdvcmsgd2l0aCBBbmRyZWFzIFZvZ2VsIHBhcGVyc2l6ZSBwYXJhbXMKKworCSogcmVmY2FyZC50ZXg6IHVzZSBBbmRyZWFzIFZvZ2VsIHNpbXBsaWZpY2F0aW9ucyBvZiBwYXBlcnNpemUKKwlwYXJhbXM7IHJlbW92ZSB1c2VsZXNzIHZlcnNpb24gaW5mbzsgdXBkYXRlIGNvcHlyaWdodCBkYXRlLgorCitUdWUgT2N0IDE5IDEwOjQ2OjIyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbyAoU3ltYm9scyk6IEFkZCBjbGFzcyBOQU1FIHRvIGRvYyBmb3IgcHR5cGUuCisKK1R1ZSBPY3QgMTIgMDk6MTE6NDUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50ZXhpbmZvIChGaWxlcyk6IFNheSB3aGF0IGFkZHJlc3MgdGhlIGxvYWQgY29tbWFuZCBsb2FkcyBpdCBhdC4KKworCSogc3RhYnMudGV4aW5mbyAoQ29tbW9uIEJsb2Nrcyk6IE1pbm9yIGNsZWFudXBzLgorCisJKiBzdGFicy50ZXhpbmZvOiBVcGRhdGUgbGQgc3RhYnMgaW4gZWxmIHJlbG9jYXRpb24gdG8gcmVmbGVjdCB0aGUgZmFjdAorCXRoYXQgU3VuIGhhcyBiYWNrZWQgYXdheSBmcm9tIHRoZSBsaW5rZXIga2x1ZGdlIGFuZCB0aHVzIHRoZSByZWxldmFudAorCWlzc3VlIGlzIGNoYW5nZXMgdG8gdGhlIFN1blBSTyB0b29scywgbm90IHRoZSBTb2xhcmlzIGxpbmtlci4KKworCSogc3RhYnMudGV4aW5mbyAoVHJhZGl0aW9uYWwgSW50ZWdlciBUeXBlcyk6IENsZWFuIHVwIGRlc2NyaXB0aW9uCisJb2Ygb2N0YWwgYm91bmRzIGEgbGl0dGxlIGJpdC4gIERvY3VtZW50IGV4dHJhIGxlYWRpbmcgemVyb2VzLgorCitUaHUgT2N0ICA3IDE2OjE1OjM3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbyAoU2lnbmFsaW5nKTogVXBkYXRlIGZvciBzeW1ib2xpYyBzeW1ib2wgbmFtZXMKKwlhbmQgYWRkIGEgc2VjdGlvbiBleHBsYWluaW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIEdEQgorCXNpZ25hbCBjb21tYW5kIGFuZCB0aGUgc2hlbGwga2lsbCB1dGlsaXR5LgorCitXZWQgT2N0ICA2IDEzOjIzOjAxIDE5OTMgIFRvbSBMb3JkICAobG9yZEBydGwuY3lnbnVzLmNvbSkKKworCSogbGliZ2RiLnRleGluZm86IGFkZGVkIGBAJyB0byBicmFjZXMgdGhhdCB3ZXJlIHVuZXNjYXBlZC4KKworTW9uIE9jdCAgNCAxMDo0MjoxOCAxOTkzICBUb20gTG9yZCAgKGxvcmRAcnRsLmN5Z251cy5jb20pCisKKwkqIGxpYmdkYi50ZXhpbmZvOiBuZXcgZmlsZS4gIFNwZWMgZm9yIHRoZSBnZGIgbGlicmFyeS4KKworU3VuIE9jdCAgMyAxNToyNjo1NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoSW5jbHVkZSBGaWxlcyk6IEZpeCB0eXBvIChzdGFydCAtPiBlbmQpLgorCitUaHUgU2VwIDMwIDE4OjI0OjU2IDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIGdkYi50ZXhpbmZvLCByZW1vdGUudGV4aTogYXNzb3J0ZWQgc21hbGwgaW1wcm92ZW1lbnRzLCBtb3N0bHkKKwlmcm9tIE1lbGlzc2EgYXQgRlNGJ3MgZWRpdGluZyBwYXNzLgorCitUaHUgU2VwIDMwIDExOjU0OjM4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbzogUmVtb3ZlIHN0dWZmIGFib3V0IGFyIGFuZCAxNCBjaGFyYWN0ZXIgZmlsZW5hbWVzLgorCUkgYmVsaWV2ZSB0aGlzIHdhcyBmaXhlZCBieSB0aGUgMTMgU2VwIDg5IGNoYW5nZSB0byBwcmludF9mcmFtZV9pbmZvLgorCUFsc28sIG1vZGVybiB2ZXJzaW9ucyBvZiBhciBsaWtlIEJTRCA0LjQgb3IgU1ZSNCBkb24ndCBoYXZlIHRoaXMgYnVnLgorCitXZWQgU2VwIDIyIDIxOjIyOjExIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiByZW1vdGUudGV4aSAoQm9vdHN0cmFwcGluZyk6IERpc2N1c3MgMzg2IGNhbGwgZ2F0ZXMuCisKK1NhdCBTZXAgMTggMTc6MTA6NDQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm8gKEJhc2VkIFZhcmlhYmxlcyk6IE5ldyBub2RlLgorCitUaHUgU2VwIDE2IDE3OjQ4OjU1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoTmVnYXRpdmUgVHlwZSBOdW1iZXJzKTogUmUtd3JpdGUgZGlzY3Vzc2lvbnMgb2YKKwluYW1lcywgc2l6ZXMsIGFuZCBmb3JtYXRzIHRvIHN1Z2dlc3QgaG93IG5vdCB0byBsb3NlLgorCitTYXQgU2VwIDExIDA5OjM1OjExIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBwb3NlaWRvbi5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvIChNZXRob2RzKTogRml4IHR5cG8uCisKK0ZyaSBTZXAgMTAgMDY6MzQ6MjAgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbzogRml4IGEgZmV3IHR5cG9zLgorCitXZWQgU2VwICA4IDA5OjExOjUyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbzogQ2xhcmlmeSBob3cgd2VsbCBpdCB3b3JrcyB3aXRoIEZvcnRyYW4uCisKKwkqIHN0YWJzLnRleGluZm8gKFN0YWJzIEluIEVMRiwgU3RhdGljcywgRUxGIFRyYW5zZm9ybWF0aW9ucyk6CisJTW9yZSBvbiByZWxvY2F0aW5nIHN0YWJzIGluIEVMRiBmaWxlcy4KKworVHVlIFNlcCAgNyAxMzo0NTowMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoU3RhYnMgSW4gRUxGKTogVGFsayBhYm91dCBOX0ZVTiB2YWx1ZS4KKworTW9uIFNlcCAgNiAxOToyMzoxOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoTG9jYWwgVmFyaWFibGUgUGFyYW1ldGVycyk6IFRhbGsgYWJvdXQgbmFtZWxlc3MKKwlwYXJhbWV0ZXJzIG9uIFZBWC4KKworRnJpIFNlcCAgMyAxNzowNjowOCAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbzogQHVwL0Bkb3duIC0+IEByYWlzZXNlY3Rpb25zL0Bsb3dlcnNlY3Rpb25zCisKK0ZyaSBTZXAgIDMgMTI6MDQ6MTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm86IE1ha2UgaW5mbyBhdXRob3Igbm90aWNlIG1hdGNoIHRoZSBUZVggYXV0aG9yIG5vdGljZS4KKworVHVlIEF1ZyAzMSAxMzoyMTowNiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm86IEluaXRpYWwtY2FwcyBhbGwgd29yZHMgaW4gbm9kZSBuYW1lcyBhbmQKKwlub24tdHJpdmlhbCB3b3JkcyBpbiBzZWN0aW9uIG5hbWVzLgorCitNb24gQXVnIDMwIDExOjEzOjE2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvOiBNYW55IG1pbm9yIGNsZWFudXBzLgorCisJKiBzdGFicy50ZXhpbmZvOiBSZW1vdmUgQGRlZmZuIGV4Y2VwdCBmcm9tIEV4cGFuZGVkIFJlZmVyZW5jZSBub2RlLgorCitTYXQgQXVnIDI4IDEyOjA4OjA5IDE5OTMgIERhdmlkIEouIE1hY0tlbnppZSAgKGRqbUBlZGlzb24uZW5nLnVtZC5lZHUpCisKKwkqIHN0YWJzLnRleGluZm86IFJlbW92ZSBmdWxsIGRlc2NyaXB0aW9uIG9mIGJpZyBleGFtcGxlLgorCUl0J3Mgbm90IHJlYWxseSBoZWxwZnVsOyBqdXN0IHVzZSBwaWVjZXMgb2YgaXQgd2hlcmUgYXBwcm9wcmlhdGUuCisJQWRkIG1vcmUgVGV4aW5mbyBmb3JtYXR0aW5nIGRpcmVjdGl2ZXMgKEBzYW1wLCBldGMuKS4KKwlVc2UgQGRlZmZuIHRvIGRlZmluZSBzdGFiIHR5cGVzLgorCUVsaW1pbmF0ZSBzb21lIHdvcmRpbmVzcy4gIEJyZWFrIHVwIHNvbWUgbm9kZXMuCisJQWRkIGFuIChhbHBoYWJldGl6ZWQpIGluZGV4IG9mIHN5bWJvbCB0eXBlcy4KKwlVc2UgY29uc2lzdGVudCBjYXBpdGFsaXphdGlvbiBzdHlsZSBpbiBub2RlIGFuZCBzZWN0aW9uIG5hbWVzLgorCitUaHUgQXVnIDI2IDA2OjM2OjMxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbzogIENoYW5nZSB0eXBvICJUd28gdHdvIiB0byAiVGhlIHR3byIuCisKK1N1biBBdWcgMjIgMTI6MTU6MTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm8gKFhDT0ZGLWRpZmZlcmVuY2VzKTogUmVtb3ZlIHJlZmVyZW5jZXMgdG8KKwlub24tZXhpc3RlbnQgdHlwZXMgTl9ERUNMIGFuZCBOX1JQU1lNLgorCisJKiBzdGFicy50ZXhpbmZvIChTdHJpbmcgRmllbGQpOiBTYXkgdGhhdCB0eXBlIGF0dHJpYnV0ZXMgYnVnIGlzCisJZml4ZWQgaW4gR0RCIDQuMTAsIHNpbmNlIGl0IGlzLgorCisJKiBzdGFicy50ZXhpbmZvOiBDbGVhbiB1cCBkam0gY2xlYW51cHMsIGFuZCBtb3JlIGNsZWFudXBzIG9mIG15IG93bi4KKworU2F0IEF1ZyAyMSAwNDozMjoyOCAxOTkzICBEYXZpZCBNYWNLZW56aWUgIChkam1AY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbzogRm9ybWF0dGluZyBjbGVhbnVwcy4KKworRnJpIEF1ZyAyMCAyMDo0OTo1MyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbzogV2hlbiBleHBsYWluaW5nIHRoZSBuX3R5cGUgb2YgYSBzdGFiLCBzdGFuZGFyZGl6ZQorCWhvdyB3ZSBkbyBpdCAoJyMnIGFzIGEgY29tbWVudCBpbmRpY2F0b3IsICIzNiBpcyBOX0ZVTiIgYXMgdGV4dCwKKwlubyB0YWJzLCB1c2UgQHIpLgorCShHbG9iYWwgVmFyaWFibGVzKTogQ2xlYW4gdXAuCisKK1R1ZSBBdWcgMTcgMTU6NTc6MjcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm8gKFN0YWNrIFZhcmlhYmxlcyk6IFJlLXdyaXRlLgorCitNb24gQXVnIDE2IDIxOjIwOjA4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvIChTdGFicy1pbi1lbGYpOiBUYWxrIGFib3V0IGdldHRpbmcgdGhlIHN0YXJ0CisJYWRkcmVzc2VzIG9mIGEgc291cmNlIGZpbGUuICBBbHNvIHJldmlzZSBmb3JtYXR0aW5nLgorCUNoYW5nZSAib2JqZWN0IG1vZHVsZSIgb3IgIm9iamVjdCBmaWxlIiB0byAic291cmNlIGZpbGUiLgorCVZhcmlvdXM6IE1pc2NlbGxhbmVvdXMgY2xlYW51cHMuCisKK1RodSBBdWcgMTIgMTU6MTE6NTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm86IFBvaW50IHRvIG1hbmdsaW5nIGluZm8gaW4gZ2NjJ3MgZ3Bjb21wYXJlLnRleGkuCisKK1R1ZSBBdWcgMTAgMTY6NTc6NDkgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQorCisJKiBnZGJpbnQudGV4aW5mbzogUmVtb3ZlZCBtYW55IG5vbnNlbnNpY2FsIG1hY2hpbmUtY29sbGVjdGVkCisJaG9zdCBhbmQgdGFyZ2V0IGNvbmRpdGlvbmFscywgZGVzY3JpYmVkIHNvbWUgb2YgdGhlIHJlbWFpbmRlci4KKworVHVlIEF1ZyAxMCAxMzoyODozMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiaW50LnRleGluZm8gKEdldHRpbmcgU3RhcnRlZCk6IFVzZSBAaXRlbWl6ZSwgbm90IEB0YWJsZS4KKworCSogZ2RiaW50LnRleGluZm8gKFRvcCk6IEFkZCBuYW1lIHRvIEB0b3AgbGluZSwgYW5kIHJlLXdyaXRlIHRoZQorCXBhcmFncmFwaCB3aGljaCBmb2xsb3dzLgorCisJKiBnZGJpbnQudGV4aW5mbyAoSG9zdCk6IFVzZSBAY29kZSBub3QgQHNhbXAgZm9yIE1ha2VmaWxlCisJdmFyaWFibGVzLiAgTG9va3MgYmV0dGVyIGFuZCBhdm9pZHMgb3ZlcmZ1bCBoYm94LgorCitGcmkgSnVsIDMwIDE4OjI2OjIxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvIChQcm9jZWR1cmVzKTogSW1wcm92ZSBzdHVmZiBvbiBuZXN0ZWQgZnVuY3Rpb25zLgorCitUaHUgSnVsIDI5IDE1OjEwOjU4IDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIHJlbW90ZS50ZXhpOiAoTUlQUyBSZW1vdGUpIGNsZWFyZXIgZG9jIGZvciBzZXQvc2hvdyB0aW1lb3V0LAorCXJldHJhbnNtaXQtdGltZW91dAorCitUaHUgSnVsIDI5IDEzOjE2OjA5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGJpbnQudGV4aW5mbzogVXBkYXRlIHN0YXRlbWVudCBhYm91dCBgc29tZSBhbmNpZW50IFVuaXgKKwlzeXN0ZW1zLCBsaWtlIFVsdHJpeCA0LjAnIHRvIFVsdHJpeCA0LjIuCisKK1dlZCBKdWwgMjggMTU6MjY6NTMgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZWxfYm9zcXVlLmN5Z251cy5jb20pCisKKwkqIGg4LWNmZy50ZXhpLCBhbGwtY2ZnLnRleGk6IG5ldyBmbGFnIEdEQlNFUlZFUgorCisJKiBNYWtlZmlsZS5pbjogZGVwZW5kIG9uIHJlbW90ZS50ZXhpIHJhdGhlciB0aGFuIGdkYmludi1zLnRleGkKKworCSogcmVtb3RlLnRleGk6IChTZXJ2ZXIpIE5ldyBub2RlIG9uIGdkYnNlcnZlci4gIChSZW1vdGUgU2VyaWFsLAorCVNUMjAwMCBSZW1vdGUsIE1JUFMgUmVtb3RlKTogbWVudGlvbiBgaG9zdDpwb3J0JyBzeW50YXggZm9yIFRDUC4KKworCSogcmVtb3RlLnRleGk6IG5ldyBuYW1lIGZvciBmb3JtZXIgZ2RiaW52LXMudGV4aQorCisJKiBnZGIudGV4aW5mbzogdXNlIHJlbW90ZS50ZXhpIHJhdGhlciB0aGFuIGdkYmludi1zLnRleGkKKworV2VkIEp1bCAyOCAwODoyNjoyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGdkYmludi1zLnRleGk6IERvY3VtZW50ZWQgdGltZW91dCBhbmQgcmV0cmFuc21pdC10aW1lb3V0CisJdmFyaWFibGVzIGZvciBNSVBTIHJlbW90ZSBkZWJ1Z2dpbmcgcHJvdG9jb2wuCisKK01vbiBKdWwgMjYgMTM6MDA6MDkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm8gKE5lZ2F0aXZlIFR5cGUgTnVtYmVycyk6IEZPUlRSQU4gTE9HSUNBTCBmaXguCisKK1R1ZSBKdWwgMjAgMTY6MzA6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChyZWZjYXJkLmR2aSk6IFVzZSBzcmNkaXIgd2hlcmUgbmVjZXNzYXJ5LgorCitNb24gSnVsIDE5IDEyOjAyOjUwIDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGN5Z251cy5jb20pCisKKwkqIGdkYi50ZXhpbmZvOiByZXBhaXIgY29uZGl0aW9uYWwgYnVncyBpbiB0ZXh0IG1hcmt1cAorCitGcmkgSnVsIDE2IDE4OjU3OjUwIDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIGdkYi50ZXhpbmZvLCBhbGwtY2ZnLnRleGksIGg4LWNmZy50ZXhpOiBpbnRyb2R1Y2UgTU9EMiBzd2l0Y2gKKwl0byBzZWxlY3QgTW9kdWxhLTIgbWF0ZXJpYWwuCisKK1RodSBKdWwgMTUgMTM6MTU6MDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm86IENsZWFudXBzIHJlZ2FyZGluZyBzdGF0aWNzLgorCisJKiBnZGJpbnYtcy50ZXhpIChCb290c3RyYXBwaW5nKTogRG9jdW1lbnQgZXhjZXB0aW9uSGFuZGxlci4KKwkoRGVidWcgU2Vzc2lvbik6IE1lbnRpb24gZXhjZXB0aW9uSGFuZGxlci4gIEFkZCB4cmVmIHRvIEJvb3RzdHJhcHBpbmcuCisKK01vbiBKdWwgMTIgMTM6Mzc6MDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm86IE5fTUFJTiBpcyBzb21ldGltZXMgdXNlZCBmb3IgQy4KKworRnJpIEp1bCAgOSAwOTo0NzowMiAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYmludC50ZXhpbmZvIChIb3N0LCBUYXJnZXQgQ29uZGl0aW9uYWxzKTogUmVtb3ZlIFRNX0ZJTEVfT1ZFUlJJREUuCisKK1R1ZSBKdWwgIDYgMTI6NDE6MjggMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGdkYmludC50ZXhpbmZvIChUYXJnZXQgQ29uZGl0aW9uYWxzKTogUmVtb3ZlIE5PX1RZUEVERUZTLAorCXJlbW92ZWQgZnJvbSB0aGUgY29kZSBieSBLaW5nZG9uLiAKKworVHVlIEp1bCAgNiAxMjoyNDozNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnRleGluZm8gKEJyZWFrIENvbW1hbmRzKTogUmVtb3ZlIHN0dWZmIGFib3V0IGZsdXNoaW5nIHRlcm1pbmFsCisJaW5wdXQgd2hlbiBldmFsdWF0aW5nIGJyZWFrcG9pbnQgY29uZGl0aW9uczsgdGhlIGJ1ZyBoYXMgYmVlbiBmaXhlZC4KKworCSogZ2RiLnRleGluZm8gKENvbnRpbnVpbmcgYW5kIFN0ZXBwaW5nKTogQXJndW1lbnQgdG8gImNvbnRpbnVlIgorCXNldHMgdGhlIGlnbm9yZSBjb3VudCB0byBOLTEsIG5vdCB0byBOLgorCitUaHUgSnVsICAxIDE0OjU3OjQyIDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIHJlZmNhcmQudGV4IChcaG9mZnNldCk6IGNvcnJlY3QgbG9uZ3N0YW5kaW5nIGVycm9yIHRvIG1hdGNoCisJICBpbnRlbmRlZCBvZmZzZXQ7IGF2b2lkcyBjdXR0aW5nIG9mZiBlZGdlIG9uIHNvbWUgcHJpbnRlcnMKKworV2VkIEp1biAzMCAxODoyMzowNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoUGFyYW1ldGVycyk6IFNheSB0aGF0IG9yZGVyIG9mIHN0YWJzIGlzIHNpZ25pZmljYW50LgorCitGcmkgSnVuIDI1IDIxOjM0OjUyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvIChDb21tb24gQmxvY2tzKTogU2F5IHdoYXQgU3VuIEZPUlRSQU4gZG9lcy4KKworRnJpIEp1biAyNSAxNjoxNToxMCAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogKFJFRkVESVRTKSBuZXcgdmFyIHRvIGNvbnRyb2wgd2hldGhlciBQUyBvciBDTQorCWZvbnRzIGFuZCB3aGV0aGVyIFVTIG9yIEE0IHBhcGVyIGZvciBHREIgcmVmY2FyZDsgKHJlZmNhcmQuZHZpKQorCWNvbGxlY3Qgc2VkIGVkaXRzIGlmIGFueSwgYXBwbHkgdG8gcmVmY2FyZCBiZWZvcmUgZm9ybWF0dGluZzsKKwkocmVmY2FyZC5wcykgc3RvcCBpbXBseWluZyBQUyBmb250cyBpZiBQUyBvdXRwdXQgcmVxdWVzdGVkOworCShscmVmY2FyZC5wcykgZGVsZXRlIGV4dHJhIHRhcmdldCBmb3IgdmFyaWFudCBQUyBmb250cworCisJKiByZWZjYXJkLnRleDogcGFyYW1ldHJpemUgcGFwZXJzaXplIGRlcGVuZGVudCBpbmZvLCBjb2xsZWN0CisJICBpbiBlYXNpbHkgcmVwbGFjZWQgc3BvdAorCisJKiBhNHJjLnNlZDogbmV3IGZpbGUsIGVkaXRzIHRvIHJlZmNhcmQgZm9yIEE0IHBhcGVyCisKK0ZyaSBKdW4gMjUgMTQ6MjE6NDYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm8gKE5lZ2F0aXZlIFR5cGUgTnVtYmVycyk6IFR5cGUgLTE2IGlzIDQgYnl0ZXMuCisKK1dlZCBKdW4gMjMgMTU6MDI6NTAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm8gKE5lZ2F0aXZlIFR5cGUgTnVtYmVycyk6IE1pbm9yIGNoYXJhY3RlciBjbGVhbnVwcy4KKworVHVlIEp1biAyMiAxNjozMTo1MiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbzogRXhwcmVzcyBkaXNhcHByb3ZhbCBvZiAnRCcgc3ltYm9sIGRlc2NyaXB0b3IKKwlwb2xpdGVseSByYXRoZXIgdGhhbiBydWRlbHkuCisKK0ZyaSBKdW4gMTggMTk6NDI6MDkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm86IERvY3VtZW50IGNvbW1vbiBibG9ja3MuCisKK0ZyaSBKdW4gMTggMTI6MTI6NTcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm86ICBBZGQgc29tZSBiYXNpYyBpbmZvIGFib3V0IHN0YWJzLWluLWVsZi4KKworRnJpIEp1biAxOCAxMzo1NzowOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoVG9wKTogTWlub3IgY2xlYW51cC4KKworTW9uIEp1biAxNCAxNjoxNjo1MSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiByZW1vdmUgcGFyZW50ZGlyIHN1cHBvcnQKKworVHVlIEp1biAxNSAxODoxMTozOSAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbyAoQ29weWluZyk6IGRlbGV0ZSB0aGlzIG5vZGUgYW5kIHJlZmVyZW5jZXMgdG8gaXQ7CisJUk1TIHNheXMgdGhpcyBtYW51YWwgbmVlZCBub3QgY2FycnkgR1BMLiAocGFzc2ltKTogSW1wcm92ZW1lbnRzCisJZnJvbSBsYXN0IHJvdW5kIGF0IEZTRiwgbGFyZ2VseSBkdWUgdG8gSWFuIFRheWxvciByZXZpZXcsIGFuZAorCW1pbm9yIGZvcm1hdHRpbmcgaW1wcm92ZW1lbnRzLgorCisJKiBnZGJpbnYtcy50ZXhpIChwYXNzaW0pOiBJbXByb3ZlbWVudHMgZnJvbSBsYXN0IHJvdW5kIGF0IEZTRiwKKwlsYXJnZWx5IGR1ZSB0byBJYW4gVGF5bG9yIHJldmlldy4gKERlYnVnIFNlc3Npb24pOiBtaW5vciBlZGl0cyB0bworCW5ldyB0ZXh0LgorCitTdW4gSnVuIDEzIDEyOjUyOjM5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAocmVhbGNsZWFuKTogUmVtb3ZlIGluZm8gYW5kIGR2aSBmaWxlcyB0b28uCisKK1NhdCBKdW4gMTIgMTY6MDk6MjIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHthbGwsaDh9LWNvbmZpZy50ZXhpOiBSZW5hbWUgdG8gKi1jZmcudGV4aSBmb3IgMTQgY2hhciBmaWxlbmFtZXMuCisJKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGFjY29yZGluZ2x5LiAgZ2RiLWNvbmZpZy50ZXhpIC0+IGdkYi1jZmcudGV4aS4KKwkqIGdkYi50ZXhpbmZvOiBDaGFuZ2UgYWNjb3JkaW5nbHkuCisKKwkqIHN0YWJzLnRleGluZm86IENsZWFuIHVwIE5fe0wsUn1CUkFDLiAgRGlzY3VzcyB3aGF0IGFkZHJlc3NlcyBvZgorCU5fe0wsUn1CUkFDLE5fU0xJTkUgYXJlIHJlbGF0aXZlIHRvLgorCitGcmkgSnVuIDExIDE1OjE1OjU1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoR0RCdm4udGV4aSk6IFVwZGF0ZSBhdG9taWNhbGx5LgorCitXZWQgSnVuICA5IDEwOjU4OjE2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBnZGJpbnYtcy50ZXhpIChEZWJ1ZyBTZXNzaW9uKTogRG9jdW1lbnQgZXhjZXB0aW9uSG9vay4KKworVHVlIEp1biAgOCAxMzo0MjowNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogZ2RiLnRleGluZm8gKFByaW50IFNldHRpbmdzKTogTW92ZSBhbGwgc3R1ZmYgcmVsYXRpbmcgdG8gc3ltYm9saWMKKwlhZGRyZXNzZXMgdG9nZXRoZXIuICBBbHNvIG1vdGl2YXRlIHRoZSBzZXQgcHJpbnQgc3ltYm9sLWZpbGVuYW1lCisJY29tbWFuZCBhbmQgc3VnZ2VzdCBvdGhlciBzb2x1dGlvbnMuCisKK1R1ZSBKdW4gIDEgMjI6NDY6NDMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGdkYi50ZXhpbmZvIChzZXQgcHJpbnQgZWxlbWVudHMpOiAgTm90ZSB0aGF0IHRoZSBudW1iZXIgb2YKKwllbGVtZW50cyBpcyBzZXQgdG8gdW5saW1pdGVkIGJ5ICJzZXQgcHJpbnQgZWxlbWVudHMgMCIuCisKK01vbiBNYXkgMzEgMDg6MDY6NTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm8gKEJ1aWx0aW4gVHlwZSBEZXNjcmlwdG9ycyk6IFRyeSB0byBjbGFyaWZ5IHdoYXQKKwlORl9MRE9VQkxFIG1lYW5zLgorCShTdGFiIFR5cGVzKTogSW5jbHVkZSBTb2xhcmlzIHN0YWIgdHlwZXMuCisJKFByb2NlZHVyZXMpOiBEb2N1bWVudCBTb2xhcmlzIGV4dGVuc2lvbnMuCisKK1RodSBNYXkgMjcgMDY6MjA6NDIgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBnZGIudGV4aW5mbzogIEFkZCBgc2V0IHByaW50IHN5bWJvbC1maWxlbmFtZScgZG9jLgorCitXZWQgTWF5IDI2IDAwOjI2OjQyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvIChBcnJheXMpOiBUYWxrIGFib3V0IHR5cGUgZGVmaW5pdGlvbiB2cy4gdHlwZQorCWluZm9ybWF0aW9uLgorCisJKiBzdGFicy50ZXhpbmZvIChCdWlsdGluIFR5cGUgRGVzY3JpcHRvcnMpOiBUYWxrIGFib3V0IG9taXR0aW5nCisJdGhlIHRyYWlsaW5nIHNlbWljb2xvbi4KKworVHVlIE1heSAyNSAxNDo0OTo0MiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoTGluZSBOdW1iZXJzLCBTb3VyY2UgRmlsZXMpOiBSZS13cml0ZSB0aGVzZSB0d28gbm9kZXMKKwlhbmQgbWVyZ2UgaW4gb3RoZXIgcGFydHMgb2YgdGhlIGRvY3VtZW50IGFkZHJlc3NpbmcgdGhlc2Ugc3ViamVjdHMuCisJZ2RiaW50LnRleGluZm8gKFhDT0ZGKTogUmVtb3ZlIGluZm8gd2hpY2ggaXMgbm93IGluIHN0YWJzLnRleGluZm8uCisKKwkqIHN0YWJzLnRleGluZm8gKFN1YnJhbmdlcywgQXJyYXlzKTogVHJ5IHRvIGV4cGxhaW4gYWJvdXQgdGhlIHNlbWljb2xvbgorCWF0IHRoZSBlbmQgb2YgYSByYW5nZSB0eXBlLgorCisJKiBzdGFicy50ZXhpbmZvIChTdWJyYW5nZXMpOiAiQSBvZmZzZXQiIGFuZCAiVCBvZmZzZXQiIGFyZSBub3QKKwlBSVggZXh0ZW5zaW9ucy4KKworTW9uIE1heSAyNCAwOTowMDozMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoU3RhYnMgRm9ybWF0KTogIE1pc2MgZml4ZXMuCisKK1NhdCBNYXkgMjIgMTA6NDA6NTYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm8gKENvbnN0YW50cyk6ICBBbGxvdyBhbiBgZScgY29uc3RhbnQgdG8gYmUgbm9uLWVudW0uCisJKFRyYWRpdGlvbmFsIGJ1aWx0aW4gdHlwZXMpOiBEb2N1bWVudCBjb252ZXggY29udmVudGlvbiBmb3IgbG9uZyBsb25nLgorCShOZWdhdGl2ZSBidWlsdGluIHR5cGVzKTogRGlzY3VzcyB0eXBlIG5hbWVzLCBhbmQgbWlzYyBmaXhlcy4KKworRnJpIE1heSAyMSAxMToyMDozMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoQnVpbHRpbiBUeXBlIERlc2NyaXB0b3JzKTogRG9jdW1lbnQgdGhlIGZsb2F0aW5nCisJcG9pbnQgdHlwZXMgdXNlZCB3aXRoIEBzYW1we1J9IHR5cGUgZGVzY3JpcHRvci4KKwkoU3ltYm9sIERlc2NyaXB0b3JzKTogRGVzY3JpYmUgaG93IHRvIGhhbmRsZSBjb25mbGljdCBiZXR3ZWVuCisJZGlmZmVyZW50IG1lYW5pbmdzIG9mIEBzYW1we1B9IHN5bWJvbCBkZXNjcmlwdG9yLgorCitUaHUgTWF5IDIwIDEzOjM1OjEwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvOiBSZW1vdmUgbm9kZSBRdWljayBSZWZlcmVuY2UgYW5kIHB1dCBpdHMgY2hpbGRyZW4KKwlkaXJlY3RseSB1bmRlciB0aGUgbWFpbiBtZW51LgorCisJKiBzdGFicy50ZXhpbmZvOiBNYW55IG1vcmUgY2hhbmdlcyB0byBicmluZyBpdCBpbnRvIGxpbmUgd2l0aAorCUFJWCBkb2N1bWVudGF0aW9uIGFuZCByZWFsaXR5LiAgSSB0aGluayBpdCBub3cgaGFzIGFsbCB0aGUKKwlpbmZvcm1hdGlvbiBmcm9tIHRoZSBBSVggZG9jdW1lbnRhdGlvbiwgZXhjZXB0IHRoYXQgSSBidXJuZWQKKwlvdXQgd2hlbiBJIGdvdCB0byB2YXJpYW50IHJlY29yZHMgKFBhc2NhbCBhbmQgTW9kdWxhLTIpIGFuZAorCWFsbCB0aGUgQ09CT0wgdHlwZXMuICBPaCB3ZWxsLCB3ZSBjYW4gYWRkIHRoZW0gbGF0ZXIgd2hlbiB3ZSdyZQorCXdvcnJ5aW5nIG1vcmUgYWJvdXQgdGhvc2UgbGFuZ3VhZ2VzLgorCisJKiBzdGFicy50ZXhpbmZvIChBdXRvbWF0aWMgdmFyaWFibGVzKTogVGFsayBhYm91dCB3aGF0IGl0IG1lYW5zCisJdG8gb21pdCB0aGUgc3ltYm9sIGRlc2NyaXB0b3IuCisKK1R1ZSBNYXkgMTggMTc6NTk6MTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm8gKFBhcmFtZXRlcnMpOiBBZGQgIihzb21ldGltZXMpIiB3aGVuIGRlc2NyaWJpbmcKKwlnY2MyIGJlaGF2aW9yIHdpdGggcHJvbW90ZWQgYXJncy4KKworRnJpIE1heSAxNCAyMTozNToyOSAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbzogaW5jbHVkZSByZWFkbGluZSBhcHBlbmRpY2VzIGluIGluZm8gdmVyc2lvbiBvZiBtYW51YWwKKworRnJpIE1heSAgNyAxMTo1NjoxOCAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBnZGJpbnYtcy50ZXhpIChSZW1vdGUgU2VyaWFsKTogZGVzY3JpYmUgbmV3IF5DIGJlaGF2aW9yIGluCisJdGFyZ2V0IHJlbW90ZS4KKworCSogZ2RiLnRleGluZm8gKE1hY2hpbmUgQ29kZSk6IG1vcmUgaW5kZXggZW50cmllcyBmb3IgZGlzYXNzZW1ibGUKKworRnJpIE1heSAgNyAxMDoxMjozMCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogQ2xhcmlmeSB0aGUgaW50ZW5kZWQgdXNlIG9mIHRoZSBnZGItdGVzdGVycyBhbmQgZ2RiLXBhdGNoZXMKKwltYWlsaW5nIGxpc3RzLCBhbmQgc2hyaW5rIGd6aXAgY29tbWVudC4KKworVGh1IE1heSAgNiAxNjozOTo1MCAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbyAoU2hlbGwgQ29tbWFuZHMpOiBkbyBub3QgbWVudGlvbiBTSEVMTCBlbnYgdmFyIGluCisJRE9TSE9TVCBjb25maWd1cmF0aW9uIG9mIG1hbnVhbC4KKworCSogZ2RiLnRleGluZm8gKE1JUFMgU3RhY2spOiBuZXcgbm9kZS4KKworCSogYWxsLWNvbmZpZy50ZXhpIChNSVBTKSBuZXcgc3dpdGNoLgorCisJKiBnZGJpbnYtcy50ZXhpIChOaW5keSBPcHRpb25zKSBSZW1vdmUgdHdvIGluc3RhbmNlcyBvZiBmdXR1cmUKKwl0ZW5zZTsgKE1JUFMgUmVtb3RlKSBuZXcgbm9kZS4KKworCSogZ2RiLnRleGluZm8gKHBhc3NpbSkgcmVwaHJhc2VzIHRvIHdvcmsgYXJvdW5kIG1ha2VpbmZvIEB2YWx1ZQorCWJ1ZzsgKEVudmlyb25tZW50KSBsZXNzIHBhc3NpdmUsIG90aGVyIHNtYWxsIGNsZWFudXBzIGluIHRleHQgYWJvdXQKKwkuY3NocmMvLmJhc2hyYzsgKEludm9raW5nIEdEQikgbmV3IE1JUFMgUmVtb3RlIG1lbnUgZW50cnk7CisJKFJlbW90ZSkgbmV3IE1JUFMgUmVtb3RlIG1lbnUgZW50cnkuCisKK1RodSBBcHIgMjkgMDk6MzY6MjUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm86IE1hbnkgY2hhbmdlcyB0byBpbmNsdWRlIGluZm9ybWF0aW9uIGZyb20gdGhlCisJQUlYIGRvY3VtZW50YXRpb24uCisKKwkqIGdkYi50ZXhpbmZvIChFbnZpcm9ubWVudCk6IE1lbnRpb24gcGl0ZmFsbCB3aXRoIC5jc2hyYy4KKworVHVlIEFwciAyNyAxNDowMjo1NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogZ2RiaW50LnRleGluZm8gKG5ldyBub2RlIERlYnVnZ2luZyBHREIsIGVsc2V3aGVyZSk6CisJTW92ZSBhIGJ1bmNoIG9mIGluZm9ybWF0aW9uIGZyb20gLi4vUkVBRE1FLgorCShHZXR0aW5nIFN0YXJ0ZWQpOiBOZXcgbm9kZS4KKworRnJpIEFwciAyMyAxNzoyMToxMyAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBnZGJpbnYtcy50ZXhpLCBnZGIudGV4aW5mbzogaW5jbHVkZSBIaXRhY2hpIFNIIHRhcmdldAorCisJKiBnZGIudGV4aW5mbzogYWR2YW5jZSBtYW51YWwgcmV2aXNpb24gZGF0ZXMgdG8gcHJlc2VudAorCisJKiBnZGJpbnYtcy50ZXhpLCBnZGIudGV4aW5mbywgYWxsLWNvbmZpZy50ZXhpLCBoOC1jb25maWcudGV4aToKKwlzdG9wIHVzaW5nIHNpbGx5IFJvbWFuIG51bWVyYWxzIGluIEBzZXQgdmFyaWFibGUgbmFtZXMKKworRnJpIEFwciAyMyAwNzozMDowMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoUGFyYW1ldGVycyk6IEtlZXAgdHJ5aW5nIHRvIGdldCB0aGlzIHJpZ2h0LgorCitXZWQgQXByIDIxIDE1OjE4OjQ3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvIChQYXJhbWV0ZXJzKTogTW9yZSBvbiAibG9jYWwgcGFyYW1ldGVycyIuCisKK01vbiBBcHIgMTkgMDg6MDA6NTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm8gKFBhcmFtZXRlcnMpOiBSZS1kbyAibG9jYWwgcGFyYW1ldGVycyIgc2VjdGlvbi4KKworU3VuIEFwciAxOCAwOTo0Nzo0NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbyAoU3ltYm9sIGRlc2NyaXB0b3JzKTogUmUtZG8gdXNpbmcgQHRhYmxlIGFuZCBAeHJlZi4KKwkoUGFyYW1ldGVycyk6IFJld3JpdGUuCisJKHhjb2ZmLWRpZmZlcmVuY2VzLCBTdW4tZGlmZmVyZW5jZXMpOiBNaW5vciBjaGFuZ2VzLgorCitUaHUgQXByIDE1IDAyOjM1OjI0IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjYWNvcGhvbnkuY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbzogIE1pbm9yIGNsZWFudXAuCisKK1dlZCBBcHIgMTQgMTc6MzE6MDAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIGdkYmludC50ZXhpbmZvOiBNaW5vciB4Y29mZiBzdHVmZi4KKworV2VkIEFwciAgNyAxNDoxMTowNyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZ2RiaW50LnRleGluZm86ICBVcGRhdGUgZm9yIG5ldyBjb25maWcgZGlyZWN0b3J5IHN0cnVjdHVyZS4KKwlBZGQgaW5mbyBhYm91dCBpbnRlcm5hbCB0eXBlIGRhdGEgc3RydWN0dXJlcy4KKworTW9uIEFwciAgNSAwOTowNjozMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChTRklMRVNfSU5DTFVERUQpOiBnZGItY29uZmlnLnRleGkgaXMgbm8gbG9uZ2VyIGluCisJJChzcmNkaXIpLgorCShnZGItY29uZmlnLnRleGkpOiBEZXBlbmQgb24gZmlsZSBpbiAkKHNyY2RpcikuCisKK0ZyaSBBcHIgIDIgMTY6NTU6MTMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm86IEZpeGVzIGFib3V0IE5fU08uCisKK0ZyaSBNYXIgMjYgMTg6MDA6MzUgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKKworCSogZ2RiLnRleGluZm86IGluY2x1ZGUgbGlzdCBvZiBub25zdGFuZGFyZCBpbml0IGZpbGUgbmFtZXMKKworCSogKi1jb25maWcudGV4aTogbmV3IHN3aXRjaCBHRU5FUklDIGZvciB0ZXh0IHRoYXQgYXBwbGllcyAqb25seSoKKwl0byAodXN1YWwpIG11bHRpcGxlLXRhcmdldCB2ZXJzaW9uIG9mIG1hbnVhbAorCisJKiBnZGIudGV4aW5mbywgZ2RiaW52LXMudGV4aTogVXBkYXRlIGNvbmRpdGlvbmFsIG1hcmt1cCB0byBjb3JyZWN0CisJaDggY29uZmlnCisKKwkqIGdkYi50ZXhpbmZvOiBkZXBlbmQgb24gbGF0ZXN0IGZpeGVkIG1ha2VpbmZvLCB1c2UgY29uZGl0aW9uYWxzCisJaW4gbWVudXMgKHJhdGhlciB0aGFuIGNvbmRpdGlvbmFsbHkgc2VsZWN0ZWQgbXVsdGlwbGUgYWx0ZXJuYXRpdmUKKwltZW51cykuCisKKwkqIE1ha2VmaWxlLmluOiBkZWZpbmUgYW5kIHVzZSBET0NfQ09ORklHIHZhciB0byBzZWxlY3QKKwljb25maWd1cmF0aW9uIGZvciBHREIgdXNlciBtYW51YWwuCisKKwkqIGdkYi1jb25maWcudGV4aTogZGVsZXRlIGZyb20gcmVwb3NpdG9yeSwgZ2VuZXJhdGUgZnJvbSBNYWtlZmlsZS4KKworCSogYWxsLWNvbmZpZy50ZXhpOiBub3JtYWwgYGdlbmVyaWMnIGNvbmZpZ3VyYXRpb24gZmlsZSwgZm9ybWVybHkKKwlzdG9yZWQgYXMgZ2RiLWNvbmZpZy50ZXhpCisKK1dlZCBNYXIgMjQgMTQ6MDM6MTkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGQgZHZpIHRhcmdldCB0byBidWlsZCBhbGwgLmR2aSBmaWxlcworCitUdWUgTWFyIDIzIDE2OjAzOjI0IDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIGdkYi50ZXhpbmZvLCBnZHZpbnYtcy50ZXhpbmZvOiBmb3JtYXR0aW5nIGltcHJvdmVtZW50cy4KKworRnJpIE1hciAxOSAyMTo0Njo1MCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogZ2RiaW50LnRleGluZm86ICBEb2MgTk9fTU1BTExPQyBhbmQgTk9fTU1BTExPQ19DSEVDSyBhcworCWhvc3QgY29uZGl0aW9uYWxzLgorCSogc3RhYnMudGV4aW5mbzogIE1vcmUgYXJyYXkgZml4ZXMgaW5zcGlyZWQgYnkgSmltJ3MuCisKK0ZyaSBNYXIgMTkgMTA6MjM6MzQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm86IEZpeGVzIHJlIGFycmF5cyBhbmQgY29udGludWF0aW9ucy4KKworCSogZ2RiaW50LnRleGluZm86IEFkZCBYQ09GRiBub2RlLgorCitNb24gTWFyICA4IDE1OjUyOjE4IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbzogIEFkZCBgc2V0IHByaW50IG1heC1zeW1ib2xpYy1vZmZzZXQnIGRvYy4KKworU3VuIEZlYiAyMSAxNzowOTozOCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm86ICBGaXggZm9yIGFycmF5IHR5cGVzIHRvIG1lbnRpb24gbG93ZXIgYm91bmRzLgorCitUaHUgRmViIDE4IDAxOjE5OjQ5IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBnZGJpbnQudGV4aW5mbzogIFVwZGF0ZSBQVFJBQ0VfQVJHM19UWVBFIGRvYywgcHVsbCBQVF8qLgorCitXZWQgRmViIDE3IDA4OjE1OjI0IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBnZGJpbnQudGV4aW5mbzogIFJlbW92ZSBTRVRfU1RBQ0tfTElNSVRfSFVHRSBmcm9tIHRhcmdldCBkZWZpbmVzLgorCitUaHUgRmViIDExIDEwOjM4OjQwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBnZGJpbnQudGV4aW5mbzogIEZpeCB0aGlua28gKE5NX0ZJTEUgPT4gTkFUX0ZJTEUpLiAgRm91bmQKKwlieSBNaWNoYWVsIEJlbi1HZXJzaG9uIDxteWJnQENTLkhVSkkuQUMuSUw+LgorCitXZWQgRmViIDEwIDIzOjU5OjE5IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBnZGJpbnQudGV4aW5mbzogIEVsaW1pbmF0ZSBJQk02MDAwX0hPU1QsIGRvY3VtZW50IElCTTYwMDBfVEFSR0VULgorCitUdWUgRmViICA5IDE4OjI2OjIxIDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIGdkYi50ZXhpbmZvLCBnZGJpbnYtcy50ZXhpOiBtaXNjIHVwZGF0ZXMKKworU2F0IEZlYiAgNiAxMDoyNTo0NyAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogZ2RiaW50LnRleGluZm86ICBCcmllZiBkb2N1bWVudGF0aW9uIGZvciBsb25nam1wIHN1cHBvcnQsCisJZnJvbSBhbiBlbWFpbCBtc2cgYnkgU3R1LgorCitGcmkgRmViICA1IDE0OjEwOjE1IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBzdGFicy50ZXhpbmZvOiAgRml4IGRlc2NyaXB0aW9uIG9mIGZsb2F0aW5nIHBvaW50ICJyYW5nZSIKKwl0eXBlcyAod2hpY2ggcmVhbGx5IGRlZmluZSBiYXNpYyB0eXBlcykuICBSZXBvcnRlZCBieSBKaW0gTWVlaGFuLAorCTxtZWVoYW5Ac3JjLmRlYy5jb20+LgorCisJKiBnZGJpbnQudGV4aW5mbzogIFJlbW92ZSBDT0ZGX05PX0xPTkdfRklMRV9OQU1FUyBkZWZpbmUsIG5vdyBnb25lLgorCitUaHUgRmViICA0IDEzOjU2OjQ2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogZ2RiaW50LnRleGluZm86IFNsaWdodGx5IGV4cGFuZCBzZWN0aW9uIG9uIHN1cHBvcnRpbmcgYSBuZXcKKwlvYmplY3QgZmlsZSBmb3JtYXQuCisKK1RodSBGZWIgIDQgMDE6NDk6MDQgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChyZWZjYXJkLnBzLCBscmVmY2FyZC5wcyk6ICBSZW1vdmUgcHNyZWYudGV4CisJaW50ZXJtZWRpYXRlIGZpbGUuCisKK1R1ZSBGZWIgIDIgMTI6MTg6MDYgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKKworCSogZ2RiLnRleGluZm8sIGdkYmludi1zLnRleGk6IG1pc2NlbGxhbmVvdXMgc3R5bGlzdGljIGNsZWFudXBzCisKK01vbiBGZWIgIDEgMTU6MzU6NDcgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKKworCSogZ2RiaW52LXMudGV4aTogejgwMDAgc2ltdWxhdG9yIHRhcmdldCBuYW1lIGlzIGp1c3QgInNpbSIKKworCSogZ2RiaW52LXMudGV4aTogIE1lbnRpb24gdGhhdCBaODAwMCBzaW11bGF0b3IgY2FuIHNpbXVsYXRlIFo4MDAxCisJYXMgd2VsbCBhcyBaODAwMi4KKworU2F0IE5vdiAyOCAwNjo1MTozNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogZ2RiaW50LnRleGluZm86ICBBZGQgc2VjdGlvbnMgb24gY2xlYW4gZGVzaWduIGFuZCBvbiBob3cgdG8gc2VuZAorCWluIGNoYW5nZXMuCisKK01vbiBOb3YgIDkgMjM6NTc6MDIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGdkYmludC50ZXhpbmZvOiAgQWRkIGhvdyB0byBkZWNsYXJlIHRoZSByZXN1bHQgb2YgbWFrZV9jbGVhbnVwLgorCitNb24gT2N0IDI2IDExOjA5OjQ3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbzogIEZpeCB0eXBvLCByZXBvcnRlZCBieSBLYXJsIEJlcnJ5LgorCitGcmkgT2N0IDIzIDAwOjQxOjIxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbzogIEFkZCBvcGNvZGVzIGRpciB0byBHREIgZGlzdHJpYnV0aW9uIGRlc2NyaXB0aW9uLgorCitTYXQgT2N0IDEwIDE4OjA0OjU4IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogZ2RiaW50LnRleGluZm86IGZpeGVkIGEgc3RyYXkgZW1haWwgYWRkcmVzcyAobmVlZHMgQEApLAorCWFkZGVkIEB0YWJsZSBAY29kZSB0byBub2RlICJOYXRpdmUgQ29uZGl0aW9uYWxzIgorCitUdWUgU2VwIDIyIDAwOjM0OjE1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBnZGJpbnQudGV4aW5mbzogIERlc2NyaWJlIGNvZGluZyBzdHlsZSBvZiBHREIuCisKK01vbiBTZXAgMjEgMTk6MzI6MTYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm86ICBNaW5vciB3b3JkaW5nIGNoYW5nZXMuCisKK1R1ZSBTZXAgMTUgMDI6NTc6MDkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGdkYmludC50ZXhpbmZvOiAgSW1wcm92ZSByZWxlYXNlIGRvYyBzbGlnaHRseS4KKworRnJpIFNlcCAxMSAwMTozNDoyNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAc3BoYWdudW0uY3lnbnVzLmNvbSkKKworCSogZ2RiaW50LnRleGluZm86ICBJbXByb3ZlIGRvYyBvZiBHREIgY29uZmlnIG1hY3Jvcy4KKworV2VkIFNlcCAgOSAxNjo1MjowNiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogc3RhYnMudGV4aW5mbzogIFJlbW92ZSBCb3RobmVyJ3MgY2hhbmdlcyBmb3IgQysrIG5lc3RlZCB0eXBlcy4KKwlUaGVzZSB3aWxsIGJlIHJlaW5zZXJ0ZWQgd2hlbiBleGFtaW5lZC4KKworTW9uIEF1ZyAyNCAwMToxNzo1NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogZ2RiaW50LnRleGluZm86ICBNYWtlIGEgc3RhcnQgYXQgZG9jdW1lbnRpbmcgYWxsIHRoZSAjaWYgbWFjcm9zCisJaW4gR0RCLiAgQXQgbGVhc3QgbGlzdCB0aGVtIGFsbCwgYW5kIHN0YXJ0IHNlcGFyYXRpbmcgdGhlbSBpbnRvCisJaG9zdC1zcGVjaWZpYyBhbmQgdGFyZ2V0LXNwZWNpZmljLgorCitUdWUgQXVnIDE4IDE1OjU5OjEzIDE5OTIgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIGdkYmludi1zLm00LmluOiByZWZyYWluIGZyb20gdXNpbmcgQGNhcnRvdWNoZSBmb3IganVzdCBhIGZldworCWV4YW1wbGVzIChub3QgY29uc2lzdGVudCB3IG90aGVycykuICAKKwlnZGIudGV4aW5mbzogaXNzdWUgZGlzY2xhaW1lciBwYXJhZ3JhcGggb24gY21kbGluZSBvcHRpb25zIG9ubHkKKwlmb3IgZ2VuZXJpYyB2biBvZiBkb2MKKworVHVlIEF1ZyAxOCAxNDo1MzoyNyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KKworVHVlIEF1ZyAxOCAxNDoxMTo1MCAxOTkyICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbzogaW4gaDggY29uZmlnLCBkbyBub3QgZGVzY3JpYmUgc2VhcmNoaW5nIGNvbW1hbmRzLgorCitNb24gQXVnIDE3IDE4OjA3OjU5IDE5OTIgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCisKKwkqIGdkYi50ZXhpbmZvLCBub25lLm00LCBoOC5tNCwgZ2RiaW52LXMubTQuaW46IGltcHJvdmUgSDgvMzAwCisJICBjb25kaXRpb25hbHM7IGludHJvZHVjZSBhIGZldyBnZW5lcmljIHN3aXRjaGVzIHRoYXQgbWF5IGJlCisJICB1c2VmdWwgZm9yIG90aGVyIGNyb3NzLWRldiBvciBkb3MtaG9zdGVkIGNvbmZpZ3MuCisKKwkqIGdkYi50ZXhpbmZvOiBmaXggdHlwbyBpbiAiaW5mbyByZWciIGRlc2NyaXB0aW9uCisKK1N1biBBdWcgMTYgMDE6MTY6MTggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm86ICBNaW5vciB1cGRhdGVzIGZyb20gcnVubmluZyBUZVggb3ZlciBpdC4KKwkqIE1ha2VmaWxlLmluIChzdGFicy5kdmksIHN0YWJzLnBzKTogIEFkZC4KKworU2F0IEF1ZyAxNSAyMDo1MjoyNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCisKKwkqIHN0YWJzLnRleGluZm86ICBTdGFicyBkb2N1bWVudGF0aW9uLCB3cml0dGVuIGJ5IEp1bGlhIE1lbmFwYWNlLgorCUZpcnN0IHBhc3MgYXQgY29udmVydGluZyBpdCB0byB0ZXhpbmZvLgorCitTYXQgQXVnIDE1IDAzOjE0OjU5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbywgcmVmY2FyZC50ZXg6ICBEb2N1bWVudCBtdWx0IGFyZ3Mgb24gYGluZm8gcmVnJy4KKwkqIE1ha2VmaWxlLmluIChyZWZjYXJkLnBzLCBscmVmY2FyZC5wcyk6ICBBZGQgbWlzc2luZyAkKHNyZGlyKS4KKworRnJpIEF1ZyAxNCAyMTowODo0NyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogZ2RiaW50LnRleGluZm86ICBBZGQgc2VjdGlvbiBvbiBwYXJ0aWFsIHN5bWJvbCB0YWJsZXMuCisKK1NhdCBKdW4gMjAgMTY6MzE6MTAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGdkYi50ZXhpbmZvOiAgZG9jdW1lbnQgYHNldCByZW1vdGVkZWJ1ZycgYW5kIGBzZXQKKwlyc3RhY2tfaGlnaF9hZGRyZXNzJy4KKworVGh1IE1heSAxNCAxNzowOTo0OCAxOTkyICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQorCisJKiBnZGIudGV4aW5mbzogc2xpZ2h0IGV4cGFuc2lvbiBvZiBuZXcgdGV4dCBvbiByZWFkaW5nIGluZm8gZmlsZXMKKwkqIGdkYmludi1zLm00LmluOiBjb3JyZWN0IGFuZCBleHBhbmQgaW5mbyBvbiBjcm9zcy1kZWJ1Z2dpbmcKKwlIOC8zMDAgZnJvbSBET1MuCisKK1R1ZSBNYXkgMTIgMTI6MjI6NDcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIGdkYi50ZXhpbmZvOiAgYGluZm8gdXNlcicgPT4gYHNob3cgdXNlcicuICBOb3RpY2VkIGJ5IERhdmlkIFRheWxvci4KKworTW9uIE1heSAxMSAxOTowNjoyNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogZ2RiLnRleGluZm86ICBTYXkgaG93IHRvIHJlYWQgdGhlIGBpbmZvJyBmaWxlcy4KKworVHVlIE1heSAgNSAxMjoxMTozOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGdtNCAtPiBtNC4KKworRnJpIEFwciAxMCAxNzo1MDo0MyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIGdkYi50ZXhpbmZvOiAgVXBkYXRlIGZvciBHREItNC41LiAgTW92ZSBgRm9ybWF0dGluZworCURvY3VtZW50YXRpb24nIGFoZWFkIG9mIGBJbnN0YWxsaW5nIEdEQicgdG8gbWF0Y2ggUkVBRE1FLgorCVVwZGF0ZSBzaGFyZWQgbGlicmFyeSBkb2MsIC1yZWFkbm93IGFuZCAtbWFwcGVkLCBhbmQgZGlyZWN0b3J5CisJc3RydWN0dXJlIChhZGQgZ2xvYiBhbmQgbW1hbGxvYykuICBVcGRhdGUgY29uZmlndXJlIGRvYy4JCisKK1R1ZSBNYXIgMjQgMjM6Mjg6MzggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiByZW1vdmUgJChzcmNkaXIpIGZyb20gZ2RiLmluZm8gcnVsZS4KKworU2F0IE1hciAgNyAxODo0NDo1MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBjb21tZW50ZWQgb3V0IGdkYi1hbGwudGV4aW5mbyBydWxlLiAgVGhpcyBpcworCSAgdGVtcG9yYXJ5LgorCitXZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAorCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCisJICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KKworRnJpIERlYyAxMyAwOTo0NzozMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogZ2RiLnRleGluZm86ICBJbXByb3ZlIGhvdyB3ZSBhc2sgZm9yIGJ1ZyByZXBvcnRzLgorCitUdWUgRGVjIDEwIDA0OjA3OjIxIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgorCitGcmkgRGVjICA2IDIzOjU3OjM0IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IHJlbW92ZSBzcGFjZXMgZm9sbG93aW5nIGh5cGhlbnMsIGJzZCBtYWtlIGNhbid0CisJICBjb3BlLiAgaW5zdGFsbCB1c2luZyBJTlNUQUxMX0RBVEEuICBhZGRlZCBjbGVhbi1pbmZvLiAgYWRkZWQKKwkgIHN0YW5kYXJkcy50ZXh0IHN1cHBvcnQuIAorCitUaHUgRGVjICA1IDIyOjQ2OjEyIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cworCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgorCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KKworDAorTG9jYWwgVmFyaWFibGVzOgorbW9kZTogaW5kZW50ZWQtdGV4dAorbGVmdC1tYXJnaW46IDgKK2ZpbGwtY29sdW1uOiA3NAordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvZ2RiL2RvYy9IUFBBLWNmZy50ZXhpIGIvZ2RiL2RvYy9IUFBBLWNmZy50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YTEzOGMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZG9jL0hQUEEtY2ZnLnRleGkKQEAgLTAsMCArMSwxMTQgQEAKK0BjIEdEQiBNQU5VQUwgY29uZmlndXJhdGlvbiBmaWxlLiAgCitAYyBDb3B5cmlnaHQgKGMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitAYworQGMgTk9URTogV2hpbGUgdGhlIEdEQiBtYW51YWwgaXMgY29uZmlndXJhYmxlIChieSBjaGFuZ2luZyB0aGVzZQorQGMgc3dpdGNoZXMpLCBpdHMgY29uZmlndXJhdGlvbiBpcyAqKipOT1QqKiogYXV0b21hdGljYWxseSB0aWVkIGluIHRvCitAYyBzb3VyY2UgY29uZmlndXJhdGlvbi0tLWJlY2F1c2UgdGhlIGF1dGhvcnMgZXhwZWN0IHRoYXQsIHNhdmUgaW4KK0BjIHVudXN1YWwgY2FzZXMsIHRoZSBtb3N0IGluY2x1c2l2ZSBmb3JtIG9mIHRoZSBtYW51YWwgaXMgYXBwcm9wcmlhdGUKK0BjIG5vIG1hdHRlciBob3cgdGhlIHByb2dyYW0gaXRzZWxmIGlzIGNvbmZpZ3VyZWQuCitAYworQGMgVGhlIG9ubHkgYXV0b21hdGljYWxseS12YXJ5aW5nIHZhcmlhYmxlIGlzIHRoZSBHREIgdmVyc2lvbiBudW1iZXIsCitAYyB3aGljaCB0aGUgTWFrZWZpbGUgcmV3cml0ZXMgYmFzZWQgb24gdGhlIFZFUlNJT04gdmFyaWFibGUgZnJvbQorQGMgYC4uL01ha2VmaWxlLmluJy4gIAorQGMgCitAYyBHREIgdmVyc2lvbiBudW1iZXIgaXMgcmVjb3JkZWQgaW4gdGhlIHZhcmlhYmxlIEdEQlZOCitAaW5jbHVkZSBHREJ2bi50ZXhpCitAYworQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQGMgUExBVEZPUk0gRkxBR1M6CitAY2xlYXIgR0VORVJJQworQGMKK0BjIEhQIFBBLVJJU0MgdGFyZ2V0OgorQHNldCBIUFBBCitAYworQGMgSGl0YWNoaSBIOC8zMDAgdGFyZ2V0OgorQGNsZWFyIEg4CitAYyBIaXRhY2hpIEg4LzMwMCB0YXJnZXQgT05MWToKK0BjbGVhciBIOEVYQ0xVU0lWRQorQGMKK0BjIHJlbW90ZSBNSVBTIHRhcmdldDoKK0BjbGVhciBNSVBTCitAYworQGMgU1BBUkMgdGFyZ2V0OgorQGNsZWFyIFNQQVJDCitAYworQGMgQU1EIDI5MDAwIHRhcmdldDoKK0BjbGVhciBBTUQyOUsKK0BjCitAYyBJbnRlbCA5NjAgdGFyZ2V0OgorQGNsZWFyIEk5NjAKK0BjCitAYyBUYW5kZW0gU1QyMDAwIChwaG9uZSBzd2l0Y2gpIHRhcmdldDoKK0BjbGVhciBTVDIwMDAKK0BjCitAYyBaaWxvZyA4MDAwIHRhcmdldDoKK0BjbGVhciBaOEsKK0BjCitAYyBXaW5kIFJpdmVyIFN5c3RlbXMgVnhXb3JrcyBlbnZpcm9ubWVudDoKK0BjbGVhciBWWFdPUktTCitAYworQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQGMgRE9DIEZFQVRVUkUgRkxBR1M6CitAYyAKK0BjIEJhcmUtYm9hcmQgdGFyZ2V0PworQGNsZWFyIEJBUkVUQVJHRVQKK0BjCitAYyBSZXN0cmljdCBsYW5ndWFnZXMgZGlzY3Vzc2VkIHRvIEM/CitAYyBUaGlzIGlzIGJhY2t3YXJkLiAgQXMgdGltZSBwZXJtaXRzLCBjaGFuZ2UgdGhpcyB0byBsYW5ndWFnZS1zcGVjaWZpYworQGMgc3dpdGNoZXMgZm9yIHdoYXQgdG8gaW5jbHVkZS4KK0BjbGVhciBDT05MWQorQGMgRGlzY3VzcyBGb3J0cmFuPworQGNsZWFyIEZPUlRSQU4KK0BjCitAYyBEaXNjdXNzIE1vZHVsYSAyPworQGNsZWFyIE1PRDIKK0BjCitAYyBTcGVjaWZpY2FsbHkgZm9yIGhvc3QgbWFjaGluZSBydW5uaW5nIERPUz8KK0BjbGVhciBET1NIT1NUCitAYworQGMgVGFsayBhYm91dCBDUFUgc2ltdWxhdG9yIHRhcmdldHM/CitAY2xlYXIgU0lNUworQGMKK0BjIFJlbW90ZSBzZXJpYWwgbGluZSBzZXR0aW5ncyBvZiBpbnRlcmVzdD8KK0BzZXQgU0VSSUFMCitAYworQGMgRGlzY3VzcyBmZWF0dXJlcyByZXF1aXJpbmcgUG9zaXggb3Igc2ltaWxhciBPUyBlbnZpcm9ubWVudD8KK0BzZXQgUE9TSVgKK0BjCitAYyBEaXNjdXNzIHJlbW90ZSBzZXJpYWwgZGVidWdnaW5nIHN0dWI/CitAY2xlYXIgUkVNT1RFU1RVQgorQGMKK0BjIERpc2N1c3MgZ2Ric2VydmVyPworQHNldCBHREJTRVJWRVIKK0BjCitAYyBEaXNjdXNzIGdkYnNlcnZlLm5sbT8KK0BzZXQgR0RCU0VSVkUKK0BjCitAYyBSZWZyYWluIGZyb20gZGlzY3Vzc2luZyBob3cgdG8gY29uZmlndXJlIHN3IGFuZCBmb3JtYXQgZG9jPworQGNsZWFyIFBSRUNPTkZJR1VSRUQKK0BjCitAYyBSZWZyYWluIGZyb20gcmVmZXJyaW5nIHRvIHVuZnJlZSBwdWJsaWNhdGlvbnM/CitAc2V0IEZTRkRPQworQGMKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0BjIFNUUklOR1M6CitAYworQGMgTmFtZSBvZiBHREIgcHJvZ3JhbS4gIFVzZWQgYWxzbyBmb3IgKGdkYikgcHJvbXB0IHN0cmluZy4KK0BzZXQgR0RCUCBnZGIKK0BjIAorQGMgTmFtZSBvZiBHREIgcHJvZHVjdC4gIFVzZWQgaW4gcnVubmluZyB0ZXh0LgorQHNldCBHREJOIEdEQgorQGMKK0BjIE5hbWUgb2YgdGFyZ2V0LgorQHNldCBUQVJHRVQgSFAgOTAwMCBTeXN0ZW1zCitAYyAKK0BjIE5hbWUgb2YgaG9zdC4gIFNob3VsZCBub3QgYmUgdXNlZCBpbiBnZW5lcmljIGNvbmZpZ3MsIGJ1dCBnZW5lcmljCitAYyB2YWx1ZSBtYXkgY2F0Y2ggc29tZSBmbHVicy4KK0BzZXQgSE9TVCBtYWNoaW5lIHNwZWNpZmljCitAYworQGMgTmFtZSBvZiBHQ0MgcHJvZHVjdAorQHNldCBOR0NDIEdDQworQGMgCitAYyBOYW1lIG9mIEdDQyBwcm9ncmFtCitAc2V0IEdDQyBnY2MKKwpkaWZmIC0tZ2l0IGEvZ2RiL2RvYy9MUlMgYi9nZGIvZG9jL0xSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTI1ZDQzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2RvYy9MUlMKQEAgLTAsMCArMSwxOTcgQEAKK1doYXQncyBMUlM/Cis9PT09PT09PT09PQorCitMUlMsIG9yIExpdmUgUmFuZ2UgU3BsaXR0aW5nIGlzIGFuIG9wdGltaXphdGlvbiB0ZWNobmlxdWUgd2hpY2ggYWxsb3dzCithIHVzZXIgdmFyaWFibGUgdG8gcmVzaWRlIGluIGRpZmZlcmVudCBsb2NhdGlvbnMgZHVyaW5nIGRpZmZlcmVudCBwYXJ0cworb2YgYSBmdW5jdGlvbi4KKworRm9yIGV4YW1wbGUsIGEgdmFyaWFibGUgbWlnaHQgcmVzaWRlIGluIHRoZSBzdGFjayBmb3IgcGFydCBvZiBhIGZ1bmN0aW9uCithbmQgaW4gYSByZWdpc3RlciBkdXJpbmcgYSBsb29wIGFuZCBpbiBhIGRpZmZlcmVudCByZWdpc3RlciBkdXJpbmcKK2Fub3RoZXIgbG9vcC4KKworQ2xlYXJseSwgaWYgYSB2YXJpYWJsZSBtYXkgcmVzaWRlIGluIGRpZmZlcmVudCBsb2NhdGlvbnMsIHRoZW4gdGhlCitjb21waWxlciBtdXN0IGRlc2NyaWJlIHRvIHRoZSBkZWJ1Z2dlciB3aGVyZSB0aGUgdmFyaWFibGUgcmVzaWRlcyBmb3IKK2FueSBnaXZlbiBwYXJ0IG9mIHRoZSBmdW5jdGlvbi4KKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGRlYnVnIGZvcm1hdCBmb3IgZW5jb2RpbmcgdGhlc2UgZXh0ZW5zaW9ucworaW4gc3RhYnMuCisKK1NpbmNlIHRoZXNlIGV4dGVuc2lvbnMgYXJlIGdjYyBzcGVjaWZpYywgdGhlc2UgYWRkaXRpb25hbCBzeW1ib2xzIGFuZAorc3RhYnMgY2FuIGJlIGRpc2FibGVkIGJ5IHRoZSBnY2MgY29tbWFuZCBvcHRpb24gLWdzdGFicy4KKworCitHTlUgZXh0ZW5zaW9ucyBmb3IgTFJTIHVuZGVyIHN0YWJzOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCityYW5nZSBzeW1ib2xzOgorLS0tLS0tLS0tLS0tLQorCisgICAgQSByYW5nZSBzeW1ib2wgd2lsbCBiZSB1c2VkIHRvIG1hcmsgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgYQorICAgIGxpdmUgcmFuZ2UgKHRoZSByYW5nZSB3aGljaCBkZXNjcmliZXMgd2hlcmUgYSBzeW1ib2wgaXMgYWN0aXZlLAorICAgIG9yIGxpdmUpLiAgVGhlc2Ugc3ltYm9scyB3aWxsIGxhdGVyIGJlIHJlZmVyZW5jZWQgaW4gdGhlIHN0YWJzIGZvcgorICAgIGRlYnVnIHB1cnBvc2VzLiAgRm9yIHNpbXBsaWNpdHksIHdlJ2xsIHVzZSB0aGUgdGVybXMgInJhbmdlX3N0YXJ0IgorICAgIGFuZCAicmFuZ2VfZW5kIiB0byBpZGVudGlmeSB0aGUgcmFuZ2Ugc3ltYm9scyB3aGljaCBtYXJrIHRoZSBiZWdpbm5pbmcKKyAgICBhbmQgZW5kIG9mIGEgbGl2ZSByYW5nZSByZXNwZWN0aXZlbHkuCisKKyAgICBBbnkgdGV4dCBzeW1ib2wgd2hpY2ggd291bGQgbm9ybWFsbHkgYXBwZWFyIGluIHRoZSBzeW1ib2wgdGFibGUKKyAgICAoZWcuIGEgZnVuY3Rpb24gbmFtZSkgY2FuIGJlIHVzZWQgYXMgcmFuZ2Ugc3ltYm9sLiAgSWYgYW4gYWRkcmVzcworICAgIGlzIG5lZWRlZCB0byBkZWxpbWl0IGEgbGl2ZSByYW5nZSBhbmQgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZQorICAgIHZhbHVlcyBvZiBzeW1ib2xzIHdoaWNoIHdvdWxkIG5vcm1hbGx5IGFwcGVhciBpbiB0aGUgc3ltYm9sIHRhYmxlLAorICAgIGEgbmV3IHN5bWJvbCB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0YWJsZSB3aG9zZSB2YWx1ZSBpcyB0aGF0IGFkZHJlc3MuCisKKyAgICBUaGUgdGhyZWUgbmV3IHN5bWJvbCB0eXBlcyBkZXNjcmliZWQgYmVsb3cgaGF2ZSBiZWVuIGFkZGVkIGZvciB0aGlzIAorICAgIHB1cnBvc2UuCisKKyAgICBGb3IgZWZmaWNpZW5jeSwgdGhlIGNvbXBpbGVyIHNob3VsZCB1c2UgZXhpc3Rpbmcgc3ltYm9scyBhcyByYW5nZQorICAgIHN5bWJvbHMgd2hlbmV2ZXIgcG9zc2libGU7IHRoaXMgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwKKyAgICBzeW1ib2xzIHdoaWNoIG5lZWQgdG8gYmUgYWRkZWQgdG8gdGhlIHN5bWJvbCB0YWJsZS4KKworICAgIAorTmV3IGRlYnVnIHN5bWJvbCB0eXBlIGZvciBkZWZpbmluZyByYW5nZXM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHJhbmdlX29mZiAtIGNvbnRhaW5zIFBDIGZ1bmN0aW9uIG9mZnNldCBmb3Igc3RhcnQvZW5kIG9mIGEgbGl2ZSByYW5nZS4KKwkJSXRzIGxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBmdW5jdGlvbiBzdGFydCBhbmQgdGhlcmVmb3JlIAorCQllbGltaW5hdGVzIHRoZSBuZWVkIGZvciBhZGRpdGlvbmFsIHJlbG9jYXRpb24uCisKKyAgICBUaGlzIHN5bWJvbCBoYXMgYSB2YWx1ZXMgaW4gdGhlIHRleHQgc2VjdGlvbiwgYW5kIGRvZXMgbm90IGhhdmUgYSBuYW1lLgorCisJICAgIE5PVEU6IHRoZSBmb2xsb3dpbmcgbWF5IG5vdCBiZSBuZWVkZWQgYnV0IGFyZSBpbmNsdWRlZCBoZXJlIGp1c3QgCisJCWluIGNhc2UuCisJICAgIHJhbmdlIC0gY29udGFpbnMgUEMgdmFsdWUgb2YgYmVnaW5uaW5nIG9yIGVuZCBvZiBhIGxpdmUgcmFuZ2UKKwkJKHJlbG9jcyByZXF1aXJlZCkuCisKKwkgICAgTk9URTogdGhlIGZvbGxvd2luZyB3aWxsIGJlIHJlcXVpcmVkIGlmIHdlIGRlc2lyZSBMUlMgZGVidWdnaW5nCisJCXRvIHdvcmsgd2l0aCBvbGQgc3R5bGUgYS5vdXQgc3RhYnMuCisJICAgIHJhbmdlX2FicyAtIGNvbnRhaW5zIGFic29sdXRlIFBDIHZhbHVlIG9mIHN0YXJ0L2VuZCBvZiBhIGxpdmUgCisJCXJhbmdlLiAgVGhlIHJhbmdlX2FicyBkZWJ1ZyBzeW1ib2wgaXMgcHJvdmlkZWQgZm9yIAorCQljb21wbGV0ZW5lc3MsIGluIGNhc2UgdGhlcmUgaXMgYSBuZWVkIHRvIGRlc2NyaWJlIGFkZHJlc3NlcyAKKwkJaW4gUk9NLCBldGMuCisKKworTGl2ZSByYW5nZToKKy0tLS0tLS0tLS0tCisKKyAgICBUaGUgY29tcGlsZXIgYW5kIGRlYnVnZ2VyIHZpZXcgYSB2YXJpYWJsZSB3aXRoIG11bHRpcGxlIGhvbWVzIGFzCisgICAgYSBwcmltYXJ5IHN5bWJvbCBhbmQgYWxpYXNlcyBmb3IgdGhhdCBzeW1ib2wuICBUaGUgcHJpbWFyeSBzeW1ib2wKKyAgICBkZXNjcmliZXMgdGhlIGRlZmF1bHQgaG9tZSBvZiB0aGUgdmFyaWFibGUgd2hpbGUgYWxpYXNlcyBkZXNjcmliZQorICAgIGFsdGVybmF0ZSBob21lcyBmb3IgdGhlIHZhcmlhYmxlLgorCisgICAgQSBsaXZlIHJhbmdlIGRlZmluZXMgdGhlIGludGVydmFsIG9mIGluc3RydWN0aW9ucyBiZWdpbm5pbmcgd2l0aAorICAgIHJhbmdlX3N0YXJ0IGFuZCBlbmRpbmcgYXQgcmFuZ2VfZW5kLTEsIGFuZCBpcyB1c2VkIHRvIHNwZWNpZnkgYQorICAgIHJhbmdlIG9mIGluc3RydWN0aW9ucyB3aGVyZSBhbiBhbGlhcyBpcyBhY3RpdmUgb3IgImxpdmUiLiAgU28sCisgICAgdGhlIGFjdHVhbCBlbmQgb2YgdGhlIHJhbmdlIHdpbGwgYmUgb25lIGxlc3MgdGhhbiB0aGUgdmFsdWUgb2YgdGhlCisgICAgcmFuZ2VfZW5kIHN5bWJvbC4KKworICAgIFJhbmdlcyBkbyBub3QgaGF2ZSB0byBiZSBuZXN0ZWQuIEVnLiBUd28gcmFuZ2VzIG1heSBpbnRlcnNlY3Qgd2hpbGUgCisgICAgICAgIGVhY2ggcmFuZ2UgY29udGFpbnMgc3VicmFuZ2VzIHdoaWNoIGFyZSBub3QgaW4gdGhlIG90aGVyIHJhbmdlLgorCisgICAgVGhlcmUgZG9lcyBub3QgaGF2ZSB0byBiZSBhIDEtMSBtYXBwaW5nIGZyb20gcmFuZ2Vfc3RhcnQgdG8KKyAgICAgICAgcmFuZ2VfZW5kIHN5bWJvbHMuICBFZy4gVHdvIHJhbmdlX3N0YXJ0cyBjYW4gc2hhcmUgdGhlIHNhbWUgCisgICAgICAgIHJhbmdlX2VuZCwgd2hpbGUgb25lIHN5bWJvbCdzIHJhbmdlX3N0YXJ0IGNhbiBiZSBhbm90aGVyIHN5bWJvbCdzCisgICAgICAgIHJhbmdlX2VuZC4KKworICAgIFdoZW4gYSB2YXJpYWJsZSdzIHN0b3JhZ2UgY2xhc3MgY2hhbmdlcyAoZWcuIGZyb20gc3RhY2sgdG8gcmVnaXN0ZXIsCisJb3IgZnJvbSBvbmUgcmVnaXN0ZXIgdG8gYW5vdGhlciksIGEgbmV3IHN5bWJvbCBlbnRyeSB3aWxsIGJlCisJYWRkZWQgdG8gdGhlIHN5bWJvbCB0YWJsZSB3aXRoIHN0YWJzIGRlc2NyaWJpbmcgdGhlIG5ldyB0eXBlLAorCWFuZCBhcHByb3ByaWF0ZSBsaXZlIHJhbmdlcyByZWZlcmluZyB0byB0aGUgdmFyaWFibGUncyBpbml0aWFsCisJc3ltYm9sIGluZGV4LgorCisgICAgRm9yIHZhcmlhYmxlcyB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgc291cmNlIGJ1dCBvcHRpbWl6ZWQgYXdheSwKKyAgICAgICAgYSBzeW1ib2wgc2hvdWxkIGJlIGVtaXR0ZWQgd2l0aCB0aGUgbGl2ZSByYW5nZSBsKDAsMCkuCisKKyAgICBMaXZlIHJhbmdlcyBmb3IgYWxpYXNlcyBvZiBhIHBhcnRpY3VsYXIgdmFyaWFibGUgc2hvdWxkIGFsd2F5cworCWJlIGRpc2pvaW50LiAgT3ZlcmxhcHBpbmcgcmFuZ2VzIGZvciBhbGlhc2VzIG9mIHRoZSBzYW1lIHZhcmlhYmxlCisJd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGVycm9yIGJ5IHRoZSBkZWJ1Z2dlciwgYW5kIHRoZSBvdmVybGFwcGluZworCXJhbmdlIHdpbGwgYmUgaWdub3JlZC4KKworICAgIElmIG5vIGxpdmUgcmFuZ2UgaW5mb3JtYXRpb24gaXMgZ2l2ZW4sIHRoZSBsaXZlIHJhbmdlIHdpbGwgYmUgYXNzdW1lZCB0byAKKwlzcGFuIHRoZSBzeW1ib2wncyBlbnRpcmUgbGV4aWNhbCBzY29wZS4KKworCitOZXcgc3RhYnMgc3RyaW5nIGlkZW50aWZpZXJzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAiaWQiIGluICIjaWQiIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiByZWZlcnMgdG8gYSBudW1lcmljIHZhbHVlLgorCisgIE5ldyBzdGFiIHN5bnRheCBmb3IgbGl2ZSByYW5nZTogIGwoPHJlZl9mcm9tPiw8cmVmX3RvPikgCisKKyAgICA8cmVmX2Zyb20+IC0gIiNpZCIgd2hlcmUgI2lkIGlkZW50aWZpZXMgdGhlIHRleHQgc3ltYm9sIChyYW5nZSBzeW1ib2wpIHRvCisJCXVzZSBhcyB0aGUgc3RhcnQgb2YgbGl2ZSByYW5nZSAocmFuZ2Vfc3RhcnQpLiAgVGhlIHZhbHVlIGZvciAKKwkJdGhlIHJlZmVyZW5jZWQgdGV4dCBzeW1ib2wgaXMgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIAorCQlsaXZlIHJhbmdlLgorCisgICAgPHJlZl90bz4gLSAiI2lkIiB3aGVyZSAjaWQgaWRlbnRpZmllcyB0aGUgdGV4dCBzeW1ib2wgKHJhbmdlIHN5bWJvbCkgdG8KKwkJdXNlIGFzIHRoZSBlbmQgb2YgbGl2ZSByYW5nZSAocmFuZ2VfZW5kKS4gIFRoZSB2YWx1ZSBmb3IgCisJCXRoZSByZWZlcmVuY2VkIHRleHQgc3ltYm9sIGlzIE9ORSBCWVRFIFBBU1QgdGhlIGVuZGluZyAKKwkJYWRkcmVzcyBvZiB0aGUgbGl2ZSByYW5nZS4KKworCisgIE5ldyBzdGFiIHN5bnRheCBmb3IgaWRlbnRpZnlpbmcgc3ltYm9scy4KKworICAgIDxkZWY+IC0gIiNpZD0iCisKKwkgICAgVXNlczoKKwkgICAgICA8ZGVmPjxuYW1lPjo8dHlwZWRlZjE+Li4uCisJCSAgV2hlbiB1c2VkIGluIGZyb250IG9mIGEgc3ltYm9sIG5hbWUsICIjaWQ9IiBkZWZpbmVzIGEKKwkJICB1bmlxdWUgcmVmZXJlbmNlIG51bWJlciBmb3IgdGhpcyBzeW1ib2wuICBUaGUgcmVmZXJlbmNlCisJCSAgbnVtYmVyIGNhbiBiZSB1c2VkIGxhdGVyIHdoZW4gZGVmaW5pbmcgYWxpYXNlcyBmb3IgdGhpcworCQkgIHN5bWJvbC4KKwkgICAgICA8ZGVmPgorCQkgIFdoZW4gdXNlZCBhcyB0aGUgZW50aXJlIHN0YWIgc3RyaW5nLCAiI2lkPSIgaWRlbnRpZmllcyB0aGlzIAorCQkgIG5hbWVsZXNzIHN5bWJvbCBhcyBiZWluZyB0aGUgc3ltYm9sIGZvciB3aGljaCAiI2lkIiByZWZlcnMgdG8uCisKKworICAgIDxyZWY+IC0gIiNpZCIgd2hlcmUgIiNpZCIgcmVmZXJzIHRvIHRoZSBzeW1ib2wgZm9yIHdoaWNoIHRoZSBzdHJpbmcgCisJCSIjaWQ9IiBpZGVudGlmaWVzLgorCSAgICBVc2VzOgorCSAgICAgIDxyZWY+Ojx0eXBlZGVmMj47PGxpdmVyYW5nZT47PGxpdmVyYW5nZT4uLi4KKwkJICBEZWZpbmVzIGFuIGFsaWFzIGZvciB0aGUgc3ltYm9sIGlkZW50aWZpZWQgYnkgdGhlIHJlZmVyZW5jZQorCQkgIG51bWJlciBJRC4KKwkgICAgICBsKDxyZWYxPiw8cmVmMj4pCisJCSAgV2hlbiB1c2VkIHdpdGhpbiBhIGxpdmUgcmFuZ2UsICIjaWQiIHJlZmVycyB0byB0aGUgdGV4dCAKKwkJICBzeW1ib2wgaWRlbnRpZmllZCBieSAiI2lkPSIgdG8gdXNlIGFzIHRoZSByYW5nZSBzeW1ib2wuCisKKyAgICA8bGl2ZXJhbmdlPiAtICJsKDxyZWZfZnJvbT4sPHJlZl90bz4pIiAtIHNwZWNpZmllcyBhIGxpdmUgcmFuZ2UgZm9yIGEgCisJCXN5bWJvbC4gIE11bHRpcGxlICJsIiBzcGVjaWZpZXJzIGNhbiBiZSBjb21iaW5lZCB0byByZXByZXNlbnQgCisJCW11dGlwbGUgbGl2ZSByYW5nZXMsIHNlcGFyYXRlZCBieSBzZW1pY29sb25zLgorCisKKworCitFeGFtcGxlOgorPT09PT09PT0KKworQ29uc2lkZXIgYSBwcm9ncmFtIG9mIHRoZSBmb3JtOgorCisgICAgdm9pZCBmb28oKXsKKyAgICAgIGludCBhID0gLi4uOworICAgICAgLi4uCisgICAgICB3aGlsZSAoYi0tKQorICAgICAgIGMgKz0gYTsKKyAgICAgIC4uCisgICAgICBkID0gYTsKKyAgICAgIC4uCisgICAgfQorCitBc3N1bWUgdGhhdCAiYSIgbGl2ZXMgaW4gdGhlIHN0YWNrIGF0IG9mZnNldCAtOCwgZXhjZXB0IGZvciBpbnNpZGUgdGhlCitsb29wIHdoZXJlICJhIiByZXNpZGVzIGluIHJlZ2lzdGVyICJyNSIuCisKK1RoZSB3YXkgdG8gZGVzY3JpYmUgdGhpcyBpcyB0byBjcmVhdGUgYSBzdGFiIGZvciB0aGUgdmFyaWFibGUgImEiIHdoaWNoCitkZXNjcmliZXMgImEiIGFzIGxpdmluZyBpbiB0aGUgc3RhY2sgYW5kIGFuIGFsaWFzIGZvciB0aGUgdmFyaWFibGUgImEiCit3aGljaCBkZXNjcmliZXMgaXQgYXMgbGl2aW5nIGluIHJlZ2lzdGVyICJyNSIgaW4gdGhlIGxvb3AuCisKK0xldCdzIGFzc3VtZSB0aGF0ICIjMSIgYW5kICIjMiIgYXJlIHN5bWJvbHMgd2hpY2ggYm91bmQgdGhlIGFyZWEgd2hlcmUKKyJhIiBsaXZlcyBpbiBhIHJlZ2lzdGVyLgorCitUaGUgc3RhYnMgdG8gZGVzY3JpYmUgImEiIGFuZCBpdHMgYWxpYXMgd291bGQgbG9vayBsaWtlIHRoaXM6CisKKyAgICAgICAgLnN0YWJzICIjMz1hOjEiLDEyOCwwLDgsLTgKKyAgICAgICAgLnN0YWJzICIjMzpyMTtsKCMxLCMyKSIsNjQsMCwwLDUKKworCitUaGlzIGRlc2lnbiBpbXBsaWVzIHRoYXQgdGhlIGRlYnVnZ2VyIHdpbGwga2VlcCBhIGNoYWluIG9mIGFsaWFzZXMgZm9yCithbnkgZ2l2ZW4gdmFyaWFibGUgd2l0aCBhbGlhc2VzIGFuZCB0aGF0IGNoYWluIHdpbGwgYmUgc2VhcmNoZWQgZmlyc3QKK3RvIGZpbmQgb3V0IGlmIGFuIGFsaWFzIGlzIGFjdGl2ZS4gIElmIG5vIGFsaWFzIGlzIGFjdGl2ZSwgdGhlbiB0aGUKK2RlYnVnZ2VyIHdpbGwgYXNzdW1lIHRoYXQgdGhlIG1haW4gdmFyaWFibGUgaXMgYWN0aXZlLgpkaWZmIC0tZ2l0IGEvZ2RiL2RvYy9NYWtlZmlsZS5pbiBiL2dkYi9kb2MvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJjZDYyZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9kb2MvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwzNDAgQEAKKyMjQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIE1ha2VmaWxlIGZvciBHREIgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworc3JjZGlyID0gQHNyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKKworcHJlZml4ID0gQHByZWZpeEAKKworaW5mb2RpciA9IEBpbmZvZGlyQAorCitTSEVMTCA9IEBTSEVMTEAKKworSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACisKKyMgbWFpbiBHREIgc291cmNlIGRpcmVjdG9yeQorZ2RiZGlyID0gJChzcmNkaXIpLy4uCisKKyMgd2hlcmUgdG8gZmluZCB0ZXhpbmZvOyBHREIgZGlzdCBzaG91bGQgaW5jbHVkZSBhIHJlY2VudCBvbmUKK1RFWElESVI9JHtnZGJkaXJ9Ly4uL3RleGluZm8KKworIyB3aGVyZSB0byBmaW5kIG1ha2VpbmZvLCBwcmVmZXJhYmx5IG9uZSBkZXNpZ25lZCBmb3IgdGV4aW5mby0yCitNQUtFSU5GTz1tYWtlaW5mbworCisjIHdoZXJlIHRvIGZpbmQgdGV4aTJyb2ZmLCBkaXR0bworVEVYSTJST0ZGPXRleGkycm9mZgorCisjIFdoZXJlIGlzIHRoZSBzb3VyY2UgZGlyIGZvciB0aGUgUkVBRExJTkUgbGlicmFyeSBkb2M/ICAKKyMgVHJhZGl0aW9uYWxseSByZWFkbGluZSBpcyBpbiAuLiBvciAuCitSRUFETElORV9ESVIgPSAke2dkYmRpcn0vLi4vcmVhZGxpbmUvZG9jCisKK1NFVF9URVhJTlBVVFMgPSBURVhJTlBVVFM9JHtURVhJRElSfTouOiQoc3JjZGlyKTokKFJFQURMSU5FX0RJUik6JCRURVhJTlBVVFMKKworIyBUaGVyZSBtYXkgYmUgYWx0ZXJuYXRlIHByZWRlZmluZWQgY29sbGVjdGlvbnMgb2Ygc3dpdGNoZXMgdG8gY29uZmlndXJlCisjIHRoZSBHREIgbWFudWFsLiAgTm9ybWFsbHkgdGhpcyBpcyBub3QgZG9uZSBpbiBzeW5jaCB3aXRoIHRoZSBzb2Z0d2FyZQorIyBjb25maWcgc3lzdGVtLCBzaW5jZSB0aGlzIGNob2ljZSB0ZW5kcyB0byBiZSBpbmRlcGVuZGVudDsgbW9zdCBwZW9wbGUKKyMgd2FudCBhIGRvYyBjb25maWcgb2YgYGFsbCcgZm9yIGEgZ2VuZXJpYyBtYW51YWwsIHJlZ2FyZGxlc3Mgb2Ygc3cgY29uZmlnLgorRE9DX0NPTkZJRyA9IGFsbAorCisjIFRoaXMgbGlzdCBvZiBzZWQgZWRpdHMgd2lsbCBlZGl0IHRoZSBHREIgcmVmZXJlbmNlIGNhcmQKKyMgZm9yIHdoYXQgZm9udHMgYW5kIHdoYXQgcGFwZXJzaXplIHRvIHVzZS4KKyMgQnkgZGVmYXVsdCAoTk8gZWRpdHMgYXBwbGllZCksIHRoZSByZWZjYXJkIHVzZXM6CisjICAgIC0gQ29tcHV0ZXIgTW9kZXJuIChDTSkgZm9udHMKKyMgICAgLSBVUyBsZXR0ZXIgcGFwZXIgKDguNXgxMWluKQorIyBMaXN0IHNvbWUgb2YgdGhlIGZvbGxvd2luZyBmaWxlcyBmb3IgYWx0ZXJuYXRpdmUgZm9udHMgYW5kIHBhcGVyOgorIyAgYTRyYy5zZWQgICAgIHVzZSBBNCBwYXBlciAoMjk3IHggMjEwIG1tKQorIyAgcHNyYy5zZWQgICAgIHVzZSBQb3N0U2NyaXB0IGZvbnRzIChLYXJsIEJlcnJ5IHNob3J0IFRlWCBuYW1lcykKKyMgbHBzcmMuc2VkICAgICB1c2UgUG9zdFNjcmlwdCBmb250cyAoZnVsbCBQb3N0U2NyaXB0IG5hbWVzIGluIFRlWCkKKyMgZS5nLiBmb3IgQTQsIFBvc3RzY3JpcHQ6ICBSRUZFRElUUyA9IGE0cmMuc2VkIHBzcmMuc2VkCisjICAgICAgZm9yIEE0LCBDTSBmb250czogICAgUkVGRURJVFMgPSBhNHJjLnNlZAorIyAgICAgIGZvciBVUywgUFMgZm9udHM6ICAgIFJFRkVESVRTID0gcHNyYy5zZWQKKyMgICAgICBmb3IgZGVmYXVsdDoKK1JFRkVESVRTID0KKworIyBEb24gS251dGgncyBUZVggZm9ybWF0dGVyCitURVggPSB0ZXgKKworIyBhdXhpbGlhcnkgcHJvZ3JhbSBmb3Igc29ydGluZyBUZXhpbmZvIGluZGljZXMKK1RFWElOREVYID0gdGV4aW5kZXgKKworIyBQcm9ncmFtIHRvIGdlbmVyYXRlIFBvc3RzY3JpcHQgZmlsZXMgZnJvbSBEVkkgZmlsZXMuCitEVklQUyA9IGR2aXBzCisKKyMgTWFpbiBHREIgbWFudWFsJ3Mgc291cmNlIGZpbGVzCitTRklMRVNfSU5DTFVERUQgPSBnZGItY2ZnLnRleGkgJChzcmNkaXIpL3JlbW90ZS50ZXhpCisKK1NGSUxFU19MT0NBTCA9ICQoc3JjZGlyKS9nZGIudGV4aW5mbyBHREJ2bi50ZXhpICQoU0ZJTEVTX0lOQ0xVREVEKQorCitTRklMRVNfRE9DID0gJChTRklMRVNfTE9DQUwpIFwKKyAgICAgICAgICAgICAgICAkKFJFQURMSU5FX0RJUikvcmx1c2VyLnRleGluZm8gJChSRUFETElORV9ESVIpL2luYy1oaXN0LnRleGkKKworIyMjIyBIb3N0LCB0YXJnZXQsIGFuZCBzaXRlIHNwZWNpZmljIE1ha2VmaWxlIGZyYWdtZW50cyBjb21lIGluIGhlcmUuCisjIyMKKworYWxsIGluc3RhbGw6CisKK2luZm86IGdkYi5pbmZvIGdkYmludC5pbmZvIHN0YWJzLmluZm8KK2R2aTogZ2RiLmR2aSBnZGJpbnQuZHZpIHN0YWJzLmR2aSByZWZjYXJkLmR2aQorcHM6IGdkYi5wcyBnZGJpbnQucHMgc3RhYnMucHMgcmVmY2FyZC5wcworYWxsLWRvYzogaW5mbyBkdmkgcHMKKworaW5zdGFsbC1pbmZvOiBpbmZvCisJZm9yIGkgaW4gKi5pbmZvKiA7IGRvIFwKKwkJJChJTlNUQUxMX0RBVEEpICQkaSAkKGluZm9kaXIpLyQkaSA7IFwKKwlkb25lCisKK1NUQUdFU1RVRkYgPSAqLmluZm8qIGdkYi1hbGwudGV4aSBHREJ2bi50ZXhpICoucHMgKi5kdmkKKworIyBDb3B5IHRoZSBvYmplY3QgZmlsZXMgZnJvbSBhIHBhcnRpY3VsYXIgc3RhZ2UgaW50byBhIHN1YmRpcmVjdG9yeS4KK3N0YWdlMTogZm9yY2UKKwktbWtkaXIgc3RhZ2UxCisJLW12ICQoU1RBR0VTVFVGRikgc3RhZ2UxCisKK3N0YWdlMjogZm9yY2UKKwktbWtkaXIgc3RhZ2UyCisJLW12ICQoU1RBR0VTVFVGRikgc3RhZ2UyCisKK3N0YWdlMzogZm9yY2UKKwktbWtkaXIgc3RhZ2UzCisJLW12ICQoU1RBR0VTVFVGRikgc3RhZ2UzCisKK2FnYWluc3Q9c3RhZ2UyCisKK2NvbXBhcmlzb246IGZvcmNlCisJZm9yIGkgaW4gJChTVEFHRVNUVUZGKSA7IGRvIGNtcCAkJGkgJChhZ2FpbnN0KS8kJGkgOyBkb25lCisKK2RlLXN0YWdlMTogZm9yY2UKKwktKGNkIHN0YWdlMSA7IG12IC1mICogLi4pCisJLXJtZGlyIHN0YWdlMQorCitkZS1zdGFnZTI6IGZvcmNlCisJLShjZCBzdGFnZTIgOyBtdiAtZiAqIC4uKQorCS1ybWRpciBzdGFnZTIKKworZGUtc3RhZ2UzOiBmb3JjZQorCS0oY2Qgc3RhZ2UzIDsgbXYgLWYgKiAuLikKKwktcm1kaXIgc3RhZ2UzCisKKyMgVGhlICJsZWFzdCBjbGVhbiIgbGV2ZWwgb2YgY2xlYW5pbmcuICBHZXQgcmlkIG9mIGZpbGVzIHdoaWNoIGFyZQorIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlcyB0aGF0IGFyZSBqdXN0IGludGVybWVkaWF0ZSBmaWxlcywKKyMgCittb3N0bHljbGVhbjoKKwlybSAtZiBnZGIubW0gZ2RiLm1zIGdkYi5tZSBsaW5rczJyb2ZmCisJcm0gLWYgKi5hdXggKi5jcCogKi5mbiogKi5reSogKi5sb2cgKi5wZyogKi50b2MgKi50cCogKi52cioKKwlybSAtZiBzZWRyZWYuZHZpIHNlZHJlZi50ZXggdG1wLnNlZAorCitjbGVhbjogbW9zdGx5Y2xlYW4KKwlybSAtZiBybHVzZXIudGV4aW5mbyBpbmMtaGlzdC50ZXhpIGdkYi1jZmcudGV4aQorCitkaXN0Y2xlYW46IGNsZWFuCisJcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cworCisjIEdEQnZuLnRleGksIHRoZSBkdmkgZmlsZXMsIHRoZSBpbmZvIGZpbGVzLCBhbmQgdGhlIHBvc3RzY3JpcHQgZmlsZXMsIAorIyBhcmUgYWxsIHBhcnQgb2YgdGhlIGRpc3RyaWJ1dGlvbiwgc28gaXQgc2hvdWxkIG5vdCBiZSByZW1vdmVkIGJ5CisjICJjbGVhbiIgb3IgImRpc3RjbGVhbiIuICBVc2UgbWFpbnRhaW5lci1jbGVhbiB0byByZW1vdmUgdGhlbS4KKworbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW46IGRpc3RjbGVhbgorCXJtIC1mIEdEQnZuLnRleGkgKi5pbmZvKiAqLmR2aSAqLnBzCisKKyMgR0RCIFFVSUNLIFJFRkVSRU5DRSAoZHZpIG91dHB1dCkKK3JlZmNhcmQuZHZpIDogcmVmY2FyZC50ZXggJChSRUZFRElUUykKKwlpZiBbIC16ICIkKFJFRkVESVRTKSIgXTsgdGhlbiBcCisJCWNwICQoc3JjZGlyKS9yZWZjYXJkLnRleCBzZWRyZWYudGV4IDsgXAorCWVsc2UgXAorCQllY2hvID4gdG1wLnNlZCA7IFwKKwkJZm9yIGYgaW4gIiQoUkVGRURJVFMpIiA7IGRvIFwKKwkJCWNhdCAkKHNyY2RpcikvJCRmID4+dG1wLnNlZCA7IGRvbmUgOyBcCisJCXNlZCAtZiB0bXAuc2VkICQoc3JjZGlyKS9yZWZjYXJkLnRleCA+c2VkcmVmLnRleCA7IFwKKwlmaQorCSQoU0VUX1RFWElOUFVUUykgJChURVgpIHNlZHJlZi50ZXgKKwltdiBzZWRyZWYuZHZpIHJlZmNhcmQuZHZpCisJcm0gLWYgc2VkcmVmLmxvZyBzZWRyZWYudGV4IHRtcC5zZWQKKworcmVmY2FyZC5wcyA6IHJlZmNhcmQuZHZpCisJJChEVklQUykgLXQgbGFuZHNjYXBlIC1vICRAICQ/CisKKyMgRmlsZSB0byByZWNvcmQgY3VycmVudCBHREIgdmVyc2lvbiBudW1iZXIgKGNvcGllZCBmcm9tIG1haW4gZGlyIE1ha2VmaWxlLmluKQorR0RCdm4udGV4aSA6ICR7Z2RiZGlyfS9NYWtlZmlsZS5pbgorCWVjaG8gIkBzZXQgR0RCVk4gYHNlZCA8JChzcmNkaXIpLy4uL01ha2VmaWxlLmluIC1uICdzL15WRVJTSU9OICo9ICovL3AnYCIgPiAuL0dEQnZuLm5ldworCW12IEdEQnZuLm5ldyBHREJ2bi50ZXhpCisKKyMgVXBkYXRlZCBhdG9taWNhbGx5CisuUFJFQ0lPVVM6IEdEQnZuLnRleGkKKworIyBDaG9vc2UgY29uZmlndXJhdGlvbiBmb3IgR0RCIG1hbnVhbCAobm9ybWFsbHkgYGFsbCc7IG5vcm1hbGx5IG5vdCB0aWVkIGludG8KKyMgYGNvbmZpZ3VyZScgc2NyaXB0IGJlY2F1c2UgbW9zdCB1c2VycyBwcmVmZXIgZ2VuZXJpYyB2ZXJzaW9uIG9mIG1hbnVhbCwKKyMgbm90IG9uZSBmb3IgdGhlaXIgYmluYXJ5IGNvbmZpZy0tLXdoaWNoIG1heSBub3QgYmUgc3BlY2lmaWNhbGx5CisjIGRlZmluZWQgYW55d2F5cykuCitnZGItY2ZnLnRleGk6ICR7c3JjZGlyfS8ke0RPQ19DT05GSUd9LWNmZy50ZXhpCisJbG4gLXMgJHtzcmNkaXJ9LyR7RE9DX0NPTkZJR30tY2ZnLnRleGkgZ2RiLWNmZy50ZXhpIHx8IFwKKwlsbiAke3NyY2Rpcn0vJHtET0NfQ09ORklHfS1jZmcudGV4aSBnZGItY2ZnLnRleGkgfHwgXAorCWNwICR7c3JjZGlyfS8ke0RPQ19DT05GSUd9LWNmZy50ZXhpIGdkYi1jZmcudGV4aQorCisjIEdEQiBNQU5VQUw6IHRleGluZm8gc291cmNlLCB1c2luZyBAc2V0L0BjbGVhci9AdmFsdWUvQGlmc2V0L0BpZmNsZWFyCisjIElmIHlvdXIgdGV4aW5mbyBvciBtYWtlaW5mbyBkb24ndCBzdXBwb3J0IHRoZXNlLCBnZXQgYSBuZXcgdGV4aW5mbyByZWxlYXNlCisjCisjIFRoZSBub25zZW5zZSB3aXRoIEdEQnZuLnRleGkgZ2V0cyB0aGlzIHRvIHJ1biB3aXRoIGJvdGggU3VuIGFuZCBHTlUgbWFrZS4KKyMgICBOb3RlIHRoYXQgd2UgY2FuICpnZW5lcmF0ZSogR0RCdm4udGV4aSwgYnV0IHNpbmNlIHdlIGRpc3RyaWJ1dGUgb25lIGluIHRoZQorIyAgIHNvdXJjZSBkaXJlY3RvcnkgZm9yIHRoZSBiZW5lZml0IG9mIHBlb3BsZSB3aG8gKmRvbid0KiB1c2UgdGhpcyBtYWtlZmlsZSwKKyMgICBWUEFUSCB3aWxsIG9mdGVuIHRlbGwgbWFrZSBub3QgdG8gYm90aGVyIGJ1aWxkaW5nIGl0LCBiZWNhdXNlIHRoZSBvbmUKKyMgICBpbiB0aGUgc3JjZGlyIGlzIHVwIHRvIGRhdGUuICAoaWYgbm90LCB0aGVuIG1ha2Ugc2hvdWxkIGJ1aWxkIG9uZSBoZXJlKS4KKworIyBHREIgTUFOVUFMOiBUZVggZHZpIGZpbGUKK2dkYi5kdmk6ICR7U0ZJTEVTX0RPQ30KKwlpZiBbICEgLWYgLi9HREJ2bi50ZXhpIF07IHRoZW4gXAorCQlsbiAtcyAkKHNyY2RpcikvR0RCdm4udGV4aSAuIHx8IFwKKwkJbG4gJChzcmNkaXIpL0dEQnZuLnRleGkgLiB8fCBcCisJCWNwICQoc3JjZGlyKS9HREJ2bi50ZXhpIC4gOyBlbHNlIHRydWU7IGZpCisJJChTRVRfVEVYSU5QVVRTKSAkKFRFWCkgZ2RiLnRleGluZm8KKwkkKFNFVF9URVhJTlBVVFMpICQoVEVYKSBnZGIudGV4aW5mbworCSQoVEVYSU5ERVgpIGdkYi4/PworCSQoU0VUX1RFWElOUFVUUykgJChURVgpIGdkYi50ZXhpbmZvCisJcm0gLWYgZ2RiLmF1eCBnZGIuY3AqIGdkYi5mbiogZ2RiLmt5KiBnZGIubG9nIGdkYi5wZyogZ2RiLnRvYyBcCisJCWdkYi50cCogZ2RiLnZyKgorCitnZGIucHM6IGdkYi5kdmkKKwkkKERWSVBTKSAtbyAkQCAkPworCisjIEdEQiBNQU5VQUw6IGluZm8gZmlsZQorIyBXZSdyZSB1c2luZyB0ZXhpbmZvMiwgYW5kIG9sZGVyIG1ha2VpbmZvJ3MgbWF5IG5vdCBiZSBhYmxlIHRvCisjIGNvcGUgd2l0aCBhbGwgdGhlIG1hcmt1cC4gIAorZ2RiLmluZm86ICR7U0ZJTEVTX0RPQ30KKwkkKE1BS0VJTkZPKSAtSSAke1JFQURMSU5FX0RJUn0gLUkgJChzcmNkaXIpIC1vIC4vZ2RiLmluZm8gZ2RiLnRleGluZm8KKworIyBHREIgTUFOVUFMOiByb2ZmIHRyYW5zbGF0aW9ucworIyBUcnkgdG8gdXNlIGEgcmVjZW50IHRleGkycm9mZi4gIHYyIHdhcyBwdXQgb24gcHJlcCBpbiBqYW45MS4KKyMgSWYgeW91IHdhbnQgYW4gaW5kZXgsIHNlZSB0ZXhpMnJvZmYgZG9jIGZvciBwb3N0cHJvY2Vzc2luZyAKKyMgYW5kIGFkZCAtaSB0byB0ZXhpMnJvZmYgaW52b2NhdGlvbnMgYmVsb3cuCisjIFdvcmthcm91bmRzIGZvciB0ZXhpMnJvZmYtMiAocHJvYmFibHkgZml4ZWQgaW4gbGF0ZXIgdGV4aTJyb2ZmJ3MsIGRlbGV0ZQorIyAgICBjb3JyZXNwb25kaW5nIC1lIGxpbmVzIHdoZW4gbGF0ZXIgdGV4aTJyb2ZmJ3MgYXJlIGN1cnJlbnQpCisjICsgQGlmaW5mbydzIGRlbGV0ZWQgZXhwbGljaXRseSBkdWUgdG8gdGV4aTJyb2ZmLTIgYnVnIHcgbmVzdGVkIGNvbnN0cnVjdHMuCisjICsgQGMncyBkZWxldGVkIGV4cGxpY2l0bHkgYmVjYXVzZSB0ZXhpMnJvZmYgc2VlcyB0ZXhpbmZvIGNvbW1hbmRzIGluIHRoZW0KKyMgKyBAICAgKHRoYXQncyBhdC1CTEFOSykgbm90IHJlY29nbml6ZWQgYnkgdGV4aTJyb2ZmLCB0dXJuZWQgaW50byBibGFuaworIyArIEBhbHBoYWVudW1lcmF0ZSBpcyByaWRpY3Vsb3VzbHkgbmV3LCB0dXJuZWQgaW50byBAZW51bWVyYXRlCisKKyMgdGV4aTJyb2ZmIGRvZXNuJ3QgaGF2ZSBhIG5vdGlvbiBvZiBpbmNsdWRlIGRpcnMsIHNvIHdlIGhhdmUgdG8gZmFrZSAKKyMgaXQgb3V0IGZvciBnZGIgbWFudWFsJ3MgaW5jbHVkZSBmaWxlcy0tLWJ1dCBvbmx5IGlmIG5vdCBjb25maWd1cmVkCisjIGluIG1haW4gc291cmNlZGlyLgorbGlua3Mycm9mZjogJChTRklMRVNfSU5DTFVERUQpCisJaWYgWyAhIC1mIGdkYi50ZXhpbmZvIF07IHRoZW4gXAorCQlsbiAtcyAkKFNGSUxFU19JTkNMVURFRCkgLiB8fCBcCisJCWxuICQoU0ZJTEVTX0lOQ0xVREVEKSAgICAuIHx8IFwKKwkJY3AgJChTRklMRVNfSU5DTFVERUQpICAgIC4gOyBcCisJZmkKKwl0b3VjaCBsaW5rczJyb2ZmCisKKyMgICJSZWFkbGluZSIgYXBwZW5kaWNlcy4gIEdldCB0aGVtIGFsc28gZHVlIHRvIGxhY2sgb2YgaW5jbHVkZXMsIAorIyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IGNvbmZpZ3VyaW5nIGluIG1haW4gc291cmNlZGlyLgorIyBAZnRhYmxlIHJlbW92ZWQgZHVlIHRvIGJ1ZyBpbiB0ZXhpMnJvZmYtMjsgaWYgeW91ciB0ZXhpMnJvZmYKKyMgaXMgbmV3ZXIsIHRyeSBqdXN0IGxuIG9yIGNwCitybHVzZXIudGV4aW5mbzogJHtSRUFETElORV9ESVJ9L3JsdXNlci50ZXhpbmZvCisJCXNlZCAtZSAncy9eQGZ0YWJsZS9AdGFibGUvZycgXAorCQktZSAncy9eQGVuZCBmdGFibGUvQGVuZCB0YWJsZS9nJyBcCisJCSR7UkVBRExJTkVfRElSfS9ybHVzZXIudGV4aW5mbyA+IC4vcmx1c2VyLnRleGluZm8KKworaW5jLWhpc3QudGV4aTogJHtSRUFETElORV9ESVJ9L2luYy1oaXN0LnRleGkKKwlsbiAtcyAke1JFQURMSU5FX0RJUn0vaW5jLWhpc3QudGV4aSAuIHx8IFwKKwlsbiAke1JFQURMSU5FX0RJUn0vaW5jLWhpc3QudGV4aSAuIHx8IFwKKwljcCAke1JFQURMSU5FX0RJUn0vaW5jLWhpc3QudGV4aSAuCisKKyMgZ2RiIG1hbnVhbCBzdWl0YWJsZSBmb3IgW2d0bl1yb2ZmIC1tZQorZ2RiLm1lOiAkKFNGSUxFU19MT0NBTCkgbGlua3Mycm9mZiBybHVzZXIudGV4aW5mbyBpbmMtaGlzdC50ZXhpCisJc2VkIC1lICcvXFxpbnB1dCB0ZXhpbmZvL2QnIFwKKwkJLWUgJy9AYyBURVhJMlJPRkYtS0lMTC8sL0BjIEVORCBURVhJMlJPRkYtS0lMTC9kJyBcCisJCS1lICcvXkBpZmluZm8vLC9eQGVuZCBpZmluZm8vZCcgXAorCQktZSAnL15AYyAvZCcgXAorCQktZSAncy97LiosLC97LycgXAorCQktZSAncy9AIC8gL2cnIFwKKwkJLWUgJ3MvXkBhbHBoYWVudW1lcmF0ZS9AZW51bWVyYXRlL2cnIFwKKwkJLWUgJ3MvXkBlbmQgYWxwaGFlbnVtZXJhdGUvQGVuZCBlbnVtZXJhdGUvZycgXAorCQkkKHNyY2RpcikvZ2RiLnRleGluZm8gfCBcCisJJChURVhJMlJPRkYpIC1tZSB8IFwKKwlzZWQgLWUgJ3MvLS0tL1xcKGVtL2cnIFwKKwk+Z2RiLm1lIAorCisjIGdkYiBtYW51YWwgc3VpdGFibGUgZm9yIFtndG5dcm9mZiAtbXMKK2dkYi5tczogJChTRklMRVNfTE9DQUwpIGxpbmtzMnJvZmYgcmx1c2VyLnRleGluZm8gaW5jLWhpc3QudGV4aQorCXNlZCAtZSAnL1xcaW5wdXQgdGV4aW5mby9kJyBcCisJCS1lICcvQGMgVEVYSTJST0ZGLUtJTEwvLC9AYyBFTkQgVEVYSTJST0ZGLUtJTEwvZCcgXAorCQktZSAnL15AaWZpbmZvLywvXkBlbmQgaWZpbmZvL2QnIFwKKwkJLWUgJy9eQGMgL2QnIFwKKwkJLWUgJ3Mvey4qLCwvey8nIFwKKwkJLWUgJ3MvQCAvIC9nJyBcCisJCS1lICdzL15AYWxwaGFlbnVtZXJhdGUvQGVudW1lcmF0ZS9nJyBcCisJCS1lICdzL15AZW5kIGFscGhhZW51bWVyYXRlL0BlbmQgZW51bWVyYXRlL2cnIFwKKwkJJChzcmNkaXIpL2dkYi50ZXhpbmZvIHwgXAorCSQoVEVYSTJST0ZGKSAtbXMgfCBcCisJc2VkIC1lICdzLy0tLS9cXChlbS9nJyBcCisJPmdkYi5tcyAKKworIyBnZGIgbWFudWFsIHN1aXRhYmxlIGZvciBbdG5dcm9mZiAtbW0KKyMgJ0Bub2luZGVudCdzIHJlbW92ZWQgZHVlIHRvIHRleGkycm9mZi0yIG1tIGJ1ZzsgaWYgeW91cnMgaXMgbmV3ZXIsIAorIyAgIHRyeSBsZWF2aW5nIHRoZW0gaW4KK2dkYi5tbTogJChTRklMRVNfTE9DQUwpIGxpbmtzMnJvZmYgcmx1c2VyLnRleGluZm8gaW5jLWhpc3QudGV4aQorCXNlZCAtZSAnL1xcaW5wdXQgdGV4aW5mby9kJyBcCisJCS1lICcvQGMgVEVYSTJST0ZGLUtJTEwvLC9AYyBFTkQgVEVYSTJST0ZGLUtJTEwvZCcgXAorCQktZSAnL15AaWZpbmZvLywvXkBlbmQgaWZpbmZvL2QnIFwKKwkJLWUgJy9eQGMgL2QnIFwKKwkJLWUgJ3Mvey4qLCwvey8nIFwKKwkJLWUgJy9Abm9pbmRlbnQvZCcgXAorCQktZSAncy9AIC8gL2cnIFwKKwkJLWUgJ3MvXkBhbHBoYWVudW1lcmF0ZS9AZW51bWVyYXRlL2cnIFwKKwkJLWUgJ3MvXkBlbmQgYWxwaGFlbnVtZXJhdGUvQGVuZCBlbnVtZXJhdGUvZycgXAorCQkkKHNyY2RpcikvZ2RiLnRleGluZm8gfCBcCisJJChURVhJMlJPRkYpIC1tbSB8IFwKKwlzZWQgLWUgJ3MvLS0tL1xcKGVtL2cnIFwKKwk+Z2RiLm1tIAorCisKKyMgR0RCIElOVEVSTkFMUyBNQU5VQUw6IFRlWCBkdmkgZmlsZQorZ2RiaW50LmR2aSA6IGdkYmludC50ZXhpbmZvCisJJChTRVRfVEVYSU5QVVRTKSAkKFRFWCkgZ2RiaW50LnRleGluZm8KKwkkKFRFWElOREVYKSBnZGJpbnQuPz8KKwkkKFNFVF9URVhJTlBVVFMpICQoVEVYKSBnZGJpbnQudGV4aW5mbworCXJtIC1mIGdkYmludC5hdXggZ2RiaW50LmNwKiBnZGJpbnQuZm4qIGdkYmludC5reSogXAorCQlnZGJpbnQubG9nIGdkYmludC5wZyogZ2RiaW50LnRvYyBnZGJpbnQudHAqIGdkYmludC52cioKKworZ2RiaW50LnBzIDogZ2RiaW50LmR2aQorCSQoRFZJUFMpIC1vICRAICQ/CisKKyMgR0RCIElOVEVSTkFMUyBNQU5VQUw6IGluZm8gZmlsZQorCitnZGJpbnQuaW5mbzogZ2RiaW50LnRleGluZm8KKwkkKE1BS0VJTkZPKSAtbyBnZGJpbnQuaW5mbyAkKHNyY2RpcikvZ2RiaW50LnRleGluZm8KKworc3RhYnMuaW5mbzogc3RhYnMudGV4aW5mbworCSQoTUFLRUlORk8pIC1vIHN0YWJzLmluZm8gJChzcmNkaXIpL3N0YWJzLnRleGluZm8KKworIyBTVEFCUyBET0NVTUVOVEFUSU9OOiBUZVggZHZpIGZpbGUKK3N0YWJzLmR2aSA6IHN0YWJzLnRleGluZm8KKwkkKFNFVF9URVhJTlBVVFMpICQoVEVYKSBzdGFicy50ZXhpbmZvCisJJChURVhJTkRFWCkgc3RhYnMuPz8KKwkkKFNFVF9URVhJTlBVVFMpICQoVEVYKSBzdGFicy50ZXhpbmZvCisJcm0gLWYgc3RhYnMuYXV4IHN0YWJzLmNwKiBzdGFicy5mbiogc3RhYnMua3kqIFwKKwkJc3RhYnMubG9nIHN0YWJzLnBnKiBzdGFicy50b2Mgc3RhYnMudHAqIHN0YWJzLnZyKgorCitzdGFicy5wczogc3RhYnMuZHZpCisJJChEVklQUykgLW8gJEAgJD8KKworZm9yY2U6CisKK01ha2VmaWxlOiBNYWtlZmlsZS5pbiAkKGhvc3RfbWFrZWZpbGVfZnJhZykgJCh0YXJnZXRfbWFrZWZpbGVfZnJhZykgY29uZmlnLnN0YXR1cworCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwpkaWZmIC0tZ2l0IGEvZ2RiL2RvYy9hNHJjLnNlZCBiL2dkYi9kb2MvYTRyYy5zZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5MjI5MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9kb2MvYTRyYy5zZWQKQEAgLTAsMCArMSwxMSBAQAorLy0tLSBQYXBlcnNpemUgcGFyYW1zOi8sLy0tLSBlbmQgcGFwZXJzaXplIHBhcmFtcy9jXAorJS0tLS0tLS0gUGFwZXJzaXplIHBhcmFtczpcCislJSAgQTQgcGFwZXIgKDI5N3gyMTBtbSlcCislJVwKK1xcdG90YWx3aWR0aD0yOTdtbSAgICUgdG90YWwgd2lkdGggb2YgcGFwZXJcCitcXHRvdGFsaGVpZ2h0PTIxMG1tICAlIHRvdGFsIGhlaWdodCBvZiBwYXBlclwKK1xcaG1hcmdpbj01bW0gICAgICAgICUgaG9yaXpvbnRhbCBtYXJnaW4gd2lkdGhcCitcXHZtYXJnaW49MTBtbSAgICAgICAlIHZlcnRpY2FsIG1hcmdpbiB3aWR0aFwKK1xcc2Vjc2tpcD0uNnBjICAgICAgICUgc3BhY2UgYmV0d2VlbiByZWZjYXJkIHNlY3NcCitcXGxza2lwPTFwdCAgICAgICAgICAlIGV4dHJhIHNraXAgYmV0d2VlbiBcXHNlYyBlbnRyaWVzXAorJS0tLS0tLS0gZW5kIHBhcGVyc2l6ZSBwYXJhbXMKZGlmZiAtLWdpdCBhL2dkYi9kb2MvYWdlbnRleHByLnRleGkgYi9nZGIvZG9jL2FnZW50ZXhwci50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzkwZjUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZG9jL2FnZW50ZXhwci50ZXhpCkBAIC0wLDAgKzEsODM5IEBACitcaW5wdXQgdGV4aW5mbworQGMgJSoqc3RhcnQgb2YgaGVhZGVyCitAc2V0ZmlsZW5hbWUgYWdlbnRleHByLmluZm8KK0BzZXR0aXRsZSBHREIgQWdlbnQgRXhwcmVzc2lvbnMKK0BzZXRjaGFwdGVybmV3cGFnZSBvZmYKK0BjICUqKmVuZCBvZiBoZWFkZXIKKworUmV2aXNpb246ICRJZCQKKworQG5vZGUgVGhlIEdEQiBBZ2VudCBFeHByZXNzaW9uIE1lY2hhbmlzbQorQGNoYXB0ZXIgVGhlIEdEQiBBZ2VudCBFeHByZXNzaW9uIE1lY2hhbmlzbQorCitJbiBzb21lIGFwcGxpY2F0aW9ucywgaXQgaXMgbm90IGZlYXNhYmxlIGZvciB0aGUgZGVidWdnZXIgdG8gaW50ZXJydXB0Cit0aGUgcHJvZ3JhbSdzIGV4ZWN1dGlvbiBsb25nIGVub3VnaCBmb3IgdGhlIGRldmVsb3BlciB0byBsZWFybiBhbnl0aGluZworaGVscGZ1bCBhYm91dCBpdHMgYmVoYXZpb3IuICBJZiB0aGUgcHJvZ3JhbSdzIGNvcnJlY3RuZXNzIGRlcGVuZHMgb24gaXRzCityZWFsLXRpbWUgYmVoYXZpb3IsIGRlbGF5cyBpbnRyb2R1Y2VkIGJ5IGEgZGVidWdnZXIgbWlnaHQgY2F1c2UgdGhlCitwcm9ncmFtIHRvIGZhaWwsIGV2ZW4gd2hlbiB0aGUgY29kZSBpdHNlbGYgaXMgY29ycmVjdC4gIEl0IGlzIHVzZWZ1bCB0bworYmUgYWJsZSB0byBvYnNlcnZlIHRoZSBwcm9ncmFtJ3MgYmVoYXZpb3Igd2l0aG91dCBpbnRlcnJ1cHRpbmcgaXQuCisKK1VzaW5nIEdEQidzIEBjb2Rle3RyYWNlfSBhbmQgQGNvZGV7Y29sbGVjdH0gY29tbWFuZHMsIHRoZSB1c2VyIGNhbgorc3BlY2lmeSBsb2NhdGlvbnMgaW4gdGhlIHByb2dyYW0sIGFuZCBhcmJpdHJhcnkgZXhwcmVzc2lvbnMgdG8gZXZhbHVhdGUKK3doZW4gdGhvc2UgbG9jYXRpb25zIGFyZSByZWFjaGVkLiAgTGF0ZXIsIHVzaW5nIHRoZSBAY29kZXt0ZmluZH0KK2NvbW1hbmQsIHNoZSBjYW4gZXhhbWluZSB0aGUgdmFsdWVzIHRob3NlIGV4cHJlc3Npb25zIGhhZCB3aGVuIHRoZQorcHJvZ3JhbSBoaXQgdGhlIHRyYWNlIHBvaW50cy4gIFRoZSBleHByZXNzaW9ucyBtYXkgYWxzbyBkZW5vdGUgb2JqZWN0cworaW4gbWVtb3J5IC0tLSBzdHJ1Y3R1cmVzIG9yIGFycmF5cywgZm9yIGV4YW1wbGUgLS0tIHdob3NlIHZhbHVlcyBHREIKK3Nob3VsZCByZWNvcmQ7IHdoaWxlIHZpc2l0aW5nIGEgcGFydGljdWxhciB0cmFjZXBvaW50LCB0aGUgdXNlciBtYXkKK2luc3BlY3QgdGhvc2Ugb2JqZWN0cyBhcyBpZiB0aGV5IHdlcmUgaW4gbWVtb3J5IGF0IHRoYXQgbW9tZW50LgorSG93ZXZlciwgYmVjYXVzZSBHREIgcmVjb3JkcyB0aGVzZSB2YWx1ZXMgd2l0aG91dCBpbnRlcmFjdGluZyB3aXRoIHRoZQordXNlciwgaXQgY2FuIGRvIHNvIHF1aWNrbHkgYW5kIHVub2J0cnVzaXZlbHksIGhvcGVmdWxseSBub3QgZGlzdHVyYmluZwordGhlIHByb2dyYW0ncyBiZWhhdmlvci4KKworV2hlbiBHREIgaXMgZGVidWdnaW5nIGEgcmVtb3RlIHRhcmdldCwgdGhlIEdEQiBAZGZue2FnZW50fSBjb2RlIHJ1bm5pbmcKK29uIHRoZSB0YXJnZXQgY29tcHV0ZXMgdGhlIHZhbHVlcyBvZiB0aGUgZXhwcmVzc2lvbnMgaXRzZWxmLiAgVG8gYXZvaWQKK2hhdmluZyBhIGZ1bGwgc3ltYm9saWMgZXhwcmVzc2lvbiBldmFsdWF0b3Igb24gdGhlIGFnZW50LCBHREIgdHJhbnNsYXRlcworZXhwcmVzc2lvbnMgaW4gdGhlIHNvdXJjZSBsYW5ndWFnZSBpbnRvIGEgc2ltcGxlciBieXRlY29kZSBsYW5ndWFnZSwgYW5kCit0aGVuIHNlbmRzIHRoZSBieXRlY29kZSB0byB0aGUgYWdlbnQ7IHRoZSBhZ2VudCB0aGVuIGV4ZWN1dGVzIHRoZQorYnl0ZWNvZGUsIGFuZCByZWNvcmRzIHRoZSB2YWx1ZXMgZm9yIEdEQiB0byByZXRyaWV2ZSBsYXRlci4KKworVGhlIGJ5dGVjb2RlIGxhbmd1YWdlIGlzIHNpbXBsZTsgdGhlcmUgYXJlIGZvcnR5LW9kZCBvcGNvZGVzLCB0aGUgYnVsaworb2Ygd2hpY2ggYXJlIHRoZSB1c3VhbCB2b2NhYnVsYXJ5IG9mIEMgb3BlcmFuZHMgKGFkZGl0aW9uLCBzdWJ0cmFjdGlvbiwKK3NoaWZ0cywgYW5kIHNvIG9uKSBhbmQgdmFyaW91cyBzaXplcyBvZiBsaXRlcmFscyBhbmQgbWVtb3J5IHJlZmVyZW5jZQorb3BlcmF0aW9ucy4gIFRoZSBieXRlY29kZSBpbnRlcnByZXRlciBvcGVyYXRlcyBzdHJpY3RseSBvbiBtYWNoaW5lLWxldmVsCit2YWx1ZXMgLS0tIHZhcmlvdXMgc2l6ZXMgb2YgaW50ZWdlcnMgYW5kIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgLS0tIGFuZAorcmVxdWlyZXMgbm8gaW5mb3JtYXRpb24gYWJvdXQgdHlwZXMgb3Igc3ltYm9sczsgdGh1cywgdGhlIGludGVycHJldGVyJ3MKK2ludGVybmFsIGRhdGEgc3RydWN0dXJlcyBhcmUgc2ltcGxlLCBhbmQgZWFjaCBieXRlY29kZSByZXF1aXJlcyBvbmx5IGEKK2ZldyBuYXRpdmUgbWFjaGluZSBpbnN0cnVjdGlvbnMgdG8gaW1wbGVtZW50IGl0LiAgVGhlIGludGVycHJldGVyIGlzCitzbWFsbCwgYW5kIHN0cmljdCBsaW1pdHMgb24gdGhlIG1lbW9yeSBhbmQgdGltZSByZXF1aXJlZCB0byBldmFsdWF0ZSBhbgorZXhwcmVzc2lvbiBhcmUgZWFzeSB0byBkZXRlcm1pbmUsIG1ha2luZyBpdCBzdWl0YWJsZSBmb3IgdXNlIGJ5IHRoZQorZGVidWdnaW5nIGFnZW50IGluIHJlYWwtdGltZSBhcHBsaWNhdGlvbnMuCisKK0BtZW51CisqIEdlbmVyYWwgQnl0ZWNvZGUgRGVzaWduOjogICAgIE92ZXJ2aWV3IG9mIHRoZSBpbnRlcnByZXRlci4KKyogQnl0ZWNvZGUgRGVzY3JpcHRpb25zOjogICAgICAgV2hhdCBlYWNoIG9uZSBkb2VzLgorKiBVc2luZyBBZ2VudCBFeHByZXNzaW9uczo6ICAgICBIb3cgYWdlbnQgZXhwcmVzc2lvbnMgZml0IGludG8gdGhlIGJpZyBwaWN0dXJlLgorKiBWYXJ5aW5nIFRhcmdldCBDYXBhYmlsaXRpZXM6OiBIb3cgdG8gZGlzY292ZXIgd2hhdCB0aGUgdGFyZ2V0IGNhbiBkby4KKyogVHJhY2luZyBvbiBTeW1tZXRyaXg6OiAgICAgICAgU3BlY2lhbCBpbmZvIGZvciBpbXBsZW1lbnRhdGlvbiBvbiBFTUMncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3hlcy4KKyogUmF0aW9uYWxlOjogICAgICAgICAgICAgICAgICAgV2h5IHdlIGRpZCBpdCB0aGlzIHdheS4KK0BlbmQgbWVudQorCisKK0BjIEBub2RlIFJhdGlvbmFsZQorQGMgQHNlY3Rpb24gUmF0aW9uYWxlCisKKworQG5vZGUgR2VuZXJhbCBCeXRlY29kZSBEZXNpZ24KK0BzZWN0aW9uIEdlbmVyYWwgQnl0ZWNvZGUgRGVzaWduCisKK1RoZSBhZ2VudCByZXByZXNlbnRzIGJ5dGVjb2RlIGV4cHJlc3Npb25zIGFzIGFuIGFycmF5IG9mIGJ5dGVzLiAgRWFjaAoraW5zdHJ1Y3Rpb24gaXMgb25lIGJ5dGUgbG9uZyAodGh1cyB0aGUgdGVybSBAZGZue2J5dGVjb2RlfSkuICBTb21lCitpbnN0cnVjdGlvbnMgYXJlIGZvbGxvd2VkIGJ5IG9wZXJhbmQgYnl0ZXM7IGZvciBleGFtcGxlLCB0aGUgQGNvZGV7Z290b30KK2luc3RydWN0aW9uIGlzIGZvbGxvd2VkIGJ5IGEgZGVzdGluYXRpb24gZm9yIHRoZSBqdW1wLgorCitUaGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgaXMgYSBzdGFjay1iYXNlZCBtYWNoaW5lOyBtb3N0IGluc3RydWN0aW9ucyBwb3AKK3RoZWlyIG9wZXJhbmRzIG9mZiB0aGUgc3RhY2ssIHBlcmZvcm0gc29tZSBvcGVyYXRpb24sIGFuZCBwdXNoIHRoZQorcmVzdWx0IGJhY2sgb24gdGhlIHN0YWNrIGZvciB0aGUgbmV4dCBpbnN0cnVjdGlvbiB0byBjb25zdW1lLiAgRWFjaAorZWxlbWVudCBvZiB0aGUgc3RhY2sgbWF5IGNvbnRhaW4gZWl0aGVyIGEgaW50ZWdlciBvciBhIGZsb2F0aW5nIHBvaW50Cit2YWx1ZTsgdGhlc2UgdmFsdWVzIGFyZSBhcyBtYW55IGJpdHMgd2lkZSBhcyB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHRoYXQKK2NhbiBiZSBkaXJlY3RseSBtYW5pcHVsYXRlZCBpbiB0aGUgc291cmNlIGxhbmd1YWdlLiAgU3RhY2sgZWxlbWVudHMKK2NhcnJ5IG5vIHJlY29yZCBvZiB0aGVpciB0eXBlOyBieXRlY29kZSBjb3VsZCBwdXNoIGEgdmFsdWUgYXMgYW4KK2ludGVnZXIsIHRoZW4gcG9wIGl0IGFzIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUuICBIb3dldmVyLCBHREIgd2lsbCBub3QKK2dlbmVyYXRlIGNvZGUgd2hpY2ggZG9lcyB0aGlzLiAgSW4gQywgb25lIG1pZ2h0IGRlZmluZSB0aGUgdHlwZSBvZiBhCitzdGFjayBlbGVtZW50IGFzIGZvbGxvd3M6CitAZXhhbXBsZQordW5pb24gYWdlbnRfdmFsIEB7CisgIExPTkdFU1QgbDsKKyAgRE9VQkxFU1QgZDsKK0B9OworQGVuZCBleGFtcGxlCitAbm9pbmRlbnQKK3doZXJlIEBjb2Rle0xPTkdFU1R9IGFuZCBAY29kZXtET1VCTEVTVH0gYXJlIEBjb2Rle3R5cGVkZWZ9IG5hbWVzIGZvcgordGhlIGxhcmdlc3QgaW50ZWdlciBhbmQgZmxvYXRpbmcgcG9pbnQgdHlwZXMgb24gdGhlIG1hY2hpbmUuCisKK0J5IHRoZSB0aW1lIHRoZSBieXRlY29kZSBpbnRlcnByZXRlciByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGV4cHJlc3Npb24sCit0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIHRoZSBvbmx5IHZhbHVlIGxlZnQgb24gdGhlIHN0YWNrLgorRm9yIHRyYWNpbmcgYXBwbGljYXRpb25zLCBAY29kZXt0cmFjZX0gYnl0ZWNvZGVzIGluIHRoZSBleHByZXNzaW9uIHdpbGwKK2hhdmUgcmVjb3JkZWQgdGhlIG5lY2Vzc2FyeSBkYXRhLCBhbmQgdGhlIHZhbHVlIG9uIHRoZSBzdGFjayBtYXkgYmUKK2Rpc2NhcmRlZC4gIEZvciBvdGhlciBhcHBsaWNhdGlvbnMsIGxpa2UgY29uZGl0aW9uYWwgYnJlYWtwb2ludHMsIHRoZQordmFsdWUgbWF5IGJlIHVzZWZ1bC4KKworU2VwYXJhdGUgZnJvbSB0aGUgc3RhY2ssIHRoZSBpbnRlcnByZXRlciBoYXMgdHdvIHJlZ2lzdGVyczoKK0B0YWJsZSBAY29kZQorQGl0ZW0gcGMKK1RoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGJ5dGVjb2RlIHRvIGV4ZWN1dGUuCisKK0BpdGVtIHN0YXJ0CitUaGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGJ5dGVjb2RlIGV4cHJlc3Npb24sIG5lY2Vzc2FyeSBmb3IKK2ludGVycHJldGluZyB0aGUgQGNvZGV7Z290b30gYW5kIEBjb2Rle2lmX2dvdG99IGluc3RydWN0aW9ucy4KKworQGVuZCB0YWJsZQorQG5vaW5kZW50CitOZWl0aGVyIG9mIHRoZXNlIHJlZ2lzdGVycyBpcyBkaXJlY3RseSB2aXNpYmxlIHRvIHRoZSBieXRlY29kZSBsYW5ndWFnZQoraXRzZWxmLCBidXQgdGhleSBhcmUgdXNlZnVsIGZvciBkZWZpbmluZyB0aGUgbWVhbmluZ3Mgb2YgdGhlIGJ5dGVjb2RlCitvcGVyYXRpb25zLgorCitUaGVyZSBhcmUgbm8gaW5zdHJ1Y3Rpb25zIHRvIHBlcmZvcm0gc2lkZSBlZmZlY3RzIG9uIHRoZSBydW5uaW5nCitwcm9ncmFtLCBvciBjYWxsIHRoZSBwcm9ncmFtJ3MgZnVuY3Rpb25zOyB3ZSBhc3N1bWUgdGhhdCB0aGVzZQorZXhwcmVzc2lvbnMgYXJlIG9ubHkgdXNlZCBmb3IgdW5vYnRydXNpdmUgZGVidWdnaW5nLCBub3QgZm9yIHBhdGNoaW5nCit0aGUgcnVubmluZyBjb2RlLiAgCisKK01vc3QgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zIGRvIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSB2YXJpb3VzIHNpemVzCitvZiB2YWx1ZXMsIGFuZCBvcGVyYXRlIG9uIGZ1bGwtd2lkdGggdmFsdWVzOyB0aGUgdXBwZXIgYml0cyBvZiB0aGUKK3ZhbHVlcyBhcmUgc2ltcGx5IGlnbm9yZWQsIHNpbmNlIHRoZXkgZG8gbm90IHVzdWFsbHkgbWFrZSBhIGRpZmZlcmVuY2UKK3RvIHRoZSB2YWx1ZSBjb21wdXRlZC4gIFRoZSBleGNlcHRpb25zIHRvIHRoaXMgcnVsZSBhcmU6CitAdGFibGUgQGFzaXMKKworQGl0ZW0gbWVtb3J5IHJlZmVyZW5jZSBpbnN0cnVjdGlvbnMgKEBjb2Rle3JlZn1AdmFye259KQorVGhlcmUgYXJlIGRpc3RpbmN0IGluc3RydWN0aW9ucyB0byBmZXRjaCBkaWZmZXJlbnQgd29yZCBzaXplcyBmcm9tCittZW1vcnkuICBPbmNlIG9uIHRoZSBzdGFjaywgaG93ZXZlciwgdGhlIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBmdWxsLXNpemUKK2ludGVnZXJzLiAgVGhleSBtYXkgbmVlZCB0byBiZSBzaWduLWV4dGVuZGVkOyB0aGUgQGNvZGV7ZXh0fSBpbnN0cnVjdGlvbgorZXhpc3RzIGZvciB0aGlzIHB1cnBvc2UuCisKK0BpdGVtIHRoZSBzaWduLWV4dGVuc2lvbiBpbnN0cnVjdGlvbiAoQGNvZGV7ZXh0fSBAdmFye259KQorVGhlc2UgY2xlYXJseSBuZWVkIHRvIGtub3cgd2hpY2ggcG9ydGlvbiBvZiB0aGVpciBvcGVyYW5kIGlzIHRvIGJlCitleHRlbmRlZCB0byBvY2N1cHkgdGhlIGZ1bGwgbGVuZ3RoIG9mIHRoZSB3b3JkLgorCitAZW5kIHRhYmxlCisKK0lmIHRoZSBpbnRlcnByZXRlciBpcyB1bmFibGUgdG8gZXZhbHVhdGUgYW4gZXhwcmVzc2lvbiBjb21wbGV0ZWx5IGZvcgorc29tZSByZWFzb24gKGEgbWVtb3J5IGxvY2F0aW9uIGlzIGluYWNjZXNzaWJsZSwgb3IgYSBkaXZpc29yIGlzIHplcm8sCitmb3IgZXhhbXBsZSksIHdlIHNheSB0aGF0IGludGVycHJldGF0aW9uIGBgdGVybWluYXRlcyB3aXRoIGFuIGVycm9yJycuCitUaGlzIG1lYW5zIHRoYXQgdGhlIHByb2JsZW0gaXMgcmVwb3J0ZWQgYmFjayB0byB0aGUgaW50ZXJwcmV0ZXIncyBjYWxsZXIKK2luIHNvbWUgaGVscGZ1bCB3YXkuICBJbiBnZW5lcmFsLCBjb2RlIHVzaW5nIGFnZW50IGV4cHJlc3Npb25zIHNob3VsZAorYXNzdW1lIHRoYXQgdGhleSBtYXkgYXR0ZW1wdCB0byBkaXZpZGUgYnkgemVybywgZmV0Y2ggYXJiaXRyYXJ5IG1lbW9yeQorbG9jYXRpb25zLCBhbmQgbWlzYmVoYXZlIGluIG90aGVyIHdheXMuCisKK0V2ZW4gY29tcGxpY2F0ZWQgQyBleHByZXNzaW9ucyBjb21waWxlIHRvIGEgZmV3IGJ5dGVjb2RlIGluc3RydWN0aW9uczsKK2ZvciBleGFtcGxlLCB0aGUgZXhwcmVzc2lvbiBAY29kZXt4ICsgeSAqIHp9IHdvdWxkIHR5cGljYWxseSBwcm9kdWNlCitjb2RlIGxpa2UgdGhlIGZvbGxvd2luZywgYXNzdW1pbmcgdGhhdCBAY29kZXt4fSBhbmQgQGNvZGV7eX0gbGl2ZSBpbgorcmVnaXN0ZXJzLCBhbmQgQGNvZGV7en0gaXMgYSBnbG9iYWwgdmFyaWFibGUgaG9sZGluZyBhIDMyLWJpdAorQGNvZGV7aW50fToKK0BleGFtcGxlCityZWcgMQorcmVnIDIKK2NvbnN0MzIgQGl7YWRkcmVzcyBvZiB6fQorcmVmMzIKK2V4dCAzMgorbXVsCithZGQKK2VuZAorQGVuZCBleGFtcGxlCisKK0luIGRldGFpbCwgdGhlc2UgbWVhbjoKK0B0YWJsZSBAY29kZQorCitAaXRlbSByZWcgMQorUHVzaCB0aGUgdmFsdWUgb2YgcmVnaXN0ZXIgMSAocHJlc3VtYWJseSBob2xkaW5nIEBjb2Rle3h9KSBvbnRvIHRoZQorc3RhY2suCisKK0BpdGVtIHJlZyAyCitQdXNoIHRoZSB2YWx1ZSBvZiByZWdpc3RlciAyIChob2xkaW5nIEBjb2Rle3l9KS4KKworQGl0ZW0gY29uc3QzMiBAaXthZGRyZXNzIG9mIHp9CitQdXNoIHRoZSBhZGRyZXNzIG9mIEBjb2Rle3p9IG9udG8gdGhlIHN0YWNrLgorCitAaXRlbSByZWYzMgorRmV0Y2ggYSAzMi1iaXQgd29yZCBmcm9tIHRoZSBhZGRyZXNzIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrOyByZXBsYWNlCit0aGUgYWRkcmVzcyBvbiB0aGUgc3RhY2sgd2l0aCB0aGUgdmFsdWUuICBUaHVzLCB3ZSByZXBsYWNlIHRoZSBhZGRyZXNzCitvZiBAY29kZXt6fSB3aXRoIEBjb2Rle3p9J3MgdmFsdWUuCisKK0BpdGVtIGV4dCAzMgorU2lnbi1leHRlbmQgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGZyb20gMzIgYml0cyB0byBmdWxsCitsZW5ndGguICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIEBjb2Rle3p9IGlzIGEgc2lnbmVkIGludGVnZXIuCisKK0BpdGVtIG11bAorUG9wIHRoZSB0b3AgdHdvIG51bWJlcnMgb24gdGhlIHN0YWNrLCBtdWx0aXBseSB0aGVtLCBhbmQgcHVzaCB0aGVpcgorcHJvZHVjdC4gIE5vdyB0aGUgdG9wIG9mIHRoZSBzdGFjayBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24KK0Bjb2Rle3kgKiB6fS4KKworQGl0ZW0gYWRkCitQb3AgdGhlIHRvcCB0d28gbnVtYmVycywgYWRkIHRoZW0sIGFuZCBwdXNoIHRoZSBzdW0uICBOb3cgdGhlIHRvcCBvZiB0aGUKK3N0YWNrIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBAY29kZXt4ICsgeSAqIHp9LgorCitAaXRlbSBlbmQKK1N0b3AgZXhlY3V0aW5nOyB0aGUgdmFsdWUgbGVmdCBvbiB0aGUgc3RhY2sgdG9wIGlzIHRoZSB2YWx1ZSB0byBiZQorcmVjb3JkZWQuCisKK0BlbmQgdGFibGUKKworCitAbm9kZSBCeXRlY29kZSBEZXNjcmlwdGlvbnMKK0BzZWN0aW9uIEJ5dGVjb2RlIERlc2NyaXB0aW9ucworCitFYWNoIGJ5dGVjb2RlIGRlc2NyaXB0aW9uIGhhcyB0aGUgZm9sbG93aW5nIGZvcm06CisKK0B0YWJsZSBAYXNpcworCitAaXRlbSBAY29kZXthZGR9ICgweDAyKTogQHZhcnthfSBAdmFye2J9IEByZXN1bHR7fSBAdmFye2ErYn0KKworUG9wIHRoZSB0b3AgdHdvIHN0YWNrIGl0ZW1zLCBAdmFye2F9IGFuZCBAdmFye2J9LCBhcyBpbnRlZ2VyczsgcHVzaAordGhlaXIgc3VtLCBhcyBhbiBpbnRlZ2VyLgorCitAZW5kIHRhYmxlCisKK0luIHRoaXMgZXhhbXBsZSwgQGNvZGV7YWRkfSBpcyB0aGUgbmFtZSBvZiB0aGUgYnl0ZWNvZGUsIGFuZAorQGNvZGV7KDB4MDIpfSBpcyB0aGUgb25lLWJ5dGUgdmFsdWUgdXNlZCB0byBlbmNvZGUgdGhlIGJ5dGVjb2RlLCBpbgoraGV4aWRlY2ltYWwuICBUaGUgcGhyYXNlIGBgQHZhcnthfSBAdmFye2J9IEByZXN1bHR7fSBAdmFye2ErYn0nJyBzaG93cwordGhlIHN0YWNrIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGJ5dGVjb2RlIGV4ZWN1dGVzLiAgQmVmb3JlaGFuZCwgdGhlIHN0YWNrCittdXN0IGNvbnRhaW4gYXQgbGVhc3QgdHdvIHZhbHVlcywgQHZhcnthfSBhbmQgQHZhcntifTsgc2luY2UgdGhlIHRvcCBvZgordGhlIHN0YWNrIGlzIHRvIHRoZSByaWdodCwgQHZhcntifSBpcyBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjaywgYW5kCitAdmFye2F9IGlzIHVuZGVybmVhdGggaXQuICBBZnRlciBleGVjdXRpb24sIHRoZSBieXRlY29kZSB3aWxsIGhhdmUKK3BvcHBlZCBAdmFye2F9IGFuZCBAdmFye2J9IGZyb20gdGhlIHN0YWNrLCBhbmQgcmVwbGFjZWQgdGhlbSB3aXRoIGEKK3NpbmdsZSB2YWx1ZSwgQHZhcnthK2J9LiAgVGhlcmUgbWF5IGJlIG90aGVyIHZhbHVlcyBvbiB0aGUgc3RhY2sgYmVsb3cKK3Rob3NlIHNob3duLCBidXQgdGhlIGJ5dGVjb2RlIGFmZmVjdHMgb25seSB0aG9zZSBzaG93bi4KKworSGVyZSBpcyBhbm90aGVyIGV4YW1wbGU6CisKK0B0YWJsZSBAYXNpcworCitAaXRlbSBAY29kZXtjb25zdDh9ICgweDIyKSBAdmFye259OiBAcmVzdWx0e30gQHZhcntufQorUHVzaCB0aGUgOC1iaXQgaW50ZWdlciBjb25zdGFudCBAdmFye259IG9uIHRoZSBzdGFjaywgd2l0aG91dCBzaWduCitleHRlbnNpb24uCisKK0BlbmQgdGFibGUKKworSW4gdGhpcyBleGFtcGxlLCB0aGUgYnl0ZWNvZGUgQGNvZGV7Y29uc3Q4fSB0YWtlcyBhbiBvcGVyYW5kIEB2YXJ7bn0KK2RpcmVjdGx5IGZyb20gdGhlIGJ5dGVjb2RlIHN0cmVhbTsgdGhlIG9wZXJhbmQgZm9sbG93cyB0aGUgQGNvZGV7Y29uc3Q4fQorYnl0ZWNvZGUgaXRzZWxmLiAgV2Ugd3JpdGUgYW55IHN1Y2ggb3BlcmFuZHMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG5hbWUKK29mIHRoZSBieXRlY29kZSwgYmVmb3JlIHRoZSBjb2xvbiwgYW5kIGRlc2NyaWJlIHRoZSBleGFjdCBlbmNvZGluZyBvZgordGhlIG9wZXJhbmQgaW4gdGhlIGJ5dGVjb2RlIHN0cmVhbSBpbiB0aGUgYm9keSBvZiB0aGUgYnl0ZWNvZGUKK2Rlc2NyaXB0aW9uLgorCitGb3IgdGhlIEBjb2Rle2NvbnN0OH0gYnl0ZWNvZGUsIHRoZXJlIGFyZSBubyBzdGFjayBpdGVtcyBnaXZlbiBiZWZvcmUKK3RoZSBAcmVzdWx0e307IHRoaXMgc2ltcGx5IG1lYW5zIHRoYXQgdGhlIGJ5dGVjb2RlIGNvbnN1bWVzIG5vIHZhbHVlcworZnJvbSB0aGUgc3RhY2suICBJZiBhIGJ5dGVjb2RlIGNvbnN1bWVzIG5vIHZhbHVlcywgb3IgcHJvZHVjZXMgbm8KK3ZhbHVlcywgdGhlIGxpc3Qgb24gZWl0aGVyIHNpZGUgb2YgdGhlIEByZXN1bHR7fSBtYXkgYmUgZW1wdHkuCisKK0lmIGEgdmFsdWUgaXMgd3JpdHRlbiBhcyBAdmFye2F9LCBAdmFye2J9LCBvciBAdmFye259LCB0aGVuIHRoZSBieXRlY29kZQordHJlYXRzIGl0IGFzIGFuIGludGVnZXIuICBJZiBhIHZhbHVlIGlzIHdyaXR0ZW4gaXMgQHZhcnthZGRyfSwgdGhlbiB0aGUKK2J5dGVjb2RlIHRyZWF0cyBpdCBhcyBhbiBhZGRyZXNzLgorCitXZSBkbyBub3QgZnVsbHkgZGVzY3JpYmUgdGhlIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMgaGVyZTsgYWx0aG91Z2gKK3RoaXMgZGVzaWduIGNhbiBiZSBleHRlbmRlZCBpbiBhIGNsZWFuIHdheSB0byBoYW5kbGUgZmxvYXRpbmcgcG9pbnQKK3ZhbHVlcywgdGhleSBhcmUgbm90IG9mIGltbWVkaWF0ZSBpbnRlcmVzdCB0byB0aGUgY3VzdG9tZXIsIHNvIHdlIGF2b2lkCitkZXNjcmliaW5nIHRoZW0sIHRvIHNhdmUgdGltZS4KKworCitAdGFibGUgQGFzaXMKKworQGl0ZW0gQGNvZGV7ZmxvYXR9ICgweDAxKTogQHJlc3VsdHt9CisKK1ByZWZpeCBmb3IgZmxvYXRpbmctcG9pbnQgYnl0ZWNvZGVzLiAgTm90IGltcGxlbWVudGVkIHlldC4KKworQGl0ZW0gQGNvZGV7YWRkfSAoMHgwMik6IEB2YXJ7YX0gQHZhcntifSBAcmVzdWx0e30gQHZhcnthK2J9CitQb3AgdHdvIGludGVnZXJzIGZyb20gdGhlIHN0YWNrLCBhbmQgcHVzaCB0aGVpciBzdW0sIGFzIGFuIGludGVnZXIuCisKK0BpdGVtIEBjb2Rle3N1Yn0gKDB4MDMpOiBAdmFye2F9IEB2YXJ7Yn0gQHJlc3VsdHt9IEB2YXJ7YS1ifQorUG9wIHR3byBpbnRlZ2VycyBmcm9tIHRoZSBzdGFjaywgc3VidHJhY3QgdGhlIHRvcCB2YWx1ZSBmcm9tIHRoZQorbmV4dC10by10b3AgdmFsdWUsIGFuZCBwdXNoIHRoZSBkaWZmZXJlbmNlLgorCitAaXRlbSBAY29kZXttdWx9ICgweDA0KTogQHZhcnthfSBAdmFye2J9IEByZXN1bHR7fSBAdmFye2EqYn0KK1BvcCB0d28gaW50ZWdlcnMgZnJvbSB0aGUgc3RhY2ssIG11bHRpcGx5IHRoZW0sIGFuZCBwdXNoIHRoZSBwcm9kdWN0IG9uCit0aGUgc3RhY2suICBOb3RlIHRoYXQsIHdoZW4gb25lIG11bHRpcGxpZXMgdHdvIEB2YXJ7bn0tYml0IG51bWJlcnMKK3lpZWxkaW5nIGFub3RoZXIgQHZhcntufS1iaXQgbnVtYmVyLCBpdCBpcyBpcnJlbGV2YW50IHdoZXRoZXIgdGhlCitudW1iZXJzIGFyZSBzaWduZWQgb3Igbm90OyB0aGUgcmVzdWx0cyBhcmUgdGhlIHNhbWUuCisKK0BpdGVtIEBjb2Rle2Rpdl9zaWduZWR9ICgweDA1KTogQHZhcnthfSBAdmFye2J9IEByZXN1bHR7fSBAdmFye2EvYn0KK1BvcCB0d28gc2lnbmVkIGludGVnZXJzIGZyb20gdGhlIHN0YWNrOyBkaXZpZGUgdGhlIG5leHQtdG8tdG9wIHZhbHVlIGJ5Cit0aGUgdG9wIHZhbHVlLCBhbmQgcHVzaCB0aGUgcXVvdGllbnQuICBJZiB0aGUgZGl2aXNvciBpcyB6ZXJvLCB0ZXJtaW5hdGUKK3dpdGggYW4gZXJyb3IuCisKK0BpdGVtIEBjb2Rle2Rpdl91bnNpZ25lZH0gKDB4MDYpOiBAdmFye2F9IEB2YXJ7Yn0gQHJlc3VsdHt9IEB2YXJ7YS9ifQorUG9wIHR3byB1bnNpZ25lZCBpbnRlZ2VycyBmcm9tIHRoZSBzdGFjazsgZGl2aWRlIHRoZSBuZXh0LXRvLXRvcCB2YWx1ZQorYnkgdGhlIHRvcCB2YWx1ZSwgYW5kIHB1c2ggdGhlIHF1b3RpZW50LiAgSWYgdGhlIGRpdmlzb3IgaXMgemVybywKK3Rlcm1pbmF0ZSB3aXRoIGFuIGVycm9yLgorCitAaXRlbSBAY29kZXtyZW1fc2lnbmVkfSAoMHgwNyk6IEB2YXJ7YX0gQHZhcntifSBAcmVzdWx0e30gQHZhcnthIG1vZHVsbyBifQorUG9wIHR3byBzaWduZWQgaW50ZWdlcnMgZnJvbSB0aGUgc3RhY2s7IGRpdmlkZSB0aGUgbmV4dC10by10b3AgdmFsdWUgYnkKK3RoZSB0b3AgdmFsdWUsIGFuZCBwdXNoIHRoZSByZW1haW5kZXIuICBJZiB0aGUgZGl2aXNvciBpcyB6ZXJvLAordGVybWluYXRlIHdpdGggYW4gZXJyb3IuCisKK0BpdGVtIEBjb2Rle3JlbV91bnNpZ25lZH0gKDB4MDgpOiBAdmFye2F9IEB2YXJ7Yn0gQHJlc3VsdHt9IEB2YXJ7YSBtb2R1bG8gYn0KK1BvcCB0d28gdW5zaWduZWQgaW50ZWdlcnMgZnJvbSB0aGUgc3RhY2s7IGRpdmlkZSB0aGUgbmV4dC10by10b3AgdmFsdWUKK2J5IHRoZSB0b3AgdmFsdWUsIGFuZCBwdXNoIHRoZSByZW1haW5kZXIuICBJZiB0aGUgZGl2aXNvciBpcyB6ZXJvLAordGVybWluYXRlIHdpdGggYW4gZXJyb3IuCisKK0BpdGVtIEBjb2Rle2xzaH0gKDB4MDkpOiBAdmFye2F9IEB2YXJ7Yn0gQHJlc3VsdHt9IEB2YXJ7YTw8Yn0KK1BvcCB0d28gaW50ZWdlcnMgZnJvbSB0aGUgc3RhY2s7IGxldCBAdmFye2F9IGJlIHRoZSBuZXh0LXRvLXRvcCB2YWx1ZSwKK2FuZCBAdmFye2J9IGJlIHRoZSB0b3AgdmFsdWUuICBTaGlmdCBAdmFye2F9IGxlZnQgYnkgQHZhcntifSBiaXRzLCBhbmQKK3B1c2ggdGhlIHJlc3VsdC4KKworQGl0ZW0gQGNvZGV7cnNoX3NpZ25lZH0gKDB4MGEpOiBAdmFye2F9IEB2YXJ7Yn0gQHJlc3VsdHt9IEB2YXJ7QGNvZGV7KHNpZ25lZCl9YT4+Yn0KK1BvcCB0d28gaW50ZWdlcnMgZnJvbSB0aGUgc3RhY2s7IGxldCBAdmFye2F9IGJlIHRoZSBuZXh0LXRvLXRvcCB2YWx1ZSwKK2FuZCBAdmFye2J9IGJlIHRoZSB0b3AgdmFsdWUuICBTaGlmdCBAdmFye2F9IHJpZ2h0IGJ5IEB2YXJ7Yn0gYml0cywKK2luc2VydGluZyBjb3BpZXMgb2YgdGhlIHRvcCBiaXQgYXQgdGhlIGhpZ2ggZW5kLCBhbmQgcHVzaCB0aGUgcmVzdWx0LgorCitAaXRlbSBAY29kZXtyc2hfdW5zaWduZWR9ICgweDBiKTogQHZhcnthfSBAdmFye2J9IEByZXN1bHR7fSBAdmFye2E+PmJ9CitQb3AgdHdvIGludGVnZXJzIGZyb20gdGhlIHN0YWNrOyBsZXQgQHZhcnthfSBiZSB0aGUgbmV4dC10by10b3AgdmFsdWUsCithbmQgQHZhcntifSBiZSB0aGUgdG9wIHZhbHVlLiAgU2hpZnQgQHZhcnthfSByaWdodCBieSBAdmFye2J9IGJpdHMsCitpbnNlcnRpbmcgemVybyBiaXRzIGF0IHRoZSBoaWdoIGVuZCwgYW5kIHB1c2ggdGhlIHJlc3VsdC4KKworQGl0ZW0gQGNvZGV7bG9nX25vdH0gKDB4MGUpOiBAdmFye2F9IEByZXN1bHR7fSBAdmFyeyFhfQorUG9wIGFuIGludGVnZXIgZnJvbSB0aGUgc3RhY2s7IGlmIGl0IGlzIHplcm8sIHB1c2ggdGhlIHZhbHVlIG9uZTsKK290aGVyd2lzZSwgcHVzaCB0aGUgdmFsdWUgemVyby4KKworQGl0ZW0gQGNvZGV7Yml0X2FuZH0gKDB4MGYpOiBAdmFye2F9IEB2YXJ7Yn0gQHJlc3VsdHt9IEB2YXJ7YSZifQorUG9wIHR3byBpbnRlZ2VycyBmcm9tIHRoZSBzdGFjaywgYW5kIHB1c2ggdGhlaXIgYml0d2lzZSBAY29kZXthbmR9LgorCitAaXRlbSBAY29kZXtiaXRfb3J9ICgweDEwKTogQHZhcnthfSBAdmFye2J9IEByZXN1bHR7fSBAdmFye2F8Yn0KK1BvcCB0d28gaW50ZWdlcnMgZnJvbSB0aGUgc3RhY2ssIGFuZCBwdXNoIHRoZWlyIGJpdHdpc2UgQGNvZGV7b3J9LgorCitAaXRlbSBAY29kZXtiaXRfeG9yfSAoMHgxMSk6IEB2YXJ7YX0gQHZhcntifSBAcmVzdWx0e30gQHZhcnthXmJ9CitQb3AgdHdvIGludGVnZXJzIGZyb20gdGhlIHN0YWNrLCBhbmQgcHVzaCB0aGVpciBiaXR3aXNlCitleGNsdXNpdmUtQGNvZGV7b3J9LgorCitAaXRlbSBAY29kZXtiaXRfbm90fSAoMHgxMik6IEB2YXJ7YX0gQHJlc3VsdHt9IEB2YXJ7fmF9CitQb3AgYW4gaW50ZWdlciBmcm9tIHRoZSBzdGFjaywgYW5kIHB1c2ggaXRzIGJpdHdpc2UgY29tcGxlbWVudC4KKworQGl0ZW0gQGNvZGV7ZXF1YWx9ICgweDEzKTogQHZhcnthfSBAdmFye2J9IEByZXN1bHR7fSBAdmFye2E9Yn0KK1BvcCB0d28gaW50ZWdlcnMgZnJvbSB0aGUgc3RhY2s7IGlmIHRoZXkgYXJlIGVxdWFsLCBwdXNoIHRoZSB2YWx1ZSBvbmU7CitvdGhlcndpc2UsIHB1c2ggdGhlIHZhbHVlIHplcm8uCisKK0BpdGVtIEBjb2Rle2xlc3Nfc2lnbmVkfSAoMHgxNCk6IEB2YXJ7YX0gQHZhcntifSBAcmVzdWx0e30gQHZhcnthPGJ9CitQb3AgdHdvIHNpZ25lZCBpbnRlZ2VycyBmcm9tIHRoZSBzdGFjazsgaWYgdGhlIG5leHQtdG8tdG9wIHZhbHVlIGlzIGxlc3MKK3RoYW4gdGhlIHRvcCB2YWx1ZSwgcHVzaCB0aGUgdmFsdWUgb25lOyBvdGhlcndpc2UsIHB1c2ggdGhlIHZhbHVlIHplcm8uCisKK0BpdGVtIEBjb2Rle2xlc3NfdW5zaWduZWR9ICgweDE1KTogQHZhcnthfSBAdmFye2J9IEByZXN1bHR7fSBAdmFye2E8Yn0KK1BvcCB0d28gdW5zaWduZWQgaW50ZWdlcnMgZnJvbSB0aGUgc3RhY2s7IGlmIHRoZSBuZXh0LXRvLXRvcCB2YWx1ZSBpcyBsZXNzCit0aGFuIHRoZSB0b3AgdmFsdWUsIHB1c2ggdGhlIHZhbHVlIG9uZTsgb3RoZXJ3aXNlLCBwdXNoIHRoZSB2YWx1ZSB6ZXJvLgorCitAaXRlbSBAY29kZXtleHR9ICgweDE2KSBAdmFye259OiBAdmFye2F9IEByZXN1bHR7fSBAdmFye2F9LCBzaWduLWV4dGVuZGVkIGZyb20gQHZhcntufSBiaXRzCitQb3AgYW4gdW5zaWduZWQgdmFsdWUgZnJvbSB0aGUgc3RhY2s7IHRyZWF0aW5nIGl0IGFzIGFuIEB2YXJ7bn0tYml0Cit0d29zLWNvbXBsZW1lbnQgdmFsdWUsIGV4dGVuZCBpdCB0byBmdWxsIGxlbmd0aC4gIFRoaXMgbWVhbnMgdGhhdCBhbGwKK2JpdHMgdG8gdGhlIGxlZnQgb2YgYml0IEB2YXJ7bi0xfSAod2hlcmUgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBpcyBiaXQKKzApIGFyZSBzZXQgdG8gdGhlIHZhbHVlIG9mIGJpdCBAdmFye24tMX0uICBOb3RlIHRoYXQgQHZhcntufSBtYXkgYmUKK2xhcmdlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSB3aWR0aCBvZiB0aGUgc3RhY2sgZWxlbWVudHMgb2YgdGhlIGJ5dGVjb2RlCitlbmdpbmU7IGluIHRoaXMgY2FzZSwgdGhlIGJ5dGVjb2RlIHNob3VsZCBoYXZlIG5vIGVmZmVjdC4KKworVGhlIG51bWJlciBvZiBzb3VyY2UgYml0cyB0byBwcmVzZXJ2ZSwgQHZhcntufSwgaXMgZW5jb2RlZCBhcyBhIHNpbmdsZQorYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIGZvbGxvd2luZyB0aGUgQGNvZGV7ZXh0fSBieXRlY29kZS4KKworQGl0ZW0gQGNvZGV7emVyb19leHR9ICgweDJhKSBAdmFye259OiBAdmFye2F9IEByZXN1bHR7fSBAdmFye2F9LCB6ZXJvLWV4dGVuZGVkIGZyb20gQHZhcntufSBiaXRzCitQb3AgYW4gdW5zaWduZWQgdmFsdWUgZnJvbSB0aGUgc3RhY2s7IHplcm8gYWxsIGJ1dCB0aGUgYm90dG9tIEB2YXJ7bn0KK2JpdHMuICBUaGlzIG1lYW5zIHRoYXQgYWxsIGJpdHMgdG8gdGhlIGxlZnQgb2YgYml0IEB2YXJ7bi0xfSAod2hlcmUgdGhlCitsZWFzdCBzaWduaWZpY2FudCBiaXQgaXMgYml0IDApIGFyZSBzZXQgdG8gdGhlIHZhbHVlIG9mIGJpdCBAdmFye24tMX0uCisKK1RoZSBudW1iZXIgb2Ygc291cmNlIGJpdHMgdG8gcHJlc2VydmUsIEB2YXJ7bn0sIGlzIGVuY29kZWQgYXMgYSBzaW5nbGUKK2J5dGUgdW5zaWduZWQgaW50ZWdlciBmb2xsb3dpbmcgdGhlIEBjb2Rle3plcm9fZXh0fSBieXRlY29kZS4KKworQGl0ZW0gQGNvZGV7cmVmOH0gKDB4MTcpOiBAdmFye2FkZHJ9IEByZXN1bHR7fSBAdmFye2F9CitAaXRlbXggQGNvZGV7cmVmMTZ9ICgweDE4KTogQHZhcnthZGRyfSBAcmVzdWx0e30gQHZhcnthfQorQGl0ZW14IEBjb2Rle3JlZjMyfSAoMHgxOSk6IEB2YXJ7YWRkcn0gQHJlc3VsdHt9IEB2YXJ7YX0KK0BpdGVteCBAY29kZXtyZWY2NH0gKDB4MWEpOiBAdmFye2FkZHJ9IEByZXN1bHR7fSBAdmFye2F9CitQb3AgYW4gYWRkcmVzcyBAdmFye2FkZHJ9IGZyb20gdGhlIHN0YWNrLiAgRm9yIGJ5dGVjb2RlCitAY29kZXtyZWZ9QHZhcntufSwgZmV0Y2ggYW4gQHZhcntufS1iaXQgdmFsdWUgZnJvbSBAdmFye2FkZHJ9LCB1c2luZyB0aGUKK25hdHVyYWwgdGFyZ2V0IGVuZGlhbm5lc3MuICBQdXNoIHRoZSBmZXRjaGVkIHZhbHVlIGFzIGFuIHVuc2lnbmVkCitpbnRlZ2VyLgorCitOb3RlIHRoYXQgQHZhcnthZGRyfSBtYXkgbm90IGJlIGFsaWduZWQgaW4gYW55IHBhcnRpY3VsYXIgd2F5OyB0aGUKK0Bjb2Rle3JlZkB2YXJ7bn19IGJ5dGVjb2RlcyBzaG91bGQgb3BlcmF0ZSBjb3JyZWN0bHkgZm9yIGFueSBhZGRyZXNzLgorCitJZiBhdHRlbXB0aW5nIHRvIGFjY2VzcyBtZW1vcnkgYXQgQHZhcnthZGRyfSB3b3VsZCBjYXVzZSBhIHByb2Nlc3NvcgorZXhjZXB0aW9uIG9mIHNvbWUgc29ydCwgdGVybWluYXRlIHdpdGggYW4gZXJyb3IuCisKK0BpdGVtIEBjb2Rle3JlZl9mbG9hdH0gKDB4MWIpOiBAdmFye2FkZHJ9IEByZXN1bHR7fSBAdmFye2R9CitAaXRlbXggQGNvZGV7cmVmX2RvdWJsZX0gKDB4MWMpOiBAdmFye2FkZHJ9IEByZXN1bHR7fSBAdmFye2R9CitAaXRlbXggQGNvZGV7cmVmX2xvbmdfZG91YmxlfSAoMHgxZCk6IEB2YXJ7YWRkcn0gQHJlc3VsdHt9IEB2YXJ7ZH0KK0BpdGVteCBAY29kZXtsX3RvX2R9ICgweDFlKTogQHZhcnthfSBAcmVzdWx0e30gQHZhcntkfQorQGl0ZW14IEBjb2Rle2RfdG9fbH0gKDB4MWYpOiBAdmFye2R9IEByZXN1bHR7fSBAdmFye2F9CitOb3QgaW1wbGVtZW50ZWQgeWV0LgorCitAaXRlbSBAY29kZXtkdXB9ICgweDI4KTogQHZhcnthfSA9PiBAdmFye2F9IEB2YXJ7YX0KK1B1c2ggYW5vdGhlciBjb3B5IG9mIHRoZSBzdGFjaydzIHRvcCBlbGVtZW50LgorCitAaXRlbSBAY29kZXtzd2FwfSAoMHgyYik6IEB2YXJ7YX0gQHZhcntifSA9PiBAdmFye2J9IEB2YXJ7YX0KK0V4Y2hhbmdlIHRoZSB0b3AgdHdvIGl0ZW1zIG9uIHRoZSBzdGFjay4KKworQGl0ZW0gQGNvZGV7cG9wfSAoMHgyOSk6IEB2YXJ7YX0gPT4KK0Rpc2NhcmQgdGhlIHRvcCB2YWx1ZSBvbiB0aGUgc3RhY2suCisKK0BpdGVtIEBjb2Rle2lmX2dvdG99ICgweDIwKSBAdmFye29mZnNldH06IEB2YXJ7YX0gQHJlc3VsdHt9CitQb3AgYW4gaW50ZWdlciBvZmYgdGhlIHN0YWNrOyBpZiBpdCBpcyBub24temVybywgYnJhbmNoIHRvIHRoZSBnaXZlbgorb2Zmc2V0IGluIHRoZSBieXRlY29kZSBzdHJpbmcuICBPdGhlcndpc2UsIGNvbnRpbnVlIHRvIHRoZSBuZXh0CitpbnN0cnVjdGlvbiBpbiB0aGUgYnl0ZWNvZGUgc3RyZWFtLiAgSW4gb3RoZXIgd29yZHMsIGlmIEB2YXJ7YX0gaXMKK25vbi16ZXJvLCBzZXQgdGhlIEBjb2Rle3BjfSByZWdpc3RlciB0byBAY29kZXtzdGFydH0gKyBAdmFye29mZnNldH0uCitUaHVzLCBhbiBvZmZzZXQgb2YgemVybyBkZW5vdGVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGV4cHJlc3Npb24uCisKK1RoZSBAdmFye29mZnNldH0gaXMgc3RvcmVkIGFzIGEgc2l4dGVlbi1iaXQgdW5zaWduZWQgdmFsdWUsIHN0b3JlZAoraW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBAY29kZXtpZl9nb3RvfSBieXRlY29kZS4gIEl0IGlzIGFsd2F5cyBzdG9yZWQKK21vc3Qgc2lnbmZpY2FudCBieXRlIGZpcnN0LCByZWdhcmRsZXNzIG9mIHRoZSB0YXJnZXQncyBub3JtYWwKK2VuZGlhbm5lc3MuICBUaGUgb2Zmc2V0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGZhbGwgYXQgYW55IHBhcnRpY3VsYXIKK2FsaWdubWVudCB3aXRoaW4gdGhlIGJ5dGVjb2RlIHN0cmVhbTsgdGh1cywgb24gbWFjaGluZXMgd2hlcmUgZmV0Y2hpbmcgYQorMTYtYml0IG9uIGFuIHVuYWxpZ25lZCBhZGRyZXNzIHJhaXNlcyBhbiBleGNlcHRpb24sIHlvdSBzaG91bGQgZmV0Y2ggdGhlCitvZmZzZXQgb25lIGJ5dGUgYXQgYSB0aW1lLgorCitAaXRlbSBAY29kZXtnb3RvfSAoMHgyMSkgQHZhcntvZmZzZXR9OiBAcmVzdWx0e30KK0JyYW5jaCB1bmNvbmRpdGlvbmFsbHkgdG8gQHZhcntvZmZzZXR9OyBpbiBvdGhlciB3b3Jkcywgc2V0IHRoZQorQGNvZGV7cGN9IHJlZ2lzdGVyIHRvIEBjb2Rle3N0YXJ0fSArIEB2YXJ7b2Zmc2V0fS4KKworVGhlIG9mZnNldCBpcyBzdG9yZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGZvciB0aGUgQGNvZGV7aWZfZ290b30gYnl0ZWNvZGUuCisKK0BpdGVtIEBjb2Rle2NvbnN0OH0gKDB4MjIpIEB2YXJ7bn06IEByZXN1bHR7fSBAdmFye259CitAaXRlbXggQGNvZGV7Y29uc3QxNn0gKDB4MjMpIEB2YXJ7bn06IEByZXN1bHR7fSBAdmFye259CitAaXRlbXggQGNvZGV7Y29uc3QzMn0gKDB4MjQpIEB2YXJ7bn06IEByZXN1bHR7fSBAdmFye259CitAaXRlbXggQGNvZGV7Y29uc3Q2NH0gKDB4MjUpIEB2YXJ7bn06IEByZXN1bHR7fSBAdmFye259CitQdXNoIHRoZSBpbnRlZ2VyIGNvbnN0YW50IEB2YXJ7bn0gb24gdGhlIHN0YWNrLCB3aXRob3V0IHNpZ24gZXh0ZW5zaW9uLgorVG8gcHJvZHVjZSBhIHNtYWxsIG5lZ2F0aXZlIHZhbHVlLCBwdXNoIGEgc21hbGwgdHdvcy1jb21wbGVtZW50IHZhbHVlLAorYW5kIHRoZW4gc2lnbi1leHRlbmQgaXQgdXNpbmcgdGhlIEBjb2Rle2V4dH0gYnl0ZWNvZGUuCisKK1RoZSBjb25zdGFudCBAdmFye259IGlzIHN0b3JlZCBpbiB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGJ5dGVzCitmb2xsb3dpbmcgdGhlIEBjb2Rle2NvbnN0fUB2YXJ7Yn0gYnl0ZWNvZGUuICBUaGUgY29uc3RhbnQgQHZhcntufSBpcworYWx3YXlzIHN0b3JlZCBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QsIHJlZ2FyZGxlc3Mgb2YgdGhlIHRhcmdldCdzCitub3JtYWwgZW5kaWFubmVzcy4gIFRoZSBjb25zdGFudCBpcyBub3QgZ3VhcmFudGVlZCB0byBmYWxsIGF0IGFueQorcGFydGljdWxhciBhbGlnbm1lbnQgd2l0aGluIHRoZSBieXRlY29kZSBzdHJlYW07IHRodXMsIG9uIG1hY2hpbmVzIHdoZXJlCitmZXRjaGluZyBhIDE2LWJpdCBvbiBhbiB1bmFsaWduZWQgYWRkcmVzcyByYWlzZXMgYW4gZXhjZXB0aW9uLCB5b3UKK3Nob3VsZCBmZXRjaCBAdmFye259IG9uZSBieXRlIGF0IGEgdGltZS4KKworQGl0ZW0gQGNvZGV7cmVnfSAoMHgyNikgQHZhcntufTogQHJlc3VsdHt9IEB2YXJ7YX0KK1B1c2ggdGhlIHZhbHVlIG9mIHJlZ2lzdGVyIG51bWJlciBAdmFye259LCB3aXRob3V0IHNpZ24gZXh0ZW5zaW9uLiAgVGhlCityZWdpc3RlcnMgYXJlIG51bWJlcmVkIGZvbGxvd2luZyBHREIncyBjb252ZW50aW9ucy4KKworVGhlIHJlZ2lzdGVyIG51bWJlciBAdmFye259IGlzIGVuY29kZWQgYXMgYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlcgoraW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBAY29kZXtyZWd9IGJ5dGVjb2RlLiAgSXQgaXMgYWx3YXlzIHN0b3JlZCBtb3N0CitzaWduZmljYW50IGJ5dGUgZmlyc3QsIHJlZ2FyZGxlc3Mgb2YgdGhlIHRhcmdldCdzIG5vcm1hbCBlbmRpYW5uZXNzLgorVGhlIHJlZ2lzdGVyIG51bWJlciBpcyBub3QgZ3VhcmFudGVlZCB0byBmYWxsIGF0IGFueSBwYXJ0aWN1bGFyCithbGlnbm1lbnQgd2l0aGluIHRoZSBieXRlY29kZSBzdHJlYW07IHRodXMsIG9uIG1hY2hpbmVzIHdoZXJlIGZldGNoaW5nIGEKKzE2LWJpdCBvbiBhbiB1bmFsaWduZWQgYWRkcmVzcyByYWlzZXMgYW4gZXhjZXB0aW9uLCB5b3Ugc2hvdWxkIGZldGNoIHRoZQorcmVnaXN0ZXIgbnVtYmVyIG9uZSBieXRlIGF0IGEgdGltZS4KKworQGl0ZW0gQGNvZGV7dHJhY2V9ICgweDBjKTogQHZhcnthZGRyfSBAdmFye3NpemV9IEByZXN1bHR7fQorUmVjb3JkIHRoZSBjb250ZW50cyBvZiB0aGUgQHZhcntzaXplfSBieXRlcyBhdCBAdmFye2FkZHJ9IGluIGEgdHJhY2UKK2J1ZmZlciwgZm9yIGxhdGVyIHJldHJpZXZhbCBieSBHREIuCisKK0BpdGVtIEBjb2Rle3RyYWNlX3F1aWNrfSAoMHgwZCkgQHZhcntzaXplfTogQHZhcnthZGRyfSBAcmVzdWx0e30gQHZhcnthZGRyfQorUmVjb3JkIHRoZSBjb250ZW50cyBvZiB0aGUgQHZhcntzaXplfSBieXRlcyBhdCBAdmFye2FkZHJ9IGluIGEgdHJhY2UKK2J1ZmZlciwgZm9yIGxhdGVyIHJldHJpZXZhbCBieSBHREIuICBAdmFye3NpemV9IGlzIGEgc2luZ2xlIGJ5dGUKK3Vuc2lnbmVkIGludGVnZXIgZm9sbG93aW5nIHRoZSBAY29kZXt0cmFjZX0gb3Bjb2RlLgorCitUaGlzIGJ5dGVjb2RlIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHNlcXVlbmNlIEBjb2Rle2R1cCBjb25zdDggQHZhcntzaXplfQordHJhY2V9LCBidXQgd2UgcHJvdmlkZSBpdCBhbnl3YXkgdG8gc2F2ZSBzcGFjZSBpbiBieXRlY29kZSBzdHJpbmdzLgorCitAaXRlbSBAY29kZXt0cmFjZTE2fSAoMHgzMCkgQHZhcntzaXplfTogQHZhcnthZGRyfSBAcmVzdWx0e30gQHZhcnthZGRyfQorSWRlbnRpY2FsIHRvIHRyYWNlX3F1aWNrLCBleGNlcHQgdGhhdCBAdmFye3NpemV9IGlzIGEgMTYtYml0IGJpZy1lbmRpYW4KK3Vuc2lnbmVkIGludGVnZXIsIG5vdCBhIHNpbmdsZSBieXRlLiAgVGhpcyBzaG91bGQgcHJvYmFibHkgaGF2ZSBiZWVuCituYW1lZCBAY29kZXt0cmFjZV9xdWljazE2fSwgZm9yIGNvbnNpc3RlbmN5LgorCitAaXRlbSBAY29kZXtlbmR9ICgweDI3KTogQHJlc3VsdHt9CitTdG9wIGV4ZWN1dGluZyBieXRlY29kZTsgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHRvcCBlbGVtZW50IG9mIHRoZQorc3RhY2suICBJZiB0aGUgcHVycG9zZSBvZiB0aGUgZXhwcmVzc2lvbiB3YXMgdG8gY29tcHV0ZSBhbiBsdmFsdWUgb3IgYQorcmFuZ2Ugb2YgbWVtb3J5LCB0aGVuIHRoZSBuZXh0LXRvLXRvcCBvZiB0aGUgc3RhY2sgaXMgdGhlIGx2YWx1ZSdzCithZGRyZXNzLCBhbmQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgaXMgdGhlIGx2YWx1ZSdzIHNpemUsIGluIGJ5dGVzLgorCitAZW5kIHRhYmxlCisKKworQG5vZGUgVXNpbmcgQWdlbnQgRXhwcmVzc2lvbnMKK0BzZWN0aW9uIFVzaW5nIEFnZW50IEV4cHJlc3Npb25zCisKK0hlcmUgaXMgYSBza2V0Y2ggb2YgYSBmdWxsIG5vbi1zdG9wIGRlYnVnZ2luZyBjeWNsZSwgc2hvd2luZyBob3cgYWdlbnQKK2V4cHJlc3Npb25zIGZpdCBpbnRvIHRoZSBwcm9jZXNzLgorCitAaXRlbWl6ZSBAYnVsbGV0CisKK0BpdGVtCitUaGUgdXNlciBzZWxlY3RzIHRyYWNlIHBvaW50cyBpbiB0aGUgcHJvZ3JhbSdzIGNvZGUgYXQgd2hpY2ggR0RCIHNob3VsZAorY29sbGVjdCBkYXRhLgorCitAaXRlbQorVGhlIHVzZXIgc3BlY2lmaWVzIGV4cHJlc3Npb25zIHRvIGV2YWx1YXRlIGF0IGVhY2ggdHJhY2UgcG9pbnQuICBUaGVzZQorZXhwcmVzc2lvbnMgbWF5IGRlbm90ZSBvYmplY3RzIGluIG1lbW9yeSwgaW4gd2hpY2ggY2FzZSB0aG9zZSBvYmplY3RzJworY29udGVudHMgYXJlIHJlY29yZGVkIGFzIHRoZSBwcm9ncmFtIHJ1bnMsIG9yIGNvbXB1dGVkIHZhbHVlcywgaW4gd2hpY2gKK2Nhc2UgdGhlIHZhbHVlcyB0aGVtc2VsdmVzIGFyZSByZWNvcmRlZC4KKworQGl0ZW0KK0dEQiB0cmFuc21pdHMgdGhlIHRyYWNlcG9pbnRzIGFuZCB0aGVpciBhc3NvY2lhdGVkIGV4cHJlc3Npb25zIHRvIHRoZQorR0RCIGFnZW50LCBydW5uaW5nIG9uIHRoZSBkZWJ1Z2dpbmcgdGFyZ2V0LgorCitAaXRlbQorVGhlIGFnZW50IGFycmFuZ2VzIHRvIGJlIG5vdGlmaWVkIHdoZW4gYSB0cmFjZSBwb2ludCBpcyBoaXQuICBOb3RlIHRoYXQsCitvbiBzb21lIHN5c3RlbXMsIHRoZSB0YXJnZXQgb3BlcmF0aW5nIHN5c3RlbSBpcyBjb21wbGV0ZWx5IHJlc3BvbnNpYmxlCitmb3IgY29sbGVjdGluZyB0aGUgZGF0YTsgc2VlIEByZWZ7VHJhY2luZyBvbiBTeW1tZXRyaXh9LgorCitAaXRlbQorV2hlbiBleGVjdXRpb24gb24gdGhlIHRhcmdldCByZWFjaGVzIGEgdHJhY2UgcG9pbnQsIHRoZSBhZ2VudCBldmFsdWF0ZXMKK3RoZSBleHByZXNzaW9ucyBhc3NvY2lhdGVkIHdpdGggdGhhdCB0cmFjZSBwb2ludCwgYW5kIHJlY29yZHMgdGhlCityZXN1bHRpbmcgdmFsdWVzIGFuZCBtZW1vcnkgcmFuZ2VzLgorCitAaXRlbQorTGF0ZXIsIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhIGdpdmVuIHRyYWNlIGV2ZW50IGFuZCBpbnNwZWN0cyB0aGUKK29iamVjdHMgYW5kIGV4cHJlc3Npb24gdmFsdWVzIHJlY29yZGVkLCBHREIgdGFsa3MgdG8gdGhlIGFnZW50IHRvCityZXRyaWV2ZSByZWNvcmRlZCBkYXRhIGFzIG5lY2Vzc2FyeSB0byBtZWV0IHRoZSB1c2VyJ3MgcmVxdWVzdHMuICBJZiB0aGUKK3VzZXIgYXNrcyB0byBzZWUgYW4gb2JqZWN0IHdob3NlIGNvbnRlbnRzIGhhdmUgbm90IGJlZW4gcmVjb3JkZWQsIEdEQgorcmVwb3J0cyBhbiBlcnJvci4KKworQGVuZCBpdGVtaXplCisKKworQG5vZGUgVmFyeWluZyBUYXJnZXQgQ2FwYWJpbGl0aWVzCitAc2VjdGlvbiBWYXJ5aW5nIFRhcmdldCBDYXBhYmlsaXRpZXMKKworU29tZSB0YXJnZXRzIGRvbid0IHN1cHBvcnQgZmxvYXRpbmctcG9pbnQsIGFuZCBzb21lIHdvdWxkIHJhdGhlciBub3QKK2hhdmUgdG8gZGVhbCB3aXRoIEBjb2Rle2xvbmcgbG9uZ30gb3BlcmF0aW9ucy4gIEFsc28sIGRpZmZlcmVudCB0YXJnZXRzCit3aWxsIGhhdmUgZGlmZmVyZW50IHN0YWNrIHNpemVzLCBhbmQgZGlmZmVyZW50IGJ5dGVjb2RlIGJ1ZmZlciBsZW5ndGhzLgorCitUaHVzLCBHREIgbmVlZHMgYSB3YXkgdG8gYXNrIHRoZSB0YXJnZXQgYWJvdXQgaXRzZWxmLiAgV2UgaGF2ZW4ndCB3b3JrZWQKK291dCB0aGUgZGV0YWlscyB5ZXQsIGJ1dCBpbiBnZW5lcmFsLCBHREIgc2hvdWxkIGJlIGFibGUgdG8gc2VuZCB0aGUKK3RhcmdldCBhIHBhY2tldCBhc2tpbmcgaXQgdG8gZGVzY3JpYmUgaXRzZWxmLiAgVGhlIHJlcGx5IHNob3VsZCBiZSBhCitwYWNrZXQgd2hvc2UgbGVuZ3RoIGlzIGV4cGxpY2l0LCBzbyB3ZSBjYW4gYWRkIG5ldyBpbmZvcm1hdGlvbiB0byB0aGUKK3BhY2tldCBpbiBmdXR1cmUgcmV2aXNpb25zIG9mIHRoZSBhZ2VudCwgd2l0aG91dCBjb25mdXNpbmcgb2xkIHZlcnNpb25zCitvZiBHREIsIGFuZCBpdCBzaG91bGQgY29udGFpbiBhIHZlcnNpb24gbnVtYmVyLiAgSXQgc2hvdWxkIGNvbnRhaW4gYXQKK2xlYXN0IHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisKK0BpdGVtaXplIEBidWxsZXQKKworQGl0ZW0KK3doZXRoZXIgZmxvYXRpbmcgcG9pbnQgaXMgc3VwcG9ydGVkCisKK0BpdGVtCit3aGV0aGVyIEBjb2Rle2xvbmcgbG9uZ30gaXMgc3VwcG9ydGVkCisKK0BpdGVtCittYXhpbXVtIGFjY2VwdGFibGUgc2l6ZSBvZiBieXRlY29kZSBzdGFjaworCitAaXRlbQorbWF4aW11bSBhY2NlcHRhYmxlIGxlbmd0aCBvZiBieXRlY29kZSBleHByZXNzaW9ucworCitAaXRlbQord2hpY2ggcmVnaXN0ZXJzIGFyZSBhY3R1YWxseSBhdmFpbGFibGUgZm9yIGNvbGxlY3Rpb24KKworQGl0ZW0KK3doZXRoZXIgdGhlIHRhcmdldCBzdXBwb3J0cyBkaXNhYmxlZCB0cmFjZXBvaW50cworCitAZW5kIGl0ZW1pemUKKworCisKK0Bub2RlIFRyYWNpbmcgb24gU3ltbWV0cml4CitAc2VjdGlvbiBUcmFjaW5nIG9uIFN5bW1ldHJpeAorCitUaGlzIHNlY3Rpb24gZG9jdW1lbnRzIHRoZSBBUEkgdXNlZCBieSB0aGUgR0RCIGFnZW50IHRvIGNvbGxlY3QgZGF0YSBvbgorU3ltbWV0cml4IHN5c3RlbXMuCisKK0N5Z251cyBvcmlnaW5hbGx5IGltcGxlbWVudGVkIHRoZXNlIHRyYWNpbmcgZmVhdHVyZXMgdG8gaGVscCBFTUMKK0NvcnBvcmF0aW9uIGRlYnVnIHRoZWlyIFN5bW1ldHJpeCBoaWdoLWF2YWlsYWJpbGl0eSBkaXNrIGRyaXZlcy4gIFRoZQorU3ltbWV0cml4IGFwcGxpY2F0aW9uIGNvZGUgYWxyZWFkeSBpbmNsdWRlcyBzdWJzdGFudGlhbCB0cmFjaW5nCitmYWNpbGl0aWVzOyB0aGUgR0RCIGFnZW50IGZvciB0aGUgU3ltbWV0cml4IHN5c3RlbSB1c2VzIHRob3NlIGZhY2lsaXRpZXMKK2ZvciBpdHMgb3duIGRhdGEgY29sbGVjdGlvbiwgdmlhIHRoZSBBUEkgZGVzY3JpYmVkIGhlcmUuCisKK0BkZWZ0eXBlZm4gRnVuY3Rpb24gRFRDX1JFU1BPTlNFIGFkYmdfZmluZF9tZW1vcnlfaW5fZnJhbWUgKEZSQU1FX0RFRiAqQHZhcntmcmFtZX0sIGNoYXIgKkB2YXJ7YWRkcmVzc30sIGNoYXIgKipAdmFye2J1ZmZlcn0sIHVuc2lnbmVkIGludCAqQHZhcntzaXplfSkKK1NlYXJjaCB0aGUgdHJhY2UgZnJhbWUgQHZhcntmcmFtZX0gZm9yIG1lbW9yeSBzYXZlZCBmcm9tIEB2YXJ7YWRkcmVzc30uCitJZiB0aGUgbWVtb3J5IGlzIGF2YWlsYWJsZSwgcHJvdmlkZSB0aGUgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGhvbGRpbmcKK2l0OyBvdGhlcndpc2UsIHByb3ZpZGUgdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgc2F2ZWQgYXJlYS4KKworQGl0ZW1pemUgQGJ1bGxldAorCitAaXRlbQorSWYgdGhlIG1lbW9yeSBhdCBAdmFye2FkZHJlc3N9IHdhcyBzYXZlZCBpbiBAdmFye2ZyYW1lfSwgc2V0CitAY29kZXsqQHZhcntidWZmZXJ9fSB0byBwb2ludCB0byB0aGUgYnVmZmVyIGluIHdoaWNoIHRoYXQgbWVtb3J5IHdhcworc2F2ZWQsIHNldCBAY29kZXsqQHZhcntzaXplfX0gdG8gdGhlIG51bWJlciBvZiBieXRlcyBmcm9tIEB2YXJ7YWRkcmVzc30KK3RoYXQgYXJlIHNhdmVkIGF0IEBjb2RleypAdmFye2J1ZmZlcn19LCBhbmQgcmV0dXJuCitAY29kZXtPS19UQVJHRVRfUkVTUE9OU0V9LiAgKENsZWFybHksIGluIHRoaXMgY2FzZSwgdGhlIGZ1bmN0aW9uIHdpbGwKK2Fsd2F5cyBzZXQgQGNvZGV7KkB2YXJ7c2l6ZX19IHRvIGEgdmFsdWUgZ3JlYXRlciB0aGFuIHplcm8uKQorCitAaXRlbQorSWYgQHZhcntmcmFtZX0gZG9lcyBub3QgcmVjb3JkIGFueSBtZW1vcnkgYXQgQHZhcnthZGRyZXNzfSwgc2V0CitAY29kZXsqQHZhcntzaXplfX0gdG8gdGhlIGRpc3RhbmNlIGZyb20gQHZhcnthZGRyZXNzfSB0byB0aGUgc3RhcnQgb2YKK3RoZSBzYXZlZCByZWdpb24gd2l0aCB0aGUgbG93ZXN0IGFkZHJlc3MgaGlnaGVyIHRoYW4gQHZhcnthZGRyZXNzfS4gIElmCit0aGVyZSBpcyBubyBtZW1vcnkgc2F2ZWQgZnJvbSBhbnkgaGlnaGVyIGFkZHJlc3MsIHNldCBAY29kZXsqQHZhcntzaXplfX0KK3RvIHplcm8uICBSZXR1cm4gQGNvZGV7Tk9UX0ZPVU5EX1RBUkdFVF9SRVNQT05TRX0uCitAZW5kIGl0ZW1pemUKKworVGhlc2UgdHdvIHBvc3NpYmlsaXRpZXMgYWxsb3cgdGhlIGNhbGxlciB0byBlaXRoZXIgcmV0cmlldmUgdGhlIGRhdGEsIG9yCit3YWxrIHRoZSBhZGRyZXNzIHNwYWNlIHRvIHRoZSBuZXh0IHNhdmVkIGFyZWEuCitAZW5kIGRlZnR5cGVmbgorCitUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgR0RCIGFnZW50IHRvIG1hcCB0aGUgcmVnaW9ucyBvZiBtZW1vcnkgc2F2ZWQgaW4KK2EgcGFydGljdWxhciBmcmFtZSwgYW5kIHJldHJpZXZlIHRoZWlyIGNvbnRlbnRzIGVmZmljaWVudGx5LgorCitUaGlzIGZ1bmN0aW9uIGFsc28gcHJvdmlkZXMgYSBjbGVhbiBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgR0RCIGFnZW50IGFuZAordGhlIFN5bW1ldHJpeCB0cmFjaW5nIHN0cnVjdHVyZXMsIG1ha2luZyBpdCBlYXNpZXIgdG8gYWRhcHQgdGhlIEdEQgorYWdlbnQgdG8gZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBTeW1tZXRyaXggc3lzdGVtLCBhbmQgdmljZSB2ZXJzYS4gIFRoaXMKK2Z1bmN0aW9uIHNlYXJjaGVzIGFsbCBkYXRhIHNhdmVkIGluIEB2YXJ7ZnJhbWV9LCB3aGV0aGVyIHRoZSBkYXRhIGlzCit0aGVyZSBhdCB0aGUgcmVxdWVzdCBvZiBhIGJ5dGVjb2RlIGV4cHJlc3Npb24sIG9yIGJlY2F1c2UgaXQgZmFsbHMgaW4KK29uZSBvZiB0aGUgZm9ybWF0J3MgbWVtb3J5IHJhbmdlcywgb3IgYmVjYXVzZSBpdCB3YXMgc2F2ZWQgZnJvbSB0aGUgdG9wCitvZiB0aGUgc3RhY2suICBFTUMgY2FuIGFyYml0cmFyaWx5IGNoYW5nZSBhbmQgZW5oYW5jZSB0aGUgdHJhY2luZworbWVjaGFuaXNtLCBidXQgYXMgbG9uZyBhcyB0aGlzIGZ1bmN0aW9uIHdvcmtzIHByb3Blcmx5LCBhbGwgY29sbGVjdGVkCittZW1vcnkgaXMgdmlzaWJsZSB0byBHREIuCisKK1RoZSBmdW5jdGlvbiBpdHNlbGYgaXMgc3RyYWlnaHRmb3J3YXJkIHRvIGltcGxlbWVudC4gIEEgc2luZ2xlIHBhc3Mgb3ZlcgordGhlIHRyYWNlIGZyYW1lJ3Mgc3RhY2sgYXJlYSwgbWVtb3J5IHJhbmdlcywgYW5kIGV4cHJlc3Npb24gYmxvY2tzIGNhbgoreWllbGQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciAoaWYgdGhlIHJlcXVlc3RlZCBhZGRyZXNzIHdhcyBzYXZlZCksCithbmQgYWxzbyBub3RlIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGhpZ2hlciByYW5nZSBvZiBtZW1vcnksIHRvIGJlCityZXR1cm5lZCB3aGVuIHRoZSBzZWFyY2ggZmFpbHMuCisKK0FzIGFuIGV4YW1wbGUsIHN1cHBvc2UgdGhlIHRyYWNlIGZyYW1lIEBjb2Rle2Z9IGhhcyBzYXZlZCBzaXh0ZWVuIGJ5dGVzCitmcm9tIGFkZHJlc3MgQGNvZGV7MHg4MDAwfSBpbiBhIGJ1ZmZlciBhdCBAY29kZXsweDEwMDB9LCBhbmQgdGhpcnR5LXR3bworYnl0ZXMgZnJvbSBhZGRyZXNzIEBjb2RlezB4YzAwMH0gaW4gYSBidWZmZXIgYXQgQGNvZGV7MHgxMDEwfS4gIEhlcmUgYXJlCitzb21lIHNhbXBsZSBjYWxscywgYW5kIHRoZSBlZmZlY3QgZWFjaCB3b3VsZCBoYXZlOgorCitAdGFibGUgQGNvZGUKKworQGl0ZW0gYWRiZ19maW5kX21lbW9yeV9pbl9mcmFtZSAoZiwgKGNoYXIqKSAweDgwMDAsICZidWZmZXIsICZzaXplKQorVGhpcyB3b3VsZCBzZXQgQGNvZGV7YnVmZmVyfSB0byBAY29kZXsweDEwMDB9LCBzZXQgQGNvZGV7c2l6ZX0gdG8KK3NpeHRlZW4sIGFuZCByZXR1cm4gQGNvZGV7T0tfVEFSR0VUX1JFU1BPTlNFfSwgc2luY2UgQGNvZGV7Zn0gc2F2ZXMKK3NpeHRlZW4gYnl0ZXMgZnJvbSBAY29kZXsweDgwMDB9IGF0IEBjb2RlezB4MTAwMH0uCisKK0BpdGVtIGFkYmdfZmluZF9tZW1vcnlfaW5fZnJhbWUgKGYsIChjaGFyICopIDB4ODAwNCwgJmJ1ZmZlciwgJnNpemUpCitUaGlzIHdvdWxkIHNldCBAY29kZXtidWZmZXJ9IHRvIEBjb2RlezB4MTAwNH0sIHNldCBAY29kZXtzaXplfSB0bwordHdlbHZlLCBhbmQgcmV0dXJuIEBjb2Rle09LX1RBUkdFVF9SRVNQT05TRX0sIHNpbmNlIEBmaWxle2Z9IHNhdmVzIHRoZQordHdlbHZlIGJ5dGVzIGZyb20gQGNvZGV7MHg4MDA0fSBzdGFydGluZyBmb3VyIGJ5dGVzIGludG8gdGhlIGJ1ZmZlciBhdAorQGNvZGV7MHgxMDAwfS4gIFRoaXMgc2hvd3MgdGhhdCByZXF1ZXN0IGFkZHJlc3NlcyBtYXkgZmFsbCBpbiB0aGUgbWlkZGxlCitvZiBzYXZlZCBhcmVhczsgdGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIGFkZHJlc3MgYW5kIHNpemUgb2YgdGhlCityZW1haW5kZXIgb2YgdGhlIGJ1ZmZlci4KKworQGl0ZW0gYWRiZ19maW5kX21lbW9yeV9pbl9mcmFtZSAoZiwgKGNoYXIgKikgMHg4MTAwLCAmYnVmZmVyLCAmc2l6ZSkKK1RoaXMgd291bGQgc2V0IEBjb2Rle3NpemV9IHRvIEBjb2RlezB4M2YwMH0gYW5kIHJldHVybgorQGNvZGV7Tk9UX0ZPVU5EX1RBUkdFVF9SRVNQT05TRX0sIHNpbmNlIHRoZXJlIGlzIG5vIG1lbW9yeSBzYXZlZCBpbgorQGNvZGV7Zn0gZnJvbSB0aGUgYWRkcmVzcyBAY29kZXsweDgxMDB9LCBhbmQgdGhlIG5leHQgbWVtb3J5IGF2YWlsYWJsZQoraXMgYXQgQGNvZGV7MHg4MTAwICsgMHgzZjAwfSwgb3IgQGNvZGV7MHhjMDAwfS4gIFRoaXMgc2hvd3MgdGhhdCByZXF1ZXN0CithZGRyZXNzZXMgbWF5IGZhbGwgb3V0c2lkZSBvZiBhbGwgc2F2ZWQgbWVtb3J5IHJhbmdlczsgdGhlIGZ1bmN0aW9uCitzaG91bGQgaW5kaWNhdGUgdGhlIG5leHQgc2F2ZWQgYXJlYSwgaWYgYW55LgorCitAaXRlbSBhZGJnX2ZpbmRfbWVtb3J5X2luX2ZyYW1lIChmLCAoY2hhciAqKSAweDcwMDAsICZidWZmZXIsICZzaXplKQorVGhpcyB3b3VsZCBzZXQgQGNvZGV7c2l6ZX0gdG8gQGNvZGV7MHgxMDAwfSBhbmQgcmV0dXJuCitAY29kZXtOT1RfRk9VTkRfVEFSR0VUX1JFU1BPTlNFfSwgc2luY2UgdGhlIG5leHQgc2F2ZWQgbWVtb3J5IGlzIGF0CitAY29kZXsweDcwMDAgKyAweDEwMDB9LCBvciBAY29kZXsweDgwMDB9LgorCitAaXRlbSBhZGJnX2ZpbmRfbWVtb3J5X2luX2ZyYW1lIChmLCAoY2hhciAqKSAweGYwMDAsICZidWZmZXIsICZzaXplKQorVGhpcyB3b3VsZCBzZXQgQGNvZGV7c2l6ZX0gdG8gemVybywgYW5kIHJldHVybgorQGNvZGV7Tk9UX0ZPVU5EX1RBUkdFVF9SRVNQT05TRX0uICBUaGlzIHNob3dzIGhvdyB0aGUgZnVuY3Rpb24gdGVsbHMgdGhlCitjYWxsZXIgdGhhdCBubyBmdXJ0aGVyIG1lbW9yeSByYW5nZXMgaGF2ZSBiZWVuIHNhdmVkLgorCitAZW5kIHRhYmxlCisKK0FzIGFub3RoZXIgZXhhbXBsZSwgaGVyZSBpcyBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgcHJpbnQgb3V0IHRoZQorYWRkcmVzc2VzIG9mIGFsbCBtZW1vcnkgc2F2ZWQgaW4gdGhlIHRyYWNlIGZyYW1lIEBjb2Rle2ZyYW1lfSBvbiB0aGUKK1N5bW1ldHJpeCBJTkxJTkVTIGNvbnNvbGU6CitAZXhhbXBsZQordm9pZAorcHJpbnRfZnJhbWVfYWRkcmVzc2VzIChGUkFNRV9ERUYgKmZyYW1lKQorQHsKKyAgY2hhciAqYWRkcjsKKyAgY2hhciAqYnVmZmVyOworICB1bnNpZ25lZCBsb25nIHNpemU7CisKKyAgYWRkciA9IDA7CisgIGZvciAoOzspCisgICAgQHsKKyAgICAgIC8qIEVpdGhlciBmaW5kIG91dCBob3cgbXVjaCBtZW1vcnkgd2UgaGF2ZSBoZXJlLCBvciBkaXNjb3ZlcgorICAgICAgICAgd2hlcmUgdGhlIG5leHQgc2F2ZWQgcmVnaW9uIGlzLiAgKi8KKyAgICAgIGlmIChhZGJnX2ZpbmRfbWVtb3J5X2luX2ZyYW1lIChmcmFtZSwgYWRkciwgJmJ1ZmZlciwgJnNpemUpCisgICAgICAgICAgPT0gT0tfVEFSR0VUX1JFU1BPTlNFKQorICAgICAgICBwcmludHAgKCJzYXZlZCAleCB0byAleFxuIiwgYWRkciwgYWRkciArIHNpemUpOworICAgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBhZGRyICs9IHNpemU7CisgICAgQH0KK0B9CitAZW5kIGV4YW1wbGUKKworTm90ZSB0aGF0IHRoZXJlIGlzIG5vdCBuZWNlc3NhcmlseSBhbnkgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBvcmRlciBpbgord2hpY2ggdGhlIGRhdGEgaXMgc2F2ZWQgaW4gdGhlIHRyYWNlIGZyYW1lLCBhbmQgdGhlIG9yZGVyIGluIHdoaWNoCitAY29kZXthZGJnX2ZpbmRfbWVtb3J5X2luX2ZyYW1lfSB3aWxsIHJldHVybiB0aG9zZSBtZW1vcnkgcmFuZ2VzLiAgVGhlCitjb2RlIGFib3ZlIHdpbGwgYWx3YXlzIHByaW50IHRoZSBzYXZlZCBtZW1vcnkgcmVnaW9ucyBpbiBvcmRlciBvZgoraW5jcmVhc2luZyBhZGRyZXNzLCB3aGlsZSB0aGUgdW5kZXJseWluZyBmcmFtZSBzdHJ1Y3R1cmUgbWlnaHQgc3RvcmUgdGhlCitkYXRhIGluIGEgcmFuZG9tIG9yZGVyLgorCitbW1RoaXMgc2VjdGlvbiBzaG91bGQgY292ZXIgdGhlIHJlc3Qgb2YgdGhlIFN5bW1ldHJpeCBmdW5jdGlvbnMgdGhlIHN0dWIKK3JlbGllcyB1cG9uLCB0b28uXV0KKworQG5vZGUgUmF0aW9uYWxlCitAc2VjdGlvbiBSYXRpb25hbGUKKworU29tZSBvZiB0aGUgZGVzaWduIGRlY2lzaW9ucyBhcHBhcmVudCBhYm92ZSBhcmUgYXJndWFibGUuCisKK0B0YWJsZSBAYgorCitAaXRlbSBXaGF0IGFib3V0IHN0YWNrIG92ZXJmbG93L3VuZGVyZmxvdz8KK0dEQiBzaG91bGQgYmUgYWJsZSB0byBxdWVyeSB0aGUgdGFyZ2V0IHRvIGRpc2NvdmVyIGl0cyBzdGFjayBzaXplLgorR2l2ZW4gdGhhdCBpbmZvcm1hdGlvbiwgR0RCIGNhbiBkZXRlcm1pbmUgYXQgdHJhbnNsYXRpb24gdGltZSB3aGV0aGVyIGEKK2dpdmVuIGV4cHJlc3Npb24gd2lsbCBvdmVyZmxvdyB0aGUgc3RhY2suICBCdXQgdGhpcyBzcGVjIGlzbid0IGFib3V0Cit3aGF0IGtpbmRzIG9mIGVycm9yLWNoZWNraW5nIEdEQiBvdWdodCB0byBkby4KKworQGl0ZW0gV2h5IGFyZSB5b3UgZG9pbmcgZXZlcnl0aGluZyBpbiBMT05HRVNUPworCitTcGVlZCBpc24ndCBpbXBvcnRhbnQsIGJ1dCBhZ2VudCBjb2RlIHNpemUgaXM7IHVzaW5nIExPTkdFU1QgYnJpbmdzIGluIGEKK2J1bmNoIG9mIHN1cHBvcnQgY29kZSB0byBkbyB0aGluZ3MgbGlrZSBkaXZpc2lvbiwgZXRjLiAgU28gdGhpcyBpcyBhCitzZXJpb3VzIGNvbmNlcm4uCisKK0ZpcnN0LCBub3RlIHRoYXQgeW91IGRvbid0IG5lZWQgZGlmZmVyZW50IGJ5dGVjb2RlcyBmb3IgZGlmZmVyZW50CitvcGVyYW5kIHNpemVzLiAgWW91IGNhbiBnZW5lcmF0ZSBjb2RlIHdpdGhvdXQgQGVtcGh7a25vd2luZ30gaG93IGJpZyB0aGUKK3N0YWNrIGVsZW1lbnRzIGFjdHVhbGx5IGFyZSBvbiB0aGUgdGFyZ2V0LiAgSWYgdGhlIHRhcmdldCBvbmx5IHN1cHBvcnRzCiszMi1iaXQgaW50cywgYW5kIHlvdSBkb24ndCBzZW5kIGFueSA2NC1iaXQgYnl0ZWNvZGVzLCBldmVyeXRoaW5nIGp1c3QKK3dvcmtzLiAgVGhlIG9ic2VydmF0aW9uIGhlcmUgaXMgdGhhdCB0aGUgTUlQUyBhbmQgdGhlIEFscGhhIGhhdmUgb25seQorZml4ZWQtc2l6ZSByZWdpc3RlcnMsIGFuZCB5b3UgY2FuIHN0aWxsIGdldCBDJ3Mgc2VtYW50aWNzIGV2ZW4gdGhvdWdoCittb3N0IGluc3RydWN0aW9ucyBvbmx5IG9wZXJhdGUgb24gZnVsbC1zaXplZCB3b3Jkcy4gIFlvdSBqdXN0IG5lZWQgdG8KK21ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHByb3Blcmx5IHNpZ24tZXh0ZW5kZWQgYXQgdGhlIHJpZ2h0IHRpbWVzLiAgU28KK3RoZXJlIGlzIG5vIG5lZWQgZm9yIDMyLSBhbmQgNjQtYml0IHZhcmlhbnRzIG9mIHRoZSBieXRlY29kZXMuICBKdXN0CitpbXBsZW1lbnQgZXZlcnl0aGluZyB1c2luZyB0aGUgbGFyZ2VzdCBzaXplIHlvdSBzdXBwb3J0LgorCitHREIgc2hvdWxkIGNlcnRhaW5seSBjaGVjayB0byBzZWUgd2hhdCBzaXplcyB0aGUgdGFyZ2V0IHN1cHBvcnRzLCBzbyB0aGUKK3VzZXIgY2FuIGdldCBhbiBlcnJvciBlYXJsaWVyLCByYXRoZXIgdGhhbiBsYXRlci4gIEJ1dCB0aGlzIGluZm9ybWF0aW9uCitpcyBub3QgbmVjZXNzYXJ5IGZvciBjb3JyZWN0bmVzcy4KKworCitAaXRlbSBXaHkgZG9uJ3QgeW91IGhhdmUgQGNvZGV7Pn0gb3IgQGNvZGV7PD19IG9wZXJhdG9ycz8KK0kgd2FudCB0byBrZWVwIHRoZSBpbnRlcnByZXRlciBzbWFsbCwgYW5kIHdlIGRvbid0IG5lZWQgdGhlbS4gIFdlIGNhbgorY29tYmluZSB0aGUgQGNvZGV7bGVzc199IG9wY29kZXMgd2l0aCBAY29kZXtsb2dfbm90fSwgYW5kIHN3YXAgdGhlIG9yZGVyCitvZiB0aGUgb3BlcmFuZHMsIHlpZWxkaW5nIGFsbCBmb3VyIGFzeW1tZXRyaWNhbCBjb21wYXJpc29uIG9wZXJhdG9ycy4KK0ZvciBleGFtcGxlLCBAY29kZXsoeCA8PSB5KX0gaXMgQGNvZGV7ISAoeCA+IHkpfSwgd2hpY2ggaXMgQGNvZGV7ISAoeSA8Cit4KX0uCisKK0BpdGVtIFdoeSBkbyB5b3UgaGF2ZSBAY29kZXtsb2dfbm90fT8KK0BpdGVteCBXaHkgZG8geW91IGhhdmUgQGNvZGV7ZXh0fT8KK0BpdGVteCBXaHkgZG8geW91IGhhdmUgQGNvZGV7emVyb19leHR9PworVGhlc2UgYXJlIGFsbCBlYXNpbHkgc3ludGhlc2l6ZWQgZnJvbSBvdGhlciBpbnN0cnVjdGlvbnMsIGJ1dCBJIGV4cGVjdAordGhlbSB0byBiZSB1c2VkIGZyZXF1ZW50bHksIGFuZCB0aGV5J3JlIHNpbXBsZSwgc28gSSBpbmNsdWRlIHRoZW0gdG8KK2tlZXAgYnl0ZWNvZGUgc3RyaW5ncyBzaG9ydC4KKworQGNvZGV7bG9nX25vdH0gaXMgZXF1aXZhbGVudCB0byBAY29kZXtjb25zdDggMCBlcXVhbH07IGl0J3MgdXNlZCBpbiBoYWxmCit0aGUgcmVsYXRpb25hbCBvcGVyYXRvcnMuCisKK0Bjb2Rle2V4dCBAdmFye259fSBpcyBlcXVpdmFsZW50IHRvIEBjb2Rle2NvbnN0OCBAdmFye3Mtbn0gbHNoIGNvbnN0OAorQHZhcntzLW59IHJzaF9zaWduZWR9LCB3aGVyZSBAdmFye3N9IGlzIHRoZSBzaXplIG9mIHRoZSBzdGFjayBlbGVtZW50czsKK2l0IGZvbGxvd3MgQGNvZGV7cmVmQHZhcnttfX0gYW5kIEB2YXJ7cmVnfSBieXRlY29kZXMgd2hlbiB0aGUgdmFsdWUKK3Nob3VsZCBiZSBzaWduZWQuICBTZWUgdGhlIG5leHQgYnVsbGV0ZWQgaXRlbS4KKworQGNvZGV7emVyb19leHQgQHZhcntufX0gaXMgZXF1aXZhbGVudCB0byBAY29kZXtjb25zdEB2YXJ7bX0gQHZhcnttYXNrfQorbG9nX2FuZH07IGl0J3MgdXNlZCB3aGVuZXZlciB3ZSBwdXNoIHRoZSB2YWx1ZSBvZiBhIHJlZ2lzdGVyLCBiZWNhdXNlIHdlCitjYW4ndCBhc3N1bWUgdGhlIHVwcGVyIGJpdHMgb2YgdGhlIHJlZ2lzdGVyIGFyZW4ndCBnYXJiYWdlLgorCitAaXRlbSBXaHkgbm90IGhhdmUgc2lnbi1leHRlbmRpbmcgdmFyaWFudHMgb2YgdGhlIEBjb2Rle3JlZn0gb3BlcmF0b3JzPworQmVjYXVzZSB0aGF0IHdvdWxkIGRvdWJsZSB0aGUgbnVtYmVyIG9mIEBjb2Rle3JlZn0gb3BlcmF0b3JzLCBhbmQgd2UKK25lZWQgdGhlIEBjb2Rle2V4dH0gYnl0ZWNvZGUgYW55d2F5IGZvciBhY2Nlc3NpbmcgYml0ZmllbGRzLgorCitAaXRlbSBXaHkgbm90IGhhdmUgY29uc3RhbnQtYWRkcmVzcyB2YXJpYW50cyBvZiB0aGUgQGNvZGV7cmVmfSBvcGVyYXRvcnM/CitCZWNhdXNlIHRoYXQgd291bGQgZG91YmxlIHRoZSBudW1iZXIgb2YgQGNvZGV7cmVmfSBvcGVyYXRvcnMgYWdhaW4sIGFuZAorQGNvZGV7Y29uc3QzMiBAdmFye2FkZHJlc3N9IHJlZjMyfSBpcyBvbmx5IG9uZSBieXRlIGxvbmdlci4KKworQGl0ZW0gV2h5IGRvIHRoZSBAY29kZXtyZWZAdmFye259fSBvcGVyYXRvcnMgaGF2ZSB0byBzdXBwb3J0IHVuYWxpZ25lZCBmZXRjaGVzPworR0RCIHdpbGwgZ2VuZXJhdGUgYnl0ZWNvZGUgdGhhdCBmZXRjaGVzIG11bHRpLWJ5dGUgdmFsdWVzIGF0IHVuYWxpZ25lZAorYWRkcmVzc2VzIHdoZW5ldmVyIHRoZSBleGVjdXRhYmxlJ3MgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRlbGxzIGl0IHRvLgorRnVydGhlcm1vcmUsIEdEQiBkb2VzIG5vdCBrbm93IHRoZSB2YWx1ZSB0aGUgcG9pbnRlciB3aWxsIGhhdmUgd2hlbiBHREIKK2dlbmVyYXRlcyB0aGUgYnl0ZWNvZGUsIHNvIGl0IGNhbm5vdCBkZXRlcm1pbmUgd2hldGhlciBhIHBhcnRpY3VsYXIKK2ZldGNoIHdpbGwgYmUgYWxpZ25lZCBvciBub3QuCisKK0luIHBhcnRpY3VsYXIsIHN0cnVjdHVyZSBiaXRmaWVsZHMgbWF5IGJlIHNldmVyYWwgYnl0ZXMgbG9uZywgYnV0IGZvbGxvdworbm8gYWxpZ25tZW50IHJ1bGVzOyBtZW1iZXJzIG9mIHBhY2tlZCBzdHJ1Y3R1cmVzIGFyZSBub3QgbmVjZXNzYXJpbHkKK2FsaWduZWQgZWl0aGVyLgorCitJbiBnZW5lcmFsLCB0aGVyZSBhcmUgbWFueSBjYXNlcyB3aGVyZSB1bmFsaWduZWQgcmVmZXJlbmNlcyBvY2N1ciBpbgorY29ycmVjdCBDIGNvZGUsIGVpdGhlciBhdCB0aGUgcHJvZ3JhbW1lcidzIGV4cGxpY2l0IHJlcXVlc3QsIG9yIGF0IHRoZQorY29tcGlsZXIncyBkaXNjcmV0aW9uLiAgVGh1cywgaXQgaXMgc2ltcGxlciB0byBtYWtlIHRoZSBHREIgYWdlbnQKK2J5dGVjb2RlcyB3b3JrIGNvcnJlY3RseSBpbiBhbGwgY2lyY3Vtc3RhbmNlcyB0aGFuIHRvIG1ha2UgR0RCIGd1ZXNzIGluCitlYWNoIGNhc2Ugd2hldGhlciB0aGUgY29tcGlsZXIgZGlkIHRoZSB1c3VhbCB0aGluZy4KKworQGl0ZW0gV2h5IGFyZSB0aGVyZSBubyBzaWRlLWVmZmVjdGluZyBvcGVyYXRvcnM/CitCZWNhdXNlIG91ciBjdXJyZW50IGNsaWVudCBkb2Vzbid0IHdhbnQgdGhlbT8gIFRoYXQncyBhIGNoZWFwIGFuc3dlci4gIEkKK3RoaW5rIHRoZSByZWFsIGFuc3dlciBpcyB0aGF0IEknbSBhZnJhaWQgb2YgaW1wbGVtZW50aW5nIGZ1bmN0aW9uCitjYWxscy4gIFdlIHNob3VsZCByZS12aXNpdCB0aGlzIGlzc3VlIGFmdGVyIHRoZSBwcmVzZW50IGNvbnRyYWN0IGlzCitkZWxpdmVyZWQuCisKK0BpdGVtIFdoeSBhcmVuJ3QgdGhlIEBjb2Rle2dvdG99IG9wcyBQQy1yZWxhdGl2ZT8KK1RoZSBpbnRlcnByZXRlciBoYXMgdGhlIGJhc2UgYWRkcmVzcyBhcm91bmQgYW55d2F5IGZvciBQQyBib3VuZHMKK2NoZWNraW5nLCBhbmQgaXQgc2VlbWVkIHNpbXBsZXIuCisKK0BpdGVtIFdoeSBpcyB0aGVyZSBvbmx5IG9uZSBvZmZzZXQgc2l6ZSBmb3IgdGhlIEBjb2Rle2dvdG99IG9wcz8KK09mZnNldHMgYXJlIGN1cnJlbnRseSBzaXh0ZWVuIGJpdHMuICBJJ20gbm90IGhhcHB5IHdpdGggdGhpcyBzaXR1YXRpb24KK2VpdGhlcjoKKworU3VwcG9zZSB3ZSBoYXZlIG11bHRpcGxlIGJyYW5jaCBvcHMgd2l0aCBkaWZmZXJlbnQgb2Zmc2V0IHNpemVzLiAgQXMgSQorZ2VuZXJhdGUgY29kZSBsZWZ0LXRvLXJpZ2h0LCBhbGwgbXkganVtcHMgYXJlIGZvcndhcmQganVtcHMgKHRoZXJlIGFyZQorbm8gbG9vcHMgaW4gZXhwcmVzc2lvbnMpLCBzbyBJIG5ldmVyIGtub3cgdGhlIHRhcmdldCB3aGVuIEkgZW1pdCB0aGUKK2p1bXAgb3Bjb2RlLiAgVGh1cywgSSBoYXZlIHRvIGVpdGhlciBhbHdheXMgYXNzdW1lIHRoZSBsYXJnZXN0IG9mZnNldAorc2l6ZSwgb3IgZG8ganVtcCByZWxheGF0aW9uIG9uIHRoZSBjb2RlIGFmdGVyIEkgZ2VuZXJhdGUgaXQsIHdoaWNoIHNlZW1zCitsaWtlIGEgYmlnIHdhc3RlIG9mIHRpbWUuCisKK0kgY2FuIGltYWdpbmUgYSByZWFzb25hYmxlIGV4cHJlc3Npb24gYmVpbmcgbG9uZ2VyIHRoYW4gMjU2IGJ5dGVzLiAgSQorY2FuJ3QgaW1hZ2luZSBvbmUgYmVpbmcgbG9uZ2VyIHRoYW4gNjRrLiAgVGh1cywgd2UgbmVlZCAxNi1iaXQgb2Zmc2V0cy4KK1RoaXMga2luZCBvZiByZWFzb25pbmcgaXMgc28gYm9ndXMsIGJ1dCByZWxheGF0aW9uIGlzIHBhdGhldGljLgorCitUaGUgb3RoZXIgYXBwcm9hY2ggd291bGQgYmUgdG8gZ2VuZXJhdGUgY29kZSByaWdodC10by1sZWZ0LiAgVGhlbiBJJ2QKK2Fsd2F5cyBrbm93IG15IG9mZnNldCBzaXplLiAgVGhhdCBtaWdodCBiZSBmdW4uCisKK0BpdGVtIFdoZXJlIGlzIHRoZSBmdW5jdGlvbiBjYWxsIGJ5dGVjb2RlPworCitXaGVuIHdlIGFkZCBzaWRlLWVmZmVjdHMsIHdlIHNob3VsZCBhZGQgdGhpcy4KKworQGl0ZW0gV2h5IGRvZXMgdGhlIEBjb2Rle3JlZ30gYnl0ZWNvZGUgdGFrZSBhIDE2LWJpdCByZWdpc3RlciBudW1iZXI/CisKK0ludGVsJ3MgSUE2NC1hcmNoaXRlY3R1cmUsIE1lcmNlZCwgaGFzIDEyOCBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzLAorYW5kIDEyOCBmbG9hdGluZy1wb2ludCByZWdpc3RlcnMsIGFuZCBJJ20gc3VyZSBpdCBoYXMgc29tZSByYW5kb20KK2NvbnRyb2wgcmVnaXN0ZXJzLgorCitAaXRlbSBXaHkgZG8gd2UgbmVlZCBAY29kZXt0cmFjZX0gYW5kIEBjb2Rle3RyYWNlX3F1aWNrfT8KK0JlY2F1c2UgR0RCIG5lZWRzIHRvIHJlY29yZCBhbGwgdGhlIG1lbW9yeSBjb250ZW50cyBhbmQgcmVnaXN0ZXJzIGFuCitleHByZXNzaW9uIHRvdWNoZXMuICBJZiB0aGUgdXNlciB3YW50cyB0byBldmFsdWF0ZSBhbiBleHByZXNzaW9uCitAY29kZXt4LT55LT56fSwgdGhlIGFnZW50IG11c3QgcmVjb3JkIHRoZSB2YWx1ZXMgb2YgQGNvZGV7eH0gYW5kCitAY29kZXt4LT55fSBhcyB3ZWxsIGFzIHRoZSB2YWx1ZSBvZiBAY29kZXt4LT55LT56fS4KKworQGl0ZW0gRG9uJ3QgdGhlIEBjb2Rle3RyYWNlfSBieXRlY29kZXMgbWFrZSB0aGUgaW50ZXJwcmV0ZXIgbGVzcyBnZW5lcmFsPworVGhleSBkbyBtZWFuIHRoYXQgdGhlIGludGVycHJldGVyIGNvbnRhaW5zIHNwZWNpYWwtcHVycG9zZSBjb2RlLCBidXQKK3RoYXQgZG9lc24ndCBtZWFuIHRoZSBpbnRlcnByZXRlciBjYW4gb25seSBiZSB1c2VkIGZvciB0aGF0IHB1cnBvc2UuICBJZgorYW4gZXhwcmVzc2lvbiBkb2Vzbid0IHVzZSB0aGUgQGNvZGV7dHJhY2V9IGJ5dGVjb2RlcywgdGhleSBkb24ndCBnZXQgaW4KK2l0cyB3YXkuCisKK0BpdGVtIFdoeSBkb2Vzbid0IEBjb2Rle3RyYWNlX3F1aWNrfSBjb25zdW1lIGl0cyBhcmd1bWVudHMgdGhlIHdheSBldmVyeXRoaW5nIGVsc2UgZG9lcz8KK0luIGdlbmVyYWwsIHlvdSBkbyB3YW50IHlvdXIgb3BlcmF0b3JzIHRvIGNvbnN1bWUgdGhlaXIgYXJndW1lbnRzOyBpdCdzCitjb25zaXN0ZW50LCBhbmQgZ2VuZXJhbGx5IHJlZHVjZXMgdGhlIGFtb3VudCBvZiBzdGFjayByZWFycmFuZ2VtZW50CituZWNlc3NhcnkuICBIb3dldmVyLCBAY29kZXt0cmFjZV9xdWlja30gaXMgYSBrbHVkZ2UgdG8gc2F2ZSBzcGFjZTsgaXQKK29ubHkgZXhpc3RzIHNvIHdlIG5lZWRuJ3Qgd3JpdGUgQGNvZGV7ZHVwIGNvbnN0OCBAdmFye1NJWkV9IHRyYWNlfQorYmVmb3JlIGV2ZXJ5IG1lbW9yeSByZWZlcmVuY2UuICBUaGVyZWZvcmUsIGl0J3Mgb2theSBmb3IgaXQgbm90IHRvCitjb25zdW1lIGl0cyBhcmd1bWVudHM7IGl0J3MgbWVhbnQgZm9yIGEgc3BlY2lmaWMgY29udGV4dCBpbiB3aGljaCB3ZQora25vdyBleGFjdGx5IHdoYXQgaXQgc2hvdWxkIGRvIHdpdGggdGhlIHN0YWNrLiAgSWYgd2UncmUgZ29pbmcgdG8gaGF2ZSBhCitrbHVkZ2UsIGl0IHNob3VsZCBiZSBhbiBlZmZlY3RpdmUga2x1ZGdlLgorCitAaXRlbSBXaHkgZG9lcyBAY29kZXt0cmFjZTE2fSBleGlzdD8KK1RoYXQgb3Bjb2RlIHdhcyBhZGRlZCBieSB0aGUgY3VzdG9tZXIgdGhhdCBjb250cmFjdGVkIEN5Z251cyBmb3IgdGhlCitkYXRhIHRyYWNpbmcgd29yay4gIEkgcGVyc29uYWxseSB0aGluayBpdCBpcyB1bm5lY2Vzc2FyeTsgb2JqZWN0cyB0aGF0CitsYXJnZSB3aWxsIGJlIHF1aXRlIHJhcmUsIHNvIGl0IGlzIG9rYXkgdG8gdXNlIEBjb2Rle2R1cCBjb25zdDE2CitAdmFye3NpemV9IHRyYWNlfSBpbiB0aG9zZSBjYXNlcy4KKworV2hhdGV2ZXIgd2UgZGVjaWRlIHRvIGRvIHdpdGggQGNvZGV7dHJhY2UxNn0sIHdlIHNob3VsZCBhdCBsZWFzdCBsZWF2ZQorb3Bjb2RlIDB4MzAgcmVzZXJ2ZWQsIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggdGhlIGN1c3RvbWVyIHdobyBhZGRlZAoraXQuCisKK0BlbmQgdGFibGUKKworQGJ5ZQpkaWZmIC0tZ2l0IGEvZ2RiL2RvYy9hbGwtY2ZnLnRleGkgYi9nZGIvZG9jL2FsbC1jZmcudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGQ4MDkwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2RvYy9hbGwtY2ZnLnRleGkKQEAgLTAsMCArMSwxMTIgQEAKK0BjIEdEQiBNQU5VQUwgY29uZmlndXJhdGlvbiBmaWxlLiAgCitAYyBDb3B5cmlnaHQgKGMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitAYworQGMgTk9URTogV2hpbGUgdGhlIEdEQiBtYW51YWwgaXMgY29uZmlndXJhYmxlIChieSBjaGFuZ2luZyB0aGVzZQorQGMgc3dpdGNoZXMpLCBpdHMgY29uZmlndXJhdGlvbiBpcyAqKipOT1QqKiogYXV0b21hdGljYWxseSB0aWVkIGluIHRvCitAYyBzb3VyY2UgY29uZmlndXJhdGlvbi0tLWJlY2F1c2UgdGhlIGF1dGhvcnMgZXhwZWN0IHRoYXQsIHNhdmUgaW4KK0BjIHVudXN1YWwgY2FzZXMsIHRoZSBtb3N0IGluY2x1c2l2ZSBmb3JtIG9mIHRoZSBtYW51YWwgaXMgYXBwcm9wcmlhdGUKK0BjIG5vIG1hdHRlciBob3cgdGhlIHByb2dyYW0gaXRzZWxmIGlzIGNvbmZpZ3VyZWQuCitAYworQGMgVGhlIG9ubHkgYXV0b21hdGljYWxseS12YXJ5aW5nIHZhcmlhYmxlIGlzIHRoZSBHREIgdmVyc2lvbiBudW1iZXIsCitAYyB3aGljaCB0aGUgTWFrZWZpbGUgcmV3cml0ZXMgYmFzZWQgb24gdGhlIFZFUlNJT04gdmFyaWFibGUgZnJvbQorQGMgYC4uL01ha2VmaWxlLmluJy4gIAorQGMgCitAYyBHREIgdmVyc2lvbiBudW1iZXIgaXMgcmVjb3JkZWQgaW4gdGhlIHZhcmlhYmxlIEdEQlZOCitAaW5jbHVkZSBHREJ2bi50ZXhpCitAYworQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQGMgUExBVEZPUk0gRkxBR1M6CitAc2V0IEdFTkVSSUMKK0BjCitAYyBIUCBQQS1SSVNDIHRhcmdldCBPTkxZOgorQGNsZWFyIEhQUEEKK0BjCitAYyBIaXRhY2hpIEg4LzMwMCB0YXJnZXQ6CitAc2V0IEg4CitAYyBIaXRhY2hpIEg4LzMwMCB0YXJnZXQgT05MWToKK0BjbGVhciBIOEVYQ0xVU0lWRQorQGMKK0BjIHJlbW90ZSBNSVBTIHRhcmdldDoKK0BzZXQgTUlQUworQGMKK0BjIFNQQVJDIHRhcmdldDoKK0BzZXQgU1BBUkMKK0BzZXQgU1BBUkNMRVQKK0BjCitAYyBBTUQgMjkwMDAgdGFyZ2V0OgorQHNldCBBTUQyOUsKK0BjCitAYyBJbnRlbCA5NjAgdGFyZ2V0OgorQHNldCBJOTYwCitAYworQGMgVGFuZGVtIFNUMjAwMCAocGhvbmUgc3dpdGNoKSB0YXJnZXQ6CitAc2V0IFNUMjAwMAorQGMKK0BjIFppbG9nIDgwMDAgdGFyZ2V0OgorQHNldCBaOEsKK0BjCitAYyBXaW5kIFJpdmVyIFN5c3RlbXMgVnhXb3JrcyBlbnZpcm9ubWVudDoKK0BzZXQgVlhXT1JLUworQGMKK0BjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0BjIERPQyBGRUFUVVJFIEZMQUdTOgorQGMgCitAYyBCYXJlLWJvYXJkIHRhcmdldD8KK0BjbGVhciBCQVJFVEFSR0VUCitAYworQGMgUmVzdHJpY3QgbGFuZ3VhZ2VzIGRpc2N1c3NlZCB0byBDPworQGMgVGhpcyBpcyBiYWNrd2FyZC4gIEFzIHRpbWUgcGVybWl0cywgY2hhbmdlIHRoaXMgdG8gbGFuZ3VhZ2Utc3BlY2lmaWMKK0BjIHN3aXRjaGVzIGZvciB3aGF0IHRvIGluY2x1ZGUuCitAY2xlYXIgQ09OTFkKK0BjIERpc2N1c3MgRm9ydHJhbj8KK0BzZXQgRk9SVFJBTgorQGMKK0BjIERpc2N1c3MgTW9kdWxhIDI/CitAc2V0IE1PRDIKK0BjCitAYyBTcGVjaWZpY2FsbHkgZm9yIGhvc3QgbWFjaGluZSBydW5uaW5nIERPUz8KK0BjbGVhciBET1NIT1NUCitAYworQGMgVGFsayBhYm91dCBDUFUgc2ltdWxhdG9yIHRhcmdldHM/CitAc2V0IFNJTVMKK0BjCitAYyBSZW1vdGUgc2VyaWFsIGxpbmUgc2V0dGluZ3Mgb2YgaW50ZXJlc3Q/CitAc2V0IFNFUklBTAorQGMKK0BjIERpc2N1c3MgZmVhdHVyZXMgcmVxdWlyaW5nIFBvc2l4IG9yIHNpbWlsYXIgT1MgZW52aXJvbm1lbnQ/CitAc2V0IFBPU0lYCitAYworQGMgRGlzY3VzcyByZW1vdGUgc2VyaWFsIGRlYnVnZ2luZyBzdHViPworQHNldCBSRU1PVEVTVFVCCitAYworQGMgRGlzY3VzcyBnZGJzZXJ2ZXI/CitAc2V0IEdEQlNFUlZFUgorQGMKK0BjIERpc2N1c3MgZ2Ric2VydmUubmxtPworQHNldCBHREJTRVJWRQorQGMKK0BjIFJlZnJhaW4gZnJvbSBkaXNjdXNzaW5nIGhvdyB0byBjb25maWd1cmUgc3cgYW5kIGZvcm1hdCBkb2M/CitAY2xlYXIgUFJFQ09ORklHVVJFRAorQGMKK0BjIFJlZnJhaW4gZnJvbSByZWZlcnJpbmcgdG8gdW5mcmVlIHB1YmxpY2F0aW9ucz8KK0BzZXQgRlNGRE9DCitAYworQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQGMgU1RSSU5HUzoKK0BjCitAYyBOYW1lIG9mIEdEQiBwcm9ncmFtLiAgVXNlZCBhbHNvIGZvciAoZ2RiKSBwcm9tcHQgc3RyaW5nLgorQHNldCBHREJQIGdkYgorQGMgCitAYyBOYW1lIG9mIEdEQiBwcm9kdWN0LiAgVXNlZCBpbiBydW5uaW5nIHRleHQuCitAc2V0IEdEQk4gR0RCCitAYworQGMgTmFtZSBvZiBob3N0LiAgU2hvdWxkIG5vdCBiZSB1c2VkIGluIGdlbmVyaWMgY29uZmlncywgYnV0IGdlbmVyaWMKK0BjIHZhbHVlIG1heSBjYXRjaCBzb21lIGZsdWJzLgorQHNldCBIT1NUIG1hY2hpbmUgc3BlY2lmaWMKK0BjCitAYyBOYW1lIG9mIEdDQyBwcm9kdWN0CitAc2V0IE5HQ0MgR0NDCitAYyAKK0BjIE5hbWUgb2YgR0NDIHByb2dyYW0KK0BzZXQgR0NDIGdjYworCmRpZmYgLS1naXQgYS9nZGIvZG9jL2Fubm90YXRlLnRleGkgYi9nZGIvZG9jL2Fubm90YXRlLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1ODUwZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9kb2MvYW5ub3RhdGUudGV4aQpAQCAtMCwwICsxLDcxNyBAQAorXGlucHV0IHRleGluZm8gICBAYyAtKi10ZXhpbmZvLSotCitAYyAlKipzdGFydCBvZiBoZWFkZXIKK0BzZXRmaWxlbmFtZSBhbm5vdGF0ZS5pbmZvCitAc2V0dGl0bGUgR0RCIEFubm90YXRpb25zCitAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2ZmCitAYyAlKiplbmQgb2YgaGVhZGVyCisKK0BzZXQgRURJVElPTiAwLjUKK0BzZXQgREFURSBNYXkgMTk5NAorCitAaWZpbmZvCitUaGlzIGZpbGUgZG9jdW1lbnRzIEdEQiBhbm5vdGF0aW9ucy4KKworVGhpcyBpcyBFZGl0aW9uIEB2YWx1ZXtFRElUSU9OfSwgQHZhbHVle0RBVEV9LCBvZiBAY2l0ZXtHREIKK0Fubm90YXRpb25zfS4gIENvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisKK0BpZ25vcmUKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRlWCBhbmQgcHJpbnQgdGhlCityZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgorbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCisodGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCisKK0BlbmQgaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdCB0aGUKK2VudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAoraW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCitAZW5kIGlmaW5mbworCitAdGl0bGVwYWdlCitAdGl0bGUgR0RCIEFubm90YXRpb25zCitAc3VidGl0bGUgRWRpdGlvbiBAdmFsdWV7RURJVElPTn0KK0BzdWJ0aXRsZSBAdmFsdWV7REFURX0KK0BhdXRob3IgQ3lnbnVzIFN1cHBvcnQKK0BwYWdlCitAdnNraXAgMHB0IHBsdXMgMWZpbGxsCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisKK0NvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KK0BlbmQgdGl0bGVwYWdlCisKK0BpZmluZm8KK0Bub2RlIFRvcAorQHRvcCBHREIgQW5ub3RhdGlvbnMKKworVGhpcyBmaWxlIGRlc2NyaWJlcyBhbm5vdGF0aW9ucyBpbiBHREIsIHRoZSBHTlUgc3ltYm9saWMgZGVidWdnZXIuCitBbm5vdGF0aW9ucyBhcmUgZGVzaWduZWQgdG8gaW50ZXJmYWNlIEdEQiB0byBncmFwaGljYWwgdXNlciBpbnRlcmZhY2VzCitvciBvdGhlciBzaW1pbGFyIHByb2dyYW1zIHdoaWNoIHdhbnQgdG8gaW50ZXJhY3Qgd2l0aCBHREIgYXQgYQorcmVsYXRpdmVseSBoaWdoIGxldmVsLgorCitUaGlzIGlzIEVkaXRpb24gQHZhbHVle0VESVRJT059LCBAdmFsdWV7REFURX0uCisKK0BtZW51CisqIEdlbmVyYWw6OiAgICAgICAgICAgICBXaGF0IGFubm90YXRpb25zIGFyZTsgdGhlIGdlbmVyYWwgc3ludGF4LgorKiBTZXJ2ZXI6OiAgICAgICAgICAgICAgSXNzdWluZyBhIGNvbW1hbmQgd2l0aG91dCBhZmZlY3RpbmcgdXNlciBzdGF0ZS4KKyogVmFsdWVzOjogICAgICAgICAgICAgIFZhbHVlcyBhcmUgbWFya2VkIGFzIHN1Y2guCisqIEZyYW1lczo6ICAgICAgICAgICAgICBTdGFjayBmcmFtZXMgYXJlIGFubm90YXRlZC4KKyogRGlzcGxheXM6OiAgICAgICAgICAgIEdEQiBjYW4gYmUgdG9sZCB0byBkaXNwbGF5IHNvbWV0aGluZyBwZXJpb2RpY2FsbHkuCisqIFByb21wdGluZzo6ICAgICAgICAgICBBbm5vdGF0aW9ucyBtYXJraW5nIEdEQidzIG5lZWQgZm9yIGlucHV0LgorKiBFcnJvcnM6OiAgICAgICAgICAgICAgQW5ub3RhdGlvbnMgZm9yIGVycm9yIG1lc3NhZ2VzLgorKiBCcmVha3BvaW50IEluZm86OiAgICAgSW5mb3JtYXRpb24gb24gYnJlYWtwb2ludHMuCisqIEludmFsaWRhdGlvbjo6ICAgICAgICBTb21lIGFubm90YXRpb25zIGRlc2NyaWJlIHRoaW5ncyBub3cgaW52YWxpZC4KKyogUnVubmluZzo6ICAgICAgICAgICAgIFdoZXRoZXIgdGhlIHByb2dyYW0gaXMgcnVubmluZywgaG93IGl0IHN0b3BwZWQsIGV0Yy4KKyogU291cmNlOjogICAgICAgICAgICAgIEFubm90YXRpb25zIGRlc2NyaWJpbmcgc291cmNlIGNvZGUuCisqIFRPRE86OiAgICAgICAgICAgICAgICBBbm5vdGF0aW9ucyB3aGljaCBtaWdodCBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLgorKiBJbmRleDo6ICAgICAgICAgICAgICAgSW5kZXgKK0BlbmQgbWVudQorQGVuZCBpZmluZm8KKworQG5vZGUgR2VuZXJhbAorQGNoYXB0ZXIgV2hhdCBpcyBhbiBBbm5vdGF0aW9uPworCitUbyBwcm9kdWNlIGFubm90YXRpb25zLCBzdGFydCBHREIgd2l0aCB0aGUgQGNvZGV7LS1hbm5vdGF0ZT0yfSBvcHRpb24uCisKK0Fubm90YXRpb25zIHN0YXJ0IHdpdGggYSBuZXdsaW5lIGNoYXJhY3RlciwgdHdvIEBzYW1we2NvbnRyb2wten0KK2NoYXJhY3RlcnMsIGFuZCB0aGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbi4gIElmIHRoZXJlIGlzIG5vIGFkZGl0aW9uYWwKK2luZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFubm90YXRpb24sIHRoZSBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uCitpcyBmb2xsb3dlZCBpbW1lZGlhdGVseSBieSBhIG5ld2xpbmUuICBJZiB0aGVyZSBpcyBhZGRpdGlvbmFsCitpbmZvcm1hdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24gaXMgZm9sbG93ZWQgYnkgYSBzcGFjZSwgdGhlCithZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBhbmQgYSBuZXdsaW5lLiAgVGhlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK2Nhbm5vdCBjb250YWluIG5ld2xpbmUgY2hhcmFjdGVycy4KKworQW55IG91dHB1dCBub3QgYmVnaW5uaW5nIHdpdGggYSBuZXdsaW5lIGFuZCB0d28gQHNhbXB7Y29udHJvbC16fQorY2hhcmFjdGVycyBkZW5vdGVzIGxpdGVyYWwgb3V0cHV0IGZyb20gR0RCLiAgQ3VycmVudGx5IHRoZXJlIGlzIG5vIG5lZWQKK2ZvciBHREIgdG8gb3V0cHV0IGEgbmV3bGluZSBmb2xsb3dlZCBieSB0d28gQHNhbXB7Y29udHJvbC16fSBjaGFyYWN0ZXJzLAorYnV0IGlmIHRoZXJlIHdhcyBzdWNoIGEgbmVlZCwgdGhlIGFubm90YXRpb25zIGNvdWxkIGJlIGV4dGVuZGVkIHdpdGggYW4KK0BzYW1we2VzY2FwZX0gYW5ub3RhdGlvbiB3aGljaCBtZWFucyB0aG9zZSB0aHJlZSBjaGFyYWN0ZXJzIGFzIG91dHB1dC4KKworQSBzaW1wbGUgZXhhbXBsZSBvZiBzdGFydGluZyB1cCBHREIgd2l0aCBhbm5vdGF0aW9ucyBpczoKKworQGV4YW1wbGUKKyQgZ2RiIC0tYW5ub3RhdGU9MgorR0RCIGlzIGZyZWUgc29mdHdhcmUgYW5kIHlvdSBhcmUgd2VsY29tZSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBpdAorIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSAic2hvdyBjb3B5aW5nIiB0byBzZWUgdGhlIGNvbmRpdGlvbnMuCitUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGZvciBHREI7IHR5cGUgInNob3cgd2FycmFudHkiIGZvciBkZXRhaWxzLgorR0RCIDQuMTIuMyAoc3BhcmMtc3VuLXN1bm9zNC4xLjMpLCAKK0NvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCiteWl5acHJlLXByb21wdAorKGdkYikgCiteWl5acHJvbXB0CitxdWl0CisKK15aXlpwb3N0LXByb21wdAorJCAKK0BlbmQgZXhhbXBsZQorCitIZXJlIEBzYW1we3F1aXR9IGlzIGlucHV0IHRvIEdEQjsgdGhlIHJlc3QgaXMgb3V0cHV0IGZyb20gR0RCLiAgVGhlIHRocmVlCitsaW5lcyBiZWdpbm5pbmcgQHNhbXB7XlpeWn0gKHdoZXJlIEBzYW1we15afSBkZW5vdGVzIGEgQHNhbXB7Y29udHJvbC16fQorY2hhcmFjdGVyKSBhcmUgYW5ub3RhdGlvbnM7IHRoZSByZXN0IGlzIG91dHB1dCBmcm9tIEdEQi4KKworQG5vZGUgU2VydmVyCitAY2hhcHRlciBUaGUgU2VydmVyIFByZWZpeAorCitUbyBpc3N1ZSBhIGNvbW1hbmQgdG8gR0RCIHdpdGhvdXQgYWZmZWN0aW5nIGNlcnRhaW4gYXNwZWN0cyBvZiB0aGUgc3RhdGUKK3doaWNoIGlzIHNlZW4gYnkgdXNlcnMsIHByZWZpeCBpdCB3aXRoIEBzYW1we3NlcnZlciB9LiAgVGhpcyBtZWFucyB0aGF0Cit0aGlzIGNvbW1hbmQgd2lsbCBub3QgYWZmZWN0IHRoZSBjb21tYW5kIGhpc3RvcnksIG5vciB3aWxsIGl0IGFmZmVjdAorR0RCJ3Mgbm90aW9uIG9mIHdoaWNoIGNvbW1hbmQgdG8gcmVwZWF0IGlmIEBrZXl7UkVUfSBpcyBwcmVzc2VkIG9uIGEKK2xpbmUgYnkgaXRzZWxmLgorCitUaGUgc2VydmVyIHByZWZpeCBkb2VzIG5vdCBhZmZlY3QgdGhlIHJlY29yZGluZyBvZiB2YWx1ZXMgaW50byB0aGUgdmFsdWUKK2hpc3Rvcnk7IHRvIHByaW50IGEgdmFsdWUgd2l0aG91dCByZWNvcmRpbmcgaXQgaW50byB0aGUgdmFsdWUgaGlzdG9yeSwKK3VzZSB0aGUgQGNvZGV7b3V0cHV0fSBjb21tYW5kIGluc3RlYWQgb2YgdGhlIEBjb2Rle3ByaW50fSBjb21tYW5kLgorCitAbm9kZSBWYWx1ZXMKK0BjaGFwdGVyIFZhbHVlcworCitXaGVuIGEgdmFsdWUgaXMgcHJpbnRlZCBpbiB2YXJpb3VzIGNvbnRleHRzLCBHREIgdXNlcyBhbm5vdGF0aW9ucyB0bworZGVsaW1pdCB0aGUgdmFsdWUgZnJvbSB0aGUgc3Vycm91bmRpbmcgdGV4dC4KKworQGZpbmRleCB2YWx1ZS1oaXN0b3J5LWJlZ2luCitAZmluZGV4IHZhbHVlLWhpc3RvcnktdmFsdWUKK0BmaW5kZXggdmFsdWUtaGlzdG9yeS1lbmQKK0lmIGEgdmFsdWUgaXMgcHJpbnRlZCB1c2luZyBAY29kZXtwcmludH0gYW5kIGFkZGVkIHRvIHRoZSB2YWx1ZSBoaXN0b3J5LAordGhlIGFubm90YXRpb24gbG9va3MgbGlrZQorCitAZXhhbXBsZQorXlpeWnZhbHVlLWhpc3RvcnktYmVnaW4gQHZhcntoaXN0b3J5LW51bWJlcn0gQHZhcnt2YWx1ZS1mbGFnc30KK0B2YXJ7aGlzdG9yeS1zdHJpbmd9CiteWl5admFsdWUtaGlzdG9yeS12YWx1ZQorQHZhcnt0aGUtdmFsdWV9CiteWl5admFsdWUtaGlzdG9yeS1lbmQKK0BlbmQgZXhhbXBsZQorCit3aGVyZSBAdmFye2hpc3RvcnktbnVtYmVyfSBpcyB0aGUgbnVtYmVyIGl0IGlzIGdldHRpbmcgaW4gdGhlIHZhbHVlCitoaXN0b3J5LCBAdmFye2hpc3Rvcnktc3RyaW5nfSBpcyBhIHN0cmluZywgc3VjaCBhcyBAc2FtcHskNSA9IH0sIHdoaWNoCitpbnRyb2R1Y2VzIHRoZSB2YWx1ZSB0byB0aGUgdXNlciwgQHZhcnt0aGUtdmFsdWV9IGlzIHRoZSBvdXRwdXQKK2NvcnJlc3BvbmRpbmcgdG8gdGhlIHZhbHVlIGl0c2VsZiwgYW5kIEB2YXJ7dmFsdWUtZmxhZ3N9IGlzIEBzYW1weyp9IGZvcgorYSB2YWx1ZSB3aGljaCBjYW4gYmUgZGVyZWZlcmVuY2VkIGFuZCBAc2FtcHstfSBmb3IgYSB2YWx1ZSB3aGljaCBjYW5ub3QuCisKK0BmaW5kZXggdmFsdWUtYmVnaW4KK0BmaW5kZXggdmFsdWUtZW5kCitJZiB0aGUgdmFsdWUgaXMgbm90IGFkZGVkIHRvIHRoZSB2YWx1ZSBoaXN0b3J5IChpdCBpcyBhbiBpbnZhbGlkIGZsb2F0CitvciBpdCBpcyBwcmludGVkIHdpdGggdGhlIEBjb2Rle291dHB1dH0gY29tbWFuZCksIHRoZSBhbm5vdGF0aW9uIGlzIHNpbWlsYXI6CisKK0BleGFtcGxlCiteWl5admFsdWUtYmVnaW4gQHZhcnt2YWx1ZS1mbGFnc30KK0B2YXJ7dGhlLXZhbHVlfQorXlpeWnZhbHVlLWVuZAorQGVuZCBleGFtcGxlCisKK0BmaW5kZXggYXJnLWJlZ2luCitAZmluZGV4IGFyZy1uYW1lLWVuZAorQGZpbmRleCBhcmctdmFsdWUKK0BmaW5kZXggYXJnLWVuZAorV2hlbiBHREIgcHJpbnRzIGFuIGFyZ3VtZW50IHRvIGEgZnVuY3Rpb24gKGZvciBleGFtcGxlLCBpbiB0aGUgb3V0cHV0Citmcm9tIHRoZSBAY29kZXtiYWNrdHJhY2V9IGNvbW1hbmQpLCBpdCBhbm5vdGF0ZXMgaXQgYXMgZm9sbG93czoKKworQGV4YW1wbGUKK15aXlphcmctYmVnaW4KK0B2YXJ7YXJndW1lbnQtbmFtZX0KK15aXlphcmctbmFtZS1lbmQKK0B2YXJ7c2VwYXJhdG9yLXN0cmluZ30KK15aXlphcmctdmFsdWUgQHZhcnt2YWx1ZS1mbGFnc30KK0B2YXJ7dGhlLXZhbHVlfQorXlpeWmFyZy1lbmQKK0BlbmQgZXhhbXBsZQorCit3aGVyZSBAdmFye2FyZ3VtZW50LW5hbWV9IGlzIHRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCwKK0B2YXJ7c2VwYXJhdG9yLXN0cmluZ30gaXMgdGV4dCB3aGljaCBzZXBhcmF0ZXMgdGhlIG5hbWUgZnJvbSB0aGUgdmFsdWUKK2ZvciB0aGUgdXNlcidzIGJlbmVmaXQgKHN1Y2ggYXMgQHNhbXB7PX0pLCBhbmQgQHZhcnt2YWx1ZS1mbGFnc30gYW5kCitAdmFye3RoZS12YWx1ZX0gaGF2ZSB0aGUgc2FtZSBtZWFuaW5ncyBhcyBpbiBhCitAY29kZXt2YWx1ZS1oaXN0b3J5LWJlZ2lufSBhbm5vdGF0aW9uLgorCitAZmluZGV4IGZpZWxkLWJlZ2luCitAZmluZGV4IGZpZWxkLW5hbWUtZW5kCitAZmluZGV4IGZpZWxkLXZhbHVlCitAZmluZGV4IGZpZWxkLWVuZAorV2hlbiBwcmludGluZyBhIHN0cnVjdHVyZSwgR0RCIGFubm90YXRlcyBpdCBhcyBmb2xsb3dzOgorCitAZXhhbXBsZQorXlpeWmZpZWxkLWJlZ2luIEB2YXJ7dmFsdWUtZmxhZ3N9CitAdmFye2ZpZWxkLW5hbWV9CiteWl5aZmllbGQtbmFtZS1lbmQKK0B2YXJ7c2VwYXJhdG9yLXN0cmluZ30KK15aXlpmaWVsZC12YWx1ZQorQHZhcnt0aGUtdmFsdWV9CiteWl5aZmllbGQtZW5kCitAZW5kIGV4YW1wbGUKKword2hlcmUgQHZhcntmaWVsZC1uYW1lfSBpcyB0aGUgbmFtZSBvZiB0aGUgZmllbGQsIEB2YXJ7c2VwYXJhdG9yLXN0cmluZ30KK2lzIHRleHQgd2hpY2ggc2VwYXJhdGVzIHRoZSBuYW1lIGZyb20gdGhlIHZhbHVlIGZvciB0aGUgdXNlcidzIGJlbmVmaXQKKyhzdWNoIGFzIEBzYW1wez19KSwgYW5kIEB2YXJ7dmFsdWUtZmxhZ3N9IGFuZCBAdmFye3RoZS12YWx1ZX0gaGF2ZSB0aGUKK3NhbWUgbWVhbmluZ3MgYXMgaW4gYSBAY29kZXt2YWx1ZS1oaXN0b3J5LWJlZ2lufSBhbm5vdGF0aW9uLgorCitXaGVuIHByaW50aW5nIGFuIGFycmF5LCBHREIgYW5ub3RhdGVzIGl0IGFzIGZvbGxvd3M6CisKK0BleGFtcGxlCiteWl5aYXJyYXktc2VjdGlvbi1iZWdpbiBAdmFye2FycmF5LWluZGV4fSBAdmFye3ZhbHVlLWZsYWdzfQorQGVuZCBleGFtcGxlCisKK3doZXJlIEB2YXJ7YXJyYXktaW5kZXh9IGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBiZWluZworYW5ub3RhdGVkIGFuZCBAdmFye3ZhbHVlLWZsYWdzfSBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiBhCitAY29kZXt2YWx1ZS1oaXN0b3J5LWJlZ2lufSBhbm5vdGF0aW9uLiAgVGhpcyBpcyBmb2xsb3dlZCBieSBhbnkgbnVtYmVyCitvZiBlbGVtZW50cywgd2hlcmUgaXMgZWxlbWVudCBjYW4gYmUgZWl0aGVyIGEgc2luZ2xlIGVsZW1lbnQ6CisKK0BmaW5kZXggZWx0CitAZXhhbXBsZQorQHNhbXB7LH0gQHZhcnt3aGl0ZXNwYWNlfSAgICAgICAgIDsgQHJ7b21pdHRlZCBmb3IgdGhlIGZpcnN0IGVsZW1lbnR9CitAdmFye3RoZS12YWx1ZX0KK15aXlplbHQKK0BlbmQgZXhhbXBsZQorCitvciBhIHJlcGVhdGVkIGVsZW1lbnQKKworQGZpbmRleCBlbHQtcmVwCitAZmluZGV4IGVsdC1yZXAtZW5kCitAZXhhbXBsZQorQHNhbXB7LH0gQHZhcnt3aGl0ZXNwYWNlfSAgICAgICAgIDsgQHJ7b21pdHRlZCBmb3IgdGhlIGZpcnN0IGVsZW1lbnR9CitAdmFye3RoZS12YWx1ZX0KK15aXlplbHQtcmVwIEB2YXJ7bnVtYmVyLW9mLXJlcGl0aXRpb25zfQorQHZhcntyZXBldGl0aW9uLXN0cmluZ30KK15aXlplbHQtcmVwLWVuZAorQGVuZCBleGFtcGxlCisKK0luIGJvdGggY2FzZXMsIEB2YXJ7dGhlLXZhbHVlfSBpcyB0aGUgb3V0cHV0IGZvciB0aGUgdmFsdWUgb2YgdGhlCitlbGVtZW50IGFuZCBAdmFye3doaXRlc3BhY2V9IGNhbiBjb250YWluIHNwYWNlcywgdGFicywgYW5kIG5ld2xpbmVzLiAgSW4KK3RoZSByZXBlYXRlZCBjYXNlLCBAdmFye251bWJlci1vZi1yZXBpdGl0b25zfSBpcyB0aGUgbnVtYmVyIG9mCitjb25zZWN1dGl2ZSBhcnJheSBlbGVtZW50cyB3aGljaCBjb250YWluIHRoYXQgdmFsdWUsIGFuZAorQHZhcntyZXBldGl0aW9uLXN0cmluZ30gaXMgYSBzdHJpbmcgd2hpY2ggaXMgZGVzaWduZWQgdG8gY29udmV5IHRvIHRoZQordXNlciB0aGF0IHJlcGl0aXRpb24gaXMgYmVpbmcgZGVwaWN0ZWQuCisKK0BmaW5kZXggYXJyYXktc2VjdGlvbi1lbmQKK09uY2UgYWxsIHRoZSBhcnJheSBlbGVtZW50cyBoYXZlIGJlZW4gb3V0cHV0LCB0aGUgYXJyYXkgYW5ub3RhdGlvbiBpcworZW5kZWQgd2l0aAorCitAZXhhbXBsZQorXlpeWmFycmF5LXNlY3Rpb24tZW5kCitAZW5kIGV4YW1wbGUKKworQG5vZGUgRnJhbWVzCitAY2hhcHRlciBGcmFtZXMKKworV2hlbmV2ZXIgR0RCIHByaW50cyBhIGZyYW1lLCBpdCBhbm5vdGF0ZXMgaXQuICBGb3IgZXhhbXBsZSwgdGhpcyBhcHBsaWVzCit0byBmcmFtZXMgcHJpbnRlZCB3aGVuIEdEQiBzdG9wcywgb3V0cHV0IGZyb20gY29tbWFuZHMgc3VjaCBhcworQGNvZGV7YmFja3RyYWNlfSBvciBAY29kZXt1cH0sIGV0Yy4KKworQGZpbmRleCBmcmFtZS1iZWdpbgorVGhlIGZyYW1lIGFubm90YXRpb24gYmVnaW5zIHdpdGgKKworQGV4YW1wbGUKK15aXlpmcmFtZS1iZWdpbiBAdmFye2xldmVsfSBAdmFye2FkZHJlc3N9CitAdmFye2xldmVsLXN0cmluZ30KK0BlbmQgZXhhbXBsZQorCit3aGVyZSBAdmFye2xldmVsfSBpcyB0aGUgbnVtYmVyIG9mIHRoZSBmcmFtZSAoMCBpcyB0aGUgaW5uZXJtb3N0IGZyYW1lLAorYW5kIG90aGVyIGZyYW1lcyBoYXZlIHBvc2l0aXZlIG51bWJlcnMpLCBAdmFye2FkZHJlc3N9IGlzIHRoZSBhZGRyZXNzIG9mCit0aGUgY29kZSBleGVjdXRpbmcgaW4gdGhhdCBmcmFtZSwgYW5kIEB2YXJ7bGV2ZWwtc3RyaW5nfSBpcyBhIHN0cmluZworZGVzaWduZWQgdG8gY29udmV5IHRoZSBsZXZlbCB0byB0aGUgdXNlci4gIEB2YXJ7YWRkcmVzc30gaXMgaW4gdGhlIGZvcm0KK0BzYW1wezB4fSBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBsb3dlcmNhc2UgaGV4IGRpZ2l0cyAobm90ZSB0aGF0IHRoaXMKK2RvZXMgbm90IGRlcGVuZCBvbiB0aGUgbGFuZ3VhZ2UpLiAgVGhlIGZyYW1lIGVuZHMgd2l0aAorCitAZmluZGV4IGZyYW1lLWVuZAorQGV4YW1wbGUKK15aXlpmcmFtZS1lbmQKK0BlbmQgZXhhbXBsZQorCitCZXR3ZWVuIHRoZXNlIGFubm90YXRpb25zIGlzIHRoZSBtYWluIGJvZHkgb2YgdGhlIGZyYW1lLCB3aGljaCBjYW4KK2NvbnNpc3Qgb2YKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK0BmaW5kZXggZnVuY3Rpb24tY2FsbAorQGV4YW1wbGUKK15aXlpmdW5jdGlvbi1jYWxsCitAdmFye2Z1bmN0aW9uLWNhbGwtc3RyaW5nfQorQGVuZCBleGFtcGxlCisKK3doZXJlIEB2YXJ7ZnVuY3Rpb24tY2FsbC1zdHJpbmd9IGlzIHRleHQgZGVzaWduZWQgdG8gY29udmV5IHRvIHRoZSB1c2VyCit0aGF0IHRoaXMgZnJhbWUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgZnVuY3Rpb24gY2FsbCBtYWRlIGJ5IEdEQiB0byBhCitmdW5jdGlvbiBpbiB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZC4KKworQGl0ZW0KK0BmaW5kZXggc2lnbmFsLWhhbmRsZXItY2FsbGVyCitAZXhhbXBsZQorXlpeWnNpZ25hbC1oYW5kbGVyLWNhbGxlcgorQHZhcntzaWduYWwtaGFuZGxlci1jYWxsZXItc3RyaW5nfQorQGVuZCBleGFtcGxlCisKK3doZXJlIEB2YXJ7c2lnbmFsLWhhbmRsZXItY2FsbGVyLXN0cmluZ30gaXMgdGV4dCBkZXNpZ25lZCB0byBjb252ZXkgdG8KK3RoZSB1c2VyIHRoYXQgdGhpcyBmcmFtZSBpcyBhc3NvY2lhdGVkIHdpdGggd2hhdGV2ZXIgbWVjaGFuaXNtIGlzIHVzZWQKK2J5IHRoaXMgb3BlcmF0aW5nIHN5c3RlbSB0byBjYWxsIGEgc2lnbmFsIGhhbmRsZXIgKGl0IGlzIHRoZSBmcmFtZSB3aGljaAorY2FsbHMgdGhlIHNpZ25hbCBoYW5kbGVyLCBub3QgdGhlIGZyYW1lIGZvciB0aGUgc2lnbmFsIGhhbmRsZXIgaXRzZWxmKS4KKworQGl0ZW0KK0Egbm9ybWFsIGZyYW1lLgorCitAZmluZGV4IGZyYW1lLWFkZHJlc3MKK0BmaW5kZXggZnJhbWUtYWRkcmVzcy1lbmQKK1RoaXMgY2FuIG9wdGlvbmFsbHkgKGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoaXMgaXMgdGhvdWdodCBvZiBhcworaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSB1c2VyIHRvIHNlZSkgYmVnaW4gd2l0aAorCitAZXhhbXBsZQorXlpeWmZyYW1lLWFkZHJlc3MKK0B2YXJ7YWRkcmVzc30KK15aXlpmcmFtZS1hZGRyZXNzLWVuZAorQHZhcntzZXBhcmF0b3Itc3RyaW5nfQorQGVuZCBleGFtcGxlCisKK3doZXJlIEB2YXJ7YWRkcmVzc30gaXMgdGhlIGFkZHJlc3MgZXhlY3V0aW5nIGluIHRoZSBmcmFtZSAodGhlIHNhbWUKK2FkZHJlc3MgYXMgaW4gdGhlIEBjb2Rle2ZyYW1lLWJlZ2lufSBhbm5vdGF0aW9uLCBidXQgcHJpbnRlZCBpbiBhIGZvcm0KK3doaWNoIGlzIGludGVuZGVkIGZvciB1c2VyIGNvbnN1bXB0aW9uLS0taW4gcGFydGljdWxhciwgdGhlIHN5bnRheCB2YXJpZXMKK2RlcGVuZGluZyBvbiB0aGUgbGFuZ3VhZ2UpLCBhbmQgQHZhcntzZXBhcmF0b3Itc3RyaW5nfSBpcyBhIHN0cmluZworaW50ZW5kZWQgdG8gc2VwYXJhdGUgdGhpcyBhZGRyZXNzIGZyb20gd2hhdCBmb2xsb3dzIGZvciB0aGUgdXNlcidzCitiZW5lZml0LgorCitAZmluZGV4IGZyYW1lLWZ1bmN0aW9uLW5hbWUKK0BmaW5kZXggZnJhbWUtYXJncworVGhlbiBjb21lcworCitAZXhhbXBsZQorXlpeWmZyYW1lLWZ1bmN0aW9uLW5hbWUKK0B2YXJ7ZnVuY3Rpb24tbmFtZX0KK15aXlpmcmFtZS1hcmdzCitAdmFye2FyZ3VtZW50c30KK0BlbmQgZXhhbXBsZQorCit3aGVyZSBAdmFye2Z1bmN0aW9uLW5hbWV9IGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBleGVjdXRpbmcgaW4gdGhlCitmcmFtZSwgb3IgQHNhbXB7Pz99IGlmIG5vdCBrbm93biwgYW5kIEB2YXJ7YXJndW1lbnRzfSBhcmUgdGhlIGFyZ3VtZW50cwordG8gdGhlIGZyYW1lLCB3aXRoIHBhcmVudGhlc2VzIGFyb3VuZCB0aGVtIChlYWNoIGFyZ3VtZW50IGlzIGFubm90YXRlZAoraW5kaXZpZHVhbGx5IGFzIHdlbGwgQHB4cmVme1ZhbHVlc30pLgorCitAZmluZGV4IGZyYW1lLXNvdXJjZS1iZWdpbgorQGZpbmRleCBmcmFtZS1zb3VyY2UtZmlsZQorQGZpbmRleCBmcmFtZS1zb3VyY2UtZmlsZS1lbmQKK0BmaW5kZXggZnJhbWUtc291cmNlLWxpbmUKK0BmaW5kZXggZnJhbWUtc291cmNlLWVuZAorSWYgc291cmNlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSwgYSByZWZlcmVuY2UgdG8gaXQgaXMgdGhlbiBwcmludGVkOgorCitAZXhhbXBsZQorXlpeWmZyYW1lLXNvdXJjZS1iZWdpbgorQHZhcntzb3VyY2UtaW50cm8tc3RyaW5nfQorXlpeWmZyYW1lLXNvdXJjZS1maWxlCitAdmFye2ZpbGVuYW1lfQorXlpeWmZyYW1lLXNvdXJjZS1maWxlLWVuZAorOgorXlpeWmZyYW1lLXNvdXJjZS1saW5lCitAdmFye2xpbmUtbnVtYmVyfQorXlpeWmZyYW1lLXNvdXJjZS1lbmQKK0BlbmQgZXhhbXBsZQorCit3aGVyZSBAdmFye3NvdXJjZS1pbnRyby1zdHJpbmd9IHNlcGFyYXRlcyBmb3IgdGhlIHVzZXIncyBiZW5lZml0IHRoZQorcmVmZXJlbmNlIGZyb20gdGhlIHRleHQgd2hpY2ggcHJlY2VkZXMgaXQsIEB2YXJ7ZmlsZW5hbWV9IGlzIHRoZSBuYW1lIG9mCit0aGUgc291cmNlIGZpbGUsIGFuZCBAdmFye2xpbmUtbnVtYmVyfSBpcyB0aGUgbGluZSBudW1iZXIgd2l0aGluIHRoYXQKK2ZpbGUgKHRoZSBmaXJzdCBsaW5lIGlzIGxpbmUgMSkuCisKK0BmaW5kZXggZnJhbWUtd2hlcmUKK0lmIEdEQiBwcmludHMgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSB0aGUgZnJhbWUgaXMgZnJvbSAod2hpY2gKK2xpYnJhcnksIHdoaWNoIGxvYWQgc2VnbWVudCwgZXRjLjsgY3VycmVudGx5IG9ubHkgZG9uZSBvbiB0aGUgUlMvNjAwMCksCitpdCBpcyBhbm5vdGF0ZWQgd2l0aAorCitAZXhhbXBsZQorXlpeWmZyYW1lLXdoZXJlCitAdmFye2luZm9ybWF0aW9ufQorQGVuZCBleGFtcGxlCisKK1RoZW4sIGlmIHNvdXJjZSBpcyB0byBhY3R1YWxseSBiZSBkaXNwbGF5ZWQgZm9yIHRoaXMgZnJhbWUgKGZvciBleGFtcGxlLAordGhpcyBpcyBub3QgdHJ1ZSBmb3Igb3V0cHV0IGZyb20gdGhlIEBjb2Rle2JhY2t0cmFjZX0gY29tbWFuZCksIHRoZW4gYQorQGNvZGV7c291cmNlfSBhbm5vdGF0aW9uIChAcHhyZWZ7U291cmNlfSkgaXMgZGlzcGxheWVkLiAgVW5saWtlIG1vc3QKK2Fubm90YXRpb25zLCB0aGlzIGlzIG91dHB1dCBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgdGV4dCB3aGljaCB3b3VsZCBiZQorb3V0cHV0LCBub3QgaW4gYWRkaXRpb24uCitAZW5kIGl0ZW1pemUKKworQG5vZGUgRGlzcGxheXMKK0BjaGFwdGVyIERpc3BsYXlzCisKK0BmaW5kZXggZGlzcGxheS1iZWdpbgorQGZpbmRleCBkaXNwbGF5LW51bWJlci1lbmQKK0BmaW5kZXggZGlzcGxheS1mb3JtYXQKK0BmaW5kZXggZGlzcGxheS1leHByZXNzaW9uCitAZmluZGV4IGRpc3BsYXktZXhwcmVzc2lvbi1lbmQKK0BmaW5kZXggZGlzcGxheS12YWx1ZQorQGZpbmRleCBkaXNwbGF5LWVuZAorV2hlbiBHREIgaXMgdG9sZCB0byBkaXNwbGF5IHNvbWV0aGluZyB1c2luZyB0aGUgQGNvZGV7ZGlzcGxheX0gY29tbWFuZCwKK3RoZSByZXN1bHRzIG9mIHRoZSBkaXNwbGF5IGFyZSBhbm5vdGF0ZWQ6CisKK0BleGFtcGxlCiteWl5aZGlzcGxheS1iZWdpbgorQHZhcntudW1iZXJ9CiteWl5aZGlzcGxheS1udW1iZXItZW5kCitAdmFye251bWJlci1zZXBhcmF0b3J9CiteWl5aZGlzcGxheS1mb3JtYXQKK0B2YXJ7Zm9ybWF0fQorXlpeWmRpc3BsYXktZXhwcmVzc2lvbgorQHZhcntleHByZXNzaW9ufQorXlpeWmRpc3BsYXktZXhwcmVzc2lvbi1lbmQKK0B2YXJ7ZXhwcmVzc2lvbi1zZXBhcmF0b3J9CiteWl5aZGlzcGxheS12YWx1ZQorQHZhcnt2YWx1ZX0KK15aXlpkaXNwbGF5LWVuZAorQGVuZCBleGFtcGxlCisKK3doZXJlIEB2YXJ7bnVtYmVyfSBpcyB0aGUgbnVtYmVyIG9mIHRoZSBkaXNwbGF5LCBAdmFye251bWJlci1zZXBhcmF0b3J9CitpcyBpbnRlbmRlZCB0byBzZXBhcmF0ZSB0aGUgbnVtYmVyIGZyb20gd2hhdCBmb2xsb3dzIGZvciB0aGUgdXNlciwKK0B2YXJ7Zm9ybWF0fSBpbmNsdWRlcyBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBzaXplLCBmb3JtYXQsIG9yIG90aGVyCitpbmZvcm1hdGlvbiBhYm91dCBob3cgdGhlIHZhbHVlIGlzIGJlaW5nIGRpc3BsYXllZCwgQHZhcntleHByZXNzaW9ufSBpcwordGhlIGV4cHJlc3Npb24gYmVpbmcgZGlzcGxheWVkLCBAdmFye2V4cHJlc3Npb24tc2VwYXJhdG9yfSBpcyBpbnRlbmRlZAordG8gc2VwYXJhdGUgdGhlIGV4cHJlc3Npb24gZnJvbSB0aGUgdGV4dCB0aGF0IGZvbGxvd3MgZm9yIHRoZSB1c2VyLAorYW5kIEB2YXJ7dmFsdWV9IGlzIHRoZSBhY3R1YWwgdmFsdWUgYmVpbmcgZGlzcGxheWVkLgorCitAbm9kZSBQcm9tcHRpbmcKK0BjaGFwdGVyIEFubm90YXRpb24gZm9yIEdEQiBJbnB1dAorCitXaGVuIEdEQiBwcm9tcHRzIGZvciBpbnB1dCwgaXQgYW5ub3RhdGVzIHRoaXMgZmFjdCBzbyBpdCBpcyBwb3NzaWJsZQordG8ga25vdyB3aGVuIHRvIHNlbmQgb3V0cHV0LCB3aGVuIHRoZSBvdXRwdXQgZnJvbSBhIGdpdmVuIGNvbW1hbmQgaXMKK292ZXIsIGV0Yy4KKworRGlmZmVyZW50IGtpbmRzIG9mIGlucHV0IGVhY2ggaGF2ZSBhIGRpZmZlcmVudCBAZGZue2lucHV0IHR5cGV9LiAgRWFjaAoraW5wdXQgdHlwZSBoYXMgdGhyZWUgYW5ub3RhdGlvbnM6IGEgQGNvZGV7cHJlLX0gYW5ub3RhdGlvbiwgd2hpY2gKK2Rlbm90ZXMgdGhlIGJlZ2lubmluZyBvZiBhbnkgcHJvbXB0IHdoaWNoIGlzIGJlaW5nIG91dHB1dCwgYSBwbGFpbgorYW5ub3RhdGlvbiwgd2hpY2ggZGVub3RlcyB0aGUgZW5kIG9mIHRoZSBwcm9tcHQsIGFuZCB0aGVuIGEgQGNvZGV7cG9zdC19Cithbm5vdGF0aW9uIHdoaWNoIGRlbm90ZXMgdGhlIGVuZCBvZiBhbnkgZWNobyB3aGljaCBtYXkgKG9yIG1heSBub3QpIGJlCithc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0LiAgRm9yIGV4YW1wbGUsIHRoZSBAY29kZXtwcm9tcHR9IGlucHV0IHR5cGUKK2ZlYXR1cmVzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnM6CisKK0BleGFtcGxlCiteWl5acHJlLXByb21wdAorXlpeWnByb21wdAorXlpeWnBvc3QtcHJvbXB0CitAZW5kIGV4YW1wbGUKKworVGhlIGlucHV0IHR5cGVzIGFyZQorCitAdGFibGUgQGNvZGUKK0BmaW5kZXggcHJlLXByb21wdAorQGZpbmRleCBwcm9tcHQKK0BmaW5kZXggcG9zdC1wcm9tcHQKK0BpdGVtIHByb21wdAorV2hlbiBHREIgaXMgcHJvbXB0aW5nIGZvciBhIGNvbW1hbmQgKHRoZSBtYWluIEdEQiBwcm9tcHQpLgorCitAZmluZGV4IHByZS1jb21tYW5kcworQGZpbmRleCBjb21tYW5kcworQGZpbmRleCBwb3N0LWNvbW1hbmRzCitAaXRlbSBjb21tYW5kcworV2hlbiBHREIgcHJvbXB0cyBmb3IgYSBzZXQgb2YgY29tbWFuZHMsIGxpa2UgaW4gdGhlIEBjb2Rle2NvbW1hbmRzfQorY29tbWFuZC4gIFRoZSBhbm5vdGF0aW9ucyBhcmUgcmVwZWF0ZWQgZm9yIGVhY2ggY29tbWFuZCB3aGljaCBpcyBpbnB1dC4KKworQGZpbmRleCBwcmUtb3ZlcmxvYWQtY2hvaWNlCitAZmluZGV4IG92ZXJsb2FkLWNob2ljZQorQGZpbmRleCBwb3N0LW92ZXJsb2FkLWNob2ljZQorQGl0ZW0gb3ZlcmxvYWQtY2hvaWNlCitXaGVuIEdEQiB3YW50cyB0aGUgdXNlciB0byBzZWxlY3QgYmV0d2VlbiB2YXJpb3VzIG92ZXJsb2FkZWQgZnVuY3Rpb25zLgorCitAZmluZGV4IHByZS1xdWVyeQorQGZpbmRleCBxdWVyeQorQGZpbmRleCBwb3N0LXF1ZXJ5CitAaXRlbSBxdWVyeQorV2hlbiBHREIgd2FudHMgdGhlIHVzZXIgdG8gY29uZmlybSBhIHBvdGVudGlhbGx5IGRhbmdlcm91cyBvcGVyYXRpb24uCisKK0BmaW5kZXggcHJlLXByb21wdC1mb3ItY29udGludWUKK0BmaW5kZXggcHJvbXB0LWZvci1jb250aW51ZQorQGZpbmRleCBwb3N0LXByb21wdC1mb3ItY29udGludWUKK0BpdGVtIHByb21wdC1mb3ItY29udGludWUKK1doZW4gR0RCIGlzIGFza2luZyB0aGUgdXNlciB0byBwcmVzcyByZXR1cm4gdG8gY29udGludWUuICBOb3RlOiBEb24ndAorZXhwZWN0IHRoaXMgdG8gd29yayB3ZWxsOyBpbnN0ZWFkIHVzZSBAY29kZXtzZXQgaGVpZ2h0IDB9IHRvIGRpc2FibGUKK3Byb21wdGluZy4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY291bnRpbmcgb2YgbGluZXMgaXMgYnVnZ3kgaW4gdGhlCitwcmVzZW5jZSBvZiBhbm5vdGF0aW9ucy4KK0BlbmQgdGFibGUKKworQG5vZGUgRXJyb3JzCitAY2hhcHRlciBFcnJvcnMKKworQGZpbmRleCBxdWl0CitAZXhhbXBsZQorXlpeWnF1aXQKK0BlbmQgZXhhbXBsZQorCitUaGlzIGFubm90YXRpb24gb2NjdXJzIHJpZ2h0IGJlZm9yZSBHREIgcmVzcG9uZHMgdG8gYW4gaW50ZXJydXB0LgorCitAZmluZGV4IGVycm9yCitAZXhhbXBsZQorXlpeWmVycm9yCitAZW5kIGV4YW1wbGUKKworVGhpcyBhbm5vdGF0aW9uIG9jY3VycyByaWdodCBiZWZvcmUgR0RCIHJlc3BvbmRzIHRvIGFuIGVycm9yLgorCitRdWl0IGFuZCBlcnJvciBhbm5vdGF0aW9ucyBpbmRpY2F0ZSB0aGF0IGFueSBhbm5vdGF0aW9ucyB3aGljaCBHREIgd2FzCitpbiB0aGUgbWlkZGxlIG9mIG1heSBlbmQgYWJydXB0bHkuICBGb3IgZXhhbXBsZSwgaWYgYQorQGNvZGV7dmFsdWUtaGlzdG9yeS1iZWdpbn0gYW5ub3RhdGlvbiBpcyBmb2xsb3dlZCBieSBhIEBjb2Rle2Vycm9yfSwgb25lCitjYW5ub3QgZXhwZWN0IHRvIHJlY2VpdmUgdGhlIG1hdGNoaW5nIEBjb2Rle3ZhbHVlLWhpc3RvcnktZW5kfS4gIE9uZQorY2Fubm90IGV4cGVjdCBub3QgdG8gcmVjZWl2ZSBpdCBlaXRoZXIsIGhvd2V2ZXI7IGFuIGVycm9yIGFubm90YXRpb24KK2RvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCBHREIgaXMgaW1tZWRpYXRlbHkgcmV0dXJuaW5nIGFsbCB0aGUgd2F5Cit0byB0aGUgdG9wIGxldmVsLgorCitAZmluZGV4IGVycm9yLWJlZ2luCitBIHF1aXQgb3IgZXJyb3IgYW5ub3RhdGlvbiBtYXkgYmUgcHJlY2VkZWQgYnkKKworQGV4YW1wbGUKK15aXlplcnJvci1iZWdpbgorQGVuZCBleGFtcGxlCisKK0FueSBvdXRwdXQgYmV0d2VlbiB0aGF0IGFuZCB0aGUgcXVpdCBvciBlcnJvciBhbm5vdGF0aW9uIGlzIHRoZSBlcnJvcgorbWVzc2FnZS4KKworV2FybmluZyBtZXNzYWdlcyBhcmUgbm90IHlldCBhbm5vdGF0ZWQuCitAYyBJZiB3ZSB3YW50IHRvIGNoYW5nZSB0aGF0LCBuZWVkIHRvIGZpeCB3YXJuaW5nKCksIHR5cGVfZXJyb3IoKSwKK0BjIHJhbmdlX2Vycm9yKCksIGFuZCBwb3NzaWJseSBvdGhlciBwbGFjZXMuCisKK0Bub2RlIEJyZWFrcG9pbnQgSW5mbworQGNoYXB0ZXIgSW5mb3JtYXRpb24gb24gQnJlYWtwb2ludHMKKworVGhlIG91dHB1dCBmcm9tIHRoZSBAY29kZXtpbmZvIGJyZWFrcG9pbnRzfSBjb21tYW5kIGlzIGFubm90YXRlZCBhcyBmb2xsb3dzOgorCitAZmluZGV4IGJyZWFrcG9pbnRzLWhlYWRlcnMKK0BmaW5kZXggYnJlYWtwb2ludHMtdGFibGUKK0BleGFtcGxlCiteWl5aYnJlYWtwb2ludHMtaGVhZGVycworQHZhcntoZWFkZXItZW50cnl9CiteWl5aYnJlYWtwb2ludHMtdGFibGUKK0BlbmQgZXhhbXBsZQorCit3aGVyZSBAdmFye2hlYWRlci1lbnRyeX0gaGFzIHRoZSBzYW1lIHN5bnRheCBhcyBhbiBlbnRyeSAoc2VlIGJlbG93KSBidXQKK2luc3RlYWQgb2YgY29udGFpbmluZyBkYXRhLCBpdCBjb250YWlucyBzdHJpbmdzIHdoaWNoIGFyZSBpbnRlbmRlZCB0bworY29udmV5IHRoZSBtZWFuaW5nIG9mIGVhY2ggZmllbGQgdG8gdGhlIHVzZXIuICBUaGlzIGlzIGZvbGxvd2VkIGJ5IGFueQorbnVtYmVyIG9mIGVudHJpZXMuICBJZiBhIGZpZWxkIGRvZXMgbm90IGFwcGx5IGZvciB0aGlzIGVudHJ5LCBpdCBpcworb21pdHRlZC4gIEZpZWxkcyBtYXkgY29udGFpbiB0cmFpbGluZyB3aGl0ZXNwYWNlLiAgRWFjaCBlbnRyeSBjb25zaXN0cworb2Y6CisKK0BmaW5kZXggcmVjb3JkCitAZmluZGV4IGZpZWxkCitAZXhhbXBsZQorXlpeWnJlY29yZAorXlpeWmZpZWxkIDAKK0B2YXJ7bnVtYmVyfQorXlpeWmZpZWxkIDEKK0B2YXJ7dHlwZX0KK15aXlpmaWVsZCAyCitAdmFye2Rpc3Bvc2l0aW9ufQorXlpeWmZpZWxkIDMKK0B2YXJ7ZW5hYmxlfQorXlpeWmZpZWxkIDQKK0B2YXJ7YWRkcmVzc30KK15aXlpmaWVsZCA1CitAdmFye3doYXR9CiteWl5aZmllbGQgNgorQHZhcntmcmFtZX0KK15aXlpmaWVsZCA3CitAdmFye2NvbmRpdGlvbn0KK15aXlpmaWVsZCA4CitAdmFye2lnbm9yZS1jb3VudH0KK15aXlpmaWVsZCA5CitAdmFye2NvbW1hbmRzfQorQGVuZCBleGFtcGxlCisKK05vdGUgdGhhdCBAdmFye2FkZHJlc3N9IGlzIGludGVuZGVkIGZvciB1c2VyIGNvbnN1bXB0aW9uLS0tdGhlIHN5bnRheAordmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgbGFuZ3VhZ2UuCisKK1RoZSBvdXRwdXQgZW5kcyB3aXRoCisKK0BmaW5kZXggYnJlYWtwb2ludHMtdGFibGUtZW5kCitAZXhhbXBsZQorXlpeWmJyZWFrcG9pbnRzLXRhYmxlLWVuZAorQGVuZCBleGFtcGxlCisKK0Bub2RlIEludmFsaWRhdGlvbgorQGNoYXB0ZXIgSW52YWxpZGF0aW9uIE5vdGljZXMKKworVGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyBzYXkgdGhhdCBjZXJ0YWluIHBpZWNlcyBvZiBzdGF0ZSBtYXkgaGF2ZQorY2hhbmdlZC4KKworQHRhYmxlIEBjb2RlCitAZmluZGV4IGZyYW1lcy1pbnZhbGlkCitAaXRlbSBeWl5aZnJhbWVzLWludmFsaWQKKworVGhlIGZyYW1lcyAoZm9yIGV4YW1wbGUsIG91dHB1dCBmcm9tIHRoZSBAY29kZXtiYWNrdHJhY2V9IGNvbW1hbmQpIG1heQoraGF2ZSBjaGFuZ2VkLgorCitAZmluZGV4IGJyZWFrcG9pbnRzLWludmFsaWQKK0BpdGVtIF5aXlpicmVha3BvaW50cy1pbnZhbGlkCisKK1RoZSBicmVha3BvaW50cyBtYXkgaGF2ZSBjaGFuZ2VkLiAgRm9yIGV4YW1wbGUsIHRoZSB1c2VyIGp1c3QgYWRkZWQgb3IKK2RlbGV0ZWQgYSBicmVha3BvaW50LgorQGVuZCB0YWJsZQorCitAbm9kZSBSdW5uaW5nCitAY2hhcHRlciBSdW5uaW5nIHRoZSBQcm9ncmFtCisKK0BmaW5kZXggc3RhcnRpbmcKK0BmaW5kZXggc3RvcHBpbmcKK1doZW4gdGhlIHByb2dyYW0gc3RhcnRzIGV4ZWN1dGluZyBkdWUgdG8gYSBHREIgY29tbWFuZCBzdWNoIGFzCitAY29kZXtzdGVwfSBvciBAY29kZXtjb250aW51ZX0sIAorCitAZXhhbXBsZQorXlpeWnN0YXJ0aW5nCitAZW5kIGV4YW1wbGUKKworaXMgb3V0cHV0LiAgV2hlbiB0aGUgcHJvZ3JhbSBzdG9wcywgCisKK0BleGFtcGxlCiteWl5ac3RvcHBlZAorQGVuZCBleGFtcGxlCisKK2lzIG91dHB1dC4gIEJlZm9yZSB0aGUgQGNvZGV7c3RvcHBlZH0gYW5ub3RhdGlvbiwgYSB2YXJpZXR5IG9mCithbm5vdGF0aW9ucyBkZXNjcmliZSBob3cgdGhlIHByb2dyYW0gc3RvcHBlZC4KKworQHRhYmxlIEBjb2RlCitAZmluZGV4IGV4aXRlZAorQGl0ZW0gXlpeWmV4aXRlZCBAdmFye2V4aXQtc3RhdHVzfQorVGhlIHByb2dyYW0gZXhpdGVkLCBhbmQgQHZhcntleGl0LXN0YXR1c30gaXMgdGhlIGV4aXQgc3RhdHVzICh6ZXJvIGZvcgorc3VjY2Vzc2Z1bCBleGl0LCBvdGhlcndpc2Ugbm9uemVybykuCisKK0BmaW5kZXggc2lnbmFsbGVkCitAZmluZGV4IHNpZ25hbC1uYW1lCitAZmluZGV4IHNpZ25hbC1uYW1lLWVuZAorQGZpbmRleCBzaWduYWwtc3RyaW5nCitAZmluZGV4IHNpZ25hbC1zdHJpbmctZW5kCitAaXRlbSBeWl5ac2lnbmFsbGVkCitUaGUgcHJvZ3JhbSBleGl0ZWQgd2l0aCBhIHNpZ25hbC4gIEFmdGVyIHRoZSBAY29kZXteWl5ac2lnbmFsbGVkfSwgdGhlCithbm5vdGF0aW9uIGNvbnRpbnVlczoKKworQGV4YW1wbGUKK0B2YXJ7aW50cm8tdGV4dH0KK15aXlpzaWduYWwtbmFtZQorQHZhcntuYW1lfQorXlpeWnNpZ25hbC1uYW1lLWVuZAorQHZhcnttaWRkbGUtdGV4dH0KK15aXlpzaWduYWwtc3RyaW5nCitAdmFye3N0cmluZ30KK15aXlpzaWduYWwtc3RyaW5nLWVuZAorQHZhcntlbmQtdGV4dH0KK0BlbmQgZXhhbXBsZQorCit3aGVyZSBAdmFye25hbWV9IGlzIHRoZSBuYW1lIG9mIHRoZSBzaWduYWwsIHN1Y2ggYXMgQGNvZGV7U0lHSUxMfSBvcgorQGNvZGV7U0lHU0VHVn0sIGFuZCBAdmFye3N0cmluZ30gaXMgdGhlIGV4cGxhbmF0aW9uIG9mIHRoZSBzaWduYWwsIHN1Y2gKK2FzIEBjb2Rle0lsbGVnYWwgSW5zdHJ1Y3Rpb259IG9yIEBjb2Rle1NlZ21lbnRhdGlvbiBmYXVsdH0uCitAdmFye2ludHJvLXRleHR9LCBAdmFye21pZGRsZS10ZXh0fSwgYW5kIEB2YXJ7ZW5kLXRleHR9IGFyZSBmb3IgdGhlCit1c2VyJ3MgYmVuZWZpdCBhbmQgaGF2ZSBubyBwYXJ0aWN1bGFyIGZvcm1hdC4KKworQGZpbmRleCBzaWduYWwKK0BpdGVtIF5aXlpzaWduYWwKK1RoZSBzeW50YXggb2YgdGhpcyBhbm5vdGF0aW9uIGlzIGp1c3QgbGlrZSBAY29kZXtzaWduYWxsZWR9LCBidXQgR0RCIGlzCitqdXN0IHNheWluZyB0aGF0IHRoZSBwcm9ncmFtIHJlY2VpdmVkIHRoZSBzaWduYWwsIG5vdCB0aGF0IGl0IHdhcwordGVybWluYXRlZCB3aXRoIGl0LgorCitAZmluZGV4IGJyZWFrcG9pbnQKK0BpdGVtIF5aXlpicmVha3BvaW50IEB2YXJ7bnVtYmVyfQorVGhlIHByb2dyYW0gaGl0IGJyZWFrcG9pbnQgbnVtYmVyIEB2YXJ7bnVtYmVyfS4KKworQGZpbmRleCB3YXRjaHBvaW50CitAaXRlbSBeWl5ad2F0Y2hwb2ludCBAdmFye251bWJlcn0KK1RoZSBwcm9ncmFtIGhpdCB3YXRjaHBvaW50IG51bWJlciBAdmFye251bWJlcn0uCitAZW5kIHRhYmxlCisKK0Bub2RlIFNvdXJjZQorQGNoYXB0ZXIgRGlzcGxheWluZyBTb3VyY2UKKworQGZpbmRleCBzb3VyY2UKK1RoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIGluc3RlYWQgb2YgZGlzcGxheWluZyBzb3VyY2UgY29kZToKKworQGV4YW1wbGUKK15aXlpzb3VyY2UgQHZhcntmaWxlbmFtZX06QHZhcntsaW5lfTpAdmFye2NoYXJhY3Rlcn06QHZhcnttaWRkbGV9OkB2YXJ7YWRkcn0KK0BlbmQgZXhhbXBsZQorCit3aGVyZSBAdmFye2ZpbGVuYW1lfSBpcyBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUgaW5kaWNhdGluZyB3aGljaCBzb3VyY2UKK2ZpbGUsIEB2YXJ7bGluZX0gaXMgdGhlIGxpbmUgbnVtYmVyIHdpdGhpbiB0aGF0IGZpbGUgKHdoZXJlIDEgaXMgdGhlCitmaXJzdCBsaW5lIGluIHRoZSBmaWxlKSwgQHZhcntjaGFyYWN0ZXJ9IGlzIHRoZSBjaGFyYWN0ZXIgcG9zaXRpb24KK3dpdGhpbiB0aGUgZmlsZSAod2hlcmUgMCBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBmaWxlKSAoZm9yIG1vc3QKK2RlYnVnIGZvcm1hdHMgdGhpcyB3aWxsIG5lY2Vzc2FyaWx5IHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lKSwKK0B2YXJ7bWlkZGxlfSBpcyBAc2FtcHttaWRkbGV9IGlmIEB2YXJ7YWRkcn0gaXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUKK2xpbmUsIG9yIEBzYW1we2JlZ30gaWYgQHZhcnthZGRyfSBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLCBhbmQKK0B2YXJ7YWRkcn0gaXMgdGhlIGFkZHJlc3MgaW4gdGhlIHRhcmdldCBwcm9ncmFtIGFzc29jaWF0ZWQgd2l0aCB0aGUKK3NvdXJjZSB3aGljaCBpcyBiZWluZyBkaXNwbGF5ZWQuICBAdmFye2FkZHJ9IGlzIGluIHRoZSBmb3JtIEBzYW1wezB4fQorZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgbG93ZXJjYXNlIGhleCBkaWdpdHMgKG5vdGUgdGhhdCB0aGlzIGRvZXMgbm90CitkZXBlbmQgb24gdGhlIGxhbmd1YWdlKS4KKworQG5vZGUgVE9ETworQGNoYXB0ZXIgQW5ub3RhdGlvbnMgV2UgTWlnaHQgV2FudCBpbiB0aGUgRnV0dXJlCisKK0Bmb3JtYXQKKyAgICAtIHRhcmdldC1pbnZhbGlkCisgICAgICB0aGUgdGFyZ2V0IG1pZ2h0IGhhdmUgY2hhbmdlZCAocmVnaXN0ZXJzLCBoZWFwIGNvbnRlbnRzLCBvcgorICAgICAgZXhlY3V0aW9uIHN0YXR1cykuICBGb3IgcGVyZm9ybWFuY2UsIHdlIG1pZ2h0IGV2ZW50dWFsbHkgd2FudAorICAgICAgdG8gaGl0IGByZWdpc3RlcnMtaW52YWxpZCcgYW5kIGBhbGwtcmVnaXN0ZXJzLWludmFsaWQnIHdpdGgKKyAgICAgIGdyZWF0ZXIgcHJlY2lzaW9uCisKKyAgICAtIHN5c3RlbWF0aWMgYW5ub3RhdGlvbiBmb3Igc2V0L3Nob3cgcGFyYW1ldGVycyAoaW5jbHVkaW5nCisgICAgICBpbnZhbGlkYXRpb24gbm90aWNlcykuCisKKyAgICAtIHNpbWlsYXJseSwgYGluZm8nIHJldHVybnMgYSBsaXN0IG9mIGNhbmRpZGF0ZXMgZm9yIGludmFsaWRhdGlvbgorICAgICAgbm90aWNlcy4KK0BlbmQgZm9ybWF0CisKK0Bub2RlIEluZGV4CitAdW5udW1iZXJlZCBJbmRleAorCitAcHJpbnRpbmRleCBmbgorCitAYnllCmRpZmYgLS1naXQgYS9nZGIvZG9jL2NvbmZpZ3VyZSBiL2dkYi9kb2MvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhjNTU5MWMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZG9jL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDg2MiBAQAorIyEgL2Jpbi9zaAorCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorYWNfbWF4X2hlcmVfbGluZXM9MTIKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPXJlZmNhcmQudGV4CisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19wcm9nPSQwCisgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCisKKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgLiAkY2FjaGVfZmlsZQorZWxzZQorICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgPiAkY2FjaGVfZmlsZQorZmkKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworYWNfZXhlZXh0PQorYWNfb2JqZXh0PW8KK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1NTY6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIERFRlMuCisjIFByb3RlY3QgYWdhaW5zdCBzaGVsbCBleHBhbnNpb24gd2hpbGUgZXhlY3V0aW5nIE1ha2VmaWxlIHJ1bGVzLgorIyBQcm90ZWN0IGFnYWluc3QgTWFrZWZpbGUgbWFjcm8gZXhwYW5zaW9uLgorY2F0ID4gY29uZnRlc3QuZGVmcyA8PFxFT0YKK3MlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJS1EXDE9XDIlZworcyVbIAlgfiMkXiYqKCl7fVxcfDsnIjw+P10lXFwmJWcKK3MlXFslXFwmJWcKK3MlXF0lXFwmJWcKK3MlXCQlJCQlZworRU9GCitERUZTPWBzZWQgLWYgY29uZnRlc3QuZGVmcyBjb25mZGVmcy5oIHwgdHIgJ1wwMTInICcgJ2AKK3JtIC1mIGNvbmZ0ZXN0LmRlZnMKKworCisjIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKworZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUworcm0gLWYgJENPTkZJR19TVEFUVVMKK2NhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisjISAvYmluL3NoCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAorIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMKKyMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCisjCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKK2ZvciBhY19vcHRpb24KK2RvCisgIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCisgICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQorICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiIKKyAgICBleGl0IDAgOzsKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCisgICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7CisgIGVzYWMKK2RvbmUKKworYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKK2FjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgorCit0cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQFNIRUxMQCUkU0hFTEwlZworcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBERUZTQCUkREVGUyVnCitzJUBMREZMQUdTQCUkTERGTEFHUyVnCitzJUBMSUJTQCUkTElCUyVnCitzJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKK3MlQHByZWZpeEAlJHByZWZpeCVnCitzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCitzJUBiaW5kaXJAJSRiaW5kaXIlZworcyVAc2JpbmRpckAlJHNiaW5kaXIlZworcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworcyVAZGF0YWRpckAlJGRhdGFkaXIlZworcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZworcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCitzJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCitzJUBsaWJkaXJAJSRsaWJkaXIlZworcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworcyVAaW5mb2RpckAlJGluZm9kaXIlZworcyVAbWFuZGlyQCUkbWFuZGlyJWcKK3MlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCitzJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZworCitDRU9GCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCithY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KK2FjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfbW9yZV9saW5lcz06CithY19zZWRfY21kcz0iIgord2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZmkKKyAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGVsc2UKKyAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGZpCisgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCisgICAgYWNfYmVnPSRhY19lbmQKKyAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgIGFjX3NlZF9jbWRzPWNhdAorZmkKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUifQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KKworICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgIC4pICBzcmNkaXI9LgorICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgorICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7CisgIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgorICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgZXNhYworCisgIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgorICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKKyAgcm0gLWYgIiRhY19maWxlIgorICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorIyAkY29uZmlndXJlX2lucHV0IiA7OworICAqKSBhY19jb21zdWI9IDs7CisgIGVzYWMKKworICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBzZWQgLWUgIiRhY19jb21zdWIKK3MlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCitzJUBzcmNkaXJAJSRzcmNkaXIlZworcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworcyVASU5TVEFMTEAlJElOU1RBTEwlZworIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQorZmk7IGRvbmUKK3JtIC1mIGNvbmZ0ZXN0LnMqCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKwpkaWZmIC0tZ2l0IGEvZ2RiL2RvYy9jb25maWd1cmUuaW4gYi9nZGIvZG9jL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjBlZmMyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2RvYy9jb25maWd1cmUuaW4KQEAgLTAsMCArMSw0IEBACitBQ19QUkVSRVEoMi4xMi4xKQorQUNfSU5JVChyZWZjYXJkLnRleCkKK0FDX1BST0dfSU5TVEFMTAorQUNfT1VUUFVUKE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvZ2RiL2RvYy9nZGIudGV4aW5mbyBiL2dkYi9kb2MvZ2RiLnRleGluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5MjBiYgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9kb2MvZ2RiLnRleGluZm8KQEAgLTAsMCArMSwxMDMxNiBAQAorXGlucHV0IHRleGluZm8gICAgICBAYyAtKi10ZXhpbmZvLSotCitAYyBDb3B5cmlnaHQgMTk4OC0xOTk5CitAYyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0BjCitAYyAlKipzdGFydCBvZiBoZWFkZXIgCitAYyBtYWtlaW5mbyBpZ25vcmVzIGNtZHMgcHJldiB0byBzZXRmaWxlbmFtZSwgc28gaXRzIGFyZyBjYW5ub3QgbWFrZSB1c2UKK0BjIG9mIEBzZXQgdmFycy4gIEhvd2V2ZXIsIHlvdSBjYW4gb3ZlcnJpZGUgZmlsZW5hbWUgd2l0aCBtYWtlaW5mbyAtby4KK0BzZXRmaWxlbmFtZSBnZGIuaW5mbworQGMKK0BpbmNsdWRlIGdkYi1jZmcudGV4aQorQGMKK0BpZnNldCBHRU5FUklDCitAc2V0dGl0bGUgRGVidWdnaW5nIHdpdGggQHZhbHVle0dEQk59CitAZW5kIGlmc2V0CitAaWZjbGVhciBHRU5FUklDCitAc2V0dGl0bGUgRGVidWdnaW5nIHdpdGggQHZhbHVle0dEQk59IChAdmFsdWV7VEFSR0VUfSkKK0BlbmQgaWZjbGVhcgorQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAorQGMgJSoqZW5kIG9mIGhlYWRlcgorCitAaWZ0ZXgKK0BjIEBzbWFsbGJvb2sKK0BjIEBjcm9wbWFya3MKK0BlbmQgaWZ0ZXgKKworQGZpbmFsb3V0CitAc3luY29kZWluZGV4IGt5IGNwCisKK0BjIHJlYWRsaW5lIGFwcGVuZGljZXMgdXNlIEB2aW5kZXgKK0BzeW5jb2RlaW5kZXggdnIgY3AKKworQGMgISFzZXQgR0RCIG1hbnVhbCdzIGVkaXRpb24tLS1ub3QgdGhlIHNhbWUgYXMgR0RCIHZlcnNpb24hCitAc2V0IEVESVRJT04gU2V2ZW50aAorCitAYyAhIXNldCBHREIgbWFudWFsJ3MgcmV2aXNpb24gZGF0ZQorQHNldCBEQVRFIEZlYnJ1YXJ5IDE5OTkKKworQGMgVEhJUyBNQU5VQUwgUkVRVUlSRVMgVEVYSU5GTy0yIG1hY3JvcyBhbmQgaW5mby1tYWtlcnMgdG8gZm9ybWF0IHByb3Blcmx5LgorCitAaWZpbmZvCitAYyBUaGlzIGlzIGEgZGlyLmluZm8gZnJhZ21lbnQgdG8gc3VwcG9ydCBzZW1pLWF1dG9tYXRlZCBhZGRpdGlvbiBvZgorQGMgbWFudWFscyB0byBhbiBpbmZvIHRyZWUuICB6b29AY3lnbnVzLmNvbSBpcyBkZXZlbG9waW5nIHRoaXMgZmFjaWxpdHkuCitAZm9ybWF0CitTVEFSVC1JTkZPLURJUi1FTlRSWQorKiBHZGI6IChnZGIpLiAgICAgICAgICAgICAgICAgICAgIFRoZSBAc2N7Z251fSBkZWJ1Z2dlci4KK0VORC1JTkZPLURJUi1FTlRSWQorQGVuZCBmb3JtYXQKK0BlbmQgaWZpbmZvCitAYworQGMKK0BpZmluZm8KK1RoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEBzY3tnbnV9IGRlYnVnZ2VyIEB2YWx1ZXtHREJOfS4KKworCitUaGlzIGlzIHRoZSBAdmFsdWV7RURJVElPTn0gRWRpdGlvbiwgQHZhbHVle0RBVEV9LCAKK29mIEBjaXRle0RlYnVnZ2luZyB3aXRoIEB2YWx1ZXtHREJOfTogdGhlIEBzY3tnbnV9IFNvdXJjZS1MZXZlbCBEZWJ1Z2dlcn0KK2ZvciBAdmFsdWV7R0RCTn0gVmVyc2lvbiBAdmFsdWV7R0RCVk59LgorCitDb3B5cmlnaHQgKEMpIDE5ODgtMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCit0aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQorYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorCitAaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQorcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KK25vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAorKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgorCitAZW5kIGlnbm9yZQorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcworbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQgdGhlCitlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQorcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKK2ludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgorQGVuZCBpZmluZm8KKworQHRpdGxlcGFnZQorQHRpdGxlIERlYnVnZ2luZyB3aXRoIEB2YWx1ZXtHREJOfQorQHN1YnRpdGxlIFRoZSBAc2N7Z251fSBTb3VyY2UtTGV2ZWwgRGVidWdnZXIKK0BpZmNsZWFyIEdFTkVSSUMKK0BzdWJ0aXRsZSAoQHZhbHVle1RBUkdFVH0pCitAZW5kIGlmY2xlYXIKK0BzcCAxCitAaWZjbGVhciBIUFBBCitAc3VidGl0bGUgQHZhbHVle0VESVRJT059IEVkaXRpb24sIGZvciBAdmFsdWV7R0RCTn0gdmVyc2lvbiBAdmFsdWV7R0RCVk59CitAc3VidGl0bGUgQHZhbHVle0RBVEV9CitAYXV0aG9yIFJpY2hhcmQgTS4gU3RhbGxtYW4gYW5kIFJvbGFuZCBILiBQZXNjaAorQGVuZCBpZmNsZWFyCitAaWZzZXQgSFBQQQorQHN1YnRpdGxlIEVkaXRpb24gQHZhbHVle0VESVRJT059LCBmb3IgQHZhbHVle0hQVkVSfSAoYmFzZWQgb24gQHZhbHVle0dEQk59IEB2YWx1ZXtHREJWTn0pCitAc3VidGl0bGUgQHZhbHVle0RBVEV9CitAYXV0aG9yIFJpY2hhcmQgTS4gU3RhbGxtYW4gYW5kIFJvbGFuZCBILiBQZXNjaCAobW9kaWZpZWQgYnkgSFApCitAZW5kIGlmc2V0CitAcGFnZQorQGlmY2xlYXIgSFBQQQorQHRleAore1xwYXJza2lwPTBwdAorXGhmaWxsIChTZW5kIGJ1Z3MgYW5kIGNvbW1lbnRzIG9uIEB2YWx1ZXtHREJOfSB0byBidWctZ2RiXEBwcmVwLmFpLm1pdC5lZHUuKVxwYXIKK1xoZmlsbCB7XGl0IERlYnVnZ2luZyB3aXRoIEB2YWx1ZXtHREJOfX1ccGFyCitcaGZpbGwgXFRlWHt9aW5mbyBcdGV4aW5mb3ZlcnNpb25ccGFyCit9CitAZW5kIHRleAorQGVuZCBpZmNsZWFyCitAaWZzZXQgSFBQQQorQHRleAore1xwYXJza2lwPTBwdAorXGhmaWxsIHtcaXQgRGVidWdnaW5nIHdpdGggQHZhbHVle0dEQk59fVxwYXIKK1xoZmlsbCBcVGVYe31pbmZvIFx0ZXhpbmZvdmVyc2lvblxwYXIKK30KK0BlbmQgdGV4CitAZW5kIGlmc2V0CisKK0B2c2tpcCAwcHQgcGx1cyAxZmlsbGwKK0NvcHlyaWdodCBAY29weXJpZ2h0e30gMTk4OC0xOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAKK0BzcCAyCitAaWZjbGVhciBIUFBBCitQdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBAKgorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBAKgorQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBAKgorUHJpbnRlZCBjb3BpZXMgYXJlIGF2YWlsYWJsZSBmb3IgJDIwIGVhY2guIEAqCitJU0JOIDEtODgyMTE0LTExLTYgQCoKK0BlbmQgaWZjbGVhcgorICAgICAgICAgICAgICAgIAorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCit0aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQorYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdCB0aGUKK2VudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAoraW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCitAZW5kIHRpdGxlcGFnZQorQHBhZ2UKKworQGlmaW5mbworQG5vZGUgVG9wLCBTdW1tYXJ5LCAoZGlyKSwgKGRpcikKK0B0b3AgRGVidWdnaW5nIHdpdGggQHZhbHVle0dEQk59CisKK1RoaXMgZmlsZSBkZXNjcmliZXMgQHZhbHVle0dEQk59LCB0aGUgQHNje2dudX0gc3ltYm9saWMgZGVidWdnZXIuCisKK1RoaXMgaXMgdGhlIEB2YWx1ZXtFRElUSU9OfSBFZGl0aW9uLCBAdmFsdWV7REFURX0sIGZvciBAdmFsdWV7R0RCTn0gVmVyc2lvbiAKK0B2YWx1ZXtHREJWTn0uCisKK0NvcHlyaWdodCAoQykgMTk4OC0xOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQG1lbnUKKyogU3VtbWFyeTo6ICAgICAgICAgICAgICAgICAgICAgU3VtbWFyeSBvZiBAdmFsdWV7R0RCTn0KK0BpZmNsZWFyIEJBUkVUQVJHRVQKKyogU2FtcGxlIFNlc3Npb246OiAgICAgICAgICAgICAgQSBzYW1wbGUgQHZhbHVle0dEQk59IHNlc3Npb24KK0BlbmQgaWZjbGVhcgorCisqIEludm9jYXRpb246OiAgICAgICAgICAgICAgICAgIEdldHRpbmcgaW4gYW5kIG91dCBvZiBAdmFsdWV7R0RCTn0KKyogQ29tbWFuZHM6OiAgICAgICAgICAgICAgICAgICAgQHZhbHVle0dEQk59IGNvbW1hbmRzCisqIFJ1bm5pbmc6OiAgICAgICAgICAgICAgICAgICAgIFJ1bm5pbmcgcHJvZ3JhbXMgdW5kZXIgQHZhbHVle0dEQk59CisqIFN0b3BwaW5nOjogICAgICAgICAgICAgICAgICAgIFN0b3BwaW5nIGFuZCBjb250aW51aW5nCisqIFN0YWNrOjogICAgICAgICAgICAgICAgICAgICAgIEV4YW1pbmluZyB0aGUgc3RhY2sKKyogU291cmNlOjogICAgICAgICAgICAgICAgICAgICAgRXhhbWluaW5nIHNvdXJjZSBmaWxlcworKiBEYXRhOjogICAgICAgICAgICAgICAgICAgICAgICBFeGFtaW5pbmcgZGF0YQorQGlmY2xlYXIgQ09OTFkKKyogTGFuZ3VhZ2VzOjogICAgICAgICAgICAgICAgICAgVXNpbmcgQHZhbHVle0dEQk59IHdpdGggZGlmZmVyZW50IGxhbmd1YWdlcworQGVuZCBpZmNsZWFyCisKK0BpZnNldCBDT05MWQorKiBDOjogICAgICAgICAgICAgICAgICAgICAgICAgICBDIGxhbmd1YWdlIHN1cHBvcnQKK0BlbmQgaWZzZXQKKworKiBTeW1ib2xzOjogICAgICAgICAgICAgICAgICAgICBFeGFtaW5pbmcgdGhlIHN5bWJvbCB0YWJsZQorKiBBbHRlcmluZzo6ICAgICAgICAgICAgICAgICAgICBBbHRlcmluZyBleGVjdXRpb24KKyogR0RCIEZpbGVzOjogICAgICAgICAgICAgICAgICAgQHZhbHVle0dEQk59IGZpbGVzCisqIFRhcmdldHM6OiAgICAgICAgICAgICAgICAgICAgIFNwZWNpZnlpbmcgYSBkZWJ1Z2dpbmcgdGFyZ2V0CisqIENvbnRyb2xsaW5nIEdEQjo6ICAgICAgICAgICAgIENvbnRyb2xsaW5nIEB2YWx1ZXtHREJOfQorKiBTZXF1ZW5jZXM6OiAgICAgICAgICAgICAgICAgICBDYW5uZWQgc2VxdWVuY2VzIG9mIGNvbW1hbmRzCitAaWZjbGVhciBET1NIT1NUCisqIEVtYWNzOjogICAgICAgICAgICAgICAgICAgICAgIFVzaW5nIEB2YWx1ZXtHREJOfSB1bmRlciBAc2N7Z251fSBFbWFjcworQGVuZCBpZmNsZWFyCisKKyogR0RCIEJ1Z3M6OiAgICAgICAgICAgICAgICAgICAgUmVwb3J0aW5nIGJ1Z3MgaW4gQHZhbHVle0dEQk59CisKK0BpZmNsZWFyIFBSRUNPTkZJR1VSRUQKK0BpZmNsZWFyIEhQUEEKKyogRm9ybWF0dGluZyBEb2N1bWVudGF0aW9uOjogICAgSG93IHRvIGZvcm1hdCBhbmQgcHJpbnQgQHZhbHVle0dEQk59IGRvY3VtZW50YXRpb24KK0BlbmQgaWZjbGVhcgorCitAZW5kIGlmY2xlYXIKKworKiBDb21tYW5kIExpbmUgRWRpdGluZzo6ICAgICAgICBDb21tYW5kIExpbmUgRWRpdGluZworKiBVc2luZyBIaXN0b3J5IEludGVyYWN0aXZlbHk6OiBVc2luZyBIaXN0b3J5IEludGVyYWN0aXZlbHkKKyogSW5zdGFsbGluZyBHREI6OiAgICAgICAgICAgICAgSW5zdGFsbGluZyBHREIKKyogSW5kZXg6OiAgICAgICAgICAgICAgICAgICAgICAgSW5kZXgKKworIC0tLSBUaGUgRGV0YWlsZWQgTm9kZSBMaXN0aW5nIC0tLQorCitTdW1tYXJ5IG9mIEB2YWx1ZXtHREJOfQorCisqIEZyZWUgU29mdHdhcmU6OiAgICAgICAgICAgICAgIEZyZWVseSByZWRpc3RyaWJ1dGFibGUgc29mdHdhcmUKKyogQ29udHJpYnV0b3JzOjogICAgICAgICAgICAgICAgQ29udHJpYnV0b3JzIHRvIEdEQgorCitHZXR0aW5nIEluIGFuZCBPdXQgb2YgQHZhbHVle0dEQk59CisKKyogSW52b2tpbmcgR0RCOjogICAgICAgICAgICAgICAgSG93IHRvIHN0YXJ0IEB2YWx1ZXtHREJOfQorKiBRdWl0dGluZyBHREI6OiAgICAgICAgICAgICAgICBIb3cgdG8gcXVpdCBAdmFsdWV7R0RCTn0KKyogU2hlbGwgQ29tbWFuZHM6OiAgICAgICAgICAgICAgSG93IHRvIHVzZSBzaGVsbCBjb21tYW5kcyBpbnNpZGUgQHZhbHVle0dEQk59CisKK0ludm9raW5nIEB2YWx1ZXtHREJOfQorCisqIEZpbGUgT3B0aW9uczo6ICAgICAgICAgICAgICAgIENob29zaW5nIGZpbGVzCisqIE1vZGUgT3B0aW9uczo6ICAgICAgICAgICAgICAgIENob29zaW5nIG1vZGVzCisKK0B2YWx1ZXtHREJOfSBDb21tYW5kcworCisqIENvbW1hbmQgU3ludGF4OjogICAgICAgICAgICAgIEhvdyB0byBnaXZlIGNvbW1hbmRzIHRvIEB2YWx1ZXtHREJOfQorKiBDb21wbGV0aW9uOjogICAgICAgICAgICAgICAgICBDb21tYW5kIGNvbXBsZXRpb24KKyogSGVscDo6ICAgICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGFzayBAdmFsdWV7R0RCTn0gZm9yIGhlbHAKKworUnVubmluZyBQcm9ncmFtcyBVbmRlciBAdmFsdWV7R0RCTn0KKworKiBDb21waWxhdGlvbjo6ICAgICAgICAgICAgICAgICBDb21waWxpbmcgZm9yIGRlYnVnZ2luZworKiBTdGFydGluZzo6ICAgICAgICAgICAgICAgICAgICBTdGFydGluZyB5b3VyIHByb2dyYW0KK0BpZmNsZWFyIEJBUkVUQVJHRVQKKyogQXJndW1lbnRzOjogICAgICAgICAgICAgICAgICAgWW91ciBwcm9ncmFtJ3MgYXJndW1lbnRzCisqIEVudmlyb25tZW50OjogICAgICAgICAgICAgICAgIFlvdXIgcHJvZ3JhbSdzIGVudmlyb25tZW50CitAZW5kIGlmY2xlYXIKKworKiBXb3JraW5nIERpcmVjdG9yeTo6ICAgICAgICAgICBZb3VyIHByb2dyYW0ncyB3b3JraW5nIGRpcmVjdG9yeQorKiBJbnB1dC9PdXRwdXQ6OiAgICAgICAgICAgICAgICBZb3VyIHByb2dyYW0ncyBpbnB1dCBhbmQgb3V0cHV0CisqIEF0dGFjaDo6ICAgICAgICAgICAgICAgICAgICAgIERlYnVnZ2luZyBhbiBhbHJlYWR5LXJ1bm5pbmcgcHJvY2VzcworKiBLaWxsIFByb2Nlc3M6OiAgICAgICAgICAgICAgICBLaWxsaW5nIHRoZSBjaGlsZCBwcm9jZXNzCitAaWZjbGVhciBIUFBBCisqIFByb2Nlc3MgSW5mb3JtYXRpb246OiAgICAgICAgIEFkZGl0aW9uYWwgcHJvY2VzcyBpbmZvcm1hdGlvbgorQGVuZCBpZmNsZWFyCisKKyogVGhyZWFkczo6ICAgICAgICAgICAgICAgICAgICAgRGVidWdnaW5nIHByb2dyYW1zIHdpdGggbXVsdGlwbGUgdGhyZWFkcworKiBQcm9jZXNzZXM6OiAgICAgICAgICAgICAgICAgICBEZWJ1Z2dpbmcgcHJvZ3JhbXMgd2l0aCBtdWx0aXBsZSBwcm9jZXNzZXMKKworU3RvcHBpbmcgYW5kIENvbnRpbnVpbmcKKworKiBCcmVha3BvaW50czo6ICAgICAgICAgICAgICAgICBCcmVha3BvaW50cywgd2F0Y2hwb2ludHMsIGFuZCBjYXRjaHBvaW50cworKiBDb250aW51aW5nIGFuZCBTdGVwcGluZzo6ICAgICBSZXN1bWluZyBleGVjdXRpb24KK0BpZnNldCBQT1NJWAorKiBTaWduYWxzOjogICAgICAgICAgICAgICAgICAgICBTaWduYWxzCitAZW5kIGlmc2V0CitAaWZjbGVhciBCQVJFVEFSR0VUCisqIFRocmVhZCBTdG9wczo6ICAgICAgICAgICAgICAgIFN0b3BwaW5nIGFuZCBzdGFydGluZyBtdWx0aS10aHJlYWQgcHJvZ3JhbXMKK0BlbmQgaWZjbGVhcgorCitCcmVha3BvaW50cyBhbmQgd2F0Y2hwb2ludHMKKworKiBTZXQgQnJlYWtzOjogICAgICAgICAgICAgICAgICBTZXR0aW5nIGJyZWFrcG9pbnRzCisqIFNldCBXYXRjaHBvaW50czo6ICAgICAgICAgICAgIFNldHRpbmcgd2F0Y2hwb2ludHMKKyogU2V0IENhdGNocG9pbnRzOjogICAgICAgICAgICAgU2V0dGluZyBjYXRjaHBvaW50cworKiBEZWxldGUgQnJlYWtzOjogICAgICAgICAgICAgICBEZWxldGluZyBicmVha3BvaW50cworKiBEaXNhYmxpbmc6OiAgICAgICAgICAgICAgICAgICBEaXNhYmxpbmcgYnJlYWtwb2ludHMKKyogQ29uZGl0aW9uczo6ICAgICAgICAgICAgICAgICAgQnJlYWsgY29uZGl0aW9ucworKiBCcmVhayBDb21tYW5kczo6ICAgICAgICAgICAgICBCcmVha3BvaW50IGNvbW1hbmQgbGlzdHMKK0BpZmNsZWFyIENPTkxZCisqIEJyZWFrcG9pbnQgTWVudXM6OiAgICAgICAgICAgIEJyZWFrcG9pbnQgbWVudXMKK0BlbmQgaWZjbGVhcgorCitFeGFtaW5pbmcgdGhlIFN0YWNrCisKKyogRnJhbWVzOjogICAgICAgICAgICAgICAgICAgICAgU3RhY2sgZnJhbWVzCisqIEJhY2t0cmFjZTo6ICAgICAgICAgICAgICAgICAgIEJhY2t0cmFjZXMKKyogU2VsZWN0aW9uOjogICAgICAgICAgICAgICAgICAgU2VsZWN0aW5nIGEgZnJhbWUKKyogRnJhbWUgSW5mbzo6ICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb24gb24gYSBmcmFtZQorKiBBbHBoYS9NSVBTIFN0YWNrOjogICAgICAgICAgICBBbHBoYSBhbmQgTUlQUyBtYWNoaW5lcyBhbmQgdGhlIGZ1bmN0aW9uIHN0YWNrCisKK0V4YW1pbmluZyBTb3VyY2UgRmlsZXMKKworKiBMaXN0OjogICAgICAgICAgICAgICAgICAgICAgICBQcmludGluZyBzb3VyY2UgbGluZXMKK0BpZmNsZWFyIERPU0hPU1QKKyogU2VhcmNoOjogICAgICAgICAgICAgICAgICAgICAgU2VhcmNoaW5nIHNvdXJjZSBmaWxlcworQGVuZCBpZmNsZWFyCisqIFNvdXJjZSBQYXRoOjogICAgICAgICAgICAgICAgIFNwZWNpZnlpbmcgc291cmNlIGRpcmVjdG9yaWVzCisqIE1hY2hpbmUgQ29kZTo6ICAgICAgICAgICAgICAgIFNvdXJjZSBhbmQgbWFjaGluZSBjb2RlCisKK0V4YW1pbmluZyBEYXRhCisKKyogRXhwcmVzc2lvbnM6OiAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbnMKKyogVmFyaWFibGVzOjogICAgICAgICAgICAgICAgICAgUHJvZ3JhbSB2YXJpYWJsZXMKKyogQXJyYXlzOjogICAgICAgICAgICAgICAgICAgICAgQXJ0aWZpY2lhbCBhcnJheXMKKyogT3V0cHV0IEZvcm1hdHM6OiAgICAgICAgICAgICAgT3V0cHV0IGZvcm1hdHMKKyogTWVtb3J5OjogICAgICAgICAgICAgICAgICAgICAgRXhhbWluaW5nIG1lbW9yeQorKiBBdXRvIERpc3BsYXk6OiAgICAgICAgICAgICAgICBBdXRvbWF0aWMgZGlzcGxheQorKiBQcmludCBTZXR0aW5nczo6ICAgICAgICAgICAgICBQcmludCBzZXR0aW5ncworKiBWYWx1ZSBIaXN0b3J5OjogICAgICAgICAgICAgICBWYWx1ZSBoaXN0b3J5CisqIENvbnZlbmllbmNlIFZhcnM6OiAgICAgICAgICAgIENvbnZlbmllbmNlIHZhcmlhYmxlcworKiBSZWdpc3RlcnM6OiAgICAgICAgICAgICAgICAgICBSZWdpc3RlcnMKK0BpZmNsZWFyIEhBVkUtRkxPQVQKKyogRmxvYXRpbmcgUG9pbnQgSGFyZHdhcmU6OiAgICAgRmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUKK0BlbmQgaWZjbGVhcgorCitVc2luZyBAdmFsdWV7R0RCTn0gd2l0aCBEaWZmZXJlbnQgTGFuZ3VhZ2VzCisKKyogU2V0dGluZzo6ICAgICAgICAgICAgICAgICAgICAgU3dpdGNoaW5nIGJldHdlZW4gc291cmNlIGxhbmd1YWdlcworKiBTaG93OjogICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5aW5nIHRoZSBsYW5ndWFnZQorQGlmc2V0IE1PRDIKKyogQ2hlY2tzOjogICAgICAgICAgICAgICAgICAgICAgVHlwZSBhbmQgcmFuZ2UgY2hlY2tzCitAZW5kIGlmc2V0CisKKyogU3VwcG9ydDo6ICAgICAgICAgICAgICAgICAgICAgU3VwcG9ydGVkIGxhbmd1YWdlcworCitTd2l0Y2hpbmcgYmV0d2VlbiBzb3VyY2UgbGFuZ3VhZ2VzCisKKyogRmlsZW5hbWVzOjogICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgZXh0ZW5zaW9ucyBhbmQgbGFuZ3VhZ2VzLgorKiBNYW51YWxseTo6ICAgICAgICAgICAgICAgICAgICBTZXR0aW5nIHRoZSB3b3JraW5nIGxhbmd1YWdlIG1hbnVhbGx5CisqIEF1dG9tYXRpY2FsbHk6OiAgICAgICAgICAgICAgIEhhdmluZyBAdmFsdWV7R0RCTn0gaW5mZXIgdGhlIHNvdXJjZSBsYW5ndWFnZQorCitAaWZzZXQgTU9EMgorVHlwZSBhbmQgcmFuZ2UgY2hlY2tpbmcKKworKiBUeXBlIENoZWNraW5nOjogICAgICAgICAgICAgICBBbiBvdmVydmlldyBvZiB0eXBlIGNoZWNraW5nCisqIFJhbmdlIENoZWNraW5nOjogICAgICAgICAgICAgIEFuIG92ZXJ2aWV3IG9mIHJhbmdlIGNoZWNraW5nCitAZW5kIGlmc2V0CisKK1N1cHBvcnRlZCBsYW5ndWFnZXMKKworQGlmc2V0IE1PRDIKKyogQzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgQyBhbmQgQysrCisKK0MgTGFuZ3VhZ2UgU3VwcG9ydAorCisqIEMgT3BlcmF0b3JzOjogICAgICAgICAgICAgICAgIEMgb3BlcmF0b3JzCisKK0MgTGFuZ3VhZ2UgU3VwcG9ydAorQGVuZCBpZnNldAorCisqIEMgT3BlcmF0b3JzOjogICAgICAgICAgICAgICAgIEMgYW5kIEMrKyBvcGVyYXRvcnMKKyogQyBDb25zdGFudHM6OiAgICAgICAgICAgICAgICAgQyBhbmQgQysrIGNvbnN0YW50cworKiBDcGx1cyBleHByZXNzaW9uczo6ICAgICAgICAgICBDKysgZXhwcmVzc2lvbnMKKyogQyBEZWZhdWx0czo6ICAgICAgICAgICAgICAgICAgRGVmYXVsdCBzZXR0aW5ncyBmb3IgQyBhbmQgQysrCitAaWZzZXQgTU9EMgorKiBDIENoZWNrczo6ICAgICAgICAgICAgICAgICAgICBDIGFuZCBDKysgdHlwZSBhbmQgcmFuZ2UgY2hlY2tzCitAZW5kIGlmc2V0CisqIERlYnVnZ2luZyBDOjogICAgICAgICAgICAgICAgIEB2YWx1ZXtHREJOfSBhbmQgQworKiBEZWJ1Z2dpbmcgQyBwbHVzIHBsdXM6OiAgICAgICBAdmFsdWV7R0RCTn0gZmVhdHVyZXMgZm9yIEMrKworCitAaWZzZXQgTU9EMgorTW9kdWxhLTIKKworKiBNMiBPcGVyYXRvcnM6OiAgICAgICAgICAgICAgICBCdWlsdC1pbiBvcGVyYXRvcnMKKyogQnVpbHQtSW4gRnVuYy9Qcm9jOjogICAgICAgICAgQnVpbHQtaW4gZnVuY3Rpb25zIGFuZCBwcm9jZWR1cmVzCisqIE0yIENvbnN0YW50czo6ICAgICAgICAgICAgICAgIE1vZHVsYS0yIGNvbnN0YW50cworKiBNMiBEZWZhdWx0czo6ICAgICAgICAgICAgICAgICBEZWZhdWx0IHNldHRpbmdzIGZvciBNb2R1bGEtMgorKiBEZXZpYXRpb25zOjogICAgICAgICAgICAgICAgICBEZXZpYXRpb25zIGZyb20gc3RhbmRhcmQgTW9kdWxhLTIKKyogTTIgQ2hlY2tzOjogICAgICAgICAgICAgICAgICAgTW9kdWxhLTIgdHlwZSBhbmQgcmFuZ2UgY2hlY2tzCisqIE0yIFNjb3BlOjogICAgICAgICAgICAgICAgICAgIFRoZSBzY29wZSBvcGVyYXRvcnMgQGNvZGV7Ojp9IGFuZCBAY29kZXsufQorKiBHREIvTTI6OiAgICAgICAgICAgICAgICAgICAgICBAdmFsdWV7R0RCTn0gYW5kIE1vZHVsYS0yCitAZW5kIGlmc2V0CisKK0FsdGVyaW5nIEV4ZWN1dGlvbgorCisqIEFzc2lnbm1lbnQ6OiAgICAgICAgICAgICAgICAgIEFzc2lnbm1lbnQgdG8gdmFyaWFibGVzCisqIEp1bXBpbmc6OiAgICAgICAgICAgICAgICAgICAgIENvbnRpbnVpbmcgYXQgYSBkaWZmZXJlbnQgYWRkcmVzcworQGlmY2xlYXIgQkFSRVRBUkdFVAorKiBTaWduYWxpbmc6OiAgICAgICAgICAgICAgICAgICBHaXZpbmcgeW91ciBwcm9ncmFtIGEgc2lnbmFsCitAZW5kIGlmY2xlYXIKKyogUmV0dXJuaW5nOjogICAgICAgICAgICAgICAgICAgUmV0dXJuaW5nIGZyb20gYSBmdW5jdGlvbgorKiBDYWxsaW5nOjogICAgICAgICAgICAgICAgICAgICBDYWxsaW5nIHlvdXIgcHJvZ3JhbSdzIGZ1bmN0aW9ucworKiBQYXRjaGluZzo6ICAgICAgICAgICAgICAgICAgICBQYXRjaGluZyB5b3VyIHByb2dyYW0KKworQHZhbHVle0dEQk59IEZpbGVzCisKKyogRmlsZXM6OiAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZHMgdG8gc3BlY2lmeSBmaWxlcworKiBTeW1ib2wgRXJyb3JzOjogICAgICAgICAgICAgICBFcnJvcnMgcmVhZGluZyBzeW1ib2wgZmlsZXMKKworU3BlY2lmeWluZyBhIERlYnVnZ2luZyBUYXJnZXQKKworKiBBY3RpdmUgVGFyZ2V0czo6ICAgICAgICAgICAgICBBY3RpdmUgdGFyZ2V0cworKiBUYXJnZXQgQ29tbWFuZHM6OiAgICAgICAgICAgICBDb21tYW5kcyBmb3IgbWFuYWdpbmcgdGFyZ2V0cworQGlmY2xlYXIgSFBQQQorKiBCeXRlIE9yZGVyOjogICAgICAgICAgICAgICAgICBDaG9vc2luZyB0YXJnZXQgYnl0ZSBvcmRlcgorKiBSZW1vdGU6OiAgICAgICAgICAgICAgICAgICAgICBSZW1vdGUgZGVidWdnaW5nCisKK1JlbW90ZSBkZWJ1Z2dpbmcKK0BlbmQgaWZjbGVhcgorCitAaWZzZXQgUkVNT1RFU1RVQgorKiBSZW1vdGUgU2VyaWFsOjogICAgICAgICAgICAgICBAdmFsdWV7R0RCTn0gcmVtb3RlIHNlcmlhbCBwcm90b2NvbAorQGVuZCBpZnNldAorCitAaWZzZXQgSTk2MAorKiBpOTYwLU5pbmR5IFJlbW90ZTo6CQlAdmFsdWV7R0RCTn0gd2l0aCBhIHJlbW90ZSBpOTYwIChOaW5keSkKK0BlbmQgaWZzZXQKKworQGlmc2V0IEFNRDI5SworKiBVREkyOUsgUmVtb3RlOjogICAgICAgICAgICAgICBUaGUgVURJIHByb3RvY29sIGZvciBBTUQyOUsKKyogRUIyOUsgUmVtb3RlOjoJCVRoZSBFQk1PTiBwcm90b2NvbCBmb3IgQU1EMjlLCitAZW5kIGlmc2V0CisKK0BpZnNldCBWWFdPUktTCisqIFZ4V29ya3MgUmVtb3RlOjoJCUB2YWx1ZXtHREJOfSBhbmQgVnhXb3JrcworQGVuZCBpZnNldAorCitAaWZzZXQgU1QyMDAwCisqIFNUMjAwMCBSZW1vdGU6OiAgICAgICAgICAgICAgIEB2YWx1ZXtHREJOfSB3aXRoIGEgVGFuZGVtIFNUMjAwMAorQGVuZCBpZnNldAorCitAaWZzZXQgSDgKKyogSGl0YWNoaSBSZW1vdGU6OiAgICAgICAgICAgICAgQHZhbHVle0dEQk59IGFuZCBIaXRhY2hpIE1pY3JvcHJvY2Vzc29ycworQGVuZCBpZnNldAorCitAaWZzZXQgTUlQUworKiBNSVBTIFJlbW90ZTo6CQkJQHZhbHVle0dEQk59IGFuZCBNSVBTIGJvYXJkcworQGVuZCBpZnNldAorCitAaWZzZXQgU0lNUworKiBTaW11bGF0b3I6OiAgICAgICAgICAgICAgICAgICBTaW11bGF0ZWQgQ1BVIHRhcmdldAorQGVuZCBpZnNldAorCitDb250cm9sbGluZyBAdmFsdWV7R0RCTn0KKworKiBQcm9tcHQ6OiAgICAgICAgICAgICAgICAgICAgICBQcm9tcHQKKyogRWRpdGluZzo6ICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZCBlZGl0aW5nCisqIEhpc3Rvcnk6OiAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQgaGlzdG9yeQorKiBTY3JlZW4gU2l6ZTo6ICAgICAgICAgICAgICAgICBTY3JlZW4gc2l6ZQorKiBOdW1iZXJzOjogICAgICAgICAgICAgICAgICAgICBOdW1iZXJzCisqIE1lc3NhZ2VzL1dhcm5pbmdzOjogICAgICAgICAgIE9wdGlvbmFsIHdhcm5pbmdzIGFuZCBtZXNzYWdlcworCitDYW5uZWQgU2VxdWVuY2VzIG9mIENvbW1hbmRzCisKKyogRGVmaW5lOjogICAgICAgICAgICAgICAgICAgICAgVXNlci1kZWZpbmVkIGNvbW1hbmRzCisqIEhvb2tzOjogICAgICAgICAgICAgICAgICAgICAgIFVzZXItZGVmaW5lZCBjb21tYW5kIGhvb2tzCisqIENvbW1hbmQgRmlsZXM6OiAgICAgICAgICAgICAgIENvbW1hbmQgZmlsZXMKKyogT3V0cHV0OjogICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZHMgZm9yIGNvbnRyb2xsZWQgb3V0cHV0CisKK1JlcG9ydGluZyBCdWdzIGluIEB2YWx1ZXtHREJOfQorCisqIEJ1ZyBDcml0ZXJpYTo6ICAgICAgICAgICAgICAgIEhhdmUgeW91IGZvdW5kIGEgYnVnPworKiBCdWcgUmVwb3J0aW5nOjogICAgICAgICAgICAgICBIb3cgdG8gcmVwb3J0IGJ1Z3MKKworSW5zdGFsbGluZyBAdmFsdWV7R0RCTn0KKworKiBTZXBhcmF0ZSBPYmpkaXI6OiAgICAgICAgICAgICBDb21waWxpbmcgQHZhbHVle0dEQk59IGluIGFub3RoZXIgZGlyZWN0b3J5CisqIENvbmZpZyBOYW1lczo6ICAgICAgICAgICAgICAgIFNwZWNpZnlpbmcgbmFtZXMgZm9yIGhvc3RzIGFuZCB0YXJnZXRzCisqIENvbmZpZ3VyZSBPcHRpb25zOjogICAgICAgICAgIFN1bW1hcnkgb2Ygb3B0aW9ucyBmb3IgY29uZmlndXJlCitAZW5kIG1lbnUKKworQGVuZCBpZmluZm8KKworQG5vZGUgU3VtbWFyeSwgU2FtcGxlIFNlc3Npb24sIFRvcCwgVG9wCitAdW5udW1iZXJlZCBTdW1tYXJ5IG9mIEB2YWx1ZXtHREJOfQorCitUaGUgcHVycG9zZSBvZiBhIGRlYnVnZ2VyIHN1Y2ggYXMgQHZhbHVle0dEQk59IGlzIHRvIGFsbG93IHlvdSB0byBzZWUgd2hhdCBpcworZ29pbmcgb24gYGBpbnNpZGUnJyBhbm90aGVyIHByb2dyYW0gd2hpbGUgaXQgZXhlY3V0ZXMtLS1vciB3aGF0IGFub3RoZXIKK3Byb2dyYW0gd2FzIGRvaW5nIGF0IHRoZSBtb21lbnQgaXQgY3Jhc2hlZC4KKworQHZhbHVle0dEQk59IGNhbiBkbyBmb3VyIG1haW4ga2luZHMgb2YgdGhpbmdzIChwbHVzIG90aGVyIHRoaW5ncyBpbiBzdXBwb3J0IG9mCit0aGVzZSkgdG8gaGVscCB5b3UgY2F0Y2ggYnVncyBpbiB0aGUgYWN0OgorCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorU3RhcnQgeW91ciBwcm9ncmFtLCBzcGVjaWZ5aW5nIGFueXRoaW5nIHRoYXQgbWlnaHQgYWZmZWN0IGl0cyBiZWhhdmlvci4KKworQGl0ZW0KK01ha2UgeW91ciBwcm9ncmFtIHN0b3Agb24gc3BlY2lmaWVkIGNvbmRpdGlvbnMuCisKK0BpdGVtCitFeGFtaW5lIHdoYXQgaGFzIGhhcHBlbmVkLCB3aGVuIHlvdXIgcHJvZ3JhbSBoYXMgc3RvcHBlZC4KKworQGl0ZW0KK0NoYW5nZSB0aGluZ3MgaW4geW91ciBwcm9ncmFtLCBzbyB5b3UgY2FuIGV4cGVyaW1lbnQgd2l0aCBjb3JyZWN0aW5nIHRoZQorZWZmZWN0cyBvZiBvbmUgYnVnIGFuZCBnbyBvbiB0byBsZWFybiBhYm91dCBhbm90aGVyLgorQGVuZCBpdGVtaXplCisKK0BpZmNsZWFyIENPTkxZCitZb3UgY2FuIHVzZSBAdmFsdWV7R0RCTn0gdG8gZGVidWcgcHJvZ3JhbXMgd3JpdHRlbiBpbiBDIG9yIEMrKy4KK0BjICJNT0QyIiB1c2VkIGFzIGEgIm1pc2NlbGxhbmVvdXMgbGFuZ3VhZ2VzIiBmbGFnIGhlcmUuCitAYyBUaGlzIGlzIGFjY2VwdGFibGUgd2hpbGUgdGhlcmUgaXMgbm8gcmVhbCBkb2MgZm9yIENoaWxsIGFuZCBQYXNjYWwuCitAaWZjbGVhciBNT0QyCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIEByZWZ7U3VwcG9ydCwsU3VwcG9ydGVkIGxhbmd1YWdlc30uCitAZW5kIGlmY2xlYXIKK0BpZnNldCBNT0QyCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIEByZWZ7QywsQyBhbmQgQysrfS4KKworU3VwcG9ydCBmb3IgTW9kdWxhLTIgYW5kIENoaWxsIGlzIHBhcnRpYWwuICBGb3IgaW5mb3JtYXRpb24gb24gTW9kdWxhLTIsCitzZWUgQHJlZntNb2R1bGEtMiwsTW9kdWxhLTJ9LiAgVGhlcmUgaXMgbm8gZnVydGhlciBkb2N1bWVudGF0aW9uIG9uIENoaWxsIHlldC4KKworRGVidWdnaW5nIFBhc2NhbCBwcm9ncmFtcyB3aGljaCB1c2Ugc2V0cywgc3VicmFuZ2VzLCBmaWxlIHZhcmlhYmxlcywgb3IgbmVzdGVkCitmdW5jdGlvbnMgZG9lcyBub3QgY3VycmVudGx5IHdvcmsuICBAdmFsdWV7R0RCTn0gZG9lcyBub3Qgc3VwcG9ydAorZW50ZXJpbmcgZXhwcmVzc2lvbnMsIHByaW50aW5nIHZhbHVlcywgb3Igc2ltaWxhciBmZWF0dXJlcyB1c2luZyBQYXNjYWwgc3ludGF4LgorQGVuZCBpZnNldAorCitAaWZzZXQgRk9SVFJBTgorQGNpbmRleCBGb3J0cmFuCitAdmFsdWV7R0RCTn0gY2FuIGJlIHVzZWQgdG8gZGVidWcgcHJvZ3JhbXMgd3JpdHRlbiBpbiBGb3J0cmFuLCBhbHRob3VnaAoraXQgZG9lcyBub3QgeWV0IHN1cHBvcnQgZW50ZXJpbmcgZXhwcmVzc2lvbnMsIHByaW50aW5nIHZhbHVlcywgb3IKK3NpbWlsYXIgZmVhdHVyZXMgdXNpbmcgRm9ydHJhbiBzeW50YXguICBJdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHJlZmVyIHRvCitzb21lIHZhcmlhYmxlcyB3aXRoIGEgdHJhaWxpbmcgdW5kZXJzY29yZS4KK0BlbmQgaWZzZXQKK0BlbmQgaWZjbGVhcgorCitAaWZzZXQgSFBQQQorVGhpcyB2ZXJzaW9uIG9mIHRoZSBtYW51YWwgZG9jdW1lbnRzIEhQIFdpbGRlYmVlc3QgKFdEQikgVmVyc2lvbiAwLjc1LAoraW1wbGVtZW50ZWQgb24gSFAgOTAwMCBzeXN0ZW1zIHJ1bm5pbmcgUmVsZWFzZSAxMC4yMCwgMTAuMzAsIG9yIDExLjAgb2YKK3RoZSBIUC1VWCBvcGVyYXRpbmcgc3lzdGVtLiAgSFAgV0RCIDAuNzUgY2FuIGJlIHVzZWQgdG8gZGVidWcgY29kZQorZ2VuZXJhdGVkIGJ5IHRoZSBIUCBBTlNJIEMgYW5kIEhQIEFOU0kgQysrIGNvbXBpbGVycyBhcyB3ZWxsIGFzIHRoZQorQHNje2dudX0gQyBhbmQgQysrIGNvbXBpbGVycy4gIEl0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGRlYnVnZ2luZyBvZgorRm9ydHJhbiwgTW9kdWxhLTIsIG9yIENoaWxsIHByb2dyYW1zLgorQGVuZCBpZnNldAorCitAbWVudQorKiBGcmVlIFNvZnR3YXJlOjogICAgICAgICAgICAgICBGcmVlbHkgcmVkaXN0cmlidXRhYmxlIHNvZnR3YXJlCisqIENvbnRyaWJ1dG9yczo6ICAgICAgICAgICAgICAgIENvbnRyaWJ1dG9ycyB0byBHREIKK0BlbmQgbWVudQorCitAbm9kZSBGcmVlIFNvZnR3YXJlLCBDb250cmlidXRvcnMsIFN1bW1hcnksIFN1bW1hcnkKK0B1bm51bWJlcmVkc2VjIEZyZWUgc29mdHdhcmUKKworQHZhbHVle0dEQk59IGlzIEBkZm57ZnJlZSBzb2Z0d2FyZX0sIHByb3RlY3RlZCBieSB0aGUgQHNje2dudX0gCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisoR1BMKS4gIFRoZSBHUEwgZ2l2ZXMgeW91IHRoZSBmcmVlZG9tIHRvIGNvcHkgb3IgYWRhcHQgYSBsaWNlbnNlZAorcHJvZ3JhbS0tLWJ1dCBldmVyeSBwZXJzb24gZ2V0dGluZyBhIGNvcHkgYWxzbyBnZXRzIHdpdGggaXQgdGhlCitmcmVlZG9tIHRvIG1vZGlmeSB0aGF0IGNvcHkgKHdoaWNoIG1lYW5zIHRoYXQgdGhleSBtdXN0IGdldCBhY2Nlc3MgdG8KK3RoZSBzb3VyY2UgY29kZSksIGFuZCB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGZ1cnRoZXIgY29waWVzLgorVHlwaWNhbCBzb2Z0d2FyZSBjb21wYW5pZXMgdXNlIGNvcHlyaWdodHMgdG8gbGltaXQgeW91ciBmcmVlZG9tczsgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdXNlcyB0aGUgR1BMIHRvIHByZXNlcnZlIHRoZXNlIGZyZWVkb21zLgorCitGdW5kYW1lbnRhbGx5LCB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBhIGxpY2Vuc2Ugd2hpY2ggc2F5cyB0aGF0Cit5b3UgaGF2ZSB0aGVzZSBmcmVlZG9tcyBhbmQgdGhhdCB5b3UgY2Fubm90IHRha2UgdGhlc2UgZnJlZWRvbXMgYXdheQorZnJvbSBhbnlvbmUgZWxzZS4KKworQG5vZGUgQ29udHJpYnV0b3JzLCAgLCBGcmVlIFNvZnR3YXJlLCBTdW1tYXJ5CitAdW5udW1iZXJlZHNlYyBDb250cmlidXRvcnMgdG8gR0RCCisKK1JpY2hhcmQgU3RhbGxtYW4gd2FzIHRoZSBvcmlnaW5hbCBhdXRob3Igb2YgR0RCLCBhbmQgb2YgbWFueSBvdGhlcgorQHNje2dudX0gcHJvZ3JhbXMuICBNYW55IG90aGVycyBoYXZlIGNvbnRyaWJ1dGVkIHRvIGl0cyBkZXZlbG9wbWVudC4KK1RoaXMgc2VjdGlvbiBhdHRlbXB0cyB0byBjcmVkaXQgbWFqb3IgY29udHJpYnV0b3JzLiAgT25lIG9mIHRoZSB2aXJ0dWVzCitvZiBmcmVlIHNvZnR3YXJlIGlzIHRoYXQgZXZlcnlvbmUgaXMgZnJlZSB0byBjb250cmlidXRlIHRvIGl0OyB3aXRoCityZWdyZXQsIHdlIGNhbm5vdCBhY3R1YWxseSBhY2tub3dsZWRnZSBldmVyeW9uZSBoZXJlLiAgVGhlIGZpbGUKK0BmaWxle0NoYW5nZUxvZ30gaW4gdGhlIEB2YWx1ZXtHREJOfSBkaXN0cmlidXRpb24gYXBwcm94aW1hdGVzIGEKK2Jsb3ctYnktYmxvdyBhY2NvdW50LgorCitDaGFuZ2VzIG11Y2ggcHJpb3IgdG8gdmVyc2lvbiAyLjAgYXJlIGxvc3QgaW4gdGhlIG1pc3RzIG9mIHRpbWUuCisKK0BxdW90YXRpb24KK0BlbXBoe1BsZWE6fSBBZGRpdGlvbnMgdG8gdGhpcyBzZWN0aW9uIGFyZSBwYXJ0aWN1bGFybHkgd2VsY29tZS4gIElmIHlvdQorb3IgeW91ciBmcmllbmRzIChvciBlbmVtaWVzLCB0byBiZSBldmVuaGFuZGVkKSBoYXZlIGJlZW4gdW5mYWlybHkKK29taXR0ZWQgZnJvbSB0aGlzIGxpc3QsIHdlIHdvdWxkIGxpa2UgdG8gYWRkIHlvdXIgbmFtZXMhCitAZW5kIHF1b3RhdGlvbgorCitTbyB0aGF0IHRoZXkgbWF5IG5vdCByZWdhcmQgdGhlaXIgbWFueSBsYWJvcnMgYXMgdGhhbmtsZXNzLCB3ZQorcGFydGljdWxhcmx5IHRoYW5rIHRob3NlIHdobyBzaGVwaGVyZGVkIEB2YWx1ZXtHREJOfSB0aHJvdWdoIG1ham9yCityZWxlYXNlczoKK0ppbSBCbGFuZHkgKHJlbGVhc2UgNC4xOCk7CitKYXNvbiBNb2xlbmRhIChyZWxlYXNlIDQuMTcpOworU3RhbiBTaGVicyAocmVsZWFzZSA0LjE0KTsKK0ZyZWQgRmlzaCAocmVsZWFzZXMgNC4xNiwgNC4xNSwgNC4xMywgNC4xMiwgNC4xMSwgNC4xMCwgYW5kIDQuOSk7CitTdHUgR3Jvc3NtYW4gYW5kIEpvaG4gR2lsbW9yZSAocmVsZWFzZXMgNC44LCA0LjcsIDQuNiwgNC41LCBhbmQgNC40KTsKK0pvaG4gR2lsbW9yZSAocmVsZWFzZXMgNC4zLCA0LjIsIDQuMSwgNC4wLCBhbmQgMy45KTsKK0ppbSBLaW5nZG9uIChyZWxlYXNlcyAzLjUsIDMuNCwgYW5kIDMuMyk7CithbmQgUmFuZHkgU21pdGggKHJlbGVhc2VzIDMuMiwgMy4xLCBhbmQgMy4wKS4KKworUmljaGFyZCBTdGFsbG1hbiwgYXNzaXN0ZWQgYXQgdmFyaW91cyB0aW1lcyBieSBQZXRlciBUZXJNYWF0LCBDaHJpcworSGFuc29uLCBhbmQgUmljaGFyZCBNbHluYXJpaywgaGFuZGxlZCByZWxlYXNlcyB0aHJvdWdoIDIuOC4KKworQGlmY2xlYXIgQ09OTFkKK01pY2hhZWwgVGllbWFubiBpcyB0aGUgYXV0aG9yIG9mIG1vc3Qgb2YgdGhlIEBzY3tnbnV9IEMrKyBzdXBwb3J0IGluIEdEQiwKK3dpdGggc2lnbmlmaWNhbnQgYWRkaXRpb25hbCBjb250cmlidXRpb25zIGZyb20gUGVyIEJvdGhuZXIuICBKYW1lcworQ2xhcmsgd3JvdGUgdGhlIEBzY3tnbnV9IEMrKyBkZW1hbmdsZXIuICBFYXJseSB3b3JrIG9uIEMrKyB3YXMgYnkgUGV0ZXIKK1Rlck1hYXQgKHdobyBhbHNvIGRpZCBtdWNoIGdlbmVyYWwgdXBkYXRlIHdvcmsgbGVhZGluZyB0byByZWxlYXNlIDMuMCkuCitAZW5kIGlmY2xlYXIKKworQHZhbHVle0dEQk59IDQgdXNlcyB0aGUgQkZEIHN1YnJvdXRpbmUgbGlicmFyeSB0byBleGFtaW5lIG11bHRpcGxlCitvYmplY3QtZmlsZSBmb3JtYXRzOyBCRkQgd2FzIGEgam9pbnQgcHJvamVjdCBvZiBEYXZpZCBWLgorSGVua2VsLVdhbGxhY2UsIFJpY2ggUGl4bGV5LCBTdGV2ZSBDaGFtYmVybGFpbiwgYW5kIEpvaG4gR2lsbW9yZS4KKworRGF2aWQgSm9obnNvbiB3cm90ZSB0aGUgb3JpZ2luYWwgQ09GRiBzdXBwb3J0OyBQYWNlIFdpbGxpc29uIGRpZAordGhlIG9yaWdpbmFsIHN1cHBvcnQgZm9yIGVuY2Fwc3VsYXRlZCBDT0ZGLgorCitCcmVudCBCZW5zb24gb2YgSGFycmlzIENvbXB1dGVyIFN5c3RlbXMgY29udHJpYnV0ZWQgRFdBUkYgMiBzdXBwb3J0LgorCitBZGFtIGRlIEJvb3IgYW5kIEJyYWRsZXkgRGF2aXMgY29udHJpYnV0ZWQgdGhlIElTSSBPcHRpbXVtIFYgc3VwcG9ydC4KK1BlciBCb3RobmVyLCBOb2JveXVraSBIaWtpY2hpLCBhbmQgQWxlc3NhbmRybyBGb3JpbiBjb250cmlidXRlZCBNSVBTCitzdXBwb3J0LgorSmVhbi1EYW5pZWwgRmVrZXRlIGNvbnRyaWJ1dGVkIFN1biAzODZpIHN1cHBvcnQuCitDaHJpcyBIYW5zb24gaW1wcm92ZWQgdGhlIEhQOTAwMCBzdXBwb3J0LgorTm9ib3l1a2kgSGlraWNoaSBhbmQgVG9tb3l1a2kgSGFzZWkgY29udHJpYnV0ZWQgU29ueS9OZXdzIE9TIDMgc3VwcG9ydC4KK0RhdmlkIEpvaG5zb24gY29udHJpYnV0ZWQgRW5jb3JlIFVtYXggc3VwcG9ydC4KK0p5cmtpIEt1b3BwYWxhIGNvbnRyaWJ1dGVkIEFsdG9zIDMwNjggc3VwcG9ydC4KK0plZmYgTGF3IGNvbnRyaWJ1dGVkIEhQIFBBIGFuZCBTT00gc3VwcG9ydC4KK0tlaXRoIFBhY2thcmQgY29udHJpYnV0ZWQgTlMzMksgc3VwcG9ydC4KK0RvdWcgUmFic29uIGNvbnRyaWJ1dGVkIEFjb3JuIFJpc2MgTWFjaGluZSBzdXBwb3J0LgorQm9iIFJ1c2sgY29udHJpYnV0ZWQgSGFycmlzIE5pZ2h0aGF3ayBDWC1VWCBzdXBwb3J0LgorQ2hyaXMgU21pdGggY29udHJpYnV0ZWQgQ29udmV4IHN1cHBvcnQgKGFuZCBGb3J0cmFuIGRlYnVnZ2luZykuCitKb25hdGhhbiBTdG9uZSBjb250cmlidXRlZCBQeXJhbWlkIHN1cHBvcnQuCitNaWNoYWVsIFRpZW1hbm4gY29udHJpYnV0ZWQgU1BBUkMgc3VwcG9ydC4KK1RpbSBUdWNrZXIgY29udHJpYnV0ZWQgc3VwcG9ydCBmb3IgdGhlIEdvdWxkIE5QMSBhbmQgR291bGQgUG93ZXJub2RlLgorUGFjZSBXaWxsaXNvbiBjb250cmlidXRlZCBJbnRlbCAzODYgc3VwcG9ydC4KK0pheSBWb3NidXJnaCBjb250cmlidXRlZCBTeW1tZXRyeSBzdXBwb3J0LgorCitBbmRyZWFzIFNjaHdhYiBjb250cmlidXRlZCBNNjhLIExpbnV4IHN1cHBvcnQuCisKK1JpY2ggU2NoYWVmZXIgYW5kIFBldGVyIFNjaGF1ZXIgaGVscGVkIHdpdGggc3VwcG9ydCBvZiBTdW5PUyBzaGFyZWQKK2xpYnJhcmllcy4KKworSmF5IEZlbmxhc29uIGFuZCBSb2xhbmQgTWNHcmF0aCBlbnN1cmVkIHRoYXQgQHZhbHVle0dEQk59IGFuZCBHQVMgYWdyZWUKK2Fib3V0IHNldmVyYWwgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXRzLgorCitQYXRyaWNrIER1dmFsLCBUZWQgR29sZHN0ZWluLCBWaWtyYW0gS29rYSBhbmQgR2xlbm4gRW5nZWwgaGVscGVkIGRldmVsb3AKK3JlbW90ZSBkZWJ1Z2dpbmcuICBJbnRlbCBDb3Jwb3JhdGlvbiwgV2luZCBSaXZlciBTeXN0ZW1zLCBBTUQsIGFuZCBBUk0KK2NvbnRyaWJ1dGVkIHJlbW90ZSBkZWJ1Z2dpbmcgbW9kdWxlcyBmb3IgdGhlIGk5NjAsIFZ4V29ya3MsIEEyOUsgVURJLAorYW5kIFJESSB0YXJnZXRzLCByZXNwZWN0aXZlbHkuCisKK0JyaWFuIEZveCBpcyB0aGUgYXV0aG9yIG9mIHRoZSByZWFkbGluZSBsaWJyYXJpZXMgcHJvdmlkaW5nCitjb21tYW5kLWxpbmUgZWRpdGluZyBhbmQgY29tbWFuZCBoaXN0b3J5LgorCitBbmRyZXcgQmVlcnMgb2YgU1VOWSBCdWZmYWxvIHdyb3RlIHRoZSBsYW5ndWFnZS1zd2l0Y2hpbmcgY29kZSwKK0BpZnNldCBNT0QyCit0aGUgTW9kdWxhLTIgc3VwcG9ydCwKK0BlbmQgaWZzZXQKK2FuZCBjb250cmlidXRlZCB0aGUgTGFuZ3VhZ2VzIGNoYXB0ZXIgb2YgdGhpcyBtYW51YWwuCisKK0ZyZWQgRmlzaCB3cm90ZSBtb3N0IG9mIHRoZSBzdXBwb3J0IGZvciBVbml4IFN5c3RlbSBWcjQuICAKK0BpZmNsZWFyIENPTkxZCitIZSBhbHNvIGVuaGFuY2VkIHRoZSBjb21tYW5kLWNvbXBsZXRpb24gc3VwcG9ydCB0byBjb3ZlciBDKysgb3ZlcmxvYWRlZAorc3ltYm9scy4KK0BlbmQgaWZjbGVhcgorCitIaXRhY2hpIEFtZXJpY2EsIEx0ZC4gc3BvbnNvcmVkIHRoZSBzdXBwb3J0IGZvciBIOC8zMDAsIEg4LzUwMCwgYW5kCitTdXBlci1IIHByb2Nlc3NvcnMuCisKK05FQyBzcG9uc29yZWQgdGhlIHN1cHBvcnQgZm9yIHRoZSB2ODUwLCBWcjR4eHgsIGFuZCBWcjV4eHggcHJvY2Vzc29ycy4KKworTWl0c3ViaXNoaSBzcG9uc29yZWQgdGhlIHN1cHBvcnQgZm9yIEQxMFYsIEQzMFYsIGFuZCBNMzJSL0QgcHJvY2Vzc29ycy4KKworVG9zaGliYSBzcG9uc29yZWQgdGhlIHN1cHBvcnQgZm9yIHRoZSBUWDM5IE1pcHMgcHJvY2Vzc29yLgorCitNYXRzdXNoaXRhIHNwb25zb3JlZCB0aGUgc3VwcG9ydCBmb3IgdGhlIE1OMTAyMDAgYW5kIE1OMTAzMDAgcHJvY2Vzc29ycy4KKworRnVqaXRzdSBzcG9uc29yZWQgdGhlIHN1cHBvcnQgZm9yIFNQQVJDbGl0ZSBhbmQgRlIzMCBwcm9jZXNzb3JzCisKK0t1bmcgSHN1LCBKZWZmIExhdywgYW5kIFJpY2sgU2xhZGtleSBhZGRlZCBzdXBwb3J0IGZvciBoYXJkd2FyZQord2F0Y2hwb2ludHMuCisKK01pY2hhZWwgU255ZGVyIGFkZGVkIHN1cHBvcnQgZm9yIHRyYWNlcG9pbnRzLgorCitTdHUgR3Jvc3NtYW4gd3JvdGUgZ2Ric2VydmVyLgorCitKaW0gS2luZ2RvbiwgUGV0ZXIgU2NoYXVlciwgSWFuIFRheWxvciwgYW5kIFN0dSBHcm9zc21hbiBtYWRlCituZWFybHkgaW5udW1lcmFibGUgYnVnIGZpeGVzIGFuZCBjbGVhbnVwcyB0aHJvdWdob3V0IEdEQi4KKworVGhlIGZvbGxvd2luZyBwZW9wbGUgYXQgdGhlIEhld2xldHQtUGFja2FyZCBDb21wYW55IGNvbnRyaWJ1dGVkCitzdXBwb3J0IGZvciB0aGUgUEEtUklTQyAyLjAgYXJjaGl0ZWN0dXJlLCBIUC1VWCAxMC4yMCwgMTAuMzAsIGFuZCAxMS4wCisobmFycm93IG1vZGUpLCBIUCdzIGltcGxlbWVudGF0aW9uIG9mIGtlcm5lbCB0aHJlYWRzLCBIUCdzIGFDKysKK2NvbXBpbGVyLCBhbmQgdGhlIHRlcm1pbmFsIHVzZXIgaW50ZXJmYWNlOiBCZW4gS3JlcHAsIFJpY2hhcmQgVGl0bGUsCitKb2huIEJpc2hvcCwgU3VzYW4gTWFjY2hpYSwgS2F0aHkgTWFubiwgU2F0aXNoIFBhaSwgSW5kaWEgUGF1bCwgU3RldmUKK1JlaHJhdWVyLCBhbmQgRWxlbmEgWmFubm9uaS4gIEtpbSBIYWFzZSBwcm92aWRlZCBIUC1zcGVjaWZpYworaW5mb3JtYXRpb24gaW4gdGhpcyBtYW51YWwuCisKK0N5Z251cyBTb2x1dGlvbnMgaGFzIHNwb25zb3JlZCBHREIgbWFpbnRlbmFuY2UgYW5kIG11Y2ggb2YgaXRzCitkZXZlbG9wbWVudCBzaW5jZSAxOTkxLiAgQ3lnbnVzIGVuZ2luZWVycyB3aG8gaGF2ZSB3b3JrZWQgb24gR0RCCitmdWxsdGltZSBpbmNsdWRlIE1hcmsgQWxleGFuZGVyLCBKaW0gQmxhbmR5LCBQZXIgQm90aG5lciwgRWRpdGggRXBzdGVpbiwKK0NocmlzIEZheWxvciwgRnJlZCBGaXNoLCBNYXJ0aW4gSHVudCwgSmltIEluZ2hhbSwgSm9obiBHaWxtb3JlLCBTdHUKK0dyb3NzbWFuLCBLdW5nIEhzdSwgSmltIEtpbmdkb24sIEpvaG4gTWV0emxlciwgRmVybmFuZG8gTmFzc2VyLCBHZW9mZnJleQorTm9lciwgRGF3biBQZXJjaGlrLCBSaWNoIFBpeGxleSwgWmRlbmVrIFJhZG91Y2gsIEtlaXRoIFNlaXR6LCBTdGFuCitTaGVicywgRGF2aWQgVGF5bG9yLCBhbmQgRWxlbmEgWmFubm9uaS4gIEluIGFkZGl0aW9uLCBEYXZlIEJyb2xsZXksIElhbgorQ2FybWljaGFlbCwgU3RldmUgQ2hhbWJlcmxhaW4sIE5pY2sgQ2xpZnRvbiwgSlQgQ29ua2xpbiwgU3RhbiBDb3gsIERKCitEZWxvcmllLCBVbHJpY2ggRHJlcHBlciwgRnJhbmsgRWlnbGVyLCBEb3VnIEV2YW5zLCBTZWFuIEZhZ2FuLCBEYXZpZAorSGVua2VsLVdhbGxhY2UsIFJpY2hhcmQgSGVuZGVyc29uLCBKZWZmIEhvbGNvbWIsIEplZmYgTGF3LCBKaW0gTGVta2UsCitUb20gTG9yZCwgQm9iIE1hbnNvbiwgTWljaGFlbCBNZWlzc25lciwgSmFzb24gTWVycmlsbCwgQ2F0aGVyaW5lIE1vb3JlLAorRHJldyBNb3NlbGV5LCBLZW4gUmFlYnVybiwgR2F2aW4gUm9taWctS29jaCwgUm9iIFNhdm95ZSwgSmFtaWUgU21pdGgsCitNaWtlIFN0dW1wLCBJYW4gVGF5bG9yLCBBbmdlbGEgVGhvbWFzLCBNaWNoYWVsIFRpZW1hbm4sIFRvbSBUcm9tZXksIFJvbgorVW5yYXUsIEppbSBXaWxzb24sIGFuZCBEYXZpZCBadWhuIGhhdmUgbWFkZSBjb250cmlidXRpb25zIGJvdGggbGFyZ2UKK2FuZCBzbWFsbC4KKworCitAaWZjbGVhciBCQVJFVEFSR0VUCitAbm9kZSBTYW1wbGUgU2Vzc2lvbiwgSW52b2NhdGlvbiwgU3VtbWFyeSwgVG9wCitAY2hhcHRlciBBIFNhbXBsZSBAdmFsdWV7R0RCTn0gU2Vzc2lvbgorCitZb3UgY2FuIHVzZSB0aGlzIG1hbnVhbCBhdCB5b3VyIGxlaXN1cmUgdG8gcmVhZCBhbGwgYWJvdXQgQHZhbHVle0dEQk59LgorSG93ZXZlciwgYSBoYW5kZnVsIG9mIGNvbW1hbmRzIGFyZSBlbm91Z2ggdG8gZ2V0IHN0YXJ0ZWQgdXNpbmcgdGhlCitkZWJ1Z2dlci4gIFRoaXMgY2hhcHRlciBpbGx1c3RyYXRlcyB0aG9zZSBjb21tYW5kcy4KKworQGlmdGV4CitJbiB0aGlzIHNhbXBsZSBzZXNzaW9uLCB3ZSBlbXBoYXNpemUgdXNlciBpbnB1dCBsaWtlIHRoaXM6IEBie2lucHV0fSwKK3RvIG1ha2UgaXQgZWFzaWVyIHRvIHBpY2sgb3V0IGZyb20gdGhlIHN1cnJvdW5kaW5nIG91dHB1dC4KK0BlbmQgaWZ0ZXgKKworQGMgRklYTUU6IHRoaXMgZXhhbXBsZSBtYXkgbm90IGJlIGFwcHJvcHJpYXRlIGZvciBzb21lIGNvbmZpZ3MsIHdoZXJlCitAYyBGSVhNRS4uLnByaW1hcnkgaW50ZXJlc3QgaXMgaW4gcmVtb3RlIHVzZS4KKworT25lIG9mIHRoZSBwcmVsaW1pbmFyeSB2ZXJzaW9ucyBvZiBAc2N7Z251fSBAY29kZXttNH0gKGEgZ2VuZXJpYyBtYWNybworcHJvY2Vzc29yKSBleGhpYml0cyB0aGUgZm9sbG93aW5nIGJ1Zzogc29tZXRpbWVzLCB3aGVuIHdlIGNoYW5nZSBpdHMKK3F1b3RlIHN0cmluZ3MgZnJvbSB0aGUgZGVmYXVsdCwgdGhlIGNvbW1hbmRzIHVzZWQgdG8gY2FwdHVyZSBvbmUgbWFjcm8KK2RlZmluaXRpb24gd2l0aGluIGFub3RoZXIgc3RvcCB3b3JraW5nLiAgSW4gdGhlIGZvbGxvd2luZyBzaG9ydCBAY29kZXttNH0KK3Nlc3Npb24sIHdlIGRlZmluZSBhIG1hY3JvIEBjb2Rle2Zvb30gd2hpY2ggZXhwYW5kcyB0byBAY29kZXswMDAwfTsgd2UKK3RoZW4gdXNlIHRoZSBAY29kZXttNH0gYnVpbHQtaW4gQGNvZGV7ZGVmbn0gdG8gZGVmaW5lIEBjb2Rle2Jhcn0gYXMgdGhlCitzYW1lIHRoaW5nLiAgSG93ZXZlciwgd2hlbiB3ZSBjaGFuZ2UgdGhlIG9wZW4gcXVvdGUgc3RyaW5nIHRvCitAY29kZXs8UVVPVEU+fSBhbmQgdGhlIGNsb3NlIHF1b3RlIHN0cmluZyB0byBAY29kZXs8VU5RVU9URT59LCB0aGUgc2FtZQorcHJvY2VkdXJlIGZhaWxzIHRvIGRlZmluZSBhIG5ldyBzeW5vbnltIEBjb2Rle2Jhen06CisKK0BzbWFsbGV4YW1wbGUKKyQgQGJ7Y2QgZ251L200fQorJCBAYnsuL200fQorQGJ7ZGVmaW5lKGZvbywwMDAwKX0KKworQGJ7Zm9vfQorMDAwMAorQGJ7ZGVmaW5lKGJhcixkZWZuKGBmb28nKSl9CisKK0Bie2Jhcn0KKzAwMDAKK0Bie2NoYW5nZXF1b3RlKDxRVU9URT4sPFVOUVVPVEU+KX0KKworQGJ7ZGVmaW5lKGJheixkZWZuKDxRVU9URT5mb288VU5RVU9URT4pKX0KK0Bie2Jhen0KK0Bie0MtZH0KK200OiBFbmQgb2YgaW5wdXQ6IDA6IGZhdGFsIGVycm9yOiBFT0YgaW4gc3RyaW5nCitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9pbmRlbnQKK0xldCB1cyB1c2UgQHZhbHVle0dEQk59IHRvIHRyeSB0byBzZWUgd2hhdCBpcyBnb2luZyBvbi4KKworQGlmY2xlYXIgSFBQQQorQHNtYWxsZXhhbXBsZQorJCBAYntAdmFsdWV7R0RCUH0gbTR9CitAYyBGSVhNRTogdGhpcyBmYWxzaWZpZXMgdGhlIGV4YWN0IHRleHQgcGxheWVkIG91dCwgdG8gcGVybWl0IHNtYWxsYm9vaworQGMgRklYTUUuLi4gZm9ybWF0IHRvIGNvbWUgb3V0IGJldHRlci4KK0B2YWx1ZXtHREJOfSBpcyBmcmVlIHNvZnR3YXJlIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gZGlzdHJpYnV0ZSBjb3BpZXMKKyBvZiBpdCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgInNob3cgY29weWluZyIgdG8gc2VlIAorIHRoZSBjb25kaXRpb25zLgorVGhlcmUgaXMgYWJzb2x1dGVseSBubyB3YXJyYW50eSBmb3IgQHZhbHVle0dEQk59OyB0eXBlICJzaG93IHdhcnJhbnR5IiAKKyBmb3IgZGV0YWlscy4KKworQHZhbHVle0dEQk59IEB2YWx1ZXtHREJWTn0sIENvcHlyaWdodCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLi4uCisoQHZhbHVle0dEQlB9KQorQGVuZCBzbWFsbGV4YW1wbGUKK0BlbmQgaWZjbGVhcgorQGlmc2V0IEhQUEEKK0BzbWFsbGV4YW1wbGUKKyQgQGJ7QHZhbHVle0dEQlB9IG00fQorV2lsZGViZWVzdCBpcyBmcmVlIHNvZnR3YXJlIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YKK2l0IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSAic2hvdyBjb3B5aW5nIiB0byBzZWUgdGhlIGNvbmRpdGlvbnMuCitUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGZvciBXaWxkZWJlZXN0OyB0eXBlICJzaG93IHdhcnJhbnR5IgorZm9yIGRldGFpbHMuCisKK0hld2xldHQtUGFja2FyZCBXaWxkZWJlZXN0IDAuNzUgKGJhc2VkIG9uIEdEQiA0LjE2KQorKGJ1aWx0IGZvciBQQS1SSVNDIDEuMSBvciAyLjAsIEhQLVVYIDEwLjIwKQorQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisoQHZhbHVle0dEQlB9KQorQGVuZCBzbWFsbGV4YW1wbGUKK0BlbmQgaWZzZXQKKworQG5vaW5kZW50CitAdmFsdWV7R0RCTn0gcmVhZHMgb25seSBlbm91Z2ggc3ltYm9sIGRhdGEgdG8ga25vdyB3aGVyZSB0byBmaW5kIHRoZQorcmVzdCB3aGVuIG5lZWRlZDsgYXMgYSByZXN1bHQsIHRoZSBmaXJzdCBwcm9tcHQgY29tZXMgdXAgdmVyeSBxdWlja2x5LgorV2Ugbm93IHRlbGwgQHZhbHVle0dEQk59IHRvIHVzZSBhIG5hcnJvd2VyIGRpc3BsYXkgd2lkdGggdGhhbiB1c3VhbCwgc28KK3RoYXQgZXhhbXBsZXMgZml0IGluIHRoaXMgbWFudWFsLgorCitAc21hbGxleGFtcGxlCisoQHZhbHVle0dEQlB9KSBAYntzZXQgd2lkdGggNzB9CitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9pbmRlbnQKK1dlIG5lZWQgdG8gc2VlIGhvdyB0aGUgQGNvZGV7bTR9IGJ1aWx0LWluIEBjb2Rle2NoYW5nZXF1b3RlfSB3b3Jrcy4KK0hhdmluZyBsb29rZWQgYXQgdGhlIHNvdXJjZSwgd2Uga25vdyB0aGUgcmVsZXZhbnQgc3Vicm91dGluZSBpcworQGNvZGV7bTRfY2hhbmdlcXVvdGV9LCBzbyB3ZSBzZXQgYSBicmVha3BvaW50IHRoZXJlIHdpdGggdGhlIEB2YWx1ZXtHREJOfQorQGNvZGV7YnJlYWt9IGNvbW1hbmQuCisKK0BzbWFsbGV4YW1wbGUKKyhAdmFsdWV7R0RCUH0pIEBie2JyZWFrIG00X2NoYW5nZXF1b3RlfQorQnJlYWtwb2ludCAxIGF0IDB4NjJmNDogZmlsZSBidWlsdGluLmMsIGxpbmUgODc5LgorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vaW5kZW50CitVc2luZyB0aGUgQGNvZGV7cnVufSBjb21tYW5kLCB3ZSBzdGFydCBAY29kZXttNH0gcnVubmluZyB1bmRlciBAdmFsdWV7R0RCTn0KK2NvbnRyb2w7IGFzIGxvbmcgYXMgY29udHJvbCBkb2VzIG5vdCByZWFjaCB0aGUgQGNvZGV7bTRfY2hhbmdlcXVvdGV9CitzdWJyb3V0aW5lLCB0aGUgcHJvZ3JhbSBydW5zIGFzIHVzdWFsOgorCitAc21hbGxleGFtcGxlCisoQHZhbHVle0dEQlB9KSBAYntydW59CitTdGFydGluZyBwcm9ncmFtOiAvd29yay9FZGl0b3JpYWwvZ2RiL2dudS9tNC9tNAorQGJ7ZGVmaW5lKGZvbywwMDAwKX0KKworQGJ7Zm9vfQorMDAwMAorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vaW5kZW50CitUbyB0cmlnZ2VyIHRoZSBicmVha3BvaW50LCB3ZSBjYWxsIEBjb2Rle2NoYW5nZXF1b3RlfS4gIEB2YWx1ZXtHREJOfQorc3VzcGVuZHMgZXhlY3V0aW9uIG9mIEBjb2Rle200fSwgZGlzcGxheWluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKK2NvbnRleHQgd2hlcmUgaXQgc3RvcHMuCisKK0BzbWFsbGV4YW1wbGUKK0Bie2NoYW5nZXF1b3RlKDxRVU9URT4sPFVOUVVPVEU+KX0KKworQnJlYWtwb2ludCAxLCBtNF9jaGFuZ2VxdW90ZSAoYXJnYz0zLCBhcmd2PTB4MzNjNzApIAorICAgIGF0IGJ1aWx0aW4uYzo4NzkKKzg3OSAgICAgICAgIGlmIChiYWRfYXJnYyhUT0tFTl9EQVRBX1RFWFQoYXJndlswXSksYXJnYywxLDMpKQorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vaW5kZW50CitOb3cgd2UgdXNlIHRoZSBjb21tYW5kIEBjb2Rle259IChAY29kZXtuZXh0fSkgdG8gYWR2YW5jZSBleGVjdXRpb24gdG8KK3RoZSBuZXh0IGxpbmUgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisKK0BzbWFsbGV4YW1wbGUKKyhAdmFsdWV7R0RCUH0pIEBie259Cis4ODIgICAgICAgICBzZXRfcXVvdGVzKChhcmdjID49IDIpID8gVE9LRU5fREFUQV9URVhUKGFyZ3ZbMV0pXAorIDogbmlsLAorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vaW5kZW50CitAY29kZXtzZXRfcXVvdGVzfSBsb29rcyBsaWtlIGEgcHJvbWlzaW5nIHN1YnJvdXRpbmUuICBXZSBjYW4gZ28gaW50byBpdAorYnkgdXNpbmcgdGhlIGNvbW1hbmQgQGNvZGV7c30gKEBjb2Rle3N0ZXB9KSBpbnN0ZWFkIG9mIEBjb2Rle25leHR9LgorQGNvZGV7c3RlcH0gZ29lcyB0byB0aGUgbmV4dCBsaW5lIHRvIGJlIGV4ZWN1dGVkIGluIEBlbXBoe2FueX0KK3N1YnJvdXRpbmUsIHNvIGl0IHN0ZXBzIGludG8gQGNvZGV7c2V0X3F1b3Rlc30uCisKK0BzbWFsbGV4YW1wbGUKKyhAdmFsdWV7R0RCUH0pIEBie3N9CitzZXRfcXVvdGVzIChscT0weDM0Yzc4ICI8UVVPVEU+IiwgcnE9MHgzNGM4OCAiPFVOUVVPVEU+IikKKyAgICBhdCBpbnB1dC5jOjUzMAorNTMwICAgICAgICAgaWYgKGxxdW90ZSAhPSBkZWZfbHF1b3RlKQorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vaW5kZW50CitUaGUgZGlzcGxheSB0aGF0IHNob3dzIHRoZSBzdWJyb3V0aW5lIHdoZXJlIEBjb2Rle200fSBpcyBub3cKK3N1c3BlbmRlZCAoYW5kIGl0cyBhcmd1bWVudHMpIGlzIGNhbGxlZCBhIHN0YWNrIGZyYW1lIGRpc3BsYXkuICBJdAorc2hvd3MgYSBzdW1tYXJ5IG9mIHRoZSBzdGFjay4gIFdlIGNhbiB1c2UgdGhlIEBjb2Rle2JhY2t0cmFjZX0KK2NvbW1hbmQgKHdoaWNoIGNhbiBhbHNvIGJlIHNwZWxsZWQgQGNvZGV7YnR9KSwgdG8gc2VlIHdoZXJlIHdlIGFyZQoraW4gdGhlIHN0YWNrIGFzIGEgd2hvbGU6IHRoZSBAY29kZXtiYWNrdHJhY2V9IGNvbW1hbmQgZGlzcGxheXMgYQorc3RhY2sgZnJhbWUgZm9yIGVhY2ggYWN0aXZlIHN1YnJvdXRpbmUuCisKK0BzbWFsbGV4YW1wbGUKKyhAdmFsdWV7R0RCUH0pIEBie2J0fQorIzAgIHNldF9xdW90ZXMgKGxxPTB4MzRjNzggIjxRVU9URT4iLCBycT0weDM0Yzg4ICI8VU5RVU9URT4iKQorICAgIGF0IGlucHV0LmM6NTMwCisjMSAgMHg2MzQ0IGluIG00X2NoYW5nZXF1b3RlIChhcmdjPTMsIGFyZ3Y9MHgzM2M3MCkgCisgICAgYXQgYnVpbHRpbi5jOjg4MgorIzIgIDB4ODE3NCBpbiBleHBhbmRfbWFjcm8gKHN5bT0weDMzMzIwKSBhdCBtYWNyby5jOjI0MgorIzMgIDB4N2E4OCBpbiBleHBhbmRfdG9rZW4gKG9icz0weDAsIHQ9MjA5Njk2LCB0ZD0weGY3ZmZmYTMwKQorICAgIGF0IG1hY3JvLmM6NzEKKyM0ICAweDc5ZGMgaW4gZXhwYW5kX2lucHV0ICgpIGF0IG1hY3JvLmM6NDAKKyM1ICAweDI5MzAgaW4gbWFpbiAoYXJnYz0wLCBhcmd2PTB4ZjdmZmZiMjApIGF0IG00LmM6MTk1CitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9pbmRlbnQKK1dlIHN0ZXAgdGhyb3VnaCBhIGZldyBtb3JlIGxpbmVzIHRvIHNlZSB3aGF0IGhhcHBlbnMuICBUaGUgZmlyc3QgdHdvCit0aW1lcywgd2UgY2FuIHVzZSBAc2FtcHtzfTsgdGhlIG5leHQgdHdvIHRpbWVzIHdlIHVzZSBAY29kZXtufSB0byBhdm9pZAorZmFsbGluZyBpbnRvIHRoZSBAY29kZXt4c3RyZHVwfSBzdWJyb3V0aW5lLgorCitAc21hbGxleGFtcGxlCisoQHZhbHVle0dEQlB9KSBAYntzfQorMHgzYjVjICA1MzIgICAgICAgICBpZiAocnF1b3RlICE9IGRlZl9ycXVvdGUpCisoQHZhbHVle0dEQlB9KSBAYntzfQorMHgzYjgwICA1MzUgICAgICAgICBscXVvdGUgPSAobHEgPT0gbmlsIHx8ICpscSA9PSAnXDAnKSA/ICBcCitkZWZfbHF1b3RlIDogeHN0cmR1cChscSk7CisoQHZhbHVle0dEQlB9KSBAYntufQorNTM2ICAgICAgICAgcnF1b3RlID0gKHJxID09IG5pbCB8fCAqcnEgPT0gJ1wwJykgPyBkZWZfcnF1b3RlXAorIDogeHN0cmR1cChycSk7CisoQHZhbHVle0dEQlB9KSBAYntufQorNTM4ICAgICAgICAgbGVuX2xxdW90ZSA9IHN0cmxlbihycXVvdGUpOworQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vaW5kZW50CitUaGUgbGFzdCBsaW5lIGRpc3BsYXllZCBsb29rcyBhIGxpdHRsZSBvZGQ7IHdlIGNhbiBleGFtaW5lIHRoZSB2YXJpYWJsZXMKK0Bjb2Rle2xxdW90ZX0gYW5kIEBjb2Rle3JxdW90ZX0gdG8gc2VlIGlmIHRoZXkgYXJlIGluIGZhY3QgdGhlIG5ldyBsZWZ0CithbmQgcmlnaHQgcXVvdGVzIHdlIHNwZWNpZmllZC4gIFdlIHVzZSB0aGUgY29tbWFuZCBAY29kZXtwfQorKEBjb2Rle3ByaW50fSkgdG8gc2VlIHRoZWlyIHZhbHVlcy4KKworQHNtYWxsZXhhbXBsZQorKEB2YWx1ZXtHREJQfSkgQGJ7cCBscXVvdGV9CiskMSA9IDB4MzVkNDAgIjxRVU9URT4iCisoQHZhbHVle0dEQlB9KSBAYntwIHJxdW90ZX0KKyQyID0gMHgzNWQ1MCAiPFVOUVVPVEU+IgorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vaW5kZW50CitAY29kZXtscXVvdGV9IGFuZCBAY29kZXtycXVvdGV9IGFyZSBpbmRlZWQgdGhlIG5ldyBsZWZ0IGFuZCByaWdodCBxdW90ZXMuCitUbyBsb29rIGF0IHNvbWUgY29udGV4dCwgd2UgY2FuIGRpc3BsYXkgdGVuIGxpbmVzIG9mIHNvdXJjZQorc3Vycm91bmRpbmcgdGhlIGN1cnJlbnQgbGluZSB3aXRoIHRoZSBAY29kZXtsfSAoQGNvZGV7bGlzdH0pIGNvbW1hbmQuCisKK0BzbWFsbGV4YW1wbGUKKyhAdmFsdWV7R0RCUH0pIEBie2x9Cis1MzMgICAgICAgICAgICAgeGZyZWUocnF1b3RlKTsKKzUzNAorNTM1ICAgICAgICAgbHF1b3RlID0gKGxxID09IG5pbCB8fCAqbHEgPT0gJ1wwJykgPyBkZWZfbHF1b3RlXAorIDogeHN0cmR1cCAobHEpOworNTM2ICAgICAgICAgcnF1b3RlID0gKHJxID09IG5pbCB8fCAqcnEgPT0gJ1wwJykgPyBkZWZfcnF1b3RlXAorIDogeHN0cmR1cCAocnEpOworNTM3Cis1MzggICAgICAgICBsZW5fbHF1b3RlID0gc3RybGVuKHJxdW90ZSk7Cis1MzkgICAgICAgICBsZW5fcnF1b3RlID0gc3RybGVuKGxxdW90ZSk7Cis1NDAgICAgIEB9Cis1NDEKKzU0MiAgICAgdm9pZAorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vaW5kZW50CitMZXQgdXMgc3RlcCBwYXN0IHRoZSB0d28gbGluZXMgdGhhdCBzZXQgQGNvZGV7bGVuX2xxdW90ZX0gYW5kCitAY29kZXtsZW5fcnF1b3RlfSwgYW5kIHRoZW4gZXhhbWluZSB0aGUgdmFsdWVzIG9mIHRob3NlIHZhcmlhYmxlcy4KKworQHNtYWxsZXhhbXBsZQorKEB2YWx1ZXtHREJQfSkgQGJ7bn0KKzUzOSAgICAgICAgIGxlbl9ycXVvdGUgPSBzdHJsZW4obHF1b3RlKTsKKyhAdmFsdWV7R0RCUH0pIEBie259Cis1NDAgICAgIEB9CisoQHZhbHVle0dEQlB9KSBAYntwIGxlbl9scXVvdGV9CiskMyA9IDkKKyhAdmFsdWV7R0RCUH0pIEBie3AgbGVuX3JxdW90ZX0KKyQ0ID0gNworQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vaW5kZW50CitUaGF0IGNlcnRhaW5seSBsb29rcyB3cm9uZywgYXNzdW1pbmcgQGNvZGV7bGVuX2xxdW90ZX0gYW5kCitAY29kZXtsZW5fcnF1b3RlfSBhcmUgbWVhbnQgdG8gYmUgdGhlIGxlbmd0aHMgb2YgQGNvZGV7bHF1b3RlfSBhbmQKK0Bjb2Rle3JxdW90ZX0gcmVzcGVjdGl2ZWx5LiAgV2UgY2FuIHNldCB0aGVtIHRvIGJldHRlciB2YWx1ZXMgdXNpbmcKK3RoZSBAY29kZXtwfSBjb21tYW5kLCBzaW5jZSBpdCBjYW4gcHJpbnQgdGhlIHZhbHVlIG9mCithbnkgZXhwcmVzc2lvbi0tLWFuZCB0aGF0IGV4cHJlc3Npb24gY2FuIGluY2x1ZGUgc3Vicm91dGluZSBjYWxscyBhbmQKK2Fzc2lnbm1lbnRzLgorCitAc21hbGxleGFtcGxlCisoQHZhbHVle0dEQlB9KSBAYntwIGxlbl9scXVvdGU9c3RybGVuKGxxdW90ZSl9CiskNSA9IDcKKyhAdmFsdWV7R0RCUH0pIEBie3AgbGVuX3JxdW90ZT1zdHJsZW4ocnF1b3RlKX0KKyQ2ID0gOQorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vaW5kZW50CitJcyB0aGF0IGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0gb2YgdXNpbmcgdGhlIG5ldyBxdW90ZXMgd2l0aCB0aGUKK0Bjb2Rle200fSBidWlsdC1pbiBAY29kZXtkZWZufT8gIFdlIGNhbiBhbGxvdyBAY29kZXttNH0gdG8gY29udGludWUKK2V4ZWN1dGluZyB3aXRoIHRoZSBAY29kZXtjfSAoQGNvZGV7Y29udGludWV9KSBjb21tYW5kLCBhbmQgdGhlbiB0cnkgdGhlCitleGFtcGxlIHRoYXQgY2F1c2VkIHRyb3VibGUgaW5pdGlhbGx5OgorCitAc21hbGxleGFtcGxlCisoQHZhbHVle0dEQlB9KSBAYntjfQorQ29udGludWluZy4KKworQGJ7ZGVmaW5lKGJheixkZWZuKDxRVU9URT5mb288VU5RVU9URT4pKX0KKworYmF6CiswMDAwCitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9pbmRlbnQKK1N1Y2Nlc3MhICBUaGUgbmV3IHF1b3RlcyBub3cgd29yayBqdXN0IGFzIHdlbGwgYXMgdGhlIGRlZmF1bHQgb25lcy4gIFRoZQorcHJvYmxlbSBzZWVtcyB0byBoYXZlIGJlZW4ganVzdCB0aGUgdHdvIHR5cG9zIGRlZmluaW5nIHRoZSB3cm9uZworbGVuZ3Rocy4gIFdlIGFsbG93IEBjb2Rle200fSBleGl0IGJ5IGdpdmluZyBpdCBhbiBFT0YgYXMgaW5wdXQ6CisKK0BzbWFsbGV4YW1wbGUKK0Bie0MtZH0KK1Byb2dyYW0gZXhpdGVkIG5vcm1hbGx5LgorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vaW5kZW50CitUaGUgbWVzc2FnZSBAc2FtcHtQcm9ncmFtIGV4aXRlZCBub3JtYWxseS59IGlzIGZyb20gQHZhbHVle0dEQk59OyBpdAoraW5kaWNhdGVzIEBjb2Rle200fSBoYXMgZmluaXNoZWQgZXhlY3V0aW5nLiAgV2UgY2FuIGVuZCBvdXIgQHZhbHVle0dEQk59CitzZXNzaW9uIHdpdGggdGhlIEB2YWx1ZXtHREJOfSBAY29kZXtxdWl0fSBjb21tYW5kLgorCitAc21hbGxleGFtcGxlCisoQHZhbHVle0dEQlB9KSBAYntxdWl0fQorQGVuZCBzbWFsbGV4YW1wbGUKK0BlbmQgaWZjbGVhcgorCitAbm9kZSBJbnZvY2F0aW9uLCBDb21tYW5kcywgU2FtcGxlIFNlc3Npb24sIFRvcAorQGNoYXB0ZXIgR2V0dGluZyBJbiBhbmQgT3V0IG9mIEB2YWx1ZXtHREJOfQorCitUaGlzIGNoYXB0ZXIgZGlzY3Vzc2VzIGhvdyB0byBzdGFydCBAdmFsdWV7R0RCTn0sIGFuZCBob3cgdG8gZ2V0IG91dCBvZiBpdC4KK1RoZSBlc3NlbnRpYWxzIGFyZTogCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbSAKK3R5cGUgQHNhbXB7QHZhbHVle0dEQlB9fSB0byBzdGFydCBHREIuCitAaXRlbSAKK3R5cGUgQGtiZHtxdWl0fSBvciBAa2Jke0MtZH0gdG8gZXhpdC4KK0BlbmQgaXRlbWl6ZQorCitAbWVudQorKiBJbnZva2luZyBHREI6OiAgICAgICAgICAgICAgICBIb3cgdG8gc3RhcnQgQHZhbHVle0dEQk59CisqIFF1aXR0aW5nIEdEQjo6ICAgICAgICAgICAgICAgIEhvdyB0byBxdWl0IEB2YWx1ZXtHREJOfQorKiBTaGVsbCBDb21tYW5kczo6ICAgICAgICAgICAgICBIb3cgdG8gdXNlIHNoZWxsIGNvbW1hbmRzIGluc2lkZSBAdmFsdWV7R0RCTn0KK0BlbmQgbWVudQorCitAbm9kZSBJbnZva2luZyBHREIsIFF1aXR0aW5nIEdEQiwgSW52b2NhdGlvbiwgSW52b2NhdGlvbgorQHNlY3Rpb24gSW52b2tpbmcgQHZhbHVle0dEQk59CisKK0BpZnNldCBIOEVYQ0xVU0lWRQorRm9yIGRldGFpbHMgb24gc3RhcnRpbmcgdXAgQHZhbHVle0dEQlB9IGFzIGEKK3JlbW90ZSBkZWJ1Z2dlciBhdHRhY2hlZCB0byBhIEhpdGFjaGkgbWljcm9wcm9jZXNzb3IsIHNlZSBAcmVme0hpdGFjaGkKK1JlbW90ZSwsQHZhbHVle0dEQk59IGFuZCBIaXRhY2hpIE1pY3JvcHJvY2Vzc29yc30uCitAZW5kIGlmc2V0CisKK0ludm9rZSBAdmFsdWV7R0RCTn0gYnkgcnVubmluZyB0aGUgcHJvZ3JhbSBAY29kZXtAdmFsdWV7R0RCUH19LiAgT25jZSBzdGFydGVkLAorQHZhbHVle0dEQk59IHJlYWRzIGNvbW1hbmRzIGZyb20gdGhlIHRlcm1pbmFsIHVudGlsIHlvdSB0ZWxsIGl0IHRvIGV4aXQuCisKK1lvdSBjYW4gYWxzbyBydW4gQGNvZGV7QHZhbHVle0dEQlB9fSB3aXRoIGEgdmFyaWV0eSBvZiBhcmd1bWVudHMgYW5kIG9wdGlvbnMsCit0byBzcGVjaWZ5IG1vcmUgb2YgeW91ciBkZWJ1Z2dpbmcgZW52aXJvbm1lbnQgYXQgdGhlIG91dHNldC4KKworQGlmc2V0IEdFTkVSSUMKK1RoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBkZXNjcmliZWQgaGVyZSBhcmUgZGVzaWduZWQKK3RvIGNvdmVyIGEgdmFyaWV0eSBvZiBzaXR1YXRpb25zOyBpbiBzb21lIGVudmlyb25tZW50cywgc29tZSBvZiB0aGVzZQorb3B0aW9ucyBtYXkgZWZmZWN0aXZlbHkgYmUgdW5hdmFpbGFibGUuICAKK0BlbmQgaWZzZXQKKworVGhlIG1vc3QgdXN1YWwgd2F5IHRvIHN0YXJ0IEB2YWx1ZXtHREJOfSBpcyB3aXRoIG9uZSBhcmd1bWVudCwKK3NwZWNpZnlpbmcgYW4gZXhlY3V0YWJsZSBwcm9ncmFtOgorCitAZXhhbXBsZQorQHZhbHVle0dEQlB9IEB2YXJ7cHJvZ3JhbX0KK0BlbmQgZXhhbXBsZQorCitAaWZjbGVhciBCQVJFVEFSR0VUCitAbm9pbmRlbnQKK1lvdSBjYW4gYWxzbyBzdGFydCB3aXRoIGJvdGggYW4gZXhlY3V0YWJsZSBwcm9ncmFtIGFuZCBhIGNvcmUgZmlsZQorc3BlY2lmaWVkOgorCitAZXhhbXBsZQorQHZhbHVle0dEQlB9IEB2YXJ7cHJvZ3JhbX0gQHZhcntjb3JlfQorQGVuZCBleGFtcGxlCisKK1lvdSBjYW4sIGluc3RlYWQsIHNwZWNpZnkgYSBwcm9jZXNzIElEIGFzIGEgc2Vjb25kIGFyZ3VtZW50LCBpZiB5b3Ugd2FudAordG8gZGVidWcgYSBydW5uaW5nIHByb2Nlc3M6CisKK0BleGFtcGxlCitAdmFsdWV7R0RCUH0gQHZhcntwcm9ncmFtfSAxMjM0CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50Cit3b3VsZCBhdHRhY2ggQHZhbHVle0dEQk59IHRvIHByb2Nlc3MgQGNvZGV7MTIzNH0gKHVubGVzcyB5b3UgYWxzbyBoYXZlIGEgZmlsZQorbmFtZWQgQGZpbGV7MTIzNH07IEB2YWx1ZXtHREJOfSBkb2VzIGNoZWNrIGZvciBhIGNvcmUgZmlsZSBmaXJzdCkuCisKK0BpZmNsZWFyIEhQUEEKK1Rha2luZyBhZHZhbnRhZ2Ugb2YgdGhlIHNlY29uZCBjb21tYW5kLWxpbmUgYXJndW1lbnQgcmVxdWlyZXMgYSBmYWlybHkKK2NvbXBsZXRlIG9wZXJhdGluZyBzeXN0ZW07IHdoZW4geW91IHVzZSBAdmFsdWV7R0RCTn0gYXMgYSByZW1vdGUgZGVidWdnZXIKK2F0dGFjaGVkIHRvIGEgYmFyZSBib2FyZCwgdGhlcmUgbWF5IG5vdCBiZSBhbnkgbm90aW9uIG9mIGBgcHJvY2VzcycnLAorYW5kIHRoZXJlIGlzIG9mdGVuIG5vIHdheSB0byBnZXQgYSBjb3JlIGR1bXAuCitAZW5kIGlmY2xlYXIKK0BlbmQgaWZjbGVhcgorCitZb3UgY2FuIHJ1biBAY29kZXtnZGJ9IHdpdGhvdXQgcHJpbnRpbmcgdGhlIGZyb250IG1hdGVyaWFsLCB3aGljaCBkZXNjcmliZXMKK0B2YWx1ZXtHREJOfSdzIG5vbi13YXJyYW50eSwgYnkgc3BlY2lmeWluZyBAY29kZXstc2lsZW50fToKKworQHNtYWxsZXhhbXBsZQorQHZhbHVle0dEQlB9IC1zaWxlbnQKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2luZGVudAorWW91IGNhbiBmdXJ0aGVyIGNvbnRyb2wgaG93IEB2YWx1ZXtHREJOfSBzdGFydHMgdXAgYnkgdXNpbmcgY29tbWFuZC1saW5lCitvcHRpb25zLiAgQHZhbHVle0dEQk59IGl0c2VsZiBjYW4gcmVtaW5kIHlvdSBvZiB0aGUgb3B0aW9ucyBhdmFpbGFibGUuCisKK0Bub2luZGVudAorVHlwZQorCitAZXhhbXBsZQorQHZhbHVle0dEQlB9IC1oZWxwCitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50Cit0byBkaXNwbGF5IGFsbCBhdmFpbGFibGUgb3B0aW9ucyBhbmQgYnJpZWZseSBkZXNjcmliZSB0aGVpciB1c2UKKyhAc2FtcHtAdmFsdWV7R0RCUH0gLWh9IGlzIGEgc2hvcnRlciBlcXVpdmFsZW50KS4KKworQWxsIG9wdGlvbnMgYW5kIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgeW91IGdpdmUgYXJlIHByb2Nlc3NlZAoraW4gc2VxdWVudGlhbCBvcmRlci4gIFRoZSBvcmRlciBtYWtlcyBhIGRpZmZlcmVuY2Ugd2hlbiB0aGUKK0BzYW1wey14fSBvcHRpb24gaXMgdXNlZC4KKworCitAbWVudQorQGlmY2xlYXIgR0VORVJJQworQGlmc2V0IFJFTU9URVNUVUIKKyogUmVtb3RlIFNlcmlhbDo6ICAgICAgICAgICAgICAgQHZhbHVle0dEQk59IHJlbW90ZSBzZXJpYWwgcHJvdG9jb2wKK0BlbmQgaWZzZXQKK0BpZnNldCBJOTYwCisqIGk5NjAtTmluZHkgUmVtb3RlOjoJCUB2YWx1ZXtHREJOfSB3aXRoIGEgcmVtb3RlIGk5NjAgKE5pbmR5KQorQGVuZCBpZnNldAorQGlmc2V0IEFNRDI5SworKiBVREkyOUsgUmVtb3RlOjogICAgICAgICAgICAgICBUaGUgVURJIHByb3RvY29sIGZvciBBTUQyOUsKKyogRUIyOUsgUmVtb3RlOjoJCVRoZSBFQk1PTiBwcm90b2NvbCBmb3IgQU1EMjlLCitAZW5kIGlmc2V0CitAaWZzZXQgVlhXT1JLUworKiBWeFdvcmtzIFJlbW90ZTo6CQlAdmFsdWV7R0RCTn0gYW5kIFZ4V29ya3MKK0BlbmQgaWZzZXQKK0BpZnNldCBTVDIwMDAKKyogU1QyMDAwIFJlbW90ZTo6ICAgICAgICAgICAgICAgQHZhbHVle0dEQk59IHdpdGggYSBUYW5kZW0gU1QyMDAwCitAZW5kIGlmc2V0CitAaWZzZXQgSDgKKyogSGl0YWNoaSBSZW1vdGU6OiAgICAgICAgICAgICAgQHZhbHVle0dEQk59IGFuZCBIaXRhY2hpIE1pY3JvcHJvY2Vzc29ycworQGVuZCBpZnNldAorQGlmc2V0IE1JUFMKKyogTUlQUyBSZW1vdGU6OgkJCUB2YWx1ZXtHREJOfSBhbmQgTUlQUyBib2FyZHMKK0BlbmQgaWZzZXQKK0BpZnNldCBTUEFSQ0xFVAorKiBTcGFyY2xldCBSZW1vdGU6OiAgICAgICAgICAgICBAdmFsdWV7R0RCTn0gYW5kIFNwYXJjbGV0IGJvYXJkcworQGVuZCBpZnNldAorQGlmc2V0IFNJTVMKKyogU2ltdWxhdG9yOjogICAgICAgICAgICAgICAgICAgU2ltdWxhdGVkIENQVSB0YXJnZXQKK0BlbmQgaWZzZXQKK0BlbmQgaWZjbGVhcgorQGMgcmVtbmFudCBtYWtlaW5mbyBidWcgcmVxdWlyZXMgdGhpcyBibGFuayBsaW5lIGFmdGVyICp0d28qIGVuZC1pZmJsYWhzOgorCisqIEZpbGUgT3B0aW9uczo6ICAgICAgICAgICAgICAgIENob29zaW5nIGZpbGVzCisqIE1vZGUgT3B0aW9uczo6ICAgICAgICAgICAgICAgIENob29zaW5nIG1vZGVzCitAZW5kIG1lbnUKKworQGlmY2xlYXIgR0VORVJJQworQGlmY2xlYXIgSFBQQQorQGluY2x1ZGUgcmVtb3RlLnRleGkKK0BlbmQgaWZjbGVhcgorQGVuZCBpZmNsZWFyCisKK0Bub2RlIEZpbGUgT3B0aW9ucworQHN1YnNlY3Rpb24gQ2hvb3NpbmcgZmlsZXMKKworQGlmY2xlYXIgQkFSRVRBUkdFVAorV2hlbiBAdmFsdWV7R0RCTn0gc3RhcnRzLCBpdCByZWFkcyBhbnkgYXJndW1lbnRzIG90aGVyIHRoYW4gb3B0aW9ucyBhcworc3BlY2lmeWluZyBhbiBleGVjdXRhYmxlIGZpbGUgYW5kIGNvcmUgZmlsZSAob3IgcHJvY2VzcyBJRCkuICBUaGlzIGlzCit0aGUgc2FtZSBhcyBpZiB0aGUgYXJndW1lbnRzIHdlcmUgc3BlY2lmaWVkIGJ5IHRoZSBAc2FtcHstc2V9IGFuZAorQHNhbXB7LWN9IG9wdGlvbnMgcmVzcGVjdGl2ZWx5LiAgKEB2YWx1ZXtHREJOfSByZWFkcyB0aGUgZmlyc3QgYXJndW1lbnQKK3RoYXQgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIG9wdGlvbiBmbGFnIGFzIGVxdWl2YWxlbnQgdG8gdGhlCitAc2FtcHstc2V9IG9wdGlvbiBmb2xsb3dlZCBieSB0aGF0IGFyZ3VtZW50OyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudAordGhhdCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgb3B0aW9uIGZsYWcsIGlmIGFueSwgYXMgZXF1aXZhbGVudCB0bwordGhlIEBzYW1wey1jfSBvcHRpb24gZm9sbG93ZWQgYnkgdGhhdCBhcmd1bWVudC4pCitAZW5kIGlmY2xlYXIKK0BpZnNldCBCQVJFVEFSR0VUCitXaGVuIEB2YWx1ZXtHREJOfSBzdGFydHMsIGl0IHJlYWRzIGFueSBhcmd1bWVudCBvdGhlciB0aGFuIG9wdGlvbnMgYXMKK3NwZWNpZnlpbmcgYW4gZXhlY3V0YWJsZSBmaWxlLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyBpZiB0aGUgYXJndW1lbnQgd2FzCitzcGVjaWZpZWQgYnkgdGhlIEBzYW1wey1zZX0gb3B0aW9uLgorQGVuZCBpZnNldAorCitNYW55IG9wdGlvbnMgaGF2ZSBib3RoIGxvbmcgYW5kIHNob3J0IGZvcm1zOyBib3RoIGFyZSBzaG93biBpbiB0aGUKK2ZvbGxvd2luZyBsaXN0LiAgQHZhbHVle0dEQk59IGFsc28gcmVjb2duaXplcyB0aGUgbG9uZyBmb3JtcyBpZiB5b3UgdHJ1bmNhdGUKK3RoZW0sIHNvIGxvbmcgYXMgZW5vdWdoIG9mIHRoZSBvcHRpb24gaXMgcHJlc2VudCB0byBiZSB1bmFtYmlndW91cy4KKyhJZiB5b3UgcHJlZmVyLCB5b3UgY2FuIGZsYWcgb3B0aW9uIGFyZ3VtZW50cyB3aXRoIEBzYW1wey0tfSByYXRoZXIKK3RoYW4gQHNhbXB7LX0sIHRob3VnaCB3ZSBpbGx1c3RyYXRlIHRoZSBtb3JlIHVzdWFsIGNvbnZlbnRpb24uKQorCitAdGFibGUgQGNvZGUKK0BpdGVtIC1zeW1ib2xzIEB2YXJ7ZmlsZX0KK0BpdGVteCAtcyBAdmFye2ZpbGV9CitSZWFkIHN5bWJvbCB0YWJsZSBmcm9tIGZpbGUgQHZhcntmaWxlfS4KKworQGl0ZW0gLWV4ZWMgQHZhcntmaWxlfQorQGl0ZW14IC1lIEB2YXJ7ZmlsZX0KK1VzZSBmaWxlIEB2YXJ7ZmlsZX0gYXMgdGhlIGV4ZWN1dGFibGUgZmlsZSB0byBleGVjdXRlIHdoZW4KK0BpZnNldCBCQVJFVEFSR0VUCithcHByb3ByaWF0ZS4KK0BlbmQgaWZzZXQKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK2FwcHJvcHJpYXRlLCBhbmQgZm9yIGV4YW1pbmluZyBwdXJlIGRhdGEgaW4gY29uanVuY3Rpb24gd2l0aCBhIGNvcmUKK2R1bXAuCitAZW5kIGlmY2xlYXIKKworQGl0ZW0gLXNlIEB2YXJ7ZmlsZX0KK1JlYWQgc3ltYm9sIHRhYmxlIGZyb20gZmlsZSBAdmFye2ZpbGV9IGFuZCB1c2UgaXQgYXMgdGhlIGV4ZWN1dGFibGUKK2ZpbGUuCisKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK0BpdGVtIC1jb3JlIEB2YXJ7ZmlsZX0KK0BpdGVteCAtYyBAdmFye2ZpbGV9CitVc2UgZmlsZSBAdmFye2ZpbGV9IGFzIGEgY29yZSBkdW1wIHRvIGV4YW1pbmUuCisKK0BpdGVtIC1jIEB2YXJ7bnVtYmVyfQorQ29ubmVjdCB0byBwcm9jZXNzIElEIEB2YXJ7bnVtYmVyfSwgYXMgd2l0aCB0aGUgQGNvZGV7YXR0YWNofSBjb21tYW5kCisodW5sZXNzIHRoZXJlIGlzIGEgZmlsZSBpbiBjb3JlLWR1bXAgZm9ybWF0IG5hbWVkIEB2YXJ7bnVtYmVyfSwgaW4gd2hpY2gKK2Nhc2UgQHNhbXB7LWN9IHNwZWNpZmllcyB0aGF0IGZpbGUgYXMgYSBjb3JlIGR1bXAgdG8gcmVhZCkuCitAZW5kIGlmY2xlYXIKKworQGl0ZW0gLWNvbW1hbmQgQHZhcntmaWxlfQorQGl0ZW14IC14IEB2YXJ7ZmlsZX0KK0V4ZWN1dGUgQHZhbHVle0dEQk59IGNvbW1hbmRzIGZyb20gZmlsZSBAdmFye2ZpbGV9LiAgQHhyZWZ7Q29tbWFuZAorRmlsZXMsLCBDb21tYW5kIGZpbGVzfS4KKworQGl0ZW0gLWRpcmVjdG9yeSBAdmFye2RpcmVjdG9yeX0KK0BpdGVteCAtZCBAdmFye2RpcmVjdG9yeX0KK0FkZCBAdmFye2RpcmVjdG9yeX0gdG8gdGhlIHBhdGggdG8gc2VhcmNoIGZvciBzb3VyY2UgZmlsZXMuCisKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK0BpZmNsZWFyIEhQUEEKK0BpdGVtIC1tCitAaXRlbXggLW1hcHBlZAorQGVtcGh7V2FybmluZzogdGhpcyBvcHRpb24gZGVwZW5kcyBvbiBvcGVyYXRpbmcgc3lzdGVtIGZhY2lsaXRpZXMgdGhhdCBhcmUgbm90CitzdXBwb3J0ZWQgb24gYWxsIHN5c3RlbXMufUAqCitJZiBtZW1vcnktbWFwcGVkIGZpbGVzIGFyZSBhdmFpbGFibGUgb24geW91ciBzeXN0ZW0gdGhyb3VnaCB0aGUgQGNvZGV7bW1hcH0KK3N5c3RlbSBjYWxsLCB5b3UgY2FuIHVzZSB0aGlzIG9wdGlvbiAKK3RvIGhhdmUgQHZhbHVle0dEQk59IHdyaXRlIHRoZSBzeW1ib2xzIGZyb20geW91cgorcHJvZ3JhbSBpbnRvIGEgcmV1c2FibGUgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBJZiB0aGUgcHJvZ3JhbSB5b3UgYXJlIGRlYnVnZ2luZyBpcworY2FsbGVkIEBmaWxley90bXAvZnJlZH0sIHRoZSBtYXBwZWQgc3ltYm9sIGZpbGUgaXMgQGZpbGV7Li9mcmVkLnN5bXN9LgorRnV0dXJlIEB2YWx1ZXtHREJOfSBkZWJ1Z2dpbmcgc2Vzc2lvbnMgbm90aWNlIHRoZSBwcmVzZW5jZSBvZiB0aGlzIGZpbGUsCithbmQgY2FuIHF1aWNrbHkgbWFwIGluIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIGl0LCByYXRoZXIgdGhhbiByZWFkaW5nCit0aGUgc3ltYm9sIHRhYmxlIGZyb20gdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbS4KKworVGhlIEBmaWxley5zeW1zfSBmaWxlIGlzIHNwZWNpZmljIHRvIHRoZSBob3N0IG1hY2hpbmUgd2hlcmUgQHZhbHVle0dEQk59CitpcyBydW4uICBJdCBob2xkcyBhbiBleGFjdCBpbWFnZSBvZiB0aGUgaW50ZXJuYWwgQHZhbHVle0dEQk59IHN5bWJvbAordGFibGUuICBJdCBjYW5ub3QgYmUgc2hhcmVkIGFjcm9zcyBtdWx0aXBsZSBob3N0IHBsYXRmb3Jtcy4KK0BlbmQgaWZjbGVhcgorQGVuZCBpZmNsZWFyCisKK0BpZmNsZWFyIEhQUEEKK0BpdGVtIC1yCitAaXRlbXggLXJlYWRub3cKK1JlYWQgZWFjaCBzeW1ib2wgZmlsZSdzIGVudGlyZSBzeW1ib2wgdGFibGUgaW1tZWRpYXRlbHksIHJhdGhlciB0aGFuCit0aGUgZGVmYXVsdCwgd2hpY2ggaXMgdG8gcmVhZCBpdCBpbmNyZW1lbnRhbGx5IGFzIGl0IGlzIG5lZWRlZC4KK1RoaXMgbWFrZXMgc3RhcnR1cCBzbG93ZXIsIGJ1dCBtYWtlcyBmdXR1cmUgb3BlcmF0aW9ucyBmYXN0ZXIuCitAZW5kIGlmY2xlYXIKK0BlbmQgdGFibGUKKworQGlmY2xlYXIgQkFSRVRBUkdFVAorQGlmY2xlYXIgSFBQQQorVGhlIEBjb2Rley1tYXBwZWR9IGFuZCBAY29kZXstcmVhZG5vd30gb3B0aW9ucyBhcmUgdHlwaWNhbGx5IGNvbWJpbmVkIGluCitvcmRlciB0byBidWlsZCBhIEBmaWxley5zeW1zfSBmaWxlIHRoYXQgY29udGFpbnMgY29tcGxldGUgc3ltYm9sCitpbmZvcm1hdGlvbi4gIChAeHJlZntGaWxlcywsQ29tbWFuZHMgdG8gc3BlY2lmeSBmaWxlc30sIGZvcgoraW5mb3JtYXRpb24gb24gQGZpbGV7LnN5bXN9IGZpbGVzLikgQSBzaW1wbGUgR0RCIGludm9jYXRpb24gdG8gZG8KK25vdGhpbmcgYnV0IGJ1aWxkIGEgQGZpbGV7LnN5bXN9IGZpbGUgZm9yIGZ1dHVyZSB1c2UgaXM6CisKK0BleGFtcGxlCisJZ2RiIC1iYXRjaCAtbnggLW1hcHBlZCAtcmVhZG5vdyBwcm9ncmFtbmFtZQorQGVuZCBleGFtcGxlCitAZW5kIGlmY2xlYXIKK0BlbmQgaWZjbGVhcgorCitAbm9kZSBNb2RlIE9wdGlvbnMsICAsIEZpbGUgT3B0aW9ucywgSW52b2tpbmcgR0RCCitAc3Vic2VjdGlvbiBDaG9vc2luZyBtb2RlcworCitZb3UgY2FuIHJ1biBAdmFsdWV7R0RCTn0gaW4gdmFyaW91cyBhbHRlcm5hdGl2ZSBtb2Rlcy0tLWZvciBleGFtcGxlLCBpbgorYmF0Y2ggbW9kZSBvciBxdWlldCBtb2RlLgorCitAdGFibGUgQGNvZGUKK0BpdGVtIC1ueAorQGl0ZW14IC1uCitEbyBub3QgZXhlY3V0ZSBjb21tYW5kcyBmcm9tIGFueSBpbml0aWFsaXphdGlvbiBmaWxlcyAobm9ybWFsbHkgY2FsbGVkCitAZmlsZXsuZ2RiaW5pdH0sIG9yIEBmaWxle2dkYi5pbml9IG9uIFBDcykuICBOb3JtYWxseSwgdGhlIGNvbW1hbmRzIGluCit0aGVzZSBmaWxlcyBhcmUgZXhlY3V0ZWQgYWZ0ZXIgYWxsIHRoZSBjb21tYW5kIG9wdGlvbnMgYW5kIGFyZ3VtZW50cworaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIEB4cmVme0NvbW1hbmQgRmlsZXMsLENvbW1hbmQgZmlsZXN9LgorCitAaXRlbSAtcXVpZXQKK0BpdGVteCAtcQorYGBRdWlldCcnLiAgRG8gbm90IHByaW50IHRoZSBpbnRyb2R1Y3RvcnkgYW5kIGNvcHlyaWdodCBtZXNzYWdlcy4gIFRoZXNlCittZXNzYWdlcyBhcmUgYWxzbyBzdXBwcmVzc2VkIGluIGJhdGNoIG1vZGUuCisKK0BpdGVtIC1iYXRjaAorUnVuIGluIGJhdGNoIG1vZGUuICBFeGl0IHdpdGggc3RhdHVzIEBjb2RlezB9IGFmdGVyIHByb2Nlc3NpbmcgYWxsIHRoZQorY29tbWFuZCBmaWxlcyBzcGVjaWZpZWQgd2l0aCBAc2FtcHsteH0gKGFuZCBhbGwgY29tbWFuZHMgZnJvbQoraW5pdGlhbGl6YXRpb24gZmlsZXMsIGlmIG5vdCBpbmhpYml0ZWQgd2l0aCBAc2FtcHstbn0pLiAgRXhpdCB3aXRoCitub256ZXJvIHN0YXR1cyBpZiBhbiBlcnJvciBvY2N1cnMgaW4gZXhlY3V0aW5nIHRoZSBAdmFsdWV7R0RCTn0gY29tbWFuZHMKK2luIHRoZSBjb21tYW5kIGZpbGVzLgorCitCYXRjaCBtb2RlIG1heSBiZSB1c2VmdWwgZm9yIHJ1bm5pbmcgQHZhbHVle0dEQk59IGFzIGEgZmlsdGVyLCBmb3IgZXhhbXBsZSB0bworZG93bmxvYWQgYW5kIHJ1biBhIHByb2dyYW0gb24gYW5vdGhlciBjb21wdXRlcjsgaW4gb3JkZXIgdG8gbWFrZSB0aGlzCittb3JlIHVzZWZ1bCwgdGhlIG1lc3NhZ2UKKworQGV4YW1wbGUKK1Byb2dyYW0gZXhpdGVkIG5vcm1hbGx5LgorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorKHdoaWNoIGlzIG9yZGluYXJpbHkgaXNzdWVkIHdoZW5ldmVyIGEgcHJvZ3JhbSBydW5uaW5nIHVuZGVyIEB2YWx1ZXtHREJOfSBjb250cm9sCit0ZXJtaW5hdGVzKSBpcyBub3QgaXNzdWVkIHdoZW4gcnVubmluZyBpbiBiYXRjaCBtb2RlLgorCitAaXRlbSAtY2QgQHZhcntkaXJlY3Rvcnl9CitSdW4gQHZhbHVle0dEQk59IHVzaW5nIEB2YXJ7ZGlyZWN0b3J5fSBhcyBpdHMgd29ya2luZyBkaXJlY3RvcnksCitpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKworQGlmY2xlYXIgRE9TSE9TVAorQGl0ZW0gLWZ1bGxuYW1lCitAaXRlbXggLWYKK0BzY3tnbnV9IEVtYWNzIHNldHMgdGhpcyBvcHRpb24gd2hlbiBpdCBydW5zIEB2YWx1ZXtHREJOfSBhcyBhIHN1YnByb2Nlc3MuICBJdCB0ZWxscyBAdmFsdWV7R0RCTn0KK3RvIG91dHB1dCB0aGUgZnVsbCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGluIGEgc3RhbmRhcmQsCityZWNvZ25pemFibGUgZmFzaGlvbiBlYWNoIHRpbWUgYSBzdGFjayBmcmFtZSBpcyBkaXNwbGF5ZWQgKHdoaWNoCitpbmNsdWRlcyBlYWNoIHRpbWUgeW91ciBwcm9ncmFtIHN0b3BzKS4gIFRoaXMgcmVjb2duaXphYmxlIGZvcm1hdCBsb29rcworbGlrZSB0d28gQHNhbXB7XDAzMn0gY2hhcmFjdGVycywgZm9sbG93ZWQgYnkgdGhlIGZpbGUgbmFtZSwgbGluZSBudW1iZXIKK2FuZCBjaGFyYWN0ZXIgcG9zaXRpb24gc2VwYXJhdGVkIGJ5IGNvbG9ucywgYW5kIGEgbmV3bGluZS4gIFRoZQorRW1hY3MtdG8tQHZhbHVle0dEQk59IGludGVyZmFjZSBwcm9ncmFtIHVzZXMgdGhlIHR3byBAc2FtcHtcMDMyfSBjaGFyYWN0ZXJzIGFzCithIHNpZ25hbCB0byBkaXNwbGF5IHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIGZyYW1lLgorQGVuZCBpZmNsZWFyCisKK0BpZnNldCBTRVJJQUwKK0BpZmNsZWFyIEhQUEEKK0BpdGVtIC1iIEB2YXJ7YnBzfQorU2V0IHRoZSBsaW5lIHNwZWVkIChiYXVkIHJhdGUgb3IgYml0cyBwZXIgc2Vjb25kKSBvZiBhbnkgc2VyaWFsCitpbnRlcmZhY2UgdXNlZCBieSBAdmFsdWV7R0RCTn0gZm9yIHJlbW90ZSBkZWJ1Z2dpbmcuCitAZW5kIGlmY2xlYXIKKworQGl0ZW0gLXR0eSBAdmFye2RldmljZX0KK1J1biB1c2luZyBAdmFye2RldmljZX0gZm9yIHlvdXIgcHJvZ3JhbSdzIHN0YW5kYXJkIGlucHV0IGFuZCBvdXRwdXQuCitAYyBGSVhNRToga2luZ2RvbiB0aGlua3MgdGhlcmUgaXMgbW9yZSB0byAtdHR5LiAgSW52ZXN0aWdhdGUuCitAZW5kIGlmc2V0CisKK0BpZnNldCBIUFBBCitAaXRlbSAtdHVpCitVc2UgYSBUZXJtaW5hbCBVc2VyIEludGVyZmFjZS4gIEZvciBpbmZvcm1hdGlvbiwgdXNlIHlvdXIgV2ViIGJyb3dzZXIgdG8KK3JlYWQgdGhlIGZpbGUgQGZpbGV7VFVJLmh0bWx9LCB3aGljaCBpcyB1c3VhbGx5IGluc3RhbGxlZCBpbiB0aGUKK2RpcmVjdG9yeSBAY29kZXsvb3B0L2xhbmd0b29scy93ZGIvZG9jfSBvbiBIUC1VWCBzeXN0ZW1zLiAgRG8gbm90IHVzZQordGhpcyBvcHRpb24gaWYgeW91IHJ1biBAdmFsdWV7R0RCTn0gZnJvbSBFbWFjcyAoc2VlIEBweHJlZntFbWFjcywgLFVzaW5nCitAdmFsdWV7R0RCTn0gdW5kZXIgQHNje2dudX0gRW1hY3N9KS4KKworQGl0ZW0gLXhkYgorUnVuIGluIFhEQiBjb21wYXRpYmlsaXR5IG1vZGUsIGFsbG93aW5nIHRoZSB1c2Ugb2YgY2VydGFpbiBYREIgY29tbWFuZHMuCitGb3IgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSBAZmlsZXt4ZGJfdHJhbnMuaHRtbH0sIHdoaWNoIGlzIHVzdWFsbHkKK2luc3RhbGxlZCBpbiB0aGUgZGlyZWN0b3J5IEBjb2Rley9vcHQvbGFuZ3Rvb2xzL3dkYi9kb2N9IG9uIEhQLVVYCitzeXN0ZW1zLgorQGVuZCBpZnNldAorQGVuZCB0YWJsZQorCitAbm9kZSBRdWl0dGluZyBHREIsIFNoZWxsIENvbW1hbmRzLCBJbnZva2luZyBHREIsIEludm9jYXRpb24KK0BzZWN0aW9uIFF1aXR0aW5nIEB2YWx1ZXtHREJOfQorQGNpbmRleCBleGl0aW5nIEB2YWx1ZXtHREJOfQorQGNpbmRleCBsZWF2aW5nIEB2YWx1ZXtHREJOfQorCitAdGFibGUgQGNvZGUKK0BraW5kZXggcXVpdCBAcntbfUB2YXJ7ZXhwcmVzc2lvbn1AcntdfQorQGtpbmRleCBxCitAaXRlbSBxdWl0CitUbyBleGl0IEB2YWx1ZXtHREJOfSwgdXNlIHRoZSBAY29kZXtxdWl0fSBjb21tYW5kIChhYmJyZXZpYXRlZCBAY29kZXtxfSksIG9yIAordHlwZSBhbiBlbmQtb2YtZmlsZSBjaGFyYWN0ZXIgKHVzdWFsbHkgQGtiZHtDLWR9KS4gIElmIHlvdSBkbyBub3Qgc3VwcGx5IAorQHZhcntleHByZXNzaW9ufSwgQHZhbHVle0dEQk59IHdpbGwgdGVybWluYXRlIG5vcm1hbGx5OyBvdGhlcndpc2UgaXQgd2lsbCAKK3Rlcm1pbmF0ZSB1c2luZyB0aGUgcmVzdWx0IG9mIEB2YXJ7ZXhwcmVzc2lvbn0gYXMgdGhlIGVycm9yIGNvZGUuCitAZW5kIHRhYmxlCisKK0BjaW5kZXggaW50ZXJydXB0CitBbiBpbnRlcnJ1cHQgKG9mdGVuIEBrYmR7Qy1jfSkgZG9lcyBub3QgZXhpdCBmcm9tIEB2YWx1ZXtHREJOfSwgYnV0IHJhdGhlcgordGVybWluYXRlcyB0aGUgYWN0aW9uIG9mIGFueSBAdmFsdWV7R0RCTn0gY29tbWFuZCB0aGF0IGlzIGluIHByb2dyZXNzIGFuZAorcmV0dXJucyB0byBAdmFsdWV7R0RCTn0gY29tbWFuZCBsZXZlbC4gIEl0IGlzIHNhZmUgdG8gdHlwZSB0aGUgaW50ZXJydXB0CitjaGFyYWN0ZXIgYXQgYW55IHRpbWUgYmVjYXVzZSBAdmFsdWV7R0RCTn0gZG9lcyBub3QgYWxsb3cgaXQgdG8gdGFrZSBlZmZlY3QKK3VudGlsIGEgdGltZSB3aGVuIGl0IGlzIHNhZmUuCisKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK0lmIHlvdSBoYXZlIGJlZW4gdXNpbmcgQHZhbHVle0dEQk59IHRvIGNvbnRyb2wgYW4gYXR0YWNoZWQgcHJvY2VzcyBvcgorZGV2aWNlLCB5b3UgY2FuIHJlbGVhc2UgaXQgd2l0aCB0aGUgQGNvZGV7ZGV0YWNofSBjb21tYW5kCisoQHB4cmVme0F0dGFjaCwgLERlYnVnZ2luZyBhbiBhbHJlYWR5LXJ1bm5pbmcgcHJvY2Vzc30pLgorQGVuZCBpZmNsZWFyCisKK0Bub2RlIFNoZWxsIENvbW1hbmRzLCAgLCBRdWl0dGluZyBHREIsIEludm9jYXRpb24KK0BzZWN0aW9uIFNoZWxsIGNvbW1hbmRzCisKK0lmIHlvdSBuZWVkIHRvIGV4ZWN1dGUgb2NjYXNpb25hbCBzaGVsbCBjb21tYW5kcyBkdXJpbmcgeW91cgorZGVidWdnaW5nIHNlc3Npb24sIHRoZXJlIGlzIG5vIG5lZWQgdG8gbGVhdmUgb3Igc3VzcGVuZCBAdmFsdWV7R0RCTn07IHlvdSBjYW4KK2p1c3QgdXNlIHRoZSBAY29kZXtzaGVsbH0gY29tbWFuZC4KKworQHRhYmxlIEBjb2RlCitAa2luZGV4IHNoZWxsCitAY2luZGV4IHNoZWxsIGVzY2FwZQorQGl0ZW0gc2hlbGwgQHZhcntjb21tYW5kIHN0cmluZ30KK0ludm9rZSBhIHN0YW5kYXJkIHNoZWxsIHRvIGV4ZWN1dGUgQHZhcntjb21tYW5kIHN0cmluZ30uCitAaWZjbGVhciBET1NIT1NUCitJZiBpdCBleGlzdHMsIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBAY29kZXtTSEVMTH0gZGV0ZXJtaW5lcyB3aGljaAorc2hlbGwgdG8gcnVuLiAgT3RoZXJ3aXNlIEB2YWx1ZXtHREJOfSB1c2VzIEBjb2Rley9iaW4vc2h9LgorQGVuZCBpZmNsZWFyCitAZW5kIHRhYmxlCisKK1RoZSB1dGlsaXR5IEBjb2Rle21ha2V9IGlzIG9mdGVuIG5lZWRlZCBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuCitZb3UgZG8gbm90IGhhdmUgdG8gdXNlIHRoZSBAY29kZXtzaGVsbH0gY29tbWFuZCBmb3IgdGhpcyBwdXJwb3NlIGluCitAdmFsdWV7R0RCTn06CisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBtYWtlCitAY2luZGV4IGNhbGxpbmcgbWFrZQorQGl0ZW0gbWFrZSBAdmFye21ha2UtYXJnc30KK0V4ZWN1dGUgdGhlIEBjb2Rle21ha2V9IHByb2dyYW0gd2l0aCB0aGUgc3BlY2lmaWVkCithcmd1bWVudHMuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gQHNhbXB7c2hlbGwgbWFrZSBAdmFye21ha2UtYXJnc319LgorQGVuZCB0YWJsZQorCitAbm9kZSBDb21tYW5kcywgUnVubmluZywgSW52b2NhdGlvbiwgVG9wCitAY2hhcHRlciBAdmFsdWV7R0RCTn0gQ29tbWFuZHMKKworWW91IGNhbiBhYmJyZXZpYXRlIGEgQHZhbHVle0dEQk59IGNvbW1hbmQgdG8gdGhlIGZpcnN0IGZldyBsZXR0ZXJzIG9mIHRoZSBjb21tYW5kCituYW1lLCBpZiB0aGF0IGFiYnJldmlhdGlvbiBpcyB1bmFtYmlndW91czsgYW5kIHlvdSBjYW4gcmVwZWF0IGNlcnRhaW4KK0B2YWx1ZXtHREJOfSBjb21tYW5kcyBieSB0eXBpbmcganVzdCBAa2V5e1JFVH0uICBZb3UgY2FuIGFsc28gdXNlIHRoZSBAa2V5e1RBQn0KK2tleSB0byBnZXQgQHZhbHVle0dEQk59IHRvIGZpbGwgb3V0IHRoZSByZXN0IG9mIGEgd29yZCBpbiBhIGNvbW1hbmQgKG9yIHRvCitzaG93IHlvdSB0aGUgYWx0ZXJuYXRpdmVzIGF2YWlsYWJsZSwgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwb3NzaWJpbGl0eSkuCisKK0BtZW51CisqIENvbW1hbmQgU3ludGF4OjogICAgICAgICAgICAgIEhvdyB0byBnaXZlIGNvbW1hbmRzIHRvIEB2YWx1ZXtHREJOfQorKiBDb21wbGV0aW9uOjogICAgICAgICAgICAgICAgICBDb21tYW5kIGNvbXBsZXRpb24KKyogSGVscDo6ICAgICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGFzayBAdmFsdWV7R0RCTn0gZm9yIGhlbHAKK0BlbmQgbWVudQorCitAbm9kZSBDb21tYW5kIFN5bnRheCwgQ29tcGxldGlvbiwgQ29tbWFuZHMsIENvbW1hbmRzCitAc2VjdGlvbiBDb21tYW5kIHN5bnRheAorCitBIEB2YWx1ZXtHREJOfSBjb21tYW5kIGlzIGEgc2luZ2xlIGxpbmUgb2YgaW5wdXQuICBUaGVyZSBpcyBubyBsaW1pdCBvbgoraG93IGxvbmcgaXQgY2FuIGJlLiAgSXQgc3RhcnRzIHdpdGggYSBjb21tYW5kIG5hbWUsIHdoaWNoIGlzIGZvbGxvd2VkIGJ5Cithcmd1bWVudHMgd2hvc2UgbWVhbmluZyBkZXBlbmRzIG9uIHRoZSBjb21tYW5kIG5hbWUuICBGb3IgZXhhbXBsZSwgdGhlCitjb21tYW5kIEBjb2Rle3N0ZXB9IGFjY2VwdHMgYW4gYXJndW1lbnQgd2hpY2ggaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0bworc3RlcCwgYXMgaW4gQHNhbXB7c3RlcCA1fS4gIFlvdSBjYW4gYWxzbyB1c2UgdGhlIEBjb2Rle3N0ZXB9IGNvbW1hbmQKK3dpdGggbm8gYXJndW1lbnRzLiAgU29tZSBjb21tYW5kIG5hbWVzIGRvIG5vdCBhbGxvdyBhbnkgYXJndW1lbnRzLgorCitAY2luZGV4IGFiYnJldmlhdGlvbgorQHZhbHVle0dEQk59IGNvbW1hbmQgbmFtZXMgbWF5IGFsd2F5cyBiZSB0cnVuY2F0ZWQgaWYgdGhhdCBhYmJyZXZpYXRpb24gaXMKK3VuYW1iaWd1b3VzLiAgT3RoZXIgcG9zc2libGUgY29tbWFuZCBhYmJyZXZpYXRpb25zIGFyZSBsaXN0ZWQgaW4gdGhlCitkb2N1bWVudGF0aW9uIGZvciBpbmRpdmlkdWFsIGNvbW1hbmRzLiAgSW4gc29tZSBjYXNlcywgZXZlbiBhbWJpZ3VvdXMKK2FiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQ7IGZvciBleGFtcGxlLCBAY29kZXtzfSBpcyBzcGVjaWFsbHkgZGVmaW5lZCBhcworZXF1aXZhbGVudCB0byBAY29kZXtzdGVwfSBldmVuIHRob3VnaCB0aGVyZSBhcmUgb3RoZXIgY29tbWFuZHMgd2hvc2UKK25hbWVzIHN0YXJ0IHdpdGggQGNvZGV7c30uICBZb3UgY2FuIHRlc3QgYWJicmV2aWF0aW9ucyBieSB1c2luZyB0aGVtIGFzCithcmd1bWVudHMgdG8gdGhlIEBjb2Rle2hlbHB9IGNvbW1hbmQuCisKK0BjaW5kZXggcmVwZWF0aW5nIGNvbW1hbmRzCitAa2luZGV4IFJFVAorQSBibGFuayBsaW5lIGFzIGlucHV0IHRvIEB2YWx1ZXtHREJOfSAodHlwaW5nIGp1c3QgQGtleXtSRVR9KSBtZWFucyB0bworcmVwZWF0IHRoZSBwcmV2aW91cyBjb21tYW5kLiBDZXJ0YWluIGNvbW1hbmRzIChmb3IgZXhhbXBsZSwgQGNvZGV7cnVufSkKK3dpbGwgbm90IHJlcGVhdCB0aGlzIHdheTsgdGhlc2UgYXJlIGNvbW1hbmRzIHdob3NlIHVuaW50ZW50aW9uYWwKK3JlcGV0aXRpb24gbWlnaHQgY2F1c2UgdHJvdWJsZSBhbmQgd2hpY2ggeW91IGFyZSB1bmxpa2VseSB0byB3YW50IHRvCityZXBlYXQuCisKK1RoZSBAY29kZXtsaXN0fSBhbmQgQGNvZGV7eH0gY29tbWFuZHMsIHdoZW4geW91IHJlcGVhdCB0aGVtIHdpdGgKK0BrZXl7UkVUfSwgY29uc3RydWN0IG5ldyBhcmd1bWVudHMgcmF0aGVyIHRoYW4gcmVwZWF0aW5nCitleGFjdGx5IGFzIHR5cGVkLiAgVGhpcyBwZXJtaXRzIGVhc3kgc2Nhbm5pbmcgb2Ygc291cmNlIG9yIG1lbW9yeS4KKworQHZhbHVle0dEQk59IGNhbiBhbHNvIHVzZSBAa2V5e1JFVH0gaW4gYW5vdGhlciB3YXk6IHRvIHBhcnRpdGlvbiBsZW5ndGh5CitvdXRwdXQsIGluIGEgd2F5IHNpbWlsYXIgdG8gdGhlIGNvbW1vbiB1dGlsaXR5IEBjb2Rle21vcmV9CisoQHB4cmVme1NjcmVlbiBTaXplLCxTY3JlZW4gc2l6ZX0pLiAgU2luY2UgaXQgaXMgZWFzeSB0byBwcmVzcyBvbmUKK0BrZXl7UkVUfSB0b28gbWFueSBpbiB0aGlzIHNpdHVhdGlvbiwgQHZhbHVle0dEQk59IGRpc2FibGVzIGNvbW1hbmQKK3JlcGV0aXRpb24gYWZ0ZXIgYW55IGNvbW1hbmQgdGhhdCBnZW5lcmF0ZXMgdGhpcyBzb3J0IG9mIGRpc3BsYXkuCisKK0BraW5kZXggIworQGNpbmRleCBjb21tZW50CitBbnkgdGV4dCBmcm9tIGEgQGtiZHsjfSB0byB0aGUgZW5kIG9mIHRoZSBsaW5lIGlzIGEgY29tbWVudDsgaXQgZG9lcworbm90aGluZy4gIFRoaXMgaXMgdXNlZnVsIG1haW5seSBpbiBjb21tYW5kIGZpbGVzIChAcHhyZWZ7Q29tbWFuZAorRmlsZXMsLENvbW1hbmQgZmlsZXN9KS4KKworQG5vZGUgQ29tcGxldGlvbiwgSGVscCwgQ29tbWFuZCBTeW50YXgsIENvbW1hbmRzCitAc2VjdGlvbiBDb21tYW5kIGNvbXBsZXRpb24KKworQGNpbmRleCBjb21wbGV0aW9uCitAY2luZGV4IHdvcmQgY29tcGxldGlvbgorQHZhbHVle0dEQk59IGNhbiBmaWxsIGluIHRoZSByZXN0IG9mIGEgd29yZCBpbiBhIGNvbW1hbmQgZm9yIHlvdSwgaWYgdGhlcmUgaXMKK29ubHkgb25lIHBvc3NpYmlsaXR5OyBpdCBjYW4gYWxzbyBzaG93IHlvdSB3aGF0IHRoZSB2YWxpZCBwb3NzaWJpbGl0aWVzCithcmUgZm9yIHRoZSBuZXh0IHdvcmQgaW4gYSBjb21tYW5kLCBhdCBhbnkgdGltZS4gIFRoaXMgd29ya3MgZm9yIEB2YWx1ZXtHREJOfQorY29tbWFuZHMsIEB2YWx1ZXtHREJOfSBzdWJjb21tYW5kcywgYW5kIHRoZSBuYW1lcyBvZiBzeW1ib2xzIGluIHlvdXIgcHJvZ3JhbS4KKworUHJlc3MgdGhlIEBrZXl7VEFCfSBrZXkgd2hlbmV2ZXIgeW91IHdhbnQgQHZhbHVle0dEQk59IHRvIGZpbGwgb3V0IHRoZSByZXN0CitvZiBhIHdvcmQuICBJZiB0aGVyZSBpcyBvbmx5IG9uZSBwb3NzaWJpbGl0eSwgQHZhbHVle0dEQk59IGZpbGxzIGluIHRoZQord29yZCwgYW5kIHdhaXRzIGZvciB5b3UgdG8gZmluaXNoIHRoZSBjb21tYW5kIChvciBwcmVzcyBAa2V5e1JFVH0gdG8KK2VudGVyIGl0KS4gIEZvciBleGFtcGxlLCBpZiB5b3UgdHlwZQorCitAYyBGSVhNRSAiQGtleSIgZG9lcyBub3QgZGlzdGluZ3Vpc2ggaXRzIGFyZ3VtZW50IHN1ZmZpY2llbnRseSB0byBwZXJtaXQKK0BjIGNvbXBsZXRlIGFjY3VyYWN5IGluIHRoZXNlIGV4YW1wbGVzOyBzcGFjZSBpbnRyb2R1Y2VkIGZvciBjbGFyaXR5LgorQGMgSWYgdGV4aW5mbyBlbmhhbmNlbWVudHMgbWFrZSBpdCB1bm5lY2Vzc2FyeSwgaXQgd291bGQgYmUgbmljZSB0bworQGMgcmVwbGFjZSAiIEBrZXkiIGJ5ICJAa2V5IiBpbiB0aGUgZm9sbG93aW5nLi4uCitAZXhhbXBsZQorKEB2YWx1ZXtHREJQfSkgaW5mbyBicmUgQGtleXtUQUJ9CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitAdmFsdWV7R0RCTn0gZmlsbHMgaW4gdGhlIHJlc3Qgb2YgdGhlIHdvcmQgQHNhbXB7YnJlYWtwb2ludHN9LCBzaW5jZSB0aGF0IGlzCit0aGUgb25seSBAY29kZXtpbmZvfSBzdWJjb21tYW5kIGJlZ2lubmluZyB3aXRoIEBzYW1we2JyZX06CisKK0BleGFtcGxlCisoQHZhbHVle0dEQlB9KSBpbmZvIGJyZWFrcG9pbnRzCitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitZb3UgY2FuIGVpdGhlciBwcmVzcyBAa2V5e1JFVH0gYXQgdGhpcyBwb2ludCwgdG8gcnVuIHRoZSBAY29kZXtpbmZvCiticmVha3BvaW50c30gY29tbWFuZCwgb3IgYmFja3NwYWNlIGFuZCBlbnRlciBzb21ldGhpbmcgZWxzZSwgaWYKK0BzYW1we2JyZWFrcG9pbnRzfSBkb2VzIG5vdCBsb29rIGxpa2UgdGhlIGNvbW1hbmQgeW91IGV4cGVjdGVkLiAgKElmIHlvdQord2VyZSBzdXJlIHlvdSB3YW50ZWQgQGNvZGV7aW5mbyBicmVha3BvaW50c30gaW4gdGhlIGZpcnN0IHBsYWNlLCB5b3UKK21pZ2h0IGFzIHdlbGwganVzdCB0eXBlIEBrZXl7UkVUfSBpbW1lZGlhdGVseSBhZnRlciBAc2FtcHtpbmZvIGJyZX0sCit0byBleHBsb2l0IGNvbW1hbmQgYWJicmV2aWF0aW9ucyByYXRoZXIgdGhhbiBjb21tYW5kIGNvbXBsZXRpb24pLgorCitJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBvc3NpYmlsaXR5IGZvciB0aGUgbmV4dCB3b3JkIHdoZW4geW91IHByZXNzCitAa2V5e1RBQn0sIEB2YWx1ZXtHREJOfSBzb3VuZHMgYSBiZWxsLiAgWW91IGNhbiBlaXRoZXIgc3VwcGx5IG1vcmUKK2NoYXJhY3RlcnMgYW5kIHRyeSBhZ2Fpbiwgb3IganVzdCBwcmVzcyBAa2V5e1RBQn0gYSBzZWNvbmQgdGltZTsKK0B2YWx1ZXtHREJOfSBkaXNwbGF5cyBhbGwgdGhlIHBvc3NpYmxlIGNvbXBsZXRpb25zIGZvciB0aGF0IHdvcmQuICBGb3IKK2V4YW1wbGUsIHlvdSBtaWdodCB3YW50IHRvIHNldCBhIGJyZWFrcG9pbnQgb24gYSBzdWJyb3V0aW5lIHdob3NlIG5hbWUKK2JlZ2lucyB3aXRoIEBzYW1we21ha2VffSwgYnV0IHdoZW4geW91IHR5cGUgQGtiZHtiIG1ha2VfQGtleXtUQUJ9fSBAdmFsdWV7R0RCTn0KK2p1c3Qgc291bmRzIHRoZSBiZWxsLiAgVHlwaW5nIEBrZXl7VEFCfSBhZ2FpbiBkaXNwbGF5cyBhbGwgdGhlCitmdW5jdGlvbiBuYW1lcyBpbiB5b3VyIHByb2dyYW0gdGhhdCBiZWdpbiB3aXRoIHRob3NlIGNoYXJhY3RlcnMsIGZvcgorZXhhbXBsZToKKworQGV4YW1wbGUKKyhAdmFsdWV7R0RCUH0pIGIgbWFrZV8gQGtleXtUQUJ9CitAZXhkZW50IEB2YWx1ZXtHREJOfSBzb3VuZHMgYmVsbDsgcHJlc3MgQGtleXtUQUJ9IGFnYWluLCB0byBzZWU6CittYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUgICAgIG1ha2VfZW52aXJvbiAgICAgICAgICAgICAgIAorbWFrZV9hYnNfc2VjdGlvbiAgICAgICAgICAgICBtYWtlX2Z1bmN0aW9uX3R5cGUgICAgICAgICAKK21ha2VfYmxvY2t2ZWN0b3IgICAgICAgICAgICAgbWFrZV9wb2ludGVyX3R5cGUgICAgICAgICAgCittYWtlX2NsZWFudXAgICAgICAgICAgICAgICAgIG1ha2VfcmVmZXJlbmNlX3R5cGUgICAgICAgIAorbWFrZV9jb21tYW5kICAgICAgICAgICAgICAgICBtYWtlX3N5bWJvbF9jb21wbGV0aW9uX2xpc3QKKyhAdmFsdWV7R0RCUH0pIGIgbWFrZV8KK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK0FmdGVyIGRpc3BsYXlpbmcgdGhlIGF2YWlsYWJsZSBwb3NzaWJpbGl0aWVzLCBAdmFsdWV7R0RCTn0gY29waWVzIHlvdXIKK3BhcnRpYWwgaW5wdXQgKEBzYW1we2IgbWFrZV99IGluIHRoZSBleGFtcGxlKSBzbyB5b3UgY2FuIGZpbmlzaCB0aGUKK2NvbW1hbmQuCisKK0lmIHlvdSBqdXN0IHdhbnQgdG8gc2VlIHRoZSBsaXN0IG9mIGFsdGVybmF0aXZlcyBpbiB0aGUgZmlyc3QgcGxhY2UsIHlvdQorY2FuIHByZXNzIEBrYmR7TS0/fSByYXRoZXIgdGhhbiBwcmVzc2luZyBAa2V5e1RBQn0gdHdpY2UuIEBrYmR7TS0/fQorbWVhbnMgQGtiZHtAa2V5e01FVEF9ID99LiAgWW91IGNhbiB0eXBlIHRoaXMKK0BpZmNsZWFyIERPU0hPU1QKK2VpdGhlciBieSBob2xkaW5nIGRvd24gYQora2V5IGRlc2lnbmF0ZWQgYXMgdGhlIEBrZXl7TUVUQX0gc2hpZnQgb24geW91ciBrZXlib2FyZCAoaWYgdGhlcmUgaXMKK29uZSkgd2hpbGUgdHlwaW5nIEBrYmR7P30sIG9yCitAZW5kIGlmY2xlYXIKK2FzIEBrZXl7RVNDfSBmb2xsb3dlZCBieSBAa2Jkez99LgorCitAY2luZGV4IHF1b3RlcyBpbiBjb21tYW5kcworQGNpbmRleCBjb21wbGV0aW9uIG9mIHF1b3RlZCBzdHJpbmdzCitTb21ldGltZXMgdGhlIHN0cmluZyB5b3UgbmVlZCwgd2hpbGUgbG9naWNhbGx5IGEgYGB3b3JkJycsIG1heSBjb250YWluCitwYXJlbnRoZXNlcyBvciBvdGhlciBjaGFyYWN0ZXJzIHRoYXQgQHZhbHVle0dEQk59IG5vcm1hbGx5IGV4Y2x1ZGVzIGZyb20gaXRzCitub3Rpb24gb2YgYSB3b3JkLiAgVG8gcGVybWl0IHdvcmQgY29tcGxldGlvbiB0byB3b3JrIGluIHRoaXMgc2l0dWF0aW9uLAoreW91IG1heSBlbmNsb3NlIHdvcmRzIGluIEBjb2Rleyd9IChzaW5nbGUgcXVvdGUgbWFya3MpIGluIEB2YWx1ZXtHREJOfSBjb21tYW5kcy4KKworQGlmY2xlYXIgQ09OTFkKK1RoZSBtb3N0IGxpa2VseSBzaXR1YXRpb24gd2hlcmUgeW91IG1pZ2h0IG5lZWQgdGhpcyBpcyBpbiB0eXBpbmcgdGhlCituYW1lIG9mIGEgQysrIGZ1bmN0aW9uLiAgVGhpcyBpcyBiZWNhdXNlIEMrKyBhbGxvd3MgZnVuY3Rpb24gb3ZlcmxvYWRpbmcKKyhtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBmdW5jdGlvbiwgZGlzdGluZ3Vpc2hlZCBieSBhcmd1bWVudAordHlwZSkuICBGb3IgZXhhbXBsZSwgd2hlbiB5b3Ugd2FudCB0byBzZXQgYSBicmVha3BvaW50IHlvdSBtYXkgbmVlZCB0bworZGlzdGluZ3Vpc2ggd2hldGhlciB5b3UgbWVhbiB0aGUgdmVyc2lvbiBvZiBAY29kZXtuYW1lfSB0aGF0IHRha2VzIGFuCitAY29kZXtpbnR9IHBhcmFtZXRlciwgQGNvZGV7bmFtZShpbnQpfSwgb3IgdGhlIHZlcnNpb24gdGhhdCB0YWtlcyBhCitAY29kZXtmbG9hdH0gcGFyYW1ldGVyLCBAY29kZXtuYW1lKGZsb2F0KX0uICBUbyB1c2UgdGhlIHdvcmQtY29tcGxldGlvbgorZmFjaWxpdGllcyBpbiB0aGlzIHNpdHVhdGlvbiwgdHlwZSBhIHNpbmdsZSBxdW90ZSBAY29kZXsnfSBhdCB0aGUKK2JlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24gbmFtZS4gIFRoaXMgYWxlcnRzIEB2YWx1ZXtHREJOfSB0aGF0IGl0IG1heSBuZWVkIHRvCitjb25zaWRlciBtb3JlIGluZm9ybWF0aW9uIHRoYW4gdXN1YWwgd2hlbiB5b3UgcHJlc3MgQGtleXtUQUJ9IG9yCitAa2Jke00tP30gdG8gcmVxdWVzdCB3b3JkIGNvbXBsZXRpb246CisKK0BleGFtcGxlCisoQHZhbHVle0dEQlB9KSBiICdidWJibGUoIEBrZXl7TS0/fQorYnViYmxlKGRvdWJsZSxkb3VibGUpICAgIGJ1YmJsZShpbnQsaW50KQorKEB2YWx1ZXtHREJQfSkgYiAnYnViYmxlKAorQGVuZCBleGFtcGxlCisKK0luIHNvbWUgY2FzZXMsIEB2YWx1ZXtHREJOfSBjYW4gdGVsbCB0aGF0IGNvbXBsZXRpbmcgYSBuYW1lIHJlcXVpcmVzIHVzaW5nCitxdW90ZXMuICBXaGVuIHRoaXMgaGFwcGVucywgQHZhbHVle0dEQk59IGluc2VydHMgdGhlIHF1b3RlIGZvciB5b3UgKHdoaWxlCitjb21wbGV0aW5nIGFzIG11Y2ggYXMgaXQgY2FuKSBpZiB5b3UgZG8gbm90IHR5cGUgdGhlIHF1b3RlIGluIHRoZSBmaXJzdAorcGxhY2U6CisKK0BleGFtcGxlCisoQHZhbHVle0dEQlB9KSBiIGJ1YiBAa2V5e1RBQn0KK0BleGRlbnQgQHZhbHVle0dEQk59IGFsdGVycyB5b3VyIGlucHV0IGxpbmUgdG8gdGhlIGZvbGxvd2luZywgYW5kIHJpbmdzIGEgYmVsbDoKKyhAdmFsdWV7R0RCUH0pIGIgJ2J1YmJsZSgKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK0luIGdlbmVyYWwsIEB2YWx1ZXtHREJOfSBjYW4gdGVsbCB0aGF0IGEgcXVvdGUgaXMgbmVlZGVkIChhbmQgaW5zZXJ0cyBpdCkgaWYKK3lvdSBoYXZlIG5vdCB5ZXQgc3RhcnRlZCB0eXBpbmcgdGhlIGFyZ3VtZW50IGxpc3Qgd2hlbiB5b3UgYXNrIGZvcgorY29tcGxldGlvbiBvbiBhbiBvdmVybG9hZGVkIHN5bWJvbC4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3ZlcmxvYWRlZCBmdW5jdGlvbnMsIEBweHJlZntDcGx1cworZXhwcmVzc2lvbnMsICxDKysgZXhwcmVzc2lvbnN9LiAgWW91IGNhbiB1c2UgdGhlIGNvbW1hbmQgQGNvZGV7c2V0CitvdmVybG9hZC1yZXNvbHV0aW9uIG9mZn0gdG8gZGlzYWJsZSBvdmVybG9hZCByZXNvbHV0aW9uOworQHB4cmVme0RlYnVnZ2luZyBDIHBsdXMgcGx1cywgLEB2YWx1ZXtHREJOfSBmZWF0dXJlcyBmb3IgQysrfS4KK0BlbmQgaWZjbGVhcgorCisKK0Bub2RlIEhlbHAsICAsIENvbXBsZXRpb24sIENvbW1hbmRzCitAc2VjdGlvbiBHZXR0aW5nIGhlbHAKK0BjaW5kZXggb25saW5lIGRvY3VtZW50YXRpb24KK0BraW5kZXggaGVscAorCitZb3UgY2FuIGFsd2F5cyBhc2sgQHZhbHVle0dEQk59IGl0c2VsZiBmb3IgaW5mb3JtYXRpb24gb24gaXRzIGNvbW1hbmRzLCAKK3VzaW5nIHRoZSBjb21tYW5kIEBjb2Rle2hlbHB9LgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggaAorQGl0ZW0gaGVscAorQGl0ZW14IGgKK1lvdSBjYW4gdXNlIEBjb2Rle2hlbHB9IChhYmJyZXZpYXRlZCBAY29kZXtofSkgd2l0aCBubyBhcmd1bWVudHMgdG8KK2Rpc3BsYXkgYSBzaG9ydCBsaXN0IG9mIG5hbWVkIGNsYXNzZXMgb2YgY29tbWFuZHM6CisKK0BzbWFsbGV4YW1wbGUKKyhAdmFsdWV7R0RCUH0pIGhlbHAKK0xpc3Qgb2YgY2xhc3NlcyBvZiBjb21tYW5kczoKKworcnVubmluZyAtLSBSdW5uaW5nIHRoZSBwcm9ncmFtCitzdGFjayAtLSBFeGFtaW5pbmcgdGhlIHN0YWNrCitkYXRhIC0tIEV4YW1pbmluZyBkYXRhCiticmVha3BvaW50cyAtLSBNYWtpbmcgcHJvZ3JhbSBzdG9wIGF0IGNlcnRhaW4gcG9pbnRzCitmaWxlcyAtLSBTcGVjaWZ5aW5nIGFuZCBleGFtaW5pbmcgZmlsZXMKK3N0YXR1cyAtLSBTdGF0dXMgaW5xdWlyaWVzCitzdXBwb3J0IC0tIFN1cHBvcnQgZmFjaWxpdGllcwordXNlci1kZWZpbmVkIC0tIFVzZXItZGVmaW5lZCBjb21tYW5kcworYWxpYXNlcyAtLSBBbGlhc2VzIG9mIG90aGVyIGNvbW1hbmRzCitvYnNjdXJlIC0tIE9ic2N1cmUgZmVhdHVyZXMKKworVHlwZSAiaGVscCIgZm9sbG93ZWQgYnkgYSBjbGFzcyBuYW1lIGZvciBhIGxpc3Qgb2YgCitjb21tYW5kcyBpbiB0aGF0IGNsYXNzLgorVHlwZSAiaGVscCIgZm9sbG93ZWQgYnkgY29tbWFuZCBuYW1lIGZvciBmdWxsIAorZG9jdW1lbnRhdGlvbi4KK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLgorKEB2YWx1ZXtHREJQfSkKK0BlbmQgc21hbGxleGFtcGxlCisKK0BpdGVtIGhlbHAgQHZhcntjbGFzc30KK1VzaW5nIG9uZSBvZiB0aGUgZ2VuZXJhbCBoZWxwIGNsYXNzZXMgYXMgYW4gYXJndW1lbnQsIHlvdSBjYW4gZ2V0IGEKK2xpc3Qgb2YgdGhlIGluZGl2aWR1YWwgY29tbWFuZHMgaW4gdGhhdCBjbGFzcy4gIEZvciBleGFtcGxlLCBoZXJlIGlzIHRoZQoraGVscCBkaXNwbGF5IGZvciB0aGUgY2xhc3MgQGNvZGV7c3RhdHVzfToKKworQHNtYWxsZXhhbXBsZQorKEB2YWx1ZXtHREJQfSkgaGVscCBzdGF0dXMKK1N0YXR1cyBpbnF1aXJpZXMuCisKK0xpc3Qgb2YgY29tbWFuZHM6CisKK0BjIExpbmUgYnJlYWsgaW4gInNob3ciIGxpbmUgZmFsc2lmaWVzIHJlYWwgb3V0cHV0LCBidXQgbmVlZGVkCitAYyB0byBmaXQgaW4gc21hbGxib29rIHBhZ2Ugc2l6ZS4KK3Nob3cgLS0gR2VuZXJpYyBjb21tYW5kIGZvciBzaG93aW5nIHRoaW5ncyBzZXQKKyB3aXRoICJzZXQiCitpbmZvIC0tIEdlbmVyaWMgY29tbWFuZCBmb3IgcHJpbnRpbmcgc3RhdHVzCisKK1R5cGUgImhlbHAiIGZvbGxvd2VkIGJ5IGNvbW1hbmQgbmFtZSBmb3IgZnVsbCAKK2RvY3VtZW50YXRpb24uCitDb21tYW5kIG5hbWUgYWJicmV2aWF0aW9ucyBhcmUgYWxsb3dlZCBpZiB1bmFtYmlndW91cy4KKyhAdmFsdWV7R0RCUH0pCitAZW5kIHNtYWxsZXhhbXBsZQorCitAaXRlbSBoZWxwIEB2YXJ7Y29tbWFuZH0KK1dpdGggYSBjb21tYW5kIG5hbWUgYXMgQGNvZGV7aGVscH0gYXJndW1lbnQsIEB2YWx1ZXtHREJOfSBkaXNwbGF5cyBhCitzaG9ydCBwYXJhZ3JhcGggb24gaG93IHRvIHVzZSB0aGF0IGNvbW1hbmQuCisKK0BraW5kZXggY29tcGxldGUKK0BpdGVtIGNvbXBsZXRlIEB2YXJ7YXJnc30KK1RoZSBAY29kZXtjb21wbGV0ZSBAdmFye2FyZ3N9fSBjb21tYW5kIGxpc3RzIGFsbCB0aGUgcG9zc2libGUgY29tcGxldGlvbnMKK2ZvciB0aGUgYmVnaW5uaW5nIG9mIGEgY29tbWFuZC4gIFVzZSBAdmFye2FyZ3N9IHRvIHNwZWNpZnkgdGhlIGJlZ2lubmluZyBvZiB0aGUKK2NvbW1hbmQgeW91IHdhbnQgY29tcGxldGVkLiAgRm9yIGV4YW1wbGU6CisKK0BzbWFsbGV4YW1wbGUKK2NvbXBsZXRlIGkKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2luZGVudCByZXN1bHRzIGluOgorCitAc21hbGxleGFtcGxlCitAZ3JvdXAKK2luZm8KK2luc3BlY3QKK2lnbm9yZQorQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vaW5kZW50IFRoaXMgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBAc2N7Z251fSBFbWFjcy4KK0BlbmQgdGFibGUKKworSW4gYWRkaXRpb24gdG8gQGNvZGV7aGVscH0sIHlvdSBjYW4gdXNlIHRoZSBAdmFsdWV7R0RCTn0gY29tbWFuZHMgQGNvZGV7aW5mb30KK2FuZCBAY29kZXtzaG93fSB0byBpbnF1aXJlIGFib3V0IHRoZSBzdGF0ZSBvZiB5b3VyIHByb2dyYW0sIG9yIHRoZSBzdGF0ZQorb2YgQHZhbHVle0dEQk59IGl0c2VsZi4gIEVhY2ggY29tbWFuZCBzdXBwb3J0cyBtYW55IHRvcGljcyBvZiBpbnF1aXJ5OyB0aGlzCittYW51YWwgaW50cm9kdWNlcyBlYWNoIG9mIHRoZW0gaW4gdGhlIGFwcHJvcHJpYXRlIGNvbnRleHQuICBUaGUgbGlzdGluZ3MKK3VuZGVyIEBjb2Rle2luZm99IGFuZCB1bmRlciBAY29kZXtzaG93fSBpbiB0aGUgSW5kZXggcG9pbnQgdG8KK2FsbCB0aGUgc3ViLWNvbW1hbmRzLiAgQHhyZWZ7SW5kZXh9LgorCitAYyBAZ3JvdXAKK0B0YWJsZSBAY29kZQorQGtpbmRleCBpbmZvCitAa2luZGV4IGkKK0BpdGVtIGluZm8KK1RoaXMgY29tbWFuZCAoYWJicmV2aWF0ZWQgQGNvZGV7aX0pIGlzIGZvciBkZXNjcmliaW5nIHRoZSBzdGF0ZSBvZiB5b3VyCitwcm9ncmFtLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gbGlzdCB0aGUgYXJndW1lbnRzIGdpdmVuIHRvIHlvdXIgcHJvZ3JhbQord2l0aCBAY29kZXtpbmZvIGFyZ3N9LCBsaXN0IHRoZSByZWdpc3RlcnMgY3VycmVudGx5IGluIHVzZSB3aXRoIEBjb2Rle2luZm8KK3JlZ2lzdGVyc30sIG9yIGxpc3QgdGhlIGJyZWFrcG9pbnRzIHlvdSBoYXZlIHNldCB3aXRoIEBjb2Rle2luZm8gYnJlYWtwb2ludHN9LgorWW91IGNhbiBnZXQgYSBjb21wbGV0ZSBsaXN0IG9mIHRoZSBAY29kZXtpbmZvfSBzdWItY29tbWFuZHMgd2l0aAorQHd7QGNvZGV7aGVscCBpbmZvfX0uCisKK0BraW5kZXggc2V0CitAaXRlbSBzZXQKK1lvdSBjYW4gYXNzaWduIHRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiB0byBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aXRoIAorQGNvZGV7c2V0fS4gIEZvciBleGFtcGxlLCB5b3UgY2FuIHNldCB0aGUgQHZhbHVle0dEQk59IHByb21wdCB0byBhICQtc2lnbiB3aXRoCitAY29kZXtzZXQgcHJvbXB0ICR9LgorCitAa2luZGV4IHNob3cKK0BpdGVtIHNob3cKK0luIGNvbnRyYXN0IHRvIEBjb2Rle2luZm99LCBAY29kZXtzaG93fSBpcyBmb3IgZGVzY3JpYmluZyB0aGUgc3RhdGUgb2YgCitAdmFsdWV7R0RCTn0gaXRzZWxmLgorWW91IGNhbiBjaGFuZ2UgbW9zdCBvZiB0aGUgdGhpbmdzIHlvdSBjYW4gQGNvZGV7c2hvd30sIGJ5IHVzaW5nIHRoZQorcmVsYXRlZCBjb21tYW5kIEBjb2Rle3NldH07IGZvciBleGFtcGxlLCB5b3UgY2FuIGNvbnRyb2wgd2hhdCBudW1iZXIKK3N5c3RlbSBpcyB1c2VkIGZvciBkaXNwbGF5cyB3aXRoIEBjb2Rle3NldCByYWRpeH0sIG9yIHNpbXBseSBpbnF1aXJlCit3aGljaCBpcyBjdXJyZW50bHkgaW4gdXNlIHdpdGggQGNvZGV7c2hvdyByYWRpeH0uCisKK0BraW5kZXggaW5mbyBzZXQKK1RvIGRpc3BsYXkgYWxsIHRoZSBzZXR0YWJsZSBwYXJhbWV0ZXJzIGFuZCB0aGVpciBjdXJyZW50Cit2YWx1ZXMsIHlvdSBjYW4gdXNlIEBjb2Rle3Nob3d9IHdpdGggbm8gYXJndW1lbnRzOyB5b3UgbWF5IGFsc28gdXNlCitAY29kZXtpbmZvIHNldH0uICBCb3RoIGNvbW1hbmRzIHByb2R1Y2UgdGhlIHNhbWUgZGlzcGxheS4KK0BjIEZJWE1FOiAiaW5mbyBzZXQiIHZpb2xhdGVzIHRoZSBydWxlIHRoYXQgImluZm8iIGlzIGZvciBzdGF0ZSBvZgorQGMgRklYTUUuLi5wcm9ncmFtLiAgQ2sgdy8gR05VOiAiaW5mbyBzZXQiIHRvIGJlIGNhbGxlZCBzb21ldGhpbmcgZWxzZSwKK0BjIEZJWE1FLi4ub3IgY2hhbmdlIGRlc2Mgb2YgcnVsZS0tLWVnICJzdGF0ZSBvZiBwcm9nIGFuZCBkZWJ1Z2dpbmcgc2Vzc2lvbiI/CitAZW5kIHRhYmxlCitAYyBAZW5kIGdyb3VwCisKK0hlcmUgYXJlIHRocmVlIG1pc2NlbGxhbmVvdXMgQGNvZGV7c2hvd30gc3ViY29tbWFuZHMsIGFsbCBvZiB3aGljaCBhcmUKK2V4Y2VwdGlvbmFsIGluIGxhY2tpbmcgY29ycmVzcG9uZGluZyBAY29kZXtzZXR9IGNvbW1hbmRzOgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggc2hvdyB2ZXJzaW9uCitAY2luZGV4IHZlcnNpb24gbnVtYmVyCitAaXRlbSBzaG93IHZlcnNpb24KK1Nob3cgd2hhdCB2ZXJzaW9uIG9mIEB2YWx1ZXtHREJOfSBpcyBydW5uaW5nLiAgWW91IHNob3VsZCBpbmNsdWRlIHRoaXMKK2luZm9ybWF0aW9uIGluIEB2YWx1ZXtHREJOfSBidWctcmVwb3J0cy4gIElmIG11bHRpcGxlIHZlcnNpb25zIG9mIEB2YWx1ZXtHREJOfSBhcmUgaW4KK3VzZSBhdCB5b3VyIHNpdGUsIHlvdSBtYXkgb2NjYXNpb25hbGx5IHdhbnQgdG8gZGV0ZXJtaW5lIHdoaWNoIHZlcnNpb24KK29mIEB2YWx1ZXtHREJOfSB5b3UgYXJlIHJ1bm5pbmc7IGFzIEB2YWx1ZXtHREJOfSBldm9sdmVzLCBuZXcgY29tbWFuZHMgYXJlIGludHJvZHVjZWQsCithbmQgb2xkIG9uZXMgbWF5IHdpdGhlciBhd2F5LiAgVGhlIHZlcnNpb24gbnVtYmVyIGlzIGFsc28gYW5ub3VuY2VkCit3aGVuIHlvdSBzdGFydCBAdmFsdWV7R0RCTn0uCisKK0BraW5kZXggc2hvdyBjb3B5aW5nCitAaXRlbSBzaG93IGNvcHlpbmcKK0Rpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgcGVybWlzc2lvbiBmb3IgY29weWluZyBAdmFsdWV7R0RCTn0uCisKK0BraW5kZXggc2hvdyB3YXJyYW50eQorQGl0ZW0gc2hvdyB3YXJyYW50eQorRGlzcGxheSB0aGUgQHNje2dudX0gYGBOTyBXQVJSQU5UWScnIHN0YXRlbWVudC4KK0BlbmQgdGFibGUKKworQG5vZGUgUnVubmluZywgU3RvcHBpbmcsIENvbW1hbmRzLCBUb3AKK0BjaGFwdGVyIFJ1bm5pbmcgUHJvZ3JhbXMgVW5kZXIgQHZhbHVle0dEQk59CisKK1doZW4geW91IHJ1biBhIHByb2dyYW0gdW5kZXIgQHZhbHVle0dEQk59LCB5b3UgbXVzdCBmaXJzdCBnZW5lcmF0ZQorZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoZW4geW91IGNvbXBpbGUgaXQuCitAaWZjbGVhciBCQVJFVEFSR0VUCitZb3UgbWF5IHN0YXJ0IEB2YWx1ZXtHREJOfSB3aXRoIGl0cyBhcmd1bWVudHMsIGlmIGFueSwgaW4gYW4gZW52aXJvbm1lbnQgCitvZiB5b3VyIGNob2ljZS4gIFlvdSBtYXkgcmVkaXJlY3QgeW91ciBwcm9ncmFtJ3MgaW5wdXQgYW5kIG91dHB1dCwgZGVidWcgYW4KK2FscmVhZHkgcnVubmluZyBwcm9jZXNzLCBvciBraWxsIGEgY2hpbGQgcHJvY2Vzcy4KK0BlbmQgaWZjbGVhcgorCitAbWVudQorKiBDb21waWxhdGlvbjo6ICAgICAgICAgICAgICAgICBDb21waWxpbmcgZm9yIGRlYnVnZ2luZworKiBTdGFydGluZzo6ICAgICAgICAgICAgICAgICAgICBTdGFydGluZyB5b3VyIHByb2dyYW0KK0BpZmNsZWFyIEJBUkVUQVJHRVQKKyogQXJndW1lbnRzOjogICAgICAgICAgICAgICAgICAgWW91ciBwcm9ncmFtJ3MgYXJndW1lbnRzCisqIEVudmlyb25tZW50OjogICAgICAgICAgICAgICAgIFlvdXIgcHJvZ3JhbSdzIGVudmlyb25tZW50CitAZW5kIGlmY2xlYXIKKworKiBXb3JraW5nIERpcmVjdG9yeTo6ICAgICAgICAgICBZb3VyIHByb2dyYW0ncyB3b3JraW5nIGRpcmVjdG9yeQorKiBJbnB1dC9PdXRwdXQ6OiAgICAgICAgICAgICAgICBZb3VyIHByb2dyYW0ncyBpbnB1dCBhbmQgb3V0cHV0CisqIEF0dGFjaDo6ICAgICAgICAgICAgICAgICAgICAgIERlYnVnZ2luZyBhbiBhbHJlYWR5LXJ1bm5pbmcgcHJvY2VzcworKiBLaWxsIFByb2Nlc3M6OiAgICAgICAgICAgICAgICBLaWxsaW5nIHRoZSBjaGlsZCBwcm9jZXNzCitAaWZjbGVhciBIUFBBCisqIFByb2Nlc3MgSW5mb3JtYXRpb246OiAgICAgICAgIEFkZGl0aW9uYWwgcHJvY2VzcyBpbmZvcm1hdGlvbgorQGVuZCBpZmNsZWFyCisKKyogVGhyZWFkczo6ICAgICAgICAgICAgICAgICAgICAgRGVidWdnaW5nIHByb2dyYW1zIHdpdGggbXVsdGlwbGUgdGhyZWFkcworKiBQcm9jZXNzZXM6OiAgICAgICAgICAgICAgICAgICBEZWJ1Z2dpbmcgcHJvZ3JhbXMgd2l0aCBtdWx0aXBsZSBwcm9jZXNzZXMKK0BlbmQgbWVudQorCitAbm9kZSBDb21waWxhdGlvbiwgU3RhcnRpbmcsIFJ1bm5pbmcsIFJ1bm5pbmcKK0BzZWN0aW9uIENvbXBpbGluZyBmb3IgZGVidWdnaW5nCisKK0luIG9yZGVyIHRvIGRlYnVnIGEgcHJvZ3JhbSBlZmZlY3RpdmVseSwgeW91IG5lZWQgdG8gZ2VuZXJhdGUKK2RlYnVnZ2luZyBpbmZvcm1hdGlvbiB3aGVuIHlvdSBjb21waWxlIGl0LiAgVGhpcyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KK2lzIHN0b3JlZCBpbiB0aGUgb2JqZWN0IGZpbGU7IGl0IGRlc2NyaWJlcyB0aGUgZGF0YSB0eXBlIG9mIGVhY2gKK3ZhcmlhYmxlIG9yIGZ1bmN0aW9uIGFuZCB0aGUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBzb3VyY2UgbGluZSBudW1iZXJzCithbmQgYWRkcmVzc2VzIGluIHRoZSBleGVjdXRhYmxlIGNvZGUuCisKK1RvIHJlcXVlc3QgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBzcGVjaWZ5IHRoZSBAc2FtcHstZ30gb3B0aW9uIHdoZW4geW91IHJ1bgordGhlIGNvbXBpbGVyLgorCitNYW55IEMgY29tcGlsZXJzIGFyZSB1bmFibGUgdG8gaGFuZGxlIHRoZSBAc2FtcHstZ30gYW5kIEBzYW1wey1PfQorb3B0aW9ucyB0b2dldGhlci4gIFVzaW5nIHRob3NlIGNvbXBpbGVycywgeW91IGNhbm5vdCBnZW5lcmF0ZSBvcHRpbWl6ZWQKK2V4ZWN1dGFibGVzIGNvbnRhaW5pbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uLgorCitAaWZjbGVhciBIUFBBCitAdmFsdWV7TkdDQ30sIHRoZSBAc2N7Z251fSBDIGNvbXBpbGVyLCBzdXBwb3J0cyBAc2FtcHstZ30gd2l0aCBvciB3aXRob3V0CitAZW5kIGlmY2xlYXIKK0BpZnNldCBIUFBBCitUaGUgSFAgQU5TSSBDIGFuZCBDKysgY29tcGlsZXJzLCBhcyB3ZWxsIGFzIEB2YWx1ZXtOR0NDfSwgdGhlIEBzY3tnbnV9IEMKK2NvbXBpbGVyLCBzdXBwb3J0IEBzYW1wey1nfSB3aXRoIG9yIHdpdGhvdXQKK0BlbmQgaWZzZXQKK0BzYW1wey1PfSwgbWFraW5nIGl0IHBvc3NpYmxlIHRvIGRlYnVnIG9wdGltaXplZCBjb2RlLiAgV2UgcmVjb21tZW5kCit0aGF0IHlvdSBAZW1waHthbHdheXN9IHVzZSBAc2FtcHstZ30gd2hlbmV2ZXIgeW91IGNvbXBpbGUgYSBwcm9ncmFtLgorWW91IG1heSB0aGluayB5b3VyIHByb2dyYW0gaXMgY29ycmVjdCwgYnV0IHRoZXJlIGlzIG5vIHNlbnNlIGluIHB1c2hpbmcKK3lvdXIgbHVjay4KKworQGNpbmRleCBvcHRpbWl6ZWQgY29kZSwgZGVidWdnaW5nCitAY2luZGV4IGRlYnVnZ2luZyBvcHRpbWl6ZWQgY29kZQorV2hlbiB5b3UgZGVidWcgYSBwcm9ncmFtIGNvbXBpbGVkIHdpdGggQHNhbXB7LWcgLU99LCByZW1lbWJlciB0aGF0IHRoZQorb3B0aW1pemVyIGlzIHJlYXJyYW5naW5nIHlvdXIgY29kZTsgdGhlIGRlYnVnZ2VyIHNob3dzIHlvdSB3aGF0IGlzCityZWFsbHkgdGhlcmUuICBEbyBub3QgYmUgdG9vIHN1cnByaXNlZCB3aGVuIHRoZSBleGVjdXRpb24gcGF0aCBkb2VzIG5vdAorZXhhY3RseSBtYXRjaCB5b3VyIHNvdXJjZSBmaWxlISAgQW4gZXh0cmVtZSBleGFtcGxlOiBpZiB5b3UgZGVmaW5lIGEKK3ZhcmlhYmxlLCBidXQgbmV2ZXIgdXNlIGl0LCBAdmFsdWV7R0RCTn0gbmV2ZXIgc2VlcyB0aGF0Cit2YXJpYWJsZS0tLWJlY2F1c2UgdGhlIGNvbXBpbGVyIG9wdGltaXplcyBpdCBvdXQgb2YgZXhpc3RlbmNlLgorCitTb21lIHRoaW5ncyBkbyBub3Qgd29yayBhcyB3ZWxsIHdpdGggQHNhbXB7LWcgLU99IGFzIHdpdGgganVzdAorQHNhbXB7LWd9LCBwYXJ0aWN1bGFybHkgb24gbWFjaGluZXMgd2l0aCBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nLiAgSWYgaW4KK2RvdWJ0LCByZWNvbXBpbGUgd2l0aCBAc2FtcHstZ30gYWxvbmUsIGFuZCBpZiB0aGlzIGZpeGVzIHRoZSBwcm9ibGVtLAorcGxlYXNlIHJlcG9ydCBpdCB0byB1cyBhcyBhIGJ1ZyAoaW5jbHVkaW5nIGEgdGVzdCBjYXNlISkuCisKK09sZGVyIHZlcnNpb25zIG9mIHRoZSBAc2N7Z251fSBDIGNvbXBpbGVyIHBlcm1pdHRlZCBhIHZhcmlhbnQgb3B0aW9uCitAd3tAc2FtcHstZ2d9fSBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgQHZhbHVle0dEQk59IG5vIGxvbmdlciBzdXBwb3J0cyB0aGlzCitmb3JtYXQ7IGlmIHlvdXIgQHNje2dudX0gQyBjb21waWxlciBoYXMgdGhpcyBvcHRpb24sIGRvIG5vdCB1c2UgaXQuCisKK0BuZWVkIDIwMDAKK0Bub2RlIFN0YXJ0aW5nLCBBcmd1bWVudHMsIENvbXBpbGF0aW9uLCBSdW5uaW5nCitAc2VjdGlvbiBTdGFydGluZyB5b3VyIHByb2dyYW0KK0BjaW5kZXggc3RhcnRpbmcKK0BjaW5kZXggcnVubmluZworCitAdGFibGUgQGNvZGUKK0BraW5kZXggcnVuCitAaXRlbSBydW4KK0BpdGVteCByCitVc2UgdGhlIEBjb2Rle3J1bn0gY29tbWFuZCB0byBzdGFydCB5b3VyIHByb2dyYW0gdW5kZXIgQHZhbHVle0dEQk59LiAgWW91IG11c3QKK2ZpcnN0IHNwZWNpZnkgdGhlIHByb2dyYW0gbmFtZQorQGlmc2V0IFZYV09SS1MKKyhleGNlcHQgb24gVnhXb3JrcykKK0BlbmQgaWZzZXQKK3dpdGggYW4gYXJndW1lbnQgdG8gQHZhbHVle0dEQk59IChAcHhyZWZ7SW52b2NhdGlvbiwgLEdldHRpbmcgSW4gYW5kCitPdXQgb2YgQHZhbHVle0dEQk59fSksIG9yIGJ5IHVzaW5nIHRoZSBAY29kZXtmaWxlfSBvciBAY29kZXtleGVjLWZpbGV9Citjb21tYW5kIChAcHhyZWZ7RmlsZXMsICxDb21tYW5kcyB0byBzcGVjaWZ5IGZpbGVzfSkuCisKK0BlbmQgdGFibGUKKworQGlmY2xlYXIgQkFSRVRBUkdFVAorSWYgeW91IGFyZSBydW5uaW5nIHlvdXIgcHJvZ3JhbSBpbiBhbiBleGVjdXRpb24gZW52aXJvbm1lbnQgdGhhdAorc3VwcG9ydHMgcHJvY2Vzc2VzLCBAY29kZXtydW59IGNyZWF0ZXMgYW4gaW5mZXJpb3IgcHJvY2VzcyBhbmQgbWFrZXMKK3RoYXQgcHJvY2VzcyBydW4geW91ciBwcm9ncmFtLiAgKEluIGVudmlyb25tZW50cyB3aXRob3V0IHByb2Nlc3NlcywKK0Bjb2Rle3J1bn0ganVtcHMgdG8gdGhlIHN0YXJ0IG9mIHlvdXIgcHJvZ3JhbS4pCisKK1RoZSBleGVjdXRpb24gb2YgYSBwcm9ncmFtIGlzIGFmZmVjdGVkIGJ5IGNlcnRhaW4gaW5mb3JtYXRpb24gaXQKK3JlY2VpdmVzIGZyb20gaXRzIHN1cGVyaW9yLiAgQHZhbHVle0dEQk59IHByb3ZpZGVzIHdheXMgdG8gc3BlY2lmeSB0aGlzCitpbmZvcm1hdGlvbiwgd2hpY2ggeW91IG11c3QgZG8gQGVtcGh7YmVmb3JlfSBzdGFydGluZyB5b3VyIHByb2dyYW0uICAoWW91CitjYW4gY2hhbmdlIGl0IGFmdGVyIHN0YXJ0aW5nIHlvdXIgcHJvZ3JhbSwgYnV0IHN1Y2ggY2hhbmdlcyBvbmx5IGFmZmVjdAoreW91ciBwcm9ncmFtIHRoZSBuZXh0IHRpbWUgeW91IHN0YXJ0IGl0LikgIFRoaXMgaW5mb3JtYXRpb24gbWF5IGJlCitkaXZpZGVkIGludG8gZm91ciBjYXRlZ29yaWVzOgorCitAdGFibGUgQGFzaXMKK0BpdGVtIFRoZSBAZW1waHthcmd1bWVudHMufQorU3BlY2lmeSB0aGUgYXJndW1lbnRzIHRvIGdpdmUgeW91ciBwcm9ncmFtIGFzIHRoZSBhcmd1bWVudHMgb2YgdGhlCitAY29kZXtydW59IGNvbW1hbmQuICBJZiBhIHNoZWxsIGlzIGF2YWlsYWJsZSBvbiB5b3VyIHRhcmdldCwgdGhlIHNoZWxsCitpcyB1c2VkIHRvIHBhc3MgdGhlIGFyZ3VtZW50cywgc28gdGhhdCB5b3UgbWF5IHVzZSBub3JtYWwgY29udmVudGlvbnMKKyhzdWNoIGFzIHdpbGRjYXJkIGV4cGFuc2lvbiBvciB2YXJpYWJsZSBzdWJzdGl0dXRpb24pIGluIGRlc2NyaWJpbmcKK3RoZSBhcmd1bWVudHMuCitJbiBVbml4IHN5c3RlbXMsIHlvdSBjYW4gY29udHJvbCB3aGljaCBzaGVsbCBpcyB1c2VkIHdpdGggdGhlCitAY29kZXtTSEVMTH0gZW52aXJvbm1lbnQgdmFyaWFibGUuCitAeHJlZntBcmd1bWVudHMsICxZb3VyIHByb2dyYW0ncyBhcmd1bWVudHN9LgorCitAaXRlbSBUaGUgQGVtcGh7ZW52aXJvbm1lbnQufQorWW91ciBwcm9ncmFtIG5vcm1hbGx5IGluaGVyaXRzIGl0cyBlbnZpcm9ubWVudCBmcm9tIEB2YWx1ZXtHREJOfSwgYnV0IHlvdSBjYW4KK3VzZSB0aGUgQHZhbHVle0dEQk59IGNvbW1hbmRzIEBjb2Rle3NldCBlbnZpcm9ubWVudH0gYW5kIEBjb2Rle3Vuc2V0CitlbnZpcm9ubWVudH0gdG8gY2hhbmdlIHBhcnRzIG9mIHRoZSBlbnZpcm9ubWVudCB0aGF0IGFmZmVjdAoreW91ciBwcm9ncmFtLiAgQHhyZWZ7RW52aXJvbm1lbnQsICxZb3VyIHByb2dyYW0ncyBlbnZpcm9ubWVudH0uCisKK0BpdGVtIFRoZSBAZW1waHt3b3JraW5nIGRpcmVjdG9yeS59CitZb3VyIHByb2dyYW0gaW5oZXJpdHMgaXRzIHdvcmtpbmcgZGlyZWN0b3J5IGZyb20gQHZhbHVle0dEQk59LiAgWW91IGNhbiBzZXQKK3RoZSBAdmFsdWV7R0RCTn0gd29ya2luZyBkaXJlY3Rvcnkgd2l0aCB0aGUgQGNvZGV7Y2R9IGNvbW1hbmQgaW4gQHZhbHVle0dEQk59LgorQHhyZWZ7V29ya2luZyBEaXJlY3RvcnksICxZb3VyIHByb2dyYW0ncyB3b3JraW5nIGRpcmVjdG9yeX0uCisKK0BpdGVtIFRoZSBAZW1waHtzdGFuZGFyZCBpbnB1dCBhbmQgb3V0cHV0Ln0KK1lvdXIgcHJvZ3JhbSBub3JtYWxseSB1c2VzIHRoZSBzYW1lIGRldmljZSBmb3Igc3RhbmRhcmQgaW5wdXQgYW5kCitzdGFuZGFyZCBvdXRwdXQgYXMgQHZhbHVle0dEQk59IGlzIHVzaW5nLiAgWW91IGNhbiByZWRpcmVjdCBpbnB1dCBhbmQgb3V0cHV0CitpbiB0aGUgQGNvZGV7cnVufSBjb21tYW5kIGxpbmUsIG9yIHlvdSBjYW4gdXNlIHRoZSBAY29kZXt0dHl9IGNvbW1hbmQgdG8KK3NldCBhIGRpZmZlcmVudCBkZXZpY2UgZm9yIHlvdXIgcHJvZ3JhbS4KK0B4cmVme0lucHV0L091dHB1dCwgLFlvdXIgcHJvZ3JhbSdzIGlucHV0IGFuZCBvdXRwdXR9LgorCitAY2luZGV4IHBpcGVzCitAZW1waHtXYXJuaW5nOn0gV2hpbGUgaW5wdXQgYW5kIG91dHB1dCByZWRpcmVjdGlvbiB3b3JrLCB5b3UgY2Fubm90IHVzZQorcGlwZXMgdG8gcGFzcyB0aGUgb3V0cHV0IG9mIHRoZSBwcm9ncmFtIHlvdSBhcmUgZGVidWdnaW5nIHRvIGFub3RoZXIKK3Byb2dyYW07IGlmIHlvdSBhdHRlbXB0IHRoaXMsIEB2YWx1ZXtHREJOfSBpcyBsaWtlbHkgdG8gd2luZCB1cCBkZWJ1Z2dpbmcgdGhlCit3cm9uZyBwcm9ncmFtLgorQGVuZCB0YWJsZQorQGVuZCBpZmNsZWFyCisKK1doZW4geW91IGlzc3VlIHRoZSBAY29kZXtydW59IGNvbW1hbmQsIHlvdXIgcHJvZ3JhbSBiZWdpbnMgdG8gZXhlY3V0ZQoraW1tZWRpYXRlbHkuICBAeHJlZntTdG9wcGluZywgLFN0b3BwaW5nIGFuZCBjb250aW51aW5nfSwgZm9yIGRpc2N1c3Npb24KK29mIGhvdyB0byBhcnJhbmdlIGZvciB5b3VyIHByb2dyYW0gdG8gc3RvcC4gIE9uY2UgeW91ciBwcm9ncmFtIGhhcworc3RvcHBlZCwgeW91IG1heSBjYWxsIGZ1bmN0aW9ucyBpbiB5b3VyIHByb2dyYW0sIHVzaW5nIHRoZSBAY29kZXtwcmludH0KK29yIEBjb2Rle2NhbGx9IGNvbW1hbmRzLiAgQHhyZWZ7RGF0YSwgLEV4YW1pbmluZyBEYXRhfS4KKworSWYgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIHlvdXIgc3ltYm9sIGZpbGUgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKK3RpbWUgQHZhbHVle0dEQk59IHJlYWQgaXRzIHN5bWJvbHMsIEB2YWx1ZXtHREJOfSBkaXNjYXJkcyBpdHMgc3ltYm9sCit0YWJsZSwgYW5kIHJlYWRzIGl0IGFnYWluLiAgV2hlbiBpdCBkb2VzIHRoaXMsIEB2YWx1ZXtHREJOfSB0cmllcyB0byByZXRhaW4KK3lvdXIgY3VycmVudCBicmVha3BvaW50cy4KKworQGlmY2xlYXIgQkFSRVRBUkdFVAorQG5vZGUgQXJndW1lbnRzLCBFbnZpcm9ubWVudCwgU3RhcnRpbmcsIFJ1bm5pbmcKK0BzZWN0aW9uIFlvdXIgcHJvZ3JhbSdzIGFyZ3VtZW50cworCitAY2luZGV4IGFyZ3VtZW50cyAodG8geW91ciBwcm9ncmFtKQorVGhlIGFyZ3VtZW50cyB0byB5b3VyIHByb2dyYW0gY2FuIGJlIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnRzIG9mIHRoZQorQGNvZGV7cnVufSBjb21tYW5kLiAgCitUaGV5IGFyZSBwYXNzZWQgdG8gYSBzaGVsbCwgd2hpY2ggZXhwYW5kcyB3aWxkY2FyZCBjaGFyYWN0ZXJzIGFuZAorcGVyZm9ybXMgcmVkaXJlY3Rpb24gb2YgSS9PLCBhbmQgdGhlbmNlIHRvIHlvdXIgcHJvZ3JhbS4gIFlvdXIKK0Bjb2Rle1NIRUxMfSBlbnZpcm9ubWVudCB2YXJpYWJsZSAoaWYgaXQgZXhpc3RzKSBzcGVjaWZpZXMgd2hhdCBzaGVsbAorQHZhbHVle0dEQk59IHVzZXMuICBJZiB5b3UgZG8gbm90IGRlZmluZSBAY29kZXtTSEVMTH0sIEB2YWx1ZXtHREJOfSB1c2VzCitAY29kZXsvYmluL3NofS4KKworQGNvZGV7cnVufSB3aXRoIG5vIGFyZ3VtZW50cyB1c2VzIHRoZSBzYW1lIGFyZ3VtZW50cyB1c2VkIGJ5IHRoZSBwcmV2aW91cworQGNvZGV7cnVufSwgb3IgdGhvc2Ugc2V0IGJ5IHRoZSBAY29kZXtzZXQgYXJnc30gY29tbWFuZC4KKworQGtpbmRleCBzZXQgYXJncworQHRhYmxlIEBjb2RlCitAaXRlbSBzZXQgYXJncworU3BlY2lmeSB0aGUgYXJndW1lbnRzIHRvIGJlIHVzZWQgdGhlIG5leHQgdGltZSB5b3VyIHByb2dyYW0gaXMgcnVuLiAgSWYKK0Bjb2Rle3NldCBhcmdzfSBoYXMgbm8gYXJndW1lbnRzLCBAY29kZXtydW59IGV4ZWN1dGVzIHlvdXIgcHJvZ3JhbQord2l0aCBubyBhcmd1bWVudHMuICBPbmNlIHlvdSBoYXZlIHJ1biB5b3VyIHByb2dyYW0gd2l0aCBhcmd1bWVudHMsCit1c2luZyBAY29kZXtzZXQgYXJnc30gYmVmb3JlIHRoZSBuZXh0IEBjb2Rle3J1bn0gaXMgdGhlIG9ubHkgd2F5IHRvIHJ1bgoraXQgYWdhaW4gd2l0aG91dCBhcmd1bWVudHMuCisKK0BraW5kZXggc2hvdyBhcmdzCitAaXRlbSBzaG93IGFyZ3MKK1Nob3cgdGhlIGFyZ3VtZW50cyB0byBnaXZlIHlvdXIgcHJvZ3JhbSB3aGVuIGl0IGlzIHN0YXJ0ZWQuCitAZW5kIHRhYmxlCisKK0Bub2RlIEVudmlyb25tZW50LCBXb3JraW5nIERpcmVjdG9yeSwgQXJndW1lbnRzLCBSdW5uaW5nCitAc2VjdGlvbiBZb3VyIHByb2dyYW0ncyBlbnZpcm9ubWVudAorCitAY2luZGV4IGVudmlyb25tZW50IChvZiB5b3VyIHByb2dyYW0pCitUaGUgQGRmbntlbnZpcm9ubWVudH0gY29uc2lzdHMgb2YgYSBzZXQgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZAordGhlaXIgdmFsdWVzLiAgRW52aXJvbm1lbnQgdmFyaWFibGVzIGNvbnZlbnRpb25hbGx5IHJlY29yZCBzdWNoIHRoaW5ncyBhcworeW91ciB1c2VyIG5hbWUsIHlvdXIgaG9tZSBkaXJlY3RvcnksIHlvdXIgdGVybWluYWwgdHlwZSwgYW5kIHlvdXIgc2VhcmNoCitwYXRoIGZvciBwcm9ncmFtcyB0byBydW4uICBVc3VhbGx5IHlvdSBzZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpdGgKK3RoZSBzaGVsbCBhbmQgdGhleSBhcmUgaW5oZXJpdGVkIGJ5IGFsbCB0aGUgb3RoZXIgcHJvZ3JhbXMgeW91IHJ1bi4gIFdoZW4KK2RlYnVnZ2luZywgaXQgY2FuIGJlIHVzZWZ1bCB0byB0cnkgcnVubmluZyB5b3VyIHByb2dyYW0gd2l0aCBhIG1vZGlmaWVkCitlbnZpcm9ubWVudCB3aXRob3V0IGhhdmluZyB0byBzdGFydCBAdmFsdWV7R0RCTn0gb3ZlciBhZ2Fpbi4KKworQHRhYmxlIEBjb2RlCitAa2luZGV4IHBhdGgKK0BpdGVtIHBhdGggQHZhcntkaXJlY3Rvcnl9CitBZGQgQHZhcntkaXJlY3Rvcnl9IHRvIHRoZSBmcm9udCBvZiB0aGUgQGNvZGV7UEFUSH0gZW52aXJvbm1lbnQgdmFyaWFibGUKKyh0aGUgc2VhcmNoIHBhdGggZm9yIGV4ZWN1dGFibGVzKSwgZm9yIGJvdGggQHZhbHVle0dEQk59IGFuZCB5b3VyIHByb2dyYW0uCitZb3UgbWF5IHNwZWNpZnkgc2V2ZXJhbCBkaXJlY3RvcnkgbmFtZXMsIHNlcGFyYXRlZCBieSBAc2FtcHs6fSBvcgord2hpdGVzcGFjZS4gIElmIEB2YXJ7ZGlyZWN0b3J5fSBpcyBhbHJlYWR5IGluIHRoZSBwYXRoLCBpdCBpcyBtb3ZlZCB0bwordGhlIGZyb250LCBzbyBpdCBpcyBzZWFyY2hlZCBzb29uZXIuCisKK1lvdSBjYW4gdXNlIHRoZSBzdHJpbmcgQHNhbXB7JGN3ZH0gdG8gcmVmZXIgdG8gd2hhdGV2ZXIgaXMgdGhlIGN1cnJlbnQKK3dvcmtpbmcgZGlyZWN0b3J5IGF0IHRoZSB0aW1lIEB2YWx1ZXtHREJOfSBzZWFyY2hlcyB0aGUgcGF0aC4gIElmIHlvdQordXNlIEBzYW1wey59IGluc3RlYWQsIGl0IHJlZmVycyB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdSBleGVjdXRlZCB0aGUKK0Bjb2Rle3BhdGh9IGNvbW1hbmQuICBAdmFsdWV7R0RCTn0gcmVwbGFjZXMgQHNhbXB7Ln0gaW4gdGhlCitAdmFye2RpcmVjdG9yeX0gYXJndW1lbnQgKHdpdGggdGhlIGN1cnJlbnQgcGF0aCkgYmVmb3JlIGFkZGluZworQHZhcntkaXJlY3Rvcnl9IHRvIHRoZSBzZWFyY2ggcGF0aC4KK0BjICdwYXRoJyBpcyBleHBsaWNpdGx5IG5vbnJlcGVhdGFibGUsIGJ1dCBSTVMgcG9pbnRzIG91dCBpdCBpcyBzaWxseSB0bworQGMgZG9jdW1lbnQgdGhhdCwgc2luY2UgcmVwZWF0aW5nIGl0IHdvdWxkIGJlIGEgbm8tb3AuCisKK0BraW5kZXggc2hvdyBwYXRocworQGl0ZW0gc2hvdyBwYXRocworRGlzcGxheSB0aGUgbGlzdCBvZiBzZWFyY2ggcGF0aHMgZm9yIGV4ZWN1dGFibGVzICh0aGUgQGNvZGV7UEFUSH0KK2Vudmlyb25tZW50IHZhcmlhYmxlKS4KKworQGtpbmRleCBzaG93IGVudmlyb25tZW50CitAaXRlbSBzaG93IGVudmlyb25tZW50IEBye1t9QHZhcnt2YXJuYW1lfUBye119CitQcmludCB0aGUgdmFsdWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUgQHZhcnt2YXJuYW1lfSB0byBiZSBnaXZlbiB0bworeW91ciBwcm9ncmFtIHdoZW4gaXQgc3RhcnRzLiAgSWYgeW91IGRvIG5vdCBzdXBwbHkgQHZhcnt2YXJuYW1lfSwKK3ByaW50IHRoZSBuYW1lcyBhbmQgdmFsdWVzIG9mIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgZ2l2ZW4gdG8KK3lvdXIgcHJvZ3JhbS4gIFlvdSBjYW4gYWJicmV2aWF0ZSBAY29kZXtlbnZpcm9ubWVudH0gYXMgQGNvZGV7ZW52fS4KKworQGtpbmRleCBzZXQgZW52aXJvbm1lbnQKK0BpdGVtIHNldCBlbnZpcm9ubWVudCBAdmFye3Zhcm5hbWV9IEBye1t9PUBye119IEB2YXJ7dmFsdWV9CitTZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgQHZhcnt2YXJuYW1lfSB0byBAdmFye3ZhbHVlfS4gIFRoZSB2YWx1ZQorY2hhbmdlcyBmb3IgeW91ciBwcm9ncmFtIG9ubHksIG5vdCBmb3IgQHZhbHVle0dEQk59IGl0c2VsZi4gIEB2YXJ7dmFsdWV9IG1heQorYmUgYW55IHN0cmluZzsgdGhlIHZhbHVlcyBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGp1c3Qgc3RyaW5ncywgYW5kCithbnkgaW50ZXJwcmV0YXRpb24gaXMgc3VwcGxpZWQgYnkgeW91ciBwcm9ncmFtIGl0c2VsZi4gIFRoZSBAdmFye3ZhbHVlfQorcGFyYW1ldGVyIGlzIG9wdGlvbmFsOyBpZiBpdCBpcyBlbGltaW5hdGVkLCB0aGUgdmFyaWFibGUgaXMgc2V0IHRvIGEKK251bGwgdmFsdWUuCitAYyAiYW55IHN0cmluZyIgaGVyZSBkb2VzIG5vdCBpbmNsdWRlIGxlYWRpbmcsIHRyYWlsaW5nCitAYyBibGFua3MuIEdudSBhc2tzOiBkb2VzIGFueW9uZSBjYXJlPworCitGb3IgZXhhbXBsZSwgdGhpcyBjb21tYW5kOgorCitAZXhhbXBsZQorc2V0IGVudiBVU0VSID0gZm9vCitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50Cit0ZWxscyBhIFVuaXggcHJvZ3JhbSwgd2hlbiBzdWJzZXF1ZW50bHkgcnVuLCB0aGF0IGl0cyB1c2VyIGlzIG5hbWVkCitAc2FtcHtmb299LiAgKFRoZSBzcGFjZXMgYXJvdW5kIEBzYW1wez19IGFyZSB1c2VkIGZvciBjbGFyaXR5IGhlcmU7IHRoZXkKK2FyZSBub3QgYWN0dWFsbHkgcmVxdWlyZWQuKQorCitAa2luZGV4IHVuc2V0IGVudmlyb25tZW50CitAaXRlbSB1bnNldCBlbnZpcm9ubWVudCBAdmFye3Zhcm5hbWV9CitSZW1vdmUgdmFyaWFibGUgQHZhcnt2YXJuYW1lfSBmcm9tIHRoZSBlbnZpcm9ubWVudCB0byBiZSBwYXNzZWQgdG8geW91cgorcHJvZ3JhbS4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gQHNhbXB7c2V0IGVudiBAdmFye3Zhcm5hbWV9ID19OworQGNvZGV7dW5zZXQgZW52aXJvbm1lbnR9IHJlbW92ZXMgdGhlIHZhcmlhYmxlIGZyb20gdGhlIGVudmlyb25tZW50LAorcmF0aGVyIHRoYW4gYXNzaWduaW5nIGl0IGFuIGVtcHR5IHZhbHVlLgorQGVuZCB0YWJsZQorCitAZW1waHtXYXJuaW5nOn0gQHZhbHVle0dEQk59IHJ1bnMgeW91ciBwcm9ncmFtIHVzaW5nIHRoZSBzaGVsbCBpbmRpY2F0ZWQKK2J5IHlvdXIgQGNvZGV7U0hFTEx9IGVudmlyb25tZW50IHZhcmlhYmxlIGlmIGl0IGV4aXN0cyAob3IKK0Bjb2Rley9iaW4vc2h9IGlmIG5vdCkuICBJZiB5b3VyIEBjb2Rle1NIRUxMfSB2YXJpYWJsZSBuYW1lcyBhIHNoZWxsCit0aGF0IHJ1bnMgYW4gaW5pdGlhbGl6YXRpb24gZmlsZS0tLXN1Y2ggYXMgQGZpbGV7LmNzaHJjfSBmb3IgQy1zaGVsbCwgb3IKK0BmaWxley5iYXNocmN9IGZvciBCQVNILS0tYW55IHZhcmlhYmxlcyB5b3Ugc2V0IGluIHRoYXQgZmlsZSBhZmZlY3QKK3lvdXIgcHJvZ3JhbS4gIFlvdSBtYXkgd2lzaCB0byBtb3ZlIHNldHRpbmcgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvCitmaWxlcyB0aGF0IGFyZSBvbmx5IHJ1biB3aGVuIHlvdSBzaWduIG9uLCBzdWNoIGFzIEBmaWxley5sb2dpbn0gb3IKK0BmaWxley5wcm9maWxlfS4KKworQG5vZGUgV29ya2luZyBEaXJlY3RvcnksIElucHV0L091dHB1dCwgRW52aXJvbm1lbnQsIFJ1bm5pbmcKK0BzZWN0aW9uIFlvdXIgcHJvZ3JhbSdzIHdvcmtpbmcgZGlyZWN0b3J5CisKK0BjaW5kZXggd29ya2luZyBkaXJlY3RvcnkgKG9mIHlvdXIgcHJvZ3JhbSkKK0VhY2ggdGltZSB5b3Ugc3RhcnQgeW91ciBwcm9ncmFtIHdpdGggQGNvZGV7cnVufSwgaXQgaW5oZXJpdHMgaXRzCit3b3JraW5nIGRpcmVjdG9yeSBmcm9tIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IG9mIEB2YWx1ZXtHREJOfS4KK1RoZSBAdmFsdWV7R0RCTn0gd29ya2luZyBkaXJlY3RvcnkgaXMgaW5pdGlhbGx5IHdoYXRldmVyIGl0IGluaGVyaXRlZAorZnJvbSBpdHMgcGFyZW50IHByb2Nlc3MgKHR5cGljYWxseSB0aGUgc2hlbGwpLCBidXQgeW91IGNhbiBzcGVjaWZ5IGEgbmV3Cit3b3JraW5nIGRpcmVjdG9yeSBpbiBAdmFsdWV7R0RCTn0gd2l0aCB0aGUgQGNvZGV7Y2R9IGNvbW1hbmQuCisKK1RoZSBAdmFsdWV7R0RCTn0gd29ya2luZyBkaXJlY3RvcnkgYWxzbyBzZXJ2ZXMgYXMgYSBkZWZhdWx0IGZvciB0aGUgY29tbWFuZHMKK3RoYXQgc3BlY2lmeSBmaWxlcyBmb3IgQHZhbHVle0dEQk59IHRvIG9wZXJhdGUgb24uICBAeHJlZntGaWxlcywgLENvbW1hbmRzIHRvCitzcGVjaWZ5IGZpbGVzfS4KKworQHRhYmxlIEBjb2RlCitAa2luZGV4IGNkCitAaXRlbSBjZCBAdmFye2RpcmVjdG9yeX0KK1NldCB0aGUgQHZhbHVle0dEQk59IHdvcmtpbmcgZGlyZWN0b3J5IHRvIEB2YXJ7ZGlyZWN0b3J5fS4KKworQGtpbmRleCBwd2QKK0BpdGVtIHB3ZAorUHJpbnQgdGhlIEB2YWx1ZXtHREJOfSB3b3JraW5nIGRpcmVjdG9yeS4KK0BlbmQgdGFibGUKKworQG5vZGUgSW5wdXQvT3V0cHV0LCBBdHRhY2gsIFdvcmtpbmcgRGlyZWN0b3J5LCBSdW5uaW5nCitAc2VjdGlvbiBZb3VyIHByb2dyYW0ncyBpbnB1dCBhbmQgb3V0cHV0CisKK0BjaW5kZXggcmVkaXJlY3Rpb24KK0BjaW5kZXggaS9vCitAY2luZGV4IHRlcm1pbmFsCitCeSBkZWZhdWx0LCB0aGUgcHJvZ3JhbSB5b3UgcnVuIHVuZGVyIEB2YWx1ZXtHREJOfSBkb2VzIGlucHV0IGFuZCBvdXRwdXQgdG8KK3RoZSBzYW1lIHRlcm1pbmFsIHRoYXQgQHZhbHVle0dEQk59IHVzZXMuICBAdmFsdWV7R0RCTn0gc3dpdGNoZXMgdGhlIHRlcm1pbmFsIAordG8gaXRzIG93biB0ZXJtaW5hbCBtb2RlcyB0byBpbnRlcmFjdCB3aXRoIHlvdSwgYnV0IGl0IHJlY29yZHMgdGhlIHRlcm1pbmFsCittb2RlcyB5b3VyIHByb2dyYW0gd2FzIHVzaW5nIGFuZCBzd2l0Y2hlcyBiYWNrIHRvIHRoZW0gd2hlbiB5b3UgY29udGludWUKK3J1bm5pbmcgeW91ciBwcm9ncmFtLgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggaW5mbyB0ZXJtaW5hbAorQGl0ZW0gaW5mbyB0ZXJtaW5hbAorRGlzcGxheXMgaW5mb3JtYXRpb24gcmVjb3JkZWQgYnkgQHZhbHVle0dEQk59IGFib3V0IHRoZSB0ZXJtaW5hbCBtb2RlcyB5b3VyCitwcm9ncmFtIGlzIHVzaW5nLgorQGVuZCB0YWJsZQorCitZb3UgY2FuIHJlZGlyZWN0IHlvdXIgcHJvZ3JhbSdzIGlucHV0IGFuZC9vciBvdXRwdXQgdXNpbmcgc2hlbGwKK3JlZGlyZWN0aW9uIHdpdGggdGhlIEBjb2Rle3J1bn0gY29tbWFuZC4gIEZvciBleGFtcGxlLAorCitAZXhhbXBsZQorcnVuID4gb3V0ZmlsZQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorc3RhcnRzIHlvdXIgcHJvZ3JhbSwgZGl2ZXJ0aW5nIGl0cyBvdXRwdXQgdG8gdGhlIGZpbGUgQGZpbGV7b3V0ZmlsZX0uCisKK0BraW5kZXggdHR5CitAY2luZGV4IGNvbnRyb2xsaW5nIHRlcm1pbmFsCitBbm90aGVyIHdheSB0byBzcGVjaWZ5IHdoZXJlIHlvdXIgcHJvZ3JhbSBzaG91bGQgZG8gaW5wdXQgYW5kIG91dHB1dCBpcword2l0aCB0aGUgQGNvZGV7dHR5fSBjb21tYW5kLiAgVGhpcyBjb21tYW5kIGFjY2VwdHMgYSBmaWxlIG5hbWUgYXMKK2FyZ3VtZW50LCBhbmQgY2F1c2VzIHRoaXMgZmlsZSB0byBiZSB0aGUgZGVmYXVsdCBmb3IgZnV0dXJlIEBjb2Rle3J1bn0KK2NvbW1hbmRzLiAgSXQgYWxzbyByZXNldHMgdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsIGZvciB0aGUgY2hpbGQKK3Byb2Nlc3MsIGZvciBmdXR1cmUgQGNvZGV7cnVufSBjb21tYW5kcy4gIEZvciBleGFtcGxlLAorCitAZXhhbXBsZQordHR5IC9kZXYvdHR5YgorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorZGlyZWN0cyB0aGF0IHByb2Nlc3NlcyBzdGFydGVkIHdpdGggc3Vic2VxdWVudCBAY29kZXtydW59IGNvbW1hbmRzCitkZWZhdWx0IHRvIGRvIGlucHV0IGFuZCBvdXRwdXQgb24gdGhlIHRlcm1pbmFsIEBmaWxley9kZXYvdHR5Yn0gYW5kIGhhdmUKK3RoYXQgYXMgdGhlaXIgY29udHJvbGxpbmcgdGVybWluYWwuCisKK0FuIGV4cGxpY2l0IHJlZGlyZWN0aW9uIGluIEBjb2Rle3J1bn0gb3ZlcnJpZGVzIHRoZSBAY29kZXt0dHl9IGNvbW1hbmQncworZWZmZWN0IG9uIHRoZSBpbnB1dC9vdXRwdXQgZGV2aWNlLCBidXQgbm90IGl0cyBlZmZlY3Qgb24gdGhlIGNvbnRyb2xsaW5nCit0ZXJtaW5hbC4KKworV2hlbiB5b3UgdXNlIHRoZSBAY29kZXt0dHl9IGNvbW1hbmQgb3IgcmVkaXJlY3QgaW5wdXQgaW4gdGhlIEBjb2Rle3J1bn0KK2NvbW1hbmQsIG9ubHkgdGhlIGlucHV0IEBlbXBoe2ZvciB5b3VyIHByb2dyYW19IGlzIGFmZmVjdGVkLiAgVGhlIGlucHV0Citmb3IgQHZhbHVle0dEQk59IHN0aWxsIGNvbWVzIGZyb20geW91ciB0ZXJtaW5hbC4KKworQG5vZGUgQXR0YWNoLCBLaWxsIFByb2Nlc3MsIElucHV0L091dHB1dCwgUnVubmluZworQHNlY3Rpb24gRGVidWdnaW5nIGFuIGFscmVhZHktcnVubmluZyBwcm9jZXNzCitAa2luZGV4IGF0dGFjaAorQGNpbmRleCBhdHRhY2gKKworQHRhYmxlIEBjb2RlCitAaXRlbSBhdHRhY2ggQHZhcntwcm9jZXNzLWlkfQorVGhpcyBjb21tYW5kIGF0dGFjaGVzIHRvIGEgcnVubmluZyBwcm9jZXNzLS0tb25lIHRoYXQgd2FzIHN0YXJ0ZWQKK291dHNpZGUgQHZhbHVle0dEQk59LiAgKEBjb2Rle2luZm8gZmlsZXN9IHNob3dzIHlvdXIgYWN0aXZlCit0YXJnZXRzLikgIFRoZSBjb21tYW5kIHRha2VzIGFzIGFyZ3VtZW50IGEgcHJvY2VzcyBJRC4gIFRoZSB1c3VhbCB3YXkgdG8KK2ZpbmQgb3V0IHRoZSBwcm9jZXNzLWlkIG9mIGEgVW5peCBwcm9jZXNzIGlzIHdpdGggdGhlIEBjb2Rle3BzfSB1dGlsaXR5LAorb3Igd2l0aCB0aGUgQHNhbXB7am9icyAtbH0gc2hlbGwgY29tbWFuZC4KKworQGNvZGV7YXR0YWNofSBkb2VzIG5vdCByZXBlYXQgaWYgeW91IHByZXNzIEBrZXl7UkVUfSBhIHNlY29uZCB0aW1lIGFmdGVyCitleGVjdXRpbmcgdGhlIGNvbW1hbmQuCitAZW5kIHRhYmxlCisKK1RvIHVzZSBAY29kZXthdHRhY2h9LCB5b3VyIHByb2dyYW0gbXVzdCBiZSBydW5uaW5nIGluIGFuIGVudmlyb25tZW50Cit3aGljaCBzdXBwb3J0cyBwcm9jZXNzZXM7IGZvciBleGFtcGxlLCBAY29kZXthdHRhY2h9IGRvZXMgbm90IHdvcmsgZm9yCitwcm9ncmFtcyBvbiBiYXJlLWJvYXJkIHRhcmdldHMgdGhhdCBsYWNrIGFuIG9wZXJhdGluZyBzeXN0ZW0uICBZb3UgbXVzdAorYWxzbyBoYXZlIHBlcm1pc3Npb24gdG8gc2VuZCB0aGUgcHJvY2VzcyBhIHNpZ25hbC4KKworV2hlbiB5b3UgdXNlIEBjb2Rle2F0dGFjaH0sIHRoZSBkZWJ1Z2dlciBmaW5kcyB0aGUgcHJvZ3JhbSBydW5uaW5nIGluCit0aGUgcHJvY2VzcyBmaXJzdCBieSBsb29raW5nIGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCB0aGVuIChpZgordGhlIHByb2dyYW0gaXMgbm90IGZvdW5kKSBieSB1c2luZyB0aGUgc291cmNlIGZpbGUgc2VhcmNoIHBhdGgKKyhAcHhyZWZ7U291cmNlIFBhdGgsICxTcGVjaWZ5aW5nIHNvdXJjZSBkaXJlY3Rvcmllc30pLiAgWW91IGNhbiBhbHNvIHVzZQordGhlIEBjb2Rle2ZpbGV9IGNvbW1hbmQgdG8gbG9hZCB0aGUgcHJvZ3JhbS4gIEB4cmVme0ZpbGVzLCAsQ29tbWFuZHMgdG8KK1NwZWNpZnkgRmlsZXN9LgorCitUaGUgZmlyc3QgdGhpbmcgQHZhbHVle0dEQk59IGRvZXMgYWZ0ZXIgYXJyYW5naW5nIHRvIGRlYnVnIHRoZSBzcGVjaWZpZWQKK3Byb2Nlc3MgaXMgdG8gc3RvcCBpdC4gIFlvdSBjYW4gZXhhbWluZSBhbmQgbW9kaWZ5IGFuIGF0dGFjaGVkIHByb2Nlc3MKK3dpdGggYWxsIHRoZSBAdmFsdWV7R0RCTn0gY29tbWFuZHMgdGhhdCBhcmUgb3JkaW5hcmlseSBhdmFpbGFibGUgd2hlbiB5b3Ugc3RhcnQKK0BpZmNsZWFyIEhQUEEKK3Byb2Nlc3NlcyB3aXRoIEBjb2Rle3J1bn0uICBZb3UgY2FuIGluc2VydCBicmVha3BvaW50czsgeW91IGNhbiBzdGVwIGFuZAorQGVuZCBpZmNsZWFyCitAaWZzZXQgSFBQQQorcHJvY2Vzc2VzIHdpdGggQGNvZGV7cnVufS4gIFlvdSBjYW4gaW5zZXJ0IGJyZWFrcG9pbnRzIChleGNlcHQgaW4gc2hhcmVkCitsaWJyYXJpZXMpOyB5b3UgY2FuIHN0ZXAgYW5kCitAZW5kIGlmc2V0Citjb250aW51ZTsgeW91IGNhbiBtb2RpZnkgc3RvcmFnZS4gIElmIHlvdSB3b3VsZCByYXRoZXIgdGhlIHByb2Nlc3MKK2NvbnRpbnVlIHJ1bm5pbmcsIHlvdSBtYXkgdXNlIHRoZSBAY29kZXtjb250aW51ZX0gY29tbWFuZCBhZnRlcgorYXR0YWNoaW5nIEB2YWx1ZXtHREJOfSB0byB0aGUgcHJvY2Vzcy4KKworQHRhYmxlIEBjb2RlCitAa2luZGV4IGRldGFjaAorQGl0ZW0gZGV0YWNoCitXaGVuIHlvdSBoYXZlIGZpbmlzaGVkIGRlYnVnZ2luZyB0aGUgYXR0YWNoZWQgcHJvY2VzcywgeW91IGNhbiB1c2UgdGhlCitAY29kZXtkZXRhY2h9IGNvbW1hbmQgdG8gcmVsZWFzZSBpdCBmcm9tIEB2YWx1ZXtHREJOfSBjb250cm9sLiAgRGV0YWNoaW5nCit0aGUgcHJvY2VzcyBjb250aW51ZXMgaXRzIGV4ZWN1dGlvbi4gIEFmdGVyIHRoZSBAY29kZXtkZXRhY2h9IGNvbW1hbmQsCit0aGF0IHByb2Nlc3MgYW5kIEB2YWx1ZXtHREJOfSBiZWNvbWUgY29tcGxldGVseSBpbmRlcGVuZGVudCBvbmNlIG1vcmUsIGFuZCB5b3UKK2FyZSByZWFkeSB0byBAY29kZXthdHRhY2h9IGFub3RoZXIgcHJvY2VzcyBvciBzdGFydCBvbmUgd2l0aCBAY29kZXtydW59LgorQGNvZGV7ZGV0YWNofSBkb2VzIG5vdCByZXBlYXQgaWYgeW91IHByZXNzIEBrZXl7UkVUfSBhZ2FpbiBhZnRlcgorZXhlY3V0aW5nIHRoZSBjb21tYW5kLgorQGVuZCB0YWJsZQorCitJZiB5b3UgZXhpdCBAdmFsdWV7R0RCTn0gb3IgdXNlIHRoZSBAY29kZXtydW59IGNvbW1hbmQgd2hpbGUgeW91IGhhdmUgYW4KK2F0dGFjaGVkIHByb2Nlc3MsIHlvdSBraWxsIHRoYXQgcHJvY2Vzcy4gIEJ5IGRlZmF1bHQsIEB2YWx1ZXtHREJOfSBhc2tzCitmb3IgY29uZmlybWF0aW9uIGlmIHlvdSB0cnkgdG8gZG8gZWl0aGVyIG9mIHRoZXNlIHRoaW5nczsgeW91IGNhbgorY29udHJvbCB3aGV0aGVyIG9yIG5vdCB5b3UgbmVlZCB0byBjb25maXJtIGJ5IHVzaW5nIHRoZSBAY29kZXtzZXQKK2NvbmZpcm19IGNvbW1hbmQgKEBweHJlZntNZXNzYWdlcy9XYXJuaW5ncywgLE9wdGlvbmFsIHdhcm5pbmdzIGFuZAorbWVzc2FnZXN9KS4KKworQGlmc2V0IEhQUEEKK0Bub2RlIEtpbGwgUHJvY2VzcywgVGhyZWFkcywgQXR0YWNoLCBSdW5uaW5nCitAc2VjdGlvbiBLaWxsaW5nIHRoZSBjaGlsZCBwcm9jZXNzCitAZW5kIGlmc2V0CitAaWZjbGVhciBIUFBBCitAbm9kZSBLaWxsIFByb2Nlc3MsIFByb2Nlc3MgSW5mb3JtYXRpb24sIEF0dGFjaCwgUnVubmluZworQHNlY3Rpb24gS2lsbGluZyB0aGUgY2hpbGQgcHJvY2VzcworQGVuZCBpZmNsZWFyCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBraWxsCitAaXRlbSBraWxsCitLaWxsIHRoZSBjaGlsZCBwcm9jZXNzIGluIHdoaWNoIHlvdXIgcHJvZ3JhbSBpcyBydW5uaW5nIHVuZGVyIEB2YWx1ZXtHREJOfS4KK0BlbmQgdGFibGUKKworVGhpcyBjb21tYW5kIGlzIHVzZWZ1bCBpZiB5b3Ugd2lzaCB0byBkZWJ1ZyBhIGNvcmUgZHVtcCBpbnN0ZWFkIG9mIGEKK3J1bm5pbmcgcHJvY2Vzcy4gIEB2YWx1ZXtHREJOfSBpZ25vcmVzIGFueSBjb3JlIGR1bXAgZmlsZSB3aGlsZSB5b3VyIHByb2dyYW0KK2lzIHJ1bm5pbmcuCisKK09uIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMsIGEgcHJvZ3JhbSBjYW5ub3QgYmUgZXhlY3V0ZWQgb3V0c2lkZSBAdmFsdWV7R0RCTn0KK3doaWxlIHlvdSBoYXZlIGJyZWFrcG9pbnRzIHNldCBvbiBpdCBpbnNpZGUgQHZhbHVle0dEQk59LiAgWW91IGNhbiB1c2UgdGhlCitAY29kZXtraWxsfSBjb21tYW5kIGluIHRoaXMgc2l0dWF0aW9uIHRvIHBlcm1pdCBydW5uaW5nIHlvdXIgcHJvZ3JhbQorb3V0c2lkZSB0aGUgZGVidWdnZXIuCisKK1RoZSBAY29kZXtraWxsfSBjb21tYW5kIGlzIGFsc28gdXNlZnVsIGlmIHlvdSB3aXNoIHRvIHJlY29tcGlsZSBhbmQKK3JlbGluayB5b3VyIHByb2dyYW0sIHNpbmNlIG9uIG1hbnkgc3lzdGVtcyBpdCBpcyBpbXBvc3NpYmxlIHRvIG1vZGlmeSBhbgorZXhlY3V0YWJsZSBmaWxlIHdoaWxlIGl0IGlzIHJ1bm5pbmcgaW4gYSBwcm9jZXNzLiAgSW4gdGhpcyBjYXNlLCB3aGVuIHlvdQorbmV4dCB0eXBlIEBjb2Rle3J1bn0sIEB2YWx1ZXtHREJOfSBub3RpY2VzIHRoYXQgdGhlIGZpbGUgaGFzIGNoYW5nZWQsIGFuZAorcmVhZHMgdGhlIHN5bWJvbCB0YWJsZSBhZ2FpbiAod2hpbGUgdHJ5aW5nIHRvIHByZXNlcnZlIHlvdXIgY3VycmVudAorYnJlYWtwb2ludCBzZXR0aW5ncykuCisKK0BpZmNsZWFyIEhQUEEKK0Bub2RlIFByb2Nlc3MgSW5mb3JtYXRpb24sIFRocmVhZHMsIEtpbGwgUHJvY2VzcywgUnVubmluZworQHNlY3Rpb24gQWRkaXRpb25hbCBwcm9jZXNzIGluZm9ybWF0aW9uCisKK0BraW5kZXggL3Byb2MKK0BjaW5kZXggcHJvY2VzcyBpbWFnZQorU29tZSBvcGVyYXRpbmcgc3lzdGVtcyBwcm92aWRlIGEgZmFjaWxpdHkgY2FsbGVkIEBzYW1wey9wcm9jfSB0aGF0IGNhbgorYmUgdXNlZCB0byBleGFtaW5lIHRoZSBpbWFnZSBvZiBhIHJ1bm5pbmcgcHJvY2VzcyB1c2luZyBmaWxlLXN5c3RlbQorc3Vicm91dGluZXMuICBJZiBAdmFsdWV7R0RCTn0gaXMgY29uZmlndXJlZCBmb3IgYW4gb3BlcmF0aW5nIHN5c3RlbSB3aXRoIHRoaXMKK2ZhY2lsaXR5LCB0aGUgY29tbWFuZCBAY29kZXtpbmZvIHByb2N9IGlzIGF2YWlsYWJsZSB0byByZXBvcnQgb24gc2V2ZXJhbAora2luZHMgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2Nlc3MgcnVubmluZyB5b3VyIHByb2dyYW0uICAKK0Bjb2Rle2luZm8gcHJvY30gd29ya3Mgb25seSBvbiBTVlI0IHN5c3RlbXMgdGhhdCBzdXBwb3J0IEBjb2Rle3Byb2Nmc30uCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBpbmZvIHByb2MKK0BpdGVtIGluZm8gcHJvYworU3VtbWFyaXplIGF2YWlsYWJsZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvY2Vzcy4KKworQGtpbmRleCBpbmZvIHByb2MgbWFwcGluZ3MKK0BpdGVtIGluZm8gcHJvYyBtYXBwaW5ncworUmVwb3J0IG9uIHRoZSBhZGRyZXNzIHJhbmdlcyBhY2Nlc3NpYmxlIGluIHRoZSBwcm9ncmFtLCB3aXRoIGluZm9ybWF0aW9uCitvbiB3aGV0aGVyIHlvdXIgcHJvZ3JhbSBtYXkgcmVhZCwgd3JpdGUsIG9yIGV4ZWN1dGUgZWFjaCByYW5nZS4KKworQGtpbmRleCBpbmZvIHByb2MgdGltZXMKK0BpdGVtIGluZm8gcHJvYyB0aW1lcworU3RhcnRpbmcgdGltZSwgdXNlciBDUFUgdGltZSwgYW5kIHN5c3RlbSBDUFUgdGltZSBmb3IgeW91ciBwcm9ncmFtIGFuZAoraXRzIGNoaWxkcmVuLgorCitAa2luZGV4IGluZm8gcHJvYyBpZAorQGl0ZW0gaW5mbyBwcm9jIGlkCitSZXBvcnQgb24gdGhlIHByb2Nlc3MgSURzIHJlbGF0ZWQgdG8geW91ciBwcm9ncmFtOiBpdHMgb3duIHByb2Nlc3MgSUQsCit0aGUgSUQgb2YgaXRzIHBhcmVudCwgdGhlIHByb2Nlc3MgZ3JvdXAgSUQsIGFuZCB0aGUgc2Vzc2lvbiBJRC4KKworQGtpbmRleCBpbmZvIHByb2Mgc3RhdHVzCitAaXRlbSBpbmZvIHByb2Mgc3RhdHVzCitHZW5lcmFsIGluZm9ybWF0aW9uIG9uIHRoZSBzdGF0ZSBvZiB0aGUgcHJvY2Vzcy4gIElmIHRoZSBwcm9jZXNzIGlzCitzdG9wcGVkLCB0aGlzIHJlcG9ydCBpbmNsdWRlcyB0aGUgcmVhc29uIGZvciBzdG9wcGluZywgYW5kIGFueSBzaWduYWwKK3JlY2VpdmVkLgorCitAaXRlbSBpbmZvIHByb2MgYWxsCitTaG93IGFsbCB0aGUgYWJvdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2Nlc3MuCitAZW5kIHRhYmxlCitAZW5kIGlmY2xlYXIKKworQGlmc2V0IEhQUEEKK0Bub2RlIFRocmVhZHMsIFByb2Nlc3NlcywgS2lsbCBQcm9jZXNzLCBSdW5uaW5nCitAc2VjdGlvbiBEZWJ1Z2dpbmcgcHJvZ3JhbXMgd2l0aCBtdWx0aXBsZSB0aHJlYWRzCitAZW5kIGlmc2V0CitAaWZjbGVhciBIUFBBCitAbm9kZSBUaHJlYWRzLCBQcm9jZXNzZXMsIFByb2Nlc3MgSW5mb3JtYXRpb24sIFJ1bm5pbmcKK0BzZWN0aW9uIERlYnVnZ2luZyBwcm9ncmFtcyB3aXRoIG11bHRpcGxlIHRocmVhZHMKK0BlbmQgaWZjbGVhcgorCitAY2luZGV4IHRocmVhZHMgb2YgZXhlY3V0aW9uCitAY2luZGV4IG11bHRpcGxlIHRocmVhZHMKK0BjaW5kZXggc3dpdGNoaW5nIHRocmVhZHMKK0luIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMsIHN1Y2ggYXMgSFAtVVggYW5kIFNvbGFyaXMsIGEgc2luZ2xlIHByb2dyYW0KK21heSBoYXZlIG1vcmUgdGhhbiBvbmUgQGRmbnt0aHJlYWR9IG9mIGV4ZWN1dGlvbi4gIFRoZSBwcmVjaXNlIHNlbWFudGljcworb2YgdGhyZWFkcyBkaWZmZXIgZnJvbSBvbmUgb3BlcmF0aW5nIHN5c3RlbSB0byBhbm90aGVyLCBidXQgaW4gZ2VuZXJhbAordGhlIHRocmVhZHMgb2YgYSBzaW5nbGUgcHJvZ3JhbSBhcmUgYWtpbiB0byBtdWx0aXBsZSBwcm9jZXNzZXMtLS1leGNlcHQKK3RoYXQgdGhleSBzaGFyZSBvbmUgYWRkcmVzcyBzcGFjZSAodGhhdCBpcywgdGhleSBjYW4gYWxsIGV4YW1pbmUgYW5kCittb2RpZnkgdGhlIHNhbWUgdmFyaWFibGVzKS4gIE9uIHRoZSBvdGhlciBoYW5kLCBlYWNoIHRocmVhZCBoYXMgaXRzIG93bgorcmVnaXN0ZXJzIGFuZCBleGVjdXRpb24gc3RhY2ssIGFuZCBwZXJoYXBzIHByaXZhdGUgbWVtb3J5LgorCitAdmFsdWV7R0RCTn0gcHJvdmlkZXMgdGhlc2UgZmFjaWxpdGllcyBmb3IgZGVidWdnaW5nIG11bHRpLXRocmVhZAorcHJvZ3JhbXM6CisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtIGF1dG9tYXRpYyBub3RpZmljYXRpb24gb2YgbmV3IHRocmVhZHMKK0BpdGVtIEBzYW1we3RocmVhZCBAdmFye3RocmVhZG5vfX0sIGEgY29tbWFuZCB0byBzd2l0Y2ggYW1vbmcgdGhyZWFkcworQGl0ZW0gQHNhbXB7aW5mbyB0aHJlYWRzfSwgYSBjb21tYW5kIHRvIGlucXVpcmUgYWJvdXQgZXhpc3RpbmcgdGhyZWFkcworQGl0ZW0gQHNhbXB7dGhyZWFkIGFwcGx5IFtAdmFye3RocmVhZG5vfV0gW0B2YXJ7YWxsfV0gQHZhcnthcmdzfX0sIAorYSBjb21tYW5kIHRvIGFwcGx5IGEgY29tbWFuZCB0byBhIGxpc3Qgb2YgdGhyZWFkcworQGl0ZW0gdGhyZWFkLXNwZWNpZmljIGJyZWFrcG9pbnRzCitAZW5kIGl0ZW1pemUKKworQGlmY2xlYXIgSFBQQQorQHF1b3RhdGlvbgorQGVtcGh7V2FybmluZzp9IFRoZXNlIGZhY2lsaXRpZXMgYXJlIG5vdCB5ZXQgYXZhaWxhYmxlIG9uIGV2ZXJ5CitAdmFsdWV7R0RCTn0gY29uZmlndXJhdGlvbiB3aGVyZSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBzdXBwb3J0cyB0aHJlYWRzLgorSWYgeW91ciBAdmFsdWV7R0RCTn0gZG9lcyBub3Qgc3VwcG9ydCB0aHJlYWRzLCB0aGVzZSBjb21tYW5kcyBoYXZlIG5vCitlZmZlY3QuICBGb3IgZXhhbXBsZSwgYSBzeXN0ZW0gd2l0aG91dCB0aHJlYWQgc3VwcG9ydCBzaG93cyBubyBvdXRwdXQKK2Zyb20gQHNhbXB7aW5mbyB0aHJlYWRzfSwgYW5kIGFsd2F5cyByZWplY3RzIHRoZSBAY29kZXt0aHJlYWR9IGNvbW1hbmQsCitsaWtlIHRoaXM6CisKK0BzbWFsbGV4YW1wbGUKKyhAdmFsdWV7R0RCUH0pIGluZm8gdGhyZWFkcworKEB2YWx1ZXtHREJQfSkgdGhyZWFkIDEKK1RocmVhZCBJRCAxIG5vdCBrbm93bi4gIFVzZSB0aGUgImluZm8gdGhyZWFkcyIgY29tbWFuZCB0bworc2VlIHRoZSBJRHMgb2YgY3VycmVudGx5IGtub3duIHRocmVhZHMuCitAZW5kIHNtYWxsZXhhbXBsZQorQGMgRklYTUUgdG8gaW1wbGVtZW50b3JzOiBob3cgaGFyZCB3b3VsZCBpdCBiZSB0byBzYXkgInNvcnJ5LCB0aGlzIEdEQgorQGMgICAgICAgICAgICAgICAgICAgICAgICBkb2Vzbid0IHN1cHBvcnQgdGhyZWFkcyI/CitAZW5kIHF1b3RhdGlvbgorQGVuZCBpZmNsZWFyCisKK0BjaW5kZXggZm9jdXMgb2YgZGVidWdnaW5nCitAY2luZGV4IGN1cnJlbnQgdGhyZWFkCitUaGUgQHZhbHVle0dEQk59IHRocmVhZCBkZWJ1Z2dpbmcgZmFjaWxpdHkgYWxsb3dzIHlvdSB0byBvYnNlcnZlIGFsbAordGhyZWFkcyB3aGlsZSB5b3VyIHByb2dyYW0gcnVucy0tLWJ1dCB3aGVuZXZlciBAdmFsdWV7R0RCTn0gdGFrZXMKK2NvbnRyb2wsIG9uZSB0aHJlYWQgaW4gcGFydGljdWxhciBpcyBhbHdheXMgdGhlIGZvY3VzIG9mIGRlYnVnZ2luZy4KK1RoaXMgdGhyZWFkIGlzIGNhbGxlZCB0aGUgQGRmbntjdXJyZW50IHRocmVhZH0uICBEZWJ1Z2dpbmcgY29tbWFuZHMgc2hvdworcHJvZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgY3VycmVudCB0aHJlYWQuCisKK0BpZmNsZWFyIEhQUEEKK0BraW5kZXggTmV3IEB2YXJ7c3lzdGFnfQorQGNpbmRleCB0aHJlYWQgaWRlbnRpZmllciAoc3lzdGVtKQorQGMgRklYTUUtaW1wbGVtZW50b3JzISEgSXQgd291bGQgYmUgbW9yZSBoZWxwZnVsIGlmIHRoZSBbTmV3Li4uXSBtZXNzYWdlCitAYyBpbmNsdWRlZCBHREIncyBudW1lcmljIHRocmVhZCBoYW5kbGUsIHNvIHlvdSBjb3VsZCBqdXN0IGdvIHRvIHRoYXQKK0BjIHRocmVhZCB3aXRob3V0IGZpcnN0IGNoZWNraW5nIGBpbmZvIHRocmVhZHMnLgorV2hlbmV2ZXIgQHZhbHVle0dEQk59IGRldGVjdHMgYSBuZXcgdGhyZWFkIGluIHlvdXIgcHJvZ3JhbSwgaXQgZGlzcGxheXMKK3RoZSB0YXJnZXQgc3lzdGVtJ3MgaWRlbnRpZmljYXRpb24gZm9yIHRoZSB0aHJlYWQgd2l0aCBhIG1lc3NhZ2UgaW4gdGhlCitmb3JtIEBzYW1we1tOZXcgQHZhcntzeXN0YWd9XX0uICBAdmFye3N5c3RhZ30gaXMgYSB0aHJlYWQgaWRlbnRpZmllcgord2hvc2UgZm9ybSB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBwYXJ0aWN1bGFyIHN5c3RlbS4gIEZvciBleGFtcGxlLCBvbgorTHlueE9TLCB5b3UgbWlnaHQgc2VlCisKK0BleGFtcGxlCitbTmV3IHByb2Nlc3MgMzUgdGhyZWFkIDI3XQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAord2hlbiBAdmFsdWV7R0RCTn0gbm90aWNlcyBhIG5ldyB0aHJlYWQuICBJbiBjb250cmFzdCwgb24gYW4gU0dJIHN5c3RlbSwKK3RoZSBAdmFye3N5c3RhZ30gaXMgc2ltcGx5IHNvbWV0aGluZyBsaWtlIEBzYW1we3Byb2Nlc3MgMzY4fSwgd2l0aCBubworZnVydGhlciBxdWFsaWZpZXIuCisKK0BjIEZJWE1FISEgKDEpIERvZXMgdGhlIFtOZXcuLi5dIG1lc3NhZ2UgYXBwZWFyIGV2ZW4gZm9yIHRoZSB2ZXJ5IGZpcnN0CitAYyAgICAgICAgIHRocmVhZCBvZiBhIHByb2dyYW0sIG9yIGRvZXMgaXQgb25seSBhcHBlYXIgZm9yIHRoZQorQGMgICAgICAgICBzZWNvbmQtLS1pLmUuLCB3aGVuIGl0IGJlY29tZXMgb2J2aW91cyB3ZSBoYXZlIGEgbXVsdGl0aHJlYWQKK0BjICAgICAgICAgcHJvZ3JhbT8KK0BjICAgICAgICAgKDIpICpJcyogdGhlcmUgbmVjZXNzYXJpbHkgYSBmaXJzdCB0aHJlYWQgYWx3YXlzPyAgT3IgZG8gc29tZQorQGMgICAgICAgICBtdWx0aXRocmVhZCBzeXN0ZW1zIHBlcm1pdCBzdGFydGluZyBhIHByb2dyYW0gd2l0aCBtdWx0aXBsZQorQGMgICAgICAgICB0aHJlYWRzIGFiIGluaXRpbz8gICAgICAKKworQGNpbmRleCB0aHJlYWQgbnVtYmVyCitAY2luZGV4IHRocmVhZCBpZGVudGlmaWVyIChHREIpCitGb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBAdmFsdWV7R0RCTn0gYXNzb2NpYXRlcyBpdHMgb3duIHRocmVhZAorbnVtYmVyLS0tYWx3YXlzIGEgc2luZ2xlIGludGVnZXItLS13aXRoIGVhY2ggdGhyZWFkIGluIHlvdXIgcHJvZ3JhbS4KKworQHRhYmxlIEBjb2RlCitAa2luZGV4IGluZm8gdGhyZWFkcworQGl0ZW0gaW5mbyB0aHJlYWRzCitEaXNwbGF5IGEgc3VtbWFyeSBvZiBhbGwgdGhyZWFkcyBjdXJyZW50bHkgaW4geW91cgorcHJvZ3JhbS4gIEB2YWx1ZXtHREJOfSBkaXNwbGF5cyBmb3IgZWFjaCB0aHJlYWQgKGluIHRoaXMgb3JkZXIpOgorCitAZW51bWVyYXRlCitAaXRlbSB0aGUgdGhyZWFkIG51bWJlciBhc3NpZ25lZCBieSBAdmFsdWV7R0RCTn0KKworQGl0ZW0gdGhlIHRhcmdldCBzeXN0ZW0ncyB0aHJlYWQgaWRlbnRpZmllciAoQHZhcntzeXN0YWd9KQorCitAaXRlbSB0aGUgY3VycmVudCBzdGFjayBmcmFtZSBzdW1tYXJ5IGZvciB0aGF0IHRocmVhZAorQGVuZCBlbnVtZXJhdGUKKworQG5vaW5kZW50CitBbiBhc3RlcmlzayBAc2FtcHsqfSB0byB0aGUgbGVmdCBvZiB0aGUgQHZhbHVle0dEQk59IHRocmVhZCBudW1iZXIKK2luZGljYXRlcyB0aGUgY3VycmVudCB0aHJlYWQuCisKK0ZvciBleGFtcGxlLCAKK0BlbmQgdGFibGUKK0BjIGVuZCB0YWJsZSBoZXJlIHRvIGdldCBhIGxpdHRsZSBtb3JlIHdpZHRoIGZvciBleGFtcGxlCisKK0BzbWFsbGV4YW1wbGUKKyhAdmFsdWV7R0RCUH0pIGluZm8gdGhyZWFkcworICAzIHByb2Nlc3MgMzUgdGhyZWFkIDI3ICAweDM0ZTUgaW4gc2lncGF1c2UgKCkKKyAgMiBwcm9jZXNzIDM1IHRocmVhZCAyMyAgMHgzNGU1IGluIHNpZ3BhdXNlICgpCisqIDEgcHJvY2VzcyAzNSB0aHJlYWQgMTMgIG1haW4gKGFyZ2M9MSwgYXJndj0weDdmZmZmZmY4KQorICAgIGF0IHRocmVhZHRlc3QuYzo2OAorQGVuZCBzbWFsbGV4YW1wbGUKK0BlbmQgaWZjbGVhcgorQGlmc2V0IEhQUEEKKworQGNpbmRleCB0aHJlYWQgbnVtYmVyCitAY2luZGV4IHRocmVhZCBpZGVudGlmaWVyIChHREIpCitGb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBAdmFsdWV7R0RCTn0gYXNzb2NpYXRlcyBpdHMgb3duIHRocmVhZAorbnVtYmVyLS0tYSBzbWFsbCBpbnRlZ2VyIGFzc2lnbmVkIGluIHRocmVhZC1jcmVhdGlvbiBvcmRlci0tLXdpdGggZWFjaAordGhyZWFkIGluIHlvdXIgcHJvZ3JhbS4KKworQGtpbmRleCBOZXcgQHZhcntzeXN0YWd9CitAY2luZGV4IHRocmVhZCBpZGVudGlmaWVyIChzeXN0ZW0pCitAYyBGSVhNRS1pbXBsZW1lbnRvcnMhISBJdCB3b3VsZCBiZSBtb3JlIGhlbHBmdWwgaWYgdGhlIFtOZXcuLi5dIG1lc3NhZ2UKK0BjIGluY2x1ZGVkIEdEQidzIG51bWVyaWMgdGhyZWFkIGhhbmRsZSwgc28geW91IGNvdWxkIGp1c3QgZ28gdG8gdGhhdAorQGMgdGhyZWFkIHdpdGhvdXQgZmlyc3QgY2hlY2tpbmcgYGluZm8gdGhyZWFkcycuCitXaGVuZXZlciBAdmFsdWV7R0RCTn0gZGV0ZWN0cyBhIG5ldyB0aHJlYWQgaW4geW91ciBwcm9ncmFtLCBpdCBkaXNwbGF5cworYm90aCBAdmFsdWV7R0RCTn0ncyB0aHJlYWQgbnVtYmVyIGFuZCB0aGUgdGFyZ2V0IHN5c3RlbSdzIGlkZW50aWZpY2F0aW9uIGZvciB0aGUgdGhyZWFkIHdpdGggYSBtZXNzYWdlIGluIHRoZQorZm9ybSBAc2FtcHtbTmV3IEB2YXJ7c3lzdGFnfV19LiAgQHZhcntzeXN0YWd9IGlzIGEgdGhyZWFkIGlkZW50aWZpZXIKK3dob3NlIGZvcm0gdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgcGFydGljdWxhciBzeXN0ZW0uICBGb3IgZXhhbXBsZSwgb24KK0hQLVVYLCB5b3Ugc2VlCisKK0BleGFtcGxlCitbTmV3IHRocmVhZCAyIChzeXN0ZW0gdGhyZWFkIDI2NTk0KV0KK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK3doZW4gQHZhbHVle0dEQk59IG5vdGljZXMgYSBuZXcgdGhyZWFkLiAKKworQHRhYmxlIEBjb2RlCitAa2luZGV4IGluZm8gdGhyZWFkcworQGl0ZW0gaW5mbyB0aHJlYWRzCitEaXNwbGF5IGEgc3VtbWFyeSBvZiBhbGwgdGhyZWFkcyBjdXJyZW50bHkgaW4geW91cgorcHJvZ3JhbS4gIEB2YWx1ZXtHREJOfSBkaXNwbGF5cyBmb3IgZWFjaCB0aHJlYWQgKGluIHRoaXMgb3JkZXIpOgorCitAZW51bWVyYXRlCitAaXRlbSB0aGUgdGhyZWFkIG51bWJlciBhc3NpZ25lZCBieSBAdmFsdWV7R0RCTn0KKworQGl0ZW0gdGhlIHRhcmdldCBzeXN0ZW0ncyB0aHJlYWQgaWRlbnRpZmllciAoQHZhcntzeXN0YWd9KQorCitAaXRlbSB0aGUgY3VycmVudCBzdGFjayBmcmFtZSBzdW1tYXJ5IGZvciB0aGF0IHRocmVhZAorQGVuZCBlbnVtZXJhdGUKKworQG5vaW5kZW50CitBbiBhc3RlcmlzayBAc2FtcHsqfSB0byB0aGUgbGVmdCBvZiB0aGUgQHZhbHVle0dEQk59IHRocmVhZCBudW1iZXIKK2luZGljYXRlcyB0aGUgY3VycmVudCB0aHJlYWQuCisKK0ZvciBleGFtcGxlLCAKK0BlbmQgdGFibGUKK0BjIGVuZCB0YWJsZSBoZXJlIHRvIGdldCBhIGxpdHRsZSBtb3JlIHdpZHRoIGZvciBleGFtcGxlCisKK0BleGFtcGxlCisoQHZhbHVle0dEQlB9KSBpbmZvIHRocmVhZHMKKyAgICAqIDMgc3lzdGVtIHRocmVhZCAyNjYwNyAgd29ya2VyICh3cHRyPTB4N2IwOWMzMTggIkBAIikgYXQgcXVpY2tzb3J0LmM6MTM3CisgICAgICAyIHN5c3RlbSB0aHJlYWQgMjY2MDYgIDB4N2IwMDMwZDggaW4gX19rc2xlZXAgKCkgZnJvbSAvdXNyL2xpYi9saWJjLjIKKyAgICAgIDEgc3lzdGVtIHRocmVhZCAyNzkwNSAgMHg3YjAwMzQ5OCBpbiBfYnJrICgpIGZyb20gL3Vzci9saWIvbGliYy4yCitAZW5kIGV4YW1wbGUKK0BlbmQgaWZzZXQKKworQHRhYmxlIEBjb2RlCitAa2luZGV4IHRocmVhZCBAdmFye3RocmVhZG5vfQorQGl0ZW0gdGhyZWFkIEB2YXJ7dGhyZWFkbm99CitNYWtlIHRocmVhZCBudW1iZXIgQHZhcnt0aHJlYWRub30gdGhlIGN1cnJlbnQgdGhyZWFkLiAgVGhlIGNvbW1hbmQKK2FyZ3VtZW50IEB2YXJ7dGhyZWFkbm99IGlzIHRoZSBpbnRlcm5hbCBAdmFsdWV7R0RCTn0gdGhyZWFkIG51bWJlciwgYXMKK3Nob3duIGluIHRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgQHNhbXB7aW5mbyB0aHJlYWRzfSBkaXNwbGF5LgorQHZhbHVle0dEQk59IHJlc3BvbmRzIGJ5IGRpc3BsYXlpbmcgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoZSB0aHJlYWQKK3lvdSBzZWxlY3RlZCwgYW5kIGl0cyBjdXJyZW50IHN0YWNrIGZyYW1lIHN1bW1hcnk6CisKK0BzbWFsbGV4YW1wbGUKK0BjIEZJWE1FISEgVGhpcyBleGFtcGxlIG1hZGUgdXA7IGZpbmQgYSBAdmFsdWV7R0RCTn0gdy90aHJlYWRzIGFuZCBnZXQgcmVhbCBvbmUKKyhAdmFsdWV7R0RCUH0pIHRocmVhZCAyCitAaWZjbGVhciBIUFBBCitbU3dpdGNoaW5nIHRvIHByb2Nlc3MgMzUgdGhyZWFkIDIzXQorQGVuZCBpZmNsZWFyCitAaWZzZXQgSFBQQQorW1N3aXRjaGluZyB0byB0aHJlYWQgMiAoc3lzdGVtIHRocmVhZCAyNjU5NCldCitAZW5kIGlmc2V0CisweDM0ZTUgaW4gc2lncGF1c2UgKCkKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2luZGVudAorQXMgd2l0aCB0aGUgQHNhbXB7W05ldyBAZG90c3t9XX0gbWVzc2FnZSwgdGhlIGZvcm0gb2YgdGhlIHRleHQgYWZ0ZXIKK0BzYW1we1N3aXRjaGluZyB0b30gZGVwZW5kcyBvbiB5b3VyIHN5c3RlbSdzIGNvbnZlbnRpb25zIGZvciBpZGVudGlmeWluZwordGhyZWFkcy4gIAorCitAa2luZGV4IHRocmVhZCBhcHBseQorQGl0ZW0gdGhyZWFkIGFwcGx5IFtAdmFye3RocmVhZG5vfV0gW0B2YXJ7YWxsfV0gIEB2YXJ7YXJnc30KK1RoZSBAY29kZXt0aHJlYWQgYXBwbHl9IGNvbW1hbmQgYWxsb3dzIHlvdSB0byBhcHBseSBhIGNvbW1hbmQgdG8gb25lIG9yCittb3JlIHRocmVhZHMuICBTcGVjaWZ5IHRoZSBudW1iZXJzIG9mIHRoZSB0aHJlYWRzIHRoYXQgeW91IHdhbnQgYWZmZWN0ZWQKK3dpdGggdGhlIGNvbW1hbmQgYXJndW1lbnQgQHZhcnt0aHJlYWRub30uICBAdmFye3RocmVhZG5vfSBpcyB0aGUgaW50ZXJuYWwKK0B2YWx1ZXtHREJOfSB0aHJlYWQgbnVtYmVyLCBhcyBzaG93biBpbiB0aGUgZmlyc3QgZmllbGQgb2YgdGhlIEBzYW1we2luZm8KK3RocmVhZHN9IGRpc3BsYXkuICBUbyBhcHBseSBhIGNvbW1hbmQgdG8gYWxsIHRocmVhZHMsIHVzZSAKK0Bjb2Rle3RocmVhZCBhcHBseSBhbGx9IEB2YXJ7YXJnc30uIAorQGVuZCB0YWJsZQorCitAY2luZGV4IGF1dG9tYXRpYyB0aHJlYWQgc2VsZWN0aW9uCitAY2luZGV4IHN3aXRjaGluZyB0aHJlYWRzIGF1dG9tYXRpY2FsbHkKK0BjaW5kZXggdGhyZWFkcywgYXV0b21hdGljIHN3aXRjaGluZworV2hlbmV2ZXIgQHZhbHVle0dEQk59IHN0b3BzIHlvdXIgcHJvZ3JhbSwgZHVlIHRvIGEgYnJlYWtwb2ludCBvciBhCitzaWduYWwsIGl0IGF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGUgdGhyZWFkIHdoZXJlIHRoYXQgYnJlYWtwb2ludCBvcgorc2lnbmFsIGhhcHBlbmVkLiAgQHZhbHVle0dEQk59IGFsZXJ0cyB5b3UgdG8gdGhlIGNvbnRleHQgc3dpdGNoIHdpdGggYQorbWVzc2FnZSBvZiB0aGUgZm9ybSBAc2FtcHtbU3dpdGNoaW5nIHRvIEB2YXJ7c3lzdGFnfV19IHRvIGlkZW50aWZ5IHRoZQordGhyZWFkLgorCitAeHJlZntUaHJlYWQgU3RvcHMsLFN0b3BwaW5nIGFuZCBzdGFydGluZyBtdWx0aS10aHJlYWQgcHJvZ3JhbXN9LCBmb3IKK21vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IEB2YWx1ZXtHREJOfSBiZWhhdmVzIHdoZW4geW91IHN0b3AgYW5kIHN0YXJ0Citwcm9ncmFtcyB3aXRoIG11bHRpcGxlIHRocmVhZHMuCisKK0B4cmVme1NldCBXYXRjaHBvaW50cywsU2V0dGluZyB3YXRjaHBvaW50c30sIGZvciBpbmZvcm1hdGlvbiBhYm91dAord2F0Y2hwb2ludHMgaW4gcHJvZ3JhbXMgd2l0aCBtdWx0aXBsZSB0aHJlYWRzLgorQGVuZCBpZmNsZWFyCisKK0BpZmNsZWFyIEhQUEEKK0Bub2RlIFByb2Nlc3NlcywgICwgVGhyZWFkcywgUnVubmluZworQHNlY3Rpb24gRGVidWdnaW5nIHByb2dyYW1zIHdpdGggbXVsdGlwbGUgcHJvY2Vzc2VzCisKK0BjaW5kZXggZm9yaywgZGVidWdnaW5nIHByb2dyYW1zIHdoaWNoIGNhbGwKK0BjaW5kZXggbXVsdGlwbGUgcHJvY2Vzc2VzCitAY2luZGV4IHByb2Nlc3NlcywgbXVsdGlwbGUKK0B2YWx1ZXtHREJOfSBoYXMgbm8gc3BlY2lhbCBzdXBwb3J0IGZvciBkZWJ1Z2dpbmcgcHJvZ3JhbXMgd2hpY2ggY3JlYXRlCithZGRpdGlvbmFsIHByb2Nlc3NlcyB1c2luZyB0aGUgQGNvZGV7Zm9ya30gZnVuY3Rpb24uICBXaGVuIGEgcHJvZ3JhbQorZm9ya3MsIEB2YWx1ZXtHREJOfSB3aWxsIGNvbnRpbnVlIHRvIGRlYnVnIHRoZSBwYXJlbnQgcHJvY2VzcyBhbmQgdGhlCitjaGlsZCBwcm9jZXNzIHdpbGwgcnVuIHVuaW1wZWRlZC4gIElmIHlvdSBoYXZlIHNldCBhIGJyZWFrcG9pbnQgaW4gYW55Citjb2RlIHdoaWNoIHRoZSBjaGlsZCB0aGVuIGV4ZWN1dGVzLCB0aGUgY2hpbGQgd2lsbCBnZXQgYSBAY29kZXtTSUdUUkFQfQorc2lnbmFsIHdoaWNoICh1bmxlc3MgaXQgY2F0Y2hlcyB0aGUgc2lnbmFsKSB3aWxsIGNhdXNlIGl0IHRvIHRlcm1pbmF0ZS4KKworSG93ZXZlciwgaWYgeW91IHdhbnQgdG8gZGVidWcgdGhlIGNoaWxkIHByb2Nlc3MgdGhlcmUgaXMgYSB3b3JrYXJvdW5kCit3aGljaCBpc24ndCB0b28gcGFpbmZ1bC4gIFB1dCBhIGNhbGwgdG8gQGNvZGV7c2xlZXB9IGluIHRoZSBjb2RlIHdoaWNoCit0aGUgY2hpbGQgcHJvY2VzcyBleGVjdXRlcyBhZnRlciB0aGUgZm9yay4gIEl0IG1heSBiZSB1c2VmdWwgdG8gc2xlZXAKK29ubHkgaWYgYSBjZXJ0YWluIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCwgb3IgYSBjZXJ0YWluIGZpbGUgZXhpc3RzLAorc28gdGhhdCB0aGUgZGVsYXkgbmVlZCBub3Qgb2NjdXIgd2hlbiB5b3UgZG9uJ3Qgd2FudCB0byBydW4gQHZhbHVle0dEQk59CitvbiB0aGUgY2hpbGQuICBXaGlsZSB0aGUgY2hpbGQgaXMgc2xlZXBpbmcsIHVzZSB0aGUgQGNvZGV7cHN9IHByb2dyYW0gdG8KK2dldCBpdHMgcHJvY2VzcyBJRC4gIFRoZW4gdGVsbCBAdmFsdWV7R0RCTn0gKGEgbmV3IGludm9jYXRpb24gb2YKK0B2YWx1ZXtHREJOfSBpZiB5b3UgYXJlIGFsc28gZGVidWdnaW5nIHRoZSBwYXJlbnQgcHJvY2VzcykgdG8gYXR0YWNoIHRvCit0aGUgY2hpbGQgcHJvY2VzcyAoc2VlIEByZWZ7QXR0YWNofSkuICBGcm9tIHRoYXQgcG9pbnQgb24geW91IGNhbiBkZWJ1ZwordGhlIGNoaWxkIHByb2Nlc3MganVzdCBsaWtlIGFueSBvdGhlciBwcm9jZXNzIHdoaWNoIHlvdSBhdHRhY2hlZCB0by4KK0BlbmQgaWZjbGVhcgorQGlmc2V0IEhQUEEKK0Bub2RlIFByb2Nlc3NlcywgICwgVGhyZWFkcywgUnVubmluZworQHNlY3Rpb24gRGVidWdnaW5nIHByb2dyYW1zIHdpdGggbXVsdGlwbGUgcHJvY2Vzc2VzCisKK0BjaW5kZXggZm9yaywgZGVidWdnaW5nIHByb2dyYW1zIHdoaWNoIGNhbGwKK0BjaW5kZXggbXVsdGlwbGUgcHJvY2Vzc2VzCitAY2luZGV4IHByb2Nlc3NlcywgbXVsdGlwbGUKKworQHZhbHVle0dEQk59IHByb3ZpZGVzIHN1cHBvcnQgZm9yIGRlYnVnZ2luZyBwcm9ncmFtcyB0aGF0IGNyZWF0ZQorYWRkaXRpb25hbCBwcm9jZXNzZXMgdXNpbmcgdGhlIEBjb2Rle2Zvcmt9IG9yIEBjb2Rle3Zmb3JrfSBmdW5jdGlvbi4KKworQnkgZGVmYXVsdCwgd2hlbiBhIHByb2dyYW0gZm9ya3MsIEB2YWx1ZXtHREJOfSB3aWxsIGNvbnRpbnVlIHRvIGRlYnVnCit0aGUgcGFyZW50IHByb2Nlc3MgYW5kIHRoZSBjaGlsZCBwcm9jZXNzIHdpbGwgcnVuIHVuaW1wZWRlZC4KKworSWYgeW91IHdhbnQgdG8gZm9sbG93IHRoZSBjaGlsZCBwcm9jZXNzIGluc3RlYWQgb2YgdGhlIHBhcmVudCBwcm9jZXNzLAordXNlIHRoZSBjb21tYW5kIEB3e0Bjb2Rle3NldCBmb2xsb3ctZm9yay1tb2RlfX0uCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBzZXQgZm9sbG93LWZvcmstbW9kZQorQGl0ZW0gc2V0IGZvbGxvdy1mb3JrLW1vZGUgQHZhcnttb2RlfQorU2V0IHRoZSBkZWJ1Z2dlciByZXNwb25zZSB0byBhIHByb2dyYW0gY2FsbCBvZiBAY29kZXtmb3JrfSBvcgorQGNvZGV7dmZvcmt9LiAgQSBjYWxsIHRvIEBjb2Rle2Zvcmt9IG9yIEBjb2Rle3Zmb3JrfSBjcmVhdGVzIGEgbmV3Citwcm9jZXNzLiAgVGhlIEB2YXJ7bW9kZX0gY2FuIGJlOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIHBhcmVudAorVGhlIG9yaWdpbmFsIHByb2Nlc3MgaXMgZGVidWdnZWQgYWZ0ZXIgYSBmb3JrLiAgVGhlIGNoaWxkIHByb2Nlc3MgcnVucwordW5pbXBlZGVkLgorCitAaXRlbSBjaGlsZAorVGhlIG5ldyBwcm9jZXNzIGlzIGRlYnVnZ2VkIGFmdGVyIGEgZm9yay4gIFRoZSBwYXJlbnQgcHJvY2VzcyBydW5zCit1bmltcGVkZWQuCisKK0BpdGVtIGFzaworVGhlIGRlYnVnZ2VyIHdpbGwgYXNrIGZvciBvbmUgb2YgdGhlIGFib3ZlIGNob2ljZXMuCitAZW5kIHRhYmxlCisKK0BpdGVtIHNob3cgZm9sbG93LWZvcmstbW9kZQorRGlzcGxheSB0aGUgY3VycmVudCBkZWJ1Z2dlciByZXNwb25zZSB0byBhIGZvcmsgb3IgdmZvcmsgY2FsbC4KK0BlbmQgdGFibGUKKworSWYgeW91IGFzayB0byBkZWJ1ZyBhIGNoaWxkIHByb2Nlc3MgYW5kIGEgQGNvZGV7dmZvcmt9IGlzIGZvbGxvd2VkIGJ5IGFuCitAY29kZXtleGVjfSwgQHZhbHVle0dEQk59IGV4ZWN1dGVzIHRoZSBuZXcgdGFyZ2V0IHVwIHRvIHRoZSBmaXJzdAorYnJlYWtwb2ludCBpbiB0aGUgbmV3IHRhcmdldC4gIElmIHlvdSBoYXZlIGEgYnJlYWtwb2ludCBzZXQgb24KK0Bjb2Rle21haW59IGluIHlvdXIgb3JpZ2luYWwgcHJvZ3JhbSwgdGhlIGJyZWFrcG9pbnQgd2lsbCBhbHNvIGJlIHNldCBvbgordGhlIGNoaWxkIHByb2Nlc3MncyBAY29kZXttYWlufS4KKworV2hlbiBhIGNoaWxkIHByb2Nlc3MgaXMgc3Bhd25lZCBieSBAY29kZXt2Zm9ya30sIHlvdSBjYW5ub3QgZGVidWcgdGhlCitjaGlsZCBvciBwYXJlbnQgdW50aWwgYW4gQGNvZGV7ZXhlY30gY2FsbCBjb21wbGV0ZXMuCisKK0lmIHlvdSBpc3N1ZSBhIEBjb2Rle3J1bn0gY29tbWFuZCB0byBAdmFsdWV7R0RCTn0gYWZ0ZXIgYW4gQGNvZGV7ZXhlY30KK2NhbGwgZXhlY3V0ZXMsIHRoZSBuZXcgdGFyZ2V0IHJlc3RhcnRzLiAgVG8gcmVzdGFydCB0aGUgcGFyZW50IHByb2Nlc3MsCit1c2UgdGhlIEBjb2Rle2ZpbGV9IGNvbW1hbmQgd2l0aCB0aGUgcGFyZW50IGV4ZWN1dGFibGUgbmFtZSBhcyBpdHMKK2FyZ3VtZW50LgorCitZb3UgY2FuIHVzZSB0aGUgQGNvZGV7Y2F0Y2h9IGNvbW1hbmQgdG8gbWFrZSBAdmFsdWV7R0RCTn0gc3RvcCB3aGVuZXZlcgorYSBAY29kZXtmb3JrfSwgQGNvZGV7dmZvcmt9LCBvciBAY29kZXtleGVjfSBjYWxsIGlzIG1hZGUuICBAeHJlZntTZXQKK0NhdGNocG9pbnRzLCAsU2V0dGluZyBjYXRjaHBvaW50c30uCitAZW5kIGlmc2V0CisKK0Bub2RlIFN0b3BwaW5nLCBTdGFjaywgUnVubmluZywgVG9wCitAY2hhcHRlciBTdG9wcGluZyBhbmQgQ29udGludWluZworCitUaGUgcHJpbmNpcGFsIHB1cnBvc2VzIG9mIHVzaW5nIGEgZGVidWdnZXIgYXJlIHNvIHRoYXQgeW91IGNhbiBzdG9wIHlvdXIKK3Byb2dyYW0gYmVmb3JlIGl0IHRlcm1pbmF0ZXM7IG9yIHNvIHRoYXQsIGlmIHlvdXIgcHJvZ3JhbSBydW5zIGludG8KK3Ryb3VibGUsIHlvdSBjYW4gaW52ZXN0aWdhdGUgYW5kIGZpbmQgb3V0IHdoeS4KKworSW5zaWRlIEB2YWx1ZXtHREJOfSwgeW91ciBwcm9ncmFtIG1heSBzdG9wIGZvciBhbnkgb2Ygc2V2ZXJhbCByZWFzb25zLCBzdWNoCithcworQGlmY2xlYXIgQkFSRVRBUkdFVAorYSBzaWduYWwsCitAZW5kIGlmY2xlYXIKK2EgYnJlYWtwb2ludCwgb3IgcmVhY2hpbmcgYSBuZXcgbGluZSBhZnRlciBhIEB2YWx1ZXtHREJOfQorY29tbWFuZCBzdWNoIGFzIEBjb2Rle3N0ZXB9LiAgWW91IG1heSB0aGVuIGV4YW1pbmUgYW5kIGNoYW5nZQordmFyaWFibGVzLCBzZXQgbmV3IGJyZWFrcG9pbnRzIG9yIHJlbW92ZSBvbGQgb25lcywgYW5kIHRoZW4gY29udGludWUKK2V4ZWN1dGlvbi4gIFVzdWFsbHksIHRoZSBtZXNzYWdlcyBzaG93biBieSBAdmFsdWV7R0RCTn0gcHJvdmlkZSBhbXBsZQorZXhwbGFuYXRpb24gb2YgdGhlIHN0YXR1cyBvZiB5b3VyIHByb2dyYW0tLS1idXQgeW91IGNhbiBhbHNvIGV4cGxpY2l0bHkKK3JlcXVlc3QgdGhpcyBpbmZvcm1hdGlvbiBhdCBhbnkgdGltZS4KKworQHRhYmxlIEBjb2RlCitAa2luZGV4IGluZm8gcHJvZ3JhbQorQGl0ZW0gaW5mbyBwcm9ncmFtCitEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgeW91ciBwcm9ncmFtOiB3aGV0aGVyIGl0IGlzCitydW5uaW5nIG9yIG5vdCwKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK3doYXQgcHJvY2VzcyBpdCBpcywKK0BlbmQgaWZjbGVhcgorYW5kIHdoeSBpdCBzdG9wcGVkLgorQGVuZCB0YWJsZQorCitAbWVudQorKiBCcmVha3BvaW50czo6ICAgICAgICAgICAgICAgICBCcmVha3BvaW50cywgd2F0Y2hwb2ludHMsIGFuZCBjYXRjaHBvaW50cworKiBDb250aW51aW5nIGFuZCBTdGVwcGluZzo6ICAgICBSZXN1bWluZyBleGVjdXRpb24KK0BpZnNldCBQT1NJWAorKiBTaWduYWxzOjogICAgICAgICAgICAgICAgICAgICBTaWduYWxzCitAZW5kIGlmc2V0CisKK0BpZmNsZWFyIEJBUkVUQVJHRVQKKyogVGhyZWFkIFN0b3BzOjogICAgICAgICAgICAgICAgU3RvcHBpbmcgYW5kIHN0YXJ0aW5nIG11bHRpLXRocmVhZCBwcm9ncmFtcworQGVuZCBpZmNsZWFyCisKK0BlbmQgbWVudQorCitAbm9kZSBCcmVha3BvaW50cywgQ29udGludWluZyBhbmQgU3RlcHBpbmcsIFN0b3BwaW5nLCBTdG9wcGluZworQHNlY3Rpb24gQnJlYWtwb2ludHMsIHdhdGNocG9pbnRzLCBhbmQgY2F0Y2hwb2ludHMKKworQGNpbmRleCBicmVha3BvaW50cworQSBAZGZue2JyZWFrcG9pbnR9IG1ha2VzIHlvdXIgcHJvZ3JhbSBzdG9wIHdoZW5ldmVyIGEgY2VydGFpbiBwb2ludCBpbgordGhlIHByb2dyYW0gaXMgcmVhY2hlZC4gIEZvciBlYWNoIGJyZWFrcG9pbnQsIHlvdSBjYW4gYWRkIGNvbmRpdGlvbnMgdG8KK2NvbnRyb2wgaW4gZmluZXIgZGV0YWlsIHdoZXRoZXIgeW91ciBwcm9ncmFtIHN0b3BzLiAgWW91IGNhbiBzZXQKK2JyZWFrcG9pbnRzIHdpdGggdGhlIEBjb2Rle2JyZWFrfSBjb21tYW5kIGFuZCBpdHMgdmFyaWFudHMgKEBweHJlZntTZXQKK0JyZWFrcywgLFNldHRpbmcgYnJlYWtwb2ludHN9KSwgdG8gc3BlY2lmeSB0aGUgcGxhY2Ugd2hlcmUgeW91ciBwcm9ncmFtCitzaG91bGQgc3RvcCBieSBsaW5lIG51bWJlciwgZnVuY3Rpb24gbmFtZSBvciBleGFjdCBhZGRyZXNzIGluIHRoZQorcHJvZ3JhbS4KKworSW4gSFAtVVgsIFN1bk9TIDQueCwgU1ZSNCwgYW5kIEFscGhhIE9TRi8xIGNvbmZpZ3VyYXRpb25zLCB5b3UgY2FuIHNldAorYnJlYWtwb2ludHMgaW4gc2hhcmVkIGxpYnJhcmllcyBiZWZvcmUgdGhlIGV4ZWN1dGFibGUgaXMgcnVuLiAgVGhlcmUgaXMKK2EgbWlub3IgbGltaXRhdGlvbiBvbiBIUC1VWCBzeXN0ZW1zOiB5b3UgbXVzdCB3YWl0IHVudGlsIHRoZSBleGVjdXRhYmxlCitpcyBydW4gaW4gb3JkZXIgdG8gc2V0IGJyZWFrcG9pbnRzIGluIHNoYXJlZCBsaWJyYXJ5IHJvdXRpbmVzIHRoYXQgYXJlCitub3QgY2FsbGVkIGRpcmVjdGx5IGJ5IHRoZSBwcm9ncmFtIChmb3IgZXhhbXBsZSwgcm91dGluZXMgdGhhdCBhcmUKK2FyZ3VtZW50cyBpbiBhIEBjb2Rle3B0aHJlYWRfY3JlYXRlfSBjYWxsKS4KKworQGNpbmRleCB3YXRjaHBvaW50cworQGNpbmRleCBtZW1vcnkgdHJhY2luZworQGNpbmRleCBicmVha3BvaW50IG9uIG1lbW9yeSBhZGRyZXNzCitAY2luZGV4IGJyZWFrcG9pbnQgb24gdmFyaWFibGUgbW9kaWZpY2F0aW9uCitBIEBkZm57d2F0Y2hwb2ludH0gaXMgYSBzcGVjaWFsIGJyZWFrcG9pbnQgdGhhdCBzdG9wcyB5b3VyIHByb2dyYW0KK3doZW4gdGhlIHZhbHVlIG9mIGFuIGV4cHJlc3Npb24gY2hhbmdlcy4gIFlvdSBtdXN0IHVzZSBhIGRpZmZlcmVudAorY29tbWFuZCB0byBzZXQgd2F0Y2hwb2ludHMgKEBweHJlZntTZXQgV2F0Y2hwb2ludHMsICxTZXR0aW5nCit3YXRjaHBvaW50c30pLCBidXQgYXNpZGUgZnJvbSB0aGF0LCB5b3UgY2FuIG1hbmFnZSBhIHdhdGNocG9pbnQgbGlrZQorYW55IG90aGVyIGJyZWFrcG9pbnQ6IHlvdSBlbmFibGUsIGRpc2FibGUsIGFuZCBkZWxldGUgYm90aCBicmVha3BvaW50cworYW5kIHdhdGNocG9pbnRzIHVzaW5nIHRoZSBzYW1lIGNvbW1hbmRzLgorCitZb3UgY2FuIGFycmFuZ2UgdG8gaGF2ZSB2YWx1ZXMgZnJvbSB5b3VyIHByb2dyYW0gZGlzcGxheWVkIGF1dG9tYXRpY2FsbHkKK3doZW5ldmVyIEB2YWx1ZXtHREJOfSBzdG9wcyBhdCBhIGJyZWFrcG9pbnQuICBAeHJlZntBdXRvIERpc3BsYXksLAorQXV0b21hdGljIGRpc3BsYXl9LgorCitAY2luZGV4IGNhdGNocG9pbnRzCitAY2luZGV4IGJyZWFrcG9pbnQgb24gZXZlbnRzCitBIEBkZm57Y2F0Y2hwb2ludH0gaXMgYW5vdGhlciBzcGVjaWFsIGJyZWFrcG9pbnQgdGhhdCBzdG9wcyB5b3VyIHByb2dyYW0KK3doZW4gYSBjZXJ0YWluIGtpbmQgb2YgZXZlbnQgb2NjdXJzLCBzdWNoIGFzIHRoZSB0aHJvd2luZyBvZiBhIEMrKworZXhjZXB0aW9uIG9yIHRoZSBsb2FkaW5nIG9mIGEgbGlicmFyeS4gIEFzIHdpdGggd2F0Y2hwb2ludHMsIHlvdSB1c2UgYQorZGlmZmVyZW50IGNvbW1hbmQgdG8gc2V0IGEgY2F0Y2hwb2ludCAoQHB4cmVme1NldCBDYXRjaHBvaW50cywgLFNldHRpbmcKK2NhdGNocG9pbnRzfSksIGJ1dCBhc2lkZSBmcm9tIHRoYXQsIHlvdSBjYW4gbWFuYWdlIGEgY2F0Y2hwb2ludCBsaWtlIGFueQorb3RoZXIgYnJlYWtwb2ludC4gIChUbyBzdG9wIHdoZW4geW91ciBwcm9ncmFtIHJlY2VpdmVzIGEgc2lnbmFsLCB1c2UgdGhlCitAY29kZXtoYW5kbGV9IGNvbW1hbmQ7IEBweHJlZntTaWduYWxzLCAsU2lnbmFsc30uKQorCitAY2luZGV4IGJyZWFrcG9pbnQgbnVtYmVycworQGNpbmRleCBudW1iZXJzIGZvciBicmVha3BvaW50cworQHZhbHVle0dEQk59IGFzc2lnbnMgYSBudW1iZXIgdG8gZWFjaCBicmVha3BvaW50LCB3YXRjaHBvaW50LCBvcgorY2F0Y2hwb2ludCB3aGVuIHlvdSBjcmVhdGUgaXQ7IHRoZXNlIG51bWJlcnMgYXJlIHN1Y2Nlc3NpdmUgaW50ZWdlcnMKK3N0YXJ0aW5nIHdpdGggb25lLiAgSW4gbWFueSBvZiB0aGUgY29tbWFuZHMgZm9yIGNvbnRyb2xsaW5nIHZhcmlvdXMKK2ZlYXR1cmVzIG9mIGJyZWFrcG9pbnRzIHlvdSB1c2UgdGhlIGJyZWFrcG9pbnQgbnVtYmVyIHRvIHNheSB3aGljaAorYnJlYWtwb2ludCB5b3Ugd2FudCB0byBjaGFuZ2UuICBFYWNoIGJyZWFrcG9pbnQgbWF5IGJlIEBkZm57ZW5hYmxlZH0gb3IKK0BkZm57ZGlzYWJsZWR9OyBpZiBkaXNhYmxlZCwgaXQgaGFzIG5vIGVmZmVjdCBvbiB5b3VyIHByb2dyYW0gdW50aWwgeW91CitlbmFibGUgaXQgYWdhaW4uCisKK0BtZW51CisqIFNldCBCcmVha3M6OiAgICAgICAgICAgICAgICAgIFNldHRpbmcgYnJlYWtwb2ludHMKKyogU2V0IFdhdGNocG9pbnRzOjogICAgICAgICAgICAgU2V0dGluZyB3YXRjaHBvaW50cworKiBTZXQgQ2F0Y2hwb2ludHM6OiAgICAgICAgICAgICBTZXR0aW5nIGNhdGNocG9pbnRzCisqIERlbGV0ZSBCcmVha3M6OiAgICAgICAgICAgICAgIERlbGV0aW5nIGJyZWFrcG9pbnRzCisqIERpc2FibGluZzo6ICAgICAgICAgICAgICAgICAgIERpc2FibGluZyBicmVha3BvaW50cworKiBDb25kaXRpb25zOjogICAgICAgICAgICAgICAgICBCcmVhayBjb25kaXRpb25zCisqIEJyZWFrIENvbW1hbmRzOjogICAgICAgICAgICAgIEJyZWFrcG9pbnQgY29tbWFuZCBsaXN0cworQGlmY2xlYXIgQ09OTFkKKyogQnJlYWtwb2ludCBNZW51czo6ICAgICAgICAgICAgQnJlYWtwb2ludCBtZW51cworQGVuZCBpZmNsZWFyCisKK0BjICBAaWZjbGVhciBCQVJFVEFSR0VUCitAYyAgKiBFcnJvciBpbiBCcmVha3BvaW50czo6ICAgICAgICBgYENhbm5vdCBpbnNlcnQgYnJlYWtwb2ludHMnJworQGMgIEBlbmQgaWZjbGVhcgorQGVuZCBtZW51CisKK0Bub2RlIFNldCBCcmVha3MsIFNldCBXYXRjaHBvaW50cywgQnJlYWtwb2ludHMsIEJyZWFrcG9pbnRzCitAc3Vic2VjdGlvbiBTZXR0aW5nIGJyZWFrcG9pbnRzCisKK0BjIEZJWE1FIExNQiB3aGF0IGRvZXMgR0RCIGRvIGlmIG5vIGNvZGUgb24gbGluZSBvZiBicmVha3B0PyAgCitAYyAgICAgICBjb25zaWRlciBpbiBwYXJ0aWN1bGFyIGRlY2xhcmF0aW9uIHdpdGgvd2l0aG91dCBpbml0aWFsaXphdGlvbi4KK0BjCitAYyBGSVhNRSAyIGlzIHRoZXJlIHN0dWZmIG9uIHRoaXMgYWxyZWFkeT8gYnJlYWsgYXQgZnVuIHN0YXJ0LCBhbHJlYWR5IGluaXQ/CisKK0BraW5kZXggYnJlYWsKK0BraW5kZXggYgorQGtpbmRleCAkYnBudW0KK0BjaW5kZXggbGF0ZXN0IGJyZWFrcG9pbnQKK0JyZWFrcG9pbnRzIGFyZSBzZXQgd2l0aCB0aGUgQGNvZGV7YnJlYWt9IGNvbW1hbmQgKGFiYnJldmlhdGVkCitAY29kZXtifSkuICBUaGUgZGVidWdnZXIgY29udmVuaWVuY2UgdmFyaWFibGUgQHNhbXB7JGJwbnVtfSByZWNvcmRzIHRoZSAKK251bWJlciBvZiB0aGUgYnJlYWtwb2ludHMgeW91J3ZlIHNldCBtb3N0IHJlY2VudGx5OyBzZWUgQHJlZntDb252ZW5pZW5jZQorVmFycywsIENvbnZlbmllbmNlIHZhcmlhYmxlc30sIGZvciBhIGRpc2N1c3Npb24gb2Ygd2hhdCB5b3UgY2FuIGRvIHdpdGgKK2NvbnZlbmllbmNlIHZhcmlhYmxlcy4KKworWW91IGhhdmUgc2V2ZXJhbCB3YXlzIHRvIHNheSB3aGVyZSB0aGUgYnJlYWtwb2ludCBzaG91bGQgZ28uCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gYnJlYWsgQHZhcntmdW5jdGlvbn0KK1NldCBhIGJyZWFrcG9pbnQgYXQgZW50cnkgdG8gZnVuY3Rpb24gQHZhcntmdW5jdGlvbn0uICAKK0BpZmNsZWFyIENPTkxZCitXaGVuIHVzaW5nIHNvdXJjZSBsYW5ndWFnZXMgdGhhdCBwZXJtaXQgb3ZlcmxvYWRpbmcgb2Ygc3ltYm9scywgc3VjaCBhcworQysrLCBAdmFye2Z1bmN0aW9ufSBtYXkgcmVmZXIgdG8gbW9yZSB0aGFuIG9uZSBwb3NzaWJsZSBwbGFjZSB0byBicmVhay4KK0B4cmVme0JyZWFrcG9pbnQgTWVudXMsLEJyZWFrcG9pbnQgbWVudXN9LCBmb3IgYSBkaXNjdXNzaW9uIG9mIHRoYXQgc2l0dWF0aW9uLgorQGVuZCBpZmNsZWFyCisKK0BpdGVtIGJyZWFrICtAdmFye29mZnNldH0KK0BpdGVteCBicmVhayAtQHZhcntvZmZzZXR9CitTZXQgYSBicmVha3BvaW50IHNvbWUgbnVtYmVyIG9mIGxpbmVzIGZvcndhcmQgb3IgYmFjayBmcm9tIHRoZSBwb3NpdGlvbgorYXQgd2hpY2ggZXhlY3V0aW9uIHN0b3BwZWQgaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBmcmFtZS4KKworQGl0ZW0gYnJlYWsgQHZhcntsaW5lbnVtfQorU2V0IGEgYnJlYWtwb2ludCBhdCBsaW5lIEB2YXJ7bGluZW51bX0gaW4gdGhlIGN1cnJlbnQgc291cmNlIGZpbGUuCitUaGF0IGZpbGUgaXMgdGhlIGxhc3QgZmlsZSB3aG9zZSBzb3VyY2UgdGV4dCB3YXMgcHJpbnRlZC4gIFRoaXMKK2JyZWFrcG9pbnQgc3RvcHMgeW91ciBwcm9ncmFtIGp1c3QgYmVmb3JlIGl0IGV4ZWN1dGVzIGFueSBvZiB0aGUKK2NvZGUgb24gdGhhdCBsaW5lLgorCitAaXRlbSBicmVhayBAdmFye2ZpbGVuYW1lfTpAdmFye2xpbmVudW19CitTZXQgYSBicmVha3BvaW50IGF0IGxpbmUgQHZhcntsaW5lbnVtfSBpbiBzb3VyY2UgZmlsZSBAdmFye2ZpbGVuYW1lfS4KKworQGl0ZW0gYnJlYWsgQHZhcntmaWxlbmFtZX06QHZhcntmdW5jdGlvbn0KK1NldCBhIGJyZWFrcG9pbnQgYXQgZW50cnkgdG8gZnVuY3Rpb24gQHZhcntmdW5jdGlvbn0gZm91bmQgaW4gZmlsZQorQHZhcntmaWxlbmFtZX0uICBTcGVjaWZ5aW5nIGEgZmlsZSBuYW1lIGFzIHdlbGwgYXMgYSBmdW5jdGlvbiBuYW1lIGlzCitzdXBlcmZsdW91cyBleGNlcHQgd2hlbiBtdWx0aXBsZSBmaWxlcyBjb250YWluIHNpbWlsYXJseSBuYW1lZAorZnVuY3Rpb25zLgorCitAaXRlbSBicmVhayAqQHZhcnthZGRyZXNzfQorU2V0IGEgYnJlYWtwb2ludCBhdCBhZGRyZXNzIEB2YXJ7YWRkcmVzc30uICBZb3UgY2FuIHVzZSB0aGlzIHRvIHNldAorYnJlYWtwb2ludHMgaW4gcGFydHMgb2YgeW91ciBwcm9ncmFtIHdoaWNoIGRvIG5vdCBoYXZlIGRlYnVnZ2luZworaW5mb3JtYXRpb24gb3Igc291cmNlIGZpbGVzLgorCitAaXRlbSBicmVhaworV2hlbiBjYWxsZWQgd2l0aG91dCBhbnkgYXJndW1lbnRzLCBAY29kZXticmVha30gc2V0cyBhIGJyZWFrcG9pbnQgYXQKK3RoZSBuZXh0IGluc3RydWN0aW9uIHRvIGJlIGV4ZWN1dGVkIGluIHRoZSBzZWxlY3RlZCBzdGFjayBmcmFtZQorKEBweHJlZntTdGFjaywgLEV4YW1pbmluZyB0aGUgU3RhY2t9KS4gIEluIGFueSBzZWxlY3RlZCBmcmFtZSBidXQgdGhlCitpbm5lcm1vc3QsIHRoaXMgbWFrZXMgeW91ciBwcm9ncmFtIHN0b3AgYXMgc29vbiBhcyBjb250cm9sCityZXR1cm5zIHRvIHRoYXQgZnJhbWUuICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGVmZmVjdCBvZiBhCitAY29kZXtmaW5pc2h9IGNvbW1hbmQgaW4gdGhlIGZyYW1lIGluc2lkZSB0aGUgc2VsZWN0ZWQgZnJhbWUtLS1leGNlcHQKK3RoYXQgQGNvZGV7ZmluaXNofSBkb2VzIG5vdCBsZWF2ZSBhbiBhY3RpdmUgYnJlYWtwb2ludC4gIElmIHlvdSB1c2UKK0Bjb2Rle2JyZWFrfSB3aXRob3V0IGFuIGFyZ3VtZW50IGluIHRoZSBpbm5lcm1vc3QgZnJhbWUsIEB2YWx1ZXtHREJOfSBzdG9wcwordGhlIG5leHQgdGltZSBpdCByZWFjaGVzIHRoZSBjdXJyZW50IGxvY2F0aW9uOyB0aGlzIG1heSBiZSB1c2VmdWwKK2luc2lkZSBsb29wcy4KKworQHZhbHVle0dEQk59IG5vcm1hbGx5IGlnbm9yZXMgYnJlYWtwb2ludHMgd2hlbiBpdCByZXN1bWVzIGV4ZWN1dGlvbiwgdW50aWwgYXQKK2xlYXN0IG9uZSBpbnN0cnVjdGlvbiBoYXMgYmVlbiBleGVjdXRlZC4gIElmIGl0IGRpZCBub3QgZG8gdGhpcywgeW91Cit3b3VsZCBiZSB1bmFibGUgdG8gcHJvY2VlZCBwYXN0IGEgYnJlYWtwb2ludCB3aXRob3V0IGZpcnN0IGRpc2FibGluZyB0aGUKK2JyZWFrcG9pbnQuICBUaGlzIHJ1bGUgYXBwbGllcyB3aGV0aGVyIG9yIG5vdCB0aGUgYnJlYWtwb2ludCBhbHJlYWR5CitleGlzdGVkIHdoZW4geW91ciBwcm9ncmFtIHN0b3BwZWQuCisKK0BpdGVtIGJyZWFrIEBkb3Rze30gaWYgQHZhcntjb25kfQorU2V0IGEgYnJlYWtwb2ludCB3aXRoIGNvbmRpdGlvbiBAdmFye2NvbmR9OyBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbgorQHZhcntjb25kfSBlYWNoIHRpbWUgdGhlIGJyZWFrcG9pbnQgaXMgcmVhY2hlZCwgYW5kIHN0b3Agb25seSBpZiB0aGUKK3ZhbHVlIGlzIG5vbnplcm8tLS10aGF0IGlzLCBpZiBAdmFye2NvbmR9IGV2YWx1YXRlcyBhcyB0cnVlLgorQHNhbXB7QGRvdHN7fX0gc3RhbmRzIGZvciBvbmUgb2YgdGhlIHBvc3NpYmxlIGFyZ3VtZW50cyBkZXNjcmliZWQKK2Fib3ZlIChvciBubyBhcmd1bWVudCkgc3BlY2lmeWluZyB3aGVyZSB0byBicmVhay4gIEB4cmVme0NvbmRpdGlvbnMsCissQnJlYWsgY29uZGl0aW9uc30sIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGJyZWFrcG9pbnQgY29uZGl0aW9ucy4KKworQGtpbmRleCB0YnJlYWsKK0BpdGVtIHRicmVhayBAdmFye2FyZ3N9CitTZXQgYSBicmVha3BvaW50IGVuYWJsZWQgb25seSBmb3Igb25lIHN0b3AuICBAdmFye2FyZ3N9IGFyZSB0aGUKK3NhbWUgYXMgZm9yIHRoZSBAY29kZXticmVha30gY29tbWFuZCwgYW5kIHRoZSBicmVha3BvaW50IGlzIHNldCBpbiB0aGUgc2FtZQord2F5LCBidXQgdGhlIGJyZWFrcG9pbnQgaXMgYXV0b21hdGljYWxseSBkZWxldGVkIGFmdGVyIHRoZSBmaXJzdCB0aW1lIHlvdXIKK3Byb2dyYW0gc3RvcHMgdGhlcmUuICBAeHJlZntEaXNhYmxpbmcsICxEaXNhYmxpbmcgYnJlYWtwb2ludHN9LgorCitAaWZjbGVhciBIUFBBCitAa2luZGV4IGhicmVhaworQGl0ZW0gaGJyZWFrIEB2YXJ7YXJnc30KK1NldCBhIGhhcmR3YXJlLWFzc2lzdGVkIGJyZWFrcG9pbnQuICBAdmFye2FyZ3N9IGFyZSB0aGUgc2FtZSBhcyBmb3IgdGhlIAorQGNvZGV7YnJlYWt9IGNvbW1hbmQgYW5kIHRoZSBicmVha3BvaW50IGlzIHNldCBpbiB0aGUgc2FtZSB3YXksIGJ1dCB0aGUgCiticmVha3BvaW50IHJlcXVpcmVzIGhhcmR3YXJlIHN1cHBvcnQgYW5kIHNvbWUgdGFyZ2V0IGhhcmR3YXJlIG1heSBub3QKK2hhdmUgdGhpcyBzdXBwb3J0LiAgVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGlzIEVQUk9NL1JPTSBjb2RlCitkZWJ1Z2dpbmcsIHNvIHlvdSBjYW4gc2V0IGEgYnJlYWtwb2ludCBhdCBhbiBpbnN0cnVjdGlvbiB3aXRob3V0IAorY2hhbmdpbmcgdGhlIGluc3RydWN0aW9uLiAgVGhpcyBjYW4gYmUgdXNlZCB3aXRoIHRoZSBuZXcgdHJhcC1nZW5lcmF0aW9uIAorcHJvdmlkZWQgYnkgU1BBUkNsaXRlIERTVS4gIERTVSB3aWxsIGdlbmVyYXRlIHRyYXBzIHdoZW4gYSBwcm9ncmFtIGFjY2Vzc2VzCitzb21lIGRhdGEgb3IgaW5zdHJ1Y3Rpb24gYWRkcmVzcyB0aGF0IGlzIGFzc2lnbmVkIHRvIHRoZSBkZWJ1ZyByZWdpc3RlcnMuICAKK0hvd2V2ZXIgdGhlIGhhcmR3YXJlIGJyZWFrcG9pbnQgcmVnaXN0ZXJzIGNhbiBvbmx5IHRha2UgdHdvIGRhdGEgYnJlYWtwb2ludHMsCithbmQgQHZhbHVle0dEQk59IHdpbGwgcmVqZWN0IHRoaXMgY29tbWFuZCBpZiBtb3JlIHRoYW4gdHdvIGFyZSB1c2VkLiAgCitEZWxldGUgb3IgZGlzYWJsZSB1bnVzZWQgaGFyZHdhcmUgYnJlYWtwb2ludHMgYmVmb3JlIHNldHRpbmcKK25ldyBvbmVzLiAgQHhyZWZ7Q29uZGl0aW9ucywgLEJyZWFrIGNvbmRpdGlvbnN9LgorCitAa2luZGV4IHRoYnJlYWsKK0BpdGVtIHRoYnJlYWsgQHZhcnthcmdzfQorU2V0IGEgaGFyZHdhcmUtYXNzaXN0ZWQgYnJlYWtwb2ludCBlbmFibGVkIG9ubHkgZm9yIG9uZSBzdG9wLiAgQHZhcnthcmdzfQorYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgQGNvZGV7aGJyZWFrfSBjb21tYW5kIGFuZCB0aGUgYnJlYWtwb2ludCBpcyBzZXQgaW4KK3RoZSBzYW1lIHdheS4gIEhvd2V2ZXIsIGxpa2UgdGhlIEBjb2Rle3RicmVha30gY29tbWFuZCwgIAordGhlIGJyZWFrcG9pbnQgaXMgYXV0b21hdGljYWxseSBkZWxldGVkIGFmdGVyIHRoZQorZmlyc3QgdGltZSB5b3VyIHByb2dyYW0gc3RvcHMgdGhlcmUuICBBbHNvLCBsaWtlIHRoZSBAY29kZXtoYnJlYWt9Citjb21tYW5kLCB0aGUgYnJlYWtwb2ludCByZXF1aXJlcyBoYXJkd2FyZSBzdXBwb3J0IGFuZCBzb21lIHRhcmdldCBoYXJkd2FyZSAKK21heSBub3QgaGF2ZSB0aGlzIHN1cHBvcnQuICBAeHJlZntEaXNhYmxpbmcsICxEaXNhYmxpbmcgYnJlYWtwb2ludHN9LiAgCitBbHNvIEB4cmVme0NvbmRpdGlvbnMsICxCcmVhayBjb25kaXRpb25zfS4KK0BlbmQgaWZjbGVhcgorCitAa2luZGV4IHJicmVhaworQGNpbmRleCByZWd1bGFyIGV4cHJlc3Npb24KK0BpdGVtIHJicmVhayBAdmFye3JlZ2V4fQorQGMgRklYTUUgd2hhdCBraW5kIG9mIHJlZ2V4cD8KK1NldCBicmVha3BvaW50cyBvbiBhbGwgZnVuY3Rpb25zIG1hdGNoaW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KK0B2YXJ7cmVnZXh9LiAgVGhpcyBjb21tYW5kCitzZXRzIGFuIHVuY29uZGl0aW9uYWwgYnJlYWtwb2ludCBvbiBhbGwgbWF0Y2hlcywgcHJpbnRpbmcgYSBsaXN0IG9mIGFsbAorYnJlYWtwb2ludHMgaXQgc2V0LiAgT25jZSB0aGVzZSBicmVha3BvaW50cyBhcmUgc2V0LCB0aGV5IGFyZSB0cmVhdGVkCitqdXN0IGxpa2UgdGhlIGJyZWFrcG9pbnRzIHNldCB3aXRoIHRoZSBAY29kZXticmVha30gY29tbWFuZC4gIFlvdSBjYW4KK2RlbGV0ZSB0aGVtLCBkaXNhYmxlIHRoZW0sIG9yIG1ha2UgdGhlbSBjb25kaXRpb25hbCB0aGUgc2FtZSB3YXkgYXMgYW55CitvdGhlciBicmVha3BvaW50LgorCitAaWZjbGVhciBDT05MWQorV2hlbiBkZWJ1Z2dpbmcgQysrIHByb2dyYW1zLCBAY29kZXtyYnJlYWt9IGlzIHVzZWZ1bCBmb3Igc2V0dGluZworYnJlYWtwb2ludHMgb24gb3ZlcmxvYWRlZCBmdW5jdGlvbnMgdGhhdCBhcmUgbm90IG1lbWJlcnMgb2YgYW55IHNwZWNpYWwKK2NsYXNzZXMuCitAZW5kIGlmY2xlYXIKKworQGtpbmRleCBpbmZvIGJyZWFrcG9pbnRzCitAY2luZGV4IEBjb2RleyRffSBhbmQgQGNvZGV7aW5mbyBicmVha3BvaW50c30KK0BpdGVtIGluZm8gYnJlYWtwb2ludHMgQHJ7W31AdmFye259QHJ7XX0KK0BpdGVteCBpbmZvIGJyZWFrIEBye1t9QHZhcntufUBye119CitAaXRlbXggaW5mbyB3YXRjaHBvaW50cyBAcntbfUB2YXJ7bn1AcntdfQorUHJpbnQgYSB0YWJsZSBvZiBhbGwgYnJlYWtwb2ludHMsIHdhdGNocG9pbnRzLCBhbmQgY2F0Y2hwb2ludHMgc2V0IGFuZAorbm90IGRlbGV0ZWQsIHdpdGggdGhlIGZvbGxvd2luZyBjb2x1bW5zIGZvciBlYWNoIGJyZWFrcG9pbnQ6CisKK0B0YWJsZSBAZW1waAorQGl0ZW0gQnJlYWtwb2ludCBOdW1iZXJzCitAaXRlbSBUeXBlCitCcmVha3BvaW50LCB3YXRjaHBvaW50LCBvciBjYXRjaHBvaW50LgorQGl0ZW0gRGlzcG9zaXRpb24KK1doZXRoZXIgdGhlIGJyZWFrcG9pbnQgaXMgbWFya2VkIHRvIGJlIGRpc2FibGVkIG9yIGRlbGV0ZWQgd2hlbiBoaXQuCitAaXRlbSBFbmFibGVkIG9yIERpc2FibGVkCitFbmFibGVkIGJyZWFrcG9pbnRzIGFyZSBtYXJrZWQgd2l0aCBAc2FtcHt5fS4gIEBzYW1we259IG1hcmtzIGJyZWFrcG9pbnRzCit0aGF0IGFyZSBub3QgZW5hYmxlZC4KK0BpdGVtIEFkZHJlc3MKK1doZXJlIHRoZSBicmVha3BvaW50IGlzIGluIHlvdXIgcHJvZ3JhbSwgYXMgYSBtZW1vcnkgYWRkcmVzcworQGl0ZW0gV2hhdAorV2hlcmUgdGhlIGJyZWFrcG9pbnQgaXMgaW4gdGhlIHNvdXJjZSBmb3IgeW91ciBwcm9ncmFtLCBhcyBhIGZpbGUgYW5kCitsaW5lIG51bWJlci4KK0BlbmQgdGFibGUKKworQG5vaW5kZW50CitJZiBhIGJyZWFrcG9pbnQgaXMgY29uZGl0aW9uYWwsIEBjb2Rle2luZm8gYnJlYWt9IHNob3dzIHRoZSBjb25kaXRpb24gb24KK3RoZSBsaW5lIGZvbGxvd2luZyB0aGUgYWZmZWN0ZWQgYnJlYWtwb2ludDsgYnJlYWtwb2ludCBjb21tYW5kcywgaWYgYW55LAorYXJlIGxpc3RlZCBhZnRlciB0aGF0LgorCitAbm9pbmRlbnQKK0Bjb2Rle2luZm8gYnJlYWt9IHdpdGggYSBicmVha3BvaW50CitudW1iZXIgQHZhcntufSBhcyBhcmd1bWVudCBsaXN0cyBvbmx5IHRoYXQgYnJlYWtwb2ludC4gIFRoZQorY29udmVuaWVuY2UgdmFyaWFibGUgQGNvZGV7JF99IGFuZCB0aGUgZGVmYXVsdCBleGFtaW5pbmctYWRkcmVzcyBmb3IKK3RoZSBAY29kZXt4fSBjb21tYW5kIGFyZSBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3QgYnJlYWtwb2ludAorbGlzdGVkIChAcHhyZWZ7TWVtb3J5LCAsRXhhbWluaW5nIG1lbW9yeX0pLiAgCisKK0Bub2luZGVudAorQGNvZGV7aW5mbyBicmVha30gZGlzcGxheXMgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBicmVha3BvaW50CitoYXMgYmVlbiBoaXQuICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCitAY29kZXtpZ25vcmV9IGNvbW1hbmQuICBZb3UgY2FuIGlnbm9yZSBhIGxhcmdlIG51bWJlciBvZiBicmVha3BvaW50CitoaXRzLCBsb29rIGF0IHRoZSBicmVha3BvaW50IGluZm8gdG8gc2VlIGhvdyBtYW55IHRpbWVzIHRoZSBicmVha3BvaW50Cit3YXMgaGl0LCBhbmQgdGhlbiBydW4gYWdhaW4sIGlnbm9yaW5nIG9uZSBsZXNzIHRoYW4gdGhhdCBudW1iZXIuICBUaGlzCit3aWxsIGdldCB5b3UgcXVpY2tseSB0byB0aGUgbGFzdCBoaXQgb2YgdGhhdCBicmVha3BvaW50LgorQGVuZCB0YWJsZQorCitAdmFsdWV7R0RCTn0gYWxsb3dzIHlvdSB0byBzZXQgYW55IG51bWJlciBvZiBicmVha3BvaW50cyBhdCB0aGUgc2FtZSBwbGFjZSBpbgoreW91ciBwcm9ncmFtLiAgVGhlcmUgaXMgbm90aGluZyBzaWxseSBvciBtZWFuaW5nbGVzcyBhYm91dCB0aGlzLiAgV2hlbgordGhlIGJyZWFrcG9pbnRzIGFyZSBjb25kaXRpb25hbCwgdGhpcyBpcyBldmVuIHVzZWZ1bAorKEBweHJlZntDb25kaXRpb25zLCAsQnJlYWsgY29uZGl0aW9uc30pLgorCitAY2luZGV4IG5lZ2F0aXZlIGJyZWFrcG9pbnQgbnVtYmVycworQGNpbmRleCBpbnRlcm5hbCBAdmFsdWV7R0RCTn0gYnJlYWtwb2ludHMKK0B2YWx1ZXtHREJOfSBpdHNlbGYgc29tZXRpbWVzIHNldHMgYnJlYWtwb2ludHMgaW4geW91ciBwcm9ncmFtIGZvciBzcGVjaWFsCitwdXJwb3Nlcywgc3VjaCBhcyBwcm9wZXIgaGFuZGxpbmcgb2YgQGNvZGV7bG9uZ2ptcH0gKGluIEMgcHJvZ3JhbXMpLgorVGhlc2UgaW50ZXJuYWwgYnJlYWtwb2ludHMgYXJlIGFzc2lnbmVkIG5lZ2F0aXZlIG51bWJlcnMsIHN0YXJ0aW5nIHdpdGgKK0Bjb2Rley0xfTsgQHNhbXB7aW5mbyBicmVha3BvaW50c30gZG9lcyBub3QgZGlzcGxheSB0aGVtLgorCitZb3UgY2FuIHNlZSB0aGVzZSBicmVha3BvaW50cyB3aXRoIHRoZSBAdmFsdWV7R0RCTn0gbWFpbnRlbmFuY2UgY29tbWFuZAorQHNhbXB7bWFpbnQgaW5mbyBicmVha3BvaW50c30uCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBtYWludCBpbmZvIGJyZWFrcG9pbnRzCitAaXRlbSBtYWludCBpbmZvIGJyZWFrcG9pbnRzCitVc2luZyB0aGUgc2FtZSBmb3JtYXQgYXMgQHNhbXB7aW5mbyBicmVha3BvaW50c30sIGRpc3BsYXkgYm90aCB0aGUKK2JyZWFrcG9pbnRzIHlvdSd2ZSBzZXQgZXhwbGljaXRseSwgYW5kIHRob3NlIEB2YWx1ZXtHREJOfSBpcyB1c2luZyBmb3IKK2ludGVybmFsIHB1cnBvc2VzLiAgSW50ZXJuYWwgYnJlYWtwb2ludHMgYXJlIHNob3duIHdpdGggbmVnYXRpdmUKK2JyZWFrcG9pbnQgbnVtYmVycy4gIFRoZSB0eXBlIGNvbHVtbiBpZGVudGlmaWVzIHdoYXQga2luZCBvZiBicmVha3BvaW50CitpcyBzaG93bjoKKworQHRhYmxlIEBjb2RlCitAaXRlbSBicmVha3BvaW50CitOb3JtYWwsIGV4cGxpY2l0bHkgc2V0IGJyZWFrcG9pbnQuCisKK0BpdGVtIHdhdGNocG9pbnQKK05vcm1hbCwgZXhwbGljaXRseSBzZXQgd2F0Y2hwb2ludC4KKworQGl0ZW0gbG9uZ2ptcAorSW50ZXJuYWwgYnJlYWtwb2ludCwgdXNlZCB0byBoYW5kbGUgY29ycmVjdGx5IHN0ZXBwaW5nIHRocm91Z2gKK0Bjb2Rle2xvbmdqbXB9IGNhbGxzLgorCitAaXRlbSBsb25nam1wIHJlc3VtZQorSW50ZXJuYWwgYnJlYWtwb2ludCBhdCB0aGUgdGFyZ2V0IG9mIGEgQGNvZGV7bG9uZ2ptcH0uCisKK0BpdGVtIHVudGlsCitUZW1wb3JhcnkgaW50ZXJuYWwgYnJlYWtwb2ludCB1c2VkIGJ5IHRoZSBAdmFsdWV7R0RCTn0gQGNvZGV7dW50aWx9IGNvbW1hbmQuCisKK0BpdGVtIGZpbmlzaAorVGVtcG9yYXJ5IGludGVybmFsIGJyZWFrcG9pbnQgdXNlZCBieSB0aGUgQHZhbHVle0dEQk59IEBjb2Rle2ZpbmlzaH0gY29tbWFuZC4KKworQGlmc2V0IEhQUEEKK0BpdGVtIHNobGliIGV2ZW50cworU2hhcmVkIGxpYnJhcnkgZXZlbnRzLgorQGVuZCBpZnNldAorQGVuZCB0YWJsZQorQGVuZCB0YWJsZQorCisKK0Bub2RlIFNldCBXYXRjaHBvaW50cywgU2V0IENhdGNocG9pbnRzLCBTZXQgQnJlYWtzLCBCcmVha3BvaW50cworQHN1YnNlY3Rpb24gU2V0dGluZyB3YXRjaHBvaW50cworCitAY2luZGV4IHNldHRpbmcgd2F0Y2hwb2ludHMKK0BjaW5kZXggc29mdHdhcmUgd2F0Y2hwb2ludHMKK0BjaW5kZXggaGFyZHdhcmUgd2F0Y2hwb2ludHMKK1lvdSBjYW4gdXNlIGEgd2F0Y2hwb2ludCB0byBzdG9wIGV4ZWN1dGlvbiB3aGVuZXZlciB0aGUgdmFsdWUgb2YgYW4KK2V4cHJlc3Npb24gY2hhbmdlcywgd2l0aG91dCBoYXZpbmcgdG8gcHJlZGljdCBhIHBhcnRpY3VsYXIgcGxhY2Ugd2hlcmUKK3RoaXMgbWF5IGhhcHBlbi4KKworRGVwZW5kaW5nIG9uIHlvdXIgc3lzdGVtLCB3YXRjaHBvaW50cyBtYXkgYmUgaW1wbGVtZW50ZWQgaW4gc29mdHdhcmUgb3IKK2hhcmR3YXJlLiAgR0RCIGRvZXMgc29mdHdhcmUgd2F0Y2hwb2ludGluZyBieSBzaW5nbGUtc3RlcHBpbmcgeW91cgorcHJvZ3JhbSBhbmQgdGVzdGluZyB0aGUgdmFyaWFibGUncyB2YWx1ZSBlYWNoIHRpbWUsIHdoaWNoIGlzIGh1bmRyZWRzIG9mCit0aW1lcyBzbG93ZXIgdGhhbiBub3JtYWwgZXhlY3V0aW9uLiAgKEJ1dCB0aGlzIG1heSBzdGlsbCBiZSB3b3J0aCBpdCwgdG8KK2NhdGNoIGVycm9ycyB3aGVyZSB5b3UgaGF2ZSBubyBjbHVlIHdoYXQgcGFydCBvZiB5b3VyIHByb2dyYW0gaXMgdGhlCitjdWxwcml0LikKKworT24gc29tZSBzeXN0ZW1zLCBzdWNoIGFzIEhQLVVYIGFuZCBMaW51eCwgR0RCIGluY2x1ZGVzIHN1cHBvcnQgZm9yCitoYXJkd2FyZSB3YXRjaHBvaW50cywgd2hpY2ggZG8gbm90IHNsb3cgZG93biB0aGUgcnVubmluZyBvZiB5b3VyCitwcm9ncmFtLgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggd2F0Y2gKK0BpdGVtIHdhdGNoIEB2YXJ7ZXhwcn0KK1NldCBhIHdhdGNocG9pbnQgZm9yIGFuIGV4cHJlc3Npb24uICBAdmFsdWV7R0RCTn0gd2lsbCBicmVhayB3aGVuIEB2YXJ7ZXhwcn0KK2lzIHdyaXR0ZW4gaW50byBieSB0aGUgcHJvZ3JhbSBhbmQgaXRzIHZhbHVlIGNoYW5nZXMuCisKK0BraW5kZXggcndhdGNoCitAaXRlbSByd2F0Y2ggQHZhcntleHByfQorU2V0IGEgd2F0Y2hwb2ludCB0aGF0IHdpbGwgYnJlYWsgd2hlbiB3YXRjaCBAdmFye2V4cHJ9IGlzIHJlYWQgYnkgdGhlIHByb2dyYW0uCitJZiB5b3UgdXNlIGJvdGggd2F0Y2hwb2ludHMsIGJvdGggbXVzdCBiZSBzZXQgd2l0aCB0aGUgQGNvZGV7cndhdGNofQorY29tbWFuZC4KKworQGtpbmRleCBhd2F0Y2gKK0BpdGVtIGF3YXRjaCBAdmFye2V4cHJ9CitTZXQgYSB3YXRjaHBvaW50IHRoYXQgd2lsbCBicmVhayB3aGVuIEB2YXJ7YXJnc30gaXMgcmVhZCBhbmQgd3JpdHRlbiBpbnRvCitieSB0aGUgcHJvZ3JhbS4gIElmIHlvdSB1c2UgYm90aCB3YXRjaHBvaW50cywgYm90aCBtdXN0IGJlIHNldCB3aXRoIHRoZQorQGNvZGV7YXdhdGNofSBjb21tYW5kLgorCitAa2luZGV4IGluZm8gd2F0Y2hwb2ludHMKK0BpdGVtIGluZm8gd2F0Y2hwb2ludHMKK1RoaXMgY29tbWFuZCBwcmludHMgYSBsaXN0IG9mIHdhdGNocG9pbnRzLCBicmVha3BvaW50cywgYW5kIGNhdGNocG9pbnRzOworaXQgaXMgdGhlIHNhbWUgYXMgQGNvZGV7aW5mbyBicmVha30uCitAZW5kIHRhYmxlCisKK0B2YWx1ZXtHREJOfSBzZXRzIGEgQGRmbntoYXJkd2FyZSB3YXRjaHBvaW50fSBpZiBwb3NzaWJsZS4gIEhhcmR3YXJlCit3YXRjaHBvaW50cyBleGVjdXRlIHZlcnkgcXVpY2tseSwgYW5kIHRoZSBkZWJ1Z2dlciByZXBvcnRzIGEgY2hhbmdlIGluCit2YWx1ZSBhdCB0aGUgZXhhY3QgaW5zdHJ1Y3Rpb24gd2hlcmUgdGhlIGNoYW5nZSBvY2N1cnMuICBJZiBAdmFsdWV7R0RCTn0KK2Nhbm5vdCBzZXQgYSBoYXJkd2FyZSB3YXRjaHBvaW50LCBpdCBzZXRzIGEgc29mdHdhcmUgd2F0Y2hwb2ludCwgd2hpY2gKK2V4ZWN1dGVzIG1vcmUgc2xvd2x5IGFuZCByZXBvcnRzIHRoZSBjaGFuZ2UgaW4gdmFsdWUgYXQgdGhlIG5leHQKK3N0YXRlbWVudCwgbm90IHRoZSBpbnN0cnVjdGlvbiwgYWZ0ZXIgdGhlIGNoYW5nZSBvY2N1cnMuCisKK1doZW4geW91IGlzc3VlIHRoZSBAY29kZXt3YXRjaH0gY29tbWFuZCwgQHZhbHVle0dEQk59IHJlcG9ydHMKKworQGV4YW1wbGUKK0hhcmR3YXJlIHdhdGNocG9pbnQgQHZhcntudW19OiBAdmFye2V4cHJ9CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitpZiBpdCB3YXMgYWJsZSB0byBzZXQgYSBoYXJkd2FyZSB3YXRjaHBvaW50LgorCitUaGUgU1BBUkNsaXRlIERTVSB3aWxsIGdlbmVyYXRlIHRyYXBzIHdoZW4gYSBwcm9ncmFtIGFjY2Vzc2VzCitzb21lIGRhdGEgb3IgaW5zdHJ1Y3Rpb24gYWRkcmVzcyB0aGF0IGlzIGFzc2lnbmVkIHRvIHRoZSBkZWJ1ZyByZWdpc3RlcnMuICAKK0ZvciB0aGUgZGF0YSBhZGRyZXNzZXMsIERTVSBmYWNpbGl0YXRlcyB0aGUgQGNvZGV7d2F0Y2h9IGNvbW1hbmQuCitIb3dldmVyIHRoZSBoYXJkd2FyZSBicmVha3BvaW50IHJlZ2lzdGVycyBjYW4gb25seSB0YWtlIHR3byBkYXRhIHdhdGNocG9pbnRzLAorYW5kIGJvdGggd2F0Y2hwb2ludHMgbXVzdCBiZSB0aGUgc2FtZSBraW5kLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gc2V0IHR3bword2F0Y2hwb2ludHMgd2l0aCBAY29kZXt3YXRjaH0gY29tbWFuZHMsIHR3byB3aXRoIEBjb2Rle3J3YXRjaH0KK2NvbW1hbmRzLCBAc3Ryb25ne29yfSB0d28gd2l0aCBAY29kZXthd2F0Y2h9IGNvbW1hbmRzLCBidXQgeW91IGNhbm5vdCBzZXQgb25lCit3YXRjaHBvaW50IHdpdGggb25lIGNvbW1hbmQgYW5kIHRoZSBvdGhlciB3aXRoIGEgZGlmZmVyZW50IGNvbW1hbmQuIAorQHZhbHVle0dEQk59IHdpbGwgcmVqZWN0IHRoZSBjb21tYW5kIGlmIHlvdSB0cnkgdG8gbWl4IHdhdGNocG9pbnRzLgorRGVsZXRlIG9yIGRpc2FibGUgdW51c2VkIHdhdGNocG9pbnQgY29tbWFuZHMgYmVmb3JlIHNldHRpbmcgbmV3IG9uZXMuCisKK0lmIHlvdSBjYWxsIGEgZnVuY3Rpb24gaW50ZXJhY3RpdmVseSB1c2luZyBAY29kZXtwcmludH0gb3IgQGNvZGV7Y2FsbH0sCithbnkgd2F0Y2hwb2ludHMgeW91IGhhdmUgc2V0IHdpbGwgYmUgaW5hY3RpdmUgdW50aWwgR0RCIHJlYWNoZXMgYW5vdGhlcgora2luZCBvZiBicmVha3BvaW50IG9yIHRoZSBjYWxsIGNvbXBsZXRlcy4KKworQGlmY2xlYXIgQkFSRVRBUkdFVAorQHF1b3RhdGlvbgorQGNpbmRleCB3YXRjaHBvaW50cyBhbmQgdGhyZWFkcworQGNpbmRleCB0aHJlYWRzIGFuZCB3YXRjaHBvaW50cworQGlmY2xlYXIgSFBQQQorQGVtcGh7V2FybmluZzp9IEluIG11bHRpLXRocmVhZCBwcm9ncmFtcywgd2F0Y2hwb2ludHMgaGF2ZSBvbmx5IGxpbWl0ZWQKK3VzZWZ1bG5lc3MuICBXaXRoIHRoZSBjdXJyZW50IHdhdGNocG9pbnQgaW1wbGVtZW50YXRpb24sIEB2YWx1ZXtHREJOfQorY2FuIG9ubHkgd2F0Y2ggdGhlIHZhbHVlIG9mIGFuIGV4cHJlc3Npb24gQGVtcGh7aW4gYSBzaW5nbGUgdGhyZWFkfS4gIElmCit5b3UgYXJlIGNvbmZpZGVudCB0aGF0IHRoZSBleHByZXNzaW9uIGNhbiBvbmx5IGNoYW5nZSBkdWUgdG8gdGhlIGN1cnJlbnQKK3RocmVhZCdzIGFjdGl2aXR5IChhbmQgaWYgeW91IGFyZSBhbHNvIGNvbmZpZGVudCB0aGF0IG5vIG90aGVyIHRocmVhZAorY2FuIGJlY29tZSBjdXJyZW50KSwgdGhlbiB5b3UgY2FuIHVzZSB3YXRjaHBvaW50cyBhcyB1c3VhbC4gIEhvd2V2ZXIsCitAdmFsdWV7R0RCTn0gbWF5IG5vdCBub3RpY2Ugd2hlbiBhIG5vbi1jdXJyZW50IHRocmVhZCdzIGFjdGl2aXR5IGNoYW5nZXMKK3RoZSBleHByZXNzaW9uLgorQGVuZCBpZmNsZWFyCitAaWZzZXQgSFBQQQorQGVtcGh7V2FybmluZzp9IEluIG11bHRpLXRocmVhZCBwcm9ncmFtcywgc29mdHdhcmUgd2F0Y2hwb2ludHMgaGF2ZSBvbmx5CitsaW1pdGVkIHVzZWZ1bG5lc3MuICBJZiBAdmFsdWV7R0RCTn0gY3JlYXRlcyBhIHNvZnR3YXJlIHdhdGNocG9pbnQsIGl0CitjYW4gb25seSB3YXRjaCB0aGUgdmFsdWUgb2YgYW4gZXhwcmVzc2lvbiBAZW1waHtpbiBhIHNpbmdsZSB0aHJlYWR9LiAgSWYKK3lvdSBhcmUgY29uZmlkZW50IHRoYXQgdGhlIGV4cHJlc3Npb24gY2FuIG9ubHkgY2hhbmdlIGR1ZSB0byB0aGUgY3VycmVudAordGhyZWFkJ3MgYWN0aXZpdHkgKGFuZCBpZiB5b3UgYXJlIGFsc28gY29uZmlkZW50IHRoYXQgbm8gb3RoZXIgdGhyZWFkCitjYW4gYmVjb21lIGN1cnJlbnQpLCB0aGVuIHlvdSBjYW4gdXNlIHNvZnR3YXJlIHdhdGNocG9pbnRzIGFzIHVzdWFsLgorSG93ZXZlciwgQHZhbHVle0dEQk59IG1heSBub3Qgbm90aWNlIHdoZW4gYSBub24tY3VycmVudCB0aHJlYWQncworYWN0aXZpdHkgY2hhbmdlcyB0aGUgZXhwcmVzc2lvbi4gIChIYXJkd2FyZSB3YXRjaHBvaW50cywgaW4gY29udHJhc3QsCit3YXRjaCBhbiBleHByZXNzaW9uIGluIGFsbCB0aHJlYWRzLikKK0BlbmQgaWZzZXQKK0BlbmQgcXVvdGF0aW9uCitAZW5kIGlmY2xlYXIKKworQG5vZGUgU2V0IENhdGNocG9pbnRzLCBEZWxldGUgQnJlYWtzLCBTZXQgV2F0Y2hwb2ludHMsIEJyZWFrcG9pbnRzCitAc3Vic2VjdGlvbiBTZXR0aW5nIGNhdGNocG9pbnRzCitAY2luZGV4IGNhdGNocG9pbnRzCitAY2luZGV4IGV4Y2VwdGlvbiBoYW5kbGVycworQGNpbmRleCBldmVudCBoYW5kbGluZworCitZb3UgY2FuIHVzZSBAZGZue2NhdGNocG9pbnRzfSB0byBjYXVzZSB0aGUgZGVidWdnZXIgdG8gc3RvcCBmb3IgY2VydGFpbgora2luZHMgb2YgcHJvZ3JhbSBldmVudHMsIHN1Y2ggYXMgQysrIGV4Y2VwdGlvbnMgb3IgdGhlIGxvYWRpbmcgb2YgYQorc2hhcmVkIGxpYnJhcnkuICBVc2UgdGhlIEBjb2Rle2NhdGNofSBjb21tYW5kIHRvIHNldCBhIGNhdGNocG9pbnQuCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBjYXRjaAorQGl0ZW0gY2F0Y2ggQHZhcntldmVudH0KK1N0b3Agd2hlbiBAdmFye2V2ZW50fSBvY2N1cnMuICBAdmFye2V2ZW50fSBjYW4gYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6CitAdGFibGUgQGNvZGUKK0BpdGVtIHRocm93CitAa2luZGV4IGNhdGNoIHRocm93CitUaGUgdGhyb3dpbmcgb2YgYSBDKysgZXhjZXB0aW9uLgorCitAaXRlbSBjYXRjaAorQGtpbmRleCBjYXRjaCBjYXRjaAorVGhlIGNhdGNoaW5nIG9mIGEgQysrIGV4Y2VwdGlvbi4KKworQGl0ZW0gZXhlYworQGtpbmRleCBjYXRjaCBleGVjCitBIGNhbGwgdG8gQGNvZGV7ZXhlY30uICBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBmb3IgSFAtVVguCisKK0BpdGVtIGZvcmsKK0BraW5kZXggY2F0Y2ggZm9yaworQSBjYWxsIHRvIEBjb2Rle2Zvcmt9LiAgVGhpcyBpcyBjdXJyZW50bHkgb25seSBhdmFpbGFibGUgZm9yIEhQLVVYLgorCitAaXRlbSB2Zm9yaworQGtpbmRleCBjYXRjaCB2Zm9yaworQSBjYWxsIHRvIEBjb2Rle3Zmb3JrfS4gIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIGZvciBIUC1VWC4KKworQGl0ZW0gbG9hZAorQGl0ZW14IGxvYWQgQHZhcntsaWJuYW1lfQorQGtpbmRleCBjYXRjaCBsb2FkCitUaGUgZHluYW1pYyBsb2FkaW5nIG9mIGFueSBzaGFyZWQgbGlicmFyeSwgb3IgdGhlIGxvYWRpbmcgb2YgdGhlIGxpYnJhcnkKK0B2YXJ7bGlibmFtZX0uICBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBmb3IgSFAtVVguCisKK0BpdGVtIHVubG9hZAorQGl0ZW14IHVubG9hZCBAdmFye2xpYm5hbWV9CitAa2luZGV4IGNhdGNoIHVubG9hZAorVGhlIHVubG9hZGluZyBvZiBhbnkgZHluYW1pY2FsbHkgbG9hZGVkIHNoYXJlZCBsaWJyYXJ5LCBvciB0aGUgdW5sb2FkaW5nCitvZiB0aGUgbGlicmFyeSBAdmFye2xpYm5hbWV9LiAgVGhpcyBpcyBjdXJyZW50bHkgb25seSBhdmFpbGFibGUgZm9yIEhQLVVYLgorQGVuZCB0YWJsZQorCitAaXRlbSB0Y2F0Y2ggQHZhcntldmVudH0KK1NldCBhIGNhdGNocG9pbnQgdGhhdCBpcyBlbmFibGVkIG9ubHkgZm9yIG9uZSBzdG9wLiAgVGhlIGNhdGNocG9pbnQgaXMKK2F1dG9tYXRpY2FsbHkgZGVsZXRlZCBhZnRlciB0aGUgZmlyc3QgdGltZSB0aGUgZXZlbnQgaXMgY2F1Z2h0LgorCitAZW5kIHRhYmxlCisKK1VzZSB0aGUgQGNvZGV7aW5mbyBicmVha30gY29tbWFuZCB0byBsaXN0IHRoZSBjdXJyZW50IGNhdGNocG9pbnRzLgorCitUaGVyZSBhcmUgY3VycmVudGx5IHNvbWUgbGltaXRhdGlvbnMgdG8gQysrIGV4Y2VwdGlvbiBoYW5kbGluZworKEBjb2Rle2NhdGNoIHRocm93fSBhbmQgQGNvZGV7Y2F0Y2ggY2F0Y2h9KSBpbiBAdmFsdWV7R0RCTn06CisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitJZiB5b3UgY2FsbCBhIGZ1bmN0aW9uIGludGVyYWN0aXZlbHksIEB2YWx1ZXtHREJOfSBub3JtYWxseSByZXR1cm5zCitjb250cm9sIHRvIHlvdSB3aGVuIHRoZSBmdW5jdGlvbiBoYXMgZmluaXNoZWQgZXhlY3V0aW5nLiAgSWYgdGhlIGNhbGwKK3JhaXNlcyBhbiBleGNlcHRpb24sIGhvd2V2ZXIsIHRoZSBjYWxsIG1heSBieXBhc3MgdGhlIG1lY2hhbmlzbSB0aGF0CityZXR1cm5zIGNvbnRyb2wgdG8geW91IGFuZCBjYXVzZSB5b3VyIHByb2dyYW0gZWl0aGVyIHRvIGFib3J0IG9yIHRvCitzaW1wbHkgY29udGludWUgcnVubmluZyB1bnRpbCBpdCBoaXRzIGEgYnJlYWtwb2ludCwgY2F0Y2hlcyBhIHNpZ25hbAordGhhdCBAdmFsdWV7R0RCTn0gaXMgbGlzdGVuaW5nIGZvciwgb3IgZXhpdHMuICBUaGlzIGlzIHRoZSBjYXNlIGV2ZW4gaWYKK3lvdSBzZXQgYSBjYXRjaHBvaW50IGZvciB0aGUgZXhjZXB0aW9uOyBjYXRjaHBvaW50cyBvbiBleGNlcHRpb25zIGFyZQorZGlzYWJsZWQgd2l0aGluIGludGVyYWN0aXZlIGNhbGxzLgorCitAaXRlbQorWW91IGNhbm5vdCByYWlzZSBhbiBleGNlcHRpb24gaW50ZXJhY3RpdmVseS4KKworQGl0ZW0KK1lvdSBjYW5ub3QgaW5zdGFsbCBhbiBleGNlcHRpb24gaGFuZGxlciBpbnRlcmFjdGl2ZWx5LgorQGVuZCBpdGVtaXplCisKK0BjaW5kZXggcmFpc2UgZXhjZXB0aW9ucworU29tZXRpbWVzIEBjb2Rle2NhdGNofSBpcyBub3QgdGhlIGJlc3Qgd2F5IHRvIGRlYnVnIGV4Y2VwdGlvbiBoYW5kbGluZzoKK2lmIHlvdSBuZWVkIHRvIGtub3cgZXhhY3RseSB3aGVyZSBhbiBleGNlcHRpb24gaXMgcmFpc2VkLCBpdCBpcyBiZXR0ZXIgdG8KK3N0b3AgQGVtcGh7YmVmb3JlfSB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgaXMgY2FsbGVkLCBzaW5jZSB0aGF0IHdheSB5b3UKK2NhbiBzZWUgdGhlIHN0YWNrIGJlZm9yZSBhbnkgdW53aW5kaW5nIHRha2VzIHBsYWNlLiAgSWYgeW91IHNldCBhCiticmVha3BvaW50IGluIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIGluc3RlYWQsIGl0IG1heSBub3QgYmUgZWFzeSB0byBmaW5kCitvdXQgd2hlcmUgdGhlIGV4Y2VwdGlvbiB3YXMgcmFpc2VkLgorCitUbyBzdG9wIGp1c3QgYmVmb3JlIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIGlzIGNhbGxlZCwgeW91IG5lZWQgc29tZQora25vd2xlZGdlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4gIEluIHRoZSBjYXNlIG9mIEBzY3tnbnV9IEMrKywgZXhjZXB0aW9ucyBhcmUKK3JhaXNlZCBieSBjYWxsaW5nIGEgbGlicmFyeSBmdW5jdGlvbiBuYW1lZCBAY29kZXtfX3JhaXNlX2V4Y2VwdGlvbn0KK3doaWNoIGhhcyB0aGUgZm9sbG93aW5nIEFOU0kgQyBpbnRlcmZhY2U6CisKK0BleGFtcGxlCisgICAgLyogQHZhcnthZGRyfSBpcyB3aGVyZSB0aGUgZXhjZXB0aW9uIGlkZW50aWZpZXIgaXMgc3RvcmVkLgorICAgICAgIElEIGlzIHRoZSBleGNlcHRpb24gaWRlbnRpZmllci4gICovCisgICAgdm9pZCBfX3JhaXNlX2V4Y2VwdGlvbiAodm9pZCAqKkB2YXJ7YWRkcn0sIHZvaWQgKkB2YXJ7aWR9KTsKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK1RvIG1ha2UgdGhlIGRlYnVnZ2VyIGNhdGNoIGFsbCBleGNlcHRpb25zIGJlZm9yZSBhbnkgc3RhY2sKK3Vud2luZGluZyB0YWtlcyBwbGFjZSwgc2V0IGEgYnJlYWtwb2ludCBvbiBAY29kZXtfX3JhaXNlX2V4Y2VwdGlvbn0KKyhAcHhyZWZ7QnJlYWtwb2ludHMsICxCcmVha3BvaW50czsgd2F0Y2hwb2ludHM7IGFuZCBleGNlcHRpb25zfSkuCisKK1dpdGggYSBjb25kaXRpb25hbCBicmVha3BvaW50IChAcHhyZWZ7Q29uZGl0aW9ucywgLEJyZWFrIGNvbmRpdGlvbnN9KQordGhhdCBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiBAdmFye2lkfSwgeW91IGNhbiBzdG9wIHlvdXIgcHJvZ3JhbSB3aGVuCithIHNwZWNpZmljIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBZb3UgY2FuIHVzZSBtdWx0aXBsZSBjb25kaXRpb25hbAorYnJlYWtwb2ludHMgdG8gc3RvcCB5b3VyIHByb2dyYW0gd2hlbiBhbnkgb2YgYSBudW1iZXIgb2YgZXhjZXB0aW9ucyBhcmUKK3JhaXNlZC4KKworCitAbm9kZSBEZWxldGUgQnJlYWtzLCBEaXNhYmxpbmcsIFNldCBDYXRjaHBvaW50cywgQnJlYWtwb2ludHMKK0BzdWJzZWN0aW9uIERlbGV0aW5nIGJyZWFrcG9pbnRzCisKK0BjaW5kZXggY2xlYXJpbmcgYnJlYWtwb2ludHMsIHdhdGNocG9pbnRzLCBjYXRjaHBvaW50cworQGNpbmRleCBkZWxldGluZyBicmVha3BvaW50cywgd2F0Y2hwb2ludHMsIGNhdGNocG9pbnRzCitJdCBpcyBvZnRlbiBuZWNlc3NhcnkgdG8gZWxpbWluYXRlIGEgYnJlYWtwb2ludCwgd2F0Y2hwb2ludCwgb3IKK2NhdGNocG9pbnQgb25jZSBpdCBoYXMgZG9uZSBpdHMgam9iIGFuZCB5b3Ugbm8gbG9uZ2VyIHdhbnQgeW91ciBwcm9ncmFtCit0byBzdG9wIHRoZXJlLiAgVGhpcyBpcyBjYWxsZWQgQGRmbntkZWxldGluZ30gdGhlIGJyZWFrcG9pbnQuICBBCiticmVha3BvaW50IHRoYXQgaGFzIGJlZW4gZGVsZXRlZCBubyBsb25nZXIgZXhpc3RzOyBpdCBpcyBmb3Jnb3R0ZW4uCisKK1dpdGggdGhlIEBjb2Rle2NsZWFyfSBjb21tYW5kIHlvdSBjYW4gZGVsZXRlIGJyZWFrcG9pbnRzIGFjY29yZGluZyB0bword2hlcmUgdGhleSBhcmUgaW4geW91ciBwcm9ncmFtLiAgV2l0aCB0aGUgQGNvZGV7ZGVsZXRlfSBjb21tYW5kIHlvdSBjYW4KK2RlbGV0ZSBpbmRpdmlkdWFsIGJyZWFrcG9pbnRzLCB3YXRjaHBvaW50cywgb3IgY2F0Y2hwb2ludHMgYnkgc3BlY2lmeWluZwordGhlaXIgYnJlYWtwb2ludCBudW1iZXJzLgorCitJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGRlbGV0ZSBhIGJyZWFrcG9pbnQgdG8gcHJvY2VlZCBwYXN0IGl0LiAgQHZhbHVle0dEQk59CithdXRvbWF0aWNhbGx5IGlnbm9yZXMgYnJlYWtwb2ludHMgb24gdGhlIGZpcnN0IGluc3RydWN0aW9uIHRvIGJlIGV4ZWN1dGVkCit3aGVuIHlvdSBjb250aW51ZSBleGVjdXRpb24gd2l0aG91dCBjaGFuZ2luZyB0aGUgZXhlY3V0aW9uIGFkZHJlc3MuCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBjbGVhcgorQGl0ZW0gY2xlYXIKK0RlbGV0ZSBhbnkgYnJlYWtwb2ludHMgYXQgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gdG8gYmUgZXhlY3V0ZWQgaW4gdGhlCitzZWxlY3RlZCBzdGFjayBmcmFtZSAoQHB4cmVme1NlbGVjdGlvbiwgLFNlbGVjdGluZyBhIGZyYW1lfSkuICBXaGVuCit0aGUgaW5uZXJtb3N0IGZyYW1lIGlzIHNlbGVjdGVkLCB0aGlzIGlzIGEgZ29vZCB3YXkgdG8gZGVsZXRlIGEKK2JyZWFrcG9pbnQgd2hlcmUgeW91ciBwcm9ncmFtIGp1c3Qgc3RvcHBlZC4KKworQGl0ZW0gY2xlYXIgQHZhcntmdW5jdGlvbn0KK0BpdGVteCBjbGVhciBAdmFye2ZpbGVuYW1lfTpAdmFye2Z1bmN0aW9ufQorRGVsZXRlIGFueSBicmVha3BvaW50cyBzZXQgYXQgZW50cnkgdG8gdGhlIGZ1bmN0aW9uIEB2YXJ7ZnVuY3Rpb259LgorCitAaXRlbSBjbGVhciBAdmFye2xpbmVudW19CitAaXRlbXggY2xlYXIgQHZhcntmaWxlbmFtZX06QHZhcntsaW5lbnVtfQorRGVsZXRlIGFueSBicmVha3BvaW50cyBzZXQgYXQgb3Igd2l0aGluIHRoZSBjb2RlIG9mIHRoZSBzcGVjaWZpZWQgbGluZS4KKworQGNpbmRleCBkZWxldGUgYnJlYWtwb2ludHMKK0BraW5kZXggZGVsZXRlCitAa2luZGV4IGQKK0BpdGVtIGRlbGV0ZSBAcntbfWJyZWFrcG9pbnRzQHJ7XX0gQHJ7W31AdmFye2JudW1zfUBkb3Rze31AcntdfQorRGVsZXRlIHRoZSBicmVha3BvaW50cywgd2F0Y2hwb2ludHMsIG9yIGNhdGNocG9pbnRzIG9mIHRoZSBudW1iZXJzCitzcGVjaWZpZWQgYXMgYXJndW1lbnRzLiAgSWYgbm8gYXJndW1lbnQgaXMgc3BlY2lmaWVkLCBkZWxldGUgYWxsCiticmVha3BvaW50cyAoQHZhbHVle0dEQk59IGFza3MgY29uZmlybWF0aW9uLCB1bmxlc3MgeW91IGhhdmUgQGNvZGV7c2V0Citjb25maXJtIG9mZn0pLiAgWW91IGNhbiBhYmJyZXZpYXRlIHRoaXMgY29tbWFuZCBhcyBAY29kZXtkfS4KK0BlbmQgdGFibGUKKworQG5vZGUgRGlzYWJsaW5nLCBDb25kaXRpb25zLCBEZWxldGUgQnJlYWtzLCBCcmVha3BvaW50cworQHN1YnNlY3Rpb24gRGlzYWJsaW5nIGJyZWFrcG9pbnRzCisKK0BraW5kZXggZGlzYWJsZSBicmVha3BvaW50cworQGtpbmRleCBlbmFibGUgYnJlYWtwb2ludHMKK1JhdGhlciB0aGFuIGRlbGV0aW5nIGEgYnJlYWtwb2ludCwgd2F0Y2hwb2ludCwgb3IgY2F0Y2hwb2ludCwgeW91IG1pZ2h0CitwcmVmZXIgdG8gQGRmbntkaXNhYmxlfSBpdC4gIFRoaXMgbWFrZXMgdGhlIGJyZWFrcG9pbnQgaW5vcGVyYXRpdmUgYXMgaWYKK2l0IGhhZCBiZWVuIGRlbGV0ZWQsIGJ1dCByZW1lbWJlcnMgdGhlIGluZm9ybWF0aW9uIG9uIHRoZSBicmVha3BvaW50IHNvCit0aGF0IHlvdSBjYW4gQGRmbntlbmFibGV9IGl0IGFnYWluIGxhdGVyLgorCitZb3UgZGlzYWJsZSBhbmQgZW5hYmxlIGJyZWFrcG9pbnRzLCB3YXRjaHBvaW50cywgYW5kIGNhdGNocG9pbnRzIHdpdGgKK3RoZSBAY29kZXtlbmFibGV9IGFuZCBAY29kZXtkaXNhYmxlfSBjb21tYW5kcywgb3B0aW9uYWxseSBzcGVjaWZ5aW5nIG9uZQorb3IgbW9yZSBicmVha3BvaW50IG51bWJlcnMgYXMgYXJndW1lbnRzLiAgVXNlIEBjb2Rle2luZm8gYnJlYWt9IG9yCitAY29kZXtpbmZvIHdhdGNofSB0byBwcmludCBhIGxpc3Qgb2YgYnJlYWtwb2ludHMsIHdhdGNocG9pbnRzLCBhbmQKK2NhdGNocG9pbnRzIGlmIHlvdSBkbyBub3Qga25vdyB3aGljaCBudW1iZXJzIHRvIHVzZS4KKworQSBicmVha3BvaW50LCB3YXRjaHBvaW50LCBvciBjYXRjaHBvaW50IGNhbiBoYXZlIGFueSBvZiBmb3VyIGRpZmZlcmVudAorc3RhdGVzIG9mIGVuYWJsZW1lbnQ6CisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitFbmFibGVkLiAgVGhlIGJyZWFrcG9pbnQgc3RvcHMgeW91ciBwcm9ncmFtLiAgQSBicmVha3BvaW50IHNldAord2l0aCB0aGUgQGNvZGV7YnJlYWt9IGNvbW1hbmQgc3RhcnRzIG91dCBpbiB0aGlzIHN0YXRlLgorQGl0ZW0KK0Rpc2FibGVkLiAgVGhlIGJyZWFrcG9pbnQgaGFzIG5vIGVmZmVjdCBvbiB5b3VyIHByb2dyYW0uCitAaXRlbQorRW5hYmxlZCBvbmNlLiAgVGhlIGJyZWFrcG9pbnQgc3RvcHMgeW91ciBwcm9ncmFtLCBidXQgdGhlbiBiZWNvbWVzCitkaXNhYmxlZC4gIEEgYnJlYWtwb2ludCBzZXQgd2l0aCB0aGUgQGNvZGV7dGJyZWFrfSBjb21tYW5kIHN0YXJ0cyBvdXQgaW4KK3RoaXMgc3RhdGUuCitAaXRlbQorRW5hYmxlZCBmb3IgZGVsZXRpb24uICBUaGUgYnJlYWtwb2ludCBzdG9wcyB5b3VyIHByb2dyYW0sIGJ1dAoraW1tZWRpYXRlbHkgYWZ0ZXIgaXQgZG9lcyBzbyBpdCBpcyBkZWxldGVkIHBlcm1hbmVudGx5LgorQGVuZCBpdGVtaXplCisKK1lvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgdG8gZW5hYmxlIG9yIGRpc2FibGUgYnJlYWtwb2ludHMsCit3YXRjaHBvaW50cywgYW5kIGNhdGNocG9pbnRzOgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggZGlzYWJsZSBicmVha3BvaW50cworQGtpbmRleCBkaXNhYmxlCitAa2luZGV4IGRpcworQGl0ZW0gZGlzYWJsZSBAcntbfWJyZWFrcG9pbnRzQHJ7XX0gQHJ7W31AdmFye2JudW1zfUBkb3Rze31AcntdfQorRGlzYWJsZSB0aGUgc3BlY2lmaWVkIGJyZWFrcG9pbnRzLS0tb3IgYWxsIGJyZWFrcG9pbnRzLCBpZiBub25lIGFyZQorbGlzdGVkLiAgQSBkaXNhYmxlZCBicmVha3BvaW50IGhhcyBubyBlZmZlY3QgYnV0IGlzIG5vdCBmb3Jnb3R0ZW4uICBBbGwKK29wdGlvbnMgc3VjaCBhcyBpZ25vcmUtY291bnRzLCBjb25kaXRpb25zIGFuZCBjb21tYW5kcyBhcmUgcmVtZW1iZXJlZCBpbgorY2FzZSB0aGUgYnJlYWtwb2ludCBpcyBlbmFibGVkIGFnYWluIGxhdGVyLiAgWW91IG1heSBhYmJyZXZpYXRlCitAY29kZXtkaXNhYmxlfSBhcyBAY29kZXtkaXN9LgorCitAa2luZGV4IGVuYWJsZSBicmVha3BvaW50cworQGtpbmRleCBlbmFibGUKK0BpdGVtIGVuYWJsZSBAcntbfWJyZWFrcG9pbnRzQHJ7XX0gQHJ7W31AdmFye2JudW1zfUBkb3Rze31AcntdfQorRW5hYmxlIHRoZSBzcGVjaWZpZWQgYnJlYWtwb2ludHMgKG9yIGFsbCBkZWZpbmVkIGJyZWFrcG9pbnRzKS4gIFRoZXkKK2JlY29tZSBlZmZlY3RpdmUgb25jZSBhZ2FpbiBpbiBzdG9wcGluZyB5b3VyIHByb2dyYW0uCisKK0BpdGVtIGVuYWJsZSBAcntbfWJyZWFrcG9pbnRzQHJ7XX0gb25jZSBAdmFye2JudW1zfUBkb3Rze30KK0VuYWJsZSB0aGUgc3BlY2lmaWVkIGJyZWFrcG9pbnRzIHRlbXBvcmFyaWx5LiAgQHZhbHVle0dEQk59IGRpc2FibGVzIGFueQorb2YgdGhlc2UgYnJlYWtwb2ludHMgaW1tZWRpYXRlbHkgYWZ0ZXIgc3RvcHBpbmcgeW91ciBwcm9ncmFtLgorCitAaXRlbSBlbmFibGUgQHJ7W31icmVha3BvaW50c0Bye119IGRlbGV0ZSBAdmFye2JudW1zfUBkb3Rze30KK0VuYWJsZSB0aGUgc3BlY2lmaWVkIGJyZWFrcG9pbnRzIHRvIHdvcmsgb25jZSwgdGhlbiBkaWUuICBAdmFsdWV7R0RCTn0KK2RlbGV0ZXMgYW55IG9mIHRoZXNlIGJyZWFrcG9pbnRzIGFzIHNvb24gYXMgeW91ciBwcm9ncmFtIHN0b3BzIHRoZXJlLgorQGVuZCB0YWJsZQorCitFeGNlcHQgZm9yIGEgYnJlYWtwb2ludCBzZXQgd2l0aCBAY29kZXt0YnJlYWt9IChAcHhyZWZ7U2V0IEJyZWFrcywKKyxTZXR0aW5nIGJyZWFrcG9pbnRzfSksIGJyZWFrcG9pbnRzIHRoYXQgeW91IHNldCBhcmUgaW5pdGlhbGx5IGVuYWJsZWQ7CitzdWJzZXF1ZW50bHksIHRoZXkgYmVjb21lIGRpc2FibGVkIG9yIGVuYWJsZWQgb25seSB3aGVuIHlvdSB1c2Ugb25lIG9mCit0aGUgY29tbWFuZHMgYWJvdmUuICAoVGhlIGNvbW1hbmQgQGNvZGV7dW50aWx9IGNhbiBzZXQgYW5kIGRlbGV0ZSBhCiticmVha3BvaW50IG9mIGl0cyBvd24sIGJ1dCBpdCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIG9mIHlvdXIgb3RoZXIKK2JyZWFrcG9pbnRzOyBzZWUgQHJlZntDb250aW51aW5nIGFuZCBTdGVwcGluZywgLENvbnRpbnVpbmcgYW5kCitzdGVwcGluZ30uKQorCitAbm9kZSBDb25kaXRpb25zLCBCcmVhayBDb21tYW5kcywgRGlzYWJsaW5nLCBCcmVha3BvaW50cworQHN1YnNlY3Rpb24gQnJlYWsgY29uZGl0aW9ucworQGNpbmRleCBjb25kaXRpb25hbCBicmVha3BvaW50cworQGNpbmRleCBicmVha3BvaW50IGNvbmRpdGlvbnMKKworQGMgRklYTUUgd2hhdCBpcyBzY29wZSBvZiBicmVhayBjb25kaXRpb24gZXhwcj8gIENvbnRleHQgd2hlcmUgd2FudGVkPworQGMgICAgICBpbiBwYXJ0aWN1bGFyIGZvciBhIHdhdGNocG9pbnQ/ICAKK1RoZSBzaW1wbGVzdCBzb3J0IG9mIGJyZWFrcG9pbnQgYnJlYWtzIGV2ZXJ5IHRpbWUgeW91ciBwcm9ncmFtIHJlYWNoZXMgYQorc3BlY2lmaWVkIHBsYWNlLiAgWW91IGNhbiBhbHNvIHNwZWNpZnkgYSBAZGZue2NvbmRpdGlvbn0gZm9yIGEKK2JyZWFrcG9pbnQuICBBIGNvbmRpdGlvbiBpcyBqdXN0IGEgQm9vbGVhbiBleHByZXNzaW9uIGluIHlvdXIKK3Byb2dyYW1taW5nIGxhbmd1YWdlIChAcHhyZWZ7RXhwcmVzc2lvbnMsICxFeHByZXNzaW9uc30pLiAgQSBicmVha3BvaW50IHdpdGgKK2EgY29uZGl0aW9uIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBlYWNoIHRpbWUgeW91ciBwcm9ncmFtIHJlYWNoZXMgaXQsCithbmQgeW91ciBwcm9ncmFtIHN0b3BzIG9ubHkgaWYgdGhlIGNvbmRpdGlvbiBpcyBAZW1waHt0cnVlfS4KKworVGhpcyBpcyB0aGUgY29udmVyc2Ugb2YgdXNpbmcgYXNzZXJ0aW9ucyBmb3IgcHJvZ3JhbSB2YWxpZGF0aW9uOyBpbiB0aGF0CitzaXR1YXRpb24sIHlvdSB3YW50IHRvIHN0b3Agd2hlbiB0aGUgYXNzZXJ0aW9uIGlzIHZpb2xhdGVkLS0tdGhhdCBpcywKK3doZW4gdGhlIGNvbmRpdGlvbiBpcyBmYWxzZS4gIEluIEMsIGlmIHlvdSB3YW50IHRvIHRlc3QgYW4gYXNzZXJ0aW9uIGV4cHJlc3NlZAorYnkgdGhlIGNvbmRpdGlvbiBAdmFye2Fzc2VydH0sIHlvdSBzaG91bGQgc2V0IHRoZSBjb25kaXRpb24KK0BzYW1weyEgQHZhcnthc3NlcnR9fSBvbiB0aGUgYXBwcm9wcmlhdGUgYnJlYWtwb2ludC4KKworQ29uZGl0aW9ucyBhcmUgYWxzbyBhY2NlcHRlZCBmb3Igd2F0Y2hwb2ludHM7IHlvdSBtYXkgbm90IG5lZWQgdGhlbSwKK3NpbmNlIGEgd2F0Y2hwb2ludCBpcyBpbnNwZWN0aW5nIHRoZSB2YWx1ZSBvZiBhbiBleHByZXNzaW9uIGFueWhvdy0tLWJ1dAoraXQgbWlnaHQgYmUgc2ltcGxlciwgc2F5LCB0byBqdXN0IHNldCBhIHdhdGNocG9pbnQgb24gYSB2YXJpYWJsZSBuYW1lLAorYW5kIHNwZWNpZnkgYSBjb25kaXRpb24gdGhhdCB0ZXN0cyB3aGV0aGVyIHRoZSBuZXcgdmFsdWUgaXMgYW4gaW50ZXJlc3RpbmcKK29uZS4KKworQnJlYWsgY29uZGl0aW9ucyBjYW4gaGF2ZSBzaWRlIGVmZmVjdHMsIGFuZCBtYXkgZXZlbiBjYWxsIGZ1bmN0aW9ucyBpbgoreW91ciBwcm9ncmFtLiAgVGhpcyBjYW4gYmUgdXNlZnVsLCBmb3IgZXhhbXBsZSwgdG8gYWN0aXZhdGUgZnVuY3Rpb25zCit0aGF0IGxvZyBwcm9ncmFtIHByb2dyZXNzLCBvciB0byB1c2UgeW91ciBvd24gcHJpbnQgZnVuY3Rpb25zIHRvCitmb3JtYXQgc3BlY2lhbCBkYXRhIHN0cnVjdHVyZXMuIFRoZSBlZmZlY3RzIGFyZSBjb21wbGV0ZWx5IHByZWRpY3RhYmxlCit1bmxlc3MgdGhlcmUgaXMgYW5vdGhlciBlbmFibGVkIGJyZWFrcG9pbnQgYXQgdGhlIHNhbWUgYWRkcmVzcy4gIChJbgordGhhdCBjYXNlLCBAdmFsdWV7R0RCTn0gbWlnaHQgc2VlIHRoZSBvdGhlciBicmVha3BvaW50IGZpcnN0IGFuZCBzdG9wIHlvdXIKK3Byb2dyYW0gd2l0aG91dCBjaGVja2luZyB0aGUgY29uZGl0aW9uIG9mIHRoaXMgb25lLikgIE5vdGUgdGhhdAorYnJlYWtwb2ludCBjb21tYW5kcyBhcmUgdXN1YWxseSBtb3JlIGNvbnZlbmllbnQgYW5kIGZsZXhpYmxlIGZvciB0aGUKK3B1cnBvc2Ugb2YgcGVyZm9ybWluZyBzaWRlIGVmZmVjdHMgd2hlbiBhIGJyZWFrcG9pbnQgaXMgcmVhY2hlZAorKEBweHJlZntCcmVhayBDb21tYW5kcywgLEJyZWFrcG9pbnQgY29tbWFuZCBsaXN0c30pLgorCitCcmVhayBjb25kaXRpb25zIGNhbiBiZSBzcGVjaWZpZWQgd2hlbiBhIGJyZWFrcG9pbnQgaXMgc2V0LCBieSB1c2luZworQHNhbXB7aWZ9IGluIHRoZSBhcmd1bWVudHMgdG8gdGhlIEBjb2Rle2JyZWFrfSBjb21tYW5kLiAgQHhyZWZ7U2V0CitCcmVha3MsICxTZXR0aW5nIGJyZWFrcG9pbnRzfS4gIFRoZXkgY2FuIGFsc28gYmUgY2hhbmdlZCBhdCBhbnkgdGltZQord2l0aCB0aGUgQGNvZGV7Y29uZGl0aW9ufSBjb21tYW5kLgorQGlmY2xlYXIgSFBQQQorQGMgVGhlIHdhdGNoIGNvbW1hbmQgbm93IHNlZW1zIHRvIHJlY29nbml6ZSB0aGUgaWYga2V5d29yZC4KK0BjIGNhdGNoIGRvZXNuJ3QsIHRob3VnaC4KK1RoZSBAY29kZXt3YXRjaH0gY29tbWFuZCBkb2VzIG5vdCByZWNvZ25pemUgdGhlIEBjb2Rle2lmfSBrZXl3b3JkOworQGNvZGV7Y29uZGl0aW9ufSBpcyB0aGUgb25seSB3YXkgdG8gaW1wb3NlIGEgZnVydGhlciBjb25kaXRpb24gb24gYQord2F0Y2hwb2ludC4KK0BlbmQgaWZjbGVhcgorQGlmc2V0IEhQUEEKK1lvdSBjYW4gYWxzbyB1c2UgdGhlIEBjb2Rle2lmfSBrZXl3b3JkIHdpdGggdGhlIEBjb2Rle3dhdGNofSBjb21tYW5kLgorVGhlIEBjb2Rle2NhdGNofSBjb21tYW5kIGRvZXMgbm90IHJlY29nbml6ZSB0aGUgQGNvZGV7aWZ9IGtleXdvcmQ7CitAY29kZXtjb25kaXRpb259IGlzIHRoZSBvbmx5IHdheSB0byBpbXBvc2UgYSBmdXJ0aGVyIGNvbmRpdGlvbiBvbiBhCitjYXRjaHBvaW50LgorQGVuZCBpZnNldAorCitAdGFibGUgQGNvZGUKK0BraW5kZXggY29uZGl0aW9uCitAaXRlbSBjb25kaXRpb24gQHZhcntibnVtfSBAdmFye2V4cHJlc3Npb259CitTcGVjaWZ5IEB2YXJ7ZXhwcmVzc2lvbn0gYXMgdGhlIGJyZWFrIGNvbmRpdGlvbiBmb3IgYnJlYWtwb2ludCwKK3dhdGNocG9pbnQsIG9yIGNhdGNocG9pbnQgbnVtYmVyIEB2YXJ7Ym51bX0uICBBZnRlciB5b3Ugc2V0IGEgY29uZGl0aW9uLAorYnJlYWtwb2ludCBAdmFye2JudW19IHN0b3BzIHlvdXIgcHJvZ3JhbSBvbmx5IGlmIHRoZSB2YWx1ZSBvZgorQHZhcntleHByZXNzaW9ufSBpcyB0cnVlIChub256ZXJvLCBpbiBDKS4gIFdoZW4geW91IHVzZQorQGNvZGV7Y29uZGl0aW9ufSwgQHZhbHVle0dEQk59IGNoZWNrcyBAdmFye2V4cHJlc3Npb259IGltbWVkaWF0ZWx5IGZvcgorc3ludGFjdGljIGNvcnJlY3RuZXNzLCBhbmQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgc3ltYm9scyBpbiBpdCBoYXZlCityZWZlcmVudHMgaW4gdGhlIGNvbnRleHQgb2YgeW91ciBicmVha3BvaW50LgorQGMgRklYTUUgc28gd2hhdCBkb2VzIEdEQiBkbyBpZiB0aGVyZSBpcyBubyByZWZlcmVudD8gIE1vcmVvdmVyLCB3aGF0CitAYyBhYm91dCB3YXRjaHBvaW50cz8KK0B2YWx1ZXtHREJOfSBkb2VzCitub3QgYWN0dWFsbHkgZXZhbHVhdGUgQHZhcntleHByZXNzaW9ufSBhdCB0aGUgdGltZSB0aGUgQGNvZGV7Y29uZGl0aW9ufQorY29tbWFuZCBpcyBnaXZlbiwgaG93ZXZlci4gIEB4cmVme0V4cHJlc3Npb25zLCAsRXhwcmVzc2lvbnN9LgorCitAaXRlbSBjb25kaXRpb24gQHZhcntibnVtfQorUmVtb3ZlIHRoZSBjb25kaXRpb24gZnJvbSBicmVha3BvaW50IG51bWJlciBAdmFye2JudW19LiAgSXQgYmVjb21lcworYW4gb3JkaW5hcnkgdW5jb25kaXRpb25hbCBicmVha3BvaW50LgorQGVuZCB0YWJsZQorCitAY2luZGV4IGlnbm9yZSBjb3VudCAob2YgYnJlYWtwb2ludCkKK0Egc3BlY2lhbCBjYXNlIG9mIGEgYnJlYWtwb2ludCBjb25kaXRpb24gaXMgdG8gc3RvcCBvbmx5IHdoZW4gdGhlCiticmVha3BvaW50IGhhcyBiZWVuIHJlYWNoZWQgYSBjZXJ0YWluIG51bWJlciBvZiB0aW1lcy4gIFRoaXMgaXMgc28KK3VzZWZ1bCB0aGF0IHRoZXJlIGlzIGEgc3BlY2lhbCB3YXkgdG8gZG8gaXQsIHVzaW5nIHRoZSBAZGZue2lnbm9yZQorY291bnR9IG9mIHRoZSBicmVha3BvaW50LiAgRXZlcnkgYnJlYWtwb2ludCBoYXMgYW4gaWdub3JlIGNvdW50LCB3aGljaAoraXMgYW4gaW50ZWdlci4gIE1vc3Qgb2YgdGhlIHRpbWUsIHRoZSBpZ25vcmUgY291bnQgaXMgemVybywgYW5kCit0aGVyZWZvcmUgaGFzIG5vIGVmZmVjdC4gIEJ1dCBpZiB5b3VyIHByb2dyYW0gcmVhY2hlcyBhIGJyZWFrcG9pbnQgd2hvc2UKK2lnbm9yZSBjb3VudCBpcyBwb3NpdGl2ZSwgdGhlbiBpbnN0ZWFkIG9mIHN0b3BwaW5nLCBpdCBqdXN0IGRlY3JlbWVudHMKK3RoZSBpZ25vcmUgY291bnQgYnkgb25lIGFuZCBjb250aW51ZXMuICBBcyBhIHJlc3VsdCwgaWYgdGhlIGlnbm9yZSBjb3VudAordmFsdWUgaXMgQHZhcntufSwgdGhlIGJyZWFrcG9pbnQgZG9lcyBub3Qgc3RvcCB0aGUgbmV4dCBAdmFye259IHRpbWVzCit5b3VyIHByb2dyYW0gcmVhY2hlcyBpdC4KKworQHRhYmxlIEBjb2RlCitAa2luZGV4IGlnbm9yZQorQGl0ZW0gaWdub3JlIEB2YXJ7Ym51bX0gQHZhcntjb3VudH0KK1NldCB0aGUgaWdub3JlIGNvdW50IG9mIGJyZWFrcG9pbnQgbnVtYmVyIEB2YXJ7Ym51bX0gdG8gQHZhcntjb3VudH0uCitUaGUgbmV4dCBAdmFye2NvdW50fSB0aW1lcyB0aGUgYnJlYWtwb2ludCBpcyByZWFjaGVkLCB5b3VyIHByb2dyYW0ncworZXhlY3V0aW9uIGRvZXMgbm90IHN0b3A7IG90aGVyIHRoYW4gdG8gZGVjcmVtZW50IHRoZSBpZ25vcmUgY291bnQsIEB2YWx1ZXtHREJOfQordGFrZXMgbm8gYWN0aW9uLgorCitUbyBtYWtlIHRoZSBicmVha3BvaW50IHN0b3AgdGhlIG5leHQgdGltZSBpdCBpcyByZWFjaGVkLCBzcGVjaWZ5CithIGNvdW50IG9mIHplcm8uCisKK1doZW4geW91IHVzZSBAY29kZXtjb250aW51ZX0gdG8gcmVzdW1lIGV4ZWN1dGlvbiBvZiB5b3VyIHByb2dyYW0gZnJvbSBhCiticmVha3BvaW50LCB5b3UgY2FuIHNwZWNpZnkgYW4gaWdub3JlIGNvdW50IGRpcmVjdGx5IGFzIGFuIGFyZ3VtZW50IHRvCitAY29kZXtjb250aW51ZX0sIHJhdGhlciB0aGFuIHVzaW5nIEBjb2Rle2lnbm9yZX0uICBAeHJlZntDb250aW51aW5nIGFuZAorU3RlcHBpbmcsLENvbnRpbnVpbmcgYW5kIHN0ZXBwaW5nfS4KKworSWYgYSBicmVha3BvaW50IGhhcyBhIHBvc2l0aXZlIGlnbm9yZSBjb3VudCBhbmQgYSBjb25kaXRpb24sIHRoZQorY29uZGl0aW9uIGlzIG5vdCBjaGVja2VkLiAgT25jZSB0aGUgaWdub3JlIGNvdW50IHJlYWNoZXMgemVybywKK0B2YWx1ZXtHREJOfSByZXN1bWVzIGNoZWNraW5nIHRoZSBjb25kaXRpb24uCisKK1lvdSBjb3VsZCBhY2hpZXZlIHRoZSBlZmZlY3Qgb2YgdGhlIGlnbm9yZSBjb3VudCB3aXRoIGEgY29uZGl0aW9uIHN1Y2gKK2FzIEB3e0BzYW1weyRmb28tLSA8PSAwfX0gdXNpbmcgYSBkZWJ1Z2dlciBjb252ZW5pZW5jZSB2YXJpYWJsZSB0aGF0CitpcyBkZWNyZW1lbnRlZCBlYWNoIHRpbWUuICBAeHJlZntDb252ZW5pZW5jZSBWYXJzLCAsQ29udmVuaWVuY2UKK3ZhcmlhYmxlc30uCitAZW5kIHRhYmxlCisKK0lnbm9yZSBjb3VudHMgYXBwbHkgdG8gYnJlYWtwb2ludHMsIHdhdGNocG9pbnRzLCBhbmQgY2F0Y2hwb2ludHMuCisKKworQG5vZGUgQnJlYWsgQ29tbWFuZHMsIEJyZWFrcG9pbnQgTWVudXMsIENvbmRpdGlvbnMsIEJyZWFrcG9pbnRzCitAc3Vic2VjdGlvbiBCcmVha3BvaW50IGNvbW1hbmQgbGlzdHMKKworQGNpbmRleCBicmVha3BvaW50IGNvbW1hbmRzCitZb3UgY2FuIGdpdmUgYW55IGJyZWFrcG9pbnQgKG9yIHdhdGNocG9pbnQgb3IgY2F0Y2hwb2ludCkgYSBzZXJpZXMgb2YKK2NvbW1hbmRzIHRvIGV4ZWN1dGUgd2hlbiB5b3VyIHByb2dyYW0gc3RvcHMgZHVlIHRvIHRoYXQgYnJlYWtwb2ludC4gIEZvcgorZXhhbXBsZSwgeW91IG1pZ2h0IHdhbnQgdG8gcHJpbnQgdGhlIHZhbHVlcyBvZiBjZXJ0YWluIGV4cHJlc3Npb25zLCBvcgorZW5hYmxlIG90aGVyIGJyZWFrcG9pbnRzLgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggY29tbWFuZHMKK0BraW5kZXggZW5kCitAaXRlbSBjb21tYW5kcyBAcntbfUB2YXJ7Ym51bX1AcntdfQorQGl0ZW14IEBkb3Rze30gQHZhcntjb21tYW5kLWxpc3R9IEBkb3Rze30KK0BpdGVteCBlbmQKK1NwZWNpZnkgYSBsaXN0IG9mIGNvbW1hbmRzIGZvciBicmVha3BvaW50IG51bWJlciBAdmFye2JudW19LiAgVGhlIGNvbW1hbmRzCit0aGVtc2VsdmVzIGFwcGVhciBvbiB0aGUgZm9sbG93aW5nIGxpbmVzLiAgVHlwZSBhIGxpbmUgY29udGFpbmluZyBqdXN0CitAY29kZXtlbmR9IHRvIHRlcm1pbmF0ZSB0aGUgY29tbWFuZHMuCisKK1RvIHJlbW92ZSBhbGwgY29tbWFuZHMgZnJvbSBhIGJyZWFrcG9pbnQsIHR5cGUgQGNvZGV7Y29tbWFuZHN9IGFuZAorZm9sbG93IGl0IGltbWVkaWF0ZWx5IHdpdGggQGNvZGV7ZW5kfTsgdGhhdCBpcywgZ2l2ZSBubyBjb21tYW5kcy4KKworV2l0aCBubyBAdmFye2JudW19IGFyZ3VtZW50LCBAY29kZXtjb21tYW5kc30gcmVmZXJzIHRvIHRoZSBsYXN0CiticmVha3BvaW50LCB3YXRjaHBvaW50LCBvciBjYXRjaHBvaW50IHNldCAobm90IHRvIHRoZSBicmVha3BvaW50IG1vc3QKK3JlY2VudGx5IGVuY291bnRlcmVkKS4KK0BlbmQgdGFibGUKKworUHJlc3NpbmcgQGtleXtSRVR9IGFzIGEgbWVhbnMgb2YgcmVwZWF0aW5nIHRoZSBsYXN0IEB2YWx1ZXtHREJOfSBjb21tYW5kIGlzCitkaXNhYmxlZCB3aXRoaW4gYSBAdmFye2NvbW1hbmQtbGlzdH0uCisKK1lvdSBjYW4gdXNlIGJyZWFrcG9pbnQgY29tbWFuZHMgdG8gc3RhcnQgeW91ciBwcm9ncmFtIHVwIGFnYWluLiAgU2ltcGx5Cit1c2UgdGhlIEBjb2Rle2NvbnRpbnVlfSBjb21tYW5kLCBvciBAY29kZXtzdGVwfSwgb3IgYW55IG90aGVyIGNvbW1hbmQKK3RoYXQgcmVzdW1lcyBleGVjdXRpb24uCisKK0FueSBvdGhlciBjb21tYW5kcyBpbiB0aGUgY29tbWFuZCBsaXN0LCBhZnRlciBhIGNvbW1hbmQgdGhhdCByZXN1bWVzCitleGVjdXRpb24sIGFyZSBpZ25vcmVkLiAgVGhpcyBpcyBiZWNhdXNlIGFueSB0aW1lIHlvdSByZXN1bWUgZXhlY3V0aW9uCisoZXZlbiB3aXRoIGEgc2ltcGxlIEBjb2Rle25leHR9IG9yIEBjb2Rle3N0ZXB9KSwgeW91IG1heSBlbmNvdW50ZXIKK2Fub3RoZXIgYnJlYWtwb2ludC0tLXdoaWNoIGNvdWxkIGhhdmUgaXRzIG93biBjb21tYW5kIGxpc3QsIGxlYWRpbmcgdG8KK2FtYmlndWl0aWVzIGFib3V0IHdoaWNoIGxpc3QgdG8gZXhlY3V0ZS4KKworQGtpbmRleCBzaWxlbnQKK0lmIHRoZSBmaXJzdCBjb21tYW5kIHlvdSBzcGVjaWZ5IGluIGEgY29tbWFuZCBsaXN0IGlzIEBjb2Rle3NpbGVudH0sIHRoZQordXN1YWwgbWVzc2FnZSBhYm91dCBzdG9wcGluZyBhdCBhIGJyZWFrcG9pbnQgaXMgbm90IHByaW50ZWQuICBUaGlzIG1heQorYmUgZGVzaXJhYmxlIGZvciBicmVha3BvaW50cyB0aGF0IGFyZSB0byBwcmludCBhIHNwZWNpZmljIG1lc3NhZ2UgYW5kCit0aGVuIGNvbnRpbnVlLiAgSWYgbm9uZSBvZiB0aGUgcmVtYWluaW5nIGNvbW1hbmRzIHByaW50IGFueXRoaW5nLCB5b3UKK3NlZSBubyBzaWduIHRoYXQgdGhlIGJyZWFrcG9pbnQgd2FzIHJlYWNoZWQuICBAY29kZXtzaWxlbnR9IGlzCittZWFuaW5nZnVsIG9ubHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJyZWFrcG9pbnQgY29tbWFuZCBsaXN0LgorCitUaGUgY29tbWFuZHMgQGNvZGV7ZWNob30sIEBjb2Rle291dHB1dH0sIGFuZCBAY29kZXtwcmludGZ9IGFsbG93IHlvdSB0bworcHJpbnQgcHJlY2lzZWx5IGNvbnRyb2xsZWQgb3V0cHV0LCBhbmQgYXJlIG9mdGVuIHVzZWZ1bCBpbiBzaWxlbnQKK2JyZWFrcG9pbnRzLiAgQHhyZWZ7T3V0cHV0LCAsQ29tbWFuZHMgZm9yIGNvbnRyb2xsZWQgb3V0cHV0fS4KKworRm9yIGV4YW1wbGUsIGhlcmUgaXMgaG93IHlvdSBjb3VsZCB1c2UgYnJlYWtwb2ludCBjb21tYW5kcyB0byBwcmludCB0aGUKK3ZhbHVlIG9mIEBjb2Rle3h9IGF0IGVudHJ5IHRvIEBjb2Rle2Zvb30gd2hlbmV2ZXIgQGNvZGV7eH0gaXMgcG9zaXRpdmUuCisKK0BleGFtcGxlCiticmVhayBmb28gaWYgeD4wCitjb21tYW5kcworc2lsZW50CitwcmludGYgInggaXMgJWRcbiIseAorY29udAorZW5kCitAZW5kIGV4YW1wbGUKKworT25lIGFwcGxpY2F0aW9uIGZvciBicmVha3BvaW50IGNvbW1hbmRzIGlzIHRvIGNvbXBlbnNhdGUgZm9yIG9uZSBidWcgc28KK3lvdSBjYW4gdGVzdCBmb3IgYW5vdGhlci4gIFB1dCBhIGJyZWFrcG9pbnQganVzdCBhZnRlciB0aGUgZXJyb25lb3VzIGxpbmUKK29mIGNvZGUsIGdpdmUgaXQgYSBjb25kaXRpb24gdG8gZGV0ZWN0IHRoZSBjYXNlIGluIHdoaWNoIHNvbWV0aGluZworZXJyb25lb3VzIGhhcyBiZWVuIGRvbmUsIGFuZCBnaXZlIGl0IGNvbW1hbmRzIHRvIGFzc2lnbiBjb3JyZWN0IHZhbHVlcwordG8gYW55IHZhcmlhYmxlcyB0aGF0IG5lZWQgdGhlbS4gIEVuZCB3aXRoIHRoZSBAY29kZXtjb250aW51ZX0gY29tbWFuZAorc28gdGhhdCB5b3VyIHByb2dyYW0gZG9lcyBub3Qgc3RvcCwgYW5kIHN0YXJ0IHdpdGggdGhlIEBjb2Rle3NpbGVudH0KK2NvbW1hbmQgc28gdGhhdCBubyBvdXRwdXQgaXMgcHJvZHVjZWQuICBIZXJlIGlzIGFuIGV4YW1wbGU6CisKK0BleGFtcGxlCiticmVhayA0MDMKK2NvbW1hbmRzCitzaWxlbnQKK3NldCB4ID0geSArIDQKK2NvbnQKK2VuZAorQGVuZCBleGFtcGxlCisKK0BpZmNsZWFyIENPTkxZCitAbm9kZSBCcmVha3BvaW50IE1lbnVzLCAgLCBCcmVhayBDb21tYW5kcywgQnJlYWtwb2ludHMKK0BzdWJzZWN0aW9uIEJyZWFrcG9pbnQgbWVudXMKK0BjaW5kZXggb3ZlcmxvYWRpbmcKK0BjaW5kZXggc3ltYm9sIG92ZXJsb2FkaW5nCisKK1NvbWUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIChub3RhYmx5IEMrKykgcGVybWl0IGEgc2luZ2xlIGZ1bmN0aW9uIG5hbWUKK3RvIGJlIGRlZmluZWQgc2V2ZXJhbCB0aW1lcywgZm9yIGFwcGxpY2F0aW9uIGluIGRpZmZlcmVudCBjb250ZXh0cy4KK1RoaXMgaXMgY2FsbGVkIEBkZm57b3ZlcmxvYWRpbmd9LiAgV2hlbiBhIGZ1bmN0aW9uIG5hbWUgaXMgb3ZlcmxvYWRlZCwKK0BzYW1we2JyZWFrIEB2YXJ7ZnVuY3Rpb259fSBpcyBub3QgZW5vdWdoIHRvIHRlbGwgQHZhbHVle0dEQk59IHdoZXJlIHlvdSB3YW50CithIGJyZWFrcG9pbnQuICBJZiB5b3UgcmVhbGl6ZSB0aGlzIGlzIGEgcHJvYmxlbSwgeW91IGNhbiB1c2UKK3NvbWV0aGluZyBsaWtlIEBzYW1we2JyZWFrIEB2YXJ7ZnVuY3Rpb259KEB2YXJ7dHlwZXN9KX0gdG8gc3BlY2lmeSB3aGljaAorcGFydGljdWxhciB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiB5b3Ugd2FudC4gIE90aGVyd2lzZSwgQHZhbHVle0dEQk59IG9mZmVycworeW91IGEgbWVudSBvZiBudW1iZXJlZCBjaG9pY2VzIGZvciBkaWZmZXJlbnQgcG9zc2libGUgYnJlYWtwb2ludHMsIGFuZAord2FpdHMgZm9yIHlvdXIgc2VsZWN0aW9uIHdpdGggdGhlIHByb21wdCBAc2FtcHs+fS4gIFRoZSBmaXJzdCB0d28KK29wdGlvbnMgYXJlIGFsd2F5cyBAc2FtcHtbMF0gY2FuY2VsfSBhbmQgQHNhbXB7WzFdIGFsbH0uICBUeXBpbmcgQGtiZHsxfQorc2V0cyBhIGJyZWFrcG9pbnQgYXQgZWFjaCBkZWZpbml0aW9uIG9mIEB2YXJ7ZnVuY3Rpb259LCBhbmQgdHlwaW5nCitAa2JkezB9IGFib3J0cyB0aGUgQGNvZGV7YnJlYWt9IGNvbW1hbmQgd2l0aG91dCBzZXR0aW5nIGFueSBuZXcKK2JyZWFrcG9pbnRzLgorCitGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzZXNzaW9uIGV4Y2VycHQgc2hvd3MgYW4gYXR0ZW1wdCB0byBzZXQgYQorYnJlYWtwb2ludCBhdCB0aGUgb3ZlcmxvYWRlZCBzeW1ib2wgQGNvZGV7U3RyaW5nOjphZnRlcn0uCitXZSBjaG9vc2UgdGhyZWUgcGFydGljdWxhciBkZWZpbml0aW9ucyBvZiB0aGF0IGZ1bmN0aW9uIG5hbWU6CisKK0BjIEZJWE1FISBUaGlzIGlzIGxpa2VseSB0byBjaGFuZ2UgdG8gc2hvdyBhcmcgdHlwZSBsaXN0cywgYXQgbGVhc3QKK0BzbWFsbGV4YW1wbGUKK0Bncm91cAorKEB2YWx1ZXtHREJQfSkgYiBTdHJpbmc6OmFmdGVyCitbMF0gY2FuY2VsCitbMV0gYWxsCitbMl0gZmlsZTpTdHJpbmcuY2M7IGxpbmUgbnVtYmVyOjg2NworWzNdIGZpbGU6U3RyaW5nLmNjOyBsaW5lIG51bWJlcjo4NjAKK1s0XSBmaWxlOlN0cmluZy5jYzsgbGluZSBudW1iZXI6ODc1CitbNV0gZmlsZTpTdHJpbmcuY2M7IGxpbmUgbnVtYmVyOjg1MworWzZdIGZpbGU6U3RyaW5nLmNjOyBsaW5lIG51bWJlcjo4NDYKK1s3XSBmaWxlOlN0cmluZy5jYzsgbGluZSBudW1iZXI6NzM1Cis+IDIgNCA2CitCcmVha3BvaW50IDEgYXQgMHhiMjZjOiBmaWxlIFN0cmluZy5jYywgbGluZSA4NjcuCitCcmVha3BvaW50IDIgYXQgMHhiMzQ0OiBmaWxlIFN0cmluZy5jYywgbGluZSA4NzUuCitCcmVha3BvaW50IDMgYXQgMHhhZmNjOiBmaWxlIFN0cmluZy5jYywgbGluZSA4NDYuCitNdWx0aXBsZSBicmVha3BvaW50cyB3ZXJlIHNldC4KK1VzZSB0aGUgImRlbGV0ZSIgY29tbWFuZCB0byBkZWxldGUgdW53YW50ZWQKKyBicmVha3BvaW50cy4KKyhAdmFsdWV7R0RCUH0pCitAZW5kIGdyb3VwCitAZW5kIHNtYWxsZXhhbXBsZQorQGVuZCBpZmNsZWFyCisKK0BjICBAaWZjbGVhciBCQVJFVEFSR0VUCitAYyAgQG5vZGUgRXJyb3IgaW4gQnJlYWtwb2ludHMKK0BjICBAc3Vic2VjdGlvbiBgYENhbm5vdCBpbnNlcnQgYnJlYWtwb2ludHMnJworQGMKK0BjICBGSVhNRSEhIDE0LzYvOTUgIElzIHRoZXJlIGEgcmVhbCBleGFtcGxlIG9mIHRoaXM/ICBMZXQncyB1c2UgaXQuCitAYworQGMgIFVuZGVyIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMsIGJyZWFrcG9pbnRzIGNhbm5vdCBiZSB1c2VkIGluIGEgcHJvZ3JhbSBpZgorQGMgIGFueSBvdGhlciBwcm9jZXNzIGlzIHJ1bm5pbmcgdGhhdCBwcm9ncmFtLiAgSW4gdGhpcyBzaXR1YXRpb24sCitAYyAgYXR0ZW1wdGluZyB0byBydW4gb3IgY29udGludWUgYSBwcm9ncmFtIHdpdGggYSBicmVha3BvaW50IGNhdXNlcyAKK0BjICBAdmFsdWV7R0RCTn0gdG8gc3RvcCB0aGUgb3RoZXIgcHJvY2Vzcy4KK0BjCitAYyAgV2hlbiB0aGlzIGhhcHBlbnMsIHlvdSBoYXZlIHRocmVlIHdheXMgdG8gcHJvY2VlZDoKK0BjCitAYyAgQGVudW1lcmF0ZQorQGMgIEBpdGVtCitAYyAgUmVtb3ZlIG9yIGRpc2FibGUgdGhlIGJyZWFrcG9pbnRzLCB0aGVuIGNvbnRpbnVlLgorQGMKK0BjICBAaXRlbQorQGMgIFN1c3BlbmQgQHZhbHVle0dEQk59LCBhbmQgY29weSB0aGUgZmlsZSBjb250YWluaW5nIHlvdXIgcHJvZ3JhbSB0byBhIG5ldyAKK0BjICBuYW1lLiAgUmVzdW1lIEB2YWx1ZXtHREJOfSBhbmQgdXNlIHRoZSBAY29kZXtleGVjLWZpbGV9IGNvbW1hbmQgdG8gc3BlY2lmeQorQGMgIHRoYXQgQHZhbHVle0dEQk59IHNob3VsZCBydW4geW91ciBwcm9ncmFtIHVuZGVyIHRoYXQgbmFtZS4gIAorQGMgIFRoZW4gc3RhcnQgeW91ciBwcm9ncmFtIGFnYWluLgorQGMKK0BjICBAaXRlbQorQGMgIFJlbGluayB5b3VyIHByb2dyYW0gc28gdGhhdCB0aGUgdGV4dCBzZWdtZW50IGlzIG5vbnNoYXJhYmxlLCB1c2luZyB0aGUKK0BjICBsaW5rZXIgb3B0aW9uIEBzYW1wey1OfS4gIFRoZSBvcGVyYXRpbmcgc3lzdGVtIGxpbWl0YXRpb24gbWF5IG5vdCBhcHBseQorQGMgIHRvIG5vbnNoYXJhYmxlIGV4ZWN1dGFibGVzLgorQGMgIEBlbmQgZW51bWVyYXRlCitAYyAgQGVuZCBpZmNsZWFyCisKK0Bub2RlIENvbnRpbnVpbmcgYW5kIFN0ZXBwaW5nLCBTaWduYWxzLCBCcmVha3BvaW50cywgU3RvcHBpbmcKK0BzZWN0aW9uIENvbnRpbnVpbmcgYW5kIHN0ZXBwaW5nCisKK0BjaW5kZXggc3RlcHBpbmcKK0BjaW5kZXggY29udGludWluZworQGNpbmRleCByZXN1bWluZyBleGVjdXRpb24KK0BkZm57Q29udGludWluZ30gbWVhbnMgcmVzdW1pbmcgcHJvZ3JhbSBleGVjdXRpb24gdW50aWwgeW91ciBwcm9ncmFtCitjb21wbGV0ZXMgbm9ybWFsbHkuICBJbiBjb250cmFzdCwgQGRmbntzdGVwcGluZ30gbWVhbnMgZXhlY3V0aW5nIGp1c3QKK29uZSBtb3JlIGBgc3RlcCcnIG9mIHlvdXIgcHJvZ3JhbSwgd2hlcmUgYGBzdGVwJycgbWF5IG1lYW4gZWl0aGVyIG9uZQorbGluZSBvZiBzb3VyY2UgY29kZSwgb3Igb25lIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gKGRlcGVuZGluZyBvbiB3aGF0CitwYXJ0aWN1bGFyIGNvbW1hbmQgeW91IHVzZSkuICBFaXRoZXIgd2hlbiBjb250aW51aW5nCitvciB3aGVuIHN0ZXBwaW5nLCB5b3VyIHByb2dyYW0gbWF5IHN0b3AgZXZlbiBzb29uZXIsIGR1ZSB0byAKK0BpZnNldCBCQVJFVEFSR0VUCithIGJyZWFrcG9pbnQuCitAZW5kIGlmc2V0CitAaWZjbGVhciBCQVJFVEFSR0VUCithIGJyZWFrcG9pbnQgb3IgYSBzaWduYWwuICAoSWYgZHVlIHRvIGEgc2lnbmFsLCB5b3UgbWF5IHdhbnQgdG8gdXNlCitAY29kZXtoYW5kbGV9LCBvciB1c2UgQHNhbXB7c2lnbmFsIDB9IHRvIHJlc3VtZSBleGVjdXRpb24uCitAeHJlZntTaWduYWxzLCAsU2lnbmFsc30uKQorQGVuZCBpZmNsZWFyCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBjb250aW51ZQorQGtpbmRleCBjCitAa2luZGV4IGZnCitAaXRlbSBjb250aW51ZSBAcntbfUB2YXJ7aWdub3JlLWNvdW50fUBye119CitAaXRlbXggYyBAcntbfUB2YXJ7aWdub3JlLWNvdW50fUBye119CitAaXRlbXggZmcgQHJ7W31AdmFye2lnbm9yZS1jb3VudH1AcntdfQorUmVzdW1lIHByb2dyYW0gZXhlY3V0aW9uLCBhdCB0aGUgYWRkcmVzcyB3aGVyZSB5b3VyIHByb2dyYW0gbGFzdCBzdG9wcGVkOworYW55IGJyZWFrcG9pbnRzIHNldCBhdCB0aGF0IGFkZHJlc3MgYXJlIGJ5cGFzc2VkLiAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50CitAdmFye2lnbm9yZS1jb3VudH0gYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEgZnVydGhlciBudW1iZXIgb2YgdGltZXMgdG8KK2lnbm9yZSBhIGJyZWFrcG9pbnQgYXQgdGhpcyBsb2NhdGlvbjsgaXRzIGVmZmVjdCBpcyBsaWtlIHRoYXQgb2YKK0Bjb2Rle2lnbm9yZX0gKEBweHJlZntDb25kaXRpb25zLCAsQnJlYWsgY29uZGl0aW9uc30pLgorCitUaGUgYXJndW1lbnQgQHZhcntpZ25vcmUtY291bnR9IGlzIG1lYW5pbmdmdWwgb25seSB3aGVuIHlvdXIgcHJvZ3JhbQorc3RvcHBlZCBkdWUgdG8gYSBicmVha3BvaW50LiAgQXQgb3RoZXIgdGltZXMsIHRoZSBhcmd1bWVudCB0bworQGNvZGV7Y29udGludWV9IGlzIGlnbm9yZWQuCisKK1RoZSBzeW5vbnltcyBAY29kZXtjfSBhbmQgQGNvZGV7Zmd9IGFyZSBwcm92aWRlZCBwdXJlbHkgZm9yIGNvbnZlbmllbmNlLAorYW5kIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBiZWhhdmlvciBhcyBAY29kZXtjb250aW51ZX0uCitAZW5kIHRhYmxlCisKK1RvIHJlc3VtZSBleGVjdXRpb24gYXQgYSBkaWZmZXJlbnQgcGxhY2UsIHlvdSBjYW4gdXNlIEBjb2Rle3JldHVybn0KKyhAcHhyZWZ7UmV0dXJuaW5nLCAsUmV0dXJuaW5nIGZyb20gYSBmdW5jdGlvbn0pIHRvIGdvIGJhY2sgdG8gdGhlCitjYWxsaW5nIGZ1bmN0aW9uOyBvciBAY29kZXtqdW1wfSAoQHB4cmVme0p1bXBpbmcsICxDb250aW51aW5nIGF0IGEKK2RpZmZlcmVudCBhZGRyZXNzfSkgdG8gZ28gdG8gYW4gYXJiaXRyYXJ5IGxvY2F0aW9uIGluIHlvdXIgcHJvZ3JhbS4KKworQSB0eXBpY2FsIHRlY2huaXF1ZSBmb3IgdXNpbmcgc3RlcHBpbmcgaXMgdG8gc2V0IGEgYnJlYWtwb2ludAorKEBweHJlZntCcmVha3BvaW50cywgLEJyZWFrcG9pbnRzOyB3YXRjaHBvaW50czsgYW5kIGNhdGNocG9pbnRzfSkgYXQgdGhlCitiZWdpbm5pbmcgb2YgdGhlIGZ1bmN0aW9uIG9yIHRoZSBzZWN0aW9uIG9mIHlvdXIgcHJvZ3JhbSB3aGVyZSBhIHByb2JsZW0KK2lzIGJlbGlldmVkIHRvIGxpZSwgcnVuIHlvdXIgcHJvZ3JhbSB1bnRpbCBpdCBzdG9wcyBhdCB0aGF0IGJyZWFrcG9pbnQsCithbmQgdGhlbiBzdGVwIHRocm91Z2ggdGhlIHN1c3BlY3QgYXJlYSwgZXhhbWluaW5nIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUKK2ludGVyZXN0aW5nLCB1bnRpbCB5b3Ugc2VlIHRoZSBwcm9ibGVtIGhhcHBlbi4KKworQHRhYmxlIEBjb2RlCitAa2luZGV4IHN0ZXAKK0BraW5kZXggcworQGl0ZW0gc3RlcAorQ29udGludWUgcnVubmluZyB5b3VyIHByb2dyYW0gdW50aWwgY29udHJvbCByZWFjaGVzIGEgZGlmZmVyZW50IHNvdXJjZQorbGluZSwgdGhlbiBzdG9wIGl0IGFuZCByZXR1cm4gY29udHJvbCB0byBAdmFsdWV7R0RCTn0uICBUaGlzIGNvbW1hbmQgaXMKK2FiYnJldmlhdGVkIEBjb2Rle3N9LgorCitAcXVvdGF0aW9uCitAYyAid2l0aG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24iIGlzIGltcHJlY2lzZTsgYWN0dWFsbHkgIndpdGhvdXQgbGluZQorQGMgbnVtYmVycyBpbiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIi4gIChnY2MgLWcxIGhhcyBkZWJ1Z2dpbmcgaW5mbyBidXQKK0BjIG5vdCBsaW5lIG51bWJlcnMpLiAgQnV0IGl0IHNlZW1zIGNvbXBsZXggdG8gdHJ5IHRvIG1ha2UgdGhhdAorQGMgZGlzdGluY3Rpb24gaGVyZS4KK0BlbXBoe1dhcm5pbmc6fSBJZiB5b3UgdXNlIHRoZSBAY29kZXtzdGVwfSBjb21tYW5kIHdoaWxlIGNvbnRyb2wgaXMKK3dpdGhpbiBhIGZ1bmN0aW9uIHRoYXQgd2FzIGNvbXBpbGVkIHdpdGhvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uLAorZXhlY3V0aW9uIHByb2NlZWRzIHVudGlsIGNvbnRyb2wgcmVhY2hlcyBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBoYXZlCitkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBMaWtld2lzZSwgaXQgd2lsbCBub3Qgc3RlcCBpbnRvIGEgZnVuY3Rpb24gd2hpY2gKK2lzIGNvbXBpbGVkIHdpdGhvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVG8gc3RlcCB0aHJvdWdoIGZ1bmN0aW9ucword2l0aG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHVzZSB0aGUgQGNvZGV7c3RlcGl9IGNvbW1hbmQsIGRlc2NyaWJlZAorYmVsb3cuCitAZW5kIHF1b3RhdGlvbgorCitUaGUgQGNvZGV7c3RlcH0gY29tbWFuZCBub3cgb25seSBzdG9wcyBhdCB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb2YgYQorc291cmNlIGxpbmUuICBUaGlzIHByZXZlbnRzIHRoZSBtdWx0aXBsZSBzdG9wcyB0aGF0IHVzZWQgdG8gb2NjdXIgaW4KK3N3aXRjaCBzdGF0ZW1lbnRzLCBmb3IgbG9vcHMsIGV0Yy4gIEBjb2Rle3N0ZXB9IGNvbnRpbnVlcyB0byBzdG9wIGlmIGEKK2Z1bmN0aW9uIHRoYXQgaGFzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBjYWxsZWQgd2l0aGluIHRoZSBsaW5lLgorCitBbHNvLCB0aGUgQGNvZGV7c3RlcH0gY29tbWFuZCBub3cgb25seSBlbnRlcnMgYSBzdWJyb3V0aW5lIGlmIHRoZXJlIGlzIGxpbmUKK251bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhlIHN1YnJvdXRpbmUuICBPdGhlcndpc2UgaXQgYWN0cyBsaWtlIHRoZQorQGNvZGV7bmV4dH0gY29tbWFuZC4gIFRoaXMgYXZvaWRzIHByb2JsZW1zIHdoZW4gdXNpbmcgQGNvZGV7Y2MgLWdsfSAKK29uIE1JUFMgbWFjaGluZXMuICBQcmV2aW91c2x5LCBAY29kZXtzdGVwfSBlbnRlcmVkIHN1YnJvdXRpbmVzIGlmIHRoZXJlCit3YXMgYW55IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcm91dGluZS4gIAorCitAaXRlbSBzdGVwIEB2YXJ7Y291bnR9CitDb250aW51ZSBydW5uaW5nIGFzIGluIEBjb2Rle3N0ZXB9LCBidXQgZG8gc28gQHZhcntjb3VudH0gdGltZXMuICBJZiBhCiticmVha3BvaW50IGlzIHJlYWNoZWQsCitAaWZjbGVhciBCQVJFVEFSR0VUCitvciBhIHNpZ25hbCBub3QgcmVsYXRlZCB0byBzdGVwcGluZyBvY2N1cnMgYmVmb3JlIEB2YXJ7Y291bnR9IHN0ZXBzLAorQGVuZCBpZmNsZWFyCitzdGVwcGluZyBzdG9wcyByaWdodCBhd2F5LgorCitAa2luZGV4IG5leHQKK0BraW5kZXggbgorQGl0ZW0gbmV4dCBAcntbfUB2YXJ7Y291bnR9QHJ7XX0KK0NvbnRpbnVlIHRvIHRoZSBuZXh0IHNvdXJjZSBsaW5lIGluIHRoZSBjdXJyZW50IChpbm5lcm1vc3QpIHN0YWNrIGZyYW1lLgorVGhpcyBpcyBzaW1pbGFyIHRvIEBjb2Rle3N0ZXB9LCBidXQgZnVuY3Rpb24gY2FsbHMgdGhhdCBhcHBlYXIgd2l0aGluIHRoZSBsaW5lCitvZiBjb2RlIGFyZSBleGVjdXRlZCB3aXRob3V0IHN0b3BwaW5nLiAgRXhlY3V0aW9uIHN0b3BzIHdoZW4gY29udHJvbAorcmVhY2hlcyBhIGRpZmZlcmVudCBsaW5lIG9mIGNvZGUgYXQgdGhlIG9yaWdpbmFsIHN0YWNrIGxldmVsIHRoYXQgd2FzIAorZXhlY3V0aW5nIHdoZW4geW91IGdhdmUgdGhlIEBjb2Rle25leHR9IGNvbW1hbmQuICBUaGlzIGNvbW1hbmQgaXMgYWJicmV2aWF0ZWQKK0Bjb2Rle259LgorCitBbiBhcmd1bWVudCBAdmFye2NvdW50fSBpcyBhIHJlcGVhdCBjb3VudCwgYXMgZm9yIEBjb2Rle3N0ZXB9LgorCisKK0BjICBGSVggTUUhISAgRG8gd2UgZGVsZXRlIHRoaXMsIG9yIGlzIHRoZXJlIGEgd2F5IGl0IGZpdHMgaW4gd2l0aAorQGMgIHRoZSBmb2xsb3dpbmcgcGFyYWdyYXBoPyAgIC0tLSAgVmN0b3JpYQorQGMKK0BjICBAY29kZXtuZXh0fSB3aXRoaW4gYSBmdW5jdGlvbiB0aGF0IGxhY2tzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhY3RzIGxpa2UKK0BjICBAY29kZXtzdGVwfSwgYnV0IGFueSBmdW5jdGlvbiBjYWxscyBhcHBlYXJpbmcgd2l0aGluIHRoZSBjb2RlIG9mIHRoZQorQGMgIGZ1bmN0aW9uIGFyZSBleGVjdXRlZCB3aXRob3V0IHN0b3BwaW5nLgorCitUaGUgQGNvZGV7bmV4dH0gY29tbWFuZCBub3cgb25seSBzdG9wcyBhdCB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb2YgYQorc291cmNlIGxpbmUuICBUaGlzIHByZXZlbnRzIHRoZSBtdWx0aXBsZSBzdG9wcyB0aGF0IHVzZWQgdG8gb2NjdXIgaW4KK3N3aXRjaCBzdGF0ZW1lbnRzLCBmb3IgbG9vcHMsIGV0Yy4gCisKK0BraW5kZXggZmluaXNoCitAaXRlbSBmaW5pc2gKK0NvbnRpbnVlIHJ1bm5pbmcgdW50aWwganVzdCBhZnRlciBmdW5jdGlvbiBpbiB0aGUgc2VsZWN0ZWQgc3RhY2sgZnJhbWUKK3JldHVybnMuICBQcmludCB0aGUgcmV0dXJuZWQgdmFsdWUgKGlmIGFueSkuCisKK0NvbnRyYXN0IHRoaXMgd2l0aCB0aGUgQGNvZGV7cmV0dXJufSBjb21tYW5kIChAcHhyZWZ7UmV0dXJuaW5nLAorLFJldHVybmluZyBmcm9tIGEgZnVuY3Rpb259KS4KKworQGtpbmRleCB1bnRpbAorQGtpbmRleCB1CitAaXRlbSB1bnRpbAorQGl0ZW14IHUKK0NvbnRpbnVlIHJ1bm5pbmcgdW50aWwgYSBzb3VyY2UgbGluZSBwYXN0IHRoZSBjdXJyZW50IGxpbmUsIGluIHRoZQorY3VycmVudCBzdGFjayBmcmFtZSwgaXMgcmVhY2hlZC4gIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGF2b2lkIHNpbmdsZQorc3RlcHBpbmcgdGhyb3VnaCBhIGxvb3AgbW9yZSB0aGFuIG9uY2UuICBJdCBpcyBsaWtlIHRoZSBAY29kZXtuZXh0fQorY29tbWFuZCwgZXhjZXB0IHRoYXQgd2hlbiBAY29kZXt1bnRpbH0gZW5jb3VudGVycyBhIGp1bXAsIGl0CithdXRvbWF0aWNhbGx5IGNvbnRpbnVlcyBleGVjdXRpb24gdW50aWwgdGhlIHByb2dyYW0gY291bnRlciBpcyBncmVhdGVyCit0aGFuIHRoZSBhZGRyZXNzIG9mIHRoZSBqdW1wLgorCitUaGlzIG1lYW5zIHRoYXQgd2hlbiB5b3UgcmVhY2ggdGhlIGVuZCBvZiBhIGxvb3AgYWZ0ZXIgc2luZ2xlIHN0ZXBwaW5nCit0aG91Z2ggaXQsIEBjb2Rle3VudGlsfSBtYWtlcyB5b3VyIHByb2dyYW0gY29udGludWUgZXhlY3V0aW9uIHVudGlsIGl0CitleGl0cyB0aGUgbG9vcC4gIEluIGNvbnRyYXN0LCBhIEBjb2Rle25leHR9IGNvbW1hbmQgYXQgdGhlIGVuZCBvZiBhIGxvb3AKK3NpbXBseSBzdGVwcyBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvb3AsIHdoaWNoIGZvcmNlcyB5b3UgdG8gc3RlcAordGhyb3VnaCB0aGUgbmV4dCBpdGVyYXRpb24uCisKK0Bjb2Rle3VudGlsfSBhbHdheXMgc3RvcHMgeW91ciBwcm9ncmFtIGlmIGl0IGF0dGVtcHRzIHRvIGV4aXQgdGhlIGN1cnJlbnQKK3N0YWNrIGZyYW1lLgorCitAY29kZXt1bnRpbH0gbWF5IHByb2R1Y2Ugc29tZXdoYXQgY291bnRlcmludHVpdGl2ZSByZXN1bHRzIGlmIHRoZSBvcmRlcgorb2YgbWFjaGluZSBjb2RlIGRvZXMgbm90IG1hdGNoIHRoZSBvcmRlciBvZiB0aGUgc291cmNlIGxpbmVzLiAgRm9yCitleGFtcGxlLCBpbiB0aGUgZm9sbG93aW5nIGV4Y2VycHQgZnJvbSBhIGRlYnVnZ2luZyBzZXNzaW9uLCB0aGUgQGNvZGV7Zn0KKyhAY29kZXtmcmFtZX0pIGNvbW1hbmQgc2hvd3MgdGhhdCBleGVjdXRpb24gaXMgc3RvcHBlZCBhdCBsaW5lCitAY29kZXsyMDZ9OyB5ZXQgd2hlbiB3ZSB1c2UgQGNvZGV7dW50aWx9LCB3ZSBnZXQgdG8gbGluZSBAY29kZXsxOTV9OgorCitAZXhhbXBsZQorKEB2YWx1ZXtHREJQfSkgZgorIzAgIG1haW4gKGFyZ2M9NCwgYXJndj0weGY3ZmZmYWU4KSBhdCBtNC5jOjIwNgorMjA2ICAgICAgICAgICAgICAgICBleHBhbmRfaW5wdXQoKTsKKyhAdmFsdWV7R0RCUH0pIHVudGlsCisxOTUgICAgICAgICAgICAgZm9yICggOyBhcmdjID4gMDsgTkVYVEFSRykgQHsKK0BlbmQgZXhhbXBsZQorCitUaGlzIGhhcHBlbmVkIGJlY2F1c2UsIGZvciBleGVjdXRpb24gZWZmaWNpZW5jeSwgdGhlIGNvbXBpbGVyIGhhZAorZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBsb29wIGNsb3N1cmUgdGVzdCBhdCB0aGUgZW5kLCByYXRoZXIgdGhhbiB0aGUKK3N0YXJ0LCBvZiB0aGUgbG9vcC0tLWV2ZW4gdGhvdWdoIHRoZSB0ZXN0IGluIGEgQyBAY29kZXtmb3J9LWxvb3AgaXMKK3dyaXR0ZW4gYmVmb3JlIHRoZSBib2R5IG9mIHRoZSBsb29wLiAgVGhlIEBjb2Rle3VudGlsfSBjb21tYW5kIGFwcGVhcmVkCit0byBzdGVwIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9vcCB3aGVuIGl0IGFkdmFuY2VkIHRvIHRoaXMKK2V4cHJlc3Npb247IGhvd2V2ZXIsIGl0IGhhcyBub3QgcmVhbGx5IGdvbmUgdG8gYW4gZWFybGllcgorc3RhdGVtZW50LS0tbm90IGluIHRlcm1zIG9mIHRoZSBhY3R1YWwgbWFjaGluZSBjb2RlLgorCitAY29kZXt1bnRpbH0gd2l0aCBubyBhcmd1bWVudCB3b3JrcyBieSBtZWFucyBvZiBzaW5nbGUKK2luc3RydWN0aW9uIHN0ZXBwaW5nLCBhbmQgaGVuY2UgaXMgc2xvd2VyIHRoYW4gQGNvZGV7dW50aWx9IHdpdGggYW4KK2FyZ3VtZW50LgorCitAaXRlbSB1bnRpbCBAdmFye2xvY2F0aW9ufQorQGl0ZW14IHUgQHZhcntsb2NhdGlvbn0KK0NvbnRpbnVlIHJ1bm5pbmcgeW91ciBwcm9ncmFtIHVudGlsIGVpdGhlciB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGlzCityZWFjaGVkLCBvciB0aGUgY3VycmVudCBzdGFjayBmcmFtZSByZXR1cm5zLiAgQHZhcntsb2NhdGlvbn0gaXMgYW55IG9mCit0aGUgZm9ybXMgb2YgYXJndW1lbnQgYWNjZXB0YWJsZSB0byBAY29kZXticmVha30gKEBweHJlZntTZXQgQnJlYWtzLAorLFNldHRpbmcgYnJlYWtwb2ludHN9KS4gIFRoaXMgZm9ybSBvZiB0aGUgY29tbWFuZCB1c2VzIGJyZWFrcG9pbnRzLAorYW5kIGhlbmNlIGlzIHF1aWNrZXIgdGhhbiBAY29kZXt1bnRpbH0gd2l0aG91dCBhbiBhcmd1bWVudC4KKworQGtpbmRleCBzdGVwaQorQGtpbmRleCBzaQorQGl0ZW0gc3RlcGkKK0BpdGVteCBzaQorRXhlY3V0ZSBvbmUgbWFjaGluZSBpbnN0cnVjdGlvbiwgdGhlbiBzdG9wIGFuZCByZXR1cm4gdG8gdGhlIGRlYnVnZ2VyLgorCitJdCBpcyBvZnRlbiB1c2VmdWwgdG8gZG8gQHNhbXB7ZGlzcGxheS9pICRwY30gd2hlbiBzdGVwcGluZyBieSBtYWNoaW5lCitpbnN0cnVjdGlvbnMuICBUaGlzIG1ha2VzIEB2YWx1ZXtHREJOfSBhdXRvbWF0aWNhbGx5IGRpc3BsYXkgdGhlIG5leHQKK2luc3RydWN0aW9uIHRvIGJlIGV4ZWN1dGVkLCBlYWNoIHRpbWUgeW91ciBwcm9ncmFtIHN0b3BzLiAgQHhyZWZ7QXV0bworRGlzcGxheSwsIEF1dG9tYXRpYyBkaXNwbGF5fS4KKworQW4gYXJndW1lbnQgaXMgYSByZXBlYXQgY291bnQsIGFzIGluIEBjb2Rle3N0ZXB9LgorCitAbmVlZCA3NTAKK0BraW5kZXggbmV4dGkKK0BraW5kZXggbmkKK0BpdGVtIG5leHRpCitAaXRlbXggbmkKK0V4ZWN1dGUgb25lIG1hY2hpbmUgaW5zdHJ1Y3Rpb24sIGJ1dCBpZiBpdCBpcyBhIGZ1bmN0aW9uIGNhbGwsCitwcm9jZWVkIHVudGlsIHRoZSBmdW5jdGlvbiByZXR1cm5zLgorCitBbiBhcmd1bWVudCBpcyBhIHJlcGVhdCBjb3VudCwgYXMgaW4gQGNvZGV7bmV4dH0uCitAZW5kIHRhYmxlCisKK0BpZnNldCBQT1NJWAorQG5vZGUgU2lnbmFscywgVGhyZWFkIFN0b3BzLCBDb250aW51aW5nIGFuZCBTdGVwcGluZywgU3RvcHBpbmcKK0BzZWN0aW9uIFNpZ25hbHMKK0BjaW5kZXggc2lnbmFscworCitBIHNpZ25hbCBpcyBhbiBhc3luY2hyb25vdXMgZXZlbnQgdGhhdCBjYW4gaGFwcGVuIGluIGEgcHJvZ3JhbS4gIFRoZQorb3BlcmF0aW5nIHN5c3RlbSBkZWZpbmVzIHRoZSBwb3NzaWJsZSBraW5kcyBvZiBzaWduYWxzLCBhbmQgZ2l2ZXMgZWFjaAora2luZCBhIG5hbWUgYW5kIGEgbnVtYmVyLiAgRm9yIGV4YW1wbGUsIGluIFVuaXggQGNvZGV7U0lHSU5UfSBpcyB0aGUKK3NpZ25hbCBhIHByb2dyYW0gZ2V0cyB3aGVuIHlvdSB0eXBlIGFuIGludGVycnVwdCAob2Z0ZW4gQGtiZHtDLWN9KTsKK0Bjb2Rle1NJR1NFR1Z9IGlzIHRoZSBzaWduYWwgYSBwcm9ncmFtIGdldHMgZnJvbSByZWZlcmVuY2luZyBhIHBsYWNlIGluCittZW1vcnkgZmFyIGF3YXkgZnJvbSBhbGwgdGhlIGFyZWFzIGluIHVzZTsgQGNvZGV7U0lHQUxSTX0gb2NjdXJzIHdoZW4KK3RoZSBhbGFybSBjbG9jayB0aW1lciBnb2VzIG9mZiAod2hpY2ggaGFwcGVucyBvbmx5IGlmIHlvdXIgcHJvZ3JhbSBoYXMKK3JlcXVlc3RlZCBhbiBhbGFybSkuCisKK0BjaW5kZXggZmF0YWwgc2lnbmFscworU29tZSBzaWduYWxzLCBpbmNsdWRpbmcgQGNvZGV7U0lHQUxSTX0sIGFyZSBhIG5vcm1hbCBwYXJ0IG9mIHRoZQorZnVuY3Rpb25pbmcgb2YgeW91ciBwcm9ncmFtLiAgT3RoZXJzLCBzdWNoIGFzIEBjb2Rle1NJR1NFR1Z9LCBpbmRpY2F0ZQorZXJyb3JzOyB0aGVzZSBzaWduYWxzIGFyZSBAZGZue2ZhdGFsfSAoa2lsbCB5b3VyIHByb2dyYW0gaW1tZWRpYXRlbHkpIGlmIHRoZQorcHJvZ3JhbSBoYXMgbm90IHNwZWNpZmllZCBpbiBhZHZhbmNlIHNvbWUgb3RoZXIgd2F5IHRvIGhhbmRsZSB0aGUgc2lnbmFsLgorQGNvZGV7U0lHSU5UfSBkb2VzIG5vdCBpbmRpY2F0ZSBhbiBlcnJvciBpbiB5b3VyIHByb2dyYW0sIGJ1dCBpdCBpcyBub3JtYWxseQorZmF0YWwgc28gaXQgY2FuIGNhcnJ5IG91dCB0aGUgcHVycG9zZSBvZiB0aGUgaW50ZXJydXB0OiB0byBraWxsIHRoZSBwcm9ncmFtLgorCitAdmFsdWV7R0RCTn0gaGFzIHRoZSBhYmlsaXR5IHRvIGRldGVjdCBhbnkgb2NjdXJyZW5jZSBvZiBhIHNpZ25hbCBpbiB5b3VyCitwcm9ncmFtLiAgWW91IGNhbiB0ZWxsIEB2YWx1ZXtHREJOfSBpbiBhZHZhbmNlIHdoYXQgdG8gZG8gZm9yIGVhY2gga2luZCBvZgorc2lnbmFsLgorCitAY2luZGV4IGhhbmRsaW5nIHNpZ25hbHMKK05vcm1hbGx5LCBAdmFsdWV7R0RCTn0gaXMgc2V0IHVwIHRvIGlnbm9yZSBub24tZXJyb25lb3VzIHNpZ25hbHMgbGlrZSBAY29kZXtTSUdBTFJNfQorKHNvIGFzIG5vdCB0byBpbnRlcmZlcmUgd2l0aCB0aGVpciByb2xlIGluIHRoZSBmdW5jdGlvbmluZyBvZiB5b3VyIHByb2dyYW0pCitidXQgdG8gc3RvcCB5b3VyIHByb2dyYW0gaW1tZWRpYXRlbHkgd2hlbmV2ZXIgYW4gZXJyb3Igc2lnbmFsIGhhcHBlbnMuCitZb3UgY2FuIGNoYW5nZSB0aGVzZSBzZXR0aW5ncyB3aXRoIHRoZSBAY29kZXtoYW5kbGV9IGNvbW1hbmQuCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBpbmZvIHNpZ25hbHMKK0BpdGVtIGluZm8gc2lnbmFscworUHJpbnQgYSB0YWJsZSBvZiBhbGwgdGhlIGtpbmRzIG9mIHNpZ25hbHMgYW5kIGhvdyBAdmFsdWV7R0RCTn0gaGFzIGJlZW4gdG9sZCB0bworaGFuZGxlIGVhY2ggb25lLiAgWW91IGNhbiB1c2UgdGhpcyB0byBzZWUgdGhlIHNpZ25hbCBudW1iZXJzIG9mIGFsbAordGhlIGRlZmluZWQgdHlwZXMgb2Ygc2lnbmFscy4KKworQGNvZGV7aW5mbyBoYW5kbGV9IGlzIHRoZSBuZXcgYWxpYXMgZm9yIEBjb2Rle2luZm8gc2lnbmFsc30uCisKK0BraW5kZXggaGFuZGxlCitAaXRlbSBoYW5kbGUgQHZhcntzaWduYWx9IEB2YXJ7a2V5d29yZHN9QGRvdHN7fQorQ2hhbmdlIHRoZSB3YXkgQHZhbHVle0dEQk59IGhhbmRsZXMgc2lnbmFsIEB2YXJ7c2lnbmFsfS4gIEB2YXJ7c2lnbmFsfSBjYW4gCitiZSB0aGUgbnVtYmVyIG9mIGEgc2lnbmFsIG9yIGl0cyBuYW1lICh3aXRoIG9yIHdpdGhvdXQgdGhlIEBzYW1we1NJR30gYXQgdGhlCitiZWdpbm5pbmcpLiAgVGhlIEB2YXJ7a2V5d29yZHN9IHNheSB3aGF0IGNoYW5nZSB0byBtYWtlLgorQGVuZCB0YWJsZQorCitAYyBAZ3JvdXAKK1RoZSBrZXl3b3JkcyBhbGxvd2VkIGJ5IHRoZSBAY29kZXtoYW5kbGV9IGNvbW1hbmQgY2FuIGJlIGFiYnJldmlhdGVkLgorVGhlaXIgZnVsbCBuYW1lcyBhcmU6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gbm9zdG9wCitAdmFsdWV7R0RCTn0gc2hvdWxkIG5vdCBzdG9wIHlvdXIgcHJvZ3JhbSB3aGVuIHRoaXMgc2lnbmFsIGhhcHBlbnMuICBJdCBtYXkKK3N0aWxsIHByaW50IGEgbWVzc2FnZSB0ZWxsaW5nIHlvdSB0aGF0IHRoZSBzaWduYWwgaGFzIGNvbWUgaW4uCisKK0BpdGVtIHN0b3AKK0B2YWx1ZXtHREJOfSBzaG91bGQgc3RvcCB5b3VyIHByb2dyYW0gd2hlbiB0aGlzIHNpZ25hbCBoYXBwZW5zLiAgVGhpcyBpbXBsaWVzCit0aGUgQGNvZGV7cHJpbnR9IGtleXdvcmQgYXMgd2VsbC4KKworQGl0ZW0gcHJpbnQKK0B2YWx1ZXtHREJOfSBzaG91bGQgcHJpbnQgYSBtZXNzYWdlIHdoZW4gdGhpcyBzaWduYWwgaGFwcGVucy4KKworQGl0ZW0gbm9wcmludAorQHZhbHVle0dEQk59IHNob3VsZCBub3QgbWVudGlvbiB0aGUgb2NjdXJyZW5jZSBvZiB0aGUgc2lnbmFsIGF0IGFsbC4gIFRoaXMKK2ltcGxpZXMgdGhlIEBjb2Rle25vc3RvcH0ga2V5d29yZCBhcyB3ZWxsLgorCitAaXRlbSBwYXNzCitAdmFsdWV7R0RCTn0gc2hvdWxkIGFsbG93IHlvdXIgcHJvZ3JhbSB0byBzZWUgdGhpcyBzaWduYWw7IHlvdXIgcHJvZ3JhbQorY2FuIGhhbmRsZSB0aGUgc2lnbmFsLCBvciBlbHNlIGl0IG1heSB0ZXJtaW5hdGUgaWYgdGhlIHNpZ25hbCBpcyBmYXRhbAorYW5kIG5vdCBoYW5kbGVkLgorCitAaXRlbSBub3Bhc3MKK0B2YWx1ZXtHREJOfSBzaG91bGQgbm90IGFsbG93IHlvdXIgcHJvZ3JhbSB0byBzZWUgdGhpcyBzaWduYWwuCitAZW5kIHRhYmxlCitAYyBAZW5kIGdyb3VwCisKK1doZW4gYSBzaWduYWwgc3RvcHMgeW91ciBwcm9ncmFtLCB0aGUgc2lnbmFsIGlzIG5vdCB2aXNpYmxlIHVudGlsIHlvdQorY29udGludWUuICBZb3VyIHByb2dyYW0gc2VlcyB0aGUgc2lnbmFsIHRoZW4sIGlmIEBjb2Rle3Bhc3N9IGlzIGluCitlZmZlY3QgZm9yIHRoZSBzaWduYWwgaW4gcXVlc3Rpb24gQGVtcGh7YXQgdGhhdCB0aW1lfS4gIEluIG90aGVyIHdvcmRzLAorYWZ0ZXIgQHZhbHVle0dEQk59IHJlcG9ydHMgYSBzaWduYWwsIHlvdSBjYW4gdXNlIHRoZSBAY29kZXtoYW5kbGV9Citjb21tYW5kIHdpdGggQGNvZGV7cGFzc30gb3IgQGNvZGV7bm9wYXNzfSB0byBjb250cm9sIHdoZXRoZXIgeW91cgorcHJvZ3JhbSBzZWVzIHRoYXQgc2lnbmFsIHdoZW4geW91IGNvbnRpbnVlLgorCitZb3UgY2FuIGFsc28gdXNlIHRoZSBAY29kZXtzaWduYWx9IGNvbW1hbmQgdG8gcHJldmVudCB5b3VyIHByb2dyYW0gZnJvbQorc2VlaW5nIGEgc2lnbmFsLCBvciBjYXVzZSBpdCB0byBzZWUgYSBzaWduYWwgaXQgbm9ybWFsbHkgd291bGQgbm90IHNlZSwKK29yIHRvIGdpdmUgaXQgYW55IHNpZ25hbCBhdCBhbnkgdGltZS4gIEZvciBleGFtcGxlLCBpZiB5b3VyIHByb2dyYW0gc3RvcHBlZAorZHVlIHRvIHNvbWUgc29ydCBvZiBtZW1vcnkgcmVmZXJlbmNlIGVycm9yLCB5b3UgbWlnaHQgc3RvcmUgY29ycmVjdAordmFsdWVzIGludG8gdGhlIGVycm9uZW91cyB2YXJpYWJsZXMgYW5kIGNvbnRpbnVlLCBob3BpbmcgdG8gc2VlIG1vcmUKK2V4ZWN1dGlvbjsgYnV0IHlvdXIgcHJvZ3JhbSB3b3VsZCBwcm9iYWJseSB0ZXJtaW5hdGUgaW1tZWRpYXRlbHkgYXMKK2EgcmVzdWx0IG9mIHRoZSBmYXRhbCBzaWduYWwgb25jZSBpdCBzYXcgdGhlIHNpZ25hbC4gIFRvIHByZXZlbnQgdGhpcywKK3lvdSBjYW4gY29udGludWUgd2l0aCBAc2FtcHtzaWduYWwgMH0uICBAeHJlZntTaWduYWxpbmcsICxHaXZpbmcgeW91cgorcHJvZ3JhbSBhIHNpZ25hbH0uIAorQGVuZCBpZnNldAorCitAaWZjbGVhciBCQVJFVEFSR0VUCitAbm9kZSBUaHJlYWQgU3RvcHMsICAsIFNpZ25hbHMsIFN0b3BwaW5nCitAc2VjdGlvbiBTdG9wcGluZyBhbmQgc3RhcnRpbmcgbXVsdGktdGhyZWFkIHByb2dyYW1zCisKK1doZW4geW91ciBwcm9ncmFtIGhhcyBtdWx0aXBsZSB0aHJlYWRzIChAcHhyZWZ7VGhyZWFkcywsIERlYnVnZ2luZworcHJvZ3JhbXMgd2l0aCBtdWx0aXBsZSB0aHJlYWRzfSksIHlvdSBjYW4gY2hvb3NlIHdoZXRoZXIgdG8gc2V0CiticmVha3BvaW50cyBvbiBhbGwgdGhyZWFkcywgb3Igb24gYSBwYXJ0aWN1bGFyIHRocmVhZC4KKworQHRhYmxlIEBjb2RlCitAY2luZGV4IGJyZWFrcG9pbnRzIGFuZCB0aHJlYWRzCitAY2luZGV4IHRocmVhZCBicmVha3BvaW50cworQGtpbmRleCBicmVhayBAZG90c3t9IHRocmVhZCBAdmFye3RocmVhZG5vfQorQGl0ZW0gYnJlYWsgQHZhcntsaW5lc3BlY30gdGhyZWFkIEB2YXJ7dGhyZWFkbm99CitAaXRlbXggYnJlYWsgQHZhcntsaW5lc3BlY30gdGhyZWFkIEB2YXJ7dGhyZWFkbm99IGlmIEBkb3Rze30KK0B2YXJ7bGluZXNwZWN9IHNwZWNpZmllcyBzb3VyY2UgbGluZXM7IHRoZXJlIGFyZSBzZXZlcmFsIHdheXMgb2YKK3dyaXRpbmcgdGhlbSwgYnV0IHRoZSBlZmZlY3QgaXMgYWx3YXlzIHRvIHNwZWNpZnkgc29tZSBzb3VyY2UgbGluZS4KKworVXNlIHRoZSBxdWFsaWZpZXIgQHNhbXB7dGhyZWFkIEB2YXJ7dGhyZWFkbm99fSB3aXRoIGEgYnJlYWtwb2ludCBjb21tYW5kCit0byBzcGVjaWZ5IHRoYXQgeW91IG9ubHkgd2FudCBAdmFsdWV7R0RCTn0gdG8gc3RvcCB0aGUgcHJvZ3JhbSB3aGVuIGEKK3BhcnRpY3VsYXIgdGhyZWFkIHJlYWNoZXMgdGhpcyBicmVha3BvaW50LiAgQHZhcnt0aHJlYWRub30gaXMgb25lIG9mIHRoZQorbnVtZXJpYyB0aHJlYWQgaWRlbnRpZmllcnMgYXNzaWduZWQgYnkgQHZhbHVle0dEQk59LCBzaG93biBpbiB0aGUgZmlyc3QKK2NvbHVtbiBvZiB0aGUgQHNhbXB7aW5mbyB0aHJlYWRzfSBkaXNwbGF5LgorCitJZiB5b3UgZG8gbm90IHNwZWNpZnkgQHNhbXB7dGhyZWFkIEB2YXJ7dGhyZWFkbm99fSB3aGVuIHlvdSBzZXQgYQorYnJlYWtwb2ludCwgdGhlIGJyZWFrcG9pbnQgYXBwbGllcyB0byBAZW1waHthbGx9IHRocmVhZHMgb2YgeW91cgorcHJvZ3JhbS4KKworWW91IGNhbiB1c2UgdGhlIEBjb2Rle3RocmVhZH0gcXVhbGlmaWVyIG9uIGNvbmRpdGlvbmFsIGJyZWFrcG9pbnRzIGFzCit3ZWxsOyBpbiB0aGlzIGNhc2UsIHBsYWNlIEBzYW1we3RocmVhZCBAdmFye3RocmVhZG5vfX0gYmVmb3JlIHRoZQorYnJlYWtwb2ludCBjb25kaXRpb24sIGxpa2UgdGhpczoKKworQHNtYWxsZXhhbXBsZQorKGdkYikgYnJlYWsgZnJpay5jOjEzIHRocmVhZCAyOCBpZiBiYXJ0YWIgPiBsaW0KK0BlbmQgc21hbGxleGFtcGxlCisKK0BlbmQgdGFibGUKKworQGNpbmRleCBzdG9wcGVkIHRocmVhZHMKK0BjaW5kZXggdGhyZWFkcywgc3RvcHBlZAorV2hlbmV2ZXIgeW91ciBwcm9ncmFtIHN0b3BzIHVuZGVyIEB2YWx1ZXtHREJOfSBmb3IgYW55IHJlYXNvbiwKK0BlbXBoe2FsbH0gdGhyZWFkcyBvZiBleGVjdXRpb24gc3RvcCwgbm90IGp1c3QgdGhlIGN1cnJlbnQgdGhyZWFkLiAgVGhpcworYWxsb3dzIHlvdSB0byBleGFtaW5lIHRoZSBvdmVyYWxsIHN0YXRlIG9mIHRoZSBwcm9ncmFtLCBpbmNsdWRpbmcKK3N3aXRjaGluZyBiZXR3ZWVuIHRocmVhZHMsIHdpdGhvdXQgd29ycnlpbmcgdGhhdCB0aGluZ3MgbWF5IGNoYW5nZQordW5kZXJmb290LgorCitAY2luZGV4IGNvbnRpbnVpbmcgdGhyZWFkcworQGNpbmRleCB0aHJlYWRzLCBjb250aW51aW5nCitDb252ZXJzZWx5LCB3aGVuZXZlciB5b3UgcmVzdGFydCB0aGUgcHJvZ3JhbSwgQGVtcGh7YWxsfSB0aHJlYWRzIHN0YXJ0CitleGVjdXRpbmcuICBAZW1waHtUaGlzIGlzIHRydWUgZXZlbiB3aGVuIHNpbmdsZS1zdGVwcGluZ30gd2l0aCBjb21tYW5kcworbGlrZSBAY29kZXtzdGVwfSBvciBAY29kZXtuZXh0fS4gIAorCitJbiBwYXJ0aWN1bGFyLCBAdmFsdWV7R0RCTn0gY2Fubm90IHNpbmdsZS1zdGVwIGFsbCB0aHJlYWRzIGluIGxvY2tzdGVwLgorU2luY2UgdGhyZWFkIHNjaGVkdWxpbmcgaXMgdXAgdG8geW91ciBkZWJ1Z2dpbmcgdGFyZ2V0J3Mgb3BlcmF0aW5nCitzeXN0ZW0gKG5vdCBjb250cm9sbGVkIGJ5IEB2YWx1ZXtHREJOfSksIG90aGVyIHRocmVhZHMgbWF5CitleGVjdXRlIG1vcmUgdGhhbiBvbmUgc3RhdGVtZW50IHdoaWxlIHRoZSBjdXJyZW50IHRocmVhZCBjb21wbGV0ZXMgYQorc2luZ2xlIHN0ZXAuICBNb3Jlb3ZlciwgaW4gZ2VuZXJhbCBvdGhlciB0aHJlYWRzIHN0b3AgaW4gdGhlIG1pZGRsZSBvZiBhCitzdGF0ZW1lbnQsIHJhdGhlciB0aGFuIGF0IGEgY2xlYW4gc3RhdGVtZW50IGJvdW5kYXJ5LCB3aGVuIHRoZSBwcm9ncmFtCitzdG9wcy4KKworWW91IG1pZ2h0IGV2ZW4gZmluZCB5b3VyIHByb2dyYW0gc3RvcHBlZCBpbiBhbm90aGVyIHRocmVhZCBhZnRlcgorY29udGludWluZyBvciBldmVuIHNpbmdsZS1zdGVwcGluZy4gIFRoaXMgaGFwcGVucyB3aGVuZXZlciBzb21lIG90aGVyCit0aHJlYWQgcnVucyBpbnRvIGEgYnJlYWtwb2ludCwgYSBzaWduYWwsIG9yIGFuIGV4Y2VwdGlvbiBiZWZvcmUgdGhlCitmaXJzdCB0aHJlYWQgY29tcGxldGVzIHdoYXRldmVyIHlvdSByZXF1ZXN0ZWQuCisKK09uIHNvbWUgT1NlcywgeW91IGNhbiBsb2NrIHRoZSBPUyBzY2hlZHVsZXIgYW5kIHRodXMgYWxsb3cgb25seSBhIHNpbmdsZQordGhyZWFkIHRvIHJ1bi4KKworQHRhYmxlIEBjb2RlCitAaXRlbSBzZXQgc2NoZWR1bGVyLWxvY2tpbmcgQHZhcnttb2RlfQorU2V0IHRoZSBzY2hlZHVsZXIgbG9ja2luZyBtb2RlLiAgSWYgaXQgaXMgQGNvZGV7b2ZmfSwgdGhlbiB0aGVyZSBpcyBubworbG9ja2luZyBhbmQgYW55IHRocmVhZCBtYXkgcnVuIGF0IGFueSB0aW1lLiAgSWYgQGNvZGV7b259LCB0aGVuIG9ubHkgdGhlCitjdXJyZW50IHRocmVhZCBtYXkgcnVuIHdoZW4gdGhlIGluZmVyaW9yIGlzIHJlc3VtZWQuICBUaGUgQGNvZGV7c3RlcH0KK21vZGUgb3B0aW1pemVzIGZvciBzaW5nbGUtc3RlcHBpbmcuICBJdCBzdG9wcyBvdGhlciB0aHJlYWRzIGZyb20KK2Bgc2VpemluZyB0aGUgcHJvbXB0JycgYnkgcHJlZW1wdGluZyB0aGUgY3VycmVudCB0aHJlYWQgd2hpbGUgeW91IGFyZQorc3RlcHBpbmcuICBPdGhlciB0aHJlYWRzIHdpbGwgb25seSByYXJlbHkgKG9yIG5ldmVyKSBnZXQgYSBjaGFuY2UgdG8gcnVuCit3aGVuIHlvdSBzdGVwLiAgVGhleSBhcmUgbW9yZSBsaWtlbHkgdG8gcnVuIHdoZW4geW91IGBgbmV4dCcnIG92ZXIgYQorZnVuY3Rpb24gY2FsbCwgYW5kIHRoZXkgYXJlIGNvbXBsZXRlbHkgZnJlZSB0byBydW4gd2hlbiB5b3UgdXNlIGNvbW1hbmRzCitsaWtlIGBgY29udGludWUnJywgYGB1bnRpbCcnLCBvciBgYGZpbmlzaCcnLiAgSG93ZXZlciwgdW5sZXNzIGFub3RoZXIKK3RocmVhZCBoaXRzIGEgYnJlYWtwb2ludCBkdXJpbmcgaXRzIHRpbWVzbGljZSwgdGhleSB3aWxsIG5ldmVyIHN0ZWFsIHRoZQorR0RCIHByb21wdCBhd2F5IGZyb20gdGhlIHRocmVhZCB0aGF0IHlvdSBhcmUgZGVidWdnaW5nLgorCitAaXRlbSBzaG93IHNjaGVkdWxlci1sb2NraW5nCitEaXNwbGF5IHRoZSBjdXJyZW50IHNjaGVkdWxlciBsb2NraW5nIG1vZGUuCitAZW5kIHRhYmxlCisKK0BlbmQgaWZjbGVhcgorCisKK0Bub2RlIFN0YWNrLCBTb3VyY2UsIFN0b3BwaW5nLCBUb3AKK0BjaGFwdGVyIEV4YW1pbmluZyB0aGUgU3RhY2sKKworV2hlbiB5b3VyIHByb2dyYW0gaGFzIHN0b3BwZWQsIHRoZSBmaXJzdCB0aGluZyB5b3UgbmVlZCB0byBrbm93IGlzIHdoZXJlIGl0CitzdG9wcGVkIGFuZCBob3cgaXQgZ290IHRoZXJlLgorCitAY2luZGV4IGNhbGwgc3RhY2sKK0VhY2ggdGltZSB5b3VyIHByb2dyYW0gcGVyZm9ybXMgYSBmdW5jdGlvbiBjYWxsLCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FsbCAKK2lzIGdlbmVyYXRlZC4gCitUaGF0IGluZm9ybWF0aW9uIGluY2x1ZGVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgY2FsbCBpbiB5b3VyIHByb2dyYW0sIAordGhlIGFyZ3VtZW50cyBvZiB0aGUgY2FsbCwgCithbmQgdGhlIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLgorVGhlIGluZm9ybWF0aW9uIGlzIHNhdmVkIGluIGEgYmxvY2sgb2YgZGF0YSBjYWxsZWQgYSBAZGZue3N0YWNrIGZyYW1lfS4gIAorVGhlIHN0YWNrIGZyYW1lcyBhcmUgYWxsb2NhdGVkIGluIGEgcmVnaW9uIG9mIG1lbW9yeSBjYWxsZWQgdGhlIEBkZm57Y2FsbAorc3RhY2t9LgorCitXaGVuIHlvdXIgcHJvZ3JhbSBzdG9wcywgdGhlIEB2YWx1ZXtHREJOfSBjb21tYW5kcyBmb3IgZXhhbWluaW5nIHRoZQorc3RhY2sgYWxsb3cgeW91IHRvIHNlZSBhbGwgb2YgdGhpcyBpbmZvcm1hdGlvbi4KKworQGNpbmRleCBzZWxlY3RlZCBmcmFtZQorT25lIG9mIHRoZSBzdGFjayBmcmFtZXMgaXMgQGRmbntzZWxlY3RlZH0gYnkgQHZhbHVle0dEQk59IGFuZCBtYW55CitAdmFsdWV7R0RCTn0gY29tbWFuZHMgcmVmZXIgaW1wbGljaXRseSB0byB0aGUgc2VsZWN0ZWQgZnJhbWUuICBJbgorcGFydGljdWxhciwgd2hlbmV2ZXIgeW91IGFzayBAdmFsdWV7R0RCTn0gZm9yIHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlIGluCit5b3VyIHByb2dyYW0sIHRoZSB2YWx1ZSBpcyBmb3VuZCBpbiB0aGUgc2VsZWN0ZWQgZnJhbWUuICBUaGVyZSBhcmUKK3NwZWNpYWwgQHZhbHVle0dEQk59IGNvbW1hbmRzIHRvIHNlbGVjdCB3aGljaGV2ZXIgZnJhbWUgeW91IGFyZQoraW50ZXJlc3RlZCBpbi4gQHhyZWZ7U2VsZWN0aW9uLCAsU2VsZWN0aW5nIGEgZnJhbWV9LgorCitXaGVuIHlvdXIgcHJvZ3JhbSBzdG9wcywgQHZhbHVle0dEQk59IGF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGUKK2N1cnJlbnRseSBleGVjdXRpbmcgZnJhbWUgYW5kIGRlc2NyaWJlcyBpdCBicmllZmx5LCBzaW1pbGFyIHRvIHRoZSAKK0Bjb2Rle2ZyYW1lfSBjb21tYW5kIChAcHhyZWZ7RnJhbWUgSW5mbywgLEluZm9ybWF0aW9uIGFib3V0IGEgZnJhbWV9KS4KKworQG1lbnUKKyogRnJhbWVzOjogICAgICAgICAgICAgICAgICAgICAgU3RhY2sgZnJhbWVzCisqIEJhY2t0cmFjZTo6ICAgICAgICAgICAgICAgICAgIEJhY2t0cmFjZXMKKyogU2VsZWN0aW9uOjogICAgICAgICAgICAgICAgICAgU2VsZWN0aW5nIGEgZnJhbWUKKyogRnJhbWUgSW5mbzo6ICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb24gb24gYSBmcmFtZQorKiBBbHBoYS9NSVBTIFN0YWNrOjogICAgICAgICAgICBBbHBoYSBhbmQgTUlQUyBtYWNoaW5lcyBhbmQgdGhlIGZ1bmN0aW9uIHN0YWNrCisKK0BlbmQgbWVudQorCitAbm9kZSBGcmFtZXMsIEJhY2t0cmFjZSwgU3RhY2ssIFN0YWNrCitAc2VjdGlvbiBTdGFjayBmcmFtZXMKKworQGNpbmRleCBmcmFtZQorQGNpbmRleCBzdGFjayBmcmFtZQorVGhlIGNhbGwgc3RhY2sgaXMgZGl2aWRlZCB1cCBpbnRvIGNvbnRpZ3VvdXMgcGllY2VzIGNhbGxlZCBAZGZue3N0YWNrCitmcmFtZXN9LCBvciBAZGZue2ZyYW1lc30gZm9yIHNob3J0OyBlYWNoIGZyYW1lIGlzIHRoZSBkYXRhIGFzc29jaWF0ZWQKK3dpdGggb25lIGNhbGwgdG8gb25lIGZ1bmN0aW9uLiAgVGhlIGZyYW1lIGNvbnRhaW5zIHRoZSBhcmd1bWVudHMgZ2l2ZW4KK3RvIHRoZSBmdW5jdGlvbiwgdGhlIGZ1bmN0aW9uJ3MgbG9jYWwgdmFyaWFibGVzLCBhbmQgdGhlIGFkZHJlc3MgYXQKK3doaWNoIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRpbmcuCisKK0BjaW5kZXggaW5pdGlhbCBmcmFtZQorQGNpbmRleCBvdXRlcm1vc3QgZnJhbWUKK0BjaW5kZXggaW5uZXJtb3N0IGZyYW1lCitXaGVuIHlvdXIgcHJvZ3JhbSBpcyBzdGFydGVkLCB0aGUgc3RhY2sgaGFzIG9ubHkgb25lIGZyYW1lLCB0aGF0IG9mIHRoZQorZnVuY3Rpb24gQGNvZGV7bWFpbn0uICBUaGlzIGlzIGNhbGxlZCB0aGUgQGRmbntpbml0aWFsfSBmcmFtZSBvciB0aGUKK0BkZm57b3V0ZXJtb3N0fSBmcmFtZS4gIEVhY2ggdGltZSBhIGZ1bmN0aW9uIGlzIGNhbGxlZCwgYSBuZXcgZnJhbWUgaXMKK21hZGUuICBFYWNoIHRpbWUgYSBmdW5jdGlvbiByZXR1cm5zLCB0aGUgZnJhbWUgZm9yIHRoYXQgZnVuY3Rpb24gaW52b2NhdGlvbgoraXMgZWxpbWluYXRlZC4gIElmIGEgZnVuY3Rpb24gaXMgcmVjdXJzaXZlLCB0aGVyZSBjYW4gYmUgbWFueSBmcmFtZXMgZm9yCit0aGUgc2FtZSBmdW5jdGlvbi4gIFRoZSBmcmFtZSBmb3IgdGhlIGZ1bmN0aW9uIGluIHdoaWNoIGV4ZWN1dGlvbiBpcworYWN0dWFsbHkgb2NjdXJyaW5nIGlzIGNhbGxlZCB0aGUgQGRmbntpbm5lcm1vc3R9IGZyYW1lLiAgVGhpcyBpcyB0aGUgbW9zdAorcmVjZW50bHkgY3JlYXRlZCBvZiBhbGwgdGhlIHN0YWNrIGZyYW1lcyB0aGF0IHN0aWxsIGV4aXN0LgorCitAY2luZGV4IGZyYW1lIHBvaW50ZXIKK0luc2lkZSB5b3VyIHByb2dyYW0sIHN0YWNrIGZyYW1lcyBhcmUgaWRlbnRpZmllZCBieSB0aGVpciBhZGRyZXNzZXMuICBBCitzdGFjayBmcmFtZSBjb25zaXN0cyBvZiBtYW55IGJ5dGVzLCBlYWNoIG9mIHdoaWNoIGhhcyBpdHMgb3duIGFkZHJlc3M7IGVhY2gKK2tpbmQgb2YgY29tcHV0ZXIgaGFzIGEgY29udmVudGlvbiBmb3IgY2hvb3Npbmcgb25lIGJ5dGUgd2hvc2UKK2FkZHJlc3Mgc2VydmVzIGFzIHRoZSBhZGRyZXNzIG9mIHRoZSBmcmFtZS4gIFVzdWFsbHkgdGhpcyBhZGRyZXNzIGlzIGtlcHQKK2luIGEgcmVnaXN0ZXIgY2FsbGVkIHRoZSBAZGZue2ZyYW1lIHBvaW50ZXIgcmVnaXN0ZXJ9IHdoaWxlIGV4ZWN1dGlvbiBpcworZ29pbmcgb24gaW4gdGhhdCBmcmFtZS4KKworQGNpbmRleCBmcmFtZSBudW1iZXIKK0B2YWx1ZXtHREJOfSBhc3NpZ25zIG51bWJlcnMgdG8gYWxsIGV4aXN0aW5nIHN0YWNrIGZyYW1lcywgc3RhcnRpbmcgd2l0aAoremVybyBmb3IgdGhlIGlubmVybW9zdCBmcmFtZSwgb25lIGZvciB0aGUgZnJhbWUgdGhhdCBjYWxsZWQgaXQsCithbmQgc28gb24gdXB3YXJkLiAgVGhlc2UgbnVtYmVycyBkbyBub3QgcmVhbGx5IGV4aXN0IGluIHlvdXIgcHJvZ3JhbTsKK3RoZXkgYXJlIGFzc2lnbmVkIGJ5IEB2YWx1ZXtHREJOfSB0byBnaXZlIHlvdSBhIHdheSBvZiBkZXNpZ25hdGluZyBzdGFjaworZnJhbWVzIGluIEB2YWx1ZXtHREJOfSBjb21tYW5kcy4KKworQGMgYmVsb3cgcHJvZHVjZXMgYW4gYWNjZXB0YWJsZSBvdmVyZnVsIGhib3guIC0tbWV3IDEzYXVnMTk5MworQGNpbmRleCBmcmFtZWxlc3MgZXhlY3V0aW9uCitTb21lIGNvbXBpbGVycyBwcm92aWRlIGEgd2F5IHRvIGNvbXBpbGUgZnVuY3Rpb25zIHNvIHRoYXQgdGhleSBvcGVyYXRlCit3aXRob3V0IHN0YWNrIGZyYW1lcy4gIChGb3IgZXhhbXBsZSwgdGhlIEBjb2Rle0B2YWx1ZXtHQ0N9fSBvcHRpb24KK0BzYW1wey1mb21pdC1mcmFtZS1wb2ludGVyfSBnZW5lcmF0ZXMgZnVuY3Rpb25zIHdpdGhvdXQgYSBmcmFtZS4pCitUaGlzIGlzIG9jY2FzaW9uYWxseSBkb25lIHdpdGggaGVhdmlseSB1c2VkIGxpYnJhcnkgZnVuY3Rpb25zIHRvIHNhdmUKK3RoZSBmcmFtZSBzZXR1cCB0aW1lLiAgQHZhbHVle0dEQk59IGhhcyBsaW1pdGVkIGZhY2lsaXRpZXMgZm9yIGRlYWxpbmcKK3dpdGggdGhlc2UgZnVuY3Rpb24gaW52b2NhdGlvbnMuICBJZiB0aGUgaW5uZXJtb3N0IGZ1bmN0aW9uIGludm9jYXRpb24KK2hhcyBubyBzdGFjayBmcmFtZSwgQHZhbHVle0dEQk59IG5ldmVydGhlbGVzcyByZWdhcmRzIGl0IGFzIHRob3VnaAoraXQgaGFkIGEgc2VwYXJhdGUgZnJhbWUsIHdoaWNoIGlzIG51bWJlcmVkIHplcm8gYXMgdXN1YWwsIGFsbG93aW5nCitjb3JyZWN0IHRyYWNpbmcgb2YgdGhlIGZ1bmN0aW9uIGNhbGwgY2hhaW4uICBIb3dldmVyLCBAdmFsdWV7R0RCTn0gaGFzCitubyBwcm92aXNpb24gZm9yIGZyYW1lbGVzcyBmdW5jdGlvbnMgZWxzZXdoZXJlIGluIHRoZSBzdGFjay4KKworQHRhYmxlIEBjb2RlCitAa2luZGV4IGZyYW1lCitAaXRlbSBmcmFtZSBAdmFye2FyZ3N9CitUaGUgQGNvZGV7ZnJhbWV9IGNvbW1hbmQgYWxsb3dzIHlvdSB0byBtb3ZlIGZyb20gb25lIHN0YWNrIGZyYW1lIHRvIGFub3RoZXIsIAorYW5kIHRvIHByaW50IHRoZSBzdGFjayBmcmFtZSB5b3Ugc2VsZWN0LiAgQHZhcnthcmdzfSBtYXkgYmUgZWl0aGVyIHRoZQorYWRkcmVzcyBvZiB0aGUgZnJhbWUgb3IgdGhlIHN0YWNrIGZyYW1lIG51bWJlci4gIFdpdGhvdXQgYW4gYXJndW1lbnQsIAorQGNvZGV7ZnJhbWV9IHByaW50cyB0aGUgY3VycmVudCBzdGFjayBmcmFtZS4gIAorCitAa2luZGV4IHNlbGVjdC1mcmFtZQorQGl0ZW0gc2VsZWN0LWZyYW1lCitUaGUgQGNvZGV7c2VsZWN0LWZyYW1lfSBjb21tYW5kIGFsbG93cyB5b3UgdG8gbW92ZSBmcm9tIG9uZSBzdGFjayBmcmFtZQordG8gYW5vdGhlciB3aXRob3V0IHByaW50aW5nIHRoZSBmcmFtZS4gIFRoaXMgaXMgdGhlIHNpbGVudCB2ZXJzaW9uIG9mCitAY29kZXtmcmFtZX0uCitAZW5kIHRhYmxlCisKK0Bub2RlIEJhY2t0cmFjZSwgU2VsZWN0aW9uLCBGcmFtZXMsIFN0YWNrCitAc2VjdGlvbiBCYWNrdHJhY2VzCisKK0BjaW5kZXggYmFja3RyYWNlcworQGNpbmRleCB0cmFjZWJhY2tzCitAY2luZGV4IHN0YWNrIHRyYWNlcworQSBiYWNrdHJhY2UgaXMgYSBzdW1tYXJ5IG9mIGhvdyB5b3VyIHByb2dyYW0gZ290IHdoZXJlIGl0IGlzLiAgSXQgc2hvd3Mgb25lCitsaW5lIHBlciBmcmFtZSwgZm9yIG1hbnkgZnJhbWVzLCBzdGFydGluZyB3aXRoIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nCitmcmFtZSAoZnJhbWUgemVybyksIGZvbGxvd2VkIGJ5IGl0cyBjYWxsZXIgKGZyYW1lIG9uZSksIGFuZCBvbiB1cCB0aGUKK3N0YWNrLgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggYmFja3RyYWNlCitAa2luZGV4IGJ0CitAaXRlbSBiYWNrdHJhY2UKK0BpdGVteCBidAorUHJpbnQgYSBiYWNrdHJhY2Ugb2YgdGhlIGVudGlyZSBzdGFjazogb25lIGxpbmUgcGVyIGZyYW1lIGZvciBhbGwKK2ZyYW1lcyBpbiB0aGUgc3RhY2suCisKK1lvdSBjYW4gc3RvcCB0aGUgYmFja3RyYWNlIGF0IGFueSB0aW1lIGJ5IHR5cGluZyB0aGUgc3lzdGVtIGludGVycnVwdAorY2hhcmFjdGVyLCBub3JtYWxseSBAa2Jke0MtY30uCisKK0BpdGVtIGJhY2t0cmFjZSBAdmFye259CitAaXRlbXggYnQgQHZhcntufQorU2ltaWxhciwgYnV0IHByaW50IG9ubHkgdGhlIGlubmVybW9zdCBAdmFye259IGZyYW1lcy4KKworQGl0ZW0gYmFja3RyYWNlIC1AdmFye259CitAaXRlbXggYnQgLUB2YXJ7bn0KK1NpbWlsYXIsIGJ1dCBwcmludCBvbmx5IHRoZSBvdXRlcm1vc3QgQHZhcntufSBmcmFtZXMuCitAZW5kIHRhYmxlCisKK0BraW5kZXggd2hlcmUKK0BraW5kZXggaW5mbyBzdGFjaworQGtpbmRleCBpbmZvIHMKK1RoZSBuYW1lcyBAY29kZXt3aGVyZX0gYW5kIEBjb2Rle2luZm8gc3RhY2t9IChhYmJyZXZpYXRlZCBAY29kZXtpbmZvIHN9KQorYXJlIGFkZGl0aW9uYWwgYWxpYXNlcyBmb3IgQGNvZGV7YmFja3RyYWNlfS4KKworRWFjaCBsaW5lIGluIHRoZSBiYWNrdHJhY2Ugc2hvd3MgdGhlIGZyYW1lIG51bWJlciBhbmQgdGhlIGZ1bmN0aW9uIG5hbWUuCitUaGUgcHJvZ3JhbSBjb3VudGVyIHZhbHVlIGlzIGFsc28gc2hvd24tLS11bmxlc3MgeW91IHVzZSBAY29kZXtzZXQKK3ByaW50IGFkZHJlc3Mgb2ZmfS4gIFRoZSBiYWNrdHJhY2UgYWxzbyBzaG93cyB0aGUgc291cmNlIGZpbGUgbmFtZSBhbmQKK2xpbmUgbnVtYmVyLCBhcyB3ZWxsIGFzIHRoZSBhcmd1bWVudHMgdG8gdGhlIGZ1bmN0aW9uLiAgVGhlIHByb2dyYW0KK2NvdW50ZXIgdmFsdWUgaXMgb21pdHRlZCBpZiBpdCBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb2RlIGZvciB0aGF0CitsaW5lIG51bWJlci4KKworSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgYmFja3RyYWNlLiAgSXQgd2FzIG1hZGUgd2l0aCB0aGUgY29tbWFuZAorQHNhbXB7YnQgM30sIHNvIGl0IHNob3dzIHRoZSBpbm5lcm1vc3QgdGhyZWUgZnJhbWVzLgorCitAc21hbGxleGFtcGxlCitAZ3JvdXAKKyMwICBtNF90cmFjZW9uIChvYnM9MHgyNGViMCwgYXJnYz0xLCBhcmd2PTB4MmI4YzgpIAorICAgIGF0IGJ1aWx0aW4uYzo5OTMKKyMxICAweDZlMzggaW4gZXhwYW5kX21hY3JvIChzeW09MHgyYjYwMCkgYXQgbWFjcm8uYzoyNDIKKyMyICAweDY4NDAgaW4gZXhwYW5kX3Rva2VuIChvYnM9MHgwLCB0PTE3NzY2NCwgdGQ9MHhmN2ZmZmIwOCkKKyAgICBhdCBtYWNyby5jOjcxCisoTW9yZSBzdGFjayBmcmFtZXMgZm9sbG93Li4uKQorQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vaW5kZW50CitUaGUgZGlzcGxheSBmb3IgZnJhbWUgemVybyBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgcHJvZ3JhbSBjb3VudGVyCit2YWx1ZSwgaW5kaWNhdGluZyB0aGF0IHlvdXIgcHJvZ3JhbSBoYXMgc3RvcHBlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorY29kZSBmb3IgbGluZSBAY29kZXs5OTN9IG9mIEBjb2Rle2J1aWx0aW4uY30uCisKK0Bub2RlIFNlbGVjdGlvbiwgRnJhbWUgSW5mbywgQmFja3RyYWNlLCBTdGFjaworQHNlY3Rpb24gU2VsZWN0aW5nIGEgZnJhbWUKKworTW9zdCBjb21tYW5kcyBmb3IgZXhhbWluaW5nIHRoZSBzdGFjayBhbmQgb3RoZXIgZGF0YSBpbiB5b3VyIHByb2dyYW0gd29yayBvbgord2hpY2hldmVyIHN0YWNrIGZyYW1lIGlzIHNlbGVjdGVkIGF0IHRoZSBtb21lbnQuICBIZXJlIGFyZSB0aGUgY29tbWFuZHMgZm9yCitzZWxlY3RpbmcgYSBzdGFjayBmcmFtZTsgYWxsIG9mIHRoZW0gZmluaXNoIGJ5IHByaW50aW5nIGEgYnJpZWYgZGVzY3JpcHRpb24KK29mIHRoZSBzdGFjayBmcmFtZSBqdXN0IHNlbGVjdGVkLgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggZnJhbWUKK0BraW5kZXggZgorQGl0ZW0gZnJhbWUgQHZhcntufQorQGl0ZW14IGYgQHZhcntufQorU2VsZWN0IGZyYW1lIG51bWJlciBAdmFye259LiAgUmVjYWxsIHRoYXQgZnJhbWUgemVybyBpcyB0aGUgaW5uZXJtb3N0CisoY3VycmVudGx5IGV4ZWN1dGluZykgZnJhbWUsIGZyYW1lIG9uZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxsZWQgdGhlCitpbm5lcm1vc3Qgb25lLCBhbmQgc28gb24uICBUaGUgaGlnaGVzdC1udW1iZXJlZCBmcmFtZSBpcyB0aGUgb25lIGZvcgorQGNvZGV7bWFpbn0uCisKK0BpdGVtIGZyYW1lIEB2YXJ7YWRkcn0KK0BpdGVteCBmIEB2YXJ7YWRkcn0KK1NlbGVjdCB0aGUgZnJhbWUgYXQgYWRkcmVzcyBAdmFye2FkZHJ9LiAgVGhpcyBpcyB1c2VmdWwgbWFpbmx5IGlmIHRoZQorY2hhaW5pbmcgb2Ygc3RhY2sgZnJhbWVzIGhhcyBiZWVuIGRhbWFnZWQgYnkgYSBidWcsIG1ha2luZyBpdAoraW1wb3NzaWJsZSBmb3IgQHZhbHVle0dEQk59IHRvIGFzc2lnbiBudW1iZXJzIHByb3Blcmx5IHRvIGFsbCBmcmFtZXMuICBJbgorYWRkaXRpb24sIHRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHlvdXIgcHJvZ3JhbSBoYXMgbXVsdGlwbGUgc3RhY2tzIGFuZAorc3dpdGNoZXMgYmV0d2VlbiB0aGVtLgorCitAaWZjbGVhciBIOEVYQ0xVU0lWRQorQGlmY2xlYXIgSFBQQQorT24gdGhlIFNQQVJDIGFyY2hpdGVjdHVyZSwgQGNvZGV7ZnJhbWV9IG5lZWRzIHR3byBhZGRyZXNzZXMgdG8KK3NlbGVjdCBhbiBhcmJpdHJhcnkgZnJhbWU6IGEgZnJhbWUgcG9pbnRlciBhbmQgYSBzdGFjayBwb2ludGVyLgorCitPbiB0aGUgTUlQUyBhbmQgQWxwaGEgYXJjaGl0ZWN0dXJlLCBpdCBuZWVkcyB0d28gYWRkcmVzc2VzOiBhIHN0YWNrCitwb2ludGVyIGFuZCBhIHByb2dyYW0gY291bnRlci4KKworT24gdGhlIDI5ayBhcmNoaXRlY3R1cmUsIGl0IG5lZWRzIHRocmVlIGFkZHJlc3NlczogYSByZWdpc3RlciBzdGFjaworcG9pbnRlciwgYSBwcm9ncmFtIGNvdW50ZXIsIGFuZCBhIG1lbW9yeSBzdGFjayBwb2ludGVyLgorQGMgbm90ZSB0byBmdXR1cmUgdXBkYXRlcnM6IHRoaXMgaXMgY29uZGl0aW9uZWQgb24gYSBmbGFnCitAYyBTRVRVUF9BUkJJVFJBUllfRlJBTUUgaW4gdGhlIHRtLSouaCBmaWxlcy4gIFRoZSBhYm92ZSBpcyB1cCB0byBkYXRlCitAYyBhcyBvZiAyNyBKYW4gMTk5NC4KK0BlbmQgaWZjbGVhcgorQGVuZCBpZmNsZWFyCisKK0BraW5kZXggdXAKK0BpdGVtIHVwIEB2YXJ7bn0KK01vdmUgQHZhcntufSBmcmFtZXMgdXAgdGhlIHN0YWNrLiAgRm9yIHBvc2l0aXZlIG51bWJlcnMgQHZhcntufSwgdGhpcworYWR2YW5jZXMgdG93YXJkIHRoZSBvdXRlcm1vc3QgZnJhbWUsIHRvIGhpZ2hlciBmcmFtZSBudW1iZXJzLCB0byBmcmFtZXMKK3RoYXQgaGF2ZSBleGlzdGVkIGxvbmdlci4gIEB2YXJ7bn0gZGVmYXVsdHMgdG8gb25lLgorCitAa2luZGV4IGRvd24KK0BraW5kZXggZG8KK0BpdGVtIGRvd24gQHZhcntufQorTW92ZSBAdmFye259IGZyYW1lcyBkb3duIHRoZSBzdGFjay4gIEZvciBwb3NpdGl2ZSBudW1iZXJzIEB2YXJ7bn0sIHRoaXMKK2FkdmFuY2VzIHRvd2FyZCB0aGUgaW5uZXJtb3N0IGZyYW1lLCB0byBsb3dlciBmcmFtZSBudW1iZXJzLCB0byBmcmFtZXMKK3RoYXQgd2VyZSBjcmVhdGVkIG1vcmUgcmVjZW50bHkuICBAdmFye259IGRlZmF1bHRzIHRvIG9uZS4gIFlvdSBtYXkKK2FiYnJldmlhdGUgQGNvZGV7ZG93bn0gYXMgQGNvZGV7ZG99LgorQGVuZCB0YWJsZQorCitBbGwgb2YgdGhlc2UgY29tbWFuZHMgZW5kIGJ5IHByaW50aW5nIHR3byBsaW5lcyBvZiBvdXRwdXQgZGVzY3JpYmluZyB0aGUKK2ZyYW1lLiAgVGhlIGZpcnN0IGxpbmUgc2hvd3MgdGhlIGZyYW1lIG51bWJlciwgdGhlIGZ1bmN0aW9uIG5hbWUsIHRoZQorYXJndW1lbnRzLCBhbmQgdGhlIHNvdXJjZSBmaWxlIGFuZCBsaW5lIG51bWJlciBvZiBleGVjdXRpb24gaW4gdGhhdAorZnJhbWUuICBUaGUgc2Vjb25kIGxpbmUgc2hvd3MgdGhlIHRleHQgb2YgdGhhdCBzb3VyY2UgbGluZS4gIAorCitAbmVlZCAxMDAwCitGb3IgZXhhbXBsZToKKworQHNtYWxsZXhhbXBsZQorQGdyb3VwCisoQHZhbHVle0dEQlB9KSB1cAorIzEgIDB4MjJmMCBpbiBtYWluIChhcmdjPTEsIGFyZ3Y9MHhmN2ZmZmJmNCwgZW52PTB4ZjdmZmZiZmMpCisgICAgYXQgZW52LmM6MTAKKzEwICAgICAgICAgICAgICByZWFkX2lucHV0X2ZpbGUgKGFyZ3ZbaV0pOworQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworQWZ0ZXIgc3VjaCBhIHByaW50b3V0LCB0aGUgQGNvZGV7bGlzdH0gY29tbWFuZCB3aXRoIG5vIGFyZ3VtZW50cworcHJpbnRzIHRlbiBsaW5lcyBjZW50ZXJlZCBvbiB0aGUgcG9pbnQgb2YgZXhlY3V0aW9uIGluIHRoZSBmcmFtZS4KK0B4cmVme0xpc3QsICxQcmludGluZyBzb3VyY2UgbGluZXN9LgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggZG93bi1zaWxlbnRseQorQGtpbmRleCB1cC1zaWxlbnRseQorQGl0ZW0gdXAtc2lsZW50bHkgQHZhcntufQorQGl0ZW14IGRvd24tc2lsZW50bHkgQHZhcntufQorVGhlc2UgdHdvIGNvbW1hbmRzIGFyZSB2YXJpYW50cyBvZiBAY29kZXt1cH0gYW5kIEBjb2Rle2Rvd259LAorcmVzcGVjdGl2ZWx5OyB0aGV5IGRpZmZlciBpbiB0aGF0IHRoZXkgZG8gdGhlaXIgd29yayBzaWxlbnRseSwgd2l0aG91dAorY2F1c2luZyBkaXNwbGF5IG9mIHRoZSBuZXcgZnJhbWUuICBUaGV5IGFyZSBpbnRlbmRlZCBwcmltYXJpbHkgZm9yIHVzZQoraW4gQHZhbHVle0dEQk59IGNvbW1hbmQgc2NyaXB0cywgd2hlcmUgdGhlIG91dHB1dCBtaWdodCBiZSB1bm5lY2Vzc2FyeSBhbmQKK2Rpc3RyYWN0aW5nLgorQGVuZCB0YWJsZQorCitAbm9kZSBGcmFtZSBJbmZvLCBBbHBoYS9NSVBTIFN0YWNrLCBTZWxlY3Rpb24sIFN0YWNrCitAc2VjdGlvbiBJbmZvcm1hdGlvbiBhYm91dCBhIGZyYW1lCisKK1RoZXJlIGFyZSBzZXZlcmFsIG90aGVyIGNvbW1hbmRzIHRvIHByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZWxlY3RlZAorc3RhY2sgZnJhbWUuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gZnJhbWUKK0BpdGVteCBmCitXaGVuIHVzZWQgd2l0aG91dCBhbnkgYXJndW1lbnQsIHRoaXMgY29tbWFuZCBkb2VzIG5vdCBjaGFuZ2Ugd2hpY2gKK2ZyYW1lIGlzIHNlbGVjdGVkLCBidXQgcHJpbnRzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnRseQorc2VsZWN0ZWQgc3RhY2sgZnJhbWUuICBJdCBjYW4gYmUgYWJicmV2aWF0ZWQgQGNvZGV7Zn0uICBXaXRoIGFuCithcmd1bWVudCwgdGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2VsZWN0IGEgc3RhY2sgZnJhbWUuCitAeHJlZntTZWxlY3Rpb24sICxTZWxlY3RpbmcgYSBmcmFtZX0uCisKK0BraW5kZXggaW5mbyBmcmFtZQorQGtpbmRleCBpbmZvIGYKK0BpdGVtIGluZm8gZnJhbWUKK0BpdGVteCBpbmZvIGYKK1RoaXMgY29tbWFuZCBwcmludHMgYSB2ZXJib3NlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWxlY3RlZCBzdGFjayBmcmFtZSwKK2luY2x1ZGluZzoKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0gCit0aGUgYWRkcmVzcyBvZiB0aGUgZnJhbWUgCitAaXRlbQordGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgZnJhbWUgZG93biAoY2FsbGVkIGJ5IHRoaXMgZnJhbWUpCitAaXRlbQordGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgZnJhbWUgdXAgKGNhbGxlciBvZiB0aGlzIGZyYW1lKQorQGl0ZW0KK3RoZSBsYW5ndWFnZSBpbiB3aGljaCB0aGUgc291cmNlIGNvZGUgY29ycmVzcG9uZGluZyB0byB0aGlzIGZyYW1lIGlzIHdyaXR0ZW4KK0BpdGVtCit0aGUgYWRkcmVzcyBvZiB0aGUgZnJhbWUncyBhcmd1bWVudHMKK0BpdGVtCit0aGUgcHJvZ3JhbSBjb3VudGVyIHNhdmVkIGluIGl0ICh0aGUgYWRkcmVzcyBvZiBleGVjdXRpb24gaW4gdGhlIGNhbGxlciBmcmFtZSkKK0BpdGVtCit3aGljaCByZWdpc3RlcnMgd2VyZSBzYXZlZCBpbiB0aGUgZnJhbWUKK0BlbmQgaXRlbWl6ZQorCitAbm9pbmRlbnQgVGhlIHZlcmJvc2UgZGVzY3JpcHRpb24gaXMgdXNlZnVsIHdoZW4KK3NvbWV0aGluZyBoYXMgZ29uZSB3cm9uZyB0aGF0IGhhcyBtYWRlIHRoZSBzdGFjayBmb3JtYXQgZmFpbCB0byBmaXQKK3RoZSB1c3VhbCBjb252ZW50aW9ucy4KKworQGl0ZW0gaW5mbyBmcmFtZSBAdmFye2FkZHJ9CitAaXRlbXggaW5mbyBmIEB2YXJ7YWRkcn0KK1ByaW50IGEgdmVyYm9zZSBkZXNjcmlwdGlvbiBvZiB0aGUgZnJhbWUgYXQgYWRkcmVzcyBAdmFye2FkZHJ9LCB3aXRob3V0CitzZWxlY3RpbmcgdGhhdCBmcmFtZS4gIFRoZSBzZWxlY3RlZCBmcmFtZSByZW1haW5zIHVuY2hhbmdlZCBieSB0aGlzCitjb21tYW5kLiAgVGhpcyByZXF1aXJlcyB0aGUgc2FtZSBraW5kIG9mIGFkZHJlc3MgKG1vcmUgdGhhbiBvbmUgZm9yIHNvbWUKK2FyY2hpdGVjdHVyZXMpIHRoYXQgeW91IHNwZWNpZnkgaW4gdGhlIEBjb2Rle2ZyYW1lfSBjb21tYW5kLgorQHhyZWZ7U2VsZWN0aW9uLCAsU2VsZWN0aW5nIGEgZnJhbWV9LgorCitAa2luZGV4IGluZm8gYXJncworQGl0ZW0gaW5mbyBhcmdzCitQcmludCB0aGUgYXJndW1lbnRzIG9mIHRoZSBzZWxlY3RlZCBmcmFtZSwgZWFjaCBvbiBhIHNlcGFyYXRlIGxpbmUuCisKK0BpdGVtIGluZm8gbG9jYWxzCitAa2luZGV4IGluZm8gbG9jYWxzCitQcmludCB0aGUgbG9jYWwgdmFyaWFibGVzIG9mIHRoZSBzZWxlY3RlZCBmcmFtZSwgZWFjaCBvbiBhIHNlcGFyYXRlCitsaW5lLiAgVGhlc2UgYXJlIGFsbCB2YXJpYWJsZXMgKGRlY2xhcmVkIGVpdGhlciBzdGF0aWMgb3IgYXV0b21hdGljKQorYWNjZXNzaWJsZSBhdCB0aGUgcG9pbnQgb2YgZXhlY3V0aW9uIG9mIHRoZSBzZWxlY3RlZCBmcmFtZS4KKworQGlmY2xlYXIgQ09OTFkKK0BpZmNsZWFyIEhQUEEKK0BraW5kZXggaW5mbyBjYXRjaAorQGNpbmRleCBjYXRjaCBleGNlcHRpb25zCitAY2luZGV4IGV4Y2VwdGlvbiBoYW5kbGVycworQGl0ZW0gaW5mbyBjYXRjaAorUHJpbnQgYSBsaXN0IG9mIGFsbCB0aGUgZXhjZXB0aW9uIGhhbmRsZXJzIHRoYXQgYXJlIGFjdGl2ZSBpbiB0aGUKK2N1cnJlbnQgc3RhY2sgZnJhbWUgYXQgdGhlIGN1cnJlbnQgcG9pbnQgb2YgZXhlY3V0aW9uLiAgVG8gc2VlIG90aGVyCitleGNlcHRpb24gaGFuZGxlcnMsIHZpc2l0IHRoZSBhc3NvY2lhdGVkIGZyYW1lICh1c2luZyB0aGUgQGNvZGV7dXB9LAorQGNvZGV7ZG93bn0sIG9yIEBjb2Rle2ZyYW1lfSBjb21tYW5kcyk7IHRoZW4gdHlwZSBAY29kZXtpbmZvIGNhdGNofS4KK0B4cmVme1NldCBDYXRjaHBvaW50cywgLCBTZXR0aW5nIGNhdGNocG9pbnRzfS4KK0BlbmQgaWZjbGVhcgorQGVuZCBpZmNsZWFyCitAZW5kIHRhYmxlCisKK0Bub2RlIEFscGhhL01JUFMgU3RhY2ssICAsIEZyYW1lIEluZm8sIFN0YWNrCitAc2VjdGlvbiBNSVBTL0FscGhhIG1hY2hpbmVzIGFuZCB0aGUgZnVuY3Rpb24gc3RhY2sKKworQGNpbmRleCBzdGFjayBvbiBBbHBoYQorQGNpbmRleCBzdGFjayBvbiBNSVBTCitAY2luZGV4IEFscGhhIHN0YWNrCitAY2luZGV4IE1JUFMgc3RhY2sKK0FscGhhLSBhbmQgTUlQUy1iYXNlZCBjb21wdXRlcnMgdXNlIGFuIHVudXN1YWwgc3RhY2sgZnJhbWUsIHdoaWNoCitzb21ldGltZXMgcmVxdWlyZXMgQHZhbHVle0dEQk59IHRvIHNlYXJjaCBiYWNrd2FyZCBpbiB0aGUgb2JqZWN0IGNvZGUgdG8KK2ZpbmQgdGhlIGJlZ2lubmluZyBvZiBhIGZ1bmN0aW9uLgorCitAY2luZGV4IHJlc3BvbnNlIHRpbWUsIE1JUFMgZGVidWdnaW5nCitUbyBpbXByb3ZlIHJlc3BvbnNlIHRpbWUgKGVzcGVjaWFsbHkgZm9yIGVtYmVkZGVkIGFwcGxpY2F0aW9ucywgd2hlcmUKK0B2YWx1ZXtHREJOfSBtYXkgYmUgcmVzdHJpY3RlZCB0byBhIHNsb3cgc2VyaWFsIGxpbmUgZm9yIHRoaXMgc2VhcmNoKQoreW91IG1heSB3YW50IHRvIGxpbWl0IHRoZSBzaXplIG9mIHRoaXMgc2VhcmNoLCB1c2luZyBvbmUgb2YgdGhlc2UKK2NvbW1hbmRzOgorCitAdGFibGUgQGNvZGUKK0BjaW5kZXggQGNvZGV7aGV1cmlzdGljLWZlbmNlLXBvc3R9IChBbHBoYSxNSVBTKQorQGl0ZW0gc2V0IGhldXJpc3RpYy1mZW5jZS1wb3N0IEB2YXJ7bGltaXR9CitSZXN0cmljdCBAdmFsdWV7R0RCTn0gdG8gZXhhbWluaW5nIGF0IG1vc3QgQHZhcntsaW1pdH0gYnl0ZXMgaW4gaXRzIHNlYXJjaAorZm9yIHRoZSBiZWdpbm5pbmcgb2YgYSBmdW5jdGlvbi4gIEEgdmFsdWUgb2YgQHZhcnswfSAodGhlIGRlZmF1bHQpCittZWFucyB0aGVyZSBpcyBubyBsaW1pdC4gIEhvd2V2ZXIsIGV4Y2VwdCBmb3IgQHZhcnswfSwgdGhlIGxhcmdlciB0aGUKK2xpbWl0IHRoZSBtb3JlIGJ5dGVzIEBjb2Rle2hldXJpc3RpYy1mZW5jZS1wb3N0fSBtdXN0IHNlYXJjaCBhbmQgCit0aGVyZWZvcmUgdGhlIGxvbmdlciBpdCB0YWtlcyB0byBydW4uCisKK0BpdGVtIHNob3cgaGV1cmlzdGljLWZlbmNlLXBvc3QKK0Rpc3BsYXkgdGhlIGN1cnJlbnQgbGltaXQuCitAZW5kIHRhYmxlCisKK0Bub2luZGVudAorVGhlc2UgY29tbWFuZHMgYXJlIGF2YWlsYWJsZSBAZW1waHtvbmx5fSB3aGVuIEB2YWx1ZXtHREJOfSBpcyBjb25maWd1cmVkCitmb3IgZGVidWdnaW5nIHByb2dyYW1zIG9uIEFscGhhIG9yIE1JUFMgcHJvY2Vzc29ycy4KKworCitAbm9kZSBTb3VyY2UsIERhdGEsIFN0YWNrLCBUb3AKK0BjaGFwdGVyIEV4YW1pbmluZyBTb3VyY2UgRmlsZXMKKworQHZhbHVle0dEQk59IGNhbiBwcmludCBwYXJ0cyBvZiB5b3VyIHByb2dyYW0ncyBzb3VyY2UsIHNpbmNlIHRoZSBkZWJ1Z2dpbmcKK2luZm9ybWF0aW9uIHJlY29yZGVkIGluIHRoZSBwcm9ncmFtIHRlbGxzIEB2YWx1ZXtHREJOfSB3aGF0IHNvdXJjZSBmaWxlcyB3ZXJlCit1c2VkIHRvIGJ1aWxkIGl0LiAgV2hlbiB5b3VyIHByb2dyYW0gc3RvcHMsIEB2YWx1ZXtHREJOfSBzcG9udGFuZW91c2x5IHByaW50cwordGhlIGxpbmUgd2hlcmUgaXQgc3RvcHBlZC4gIExpa2V3aXNlLCB3aGVuIHlvdSBzZWxlY3QgYSBzdGFjayBmcmFtZQorKEBweHJlZntTZWxlY3Rpb24sICxTZWxlY3RpbmcgYSBmcmFtZX0pLCBAdmFsdWV7R0RCTn0gcHJpbnRzIHRoZSBsaW5lIHdoZXJlCitleGVjdXRpb24gaW4gdGhhdCBmcmFtZSBoYXMgc3RvcHBlZC4gIFlvdSBjYW4gcHJpbnQgb3RoZXIgcG9ydGlvbnMgb2YKK3NvdXJjZSBmaWxlcyBieSBleHBsaWNpdCBjb21tYW5kLgorCitAaWZjbGVhciBET1NIT1NUCitJZiB5b3UgdXNlIEB2YWx1ZXtHREJOfSB0aHJvdWdoIGl0cyBAc2N7Z251fSBFbWFjcyBpbnRlcmZhY2UsIHlvdSBtYXkgcHJlZmVyIAordG8gdXNlCitFbWFjcyBmYWNpbGl0aWVzIHRvIHZpZXcgc291cmNlOyBAcHhyZWZ7RW1hY3MsICxVc2luZyBAdmFsdWV7R0RCTn0gdW5kZXIgQHNje2dudX0gRW1hY3N9LgorQGVuZCBpZmNsZWFyCisKK0BtZW51CisqIExpc3Q6OiAgICAgICAgICAgICAgICAgICAgICAgIFByaW50aW5nIHNvdXJjZSBsaW5lcworQGlmY2xlYXIgRE9TSE9TVAorKiBTZWFyY2g6OiAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hpbmcgc291cmNlIGZpbGVzCitAZW5kIGlmY2xlYXIKKworKiBTb3VyY2UgUGF0aDo6ICAgICAgICAgICAgICAgICBTcGVjaWZ5aW5nIHNvdXJjZSBkaXJlY3RvcmllcworKiBNYWNoaW5lIENvZGU6OiAgICAgICAgICAgICAgICBTb3VyY2UgYW5kIG1hY2hpbmUgY29kZQorQGVuZCBtZW51CisKK0Bub2RlIExpc3QsIFNlYXJjaCwgU291cmNlLCBTb3VyY2UKK0BzZWN0aW9uIFByaW50aW5nIHNvdXJjZSBsaW5lcworCitAa2luZGV4IGxpc3QKK0BraW5kZXggbAorVG8gcHJpbnQgbGluZXMgZnJvbSBhIHNvdXJjZSBmaWxlLCB1c2UgdGhlIEBjb2Rle2xpc3R9IGNvbW1hbmQKKyhhYmJyZXZpYXRlZCBAY29kZXtsfSkuICBCeSBkZWZhdWx0LCB0ZW4gbGluZXMgYXJlIHByaW50ZWQuICAKK1RoZXJlIGFyZSBzZXZlcmFsIHdheXMgdG8gc3BlY2lmeSB3aGF0IHBhcnQgb2YgdGhlIGZpbGUgeW91IHdhbnQgdG8gcHJpbnQuCisKK0hlcmUgYXJlIHRoZSBmb3JtcyBvZiB0aGUgQGNvZGV7bGlzdH0gY29tbWFuZCBtb3N0IGNvbW1vbmx5IHVzZWQ6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gbGlzdCBAdmFye2xpbmVudW19CitQcmludCBsaW5lcyBjZW50ZXJlZCBhcm91bmQgbGluZSBudW1iZXIgQHZhcntsaW5lbnVtfSBpbiB0aGUKK2N1cnJlbnQgc291cmNlIGZpbGUuCisKK0BpdGVtIGxpc3QgQHZhcntmdW5jdGlvbn0KK1ByaW50IGxpbmVzIGNlbnRlcmVkIGFyb3VuZCB0aGUgYmVnaW5uaW5nIG9mIGZ1bmN0aW9uCitAdmFye2Z1bmN0aW9ufS4KKworQGl0ZW0gbGlzdAorUHJpbnQgbW9yZSBsaW5lcy4gIElmIHRoZSBsYXN0IGxpbmVzIHByaW50ZWQgd2VyZSBwcmludGVkIHdpdGggYQorQGNvZGV7bGlzdH0gY29tbWFuZCwgdGhpcyBwcmludHMgbGluZXMgZm9sbG93aW5nIHRoZSBsYXN0IGxpbmVzCitwcmludGVkOyBob3dldmVyLCBpZiB0aGUgbGFzdCBsaW5lIHByaW50ZWQgd2FzIGEgc29saXRhcnkgbGluZSBwcmludGVkCithcyBwYXJ0IG9mIGRpc3BsYXlpbmcgYSBzdGFjayBmcmFtZSAoQHB4cmVme1N0YWNrLCAsRXhhbWluaW5nIHRoZQorU3RhY2t9KSwgdGhpcyBwcmludHMgbGluZXMgY2VudGVyZWQgYXJvdW5kIHRoYXQgbGluZS4KKworQGl0ZW0gbGlzdCAtCitQcmludCBsaW5lcyBqdXN0IGJlZm9yZSB0aGUgbGluZXMgbGFzdCBwcmludGVkLgorQGVuZCB0YWJsZQorCitCeSBkZWZhdWx0LCBAdmFsdWV7R0RCTn0gcHJpbnRzIHRlbiBzb3VyY2UgbGluZXMgd2l0aCBhbnkgb2YgdGhlc2UgZm9ybXMgb2YKK3RoZSBAY29kZXtsaXN0fSBjb21tYW5kLiAgWW91IGNhbiBjaGFuZ2UgdGhpcyB1c2luZyBAY29kZXtzZXQgbGlzdHNpemV9OgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggc2V0IGxpc3RzaXplCitAaXRlbSBzZXQgbGlzdHNpemUgQHZhcntjb3VudH0KK01ha2UgdGhlIEBjb2Rle2xpc3R9IGNvbW1hbmQgZGlzcGxheSBAdmFye2NvdW50fSBzb3VyY2UgbGluZXMgKHVubGVzcwordGhlIEBjb2Rle2xpc3R9IGFyZ3VtZW50IGV4cGxpY2l0bHkgc3BlY2lmaWVzIHNvbWUgb3RoZXIgbnVtYmVyKS4KKworQGtpbmRleCBzaG93IGxpc3RzaXplCitAaXRlbSBzaG93IGxpc3RzaXplCitEaXNwbGF5IHRoZSBudW1iZXIgb2YgbGluZXMgdGhhdCBAY29kZXtsaXN0fSBwcmludHMuCitAZW5kIHRhYmxlCisKK1JlcGVhdGluZyBhIEBjb2Rle2xpc3R9IGNvbW1hbmQgd2l0aCBAa2V5e1JFVH0gZGlzY2FyZHMgdGhlIGFyZ3VtZW50LAorc28gaXQgaXMgZXF1aXZhbGVudCB0byB0eXBpbmcganVzdCBAY29kZXtsaXN0fS4gIFRoaXMgaXMgbW9yZSB1c2VmdWwKK3RoYW4gbGlzdGluZyB0aGUgc2FtZSBsaW5lcyBhZ2Fpbi4gIEFuIGV4Y2VwdGlvbiBpcyBtYWRlIGZvciBhbgorYXJndW1lbnQgb2YgQHNhbXB7LX07IHRoYXQgYXJndW1lbnQgaXMgcHJlc2VydmVkIGluIHJlcGV0aXRpb24gc28gdGhhdAorZWFjaCByZXBldGl0aW9uIG1vdmVzIHVwIGluIHRoZSBzb3VyY2UgZmlsZS4KKworQGNpbmRleCBsaW5lc3BlYworSW4gZ2VuZXJhbCwgdGhlIEBjb2Rle2xpc3R9IGNvbW1hbmQgZXhwZWN0cyB5b3UgdG8gc3VwcGx5IHplcm8sIG9uZSBvciB0d28KK0BkZm57bGluZXNwZWNzfS4gIExpbmVzcGVjcyBzcGVjaWZ5IHNvdXJjZSBsaW5lczsgdGhlcmUgYXJlIHNldmVyYWwgd2F5cworb2Ygd3JpdGluZyB0aGVtIGJ1dCB0aGUgZWZmZWN0IGlzIGFsd2F5cyB0byBzcGVjaWZ5IHNvbWUgc291cmNlIGxpbmUuCitIZXJlIGlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIHBvc3NpYmxlIGFyZ3VtZW50cyBmb3IgQGNvZGV7bGlzdH06CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gbGlzdCBAdmFye2xpbmVzcGVjfQorUHJpbnQgbGluZXMgY2VudGVyZWQgYXJvdW5kIHRoZSBsaW5lIHNwZWNpZmllZCBieSBAdmFye2xpbmVzcGVjfS4KKworQGl0ZW0gbGlzdCBAdmFye2ZpcnN0fSxAdmFye2xhc3R9CitQcmludCBsaW5lcyBmcm9tIEB2YXJ7Zmlyc3R9IHRvIEB2YXJ7bGFzdH0uICBCb3RoIGFyZ3VtZW50cyBhcmUKK2xpbmVzcGVjcy4KKworQGl0ZW0gbGlzdCAsQHZhcntsYXN0fQorUHJpbnQgbGluZXMgZW5kaW5nIHdpdGggQHZhcntsYXN0fS4KKworQGl0ZW0gbGlzdCBAdmFye2ZpcnN0fSwKK1ByaW50IGxpbmVzIHN0YXJ0aW5nIHdpdGggQHZhcntmaXJzdH0uCisKK0BpdGVtIGxpc3QgKworUHJpbnQgbGluZXMganVzdCBhZnRlciB0aGUgbGluZXMgbGFzdCBwcmludGVkLgorCitAaXRlbSBsaXN0IC0KK1ByaW50IGxpbmVzIGp1c3QgYmVmb3JlIHRoZSBsaW5lcyBsYXN0IHByaW50ZWQuCisKK0BpdGVtIGxpc3QKK0FzIGRlc2NyaWJlZCBpbiB0aGUgcHJlY2VkaW5nIHRhYmxlLgorQGVuZCB0YWJsZQorCitIZXJlIGFyZSB0aGUgd2F5cyBvZiBzcGVjaWZ5aW5nIGEgc2luZ2xlIHNvdXJjZSBsaW5lLS0tYWxsIHRoZQora2luZHMgb2YgbGluZXNwZWMuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gQHZhcntudW1iZXJ9CitTcGVjaWZpZXMgbGluZSBAdmFye251bWJlcn0gb2YgdGhlIGN1cnJlbnQgc291cmNlIGZpbGUuCitXaGVuIGEgQGNvZGV7bGlzdH0gY29tbWFuZCBoYXMgdHdvIGxpbmVzcGVjcywgdGhpcyByZWZlcnMgdG8KK3RoZSBzYW1lIHNvdXJjZSBmaWxlIGFzIHRoZSBmaXJzdCBsaW5lc3BlYy4KKworQGl0ZW0gK0B2YXJ7b2Zmc2V0fQorU3BlY2lmaWVzIHRoZSBsaW5lIEB2YXJ7b2Zmc2V0fSBsaW5lcyBhZnRlciB0aGUgbGFzdCBsaW5lIHByaW50ZWQuCitXaGVuIHVzZWQgYXMgdGhlIHNlY29uZCBsaW5lc3BlYyBpbiBhIEBjb2Rle2xpc3R9IGNvbW1hbmQgdGhhdCBoYXMKK3R3bywgdGhpcyBzcGVjaWZpZXMgdGhlIGxpbmUgQHZhcntvZmZzZXR9IGxpbmVzIGRvd24gZnJvbSB0aGUKK2ZpcnN0IGxpbmVzcGVjLgorCitAaXRlbSAtQHZhcntvZmZzZXR9CitTcGVjaWZpZXMgdGhlIGxpbmUgQHZhcntvZmZzZXR9IGxpbmVzIGJlZm9yZSB0aGUgbGFzdCBsaW5lIHByaW50ZWQuCisKK0BpdGVtIEB2YXJ7ZmlsZW5hbWV9OkB2YXJ7bnVtYmVyfQorU3BlY2lmaWVzIGxpbmUgQHZhcntudW1iZXJ9IGluIHRoZSBzb3VyY2UgZmlsZSBAdmFye2ZpbGVuYW1lfS4KKworQGl0ZW0gQHZhcntmdW5jdGlvbn0KK1NwZWNpZmllcyB0aGUgbGluZSB0aGF0IGJlZ2lucyB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24gQHZhcntmdW5jdGlvbn0uCitGb3IgZXhhbXBsZTogaW4gQywgdGhpcyBpcyB0aGUgbGluZSB3aXRoIHRoZSBvcGVuIGJyYWNlLgorCitAaXRlbSBAdmFye2ZpbGVuYW1lfTpAdmFye2Z1bmN0aW9ufQorU3BlY2lmaWVzIHRoZSBsaW5lIG9mIHRoZSBvcGVuLWJyYWNlIHRoYXQgYmVnaW5zIHRoZSBib2R5IG9mIHRoZQorZnVuY3Rpb24gQHZhcntmdW5jdGlvbn0gaW4gdGhlIGZpbGUgQHZhcntmaWxlbmFtZX0uICBZb3Ugb25seSBuZWVkIHRoZQorZmlsZSBuYW1lIHdpdGggYSBmdW5jdGlvbiBuYW1lIHRvIGF2b2lkIGFtYmlndWl0eSB3aGVuIHRoZXJlIGFyZQoraWRlbnRpY2FsbHkgbmFtZWQgZnVuY3Rpb25zIGluIGRpZmZlcmVudCBzb3VyY2UgZmlsZXMuCisKK0BpdGVtICpAdmFye2FkZHJlc3N9CitTcGVjaWZpZXMgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgcHJvZ3JhbSBhZGRyZXNzIEB2YXJ7YWRkcmVzc30uCitAdmFye2FkZHJlc3N9IG1heSBiZSBhbnkgZXhwcmVzc2lvbi4KK0BlbmQgdGFibGUKKworQGlmY2xlYXIgRE9TSE9TVAorQG5vZGUgU2VhcmNoLCBTb3VyY2UgUGF0aCwgTGlzdCwgU291cmNlCitAc2VjdGlvbiBTZWFyY2hpbmcgc291cmNlIGZpbGVzCitAY2luZGV4IHNlYXJjaGluZworQGtpbmRleCByZXZlcnNlLXNlYXJjaAorCitUaGVyZSBhcmUgdHdvIGNvbW1hbmRzIGZvciBzZWFyY2hpbmcgdGhyb3VnaCB0aGUgY3VycmVudCBzb3VyY2UgZmlsZSBmb3IgYQorcmVndWxhciBleHByZXNzaW9uLgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggc2VhcmNoCitAa2luZGV4IGZvcndhcmQtc2VhcmNoCitAaXRlbSBmb3J3YXJkLXNlYXJjaCBAdmFye3JlZ2V4cH0KK0BpdGVteCBzZWFyY2ggQHZhcntyZWdleHB9CitUaGUgY29tbWFuZCBAc2FtcHtmb3J3YXJkLXNlYXJjaCBAdmFye3JlZ2V4cH19IGNoZWNrcyBlYWNoIGxpbmUsCitzdGFydGluZyB3aXRoIHRoZSBvbmUgZm9sbG93aW5nIHRoZSBsYXN0IGxpbmUgbGlzdGVkLCBmb3IgYSBtYXRjaCBmb3IKK0B2YXJ7cmVnZXhwfS4gIEl0IGxpc3RzIHRoZSBsaW5lIHRoYXQgaXMgZm91bmQuICBZb3UgY2FuIHVzZSB0aGUgCitzeW5vbnltIEBzYW1we3NlYXJjaCBAdmFye3JlZ2V4cH19IG9yIGFiYnJldmlhdGUgdGhlIGNvbW1hbmQgbmFtZSBhcworQGNvZGV7Zm99LgorCitAaXRlbSByZXZlcnNlLXNlYXJjaCBAdmFye3JlZ2V4cH0KK1RoZSBjb21tYW5kIEBzYW1we3JldmVyc2Utc2VhcmNoIEB2YXJ7cmVnZXhwfX0gY2hlY2tzIGVhY2ggbGluZSwgc3RhcnRpbmcKK3dpdGggdGhlIG9uZSBiZWZvcmUgdGhlIGxhc3QgbGluZSBsaXN0ZWQgYW5kIGdvaW5nIGJhY2t3YXJkLCBmb3IgYSBtYXRjaAorZm9yIEB2YXJ7cmVnZXhwfS4gIEl0IGxpc3RzIHRoZSBsaW5lIHRoYXQgaXMgZm91bmQuICBZb3UgY2FuIGFiYnJldmlhdGUKK3RoaXMgY29tbWFuZCBhcyBAY29kZXtyZXZ9LgorQGVuZCB0YWJsZQorQGVuZCBpZmNsZWFyCisKK0Bub2RlIFNvdXJjZSBQYXRoLCBNYWNoaW5lIENvZGUsIFNlYXJjaCwgU291cmNlCitAc2VjdGlvbiBTcGVjaWZ5aW5nIHNvdXJjZSBkaXJlY3RvcmllcworCitAY2luZGV4IHNvdXJjZSBwYXRoCitAY2luZGV4IGRpcmVjdG9yaWVzIGZvciBzb3VyY2UgZmlsZXMKK0V4ZWN1dGFibGUgcHJvZ3JhbXMgc29tZXRpbWVzIGRvIG5vdCByZWNvcmQgdGhlIGRpcmVjdG9yaWVzIG9mIHRoZSBzb3VyY2UKK2ZpbGVzIGZyb20gd2hpY2ggdGhleSB3ZXJlIGNvbXBpbGVkLCBqdXN0IHRoZSBuYW1lcy4gIEV2ZW4gd2hlbiB0aGV5IGRvLAordGhlIGRpcmVjdG9yaWVzIGNvdWxkIGJlIG1vdmVkIGJldHdlZW4gdGhlIGNvbXBpbGF0aW9uIGFuZCB5b3VyIGRlYnVnZ2luZworc2Vzc2lvbi4gIEB2YWx1ZXtHREJOfSBoYXMgYSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3Igc291cmNlIGZpbGVzOwordGhpcyBpcyBjYWxsZWQgdGhlIEBkZm57c291cmNlIHBhdGh9LiAgRWFjaCB0aW1lIEB2YWx1ZXtHREJOfSB3YW50cyBhIHNvdXJjZSBmaWxlLAoraXQgdHJpZXMgYWxsIHRoZSBkaXJlY3RvcmllcyBpbiB0aGUgbGlzdCwgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHByZXNlbnQKK2luIHRoZSBsaXN0LCB1bnRpbCBpdCBmaW5kcyBhIGZpbGUgd2l0aCB0aGUgZGVzaXJlZCBuYW1lLiAgTm90ZSB0aGF0Cit0aGUgZXhlY3V0YWJsZSBzZWFyY2ggcGF0aCBpcyBAZW1waHtub3R9IHVzZWQgZm9yIHRoaXMgcHVycG9zZS4gIE5laXRoZXIgaXMKK3RoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCB1bmxlc3MgaXQgaGFwcGVucyB0byBiZSBpbiB0aGUgc291cmNlCitwYXRoLgorCitJZiBAdmFsdWV7R0RCTn0gY2Fubm90IGZpbmQgYSBzb3VyY2UgZmlsZSBpbiB0aGUgc291cmNlIHBhdGgsIGFuZCB0aGUKK29iamVjdCBwcm9ncmFtIHJlY29yZHMgYSBkaXJlY3RvcnksIEB2YWx1ZXtHREJOfSB0cmllcyB0aGF0IGRpcmVjdG9yeQordG9vLiAgSWYgdGhlIHNvdXJjZSBwYXRoIGlzIGVtcHR5LCBhbmQgdGhlcmUgaXMgbm8gcmVjb3JkIG9mIHRoZQorY29tcGlsYXRpb24gZGlyZWN0b3J5LCBAdmFsdWV7R0RCTn0gbG9va3MgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFzIGEKK2xhc3QgcmVzb3J0LgorCitXaGVuZXZlciB5b3UgcmVzZXQgb3IgcmVhcnJhbmdlIHRoZSBzb3VyY2UgcGF0aCwgQHZhbHVle0dEQk59IGNsZWFycyBvdXQKK2FueSBpbmZvcm1hdGlvbiBpdCBoYXMgY2FjaGVkIGFib3V0IHdoZXJlIHNvdXJjZSBmaWxlcyBhcmUgZm91bmQgYW5kIHdoZXJlCitlYWNoIGxpbmUgaXMgaW4gdGhlIGZpbGUuCisKK0BraW5kZXggZGlyZWN0b3J5CitAa2luZGV4IGRpcgorV2hlbiB5b3Ugc3RhcnQgQHZhbHVle0dEQk59LCBpdHMgc291cmNlIHBhdGggaXMgZW1wdHkuCitUbyBhZGQgb3RoZXIgZGlyZWN0b3JpZXMsIHVzZSB0aGUgQGNvZGV7ZGlyZWN0b3J5fSBjb21tYW5kLgorCitAdGFibGUgQGNvZGUKK0BpdGVtIGRpcmVjdG9yeSBAdmFye2Rpcm5hbWV9IEBkb3Rze30KK0BpdGVtIGRpciBAdmFye2Rpcm5hbWV9IEBkb3Rze30KK0FkZCBkaXJlY3RvcnkgQHZhcntkaXJuYW1lfSB0byB0aGUgZnJvbnQgb2YgdGhlIHNvdXJjZSBwYXRoLiAgU2V2ZXJhbAorZGlyZWN0b3J5IG5hbWVzIG1heSBiZSBnaXZlbiB0byB0aGlzIGNvbW1hbmQsIHNlcGFyYXRlZCBieSBAc2FtcHs6fSBvcgord2hpdGVzcGFjZS4gIFlvdSBtYXkgc3BlY2lmeSBhIGRpcmVjdG9yeSB0aGF0IGlzIGFscmVhZHkgaW4gdGhlIHNvdXJjZQorcGF0aDsgdGhpcyBtb3ZlcyBpdCBmb3J3YXJkLCBzbyBAdmFsdWV7R0RCTn0gc2VhcmNoZXMgaXQgc29vbmVyLgorCitAa2luZGV4IGNkaXIKK0BraW5kZXggY3dkCitAa2luZGV4ICRjZGlyCitAa2luZGV4ICRjd2QKK0BjaW5kZXggY29tcGlsYXRpb24gZGlyZWN0b3J5CitAY2luZGV4IGN1cnJlbnQgZGlyZWN0b3J5CitAY2luZGV4IHdvcmtpbmcgZGlyZWN0b3J5CitAY2luZGV4IGRpcmVjdG9yeSwgY3VycmVudAorQGNpbmRleCBkaXJlY3RvcnksIGNvbXBpbGF0aW9uCitZb3UgY2FuIHVzZSB0aGUgc3RyaW5nIEBzYW1weyRjZGlyfSB0byByZWZlciB0byB0aGUgY29tcGlsYXRpb24KK2RpcmVjdG9yeSAoaWYgb25lIGlzIHJlY29yZGVkKSwgYW5kIEBzYW1weyRjd2R9IHRvIHJlZmVyIHRvIHRoZSBjdXJyZW50Cit3b3JraW5nIGRpcmVjdG9yeS4gIEBzYW1weyRjd2R9IGlzIG5vdCB0aGUgc2FtZSBhcyBAc2FtcHsufS0tLXRoZSBmb3JtZXIKK3RyYWNrcyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBhcyBpdCBjaGFuZ2VzIGR1cmluZyB5b3VyIEB2YWx1ZXtHREJOfQorc2Vzc2lvbiwgd2hpbGUgdGhlIGxhdHRlciBpcyBpbW1lZGlhdGVseSBleHBhbmRlZCB0byB0aGUgY3VycmVudAorZGlyZWN0b3J5IGF0IHRoZSB0aW1lIHlvdSBhZGQgYW4gZW50cnkgdG8gdGhlIHNvdXJjZSBwYXRoLgorCitAaXRlbSBkaXJlY3RvcnkKK1Jlc2V0IHRoZSBzb3VyY2UgcGF0aCB0byBlbXB0eSBhZ2Fpbi4gIFRoaXMgcmVxdWlyZXMgY29uZmlybWF0aW9uLgorCitAYyBSRVQtcmVwZWF0IGZvciBAY29kZXtkaXJlY3Rvcnl9IGlzIGV4cGxpY2l0bHkgZGlzYWJsZWQsIGJ1dCBzaW5jZQorQGMgcmVwZWF0aW5nIGl0IHdvdWxkIGJlIGEgbm8tb3Agd2UgZG8gbm90IHNheSB0aGF0LiAgKHRoYW5rcyB0byBSTVMpCisKK0BpdGVtIHNob3cgZGlyZWN0b3JpZXMKK0BraW5kZXggc2hvdyBkaXJlY3RvcmllcworUHJpbnQgdGhlIHNvdXJjZSBwYXRoOiBzaG93IHdoaWNoIGRpcmVjdG9yaWVzIGl0IGNvbnRhaW5zLgorQGVuZCB0YWJsZQorCitJZiB5b3VyIHNvdXJjZSBwYXRoIGlzIGNsdXR0ZXJlZCB3aXRoIGRpcmVjdG9yaWVzIHRoYXQgYXJlIG5vIGxvbmdlciBvZgoraW50ZXJlc3QsIEB2YWx1ZXtHREJOfSBtYXkgc29tZXRpbWVzIGNhdXNlIGNvbmZ1c2lvbiBieSBmaW5kaW5nIHRoZSB3cm9uZwordmVyc2lvbnMgb2Ygc291cmNlLiAgWW91IGNhbiBjb3JyZWN0IHRoZSBzaXR1YXRpb24gYXMgZm9sbG93czoKKworQGVudW1lcmF0ZQorQGl0ZW0KK1VzZSBAY29kZXtkaXJlY3Rvcnl9IHdpdGggbm8gYXJndW1lbnQgdG8gcmVzZXQgdGhlIHNvdXJjZSBwYXRoIHRvIGVtcHR5LgorCitAaXRlbQorVXNlIEBjb2Rle2RpcmVjdG9yeX0gd2l0aCBzdWl0YWJsZSBhcmd1bWVudHMgdG8gcmVpbnN0YWxsIHRoZQorZGlyZWN0b3JpZXMgeW91IHdhbnQgaW4gdGhlIHNvdXJjZSBwYXRoLiAgWW91IGNhbiBhZGQgYWxsIHRoZQorZGlyZWN0b3JpZXMgaW4gb25lIGNvbW1hbmQuCitAZW5kIGVudW1lcmF0ZQorCitAbm9kZSBNYWNoaW5lIENvZGUsICAsIFNvdXJjZSBQYXRoLCBTb3VyY2UKK0BzZWN0aW9uIFNvdXJjZSBhbmQgbWFjaGluZSBjb2RlCisKK1lvdSBjYW4gdXNlIHRoZSBjb21tYW5kIEBjb2Rle2luZm8gbGluZX0gdG8gbWFwIHNvdXJjZSBsaW5lcyB0byBwcm9ncmFtCithZGRyZXNzZXMgKGFuZCB2aWNlIHZlcnNhKSwgYW5kIHRoZSBjb21tYW5kIEBjb2Rle2Rpc2Fzc2VtYmxlfSB0byBkaXNwbGF5CithIHJhbmdlIG9mIGFkZHJlc3NlcyBhcyBtYWNoaW5lIGluc3RydWN0aW9ucy4gIFdoZW4gcnVuIHVuZGVyIEBzY3tnbnV9IEVtYWNzCittb2RlLCB0aGUgQGNvZGV7aW5mbyBsaW5lfSBjb21tYW5kIG5vdyBjYXVzZXMgdGhlIGFycm93IHRvIHBvaW50IHRvIHRoZQorbGluZSBzcGVjaWZpZWQuICBBbHNvLCBAY29kZXtpbmZvIGxpbmV9IHByaW50cyBhZGRyZXNzZXMgaW4gc3ltYm9saWMgZm9ybSBhcyAKK3dlbGwgYXMgaGV4LgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggaW5mbyBsaW5lCitAaXRlbSBpbmZvIGxpbmUgQHZhcntsaW5lc3BlY30KK1ByaW50IHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIGFkZHJlc3NlcyBvZiB0aGUgY29tcGlsZWQgY29kZSBmb3IKK3NvdXJjZSBsaW5lIEB2YXJ7bGluZXNwZWN9LiAgWW91IGNhbiBzcGVjaWZ5IHNvdXJjZSBsaW5lcyBpbiBhbnkgb2YKK3RoZSB3YXlzIHVuZGVyc3Rvb2QgYnkgdGhlIEBjb2Rle2xpc3R9IGNvbW1hbmQgKEBweHJlZntMaXN0LCAsUHJpbnRpbmcKK3NvdXJjZSBsaW5lc30pLgorQGVuZCB0YWJsZQorCitGb3IgZXhhbXBsZSwgd2UgY2FuIHVzZSBAY29kZXtpbmZvIGxpbmV9IHRvIGRpc2NvdmVyIHRoZSBsb2NhdGlvbiBvZgordGhlIG9iamVjdCBjb2RlIGZvciB0aGUgZmlyc3QgbGluZSBvZiBmdW5jdGlvbgorQGNvZGV7bTRfY2hhbmdlcXVvdGV9OgorCitAc21hbGxleGFtcGxlCisoQHZhbHVle0dEQlB9KSBpbmZvIGxpbmUgbTRfY2hhbmdlY29tCitMaW5lIDg5NSBvZiAiYnVpbHRpbi5jIiBzdGFydHMgYXQgcGMgMHg2MzRjIGFuZCBlbmRzIGF0IDB4NjM1MC4KK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2luZGVudAorV2UgY2FuIGFsc28gaW5xdWlyZSAodXNpbmcgQGNvZGV7KkB2YXJ7YWRkcn19IGFzIHRoZSBmb3JtIGZvcgorQHZhcntsaW5lc3BlY30pIHdoYXQgc291cmNlIGxpbmUgY292ZXJzIGEgcGFydGljdWxhciBhZGRyZXNzOgorQHNtYWxsZXhhbXBsZQorKEB2YWx1ZXtHREJQfSkgaW5mbyBsaW5lICoweDYzZmYKK0xpbmUgOTI2IG9mICJidWlsdGluLmMiIHN0YXJ0cyBhdCBwYyAweDYzZTQgYW5kIGVuZHMgYXQgMHg2NDA0LgorQGVuZCBzbWFsbGV4YW1wbGUKKworQGNpbmRleCBAY29kZXskX30gYW5kIEBjb2Rle2luZm8gbGluZX0KK0FmdGVyIEBjb2Rle2luZm8gbGluZX0sIHRoZSBkZWZhdWx0IGFkZHJlc3MgZm9yIHRoZSBAY29kZXt4fSBjb21tYW5kCitpcyBjaGFuZ2VkIHRvIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBsaW5lLCBzbyB0aGF0IEBzYW1we3gvaX0gaXMKK3N1ZmZpY2llbnQgdG8gYmVnaW4gZXhhbWluaW5nIHRoZSBtYWNoaW5lIGNvZGUgKEBweHJlZntNZW1vcnksCissRXhhbWluaW5nIG1lbW9yeX0pLiAgQWxzbywgdGhpcyBhZGRyZXNzIGlzIHNhdmVkIGFzIHRoZSB2YWx1ZSBvZiB0aGUKK2NvbnZlbmllbmNlIHZhcmlhYmxlIEBjb2RleyRffSAoQHB4cmVme0NvbnZlbmllbmNlIFZhcnMsICxDb252ZW5pZW5jZQordmFyaWFibGVzfSkuCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBkaXNhc3NlbWJsZQorQGNpbmRleCBhc3NlbWJseSBpbnN0cnVjdGlvbnMKK0BjaW5kZXggaW5zdHJ1Y3Rpb25zLCBhc3NlbWJseQorQGNpbmRleCBtYWNoaW5lIGluc3RydWN0aW9ucworQGNpbmRleCBsaXN0aW5nIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zCitAaXRlbSBkaXNhc3NlbWJsZQorVGhpcyBzcGVjaWFsaXplZCBjb21tYW5kIGR1bXBzIGEgcmFuZ2Ugb2YgbWVtb3J5IGFzIG1hY2hpbmUKK2luc3RydWN0aW9ucy4gIFRoZSBkZWZhdWx0IG1lbW9yeSByYW5nZSBpcyB0aGUgZnVuY3Rpb24gc3Vycm91bmRpbmcgdGhlCitwcm9ncmFtIGNvdW50ZXIgb2YgdGhlIHNlbGVjdGVkIGZyYW1lLiAgQSBzaW5nbGUgYXJndW1lbnQgdG8gdGhpcworY29tbWFuZCBpcyBhIHByb2dyYW0gY291bnRlciB2YWx1ZTsgQHZhbHVle0dEQk59IGR1bXBzIHRoZSBmdW5jdGlvbgorc3Vycm91bmRpbmcgdGhpcyB2YWx1ZS4gIFR3byBhcmd1bWVudHMgc3BlY2lmeSBhIHJhbmdlIG9mIGFkZHJlc3NlcworKGZpcnN0IGluY2x1c2l2ZSwgc2Vjb25kIGV4Y2x1c2l2ZSkgdG8gZHVtcC4KK0BlbmQgdGFibGUKKworQGlmY2xlYXIgSDhFWENMVVNJVkUKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB0aGUgZGlzYXNzZW1ibHkgb2YgYSByYW5nZSBvZiBhZGRyZXNzZXMgb2YKK0hQIFBBLVJJU0MgMi4wIGNvZGU6CisKK0BzbWFsbGV4YW1wbGUKKyhAdmFsdWV7R0RCUH0pIGRpc2FzIDB4MzJjNCAweDMyZTQKK0R1bXAgb2YgYXNzZW1ibGVyIGNvZGUgZnJvbSAweDMyYzQgdG8gMHgzMmU0OgorMHgzMmM0IDxtYWluKzIwND46ICAgICAgYWRkaWwgMCxkcAorMHgzMmM4IDxtYWluKzIwOD46ICAgICAgbGR3IDB4MjJjKHNyMCxyMSkscjI2CisweDMyY2MgPG1haW4rMjEyPjogICAgICBsZGlsIDB4MzAwMCxyMzEKKzB4MzJkMCA8bWFpbisyMTY+OiAgICAgIGJsZSAweDNmOChzcjQscjMxKQorMHgzMmQ0IDxtYWluKzIyMD46ICAgICAgbGRvIDAocjMxKSxycAorMHgzMmQ4IDxtYWluKzIyND46ICAgICAgYWRkaWwgLTB4ODAwLGRwCisweDMyZGMgPG1haW4rMjI4PjogICAgICBsZG8gMHg1ODgocjEpLHIyNgorMHgzMmUwIDxtYWluKzIzMj46ICAgICAgbGRpbCAweDMwMDAscjMxCitFbmQgb2YgYXNzZW1ibGVyIGR1bXAuCitAZW5kIHNtYWxsZXhhbXBsZQorQGVuZCBpZmNsZWFyCisKK0BpZnNldCBIOEVYQ0xVU0lWRQorRm9yIGV4YW1wbGUsIGhlcmUgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGZvciB0aGUKK2Rpc2Fzc2VtYmx5IG9mIGEgZnVuY3Rpb24gQGNvZGV7ZmFjdH06CisKKworQHNtYWxsZXhhbXBsZQorKEB2YWx1ZXtHREJQfSkgZGlzYXMgZmFjdAorRHVtcCBvZiBhc3NlbWJsZXIgY29kZSBmb3IgZnVuY3Rpb24gZmFjdDoKK3RvIDB4ODA4YzoKKzB4ODAyYyA8ZmFjdD46IDZkIGYyCQltb3YudyByMixAQC1yNworMHg4MDJlIDxmYWN0KzI+OiAgNmQgZjMJCW1vdi53IHIzLEBALXI3CisweDgwMzAgPGZhY3QrND46ICA2ZCBmNgkJbW92LncgcjYsQEAtcjcKKzB4ODAzMiA8ZmFjdCs2PjogIDBkIDc2CQltb3YudyByNyxyNgorMHg4MDM0IDxmYWN0Kzg+OiAgNmYgNzAgMDAgMDgJbW92LncgQEAoMHg4LHI3KSxyMAorMHg4MDM4IDxmYWN0KzEyPiAgMTkgMTEJCXN1Yi53CXIxLHIxCisgLgorIC4KKyAuIAorQGVuZCBzbWFsbGV4YW1wbGUKK0BlbmQgaWZzZXQKKworU29tZSBhcmNoaXRlY3R1cmVzIGhhdmUgbW9yZSB0aGFuIG9uZSBjb21tb25seS11c2VkIHNldCBvZiBpbnN0cnVjdGlvbgorbW5lbW9uaWNzIG9yIG90aGVyIHN5bnRheC4KKworQHRhYmxlIEBjb2RlCitAa2luZGV4IHNldCBhc3NlbWJseS1sYW5ndWFnZQorQGNpbmRleCBhc3NlbWJseSBpbnN0cnVjdGlvbnMKK0BjaW5kZXggaW5zdHJ1Y3Rpb25zLCBhc3NlbWJseQorQGNpbmRleCBtYWNoaW5lIGluc3RydWN0aW9ucworQGNpbmRleCBsaXN0aW5nIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zCitAaXRlbSBzZXQgYXNzZW1ibHktbGFuZ3VhZ2UgQHZhcntpbnN0cnVjdGlvbi1zZXR9CitTZWxlY3QgdGhlIGluc3RydWN0aW9uIHNldCB0byB1c2Ugd2hlbiBkaXNhc3NlbWJsaW5nIHRoZQorcHJvZ3JhbSB2aWEgdGhlIEBjb2Rle2Rpc2Fzc2VtYmxlfSBvciBAY29kZXt4L2l9IGNvbW1hbmRzLgorCitDdXJyZW50bHkgdGhpcyBjb21tYW5kIGlzIG9ubHkgZGVmaW5lZCBmb3IgdGhlIEludGVsIHg4NiBmYW1pbHkuICBZb3UKK2NhbiBzZXQgQHZhcntpbnN0cnVjdGlvbi1zZXR9IHRvIGVpdGhlciBAY29kZXtpMzg2fSBvciBAY29kZXtpODA4Nn0uCitUaGUgZGVmYXVsdCBpcyBAY29kZXtpMzg2fS4KK0BlbmQgdGFibGUKKworCitAbm9kZSBEYXRhLCBMYW5ndWFnZXMsIFNvdXJjZSwgVG9wCitAY2hhcHRlciBFeGFtaW5pbmcgRGF0YQorCitAY2luZGV4IHByaW50aW5nIGRhdGEKK0BjaW5kZXggZXhhbWluaW5nIGRhdGEKK0BraW5kZXggcHJpbnQKK0BraW5kZXggaW5zcGVjdAorQGMgImluc3BlY3QiIGlzIG5vdCBxdWl0ZSBhIHN5bm9ueW0gaWYgeW91IGFyZSB1c2luZyBFcG9jaCwgd2hpY2ggd2UgZG8gbm90CitAYyBkb2N1bWVudCBiZWNhdXNlIGl0IGlzIG5vbnN0YW5kYXJkLi4uICBVbmRlciBFcG9jaCBpdCBkaXNwbGF5cyBpbiBhCitAYyBkaWZmZXJlbnQgd2luZG93IG9yIHNvbWV0aGluZyBsaWtlIHRoYXQuCitUaGUgdXN1YWwgd2F5IHRvIGV4YW1pbmUgZGF0YSBpbiB5b3VyIHByb2dyYW0gaXMgd2l0aCB0aGUgQGNvZGV7cHJpbnR9Citjb21tYW5kIChhYmJyZXZpYXRlZCBAY29kZXtwfSksIG9yIGl0cyBzeW5vbnltIEBjb2Rle2luc3BlY3R9LiAgCitAaWZjbGVhciBDT05MWQorSXQgZXZhbHVhdGVzIGFuZCBwcmludHMgdGhlIHZhbHVlIG9mIGFuIGV4cHJlc3Npb24gb2YgdGhlIGxhbmd1YWdlIHlvdXIKK3Byb2dyYW0gaXMgd3JpdHRlbiBpbiAoQHB4cmVme0xhbmd1YWdlcywgLFVzaW5nIEB2YWx1ZXtHREJOfSB3aXRoIERpZmZlcmVudAorTGFuZ3VhZ2VzfSkuCitAZW5kIGlmY2xlYXIKKworQHRhYmxlIEBjb2RlCitAaXRlbSBwcmludCBAdmFye2V4cH0KK0BpdGVteCBwcmludCAvQHZhcntmfSBAdmFye2V4cH0KK0B2YXJ7ZXhwfSBpcyBhbiBleHByZXNzaW9uIChpbiB0aGUgc291cmNlIGxhbmd1YWdlKS4gIEJ5IGRlZmF1bHQgdGhlCit2YWx1ZSBvZiBAdmFye2V4cH0gaXMgcHJpbnRlZCBpbiBhIGZvcm1hdCBhcHByb3ByaWF0ZSB0byBpdHMgZGF0YSB0eXBlOworeW91IGNhbiBjaG9vc2UgYSBkaWZmZXJlbnQgZm9ybWF0IGJ5IHNwZWNpZnlpbmcgQHNhbXB7L0B2YXJ7Zn19LCB3aGVyZQorQHZhcntmfSBpcyBhIGxldHRlciBzcGVjaWZ5aW5nIHRoZSBmb3JtYXQ7IEBweHJlZntPdXRwdXQgRm9ybWF0cywsT3V0cHV0Citmb3JtYXRzfS4KKworQGl0ZW0gcHJpbnQKK0BpdGVteCBwcmludCAvQHZhcntmfQorSWYgeW91IG9taXQgQHZhcntleHB9LCBAdmFsdWV7R0RCTn0gZGlzcGxheXMgdGhlIGxhc3QgdmFsdWUgYWdhaW4gKGZyb20gdGhlCitAZGZue3ZhbHVlIGhpc3Rvcnl9OyBAcHhyZWZ7VmFsdWUgSGlzdG9yeSwgLFZhbHVlIGhpc3Rvcnl9KS4gIFRoaXMgYWxsb3dzIHlvdSB0bworY29udmVuaWVudGx5IGluc3BlY3QgdGhlIHNhbWUgdmFsdWUgaW4gYW4gYWx0ZXJuYXRpdmUgZm9ybWF0LgorQGVuZCB0YWJsZQorCitBIG1vcmUgbG93LWxldmVsIHdheSBvZiBleGFtaW5pbmcgZGF0YSBpcyB3aXRoIHRoZSBAY29kZXt4fSBjb21tYW5kLgorSXQgZXhhbWluZXMgZGF0YSBpbiBtZW1vcnkgYXQgYSBzcGVjaWZpZWQgYWRkcmVzcyBhbmQgcHJpbnRzIGl0IGluIGEKK3NwZWNpZmllZCBmb3JtYXQuICBAeHJlZntNZW1vcnksICxFeGFtaW5pbmcgbWVtb3J5fS4KKworSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIGluZm9ybWF0aW9uIGFib3V0IHR5cGVzLCBvciBhYm91dCBob3cgdGhlIGZpZWxkcworb2YgYSBzdHJ1Y3QKK0BpZmNsZWFyIENPTkxZCitvciBjbGFzcworQGVuZCBpZmNsZWFyCithcmUgZGVjbGFyZWQsIHVzZSB0aGUgQGNvZGV7cHR5cGUgQHZhcntleHB9fQorY29tbWFuZCByYXRoZXIgdGhhbiBAY29kZXtwcmludH0uIEB4cmVme1N5bWJvbHMsICxFeGFtaW5pbmcgdGhlIFN5bWJvbCBUYWJsZX0uCisKK0BtZW51CisqIEV4cHJlc3Npb25zOjogICAgICAgICAgICAgICAgIEV4cHJlc3Npb25zCisqIFZhcmlhYmxlczo6ICAgICAgICAgICAgICAgICAgIFByb2dyYW0gdmFyaWFibGVzCisqIEFycmF5czo6ICAgICAgICAgICAgICAgICAgICAgIEFydGlmaWNpYWwgYXJyYXlzCisqIE91dHB1dCBGb3JtYXRzOjogICAgICAgICAgICAgIE91dHB1dCBmb3JtYXRzCisqIE1lbW9yeTo6ICAgICAgICAgICAgICAgICAgICAgIEV4YW1pbmluZyBtZW1vcnkKKyogQXV0byBEaXNwbGF5OjogICAgICAgICAgICAgICAgQXV0b21hdGljIGRpc3BsYXkKKyogUHJpbnQgU2V0dGluZ3M6OiAgICAgICAgICAgICAgUHJpbnQgc2V0dGluZ3MKKyogVmFsdWUgSGlzdG9yeTo6ICAgICAgICAgICAgICAgVmFsdWUgaGlzdG9yeQorKiBDb252ZW5pZW5jZSBWYXJzOjogICAgICAgICAgICBDb252ZW5pZW5jZSB2YXJpYWJsZXMKKyogUmVnaXN0ZXJzOjogICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJzCitAaWZjbGVhciBIQVZFLUZMT0FUCisqIEZsb2F0aW5nIFBvaW50IEhhcmR3YXJlOjogICAgIEZsb2F0aW5nIHBvaW50IGhhcmR3YXJlCitAZW5kIGlmY2xlYXIKKworQGVuZCBtZW51CisKK0Bub2RlIEV4cHJlc3Npb25zLCBWYXJpYWJsZXMsIERhdGEsIERhdGEKK0BzZWN0aW9uIEV4cHJlc3Npb25zCisKK0BjaW5kZXggZXhwcmVzc2lvbnMKK0Bjb2Rle3ByaW50fSBhbmQgbWFueSBvdGhlciBAdmFsdWV7R0RCTn0gY29tbWFuZHMgYWNjZXB0IGFuIGV4cHJlc3Npb24gYW5kCitjb21wdXRlIGl0cyB2YWx1ZS4gIEFueSBraW5kIG9mIGNvbnN0YW50LCB2YXJpYWJsZSBvciBvcGVyYXRvciBkZWZpbmVkCitieSB0aGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgeW91IGFyZSB1c2luZyBpcyB2YWxpZCBpbiBhbiBleHByZXNzaW9uIGluCitAdmFsdWV7R0RCTn0uICBUaGlzIGluY2x1ZGVzIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zLCBmdW5jdGlvbiBjYWxscywgY2FzdHMKK2FuZCBzdHJpbmcgY29uc3RhbnRzLiAgSXQgdW5mb3J0dW5hdGVseSBkb2VzIG5vdCBpbmNsdWRlIHN5bWJvbHMgZGVmaW5lZAorYnkgcHJlcHJvY2Vzc29yIEBjb2RleyNkZWZpbmV9IGNvbW1hbmRzLgorCitAdmFsdWV7R0RCTn0gbm93IHN1cHBvcnRzIGFycmF5IGNvbnN0YW50cyBpbiBleHByZXNzaW9ucyBpbnB1dCBieQordGhlIHVzZXIuICBUaGUgc3ludGF4IGlzIEB2YXJ7QHtlbGVtZW50LCBlbGVtZW50QGRvdHN7fUB9fS4gIEZvciBleGFtcGxlLAoreW91IGNhbiBub3cgdXNlIHRoZSBjb21tYW5kIEBjb2Rle3ByaW50IEB7MSwgMiwgM0B9fSB0byBidWlsZCB1cCBhbiBhcnJheSBpbiAKK21lbW9yeSB0aGF0IGlzIG1hbGxvYydkIGluIHRoZSB0YXJnZXQgcHJvZ3JhbS4KKworQGlmY2xlYXIgQ09OTFkKK0JlY2F1c2UgQyBpcyBzbyB3aWRlc3ByZWFkLCBtb3N0IG9mIHRoZSBleHByZXNzaW9ucyBzaG93biBpbiBleGFtcGxlcyBpbgordGhpcyBtYW51YWwgYXJlIGluIEMuICBAeHJlZntMYW5ndWFnZXMsICwgVXNpbmcgQHZhbHVle0dEQk59IHdpdGggRGlmZmVyZW50CitMYW5ndWFnZXN9LCBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSBleHByZXNzaW9ucyBpbiBvdGhlcgorbGFuZ3VhZ2VzLgorCitJbiB0aGlzIHNlY3Rpb24sIHdlIGRpc2N1c3Mgb3BlcmF0b3JzIHRoYXQgeW91IGNhbiB1c2UgaW4gQHZhbHVle0dEQk59CitleHByZXNzaW9ucyByZWdhcmRsZXNzIG9mIHlvdXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCisKK0Nhc3RzIGFyZSBzdXBwb3J0ZWQgaW4gYWxsIGxhbmd1YWdlcywgbm90IGp1c3QgaW4gQywgYmVjYXVzZSBpdCBpcyBzbwordXNlZnVsIHRvIGNhc3QgYSBudW1iZXIgaW50byBhIHBvaW50ZXIgaW4gb3JkZXIgdG8gZXhhbWluZSBhIHN0cnVjdHVyZQorYXQgdGhhdCBhZGRyZXNzIGluIG1lbW9yeS4KK0BjIEZJWE1FOiBjYXN0cyBzdXBwb3J0ZWQtLS1Nb2QyIHRydWU/CitAZW5kIGlmY2xlYXIKKworQHZhbHVle0dEQk59IHN1cHBvcnRzIHRoZXNlIG9wZXJhdG9ycywgaW4gYWRkaXRpb24gdG8gdGhvc2UgY29tbW9uCit0byBwcm9ncmFtbWluZyBsYW5ndWFnZXM6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gQEAKK0BzYW1we0BAfSBpcyBhIGJpbmFyeSBvcGVyYXRvciBmb3IgdHJlYXRpbmcgcGFydHMgb2YgbWVtb3J5IGFzIGFycmF5cy4KK0B4cmVme0FycmF5cywgLEFydGlmaWNpYWwgYXJyYXlzfSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0BpdGVtIDo6CitAc2FtcHs6On0gYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEgdmFyaWFibGUgaW4gdGVybXMgb2YgdGhlIGZpbGUgb3IKK2Z1bmN0aW9uIHdoZXJlIGl0IGlzIGRlZmluZWQuICBAeHJlZntWYXJpYWJsZXMsICxQcm9ncmFtIHZhcmlhYmxlc30uCisKK0BjaW5kZXggQHtAdmFye3R5cGV9QH0KK0BjaW5kZXggdHlwZSBjYXN0aW5nIG1lbW9yeQorQGNpbmRleCBtZW1vcnksIHZpZXdpbmcgYXMgdHlwZWQgb2JqZWN0CitAY2luZGV4IGNhc3RzLCB0byB2aWV3IG1lbW9yeQorQGl0ZW0gQHtAdmFye3R5cGV9QH0gQHZhcnthZGRyfQorUmVmZXJzIHRvIGFuIG9iamVjdCBvZiB0eXBlIEB2YXJ7dHlwZX0gc3RvcmVkIGF0IGFkZHJlc3MgQHZhcnthZGRyfSBpbgorbWVtb3J5LiAgQHZhcnthZGRyfSBtYXkgYmUgYW55IGV4cHJlc3Npb24gd2hvc2UgdmFsdWUgaXMgYW4gaW50ZWdlciBvcgorcG9pbnRlciAoYnV0IHBhcmVudGhlc2VzIGFyZSByZXF1aXJlZCBhcm91bmQgYmluYXJ5IG9wZXJhdG9ycywganVzdCBhcyBpbgorYSBjYXN0KS4gIFRoaXMgY29uc3RydWN0IGlzIGFsbG93ZWQgcmVnYXJkbGVzcyBvZiB3aGF0IGtpbmQgb2YgZGF0YSBpcworbm9ybWFsbHkgc3VwcG9zZWQgdG8gcmVzaWRlIGF0IEB2YXJ7YWRkcn0uCitAZW5kIHRhYmxlCisKK0Bub2RlIFZhcmlhYmxlcywgQXJyYXlzLCBFeHByZXNzaW9ucywgRGF0YQorQHNlY3Rpb24gUHJvZ3JhbSB2YXJpYWJsZXMKKworVGhlIG1vc3QgY29tbW9uIGtpbmQgb2YgZXhwcmVzc2lvbiB0byB1c2UgaXMgdGhlIG5hbWUgb2YgYSB2YXJpYWJsZQoraW4geW91ciBwcm9ncmFtLgorCitWYXJpYWJsZXMgaW4gZXhwcmVzc2lvbnMgYXJlIHVuZGVyc3Rvb2QgaW4gdGhlIHNlbGVjdGVkIHN0YWNrIGZyYW1lCisoQHB4cmVme1NlbGVjdGlvbiwgLFNlbGVjdGluZyBhIGZyYW1lfSk7IHRoZXkgbXVzdCBiZSBlaXRoZXI6CisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitnbG9iYWwgKG9yIGZpbGUtc3RhdGljKQorQGVuZCBpdGVtaXplCisKK0Bub2luZGVudCBvciAKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK3Zpc2libGUgYWNjb3JkaW5nIHRvIHRoZSBzY29wZSBydWxlcyBvZiB0aGUKK3Byb2dyYW1taW5nIGxhbmd1YWdlIGZyb20gdGhlIHBvaW50IG9mIGV4ZWN1dGlvbiBpbiB0aGF0IGZyYW1lCitAZW5kIGl0ZW1pemUgIAorCitAbm9pbmRlbnQgVGhpcyBtZWFucyB0aGF0IGluIHRoZSBmdW5jdGlvbgorCitAZXhhbXBsZQorZm9vIChhKQorICAgICBpbnQgYTsKK0B7CisgIGJhciAoYSk7CisgIEB7CisgICAgaW50IGIgPSB0ZXN0ICgpOworICAgIGJhciAoYik7CisgIEB9CitAfQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAoreW91IGNhbiBleGFtaW5lIGFuZCB1c2UgdGhlIHZhcmlhYmxlIEBjb2Rle2F9IHdoZW5ldmVyIHlvdXIgcHJvZ3JhbSBpcworZXhlY3V0aW5nIHdpdGhpbiB0aGUgZnVuY3Rpb24gQGNvZGV7Zm9vfSwgYnV0IHlvdSBjYW4gb25seSB1c2Ugb3IKK2V4YW1pbmUgdGhlIHZhcmlhYmxlIEBjb2Rle2J9IHdoaWxlIHlvdXIgcHJvZ3JhbSBpcyBleGVjdXRpbmcgaW5zaWRlCit0aGUgYmxvY2sgd2hlcmUgQGNvZGV7Yn0gaXMgZGVjbGFyZWQuCisKK0BjaW5kZXggdmFyaWFibGUgbmFtZSBjb25mbGljdAorVGhlcmUgaXMgYW4gZXhjZXB0aW9uOiB5b3UgY2FuIHJlZmVyIHRvIGEgdmFyaWFibGUgb3IgZnVuY3Rpb24gd2hvc2UKK3Njb3BlIGlzIGEgc2luZ2xlIHNvdXJjZSBmaWxlIGV2ZW4gaWYgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIHBvaW50IGlzIG5vdAoraW4gdGhpcyBmaWxlLiAgQnV0IGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBzdWNoIHZhcmlhYmxlIG9yCitmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgKGluIGRpZmZlcmVudCBzb3VyY2UgZmlsZXMpLiAgSWYgdGhhdAoraGFwcGVucywgcmVmZXJyaW5nIHRvIHRoYXQgbmFtZSBoYXMgdW5wcmVkaWN0YWJsZSBlZmZlY3RzLiAgSWYgeW91IHdpc2gsCit5b3UgY2FuIHNwZWNpZnkgYSBzdGF0aWMgdmFyaWFibGUgaW4gYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIG9yIGZpbGUsCit1c2luZyB0aGUgY29sb24tY29sb24gbm90YXRpb246CisKK0BjaW5kZXggY29sb24tY29sb24KK0BpZnRleAorQGMgaW5mbyBjYW5ub3QgY29wZSB3aXRoIGEgOjogaW5kZXggZW50cnksIGJ1dCB3aHkgZGVwcml2ZSBoYXJkIGNvcHkgcmVhZGVycz8KK0BraW5kZXggOjoKK0BlbmQgaWZ0ZXgKK0BleGFtcGxlCitAdmFye2ZpbGV9OjpAdmFye3ZhcmlhYmxlfQorQHZhcntmdW5jdGlvbn06OkB2YXJ7dmFyaWFibGV9CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitIZXJlIEB2YXJ7ZmlsZX0gb3IgQHZhcntmdW5jdGlvbn0gaXMgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgZm9yIHRoZQorc3RhdGljIEB2YXJ7dmFyaWFibGV9LiAgSW4gdGhlIGNhc2Ugb2YgZmlsZSBuYW1lcywgeW91IGNhbiB1c2UgcXVvdGVzIHRvCittYWtlIHN1cmUgQHZhbHVle0dEQk59IHBhcnNlcyB0aGUgZmlsZSBuYW1lIGFzIGEgc2luZ2xlIHdvcmQtLS1mb3IgZXhhbXBsZSwKK3RvIHByaW50IGEgZ2xvYmFsIHZhbHVlIG9mIEBjb2Rle3h9IGRlZmluZWQgaW4gQGZpbGV7ZjIuY306CisKK0BleGFtcGxlCisoQHZhbHVle0dEQlB9KSBwICdmMi5jJzo6eAorQGVuZCBleGFtcGxlCisKK0BpZmNsZWFyIENPTkxZCitAY2luZGV4IEMrKyBzY29wZSByZXNvbHV0aW9uCitUaGlzIHVzZSBvZiBAc2FtcHs6On0gaXMgdmVyeSByYXJlbHkgaW4gY29uZmxpY3Qgd2l0aCB0aGUgdmVyeSBzaW1pbGFyCit1c2Ugb2YgdGhlIHNhbWUgbm90YXRpb24gaW4gQysrLiAgQHZhbHVle0dEQk59IGFsc28gc3VwcG9ydHMgdXNlIG9mIHRoZSBDKysKK3Njb3BlIHJlc29sdXRpb24gb3BlcmF0b3IgaW4gQHZhbHVle0dEQk59IGV4cHJlc3Npb25zLgorQGMgRklYTUU6IFVtLCBzbyB3aGF0IGhhcHBlbnMgaW4gb25lIG9mIHRob3NlIHJhcmUgY2FzZXMgd2hlcmUgaXQncyBpbgorQGMgY29uZmxpY3Q/PyAgLS1tZXcKK0BlbmQgaWZjbGVhcgorCitAY2luZGV4IHdyb25nIHZhbHVlcworQGNpbmRleCB2YXJpYWJsZSB2YWx1ZXMsIHdyb25nCitAcXVvdGF0aW9uCitAZW1waHtXYXJuaW5nOn0gT2NjYXNpb25hbGx5LCBhIGxvY2FsIHZhcmlhYmxlIG1heSBhcHBlYXIgdG8gaGF2ZSB0aGUKK3dyb25nIHZhbHVlIGF0IGNlcnRhaW4gcG9pbnRzIGluIGEgZnVuY3Rpb24tLS1qdXN0IGFmdGVyIGVudHJ5IHRvIGEgbmV3CitzY29wZSwgYW5kIGp1c3QgYmVmb3JlIGV4aXQuCitAZW5kIHF1b3RhdGlvbgorWW91IG1heSBzZWUgdGhpcyBwcm9ibGVtIHdoZW4geW91IGFyZSBzdGVwcGluZyBieSBtYWNoaW5lIGluc3RydWN0aW9ucy4KK1RoaXMgaXMgYmVjYXVzZSwgb24gbW9zdCBtYWNoaW5lcywgaXQgdGFrZXMgbW9yZSB0aGFuIG9uZSBpbnN0cnVjdGlvbiB0bworc2V0IHVwIGEgc3RhY2sgZnJhbWUgKGluY2x1ZGluZyBsb2NhbCB2YXJpYWJsZSBkZWZpbml0aW9ucyk7IGlmIHlvdSBhcmUKK3N0ZXBwaW5nIGJ5IG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLCB2YXJpYWJsZXMgbWF5IGFwcGVhciB0byBoYXZlIHRoZSB3cm9uZwordmFsdWVzIHVudGlsIHRoZSBzdGFjayBmcmFtZSBpcyBjb21wbGV0ZWx5IGJ1aWx0LiAgT24gZXhpdCwgaXQgdXN1YWxseQorYWxzbyB0YWtlcyBtb3JlIHRoYW4gb25lIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gdG8gZGVzdHJveSBhIHN0YWNrIGZyYW1lOworYWZ0ZXIgeW91IGJlZ2luIHN0ZXBwaW5nIHRocm91Z2ggdGhhdCBncm91cCBvZiBpbnN0cnVjdGlvbnMsIGxvY2FsCit2YXJpYWJsZSBkZWZpbml0aW9ucyBtYXkgYmUgZ29uZS4KKworVGhpcyBtYXkgYWxzbyBoYXBwZW4gd2hlbiB0aGUgY29tcGlsZXIgZG9lcyBzaWduaWZpY2FudCBvcHRpbWl6YXRpb25zLgorVG8gYmUgc3VyZSBvZiBhbHdheXMgc2VlaW5nIGFjY3VyYXRlIHZhbHVlcywgdHVybiBvZmYgYWxsIG9wdGltaXphdGlvbgord2hlbiBjb21waWxpbmcuCisKK0Bub2RlIEFycmF5cywgT3V0cHV0IEZvcm1hdHMsIFZhcmlhYmxlcywgRGF0YQorQHNlY3Rpb24gQXJ0aWZpY2lhbCBhcnJheXMKKworQGNpbmRleCBhcnRpZmljaWFsIGFycmF5CitAa2luZGV4IEBACitJdCBpcyBvZnRlbiB1c2VmdWwgdG8gcHJpbnQgb3V0IHNldmVyYWwgc3VjY2Vzc2l2ZSBvYmplY3RzIG9mIHRoZQorc2FtZSB0eXBlIGluIG1lbW9yeTsgYSBzZWN0aW9uIG9mIGFuIGFycmF5LCBvciBhbiBhcnJheSBvZgorZHluYW1pY2FsbHkgZGV0ZXJtaW5lZCBzaXplIGZvciB3aGljaCBvbmx5IGEgcG9pbnRlciBleGlzdHMgaW4gdGhlCitwcm9ncmFtLgorCitZb3UgY2FuIGRvIHRoaXMgYnkgcmVmZXJyaW5nIHRvIGEgY29udGlndW91cyBzcGFuIG9mIG1lbW9yeSBhcyBhbgorQGRmbnthcnRpZmljaWFsIGFycmF5fSwgdXNpbmcgdGhlIGJpbmFyeSBvcGVyYXRvciBAc2FtcHtAQH0uICBUaGUgbGVmdAorb3BlcmFuZCBvZiBAc2FtcHtAQH0gc2hvdWxkIGJlIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBkZXNpcmVkIGFycmF5CithbmQgYmUgYW4gaW5kaXZpZHVhbCBvYmplY3QuICBUaGUgcmlnaHQgb3BlcmFuZCBzaG91bGQgYmUgdGhlIGRlc2lyZWQgbGVuZ3RoCitvZiB0aGUgYXJyYXkuICBUaGUgcmVzdWx0IGlzIGFuIGFycmF5IHZhbHVlIHdob3NlIGVsZW1lbnRzIGFyZSBhbGwgb2YKK3RoZSB0eXBlIG9mIHRoZSBsZWZ0IGFyZ3VtZW50LiAgVGhlIGZpcnN0IGVsZW1lbnQgaXMgYWN0dWFsbHkgdGhlIGxlZnQKK2FyZ3VtZW50OyB0aGUgc2Vjb25kIGVsZW1lbnQgY29tZXMgZnJvbSBieXRlcyBvZiBtZW1vcnkgaW1tZWRpYXRlbHkKK2ZvbGxvd2luZyB0aG9zZSB0aGF0IGhvbGQgdGhlIGZpcnN0IGVsZW1lbnQsIGFuZCBzbyBvbi4gIEhlcmUgaXMgYW4KK2V4YW1wbGUuICBJZiBhIHByb2dyYW0gc2F5cworCitAZXhhbXBsZQoraW50ICphcnJheSA9IChpbnQgKikgbWFsbG9jIChsZW4gKiBzaXplb2YgKGludCkpOworQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAoreW91IGNhbiBwcmludCB0aGUgY29udGVudHMgb2YgQGNvZGV7YXJyYXl9IHdpdGgKKworQGV4YW1wbGUKK3AgKmFycmF5QEBsZW4KK0BlbmQgZXhhbXBsZQorCitUaGUgbGVmdCBvcGVyYW5kIG9mIEBzYW1we0BAfSBtdXN0IHJlc2lkZSBpbiBtZW1vcnkuICBBcnJheSB2YWx1ZXMgbWFkZQord2l0aCBAc2FtcHtAQH0gaW4gdGhpcyB3YXkgYmVoYXZlIGp1c3QgbGlrZSBvdGhlciBhcnJheXMgaW4gdGVybXMgb2YKK3N1YnNjcmlwdGluZywgYW5kIGFyZSBjb2VyY2VkIHRvIHBvaW50ZXJzIHdoZW4gdXNlZCBpbiBleHByZXNzaW9ucy4KK0FydGlmaWNpYWwgYXJyYXlzIG1vc3Qgb2Z0ZW4gYXBwZWFyIGluIGV4cHJlc3Npb25zIHZpYSB0aGUgdmFsdWUgaGlzdG9yeQorKEBweHJlZntWYWx1ZSBIaXN0b3J5LCAsVmFsdWUgaGlzdG9yeX0pLCBhZnRlciBwcmludGluZyBvbmUgb3V0LgorCitBbm90aGVyIHdheSB0byBjcmVhdGUgYW4gYXJ0aWZpY2lhbCBhcnJheSBpcyB0byB1c2UgYSBjYXN0LgorVGhpcyByZS1pbnRlcnByZXRzIGEgdmFsdWUgYXMgaWYgaXQgd2VyZSBhbiBhcnJheS4KK1RoZSB2YWx1ZSBuZWVkIG5vdCBiZSBpbiBtZW1vcnk6CitAZXhhbXBsZQorKEB2YWx1ZXtHREJQfSkgcC94IChzaG9ydFsyXSkweDEyMzQ1Njc4CiskMSA9IEB7MHgxMjM0LCAweDU2NzhAfQorQGVuZCBleGFtcGxlCisKK0FzIGEgY29udmVuaWVuY2UsIGlmIHlvdSBsZWF2ZSB0aGUgYXJyYXkgbGVuZ3RoIG91dCAoYXMgaW4KK0BzYW1weyhAdmFye3R5cGV9KVtdKUB2YXJ7dmFsdWV9fSkgZ2RiIGNhbGN1bGF0ZXMgdGhlIHNpemUgdG8gZmlsbAordGhlIHZhbHVlIChhcyBAc2FtcHtzaXplb2YoQHZhcnt2YWx1ZX0pL3NpemVvZihAdmFye3R5cGV9KX06CitAZXhhbXBsZQorKEB2YWx1ZXtHREJQfSkgcC94IChzaG9ydFtdKTB4MTIzNDU2NzgKKyQyID0gQHsweDEyMzQsIDB4NTY3OEB9CitAZW5kIGV4YW1wbGUKKworU29tZXRpbWVzIHRoZSBhcnRpZmljaWFsIGFycmF5IG1lY2hhbmlzbSBpcyBub3QgcXVpdGUgZW5vdWdoOyBpbgorbW9kZXJhdGVseSBjb21wbGV4IGRhdGEgc3RydWN0dXJlcywgdGhlIGVsZW1lbnRzIG9mIGludGVyZXN0IG1heSBub3QKK2FjdHVhbGx5IGJlIGFkamFjZW50LS0tZm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgdmFsdWVzCitvZiBwb2ludGVycyBpbiBhbiBhcnJheS4gIE9uZSB1c2VmdWwgd29yay1hcm91bmQgaW4gdGhpcyBzaXR1YXRpb24gaXMKK3RvIHVzZSBhIGNvbnZlbmllbmNlIHZhcmlhYmxlIChAcHhyZWZ7Q29udmVuaWVuY2UgVmFycywgLENvbnZlbmllbmNlCit2YXJpYWJsZXN9KSBhcyBhIGNvdW50ZXIgaW4gYW4gZXhwcmVzc2lvbiB0aGF0IHByaW50cyB0aGUgZmlyc3QKK2ludGVyZXN0aW5nIHZhbHVlLCBhbmQgdGhlbiByZXBlYXQgdGhhdCBleHByZXNzaW9uIHZpYSBAa2V5e1JFVH0uICBGb3IKK2luc3RhbmNlLCBzdXBwb3NlIHlvdSBoYXZlIGFuIGFycmF5IEBjb2Rle2R0YWJ9IG9mIHBvaW50ZXJzIHRvCitzdHJ1Y3R1cmVzLCBhbmQgeW91IGFyZSBpbnRlcmVzdGVkIGluIHRoZSB2YWx1ZXMgb2YgYSBmaWVsZCBAY29kZXtmdn0KK2luIGVhY2ggc3RydWN0dXJlLiAgSGVyZSBpcyBhbiBleGFtcGxlIG9mIHdoYXQgeW91IG1pZ2h0IHR5cGU6CisKK0BleGFtcGxlCitzZXQgJGkgPSAwCitwIGR0YWJbJGkrK10tPmZ2CitAa2V5e1JFVH0KK0BrZXl7UkVUfQorQGRvdHN7fQorQGVuZCBleGFtcGxlCisKK0Bub2RlIE91dHB1dCBGb3JtYXRzLCBNZW1vcnksIEFycmF5cywgRGF0YQorQHNlY3Rpb24gT3V0cHV0IGZvcm1hdHMKKworQGNpbmRleCBmb3JtYXR0ZWQgb3V0cHV0CitAY2luZGV4IG91dHB1dCBmb3JtYXRzCitCeSBkZWZhdWx0LCBAdmFsdWV7R0RCTn0gcHJpbnRzIGEgdmFsdWUgYWNjb3JkaW5nIHRvIGl0cyBkYXRhIHR5cGUuICBTb21ldGltZXMKK3RoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQuICBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHdhbnQgdG8gcHJpbnQgYSBudW1iZXIKK2luIGhleCwgb3IgYSBwb2ludGVyIGluIGRlY2ltYWwuICBPciB5b3UgbWlnaHQgd2FudCB0byB2aWV3IGRhdGEgaW4gbWVtb3J5CithdCBhIGNlcnRhaW4gYWRkcmVzcyBhcyBhIGNoYXJhY3RlciBzdHJpbmcgb3IgYXMgYW4gaW5zdHJ1Y3Rpb24uICBUbyBkbwordGhlc2UgdGhpbmdzLCBzcGVjaWZ5IGFuIEBkZm57b3V0cHV0IGZvcm1hdH0gd2hlbiB5b3UgcHJpbnQgYSB2YWx1ZS4KKworVGhlIHNpbXBsZXN0IHVzZSBvZiBvdXRwdXQgZm9ybWF0cyBpcyB0byBzYXkgaG93IHRvIHByaW50IGEgdmFsdWUKK2FscmVhZHkgY29tcHV0ZWQuICBUaGlzIGlzIGRvbmUgYnkgc3RhcnRpbmcgdGhlIGFyZ3VtZW50cyBvZiB0aGUKK0Bjb2Rle3ByaW50fSBjb21tYW5kIHdpdGggYSBzbGFzaCBhbmQgYSBmb3JtYXQgbGV0dGVyLiAgVGhlIGZvcm1hdAorbGV0dGVycyBzdXBwb3J0ZWQgYXJlOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIHgKK1JlZ2FyZCB0aGUgYml0cyBvZiB0aGUgdmFsdWUgYXMgYW4gaW50ZWdlciwgYW5kIHByaW50IHRoZSBpbnRlZ2VyIGluCitoZXhhZGVjaW1hbC4KKworQGl0ZW0gZAorUHJpbnQgYXMgaW50ZWdlciBpbiBzaWduZWQgZGVjaW1hbC4KKworQGl0ZW0gdQorUHJpbnQgYXMgaW50ZWdlciBpbiB1bnNpZ25lZCBkZWNpbWFsLgorCitAaXRlbSBvCitQcmludCBhcyBpbnRlZ2VyIGluIG9jdGFsLgorCitAaXRlbSB0CitQcmludCBhcyBpbnRlZ2VyIGluIGJpbmFyeS4gIFRoZSBsZXR0ZXIgQHNhbXB7dH0gc3RhbmRzIGZvciBgYHR3bycnLgorQGZvb3Rub3Rle0BzYW1we2J9IGNhbm5vdCBiZSB1c2VkIGJlY2F1c2UgdGhlc2UgZm9ybWF0IGxldHRlcnMgYXJlIGFsc28KK3VzZWQgd2l0aCB0aGUgQGNvZGV7eH0gY29tbWFuZCwgd2hlcmUgQHNhbXB7Yn0gc3RhbmRzIGZvciBgYGJ5dGUnJzsKK0BweHJlZntNZW1vcnksLEV4YW1pbmluZyBtZW1vcnl9Ln0KKworQGl0ZW0gYQorQGNpbmRleCB1bmtub3duIGFkZHJlc3MsIGxvY2F0aW5nCitQcmludCBhcyBhbiBhZGRyZXNzLCBib3RoIGFic29sdXRlIGluIGhleGFkZWNpbWFsIGFuZCBhcyBhbiBvZmZzZXQgZnJvbQordGhlIG5lYXJlc3QgcHJlY2VkaW5nIHN5bWJvbC4gIFlvdSBjYW4gdXNlIHRoaXMgZm9ybWF0IHVzZWQgdG8gZGlzY292ZXIKK3doZXJlIChpbiB3aGF0IGZ1bmN0aW9uKSBhbiB1bmtub3duIGFkZHJlc3MgaXMgbG9jYXRlZDoKKworQGV4YW1wbGUKKyhAdmFsdWV7R0RCUH0pIHAvYSAweDU0MzIwCiskMyA9IDB4NTQzMjAgPF9pbml0aWFsaXplX3Z4KzM5Nj4KK0BlbmQgZXhhbXBsZQorCitAaXRlbSBjCitSZWdhcmQgYXMgYW4gaW50ZWdlciBhbmQgcHJpbnQgaXQgYXMgYSBjaGFyYWN0ZXIgY29uc3RhbnQuCisKK0BpdGVtIGYKK1JlZ2FyZCB0aGUgYml0cyBvZiB0aGUgdmFsdWUgYXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgYW5kIHByaW50Cit1c2luZyB0eXBpY2FsIGZsb2F0aW5nIHBvaW50IHN5bnRheC4KK0BlbmQgdGFibGUKKworRm9yIGV4YW1wbGUsIHRvIHByaW50IHRoZSBwcm9ncmFtIGNvdW50ZXIgaW4gaGV4IChAcHhyZWZ7UmVnaXN0ZXJzfSksIHR5cGUKKworQGV4YW1wbGUKK3AveCAkcGMKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK05vdGUgdGhhdCBubyBzcGFjZSBpcyByZXF1aXJlZCBiZWZvcmUgdGhlIHNsYXNoOyB0aGlzIGlzIGJlY2F1c2UgY29tbWFuZAorbmFtZXMgaW4gQHZhbHVle0dEQk59IGNhbm5vdCBjb250YWluIGEgc2xhc2guCisKK1RvIHJlcHJpbnQgdGhlIGxhc3QgdmFsdWUgaW4gdGhlIHZhbHVlIGhpc3Rvcnkgd2l0aCBhIGRpZmZlcmVudCBmb3JtYXQsCit5b3UgY2FuIHVzZSB0aGUgQGNvZGV7cHJpbnR9IGNvbW1hbmQgd2l0aCBqdXN0IGEgZm9ybWF0IGFuZCBubworZXhwcmVzc2lvbi4gIEZvciBleGFtcGxlLCBAc2FtcHtwL3h9IHJlcHJpbnRzIHRoZSBsYXN0IHZhbHVlIGluIGhleC4KKworQG5vZGUgTWVtb3J5LCBBdXRvIERpc3BsYXksIE91dHB1dCBGb3JtYXRzLCBEYXRhCitAc2VjdGlvbiBFeGFtaW5pbmcgbWVtb3J5CisKK1lvdSBjYW4gdXNlIHRoZSBjb21tYW5kIEBjb2Rle3h9IChmb3IgYGBleGFtaW5lJycpIHRvIGV4YW1pbmUgbWVtb3J5IGluCithbnkgb2Ygc2V2ZXJhbCBmb3JtYXRzLCBpbmRlcGVuZGVudGx5IG9mIHlvdXIgcHJvZ3JhbSdzIGRhdGEgdHlwZXMuCisKK0BjaW5kZXggZXhhbWluaW5nIG1lbW9yeQorQHRhYmxlIEBjb2RlCitAa2luZGV4IHgKK0BpdGVtIHgvQHZhcntuZnV9IEB2YXJ7YWRkcn0KK0BpdGVteCB4IEB2YXJ7YWRkcn0KK0BpdGVteCB4CitVc2UgdGhlIEBjb2Rle3h9IGNvbW1hbmQgdG8gZXhhbWluZSBtZW1vcnkuCitAZW5kIHRhYmxlCisKK0B2YXJ7bn0sIEB2YXJ7Zn0sIGFuZCBAdmFye3V9IGFyZSBhbGwgb3B0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHNwZWNpZnkgaG93CittdWNoIG1lbW9yeSB0byBkaXNwbGF5IGFuZCBob3cgdG8gZm9ybWF0IGl0OyBAdmFye2FkZHJ9IGlzIGFuCitleHByZXNzaW9uIGdpdmluZyB0aGUgYWRkcmVzcyB3aGVyZSB5b3Ugd2FudCB0byBzdGFydCBkaXNwbGF5aW5nIG1lbW9yeS4KK0lmIHlvdSB1c2UgZGVmYXVsdHMgZm9yIEB2YXJ7bmZ1fSwgeW91IG5lZWQgbm90IHR5cGUgdGhlIHNsYXNoIEBzYW1wey99LgorU2V2ZXJhbCBjb21tYW5kcyBzZXQgY29udmVuaWVudCBkZWZhdWx0cyBmb3IgQHZhcnthZGRyfS4KKworQHRhYmxlIEByCitAaXRlbSBAdmFye259LCB0aGUgcmVwZWF0IGNvdW50CitUaGUgcmVwZWF0IGNvdW50IGlzIGEgZGVjaW1hbCBpbnRlZ2VyOyB0aGUgZGVmYXVsdCBpcyAxLiAgSXQgc3BlY2lmaWVzCitob3cgbXVjaCBtZW1vcnkgKGNvdW50aW5nIGJ5IHVuaXRzIEB2YXJ7dX0pIHRvIGRpc3BsYXkuCitAYyBUaGlzIHJlYWxseSBpcyAqKmRlY2ltYWwqKjsgdW5hZmZlY3RlZCBieSAnc2V0IHJhZGl4JyBhcyBvZiBHREIKK0BjIDQuMS4yLgorCitAaXRlbSBAdmFye2Z9LCB0aGUgZGlzcGxheSBmb3JtYXQKK1RoZSBkaXNwbGF5IGZvcm1hdCBpcyBvbmUgb2YgdGhlIGZvcm1hdHMgdXNlZCBieSBAY29kZXtwcmludH0sCitAc2FtcHtzfSAobnVsbC10ZXJtaW5hdGVkIHN0cmluZyksIG9yIEBzYW1we2l9IChtYWNoaW5lIGluc3RydWN0aW9uKS4KK1RoZSBkZWZhdWx0IGlzIEBzYW1we3h9IChoZXhhZGVjaW1hbCkgaW5pdGlhbGx5LgorVGhlIGRlZmF1bHQgY2hhbmdlcyBlYWNoIHRpbWUgeW91IHVzZSBlaXRoZXIgQGNvZGV7eH0gb3IgQGNvZGV7cHJpbnR9LgorCitAaXRlbSBAdmFye3V9LCB0aGUgdW5pdCBzaXplCitUaGUgdW5pdCBzaXplIGlzIGFueSBvZgorCitAdGFibGUgQGNvZGUKK0BpdGVtIGIKK0J5dGVzLgorQGl0ZW0gaAorSGFsZndvcmRzICh0d28gYnl0ZXMpLgorQGl0ZW0gdworV29yZHMgKGZvdXIgYnl0ZXMpLiAgVGhpcyBpcyB0aGUgaW5pdGlhbCBkZWZhdWx0LgorQGl0ZW0gZworR2lhbnQgd29yZHMgKGVpZ2h0IGJ5dGVzKS4KK0BlbmQgdGFibGUKKworRWFjaCB0aW1lIHlvdSBzcGVjaWZ5IGEgdW5pdCBzaXplIHdpdGggQGNvZGV7eH0sIHRoYXQgc2l6ZSBiZWNvbWVzIHRoZQorZGVmYXVsdCB1bml0IHRoZSBuZXh0IHRpbWUgeW91IHVzZSBAY29kZXt4fS4gIChGb3IgdGhlIEBzYW1we3N9IGFuZAorQHNhbXB7aX0gZm9ybWF0cywgdGhlIHVuaXQgc2l6ZSBpcyBpZ25vcmVkIGFuZCBpcyBub3JtYWxseSBub3Qgd3JpdHRlbi4pCisKK0BpdGVtIEB2YXJ7YWRkcn0sIHN0YXJ0aW5nIGRpc3BsYXkgYWRkcmVzcworQHZhcnthZGRyfSBpcyB0aGUgYWRkcmVzcyB3aGVyZSB5b3Ugd2FudCBAdmFsdWV7R0RCTn0gdG8gYmVnaW4gZGlzcGxheWluZworbWVtb3J5LiAgVGhlIGV4cHJlc3Npb24gbmVlZCBub3QgaGF2ZSBhIHBvaW50ZXIgdmFsdWUgKHRob3VnaCBpdCBtYXkpOworaXQgaXMgYWx3YXlzIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgYWRkcmVzcyBvZiBhIGJ5dGUgb2YgbWVtb3J5LgorQHhyZWZ7RXhwcmVzc2lvbnMsICxFeHByZXNzaW9uc30sIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGV4cHJlc3Npb25zLiAgVGhlIGRlZmF1bHQgZm9yCitAdmFye2FkZHJ9IGlzIHVzdWFsbHkganVzdCBhZnRlciB0aGUgbGFzdCBhZGRyZXNzIGV4YW1pbmVkLS0tYnV0IHNldmVyYWwKK290aGVyIGNvbW1hbmRzIGFsc28gc2V0IHRoZSBkZWZhdWx0IGFkZHJlc3M6IEBjb2Rle2luZm8gYnJlYWtwb2ludHN9ICh0bwordGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3QgYnJlYWtwb2ludCBsaXN0ZWQpLCBAY29kZXtpbmZvIGxpbmV9ICh0byB0aGUKK3N0YXJ0aW5nIGFkZHJlc3Mgb2YgYSBsaW5lKSwgYW5kIEBjb2Rle3ByaW50fSAoaWYgeW91IHVzZSBpdCB0byBkaXNwbGF5CithIHZhbHVlIGZyb20gbWVtb3J5KS4KK0BlbmQgdGFibGUKKworRm9yIGV4YW1wbGUsIEBzYW1we3gvM3VoIDB4NTQzMjB9IGlzIGEgcmVxdWVzdCB0byBkaXNwbGF5IHRocmVlIGhhbGZ3b3JkcworKEBjb2Rle2h9KSBvZiBtZW1vcnksIGZvcm1hdHRlZCBhcyB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXJzIChAc2FtcHt1fSksCitzdGFydGluZyBhdCBhZGRyZXNzIEBjb2RlezB4NTQzMjB9LiAgQHNhbXB7eC80eHcgJHNwfSBwcmludHMgdGhlIGZvdXIKK3dvcmRzIChAc2FtcHt3fSkgb2YgbWVtb3J5IGFib3ZlIHRoZSBzdGFjayBwb2ludGVyIChoZXJlLCBAc2FtcHskc3B9OworQHB4cmVme1JlZ2lzdGVyc30pIGluIGhleGFkZWNpbWFsIChAc2FtcHt4fSkuCisKK1NpbmNlIHRoZSBsZXR0ZXJzIGluZGljYXRpbmcgdW5pdCBzaXplcyBhcmUgYWxsIGRpc3RpbmN0IGZyb20gdGhlCitsZXR0ZXJzIHNwZWNpZnlpbmcgb3V0cHV0IGZvcm1hdHMsIHlvdSBkbyBub3QgaGF2ZSB0byByZW1lbWJlciB3aGV0aGVyCit1bml0IHNpemUgb3IgZm9ybWF0IGNvbWVzIGZpcnN0OyBlaXRoZXIgb3JkZXIgd29ya3MuICBUaGUgb3V0cHV0CitzcGVjaWZpY2F0aW9ucyBAc2FtcHs0eHd9IGFuZCBAc2FtcHs0d3h9IG1lYW4gZXhhY3RseSB0aGUgc2FtZSB0aGluZy4KKyhIb3dldmVyLCB0aGUgY291bnQgQHZhcntufSBtdXN0IGNvbWUgZmlyc3Q7IEBzYW1we3d4NH0gZG9lcyBub3Qgd29yay4pCisKK0V2ZW4gdGhvdWdoIHRoZSB1bml0IHNpemUgQHZhcnt1fSBpcyBpZ25vcmVkIGZvciB0aGUgZm9ybWF0cyBAc2FtcHtzfQorYW5kIEBzYW1we2l9LCB5b3UgbWlnaHQgc3RpbGwgd2FudCB0byB1c2UgYSBjb3VudCBAdmFye259OyBmb3IgZXhhbXBsZSwKK0BzYW1wezNpfSBzcGVjaWZpZXMgdGhhdCB5b3Ugd2FudCB0byBzZWUgdGhyZWUgbWFjaGluZSBpbnN0cnVjdGlvbnMsCitpbmNsdWRpbmcgYW55IG9wZXJhbmRzLiAgVGhlIGNvbW1hbmQgQGNvZGV7ZGlzYXNzZW1ibGV9IGdpdmVzIGFuCithbHRlcm5hdGl2ZSB3YXkgb2YgaW5zcGVjdGluZyBtYWNoaW5lIGluc3RydWN0aW9uczsgQHB4cmVme01hY2hpbmUKK0NvZGUsLFNvdXJjZSBhbmQgbWFjaGluZSBjb2RlfS4KKworQWxsIHRoZSBkZWZhdWx0cyBmb3IgdGhlIGFyZ3VtZW50cyB0byBAY29kZXt4fSBhcmUgZGVzaWduZWQgdG8gbWFrZSBpdAorZWFzeSB0byBjb250aW51ZSBzY2FubmluZyBtZW1vcnkgd2l0aCBtaW5pbWFsIHNwZWNpZmljYXRpb25zIGVhY2ggdGltZQoreW91IHVzZSBAY29kZXt4fS4gIEZvciBleGFtcGxlLCBhZnRlciB5b3UgaGF2ZSBpbnNwZWN0ZWQgdGhyZWUgbWFjaGluZQoraW5zdHJ1Y3Rpb25zIHdpdGggQHNhbXB7eC8zaSBAdmFye2FkZHJ9fSwgeW91IGNhbiBpbnNwZWN0IHRoZSBuZXh0IHNldmVuCit3aXRoIGp1c3QgQHNhbXB7eC83fS4gIElmIHlvdSB1c2UgQGtleXtSRVR9IHRvIHJlcGVhdCB0aGUgQGNvZGV7eH0gY29tbWFuZCwKK3RoZSByZXBlYXQgY291bnQgQHZhcntufSBpcyB1c2VkIGFnYWluOyB0aGUgb3RoZXIgYXJndW1lbnRzIGRlZmF1bHQgYXMKK2ZvciBzdWNjZXNzaXZlIHVzZXMgb2YgQGNvZGV7eH0uCisKK0BjaW5kZXggQGNvZGV7JF99LCBAY29kZXskX199LCBhbmQgdmFsdWUgaGlzdG9yeQorVGhlIGFkZHJlc3NlcyBhbmQgY29udGVudHMgcHJpbnRlZCBieSB0aGUgQGNvZGV7eH0gY29tbWFuZCBhcmUgbm90IHNhdmVkCitpbiB0aGUgdmFsdWUgaGlzdG9yeSBiZWNhdXNlIHRoZXJlIGlzIG9mdGVuIHRvbyBtdWNoIG9mIHRoZW0gYW5kIHRoZXkKK3dvdWxkIGdldCBpbiB0aGUgd2F5LiAgSW5zdGVhZCwgQHZhbHVle0dEQk59IG1ha2VzIHRoZXNlIHZhbHVlcyBhdmFpbGFibGUgZm9yCitzdWJzZXF1ZW50IHVzZSBpbiBleHByZXNzaW9ucyBhcyB2YWx1ZXMgb2YgdGhlIGNvbnZlbmllbmNlIHZhcmlhYmxlcworQGNvZGV7JF99IGFuZCBAY29kZXskX199LiAgQWZ0ZXIgYW4gQGNvZGV7eH0gY29tbWFuZCwgdGhlIGxhc3QgYWRkcmVzcworZXhhbWluZWQgaXMgYXZhaWxhYmxlIGZvciB1c2UgaW4gZXhwcmVzc2lvbnMgaW4gdGhlIGNvbnZlbmllbmNlIHZhcmlhYmxlCitAY29kZXskX30uICBUaGUgY29udGVudHMgb2YgdGhhdCBhZGRyZXNzLCBhcyBleGFtaW5lZCwgYXJlIGF2YWlsYWJsZSBpbgordGhlIGNvbnZlbmllbmNlIHZhcmlhYmxlIEBjb2RleyRfX30uCisKK0lmIHRoZSBAY29kZXt4fSBjb21tYW5kIGhhcyBhIHJlcGVhdCBjb3VudCwgdGhlIGFkZHJlc3MgYW5kIGNvbnRlbnRzIHNhdmVkCithcmUgZnJvbSB0aGUgbGFzdCBtZW1vcnkgdW5pdCBwcmludGVkOyB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgbGFzdAorYWRkcmVzcyBwcmludGVkIGlmIHNldmVyYWwgdW5pdHMgd2VyZSBwcmludGVkIG9uIHRoZSBsYXN0IGxpbmUgb2Ygb3V0cHV0LgorCitAbm9kZSBBdXRvIERpc3BsYXksIFByaW50IFNldHRpbmdzLCBNZW1vcnksIERhdGEKK0BzZWN0aW9uIEF1dG9tYXRpYyBkaXNwbGF5CitAY2luZGV4IGF1dG9tYXRpYyBkaXNwbGF5CitAY2luZGV4IGRpc3BsYXkgb2YgZXhwcmVzc2lvbnMKKworSWYgeW91IGZpbmQgdGhhdCB5b3Ugd2FudCB0byBwcmludCB0aGUgdmFsdWUgb2YgYW4gZXhwcmVzc2lvbiBmcmVxdWVudGx5CisodG8gc2VlIGhvdyBpdCBjaGFuZ2VzKSwgeW91IG1pZ2h0IHdhbnQgdG8gYWRkIGl0IHRvIHRoZSBAZGZue2F1dG9tYXRpYworZGlzcGxheSBsaXN0fSBzbyB0aGF0IEB2YWx1ZXtHREJOfSBwcmludHMgaXRzIHZhbHVlIGVhY2ggdGltZSB5b3VyIHByb2dyYW0gc3RvcHMuCitFYWNoIGV4cHJlc3Npb24gYWRkZWQgdG8gdGhlIGxpc3QgaXMgZ2l2ZW4gYSBudW1iZXIgdG8gaWRlbnRpZnkgaXQ7Cit0byByZW1vdmUgYW4gZXhwcmVzc2lvbiBmcm9tIHRoZSBsaXN0LCB5b3Ugc3BlY2lmeSB0aGF0IG51bWJlci4KK1RoZSBhdXRvbWF0aWMgZGlzcGxheSBsb29rcyBsaWtlIHRoaXM6CisKK0BleGFtcGxlCisyOiBmb28gPSAzOAorMzogYmFyWzVdID0gKHN0cnVjdCBoYWNrICopIDB4MzgwNAorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorVGhpcyBkaXNwbGF5IHNob3dzIGl0ZW0gbnVtYmVycywgZXhwcmVzc2lvbnMgYW5kIHRoZWlyIGN1cnJlbnQgdmFsdWVzLiAgQXMgd2l0aAorZGlzcGxheXMgeW91IHJlcXVlc3QgbWFudWFsbHkgdXNpbmcgQGNvZGV7eH0gb3IgQGNvZGV7cHJpbnR9LCB5b3UgY2FuCitzcGVjaWZ5IHRoZSBvdXRwdXQgZm9ybWF0IHlvdSBwcmVmZXI7IGluIGZhY3QsIEBjb2Rle2Rpc3BsYXl9IGRlY2lkZXMKK3doZXRoZXIgdG8gdXNlIEBjb2Rle3ByaW50fSBvciBAY29kZXt4fSBkZXBlbmRpbmcgb24gaG93IGVsYWJvcmF0ZSB5b3VyCitmb3JtYXQgc3BlY2lmaWNhdGlvbiBpcy0tLWl0IHVzZXMgQGNvZGV7eH0gaWYgeW91IHNwZWNpZnkgYSB1bml0IHNpemUsCitvciBvbmUgb2YgdGhlIHR3byBmb3JtYXRzIChAc2FtcHtpfSBhbmQgQHNhbXB7c30pIHRoYXQgYXJlIG9ubHkKK3N1cHBvcnRlZCBieSBAY29kZXt4fTsgb3RoZXJ3aXNlIGl0IHVzZXMgQGNvZGV7cHJpbnR9LgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggZGlzcGxheQorQGl0ZW0gZGlzcGxheSBAdmFye2V4cH0KK0FkZCB0aGUgZXhwcmVzc2lvbiBAdmFye2V4cH0gdG8gdGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMgdG8gZGlzcGxheQorZWFjaCB0aW1lIHlvdXIgcHJvZ3JhbSBzdG9wcy4gIEB4cmVme0V4cHJlc3Npb25zLCAsRXhwcmVzc2lvbnN9LgorCitAY29kZXtkaXNwbGF5fSBkb2VzIG5vdCByZXBlYXQgaWYgeW91IHByZXNzIEBrZXl7UkVUfSBhZ2FpbiBhZnRlciB1c2luZyBpdC4KKworQGl0ZW0gZGlzcGxheS9AdmFye2ZtdH0gQHZhcntleHB9CitGb3IgQHZhcntmbXR9IHNwZWNpZnlpbmcgb25seSBhIGRpc3BsYXkgZm9ybWF0IGFuZCBub3QgYSBzaXplIG9yCitjb3VudCwgYWRkIHRoZSBleHByZXNzaW9uIEB2YXJ7ZXhwfSB0byB0aGUgYXV0by1kaXNwbGF5IGxpc3QgYnV0CithcnJhbmdlIHRvIGRpc3BsYXkgaXQgZWFjaCB0aW1lIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0IEB2YXJ7Zm10fS4KK0B4cmVme091dHB1dCBGb3JtYXRzLCxPdXRwdXQgZm9ybWF0c30uCisKK0BpdGVtIGRpc3BsYXkvQHZhcntmbXR9IEB2YXJ7YWRkcn0KK0ZvciBAdmFye2ZtdH0gQHNhbXB7aX0gb3IgQHNhbXB7c30sIG9yIGluY2x1ZGluZyBhIHVuaXQtc2l6ZSBvciBhCitudW1iZXIgb2YgdW5pdHMsIGFkZCB0aGUgZXhwcmVzc2lvbiBAdmFye2FkZHJ9IGFzIGEgbWVtb3J5IGFkZHJlc3MgdG8KK2JlIGV4YW1pbmVkIGVhY2ggdGltZSB5b3VyIHByb2dyYW0gc3RvcHMuICBFeGFtaW5pbmcgbWVhbnMgaW4gZWZmZWN0Citkb2luZyBAc2FtcHt4L0B2YXJ7Zm10fSBAdmFye2FkZHJ9fS4gIEB4cmVme01lbW9yeSwgLEV4YW1pbmluZyBtZW1vcnl9LgorQGVuZCB0YWJsZQorCitGb3IgZXhhbXBsZSwgQHNhbXB7ZGlzcGxheS9pICRwY30gY2FuIGJlIGhlbHBmdWwsIHRvIHNlZSB0aGUgbWFjaGluZQoraW5zdHJ1Y3Rpb24gYWJvdXQgdG8gYmUgZXhlY3V0ZWQgZWFjaCB0aW1lIGV4ZWN1dGlvbiBzdG9wcyAoQHNhbXB7JHBjfQoraXMgYSBjb21tb24gbmFtZSBmb3IgdGhlIHByb2dyYW0gY291bnRlcjsgQHB4cmVme1JlZ2lzdGVyc30pLgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggZGVsZXRlIGRpc3BsYXkKK0BraW5kZXggdW5kaXNwbGF5CitAaXRlbSB1bmRpc3BsYXkgQHZhcntkbnVtc31AZG90c3t9CitAaXRlbXggZGVsZXRlIGRpc3BsYXkgQHZhcntkbnVtc31AZG90c3t9CitSZW1vdmUgaXRlbSBudW1iZXJzIEB2YXJ7ZG51bXN9IGZyb20gdGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMgdG8gZGlzcGxheS4KKworQGNvZGV7dW5kaXNwbGF5fSBkb2VzIG5vdCByZXBlYXQgaWYgeW91IHByZXNzIEBrZXl7UkVUfSBhZnRlciB1c2luZyBpdC4KKyhPdGhlcndpc2UgeW91IHdvdWxkIGp1c3QgZ2V0IHRoZSBlcnJvciBAc2FtcHtObyBkaXNwbGF5IG51bWJlciBAZG90c3t9fS4pCisKK0BraW5kZXggZGlzYWJsZSBkaXNwbGF5CitAaXRlbSBkaXNhYmxlIGRpc3BsYXkgQHZhcntkbnVtc31AZG90c3t9CitEaXNhYmxlIHRoZSBkaXNwbGF5IG9mIGl0ZW0gbnVtYmVycyBAdmFye2RudW1zfS4gIEEgZGlzYWJsZWQgZGlzcGxheQoraXRlbSBpcyBub3QgcHJpbnRlZCBhdXRvbWF0aWNhbGx5LCBidXQgaXMgbm90IGZvcmdvdHRlbi4gIEl0IG1heSBiZQorZW5hYmxlZCBhZ2FpbiBsYXRlci4KKworQGtpbmRleCBlbmFibGUgZGlzcGxheQorQGl0ZW0gZW5hYmxlIGRpc3BsYXkgQHZhcntkbnVtc31AZG90c3t9CitFbmFibGUgZGlzcGxheSBvZiBpdGVtIG51bWJlcnMgQHZhcntkbnVtc30uICBJdCBiZWNvbWVzIGVmZmVjdGl2ZSBvbmNlCithZ2FpbiBpbiBhdXRvIGRpc3BsYXkgb2YgaXRzIGV4cHJlc3Npb24sIHVudGlsIHlvdSBzcGVjaWZ5IG90aGVyd2lzZS4KKworQGl0ZW0gZGlzcGxheQorRGlzcGxheSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIGV4cHJlc3Npb25zIG9uIHRoZSBsaXN0LCBqdXN0IGFzIGlzCitkb25lIHdoZW4geW91ciBwcm9ncmFtIHN0b3BzLgorCitAa2luZGV4IGluZm8gZGlzcGxheQorQGl0ZW0gaW5mbyBkaXNwbGF5CitQcmludCB0aGUgbGlzdCBvZiBleHByZXNzaW9ucyBwcmV2aW91c2x5IHNldCB1cCB0byBkaXNwbGF5CithdXRvbWF0aWNhbGx5LCBlYWNoIG9uZSB3aXRoIGl0cyBpdGVtIG51bWJlciwgYnV0IHdpdGhvdXQgc2hvd2luZyB0aGUKK3ZhbHVlcy4gIFRoaXMgaW5jbHVkZXMgZGlzYWJsZWQgZXhwcmVzc2lvbnMsIHdoaWNoIGFyZSBtYXJrZWQgYXMgc3VjaC4KK0l0IGFsc28gaW5jbHVkZXMgZXhwcmVzc2lvbnMgd2hpY2ggd291bGQgbm90IGJlIGRpc3BsYXllZCByaWdodCBub3cKK2JlY2F1c2UgdGhleSByZWZlciB0byBhdXRvbWF0aWMgdmFyaWFibGVzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLgorQGVuZCB0YWJsZQorCitJZiBhIGRpc3BsYXkgZXhwcmVzc2lvbiByZWZlcnMgdG8gbG9jYWwgdmFyaWFibGVzLCB0aGVuIGl0IGRvZXMgbm90IG1ha2UKK3NlbnNlIG91dHNpZGUgdGhlIGxleGljYWwgY29udGV4dCBmb3Igd2hpY2ggaXQgd2FzIHNldCB1cC4gIFN1Y2ggYW4KK2V4cHJlc3Npb24gaXMgZGlzYWJsZWQgd2hlbiBleGVjdXRpb24gZW50ZXJzIGEgY29udGV4dCB3aGVyZSBvbmUgb2YgaXRzCit2YXJpYWJsZXMgaXMgbm90IGRlZmluZWQuICBGb3IgZXhhbXBsZSwgaWYgeW91IGdpdmUgdGhlIGNvbW1hbmQKK0Bjb2Rle2Rpc3BsYXkgbGFzdF9jaGFyfSB3aGlsZSBpbnNpZGUgYSBmdW5jdGlvbiB3aXRoIGFuIGFyZ3VtZW50CitAY29kZXtsYXN0X2NoYXJ9LCBAdmFsdWV7R0RCTn0gZGlzcGxheXMgdGhpcyBhcmd1bWVudCB3aGlsZSB5b3VyIHByb2dyYW0KK2NvbnRpbnVlcyB0byBzdG9wIGluc2lkZSB0aGF0IGZ1bmN0aW9uLiAgV2hlbiBpdCBzdG9wcyBlbHNld2hlcmUtLS13aGVyZQordGhlcmUgaXMgbm8gdmFyaWFibGUgQGNvZGV7bGFzdF9jaGFyfS0tLXRoZSBkaXNwbGF5IGlzIGRpc2FibGVkCithdXRvbWF0aWNhbGx5LiAgVGhlIG5leHQgdGltZSB5b3VyIHByb2dyYW0gc3RvcHMgd2hlcmUgQGNvZGV7bGFzdF9jaGFyfQoraXMgbWVhbmluZ2Z1bCwgeW91IGNhbiBlbmFibGUgdGhlIGRpc3BsYXkgZXhwcmVzc2lvbiBvbmNlIGFnYWluLgorCitAbm9kZSBQcmludCBTZXR0aW5ncywgVmFsdWUgSGlzdG9yeSwgQXV0byBEaXNwbGF5LCBEYXRhCitAc2VjdGlvbiBQcmludCBzZXR0aW5ncworCitAY2luZGV4IGZvcm1hdCBvcHRpb25zCitAY2luZGV4IHByaW50IHNldHRpbmdzCitAdmFsdWV7R0RCTn0gcHJvdmlkZXMgdGhlIGZvbGxvd2luZyB3YXlzIHRvIGNvbnRyb2wgaG93IGFycmF5cywgc3RydWN0dXJlcywKK2FuZCBzeW1ib2xzIGFyZSBwcmludGVkLgorCitAbm9pbmRlbnQKK1RoZXNlIHNldHRpbmdzIGFyZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwcm9ncmFtcyBpbiBhbnkgbGFuZ3VhZ2U6CisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBzZXQgcHJpbnQgYWRkcmVzcworQGl0ZW0gc2V0IHByaW50IGFkZHJlc3MKK0BpdGVteCBzZXQgcHJpbnQgYWRkcmVzcyBvbgorQHZhbHVle0dEQk59IHByaW50cyBtZW1vcnkgYWRkcmVzc2VzIHNob3dpbmcgdGhlIGxvY2F0aW9uIG9mIHN0YWNrCit0cmFjZXMsIHN0cnVjdHVyZSB2YWx1ZXMsIHBvaW50ZXIgdmFsdWVzLCBicmVha3BvaW50cywgYW5kIHNvIGZvcnRoLAorZXZlbiB3aGVuIGl0IGFsc28gZGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIHRob3NlIGFkZHJlc3Nlcy4gIFRoZSBkZWZhdWx0CitpcyBAY29kZXtvbn0uICBGb3IgZXhhbXBsZSwgdGhpcyBpcyB3aGF0IGEgc3RhY2sgZnJhbWUgZGlzcGxheSBsb29rcyBsaWtlIHdpdGgKK0Bjb2Rle3NldCBwcmludCBhZGRyZXNzIG9ufToKKworQHNtYWxsZXhhbXBsZQorQGdyb3VwCisoQHZhbHVle0dEQlB9KSBmCisjMCAgc2V0X3F1b3RlcyAobHE9MHgzNGM3OCAiPDwiLCBycT0weDM0Yzg4ICI+PiIpCisgICAgYXQgaW5wdXQuYzo1MzAKKzUzMCAgICAgICAgIGlmIChscXVvdGUgIT0gZGVmX2xxdW90ZSkKK0BlbmQgZ3JvdXAKK0BlbmQgc21hbGxleGFtcGxlCisKK0BpdGVtIHNldCBwcmludCBhZGRyZXNzIG9mZgorRG8gbm90IHByaW50IGFkZHJlc3NlcyB3aGVuIGRpc3BsYXlpbmcgdGhlaXIgY29udGVudHMuICBGb3IgZXhhbXBsZSwKK3RoaXMgaXMgdGhlIHNhbWUgc3RhY2sgZnJhbWUgZGlzcGxheWVkIHdpdGggQGNvZGV7c2V0IHByaW50IGFkZHJlc3Mgb2ZmfToKKworQHNtYWxsZXhhbXBsZQorQGdyb3VwCisoQHZhbHVle0dEQlB9KSBzZXQgcHJpbnQgYWRkciBvZmYKKyhAdmFsdWV7R0RCUH0pIGYKKyMwICBzZXRfcXVvdGVzIChscT0iPDwiLCBycT0iPj4iKSBhdCBpbnB1dC5jOjUzMAorNTMwICAgICAgICAgaWYgKGxxdW90ZSAhPSBkZWZfbHF1b3RlKQorQGVuZCBncm91cAorQGVuZCBzbWFsbGV4YW1wbGUKKworWW91IGNhbiB1c2UgQHNhbXB7c2V0IHByaW50IGFkZHJlc3Mgb2ZmfSB0byBlbGltaW5hdGUgYWxsIG1hY2hpbmUKK2RlcGVuZGVudCBkaXNwbGF5cyBmcm9tIHRoZSBAdmFsdWV7R0RCTn0gaW50ZXJmYWNlLiAgRm9yIGV4YW1wbGUsIHdpdGgKK0Bjb2Rle3ByaW50IGFkZHJlc3Mgb2ZmfSwgeW91IHNob3VsZCBnZXQgdGhlIHNhbWUgdGV4dCBmb3IgYmFja3RyYWNlcyBvbgorYWxsIG1hY2hpbmVzLS0td2hldGhlciBvciBub3QgdGhleSBpbnZvbHZlIHBvaW50ZXIgYXJndW1lbnRzLgorCitAa2luZGV4IHNob3cgcHJpbnQgYWRkcmVzcworQGl0ZW0gc2hvdyBwcmludCBhZGRyZXNzCitTaG93IHdoZXRoZXIgb3Igbm90IGFkZHJlc3NlcyBhcmUgdG8gYmUgcHJpbnRlZC4KK0BlbmQgdGFibGUKKworV2hlbiBAdmFsdWV7R0RCTn0gcHJpbnRzIGEgc3ltYm9saWMgYWRkcmVzcywgaXQgbm9ybWFsbHkgcHJpbnRzIHRoZQorY2xvc2VzdCBlYXJsaWVyIHN5bWJvbCBwbHVzIGFuIG9mZnNldC4gIElmIHRoYXQgc3ltYm9sIGRvZXMgbm90IHVuaXF1ZWx5CitpZGVudGlmeSB0aGUgYWRkcmVzcyAoZm9yIGV4YW1wbGUsIGl0IGlzIGEgbmFtZSB3aG9zZSBzY29wZSBpcyBhIHNpbmdsZQorc291cmNlIGZpbGUpLCB5b3UgbWF5IG5lZWQgdG8gY2xhcmlmeS4gIE9uZSB3YXkgdG8gZG8gdGhpcyBpcyB3aXRoCitAY29kZXtpbmZvIGxpbmV9LCBmb3IgZXhhbXBsZSBAc2FtcHtpbmZvIGxpbmUgKjB4NDUzN30uICBBbHRlcm5hdGVseSwKK3lvdSBjYW4gc2V0IEB2YWx1ZXtHREJOfSB0byBwcmludCB0aGUgc291cmNlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIHdoZW4KK2l0IHByaW50cyBhIHN5bWJvbGljIGFkZHJlc3M6CisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBzZXQgcHJpbnQgc3ltYm9sLWZpbGVuYW1lCitAaXRlbSBzZXQgcHJpbnQgc3ltYm9sLWZpbGVuYW1lIG9uCitUZWxsIEB2YWx1ZXtHREJOfSB0byBwcmludCB0aGUgc291cmNlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgb2YgYQorc3ltYm9sIGluIHRoZSBzeW1ib2xpYyBmb3JtIG9mIGFuIGFkZHJlc3MuCisKK0BpdGVtIHNldCBwcmludCBzeW1ib2wtZmlsZW5hbWUgb2ZmCitEbyBub3QgcHJpbnQgc291cmNlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgb2YgYSBzeW1ib2wuICBUaGlzIGlzIHRoZQorZGVmYXVsdC4KKworQGtpbmRleCBzaG93IHByaW50IHN5bWJvbC1maWxlbmFtZQorQGl0ZW0gc2hvdyBwcmludCBzeW1ib2wtZmlsZW5hbWUKK1Nob3cgd2hldGhlciBvciBub3QgQHZhbHVle0dEQk59IHdpbGwgcHJpbnQgdGhlIHNvdXJjZSBmaWxlIG5hbWUgYW5kCitsaW5lIG51bWJlciBvZiBhIHN5bWJvbCBpbiB0aGUgc3ltYm9saWMgZm9ybSBvZiBhbiBhZGRyZXNzLgorQGVuZCB0YWJsZQorCitBbm90aGVyIHNpdHVhdGlvbiB3aGVyZSBpdCBpcyBoZWxwZnVsIHRvIHNob3cgc3ltYm9sIGZpbGVuYW1lcyBhbmQgbGluZQorbnVtYmVycyBpcyB3aGVuIGRpc2Fzc2VtYmxpbmcgY29kZTsgQHZhbHVle0dEQk59IHNob3dzIHlvdSB0aGUgbGluZQorbnVtYmVyIGFuZCBzb3VyY2UgZmlsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGVhY2ggaW5zdHJ1Y3Rpb24uCisKK0Fsc28sIHlvdSBtYXkgd2lzaCB0byBzZWUgdGhlIHN5bWJvbGljIGZvcm0gb25seSBpZiB0aGUgYWRkcmVzcyBiZWluZworcHJpbnRlZCBpcyByZWFzb25hYmx5IGNsb3NlIHRvIHRoZSBjbG9zZXN0IGVhcmxpZXIgc3ltYm9sOgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggc2V0IHByaW50IG1heC1zeW1ib2xpYy1vZmZzZXQKK0BpdGVtIHNldCBwcmludCBtYXgtc3ltYm9saWMtb2Zmc2V0IEB2YXJ7bWF4LW9mZnNldH0KK1RlbGwgQHZhbHVle0dEQk59IHRvIG9ubHkgZGlzcGxheSB0aGUgc3ltYm9saWMgZm9ybSBvZiBhbiBhZGRyZXNzIGlmIHRoZQorb2Zmc2V0IGJldHdlZW4gdGhlIGNsb3Nlc3QgZWFybGllciBzeW1ib2wgYW5kIHRoZSBhZGRyZXNzIGlzIGxlc3MgdGhhbgorQHZhcnttYXgtb2Zmc2V0fS4gIFRoZSBkZWZhdWx0IGlzIDAsIHdoaWNoIHRlbGxzIEB2YWx1ZXtHREJOfSAKK3RvIGFsd2F5cyBwcmludCB0aGUgc3ltYm9saWMgZm9ybSBvZiBhbiBhZGRyZXNzIGlmIGFueSBzeW1ib2wgcHJlY2VkZXMgaXQuCisKK0BraW5kZXggc2hvdyBwcmludCBtYXgtc3ltYm9saWMtb2Zmc2V0CitAaXRlbSBzaG93IHByaW50IG1heC1zeW1ib2xpYy1vZmZzZXQKK0FzayBob3cgbGFyZ2UgdGhlIG1heGltdW0gb2Zmc2V0IGlzIHRoYXQgQHZhbHVle0dEQk59IHByaW50cyBpbiBhCitzeW1ib2xpYyBhZGRyZXNzLgorQGVuZCB0YWJsZQorCitAY2luZGV4IHdpbGQgcG9pbnRlciwgaW50ZXJwcmV0aW5nCitAY2luZGV4IHBvaW50ZXIsIGZpbmRpbmcgcmVmZXJlbnQKK0lmIHlvdSBoYXZlIGEgcG9pbnRlciBhbmQgeW91IGFyZSBub3Qgc3VyZSB3aGVyZSBpdCBwb2ludHMsIHRyeQorQHNhbXB7c2V0IHByaW50IHN5bWJvbC1maWxlbmFtZSBvbn0uICBUaGVuIHlvdSBjYW4gZGV0ZXJtaW5lIHRoZSBuYW1lCithbmQgc291cmNlIGZpbGUgbG9jYXRpb24gb2YgdGhlIHZhcmlhYmxlIHdoZXJlIGl0IHBvaW50cywgdXNpbmcKK0BzYW1we3AvYSBAdmFye3BvaW50ZXJ9fS4gIFRoaXMgaW50ZXJwcmV0cyB0aGUgYWRkcmVzcyBpbiBzeW1ib2xpYyBmb3JtLgorRm9yIGV4YW1wbGUsIGhlcmUgQHZhbHVle0dEQk59IHNob3dzIHRoYXQgYSB2YXJpYWJsZSBAY29kZXtwdHR9IHBvaW50cworYXQgYW5vdGhlciB2YXJpYWJsZSBAY29kZXt0fSwgZGVmaW5lZCBpbiBAZmlsZXtoaTIuY306CisKK0BleGFtcGxlCisoQHZhbHVle0dEQlB9KSBzZXQgcHJpbnQgc3ltYm9sLWZpbGVuYW1lIG9uCisoQHZhbHVle0dEQlB9KSBwL2EgcHR0CiskNCA9IDB4ZTAwOCA8dCBpbiBoaTIuYz4KK0BlbmQgZXhhbXBsZQorCitAcXVvdGF0aW9uCitAZW1waHtXYXJuaW5nOn0gRm9yIHBvaW50ZXJzIHRoYXQgcG9pbnQgdG8gYSBsb2NhbCB2YXJpYWJsZSwgQHNhbXB7cC9hfQorZG9lcyBub3Qgc2hvdyB0aGUgc3ltYm9sIG5hbWUgYW5kIGZpbGVuYW1lIG9mIHRoZSByZWZlcmVudCwgZXZlbiB3aXRoCit0aGUgYXBwcm9wcmlhdGUgQGNvZGV7c2V0IHByaW50fSBvcHRpb25zIHR1cm5lZCBvbi4KK0BlbmQgcXVvdGF0aW9uCisKK090aGVyIHNldHRpbmdzIGNvbnRyb2wgaG93IGRpZmZlcmVudCBraW5kcyBvZiBvYmplY3RzIGFyZSBwcmludGVkOgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggc2V0IHByaW50IGFycmF5CitAaXRlbSBzZXQgcHJpbnQgYXJyYXkKK0BpdGVteCBzZXQgcHJpbnQgYXJyYXkgb24KK1ByZXR0eSBwcmludCBhcnJheXMuICBUaGlzIGZvcm1hdCBpcyBtb3JlIGNvbnZlbmllbnQgdG8gcmVhZCwKK2J1dCB1c2VzIG1vcmUgc3BhY2UuICBUaGUgZGVmYXVsdCBpcyBvZmYuCisKK0BpdGVtIHNldCBwcmludCBhcnJheSBvZmYKK1JldHVybiB0byBjb21wcmVzc2VkIGZvcm1hdCBmb3IgYXJyYXlzLgorCitAa2luZGV4IHNob3cgcHJpbnQgYXJyYXkKK0BpdGVtIHNob3cgcHJpbnQgYXJyYXkKK1Nob3cgd2hldGhlciBjb21wcmVzc2VkIG9yIHByZXR0eSBmb3JtYXQgaXMgc2VsZWN0ZWQgZm9yIGRpc3BsYXlpbmcKK2FycmF5cy4KKworQGtpbmRleCBzZXQgcHJpbnQgZWxlbWVudHMKK0BpdGVtIHNldCBwcmludCBlbGVtZW50cyBAdmFye251bWJlci1vZi1lbGVtZW50c30KK1NldCBhIGxpbWl0IG9uIGhvdyBtYW55IGVsZW1lbnRzIG9mIGFuIGFycmF5IEB2YWx1ZXtHREJOfSB3aWxsIHByaW50LgorSWYgQHZhbHVle0dEQk59IGlzIHByaW50aW5nIGEgbGFyZ2UgYXJyYXksIGl0IHN0b3BzIHByaW50aW5nIGFmdGVyIGl0IGhhcworcHJpbnRlZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHNldCBieSB0aGUgQGNvZGV7c2V0IHByaW50IGVsZW1lbnRzfSBjb21tYW5kLgorVGhpcyBsaW1pdCBhbHNvIGFwcGxpZXMgdG8gdGhlIGRpc3BsYXkgb2Ygc3RyaW5ncy4KK1NldHRpbmcgIEB2YXJ7bnVtYmVyLW9mLWVsZW1lbnRzfSB0byB6ZXJvIG1lYW5zIHRoYXQgdGhlIHByaW50aW5nIGlzIHVubGltaXRlZC4KKworQGtpbmRleCBzaG93IHByaW50IGVsZW1lbnRzCitAaXRlbSBzaG93IHByaW50IGVsZW1lbnRzCitEaXNwbGF5IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgYSBsYXJnZSBhcnJheSB0aGF0IEB2YWx1ZXtHREJOfSB3aWxsIHByaW50LgorSWYgdGhlIG51bWJlciBpcyAwLCB0aGVuIHRoZSBwcmludGluZyBpcyB1bmxpbWl0ZWQuCisKK0BraW5kZXggc2V0IHByaW50IG51bGwtc3RvcAorQGl0ZW0gc2V0IHByaW50IG51bGwtc3RvcAorQ2F1c2UgQHZhbHVle0dEQk59IHRvIHN0b3AgcHJpbnRpbmcgdGhlIGNoYXJhY3RlcnMgb2YgYW4gYXJyYXkgd2hlbiB0aGUgZmlyc3QKK0BzY3tOVUxMfSBpcyBlbmNvdW50ZXJlZC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gbGFyZ2UgYXJyYXlzIGFjdHVhbGx5Citjb250YWluIG9ubHkgc2hvcnQgc3RyaW5ncy4KKworQGtpbmRleCBzZXQgcHJpbnQgcHJldHR5CitAaXRlbSBzZXQgcHJpbnQgcHJldHR5IG9uCitDYXVzZSBAdmFsdWV7R0RCTn0gdG8gcHJpbnQgc3RydWN0dXJlcyBpbiBhbiBpbmRlbnRlZCBmb3JtYXQgd2l0aCBvbmUgbWVtYmVyIAorcGVyIGxpbmUsIGxpa2UgdGhpczoKKworQHNtYWxsZXhhbXBsZQorQGdyb3VwCiskMSA9IEB7CisgIG5leHQgPSAweDAsCisgIGZsYWdzID0gQHsKKyAgICBzd2VldCA9IDEsCisgICAgc291ciA9IDEKKyAgQH0sCisgIG1lYXQgPSAweDU0ICJQb3JrIgorQH0KK0BlbmQgZ3JvdXAKK0BlbmQgc21hbGxleGFtcGxlCisKK0BpdGVtIHNldCBwcmludCBwcmV0dHkgb2ZmCitDYXVzZSBAdmFsdWV7R0RCTn0gdG8gcHJpbnQgc3RydWN0dXJlcyBpbiBhIGNvbXBhY3QgZm9ybWF0LCBsaWtlIHRoaXM6CisKK0BzbWFsbGV4YW1wbGUKK0Bncm91cAorJDEgPSBAe25leHQgPSAweDAsIGZsYWdzID0gQHtzd2VldCA9IDEsIHNvdXIgPSAxQH0sIFwKK21lYXQgPSAweDU0ICJQb3JrIkB9CitAZW5kIGdyb3VwCitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9pbmRlbnQKK1RoaXMgaXMgdGhlIGRlZmF1bHQgZm9ybWF0LgorCitAa2luZGV4IHNob3cgcHJpbnQgcHJldHR5CitAaXRlbSBzaG93IHByaW50IHByZXR0eQorU2hvdyB3aGljaCBmb3JtYXQgQHZhbHVle0dEQk59IGlzIHVzaW5nIHRvIHByaW50IHN0cnVjdHVyZXMuCisKK0BraW5kZXggc2V0IHByaW50IHNldmVuYml0LXN0cmluZ3MKK0BpdGVtIHNldCBwcmludCBzZXZlbmJpdC1zdHJpbmdzIG9uCitQcmludCB1c2luZyBvbmx5IHNldmVuLWJpdCBjaGFyYWN0ZXJzOyBpZiB0aGlzIG9wdGlvbiBpcyBzZXQsCitAdmFsdWV7R0RCTn0gZGlzcGxheXMgYW55IGVpZ2h0LWJpdCBjaGFyYWN0ZXJzIChpbiBzdHJpbmdzIG9yCitjaGFyYWN0ZXIgdmFsdWVzKSB1c2luZyB0aGUgbm90YXRpb24gQGNvZGV7XH1AdmFye25ubn0uICBUaGlzIHNldHRpbmcgaXMKK2Jlc3QgaWYgeW91IGFyZSB3b3JraW5nIGluIEVuZ2xpc2ggKEBzY3thc2NpaX0pIGFuZCB5b3UgdXNlIHRoZQoraGlnaC1vcmRlciBiaXQgb2YgY2hhcmFjdGVycyBhcyBhIG1hcmtlciBvciBgYG1ldGEnJyBiaXQuCisKK0BpdGVtIHNldCBwcmludCBzZXZlbmJpdC1zdHJpbmdzIG9mZgorUHJpbnQgZnVsbCBlaWdodC1iaXQgY2hhcmFjdGVycy4gIFRoaXMgYWxsb3dzIHRoZSB1c2Ugb2YgbW9yZQoraW50ZXJuYXRpb25hbCBjaGFyYWN0ZXIgc2V0cywgYW5kIGlzIHRoZSBkZWZhdWx0LgorCitAa2luZGV4IHNob3cgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncworQGl0ZW0gc2hvdyBwcmludCBzZXZlbmJpdC1zdHJpbmdzCitTaG93IHdoZXRoZXIgb3Igbm90IEB2YWx1ZXtHREJOfSBpcyBwcmludGluZyBvbmx5IHNldmVuLWJpdCBjaGFyYWN0ZXJzLgorCitAa2luZGV4IHNldCBwcmludCB1bmlvbgorQGl0ZW0gc2V0IHByaW50IHVuaW9uIG9uCitUZWxsIEB2YWx1ZXtHREJOfSB0byBwcmludCB1bmlvbnMgd2hpY2ggYXJlIGNvbnRhaW5lZCBpbiBzdHJ1Y3R1cmVzLiAgVGhpcyAKK2lzIHRoZSBkZWZhdWx0IHNldHRpbmcuCisKK0BpdGVtIHNldCBwcmludCB1bmlvbiBvZmYKK1RlbGwgQHZhbHVle0dEQk59IG5vdCB0byBwcmludCB1bmlvbnMgd2hpY2ggYXJlIGNvbnRhaW5lZCBpbiBzdHJ1Y3R1cmVzLgorCitAa2luZGV4IHNob3cgcHJpbnQgdW5pb24KK0BpdGVtIHNob3cgcHJpbnQgdW5pb24KK0FzayBAdmFsdWV7R0RCTn0gd2hldGhlciBvciBub3QgaXQgd2lsbCBwcmludCB1bmlvbnMgd2hpY2ggYXJlIGNvbnRhaW5lZCBpbgorc3RydWN0dXJlcy4KKworRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBkZWNsYXJhdGlvbnMKKworQHNtYWxsZXhhbXBsZQordHlwZWRlZiBlbnVtIEB7VHJlZSwgQnVnQH0gU3BlY2llczsKK3R5cGVkZWYgZW51bSBAe0JpZ190cmVlLCBBY29ybiwgU2VlZGxpbmdAfSBUcmVlX2Zvcm1zOwordHlwZWRlZiBlbnVtIEB7Q2F0ZXJwaWxsYXIsIENvY29vbiwgQnV0dGVyZmx5QH0gCisgICAgICAgICAgICAgIEJ1Z19mb3JtczsKKworc3RydWN0IHRoaW5nIEB7CisgIFNwZWNpZXMgaXQ7CisgIHVuaW9uIEB7CisgICAgVHJlZV9mb3JtcyB0cmVlOworICAgIEJ1Z19mb3JtcyBidWc7CisgIEB9IGZvcm07CitAfTsKKworc3RydWN0IHRoaW5nIGZvbyA9IEB7VHJlZSwgQHtBY29ybkB9QH07CitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9pbmRlbnQKK3dpdGggQGNvZGV7c2V0IHByaW50IHVuaW9uIG9ufSBpbiBlZmZlY3QgQHNhbXB7cCBmb299IHdvdWxkIHByaW50CisKK0BzbWFsbGV4YW1wbGUKKyQxID0gQHtpdCA9IFRyZWUsIGZvcm0gPSBAe3RyZWUgPSBBY29ybiwgYnVnID0gQ29jb29uQH1AfQorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vaW5kZW50CithbmQgd2l0aCBAY29kZXtzZXQgcHJpbnQgdW5pb24gb2ZmfSBpbiBlZmZlY3QgaXQgd291bGQgcHJpbnQKKworQHNtYWxsZXhhbXBsZQorJDEgPSBAe2l0ID0gVHJlZSwgZm9ybSA9IEB7Li4uQH1AfQorQGVuZCBzbWFsbGV4YW1wbGUKK0BlbmQgdGFibGUKKworQGlmY2xlYXIgQ09OTFkKK0BuZWVkIDEwMDAKK0Bub2luZGVudAorVGhlc2Ugc2V0dGluZ3MgYXJlIG9mIGludGVyZXN0IHdoZW4gZGVidWdnaW5nIEMrKyBwcm9ncmFtczoKKworQHRhYmxlIEBjb2RlCitAY2luZGV4IGRlbWFuZ2xpbmcKK0BraW5kZXggc2V0IHByaW50IGRlbWFuZ2xlCitAaXRlbSBzZXQgcHJpbnQgZGVtYW5nbGUKK0BpdGVteCBzZXQgcHJpbnQgZGVtYW5nbGUgb24KK1ByaW50IEMrKyBuYW1lcyBpbiB0aGVpciBzb3VyY2UgZm9ybSByYXRoZXIgdGhhbiBpbiB0aGUgZW5jb2RlZAorKGBgbWFuZ2xlZCcnKSBmb3JtIHBhc3NlZCB0byB0aGUgYXNzZW1ibGVyIGFuZCBsaW5rZXIgZm9yIHR5cGUtc2FmZQorbGlua2FnZS4gIFRoZSBkZWZhdWx0IGlzIEBzYW1we29ufS4KKworQGtpbmRleCBzaG93IHByaW50IGRlbWFuZ2xlCitAaXRlbSBzaG93IHByaW50IGRlbWFuZ2xlCitTaG93IHdoZXRoZXIgQysrIG5hbWVzIGFyZSBwcmludGVkIGluIG1hbmdsZWQgb3IgZGVtYW5nbGVkIGZvcm0uCisKK0BraW5kZXggc2V0IHByaW50IGFzbS1kZW1hbmdsZQorQGl0ZW0gc2V0IHByaW50IGFzbS1kZW1hbmdsZQorQGl0ZW14IHNldCBwcmludCBhc20tZGVtYW5nbGUgb24KK1ByaW50IEMrKyBuYW1lcyBpbiB0aGVpciBzb3VyY2UgZm9ybSByYXRoZXIgdGhhbiB0aGVpciBtYW5nbGVkIGZvcm0sIGV2ZW4KK2luIGFzc2VtYmxlciBjb2RlIHByaW50b3V0cyBzdWNoIGFzIGluc3RydWN0aW9uIGRpc2Fzc2VtYmxpZXMuCitUaGUgZGVmYXVsdCBpcyBvZmYuCisKK0BraW5kZXggc2hvdyBwcmludCBhc20tZGVtYW5nbGUKK0BpdGVtIHNob3cgcHJpbnQgYXNtLWRlbWFuZ2xlCitTaG93IHdoZXRoZXIgQysrIG5hbWVzIGluIGFzc2VtYmx5IGxpc3RpbmdzIGFyZSBwcmludGVkIGluIG1hbmdsZWQKK29yIGRlbWFuZ2xlZCBmb3JtLgorCitAa2luZGV4IHNldCBkZW1hbmdsZS1zdHlsZQorQGNpbmRleCBDKysgc3ltYm9sIGRlY29kaW5nIHN0eWxlCitAY2luZGV4IHN5bWJvbCBkZWNvZGluZyBzdHlsZSwgQysrCitAaXRlbSBzZXQgZGVtYW5nbGUtc3R5bGUgQHZhcntzdHlsZX0KK0Nob29zZSBhbW9uZyBzZXZlcmFsIGVuY29kaW5nIHNjaGVtZXMgdXNlZCBieSBkaWZmZXJlbnQgY29tcGlsZXJzIHRvCityZXByZXNlbnQgQysrIG5hbWVzLiAgVGhlIGNob2ljZXMgZm9yIEB2YXJ7c3R5bGV9IGFyZSBjdXJyZW50bHk6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gYXV0bworQWxsb3cgQHZhbHVle0dEQk59IHRvIGNob29zZSBhIGRlY29kaW5nIHN0eWxlIGJ5IGluc3BlY3RpbmcgeW91ciBwcm9ncmFtLgorCitAaXRlbSBnbnUKK0RlY29kZSBiYXNlZCBvbiB0aGUgQHNje2dudX0gQysrIGNvbXBpbGVyIChAY29kZXtnKyt9KSBlbmNvZGluZyBhbGdvcml0aG0uICAKK0BpZmNsZWFyIEhQUEEKK1RoaXMgaXMgdGhlIGRlZmF1bHQuCitAZW5kIGlmY2xlYXIKKworQGl0ZW0gaHAKK0RlY29kZSBiYXNlZCBvbiB0aGUgSFAgQU5TSSBDKysgKEBjb2Rle2FDQ30pIGVuY29kaW5nIGFsZ29yaXRobS4KKworQGl0ZW0gbHVjaWQKK0RlY29kZSBiYXNlZCBvbiB0aGUgTHVjaWQgQysrIGNvbXBpbGVyIChAY29kZXtsY2N9KSBlbmNvZGluZyBhbGdvcml0aG0uCisKK0BpdGVtIGFybQorRGVjb2RlIHVzaW5nIHRoZSBhbGdvcml0aG0gaW4gdGhlIEBjaXRle0MrKyBBbm5vdGF0ZWQgUmVmZXJlbmNlIE1hbnVhbH0uCitAc3Ryb25ne1dhcm5pbmc6fSB0aGlzIHNldHRpbmcgYWxvbmUgaXMgbm90IHN1ZmZpY2llbnQgdG8gYWxsb3cKK2RlYnVnZ2luZyBAY29kZXtjZnJvbnR9LWdlbmVyYXRlZCBleGVjdXRhYmxlcy4gIEB2YWx1ZXtHREJOfSB3b3VsZAorcmVxdWlyZSBmdXJ0aGVyIGVuaGFuY2VtZW50IHRvIHBlcm1pdCB0aGF0LgorCitAZW5kIHRhYmxlCitJZiB5b3Ugb21pdCBAdmFye3N0eWxlfSwgeW91IHdpbGwgc2VlIGEgbGlzdCBvZiBwb3NzaWJsZSBmb3JtYXRzLgorCitAa2luZGV4IHNob3cgZGVtYW5nbGUtc3R5bGUKK0BpdGVtIHNob3cgZGVtYW5nbGUtc3R5bGUKK0Rpc3BsYXkgdGhlIGVuY29kaW5nIHN0eWxlIGN1cnJlbnRseSBpbiB1c2UgZm9yIGRlY29kaW5nIEMrKyBzeW1ib2xzLgorCitAa2luZGV4IHNldCBwcmludCBvYmplY3QKK0BpdGVtIHNldCBwcmludCBvYmplY3QKK0BpdGVteCBzZXQgcHJpbnQgb2JqZWN0IG9uCitXaGVuIGRpc3BsYXlpbmcgYSBwb2ludGVyIHRvIGFuIG9iamVjdCwgaWRlbnRpZnkgdGhlIEBlbXBoe2FjdHVhbH0KKyhkZXJpdmVkKSB0eXBlIG9mIHRoZSBvYmplY3QgcmF0aGVyIHRoYW4gdGhlIEBlbXBoe2RlY2xhcmVkfSB0eXBlLCB1c2luZwordGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUuCisKK0BpdGVtIHNldCBwcmludCBvYmplY3Qgb2ZmCitEaXNwbGF5IG9ubHkgdGhlIGRlY2xhcmVkIHR5cGUgb2Ygb2JqZWN0cywgd2l0aG91dCByZWZlcmVuY2UgdG8gdGhlCit2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBzZXR0aW5nLgorCitAa2luZGV4IHNob3cgcHJpbnQgb2JqZWN0CitAaXRlbSBzaG93IHByaW50IG9iamVjdAorU2hvdyB3aGV0aGVyIGFjdHVhbCwgb3IgZGVjbGFyZWQsIG9iamVjdCB0eXBlcyBhcmUgZGlzcGxheWVkLgorCitAa2luZGV4IHNldCBwcmludCBzdGF0aWMtbWVtYmVycworQGl0ZW0gc2V0IHByaW50IHN0YXRpYy1tZW1iZXJzCitAaXRlbXggc2V0IHByaW50IHN0YXRpYy1tZW1iZXJzIG9uCitQcmludCBzdGF0aWMgbWVtYmVycyB3aGVuIGRpc3BsYXlpbmcgYSBDKysgb2JqZWN0LiAgVGhlIGRlZmF1bHQgaXMgb24uCisKK0BpdGVtIHNldCBwcmludCBzdGF0aWMtbWVtYmVycyBvZmYKK0RvIG5vdCBwcmludCBzdGF0aWMgbWVtYmVycyB3aGVuIGRpc3BsYXlpbmcgYSBDKysgb2JqZWN0LgorCitAa2luZGV4IHNob3cgcHJpbnQgc3RhdGljLW1lbWJlcnMKK0BpdGVtIHNob3cgcHJpbnQgc3RhdGljLW1lbWJlcnMKK1Nob3cgd2hldGhlciBDKysgc3RhdGljIG1lbWJlcnMgYXJlIHByaW50ZWQsIG9yIG5vdC4KKworQGMgVGhlc2UgZG9uJ3Qgd29yayB3aXRoIEhQIEFOU0kgQysrIHlldC4KK0BraW5kZXggc2V0IHByaW50IHZ0YmwKK0BpdGVtIHNldCBwcmludCB2dGJsCitAaXRlbXggc2V0IHByaW50IHZ0Ymwgb24KK1ByZXR0eSBwcmludCBDKysgdmlydHVhbCBmdW5jdGlvbiB0YWJsZXMuICBUaGUgZGVmYXVsdCBpcyBvZmYuCitAaWZzZXQgSFBQQQorKFRoZSBAY29kZXt2dGJsfSBjb21tYW5kcyBkbyBub3Qgd29yayBvbiBwcm9ncmFtcyBjb21waWxlZCB3aXRoIHRoZSBIUAorQU5TSSBDKysgY29tcGlsZXIgKEBjb2Rle2FDQ30pLikKK0BlbmQgaWZzZXQKKworQGl0ZW0gc2V0IHByaW50IHZ0Ymwgb2ZmCitEbyBub3QgcHJldHR5IHByaW50IEMrKyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlcy4KKworQGtpbmRleCBzaG93IHByaW50IHZ0YmwKK0BpdGVtIHNob3cgcHJpbnQgdnRibAorU2hvdyB3aGV0aGVyIEMrKyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlcyBhcmUgcHJldHR5IHByaW50ZWQsIG9yIG5vdC4KK0BlbmQgdGFibGUKK0BlbmQgaWZjbGVhcgorCitAbm9kZSBWYWx1ZSBIaXN0b3J5LCBDb252ZW5pZW5jZSBWYXJzLCBQcmludCBTZXR0aW5ncywgRGF0YQorQHNlY3Rpb24gVmFsdWUgaGlzdG9yeQorCitAY2luZGV4IHZhbHVlIGhpc3RvcnkKK1ZhbHVlcyBwcmludGVkIGJ5IHRoZSBAY29kZXtwcmludH0gY29tbWFuZCBhcmUgc2F2ZWQgaW4gdGhlIEB2YWx1ZXtHREJOfSAKK0BkZm57dmFsdWUgaGlzdG9yeX0uICBUaGlzIGFsbG93cyB5b3UgdG8gcmVmZXIgdG8gdGhlbSBpbiBvdGhlciBleHByZXNzaW9ucy4gIAorVmFsdWVzIGFyZSBrZXB0IHVudGlsIHRoZSBzeW1ib2wgdGFibGUgaXMgcmUtcmVhZCBvciBkaXNjYXJkZWQgCisoZm9yIGV4YW1wbGUgd2l0aCB0aGUgQGNvZGV7ZmlsZX0gb3IgQGNvZGV7c3ltYm9sLWZpbGV9IGNvbW1hbmRzKS4gIAorV2hlbiB0aGUgc3ltYm9sIHRhYmxlIGNoYW5nZXMsIHRoZSB2YWx1ZSBoaXN0b3J5IGlzIGRpc2NhcmRlZCwgCitzaW5jZSB0aGUgdmFsdWVzIG1heSBjb250YWluIHBvaW50ZXJzIGJhY2sgdG8gdGhlIHR5cGVzIGRlZmluZWQgaW4gdGhlIAorc3ltYm9sIHRhYmxlLgorCitAY2luZGV4IEBjb2RleyR9CitAY2luZGV4IEBjb2RleyQkfQorQGNpbmRleCBoaXN0b3J5IG51bWJlcgorVGhlIHZhbHVlcyBwcmludGVkIGFyZSBnaXZlbiBAZGZue2hpc3RvcnkgbnVtYmVyc30gYnkgd2hpY2ggeW91IGNhbgorcmVmZXIgdG8gdGhlbS4gIFRoZXNlIGFyZSBzdWNjZXNzaXZlIGludGVnZXJzIHN0YXJ0aW5nIHdpdGggb25lLgorQGNvZGV7cHJpbnR9IHNob3dzIHlvdSB0aGUgaGlzdG9yeSBudW1iZXIgYXNzaWduZWQgdG8gYSB2YWx1ZSBieQorcHJpbnRpbmcgQHNhbXB7JEB2YXJ7bnVtfSA9IH0gYmVmb3JlIHRoZSB2YWx1ZTsgaGVyZSBAdmFye251bX0gaXMgdGhlCitoaXN0b3J5IG51bWJlci4KKworVG8gcmVmZXIgdG8gYW55IHByZXZpb3VzIHZhbHVlLCB1c2UgQHNhbXB7JH0gZm9sbG93ZWQgYnkgdGhlIHZhbHVlJ3MKK2hpc3RvcnkgbnVtYmVyLiAgVGhlIHdheSBAY29kZXtwcmludH0gbGFiZWxzIGl0cyBvdXRwdXQgaXMgZGVzaWduZWQgdG8KK3JlbWluZCB5b3Ugb2YgdGhpcy4gIEp1c3QgQGNvZGV7JH0gcmVmZXJzIHRvIHRoZSBtb3N0IHJlY2VudCB2YWx1ZSBpbgordGhlIGhpc3RvcnksIGFuZCBAY29kZXskJH0gcmVmZXJzIHRvIHRoZSB2YWx1ZSBiZWZvcmUgdGhhdC4KK0Bjb2RleyQkQHZhcntufX0gcmVmZXJzIHRvIHRoZSBAdmFye259dGggdmFsdWUgZnJvbSB0aGUgZW5kOyBAY29kZXskJDJ9CitpcyB0aGUgdmFsdWUganVzdCBwcmlvciB0byBAY29kZXskJH0sIEBjb2RleyQkMX0gaXMgZXF1aXZhbGVudCB0bworQGNvZGV7JCR9LCBhbmQgQGNvZGV7JCQwfSBpcyBlcXVpdmFsZW50IHRvIEBjb2RleyR9LgorCitGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGF2ZSBqdXN0IHByaW50ZWQgYSBwb2ludGVyIHRvIGEgc3RydWN0dXJlIGFuZAord2FudCB0byBzZWUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJ1Y3R1cmUuICBJdCBzdWZmaWNlcyB0byB0eXBlCisKK0BleGFtcGxlCitwICokCitAZW5kIGV4YW1wbGUKKworSWYgeW91IGhhdmUgYSBjaGFpbiBvZiBzdHJ1Y3R1cmVzIHdoZXJlIHRoZSBjb21wb25lbnQgQGNvZGV7bmV4dH0gcG9pbnRzCit0byB0aGUgbmV4dCBvbmUsIHlvdSBjYW4gcHJpbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBuZXh0IG9uZSB3aXRoIHRoaXM6CisKK0BleGFtcGxlCitwICokLm5leHQKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK1lvdSBjYW4gcHJpbnQgc3VjY2Vzc2l2ZSBsaW5rcyBpbiB0aGUgY2hhaW4gYnkgcmVwZWF0aW5nIHRoaXMKK2NvbW1hbmQtLS13aGljaCB5b3UgY2FuIGRvIGJ5IGp1c3QgdHlwaW5nIEBrZXl7UkVUfS4KKworTm90ZSB0aGF0IHRoZSBoaXN0b3J5IHJlY29yZHMgdmFsdWVzLCBub3QgZXhwcmVzc2lvbnMuICBJZiB0aGUgdmFsdWUgb2YKK0Bjb2Rle3h9IGlzIDQgYW5kIHlvdSB0eXBlIHRoZXNlIGNvbW1hbmRzOgorCitAZXhhbXBsZQorcHJpbnQgeAorc2V0IHg9NQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAordGhlbiB0aGUgdmFsdWUgcmVjb3JkZWQgaW4gdGhlIHZhbHVlIGhpc3RvcnkgYnkgdGhlIEBjb2Rle3ByaW50fSBjb21tYW5kCityZW1haW5zIDQgZXZlbiB0aG91Z2ggdGhlIHZhbHVlIG9mIEBjb2Rle3h9IGhhcyBjaGFuZ2VkLgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggc2hvdyB2YWx1ZXMKK0BpdGVtIHNob3cgdmFsdWVzCitQcmludCB0aGUgbGFzdCB0ZW4gdmFsdWVzIGluIHRoZSB2YWx1ZSBoaXN0b3J5LCB3aXRoIHRoZWlyIGl0ZW0gbnVtYmVycy4KK1RoaXMgaXMgbGlrZSBAc2FtcHtwQCAkJDl9IHJlcGVhdGVkIHRlbiB0aW1lcywgZXhjZXB0IHRoYXQgQGNvZGV7c2hvdwordmFsdWVzfSBkb2VzIG5vdCBjaGFuZ2UgdGhlIGhpc3RvcnkuCisKK0BpdGVtIHNob3cgdmFsdWVzIEB2YXJ7bn0KK1ByaW50IHRlbiBoaXN0b3J5IHZhbHVlcyBjZW50ZXJlZCBvbiBoaXN0b3J5IGl0ZW0gbnVtYmVyIEB2YXJ7bn0uCisKK0BpdGVtIHNob3cgdmFsdWVzICsKK1ByaW50IHRlbiBoaXN0b3J5IHZhbHVlcyBqdXN0IGFmdGVyIHRoZSB2YWx1ZXMgbGFzdCBwcmludGVkLiAgSWYgbm8gbW9yZQordmFsdWVzIGFyZSBhdmFpbGFibGUsIEBjb2Rle3Nob3cgdmFsdWVzICt9IHByb2R1Y2VzIG5vIGRpc3BsYXkuCitAZW5kIHRhYmxlCisKK1ByZXNzaW5nIEBrZXl7UkVUfSB0byByZXBlYXQgQGNvZGV7c2hvdyB2YWx1ZXMgQHZhcntufX0gaGFzIGV4YWN0bHkgdGhlCitzYW1lIGVmZmVjdCBhcyBAc2FtcHtzaG93IHZhbHVlcyArfS4KKworQG5vZGUgQ29udmVuaWVuY2UgVmFycywgUmVnaXN0ZXJzLCBWYWx1ZSBIaXN0b3J5LCBEYXRhCitAc2VjdGlvbiBDb252ZW5pZW5jZSB2YXJpYWJsZXMKKworQGNpbmRleCBjb252ZW5pZW5jZSB2YXJpYWJsZXMKK0B2YWx1ZXtHREJOfSBwcm92aWRlcyBAZGZue2NvbnZlbmllbmNlIHZhcmlhYmxlc30gdGhhdCB5b3UgY2FuIHVzZSB3aXRoaW4KK0B2YWx1ZXtHREJOfSB0byBob2xkIG9uIHRvIGEgdmFsdWUgYW5kIHJlZmVyIHRvIGl0IGxhdGVyLiAgVGhlc2UgdmFyaWFibGVzCitleGlzdCBlbnRpcmVseSB3aXRoaW4gQHZhbHVle0dEQk59OyB0aGV5IGFyZSBub3QgcGFydCBvZiB5b3VyIHByb2dyYW0sIGFuZAorc2V0dGluZyBhIGNvbnZlbmllbmNlIHZhcmlhYmxlIGhhcyBubyBkaXJlY3QgZWZmZWN0IG9uIGZ1cnRoZXIgZXhlY3V0aW9uCitvZiB5b3VyIHByb2dyYW0uICBUaGF0IGlzIHdoeSB5b3UgY2FuIHVzZSB0aGVtIGZyZWVseS4KKworQ29udmVuaWVuY2UgdmFyaWFibGVzIGFyZSBwcmVmaXhlZCB3aXRoIEBzYW1weyR9LiAgQW55IG5hbWUgcHJlY2VkZWQgYnkKK0BzYW1weyR9IGNhbiBiZSB1c2VkIGZvciBhIGNvbnZlbmllbmNlIHZhcmlhYmxlLCB1bmxlc3MgaXQgaXMgb25lIG9mCit0aGUgcHJlZGVmaW5lZCBtYWNoaW5lLXNwZWNpZmljIHJlZ2lzdGVyIG5hbWVzIChAcHhyZWZ7UmVnaXN0ZXJzfSkuCisoVmFsdWUgaGlzdG9yeSByZWZlcmVuY2VzLCBpbiBjb250cmFzdCwgYXJlIEBlbXBoe251bWJlcnN9IHByZWNlZGVkCitieSBAc2FtcHskfS4gIEB4cmVme1ZhbHVlIEhpc3RvcnksICxWYWx1ZSBoaXN0b3J5fS4pCisKK1lvdSBjYW4gc2F2ZSBhIHZhbHVlIGluIGEgY29udmVuaWVuY2UgdmFyaWFibGUgd2l0aCBhbiBhc3NpZ25tZW50CitleHByZXNzaW9uLCBqdXN0IGFzIHlvdSB3b3VsZCBzZXQgYSB2YXJpYWJsZSBpbiB5b3VyIHByb2dyYW0uCitGb3IgZXhhbXBsZToKKworQGV4YW1wbGUKK3NldCAkZm9vID0gKm9iamVjdF9wdHIKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK3dvdWxkIHNhdmUgaW4gQGNvZGV7JGZvb30gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkKK0Bjb2Rle29iamVjdF9wdHJ9LgorCitVc2luZyBhIGNvbnZlbmllbmNlIHZhcmlhYmxlIGZvciB0aGUgZmlyc3QgdGltZSBjcmVhdGVzIGl0LCBidXQgaXRzCit2YWx1ZSBpcyBAY29kZXt2b2lkfSB1bnRpbCB5b3UgYXNzaWduIGEgbmV3IHZhbHVlLiAgWW91IGNhbiBhbHRlciB0aGUKK3ZhbHVlIHdpdGggYW5vdGhlciBhc3NpZ25tZW50IGF0IGFueSB0aW1lLgorCitDb252ZW5pZW5jZSB2YXJpYWJsZXMgaGF2ZSBubyBmaXhlZCB0eXBlcy4gIFlvdSBjYW4gYXNzaWduIGEgY29udmVuaWVuY2UKK3ZhcmlhYmxlIGFueSB0eXBlIG9mIHZhbHVlLCBpbmNsdWRpbmcgc3RydWN0dXJlcyBhbmQgYXJyYXlzLCBldmVuIGlmCit0aGF0IHZhcmlhYmxlIGFscmVhZHkgaGFzIGEgdmFsdWUgb2YgYSBkaWZmZXJlbnQgdHlwZS4gIFRoZSBjb252ZW5pZW5jZQordmFyaWFibGUsIHdoZW4gdXNlZCBhcyBhbiBleHByZXNzaW9uLCBoYXMgdGhlIHR5cGUgb2YgaXRzIGN1cnJlbnQgdmFsdWUuCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBzaG93IGNvbnZlbmllbmNlCitAaXRlbSBzaG93IGNvbnZlbmllbmNlCitQcmludCBhIGxpc3Qgb2YgY29udmVuaWVuY2UgdmFyaWFibGVzIHVzZWQgc28gZmFyLCBhbmQgdGhlaXIgdmFsdWVzLgorQWJicmV2aWF0ZWQgQGNvZGV7c2hvdyBjb259LgorQGVuZCB0YWJsZQorCitPbmUgb2YgdGhlIHdheXMgdG8gdXNlIGEgY29udmVuaWVuY2UgdmFyaWFibGUgaXMgYXMgYSBjb3VudGVyIHRvIGJlCitpbmNyZW1lbnRlZCBvciBhIHBvaW50ZXIgdG8gYmUgYWR2YW5jZWQuICBGb3IgZXhhbXBsZSwgdG8gcHJpbnQKK2EgZmllbGQgZnJvbSBzdWNjZXNzaXZlIGVsZW1lbnRzIG9mIGFuIGFycmF5IG9mIHN0cnVjdHVyZXM6CisKK0BleGFtcGxlCitzZXQgJGkgPSAwCitwcmludCBiYXJbJGkrK10tPmNvbnRlbnRzCitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50IFJlcGVhdCB0aGF0IGNvbW1hbmQgYnkgdHlwaW5nIEBrZXl7UkVUfS4KKworU29tZSBjb252ZW5pZW5jZSB2YXJpYWJsZXMgYXJlIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSBAdmFsdWV7R0RCTn0gYW5kIGdpdmVuCit2YWx1ZXMgbGlrZWx5IHRvIGJlIHVzZWZ1bC4KKworQHRhYmxlIEBjb2RlCitAa2luZGV4ICRfCitAaXRlbSAkXworVGhlIHZhcmlhYmxlIEBjb2RleyRffSBpcyBhdXRvbWF0aWNhbGx5IHNldCBieSB0aGUgQGNvZGV7eH0gY29tbWFuZCB0bwordGhlIGxhc3QgYWRkcmVzcyBleGFtaW5lZCAoQHB4cmVme01lbW9yeSwgLEV4YW1pbmluZyBtZW1vcnl9KS4gIE90aGVyCitjb21tYW5kcyB3aGljaCBwcm92aWRlIGEgZGVmYXVsdCBhZGRyZXNzIGZvciBAY29kZXt4fSB0byBleGFtaW5lIGFsc28KK3NldCBAY29kZXskX30gdG8gdGhhdCBhZGRyZXNzOyB0aGVzZSBjb21tYW5kcyBpbmNsdWRlIEBjb2Rle2luZm8gbGluZX0KK2FuZCBAY29kZXtpbmZvIGJyZWFrcG9pbnR9LiAgVGhlIHR5cGUgb2YgQGNvZGV7JF99IGlzIEBjb2Rle3ZvaWQgKn0KK2V4Y2VwdCB3aGVuIHNldCBieSB0aGUgQGNvZGV7eH0gY29tbWFuZCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhIHBvaW50ZXIKK3RvIHRoZSB0eXBlIG9mIEBjb2RleyRfX30uCisKK0BraW5kZXggJF9fCitAaXRlbSAkX18KK1RoZSB2YXJpYWJsZSBAY29kZXskX199IGlzIGF1dG9tYXRpY2FsbHkgc2V0IGJ5IHRoZSBAY29kZXt4fSBjb21tYW5kCit0byB0aGUgdmFsdWUgZm91bmQgaW4gdGhlIGxhc3QgYWRkcmVzcyBleGFtaW5lZC4gIEl0cyB0eXBlIGlzIGNob3NlbgordG8gbWF0Y2ggdGhlIGZvcm1hdCBpbiB3aGljaCB0aGUgZGF0YSB3YXMgcHJpbnRlZC4KKworQGl0ZW0gJF9leGl0Y29kZQorQGtpbmRleCAkX2V4aXRjb2RlCitUaGUgdmFyaWFibGUgQGNvZGV7JF9leGl0Y29kZX0gaXMgYXV0b21hdGljYWxseSBzZXQgdG8gdGhlIGV4aXQgY29kZSB3aGVuCit0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZCB0ZXJtaW5hdGVzLgorQGVuZCB0YWJsZQorCitAaWZzZXQgSFBQQQorSWYgeW91IHJlZmVyIHRvIGEgZnVuY3Rpb24gb3IgdmFyaWFibGUgbmFtZSB0aGF0IGJlZ2lucyB3aXRoIGEgZG9sbGFyCitzaWduLCBAdmFsdWV7R0RCTn0gc2VhcmNoZXMgZm9yIGEgdXNlciBvciBzeXN0ZW0gbmFtZSBmaXJzdCwgYmVmb3JlIGl0CitzZWFyY2hlcyBmb3IgYSBjb252ZW5pZW5jZSB2YXJpYWJsZS4KK0BlbmQgaWZzZXQKKworQG5vZGUgUmVnaXN0ZXJzLCBGbG9hdGluZyBQb2ludCBIYXJkd2FyZSwgQ29udmVuaWVuY2UgVmFycywgRGF0YQorQHNlY3Rpb24gUmVnaXN0ZXJzCisKK0BjaW5kZXggcmVnaXN0ZXJzCitZb3UgY2FuIHJlZmVyIHRvIG1hY2hpbmUgcmVnaXN0ZXIgY29udGVudHMsIGluIGV4cHJlc3Npb25zLCBhcyB2YXJpYWJsZXMKK3dpdGggbmFtZXMgc3RhcnRpbmcgd2l0aCBAc2FtcHskfS4gIFRoZSBuYW1lcyBvZiByZWdpc3RlcnMgYXJlIGRpZmZlcmVudAorZm9yIGVhY2ggbWFjaGluZTsgdXNlIEBjb2Rle2luZm8gcmVnaXN0ZXJzfSB0byBzZWUgdGhlIG5hbWVzIHVzZWQgb24KK3lvdXIgbWFjaGluZS4KKworQHRhYmxlIEBjb2RlCitAa2luZGV4IGluZm8gcmVnaXN0ZXJzCitAaXRlbSBpbmZvIHJlZ2lzdGVycworUHJpbnQgdGhlIG5hbWVzIGFuZCB2YWx1ZXMgb2YgYWxsIHJlZ2lzdGVycyBleGNlcHQgZmxvYXRpbmctcG9pbnQKK3JlZ2lzdGVycyAoaW4gdGhlIHNlbGVjdGVkIHN0YWNrIGZyYW1lKS4KKworQGtpbmRleCBpbmZvIGFsbC1yZWdpc3RlcnMKK0BjaW5kZXggZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzCitAaXRlbSBpbmZvIGFsbC1yZWdpc3RlcnMKK1ByaW50IHRoZSBuYW1lcyBhbmQgdmFsdWVzIG9mIGFsbCByZWdpc3RlcnMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludAorcmVnaXN0ZXJzLgorCitAaXRlbSBpbmZvIHJlZ2lzdGVycyBAdmFye3JlZ25hbWV9IEBkb3Rze30KK1ByaW50IHRoZSBAZGZue3JlbGF0aXZpemVkfSB2YWx1ZSBvZiBlYWNoIHNwZWNpZmllZCByZWdpc3RlciBAdmFye3JlZ25hbWV9LgorQXMgZGlzY3Vzc2VkIGluIGRldGFpbCBiZWxvdywgcmVnaXN0ZXIgdmFsdWVzIGFyZSBub3JtYWxseSByZWxhdGl2ZSB0byAKK3RoZSBzZWxlY3RlZCBzdGFjayBmcmFtZS4gIEB2YXJ7cmVnbmFtZX0gbWF5IGJlIGFueSByZWdpc3RlciBuYW1lIHZhbGlkIG9uIAordGhlIG1hY2hpbmUgeW91IGFyZSB1c2luZywgd2l0aCBvciB3aXRob3V0IHRoZSBpbml0aWFsIEBzYW1weyR9LgorQGVuZCB0YWJsZQorCitAdmFsdWV7R0RCTn0gaGFzIGZvdXIgYGBzdGFuZGFyZCcnIHJlZ2lzdGVyIG5hbWVzIHRoYXQgYXJlIGF2YWlsYWJsZSAoaW4KK2V4cHJlc3Npb25zKSBvbiBtb3N0IG1hY2hpbmVzLS0td2hlbmV2ZXIgdGhleSBkbyBub3QgY29uZmxpY3Qgd2l0aCBhbgorYXJjaGl0ZWN0dXJlJ3MgY2Fub25pY2FsIG1uZW1vbmljcyBmb3IgcmVnaXN0ZXJzLiAgVGhlIHJlZ2lzdGVyIG5hbWVzCitAY29kZXskcGN9IGFuZCBAY29kZXskc3B9IGFyZSB1c2VkIGZvciB0aGUgcHJvZ3JhbSBjb3VudGVyIHJlZ2lzdGVyIGFuZAordGhlIHN0YWNrIHBvaW50ZXIuICBAY29kZXskZnB9IGlzIHVzZWQgZm9yIGEgcmVnaXN0ZXIgdGhhdCBjb250YWlucyBhCitwb2ludGVyIHRvIHRoZSBjdXJyZW50IHN0YWNrIGZyYW1lLCBhbmQgQGNvZGV7JHBzfSBpcyB1c2VkIGZvciBhCityZWdpc3RlciB0aGF0IGNvbnRhaW5zIHRoZSBwcm9jZXNzb3Igc3RhdHVzLiAgRm9yIGV4YW1wbGUsCit5b3UgY291bGQgcHJpbnQgdGhlIHByb2dyYW0gY291bnRlciBpbiBoZXggd2l0aAorCitAZXhhbXBsZQorcC94ICRwYworQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorb3IgcHJpbnQgdGhlIGluc3RydWN0aW9uIHRvIGJlIGV4ZWN1dGVkIG5leHQgd2l0aAorCitAZXhhbXBsZQoreC9pICRwYworQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorb3IgYWRkIGZvdXIgdG8gdGhlIHN0YWNrIHBvaW50ZXJAZm9vdG5vdGV7VGhpcyBpcyBhIHdheSBvZiByZW1vdmluZworb25lIHdvcmQgZnJvbSB0aGUgc3RhY2ssIG9uIG1hY2hpbmVzIHdoZXJlIHN0YWNrcyBncm93IGRvd253YXJkIGluCittZW1vcnkgKG1vc3QgbWFjaGluZXMsIG5vd2FkYXlzKS4gIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBpbm5lcm1vc3QKK3N0YWNrIGZyYW1lIGlzIHNlbGVjdGVkOyBzZXR0aW5nIEBjb2RleyRzcH0gaXMgbm90IGFsbG93ZWQgd2hlbiBvdGhlcgorc3RhY2sgZnJhbWVzIGFyZSBzZWxlY3RlZC4gIFRvIHBvcCBlbnRpcmUgZnJhbWVzIG9mZiB0aGUgc3RhY2ssCityZWdhcmRsZXNzIG9mIG1hY2hpbmUgYXJjaGl0ZWN0dXJlLCB1c2UgQGNvZGV7cmV0dXJufTsKK0BweHJlZntSZXR1cm5pbmcsICxSZXR1cm5pbmcgZnJvbSBhIGZ1bmN0aW9ufS59IHdpdGgKKworQGV4YW1wbGUKK3NldCAkc3AgKz0gNAorQGVuZCBleGFtcGxlCisKK1doZW5ldmVyIHBvc3NpYmxlLCB0aGVzZSBmb3VyIHN0YW5kYXJkIHJlZ2lzdGVyIG5hbWVzIGFyZSBhdmFpbGFibGUgb24KK3lvdXIgbWFjaGluZSBldmVuIHRob3VnaCB0aGUgbWFjaGluZSBoYXMgZGlmZmVyZW50IGNhbm9uaWNhbCBtbmVtb25pY3MsCitzbyBsb25nIGFzIHRoZXJlIGlzIG5vIGNvbmZsaWN0LiAgVGhlIEBjb2Rle2luZm8gcmVnaXN0ZXJzfSBjb21tYW5kCitzaG93cyB0aGUgY2Fub25pY2FsIG5hbWVzLiAgRm9yIGV4YW1wbGUsIG9uIHRoZSBTUEFSQywgQGNvZGV7aW5mbworcmVnaXN0ZXJzfSBkaXNwbGF5cyB0aGUgcHJvY2Vzc29yIHN0YXR1cyByZWdpc3RlciBhcyBAY29kZXskcHNyfSBidXQgeW91CitjYW4gYWxzbyByZWZlciB0byBpdCBhcyBAY29kZXskcHN9LgorCitAdmFsdWV7R0RCTn0gYWx3YXlzIGNvbnNpZGVycyB0aGUgY29udGVudHMgb2YgYW4gb3JkaW5hcnkgcmVnaXN0ZXIgYXMgYW4KK2ludGVnZXIgd2hlbiB0aGUgcmVnaXN0ZXIgaXMgZXhhbWluZWQgaW4gdGhpcyB3YXkuICBTb21lIG1hY2hpbmVzIGhhdmUKK3NwZWNpYWwgcmVnaXN0ZXJzIHdoaWNoIGNhbiBob2xkIG5vdGhpbmcgYnV0IGZsb2F0aW5nIHBvaW50OyB0aGVzZQorcmVnaXN0ZXJzIGFyZSBjb25zaWRlcmVkIHRvIGhhdmUgZmxvYXRpbmcgcG9pbnQgdmFsdWVzLiAgVGhlcmUgaXMgbm8gd2F5Cit0byByZWZlciB0byB0aGUgY29udGVudHMgb2YgYW4gb3JkaW5hcnkgcmVnaXN0ZXIgYXMgZmxvYXRpbmcgcG9pbnQgdmFsdWUKKyhhbHRob3VnaCB5b3UgY2FuIEBlbXBoe3ByaW50fSBpdCBhcyBhIGZsb2F0aW5nIHBvaW50IHZhbHVlIHdpdGgKK0BzYW1we3ByaW50L2YgJEB2YXJ7cmVnbmFtZX19KS4KKworU29tZSByZWdpc3RlcnMgaGF2ZSBkaXN0aW5jdCBgYHJhdycnIGFuZCBgYHZpcnR1YWwnJyBkYXRhIGZvcm1hdHMuICBUaGlzCittZWFucyB0aGF0IHRoZSBkYXRhIGZvcm1hdCBpbiB3aGljaCB0aGUgcmVnaXN0ZXIgY29udGVudHMgYXJlIHNhdmVkIGJ5Cit0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBub3QgdGhlIHNhbWUgb25lIHRoYXQgeW91ciBwcm9ncmFtIG5vcm1hbGx5CitzZWVzLiAgRm9yIGV4YW1wbGUsIHRoZSByZWdpc3RlcnMgb2YgdGhlIDY4ODgxIGZsb2F0aW5nIHBvaW50Citjb3Byb2Nlc3NvciBhcmUgYWx3YXlzIHNhdmVkIGluIGBgZXh0ZW5kZWQnJyAocmF3KSBmb3JtYXQsIGJ1dCBhbGwgQworcHJvZ3JhbXMgZXhwZWN0IHRvIHdvcmsgd2l0aCBgYGRvdWJsZScnICh2aXJ0dWFsKSBmb3JtYXQuICBJbiBzdWNoCitjYXNlcywgQHZhbHVle0dEQk59IG5vcm1hbGx5IHdvcmtzIHdpdGggdGhlIHZpcnR1YWwgZm9ybWF0IG9ubHkgKHRoZSBmb3JtYXQgCit0aGF0IG1ha2VzIHNlbnNlIGZvciB5b3VyIHByb2dyYW0pLCBidXQgdGhlIEBjb2Rle2luZm8gcmVnaXN0ZXJzfSBjb21tYW5kCitwcmludHMgdGhlIGRhdGEgaW4gYm90aCBmb3JtYXRzLgorCitOb3JtYWxseSwgcmVnaXN0ZXIgdmFsdWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgc2VsZWN0ZWQgc3RhY2sgZnJhbWUKKyhAcHhyZWZ7U2VsZWN0aW9uLCAsU2VsZWN0aW5nIGEgZnJhbWV9KS4gIFRoaXMgbWVhbnMgdGhhdCB5b3UgZ2V0IHRoZQordmFsdWUgdGhhdCB0aGUgcmVnaXN0ZXIgd291bGQgY29udGFpbiBpZiBhbGwgc3RhY2sgZnJhbWVzIGZhcnRoZXIgaW4KK3dlcmUgZXhpdGVkIGFuZCB0aGVpciBzYXZlZCByZWdpc3RlcnMgcmVzdG9yZWQuICBJbiBvcmRlciB0byBzZWUgdGhlCit0cnVlIGNvbnRlbnRzIG9mIGhhcmR3YXJlIHJlZ2lzdGVycywgeW91IG11c3Qgc2VsZWN0IHRoZSBpbm5lcm1vc3QKK2ZyYW1lICh3aXRoIEBzYW1we2ZyYW1lIDB9KS4KKworSG93ZXZlciwgQHZhbHVle0dEQk59IG11c3QgZGVkdWNlIHdoZXJlIHJlZ2lzdGVycyBhcmUgc2F2ZWQsIGZyb20gdGhlIG1hY2hpbmUKK2NvZGUgZ2VuZXJhdGVkIGJ5IHlvdXIgY29tcGlsZXIuICBJZiBzb21lIHJlZ2lzdGVycyBhcmUgbm90IHNhdmVkLCBvciBpZgorQHZhbHVle0dEQk59IGlzIHVuYWJsZSB0byBsb2NhdGUgdGhlIHNhdmVkIHJlZ2lzdGVycywgdGhlIHNlbGVjdGVkIHN0YWNrCitmcmFtZSBtYWtlcyBubyBkaWZmZXJlbmNlLgorCitAaWZzZXQgQU1EMjlLCitAdGFibGUgQGNvZGUKK0BraW5kZXggc2V0IHJzdGFja19oaWdoX2FkZHJlc3MKK0BjaW5kZXggQU1EIDI5SyByZWdpc3RlciBzdGFjaworQGNpbmRleCByZWdpc3RlciBzdGFjaywgQU1EMjlLCitAaXRlbSBzZXQgcnN0YWNrX2hpZ2hfYWRkcmVzcyBAdmFye2FkZHJlc3N9CitPbiBBTUQgMjkwMDAgZmFtaWx5IHByb2Nlc3NvcnMsIHJlZ2lzdGVycyBhcmUgc2F2ZWQgaW4gYSBzZXBhcmF0ZQorYGByZWdpc3RlciBzdGFjaycnLiAgVGhlcmUgaXMgbm8gd2F5IGZvciBAdmFsdWV7R0RCTn0gdG8gZGV0ZXJtaW5lIHRoZSBleHRlbnQKK29mIHRoaXMgc3RhY2suICBOb3JtYWxseSwgQHZhbHVle0dEQk59IGp1c3QgYXNzdW1lcyB0aGF0IHRoZSBzdGFjayBpcyBgYGxhcmdlCitlbm91Z2gnJy4gIFRoaXMgbWF5IHJlc3VsdCBpbiBAdmFsdWV7R0RCTn0gcmVmZXJlbmNpbmcgbWVtb3J5IGxvY2F0aW9ucyB0aGF0CitkbyBub3QgZXhpc3QuICBJZiBuZWNlc3NhcnksIHlvdSBjYW4gZ2V0IGFyb3VuZCB0aGlzIHByb2JsZW0gYnkKK3NwZWNpZnlpbmcgdGhlIGVuZGluZyBhZGRyZXNzIG9mIHRoZSByZWdpc3RlciBzdGFjayB3aXRoIHRoZSBAY29kZXtzZXQKK3JzdGFja19oaWdoX2FkZHJlc3N9IGNvbW1hbmQuICBUaGUgYXJndW1lbnQgc2hvdWxkIGJlIGFuIGFkZHJlc3MsIHdoaWNoCit5b3UgcHJvYmFibHkgd2FudCB0byBwcmVjZWRlIHdpdGggQHNhbXB7MHh9IHRvIHNwZWNpZnkgaW4KK2hleGFkZWNpbWFsLgorCitAa2luZGV4IHNob3cgcnN0YWNrX2hpZ2hfYWRkcmVzcworQGl0ZW0gc2hvdyByc3RhY2tfaGlnaF9hZGRyZXNzCitEaXNwbGF5IHRoZSBjdXJyZW50IGxpbWl0IG9mIHRoZSByZWdpc3RlciBzdGFjaywgb24gQU1EIDI5MDAwIGZhbWlseQorcHJvY2Vzc29ycy4KK0BlbmQgdGFibGUKK0BlbmQgaWZzZXQKKworQGlmY2xlYXIgSEFWRS1GTE9BVAorQG5vZGUgRmxvYXRpbmcgUG9pbnQgSGFyZHdhcmUsICAsIFJlZ2lzdGVycywgRGF0YQorQHNlY3Rpb24gRmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUKK0BjaW5kZXggZmxvYXRpbmcgcG9pbnQKKworRGVwZW5kaW5nIG9uIHRoZSBjb25maWd1cmF0aW9uLCBAdmFsdWV7R0RCTn0gbWF5IGJlIGFibGUgdG8gZ2l2ZQoreW91IG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUuCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBpbmZvIGZsb2F0CitAaXRlbSBpbmZvIGZsb2F0CitEaXNwbGF5IGhhcmR3YXJlLWRlcGVuZGVudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmxvYXRpbmcKK3BvaW50IHVuaXQuICBUaGUgZXhhY3QgY29udGVudHMgYW5kIGxheW91dCB2YXJ5IGRlcGVuZGluZyBvbiB0aGUKK2Zsb2F0aW5nIHBvaW50IGNoaXAuICBDdXJyZW50bHksIEBzYW1we2luZm8gZmxvYXR9IGlzIHN1cHBvcnRlZCBvbgordGhlIEFSTSBhbmQgeDg2IG1hY2hpbmVzLgorQGVuZCB0YWJsZQorQGVuZCBpZmNsZWFyCisKK0BpZmNsZWFyIENPTkxZCitAbm9kZSBMYW5ndWFnZXMsIFN5bWJvbHMsIERhdGEsIFRvcAorQGNoYXB0ZXIgVXNpbmcgQHZhbHVle0dEQk59IHdpdGggRGlmZmVyZW50IExhbmd1YWdlcworQGNpbmRleCBsYW5ndWFnZXMKKworQGlmc2V0IE1PRDIKK0FsdGhvdWdoIHByb2dyYW1taW5nIGxhbmd1YWdlcyBnZW5lcmFsbHkgaGF2ZSBjb21tb24gYXNwZWN0cywgdGhleSBhcmUKK3JhcmVseSBleHByZXNzZWQgaW4gdGhlIHNhbWUgbWFubmVyLiAgRm9yIGluc3RhbmNlLCBpbiBBTlNJIEMsCitkZXJlZmVyZW5jaW5nIGEgcG9pbnRlciBAY29kZXtwfSBpcyBhY2NvbXBsaXNoZWQgYnkgQGNvZGV7KnB9LCBidXQgaW4KK01vZHVsYS0yLCBpdCBpcyBhY2NvbXBsaXNoZWQgYnkgQGNvZGV7cF59LiAgVmFsdWVzIGNhbiBhbHNvIGJlCityZXByZXNlbnRlZCAoYW5kIGRpc3BsYXllZCkgZGlmZmVyZW50bHkuICBIZXggbnVtYmVycyBpbiBDIGFwcGVhciBhcyAKK0BzYW1wezB4MWFlfSwgd2hpbGUgaW4gTW9kdWxhLTIgdGhleSBhcHBlYXIgYXMgQHNhbXB7MUFFSH0uCitAZW5kIGlmc2V0CisKK0BjaW5kZXggd29ya2luZyBsYW5ndWFnZQorTGFuZ3VhZ2Utc3BlY2lmaWMgaW5mb3JtYXRpb24gaXMgYnVpbHQgaW50byBAdmFsdWV7R0RCTn0gZm9yIHNvbWUgbGFuZ3VhZ2VzLAorYWxsb3dpbmcgeW91IHRvIGV4cHJlc3Mgb3BlcmF0aW9ucyBsaWtlIHRoZSBhYm92ZSBpbiB5b3VyIHByb2dyYW0ncworbmF0aXZlIGxhbmd1YWdlLCBhbmQgYWxsb3dpbmcgQHZhbHVle0dEQk59IHRvIG91dHB1dCB2YWx1ZXMgaW4gYSBtYW5uZXIKK2NvbnNpc3RlbnQgd2l0aCB0aGUgc3ludGF4IG9mIHlvdXIgcHJvZ3JhbSdzIG5hdGl2ZSBsYW5ndWFnZS4gIFRoZQorbGFuZ3VhZ2UgeW91IHVzZSB0byBidWlsZCBleHByZXNzaW9ucyBpcyBjYWxsZWQgdGhlIEBkZm57d29ya2luZworbGFuZ3VhZ2V9LgorCitAbWVudQorKiBTZXR0aW5nOjogICAgICAgICAgICAgICAgICAgICBTd2l0Y2hpbmcgYmV0d2VlbiBzb3VyY2UgbGFuZ3VhZ2VzCisqIFNob3c6OiAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXlpbmcgdGhlIGxhbmd1YWdlCitAaWZzZXQgTU9EMgorKiBDaGVja3M6OiAgICAgICAgICAgICAgICAgICAgICBUeXBlIGFuZCByYW5nZSBjaGVja3MKK0BlbmQgaWZzZXQKKworKiBTdXBwb3J0OjogICAgICAgICAgICAgICAgICAgICBTdXBwb3J0ZWQgbGFuZ3VhZ2VzCitAZW5kIG1lbnUKKworQG5vZGUgU2V0dGluZywgU2hvdywgTGFuZ3VhZ2VzLCBMYW5ndWFnZXMKK0BzZWN0aW9uIFN3aXRjaGluZyBiZXR3ZWVuIHNvdXJjZSBsYW5ndWFnZXMKKworVGhlcmUgYXJlIHR3byB3YXlzIHRvIGNvbnRyb2wgdGhlIHdvcmtpbmcgbGFuZ3VhZ2UtLS1laXRoZXIgaGF2ZSBAdmFsdWV7R0RCTn0KK3NldCBpdCBhdXRvbWF0aWNhbGx5LCBvciBzZWxlY3QgaXQgbWFudWFsbHkgeW91cnNlbGYuICBZb3UgY2FuIHVzZSB0aGUKK0Bjb2Rle3NldCBsYW5ndWFnZX0gY29tbWFuZCBmb3IgZWl0aGVyIHB1cnBvc2UuICBPbiBzdGFydHVwLCBAdmFsdWV7R0RCTn0KK2RlZmF1bHRzIHRvIHNldHRpbmcgdGhlIGxhbmd1YWdlIGF1dG9tYXRpY2FsbHkuICBUaGUgd29ya2luZyBsYW5ndWFnZSBpcwordXNlZCB0byBkZXRlcm1pbmUgaG93IGV4cHJlc3Npb25zIHlvdSB0eXBlIGFyZSBpbnRlcnByZXRlZCwgaG93IHZhbHVlcworYXJlIHByaW50ZWQsIGV0Yy4KKworSW4gYWRkaXRpb24gdG8gdGhlIHdvcmtpbmcgbGFuZ3VhZ2UsIGV2ZXJ5IHNvdXJjZSBmaWxlIHRoYXQKK0B2YWx1ZXtHREJOfSBrbm93cyBhYm91dCBoYXMgaXRzIG93biB3b3JraW5nIGxhbmd1YWdlLiAgRm9yIHNvbWUgb2JqZWN0CitmaWxlIGZvcm1hdHMsIHRoZSBjb21waWxlciBtaWdodCBpbmRpY2F0ZSB3aGljaCBsYW5ndWFnZSBhIHBhcnRpY3VsYXIKK3NvdXJjZSBmaWxlIGlzIGluLiAgSG93ZXZlciwgbW9zdCBvZiB0aGUgdGltZSBAdmFsdWV7R0RCTn0gaW5mZXJzIHRoZQorbGFuZ3VhZ2UgZnJvbSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gIFRoZSBsYW5ndWFnZSBvZiBhIHNvdXJjZSBmaWxlCitjb250cm9scyB3aGV0aGVyIEMrKyBuYW1lcyBhcmUgZGVtYW5nbGVkLS0tdGhpcyB3YXkgQGNvZGV7YmFja3RyYWNlfSBjYW4KK3Nob3cgZWFjaCBmcmFtZSBhcHByb3ByaWF0ZWx5IGZvciBpdHMgb3duIGxhbmd1YWdlLiAgVGhlcmUgaXMgbm8gd2F5IHRvCitzZXQgdGhlIGxhbmd1YWdlIG9mIGEgc291cmNlIGZpbGUgZnJvbSB3aXRoaW4gQHZhbHVle0dEQk59LiAgCisKK1RoaXMgaXMgbW9zdCBjb21tb25seSBhIHByb2JsZW0gd2hlbiB5b3UgdXNlIGEgcHJvZ3JhbSwgc3VjaAorYXMgQGNvZGV7Y2Zyb250fSBvciBAY29kZXtmMmN9LCB0aGF0IGdlbmVyYXRlcyBDIGJ1dCBpcyB3cml0dGVuIGluIAorYW5vdGhlciBsYW5ndWFnZS4gIEluIHRoYXQgY2FzZSwgbWFrZSB0aGUKK3Byb2dyYW0gdXNlIEBjb2RleyNsaW5lfSBkaXJlY3RpdmVzIGluIGl0cyBDIG91dHB1dDsgdGhhdCB3YXkKK0B2YWx1ZXtHREJOfSB3aWxsIGtub3cgdGhlIGNvcnJlY3QgbGFuZ3VhZ2Ugb2YgdGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBvcmlnaW5hbAorcHJvZ3JhbSwgYW5kIHdpbGwgZGlzcGxheSB0aGF0IHNvdXJjZSBjb2RlLCBub3QgdGhlIGdlbmVyYXRlZCBDIGNvZGUuCisKK0BtZW51CisqIEZpbGVuYW1lczo6ICAgICAgICAgICAgICAgICAgIEZpbGVuYW1lIGV4dGVuc2lvbnMgYW5kIGxhbmd1YWdlcy4KKyogTWFudWFsbHk6OiAgICAgICAgICAgICAgICAgICAgU2V0dGluZyB0aGUgd29ya2luZyBsYW5ndWFnZSBtYW51YWxseQorKiBBdXRvbWF0aWNhbGx5OjogICAgICAgICAgICAgICBIYXZpbmcgQHZhbHVle0dEQk59IGluZmVyIHRoZSBzb3VyY2UgbGFuZ3VhZ2UKK0BlbmQgbWVudQorCitAbm9kZSBGaWxlbmFtZXMsIE1hbnVhbGx5LCBTZXR0aW5nLCBTZXR0aW5nCitAc3Vic2VjdGlvbiBMaXN0IG9mIGZpbGVuYW1lIGV4dGVuc2lvbnMgYW5kIGxhbmd1YWdlcworCitJZiBhIHNvdXJjZSBmaWxlIG5hbWUgZW5kcyBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zLCB0aGVuCitAdmFsdWV7R0RCTn0gaW5mZXJzIHRoYXQgaXRzIGxhbmd1YWdlIGlzIHRoZSBvbmUgaW5kaWNhdGVkLgorCitAdGFibGUgQGZpbGUKKworQGl0ZW0gLmMKK0Mgc291cmNlIGZpbGUKKworQGl0ZW0gLkMKK0BpdGVteCAuY2MKK0BpdGVteCAuY3AKK0BpdGVteCAuY3BwCitAaXRlbXggLmN4eAorQGl0ZW14IC5jKysKK0MrKyBzb3VyY2UgZmlsZQorCitAaXRlbSAuZgorQGl0ZW14IC5GCitGb3J0cmFuIHNvdXJjZSBmaWxlCisKK0BpZmNsZWFyIEhQUEEKK0BpdGVtIC5jaAorQGl0ZW14IC5jMTg2CitAaXRlbXggLmMyODYKK0NISUxMIHNvdXJjZSBmaWxlLgorQGVuZCBpZmNsZWFyCisKK0BpZnNldCBNT0QyCitAaXRlbSAubW9kCitNb2R1bGEtMiBzb3VyY2UgZmlsZQorQGVuZCBpZnNldAorCitAaXRlbSAucworQGl0ZW14IC5TCitBc3NlbWJsZXIgc291cmNlIGZpbGUuICBUaGlzIGFjdHVhbGx5IGJlaGF2ZXMgYWxtb3N0IGxpa2UgQywgYnV0CitAdmFsdWV7R0RCTn0gZG9lcyBub3Qgc2tpcCBvdmVyIGZ1bmN0aW9uIHByb2xvZ3VlcyB3aGVuIHN0ZXBwaW5nLgorQGVuZCB0YWJsZQorCitJbiBhZGRpdGlvbiwgeW91IG1heSBzZXQgdGhlIGxhbmd1YWdlIGFzc29jaWF0ZWQgd2l0aCBhIGZpbGVuYW1lCitleHRlbnNpb24uICBAeHJlZntTaG93LCAsIERpc3BsYXlpbmcgdGhlIGxhbmd1YWdlfS4KKworQG5vZGUgTWFudWFsbHksIEF1dG9tYXRpY2FsbHksIEZpbGVuYW1lcywgU2V0dGluZworQHN1YnNlY3Rpb24gU2V0dGluZyB0aGUgd29ya2luZyBsYW5ndWFnZQorCitJZiB5b3UgYWxsb3cgQHZhbHVle0dEQk59IHRvIHNldCB0aGUgbGFuZ3VhZ2UgYXV0b21hdGljYWxseSwKK2V4cHJlc3Npb25zIGFyZSBpbnRlcnByZXRlZCB0aGUgc2FtZSB3YXkgaW4geW91ciBkZWJ1Z2dpbmcgc2Vzc2lvbiBhbmQKK3lvdXIgcHJvZ3JhbS4KKworQGtpbmRleCBzZXQgbGFuZ3VhZ2UKK0lmIHlvdSB3aXNoLCB5b3UgbWF5IHNldCB0aGUgbGFuZ3VhZ2UgbWFudWFsbHkuICBUbyBkbyB0aGlzLCBpc3N1ZSB0aGUKK2NvbW1hbmQgQHNhbXB7c2V0IGxhbmd1YWdlIEB2YXJ7bGFuZ319LCB3aGVyZSBAdmFye2xhbmd9IGlzIHRoZSBuYW1lIG9mCithIGxhbmd1YWdlLCBzdWNoIGFzIAorQGlmY2xlYXIgTU9EMgorQGNvZGV7Y30uCitAZW5kIGlmY2xlYXIKK0BpZnNldCBNT0QyCitAY29kZXtjfSBvciBAY29kZXttb2R1bGEtMn0uCitAZW5kIGlmc2V0CitGb3IgYSBsaXN0IG9mIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLCB0eXBlIEBzYW1we3NldCBsYW5ndWFnZX0uCisKK0BpZmNsZWFyIE1PRDIKK1NldHRpbmcgdGhlIGxhbmd1YWdlIG1hbnVhbGx5IHByZXZlbnRzIEB2YWx1ZXtHREJOfSBmcm9tIHVwZGF0aW5nIHRoZQord29ya2luZyBsYW5ndWFnZSBhdXRvbWF0aWNhbGx5LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB1c2VkIHRoZSBAY29kZXtjfQorc2V0dGluZyB0byBkZWJ1ZyBhIEMrKyBwcm9ncmFtLCBuYW1lcyBtaWdodCBub3QgYmUgZGVtYW5nbGVkIHByb3Blcmx5LAorb3ZlcmxvYWQgcmVzb2x1dGlvbiB3b3VsZCBub3Qgd29yaywgdXNlci1kZWZpbmVkIG9wZXJhdG9ycyBtaWdodCBub3QgYmUKK2ludGVycHJldGVkIGNvcnJlY3RseSwgYW5kIHNvIG9uLgorQGVuZCBpZmNsZWFyCitAaWZzZXQgTU9EMgorU2V0dGluZyB0aGUgbGFuZ3VhZ2UgbWFudWFsbHkgcHJldmVudHMgQHZhbHVle0dEQk59IGZyb20gdXBkYXRpbmcgdGhlIHdvcmtpbmcKK2xhbmd1YWdlIGF1dG9tYXRpY2FsbHkuICBUaGlzIGNhbiBsZWFkIHRvIGNvbmZ1c2lvbiBpZiB5b3UgdHJ5Cit0byBkZWJ1ZyBhIHByb2dyYW0gd2hlbiB0aGUgd29ya2luZyBsYW5ndWFnZSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlCitzb3VyY2UgbGFuZ3VhZ2UsIHdoZW4gYW4gZXhwcmVzc2lvbiBpcyBhY2NlcHRhYmxlIHRvIGJvdGgKK2xhbmd1YWdlcy0tLWJ1dCBtZWFucyBkaWZmZXJlbnQgdGhpbmdzLiAgRm9yIGluc3RhbmNlLCBpZiB0aGUgY3VycmVudAorc291cmNlIGZpbGUgd2VyZSB3cml0dGVuIGluIEMsIGFuZCBAdmFsdWV7R0RCTn0gd2FzIHBhcnNpbmcgTW9kdWxhLTIsIGEKK2NvbW1hbmQgc3VjaCBhczoKKworQGV4YW1wbGUKK3ByaW50IGEgPSBiICsgYworQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorbWlnaHQgbm90IGhhdmUgdGhlIGVmZmVjdCB5b3UgaW50ZW5kZWQuICBJbiBDLCB0aGlzIG1lYW5zIHRvIGFkZAorQGNvZGV7Yn0gYW5kIEBjb2Rle2N9IGFuZCBwbGFjZSB0aGUgcmVzdWx0IGluIEBjb2Rle2F9LiAgVGhlIHJlc3VsdAorcHJpbnRlZCB3b3VsZCBiZSB0aGUgdmFsdWUgb2YgQGNvZGV7YX0uICBJbiBNb2R1bGEtMiwgdGhpcyBtZWFucyB0byBjb21wYXJlCitAY29kZXthfSB0byB0aGUgcmVzdWx0IG9mIEBjb2Rle2IrY30sIHlpZWxkaW5nIGEgQGNvZGV7Qk9PTEVBTn0gdmFsdWUuCitAZW5kIGlmc2V0CisKK0Bub2RlIEF1dG9tYXRpY2FsbHksICAsIE1hbnVhbGx5LCBTZXR0aW5nCitAc3Vic2VjdGlvbiBIYXZpbmcgQHZhbHVle0dEQk59IGluZmVyIHRoZSBzb3VyY2UgbGFuZ3VhZ2UKKworVG8gaGF2ZSBAdmFsdWV7R0RCTn0gc2V0IHRoZSB3b3JraW5nIGxhbmd1YWdlIGF1dG9tYXRpY2FsbHksIHVzZQorQHNhbXB7c2V0IGxhbmd1YWdlIGxvY2FsfSBvciBAc2FtcHtzZXQgbGFuZ3VhZ2UgYXV0b30uICBAdmFsdWV7R0RCTn0KK3RoZW4gaW5mZXJzIHRoZSB3b3JraW5nIGxhbmd1YWdlLiAgVGhhdCBpcywgd2hlbiB5b3VyIHByb2dyYW0gc3RvcHMgaW4gYQorZnJhbWUgKHVzdWFsbHkgYnkgZW5jb3VudGVyaW5nIGEgYnJlYWtwb2ludCksIEB2YWx1ZXtHREJOfSBzZXRzIHRoZQord29ya2luZyBsYW5ndWFnZSB0byB0aGUgbGFuZ3VhZ2UgcmVjb3JkZWQgZm9yIHRoZSBmdW5jdGlvbiBpbiB0aGF0CitmcmFtZS4gIElmIHRoZSBsYW5ndWFnZSBmb3IgYSBmcmFtZSBpcyB1bmtub3duICh0aGF0IGlzLCBpZiB0aGUgZnVuY3Rpb24KK29yIGJsb2NrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZyYW1lIHdhcyBkZWZpbmVkIGluIGEgc291cmNlIGZpbGUgdGhhdAorZG9lcyBub3QgaGF2ZSBhIHJlY29nbml6ZWQgZXh0ZW5zaW9uKSwgdGhlIGN1cnJlbnQgd29ya2luZyBsYW5ndWFnZSBpcworbm90IGNoYW5nZWQsIGFuZCBAdmFsdWV7R0RCTn0gaXNzdWVzIGEgd2FybmluZy4KKworVGhpcyBtYXkgbm90IHNlZW0gbmVjZXNzYXJ5IGZvciBtb3N0IHByb2dyYW1zLCB3aGljaCBhcmUgd3JpdHRlbgorZW50aXJlbHkgaW4gb25lIHNvdXJjZSBsYW5ndWFnZS4gIEhvd2V2ZXIsIHByb2dyYW0gbW9kdWxlcyBhbmQgbGlicmFyaWVzCit3cml0dGVuIGluIG9uZSBzb3VyY2UgbGFuZ3VhZ2UgY2FuIGJlIHVzZWQgYnkgYSBtYWluIHByb2dyYW0gd3JpdHRlbiBpbgorYSBkaWZmZXJlbnQgc291cmNlIGxhbmd1YWdlLiAgVXNpbmcgQHNhbXB7c2V0IGxhbmd1YWdlIGF1dG99IGluIHRoaXMKK2Nhc2UgZnJlZXMgeW91IGZyb20gaGF2aW5nIHRvIHNldCB0aGUgd29ya2luZyBsYW5ndWFnZSBtYW51YWxseS4KKworQGlmc2V0IE1PRDIKK0Bub2RlIFNob3csIENoZWNrcywgU2V0dGluZywgTGFuZ3VhZ2VzCitAc2VjdGlvbiBEaXNwbGF5aW5nIHRoZSBsYW5ndWFnZQorQGVuZCBpZnNldAorQGlmY2xlYXIgTU9EMgorQG5vZGUgU2hvdywgU3VwcG9ydCwgU2V0dGluZywgTGFuZ3VhZ2VzCitAc2VjdGlvbiBEaXNwbGF5aW5nIHRoZSBsYW5ndWFnZQorQGVuZCBpZmNsZWFyCisKK1RoZSBmb2xsb3dpbmcgY29tbWFuZHMgaGVscCB5b3UgZmluZCBvdXQgd2hpY2ggbGFuZ3VhZ2UgaXMgdGhlCit3b3JraW5nIGxhbmd1YWdlLCBhbmQgYWxzbyB3aGF0IGxhbmd1YWdlIHNvdXJjZSBmaWxlcyB3ZXJlIHdyaXR0ZW4gaW4uCisKK0BraW5kZXggc2hvdyBsYW5ndWFnZQorQGtpbmRleCBpbmZvIGZyYW1lCitAa2luZGV4IGluZm8gc291cmNlCitAdGFibGUgQGNvZGUKK0BpdGVtIHNob3cgbGFuZ3VhZ2UKK0Rpc3BsYXkgdGhlIGN1cnJlbnQgd29ya2luZyBsYW5ndWFnZS4gIFRoaXMgaXMgdGhlCitsYW5ndWFnZSB5b3UgY2FuIHVzZSB3aXRoIGNvbW1hbmRzIHN1Y2ggYXMgQGNvZGV7cHJpbnR9IHRvCitidWlsZCBhbmQgY29tcHV0ZSBleHByZXNzaW9ucyB0aGF0IG1heSBpbnZvbHZlIHZhcmlhYmxlcyBpbiB5b3VyIHByb2dyYW0uCisKK0BpdGVtIGluZm8gZnJhbWUKK0Rpc3BsYXkgdGhlIHNvdXJjZSBsYW5ndWFnZSBmb3IgdGhpcyBmcmFtZS4gIFRoaXMgbGFuZ3VhZ2UgYmVjb21lcyB0aGUgCit3b3JraW5nIGxhbmd1YWdlIGlmIHlvdSB1c2UgYW4gaWRlbnRpZmllciBmcm9tIHRoaXMgZnJhbWUuCitAeHJlZntGcmFtZSBJbmZvLCAsSW5mb3JtYXRpb24gYWJvdXQgYSBmcmFtZX0sIHRvIGlkZW50aWZ5IHRoZSBvdGhlciAKK2luZm9ybWF0aW9uIGxpc3RlZCBoZXJlLgorCitAaXRlbSBpbmZvIHNvdXJjZQorRGlzcGxheSB0aGUgc291cmNlIGxhbmd1YWdlIG9mIHRoaXMgc291cmNlIGZpbGUuCitAeHJlZntTeW1ib2xzLCAsRXhhbWluaW5nIHRoZSBTeW1ib2wgVGFibGV9LCB0byBpZGVudGlmeSB0aGUgb3RoZXIgCitpbmZvcm1hdGlvbiBsaXN0ZWQgaGVyZS4KK0BlbmQgdGFibGUKKworSW4gdW51c3VhbCBjaXJjdW1zdGFuY2VzLCB5b3UgbWF5IGhhdmUgc291cmNlIGZpbGVzIHdpdGggZXh0ZW5zaW9ucworbm90IGluIHRoZSBzdGFuZGFyZCBsaXN0LiAgWW91IGNhbiB0aGVuIHNldCB0aGUgZXh0ZW5zaW9uIGFzc29jaWF0ZWQKK3dpdGggYSBsYW5ndWFnZSBleHBsaWNpdGx5OgorCitAa2luZGV4IHNldCBleHRlbnNpb24tbGFuZ3VhZ2UKK0BraW5kZXggaW5mbyBleHRlbnNpb25zCitAdGFibGUgQGNvZGUKK0BpdGVtIHNldCBleHRlbnNpb24tbGFuZ3VhZ2UgQHZhcnsuZXh0fSBAdmFye2xhbmd1YWdlfQorU2V0IHNvdXJjZSBmaWxlcyB3aXRoIGV4dGVuc2lvbiBAdmFyey5leHR9IHRvIGJlIGFzc3VtZWQgdG8gYmUgaW4KK3RoZSBzb3VyY2UgbGFuZ3VhZ2UgQHZhcntsYW5ndWFnZX0uCisKK0BpdGVtIGluZm8gZXh0ZW5zaW9ucworTGlzdCBhbGwgdGhlIGZpbGVuYW1lIGV4dGVuc2lvbnMgYW5kIHRoZSBhc3NvY2lhdGVkIGxhbmd1YWdlcy4KK0BlbmQgdGFibGUKKworQGlmc2V0IE1PRDIKK0Bub2RlIENoZWNrcywgU3VwcG9ydCwgU2hvdywgTGFuZ3VhZ2VzCitAc2VjdGlvbiBUeXBlIGFuZCByYW5nZSBjaGVja2luZworCitAcXVvdGF0aW9uCitAZW1waHtXYXJuaW5nOn0gSW4gdGhpcyByZWxlYXNlLCB0aGUgQHZhbHVle0dEQk59IGNvbW1hbmRzIGZvciB0eXBlIGFuZCByYW5nZQorY2hlY2tpbmcgYXJlIGluY2x1ZGVkLCBidXQgdGhleSBkbyBub3QgeWV0IGhhdmUgYW55IGVmZmVjdC4gIFRoaXMKK3NlY3Rpb24gZG9jdW1lbnRzIHRoZSBpbnRlbmRlZCBmYWNpbGl0aWVzLgorQGVuZCBxdW90YXRpb24KK0BjIEZJWE1FIHJlbW92ZSB3YXJuaW5nIHdoZW4gdHlwZS9yYW5nZSBjb2RlIGFkZGVkCisKK1NvbWUgbGFuZ3VhZ2VzIGFyZSBkZXNpZ25lZCB0byBndWFyZCB5b3UgYWdhaW5zdCBtYWtpbmcgc2VlbWluZ2x5IGNvbW1vbgorZXJyb3JzIHRocm91Z2ggYSBzZXJpZXMgb2YgY29tcGlsZS0gYW5kIHJ1bi10aW1lIGNoZWNrcy4gIFRoZXNlIGluY2x1ZGUKK2NoZWNraW5nIHRoZSB0eXBlIG9mIGFyZ3VtZW50cyB0byBmdW5jdGlvbnMgYW5kIG9wZXJhdG9ycywgYW5kIG1ha2luZworc3VyZSBtYXRoZW1hdGljYWwgb3ZlcmZsb3dzIGFyZSBjYXVnaHQgYXQgcnVuIHRpbWUuICBDaGVja3Mgc3VjaCBhcwordGhlc2UgaGVscCB0byBlbnN1cmUgYSBwcm9ncmFtJ3MgY29ycmVjdG5lc3Mgb25jZSBpdCBoYXMgYmVlbiBjb21waWxlZAorYnkgZWxpbWluYXRpbmcgdHlwZSBtaXNtYXRjaGVzLCBhbmQgcHJvdmlkaW5nIGFjdGl2ZSBjaGVja3MgZm9yIHJhbmdlCitlcnJvcnMgd2hlbiB5b3VyIHByb2dyYW0gaXMgcnVubmluZy4KKworQHZhbHVle0dEQk59IGNhbiBjaGVjayBmb3IgY29uZGl0aW9ucyBsaWtlIHRoZSBhYm92ZSBpZiB5b3Ugd2lzaC4KK0FsdGhvdWdoIEB2YWx1ZXtHREJOfSBkb2VzIG5vdCBjaGVjayB0aGUgc3RhdGVtZW50cyBpbiB5b3VyIHByb2dyYW0sIGl0CitjYW4gY2hlY2sgZXhwcmVzc2lvbnMgZW50ZXJlZCBkaXJlY3RseSBpbnRvIEB2YWx1ZXtHREJOfSBmb3IgZXZhbHVhdGlvbiB2aWEKK3RoZSBAY29kZXtwcmludH0gY29tbWFuZCwgZm9yIGV4YW1wbGUuICBBcyB3aXRoIHRoZSB3b3JraW5nIGxhbmd1YWdlLAorQHZhbHVle0dEQk59IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCB0byBjaGVjayBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uCit5b3VyIHByb2dyYW0ncyBzb3VyY2UgbGFuZ3VhZ2UuICBAeHJlZntTdXBwb3J0LCAsU3VwcG9ydGVkIGxhbmd1YWdlc30sCitmb3IgdGhlIGRlZmF1bHQgc2V0dGluZ3Mgb2Ygc3VwcG9ydGVkIGxhbmd1YWdlcy4KKworQG1lbnUKKyogVHlwZSBDaGVja2luZzo6ICAgICAgICAgICAgICAgQW4gb3ZlcnZpZXcgb2YgdHlwZSBjaGVja2luZworKiBSYW5nZSBDaGVja2luZzo6ICAgICAgICAgICAgICBBbiBvdmVydmlldyBvZiByYW5nZSBjaGVja2luZworQGVuZCBtZW51CisKK0BjaW5kZXggdHlwZSBjaGVja2luZworQGNpbmRleCBjaGVja3MsIHR5cGUKK0Bub2RlIFR5cGUgQ2hlY2tpbmcsIFJhbmdlIENoZWNraW5nLCBDaGVja3MsIENoZWNrcworQHN1YnNlY3Rpb24gQW4gb3ZlcnZpZXcgb2YgdHlwZSBjaGVja2luZworCitTb21lIGxhbmd1YWdlcywgc3VjaCBhcyBNb2R1bGEtMiwgYXJlIHN0cm9uZ2x5IHR5cGVkLCBtZWFuaW5nIHRoYXQgdGhlCithcmd1bWVudHMgdG8gb3BlcmF0b3JzIGFuZCBmdW5jdGlvbnMgaGF2ZSB0byBiZSBvZiB0aGUgY29ycmVjdCB0eXBlLAorb3RoZXJ3aXNlIGFuIGVycm9yIG9jY3Vycy4gIFRoZXNlIGNoZWNrcyBwcmV2ZW50IHR5cGUgbWlzbWF0Y2gKK2Vycm9ycyBmcm9tIGV2ZXIgY2F1c2luZyBhbnkgcnVuLXRpbWUgcHJvYmxlbXMuICBGb3IgZXhhbXBsZSwKKworQHNtYWxsZXhhbXBsZQorMSArIDIgQHJlc3VsdHt9IDMKK0BleGRlbnQgYnV0CitAZXJyb3J7fSAxICsgMi4zCitAZW5kIHNtYWxsZXhhbXBsZQorCitUaGUgc2Vjb25kIGV4YW1wbGUgZmFpbHMgYmVjYXVzZSB0aGUgQGNvZGV7Q0FSRElOQUx9IDEgaXMgbm90Cit0eXBlLWNvbXBhdGlibGUgd2l0aCB0aGUgQGNvZGV7UkVBTH0gMi4zLgorCitGb3IgdGhlIGV4cHJlc3Npb25zIHlvdSB1c2UgaW4gQHZhbHVle0dEQk59IGNvbW1hbmRzLCB5b3UgY2FuIHRlbGwgdGhlIAorQHZhbHVle0dEQk59IHR5cGUgY2hlY2tlciB0byBza2lwIGNoZWNraW5nOyAKK3RvIHRyZWF0IGFueSBtaXNtYXRjaGVzIGFzIGVycm9ycyBhbmQgYWJhbmRvbiB0aGUgZXhwcmVzc2lvbjsgCitvciB0byBvbmx5IGlzc3VlIHdhcm5pbmdzIHdoZW4gdHlwZSBtaXNtYXRjaGVzIG9jY3VyLCAKK2J1dCBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBhbnl3YXkuICBXaGVuIHlvdSBjaG9vc2UgdGhlIGxhc3Qgb2YKK3RoZXNlLCBAdmFsdWV7R0RCTn0gZXZhbHVhdGVzIGV4cHJlc3Npb25zIGxpa2UgdGhlIHNlY29uZCBleGFtcGxlIGFib3ZlLCBidXQKK2Fsc28gaXNzdWVzIGEgd2FybmluZy4KKworRXZlbiBpZiB5b3UgdHVybiB0eXBlIGNoZWNraW5nIG9mZiwgdGhlcmUgbWF5IGJlIG90aGVyIHJlYXNvbnMgCityZWxhdGVkIHRvIHR5cGUgdGhhdCBwcmV2ZW50IEB2YWx1ZXtHREJOfSBmcm9tIGV2YWx1YXRpbmcgYW4gZXhwcmVzc2lvbi4gIAorRm9yIGluc3RhbmNlLCBAdmFsdWV7R0RCTn0gZG9lcyBub3Qga25vdyBob3cgdG8gYWRkIGFuIEBjb2Rle2ludH0gYW5kIAorYSBAY29kZXtzdHJ1Y3QgZm9vfS4gIFRoZXNlIHBhcnRpY3VsYXIgdHlwZSBlcnJvcnMgaGF2ZSBub3RoaW5nIHRvIGRvIAord2l0aCB0aGUgbGFuZ3VhZ2UgaW4gdXNlLCBhbmQgdXN1YWxseSBhcmlzZSBmcm9tIGV4cHJlc3Npb25zLCBzdWNoIGFzIAordGhlIG9uZSBkZXNjcmliZWQgYWJvdmUsIHdoaWNoIG1ha2UgbGl0dGxlIHNlbnNlIHRvIGV2YWx1YXRlIGFueXdheS4KKworRWFjaCBsYW5ndWFnZSBkZWZpbmVzIHRvIHdoYXQgZGVncmVlIGl0IGlzIHN0cmljdCBhYm91dCB0eXBlLiAgRm9yCitpbnN0YW5jZSwgYm90aCBNb2R1bGEtMiBhbmQgQyByZXF1aXJlIHRoZSBhcmd1bWVudHMgdG8gYXJpdGhtZXRpY2FsCitvcGVyYXRvcnMgdG8gYmUgbnVtYmVycy4gIEluIEMsIGVudW1lcmF0ZWQgdHlwZXMgYW5kIHBvaW50ZXJzIGNhbiBiZQorcmVwcmVzZW50ZWQgYXMgbnVtYmVycywgc28gdGhhdCB0aGV5IGFyZSB2YWxpZCBhcmd1bWVudHMgdG8gbWF0aGVtYXRpY2FsCitvcGVyYXRvcnMuICBAeHJlZntTdXBwb3J0LCAsU3VwcG9ydGVkIGxhbmd1YWdlc30sIGZvciBmdXJ0aGVyCitkZXRhaWxzIG9uIHNwZWNpZmljIGxhbmd1YWdlcy4KKworQHZhbHVle0dEQk59IHByb3ZpZGVzIHNvbWUgYWRkaXRpb25hbCBjb21tYW5kcyBmb3IgY29udHJvbGxpbmcgdGhlIHR5cGUgY2hlY2tlcjoKKworQGtpbmRleCBzZXQgY2hlY2sKK0BraW5kZXggc2V0IGNoZWNrIHR5cGUKK0BraW5kZXggc2hvdyBjaGVjayB0eXBlCitAdGFibGUgQGNvZGUKK0BpdGVtIHNldCBjaGVjayB0eXBlIGF1dG8KK1NldCB0eXBlIGNoZWNraW5nIG9uIG9yIG9mZiBiYXNlZCBvbiB0aGUgY3VycmVudCB3b3JraW5nIGxhbmd1YWdlLgorQHhyZWZ7U3VwcG9ydCwgLFN1cHBvcnRlZCBsYW5ndWFnZXN9LCBmb3IgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yCitlYWNoIGxhbmd1YWdlLgorCitAaXRlbSBzZXQgY2hlY2sgdHlwZSBvbgorQGl0ZW14IHNldCBjaGVjayB0eXBlIG9mZgorU2V0IHR5cGUgY2hlY2tpbmcgb24gb3Igb2ZmLCBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHRoZQorY3VycmVudCB3b3JraW5nIGxhbmd1YWdlLiAgSXNzdWUgYSB3YXJuaW5nIGlmIHRoZSBzZXR0aW5nIGRvZXMgbm90CittYXRjaCB0aGUgbGFuZ3VhZ2UgZGVmYXVsdC4gIElmIGFueSB0eXBlIG1pc21hdGNoZXMgb2NjdXIgaW4KK2V2YWx1YXRpbmcgYW4gZXhwcmVzc2lvbiB3aGlsZSB0eXBlY2hlY2tpbmcgaXMgb24sIEB2YWx1ZXtHREJOfSBwcmludHMgYQorbWVzc2FnZSBhbmQgYWJvcnRzIGV2YWx1YXRpb24gb2YgdGhlIGV4cHJlc3Npb24uCisKK0BpdGVtIHNldCBjaGVjayB0eXBlIHdhcm4KK0NhdXNlIHRoZSB0eXBlIGNoZWNrZXIgdG8gaXNzdWUgd2FybmluZ3MsIGJ1dCB0byBhbHdheXMgYXR0ZW1wdCB0bworZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24uICBFdmFsdWF0aW5nIHRoZSBleHByZXNzaW9uIG1heSBzdGlsbAorYmUgaW1wb3NzaWJsZSBmb3Igb3RoZXIgcmVhc29ucy4gIEZvciBleGFtcGxlLCBAdmFsdWV7R0RCTn0gY2Fubm90IGFkZAorbnVtYmVycyBhbmQgc3RydWN0dXJlcy4KKworQGl0ZW0gc2hvdyB0eXBlCitTaG93IHRoZSBjdXJyZW50IHNldHRpbmcgb2YgdGhlIHR5cGUgY2hlY2tlciwgYW5kIHdoZXRoZXIgb3Igbm90IEB2YWx1ZXtHREJOfSAKK2lzIHNldHRpbmcgaXQgYXV0b21hdGljYWxseS4KK0BlbmQgdGFibGUKKworQGNpbmRleCByYW5nZSBjaGVja2luZworQGNpbmRleCBjaGVja3MsIHJhbmdlCitAbm9kZSBSYW5nZSBDaGVja2luZywgICwgVHlwZSBDaGVja2luZywgQ2hlY2tzCitAc3Vic2VjdGlvbiBBbiBvdmVydmlldyBvZiByYW5nZSBjaGVja2luZworCitJbiBzb21lIGxhbmd1YWdlcyAoc3VjaCBhcyBNb2R1bGEtMiksIGl0IGlzIGFuIGVycm9yIHRvIGV4Y2VlZCB0aGUKK2JvdW5kcyBvZiBhIHR5cGU7IHRoaXMgaXMgZW5mb3JjZWQgd2l0aCBydW4tdGltZSBjaGVja3MuICBTdWNoIHJhbmdlCitjaGVja2luZyBpcyBtZWFudCB0byBlbnN1cmUgcHJvZ3JhbSBjb3JyZWN0bmVzcyBieSBtYWtpbmcgc3VyZQorY29tcHV0YXRpb25zIGRvIG5vdCBvdmVyZmxvdywgb3IgaW5kaWNlcyBvbiBhbiBhcnJheSBlbGVtZW50IGFjY2VzcyBkbworbm90IGV4Y2VlZCB0aGUgYm91bmRzIG9mIHRoZSBhcnJheS4KKworRm9yIGV4cHJlc3Npb25zIHlvdSB1c2UgaW4gQHZhbHVle0dEQk59IGNvbW1hbmRzLCB5b3UgY2FuIHRlbGwKK0B2YWx1ZXtHREJOfSB0byB0cmVhdCByYW5nZSBlcnJvcnMgaW4gb25lIG9mIHRocmVlIHdheXM6IGlnbm9yZSB0aGVtLAorYWx3YXlzIHRyZWF0IHRoZW0gYXMgZXJyb3JzIGFuZCBhYmFuZG9uIHRoZSBleHByZXNzaW9uLCBvciBpc3N1ZQord2FybmluZ3MgYnV0IGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGFueXdheS4KKworQSByYW5nZSBlcnJvciBjYW4gcmVzdWx0IGZyb20gbnVtZXJpY2FsIG92ZXJmbG93LCBmcm9tIGV4Y2VlZGluZyBhbgorYXJyYXkgaW5kZXggYm91bmQsIG9yIHdoZW4geW91IHR5cGUgYSBjb25zdGFudCB0aGF0IGlzIG5vdCBhIG1lbWJlcgorb2YgYW55IHR5cGUuICBTb21lIGxhbmd1YWdlcywgaG93ZXZlciwgZG8gbm90IHRyZWF0IG92ZXJmbG93cyBhcyBhbgorZXJyb3IuICBJbiBtYW55IGltcGxlbWVudGF0aW9ucyBvZiBDLCBtYXRoZW1hdGljYWwgb3ZlcmZsb3cgY2F1c2VzIHRoZQorcmVzdWx0IHRvIGBgd3JhcCBhcm91bmQnJyB0byBsb3dlciB2YWx1ZXMtLS1mb3IgZXhhbXBsZSwgaWYgQHZhcnttfSBpcwordGhlIGxhcmdlc3QgaW50ZWdlciB2YWx1ZSwgYW5kIEB2YXJ7c30gaXMgdGhlIHNtYWxsZXN0LCB0aGVuCisKK0BleGFtcGxlCitAdmFye219ICsgMSBAcmVzdWx0e30gQHZhcntzfQorQGVuZCBleGFtcGxlCisKK1RoaXMsIHRvbywgaXMgc3BlY2lmaWMgdG8gaW5kaXZpZHVhbCBsYW5ndWFnZXMsIGFuZCBpbiBzb21lIGNhc2VzCitzcGVjaWZpYyB0byBpbmRpdmlkdWFsIGNvbXBpbGVycyBvciBtYWNoaW5lcy4gIEB4cmVme1N1cHBvcnQsICwKK1N1cHBvcnRlZCBsYW5ndWFnZXN9LCBmb3IgZnVydGhlciBkZXRhaWxzIG9uIHNwZWNpZmljIGxhbmd1YWdlcy4KKworQHZhbHVle0dEQk59IHByb3ZpZGVzIHNvbWUgYWRkaXRpb25hbCBjb21tYW5kcyBmb3IgY29udHJvbGxpbmcgdGhlIHJhbmdlIGNoZWNrZXI6CisKK0BraW5kZXggc2V0IGNoZWNrCitAa2luZGV4IHNldCBjaGVjayByYW5nZQorQGtpbmRleCBzaG93IGNoZWNrIHJhbmdlCitAdGFibGUgQGNvZGUKK0BpdGVtIHNldCBjaGVjayByYW5nZSBhdXRvCitTZXQgcmFuZ2UgY2hlY2tpbmcgb24gb3Igb2ZmIGJhc2VkIG9uIHRoZSBjdXJyZW50IHdvcmtpbmcgbGFuZ3VhZ2UuCitAeHJlZntTdXBwb3J0LCAsU3VwcG9ydGVkIGxhbmd1YWdlc30sIGZvciB0aGUgZGVmYXVsdCBzZXR0aW5ncyBmb3IKK2VhY2ggbGFuZ3VhZ2UuCisKK0BpdGVtIHNldCBjaGVjayByYW5nZSBvbgorQGl0ZW14IHNldCBjaGVjayByYW5nZSBvZmYKK1NldCByYW5nZSBjaGVja2luZyBvbiBvciBvZmYsIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgdGhlCitjdXJyZW50IHdvcmtpbmcgbGFuZ3VhZ2UuICBBIHdhcm5pbmcgaXMgaXNzdWVkIGlmIHRoZSBzZXR0aW5nIGRvZXMgbm90CittYXRjaCB0aGUgbGFuZ3VhZ2UgZGVmYXVsdC4gIElmIGEgcmFuZ2UgZXJyb3Igb2NjdXJzLCB0aGVuIGEgbWVzc2FnZQoraXMgcHJpbnRlZCBhbmQgZXZhbHVhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiBpcyBhYm9ydGVkLgorCitAaXRlbSBzZXQgY2hlY2sgcmFuZ2Ugd2FybgorT3V0cHV0IG1lc3NhZ2VzIHdoZW4gdGhlIEB2YWx1ZXtHREJOfSByYW5nZSBjaGVja2VyIGRldGVjdHMgYSByYW5nZSBlcnJvciwKK2J1dCBhdHRlbXB0IHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGFueXdheS4gIEV2YWx1YXRpbmcgdGhlCitleHByZXNzaW9uIG1heSBzdGlsbCBiZSBpbXBvc3NpYmxlIGZvciBvdGhlciByZWFzb25zLCBzdWNoIGFzIGFjY2Vzc2luZworbWVtb3J5IHRoYXQgdGhlIHByb2Nlc3MgZG9lcyBub3Qgb3duIChhIHR5cGljYWwgZXhhbXBsZSBmcm9tIG1hbnkgVW5peAorc3lzdGVtcykuCisKK0BpdGVtIHNob3cgcmFuZ2UKK1Nob3cgdGhlIGN1cnJlbnQgc2V0dGluZyBvZiB0aGUgcmFuZ2UgY2hlY2tlciwgYW5kIHdoZXRoZXIgb3Igbm90IGl0IGlzCitiZWluZyBzZXQgYXV0b21hdGljYWxseSBieSBAdmFsdWV7R0RCTn0uCitAZW5kIHRhYmxlCitAZW5kIGlmc2V0CisKK0BpZnNldCBNT0QyCitAbm9kZSBTdXBwb3J0LCAgLCBDaGVja3MsIExhbmd1YWdlcworQHNlY3Rpb24gU3VwcG9ydGVkIGxhbmd1YWdlcworQGVuZCBpZnNldAorQGlmY2xlYXIgTU9EMgorQG5vZGUgU3VwcG9ydCwgICwgU2hvdywgTGFuZ3VhZ2VzCitAc2VjdGlvbiBTdXBwb3J0ZWQgbGFuZ3VhZ2VzCitAZW5kIGlmY2xlYXIKKworQGlmc2V0IE1PRDIKK0B2YWx1ZXtHREJOfSBzdXBwb3J0cyBDLCBDKyssIEZvcnRyYW4sIENoaWxsLCBhc3NlbWJseSwgYW5kIE1vZHVsYS0yLgorQGVuZCBpZnNldAorQGlmY2xlYXIgTU9EMgorQHZhbHVle0dEQk59IHN1cHBvcnRzIEMsIEMrKywgRm9ydHJhbiwgQ2hpbGwsIGFuZCBhc3NlbWJseS4KK0BlbmQgaWZjbGVhcgorU29tZSBAdmFsdWV7R0RCTn0gZmVhdHVyZXMgbWF5IGJlIHVzZWQgaW4gZXhwcmVzc2lvbnMgcmVnYXJkbGVzcyBvZiB0aGUKK2xhbmd1YWdlIHlvdSB1c2U6IHRoZSBAdmFsdWV7R0RCTn0gQGNvZGV7QEB9IGFuZCBAY29kZXs6On0gb3BlcmF0b3JzLAorYW5kIHRoZSBAc2FtcHtAe3R5cGVAfWFkZHJ9IGNvbnN0cnVjdCAoQHB4cmVme0V4cHJlc3Npb25zLAorLEV4cHJlc3Npb25zfSkgY2FuIGJlIHVzZWQgd2l0aCB0aGUgY29uc3RydWN0cyBvZiBhbnkgc3VwcG9ydGVkCitsYW5ndWFnZS4KKworVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBkZXRhaWwgdG8gd2hhdCBkZWdyZWUgZWFjaCBzb3VyY2UgbGFuZ3VhZ2UgaXMKK3N1cHBvcnRlZCBieSBAdmFsdWV7R0RCTn0uICBUaGVzZSBzZWN0aW9ucyBhcmUgbm90IG1lYW50IHRvIGJlIGxhbmd1YWdlCit0dXRvcmlhbHMgb3IgcmVmZXJlbmNlcywgYnV0IHNlcnZlIG9ubHkgYXMgYSByZWZlcmVuY2UgZ3VpZGUgdG8gd2hhdCB0aGUKK0B2YWx1ZXtHREJOfSBleHByZXNzaW9uIHBhcnNlciBhY2NlcHRzLCBhbmQgd2hhdCBpbnB1dCBhbmQgb3V0cHV0Citmb3JtYXRzIHNob3VsZCBsb29rIGxpa2UgZm9yIGRpZmZlcmVudCBsYW5ndWFnZXMuICBUaGVyZSBhcmUgbWFueSBnb29kCitib29rcyB3cml0dGVuIG9uIGVhY2ggb2YgdGhlc2UgbGFuZ3VhZ2VzOyBwbGVhc2UgbG9vayB0byB0aGVzZSBmb3IgYQorbGFuZ3VhZ2UgcmVmZXJlbmNlIG9yIHR1dG9yaWFsLgorCitAaWZzZXQgTU9EMgorQG1lbnUKKyogQzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgQyBhbmQgQysrCisqIE1vZHVsYS0yOjogICAgICAgICAgICAgICAgICAgIE1vZHVsYS0yCitAZW5kIG1lbnUKKworQG5vZGUgQywgTW9kdWxhLTIsICwgU3VwcG9ydAorQHN1YnNlY3Rpb24gQyBhbmQgQysrCitAY2luZGV4IEMgYW5kIEMrKworQGNpbmRleCBleHByZXNzaW9ucyBpbiBDIG9yIEMrKworQGVuZCBpZnNldAorCitTaW5jZSBDIGFuZCBDKysgYXJlIHNvIGNsb3NlbHkgcmVsYXRlZCwgbWFueSBmZWF0dXJlcyBvZiBAdmFsdWV7R0RCTn0gYXBwbHkKK3RvIGJvdGggbGFuZ3VhZ2VzLiAgV2hlbmV2ZXIgdGhpcyBpcyB0aGUgY2FzZSwgd2UgZGlzY3VzcyB0aG9zZSBsYW5ndWFnZXMKK3RvZ2V0aGVyLgorCitAaWZjbGVhciBNT0QyCitAYyBDYW5jZWwgdGhpcyBiZWxvdywgdW5kZXIgc2FtZSBjb25kaXRpb24sIGF0IGVuZCBvZiB0aGlzIGNoYXB0ZXIhCitAcmFpc2VzZWN0aW9ucworQGVuZCBpZmNsZWFyCisKK0BpZmNsZWFyIEhQUEEKK0BjaW5kZXggQysrCitAa2luZGV4IGcrKworQGNpbmRleCBAc2N7Z251fSBDKysKK1RoZSBDKysgZGVidWdnaW5nIGZhY2lsaXRpZXMgYXJlIGpvaW50bHkgaW1wbGVtZW50ZWQgYnkgdGhlIEMrKworY29tcGlsZXIgYW5kIEB2YWx1ZXtHREJOfS4gIFRoZXJlZm9yZSwgdG8gZGVidWcgeW91ciBDKysgY29kZQorZWZmZWN0aXZlbHksIHlvdSBtdXN0IGNvbXBpbGUgeW91ciBDKysgcHJvZ3JhbXMgd2l0aCBhIHN1cHBvcnRlZAorQysrIGNvbXBpbGVyLCBzdWNoIGFzIEBzY3tnbnV9IEBjb2Rle2crK30sIG9yIHRoZSBIUCBBTlNJIEMrKworY29tcGlsZXIgKEBjb2Rle2FDQ30pLgorCitGb3IgYmVzdCByZXN1bHRzIHdoZW4gdXNpbmcgQHNje2dudX0gQysrLCB1c2UgdGhlIHN0YWJzIGRlYnVnZ2luZworZm9ybWF0LiAgWW91IGNhbiBzZWxlY3QgdGhhdCBmb3JtYXQgZXhwbGljaXRseSB3aXRoIHRoZSBAY29kZXtnKyt9Citjb21tYW5kLWxpbmUgb3B0aW9ucyBAc2FtcHstZ3N0YWJzfSBvciBAc2FtcHstZ3N0YWJzK30uICBTZWUKK0ByZWZ7RGVidWdnaW5nIE9wdGlvbnMsLE9wdGlvbnMgZm9yIERlYnVnZ2luZyBZb3VyIFByb2dyYW0gb3IgQHNje2dudX0KK0NDLCBnY2MuaW5mbywgVXNpbmcgQHNje2dudX0gQ0N9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KK0BlbmQgaWZjbGVhcgorQGlmc2V0IEhQUEEKK0BjaW5kZXggQysrCitAa2luZGV4IGcrKworQGNpbmRleCBAc2N7Z251fSBDKysKK1lvdSBjYW4gdXNlIEB2YWx1ZXtHREJOfSB0byBkZWJ1ZyBDIHByb2dyYW1zIGNvbXBpbGVkIHdpdGggZWl0aGVyIHRoZSBIUAorQyBjb21waWxlciAoQGNvZGV7Y2N9KSBvciB0aGUgR05VIEMgY29tcGlsZXIgKEBjb2Rle2djY30pLCBhbmQgdG8gZGVidWcKK3Byb2dyYW1zIGNvbXBpbGVkIHdpdGggZWl0aGVyIHRoZSBIUCBBTlNJIEMrKyBjb21waWxlciAoQGNvZGV7YUNDfSkgb3IKK3RoZSBAc2N7Z251fSBDKysgY29tcGlsZXIgKEBjb2Rle2crK30pLgorCitJZiB5b3UgY29tcGlsZSB3aXRoIHRoZSBAc2N7Z251fSBDKysgY29tcGlsZXIsIHVzZSB0aGUgc3RhYnMgZGVidWdnaW5nCitmb3JtYXQgZm9yIGJlc3QgcmVzdWx0cyB3aGVuIGRlYnVnZ2luZy4gIFlvdSBjYW4gc2VsZWN0IHRoYXQgZm9ybWF0CitleHBsaWNpdGx5IHdpdGggdGhlIEBjb2Rle2crK30gY29tbWFuZC1saW5lIG9wdGlvbnMgQHNhbXB7LWdzdGFic30gb3IKK0BzYW1wey1nc3RhYnMrfS4gIFNlZSBAcmVme0RlYnVnZ2luZyBPcHRpb25zLCxPcHRpb25zIGZvciBEZWJ1Z2dpbmcgWW91cgorUHJvZ3JhbSBvciBAc2N7Z251fSBDQywgZ2NjLmluZm8sIFVzaW5nIEBzY3tnbnV9IENDfSwgZm9yIG1vcmUKK2luZm9ybWF0aW9uLgorQGVuZCBpZnNldAorQGVuZCBpZmNsZWFyCisKK0BpZnNldCBDT05MWQorQG5vZGUgQywgU3ltYm9scywgRGF0YSwgVG9wCitAY2hhcHRlciBDIExhbmd1YWdlIFN1cHBvcnQKK0BjaW5kZXggQyBsYW5ndWFnZQorQGNpbmRleCBleHByZXNzaW9ucyBpbiBDCisKK0luZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBDIGxhbmd1YWdlIGlzIGJ1aWx0IGludG8gQHZhbHVle0dEQk59IHNvIHRoYXQgeW91CitjYW4gdXNlIEMgZXhwcmVzc2lvbnMgd2hpbGUgZGVidWdnaW5nLiAgVGhpcyBhbHNvIHBlcm1pdHMgQHZhbHVle0dEQk59IHRvCitvdXRwdXQgdmFsdWVzIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCBDIGNvbnZlbnRpb25zLgorCitAbWVudQorKiBDIE9wZXJhdG9yczo6ICAgICAgICAgICAgICAgICBDIG9wZXJhdG9ycworQGVuZCBtZW51CitAZW5kIGlmc2V0CisKK0BpZmNsZWFyIENPTkxZCitAbWVudQorKiBDIE9wZXJhdG9yczo6ICAgICAgICAgICAgICAgICBDIGFuZCBDKysgb3BlcmF0b3JzCisqIEMgQ29uc3RhbnRzOjogICAgICAgICAgICAgICAgIEMgYW5kIEMrKyBjb25zdGFudHMKKyogQ3BsdXMgZXhwcmVzc2lvbnM6OiAgICAgICAgICAgQysrIGV4cHJlc3Npb25zCisqIEMgRGVmYXVsdHM6OiAgICAgICAgICAgICAgICAgIERlZmF1bHQgc2V0dGluZ3MgZm9yIEMgYW5kIEMrKworQGlmc2V0IE1PRDIKKyogQyBDaGVja3M6OiAgICAgICAgICAgICAgICAgICAgQyBhbmQgQysrIHR5cGUgYW5kIHJhbmdlIGNoZWNrcworQGVuZCBpZnNldAorCisqIERlYnVnZ2luZyBDOjogICAgICAgICAgICAgICAgIEB2YWx1ZXtHREJOfSBhbmQgQworKiBEZWJ1Z2dpbmcgQyBwbHVzIHBsdXM6OiAgICAgICBAdmFsdWV7R0RCTn0gZmVhdHVyZXMgZm9yIEMrKworQGVuZCBtZW51CitAZW5kIGlmY2xlYXIKKworQGlmY2xlYXIgQ09OTFkKK0BjaW5kZXggQyBhbmQgQysrIG9wZXJhdG9ycworQG5vZGUgQyBPcGVyYXRvcnMsIEMgQ29uc3RhbnRzLCAsIEMKK0BzdWJzdWJzZWN0aW9uIEMgYW5kIEMrKyBvcGVyYXRvcnMKK0BlbmQgaWZjbGVhcgorQGlmc2V0IENPTkxZCitAY2luZGV4IEMgb3BlcmF0b3JzCitAbm9kZSBDIE9wZXJhdG9ycywgQyBDb25zdGFudHMsIEMsIEMKK0BzZWN0aW9uIEMgb3BlcmF0b3JzCitAZW5kIGlmc2V0CisKK09wZXJhdG9ycyBtdXN0IGJlIGRlZmluZWQgb24gdmFsdWVzIG9mIHNwZWNpZmljIHR5cGVzLiAgRm9yIGluc3RhbmNlLAorQGNvZGV7K30gaXMgZGVmaW5lZCBvbiBudW1iZXJzLCBidXQgbm90IG9uIHN0cnVjdHVyZXMuICBPcGVyYXRvcnMgYXJlCitvZnRlbiBkZWZpbmVkIG9uIGdyb3VwcyBvZiB0eXBlcy4gIAorCitAaWZjbGVhciBDT05MWQorRm9yIHRoZSBwdXJwb3NlcyBvZiBDIGFuZCBDKyssIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgaG9sZDoKK0BlbmQgaWZjbGVhcgorCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorQGlmY2xlYXIgSFBQQQorQGVtcGh7SW50ZWdyYWwgdHlwZXN9IGluY2x1ZGUgQGNvZGV7aW50fSB3aXRoIGFueSBvZiBpdHMgc3RvcmFnZS1jbGFzcworc3BlY2lmaWVyczsgQGNvZGV7Y2hhcn07IGFuZCBAY29kZXtlbnVtfS4KK0BlbmQgaWZjbGVhcgorQGlmc2V0IEhQUEEKK0BlbXBoe0ludGVncmFsIHR5cGVzfSBpbmNsdWRlIEBjb2Rle2ludH0gd2l0aCBhbnkgb2YgaXRzIHN0b3JhZ2UtY2xhc3MKK3NwZWNpZmllcnM7IEBjb2Rle2NoYXJ9OyBAY29kZXtlbnVtfTsgYW5kLCBmb3IgQysrLCBAY29kZXtib29sfS4KK0BlbmQgaWZzZXQKKworQGl0ZW0KK0BlbXBoe0Zsb2F0aW5nLXBvaW50IHR5cGVzfSBpbmNsdWRlIEBjb2Rle2Zsb2F0fSBhbmQgQGNvZGV7ZG91YmxlfS4KKworQGl0ZW0KK0BlbXBoe1BvaW50ZXIgdHlwZXN9IGluY2x1ZGUgYWxsIHR5cGVzIGRlZmluZWQgYXMgQGNvZGV7KEB2YXJ7dHlwZX0KKyopfS4KKworQGl0ZW0KK0BlbXBoe1NjYWxhciB0eXBlc30gaW5jbHVkZSBhbGwgb2YgdGhlIGFib3ZlLgorQGVuZCBpdGVtaXplCisKK0Bub2luZGVudAorVGhlIGZvbGxvd2luZyBvcGVyYXRvcnMgYXJlIHN1cHBvcnRlZC4gIFRoZXkgYXJlIGxpc3RlZCBoZXJlCitpbiBvcmRlciBvZiBpbmNyZWFzaW5nIHByZWNlZGVuY2U6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gLAorVGhlIGNvbW1hIG9yIHNlcXVlbmNpbmcgb3BlcmF0b3IuICBFeHByZXNzaW9ucyBpbiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0CithcmUgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCwgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBlbnRpcmUKK2V4cHJlc3Npb24gYmVpbmcgdGhlIGxhc3QgZXhwcmVzc2lvbiBldmFsdWF0ZWQuCisKK0BpdGVtID0KK0Fzc2lnbm1lbnQuICBUaGUgdmFsdWUgb2YgYW4gYXNzaWdubWVudCBleHByZXNzaW9uIGlzIHRoZSB2YWx1ZQorYXNzaWduZWQuICBEZWZpbmVkIG9uIHNjYWxhciB0eXBlcy4KKworQGl0ZW0gQHZhcntvcH09CitVc2VkIGluIGFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gQHd7QGNvZGV7QHZhcnthfSBAdmFye29wfT0gQHZhcntifX19LAorYW5kIHRyYW5zbGF0ZWQgdG8gQHd7QGNvZGV7QHZhcnthfSA9IEB2YXJ7YSBvcCBifX19LgorQHd7QGNvZGV7QHZhcntvcH09fX0gYW5kIEBjb2Rlez19IGhhdmUgdGhlIHNhbWUgcHJlY2VuZGVuY2UuCitAdmFye29wfSBpcyBhbnkgb25lIG9mIHRoZSBvcGVyYXRvcnMgQGNvZGV7fH0sIEBjb2Rle159LCBAY29kZXsmfSwKK0Bjb2Rlezw8fSwgQGNvZGV7Pj59LCBAY29kZXsrfSwgQGNvZGV7LX0sIEBjb2Rleyp9LCBAY29kZXsvfSwgQGNvZGV7JX0uCisKK0BpdGVtID86CitUaGUgdGVybmFyeSBvcGVyYXRvci4gIEBjb2Rle0B2YXJ7YX0gPyBAdmFye2J9IDogQHZhcntjfX0gY2FuIGJlIHRob3VnaHQKK29mIGFzOiAgaWYgQHZhcnthfSB0aGVuIEB2YXJ7Yn0gZWxzZSBAdmFye2N9LiAgQHZhcnthfSBzaG91bGQgYmUgb2YgYW4KK2ludGVncmFsIHR5cGUuCisKK0BpdGVtIHx8CitMb2dpY2FsIEBzY3tvcn0uICBEZWZpbmVkIG9uIGludGVncmFsIHR5cGVzLgorCitAaXRlbSAmJgorTG9naWNhbCBAc2N7YW5kfS4gIERlZmluZWQgb24gaW50ZWdyYWwgdHlwZXMuCisKK0BpdGVtIHwKK0JpdHdpc2UgQHNje29yfS4gIERlZmluZWQgb24gaW50ZWdyYWwgdHlwZXMuCisKK0BpdGVtIF4KK0JpdHdpc2UgZXhjbHVzaXZlLUBzY3tvcn0uICBEZWZpbmVkIG9uIGludGVncmFsIHR5cGVzLgorCitAaXRlbSAmCitCaXR3aXNlIEBzY3thbmR9LiAgRGVmaW5lZCBvbiBpbnRlZ3JhbCB0eXBlcy4KKworQGl0ZW0gPT1AcnssIH0hPQorRXF1YWxpdHkgYW5kIGluZXF1YWxpdHkuICBEZWZpbmVkIG9uIHNjYWxhciB0eXBlcy4gIFRoZSB2YWx1ZSBvZiB0aGVzZQorZXhwcmVzc2lvbnMgaXMgMCBmb3IgZmFsc2UgYW5kIG5vbi16ZXJvIGZvciB0cnVlLgorCitAaXRlbSA8QHJ7LCB9PkByeywgfTw9QHJ7LCB9Pj0KK0xlc3MgdGhhbiwgZ3JlYXRlciB0aGFuLCBsZXNzIHRoYW4gb3IgZXF1YWwsIGdyZWF0ZXIgdGhhbiBvciBlcXVhbC4KK0RlZmluZWQgb24gc2NhbGFyIHR5cGVzLiAgVGhlIHZhbHVlIG9mIHRoZXNlIGV4cHJlc3Npb25zIGlzIDAgZm9yIGZhbHNlCithbmQgbm9uLXplcm8gZm9yIHRydWUuCisKK0BpdGVtIDw8QHJ7LCB9Pj4KK2xlZnQgc2hpZnQsIGFuZCByaWdodCBzaGlmdC4gIERlZmluZWQgb24gaW50ZWdyYWwgdHlwZXMuCisKK0BpdGVtIEBACitUaGUgQHZhbHVle0dEQk59IGBgYXJ0aWZpY2lhbCBhcnJheScnIG9wZXJhdG9yIChAcHhyZWZ7RXhwcmVzc2lvbnMsICxFeHByZXNzaW9uc30pLgorCitAaXRlbSArQHJ7LCB9LQorQWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uLiAgRGVmaW5lZCBvbiBpbnRlZ3JhbCB0eXBlcywgZmxvYXRpbmctcG9pbnQgdHlwZXMgYW5kCitwb2ludGVyIHR5cGVzLgorCitAaXRlbSAqQHJ7LCB9L0ByeywgfSUKK011bHRpcGxpY2F0aW9uLCBkaXZpc2lvbiwgYW5kIG1vZHVsdXMuICBNdWx0aXBsaWNhdGlvbiBhbmQgZGl2aXNpb24gYXJlCitkZWZpbmVkIG9uIGludGVncmFsIGFuZCBmbG9hdGluZy1wb2ludCB0eXBlcy4gIE1vZHVsdXMgaXMgZGVmaW5lZCBvbgoraW50ZWdyYWwgdHlwZXMuCisKK0BpdGVtICsrQHJ7LCB9LS0KK0luY3JlbWVudCBhbmQgZGVjcmVtZW50LiAgV2hlbiBhcHBlYXJpbmcgYmVmb3JlIGEgdmFyaWFibGUsIHRoZQorb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBiZWZvcmUgdGhlIHZhcmlhYmxlIGlzIHVzZWQgaW4gYW4gZXhwcmVzc2lvbjsKK3doZW4gYXBwZWFyaW5nIGFmdGVyIGl0LCB0aGUgdmFyaWFibGUncyB2YWx1ZSBpcyB1c2VkIGJlZm9yZSB0aGUKK29wZXJhdGlvbiB0YWtlcyBwbGFjZS4KKworQGl0ZW0gKgorUG9pbnRlciBkZXJlZmVyZW5jaW5nLiAgRGVmaW5lZCBvbiBwb2ludGVyIHR5cGVzLiAgU2FtZSBwcmVjZWRlbmNlIGFzCitAY29kZXsrK30uCisKK0BpdGVtICYKK0FkZHJlc3Mgb3BlcmF0b3IuICBEZWZpbmVkIG9uIHZhcmlhYmxlcy4gIFNhbWUgcHJlY2VkZW5jZSBhcyBAY29kZXsrK30uCisKK0BpZmNsZWFyIENPTkxZCitGb3IgZGVidWdnaW5nIEMrKywgQHZhbHVle0dEQk59IGltcGxlbWVudHMgYSB1c2Ugb2YgQHNhbXB7Jn0gYmV5b25kIHdoYXQgaXMKK2FsbG93ZWQgaW4gdGhlIEMrKyBsYW5ndWFnZSBpdHNlbGY6IHlvdSBjYW4gdXNlIEBzYW1weyYoJkB2YXJ7cmVmfSl9Cisob3IsIGlmIHlvdSBwcmVmZXIsIHNpbXBseSBAc2FtcHsmJkB2YXJ7cmVmfX0pIHRvIGV4YW1pbmUgdGhlIGFkZHJlc3MKK3doZXJlIGEgQysrIHJlZmVyZW5jZSB2YXJpYWJsZSAoZGVjbGFyZWQgd2l0aCBAc2FtcHsmQHZhcntyZWZ9fSkgaXMKK3N0b3JlZC4KK0BlbmQgaWZjbGVhcgorCitAaXRlbSAtCitOZWdhdGl2ZS4gIERlZmluZWQgb24gaW50ZWdyYWwgYW5kIGZsb2F0aW5nLXBvaW50IHR5cGVzLiAgU2FtZQorcHJlY2VkZW5jZSBhcyBAY29kZXsrK30uCisKK0BpdGVtICEKK0xvZ2ljYWwgbmVnYXRpb24uICBEZWZpbmVkIG9uIGludGVncmFsIHR5cGVzLiAgU2FtZSBwcmVjZWRlbmNlIGFzCitAY29kZXsrK30uCisKK0BpdGVtIH4KK0JpdHdpc2UgY29tcGxlbWVudCBvcGVyYXRvci4gIERlZmluZWQgb24gaW50ZWdyYWwgdHlwZXMuICBTYW1lIHByZWNlZGVuY2UgYXMKK0Bjb2RleysrfS4KKworCitAaXRlbSAuQHJ7LCB9LT4KK1N0cnVjdHVyZSBtZW1iZXIsIGFuZCBwb2ludGVyLXRvLXN0cnVjdHVyZSBtZW1iZXIuICBGb3IgY29udmVuaWVuY2UsCitAdmFsdWV7R0RCTn0gcmVnYXJkcyB0aGUgdHdvIGFzIGVxdWl2YWxlbnQsIGNob29zaW5nIHdoZXRoZXIgdG8gZGVyZWZlcmVuY2UgYQorcG9pbnRlciBiYXNlZCBvbiB0aGUgc3RvcmVkIHR5cGUgaW5mb3JtYXRpb24uCitEZWZpbmVkIG9uIEBjb2Rle3N0cnVjdH0gYW5kIEBjb2Rle3VuaW9ufSBkYXRhLgorCitAaWZzZXQgSFBQQQorQGl0ZW0gLipAcnssIH0tPioKK0RlcmVmZXJlbmNlcyBvZiBwb2ludGVycyB0byBtZW1iZXJzLgorQGVuZCBpZnNldAorCitAaXRlbSBbXQorQXJyYXkgaW5kZXhpbmcuICBAY29kZXtAdmFye2F9W0B2YXJ7aX1dfSBpcyBkZWZpbmVkIGFzCitAY29kZXsqKEB2YXJ7YX0rQHZhcntpfSl9LiAgU2FtZSBwcmVjZWRlbmNlIGFzIEBjb2Rley0+fS4KKworQGl0ZW0gKCkKK0Z1bmN0aW9uIHBhcmFtZXRlciBsaXN0LiAgU2FtZSBwcmVjZWRlbmNlIGFzIEBjb2Rley0+fS4KKworQGlmY2xlYXIgQ09OTFkKK0BpdGVtIDo6CitDKysgc2NvcGUgcmVzb2x1dGlvbiBvcGVyYXRvci4gIERlZmluZWQgb24KK0Bjb2Rle3N0cnVjdH0sIEBjb2Rle3VuaW9ufSwgYW5kIEBjb2Rle2NsYXNzfSB0eXBlcy4KK0BlbmQgaWZjbGVhcgorCitAaXRlbSA6OgorRG91YmxlZCBjb2xvbnMKK0BpZmNsZWFyIENPTkxZCithbHNvCitAZW5kIGlmY2xlYXIKK3JlcHJlc2VudCB0aGUgQHZhbHVle0dEQk59IHNjb3BlIG9wZXJhdG9yIChAcHhyZWZ7RXhwcmVzc2lvbnMsCissRXhwcmVzc2lvbnN9KS4KK0BpZmNsZWFyIENPTkxZCitTYW1lIHByZWNlZGVuY2UgYXMgQGNvZGV7Ojp9LCBhYm92ZS4KK0BlbmQgaWZjbGVhcgorQGVuZCB0YWJsZQorCitAaWZzZXQgSFBQQQorSWYgYW4gb3BlcmF0b3IgaXMgcmVkZWZpbmVkIGluIHRoZSB1c2VyIGNvZGUsIEB2YWx1ZXtHREJOfSB1c3VhbGx5CithdHRlbXB0cyB0byBpbnZva2UgdGhlIHJlZGVmaW5lZCB2ZXJzaW9uIGluc3RlYWQgb2YgdXNpbmcgdGhlIG9wZXJhdG9yJ3MKK3ByZWRlZmluZWQgbWVhbmluZy4KK0BlbmQgaWZzZXQKKworQGlmY2xlYXIgQ09OTFkKK0BtZW51CisqIEMgQ29uc3RhbnRzOjogICAgICAgICAgICAgCitAZW5kIG1lbnUKKworQGlmc2V0IE1PRDIKK0Bub2RlIEMgQ29uc3RhbnRzLCBDcGx1cyBleHByZXNzaW9ucywgQyBPcGVyYXRvcnMsIEMKK0BzdWJzdWJzZWN0aW9uIEMgYW5kIEMrKyBjb25zdGFudHMKK0BlbmQgaWZzZXQKK0BpZmNsZWFyIE1PRDIKK0Bub2RlIEMgQ29uc3RhbnRzLCBDcGx1cyBleHByZXNzaW9ucywgQyBPcGVyYXRvcnMsIFN1cHBvcnQKK0BzdWJzdWJzZWN0aW9uIEMgYW5kIEMrKyBjb25zdGFudHMKK0BlbmQgaWZjbGVhcgorCitAY2luZGV4IEMgYW5kIEMrKyBjb25zdGFudHMKK0B2YWx1ZXtHREJOfSBhbGxvd3MgeW91IHRvIGV4cHJlc3MgdGhlIGNvbnN0YW50cyBvZiBDIGFuZCBDKysgaW4gdGhlCitmb2xsb3dpbmcgd2F5czoKK0BlbmQgaWZjbGVhcgorQGlmc2V0IENPTkxZCitAY2luZGV4IEMgY29uc3RhbnRzCitAbm9kZSBDIENvbnN0YW50cywgRGVidWdnaW5nIEMsIEMgT3BlcmF0b3JzLCBDCitAc2VjdGlvbiBDIGNvbnN0YW50cworCitAdmFsdWV7R0RCTn0gYWxsb3dzIHlvdSB0byBleHByZXNzIHRoZSBjb25zdGFudHMgb2YgQyBpbiB0aGUKK2ZvbGxvd2luZyB3YXlzOgorQGVuZCBpZnNldAorCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorSW50ZWdlciBjb25zdGFudHMgYXJlIGEgc2VxdWVuY2Ugb2YgZGlnaXRzLiAgT2N0YWwgY29uc3RhbnRzIGFyZQorc3BlY2lmaWVkIGJ5IGEgbGVhZGluZyBAc2FtcHswfSAoaS5lLiB6ZXJvKSwgYW5kIGhleGFkZWNpbWFsIGNvbnN0YW50cyBieQorYSBsZWFkaW5nIEBzYW1wezB4fSBvciBAc2FtcHswWH0uICBDb25zdGFudHMgbWF5IGFsc28gZW5kIHdpdGggYSBsZXR0ZXIKK0BzYW1we2x9LCBzcGVjaWZ5aW5nIHRoYXQgdGhlIGNvbnN0YW50IHNob3VsZCBiZSB0cmVhdGVkIGFzIGEKK0Bjb2Rle2xvbmd9IHZhbHVlLgorCitAaXRlbQorRmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzIGFyZSBhIHNlcXVlbmNlIG9mIGRpZ2l0cywgZm9sbG93ZWQgYnkgYSBkZWNpbWFsCitwb2ludCwgZm9sbG93ZWQgYnkgYSBzZXF1ZW5jZSBvZiBkaWdpdHMsIGFuZCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGFuCitleHBvbmVudC4gIEFuIGV4cG9uZW50IGlzIG9mIHRoZSBmb3JtOgorQHNhbXB7QHd7ZUBye1tbfStAcntdfH0tQHJ7XX1AdmFye25ubn19fSwgd2hlcmUgQHZhcntubm59IGlzIGFub3RoZXIKK3NlcXVlbmNlIG9mIGRpZ2l0cy4gIFRoZSBAc2FtcHsrfSBpcyBvcHRpb25hbCBmb3IgcG9zaXRpdmUgZXhwb25lbnRzLgorCitAaXRlbQorRW51bWVyYXRlZCBjb25zdGFudHMgY29uc2lzdCBvZiBlbnVtZXJhdGVkIGlkZW50aWZpZXJzLCBvciB0aGVpcgoraW50ZWdyYWwgZXF1aXZhbGVudHMuCisKK0BpdGVtCitDaGFyYWN0ZXIgY29uc3RhbnRzIGFyZSBhIHNpbmdsZSBjaGFyYWN0ZXIgc3Vycm91bmRlZCBieSBzaW5nbGUgcXVvdGVzCisoQGNvZGV7J30pLCBvciBhIG51bWJlci0tLXRoZSBvcmRpbmFsIHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNoYXJhY3RlcgorKHVzdWFsbHkgaXRzIEBzY3tBU0NJSX0gdmFsdWUpLiAgV2l0aGluIHF1b3RlcywgdGhlIHNpbmdsZSBjaGFyYWN0ZXIgbWF5CitiZSByZXByZXNlbnRlZCBieSBhIGxldHRlciBvciBieSBAZGZue2VzY2FwZSBzZXF1ZW5jZXN9LCB3aGljaCBhcmUgb2YKK3RoZSBmb3JtIEBzYW1we1xAdmFye25ubn19LCB3aGVyZSBAdmFye25ubn0gaXMgdGhlIG9jdGFsIHJlcHJlc2VudGF0aW9uCitvZiB0aGUgY2hhcmFjdGVyJ3Mgb3JkaW5hbCB2YWx1ZTsgb3Igb2YgdGhlIGZvcm0gQHNhbXB7XEB2YXJ7eH19LCB3aGVyZQorQHNhbXB7QHZhcnt4fX0gaXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgY2hhcmFjdGVyLS0tZm9yIGV4YW1wbGUsCitAc2FtcHtcbn0gZm9yIG5ld2xpbmUuCisKK0BpdGVtCitTdHJpbmcgY29uc3RhbnRzIGFyZSBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlciBjb25zdGFudHMgc3Vycm91bmRlZAorYnkgZG91YmxlIHF1b3RlcyAoQGNvZGV7In0pLgorCitAaXRlbQorUG9pbnRlciBjb25zdGFudHMgYXJlIGFuIGludGVncmFsIHZhbHVlLiAgWW91IGNhbiBhbHNvIHdyaXRlIHBvaW50ZXJzCit0byBjb25zdGFudHMgdXNpbmcgdGhlIEMgb3BlcmF0b3IgQHNhbXB7Jn0uCisKK0BpdGVtCitBcnJheSBjb25zdGFudHMgYXJlIGNvbW1hLXNlcGFyYXRlZCBsaXN0cyBzdXJyb3VuZGVkIGJ5IGJyYWNlcyBAc2FtcHtAe30KK2FuZCBAc2FtcHtAfX07IGZvciBleGFtcGxlLCBAc2FtcHtAezEsMiwzQH19IGlzIGEgdGhyZWUtZWxlbWVudCBhcnJheSBvZgoraW50ZWdlcnMsIEBzYW1we0B7QHsxLDJAfSwgQHszLDRAfSwgQHs1LDZAfUB9fSBpcyBhIHRocmVlLWJ5LXR3byBhcnJheSwKK2FuZCBAc2FtcHtAeyYiaGkiLCAmInRoZXJlIiwgJiJmcmVkIkB9fSBpcyBhIHRocmVlLWVsZW1lbnQgYXJyYXkgb2YgcG9pbnRlcnMuCitAZW5kIGl0ZW1pemUKKworQGlmY2xlYXIgQ09OTFkKK0BtZW51CisqIENwbHVzIGV4cHJlc3Npb25zOjogICAgICAgICAgIAorKiBDIERlZmF1bHRzOjogICAgICAgICAgICAgICAgICAKK0BpZnNldCBNT0QyCisqIEMgQ2hlY2tzOjogICAgICAgICAgICAgICAgICAgIAorQGVuZCBpZnNldAorCisqIERlYnVnZ2luZyBDOjogICAgICAgICAgICAgICAgIAorQGVuZCBtZW51CisKK0BpZnNldCBNT0QyCitAbm9kZSBDcGx1cyBleHByZXNzaW9ucywgQyBEZWZhdWx0cywgQyBDb25zdGFudHMsIEMKK0BzdWJzdWJzZWN0aW9uIEMrKyBleHByZXNzaW9ucworQGVuZCBpZnNldAorQGlmY2xlYXIgTU9EMgorQG5vZGUgQ3BsdXMgZXhwcmVzc2lvbnMsIEMgRGVmYXVsdHMsIEMgQ29uc3RhbnRzLCBTdXBwb3J0CitAc3Vic3Vic2VjdGlvbiBDKysgZXhwcmVzc2lvbnMKK0BlbmQgaWZjbGVhcgorCitAY2luZGV4IGV4cHJlc3Npb25zIGluIEMrKworQHZhbHVle0dEQk59IGV4cHJlc3Npb24gaGFuZGxpbmcgY2FuIGludGVycHJldCBtb3N0IEMrKyBleHByZXNzaW9ucy4KKworQGlmY2xlYXIgSFBQQQorQGNpbmRleCBDKysgc3VwcG9ydCwgbm90IGluIEBzY3tjb2ZmfQorQGNpbmRleCBAc2N7Y29mZn0gdmVyc3VzIEMrKworQGNpbmRleCBDKysgYW5kIG9iamVjdCBmb3JtYXRzCitAY2luZGV4IG9iamVjdCBmb3JtYXRzIGFuZCBDKysKK0BjaW5kZXggYS5vdXQgYW5kIEMrKworQGNpbmRleCBAc2N7ZWNvZmZ9IGFuZCBDKysKK0BjaW5kZXggQHNje3hjb2ZmfSBhbmQgQysrCitAY2luZGV4IEBzY3tlbGZ9L3N0YWJzIGFuZCBDKysKK0BjaW5kZXggQHNje2VsZn0vQHNje2R3YXJmfSBhbmQgQysrCitAYyBGSVhNRSEhIEdEQiBtYXkgZXZlbnR1YWxseSBiZSBhYmxlIHRvIGRlYnVnIEMrKyB1c2luZyBEV0FSRjsgY2hlY2sKK0BjIHBlcmlvZGljYWxseSB3aGV0aGVyIHRoaXMgaGFzIGhhcHBlbmVkLi4uCitAcXVvdGF0aW9uCitAZW1waHtXYXJuaW5nOn0gQHZhbHVle0dEQk59IGNhbiBvbmx5IGRlYnVnIEMrKyBjb2RlIGlmIHlvdSB1c2UgdGhlCitwcm9wZXIgY29tcGlsZXIuICBUeXBpY2FsbHksIEMrKyBkZWJ1Z2dpbmcgZGVwZW5kcyBvbiB0aGUgdXNlIG9mCithZGRpdGlvbmFsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlLCBhbmQgdGh1cyByZXF1aXJlcworc3BlY2lhbCBzdXBwb3J0LiAgSW4gcGFydGljdWxhciwgaWYgeW91ciBjb21waWxlciBnZW5lcmF0ZXMgYS5vdXQsIE1JUFMKK0BzY3tlY29mZn0sIFJTLzYwMDAgQHNje3hjb2ZmfSwgb3IgQHNje2VsZn0gd2l0aCBzdGFicyBleHRlbnNpb25zIHRvIHRoZQorc3ltYm9sIHRhYmxlLCB0aGVzZSBmYWNpbGl0aWVzIGFyZSBhbGwgYXZhaWxhYmxlLiAgKFdpdGggQHNje2dudX0gQ0MsCit5b3UgY2FuIHVzZSB0aGUgQHNhbXB7LWdzdGFic30gb3B0aW9uIHRvIHJlcXVlc3Qgc3RhYnMgZGVidWdnaW5nCitleHRlbnNpb25zIGV4cGxpY2l0bHkuKSAgV2hlcmUgdGhlIG9iamVjdCBjb2RlIGZvcm1hdCBpcyBzdGFuZGFyZAorQHNje2NvZmZ9IG9yIEBzY3tkd2FyZn0gaW4gQHNje2VsZn0sIG9uIHRoZSBvdGhlciBoYW5kLCBtb3N0IG9mIHRoZSBDKysKK3N1cHBvcnQgaW4gQHZhbHVle0dEQk59IGRvZXMgQGVtcGh7bm90fSB3b3JrLgorQGVuZCBxdW90YXRpb24KK0BlbmQgaWZjbGVhcgorCitAZW51bWVyYXRlCisKK0BjaW5kZXggbWVtYmVyIGZ1bmN0aW9ucworQGl0ZW0KK01lbWJlciBmdW5jdGlvbiBjYWxscyBhcmUgYWxsb3dlZDsgeW91IGNhbiB1c2UgZXhwcmVzc2lvbnMgbGlrZQorCitAZXhhbXBsZQorY291bnQgPSBhbWwtPkdldE9yaWdpbmFsKHgsIHkpCitAZW5kIGV4YW1wbGUKKworQGtpbmRleCB0aGlzCitAY2luZGV4IG5hbWVzcGFjZSBpbiBDKysKK0BpdGVtCitXaGlsZSBhIG1lbWJlciBmdW5jdGlvbiBpcyBhY3RpdmUgKGluIHRoZSBzZWxlY3RlZCBzdGFjayBmcmFtZSksIHlvdXIKK2V4cHJlc3Npb25zIGhhdmUgdGhlIHNhbWUgbmFtZXNwYWNlIGF2YWlsYWJsZSBhcyB0aGUgbWVtYmVyIGZ1bmN0aW9uOwordGhhdCBpcywgQHZhbHVle0dEQk59IGFsbG93cyBpbXBsaWNpdCByZWZlcmVuY2VzIHRvIHRoZSBjbGFzcyBpbnN0YW5jZQorcG9pbnRlciBAY29kZXt0aGlzfSBmb2xsb3dpbmcgdGhlIHNhbWUgcnVsZXMgYXMgQysrLgorCitAaWZjbGVhciBIUFBBCitAY2luZGV4IGNhbGwgb3ZlcmxvYWRlZCBmdW5jdGlvbnMKK0BjaW5kZXggdHlwZSBjb252ZXJzaW9ucyBpbiBDKysKK0BpdGVtCitZb3UgY2FuIGNhbGwgb3ZlcmxvYWRlZCBmdW5jdGlvbnM7IEB2YWx1ZXtHREJOfSByZXNvbHZlcyB0aGUgZnVuY3Rpb24KK2NhbGwgdG8gdGhlIHJpZ2h0IGRlZmluaXRpb24sIHdpdGggb25lIHJlc3RyaWN0aW9uLS0teW91IG11c3QgdXNlCithcmd1bWVudHMgb2YgdGhlIHR5cGUgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uIHRoYXQgeW91IHdhbnQgdG8gY2FsbC4KK0B2YWx1ZXtHREJOfSBkb2VzIG5vdCBwZXJmb3JtIGNvbnZlcnNpb25zIHJlcXVpcmluZyBjb25zdHJ1Y3RvcnMgb3IKK3VzZXItZGVmaW5lZCB0eXBlIG9wZXJhdG9ycy4KK0BlbmQgaWZjbGVhcgorQGlmc2V0IEhQUEEKK0BjaW5kZXggY2FsbCBvdmVybG9hZGVkIGZ1bmN0aW9ucworQGNpbmRleCBvdmVybG9hZGVkIGZ1bmN0aW9ucworQGNpbmRleCB0eXBlIGNvbnZlcnNpb25zIGluIEMrKworQGl0ZW0KK1lvdSBjYW4gY2FsbCBvdmVybG9hZGVkIGZ1bmN0aW9uczsgQHZhbHVle0dEQk59IHJlc29sdmVzIHRoZSBmdW5jdGlvbgorY2FsbCB0byB0aGUgcmlnaHQgZGVmaW5pdGlvbiwgd2l0aCBzb21lIHJlc3RyaWN0aW9ucy4gIEdEQiBkb2VzIG5vdAorcGVyZm9ybSBvdmVybG9hZCByZXNvbHV0aW9uIGludm9sdmluZyB1c2VyLWRlZmluZWQgdHlwZSBjb252ZXJzaW9ucywKK2NhbGxzIHRvIGNvbnN0cnVjdG9ycywgb3IgaW5zdGFudGlhdGlvbnMgb2YgdGVtcGxhdGVzIHRoYXQgZG8gbm90IGV4aXN0CitpbiB0aGUgcHJvZ3JhbS4gIEl0IGFsc28gY2Fubm90IGhhbmRsZSBlbGxpcHNpcyBhcmd1bWVudCBsaXN0cyBvcgorZGVmYXVsdCBhcmd1bWVudHMuCisKK0l0IGRvZXMgcGVyZm9ybSBpbnRlZ3JhbCBjb252ZXJzaW9ucyBhbmQgcHJvbW90aW9ucywgZmxvYXRpbmctcG9pbnQKK3Byb21vdGlvbnMsIGFyaXRobWV0aWMgY29udmVyc2lvbnMsIHBvaW50ZXIgY29udmVyc2lvbnMsIGNvbnZlcnNpb25zIG9mCitjbGFzcyBvYmplY3RzIHRvIGJhc2UgY2xhc3NlcywgYW5kIHN0YW5kYXJkIGNvbnZlcnNpb25zIHN1Y2ggYXMgdGhvc2Ugb2YKK2Z1bmN0aW9ucyBvciBhcnJheXMgdG8gcG9pbnRlcnM7IGl0IHJlcXVpcmVzIGFuIGV4YWN0IG1hdGNoIG9uIHRoZQorbnVtYmVyIG9mIGZ1bmN0aW9uIGFyZ3VtZW50cy4KKworT3ZlcmxvYWQgcmVzb2x1dGlvbiBpcyBhbHdheXMgcGVyZm9ybWVkLCB1bmxlc3MgeW91IGhhdmUgc3BlY2lmaWVkCitAY29kZXtzZXQgb3ZlcmxvYWQtcmVzb2x1dGlvbiBvZmZ9LiAgQHhyZWZ7RGVidWdnaW5nIEMgcGx1cyBwbHVzLAorLEB2YWx1ZXtHREJOfSBmZWF0dXJlcyBmb3IgQysrfS4KKworWW91IG11c3Qgc3BlY2lmeUBjb2Rle3NldCBvdmVybG9hZC1yZXNvbHV0aW9uIG9mZn0gaW4gb3JkZXIgdG8gdXNlIGFuCitleHBsaWNpdCBmdW5jdGlvbiBzaWduYXR1cmUgdG8gY2FsbCBhbiBvdmVybG9hZGVkIGZ1bmN0aW9uLCBhcyBpbgorQHNtYWxsZXhhbXBsZQorcCAnZm9vKGNoYXIsaW50KScoJ3gnLCAxMykKK0BlbmQgc21hbGxleGFtcGxlCitUaGUgQHZhbHVle0dEQk59IGNvbW1hbmQtY29tcGxldGlvbiBmYWNpbGl0eSBjYW4gc2ltcGxpZnkgdGhpczsKK0BweHJlZntDb21wbGV0aW9uLCAsQ29tbWFuZCBjb21wbGV0aW9ufS4KKworQGVuZCBpZnNldAorCitAY2luZGV4IHJlZmVyZW5jZSBkZWNsYXJhdGlvbnMKK0BpdGVtCitAdmFsdWV7R0RCTn0gdW5kZXJzdGFuZHMgdmFyaWFibGVzIGRlY2xhcmVkIGFzIEMrKyByZWZlcmVuY2VzOyB5b3UgY2FuIHVzZSAKK3RoZW0gaW4gZXhwcmVzc2lvbnMganVzdCBhcyB5b3UgZG8gaW4gQysrIHNvdXJjZS0tLXRoZXkgYXJlIGF1dG9tYXRpY2FsbHkKK2RlcmVmZXJlbmNlZC4KKworSW4gdGhlIHBhcmFtZXRlciBsaXN0IHNob3duIHdoZW4gQHZhbHVle0dEQk59IGRpc3BsYXlzIGEgZnJhbWUsIHRoZSB2YWx1ZXMgb2YKK3JlZmVyZW5jZSB2YXJpYWJsZXMgYXJlIG5vdCBkaXNwbGF5ZWQgKHVubGlrZSBvdGhlciB2YXJpYWJsZXMpOyB0aGlzCithdm9pZHMgY2x1dHRlciwgc2luY2UgcmVmZXJlbmNlcyBhcmUgb2Z0ZW4gdXNlZCBmb3IgbGFyZ2Ugc3RydWN0dXJlcy4KK1RoZSBAZW1waHthZGRyZXNzfSBvZiBhIHJlZmVyZW5jZSB2YXJpYWJsZSBpcyBhbHdheXMgc2hvd24sIHVubGVzcworeW91IGhhdmUgc3BlY2lmaWVkIEBzYW1we3NldCBwcmludCBhZGRyZXNzIG9mZn0uCisKK0BpdGVtCitAdmFsdWV7R0RCTn0gc3VwcG9ydHMgdGhlIEMrKyBuYW1lIHJlc29sdXRpb24gb3BlcmF0b3IgQGNvZGV7Ojp9LS0teW91cgorZXhwcmVzc2lvbnMgY2FuIHVzZSBpdCBqdXN0IGFzIGV4cHJlc3Npb25zIGluIHlvdXIgcHJvZ3JhbSBkby4gIFNpbmNlCitvbmUgc2NvcGUgbWF5IGJlIGRlZmluZWQgaW4gYW5vdGhlciwgeW91IGNhbiB1c2UgQGNvZGV7Ojp9IHJlcGVhdGVkbHkgaWYKK25lY2Vzc2FyeSwgZm9yIGV4YW1wbGUgaW4gYW4gZXhwcmVzc2lvbiBsaWtlCitAc2FtcHtAdmFye3Njb3BlMX06OkB2YXJ7c2NvcGUyfTo6QHZhcntuYW1lfX0uICBAdmFsdWV7R0RCTn0gYWxzbyBhbGxvd3MKK3Jlc29sdmluZyBuYW1lIHNjb3BlIGJ5IHJlZmVyZW5jZSB0byBzb3VyY2UgZmlsZXMsIGluIGJvdGggQyBhbmQgQysrCitkZWJ1Z2dpbmcgKEBweHJlZntWYXJpYWJsZXMsICxQcm9ncmFtIHZhcmlhYmxlc30pLgorQGVuZCBlbnVtZXJhdGUKKworQGlmc2V0IEhQUEEKK0luIGFkZGl0aW9uLCBAdmFsdWV7R0RCTn0gc3VwcG9ydHMgY2FsbGluZyB2aXJ0dWFsIGZ1bmN0aW9ucyBjb3JyZWN0bHksCitwcmludGluZyBvdXQgdmlydHVhbCBiYXNlcyBvZiBvYmplY3RzLCBjYWxsaW5nIGZ1bmN0aW9ucyBpbiBhIGJhc2UKK3N1Ym9iamVjdCwgY2FzdGluZyBvYmplY3RzLCBhbmQgaW52b2tpbmcgdXNlci1kZWZpbmVkIG9wZXJhdG9ycy4KK0BlbmQgaWZzZXQKKworQGlmc2V0IE1PRDIKK0Bub2RlIEMgRGVmYXVsdHMsIEMgQ2hlY2tzLCBDcGx1cyBleHByZXNzaW9ucywgQworQHN1YnN1YnNlY3Rpb24gQyBhbmQgQysrIGRlZmF1bHRzCitAZW5kIGlmc2V0CitAaWZjbGVhciBNT0QyCitAbm9kZSBDIERlZmF1bHRzLCBEZWJ1Z2dpbmcgQywgQ3BsdXMgZXhwcmVzc2lvbnMsIFN1cHBvcnQKK0BzdWJzdWJzZWN0aW9uIEMgYW5kIEMrKyBkZWZhdWx0cworQGVuZCBpZmNsZWFyCitAY2luZGV4IEMgYW5kIEMrKyBkZWZhdWx0cworCitAaWZjbGVhciBIUFBBCitJZiB5b3UgYWxsb3cgQHZhbHVle0dEQk59IHRvIHNldCB0eXBlIGFuZCByYW5nZSBjaGVja2luZyBhdXRvbWF0aWNhbGx5LCB0aGV5Citib3RoIGRlZmF1bHQgdG8gQGNvZGV7b2ZmfSB3aGVuZXZlciB0aGUgd29ya2luZyBsYW5ndWFnZSBjaGFuZ2VzIHRvCitDIG9yIEMrKy4gIFRoaXMgaGFwcGVucyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgeW91IG9yIEB2YWx1ZXtHREJOfQorc2VsZWN0cyB0aGUgd29ya2luZyBsYW5ndWFnZS4KK0BlbmQgaWZjbGVhcgorCitJZiB5b3UgYWxsb3cgQHZhbHVle0dEQk59IHRvIHNldCB0aGUgbGFuZ3VhZ2UgYXV0b21hdGljYWxseSwgaXQKK3JlY29nbml6ZXMgc291cmNlIGZpbGVzIHdob3NlIG5hbWVzIGVuZCB3aXRoIEBmaWxley5jfSwgQGZpbGV7LkN9LCBvcgorQGZpbGV7LmNjfSwgZXRjLCBhbmQgd2hlbiBAdmFsdWV7R0RCTn0gZW50ZXJzIGNvZGUgY29tcGlsZWQgZnJvbSBvbmUgb2YKK3RoZXNlIGZpbGVzLCBpdCBzZXRzIHRoZSB3b3JraW5nIGxhbmd1YWdlIHRvIEMgb3IgQysrLgorQHhyZWZ7QXV0b21hdGljYWxseSwgLEhhdmluZyBAdmFsdWV7R0RCTn0gaW5mZXIgdGhlIHNvdXJjZSBsYW5ndWFnZX0sCitmb3IgZnVydGhlciBkZXRhaWxzLgorCitAaWZzZXQgTU9EMgorQGMgVHlwZSBjaGVja2luZyBpcyAoYSkgcHJpbWFyaWx5IG1vdGl2YXRlZCBieSBNb2R1bGEtMiwgYW5kIChiKQorQGMgdW5pbXBsZW1lbnRlZC4gIElmIChiKSBjaGFuZ2VzLCBpdCBtaWdodCBtYWtlIHNlbnNlIHRvIGxldCB0aGlzIG5vZGUKK0BjIGFwcGVhciBldmVuIGlmIE1vZC0yIGRvZXMgbm90LCBidXQgbWVhbndoaWxlIGlnbm9yZSBpdC4gcm9sYW5kIDE2anVsOTMuCitAbm9kZSBDIENoZWNrcywgRGVidWdnaW5nIEMsIEMgRGVmYXVsdHMsIEMgQ29uc3RhbnRzCitAc3Vic3Vic2VjdGlvbiBDIGFuZCBDKysgdHlwZSBhbmQgcmFuZ2UgY2hlY2tzCitAY2luZGV4IEMgYW5kIEMrKyBjaGVja3MKKworQnkgZGVmYXVsdCwgd2hlbiBAdmFsdWV7R0RCTn0gcGFyc2VzIEMgb3IgQysrIGV4cHJlc3Npb25zLCB0eXBlIGNoZWNraW5nCitpcyBub3QgdXNlZC4gIEhvd2V2ZXIsIGlmIHlvdSB0dXJuIHR5cGUgY2hlY2tpbmcgb24sIEB2YWx1ZXtHREJOfQorY29uc2lkZXJzIHR3byB2YXJpYWJsZXMgdHlwZSBlcXVpdmFsZW50IGlmOgorCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorVGhlIHR3byB2YXJpYWJsZXMgYXJlIHN0cnVjdHVyZWQgYW5kIGhhdmUgdGhlIHNhbWUgc3RydWN0dXJlLCB1bmlvbiwgb3IKK2VudW1lcmF0ZWQgdGFnLgorCitAaXRlbQorVGhlIHR3byB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSB0eXBlIG5hbWUsIG9yIHR5cGVzIHRoYXQgaGF2ZSBiZWVuCitkZWNsYXJlZCBlcXVpdmFsZW50IHRocm91Z2ggQGNvZGV7dHlwZWRlZn0uCisKK0BpZ25vcmUKK0BjIGxlYXZpbmcgdGhpcyBvdXQgYmVjYXVzZSBuZWl0aGVyIEogR2lsbW9yZSBub3IgUiBQZXNjaCB1bmRlcnN0YW5kIGl0LgorQGMgRklYTUUtLWJlZXJzPworQGl0ZW0KK1RoZSB0d28gQGNvZGV7c3RydWN0fSwgQGNvZGV7dW5pb259LCBvciBAY29kZXtlbnVtfSB2YXJpYWJsZXMgYXJlCitkZWNsYXJlZCBpbiB0aGUgc2FtZSBkZWNsYXJhdGlvbi4gIChOb3RlOiB0aGlzIG1heSBub3QgYmUgdHJ1ZSBmb3IgYWxsIEMKK2NvbXBpbGVycy4pCitAZW5kIGlnbm9yZQorQGVuZCBpdGVtaXplCisKK1JhbmdlIGNoZWNraW5nLCBpZiB0dXJuZWQgb24sIGlzIGRvbmUgb24gbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMuICBBcnJheQoraW5kaWNlcyBhcmUgbm90IGNoZWNrZWQsIHNpbmNlIHRoZXkgYXJlIG9mdGVuIHVzZWQgdG8gaW5kZXggYSBwb2ludGVyCit0aGF0IGlzIG5vdCBpdHNlbGYgYW4gYXJyYXkuCitAZW5kIGlmc2V0CitAZW5kIGlmY2xlYXIKKworQGlmY2xlYXIgQ09OTFkKK0BpZnNldCBNT0QyCitAbm9kZSBEZWJ1Z2dpbmcgQywgRGVidWdnaW5nIEMgcGx1cyBwbHVzLCBDIENoZWNrcywgQworQHN1YnN1YnNlY3Rpb24gQHZhbHVle0dEQk59IGFuZCBDCitAZW5kIGlmc2V0CitAaWZjbGVhciBNT0QyCitAbm9kZSBEZWJ1Z2dpbmcgQywgRGVidWdnaW5nIEMgcGx1cyBwbHVzLCBDIERlZmF1bHRzLCBTdXBwb3J0CitAc3Vic3Vic2VjdGlvbiBAdmFsdWV7R0RCTn0gYW5kIEMKK0BlbmQgaWZjbGVhcgorQGVuZCBpZmNsZWFyCitAaWZzZXQgQ09OTFkKK0Bub2RlIERlYnVnZ2luZyBDLCAgLCBDIENvbnN0YW50cywgQworQHNlY3Rpb24gQHZhbHVle0dEQk59IGFuZCBDCitAZW5kIGlmc2V0CisKK1RoZSBAY29kZXtzZXQgcHJpbnQgdW5pb259IGFuZCBAY29kZXtzaG93IHByaW50IHVuaW9ufSBjb21tYW5kcyBhcHBseSB0bwordGhlIEBjb2Rle3VuaW9ufSB0eXBlLiAgV2hlbiBzZXQgdG8gQHNhbXB7b259LCBhbnkgQGNvZGV7dW5pb259IHRoYXQgaXMKK2luc2lkZSBhIEBjb2Rle3N0cnVjdH0KK0BpZmNsZWFyIENPTkxZCitvciBAY29kZXtjbGFzc30KK0BlbmQgaWZjbGVhcgoraXMgYWxzbyBwcmludGVkLgorT3RoZXJ3aXNlLCBpdCBhcHBlYXJzIGFzIEBzYW1we0B7Li4uQH19LgorCitUaGUgQGNvZGV7QEB9IG9wZXJhdG9yIGFpZHMgaW4gdGhlIGRlYnVnZ2luZyBvZiBkeW5hbWljIGFycmF5cywgZm9ybWVkCit3aXRoIHBvaW50ZXJzIGFuZCBhIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uLiAgQHhyZWZ7RXhwcmVzc2lvbnMsCissRXhwcmVzc2lvbnN9LgorCitAaWZjbGVhciBDT05MWQorQG1lbnUKKyogRGVidWdnaW5nIEMgcGx1cyBwbHVzOjogICAgICAgCitAZW5kIG1lbnUKKworQGlmc2V0IE1PRDIKK0Bub2RlIERlYnVnZ2luZyBDIHBsdXMgcGx1cywgICwgRGVidWdnaW5nIEMsIEMKK0BzdWJzdWJzZWN0aW9uIEB2YWx1ZXtHREJOfSBmZWF0dXJlcyBmb3IgQysrCitAZW5kIGlmc2V0CitAaWZjbGVhciBNT0QyCitAbm9kZSBEZWJ1Z2dpbmcgQyBwbHVzIHBsdXMsICAsIERlYnVnZ2luZyBDLCBTdXBwb3J0CitAc3Vic3Vic2VjdGlvbiBAdmFsdWV7R0RCTn0gZmVhdHVyZXMgZm9yIEMrKworQGVuZCBpZmNsZWFyCisKK0BjaW5kZXggY29tbWFuZHMgZm9yIEMrKworU29tZSBAdmFsdWV7R0RCTn0gY29tbWFuZHMgYXJlIHBhcnRpY3VsYXJseSB1c2VmdWwgd2l0aCBDKyssIGFuZCBzb21lIGFyZQorZGVzaWduZWQgc3BlY2lmaWNhbGx5IGZvciB1c2Ugd2l0aCBDKysuICBIZXJlIGlzIGEgc3VtbWFyeToKKworQHRhYmxlIEBjb2RlCitAY2luZGV4IGJyZWFrIGluIG92ZXJsb2FkZWQgZnVuY3Rpb25zCitAaXRlbSBAcnticmVha3BvaW50IG1lbnVzfQorV2hlbiB5b3Ugd2FudCBhIGJyZWFrcG9pbnQgaW4gYSBmdW5jdGlvbiB3aG9zZSBuYW1lIGlzIG92ZXJsb2FkZWQsCitAdmFsdWV7R0RCTn0gYnJlYWtwb2ludCBtZW51cyBoZWxwIHlvdSBzcGVjaWZ5IHdoaWNoIGZ1bmN0aW9uIGRlZmluaXRpb24KK3lvdSB3YW50LiAgQHhyZWZ7QnJlYWtwb2ludCBNZW51cywsQnJlYWtwb2ludCBtZW51c30uCisKK0BjaW5kZXggb3ZlcmxvYWRpbmcgaW4gQysrCitAaXRlbSByYnJlYWsgQHZhcntyZWdleH0KK1NldHRpbmcgYnJlYWtwb2ludHMgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucyBpcyBoZWxwZnVsIGZvciBzZXR0aW5nCiticmVha3BvaW50cyBvbiBvdmVybG9hZGVkIGZ1bmN0aW9ucyB0aGF0IGFyZSBub3QgbWVtYmVycyBvZiBhbnkgc3BlY2lhbAorY2xhc3Nlcy4KK0B4cmVme1NldCBCcmVha3MsICxTZXR0aW5nIGJyZWFrcG9pbnRzfS4KKworQGNpbmRleCBDKysgZXhjZXB0aW9uIGhhbmRsaW5nCitAaXRlbSBjYXRjaCB0aHJvdworQGl0ZW14IGNhdGNoIGNhdGNoCitEZWJ1ZyBDKysgZXhjZXB0aW9uIGhhbmRsaW5nIHVzaW5nIHRoZXNlIGNvbW1hbmRzLiAgQHhyZWZ7U2V0CitDYXRjaHBvaW50cywgLCBTZXR0aW5nIGNhdGNocG9pbnRzfS4KKworQGNpbmRleCBpbmhlcml0YW5jZQorQGl0ZW0gcHR5cGUgQHZhcnt0eXBlbmFtZX0KK1ByaW50IGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgYXMgd2VsbCBhcyBvdGhlciBpbmZvcm1hdGlvbiBmb3IgdHlwZQorQHZhcnt0eXBlbmFtZX0uCitAeHJlZntTeW1ib2xzLCAsRXhhbWluaW5nIHRoZSBTeW1ib2wgVGFibGV9LgorCitAY2luZGV4IEMrKyBzeW1ib2wgZGlzcGxheQorQGl0ZW0gc2V0IHByaW50IGRlbWFuZ2xlCitAaXRlbXggc2hvdyBwcmludCBkZW1hbmdsZQorQGl0ZW14IHNldCBwcmludCBhc20tZGVtYW5nbGUKK0BpdGVteCBzaG93IHByaW50IGFzbS1kZW1hbmdsZQorQ29udHJvbCB3aGV0aGVyIEMrKyBzeW1ib2xzIGRpc3BsYXkgaW4gdGhlaXIgc291cmNlIGZvcm0sIGJvdGggd2hlbgorZGlzcGxheWluZyBjb2RlIGFzIEMrKyBzb3VyY2UgYW5kIHdoZW4gZGlzcGxheWluZyBkaXNhc3NlbWJsaWVzLgorQHhyZWZ7UHJpbnQgU2V0dGluZ3MsICxQcmludCBzZXR0aW5nc30uCisKK0BpdGVtIHNldCBwcmludCBvYmplY3QKK0BpdGVteCBzaG93IHByaW50IG9iamVjdAorQ2hvb3NlIHdoZXRoZXIgdG8gcHJpbnQgZGVyaXZlZCAoYWN0dWFsKSBvciBkZWNsYXJlZCB0eXBlcyBvZiBvYmplY3RzLgorQHhyZWZ7UHJpbnQgU2V0dGluZ3MsICxQcmludCBzZXR0aW5nc30uCisKK0BpdGVtIHNldCBwcmludCB2dGJsCitAaXRlbXggc2hvdyBwcmludCB2dGJsCitDb250cm9sIHRoZSBmb3JtYXQgZm9yIHByaW50aW5nIHZpcnR1YWwgZnVuY3Rpb24gdGFibGVzLgorQHhyZWZ7UHJpbnQgU2V0dGluZ3MsICxQcmludCBzZXR0aW5nc30uCitAaWZzZXQgSFBQQQorKFRoZSBAY29kZXt2dGJsfSBjb21tYW5kcyBkbyBub3Qgd29yayBvbiBwcm9ncmFtcyBjb21waWxlZCB3aXRoIHRoZSBIUAorQU5TSSBDKysgY29tcGlsZXIgKEBjb2Rle2FDQ30pLikKKworQGtpbmRleCBzZXQgb3ZlcmxvYWQtcmVzb2x1dGlvbgorQGNpbmRleCBvdmVybG9hZGVkIGZ1bmN0aW9ucworQGl0ZW0gc2V0IG92ZXJsb2FkLXJlc29sdXRpb24gb24KK0VuYWJsZSBvdmVybG9hZCByZXNvbHV0aW9uIGZvciBDKysgZXhwcmVzc2lvbiBldmFsdWF0aW9uLiAgVGhlIGRlZmF1bHQKK2lzIG9uLiAgRm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zLCBAdmFsdWV7R0RCTn0gZXZhbHVhdGVzIHRoZSBhcmd1bWVudHMKK2FuZCBzZWFyY2hlcyBmb3IgYSBmdW5jdGlvbiB3aG9zZSBzaWduYXR1cmUgbWF0Y2hlcyB0aGUgYXJndW1lbnQgdHlwZXMsCit1c2luZyB0aGUgc3RhbmRhcmQgQysrIGNvbnZlcnNpb24gcnVsZXMgKEBweHJlZntDcGx1cyBleHByZXNzaW9ucywgLEMrKworZXhwcmVzc2lvbnN9IGZvciBkZXRhaWxzKS4gIElmIGl0IGNhbm5vdCBmaW5kIGEgbWF0Y2gsIGl0IGVtaXRzIGEKK21lc3NhZ2UuCisKK0BpdGVtIHNldCBvdmVybG9hZC1yZXNvbHV0aW9uIG9mZgorRGlzYWJsZSBvdmVybG9hZCByZXNvbHV0aW9uIGZvciBDKysgZXhwcmVzc2lvbiBldmFsdWF0aW9uLiAgRm9yCitvdmVybG9hZGVkIGZ1bmN0aW9ucyB0aGF0IGFyZSBub3QgY2xhc3MgbWVtYmVyIGZ1bmN0aW9ucywgQHZhbHVle0dEQk59CitjaG9vc2VzIHRoZSBmaXJzdCBmdW5jdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG5hbWUgdGhhdCBpdCBmaW5kcyBpbiB0aGUKK3N5bWJvbCB0YWJsZSwgd2hldGhlciBvciBub3QgaXRzIGFyZ3VtZW50cyBhcmUgb2YgdGhlIGNvcnJlY3QgdHlwZS4gIEZvcgorb3ZlcmxvYWRlZCBmdW5jdGlvbnMgdGhhdCBhcmUgY2xhc3MgbWVtYmVyIGZ1bmN0aW9ucywgQHZhbHVle0dEQk59CitzZWFyY2hlcyBmb3IgYSBmdW5jdGlvbiB3aG9zZSBzaWduYXR1cmUgQGVtcGh7ZXhhY3RseX0gbWF0Y2hlcyB0aGUKK2FyZ3VtZW50IHR5cGVzLgorQGVuZCBpZnNldAorCitAaXRlbSBAcntPdmVybG9hZGVkIHN5bWJvbCBuYW1lc30KK1lvdSBjYW4gc3BlY2lmeSBhIHBhcnRpY3VsYXIgZGVmaW5pdGlvbiBvZiBhbiBvdmVybG9hZGVkIHN5bWJvbCwgdXNpbmcKK3RoZSBzYW1lIG5vdGF0aW9uIHRoYXQgaXMgdXNlZCB0byBkZWNsYXJlIHN1Y2ggc3ltYm9scyBpbiBDKys6IHR5cGUKK0Bjb2Rle0B2YXJ7c3ltYm9sfShAdmFye3R5cGVzfSl9IHJhdGhlciB0aGFuIGp1c3QgQHZhcntzeW1ib2x9LiAgWW91IGNhbgorYWxzbyB1c2UgdGhlIEB2YWx1ZXtHREJOfSBjb21tYW5kLWxpbmUgd29yZCBjb21wbGV0aW9uIGZhY2lsaXRpZXMgdG8gbGlzdCB0aGUKK2F2YWlsYWJsZSBjaG9pY2VzLCBvciB0byBmaW5pc2ggdGhlIHR5cGUgbGlzdCBmb3IgeW91LgorQHhyZWZ7Q29tcGxldGlvbiwsIENvbW1hbmQgY29tcGxldGlvbn0sIGZvciBkZXRhaWxzIG9uIGhvdyB0byBkbyB0aGlzLgorQGVuZCB0YWJsZQorQGlmY2xlYXIgTU9EMgorQGMgY2FuY2VscyAicmFpc2VzZWN0aW9ucyIgdW5kZXIgc2FtZSBjb25kaXRpb25zIG5lYXIgYmduIG9mIGNoYXB0ZXIKK0Bsb3dlcnNlY3Rpb25zCitAZW5kIGlmY2xlYXIKKworQGlmc2V0IE1PRDIKK0Bub2RlIE1vZHVsYS0yLCAgLEMgLCBTdXBwb3J0CitAc3Vic2VjdGlvbiBNb2R1bGEtMgorQGNpbmRleCBNb2R1bGEtMgorCitUaGUgZXh0ZW5zaW9ucyBtYWRlIHRvIEB2YWx1ZXtHREJOfSB0byBzdXBwb3J0IE1vZHVsYS0yIG9ubHkgc3VwcG9ydAorb3V0cHV0IGZyb20gdGhlIEBzY3tnbnV9IE1vZHVsYS0yIGNvbXBpbGVyICh3aGljaCBpcyBjdXJyZW50bHkgYmVpbmcKK2RldmVsb3BlZCkuICBPdGhlciBNb2R1bGEtMiBjb21waWxlcnMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLCBhbmQKK2F0dGVtcHRpbmcgdG8gZGVidWcgZXhlY3V0YWJsZXMgcHJvZHVjZWQgYnkgdGhlbSBpcyBtb3N0IGxpa2VseQordG8gZ2l2ZSBhbiBlcnJvciBhcyBAdmFsdWV7R0RCTn0gcmVhZHMgaW4gdGhlIGV4ZWN1dGFibGUncyBzeW1ib2wKK3RhYmxlLgorCitAY2luZGV4IGV4cHJlc3Npb25zIGluIE1vZHVsYS0yCitAbWVudQorKiBNMiBPcGVyYXRvcnM6OiAgICAgICAgICAgICAgICBCdWlsdC1pbiBvcGVyYXRvcnMKKyogQnVpbHQtSW4gRnVuYy9Qcm9jOjogICAgICAgICAgQnVpbHQtaW4gZnVuY3Rpb25zIGFuZCBwcm9jZWR1cmVzCisqIE0yIENvbnN0YW50czo6ICAgICAgICAgICAgICAgIE1vZHVsYS0yIGNvbnN0YW50cworKiBNMiBEZWZhdWx0czo6ICAgICAgICAgICAgICAgICBEZWZhdWx0IHNldHRpbmdzIGZvciBNb2R1bGEtMgorKiBEZXZpYXRpb25zOjogICAgICAgICAgICAgICAgICBEZXZpYXRpb25zIGZyb20gc3RhbmRhcmQgTW9kdWxhLTIKKyogTTIgQ2hlY2tzOjogICAgICAgICAgICAgICAgICAgTW9kdWxhLTIgdHlwZSBhbmQgcmFuZ2UgY2hlY2tzCisqIE0yIFNjb3BlOjogICAgICAgICAgICAgICAgICAgIFRoZSBzY29wZSBvcGVyYXRvcnMgQGNvZGV7Ojp9IGFuZCBAY29kZXsufQorKiBHREIvTTI6OiAgICAgICAgICAgICAgICAgICAgICBAdmFsdWV7R0RCTn0gYW5kIE1vZHVsYS0yCitAZW5kIG1lbnUKKworQG5vZGUgTTIgT3BlcmF0b3JzLCBCdWlsdC1JbiBGdW5jL1Byb2MsIE1vZHVsYS0yLCBNb2R1bGEtMgorQHN1YnN1YnNlY3Rpb24gT3BlcmF0b3JzCitAY2luZGV4IE1vZHVsYS0yIG9wZXJhdG9ycworCitPcGVyYXRvcnMgbXVzdCBiZSBkZWZpbmVkIG9uIHZhbHVlcyBvZiBzcGVjaWZpYyB0eXBlcy4gIEZvciBpbnN0YW5jZSwKK0Bjb2Rleyt9IGlzIGRlZmluZWQgb24gbnVtYmVycywgYnV0IG5vdCBvbiBzdHJ1Y3R1cmVzLiAgT3BlcmF0b3JzIGFyZQorb2Z0ZW4gZGVmaW5lZCBvbiBncm91cHMgb2YgdHlwZXMuICBGb3IgdGhlIHB1cnBvc2VzIG9mIE1vZHVsYS0yLCB0aGUKK2ZvbGxvd2luZyBkZWZpbml0aW9ucyBob2xkOgorCitAaXRlbWl6ZSBAYnVsbGV0CisKK0BpdGVtCitAZW1waHtJbnRlZ3JhbCB0eXBlc30gY29uc2lzdCBvZiBAY29kZXtJTlRFR0VSfSwgQGNvZGV7Q0FSRElOQUx9LCBhbmQKK3RoZWlyIHN1YnJhbmdlcy4KKworQGl0ZW0KK0BlbXBoe0NoYXJhY3RlciB0eXBlc30gY29uc2lzdCBvZiBAY29kZXtDSEFSfSBhbmQgaXRzIHN1YnJhbmdlcy4KKworQGl0ZW0KK0BlbXBoe0Zsb2F0aW5nLXBvaW50IHR5cGVzfSBjb25zaXN0IG9mIEBjb2Rle1JFQUx9LgorCitAaXRlbQorQGVtcGh7UG9pbnRlciB0eXBlc30gY29uc2lzdCBvZiBhbnl0aGluZyBkZWNsYXJlZCBhcyBAY29kZXtQT0lOVEVSIFRPCitAdmFye3R5cGV9fS4KKworQGl0ZW0KK0BlbXBoe1NjYWxhciB0eXBlc30gY29uc2lzdCBvZiBhbGwgb2YgdGhlIGFib3ZlLgorCitAaXRlbQorQGVtcGh7U2V0IHR5cGVzfSBjb25zaXN0IG9mIEBjb2Rle1NFVH0gYW5kIEBjb2Rle0JJVFNFVH0gdHlwZXMuCisKK0BpdGVtCitAZW1waHtCb29sZWFuIHR5cGVzfSBjb25zaXN0IG9mIEBjb2Rle0JPT0xFQU59LgorQGVuZCBpdGVtaXplCisKK0Bub2luZGVudAorVGhlIGZvbGxvd2luZyBvcGVyYXRvcnMgYXJlIHN1cHBvcnRlZCwgYW5kIGFwcGVhciBpbiBvcmRlciBvZgoraW5jcmVhc2luZyBwcmVjZWRlbmNlOgorCitAdGFibGUgQGNvZGUKK0BpdGVtICwKK0Z1bmN0aW9uIGFyZ3VtZW50IG9yIGFycmF5IGluZGV4IHNlcGFyYXRvci4KKworQGl0ZW0gOj0KK0Fzc2lnbm1lbnQuICBUaGUgdmFsdWUgb2YgQHZhcnt2YXJ9IEBjb2Rlezo9fSBAdmFye3ZhbHVlfSBpcworQHZhcnt2YWx1ZX0uCisKK0BpdGVtIDxAcnssIH0+CitMZXNzIHRoYW4sIGdyZWF0ZXIgdGhhbiBvbiBpbnRlZ3JhbCwgZmxvYXRpbmctcG9pbnQsIG9yIGVudW1lcmF0ZWQKK3R5cGVzLgorCitAaXRlbSA8PUByeywgfT49CitMZXNzIHRoYW4sIGdyZWF0ZXIgdGhhbiwgbGVzcyB0aGFuIG9yIGVxdWFsIHRvLCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KK29uIGludGVncmFsLCBmbG9hdGluZy1wb2ludCBhbmQgZW51bWVyYXRlZCB0eXBlcywgb3Igc2V0IGluY2x1c2lvbiBvbgorc2V0IHR5cGVzLiAgU2FtZSBwcmVjZWRlbmNlIGFzIEBjb2Rlezx9LgorCitAaXRlbSA9QHJ7LCB9PD5AcnssIH0jCitFcXVhbGl0eSBhbmQgdHdvIHdheXMgb2YgZXhwcmVzc2luZyBpbmVxdWFsaXR5LCB2YWxpZCBvbiBzY2FsYXIgdHlwZXMuCitTYW1lIHByZWNlZGVuY2UgYXMgQGNvZGV7PH0uICBJbiBAdmFsdWV7R0RCTn0gc2NyaXB0cywgb25seSBAY29kZXs8Pn0gaXMKK2F2YWlsYWJsZSBmb3IgaW5lcXVhbGl0eSwgc2luY2UgQGNvZGV7I30gY29uZmxpY3RzIHdpdGggdGhlIHNjcmlwdAorY29tbWVudCBjaGFyYWN0ZXIuCisKK0BpdGVtIElOCitTZXQgbWVtYmVyc2hpcC4gIERlZmluZWQgb24gc2V0IHR5cGVzIGFuZCB0aGUgdHlwZXMgb2YgdGhlaXIgbWVtYmVycy4KK1NhbWUgcHJlY2VkZW5jZSBhcyBAY29kZXs8fS4KKworQGl0ZW0gT1IKK0Jvb2xlYW4gZGlzanVuY3Rpb24uICBEZWZpbmVkIG9uIGJvb2xlYW4gdHlwZXMuCisKK0BpdGVtIEFOREByeywgfSYKK0Jvb2xlYW4gY29uanVjdGlvbi4gIERlZmluZWQgb24gYm9vbGVhbiB0eXBlcy4KKworQGl0ZW0gQEAKK1RoZSBAdmFsdWV7R0RCTn0gYGBhcnRpZmljaWFsIGFycmF5Jycgb3BlcmF0b3IgKEBweHJlZntFeHByZXNzaW9ucywgLEV4cHJlc3Npb25zfSkuCisKK0BpdGVtICtAcnssIH0tCitBZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24gb24gaW50ZWdyYWwgYW5kIGZsb2F0aW5nLXBvaW50IHR5cGVzLCBvciB1bmlvbgorYW5kIGRpZmZlcmVuY2Ugb24gc2V0IHR5cGVzLgorCitAaXRlbSAqCitNdWx0aXBsaWNhdGlvbiBvbiBpbnRlZ3JhbCBhbmQgZmxvYXRpbmctcG9pbnQgdHlwZXMsIG9yIHNldCBpbnRlcnNlY3Rpb24KK29uIHNldCB0eXBlcy4KKworQGl0ZW0gLworRGl2aXNpb24gb24gZmxvYXRpbmctcG9pbnQgdHlwZXMsIG9yIHN5bW1ldHJpYyBzZXQgZGlmZmVyZW5jZSBvbiBzZXQKK3R5cGVzLiAgU2FtZSBwcmVjZWRlbmNlIGFzIEBjb2Rleyp9LgorCitAaXRlbSBESVZAcnssIH1NT0QKK0ludGVnZXIgZGl2aXNpb24gYW5kIHJlbWFpbmRlci4gIERlZmluZWQgb24gaW50ZWdyYWwgdHlwZXMuICBTYW1lCitwcmVjZWRlbmNlIGFzIEBjb2Rleyp9LgorCitAaXRlbSAtCitOZWdhdGl2ZS4gRGVmaW5lZCBvbiBAY29kZXtJTlRFR0VSfSBhbmQgQGNvZGV7UkVBTH0gZGF0YS4KKworQGl0ZW0gXgorUG9pbnRlciBkZXJlZmVyZW5jaW5nLiAgRGVmaW5lZCBvbiBwb2ludGVyIHR5cGVzLgorCitAaXRlbSBOT1QKK0Jvb2xlYW4gbmVnYXRpb24uICBEZWZpbmVkIG9uIGJvb2xlYW4gdHlwZXMuICBTYW1lIHByZWNlZGVuY2UgYXMKK0Bjb2Rle159LgorCitAaXRlbSAuCitAY29kZXtSRUNPUkR9IGZpZWxkIHNlbGVjdG9yLiAgRGVmaW5lZCBvbiBAY29kZXtSRUNPUkR9IGRhdGEuICBTYW1lCitwcmVjZWRlbmNlIGFzIEBjb2Rle159LgorCitAaXRlbSBbXQorQXJyYXkgaW5kZXhpbmcuICBEZWZpbmVkIG9uIEBjb2Rle0FSUkFZfSBkYXRhLiAgU2FtZSBwcmVjZWRlbmNlIGFzIEBjb2Rle159LgorCitAaXRlbSAoKQorUHJvY2VkdXJlIGFyZ3VtZW50IGxpc3QuICBEZWZpbmVkIG9uIEBjb2Rle1BST0NFRFVSRX0gb2JqZWN0cy4gIFNhbWUgcHJlY2VkZW5jZQorYXMgQGNvZGV7Xn0uCisKK0BpdGVtIDo6QHJ7LCB9LgorQHZhbHVle0dEQk59IGFuZCBNb2R1bGEtMiBzY29wZSBvcGVyYXRvcnMuCitAZW5kIHRhYmxlCisKK0BxdW90YXRpb24KK0BlbXBoe1dhcm5pbmc6fSBTZXRzIGFuZCB0aGVpciBvcGVyYXRpb25zIGFyZSBub3QgeWV0IHN1cHBvcnRlZCwgc28gQHZhbHVle0dEQk59Cit0cmVhdHMgdGhlIHVzZSBvZiB0aGUgb3BlcmF0b3IgQGNvZGV7SU59LCBvciB0aGUgdXNlIG9mIG9wZXJhdG9ycworQGNvZGV7K30sIEBjb2Rley19LCBAY29kZXsqfSwgQGNvZGV7L30sIEBjb2Rlez19LCAsIEBjb2Rlezw+fSwgQGNvZGV7I30sCitAY29kZXs8PX0sIGFuZCBAY29kZXs+PX0gb24gc2V0cyBhcyBhbiBlcnJvci4KK0BlbmQgcXVvdGF0aW9uCisKK0BjaW5kZXggTW9kdWxhLTIgYnVpbHQtaW5zCitAbm9kZSBCdWlsdC1JbiBGdW5jL1Byb2MsIE0yIENvbnN0YW50cywgTTIgT3BlcmF0b3JzLCBNb2R1bGEtMgorQHN1YnN1YnNlY3Rpb24gQnVpbHQtaW4gZnVuY3Rpb25zIGFuZCBwcm9jZWR1cmVzCisKK01vZHVsYS0yIGFsc28gbWFrZXMgYXZhaWxhYmxlIHNldmVyYWwgYnVpbHQtaW4gcHJvY2VkdXJlcyBhbmQgZnVuY3Rpb25zLgorSW4gZGVzY3JpYmluZyB0aGVzZSwgdGhlIGZvbGxvd2luZyBtZXRhdmFyaWFibGVzIGFyZSB1c2VkOgorCitAdGFibGUgQHZhcgorCitAaXRlbSBhCityZXByZXNlbnRzIGFuIEBjb2Rle0FSUkFZfSB2YXJpYWJsZS4KKworQGl0ZW0gYworcmVwcmVzZW50cyBhIEBjb2Rle0NIQVJ9IGNvbnN0YW50IG9yIHZhcmlhYmxlLgorCitAaXRlbSBpCityZXByZXNlbnRzIGEgdmFyaWFibGUgb3IgY29uc3RhbnQgb2YgaW50ZWdyYWwgdHlwZS4KKworQGl0ZW0gbQorcmVwcmVzZW50cyBhbiBpZGVudGlmaWVyIHRoYXQgYmVsb25ncyB0byBhIHNldC4gIEdlbmVyYWxseSB1c2VkIGluIHRoZQorc2FtZSBmdW5jdGlvbiB3aXRoIHRoZSBtZXRhdmFyaWFibGUgQHZhcntzfS4gIFRoZSB0eXBlIG9mIEB2YXJ7c30gc2hvdWxkCitiZSBAY29kZXtTRVQgT0YgQHZhcnttdHlwZX19ICh3aGVyZSBAdmFye210eXBlfSBpcyB0aGUgdHlwZSBvZiBAdmFye219KS4KKworQGl0ZW0gbgorcmVwcmVzZW50cyBhIHZhcmlhYmxlIG9yIGNvbnN0YW50IG9mIGludGVncmFsIG9yIGZsb2F0aW5nLXBvaW50IHR5cGUuCisKK0BpdGVtIHIKK3JlcHJlc2VudHMgYSB2YXJpYWJsZSBvciBjb25zdGFudCBvZiBmbG9hdGluZy1wb2ludCB0eXBlLgorCitAaXRlbSB0CityZXByZXNlbnRzIGEgdHlwZS4KKworQGl0ZW0gdgorcmVwcmVzZW50cyBhIHZhcmlhYmxlLgorCitAaXRlbSB4CityZXByZXNlbnRzIGEgdmFyaWFibGUgb3IgY29uc3RhbnQgb2Ygb25lIG9mIG1hbnkgdHlwZXMuICBTZWUgdGhlCitleHBsYW5hdGlvbiBvZiB0aGUgZnVuY3Rpb24gZm9yIGRldGFpbHMuCitAZW5kIHRhYmxlCisKK0FsbCBNb2R1bGEtMiBidWlsdC1pbiBwcm9jZWR1cmVzIGFsc28gcmV0dXJuIGEgcmVzdWx0LCBkZXNjcmliZWQgYmVsb3cuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gQUJTKEB2YXJ7bn0pCitSZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBAdmFye259LgorCitAaXRlbSBDQVAoQHZhcntjfSkKK0lmIEB2YXJ7Y30gaXMgYSBsb3dlciBjYXNlIGxldHRlciwgaXQgcmV0dXJucyBpdHMgdXBwZXIgY2FzZQorZXF1aXZhbGVudCwgb3RoZXJ3aXNlIGl0IHJldHVybnMgaXRzIGFyZ3VtZW50CisKK0BpdGVtIENIUihAdmFye2l9KQorUmV0dXJucyB0aGUgY2hhcmFjdGVyIHdob3NlIG9yZGluYWwgdmFsdWUgaXMgQHZhcntpfS4KKworQGl0ZW0gREVDKEB2YXJ7dn0pCitEZWNyZW1lbnRzIHRoZSB2YWx1ZSBpbiB0aGUgdmFyaWFibGUgQHZhcnt2fS4gIFJldHVybnMgdGhlIG5ldyB2YWx1ZS4KKworQGl0ZW0gREVDKEB2YXJ7dn0sQHZhcntpfSkKK0RlY3JlbWVudHMgdGhlIHZhbHVlIGluIHRoZSB2YXJpYWJsZSBAdmFye3Z9IGJ5IEB2YXJ7aX0uICBSZXR1cm5zIHRoZQorbmV3IHZhbHVlLgorCitAaXRlbSBFWENMKEB2YXJ7bX0sQHZhcntzfSkKK1JlbW92ZXMgdGhlIGVsZW1lbnQgQHZhcnttfSBmcm9tIHRoZSBzZXQgQHZhcntzfS4gIFJldHVybnMgdGhlIG5ldworc2V0LgorCitAaXRlbSBGTE9BVChAdmFye2l9KQorUmV0dXJucyB0aGUgZmxvYXRpbmcgcG9pbnQgZXF1aXZhbGVudCBvZiB0aGUgaW50ZWdlciBAdmFye2l9LgorCitAaXRlbSBISUdIKEB2YXJ7YX0pCitSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBtZW1iZXIgb2YgQHZhcnthfS4KKworQGl0ZW0gSU5DKEB2YXJ7dn0pCitJbmNyZW1lbnRzIHRoZSB2YWx1ZSBpbiB0aGUgdmFyaWFibGUgQHZhcnt2fS4gIFJldHVybnMgdGhlIG5ldyB2YWx1ZS4KKworQGl0ZW0gSU5DKEB2YXJ7dn0sQHZhcntpfSkKK0luY3JlbWVudHMgdGhlIHZhbHVlIGluIHRoZSB2YXJpYWJsZSBAdmFye3Z9IGJ5IEB2YXJ7aX0uICBSZXR1cm5zIHRoZQorbmV3IHZhbHVlLgorCitAaXRlbSBJTkNMKEB2YXJ7bX0sQHZhcntzfSkKK0FkZHMgdGhlIGVsZW1lbnQgQHZhcnttfSB0byB0aGUgc2V0IEB2YXJ7c30gaWYgaXQgaXMgbm90IGFscmVhZHkKK3RoZXJlLiAgUmV0dXJucyB0aGUgbmV3IHNldC4KKworQGl0ZW0gTUFYKEB2YXJ7dH0pCitSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSB0eXBlIEB2YXJ7dH0uCisKK0BpdGVtIE1JTihAdmFye3R9KQorUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgdHlwZSBAdmFye3R9LgorCitAaXRlbSBPREQoQHZhcntpfSkKK1JldHVybnMgYm9vbGVhbiBUUlVFIGlmIEB2YXJ7aX0gaXMgYW4gb2RkIG51bWJlci4KKworQGl0ZW0gT1JEKEB2YXJ7eH0pCitSZXR1cm5zIHRoZSBvcmRpbmFsIHZhbHVlIG9mIGl0cyBhcmd1bWVudC4gIEZvciBleGFtcGxlLCB0aGUgb3JkaW5hbAordmFsdWUgb2YgYSBjaGFyYWN0ZXIgaXMgaXRzIEFTQ0lJIHZhbHVlIChvbiBtYWNoaW5lcyBzdXBwb3J0aW5nIHRoZQorQVNDSUkgY2hhcmFjdGVyIHNldCkuICBAdmFye3h9IG11c3QgYmUgb2YgYW4gb3JkZXJlZCB0eXBlLCB3aGljaCBpbmNsdWRlCitpbnRlZ3JhbCwgY2hhcmFjdGVyIGFuZCBlbnVtZXJhdGVkIHR5cGVzLgorCitAaXRlbSBTSVpFKEB2YXJ7eH0pCitSZXR1cm5zIHRoZSBzaXplIG9mIGl0cyBhcmd1bWVudC4gIEB2YXJ7eH0gY2FuIGJlIGEgdmFyaWFibGUgb3IgYSB0eXBlLgorCitAaXRlbSBUUlVOQyhAdmFye3J9KQorUmV0dXJucyB0aGUgaW50ZWdyYWwgcGFydCBvZiBAdmFye3J9LgorCitAaXRlbSBWQUwoQHZhcnt0fSxAdmFye2l9KQorUmV0dXJucyB0aGUgbWVtYmVyIG9mIHRoZSB0eXBlIEB2YXJ7dH0gd2hvc2Ugb3JkaW5hbCB2YWx1ZSBpcyBAdmFye2l9LgorQGVuZCB0YWJsZQorCitAcXVvdGF0aW9uCitAZW1waHtXYXJuaW5nOn0gIFNldHMgYW5kIHRoZWlyIG9wZXJhdGlvbnMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLCBzbworQHZhbHVle0dEQk59IHRyZWF0cyB0aGUgdXNlIG9mIHByb2NlZHVyZXMgQGNvZGV7SU5DTH0gYW5kIEBjb2Rle0VYQ0x9IGFzCithbiBlcnJvci4KK0BlbmQgcXVvdGF0aW9uCisKK0BjaW5kZXggTW9kdWxhLTIgY29uc3RhbnRzCitAbm9kZSBNMiBDb25zdGFudHMsIE0yIERlZmF1bHRzLCBCdWlsdC1JbiBGdW5jL1Byb2MsIE1vZHVsYS0yCitAc3Vic3Vic2VjdGlvbiBDb25zdGFudHMKKworQHZhbHVle0dEQk59IGFsbG93cyB5b3UgdG8gZXhwcmVzcyB0aGUgY29uc3RhbnRzIG9mIE1vZHVsYS0yIGluIHRoZSBmb2xsb3dpbmcKK3dheXM6CisKK0BpdGVtaXplIEBidWxsZXQKKworQGl0ZW0KK0ludGVnZXIgY29uc3RhbnRzIGFyZSBzaW1wbHkgYSBzZXF1ZW5jZSBvZiBkaWdpdHMuICBXaGVuIHVzZWQgaW4gYW4KK2V4cHJlc3Npb24sIGEgY29uc3RhbnQgaXMgaW50ZXJwcmV0ZWQgdG8gYmUgdHlwZS1jb21wYXRpYmxlIHdpdGggdGhlCityZXN0IG9mIHRoZSBleHByZXNzaW9uLiAgSGV4YWRlY2ltYWwgaW50ZWdlcnMgYXJlIHNwZWNpZmllZCBieSBhCit0cmFpbGluZyBAc2FtcHtIfSwgYW5kIG9jdGFsIGludGVnZXJzIGJ5IGEgdHJhaWxpbmcgQHNhbXB7Qn0uCisKK0BpdGVtCitGbG9hdGluZyBwb2ludCBjb25zdGFudHMgYXBwZWFyIGFzIGEgc2VxdWVuY2Ugb2YgZGlnaXRzLCBmb2xsb3dlZCBieSBhCitkZWNpbWFsIHBvaW50IGFuZCBhbm90aGVyIHNlcXVlbmNlIG9mIGRpZ2l0cy4gIEFuIG9wdGlvbmFsIGV4cG9uZW50IGNhbgordGhlbiBiZSBzcGVjaWZpZWQsIGluIHRoZSBmb3JtIEBzYW1we0VAcntbfStAcnt8fS1AcntdfUB2YXJ7bm5ufX0sIHdoZXJlCitAc2FtcHtAcntbfStAcnt8fS1AcntdfUB2YXJ7bm5ufX0gaXMgdGhlIGRlc2lyZWQgZXhwb25lbnQuICBBbGwgb2YgdGhlCitkaWdpdHMgb2YgdGhlIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG11c3QgYmUgdmFsaWQgZGVjaW1hbCAoYmFzZSAxMCkKK2RpZ2l0cy4KKworQGl0ZW0KK0NoYXJhY3RlciBjb25zdGFudHMgY29uc2lzdCBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIgZW5jbG9zZWQgYnkgYSBwYWlyIG9mCitsaWtlIHF1b3RlcywgZWl0aGVyIHNpbmdsZSAoQGNvZGV7J30pIG9yIGRvdWJsZSAoQGNvZGV7In0pLiAgVGhleSBtYXkKK2Fsc28gYmUgZXhwcmVzc2VkIGJ5IHRoZWlyIG9yZGluYWwgdmFsdWUgKHRoZWlyIEFTQ0lJIHZhbHVlLCB1c3VhbGx5KQorZm9sbG93ZWQgYnkgYSBAc2FtcHtDfS4KKworQGl0ZW0KK1N0cmluZyBjb25zdGFudHMgY29uc2lzdCBvZiBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgZW5jbG9zZWQgYnkgYQorcGFpciBvZiBsaWtlIHF1b3RlcywgZWl0aGVyIHNpbmdsZSAoQGNvZGV7J30pIG9yIGRvdWJsZSAoQGNvZGV7In0pLgorRXNjYXBlIHNlcXVlbmNlcyBpbiB0aGUgc3R5bGUgb2YgQyBhcmUgYWxzbyBhbGxvd2VkLiAgQHhyZWZ7QworQ29uc3RhbnRzLCAsQyBhbmQgQysrIGNvbnN0YW50c30sIGZvciBhIGJyaWVmIGV4cGxhbmF0aW9uIG9mIGVzY2FwZQorc2VxdWVuY2VzLgorCitAaXRlbQorRW51bWVyYXRlZCBjb25zdGFudHMgY29uc2lzdCBvZiBhbiBlbnVtZXJhdGVkIGlkZW50aWZpZXIuCisKK0BpdGVtCitCb29sZWFuIGNvbnN0YW50cyBjb25zaXN0IG9mIHRoZSBpZGVudGlmaWVycyBAY29kZXtUUlVFfSBhbmQKK0Bjb2Rle0ZBTFNFfS4KKworQGl0ZW0KK1BvaW50ZXIgY29uc3RhbnRzIGNvbnNpc3Qgb2YgaW50ZWdyYWwgdmFsdWVzIG9ubHkuCisKK0BpdGVtCitTZXQgY29uc3RhbnRzIGFyZSBub3QgeWV0IHN1cHBvcnRlZC4KK0BlbmQgaXRlbWl6ZQorCitAbm9kZSBNMiBEZWZhdWx0cywgRGV2aWF0aW9ucywgTTIgQ29uc3RhbnRzLCBNb2R1bGEtMgorQHN1YnN1YnNlY3Rpb24gTW9kdWxhLTIgZGVmYXVsdHMKK0BjaW5kZXggTW9kdWxhLTIgZGVmYXVsdHMKKworSWYgdHlwZSBhbmQgcmFuZ2UgY2hlY2tpbmcgYXJlIHNldCBhdXRvbWF0aWNhbGx5IGJ5IEB2YWx1ZXtHREJOfSwgdGhleQorYm90aCBkZWZhdWx0IHRvIEBjb2Rle29ufSB3aGVuZXZlciB0aGUgd29ya2luZyBsYW5ndWFnZSBjaGFuZ2VzIHRvCitNb2R1bGEtMi4gIFRoaXMgaGFwcGVucyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgeW91LCBvciBAdmFsdWV7R0RCTn0sCitzZWxlY3RlZCB0aGUgd29ya2luZyBsYW5ndWFnZS4KKworSWYgeW91IGFsbG93IEB2YWx1ZXtHREJOfSB0byBzZXQgdGhlIGxhbmd1YWdlIGF1dG9tYXRpY2FsbHksIHRoZW4gZW50ZXJpbmcKK2NvZGUgY29tcGlsZWQgZnJvbSBhIGZpbGUgd2hvc2UgbmFtZSBlbmRzIHdpdGggQGZpbGV7Lm1vZH0gc2V0cyB0aGUKK3dvcmtpbmcgbGFuZ3VhZ2UgdG8gTW9kdWxhLTIuIEB4cmVme0F1dG9tYXRpY2FsbHksICxIYXZpbmcgQHZhbHVle0dEQk59IHNldAordGhlIGxhbmd1YWdlIGF1dG9tYXRpY2FsbHl9LCBmb3IgZnVydGhlciBkZXRhaWxzLgorCitAbm9kZSBEZXZpYXRpb25zLCBNMiBDaGVja3MsIE0yIERlZmF1bHRzLCBNb2R1bGEtMgorQHN1YnN1YnNlY3Rpb24gRGV2aWF0aW9ucyBmcm9tIHN0YW5kYXJkIE1vZHVsYS0yCitAY2luZGV4IE1vZHVsYS0yLCBkZXZpYXRpb25zIGZyb20KKworQSBmZXcgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byBtYWtlIE1vZHVsYS0yIHByb2dyYW1zIGVhc2llciB0byBkZWJ1Zy4KK1RoaXMgaXMgZG9uZSBwcmltYXJpbHkgdmlhIGxvb3NlbmluZyBpdHMgdHlwZSBzdHJpY3RuZXNzOgorCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorVW5saWtlIGluIHN0YW5kYXJkIE1vZHVsYS0yLCBwb2ludGVyIGNvbnN0YW50cyBjYW4gYmUgZm9ybWVkIGJ5CitpbnRlZ2Vycy4gIFRoaXMgYWxsb3dzIHlvdSB0byBtb2RpZnkgcG9pbnRlciB2YXJpYWJsZXMgZHVyaW5nCitkZWJ1Z2dpbmcuICAoSW4gc3RhbmRhcmQgTW9kdWxhLTIsIHRoZSBhY3R1YWwgYWRkcmVzcyBjb250YWluZWQgaW4gYQorcG9pbnRlciB2YXJpYWJsZSBpcyBoaWRkZW4gZnJvbSB5b3U7IGl0IGNhbiBvbmx5IGJlIG1vZGlmaWVkCit0aHJvdWdoIGRpcmVjdCBhc3NpZ25tZW50IHRvIGFub3RoZXIgcG9pbnRlciB2YXJpYWJsZSBvciBleHByZXNzaW9uIHRoYXQKK3JldHVybmVkIGEgcG9pbnRlci4pCisKK0BpdGVtCitDIGVzY2FwZSBzZXF1ZW5jZXMgY2FuIGJlIHVzZWQgaW4gc3RyaW5ncyBhbmQgY2hhcmFjdGVycyB0byByZXByZXNlbnQKK25vbi1wcmludGFibGUgY2hhcmFjdGVycy4gIEB2YWx1ZXtHREJOfSBwcmludHMgb3V0IHN0cmluZ3Mgd2l0aCB0aGVzZQorZXNjYXBlIHNlcXVlbmNlcyBlbWJlZGRlZC4gIFNpbmdsZSBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMgYXJlCitwcmludGVkIHVzaW5nIHRoZSBAc2FtcHtDSFIoQHZhcntubm59KX0gZm9ybWF0LgorCitAaXRlbQorVGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IgKEBjb2Rlezo9fSkgcmV0dXJucyB0aGUgdmFsdWUgb2YgaXRzIHJpZ2h0LWhhbmQKK2FyZ3VtZW50LgorCitAaXRlbQorQWxsIGJ1aWx0LWluIHByb2NlZHVyZXMgYm90aCBtb2RpZnkgQGVtcGh7YW5kfSByZXR1cm4gdGhlaXIgYXJndW1lbnQuCitAZW5kIGl0ZW1pemUKKworQG5vZGUgTTIgQ2hlY2tzLCBNMiBTY29wZSwgRGV2aWF0aW9ucywgTW9kdWxhLTIKK0BzdWJzdWJzZWN0aW9uIE1vZHVsYS0yIHR5cGUgYW5kIHJhbmdlIGNoZWNrcworQGNpbmRleCBNb2R1bGEtMiBjaGVja3MKKworQHF1b3RhdGlvbgorQGVtcGh7V2FybmluZzp9IGluIHRoaXMgcmVsZWFzZSwgQHZhbHVle0dEQk59IGRvZXMgbm90IHlldCBwZXJmb3JtIHR5cGUgb3IKK3JhbmdlIGNoZWNraW5nLgorQGVuZCBxdW90YXRpb24KK0BjIEZJWE1FIHJlbW92ZSB3YXJuaW5nIHdoZW4gdHlwZS9yYW5nZSBjaGVja3MgYWRkZWQKKworQHZhbHVle0dEQk59IGNvbnNpZGVycyB0d28gTW9kdWxhLTIgdmFyaWFibGVzIHR5cGUgZXF1aXZhbGVudCBpZjoKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK1RoZXkgYXJlIG9mIHR5cGVzIHRoYXQgaGF2ZSBiZWVuIGRlY2xhcmVkIGVxdWl2YWxlbnQgdmlhIGEgQGNvZGV7VFlQRQorQHZhcnt0MX0gPSBAdmFye3QyfX0gc3RhdGVtZW50CisKK0BpdGVtCitUaGV5IGhhdmUgYmVlbiBkZWNsYXJlZCBvbiB0aGUgc2FtZSBsaW5lLiAgKE5vdGU6ICBUaGlzIGlzIHRydWUgb2YgdGhlCitAc2N7Z251fSBNb2R1bGEtMiBjb21waWxlciwgYnV0IGl0IG1heSBub3QgYmUgdHJ1ZSBvZiBvdGhlciBjb21waWxlcnMuKQorQGVuZCBpdGVtaXplCisKK0FzIGxvbmcgYXMgdHlwZSBjaGVja2luZyBpcyBlbmFibGVkLCBhbnkgYXR0ZW1wdCB0byBjb21iaW5lIHZhcmlhYmxlcword2hvc2UgdHlwZXMgYXJlIG5vdCBlcXVpdmFsZW50IGlzIGFuIGVycm9yLgorCitSYW5nZSBjaGVja2luZyBpcyBkb25lIG9uIGFsbCBtYXRoZW1hdGljYWwgb3BlcmF0aW9ucywgYXNzaWdubWVudCwgYXJyYXkKK2luZGV4IGJvdW5kcywgYW5kIGFsbCBidWlsdC1pbiBmdW5jdGlvbnMgYW5kIHByb2NlZHVyZXMuCisKK0Bub2RlIE0yIFNjb3BlLCBHREIvTTIsIE0yIENoZWNrcywgTW9kdWxhLTIKK0BzdWJzdWJzZWN0aW9uIFRoZSBzY29wZSBvcGVyYXRvcnMgQGNvZGV7Ojp9IGFuZCBAY29kZXsufQorQGNpbmRleCBzY29wZQorQGtpbmRleCAuCitAY2luZGV4IGNvbG9uLCBkb3VibGVkIGFzIHNjb3BlIG9wZXJhdG9yCitAaWZpbmZvCitAa2luZGV4IGNvbG9uLWNvbG9uCitAYyBJbmZvIGNhbm5vdCBoYW5kbGUgOjogYnV0IFRlWCBjYW4uCitAZW5kIGlmaW5mbworQGlmdGV4CitAa2luZGV4IDo6CitAZW5kIGlmdGV4CisKK1RoZXJlIGFyZSBhIGZldyBzdWJ0bGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgTW9kdWxhLTIgc2NvcGUgb3BlcmF0b3IKKyhAY29kZXsufSkgYW5kIHRoZSBAdmFsdWV7R0RCTn0gc2NvcGUgb3BlcmF0b3IgKEBjb2Rlezo6fSkuICBUaGUgdHdvIGhhdmUKK3NpbWlsYXIgc3ludGF4OgorCitAZXhhbXBsZQorCitAdmFye21vZHVsZX0gLiBAdmFye2lkfQorQHZhcntzY29wZX0gOjogQHZhcntpZH0KK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK3doZXJlIEB2YXJ7c2NvcGV9IGlzIHRoZSBuYW1lIG9mIGEgbW9kdWxlIG9yIGEgcHJvY2VkdXJlLAorQHZhcnttb2R1bGV9IHRoZSBuYW1lIG9mIGEgbW9kdWxlLCBhbmQgQHZhcntpZH0gaXMgYW55IGRlY2xhcmVkCitpZGVudGlmaWVyIHdpdGhpbiB5b3VyIHByb2dyYW0sIGV4Y2VwdCBhbm90aGVyIG1vZHVsZS4KKworVXNpbmcgdGhlIEBjb2Rlezo6fSBvcGVyYXRvciBtYWtlcyBAdmFsdWV7R0RCTn0gc2VhcmNoIHRoZSBzY29wZQorc3BlY2lmaWVkIGJ5IEB2YXJ7c2NvcGV9IGZvciB0aGUgaWRlbnRpZmllciBAdmFye2lkfS4gIElmIGl0IGlzIG5vdAorZm91bmQgaW4gdGhlIHNwZWNpZmllZCBzY29wZSwgdGhlbiBAdmFsdWV7R0RCTn0gc2VhcmNoZXMgYWxsIHNjb3BlcworZW5jbG9zaW5nIHRoZSBvbmUgc3BlY2lmaWVkIGJ5IEB2YXJ7c2NvcGV9LgorCitVc2luZyB0aGUgQGNvZGV7Ln0gb3BlcmF0b3IgbWFrZXMgQHZhbHVle0dEQk59IHNlYXJjaCB0aGUgY3VycmVudCBzY29wZSBmb3IKK3RoZSBpZGVudGlmaWVyIHNwZWNpZmllZCBieSBAdmFye2lkfSB0aGF0IHdhcyBpbXBvcnRlZCBmcm9tIHRoZQorZGVmaW5pdGlvbiBtb2R1bGUgc3BlY2lmaWVkIGJ5IEB2YXJ7bW9kdWxlfS4gIFdpdGggdGhpcyBvcGVyYXRvciwgaXQgaXMKK2FuIGVycm9yIGlmIHRoZSBpZGVudGlmaWVyIEB2YXJ7aWR9IHdhcyBub3QgaW1wb3J0ZWQgZnJvbSBkZWZpbml0aW9uCittb2R1bGUgQHZhcnttb2R1bGV9LCBvciBpZiBAdmFye2lkfSBpcyBub3QgYW4gaWRlbnRpZmllciBpbgorQHZhcnttb2R1bGV9LgorCitAbm9kZSBHREIvTTIsICAsIE0yIFNjb3BlLCBNb2R1bGEtMgorQHN1YnN1YnNlY3Rpb24gQHZhbHVle0dEQk59IGFuZCBNb2R1bGEtMgorCitTb21lIEB2YWx1ZXtHREJOfSBjb21tYW5kcyBoYXZlIGxpdHRsZSB1c2Ugd2hlbiBkZWJ1Z2dpbmcgTW9kdWxhLTIgcHJvZ3JhbXMuCitGaXZlIHN1YmNvbW1hbmRzIG9mIEBjb2Rle3NldCBwcmludH0gYW5kIEBjb2Rle3Nob3cgcHJpbnR9IGFwcGx5CitzcGVjaWZpY2FsbHkgdG8gQyBhbmQgQysrOiBAc2FtcHt2dGJsfSwgQHNhbXB7ZGVtYW5nbGV9LAorQHNhbXB7YXNtLWRlbWFuZ2xlfSwgQHNhbXB7b2JqZWN0fSwgYW5kIEBzYW1we3VuaW9ufS4gIFRoZSBmaXJzdCBmb3VyCithcHBseSB0byBDKyssIGFuZCB0aGUgbGFzdCB0byB0aGUgQyBAY29kZXt1bmlvbn0gdHlwZSwgd2hpY2ggaGFzIG5vIGRpcmVjdAorYW5hbG9ndWUgaW4gTW9kdWxhLTIuCisKK1RoZSBAY29kZXtAQH0gb3BlcmF0b3IgKEBweHJlZntFeHByZXNzaW9ucywgLEV4cHJlc3Npb25zfSksIHdoaWxlIGF2YWlsYWJsZQord2hpbGUgdXNpbmcgYW55IGxhbmd1YWdlLCBpcyBub3QgdXNlZnVsIHdpdGggTW9kdWxhLTIuICBJdHMKK2ludGVudCBpcyB0byBhaWQgdGhlIGRlYnVnZ2luZyBvZiBAZGZue2R5bmFtaWMgYXJyYXlzfSwgd2hpY2ggY2Fubm90IGJlCitjcmVhdGVkIGluIE1vZHVsYS0yIGFzIHRoZXkgY2FuIGluIEMgb3IgQysrLiAgSG93ZXZlciwgYmVjYXVzZSBhbgorYWRkcmVzcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IGFuIGludGVncmFsIGNvbnN0YW50LCB0aGUgY29uc3RydWN0CitAc2FtcHtAe0B2YXJ7dHlwZX1AfUB2YXJ7YWRyZXhwfX0gaXMgc3RpbGwgdXNlZnVsLiAgKEBweHJlZntFeHByZXNzaW9ucywgLEV4cHJlc3Npb25zfSkKKworQGNpbmRleCBAY29kZXsjfSBpbiBNb2R1bGEtMgorSW4gQHZhbHVle0dEQk59IHNjcmlwdHMsIHRoZSBNb2R1bGEtMiBpbmVxdWFsaXR5IG9wZXJhdG9yIEBjb2RleyN9IGlzCitpbnRlcnByZXRlZCBhcyB0aGUgYmVnaW5uaW5nIG9mIGEgY29tbWVudC4gIFVzZSBAY29kZXs8Pn0gaW5zdGVhZC4KK0BlbmQgaWZzZXQKK0BlbmQgaWZjbGVhcgorCitAbm9kZSBTeW1ib2xzLCBBbHRlcmluZywgTGFuZ3VhZ2VzLCBUb3AKK0BjaGFwdGVyIEV4YW1pbmluZyB0aGUgU3ltYm9sIFRhYmxlCisKK1RoZSBjb21tYW5kcyBkZXNjcmliZWQgaW4gdGhpcyBzZWN0aW9uIGFsbG93IHlvdSB0byBpbnF1aXJlIGFib3V0IHRoZQorc3ltYm9scyAobmFtZXMgb2YgdmFyaWFibGVzLCBmdW5jdGlvbnMgYW5kIHR5cGVzKSBkZWZpbmVkIGluIHlvdXIKK3Byb2dyYW0uICBUaGlzIGluZm9ybWF0aW9uIGlzIGluaGVyZW50IGluIHRoZSB0ZXh0IG9mIHlvdXIgcHJvZ3JhbSBhbmQKK2RvZXMgbm90IGNoYW5nZSBhcyB5b3VyIHByb2dyYW0gZXhlY3V0ZXMuICBAdmFsdWV7R0RCTn0gZmluZHMgaXQgaW4geW91cgorcHJvZ3JhbSdzIHN5bWJvbCB0YWJsZSwgaW4gdGhlIGZpbGUgaW5kaWNhdGVkIHdoZW4geW91IHN0YXJ0ZWQgQHZhbHVle0dEQk59CisoQHB4cmVme0ZpbGUgT3B0aW9ucywgLENob29zaW5nIGZpbGVzfSksIG9yIGJ5IG9uZSBvZiB0aGUKK2ZpbGUtbWFuYWdlbWVudCBjb21tYW5kcyAoQHB4cmVme0ZpbGVzLCAsQ29tbWFuZHMgdG8gc3BlY2lmeSBmaWxlc30pLgorCitAY2luZGV4IHN5bWJvbCBuYW1lcworQGNpbmRleCBuYW1lcyBvZiBzeW1ib2xzCitAY2luZGV4IHF1b3RpbmcgbmFtZXMKK09jY2FzaW9uYWxseSwgeW91IG1heSBuZWVkIHRvIHJlZmVyIHRvIHN5bWJvbHMgdGhhdCBjb250YWluIHVudXN1YWwKK2NoYXJhY3RlcnMsIHdoaWNoIEB2YWx1ZXtHREJOfSBvcmRpbmFyaWx5IHRyZWF0cyBhcyB3b3JkIGRlbGltaXRlcnMuICBUaGUKK21vc3QgZnJlcXVlbnQgY2FzZSBpcyBpbiByZWZlcnJpbmcgdG8gc3RhdGljIHZhcmlhYmxlcyBpbiBvdGhlcgorc291cmNlIGZpbGVzIChAcHhyZWZ7VmFyaWFibGVzLCxQcm9ncmFtIHZhcmlhYmxlc30pLiAgRmlsZSBuYW1lcworYXJlIHJlY29yZGVkIGluIG9iamVjdCBmaWxlcyBhcyBkZWJ1Z2dpbmcgc3ltYm9scywgYnV0IEB2YWx1ZXtHREJOfSB3b3VsZAorb3JkaW5hcmlseSBwYXJzZSBhIHR5cGljYWwgZmlsZSBuYW1lLCBsaWtlIEBmaWxle2Zvby5jfSwgYXMgdGhlIHRocmVlIHdvcmRzCitAc2FtcHtmb299IEBzYW1wey59IEBzYW1we2N9LiAgVG8gYWxsb3cgQHZhbHVle0dEQk59IHRvIHJlY29nbml6ZQorQHNhbXB7Zm9vLmN9IGFzIGEgc2luZ2xlIHN5bWJvbCwgZW5jbG9zZSBpdCBpbiBzaW5nbGUgcXVvdGVzOyBmb3IgZXhhbXBsZSwKKworQGV4YW1wbGUKK3AgJ2Zvby5jJzo6eAorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorbG9va3MgdXAgdGhlIHZhbHVlIG9mIEBjb2Rle3h9IGluIHRoZSBzY29wZSBvZiB0aGUgZmlsZSBAZmlsZXtmb28uY30uCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBpbmZvIGFkZHJlc3MKK0BpdGVtIGluZm8gYWRkcmVzcyBAdmFye3N5bWJvbH0KK0Rlc2NyaWJlIHdoZXJlIHRoZSBkYXRhIGZvciBAdmFye3N5bWJvbH0gaXMgc3RvcmVkLiAgRm9yIGEgcmVnaXN0ZXIKK3ZhcmlhYmxlLCB0aGlzIHNheXMgd2hpY2ggcmVnaXN0ZXIgaXQgaXMga2VwdCBpbi4gIEZvciBhIG5vbi1yZWdpc3RlcgorbG9jYWwgdmFyaWFibGUsIHRoaXMgcHJpbnRzIHRoZSBzdGFjay1mcmFtZSBvZmZzZXQgYXQgd2hpY2ggdGhlIHZhcmlhYmxlCitpcyBhbHdheXMgc3RvcmVkLgorCitOb3RlIHRoZSBjb250cmFzdCB3aXRoIEBzYW1we3ByaW50ICZAdmFye3N5bWJvbH19LCB3aGljaCBkb2VzIG5vdCB3b3JrCithdCBhbGwgZm9yIGEgcmVnaXN0ZXIgdmFyaWFibGUsIGFuZCBmb3IgYSBzdGFjayBsb2NhbCB2YXJpYWJsZSBwcmludHMKK3RoZSBleGFjdCBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IGluc3RhbnRpYXRpb24gb2YgdGhlIHZhcmlhYmxlLgorCitAa2luZGV4IHdoYXRpcworQGl0ZW0gd2hhdGlzIEB2YXJ7ZXhwfQorUHJpbnQgdGhlIGRhdGEgdHlwZSBvZiBleHByZXNzaW9uIEB2YXJ7ZXhwfS4gIEB2YXJ7ZXhwfSBpcyBub3QKK2FjdHVhbGx5IGV2YWx1YXRlZCwgYW5kIGFueSBzaWRlLWVmZmVjdGluZyBvcGVyYXRpb25zIChzdWNoIGFzCithc3NpZ25tZW50cyBvciBmdW5jdGlvbiBjYWxscykgaW5zaWRlIGl0IGRvIG5vdCB0YWtlIHBsYWNlLgorQHhyZWZ7RXhwcmVzc2lvbnMsICxFeHByZXNzaW9uc30uCisKK0BpdGVtIHdoYXRpcworUHJpbnQgdGhlIGRhdGEgdHlwZSBvZiBAY29kZXskfSwgdGhlIGxhc3QgdmFsdWUgaW4gdGhlIHZhbHVlIGhpc3RvcnkuCisKK0BraW5kZXggcHR5cGUKK0BpdGVtIHB0eXBlIEB2YXJ7dHlwZW5hbWV9CitQcmludCBhIGRlc2NyaXB0aW9uIG9mIGRhdGEgdHlwZSBAdmFye3R5cGVuYW1lfS4gIEB2YXJ7dHlwZW5hbWV9IG1heSBiZQordGhlIG5hbWUgb2YgYSB0eXBlLCBvciBmb3IgQyBjb2RlIGl0IG1heSBoYXZlIHRoZSBmb3JtCitAaWZjbGVhciBDT05MWQorQHNhbXB7Y2xhc3MgQHZhcntjbGFzcy1uYW1lfX0sCitAZW5kIGlmY2xlYXIKK0BzYW1we3N0cnVjdCBAdmFye3N0cnVjdC10YWd9fSwgQHNhbXB7dW5pb24gQHZhcnt1bmlvbi10YWd9fSBvcgorQHNhbXB7ZW51bSBAdmFye2VudW0tdGFnfX0uCisKK0BpdGVtIHB0eXBlIEB2YXJ7ZXhwfQorQGl0ZW14IHB0eXBlCitQcmludCBhIGRlc2NyaXB0aW9uIG9mIHRoZSB0eXBlIG9mIGV4cHJlc3Npb24gQHZhcntleHB9LiAgQGNvZGV7cHR5cGV9CitkaWZmZXJzIGZyb20gQGNvZGV7d2hhdGlzfSBieSBwcmludGluZyBhIGRldGFpbGVkIGRlc2NyaXB0aW9uLCBpbnN0ZWFkCitvZiBqdXN0IHRoZSBuYW1lIG9mIHRoZSB0eXBlLgorCitGb3IgZXhhbXBsZSwgZm9yIHRoaXMgdmFyaWFibGUgZGVjbGFyYXRpb246CisKK0BleGFtcGxlCitzdHJ1Y3QgY29tcGxleCBAe2RvdWJsZSByZWFsOyBkb3VibGUgaW1hZztAfSB2OworQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAordGhlIHR3byBjb21tYW5kcyBnaXZlIHRoaXMgb3V0cHV0OgorCitAZXhhbXBsZQorQGdyb3VwCisoQHZhbHVle0dEQlB9KSB3aGF0aXMgdgordHlwZSA9IHN0cnVjdCBjb21wbGV4CisoQHZhbHVle0dEQlB9KSBwdHlwZSB2Cit0eXBlID0gc3RydWN0IGNvbXBsZXggQHsKKyAgICBkb3VibGUgcmVhbDsKKyAgICBkb3VibGUgaW1hZzsKK0B9CitAZW5kIGdyb3VwCitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitBcyB3aXRoIEBjb2Rle3doYXRpc30sIHVzaW5nIEBjb2Rle3B0eXBlfSB3aXRob3V0IGFuIGFyZ3VtZW50IHJlZmVycyB0bwordGhlIHR5cGUgb2YgQGNvZGV7JH0sIHRoZSBsYXN0IHZhbHVlIGluIHRoZSB2YWx1ZSBoaXN0b3J5LgorCitAa2luZGV4IGluZm8gdHlwZXMKK0BpdGVtIGluZm8gdHlwZXMgQHZhcntyZWdleHB9CitAaXRlbXggaW5mbyB0eXBlcworUHJpbnQgYSBicmllZiBkZXNjcmlwdGlvbiBvZiBhbGwgdHlwZXMgd2hvc2UgbmFtZSBtYXRjaGVzIEB2YXJ7cmVnZXhwfQorKG9yIGFsbCB0eXBlcyBpbiB5b3VyIHByb2dyYW0sIGlmIHlvdSBzdXBwbHkgbm8gYXJndW1lbnQpLiAgRWFjaAorY29tcGxldGUgdHlwZW5hbWUgaXMgbWF0Y2hlZCBhcyB0aG91Z2ggaXQgd2VyZSBhIGNvbXBsZXRlIGxpbmU7IHRodXMsCitAc2FtcHtpIHR5cGUgdmFsdWV9IGdpdmVzIGluZm9ybWF0aW9uIG9uIGFsbCB0eXBlcyBpbiB5b3VyIHByb2dyYW0gd2hvc2UKK25hbWUgaW5jbHVkZXMgdGhlIHN0cmluZyBAY29kZXt2YWx1ZX0sIGJ1dCBAc2FtcHtpIHR5cGUgXnZhbHVlJH0gZ2l2ZXMKK2luZm9ybWF0aW9uIG9ubHkgb24gdHlwZXMgd2hvc2UgY29tcGxldGUgbmFtZSBpcyBAY29kZXt2YWx1ZX0uCisKK1RoaXMgY29tbWFuZCBkaWZmZXJzIGZyb20gQGNvZGV7cHR5cGV9IGluIHR3byB3YXlzOiBmaXJzdCwgbGlrZQorQGNvZGV7d2hhdGlzfSwgaXQgZG9lcyBub3QgcHJpbnQgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbjsgc2Vjb25kLCBpdAorbGlzdHMgYWxsIHNvdXJjZSBmaWxlcyB3aGVyZSBhIHR5cGUgaXMgZGVmaW5lZC4KKworQGtpbmRleCBpbmZvIHNvdXJjZQorQGl0ZW0gaW5mbyBzb3VyY2UKK1Nob3cgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgc291cmNlIGZpbGUtLS10aGF0IGlzLCB0aGUgc291cmNlIGZpbGUgZm9yCit0aGUgZnVuY3Rpb24gY29udGFpbmluZyB0aGUgY3VycmVudCBwb2ludCBvZiBleGVjdXRpb24tLS1hbmQgdGhlIGxhbmd1YWdlCitpdCB3YXMgd3JpdHRlbiBpbi4KKworQGtpbmRleCBpbmZvIHNvdXJjZXMKK0BpdGVtIGluZm8gc291cmNlcworUHJpbnQgdGhlIG5hbWVzIG9mIGFsbCBzb3VyY2UgZmlsZXMgaW4geW91ciBwcm9ncmFtIGZvciB3aGljaCB0aGVyZSBpcworZGVidWdnaW5nIGluZm9ybWF0aW9uLCBvcmdhbml6ZWQgaW50byB0d28gbGlzdHM6IGZpbGVzIHdob3NlIHN5bWJvbHMKK2hhdmUgYWxyZWFkeSBiZWVuIHJlYWQsIGFuZCBmaWxlcyB3aG9zZSBzeW1ib2xzIHdpbGwgYmUgcmVhZCB3aGVuIG5lZWRlZC4KKworQGtpbmRleCBpbmZvIGZ1bmN0aW9ucworQGl0ZW0gaW5mbyBmdW5jdGlvbnMKK1ByaW50IHRoZSBuYW1lcyBhbmQgZGF0YSB0eXBlcyBvZiBhbGwgZGVmaW5lZCBmdW5jdGlvbnMuCisKK0BpdGVtIGluZm8gZnVuY3Rpb25zIEB2YXJ7cmVnZXhwfQorUHJpbnQgdGhlIG5hbWVzIGFuZCBkYXRhIHR5cGVzIG9mIGFsbCBkZWZpbmVkIGZ1bmN0aW9ucword2hvc2UgbmFtZXMgY29udGFpbiBhIG1hdGNoIGZvciByZWd1bGFyIGV4cHJlc3Npb24gQHZhcntyZWdleHB9LgorVGh1cywgQHNhbXB7aW5mbyBmdW4gc3RlcH0gZmluZHMgYWxsIGZ1bmN0aW9ucyB3aG9zZSBuYW1lcworaW5jbHVkZSBAY29kZXtzdGVwfTsgQHNhbXB7aW5mbyBmdW4gXnN0ZXB9IGZpbmRzIHRob3NlIHdob3NlIG5hbWVzCitzdGFydCB3aXRoIEBjb2Rle3N0ZXB9LgorCitAa2luZGV4IGluZm8gdmFyaWFibGVzCitAaXRlbSBpbmZvIHZhcmlhYmxlcworUHJpbnQgdGhlIG5hbWVzIGFuZCBkYXRhIHR5cGVzIG9mIGFsbCB2YXJpYWJsZXMgdGhhdCBhcmUgZGVjbGFyZWQKK291dHNpZGUgb2YgZnVuY3Rpb25zIChpLmUuLCBleGNsdWRpbmcgbG9jYWwgdmFyaWFibGVzKS4KKworQGl0ZW0gaW5mbyB2YXJpYWJsZXMgQHZhcntyZWdleHB9CitQcmludCB0aGUgbmFtZXMgYW5kIGRhdGEgdHlwZXMgb2YgYWxsIHZhcmlhYmxlcyAoZXhjZXB0IGZvciBsb2NhbAordmFyaWFibGVzKSB3aG9zZSBuYW1lcyBjb250YWluIGEgbWF0Y2ggZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbgorQHZhcntyZWdleHB9LgorCitAaWdub3JlCitUaGlzIHdhcyBuZXZlciBpbXBsZW1lbnRlZC4KK0BraW5kZXggaW5mbyBtZXRob2RzCitAaXRlbSBpbmZvIG1ldGhvZHMKK0BpdGVteCBpbmZvIG1ldGhvZHMgQHZhcntyZWdleHB9CitUaGUgQGNvZGV7aW5mbyBtZXRob2RzfSBjb21tYW5kIHBlcm1pdHMgdGhlIHVzZXIgdG8gZXhhbWluZSBhbGwgZGVmaW5lZAorbWV0aG9kcyB3aXRoaW4gQysrIHByb2dyYW0sIG9yICh3aXRoIHRoZSBAdmFye3JlZ2V4cH0gYXJndW1lbnQpIGEKK3NwZWNpZmljIHNldCBvZiBtZXRob2RzIGZvdW5kIGluIHRoZSB2YXJpb3VzIEMrKyBjbGFzc2VzLiAgTWFueQorQysrIGNsYXNzZXMgcHJvdmlkZSBhIGxhcmdlIG51bWJlciBvZiBtZXRob2RzLiAgVGh1cywgdGhlIG91dHB1dAorZnJvbSB0aGUgQGNvZGV7cHR5cGV9IGNvbW1hbmQgY2FuIGJlIG92ZXJ3aGVsbWluZyBhbmQgaGFyZCB0byB1c2UuICBUaGUKK0Bjb2Rle2luZm8tbWV0aG9kc30gY29tbWFuZCBmaWx0ZXJzIHRoZSBtZXRob2RzLCBwcmludGluZyBvbmx5IHRob3NlCit3aGljaCBtYXRjaCB0aGUgcmVndWxhci1leHByZXNzaW9uIEB2YXJ7cmVnZXhwfS4KK0BlbmQgaWdub3JlCisKK0BpZmNsZWFyIEhQUEEKK0BjaW5kZXggcmVsb2FkaW5nIHN5bWJvbHMKK1NvbWUgc3lzdGVtcyBhbGxvdyBpbmRpdmlkdWFsIG9iamVjdCBmaWxlcyB0aGF0IG1ha2UgdXAgeW91ciBwcm9ncmFtIHRvCitiZSByZXBsYWNlZCB3aXRob3V0IHN0b3BwaW5nIGFuZCByZXN0YXJ0aW5nIHlvdXIgcHJvZ3JhbS4KK0BpZnNldCBWWFdPUktTCitGb3IgZXhhbXBsZSwgaW4gVnhXb3JrcyB5b3UgY2FuIHNpbXBseSByZWNvbXBpbGUgYSBkZWZlY3RpdmUgb2JqZWN0IGZpbGUKK2FuZCBrZWVwIG9uIHJ1bm5pbmcuCitAZW5kIGlmc2V0CitJZiB5b3UgYXJlIHJ1bm5pbmcgb24gb25lIG9mIHRoZXNlIHN5c3RlbXMsIHlvdSBjYW4gYWxsb3cgQHZhbHVle0dEQk59IHRvCityZWxvYWQgdGhlIHN5bWJvbHMgZm9yIGF1dG9tYXRpY2FsbHkgcmVsaW5rZWQgbW9kdWxlczoKKworQHRhYmxlIEBjb2RlCitAa2luZGV4IHNldCBzeW1ib2wtcmVsb2FkaW5nCitAaXRlbSBzZXQgc3ltYm9sLXJlbG9hZGluZyBvbgorUmVwbGFjZSBzeW1ib2wgZGVmaW5pdGlvbnMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlIHdoZW4gYW4KK29iamVjdCBmaWxlIHdpdGggYSBwYXJ0aWN1bGFyIG5hbWUgaXMgc2VlbiBhZ2Fpbi4KKworQGl0ZW0gc2V0IHN5bWJvbC1yZWxvYWRpbmcgb2ZmCitEbyBub3QgcmVwbGFjZSBzeW1ib2wgZGVmaW5pdGlvbnMgd2hlbiByZS1lbmNvdW50ZXJpbmcgb2JqZWN0IGZpbGVzIG9mCit0aGUgc2FtZSBuYW1lLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBzdGF0ZTsgaWYgeW91IGFyZSBub3QgcnVubmluZyBvbiBhCitzeXN0ZW0gdGhhdCBwZXJtaXRzIGF1dG9tYXRpY2FsbHkgcmVsaW5raW5nIG1vZHVsZXMsIHlvdSBzaG91bGQgbGVhdmUKK0Bjb2Rle3N5bWJvbC1yZWxvYWRpbmd9IG9mZiwgc2luY2Ugb3RoZXJ3aXNlIEB2YWx1ZXtHREJOfSBtYXkgZGlzY2FyZCBzeW1ib2xzCit3aGVuIGxpbmtpbmcgbGFyZ2UgcHJvZ3JhbXMsIHRoYXQgbWF5IGNvbnRhaW4gc2V2ZXJhbCBtb2R1bGVzIChmcm9tCitkaWZmZXJlbnQgZGlyZWN0b3JpZXMgb3IgbGlicmFyaWVzKSB3aXRoIHRoZSBzYW1lIG5hbWUuCisKK0BraW5kZXggc2hvdyBzeW1ib2wtcmVsb2FkaW5nCitAaXRlbSBzaG93IHN5bWJvbC1yZWxvYWRpbmcKK1Nob3cgdGhlIGN1cnJlbnQgQGNvZGV7b259IG9yIEBjb2Rle29mZn0gc2V0dGluZy4KK0BlbmQgdGFibGUKK0BlbmQgaWZjbGVhcgorCitAaWZzZXQgSFBQQQorQGtpbmRleCBzZXQgb3BhcXVlLXR5cGUtcmVzb2x1dGlvbgorQGl0ZW0gc2V0IG9wYXF1ZS10eXBlLXJlc29sdXRpb24gb24KK1RlbGwgQHZhbHVle0dEQk59IHRvIHJlc29sdmUgb3BhcXVlIHR5cGVzLiAgQW4gb3BhcXVlIHR5cGUgaXMgYSB0eXBlCitkZWNsYXJlZCBhcyBhIHBvaW50ZXIgdG8gYSBAY29kZXtzdHJ1Y3R9LCBAY29kZXtjbGFzc30sIG9yCitAY29kZXt1bmlvbn0tLS1mb3IgZXhhbXBsZSwgQGNvZGV7c3RydWN0IE15VHlwZSAqfS0tLXRoYXQgaXMgdXNlZCBpbiBvbmUKK3NvdXJjZSBmaWxlIGFsdGhvdWdoIHRoZSBmdWxsIGRlY2xhcmF0aW9uIG9mIEBjb2Rle3N0cnVjdCBNeVR5cGV9IGlzIGluCithbm90aGVyIHNvdXJjZSBmaWxlLiAgVGhlIGRlZmF1bHQgaXMgb24uCisKK0EgY2hhbmdlIGluIHRoZSBzZXR0aW5nIG9mIHRoaXMgc3ViY29tbWFuZCB3aWxsIG5vdCB0YWtlIGVmZmVjdCB1bnRpbAordGhlIG5leHQgdGltZSBzeW1ib2xzIGZvciBhIGZpbGUgYXJlIGxvYWRlZC4KKworQGl0ZW0gc2V0IG9wYXF1ZS10eXBlLXJlc29sdXRpb24gb2ZmCitUZWxsIEB2YWx1ZXtHREJOfSBub3QgdG8gcmVzb2x2ZSBvcGFxdWUgdHlwZXMuICBJbiB0aGlzIGNhc2UsIHRoZSB0eXBlCitpcyBwcmludGVkIGFzIGZvbGxvd3M6CitAc21hbGxleGFtcGxlCitAezxubyBkYXRhIGZpZWxkcz5AfQorQGVuZCBzbWFsbGV4YW1wbGUKKworQGtpbmRleCBzaG93IG9wYXF1ZS10eXBlLXJlc29sdXRpb24KK0BpdGVtIHNob3cgb3BhcXVlLXR5cGUtcmVzb2x1dGlvbgorU2hvdyB3aGV0aGVyIG9wYXF1ZSB0eXBlcyBhcmUgcmVzb2x2ZWQgb3Igbm90LgorQGVuZCBpZnNldAorCitAa2luZGV4IG1haW50IHByaW50IHN5bWJvbHMKK0BjaW5kZXggc3ltYm9sIGR1bXAKK0BraW5kZXggbWFpbnQgcHJpbnQgcHN5bWJvbHMKK0BjaW5kZXggcGFydGlhbCBzeW1ib2wgZHVtcAorQGl0ZW0gbWFpbnQgcHJpbnQgc3ltYm9scyBAdmFye2ZpbGVuYW1lfQorQGl0ZW14IG1haW50IHByaW50IHBzeW1ib2xzIEB2YXJ7ZmlsZW5hbWV9CitAaXRlbXggbWFpbnQgcHJpbnQgbXN5bWJvbHMgQHZhcntmaWxlbmFtZX0KK1dyaXRlIGEgZHVtcCBvZiBkZWJ1Z2dpbmcgc3ltYm9sIGRhdGEgaW50byB0aGUgZmlsZSBAdmFye2ZpbGVuYW1lfS4KK1RoZXNlIGNvbW1hbmRzIGFyZSB1c2VkIHRvIGRlYnVnIHRoZSBAdmFsdWV7R0RCTn0gc3ltYm9sLXJlYWRpbmcgY29kZS4gIE9ubHkKK3N5bWJvbHMgd2l0aCBkZWJ1Z2dpbmcgZGF0YSBhcmUgaW5jbHVkZWQuICBJZiB5b3UgdXNlIEBzYW1we21haW50IHByaW50CitzeW1ib2xzfSwgQHZhbHVle0dEQk59IGluY2x1ZGVzIGFsbCB0aGUgc3ltYm9scyBmb3Igd2hpY2ggaXQgaGFzIGFscmVhZHkKK2NvbGxlY3RlZCBmdWxsIGRldGFpbHM6IHRoYXQgaXMsIEB2YXJ7ZmlsZW5hbWV9IHJlZmxlY3RzIHN5bWJvbHMgZm9yCitvbmx5IHRob3NlIGZpbGVzIHdob3NlIHN5bWJvbHMgQHZhbHVle0dEQk59IGhhcyByZWFkLiAgWW91IGNhbiB1c2UgdGhlCitjb21tYW5kIEBjb2Rle2luZm8gc291cmNlc30gdG8gZmluZCBvdXQgd2hpY2ggZmlsZXMgdGhlc2UgYXJlLiAgSWYgeW91Cit1c2UgQHNhbXB7bWFpbnQgcHJpbnQgcHN5bWJvbHN9IGluc3RlYWQsIHRoZSBkdW1wIHNob3dzIGluZm9ybWF0aW9uIGFib3V0CitzeW1ib2xzIHRoYXQgQHZhbHVle0dEQk59IG9ubHkga25vd3MgcGFydGlhbGx5LS0tdGhhdCBpcywgc3ltYm9scyBkZWZpbmVkIGluCitmaWxlcyB0aGF0IEB2YWx1ZXtHREJOfSBoYXMgc2tpbW1lZCwgYnV0IG5vdCB5ZXQgcmVhZCBjb21wbGV0ZWx5LiAgRmluYWxseSwKK0BzYW1we21haW50IHByaW50IG1zeW1ib2xzfSBkdW1wcyBqdXN0IHRoZSBtaW5pbWFsIHN5bWJvbCBpbmZvcm1hdGlvbgorcmVxdWlyZWQgZm9yIGVhY2ggb2JqZWN0IGZpbGUgZnJvbSB3aGljaCBAdmFsdWV7R0RCTn0gaGFzIHJlYWQgc29tZSBzeW1ib2xzLgorQHhyZWZ7RmlsZXMsICxDb21tYW5kcyB0byBzcGVjaWZ5IGZpbGVzfSwgZm9yIGEgZGlzY3Vzc2lvbiBvZiBob3cKK0B2YWx1ZXtHREJOfSByZWFkcyBzeW1ib2xzIChpbiB0aGUgZGVzY3JpcHRpb24gb2YgQGNvZGV7c3ltYm9sLWZpbGV9KS4KK0BlbmQgdGFibGUKKworQG5vZGUgQWx0ZXJpbmcsIEdEQiBGaWxlcywgU3ltYm9scywgVG9wCitAY2hhcHRlciBBbHRlcmluZyBFeGVjdXRpb24KKworT25jZSB5b3UgdGhpbmsgeW91IGhhdmUgZm91bmQgYW4gZXJyb3IgaW4geW91ciBwcm9ncmFtLCB5b3UgbWlnaHQgd2FudCB0bworZmluZCBvdXQgZm9yIGNlcnRhaW4gd2hldGhlciBjb3JyZWN0aW5nIHRoZSBhcHBhcmVudCBlcnJvciB3b3VsZCBsZWFkIHRvCitjb3JyZWN0IHJlc3VsdHMgaW4gdGhlIHJlc3Qgb2YgdGhlIHJ1bi4gIFlvdSBjYW4gZmluZCB0aGUgYW5zd2VyIGJ5CitleHBlcmltZW50LCB1c2luZyB0aGUgQHZhbHVle0dEQk59IGZlYXR1cmVzIGZvciBhbHRlcmluZyBleGVjdXRpb24gb2YgdGhlCitwcm9ncmFtLgorCitGb3IgZXhhbXBsZSwgeW91IGNhbiBzdG9yZSBuZXcgdmFsdWVzIGludG8gdmFyaWFibGVzIG9yIG1lbW9yeQorbG9jYXRpb25zLAorQGlmY2xlYXIgQkFSRVRBUkdFVAorZ2l2ZSB5b3VyIHByb2dyYW0gYSBzaWduYWwsIHJlc3RhcnQgaXQKK0BlbmQgaWZjbGVhcgorQGlmc2V0IEJBUkVUQVJHRVQKK3Jlc3RhcnQgeW91ciBwcm9ncmFtCitAZW5kIGlmc2V0CithdCBhIGRpZmZlcmVudCBhZGRyZXNzLCBvciBldmVuIHJldHVybiBwcmVtYXR1cmVseSBmcm9tIGEgZnVuY3Rpb24uCisKK0BtZW51CisqIEFzc2lnbm1lbnQ6OiAgICAgICAgICAgICAgICAgIEFzc2lnbm1lbnQgdG8gdmFyaWFibGVzCisqIEp1bXBpbmc6OiAgICAgICAgICAgICAgICAgICAgIENvbnRpbnVpbmcgYXQgYSBkaWZmZXJlbnQgYWRkcmVzcworQGlmY2xlYXIgQkFSRVRBUkdFVAorKiBTaWduYWxpbmc6OiAgICAgICAgICAgICAgICAgICBHaXZpbmcgeW91ciBwcm9ncmFtIGEgc2lnbmFsCitAZW5kIGlmY2xlYXIKKworKiBSZXR1cm5pbmc6OiAgICAgICAgICAgICAgICAgICBSZXR1cm5pbmcgZnJvbSBhIGZ1bmN0aW9uCisqIENhbGxpbmc6OiAgICAgICAgICAgICAgICAgICAgIENhbGxpbmcgeW91ciBwcm9ncmFtJ3MgZnVuY3Rpb25zCisqIFBhdGNoaW5nOjogICAgICAgICAgICAgICAgICAgIFBhdGNoaW5nIHlvdXIgcHJvZ3JhbQorQGVuZCBtZW51CisKK0Bub2RlIEFzc2lnbm1lbnQsIEp1bXBpbmcsIEFsdGVyaW5nLCBBbHRlcmluZworQHNlY3Rpb24gQXNzaWdubWVudCB0byB2YXJpYWJsZXMKKworQGNpbmRleCBhc3NpZ25tZW50CitAY2luZGV4IHNldHRpbmcgdmFyaWFibGVzCitUbyBhbHRlciB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZSwgZXZhbHVhdGUgYW4gYXNzaWdubWVudCBleHByZXNzaW9uLgorQHhyZWZ7RXhwcmVzc2lvbnMsICxFeHByZXNzaW9uc30uICBGb3IgZXhhbXBsZSwKKworQGV4YW1wbGUKK3ByaW50IHg9NAorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorc3RvcmVzIHRoZSB2YWx1ZSA0IGludG8gdGhlIHZhcmlhYmxlIEBjb2Rle3h9LCBhbmQgdGhlbiBwcmludHMgdGhlCit2YWx1ZSBvZiB0aGUgYXNzaWdubWVudCBleHByZXNzaW9uICh3aGljaCBpcyA0KS4gIAorQGlmY2xlYXIgQ09OTFkKK0B4cmVme0xhbmd1YWdlcywgLFVzaW5nIEB2YWx1ZXtHREJOfSB3aXRoIERpZmZlcmVudCBMYW5ndWFnZXN9LCBmb3IgbW9yZQoraW5mb3JtYXRpb24gb24gb3BlcmF0b3JzIGluIHN1cHBvcnRlZCBsYW5ndWFnZXMuCitAZW5kIGlmY2xlYXIKKworQGtpbmRleCBzZXQgdmFyaWFibGUKK0BjaW5kZXggdmFyaWFibGVzLCBzZXR0aW5nCitJZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHNlZWluZyB0aGUgdmFsdWUgb2YgdGhlIGFzc2lnbm1lbnQsIHVzZSB0aGUKK0Bjb2Rle3NldH0gY29tbWFuZCBpbnN0ZWFkIG9mIHRoZSBAY29kZXtwcmludH0gY29tbWFuZC4gIEBjb2Rle3NldH0gaXMKK3JlYWxseSB0aGUgc2FtZSBhcyBAY29kZXtwcmludH0gZXhjZXB0IHRoYXQgdGhlIGV4cHJlc3Npb24ncyB2YWx1ZSBpcworbm90IHByaW50ZWQgYW5kIGlzIG5vdCBwdXQgaW4gdGhlIHZhbHVlIGhpc3RvcnkgKEBweHJlZntWYWx1ZSBIaXN0b3J5LAorLFZhbHVlIGhpc3Rvcnl9KS4gIFRoZSBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBvbmx5IGZvciBpdHMgZWZmZWN0cy4KKworQGlmY2xlYXIgSFBQQQorSWYgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJndW1lbnQgc3RyaW5nIG9mIHRoZSBAY29kZXtzZXR9IGNvbW1hbmQKK2FwcGVhcnMgaWRlbnRpY2FsIHRvIGEgQGNvZGV7c2V0fSBzdWJjb21tYW5kLCB1c2UgdGhlIEBjb2Rle3NldAordmFyaWFibGV9IGNvbW1hbmQgaW5zdGVhZCBvZiBqdXN0IEBjb2Rle3NldH0uICBUaGlzIGNvbW1hbmQgaXMgaWRlbnRpY2FsCit0byBAY29kZXtzZXR9IGV4Y2VwdCBmb3IgaXRzIGxhY2sgb2Ygc3ViY29tbWFuZHMuICBGb3IgZXhhbXBsZSwgaWYgeW91cgorcHJvZ3JhbSBoYXMgYSB2YXJpYWJsZSBAY29kZXt3aWR0aH0sIHlvdSBnZXQgYW4gZXJyb3IgaWYgeW91IHRyeSB0byBzZXQKK2EgbmV3IHZhbHVlIHdpdGgganVzdCBAc2FtcHtzZXQgd2lkdGg9MTN9LCBiZWNhdXNlIEB2YWx1ZXtHREJOfSBoYXMgdGhlCitjb21tYW5kIEBjb2Rle3NldCB3aWR0aH06CisKK0BleGFtcGxlCisoQHZhbHVle0dEQlB9KSB3aGF0aXMgd2lkdGgKK3R5cGUgPSBkb3VibGUKKyhAdmFsdWV7R0RCUH0pIHAgd2lkdGgKKyQ0ID0gMTMKKyhAdmFsdWV7R0RCUH0pIHNldCB3aWR0aD00NworSW52YWxpZCBzeW50YXggaW4gZXhwcmVzc2lvbi4KK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK1RoZSBpbnZhbGlkIGV4cHJlc3Npb24sIG9mIGNvdXJzZSwgaXMgQHNhbXB7PTQ3fS4gIEluCitvcmRlciB0byBhY3R1YWxseSBzZXQgdGhlIHByb2dyYW0ncyB2YXJpYWJsZSBAY29kZXt3aWR0aH0sIHVzZQorCitAZXhhbXBsZQorKEB2YWx1ZXtHREJQfSkgc2V0IHZhciB3aWR0aD00NworQGVuZCBleGFtcGxlCitAZW5kIGlmY2xlYXIKK0BpZnNldCBIUFBBCitCZWNhdXNlIHRoZSBAY29kZXtzZXR9IGNvbW1hbmQgaGFzIG1hbnkgc3ViY29tbWFuZHMgdGhhdCBjYW4gY29uZmxpY3QKK3dpdGggdGhlIG5hbWVzIG9mIHByb2dyYW0gdmFyaWFibGVzLCBpdCBpcyBhIGdvb2QgaWRlYSB0byB1c2UgdGhlCitAY29kZXtzZXQgdmFyaWFibGV9IGNvbW1hbmQgaW5zdGVhZCBvZiBqdXN0IEBjb2Rle3NldH0uICBGb3IgZXhhbXBsZSwgaWYKK3lvdXIgcHJvZ3JhbSBoYXMgYSB2YXJpYWJsZSBAY29kZXtnfSwgeW91IHJ1biBpbnRvIHByb2JsZW1zIGlmIHlvdSB0cnkKK3RvIHNldCBhIG5ldyB2YWx1ZSB3aXRoIGp1c3QgQHNhbXB7c2V0IGc9NH0sIGJlY2F1c2UgQHZhbHVle0dEQk59IGhhcwordGhlIGNvbW1hbmQgQGNvZGV7c2V0IGdudXRhcmdldH0sIGFiYnJldmlhdGVkIEBjb2Rle3NldCBnfToKKworQGV4YW1wbGUKK0Bncm91cAorKEB2YWx1ZXtHREJQfSkgd2hhdGlzIGcKK3R5cGUgPSBkb3VibGUKKyhAdmFsdWV7R0RCUH0pIHAgZworJDEgPSAxCisoQHZhbHVle0dEQlB9KSBzZXQgZz00CisoZ2RiKSBwIGcKKyQyID0gMQorKEB2YWx1ZXtHREJQfSkgcgorVGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgaGFzIGJlZW4gc3RhcnRlZCBhbHJlYWR5LgorU3RhcnQgaXQgZnJvbSB0aGUgYmVnaW5uaW5nPyAoeSBvciBuKSB5CitTdGFydGluZyBwcm9ncmFtOiAvaG9tZS9zbWl0aC9jY19wcm9ncy9hLm91dAorIi9ob21lL3NtaXRoL2NjX3Byb2dzL2Eub3V0IjogY2FuJ3Qgb3BlbiB0byByZWFkIHN5bWJvbHM6IEludmFsaWQgYmZkIHRhcmdldC4KKyhAdmFsdWV7R0RCUH0pIHNob3cgZworVGhlIGN1cnJlbnQgQkZEIHRhcmdldCBpcyAiPTQiLgorQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorVGhlIHByb2dyYW0gdmFyaWFibGUgQGNvZGV7Z30gZGlkIG5vdCBjaGFuZ2UsIGFuZCB5b3Ugc2lsZW50bHkgc2V0IHRoZQorQGNvZGV7Z251dGFyZ2V0fSB0byBhbiBpbnZhbGlkIHZhbHVlLiAgSW4gb3JkZXIgdG8gc2V0IHRoZSB2YXJpYWJsZQorQGNvZGV7Z30sIHVzZQorCitAZXhhbXBsZQorKEB2YWx1ZXtHREJQfSkgc2V0IHZhciBnPTQKK0BlbmQgZXhhbXBsZQorQGVuZCBpZnNldAorCitAdmFsdWV7R0RCTn0gYWxsb3dzIG1vcmUgaW1wbGljaXQgY29udmVyc2lvbnMgaW4gYXNzaWdubWVudHMgdGhhbiBDOyB5b3UgY2FuCitmcmVlbHkgc3RvcmUgYW4gaW50ZWdlciB2YWx1ZSBpbnRvIGEgcG9pbnRlciB2YXJpYWJsZSBvciB2aWNlIHZlcnNhLAorYW5kIHlvdSBjYW4gY29udmVydCBhbnkgc3RydWN0dXJlIHRvIGFueSBvdGhlciBzdHJ1Y3R1cmUgdGhhdCBpcyB0aGUKK3NhbWUgbGVuZ3RoIG9yIHNob3J0ZXIuCitAY29tbWVudCBGSVhNRTogaG93IGRvIHN0cnVjdHMgYWxpZ24vcGFkIGluIHRoZXNlIGNvbnZlcnNpb25zPworQGNvbW1lbnQgICAgICAgIC9kb2NAY3lnbnVzLmNvbSAxOGRlYzE5OTAKKworVG8gc3RvcmUgdmFsdWVzIGludG8gYXJiaXRyYXJ5IHBsYWNlcyBpbiBtZW1vcnksIHVzZSB0aGUgQHNhbXB7QHtAZG90c3t9QH19Citjb25zdHJ1Y3QgdG8gZ2VuZXJhdGUgYSB2YWx1ZSBvZiBzcGVjaWZpZWQgdHlwZSBhdCBhIHNwZWNpZmllZCBhZGRyZXNzCisoQHB4cmVme0V4cHJlc3Npb25zLCAsRXhwcmVzc2lvbnN9KS4gIEZvciBleGFtcGxlLCBAY29kZXtAe2ludEB9MHg4MzA0MH0gcmVmZXJzCit0byBtZW1vcnkgbG9jYXRpb24gQGNvZGV7MHg4MzA0MH0gYXMgYW4gaW50ZWdlciAod2hpY2ggaW1wbGllcyBhIGNlcnRhaW4gc2l6ZQorYW5kIHJlcHJlc2VudGF0aW9uIGluIG1lbW9yeSksIGFuZAorCitAZXhhbXBsZQorc2V0IEB7aW50QH0weDgzMDQwID0gNAorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorc3RvcmVzIHRoZSB2YWx1ZSA0IGludG8gdGhhdCBtZW1vcnkgbG9jYXRpb24uCisKK0Bub2RlIEp1bXBpbmcsIFNpZ25hbGluZywgQXNzaWdubWVudCwgQWx0ZXJpbmcKK0BzZWN0aW9uIENvbnRpbnVpbmcgYXQgYSBkaWZmZXJlbnQgYWRkcmVzcworCitPcmRpbmFyaWx5LCB3aGVuIHlvdSBjb250aW51ZSB5b3VyIHByb2dyYW0sIHlvdSBkbyBzbyBhdCB0aGUgcGxhY2Ugd2hlcmUKK2l0IHN0b3BwZWQsIHdpdGggdGhlIEBjb2Rle2NvbnRpbnVlfSBjb21tYW5kLiAgWW91IGNhbiBpbnN0ZWFkIGNvbnRpbnVlIGF0CithbiBhZGRyZXNzIG9mIHlvdXIgb3duIGNob29zaW5nLCB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBqdW1wCitAaXRlbSBqdW1wIEB2YXJ7bGluZXNwZWN9CitSZXN1bWUgZXhlY3V0aW9uIGF0IGxpbmUgQHZhcntsaW5lc3BlY30uICBFeGVjdXRpb24gc3RvcHMgYWdhaW4KK2ltbWVkaWF0ZWx5IGlmIHRoZXJlIGlzIGEgYnJlYWtwb2ludCB0aGVyZS4gIEB4cmVme0xpc3QsICxQcmludGluZworc291cmNlIGxpbmVzfSwgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGRpZmZlcmVudCBmb3JtcyBvZgorQHZhcntsaW5lc3BlY30uICBJdCBpcyBjb21tb24gcHJhY3RpY2UgdG8gdXNlIHRoZSBAY29kZXt0YnJlYWt9IGNvbW1hbmQKK2luIGNvbmp1bmN0aW9uIHdpdGggQGNvZGV7anVtcH0uICBAeHJlZntTZXQgQnJlYWtzLCAsU2V0dGluZworYnJlYWtwb2ludHN9LgorCitUaGUgQGNvZGV7anVtcH0gY29tbWFuZCBkb2VzIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnQgc3RhY2sgZnJhbWUsIG9yCit0aGUgc3RhY2sgcG9pbnRlciwgb3IgdGhlIGNvbnRlbnRzIG9mIGFueSBtZW1vcnkgbG9jYXRpb24gb3IgYW55CityZWdpc3RlciBvdGhlciB0aGFuIHRoZSBwcm9ncmFtIGNvdW50ZXIuICBJZiBsaW5lIEB2YXJ7bGluZXNwZWN9IGlzIGluCithIGRpZmZlcmVudCBmdW5jdGlvbiBmcm9tIHRoZSBvbmUgY3VycmVudGx5IGV4ZWN1dGluZywgdGhlIHJlc3VsdHMgbWF5CitiZSBiaXphcnJlIGlmIHRoZSB0d28gZnVuY3Rpb25zIGV4cGVjdCBkaWZmZXJlbnQgcGF0dGVybnMgb2YgYXJndW1lbnRzIG9yCitvZiBsb2NhbCB2YXJpYWJsZXMuICBGb3IgdGhpcyByZWFzb24sIHRoZSBAY29kZXtqdW1wfSBjb21tYW5kIHJlcXVlc3RzCitjb25maXJtYXRpb24gaWYgdGhlIHNwZWNpZmllZCBsaW5lIGlzIG5vdCBpbiB0aGUgZnVuY3Rpb24gY3VycmVudGx5CitleGVjdXRpbmcuICBIb3dldmVyLCBldmVuIGJpemFycmUgcmVzdWx0cyBhcmUgcHJlZGljdGFibGUgaWYgeW91IGFyZQord2VsbCBhY3F1YWludGVkIHdpdGggdGhlIG1hY2hpbmUtbGFuZ3VhZ2UgY29kZSBvZiB5b3VyIHByb2dyYW0uCisKK0BpdGVtIGp1bXAgKkB2YXJ7YWRkcmVzc30KK1Jlc3VtZSBleGVjdXRpb24gYXQgdGhlIGluc3RydWN0aW9uIGF0IGFkZHJlc3MgQHZhcnthZGRyZXNzfS4KK0BlbmQgdGFibGUKKworQGlmY2xlYXIgSFBQQQorQGMgRG9lc24ndCB3b3JrIG9uIEhQLVVYOyBoYXZlIHRvIHNldCAkcGNvcWggYW5kICRwY29xdC4KK1lvdSBjYW4gZ2V0IG11Y2ggdGhlIHNhbWUgZWZmZWN0IGFzIHRoZSBAY29kZXtqdW1wfSBjb21tYW5kIGJ5IHN0b3JpbmcgYQorbmV3IHZhbHVlIGludG8gdGhlIHJlZ2lzdGVyIEBjb2RleyRwY30uICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMKK2RvZXMgbm90IHN0YXJ0IHlvdXIgcHJvZ3JhbSBydW5uaW5nOyBpdCBvbmx5IGNoYW5nZXMgdGhlIGFkZHJlc3Mgb2Ygd2hlcmUgaXQKK0BlbXBoe3dpbGx9IHJ1biB3aGVuIHlvdSBjb250aW51ZS4gIEZvciBleGFtcGxlLAorCitAZXhhbXBsZQorc2V0ICRwYyA9IDB4NDg1CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CittYWtlcyB0aGUgbmV4dCBAY29kZXtjb250aW51ZX0gY29tbWFuZCBvciBzdGVwcGluZyBjb21tYW5kIGV4ZWN1dGUgYXQKK2FkZHJlc3MgQGNvZGV7MHg0ODV9LCByYXRoZXIgdGhhbiBhdCB0aGUgYWRkcmVzcyB3aGVyZSB5b3VyIHByb2dyYW0gc3RvcHBlZC4KK0B4cmVme0NvbnRpbnVpbmcgYW5kIFN0ZXBwaW5nLCAsQ29udGludWluZyBhbmQgc3RlcHBpbmd9LgorQGVuZCBpZmNsZWFyCisKK1RoZSBtb3N0IGNvbW1vbiBvY2Nhc2lvbiB0byB1c2UgdGhlIEBjb2Rle2p1bXB9IGNvbW1hbmQgaXMgdG8gYmFjawordXAtLS1wZXJoYXBzIHdpdGggbW9yZSBicmVha3BvaW50cyBzZXQtLS1vdmVyIGEgcG9ydGlvbiBvZiBhIHByb2dyYW0KK3RoYXQgaGFzIGFscmVhZHkgZXhlY3V0ZWQsIGluIG9yZGVyIHRvIGV4YW1pbmUgaXRzIGV4ZWN1dGlvbiBpbiBtb3JlCitkZXRhaWwuCisKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK0BjIEBncm91cAorQG5vZGUgU2lnbmFsaW5nLCBSZXR1cm5pbmcsIEp1bXBpbmcsIEFsdGVyaW5nCitAc2VjdGlvbiBHaXZpbmcgeW91ciBwcm9ncmFtIGEgc2lnbmFsCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBzaWduYWwKK0BpdGVtIHNpZ25hbCBAdmFye3NpZ25hbH0KK1Jlc3VtZSBleGVjdXRpb24gd2hlcmUgeW91ciBwcm9ncmFtIHN0b3BwZWQsIGJ1dCBpbW1lZGlhdGVseSBnaXZlIGl0IHRoZQorc2lnbmFsIEB2YXJ7c2lnbmFsfS4gIEB2YXJ7c2lnbmFsfSBjYW4gYmUgdGhlIG5hbWUgb3IgdGhlIG51bWJlciBvZiBhCitzaWduYWwuICBGb3IgZXhhbXBsZSwgb24gbWFueSBzeXN0ZW1zIEBjb2Rle3NpZ25hbCAyfSBhbmQgQGNvZGV7c2lnbmFsCitTSUdJTlR9IGFyZSBib3RoIHdheXMgb2Ygc2VuZGluZyBhbiBpbnRlcnJ1cHQgc2lnbmFsLgorCitBbHRlcm5hdGl2ZWx5LCBpZiBAdmFye3NpZ25hbH0gaXMgemVybywgY29udGludWUgZXhlY3V0aW9uIHdpdGhvdXQKK2dpdmluZyBhIHNpZ25hbC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91ciBwcm9ncmFtIHN0b3BwZWQgb24gYWNjb3VudCBvZgorYSBzaWduYWwgYW5kIHdvdWxkIG9yZGluYXJ5IHNlZSB0aGUgc2lnbmFsIHdoZW4gcmVzdW1lZCB3aXRoIHRoZQorQGNvZGV7Y29udGludWV9IGNvbW1hbmQ7IEBzYW1we3NpZ25hbCAwfSBjYXVzZXMgaXQgdG8gcmVzdW1lIHdpdGhvdXQgYQorc2lnbmFsLgorCitAY29kZXtzaWduYWx9IGRvZXMgbm90IHJlcGVhdCB3aGVuIHlvdSBwcmVzcyBAa2V5e1JFVH0gYSBzZWNvbmQgdGltZQorYWZ0ZXIgZXhlY3V0aW5nIHRoZSBjb21tYW5kLgorQGVuZCB0YWJsZQorQGMgQGVuZCBncm91cAorCitJbnZva2luZyB0aGUgQGNvZGV7c2lnbmFsfSBjb21tYW5kIGlzIG5vdCB0aGUgc2FtZSBhcyBpbnZva2luZyB0aGUKK0Bjb2Rle2tpbGx9IHV0aWxpdHkgZnJvbSB0aGUgc2hlbGwuICBTZW5kaW5nIGEgc2lnbmFsIHdpdGggQGNvZGV7a2lsbH0KK2NhdXNlcyBAdmFsdWV7R0RCTn0gdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgc2lnbmFsIGRlcGVuZGluZyBvbgordGhlIHNpZ25hbCBoYW5kbGluZyB0YWJsZXMgKEBweHJlZntTaWduYWxzfSkuICBUaGUgQGNvZGV7c2lnbmFsfSBjb21tYW5kCitwYXNzZXMgdGhlIHNpZ25hbCBkaXJlY3RseSB0byB5b3VyIHByb2dyYW0uCisKK0BlbmQgaWZjbGVhcgorCitAbm9kZSBSZXR1cm5pbmcsIENhbGxpbmcsIFNpZ25hbGluZywgQWx0ZXJpbmcKK0BzZWN0aW9uIFJldHVybmluZyBmcm9tIGEgZnVuY3Rpb24KKworQHRhYmxlIEBjb2RlCitAY2luZGV4IHJldHVybmluZyBmcm9tIGEgZnVuY3Rpb24KK0BraW5kZXggcmV0dXJuCitAaXRlbSByZXR1cm4KK0BpdGVteCByZXR1cm4gQHZhcntleHByZXNzaW9ufQorWW91IGNhbiBjYW5jZWwgZXhlY3V0aW9uIG9mIGEgZnVuY3Rpb24gY2FsbCB3aXRoIHRoZSBAY29kZXtyZXR1cm59Citjb21tYW5kLiAgSWYgeW91IGdpdmUgYW4KK0B2YXJ7ZXhwcmVzc2lvbn0gYXJndW1lbnQsIGl0cyB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBmdW5jdGlvbidzIHJldHVybgordmFsdWUuCitAZW5kIHRhYmxlCisKK1doZW4geW91IHVzZSBAY29kZXtyZXR1cm59LCBAdmFsdWV7R0RCTn0gZGlzY2FyZHMgdGhlIHNlbGVjdGVkIHN0YWNrIGZyYW1lCisoYW5kIGFsbCBmcmFtZXMgd2l0aGluIGl0KS4gIFlvdSBjYW4gdGhpbmsgb2YgdGhpcyBhcyBtYWtpbmcgdGhlCitkaXNjYXJkZWQgZnJhbWUgcmV0dXJuIHByZW1hdHVyZWx5LiAgSWYgeW91IHdpc2ggdG8gc3BlY2lmeSBhIHZhbHVlIHRvCitiZSByZXR1cm5lZCwgZ2l2ZSB0aGF0IHZhbHVlIGFzIHRoZSBhcmd1bWVudCB0byBAY29kZXtyZXR1cm59LgorCitUaGlzIHBvcHMgdGhlIHNlbGVjdGVkIHN0YWNrIGZyYW1lIChAcHhyZWZ7U2VsZWN0aW9uLCAsU2VsZWN0aW5nIGEKK2ZyYW1lfSksIGFuZCBhbnkgb3RoZXIgZnJhbWVzIGluc2lkZSBvZiBpdCwgbGVhdmluZyBpdHMgY2FsbGVyIGFzIHRoZQoraW5uZXJtb3N0IHJlbWFpbmluZyBmcmFtZS4gIFRoYXQgZnJhbWUgYmVjb21lcyBzZWxlY3RlZC4gIFRoZQorc3BlY2lmaWVkIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgcmVnaXN0ZXJzIHVzZWQgZm9yIHJldHVybmluZyB2YWx1ZXMKK29mIGZ1bmN0aW9ucy4KKworVGhlIEBjb2Rle3JldHVybn0gY29tbWFuZCBkb2VzIG5vdCByZXN1bWUgZXhlY3V0aW9uOyBpdCBsZWF2ZXMgdGhlCitwcm9ncmFtIHN0b3BwZWQgaW4gdGhlIHN0YXRlIHRoYXQgd291bGQgZXhpc3QgaWYgdGhlIGZ1bmN0aW9uIGhhZCBqdXN0CityZXR1cm5lZC4gIEluIGNvbnRyYXN0LCB0aGUgQGNvZGV7ZmluaXNofSBjb21tYW5kIChAcHhyZWZ7Q29udGludWluZworYW5kIFN0ZXBwaW5nLCAsQ29udGludWluZyBhbmQgc3RlcHBpbmd9KSByZXN1bWVzIGV4ZWN1dGlvbiB1bnRpbCB0aGUKK3NlbGVjdGVkIHN0YWNrIGZyYW1lIHJldHVybnMgbmF0dXJhbGx5LgorCitAbm9kZSBDYWxsaW5nLCBQYXRjaGluZywgUmV0dXJuaW5nLCBBbHRlcmluZworQHNlY3Rpb24gQ2FsbGluZyBwcm9ncmFtIGZ1bmN0aW9ucworCitAY2luZGV4IGNhbGxpbmcgZnVuY3Rpb25zCitAa2luZGV4IGNhbGwKK0B0YWJsZSBAY29kZQorQGl0ZW0gY2FsbCBAdmFye2V4cHJ9CitFdmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBAdmFye2V4cHJ9IHdpdGhvdXQgZGlzcGxheWluZyBAY29kZXt2b2lkfQorcmV0dXJuZWQgdmFsdWVzLgorQGVuZCB0YWJsZQorCitZb3UgY2FuIHVzZSB0aGlzIHZhcmlhbnQgb2YgdGhlIEBjb2Rle3ByaW50fSBjb21tYW5kIGlmIHlvdSB3YW50IHRvCitleGVjdXRlIGEgZnVuY3Rpb24gZnJvbSB5b3VyIHByb2dyYW0sIGJ1dCB3aXRob3V0IGNsdXR0ZXJpbmcgdGhlIG91dHB1dAord2l0aCBAY29kZXt2b2lkfSByZXR1cm5lZCB2YWx1ZXMuICBJZiB0aGUgcmVzdWx0IGlzIG5vdCB2b2lkLCBpdCAKK2lzIHByaW50ZWQgYW5kIHNhdmVkIGluIHRoZSB2YWx1ZSBoaXN0b3J5LiAKKworQGlmY2xlYXIgSFBQQQorRm9yIHRoZSBBMjlLLCBhIHVzZXItY29udHJvbGxlZCB2YXJpYWJsZSBAY29kZXtjYWxsX3NjcmF0Y2hfYWRkcmVzc30sCitzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIGEgc2NyYXRjaCBhcmVhIHRvIGJlIHVzZWQgd2hlbiBAdmFsdWV7R0RCTn0KK2NhbGxzIGEgZnVuY3Rpb24gaW4gdGhlIHRhcmdldC4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHVzdWFsCittZXRob2Qgb2YgcHV0dGluZyB0aGUgc2NyYXRjaCBhcmVhIG9uIHRoZSBzdGFjayBkb2VzIG5vdCB3b3JrIGluIHN5c3RlbXMKK3RoYXQgaGF2ZSBzZXBhcmF0ZSBpbnN0cnVjdGlvbiBhbmQgZGF0YSBzcGFjZXMuCitAZW5kIGlmY2xlYXIKKworQG5vZGUgUGF0Y2hpbmcsICAsIENhbGxpbmcsIEFsdGVyaW5nCitAc2VjdGlvbiBQYXRjaGluZyBwcm9ncmFtcworQGNpbmRleCBwYXRjaGluZyBiaW5hcmllcworQGNpbmRleCB3cml0aW5nIGludG8gZXhlY3V0YWJsZXMKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK0BjaW5kZXggd3JpdGluZyBpbnRvIGNvcmVmaWxlcworQGVuZCBpZmNsZWFyCisKK0J5IGRlZmF1bHQsIEB2YWx1ZXtHREJOfSBvcGVucyB0aGUgZmlsZSBjb250YWluaW5nIHlvdXIgcHJvZ3JhbSdzIGV4ZWN1dGFibGUKK2NvZGUKK0BpZmNsZWFyIEJBUkVUQVJHRVQKKyhvciB0aGUgY29yZWZpbGUpCitAZW5kIGlmY2xlYXIKK3JlYWQtb25seS4gIFRoaXMgcHJldmVudHMgYWNjaWRlbnRhbCBhbHRlcmF0aW9ucwordG8gbWFjaGluZSBjb2RlOyBidXQgaXQgYWxzbyBwcmV2ZW50cyB5b3UgZnJvbSBpbnRlbnRpb25hbGx5IHBhdGNoaW5nCit5b3VyIHByb2dyYW0ncyBiaW5hcnkuCisKK0lmIHlvdSdkIGxpa2UgdG8gYmUgYWJsZSB0byBwYXRjaCB0aGUgYmluYXJ5LCB5b3UgY2FuIHNwZWNpZnkgdGhhdAorZXhwbGljaXRseSB3aXRoIHRoZSBAY29kZXtzZXQgd3JpdGV9IGNvbW1hbmQuICBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0Cit3YW50IHRvIHR1cm4gb24gaW50ZXJuYWwgZGVidWdnaW5nIGZsYWdzLCBvciBldmVuIHRvIG1ha2UgZW1lcmdlbmN5CityZXBhaXJzLgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggc2V0IHdyaXRlCitAaXRlbSBzZXQgd3JpdGUgb24KK0BpdGVteCBzZXQgd3JpdGUgb2ZmCitJZiB5b3Ugc3BlY2lmeSBAc2FtcHtzZXQgd3JpdGUgb259LCBAdmFsdWV7R0RCTn0gb3BlbnMgZXhlY3V0YWJsZSAKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK2FuZCBjb3JlCitAZW5kIGlmY2xlYXIKK2ZpbGVzIGZvciBib3RoIHJlYWRpbmcgYW5kIHdyaXRpbmc7IGlmIHlvdSBzcGVjaWZ5IEBzYW1we3NldCB3cml0ZQorb2ZmfSAodGhlIGRlZmF1bHQpLCBAdmFsdWV7R0RCTn0gb3BlbnMgdGhlbSByZWFkLW9ubHkuCisKK0lmIHlvdSBoYXZlIGFscmVhZHkgbG9hZGVkIGEgZmlsZSwgeW91IG11c3QgbG9hZCBpdCBhZ2FpbiAodXNpbmcgdGhlCitAY29kZXtleGVjLWZpbGV9CitAaWZjbGVhciBCQVJFVEFSR0VUCitvciBAY29kZXtjb3JlLWZpbGV9CitAZW5kIGlmY2xlYXIKK2NvbW1hbmQpIGFmdGVyIGNoYW5naW5nIEBjb2Rle3NldCB3cml0ZX0sIGZvciB5b3VyIG5ldyBzZXR0aW5nIHRvIHRha2UKK2VmZmVjdC4KKworQGl0ZW0gc2hvdyB3cml0ZQorQGtpbmRleCBzaG93IHdyaXRlCitEaXNwbGF5IHdoZXRoZXIgZXhlY3V0YWJsZSBmaWxlcyAKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK2FuZCBjb3JlIGZpbGVzIAorQGVuZCBpZmNsZWFyCithcmUgb3BlbmVkIGZvciB3cml0aW5nIGFzIHdlbGwgYXMgcmVhZGluZy4KK0BlbmQgdGFibGUKKworQG5vZGUgR0RCIEZpbGVzLCBUYXJnZXRzLCBBbHRlcmluZywgVG9wCitAY2hhcHRlciBAdmFsdWV7R0RCTn0gRmlsZXMKKworQHZhbHVle0dEQk59IG5lZWRzIHRvIGtub3cgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byBiZSBkZWJ1Z2dlZCwgYm90aCBpbgorb3JkZXIgdG8gcmVhZCBpdHMgc3ltYm9sIHRhYmxlIGFuZCBpbiBvcmRlciB0byBzdGFydCB5b3VyIHByb2dyYW0uICAKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK1RvIGRlYnVnIGEgY29yZSBkdW1wIG9mIGEgcHJldmlvdXMgcnVuLCB5b3UgbXVzdCBhbHNvIHRlbGwgQHZhbHVle0dEQk59Cit0aGUgbmFtZSBvZiB0aGUgY29yZSBkdW1wIGZpbGUuCitAZW5kIGlmY2xlYXIKKworQG1lbnUKKyogRmlsZXM6OiAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZHMgdG8gc3BlY2lmeSBmaWxlcworKiBTeW1ib2wgRXJyb3JzOjogICAgICAgICAgICAgICBFcnJvcnMgcmVhZGluZyBzeW1ib2wgZmlsZXMKK0BlbmQgbWVudQorCitAbm9kZSBGaWxlcywgU3ltYm9sIEVycm9ycywgR0RCIEZpbGVzLCBHREIgRmlsZXMKK0BzZWN0aW9uIENvbW1hbmRzIHRvIHNwZWNpZnkgZmlsZXMKK0BjaW5kZXggc3ltYm9sIHRhYmxlCisKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK0BjaW5kZXggY29yZSBkdW1wIGZpbGUKK1lvdSBtYXkgd2FudCB0byBzcGVjaWZ5IGV4ZWN1dGFibGUgYW5kIGNvcmUgZHVtcCBmaWxlIG5hbWVzLgorVGhlIHVzdWFsIHdheSB0byBkbyB0aGlzIGlzIGF0IHN0YXJ0LXVwIHRpbWUsIHVzaW5nIHRoZSBhcmd1bWVudHMgdG8gCitAdmFsdWV7R0RCTn0ncyBzdGFydC11cCBjb21tYW5kcyAoQHB4cmVme0ludm9jYXRpb24sICwKK0dldHRpbmcgSW4gYW5kIE91dCBvZiBAdmFsdWV7R0RCTn19KS4KK0BlbmQgaWZjbGVhcgorQGlmc2V0IEJBUkVUQVJHRVQKK1RoZSB1c3VhbCB3YXkgdG8gc3BlY2lmeSBhbiBleGVjdXRhYmxlIGZpbGUgbmFtZSBpcyB3aXRoCit0aGUgY29tbWFuZCBhcmd1bWVudCBnaXZlbiB3aGVuIHlvdSBzdGFydCBAdmFsdWV7R0RCTn0sIChAcHhyZWZ7SW52b2NhdGlvbiwKKyxHZXR0aW5nIEluIGFuZCBPdXQgb2YgQHZhbHVle0dEQk59fS4KK0BlbmQgaWZzZXQKKworT2NjYXNpb25hbGx5IGl0IGlzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgdG8gYSBkaWZmZXJlbnQgZmlsZSBkdXJpbmcgYQorQHZhbHVle0dEQk59IHNlc3Npb24uICBPciB5b3UgbWF5IHJ1biBAdmFsdWV7R0RCTn0gYW5kIGZvcmdldCB0byBzcGVjaWZ5CithIGZpbGUgeW91IHdhbnQgdG8gdXNlLiAgSW4gdGhlc2Ugc2l0dWF0aW9ucyB0aGUgQHZhbHVle0dEQk59IGNvbW1hbmRzCit0byBzcGVjaWZ5IG5ldyBmaWxlcyBhcmUgdXNlZnVsLgorCitAdGFibGUgQGNvZGUKK0BjaW5kZXggZXhlY3V0YWJsZSBmaWxlCitAa2luZGV4IGZpbGUKK0BpdGVtIGZpbGUgQHZhcntmaWxlbmFtZX0KK1VzZSBAdmFye2ZpbGVuYW1lfSBhcyB0aGUgcHJvZ3JhbSB0byBiZSBkZWJ1Z2dlZC4gIEl0IGlzIHJlYWQgZm9yIGl0cworc3ltYm9scyBhbmQgZm9yIHRoZSBjb250ZW50cyBvZiBwdXJlIG1lbW9yeS4gIEl0IGlzIGFsc28gdGhlIHByb2dyYW0KK2V4ZWN1dGVkIHdoZW4geW91IHVzZSB0aGUgQGNvZGV7cnVufSBjb21tYW5kLiAgSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEKK2RpcmVjdG9yeSBhbmQgdGhlIGZpbGUgaXMgbm90IGZvdW5kIGluIHRoZSBAdmFsdWV7R0RCTn0gd29ya2luZyBkaXJlY3RvcnksIAorQHZhbHVle0dEQk59IHVzZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle1BBVEh9IGFzIGEgbGlzdCBvZiAKK2RpcmVjdG9yaWVzIHRvIHNlYXJjaCwganVzdCBhcyB0aGUgc2hlbGwgZG9lcyB3aGVuIGxvb2tpbmcgZm9yIGEgcHJvZ3JhbSAKK3RvIHJ1bi4gIFlvdSBjYW4gY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGlzIHZhcmlhYmxlLCBmb3IgYm90aCBAdmFsdWV7R0RCTn0gCithbmQgeW91ciBwcm9ncmFtLCB1c2luZyB0aGUgQGNvZGV7cGF0aH0gY29tbWFuZC4KKworQGlmY2xlYXIgSFBQQQorT24gc3lzdGVtcyB3aXRoIG1lbW9yeS1tYXBwZWQgZmlsZXMsIGFuIGF1eGlsaWFyeSBmaWxlCitAZmlsZXtAdmFye2ZpbGVuYW1lfS5zeW1zfSBtYXkgaG9sZCBzeW1ib2wgdGFibGUgaW5mb3JtYXRpb24gZm9yCitAdmFye2ZpbGVuYW1lfS4gIElmIHNvLCBAdmFsdWV7R0RCTn0gbWFwcyBpbiB0aGUgc3ltYm9sIHRhYmxlIGZyb20KK0BmaWxle0B2YXJ7ZmlsZW5hbWV9LnN5bXN9LCBzdGFydGluZyB1cCBtb3JlIHF1aWNrbHkuICBTZWUgdGhlCitkZXNjcmlwdGlvbnMgb2YgdGhlIGZpbGUgb3B0aW9ucyBAc2FtcHstbWFwcGVkfSBhbmQgQHNhbXB7LXJlYWRub3d9CisoYXZhaWxhYmxlIG9uIHRoZSBjb21tYW5kIGxpbmUsIGFuZCB3aXRoIHRoZSBjb21tYW5kcyBAY29kZXtmaWxlfSwKK0Bjb2Rle3N5bWJvbC1maWxlfSwgb3IgQGNvZGV7YWRkLXN5bWJvbC1maWxlfSwgZGVzY3JpYmVkIGJlbG93KSwgCitmb3IgbW9yZSBpbmZvcm1hdGlvbi4KK0BlbmQgaWZjbGVhcgorCitAaXRlbSBmaWxlCitAY29kZXtmaWxlfSB3aXRoIG5vIGFyZ3VtZW50IG1ha2VzIEB2YWx1ZXtHREJOfSBkaXNjYXJkIGFueSBpbmZvcm1hdGlvbiBpdAoraGFzIG9uIGJvdGggZXhlY3V0YWJsZSBmaWxlIGFuZCB0aGUgc3ltYm9sIHRhYmxlLgorCitAa2luZGV4IGV4ZWMtZmlsZQorQGl0ZW0gZXhlYy1maWxlIEBye1t9IEB2YXJ7ZmlsZW5hbWV9IEBye119CitTcGVjaWZ5IHRoYXQgdGhlIHByb2dyYW0gdG8gYmUgcnVuIChidXQgbm90IHRoZSBzeW1ib2wgdGFibGUpIGlzIGZvdW5kCitpbiBAdmFye2ZpbGVuYW1lfS4gIEB2YWx1ZXtHREJOfSBzZWFyY2hlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQGNvZGV7UEFUSH0KK2lmIG5lY2Vzc2FyeSB0byBsb2NhdGUgeW91ciBwcm9ncmFtLiAgT21pdHRpbmcgQHZhcntmaWxlbmFtZX0gbWVhbnMgdG8KK2Rpc2NhcmQgaW5mb3JtYXRpb24gb24gdGhlIGV4ZWN1dGFibGUgZmlsZS4KKworQGtpbmRleCBzeW1ib2wtZmlsZQorQGl0ZW0gc3ltYm9sLWZpbGUgQHJ7W30gQHZhcntmaWxlbmFtZX0gQHJ7XX0KK1JlYWQgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uIGZyb20gZmlsZSBAdmFye2ZpbGVuYW1lfS4gIEBjb2Rle1BBVEh9IGlzCitzZWFyY2hlZCB3aGVuIG5lY2Vzc2FyeS4gIFVzZSB0aGUgQGNvZGV7ZmlsZX0gY29tbWFuZCB0byBnZXQgYm90aCBzeW1ib2wKK3RhYmxlIGFuZCBwcm9ncmFtIHRvIHJ1biBmcm9tIHRoZSBzYW1lIGZpbGUuCisKK0Bjb2Rle3N5bWJvbC1maWxlfSB3aXRoIG5vIGFyZ3VtZW50IGNsZWFycyBvdXQgQHZhbHVle0dEQk59IGluZm9ybWF0aW9uIG9uIHlvdXIKK3Byb2dyYW0ncyBzeW1ib2wgdGFibGUuCisKK1RoZSBAY29kZXtzeW1ib2wtZmlsZX0gY29tbWFuZCBjYXVzZXMgQHZhbHVle0dEQk59IHRvIGZvcmdldCB0aGUgY29udGVudHMgCitvZiBpdHMgY29udmVuaWVuY2UgdmFyaWFibGVzLCB0aGUgdmFsdWUgaGlzdG9yeSwgYW5kIGFsbCBicmVha3BvaW50cyBhbmQKK2F1dG8tZGlzcGxheSBleHByZXNzaW9ucy4gIFRoaXMgaXMgYmVjYXVzZSB0aGV5IG1heSBjb250YWluIHBvaW50ZXJzIHRvCit0aGUgaW50ZXJuYWwgZGF0YSByZWNvcmRpbmcgc3ltYm9scyBhbmQgZGF0YSB0eXBlcywgd2hpY2ggYXJlIHBhcnQgb2YKK3RoZSBvbGQgc3ltYm9sIHRhYmxlIGRhdGEgYmVpbmcgZGlzY2FyZGVkIGluc2lkZSBAdmFsdWV7R0RCTn0uCisKK0Bjb2Rle3N5bWJvbC1maWxlfSBkb2VzIG5vdCByZXBlYXQgaWYgeW91IHByZXNzIEBrZXl7UkVUfSBhZ2FpbiBhZnRlcgorZXhlY3V0aW5nIGl0IG9uY2UuCisKK1doZW4gQHZhbHVle0dEQk59IGlzIGNvbmZpZ3VyZWQgZm9yIGEgcGFydGljdWxhciBlbnZpcm9ubWVudCwgaXQKK3VuZGVyc3RhbmRzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiB3aGF0ZXZlciBmb3JtYXQgaXMgdGhlIHN0YW5kYXJkCitnZW5lcmF0ZWQgZm9yIHRoYXQgZW52aXJvbm1lbnQ7IHlvdSBtYXkgdXNlIGVpdGhlciBhIEBzY3tnbnV9IGNvbXBpbGVyLCBvcgorb3RoZXIgY29tcGlsZXJzIHRoYXQgYWRoZXJlIHRvIHRoZSBsb2NhbCBjb252ZW50aW9ucy4KK0BpZmNsZWFyIEhQUEEKK0Jlc3QgcmVzdWx0cyBhcmUgdXN1YWxseSBvYnRhaW5lZCBmcm9tIEBzY3tnbnV9IGNvbXBpbGVyczsgZm9yIGV4YW1wbGUsCit1c2luZyBAY29kZXtAdmFsdWV7R0NDfX0geW91IGNhbiBnZW5lcmF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yCitvcHRpbWl6ZWQgY29kZS4KK0BlbmQgaWZjbGVhcgorCitGb3IgbW9zdCBraW5kcyBvZiBvYmplY3QgZmlsZXMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBvbGQgU1ZSMyBzeXN0ZW1zCit1c2luZyBDT0ZGLCB0aGUgQGNvZGV7c3ltYm9sLWZpbGV9IGNvbW1hbmQgZG9lcyBub3Qgbm9ybWFsbHkgcmVhZCB0aGUKK3N5bWJvbCB0YWJsZSBpbiBmdWxsIHJpZ2h0IGF3YXkuICBJbnN0ZWFkLCBpdCBzY2FucyB0aGUgc3ltYm9sIHRhYmxlCitxdWlja2x5IHRvIGZpbmQgd2hpY2ggc291cmNlIGZpbGVzIGFuZCB3aGljaCBzeW1ib2xzIGFyZSBwcmVzZW50LiAgVGhlCitkZXRhaWxzIGFyZSByZWFkIGxhdGVyLCBvbmUgc291cmNlIGZpbGUgYXQgYSB0aW1lLCBhcyB0aGV5IGFyZSBuZWVkZWQuCisKK1RoZSBwdXJwb3NlIG9mIHRoaXMgdHdvLXN0YWdlIHJlYWRpbmcgc3RyYXRlZ3kgaXMgdG8gbWFrZSBAdmFsdWV7R0RCTn0KK3N0YXJ0IHVwIGZhc3Rlci4gIEZvciB0aGUgbW9zdCBwYXJ0LCBpdCBpcyBpbnZpc2libGUgZXhjZXB0IGZvcgorb2NjYXNpb25hbCBwYXVzZXMgd2hpbGUgdGhlIHN5bWJvbCB0YWJsZSBkZXRhaWxzIGZvciBhIHBhcnRpY3VsYXIgc291cmNlCitmaWxlIGFyZSBiZWluZyByZWFkLiAgKFRoZSBAY29kZXtzZXQgdmVyYm9zZX0gY29tbWFuZCBjYW4gdHVybiB0aGVzZQorcGF1c2VzIGludG8gbWVzc2FnZXMgaWYgZGVzaXJlZC4gIEB4cmVme01lc3NhZ2VzL1dhcm5pbmdzLCAsT3B0aW9uYWwKK3dhcm5pbmdzIGFuZCBtZXNzYWdlc30uKQorCitAaWZjbGVhciBIUFBBCitXZSBoYXZlIG5vdCBpbXBsZW1lbnRlZCB0aGUgdHdvLXN0YWdlIHN0cmF0ZWd5IGZvciBDT0ZGIHlldC4gIFdoZW4gdGhlCitzeW1ib2wgdGFibGUgaXMgc3RvcmVkIGluIENPRkYgZm9ybWF0LCBAY29kZXtzeW1ib2wtZmlsZX0gcmVhZHMgdGhlCitzeW1ib2wgdGFibGUgZGF0YSBpbiBmdWxsIHJpZ2h0IGF3YXkuICBOb3RlIHRoYXQgYGBzdGFicy1pbi1DT0ZGJycKK3N0aWxsIGRvZXMgdGhlIHR3by1zdGFnZSBzdHJhdGVneSwgc2luY2UgdGhlIGRlYnVnIGluZm8gaXMgYWN0dWFsbHkKK2luIHN0YWJzIGZvcm1hdC4KKworQGtpbmRleCByZWFkbm93CitAY2luZGV4IHJlYWRpbmcgc3ltYm9scyBpbW1lZGlhdGVseQorQGNpbmRleCBzeW1ib2xzLCByZWFkaW5nIGltbWVkaWF0ZWx5CitAa2luZGV4IG1hcHBlZAorQGNpbmRleCBtZW1vcnktbWFwcGVkIHN5bWJvbCBmaWxlCitAY2luZGV4IHNhdmluZyBzeW1ib2wgdGFibGUKK0BpdGVtIHN5bWJvbC1maWxlIEB2YXJ7ZmlsZW5hbWV9IEBye1t9IC1yZWFkbm93IEBye119IEBye1t9IC1tYXBwZWQgQHJ7XX0KK0BpdGVteCBmaWxlIEB2YXJ7ZmlsZW5hbWV9IEBye1t9IC1yZWFkbm93IEBye119IEBye1t9IC1tYXBwZWQgQHJ7XX0KK1lvdSBjYW4gb3ZlcnJpZGUgdGhlIEB2YWx1ZXtHREJOfSB0d28tc3RhZ2Ugc3RyYXRlZ3kgZm9yIHJlYWRpbmcgc3ltYm9sCit0YWJsZXMgYnkgdXNpbmcgdGhlIEBzYW1wey1yZWFkbm93fSBvcHRpb24gd2l0aCBhbnkgb2YgdGhlIGNvbW1hbmRzIHRoYXQKK2xvYWQgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uLCBpZiB5b3Ugd2FudCB0byBiZSBzdXJlIEB2YWx1ZXtHREJOfSBoYXMgdGhlCitlbnRpcmUgc3ltYm9sIHRhYmxlIGF2YWlsYWJsZS4gIAorQGVuZCBpZmNsZWFyCisKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK0BpZmNsZWFyIEhQUEEKK0lmIG1lbW9yeS1tYXBwZWQgZmlsZXMgYXJlIGF2YWlsYWJsZSBvbiB5b3VyIHN5c3RlbSB0aHJvdWdoIHRoZQorQGNvZGV7bW1hcH0gc3lzdGVtIGNhbGwsIHlvdSBjYW4gdXNlIGFub3RoZXIgb3B0aW9uLCBAc2FtcHstbWFwcGVkfSwgdG8KK2NhdXNlIEB2YWx1ZXtHREJOfSB0byB3cml0ZSB0aGUgc3ltYm9scyBmb3IgeW91ciBwcm9ncmFtIGludG8gYSByZXVzYWJsZQorZmlsZS4gIEZ1dHVyZSBAdmFsdWV7R0RCTn0gZGVidWdnaW5nIHNlc3Npb25zIG1hcCBpbiBzeW1ib2wgaW5mb3JtYXRpb24KK2Zyb20gdGhpcyBhdXhpbGlhcnkgc3ltYm9sIGZpbGUgKGlmIHRoZSBwcm9ncmFtIGhhcyBub3QgY2hhbmdlZCksIHJhdGhlcgordGhhbiBzcGVuZGluZyB0aW1lIHJlYWRpbmcgdGhlIHN5bWJvbCB0YWJsZSBmcm9tIHRoZSBleGVjdXRhYmxlCitwcm9ncmFtLiAgVXNpbmcgdGhlIEBzYW1wey1tYXBwZWR9IG9wdGlvbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzCitzdGFydGluZyBAdmFsdWV7R0RCTn0gd2l0aCB0aGUgQHNhbXB7LW1hcHBlZH0gY29tbWFuZC1saW5lIG9wdGlvbi4KKworWW91IGNhbiB1c2UgYm90aCBvcHRpb25zIHRvZ2V0aGVyLCB0byBtYWtlIHN1cmUgdGhlIGF1eGlsaWFyeSBzeW1ib2wKK2ZpbGUgaGFzIGFsbCB0aGUgc3ltYm9sIGluZm9ybWF0aW9uIGZvciB5b3VyIHByb2dyYW0uCisKK1RoZSBhdXhpbGlhcnkgc3ltYm9sIGZpbGUgZm9yIGEgcHJvZ3JhbSBjYWxsZWQgQHZhcntteXByb2d9IGlzIGNhbGxlZAorQHNhbXB7QHZhcntteXByb2d9LnN5bXN9LiAgT25jZSB0aGlzIGZpbGUgZXhpc3RzIChzbyBsb25nIGFzIGl0IGlzIG5ld2VyCit0aGFuIHRoZSBjb3JyZXNwb25kaW5nIGV4ZWN1dGFibGUpLCBAdmFsdWV7R0RCTn0gYWx3YXlzIGF0dGVtcHRzIHRvIHVzZQoraXQgd2hlbiB5b3UgZGVidWcgQHZhcntteXByb2d9OyBubyBzcGVjaWFsIG9wdGlvbnMgb3IgY29tbWFuZHMgYXJlCituZWVkZWQuCisKK1RoZSBAZmlsZXsuc3ltc30gZmlsZSBpcyBzcGVjaWZpYyB0byB0aGUgaG9zdCBtYWNoaW5lIHdoZXJlIHlvdSBydW4KK0B2YWx1ZXtHREJOfS4gIEl0IGhvbGRzIGFuIGV4YWN0IGltYWdlIG9mIHRoZSBpbnRlcm5hbCBAdmFsdWV7R0RCTn0KK3N5bWJvbCB0YWJsZS4gIEl0IGNhbm5vdCBiZSBzaGFyZWQgYWNyb3NzIG11bHRpcGxlIGhvc3QgcGxhdGZvcm1zLgorQGVuZCBpZmNsZWFyCisKK0BjIEZJWE1FOiBmb3Igbm93IG5vIG1lbnRpb24gb2YgZGlyZWN0b3JpZXMsIHNpbmNlIHRoaXMgc2VlbXMgdG8gYmUgaW4KK0BjIGZsdXguICAxM21hcjE5OTIgc3RhdHVzIGlzIHRoYXQgaW4gdGhlb3J5IEdEQiB3b3VsZCBsb29rIGVpdGhlciBpbgorQGMgY3VycmVudCBkaXIgb3IgaW4gc2FtZSBkaXIgYXMgbXlwcm9nOyBidXQgaXNzdWVzIGxpa2UgY29tcGV0aW5nCitAYyBHREIncywgb3IgY2x1dHRlciBpbiBzeXN0ZW0gZGlycywgbWVhbiB0aGF0IGluIHByYWN0aWNlIHJpZ2h0IG5vdworQGMgb25seSBjdXJyZW50IGRpciBpcyB1c2VkLiAgRkZpc2ggc2F5cyBtYXliZSBhIHNwZWNpYWwgR0RCIGhpZXJhcmNoeQorQGMgKGVnIHJvb3RlZCBpbiB2YWwgb2YgZW52IHZhciBHREJTWU1TKSBjb3VsZCBleGlzdCBmb3IgbWFwcGFibGUgc3ltYm9sCitAYyBmaWxlcy4KKworQGtpbmRleCBjb3JlCitAa2luZGV4IGNvcmUtZmlsZQorQGl0ZW0gY29yZS1maWxlIEBye1t9IEB2YXJ7ZmlsZW5hbWV9IEBye119CitTcGVjaWZ5IHRoZSB3aGVyZWFib3V0cyBvZiBhIGNvcmUgZHVtcCBmaWxlIHRvIGJlIHVzZWQgYXMgdGhlIGBgY29udGVudHMKK29mIG1lbW9yeScnLiAgVHJhZGl0aW9uYWxseSwgY29yZSBmaWxlcyBjb250YWluIG9ubHkgc29tZSBwYXJ0cyBvZiB0aGUKK2FkZHJlc3Mgc3BhY2Ugb2YgdGhlIHByb2Nlc3MgdGhhdCBnZW5lcmF0ZWQgdGhlbTsgQHZhbHVle0dEQk59IGNhbiBhY2Nlc3MgdGhlCitleGVjdXRhYmxlIGZpbGUgaXRzZWxmIGZvciBvdGhlciBwYXJ0cy4KKworQGNvZGV7Y29yZS1maWxlfSB3aXRoIG5vIGFyZ3VtZW50IHNwZWNpZmllcyB0aGF0IG5vIGNvcmUgZmlsZSBpcwordG8gYmUgdXNlZC4KKworTm90ZSB0aGF0IHRoZSBjb3JlIGZpbGUgaXMgaWdub3JlZCB3aGVuIHlvdXIgcHJvZ3JhbSBpcyBhY3R1YWxseSBydW5uaW5nCit1bmRlciBAdmFsdWV7R0RCTn0uICBTbywgaWYgeW91IGhhdmUgYmVlbiBydW5uaW5nIHlvdXIgcHJvZ3JhbSBhbmQgeW91IHdpc2ggdG8KK2RlYnVnIGEgY29yZSBmaWxlIGluc3RlYWQsIHlvdSBtdXN0IGtpbGwgdGhlIHN1YnByb2Nlc3MgaW4gd2hpY2ggdGhlCitwcm9ncmFtIGlzIHJ1bm5pbmcuICBUbyBkbyB0aGlzLCB1c2UgdGhlIEBjb2Rle2tpbGx9IGNvbW1hbmQKKyhAcHhyZWZ7S2lsbCBQcm9jZXNzLCAsS2lsbGluZyB0aGUgY2hpbGQgcHJvY2Vzc30pLgorQGVuZCBpZmNsZWFyCisKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK0BpZmNsZWFyIEhQUEEKK0BraW5kZXggYWRkLXN5bWJvbC1maWxlCitAY2luZGV4IGR5bmFtaWMgbGlua2luZworQGl0ZW0gYWRkLXN5bWJvbC1maWxlIEB2YXJ7ZmlsZW5hbWV9IEB2YXJ7YWRkcmVzc30KK0BpdGVteCBhZGQtc3ltYm9sLWZpbGUgQHZhcntmaWxlbmFtZX0gQHZhcnthZGRyZXNzfSBAcntbfSAtcmVhZG5vdyBAcntdfSBAcntbfSAtbWFwcGVkIEBye119CitUaGUgQGNvZGV7YWRkLXN5bWJvbC1maWxlfSBjb21tYW5kIHJlYWRzIGFkZGl0aW9uYWwgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uCitmcm9tIHRoZSBmaWxlIEB2YXJ7ZmlsZW5hbWV9LiAgWW91IHdvdWxkIHVzZSB0aGlzIGNvbW1hbmQgd2hlbiBAdmFye2ZpbGVuYW1lfQoraGFzIGJlZW4gZHluYW1pY2FsbHkgbG9hZGVkIChieSBzb21lIG90aGVyIG1lYW5zKSBpbnRvIHRoZSBwcm9ncmFtIHRoYXQKK2lzIHJ1bm5pbmcuICBAdmFye2FkZHJlc3N9IHNob3VsZCBiZSB0aGUgbWVtb3J5IGFkZHJlc3MgYXQgd2hpY2ggdGhlCitmaWxlIGhhcyBiZWVuIGxvYWRlZDsgQHZhbHVle0dEQk59IGNhbm5vdCBmaWd1cmUgdGhpcyBvdXQgZm9yIGl0c2VsZi4KK1lvdSBjYW4gc3BlY2lmeSBAdmFye2FkZHJlc3N9IGFzIGFuIGV4cHJlc3Npb24uCisKK1RoZSBzeW1ib2wgdGFibGUgb2YgdGhlIGZpbGUgQHZhcntmaWxlbmFtZX0gaXMgYWRkZWQgdG8gdGhlIHN5bWJvbCB0YWJsZQorb3JpZ2luYWxseSByZWFkIHdpdGggdGhlIEBjb2Rle3N5bWJvbC1maWxlfSBjb21tYW5kLiAgWW91IGNhbiB1c2UgdGhlCitAY29kZXthZGQtc3ltYm9sLWZpbGV9IGNvbW1hbmQgYW55IG51bWJlciBvZiB0aW1lczsgdGhlIG5ldyBzeW1ib2wgZGF0YSB0aHVzCityZWFkIGtlZXBzIGFkZGluZyB0byB0aGUgb2xkLiAgVG8gZGlzY2FyZCBhbGwgb2xkIHN5bWJvbCBkYXRhIGluc3RlYWQsCit1c2UgdGhlIEBjb2Rle3N5bWJvbC1maWxlfSBjb21tYW5kLgorCitAY29kZXthZGQtc3ltYm9sLWZpbGV9IGRvZXMgbm90IHJlcGVhdCBpZiB5b3UgcHJlc3MgQGtleXtSRVR9IGFmdGVyIHVzaW5nIGl0LgorCitZb3UgY2FuIHVzZSB0aGUgQHNhbXB7LW1hcHBlZH0gYW5kIEBzYW1wey1yZWFkbm93fSBvcHRpb25zIGp1c3QgYXMgd2l0aAordGhlIEBjb2Rle3N5bWJvbC1maWxlfSBjb21tYW5kLCB0byBjaGFuZ2UgaG93IEB2YWx1ZXtHREJOfSBtYW5hZ2VzIHRoZSBzeW1ib2wKK3RhYmxlIGluZm9ybWF0aW9uIGZvciBAdmFye2ZpbGVuYW1lfS4KKworQGtpbmRleCBhZGQtc2hhcmVkLXN5bWJvbC1maWxlCitAaXRlbSBhZGQtc2hhcmVkLXN5bWJvbC1maWxlCitUaGUgQGNvZGV7YWRkLXNoYXJlZC1zeW1ib2wtZmlsZX0gY29tbWFuZCBjYW4gYmUgdXNlZCBvbmx5IHVuZGVyIEhhcnJpcycgQ1hVWAorb3BlcmF0aW5nIHN5c3RlbSBmb3IgdGhlIE1vdG9yb2xhIDg4ay4gIEB2YWx1ZXtHREJOfSBhdXRvbWF0aWNhbGx5IGxvb2tzIGZvciAKK3NoYXJlZCBsaWJyYXJpZXMsIGhvd2V2ZXIgaWYgQHZhbHVle0dEQk59IGRvZXMgbm90IGZpbmQgeW91cnMsIHlvdSBjYW4gcnVuIAorQGNvZGV7YWRkLXNoYXJlZC1zeW1ib2wtZmlsZX0uICBJdCB0YWtlcyBubyBhcmd1bWVudHMuCitAZW5kIGlmY2xlYXIKK0BlbmQgaWZjbGVhcgorCitAaWZjbGVhciBIUFBBCitAa2luZGV4IHNlY3Rpb24KK0BpdGVtIHNlY3Rpb24KK1RoZSBAY29kZXtzZWN0aW9ufSBjb21tYW5kIGNoYW5nZXMgdGhlIGJhc2UgYWRkcmVzcyBvZiBzZWN0aW9uIFNFQ1RJT04gb2YgCit0aGUgZXhlYyBmaWxlIHRvIEFERFIuICBUaGlzIGNhbiBiZSB1c2VkIGlmIHRoZSBleGVjIGZpbGUgZG9lcyBub3QgY29udGFpbiAKK3NlY3Rpb24gYWRkcmVzc2VzLCAoc3VjaCBhcyBpbiB0aGUgYS5vdXQgZm9ybWF0KSwgb3Igd2hlbiB0aGUgYWRkcmVzc2VzIAorc3BlY2lmaWVkIGluIHRoZSBmaWxlIGl0c2VsZiBhcmUgd3JvbmcuICBFYWNoIHNlY3Rpb24gbXVzdCBiZSBjaGFuZ2VkIAorc2VwYXJhdGVseS4gIFRoZSBgYGluZm8gZmlsZXMnJyBjb21tYW5kIGxpc3RzIGFsbCB0aGUgc2VjdGlvbnMgYW5kIHRoZWlyIAorYWRkcmVzc2VzLgorQGVuZCBpZmNsZWFyCisKK0BraW5kZXggaW5mbyBmaWxlcworQGtpbmRleCBpbmZvIHRhcmdldAorQGl0ZW0gaW5mbyBmaWxlcworQGl0ZW14IGluZm8gdGFyZ2V0CitAY29kZXtpbmZvIGZpbGVzfSBhbmQgQGNvZGV7aW5mbyB0YXJnZXR9IGFyZSBzeW5vbnltb3VzOyBib3RoIHByaW50Cit0aGUgY3VycmVudCB0YXJnZXQgKEBweHJlZntUYXJnZXRzLCAsU3BlY2lmeWluZyBhIERlYnVnZ2luZyBUYXJnZXR9KSwKK2luY2x1ZGluZyB0aGUKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK25hbWVzIG9mIHRoZSBleGVjdXRhYmxlIGFuZCBjb3JlIGR1bXAgZmlsZXMKK0BlbmQgaWZjbGVhcgorQGlmc2V0IEJBUkVUQVJHRVQKK25hbWUgb2YgdGhlIGV4ZWN1dGFibGUgZmlsZQorQGVuZCBpZnNldAorY3VycmVudGx5IGluIHVzZSBieSBAdmFsdWV7R0RCTn0sIGFuZCB0aGUgZmlsZXMgZnJvbSB3aGljaCBzeW1ib2xzIHdlcmUKK2xvYWRlZC4gIFRoZSBjb21tYW5kIEBjb2Rle2hlbHAgdGFyZ2V0fSBsaXN0cyBhbGwgcG9zc2libGUgdGFyZ2V0cworcmF0aGVyIHRoYW4gY3VycmVudCBvbmVzLgorQGVuZCB0YWJsZQorCitBbGwgZmlsZS1zcGVjaWZ5aW5nIGNvbW1hbmRzIGFsbG93IGJvdGggYWJzb2x1dGUgYW5kIHJlbGF0aXZlIGZpbGUgbmFtZXMKK2FzIGFyZ3VtZW50cy4gIEB2YWx1ZXtHREJOfSBhbHdheXMgY29udmVydHMgdGhlIGZpbGUgbmFtZSB0byBhbiBhYnNvbHV0ZSBmaWxlCituYW1lIGFuZCByZW1lbWJlcnMgaXQgdGhhdCB3YXkuCisKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK0BjaW5kZXggc2hhcmVkIGxpYnJhcmllcworQGlmY2xlYXIgSFBQQQorQGMgYWRkZWQgSFAtVVggLS0gS2ltIChIUCB3cml0ZXIpCitAdmFsdWV7R0RCTn0gc3VwcG9ydHMgSFAtVVgsIFN1bk9TLCBTVnI0LCBJcml4IDUsIGFuZCBJQk0gUlMvNjAwMCBzaGFyZWQKK2xpYnJhcmllcy4KK0BlbmQgaWZjbGVhcgorQGlmc2V0IEhQUEEKK0B2YWx1ZXtHREJOfSBzdXBwb3J0cyBIUC1VWCBzaGFyZWQgbGlicmFyaWVzLgorQGVuZCBpZnNldAorQHZhbHVle0dEQk59IGF1dG9tYXRpY2FsbHkgbG9hZHMgc3ltYm9sIGRlZmluaXRpb25zIGZyb20gc2hhcmVkIGxpYnJhcmllcword2hlbiB5b3UgdXNlIHRoZSBAY29kZXtydW59IGNvbW1hbmQsIG9yIHdoZW4geW91IGV4YW1pbmUgYSBjb3JlIGZpbGUuCisoQmVmb3JlIHlvdSBpc3N1ZSB0aGUgQGNvZGV7cnVufSBjb21tYW5kLCBAdmFsdWV7R0RCTn0gZG9lcyBub3QgdW5kZXJzdGFuZAorcmVmZXJlbmNlcyB0byBhIGZ1bmN0aW9uIGluIGEgc2hhcmVkIGxpYnJhcnksIGhvd2V2ZXItLS11bmxlc3MgeW91IGFyZQorZGVidWdnaW5nIGEgY29yZSBmaWxlKS4KK0BpZnNldCBIUFBBCitJZiB0aGUgcHJvZ3JhbSBsb2FkcyBhIGxpYnJhcnkgZXhwbGljaXRseSwgQHZhbHVle0dEQk59IGF1dG9tYXRpY2FsbHkKK2xvYWRzIHRoZSBzeW1ib2xzIGF0IHRoZSB0aW1lIG9mIHRoZSBAY29kZXtzaGxfbG9hZH0gY2FsbC4KK0BlbmQgaWZzZXQKK0BjIEZJWE1FOiBzb21lIEB2YWx1ZXtHREJOfSByZWxlYXNlIG1heSBwZXJtaXQgc29tZSByZWZzIHRvIHVuZGVmCitAYyBGSVhNRS4uLnN5bWJvbHMtLS1lZyBpbiBhIGJyZWFrIGNtZC0tLWFzc3VtaW5nIHRoZXkgYXJlIGZyb20gYSBzaGFyZWQKK0BjIEZJWE1FLi4ubGliOyBjaGVjayB0aGlzIGZyb20gdGltZSB0byB0aW1lIHdoZW4gdXBkYXRpbmcgbWFudWFsCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBpbmZvIHNoYXJlZGxpYnJhcnkKK0BraW5kZXggaW5mbyBzaGFyZQorQGl0ZW0gaW5mbyBzaGFyZQorQGl0ZW14IGluZm8gc2hhcmVkbGlicmFyeQorUHJpbnQgdGhlIG5hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIHdoaWNoIGFyZSBjdXJyZW50bHkgbG9hZGVkLgorCitAa2luZGV4IHNoYXJlZGxpYnJhcnkKK0BraW5kZXggc2hhcmUKK0BpdGVtIHNoYXJlZGxpYnJhcnkgQHZhcntyZWdleH0KK0BpdGVteCBzaGFyZSBAdmFye3JlZ2V4fQorCitMb2FkIHNoYXJlZCBvYmplY3QgbGlicmFyeSBzeW1ib2xzIGZvciBmaWxlcyBtYXRjaGluZyBhCitVbml4IHJlZ3VsYXIgZXhwcmVzc2lvbi4KK0FzIHdpdGggZmlsZXMgbG9hZGVkIGF1dG9tYXRpY2FsbHksIGl0IG9ubHkgbG9hZHMgc2hhcmVkIGxpYnJhcmllcworcmVxdWlyZWQgYnkgeW91ciBwcm9ncmFtIGZvciBhIGNvcmUgZmlsZSBvciBhZnRlciB0eXBpbmcgQGNvZGV7cnVufS4gIElmCitAdmFye3JlZ2V4fSBpcyBvbWl0dGVkIGFsbCBzaGFyZWQgbGlicmFyaWVzIHJlcXVpcmVkIGJ5IHlvdXIgcHJvZ3JhbSBhcmUKK2xvYWRlZC4KK0BlbmQgdGFibGUKKworQGlmc2V0IEhQUEEKK0B2YWx1ZXtHREJOfSBkZXRlY3RzIHRoZSBsb2FkaW5nIG9mIGEgc2hhcmVkIGxpYnJhcnkgYW5kIGF1dG9tYXRpY2FsbHkKK3JlYWRzIGluIHN5bWJvbHMgZnJvbSB0aGUgbmV3bHkgbG9hZGVkIGxpYnJhcnksIHVwIHRvIGEgdGhyZXNob2xkIHRoYXQKK2lzIGluaXRpYWxseSBzZXQgYnV0IHRoYXQgeW91IGNhbiBtb2RpZnkgaWYgeW91IHdpc2guCisKK0JleW9uZCB0aGF0IHRocmVzaG9sZCwgc3ltYm9scyBmcm9tIHNoYXJlZCBsaWJyYXJpZXMgbXVzdCBiZSBleHBsaWNpdGx5Citsb2FkZWQuICBUbyBsb2FkIHRoZXNlIHN5bWJvbHMsIHVzZSB0aGUgY29tbWFuZCBAY29kZXtzaGFyZWRsaWJyYXJ5fQorQHZhcntmaWxlbmFtZX0uICBUaGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBzaGFyZWQgbGlicmFyeSBpcyBkZXRlcm1pbmVkCithdXRvbWF0aWNhbGx5IGJ5IEB2YWx1ZXtHREJOfSBhbmQgbmVlZCBub3QgYmUgc3BlY2lmaWVkLgorCitUbyBkaXNwbGF5IG9yIHNldCB0aGUgdGhyZXNob2xkLCB1c2UgdGhlIGNvbW1hbmRzOgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggc2V0IGF1dG8tc29saWItYWRkCitAaXRlbSBzZXQgYXV0by1zb2xpYi1hZGQgQHZhcnt0aHJlc2hvbGR9CitTZXQgdGhlIGF1dG9sb2FkaW5nIHNpemUgdGhyZXNob2xkLCBpbiBtZWdhYnl0ZXMuICBJZiBAdmFye3RocmVzaG9sZH0gaXMKK25vbnplcm8sIHN5bWJvbHMgZnJvbSBhbGwgc2hhcmVkIG9iamVjdCBsaWJyYXJpZXMgd2lsbCBiZSBsb2FkZWQKK2F1dG9tYXRpY2FsbHkgd2hlbiB0aGUgaW5mZXJpb3IgYmVnaW5zIGV4ZWN1dGlvbiBvciB3aGVuIHRoZSBkeW5hbWljCitsaW5rZXIgaW5mb3JtcyBAdmFsdWV7R0RCTn0gdGhhdCBhIG5ldyBsaWJyYXJ5IGhhcyBiZWVuIGxvYWRlZCwgdW50aWwKK3RoZSBzeW1ib2wgdGFibGUgb2YgdGhlIHByb2dyYW0gYW5kIGxpYnJhcmllcyBleGNlZWRzIHRoaXMgdGhyZXNob2xkLgorT3RoZXJ3aXNlLCBzeW1ib2xzIG11c3QgYmUgbG9hZGVkIG1hbnVhbGx5LCB1c2luZyB0aGUKK0Bjb2Rle3NoYXJlZGxpYnJhcnl9IGNvbW1hbmQuICBUaGUgZGVmYXVsdCB0aHJlc2hvbGQgaXMgMTAwIG1lZ2FieXRlcy4KKworQGtpbmRleCBzaG93IGF1dG8tc29saWItYWRkCitAaXRlbSBzaG93IGF1dG8tc29saWItYWRkCitEaXNwbGF5IHRoZSBjdXJyZW50IGF1dG9sb2FkaW5nIHNpemUgdGhyZXNob2xkLCBpbiBtZWdhYnl0ZXMuCitAZW5kIHRhYmxlCitAZW5kIGlmc2V0CisKK0BlbmQgaWZjbGVhcgorCitAbm9kZSBTeW1ib2wgRXJyb3JzLCAgLCBGaWxlcywgR0RCIEZpbGVzCitAc2VjdGlvbiBFcnJvcnMgcmVhZGluZyBzeW1ib2wgZmlsZXMKKworV2hpbGUgcmVhZGluZyBhIHN5bWJvbCBmaWxlLCBAdmFsdWV7R0RCTn0gb2NjYXNpb25hbGx5IGVuY291bnRlcnMgcHJvYmxlbXMsCitzdWNoIGFzIHN5bWJvbCB0eXBlcyBpdCBkb2VzIG5vdCByZWNvZ25pemUsIG9yIGtub3duIGJ1Z3MgaW4gY29tcGlsZXIKK291dHB1dC4gIEJ5IGRlZmF1bHQsIEB2YWx1ZXtHREJOfSBkb2VzIG5vdCBub3RpZnkgeW91IG9mIHN1Y2ggcHJvYmxlbXMsIHNpbmNlCit0aGV5IGFyZSByZWxhdGl2ZWx5IGNvbW1vbiBhbmQgcHJpbWFyaWx5IG9mIGludGVyZXN0IHRvIHBlb3BsZQorZGVidWdnaW5nIGNvbXBpbGVycy4gIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBzZWVpbmcgaW5mb3JtYXRpb24KK2Fib3V0IGlsbC1jb25zdHJ1Y3RlZCBzeW1ib2wgdGFibGVzLCB5b3UgY2FuIGVpdGhlciBhc2sgQHZhbHVle0dEQk59IHRvIHByaW50Citvbmx5IG9uZSBtZXNzYWdlIGFib3V0IGVhY2ggc3VjaCB0eXBlIG9mIHByb2JsZW0sIG5vIG1hdHRlciBob3cgbWFueQordGltZXMgdGhlIHByb2JsZW0gb2NjdXJzOyBvciB5b3UgY2FuIGFzayBAdmFsdWV7R0RCTn0gdG8gcHJpbnQgbW9yZSBtZXNzYWdlcywKK3RvIHNlZSBob3cgbWFueSB0aW1lcyB0aGUgcHJvYmxlbXMgb2NjdXIsIHdpdGggdGhlIEBjb2Rle3NldAorY29tcGxhaW50c30gY29tbWFuZCAoQHB4cmVme01lc3NhZ2VzL1dhcm5pbmdzLCAsT3B0aW9uYWwgd2FybmluZ3MgYW5kCittZXNzYWdlc30pLgorCitUaGUgbWVzc2FnZXMgY3VycmVudGx5IHByaW50ZWQsIGFuZCB0aGVpciBtZWFuaW5ncywgaW5jbHVkZToKKworQHRhYmxlIEBjb2RlCitAaXRlbSBpbm5lciBibG9jayBub3QgaW5zaWRlIG91dGVyIGJsb2NrIGluIEB2YXJ7c3ltYm9sfQorCitUaGUgc3ltYm9sIGluZm9ybWF0aW9uIHNob3dzIHdoZXJlIHN5bWJvbCBzY29wZXMgYmVnaW4gYW5kIGVuZAorKHN1Y2ggYXMgYXQgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24gb3IgYSBibG9jayBvZiBzdGF0ZW1lbnRzKS4gIFRoaXMKK2Vycm9yIGluZGljYXRlcyB0aGF0IGFuIGlubmVyIHNjb3BlIGJsb2NrIGlzIG5vdCBmdWxseSBjb250YWluZWQKK2luIGl0cyBvdXRlciBzY29wZSBibG9ja3MuCisKK0B2YWx1ZXtHREJOfSBjaXJjdW12ZW50cyB0aGUgcHJvYmxlbSBieSB0cmVhdGluZyB0aGUgaW5uZXIgYmxvY2sgYXMgaWYgaXQgaGFkCit0aGUgc2FtZSBzY29wZSBhcyB0aGUgb3V0ZXIgYmxvY2suICBJbiB0aGUgZXJyb3IgbWVzc2FnZSwgQHZhcntzeW1ib2x9CittYXkgYmUgc2hvd24gYXMgYGBAY29kZXsoZG9uJ3Qga25vdyl9JycgaWYgdGhlIG91dGVyIGJsb2NrIGlzIG5vdCBhCitmdW5jdGlvbi4KKworQGl0ZW0gYmxvY2sgYXQgQHZhcnthZGRyZXNzfSBvdXQgb2Ygb3JkZXIKKworVGhlIHN5bWJvbCBpbmZvcm1hdGlvbiBmb3Igc3ltYm9sIHNjb3BlIGJsb2NrcyBzaG91bGQgb2NjdXIgaW4KK29yZGVyIG9mIGluY3JlYXNpbmcgYWRkcmVzc2VzLiAgVGhpcyBlcnJvciBpbmRpY2F0ZXMgdGhhdCBpdCBkb2VzIG5vdAorZG8gc28uCisKK0B2YWx1ZXtHREJOfSBkb2VzIG5vdCBjaXJjdW12ZW50IHRoaXMgcHJvYmxlbSwgYW5kIGhhcyB0cm91YmxlCitsb2NhdGluZyBzeW1ib2xzIGluIHRoZSBzb3VyY2UgZmlsZSB3aG9zZSBzeW1ib2xzIGl0IGlzIHJlYWRpbmcuICAoWW91CitjYW4gb2Z0ZW4gZGV0ZXJtaW5lIHdoYXQgc291cmNlIGZpbGUgaXMgYWZmZWN0ZWQgYnkgc3BlY2lmeWluZworQGNvZGV7c2V0IHZlcmJvc2Ugb259LiAgQHhyZWZ7TWVzc2FnZXMvV2FybmluZ3MsICxPcHRpb25hbCB3YXJuaW5ncyBhbmQKK21lc3NhZ2VzfS4pCisKK0BpdGVtIGJhZCBibG9jayBzdGFydCBhZGRyZXNzIHBhdGNoZWQKKworVGhlIHN5bWJvbCBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wgc2NvcGUgYmxvY2sgaGFzIGEgc3RhcnQgYWRkcmVzcworc21hbGxlciB0aGFuIHRoZSBhZGRyZXNzIG9mIHRoZSBwcmVjZWRpbmcgc291cmNlIGxpbmUuICBUaGlzIGlzIGtub3duCit0byBvY2N1ciBpbiB0aGUgU3VuT1MgNC4xLjEgKGFuZCBlYXJsaWVyKSBDIGNvbXBpbGVyLgorCitAdmFsdWV7R0RCTn0gY2lyY3VtdmVudHMgdGhlIHByb2JsZW0gYnkgdHJlYXRpbmcgdGhlIHN5bWJvbCBzY29wZSBibG9jayBhcworc3RhcnRpbmcgb24gdGhlIHByZXZpb3VzIHNvdXJjZSBsaW5lLgorCitAaXRlbSBiYWQgc3RyaW5nIHRhYmxlIG9mZnNldCBpbiBzeW1ib2wgQHZhcntufQorCitAY2luZGV4IGZvbworU3ltYm9sIG51bWJlciBAdmFye259IGNvbnRhaW5zIGEgcG9pbnRlciBpbnRvIHRoZSBzdHJpbmcgdGFibGUgd2hpY2ggaXMKK2xhcmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgdGFibGUuCisKK0B2YWx1ZXtHREJOfSBjaXJjdW12ZW50cyB0aGUgcHJvYmxlbSBieSBjb25zaWRlcmluZyB0aGUgc3ltYm9sIHRvIGhhdmUgdGhlCituYW1lIEBjb2Rle2Zvb30sIHdoaWNoIG1heSBjYXVzZSBvdGhlciBwcm9ibGVtcyBpZiBtYW55IHN5bWJvbHMgZW5kIHVwCit3aXRoIHRoaXMgbmFtZS4KKworQGl0ZW0gdW5rbm93biBzeW1ib2wgdHlwZSBAY29kZXsweEB2YXJ7bm59fQorCitUaGUgc3ltYm9sIGluZm9ybWF0aW9uIGNvbnRhaW5zIG5ldyBkYXRhIHR5cGVzIHRoYXQgQHZhbHVle0dEQk59IGRvZXMgbm90IHlldAora25vdyBob3cgdG8gcmVhZC4gIEBjb2RlezB4QHZhcntubn19IGlzIHRoZSBzeW1ib2wgdHlwZSBvZiB0aGUgbWlzdW5kZXJzdG9vZAoraW5mb3JtYXRpb24sIGluIGhleGFkZWNpbWFsLgorCitAdmFsdWV7R0RCTn0gY2lyY3VtdmVudHMgdGhlIGVycm9yIGJ5IGlnbm9yaW5nIHRoaXMgc3ltYm9sIGluZm9ybWF0aW9uLiAgVGhpcwordXN1YWxseSBhbGxvd3MgeW91IHRvIGRlYnVnIHlvdXIgcHJvZ3JhbSwgdGhvdWdoIGNlcnRhaW4gc3ltYm9scworYXJlIG5vdCBhY2Nlc3NpYmxlLiAgSWYgeW91IGVuY291bnRlciBzdWNoIGEgcHJvYmxlbSBhbmQgZmVlbCBsaWtlCitkZWJ1Z2dpbmcgaXQsIHlvdSBjYW4gZGVidWcgQGNvZGV7QHZhbHVle0dEQlB9fSB3aXRoIGl0c2VsZiwgYnJlYWtwb2ludCBvbgorQGNvZGV7Y29tcGxhaW59LCB0aGVuIGdvIHVwIHRvIHRoZSBmdW5jdGlvbiBAY29kZXtyZWFkX2RieF9zeW10YWJ9IGFuZAorZXhhbWluZSBAY29kZXsqYnVmcH0gdG8gc2VlIHRoZSBzeW1ib2wuCisKK0BpdGVtIHN0dWIgdHlwZSBoYXMgTlVMTCBuYW1lCitAdmFsdWV7R0RCTn0gY291bGQgbm90IGZpbmQgdGhlIGZ1bGwgZGVmaW5pdGlvbiBmb3IKK0BpZmNsZWFyIENPTkxZCithIHN0cnVjdCBvciBjbGFzcy4KK0BlbmQgaWZjbGVhcgorQGlmc2V0IENPTkxZCithIHN0cnVjdC4KK0BlbmQgaWZzZXQKKworQGlmY2xlYXIgQ09OTFkKK0BpdGVtIGNvbnN0L3ZvbGF0aWxlIGluZGljYXRvciBtaXNzaW5nIChvayBpZiB1c2luZyBnKysgdjEueCksIGdvdEBkb3Rze30KKworVGhlIHN5bWJvbCBpbmZvcm1hdGlvbiBmb3IgYSBDKysgbWVtYmVyIGZ1bmN0aW9uIGlzIG1pc3Npbmcgc29tZQoraW5mb3JtYXRpb24gdGhhdCByZWNlbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBpbGVyIHNob3VsZCBoYXZlIG91dHB1dAorZm9yIGl0LgorQGVuZCBpZmNsZWFyCisKK0BpdGVtIGluZm8gbWlzbWF0Y2ggYmV0d2VlbiBjb21waWxlciBhbmQgZGVidWdnZXIKKworQHZhbHVle0dEQk59IGNvdWxkIG5vdCBwYXJzZSBhIHR5cGUgc3BlY2lmaWNhdGlvbiBvdXRwdXQgYnkgdGhlIGNvbXBpbGVyLgorQGVuZCB0YWJsZQorCitAbm9kZSBUYXJnZXRzLCBDb250cm9sbGluZyBHREIsIEdEQiBGaWxlcywgVG9wCitAY2hhcHRlciBTcGVjaWZ5aW5nIGEgRGVidWdnaW5nIFRhcmdldAorQGNpbmRleCBkZWJ1Z2dpbmcgdGFyZ2V0CitAa2luZGV4IHRhcmdldAorCitBIEBkZm57dGFyZ2V0fSBpcyB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IG9jY3VwaWVkIGJ5IHlvdXIgcHJvZ3JhbS4KK0BpZmNsZWFyIEhQUEEKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK09mdGVuLCBAdmFsdWV7R0RCTn0gcnVucyBpbiB0aGUgc2FtZSBob3N0IGVudmlyb25tZW50IGFzIHlvdXIgcHJvZ3JhbTsgaW4KK3RoYXQgY2FzZSwgdGhlIGRlYnVnZ2luZyB0YXJnZXQgaXMgc3BlY2lmaWVkIGFzIGEgc2lkZSBlZmZlY3Qgd2hlbiB5b3UKK3VzZSB0aGUgQGNvZGV7ZmlsZX0gb3IgQGNvZGV7Y29yZX0gY29tbWFuZHMuICBXaGVuIHlvdSBuZWVkIG1vcmUKK2ZsZXhpYmlsaXR5LS0tZm9yIGV4YW1wbGUsIHJ1bm5pbmcgQHZhbHVle0dEQk59IG9uIGEgcGh5c2ljYWxseSBzZXBhcmF0ZQoraG9zdCwgb3IgY29udHJvbGxpbmcgYSBzdGFuZGFsb25lIHN5c3RlbSBvdmVyIGEgc2VyaWFsIHBvcnQgb3IgYQorcmVhbHRpbWUgc3lzdGVtIG92ZXIgYSBUQ1AvSVAgY29ubmVjdGlvbi0tLXlvdSAKK0BlbmQgaWZjbGVhcgorQGVuZCBpZmNsZWFyCitAaWZzZXQgSFBQQQorT24gSFAtVVggc3lzdGVtcywgQHZhbHVle0dEQk59IGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBkZWJ1Z2dpbmcKK29mIHByb2Nlc3NlcyBydW5uaW5nIG9uIHRoZSBQQS1SSVNDIGFyY2hpdGVjdHVyZS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUKK29ubHkgcG9zc2libGUgdGFyZ2V0cyBhcmU6CisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitBbiBleGVjdXRhYmxlIHRoYXQgaGFzIGJlZW4gY29tcGlsZWQgYW5kIGxpbmtlZCB0byBydW4gb24gSFAtVVgKKworQGl0ZW0KK0EgbGl2ZSBIUC1VWCBwcm9jZXNzLCBlaXRoZXIgc3RhcnRlZCBieSBAdmFsdWV7R0RCTn0gKHdpdGggdGhlCitAY29kZXtydW59IGNvbW1hbmQpIG9yIHN0YXJ0ZWQgb3V0c2lkZSBvZiBAdmFsdWV7R0RCTn0gYW5kIGF0dGFjaGVkIHRvCisod2l0aCB0aGUgQGNvZGV7YXR0YWNofSBjb21tYW5kKQorCitAaXRlbQorQSBjb3JlIGZpbGUgZ2VuZXJhdGVkIGJ5IGFuIEhQLVVYIHByb2Nlc3MgdGhhdCBwcmV2aW91c2x5IGFib3J0ZWQKK2V4ZWN1dGlvbgorQGVuZCBpdGVtaXplCisKK0B2YWx1ZXtHREJOfSBvbiBIUC1VWCBoYXMgbm90IGJlZW4gY29uZmlndXJlZCB0byBzdXBwb3J0IHJlbW90ZQorZGVidWdnaW5nLCBvciB0byBzdXBwb3J0IHByb2dyYW1zIHJ1bm5pbmcgb24gb3RoZXIgcGxhdGZvcm1zLiBZb3UKK0BlbmQgaWZzZXQKK0BpZnNldCBCQVJFVEFSR0VUCitZb3UKK0BlbmQgaWZzZXQKK2NhbiB1c2UgdGhlIEBjb2Rle3RhcmdldH0gY29tbWFuZCB0byBzcGVjaWZ5IG9uZSBvZiB0aGUgdGFyZ2V0IHR5cGVzCitjb25maWd1cmVkIGZvciBAdmFsdWV7R0RCTn0gKEBweHJlZntUYXJnZXQgQ29tbWFuZHMsICxDb21tYW5kcyBmb3IgbWFuYWdpbmcKK3RhcmdldHN9KS4KKworQG1lbnUKKyogQWN0aXZlIFRhcmdldHM6OiAgICAgICAgICAgICAgQWN0aXZlIHRhcmdldHMKKyogVGFyZ2V0IENvbW1hbmRzOjogICAgICAgICAgICAgQ29tbWFuZHMgZm9yIG1hbmFnaW5nIHRhcmdldHMKK0BpZnNldCBSRU1PVEVTVFVCCisqIEJ5dGUgT3JkZXI6OiAgICAgICAgICAgICAgICAgIENob29zaW5nIHRhcmdldCBieXRlIG9yZGVyCisqIFJlbW90ZTo6ICAgICAgICAgICAgICAgICAgICAgIFJlbW90ZSBkZWJ1Z2dpbmcKK0BlbmQgaWZzZXQKKworQGVuZCBtZW51CisKK0Bub2RlIEFjdGl2ZSBUYXJnZXRzLCBUYXJnZXQgQ29tbWFuZHMsIFRhcmdldHMsIFRhcmdldHMKK0BzZWN0aW9uIEFjdGl2ZSB0YXJnZXRzCitAY2luZGV4IHN0YWNraW5nIHRhcmdldHMKK0BjaW5kZXggYWN0aXZlIHRhcmdldHMKK0BjaW5kZXggbXVsdGlwbGUgdGFyZ2V0cworCitAaWZjbGVhciBCQVJFVEFSR0VUCitUaGVyZSBhcmUgdGhyZWUgY2xhc3NlcyBvZiB0YXJnZXRzOiBwcm9jZXNzZXMsIGNvcmUgZmlsZXMsIGFuZAorZXhlY3V0YWJsZSBmaWxlcy4gIEB2YWx1ZXtHREJOfSBjYW4gd29yayBjb25jdXJyZW50bHkgb24gdXAgdG8gdGhyZWUgYWN0aXZlCit0YXJnZXRzLCBvbmUgaW4gZWFjaCBjbGFzcy4gIFRoaXMgYWxsb3dzIHlvdSB0byAoZm9yIGV4YW1wbGUpIHN0YXJ0IGEKK3Byb2Nlc3MgYW5kIGluc3BlY3QgaXRzIGFjdGl2aXR5IHdpdGhvdXQgYWJhbmRvbmluZyB5b3VyIHdvcmsgb24gYSBjb3JlCitmaWxlLgorCitGb3IgZXhhbXBsZSwgaWYgeW91IGV4ZWN1dGUgQHNhbXB7Z2RiIGEub3V0fSwgdGhlbiB0aGUgZXhlY3V0YWJsZSBmaWxlCitAY29kZXthLm91dH0gaXMgdGhlIG9ubHkgYWN0aXZlIHRhcmdldC4gIElmIHlvdSBkZXNpZ25hdGUgYSBjb3JlIGZpbGUgYXMKK3dlbGwtLS1wcmVzdW1hYmx5IGZyb20gYSBwcmlvciBydW4gdGhhdCBjcmFzaGVkIGFuZCBjb3JlZHVtcGVkLS0tdGhlbgorQHZhbHVle0dEQk59IGhhcyB0d28gYWN0aXZlIHRhcmdldHMgYW5kIHVzZXMgdGhlbSBpbiB0YW5kZW0sIGxvb2tpbmcKK2ZpcnN0IGluIHRoZSBjb3JlZmlsZSB0YXJnZXQsIHRoZW4gaW4gdGhlIGV4ZWN1dGFibGUgZmlsZSwgdG8gc2F0aXNmeQorcmVxdWVzdHMgZm9yIG1lbW9yeSBhZGRyZXNzZXMuICAoVHlwaWNhbGx5LCB0aGVzZSB0d28gY2xhc3NlcyBvZiB0YXJnZXQKK2FyZSBjb21wbGVtZW50YXJ5LCBzaW5jZSBjb3JlIGZpbGVzIGNvbnRhaW4gb25seSBhIHByb2dyYW0ncworcmVhZC13cml0ZSBtZW1vcnktLS12YXJpYWJsZXMgYW5kIHNvIG9uLS0tcGx1cyBtYWNoaW5lIHN0YXR1cywgd2hpbGUKK2V4ZWN1dGFibGUgZmlsZXMgY29udGFpbiBvbmx5IHRoZSBwcm9ncmFtIHRleHQgYW5kIGluaXRpYWxpemVkIGRhdGEuKQorQGVuZCBpZmNsZWFyCisKK1doZW4geW91IHR5cGUgQGNvZGV7cnVufSwgeW91ciBleGVjdXRhYmxlIGZpbGUgYmVjb21lcyBhbiBhY3RpdmUgcHJvY2VzcwordGFyZ2V0IGFzIHdlbGwuICBXaGVuIGEgcHJvY2VzcyB0YXJnZXQgaXMgYWN0aXZlLCBhbGwgQHZhbHVle0dEQk59IGNvbW1hbmRzCityZXF1ZXN0aW5nIG1lbW9yeSBhZGRyZXNzZXMgcmVmZXIgdG8gdGhhdCB0YXJnZXQ7IGFkZHJlc3NlcyBpbiBhbiAKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK2FjdGl2ZSBjb3JlIGZpbGUgb3IgCitAZW5kIGlmY2xlYXIKK2V4ZWN1dGFibGUgZmlsZSB0YXJnZXQgYXJlIG9ic2N1cmVkIHdoaWxlIHRoZSBwcm9jZXNzCit0YXJnZXQgaXMgYWN0aXZlLgorCitAaWZzZXQgQkFSRVRBUkdFVAorVXNlIHRoZSBAY29kZXtleGVjLWZpbGV9IGNvbW1hbmQgdG8gc2VsZWN0IGEKK25ldyBleGVjdXRhYmxlIHRhcmdldCAoQHB4cmVme0ZpbGVzLCAsQ29tbWFuZHMgdG8gc3BlY2lmeQorZmlsZXN9KS4KK0BlbmQgaWZzZXQKK0BpZmNsZWFyIEJBUkVUQVJHRVQKK1VzZSB0aGUgQGNvZGV7Y29yZS1maWxlfSBhbmQgQGNvZGV7ZXhlYy1maWxlfSBjb21tYW5kcyB0byBzZWxlY3QgYQorbmV3IGNvcmUgZmlsZSBvciBleGVjdXRhYmxlIHRhcmdldCAoQHB4cmVme0ZpbGVzLCAsQ29tbWFuZHMgdG8gc3BlY2lmeQorZmlsZXN9KS4gIFRvIHNwZWNpZnkgYXMgYSB0YXJnZXQgYSBwcm9jZXNzIHRoYXQgaXMgYWxyZWFkeSBydW5uaW5nLCB1c2UKK3RoZSBAY29kZXthdHRhY2h9IGNvbW1hbmQgKEBweHJlZntBdHRhY2gsICxEZWJ1Z2dpbmcgYW4KK2FscmVhZHktcnVubmluZyBwcm9jZXNzfSkuCitAZW5kIGlmY2xlYXIKKworQG5vZGUgVGFyZ2V0IENvbW1hbmRzLCBCeXRlIE9yZGVyLCBBY3RpdmUgVGFyZ2V0cywgVGFyZ2V0cworQHNlY3Rpb24gQ29tbWFuZHMgZm9yIG1hbmFnaW5nIHRhcmdldHMKKworQHRhYmxlIEBjb2RlCitAaXRlbSB0YXJnZXQgQHZhcnt0eXBlfSBAdmFye3BhcmFtZXRlcnN9CitDb25uZWN0cyB0aGUgQHZhbHVle0dEQk59IGhvc3QgZW52aXJvbm1lbnQgdG8gYSB0YXJnZXQKK0BpZnNldCBCQVJFVEFSR0VUCittYWNoaW5lLgorQGVuZCBpZnNldAorQGlmY2xlYXIgQkFSRVRBUkdFVAorbWFjaGluZSBvciBwcm9jZXNzLiAgQSB0YXJnZXQgaXMgdHlwaWNhbGx5IGEgcHJvdG9jb2wgZm9yIHRhbGtpbmcgdG8KK2RlYnVnZ2luZyBmYWNpbGl0aWVzLiAgWW91IHVzZSB0aGUgYXJndW1lbnQgQHZhcnt0eXBlfSB0byBzcGVjaWZ5IHRoZQordHlwZSBvciBwcm90b2NvbCBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuCisKK0Z1cnRoZXIgQHZhcntwYXJhbWV0ZXJzfSBhcmUgaW50ZXJwcmV0ZWQgYnkgdGhlIHRhcmdldCBwcm90b2NvbCwgYnV0Cit0eXBpY2FsbHkgaW5jbHVkZSB0aGluZ3MgbGlrZSBkZXZpY2UgbmFtZXMgb3IgaG9zdCBuYW1lcyB0byBjb25uZWN0Cit3aXRoLCBwcm9jZXNzIG51bWJlcnMsIGFuZCBiYXVkIHJhdGVzLgorQGVuZCBpZmNsZWFyCisKK1RoZSBAY29kZXt0YXJnZXR9IGNvbW1hbmQgZG9lcyBub3QgcmVwZWF0IGlmIHlvdSBwcmVzcyBAa2V5e1JFVH0gYWdhaW4KK2FmdGVyIGV4ZWN1dGluZyB0aGUgY29tbWFuZC4KKworQGtpbmRleCBoZWxwIHRhcmdldAorQGl0ZW0gaGVscCB0YXJnZXQKK0Rpc3BsYXlzIHRoZSBuYW1lcyBvZiBhbGwgdGFyZ2V0cyBhdmFpbGFibGUuICBUbyBkaXNwbGF5IHRhcmdldHMKK2N1cnJlbnRseSBzZWxlY3RlZCwgdXNlIGVpdGhlciBAY29kZXtpbmZvIHRhcmdldH0gb3IgQGNvZGV7aW5mbyBmaWxlc30KKyhAcHhyZWZ7RmlsZXMsICxDb21tYW5kcyB0byBzcGVjaWZ5IGZpbGVzfSkuCisKK0BpdGVtIGhlbHAgdGFyZ2V0IEB2YXJ7bmFtZX0KK0Rlc2NyaWJlIGEgcGFydGljdWxhciB0YXJnZXQsIGluY2x1ZGluZyBhbnkgcGFyYW1ldGVycyBuZWNlc3NhcnkgdG8KK3NlbGVjdCBpdC4KKworQGtpbmRleCBzZXQgZ251dGFyZ2V0CitAaXRlbSBzZXQgZ251dGFyZ2V0IEB2YXJ7YXJnc30KK0B2YWx1ZXtHREJOfSB1c2VzIGl0cyBvd24gbGlicmFyeSBCRkQgdG8gcmVhZCB5b3VyIGZpbGVzLiAgQHZhbHVle0dEQk59IAora25vd3Mgd2hldGhlciBpdCBpcyByZWFkaW5nIGFuIEBkZm57ZXhlY3V0YWJsZX0sCithIEBkZm57Y29yZX0sIG9yIGEgQGRmbnsub30gZmlsZTsgaG93ZXZlciwgeW91IGNhbiBzcGVjaWZ5IHRoZSBmaWxlIGZvcm1hdCAKK3dpdGggdGhlIEBjb2Rle3NldCBnbnV0YXJnZXR9IGNvbW1hbmQuICBVbmxpa2UgbW9zdCBAY29kZXt0YXJnZXR9IGNvbW1hbmRzLCAKK3dpdGggQGNvZGV7Z251dGFyZ2V0fSB0aGUgQGNvZGV7dGFyZ2V0fSByZWZlcnMgdG8gYSBwcm9ncmFtLCBub3QgYSBtYWNoaW5lLgorCitAZW1waHtXYXJuaW5nOn0gVG8gc3BlY2lmeSBhIGZpbGUgZm9ybWF0IHdpdGggQGNvZGV7c2V0IGdudXRhcmdldH0sCit5b3UgbXVzdCBrbm93IHRoZSBhY3R1YWwgQkZEIG5hbWUuCisKK0Bub2luZGVudCBAeHJlZntGaWxlcywgLCBDb21tYW5kcyB0byBzcGVjaWZ5IGZpbGVzfS4KKworQGtpbmRleCBzaG93IGdudXRhcmdldCAgCitAaXRlbSBzaG93IGdudXRhcmdldAorVXNlIHRoZSBAY29kZXtzaG93IGdudXRhcmdldH0gY29tbWFuZCB0byBkaXNwbGF5IHdoYXQgZmlsZSBmb3JtYXQKK0Bjb2Rle2dudXRhcmdldH0gaXMgc2V0IHRvIHJlYWQuICBJZiB5b3UgaGF2ZSBub3Qgc2V0IEBjb2Rle2dudXRhcmdldH0sCitAdmFsdWV7R0RCTn0gd2lsbCBkZXRlcm1pbmUgdGhlIGZpbGUgZm9ybWF0IGZvciBlYWNoIGZpbGUgYXV0b21hdGljYWxseSwKK2FuZCBAY29kZXtzaG93IGdudXRhcmdldH0gZGlzcGxheXMgQHNhbXB7VGhlIGN1cnJlbnQgQkRGIHRhcmdldCBpcyAiYXV0byJ9LgorQGVuZCB0YWJsZQorCitAaWZjbGVhciBIUFBBCitIZXJlIGFyZSBzb21lIGNvbW1vbiB0YXJnZXRzIChhdmFpbGFibGUsIG9yIG5vdCwgZGVwZW5kaW5nIG9uIHRoZSBHREIKK2NvbmZpZ3VyYXRpb24pOgorQGVuZCBpZmNsZWFyCitAaWZzZXQgSFBQQQorVGhlc2UgYXJlIHRoZSB2YWxpZCB0YXJnZXRzIG9uIEhQLVVYIHN5c3RlbXM6CitAZW5kIGlmc2V0CisKK0B0YWJsZSBAY29kZQorQGtpbmRleCB0YXJnZXQgZXhlYworQGl0ZW0gdGFyZ2V0IGV4ZWMgQHZhcntwcm9ncmFtfQorQW4gZXhlY3V0YWJsZSBmaWxlLiAgQHNhbXB7dGFyZ2V0IGV4ZWMgQHZhcntwcm9ncmFtfX0gaXMgdGhlIHNhbWUgYXMKK0BzYW1we2V4ZWMtZmlsZSBAdmFye3Byb2dyYW19fS4KKworQGlmY2xlYXIgQkFSRVRBUkdFVAorQGtpbmRleCB0YXJnZXQgY29yZQorQGl0ZW0gdGFyZ2V0IGNvcmUgQHZhcntmaWxlbmFtZX0KK0EgY29yZSBkdW1wIGZpbGUuICBAc2FtcHt0YXJnZXQgY29yZSBAdmFye2ZpbGVuYW1lfX0gaXMgdGhlIHNhbWUgYXMKK0BzYW1we2NvcmUtZmlsZSBAdmFye2ZpbGVuYW1lfX0uCitAZW5kIGlmY2xlYXIKKworQGtpbmRleCB0YXJnZXQgcmVtb3RlCitAaXRlbSB0YXJnZXQgcmVtb3RlIEB2YXJ7ZGV2fQorUmVtb3RlIHNlcmlhbCB0YXJnZXQgaW4gR0RCLXNwZWNpZmljIHByb3RvY29sLiAgVGhlIGFyZ3VtZW50IEB2YXJ7ZGV2fQorc3BlY2lmaWVzIHdoYXQgc2VyaWFsIGRldmljZSB0byB1c2UgZm9yIHRoZSBjb25uZWN0aW9uIChlLmcuCitAZmlsZXsvZGV2L3R0eWF9KS4gQHhyZWZ7UmVtb3RlLCAsUmVtb3RlIGRlYnVnZ2luZ30uICBAY29kZXt0YXJnZXQgcmVtb3RlfQorbm93IHN1cHBvcnRzIHRoZSBAY29kZXtsb2FkfSBjb21tYW5kLiAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBpZiB5b3UgaGF2ZQorc29tZSBvdGhlciB3YXkgb2YgZ2V0dGluZyB0aGUgc3R1YiB0byB0aGUgdGFyZ2V0IHN5c3RlbSwgYW5kIHlvdSBjYW4gcHV0CitpdCBzb21ld2hlcmUgaW4gbWVtb3J5IHdoZXJlIGl0IHdvbid0IGdldCBjbG9iYmVyZWQgYnkgdGhlIGRvd25sb2FkLgorCitAaWZjbGVhciBIUFBBCitAa2luZGV4IHRhcmdldCBzaW0KK0BpdGVtIHRhcmdldCBzaW0KK0NQVSBzaW11bGF0b3IuICBAeHJlZntTaW11bGF0b3IsLFNpbXVsYXRlZCBDUFUgVGFyZ2V0fS4KK0BlbmQgaWZjbGVhcgorQGVuZCB0YWJsZQorCitUaGUgZm9sbG93aW5nIHRhcmdldHMgYXJlIGFsbCBDUFUtc3BlY2lmaWMsIGFuZCBvbmx5IGF2YWlsYWJsZSBmb3IKK3NwZWNpZmljIGNvbmZpZ3VyYXRpb25zLgorQGMgc2hvdWxkIG9yZ2FuaXplIGJ5IENQVQorCitAdGFibGUgQGNvZGUKKworQGtpbmRleCB0YXJnZXQgYWJ1ZworQGl0ZW0gdGFyZ2V0IGFidWcgQHZhcntkZXZ9CitBQnVnIFJPTSBtb25pdG9yIGZvciBNNjhLLgorCitAa2luZGV4IHRhcmdldCBhZGFwdAorQGl0ZW0gdGFyZ2V0IGFkYXB0IEB2YXJ7ZGV2fQorQWRhcHQgbW9uaXRvciBmb3IgQTI5Sy4KKworQGtpbmRleCB0YXJnZXQgYW1kLWViCitAaXRlbSB0YXJnZXQgYW1kLWViIEB2YXJ7ZGV2fSBAdmFye3NwZWVkfSBAdmFye1BST0d9CitAY2luZGV4IEFNRCBFQjI5SworUmVtb3RlIFBDLXJlc2lkZW50IEFNRCBFQjI5SyBib2FyZCwgYXR0YWNoZWQgb3ZlciBzZXJpYWwgbGluZXMuCitAdmFye2Rldn0gaXMgdGhlIHNlcmlhbCBkZXZpY2UsIGFzIGZvciBAY29kZXt0YXJnZXQgcmVtb3RlfTsKK0B2YXJ7c3BlZWR9IGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgbGluZXNwZWVkOyBhbmQgQHZhcntQUk9HfSBpcyB0aGUKK25hbWUgb2YgdGhlIHByb2dyYW0gdG8gYmUgZGVidWdnZWQsIGFzIGl0IGFwcGVhcnMgdG8gRE9TIG9uIHRoZSBQQy4KK0B4cmVme0VCMjlLIFJlbW90ZSwgLFRoZSBFQk1PTiBwcm90b2NvbCBmb3IgQU1EMjlLfS4KKworQGtpbmRleCB0YXJnZXQgYXJyYXkKK0BpdGVtIHRhcmdldCBhcnJheSBAdmFye2Rldn0KK0FycmF5IFRlY2ggTFNJMzNLIFJBSUQgY29udHJvbGxlciBib2FyZC4KKworQGtpbmRleCB0YXJnZXQgYnVnCitAaXRlbSB0YXJnZXQgYnVnIEB2YXJ7ZGV2fQorQlVHIG1vbml0b3IsIHJ1bm5pbmcgb24gYSBNVk1FMTg3IChtODhrKSBib2FyZC4KKworQGtpbmRleCB0YXJnZXQgY3B1MzJidWcKK0BpdGVtIHRhcmdldCBjcHUzMmJ1ZyBAdmFye2Rldn0KK0NQVTMyQlVHIG1vbml0b3IsIHJ1bm5pbmcgb24gYSBDUFUzMiAoTTY4SykgYm9hcmQuCisKK0BraW5kZXggdGFyZ2V0IGRidWcKK0BpdGVtIHRhcmdldCBkYnVnIEB2YXJ7ZGV2fQorZEJVRyBST00gbW9uaXRvciBmb3IgTW90b3JvbGEgQ29sZEZpcmUuCisKK0BraW5kZXggdGFyZ2V0IGRkYgorQGl0ZW0gdGFyZ2V0IGRkYiBAdmFye2Rldn0KK05FQydzIEREQiBtb25pdG9yIGZvciBNaXBzIFZyNDMwMC4KKworQGtpbmRleCB0YXJnZXQgZGluazMyCitAaXRlbSB0YXJnZXQgZGluazMyIEB2YXJ7ZGV2fQorRElOSzMyIFJPTSBtb25pdG9yIGZvciBQb3dlclBDLgorCitAa2luZGV4IHRhcmdldCBlNzAwMAorQGl0ZW0gdGFyZ2V0IGU3MDAwIEB2YXJ7ZGV2fQorRTcwMDAgZW11bGF0b3IgZm9yIEhpdGFjaGkgSDggYW5kIFNILgorCitAa2luZGV4IHRhcmdldCBlczE4MDAKK0BpdGVtIHRhcmdldCBlczE4MDAgQHZhcntkZXZ9CitFUy0xODAwIGVtdWxhdG9yIGZvciBNNjhLLgorCitAa2luZGV4IHRhcmdldCBlc3QKK0BpdGVtIHRhcmdldCBlc3QgQHZhcntkZXZ9CitFU1QtMzAwIElDRSBtb25pdG9yLCBydW5uaW5nIG9uIGEgQ1BVMzIgKE02OEspIGJvYXJkLgorCitAa2luZGV4IHRhcmdldCBobXMKK0BpdGVtIHRhcmdldCBobXMgQHZhcntkZXZ9CitBIEhpdGFjaGkgU0gsIEg4LzMwMCwgb3IgSDgvNTAwIGJvYXJkLCBhdHRhY2hlZCB2aWEgc2VyaWFsIGxpbmUgdG8geW91ciBob3N0LgorQGlmY2xlYXIgSDhFWENMVVNJVkUKK1VzZSBzcGVjaWFsIGNvbW1hbmRzIEBjb2Rle2RldmljZX0gYW5kIEBjb2Rle3NwZWVkfSB0byBjb250cm9sIHRoZSBzZXJpYWwKK2xpbmUgYW5kIHRoZSBjb21tdW5pY2F0aW9ucyBzcGVlZCB1c2VkLgorQHhyZWZ7SGl0YWNoaSBSZW1vdGUsLEB2YWx1ZXtHREJOfSBhbmQgSGl0YWNoaSBNaWNyb3Byb2Nlc3NvcnN9LgorCitAa2luZGV4IHRhcmdldCBsc2kKK0BpdGVtIHRhcmdldCBsc2kgQHZhcntkZXZ9CitMU0kgUk9NIG1vbml0b3IgZm9yIE1pcHMuCisKK0BraW5kZXggdGFyZ2V0IG0zMnIKK0BpdGVtIHRhcmdldCBtMzJyIEB2YXJ7ZGV2fQorTWl0c3ViaXNoaSBNMzJSL0QgUk9NIG1vbml0b3IuCisKK0BraW5kZXggdGFyZ2V0IG1pcHMKK0BpdGVtIHRhcmdldCBtaXBzIEB2YXJ7ZGV2fQorSURUL1NJTSBST00gbW9uaXRvciBmb3IgTWlwcy4KKworQGtpbmRleCB0YXJnZXQgbW9uOTYwCitAaXRlbSB0YXJnZXQgbW9uOTYwIEB2YXJ7ZGV2fQorTU9OOTYwIG1vbml0b3IgZm9yIEludGVsIGk5NjAuCisKK0BraW5kZXggdGFyZ2V0IG5pbmR5CitAaXRlbSB0YXJnZXQgbmluZHkgQHZhcntkZXZpY2VuYW1lfQorQW4gSW50ZWwgOTYwIGJvYXJkIGNvbnRyb2xsZWQgYnkgYSBOaW5keSBNb25pdG9yLiAgQHZhcntkZXZpY2VuYW1lfSBpcwordGhlIG5hbWUgb2YgdGhlIHNlcmlhbCBkZXZpY2UgdG8gdXNlIGZvciB0aGUgY29ubmVjdGlvbiwgZS5nLgorQGZpbGV7L2Rldi90dHlhfS4gIEB4cmVme2k5NjAtTmluZHkgUmVtb3RlLCAsQHZhbHVle0dEQk59IHdpdGggYSByZW1vdGUgaTk2MCAoTmluZHkpfS4KKworQGtpbmRleCB0YXJnZXQgbnJvbQorQGl0ZW0gdGFyZ2V0IG5yb20gQHZhcntkZXZ9CitOZXRST00gUk9NIGVtdWxhdG9yLiAgVGhpcyB0YXJnZXQgb25seSBzdXBwb3J0cyBkb3dubG9hZGluZy4KKworQGtpbmRleCB0YXJnZXQgb3A1MG4KK0BpdGVtIHRhcmdldCBvcDUwbiBAdmFye2Rldn0KK09QNTBOIG1vbml0b3IsIHJ1bm5pbmcgb24gYW4gT0tJIEhQUEEgYm9hcmQuCisKK0BraW5kZXggdGFyZ2V0IHBtb24KK0BpdGVtIHRhcmdldCBwbW9uIEB2YXJ7ZGV2fQorUE1PTiBST00gbW9uaXRvciBmb3IgTWlwcy4KKworQGtpbmRleCB0YXJnZXQgcHBjYnVnCitAaXRlbSB0YXJnZXQgcHBjYnVnIEB2YXJ7ZGV2fQorQGtpbmRleCB0YXJnZXQgcHBjYnVnMQorQGl0ZW0gdGFyZ2V0IHBwY2J1ZzEgQHZhcntkZXZ9CitQUENCVUcgUk9NIG1vbml0b3IgZm9yIFBvd2VyUEMuCisKK0BraW5kZXggdGFyZ2V0IHIzOTAwCitAaXRlbSB0YXJnZXQgcjM5MDAgQHZhcntkZXZ9CitEZW5zYW4gRFZFLVIzOTAwIFJPTSBtb25pdG9yIGZvciBUb3NoaWJhIFIzOTAwIE1pcHMuCisKK0BraW5kZXggdGFyZ2V0IHJkaQorQGl0ZW0gdGFyZ2V0IHJkaSBAdmFye2Rldn0KK0FSTSBBbmdlbCBtb25pdG9yLCB2aWEgUkRJIGxpYnJhcnkgaW50ZXJmYWNlLgorIAorQGtpbmRleCB0YXJnZXQgcmRwCitAaXRlbSB0YXJnZXQgcmRwIEB2YXJ7ZGV2fQorQVJNIERlbW9uIG1vbml0b3IuCisKK0BraW5kZXggdGFyZ2V0IHJvbTY4aworQGl0ZW0gdGFyZ2V0IHJvbTY4ayBAdmFye2Rldn0KK1JPTSA2OEsgbW9uaXRvciwgcnVubmluZyBvbiBhbiBNNjhLIElEUCBib2FyZC4KKworQGtpbmRleCB0YXJnZXQgcm9tYnVnCitAaXRlbSB0YXJnZXQgcm9tYnVnIEB2YXJ7ZGV2fQorUk9NQlVHIFJPTSBtb25pdG9yIGZvciBPUy85MDAwLgorCitAa2luZGV4IHRhcmdldCBzZHMKK0BpdGVtIHRhcmdldCBzZHMgQHZhcntkZXZ9CitTRFMgbW9uaXRvciwgcnVubmluZyBvbiBhIFBvd2VyUEMgYm9hcmQgKHN1Y2ggYXMgTW90b3JvbGEncyBBRFMpLgorCitAa2luZGV4IHRhcmdldCBzcGFyY2xpdGUKK0BpdGVtIHRhcmdldCBzcGFyY2xpdGUgQHZhcntkZXZ9CitGdWppdHN1IHNwYXJjbGl0ZSBib2FyZHMsIHVzZWQgb25seSBmb3IgdGhlIHB1cnBvc2Ugb2YgbG9hZGluZy4gIAorWW91IG11c3QgdXNlIGFuIGFkZGl0aW9uYWwgY29tbWFuZCB0byBkZWJ1ZyB0aGUgcHJvZ3JhbS4gCitGb3IgZXhhbXBsZTogdGFyZ2V0IHJlbW90ZSBAdmFye2Rldn0gdXNpbmcgQHZhbHVle0dEQk59IHN0YW5kYXJkIAorcmVtb3RlIHByb3RvY29sLgorCitAa2luZGV4IHRhcmdldCBzaDMKK0BraW5kZXggdGFyZ2V0IHNoM2UKK0BpdGVtIHRhcmdldCBzaDMgQHZhcntkZXZ9CitAaXRlbSB0YXJnZXQgc2gzZSBAdmFye2Rldn0KK0hpdGFjaGkgU0gtMyBhbmQgU0gtM0UgdGFyZ2V0IHN5c3RlbXMuCisKK0BraW5kZXggdGFyZ2V0IHN0MjAwMAorQGl0ZW0gdGFyZ2V0IHN0MjAwMCBAdmFye2Rldn0gQHZhcntzcGVlZH0KK0EgVGFuZGVtIFNUMjAwMCBwaG9uZSBzd2l0Y2gsIHJ1bm5pbmcgVGFuZGVtJ3MgU1REQlVHIHByb3RvY29sLiAgQHZhcntkZXZ9CitpcyB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlIGF0dGFjaGVkIHRvIHRoZSBTVDIwMDAgc2VyaWFsIGxpbmU7CitAdmFye3NwZWVkfSBpcyB0aGUgY29tbXVuaWNhdGlvbiBsaW5lIHNwZWVkLiAgVGhlIGFyZ3VtZW50cyBhcmUgbm90IHVzZWQKK2lmIEB2YWx1ZXtHREJOfSBpcyBjb25maWd1cmVkIHRvIGNvbm5lY3QgdG8gdGhlIFNUMjAwMCB1c2luZyBUQ1Agb3IgVGVsbmV0LgorQHhyZWZ7U1QyMDAwIFJlbW90ZSwsQHZhbHVle0dEQk59IHdpdGggYSBUYW5kZW0gU1QyMDAwfS4KKworQGtpbmRleCB0YXJnZXQgdWRpCitAaXRlbSB0YXJnZXQgdWRpIEB2YXJ7a2V5d29yZH0KK1JlbW90ZSBBTUQyOUsgdGFyZ2V0LCB1c2luZyB0aGUgQU1EIFVESSBwcm90b2NvbC4gIFRoZSBAdmFye2tleXdvcmR9Cithcmd1bWVudCBzcGVjaWZpZXMgd2hpY2ggMjlLIGJvYXJkIG9yIHNpbXVsYXRvciB0byB1c2UuICBAeHJlZntVREkyOUsKK1JlbW90ZSwsVGhlIFVESSBwcm90b2NvbCBmb3IgQU1EMjlLfS4KKworQGtpbmRleCB0YXJnZXQgdnh3b3JrcworQGl0ZW0gdGFyZ2V0IHZ4d29ya3MgQHZhcnttYWNoaW5lbmFtZX0KK0EgVnhXb3JrcyBzeXN0ZW0sIGF0dGFjaGVkIHZpYSBUQ1AvSVAuICBUaGUgYXJndW1lbnQgQHZhcnttYWNoaW5lbmFtZX0KK2lzIHRoZSB0YXJnZXQgc3lzdGVtJ3MgbWFjaGluZSBuYW1lIG9yIElQIGFkZHJlc3MuCitAeHJlZntWeFdvcmtzIFJlbW90ZSwgLEB2YWx1ZXtHREJOfSBhbmQgVnhXb3Jrc30uCisKK0BraW5kZXggdGFyZ2V0IHc4OWsKK0BpdGVtIHRhcmdldCB3ODlrIEB2YXJ7ZGV2fQorVzg5SyBtb25pdG9yLCBydW5uaW5nIG9uIGEgV2luYm9uZCBIUFBBIGJvYXJkLgorCitAZW5kIGlmY2xlYXIKK0BlbmQgdGFibGUKKworQGlmc2V0IEdFTkVSSUMKK0RpZmZlcmVudCB0YXJnZXRzIGFyZSBhdmFpbGFibGUgb24gZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIG9mIEB2YWx1ZXtHREJOfTsgCit5b3VyIGNvbmZpZ3VyYXRpb24gbWF5IGhhdmUgbW9yZSBvciBmZXdlciB0YXJnZXRzLgorQGVuZCBpZnNldAorCitNYW55IHJlbW90ZSB0YXJnZXRzIHJlcXVpcmUgeW91IHRvIGRvd25sb2FkIHRoZSBleGVjdXRhYmxlJ3MgY29kZQorb25jZSB5b3UndmUgc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkIGEgY29ubmVjdGlvbi4KKworQHRhYmxlIEBjb2RlCisKK0BraW5kZXggbG9hZCBAdmFye2ZpbGVuYW1lfQorQGl0ZW0gbG9hZCBAdmFye2ZpbGVuYW1lfQorQGlmc2V0IEdFTkVSSUMKK0RlcGVuZGluZyBvbiB3aGF0IHJlbW90ZSBkZWJ1Z2dpbmcgZmFjaWxpdGllcyBhcmUgY29uZmlndXJlZCBpbnRvCitAdmFsdWV7R0RCTn0sIHRoZSBAY29kZXtsb2FkfSBjb21tYW5kIG1heSBiZSBhdmFpbGFibGUuICBXaGVyZSBpdCBleGlzdHMsIGl0CitpcyBtZWFudCB0byBtYWtlIEB2YXJ7ZmlsZW5hbWV9IChhbiBleGVjdXRhYmxlKSBhdmFpbGFibGUgZm9yIGRlYnVnZ2luZworb24gdGhlIHJlbW90ZSBzeXN0ZW0tLS1ieSBkb3dubG9hZGluZywgb3IgZHluYW1pYyBsaW5raW5nLCBmb3IgZXhhbXBsZS4KK0Bjb2Rle2xvYWR9IGFsc28gcmVjb3JkcyB0aGUgQHZhcntmaWxlbmFtZX0gc3ltYm9sIHRhYmxlIGluIEB2YWx1ZXtHREJOfSwgbGlrZQordGhlIEBjb2Rle2FkZC1zeW1ib2wtZmlsZX0gY29tbWFuZC4KKworSWYgeW91ciBAdmFsdWV7R0RCTn0gZG9lcyBub3QgaGF2ZSBhIEBjb2Rle2xvYWR9IGNvbW1hbmQsIGF0dGVtcHRpbmcgdG8KK2V4ZWN1dGUgaXQgZ2V0cyB0aGUgZXJyb3IgbWVzc2FnZSBgYEBjb2Rle1lvdSBjYW4ndCBkbyB0aGF0IHdoZW4geW91cgordGFyZ2V0IGlzIEBkb3Rze319JycKK0BlbmQgaWZzZXQKKworVGhlIGZpbGUgaXMgbG9hZGVkIGF0IHdoYXRldmVyIGFkZHJlc3MgaXMgc3BlY2lmaWVkIGluIHRoZSBleGVjdXRhYmxlLgorRm9yIHNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cywgeW91IGNhbiBzcGVjaWZ5IHRoZSBsb2FkIGFkZHJlc3Mgd2hlbiB5b3UKK2xpbmsgdGhlIHByb2dyYW07IGZvciBvdGhlciBmb3JtYXRzLCBsaWtlIGEub3V0LCB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0CitzcGVjaWZpZXMgYSBmaXhlZCBhZGRyZXNzLgorQGMgRklYTUUhIFRoaXMgd291bGQgYmUgYSBnb29kIHBsYWNlIGZvciBhbiB4cmVmIHRvIHRoZSBHTlUgbGlua2VyIGRvYy4KKworQGlmc2V0IFZYV09SS1MKK09uIFZ4V29ya3MsIEBjb2Rle2xvYWR9IGxpbmtzIEB2YXJ7ZmlsZW5hbWV9IGR5bmFtaWNhbGx5IG9uIHRoZQorY3VycmVudCB0YXJnZXQgc3lzdGVtIGFzIHdlbGwgYXMgYWRkaW5nIGl0cyBzeW1ib2xzIGluIEB2YWx1ZXtHREJOfS4KK0BlbmQgaWZzZXQKKworQGlmc2V0IEk5NjAKK0BjaW5kZXggZG93bmxvYWQgdG8gTmluZHktOTYwCitXaXRoIHRoZSBOaW5keSBpbnRlcmZhY2UgdG8gYW4gSW50ZWwgOTYwIGJvYXJkLCBAY29kZXtsb2FkfQorZG93bmxvYWRzIEB2YXJ7ZmlsZW5hbWV9IHRvIHRoZSA5NjAgYXMgd2VsbCBhcyBhZGRpbmcgaXRzIHN5bWJvbHMgaW4KK0B2YWx1ZXtHREJOfS4KK0BlbmQgaWZzZXQKKworQGlmc2V0IEg4CitAY2luZGV4IGRvd25sb2FkIHRvIEg4LzMwMCBvciBIOC81MDAKK0BjaW5kZXggSDgvMzAwIG9yIEg4LzUwMCBkb3dubG9hZAorQGNpbmRleCBkb3dubG9hZCB0byBIaXRhY2hpIFNICitAY2luZGV4IEhpdGFjaGkgU0ggZG93bmxvYWQKK1doZW4geW91IHNlbGVjdCByZW1vdGUgZGVidWdnaW5nIHRvIGEgSGl0YWNoaSBTSCwgSDgvMzAwLCBvciBIOC81MDAgYm9hcmQKKyhAcHhyZWZ7SGl0YWNoaSBSZW1vdGUsLEB2YWx1ZXtHREJOfSBhbmQgSGl0YWNoaSBNaWNyb3Byb2Nlc3NvcnN9KSwKK3RoZSBAY29kZXtsb2FkfSBjb21tYW5kIGRvd25sb2FkcyB5b3VyIHByb2dyYW0gdG8gdGhlIEhpdGFjaGkgYm9hcmQgYW5kIGFsc28KK29wZW5zIGl0IGFzIHRoZSBjdXJyZW50IGV4ZWN1dGFibGUgdGFyZ2V0IGZvciBAdmFsdWV7R0RCTn0gb24geW91ciBob3N0CisobGlrZSB0aGUgQGNvZGV7ZmlsZX0gY29tbWFuZCkuCitAZW5kIGlmc2V0CisKK0Bjb2Rle2xvYWR9IGRvZXMgbm90IHJlcGVhdCBpZiB5b3UgcHJlc3MgQGtleXtSRVR9IGFnYWluIGFmdGVyIHVzaW5nIGl0LgorQGVuZCB0YWJsZQorCitAaWZzZXQgUkVNT1RFU1RVQgorQG5vZGUgQnl0ZSBPcmRlciwgUmVtb3RlLCBUYXJnZXQgQ29tbWFuZHMsIFRhcmdldHMKK0BzZWN0aW9uIENob29zaW5nIHRhcmdldCBieXRlIG9yZGVyCitAY2luZGV4IGNob29zaW5nIHRhcmdldCBieXRlIG9yZGVyCitAY2luZGV4IHRhcmdldCBieXRlIG9yZGVyCitAa2luZGV4IHNldCBlbmRpYW4gYmlnCitAa2luZGV4IHNldCBlbmRpYW4gbGl0dGxlCitAa2luZGV4IHNldCBlbmRpYW4gYXV0bworQGtpbmRleCBzaG93IGVuZGlhbgorCitTb21lIHR5cGVzIG9mIHByb2Nlc3NvcnMsIHN1Y2ggYXMgdGhlIE1JUFMsIFBvd2VyUEMsIGFuZCBIaXRhY2hpIFNILAorb2ZmZXIgdGhlIGFiaWxpdHkgdG8gcnVuIGVpdGhlciBiaWctZW5kaWFuIG9yIGxpdHRsZS1lbmRpYW4gYnl0ZQorb3JkZXJzLiAgVXN1YWxseSB0aGUgZXhlY3V0YWJsZSBvciBzeW1ib2wgd2lsbCBpbmNsdWRlIGEgYml0IHRvCitkZXNpZ25hdGUgdGhlIGVuZGlhbi1uZXNzLCBhbmQgeW91IHdpbGwgbm90IG5lZWQgdG8gd29ycnkgYWJvdXQKK3doaWNoIHRvIHVzZS4gIEhvd2V2ZXIsIHlvdSBtYXkgc3RpbGwgZmluZCBpdCB1c2VmdWwgdG8gYWRqdXN0CitHREIncyBpZGVhIG9mIHByb2Nlc3NvciBlbmRpYW4tbmVzcyBtYW51YWxseS4KKworQHRhYmxlIEBjb2RlCitAa2luZGV4IHNldCBlbmRpYW4gYmlnCitAaXRlbSBzZXQgZW5kaWFuIGJpZworSW5zdHJ1Y3QgQHZhbHVle0dEQk59IHRvIGFzc3VtZSB0aGUgdGFyZ2V0IGlzIGJpZy1lbmRpYW4uCisKK0BraW5kZXggc2V0IGVuZGlhbiBsaXR0bGUKK0BpdGVtIHNldCBlbmRpYW4gbGl0dGxlCitJbnN0cnVjdCBAdmFsdWV7R0RCTn0gdG8gYXNzdW1lIHRoZSB0YXJnZXQgaXMgbGl0dGxlLWVuZGlhbi4KKworQGtpbmRleCBzZXQgZW5kaWFuIGF1dG8KK0BpdGVtIHNldCBlbmRpYW4gYXV0bworSW5zdHJ1Y3QgQHZhbHVle0dEQk59IHRvIHVzZSB0aGUgYnl0ZSBvcmRlciBhc3NvY2lhdGVkIHdpdGggdGhlCitleGVjdXRhYmxlLgorCitAaXRlbSBzaG93IGVuZGlhbgorRGlzcGxheSBAdmFsdWV7R0RCTn0ncyBjdXJyZW50IGlkZWEgb2YgdGhlIHRhcmdldCBieXRlIG9yZGVyLgorCitAZW5kIHRhYmxlCisKK05vdGUgdGhhdCB0aGVzZSBjb21tYW5kcyBtZXJlbHkgYWRqdXN0IGludGVycHJldGF0aW9uIG9mIHN5bWJvbGljCitkYXRhIG9uIHRoZSBob3N0LCBhbmQgdGhhdCB0aGV5IGhhdmUgYWJzb2x1dGVseSBubyBlZmZlY3Qgb24gdGhlCit0YXJnZXQgc3lzdGVtLgorCitAbm9kZSBSZW1vdGUsICAsIEJ5dGUgT3JkZXIsIFRhcmdldHMKK0BzZWN0aW9uIFJlbW90ZSBkZWJ1Z2dpbmcKK0BjaW5kZXggcmVtb3RlIGRlYnVnZ2luZworCitJZiB5b3UgYXJlIHRyeWluZyB0byBkZWJ1ZyBhIHByb2dyYW0gcnVubmluZyBvbiBhIG1hY2hpbmUgdGhhdCBjYW5ub3QgcnVuCitAdmFsdWV7R0RCTn0gaW4gdGhlIHVzdWFsIHdheSwgaXQgaXMgb2Z0ZW4gdXNlZnVsIHRvIHVzZSByZW1vdGUgZGVidWdnaW5nLiAgCitGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHVzZSByZW1vdGUgZGVidWdnaW5nIG9uIGFuIG9wZXJhdGluZyBzeXN0ZW0ga2VybmVsLCAKK29yIG9uIGEgc21hbGwgc3lzdGVtIHdoaWNoIGRvZXMgbm90IGhhdmUgYSBnZW5lcmFsIHB1cnBvc2Ugb3BlcmF0aW5nIHN5c3RlbQorcG93ZXJmdWwgZW5vdWdoIHRvIHJ1biBhIGZ1bGwtZmVhdHVyZWQgZGVidWdnZXIuCisKK1NvbWUgY29uZmlndXJhdGlvbnMgb2YgQHZhbHVle0dEQk59IGhhdmUgc3BlY2lhbCBzZXJpYWwgb3IgVENQL0lQIGludGVyZmFjZXMKK3RvIG1ha2UgdGhpcyB3b3JrIHdpdGggcGFydGljdWxhciBkZWJ1Z2dpbmcgdGFyZ2V0cy4gIEluIGFkZGl0aW9uLAorQHZhbHVle0dEQk59IGNvbWVzIHdpdGggYSBnZW5lcmljIHNlcmlhbCBwcm90b2NvbCAoc3BlY2lmaWMgdG8gQHZhbHVle0dEQk59LCAKK2J1dCBub3Qgc3BlY2lmaWMgdG8gYW55IHBhcnRpY3VsYXIgdGFyZ2V0IHN5c3RlbSkgd2hpY2ggeW91IGNhbiB1c2UgaWYgeW91Cit3cml0ZSB0aGUgcmVtb3RlIHN0dWJzLS0tdGhlIGNvZGUgdGhhdCBydW5zIG9uIHRoZSByZW1vdGUgc3lzdGVtIHRvCitjb21tdW5pY2F0ZSB3aXRoIEB2YWx1ZXtHREJOfS4KKworT3RoZXIgcmVtb3RlIHRhcmdldHMgbWF5IGJlIGF2YWlsYWJsZSBpbiB5b3VyCitjb25maWd1cmF0aW9uIG9mIEB2YWx1ZXtHREJOfTsgdXNlIEBjb2Rle2hlbHAgdGFyZ2V0fSB0byBsaXN0IHRoZW0uCitAZW5kIGlmc2V0CisKK0BpZnNldCBHRU5FUklDCitAYyBUZXh0IG9uIHN0YXJ0aW5nIHVwIEdEQiBpbiB2YXJpb3VzIHNwZWNpZmljIGNhc2VzOyBpdCBnb2VzIHVwIGZyb250CitAYyBpbiBtYW51YWxzIGNvbmZpZ3VyZWQgZm9yIGFueSBvZiB0aG9zZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbnMsIGhlcmUKK0BjIG90aGVyd2lzZS4KK0BtZW51CitAaWZzZXQgUkVNT1RFU1RVQgorKiBSZW1vdGUgU2VyaWFsOjogICAgICAgICAgICAgICBAdmFsdWV7R0RCTn0gcmVtb3RlIHNlcmlhbCBwcm90b2NvbAorQGVuZCBpZnNldAorQGlmc2V0IEk5NjAKKyogaTk2MC1OaW5keSBSZW1vdGU6OgkJQHZhbHVle0dEQk59IHdpdGggYSByZW1vdGUgaTk2MCAoTmluZHkpCitAZW5kIGlmc2V0CitAaWZzZXQgQU1EMjlLCisqIFVESTI5SyBSZW1vdGU6OiAgICAgICAgICAgICAgIFRoZSBVREkgcHJvdG9jb2wgZm9yIEFNRDI5SworKiBFQjI5SyBSZW1vdGU6OgkJVGhlIEVCTU9OIHByb3RvY29sIGZvciBBTUQyOUsKK0BlbmQgaWZzZXQKK0BpZnNldCBWWFdPUktTCisqIFZ4V29ya3MgUmVtb3RlOjoJCUB2YWx1ZXtHREJOfSBhbmQgVnhXb3JrcworQGVuZCBpZnNldAorQGlmc2V0IFNUMjAwMAorKiBTVDIwMDAgUmVtb3RlOjogICAgICAgICAgICAgICBAdmFsdWV7R0RCTn0gd2l0aCBhIFRhbmRlbSBTVDIwMDAKK0BlbmQgaWZzZXQKK0BpZnNldCBIOAorKiBIaXRhY2hpIFJlbW90ZTo6ICAgICAgICAgICAgICBAdmFsdWV7R0RCTn0gYW5kIEhpdGFjaGkgTWljcm9wcm9jZXNzb3JzCitAZW5kIGlmc2V0CitAaWZzZXQgTUlQUworKiBNSVBTIFJlbW90ZTo6CQkJQHZhbHVle0dEQk59IGFuZCBNSVBTIGJvYXJkcworQGVuZCBpZnNldAorQGlmc2V0IFNQQVJDTEVUCisqIFNwYXJjbGV0IFJlbW90ZTo6ICAgICAgICAgICAgIEB2YWx1ZXtHREJOfSBhbmQgU3BhcmNsZXQgYm9hcmRzCitAZW5kIGlmc2V0CitAaWZzZXQgU0lNUworKiBTaW11bGF0b3I6OiAgICAgICAgICAgICAgICAgICBTaW11bGF0ZWQgQ1BVIHRhcmdldAorQGVuZCBpZnNldAorQGVuZCBtZW51CisKK0BpbmNsdWRlIHJlbW90ZS50ZXhpCitAZW5kIGlmc2V0CisKK0Bub2RlIENvbnRyb2xsaW5nIEdEQgorQGNoYXB0ZXIgQ29udHJvbGxpbmcgQHZhbHVle0dEQk59CisKK1lvdSBjYW4gYWx0ZXIgdGhlIHdheSBAdmFsdWV7R0RCTn0gaW50ZXJhY3RzIHdpdGggeW91IGJ5IHVzaW5nCit0aGUgQGNvZGV7c2V0fSBjb21tYW5kLiAgRm9yIGNvbW1hbmRzIGNvbnRyb2xsaW5nIGhvdyBAdmFsdWV7R0RCTn0gZGlzcGxheXMKK2RhdGEsIEBweHJlZntQcmludCBTZXR0aW5ncywgLFByaW50IHNldHRpbmdzfTsgb3RoZXIgc2V0dGluZ3MgYXJlIGRlc2NyaWJlZCAKK2hlcmUuCisKK0BtZW51CisqIFByb21wdDo6ICAgICAgICAgICAgICAgICAgICAgIFByb21wdAorKiBFZGl0aW5nOjogICAgICAgICAgICAgICAgICAgICBDb21tYW5kIGVkaXRpbmcKKyogSGlzdG9yeTo6ICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZCBoaXN0b3J5CisqIFNjcmVlbiBTaXplOjogICAgICAgICAgICAgICAgIFNjcmVlbiBzaXplCisqIE51bWJlcnM6OiAgICAgICAgICAgICAgICAgICAgIE51bWJlcnMKKyogTWVzc2FnZXMvV2FybmluZ3M6OiAgICAgICAgICAgT3B0aW9uYWwgd2FybmluZ3MgYW5kIG1lc3NhZ2VzCitAZW5kIG1lbnUKKworQG5vZGUgUHJvbXB0LCBFZGl0aW5nLCBDb250cm9sbGluZyBHREIsIENvbnRyb2xsaW5nIEdEQgorQHNlY3Rpb24gUHJvbXB0CisKK0BjaW5kZXggcHJvbXB0CisKK0B2YWx1ZXtHREJOfSBpbmRpY2F0ZXMgaXRzIHJlYWRpbmVzcyB0byByZWFkIGEgY29tbWFuZCBieSBwcmludGluZyBhIHN0cmluZworY2FsbGVkIHRoZSBAZGZue3Byb21wdH0uICBUaGlzIHN0cmluZyBpcyBub3JtYWxseSBAc2FtcHsoQHZhbHVle0dEQlB9KX0uICBZb3UKK2NhbiBjaGFuZ2UgdGhlIHByb21wdCBzdHJpbmcgd2l0aCB0aGUgQGNvZGV7c2V0IHByb21wdH0gY29tbWFuZC4gIEZvcgoraW5zdGFuY2UsIHdoZW4gZGVidWdnaW5nIEB2YWx1ZXtHREJOfSB3aXRoIEB2YWx1ZXtHREJOfSwgaXQgaXMgdXNlZnVsIHRvIGNoYW5nZQordGhlIHByb21wdCBpbiBvbmUgb2YgdGhlIEB2YWx1ZXtHREJOfSBzZXNzaW9ucyBzbyB0aGF0IHlvdSBjYW4gYWx3YXlzIHRlbGwgCit3aGljaCBvbmUgeW91IGFyZSB0YWxraW5nIHRvLgorCitAZW1waHtOb3RlOn0gIEBjb2Rle3NldCBwcm9tcHR9IG5vIGxvbmdlciBhZGRzIGEgc3BhY2UgZm9yIHlvdSBhZnRlciB0aGUKK3Byb21wdCB5b3Ugc2V0LiAgVGhpcyBhbGxvd3MgeW91IHRvIHNldCBhIHByb21wdCB3aGljaCBlbmRzIGluIGEgc3BhY2UKK29yIGEgcHJvbXB0IHRoYXQgZG9lcyBub3QuCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBzZXQgcHJvbXB0CitAaXRlbSBzZXQgcHJvbXB0IEB2YXJ7bmV3cHJvbXB0fQorRGlyZWN0cyBAdmFsdWV7R0RCTn0gdG8gdXNlIEB2YXJ7bmV3cHJvbXB0fSBhcyBpdHMgcHJvbXB0IHN0cmluZyBoZW5jZWZvcnRoLgorCitAa2luZGV4IHNob3cgcHJvbXB0CitAaXRlbSBzaG93IHByb21wdAorUHJpbnRzIGEgbGluZSBvZiB0aGUgZm9ybTogQHNhbXB7R2RiJ3MgcHJvbXB0IGlzOiBAdmFye3lvdXItcHJvbXB0fX0KK0BlbmQgdGFibGUKKworQG5vZGUgRWRpdGluZywgSGlzdG9yeSwgUHJvbXB0LCBDb250cm9sbGluZyBHREIKK0BzZWN0aW9uIENvbW1hbmQgZWRpdGluZworQGNpbmRleCByZWFkbGluZQorQGNpbmRleCBjb21tYW5kIGxpbmUgZWRpdGluZworCitAdmFsdWV7R0RCTn0gcmVhZHMgaXRzIGlucHV0IGNvbW1hbmRzIHZpYSB0aGUgQGRmbntyZWFkbGluZX0gaW50ZXJmYWNlLiAgVGhpcworQHNje2dudX0gbGlicmFyeSBwcm92aWRlcyBjb25zaXN0ZW50IGJlaGF2aW9yIGZvciBwcm9ncmFtcyB3aGljaCBwcm92aWRlIGEKK2NvbW1hbmQgbGluZSBpbnRlcmZhY2UgdG8gdGhlIHVzZXIuICBBZHZhbnRhZ2VzIGFyZSBAc2N7Z251fSBFbWFjcy1zdHlsZQorb3IgQGRmbnt2aX0tc3R5bGUgaW5saW5lIGVkaXRpbmcgb2YgY29tbWFuZHMsIEBjb2Rle2NzaH0tbGlrZSBoaXN0b3J5CitzdWJzdGl0dXRpb24sIGFuZCBhIHN0b3JhZ2UgYW5kIHJlY2FsbCBvZiBjb21tYW5kIGhpc3RvcnkgYWNyb3NzCitkZWJ1Z2dpbmcgc2Vzc2lvbnMuCisKK1lvdSBtYXkgY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgY29tbWFuZCBsaW5lIGVkaXRpbmcgaW4gQHZhbHVle0dEQk59IHdpdGggdGhlCitjb21tYW5kIEBjb2Rle3NldH0uCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBzZXQgZWRpdGluZworQGNpbmRleCBlZGl0aW5nCitAaXRlbSBzZXQgZWRpdGluZworQGl0ZW14IHNldCBlZGl0aW5nIG9uCitFbmFibGUgY29tbWFuZCBsaW5lIGVkaXRpbmcgKGVuYWJsZWQgYnkgZGVmYXVsdCkuCisKK0BpdGVtIHNldCBlZGl0aW5nIG9mZgorRGlzYWJsZSBjb21tYW5kIGxpbmUgZWRpdGluZy4KKworQGtpbmRleCBzaG93IGVkaXRpbmcKK0BpdGVtIHNob3cgZWRpdGluZworU2hvdyB3aGV0aGVyIGNvbW1hbmQgbGluZSBlZGl0aW5nIGlzIGVuYWJsZWQuCitAZW5kIHRhYmxlCisKK0Bub2RlIEhpc3RvcnksIFNjcmVlbiBTaXplLCBFZGl0aW5nLCBDb250cm9sbGluZyBHREIKK0BzZWN0aW9uIENvbW1hbmQgaGlzdG9yeQorCitAdmFsdWV7R0RCTn0gY2FuIGtlZXAgdHJhY2sgb2YgdGhlIGNvbW1hbmRzIHlvdSB0eXBlIGR1cmluZyB5b3VyCitkZWJ1Z2dpbmcgc2Vzc2lvbnMsIHNvIHRoYXQgeW91IGNhbiBiZSBjZXJ0YWluIG9mIHByZWNpc2VseSB3aGF0CitoYXBwZW5lZC4gIFVzZSB0aGVzZSBjb21tYW5kcyB0byBtYW5hZ2UgdGhlIEB2YWx1ZXtHREJOfSBjb21tYW5kCitoaXN0b3J5IGZhY2lsaXR5LgorCitAdGFibGUgQGNvZGUKK0BjaW5kZXggaGlzdG9yeSBzdWJzdGl0dXRpb24KK0BjaW5kZXggaGlzdG9yeSBmaWxlCitAa2luZGV4IHNldCBoaXN0b3J5IGZpbGVuYW1lCitAa2luZGV4IEdEQkhJU1RGSUxFCitAaXRlbSBzZXQgaGlzdG9yeSBmaWxlbmFtZSBAdmFye2ZuYW1lfQorU2V0IHRoZSBuYW1lIG9mIHRoZSBAdmFsdWV7R0RCTn0gY29tbWFuZCBoaXN0b3J5IGZpbGUgdG8gQHZhcntmbmFtZX0uCitUaGlzIGlzIHRoZSBmaWxlIHdoZXJlIEB2YWx1ZXtHREJOfSByZWFkcyBhbiBpbml0aWFsIGNvbW1hbmQgaGlzdG9yeQorbGlzdCwgYW5kIHdoZXJlIGl0IHdyaXRlcyB0aGUgY29tbWFuZCBoaXN0b3J5IGZyb20gdGhpcyBzZXNzaW9uIHdoZW4gaXQKK2V4aXRzLiAgWW91IGNhbiBhY2Nlc3MgdGhpcyBsaXN0IHRocm91Z2ggaGlzdG9yeSBleHBhbnNpb24gb3IgdGhyb3VnaAordGhlIGhpc3RvcnkgY29tbWFuZCBlZGl0aW5nIGNoYXJhY3RlcnMgbGlzdGVkIGJlbG93LiAgVGhpcyBmaWxlIGRlZmF1bHRzCit0byB0aGUgdmFsdWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dEQkhJU1RGSUxFfSwgb3IgdG8KK0BmaWxley4vLmdkYl9oaXN0b3J5fSBpZiB0aGlzIHZhcmlhYmxlIGlzIG5vdCBzZXQuCisKK0BjaW5kZXggaGlzdG9yeSBzYXZlCitAa2luZGV4IHNldCBoaXN0b3J5IHNhdmUKK0BpdGVtIHNldCBoaXN0b3J5IHNhdmUKK0BpdGVteCBzZXQgaGlzdG9yeSBzYXZlIG9uCitSZWNvcmQgY29tbWFuZCBoaXN0b3J5IGluIGEgZmlsZSwgd2hvc2UgbmFtZSBtYXkgYmUgc3BlY2lmaWVkIHdpdGggdGhlCitAY29kZXtzZXQgaGlzdG9yeSBmaWxlbmFtZX0gY29tbWFuZC4gIEJ5IGRlZmF1bHQsIHRoaXMgb3B0aW9uIGlzIGRpc2FibGVkLgorCitAaXRlbSBzZXQgaGlzdG9yeSBzYXZlIG9mZgorU3RvcCByZWNvcmRpbmcgY29tbWFuZCBoaXN0b3J5IGluIGEgZmlsZS4KKworQGNpbmRleCBoaXN0b3J5IHNpemUKK0BraW5kZXggc2V0IGhpc3Rvcnkgc2l6ZQorQGl0ZW0gc2V0IGhpc3Rvcnkgc2l6ZSBAdmFye3NpemV9CitTZXQgdGhlIG51bWJlciBvZiBjb21tYW5kcyB3aGljaCBAdmFsdWV7R0RCTn0ga2VlcHMgaW4gaXRzIGhpc3RvcnkgbGlzdC4KK1RoaXMgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorQGNvZGV7SElTVFNJWkV9LCBvciB0byAyNTYgaWYgdGhpcyB2YXJpYWJsZSBpcyBub3Qgc2V0LgorQGVuZCB0YWJsZQorCitAY2luZGV4IGhpc3RvcnkgZXhwYW5zaW9uCitIaXN0b3J5IGV4cGFuc2lvbiBhc3NpZ25zIHNwZWNpYWwgbWVhbmluZyB0byB0aGUgY2hhcmFjdGVyIEBrYmR7IX0uCitAaWZzZXQgaGF2ZS1yZWFkbGluZS1hcHBlbmRpY2VzCitAeHJlZntFdmVudCBEZXNpZ25hdG9yc30uCitAZW5kIGlmc2V0CisKK1NpbmNlIEBrYmR7IX0gaXMgYWxzbyB0aGUgbG9naWNhbCBub3Qgb3BlcmF0b3IgaW4gQywgaGlzdG9yeSBleHBhbnNpb24KK2lzIG9mZiBieSBkZWZhdWx0LiBJZiB5b3UgZGVjaWRlIHRvIGVuYWJsZSBoaXN0b3J5IGV4cGFuc2lvbiB3aXRoIHRoZQorQGNvZGV7c2V0IGhpc3RvcnkgZXhwYW5zaW9uIG9ufSBjb21tYW5kLCB5b3UgbWF5IHNvbWV0aW1lcyBuZWVkIHRvCitmb2xsb3cgQGtiZHshfSAod2hlbiBpdCBpcyB1c2VkIGFzIGxvZ2ljYWwgbm90LCBpbiBhbiBleHByZXNzaW9uKSB3aXRoCithIHNwYWNlIG9yIGEgdGFiIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBleHBhbmRlZC4gIFRoZSByZWFkbGluZQoraGlzdG9yeSBmYWNpbGl0aWVzIGRvIG5vdCBhdHRlbXB0IHN1YnN0aXR1dGlvbiBvbiB0aGUgc3RyaW5ncworQGtiZHshPX0gYW5kIEBrYmR7ISh9LCBldmVuIHdoZW4gaGlzdG9yeSBleHBhbnNpb24gaXMgZW5hYmxlZC4KKworVGhlIGNvbW1hbmRzIHRvIGNvbnRyb2wgaGlzdG9yeSBleHBhbnNpb24gYXJlOgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggc2V0IGhpc3RvcnkgZXhwYW5zaW9uCitAaXRlbSBzZXQgaGlzdG9yeSBleHBhbnNpb24gb24KK0BpdGVteCBzZXQgaGlzdG9yeSBleHBhbnNpb24KK0VuYWJsZSBoaXN0b3J5IGV4cGFuc2lvbi4gIEhpc3RvcnkgZXhwYW5zaW9uIGlzIG9mZiBieSBkZWZhdWx0LgorCitAaXRlbSBzZXQgaGlzdG9yeSBleHBhbnNpb24gb2ZmCitEaXNhYmxlIGhpc3RvcnkgZXhwYW5zaW9uLgorCitUaGUgcmVhZGxpbmUgY29kZSBjb21lcyB3aXRoIG1vcmUgY29tcGxldGUgZG9jdW1lbnRhdGlvbiBvZgorZWRpdGluZyBhbmQgaGlzdG9yeSBleHBhbnNpb24gZmVhdHVyZXMuICBVc2VycyB1bmZhbWlsaWFyIHdpdGggQHNje2dudX0gRW1hY3MKK29yIEBjb2Rle3ZpfSBtYXkgd2lzaCB0byByZWFkIGl0LgorQGlmc2V0IGhhdmUtcmVhZGxpbmUtYXBwZW5kaWNlcworQHhyZWZ7Q29tbWFuZCBMaW5lIEVkaXRpbmd9LgorQGVuZCBpZnNldAorCitAYyBAZ3JvdXAKK0BraW5kZXggc2hvdyBoaXN0b3J5CitAaXRlbSBzaG93IGhpc3RvcnkKK0BpdGVteCBzaG93IGhpc3RvcnkgZmlsZW5hbWUKK0BpdGVteCBzaG93IGhpc3Rvcnkgc2F2ZQorQGl0ZW14IHNob3cgaGlzdG9yeSBzaXplCitAaXRlbXggc2hvdyBoaXN0b3J5IGV4cGFuc2lvbgorVGhlc2UgY29tbWFuZHMgZGlzcGxheSB0aGUgc3RhdGUgb2YgdGhlIEB2YWx1ZXtHREJOfSBoaXN0b3J5IHBhcmFtZXRlcnMuCitAY29kZXtzaG93IGhpc3Rvcnl9IGJ5IGl0c2VsZiBkaXNwbGF5cyBhbGwgZm91ciBzdGF0ZXMuCitAYyBAZW5kIGdyb3VwCitAZW5kIHRhYmxlCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBzaG93IGNvbW1hbmRzCitAaXRlbSBzaG93IGNvbW1hbmRzCitEaXNwbGF5IHRoZSBsYXN0IHRlbiBjb21tYW5kcyBpbiB0aGUgY29tbWFuZCBoaXN0b3J5LgorCitAaXRlbSBzaG93IGNvbW1hbmRzIEB2YXJ7bn0KK1ByaW50IHRlbiBjb21tYW5kcyBjZW50ZXJlZCBvbiBjb21tYW5kIG51bWJlciBAdmFye259LgorCitAaXRlbSBzaG93IGNvbW1hbmRzICsKK1ByaW50IHRlbiBjb21tYW5kcyBqdXN0IGFmdGVyIHRoZSBjb21tYW5kcyBsYXN0IHByaW50ZWQuCitAZW5kIHRhYmxlCisKK0Bub2RlIFNjcmVlbiBTaXplLCBOdW1iZXJzLCBIaXN0b3J5LCBDb250cm9sbGluZyBHREIKK0BzZWN0aW9uIFNjcmVlbiBzaXplCitAY2luZGV4IHNpemUgb2Ygc2NyZWVuCitAY2luZGV4IHBhdXNlcyBpbiBvdXRwdXQKKworQ2VydGFpbiBjb21tYW5kcyB0byBAdmFsdWV7R0RCTn0gbWF5IHByb2R1Y2UgbGFyZ2UgYW1vdW50cyBvZgoraW5mb3JtYXRpb24gb3V0cHV0IHRvIHRoZSBzY3JlZW4uICBUbyBoZWxwIHlvdSByZWFkIGFsbCBvZiBpdCwKK0B2YWx1ZXtHREJOfSBwYXVzZXMgYW5kIGFza3MgeW91IGZvciBpbnB1dCBhdCB0aGUgZW5kIG9mIGVhY2ggcGFnZSBvZgorb3V0cHV0LiAgVHlwZSBAa2V5e1JFVH0gd2hlbiB5b3Ugd2FudCB0byBjb250aW51ZSB0aGUgb3V0cHV0LCBvciBAa2Jke3F9Cit0byBkaXNjYXJkIHRoZSByZW1haW5pbmcgb3V0cHV0LiAgQWxzbywgdGhlIHNjcmVlbiB3aWR0aCBzZXR0aW5nCitkZXRlcm1pbmVzIHdoZW4gdG8gd3JhcCBsaW5lcyBvZiBvdXRwdXQuICBEZXBlbmRpbmcgb24gd2hhdCBpcyBiZWluZworcHJpbnRlZCwgQHZhbHVle0dEQk59IHRyaWVzIHRvIGJyZWFrIHRoZSBsaW5lIGF0IGEgcmVhZGFibGUgcGxhY2UsCityYXRoZXIgdGhhbiBzaW1wbHkgbGV0dGluZyBpdCBvdmVyZmxvdyBvbnRvIHRoZSBmb2xsb3dpbmcgbGluZS4KKworTm9ybWFsbHkgQHZhbHVle0dEQk59IGtub3dzIHRoZSBzaXplIG9mIHRoZSBzY3JlZW4gZnJvbSB0aGUgdGVybWNhcCBkYXRhIGJhc2UKK3RvZ2V0aGVyIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBAY29kZXtURVJNfSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgdGhlCitAY29kZXtzdHR5IHJvd3N9IGFuZCBAY29kZXtzdHR5IGNvbHN9IHNldHRpbmdzLiBJZiB0aGlzIGlzIG5vdCBjb3JyZWN0LAoreW91IGNhbiBvdmVycmlkZSBpdCB3aXRoIHRoZSBAY29kZXtzZXQgaGVpZ2h0fSBhbmQgQGNvZGV7c2V0Cit3aWR0aH0gY29tbWFuZHM6CisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBzZXQgaGVpZ2h0CitAa2luZGV4IHNldCB3aWR0aAorQGtpbmRleCBzaG93IHdpZHRoCitAa2luZGV4IHNob3cgaGVpZ2h0CitAaXRlbSBzZXQgaGVpZ2h0IEB2YXJ7bHBwfQorQGl0ZW14IHNob3cgaGVpZ2h0CitAaXRlbXggc2V0IHdpZHRoIEB2YXJ7Y3BsfQorQGl0ZW14IHNob3cgd2lkdGgKK1RoZXNlIEBjb2Rle3NldH0gY29tbWFuZHMgc3BlY2lmeSBhIHNjcmVlbiBoZWlnaHQgb2YgQHZhcntscHB9IGxpbmVzIGFuZAorYSBzY3JlZW4gd2lkdGggb2YgQHZhcntjcGx9IGNoYXJhY3RlcnMuICBUaGUgYXNzb2NpYXRlZCBAY29kZXtzaG93fQorY29tbWFuZHMgZGlzcGxheSB0aGUgY3VycmVudCBzZXR0aW5ncy4KKworSWYgeW91IHNwZWNpZnkgYSBoZWlnaHQgb2YgemVybyBsaW5lcywgQHZhbHVle0dEQk59IGRvZXMgbm90IHBhdXNlIGR1cmluZyAKK291dHB1dCBubyBtYXR0ZXIgaG93IGxvbmcgdGhlIG91dHB1dCBpcy4gIFRoaXMgaXMgdXNlZnVsIGlmIG91dHB1dCBpcyB0byBhIAorZmlsZSBvciB0byBhbiBlZGl0b3IgYnVmZmVyLgorCitMaWtld2lzZSwgeW91IGNhbiBzcGVjaWZ5IEBzYW1we3NldCB3aWR0aCAwfSB0byBwcmV2ZW50IEB2YWx1ZXtHREJOfQorZnJvbSB3cmFwcGluZyBpdHMgb3V0cHV0LgorQGVuZCB0YWJsZQorCitAbm9kZSBOdW1iZXJzLCBNZXNzYWdlcy9XYXJuaW5ncywgU2NyZWVuIFNpemUsIENvbnRyb2xsaW5nIEdEQgorQHNlY3Rpb24gTnVtYmVycworQGNpbmRleCBudW1iZXIgcmVwcmVzZW50YXRpb24KK0BjaW5kZXggZW50ZXJpbmcgbnVtYmVycworCitZb3UgY2FuIGFsd2F5cyBlbnRlciBudW1iZXJzIGluIG9jdGFsLCBkZWNpbWFsLCBvciBoZXhhZGVjaW1hbCBpbiBAdmFsdWV7R0RCTn0gYnkKK3RoZSB1c3VhbCBjb252ZW50aW9uczogb2N0YWwgbnVtYmVycyBiZWdpbiB3aXRoIEBzYW1wezB9LCBkZWNpbWFsCitudW1iZXJzIGVuZCB3aXRoIEBzYW1wey59LCBhbmQgaGV4YWRlY2ltYWwgbnVtYmVycyBiZWdpbiB3aXRoIEBzYW1wezB4fS4KK051bWJlcnMgdGhhdCBiZWdpbiB3aXRoIG5vbmUgb2YgdGhlc2UgYXJlLCBieSBkZWZhdWx0LCBlbnRlcmVkIGluIGJhc2UKKzEwOyBsaWtld2lzZSwgdGhlIGRlZmF1bHQgZGlzcGxheSBmb3IgbnVtYmVycy0tLXdoZW4gbm8gcGFydGljdWxhcgorZm9ybWF0IGlzIHNwZWNpZmllZC0tLWlzIGJhc2UgMTAuICBZb3UgY2FuIGNoYW5nZSB0aGUgZGVmYXVsdCBiYXNlIGZvcgorYm90aCBpbnB1dCBhbmQgb3V0cHV0IHdpdGggdGhlIEBjb2Rle3NldCByYWRpeH0gY29tbWFuZC4KKworQHRhYmxlIEBjb2RlCitAa2luZGV4IHNldCBpbnB1dC1yYWRpeAorQGl0ZW0gc2V0IGlucHV0LXJhZGl4IEB2YXJ7YmFzZX0KK1NldCB0aGUgZGVmYXVsdCBiYXNlIGZvciBudW1lcmljIGlucHV0LiAgU3VwcG9ydGVkIGNob2ljZXMKK2ZvciBAdmFye2Jhc2V9IGFyZSBkZWNpbWFsIDgsIDEwLCBvciAxNi4gIEB2YXJ7YmFzZX0gbXVzdCBpdHNlbGYgYmUKK3NwZWNpZmllZCBlaXRoZXIgdW5hbWJpZ3VvdXNseSBvciB1c2luZyB0aGUgY3VycmVudCBkZWZhdWx0IHJhZGl4OyBmb3IKK2V4YW1wbGUsIGFueSBvZgorCitAc21hbGxleGFtcGxlCitzZXQgcmFkaXggMDEyCitzZXQgcmFkaXggMTAuCitzZXQgcmFkaXggMHhhCitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9pbmRlbnQKK3NldHMgdGhlIGJhc2UgdG8gZGVjaW1hbC4gIE9uIHRoZSBvdGhlciBoYW5kLCBAc2FtcHtzZXQgcmFkaXggMTB9CitsZWF2ZXMgdGhlIHJhZGl4IHVuY2hhbmdlZCBubyBtYXR0ZXIgd2hhdCBpdCB3YXMuCisKK0BraW5kZXggc2V0IG91dHB1dC1yYWRpeAorQGl0ZW0gc2V0IG91dHB1dC1yYWRpeCBAdmFye2Jhc2V9CitTZXQgdGhlIGRlZmF1bHQgYmFzZSBmb3IgbnVtZXJpYyBkaXNwbGF5LiAgU3VwcG9ydGVkIGNob2ljZXMKK2ZvciBAdmFye2Jhc2V9IGFyZSBkZWNpbWFsIDgsIDEwLCBvciAxNi4gIEB2YXJ7YmFzZX0gbXVzdCBpdHNlbGYgYmUKK3NwZWNpZmllZCBlaXRoZXIgdW5hbWJpZ3VvdXNseSBvciB1c2luZyB0aGUgY3VycmVudCBkZWZhdWx0IHJhZGl4LgorCitAa2luZGV4IHNob3cgaW5wdXQtcmFkaXgKK0BpdGVtIHNob3cgaW5wdXQtcmFkaXgKK0Rpc3BsYXkgdGhlIGN1cnJlbnQgZGVmYXVsdCBiYXNlIGZvciBudW1lcmljIGlucHV0LgorCitAa2luZGV4IHNob3cgb3V0cHV0LXJhZGl4CitAaXRlbSBzaG93IG91dHB1dC1yYWRpeAorRGlzcGxheSB0aGUgY3VycmVudCBkZWZhdWx0IGJhc2UgZm9yIG51bWVyaWMgZGlzcGxheS4KK0BlbmQgdGFibGUKKworQG5vZGUgTWVzc2FnZXMvV2FybmluZ3MsICAsIE51bWJlcnMsIENvbnRyb2xsaW5nIEdEQgorQHNlY3Rpb24gT3B0aW9uYWwgd2FybmluZ3MgYW5kIG1lc3NhZ2VzCisKK0J5IGRlZmF1bHQsIEB2YWx1ZXtHREJOfSBpcyBzaWxlbnQgYWJvdXQgaXRzIGlubmVyIHdvcmtpbmdzLiAgSWYgeW91IGFyZSBydW5uaW5nCitvbiBhIHNsb3cgbWFjaGluZSwgeW91IG1heSB3YW50IHRvIHVzZSB0aGUgQGNvZGV7c2V0IHZlcmJvc2V9IGNvbW1hbmQuCitUaGlzIG1ha2VzIEB2YWx1ZXtHREJOfSB0ZWxsIHlvdSB3aGVuIGl0IGRvZXMgYSBsZW5ndGh5IGludGVybmFsIG9wZXJhdGlvbiwgc28KK3lvdSB3aWxsIG5vdCB0aGluayBpdCBoYXMgY3Jhc2hlZC4KKworQ3VycmVudGx5LCB0aGUgbWVzc2FnZXMgY29udHJvbGxlZCBieSBAY29kZXtzZXQgdmVyYm9zZX0gYXJlIHRob3NlCit3aGljaCBhbm5vdW5jZSB0aGF0IHRoZSBzeW1ib2wgdGFibGUgZm9yIGEgc291cmNlIGZpbGUgaXMgYmVpbmcgcmVhZDsKK3NlZSBAY29kZXtzeW1ib2wtZmlsZX0gaW4gQHJlZntGaWxlcywgLENvbW1hbmRzIHRvIHNwZWNpZnkgZmlsZXN9LgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggc2V0IHZlcmJvc2UKK0BpdGVtIHNldCB2ZXJib3NlIG9uCitFbmFibGVzIEB2YWx1ZXtHREJOfSBvdXRwdXQgb2YgY2VydGFpbiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCitAaXRlbSBzZXQgdmVyYm9zZSBvZmYKK0Rpc2FibGVzIEB2YWx1ZXtHREJOfSBvdXRwdXQgb2YgY2VydGFpbiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCitAa2luZGV4IHNob3cgdmVyYm9zZQorQGl0ZW0gc2hvdyB2ZXJib3NlCitEaXNwbGF5cyB3aGV0aGVyIEBjb2Rle3NldCB2ZXJib3NlfSBpcyBvbiBvciBvZmYuCitAZW5kIHRhYmxlCisKK0J5IGRlZmF1bHQsIGlmIEB2YWx1ZXtHREJOfSBlbmNvdW50ZXJzIGJ1Z3MgaW4gdGhlIHN5bWJvbCB0YWJsZSBvZiBhbiBvYmplY3QKK2ZpbGUsIGl0IGlzIHNpbGVudDsgYnV0IGlmIHlvdSBhcmUgZGVidWdnaW5nIGEgY29tcGlsZXIsIHlvdSBtYXkgZmluZAordGhpcyBpbmZvcm1hdGlvbiB1c2VmdWwgKEBweHJlZntTeW1ib2wgRXJyb3JzLCAsRXJyb3JzIHJlYWRpbmcgc3ltYm9sIGZpbGVzfSkuCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBzZXQgY29tcGxhaW50cworQGl0ZW0gc2V0IGNvbXBsYWludHMgQHZhcntsaW1pdH0KK1Blcm1pdHMgQHZhbHVle0dEQk59IHRvIG91dHB1dCBAdmFye2xpbWl0fSBjb21wbGFpbnRzIGFib3V0IGVhY2ggdHlwZSBvZiB1bnVzdWFsCitzeW1ib2xzIGJlZm9yZSBiZWNvbWluZyBzaWxlbnQgYWJvdXQgdGhlIHByb2JsZW0uICBTZXQgQHZhcntsaW1pdH0gdG8KK3plcm8gdG8gc3VwcHJlc3MgYWxsIGNvbXBsYWludHM7IHNldCBpdCB0byBhIGxhcmdlIG51bWJlciB0byBwcmV2ZW50Citjb21wbGFpbnRzIGZyb20gYmVpbmcgc3VwcHJlc3NlZC4KKworQGtpbmRleCBzaG93IGNvbXBsYWludHMKK0BpdGVtIHNob3cgY29tcGxhaW50cworRGlzcGxheXMgaG93IG1hbnkgc3ltYm9sIGNvbXBsYWludHMgQHZhbHVle0dEQk59IGlzIHBlcm1pdHRlZCB0byBwcm9kdWNlLgorQGVuZCB0YWJsZQorCitCeSBkZWZhdWx0LCBAdmFsdWV7R0RCTn0gaXMgY2F1dGlvdXMsIGFuZCBhc2tzIHdoYXQgc29tZXRpbWVzIHNlZW1zIHRvIGJlIGEKK2xvdCBvZiBzdHVwaWQgcXVlc3Rpb25zIHRvIGNvbmZpcm0gY2VydGFpbiBjb21tYW5kcy4gIEZvciBleGFtcGxlLCBpZgoreW91IHRyeSB0byBydW4gYSBwcm9ncmFtIHdoaWNoIGlzIGFscmVhZHkgcnVubmluZzoKKworQGV4YW1wbGUKKyhAdmFsdWV7R0RCUH0pIHJ1bgorVGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgaGFzIGJlZW4gc3RhcnRlZCBhbHJlYWR5LgorU3RhcnQgaXQgZnJvbSB0aGUgYmVnaW5uaW5nPyAoeSBvciBuKQorQGVuZCBleGFtcGxlCisKK0lmIHlvdSBhcmUgd2lsbGluZyB0byB1bmZsaW5jaGluZ2x5IGZhY2UgdGhlIGNvbnNlcXVlbmNlcyBvZiB5b3VyIG93bgorY29tbWFuZHMsIHlvdSBjYW4gZGlzYWJsZSB0aGlzIGBgZmVhdHVyZScnOgorCitAdGFibGUgQGNvZGUKK0BraW5kZXggc2V0IGNvbmZpcm0KK0BjaW5kZXggZmxpbmNoaW5nCitAY2luZGV4IGNvbmZpcm1hdGlvbgorQGNpbmRleCBzdHVwaWQgcXVlc3Rpb25zCitAaXRlbSBzZXQgY29uZmlybSBvZmYKK0Rpc2FibGVzIGNvbmZpcm1hdGlvbiByZXF1ZXN0cy4KKworQGl0ZW0gc2V0IGNvbmZpcm0gb24KK0VuYWJsZXMgY29uZmlybWF0aW9uIHJlcXVlc3RzICh0aGUgZGVmYXVsdCkuCisKK0BraW5kZXggc2hvdyBjb25maXJtCitAaXRlbSBzaG93IGNvbmZpcm0KK0Rpc3BsYXlzIHN0YXRlIG9mIGNvbmZpcm1hdGlvbiByZXF1ZXN0cy4KK0BlbmQgdGFibGUKKworQG5vZGUgU2VxdWVuY2VzLCBFbWFjcywgQ29udHJvbGxpbmcgR0RCLCBUb3AKK0BjaGFwdGVyIENhbm5lZCBTZXF1ZW5jZXMgb2YgQ29tbWFuZHMKKworQXNpZGUgZnJvbSBicmVha3BvaW50IGNvbW1hbmRzIChAcHhyZWZ7QnJlYWsgQ29tbWFuZHMsICxCcmVha3BvaW50Citjb21tYW5kIGxpc3RzfSksIEB2YWx1ZXtHREJOfSBwcm92aWRlcyB0d28gd2F5cyB0byBzdG9yZSBzZXF1ZW5jZXMgb2YgY29tbWFuZHMKK2ZvciBleGVjdXRpb24gYXMgYSB1bml0OiB1c2VyLWRlZmluZWQgY29tbWFuZHMgYW5kIGNvbW1hbmQgZmlsZXMuCisKK0BtZW51CisqIERlZmluZTo6ICAgICAgICAgICAgICAgICAgICAgIFVzZXItZGVmaW5lZCBjb21tYW5kcworKiBIb29rczo6ICAgICAgICAgICAgICAgICAgICAgICBVc2VyLWRlZmluZWQgY29tbWFuZCBob29rcworKiBDb21tYW5kIEZpbGVzOjogICAgICAgICAgICAgICBDb21tYW5kIGZpbGVzCisqIE91dHB1dDo6ICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRzIGZvciBjb250cm9sbGVkIG91dHB1dAorQGVuZCBtZW51CisKK0Bub2RlIERlZmluZSwgSG9va3MsIFNlcXVlbmNlcywgU2VxdWVuY2VzCitAc2VjdGlvbiBVc2VyLWRlZmluZWQgY29tbWFuZHMKKworQGNpbmRleCB1c2VyLWRlZmluZWQgY29tbWFuZAorQSBAZGZue3VzZXItZGVmaW5lZCBjb21tYW5kfSBpcyBhIHNlcXVlbmNlIG9mIEB2YWx1ZXtHREJOfSBjb21tYW5kcyB0byB3aGljaCAKK3lvdSBhc3NpZ24gYSBuZXcgbmFtZSBhcyBhIGNvbW1hbmQuICBUaGlzIGlzIGRvbmUgd2l0aCB0aGUgQGNvZGV7ZGVmaW5lfQorY29tbWFuZC4gIFVzZXIgY29tbWFuZHMgbWF5IGFjY2VwdCB1cCB0byAxMCBhcmd1bWVudHMgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuCitBcmd1bWVudHMgYXJlIGFjY2Vzc2VkIHdpdGhpbiB0aGUgdXNlciBjb21tYW5kIHZpYSBAdmFyeyRhcmcwQGRvdHN7fSRhcmc5fS4KK0EgdHJpdmlhbCBleGFtcGxlOgorCitAc21hbGxleGFtcGxlCitkZWZpbmUgYWRkZXIKKyAgcHJpbnQgJGFyZzAgKyAkYXJnMSArICRhcmcyCitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9pbmRlbnQgVG8gZXhlY3V0ZSB0aGUgY29tbWFuZCB1c2U6CisKK0BzbWFsbGV4YW1wbGUKK2FkZGVyIDEgMiAzCitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9pbmRlbnQgVGhpcyBkZWZpbmVzIHRoZSBjb21tYW5kIEBjb2Rle2FkZGVyfSwgd2hpY2ggcHJpbnRzIHRoZSBzdW0gb2YKK2l0cyB0aHJlZSBhcmd1bWVudHMuICBOb3RlIHRoZSBhcmd1bWVudHMgYXJlIHRleHQgc3Vic3RpdHV0aW9ucywgc28gdGhleSBtYXkgCityZWZlcmVuY2UgdmFyaWFibGVzLCB1c2UgY29tcGxleCBleHByZXNzaW9ucywgb3IgZXZlbiBwZXJmb3JtIGluZmVyaW9yCitmdW5jdGlvbnMgY2FsbHMuCisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBkZWZpbmUKK0BpdGVtIGRlZmluZSBAdmFye2NvbW1hbmRuYW1lfQorRGVmaW5lIGEgY29tbWFuZCBuYW1lZCBAdmFye2NvbW1hbmRuYW1lfS4gIElmIHRoZXJlIGlzIGFscmVhZHkgYSBjb21tYW5kCitieSB0aGF0IG5hbWUsIHlvdSBhcmUgYXNrZWQgdG8gY29uZmlybSB0aGF0IHlvdSB3YW50IHRvIHJlZGVmaW5lIGl0LgorCitUaGUgZGVmaW5pdGlvbiBvZiB0aGUgY29tbWFuZCBpcyBtYWRlIHVwIG9mIG90aGVyIEB2YWx1ZXtHREJOfSBjb21tYW5kIGxpbmVzLAord2hpY2ggYXJlIGdpdmVuIGZvbGxvd2luZyB0aGUgQGNvZGV7ZGVmaW5lfSBjb21tYW5kLiAgVGhlIGVuZCBvZiB0aGVzZQorY29tbWFuZHMgaXMgbWFya2VkIGJ5IGEgbGluZSBjb250YWluaW5nIEBjb2Rle2VuZH0uCisKK0BraW5kZXggaWYKK0BraW5kZXggZWxzZQorQGl0ZW0gaWYKK1Rha2VzIGEgc2luZ2xlIGFyZ3VtZW50LCB3aGljaCBpcyBhbiBleHByZXNzaW9uIHRvIGV2YWx1YXRlLgorSXQgaXMgZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgY29tbWFuZHMgdGhhdCBhcmUgZXhlY3V0ZWQKK29ubHkgaWYgdGhlIGV4cHJlc3Npb24gaXMgdHJ1ZSAobm9uemVybykuCitUaGVyZSBjYW4gdGhlbiBvcHRpb25hbGx5IGJlIGEgbGluZSBAY29kZXtlbHNlfSwgZm9sbG93ZWQKK2J5IGEgc2VyaWVzIG9mIGNvbW1hbmRzIHRoYXQgYXJlIG9ubHkgZXhlY3V0ZWQgaWYgdGhlIGV4cHJlc3Npb24KK3dhcyBmYWxzZS4gIFRoZSBlbmQgb2YgdGhlIGxpc3QgaXMgbWFya2VkIGJ5IGEgbGluZSBjb250YWluaW5nIEBjb2Rle2VuZH0uCisKK0BraW5kZXggd2hpbGUKK0BpdGVtIHdoaWxlCitUaGUgc3ludGF4IGlzIHNpbWlsYXIgdG8gQGNvZGV7aWZ9OiB0aGUgY29tbWFuZCB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCwKK3doaWNoIGlzIGFuIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUsIGFuZCBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBjb21tYW5kcyB0bworZXhlY3V0ZSwgb25lIHBlciBsaW5lLCB0ZXJtaW5hdGVkIGJ5IGFuIEBjb2Rle2VuZH0uCitUaGUgY29tbWFuZHMgYXJlIGV4ZWN1dGVkIHJlcGVhdGVkbHkgYXMgbG9uZyBhcyB0aGUgZXhwcmVzc2lvbgorZXZhbHVhdGVzIHRvIHRydWUuCisKK0BraW5kZXggZG9jdW1lbnQKK0BpdGVtIGRvY3VtZW50IEB2YXJ7Y29tbWFuZG5hbWV9CitEb2N1bWVudCB0aGUgdXNlci1kZWZpbmVkIGNvbW1hbmQgQHZhcntjb21tYW5kbmFtZX0sIHNvIHRoYXQgaXQgY2FuIGJlCithY2Nlc3NlZCBieSBAY29kZXtoZWxwfS4gIFRoZSBjb21tYW5kIEB2YXJ7Y29tbWFuZG5hbWV9IG11c3QgYWxyZWFkeSBiZSAKK2RlZmluZWQuICBUaGlzIGNvbW1hbmQgcmVhZHMgbGluZXMgb2YgZG9jdW1lbnRhdGlvbiBqdXN0IGFzIEBjb2Rle2RlZmluZX0gCityZWFkcyB0aGUgbGluZXMgb2YgdGhlIGNvbW1hbmQgZGVmaW5pdGlvbiwgZW5kaW5nIHdpdGggQGNvZGV7ZW5kfS4gIAorQWZ0ZXIgdGhlIEBjb2Rle2RvY3VtZW50fSBjb21tYW5kIGlzIGZpbmlzaGVkLCBAY29kZXtoZWxwfSBvbiBjb21tYW5kIAorQHZhcntjb21tYW5kbmFtZX0gZGlzcGxheXMgdGhlIGRvY3VtZW50YXRpb24geW91IGhhdmUgd3JpdHRlbi4KKworWW91IG1heSB1c2UgdGhlIEBjb2Rle2RvY3VtZW50fSBjb21tYW5kIGFnYWluIHRvIGNoYW5nZSB0aGUKK2RvY3VtZW50YXRpb24gb2YgYSBjb21tYW5kLiAgUmVkZWZpbmluZyB0aGUgY29tbWFuZCB3aXRoIEBjb2Rle2RlZmluZX0KK2RvZXMgbm90IGNoYW5nZSB0aGUgZG9jdW1lbnRhdGlvbi4KKworQGtpbmRleCBoZWxwIHVzZXItZGVmaW5lZAorQGl0ZW0gaGVscCB1c2VyLWRlZmluZWQKK0xpc3QgYWxsIHVzZXItZGVmaW5lZCBjb21tYW5kcywgd2l0aCB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZG9jdW1lbnRhdGlvbgorKGlmIGFueSkgZm9yIGVhY2guCisKK0BraW5kZXggc2hvdyB1c2VyCitAaXRlbSBzaG93IHVzZXIKK0BpdGVteCBzaG93IHVzZXIgQHZhcntjb21tYW5kbmFtZX0KK0Rpc3BsYXkgdGhlIEB2YWx1ZXtHREJOfSBjb21tYW5kcyB1c2VkIHRvIGRlZmluZSBAdmFye2NvbW1hbmRuYW1lfSAoYnV0IG5vdCBpdHMKK2RvY3VtZW50YXRpb24pLiAgSWYgbm8gQHZhcntjb21tYW5kbmFtZX0gaXMgZ2l2ZW4sIGRpc3BsYXkgdGhlCitkZWZpbml0aW9ucyBmb3IgYWxsIHVzZXItZGVmaW5lZCBjb21tYW5kcy4KK0BlbmQgdGFibGUKKworV2hlbiB1c2VyLWRlZmluZWQgY29tbWFuZHMgYXJlIGV4ZWN1dGVkLCB0aGUKK2NvbW1hbmRzIG9mIHRoZSBkZWZpbml0aW9uIGFyZSBub3QgcHJpbnRlZC4gIEFuIGVycm9yIGluIGFueSBjb21tYW5kCitzdG9wcyBleGVjdXRpb24gb2YgdGhlIHVzZXItZGVmaW5lZCBjb21tYW5kLgorCitJZiB1c2VkIGludGVyYWN0aXZlbHksIGNvbW1hbmRzIHRoYXQgd291bGQgYXNrIGZvciBjb25maXJtYXRpb24gcHJvY2VlZAord2l0aG91dCBhc2tpbmcgd2hlbiB1c2VkIGluc2lkZSBhIHVzZXItZGVmaW5lZCBjb21tYW5kLiAgTWFueSBAdmFsdWV7R0RCTn0gCitjb21tYW5kcyB0aGF0IG5vcm1hbGx5IHByaW50IG1lc3NhZ2VzIHRvIHNheSB3aGF0IHRoZXkgYXJlIGRvaW5nIG9taXQgdGhlIAorbWVzc2FnZXMgd2hlbiB1c2VkIGluIGEgdXNlci1kZWZpbmVkIGNvbW1hbmQuCisKK0Bub2RlIEhvb2tzLCBDb21tYW5kIEZpbGVzLCBEZWZpbmUsIFNlcXVlbmNlcworQHNlY3Rpb24gVXNlci1kZWZpbmVkIGNvbW1hbmQgaG9va3MKK0BjaW5kZXggY29tbWFuZCBmaWxlcworCitZb3UgbWF5IGRlZmluZSBAZW1waHtob29rc30sIHdoaWNoIGFyZSBhIHNwZWNpYWwga2luZCBvZiB1c2VyLWRlZmluZWQKK2NvbW1hbmQuICBXaGVuZXZlciB5b3UgcnVuIHRoZSBjb21tYW5kIEBzYW1we2Zvb30sIGlmIHRoZSB1c2VyLWRlZmluZWQKK2NvbW1hbmQgQHNhbXB7aG9vay1mb299IGV4aXN0cywgaXQgaXMgZXhlY3V0ZWQgKHdpdGggbm8gYXJndW1lbnRzKQorYmVmb3JlIHRoYXQgY29tbWFuZC4KKworSW4gYWRkaXRpb24sIGEgcHNldWRvLWNvbW1hbmQsIEBzYW1we3N0b3B9IGV4aXN0cy4gIERlZmluaW5nCisoQHNhbXB7aG9vay1zdG9wfSkgbWFrZXMgdGhlIGFzc29jaWF0ZWQgY29tbWFuZHMgZXhlY3V0ZSBldmVyeSB0aW1lCitleGVjdXRpb24gc3RvcHMgaW4geW91ciBwcm9ncmFtOiBiZWZvcmUgYnJlYWtwb2ludCBjb21tYW5kcyBhcmUgcnVuLAorZGlzcGxheXMgYXJlIHByaW50ZWQsIG9yIHRoZSBzdGFjayBmcmFtZSBpcyBwcmludGVkLgorCitAaWZjbGVhciBCQVJFVEFSR0VUCitGb3IgZXhhbXBsZSwgdG8gaWdub3JlIEBjb2Rle1NJR0FMUk19IHNpZ25hbHMgd2hpbGUKK3NpbmdsZS1zdGVwcGluZywgYnV0IHRyZWF0IHRoZW0gbm9ybWFsbHkgZHVyaW5nIG5vcm1hbCBleGVjdXRpb24sCit5b3UgY291bGQgZGVmaW5lOgorCitAZXhhbXBsZQorZGVmaW5lIGhvb2stc3RvcAoraGFuZGxlIFNJR0FMUk0gbm9wYXNzCitlbmQKKworZGVmaW5lIGhvb2stcnVuCitoYW5kbGUgU0lHQUxSTSBwYXNzCitlbmQKKworZGVmaW5lIGhvb2stY29udGludWUKK2hhbmRsZSBTSUdMQVJNIHBhc3MKK2VuZAorQGVuZCBleGFtcGxlCitAZW5kIGlmY2xlYXIKKworWW91IGNhbiBkZWZpbmUgYSBob29rIGZvciBhbnkgc2luZ2xlLXdvcmQgY29tbWFuZCBpbiBAdmFsdWV7R0RCTn0sIGJ1dAorbm90IGZvciBjb21tYW5kIGFsaWFzZXM7IHlvdSBzaG91bGQgZGVmaW5lIGEgaG9vayBmb3IgdGhlIGJhc2ljIGNvbW1hbmQKK25hbWUsIGUuZy4gIEBjb2Rle2JhY2t0cmFjZX0gcmF0aGVyIHRoYW4gQGNvZGV7YnR9LgorQGMgRklYTUUhICBTbyBob3cgZG9lcyBKb2UgVXNlciBkaXNjb3ZlciB3aGV0aGVyIGEgY29tbWFuZCBpcyBhbiBhbGlhcworQGMgb3Igbm90PworSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIHlvdXIgaG9vaywgZXhlY3V0aW9uIG9mCitAdmFsdWV7R0RCTn0gY29tbWFuZHMgc3RvcHMgYW5kIEB2YWx1ZXtHREJOfSBpc3N1ZXMgYSBwcm9tcHQKKyhiZWZvcmUgdGhlIGNvbW1hbmQgdGhhdCB5b3UgYWN0dWFsbHkgdHlwZWQgaGFkIGEgY2hhbmNlIHRvIHJ1bikuCisKK0lmIHlvdSB0cnkgdG8gZGVmaW5lIGEgaG9vayB3aGljaCBkb2VzIG5vdCBtYXRjaCBhbnkga25vd24gY29tbWFuZCwgeW91CitnZXQgYSB3YXJuaW5nIGZyb20gdGhlIEBjb2Rle2RlZmluZX0gY29tbWFuZC4KKworQG5vZGUgQ29tbWFuZCBGaWxlcywgT3V0cHV0LCBIb29rcywgU2VxdWVuY2VzCitAc2VjdGlvbiBDb21tYW5kIGZpbGVzCisKK0BjaW5kZXggY29tbWFuZCBmaWxlcworQSBjb21tYW5kIGZpbGUgZm9yIEB2YWx1ZXtHREJOfSBpcyBhIGZpbGUgb2YgbGluZXMgdGhhdCBhcmUgQHZhbHVle0dEQk59IAorY29tbWFuZHMuICBDb21tZW50cyAobGluZXMgc3RhcnRpbmcgd2l0aCBAa2JkeyN9KSBtYXkgYWxzbyBiZSBpbmNsdWRlZC4gIAorQW4gZW1wdHkgbGluZSBpbiBhIGNvbW1hbmQgZmlsZSBkb2VzIG5vdGhpbmc7IGl0IGRvZXMgbm90IG1lYW4gdG8gcmVwZWF0IAordGhlIGxhc3QgY29tbWFuZCwgYXMgaXQgd291bGQgZnJvbSB0aGUgdGVybWluYWwuCisKK0BjaW5kZXggaW5pdCBmaWxlCitAY2luZGV4IEBmaWxley5nZGJpbml0fQorV2hlbiB5b3Ugc3RhcnQgQHZhbHVle0dEQk59LCBpdCBhdXRvbWF0aWNhbGx5IGV4ZWN1dGVzIGNvbW1hbmRzIGZyb20gaXRzCitAZGZue2luaXQgZmlsZXN9LiAgVGhlc2UgYXJlIGZpbGVzIG5hbWVkIEBmaWxley5nZGJpbml0fSBvbiBVbml4LCBvcgorQGZpbGV7Z2RiLmluaX0gb24gRE9TL1dpbmRvd3MuICBAdmFsdWV7R0RCTn0gcmVhZHMgdGhlIGluaXQgZmlsZSAoaWYKK2FueSkgaW4geW91ciBob21lIGRpcmVjdG9yeSwgdGhlbiBwcm9jZXNzZXMgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kCitvcGVyYW5kcywgYW5kIHRoZW4gcmVhZHMgdGhlIGluaXQgZmlsZSAoaWYgYW55KSBpbiB0aGUgY3VycmVudCB3b3JraW5nCitkaXJlY3RvcnkuICBUaGlzIGlzIHNvIHRoZSBpbml0IGZpbGUgaW4geW91ciBob21lIGRpcmVjdG9yeSBjYW4gc2V0CitvcHRpb25zIChzdWNoIGFzIEBjb2Rle3NldCBjb21wbGFpbnRzfSkgd2hpY2ggYWZmZWN0IHRoZSBwcm9jZXNzaW5nIG9mCit0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIG9wZXJhbmRzLiAgVGhlIGluaXQgZmlsZXMgYXJlIG5vdCBleGVjdXRlZAoraWYgeW91IHVzZSB0aGUgQHNhbXB7LW54fSBvcHRpb247IEBweHJlZntNb2RlIE9wdGlvbnMsICxDaG9vc2luZyBtb2Rlc30uCisKK0BpZnNldCBHRU5FUklDCitAY2luZGV4IGluaXQgZmlsZSBuYW1lCitPbiBzb21lIGNvbmZpZ3VyYXRpb25zIG9mIEB2YWx1ZXtHREJOfSwgdGhlIGluaXQgZmlsZSBpcyBrbm93biBieSBhCitkaWZmZXJlbnQgbmFtZSAodGhlc2UgYXJlIHR5cGljYWxseSBlbnZpcm9ubWVudHMgd2hlcmUgYSBzcGVjaWFsaXplZAorZm9ybSBvZiBAdmFsdWV7R0RCTn0gbWF5IG5lZWQgdG8gY29leGlzdCB3aXRoIG90aGVyIGZvcm1zLCBoZW5jZSBhCitkaWZmZXJlbnQgbmFtZSBmb3IgdGhlIHNwZWNpYWxpemVkIHZlcnNpb24ncyBpbml0IGZpbGUpLiAgVGhlc2UgYXJlIHRoZQorZW52aXJvbm1lbnRzIHdpdGggc3BlY2lhbCBpbml0IGZpbGUgbmFtZXM6CisKK0BraW5kZXggLnZ4Z2RiaW5pdAorQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK1Z4V29ya3MgKFdpbmQgUml2ZXIgU3lzdGVtcyByZWFsLXRpbWUgT1MpOiBAc2FtcHsudnhnZGJpbml0fQorCitAa2luZGV4IC5vczY4Z2RiaW5pdAorQGl0ZW0KK09TNjhLIChFbmVhIERhdGEgU3lzdGVtcyByZWFsLXRpbWUgT1MpOiBAc2FtcHsub3M2OGdkYmluaXR9CisKK0BraW5kZXggLmVzZ2RiaW5pdAorQGl0ZW0KK0VTLTE4MDAgKEVyaWNzc29uIFRlbGVjb20gQUIgTTY4MDAwIGVtdWxhdG9yKTogQHNhbXB7LmVzZ2RiaW5pdH0KK0BlbmQgaXRlbWl6ZQorQGVuZCBpZnNldAorCitZb3UgY2FuIGFsc28gcmVxdWVzdCB0aGUgZXhlY3V0aW9uIG9mIGEgY29tbWFuZCBmaWxlIHdpdGggdGhlCitAY29kZXtzb3VyY2V9IGNvbW1hbmQ6CisKK0B0YWJsZSBAY29kZQorQGtpbmRleCBzb3VyY2UKK0BpdGVtIHNvdXJjZSBAdmFye2ZpbGVuYW1lfQorRXhlY3V0ZSB0aGUgY29tbWFuZCBmaWxlIEB2YXJ7ZmlsZW5hbWV9LgorQGVuZCB0YWJsZQorCitUaGUgbGluZXMgaW4gYSBjb21tYW5kIGZpbGUgYXJlIGV4ZWN1dGVkIHNlcXVlbnRpYWxseS4gIFRoZXkgYXJlIG5vdAorcHJpbnRlZCBhcyB0aGV5IGFyZSBleGVjdXRlZC4gIEFuIGVycm9yIGluIGFueSBjb21tYW5kIHRlcm1pbmF0ZXMgZXhlY3V0aW9uCitvZiB0aGUgY29tbWFuZCBmaWxlLgorCitDb21tYW5kcyB0aGF0IHdvdWxkIGFzayBmb3IgY29uZmlybWF0aW9uIGlmIHVzZWQgaW50ZXJhY3RpdmVseSBwcm9jZWVkCit3aXRob3V0IGFza2luZyB3aGVuIHVzZWQgaW4gYSBjb21tYW5kIGZpbGUuICBNYW55IEB2YWx1ZXtHREJOfSBjb21tYW5kcyB0aGF0Citub3JtYWxseSBwcmludCBtZXNzYWdlcyB0byBzYXkgd2hhdCB0aGV5IGFyZSBkb2luZyBvbWl0IHRoZSBtZXNzYWdlcword2hlbiBjYWxsZWQgZnJvbSBjb21tYW5kIGZpbGVzLgorCitAbm9kZSBPdXRwdXQsICAsIENvbW1hbmQgRmlsZXMsIFNlcXVlbmNlcworQHNlY3Rpb24gQ29tbWFuZHMgZm9yIGNvbnRyb2xsZWQgb3V0cHV0CisKK0R1cmluZyB0aGUgZXhlY3V0aW9uIG9mIGEgY29tbWFuZCBmaWxlIG9yIGEgdXNlci1kZWZpbmVkIGNvbW1hbmQsIG5vcm1hbAorQHZhbHVle0dEQk59IG91dHB1dCBpcyBzdXBwcmVzc2VkOyB0aGUgb25seSBvdXRwdXQgdGhhdCBhcHBlYXJzIGlzIHdoYXQgaXMKK2V4cGxpY2l0bHkgcHJpbnRlZCBieSB0aGUgY29tbWFuZHMgaW4gdGhlIGRlZmluaXRpb24uICBUaGlzIHNlY3Rpb24KK2Rlc2NyaWJlcyB0aHJlZSBjb21tYW5kcyB1c2VmdWwgZm9yIGdlbmVyYXRpbmcgZXhhY3RseSB0aGUgb3V0cHV0IHlvdQord2FudC4KKworQHRhYmxlIEBjb2RlCitAa2luZGV4IGVjaG8KK0BpdGVtIGVjaG8gQHZhcnt0ZXh0fQorQGMgSSBkbyBub3QgY29uc2lkZXIgYmFja3NsYXNoLXNwYWNlIGEgc3RhbmRhcmQgQyBlc2NhcGUgc2VxdWVuY2UKK0BjIGJlY2F1c2UgaXQgaXMgbm90IGluIEFOU0kuCitQcmludCBAdmFye3RleHR9LiAgTm9ucHJpbnRpbmcgY2hhcmFjdGVycyBjYW4gYmUgaW5jbHVkZWQgaW4KK0B2YXJ7dGV4dH0gdXNpbmcgQyBlc2NhcGUgc2VxdWVuY2VzLCBzdWNoIGFzIEBzYW1we1xufSB0byBwcmludCBhCituZXdsaW5lLiAgQHN0cm9uZ3tObyBuZXdsaW5lIGlzIHByaW50ZWQgdW5sZXNzIHlvdSBzcGVjaWZ5IG9uZS59CitJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgQyBlc2NhcGUgc2VxdWVuY2VzLCBhIGJhY2tzbGFzaCBmb2xsb3dlZAorYnkgYSBzcGFjZSBzdGFuZHMgZm9yIGEgc3BhY2UuICBUaGlzIGlzIHVzZWZ1bCBmb3IgZGlzcGxheWluZyBhCitzdHJpbmcgd2l0aCBzcGFjZXMgYXQgdGhlIGJlZ2lubmluZyBvciB0aGUgZW5kLCBzaW5jZSBsZWFkaW5nIGFuZAordHJhaWxpbmcgc3BhY2VzIGFyZSBvdGhlcndpc2UgdHJpbW1lZCBmcm9tIGFsbCBhcmd1bWVudHMuICAKK1RvIHByaW50IEBzYW1we0B3eyB9YW5kIGZvbyA9QHd7IH19LCB1c2UgdGhlIGNvbW1hbmQKK0BzYW1we2VjaG8gXEB3eyB9YW5kIGZvbyA9IFxAd3sgfX0uCisKK0EgYmFja3NsYXNoIGF0IHRoZSBlbmQgb2YgQHZhcnt0ZXh0fSBjYW4gYmUgdXNlZCwgYXMgaW4gQywgdG8gY29udGludWUKK3RoZSBjb21tYW5kIG9udG8gc3Vic2VxdWVudCBsaW5lcy4gIEZvciBleGFtcGxlLAorCitAZXhhbXBsZQorZWNobyBUaGlzIGlzIHNvbWUgdGV4dFxuXAord2hpY2ggaXMgY29udGludWVkXG5cCitvbnRvIHNldmVyYWwgbGluZXMuXG4KK0BlbmQgZXhhbXBsZQorCitwcm9kdWNlcyB0aGUgc2FtZSBvdXRwdXQgYXMKKworQGV4YW1wbGUKK2VjaG8gVGhpcyBpcyBzb21lIHRleHRcbgorZWNobyB3aGljaCBpcyBjb250aW51ZWRcbgorZWNobyBvbnRvIHNldmVyYWwgbGluZXMuXG4KK0BlbmQgZXhhbXBsZQorCitAa2luZGV4IG91dHB1dAorQGl0ZW0gb3V0cHV0IEB2YXJ7ZXhwcmVzc2lvbn0KK1ByaW50IHRoZSB2YWx1ZSBvZiBAdmFye2V4cHJlc3Npb259IGFuZCBub3RoaW5nIGJ1dCB0aGF0IHZhbHVlOiBubworbmV3bGluZXMsIG5vIEBzYW1weyRAdmFye25ufSA9IH0uICBUaGUgdmFsdWUgaXMgbm90IGVudGVyZWQgaW4gdGhlCit2YWx1ZSBoaXN0b3J5IGVpdGhlci4gIEB4cmVme0V4cHJlc3Npb25zLCAsRXhwcmVzc2lvbnN9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbiAKK29uIGV4cHJlc3Npb25zLgorCitAaXRlbSBvdXRwdXQvQHZhcntmbXR9IEB2YXJ7ZXhwcmVzc2lvbn0KK1ByaW50IHRoZSB2YWx1ZSBvZiBAdmFye2V4cHJlc3Npb259IGluIGZvcm1hdCBAdmFye2ZtdH0uICBZb3UgY2FuIHVzZQordGhlIHNhbWUgZm9ybWF0cyBhcyBmb3IgQGNvZGV7cHJpbnR9LiAgQHhyZWZ7T3V0cHV0IEZvcm1hdHMsLE91dHB1dAorZm9ybWF0c30sIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitAa2luZGV4IHByaW50ZgorQGl0ZW0gcHJpbnRmIEB2YXJ7c3RyaW5nfSwgQHZhcntleHByZXNzaW9uc31AZG90c3t9CitQcmludCB0aGUgdmFsdWVzIG9mIHRoZSBAdmFye2V4cHJlc3Npb25zfSB1bmRlciB0aGUgY29udHJvbCBvZgorQHZhcntzdHJpbmd9LiAgVGhlIEB2YXJ7ZXhwcmVzc2lvbnN9IGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBtYXkgYmUKK2VpdGhlciBudW1iZXJzIG9yIHBvaW50ZXJzLiAgVGhlaXIgdmFsdWVzIGFyZSBwcmludGVkIGFzIHNwZWNpZmllZCBieQorQHZhcntzdHJpbmd9LCBleGFjdGx5IGFzIGlmIHlvdXIgcHJvZ3JhbSB3ZXJlIHRvIGV4ZWN1dGUgdGhlIEMKK3N1YnJvdXRpbmUKKworQGV4YW1wbGUKK3ByaW50ZiAoQHZhcntzdHJpbmd9LCBAdmFye2V4cHJlc3Npb25zfUBkb3Rze30pOworQGVuZCBleGFtcGxlCisKK0ZvciBleGFtcGxlLCB5b3UgY2FuIHByaW50IHR3byB2YWx1ZXMgaW4gaGV4IGxpa2UgdGhpczoKKworQHNtYWxsZXhhbXBsZQorcHJpbnRmICJmb28sIGJhci1mb28gPSAweCV4LCAweCV4XG4iLCBmb28sIGJhci1mb28KK0BlbmQgc21hbGxleGFtcGxlCisKK1RoZSBvbmx5IGJhY2tzbGFzaC1lc2NhcGUgc2VxdWVuY2VzIHRoYXQgeW91IGNhbiB1c2UgaW4gdGhlIGZvcm1hdAorc3RyaW5nIGFyZSB0aGUgc2ltcGxlIG9uZXMgdGhhdCBjb25zaXN0IG9mIGJhY2tzbGFzaCBmb2xsb3dlZCBieSBhCitsZXR0ZXIuCitAZW5kIHRhYmxlCisKK0BpZmNsZWFyIERPU0hPU1QKK0Bub2RlIEVtYWNzLCBHREIgQnVncywgU2VxdWVuY2VzLCBUb3AKK0BjaGFwdGVyIFVzaW5nIEB2YWx1ZXtHREJOfSB1bmRlciBAc2N7Z251fSBFbWFjcworCitAY2luZGV4IEVtYWNzCitAY2luZGV4IEBzY3tnbnV9IEVtYWNzCitBIHNwZWNpYWwgaW50ZXJmYWNlIGFsbG93cyB5b3UgdG8gdXNlIEBzY3tnbnV9IEVtYWNzIHRvIHZpZXcgKGFuZAorZWRpdCkgdGhlIHNvdXJjZSBmaWxlcyBmb3IgdGhlIHByb2dyYW0geW91IGFyZSBkZWJ1Z2dpbmcgd2l0aAorQHZhbHVle0dEQk59LgorCitUbyB1c2UgdGhpcyBpbnRlcmZhY2UsIHVzZSB0aGUgY29tbWFuZCBAa2Jke00teCBnZGJ9IGluIEVtYWNzLiAgR2l2ZSB0aGUKK2V4ZWN1dGFibGUgZmlsZSB5b3Ugd2FudCB0byBkZWJ1ZyBhcyBhbiBhcmd1bWVudC4gIFRoaXMgY29tbWFuZCBzdGFydHMKK0B2YWx1ZXtHREJOfSBhcyBhIHN1YnByb2Nlc3Mgb2YgRW1hY3MsIHdpdGggaW5wdXQgYW5kIG91dHB1dCB0aHJvdWdoIGEgbmV3bHkKK2NyZWF0ZWQgRW1hY3MgYnVmZmVyLgorQGlmc2V0IEhQUEEKKyhEbyBub3QgdXNlIHRoZSBAY29kZXstdHVpfSBvcHRpb24gdG8gcnVuIEB2YWx1ZXtHREJOfSBmcm9tIEVtYWNzLikKK0BlbmQgaWZzZXQKKworVXNpbmcgQHZhbHVle0dEQk59IHVuZGVyIEVtYWNzIGlzIGp1c3QgbGlrZSB1c2luZyBAdmFsdWV7R0RCTn0gbm9ybWFsbHkgZXhjZXB0IGZvciB0d28KK3RoaW5nczoKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK0FsbCBgYHRlcm1pbmFsJycgaW5wdXQgYW5kIG91dHB1dCBnb2VzIHRocm91Z2ggdGhlIEVtYWNzIGJ1ZmZlci4KK0BlbmQgaXRlbWl6ZQorCitUaGlzIGFwcGxpZXMgYm90aCB0byBAdmFsdWV7R0RCTn0gY29tbWFuZHMgYW5kIHRoZWlyIG91dHB1dCwgYW5kIHRvIHRoZSBpbnB1dAorYW5kIG91dHB1dCBkb25lIGJ5IHRoZSBwcm9ncmFtIHlvdSBhcmUgZGVidWdnaW5nLgorCitUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIGl0IG1lYW5zIHRoYXQgeW91IGNhbiBjb3B5IHRoZSB0ZXh0IG9mIHByZXZpb3VzCitjb21tYW5kcyBhbmQgaW5wdXQgdGhlbSBhZ2FpbjsgeW91IGNhbiBldmVuIHVzZSBwYXJ0cyBvZiB0aGUgb3V0cHV0CitpbiB0aGlzIHdheS4KKworQWxsIHRoZSBmYWNpbGl0aWVzIG9mIEVtYWNzJyBTaGVsbCBtb2RlIGFyZSBhdmFpbGFibGUgZm9yIGludGVyYWN0aW5nCit3aXRoIHlvdXIgcHJvZ3JhbS4gIEluIHBhcnRpY3VsYXIsIHlvdSBjYW4gc2VuZCBzaWduYWxzIHRoZSB1c3VhbAord2F5LS0tZm9yIGV4YW1wbGUsIEBrYmR7Qy1jIEMtY30gZm9yIGFuIGludGVycnVwdCwgQGtiZHtDLWMgQy16fSBmb3IgYQorc3RvcC4KKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK0B2YWx1ZXtHREJOfSBkaXNwbGF5cyBzb3VyY2UgY29kZSB0aHJvdWdoIEVtYWNzLgorQGVuZCBpdGVtaXplCisKK0VhY2ggdGltZSBAdmFsdWV7R0RCTn0gZGlzcGxheXMgYSBzdGFjayBmcmFtZSwgRW1hY3MgYXV0b21hdGljYWxseSBmaW5kcyB0aGUKK3NvdXJjZSBmaWxlIGZvciB0aGF0IGZyYW1lIGFuZCBwdXRzIGFuIGFycm93IChAc2FtcHs9Pn0pIGF0IHRoZQorbGVmdCBtYXJnaW4gb2YgdGhlIGN1cnJlbnQgbGluZS4gIEVtYWNzIHVzZXMgYSBzZXBhcmF0ZSBidWZmZXIgZm9yCitzb3VyY2UgZGlzcGxheSwgYW5kIHNwbGl0cyB0aGUgc2NyZWVuIHRvIHNob3cgYm90aCB5b3VyIEB2YWx1ZXtHREJOfSBzZXNzaW9uCithbmQgdGhlIHNvdXJjZS4KKworRXhwbGljaXQgQHZhbHVle0dEQk59IEBjb2Rle2xpc3R9IG9yIHNlYXJjaCBjb21tYW5kcyBzdGlsbCBwcm9kdWNlIG91dHB1dCBhcwordXN1YWwsIGJ1dCB5b3UgcHJvYmFibHkgaGF2ZSBubyByZWFzb24gdG8gdXNlIHRoZW0gZnJvbSBFbWFjcy4KKworQHF1b3RhdGlvbgorQGVtcGh7V2FybmluZzp9IElmIHRoZSBkaXJlY3Rvcnkgd2hlcmUgeW91ciBwcm9ncmFtIHJlc2lkZXMgaXMgbm90IHlvdXIKK2N1cnJlbnQgZGlyZWN0b3J5LCBpdCBjYW4gYmUgZWFzeSB0byBjb25mdXNlIEVtYWNzIGFib3V0IHRoZSBsb2NhdGlvbiBvZgordGhlIHNvdXJjZSBmaWxlcywgaW4gd2hpY2ggY2FzZSB0aGUgYXV4aWxpYXJ5IGRpc3BsYXkgYnVmZmVyIGRvZXMgbm90CithcHBlYXIgdG8gc2hvdyB5b3VyIHNvdXJjZS4gIEB2YWx1ZXtHREJOfSBjYW4gZmluZCBwcm9ncmFtcyBieSBzZWFyY2hpbmcgeW91cgorZW52aXJvbm1lbnQncyBAY29kZXtQQVRIfSB2YXJpYWJsZSwgc28gdGhlIEB2YWx1ZXtHREJOfSBpbnB1dCBhbmQgb3V0cHV0CitzZXNzaW9uIHByb2NlZWRzIG5vcm1hbGx5OyBidXQgRW1hY3MgZG9lcyBub3QgZ2V0IGVub3VnaCBpbmZvcm1hdGlvbgorYmFjayBmcm9tIEB2YWx1ZXtHREJOfSB0byBsb2NhdGUgdGhlIHNvdXJjZSBmaWxlcyBpbiB0aGlzIHNpdHVhdGlvbi4gIFRvCithdm9pZCB0aGlzIHByb2JsZW0sIGVpdGhlciBzdGFydCBAdmFsdWV7R0RCTn0gbW9kZSBmcm9tIHRoZSBkaXJlY3Rvcnkgd2hlcmUKK3lvdXIgcHJvZ3JhbSByZXNpZGVzLCBvciBzcGVjaWZ5IGFuIGFic29sdXRlIGZpbGUgbmFtZSB3aGVuIHByb21wdGVkIGZvciB0aGUKK0BrYmR7TS14IGdkYn0gYXJndW1lbnQuCisKK0Egc2ltaWxhciBjb25mdXNpb24gY2FuIHJlc3VsdCBpZiB5b3UgdXNlIHRoZSBAdmFsdWV7R0RCTn0gQGNvZGV7ZmlsZX0gY29tbWFuZCB0bworc3dpdGNoIHRvIGRlYnVnZ2luZyBhIHByb2dyYW0gaW4gc29tZSBvdGhlciBsb2NhdGlvbiwgZnJvbSBhbiBleGlzdGluZworQHZhbHVle0dEQk59IGJ1ZmZlciBpbiBFbWFjcy4KK0BlbmQgcXVvdGF0aW9uCisKK0J5IGRlZmF1bHQsIEBrYmR7TS14IGdkYn0gY2FsbHMgdGhlIHByb2dyYW0gY2FsbGVkIEBmaWxle2dkYn0uICBJZgoreW91IG5lZWQgdG8gY2FsbCBAdmFsdWV7R0RCTn0gYnkgYSBkaWZmZXJlbnQgbmFtZSAoZm9yIGV4YW1wbGUsIGlmIHlvdSBrZWVwCitzZXZlcmFsIGNvbmZpZ3VyYXRpb25zIGFyb3VuZCwgd2l0aCBkaWZmZXJlbnQgbmFtZXMpIHlvdSBjYW4gc2V0IHRoZQorRW1hY3MgdmFyaWFibGUgQGNvZGV7Z2RiLWNvbW1hbmQtbmFtZX07IGZvciBleGFtcGxlLAorCitAZXhhbXBsZQorKHNldHEgZ2RiLWNvbW1hbmQtbmFtZSAibXlnZGIiKQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorKHByZWNlZGVkIGJ5IEBrYmR7RVNDIEVTQ30sIG9yIHR5cGVkIGluIHRoZSBAY29kZXsqc2NyYXRjaCp9IGJ1ZmZlciwgb3IKK2luIHlvdXIgQGZpbGV7LmVtYWNzfSBmaWxlKSBtYWtlcyBFbWFjcyBjYWxsIHRoZSBwcm9ncmFtIG5hbWVkCitgYEBjb2Rle215Z2RifScnIGluc3RlYWQuCisKK0luIHRoZSBAdmFsdWV7R0RCTn0gSS9PIGJ1ZmZlciwgeW91IGNhbiB1c2UgdGhlc2Ugc3BlY2lhbCBFbWFjcyBjb21tYW5kcyBpbgorYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIFNoZWxsIG1vZGUgY29tbWFuZHM6CisKK0B0YWJsZSBAa2JkCitAaXRlbSBDLWggbQorRGVzY3JpYmUgdGhlIGZlYXR1cmVzIG9mIEVtYWNzJyBAdmFsdWV7R0RCTn0gTW9kZS4KKworQGl0ZW0gTS1zCitFeGVjdXRlIHRvIGFub3RoZXIgc291cmNlIGxpbmUsIGxpa2UgdGhlIEB2YWx1ZXtHREJOfSBAY29kZXtzdGVwfSBjb21tYW5kOyBhbHNvCit1cGRhdGUgdGhlIGRpc3BsYXkgd2luZG93IHRvIHNob3cgdGhlIGN1cnJlbnQgZmlsZSBhbmQgbG9jYXRpb24uCisKK0BpdGVtIE0tbgorRXhlY3V0ZSB0byBuZXh0IHNvdXJjZSBsaW5lIGluIHRoaXMgZnVuY3Rpb24sIHNraXBwaW5nIGFsbCBmdW5jdGlvbgorY2FsbHMsIGxpa2UgdGhlIEB2YWx1ZXtHREJOfSBAY29kZXtuZXh0fSBjb21tYW5kLiAgVGhlbiB1cGRhdGUgdGhlIGRpc3BsYXkgd2luZG93Cit0byBzaG93IHRoZSBjdXJyZW50IGZpbGUgYW5kIGxvY2F0aW9uLgorCitAaXRlbSBNLWkKK0V4ZWN1dGUgb25lIGluc3RydWN0aW9uLCBsaWtlIHRoZSBAdmFsdWV7R0RCTn0gQGNvZGV7c3RlcGl9IGNvbW1hbmQ7IHVwZGF0ZQorZGlzcGxheSB3aW5kb3cgYWNjb3JkaW5nbHkuCisKK0BpdGVtIE0teCBnZGItbmV4dGkKK0V4ZWN1dGUgdG8gbmV4dCBpbnN0cnVjdGlvbiwgdXNpbmcgdGhlIEB2YWx1ZXtHREJOfSBAY29kZXtuZXh0aX0gY29tbWFuZDsgdXBkYXRlCitkaXNwbGF5IHdpbmRvdyBhY2NvcmRpbmdseS4KKworQGl0ZW0gQy1jIEMtZgorRXhlY3V0ZSB1bnRpbCBleGl0IGZyb20gdGhlIHNlbGVjdGVkIHN0YWNrIGZyYW1lLCBsaWtlIHRoZSBAdmFsdWV7R0RCTn0KK0Bjb2Rle2ZpbmlzaH0gY29tbWFuZC4KKworQGl0ZW0gTS1jCitDb250aW51ZSBleGVjdXRpb24gb2YgeW91ciBwcm9ncmFtLCBsaWtlIHRoZSBAdmFsdWV7R0RCTn0gQGNvZGV7Y29udGludWV9Citjb21tYW5kLgorCitAZW1waHtXYXJuaW5nOn0gSW4gRW1hY3MgdjE5LCB0aGlzIGNvbW1hbmQgaXMgQGtiZHtDLWMgQy1wfS4KKworQGl0ZW0gTS11CitHbyB1cCB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpbmRpY2F0ZWQgYnkgdGhlIG51bWVyaWMgYXJndW1lbnQKKyhAcHhyZWZ7QXJndW1lbnRzLCAsIE51bWVyaWMgQXJndW1lbnRzLCBFbWFjcywgVGhlIEBzY3tnbnV9IEVtYWNzIE1hbnVhbH0pLAorbGlrZSB0aGUgQHZhbHVle0dEQk59IEBjb2Rle3VwfSBjb21tYW5kLgorCitAZW1waHtXYXJuaW5nOn0gSW4gRW1hY3MgdjE5LCB0aGlzIGNvbW1hbmQgaXMgQGtiZHtDLWMgQy11fS4KKworQGl0ZW0gTS1kCitHbyBkb3duIHRoZSBudW1iZXIgb2YgZnJhbWVzIGluZGljYXRlZCBieSB0aGUgbnVtZXJpYyBhcmd1bWVudCwgbGlrZSB0aGUKK0B2YWx1ZXtHREJOfSBAY29kZXtkb3dufSBjb21tYW5kLgorCitAZW1waHtXYXJuaW5nOn0gSW4gRW1hY3MgdjE5LCB0aGlzIGNvbW1hbmQgaXMgQGtiZHtDLWMgQy1kfS4KKworQGl0ZW0gQy14ICYKK1JlYWQgdGhlIG51bWJlciB3aGVyZSB0aGUgY3Vyc29yIGlzIHBvc2l0aW9uZWQsIGFuZCBpbnNlcnQgaXQgYXQgdGhlIGVuZAorb2YgdGhlIEB2YWx1ZXtHREJOfSBJL08gYnVmZmVyLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3aXNoIHRvIGRpc2Fzc2VtYmxlIGNvZGUKK2Fyb3VuZCBhbiBhZGRyZXNzIHRoYXQgd2FzIGRpc3BsYXllZCBlYXJsaWVyLCB0eXBlIEBrYmR7ZGlzYXNzZW1ibGV9OwordGhlbiBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGFkZHJlc3MgZGlzcGxheSwgYW5kIHBpY2sgdXAgdGhlCithcmd1bWVudCBmb3IgQGNvZGV7ZGlzYXNzZW1ibGV9IGJ5IHR5cGluZyBAa2Jke0MteCAmfS4KKworWW91IGNhbiBjdXN0b21pemUgdGhpcyBmdXJ0aGVyIGJ5IGRlZmluaW5nIGVsZW1lbnRzIG9mIHRoZSBsaXN0CitAY29kZXtnZGItcHJpbnQtY29tbWFuZH07IG9uY2UgaXQgaXMgZGVmaW5lZCwgeW91IGNhbiBmb3JtYXQgb3IKK290aGVyd2lzZSBwcm9jZXNzIG51bWJlcnMgcGlja2VkIHVwIGJ5IEBrYmR7Qy14ICZ9IGJlZm9yZSB0aGV5IGFyZQoraW5zZXJ0ZWQuICBBIG51bWVyaWMgYXJndW1lbnQgdG8gQGtiZHtDLXggJn0gaW5kaWNhdGVzIHRoYXQgeW91Cit3aXNoIHNwZWNpYWwgZm9ybWF0dGluZywgYW5kIGFsc28gYWN0cyBhcyBhbiBpbmRleCB0byBwaWNrIGFuIGVsZW1lbnQgb2YgdGhlCitsaXN0LiAgSWYgdGhlIGxpc3QgZWxlbWVudCBpcyBhIHN0cmluZywgdGhlIG51bWJlciB0byBiZSBpbnNlcnRlZCBpcworZm9ybWF0dGVkIHVzaW5nIHRoZSBFbWFjcyBmdW5jdGlvbiBAY29kZXtmb3JtYXR9OyBvdGhlcndpc2UgdGhlIG51bWJlcgoraXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBjb3JyZXNwb25kaW5nIGxpc3QgZWxlbWVudC4KK0BlbmQgdGFibGUKKworSW4gYW55IHNvdXJjZSBmaWxlLCB0aGUgRW1hY3MgY29tbWFuZCBAa2Jke0MteCBTUEN9IChAY29kZXtnZGItYnJlYWt9KQordGVsbHMgQHZhbHVle0dEQk59IHRvIHNldCBhIGJyZWFrcG9pbnQgb24gdGhlIHNvdXJjZSBsaW5lIHBvaW50IGlzIG9uLgorCitJZiB5b3UgYWNjaWRlbnRhbGx5IGRlbGV0ZSB0aGUgc291cmNlLWRpc3BsYXkgYnVmZmVyLCBhbiBlYXN5IHdheSB0byBnZXQKK2l0IGJhY2sgaXMgdG8gdHlwZSB0aGUgY29tbWFuZCBAY29kZXtmfSBpbiB0aGUgQHZhbHVle0dEQk59IGJ1ZmZlciwgdG8KK3JlcXVlc3QgYSBmcmFtZSBkaXNwbGF5OyB3aGVuIHlvdSBydW4gdW5kZXIgRW1hY3MsIHRoaXMgcmVjcmVhdGVzCit0aGUgc291cmNlIGJ1ZmZlciBpZiBuZWNlc3NhcnkgdG8gc2hvdyB5b3UgdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQKK2ZyYW1lLgorCitUaGUgc291cmNlIGZpbGVzIGRpc3BsYXllZCBpbiBFbWFjcyBhcmUgaW4gb3JkaW5hcnkgRW1hY3MgYnVmZmVycword2hpY2ggYXJlIHZpc2l0aW5nIHRoZSBzb3VyY2UgZmlsZXMgaW4gdGhlIHVzdWFsIHdheS4gIFlvdSBjYW4gZWRpdAordGhlIGZpbGVzIHdpdGggdGhlc2UgYnVmZmVycyBpZiB5b3Ugd2lzaDsgYnV0IGtlZXAgaW4gbWluZCB0aGF0IEB2YWx1ZXtHREJOfQorY29tbXVuaWNhdGVzIHdpdGggRW1hY3MgaW4gdGVybXMgb2YgbGluZSBudW1iZXJzLiAgSWYgeW91IGFkZCBvcgorZGVsZXRlIGxpbmVzIGZyb20gdGhlIHRleHQsIHRoZSBsaW5lIG51bWJlcnMgdGhhdCBAdmFsdWV7R0RCTn0ga25vd3MgY2Vhc2UKK3RvIGNvcnJlc3BvbmQgcHJvcGVybHkgd2l0aCB0aGUgY29kZS4KKworQGMgVGhlIGZvbGxvd2luZyBkcm9wcGVkIGJlY2F1c2UgRXBvY2ggaXMgbm9uc3RhbmRhcmQuICBSZWFjdGl2YXRlCitAYyBpZi93aGVuIHYxOSBkb2VzIHNvbWV0aGluZyBzaW1pbGFyLiAtLS1kb2NAY3lnbnVzLmNvbSAxOWRlYzE5OTAKK0BpZ25vcmUKK0BraW5kZXggRW1hY3MgRXBvY2ggZW52aXJvbm1lbnQKK0BraW5kZXggRXBvY2gKK0BraW5kZXggaW5zcGVjdAorCitWZXJzaW9uIDE4IG9mIEBzY3tnbnV9IEVtYWNzIGhhcyBhIGJ1aWx0LWluIHdpbmRvdyBzeXN0ZW0gCitjYWxsZWQgdGhlIEBjb2Rle2Vwb2NofQorZW52aXJvbm1lbnQuICBVc2VycyBvZiB0aGlzIGVudmlyb25tZW50IGNhbiB1c2UgYSBuZXcgY29tbWFuZCwKK0Bjb2Rle2luc3BlY3R9IHdoaWNoIHBlcmZvcm1zIGlkZW50aWNhbGx5IHRvIEBjb2Rle3ByaW50fSBleGNlcHQgdGhhdAorZWFjaCB2YWx1ZSBpcyBwcmludGVkIGluIGl0cyBvd24gd2luZG93LgorQGVuZCBpZ25vcmUKK0BlbmQgaWZjbGVhcgorCitAbm9kZSBHREIgQnVncworQGMgbGlua3Mgd2hhY2tlZCB0byBwYWNpZnkgbWFrZWluZm8KK0BjICwgQ29tbWFuZCBMaW5lIEVkaXRpbmcsIEVtYWNzLCBUb3AKK0BjaGFwdGVyIFJlcG9ydGluZyBCdWdzIGluIEB2YWx1ZXtHREJOfQorQGNpbmRleCBidWdzIGluIEB2YWx1ZXtHREJOfQorQGNpbmRleCByZXBvcnRpbmcgYnVncyBpbiBAdmFsdWV7R0RCTn0KKworWW91ciBidWcgcmVwb3J0cyBwbGF5IGFuIGVzc2VudGlhbCByb2xlIGluIG1ha2luZyBAdmFsdWV7R0RCTn0gcmVsaWFibGUuCisKK1JlcG9ydGluZyBhIGJ1ZyBtYXkgaGVscCB5b3UgYnkgYnJpbmdpbmcgYSBzb2x1dGlvbiB0byB5b3VyIHByb2JsZW0sIG9yIGl0CittYXkgbm90LiAgQnV0IGluIGFueSBjYXNlIHRoZSBwcmluY2lwYWwgZnVuY3Rpb24gb2YgYSBidWcgcmVwb3J0IGlzIHRvIGhlbHAKK3RoZSBlbnRpcmUgY29tbXVuaXR5IGJ5IG1ha2luZyB0aGUgbmV4dCB2ZXJzaW9uIG9mIEB2YWx1ZXtHREJOfSB3b3JrIGJldHRlci4gIEJ1ZworcmVwb3J0cyBhcmUgeW91ciBjb250cmlidXRpb24gdG8gdGhlIG1haW50ZW5hbmNlIG9mIEB2YWx1ZXtHREJOfS4KKworSW4gb3JkZXIgZm9yIGEgYnVnIHJlcG9ydCB0byBzZXJ2ZSBpdHMgcHVycG9zZSwgeW91IG11c3QgaW5jbHVkZSB0aGUKK2luZm9ybWF0aW9uIHRoYXQgZW5hYmxlcyB1cyB0byBmaXggdGhlIGJ1Zy4KKworQG1lbnUKKyogQnVnIENyaXRlcmlhOjogICAgICAgICAgICAgICAgSGF2ZSB5b3UgZm91bmQgYSBidWc/CisqIEJ1ZyBSZXBvcnRpbmc6OiAgICAgICAgICAgICAgIEhvdyB0byByZXBvcnQgYnVncworQGVuZCBtZW51CisKK0Bub2RlIEJ1ZyBDcml0ZXJpYSwgQnVnIFJlcG9ydGluZywgR0RCIEJ1Z3MsIEdEQiBCdWdzCitAc2VjdGlvbiBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KK0BjaW5kZXggYnVnIGNyaXRlcmlhCisKK0lmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB5b3UgaGF2ZSBmb3VuZCBhIGJ1ZywgaGVyZSBhcmUgc29tZSBndWlkZWxpbmVzOgorCitAaXRlbWl6ZSBAYnVsbGV0CitAY2luZGV4IGZhdGFsIHNpZ25hbAorQGNpbmRleCBkZWJ1Z2dlciBjcmFzaAorQGNpbmRleCBjcmFzaCBvZiBkZWJ1Z2dlcgorQGl0ZW0KK0lmIHRoZSBkZWJ1Z2dlciBnZXRzIGEgZmF0YWwgc2lnbmFsLCBmb3IgYW55IGlucHV0IHdoYXRldmVyLCB0aGF0IGlzIGEKK0B2YWx1ZXtHREJOfSBidWcuICBSZWxpYWJsZSBkZWJ1Z2dlcnMgbmV2ZXIgY3Jhc2guCisKK0BjaW5kZXggZXJyb3Igb24gdmFsaWQgaW5wdXQKK0BpdGVtCitJZiBAdmFsdWV7R0RCTn0gcHJvZHVjZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdmFsaWQgaW5wdXQsIHRoYXQgaXMgYQorYnVnLiAgKE5vdGUgdGhhdCBpZiB5b3UncmUgY3Jvc3MgZGVidWdnaW5nLCB0aGUgcHJvYmxlbSBtYXkgYWxzbyBiZQorc29tZXdoZXJlIGluIHRoZSBjb25uZWN0aW9uIHRvIHRoZSB0YXJnZXQuKQorCitAY2luZGV4IGludmFsaWQgaW5wdXQKK0BpdGVtCitJZiBAdmFsdWV7R0RCTn0gZG9lcyBub3QgcHJvZHVjZSBhbiBlcnJvciBtZXNzYWdlIGZvciBpbnZhbGlkIGlucHV0LAordGhhdCBpcyBhIGJ1Zy4gIEhvd2V2ZXIsIHlvdSBzaG91bGQgbm90ZSB0aGF0IHlvdXIgaWRlYSBvZgorYGBpbnZhbGlkIGlucHV0JycgbWlnaHQgYmUgb3VyIGlkZWEgb2YgYGBhbiBleHRlbnNpb24nJyBvciBgYHN1cHBvcnQKK2ZvciB0cmFkaXRpb25hbCBwcmFjdGljZScnLgorCitAaXRlbQorSWYgeW91IGFyZSBhbiBleHBlcmllbmNlZCB1c2VyIG9mIGRlYnVnZ2luZyB0b29scywgeW91ciBzdWdnZXN0aW9ucworZm9yIGltcHJvdmVtZW50IG9mIEB2YWx1ZXtHREJOfSBhcmUgd2VsY29tZSBpbiBhbnkgY2FzZS4KK0BlbmQgaXRlbWl6ZQorCitAbm9kZSBCdWcgUmVwb3J0aW5nLCAgLCBCdWcgQ3JpdGVyaWEsIEdEQiBCdWdzCitAc2VjdGlvbiBIb3cgdG8gcmVwb3J0IGJ1Z3MKK0BjaW5kZXggYnVnIHJlcG9ydHMKK0BjaW5kZXggQHZhbHVle0dEQk59IGJ1Z3MsIHJlcG9ydGluZworCitAaWZjbGVhciBIUFBBCitBIG51bWJlciBvZiBjb21wYW5pZXMgYW5kIGluZGl2aWR1YWxzIG9mZmVyIHN1cHBvcnQgZm9yIEBzY3tnbnV9IHByb2R1Y3RzLgorSWYgeW91IG9idGFpbmVkIEB2YWx1ZXtHREJOfSBmcm9tIGEgc3VwcG9ydCBvcmdhbml6YXRpb24sIHdlIHJlY29tbWVuZCB5b3UKK2NvbnRhY3QgdGhhdCBvcmdhbml6YXRpb24gZmlyc3QuCisKK1lvdSBjYW4gZmluZCBjb250YWN0IGluZm9ybWF0aW9uIGZvciBtYW55IHN1cHBvcnQgY29tcGFuaWVzIGFuZAoraW5kaXZpZHVhbHMgaW4gdGhlIGZpbGUgQGZpbGV7ZXRjL1NFUlZJQ0V9IGluIHRoZSBAc2N7Z251fSBFbWFjcworZGlzdHJpYnV0aW9uLgorQGMgc2hvdWxkIGFkZCBhIHdlYiBwYWdlIHJlZi4uLgorCitJbiBhbnkgZXZlbnQsIHdlIGFsc28gcmVjb21tZW5kIHRoYXQgeW91IHNlbmQgYnVnIHJlcG9ydHMgZm9yCitAdmFsdWV7R0RCTn0gdG8gdGhpcyBhZGRyZXNzZXM6CisKK0BleGFtcGxlCitidWctZ2RiQEBwcmVwLmFpLm1pdC5lZHUKK0BlbmQgZXhhbXBsZQorCitAc3Ryb25ne0RvIG5vdCBzZW5kIGJ1ZyByZXBvcnRzIHRvIEBzYW1we2luZm8tZ2RifSwgb3IgdG8KK0BzYW1we2hlbHAtZ2RifSwgb3IgdG8gYW55IG5ld3Nncm91cHMufSBNb3N0IHVzZXJzIG9mIEB2YWx1ZXtHREJOfSBkbworbm90IHdhbnQgdG8gcmVjZWl2ZSBidWcgcmVwb3J0cy4gIFRob3NlIHRoYXQgZG8gaGF2ZSBhcnJhbmdlZCB0byByZWNlaXZlCitAc2FtcHtidWctZ2RifS4KKworVGhlIG1haWxpbmcgbGlzdCBAc2FtcHtidWctZ2RifSBoYXMgYSBuZXdzZ3JvdXAgQHNhbXB7Z251LmdkYi5idWd9IHdoaWNoCitzZXJ2ZXMgYXMgYSByZXBlYXRlci4gIFRoZSBtYWlsaW5nIGxpc3QgYW5kIHRoZSBuZXdzZ3JvdXAgY2FycnkgZXhhY3RseQordGhlIHNhbWUgbWVzc2FnZXMuICBPZnRlbiBwZW9wbGUgdGhpbmsgb2YgcG9zdGluZyBidWcgcmVwb3J0cyB0byB0aGUKK25ld3Nncm91cCBpbnN0ZWFkIG9mIG1haWxpbmcgdGhlbS4gIFRoaXMgYXBwZWFycyB0byB3b3JrLCBidXQgaXQgaGFzIG9uZQorcHJvYmxlbSB3aGljaCBjYW4gYmUgY3J1Y2lhbDogYSBuZXdzZ3JvdXAgcG9zdGluZyBvZnRlbiBsYWNrcyBhIG1haWwKK3BhdGggYmFjayB0byB0aGUgc2VuZGVyLiAgVGh1cywgaWYgd2UgbmVlZCB0byBhc2sgZm9yIG1vcmUgaW5mb3JtYXRpb24sCit3ZSBtYXkgYmUgdW5hYmxlIHRvIHJlYWNoIHlvdS4gIEZvciB0aGlzIHJlYXNvbiwgaXQgaXMgYmV0dGVyIHRvIHNlbmQKK2J1ZyByZXBvcnRzIHRvIHRoZSBtYWlsaW5nIGxpc3QuCisKK0FzIGEgbGFzdCByZXNvcnQsIHNlbmQgYnVnIHJlcG9ydHMgb24gcGFwZXIgdG86CisKK0BleGFtcGxlCitAc2N7Z251fSBEZWJ1Z2dlciBCdWdzCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gSW5jLgorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwCitCb3N0b24sIE1BIDAyMTExLTEzMDcKK1VTQQorQGVuZCBleGFtcGxlCitAZW5kIGlmY2xlYXIKKworQGlmc2V0IEhQUEEKK0lmIHlvdSBvYnRhaW5lZCBIUCBHREIgYXMgcGFydCBvZiB5b3VyIEhQIEFOU0kgQyBvciBIUCBBTlNJIEMrKyBjb21waWxlcgora2l0LCByZXBvcnQgcHJvYmxlbXMgdG8geW91ciBIUCBTdXBwb3J0IFJlcHJlc2VudGF0aXZlLgorCitJZiB5b3Ugb2J0YWluZWQgSFAgR0RCIGZyb20gdGhlIEhld2xldHQtUGFja2FyZCBXZWIgc2l0ZSwgcmVwb3J0Citwcm9ibGVtcyBieSBlbGVjdHJvbmljIG1haWwgdG8gQGNvZGV7d2RiLXd3d0BAY2guaHAuY29tfS4KK0BlbmQgaWZzZXQKKworVGhlIGZ1bmRhbWVudGFsIHByaW5jaXBsZSBvZiByZXBvcnRpbmcgYnVncyB1c2VmdWxseSBpcyB0aGlzOgorQHN0cm9uZ3tyZXBvcnQgYWxsIHRoZSBmYWN0c30uICBJZiB5b3UgYXJlIG5vdCBzdXJlIHdoZXRoZXIgdG8gc3RhdGUgYQorZmFjdCBvciBsZWF2ZSBpdCBvdXQsIHN0YXRlIGl0IQorCitPZnRlbiBwZW9wbGUgb21pdCBmYWN0cyBiZWNhdXNlIHRoZXkgdGhpbmsgdGhleSBrbm93IHdoYXQgY2F1c2VzIHRoZQorcHJvYmxlbSBhbmQgYXNzdW1lIHRoYXQgc29tZSBkZXRhaWxzIGRvIG5vdCBtYXR0ZXIuICBUaHVzLCB5b3UgbWlnaHQKK2Fzc3VtZSB0aGF0IHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB5b3UgdXNlIGluIGFuIGV4YW1wbGUgZG9lcyBub3QgbWF0dGVyLgorV2VsbCwgcHJvYmFibHkgaXQgZG9lcyBub3QsIGJ1dCBvbmUgY2Fubm90IGJlIHN1cmUuICBQZXJoYXBzIHRoZSBidWcgaXMgYQorc3RyYXkgbWVtb3J5IHJlZmVyZW5jZSB3aGljaCBoYXBwZW5zIHRvIGZldGNoIGZyb20gdGhlIGxvY2F0aW9uIHdoZXJlIHRoYXQKK25hbWUgaXMgc3RvcmVkIGluIG1lbW9yeTsgcGVyaGFwcywgaWYgdGhlIG5hbWUgd2VyZSBkaWZmZXJlbnQsIHRoZSBjb250ZW50cworb2YgdGhhdCBsb2NhdGlvbiB3b3VsZCBmb29sIHRoZSBkZWJ1Z2dlciBpbnRvIGRvaW5nIHRoZSByaWdodCB0aGluZyBkZXNwaXRlCit0aGUgYnVnLiAgUGxheSBpdCBzYWZlIGFuZCBnaXZlIGEgc3BlY2lmaWMsIGNvbXBsZXRlIGV4YW1wbGUuICBUaGF0IGlzIHRoZQorZWFzaWVzdCB0aGluZyBmb3IgeW91IHRvIGRvLCBhbmQgdGhlIG1vc3QgaGVscGZ1bC4KKworS2VlcCBpbiBtaW5kIHRoYXQgdGhlIHB1cnBvc2Ugb2YgYSBidWcgcmVwb3J0IGlzIHRvIGVuYWJsZSB1cyB0byBmaXggdGhlCitidWcuICBJdCBtYXkgYmUgdGhhdCB0aGUgYnVnIGhhcyBiZWVuIHJlcG9ydGVkIHByZXZpb3VzbHksIGJ1dCBuZWl0aGVyCit5b3Ugbm9yIHdlIGNhbiBrbm93IHRoYXQgdW5sZXNzIHlvdXIgYnVnIHJlcG9ydCBpcyBjb21wbGV0ZSBhbmQKK3NlbGYtY29udGFpbmVkLgorCitTb21ldGltZXMgcGVvcGxlIGdpdmUgYSBmZXcgc2tldGNoeSBmYWN0cyBhbmQgYXNrLCBgYERvZXMgdGhpcyByaW5nIGEKK2JlbGw/JycgIFRob3NlIGJ1ZyByZXBvcnRzIGFyZSB1c2VsZXNzLCBhbmQgd2UgdXJnZSBldmVyeW9uZSB0bworQGVtcGh7cmVmdXNlIHRvIHJlc3BvbmQgdG8gdGhlbX0gZXhjZXB0IHRvIGNoaWRlIHRoZSBzZW5kZXIgdG8gcmVwb3J0CitidWdzIHByb3Blcmx5LgorCitUbyBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcsIHlvdSBzaG91bGQgaW5jbHVkZSBhbGwgdGhlc2UgdGhpbmdzOgorCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorVGhlIHZlcnNpb24gb2YgQHZhbHVle0dEQk59LiAgQHZhbHVle0dEQk59IGFubm91bmNlcyBpdCBpZiB5b3Ugc3RhcnQKK3dpdGggbm8gYXJndW1lbnRzOyB5b3UgY2FuIGFsc28gcHJpbnQgaXQgYXQgYW55IHRpbWUgdXNpbmcgQGNvZGV7c2hvdwordmVyc2lvbn0uCisKK1dpdGhvdXQgdGhpcywgd2Ugd2lsbCBub3Qga25vdyB3aGV0aGVyIHRoZXJlIGlzIGFueSBwb2ludCBpbiBsb29raW5nIGZvcgordGhlIGJ1ZyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIEB2YWx1ZXtHREJOfS4KKworQGl0ZW0KK1RoZSB0eXBlIG9mIG1hY2hpbmUgeW91IGFyZSB1c2luZywgYW5kIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG5hbWUgYW5kCit2ZXJzaW9uIG51bWJlci4KKworQGlmY2xlYXIgSFBQQQorQGl0ZW0KK1doYXQgY29tcGlsZXIgKGFuZCBpdHMgdmVyc2lvbikgd2FzIHVzZWQgdG8gY29tcGlsZSBAdmFsdWV7R0RCTn0tLS1lLmcuCitgYEB2YWx1ZXtHQ0N9LS0yLjguMScnLgorQGVuZCBpZmNsZWFyCisKK0BpdGVtCitXaGF0IGNvbXBpbGVyIChhbmQgaXRzIHZlcnNpb24pIHdhcyB1c2VkIHRvIGNvbXBpbGUgdGhlIHByb2dyYW0geW91IGFyZQorZGVidWdnaW5nLS0tZS5nLiAgYGBAdmFsdWV7R0NDfS0tMi44LjEnJywgb3IgYGBIUDkyNDUzLTAxIEEuMTAuMzIuMDMgSFAKK0MgQ29tcGlsZXInJy4gIEZvciBHQ0MsIHlvdSBjYW4gc2F5IEBjb2Rle2djYyAtLXZlcnNpb259IHRvIGdldCB0aGlzCitpbmZvcm1hdGlvbjsgZm9yIG90aGVyIGNvbXBpbGVycywgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aG9zZQorY29tcGlsZXJzLgorCitAaXRlbQorVGhlIGNvbW1hbmQgYXJndW1lbnRzIHlvdSBnYXZlIHRoZSBjb21waWxlciB0byBjb21waWxlIHlvdXIgZXhhbXBsZSBhbmQKK29ic2VydmUgdGhlIGJ1Zy4gIEZvciBleGFtcGxlLCBkaWQgeW91IHVzZSBAc2FtcHstT30/ICBUbyBndWFyYW50ZWUKK3lvdSB3aWxsIG5vdCBvbWl0IHNvbWV0aGluZyBpbXBvcnRhbnQsIGxpc3QgdGhlbSBhbGwuICBBIGNvcHkgb2YgdGhlCitNYWtlZmlsZSAob3IgdGhlIG91dHB1dCBmcm9tIG1ha2UpIGlzIHN1ZmZpY2llbnQuCisKK0lmIHdlIHdlcmUgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBhcmd1bWVudHMsIHdlIHdvdWxkIHByb2JhYmx5IGd1ZXNzIHdyb25nCithbmQgdGhlbiB3ZSBtaWdodCBub3QgZW5jb3VudGVyIHRoZSBidWcuCisKK0BpdGVtCitBIGNvbXBsZXRlIGlucHV0IHNjcmlwdCwgYW5kIGFsbCBuZWNlc3Nhcnkgc291cmNlIGZpbGVzLCB0aGF0IHdpbGwKK3JlcHJvZHVjZSB0aGUgYnVnLgorCitAaXRlbQorQSBkZXNjcmlwdGlvbiBvZiB3aGF0IGJlaGF2aW9yIHlvdSBvYnNlcnZlIHRoYXQgeW91IGJlbGlldmUgaXMKK2luY29ycmVjdC4gIEZvciBleGFtcGxlLCBgYEl0IGdldHMgYSBmYXRhbCBzaWduYWwuJycKKworT2YgY291cnNlLCBpZiB0aGUgYnVnIGlzIHRoYXQgQHZhbHVle0dEQk59IGdldHMgYSBmYXRhbCBzaWduYWwsIHRoZW4gd2UKK3dpbGwgY2VydGFpbmx5IG5vdGljZSBpdC4gIEJ1dCBpZiB0aGUgYnVnIGlzIGluY29ycmVjdCBvdXRwdXQsIHdlIG1pZ2h0Citub3Qgbm90aWNlIHVubGVzcyBpdCBpcyBnbGFyaW5nbHkgd3JvbmcuICBZb3UgbWlnaHQgYXMgd2VsbCBub3QgZ2l2ZSB1cworYSBjaGFuY2UgdG8gbWFrZSBhIG1pc3Rha2UuCisKK0V2ZW4gaWYgdGhlIHByb2JsZW0geW91IGV4cGVyaWVuY2UgaXMgYSBmYXRhbCBzaWduYWwsIHlvdSBzaG91bGQgc3RpbGwKK3NheSBzbyBleHBsaWNpdGx5LiAgU3VwcG9zZSBzb21ldGhpbmcgc3RyYW5nZSBpcyBnb2luZyBvbiwgc3VjaCBhcywgeW91cgorY29weSBvZiBAdmFsdWV7R0RCTn0gaXMgb3V0IG9mIHN5bmNoLCBvciB5b3UgaGF2ZSBlbmNvdW50ZXJlZCBhIGJ1ZyBpbgordGhlIEMgbGlicmFyeSBvbiB5b3VyIHN5c3RlbS4gIChUaGlzIGhhcyBoYXBwZW5lZCEpICBZb3VyIGNvcHkgbWlnaHQKK2NyYXNoIGFuZCBvdXJzIHdvdWxkIG5vdC4gIElmIHlvdSB0b2xkIHVzIHRvIGV4cGVjdCBhIGNyYXNoLCB0aGVuIHdoZW4KK291cnMgZmFpbHMgdG8gY3Jhc2gsIHdlIHdvdWxkIGtub3cgdGhhdCB0aGUgYnVnIHdhcyBub3QgaGFwcGVuaW5nIGZvcgordXMuICBJZiB5b3UgaGFkIG5vdCB0b2xkIHVzIHRvIGV4cGVjdCBhIGNyYXNoLCB0aGVuIHdlIHdvdWxkIG5vdCBiZSBhYmxlCit0byBkcmF3IGFueSBjb25jbHVzaW9uIGZyb20gb3VyIG9ic2VydmF0aW9ucy4KKworQGlmY2xlYXIgSFBQQQorQGl0ZW0KK0lmIHlvdSB3aXNoIHRvIHN1Z2dlc3QgY2hhbmdlcyB0byB0aGUgQHZhbHVle0dEQk59IHNvdXJjZSwgc2VuZCB1cyBjb250ZXh0CitkaWZmcy4gIElmIHlvdSBldmVuIGRpc2N1c3Mgc29tZXRoaW5nIGluIHRoZSBAdmFsdWV7R0RCTn0gc291cmNlLCByZWZlciB0bworaXQgYnkgY29udGV4dCwgbm90IGJ5IGxpbmUgbnVtYmVyLgorCitUaGUgbGluZSBudW1iZXJzIGluIG91ciBkZXZlbG9wbWVudCBzb3VyY2VzIHdpbGwgbm90IG1hdGNoIHRob3NlIGluIHlvdXIKK3NvdXJjZXMuICBZb3VyIGxpbmUgbnVtYmVycyB3b3VsZCBjb252ZXkgbm8gdXNlZnVsIGluZm9ybWF0aW9uIHRvIHVzLgorQGVuZCBpZmNsZWFyCitAZW5kIGl0ZW1pemUKKworSGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBhcmUgbm90IG5lY2Vzc2FyeToKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK0EgZGVzY3JpcHRpb24gb2YgdGhlIGVudmVsb3BlIG9mIHRoZSBidWcuCisKK09mdGVuIHBlb3BsZSB3aG8gZW5jb3VudGVyIGEgYnVnIHNwZW5kIGEgbG90IG9mIHRpbWUgaW52ZXN0aWdhdGluZword2hpY2ggY2hhbmdlcyB0byB0aGUgaW5wdXQgZmlsZSB3aWxsIG1ha2UgdGhlIGJ1ZyBnbyBhd2F5IGFuZCB3aGljaAorY2hhbmdlcyB3aWxsIG5vdCBhZmZlY3QgaXQuCisKK1RoaXMgaXMgb2Z0ZW4gdGltZSBjb25zdW1pbmcgYW5kIG5vdCB2ZXJ5IHVzZWZ1bCwgYmVjYXVzZSB0aGUgd2F5IHdlCit3aWxsIGZpbmQgdGhlIGJ1ZyBpcyBieSBydW5uaW5nIGEgc2luZ2xlIGV4YW1wbGUgdW5kZXIgdGhlIGRlYnVnZ2VyCit3aXRoIGJyZWFrcG9pbnRzLCBub3QgYnkgcHVyZSBkZWR1Y3Rpb24gZnJvbSBhIHNlcmllcyBvZiBleGFtcGxlcy4KK1dlIHJlY29tbWVuZCB0aGF0IHlvdSBzYXZlIHlvdXIgdGltZSBmb3Igc29tZXRoaW5nIGVsc2UuCisKK09mIGNvdXJzZSwgaWYgeW91IGNhbiBmaW5kIGEgc2ltcGxlciBleGFtcGxlIHRvIHJlcG9ydCBAZW1waHtpbnN0ZWFkfQorb2YgdGhlIG9yaWdpbmFsIG9uZSwgdGhhdCBpcyBhIGNvbnZlbmllbmNlIGZvciB1cy4gIEVycm9ycyBpbiB0aGUKK291dHB1dCB3aWxsIGJlIGVhc2llciB0byBzcG90LCBydW5uaW5nIHVuZGVyIHRoZSBkZWJ1Z2dlciB3aWxsIHRha2UKK2xlc3MgdGltZSwgYW5kIHNvIG9uLgorCitIb3dldmVyLCBzaW1wbGlmaWNhdGlvbiBpcyBub3Qgdml0YWw7IGlmIHlvdSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLAorcmVwb3J0IHRoZSBidWcgYW55d2F5IGFuZCBzZW5kIHVzIHRoZSBlbnRpcmUgdGVzdCBjYXNlIHlvdSB1c2VkLgorCitAaXRlbQorQSBwYXRjaCBmb3IgdGhlIGJ1Zy4KKworQSBwYXRjaCBmb3IgdGhlIGJ1ZyBkb2VzIGhlbHAgdXMgaWYgaXQgaXMgYSBnb29kIG9uZS4gIEJ1dCBkbyBub3Qgb21pdAordGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdGVzdCBjYXNlLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0CithIHBhdGNoIGlzIGFsbCB3ZSBuZWVkLiAgV2UgbWlnaHQgc2VlIHByb2JsZW1zIHdpdGggeW91ciBwYXRjaCBhbmQgZGVjaWRlCit0byBmaXggdGhlIHByb2JsZW0gYW5vdGhlciB3YXksIG9yIHdlIG1pZ2h0IG5vdCB1bmRlcnN0YW5kIGl0IGF0IGFsbC4KKworU29tZXRpbWVzIHdpdGggYSBwcm9ncmFtIGFzIGNvbXBsaWNhdGVkIGFzIEB2YWx1ZXtHREJOfSBpdCBpcyB2ZXJ5IGhhcmQgdG8KK2NvbnN0cnVjdCBhbiBleGFtcGxlIHRoYXQgd2lsbCBtYWtlIHRoZSBwcm9ncmFtIGZvbGxvdyBhIGNlcnRhaW4gcGF0aAordGhyb3VnaCB0aGUgY29kZS4gIElmIHlvdSBkbyBub3Qgc2VuZCB1cyB0aGUgZXhhbXBsZSwgd2Ugd2lsbCBub3QgYmUgYWJsZQordG8gY29uc3RydWN0IG9uZSwgc28gd2Ugd2lsbCBub3QgYmUgYWJsZSB0byB2ZXJpZnkgdGhhdCB0aGUgYnVnIGlzIGZpeGVkLgorCitBbmQgaWYgd2UgY2Fubm90IHVuZGVyc3RhbmQgd2hhdCBidWcgeW91IGFyZSB0cnlpbmcgdG8gZml4LCBvciB3aHkgeW91cgorcGF0Y2ggc2hvdWxkIGJlIGFuIGltcHJvdmVtZW50LCB3ZSB3aWxsIG5vdCBpbnN0YWxsIGl0LiAgQSB0ZXN0IGNhc2Ugd2lsbAoraGVscCB1cyB0byB1bmRlcnN0YW5kLgorCitAaXRlbQorQSBndWVzcyBhYm91dCB3aGF0IHRoZSBidWcgaXMgb3Igd2hhdCBpdCBkZXBlbmRzIG9uLgorCitTdWNoIGd1ZXNzZXMgYXJlIHVzdWFsbHkgd3JvbmcuICBFdmVuIHdlIGNhbm5vdCBndWVzcyByaWdodCBhYm91dCBzdWNoCit0aGluZ3Mgd2l0aG91dCBmaXJzdCB1c2luZyB0aGUgZGVidWdnZXIgdG8gZmluZCB0aGUgZmFjdHMuCitAZW5kIGl0ZW1pemUKKworQGMgVGhlIHJlYWRsaW5lIGRvY3VtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGUgcmVhZGxpbmUgY29kZSAKK0BjIGFuZCBjb25zaXN0cyBvZiB0aGUgdHdvIGZvbGxvd2luZyBmaWxlczoKK0BjICAgICBybHVzZXIudGV4aW5mbworQGMgICAgIGluYy1oaXN0LnRleGkKK0BjIFVzZSAtSSB3aXRoIG1ha2VpbmZvIHRvIHBvaW50IHRvIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnksCitAYyBlbnZpcm9ubWVudCB2YXIgVEVYSU5QVVRTIHdpdGggVGVYLgorQGluY2x1ZGUgcmx1c2VyLnRleGluZm8KK0BpbmNsdWRlIGluYy1oaXN0LnRleGkKKworCitAaWZjbGVhciBQUkVDT05GSUdVUkVECitAaWZjbGVhciBIUFBBCitAbm9kZSBGb3JtYXR0aW5nIERvY3VtZW50YXRpb24KK0BjIGxpbmtzIHdoYWNrZWQgdG8gcGFjaWZ5IG1ha2VpbmZvCitAYyAsIEluc3RhbGxpbmcgR0RCLCBSZW5hbWVkIENvbW1hbmRzLCBUb3AKK0BhcHBlbmRpeCBGb3JtYXR0aW5nIERvY3VtZW50YXRpb24KKworQGNpbmRleCBAdmFsdWV7R0RCTn0gcmVmZXJlbmNlIGNhcmQKK0BjaW5kZXggcmVmZXJlbmNlIGNhcmQKK1RoZSBAdmFsdWV7R0RCTn0gNCByZWxlYXNlIGluY2x1ZGVzIGFuIGFscmVhZHktZm9ybWF0dGVkIHJlZmVyZW5jZSBjYXJkLCByZWFkeQorZm9yIHByaW50aW5nIHdpdGggUG9zdFNjcmlwdCBvciBHaG9zdHNjcmlwdCwgaW4gdGhlIEBmaWxle2dkYn0KK3N1YmRpcmVjdG9yeSBvZiB0aGUgbWFpbiBzb3VyY2UgZGlyZWN0b3J5QGZvb3Rub3Rle0luCitAZmlsZXtnZGItQHZhbHVle0dEQlZOfS9nZGIvcmVmY2FyZC5wc30gb2YgdGhlIHZlcnNpb24gQHZhbHVle0dEQlZOfQorcmVsZWFzZS59LiAgSWYgeW91IGNhbiB1c2UgUG9zdFNjcmlwdCBvciBHaG9zdHNjcmlwdCB3aXRoIHlvdXIgcHJpbnRlciwKK3lvdSBjYW4gcHJpbnQgdGhlIHJlZmVyZW5jZSBjYXJkIGltbWVkaWF0ZWx5IHdpdGggQGZpbGV7cmVmY2FyZC5wc30uCisKK1RoZSByZWxlYXNlIGFsc28gaW5jbHVkZXMgdGhlIHNvdXJjZSBmb3IgdGhlIHJlZmVyZW5jZSBjYXJkLiAgWW91CitjYW4gZm9ybWF0IGl0LCB1c2luZyBAVGVYe30sIGJ5IHR5cGluZzoKKworQGV4YW1wbGUKK21ha2UgcmVmY2FyZC5kdmkKK0BlbmQgZXhhbXBsZQorCitUaGUgQHZhbHVle0dEQk59IHJlZmVyZW5jZSBjYXJkIGlzIGRlc2lnbmVkIHRvIHByaW50IGluIEBkZm57bGFuZHNjYXBlfSAKK21vZGUgb24gVVMgYGBsZXR0ZXInJyBzaXplIHBhcGVyOyAKK3RoYXQgaXMsIG9uIGEgc2hlZXQgMTEgaW5jaGVzIHdpZGUgYnkgOC41IGluY2hlcworaGlnaC4gIFlvdSB3aWxsIG5lZWQgdG8gc3BlY2lmeSB0aGlzIGZvcm0gb2YgcHJpbnRpbmcgYXMgYW4gb3B0aW9uIHRvCit5b3VyIEBzY3tkdml9IG91dHB1dCBwcm9ncmFtLgorCitAY2luZGV4IGRvY3VtZW50YXRpb24KKworQWxsIHRoZSBkb2N1bWVudGF0aW9uIGZvciBAdmFsdWV7R0RCTn0gY29tZXMgYXMgcGFydCBvZiB0aGUgbWFjaGluZS1yZWFkYWJsZQorZGlzdHJpYnV0aW9uLiAgVGhlIGRvY3VtZW50YXRpb24gaXMgd3JpdHRlbiBpbiBUZXhpbmZvIGZvcm1hdCwgd2hpY2ggaXMKK2EgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gdGhhdCB1c2VzIGEgc2luZ2xlIHNvdXJjZSBmaWxlIHRvIHByb2R1Y2UgYm90aAorb24tbGluZSBpbmZvcm1hdGlvbiBhbmQgYSBwcmludGVkIG1hbnVhbC4gIFlvdSBjYW4gdXNlIG9uZSBvZiB0aGUgSW5mbworZm9ybWF0dGluZyBjb21tYW5kcyB0byBjcmVhdGUgdGhlIG9uLWxpbmUgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnRhdGlvbgorYW5kIEBUZVh7fSAob3IgQGNvZGV7dGV4aTJyb2ZmfSkgdG8gdHlwZXNldCB0aGUgcHJpbnRlZCB2ZXJzaW9uLgorCitAdmFsdWV7R0RCTn0gaW5jbHVkZXMgYW4gYWxyZWFkeSBmb3JtYXR0ZWQgY29weSBvZiB0aGUgb24tbGluZSBJbmZvCit2ZXJzaW9uIG9mIHRoaXMgbWFudWFsIGluIHRoZSBAZmlsZXtnZGJ9IHN1YmRpcmVjdG9yeS4gIFRoZSBtYWluIEluZm8KK2ZpbGUgaXMgQGZpbGV7Z2RiLUB2YWx1ZXtHREJWTn0vZ2RiL2dkYi5pbmZvfSwgYW5kIGl0IHJlZmVycyB0bworc3Vib3JkaW5hdGUgZmlsZXMgbWF0Y2hpbmcgQHNhbXB7Z2RiLmluZm8qfSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuICBJZgorbmVjZXNzYXJ5LCB5b3UgY2FuIHByaW50IG91dCB0aGVzZSBmaWxlcywgb3IgcmVhZCB0aGVtIHdpdGggYW55IGVkaXRvcjsKK2J1dCB0aGV5IGFyZSBlYXNpZXIgdG8gcmVhZCB1c2luZyB0aGUgQGNvZGV7aW5mb30gc3Vic3lzdGVtIGluIEBzY3tnbnV9CitFbWFjcyBvciB0aGUgc3RhbmRhbG9uZSBAY29kZXtpbmZvfSBwcm9ncmFtLCBhdmFpbGFibGUgYXMgcGFydCBvZiB0aGUKK0BzY3tnbnV9IFRleGluZm8gZGlzdHJpYnV0aW9uLgorCitJZiB5b3Ugd2FudCB0byBmb3JtYXQgdGhlc2UgSW5mbyBmaWxlcyB5b3Vyc2VsZiwgeW91IG5lZWQgb25lIG9mIHRoZQorSW5mbyBmb3JtYXR0aW5nIHByb2dyYW1zLCBzdWNoIGFzIEBjb2Rle3RleGluZm8tZm9ybWF0LWJ1ZmZlcn0gb3IKK0Bjb2Rle21ha2VpbmZvfS4KKworSWYgeW91IGhhdmUgQGNvZGV7bWFrZWluZm99IGluc3RhbGxlZCwgYW5kIGFyZSBpbiB0aGUgdG9wIGxldmVsCitAdmFsdWV7R0RCTn0gc291cmNlIGRpcmVjdG9yeSAoQGZpbGV7Z2RiLUB2YWx1ZXtHREJWTn19LCBpbiB0aGUgY2FzZSBvZgordmVyc2lvbiBAdmFsdWV7R0RCVk59KSwgeW91IGNhbiBtYWtlIHRoZSBJbmZvIGZpbGUgYnkgdHlwaW5nOgorCitAZXhhbXBsZQorY2QgZ2RiCittYWtlIGdkYi5pbmZvCitAZW5kIGV4YW1wbGUKKworSWYgeW91IHdhbnQgdG8gdHlwZXNldCBhbmQgcHJpbnQgY29waWVzIG9mIHRoaXMgbWFudWFsLCB5b3UgbmVlZCBAVGVYe30sCithIHByb2dyYW0gdG8gcHJpbnQgaXRzIEBzY3tkdml9IG91dHB1dCBmaWxlcywgYW5kIEBmaWxle3RleGluZm8udGV4fSwgdGhlCitUZXhpbmZvIGRlZmluaXRpb25zIGZpbGUuCisKK0BUZVh7fSBpcyBhIHR5cGVzZXR0aW5nIHByb2dyYW07IGl0IGRvZXMgbm90IHByaW50IGZpbGVzIGRpcmVjdGx5LCBidXQKK3Byb2R1Y2VzIG91dHB1dCBmaWxlcyBjYWxsZWQgQHNje2R2aX0gZmlsZXMuICBUbyBwcmludCBhIHR5cGVzZXQKK2RvY3VtZW50LCB5b3UgbmVlZCBhIHByb2dyYW0gdG8gcHJpbnQgQHNje2R2aX0gZmlsZXMuICBJZiB5b3VyIHN5c3RlbQoraGFzIEBUZVh7fSBpbnN0YWxsZWQsIGNoYW5jZXMgYXJlIGl0IGhhcyBzdWNoIGEgcHJvZ3JhbS4gIFRoZSBwcmVjaXNlCitjb21tYW5kIHRvIHVzZSBkZXBlbmRzIG9uIHlvdXIgc3lzdGVtOyBAa2Jke2xwciAtZH0gaXMgY29tbW9uOyBhbm90aGVyCisoZm9yIFBvc3RTY3JpcHQgZGV2aWNlcykgaXMgQGtiZHtkdmlwc30uICBUaGUgQHNje2R2aX0gcHJpbnQgY29tbWFuZCBtYXkKK3JlcXVpcmUgYSBmaWxlIG5hbWUgd2l0aG91dCBhbnkgZXh0ZW5zaW9uIG9yIGEgQHNhbXB7LmR2aX0gZXh0ZW5zaW9uLgorCitAVGVYe30gYWxzbyByZXF1aXJlcyBhIG1hY3JvIGRlZmluaXRpb25zIGZpbGUgY2FsbGVkCitAZmlsZXt0ZXhpbmZvLnRleH0uICBUaGlzIGZpbGUgdGVsbHMgQFRlWHt9IGhvdyB0byB0eXBlc2V0IGEgZG9jdW1lbnQKK3dyaXR0ZW4gaW4gVGV4aW5mbyBmb3JtYXQuICBPbiBpdHMgb3duLCBAVGVYe30gY2Fubm90IGVpdGhlciByZWFkIG9yCit0eXBlc2V0IGEgVGV4aW5mbyBmaWxlLiAgQGZpbGV7dGV4aW5mby50ZXh9IGlzIGRpc3RyaWJ1dGVkIHdpdGggR0RCCithbmQgaXMgbG9jYXRlZCBpbiB0aGUgQGZpbGV7Z2RiLUB2YXJ7dmVyc2lvbi1udW1iZXJ9L3RleGluZm99CitkaXJlY3RvcnkuCisKK0lmIHlvdSBoYXZlIEBUZVh7fSBhbmQgYSBAc2N7ZHZpfSBwcmludGVyIHByb2dyYW0gaW5zdGFsbGVkLCB5b3UgY2FuCit0eXBlc2V0IGFuZCBwcmludCB0aGlzIG1hbnVhbC4gIEZpcnN0IHN3aXRjaCB0byB0aGUgdGhlIEBmaWxle2dkYn0KK3N1YmRpcmVjdG9yeSBvZiB0aGUgbWFpbiBzb3VyY2UgZGlyZWN0b3J5IChmb3IgZXhhbXBsZSwgdG8KK0BmaWxle2dkYi1AdmFsdWV7R0RCVk59L2dkYn0pIGFuZCB0eXBlOgorCitAZXhhbXBsZQorbWFrZSBnZGIuZHZpCitAZW5kIGV4YW1wbGUKKworVGhlbiBnaXZlIEBmaWxle2dkYi5kdml9IHRvIHlvdXIgQHNje2R2aX0gcHJpbnRpbmcgcHJvZ3JhbS4KK0BlbmQgaWZjbGVhcgorCitAbm9kZSBJbnN0YWxsaW5nIEdEQiwgSW5kZXgsIFVzaW5nIEhpc3RvcnkgSW50ZXJhY3RpdmVseSwgVG9wCitAYXBwZW5kaXggSW5zdGFsbGluZyBAdmFsdWV7R0RCTn0KK0BjaW5kZXggY29uZmlndXJpbmcgQHZhbHVle0dEQk59CitAY2luZGV4IGluc3RhbGxhdGlvbgorCitAaWZzZXQgSFBQQQorSWYgeW91IG9idGFpbiBAdmFsdWV7R0RCTn0gKEhQIFdEQiAwLjc1KSBhcyBwYXJ0IG9mIHlvdXIgSFAgQU5TSSBDIG9yCitIUCBBTlNJIEMrKyBEZXZlbG9wZXIncyBLaXQgYXQgSFAtVVggUmVsZWFzZSAxMS4wLCB5b3UgZG8gbm90IGhhdmUgdG8KK3Rha2UgYW55IHNwZWNpYWwgYWN0aW9uIHRvIGJ1aWxkIG9yIGluc3RhbGwgQHZhbHVle0dEQk59LgorCitJZiB5b3Ugb2J0YWluIEB2YWx1ZXtHREJOfSAoSFAgV0RCIDAuNzUpIGZyb20gYW4gSFAgd2ViIHNpdGUsIHlvdSBtYXkKK2Rvd25sb2FkIGVpdGhlciBhIEBjb2Rle3N3aW5zdGFsbH0tYWJsZSBwYWNrYWdlIG9yIGEgc291cmNlIHRyZWUsIG9yCitib3RoLgorCitNb3N0IGN1c3RvbWVycyB3aWxsIHdhbnQgdG8gaW5zdGFsbCB0aGUgQHZhbHVle0dEQk59IGJpbmFyeSB0aGF0IGlzIHBhcnQKK29mIHRoZSBAY29kZXtzd2luc3RhbGx9LWFibGUgcGFja2FnZS4gIFRvIGRvIHNvLCB1c2UgYSBjb21tYW5kIG9mIHRoZQorZm9ybQorCitAc21hbGxleGFtcGxlCisvdXNyL3NiaW4vc3dpbnN0YWxsIC1zIEB2YXJ7cGFja2FnZS1uYW1lfSBXREIKK0BlbmQgc21hbGxleGFtcGxlCisKK0FsdGVybmF0aXZlbHksIGl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkIEB2YWx1ZXtHREJOfSBmcm9tIHRoZSBzb3VyY2UKK2Rpc3RyaWJ1dGlvbi4gIFNvcGhpc3RpY2F0ZWQgY3VzdG9tZXJzIHdobyB3YW50IHRvIG1vZGlmeSB0aGUgZGVidWdnZXIKK3NvdXJjZXMgdG8gdGFpbG9yIEB2YWx1ZXtHREJOfSB0byB0aGVpciB0aGVpciBuZWVkcyBtYXkgd2lzaCB0byBkbyB0aGlzLgorVGhlIHNvdXJjZSBkaXN0cmlidXRpb24gY29uc2lzdHMgb2YgYSBAY29kZXt0YXJ9J2VkIHNvdXJjZSB0cmVlIHJvb3RlZAorYXQgQGZpbGV7Z2RiLTQuMTYvLi4ufS4gIFRoZSBpbnN0cnVjdGlvbnMgdGhhdCBmb2xsb3cgZGVzY3JpYmUgaG93IHRvCitidWlsZCBhIEBmaWxle2dkYn0gZXhlY3V0YWJsZSBmcm9tIHRoaXMgc291cmNlIHRyZWUuICBIUCBiZWxpZXZlcyB0aGF0Cit0aGVzZSBpbnN0cnVjdGlvbnMgYXBwbHkgdG8gdGhlIFdEQiBzb3VyY2UgdHJlZSB0aGF0IGl0IGRpc3RyaWJ1dGVzLgorSG93ZXZlciwgSFAgZG9lcyBub3QgZXhwbGljaXRseSBzdXBwb3J0IGJ1aWxkaW5nIGEgQGZpbGV7Z2RifSBmb3IgYW55Citub24tSFAgcGxhdGZvcm0gZnJvbSB0aGUgV0RCIHNvdXJjZSB0cmVlLiAgSXQgbWF5IHdvcmssIGJ1dCBIUCBoYXMgbm90Cit0ZXN0ZWQgaXQgZm9yIGFueSBwbGF0Zm9ybXMgb3RoZXIgdGhhbiB0aG9zZSBkZXNjcmliZWQgaW4gdGhlIFdEQiAwLjc1CitSZWxlYXNlIE5vdGVzLgorQGVuZCBpZnNldAorCitAdmFsdWV7R0RCTn0gY29tZXMgd2l0aCBhIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IHRoYXQgYXV0b21hdGVzIHRoZSBwcm9jZXNzCitvZiBwcmVwYXJpbmcgQHZhbHVle0dEQk59IGZvciBpbnN0YWxsYXRpb247IHlvdSBjYW4gdGhlbiB1c2UgQGNvZGV7bWFrZX0gdG8KK2J1aWxkIHRoZSBAY29kZXtnZGJ9IHByb2dyYW0uCitAaWZ0ZXgKK0BjIGlycmVsZXZhbnQgaW4gaW5mbyBmaWxlOyBpdCdzIGFzIGN1cnJlbnQgYXMgdGhlIGNvZGUgaXQgbGl2ZXMgd2l0aC4KK0Bmb290bm90ZXtJZiB5b3UgaGF2ZSBhIG1vcmUgcmVjZW50IHZlcnNpb24gb2YgQHZhbHVle0dEQk59IHRoYW4gQHZhbHVle0dEQlZOfSwKK2xvb2sgYXQgdGhlIEBmaWxle1JFQURNRX0gZmlsZSBpbiB0aGUgc291cmNlczsgd2UgbWF5IGhhdmUgaW1wcm92ZWQgdGhlCitpbnN0YWxsYXRpb24gcHJvY2VkdXJlcyBzaW5jZSBwdWJsaXNoaW5nIHRoaXMgbWFudWFsLn0KK0BlbmQgaWZ0ZXgKKworVGhlIEB2YWx1ZXtHREJOfSBkaXN0cmlidXRpb24gaW5jbHVkZXMgYWxsIHRoZSBzb3VyY2UgY29kZSB5b3UgbmVlZCBmb3IgCitAdmFsdWV7R0RCTn0gaW4gYSBzaW5nbGUgZGlyZWN0b3J5LCB3aG9zZSBuYW1lIGlzIHVzdWFsbHkgY29tcG9zZWQgYnkgCithcHBlbmRpbmcgdGhlIHZlcnNpb24gbnVtYmVyIHRvIEBzYW1we2dkYn0uCisKK0ZvciBleGFtcGxlLCB0aGUgQHZhbHVle0dEQk59IHZlcnNpb24gQHZhbHVle0dEQlZOfSBkaXN0cmlidXRpb24gaXMgaW4gdGhlCitAZmlsZXtnZGItQHZhbHVle0dEQlZOfX0gZGlyZWN0b3J5LiAgVGhhdCBkaXJlY3RvcnkgY29udGFpbnM6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gZ2RiLUB2YWx1ZXtHREJWTn0vY29uZmlndXJlIEByeyhhbmQgc3VwcG9ydGluZyBmaWxlcyl9CitzY3JpcHQgZm9yIGNvbmZpZ3VyaW5nIEB2YWx1ZXtHREJOfSBhbmQgYWxsIGl0cyBzdXBwb3J0aW5nIGxpYnJhcmllcworCitAaXRlbSBnZGItQHZhbHVle0dEQlZOfS9nZGIKK3RoZSBzb3VyY2Ugc3BlY2lmaWMgdG8gQHZhbHVle0dEQk59IGl0c2VsZgorCitAaXRlbSBnZGItQHZhbHVle0dEQlZOfS9iZmQKK3NvdXJjZSBmb3IgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeQorCitAaXRlbSBnZGItQHZhbHVle0dEQlZOfS9pbmNsdWRlCitAc2N7Z251fSBpbmNsdWRlIGZpbGVzCisKK0BpdGVtIGdkYi1AdmFsdWV7R0RCVk59L2xpYmliZXJ0eQorc291cmNlIGZvciB0aGUgQHNhbXB7LWxpYmVydHl9IGZyZWUgc29mdHdhcmUgbGlicmFyeQorCitAaXRlbSBnZGItQHZhbHVle0dEQlZOfS9vcGNvZGVzCitzb3VyY2UgZm9yIHRoZSBsaWJyYXJ5IG9mIG9wY29kZSB0YWJsZXMgYW5kIGRpc2Fzc2VtYmxlcnMKKworQGl0ZW0gZ2RiLUB2YWx1ZXtHREJWTn0vcmVhZGxpbmUKK3NvdXJjZSBmb3IgdGhlIEBzY3tnbnV9IGNvbW1hbmQtbGluZSBpbnRlcmZhY2UKKworQGl0ZW0gZ2RiLUB2YWx1ZXtHREJWTn0vZ2xvYgorc291cmNlIGZvciB0aGUgQHNje2dudX0gZmlsZW5hbWUgcGF0dGVybi1tYXRjaGluZyBzdWJyb3V0aW5lCisKK0BpdGVtIGdkYi1AdmFsdWV7R0RCVk59L21tYWxsb2MKK3NvdXJjZSBmb3IgdGhlIEBzY3tnbnV9IG1lbW9yeS1tYXBwZWQgbWFsbG9jIHBhY2thZ2UKK0BlbmQgdGFibGUKKworVGhlIHNpbXBsZXN0IHdheSB0byBjb25maWd1cmUgYW5kIGJ1aWxkIEB2YWx1ZXtHREJOfSBpcyB0byBydW4gQGNvZGV7Y29uZmlndXJlfQorZnJvbSB0aGUgQGZpbGV7Z2RiLUB2YXJ7dmVyc2lvbi1udW1iZXJ9fSBzb3VyY2UgZGlyZWN0b3J5LCB3aGljaCBpbgordGhpcyBleGFtcGxlIGlzIHRoZSBAZmlsZXtnZGItQHZhbHVle0dEQlZOfX0gZGlyZWN0b3J5LgorCitGaXJzdCBzd2l0Y2ggdG8gdGhlIEBmaWxle2dkYi1AdmFye3ZlcnNpb24tbnVtYmVyfX0gc291cmNlIGRpcmVjdG9yeQoraWYgeW91IGFyZSBub3QgYWxyZWFkeSBpbiBpdDsgdGhlbiBydW4gQGNvZGV7Y29uZmlndXJlfS4gIFBhc3MgdGhlCitpZGVudGlmaWVyIGZvciB0aGUgcGxhdGZvcm0gb24gd2hpY2ggQHZhbHVle0dEQk59IHdpbGwgcnVuIGFzIGFuCithcmd1bWVudC4KKworRm9yIGV4YW1wbGU6CisKK0BleGFtcGxlCitjZCBnZGItQHZhbHVle0dEQlZOfQorLi9jb25maWd1cmUgQHZhcntob3N0fQorbWFrZQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAord2hlcmUgQHZhcntob3N0fSBpcyBhbiBpZGVudGlmaWVyIHN1Y2ggYXMgQHNhbXB7c3VuNH0gb3IKK0BzYW1we2RlY3N0YXRpb259LCB0aGF0IGlkZW50aWZpZXMgdGhlIHBsYXRmb3JtIHdoZXJlIEB2YWx1ZXtHREJOfSB3aWxsIHJ1bi4KKyhZb3UgY2FuIG9mdGVuIGxlYXZlIG9mZiBAdmFye2hvc3R9OyBAY29kZXtjb25maWd1cmV9IHRyaWVzIHRvIGd1ZXNzIHRoZQorY29ycmVjdCB2YWx1ZSBieSBleGFtaW5pbmcgeW91ciBzeXN0ZW0uKQorCitSdW5uaW5nIEBzYW1we2NvbmZpZ3VyZSBAdmFye2hvc3R9fSBhbmQgdGhlbiBydW5uaW5nIEBjb2Rle21ha2V9IGJ1aWxkcyB0aGUKK0BmaWxle2JmZH0sIEBmaWxle3JlYWRsaW5lfSwgQGZpbGV7bW1hbGxvY30sIGFuZCBAZmlsZXtsaWJpYmVydHl9CitsaWJyYXJpZXMsIHRoZW4gQGNvZGV7Z2RifSBpdHNlbGYuICBUaGUgY29uZmlndXJlZCBzb3VyY2UgZmlsZXMsIGFuZCB0aGUKK2JpbmFyaWVzLCBhcmUgbGVmdCBpbiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgZGlyZWN0b3JpZXMuCisKK0BuZWVkIDc1MAorQGNvZGV7Y29uZmlndXJlfSBpcyBhIEJvdXJuZS1zaGVsbCAoQGNvZGV7L2Jpbi9zaH0pIHNjcmlwdDsgaWYgeW91cgorc3lzdGVtIGRvZXMgbm90IHJlY29nbml6ZSB0aGlzIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3UgcnVuIGEgZGlmZmVyZW50CitzaGVsbCwgeW91IG1heSBuZWVkIHRvIHJ1biBAY29kZXtzaH0gb24gaXQgZXhwbGljaXRseToKKworQGV4YW1wbGUKK3NoIGNvbmZpZ3VyZSBAdmFye2hvc3R9CitAZW5kIGV4YW1wbGUKKworSWYgeW91IHJ1biBAY29kZXtjb25maWd1cmV9IGZyb20gYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBzb3VyY2UKK2RpcmVjdG9yaWVzIGZvciBtdWx0aXBsZSBsaWJyYXJpZXMgb3IgcHJvZ3JhbXMsIHN1Y2ggYXMgdGhlCitAZmlsZXtnZGItQHZhbHVle0dEQlZOfX0gc291cmNlIGRpcmVjdG9yeSBmb3IgdmVyc2lvbiBAdmFsdWV7R0RCVk59LCBAY29kZXtjb25maWd1cmV9CitjcmVhdGVzIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIGV2ZXJ5IGRpcmVjdG9yeSBsZXZlbCB1bmRlcm5lYXRoICh1bmxlc3MKK3lvdSB0ZWxsIGl0IG5vdCB0bywgd2l0aCB0aGUgQHNhbXB7LS1ub3JlY3Vyc2lvbn0gb3B0aW9uKS4KKworWW91IGNhbiBydW4gdGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IGZyb20gYW55IG9mIHRoZQorc3Vib3JkaW5hdGUgZGlyZWN0b3JpZXMgaW4gdGhlIEB2YWx1ZXtHREJOfSBkaXN0cmlidXRpb24gaWYgeW91IG9ubHkgd2FudCB0bworY29uZmlndXJlIHRoYXQgc3ViZGlyZWN0b3J5LCBidXQgYmUgc3VyZSB0byBzcGVjaWZ5IGEgcGF0aCB0byBpdC4KKworRm9yIGV4YW1wbGUsIHdpdGggdmVyc2lvbiBAdmFsdWV7R0RCVk59LCB0eXBlIHRoZSBmb2xsb3dpbmcgdG8gY29uZmlndXJlIG9ubHkKK3RoZSBAY29kZXtiZmR9IHN1YmRpcmVjdG9yeToKKworQGV4YW1wbGUKK0Bncm91cAorY2QgZ2RiLUB2YWx1ZXtHREJWTn0vYmZkCisuLi9jb25maWd1cmUgQHZhcntob3N0fQorQGVuZCBncm91cAorQGVuZCBleGFtcGxlCisKK1lvdSBjYW4gaW5zdGFsbCBAY29kZXtAdmFsdWV7R0RCUH19IGFueXdoZXJlOyBpdCBoYXMgbm8gaGFyZHdpcmVkIHBhdGhzLgorSG93ZXZlciwgeW91IHNob3VsZCBtYWtlIHN1cmUgdGhhdCB0aGUgc2hlbGwgb24geW91ciBwYXRoIChuYW1lZCBieQordGhlIEBzYW1we1NIRUxMfSBlbnZpcm9ubWVudCB2YXJpYWJsZSkgaXMgcHVibGljbHkgcmVhZGFibGUuICBSZW1lbWJlcgordGhhdCBAdmFsdWV7R0RCTn0gdXNlcyB0aGUgc2hlbGwgdG8gc3RhcnQgeW91ciBwcm9ncmFtLS0tc29tZSBzeXN0ZW1zIHJlZnVzZSB0bworbGV0IEB2YWx1ZXtHREJOfSBkZWJ1ZyBjaGlsZCBwcm9jZXNzZXMgd2hvc2UgcHJvZ3JhbXMgYXJlIG5vdCByZWFkYWJsZS4KKworQG1lbnUKKyogU2VwYXJhdGUgT2JqZGlyOjogICAgICAgICAgICAgQ29tcGlsaW5nIEB2YWx1ZXtHREJOfSBpbiBhbm90aGVyIGRpcmVjdG9yeQorKiBDb25maWcgTmFtZXM6OiAgICAgICAgICAgICAgICBTcGVjaWZ5aW5nIG5hbWVzIGZvciBob3N0cyBhbmQgdGFyZ2V0cworKiBDb25maWd1cmUgT3B0aW9uczo6ICAgICAgICAgICBTdW1tYXJ5IG9mIG9wdGlvbnMgZm9yIGNvbmZpZ3VyZQorQGVuZCBtZW51CisKK0Bub2RlIFNlcGFyYXRlIE9iamRpciwgQ29uZmlnIE5hbWVzLCBJbnN0YWxsaW5nIEdEQiwgSW5zdGFsbGluZyBHREIKK0BzZWN0aW9uIENvbXBpbGluZyBAdmFsdWV7R0RCTn0gaW4gYW5vdGhlciBkaXJlY3RvcnkKKworSWYgeW91IHdhbnQgdG8gcnVuIEB2YWx1ZXtHREJOfSB2ZXJzaW9ucyBmb3Igc2V2ZXJhbCBob3N0IG9yIHRhcmdldCBtYWNoaW5lcywKK3lvdSBuZWVkIGEgZGlmZmVyZW50IEBjb2Rle2dkYn0gY29tcGlsZWQgZm9yIGVhY2ggY29tYmluYXRpb24gb2YKK2hvc3QgYW5kIHRhcmdldC4gIEBjb2Rle2NvbmZpZ3VyZX0gaXMgZGVzaWduZWQgdG8gbWFrZSB0aGlzIGVhc3kgYnkKK2FsbG93aW5nIHlvdSB0byBnZW5lcmF0ZSBlYWNoIGNvbmZpZ3VyYXRpb24gaW4gYSBzZXBhcmF0ZSBzdWJkaXJlY3RvcnksCityYXRoZXIgdGhhbiBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4gIElmIHlvdXIgQGNvZGV7bWFrZX0gcHJvZ3JhbQoraGFuZGxlcyB0aGUgQHNhbXB7VlBBVEh9IGZlYXR1cmUgKEBzY3tnbnV9IEBjb2Rle21ha2V9IGRvZXMpLCBydW5uaW5nCitAY29kZXttYWtlfSBpbiBlYWNoIG9mIHRoZXNlIGRpcmVjdG9yaWVzIGJ1aWxkcyB0aGUgQGNvZGV7Z2RifQorcHJvZ3JhbSBzcGVjaWZpZWQgdGhlcmUuCisKK1RvIGJ1aWxkIEBjb2Rle2dkYn0gaW4gYSBzZXBhcmF0ZSBkaXJlY3RvcnksIHJ1biBAY29kZXtjb25maWd1cmV9Cit3aXRoIHRoZSBAc2FtcHstLXNyY2Rpcn0gb3B0aW9uIHRvIHNwZWNpZnkgd2hlcmUgdG8gZmluZCB0aGUgc291cmNlLgorKFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhIHBhdGggdG8gZmluZCBAY29kZXtjb25maWd1cmV9CitpdHNlbGYgZnJvbSB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5LiAgSWYgdGhlIHBhdGggdG8gQGNvZGV7Y29uZmlndXJlfQord291bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGFyZ3VtZW50IHRvIEBzYW1wey0tc3JjZGlyfSwgeW91IGNhbiBsZWF2ZSBvdXQKK3RoZSBAc2FtcHstLXNyY2Rpcn0gb3B0aW9uOyBpdCBpcyBhc3N1bWVkLikKKworRm9yIGV4YW1wbGUsIHdpdGggdmVyc2lvbiBAdmFsdWV7R0RCVk59LCB5b3UgY2FuIGJ1aWxkIEB2YWx1ZXtHREJOfSBpbiBhIAorc2VwYXJhdGUgZGlyZWN0b3J5IGZvciBhIFN1biA0IGxpa2UgdGhpczoKKworQGV4YW1wbGUKK0Bncm91cAorY2QgZ2RiLUB2YWx1ZXtHREJWTn0KK21rZGlyIC4uL2dkYi1zdW40CitjZCAuLi9nZGItc3VuNAorLi4vZ2RiLUB2YWx1ZXtHREJWTn0vY29uZmlndXJlIHN1bjQKK21ha2UKK0BlbmQgZ3JvdXAKK0BlbmQgZXhhbXBsZQorCitXaGVuIEBjb2Rle2NvbmZpZ3VyZX0gYnVpbGRzIGEgY29uZmlndXJhdGlvbiB1c2luZyBhIHJlbW90ZSBzb3VyY2UKK2RpcmVjdG9yeSwgaXQgY3JlYXRlcyBhIHRyZWUgZm9yIHRoZSBiaW5hcmllcyB3aXRoIHRoZSBzYW1lIHN0cnVjdHVyZQorKGFuZCB1c2luZyB0aGUgc2FtZSBuYW1lcykgYXMgdGhlIHRyZWUgdW5kZXIgdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBJbgordGhlIGV4YW1wbGUsIHlvdSdkIGZpbmQgdGhlIFN1biA0IGxpYnJhcnkgQGZpbGV7bGliaWJlcnR5LmF9IGluIHRoZQorZGlyZWN0b3J5IEBmaWxle2dkYi1zdW40L2xpYmliZXJ0eX0sIGFuZCBAdmFsdWV7R0RCTn0gaXRzZWxmIGluCitAZmlsZXtnZGItc3VuNC9nZGJ9LgorCitPbmUgcG9wdWxhciByZWFzb24gdG8gYnVpbGQgc2V2ZXJhbCBAdmFsdWV7R0RCTn0gY29uZmlndXJhdGlvbnMgaW4gc2VwYXJhdGUKK2RpcmVjdG9yaWVzIGlzIHRvIGNvbmZpZ3VyZSBAdmFsdWV7R0RCTn0gZm9yIGNyb3NzLWNvbXBpbGluZyAod2hlcmUgCitAdmFsdWV7R0RCTn0gcnVucyBvbiBvbmUgbWFjaGluZS0tLXRoZSBAZGZue2hvc3R9LS0td2hpbGUgZGVidWdnaW5nIAorcHJvZ3JhbXMgdGhhdCBydW4gb24gYW5vdGhlciBtYWNoaW5lLS0tdGhlIEBkZm57dGFyZ2V0fSkuICAKK1lvdSBzcGVjaWZ5IGEgY3Jvc3MtZGVidWdnaW5nIHRhcmdldCBieQorZ2l2aW5nIHRoZSBAc2FtcHstLXRhcmdldD1AdmFye3RhcmdldH19IG9wdGlvbiB0byBAY29kZXtjb25maWd1cmV9LgorCitXaGVuIHlvdSBydW4gQGNvZGV7bWFrZX0gdG8gYnVpbGQgYSBwcm9ncmFtIG9yIGxpYnJhcnksIHlvdSBtdXN0IHJ1bgoraXQgaW4gYSBjb25maWd1cmVkIGRpcmVjdG9yeS0tLXdoYXRldmVyIGRpcmVjdG9yeSB5b3Ugd2VyZSBpbiB3aGVuIHlvdQorY2FsbGVkIEBjb2Rle2NvbmZpZ3VyZX0gKG9yIG9uZSBvZiBpdHMgc3ViZGlyZWN0b3JpZXMpLgorCitUaGUgQGNvZGV7TWFrZWZpbGV9IHRoYXQgQGNvZGV7Y29uZmlndXJlfSBnZW5lcmF0ZXMgaW4gZWFjaCBzb3VyY2UKK2RpcmVjdG9yeSBhbHNvIHJ1bnMgcmVjdXJzaXZlbHkuICBJZiB5b3UgdHlwZSBAY29kZXttYWtlfSBpbiBhIHNvdXJjZQorZGlyZWN0b3J5IHN1Y2ggYXMgQGZpbGV7Z2RiLUB2YWx1ZXtHREJWTn19IChvciBpbiBhIHNlcGFyYXRlIGNvbmZpZ3VyZWQKK2RpcmVjdG9yeSBjb25maWd1cmVkIHdpdGggQHNhbXB7LS1zcmNkaXI9QHZhcntkaXJuYW1lfS9nZGItQHZhbHVle0dEQlZOfX0pLCB5b3UKK3dpbGwgYnVpbGQgYWxsIHRoZSByZXF1aXJlZCBsaWJyYXJpZXMsIGFuZCB0aGVuIGJ1aWxkIEdEQi4KKworV2hlbiB5b3UgaGF2ZSBtdWx0aXBsZSBob3N0cyBvciB0YXJnZXRzIGNvbmZpZ3VyZWQgaW4gc2VwYXJhdGUKK2RpcmVjdG9yaWVzLCB5b3UgY2FuIHJ1biBAY29kZXttYWtlfSBvbiB0aGVtIGluIHBhcmFsbGVsIChmb3IgZXhhbXBsZSwKK2lmIHRoZXkgYXJlIE5GUy1tb3VudGVkIG9uIGVhY2ggb2YgdGhlIGhvc3RzKTsgdGhleSB3aWxsIG5vdCBpbnRlcmZlcmUKK3dpdGggZWFjaCBvdGhlci4KKworQG5vZGUgQ29uZmlnIE5hbWVzLCBDb25maWd1cmUgT3B0aW9ucywgU2VwYXJhdGUgT2JqZGlyLCBJbnN0YWxsaW5nIEdEQgorQHNlY3Rpb24gU3BlY2lmeWluZyBuYW1lcyBmb3IgaG9zdHMgYW5kIHRhcmdldHMKKworVGhlIHNwZWNpZmljYXRpb25zIHVzZWQgZm9yIGhvc3RzIGFuZCB0YXJnZXRzIGluIHRoZSBAY29kZXtjb25maWd1cmV9CitzY3JpcHQgYXJlIGJhc2VkIG9uIGEgdGhyZWUtcGFydCBuYW1pbmcgc2NoZW1lLCBidXQgc29tZSBzaG9ydCBwcmVkZWZpbmVkCithbGlhc2VzIGFyZSBhbHNvIHN1cHBvcnRlZC4gIFRoZSBmdWxsIG5hbWluZyBzY2hlbWUgZW5jb2RlcyB0aHJlZSBwaWVjZXMKK29mIGluZm9ybWF0aW9uIGluIHRoZSBmb2xsb3dpbmcgcGF0dGVybjoKKworQGV4YW1wbGUKK0B2YXJ7YXJjaGl0ZWN0dXJlfS1AdmFye3ZlbmRvcn0tQHZhcntvc30KK0BlbmQgZXhhbXBsZQorCitGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgdGhlIGFsaWFzIEBjb2Rle3N1bjR9IGFzIGEgQHZhcntob3N0fSBhcmd1bWVudCwKK29yIGFzIHRoZSB2YWx1ZSBmb3IgQHZhcnt0YXJnZXR9IGluIGEgQGNvZGV7LS10YXJnZXQ9QHZhcnt0YXJnZXR9fQorb3B0aW9uLiAgVGhlIGVxdWl2YWxlbnQgZnVsbCBuYW1lIGlzIEBzYW1we3NwYXJjLXN1bi1zdW5vczR9LgorCitUaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgYWNjb21wYW55aW5nIEB2YWx1ZXtHREJOfSBkb2VzIG5vdCBwcm92aWRlCithbnkgcXVlcnkgZmFjaWxpdHkgdG8gbGlzdCBhbGwgc3VwcG9ydGVkIGhvc3QgYW5kIHRhcmdldCBuYW1lcyBvcgorYWxpYXNlcy4gIEBjb2Rle2NvbmZpZ3VyZX0gY2FsbHMgdGhlIEJvdXJuZSBzaGVsbCBzY3JpcHQKK0Bjb2Rle2NvbmZpZy5zdWJ9IHRvIG1hcCBhYmJyZXZpYXRpb25zIHRvIGZ1bGwgbmFtZXM7IHlvdSBjYW4gcmVhZCB0aGUKK3NjcmlwdCwgaWYgeW91IHdpc2gsIG9yIHlvdSBjYW4gdXNlIGl0IHRvIHRlc3QgeW91ciBndWVzc2VzIG9uCithYmJyZXZpYXRpb25zLS0tZm9yIGV4YW1wbGU6CisKK0BzbWFsbGV4YW1wbGUKKyUgc2ggY29uZmlnLnN1YiBpMzg2LWxpbnV4CitpMzg2LXBjLWxpbnV4LWdudQorJSBzaCBjb25maWcuc3ViIGFscGhhLWxpbnV4CithbHBoYS11bmtub3duLWxpbnV4LWdudQorJSBzaCBjb25maWcuc3ViIGhwOWs3MDAKK2hwcGExLjEtaHAtaHB1eAorJSBzaCBjb25maWcuc3ViIHN1bjQKK3NwYXJjLXN1bi1zdW5vczQuMS4xCislIHNoIGNvbmZpZy5zdWIgc3VuMworbTY4ay1zdW4tc3Vub3M0LjEuMQorJSBzaCBjb25maWcuc3ViIGk5ODZ2CitJbnZhbGlkIGNvbmZpZ3VyYXRpb24gYGk5ODZ2JzogbWFjaGluZSBgaTk4NnYnIG5vdCByZWNvZ25pemVkCitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9pbmRlbnQKK0Bjb2Rle2NvbmZpZy5zdWJ9IGlzIGFsc28gZGlzdHJpYnV0ZWQgaW4gdGhlIEB2YWx1ZXtHREJOfSBzb3VyY2UKK2RpcmVjdG9yeSAoQGZpbGV7Z2RiLUB2YWx1ZXtHREJWTn19LCBmb3IgdmVyc2lvbiBAdmFsdWV7R0RCVk59KS4KKworQG5vZGUgQ29uZmlndXJlIE9wdGlvbnMsICAsIENvbmZpZyBOYW1lcywgSW5zdGFsbGluZyBHREIKK0BzZWN0aW9uIEBjb2Rle2NvbmZpZ3VyZX0gb3B0aW9ucworCitIZXJlIGlzIGEgc3VtbWFyeSBvZiB0aGUgQGNvZGV7Y29uZmlndXJlfSBvcHRpb25zIGFuZCBhcmd1bWVudHMgdGhhdAorYXJlIG1vc3Qgb2Z0ZW4gdXNlZnVsIGZvciBidWlsZGluZyBAdmFsdWV7R0RCTn0uICBAY29kZXtjb25maWd1cmV9IGFsc28gaGFzCitzZXZlcmFsIG90aGVyIG9wdGlvbnMgbm90IGxpc3RlZCBoZXJlLiAgQGluZm9yZWZ7V2hhdCBDb25maWd1cmUKK0RvZXMsLGNvbmZpZ3VyZS5pbmZvfSwgZm9yIGEgZnVsbCBleHBsYW5hdGlvbiBvZiBAY29kZXtjb25maWd1cmV9LgorCitAZXhhbXBsZQorY29uZmlndXJlIEBye1t9LS1oZWxwQHJ7XX0KKyAgICAgICAgICBAcntbfS0tcHJlZml4PUB2YXJ7ZGlyfUBye119CisgICAgICAgICAgQHJ7W30tLWV4ZWMtcHJlZml4PUB2YXJ7ZGlyfUBye119CisgICAgICAgICAgQHJ7W30tLXNyY2Rpcj1AdmFye2Rpcm5hbWV9QHJ7XX0KKyAgICAgICAgICBAcntbfS0tbm9yZWN1cnNpb25AcntdfSBAcntbfS0tcm1AcntdfQorICAgICAgICAgIEBye1t9LS10YXJnZXQ9QHZhcnt0YXJnZXR9QHJ7XX0KKyAgICAgICAgICBAdmFye2hvc3R9CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitZb3UgbWF5IGludHJvZHVjZSBvcHRpb25zIHdpdGggYSBzaW5nbGUgQHNhbXB7LX0gcmF0aGVyIHRoYW4KK0BzYW1wey0tfSBpZiB5b3UgcHJlZmVyOyBidXQgeW91IG1heSBhYmJyZXZpYXRlIG9wdGlvbiBuYW1lcyBpZiB5b3UgdXNlCitAc2FtcHstLX0uCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gLS1oZWxwCitEaXNwbGF5IGEgcXVpY2sgc3VtbWFyeSBvZiBob3cgdG8gaW52b2tlIEBjb2Rle2NvbmZpZ3VyZX0uCisKK0BpdGVtIC0tcHJlZml4PUB2YXJ7ZGlyfQorQ29uZmlndXJlIHRoZSBzb3VyY2UgdG8gaW5zdGFsbCBwcm9ncmFtcyBhbmQgZmlsZXMgdW5kZXIgZGlyZWN0b3J5CitAZmlsZXtAdmFye2Rpcn19LgorCitAaXRlbSAtLWV4ZWMtcHJlZml4PUB2YXJ7ZGlyfQorQ29uZmlndXJlIHRoZSBzb3VyY2UgdG8gaW5zdGFsbCBwcm9ncmFtcyB1bmRlciBkaXJlY3RvcnkKK0BmaWxle0B2YXJ7ZGlyfX0uCisKK0BjIGF2b2lkIHNwbGl0dGluZyB0aGUgd2FybmluZyBmcm9tIHRoZSBleHBsYW5hdGlvbjoKK0BuZWVkIDIwMDAKK0BpdGVtIC0tc3JjZGlyPUB2YXJ7ZGlybmFtZX0KK0BzdHJvbmd7V2FybmluZzogdXNpbmcgdGhpcyBvcHRpb24gcmVxdWlyZXMgQHNje2dudX0gQGNvZGV7bWFrZX0sIG9yIGFub3RoZXIKK0Bjb2Rle21ha2V9IHRoYXQgaW1wbGVtZW50cyB0aGUgQGNvZGV7VlBBVEh9IGZlYXR1cmUufUAqCitVc2UgdGhpcyBvcHRpb24gdG8gbWFrZSBjb25maWd1cmF0aW9ucyBpbiBkaXJlY3RvcmllcyBzZXBhcmF0ZSBmcm9tIHRoZQorQHZhbHVle0dEQk59IHNvdXJjZSBkaXJlY3Rvcmllcy4gIEFtb25nIG90aGVyIHRoaW5ncywgeW91IGNhbiB1c2UgdGhpcyB0bworYnVpbGQgKG9yIG1haW50YWluKSBzZXZlcmFsIGNvbmZpZ3VyYXRpb25zIHNpbXVsdGFuZW91c2x5LCBpbiBzZXBhcmF0ZQorZGlyZWN0b3JpZXMuICBAY29kZXtjb25maWd1cmV9IHdyaXRlcyBjb25maWd1cmF0aW9uIHNwZWNpZmljIGZpbGVzIGluCit0aGUgY3VycmVudCBkaXJlY3RvcnksIGJ1dCBhcnJhbmdlcyBmb3IgdGhlbSB0byB1c2UgdGhlIHNvdXJjZSBpbiB0aGUKK2RpcmVjdG9yeSBAdmFye2Rpcm5hbWV9LiAgQGNvZGV7Y29uZmlndXJlfSBjcmVhdGVzIGRpcmVjdG9yaWVzIHVuZGVyCit0aGUgd29ya2luZyBkaXJlY3RvcnkgaW4gcGFyYWxsZWwgdG8gdGhlIHNvdXJjZSBkaXJlY3RvcmllcyBiZWxvdworQHZhcntkaXJuYW1lfS4KKworQGl0ZW0gLS1ub3JlY3Vyc2lvbgorQ29uZmlndXJlIG9ubHkgdGhlIGRpcmVjdG9yeSBsZXZlbCB3aGVyZSBAY29kZXtjb25maWd1cmV9IGlzIGV4ZWN1dGVkOyBkbyBub3QKK3Byb3BhZ2F0ZSBjb25maWd1cmF0aW9uIHRvIHN1YmRpcmVjdG9yaWVzLgorCitAaXRlbSAtLXRhcmdldD1AdmFye3RhcmdldH0KK0NvbmZpZ3VyZSBAdmFsdWV7R0RCTn0gZm9yIGNyb3NzLWRlYnVnZ2luZyBwcm9ncmFtcyBydW5uaW5nIG9uIHRoZSBzcGVjaWZpZWQKK0B2YXJ7dGFyZ2V0fS4gIFdpdGhvdXQgdGhpcyBvcHRpb24sIEB2YWx1ZXtHREJOfSBpcyBjb25maWd1cmVkIHRvIGRlYnVnCitwcm9ncmFtcyB0aGF0IHJ1biBvbiB0aGUgc2FtZSBtYWNoaW5lIChAdmFye2hvc3R9KSBhcyBAdmFsdWV7R0RCTn0gaXRzZWxmLgorCitUaGVyZSBpcyBubyBjb252ZW5pZW50IHdheSB0byBnZW5lcmF0ZSBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSB0YXJnZXRzLgorCitAaXRlbSBAdmFye2hvc3R9IEBkb3Rze30KK0NvbmZpZ3VyZSBAdmFsdWV7R0RCTn0gdG8gcnVuIG9uIHRoZSBzcGVjaWZpZWQgQHZhcntob3N0fS4KKworVGhlcmUgaXMgbm8gY29udmVuaWVudCB3YXkgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgaG9zdHMuCitAZW5kIHRhYmxlCisKK1RoZXJlIGFyZSBtYW55IG90aGVyIG9wdGlvbnMgYXZhaWxhYmxlIGFzIHdlbGwsIGJ1dCB0aGV5IGFyZSBnZW5lcmFsbHkKK25lZWRlZCBmb3Igc3BlY2lhbCBwdXJwb3NlcyBvbmx5LgorQGVuZCBpZmNsZWFyCisKKyAKK0Bub2RlIEluZGV4LCAgLCBJbnN0YWxsaW5nIEdEQiwgVG9wCitAdW5udW1iZXJlZCBJbmRleAorCitAcHJpbnRpbmRleCBjcAorCitAdGV4CislIEkgdGhpbmsgc29tZXRoaW5nIGxpa2UgQGNvbG9waG9uIHNob3VsZCBiZSBpbiB0ZXhpbmZvLiAgSW4gdGhlCislIG1lYW50aW1lOgorXGxvbmdcZGVmXGNvbG9waG9ue1xoYm94IHRvMHB0e31cdmZpbGwKK1xjZW50ZXJsaW5le1RoZSBib2R5IG9mIHRoaXMgbWFudWFsIGlzIHNldCBpbn0KK1xjZW50ZXJsaW5le1xmb250bmFtZVx0ZW5ybSx9CitcY2VudGVybGluZXt3aXRoIGhlYWRpbmdzIGluIHtcYmZcZm9udG5hbWVcdGVuYmZ9fQorXGNlbnRlcmxpbmV7YW5kIGV4YW1wbGVzIGluIHtcdHRcZm9udG5hbWVcdGVudHR9Ln0KK1xjZW50ZXJsaW5le3tcaXRcZm9udG5hbWVcdGVuaXRcL30sfQorXGNlbnRlcmxpbmV7e1xiZlxmb250bmFtZVx0ZW5iZn0sIGFuZH0KK1xjZW50ZXJsaW5le3tcc2xcZm9udG5hbWVcdGVuc2xcL319CitcY2VudGVybGluZXthcmUgdXNlZCBmb3IgZW1waGFzaXMufVx2ZmlsbH0KK1xwYWdlXGNvbG9waG9uCislIEJsYW1lOiBkb2NAY3lnbnVzLmNvbSwgMTk5MS4KK0BlbmQgdGV4CisKK0Bjb250ZW50cworQGJ5ZQpkaWZmIC0tZ2l0IGEvZ2RiL2RvYy9nZGJpbnQudGV4aW5mbyBiL2dkYi9kb2MvZ2RiaW50LnRleGluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmMDgxZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9kb2MvZ2RiaW50LnRleGluZm8KQEAgLTAsMCArMSwyNzExIEBACitcaW5wdXQgdGV4aW5mbworQHNldGZpbGVuYW1lIGdkYmludC5pbmZvCisKK0BpZmluZm8KK0Bmb3JtYXQKK1NUQVJULUlORk8tRElSLUVOVFJZCisqIEdkYi1JbnRlcm5hbHM6IChnZGJpbnQpLglUaGUgR05VIGRlYnVnZ2VyJ3MgaW50ZXJuYWxzLgorRU5ELUlORk8tRElSLUVOVFJZCitAZW5kIGZvcm1hdAorQGVuZCBpZmluZm8KKworQGlmaW5mbworVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgaW50ZXJuYWxzIG9mIHRoZSBHTlUgZGVidWdnZXIgR0RCLgorCitDb3B5cmlnaHQgMTk5MC0xOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4gIFdyaXR0ZW4gYnkgSm9obiBHaWxtb3JlLgorU2Vjb25kIEVkaXRpb24gYnkgU3RhbiBTaGVicy4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoaXMKK21hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcmUKK3ByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorCitAaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZXggYW5kIHByaW50IHRoZQorcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24gbm90aWNlCitpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaCAodGhpcworcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgorCitAZW5kIGlnbm9yZQorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgb3IgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgKGZvciB3aGljaCBwdXJwb3NlIHRoaXMgdGV4dCBtYXkgYmUKK3JlZ2FyZGVkIGFzIGEgcHJvZ3JhbSBpbiB0aGUgbGFuZ3VhZ2UgVGVYKS4KK0BlbmQgaWZpbmZvCisKK0BzZXRjaGFwdGVybmV3cGFnZSBvZmYKK0BzZXR0aXRsZSBHREIgSW50ZXJuYWxzCisKK0B0aXRsZXBhZ2UKK0B0aXRsZXtHREIgSW50ZXJuYWxzfQorQHN1YnRpdGxle0EgZ3VpZGUgdG8gdGhlIGludGVybmFscyBvZiB0aGUgR05VIGRlYnVnZ2VyfQorQGF1dGhvciBKb2huIEdpbG1vcmUKK0BhdXRob3IgQ3lnbnVzIFNvbHV0aW9ucworQGF1dGhvciBTZWNvbmQgRWRpdGlvbjoKK0BhdXRob3IgU3RhbiBTaGVicworQGF1dGhvciBDeWdudXMgU29sdXRpb25zCitAcGFnZQorQHRleAorXGRlZlwkIzEke3sjMX19ICAlIEtsdWdlOiBjb2xsZWN0IFJDUyByZXZpc2lvbiBpbmZvIHdpdGhvdXQgJC4uLiQKK1x4ZGVmXG1hbnZlcnN7XCRSZXZpc2lvbiR9ICAlIEZvciB1c2UgaW4gaGVhZGVycywgZm9vdGVycyB0b28KK3tccGFyc2tpcD0wcHQKK1xoZmlsbCBDeWdudXMgU29sdXRpb25zXHBhcgorXGhmaWxsIFxtYW52ZXJzXHBhcgorXGhmaWxsIFxUZVh7fWluZm8gXHRleGluZm92ZXJzaW9uXHBhcgorfQorQGVuZCB0ZXgKKworQHZza2lwIDBwdCBwbHVzIDFmaWxsbAorQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkwLTE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgordGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKK2FyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKworQGVuZCB0aXRsZXBhZ2UKKworQG5vZGUgVG9wCitAYyBQZXJoYXBzIHRoaXMgc2hvdWxkIGJlIHRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQgKGJ1dCBvbmx5IGZvciBpbmZvLAorQGMgbm90IGZvciBUZVgpLiAgRXhpc3RpbmcgR05VIG1hbnVhbHMgc2VlbSBpbmNvbnNpc3RlbnQgb24gdGhpcyBwb2ludC4KK0B0b3AgU2NvcGUgb2YgdGhpcyBEb2N1bWVudAorCitUaGlzIGRvY3VtZW50IGRvY3VtZW50cyB0aGUgaW50ZXJuYWxzIG9mIHRoZSBHTlUgZGVidWdnZXIsIEdEQi4gIEl0CitpbmNsdWRlcyBkZXNjcmlwdGlvbiBvZiBHREIncyBrZXkgYWxnb3JpdGhtcyBhbmQgb3BlcmF0aW9ucywgYXMgd2VsbAorYXMgdGhlIG1lY2hhbmlzbXMgdGhhdCBhZGFwdCBHREIgdG8gc3BlY2lmaWMgaG9zdHMgYW5kIHRhcmdldHMuCisKK0BtZW51CisqIFJlcXVpcmVtZW50czo6CisqIE92ZXJhbGwgU3RydWN0dXJlOjoKKyogQWxnb3JpdGhtczo6CisqIFVzZXIgSW50ZXJmYWNlOjoKKyogU3ltYm9sIEhhbmRsaW5nOjoKKyogTGFuZ3VhZ2UgU3VwcG9ydDo6CisqIEhvc3QgRGVmaW5pdGlvbjo6CisqIFRhcmdldCBBcmNoaXRlY3R1cmUgRGVmaW5pdGlvbjo6CisqIFRhcmdldCBWZWN0b3IgRGVmaW5pdGlvbjo6CisqIE5hdGl2ZSBEZWJ1Z2dpbmc6OgorKiBTdXBwb3J0IExpYnJhcmllczo6CisqIENvZGluZzo6CisqIFBvcnRpbmcgR0RCOjoKKyogSGludHM6OgorQGVuZCBtZW51CisKK0Bub2RlIFJlcXVpcmVtZW50cworCitAY2hhcHRlciBSZXF1aXJlbWVudHMKKworQmVmb3JlIGRpdmluZyBpbnRvIHRoZSBpbnRlcm5hbHMsIHlvdSBzaG91bGQgdW5kZXJzdGFuZCB0aGUgZm9ybWFsCityZXF1aXJlbWVudHMgYW5kIG90aGVyIGV4cGVjdGF0aW9ucyBmb3IgR0RCLiAgQWx0aG91Z2ggc29tZSBvZiB0aGVzZSBtYXkKK3NlZW0gb2J2aW91cywgdGhlcmUgaGF2ZSBiZWVuIHByb3Bvc2FscyBmb3IgR0RCIHRoYXQgaGF2ZSBydW4gY291bnRlciB0bwordGhlc2UgcmVxdWlyZW1lbnRzLgorCitGaXJzdCBvZiBhbGwsIEdEQiBpcyBhIGRlYnVnZ2VyLiAgSXQncyBub3QgZGVzaWduZWQgdG8gYmUgYSBmcm9udCBwYW5lbAorZm9yIGVtYmVkZGVkIHN5c3RlbXMuICBJdCdzIG5vdCBhIHRleHQgZWRpdG9yLiAgSXQncyBub3QgYSBzaGVsbC4gIEl0J3MKK25vdCBhIHByb2dyYW1taW5nIGVudmlyb25tZW50LgorCitHREIgaXMgYW4gaW50ZXJhY3RpdmUgdG9vbC4gIEFsdGhvdWdoIGEgYmF0Y2ggbW9kZSBpcyBhdmFpbGFibGUsIEdEQidzCitwcmltYXJ5IHJvbGUgaXMgdG8gaW50ZXJhY3Qgd2l0aCBhIGh1bWFuIHByb2dyYW1tZXIuCisKK0dEQiBzaG91bGQgYmUgcmVzcG9uc2l2ZSB0byB0aGUgdXNlci4gIEEgcHJvZ3JhbW1lciBob3Qgb24gdGhlIHRyYWlsIG9mCithIG5hc3R5IGJ1ZywgYW5kIG9wZXJhdGluZyB1bmRlciBhIGxvb21pbmcgZGVhZGxpbmUsIGlzIGdvaW5nIHRvIGJlIHZlcnkKK2ltcGF0aWVudCBvZiBldmVyeXRoaW5nLCBpbmNsdWRpbmcgdGhlIHJlc3BvbnNlIHRpbWUgdG8gZGVidWdnZXIKK2NvbW1hbmRzLgorCitHREIgc2hvdWxkIGJlIHJlbGF0aXZlbHkgcGVybWlzc2l2ZSwgc3VjaCBhcyBmb3IgZXhwcmVzc2lvbnMuICBXaGlsZSB0aGUKK2NvbXBpbGVyIHNob3VsZCBiZSBwaWNreSAob3IgaGF2ZSB0aGUgb3B0aW9uIHRvIGJlIG1hZGUgcGlja3kpLCBzaW5jZQorc291cmNlIGNvZGUgbGl2ZXMgZm9yIGEgbG9uZyB0aW1lIHVzdWFsbHksIHRoZSBwcm9ncmFtbWVyIGRvaW5nCitkZWJ1Z2dpbmcgc2hvdWxkbid0IGJlIHNwZW5kaW5nIHRpbWUgZmlndXJpbmcgb3V0IHRvIG1vbGxpZnkgdGhlCitkZWJ1Z2dlci4KKworR0RCIHdpbGwgYmUgY2FsbGVkIHVwb24gdG8gZGVhbCB3aXRoIHJlYWxseSBsYXJnZSBwcm9ncmFtcy4gIEV4ZWN1dGFibGUKK3NpemVzIG9mIDUwIHRvIDEwMCBtZWdhYnl0ZXMgb2NjdXIgcmVndWxhcmx5LCBhbmQgd2UndmUgaGVhcmQgcmVwb3J0cyBvZgorcHJvZ3JhbXMgYXBwcm9hY2hpbmcgMSBnaWdhYnl0ZSBpbiBzaXplLgorCitHREIgc2hvdWxkIGJlIGFibGUgdG8gcnVuIGV2ZXJ5d2hlcmUuICBObyBvdGhlciBkZWJ1Z2dlciBpcyBhdmFpbGFibGUKK2ZvciBldmVuIGhhbGYgYXMgbWFueSBjb25maWd1cmF0aW9ucyBhcyBHREIgc3VwcG9ydHMuCisKKworQG5vZGUgT3ZlcmFsbCBTdHJ1Y3R1cmUKKworQGNoYXB0ZXIgT3ZlcmFsbCBTdHJ1Y3R1cmUKKworR0RCIGNvbnNpc3RzIG9mIHRocmVlIG1ham9yIHN1YnN5c3RlbXM6IHVzZXIgaW50ZXJmYWNlLCBzeW1ib2wgaGFuZGxpbmcKKyh0aGUgYGBzeW1ib2wgc2lkZScnKSwgYW5kIHRhcmdldCBzeXN0ZW0gaGFuZGxpbmcgKHRoZSBgYHRhcmdldCBzaWRlJycpLgorCitUaGVyIHVzZXIgaW50ZXJmYWNlIGNvbnNpc3RzIG9mIHNldmVyYWwgYWN0dWFsIGludGVyZmFjZXMsIHBsdXMKK3N1cHBvcnRpbmcgY29kZS4KKworVGhlIHN5bWJvbCBzaWRlIGNvbnNpc3RzIG9mIG9iamVjdCBmaWxlIHJlYWRlcnMsIGRlYnVnZ2luZyBpbmZvCitpbnRlcnByZXRlcnMsIHN5bWJvbCB0YWJsZSBtYW5hZ2VtZW50LCBzb3VyY2UgbGFuZ3VhZ2UgZXhwcmVzc2lvbgorcGFyc2luZywgdHlwZSBhbmQgdmFsdWUgcHJpbnRpbmcuCisKK1RoZSB0YXJnZXQgc2lkZSBjb25zaXN0cyBvZiBleGVjdXRpb24gY29udHJvbCwgc3RhY2sgZnJhbWUgYW5hbHlzaXMsIGFuZAorcGh5c2ljYWwgdGFyZ2V0IG1hbmlwdWxhdGlvbi4KKworVGhlIHRhcmdldCBzaWRlL3N5bWJvbCBzaWRlIGRpdmlzaW9uIGlzIG5vdCBmb3JtYWwsIGFuZCB0aGVyZSBhcmUgYQorbnVtYmVyIG9mIGV4Y2VwdGlvbnMuICBGb3IgaW5zdGFuY2UsIGNvcmUgZmlsZSBzdXBwb3J0IGludm9sdmVzIHN5bWJvbGljCitlbGVtZW50cyAodGhlIGJhc2ljIGNvcmUgZmlsZSByZWFkZXIgaXMgaW4gQkZEKSBhbmQgdGFyZ2V0IGVsZW1lbnRzIChpdAorc3VwcGxpZXMgdGhlIGNvbnRlbnRzIG9mIG1lbW9yeSBhbmQgdGhlIHZhbHVlcyBvZiByZWdpc3RlcnMpLiAgSW5zdGVhZCwKK3RoaXMgZGl2aXNpb24gaXMgdXNlZnVsIGZvciB1bmRlcnN0YW5kaW5nIGhvdyB0aGUgbWlub3Igc3Vic3lzdGVtcworc2hvdWxkIGZpdCB0b2dldGhlci4KKworQHNlY3Rpb24gVGhlIFN5bWJvbCBTaWRlCisKK1RoZSBzeW1ib2xpYyBzaWRlIG9mIEdEQiBjYW4gYmUgdGhvdWdodCBvZiBhcyBgYGV2ZXJ5dGhpbmcgeW91IGNhbiBkbyBpbgorR0RCIHdpdGhvdXQgaGF2aW5nIGEgbGl2ZSBwcm9ncmFtIHJ1bm5pbmcnJy4gIEZvciBpbnN0YW5jZSwgeW91IGNhbiBsb29rCithdCB0aGUgdHlwZXMgb2YgdmFyaWFibGVzLCBhbmQgZXZhbHVhdGUgbWFueSBraW5kcyBvZiBleHByZXNzaW9ucy4KKworQHNlY3Rpb24gVGhlIFRhcmdldCBTaWRlCisKK1RoZSB0YXJnZXQgc2lkZSBvZiBHREIgaXMgdGhlIGBgYml0cyBhbmQgYnl0ZXMgbWFuaXB1bGF0b3InJy4gIEFsdGhvdWdoCitpdCBtYXkgbWFrZSByZWZlcmVuY2UgdG8gc3ltYm9saWMgaW5mbyBoZXJlIGFuZCB0aGVyZSwgbW9zdCBvZiB0aGUKK3RhcmdldCBzaWRlIHdpbGwgcnVuIHdpdGggb25seSBhIHN0cmlwcGVkIGV4ZWN1dGFibGUgYXZhaWxhYmxlIC0tIG9yCitldmVuIG5vIGV4ZWN1dGFibGUgYXQgYWxsLCBpbiByZW1vdGUgZGVidWdnaW5nIGNhc2VzLgorCitPcGVyYXRpb25zIHN1Y2ggYXMgZGlzYXNzZW1ibHksIHN0YWNrIGZyYW1lIGNyYXdscywgYW5kIHJlZ2lzdGVyCitkaXNwbGF5LCBhcmUgYWJsZSB0byB3b3JrIHdpdGggbm8gc3ltYm9saWMgaW5mbyBhdCBhbGwuICBJbiBzb21lIGNhc2VzLAorc3VjaCBhcyBkaXNhc3NlbWJseSwgR0RCIHdpbGwgdXNlIHN5bWJvbGljIGluZm8gdG8gcHJlc2VudCBhZGRyZXNzZXMKK3JlbGF0aXZlIHRvIHN5bWJvbHMgcmF0aGVyIHRoYW4gYXMgcmF3IG51bWJlcnMsIGJ1dCBpdCB3aWxsIHdvcmsgZWl0aGVyCit3YXkuCisKK0BzZWN0aW9uIENvbmZpZ3VyYXRpb25zCisKK0BkZm57SG9zdH0gcmVmZXJzIHRvIGF0dHJpYnV0ZXMgb2YgdGhlIHN5c3RlbSB3aGVyZSBHREIgcnVucy4KK0BkZm57VGFyZ2V0fSByZWZlcnMgdG8gdGhlIHN5c3RlbSB3aGVyZSB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZAorZXhlY3V0ZXMuICBJbiBtb3N0IGNhc2VzIHRoZXkgYXJlIHRoZSBzYW1lIG1hY2hpbmUsIGluIHdoaWNoIGNhc2UgYQordGhpcmQgdHlwZSBvZiBAZGZue05hdGl2ZX0gYXR0cmlidXRlcyBjb21lIGludG8gcGxheS4KKworRGVmaW5lcyBhbmQgaW5jbHVkZSBmaWxlcyBuZWVkZWQgdG8gYnVpbGQgb24gdGhlIGhvc3QgYXJlIGhvc3Qgc3VwcG9ydC4KK0V4YW1wbGVzIGFyZSB0dHkgc3VwcG9ydCwgc3lzdGVtIGRlZmluZWQgdHlwZXMsIGhvc3QgYnl0ZSBvcmRlciwgaG9zdAorZmxvYXQgZm9ybWF0LgorCitEZWZpbmVzIGFuZCBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gaGFuZGxlIHRoZSB0YXJnZXQgZm9ybWF0IGFyZSB0YXJnZXQKK2RlcGVuZGVudC4gIEV4YW1wbGVzIGFyZSB0aGUgc3RhY2sgZnJhbWUgZm9ybWF0LCBpbnN0cnVjdGlvbiBzZXQsCiticmVha3BvaW50IGluc3RydWN0aW9uLCByZWdpc3RlcnMsIGFuZCBob3cgdG8gc2V0IHVwIGFuZCB0ZWFyIGRvd24gdGhlIHN0YWNrCit0byBjYWxsIGEgZnVuY3Rpb24uCisKK0luZm9ybWF0aW9uIHRoYXQgaXMgb25seSBuZWVkZWQgd2hlbiB0aGUgaG9zdCBhbmQgdGFyZ2V0IGFyZSB0aGUgc2FtZSwKK2lzIG5hdGl2ZSBkZXBlbmRlbnQuICBPbmUgZXhhbXBsZSBpcyBVbml4IGNoaWxkIHByb2Nlc3Mgc3VwcG9ydDsgaWYgdGhlCitob3N0IGFuZCB0YXJnZXQgYXJlIG5vdCB0aGUgc2FtZSwgZG9pbmcgYSBmb3JrIHRvIHN0YXJ0IHRoZSB0YXJnZXQKK3Byb2Nlc3MgaXMgYSBiYWQgaWRlYS4gIFRoZSB2YXJpb3VzIG1hY3JvcyBuZWVkZWQgZm9yIGZpbmRpbmcgdGhlCityZWdpc3RlcnMgaW4gdGhlIEBjb2Rle3VwYWdlfSwgcnVubmluZyBAY29kZXtwdHJhY2V9LCBhbmQgc3VjaCBhcmUgYWxsCitpbiB0aGUgbmF0aXZlLWRlcGVuZGVudCBmaWxlcy4KKworQW5vdGhlciBleGFtcGxlIG9mIG5hdGl2ZS1kZXBlbmRlbnQgY29kZSBpcyBzdXBwb3J0IGZvciBmZWF0dXJlcyB0aGF0CithcmUgcmVhbGx5IHBhcnQgb2YgdGhlIHRhcmdldCBlbnZpcm9ubWVudCwgYnV0IHdoaWNoIHJlcXVpcmUKK0Bjb2RleyNpbmNsdWRlfSBmaWxlcyB0aGF0IGFyZSBvbmx5IGF2YWlsYWJsZSBvbiB0aGUgaG9zdCBzeXN0ZW0uICBDb3JlCitmaWxlIGhhbmRsaW5nIGFuZCBAY29kZXtzZXRqbXB9IGhhbmRsaW5nIGFyZSB0d28gY29tbW9uIGNhc2VzLgorCitXaGVuIHlvdSB3YW50IHRvIG1ha2UgR0RCIHdvcmsgYGBuYXRpdmUnJyBvbiBhIHBhcnRpY3VsYXIgbWFjaGluZSwgeW91CitoYXZlIHRvIGluY2x1ZGUgYWxsIHRocmVlIGtpbmRzIG9mIGluZm9ybWF0aW9uLgorCisKK0Bub2RlIEFsZ29yaXRobXMKKworQGNoYXB0ZXIgQWxnb3JpdGhtcworCitHREIgdXNlcyBhIG51bWJlciBvZiBkZWJ1Z2dpbmctc3BlY2lmaWMgYWxnb3JpdGhtcy4gIFRoZXkgYXJlIG9mdGVuIG5vdAordmVyeSBjb21wbGljYXRlZCwgYnV0IGdldCBsb3N0IGluIHRoZSB0aGlja2V0IG9mIHNwZWNpYWwgY2FzZXMgYW5kCityZWFsLXdvcmxkIGlzc3Vlcy4gIFRoaXMgY2hhcHRlciBkZXNjcmliZXMgdGhlIGJhc2ljIGFsZ29yaXRobXMgYW5kCittZW50aW9ucyBzb21lIG9mIHRoZSBzcGVjaWZpYyB0YXJnZXQgZGVmaW5pdGlvbnMgdGhhdCB0aGV5IHVzZS4KKworQHNlY3Rpb24gRnJhbWVzCisKK0EgZnJhbWUgaXMgYSBjb25zdHJ1Y3QgdGhhdCBHREIgdXNlcyB0byBrZWVwIHRyYWNrIG9mIGNhbGxpbmcgYW5kIGNhbGxlZAorZnVuY3Rpb25zLgorCitAY29kZXtGUkFNRV9GUH0gaW4gdGhlIG1hY2hpbmUgZGVzY3JpcHRpb24gaGFzIG5vIG1lYW5pbmcgdG8gdGhlCittYWNoaW5lLWluZGVwZW5kZW50IHBhcnQgb2YgR0RCLCBleGNlcHQgdGhhdCBpdCBpcyB1c2VkIHdoZW4gc2V0dGluZyB1cAorYSBuZXcgZnJhbWUgZnJvbSBzY3JhdGNoLCBhcyBmb2xsb3dzOgorCitAZXhhbXBsZQorICAgICAgY3JlYXRlX25ld19mcmFtZSAocmVhZF9yZWdpc3RlciAoRlBfUkVHTlVNKSwgcmVhZF9wYyAoKSkpOworQGVuZCBleGFtcGxlCisKK090aGVyIHRoYW4gdGhhdCwgYWxsIHRoZSBtZWFuaW5nIGltcGFydGVkIHRvIEBjb2Rle0ZQX1JFR05VTX0gaXMKK2ltcGFydGVkIGJ5IHRoZSBtYWNoaW5lLWRlcGVuZGVudCBjb2RlLiAgU28sIEBjb2Rle0ZQX1JFR05VTX0gY2FuIGhhdmUKK2FueSB2YWx1ZSB0aGF0IGlzIGNvbnZlbmllbnQgZm9yIHRoZSBjb2RlIHRoYXQgY3JlYXRlcyBuZXcgZnJhbWVzLgorKEBjb2Rle2NyZWF0ZV9uZXdfZnJhbWV9IGNhbGxzIEBjb2Rle0lOSVRfRVhUUkFfRlJBTUVfSU5GT30gaWYgaXQgaXMKK2RlZmluZWQ7IHRoYXQgaXMgd2hlcmUgeW91IHNob3VsZCB1c2UgdGhlIEBjb2Rle0ZQX1JFR05VTX0gdmFsdWUsIGlmCit5b3VyIGZyYW1lcyBhcmUgbm9uc3RhbmRhcmQuKQorCitHaXZlbiBhIEdEQiBmcmFtZSwgZGVmaW5lIEBjb2Rle0ZSQU1FX0NIQUlOfSB0byBkZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YKK3RoZSBjYWxsaW5nIGZ1bmN0aW9uJ3MgZnJhbWUuICBUaGlzIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBuZXcgR0RCCitmcmFtZSBzdHJ1Y3QsIGFuZCB0aGVuIEBjb2Rle0lOSVRfRVhUUkFfRlJBTUVfSU5GT30gYW5kCitAY29kZXtJTklUX0ZSQU1FX1BDfSB3aWxsIGJlIGNhbGxlZCBmb3IgdGhlIG5ldyBmcmFtZS4KKworQHNlY3Rpb24gQnJlYWtwb2ludCBIYW5kbGluZworCitJbiBnZW5lcmFsLCBhIGJyZWFrcG9pbnQgaXMgYSB1c2VyLWRlc2lnbmF0ZWQgbG9jYXRpb24gaW4gdGhlIHByb2dyYW0KK3doZXJlIHRoZSB1c2VyIHdhbnRzIHRvIHJlZ2FpbiBjb250cm9sIGlmIHByb2dyYW0gZXhlY3V0aW9uIGV2ZXIgcmVhY2hlcwordGhhdCBsb2NhdGlvbi4KKworVGhlcmUgYXJlIHR3byBtYWluIHdheXMgdG8gaW1wbGVtZW50IGJyZWFrcG9pbnRzOyBlaXRoZXIgYXMgYGBoYXJkd2FyZScnCiticmVha3BvaW50cyBvciBhcyBgYHNvZnR3YXJlJycgYnJlYWtwb2ludHMuCisKK0hhcmR3YXJlIGJyZWFrcG9pbnRzIGFyZSBzb21ldGltZXMgYXZhaWxhYmxlIGFzIGEgYnVpbHRpbiBkZWJ1Z2dpbmcKK2ZlYXR1cmVzIHdpdGggc29tZSBjaGlwcy4gIFR5cGljYWxseSB0aGVzZSB3b3JrIGJ5IGhhdmluZyBkZWRpY2F0ZWQKK3JlZ2lzdGVyIGludG8gd2hpY2ggdGhlIGJyZWFrcG9pbnQgYWRkcmVzcyBtYXkgYmUgc3RvcmVkLiAgSWYgdGhlIFBDCitldmVyIG1hdGNoZXMgYSB2YWx1ZSBpbiBhIGJyZWFrcG9pbnQgcmVnaXN0ZXJzLCB0aGUgQ1BVIHJhaXNlcyBhbgorZXhjZXB0aW9uIGFuZCByZXBvcnRzIGl0IHRvIEdEQi4gIEFub3RoZXIgcG9zc2liaWxpdHkgaXMgd2hlbiBhbgorZW11bGF0b3IgaXMgaW4gdXNlOyBtYW55IGVtdWxhdG9ycyBpbmNsdWRlIGNpcmN1aXRyeSB0aGF0IHdhdGNoZXMgdGhlCithZGRyZXNzIGxpbmVzIGNvbWluZyBvdXQgZnJvbSB0aGUgcHJvY2Vzc29yLCBhbmQgZm9yY2UgaXQgdG8gc3RvcCBpZiB0aGUKK2FkZHJlc3MgbWF0Y2hlcyBhIGJyZWFrcG9pbnQncyBhZGRyZXNzLiAgQSB0aGlyZCBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQordGFyZ2V0IGFscmVhZHkgaGFzIHRoZSBhYmlsaXR5IHRvIGRvIGJyZWFrcG9pbnRzIHNvbWVob3c7IGZvciBpbnN0YW5jZSwKK2EgUk9NIG1vbml0b3IgbWF5IGRvIGl0cyBvd24gc29mdHdhcmUgYnJlYWtwb2ludHMuICBTbyBhbHRob3VnaCB0aGVzZQorYXJlIG5vdCBsaXRlcmFsbHkgYGBoYXJkd2FyZSBicmVha3BvaW50cycnLCBmcm9tIEdEQidzIHBvaW50IG9mIHZpZXcKK3RoZXkgd29yayB0aGUgc2FtZTsgR0RCIG5lZWQgbm90IGRvIG5vdGhpbmcgbW9yZSB0aGFuIHNldCB0aGUgYnJlYWtwb2ludAorYW5kIHdhaXQgZm9yIHNvbWV0aGluZyB0byBoYXBwZW4uCisKK1NpbmNlIHRoZXkgZGVwZW5kIG9uIGhhcmR3YXJlIHJlc291cmNlcywgaGFyZHdhcmUgYnJlYWtwb2ludHMgbWF5IGJlCitsaW1pdGVkIGluIG51bWJlcjsgd2hlbiB0aGUgdXNlciBhc2tzIGZvciBtb3JlLCBHREIgd2lsbCBzdGFydCB0cnlpbmcgdG8KK3NldCBzb2Z0d2FyZSBicmVha3BvaW50cy4KKworU29mdHdhcmUgYnJlYWtwb2ludHMgcmVxdWlyZSBHREIgdG8gZG8gc29tZXdoYXQgbW9yZSB3b3JrLiAgVGhlIGJhc2ljCit0aGVvcnkgaXMgdGhhdCBHREIgd2lsbCByZXBsYWNlIGEgcHJvZ3JhbSBpbnN0cnVjdGlvbiBhIHRyYXAsIGlsbGVnYWwKK2RpdmlkZSwgb3Igc29tZSBvdGhlciBpbnN0cnVjdGlvbiB0aGF0IHdpbGwgY2F1c2UgYW4gZXhjZXB0aW9uLCBhbmQgdGhlbgord2hlbiBpdCdzIGVuY291bnRlcmVkLCBHREIgd2lsbCB0YWtlIHRoZSBleGNlcHRpb24gYW5kIHN0b3AgdGhlIHByb2dyYW0uCitXaGVuIHRoZSB1c2VyIHNheXMgdG8gY29udGludWUsIEdEQiB3aWxsIHJlc3RvcmUgdGhlIG9yaWdpbmFsCitpbnN0cnVjdGlvbiwgc2luZ2xlLXN0ZXAsIHJlLWluc2VydCB0aGUgdHJhcCwgYW5kIGNvbnRpbnVlIG9uLgorCitTaW5jZSBpdCBsaXRlcmFsbHkgb3ZlcndyaXRlcyB0aGUgcHJvZ3JhbSBiZWluZyB0ZXN0ZWQsIHRoZSBwcm9ncmFtIGFyZWEKK211c3QgYmUgd3JpdGVhYmxlLCBzbyB0aGlzIHRlY2huaXF1ZSB3b24ndCB3b3JrIG9uIHByb2dyYW1zIGluIFJPTS4gIEl0CitjYW4gYWxzbyBkaXN0b3J0IHRoZSBiZWhhdmlvciBvZiBwcm9ncmFtcyB0aGF0IGV4YW1pbmUgdGhlbXNlbHZlcywKK2FsdGhvdWdoIHRoZSBzaXR1YXRpb24gd291bGQgYmUgaGlnaGx5IHVudXN1YWwuCisKK0Fsc28sIHRoZSBzb2Z0d2FyZSBicmVha3BvaW50IGluc3RydWN0aW9uIHNob3VsZCBiZSB0aGUgc21hbGxlc3Qgc2l6ZSBvZgoraW5zdHJ1Y3Rpb24sIHNvIGl0IGRvZXNuJ3Qgb3ZlcndyaXRlIGFuIGluc3RydWN0aW9uIHRoYXQgbWlnaHQgYmUgYSBqdW1wCit0YXJnZXQsIGFuZCBjYXVzZSBkaXNhc3RlciB3aGVuIHRoZSBwcm9ncmFtIGp1bXBzIGludG8gdGhlIG1pZGRsZSBvZiB0aGUKK2JyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uICAoU3RyaWN0bHkgc3BlYWtpbmcsIHRoZSBicmVha3BvaW50IG11c3QgYmUgbm8KK2xhcmdlciB0aGFuIHRoZSBzbWFsbGVzdCBpbnRlcnZhbCBiZXR3ZWVuIGluc3RydWN0aW9ucyB0aGF0IG1heSBiZSBqdW1wCit0YXJnZXRzOyBwZXJoYXBzIHRoZXJlIGlzIGFuIGFyY2hpdGVjdHVyZSB3aGVyZSBvbmx5IGV2ZW4tbnVtYmVyZWQKK2luc3RydWN0aW9ucyBtYXkganVtcGVkIHRvLikgIE5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvciBhbiBpbnN0cnVjdGlvbgorc2V0IG5vdCB0byBoYXZlIGFueSBpbnN0cnVjdGlvbnMgdXNhYmxlIGZvciBhIHNvZnR3YXJlIGJyZWFrcG9pbnQsCithbHRob3VnaCBpbiBwcmFjdGljZSBvbmx5IHRoZSBBUkMgaGFzIGZhaWxlZCB0byBkZWZpbmUgc3VjaCBhbgoraW5zdHJ1Y3Rpb24uCisKK1RoZSBiYXNpYyBkZWZpbml0aW9uIG9mIHRoZSBzb2Z0d2FyZSBicmVha3BvaW50IGlzIHRoZSBtYWNybworQGNvZGV7QlJFQUtQT0lOVH0uCisKK0Jhc2ljIGJyZWFrcG9pbnQgb2JqZWN0IGhhbmRsaW5nIGlzIGluIEBmaWxle2JyZWFrcG9pbnQuY30uICBIb3dldmVyLAorbXVjaCBvZiB0aGUgaW50ZXJlc3RpbmcgYnJlYWtwb2ludCBhY3Rpb24gaXMgaW4gQGZpbGV7aW5mcnVuLmN9LgorCitAc2VjdGlvbiBTaW5nbGUgU3RlcHBpbmcKKworQHNlY3Rpb24gU2lnbmFsIEhhbmRsaW5nCisKK0BzZWN0aW9uIFRocmVhZCBIYW5kbGluZworCitAc2VjdGlvbiBJbmZlcmlvciBGdW5jdGlvbiBDYWxscworCitAc2VjdGlvbiBMb25nam1wIFN1cHBvcnQKKworR0RCIGhhcyBzdXBwb3J0IGZvciBmaWd1cmluZyBvdXQgdGhhdCB0aGUgdGFyZ2V0IGlzIGRvaW5nIGEKK0Bjb2Rle2xvbmdqbXB9IGFuZCBmb3Igc3RvcHBpbmcgYXQgdGhlIHRhcmdldCBvZiB0aGUganVtcCwgaWYgd2UgYXJlCitzdGVwcGluZy4gIFRoaXMgaXMgZG9uZSB3aXRoIGEgZmV3IHNwZWNpYWxpemVkIGludGVybmFsIGJyZWFrcG9pbnRzLAord2hpY2ggYXJlIHZpc2libGUgaW4gdGhlIEBjb2Rle21haW50IGluZm8gYnJlYWtwb2ludH0gY29tbWFuZC4KKworVG8gbWFrZSB0aGlzIHdvcmssIHlvdSBuZWVkIHRvIGRlZmluZSBhIG1hY3JvIGNhbGxlZAorQGNvZGV7R0VUX0xPTkdKTVBfVEFSR0VUfSwgd2hpY2ggd2lsbCBleGFtaW5lIHRoZSBAY29kZXtqbXBfYnVmfQorc3RydWN0dXJlIGFuZCBleHRyYWN0IHRoZSBsb25nam1wIHRhcmdldCBhZGRyZXNzLiAgU2luY2UgQGNvZGV7am1wX2J1Zn0KK2lzIHRhcmdldCBzcGVjaWZpYywgeW91IHdpbGwgbmVlZCB0byBkZWZpbmUgaXQgaW4gdGhlIGFwcHJvcHJpYXRlCitAZmlsZXt0bS1AdmFye3h5en0uaH0gZmlsZS4gIExvb2sgaW4gQGZpbGV7dG0tc3VuNG9zNC5ofSBhbmQKK0BmaWxle3NwYXJjLXRkZXAuY30gZm9yIGV4YW1wbGVzIG9mIGhvdyB0byBkbyB0aGlzLgorCitAbm9kZSBVc2VyIEludGVyZmFjZQorCitAY2hhcHRlciBVc2VyIEludGVyZmFjZQorCitHREIgaGFzIHNldmVyYWwgdXNlciBpbnRlcmZhY2VzLiAgQWx0aG91Z2ggdGhlIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UKK2lzIHRoZSBtb3N0IGNvbW1vbiBhbmQgbW9zdCBmYW1pbGlhciwgdGhlcmUgYXJlIG90aGVycy4KKworQHNlY3Rpb24gQ29tbWFuZCBJbnRlcnByZXRlcgorCitUaGUgY29tbWFuZCBpbnRlcnByZXRlciBpbiBHREIgaXMgZmFpcmx5IHNpbXBsZS4gIEl0IGlzIGRlc2lnbmVkIHRvCithbGxvdyBmb3IgdGhlIHNldCBvZiBjb21tYW5kcyB0byBiZSBhdWdtZW50ZWQgZHluYW1pY2FsbHksIGFuZCBhbHNvCitoYXMgYSByZWN1cnNpdmUgc3ViY29tbWFuZCBjYXBhYmlsaXR5LCB3aGVyZSB0aGUgZmlyc3QgYXJndW1lbnQgdG8KK2EgY29tbWFuZCBtYXkgaXRzZWxmIGRpcmVjdCBhIGxvb2t1cCBvbiBhIGRpZmZlcmVudCBjb21tYW5kIGxpc3QuCisKK0ZvciBpbnN0YW5jZSwgdGhlIEBjb2Rle3NldH0gY29tbWFuZCBqdXN0IHN0YXJ0cyBhIGxvb2t1cCBvbiB0aGUKK0Bjb2Rle3NldGxpc3R9IGNvbW1hbmQgbGlzdCwgd2hpbGUgQGNvZGV7c2V0IHRocmVhZH0gcmVjdXJzZXMKK3RvIHRoZSBAY29kZXtzZXRfdGhyZWFkX2NtZF9saXN0fS4KKworVG8gYWRkIGNvbW1hbmRzIGluIGdlbmVyYWwsIHVzZSBAY29kZXthZGRfY21kfS4gIEBjb2Rle2FkZF9jb219IGFkZHMgdG8KK3RoZSBtYWluIGNvbW1hbmQgbGlzdCwgYW5kIHNob3VsZCBiZSB1c2VkIGZvciB0aG9zZSBjb21tYW5kcy4gIFRoZSB1c3VhbAorcGxhY2UgdG8gYWRkIGNvbW1hbmRzIGlzIGluIHRoZSBAY29kZXtfaW5pdGlhbGl6ZV9AdmFye3h5en19IHJvdXRpbmVzIGF0IHRoZQorZW5kcyBvZiBtb3N0IHNvdXJjZSBmaWxlcy4KKworQHNlY3Rpb24gQ29uc29sZSBQcmludGluZworCitAc2VjdGlvbiBUVUkKKworQHNlY3Rpb24gbGliZ2RiCisKK0Bjb2Rle2xpYmdkYn0gd2FzIGFuIGFib3J0aXZlIHByb2plY3Qgb2YgeWVhcnMgYWdvLiAgVGhlIHRoZW9yeSB3YXMgdG8KK3Byb3ZpZGUgYW4gQVBJIHRvIEdEQidzIGZ1bmN0aW9uYWxpdHkuCisKK0Bub2RlIFN5bWJvbCBIYW5kbGluZworCitAY2hhcHRlciBTeW1ib2wgSGFuZGxpbmcKKworU3ltYm9scyBhcmUgYSBrZXkgcGFydCBvZiBHREIncyBvcGVyYXRpb24uICBTeW1ib2xzIGluY2x1ZGUgdmFyaWFibGVzLAorZnVuY3Rpb25zLCBhbmQgdHlwZXMuCisKK0BzZWN0aW9uIFN5bWJvbCBSZWFkaW5nCisKK0dEQiByZWFkcyBzeW1ib2xzIGZyb20gYGBzeW1ib2wgZmlsZXMnJy4gIFRoZSB1c3VhbCBzeW1ib2wgZmlsZSBpcyB0aGUKK2ZpbGUgY29udGFpbmluZyB0aGUgcHJvZ3JhbSB3aGljaCBHREIgaXMgZGVidWdnaW5nLiAgR0RCIGNhbiBiZSBkaXJlY3RlZAordG8gdXNlIGEgZGlmZmVyZW50IGZpbGUgZm9yIHN5bWJvbHMgKHdpdGggdGhlIEBjb2Rle3N5bWJvbC1maWxlfQorY29tbWFuZCksIGFuZCBpdCBjYW4gYWxzbyByZWFkIG1vcmUgc3ltYm9scyB2aWEgdGhlIGBgYWRkLWZpbGUnJyBhbmQKK2BgbG9hZCcnIGNvbW1hbmRzLCBvciB3aGlsZSByZWFkaW5nIHN5bWJvbHMgZnJvbSBzaGFyZWQgbGlicmFyaWVzLgorCitTeW1ib2wgZmlsZXMgYXJlIGluaXRpYWxseSBvcGVuZWQgYnkgY29kZSBpbiBAZmlsZXtzeW1maWxlLmN9IHVzaW5nIHRoZQorQkZEIGxpYnJhcnkuICBCRkQgaWRlbnRpZmllcyB0aGUgdHlwZSBvZiB0aGUgZmlsZSBieSBleGFtaW5pbmcgaXRzCitoZWFkZXIuICBAY29kZXtzeW1maWxlX2luaXR9IHRoZW4gdXNlcyB0aGlzIGlkZW50aWZpY2F0aW9uIHRvIGxvY2F0ZSBhCitzZXQgb2Ygc3ltYm9sLXJlYWRpbmcgZnVuY3Rpb25zLgorCitTeW1ib2wgcmVhZGluZyBtb2R1bGVzIGlkZW50aWZ5IHRoZW1zZWx2ZXMgdG8gR0RCIGJ5IGNhbGxpbmcKK0Bjb2Rle2FkZF9zeW10YWJfZm5zfSBkdXJpbmcgdGhlaXIgbW9kdWxlIGluaXRpYWxpemF0aW9uLiAgVGhlIGFyZ3VtZW50Cit0byBAY29kZXthZGRfc3ltdGFiX2Zuc30gaXMgYSBAY29kZXtzdHJ1Y3Qgc3ltX2Zuc30gd2hpY2ggY29udGFpbnMgdGhlCituYW1lIChvciBuYW1lIHByZWZpeCkgb2YgdGhlIHN5bWJvbCBmb3JtYXQsIHRoZSBsZW5ndGggb2YgdGhlIHByZWZpeCwKK2FuZCBwb2ludGVycyB0byBmb3VyIGZ1bmN0aW9ucy4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGF0IHZhcmlvdXMKK3RpbWVzIHRvIHByb2Nlc3Mgc3ltYm9sLWZpbGVzIHdob3NlIGlkZW50aWZpY2F0aW9uIG1hdGNoZXMgdGhlIHNwZWNpZmllZAorcHJlZml4LgorCitUaGUgZnVuY3Rpb25zIHN1cHBsaWVkIGJ5IGVhY2ggbW9kdWxlIGFyZToKKworQHRhYmxlIEBjb2RlCitAaXRlbSBAdmFye3h5en1fc3ltZmlsZV9pbml0KHN0cnVjdCBzeW1fZm5zICpzZikKKworQ2FsbGVkIGZyb20gQGNvZGV7c3ltYm9sX2ZpbGVfYWRkfSB3aGVuIHdlIGFyZSBhYm91dCB0byByZWFkIGEgbmV3CitzeW1ib2wgZmlsZS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGNsZWFuIHVwIGFueSBpbnRlcm5hbCBzdGF0ZSAocG9zc2libHkKK3Jlc3VsdGluZyBmcm9tIGhhbGYtcmVhZCBwcmV2aW91cyBmaWxlcywgZm9yIGV4YW1wbGUpIGFuZCBwcmVwYXJlIHRvCityZWFkIGEgbmV3IHN5bWJvbCBmaWxlLiBOb3RlIHRoYXQgdGhlIHN5bWJvbCBmaWxlIHdoaWNoIHdlIGFyZSByZWFkaW5nCittaWdodCBiZSBhIG5ldyAibWFpbiIgc3ltYm9sIGZpbGUsIG9yIG1pZ2h0IGJlIGEgc2Vjb25kYXJ5IHN5bWJvbCBmaWxlCit3aG9zZSBzeW1ib2xzIGFyZSBiZWluZyBhZGRlZCB0byB0aGUgZXhpc3Rpbmcgc3ltYm9sIHRhYmxlLgorCitUaGUgYXJndW1lbnQgdG8gQGNvZGV7QHZhcnt4eXp9X3N5bWZpbGVfaW5pdH0gaXMgYSBuZXdseSBhbGxvY2F0ZWQKK0Bjb2Rle3N0cnVjdCBzeW1fZm5zfSB3aG9zZSBAY29kZXtiZmR9IGZpZWxkIGNvbnRhaW5zIHRoZSBCRkQgZm9yIHRoZQorbmV3IHN5bWJvbCBmaWxlIGJlaW5nIHJlYWQuICBJdHMgQGNvZGV7cHJpdmF0ZX0gZmllbGQgaGFzIGJlZW4gemVyb2VkLAorYW5kIGNhbiBiZSBtb2RpZmllZCBhcyBkZXNpcmVkLiAgVHlwaWNhbGx5LCBhIHN0cnVjdCBvZiBwcml2YXRlCitpbmZvcm1hdGlvbiB3aWxsIGJlIEBjb2Rle21hbGxvY30nZCwgYW5kIGEgcG9pbnRlciB0byBpdCB3aWxsIGJlIHBsYWNlZAoraW4gdGhlIEBjb2Rle3ByaXZhdGV9IGZpZWxkLgorCitUaGVyZSBpcyBubyByZXN1bHQgZnJvbSBAY29kZXtAdmFye3h5en1fc3ltZmlsZV9pbml0fSwgYnV0IGl0IGNhbiBjYWxsCitAY29kZXtlcnJvcn0gaWYgaXQgZGV0ZWN0cyBhbiB1bmF2b2lkYWJsZSBwcm9ibGVtLgorCitAaXRlbSBAdmFye3h5en1fbmV3X2luaXQoKQorCitDYWxsZWQgZnJvbSBAY29kZXtzeW1ib2xfZmlsZV9hZGR9IHdoZW4gZGlzY2FyZGluZyBleGlzdGluZyBzeW1ib2xzLgorVGhpcyBmdW5jdGlvbiBuZWVkIG9ubHkgaGFuZGxlIHRoZSBzeW1ib2wtcmVhZGluZyBtb2R1bGUncyBpbnRlcm5hbAorc3RhdGU7IHRoZSBzeW1ib2wgdGFibGUgZGF0YSBzdHJ1Y3R1cmVzIHZpc2libGUgdG8gdGhlIHJlc3Qgb2YgR0RCIHdpbGwKK2JlIGRpc2NhcmRlZCBieSBAY29kZXtzeW1ib2xfZmlsZV9hZGR9LiAgSXQgaGFzIG5vIGFyZ3VtZW50cyBhbmQgbm8KK3Jlc3VsdC4gIEl0IG1heSBiZSBjYWxsZWQgYWZ0ZXIgQGNvZGV7QHZhcnt4eXp9X3N5bWZpbGVfaW5pdH0sIGlmIGEgbmV3CitzeW1ib2wgdGFibGUgaXMgYmVpbmcgcmVhZCwgb3IgbWF5IGJlIGNhbGxlZCBhbG9uZSBpZiBhbGwgc3ltYm9scyBhcmUKK3NpbXBseSBiZWluZyBkaXNjYXJkZWQuCisKK0BpdGVtIEB2YXJ7eHl6fV9zeW1maWxlX3JlYWQoc3RydWN0IHN5bV9mbnMgKnNmLCBDT1JFX0FERFIgYWRkciwgaW50IG1haW5saW5lKQorCitDYWxsZWQgZnJvbSBAY29kZXtzeW1ib2xfZmlsZV9hZGR9IHRvIGFjdHVhbGx5IHJlYWQgdGhlIHN5bWJvbHMgZnJvbSBhCitzeW1ib2wtZmlsZSBpbnRvIGEgc2V0IG9mIHBzeW10YWJzIG9yIHN5bXRhYnMuCisKK0Bjb2Rle3NmfSBwb2ludHMgdG8gdGhlIHN0cnVjdCBzeW1fZm5zIG9yaWdpbmFsbHkgcGFzc2VkIHRvCitAY29kZXtAdmFye3h5en1fc3ltX2luaXR9IGZvciBwb3NzaWJsZSBpbml0aWFsaXphdGlvbi4gIEBjb2Rle2FkZHJ9IGlzCit0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIGZpbGUncyBzcGVjaWZpZWQgc3RhcnQgYWRkcmVzcyBhbmQgaXRzIHRydWUKK2FkZHJlc3MgaW4gbWVtb3J5LiAgQGNvZGV7bWFpbmxpbmV9IGlzIDEgaWYgdGhpcyBpcyB0aGUgbWFpbiBzeW1ib2wKK3RhYmxlIGJlaW5nIHJlYWQsIGFuZCAwIGlmIGEgc2Vjb25kYXJ5IHN5bWJvbCBmaWxlIChlLmcuIHNoYXJlZCBsaWJyYXJ5CitvciBkeW5hbWljYWxseSBsb2FkZWQgZmlsZSkgaXMgYmVpbmcgcmVhZC5AcmVmaWxsCitAZW5kIHRhYmxlCisKK0luIGFkZGl0aW9uLCBpZiBhIHN5bWJvbC1yZWFkaW5nIG1vZHVsZSBjcmVhdGVzIHBzeW10YWJzIHdoZW4KK0B2YXJ7eHl6fV9zeW1maWxlX3JlYWQgaXMgY2FsbGVkLCB0aGVzZSBwc3ltdGFicyB3aWxsIGNvbnRhaW4gYSBwb2ludGVyCit0byBhIGZ1bmN0aW9uIEBjb2Rle0B2YXJ7eHl6fV9wc3ltdGFiX3RvX3N5bXRhYn0sIHdoaWNoIGNhbiBiZSBjYWxsZWQKK2Zyb20gYW55IHBvaW50IGluIHRoZSBHREIgc3ltYm9sLWhhbmRsaW5nIGNvZGUuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gQHZhcnt4eXp9X3BzeW10YWJfdG9fc3ltdGFiIChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdCkKKworQ2FsbGVkIGZyb20gQGNvZGV7cHN5bXRhYl90b19zeW10YWJ9IChvciB0aGUgUFNZTVRBQl9UT19TWU1UQUIgbWFjcm8pIGlmCit0aGUgcHN5bXRhYiBoYXMgbm90IGFscmVhZHkgYmVlbiByZWFkIGluIGFuZCBoYWQgaXRzIEBjb2Rle3BzdC0+c3ltdGFifQorcG9pbnRlciBzZXQuICBUaGUgYXJndW1lbnQgaXMgdGhlIHBzeW10YWIgdG8gYmUgZmxlc2hlZC1vdXQgaW50byBhCitzeW10YWIuICBVcG9uIHJldHVybiwgcHN0LT5yZWFkaW4gc2hvdWxkIGhhdmUgYmVlbiBzZXQgdG8gMSwgYW5kCitwc3QtPnN5bXRhYiBzaG91bGQgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIG5ldyBjb3JyZXNwb25kaW5nIHN5bXRhYiwgb3IKK3plcm8gaWYgdGhlcmUgd2VyZSBubyBzeW1ib2xzIGluIHRoYXQgcGFydCBvZiB0aGUgc3ltYm9sIGZpbGUuCitAZW5kIHRhYmxlCisKK0BzZWN0aW9uIFBhcnRpYWwgU3ltYm9sIFRhYmxlcworCitHREIgaGFzIHRocmVlIHR5cGVzIG9mIHN5bWJvbCB0YWJsZXMuCisKK0BpdGVtaXplIEBidWxsZXQKKworQGl0ZW0gZnVsbCBzeW1ib2wgdGFibGVzIChzeW10YWJzKS4gIFRoZXNlIGNvbnRhaW4gdGhlIG1haW4gaW5mb3JtYXRpb24KK2Fib3V0IHN5bWJvbHMgYW5kIGFkZHJlc3Nlcy4KKworQGl0ZW0gcGFydGlhbCBzeW1ib2wgdGFibGVzIChwc3ltdGFicykuICBUaGVzZSBjb250YWluIGVub3VnaAoraW5mb3JtYXRpb24gdG8ga25vdyB3aGVuIHRvIHJlYWQgdGhlIGNvcnJlc3BvbmRpbmcgcGFydCBvZiB0aGUgZnVsbAorc3ltYm9sIHRhYmxlLgorCitAaXRlbSBtaW5pbWFsIHN5bWJvbCB0YWJsZXMgKG1zeW10YWJzKS4gIFRoZXNlIGNvbnRhaW4gaW5mb3JtYXRpb24KK2dsZWFuZWQgZnJvbSBub24tZGVidWdnaW5nIHN5bWJvbHMuCisKK0BlbmQgaXRlbWl6ZQorCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHBhcnRpYWwgc3ltYm9sIHRhYmxlcy4KKworQSBwc3ltdGFiIGlzIGNvbnN0cnVjdGVkIGJ5IGRvaW5nIGEgdmVyeSBxdWljayBwYXNzIG92ZXIgYW4gZXhlY3V0YWJsZQorZmlsZSdzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFNtYWxsIGFtb3VudHMgb2YgaW5mb3JtYXRpb24gYXJlCitleHRyYWN0ZWQgLS0gZW5vdWdoIHRvIGlkZW50aWZ5IHdoaWNoIHBhcnRzIG9mIHRoZSBzeW1ib2wgdGFibGUgd2lsbAorbmVlZCB0byBiZSByZS1yZWFkIGFuZCBmdWxseSBkaWdlc3RlZCBsYXRlciwgd2hlbiB0aGUgdXNlciBuZWVkcyB0aGUKK2luZm9ybWF0aW9uLiAgVGhlIHNwZWVkIG9mIHRoaXMgcGFzcyBjYXVzZXMgR0RCIHRvIHN0YXJ0IHVwIHZlcnkKK3F1aWNrbHkuICBMYXRlciwgYXMgdGhlIGRldGFpbGVkIHJlcmVhZGluZyBvY2N1cnMsIGl0IG9jY3VycyBpbiBzbWFsbAorcGllY2VzLCBhdCB2YXJpb3VzIHRpbWVzLCBhbmQgdGhlIGRlbGF5IHRoZXJlZnJvbSBpcyBtb3N0bHkgaW52aXNpYmxlIHRvCit0aGUgdXNlci4KK0BjIChAeHJlZntTeW1ib2wgUmVhZGluZ30uKQorCitUaGUgc3ltYm9scyB0aGF0IHNob3cgdXAgaW4gYSBmaWxlJ3MgcHN5bXRhYiBzaG91bGQgYmUsIHJvdWdobHksIHRob3NlCit2aXNpYmxlIHRvIHRoZSBkZWJ1Z2dlcidzIHVzZXIgd2hlbiB0aGUgcHJvZ3JhbSBpcyBub3QgcnVubmluZyBjb2RlIGZyb20KK3RoYXQgZmlsZS4gIFRoZXNlIGluY2x1ZGUgZXh0ZXJuYWwgc3ltYm9scyBhbmQgdHlwZXMsIHN0YXRpYyBzeW1ib2xzIGFuZAordHlwZXMsIGFuZCBlbnVtIHZhbHVlcyBkZWNsYXJlZCBhdCBmaWxlIHNjb3BlLgorCitUaGUgcHN5bXRhYiBhbHNvIGNvbnRhaW5zIHRoZSByYW5nZSBvZiBpbnN0cnVjdGlvbiBhZGRyZXNzZXMgdGhhdCB0aGUKK2Z1bGwgc3ltYm9sIHRhYmxlIHdvdWxkIHJlcHJlc2VudC4KKworVGhlIGlkZWEgaXMgdGhhdCB0aGVyZSBhcmUgb25seSB0d28gd2F5cyBmb3IgdGhlIHVzZXIgKG9yIG11Y2ggb2YgdGhlCitjb2RlIGluIHRoZSBkZWJ1Z2dlcikgdG8gcmVmZXJlbmNlIGEgc3ltYm9sOgorCitAaXRlbWl6ZSBAYnVsbGV0CisKK0BpdGVtIGJ5IGl0cyBhZGRyZXNzCisoZS5nLiBleGVjdXRpb24gc3RvcHMgYXQgc29tZSBhZGRyZXNzIHdoaWNoIGlzIGluc2lkZSBhIGZ1bmN0aW9uIGluIHRoaXMKK2ZpbGUpLiAgVGhlIGFkZHJlc3Mgd2lsbCBiZSBub3RpY2VkIHRvIGJlIGluIHRoZSByYW5nZSBvZiB0aGlzIHBzeW10YWIsCithbmQgdGhlIGZ1bGwgc3ltdGFiIHdpbGwgYmUgcmVhZCBpbi4gIEBjb2Rle2ZpbmRfcGNfZnVuY3Rpb259LAorQGNvZGV7ZmluZF9wY19saW5lfSwgYW5kIG90aGVyIEBjb2Rle2ZpbmRfcGNfQGRvdHN7fX0gZnVuY3Rpb25zIGhhbmRsZQordGhpcy4KKworQGl0ZW0gYnkgaXRzIG5hbWUKKyhlLmcuIHRoZSB1c2VyIGFza3MgdG8gcHJpbnQgYSB2YXJpYWJsZSwgb3Igc2V0IGEgYnJlYWtwb2ludCBvbiBhCitmdW5jdGlvbikuICBHbG9iYWwgbmFtZXMgYW5kIGZpbGUtc2NvcGUgbmFtZXMgd2lsbCBiZSBmb3VuZCBpbiB0aGUKK3BzeW10YWIsIHdoaWNoIHdpbGwgY2F1c2UgdGhlIHN5bXRhYiB0byBiZSBwdWxsZWQgaW4uICBMb2NhbCBuYW1lcyB3aWxsCitoYXZlIHRvIGJlIHF1YWxpZmllZCBieSBhIGdsb2JhbCBuYW1lLCBvciBhIGZpbGUtc2NvcGUgbmFtZSwgaW4gd2hpY2gKK2Nhc2Ugd2Ugd2lsbCBoYXZlIGFscmVhZHkgcmVhZCBpbiB0aGUgc3ltdGFiIGFzIHdlIGV2YWx1YXRlZCB0aGUKK3F1YWxpZmllci4gIE9yLCBhIGxvY2FsIHN5bWJvbCBjYW4gYmUgcmVmZXJlbmNlZCB3aGVuIHdlIGFyZSAiaW4iIGEKK2xvY2FsIHNjb3BlLCBpbiB3aGljaCBjYXNlIHRoZSBmaXJzdCBjYXNlIGFwcGxpZXMuICBAY29kZXtsb29rdXBfc3ltYm9sfQorZG9lcyBtb3N0IG9mIHRoZSB3b3JrIGhlcmUuCisKK0BlbmQgaXRlbWl6ZQorCitUaGUgb25seSByZWFzb24gdGhhdCBwc3ltdGFicyBleGlzdCBpcyB0byBjYXVzZSBhIHN5bXRhYiB0byBiZSByZWFkIGluCithdCB0aGUgcmlnaHQgbW9tZW50LiAgQW55IHN5bWJvbCB0aGF0IGNhbiBiZSBlbGlkZWQgZnJvbSBhIHBzeW10YWIsCit3aGlsZSBzdGlsbCBjYXVzaW5nIHRoYXQgdG8gaGFwcGVuLCBzaG91bGQgbm90IGFwcGVhciBpbiBpdC4gIFNpbmNlCitwc3ltdGFicyBkb24ndCBoYXZlIHRoZSBpZGVhIG9mIHNjb3BlLCB5b3UgY2FuJ3QgcHV0IGxvY2FsIHN5bWJvbHMgaW4KK3RoZW0gYW55d2F5LiAgUHN5bXRhYnMgZG9uJ3QgaGF2ZSB0aGUgaWRlYSBvZiB0aGUgdHlwZSBvZiBhIHN5bWJvbCwKK2VpdGhlciwgc28gdHlwZXMgbmVlZCBub3QgYXBwZWFyLCB1bmxlc3MgdGhleSB3aWxsIGJlIHJlZmVyZW5jZWQgYnkKK25hbWUuCisKK0l0IGlzIGEgYnVnIGZvciBHREIgdG8gYmVoYXZlIG9uZSB3YXkgd2hlbiBvbmx5IGEgcHN5bXRhYiBoYXMgYmVlbiByZWFkLAorYW5kIGFub3RoZXIgd2F5IGlmIHRoZSBjb3JyZXNwb25kaW5nIHN5bXRhYiBoYXMgYmVlbiByZWFkIGluLiAgU3VjaCBidWdzCithcmUgdHlwaWNhbGx5IGNhdXNlZCBieSBhIHBzeW10YWIgdGhhdCBkb2VzIG5vdCBjb250YWluIGFsbCB0aGUgdmlzaWJsZQorc3ltYm9scywgb3Igd2hpY2ggaGFzIHRoZSB3cm9uZyBpbnN0cnVjdGlvbiBhZGRyZXNzIHJhbmdlcy4KKworVGhlIHBzeW10YWIgZm9yIGEgcGFydGljdWxhciBzZWN0aW9uIG9mIGEgc3ltYm9sLWZpbGUgKG9iamZpbGUpIGNvdWxkIGJlCit0aHJvd24gYXdheSBhZnRlciB0aGUgc3ltdGFiIGhhcyBiZWVuIHJlYWQgaW4uICBUaGUgc3ltdGFiIHNob3VsZCBhbHdheXMKK2JlIHNlYXJjaGVkIGJlZm9yZSB0aGUgcHN5bXRhYiwgc28gdGhlIHBzeW10YWIgd2lsbCBuZXZlciBiZSB1c2VkIChpbiBhCitidWctZnJlZSBlbnZpcm9ubWVudCkuICBDdXJyZW50bHksIHBzeW10YWJzIGFyZSBhbGxvY2F0ZWQgb24gYW4gb2JzdGFjaywKK2FuZCBhbGwgdGhlIHBzeW1ib2xzIHRoZW1zZWx2ZXMgYXJlIGFsbG9jYXRlZCBpbiBhIHBhaXIgb2YgbGFyZ2UgYXJyYXlzCitvbiBhbiBvYnN0YWNrLCBzbyB0aGVyZSBpcyBsaXR0bGUgdG8gYmUgZ2FpbmVkIGJ5IHRyeWluZyB0byBmcmVlIHRoZW0KK3VubGVzcyB5b3Ugd2FudCB0byBkbyBhIGxvdCBtb3JlIHdvcmsuCisKK0BzZWN0aW9uIFR5cGVzCisKK0Z1bmRhbWVudGFsIFR5cGVzIChlLmcuLCBGVF9WT0lELCBGVF9CT09MRUFOKS4KKworVGhlc2UgYXJlIHRoZSBmdW5kYW1lbnRhbCB0eXBlcyB0aGF0IEdEQiB1c2VzIGludGVybmFsbHkuICBGdW5kYW1lbnRhbAordHlwZXMgZnJvbSB0aGUgdmFyaW91cyBkZWJ1Z2dpbmcgZm9ybWF0cyAoc3RhYnMsIEVMRiwgZXRjKSBhcmUgbWFwcGVkCitpbnRvIG9uZSBvZiB0aGVzZS4gIFRoZXkgYXJlIGJhc2ljYWxseSBhIHVuaW9uIG9mIGFsbCBmdW5kYW1lbnRhbCB0eXBlcwordGhhdCBnZGIga25vd3MgYWJvdXQgZm9yIGFsbCB0aGUgbGFuZ3VhZ2VzIHRoYXQgR0RCIGtub3dzIGFib3V0LgorCitUeXBlIENvZGVzIChlLmcuLCBUWVBFX0NPREVfUFRSLCBUWVBFX0NPREVfQVJSQVkpLgorCitFYWNoIHRpbWUgR0RCIGJ1aWxkcyBhbiBpbnRlcm5hbCB0eXBlLCBpdCBtYXJrcyBpdCB3aXRoIG9uZSBvZiB0aGVzZQordHlwZXMuICBUaGUgdHlwZSBtYXkgYmUgYSBmdW5kYW1lbnRhbCB0eXBlLCBzdWNoIGFzIFRZUEVfQ09ERV9JTlQsIG9yIGEKK2Rlcml2ZWQgdHlwZSwgc3VjaCBhcyBUWVBFX0NPREVfUFRSIHdoaWNoIGlzIGEgcG9pbnRlciB0byBhbm90aGVyIHR5cGUuCitUeXBpY2FsbHksIHNldmVyYWwgRlRfKiB0eXBlcyBtYXAgdG8gb25lIFRZUEVfQ09ERV8qIHR5cGUsIGFuZCBhcmUKK2Rpc3Rpbmd1aXNoZWQgYnkgb3RoZXIgbWVtYmVycyBvZiB0aGUgdHlwZSBzdHJ1Y3QsIHN1Y2ggYXMgd2hldGhlciB0aGUKK3R5cGUgaXMgc2lnbmVkIG9yIHVuc2lnbmVkLCBhbmQgaG93IG1hbnkgYml0cyBpdCB1c2VzLgorCitCdWlsdGluIFR5cGVzIChlLmcuLCBidWlsdGluX3R5cGVfdm9pZCwgYnVpbHRpbl90eXBlX2NoYXIpLgorCitUaGVzZSBhcmUgaW5zdGFuY2VzIG9mIHR5cGUgc3RydWN0cyB0aGF0IHJvdWdobHkgY29ycmVzcG9uZCB0bworZnVuZGFtZW50YWwgdHlwZXMgYW5kIGFyZSBjcmVhdGVkIGFzIGdsb2JhbCB0eXBlcyBmb3IgR0RCIHRvIHVzZSBmb3IKK3ZhcmlvdXMgdWdseSBoaXN0b3JpY2FsIHJlYXNvbnMuICBXZSBldmVudHVhbGx5IHdhbnQgdG8gZWxpbWluYXRlIHRoZXNlLgorTm90ZSBmb3IgZXhhbXBsZSB0aGF0IGJ1aWx0aW5fdHlwZV9pbnQgaW5pdGlhbGl6ZWQgaW4gZ2RidHlwZXMuYyBpcworYmFzaWNhbGx5IHRoZSBzYW1lIGFzIGEgVFlQRV9DT0RFX0lOVCB0eXBlIHRoYXQgaXMgaW5pdGlhbGl6ZWQgaW4KK2MtbGFuZy5jIGZvciBhbiBGVF9JTlRFR0VSIGZ1bmRhbWVudGFsIHR5cGUuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQorYnVpbHRpbl90eXBlIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHBhcnRpY3VsYXIgb2JqZmlsZSwgYW5kIG9ubHkgb25lCitpbnN0YW5jZSBleGlzdHMsIHdoaWxlIGMtbGFuZy5jIGJ1aWxkcyBhcyBtYW55IFRZUEVfQ09ERV9JTlQgdHlwZXMgYXMKK25lZWRlZCwgd2l0aCBlYWNoIG9uZSBhc3NvY2lhdGVkIHdpdGggc29tZSBwYXJ0aWN1bGFyIG9iamZpbGUuCisKK0BzZWN0aW9uIE9iamVjdCBGaWxlIEZvcm1hdHMKKworQHN1YnNlY3Rpb24gYS5vdXQKKworVGhlIEBmaWxle2Eub3V0fSBmb3JtYXQgaXMgdGhlIG9yaWdpbmFsIGZpbGUgZm9ybWF0IGZvciBVbml4LiAgSXQKK2NvbnNpc3RzIG9mIHRocmVlIHNlY3Rpb25zOiB0ZXh0LCBkYXRhLCBhbmQgYnNzLCB3aGljaCBhcmUgZm9yIHByb2dyYW0KK2NvZGUsIGluaXRpYWxpemVkIGRhdGEsIGFuZCB1bmluaXRpYWxpemVkIGRhdGEsIHJlc3BlY3RpdmVseS4KKworVGhlIEBmaWxle2Eub3V0fSBmb3JtYXQgaXMgc28gc2ltcGxlIHRoYXQgaXQgZG9lc24ndCBoYXZlIGFueSByZXNlcnZlZAorcGxhY2UgZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIChIZXksIHRoZSBvcmlnaW5hbCBVbml4IGhhY2tlcnMgdXNlZAorQGZpbGV7YWRifSwgd2hpY2ggaXMgYSBtYWNoaW5lLWxhbmd1YWdlIGRlYnVnZ2VyLikgIFRoZSBvbmx5IGRlYnVnZ2luZworZm9ybWF0IGZvciBAZmlsZXthLm91dH0gaXMgc3RhYnMsIHdoaWNoIGlzIGVuY29kZWQgYXMgYSBzZXQgb2Ygbm9ybWFsCitzeW1ib2xzIHdpdGggZGlzdGluY3RpdmUgYXR0cmlidXRlcy4KKworVGhlIGJhc2ljIEBmaWxle2Eub3V0fSByZWFkZXIgaXMgaW4gQGZpbGV7ZGJ4cmVhZC5jfS4KKworQHN1YnNlY3Rpb24gQ09GRgorCitUaGUgQ09GRiBmb3JtYXQgd2FzIGludHJvZHVjZWQgd2l0aCBTeXN0ZW0gViBSZWxlYXNlIDMgKFNWUjMpIFVuaXguCitDT0ZGIGZpbGVzIG1heSBoYXZlIG11bHRpcGxlIHNlY3Rpb25zLCBlYWNoIHByZWZpeGVkIGJ5IGEgaGVhZGVyLiAgVGhlCitudW1iZXIgb2Ygc2VjdGlvbnMgaXMgbGltaXRlZC4KKworVGhlIENPRkYgc3BlY2lmaWNhdGlvbiBpbmNsdWRlcyBzdXBwb3J0IGZvciBkZWJ1Z2dpbmcuICBBbHRob3VnaCB0aGlzCit3YXMgYSBzdGVwIGZvcndhcmQsIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2FzIHdvZWZ1bGx5IGxpbWl0ZWQuICBGb3IKK2luc3RhbmNlLCBpdCB3YXMgbm90IHBvc3NpYmxlIHRvIHJlcHJlc2VudCBjb2RlIHRoYXQgY2FtZSBmcm9tIGFuCitpbmNsdWRlZCBmaWxlLgorCitUaGUgQ09GRiByZWFkZXIgaXMgaW4gQGZpbGV7Y29mZnJlYWQuY30uCisKK0BzdWJzZWN0aW9uIEVDT0ZGCisKK0VDT0ZGIGlzIGFuIGV4dGVuZGVkIENPRkYgb3JpZ2luYWxseSBpbnRyb2R1Y2VkIGZvciBNaXBzIGFuZCBBbHBoYQord29ya3N0YXRpb25zLgorCitUaGUgYmFzaWMgRUNPRkYgcmVhZGVyIGlzIGluIEBmaWxle21pcHNyZWFkLmN9LgorCitAc3Vic2VjdGlvbiBYQ09GRgorCitUaGUgSUJNIFJTLzYwMDAgcnVubmluZyBBSVggdXNlcyBhbiBvYmplY3QgZmlsZSBmb3JtYXQgY2FsbGVkIFhDT0ZGLgorVGhlIENPRkYgc2VjdGlvbnMsIHN5bWJvbHMsIGFuZCBsaW5lIG51bWJlcnMgYXJlIHVzZWQsIGJ1dCBkZWJ1Z2dpbmcKK3N5bWJvbHMgYXJlIGRieC1zdHlsZSBzdGFicyB3aG9zZSBzdHJpbmdzIGFyZSBsb2NhdGVkIGluIHRoZQorQHNhbXB7LmRlYnVnfSBzZWN0aW9uIChyYXRoZXIgdGhhbiB0aGUgc3RyaW5nIHRhYmxlKS4gIEZvciBtb3JlCitpbmZvcm1hdGlvbiwgc2VlIEB4cmVme1RvcCwsLHN0YWJzLFRoZSBTdGFicyBEZWJ1Z2dpbmcgRm9ybWF0fS4KKworVGhlIHNoYXJlZCBsaWJyYXJ5IHNjaGVtZSBoYXMgYSBjbGVhbiBpbnRlcmZhY2UgZm9yIGZpZ3VyaW5nIG91dCB3aGF0CitzaGFyZWQgbGlicmFyaWVzIGFyZSBpbiB1c2UsIGJ1dCB0aGUgY2F0Y2ggaXMgdGhhdCBldmVyeXRoaW5nIHdoaWNoCityZWZlcnMgdG8gYWRkcmVzc2VzIChzeW1ib2wgdGFibGVzIGFuZCBicmVha3BvaW50cyBhdCBsZWFzdCkgbmVlZHMgdG8gYmUKK3JlbG9jYXRlZCBmb3IgYm90aCBzaGFyZWQgbGlicmFyaWVzIGFuZCB0aGUgbWFpbiBleGVjdXRhYmxlLiAgQXQgbGVhc3QKK3VzaW5nIHRoZSBzdGFuZGFyZCBtZWNoYW5pc20gdGhpcyBjYW4gb25seSBiZSBkb25lIG9uY2UgdGhlIHByb2dyYW0gaGFzCitiZWVuIHJ1biAob3IgdGhlIGNvcmUgZmlsZSBoYXMgYmVlbiByZWFkKS4KKworQHN1YnNlY3Rpb24gUEUKKworV2luZG93cyA5NSBhbmQgTlQgdXNlIHRoZSBQRSAoUG9ydGFibGUgRXhlY3V0YWJsZSkgZm9ybWF0IGZvciB0aGVpcgorZXhlY3V0YWJsZXMuICBQRSBpcyBiYXNpY2FsbHkgQ09GRiB3aXRoIGFkZGl0aW9uYWwgaGVhZGVycy4KKworV2hpbGUgQkZEIGluY2x1ZGVzIHNwZWNpYWwgUEUgc3VwcG9ydCwgR0RCIG5lZWRzIG9ubHkgdGhlIGJhc2ljCitDT0ZGIHJlYWRlci4KKworQHN1YnNlY3Rpb24gRUxGCisKK1RoZSBFTEYgZm9ybWF0IGNhbWUgd2l0aCBTeXN0ZW0gViBSZWxlYXNlIDQgKFNWUjQpIFVuaXguICBFTEYgaXMgc2ltaWxhcgordG8gQ09GRiBpbiBiZWluZyBvcmdhbml6ZWQgaW50byBhIG51bWJlciBvZiBzZWN0aW9ucywgYnV0IGl0IHJlbW92ZXMKK21hbnkgb2YgQ09GRidzIGxpbWl0YXRpb25zLgorCitUaGUgYmFzaWMgRUxGIHJlYWRlciBpcyBpbiBAZmlsZXtlbGZyZWFkLmN9LgorCitAc3Vic2VjdGlvbiBTT00KKworU09NIGlzIEhQJ3Mgb2JqZWN0IGZpbGUgYW5kIGRlYnVnIGZvcm1hdCAobm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggSUJNJ3MKK1NPTSwgd2hpY2ggaXMgYSBjcm9zcy1sYW5ndWFnZSBBQkkpLgorCitUaGUgU09NIHJlYWRlciBpcyBpbiBAZmlsZXtocHJlYWQuY30uCisKK0BzdWJzZWN0aW9uIE90aGVyIEZpbGUgRm9ybWF0cworCitPdGhlciBmaWxlIGZvcm1hdHMgdGhhdCBoYXZlIGJlZW4gc3VwcG9ydGVkIGJ5IEdEQiBpbmNsdWRlIE5ldHdhcmUKK0xvYWRhYmxlIE1vZHVsZXMgKEBmaWxle25sbXJlYWQuY30uCisKK0BzZWN0aW9uIERlYnVnZ2luZyBGaWxlIEZvcm1hdHMKKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBjaGFyYWN0ZXJpc3RpY3Mgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRoYXQKK2FyZSBpbmRlcGVuZGVudCBvZiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LgorCitAc3Vic2VjdGlvbiBzdGFicworCitAY29kZXtzdGFic30gc3RhcnRlZCBvdXQgYXMgc3BlY2lhbCBzeW1ib2xzIHdpdGhpbiB0aGUgQGNvZGV7YS5vdXR9Citmb3JtYXQuICBTaW5jZSB0aGVuLCBpdCBoYXMgYmVlbiBlbmNhcHN1bGF0ZWQgaW50byBvdGhlciBmaWxlCitmb3JtYXRzLCBzdWNoIGFzIENPRkYgYW5kIEVMRi4KKworV2hpbGUgQGZpbGV7ZGJ4cmVhZC5jfSBkb2VzIHNvbWUgb2YgdGhlIGJhc2ljIHN0YWIgcHJvY2Vzc2luZywKK2luY2x1ZGluZyBmb3IgZW5jYXBzdWxhdGVkIHZlcnNpb25zLCBAZmlsZXtzdGFic3JlYWQuY30gZG9lcwordGhlIHJlYWwgd29yay4KKworQHN1YnNlY3Rpb24gQ09GRgorCitUaGUgYmFzaWMgQ09GRiBkZWZpbml0aW9uIGluY2x1ZGVzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoZSBsZXZlbAorb2Ygc3VwcG9ydCBpcyBtaW5pbWFsIGFuZCBub24tZXh0ZW5zaWJsZSwgYW5kIGlzIG5vdCBvZnRlbiB1c2VkLgorCitAc3Vic2VjdGlvbiBNaXBzIGRlYnVnIChUaGlyZCBFeWUpCisKK0VDT0ZGIGluY2x1ZGVzIGEgZGVmaW5pdGlvbiBvZiBhIHNwZWNpYWwgZGVidWcgZm9ybWF0LgorCitUaGUgZmlsZSBAZmlsZXttZGVidWdyZWFkLmN9IGltcGxlbWVudHMgcmVhZGluZyBmb3IgdGhpcyBmb3JtYXQuCisKK0BzdWJzZWN0aW9uIERXQVJGIDEKKworRFdBUkYgMSBpcyBhIGRlYnVnZ2luZyBmb3JtYXQgdGhhdCB3YXMgb3JpZ2luYWxseSBkZXNpZ25lZCB0byBiZQordXNlZCB3aXRoIEVMRiBpbiBTVlI0IHN5c3RlbXMuCisKK0BjIENISUxMX1BST0RVQ0VSCitAYyBHQ0NfUFJPRFVDRVIKK0BjIEdQTFVTX1BST0RVQ0VSCitAYyBMQ0NfUFJPRFVDRVIKK0BjIElmIGRlZmluZWQsIHRoZXNlIGFyZSB0aGUgcHJvZHVjZXIgc3RyaW5ncyBpbiBhIERXQVJGIDEgZmlsZS4gIEFsbCBvZgorQGMgdGhlc2UgaGF2ZSByZWFzb25hYmxlIGRlZmF1bHRzIGFscmVhZHkuCisKK1RoZSBEV0FSRiAxIHJlYWRlciBpcyBpbiBAZmlsZXtkd2FyZnJlYWQuY30uCisKK0BzdWJzZWN0aW9uIERXQVJGIDIKKworRFdBUkYgMiBpcyBhbiBpbXByb3ZlZCBidXQgaW5jb21wYXRpYmxlIHZlcnNpb24gb2YgRFdBUkYgMS4KKworVGhlIERXQVJGIDIgcmVhZGVyIGlzIGluIEBmaWxle2R3YXJmMnJlYWQuY30uCisKK0BzdWJzZWN0aW9uIFNPTQorCitMaWtlIENPRkYsIHRoZSBTT00gZGVmaW5pdGlvbiBpbmNsdWRlcyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisKK0BzZWN0aW9uIEFkZGluZyBhIE5ldyBTeW1ib2wgUmVhZGVyIHRvIEdEQgorCitJZiB5b3UgYXJlIHVzaW5nIGFuIGV4aXN0aW5nIG9iamVjdCBmaWxlIGZvcm1hdCAoYS5vdXQsIENPRkYsIEVMRiwgZXRjKSwKK3RoZXJlIGlzIHByb2JhYmx5IGxpdHRsZSB0byBiZSBkb25lLgorCitJZiB5b3UgbmVlZCB0byBhZGQgYSBuZXcgb2JqZWN0IGZpbGUgZm9ybWF0LCB5b3UgbXVzdCBmaXJzdCBhZGQgaXQgdG8KK0JGRC4gIFRoaXMgaXMgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIGRvY3VtZW50LgorCitZb3UgbXVzdCB0aGVuIGFycmFuZ2UgZm9yIHRoZSBCRkQgY29kZSB0byBwcm92aWRlIGFjY2VzcyB0byB0aGUKK2RlYnVnZ2luZyBzeW1ib2xzLiAgR2VuZXJhbGx5IEdEQiB3aWxsIGhhdmUgdG8gY2FsbCBzd2FwcGluZyByb3V0aW5lcworZnJvbSBCRkQgYW5kIGEgZmV3IG90aGVyIEJGRCBpbnRlcm5hbCByb3V0aW5lcyB0byBsb2NhdGUgdGhlIGRlYnVnZ2luZworaW5mb3JtYXRpb24uICBBcyBtdWNoIGFzIHBvc3NpYmxlLCBHREIgc2hvdWxkIG5vdCBkZXBlbmQgb24gdGhlIEJGRAoraW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLgorCitGb3Igc29tZSB0YXJnZXRzIChlLmcuLCBDT0ZGKSwgdGhlcmUgaXMgYSBzcGVjaWFsIHRyYW5zZmVyIHZlY3RvciB1c2VkCit0byBjYWxsIHN3YXBwaW5nIHJvdXRpbmVzLCBzaW5jZSB0aGUgZXh0ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIG9uIHZhcmlvdXMKK3BsYXRmb3JtcyBoYXZlIGRpZmZlcmVudCBzaXplcyBhbmQgbGF5b3V0cy4gIFNwZWNpYWxpemVkIHJvdXRpbmVzIHRoYXQKK3dpbGwgb25seSBldmVyIGJlIGltcGxlbWVudGVkIGJ5IG9uZSBvYmplY3QgZmlsZSBmb3JtYXQgbWF5IGJlIGNhbGxlZAorZGlyZWN0bHkuICBUaGlzIGludGVyZmFjZSBzaG91bGQgYmUgZGVzY3JpYmVkIGluIGEgZmlsZQorQGZpbGV7YmZkL2xpYnh5ei5ofSwgd2hpY2ggaXMgaW5jbHVkZWQgYnkgR0RCLgorCisKK0Bub2RlIExhbmd1YWdlIFN1cHBvcnQKKworQGNoYXB0ZXIgTGFuZ3VhZ2UgU3VwcG9ydAorCitHREIncyBsYW5ndWFnZSBzdXBwb3J0IGlzIG1haW5seSBkcml2ZW4gYnkgdGhlIHN5bWJvbCByZWFkZXIsIGFsdGhvdWdoCitpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHVzZXIgdG8gc2V0IHRoZSBzb3VyY2UgbGFuZ3VhZ2UgbWFudWFsbHkuCisKK0dEQiBjaG9vc2VzIHRoZSBzb3VyY2UgbGFuZ3VhZ2UgYnkgbG9va2luZyBhdCB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlCityZWNvcmRlZCBpbiB0aGUgZGVidWcgaW5mbzsgQGNvZGV7LmN9IG1lYW5zIEMsIEBjb2Rley5mfSBtZWFucyBGb3J0cmFuLAorZXRjLiAgSXQgbWF5IGFsc28gdXNlIGEgc3BlY2lhbC1wdXJwb3NlIGxhbmd1YWdlIGlkZW50aWZpZXIgaWYgdGhlIGRlYnVnCitmb3JtYXQgc3VwcG9ydHMgaXQsIHN1Y2ggYXMgRFdBUkYuCisKK0BzZWN0aW9uIEFkZGluZyBhIFNvdXJjZSBMYW5ndWFnZSB0byBHREIKKworVG8gYWRkIG90aGVyIGxhbmd1YWdlcyB0byBHREIncyBleHByZXNzaW9uIHBhcnNlciwgZm9sbG93IHRoZSBmb2xsb3dpbmcKK3N0ZXBzOgorCitAdGFibGUgQGVtcGgKK0BpdGVtIENyZWF0ZSB0aGUgZXhwcmVzc2lvbiBwYXJzZXIuCisKK1RoaXMgc2hvdWxkIHJlc2lkZSBpbiBhIGZpbGUgQGZpbGV7QHZhcntsYW5nfS1leHAueX0uICBSb3V0aW5lcyBmb3IKK2J1aWxkaW5nIHBhcnNlZCBleHByZXNzaW9ucyBpbnRvIGEgQHNhbXB7dW5pb24gZXhwX2VsZW1lbnR9IGxpc3QgYXJlIGluCitAZmlsZXtwYXJzZS5jfS4KKworU2luY2Ugd2UgY2FuJ3QgZGVwZW5kIHVwb24gZXZlcnlvbmUgaGF2aW5nIEJpc29uLCBhbmQgWUFDQyBwcm9kdWNlcworcGFyc2VycyB0aGF0IGRlZmluZSBhIGJ1bmNoIG9mIGdsb2JhbCBuYW1lcywgdGhlIGZvbGxvd2luZyBsaW5lcworQGVtcGh7bXVzdH0gYmUgaW5jbHVkZWQgYXQgdGhlIHRvcCBvZiB0aGUgWUFDQyBwYXJzZXIsIHRvIHByZXZlbnQgdGhlCit2YXJpb3VzIHBhcnNlcnMgZnJvbSBkZWZpbmluZyB0aGUgc2FtZSBnbG9iYWwgbmFtZXM6CisKK0BleGFtcGxlCisjZGVmaW5lIHl5cGFyc2UgCUB2YXJ7bGFuZ31fcGFyc2UKKyNkZWZpbmUgeXlsZXggCUB2YXJ7bGFuZ31fbGV4CisjZGVmaW5lIHl5ZXJyb3IgCUB2YXJ7bGFuZ31fZXJyb3IKKyNkZWZpbmUgeXlsdmFsIAlAdmFye2xhbmd9X2x2YWwKKyNkZWZpbmUgeXljaGFyIAlAdmFye2xhbmd9X2NoYXIKKyNkZWZpbmUgeXlkZWJ1ZyAJQHZhcntsYW5nfV9kZWJ1ZworI2RlZmluZSB5eXBhY3QgIAlAdmFye2xhbmd9X3BhY3QgCisjZGVmaW5lIHl5cjEJCUB2YXJ7bGFuZ31fcjEgICAKKyNkZWZpbmUgeXlyMgkJQHZhcntsYW5nfV9yMiAgIAorI2RlZmluZSB5eWRlZgkJQHZhcntsYW5nfV9kZWYgIAorI2RlZmluZSB5eWNoawkJQHZhcntsYW5nfV9jaGsgIAorI2RlZmluZSB5eXBnbwkJQHZhcntsYW5nfV9wZ28gIAorI2RlZmluZSB5eWFjdCAgCUB2YXJ7bGFuZ31fYWN0ICAKKyNkZWZpbmUgeXlleGNhICAJQHZhcntsYW5nfV9leGNhCisjZGVmaW5lIHl5ZXJyZmxhZyAgCUB2YXJ7bGFuZ31fZXJyZmxhZworI2RlZmluZSB5eW5lcnJzICAJQHZhcntsYW5nfV9uZXJycworQGVuZCBleGFtcGxlCisKK0F0IHRoZSBib3R0b20gb2YgeW91ciBwYXJzZXIsIGRlZmluZSBhIEBjb2Rle3N0cnVjdCBsYW5ndWFnZV9kZWZufSBhbmQKK2luaXRpYWxpemUgaXQgd2l0aCB0aGUgcmlnaHQgdmFsdWVzIGZvciB5b3VyIGxhbmd1YWdlLiAgRGVmaW5lIGFuCitAY29kZXtpbml0aWFsaXplX0B2YXJ7bGFuZ319IHJvdXRpbmUgYW5kIGhhdmUgaXQgY2FsbAorQHNhbXB7YWRkX2xhbmd1YWdlKEB2YXJ7bGFuZ31fbGFuZ3VhZ2VfZGVmbil9IHRvIHRlbGwgdGhlIHJlc3Qgb2YgR0RCCit0aGF0IHlvdXIgbGFuZ3VhZ2UgZXhpc3RzLiAgWW91J2xsIG5lZWQgc29tZSBvdGhlciBzdXBwb3J0aW5nIHZhcmlhYmxlcworYW5kIGZ1bmN0aW9ucywgd2hpY2ggd2lsbCBiZSB1c2VkIHZpYSBwb2ludGVycyBmcm9tIHlvdXIKK0Bjb2Rle0B2YXJ7bGFuZ31fbGFuZ3VhZ2VfZGVmbn0uICBTZWUgdGhlIGRlY2xhcmF0aW9uIG9mIEBjb2Rle3N0cnVjdAorbGFuZ3VhZ2VfZGVmbn0gaW4gQGZpbGV7bGFuZ3VhZ2UuaH0sIGFuZCB0aGUgb3RoZXIgQGZpbGV7Ki1leHAueX0gZmlsZXMsCitmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworQGl0ZW0gQWRkIGFueSBldmFsdWF0aW9uIHJvdXRpbmVzLCBpZiBuZWNlc3NhcnkKKworSWYgeW91IG5lZWQgbmV3IG9wY29kZXMgKHRoYXQgcmVwcmVzZW50IHRoZSBvcGVyYXRpb25zIG9mIHRoZSBsYW5ndWFnZSksCithZGQgdGhlbSB0byB0aGUgZW51bWVyYXRlZCB0eXBlIGluIEBmaWxle2V4cHJlc3Npb24uaH0uICBBZGQgc3VwcG9ydAorY29kZSBmb3IgdGhlc2Ugb3BlcmF0aW9ucyBpbiBAY29kZXtldmFsLmM6ZXZhbHVhdGVfc3ViZXhwKCl9LiAgQWRkIGNhc2VzCitmb3IgbmV3IG9wY29kZXMgaW4gdHdvIGZ1bmN0aW9ucyBmcm9tIEBmaWxle3BhcnNlLmN9OgorQGNvZGV7cHJlZml4aWZ5X3N1YmV4cCgpfSBhbmQgQGNvZGV7bGVuZ3RoX29mX3N1YmV4cCgpfS4gIFRoZXNlIGNvbXB1dGUKK3RoZSBudW1iZXIgb2YgQGNvZGV7ZXhwX2VsZW1lbnR9cyB0aGF0IGEgZ2l2ZW4gb3BlcmF0aW9uIHRha2VzIHVwLgorCitAaXRlbSBVcGRhdGUgc29tZSBleGlzdGluZyBjb2RlCisKK0FkZCBhbiBlbnVtZXJhdGVkIGlkZW50aWZpZXIgZm9yIHlvdXIgbGFuZ3VhZ2UgdG8gdGhlIGVudW1lcmF0ZWQgdHlwZQorQGNvZGV7ZW51bSBsYW5ndWFnZX0gaW4gQGZpbGV7ZGVmcy5ofS4KKworVXBkYXRlIHRoZSByb3V0aW5lcyBpbiBAZmlsZXtsYW5ndWFnZS5jfSBzbyB5b3VyIGxhbmd1YWdlIGlzIGluY2x1ZGVkLgorVGhlc2Ugcm91dGluZXMgaW5jbHVkZSB0eXBlIHByZWRpY2F0ZXMgYW5kIHN1Y2gsIHdoaWNoIChpbiBzb21lIGNhc2VzKQorYXJlIGxhbmd1YWdlIGRlcGVuZGVudC4gIElmIHlvdXIgbGFuZ3VhZ2UgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBzd2l0Y2gKK3N0YXRlbWVudCwgYW4gZXJyb3IgaXMgcmVwb3J0ZWQuCisKK0Fsc28gaW5jbHVkZWQgaW4gQGZpbGV7bGFuZ3VhZ2UuY30gaXMgdGhlIGNvZGUgdGhhdCB1cGRhdGVzIHRoZSB2YXJpYWJsZQorQGNvZGV7Y3VycmVudF9sYW5ndWFnZX0sIGFuZCB0aGUgcm91dGluZXMgdGhhdCB0cmFuc2xhdGUgdGhlCitAY29kZXtsYW5ndWFnZV9AdmFye2xhbmd9fSBlbnVtZXJhdGVkIGlkZW50aWZpZXIgaW50byBhIHByaW50YWJsZQorc3RyaW5nLgorCitVcGRhdGUgdGhlIGZ1bmN0aW9uIEBjb2Rle19pbml0aWFsaXplX2xhbmd1YWdlfSB0byBpbmNsdWRlIHlvdXIKK2xhbmd1YWdlLiAgVGhpcyBmdW5jdGlvbiBwaWNrcyB0aGUgZGVmYXVsdCBsYW5ndWFnZSB1cG9uIHN0YXJ0dXAsIHNvIGlzCitkZXBlbmRlbnQgdXBvbiB3aGljaCBsYW5ndWFnZXMgdGhhdCBHREIgaXMgYnVpbHQgZm9yLgorCitVcGRhdGUgQGNvZGV7YWxsb2NhdGVfc3ltdGFifSBpbiBAZmlsZXtzeW1maWxlLmN9IGFuZC9vciBzeW1ib2wtcmVhZGluZworY29kZSBzbyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBlYWNoIHN5bXRhYiAoc291cmNlIGZpbGUpIGlzIHNldCBwcm9wZXJseS4KK1RoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGxhbmd1YWdlIHRvIHVzZSBhdCBlYWNoIHN0YWNrIGZyYW1lIGxldmVsLgorQ3VycmVudGx5LCB0aGUgbGFuZ3VhZ2UgaXMgc2V0IGJhc2VkIHVwb24gdGhlIGV4dGVuc2lvbiBvZiB0aGUgc291cmNlCitmaWxlLiAgSWYgdGhlIGxhbmd1YWdlIGNhbiBiZSBiZXR0ZXIgaW5mZXJyZWQgZnJvbSB0aGUgc3ltYm9sCitpbmZvcm1hdGlvbiwgcGxlYXNlIHNldCB0aGUgbGFuZ3VhZ2Ugb2YgdGhlIHN5bXRhYiBpbiB0aGUgc3ltYm9sLXJlYWRpbmcKK2NvZGUuCisKK0FkZCBoZWxwZXIgY29kZSB0byBAY29kZXtleHBwcmludC5jOnByaW50X3N1YmV4cCgpfSB0byBoYW5kbGUgYW55IG5ldworZXhwcmVzc2lvbiBvcGNvZGVzIHlvdSBoYXZlIGFkZGVkIHRvIEBmaWxle2V4cHJlc3Npb24uaH0uICBBbHNvLCBhZGQgdGhlCitwcmludGVkIHJlcHJlc2VudGF0aW9ucyBvZiB5b3VyIG9wZXJhdG9ycyB0byBAY29kZXtvcF9wcmludF90YWJ9LgorCitAaXRlbSBBZGQgYSBwbGFjZSBvZiBjYWxsCisKK0FkZCBhIGNhbGwgdG8gQGNvZGV7QHZhcntsYW5nfV9wYXJzZSgpfSBhbmQgQGNvZGV7QHZhcntsYW5nfV9lcnJvcn0gaW4KK0Bjb2Rle3BhcnNlLmM6cGFyc2VfZXhwXzEoKX0uCisKK0BpdGVtIFVzZSBtYWNyb3MgdG8gdHJpbSBjb2RlCisKK1RoZSB1c2VyIGhhcyB0aGUgb3B0aW9uIG9mIGJ1aWxkaW5nIEdEQiBmb3Igc29tZSBvciBhbGwgb2YgdGhlCitsYW5ndWFnZXMuICBJZiB0aGUgdXNlciBkZWNpZGVzIHRvIGJ1aWxkIEdEQiBmb3IgdGhlIGxhbmd1YWdlCitAdmFye2xhbmd9LCB0aGVuIGV2ZXJ5IGZpbGUgZGVwZW5kZW50IG9uIEBmaWxle2xhbmd1YWdlLmh9IHdpbGwgaGF2ZSB0aGUKK21hY3JvIEBjb2Rle19MQU5HX0B2YXJ7bGFuZ319IGRlZmluZWQgaW4gaXQuICBVc2UgQGNvZGV7I2lmZGVmfXMgdG8KK2xlYXZlIG91dCBsYXJnZSByb3V0aW5lcyB0aGF0IHRoZSB1c2VyIHdvbid0IG5lZWQgaWYgaGUgb3Igc2hlIGlzIG5vdAordXNpbmcgeW91ciBsYW5ndWFnZS4KKworTm90ZSB0aGF0IHlvdSBkbyBub3QgbmVlZCB0byBkbyB0aGlzIGluIHlvdXIgWUFDQyBwYXJzZXIsIHNpbmNlIGlmIEdEQgoraXMgbm90IGJ1aWxkIGZvciBAdmFye2xhbmd9LCB0aGVuIEBmaWxle0B2YXJ7bGFuZ30tZXhwLnRhYi5vfSAodGhlCitjb21waWxlZCBmb3JtIG9mIHlvdXIgcGFyc2VyKSBpcyBub3QgbGlua2VkIGludG8gR0RCIGF0IGFsbC4KKworU2VlIHRoZSBmaWxlIEBmaWxle2NvbmZpZ3VyZS5pbn0gZm9yIGhvdyBHREIgaXMgY29uZmlndXJlZCBmb3IgZGlmZmVyZW50CitsYW5ndWFnZXMuCisKK0BpdGVtIEVkaXQgQGZpbGV7TWFrZWZpbGUuaW59CisKK0FkZCBkZXBlbmRlbmNpZXMgaW4gQGZpbGV7TWFrZWZpbGUuaW59LiAgTWFrZSBzdXJlIHlvdSB1cGRhdGUgdGhlIG1hY3JvCit2YXJpYWJsZXMgc3VjaCBhcyBAY29kZXtIRklMRVN9IGFuZCBAY29kZXtPQkpTfSwgb3RoZXJ3aXNlIHlvdXIgY29kZSBtYXkKK25vdCBnZXQgbGlua2VkIGluLCBvciwgd29yc2UgeWV0LCBpdCBtYXkgbm90IGdldCBAY29kZXt0YXJ9cmVkIGludG8gdGhlCitkaXN0cmlidXRpb24hCisKK0BlbmQgdGFibGUKKworCitAbm9kZSBIb3N0IERlZmluaXRpb24KKworQGNoYXB0ZXIgSG9zdCBEZWZpbml0aW9uCisKK1dpdGggdGhlIGFkdmVudCBvZiBhdXRvY29uZiwgaXQncyByYXJlbHkgbmVjZXNzYXJ5IHRvIGhhdmUgaG9zdAorZGVmaW5pdGlvbiBtYWNoaW5lcnkgYW55bW9yZS4KKworQHNlY3Rpb24gQWRkaW5nIGEgTmV3IEhvc3QKKworTW9zdCBvZiBHREIncyBob3N0IGNvbmZpZ3VyYXRpb24gc3VwcG9ydCBoYXBwZW5zIHZpYSBhdXRvY29uZi4gIEl0CitzaG91bGQgYmUgcmFyZSB0byBuZWVkIG5ldyBob3N0LXNwZWNpZmljIGRlZmluaXRpb25zLiAgR0RCIHN0aWxsIHVzZXMKK3RoZSBob3N0LXNwZWNpZmljIGRlZmluaXRpb25zIGFuZCBmaWxlcyBsaXN0ZWQgYmVsb3csIGJ1dCB0aGVzZSBtb3N0bHkKK2V4aXN0IGZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIGFuZCBzaG91bGQgZXZlbnR1YWxseSBkaXNhcHBlYXIuCisKK1NldmVyYWwgZmlsZXMgY29udHJvbCBHREIncyBjb25maWd1cmF0aW9uIGZvciBob3N0IHN5c3RlbXM6CisKK0B0YWJsZSBAZmlsZQorCitAaXRlbSBnZGIvY29uZmlnL0B2YXJ7YXJjaH0vQHZhcnt4eXp9Lm1oCitTcGVjaWZpZXMgTWFrZWZpbGUgZnJhZ21lbnRzIG5lZWRlZCB3aGVuIGhvc3Rpbmcgb24gbWFjaGluZSBAdmFye3h5en0uCitJbiBwYXJ0aWN1bGFyLCB0aGlzIGxpc3RzIHRoZSByZXF1aXJlZCBtYWNoaW5lLWRlcGVuZGVudCBvYmplY3QgZmlsZXMsCitieSBkZWZpbmluZyBAc2FtcHtYREVQRklMRVM9QGRvdHN7fX0uICBBbHNvIHNwZWNpZmllcyB0aGUgaGVhZGVyIGZpbGUKK3doaWNoIGRlc2NyaWJlcyBob3N0IEB2YXJ7eHl6fSwgYnkgZGVmaW5pbmcgQGNvZGV7WE1fRklMRT0KK3htLUB2YXJ7eHl6fS5ofS4gIFlvdSBjYW4gYWxzbyBkZWZpbmUgQGNvZGV7Q0N9LCBAY29kZXtTWVNWX0RFRklORX0sCitAY29kZXtYTV9DRkxBR1N9LCBAY29kZXtYTV9BRERfRklMRVN9LCBAY29kZXtYTV9DTElCU30sIEBjb2Rle1hNX0NERVBTfSwKK2V0Yy47IHNlZSBAZmlsZXtNYWtlZmlsZS5pbn0uCisKK0BpdGVtIGdkYi9jb25maWcvQHZhcnthcmNofS94bS1AdmFye3h5en0uaAorKEBmaWxle3htLmh9IGlzIGEgbGluayB0byB0aGlzIGZpbGUsIGNyZWF0ZWQgYnkgY29uZmlndXJlKS4gIENvbnRhaW5zIEMKK21hY3JvIGRlZmluaXRpb25zIGRlc2NyaWJpbmcgdGhlIGhvc3Qgc3lzdGVtIGVudmlyb25tZW50LCBzdWNoIGFzIGJ5dGUKK29yZGVyLCBob3N0IEMgY29tcGlsZXIgYW5kIGxpYnJhcnkuCisKK0BpdGVtIGdkYi9AdmFye3h5en0teGRlcC5jCitDb250YWlucyBhbnkgbWlzY2VsbGFuZW91cyBDIGNvZGUgcmVxdWlyZWQgZm9yIHRoaXMgbWFjaGluZSBhcyBhIGhvc3QuCitPbiBtb3N0IG1hY2hpbmVzIGl0IGRvZXNuJ3QgZXhpc3QgYXQgYWxsLiAgSWYgaXQgZG9lcyBleGlzdCwgcHV0CitAZmlsZXtAdmFye3h5en0teGRlcC5vfSBpbnRvIHRoZSBAY29kZXtYREVQRklMRVN9IGxpbmUgaW4KK0BmaWxle2dkYi9jb25maWcvQHZhcnthcmNofS9AdmFye3h5en0ubWh9LgorCitAZW5kIHRhYmxlCisKK0BzdWJoZWFkaW5nIEdlbmVyaWMgSG9zdCBTdXBwb3J0IEZpbGVzCisKK1RoZXJlIGFyZSBzb21lIGBgZ2VuZXJpYycnIHZlcnNpb25zIG9mIHJvdXRpbmVzIHRoYXQgY2FuIGJlIHVzZWQgYnkKK3ZhcmlvdXMgc3lzdGVtcy4gIFRoZXNlIGNhbiBiZSBjdXN0b21pemVkIGluIHZhcmlvdXMgd2F5cyBieSBtYWNyb3MKK2RlZmluZWQgaW4geW91ciBAZmlsZXt4bS1AdmFye3h5en0uaH0gZmlsZS4gIElmIHRoZXNlIHJvdXRpbmVzIHdvcmsgZm9yCit0aGUgQHZhcnt4eXp9IGhvc3QsIHlvdSBjYW4ganVzdCBpbmNsdWRlIHRoZSBnZW5lcmljIGZpbGUncyBuYW1lICh3aXRoCitAc2FtcHsub30sIG5vdCBAc2FtcHsuY30pIGluIEBjb2Rle1hERVBGSUxFU30uCisKK090aGVyd2lzZSwgaWYgeW91ciBtYWNoaW5lIG5lZWRzIGN1c3RvbSBzdXBwb3J0IHJvdXRpbmVzLCB5b3Ugd2lsbCBuZWVkCit0byB3cml0ZSByb3V0aW5lcyB0aGF0IHBlcmZvcm0gdGhlIHNhbWUgZnVuY3Rpb25zIGFzIHRoZSBnZW5lcmljIGZpbGUuCitQdXQgdGhlbSBpbnRvIEBjb2Rle0B2YXJ7eHl6fS14ZGVwLmN9LCBhbmQgcHV0IEBjb2Rle0B2YXJ7eHl6fS14ZGVwLm99CitpbnRvIEBjb2Rle1hERVBGSUxFU30uCisKK0B0YWJsZSBAZmlsZQorCitAaXRlbSBzZXItdW5peC5jCitUaGlzIGNvbnRhaW5zIHNlcmlhbCBsaW5lIHN1cHBvcnQgZm9yIFVuaXggc3lzdGVtcy4gIFRoaXMgaXMgYWx3YXlzCitpbmNsdWRlZCwgdmlhIHRoZSBtYWtlZmlsZSB2YXJpYWJsZSBAY29kZXtTRVJfSEFSRFdJUkV9OyBvdmVycmlkZSB0aGlzCit2YXJpYWJsZSBpbiB0aGUgQGZpbGV7Lm1ofSBmaWxlIHRvIGF2b2lkIGl0LgorCitAaXRlbSBzZXItZ28zMi5jCitUaGlzIGNvbnRhaW5zIHNlcmlhbCBsaW5lIHN1cHBvcnQgZm9yIDMyLWJpdCBwcm9ncmFtcyBydW5uaW5nIHVuZGVyIERPUywKK3VzaW5nIHRoZSBHTzMyIGV4ZWN1dGlvbiBlbnZpcm9ubWVudC4KKworQGl0ZW0gc2VyLXRjcC5jCitUaGlzIGNvbnRhaW5zIGdlbmVyaWMgVENQIHN1cHBvcnQgdXNpbmcgc29ja2V0cy4KKworQGVuZCB0YWJsZQorCitAc2VjdGlvbiBIb3N0IENvbmRpdGlvbmFscworCitXaGVuIEdEQiBpcyBjb25maWd1cmVkIGFuZCBjb21waWxlZCwgdmFyaW91cyBtYWNyb3MgYXJlIGRlZmluZWQgb3IgbGVmdAordW5kZWZpbmVkLCB0byBjb250cm9sIGNvbXBpbGF0aW9uIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBob3N0CitzeXN0ZW0uICBUaGVzZSBtYWNyb3MgYW5kIHRoZWlyIG1lYW5pbmdzIChvciBpZiB0aGUgbWVhbmluZyBpcyBub3QKK2RvY3VtZW50ZWQgaGVyZSwgdGhlbiBvbmUgb2YgdGhlIHNvdXJjZSBmaWxlcyB3aGVyZSB0aGV5IGFyZSB1c2VkIGlzCitpbmRpY2F0ZWQpIGFyZToKKworQHRhYmxlIEBjb2RlCisKK0BpdGVtIEdEQklOSVRfRklMRU5BTUUKK1RoZSBkZWZhdWx0IG5hbWUgb2YgR0RCJ3MgaW5pdGlhbGl6YXRpb24gZmlsZSAobm9ybWFsbHkgQGZpbGV7LmdkYmluaXR9KS4KKworQGl0ZW0gTUVNX0ZOU19ERUNMQVJFRAorWW91ciBob3N0IGNvbmZpZyBmaWxlIGRlZmluZXMgdGhpcyBpZiBpdCBpbmNsdWRlcyBkZWNsYXJhdGlvbnMgb2YKK0Bjb2Rle21lbWNweX0gYW5kIEBjb2Rle21lbXNldH0uICBEZWZpbmUgdGhpcyB0byBhdm9pZCBjb25mbGljdHMgYmV0d2VlbgordGhlIG5hdGl2ZSBpbmNsdWRlIGZpbGVzIGFuZCB0aGUgZGVjbGFyYXRpb25zIGluIEBmaWxle2RlZnMuaH0uCisKK0BpdGVtIE5PX1NZU19GSUxFCitEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBoYXZlIGEgQGNvZGV7PHN5cy9maWxlLmg+fS4KKworQGl0ZW0gU0lHV0lOQ0hfSEFORExFUgorSWYgeW91ciBob3N0IGRlZmluZXMgQGNvZGV7U0lHV0lOQ0h9LCB5b3UgY2FuIGRlZmluZSB0aGlzIHRvIGJlIHRoZSBuYW1lCitvZiBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpZiBAY29kZXtTSUdXSU5DSH0gaXMgcmVjZWl2ZWQuCisKK0BpdGVtIFNJR1dJTkNIX0hBTkRMRVJfQk9EWQorRGVmaW5lIHRoaXMgdG8gZXhwYW5kIGludG8gY29kZSB0aGF0IHdpbGwgZGVmaW5lIHRoZSBmdW5jdGlvbiBuYW1lZCBieQordGhlIGV4cGFuc2lvbiBvZiBAY29kZXtTSUdXSU5DSF9IQU5ETEVSfS4KKworQGl0ZW0gQUxJR05fU1RBQ0tfT05fU1RBUlRVUAorRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gaXMgb2YgYSBzb3J0IHRoYXQgd2lsbCBjcmFzaCBpbgorQGNvZGV7dGdldGVudH0gaWYgdGhlIHN0YWNrIGhhcHBlbnMgbm90IHRvIGJlIGxvbmd3b3JkLWFsaWduZWQgd2hlbgorQGNvZGV7bWFpbn0gaXMgY2FsbGVkLiAgVGhpcyBpcyBhIHJhcmUgc2l0dWF0aW9uLCBidXQgaXMga25vd24gdG8gb2NjdXIKK29uIHNldmVyYWwgZGlmZmVyZW50IHR5cGVzIG9mIHN5c3RlbXMuCisKK0BpdGVtIENSTEZfU09VUkNFX0ZJTEVTCitEZWZpbmUgdGhpcyBpZiBob3N0IGZpbGVzIHVzZSBAY29kZXtcclxufSByYXRoZXIgdGhhbiBAY29kZXtcbn0gYXMgYQorbGluZSB0ZXJtaW5hdG9yLiAgVGhpcyB3aWxsIGNhdXNlIHNvdXJjZSBmaWxlIGxpc3RpbmdzIHRvIG9taXQgQGNvZGV7XHJ9CitjaGFyYWN0ZXJzIHdoZW4gcHJpbnRpbmcgYW5kIGl0IHdpbGwgYWxsb3cgXHJcbiBsaW5lIGVuZGluZ3Mgb2YgZmlsZXMKK3doaWNoIGFyZSAic291cmNlZCIgYnkgZ2RiLiAgSXQgbXVzdCBiZSBwb3NzaWJsZSB0byBvcGVuIGZpbGVzIGluIGJpbmFyeQorbW9kZSB1c2luZyBAY29kZXtPX0JJTkFSWX0gb3IsIGZvciBmb3BlbiwgQGNvZGV7InJiIn0uCisKK0BpdGVtIERFRkFVTFRfUFJPTVBUCitUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJvbXB0IHN0cmluZyAobm9ybWFsbHkgQGNvZGV7IihnZGIpICJ9KS4KKworQGl0ZW0gREVWX1RUWQorVGhlIG5hbWUgb2YgdGhlIGdlbmVyaWMgVFRZIGRldmljZSwgZGVmYXVsdHMgdG8gQGNvZGV7Ii9kZXYvdHR5In0uCisKK0BpdGVtIEZDTE9TRV9QUk9WSURFRAorRGVmaW5lIHRoaXMgaWYgdGhlIHN5c3RlbSBkZWNsYXJlcyBAY29kZXtmY2xvc2V9IGluIHRoZSBoZWFkZXJzIGluY2x1ZGVkCitpbiBAY29kZXtkZWZzLmh9LiAgVGhpcyBpc24ndCBuZWVkZWQgdW5sZXNzIHlvdXIgY29tcGlsZXIgaXMgdW51c3VhbGx5CithbmFsLgorCitAaXRlbSBGT1BFTl9SQgorRGVmaW5lIHRoaXMgaWYgYmluYXJ5IGZpbGVzIGFyZSBvcGVuZWQgdGhlIHNhbWUgd2F5IGFzIHRleHQgZmlsZXMuCisKK0BpdGVtIEdFVEVOVl9QUk9WSURFRAorRGVmaW5lIHRoaXMgaWYgdGhlIHN5c3RlbSBkZWNsYXJlcyBAY29kZXtnZXRlbnZ9IGluIGl0cyBoZWFkZXJzIGluY2x1ZGVkCitpbiBAY29kZXtkZWZzLmh9LiBUaGlzIGlzbid0IG5lZWRlZCB1bmxlc3MgeW91ciBjb21waWxlciBpcyB1bnVzdWFsbHkKK2FuYWwuCisKK0BpdGVtIEhBVkVfTU1BUAorSW4gc29tZSBjYXNlcywgdXNlIHRoZSBzeXN0ZW0gY2FsbCBAY29kZXttbWFwfSBmb3IgcmVhZGluZyBzeW1ib2wKK3RhYmxlcy4gIEZvciBzb21lIG1hY2hpbmVzIHRoaXMgYWxsb3dzIGZvciBzaGFyaW5nIGFuZCBxdWljayB1cGRhdGVzLgorCitAaXRlbSBIQVZFX1NJR1NFVE1BU0sKK0RlZmluZSB0aGlzIGlmIHRoZSBob3N0IHN5c3RlbSBoYXMgam9iIGNvbnRyb2wsIGJ1dCBkb2VzIG5vdCBkZWZpbmUKK0Bjb2Rle3NpZ3NldG1hc2soKX0uICBDdXJyZW50bHksIHRoaXMgaXMgb25seSB0cnVlIG9mIHRoZSBSUy82MDAwLgorCitAaXRlbSBIQVZFX1RFUk1JTworRGVmaW5lIHRoaXMgaWYgdGhlIGhvc3Qgc3lzdGVtIGhhcyBAY29kZXt0ZXJtaW8uaH0uCisKK0BpdGVtIEhPU1RfQllURV9PUkRFUgorVGhlIG9yZGVyaW5nIG9mIGJ5dGVzIGluIHRoZSBob3N0LiAgVGhpcyBtdXN0IGJlIGRlZmluZWQgdG8gYmUgZWl0aGVyCitAY29kZXtCSUdfRU5ESUFOfSBvciBAY29kZXtMSVRUTEVfRU5ESUFOfS4KKworQGl0ZW0gSU5UX01BWAorQGl0ZW0gSU5UX01JTgorQGl0ZW0gTE9OR19NQVgKK0BpdGVtIFVJTlRfTUFYCitAaXRlbSBVTE9OR19NQVgKK1ZhbHVlcyBmb3IgaG9zdC1zaWRlIGNvbnN0YW50cy4KKworQGl0ZW0gSVNBVFRZCitTdWJzdGl0dXRlIGZvciBpc2F0dHksIGlmIG5vdCBhdmFpbGFibGUuCisKK0BpdGVtIExPTkdFU1QKK1RoaXMgaXMgdGhlIGxvbmdlc3QgaW50ZWdlciB0eXBlIGF2YWlsYWJsZSBvbiB0aGUgaG9zdC4gIElmIG5vdCBkZWZpbmVkLAoraXQgd2lsbCBkZWZhdWx0IHRvIEBjb2Rle2xvbmcgbG9uZ30gb3IgQGNvZGV7bG9uZ30sIGRlcGVuZGluZyBvbgorQGNvZGV7Q0NfSEFTX0xPTkdfTE9OR30uCisKK0BpdGVtIENDX0hBU19MT05HX0xPTkcKK0RlZmluZSB0aGlzIGlmIHRoZSBob3N0IEMgY29tcGlsZXIgc3VwcG9ydHMgYGBsb25nIGxvbmcnJy4gIFRoaXMgaXMgc2V0CitieSB0aGUgY29uZmlndXJlIHNjcmlwdC4KKworQGl0ZW0gUFJJTlRGX0hBU19MT05HX0xPTkcKK0RlZmluZSB0aGlzIGlmIHRoZSBob3N0IGNhbiBoYW5kbGUgcHJpbnRpbmcgb2YgbG9uZyBsb25nIGludGVnZXJzIHZpYQordGhlIHByaW50ZiBmb3JtYXQgZGlyZWN0aXZlIGBgbGwnJy4gVGhpcyBpcyBzZXQgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCisKK0BpdGVtIEhBVkVfTE9OR19ET1VCTEUKK0RlZmluZSB0aGlzIGlmIHRoZSBob3N0IEMgY29tcGlsZXIgc3VwcG9ydHMgYGBsb25nIGRvdWJsZScnLiAgVGhpcyBpcworc2V0IGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0LgorCitAaXRlbSBQUklOVEZfSEFTX0xPTkdfRE9VQkxFCitEZWZpbmUgdGhpcyBpZiB0aGUgaG9zdCBjYW4gaGFuZGxlIHByaW50aW5nIG9mIGxvbmcgZG91YmxlIGZsb2F0LXBvaW50CitudW1iZXJzIHZpYSB0aGUgcHJpbnRmIGZvcm1hdCBkaXJlY3RpdmUgYGBMZycnLiBUaGlzIGlzIHNldCBieSB0aGUKK2NvbmZpZ3VyZSBzY3JpcHQuCisKK0BpdGVtIFNDQU5GX0hBU19MT05HX0RPVUJMRQorRGVmaW5lIHRoaXMgaWYgdGhlIGhvc3QgY2FuIGhhbmRsZSB0aGUgcGFyc2luZyBvZiBsb25nIGRvdWJsZQorZmxvYXQtcG9pbnQgbnVtYmVycyB2aWEgdGhlIHNjYW5mIGZvcm1hdCBkaXJlY3RpdmUgZGlyZWN0aXZlCitgYExnJycuIFRoaXMgaXMgc2V0IGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0LgorCitAaXRlbSBMU0VFS19OT1RfTElORUFSCitEZWZpbmUgdGhpcyBpZiBAY29kZXtsc2VlayAobil9IGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1vdmUgdG8gYnl0ZSBudW1iZXIKK0Bjb2Rle259IGluIHRoZSBmaWxlLiAgVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiByZWFkaW5nIHNvdXJjZSBmaWxlcy4gIEl0CitpcyBub3JtYWxseSBmYXN0ZXIgdG8gZGVmaW5lIEBjb2Rle0NSTEZfU09VUkNFX0ZJTEVTfSB3aGVuIHBvc3NpYmxlLgorCitAaXRlbSBMX1NFVAorVGhpcyBtYWNybyBpcyB1c2VkIGFzIHRoZSBhcmd1bWVudCB0byBsc2VlayAob3IsIG1vc3QgY29tbW9ubHksCitiZmRfc2VlaykuICBGSVhNRSwgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IFNFRUtfU0VUIGluc3RlYWQsIHdoaWNoIGlzIHRoZQorUE9TSVggZXF1aXZhbGVudC4KKworQGl0ZW0gTUFJTlRFTkFOQ0VfQ01EUworSWYgdGhlIHZhbHVlIG9mIHRoaXMgaXMgMSwgdGhlbiBhIG51bWJlciBvZiBvcHRpb25hbCBtYWludGVuYW5jZQorY29tbWFuZHMgYXJlIGNvbXBpbGVkIGluLgorCitAaXRlbSBNQUxMT0NfSU5DT01QQVRJQkxFCitEZWZpbmUgdGhpcyBpZiB0aGUgc3lzdGVtJ3MgcHJvdG90eXBlIGZvciBAY29kZXttYWxsb2N9IGRpZmZlcnMgZnJvbSB0aGUKK0BzY3tBTlNJfSBkZWZpbml0aW9uLgorCitAaXRlbSBNTUFQX0JBU0VfQUREUkVTUworV2hlbiB1c2luZyBIQVZFX01NQVAsIHRoZSBmaXJzdCBtYXBwaW5nIHNob3VsZCBnbyBhdCB0aGlzIGFkZHJlc3MuCisKK0BpdGVtIE1NQVBfSU5DUkVNRU5UCit3aGVuIHVzaW5nIEhBVkVfTU1BUCwgdGhpcyBpcyB0aGUgaW5jcmVtZW50IGJldHdlZW4gbWFwcGluZ3MuCisKK0BpdGVtIE5FRURfUE9TSVhfU0VUUEdJRAorRGVmaW5lIHRoaXMgdG8gdXNlIHRoZSBQT1NJWCB2ZXJzaW9uIG9mIEBjb2Rle3NldHBnaWR9IHRvIGRldGVybWluZQord2hldGhlciBqb2IgY29udHJvbCBpcyBhdmFpbGFibGUuCisKK0BpdGVtIE5PUkVUVVJOCitJZiBkZWZpbmVkLCB0aGlzIHNob3VsZCBiZSBvbmUgb3IgbW9yZSB0b2tlbnMsIHN1Y2ggYXMgQGNvZGV7dm9sYXRpbGV9LAordGhhdCBjYW4gYmUgdXNlZCBpbiBib3RoIHRoZSBkZWNsYXJhdGlvbiBhbmQgZGVmaW5pdGlvbiBvZiBmdW5jdGlvbnMgdG8KK2luZGljYXRlIHRoYXQgdGhleSBuZXZlciByZXR1cm4uICBUaGUgZGVmYXVsdCBpcyBhbHJlYWR5IHNldCBjb3JyZWN0bHkKK2lmIGNvbXBpbGluZyB3aXRoIEdDQy4gIFRoaXMgd2lsbCBhbG1vc3QgbmV2ZXIgbmVlZCB0byBiZSBkZWZpbmVkLgorCitAaXRlbSBBVFRSX05PUkVUVVJOCitJZiBkZWZpbmVkLCB0aGlzIHNob3VsZCBiZSBvbmUgb3IgbW9yZSB0b2tlbnMsIHN1Y2ggYXMKK0Bjb2Rle19fYXR0cmlidXRlX18gKChub3JldHVybikpfSwgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgZGVjbGFyYXRpb25zCitvZiBmdW5jdGlvbnMgdG8gaW5kaWNhdGUgdGhhdCB0aGV5IG5ldmVyIHJldHVybi4gIFRoZSBkZWZhdWx0IGlzIGFscmVhZHkKK3NldCBjb3JyZWN0bHkgaWYgY29tcGlsaW5nIHdpdGggR0NDLiAgVGhpcyB3aWxsIGFsbW9zdCBuZXZlciBuZWVkIHRvIGJlCitkZWZpbmVkLgorCitAaXRlbSBVU0VfTU1BTExPQworR0RCIHdpbGwgdXNlIHRoZSBAY29kZXttbWFsbG9jfSBsaWJyYXJ5IGZvciBtZW1vcnkgYWxsb2NhdGlvbiBmb3Igc3ltYm9sCityZWFkaW5nIGlmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQuICBCZSBjYXJlZnVsIGRlZmluaW5nIGl0IHNpbmNlIHRoZXJlCithcmUgc3lzdGVtcyBvbiB3aGljaCBAY29kZXttbWFsbG9jfSBkb2VzIG5vdCB3b3JrIGZvciBzb21lIHJlYXNvbi4gIE9uZQorZXhhbXBsZSBpcyB0aGUgREVDc3RhdGlvbiwgd2hlcmUgaXRzIFJQQyBsaWJyYXJ5IGNhbid0IGNvcGUgd2l0aCBvdXIKK3JlZGVmaW5pdGlvbiBvZiBAY29kZXttYWxsb2N9IHRvIGNhbGwgQGNvZGV7bW1hbGxvY30uICBXaGVuIGRlZmluaW5nCitAY29kZXtVU0VfTU1BTExPQ30sIHlvdSB3aWxsIGFsc28gaGF2ZSB0byBzZXQgQGNvZGV7TU1BTExPQ30gaW4gdGhlCitNYWtlZmlsZSwgdG8gcG9pbnQgdG8gdGhlIG1tYWxsb2MgbGlicmFyeS4gIFRoaXMgZGVmaW5lIGlzIHNldCB3aGVuIHlvdQorY29uZmlndXJlIHdpdGggLS13aXRoLW1tYWxsb2MuCisKK0BpdGVtIE5PX01NQ0hFQ0sKK0RlZmluZSB0aGlzIGlmIHlvdSBhcmUgdXNpbmcgQGNvZGV7bW1hbGxvY30sIGJ1dCBkb24ndCB3YW50IHRoZSBvdmVyaGVhZAorb2YgY2hlY2tpbmcgdGhlIGhlYXAgd2l0aCBAY29kZXttbWNoZWNrfS4gIE5vdGUgdGhhdCBvbiBzb21lIHN5c3RlbXMsCit0aGUgQyBydW50aW1lIG1ha2VzIGNhbGxzIHRvIG1hbGxvYyBwcmlvciB0byBjYWxsaW5nIEBjb2Rle21haW59LCBhbmQgaWYKK0Bjb2Rle2ZyZWV9IGlzIGV2ZXIgY2FsbGVkIHdpdGggdGhlc2UgcG9pbnRlcnMgYWZ0ZXIgY2FsbGluZworQGNvZGV7bW1jaGVja30gdG8gZW5hYmxlIGNoZWNraW5nLCBhIG1lbW9yeSBjb3JydXB0aW9uIGFib3J0IGlzIGNlcnRhaW4KK3RvIG9jY3VyLiAgVGhlc2Ugc3lzdGVtcyBjYW4gc3RpbGwgdXNlIG1tYWxsb2MsIGJ1dCBtdXN0IGRlZmluZQorTk9fTU1DSEVDSy4KKworQGl0ZW0gTU1DSEVDS19GT1JDRQorRGVmaW5lIHRoaXMgdG8gMSBpZiB0aGUgQyBydW50aW1lIGFsbG9jYXRlcyBtZW1vcnkgcHJpb3IgdG8KK0Bjb2Rle21tY2hlY2t9IGJlaW5nIGNhbGxlZCwgYnV0IHRoYXQgbWVtb3J5IGlzIG5ldmVyIGZyZWVkIHNvIHdlIGRvbid0CitoYXZlIHRvIHdvcnJ5IGFib3V0IGl0IHRyaWdnZXJpbmcgYSBtZW1vcnkgY29ycnVwdGlvbiBhYm9ydC4gIFRoZQorZGVmYXVsdCBpcyAwLCB3aGljaCBtZWFucyB0aGF0IEBjb2Rle21tY2hlY2t9IHdpbGwgb25seSBpbnN0YWxsIHRoZSBoZWFwCitjaGVja2luZyBmdW5jdGlvbnMgaWYgdGhlcmUgaGFzIG5vdCB5ZXQgYmVlbiBhbnkgbWVtb3J5IGFsbG9jYXRpb24KK2NhbGxzLCBhbmQgaWYgaXQgZmFpbHMgdG8gaW5zdGFsbCB0aGUgZnVuY3Rpb25zLCBnZGIgd2lsbCBpc3N1ZSBhCit3YXJuaW5nLiAgVGhpcyBpcyBjdXJyZW50bHkgZGVmaW5lZCBpZiB5b3UgY29uZmlndXJlIHVzaW5nCistLXdpdGgtbW1hbGxvYy4KKworQGl0ZW0gTk9fU0lHSU5URVJSVVBUCitEZWZpbmUgdGhpcyB0byBpbmRpY2F0ZSB0aGF0IHNpZ2ludGVycnVwdCgpIGlzIG5vdCBhdmFpbGFibGUuCisKK0BpdGVtIFJfT0sKK0RlZmluZSBpZiB0aGlzIGlzIG5vdCBpbiBhIHN5c3RlbSAuaCBmaWxlLgorCitAaXRlbSBTRUVLX0NVUgorQGl0ZW0gU0VFS19TRVQKK0RlZmluZSB0aGVzZSB0byBhcHByb3ByaWF0ZSB2YWx1ZSBmb3IgdGhlIHN5c3RlbSBsc2VlaygpLCBpZiBub3QgYWxyZWFkeQorZGVmaW5lZC4KKworQGl0ZW0gU1RPUF9TSUdOQUwKK1RoaXMgaXMgdGhlIHNpZ25hbCBmb3Igc3RvcHBpbmcgR0RCLiAgRGVmYXVsdHMgdG8gU0lHVFNUUC4gIChPbmx5CityZWRlZmluZWQgZm9yIHRoZSBDb252ZXguKQorCitAaXRlbSBVU0VfT19OT0NUVFkKK0RlZmluZSB0aGlzIGlmIHRoZSBpbnRlcmlvcidzIHR0eSBzaG91bGQgYmUgb3BlbmVkIHdpdGggdGhlIE9fTk9DVFRZCitmbGFnLiAgKEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG5hdGl2ZS1vbmx5IGZsYWcsIGJ1dCBAZmlsZXtpbmZsb3cuY30gaXMKK2Fsd2F5cyBsaW5rZWQgaW4uKQorCitAaXRlbSBVU0cKK01lYW5zIHRoYXQgU3lzdGVtIFYgKHByaW9yIHRvIFNWUjQpIGluY2x1ZGUgZmlsZXMgYXJlIGluIHVzZS4gIChGSVhNRToKK1RoaXMgc3ltYm9sIGlzIGFidXNlZCBpbiBAZmlsZXtpbmZydW4uY30sIEBmaWxle3JlZ2V4LmN9LAorQGZpbGV7cmVtb3RlLW5pbmR5LmN9LCBhbmQgQGZpbGV7dXRpbHMuY30gZm9yIG90aGVyIHRoaW5ncywgYXQgdGhlCittb21lbnQuKQorCitAaXRlbSBsaW50CitEZWZpbmUgdGhpcyB0byBoZWxwIHBsYWNhdGUgbGludCBpbiBzb21lIHNpdHVhdGlvbnMuCisKK0BpdGVtIHZvbGF0aWxlCitEZWZpbmUgdGhpcyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMgb2YgQGNvZGV7X192b2xhdGlsZV9ffSBvcgorQGNvZGV7LyoqL30uCisKK0BlbmQgdGFibGUKKworCitAbm9kZSBUYXJnZXQgQXJjaGl0ZWN0dXJlIERlZmluaXRpb24KKworQGNoYXB0ZXIgVGFyZ2V0IEFyY2hpdGVjdHVyZSBEZWZpbml0aW9uCisKK0dEQidzIHRhcmdldCBhcmNoaXRlY3R1cmUgZGVmaW5lcyB3aGF0IHNvcnQgb2YgbWFjaGluZS1sYW5ndWFnZSBwcm9ncmFtcworR0RCIGNhbiB3b3JrIHdpdGgsIGFuZCBob3cgaXQgd29ya3Mgd2l0aCB0aGVtLgorCitBdCBwcmVzZW50LCB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGEgbnVtYmVyIG9mIEMKK21hY3Jvcy4KKworQHNlY3Rpb24gUmVnaXN0ZXJzIGFuZCBNZW1vcnkKKworR0RCJ3MgbW9kZWwgb2YgdGhlIHRhcmdldCBtYWNoaW5lIGlzIHJhdGhlciBzaW1wbGUuICBHREIgYXNzdW1lcyB0aGUKK21hY2hpbmUgaW5jbHVkZXMgYSBiYW5rIG9mIHJlZ2lzdGVycyBhbmQgYSBibG9jayBvZiBtZW1vcnkuICBFYWNoCityZWdpc3RlciBtYXkgaGF2ZSBhIGRpZmZlcmVudCBzaXplLgorCitHREIgZG9lcyBub3QgaGF2ZSBhIG1hZ2ljYWwgd2F5IHRvIG1hdGNoIHVwIHdpdGggdGhlIGNvbXBpbGVyJ3MgaWRlYSBvZgord2hpY2ggcmVnaXN0ZXJzIGFyZSB3aGljaDsgaG93ZXZlciwgaXQgaXMgY3JpdGljYWwgdGhhdCB0aGV5IGRvIG1hdGNoIHVwCithY2N1cmF0ZWx5LiAgVGhlIG9ubHkgd2F5IHRvIG1ha2UgdGhpcyB3b3JrIGlzIHRvIGdldCBhY2N1cmF0ZQoraW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yZGVyIHRoYXQgdGhlIGNvbXBpbGVyIHVzZXMsIGFuZCB0byByZWZsZWN0IHRoYXQKK2luIHRoZSBAY29kZXtSRUdJU1RFUl9OQU1FfSBhbmQgcmVsYXRlZCBtYWNyb3MuCisKK0dEQiBjYW4gaGFuZGxlIGJpZy1lbmRpYW4sIGxpdHRsZS1lbmRpYW4sIGFuZCBiaS1lbmRpYW4gYXJjaGl0ZWN0dXJlcy4KKworQHNlY3Rpb24gRnJhbWUgSW50ZXJwcmV0YXRpb24KKworQHNlY3Rpb24gSW5mZXJpb3IgQ2FsbCBTZXR1cAorCitAc2VjdGlvbiBDb21waWxlciBDaGFyYWN0ZXJpc3RpY3MKKworQHNlY3Rpb24gVGFyZ2V0IENvbmRpdGlvbmFscworCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtYWNyb3MgdGhhdCB5b3UgY2FuIHVzZSB0byBkZWZpbmUgdGhlIHRhcmdldAorbWFjaGluZS4KKworQHRhYmxlIEBjb2RlCisKK0BpdGVtIEFERElUSU9OQUxfT1BUSU9OUworQGl0ZW0gQURESVRJT05BTF9PUFRJT05fQ0FTRVMKK0BpdGVtIEFERElUSU9OQUxfT1BUSU9OX0hBTkRMRVIKK0BpdGVtIEFERElUSU9OQUxfT1BUSU9OX0hFTFAKK1RoZXNlIGFyZSBhIHNldCBvZiBtYWNyb3MgdGhhdCBhbGxvdyB0aGUgYWRkaXRpb24gb2YgYWRkaXRpb25hbCBjb21tYW5kCitsaW5lIG9wdGlvbnMgdG8gR0RCLiAgVGhleSBhcmUgY3VycmVudGx5IHVzZWQgb25seSBmb3IgdGhlIHVuc3VwcG9ydGVkCitpOTYwIE5pbmR5IHRhcmdldCwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBpbiBhbnkgb3RoZXIgY29uZmlndXJhdGlvbi4KKworQGl0ZW0gQUREUl9CSVRTX1JFTU9WRSAoYWRkcikKK0lmIGEgcmF3IG1hY2hpbmUgYWRkcmVzcyBpbmNsdWRlcyBhbnkgYml0cyB0aGF0IGFyZSBub3QgcmVhbGx5IHBhcnQgb2YKK3RoZSBhZGRyZXNzLCB0aGVuIGRlZmluZSB0aGlzIG1hY3JvIHRvIGV4cGFuZCBpbnRvIGFuIGV4cHJlc3Npb24gdGhhdAoremVyb3MgdGhvc2UgYml0cyBpbiBAdmFye2FkZHJ9LiAgRm9yIGV4YW1wbGUsIHRoZSB0d28gbG93LW9yZGVyIGJpdHMgb2YKK2EgTW90b3JvbGEgODhLIGFkZHJlc3MgbWF5IGJlIHVzZWQgYnkgc29tZSBrZXJuZWxzIGZvciB0aGVpciBvd24KK3B1cnBvc2VzLCBzaW5jZSBhZGRyZXNzZXMgbXVzdCBhbHdheXMgYmUgNC1ieXRlIGFsaWduZWQsIGFuZCBzbyBhcmUgb2YKK25vIHVzZSBmb3IgYWRkcmVzc2luZy4gIFRob3NlIGJpdHMgc2hvdWxkIGJlIGZpbHRlcmVkIG91dCB3aXRoIGFuCitleHByZXNzaW9uIHN1Y2ggYXMgQGNvZGV7KChhZGRyKSAmIH4zKX0uCisKK0BpdGVtIEJFRk9SRV9NQUlOX0xPT1BfSE9PSworRGVmaW5lIHRoaXMgdG8gZXhwYW5kIGludG8gYW55IGNvZGUgdGhhdCB5b3Ugd2FudCB0byBleGVjdXRlIGJlZm9yZSB0aGUKK21haW4gbG9vcCBzdGFydHMuICBBbHRob3VnaCB0aGlzIGlzIG5vdCwgc3RyaWN0bHkgc3BlYWtpbmcsIGEgdGFyZ2V0Citjb25kaXRpb25hbCwgdGhhdCBpcyBob3cgaXQgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQuICBOb3RlIHRoYXQgaWYgYQorY29uZmlndXJhdGlvbiB3ZXJlIHRvIGRlZmluZSBpdCBvbmUgd2F5IGZvciBhIGhvc3QgYW5kIGEgZGlmZmVyZW50IHdheQorZm9yIHRoZSB0YXJnZXQsIEdEQiB3aWxsIHByb2JhYmx5IG5vdCBjb21waWxlLCBsZXQgYWxvbmUgcnVuIGNvcnJlY3RseS4KK1RoaXMgaXMgY3VycmVudGx5IHVzZWQgb25seSBmb3IgdGhlIHVuc3VwcG9ydGVkIGk5NjAgTmluZHkgdGFyZ2V0LCBhbmQKK3Nob3VsZCBub3QgYmUgdXNlZCBpbiBhbnkgb3RoZXIgY29uZmlndXJhdGlvbi4KKworQGl0ZW0gQkVMSUVWRV9QQ0NfUFJPTU9USU9OCitEZWZpbmUgaWYgdGhlIGNvbXBpbGVyIHByb21vdGVzIGEgc2hvcnQgb3IgY2hhciBwYXJhbWV0ZXIgdG8gYW4gaW50LCBidXQKK3N0aWxsIHJlcG9ydHMgdGhlIHBhcmFtZXRlciBhcyBpdHMgb3JpZ2luYWwgdHlwZSwgcmF0aGVyIHRoYW4gdGhlCitwcm9tb3RlZCB0eXBlLgorCitAaXRlbSBCRUxJRVZFX1BDQ19QUk9NT1RJT05fVFlQRQorRGVmaW5lIHRoaXMgaWYgR0RCIHNob3VsZCBiZWxpZXZlIHRoZSB0eXBlIG9mIGEgc2hvcnQgYXJndW1lbnQgd2hlbgorY29tcGlsZWQgYnkgcGNjLCBidXQgbG9vayB3aXRoaW4gYSBmdWxsIGludCBzcGFjZSB0byBnZXQgaXRzIHZhbHVlLgorT25seSBkZWZpbmVkIGZvciBTdW4tMyBhdCBwcmVzZW50LgorCitAaXRlbSBCSVRTX0JJR19FTkRJQU4KK0RlZmluZSB0aGlzIGlmIHRoZSBudW1iZXJpbmcgb2YgYml0cyBpbiB0aGUgdGFyZ2V0cyBkb2VzICpub3QqIG1hdGNoIHRoZQorZW5kaWFubmVzcyBvZiB0aGUgdGFyZ2V0IGJ5dGUgb3JkZXIuICBBIHZhbHVlIG9mIDEgbWVhbnMgdGhhdCB0aGUgYml0cworYXJlIG51bWJlcmVkIGluIGEgYmlnLWVuZGlhbiBvcmRlciwgMCBtZWFucyBsaXR0bGUtZW5kaWFuLgorCitAaXRlbSBCUkVBS1BPSU5UCitUaGlzIGlzIHRoZSBjaGFyYWN0ZXIgYXJyYXkgaW5pdGlhbGl6ZXIgZm9yIHRoZSBiaXQgcGF0dGVybiB0byBwdXQgaW50bworbWVtb3J5IHdoZXJlIGEgYnJlYWtwb2ludCBpcyBzZXQuICBBbHRob3VnaCBpdCdzIGNvbW1vbiB0byB1c2UgYSB0cmFwCitpbnN0cnVjdGlvbiBmb3IgYSBicmVha3BvaW50LCBpdCdzIG5vdCByZXF1aXJlZDsgZm9yIGluc3RhbmNlLCB0aGUgYml0CitwYXR0ZXJuIGNvdWxkIGJlIGFuIGludmFsaWQgaW5zdHJ1Y3Rpb24uICBUaGUgYnJlYWtwb2ludCBtdXN0IGJlIG5vCitsb25nZXIgdGhhbiB0aGUgc2hvcnRlc3QgaW5zdHJ1Y3Rpb24gb2YgdGhlIGFyY2hpdGVjdHVyZS4KKworQGl0ZW0gQklHX0JSRUFLUE9JTlQKK0BpdGVtIExJVFRMRV9CUkVBS1BPSU5UCitTaW1pbGFyIHRvIEJSRUFLUE9JTlQsIGJ1dCB1c2VkIGZvciBiaS1lbmRpYW4gdGFyZ2V0cy4KKworQGl0ZW0gUkVNT1RFX0JSRUFLUE9JTlQKK0BpdGVtIExJVFRMRV9SRU1PVEVfQlJFQUtQT0lOVAorQGl0ZW0gQklHX1JFTU9URV9CUkVBS1BPSU5UCitTaW1pbGFyIHRvIEJSRUFLUE9JTlQsIGJ1dCB1c2VkIGZvciByZW1vdGUgdGFyZ2V0cy4KKworQGl0ZW0gQlJFQUtQT0lOVF9GUk9NX1BDIChwY3B0ciwgbGVucHRyKQorCitVc2UgdGhlIHByb2dyYW0gY291bnRlciB0byBkZXRlcm1pbmUgdGhlIGNvbnRlbnRzIGFuZCBzaXplIG9mIGEKK2JyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uICBJdCByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZyBvZiBieXRlcyB0aGF0CitlbmNvZGUgYSBicmVha3BvaW50IGluc3RydWN0aW9uLCBzdG9yZXMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRvCisqbGVucHRyLCBhbmQgYWRqdXN0cyBwYyAoaWYgbmVjZXNzYXJ5KSB0byBwb2ludCB0byB0aGUgYWN0dWFsIG1lbW9yeQorbG9jYXRpb24gd2hlcmUgdGhlIGJyZWFrcG9pbnQgc2hvdWxkIGJlIGluc2VydGVkLgorCitBbHRob3VnaCBpdCBpcyBjb21tb24gdG8gdXNlIGEgdHJhcCBpbnN0cnVjdGlvbiBmb3IgYSBicmVha3BvaW50LCBpdCdzCitub3QgcmVxdWlyZWQ7IGZvciBpbnN0YW5jZSwgdGhlIGJpdCBwYXR0ZXJuIGNvdWxkIGJlIGFuIGludmFsaWQKK2luc3RydWN0aW9uLiAgVGhlIGJyZWFrcG9pbnQgbXVzdCBiZSBubyBsb25nZXIgdGhhbiB0aGUgc2hvcnRlc3QKK2luc3RydWN0aW9uIG9mIHRoZSBhcmNoaXRlY3R1cmUuCisKK1JlcGxhY2VzIGFsbCB0aGUgb3RoZXIgQlJFQUtQT0lOVHMuCisKK0BpdGVtIENBTExfRFVNTVkKK3ZhbG9wcy5jCitAaXRlbSBDQUxMX0RVTU1ZX0xPQ0FUSU9OCitpbmZlcmlvci5oCitAaXRlbSBDQUxMX0RVTU1ZX1NUQUNLX0FESlVTVAordmFsb3BzLmMKKworQGl0ZW0gQ0FOTk9UX0ZFVENIX1JFR0lTVEVSIChyZWdubykKK0EgQyBleHByZXNzaW9uIHRoYXQgc2hvdWxkIGJlIG5vbnplcm8gaWYgQHZhcntyZWdub30gY2Fubm90IGJlIGZldGNoZWQKK2Zyb20gYW4gaW5mZXJpb3IgcHJvY2Vzcy4gIFRoaXMgaXMgb25seSByZWxldmFudCBpZgorQGNvZGV7RkVUQ0hfSU5GRVJJT1JfUkVHSVNURVJTfSBpcyBub3QgZGVmaW5lZC4KKworQGl0ZW0gQ0FOTk9UX1NUT1JFX1JFR0lTVEVSIChyZWdubykKK0EgQyBleHByZXNzaW9uIHRoYXQgc2hvdWxkIGJlIG5vbnplcm8gaWYgQHZhcntyZWdub30gc2hvdWxkIG5vdCBiZQord3JpdHRlbiB0byB0aGUgdGFyZ2V0LiAgVGhpcyBpcyBvZnRlbiB0aGUgY2FzZSBmb3IgcHJvZ3JhbSBjb3VudGVycywKK3N0YXR1cyB3b3JkcywgYW5kIG90aGVyIHNwZWNpYWwgcmVnaXN0ZXJzLiAgSWYgdGhpcyBpcyBub3QgZGVmaW5lZCwgR0RCCit3aWxsIGFzc3VtZSB0aGF0IGFsbCByZWdpc3RlcnMgbWF5IGJlIHdyaXR0ZW4uCisKK0BpdGVtIERPX0RFRkVSUkVEX1NUT1JFUworQGl0ZW0gQ0xFQVJfREVGRVJSRURfU1RPUkVTCitEZWZpbmUgdGhpcyB0byBleGVjdXRlIGFueSBkZWZlcnJlZCBzdG9yZXMgb2YgcmVnaXN0ZXJzIGludG8gdGhlIGluZmVyaW9yLAorYW5kIHRvIGNhbmNlbCBhbnkgZGVmZXJyZWQgc3RvcmVzLgorCitDdXJyZW50bHkgb25seSBpbXBsZW1lbnRlZCBjb3JyZWN0bHkgZm9yIG5hdGl2ZSBTcGFyYyBjb25maWd1cmF0aW9ucz8KKworQGl0ZW0gQ1BMVVNfTUFSS0VSCitEZWZpbmUgdGhpcyB0byBleHBhbmQgaW50byB0aGUgY2hhcmFjdGVyIHRoYXQgRysrIHVzZXMgdG8gZGlzdGluZ3Vpc2gKK2NvbXBpbGVyLWdlbmVyYXRlZCBpZGVudGlmaWVycyBmcm9tIHByb2dyYW1tZXItc3BlY2lmaWVkIGlkZW50aWZpZXJzLgorQnkgZGVmYXVsdCwgdGhpcyBleHBhbmRzIGludG8gQGNvZGV7JyQnfS4gIE1vc3QgU3lzdGVtIFYgdGFyZ2V0cyBzaG91bGQKK2RlZmluZSB0aGlzIHRvIEBjb2RleycuJ30uCisKK0BpdGVtIERCWF9QQVJNX1NZTUJPTF9DTEFTUworSG9vayBmb3IgdGhlIEBjb2Rle1NZTUJPTF9DTEFTU30gb2YgYSBwYXJhbWV0ZXIgd2hlbiBkZWNvZGluZyBEQlggc3ltYm9sCitpbmZvcm1hdGlvbi4gIEluIHRoZSBpOTYwLCBwYXJhbWV0ZXJzIGNhbiBiZSBzdG9yZWQgYXMgbG9jYWxzIG9yIGFzCithcmdzLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgdGhlIGRlYnVnIHJlY29yZC4KKworQGl0ZW0gREVDUl9QQ19BRlRFUl9CUkVBSworRGVmaW5lIHRoaXMgdG8gYmUgdGhlIGFtb3VudCBieSB3aGljaCB0byBkZWNyZW1lbnQgdGhlIFBDIGFmdGVyIHRoZQorcHJvZ3JhbSBlbmNvdW50ZXJzIGEgYnJlYWtwb2ludC4gIFRoaXMgaXMgb2Z0ZW4gdGhlIG51bWJlciBvZiBieXRlcyBpbgorQlJFQUtQT0lOVCwgdGhvdWdoIG5vdCBhbHdheXMuICBGb3IgbW9zdCB0YXJnZXRzIHRoaXMgdmFsdWUgd2lsbCBiZSAwLgorCitAaXRlbSBERUNSX1BDX0FGVEVSX0hXX0JSRUFLCitTaW1pbGFybHksIGZvciBoYXJkd2FyZSBicmVha3BvaW50cy4KKworQGl0ZW0gRElTQUJMRV9VTlNFVFRBQkxFX0JSRUFLIGFkZHIKK0lmIGRlZmluZWQsIHRoaXMgc2hvdWxkIGV2YWx1YXRlIHRvIDEgaWYgQHZhcnthZGRyfSBpcyBpbiBhIHNoYXJlZAorbGlicmFyeSBpbiB3aGljaCBicmVha3BvaW50cyBjYW5ub3QgYmUgc2V0IGFuZCBzbyBzaG91bGQgYmUgZGlzYWJsZWQuCisKK0BpdGVtIERPX1JFR0lTVEVSU19JTkZPCitJZiBkZWZpbmVkLCB1c2UgdGhpcyB0byBwcmludCB0aGUgdmFsdWUgb2YgYSByZWdpc3RlciBvciBhbGwgcmVnaXN0ZXJzLgorCitAaXRlbSBFTkRfT0ZfVEVYVF9ERUZBVUxUCitUaGlzIGlzIGFuIGV4cHJlc3Npb24gdGhhdCBzaG91bGQgZGVzaWduYXRlIHRoZSBlbmQgb2YgdGhlIHRleHQgc2VjdGlvbgorKD8gRklYTUUgPykKKworQGl0ZW0gRVhUUkFDVF9SRVRVUk5fVkFMVUUodHlwZSxyZWdidWYsdmFsYnVmKQorRGVmaW5lIHRoaXMgdG8gZXh0cmFjdCBhIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIG9mIHR5cGUgQHZhcnt0eXBlfSBmcm9tCit0aGUgcmF3IHJlZ2lzdGVyIHN0YXRlIEB2YXJ7cmVnYnVmfSBhbmQgY29weSB0aGF0LCBpbiB2aXJ0dWFsIGZvcm1hdCwKK2ludG8gQHZhcnt2YWxidWZ9LgorIAorQGl0ZW0gRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyhyZWdidWYpCitEZWZpbmUgdGhpcyB0byBleHRyYWN0IGZyb20gYW4gYXJyYXkgQHZhcntyZWdidWZ9IGNvbnRhaW5pbmcgdGhlIChyYXcpCityZWdpc3RlciBzdGF0ZSwgdGhlIGFkZHJlc3MgaW4gd2hpY2ggYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGl0cworc3RydWN0dXJlIHZhbHVlLCBhcyBhIENPUkVfQUREUiAob3IgYW4gZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSB1c2VkIGFzCitvbmUpLgorCitAaXRlbSBGTE9BVF9JTkZPCitJZiBkZWZpbmVkLCB0aGVuIHRoZSBgaW5mbyBmbG9hdCcgY29tbWFuZCB3aWxsIHByaW50IGluZm9ybWF0aW9uIGFib3V0Cit0aGUgcHJvY2Vzc29yJ3MgZmxvYXRpbmcgcG9pbnQgdW5pdC4KKworQGl0ZW0gRlBfUkVHTlVNCitUaGUgbnVtYmVyIG9mIHRoZSBmcmFtZSBwb2ludGVyIHJlZ2lzdGVyLgorCitAaXRlbSBGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTihmaSwgZnJhbWVsZXNzKQorRGVmaW5lIHRoaXMgdG8gc2V0IHRoZSB2YXJpYWJsZSBAdmFye2ZyYW1lbGVzc30gdG8gMSBpZiB0aGUgZnVuY3Rpb24KK2ludm9jYXRpb24gcmVwcmVzZW50ZWQgYnkgQHZhcntmaX0gZG9lcyBub3QgaGF2ZSBhIHN0YWNrIGZyYW1lCithc3NvY2lhdGVkIHdpdGggaXQuICBPdGhlcndpc2Ugc2V0IGl0IHRvIDAuCisKK0BpdGVtIEZSQU1FX0FSR1NfQUREUkVTU19DT1JSRUNUCitzdGFjay5jCisKK0BpdGVtIEZSQU1FX0NIQUlOKGZyYW1lKQorR2l2ZW4gQHZhcntmcmFtZX0sIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNhbGxpbmcgZnJhbWUuCisKK0BpdGVtIEZSQU1FX0NIQUlOX0NPTUJJTkUoY2hhaW4sZnJhbWUpCitEZWZpbmUgdGhpcyB0byB0YWtlIHRoZSBmcmFtZSBjaGFpbiBwb2ludGVyIGFuZCB0aGUgZnJhbWUncyBub21pbmFsCithZGRyZXNzIGFuZCBwcm9kdWNlIHRoZSBub21pbmFsIGFkZHJlc3Mgb2YgdGhlIGNhbGxlcidzIGZyYW1lLgorUHJlc2VudGx5IG9ubHkgZGVmaW5lZCBmb3IgSFAgUEEuCisKK0BpdGVtIEZSQU1FX0NIQUlOX1ZBTElEKGNoYWluLHRoaXNmcmFtZSkKKworRGVmaW5lIHRoaXMgdG8gYmUgYW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgemVybyBpZiB0aGUgZ2l2ZW4gZnJhbWUgaXMKK2FuIG91dGVybW9zdCBmcmFtZSwgd2l0aCBubyBjYWxsZXIsIGFuZCBub256ZXJvIG90aGVyd2lzZS4gIFRocmVlIGNvbW1vbgorZGVmaW5pdGlvbnMgYXJlIGF2YWlsYWJsZS4gQGNvZGV7ZGVmYXVsdF9mcmFtZV9jaGFpbl92YWxpZH0gKHRoZQorZGVmYXVsdCkgaXMgbm9uemVybyBpZiB0aGUgY2hhaW4gcG9pbnRlciBpcyBub256ZXJvIGFuZCBnaXZlbiBmcmFtZSdzIFBDCitpcyBub3QgaW5zaWRlIHRoZSBzdGFydHVwIGZpbGUgKHN1Y2ggYXMgQGZpbGV7Y3J0MC5vfSkuCitAY29kZXthbHRlcm5hdGVfZnJhbWVfY2hhaW5fdmFsaWR9IGlzIG5vbnplcm8gaWYgdGhlIGNoYWluIHBvaW50ZXIgaXMKK25vbnplcm8gYW5kIHRoZSBnaXZlbiBmcmFtZSdzIFBDIGlzIG5vdCBpbiBAY29kZXttYWluKCl9IG9yIGEga25vd24KK2VudHJ5IHBvaW50IGZ1bmN0aW9uIChzdWNoIGFzIEBjb2Rle19zdGFydCgpfSkuCisKK0BpdGVtIEZSQU1FX0lOSVRfU0FWRURfUkVHUyhmcmFtZSkKK1NlZSBAZmlsZXtmcmFtZS5ofS4gIERldGVybWluZXMgdGhlIGFkZHJlc3Mgb2YgYWxsIHJlZ2lzdGVycyBpbiB0aGUKK2N1cnJlbnQgc3RhY2sgZnJhbWUgc3RvcmluZyBlYWNoIGluIEBjb2Rle2ZyYW1lLT5zYXZlZF9yZWdzfS4gIFNwYWNlIGZvcgorQGNvZGV7ZnJhbWUtPnNhdmVkX3JlZ3N9IHNoYWxsIGJlIGFsbG9jYXRlZCBieQorQGNvZGV7RlJBTUVfSU5JVF9TQVZFRF9SRUdTfSB1c2luZyBlaXRoZXIKK0Bjb2Rle2ZyYW1lX3NhdmVkX3JlZ3NfemFsbG9jfSBvciBAY29kZXtmcmFtZV9vYnN0YWNrX2FsbG9jfS4KKworQHZhcntGUkFNRV9GSU5EX1NBVkVEX1JFR1N9IGFuZCBAdmFye0VYVFJBX0ZSQU1FX0lORk99IGFyZSBkZXByZWNhdGVkLgorCitAaXRlbSBGUkFNRV9OVU1fQVJHUyAodmFsLCBmaSkKK0ZvciB0aGUgZnJhbWUgZGVzY3JpYmVkIGJ5IEB2YXJ7Zml9LCBzZXQgQHZhcnt2YWx9IHRvIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzCit0aGF0IGFyZSBiZWluZyBwYXNzZWQuCisKK0BpdGVtIEZSQU1FX1NBVkVEX1BDKGZyYW1lKQorR2l2ZW4gQHZhcntmcmFtZX0sIHJldHVybiB0aGUgcGMgc2F2ZWQgdGhlcmUuICBUaGF0IGlzLCB0aGUgcmV0dXJuCithZGRyZXNzLgorCitAaXRlbSBGVU5DVElPTl9FUElMT0dVRV9TSVpFCitGb3Igc29tZSBDT0ZGIHRhcmdldHMsIHRoZSBAY29kZXt4X3N5bS54X21pc2MueF9mc2l6ZX0gZmllbGQgb2YgdGhlCitmdW5jdGlvbiBlbmQgc3ltYm9sIGlzIDAuICBGb3Igc3VjaCB0YXJnZXRzLCB5b3UgbXVzdCBkZWZpbmUKK0Bjb2Rle0ZVTkNUSU9OX0VQSUxPR1VFX1NJWkV9IHRvIGV4cGFuZCBpbnRvIHRoZSBzdGFuZGFyZCBzaXplIG9mIGEKK2Z1bmN0aW9uJ3MgZXBpbG9ndWUuCisKK0BpdGVtIEdDQ19DT01QSUxFRF9GTEFHX1NZTUJPTAorQGl0ZW0gR0NDMl9DT01QSUxFRF9GTEFHX1NZTUJPTAorSWYgZGVmaW5lZCwgdGhlc2UgYXJlIHRoZSBuYW1lcyBvZiB0aGUgc3ltYm9scyB0aGF0IEdEQiB3aWxsIGxvb2sgZm9yIHRvCitkZXRlY3QgdGhhdCBHQ0MgY29tcGlsZWQgdGhlIGZpbGUuICBUaGUgZGVmYXVsdCBzeW1ib2xzIGFyZQorQGNvZGV7Z2NjX2NvbXBpbGVkLn0gYW5kIEBjb2Rle2djYzJfY29tcGlsZWQufSwgcmVzcGVjdGl2ZWx5LiAoQ3VycmVudGx5Citvbmx5IGRlZmluZWQgZm9yIHRoZSBEZWx0YSA2OC4pCisKK0BpdGVtIEdEQl9UQVJHRVRfSVNfSFBQQQorVGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgaG9ycmlibGUga2x1ZGdlIGNvZGUgaW4gZGJ4cmVhZC5jIGFuZAorcGFydGlhbC1zdGFiLmggaXMgdXNlZCB0byBtYW5nbGUgbXVsdGlwbGUtc3ltYm9sLXRhYmxlIGZpbGVzIGZyb20KK0hQUEEncy4gIFRoaXMgc2hvdWxkIGFsbCBiZSByaXBwZWQgb3V0LCBhbmQgYSBzY2hlbWUgbGlrZSBlbGZyZWFkLmMKK3VzZWQuCisKK0BpdGVtIEdEQl9UQVJHRVRfSVNfTUFDSDM4NgorQGl0ZW0gR0RCX1RBUkdFVF9JU19TVU4zCitAaXRlbSBHREJfVEFSR0VUX0lTX1NVTjM4NgorS2x1ZGdlcyB0aGF0IHNob3VsZCBnbyBhd2F5LgorCitAaXRlbSBHRVRfTE9OR0pNUF9UQVJHRVQKK0ZvciBtb3N0IG1hY2hpbmVzLCB0aGlzIGlzIGEgdGFyZ2V0LWRlcGVuZGVudCBwYXJhbWV0ZXIuICBPbiB0aGUKK0RFQ3N0YXRpb24gYW5kIHRoZSBJcmlzLCB0aGlzIGlzIGEgbmF0aXZlLWRlcGVuZGVudCBwYXJhbWV0ZXIsIHNpbmNlCis8c2V0am1wLmg+IGlzIG5lZWRlZCB0byBkZWZpbmUgaXQuCisKK1RoaXMgbWFjcm8gZGV0ZXJtaW5lcyB0aGUgdGFyZ2V0IFBDIGFkZHJlc3MgdGhhdCBsb25nam1wKCkgd2lsbCBqdW1wIHRvLAorYXNzdW1pbmcgdGhhdCB3ZSBoYXZlIGp1c3Qgc3RvcHBlZCBhdCBhIGxvbmdqbXAgYnJlYWtwb2ludC4gIEl0IHRha2VzIGEKK0NPUkVfQUREUiAqIGFzIGFyZ3VtZW50LCBhbmQgc3RvcmVzIHRoZSB0YXJnZXQgUEMgdmFsdWUgdGhyb3VnaCB0aGlzCitwb2ludGVyLiAgSXQgZXhhbWluZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1hY2hpbmUgYXMgbmVlZGVkLgorCitAaXRlbSBHRVRfU0FWRURfUkVHSVNURVIKK0RlZmluZSB0aGlzIGlmIHlvdSBuZWVkIHRvIHN1cHBseSB5b3VyIG93biBkZWZpbml0aW9uIGZvciB0aGUgZnVuY3Rpb24KK0Bjb2Rle2dldF9zYXZlZF9yZWdpc3Rlcn0uICBDdXJyZW50bHkgdGhpcyBpcyBvbmx5IGRvbmUgZm9yIHRoZSBhMjlrLgorCitAaXRlbSBIQVZFX1JFR0lTVEVSX1dJTkRPV1MKK0RlZmluZSB0aGlzIGlmIHRoZSB0YXJnZXQgaGFzIHJlZ2lzdGVyIHdpbmRvd3MuCitAaXRlbSBSRUdJU1RFUl9JTl9XSU5ET1dfUCAocmVnbnVtKQorRGVmaW5lIHRoaXMgdG8gYmUgYW4gZXhwcmVzc2lvbiB0aGF0IGlzIDEgaWYgdGhlIGdpdmVuIHJlZ2lzdGVyIGlzIGluCit0aGUgd2luZG93LgorCitAaXRlbSBJQk02MDAwX1RBUkdFVAorU2hvd3MgdGhhdCB3ZSBhcmUgY29uZmlndXJlZCBmb3IgYW4gSUJNIFJTLzYwMDAgdGFyZ2V0LiAgVGhpcworY29uZGl0aW9uYWwgc2hvdWxkIGJlIGVsaW1pbmF0ZWQgKEZJWE1FKSBhbmQgcmVwbGFjZWQgYnkKK2ZlYXR1cmUtc3BlY2lmaWMgbWFjcm9zLiAgSXQgd2FzIGludHJvZHVjZWQgaW4gaGFzdGUgYW5kIHdlIGFyZQorcmVwZW50aW5nIGF0IGxlaXN1cmUuCisKK0BpdGVtIElFRUVfRkxPQVQKK0RlZmluZSB0aGlzIGlmIHRoZSB0YXJnZXQgc3lzdGVtIHVzZXMgSUVFRS1mb3JtYXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4KKworQGl0ZW0gSU5JVF9FWFRSQV9GUkFNRV9JTkZPIChmcm9tbGVhZiwgZnJhbWUpCitJZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmcmFtZSBpcyByZXF1aXJlZCB0aGlzIHNob3VsZCBiZQorc3RvcmVkIGluIEBjb2Rle2ZyYW1lLT5leHRyYV9pbmZvfS4gIFNwYWNlIGZvciBAY29kZXtmcmFtZS0+ZXh0cmFfaW5mb30KK2lzIGFsbG9jYXRlZCB1c2luZyBAY29kZXtmcmFtZV9vYnN0YWNrX2FsbG9jfS4KKworQGl0ZW0gSU5JVF9GUkFNRV9QQyAoZnJvbWxlYWYsIHByZXYpCitUaGlzIGlzIGEgQyBzdGF0ZW1lbnQgdGhhdCBzZXRzIHRoZSBwYyBvZiB0aGUgZnJhbWUgcG9pbnRlZCB0byBieQorQHZhcntwcmV2fS4gIFtCeSBkZWZhdWx0Li4uXQorCitAaXRlbSBJTk5FUl9USEFOIChsaHMscmhzKQorUmV0dXJucyBub24temVybyBpZiBzdGFjayBhZGRyZXNzIEB2YXJ7bGhzfSBpcyBpbm5lciB0aGFuIChuZWFyZXIgdG8gdGhlCitzdGFjayB0b3ApIHN0YWNrIGFkZHJlc3MgQHZhcntyaHN9LiBEZWZpbmUgdGhpcyBhcyBAY29kZXtsaHMgPCByaHN9IGlmCit0aGUgdGFyZ2V0J3Mgc3RhY2sgZ3Jvd3MgZG93bndhcmQgaW4gbWVtb3J5LCBvciBAY29kZXtsaHMgPiByc2h9IGlmIHRoZQorc3RhY2sgZ3Jvd3MgdXB3YXJkLgorCitAaXRlbSBJTl9TSUdUUkFNUCAocGMsIG5hbWUpCitEZWZpbmUgdGhpcyB0byByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gQHZhcntwY30gYW5kL29yIEB2YXJ7bmFtZX0KK2luZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IGZ1bmN0aW9uIGlzIGEgc2lndHJhbXAuCisKK0BpdGVtIFNJR1RSQU1QX1NUQVJUIChwYykKK0BpdGVtIFNJR1RSQU1QX0VORCAocGMpCitEZWZpbmUgdGhlc2UgdG8gYmUgdGhlIHN0YXJ0IGFuZCBlbmQgYWRkcmVzcyBvZiB0aGUgc2lndHJhbXAgZm9yIHRoZQorZ2l2ZW4gQHZhcntwY30uICBPbiBtYWNoaW5lcyB3aGVyZSB0aGUgYWRkcmVzcyBpcyBqdXN0IGEgY29tcGlsZSB0aW1lCitjb25zdGFudCwgdGhlIG1hY3JvIGV4cGFuc2lvbiB3aWxsIHR5cGljYWxseSBqdXN0IGlnbm9yZSB0aGUgc3VwcGxpZWQKK0B2YXJ7cGN9LgorCitAaXRlbSBJTl9TT0xJQl9DQUxMX1RSQU1QT0xJTkUgcGMgbmFtZQorRGVmaW5lIHRoaXMgdG8gZXZhbHVhdGUgdG8gbm9uemVybyBpZiB0aGUgcHJvZ3JhbSBpcyBzdG9wcGVkIGluIHRoZQordHJhbXBvbGluZSB0aGF0IGNvbm5lY3RzIHRvIGEgc2hhcmVkIGxpYnJhcnkuCisKK0BpdGVtIElOX1NPTElCX1JFVFVSTl9UUkFNUE9MSU5FIHBjIG5hbWUKK0RlZmluZSB0aGlzIHRvIGV2YWx1YXRlIHRvIG5vbnplcm8gaWYgdGhlIHByb2dyYW0gaXMgc3RvcHBlZCBpbiB0aGUKK3RyYW1wb2xpbmUgdGhhdCByZXR1cm5zIGZyb20gYSBzaGFyZWQgbGlicmFyeS4KKworQGl0ZW0gSVNfVFJBUFBFRF9JTlRFUk5BTFZBUiAobmFtZSkKK1RoaXMgaXMgYW4gdWdseSBob29rIHRvIGFsbG93IHRoZSBzcGVjaWZpY2F0aW9uIG9mIHNwZWNpYWwgYWN0aW9ucyB0aGF0CitzaG91bGQgb2NjdXIgYXMgYSBzaWRlLWVmZmVjdCBvZiBzZXR0aW5nIHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlCitpbnRlcm5hbCB0byBHREIuICBDdXJyZW50bHkgb25seSB1c2VkIGJ5IHRoZSBoODUwMC4gIE5vdGUgdGhhdCB0aGlzCitjb3VsZCBiZSBlaXRoZXIgYSBob3N0IG9yIHRhcmdldCBjb25kaXRpb25hbC4KKworQGl0ZW0gTkVFRF9URVhUX1NUQVJUX0VORAorRGVmaW5lIHRoaXMgaWYgR0RCIHNob3VsZCBkZXRlcm1pbmUgdGhlIHN0YXJ0IGFuZCBlbmQgYWRkcmVzc2VzIG9mIHRoZQordGV4dCBzZWN0aW9uLiAgKFNlZW1zIGR1YmlvdXMuKQorCitAaXRlbSBOT19ISUZfU1VQUE9SVAorKFNwZWNpZmljIHRvIHRoZSBhMjlrLikKKworQGl0ZW0gU09GVFdBUkVfU0lOR0xFX1NURVBfUAorRGVmaW5lIHRoaXMgYXMgMSBpZiB0aGUgdGFyZ2V0IGRvZXMgbm90IGhhdmUgYSBoYXJkd2FyZSBzaW5nbGUtc3RlcAorbWVjaGFuaXNtLiBUaGUgbWFjcm8gQGNvZGV7U09GVFdBUkVfU0lOR0xFX1NURVB9IG11c3QgYWxzbyBiZSBkZWZpbmVkLgorCitAaXRlbSBTT0ZUV0FSRV9TSU5HTEVfU1RFUChzaWduYWwsaW5zZXJ0X2JyZWFwb2ludHNfcCkKK0EgZnVuY3Rpb24gdGhhdCBpbnNlcnRzIG9yIHJlbW92ZXMgKGRlcGVuZGFudCBvbgorQHZhcntpbnNlcnRfYnJlYXBvaW50c19wfSkgYnJlYWtwb2ludHMgYXQgZWFjaCBwb3NzaWJsZSBkZXN0aW5hdGlvbnMgb2YKK3RoZSBuZXh0IGluc3RydWN0aW9uLiBTZWUgQGNvZGV7c3BhcmMtdGRlcC5jfSBhbmQgQGNvZGV7cnM2MDAwLXRkZXAuY30KK2ZvciBleGFtcGxlcy4KKworQGl0ZW0gUENDX1NPTF9CUk9LRU4KKyhVc2VkIG9ubHkgaW4gdGhlIENvbnZleCB0YXJnZXQuKQorCitAaXRlbSBQQ19JTl9DQUxMX0RVTU1ZCitpbmZlcmlvci5oCisKK0BpdGVtIFBDX0xPQURfU0VHTUVOVAorSWYgZGVmaW5lZCwgcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvYWQgc2VnbWVudCBmb3IgdGhlIHByb2dyYW0KK2NvdW50ZXIuICAoRGVmaW5lZCBvbmx5IGZvciB0aGUgUlMvNjAwMC4pCisKK0BpdGVtIFBDX1JFR05VTQorSWYgdGhlIHByb2dyYW0gY291bnRlciBpcyBrZXB0IGluIGEgcmVnaXN0ZXIsIHRoZW4gZGVmaW5lIHRoaXMgbWFjcm8gdG8KK2JlIHRoZSBudW1iZXIgb2YgdGhhdCByZWdpc3Rlci4gIFRoaXMgbmVlZCBiZSBkZWZpbmVkIG9ubHkgaWYKK0Bjb2Rle1RBUkdFVF9XUklURV9QQ30gaXMgbm90IGRlZmluZWQuCisKK0BpdGVtIE5QQ19SRUdOVU0KK1RoZSBudW1iZXIgb2YgdGhlIGBgbmV4dCBwcm9ncmFtIGNvdW50ZXInJyByZWdpc3RlciwgaWYgZGVmaW5lZC4KKworQGl0ZW0gTk5QQ19SRUdOVU0KK1RoZSBudW1iZXIgb2YgdGhlIGBgbmV4dCBuZXh0IHByb2dyYW0gY291bnRlcicnIHJlZ2lzdGVyLCBpZiBkZWZpbmVkLgorQ3VycmVudGx5LCB0aGlzIGlzIG9ubHkgZGVmaW5lZCBmb3IgdGhlIE1vdG9yb2xhIDg4Sy4KKworQGl0ZW0gUFJJTlRfUkVHSVNURVJfSE9PSyAocmVnbm8pCitJZiBkZWZpbmVkLCB0aGlzIG11c3QgYmUgYSBmdW5jdGlvbiB0aGF0IHByaW50cyB0aGUgY29udGVudHMgb2YgdGhlCitnaXZlbiByZWdpc3RlciB0byBzdGFuZGFyZCBvdXRwdXQuCisKK0BpdGVtIFBSSU5UX1RZUEVMRVNTX0lOVEVHRVIKK1RoaXMgaXMgYW4gb2JzY3VyZSBzdWJzdGl0dXRlIGZvciBAY29kZXtwcmludF9sb25nZXN0fSB0aGF0IHNlZW1zIHRvCitoYXZlIGJlZW4gZGVmaW5lZCBmb3IgdGhlIENvbnZleCB0YXJnZXQuCisKK0BpdGVtIFBST0NFU1NfTElORU5VTUJFUl9IT09LCitBIGhvb2sgZGVmaW5lZCBmb3IgWENPRkYgcmVhZGluZy4KKworQGl0ZW0gUFJPTE9HVUVfRklSU1RMSU5FX09WRVJMQVAKKyhPbmx5IHVzZWQgaW4gdW5zdXBwb3J0ZWQgQ29udmV4IGNvbmZpZ3VyYXRpb24uKQorCitAaXRlbSBQU19SRUdOVU0KK0lmIGRlZmluZWQsIHRoaXMgaXMgdGhlIG51bWJlciBvZiB0aGUgcHJvY2Vzc29yIHN0YXR1cyByZWdpc3Rlci4gIChUaGlzCitkZWZpbml0aW9uIGlzIG9ubHkgdXNlZCBpbiBnZW5lcmljIGNvZGUgd2hlbiBwYXJzaW5nICIkcHMiLikKKworQGl0ZW0gUE9QX0ZSQU1FCitVc2VkIGluIEBzYW1we2NhbGxfZnVuY3Rpb25fYnlfaGFuZH0gdG8gcmVtb3ZlIGFuIGFydGlmaWNpYWwgc3RhY2sKK2ZyYW1lLgorCitAaXRlbSBQVVNIX0FSR1VNRU5UUyAobmFyZ3MsIGFyZ3MsIHNwLCBzdHJ1Y3RfcmV0dXJuLCBzdHJ1Y3RfYWRkcikKK0RlZmluZSB0aGlzIHRvIHB1c2ggYXJndW1lbnRzIG9udG8gdGhlIHN0YWNrIGZvciBpbmZlcmlvciBmdW5jdGlvbiBjYWxsLgorCitAaXRlbSBQVVNIX0RVTU1ZX0ZSQU1FCitVc2VkIGluIEBzYW1we2NhbGxfZnVuY3Rpb25fYnlfaGFuZH0gdG8gY3JlYXRlIGFuIGFydGlmaWNpYWwgc3RhY2sgZnJhbWUuCisKK0BpdGVtIFJFR0lTVEVSX0JZVEVTCitUaGUgdG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCB0byBzdG9yZSBHREIncyBjb3B5IG9mIHRoZSBtYWNoaW5lJ3MKK3JlZ2lzdGVyIHN0YXRlLgorCitAaXRlbSBSRUdJU1RFUl9OQU1FKGkpCitSZXR1cm4gdGhlIG5hbWUgb2YgcmVnaXN0ZXIgQHZhcntpfSBhcyBhIHN0cmluZy4gIE1heSByZXR1cm4gQHZhcntOVUxMfQorb3IgQHZhcntOVUx9IHRvIGluZGljYXRlIHRoYXQgcmVnaXN0ZXIgQHZhcntpfSBpcyBub3QgdmFsaWQuCisKK0BpdGVtIFJFR19TVFJVQ1RfSEFTX0FERFIgKGdjY19wLCB0eXBlKQorRGVmaW5lIHRoaXMgdG8gcmV0dXJuIDEgaWYgdGhlIGdpdmVuIHR5cGUgd2lsbCBiZSBwYXNzZWQgYnkgcG9pbnRlcgorcmF0aGVyIHRoYW4gZGlyZWN0bHkuCisKK0BpdGVtIFNEQl9SRUdfVE9fUkVHTlVNCitEZWZpbmUgdGhpcyB0byBjb252ZXJ0IHNkYiByZWdpc3RlciBudW1iZXJzIGludG8gR0RCIHJlZ251bXMuICBJZiBub3QKK2RlZmluZWQsIG5vIGNvbnZlcnNpb24gd2lsbCBiZSBkb25lLgorCitAaXRlbSBTSElGVF9JTlNUX1JFR1MKKyhPbmx5IHVzZWQgZm9yIG04OGsgdGFyZ2V0cy4pCisKK0BpdGVtIFNLSVBfUFJPTE9HVUUgKHBjKQorQSBDIHN0YXRlbWVudCB0aGF0IGFkdmFuY2VzIHRoZSBAdmFye3BjfSBhY3Jvc3MgYW55IGZ1bmN0aW9uIGVudHJ5Citwcm9sb2d1ZSBpbnN0cnVjdGlvbnMgc28gYXMgdG8gcmVhY2ggYGByZWFsJycgY29kZS4KKworQGl0ZW0gU0tJUF9QUk9MT0dVRV9GUkFNRUxFU1NfUAorQSBDIHN0YXRlbWVudCB0aGF0IHNob3VsZCBiZWhhdmUgc2ltaWxhcmx5LCBidXQgdGhhdCBjYW4gc3RvcCBhcyBzb29uIGFzCit0aGUgZnVuY3Rpb24gaXMga25vd24gdG8gaGF2ZSBhIGZyYW1lLiAgSWYgbm90IGRlZmluZWQsCitAY29kZXtTS0lQX1BST0xPR1VFfSB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KKworQGl0ZW0gU0tJUF9UUkFNUE9MSU5FX0NPREUgKHBjKQorSWYgdGhlIHRhcmdldCBtYWNoaW5lIGhhcyB0cmFtcG9saW5lIGNvZGUgdGhhdCBzaXRzIGJldHdlZW4gY2FsbGVycyBhbmQKK3RoZSBmdW5jdGlvbnMgYmVpbmcgY2FsbGVkLCB0aGVuIGRlZmluZSB0aGlzIG1hY3JvIHRvIHJldHVybiBhIG5ldyBQQwordGhhdCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHJlYWwgZnVuY3Rpb24uCisKK0BpdGVtIFNQX1JFR05VTQorRGVmaW5lIHRoaXMgdG8gYmUgdGhlIG51bWJlciBvZiB0aGUgcmVnaXN0ZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIHN0YWNrCitwb2ludGVyLgorCitAaXRlbSBTVEFCX1JFR19UT19SRUdOVU0KK0RlZmluZSB0aGlzIHRvIGNvbnZlcnQgc3RhYiByZWdpc3RlciBudW1iZXJzIChhcyBnb3R0ZW4gZnJvbSBgcicKK2RlY2xhcmF0aW9ucykgaW50byBHREIgcmVnbnVtcy4gIElmIG5vdCBkZWZpbmVkLCBubyBjb252ZXJzaW9uIHdpbGwgYmUKK2RvbmUuCisKK0BpdGVtIFNUQUNLX0FMSUdOIChhZGRyKQorRGVmaW5lIHRoaXMgdG8gYWRqdXN0IHRoZSBhZGRyZXNzIHRvIHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoZQorcHJvY2Vzc29yJ3Mgc3RhY2suCisKK0BpdGVtIFNURVBfU0tJUFNfREVMQVkgKGFkZHIpCitEZWZpbmUgdGhpcyB0byByZXR1cm4gdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBvZiBhbiBpbnN0cnVjdGlvbiB3aXRoIGEKK2RlbGF5IHNsb3QuICBJZiBhIGJyZWFrcG9pbnQgaGFzIGJlZW4gcGxhY2VkIGluIHRoZSBpbnN0cnVjdGlvbidzIGRlbGF5CitzbG90LCBHREIgd2lsbCBzaW5nbGUtc3RlcCBvdmVyIHRoYXQgaW5zdHJ1Y3Rpb24gYmVmb3JlIHJlc3VtaW5nCitub3JtYWxseS4gIEN1cnJlbnRseSBvbmx5IGRlZmluZWQgZm9yIHRoZSBNaXBzLgorCitAaXRlbSBTVE9SRV9SRVRVUk5fVkFMVUUgKHR5cGUsIHZhbGJ1ZikKK0EgQyBleHByZXNzaW9uIHRoYXQgc3RvcmVzIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIG9mIHR5cGUgQHZhcnt0eXBlfSwKK3doZXJlIEB2YXJ7dmFsYnVmfSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgdmFsdWUgdG8gYmUgc3RvcmVkLgorCitAaXRlbSBTVU5fRklYRURfTEJSQUNfQlVHCisoVXNlZCBvbmx5IGZvciBTdW4tMyBhbmQgU3VuLTQgdGFyZ2V0cy4pCisKK0BpdGVtIFNZTUJPTF9SRUxPQURJTkdfREVGQVVMVAorVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGBzeW1ib2wtcmVsb2FkaW5nJyB2YXJpYWJsZS4gIChOZXZlciBkZWZpbmVkIGluCitjdXJyZW50IHNvdXJjZXMuKQorCitAaXRlbSBUQVJHRVRfQllURV9PUkRFUl9ERUZBVUxUCitUaGUgb3JkZXJpbmcgb2YgYnl0ZXMgaW4gdGhlIHRhcmdldC4gIFRoaXMgbXVzdCBiZSBlaXRoZXIKK0Bjb2Rle0JJR19FTkRJQU59IG9yIEBjb2Rle0xJVFRMRV9FTkRJQU59LiAgVGhpcyBtYWNybyByZXBsYWNlcworQHZhcntUQVJHRVRfQllURV9PUkRFUn0gd2hpY2ggaXMgZGVwcmVjYXRlZC4KKworQGl0ZW0gVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRV9QCitOb24temVybyBpZiB0aGUgdGFyZ2V0IGhhcyBib3RoIEBjb2Rle0JJR19FTkRJQU59IGFuZAorQGNvZGV7TElUVExFX0VORElBTn0gdmFyaWFudHMuICBUaGlzIG1hY3JvIHJlcGxhY2VzCitAdmFye1RBUkdFVF9CWVRFX09SREVSX1NFTEVDVEFCTEV9IHdoaWNoIGlzIGRlcHJlY2F0ZWQuCisKK0BpdGVtIFRBUkdFVF9DSEFSX0JJVAorTnVtYmVyIG9mIGJpdHMgaW4gYSBjaGFyOyBkZWZhdWx0cyB0byA4LgorCitAaXRlbSBUQVJHRVRfQ09NUExFWF9CSVQKK051bWJlciBvZiBiaXRzIGluIGEgY29tcGxleCBudW1iZXI7IGRlZmF1bHRzIHRvIEBjb2RlezIgKiBUQVJHRVRfRkxPQVRfQklUfS4KKworQGl0ZW0gVEFSR0VUX0RPVUJMRV9CSVQKK051bWJlciBvZiBiaXRzIGluIGEgZG91YmxlIGZsb2F0OyBkZWZhdWx0cyB0byBAY29kZXs4ICogVEFSR0VUX0NIQVJfQklUfS4KKworQGl0ZW0gVEFSR0VUX0RPVUJMRV9DT01QTEVYX0JJVAorTnVtYmVyIG9mIGJpdHMgaW4gYSBkb3VibGUgY29tcGxleDsgZGVmYXVsdHMgdG8gQGNvZGV7MiAqIFRBUkdFVF9ET1VCTEVfQklUfS4KKworQGl0ZW0gVEFSR0VUX0ZMT0FUX0JJVAorTnVtYmVyIG9mIGJpdHMgaW4gYSBmbG9hdDsgZGVmYXVsdHMgdG8gQGNvZGV7NCAqIFRBUkdFVF9DSEFSX0JJVH0uCisKK0BpdGVtIFRBUkdFVF9JTlRfQklUCitOdW1iZXIgb2YgYml0cyBpbiBhbiBpbnRlZ2VyOyBkZWZhdWx0cyB0byBAY29kZXs0ICogVEFSR0VUX0NIQVJfQklUfS4KKworQGl0ZW0gVEFSR0VUX0xPTkdfQklUCitOdW1iZXIgb2YgYml0cyBpbiBhIGxvbmcgaW50ZWdlcjsgZGVmYXVsdHMgdG8gQGNvZGV7NCAqIFRBUkdFVF9DSEFSX0JJVH0uCisKK0BpdGVtIFRBUkdFVF9MT05HX0RPVUJMRV9CSVQKK051bWJlciBvZiBiaXRzIGluIGEgbG9uZyBkb3VibGUgZmxvYXQ7CitkZWZhdWx0cyB0byBAY29kZXsyICogVEFSR0VUX0RPVUJMRV9CSVR9LgorCitAaXRlbSBUQVJHRVRfTE9OR19MT05HX0JJVAorTnVtYmVyIG9mIGJpdHMgaW4gYSBsb25nIGxvbmcgaW50ZWdlcjsgZGVmYXVsdHMgdG8gQGNvZGV7MiAqIFRBUkdFVF9MT05HX0JJVH0uCisKK0BpdGVtIFRBUkdFVF9QVFJfQklUCitOdW1iZXIgb2YgYml0cyBpbiBhIHBvaW50ZXI7IGRlZmF1bHRzIHRvIEBjb2Rle1RBUkdFVF9JTlRfQklUfS4KKworQGl0ZW0gVEFSR0VUX1NIT1JUX0JJVAorTnVtYmVyIG9mIGJpdHMgaW4gYSBzaG9ydCBpbnRlZ2VyOyBkZWZhdWx0cyB0byBAY29kZXsyICogVEFSR0VUX0NIQVJfQklUfS4KKworQGl0ZW0gVEFSR0VUX1JFQURfUEMKK0BpdGVtIFRBUkdFVF9XUklURV9QQyAodmFsLCBwaWQpCitAaXRlbSBUQVJHRVRfUkVBRF9TUAorQGl0ZW0gVEFSR0VUX1dSSVRFX1NQCitAaXRlbSBUQVJHRVRfUkVBRF9GUAorQGl0ZW0gVEFSR0VUX1dSSVRFX0ZQCitUaGVzZSBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIEBjb2Rle3JlYWRfcGN9LCBAY29kZXt3cml0ZV9wY30sCitAY29kZXtyZWFkX3NwfSwgQGNvZGV7d3JpdGVfc3B9LCBAY29kZXtyZWFkX2ZwfSBhbmQgQGNvZGV7d3JpdGVfZnB9LgorRm9yIG1vc3QgdGFyZ2V0cywgdGhlc2UgbWF5IGJlIGxlZnQgdW5kZWZpbmVkLiAgR0RCIHdpbGwgY2FsbCB0aGUgcmVhZAorYW5kIHdyaXRlIHJlZ2lzdGVyIGZ1bmN0aW9ucyB3aXRoIHRoZSByZWxldmFudCBAY29kZXtfUkVHTlVNfSBhcmd1bWVudC4KKworVGhlc2UgbWFjcm9zIGFyZSB1c2VmdWwgd2hlbiBhIHRhcmdldCBrZWVwcyBvbmUgb2YgdGhlc2UgcmVnaXN0ZXJzIGluIGEKK2hhcmQgdG8gZ2V0IGF0IHBsYWNlOyBmb3IgZXhhbXBsZSwgcGFydCBpbiBhIHNlZ21lbnQgcmVnaXN0ZXIgYW5kIHBhcnQKK2luIGFuIG9yZGluYXJ5IHJlZ2lzdGVyLgorCitAaXRlbSBUQVJHRVRfVklSVFVBTF9GUkFNRV9QT0lOVEVSKHBjLHJlZ3Asb2Zmc2V0cCkKK1JldHVybnMgYSBAY29kZXsocmVnaXN0ZXIsIG9mZnNldCl9IHBhaXIgcmVwcmVzZW50aW5nIHRoZSB2aXJ0dWFsIAorZnJhbWUgcG9pbnRlciBpbiB1c2UgYXQgdGhlIGNvZGUgYWRkcmVzcyBAY29kZXsicGMifS4gIElmIHZpcnR1YWwgCitmcmFtZSBwb2ludGVycyBhcmUgbm90IHVzZWQsIGEgZGVmYXVsdCBkZWZpbml0aW9uIHNpbXBseSByZXR1cm5zIAorQGNvZGV7RlBfUkVHTlVNfSwgd2l0aCBhbiBvZmZzZXQgb2YgemVyby4KKworQGl0ZW0gVVNFX1NUUlVDVF9DT05WRU5USU9OIChnY2NfcCwgdHlwZSkKK0lmIGRlZmluZWQsIHRoaXMgbXVzdCBiZSBhbiBleHByZXNzaW9uIHRoYXQgaXMgbm9uemVybyBpZiBhIHZhbHVlIG9mIHRoZQorZ2l2ZW4gQHZhcnt0eXBlfSBiZWluZyByZXR1cm5lZCBmcm9tIGEgZnVuY3Rpb24gbXVzdCBoYXZlIHNwYWNlCithbGxvY2F0ZWQgZm9yIGl0IG9uIHRoZSBzdGFjay4gIEB2YXJ7Z2NjX3B9IGlzIHRydWUgaWYgdGhlIGZ1bmN0aW9uCitiZWluZyBjb25zaWRlcmVkIGlzIGtub3duIHRvIGhhdmUgYmVlbiBjb21waWxlZCBieSBHQ0M7IHRoaXMgaXMgaGVscGZ1bAorZm9yIHN5c3RlbXMgd2hlcmUgR0NDIGlzIGtub3duIHRvIHVzZSBkaWZmZXJlbnQgY2FsbGluZyBjb252ZW50aW9uIHRoYW4KK290aGVyIGNvbXBpbGVycy4KKworQGl0ZW0gVkFSSUFCTEVTX0lOU0lERV9CTE9DSyAoZGVzYywgZ2NjX3ApCitGb3IgZGJ4LXN0eWxlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgaWYgdGhlIGNvbXBpbGVyIHB1dHMgdmFyaWFibGUKK2RlY2xhcmF0aW9ucyBpbnNpZGUgTEJSQUMvUkJSQUMgYmxvY2tzLCB0aGlzIHNob3VsZCBiZSBkZWZpbmVkIHRvIGJlCitub256ZXJvLiAgQHZhcntkZXNjfSBpcyB0aGUgdmFsdWUgb2YgQGNvZGV7bl9kZXNjfSBmcm9tIHRoZQorQGNvZGV7Tl9SQlJBQ30gc3ltYm9sLCBhbmQgQHZhcntnY2NfcH0gaXMgdHJ1ZSBpZiBHREIgaGFzIG5vdGljZWQgdGhlCitwcmVzZW5jZSBvZiBlaXRoZXIgdGhlIEBjb2Rle0dDQ19DT01QSUxFRF9TWU1CT0x9IG9yIHRoZQorQGNvZGV7R0NDMl9DT01QSUxFRF9TWU1CT0x9LiAgQnkgZGVmYXVsdCwgdGhpcyBpcyAwLgorCitAaXRlbSBPUzlLX1ZBUklBQkxFU19JTlNJREVfQkxPQ0sgKGRlc2MsIGdjY19wKQorU2ltaWxhcmx5LCBmb3IgT1MvOTAwMC4gIERlZmF1bHRzIHRvIDEuCisKK0BlbmQgdGFibGUKKworTW90b3JvbGEgTTY4SyB0YXJnZXQgY29uZGl0aW9uYWxzLgorCitAdGFibGUgQGNvZGUKKworQGl0ZW0gQlBUX1ZFQ1RPUgorRGVmaW5lIHRoaXMgdG8gYmUgdGhlIDQtYml0IGxvY2F0aW9uIG9mIHRoZSBicmVha3BvaW50IHRyYXAgdmVjdG9yLiAgSWYKK25vdCBkZWZpbmVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gQGNvZGV7MHhmfS4KKworQGl0ZW0gUkVNT1RFX0JQVF9WRUNUT1IKK0RlZmF1bHRzIHRvIEBjb2RlezF9LgorCitAZW5kIHRhYmxlCisKK0BzZWN0aW9uIEFkZGluZyBhIE5ldyBUYXJnZXQKKworVGhlIGZvbGxvd2luZyBmaWxlcyBkZWZpbmUgYSB0YXJnZXQgdG8gR0RCOgorCitAdGFibGUgQGZpbGUKKworQGl0ZW0gZ2RiL2NvbmZpZy9AdmFye2FyY2h9L0B2YXJ7dHR0fS5tdAorQ29udGFpbnMgYSBNYWtlZmlsZSBmcmFnbWVudCBzcGVjaWZpYyB0byB0aGlzIHRhcmdldC4gIFNwZWNpZmllcyB3aGF0CitvYmplY3QgZmlsZXMgYXJlIG5lZWRlZCBmb3IgdGFyZ2V0IEB2YXJ7dHR0fSwgYnkgZGVmaW5pbmcKK0BzYW1we1RERVBGSUxFUz1AZG90c3t9fS4gIEFsc28gc3BlY2lmaWVzIHRoZSBoZWFkZXIgZmlsZSB3aGljaAorZGVzY3JpYmVzIEB2YXJ7dHR0fSwgYnkgZGVmaW5pbmcgQHNhbXB7VE1fRklMRT0gdG0tQHZhcnt0dHR9Lmh9LiAgWW91CitjYW4gYWxzbyBkZWZpbmUgQHNhbXB7VE1fQ0ZMQUdTfSwgQHNhbXB7VE1fQ0xJQlN9LCBAc2FtcHtUTV9DREVQU30sIGJ1dAordGhlc2UgYXJlIG5vdyBkZXByZWNhdGVkIGFuZCBtYXkgZ28gYXdheSBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgR0RCLgorCitAaXRlbSBnZGIvY29uZmlnL0B2YXJ7YXJjaH0vdG0tQHZhcnt0dHR9LmgKKyhAZmlsZXt0bS5ofSBpcyBhIGxpbmsgdG8gdGhpcyBmaWxlLCBjcmVhdGVkIGJ5IGNvbmZpZ3VyZSkuICBDb250YWlucworbWFjcm8gZGVmaW5pdGlvbnMgYWJvdXQgdGhlIHRhcmdldCBtYWNoaW5lJ3MgcmVnaXN0ZXJzLCBzdGFjayBmcmFtZQorZm9ybWF0IGFuZCBpbnN0cnVjdGlvbnMuCisKK0BpdGVtIGdkYi9AdmFye3R0dH0tdGRlcC5jCitDb250YWlucyBhbnkgbWlzY2VsbGFuZW91cyBjb2RlIHJlcXVpcmVkIGZvciB0aGlzIHRhcmdldCBtYWNoaW5lLiAgT24KK3NvbWUgbWFjaGluZXMgaXQgZG9lc24ndCBleGlzdCBhdCBhbGwuICBTb21ldGltZXMgdGhlIG1hY3JvcyBpbgorQGZpbGV7dG0tQHZhcnt0dHR9Lmh9IGJlY29tZSB2ZXJ5IGNvbXBsaWNhdGVkLCBzbyB0aGV5IGFyZSBpbXBsZW1lbnRlZAorYXMgZnVuY3Rpb25zIGhlcmUgaW5zdGVhZCwgYW5kIHRoZSBtYWNybyBpcyBzaW1wbHkgZGVmaW5lZCB0byBjYWxsIHRoZQorZnVuY3Rpb24uICBUaGlzIGlzIHZhc3RseSBwcmVmZXJhYmxlLCBzaW5jZSBpdCBpcyBlYXNpZXIgdG8gdW5kZXJzdGFuZAorYW5kIGRlYnVnLgorCitAaXRlbSBnZGIvY29uZmlnL0B2YXJ7YXJjaH0vdG0tQHZhcnthcmNofS5oCitUaGlzIG9mdGVuIGV4aXN0cyB0byBkZXNjcmliZSB0aGUgYmFzaWMgbGF5b3V0IG9mIHRoZSB0YXJnZXQgbWFjaGluZSdzCitwcm9jZXNzb3IgY2hpcCAocmVnaXN0ZXJzLCBzdGFjaywgZXRjKS4gIElmIHVzZWQsIGl0IGlzIGluY2x1ZGVkIGJ5CitAZmlsZXt0bS1AdmFye3R0dH0uaH0uICBJdCBjYW4gYmUgc2hhcmVkIGFtb25nIG1hbnkgdGFyZ2V0cyB0aGF0IHVzZSB0aGUKK3NhbWUgcHJvY2Vzc29yLgorCitAaXRlbSBnZGIvQHZhcnthcmNofS10ZGVwLmMKK1NpbWlsYXJseSwgdGhlcmUgYXJlIG9mdGVuIGNvbW1vbiBzdWJyb3V0aW5lcyB0aGF0IGFyZSBzaGFyZWQgYnkgYWxsCit0YXJnZXQgbWFjaGluZXMgdGhhdCB1c2UgdGhpcyBwYXJ0aWN1bGFyIGFyY2hpdGVjdHVyZS4KKworQGVuZCB0YWJsZQorCitJZiB5b3UgYXJlIGFkZGluZyBhIG5ldyBvcGVyYXRpbmcgc3lzdGVtIGZvciBhbiBleGlzdGluZyBDUFUgY2hpcCwgYWRkIGEKK0BmaWxle2NvbmZpZy90bS1AdmFye29zfS5ofSBmaWxlIHRoYXQgZGVzY3JpYmVzIHRoZSBvcGVyYXRpbmcgc3lzdGVtCitmYWNpbGl0aWVzIHRoYXQgYXJlIHVudXN1YWwgKGV4dHJhIHN5bWJvbCB0YWJsZSBpbmZvOyB0aGUgYnJlYWtwb2ludAoraW5zdHJ1Y3Rpb24gbmVlZGVkOyBldGMpLiAgVGhlbiB3cml0ZSBhIEBmaWxle0B2YXJ7YXJjaH0vdG0tQHZhcntvc30uaH0KK3RoYXQganVzdCBAY29kZXsjaW5jbHVkZX1zIEBmaWxle3RtLUB2YXJ7YXJjaH0uaH0gYW5kCitAZmlsZXtjb25maWcvdG0tQHZhcntvc30uaH0uCisKKworQG5vZGUgVGFyZ2V0IFZlY3RvciBEZWZpbml0aW9uCisKK0BjaGFwdGVyIFRhcmdldCBWZWN0b3IgRGVmaW5pdGlvbgorCitUaGUgdGFyZ2V0IHZlY3RvciBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBHREIncyBhYnN0cmFjdCBoYW5kbGluZworb2YgdGFyZ2V0IHN5c3RlbXMsIGFuZCB0aGUgbml0dHktZ3JpdHR5IGNvZGUgdGhhdCBhY3R1YWxseSBleGVyY2lzZXMKK2NvbnRyb2wgb3ZlciBhIHByb2Nlc3Mgb3IgYSBzZXJpYWwgcG9ydC4gIEdEQiBpbmNsdWRlcyBzb21lIDMwLTQwCitkaWZmZXJlbnQgdGFyZ2V0IHZlY3RvcnM7IGhvd2V2ZXIsIGVhY2ggY29uZmlndXJhdGlvbiBvZiBHREIgaW5jbHVkZXMKK29ubHkgYSBmZXcgb2YgdGhlbS4KKworQHNlY3Rpb24gRmlsZSBUYXJnZXRzCisKK0JvdGggZXhlY3V0YWJsZXMgYW5kIGNvcmUgZmlsZXMgaGF2ZSB0YXJnZXQgdmVjdG9ycy4KKworQHNlY3Rpb24gU3RhbmRhcmQgUHJvdG9jb2wgYW5kIFJlbW90ZSBTdHVicworCitHREIncyBmaWxlIEBmaWxle3JlbW90ZS5jfSB0YWxrcyBhIHNlcmlhbCBwcm90b2NvbCB0byBjb2RlIHRoYXQgcnVucyBpbgordGhlIHRhcmdldCBzeXN0ZW0uICBHREIgcHJvdmlkZXMgc2V2ZXJhbCBzYW1wbGUgYGBzdHVicycnIHRoYXQgY2FuIGJlCitpbnRlZ3JhdGVkIGludG8gdGFyZ2V0IHByb2dyYW1zIG9yIG9wZXJhdGluZyBzeXN0ZW1zIGZvciB0aGlzIHB1cnBvc2U7Cit0aGV5IGFyZSBuYW1lZCBAZmlsZXsqLXN0dWIuY30uCisKK1RoZSBHREIgdXNlcidzIG1hbnVhbCBkZXNjcmliZXMgaG93IHRvIHB1dCBzdWNoIGEgc3R1YiBpbnRvIHlvdXIgdGFyZ2V0Citjb2RlLiAgV2hhdCBmb2xsb3dzIGlzIGEgZGlzY3Vzc2lvbiBvZiBpbnRlZ3JhdGluZyB0aGUgU1BBUkMgc3R1YiBpbnRvIGEKK2NvbXBsaWNhdGVkIG9wZXJhdGluZyBzeXN0ZW0gKHJhdGhlciB0aGFuIGEgc2ltcGxlIHByb2dyYW0pLCBieSBTdHUKK0dyb3NzbWFuLCB0aGUgYXV0aG9yIG9mIHRoaXMgc3R1Yi4KKworVGhlIHRyYXAgaGFuZGxpbmcgY29kZSBpbiB0aGUgc3R1YiBhc3N1bWVzIHRoZSBmb2xsb3dpbmcgdXBvbiBlbnRyeSB0bwordHJhcF9sb3c6CisKK0BlbnVtZXJhdGUKKworQGl0ZW0gJWwxIGFuZCAlbDIgY29udGFpbiBwYyBhbmQgbnBjIHJlc3BlY3RpdmVseSBhdCB0aGUgdGltZSBvZiB0aGUgdHJhcAorCitAaXRlbSB0cmFwcyBhcmUgZGlzYWJsZWQKKworQGl0ZW0geW91IGFyZSBpbiB0aGUgY29ycmVjdCB0cmFwIHdpbmRvdworCitAZW5kIGVudW1lcmF0ZQorCitBcyBsb25nIGFzIHlvdXIgdHJhcCBoYW5kbGVyIGNhbiBndWFyYW50ZWUgdGhvc2UgY29uZGl0aW9ucywgdGhlbiB0aGVyZQoraXMgbm8gcmVhc29uIHdoeSB5b3Ugc2hvdWxkbid0IGJlIGFibGUgdG8gYHNoYXJlJyB0cmFwcyB3aXRoIHRoZSBzdHViLgorVGhlIHN0dWIgaGFzIG5vIHJlcXVpcmVtZW50IHRoYXQgaXQgYmUganVtcGVkIHRvIGRpcmVjdGx5IGZyb20gdGhlCitoYXJkd2FyZSB0cmFwIHZlY3Rvci4gIFRoYXQgaXMgd2h5IGl0IGNhbGxzIEBjb2Rle2V4Y2VwdGlvbkhhbmRsZXIoKX0sCit3aGljaCBpcyBwcm92aWRlZCBieSB0aGUgZXh0ZXJuYWwgZW52aXJvbm1lbnQuICBGb3IgaW5zdGFuY2UsIHRoaXMgY291bGQKK3NldHVwIHRoZSBoYXJkd2FyZSB0cmFwcyB0byBhY3R1YWxseSBleGVjdXRlIGNvZGUgd2hpY2ggY2FsbHMgdGhlIHN0dWIKK2ZpcnN0LCBhbmQgdGhlbiB0cmFuc2ZlcnMgdG8gaXRzIG93biB0cmFwIGhhbmRsZXIuCisKK0ZvciB0aGUgbW9zdCBwb2ludCwgdGhlcmUgcHJvYmFibHkgd29uJ3QgYmUgbXVjaCBvZiBhbiBpc3N1ZSB3aXRoCitgc2hhcmluZycgdHJhcHMsIGFzIHRoZSB0cmFwcyB3ZSB1c2UgYXJlIHVzdWFsbHkgbm90IHVzZWQgYnkgdGhlIGtlcm5lbCwKK2FuZCBvZnRlbiBpbmRpY2F0ZSB1bnJlY292ZXJhYmxlIGVycm9yIGNvbmRpdGlvbnMuICBBbnl3YXksIHRoaXMgaXMgYWxsCitjb250cm9sbGVkIGJ5IGEgdGFibGUsIGFuZCBpcyB0cml2aWFsIHRvIG1vZGlmeS4gIFRoZSBtb3N0IGltcG9ydGFudAordHJhcCBmb3IgdXMgaXMgZm9yIEBjb2Rle3RhIDF9LiAgV2l0aG91dCB0aGF0LCB3ZSBjYW4ndCBzaW5nbGUgc3RlcCBvcgorZG8gYnJlYWtwb2ludHMuICBFdmVyeXRoaW5nIGVsc2UgaXMgdW5uZWNlc3NhcnkgZm9yIHRoZSBwcm9wZXIgb3BlcmF0aW9uCitvZiB0aGUgZGVidWdnZXIvc3R1Yi4KKworRnJvbSByZWFkaW5nIHRoZSBzdHViLCBpdCdzIHByb2JhYmx5IG5vdCBvYnZpb3VzIGhvdyBicmVha3BvaW50cyB3b3JrLgorVGhleSBhcmUgc2ltcGx5IGRvbmUgYnkgZGVwb3NpdC9leGFtaW5lIG9wZXJhdGlvbnMgZnJvbSBHREIuCisKK0BzZWN0aW9uIFJPTSBNb25pdG9yIEludGVyZmFjZQorCitAc2VjdGlvbiBDdXN0b20gUHJvdG9jb2xzCisKK0BzZWN0aW9uIFRyYW5zcG9ydCBMYXllcgorCitAc2VjdGlvbiBCdWlsdGluIFNpbXVsYXRvcgorCisKK0Bub2RlIE5hdGl2ZSBEZWJ1Z2dpbmcKKworQGNoYXB0ZXIgTmF0aXZlIERlYnVnZ2luZworCitTZXZlcmFsIGZpbGVzIGNvbnRyb2wgR0RCJ3MgY29uZmlndXJhdGlvbiBmb3IgbmF0aXZlIHN1cHBvcnQ6CisKK0B0YWJsZSBAZmlsZQorCitAaXRlbSBnZGIvY29uZmlnL0B2YXJ7YXJjaH0vQHZhcnt4eXp9Lm1oCitTcGVjaWZpZXMgTWFrZWZpbGUgZnJhZ21lbnRzIG5lZWRlZCB3aGVuIGhvc3RpbmcgQGVtcGh7b3IgbmF0aXZlfSBvbgorbWFjaGluZSBAdmFye3h5en0uICBJbiBwYXJ0aWN1bGFyLCB0aGlzIGxpc3RzIHRoZSByZXF1aXJlZAorbmF0aXZlLWRlcGVuZGVudCBvYmplY3QgZmlsZXMsIGJ5IGRlZmluaW5nIEBzYW1we05BVERFUEZJTEVTPUBkb3Rze319LgorQWxzbyBzcGVjaWZpZXMgdGhlIGhlYWRlciBmaWxlIHdoaWNoIGRlc2NyaWJlcyBuYXRpdmUgc3VwcG9ydCBvbgorQHZhcnt4eXp9LCBieSBkZWZpbmluZyBAc2FtcHtOQVRfRklMRT0gbm0tQHZhcnt4eXp9Lmh9LiAgWW91IGNhbiBhbHNvCitkZWZpbmUgQHNhbXB7TkFUX0NGTEFHU30sIEBzYW1we05BVF9BRERfRklMRVN9LCBAc2FtcHtOQVRfQ0xJQlN9LAorQHNhbXB7TkFUX0NERVBTfSwgZXRjLjsgc2VlIEBmaWxle01ha2VmaWxlLmlufS4KKworQGl0ZW0gZ2RiL2NvbmZpZy9AdmFye2FyY2h9L25tLUB2YXJ7eHl6fS5oCisoQGZpbGV7bm0uaH0gaXMgYSBsaW5rIHRvIHRoaXMgZmlsZSwgY3JlYXRlZCBieSBjb25maWd1cmUpLiAgQ29udGFpbnMgQworbWFjcm8gZGVmaW5pdGlvbnMgZGVzY3JpYmluZyB0aGUgbmF0aXZlIHN5c3RlbSBlbnZpcm9ubWVudCwgc3VjaCBhcworY2hpbGQgcHJvY2VzcyBjb250cm9sIGFuZCBjb3JlIGZpbGUgc3VwcG9ydC4KKworQGl0ZW0gZ2RiL0B2YXJ7eHl6fS1uYXQuYworQ29udGFpbnMgYW55IG1pc2NlbGxhbmVvdXMgQyBjb2RlIHJlcXVpcmVkIGZvciB0aGlzIG5hdGl2ZSBzdXBwb3J0IG9mCit0aGlzIG1hY2hpbmUuICBPbiBzb21lIG1hY2hpbmVzIGl0IGRvZXNuJ3QgZXhpc3QgYXQgYWxsLgorCitAZW5kIHRhYmxlCisKK1RoZXJlIGFyZSBzb21lIGBgZ2VuZXJpYycnIHZlcnNpb25zIG9mIHJvdXRpbmVzIHRoYXQgY2FuIGJlIHVzZWQgYnkKK3ZhcmlvdXMgc3lzdGVtcy4gIFRoZXNlIGNhbiBiZSBjdXN0b21pemVkIGluIHZhcmlvdXMgd2F5cyBieSBtYWNyb3MKK2RlZmluZWQgaW4geW91ciBAZmlsZXtubS1AdmFye3h5en0uaH0gZmlsZS4gIElmIHRoZXNlIHJvdXRpbmVzIHdvcmsgZm9yCit0aGUgQHZhcnt4eXp9IGhvc3QsIHlvdSBjYW4ganVzdCBpbmNsdWRlIHRoZSBnZW5lcmljIGZpbGUncyBuYW1lICh3aXRoCitAc2FtcHsub30sIG5vdCBAc2FtcHsuY30pIGluIEBjb2Rle05BVERFUEZJTEVTfS4KKworT3RoZXJ3aXNlLCBpZiB5b3VyIG1hY2hpbmUgbmVlZHMgY3VzdG9tIHN1cHBvcnQgcm91dGluZXMsIHlvdSB3aWxsIG5lZWQKK3RvIHdyaXRlIHJvdXRpbmVzIHRoYXQgcGVyZm9ybSB0aGUgc2FtZSBmdW5jdGlvbnMgYXMgdGhlIGdlbmVyaWMgZmlsZS4KK1B1dCB0aGVtIGludG8gQGNvZGV7QHZhcnt4eXp9LW5hdC5jfSwgYW5kIHB1dCBAY29kZXtAdmFye3h5en0tbmF0Lm99CitpbnRvIEBjb2Rle05BVERFUEZJTEVTfS4KKworQHRhYmxlIEBmaWxlCisKK0BpdGVtIGluZnRhcmcuYworVGhpcyBjb250YWlucyB0aGUgQGVtcGh7dGFyZ2V0X29wcyB2ZWN0b3J9IHRoYXQgc3VwcG9ydHMgVW5peCBjaGlsZAorcHJvY2Vzc2VzIG9uIHN5c3RlbXMgd2hpY2ggdXNlIHB0cmFjZSBhbmQgd2FpdCB0byBjb250cm9sIHRoZSBjaGlsZC4KKworQGl0ZW0gcHJvY2ZzLmMKK1RoaXMgY29udGFpbnMgdGhlIEBlbXBoe3RhcmdldF9vcHMgdmVjdG9yfSB0aGF0IHN1cHBvcnRzIFVuaXggY2hpbGQKK3Byb2Nlc3NlcyBvbiBzeXN0ZW1zIHdoaWNoIHVzZSAvcHJvYyB0byBjb250cm9sIHRoZSBjaGlsZC4KKworQGl0ZW0gZm9yay1jaGlsZC5jCitUaGlzIGRvZXMgdGhlIGxvdy1sZXZlbCBncnVuZ2UgdGhhdCB1c2VzIFVuaXggc3lzdGVtIGNhbGxzIHRvIGRvIGEgImZvcmsKK2FuZCBleGVjIiB0byBzdGFydCB1cCBhIGNoaWxkIHByb2Nlc3MuCisKK0BpdGVtIGluZnB0cmFjZS5jCitUaGlzIGlzIHRoZSBsb3cgbGV2ZWwgaW50ZXJmYWNlIHRvIGluZmVyaW9yIHByb2Nlc3NlcyBmb3Igc3lzdGVtcyB1c2luZwordGhlIFVuaXggQGNvZGV7cHRyYWNlfSBjYWxsIGluIGEgdmFuaWxsYSB3YXkuCisKK0BlbmQgdGFibGUKKworQHNlY3Rpb24gTmF0aXZlIGNvcmUgZmlsZSBTdXBwb3J0CisKK0B0YWJsZSBAZmlsZQorCitAaXRlbSBjb3JlLWFvdXQuYzo6ZmV0Y2hfY29yZV9yZWdpc3RlcnMoKQorU3VwcG9ydCBmb3IgcmVhZGluZyByZWdpc3RlcnMgb3V0IG9mIGEgY29yZSBmaWxlLiAgVGhpcyByb3V0aW5lIGNhbGxzCitAY29kZXtyZWdpc3Rlcl9hZGRyKCl9LCBzZWUgYmVsb3cuICBOb3cgdGhhdCBCRkQgaXMgdXNlZCB0byByZWFkIGNvcmUKK2ZpbGVzLCB2aXJ0dWFsbHkgYWxsIG1hY2hpbmVzIHNob3VsZCB1c2UgQGNvZGV7Y29yZS1hb3V0LmN9LCBhbmQgc2hvdWxkCitqdXN0IHByb3ZpZGUgQGNvZGV7ZmV0Y2hfY29yZV9yZWdpc3RlcnN9IGluIEBjb2Rle0B2YXJ7eHl6fS1uYXQuY30gKG9yCitAY29kZXtSRUdJU1RFUl9VX0FERFJ9IGluIEBjb2Rle25tLUB2YXJ7eHl6fS5ofSkuCisKK0BpdGVtIGNvcmUtYW91dC5jOjpyZWdpc3Rlcl9hZGRyKCkKK0lmIHlvdXIgQGNvZGV7bm0tQHZhcnt4eXp9Lmh9IGZpbGUgZGVmaW5lcyB0aGUgbWFjcm8KK0Bjb2Rle1JFR0lTVEVSX1VfQUREUihhZGRyLCBibG9ja2VuZCwgcmVnbm8pfSwgaXQgc2hvdWxkIGJlIGRlZmluZWQgdG8KK3NldCBAY29kZXthZGRyfSB0byB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgQHNhbXB7dXNlcn0gc3RydWN0IG9mIEdEQgorcmVnaXN0ZXIgbnVtYmVyIEBjb2Rle3JlZ25vfS4gIEBjb2Rle2Jsb2NrZW5kfSBpcyB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUKK2BgdXBhZ2UnJyBvZiBAY29kZXt1LnVfYXIwfS4gIElmIEBjb2Rle1JFR0lTVEVSX1VfQUREUn0gaXMgZGVmaW5lZCwKK0BmaWxle2NvcmUtYW91dC5jfSB3aWxsIGRlZmluZSB0aGUgQGNvZGV7cmVnaXN0ZXJfYWRkcigpfSBmdW5jdGlvbiBhbmQKK3VzZSB0aGUgbWFjcm8gaW4gaXQuICBJZiB5b3UgZG8gbm90IGRlZmluZSBAY29kZXtSRUdJU1RFUl9VX0FERFJ9LCBidXQKK3lvdSBhcmUgdXNpbmcgdGhlIHN0YW5kYXJkIEBjb2Rle2ZldGNoX2NvcmVfcmVnaXN0ZXJzKCl9LCB5b3Ugd2lsbCBuZWVkCit0byBkZWZpbmUgeW91ciBvd24gdmVyc2lvbiBvZiBAY29kZXtyZWdpc3Rlcl9hZGRyKCl9LCBwdXQgaXQgaW50byB5b3VyCitAY29kZXtAdmFye3h5en0tbmF0LmN9IGZpbGUsIGFuZCBiZSBzdXJlIEBjb2Rle0B2YXJ7eHl6fS1uYXQub30gaXMgaW4KK3RoZSBAY29kZXtOQVRERVBGSUxFU30gbGlzdC4gIElmIHlvdSBoYXZlIHlvdXIgb3duCitAY29kZXtmZXRjaF9jb3JlX3JlZ2lzdGVycygpfSwgeW91IG1heSBub3QgbmVlZCBhIHNlcGFyYXRlCitAY29kZXtyZWdpc3Rlcl9hZGRyKCl9LiAgTWFueSBjdXN0b20gQGNvZGV7ZmV0Y2hfY29yZV9yZWdpc3RlcnMoKX0KK2ltcGxlbWVudGF0aW9ucyBzaW1wbHkgbG9jYXRlIHRoZSByZWdpc3RlcnMgdGhlbXNlbHZlcy5AcmVmaWxsCisKK0BlbmQgdGFibGUKKworV2hlbiBtYWtpbmcgR0RCIHJ1biBuYXRpdmUgb24gYSBuZXcgb3BlcmF0aW5nIHN5c3RlbSwgdG8gbWFrZSBpdAorcG9zc2libGUgdG8gZGVidWcgY29yZSBmaWxlcywgeW91IHdpbGwgbmVlZCB0byBlaXRoZXIgd3JpdGUgc3BlY2lmaWMKK2NvZGUgZm9yIHBhcnNpbmcgeW91ciBPUydzIGNvcmUgZmlsZXMsIG9yIGN1c3RvbWl6ZQorQGZpbGV7YmZkL3RyYWQtY29yZS5jfS4gIEZpcnN0LCB1c2Ugd2hhdGV2ZXIgQGNvZGV7I2luY2x1ZGV9IGZpbGVzIHlvdXIKK21hY2hpbmUgdXNlcyB0byBkZWZpbmUgdGhlIHN0cnVjdCBvZiByZWdpc3RlcnMgdGhhdCBpcyBhY2Nlc3NpYmxlCisocG9zc2libHkgaW4gdGhlIHUtYXJlYSkgaW4gYSBjb3JlIGZpbGUgKHJhdGhlciB0aGFuCitAZmlsZXttYWNoaW5lL3JlZy5ofSksIGFuZCBhbiBpbmNsdWRlIGZpbGUgdGhhdCBkZWZpbmVzIHdoYXRldmVyIGhlYWRlcgorZXhpc3RzIG9uIGEgY29yZSBmaWxlIChlLmcuIHRoZSB1LWFyZWEgb3IgYSBAc2FtcHtzdHJ1Y3QgY29yZX0pLiAgVGhlbgorbW9kaWZ5IEBjb2Rle3RyYWRfdW5peF9jb3JlX2ZpbGVfcCgpfSB0byB1c2UgdGhlc2UgdmFsdWVzIHRvIHNldCB1cCB0aGUKK3NlY3Rpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBkYXRhIHNlZ21lbnQsIHN0YWNrIHNlZ21lbnQsIGFueSBvdGhlcgorc2VnbWVudHMgaW4gdGhlIGNvcmUgZmlsZSAocGVyaGFwcyBzaGFyZWQgbGlicmFyeSBjb250ZW50cyBvciBjb250cm9sCitpbmZvcm1hdGlvbiksIGBgcmVnaXN0ZXJzJycgc2VnbWVudCwgYW5kIGlmIHRoZXJlIGFyZSB0d28gZGlzY29udGlndW91cworc2V0cyBvZiByZWdpc3RlcnMgKGUuZy4gIGludGVnZXIgYW5kIGZsb2F0KSwgdGhlIGBgcmVnMicnIHNlZ21lbnQuICBUaGlzCitzZWN0aW9uIGluZm9ybWF0aW9uIGJhc2ljYWxseSBkZWxpbWl0cyBhcmVhcyBpbiB0aGUgY29yZSBmaWxlIGluIGEKK3N0YW5kYXJkIHdheSwgd2hpY2ggdGhlIHNlY3Rpb24tcmVhZGluZyByb3V0aW5lcyBpbiBCRkQga25vdyBob3cgdG8gc2VlaworYXJvdW5kIGluLgorCitUaGVuIGJhY2sgaW4gR0RCLCB5b3UgbmVlZCBhIG1hdGNoaW5nIHJvdXRpbmUgY2FsbGVkCitAY29kZXtmZXRjaF9jb3JlX3JlZ2lzdGVycygpfS4gIElmIHlvdSBjYW4gdXNlIHRoZSBnZW5lcmljIG9uZSwgaXQncyBpbgorQGZpbGV7Y29yZS1hb3V0LmN9OyBpZiBub3QsIGl0J3MgaW4geW91ciBAZmlsZXtAdmFye3h5en0tbmF0LmN9IGZpbGUuCitJdCB3aWxsIGJlIHBhc3NlZCBhIGNoYXIgcG9pbnRlciB0byB0aGUgZW50aXJlIGBgcmVnaXN0ZXJzJycgc2VnbWVudCwKK2l0cyBsZW5ndGgsIGFuZCBhIHplcm87IG9yIGEgY2hhciBwb2ludGVyIHRvIHRoZSBlbnRpcmUgYGByZWdzMicnCitzZWdtZW50LCBpdHMgbGVuZ3RoLCBhbmQgYSAyLiAgVGhlIHJvdXRpbmUgc2hvdWxkIHN1Y2sgb3V0IHRoZSBzdXBwbGllZAorcmVnaXN0ZXIgdmFsdWVzIGFuZCBpbnN0YWxsIHRoZW0gaW50byBHREIncyBgYHJlZ2lzdGVycycnIGFycmF5LgorCitJZiB5b3VyIHN5c3RlbSB1c2VzIEBmaWxley9wcm9jfSB0byBjb250cm9sIHByb2Nlc3NlcywgYW5kIHVzZXMgRUxGCitmb3JtYXQgY29yZSBmaWxlcywgdGhlbiB5b3UgbWF5IGJlIGFibGUgdG8gdXNlIHRoZSBzYW1lIHJvdXRpbmVzIGZvcgorcmVhZGluZyB0aGUgcmVnaXN0ZXJzIG91dCBvZiBwcm9jZXNzZXMgYW5kIG91dCBvZiBjb3JlIGZpbGVzLgorCitAc2VjdGlvbiBwdHJhY2UKKworQHNlY3Rpb24gL3Byb2MKKworQHNlY3Rpb24gd2luMzIKKworQHNlY3Rpb24gc2hhcmVkIGxpYnJhcmllcworCitAc2VjdGlvbiBOYXRpdmUgQ29uZGl0aW9uYWxzCisKK1doZW4gR0RCIGlzIGNvbmZpZ3VyZWQgYW5kIGNvbXBpbGVkLCB2YXJpb3VzIG1hY3JvcyBhcmUgZGVmaW5lZCBvciBsZWZ0Cit1bmRlZmluZWQsIHRvIGNvbnRyb2wgY29tcGlsYXRpb24gd2hlbiB0aGUgaG9zdCBhbmQgdGFyZ2V0IHN5c3RlbXMgYXJlCit0aGUgc2FtZS4gIFRoZXNlIG1hY3JvcyBzaG91bGQgYmUgZGVmaW5lZCAob3IgbGVmdCB1bmRlZmluZWQpIGluCitAZmlsZXtubS1AdmFye3N5c3RlbX0uaH0uCisKK0B0YWJsZSBAY29kZQorCitAaXRlbSBBVFRBQ0hfREVUQUNICitJZiBkZWZpbmVkLCB0aGVuIEdEQiB3aWxsIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIEBjb2Rle2F0dGFjaH0gYW5kCitAY29kZXtkZXRhY2h9IGNvbW1hbmRzLgorCitAaXRlbSBDSElMRF9QUkVQQVJFX1RPX1NUT1JFCitJZiB0aGUgbWFjaGluZSBzdG9yZXMgYWxsIHJlZ2lzdGVycyBhdCBvbmNlIGluIHRoZSBjaGlsZCBwcm9jZXNzLCB0aGVuCitkZWZpbmUgdGhpcyB0byBlbnN1cmUgdGhhdCBhbGwgdmFsdWVzIGFyZSBjb3JyZWN0LiAgVGhpcyB1c3VhbGx5IGVudGFpbHMKK2EgcmVhZCBmcm9tIHRoZSBjaGlsZC4KKworW05vdGUgdGhhdCB0aGlzIGlzIGluY29ycmVjdGx5IGRlZmluZWQgaW4gQGZpbGV7eG0tQHZhcntzeXN0ZW19Lmh9IGZpbGVzCitjdXJyZW50bHkuXQorCitAaXRlbSBGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMKK0RlZmluZSB0aGlzIGlmIHRoZSBuYXRpdmUtZGVwZW5kZW50IGNvZGUgd2lsbCBwcm92aWRlIGl0cyBvd24gcm91dGluZXMKK0Bjb2Rle2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVyc30gYW5kIEBjb2Rle3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVyc30gaW4KK0BmaWxle0B2YXJ7SE9TVH0tbmF0LmN9LiAgSWYgdGhpcyBzeW1ib2wgaXMgQGVtcGh7bm90fSBkZWZpbmVkLCBhbmQKK0BmaWxle2luZnB0cmFjZS5jfSBpcyBpbmNsdWRlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24sIHRoZSBkZWZhdWx0Cityb3V0aW5lcyBpbiBAZmlsZXtpbmZwdHJhY2UuY30gYXJlIHVzZWQgZm9yIHRoZXNlIGZ1bmN0aW9ucy4KKworQGl0ZW0gRklMRVNfSU5GT19IT09LCisoT25seSBkZWZpbmVkIGZvciBDb252ZXguKQorCitAaXRlbSBGUDBfUkVHTlVNCitUaGlzIG1hY3JvIGlzIG5vcm1hbGx5IGRlZmluZWQgdG8gYmUgdGhlIG51bWJlciBvZiB0aGUgZmlyc3QgZmxvYXRpbmcKK3BvaW50IHJlZ2lzdGVyLCBpZiB0aGUgbWFjaGluZSBoYXMgc3VjaCByZWdpc3RlcnMuICBBcyBzdWNoLCBpdCB3b3VsZAorYXBwZWFyIG9ubHkgaW4gdGFyZ2V0LXNwZWNpZmljIGNvZGUuICBIb3dldmVyLCAvcHJvYyBzdXBwb3J0IHVzZXMgdGhpcwordG8gZGVjaWRlIHdoZXRoZXIgZmxvYXRzIGFyZSBpbiB1c2Ugb24gdGhpcyB0YXJnZXQuCisKK0BpdGVtIEdFVF9MT05HSk1QX1RBUkdFVAorRm9yIG1vc3QgbWFjaGluZXMsIHRoaXMgaXMgYSB0YXJnZXQtZGVwZW5kZW50IHBhcmFtZXRlci4gIE9uIHRoZQorREVDc3RhdGlvbiBhbmQgdGhlIElyaXMsIHRoaXMgaXMgYSBuYXRpdmUtZGVwZW5kZW50IHBhcmFtZXRlciwgc2luY2UKKzxzZXRqbXAuaD4gaXMgbmVlZGVkIHRvIGRlZmluZSBpdC4KKworVGhpcyBtYWNybyBkZXRlcm1pbmVzIHRoZSB0YXJnZXQgUEMgYWRkcmVzcyB0aGF0IGxvbmdqbXAoKSB3aWxsIGp1bXAgdG8sCithc3N1bWluZyB0aGF0IHdlIGhhdmUganVzdCBzdG9wcGVkIGF0IGEgbG9uZ2ptcCBicmVha3BvaW50LiAgSXQgdGFrZXMgYQorQ09SRV9BRERSICogYXMgYXJndW1lbnQsIGFuZCBzdG9yZXMgdGhlIHRhcmdldCBQQyB2YWx1ZSB0aHJvdWdoIHRoaXMKK3BvaW50ZXIuICBJdCBleGFtaW5lcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbWFjaGluZSBhcyBuZWVkZWQuCisKK0BpdGVtIEtFUk5FTF9VX0FERFIKK0RlZmluZSB0aGlzIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBAY29kZXt1fSBzdHJ1Y3R1cmUgKHRoZSBgYHVzZXIKK3N0cnVjdCcnLCBhbHNvIGtub3duIGFzIHRoZSBgYHUtcGFnZScnKSBpbiBrZXJuZWwgdmlydHVhbCBtZW1vcnkuICBHREIKK25lZWRzIHRvIGtub3cgdGhpcyBzbyB0aGF0IGl0IGNhbiBzdWJ0cmFjdCB0aGlzIGFkZHJlc3MgZnJvbSBhYnNvbHV0ZQorYWRkcmVzc2VzIGluIHRoZSB1cGFnZSwgdGhhdCBhcmUgb2J0YWluZWQgdmlhIHB0cmFjZSBvciBmcm9tIGNvcmUgZmlsZXMuCitPbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgbmVlZCB0aGlzIHZhbHVlLCBzZXQgaXQgdG8gemVyby4KKworQGl0ZW0gS0VSTkVMX1VfQUREUl9CU0QKK0RlZmluZSB0aGlzIHRvIGNhdXNlIEdEQiB0byBkZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgQGNvZGV7dX0gYXQKK3J1bnRpbWUsIGJ5IHVzaW5nIEJlcmtlbGV5LXN0eWxlIEBjb2Rle25saXN0fSBvbiB0aGUga2VybmVsJ3MgaW1hZ2UgaW4KK3RoZSByb290IGRpcmVjdG9yeS4KKworQGl0ZW0gS0VSTkVMX1VfQUREUl9IUFVYCitEZWZpbmUgdGhpcyB0byBjYXVzZSBHREIgdG8gZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIG9mIEBjb2Rle3V9IGF0CitydW50aW1lLCBieSB1c2luZyBIUC1zdHlsZSBAY29kZXtubGlzdH0gb24gdGhlIGtlcm5lbCdzIGltYWdlIGluIHRoZQorcm9vdCBkaXJlY3RvcnkuCisKK0BpdGVtIE9ORV9QUk9DRVNTX1dSSVRFVEVYVAorRGVmaW5lIHRoaXMgdG8gYmUgYWJsZSB0bywgd2hlbiBhIGJyZWFrcG9pbnQgaW5zZXJ0aW9uIGZhaWxzLCB3YXJuIHRoZQordXNlciB0aGF0IGFub3RoZXIgcHJvY2VzcyBtYXkgYmUgcnVubmluZyB3aXRoIHRoZSBzYW1lIGV4ZWN1dGFibGUuCisKK0BpdGVtIFBST0NfTkFNRV9GTVQKK0RlZmluZXMgdGhlIGZvcm1hdCBmb3IgdGhlIG5hbWUgb2YgYSBAZmlsZXsvcHJvY30gZGV2aWNlLiAgU2hvdWxkIGJlCitkZWZpbmVkIGluIEBmaWxle25tLmh9IEBlbXBoe29ubHl9IGluIG9yZGVyIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0CitkZWZpbml0aW9uIGluIEBmaWxle3Byb2Nmcy5jfS4KKworQGl0ZW0gUFRSQUNFX0ZQX0JVRworbWFjaDM4Ni14ZGVwLmMKKworQGl0ZW0gUFRSQUNFX0FSRzNfVFlQRQorVGhlIHR5cGUgb2YgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIHRoZSBAY29kZXtwdHJhY2V9IHN5c3RlbSBjYWxsLCBpZiBpdAorZXhpc3RzIGFuZCBpcyBkaWZmZXJlbnQgZnJvbSBAY29kZXtpbnR9LgorCitAaXRlbSBSRUdJU1RFUl9VX0FERFIKK0RlZmluZXMgdGhlIG9mZnNldCBvZiB0aGUgcmVnaXN0ZXJzIGluIHRoZSBgYHUgYXJlYScnLgorCitAaXRlbSBTSEVMTF9DT01NQU5EX0NPTkNBVAorSWYgZGVmaW5lZCwgaXMgYSBzdHJpbmcgdG8gcHJlZml4IG9uIHRoZSBzaGVsbCBjb21tYW5kIHVzZWQgdG8gc3RhcnQgdGhlCitpbmZlcmlvci4KKworQGl0ZW0gU0hFTExfRklMRQorSWYgZGVmaW5lZCwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgc2hlbGwgdG8gdXNlIHRvIHJ1biB0aGUgaW5mZXJpb3IuCitEZWZhdWx0cyB0byBAY29kZXsiL2Jpbi9zaCJ9LgorCitAaXRlbSBTT0xJQl9BREQgKGZpbGVuYW1lLCBmcm9tX3R0eSwgdGFyZykKK0RlZmluZSB0aGlzIHRvIGV4cGFuZCBpbnRvIGFuIGV4cHJlc3Npb24gdGhhdCB3aWxsIGNhdXNlIHRoZSBzeW1ib2xzIGluCitAdmFye2ZpbGVuYW1lfSB0byBiZSBhZGRlZCB0byBHREIncyBzeW1ib2wgdGFibGUuCisKK0BpdGVtIFNPTElCX0NSRUFURV9JTkZFUklPUl9IT09LCitEZWZpbmUgdGhpcyB0byBleHBhbmQgaW50byBhbnkgc2hhcmVkLWxpYnJhcnktcmVsb2NhdGlvbiBjb2RlIHRoYXQgeW91Cit3YW50IHRvIGJlIHJ1biBqdXN0IGFmdGVyIHRoZSBjaGlsZCBwcm9jZXNzIGhhcyBiZWVuIGZvcmtlZC4KKworQGl0ZW0gU1RBUlRfSU5GRVJJT1JfVFJBUFNfRVhQRUNURUQKK1doZW4gc3RhcnRpbmcgYW4gaW5mZXJpb3IsIEdEQiBub3JtYWxseSBleHBlY3RzIHRvIHRyYXAgdHdpY2U7IG9uY2Ugd2hlbgordGhlIHNoZWxsIGV4ZWNzLCBhbmQgb25jZSB3aGVuIHRoZSBwcm9ncmFtIGl0c2VsZiBleGVjcy4gIElmIHRoZSBhY3R1YWwKK251bWJlciBvZiB0cmFwcyBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiAyLCB0aGVuIGRlZmluZSB0aGlzIG1hY3JvIHRvCitleHBhbmQgaW50byB0aGUgbnVtYmVyIGV4cGVjdGVkLgorCitAaXRlbSBTVlI0X1NIQVJFRF9MSUJTCitEZWZpbmUgdGhpcyB0byBpbmRpY2F0ZSB0aGF0IFNWUjQtc3R5bGUgc2hhcmVkIGxpYnJhcmllcyBhcmUgaW4gdXNlLgorCitAaXRlbSBVU0VfUFJPQ19GUworVGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgc21hbGwgcm91dGluZXMgaW4gQGZpbGV7Ki10ZGVwLmN9LCB3aGljaAordHJhbnNsYXRlIHJlZ2lzdGVyIHZhbHVlcyBiZXR3ZWVuIEdEQidzIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGFuZCB0aGUKKy9wcm9jIHJlcHJlc2VudGF0aW9uLCBhcmUgY29tcGlsZWQuCisKK0BpdGVtIFVfUkVHU19PRkZTRVQKK1RoaXMgaXMgdGhlIG9mZnNldCBvZiB0aGUgcmVnaXN0ZXJzIGluIHRoZSB1cGFnZS4gIEl0IG5lZWQgb25seSBiZQorZGVmaW5lZCBpZiB0aGUgZ2VuZXJpYyBwdHJhY2UgcmVnaXN0ZXIgYWNjZXNzIHJvdXRpbmVzIGluCitAZmlsZXtpbmZwdHJhY2UuY30gYXJlIGJlaW5nIHVzZWQgKHRoYXQgaXMsIEBmaWxle2luZnB0cmFjZS5jfSBpcworY29uZmlndXJlZCBpbiwgYW5kIEBjb2Rle0ZFVENIX0lORkVSSU9SX1JFR0lTVEVSU30gaXMgbm90IGRlZmluZWQpLiAgSWYKK3RoZSBkZWZhdWx0IHZhbHVlIGZyb20gQGZpbGV7aW5mcHRyYWNlLmN9IGlzIGdvb2QgZW5vdWdoLCBsZWF2ZSBpdAordW5kZWZpbmVkLgorCitUaGUgZGVmYXVsdCB2YWx1ZSBtZWFucyB0aGF0IHUudV9hcjAgQGVtcGh7cG9pbnRzIHRvfSB0aGUgbG9jYXRpb24gb2YKK3RoZSByZWdpc3RlcnMuICBJJ20gZ3Vlc3NpbmcgdGhhdCBAY29kZXsjZGVmaW5lIFVfUkVHU19PRkZTRVQgMH0gbWVhbnMKK3RoYXQgdS51X2FyMCBAZW1waHtpc30gdGhlIGxvY2F0aW9uIG9mIHRoZSByZWdpc3RlcnMuCisKK0BpdGVtIENMRUFSX1NPTElCCitvYmpmaWxlcy5jCisKK0BpdGVtIERFQlVHX1BUUkFDRQorRGVmaW5lIHRoaXMgdG8gZGVidWcgcHRyYWNlIGNhbGxzLgorCitAZW5kIHRhYmxlCisKKworQG5vZGUgU3VwcG9ydCBMaWJyYXJpZXMKKworQGNoYXB0ZXIgU3VwcG9ydCBMaWJyYXJpZXMKKworQHNlY3Rpb24gQkZECisKK0JGRCBwcm92aWRlcyBzdXBwb3J0IGZvciBHREIgaW4gc2V2ZXJhbCB3YXlzOgorCitAdGFibGUgQGVtcGgKKworQGl0ZW0gaWRlbnRpZnlpbmcgZXhlY3V0YWJsZSBhbmQgY29yZSBmaWxlcworQkZEIHdpbGwgaWRlbnRpZnkgYSB2YXJpZXR5IG9mIGZpbGUgdHlwZXMsIGluY2x1ZGluZyBhLm91dCwgY29mZiwgYW5kCitzZXZlcmFsIHZhcmlhbnRzIHRoZXJlb2YsIGFzIHdlbGwgYXMgc2V2ZXJhbCBraW5kcyBvZiBjb3JlIGZpbGVzLgorCitAaXRlbSBhY2Nlc3MgdG8gc2VjdGlvbnMgb2YgZmlsZXMKK0JGRCBwYXJzZXMgdGhlIGZpbGUgaGVhZGVycyB0byBkZXRlcm1pbmUgdGhlIG5hbWVzLCB2aXJ0dWFsIGFkZHJlc3NlcywKK3NpemVzLCBhbmQgZmlsZSBsb2NhdGlvbnMgb2YgYWxsIHRoZSB2YXJpb3VzIG5hbWVkIHNlY3Rpb25zIGluIGZpbGVzCisoc3VjaCBhcyB0aGUgdGV4dCBzZWN0aW9uIG9yIHRoZSBkYXRhIHNlY3Rpb24pLiAgR0RCIHNpbXBseSBjYWxscyBCRkQgdG8KK3JlYWQgb3Igd3JpdGUgc2VjdGlvbiBYIGF0IGJ5dGUgb2Zmc2V0IFkgZm9yIGxlbmd0aCBaLgorCitAaXRlbSBzcGVjaWFsaXplZCBjb3JlIGZpbGUgc3VwcG9ydAorQkZEIHByb3ZpZGVzIHJvdXRpbmVzIHRvIGRldGVybWluZSB0aGUgZmFpbGluZyBjb21tYW5kIG5hbWUgc3RvcmVkIGluIGEKK2NvcmUgZmlsZSwgdGhlIHNpZ25hbCB3aXRoIHdoaWNoIHRoZSBwcm9ncmFtIGZhaWxlZCwgYW5kIHdoZXRoZXIgYSBjb3JlCitmaWxlIG1hdGNoZXMgKGkuZS4gY291bGQgYmUgYSBjb3JlIGR1bXAgb2YpIGEgcGFydGljdWxhciBleGVjdXRhYmxlCitmaWxlLgorCitAaXRlbSBsb2NhdGluZyB0aGUgc3ltYm9sIGluZm9ybWF0aW9uCitHREIgdXNlcyBhbiBpbnRlcm5hbCBpbnRlcmZhY2Ugb2YgQkZEIHRvIGRldGVybWluZSB3aGVyZSB0byBmaW5kIHRoZQorc3ltYm9sIGluZm9ybWF0aW9uIGluIGFuIGV4ZWN1dGFibGUgZmlsZSBvciBzeW1ib2wtZmlsZS4gIEdEQiBpdHNlbGYKK2hhbmRsZXMgdGhlIHJlYWRpbmcgb2Ygc3ltYm9scywgc2luY2UgQkZEIGRvZXMgbm90IGBgdW5kZXJzdGFuZCcnIGRlYnVnCitzeW1ib2xzLCBidXQgR0RCIHVzZXMgQkZEJ3MgY2FjaGVkIGluZm9ybWF0aW9uIHRvIGZpbmQgdGhlIHN5bWJvbHMsCitzdHJpbmcgdGFibGUsIGV0Yy4KKworQGVuZCB0YWJsZQorCitAc2VjdGlvbiBvcGNvZGVzCisKK1RoZSBvcGNvZGVzIGxpYnJhcnkgcHJvdmlkZXMgR0RCJ3MgZGlzYXNzZW1ibGVyLiAgKEl0J3MgYSBzZXBhcmF0ZQorbGlicmFyeSBiZWNhdXNlIGl0J3MgYWxzbyB1c2VkIGluIGJpbnV0aWxzLCBmb3IgQGZpbGV7b2JqZHVtcH0pLgorCitAc2VjdGlvbiByZWFkbGluZQorCitAc2VjdGlvbiBtbWFsbG9jCisKK0BzZWN0aW9uIGxpYmliZXJ0eQorCitAc2VjdGlvbiBnbnUtcmVnZXgKKworUmVnZXggY29uZGl0aW9uYWxzLgorCitAdGFibGUgQGNvZGUKKworQGl0ZW0gQ19BTExPQ0EKKworQGl0ZW0gTkZBSUxVUkVTCisKK0BpdGVtIFJFX05SRUdTCisKK0BpdGVtIFNJR05fRVhURU5EX0NIQVIKKworQGl0ZW0gU1dJVENIX0VOVU1fQlVHCisKK0BpdGVtIFNZTlRBWF9UQUJMRQorCitAaXRlbSBTd29yZAorCitAaXRlbSBzcGFyYworCitAZW5kIHRhYmxlCisKK0BzZWN0aW9uIGluY2x1ZGUKKworQG5vZGUgQ29kaW5nCisKK0BjaGFwdGVyIENvZGluZworCitUaGlzIGNoYXB0ZXIgY292ZXJzIHRvcGljcyB0aGF0IGFyZSBsb3dlci1sZXZlbCB0aGFuIHRoZSBtYWpvcgorYWxnb3JpdGhtcyBvZiBHREIuCisKK0BzZWN0aW9uIENsZWFudXBzCisKK0NsZWFudXBzIGFyZSBhIHN0cnVjdHVyZWQgd2F5IHRvIGRlYWwgd2l0aCB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIGRvbmUKK2xhdGVyLiAgV2hlbiB5b3VyIGNvZGUgZG9lcyBzb21ldGhpbmcgKGxpa2UgQGNvZGV7bWFsbG9jfSBzb21lIG1lbW9yeSwKK29yIG9wZW4gYSBmaWxlKSB0aGF0IG5lZWRzIHRvIGJlIHVuZG9uZSBsYXRlciAoZS5nLiBmcmVlIHRoZSBtZW1vcnkgb3IKK2Nsb3NlIHRoZSBmaWxlKSwgaXQgY2FuIG1ha2UgYSBjbGVhbnVwLiAgVGhlIGNsZWFudXAgd2lsbCBiZSBkb25lIGF0Citzb21lIGZ1dHVyZSBwb2ludDogd2hlbiB0aGUgY29tbWFuZCBpcyBmaW5pc2hlZCwgd2hlbiBhbiBlcnJvciBvY2N1cnMsCitvciB3aGVuIHlvdXIgY29kZSBkZWNpZGVzIGl0J3MgdGltZSB0byBkbyBjbGVhbnVwcy4KKworWW91IGNhbiBhbHNvIGRpc2NhcmQgY2xlYW51cHMsIHRoYXQgaXMsIHRocm93IHRoZW0gYXdheSB3aXRob3V0IGRvaW5nCit3aGF0IHRoZXkgc2F5LiAgVGhpcyBpcyBvbmx5IGRvbmUgaWYgeW91IGFzayB0aGF0IGl0IGJlIGRvbmUuCisKK1N5bnRheDoKKworQHRhYmxlIEBjb2RlCisKK0BpdGVtIHN0cnVjdCBjbGVhbnVwICpAdmFye29sZF9jaGFpbn07CitEZWNsYXJlIGEgdmFyaWFibGUgd2hpY2ggd2lsbCBob2xkIGEgY2xlYW51cCBjaGFpbiBoYW5kbGUuCisKK0BpdGVtIEB2YXJ7b2xkX2NoYWlufSA9IG1ha2VfY2xlYW51cCAoQHZhcntmdW5jdGlvbn0sIEB2YXJ7YXJnfSk7CitNYWtlIGEgY2xlYW51cCB3aGljaCB3aWxsIGNhdXNlIEB2YXJ7ZnVuY3Rpb259IHRvIGJlIGNhbGxlZCB3aXRoCitAdmFye2FyZ30gKGEgQGNvZGV7Y2hhciAqfSkgbGF0ZXIuICBUaGUgcmVzdWx0LCBAdmFye29sZF9jaGFpbn0sIGlzIGEKK2hhbmRsZSB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gQGNvZGV7ZG9fY2xlYW51cHN9IG9yCitAY29kZXtkaXNjYXJkX2NsZWFudXBzfSBsYXRlci4gIFVubGVzcyB5b3UgYXJlIGdvaW5nIHRvIGNhbGwKK0Bjb2Rle2RvX2NsZWFudXBzfSBvciBAY29kZXtkaXNjYXJkX2NsZWFudXBzfSB5b3Vyc2VsZiwgeW91IGNhbiBpZ25vcmUKK3RoZSByZXN1bHQgZnJvbSBAY29kZXttYWtlX2NsZWFudXB9LgorCitAaXRlbSBkb19jbGVhbnVwcyAoQHZhcntvbGRfY2hhaW59KTsKK1BlcmZvcm0gYWxsIGNsZWFudXBzIGRvbmUgc2luY2UgQGNvZGV7bWFrZV9jbGVhbnVwfSByZXR1cm5lZAorQHZhcntvbGRfY2hhaW59LiAgRS5nLjoKK0BleGFtcGxlCittYWtlX2NsZWFudXAgKGEsIDApOyAKK29sZCA9IG1ha2VfY2xlYW51cCAoYiwgMCk7IAorZG9fY2xlYW51cHMgKG9sZCk7CitAZW5kIGV4YW1wbGUKK0Bub2luZGVudAord2lsbCBjYWxsIEBjb2Rle2IoKX0gYnV0IHdpbGwgbm90IGNhbGwgQGNvZGV7YSgpfS4gIFRoZSBjbGVhbnVwIHRoYXQKK2NhbGxzIEBjb2Rle2EoKX0gd2lsbCByZW1haW4gaW4gdGhlIGNsZWFudXAgY2hhaW4sIGFuZCB3aWxsIGJlIGRvbmUKK2xhdGVyIHVubGVzcyBvdGhlcndpc2UgZGlzY2FyZGVkLkByZWZpbGwKKworQGl0ZW0gZGlzY2FyZF9jbGVhbnVwcyAoQHZhcntvbGRfY2hhaW59KTsKK1NhbWUgYXMgQGNvZGV7ZG9fY2xlYW51cHN9IGV4Y2VwdCB0aGF0IGl0IGp1c3QgcmVtb3ZlcyB0aGUgY2xlYW51cHMgZnJvbQordGhlIGNoYWluIGFuZCBkb2VzIG5vdCBjYWxsIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb25zLgorCitAZW5kIHRhYmxlCisKK1NvbWUgZnVuY3Rpb25zLCBlLmcuIEBjb2Rle2ZwdXRzX2ZpbHRlcmVkKCl9IG9yIEBjb2Rle2Vycm9yKCl9LCBzcGVjaWZ5Cit0aGF0IHRoZXkgYGBzaG91bGQgbm90IGJlIGNhbGxlZCB3aGVuIGNsZWFudXBzIGFyZSBub3QgaW4gcGxhY2UnJy4gIFRoaXMKK21lYW5zIHRoYXQgYW55IGFjdGlvbnMgeW91IG5lZWQgdG8gcmV2ZXJzZSBpbiB0aGUgY2FzZSBvZiBhbiBlcnJvciBvcgoraW50ZXJydXB0aW9uIG11c3QgYmUgb24gdGhlIGNsZWFudXAgY2hhaW4gYmVmb3JlIHlvdSBjYWxsIHRoZXNlCitmdW5jdGlvbnMsIHNpbmNlIHRoZXkgbWlnaHQgbmV2ZXIgcmV0dXJuIHRvIHlvdXIgY29kZSAodGhleQorQHNhbXB7bG9uZ2ptcH0gaW5zdGVhZCkuCisKK0BzZWN0aW9uIFdyYXBwaW5nIE91dHB1dCBMaW5lcworCitPdXRwdXQgdGhhdCBnb2VzIHRocm91Z2ggQGNvZGV7cHJpbnRmX2ZpbHRlcmVkfSBvciBAY29kZXtmcHV0c19maWx0ZXJlZH0KK29yIEBjb2Rle2ZwdXRzX2RlbWFuZ2xlZH0gbmVlZHMgb25seSB0byBoYXZlIGNhbGxzIHRvIEBjb2Rle3dyYXBfaGVyZX0KK2FkZGVkIGluIHBsYWNlcyB0aGF0IHdvdWxkIGJlIGdvb2QgYnJlYWtpbmcgcG9pbnRzLiAgVGhlIHV0aWxpdHkKK3JvdXRpbmVzIHdpbGwgdGFrZSBjYXJlIG9mIGFjdHVhbGx5IHdyYXBwaW5nIGlmIHRoZSBsaW5lIHdpZHRoIGlzCitleGNlZWRlZC4KKworVGhlIGFyZ3VtZW50IHRvIEBjb2Rle3dyYXBfaGVyZX0gaXMgYW4gaW5kZW50YXRpb24gc3RyaW5nIHdoaWNoIGlzCitwcmludGVkIEBlbXBoe29ubHl9IGlmIHRoZSBsaW5lIGJyZWFrcyB0aGVyZS4gIFRoaXMgYXJndW1lbnQgaXMgc2F2ZWQKK2F3YXkgYW5kIHVzZWQgbGF0ZXIuICBJdCBtdXN0IHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvCitAY29kZXt3cmFwX2hlcmV9IG9yIHVudGlsIGEgbmV3bGluZSBoYXMgYmVlbiBwcmludGVkIHRocm91Z2ggdGhlCitAY29kZXsqX2ZpbHRlcmVkfSBmdW5jdGlvbnMuICBEb24ndCBwYXNzIGluIGEgbG9jYWwgdmFyaWFibGUgYW5kIHRoZW4KK3JldHVybiEKKworSXQgaXMgdXN1YWxseSBiZXN0IHRvIGNhbGwgQGNvZGV7d3JhcF9oZXJlKCl9IGFmdGVyIHByaW50aW5nIGEgY29tbWEgb3IKK3NwYWNlLiAgSWYgeW91IGNhbGwgaXQgYmVmb3JlIHByaW50aW5nIGEgc3BhY2UsIG1ha2Ugc3VyZSB0aGF0IHlvdXIKK2luZGVudGF0aW9uIHByb3Blcmx5IGFjY291bnRzIGZvciB0aGUgbGVhZGluZyBzcGFjZSB0aGF0IHdpbGwgcHJpbnQgaWYKK3RoZSBsaW5lIHdyYXBzIHRoZXJlLgorCitBbnkgZnVuY3Rpb24gb3Igc2V0IG9mIGZ1bmN0aW9ucyB0aGF0IHByb2R1Y2UgZmlsdGVyZWQgb3V0cHV0IG11c3QKK2ZpbmlzaCBieSBwcmludGluZyBhIG5ld2xpbmUsIHRvIGZsdXNoIHRoZSB3cmFwIGJ1ZmZlciwgYmVmb3JlIHN3aXRjaGluZwordG8gdW5maWx0ZXJlZCAoYGBAY29kZXtwcmludGZ9JycpIG91dHB1dC4gIFN5bWJvbCByZWFkaW5nIHJvdXRpbmVzIHRoYXQKK3ByaW50IHdhcm5pbmdzIGFyZSBhIGdvb2QgZXhhbXBsZS4KKworQHNlY3Rpb24gR0RCIENvZGluZyBTdGFuZGFyZHMKKworR0RCIGZvbGxvd3MgdGhlIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLCBhcyBkZXNjcmliZWQgaW4KK0BmaWxle2V0Yy9zdGFuZGFyZHMudGV4aX0uICBUaGlzIGZpbGUgaXMgYWxzbyBhdmFpbGFibGUgZm9yIGFub255bW91cworRlRQIGZyb20gR05VIGFyY2hpdmUgc2l0ZXMuICBHREIgdGFrZXMgYSBzdHJpY3QgaW50ZXJwcmV0YXRpb24gb2YgdGhlCitzdGFuZGFyZDsgaW4gZ2VuZXJhbCwgd2hlbiB0aGUgR05VIHN0YW5kYXJkIHJlY29tbWVuZHMgYSBwcmFjdGljZSBidXQKK2RvZXMgbm90IHJlcXVpcmUgaXQsIEdEQiByZXF1aXJlcyBpdC4KKworR0RCIGZvbGxvd3MgYW4gYWRkaXRpb25hbCBzZXQgb2YgY29kaW5nIHN0YW5kYXJkcyBzcGVjaWZpYyB0byBHREIsCithcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4KKworWW91IGNhbiBjb25maWd1cmUgd2l0aCBAc2FtcHstLWVuYWJsZS1idWlsZC13YXJuaW5nc30gdG8gZ2V0IEdDQyB0bworY2hlY2sgb24gYSBudW1iZXIgb2YgdGhlc2UgcnVsZXMuICBHREIgc291cmNlcyBvdWdodCBub3QgdG8gZW5nZW5kZXIgYW55Citjb21wbGFpbnRzLCB1bmxlc3MgdGhleSBhcmUgY2F1c2VkIGJ5IGJvZ3VzIGhvc3Qgc3lzdGVtcy4gIChUaGUgZXhhY3QKK3NldCBvZiBlbmFibGVkIHdhcm5pbmdzIGlzIGN1cnJlbnRseSBAc2FtcHstV2FsbCAtV3BvaW50ZXItYXJpdGgKKy1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9uc30uCisKK0BzdWJzZWN0aW9uIEZvcm1hdHRpbmcKKworVGhlIHN0YW5kYXJkIEdOVSByZWNvbW1lbmRhdGlvbnMgZm9yIGZvcm1hdHRpbmcgbXVzdCBiZSBmb2xsb3dlZAorc3RyaWN0bHkuCisKK05vdGUgdGhhdCB3aGlsZSBpbiBhIGRlZmluaXRpb24sIHRoZSBmdW5jdGlvbidzIG5hbWUgbXVzdCBiZSBpbiBjb2x1bW4KK3plcm87IGluIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24sIHRoZSBuYW1lIG11c3QgYmUgb24gdGhlIHNhbWUgbGluZSBhcwordGhlIHJldHVybiB0eXBlLgorCitJbiBhZGRpdGlvbiwgdGhlcmUgbXVzdCBiZSBhIHNwYWNlIGJldHdlZW4gYSBmdW5jdGlvbiBvciBtYWNybyBuYW1lIGFuZAordGhlIG9wZW5pbmcgcGFyZW50aGVzaXMgb2YgaXRzIGFyZ3VtZW50IGxpc3QgKGV4Y2VwdCBmb3IgbWFjcm8KK2RlZmluaXRpb25zLCBhcyByZXF1aXJlZCBieSBDKS4gIFRoZXJlIG11c3Qgbm90IGJlIGEgc3BhY2UgYWZ0ZXIgYW4gb3BlbgorcGFyZW4vYnJhY2tldCBvciBiZWZvcmUgYSBjbG9zZSBwYXJlbi9icmFja2V0LgorCitXaGlsZSBhZGRpdGlvbmFsIHdoaXRlc3BhY2UgaXMgZ2VuZXJhbGx5IGhlbHBmdWwgZm9yIHJlYWRpbmcsIGRvIG5vdCB1c2UKK21vcmUgdGhhbiBvbmUgYmxhbmsgbGluZSB0byBzZXBhcmF0ZSBibG9ja3MsIGFuZCBhdm9pZCBhZGRpbmcgd2hpdGVzcGFjZQorYWZ0ZXIgdGhlIGVuZCBvZiBhIHByb2dyYW0gbGluZSAoYXMgb2YgMS85OSwgc29tZSA2MDAgbGluZXMgaGFkIHdoaXRlc3BhY2UKK2FmdGVyIHRoZSBzZW1pY29sb24pLiAgRXhjZXNzIHdoaXRlc3BhY2UgY2F1c2VzIGRpZmZpY3VsdGllcyBmb3IgZGlmZiBhbmQKK3BhdGNoLgorCitAc3Vic2VjdGlvbiBDb21tZW50cworCitUaGUgc3RhbmRhcmQgR05VIHJlcXVpcmVtZW50cyBvbiBjb21tZW50cyBtdXN0IGJlIGZvbGxvd2VkIHN0cmljdGx5LgorCitCbG9jayBjb21tZW50cyBtdXN0IGFwcGVhciBpbiB0aGUgZm9sbG93aW5nIGZvcm0sIHdpdGggbm8gYC8qJy0gb3IKKycqLyctb25seSBsaW5lcywgYW5kIG5vIGxlYWRpbmcgYConOgorCitAZXhhbXBsZSBAY29kZQorLyogV2FpdCBmb3IgY29udHJvbCB0byByZXR1cm4gZnJvbSBpbmZlcmlvciB0byBkZWJ1Z2dlci4gIElmIGluZmVyaW9yCisgICBnZXRzIGEgc2lnbmFsLCB3ZSBtYXkgZGVjaWRlIHRvIHN0YXJ0IGl0IHVwIGFnYWluIGluc3RlYWQgb2YKKyAgIHJldHVybmluZy4gIFRoYXQgaXMgd2h5IHRoZXJlIGlzIGEgbG9vcCBpbiB0aGlzIGZ1bmN0aW9uLiAgV2hlbgorICAgdGhpcyBmdW5jdGlvbiBhY3R1YWxseSByZXR1cm5zIGl0IG1lYW5zIHRoZSBpbmZlcmlvciBzaG91bGQgYmUgbGVmdAorICAgc3RvcHBlZCBhbmQgR0RCIHNob3VsZCByZWFkIG1vcmUgY29tbWFuZHMuICAqLworQGVuZCBleGFtcGxlCisKKyhOb3RlIHRoYXQgdGhpcyBmb3JtYXQgaXMgZW5jb3VyYWdlZCBieSBFbWFjczsgdGFiYmluZyBmb3IgYSBtdWx0aS1saW5lCitjb21tZW50IHdvcmtzIGNvcnJlY3RseSwgYW5kIE0tUSBmaWxscyB0aGUgYmxvY2sgY29uc2lzdGVudGx5LikKKworUHV0IGEgYmxhbmsgbGluZSBiZXR3ZWVuIHRoZSBibG9jayBjb21tZW50cyBwcmVjZWRpbmcgZnVuY3Rpb24gb3IKK3ZhcmlhYmxlIGRlZmluaXRpb25zLCBhbmQgdGhlIGRlZmluaXRpb24gaXRzZWxmLgorCitJbiBnZW5lcmFsLCBwdXQgZnVuY3Rpb24tYm9keSBjb21tZW50cyBvbiBsaW5lcyBieSB0aGVtc2VsdmVzLCByYXRoZXIKK3RoYW4gdHJ5aW5nIHRvIGZpdCB0aGVtIGludG8gdGhlIDIwIGNoYXJhY3RlcnMgbGVmdCBhdCB0aGUgZW5kIG9mIGEKK2xpbmUsIHNpbmNlIGVpdGhlciB0aGUgY29tbWVudCBvciB0aGUgY29kZSB3aWxsIGluZXZpdGFibHkgZ2V0IGxvbmdlcgordGhhbiB3aWxsIGZpdCwgYW5kIHRoZW4gc29tZWJvZHkgd2lsbCBoYXZlIHRvIG1vdmUgaXQgYW55aG93LgorCitAc3Vic2VjdGlvbiBDIFVzYWdlCisKK0NvZGUgbXVzdCBub3QgZGVwZW5kIG9uIHRoZSBzaXplcyBvZiBDIGRhdGEgdHlwZXMsIHRoZSBmb3JtYXQgb2YgdGhlCitob3N0J3MgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgdGhlIGFsaWdubWVudCBvZiBhbnl0aGluZywgb3IgdGhlIG9yZGVyCitvZiBldmFsdWF0aW9uIG9mIGV4cHJlc3Npb25zLgorCitVc2UgZnVuY3Rpb25zIGZyZWVseS4gIFRoZXJlIGFyZSBvbmx5IGEgaGFuZGZ1bCBvZiBjb21wdXRlLWJvdW5kIGFyZWFzCitpbiBHREIgdGhhdCBtaWdodCBiZSBhZmZlY3RlZCBieSB0aGUgb3ZlcmhlYWQgb2YgYSBmdW5jdGlvbiBjYWxsLCBtYWlubHkKK2luIHN5bWJvbCByZWFkaW5nLiAgTW9zdCBvZiBHREIncyBwZXJmb3JtYW5jZSBpcyBsaW1pdGVkIGJ5IHRoZSB0YXJnZXQKK2ludGVyZmFjZSAod2hldGhlciBzZXJpYWwgbGluZSBvciBzeXN0ZW0gY2FsbCkuCisKK0hvd2V2ZXIsIHVzZSBmdW5jdGlvbnMgd2l0aCBtb2RlcmF0aW9uLiAgQSB0aG91c2FuZCBvbmUtbGluZSBmdW5jdGlvbnMKK2FyZSBqdXN0IGFzIGhhcmQgdG8gdW5kZXJzdGFuZCBhcyBhIHNpbmdsZSB0aG91c2FuZC1saW5lIGZ1bmN0aW9uLgorCitAc3Vic2VjdGlvbiBGdW5jdGlvbiBQcm90b3R5cGVzCisKK1Byb3RvdHlwZXMgbXVzdCBiZSB1c2VkIHRvIEBlbXBoe2RlY2xhcmV9IGZ1bmN0aW9ucyBidXQgbmV2ZXIgdG8KK0BlbXBoe2RlZmluZX0gdGhlbS4gIFByb3RvdHlwZXMgZm9yIEdEQiBmdW5jdGlvbnMgbXVzdCBpbmNsdWRlIGJvdGggdGhlCithcmd1bWVudCB0eXBlIGFuZCBuYW1lLCB3aXRoIHRoZSBuYW1lIG1hdGNoaW5nIHRoYXQgdXNlZCBpbiB0aGUgYWN0dWFsCitmdW5jdGlvbiBkZWZpbml0aW9uLgorCitGb3IgdGhlIHNha2Ugb2YgY29tcGF0aWJpbGl0eSB3aXRoIHByZS1BTlNJIGNvbXBpbGVycywgZGVmaW5lIHByb3RvdHlwZXMKK3dpdGggdGhlIEBjb2Rle1BBUkFNU30gbWFjcm86CisKK0BleGFtcGxlIEBjb2RlCitleHRlcm4gaW50IG1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCBQQVJBTVMgKChDT1JFX0FERFIgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNvbnRlbnRzX2NhY2hlKSk7CitAZW5kIGV4YW1wbGUKKworTm90ZSB0aGUgZG91YmxlIHBhcmVudGhlc2VzIGFyb3VuZCB0aGUgcGFyYW1ldGVyIHR5cGVzLiAgVGhpcyBhbGxvd3MgYW4KK2FyYml0cmFyeSBudW1iZXIgb2YgcGFyYW1ldGVycyB0byBiZSBkZXNjcmliZWQsIHdpdGhvdXQgZnJlYWtpbmcgb3V0IHRoZQorQyBwcmVwcm9jZXNzb3IuICBXaGVuIHRoZSBmdW5jdGlvbiBoYXMgbm8gcGFyYW1ldGVycywgaXQgc2hvdWxkIGJlCitkZXNjcmliZWQgbGlrZToKKworQGV4YW1wbGUgQGNvZGUKK2V4dGVybiB2b2lkIG5vcHJvY2VzcyBQQVJBTVMgKCh2b2lkKSk7CitAZW5kIGV4YW1wbGUKKworVGhlIEBjb2Rle1BBUkFNU30gbWFjcm8gZXhwYW5kcyB0byBpdHMgYXJndW1lbnQgaW4gQU5TSSBDLCBvciB0byBhCitzaW1wbGUgQGNvZGV7KCl9IGluIHRyYWRpdGlvbmFsIEMuCisKK0FsbCBleHRlcm5hbCBmdW5jdGlvbnMgc2hvdWxkIGhhdmUgYSBAY29kZXtQQVJBTVN9IGRlY2xhcmF0aW9uIGluIGEKK2hlYWRlciBmaWxlIHRoYXQgY2FsbGVycyBpbmNsdWRlLCBleGNlcHQgZm9yIEBjb2Rle19pbml0aWFsaXplXyp9CitmdW5jdGlvbnMsIHdoaWNoIG11c3QgYmUgZXh0ZXJuYWwgc28gdGhhdCBAZmlsZXtpbml0LmN9IGNvbnN0cnVjdGlvbgord29ya3MsIGJ1dCBzaG91bGRuJ3QgYmUgdmlzaWJsZSB0byByYW5kb20gc291cmNlIGZpbGVzLgorCitBbGwgc3RhdGljIGZ1bmN0aW9ucyBtdXN0IGJlIGRlY2xhcmVkIGluIGEgYmxvY2sgbmVhciB0aGUgdG9wIG9mIHRoZQorc291cmNlIGZpbGUuCisKK0BzdWJzZWN0aW9uIENsZWFuIERlc2lnbgorCitJbiBhZGRpdGlvbiB0byBnZXR0aW5nIHRoZSBzeW50YXggcmlnaHQsIHRoZXJlJ3MgdGhlIGxpdHRsZSBxdWVzdGlvbiBvZgorc2VtYW50aWNzLiAgU29tZSB0aGluZ3MgYXJlIGRvbmUgaW4gY2VydGFpbiB3YXlzIGluIEdEQiBiZWNhdXNlIGxvbmcKK2V4cGVyaWVuY2UgaGFzIHNob3duIHRoYXQgdGhlIG1vcmUgb2J2aW91cyB3YXlzIGNhdXNlZCB2YXJpb3VzIGtpbmRzIG9mCit0cm91YmxlLgorCitZb3UgY2FuJ3QgYXNzdW1lIHRoZSBieXRlIG9yZGVyIG9mIGFueXRoaW5nIHRoYXQgY29tZXMgZnJvbSBhIHRhcmdldAorKGluY2x1ZGluZyBAdmFye3ZhbHVlfXMsIG9iamVjdCBmaWxlcywgYW5kIGluc3RydWN0aW9ucykuICBTdWNoIHRoaW5ncworbXVzdCBiZSBieXRlLXN3YXBwZWQgdXNpbmcgQGNvZGV7U1dBUF9UQVJHRVRfQU5EX0hPU1R9IGluIEdEQiwgb3Igb25lIG9mCit0aGUgc3dhcCByb3V0aW5lcyBkZWZpbmVkIGluIEBmaWxle2JmZC5ofSwgc3VjaCBhcyBAY29kZXtiZmRfZ2V0XzMyfS4KKworWW91IGNhbid0IGFzc3VtZSB0aGF0IHlvdSBrbm93IHdoYXQgaW50ZXJmYWNlIGlzIGJlaW5nIHVzZWQgdG8gdGFsayB0bwordGhlIHRhcmdldCBzeXN0ZW0uICBBbGwgcmVmZXJlbmNlcyB0byB0aGUgdGFyZ2V0IG11c3QgZ28gdGhyb3VnaCB0aGUKK2N1cnJlbnQgQGNvZGV7dGFyZ2V0X29wc30gdmVjdG9yLgorCitZb3UgY2FuJ3QgYXNzdW1lIHRoYXQgdGhlIGhvc3QgYW5kIHRhcmdldCBtYWNoaW5lcyBhcmUgdGhlIHNhbWUgbWFjaGluZQorKGV4Y2VwdCBpbiB0aGUgYGBuYXRpdmUnJyBzdXBwb3J0IG1vZHVsZXMpLiAgSW4gcGFydGljdWxhciwgeW91IGNhbid0Cithc3N1bWUgdGhhdCB0aGUgdGFyZ2V0IG1hY2hpbmUncyBoZWFkZXIgZmlsZXMgd2lsbCBiZSBhdmFpbGFibGUgb24gdGhlCitob3N0IG1hY2hpbmUuICBUYXJnZXQgY29kZSBtdXN0IGJyaW5nIGFsb25nIGl0cyBvd24gaGVhZGVyIGZpbGVzIC0tCit3cml0dGVuIGZyb20gc2NyYXRjaCBvciBleHBsaWNpdGx5IGRvbmF0ZWQgYnkgdGhlaXIgb3duZXIsIHRvIGF2b2lkCitjb3B5cmlnaHQgcHJvYmxlbXMuCisKK0luc2VydGlvbiBvZiBuZXcgQGNvZGV7I2lmZGVmfSdzIHdpbGwgYmUgZnJvd25lZCB1cG9uLiAgSXQncyBtdWNoIGJldHRlcgordG8gd3JpdGUgdGhlIGNvZGUgcG9ydGFibHkgdGhhbiB0byBjb25kaXRpb25hbGl6ZSBpdCBmb3IgdmFyaW91cworc3lzdGVtcy4KKworTmV3IEBjb2RleyNpZmRlZn0ncyB3aGljaCB0ZXN0IGZvciBzcGVjaWZpYyBjb21waWxlcnMgb3IgbWFudWZhY3R1cmVycworb3Igb3BlcmF0aW5nIHN5c3RlbXMgYXJlIHVuYWNjZXB0YWJsZS4gIEFsbCBAY29kZXsjaWZkZWZ9J3Mgc2hvdWxkIHRlc3QKK2ZvciBmZWF0dXJlcy4gIFRoZSBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBjb25maWd1cmF0aW9ucyBjb250YWluIHdoaWNoCitmZWF0dXJlcyBzaG91bGQgYmUgc2VncmVnYXRlZCBpbnRvIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzLiAgRXhwZXJpZW5jZQoraGFzIHByb3ZlbiBmYXIgdG9vIG9mdGVuIHRoYXQgYSBmZWF0dXJlIHVuaXF1ZSB0byBvbmUgcGFydGljdWxhciBzeXN0ZW0KK29mdGVuIGNyZWVwcyBpbnRvIG90aGVyIHN5c3RlbXM7IGFuZCB0aGF0IGEgY29uZGl0aW9uYWwgYmFzZWQgb24gc29tZQorcHJlZGVmaW5lZCBtYWNybyBmb3IgeW91ciBjdXJyZW50IHN5c3RlbSB3aWxsIGJlY29tZSB3b3J0aGxlc3Mgb3ZlcgordGltZSwgYXMgbmV3IHZlcnNpb25zIG9mIHlvdXIgc3lzdGVtIGNvbWUgb3V0IHRoYXQgYmVoYXZlIGRpZmZlcmVudGx5Cit3aXRoIHJlZ2FyZCB0byB0aGlzIGZlYXR1cmUuCisKK0FkZGluZyBjb2RlIHRoYXQgaGFuZGxlcyBzcGVjaWZpYyBhcmNoaXRlY3R1cmVzLCBvcGVyYXRpbmcgc3lzdGVtcywKK3RhcmdldCBpbnRlcmZhY2VzLCBvciBob3N0cywgaXMgbm90IGFjY2VwdGFibGUgaW4gZ2VuZXJpYyBjb2RlLiAgSWYgYQoraG9vayBpcyBuZWVkZWQgYXQgdGhhdCBwb2ludCwgaW52ZW50IGEgZ2VuZXJpYyBob29rIGFuZCBkZWZpbmUgaXQgZm9yCit5b3VyIGNvbmZpZ3VyYXRpb24sIHdpdGggc29tZXRoaW5nIGxpa2U6CisKK0BleGFtcGxlCisjaWZkZWYJV1JBTkdMRV9TSUdOQUxTCisgICBXUkFOR0xFX1NJR05BTFMgKHNpZ25vKTsKKyNlbmRpZgorQGVuZCBleGFtcGxlCisKK0luIHlvdXIgaG9zdCwgdGFyZ2V0LCBvciBuYXRpdmUgY29uZmlndXJhdGlvbiBmaWxlLCBhcyBhcHByb3ByaWF0ZSwKK2RlZmluZSBAY29kZXtXUkFOR0xFX1NJR05BTFN9IHRvIGRvIHRoZSBtYWNoaW5lLWRlcGVuZGVudCB0aGluZy4gIFRha2UgYQorYml0IG9mIGNhcmUgaW4gZGVmaW5pbmcgdGhlIGhvb2ssIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgb3RoZXIgcG9ydHMKK2luIHRoZSBmdXR1cmUsIGlmIHRoZXkgbmVlZCBhIGhvb2sgaW4gdGhlIHNhbWUgcGxhY2UuCisKK0lmIHRoZSBob29rIGlzIG5vdCBkZWZpbmVkLCB0aGUgY29kZSBzaG91bGQgZG8gd2hhdGV2ZXIgIm1vc3QiIG1hY2hpbmVzCit3YW50LiAgVXNpbmcgQGNvZGV7I2lmZGVmfSwgYXMgYWJvdmUsIGlzIHRoZSBwcmVmZXJyZWQgd2F5IHRvIGRvIHRoaXMsCitidXQgc29tZXRpbWVzIHRoYXQgZ2V0cyBjb252b2x1dGVkLCBpbiB3aGljaCBjYXNlIHVzZQorCitAZXhhbXBsZQorI2lmbmRlZiBTUEVDSUFMX0ZPT19IQU5ETElORworI2RlZmluZSBTUEVDSUFMX0ZPT19IQU5ETElORyhwYywgc3ApICgwKQorI2VuZGlmCitAZW5kIGV4YW1wbGUKKword2hlcmUgdGhlIG1hY3JvIGlzIHVzZWQgb3IgaW4gYW4gYXBwcm9wcmlhdGUgaGVhZGVyIGZpbGUuCisKK1doZXRoZXIgdG8gaW5jbHVkZSBhIEBkZm57c21hbGx9IGhvb2ssIGEgaG9vayBhcm91bmQgdGhlIGV4YWN0IHBpZWNlcyBvZgorY29kZSB3aGljaCBhcmUgc3lzdGVtLWRlcGVuZGVudCwgb3Igd2hldGhlciB0byByZXBsYWNlIGEgd2hvbGUgZnVuY3Rpb24KK3dpdGggYSBob29rIGRlcGVuZHMgb24gdGhlIGNhc2UuICBBIGdvb2QgZXhhbXBsZSBvZiB0aGlzIGRpbGVtbWEgY2FuIGJlCitmb3VuZCBpbiBAY29kZXtnZXRfc2F2ZWRfcmVnaXN0ZXJ9LiAgQWxsIG1hY2hpbmVzIHRoYXQgR0RCIDIuOCByYW4gb24KK2p1c3QgbmVlZGVkIHRoZSBAY29kZXtGUkFNRV9GSU5EX1NBVkVEX1JFR1N9IGhvb2sgdG8gZmluZCB0aGUgc2F2ZWQKK3JlZ2lzdGVycy4gIFRoZW4gdGhlIFNQQVJDIGFuZCBQeXJhbWlkIGNhbWUgYWxvbmcsIGFuZAorQGNvZGV7SEFWRV9SRUdJU1RFUl9XSU5ET1dTfSBhbmQgQGNvZGV7UkVHSVNURVJfSU5fV0lORE9XX1B9IHdlcmUKK2ludHJvZHVjZWQuICBUaGVuIHRoZSAyOWsgYW5kIDg4ayByZXF1aXJlZCB0aGUgQGNvZGV7R0VUX1NBVkVEX1JFR0lTVEVSfQoraG9vay4gIFRoZSBmaXJzdCB0aHJlZSBhcmUgZXhhbXBsZXMgb2Ygc21hbGwgaG9va3M7IHRoZSBsYXR0ZXIgcmVwbGFjZXMKK2Egd2hvbGUgZnVuY3Rpb24uICBJbiB0aGlzIHNwZWNpZmljIGNhc2UsIGl0IGlzIHVzZWZ1bCB0byBoYXZlIGJvdGgKK2tpbmRzOyBpdCB3b3VsZCBiZSBhIGJhZCBpZGVhIHRvIHJlcGxhY2UgYWxsIHRoZSB1c2VzIG9mIHRoZSBzbWFsbCBob29rcword2l0aCBAY29kZXtHRVRfU0FWRURfUkVHSVNURVJ9LCBzaW5jZSB0aGF0IHdvdWxkIHJlc3VsdCBpbiBtdWNoCitkdXBsaWNhdGVkIGNvZGUuICBPdGhlciB0aW1lcywgZHVwbGljYXRpbmcgYSBmZXcgbGluZXMgb2YgY29kZSBoZXJlIG9yCit0aGVyZSBpcyBtdWNoIGNsZWFuZXIgdGhhbiBpbnRyb2R1Y2luZyBhIGxhcmdlIG51bWJlciBvZiBzbWFsbCBob29rcy4KKworQW5vdGhlciB3YXkgdG8gZ2VuZXJhbGl6ZSBHREIgYWxvbmcgYSBwYXJ0aWN1bGFyIGludGVyZmFjZSBpcyB3aXRoIGFuCithdHRyaWJ1dGUgc3RydWN0LiAgRm9yIGV4YW1wbGUsIEdEQiBoYXMgYmVlbiBnZW5lcmFsaXplZCB0byBoYW5kbGUKK211bHRpcGxlIGtpbmRzIG9mIHJlbW90ZSBpbnRlcmZhY2VzIC0tIG5vdCBieSAjaWZkZWYncyBldmVyeXdoZXJlLCBidXQKK2J5IGRlZmluaW5nIHRoZSAidGFyZ2V0X29wcyIgc3RydWN0dXJlIGFuZCBoYXZpbmcgYSBjdXJyZW50IHRhcmdldCAoYXMKK3dlbGwgYXMgYSBzdGFjayBvZiB0YXJnZXRzIGJlbG93IGl0LCBmb3IgbWVtb3J5IHJlZmVyZW5jZXMpLiAgV2hlbmV2ZXIKK3NvbWV0aGluZyBuZWVkcyB0byBiZSBkb25lIHRoYXQgZGVwZW5kcyBvbiB3aGljaCByZW1vdGUgaW50ZXJmYWNlIHdlIGFyZQordXNpbmcsIGEgZmxhZyBpbiB0aGUgY3VycmVudCB0YXJnZXRfb3BzIHN0cnVjdHVyZSBpcyB0ZXN0ZWQgKGUuZy4KK2B0YXJnZXRfaGFzX3N0YWNrJyksIG9yIGEgZnVuY3Rpb24gaXMgY2FsbGVkIHRocm91Z2ggYSBwb2ludGVyIGluIHRoZQorY3VycmVudCB0YXJnZXRfb3BzIHN0cnVjdHVyZS4gIEluIHRoaXMgd2F5LCB3aGVuIGEgbmV3IHJlbW90ZSBpbnRlcmZhY2UKK2lzIGFkZGVkLCBvbmx5IG9uZSBtb2R1bGUgbmVlZHMgdG8gYmUgdG91Y2hlZCAtLSB0aGUgb25lIHRoYXQgYWN0dWFsbHkKK2ltcGxlbWVudHMgdGhlIG5ldyByZW1vdGUgaW50ZXJmYWNlLiAgT3RoZXIgZXhhbXBsZXMgb2YKK2F0dHJpYnV0ZS1zdHJ1Y3RzIGFyZSBCRkQgYWNjZXNzIHRvIG11bHRpcGxlIGtpbmRzIG9mIG9iamVjdCBmaWxlCitmb3JtYXRzLCBvciBHREIncyBhY2Nlc3MgdG8gbXVsdGlwbGUgc291cmNlIGxhbmd1YWdlcy4KKworUGxlYXNlIGF2b2lkIGR1cGxpY2F0aW5nIGNvZGUuICBGb3IgZXhhbXBsZSwgaW4gR0RCIDMueCBhbGwgdGhlIGNvZGUKK2ludGVyZmFjaW5nIGJldHdlZW4gQGNvZGV7cHRyYWNlfSBhbmQgdGhlIHJlc3Qgb2YgR0RCIHdhcyBkdXBsaWNhdGVkIGluCitAZmlsZXsqLWRlcC5jfSwgYW5kIHNvIGNoYW5naW5nIHNvbWV0aGluZyB3YXMgdmVyeSBwYWluZnVsLiAgSW4gR0RCIDQueCwKK3RoZXNlIGhhdmUgYWxsIGJlZW4gY29uc29saWRhdGVkIGludG8gQGZpbGV7aW5mcHRyYWNlLmN9LgorQGZpbGV7aW5mcHRyYWNlLmN9IGNhbiBkZWFsIHdpdGggdmFyaWF0aW9ucyBiZXR3ZWVuIHN5c3RlbXMgdGhlIHNhbWUgd2F5Cithbnkgc3lzdGVtLWluZGVwZW5kZW50IGZpbGUgd291bGQgKGhvb2tzLCAjaWYgZGVmaW5lZCwgZXRjLiksIGFuZAorbWFjaGluZXMgd2hpY2ggYXJlIHJhZGljYWxseSBkaWZmZXJlbnQgZG9uJ3QgbmVlZCB0byB1c2UgaW5mcHRyYWNlLmMgYXQKK2FsbC4KKworCitAbm9kZSBQb3J0aW5nIEdEQgorCitAY2hhcHRlciBQb3J0aW5nIEdEQgorCitNb3N0IG9mIHRoZSB3b3JrIGluIG1ha2luZyBHREIgY29tcGlsZSBvbiBhIG5ldyBtYWNoaW5lIGlzIGluIHNwZWNpZnlpbmcKK3RoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBtYWNoaW5lLiAgVGhpcyBpcyBkb25lIGluIGEgZGl6enlpbmcgdmFyaWV0eSBvZgoraGVhZGVyIGZpbGVzIGFuZCBjb25maWd1cmF0aW9uIHNjcmlwdHMsIHdoaWNoIHdlIGhvcGUgdG8gbWFrZSBtb3JlCitzZW5zaWJsZSBzb29uLiAgTGV0J3Mgc2F5IHlvdXIgbmV3IGhvc3QgaXMgY2FsbGVkIGFuIEB2YXJ7eHl6fSAoZS5nLgorQHNhbXB7c3VuNH0pLCBhbmQgaXRzIGZ1bGwgdGhyZWUtcGFydCBjb25maWd1cmF0aW9uIG5hbWUgaXMKK0Bjb2Rle0B2YXJ7YXJjaH0tQHZhcnt4dmVuZH0tQHZhcnt4b3N9fSAoZS5nLiAgQHNhbXB7c3BhcmMtc3VuLXN1bm9zNH0pLgorSW4gcGFydGljdWxhcjoKKworSW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnksIGVkaXQgQGZpbGV7Y29uZmlnLnN1Yn0gYW5kIGFkZCBAdmFye2FyY2h9LAorQHZhcnt4dmVuZH0sIGFuZCBAdmFye3hvc30gdG8gdGhlIGxpc3RzIG9mIHN1cHBvcnRlZCBhcmNoaXRlY3R1cmVzLAordmVuZG9ycywgYW5kIG9wZXJhdGluZyBzeXN0ZW1zIG5lYXIgdGhlIGJvdHRvbSBvZiB0aGUgZmlsZS4gIEFsc28sIGFkZAorQHZhcnt4eXp9IGFzIGFuIGFsaWFzIHRoYXQgbWFwcyB0bworQGNvZGV7QHZhcnthcmNofS1AdmFye3h2ZW5kfS1AdmFye3hvc319LiAgWW91IGNhbiB0ZXN0IHlvdXIgY2hhbmdlcyBieQorcnVubmluZworCitAZXhhbXBsZQorLi9jb25maWcuc3ViIEB2YXJ7eHl6fQorQGVuZCBleGFtcGxlCitAbm9pbmRlbnQKK2FuZAorQGV4YW1wbGUKKy4vY29uZmlnLnN1YiBAY29kZXtAdmFye2FyY2h9LUB2YXJ7eHZlbmR9LUB2YXJ7eG9zfX0KK0BlbmQgZXhhbXBsZQorQG5vaW5kZW50Cit3aGljaCBzaG91bGQgYm90aCByZXNwb25kIHdpdGggQGNvZGV7QHZhcnthcmNofS1AdmFye3h2ZW5kfS1AdmFye3hvc319CithbmQgbm8gZXJyb3IgbWVzc2FnZXMuCisKK1lvdSBuZWVkIHRvIHBvcnQgQkZELCBpZiB0aGF0IGhhc24ndCBiZWVuIGRvbmUgYWxyZWFkeS4gIFBvcnRpbmcgQkZEIGlzCitiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgbWFudWFsLgorCitUbyBjb25maWd1cmUgR0RCIGl0c2VsZiwgZWRpdCBAZmlsZXtnZGIvY29uZmlndXJlLmhvc3R9IHRvIHJlY29nbml6ZQoreW91ciBzeXN0ZW0gYW5kIHNldCBAY29kZXtnZGJfaG9zdH0gdG8gQHZhcnt4eXp9LCBhbmQgKHVubGVzcyB5b3VyCitkZXNpcmVkIHRhcmdldCBpcyBhbHJlYWR5IGF2YWlsYWJsZSkgYWxzbyBlZGl0IEBmaWxle2dkYi9jb25maWd1cmUudGd0fSwKK3NldHRpbmcgQGNvZGV7Z2RiX3RhcmdldH0gdG8gc29tZXRoaW5nIGFwcHJvcHJpYXRlIChmb3IgaW5zdGFuY2UsCitAdmFye3h5en0pLgorCitGaW5hbGx5LCB5b3UnbGwgbmVlZCB0byBzcGVjaWZ5IGFuZCBkZWZpbmUgR0RCJ3MgaG9zdC0sIG5hdGl2ZS0sIGFuZAordGFyZ2V0LWRlcGVuZGVudCBAZmlsZXsuaH0gYW5kIEBmaWxley5jfSBmaWxlcyB1c2VkIGZvciB5b3VyCitjb25maWd1cmF0aW9uLgorCitAc2VjdGlvbiBDb25maWd1cmluZyBHREIgZm9yIFJlbGVhc2UKKworRnJvbSB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSAoY29udGFpbmluZyBAZmlsZXtnZGJ9LCBAZmlsZXtiZmR9LAorQGZpbGV7bGliaWJlcnR5fSwgYW5kIHNvIG9uKToKK0BleGFtcGxlCittYWtlIC1mIE1ha2VmaWxlLmluIGdkYi50YXIuZ3oKK0BlbmQgZXhhbXBsZQorCitUaGlzIHdpbGwgcHJvcGVybHkgY29uZmlndXJlLCBjbGVhbiwgcmVidWlsZCBhbnkgZmlsZXMgdGhhdCBhcmUKK2Rpc3RyaWJ1dGVkIHByZS1idWlsdCAoZS5nLiBAZmlsZXtjLWV4cC50YWIuY30gb3IgQGZpbGV7cmVmY2FyZC5wc30pLAorYW5kIHdpbGwgdGhlbiBtYWtlIGEgdGFyZmlsZS4gIChJZiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBoYXMgYWxyZWFkeQorYmVlbiBjb25maWd1cmVkLCB5b3UgY2FuIGp1c3QgZG8gQGNvZGV7bWFrZSBnZGIudGFyLmd6fSBpbnN0ZWFkLikKKworVGhpcyBwcm9jZWR1cmUgcmVxdWlyZXM6CitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbSBzeW1ib2xpYyBsaW5rcworQGl0ZW0gQGNvZGV7bWFrZWluZm99ICh0ZXhpbmZvMiBsZXZlbCkKK0BpdGVtIEBUZVh7fQorQGl0ZW0gQGNvZGV7ZHZpcHN9CitAaXRlbSBAY29kZXt5YWNjfSBvciBAY29kZXtiaXNvbn0KK0BlbmQgaXRlbWl6ZQorQG5vaW5kZW50CitAZG90c3t9IGFuZCB0aGUgdXN1YWwgc2xldyBvZiB1dGlsaXRpZXMgKEBjb2Rle3NlZH0sIEBjb2Rle3Rhcn0sIGV0Yy4pLgorCitAc3ViaGVhZGluZyBURU1QT1JBUlkgUkVMRUFTRSBQUk9DRURVUkUgRk9SIERPQ1VNRU5UQVRJT04KKworQGZpbGV7Z2RiLnRleGluZm99IGlzIGN1cnJlbnRseSBtYXJrZWQgdXAgdXNpbmcgdGhlIHRleGluZm8tMiBtYWNyb3MsCit3aGljaCBhcmUgbm90IHlldCBhIGRlZmF1bHQgZm9yIGFueXRoaW5nIChidXQgd2UgaGF2ZSB0byBzdGFydCB1c2luZwordGhlbSBzb21ldGltZSkuCisKK0ZvciBtYWtpbmcgcGFwZXIsIHRoZSBvbmx5IHRoaW5nIHRoaXMgaW1wbGllcyBpcyB0aGUgcmlnaHQgZ2VuZXJhdGlvbiBvZgorQGZpbGV7dGV4aW5mby50ZXh9IG5lZWRzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24uCisKK0ZvciBtYWtpbmcgaW5mbyBmaWxlcywgaG93ZXZlciwgcmF0aGVyIHRoYW4gZHVwbGljYXRpbmcgdGhlIHRleGluZm8yCitkaXN0cmlidXRpb24sIGdlbmVyYXRlIEBmaWxle2dkYi1hbGwudGV4aW5mb30gbG9jYWxseSwgYW5kIGluY2x1ZGUgdGhlCitmaWxlcyBAZmlsZXtnZGIuaW5mbyp9IGluIHRoZSBkaXN0cmlidXRpb24uICBOb3RlIHRoZSBwbHVyYWw7CitAY29kZXttYWtlaW5mb30gd2lsbCBzcGxpdCB0aGUgZG9jdW1lbnQgaW50byBvbmUgb3ZlcmFsbCBmaWxlIGFuZCBmaXZlCitvciBzbyBpbmNsdWRlZCBmaWxlcy4KKworQG5vZGUgSGludHMKKworQGNoYXB0ZXIgSGludHMKKworQ2hlY2sgdGhlIEBmaWxle1JFQURNRX0gZmlsZSwgaXQgb2Z0ZW4gaGFzIHVzZWZ1bCBpbmZvcm1hdGlvbiB0aGF0IGRvZXMgbm90CithcHBlYXIgYW55d2hlcmUgZWxzZSBpbiB0aGUgZGlyZWN0b3J5LgorCitAbWVudQorKiBHZXR0aW5nIFN0YXJ0ZWQ6OgkJR2V0dGluZyBzdGFydGVkIHdvcmtpbmcgb24gR0RCCisqIERlYnVnZ2luZyBHREI6OgkJRGVidWdnaW5nIEdEQiB3aXRoIGl0c2VsZgorQGVuZCBtZW51CisKK0Bub2RlIEdldHRpbmcgU3RhcnRlZCwsLCBIaW50cworCitAc2VjdGlvbiBHZXR0aW5nIFN0YXJ0ZWQKKworR0RCIGlzIGEgbGFyZ2UgYW5kIGNvbXBsaWNhdGVkIHByb2dyYW0sIGFuZCBpZiB5b3UgZmlyc3Qgc3RhcnRpbmcgdG8KK3dvcmsgb24gaXQsIGl0IGNhbiBiZSBoYXJkIHRvIGtub3cgd2hlcmUgdG8gc3RhcnQuICBGb3J0dW5hdGVseSwgaWYgeW91Citrbm93IGhvdyB0byBnbyBhYm91dCBpdCwgdGhlcmUgYXJlIHdheXMgdG8gZmlndXJlIG91dCB3aGF0IGlzIGdvaW5nIG9uLgorCitUaGlzIG1hbnVhbCwgdGhlIEdEQiBJbnRlcm5hbHMgbWFudWFsLCBoYXMgaW5mb3JtYXRpb24gd2hpY2ggYXBwbGllcworZ2VuZXJhbGx5IHRvIG1hbnkgcGFydHMgb2YgR0RCLgorCitJbmZvcm1hdGlvbiBhYm91dCBwYXJ0aWN1bGFyIGZ1bmN0aW9ucyBvciBkYXRhIHN0cnVjdHVyZXMgYXJlIGxvY2F0ZWQgaW4KK2NvbW1lbnRzIHdpdGggdGhvc2UgZnVuY3Rpb25zIG9yIGRhdGEgc3RydWN0dXJlcy4gIElmIHlvdSBydW4gYWNyb3NzIGEKK2Z1bmN0aW9uIG9yIGEgZ2xvYmFsIHZhcmlhYmxlIHdoaWNoIGRvZXMgbm90IGhhdmUgYSBjb21tZW50IGNvcnJlY3RseQorZXhwbGFpbmluZyB3aGF0IGlzIGRvZXMsIHRoaXMgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSBidWcgaW4gR0RCOyBmZWVsCitmcmVlIHRvIHN1Ym1pdCBhIGJ1ZyByZXBvcnQsIHdpdGggYSBzdWdnZXN0ZWQgY29tbWVudCBpZiB5b3UgY2FuIGZpZ3VyZQorb3V0IHdoYXQgdGhlIGNvbW1lbnQgc2hvdWxkIHNheS4gIElmIHlvdSBmaW5kIGEgY29tbWVudCB3aGljaCBpcworYWN0dWFsbHkgd3JvbmcsIGJlIGVzcGVjaWFsbHkgc3VyZSB0byByZXBvcnQgdGhhdC4KKworQ29tbWVudHMgZXhwbGFpbmluZyB0aGUgZnVuY3Rpb24gb2YgbWFjcm9zIGRlZmluZWQgaW4gaG9zdCwgdGFyZ2V0LCBvcgorbmF0aXZlIGRlcGVuZGVudCBmaWxlcyBjYW4gYmUgaW4gc2V2ZXJhbCBwbGFjZXMuICBTb21ldGltZXMgdGhleSBhcmUKK3JlcGVhdGVkIGV2ZXJ5IHBsYWNlIHRoZSBtYWNybyBpcyBkZWZpbmVkLiAgU29tZXRpbWVzIHRoZXkgYXJlIHdoZXJlIHRoZQorbWFjcm8gaXMgdXNlZC4gIFNvbWV0aW1lcyB0aGVyZSBpcyBhIGhlYWRlciBmaWxlIHdoaWNoIHN1cHBsaWVzIGEKK2RlZmF1bHQgZGVmaW5pdGlvbiBvZiB0aGUgbWFjcm8sIGFuZCB0aGUgY29tbWVudCBpcyB0aGVyZS4gIFRoaXMgbWFudWFsCithbHNvIGRvY3VtZW50cyBhbGwgdGhlIGF2YWlsYWJsZSBtYWNyb3MuCitAYyAoQHB4cmVme0hvc3QgQ29uZGl0aW9uYWxzfSwgQHB4cmVme1RhcmdldAorQGMgQ29uZGl0aW9uYWxzfSwgQHB4cmVme05hdGl2ZSBDb25kaXRpb25hbHN9LCBhbmQgQHB4cmVme09ic29sZXRlCitAYyBDb25kaXRpb25hbHN9KQorCitTdGFydCB3aXRoIHRoZSBoZWFkZXIgZmlsZXMuICBPbmNlIHlvdSBzb21lIGlkZWEgb2YgaG93IEdEQidzIGludGVybmFsCitzeW1ib2wgdGFibGVzIGFyZSBzdG9yZWQgKHNlZSBAZmlsZXtzeW10YWIuaH0sIEBmaWxle2dkYnR5cGVzLmh9KSwgeW91Cit3aWxsIGZpbmQgaXQgbXVjaCBlYXNpZXIgdG8gdW5kZXJzdGFuZCB0aGUgY29kZSB3aGljaCB1c2VzIGFuZCBjcmVhdGVzCit0aG9zZSBzeW1ib2wgdGFibGVzLgorCitZb3UgbWF5IHdpc2ggdG8gcHJvY2VzcyB0aGUgaW5mb3JtYXRpb24geW91IGFyZSBnZXR0aW5nIHNvbWVob3csIHRvCitlbmhhbmNlIHlvdXIgdW5kZXJzdGFuZGluZyBvZiBpdC4gIFN1bW1hcml6ZSBpdCwgdHJhbnNsYXRlIGl0IHRvIGFub3RoZXIKK2xhbmd1YWdlLCBhZGQgc29tZSAocGVyaGFwcyB0cml2aWFsIG9yIG5vbi11c2VmdWwpIGZlYXR1cmUgdG8gR0RCLCB1c2UKK3RoZSBjb2RlIHRvIHByZWRpY3Qgd2hhdCBhIHRlc3QgY2FzZSB3b3VsZCBkbyBhbmQgd3JpdGUgdGhlIHRlc3QgY2FzZQorYW5kIHZlcmlmeSB5b3VyIHByZWRpY3Rpb24sIGV0Yy4gIElmIHlvdSBhcmUgcmVhZGluZyBjb2RlIGFuZCB5b3VyIGV5ZXMKK2FyZSBzdGFydGluZyB0byBnbGF6ZSBvdmVyLCB0aGlzIGlzIGEgc2lnbiB5b3UgbmVlZCB0byB1c2UgYSBtb3JlIGFjdGl2ZQorYXBwcm9hY2guCisKK09uY2UgeW91IGhhdmUgYSBwYXJ0IG9mIEdEQiB0byBzdGFydCB3aXRoLCB5b3UgY2FuIGZpbmQgbW9yZQorc3BlY2lmaWNhbGx5IHRoZSBwYXJ0IHlvdSBhcmUgbG9va2luZyBmb3IgYnkgc3RlcHBpbmcgdGhyb3VnaCBlYWNoCitmdW5jdGlvbiB3aXRoIHRoZSBAY29kZXtuZXh0fSBjb21tYW5kLiAgRG8gbm90IHVzZSBAY29kZXtzdGVwfSBvciB5b3UKK3dpbGwgcXVpY2tseSBnZXQgZGlzdHJhY3RlZDsgd2hlbiB0aGUgZnVuY3Rpb24geW91IGFyZSBzdGVwcGluZyB0aHJvdWdoCitjYWxscyBhbm90aGVyIGZ1bmN0aW9uIHRyeSBvbmx5IHRvIGdldCBhIGJpZy1waWN0dXJlIHVuZGVyc3RhbmRpbmcKKyhwZXJoYXBzIHVzaW5nIHRoZSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nCitjYWxsZWQpIG9mIHdoYXQgaXQgZG9lcy4gIFRoaXMgd2F5IHlvdSBjYW4gaWRlbnRpZnkgd2hpY2ggb2YgdGhlCitmdW5jdGlvbnMgYmVpbmcgY2FsbGVkIGJ5IHRoZSBmdW5jdGlvbiB5b3UgYXJlIHN0ZXBwaW5nIHRocm91Z2ggaXMgdGhlCitvbmUgd2hpY2ggeW91IGFyZSBpbnRlcmVzdGVkIGluLiAgWW91IG1heSBuZWVkIHRvIGV4YW1pbmUgdGhlIGRhdGEKK3N0cnVjdHVyZXMgZ2VuZXJhdGVkIGF0IGVhY2ggc3RhZ2UsIHdpdGggcmVmZXJlbmNlIHRvIHRoZSBjb21tZW50cyBpbgordGhlIGhlYWRlciBmaWxlcyBleHBsYWluaW5nIHdoYXQgdGhlIGRhdGEgc3RydWN0dXJlcyBhcmUgc3VwcG9zZWQgdG8KK2xvb2sgbGlrZS4KKworT2YgY291cnNlLCB0aGlzIHNhbWUgdGVjaG5pcXVlIGNhbiBiZSB1c2VkIGlmIHlvdSBhcmUganVzdCByZWFkaW5nIHRoZQorY29kZSwgcmF0aGVyIHRoYW4gYWN0dWFsbHkgc3RlcHBpbmcgdGhyb3VnaCBpdC4gIFRoZSBzYW1lIGdlbmVyYWwKK3ByaW5jaXBsZSBhcHBsaWVzLS0td2hlbiB0aGUgY29kZSB5b3UgYXJlIGxvb2tpbmcgYXQgY2FsbHMgc29tZXRoaW5nCitlbHNlLCBqdXN0IHRyeSB0byB1bmRlcnN0YW5kIGdlbmVyYWxseSB3aGF0IHRoZSBjb2RlIGJlaW5nIGNhbGxlZCBkb2VzLAorcmF0aGVyIHRoYW4gd29ycnlpbmcgYWJvdXQgYWxsIGl0cyBkZXRhaWxzLgorCitBIGdvb2QgcGxhY2UgdG8gc3RhcnQgd2hlbiB0cmFja2luZyBkb3duIHNvbWUgcGFydGljdWxhciBhcmVhIGlzIHdpdGggYQorY29tbWFuZCB3aGljaCBpbnZva2VzIHRoYXQgZmVhdHVyZS4gIFN1cHBvc2UgeW91IHdhbnQgdG8ga25vdyBob3cKK3NpbmdsZS1zdGVwcGluZyB3b3Jrcy4gIEFzIGEgR0RCIHVzZXIsIHlvdSBrbm93IHRoYXQgdGhlIEBjb2Rle3N0ZXB9Citjb21tYW5kIGludm9rZXMgc2luZ2xlLXN0ZXBwaW5nLiAgVGhlIGNvbW1hbmQgaXMgaW52b2tlZCB2aWEgY29tbWFuZAordGFibGVzIChzZWUgQGZpbGV7Y29tbWFuZC5ofSk7IGJ5IGNvbnZlbnRpb24gdGhlIGZ1bmN0aW9uIHdoaWNoIGFjdHVhbGx5CitwZXJmb3JtcyB0aGUgY29tbWFuZCBpcyBmb3JtZWQgYnkgdGFraW5nIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIGFuZAorYWRkaW5nIEBzYW1we19jb21tYW5kfSwgb3IgaW4gdGhlIGNhc2Ugb2YgYW4gQGNvZGV7aW5mb30gc3ViY29tbWFuZCwKK0BzYW1we19pbmZvfS4gIEZvciBleGFtcGxlLCB0aGUgQGNvZGV7c3RlcH0gY29tbWFuZCBpbnZva2VzIHRoZQorQGNvZGV7c3RlcF9jb21tYW5kfSBmdW5jdGlvbiBhbmQgdGhlIEBjb2Rle2luZm8gZGlzcGxheX0gY29tbWFuZCBpbnZva2VzCitAY29kZXtkaXNwbGF5X2luZm99LiAgV2hlbiB0aGlzIGNvbnZlbnRpb24gaXMgbm90IGZvbGxvd2VkLCB5b3UgbWlnaHQKK2hhdmUgdG8gdXNlIEBjb2Rle2dyZXB9IG9yIEBrYmR7TS14IHRhZ3Mtc2VhcmNofSBpbiBlbWFjcywgb3IgcnVuIEdEQiBvbgoraXRzZWxmIGFuZCBzZXQgYSBicmVha3BvaW50IGluIEBjb2Rle2V4ZWN1dGVfY29tbWFuZH0uCisKK0lmIGFsbCBvZiB0aGUgYWJvdmUgZmFpbCwgaXQgbWF5IGJlIGFwcHJvcHJpYXRlIHRvIGFzayBmb3IgaW5mb3JtYXRpb24KK29uIEBjb2Rle2J1Zy1nZGJ9LiAgQnV0IEBlbXBoe25ldmVyfSBwb3N0IGEgZ2VuZXJpYyBxdWVzdGlvbiBsaWtlIGBgSSB3YXMKK3dvbmRlcmluZyBpZiBhbnlvbmUgY291bGQgZ2l2ZSBtZSBzb21lIHRpcHMgYWJvdXQgdW5kZXJzdGFuZGluZworR0RCJyctLS1pZiB3ZSBoYWQgc29tZSBtYWdpYyBzZWNyZXQgd2Ugd291bGQgcHV0IGl0IGluIHRoaXMgbWFudWFsLgorU3VnZ2VzdGlvbnMgZm9yIGltcHJvdmluZyB0aGUgbWFudWFsIGFyZSBhbHdheXMgd2VsY29tZSwgb2YgY291cnNlLgorCitAbm9kZSBEZWJ1Z2dpbmcgR0RCLCwsSGludHMKKworQHNlY3Rpb24gRGVidWdnaW5nIEdEQiB3aXRoIGl0c2VsZgorCitJZiBHREIgaXMgbGltcGluZyBvbiB5b3VyIG1hY2hpbmUsIHRoaXMgaXMgdGhlIHByZWZlcnJlZCB3YXkgdG8gZ2V0IGl0CitmdWxseSBmdW5jdGlvbmFsLiAgQmUgd2FybmVkIHRoYXQgaW4gc29tZSBhbmNpZW50IFVuaXggc3lzdGVtcywgbGlrZQorVWx0cml4IDQuMiwgYSBwcm9ncmFtIGNhbid0IGJlIHJ1bm5pbmcgaW4gb25lIHByb2Nlc3Mgd2hpbGUgaXQgaXMgYmVpbmcKK2RlYnVnZ2VkIGluIGFub3RoZXIuICBSYXRoZXIgdGhhbiB0eXBpbmcgdGhlIGNvbW1hbmQgQGNvZGV7QHd7Li9nZGIKKy4vZ2RifX0sIHdoaWNoIHdvcmtzIG9uIFN1bnMgYW5kIHN1Y2gsIHlvdSBjYW4gY29weSBAZmlsZXtnZGJ9IHRvCitAZmlsZXtnZGIyfSBhbmQgdGhlbiB0eXBlIEBjb2Rle0B3ey4vZ2RiIC4vZ2RiMn19LgorCitXaGVuIHlvdSBydW4gR0RCIGluIHRoZSBHREIgc291cmNlIGRpcmVjdG9yeSwgaXQgd2lsbCByZWFkIGEKK0BmaWxley5nZGJpbml0fSBmaWxlIHRoYXQgc2V0cyB1cCBzb21lIHNpbXBsZSB0aGluZ3MgdG8gbWFrZSBkZWJ1Z2dpbmcKK2dkYiBlYXNpZXIuICBUaGUgQGNvZGV7aW5mb30gY29tbWFuZCwgd2hlbiBleGVjdXRlZCB3aXRob3V0IGEgc3ViY29tbWFuZAoraW4gYSBHREIgYmVpbmcgZGVidWdnZWQgYnkgZ2RiLCB3aWxsIHBvcCB5b3UgYmFjayB1cCB0byB0aGUgdG9wIGxldmVsCitnZGIuICBTZWUgQGZpbGV7LmdkYmluaXR9IGZvciBkZXRhaWxzLgorCitJZiB5b3UgdXNlIGVtYWNzLCB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIGRvIGEgQGNvZGV7bWFrZSBUQUdTfSBhZnRlcgoreW91IGNvbmZpZ3VyZSB5b3VyIGRpc3RyaWJ1dGlvbjsgdGhpcyB3aWxsIHB1dCB0aGUgbWFjaGluZSBkZXBlbmRlbnQKK3JvdXRpbmVzIGZvciB5b3VyIGxvY2FsIG1hY2hpbmUgd2hlcmUgdGhleSB3aWxsIGJlIGFjY2Vzc2VkIGZpcnN0IGJ5CitAa2Jke00tLn0KKworQWxzbywgbWFrZSBzdXJlIHRoYXQgeW91J3ZlIGVpdGhlciBjb21waWxlZCBHREIgd2l0aCB5b3VyIGxvY2FsIGNjLCBvcgoraGF2ZSBydW4gQGNvZGV7Zml4aW5jbHVkZXN9IGlmIHlvdSBhcmUgY29tcGlsaW5nIHdpdGggZ2NjLgorCitAc2VjdGlvbiBTdWJtaXR0aW5nIFBhdGNoZXMKKworVGhhbmtzIGZvciB0aGlua2luZyBvZiBvZmZlcmluZyB5b3VyIGNoYW5nZXMgYmFjayB0byB0aGUgY29tbXVuaXR5IG9mCitHREIgdXNlcnMuICBJbiBnZW5lcmFsIHdlIGxpa2UgdG8gZ2V0IHdlbGwgZGVzaWduZWQgZW5oYW5jZW1lbnRzLgorVGhhbmtzIGFsc28gZm9yIGNoZWNraW5nIGluIGFkdmFuY2UgYWJvdXQgdGhlIGJlc3Qgd2F5IHRvIHRyYW5zZmVyIHRoZQorY2hhbmdlcy4KKworVGhlIEdEQiBtYWludGFpbmVycyB3aWxsIG9ubHkgaW5zdGFsbCBgYGNsZWFubHkgZGVzaWduZWQnJyBwYXRjaGVzLiAgWW91CittYXkgbm90IGFsd2F5cyBhZ3JlZSBvbiB3aGF0IGlzIGNsZWFuIGRlc2lnbi4KK0BjIEBweHJlZntDb2RpbmcgU3R5bGV9LCBAcHhyZWZ7Q2xlYW4gRGVzaWdufS4KKworSWYgdGhlIG1haW50YWluZXJzIGRvbid0IGhhdmUgdGltZSB0byBwdXQgdGhlIHBhdGNoIGluIHdoZW4gaXQgYXJyaXZlcywKK29yIGlmIHRoZXJlIGlzIGFueSBxdWVzdGlvbiBhYm91dCBhIHBhdGNoLCBpdCBnb2VzIGludG8gYSBsYXJnZSBxdWV1ZQord2l0aCBldmVyeW9uZSBlbHNlJ3MgcGF0Y2hlcyBhbmQgYnVnIHJlcG9ydHMuCisKK1RoZSBsZWdhbCBpc3N1ZSBpcyB0aGF0IHRvIGluY29ycG9yYXRlIHN1YnN0YW50aWFsIGNoYW5nZXMgcmVxdWlyZXMgYQorY29weXJpZ2h0IGFzc2lnbm1lbnQgZnJvbSB5b3UgYW5kL29yIHlvdXIgZW1wbG95ZXIsIGdyYW50aW5nIG93bmVyc2hpcAorb2YgdGhlIGNoYW5nZXMgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFlvdSBjYW4gZ2V0IHRoZQorc3RhbmRhcmQgZG9jdW1lbnQgZm9yIGRvaW5nIHRoaXMgYnkgc2VuZGluZyBtYWlsIHRvCitAY29kZXtnbnVAQHByZXAuYWkubWl0LmVkdX0gYW5kIGFza2luZyBmb3IgaXQuICBJIHJlY29tbWVuZCB0aGF0IHBlb3BsZQord3JpdGUgaW4gIkFsbCBwcm9ncmFtcyBvd25lZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBhcyAiTkFNRQorT0YgUFJPR1JBTSIsIHNvIHRoYXQgY2hhbmdlcyBpbiBtYW55IHByb2dyYW1zIChub3QganVzdCBHREIsIGJ1dCBHQVMsCitFbWFjcywgR0NDLCBldGMpIGNhbiBiZSBjb250cmlidXRlZCB3aXRoIG9ubHkgb25lIHBpZWNlIG9mIGxlZ2FsZXNlCitwdXNoZWQgdGhyb3VnaCB0aGUgYnVyZWFjcmFjeSBhbmQgZmlsZWQgd2l0aCB0aGUgRlNGLiAgSSBjYW4ndCBzdGFydAorbWVyZ2luZyBjaGFuZ2VzIHVudGlsIHRoaXMgcGFwZXJ3b3JrIGlzIHJlY2VpdmVkIGJ5IHRoZSBGU0YgKHRoZWlyCitydWxlcywgd2hpY2ggSSBmb2xsb3cgc2luY2UgSSBtYWludGFpbiBpdCBmb3IgdGhlbSkuCisKK1RlY2huaWNhbGx5LCB0aGUgZWFzaWVzdCB3YXkgdG8gcmVjZWl2ZSBjaGFuZ2VzIGlzIHRvIHJlY2VpdmUgZWFjaAorZmVhdHVyZSBhcyBhIHNtYWxsIGNvbnRleHQgZGlmZiBvciB1bmlkaWZmLCBzdWl0YWJsZSBmb3IgInBhdGNoIi4KK0VhY2ggbWVzc2FnZSBzZW50IHRvIG1lIHNob3VsZCBpbmNsdWRlIHRoZSBjaGFuZ2VzIHRvIEMgY29kZSBhbmQKK2hlYWRlciBmaWxlcyBmb3IgYSBzaW5nbGUgZmVhdHVyZSwgcGx1cyBDaGFuZ2VMb2cgZW50cmllcyBmb3IgZWFjaAorZGlyZWN0b3J5IHdoZXJlIGZpbGVzIHdlcmUgbW9kaWZpZWQsIGFuZCBkaWZmcyBmb3IgYW55IGNoYW5nZXMgbmVlZGVkCit0byB0aGUgbWFudWFscyAoZ2RiL2RvYy9nZGIudGV4aSBvciBnZGIvZG9jL2dkYmludC50ZXhpKS4gIElmIHRoZXJlCithcmUgYSBsb3Qgb2YgY2hhbmdlcyBmb3IgYSBzaW5nbGUgZmVhdHVyZSwgdGhleSBjYW4gYmUgc3BsaXQgZG93bgoraW50byBtdWx0aXBsZSBtZXNzYWdlcy4KKworSW4gdGhpcyB3YXksIGlmIEkgcmVhZCBhbmQgbGlrZSB0aGUgZmVhdHVyZSwgSSBjYW4gYWRkIGl0IHRvIHRoZQorc291cmNlcyB3aXRoIGEgc2luZ2xlIHBhdGNoIGNvbW1hbmQsIGRvIHNvbWUgdGVzdGluZywgYW5kIGNoZWNrIGl0IGluLgorSWYgeW91IGxlYXZlIG91dCB0aGUgQ2hhbmdlTG9nLCBJIGhhdmUgdG8gd3JpdGUgb25lLiAgSWYgeW91IGxlYXZlCitvdXQgdGhlIGRvYywgSSBoYXZlIHRvIHB1enpsZSBvdXQgd2hhdCBuZWVkcyBkb2N1bWVudGluZy4gIEV0Yy4KKworVGhlIHJlYXNvbiB0byBzZW5kIGVhY2ggY2hhbmdlIGluIGEgc2VwYXJhdGUgbWVzc2FnZSBpcyB0aGF0IEkgd2lsbAorbm90IGluc3RhbGwgc29tZSBvZiB0aGUgY2hhbmdlcy4gIFRoZXknbGwgYmUgcmV0dXJuZWQgdG8geW91IHdpdGgKK3F1ZXN0aW9ucyBvciBjb21tZW50cy4gIElmIEknbSBkb2luZyBteSBqb2IsIG15IG1lc3NhZ2UgYmFjayB0byB5b3UKK3dpbGwgc2F5IHdoYXQgeW91IGhhdmUgdG8gZml4IGluIG9yZGVyIHRvIG1ha2UgdGhlIGNoYW5nZSBhY2NlcHRhYmxlLgorVGhlIHJlYXNvbiB0byBoYXZlIHNlcGFyYXRlIG1lc3NhZ2VzIGZvciBzZXBhcmF0ZSBmZWF0dXJlcyBpcyBzbwordGhhdCBvdGhlciBjaGFuZ2VzICh3aGljaCBJIEBlbXBoe2FtfSB3aWxsaW5nIHRvIGFjY2VwdCkgY2FuIGJlIGluc3RhbGxlZAord2hpbGUgb25lIG9yIG1vcmUgY2hhbmdlcyBhcmUgYmVpbmcgcmV3b3JrZWQuICBJZiBtdWx0aXBsZSBmZWF0dXJlcworYXJlIHNlbnQgaW4gYSBzaW5nbGUgbWVzc2FnZSwgSSB0ZW5kIHRvIG5vdCBwdXQgaW4gdGhlIGVmZm9ydCB0byBzb3J0CitvdXQgdGhlIGFjY2VwdGFibGUgY2hhbmdlcyBmcm9tIHRoZSB1bmFjY2VwdGFibGUsIHNvIG5vbmUgb2YgdGhlCitmZWF0dXJlcyBnZXQgaW5zdGFsbGVkIHVudGlsIGFsbCBhcmUgYWNjZXB0YWJsZS4KKworSWYgdGhpcyBzb3VuZHMgcGFpbmZ1bCBvciBhdXRob3JpdGFyaWFuLCB3ZWxsLCBpdCBpcy4gIEJ1dCBJIGdldCBhIGxvdAorb2YgYnVnIHJlcG9ydHMgYW5kIGEgbG90IG9mIHBhdGNoZXMsIGFuZCBtb3N0IG9mIHRoZW0gZG9uJ3QgZ2V0CitpbnN0YWxsZWQgYmVjYXVzZSBJIGRvbid0IGhhdmUgdGhlIHRpbWUgdG8gZmluaXNoIHRoZSBqb2IgdGhhdCB0aGUgYnVnCityZXBvcnRlciBvciB0aGUgY29udHJpYnV0b3IgY291bGQgaGF2ZSBkb25lLiAgUGF0Y2hlcyB0aGF0IGFycml2ZQorY29tcGxldGUsIHdvcmtpbmcsIGFuZCB3ZWxsIGRlc2lnbmVkLCB0ZW5kIHRvIGdldCBpbnN0YWxsZWQgb24gdGhlIGRheQordGhleSBhcnJpdmUuICBUaGUgb3RoZXJzIGdvIGludG8gYSBxdWV1ZSBhbmQgZ2V0IGluc3RhbGxlZCBpZiBhbmQgd2hlbgorSSBzY2FuIGJhY2sgb3ZlciB0aGUgcXVldWUgLS0gd2hpY2ggY2FuIGxpdGVyYWxseSB0YWtlIG1vbnRocworc29tZXRpbWVzLiAgSXQncyBpbiBib3RoIG91ciBpbnRlcmVzdHMgdG8gbWFrZSBwYXRjaCBpbnN0YWxsYXRpb24gZWFzeQorLS0geW91IGdldCB5b3VyIGNoYW5nZXMgaW5zdGFsbGVkLCBhbmQgSSBtYWtlIHNvbWUgZm9yd2FyZCBwcm9ncmVzcyBvbgorR0RCIGluIGEgbm9ybWFsIDEyLWhvdXIgZGF5IChpbnN0ZWFkIG9mIHRoZW0gaGF2aW5nIHRvIHdhaXQgdW50aWwgSQoraGF2ZSBhIDE0LWhvdXIgb3IgMTYtaG91ciBkYXkgdG8gc3BlbmQgY2xlYW5pbmcgdXAgcGF0Y2hlcyBiZWZvcmUgSQorY2FuIGluc3RhbGwgdGhlbSkuCisKK1BsZWFzZSBzZW5kIHBhdGNoZXMgZGlyZWN0bHkgdG8gdGhlIEdEQiBtYWludGFpbmVycyBhdAorQGNvZGV7Z2RiLXBhdGNoZXNAQGN5Z251cy5jb219LgorCitAc2VjdGlvbiBPYnNvbGV0ZSBDb25kaXRpb25hbHMKKworRnJhZ21lbnRzIG9mIG9sZCBjb2RlIGluIEdEQiBzb21ldGltZXMgcmVmZXJlbmNlIG9yIHNldCB0aGUgZm9sbG93aW5nCitjb25maWd1cmF0aW9uIG1hY3Jvcy4gIFRoZXkgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IG5ldyBjb2RlLCBhbmQgb2xkIHVzZXMKK3Nob3VsZCBiZSByZW1vdmVkIGFzIHRob3NlIHBhcnRzIG9mIHRoZSBkZWJ1Z2dlciBhcmUgb3RoZXJ3aXNlIHRvdWNoZWQuCisKK0B0YWJsZSBAY29kZQorCitAaXRlbSBTVEFDS19FTkRfQUREUgorVGhpcyBtYWNybyB1c2VkIHRvIGRlZmluZSB3aGVyZSB0aGUgZW5kIG9mIHRoZSBzdGFjayBhcHBlYXJlZCwgZm9yIHVzZQoraW4gaW50ZXJwcmV0aW5nIGNvcmUgZmlsZSBmb3JtYXRzIHRoYXQgZG9uJ3QgcmVjb3JkIHRoaXMgYWRkcmVzcyBpbiB0aGUKK2NvcmUgZmlsZSBpdHNlbGYuICBUaGlzIGluZm9ybWF0aW9uIGlzIG5vdyBjb25maWd1cmVkIGluIEJGRCwgYW5kIEdEQgorZ2V0cyB0aGUgaW5mbyBwb3J0YWJseSBmcm9tIHRoZXJlLiAgVGhlIHZhbHVlcyBpbiBHREIncyBjb25maWd1cmF0aW9uCitmaWxlcyBzaG91bGQgYmUgbW92ZWQgaW50byBCRkQgY29uZmlndXJhdGlvbiBmaWxlcyAoaWYgbmVlZGVkIHRoZXJlKSwKK2FuZCBkZWxldGVkIGZyb20gYWxsIG9mIEdEQidzIGNvbmZpZyBmaWxlcy4KKworQW55IEBmaWxle0B2YXJ7Zm9vfS14ZGVwLmN9IGZpbGUgdGhhdCByZWZlcmVuY2VzIFNUQUNLX0VORF9BRERSCitpcyBzbyBvbGQgdGhhdCBpdCBoYXMgbmV2ZXIgYmVlbiBjb252ZXJ0ZWQgdG8gdXNlIEJGRC4gIE5vdyB0aGF0J3Mgb2xkIQorCitAaXRlbSBQWVJBTUlEX0NPTlRST0xfRlJBTUVfREVCVUdHSU5HCitweXIteGRlcC5jCitAaXRlbSBQWVJBTUlEX0NPUkUKK3B5ci14ZGVwLmMKK0BpdGVtIFBZUkFNSURfUFRSQUNFCitweXIteGRlcC5jCisKK0BpdGVtIFJFR19TVEFDS19TRUdNRU5UCitleGVjLmMKKworQGVuZCB0YWJsZQorCisKK0Bjb250ZW50cworQGJ5ZQpkaWZmIC0tZ2l0IGEvZ2RiL2RvYy9saWJnZGIudGV4aW5mbyBiL2dkYi9kb2MvbGliZ2RiLnRleGluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhZGNiMgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9kb2MvbGliZ2RiLnRleGluZm8KQEAgLTAsMCArMSw4NzggQEAKK1xpbnB1dCB0ZXhpbmZvICAgQGMgLSotdGV4aW5mby0qLQorQGMgJSoqc3RhcnQgb2YgaGVhZGVyCitAc2V0ZmlsZW5hbWUgbGliZ2RiLmluZm8KK0BzZXR0aXRsZSBMaWJnZGIKK0BzZXRjaGFwdGVybmV3cGFnZSBvZmYKK0BjICUqKmVuZCBvZiBoZWFkZXIKKworQGlmaW5mbworVGhpcyBmaWxlIGRvY3VtZW50cyBsaWJnZGIsIHRoZSBHTlUgc3ltYm9saWMgZGVidWdnZXIgaW4gYSBsaWJyYXJ5LgorCitUaGlzIGlzIEVkaXRpb24gMC4zLCBPY3QgMTk5Mywgb2YgQGNpdGV7TGliZ2RifS4KK0NvcHlyaWdodCAxOTkzIEN5Z251cyBTdXBwb3J0CisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgordGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKK2FyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKworQGlnbm9yZQorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGVYIGFuZCBwcmludCB0aGUKK3Jlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCitub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKKyh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KKworQGVuZCBpZ25vcmUKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0IHRoZQorZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKK3Blcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCitpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KK0BlbmQgaWZpbmZvCisKK0BjICBUaGlzIHRpdGxlIHBhZ2UgaWxsdXN0cmF0ZXMgb25seSBvbmUgb2YgdGhlCitAYyAgdHdvIG1ldGhvZHMgb2YgZm9ybWluZyBhIHRpdGxlIHBhZ2UuCisKK0B0aXRsZXBhZ2UKK0B0aXRsZSBMaWJnZGIKK0BzdWJ0aXRsZSBWZXJzaW9uIDAuMworQHN1YnRpdGxlIE9jdCAxOTkzCitAYXV0aG9yIFRob21hcyBMb3JkCisKK0BjICBUaGUgZm9sbG93aW5nIHR3byBjb21tYW5kcworQGMgIHN0YXJ0IHRoZSBjb3B5cmlnaHQgcGFnZS4KK0BwYWdlCitAdnNraXAgMHB0IHBsdXMgMWZpbGxsCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisKK0NvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MyBDeWdudXMgU3VwcG9ydAorQGVuZCB0aXRsZXBhZ2UKKworQGlmaW5mbworQG5vZGUgVG9wLCBPdmVydmlldywgKGRpciksIChkaXIpCisKK1RoaXMgaW5mbyBmaWxlIGRvY3VtZW50cyBsaWJnZGI6IGFuIEFQSSBmb3IgR0RCLCB0aGUgR05VIHN5bWJvbGljIGRlYnVnZ2VyLgorCitAbWVudQorKiBPdmVydmlldzo6CSAgICAgICAgICAgICBUaGUgYmFzaWNzIG9mIGxpYmdkYiBhbmQgdGhpcyBkb2N1bWVudC4KKyogSW50ZXJwcmV0ZXI6OiAgICAgICAgICAgICAgTGliZ2RiIGlzIGFuIEludGVycHJldGVyLUJhc2VkIFNlcnZlci4KKyogVG9wIExldmVsOjogICAgICAgICAgICAgICAgWW91IFByb3ZpZGUgdGhlIFRvcCBMZXZlbCBmb3IgdGhlIExpYmdkYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kIEludGVycHJldGVyIC4KKyogSS9POjogICAgICAgICAgICAgICAgICAgICAgSG93IHRoZSBTZXJ2ZXIncyBJL08gQ2FuIGJlIFVzZWQuCisqIEludm9raW5nOjogICAgICAgICAgICAgICAgIEludm9raW5nIHRoZSBJbnRlcnByZXRlciwgRXhlY3V0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRzLiAKKyogRGVmaW5pbmcgQ29tbWFuZHM6OiAgICAgICAgSG93IE5ldyBDb21tYW5kcyBhcmUgQ3JlYXRlZC4KKyogVmFyaWFibGVzOjogICAgICAgICAgICAgICAgSG93IEJ1aWx0aW4gVmFyaWFibGVzIGFyZSBEZWZpbmVkLgorKiBBc3luY2hyb25vdXM6OiAgICAgICAgICAgICBTY2hlZHVsaW5nIEFzeW5jaHJvbm91cyBDb21wdXRhdGlvbnMuCisqIENvbW1hbmRzOjogICAgICAgICAgICAgICAgIERlYnVnZ2VyIENvbW1hbmRzIGZvciBMaWJnZGIgQXBwbGljYXRpb25zCitAZW5kIG1lbnUKKworQGVuZCBpZmluZm8KK0Bub2RlICAgIE92ZXJ2aWV3LCBJbnRlcnByZXRlciwgdG9wLCAgICAgIHRvcAorQGNvbW1lbnQgbm9kZS1uYW1lLCAgICAgbmV4dCwgICAgICAgICAgIHByZXZpb3VzLCB1cAorQGNoYXB0ZXIgT3ZlcnZpZXcKK0BjaW5kZXggb3ZlcnZpZXcKK0BjaW5kZXggZGVmaW5pdGlvbnMKKworQGhlYWRpbmcgRnVuY3Rpb24gYW5kIFB1cnBvc2UKKworTGliZ2RiIGlzIGEgcGFja2FnZSB3aGljaCBwcm92aWRlcyBhbiBBUEkgdG8gdGhlIGZ1bmN0aW9uYWxpdHkgb2YgR0RCLAordGhlIEdOVSBzeW1ib2xpYyBkZWJ1Z2dlci4gIEl0IGlzIHNwZWNpZmljYWxseSBpbnRlbmRlZCB0byBzdXBwb3J0IHRoZQorZGV2ZWxvcG1lbnQgb2YgYSBzeW1ib2xpYyBkZWJ1Z2dlciB3aXRoIGEgZ3JhcGhpYyBpbnRlcmZhY2UuCisKKworQGhlYWRpbmcgVGhpcyBEb2N1bWVudAorCitUaGlzIGRvY3VtZW50IGlzIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbGliZ2RiIEFQSS4gIEl0IGlzIHdyaXR0ZW4gaW4KK3RoZSBmb3JtIG9mIGEgcHJvZ3JhbW1lcidzIG1hbnVhbC4gIFNvIHRoZSBnb2FsIG9mIHRoaXMgZG9jdW1lbnQgaXMgdG8KK2V4cGxhaW4gd2hhdCBmdW5jdGlvbnMgbWFrZSB1cCB0aGUgQVBJLCBhbmQgaG93IHRoZXkgY2FuIGJlIHVzZWQgaW4gYQorcnVubmluZyBhcHBsaWNhdGlvbi4KKworCitAaGVhZGluZyBUZXJtaW5vbG9neQorCitJbiB0aGlzIGRvY3VtZW50LCBAZGZue2xpYmdkYn0gcmVmZXJzIHRvIGEgbGlicmFyeSBjb250YWluaW5nIHRoZQorZnVuY3Rpb25zIGRlZmluZWQgaGVyZWluLCBAZGZue2FwcGxpY2F0aW9ufSByZWZlcnMgdG8gYW55IHByb2dyYW0gYnVpbHQKK3dpdGggdGhhdCBsaWJyYXJ5LgorCisKK0BoZWFkaW5nIERlcGVuZGVuY2llcworCitQcm9ncmFtcyB3aGljaCBhcmUgbGlua2VkIHdpdGggbGliZ2RiIG11c3QgYmUgbGlua2VkIHdpdGggbGliYmZkLAorbGlib3Bjb2RlcywgbGliaWJlcnR5LCBhbmQgbGlibW1hbGxvYy4KKworQGhlYWRpbmcgQWNrbm93bGVkZ21lbnRzCisKK0Vzc2VudGlhbCBjb250cmlidXRpb25zIHRvIHRoaXMgZGVzaWduIHdlcmUgbWFkZSBieSBTdHUgR3Jvc3NtYW4sIEppbQorS2luZ2RvbiwgYW5kIFJpY2ggUGl4bGV5LgorCitAbm9kZSBJbnRlcnByZXRlciwgVG9wIExldmVsLCBPdmVydmlldywgVG9wCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BjaGFwdGVyIExpYmdkYiBpcyBhbiBJbnRlcnByZXRlciBCYXNlZCBTZXJ2ZXIKK0BjaW5kZXggaW50ZXJwcmV0ZXIKK0BjaW5kZXggc2VydmVyCisKK1RvIHVuZGVyc3RhbmQgbGliZ2RiLCBpdCBpcyBuZWNlc3NhcnkgdG8gdW5kZXJzdGFuZCBob3cgdGhlIGxpYnJhcnkgaXMKK3N0cnVjdHVyZWQuICBIaXN0b3JpY2FsbHksIEdEQiBpcyB3cml0dGVuIGFzIGEgc21hbGwgaW50ZXJwcmV0ZXIgZm9yIGEKK3NpbXBsZSBjb21tYW5kIGxhbmd1YWdlLiAgVGhlIGNvbW1hbmRzIG9mIHRoZSBsYW5ndWFnZSBwZXJmb3JtIHVzZWZ1bAorZGVidWdnaW5nIGZ1bmN0aW9ucy4KKworTGliZ2RiIGlzIGJ1aWx0IGZyb20gR0RCIGJ5IHR1cm5pbmcgdGhlIGludGVycHJldGVyIGludG8gYSBkZWJ1Z2dpbmcKK3NlcnZlci4gIFRoZSBzZXJ2ZXIgcmVhZHMgZGVidWdnaW5nIGNvbW1hbmRzIGZyb20gYW55IHNvdXJjZSBhbmQKK2ludGVycHJldHMgdGhlbSwgZGlyZWN0aW5nIHRoZSBvdXRwdXQgYXJiaXRyYXJpbHkuCisKK0luIGFkZGl0aW9uIHRvIGNoYW5naW5nIEdEQiBmcm9tIGEgdHR5LWJhc2VkIHByb2dyYW0gdG8gYSBzZXJ2ZXIsIGEKK251bWJlciBvZiBuZXcgR0RCIGNvbW1hbmRzIGhhdmUgYmVlbiBhZGRlZCB0byBtYWtlIHRoZSBzZXJ2ZXIgbW9yZQordXNlZnVsIGZvciBhIHByb2dyYW0gd2l0aCBhIGdyYXBoaWMgaW50ZXJmYWNlLgorCitGaW5hbGx5LCBsaWJnZGIgaW5jbHVkZXMgcHJvdmlzaW9ucyBmb3IgYXN5bmNocm9ub3VzIHByb2Nlc3Npbmcgd2l0aGluCit0aGUgYXBwbGljYXRpb24uCisKK01vc3Qgb3BlcmF0aW9ucyB0aGF0IGNhbiBiZSBjYXJyaWVkIG91dCB3aXRoIGxpYmdkYiBpbnZvbHZlIHRoZSBHREIKK2NvbW1hbmQgaW50ZXJwcmV0ZXIuICBUaGUgdXN1YWwgbW9kZSBvZiBvcGVyYXRpb24gaXMgdGhhdCB0aGUgb3BlcmF0aW9uCitpcyBleHByZXNzZWQgYXMgYSBzdHJpbmcgb2YgR0RCIGNvbW1hbmRzLCB3aGljaCB0aGUgaW50ZXJwcmV0ZXIgaXMgdGhlbgoraW52b2tlZCB0byBjYXJyeSBvdXQuICBUaGUgb3V0cHV0IGZyb20gY29tbWFuZHMgZXhlY3V0ZWQgaW4gdGhpcyBtYW5uZXIKK2NhbiBiZSByZWRpcmVjdGVkIGluIGEgdmFyaWV0eSBvZiB1c2VmdWwgd2F5cyBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGJ5Cit0aGUgYXBwbGljYXRpb24uCisKK1RoZSBjb21tYW5kIGludGVycHJldGVyIHByb3ZpZGVzIGFuIGV4dGVuc2l2ZSBzeXN0ZW0gb2YgaG9va3Mgc28gYW4KK2FwcGxpY2F0aW9uIGNhbiBtb25pdG9yIGFueSBhc3BlY3Qgb2YgdGhlIGRlYnVnZ2luZyBsaWJyYXJ5J3Mgc3RhdGUuICBBbgorYXBwbGljYXRpb24gY2FuIHNldCBpdHMgb3duIGJyZWFrcG9pbnRzIGFuZCBhdHRhY2ggY29tbWFuZHMgYW5kCitjb25kaXRpb25zIHRvIHRob3NlLiAgSXQgaXMgcG9zc2libGUgdG8gYXR0YWNoIGhvb2tzIHRvIGFueSBkZWJ1Z2dlcgorY29tbWFuZDsgdGhlIGhvb2tzIGFyZSBpbnZva2VkIHdoZW5ldmVyIHRoYXQgY29tbWFuZCBpcyBhYm91dCB0byBiZQoraW52b2tlZC4gIEJ5IG1lYW5zIG9mIHRoZXNlLCB0aGUgZGlzcGxheXMgb2YgYSBncmFwaGljYWwgaW50ZXJmYWNlIGNhbgorYmUga2VwdCBmdWxseSB1cCB0byBkYXRlIGF0IGFsbCB0aW1lcy4KKworV2Ugc2hvdyB5b3UgaG93IHRvIGRlZmluZSBuZXcgcHJpbWl0aXZlcyBpbiB0aGUgY29tbWFuZCBsYW5ndWFnZS4gIEJ5CitkZWZpbmluZyBuZXcgcHJpbWl0aXZlcyBhbmQgdXNpbmcgdGhlbSBpbiBicmVha3BvaW50IHNjcmlwdHMgYW5kIGNvbW1hbmQKK2hvb2tzLCBhbiBhcHBsaWNhdGlvbiBjYW4gc2NoZWR1bGUgdGhlIGV4ZWN1dGlvbiBvZiBhcmJpdHJhcnkgQy1jb2RlIGF0CithbG1vc3QgYW55IHBvaW50IG9mIGludGVyZXN0IGluIHRoZSBvcGVyYXRpb24gb2YgbGliZ2RiLgorCitXZSBzaG93IHlvdSBob3cgdG8gZGVmaW5lIG5ldyBHREIgY29udmVuaWVuY2UgdmFyaWFibGVzIGZvciB3aGljaCB5b3VyCitjb2RlIGNvbXB1dGVzIGEgdmFsdWUgb24gZGVtYW5kLiAgUmVmZXJyaW5nIHRvIHN1Y2ggdmFyaWFibGVzIGluIGEKK2JyZWFrcG9pbnQgY29uZGl0aW9uIGlzIGEgY29udmVuaWVudCB3YXkgdG8gY29uZGl0aW9uYWxpemUgYnJlYWtwb2ludHMKK2luIG5vdmVsIHdheXMuCisKK1RvIHN1bW1hcml6ZTogaW4gbGliZ2RiLCB0aGUgZ2RiIGNvbW1hbmQgbGFuZ3VhZ2UgaXMgdHVybmVkIGludG8gYQorZGVidWdnaW5nIHNlcnZlci4gIFRoZSBzZXJ2ZXIgdGFrZXMgY29tbWFuZHMgYXMgaW5wdXQsIGFuZCB0aGUgc2VydmVyJ3MKK291dHB1dCBpcyByZWRpcmVjdGFibGUuICBBbiBhcHBsaWNhdGlvbiB1c2VzIGxpYmdkYiBieSBmb3JtYXR0aW5nCitkZWJ1Z2dpbmcgY29tbWFuZHMgYW5kIGludm9raW5nIHRoZSBpbnRlcnByZXRlci4gIFRoZSBhcHBsaWNhdGlvbiBtaWdodAorbWFpbnRhaW4gYnJlYWtwb2ludHMsIHdhdGNocG9pbnRzIGFuZCBtYW55IGtpbmRzIG9mIGhvb2tzLiAgQW4gYXBwbGljYXRpb24KK2NhbiBkZWZpbmUgbmV3IHByaW1pdGl2ZXMgZm9yIHRoZSBpbnRlcnByZXRlci4KKworQG5vZGUgVG9wIExldmVsLCBJL08sIEludGVycHJldGVyLCBUb3AKK0BjaGFwdGVyIFlvdSBQcm92aWRlIHRoZSBUb3AgTGV2ZWwgZm9yIHRoZSBMaWJnZGIgQ29tbWFuZCBJbnRlcnByZXRlcgorQGNpbmRleCB7dG9wIGxldmVsfQorCitXaGVuIHlvdSB1c2UgbGliZ2RiLCB5b3VyIGNvZGUgaXMgcHJvdmlkaW5nIGEgQGRmbnt0b3AgbGV2ZWx9IGZvciB0aGUKK2NvbW1hbmQgbGFuZ3VhZ2UgaW50ZXJwcmV0ZXIuICBUaGUgdG9wIGxldmVsIGlzIHNpZ25pZmljYW50IGJlY2F1c2UgaXQKK3Byb3ZpZGVzIGNvbW1hbmRzIGZvciB0aGUgdGhlIGludGVycHJldGVyIHRvIGV4ZWN1dGUuICBJbiBhZGRpdGlvbiwgdGhlCit0b3AgbGV2ZWwgaXMgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIHNvbWUga2luZHMgb2YgZXJyb3JzLCBhbmQKK3BlcmZvcm1pbmcgY2VydGFpbiBjbGVhbnVwIG9wZXJhdGlvbnMgb24gYmVoYWxmIG9mIHRoZSBpbnRlcnByZXRlci4KKworQGhlYWRpbmcgSW5pdGlhbGl6YXRpb24KKworQmVmb3JlIGNhbGxpbmcgYW55IG90aGVyIGxpYmdkYiBmdW5jdGlvbnMsIGNhbGwgdGhpczoKKworQGRlZnR5cGVmdW4gdm9pZCBnZGJfaW5pdCAodm9pZCkKK1BlcmZvcm0gb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gZm9yIGxpYmdkYi4KK0BlbmQgZGVmdHlwZWZ1bgorCitBbiBhcHBsaWNhdGlvbiBtYXkgd2lzaCB0byBldmFsdWF0ZSBzcGVjaWZpYyBnZGIgY29tbWFuZHMgYXMgcGFydCBvZiBpdHMKK293biBpbml0aWFsaXphdGlvbi4gIFRoZSBkZXRhaWxzIG9mIGhvdyB0aGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQgYXJlCitleHBsYWluZWQgYmVsb3cuCisKK0BoZWFkaW5nIFRoZSBUb3AtTGV2ZWwgTG9vcAorCitUaGVyZSBpcyBhIHN0cm9uZyBwcmVzdW1wdGlvbiBpbiBsaWJnZGIgdGhhdCB0aGUgYXBwbGljYXRpb24gaGFzCit0aGUgZm9ybSBvZiBhIGxvb3AuICBIZXJlIGlzIHdoYXQgc3VjaCBhIGxvb3AgbWlnaHQgbG9vayBsaWtlOgorCitAZXhhbXBsZQord2hpbGUgKGdkYl9zdGlsbF9nb2luZyAoKSkKKyAgQHsKKyAgICBpZiAoIUdEQl9UT1BfTEVWRUwgKCkpCisgICAgICBAeworICAgICAgICBjaGFyICogY29tbWFuZDsKKyAgICAgICAgZ2RiX3N0YXJ0X3RvcF9sb29wICgpOworICAgICAgICBjb21tYW5kID0gcHJvY2Vzc19ldmVudHMgKCk7CisgICAgICAgIGdkYl9leGVjdXRlX2NvbW1hbmQgKGNvbW1hbmQpOworICAgICAgICBnZGJfZmluaXNoX3RvcF9sb29wICgpOworICAgICAgQH0KKyAgICBAfQorQGVuZCBleGFtcGxlCisKK1RoZSBmdW5jdGlvbiBAY29kZXtnZGJfc3RpbGxfZ29pbmd9IHJldHVybnMgMSB1bnRpbCB0aGUgZ2RiIGNvbW1hbmQKK2BxdWl0JyBpcyBydW4uCisKK1RoZSBtYWNybyBAY29kZXtHREJfVE9QX0xFVkVMfSBpbnZva2VzIHNldGptcCB0byBzZXQgdGhlIHRvcCBsZXZlbCBlcnJvcgoraGFuZGxlci4gIFdoZW4gYSBjb21tYW5kIHJlc3VsdHMgaW4gYW4gZXJyb3IsIHRoZSBpbnRlcnByZXRlciBleGl0cyB3aXRoCithIGxvbmdqbXAuIFRoZXJlIGlzIG5vdGhpbmcgc3BlY2lhbCBsaWJnZGIgcmVxdWlyZXMgb2YgdGhlIHRvcCBsZXZlbAorZXJyb3IgaGFuZGxlciBvdGhlciB0aGFuIGl0IGJlIHByZXNlbnQgYW5kIHRoYXQgaXQgcmVzdGFydCB0aGUgdG9wIGxldmVsCitsb29wLiAgRXJyb3JzIGFyZSBleHBsYWluZWQgaW4gZGV0YWlsIGluIGEgbGF0ZXIgY2hhcHRlci4KKworRWFjaCB0aW1lIHRocm91Z2ggdGhlIHRvcCBsZXZlbCBsb29wIHR3byBpbXBvcnRhbnQgdGhpbmdzIGhhcHBlbjogYQorZGVidWdnZXIgY29tbWFuZCBpcyBjb25zdHJ1Y3RlZCBvbiB0aGUgYmFzaXMgb2YgdXNlciBpbnB1dCwgYW5kIHRoZQoraW50ZXJwcmV0ZXIgaXMgaW52b2tlZCB0byBleGVjdXRlIHRoYXQgY29tbWFuZC4gIEluIHRoZSBzYW1wbGUgY29kZSwgdGhlCitjYWxsIHRvIHRoZSBpbWFnaW5hcnkgZnVuY3Rpb24gQGNvZGV7cHJvY2Vzc19ldmVudHN9IHJlcHJlc2VudHMgdGhlCitwb2ludCBhdCB3aGljaCBhIGdyYXBoaWNhbCBpbnRlcmZhY2Ugc2hvdWxkIHJlYWQgaW5wdXQgZXZlbnRzIHVudGlsCityZWFkeSB0byBleGVjdXRlIGEgZGVidWdnZXIgY29tbWFuZC4gIFRoZSBjYWxsIHRvCitAY29kZXtnZGJfZXhlY3V0ZV9jb21tYW5kfSBpbnZva2VzIHRoZSBjb21tYW5kIGludGVycHJldGVyICh3aGF0IGhhcHBlbnMKK3RvIHRoZSBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZCB3aWxsIGJlIGV4cGxhaW5lZCBsYXRlcikuCisKK0xpYmdkYiBtYW5hZ2VzIHNvbWUgcmVzb3VyY2VzIHVzaW5nIHRoZSB0b3AtbGV2ZWwgbG9vcC4gIFRoZSBwcmltYXJ5CityZWFzb24gZm9yIHRoaXMgaXMgZXJyb3ItaGFuZGxpbmc6IGV2ZW4gaWYgYSBjb21tYW5kIHRlcm1pbmF0ZXMgd2l0aCBhbgorZXJyb3IsIGl0IG1heSBhbHJlYWR5IGhhdmUgYWxsb2NhdGVkIHJlc291cmNlcyB3aGljaCBuZWVkIHRvIGJlIGZyZWVkLgorVGhlIGZyZWVpbmcgb2Ygc3VjaCByZXNvdXJjZXMgdGFrZXMgcGxhY2UgYXQgdGhlIHRvcC1sZXZlbCwgcmVnYXJkbGVzcworb2YgaG93IHRoZSB0aGUgY29tbWFuZCBleGl0cy4gIFRoZSBjYWxscyB0byBAY29kZXtnZGJfc3RhcnRfdG9wX2xvb3B9CithbmQgQGNvZGV7Z2RiX2ZpbmlzaF90b3BfbG9vcH0gbGV0IGxpYmdkYiBrbm93IHdoZW4gaXQgaXMgc2FmZSB0bworcGVyZm9ybSBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGVzZSByZXNvdXJjZXMuCisKK0BoZWFkaW5nIEJyZWFrcG9pbnQgQ29tbWFuZHMKKworQnJlYWtwb2ludCBjb21tYW5kcyBhcmUgc2NyaXB0cyBvZiBHREIgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggCitwYXJ0aWN1bGFyIGJyZWFrcG9pbnRzLiAgV2hlbiBhIGJyZWFrcG9pbnQgaXMgcmVhY2hlZCwgaXRzIGFzc29jaWF0ZWQKK2NvbW1hbmRzIGFyZSBleGVjdXRlZC4KKworQnJlYWtwb2ludCBjb21tYW5kcyBhcmUgaW52b2tlZCBieSB0aGUgbGliZ2RiIGZ1bmN0aW9uCitAY29kZXtnZGJfZmluaXNoX3RvcF9sb29wfS4gIAorCitOb3RpY2UgdGhhdCBpZiBjb250cm9sIHJldHVybnMgdG8gdGhlIHRvcC1sZXZlbCBlcnJvciBoYW5kbGVyLCB0aGUKK2V4ZWN1dGlvbiBvZiBicmVha3BvaW50IGNvbW1hbmRzIGlzIGJ5cGFzc2VkLiAgVGhpcyBjYW4gaGFwcGVuIGFzIGEKK3Jlc3VsdCBvZiBlcnJvcnMgZHVyaW5nIGVpdGhlciBAY29kZXtnZGJfZXhlY3V0ZV9jb21tYW5kfSBvcgorQGNvZGV7Z2RiX2ZpbmlzaF90b3BfbG9vcH0uCisKK0BoZWFkaW5nIEFwcGxpY2F0aW9uIEluaXRpYWxpemF0aW9uCisKK1NvbWV0aW1lcyBpdCBpcyBpbmNvbnZlbmllbnQgdG8gZXhlY3V0ZSBjb21tYW5kcyB2aWEgYSBjb21tYW5kIGxvb3AgZm9yCitleGFtcGxlLCB0aGUgY29tbWFuZHMgYW4gYXBwbGljYXRpb24gdXNlcyB0byBpbml0aWFsaXplIGl0c2VsZi4gIEFuCithbHRlcm5hdGl2ZSB0byBAY29kZXtleGVjdXRlX2NvbW1hbmR9IGlzIEBjb2Rle2V4ZWN1dGVfY2F0Y2hpbmdfZXJyb3JzfS4KK1doZW4gQGNvZGV7ZXhlY3V0ZV9jYXRjaGluZ19lcnJvcnN9IGlzIHVzZWQsIG5vIHRvcCBsZXZlbCBlcnJvciBoYW5kbGVyCituZWVkIGJlIGluIGVmZmVjdCwgYW5kIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbAorQGNvZGV7Z2RiX3N0YXJ0X3RvcF9sb29wfSBvciBAY29kZXtnZGJfZmluaXNoX3RvcF9sb29wfS4KKworCitAaGVhZGluZyBDbGVhbnVwCisKK1RoZSBkZWJ1Z2dlciBjb21tYW5kIGBgcXVpdCcnIHBlcmZvcm1zIGFsbCBuZWNlc3NhcnkgY2xlYW51cCBmb3IgbGliZ2RiLgorQWZ0ZXIgaXQgaGFzIGRvbmUgc28sIGl0IGNoYW5nZXMgdGhlIHJldHVybiB2YWx1ZSBvZgorQGNvZGV7Z2RiX3N0aWxsX2dvaW5nfSB0byAwIGFuZCByZXR1cm5zIHRvIHRoZSB0b3AgbGV2ZWwgZXJyb3IgaGFuZGxlci4KKworCitAbm9kZSBJL08sIEludm9raW5nLCBUb3AgTGV2ZWwsIFRvcAorQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCitAY2hhcHRlciBIb3cgdGhlIFNlcnZlcidzIEkvTyBDYW4gYmUgVXNlZAorQGNpbmRleCBJL08KKworSW4gdGhlIGxhc3QgY2hhcHRlciBpdCB3YXMgcG9pbnRlZCBvdXQgdGhhdCBhIGxpYmdkYiBhcHBsaWNhdGlvbiBpcworcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBjb21tYW5kcyBmb3IgdGhlIGludGVycHJldGVyIHRvIGV4ZWN1dGUuCitIb3dldmVyIHNvbWUgY29tbWFuZHMgcmVxdWlyZSBmdXJ0aGVyIGlucHV0IChmb3IgZXhhbXBsZSwgdGhlIGBgcXVpdCcnCitjb21tYW5kIG1pZ2h0IGFzayBmb3IgY29uZmlybWF0aW9uKS4gIEFsbW9zdCBhbGwgY29tbWFuZHMgcHJvZHVjZSBvdXRwdXQKK29mIHNvbWUga2luZC4gIFRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiBpcyB0byBleHBsYWluIGhvdyBsaWJnZGIKK3BlcmZvcm1zIGl0cyBJL08sIGFuZCBob3cgYW4gYXBwbGljYXRpb24gY2FuIHRha2UgYWR2YW50YWdlIG9mCit0aGlzLgorCisKK0BoZWFkaW5nIEkvTyBWZWN0b3JzCisKK0xpYmdkYiBoYXMgbm8gZml4ZWQgc3RyYXRlZ3kgZm9yIEkvTy4gIEluc3RlYWQsIGFsbCBvcGVyYXRpb25zIGFyZQorcGVyZm9ybWVkIGJ5IGZ1bmN0aW9ucyBjYWxsZWQgdmlhIHN0cnVjdHVyZXMgb2YgZnVuY3Rpb24gcG9pbnRlcnMuCitBcHBsaWNhdGlvbnMgc3VwcGx5IHRoZXNlcyBzdHJ1Y3R1cmVzIGFuZCBjYW4gY2hhbmdlIHRoZW0gYXQgYW55Cit0aW1lLgorCitAZGVmdHAgVHlwZSB7c3RydWN0IGdkYl9pbnB1dF92ZWN0b3J9CitAZGVmdHB4IFR5cGUge3N0cnVjdCBnZGJfb3V0cHV0X3ZlY3Rvcn0KK1RoZXNlIHN0cnVjdHVyZXMgY29udGFpbiBhIHNldCBvZiBmdW5jdGlvbiBwb2ludGVycy4gIEVhY2ggZnVuY3Rpb24KK2RldGVybWluZXMgaG93IGEgcGFydGljdWxhciB0eXBlIG9mIGkvbyBpcyBwZXJmb3JtZWQuICBUaGUgZGV0YWlscyBvZgordGhlc2Ugc3RydWN1dHJlcyBhcmUgZXhwbGFpbmVkIGJlbG93LgorCitUaGUgYXBwbGljYXRpb24gYWxsb2NhdGVzIHRoZXNlIHN0cnVjdHVyZXMsIGluaXRpYWxpemVzIHRoZW0gdG8gYWxsIGJpdHMKK3plcm8sIGZpbGxzIGluIHRoZSBmdW5jdGlvbiBwb2ludGVycywgYW5kIHRoZW4gcmVnaXN0ZXJzIG5hbWVzIGZvciB0aGVtCit0aGVtIHdpdGggbGliZ2RiLgorQGVuZCBkZWZ0cAorCitAZGVmdHlwZWZ1biB2b2lkIGdkYl9uYW1lX2lucHV0X3ZlY3RvciAoQHZhcntuYW1lfSwgQHZhcnt2ZWN9KQorQGRlZnR5cGVmdW54IHZvaWQgZ2RiX3JlbW92ZV9pbnB1dF92ZWN0b3IgKEB2YXJ7bmFtZX0sIEB2YXJ7dmVjfSkKK0BkZWZ0eXBlZnVueCB2b2lkIGdkYl9uYW1lX291dHB1dF92ZWN0b3IgKEB2YXJ7bmFtZX0sIEB2YXJ7dmVjfSkKK0BkZWZ0eXBlZnVueCB2b2lkIGdkYl9yZW1vdmVfaW5wdXRfdmVjdG9yIChAdmFye25hbWV9LCBAdmFye3ZlY30pCitAZXhhbXBsZQorICBjaGFyICogQHZhcntuYW1lfTsKKyAgc3RydWN0IGdkYl9vdXRwdXRfdmVjdG9yICogQHZhcnt2ZWN9OworQGVuZCBleGFtcGxlCitUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gZ2l2ZSBhbmQgcmVtb3ZlIG5hbWVzIHRvIGkvbyB2ZWN0b3JzLiAgTm90ZQordGhhdCBpZiBhIG5hbWUgaXMgdXNlZCB0d2ljZSwgdGhlIG1vc3QgcmVjZW50IGRlZmluaXRpb24gYXBwbGllcy4KK0BlbmQgZGVmdHlwZWZ1bgorCisKKworQHN1YmhlYWRpbmcgT3V0cHV0CisKK0FuIG91dHB1dCB2ZWN0b3IgaXMgYSBzdHJ1Y3R1cmUgd2l0aCBhdCBsZWFzdCB0aGVzZSBmaWVsZHM6IAorCitAZXhhbXBsZQorc3RydWN0IGdkYl9vdXRwdXRfdmVjdG9yCitAeworICAvKiBvdXRwdXQgKi8KKyAgdm9pZCAoKnB1dF9zdHJpbmcpIChzdHJ1Y3QgZ2RiX291dHB1dF92ZWN0b3IgKiwgY2hhciAqIHN0cik7CitAfQorQGVuZCBleGFtcGxlCisKK1VzZSB0aGUgZnVuY3Rpb24gQGNvZGV7bWVtc2V0fSBvciBzb21ldGhpbmcgZXF1aXZhbGVudCB0byBpbml0aWFsaXplIGFuCitvdXRwdXQgdmVjdG9yIHRvIGFsbCBiaXRzIHplcm8uICBUaGVuIGZpbGwgaW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aAoreW91ciBmdW5jdGlvbi4KKworQSBkZWJ1Z2dlciBjb21tYW5kIGNhbiBwcm9kdWNlIHRocmVlIGtpbmRzIG9mIG91dHB1dDogZXJyb3IgbWVzc2FnZXMKKyhzdWNoIGFzIHdoZW4gdHJ5aW5nIHRvIGRlbGV0ZSBhIG5vbi1leGlzdGVudCBicmVha3BvaW50KSwgaW5mb3JtYXRpb25hbAorbWVzc2FnZXMgKHN1Y2ggYXMgdGhlIG5vdGlmaWNhdGlvbiBwcmludGVkIHdoZW4gYSBicmVha3BvaW50IGlzIGhpdCksCithbmQgdGhlIG91dHB1dCBzcGVjaWZpY2FsbHkgcmVxdWVzdGVkIGJ5IGEgY29tbWFuZCAoZm9yIGV4YW1wbGUsIHRoZQordmFsdWUgcHJpbnRlZCBieSB0aGUgYGBwcmludCcnIGNvbW1hbmQpLiAgQXQgYW55IGdpdmVuIHRpbWUsIHRoZW4sCitsaWJnZGIgaGFzIHRocmVlIG91dHB1dCB2ZWN0b3JzLiAgVGhlc2UgYXJlIGNhbGxlZCB0aGUgQGRmbntlcnJvcn0sCitAZGZue2luZm99LCBAZGZue3ZhbHVlfSB2ZWN0b3IgcmVzcGVjdGl2ZWx5LiAgCisKK0BzdWJoZWFkaW5nIElucHV0CisKK0BleGFtcGxlCitzdHJ1Y3QgZ2RiX2lucHV0X3ZlY3RvcgorQHsKKyAgaW50ICgqcXVlcnkpIChzdHJ1Y3QgZ2RiX2lucHV0X3ZlY3RvciAqLAorICAgICAgICAgICAgICAgIGNoYXIgKiBwcm9tcHQsCisgICAgICAgICAgICAgICAgaW50IHF1aXRfYWxsb3dlZCk7CisgIGludCAqICgqc2VsZWN0aW9uKSAoc3RydWN0IGdkYl9pbnB1dF92ZWN0b3IgKiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyICogcHJvbXB0LAorICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiogY2hvaWNlcyk7CisgIGNoYXIgKiAoKnJlYWRfc3RyaW5nKSAoc3RydWN0IGdkYl9pbnB1dF92ZWN0b3IgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogcHJvbXB0KTsKKyAgY2hhciAqKiAoKnJlYWRfc3RyaW5ncykgKHN0cnVjdCBnZGJfaW5wdXRfdmVjdG9yICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogcHJvbXB0KTsKK0B9CitAZW5kIGV4YW1wbGUKKworVXNlIHRoZSBmdW5jdGlvbiBAY29kZXttZW1zZXR9IG9yIHNvbWV0aGluZyBlcXVpdmFsZW50IHRvIGluaXRpYWxpemUgYW4KK2lucHV0IHZlY3RvciB0byBhbGwgYml0cyB6ZXJvLiAgVGhlbiBmaWxsIGluIHRoZSBmdW5jdGlvbiBwb2ludGVycyB3aXRoCit5b3VyIGZ1bmN0aW9ucy4KKworVGhlcmUgYXJlIGZvdXIga2luZHMgb2YgaW5wdXQgcmVxdWVzdHMgZXhwbGljaXRseSBtYWRlIGJ5IGxpYmdkYi4KKworQSBAZGZue3F1ZXJ5fSBpcyBhIHllcyBvciBubyBxdWVzdGlvbi4gIFRoZSB1c2VyIGNhbiByZXNwb25kIHRvIGEgcXVlcnkKK3dpdGggYW4gYWZmaXJtYXRpdmUgb3IgbmVnYXRpdmUgYW5zd2VyLCBvciBieSB0ZWxsaW5nIGdkYiB0byBhYm9ydCB0aGUKK2NvbW1hbmQgKGluIHNvbWUgY2FzZXMgYW4gYWJvcnQgaXMgbm90IHBlcm1pdHRlZCkuICBRdWVyeSBzaG91bGQgcmV0dXJuCisneScgb3IgJ24nIG9yIDAgdG8gYWJvcnQuCisKK0EgQGRmbntzZWxlY3Rpb259IGlzIGEgbGlzdCBvZiBvcHRpb25zIGZyb20gd2hpY2ggdGhlIHVzZXIgc2VsZWN0cyBhIHN1YnNldC4KK1NlbGVjdGlvbnMgc2hvdWxkIHJldHVybiBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBpbnRlZ2Vycywgd2hpY2ggYXJlCitpbmRleGVzIGludG8gdGhlIGFycmF5IG9mIGNob2ljZXMuICBJdCBjYW4gcmV0dXJuIE5VTEwgaW5zdGVhZCB0byBhYm9ydAordGhlIGNvbW1hbmQuICBUaGUgYXJyYXkgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHBhc3NlZCB0bworQGNvZGV7ZnJlZX0gYnkgbGliZ2RiLgorCitBIEBkZm57cmVhZF9zdHJpbmd9IGFza3MgdGhlIHVzZXIgdG8gc3VwcGx5IGFuIGFyYml0cmFyeSBzdHJpbmcuICBJdCBtYXkKK3JldHVybiBOVUxMIHRvIGFib3J0IHRoZSBjb21tYW5kLiAgVGhlIHN0cmluZyByZXR1cm5lZCBieSBAY29kZXtyZWFkX3N0cmluZ30KK3Nob3VsZCBiZSBhbGxvY2F0ZWQgYnkgQGNvZGV7bWFsbG9jfTsgaXQgd2lsbCBiZSBmcmVlZCBieSBsaWJnZGIuCisKK0EgQGRmbntyZWFkX3N0cmluZ3N9IGFza3MgdGhlIHVzZXIgdG8gc3VwcGx5IG11bHRpcGxlIGxpbmVzIG9mIGlucHV0CisoZm9yIGV4YW1wbGUsIHRoZSBib2R5IG9mIGEgY29tbWFuZCBjcmVhdGVkIHVzaW5nIGBkZWZpbmUnKS4gIEl0LCB0b28sCittYXkgcmV0dXJuIE5VTEwgdG8gYWJvcnQuICBUaGUgYXJyYXkgYW5kIHRoZSBzdHJpbmdzIHJldHVybmVkIGJ5IHRoaXMKK2Z1bmN0aW9uIHdpbGwgYmUgZnJlZWQgYnkgbGliZ2RiLgorCitAaGVhZGluZyBJL08gUmVkaXJlY3Rpb24gZnJvbSB0aGUgQXBwbGljYXRpb24gVG9wLUxldmVsCisKK0BkZWZ0eXBlZnVuIHN0cnVjdCBnZGJfaW9fdmVjcyBnZGJfc2V0X2lvIChzdHJ1Y3QgZ2RiX2lvX3ZlY3MgKikKK0BleGFtcGxlCisKK3N0cnVjdCBnZGJfaW9fdmVjcworQHsKKyAgc3RydWN0IGdkYl9pbnB1dF92ZWN0b3IgKiBpbnB1dDsKKyAgc3RydWN0IGdkYl9vdXRwdXRfdmVjdG9yICogZXJyb3I7CisgIHN0cnVjdCBnZGJfb3V0cHV0X3ZlY3RvciAqIGluZm87CisgIHN0cnVjdCBnZGJfb3V0cHV0X3ZlY3RvciAqIHZhbHVlOworQH0KK0BlbmQgZXhhbXBsZQorCitUaGlzIGVzdGFibGlzaGVzIGEgbmV3IHNldCBvZiBpL28gdmVjdG9ycywgYW5kIHJldHVybnMgdGhlIG9sZCBzZXR0aW5nLgorQW55IG9mIHRoZSBwb2ludGVycyBpbiB0aGlzIHN0cnVjdHVyZSBtYXkgYmUgTlVMTCwgaW5kaWNhdGluZyB0aGF0IHRoZQorY3VycmVudCB2YWx1ZSBzaG91bGQgYmUgdXNlZC4KKworVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIHNldHRpbmcgdXAgaS9vIHZlY3RvcnMgYmVmb3JlIGFueSBsaWJnZGIKK2NvbW1hbmRzIGhhdmUgYmVlbiBpbnZva2VkIChoZW5jZSBiZWZvcmUgYW55IGlucHV0IG9yIG91dHB1dCBoYXMgdGFrZW4KK3BsYWNlKS4KK0BlbmQgZGVmdHlwZWZ1bgorCitJdCBpcyBleHBsYWluZWQgaW4gYSBsYXRlciBjaGFwdGVyIGhvdyB0byByZWRpcmVjdCBvdXRwdXQgdGVtcG9yYXJpbHkuCisoQHhyZWZ7SW52b2tpbmd9LikKKworQGhlYWRpbmcgSS9PIFJlZGlyZWN0aW9uIGluIERlYnVnZ2VyIENvbW1hbmRzCisKK0EgbGliZ2RiIGFwcGxpY2F0aW9uIGNyZWF0ZXMgaW5wdXQgYW5kIG91dHB1dCB2ZWN0b3JzIGFuZCBhc3NpZ25zIHRoZW0gbmFtZXMuCitXaGljaCBpbnB1dCBhbmQgb3V0cHV0IHZlY3RvcnMgYXJlIHVzZWQgYnkgbGliZ2RiIGlzIGVzdGFibGlzaGVkIGJ5CitleGVjdXRpbmcgdGhlc2UgZGVidWdnZXIgY29tbWFuZHM6IAorCitAZGVmdW4ge3NldCBpbnB1dC12ZWN0b3J9IG5hbWUKK0BkZWZ1bngge3NldCBlcnJvci1vdXRwdXQtdmVjdG9yfSBuYW1lCitAZGVmdW54IHtzZXQgaW5mby1vdXRwdXQtdmVjdG9yfSBuYW1lCitAZGVmdW54IHtzZXQgdmFsdWUtb3V0cHV0LXZlY3Rvcn0gbmFtZQorQ2hvb3NlIGFuIEkvTyB2ZWN0b3IgYnkgbmFtZS4KK0BlbmQgZGVmdW4KKworCitBIGZldyBkZWJ1Z2dlciBjb21tYW5kcyBhcmUgZm9yIHVzZSBvbmx5IHdpdGhpbiBjb21tYW5kcyBkZWZpbmVkIHVzaW5nCit0aGUgZGVidWdnZXIgY29tbWFuZCBgZGVmaW5lJyAodGhleSBoYXZlIG5vIGVmZmVjdCBhdCBvdGhlciB0aW1lcykuCitUaGVzZSBjb21tYW5kcyBleGlzdCBzbyB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiBtYWludGFpbiBob29rcyB3aGljaAorcmVkaXJlY3Qgb3V0cHV0IHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBnbG9iYWwgSS9PIHZlY3RvcnMuCisKK0BkZWZ1biB3aXRoLWlucHV0LXZlY3RvciBuYW1lCitAZGVmdW54IHdpdGgtZXJyb3Itb3V0cHV0LXZlY3RvciBuYW1lCitAZGVmdW54IHdpdGgtaW5mby1vdXRwdXQtdmVjdG9yIG5hbWUKK0BkZWZ1bnggd2l0aC12YWx1ZS1vdXRwdXQtdmVjdG9yIG5hbWUKK1NldCBhbiBJL08gdmVjdG9yLCBidXQgb25seSB0ZW1wb3JhcmlseS4gIFRoZSBzZXR0aW5nIGhhcyBlZmZlY3Qgb25seQord2l0aGluIHRoZSBjb21tYW5kIGRlZmluaXRpb24gaW4gd2hpY2ggaXQgb2NjdXJzLgorQGVuZCBkZWZ1bgorCisKK0BoZWFkaW5nIEluaXRpYWwgQ29uZGl0aW9ucworCitXaGVuIGxpYmdkYiBpcyBpbml0aWFsaXplZCwgYSBzZXQgb2YgZGVmYXVsdCBJL08gdmVjdG9ycyBpcyBwdXQgaW4KK3BsYWNlLiAgVGhlIGRlZmF1bHQgdmVjdG9ycyBhcmUgY2FsbGVkIEBjb2Rle2RlZmF1bHQtaW5wdXQtdmVjdG9yfSwKK0Bjb2Rle2RlZmF1bHQtb3V0cHV0LXZlY3Rvcn0sICZjLiAgCisKK1RoZSBkZWZhdWx0IHF1ZXJ5IGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIGB5Jy4gIE90aGVyIGlucHV0IGZ1bmN0aW9ucworYWx3YXlzIGFib3J0LiAgVGhlIGRlZmF1bHQgb3V0cHV0IGZ1bmN0aW9ucyBkaXNjYXJkIG91dHB1dCBzaWxlbnRseS4KKworCitAbm9kZSBJbnZva2luZywgRGVmaW5pbmcgQ29tbWFuZHMsIEkvTywgVG9wCitAY2hhcHRlciBJbnZva2luZyB0aGUgSW50ZXJwcmV0ZXIsIEV4ZWN1dGluZyBDb21tYW5kcworQGNpbmRleCB7ZXhlY3V0aW5nIGNvbW1hbmRzfQorQGNpbmRleCB7aW52b2tpbmcgdGhlIGludGVycHJldGVyfQorCitUaGlzIHNlY3Rpb24gaW50cm9kdWNlcyB0aGUgbGliZ2RiIGZ1bmN0aW9ucyB3aGljaCBpbnZva2UgdGhlIGNvbW1hbmQKK2ludGVycHJldGVyLiAKKworQGRlZnR5cGVmdW4gdm9pZCBnZGJfZXhlY3V0ZV9jb21tYW5kIChAdmFye2NvbW1hbmR9KQorQGV4YW1wbGUKK2NoYXIgKiBAdmFye2NvbW1hbmR9OworQGVuZCBleGFtcGxlCitJbnRlcnByZXQgdGhlIGFyZ3VtZW50IGRlYnVnZ2VyIGNvbW1hbmQuICBBbiBlcnJvciBoYW5kbGVyIG11c3QgYmUgc2V0Cit3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAoQHhyZWZ7VG9wIExldmVsfS4pCitAZW5kIGRlZnR5cGVmdW4KKworSXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhlIGN1cnJlbnQgSS9PIHZlY3RvcnMgZm9yIHRoZSBkdXJhdGlvbiBvZiBhCitzaW5nbGUgY29tbWFuZDoKKworQGRlZnR5cGVmdW4gdm9pZCBnZGJfZXhlY3V0ZV93aXRoX2lvIChAdmFye2NvbW1hbmR9LCBAdmFye3ZlY3N9KQorQGV4YW1wbGUgCitjaGFyICogQHZhcntjb21tYW5kfTsKK3N0cnVjdCBnZGJfaW9fdmVjcyAqIEB2YXJ7dmVjc307CisKK3N0cnVjdCBnZGJfaW9fdmVjcworQHsKKyAgc3RydWN0IGdkYl9pbnB1dF92ZWN0b3IgKiBpbnB1dDsKKyAgc3RydWN0IGdkYl9vdXRwdXRfdmVjdG9yICogZXJyb3I7CisgIHN0cnVjdCBnZGJfb3V0cHV0X3ZlY3RvciAqIGluZm87CisgIHN0cnVjdCBnZGJfb3V0cHV0X3ZlY3RvciAqIHZhbHVlOworQH0KK0BlbmQgZXhhbXBsZQorCitFeGVjdXRlIEB2YXJ7Y29tbWFuZH0sIHRlbXBvcmFyaWx5IHVzaW5nIHRoZSBpL28gdmVjdG9ycyBpbiBAdmFye3ZlY3N9LgorCitBbnkgb2YgdGhlIHZlY3RvcnMgbWF5IGJlIE5VTEwsIGluZGljYXRpbmcgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBzaG91bGQKK2JlIHVzZWQuICBBbiBlcnJvciBoYW5kbGVyIG11c3QgYmUgaW4gcGxhY2Ugd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQuCitAZW5kIGRlZnR5cGVmdW4KKworQGRlZnR5cGVmdW4ge3N0cnVjdCBnZGJfc3RyX291dHB1dH0gZ2RiX2V4ZWN1dGVfZm9yX3N0cmluZ3MgKEB2YXJ7Y21kfSkKK0BleGFtcGxlCitjaGFyICogY21kOworQGVuZCBleGFtcGxlCitAZGVmdHlwZWZ1bngge3N0cnVjdCBnZGJfc3RyX291dHB1dH0gZ2RiX2V4ZWN1dGVfZm9yX3N0cmluZ3MyIChAdmFye2NtZH0sIEB2YXJ7aW5wdXR9KQorQGV4YW1wbGUKK2NoYXIgKiBjbWQ7CitzdHJ1Y3QgZ2RiX2lucHV0X3ZlY3RvciAqIGlucHV0OworQGVuZCBleGFtcGxlCitAcGFnZQorQGV4YW1wbGUKK3N0cnVjdCBnZGJfc3RyX291dHB1dAorQHsKKyAgY2hhciAqIGVycm9yOworICBjaGFyICogaW5mbzsKKyAgY2hhciAqIHZhbHVlOworQH07CitAZW5kIGV4YW1wbGUKKworRXhlY3V0ZSBAdmFye2NtZH0sIGNvbGxlY3RpbmcgaXRzIG91dHB1dCBhcyBzdHJpbmdzLiAgSWYgbm8gZXJyb3IKK29jY3VycywgYWxsIHRocmVlIHN0cmluZ3Mgd2lsbCBiZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUsIHRoZQorZW1wdHktc3RyaW5nIHJhdGhlciB0aGFuIE5VTEwgc3RhbmRpbmcgZm9yIG5vIG91dHB1dCBvZiBhIHBhcnRpY3VsYXIKK2tpbmQuIAorCitJZiB0aGUgY29tbWFuZCBhYm9ydHMgd2l0aCBhbiBlcnJvciwgdGhlbiB0aGUgQGNvZGV7dmFsdWV9IGZpZWxkIHdpbGwgYmUKK05VTEwsIHRob3VnaCB0aGUgb3RoZXIgdHdvIHN0cmluZ3Mgd2lsbCBiZSBwcmVzZW50LgorCitJbiBhbGwgY2FzZXMsIHRoZSBzdHJpbmdzIHJldHVybmVkIGFyZSBhbGxvY2F0ZWQgYnkgbWFsbG9jIGFuZCBzaG91bGQgYmUKK2ZyZWVkIGJ5IHRoZSBjYWxsZXIuCisKK1RoZSBmaXJzdCBmb3JtIGxpc3RlZCB1c2VzIHRoZSBjdXJyZW50IGlucHV0IHZlY3RvciwgYnV0IG92ZXJyaWRlcyB0aGUKK2N1cnJlbnQgb3V0cHV0IHZlY3Rvci4gIFRoZSBzZWNvbmQgZm9ybSBhZGRpdGlvbmFsbHkgYWxsb3dzIHRoZSBpbnB1dAordmVjdG9yIHRvIGJlIG92ZXJyaWRkZW4uCisKK1RoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVxdWlyZSB0aGF0IGFuIGVycm9yIGhhbmRsZXIgYmUgaW5zdGFsbGVkLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZXhlY3V0ZV9jYXRjaGluZ19lcnJvcnMgKEB2YXJ7Y29tbWFuZH0pCitAZXhhbXBsZQorY2hhciAqIEB2YXJ7Y29tbWFuZH07CitAZW5kIGV4YW1wbGUKK0xpa2UgQGNvZGV7ZXhlY3V0ZV9jb21tYW5kfSBleGNlcHQgdGhhdCBubyBlcnJvciBoYW5kbGVyIGlzIHJlcXVpcmVkLgorQGVuZCBkZWZ0eXBlZnVuCisKK0BkZWZ0eXBlZnVuIHZvaWQgZXhlY3V0ZV93aXRoX3RleHQgKEB2YXJ7Y29tbWFuZH0sIEB2YXJ7dGV4dH0pCitAZXhhbXBsZQorY2hhciAqIEB2YXJ7Y29tbWFuZH07CitjaGFyICoqIEB2YXJ7dGV4dH07CitAZW5kIGV4YW1wbGUKK0xpa2UgQGNvZGV7ZXhlY3V0ZV9jYXRjaGluZ19lcnJvcnN9LCBleGNlcHQgdGhhdCB0aGUgaW5wdXQgdmVjdG9yIGlzCitvdmVycmlkZGVuLiAgVGhlIG5ldyBpbnB1dCB2ZWN0b3IgaGFuZGxlcyBvbmx5IGNhbGxzIHRvIEBjb2Rle3F1ZXJ5fSAoYnkKK3JldHVybmluZyAneScpIGFuZCBjYWxscyB0byBAY29kZXtyZWFkX3N0cmluZ3N9IGJ5IHJldHVybmluZyBhIGNvcHkgb2YKK0B2YXJ7dGV4dH0gYW5kIHRoZSBzdHJpbmdzIGl0IHBvaW50cyB0by4KKworVGhpcyBmb3JtIG9mIGV4ZWN1dGVfY29tbWFuZCBpcyB1c2VmdWwgZm9yIGNvbW1hbmRzIGxpa2UgQGNvZGV7ZGVmaW5lfSwKK0Bjb2Rle2RvY3VtZW50fSwgYW5kIEBjb2Rle2NvbW1hbmRzfS4KK0BlbmQgZGVmdHlwZWZ1bgorCisKKworQG5vZGUgRGVmaW5pbmcgQ29tbWFuZHMsIFZhcmlhYmxlcywgSW52b2tpbmcsIFRvcAorQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCitAY2hhcHRlciBIb3cgTmV3IENvbW1hbmRzIGFyZSBDcmVhdGVkCitAY2luZGV4IHtjb21tYW5kcywgZGVmaW5pbmd9CisKK0FwcGxpY2F0aW9ucyBhcmUsIG9mIGNvdXJzZSwgZnJlZSB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZXhpc3RpbmcgR0RCCittYWNybyBkZWZpbml0aW9uIGNhcGFiaWxpdHkgKHRoZSBAY29kZXtkZWZpbmV9IGFuZCBAY29kZXtkb2N1bWVudH0KK2Z1bmN0aW9ucykuICAKKworSW4gYWRkaXRpb24sIGFuIGFwcGxpY2F0aW9uIGNhbiBhZGQgbmV3IHByaW1pdGl2ZXMgdG8gdGhlIEdEQiBjb21tYW5kCitsYW5ndWFnZS4KKworQGRlZnR5cGVmdW4gdm9pZCBnZGJfZGVmaW5lX2FwcF9jb21tYW5kIChAdmFye25hbWV9LCBAdmFye2ZufSwgQHZhcntkb2N9KQorQGV4YW1wbGUKK2NoYXIgKiBAdmFye25hbWV9OworZ2RiX2NtZF9mbiBAdmFye2ZufTsKK2NoYXIgKiBAdmFye2RvY307CisKK3R5cGVkZWYgdm9pZCAoKmdkYl9jbWRfZm4pIChjaGFyICogYXJncyk7CitAZW5kIGV4YW1wbGUKKworQ3JlYXRlIGEgbmV3IGNvbW1hbmQgY2FsbCBAdmFye25hbWV9LiAgVGhlIG5ldyBjb21tYW5kIGlzIGluIHRoZQorQGNvZGV7YXBwbGljYXRpb259IGhlbHAgY2xhc3MuICBXaGVuIGludm9rZWQsIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzCit0byB0aGUgY29tbWFuZCBhcmUgcGFzc2VkIGFzIGEgc2luZ2xlIHN0cmluZy4KKworQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHR3aWNlIHdpdGggdGhlIHNhbWUgbmFtZSByZXBsYWNlcyBhbiBlYXJsaWVyCitkZWZpbml0aW9uLCBidXQgYXBwbGljYXRpb24gY29tbWFuZHMgY2FuIG5vdCByZXBsYWNlIGJ1aWx0aW4gY29tbWFuZHMgb2YKK3RoZSBzYW1lIG5hbWUuCisKK1RoZSBkb2N1bWVudGF0aW9uIHN0cmluZyBvZiB0aGUgY29tbWFuZCBpcyBzZXQgdG8gYSBjb3B5IHRoZSBzdHJpbmcKK0B2YXJ7ZG9jfS4KK0BlbmQgZGVmdHlwZWZ1bgorCitAbm9kZSBWYXJpYWJsZXMsIEFzeW5jaHJvbm91cywgRGVmaW5pbmcgQ29tbWFuZHMsIFRvcAorQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCitAY2hhcHRlciBIb3cgQnVpbHRpbiBWYXJpYWJsZXMgYXJlIERlZmluZWQKK0BjaW5kZXgge3ZhcmlhYmxlcywgZGVmaW5pbmd9CisKK0NvbnZlbmllbmNlIHZhcmlhYmxlcyBwcm92aWRlIGEgd2F5IGZvciB2YWx1ZXMgbWFpbnRhaW5lZCBieSBsaWJnZGIgdG8KK2JlIHJlZmVyZW5jZWQgaW4gZXhwcmVzc2lvbnMgKGUuZy4gQGNvZGV7JGJwbnVtfSkuICBMaWJnZGIgaW5jbHVkZXMgYQorbWVhbnMgYnkgd2hpY2ggdGhlIGFwcGxpY2F0aW9uIGNhbiBkZWZpbmUgbmV3LCBpbnRlZ2VyIHZhbHVlZAorY29udmVuaWVuY2UgdmFyaWFibGVzOgorQHBhZ2UKK0BkZWZ0eXBlZnVuIHZvaWQgZ2RiX2RlZmluZV9pbnRfdmFyIChAdmFye25hbWV9LCBAdmFye2ZufSwgQHZhcntmbl9hcmd9KQorQGV4YW1wbGUKK2NoYXIgKiBAdmFye25hbWV9OworaW50ICgqQHZhcntmbn0pICh2b2lkICopOwordm9pZCAqIEB2YXJ7Zm5fYXJnfTsKK0BlbmQgZXhhbXBsZQorVGhpcyBmdW5jdGlvbiBkZWZpbmVzIChvciB1bmRlZmluZXMpIGEgY29udmVuaWVuY2UgdmFyaWFibGUgY2FsbGVkIEB2YXJ7bmFtZX0uCitJZiBAdmFye2ZufSBpcyBOVUxMLCB0aGUgdmFyaWFibGUgYmVjb21lcyB1bmRlZmluZWQuICBPdGhlcndpc2UsCitAdmFye2ZufSBpcyBhIGZ1bmN0aW9uIHdoaWNoLCB3aGVuIHBhc3NlZCBAdmFye2ZuX2FyZ30gcmV0dXJucyB0aGUgdmFsdWUKK29mIHRoZSBuZXdseSBkZWZpbmVkIHZhcmlhYmxlLgorCitObyBsaWJnZGIgZnVuY3Rpb25zIHNob3VsZCBiZSBjYWxsZWQgYnkgQHZhcntmbn0uCitAZW5kIGRlZnR5cGVmdW4KKworT25lIHVzZSBmb3IgdGhpcyBmdW5jdGlvbiBpcyB0byBjcmVhdGUgYnJlYWtwb2ludCBjb25kaXRpb25zIGNvbXB1dGVkIGluCitub3ZlbCB3YXlzLiAgVGhpcyBpcyBkb25lIGJ5IGRlZmluaW5nIGEgY29udmVuaWVuY2UgdmFyaWFibGUgYW5kCityZWZlcnJpbmcgdG8gdGhhdCB2YXJpYWJsZSBpbiBhIGJyZWFrcG9pbnQgY29uZGl0aW9uIGV4cHJlc3Npb24uCisKKworQG5vZGUgQXN5bmNocm9ub3VzLCBDb21tYW5kcywgVmFyaWFibGVzLCBUb3AKK0BjaGFwdGVyIFNjaGVkdWxpbmcgQXN5bmNocm9ub3VzIENvbXB1dGF0aW9ucworQGNpbmRleCBhc3luY2hyb25vdXMKKworCitBIHJ1bm5pbmcgbGliZ2RiIGZ1bmN0aW9uIGNhbiB0YWtlIGEgbG9uZyB0aW1lLiAgTGliZ2RiIGluY2x1ZGVzIGEgaG9vaworc28gdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gcnVuIGludGVybWl0dGVudGx5IGR1cmluZyBsb25nIGRlYnVnZ2VyCitvcGVyYXRpb25zLgorCitAZGVmdHlwZWZ1biB2b2lkIGdkYl9zZXRfcG9sbF9mbiAoQHZhcntmbn0sIEB2YXJ7Zm5fYXJnfSkKK0BleGFtcGxlCit2b2lkICgqQHZhcntmbn0pKHZvaWQgKiBmbl9hcmcsIGludCAoKmdkYl9wb2xsKSgpKTsKK3ZvaWQgKiBAdmFye2ZuX2FyZ307CitAZW5kIGV4YW1wbGUKK0FycmFuZ2UgdG8gY2FsbCBAdmFye2ZufSBwZXJpb2RpY2FsbHkgZHVyaW5nIGxlbmd0aHkgZGVidWdnZXIgb3BlcmF0aW9ucy4KK0lmIEB2YXJ7Zm59IGlzIE5VTEwsIHBvbGxpbmcgaXMgdHVybmVkIG9mZi4gIEB2YXJ7Zm59IHNob3VsZCB0YWtlIHR3bworYXJndW1lbnRzOiBhbiBvcGFxdWUgcG9pbnRlciBwYXNzZWQgYXMgQHZhcntmbl9hcmd9IHRvCitAY29kZXtnZGJfc2V0X3BvbGxfZm59LCBhbmQgYSBmdW5jdGlvbiBwb2ludGVyLiAgVGhlIGZ1bmN0aW9uIHBvaW50ZXIKK3Bhc3NlZCB0byBAdmFye2ZufSBpcyBwcm92aWRlZCBieSBsaWJnZGIgYW5kIHBvaW50cyB0byBhIGZ1bmN0aW9uIHRoYXQKK3JldHVybnMgMCB3aGVuIHRoZSBwb2xsIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4uICBUaGF0IGlzLCB3aGVuCitAY29kZXsoKmdkYl9wb2xsKSgpfSByZXR1cm5zIDAsIGxpYmdkYiBpcyByZWFkeSB0byBjb250aW51ZSBAdmFye2ZufQorc2hvdWxkIHJldHVybiBxdWlja2x5LgorCitJdCBpcyBwb3NzaWJsZSB0aGF0IEBjb2RleygqZ2RiX3BvbGwpKCl9IHdpbGwgcmV0dXJuIDAgdGhlIGZpcnN0IHRpbWUgaXQKK2lzIGNhbGxlZCwgc28gaXQgaXMgcmVhc29uYWJsZSBmb3IgYW4gYXBwbGljYXRpb24gdG8gZG8gbWluaW1hbCBwcm9jZXNzaW5nCitiZWZvcmUgY2hlY2tpbmcgd2hldGhlciB0byByZXR1cm4uCisKK05vIGxpYmdkYiBmdW5jdGlvbnMgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGFuIGFwcGxpY2F0aW9uJ3MgcG9sbCBmdW5jdGlvbiwKK3dpdGggb25lIGV4Y2VwdGlvbjogQGNvZGV7Z2RiX3JlcXVlc3RfcXVpdH0uCitAZW5kIGRlZnR5cGVmdW4KKworCitAZGVmdHlwZWZ1biB2b2lkIGdkYl9yZXF1ZXN0X3F1aXQgKHZvaWQpCitUaGlzIGZ1bmN0aW9uLCBpZiBjYWxsZWQgZnJvbSBhIHBvbGwgZnVuY3Rpb24sIHJlcXVlc3RzIHRoYXQgdGhlCitjdXJyZW50bHkgZXhlY3V0aW5nIGxpYmdkYiBjb21tYW5kIGJlIGludGVycnVwdGVkIGFzIHNvb24gYXMgcG9zc2libGUsCithbmQgdGhhdCBjb250cm9sIGJlIHJldHVybmVkIHRvIHRoZSB0b3AtbGV2ZWwgdmlhIGFuIGVycm9yLgorCitUaGUgcXVpdCBpcyBub3QgaW1tZWRpYXRlLiAgSXQgd2lsbCBub3Qgb2NjdXIgdW50aWwgYXQgbGVhc3QgYWZ0ZXIgdGhlCithcHBsaWNhdGlvbidzIHBvbGwgZnVuY3Rpb24gcmV0dXJucy4KK0BlbmQgZGVmdHlwZWZ1biAKKworQG5vZGUgQ29tbWFuZHMsIFRvcCwgQXN5bmNocm9ub3VzLCBUb3AKK0Bjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cAorQGNoYXB0ZXIgRGVidWdnZXIgQ29tbWFuZHMgZm9yIExpYmdkYiBBcHBsaWNhdGlvbnMKKworVGhlIGRlYnVnZ2VyIGNvbW1hbmRzIGF2YWlsYWJsZSB0byBsaWJnZGIgYXBwbGljYXRpb25zIGFyZSB0aGUgc2FtZSBjb21tYW5kcworYXZhaWxhYmxlIGludGVyYWN0aXZlbHkgdmlhIEdEQi4gIFRoaXMgc2VjdGlvbiBpcyBhbiBvdmVydmlldyBvZiB0aGUKK2NvbW1hbmRzIG5ld2x5IGNyZWF0ZWQgYXMgcGFydCBvZiBsaWJnZGIuCisKK1RoaXMgc2VjdGlvbiBpcyBub3QgYnkgYW55IG1lYW5zIGEgY29tcGxldGUgcmVmZXJlbmNlIHRvIHRoZSBHREIgY29tbWFuZAorbGFuZ3VhZ2UuICBTZWUgdGhlIEdEQiBtYW51YWwgZm9yIHN1Y2ggYSByZWZlcmVuY2UuCisKK0BtZW51CisqIENvbW1hbmQgSG9va3M6OiAgICBTZXR0aW5nIEhvb2tzIHRvIEV4ZWN1dGUgV2l0aCBEZWJ1Z2dlciBDb21tYW5kcy4KKyogVmlldyBDb21tYW5kczo6ICAgIFZpZXcgQ29tbWFuZHMgTWlycm9yIFNob3cgQ29tbWFuZHMKKyogQnJlYWtwb2ludHM6OiAgICAgIFRoZSBBcHBsaWNhdGlvbiBDYW4gSGF2ZSBJdHMgT3duIEJyZWFrcG9pbnRzCitAZW5kIG1lbnUKKworQG5vZGUgQ29tbWFuZCBIb29rcywgVmlldyBDb21tYW5kcywgQ29tbWFuZHMsIENvbW1hbmRzCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BzZWN0aW9uIFNldHRpbmcgSG9va3MgdG8gRXhlY3V0ZSBXaXRoIERlYnVnZ2VyIENvbW1hbmRzLgorCitEZWJ1Z2dlciBjb21tYW5kcyBzdXBwb3J0IGhvb2tzLiAgQSBjb21tYW5kIGhvb2sgaXMgZXhlY3V0ZWQganVzdCBiZWZvcmUKK3RoZSBpbnRlcnByZXRlciBpbnZva2VzIHRoZSBob29rZWQgY29tbWFuZC4KKworVGhlcmUgYXJlIHR3byBob29rcyBhbGxvd2VkIGZvciBldmVyeSBjb21tYW5kLiAgQnkgY29udmVudGlvbiwgb25lIGhvb2sKK2lzIGZvciB1c2UgYnkgdXNlcnMsIHRoZSBvdGhlciBpcyBmb3IgdXNlIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKworQSB1c2VyIGhvb2sgaXMgY3JlYXRlZCBmb3IgYSBjb21tYW5kIFhZWlpZIGJ5IHVzaW5nCitAY29kZXtkZWZpbmUtY29tbWFuZH0gdG8gY3JlYXRlIGEgY29tbWFuZCBjYWxsZWQgQGNvZGV7aG9vay1YWVpaWX0uCisKK0FuIGFwcGxpY2F0aW9uIGhvb2sgaXMgY3JlYXRlZCBmb3IgYSBjb21tYW5kIFhZWlpZIGJ5IHVzaW5nCitAY29kZXtkZWZpbmUtY29tbWFuZH0gdG8gY3JlYXRlIGEgY29tbWFuZCBjYWxsZWQgQGNvZGV7YXBwaG9vay1YWVpaWX0uCisKK0FwcGxpY2F0aW9uIGhvb2tzIGFyZSB1c2VmdWwgZm9yIGludGVyZmFjZXMgd2hpY2ggd2lzaCB0byBjb250aW51b3VzbHkKK21vbml0b3IgY2VydGFpbiBhc3BlY3RzIG9mIGRlYnVnZ2VyIHN0YXRlLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiBzZXQgYQoraG9vayBvbiBhbGwgY29tbWFuZHMgdGhhdCBtaWdodCBtb2RpZnkgdGhlIHdhdGNoZWQgc3RhdGUuICBXaGVuIHRoZSBob29rCitpcyBleGVjdXRlZCwgaXQgY2FuIHVzZSBpL28gcmVkaXJlY3Rpb24gdG8gbm90aWZ5IHBhcnRzIG9mIHRoZQorYXBwbGljYXRpb24gdGhhdCBwcmV2aW91cyBkYXRhIG1heSBiZSBvdXQgb2YgZGF0ZS4gIEFmdGVyIHRoZSB0b3AtbGV2ZWwgbG9vcAorcmVzdW1lcywgdGhlIGFwcGxpY2F0aW9uIGNhbiByZWNvbXB1dGUgYW55IHZhbHVlcyB0aGF0IG1heSBoYXZlIGNoYW5nZWQuCisoQHhyZWZ7SS9PfS4pCisKK0Bub2RlIFZpZXcgQ29tbWFuZHMsIEJyZWFrcG9pbnRzLCBDb21tYW5kIEhvb2tzLCBDb21tYW5kcworQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCitAc2VjdGlvbiBWaWV3IENvbW1hbmRzIE1pcnJvciBTaG93IENvbW1hbmRzCisKK1RoZSBHREIgY29tbWFuZCBsYW5ndWFnZSBjb250YWlucyBtYW55IEBjb2Rle3NldH0gYW5kIEBjb2Rle3Nob3d9Citjb21tYW5kcy4gIFRoZXNlIGNvbW1hbmRzIGFyZSB1c2VkIHRvIG1vZGlmeSBvciBleGFtaW5lIHBhcmFtZXRlcnMgdG8KK3RoZSBkZWJ1Z2dlci4KKworSXQgaXMgZGlmZmljdWx0IHRvIGdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIHBhcmFtZXRlciBmcm9tIHRoZQorQGNvZGV7c2hvd30gY29tbWFuZCBiZWNhdXNlIEBjb2Rle3Nob3d9IGlzIHZlcnkgdmVyYm9zZS4KKworQGV4YW1wbGUKKyhnZGIpIHNob3cgY2hlY2sgdHlwZQorVHlwZSBjaGVja2luZyBpcyAiYXV0bzsgY3VycmVudGx5IG9mZiIuCisoZ2RiKSBzaG93IHdpZHRoCitOdW1iZXIgb2YgY2hhcmFjdGVycyBnZGIgdGhpbmtzIGFyZSBpbiBhIGxpbmUgaXMgODAuCitAZW5kIGV4YW1wbGUKKworRm9yIGV2ZXJ5IEBjb2Rle3Nob3d9IGNvbW1hbmQsIGxpYmdkYiBpbmNsdWRlcyBhIEBjb2Rle3ZpZXd9IGNvbW1hbmQuCitAY29kZXt2aWV3fSBpcyBsaWtlIEBjb2Rle3Nob3d9IHdpdGhvdXQgdGhlIHZlcmJvc2UgY29tbWVudGFyeToKKworQGV4YW1wbGUKKyhnZGIpIHZpZXcgY2hlY2sgdHlwZQorYXV0bzsgY3VycmVudGx5IG9mZgorKGdkYikgdmlldyB3aWR0aAorODAKK0BlbmQgZXhhbXBsZQorCisoVGhlIHByZWNpc2UgZm9ybWF0IG9mIHRoZSBvdXB1dCBmcm9tIEBjb2Rle3ZpZXd9IGlzIHN1YmplY3QgdG8gY2hhbmdlLgorSW4gcGFydGljdWxhciwgQGNvZGV7dmlld30gbWF5IG9uZS1kYXkgcHJpbnQgdmFsdWVzIHdoaWNoIGNhbiBiZSB1c2VkIGFzCithcmd1bWVudHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgQGNvZGV7c2V0fSBjb21tYW5kLikKKworQG5vZGUgQnJlYWtwb2ludHMsIFN0cnVjdHVyZWQgT3V0cHV0LCBWaWV3IENvbW1hbmRzLCBDb21tYW5kcworQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCitAc2VjdGlvbiBUaGUgQXBwbGljYXRpb24gQ2FuIEhhdmUgSXRzIE93biBCcmVha3BvaW50cworCitUaGUgR0RCIGJyZWFrcG9pbnQgY29tbWFuZHMgd2VyZSB3cml0dGVuIHdpdGggYSBzdHJvbmcgcHJlc3VtcHRpb24gdGhhdAorYWxsIGJyZWFrcG9pbnRzIGFyZSBtYW5hZ2VkIGJ5IGEgaHVtYW4gdXNlci4gIFRoZXJlZm9yZSwgdGhlIGNvbW1hbmQKK2xhbmd1YWdlIGNvbnRhaW5zIGNvbW1hbmRzIGxpa2UgYGRlbGV0ZScgd2hpY2ggYWZmZWN0IGFsbCBicmVha3BvaW50cword2l0aG91dCBkaXNjcmltaW5hdGlvbi4KKworSW4gbGliZ2RiLCB0aGVyZSBpcyBhZGRlZCBzdXBwb3J0IGZvciBicmVha3BvaW50cyBhbmQgd2F0Y2hwb2ludHMgd2hpY2gKK2FyZSBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uIGFuZCB3aGljaCBzaG91bGQgbm90IGJlIGFmZmVjdGVkIGJ5IG9yZGluYXJ5LAoraW5kaXNjcmltaW5hdGUgY29tbWFuZHMuICBUaGVzZSBhcmUgY2FsbGVkIEBkZm57cHJvdGVjdGVkfSBicmVha3BvaW50cy4KKworQGRlZmZuIHtEZWJ1Z2dlciBDb21tYW5kfSBicmVhay1wcm90ZWN0ZWQgLi4uCitAZGVmZm54IHtEZWJ1Z2dlciBDb21tYW5kfSB3YXRjaC1wcm90ZWN0ZWQgLi4uCitUaGVzZSB3b3JrIGxpa2UgQGNvZGV7YnJlYWt9IGFuZCBAY29kZXt3YXRjaH0gZXhjZXB0IHRoYXQgdGhlIHJlc3VsdGluZworYnJlYWtwb2ludCBpcyBnaXZlbiBhIG5lZ2F0aXZlIG51bWJlci4gIE5lZ2F0aXZlIG51bWJlcmVkIGJyZWFrcG9pbnRzIGRvCitub3QgYXBwZWFyIGluIHRoZSBvdXRwdXQgb2YgQGNvZGV7aW5mbyBicmVha3BvaW50c30gYnV0IGRvIGluIHRoYXQgb2YKK0Bjb2Rle2luZm8gYWxsLWJyZWFrcG9pbnRzfS4gIE5lZ2F0aXZlIG51bWJlcmVkIGJyZWFrcG9pbnRzIGFyZSBub3QKK2FmZmVjdGVkIGJ5IGNvbW1hbmRzIHdoaWNoIG9yZGluYXJpbHkgYWZmZWN0IGBhbGwnIGJyZWFrcG9pbnRzIChlLmcuCitAY29kZXtkZWxldGV9IHdpdGggbm8gYXJndW1lbnRzKS4KKworTm90ZSB0aGF0IGxpYmdkYiBpdHNlbGYgY3JlYXRlcyBwcm90ZWN0ZWQgYnJlYWtwb2ludHMsIHNvIHByb2dyYW1zCitzaG91bGQgbm90IHJlbHkgb24gYmVpbmcgYWJsZSB0byBhbGxvY2F0ZSBwYXJ0aWN1bGFyIHByb3RlY3RlZAorYnJlYWtwb2ludCBudW1iZXJzIGZvciB0aGVtc2VsdmVzLgorQGVuZCBkZWZmbgorCitNb3JlIHRoYW4gb25lIGJyZWFrcG9pbnQgbWF5IGJlIHNldCBhdCBhIGdpdmVuIGxvY2F0aW9uLiAgTGliZ2RiIGFkZHMKK3RoZSBjb25jZXB0IG9mIEBkZm57cHJpb3JpdHl9IHRvIGJyZWFrcG9pbnRzLiAgQSBwcmlvcml0eSBpcyBhbiBpbnRlZ2VyLAorYXNzaWduZWQgdG8gZWFjaCBicmVha3BvaW50LiAgV2hlbiBhIGJyZWFrcG9pbnQgaXMgcmVhY2hlZCwgdGhlCitjb25kaXRpb25zIG9mIGFsbCBicmVha3BvaW50cyBhdCB0aGUgc2FtZSBsb2NhdGlvbiBhcmUgZXZhbHVhdGVkIGluCitvcmRlciBvZiBhc2NlbmRpbmcgcHJpb3JpdHkuICBXaGVuIGJyZWFrcG9pbnQgY29tbWFuZHMgYXJlIGV4ZWN1dGVkLAordGhleSBhcmUgYWxzbyBleGVjdXRlZCBpbiBhc2NlbmRpbmcgcHJpb3JpdHkgKHVudGlsIGFsbCBoYXZlIGJlZW4KK2V4ZWN1dGVkLCBhbiBlcnJvciBvY2N1cnMsIG9yIG9uZSBzZXQgb2YgY29tbWFuZHMgY29udGludWVzIHRoZQordGFyZ2V0KS4KKworQGRlZmZuIHtEZWJ1Z2dlciBDb21tYW5kfSBwcmlvcml0eSBuIGJwbGlzdAorU2V0IHRoZSBwcmlvcml0eSBmb3IgYnJlYWtwb2ludHMgQHZhcnticGxpc3R9IHRvIEB2YXJ7bn0uCitCeSBkZWZhdWx0LCBicmVha3BvaW50cyBhcmUgYXNzaWduZWQgYSBwcmlvcml0eSBvZiB6ZXJvLgorQGVuZCBkZWZmbgorCitAbm9kZSBTdHJ1Y3R1cmVkIE91dHB1dCwgQ29tbWFuZHMsIEJyZWFrcG9pbnRzLCBDb21tYW5kcworQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCitAc2VjdGlvbiAgU3RydWN0dXJlZCBPdXRwdXQsIFRoZSBAY29kZXtFeHBsYWlufSBDb21tYW5kCisKKyhUaGlzIHNlY3Rpb24gbWF5IGJlIHN1YmplY3QgdG8gY29uc2lkZXJhYmxlIHJldmlzaW9uLikKKworV2hlbiBHREIgcHJpbnRzIGEgdGhlIHZhbHVlIG9mIGFuIGV4cHJlc3Npb24sIHRoZSBwcmludGVkIHJlcHJlc2VudGF0aW9uCitjb250YWlucyBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSB1c2VmdWxseSBmZWQgYmFjayBpbnRvIGZ1dHVyZSBjb21tYW5kcworYW5kIGV4cHJlc3Npb25zLiAgRm9yIGV4YW1wbGUsIAorCitAZXhhbXBsZQorKGdkYikgcHJpbnQgZm9vCiskMTYgPSBAe3YgPSAweDM4YWUwLCB2X2xlbmd0aCA9IDQwQH0KK0BlbmQgZXhhbXBsZQorCitPbiB0aGUgYmFzaXMgb2YgdGhpcyBvdXRwdXQsIGEgdXNlciBrbm93cywgZm9yIGV4YW1wbGUsIHRoYXQKK0Bjb2RleyQxNi52fSByZWZlcnMgdG8gYSBwb2ludGVyIHZhbHVlZCBAY29kZXsweDM4YWUwfQorCitBIG5ldyBvdXRwdXQgY29tbWFuZCBoZWxwcyB0byBtYWtlIGluZm9ybWF0aW9uIGxpa2UgdGhpcyBhdmFpbGFibGUgdG8KK3RoZSBhcHBsaWNhdGlvbi4KKworQGRlZmZuIHtEZWJ1Z2dlciBDb21tYW5kfSBleHBsYWluIGV4cHJlc3Npb24KK0BkZWZmbngge0RlYnVnZ2VyIENvbW1hbmR9IGV4cGxhaW4gL2Zvcm1hdCBleHByZXNzaW9uCitQcmludCB0aGUgdmFsdWUgb2YgQHZhcntleHByZXNzaW9ufSBpbiB0aGUgbWFubmVyIG9mIHRoZSBAY29kZXtwcmludH0KK2NvbW1hbmQsIGJ1dCBlbWJlZCB0aGF0IG91dHB1dCBpbiBhIGxpc3Qgc3ludGF4IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24KK2Fib3V0IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG91dHB1dC4KK0BlbmQgZGVmZm4KKworQXMgYW4gZXhhbXBsZSwgQGNvZGV7ZXhwbGFpbiBhcmd2fSBtaWdodCBwcm9kdWNlIHRoaXMgb3V0cHV0OgorCitAZXhhbXBsZQorKGV4cC1hdHRyaWJ1dGUKKyAgICgoZXhwcmVzc2lvbiAiJDE5IikKKyAgICAodHlwZSAiY2hhciAqKiIpCisgICAgKGFkZHJlc3MgIjQ4NTYwIikKKyAgICAoZGVyZWYtZXhwcmVzc2lvbiAiKiQxOSIpKQorICAgIiQxOSA9IDB4MzgwMFxuIikKK0BlbmQgZXhhbXBsZQorCitUaGUgc3ludGF4IG9mIG91dHB1dCBmcm9tIEBjb2Rle2V4cGxhaW59IGlzOgorCitAZXhhbXBsZQorPGV4cGxhbmF0aW9uPiA6PSAgICA8cXVvdGVkLXN0cmluZz4KKyAgICAgICAgICAgICAgICAgIHwgKGV4cC1jb25jYXQgPGV4cGxhbmF0aW9uPiA8ZXhwbGFuYXRpb24+KikKKyAgICAgICAgICAgICAgICAgIHwgKGV4cC1hdHRyaWJ1dGUgPHByb3BlcnR5LWxpc3Q+IDxleHBsYW5hdGlvbj4pCisKKzxwcm9wZXJ0eS1saXN0PiA6PSAoIDxwcm9wZXJ0eS1wYWlyPiogKQorCis8cHJvcGVydHktcGFpcj4gOj0gKCA8cHJvcGVydHktbmFtZT4gPHF1b3RlZC1zdHJpbmc+ICkKK0BlbmQgZXhhbXBsZQorCitUaGUgc3RyaW5nLWNvbmNhdGVuYXRpb24gb2YgYWxsIG9mIHRoZSBAY29kZXs8cXVvdGVkLXN0cmluZz59IChleGNlcHQKK3Rob3NlIGluIHByb3BlcnR5IGxpc3RzKSB5aWVsZHMgdGhlIG91dHB1dCBnZW5lcmF0ZWQgYnkgdGhlIGVxdWl2YWxlbnQKK0Bjb2Rle3ByaW50fSBjb21tYW5kLiAgUXVvdGVkIHN0cmluZ3MgbWF5IGNvbnRhaW4gcXVvdGVzIGFuZCBiYWNrc2xhc2hlcworaWYgdGhleSBhcmUgZXNjYXBlZCBieSBiYWNrc2xhc2guICAiXG4iIGluIGEgcXVvdGVkIHN0cmluZyBzdGFuZHMgZm9yCituZXdsaW5lOyB1bmVzY2FwZWQgbmV3bGluZXMgZG8gbm90IG9jY3VyIHdpdGhpbiB0aGUgc3RyaW5ncyBvdXRwdXQgYnkKK0Bjb2Rle2V4cGxhaW59LgorCitQcm9wZXJ0eSBuYW1lcyBhcmUgbWFkZSB1cCBvZiBhbHBoYWJldGljIGNoYXJhY3RlcnMsIGRhc2hlcywgYW5kCit1bmRlcnNjb3Jlcy4KKworVGhlIHNldCBvZiBwcm9wZXJ0aWVzIGlzIG9wZW4tZW5kZWQuICBBcyBHREIgYWNxdWlyZXMgc3VwcG9ydCBmb3IgbmV3Citzb3VyY2UgbGFuZ3VhZ2VzIGFuZCBvdGhlciBuZXcgY2FwYWJpbGl0aWVzLCBuZXcgcHJvcGVydHkgdHlwZXMgbWF5IGJlCithZGRlZCB0byB0aGUgb3V0cHV0IG9mIHRoaXMgY29tbWFuZC4gIEZ1dHVyZSBjb21tYW5kcyBtYXkgb2ZmZXIKK2FwcGxpY2F0aW9ucyBzb21lIHNlbGVjdGl2aXR5IGNvbmNlcm5pbmcgd2hpY2ggcHJvcGVydGllcyBhcmUgcmVwb3J0ZWQuCisKK1RoZSBpbml0aWFsIHNldCBvZiBwcm9wZXJ0aWVzIGRlZmluZWQgaW5jbHVkZXM6IAorCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbSBAY29kZXtleHByZXNzaW9ufQorCitUaGlzIGlzIGFuIGV4cHJlc3Npb24sIHN1Y2ggYXMgQGNvZGV7JDQyfSBvciBAY29kZXskNDIueH0uICBUaGUKK2V4cHJlc3Npb24gY2FuIGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhlIHZhbHVlIHByaW50ZWQgaW4gdGhlIGF0dHJpYnV0ZWQKK3BhcnQgb2YgdGhlIHN0cmluZy4KKworQGl0ZW0gQGNvZGV7dHlwZX0KKworVGhpcyBpcyBhIHVzZXItcmVhZGFibGUgbmFtZSBmb3IgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZWQgdmFsdWUuCisKK0BpdGVtIEBjb2Rle2FkZHJlc3N9CisKK0lmIHRoZSB2YWx1ZSBpcyBzdG9yZWQgaW4gYSB0YXJnZXQgcmVnaXN0ZXIsIHRoaXMgaXMgYSByZWdpc3RlciBudW1iZXIuCitJZiB0aGUgdmFsdWUgaXMgc3RvcmVkIGluIGEgR0RCIGNvbnZlbmllbmNlIHZhcmlhYmxlLCB0aGlzIGlzIGFuIGludGVnZXIKK3RoYXQgaXMgdW5pcXVlIGFtb25nIGFsbCB0aGUgY29udmVuaWVuY2UgdmFyaWFibGVzLiAgT3RoZXJ3aXNlLCB0aGlzIGlzCit0aGUgYWRkcmVzcyBpbiB0aGUgdGFyZ2V0IHdoZXJlIHRoZSB2YWx1ZSBpcyBzdG9yZWQuCisKK0BpdGVtIEBjb2Rle2RlcmVmLWV4cHJlc3Npb259CisKK0lmIHRoZSBhdHRyaWJ1dGVkIHZhbHVlIGlzIGEgcG9pbnRlciB0eXBlLCB0aGlzIGlzIGFuIGV4cHJlc3Npb24gdGhhdAorcmVmZXJzIHRvIHRoZSBkZXJlZmVyZW5jZWQgdmFsdWUuCitAZW5kIGl0ZW1pemUKKworSGVyZSBpcyBhIGxhcmdlciBleGFtcGxlLCB1c2luZyB0aGUgc2FtZSBvYmplY3QgcGFzc2VkIHRvIEBjb2Rle3ByaW50fQoraW4gYW4gZWFybGllciBleGFtcGxlIG9mIHRoaXMgc2VjdGlvbi4KKworQGV4YW1wbGUKKyhnZGIpIGV4cGxhaW4gZm9vCisoZXhwLWF0dHJpYnV0ZQorICAoIChleHByZXNzaW9uICIkMTYiKQorICAgICh0eXBlICJzdHJ1Y3QgYnl0ZWNvZGVfdmVjdG9yIikKKyAgICAoYWRkcmVzcyAxNDMzNikgKQorICAoZXhwLWNvbmNhdAorICAgICIkMTYgPSBAeyIKKyAgICAoZXhwLWF0dHJpYnV0ZQorICAgICAgKCAoZXhwcmVzc2lvbiAiJDE2LnYiKQorICAgICAgICAodHlwZSAiY2hhciAqIikKKyAgICAgICAgKGFkZHJlc3MgMTQzMzYpCisgICAgICAgIChkZXJlZi1leHByZXNzaW9uICIqJDE2LnYiKSApCisgICAgICAidiA9IDB4MzhhZTAiKQorICAgIChleHAtYXR0cmlidXRlCisgICAgICAoIChleHByZXNzaW9uICIkMTYudl9sZW5ndGgiKQorICAgICAgICAodHlwZSAiaW50IikKKyAgICAgICAgKGFkZHJlc3MgMTQzNDApICkKKyAgICAgICIsIHZfbGVuZ3RoID0gNDAiKQorICAgICAiQH1cbiIpKQorQGVuZCBleGFtcGxlCisKK0l0IGlzIHVuZGVmaW5lZCBob3cgbGliZ2RiIHdpbGwgaW5kZW50IHRoZXNlIGxpbmVzIG9mIG91dHB1dCBvciAKK3doZXJlIG5ld2xpbmVzIHdpbGwgYmUgaW5jbHVkZWQuCisKK0BieWUKZGlmZiAtLWdpdCBhL2dkYi9kb2MvbHBzcmMuc2VkIGIvZ2RiL2RvYy9scHNyYy5zZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3YWY0YQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9kb2MvbHBzcmMuc2VkCkBAIC0wLDAgKzEsMTMgQEAKKy9mb250IGRlZnM6IC0tLS8sL2VuZCBmb250IGRlZnMgLS0tL2NcCislLS0tLS0tLS0tLS0tLS0tLS0tLS0gUG9zdFNjcmlwdCAobG9uZyBuYW1lcykgZm9udCBkZWZzOiAtLS0tLS0tLS0tLS0tLS0tLVwKK1xcZm9udFxcYmJmPVRpbWVzLUJvbGQgYXQgMTBwdFwKK1xcZm9udFxcdmJiZj1UaW1lcy1Cb2xkIGF0IDEycHRcCitcXGZvbnRcXHNtcm09VGltZXMtUm9tYW4gYXQgNnB0XAorXFxmb250XFxicm09VGltZXMtUm9tYW4gYXQgMTBwdFwKK1xcZm9udFxccm09VGltZXMtUm9tYW4gYXQgOHB0XAorXFxmb250XFxpdD1UaW1lcy1JdGFsaWMgYXQgOHB0XAorXFxmb250XFx0dD1Db3VyaWVyIGF0IDhwdFwKKyUgVXNlZCBvbmx5IGZvciBcY29weXJpZ2h0LCByZXBsYWNpbmcgcGxhaW4gVGVYIG1hY3JvLlwKK1xcZm9udFxcc3ltPVN5bWJvbCBhdCA3cHRcCitcXGRlZlxcY29weXJpZ2h0e3tcXHN5bVxcY2hhciczMjN9fVwKKyUtLS0tLS0tLS0tLS0tLS0tLS0tLSBlbmQgZm9udCBkZWZzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZ2RiL2RvYy9wc3JjLnNlZCBiL2dkYi9kb2MvcHNyYy5zZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiNTU3ZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9kb2MvcHNyYy5zZWQKQEAgLTAsMCArMSwxMyBAQAorL2ZvbnQgZGVmczogLS0tLywvZW5kIGZvbnQgZGVmcyAtLS0vY1wKKyUtLS0tLS0tLS0tLS0tLS0tLS0tLSBQb3N0U2NyaXB0IChLIEJlcnJ5IG5hbWVzKSBmb250IGRlZnM6IC0tLS0tLS0tLS0tLS0tXAorXFxmb250XFxiYmY9cHRtYiBhdCAxMHB0XAorXFxmb250XFx2YmJmPXB0bWIgYXQgMTJwdFwKK1xcZm9udFxcc21ybT1wdG1yIGF0IDZwdFwKK1xcZm9udFxcYnJtPXB0bXIgYXQgMTBwdFwKK1xcZm9udFxccm09cHRtciBhdCA4cHRcCitcXGZvbnRcXGl0PXB0bXJpIGF0IDhwdFwKK1xcZm9udFxcdHQ9cGNyciBhdCA4cHRcCislIFVzZWQgb25seSBmb3IgXGNvcHlyaWdodCwgcmVwbGFjaW5nIHBsYWluIFRlWCBtYWNyby5cCitcXGZvbnRcXHN5bT1wc3lyIGF0IDdwdFwKK1xcZGVmXFxjb3B5cmlnaHR7e1xcc3ltXFxjaGFyJzMyM319XAorJS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVuZCBmb250IGRlZnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9nZGIvZG9jL3JlZmNhcmQudGV4IGIvZ2RiL2RvYy9yZWZjYXJkLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmI3MmRlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2RvYy9yZWZjYXJkLnRleApAQCAtMCwwICsxLDY0NSBAQAorJSUlJSUlJSUlJSUlJSUlJSBnZGItcmVmY2FyZC50ZXggJSUlJSUlJSUlJSUlJSUlJQorCislVGhpcyBmaWxlIGlzIFRlWCBzb3VyY2UgZm9yIGEgcmVmZXJlbmNlIGNhcmQgZGVzY3JpYmluZyBHREIsIHRoZSBHTlUgZGVidWdnZXIuCislQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorJVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgorJXRoaXMgcmVmZXJlbmNlIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgcGVybWlzc2lvbiBub3RpY2VzCislYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorJQorJVRlWCBtYXJrdXAgaXMgYSBwcm9ncmFtbWluZyBsYW5ndWFnZTsgYWNjb3JkaW5nbHkgdGhpcyBmaWxlIGlzIHNvdXJjZQorJWZvciBhIHByb2dyYW0gdG8gZ2VuZXJhdGUgYSByZWZlcmVuY2UuCislCislVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyVpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorJXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyVhbnkgbGF0ZXIgdmVyc2lvbi4KKyUKKyVUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CislV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorJU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCislR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorJQorJVlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGF0IHRoZSBVUkwKKyVodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWw7IG9yIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCislRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyUKKyVZb3UgY2FuIGNvbnRhY3QgdGhlIG1haW50YWluZXIgYXQ6ICBkb2NAY3lnbnVzLmNvbQorJQorJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBEZXBhcnRtZW50CislICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDeWdudXMgU29sdXRpb25zCislICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzI1IENoZXNhcGVha2UgVGVycmFjZQorJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vubnl2YWxlLCBDQSA5NDA4OSAgVVNBCislCislICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArMSA4MDAgQ1lHTlVTLTEKKyUKKyUKKyUKKyUgMjItQVVHLTE5OTMgQW5kcmVhcyBWb2dlbAorJQorJSAgIE1vZGlmaWNhdGlvbnMgbWFkZSBpbiBvcmRlciB0byBoYW5kbGUgZGlmZmVyZW50IHBhcGVyc2l6ZXMgY29ycmVjdGx5LgorJSAgIFlvdSBvbmx5IGhhdmUgdG8gc2V0IHRoZSB0b3RhbCB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBwYXBlciwgdGhlCislICAgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgbWFyZ2luIHNwYWNlIG1lYXN1cmVkIGZyb20gKnBhcGVyIGVkZ2UqCislICAgYW5kIHRoZSBpbnRlcmxpbmUgYW5kIGludGVyc3BlYyBzcGFjaW5nLgorJSAgIEluIG9yZGVyIHRvIHN1cHBvcnQgYSBuZXcgcGFwZXJzaXplLCB5b3UgaGF2ZSB0byBmaWRkbGUgd2l0aCB0aGUKKyUgICBsYXR0ZXIgZm91ciBkaW1lbnNpb25zLiBKdXN0IHRyeSBvdXQgYSBmZXcgdmFsdWVzLgorJSAgIEFsbCBvdGhlciB2YWx1ZXMgd2lsbCBiZSBjb21wdXRlZCBhdCBwcm9jZXNzIHRpbWUgc28gaXQgc2hvdWxkIGJlCislICAgcXVpdGUgZWFzeSB0byBzdXBwb3J0IGRpZmZlcmVudCBwYXBlciBzaXplcyAtIG9ubHkgZm91ciB2YWx1ZXMgdG8KKyUgICBndWVzcyA6LSkKKyUKKyUgICBUbyBmaW5kIHRoZSBjb25maWd1cmF0aW9uIHBsYWNlcywganVzdCBzZWFyY2ggZm9yIHRoZSBzdHJpbmcKKyUgICAiQ09ORklHVVJBVElPTiIuCislCislICAgQW5kcmVhcyBWb2dlbCAoYXZAc3N3LmRlKQorJQorJQorJQorJSBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBgbWFnbmlmaWNhdGlvbicgY29tbWFuZCBpZiB5b3Ugd2FudCB0byBwcmludAorJSBvdXQgaW4gYSBsYXJnZXIgZm9udC4gIENhdXRpb24hICBZb3UgbWF5IG5lZWQgbGFyZ2VyIHBhcGVyLiAgWW91IGhhZAorJSBiZXN0IGF2b2lkIHVzaW5nIDMtY29sdW1uIG91dHB1dCBpZiB5b3UgdHJ5IHRoaXMuICBTZWUgdGhlIGBgVGhyZWUKKyUgY29sdW1uIGZvcm1hdCcnIHNlY3Rpb24gYmVsb3cgaWYgeW91IHdhbnQgdG8gcHJpbnQgaW4gdGhyZWUgY29sdW1uCislIGZvcm1hdC4KKyUKKyVcbWFnbmlmaWNhdGlvbj1cbWFnc3RlcCAxCislCislIE5PVEUgT04gSU5URU5USU9OQUwgT01JU1NJT05TOiBUaGlzIHJlZmVyZW5jZSBjYXJkIGluY2x1ZGVzIG1vc3QgR0RCCislIGNvbW1hbmRzLCBidXQgZHVlIHRvIHNwYWNlIGNvbnN0cmFpbnRzIHRoZXJlIGFyZSBzb21lIHRoaW5ncyBJIGNob3NlCislIHRvIG9taXQuICBJbiBnZW5lcmFsLCBub3QgYWxsIHN5bm9ueW1zIGZvciBjb21tYW5kcyBhcmUgY292ZXJlZCwgbm9yCislIGFsbCB2YXJpYXRpb25zIG9mIGEgY29tbWFuZC4KKyUgVGhlIEdEQi11bmRlci1FbWFjcyBzZWN0aW9uIG9taXRzIGdkYi1tb2RlIGZ1bmN0aW9ucyB3aXRob3V0IGRlZmF1bHQKKyUga2V5YmluZGluZ3MuICBHREIgc3RhcnR1cCBvcHRpb25zIGFyZSBub3QgZGVzY3JpYmVkLgorJSBzZXQgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncywgc2V0IHN5bWJvbC1yZWxvYWRpbmcgb21pdHRlZC4KKyUgcHJpbnRzeW1zLCBwcmludHBzeW1zLCBvbWl0dGVkIHNpbmNlIHRoZXkncmUgZm9yIEdEQiBtYWludGVuYW5jZSBwcmltYXJpbHkKKyUgc2hhcmUgb21pdHRlZCBkdWUgdG8gb2Jzb2xlc2NlbmNlCislIHNldCBjaGVjayByYW5nZS90eXBlIG9taXR0ZWQgYXQgbGVhc3QgdGlsIGNvZGUgaXMgaW4gR0RCLgorJQorJS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRocmVlIGNvbHVtbiBmb3JtYXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJSUlJSAtLS0gVG8gZGlzYWJsZSB0aHJlZSBjb2x1bW4gZm9ybWF0LCBjb21tZW50IG91dCB0aGlzIGVudGlyZSBzZWN0aW9uCisKKyUgVGhyZWUtY29sdW1uIGZvcm1hdCBmb3IgbGFuZHNjYXBlIHByaW50aW5nCisKKyUtLS0tLS0tLSBQYXBlcnNpemUgZGVmczoKKworXG5ld2RpbWVuXHRvdGFsd2lkdGggXG5ld2RpbWVuXHRvdGFsaGVpZ2h0CitcbmV3ZGltZW5caG1hcmdpbiAgICBcbmV3ZGltZW5cdm1hcmdpbgorXG5ld2RpbWVuXHNlY3NraXAgICAgXG5ld2RpbWVuXGxza2lwCitcbmV3ZGltZW5cYmFyd2lkdGggICBcbmV3ZGltZW5cYmFyaGVpZ2h0CitcbmV3ZGltZW5caW50ZXJzZWN3aWR0aAorCislJQorJSUgIFNUQVJUIENPTkZJR1VSQVRJT04gLSBQQVBFUlNJWkUgREVGSU5JVElPTlMKKyUtLS0tLS0tIFBhcGVyc2l6ZSBwYXJhbXM6CislJSAgVVMgbGV0dGVyIHBhcGVyICg4LjV4MTFpbikKKyUlCitcdG90YWx3aWR0aD0xMWluICAgICUgdG90YWwgd2lkdGggb2YgcGFwZXIKK1x0b3RhbGhlaWdodD04LjVpbiAgJSB0b3RhbCBoZWlnaHQgb2YgcGFwZXIKK1xobWFyZ2luPS4yNWluICAgICAgJSBob3Jpem9udGFsIG1hcmdpbiB3aWR0aAorXHZtYXJnaW49LjI1aW4gICAgICAlIHZlcnRpY2FsIG1hcmdpbiB3aWR0aAorXHNlY3NraXA9MXBjICAgICAgICAlIHNwYWNlIGJldHdlZW4gcmVmY2FyZCBzZWNzCitcbHNraXA9MnB0ICAgICAgICAgICUgZXh0cmEgc2tpcCBiZXR3ZWVuIFxzZWMgZW50cmllcworJS0tLS0tLS0gZW5kIHBhcGVyc2l6ZSBwYXJhbXMKKyUlCislJSAgY2hhbmdlIGFjY29yZGluZyB0byBwZXJzb25hbCB0YXN0ZSwgbm90IHBhcGVyc2l6ZSBkZXBlbmRlbnQKKyUlCitcYmFyd2lkdGg9LjFwdCAgICAgICAlIHdpZHRoIG9mIHRoZSBjcm9wbWFyayBiYXIKK1xiYXJoZWlnaHQ9MnB0ICAgICAgICUgaGVpZ2h0IG9mIHRoZSBjcm9wbWFyayBiYXIKK1xpbnRlcnNlY3dpZHRoPTAuNWVtICUgd2lkdGggYmV0d2VlbiBcaXRtd2lkIGFuZCBcZGZud2lkCislJQorJSUgIEVORCBDT05GSUdVUkFUSU9OIC0gUEFQRVJTSVpFIERFRklOSVRJT05TCislJQorCislJQorJSUgIHZhbHVlcyB0byBiZSBjb21wdXRlZCAtIG5vdGhpbmcgdG8gY29uZmlndXJlCislJQorXG5ld2RpbWVuXGZ1bGxoc2l6ZSAgICAgJSB3aWR0aCBvZiBhcmVhIHdpdGhvdXQgbWFyZ2lucworXG5ld2RpbWVuXGl0bXdpZCAgICAgICAgJSB3aWR0aCBvZiBpdGVtIGNvbHVtbgorXG5ld2RpbWVuXGRmbndpZCAgICAgICAgJSB3aWR0aCBvZiBkZWZpbml0aW9uIGNvbHVtbgorXG5ld2RpbWVuXHRlbXAgICAgICAgICAgJSBvbmx5IGZvciB0ZW1wb3JhcnkgdXNlCisKKyUlCislJSAgYWRqdXN0IHRoZSBvZmZzZXRzIHNvIHRoZSBtYXJnaW5zIGFyZSBtZWFzdXJlZCAqZnJvbSBwYXBlciBlZGdlKgorJSUKK1xob2Zmc2V0PS0xaW4gXGFkdmFuY2UgXGhvZmZzZXQgYnkgXGhtYXJnaW4KK1x2b2Zmc2V0PS0xaW4gXGFkdmFuY2UgXHZvZmZzZXQgYnkgXHZtYXJnaW4KKworJSUKKyUlICBmdWxsaHNpemUgPSB0b3RhbHdpZHRoIC0gKDIgKiBobWFyZ2luKQorJSUKK1xmdWxsaHNpemU9XHRvdGFsd2lkdGgKK1x0ZW1wPVxobWFyZ2luIFxtdWx0aXBseSBcdGVtcCBieSAyIFxhZHZhbmNlIFxmdWxsaHNpemUgYnkgLVx0ZW1wCisKKyUlCislJSAgaHNpemUgPSAoZnVsbGhzaXplIC0gKDQgKiBobWFyZ2luKSAtICgyICogYmFyd2lkdGgpKSAvIDMKKyUlCitcaHNpemU9XGZ1bGxoc2l6ZQorXHRlbXA9XGhtYXJnaW4gXG11bHRpcGx5IFx0ZW1wIGJ5IDQgXGFkdmFuY2UgXGhzaXplIGJ5IC1cdGVtcAorXHRlbXA9XGJhcndpZHRoIFxtdWx0aXBseSBcdGVtcCBieSAyIFxhZHZhbmNlIFxoc2l6ZSBieSAtXHRlbXAKK1xkaXZpZGUgXGhzaXplIGJ5IDMKKworJSUKKyUlICB2c2l6ZSA9IHRvdGFsaGVpZ2h0IC0gKDIgKiB2bWFyZ2luKQorJSUKK1x2c2l6ZT1cdG90YWxoZWlnaHQKK1x0ZW1wPVx2bWFyZ2luIFxtdWx0aXBseSBcdGVtcCBieSAyIFxhZHZhbmNlIFx2c2l6ZSBieSAtXHRlbXAKKworJSUKKyUlICBpdG13aWQgPSAoaHNpemUgLSBpbnRlcnNlY3dpZHRoKSAqIDEvMworJSUgIGRmbndpZCA9IChoc2l6ZSAtIGludGVyc2Vjd2lkdGgpICogMi8zCislJQorXHRlbXA9XGhzaXplIFxhZHZhbmNlIFx0ZW1wIGJ5IC1caW50ZXJzZWN3aWR0aCBcZGl2aWRlIFx0ZW1wIGJ5IDMKK1xpdG13aWQ9XHRlbXAKK1xkZm53aWQ9XGhzaXplIFxhZHZhbmNlIFxkZm53aWQgYnkgLVxpdG13aWQKKworJS0tLS0tLS0tIGVuZCBwYXBlcnNpemUgZGVmcworCisKK1xkZWZcZnVsbGluZXtcaGJveCB0byBcZnVsbGhzaXplfQorXGxldFxsY3I9TCBcbmV3Ym94XGxlZnRjb2x1bW5cbmV3Ym94XGNlbnRlcmNvbHVtbgorXG91dHB1dD17XGlmIExcbGNyCisgICAgICAgICAgICBcZ2xvYmFsXHNldGJveFxsZWZ0Y29sdW1uPVxjb2x1bW5ib3ggXGdsb2JhbFxsZXRcbGNyPUMKKwkgXGVsc2UKKyAgICAgICAgICAgIFxpZiBDXGxjcgorICAgICAgICAgICAgICAgXGdsb2JhbFxzZXRib3hcY2VudGVyY29sdW1uPVxjb2x1bW5ib3ggXGdsb2JhbFxsZXRcbGNyPVIKKyAgICAgICAgICAgIFxlbHNlIFx0cmlwbGVmb3JtYXQgXGdsb2JhbFxsZXRcbGNyPUwKKyAgICAgICAgICAgIFxmaQorICAgICAgICAgXGZpCislICAgICAgICAgXGlmbnVtXG91dHB1dHBlbmFsdHk+LTIwMDAwIFxlbHNlXGRvc3VwZXJlamVjdFxmaQorICAgICAgfQorCislJQorJSUgIFNUQVJUIENPTkZJR1VSQVRJT04gLSBBTFRFUk5BVElWRSBGT0xESU5HIEdVSURFUworJSUKKyUlICBGb3IgTk8gcHJpbnRlZCBmb2xkaW5nIGd1aWRlLAorJSUgIGNvbW1lbnQgb3V0IG90aGVyIFxkZWZcdmRlY29yJ3MgYW5kIHVuY29tbWVudDoKKworJVxkZWZcdmRlY29ye1xoc2tpcFxobWFyZ2luIHBsdXMxZmlsXGhza2lwXGJhcndpZHRoIHBsdXMxZmlsXGhza2lwXGhtYXJnaW4gcGx1czFmaWx9CisKKyUlICBGb3IgU09MSUQgTElORSBmb2xkaW5nIGd1aWRlLAorJSUgIGNvbW1lbnQgb3V0IG90aGVyIFxkZWZcdmRlY29yJ3MgYW5kIHVuY29tbWVudDoKKworJVxkZWZcdmRlY29ye1xoc2tpcFxobWFyZ2luIHBsdXMxZmlsIFx2cnVsZSB3aWR0aCBcYmFyd2lkdGggXGhza2lwXGhtYXJnaW4gcGx1czFmaWx9CisKKyUlICBGb3IgU01BTEwgTUFSS1MgTkVBUiBUT1AgQU5EIEJPVFRPTSBhcyBmb2xkaW5nIGd1aWRlLAorJSUgIGNvbW1lbnQgb3V0IG90aGVyIFxkZWZcdmRlY29yJ3MgYW5kIHVuY29tbWVudDoKKworXGRlZlx2ZGVjb3J7XGhza2lwXGhtYXJnaW4gcGx1czFmaWwKK1x2Ym94IHRvIFx2c2l6ZXtcaGJveCB0byBcYmFyd2lkdGh7XHZydWxlIGhlaWdodFxiYXJoZWlnaHQgd2lkdGhcYmFyd2lkdGh9XHZmaWxsCitcaGJveCB0byBcYmFyd2lkdGh7XHZydWxlIGhlaWdodFxiYXJoZWlnaHQgd2lkdGhcYmFyd2lkdGh9fSVUSElTIFBFUkNFTlQgU0lHTiBJUyBFU1NFTlRJQUwKK1xoc2tpcFxobWFyZ2luIHBsdXMxZmlsfQorCislJQorJSUgIEVORCBDT05GSUdVUkFUSU9OIC0gQUxURVJOQVRJVkVTIEZPUiBGT0xESU5HIEdVSURFUworJSUKKworXGRlZlx0cmlwbGVmb3JtYXR7XHNoaXBvdXRcdmJveHtcZnVsbGluZXtcYm94XGxlZnRjb2x1bW5cdmRlY29yCisJCQkJCSBcYm94XGNlbnRlcmNvbHVtblx2ZGVjb3IKKwkJCQkJIFxjb2x1bW5ib3h9CisJCQkgICAgICAgfQorICAgICAgICAgICAgICAgICBcYWR2YW5jZXBhZ2Vub30KK1xkZWZcY29sdW1uYm94e1xsZWZ0bGluZXtccGFnZWJvZHl9fQorXGRlZlxieWV7XHBhclx2ZmlsbAorICAgICAgICAgXHN1cGVyZWplY3QKKyAgICAgICAgIFxpZiBSXGxjciBcbnVsbFx2ZmlsbFxlamVjdFxmaQorICAgICAgICAgXGVuZH0KKworJS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVuZCB0aHJlZSBjb2x1bW4gZm9ybWF0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyUtLS0tLS0tLS0tLS0tLS0tLS0tLSBDb21wdXRlciBNb2Rlcm4gZm9udCBkZWZzOiAtLS0tLS0tLS0tLS0tLS0tLS0tLQorXGZvbnRcYmJmPWNtYngxMAorXGZvbnRcdmJiZj1jbWJ4MTIKK1xmb250XHNtcm09Y21yNgorXGZvbnRcYnJtPWNtcjEwCitcZm9udFxybT1jbXI3CitcZm9udFxpdD1jbXRpNworXGZvbnRcdHQ9Y210dDgKKyUtLS0tLS0tLS0tLS0tLS0tLS0tLSBlbmQgZm9udCBkZWZzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislCitcaHlwaGVucGVuYWx0eT01MDAwXHRvbGVyYW5jZT0yMDAwXHJhZ2dlZHJpZ2h0XHJhZ2dlZGJvdHRvbQorXG5vcm1hbGJhc2VsaW5lc2tpcD05cHRcYmFzZWxpbmVza2lwPTlwdAorJQorXHBhcmluZGVudD0wcHQKK1xwYXJza2lwPTBwdAorXGZvb3RsaW5lPXtcdmJveCB0bzBwdHtcaHNzfX0KKyUKK1xkZWZcY3RsIzF7e1x0dCBDLSMxfX0KK1xkZWZcb3B0IzF7e1xicm1be1xybSAjMX1dfX0KK1xkZWZceHRyYSMxe1xub2FsaWdue1xzbWFsbHNraXB7XHR0IzF9fX0KKyUKK1xsb25nXGRlZlxzZWMjMTsjMlxlbmRzZWN7XHZza2lwIFxzZWNza2lwCitcaGFsaWdueyUKKyVDT0wgMSAob2YgaGFsaWduKToKK1x2dG9we1xoc2l6ZT1caXRtd2lkXHR0CisjI1xwYXJcdnNraXAgXGxza2lwIH1caGZpbAorJUNPTCAyIChvZiBoYWxpZ24pOgorJlx2dG9we1xoc2l6ZT1cZGZud2lkXGhhbmdhZnRlcj0xXGhhbmdpbmRlbnQ9XGludGVyc2Vjd2lkdGgKK1xybSAjI1xwYXJcdnNraXAgXGxza2lwfVxjcgorJVRhaWwgb2YgXGxvbmdcZGVmIGZpbGxzIGluIGhhbGlnbiBib2R5IHdpdGggXHNlYyBhcmdzOgorXG5vYWxpZ257e1xiYmYgIzF9XHZza2lwIFxsc2tpcH0KKyMyCit9Cit9CisKK3tcdmJiZiBHREIgUVVJQ0sgUkVGRVJFTkNFfVxoZmlse1xzbXJtIEdEQiBWZXJzaW9uIDR9XHFxdWFkCisKK1xzZWMgRXNzZW50aWFsIENvbW1hbmRzOworZ2RiIHtcaXQgcHJvZ3JhbX0gXG9wdHt7XGl0IGNvcmV9fSZkZWJ1ZyB7XGl0IHByb2dyYW19IFxvcHR7dXNpbmcKK2NvcmVkdW1wIHtcaXQgY29yZX19XGNyCitiIFxvcHR7XGl0IGZpbGVcdHQ6fXtcaXQgZnVuY3Rpb259JnNldCBicmVha3BvaW50IGF0IHtcaXQgZnVuY3Rpb259IFxvcHR7aW4gXGl0IGZpbGV9XGNyCitydW4gXG9wdHt7XGl0IGFyZ2xpc3R9fSZzdGFydCB5b3VyIHByb2dyYW0gXG9wdHt3aXRoIHtcaXQgYXJnbGlzdH19XGNyCitidCYgYmFja3RyYWNlOiBkaXNwbGF5IHByb2dyYW0gc3RhY2tcY3IKK3Age1xpdCBleHByfSZkaXNwbGF5IHRoZSB2YWx1ZSBvZiBhbiBleHByZXNzaW9uXGNyCitjICZjb250aW51ZSBydW5uaW5nIHlvdXIgcHJvZ3JhbVxjcgorbiAmbmV4dCBsaW5lLCBzdGVwcGluZyBvdmVyIGZ1bmN0aW9uIGNhbGxzXGNyCitzICZuZXh0IGxpbmUsIHN0ZXBwaW5nIGludG8gZnVuY3Rpb24gY2FsbHNcY3IKK1xlbmRzZWMKKworXHNlYyBTdGFydGluZyBHREI7CitnZGImc3RhcnQgR0RCLCB3aXRoIG5vIGRlYnVnZ2luZyBmaWxlc1xjcgorZ2RiIHtcaXQgcHJvZ3JhbX0mYmVnaW4gZGVidWdnaW5nIHtcaXQgcHJvZ3JhbX1cY3IKK2dkYiB7XGl0IHByb2dyYW0gY29yZX0mZGVidWcgY29yZWR1bXAge1xpdCBjb3JlfSBwcm9kdWNlZCBieSB7XGl0Citwcm9ncmFtfVxjcgorZ2RiIC0taGVscCZkZXNjcmliZSBjb21tYW5kIGxpbmUgb3B0aW9uc1xjcgorXGVuZHNlYworCitcc2VjIFN0b3BwaW5nIEdEQjsKK3F1aXQmZXhpdCBHREI7IGFsc28ge1x0dCBxfSBvciB7XHR0IEVPRn0gKGVnIFxjdGx7ZH0pXGNyCitJTlRFUlJVUFQmKGVnIFxjdGx7Y30pIHRlcm1pbmF0ZSBjdXJyZW50IGNvbW1hbmQsIG9yIHNlbmQgdG8gcnVubmluZyBwcm9jZXNzXGNyCitcZW5kc2VjCisKK1xzZWMgR2V0dGluZyBIZWxwOworaGVscCZsaXN0IGNsYXNzZXMgb2YgY29tbWFuZHNcY3IKK2hlbHAge1xpdCBjbGFzc30mb25lLWxpbmUgZGVzY3JpcHRpb25zIGZvciBjb21tYW5kcyBpbiB7XGl0IGNsYXNzfVxjcgoraGVscCB7XGl0IGNvbW1hbmR9JmRlc2NyaWJlIHtcaXQgY29tbWFuZH1cY3IKK1xlbmRzZWMKKworXHNlYyBFeGVjdXRpbmcgeW91ciBQcm9ncmFtOworcnVuIHtcaXQgYXJnbGlzdH0mc3RhcnQgeW91ciBwcm9ncmFtIHdpdGgge1xpdCBhcmdsaXN0fVxjcgorcnVuJnN0YXJ0IHlvdXIgcHJvZ3JhbSB3aXRoIGN1cnJlbnQgYXJndW1lbnQgbGlzdFxjcgorcnVuICRcbGRvdHMkIDx7XGl0IGluZn0gPntcaXQgb3V0Zn0mc3RhcnQgeW91ciBwcm9ncmFtIHdpdGggaW5wdXQsIG91dHB1dAorcmVkaXJlY3RlZFxjcgorXGNyCitraWxsJmtpbGwgcnVubmluZyBwcm9ncmFtXGNyCitcY3IKK3R0eSB7XGl0IGRldn0mdXNlIHtcaXQgZGV2fSBhcyBzdGRpbiBhbmQgc3Rkb3V0IGZvciBuZXh0IHtcdHQgcnVufVxjcgorc2V0IGFyZ3Mge1xpdCBhcmdsaXN0fSZzcGVjaWZ5IHtcaXQgYXJnbGlzdH0gZm9yIG5leHQKK3tcdHQgcnVufVxjcgorc2V0IGFyZ3Mmc3BlY2lmeSBlbXB0eSBhcmd1bWVudCBsaXN0XGNyCitzaG93IGFyZ3MmZGlzcGxheSBhcmd1bWVudCBsaXN0XGNyCitcY3IKK3Nob3cgZW52JnNob3cgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlc1xjcgorc2hvdyBlbnYge1xpdCB2YXJ9JnNob3cgdmFsdWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUge1xpdCB2YXJ9XGNyCitzZXQgZW52IHtcaXQgdmFyfSB7XGl0IHN0cmluZ30mc2V0IGVudmlyb25tZW50IHZhcmlhYmxlIHtcaXQgdmFyfVxjcgordW5zZXQgZW52IHtcaXQgdmFyfSZyZW1vdmUge1xpdCB2YXJ9IGZyb20gZW52aXJvbm1lbnRcY3IKK1xlbmRzZWMKKworXHNlYyBTaGVsbCBDb21tYW5kczsKK2NkIHtcaXQgZGlyfSZjaGFuZ2Ugd29ya2luZyBkaXJlY3RvcnkgdG8ge1xpdCBkaXJ9XGNyCitwd2QmUHJpbnQgd29ya2luZyBkaXJlY3RvcnlcY3IKK21ha2UgJFxsZG90cyQmY2FsbCBgYHtcdHQgbWFrZX0nJ1xjcgorc2hlbGwge1xpdCBjbWR9JmV4ZWN1dGUgYXJiaXRyYXJ5IHNoZWxsIGNvbW1hbmQgc3RyaW5nXGNyCitcZW5kc2VjCisKK1x2ZmlsbAorXGxpbmV7XHNtcm0gXG9wdHsgfSBzdXJyb3VuZCBvcHRpb25hbCBhcmd1bWVudHMgXGhmaWxsICRcbGRvdHMkIHNob3cKK29uZSBvciBtb3JlIGFyZ3VtZW50c30KK1x2c2tpcFxiYXNlbGluZXNraXAKK1xjZW50ZXJsaW5le1xzbXJtIFxjb3B5cmlnaHQgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5ccXF1YWQgUGVybWlzc2lvbnMgb24gYmFja30KK1xlamVjdAorXHNlYyBCcmVha3BvaW50cyBhbmQgV2F0Y2hwb2ludHM7CiticmVhayBcb3B0e1xpdCBmaWxlXHR0On17XGl0IGxpbmV9XHBhcgorYiBcb3B0e1xpdCBmaWxlXHR0On17XGl0IGxpbmV9JnNldCBicmVha3BvaW50IGF0IHtcaXQgbGluZX0gbnVtYmVyIFxvcHR7aW4gXGl0IGZpbGV9XHBhciAKK2VnOlxxdWFke1x0dCBicmVhayBtYWluLmM6Mzd9XHF1YWRcY3IKK2JyZWFrIFxvcHR7XGl0IGZpbGVcdHQ6fXtcaXQgZnVuY30mc2V0IGJyZWFrcG9pbnQgYXQge1xpdAorZnVuY30gXG9wdHtpbiBcaXQgZmlsZX1cY3IKK2JyZWFrICt7XGl0IG9mZnNldH1ccGFyCiticmVhayAte1xpdCBvZmZzZXR9JnNldCBicmVhayBhdCB7XGl0IG9mZnNldH0gbGluZXMgZnJvbSBjdXJyZW50IHN0b3BcY3IKK2JyZWFrICp7XGl0IGFkZHJ9JnNldCBicmVha3BvaW50IGF0IGFkZHJlc3Mge1xpdCBhZGRyfVxjcgorYnJlYWsmc2V0IGJyZWFrcG9pbnQgYXQgbmV4dCBpbnN0cnVjdGlvblxjcgorYnJlYWsgJFxsZG90cyQgaWYge1xpdCBleHByfSZicmVhayBjb25kaXRpb25hbGx5IG9uIG5vbnplcm8ge1xpdCBleHByfVxjcgorY29uZCB7XGl0IG59IFxvcHR7XGl0IGV4cHJ9Jm5ldyBjb25kaXRpb25hbCBleHByZXNzaW9uIG9uIGJyZWFrcG9pbnQKK3tcaXQgbn07IG1ha2UgdW5jb25kaXRpb25hbCBpZiBubyB7XGl0IGV4cHJ9XGNyCit0YnJlYWsgJFxsZG90cyQmdGVtcG9yYXJ5IGJyZWFrOyBkaXNhYmxlIHdoZW4gcmVhY2hlZFxjcgorcmJyZWFrIHtcaXQgcmVnZXh9JmJyZWFrIG9uIGFsbCBmdW5jdGlvbnMgbWF0Y2hpbmcge1xpdCByZWdleH1cY3IKK3dhdGNoIHtcaXQgZXhwcn0mc2V0IGEgd2F0Y2hwb2ludCBmb3IgZXhwcmVzc2lvbiB7XGl0IGV4cHJ9XGNyCitjYXRjaCB7XGl0IGV2ZW50fSZicmVhayBhdCB7XGl0IGV2ZW50fSwgd2hpY2ggbWF5IGJlIHtcdHQgY2F0Y2h9LCB7XHR0IHRocm93fSwKK3tcdHQgZXhlY30sIHtcdHQgZm9ya30sIHtcdHQgdmZvcmt9LCB7XHR0IGxvYWR9LCBvciB7XHR0IHVubG9hZH0uXGNyCitcY3IKK2luZm8gYnJlYWsmc2hvdyBkZWZpbmVkIGJyZWFrcG9pbnRzXGNyCitpbmZvIHdhdGNoJnNob3cgZGVmaW5lZCB3YXRjaHBvaW50c1xjcgorXGNyCitjbGVhciZkZWxldGUgYnJlYWtwb2ludHMgYXQgbmV4dCBpbnN0cnVjdGlvblxjcgorY2xlYXIgXG9wdHtcaXQgZmlsZVx0dDp9e1xpdCBmdW59JmRlbGV0ZSBicmVha3BvaW50cyBhdCBlbnRyeSB0byB7XGl0IGZ1bn0oKVxjcgorY2xlYXIgXG9wdHtcaXQgZmlsZVx0dDp9e1xpdCBsaW5lfSZkZWxldGUgYnJlYWtwb2ludHMgb24gc291cmNlIGxpbmUgXGNyCitkZWxldGUgXG9wdHt7XGl0IG59fSZkZWxldGUgYnJlYWtwb2ludHMKK1xvcHR7b3IgYnJlYWtwb2ludCB7XGl0IG59fVxjcgorXGNyCitkaXNhYmxlIFxvcHR7e1xpdCBufX0mZGlzYWJsZSBicmVha3BvaW50cworXG9wdHtvciBicmVha3BvaW50IHtcaXQgbn19CitcY3IKK2VuYWJsZSBcb3B0e3tcaXQgbn19JmVuYWJsZSBicmVha3BvaW50cyAKK1xvcHR7b3IgYnJlYWtwb2ludCB7XGl0IG59fQorXGNyCitlbmFibGUgb25jZSBcb3B0e3tcaXQgbn19JmVuYWJsZSBicmVha3BvaW50cyBcb3B0e29yIGJyZWFrcG9pbnQge1xpdCBufX07IAorZGlzYWJsZSBhZ2FpbiB3aGVuIHJlYWNoZWQKK1xjcgorZW5hYmxlIGRlbCBcb3B0e3tcaXQgbn19JmVuYWJsZSBicmVha3BvaW50cyBcb3B0e29yIGJyZWFrcG9pbnQge1xpdCBufX07IAorZGVsZXRlIHdoZW4gcmVhY2hlZAorXGNyCitcY3IKK2lnbm9yZSB7XGl0IG59IHtcaXQgY291bnR9Jmlnbm9yZSBicmVha3BvaW50IHtcaXQgbn0sIHtcaXQgY291bnR9Cit0aW1lc1xjcgorXGNyCitjb21tYW5kcyB7XGl0IG59XHBhcgorXHFxdWFkIFxvcHR7XHR0IHNpbGVudH1ccGFyCitccXF1YWQge1xpdCBjb21tYW5kLWxpc3R9JmV4ZWN1dGUgR0RCIHtcaXQgY29tbWFuZC1saXN0fSBldmVyeSB0aW1lIGJyZWFrcG9pbnQge1xpdCBufSBpcyByZWFjaGVkLiBcb3B0e3tcdHQgc2lsZW50fSBzdXBwcmVzc2VzIGRlZmF1bHQKK2Rpc3BsYXl9XGNyCitlbmQmZW5kIG9mIHtcaXQgY29tbWFuZC1saXN0fVxjcgorXGVuZHNlYworCitcc2VjIFByb2dyYW0gU3RhY2s7CitiYWNrdHJhY2UgXG9wdHtcaXQgbn1ccGFyCitidCBcb3B0e1xpdCBufSZwcmludCB0cmFjZSBvZiBhbGwgZnJhbWVzIGluIHN0YWNrOyBvciBvZiB7XGl0IG59CitmcmFtZXMtLS1pbm5lcm1vc3QgaWYge1xpdCBufXtcdHQgPjB9LCBvdXRlcm1vc3QgaWYge1xpdCBufXtcdHQgPDB9XGNyCitmcmFtZSBcb3B0e1xpdCBufSZzZWxlY3QgZnJhbWUgbnVtYmVyIHtcaXQgbn0gb3IgZnJhbWUgYXQgYWRkcmVzcyB7XGl0CitufTsgaWYgbm8ge1xpdCBufSwgZGlzcGxheSBjdXJyZW50IGZyYW1lXGNyCit1cCB7XGl0IG59JnNlbGVjdCBmcmFtZSB7XGl0IG59IGZyYW1lcyB1cFxjcgorZG93biB7XGl0IG59JnNlbGVjdCBmcmFtZSB7XGl0IG59IGZyYW1lcyBkb3duXGNyCitpbmZvIGZyYW1lIFxvcHR7XGl0IGFkZHJ9JmRlc2NyaWJlIHNlbGVjdGVkIGZyYW1lLCBvciBmcmFtZSBhdAore1xpdCBhZGRyfVxjcgoraW5mbyBhcmdzJmFyZ3VtZW50cyBvZiBzZWxlY3RlZCBmcmFtZVxjcgoraW5mbyBsb2NhbHMmbG9jYWwgdmFyaWFibGVzIG9mIHNlbGVjdGVkIGZyYW1lXGNyCitpbmZvIHJlZyBcb3B0e1xpdCBybn0kXGxkb3RzJFxwYXIKK2luZm8gYWxsLXJlZyBcb3B0e1xpdCBybn0mcmVnaXN0ZXIgdmFsdWVzIFxvcHR7Zm9yIHJlZ3Mge1xpdCByblwvfX0gaW4KK3NlbGVjdGVkIGZyYW1lOyB7XHR0IGFsbC1yZWd9IGluY2x1ZGVzIGZsb2F0aW5nIHBvaW50XGNyCitcZW5kc2VjCisKK1x2ZmlsbFxlamVjdAorXHNlYyBFeGVjdXRpb24gQ29udHJvbDsKK2NvbnRpbnVlIFxvcHR7XGl0IGNvdW50fVxwYXIKK2MgXG9wdHtcaXQgY291bnR9JmNvbnRpbnVlIHJ1bm5pbmc7IGlmIHtcaXQgY291bnR9IHNwZWNpZmllZCwgaWdub3JlCit0aGlzIGJyZWFrcG9pbnQgbmV4dCB7XGl0IGNvdW50fSB0aW1lc1xjcgorXGNyCitzdGVwIFxvcHR7XGl0IGNvdW50fVxwYXIKK3MgXG9wdHtcaXQgY291bnR9JmV4ZWN1dGUgdW50aWwgYW5vdGhlciBsaW5lIHJlYWNoZWQ7IHJlcGVhdCB7XGl0IGNvdW50fSB0aW1lcyBpZgorc3BlY2lmaWVkXGNyCitzdGVwaSBcb3B0e1xpdCBjb3VudH1ccGFyCitzaSBcb3B0e1xpdCBjb3VudH0mc3RlcCBieSBtYWNoaW5lIGluc3RydWN0aW9ucyByYXRoZXIgdGhhbiBzb3VyY2UKK2xpbmVzXGNyCitcY3IKK25leHQgXG9wdHtcaXQgY291bnR9XHBhcgorbiBcb3B0e1xpdCBjb3VudH0mZXhlY3V0ZSBuZXh0IGxpbmUsIGluY2x1ZGluZyBhbnkgZnVuY3Rpb24gY2FsbHNcY3IKK25leHRpIFxvcHR7XGl0IGNvdW50fVxwYXIKK25pIFxvcHR7XGl0IGNvdW50fSZuZXh0IG1hY2hpbmUgaW5zdHJ1Y3Rpb24gcmF0aGVyIHRoYW4gc291cmNlCitsaW5lXGNyCitcY3IKK3VudGlsIFxvcHR7XGl0IGxvY2F0aW9ufSZydW4gdW50aWwgbmV4dCBpbnN0cnVjdGlvbiAob3Ige1xpdAorbG9jYXRpb259KVxjcgorZmluaXNoJnJ1biB1bnRpbCBzZWxlY3RlZCBzdGFjayBmcmFtZSByZXR1cm5zXGNyCityZXR1cm4gXG9wdHtcaXQgZXhwcn0mcG9wIHNlbGVjdGVkIHN0YWNrIGZyYW1lIHdpdGhvdXQgZXhlY3V0aW5nCitcb3B0e3NldHRpbmcgcmV0dXJuIHZhbHVlfVxjcgorc2lnbmFsIHtcaXQgbnVtfSZyZXN1bWUgZXhlY3V0aW9uIHdpdGggc2lnbmFsIHtcaXQgc30gKG5vbmUgaWYge1x0dCAwfSlcY3IKK2p1bXAge1xpdCBsaW5lfVxwYXIKK2p1bXAgKntcaXQgYWRkcmVzc30mcmVzdW1lIGV4ZWN1dGlvbiBhdCBzcGVjaWZpZWQge1xpdCBsaW5lfSBudW1iZXIgb3IKK3tcaXQgYWRkcmVzc31cY3IKK3NldCB2YXI9e1xpdCBleHByfSZldmFsdWF0ZSB7XGl0IGV4cHJ9IHdpdGhvdXQgZGlzcGxheWluZyBpdDsgdXNlIGZvcgorYWx0ZXJpbmcgcHJvZ3JhbSB2YXJpYWJsZXNcY3IKK1xlbmRzZWMKKworXHNlYyBEaXNwbGF5OworcHJpbnQgXG9wdHtcdHQve1xpdCBmfVwvfSBcb3B0e1xpdCBleHByfVxwYXIKK3AgXG9wdHtcdHQve1xpdCBmfVwvfSBcb3B0e1xpdCBleHByfSZzaG93IHZhbHVlIG9mIHtcaXQgZXhwcn0gXG9wdHtvcgorbGFzdCB2YWx1ZSBcdHQgXCR9IGFjY29yZGluZyB0byBmb3JtYXQge1xpdCBmfTpcY3IKK1xxcXVhZCB4JmhleGFkZWNpbWFsXGNyCitccXF1YWQgZCZzaWduZWQgZGVjaW1hbFxjcgorXHFxdWFkIHUmdW5zaWduZWQgZGVjaW1hbFxjcgorXHFxdWFkIG8mb2N0YWxcY3IKK1xxcXVhZCB0JmJpbmFyeVxjcgorXHFxdWFkIGEmYWRkcmVzcywgYWJzb2x1dGUgYW5kIHJlbGF0aXZlXGNyCitccXF1YWQgYyZjaGFyYWN0ZXJcY3IKK1xxcXVhZCBmJmZsb2F0aW5nIHBvaW50XGNyCitjYWxsIFxvcHR7XHR0IC97XGl0IGZ9XC99IHtcaXQgZXhwcn0mbGlrZSB7XHR0IHByaW50fSBidXQgZG9lcyBub3QgZGlzcGxheQore1x0dCB2b2lkfVxjcgoreCBcb3B0e1x0dC97XGl0IE51Zn1cL30ge1xpdCBleHByfSZleGFtaW5lIG1lbW9yeSBhdCBhZGRyZXNzIHtcaXQgZXhwcn07CitvcHRpb25hbCBmb3JtYXQgc3BlYyBmb2xsb3dzIHNsYXNoXGNyCitccXVhZCB7XGl0IE59JmNvdW50IG9mIGhvdyBtYW55IHVuaXRzIHRvIGRpc3BsYXlcY3IKK1xxdWFkIHtcaXQgdX0mdW5pdCBzaXplOyBvbmUgb2ZcY3IKKyZ7XHR0XHFxdWFkIGJ9XCBpbmRpdmlkdWFsIGJ5dGVzXGNyCisme1x0dFxxcXVhZCBofVwgaGFsZndvcmRzICh0d28gYnl0ZXMpXGNyCisme1x0dFxxcXVhZCB3fVwgd29yZHMgKGZvdXIgYnl0ZXMpXGNyCisme1x0dFxxcXVhZCBnfVwgZ2lhbnQgd29yZHMgKGVpZ2h0IGJ5dGVzKVxjcgorXHF1YWQge1xpdCBmfSZwcmludGluZyBmb3JtYXQuICBBbnkge1x0dCBwcmludH0gZm9ybWF0LCBvclxjcgorJntcdHRccXF1YWQgc31cIG51bGwtdGVybWluYXRlZCBzdHJpbmdcY3IKKyZ7XHR0XHFxdWFkIGl9XCBtYWNoaW5lIGluc3RydWN0aW9uc1xjcgorZGlzYXNzZW0gXG9wdHtcaXQgYWRkcn0mZGlzcGxheSBtZW1vcnkgYXMgbWFjaGluZSBpbnN0cnVjdGlvbnNcY3IKK1xlbmRzZWMKKworXHNlYyBBdXRvbWF0aWMgRGlzcGxheTsKK2Rpc3BsYXkgXG9wdHtcdHQvXGl0IGZcL30ge1xpdCBleHByfSZzaG93IHZhbHVlIG9mIHtcaXQgZXhwcn0gZWFjaCB0aW1lCitwcm9ncmFtIHN0b3BzIFxvcHR7YWNjb3JkaW5nIHRvIGZvcm1hdCB7XGl0IGZ9XC99XGNyCitkaXNwbGF5JmRpc3BsYXkgYWxsIGVuYWJsZWQgZXhwcmVzc2lvbnMgb24gbGlzdFxjcgordW5kaXNwbGF5IHtcaXQgbn0mcmVtb3ZlIG51bWJlcihzKSB7XGl0IG59IGZyb20gbGlzdCBvZgorYXV0b21hdGljYWxseSBkaXNwbGF5ZWQgZXhwcmVzc2lvbnNcY3IKK2Rpc2FibGUgZGlzcCB7XGl0IG59JmRpc2FibGUgZGlzcGxheSBmb3IgZXhwcmVzc2lvbihzKSBudW1iZXIge1xpdAorbn1cY3IKK2VuYWJsZSBkaXNwIHtcaXQgbn0mZW5hYmxlIGRpc3BsYXkgZm9yIGV4cHJlc3Npb24ocykgbnVtYmVyIHtcaXQKK259XGNyCitpbmZvIGRpc3BsYXkmbnVtYmVyZWQgbGlzdCBvZiBkaXNwbGF5IGV4cHJlc3Npb25zXGNyCitcZW5kc2VjCisKK1x2ZmlsbFxlamVjdAorCitcc2VjIEV4cHJlc3Npb25zOwore1xpdCBleHByfSZhbiBleHByZXNzaW9uIGluIEMsIEMrKywgb3IgTW9kdWxhLTIgKGluY2x1ZGluZyBmdW5jdGlvbiBjYWxscyksIG9yOlxjcgore1xpdCBhZGRyXC99QHtcaXQgbGVufSZhbiBhcnJheSBvZiB7XGl0IGxlbn0gZWxlbWVudHMgYmVnaW5uaW5nIGF0IHtcaXQKK2FkZHJ9XGNyCit7XGl0IGZpbGV9Ojp7XGl0IG5tfSZhIHZhcmlhYmxlIG9yIGZ1bmN0aW9uIHtcaXQgbm19IGRlZmluZWQgaW4ge1xpdAorZmlsZX1cY3IKKyRcdHRceyR7XGl0IHR5cGV9JFx0dFx9JHtcaXQgYWRkcn0mcmVhZCBtZW1vcnkgYXQge1xpdCBhZGRyfSBhcyBzcGVjaWZpZWQKK3tcaXQgdHlwZX1cY3IKK1wkJm1vc3QgcmVjZW50IGRpc3BsYXllZCB2YWx1ZVxjcgorXCR7XGl0IG59JntcaXQgbn10aCBkaXNwbGF5ZWQgdmFsdWVcY3IKK1wkXCQmZGlzcGxheWVkIHZhbHVlIHByZXZpb3VzIHRvIFwkXGNyCitcJFwke1xpdCBufSZ7XGl0IG59dGggZGlzcGxheWVkIHZhbHVlIGJhY2sgZnJvbSBcJFxjcgorXCRcXyZsYXN0IGFkZHJlc3MgZXhhbWluZWQgd2l0aCB7XHR0IHh9XGNyCitcJFxfXF8mdmFsdWUgYXQgYWRkcmVzcyBcJFxfXGNyCitcJHtcaXQgdmFyfSZjb252ZW5pZW5jZSB2YXJpYWJsZTsgYXNzaWduIGFueSB2YWx1ZVxjcgorXGNyCitzaG93IHZhbHVlcyBcb3B0e3tcaXQgbn19JnNob3cgbGFzdCAxMCB2YWx1ZXMgXG9wdHtvciBzdXJyb3VuZGluZworXCR7XGl0IG59fVxjcgorc2hvdyBjb252JmRpc3BsYXkgYWxsIGNvbnZlbmllbmNlIHZhcmlhYmxlc1xjcgorXGVuZHNlYworCitcc2VjIFN5bWJvbCBUYWJsZTsKK2luZm8gYWRkcmVzcyB7XGl0IHN9JnNob3cgd2hlcmUgc3ltYm9sIHtcaXQgc30gaXMgc3RvcmVkXGNyCitpbmZvIGZ1bmMgXG9wdHtcaXQgcmVnZXh9JnNob3cgbmFtZXMsIHR5cGVzIG9mIGRlZmluZWQgZnVuY3Rpb25zCisoYWxsLCBvciBtYXRjaGluZyB7XGl0IHJlZ2V4fSlcY3IKK2luZm8gdmFyIFxvcHR7XGl0IHJlZ2V4fSZzaG93IG5hbWVzLCB0eXBlcyBvZiBnbG9iYWwgdmFyaWFibGVzIChhbGwsCitvciBtYXRjaGluZyB7XGl0IHJlZ2V4fSlcY3IKK3doYXRpcyBcb3B0e1xpdCBleHByfVxwYXIKK3B0eXBlIFxvcHR7XGl0IGV4cHJ9JnNob3cgZGF0YSB0eXBlIG9mIHtcaXQgZXhwcn0gXG9wdHtvciBcdHQgXCR9Cit3aXRob3V0IGV2YWx1YXRpbmc7IHtcdHQgcHR5cGV9IGdpdmVzIG1vcmUgZGV0YWlsXGNyCitwdHlwZSB7XGl0IHR5cGV9JmRlc2NyaWJlIHR5cGUsIHN0cnVjdCwgdW5pb24sIG9yIGVudW1cY3IKK1xlbmRzZWMKKworXHNlYyBHREIgU2NyaXB0czsKK3NvdXJjZSB7XGl0IHNjcmlwdH0mcmVhZCwgZXhlY3V0ZSBHREIgY29tbWFuZHMgZnJvbSBmaWxlIHtcaXQKK3NjcmlwdH1cY3IKK1xjcgorZGVmaW5lIHtcaXQgY21kfVxwYXIKK1xxcXVhZCB7XGl0IGNvbW1hbmQtbGlzdH0mY3JlYXRlIG5ldyBHREIgY29tbWFuZCB7XGl0IGNtZH07IAorZXhlY3V0ZSBzY3JpcHQgZGVmaW5lZCBieSB7XGl0IGNvbW1hbmQtbGlzdH1cY3IKK2VuZCZlbmQgb2Yge1xpdCBjb21tYW5kLWxpc3R9XGNyCitkb2N1bWVudCB7XGl0IGNtZH1ccGFyCitccXF1YWQge1xpdCBoZWxwLXRleHR9JmNyZWF0ZSBvbmxpbmUgZG9jdW1lbnRhdGlvbiAKK2ZvciBuZXcgR0RCIGNvbW1hbmQge1xpdCBjbWR9XGNyCitlbmQmZW5kIG9mIHtcaXQgaGVscC10ZXh0fVxjcgorXGVuZHNlYworCitcc2VjIFNpZ25hbHM7CitoYW5kbGUge1xpdCBzaWduYWx9IHtcaXQgYWN0fSZzcGVjaWZ5IEdEQiBhY3Rpb25zIGZvciB7XGl0IHNpZ25hbH06XGNyCitccXVhZCBwcmludCZhbm5vdW5jZSBzaWduYWxcY3IKK1xxdWFkIG5vcHJpbnQmYmUgc2lsZW50IGZvciBzaWduYWxcY3IKK1xxdWFkIHN0b3AmaGFsdCBleGVjdXRpb24gb24gc2lnbmFsXGNyCitccXVhZCBub3N0b3AmZG8gbm90IGhhbHQgZXhlY3V0aW9uXGNyCitccXVhZCBwYXNzJmFsbG93IHlvdXIgcHJvZ3JhbSB0byBoYW5kbGUgc2lnbmFsXGNyCitccXVhZCBub3Bhc3MmZG8gbm90IGFsbG93IHlvdXIgcHJvZ3JhbSB0byBzZWUgc2lnbmFsXGNyCitpbmZvIHNpZ25hbHMmc2hvdyB0YWJsZSBvZiBzaWduYWxzLCBHREIgYWN0aW9uIGZvciBlYWNoXGNyCitcZW5kc2VjCisKK1xzZWMgRGVidWdnaW5nIFRhcmdldHM7Cit0YXJnZXQge1xpdCB0eXBlfSB7XGl0IHBhcmFtfSZjb25uZWN0IHRvIHRhcmdldCBtYWNoaW5lLCBwcm9jZXNzLCBvciBmaWxlXGNyCitoZWxwIHRhcmdldCZkaXNwbGF5IGF2YWlsYWJsZSB0YXJnZXRzXGNyCithdHRhY2gge1xpdCBwYXJhbX0mY29ubmVjdCB0byBhbm90aGVyIHByb2Nlc3NcY3IKK2RldGFjaCZyZWxlYXNlIHRhcmdldCBmcm9tIEdEQiBjb250cm9sXGNyCitcZW5kc2VjCisKK1x2ZmlsbFxlamVjdAorXHNlYyBDb250cm9sbGluZyBHREI7CitzZXQge1xpdCBwYXJhbX0ge1xpdCB2YWx1ZX0mc2V0IG9uZSBvZiBHREIncyBpbnRlcm5hbCBwYXJhbWV0ZXJzXGNyCitzaG93IHtcaXQgcGFyYW19JmRpc3BsYXkgY3VycmVudCBzZXR0aW5nIG9mIHBhcmFtZXRlclxjcgorXHh0cmF7XHJtIFBhcmFtZXRlcnMgdW5kZXJzdG9vZCBieSB7XHR0IHNldH0gYW5kIHtcdHQgc2hvd306fQorXHF1YWQgY29tcGxhaW50IHtcaXQgbGltaXR9Jm51bWJlciBvZiBtZXNzYWdlcyBvbiB1bnVzdWFsIHN5bWJvbHNcY3IKK1xxdWFkIGNvbmZpcm0ge1xpdCBvbi9vZmZ9JmVuYWJsZSBvciBkaXNhYmxlIGNhdXRpb25hcnkgcXVlcmllc1xjcgorXHF1YWQgZWRpdGluZyB7XGl0IG9uL29mZn0mY29udHJvbCB7XHR0IHJlYWRsaW5lfSBjb21tYW5kLWxpbmUgZWRpdGluZ1xjcgorXHF1YWQgaGVpZ2h0IHtcaXQgbHBwfSZudW1iZXIgb2YgbGluZXMgYmVmb3JlIHBhdXNlIGluIGRpc3BsYXlcY3IKK1xxdWFkIGxhbmd1YWdlIHtcaXQgbGFuZ30mTGFuZ3VhZ2UgZm9yIEdEQiBleHByZXNzaW9ucyAoe1x0dCBhdXRvfSwge1x0dCBjfSBvcgore1x0dCBtb2R1bGEtMn0pXGNyCitccXVhZCBsaXN0c2l6ZSB7XGl0IG59Jm51bWJlciBvZiBsaW5lcyBzaG93biBieSB7XHR0IGxpc3R9XGNyCitccXVhZCBwcm9tcHQge1xpdCBzdHJ9JnVzZSB7XGl0IHN0cn0gYXMgR0RCIHByb21wdFxjcgorXHF1YWQgcmFkaXgge1xpdCBiYXNlfSZvY3RhbCwgZGVjaW1hbCwgb3IgaGV4IG51bWJlciByZXByZXNlbnRhdGlvblxjcgorXHF1YWQgdmVyYm9zZSB7XGl0IG9uL29mZn0mY29udHJvbCBtZXNzYWdlcyB3aGVuIGxvYWRpbmcKK3N5bWJvbHNcY3IKK1xxdWFkIHdpZHRoIHtcaXQgY3BsfSZudW1iZXIgb2YgY2hhcmFjdGVycyBiZWZvcmUgbGluZSBmb2xkZWRcY3IKK1xxdWFkIHdyaXRlIHtcaXQgb24vb2ZmfSZBbGxvdyBvciBmb3JiaWQgcGF0Y2hpbmcgYmluYXJ5LCBjb3JlIGZpbGVzCisod2hlbiByZW9wZW5lZCB3aXRoIHtcdHQgZXhlY30gb3Ige1x0dCBjb3JlfSkKK1xjcgorXHF1YWQgaGlzdG9yeSAkXGxkb3RzJFxwYXIKK1xxdWFkIGggJFxsZG90cyQmZ3JvdXBzIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOlxjcgorXHF1YWQgaCBleHAge1xpdCBvZmYvb259JmRpc2FibGUvZW5hYmxlIHtcdHQgcmVhZGxpbmV9IGhpc3RvcnkgZXhwYW5zaW9uXGNyCitccXVhZCBoIGZpbGUge1xpdCBmaWxlbmFtZX0mZmlsZSBmb3IgcmVjb3JkaW5nIEdEQiBjb21tYW5kIGhpc3RvcnlcY3IKK1xxdWFkIGggc2l6ZSB7XGl0IHNpemV9Jm51bWJlciBvZiBjb21tYW5kcyBrZXB0IGluIGhpc3RvcnkgbGlzdFxjcgorXHF1YWQgaCBzYXZlIHtcaXQgb2ZmL29ufSZjb250cm9sIHVzZSBvZiBleHRlcm5hbCBmaWxlIGZvcgorY29tbWFuZCBoaXN0b3J5XGNyCitcY3IKK1xxdWFkIHByaW50ICRcbGRvdHMkXHBhcgorXHF1YWQgcCAkXGxkb3RzJCZncm91cHMgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6XGNyCitccXVhZCBwIGFkZHJlc3Mge1xpdCBvbi9vZmZ9JnByaW50IG1lbW9yeSBhZGRyZXNzZXMgaW4gc3RhY2tzLAordmFsdWVzXGNyCitccXVhZCBwICBhcnJheSB7XGl0IG9mZi9vbn0mY29tcGFjdCBvciBhdHRyYWN0aXZlIGZvcm1hdCBmb3IKK2FycmF5c1xjcgorXHF1YWQgcCBkZW1hbmdsIHtcaXQgb24vb2ZmfSZzb3VyY2UgKGRlbWFuZ2xlZCkgb3IgaW50ZXJuYWwgZm9ybSBmb3IgQysrCitzeW1ib2xzXGNyCitccXVhZCBwIGFzbS1kZW0ge1xpdCBvbi9vZmZ9JmRlbWFuZ2xlIEMrKyBzeW1ib2xzIGluCittYWNoaW5lLWluc3RydWN0aW9uIG91dHB1dFxjcgorXHF1YWQgcCBlbGVtZW50cyB7XGl0IGxpbWl0fSZudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdG8gZGlzcGxheVxjcgorXHF1YWQgcCBvYmplY3Qge1xpdCBvbi9vZmZ9JnByaW50IEMrKyBkZXJpdmVkIHR5cGVzIGZvciBvYmplY3RzXGNyCitccXVhZCBwIHByZXR0eSB7XGl0IG9mZi9vbn0mc3RydWN0IGRpc3BsYXk6IGNvbXBhY3Qgb3IgaW5kZW50ZWRcY3IKK1xxdWFkIHAgdW5pb24ge1xpdCBvbi9vZmZ9JmRpc3BsYXkgb2YgdW5pb24gbWVtYmVyc1xjcgorXHF1YWQgcCB2dGJsIHtcaXQgb2ZmL29ufSZkaXNwbGF5IG9mIEMrKyB2aXJ0dWFsIGZ1bmN0aW9uCit0YWJsZXNcY3IKK1xjcgorc2hvdyBjb21tYW5kcyZzaG93IGxhc3QgMTAgY29tbWFuZHNcY3IKK3Nob3cgY29tbWFuZHMge1xpdCBufSZzaG93IDEwIGNvbW1hbmRzIGFyb3VuZCBudW1iZXIge1xpdCBufVxjcgorc2hvdyBjb21tYW5kcyArJnNob3cgbmV4dCAxMCBjb21tYW5kc1xjcgorXGVuZHNlYworCitcc2VjIFdvcmtpbmcgRmlsZXM7CitmaWxlIFxvcHR7XGl0IGZpbGV9JnVzZSB7XGl0IGZpbGV9IGZvciBib3RoIHN5bWJvbHMgYW5kIGV4ZWN1dGFibGU7Cit3aXRoIG5vIGFyZywgZGlzY2FyZCBib3RoXGNyCitjb3JlIFxvcHR7XGl0IGZpbGV9JnJlYWQge1xpdCBmaWxlfSBhcyBjb3JlZHVtcDsgb3IgZGlzY2FyZFxjcgorZXhlYyBcb3B0e1xpdCBmaWxlfSZ1c2Uge1xpdCBmaWxlfSBhcyBleGVjdXRhYmxlIG9ubHk7IG9yIGRpc2NhcmRcY3IKK3N5bWJvbCBcb3B0e1xpdCBmaWxlfSZ1c2Ugc3ltYm9sIHRhYmxlIGZyb20ge1xpdCBmaWxlfTsgb3IgZGlzY2FyZFxjcgorbG9hZCB7XGl0IGZpbGV9JmR5bmFtaWNhbGx5IGxpbmsge1xpdCBmaWxlXC99IGFuZCBhZGQgaXRzIHN5bWJvbHNcY3IKK2FkZC1zeW0ge1xpdCBmaWxlfSB7XGl0IGFkZHJ9JnJlYWQgYWRkaXRpb25hbCBzeW1ib2xzIGZyb20ge1xpdCBmaWxlfSwKK2R5bmFtaWNhbGx5IGxvYWRlZCBhdCB7XGl0IGFkZHJ9XGNyCitpbmZvIGZpbGVzJmRpc3BsYXkgd29ya2luZyBmaWxlcyBhbmQgdGFyZ2V0cyBpbiB1c2VcY3IKK3BhdGgge1xpdCBkaXJzfSZhZGQge1xpdCBkaXJzfSB0byBmcm9udCBvZiBwYXRoIHNlYXJjaGVkIGZvcgorZXhlY3V0YWJsZSBhbmQgc3ltYm9sIGZpbGVzXGNyCitzaG93IHBhdGgmZGlzcGxheSBleGVjdXRhYmxlIGFuZCBzeW1ib2wgZmlsZSBwYXRoXGNyCitpbmZvIHNoYXJlJmxpc3QgbmFtZXMgb2Ygc2hhcmVkIGxpYnJhcmllcyBjdXJyZW50bHkgbG9hZGVkXGNyCitcZW5kc2VjCisKK1x2ZmlsbFxlamVjdAorXHNlYyBTb3VyY2UgRmlsZXM7CitkaXIge1xpdCBuYW1lc30mYWRkIGRpcmVjdG9yeSB7XGl0IG5hbWVzfSB0byBmcm9udCBvZiBzb3VyY2UgcGF0aFxjcgorZGlyJmNsZWFyIHNvdXJjZSBwYXRoXGNyCitzaG93IGRpciZzaG93IGN1cnJlbnQgc291cmNlIHBhdGhcY3IKK1xjcgorbGlzdCZzaG93IG5leHQgdGVuIGxpbmVzIG9mIHNvdXJjZVxjcgorbGlzdCAtJnNob3cgcHJldmlvdXMgdGVuIGxpbmVzXGNyCitsaXN0IHtcaXQgbGluZXN9JmRpc3BsYXkgc291cmNlIHN1cnJvdW5kaW5nIHtcaXQgbGluZXN9LCAKK3NwZWNpZmllZCBhczpcY3IKK1xxdWFke1xvcHR7XGl0IGZpbGVcdHQ6fVxpdCBudW19JmxpbmUgbnVtYmVyIFxvcHR7aW4gbmFtZWQgZmlsZX1cY3IKK1xxdWFke1xvcHR7XGl0IGZpbGVcdHQ6fVxpdCBmdW5jdGlvbn0mYmVnaW5uaW5nIG9mIGZ1bmN0aW9uIFxvcHR7aW4KK25hbWVkIGZpbGV9XGNyCitccXVhZHtcdHQgK1xpdCBvZmZ9JntcaXQgb2ZmfSBsaW5lcyBhZnRlciBsYXN0IHByaW50ZWRcY3IKK1xxdWFke1x0dCAtXGl0IG9mZn0me1xpdCBvZmZ9IGxpbmVzIHByZXZpb3VzIHRvIGxhc3QgcHJpbnRlZFxjcgorXHF1YWR7XHR0KlxpdCBhZGRyZXNzfSZsaW5lIGNvbnRhaW5pbmcge1xpdCBhZGRyZXNzfVxjcgorbGlzdCB7XGl0IGZ9LHtcaXQgbH0mZnJvbSBsaW5lIHtcaXQgZn0gdG8gbGluZSB7XGl0IGx9XGNyCitpbmZvIGxpbmUge1xpdCBudW19JnNob3cgc3RhcnRpbmcsIGVuZGluZyBhZGRyZXNzZXMgb2YgY29tcGlsZWQgY29kZSBmb3IKK3NvdXJjZSBsaW5lIHtcaXQgbnVtfVxjcgoraW5mbyBzb3VyY2Umc2hvdyBuYW1lIG9mIGN1cnJlbnQgc291cmNlIGZpbGVcY3IKK2luZm8gc291cmNlcyZsaXN0IGFsbCBzb3VyY2UgZmlsZXMgaW4gdXNlXGNyCitmb3J3IHtcaXQgcmVnZXh9JnNlYXJjaCBmb2xsb3dpbmcgc291cmNlIGxpbmVzIGZvciB7XGl0IHJlZ2V4fVxjcgorcmV2IHtcaXQgcmVnZXh9JnNlYXJjaCBwcmVjZWRpbmcgc291cmNlIGxpbmVzIGZvciB7XGl0IHJlZ2V4fVxjcgorXGVuZHNlYworCitcc2VjIEdEQiB1bmRlciBHTlUgRW1hY3M7CitNLXggZ2RiJnJ1biBHREIgdW5kZXIgRW1hY3NcY3IKK1xjdGx7aH0gbSZkZXNjcmliZSBHREIgbW9kZVxjcgorTS1zJnN0ZXAgb25lIGxpbmUgKHtcdHQgc3RlcH0pXGNyCitNLW4mbmV4dCBsaW5lICh7XHR0IG5leHR9KVxjcgorTS1pJnN0ZXAgb25lIGluc3RydWN0aW9uICh7XHR0IHN0ZXBpfSlcY3IKK1xjdGx7Y30gXGN0bHtmfSZmaW5pc2ggY3VycmVudCBzdGFjayBmcmFtZSAoe1x0dCBmaW5pc2h9KVxjcgorTS1jJmNvbnRpbnVlICh7XHR0IGNvbnR9KVxjcgorTS11JnVwIHtcaXQgYXJnfSBmcmFtZXMgKHtcdHQgdXB9KVxjcgorTS1kJmRvd24ge1xpdCBhcmd9IGZyYW1lcyAoe1x0dCBkb3dufSlcY3IKK1xjdGx7eH0gXCYmY29weSBudW1iZXIgZnJvbSBwb2ludCwgaW5zZXJ0IGF0IGVuZFxjcgorXGN0bHt4fSBTUEMmKGluIHNvdXJjZSBmaWxlKSBzZXQgYnJlYWsgYXQgcG9pbnRcY3IKK1xlbmRzZWMKKworXHNlYyBHREIgTGljZW5zZTsKK3Nob3cgY29weWluZyZEaXNwbGF5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXGNyCitzaG93IHdhcnJhbnR5JlRoZXJlIGlzIE5PIFdBUlJBTlRZIGZvciBHREIuICBEaXNwbGF5IGZ1bGwgbm8td2FycmFudHkKK3N0YXRlbWVudC5cY3IgCitcZW5kc2VjCisKKworXHZmaWxsCit7XHNtcm1ccGFyc2tpcD02cHQKK1xjZW50ZXJsaW5le0NvcHlyaWdodCBcY29weXJpZ2h0IDE5OTEsICc5MiwgJzkzLCAnOTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMufQorXGNlbnRlcmxpbmV7Um9sYW5kIEguIFBlc2NofQorXGNlbnRlcmxpbmV7VGhlIGF1dGhvciBhc3N1bWVzIG5vIHJlc3BvbnNpYmlsaXR5IGZvciBhbnkgZXJyb3JzIG9uIHRoaXMgY2FyZC59CisKK1RoaXMgY2FyZCBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCitcY2VudGVybGluZXtQbGVhc2UgY29udHJpYnV0ZSB0byBkZXZlbG9wbWVudCBvZiB0aGlzIGNhcmQgYnkKK2Fubm90YXRpbmcgaXQuICBJbXByb3ZlbWVudHMgY2FuIGJlIHNlbnQgdG8gYnVnLWdkYkBnbnUub3JnLn0KKworR0RCIGl0c2VsZiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgYXJlIHdlbGNvbWUgdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGVyZSBpcworYWJzb2x1dGVseSBubyB3YXJyYW50eSBmb3IgR0RCLgorfQorXGVuZApkaWZmIC0tZ2l0IGEvZ2RiL2RvYy9yZW1vdGUudGV4aSBiL2dkYi9kb2MvcmVtb3RlLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE2YjY1OAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9kb2MvcmVtb3RlLnRleGkKQEAgLTAsMCArMSwxNzA4IEBACitAYwkJCQkJCQkJLSotIFRleGluZm8gLSotCitAYyBDb3B5cmlnaHQgKGMpIDE5OTAgMTk5MSAxOTkyIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitAYyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgc291cmNlIGZvciB0aGUgR0RCIG1hbnVhbC4KK0BjIFRoaXMgdGV4dCBkaXZlcnRlZCB0byAiUmVtb3RlIERlYnVnZ2luZyIgc2VjdGlvbiBpbiBnZW5lcmFsIGNhc2U7CitAYyBob3dldmVyLCBpZiB3ZSdyZSBkb2luZyBhIG1hbnVhbCBzcGVjaWZpY2FsbHkgZm9yIG9uZSBvZiB0aGVzZSwgaXQKK0BjIGJlbG9uZ3MgdXAgZnJvbnQgKGluICJHZXR0aW5nIEluIGFuZCBPdXQiIGNoYXB0ZXIpLgorCitAaWZzZXQgUkVNT1RFU1RVQgorQG5vZGUgUmVtb3RlIFNlcmlhbAorQHN1YnNlY3Rpb24gVGhlIEB2YWx1ZXtHREJOfSByZW1vdGUgc2VyaWFsIHByb3RvY29sCisKK0BjaW5kZXggcmVtb3RlIHNlcmlhbCBkZWJ1Z2dpbmcsIG92ZXJ2aWV3CitUbyBkZWJ1ZyBhIHByb2dyYW0gcnVubmluZyBvbiBhbm90aGVyIG1hY2hpbmUgKHRoZSBkZWJ1Z2dpbmcKK0BkZm57dGFyZ2V0fSBtYWNoaW5lKSwgeW91IG11c3QgZmlyc3QgYXJyYW5nZSBmb3IgYWxsIHRoZSB1c3VhbAorcHJlcmVxdWlzaXRlcyBmb3IgdGhlIHByb2dyYW0gdG8gcnVuIGJ5IGl0c2VsZi4gIEZvciBleGFtcGxlLCBmb3IgYSBDCitwcm9ncmFtLCB5b3UgbmVlZDoKKworQGVudW1lcmF0ZQorQGl0ZW0KK0Egc3RhcnR1cCByb3V0aW5lIHRvIHNldCB1cCB0aGUgQyBydW50aW1lIGVudmlyb25tZW50OyB0aGVzZSB1c3VhbGx5CitoYXZlIGEgbmFtZSBsaWtlIEBmaWxle2NydDB9LiAgVGhlIHN0YXJ0dXAgcm91dGluZSBtYXkgYmUgc3VwcGxpZWQgYnkKK3lvdXIgaGFyZHdhcmUgc3VwcGxpZXIsIG9yIHlvdSBtYXkgaGF2ZSB0byB3cml0ZSB5b3VyIG93bi4KKworQGl0ZW0gCitZb3UgcHJvYmFibHkgbmVlZCBhIEMgc3Vicm91dGluZSBsaWJyYXJ5IHRvIHN1cHBvcnQgeW91ciBwcm9ncmFtJ3MKK3N1YnJvdXRpbmUgY2FsbHMsIG5vdGFibHkgbWFuYWdpbmcgaW5wdXQgYW5kIG91dHB1dC4KKworQGl0ZW0KK0Egd2F5IG9mIGdldHRpbmcgeW91ciBwcm9ncmFtIHRvIHRoZSBvdGhlciBtYWNoaW5lLS0tZm9yIGV4YW1wbGUsIGEKK2Rvd25sb2FkIHByb2dyYW0uICBUaGVzZSBhcmUgb2Z0ZW4gc3VwcGxpZWQgYnkgdGhlIGhhcmR3YXJlCittYW51ZmFjdHVyZXIsIGJ1dCB5b3UgbWF5IGhhdmUgdG8gd3JpdGUgeW91ciBvd24gZnJvbSBoYXJkd2FyZQorZG9jdW1lbnRhdGlvbi4KK0BlbmQgZW51bWVyYXRlCisKK1RoZSBuZXh0IHN0ZXAgaXMgdG8gYXJyYW5nZSBmb3IgeW91ciBwcm9ncmFtIHRvIHVzZSBhIHNlcmlhbCBwb3J0IHRvCitjb21tdW5pY2F0ZSB3aXRoIHRoZSBtYWNoaW5lIHdoZXJlIEB2YWx1ZXtHREJOfSBpcyBydW5uaW5nICh0aGUgQGRmbntob3N0fQorbWFjaGluZSkuICBJbiBnZW5lcmFsIHRlcm1zLCB0aGUgc2NoZW1lIGxvb2tzIGxpa2UgdGhpczoKKworQHRhYmxlIEBlbXBoCitAaXRlbSBPbiB0aGUgaG9zdCwKK0B2YWx1ZXtHREJOfSBhbHJlYWR5IHVuZGVyc3RhbmRzIGhvdyB0byB1c2UgdGhpcyBwcm90b2NvbDsgd2hlbiBldmVyeXRoaW5nCitlbHNlIGlzIHNldCB1cCwgeW91IGNhbiBzaW1wbHkgdXNlIHRoZSBAc2FtcHt0YXJnZXQgcmVtb3RlfSBjb21tYW5kCisoQHB4cmVme1RhcmdldHMsLFNwZWNpZnlpbmcgYSBEZWJ1Z2dpbmcgVGFyZ2V0fSkuCisKK0BpdGVtIE9uIHRoZSB0YXJnZXQsCit5b3UgbXVzdCBsaW5rIHdpdGggeW91ciBwcm9ncmFtIGEgZmV3IHNwZWNpYWwtcHVycG9zZSBzdWJyb3V0aW5lcyB0aGF0CitpbXBsZW1lbnQgdGhlIEB2YWx1ZXtHREJOfSByZW1vdGUgc2VyaWFsIHByb3RvY29sLiAgVGhlIGZpbGUgY29udGFpbmluZyB0aGVzZQorc3Vicm91dGluZXMgaXMgY2FsbGVkICBhIEBkZm57ZGVidWdnaW5nIHN0dWJ9LgorCitAaWZzZXQgR0RCU0VSVkVSCitPbiBjZXJ0YWluIHJlbW90ZSB0YXJnZXRzLCB5b3UgY2FuIHVzZSBhbiBhdXhpbGlhcnkgcHJvZ3JhbQorQGNvZGV7Z2Ric2VydmVyfSBpbnN0ZWFkIG9mIGxpbmtpbmcgYSBzdHViIGludG8geW91ciBwcm9ncmFtLgorQHhyZWZ7U2VydmVyLCxVc2luZyB0aGUgQGNvZGV7Z2Ric2VydmVyfSBwcm9ncmFtfSwgZm9yIGRldGFpbHMuCitAZW5kIGlmc2V0CitAZW5kIHRhYmxlCisKK1RoZSBkZWJ1Z2dpbmcgc3R1YiBpcyBzcGVjaWZpYyB0byB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSByZW1vdGUKK21hY2hpbmU7IGZvciBleGFtcGxlLCB1c2UgQGZpbGV7c3BhcmMtc3R1Yi5jfSB0byBkZWJ1ZyBwcm9ncmFtcyBvbgorQHNje3NwYXJjfSBib2FyZHMuCisKK0BjaW5kZXggcmVtb3RlIHNlcmlhbCBzdHViIGxpc3QKK1RoZXNlIHdvcmtpbmcgcmVtb3RlIHN0dWJzIGFyZSBkaXN0cmlidXRlZCB3aXRoIEB2YWx1ZXtHREJOfToKKworQHRhYmxlIEBjb2RlCisKK0BpdGVtIGkzODYtc3R1Yi5jCitAa2luZGV4IGkzODYtc3R1Yi5jCitAY2luZGV4IEludGVsCitAY2luZGV4IGkzODYKK0ZvciBJbnRlbCAzODYgYW5kIGNvbXBhdGlibGUgYXJjaGl0ZWN0dXJlcy4KKworQGl0ZW0gbTY4ay1zdHViLmMKK0BraW5kZXggbTY4ay1zdHViLmMKK0BjaW5kZXggTW90b3JvbGEgNjgweDAKK0BjaW5kZXggbTY4MHgwCitGb3IgTW90b3JvbGEgNjgweDAgYXJjaGl0ZWN0dXJlcy4KKworQGl0ZW0gc2gtc3R1Yi5jCitAa2luZGV4IHNoLXN0dWIuYworQGNpbmRleCBIaXRhY2hpCitAY2luZGV4IFNICitGb3IgSGl0YWNoaSBTSCBhcmNoaXRlY3R1cmVzLgorCitAaXRlbSBzcGFyYy1zdHViLmMKK0BraW5kZXggc3BhcmMtc3R1Yi5jCitAY2luZGV4IFNwYXJjCitGb3IgQHNje3NwYXJjfSBhcmNoaXRlY3R1cmVzLgorCitAaXRlbSBzcGFyY2wtc3R1Yi5jCitAa2luZGV4IHNwYXJjbC1zdHViLmMKK0BjaW5kZXggRnVqaXRzdQorQGNpbmRleCBTcGFyY0xpdGUKK0ZvciBGdWppdHN1IEBzY3tzcGFyY2xpdGV9IGFyY2hpdGVjdHVyZXMuCisKK0BlbmQgdGFibGUKKworVGhlIEBmaWxle1JFQURNRX0gZmlsZSBpbiB0aGUgQHZhbHVle0dEQk59IGRpc3RyaWJ1dGlvbiBtYXkgbGlzdCBvdGhlcgorcmVjZW50bHkgYWRkZWQgc3R1YnMuCisKK0BtZW51CisqIFN0dWIgQ29udGVudHM6OiAgICAgICBXaGF0IHRoZSBzdHViIGNhbiBkbyBmb3IgeW91CisqIEJvb3RzdHJhcHBpbmc6OiAgICAgICBXaGF0IHlvdSBtdXN0IGRvIGZvciB0aGUgc3R1YgorKiBEZWJ1ZyBTZXNzaW9uOjogICAgICAgUHV0dGluZyBpdCBhbGwgdG9nZXRoZXIKKyogUHJvdG9jb2w6OiAgICAgICAgICAgIE91dGxpbmUgb2YgdGhlIGNvbW11bmljYXRpb24gcHJvdG9jb2wKK0BpZnNldCBHREJTRVJWRVIKKyogU2VydmVyOjoJCVVzaW5nIHRoZSBgZ2Ric2VydmVyJyBwcm9ncmFtCitAZW5kIGlmc2V0CitAaWZzZXQgR0RCU0VSVkUKKyogTmV0V2FyZTo6CQlVc2luZyB0aGUgYGdkYnNlcnZlLm5sbScgcHJvZ3JhbQorQGVuZCBpZnNldAorQGVuZCBtZW51CisKK0Bub2RlIFN0dWIgQ29udGVudHMKK0BzdWJzdWJzZWN0aW9uIFdoYXQgdGhlIHN0dWIgY2FuIGRvIGZvciB5b3UKKworQGNpbmRleCByZW1vdGUgc2VyaWFsIHN0dWIKK1RoZSBkZWJ1Z2dpbmcgc3R1YiBmb3IgeW91ciBhcmNoaXRlY3R1cmUgc3VwcGxpZXMgdGhlc2UgdGhyZWUKK3N1YnJvdXRpbmVzOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIHNldF9kZWJ1Z190cmFwcworQGtpbmRleCBzZXRfZGVidWdfdHJhcHMKK0BjaW5kZXggcmVtb3RlIHNlcmlhbCBzdHViLCBpbml0aWFsaXphdGlvbgorVGhpcyByb3V0aW5lIGFycmFuZ2VzIGZvciBAY29kZXtoYW5kbGVfZXhjZXB0aW9ufSB0byBydW4gd2hlbiB5b3VyCitwcm9ncmFtIHN0b3BzLiAgWW91IG11c3QgY2FsbCB0aGlzIHN1YnJvdXRpbmUgZXhwbGljaXRseSBuZWFyIHRoZQorYmVnaW5uaW5nIG9mIHlvdXIgcHJvZ3JhbS4KKworQGl0ZW0gaGFuZGxlX2V4Y2VwdGlvbgorQGtpbmRleCBoYW5kbGVfZXhjZXB0aW9uCitAY2luZGV4IHJlbW90ZSBzZXJpYWwgc3R1YiwgbWFpbiByb3V0aW5lCitUaGlzIGlzIHRoZSBjZW50cmFsIHdvcmtob3JzZSwgYnV0IHlvdXIgcHJvZ3JhbSBuZXZlciBjYWxscyBpdAorZXhwbGljaXRseS0tLXRoZSBzZXR1cCBjb2RlIGFycmFuZ2VzIGZvciBAY29kZXtoYW5kbGVfZXhjZXB0aW9ufSB0bworcnVuIHdoZW4gYSB0cmFwIGlzIHRyaWdnZXJlZC4KKworQGNvZGV7aGFuZGxlX2V4Y2VwdGlvbn0gdGFrZXMgY29udHJvbCB3aGVuIHlvdXIgcHJvZ3JhbSBzdG9wcyBkdXJpbmcKK2V4ZWN1dGlvbiAoZm9yIGV4YW1wbGUsIG9uIGEgYnJlYWtwb2ludCksIGFuZCBtZWRpYXRlcyBjb21tdW5pY2F0aW9ucword2l0aCBAdmFsdWV7R0RCTn0gb24gdGhlIGhvc3QgbWFjaGluZS4gIFRoaXMgaXMgd2hlcmUgdGhlIGNvbW11bmljYXRpb25zCitwcm90b2NvbCBpcyBpbXBsZW1lbnRlZDsgQGNvZGV7aGFuZGxlX2V4Y2VwdGlvbn0gYWN0cyBhcyB0aGUgQHZhbHVle0dEQk59CityZXByZXNlbnRhdGl2ZSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmU7IGl0IGJlZ2lucyBieSBzZW5kaW5nIHN1bW1hcnkKK2luZm9ybWF0aW9uIG9uIHRoZSBzdGF0ZSBvZiB5b3VyIHByb2dyYW0sIHRoZW4gY29udGludWVzIHRvIGV4ZWN1dGUsCityZXRyaWV2aW5nIGFuZCB0cmFuc21pdHRpbmcgYW55IGluZm9ybWF0aW9uIEB2YWx1ZXtHREJOfSBuZWVkcywgdW50aWwgeW91CitleGVjdXRlIGEgQHZhbHVle0dEQk59IGNvbW1hbmQgdGhhdCBtYWtlcyB5b3VyIHByb2dyYW0gcmVzdW1lOyBhdCB0aGF0IHBvaW50LAorQGNvZGV7aGFuZGxlX2V4Y2VwdGlvbn0gcmV0dXJucyBjb250cm9sIHRvIHlvdXIgb3duIGNvZGUgb24gdGhlIHRhcmdldAorbWFjaGluZS4gCisKK0BpdGVtIGJyZWFrcG9pbnQKK0BjaW5kZXggQGNvZGV7YnJlYWtwb2ludH0gc3Vicm91dGluZSwgcmVtb3RlCitVc2UgdGhpcyBhdXhpbGlhcnkgc3Vicm91dGluZSB0byBtYWtlIHlvdXIgcHJvZ3JhbSBjb250YWluIGEKK2JyZWFrcG9pbnQuICBEZXBlbmRpbmcgb24gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uLCB0aGlzIG1heSBiZSB0aGUgb25seQord2F5IGZvciBAdmFsdWV7R0RCTn0gdG8gZ2V0IGNvbnRyb2wuICBGb3IgaW5zdGFuY2UsIGlmIHlvdXIgdGFyZ2V0CittYWNoaW5lIGhhcyBzb21lIHNvcnQgb2YgaW50ZXJydXB0IGJ1dHRvbiwgeW91IHdvbid0IG5lZWQgdG8gY2FsbCB0aGlzOworcHJlc3NpbmcgdGhlIGludGVycnVwdCBidXR0b24gdHJhbnNmZXJzIGNvbnRyb2wgdG8KK0Bjb2Rle2hhbmRsZV9leGNlcHRpb259LS0taW4gZWZmZWN0LCB0byBAdmFsdWV7R0RCTn0uICBPbiBzb21lIG1hY2hpbmVzLAorc2ltcGx5IHJlY2VpdmluZyBjaGFyYWN0ZXJzIG9uIHRoZSBzZXJpYWwgcG9ydCBtYXkgYWxzbyB0cmlnZ2VyIGEgdHJhcDsKK2FnYWluLCBpbiB0aGF0IHNpdHVhdGlvbiwgeW91IGRvbid0IG5lZWQgdG8gY2FsbCBAY29kZXticmVha3BvaW50fSBmcm9tCit5b3VyIG93biBwcm9ncmFtLS0tc2ltcGx5IHJ1bm5pbmcgQHNhbXB7dGFyZ2V0IHJlbW90ZX0gZnJvbSB0aGUgaG9zdAorQHZhbHVle0dEQk59IHNlc3Npb24gZ2V0cyBjb250cm9sLiAgCisKK0NhbGwgQGNvZGV7YnJlYWtwb2ludH0gaWYgbm9uZSBvZiB0aGVzZSBpcyB0cnVlLCBvciBpZiB5b3Ugc2ltcGx5IHdhbnQKK3RvIG1ha2UgY2VydGFpbiB5b3VyIHByb2dyYW0gc3RvcHMgYXQgYSBwcmVkZXRlcm1pbmVkIHBvaW50IGZvciB0aGUKK3N0YXJ0IG9mIHlvdXIgZGVidWdnaW5nIHNlc3Npb24uCitAZW5kIHRhYmxlCisKK0Bub2RlIEJvb3RzdHJhcHBpbmcKK0BzdWJzdWJzZWN0aW9uIFdoYXQgeW91IG11c3QgZG8gZm9yIHRoZSBzdHViCisKK0BjaW5kZXggcmVtb3RlIHN0dWIsIHN1cHBvcnQgcm91dGluZXMKK1RoZSBkZWJ1Z2dpbmcgc3R1YnMgdGhhdCBjb21lIHdpdGggQHZhbHVle0dEQk59IGFyZSBzZXQgdXAgZm9yIGEgcGFydGljdWxhcgorY2hpcCBhcmNoaXRlY3R1cmUsIGJ1dCB0aGV5IGhhdmUgbm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc3Qgb2YgeW91cgorZGVidWdnaW5nIHRhcmdldCBtYWNoaW5lLgorCitGaXJzdCBvZiBhbGwgeW91IG5lZWQgdG8gdGVsbCB0aGUgc3R1YiBob3cgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUKK3NlcmlhbCBwb3J0LgorCitAdGFibGUgQGNvZGUKK0BpdGVtIGludCBnZXREZWJ1Z0NoYXIoKQorQGtpbmRleCBnZXREZWJ1Z0NoYXIKK1dyaXRlIHRoaXMgc3Vicm91dGluZSB0byByZWFkIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIHRoZSBzZXJpYWwgcG9ydC4KK0l0IG1heSBiZSBpZGVudGljYWwgdG8gQGNvZGV7Z2V0Y2hhcn0gZm9yIHlvdXIgdGFyZ2V0IHN5c3RlbTsgYQorZGlmZmVyZW50IG5hbWUgaXMgdXNlZCB0byBhbGxvdyB5b3UgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBpZiB5b3Ugd2lzaC4KKworQGl0ZW0gdm9pZCBwdXREZWJ1Z0NoYXIoaW50KQorQGtpbmRleCBwdXREZWJ1Z0NoYXIKK1dyaXRlIHRoaXMgc3Vicm91dGluZSB0byB3cml0ZSBhIHNpbmdsZSBjaGFyYWN0ZXIgdG8gdGhlIHNlcmlhbCBwb3J0LgorSXQgbWF5IGJlIGlkZW50aWNhbCB0byBAY29kZXtwdXRjaGFyfSBmb3IgeW91ciB0YXJnZXQgc3lzdGVtOyBhIAorZGlmZmVyZW50IG5hbWUgaXMgdXNlZCB0byBhbGxvdyB5b3UgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBpZiB5b3Ugd2lzaC4KK0BlbmQgdGFibGUKKworQGNpbmRleCBjb250cm9sIEMsIGFuZCByZW1vdGUgZGVidWdnaW5nCitAY2luZGV4IGludGVycnVwdGluZyByZW1vdGUgdGFyZ2V0cworSWYgeW91IHdhbnQgQHZhbHVle0dEQk59IHRvIGJlIGFibGUgdG8gc3RvcCB5b3VyIHByb2dyYW0gd2hpbGUgaXQgaXMKK3J1bm5pbmcsIHlvdSBuZWVkIHRvIHVzZSBhbiBpbnRlcnJ1cHQtZHJpdmVuIHNlcmlhbCBkcml2ZXIsIGFuZCBhcnJhbmdlCitmb3IgaXQgdG8gc3RvcCB3aGVuIGl0IHJlY2VpdmVzIGEgQGNvZGV7XkN9IChAc2FtcHtcMDAzfSwgdGhlIGNvbnRyb2wtQworY2hhcmFjdGVyKS4gIFRoYXQgaXMgdGhlIGNoYXJhY3RlciB3aGljaCBAdmFsdWV7R0RCTn0gdXNlcyB0byB0ZWxsIHRoZQorcmVtb3RlIHN5c3RlbSB0byBzdG9wLgorCitHZXR0aW5nIHRoZSBkZWJ1Z2dpbmcgdGFyZ2V0IHRvIHJldHVybiB0aGUgcHJvcGVyIHN0YXR1cyB0byBAdmFsdWV7R0RCTn0KK3Byb2JhYmx5IHJlcXVpcmVzIGNoYW5nZXMgdG8gdGhlIHN0YW5kYXJkIHN0dWI7IG9uZSBxdWljayBhbmQgZGlydHkgd2F5CitpcyB0byBqdXN0IGV4ZWN1dGUgYSBicmVha3BvaW50IGluc3RydWN0aW9uICh0aGUgYGBkaXJ0eScnIHBhcnQgaXMgdGhhdAorQHZhbHVle0dEQk59IHJlcG9ydHMgYSBAY29kZXtTSUdUUkFQfSBpbnN0ZWFkIG9mIGEgQGNvZGV7U0lHSU5UfSkuCisKK090aGVyIHJvdXRpbmVzIHlvdSBuZWVkIHRvIHN1cHBseSBhcmU6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gdm9pZCBleGNlcHRpb25IYW5kbGVyIChpbnQgQHZhcntleGNlcHRpb25fbnVtYmVyfSwgdm9pZCAqQHZhcntleGNlcHRpb25fYWRkcmVzc30pCitAa2luZGV4IGV4Y2VwdGlvbkhhbmRsZXIKK1dyaXRlIHRoaXMgZnVuY3Rpb24gdG8gaW5zdGFsbCBAdmFye2V4Y2VwdGlvbl9hZGRyZXNzfSBpbiB0aGUgZXhjZXB0aW9uCitoYW5kbGluZyB0YWJsZXMuICBZb3UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UgdGhlIHN0dWIgZG9lcyBub3QgaGF2ZSBhbnkKK3dheSBvZiBrbm93aW5nIHdoYXQgdGhlIGV4Y2VwdGlvbiBoYW5kbGluZyB0YWJsZXMgb24geW91ciB0YXJnZXQgc3lzdGVtCithcmUgbGlrZSAoZm9yIGV4YW1wbGUsIHRoZSBwcm9jZXNzb3IncyB0YWJsZSBtaWdodCBiZSBpbiBAc2N7cm9tfSwKK2NvbnRhaW5pbmcgZW50cmllcyB3aGljaCBwb2ludCB0byBhIHRhYmxlIGluIEBzY3tyYW19KS4KK0B2YXJ7ZXhjZXB0aW9uX251bWJlcn0gaXMgdGhlIGV4Y2VwdGlvbiBudW1iZXIgd2hpY2ggc2hvdWxkIGJlIGNoYW5nZWQ7CitpdHMgbWVhbmluZyBpcyBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IChmb3IgZXhhbXBsZSwgZGlmZmVyZW50IG51bWJlcnMKK21pZ2h0IHJlcHJlc2VudCBkaXZpZGUgYnkgemVybywgbWlzYWxpZ25lZCBhY2Nlc3MsIGV0YykuICBXaGVuIHRoaXMKK2V4Y2VwdGlvbiBvY2N1cnMsIGNvbnRyb2wgc2hvdWxkIGJlIHRyYW5zZmVycmVkIGRpcmVjdGx5IHRvCitAdmFye2V4Y2VwdGlvbl9hZGRyZXNzfSwgYW5kIHRoZSBwcm9jZXNzb3Igc3RhdGUgKHN0YWNrLCByZWdpc3RlcnMsCithbmQgc28gb24pIHNob3VsZCBiZSBqdXN0IGFzIGl0IGlzIHdoZW4gYSBwcm9jZXNzb3IgZXhjZXB0aW9uIG9jY3Vycy4gIFNvIGlmCit5b3Ugd2FudCB0byB1c2UgYSBqdW1wIGluc3RydWN0aW9uIHRvIHJlYWNoIEB2YXJ7ZXhjZXB0aW9uX2FkZHJlc3N9LCBpdAorc2hvdWxkIGJlIGEgc2ltcGxlIGp1bXAsIG5vdCBhIGp1bXAgdG8gc3Vicm91dGluZS4KKworRm9yIHRoZSAzODYsIEB2YXJ7ZXhjZXB0aW9uX2FkZHJlc3N9IHNob3VsZCBiZSBpbnN0YWxsZWQgYXMgYW4gaW50ZXJydXB0CitnYXRlIHNvIHRoYXQgaW50ZXJydXB0cyBhcmUgbWFza2VkIHdoaWxlIHRoZSBoYW5kbGVyIHJ1bnMuICBUaGUgZ2F0ZQorc2hvdWxkIGJlIGF0IHByaXZpbGVnZSBsZXZlbCAwICh0aGUgbW9zdCBwcml2aWxlZ2VkIGxldmVsKS4gIFRoZQorQHNje3NwYXJjfSBhbmQgNjhrIHN0dWJzIGFyZSBhYmxlIHRvIG1hc2sgaW50ZXJydXAgdGhlbXNlbHZlcyB3aXRob3V0CitoZWxwIGZyb20gQGNvZGV7ZXhjZXB0aW9uSGFuZGxlcn0uCisKK0BpdGVtIHZvaWQgZmx1c2hfaV9jYWNoZSgpCitAa2luZGV4IGZsdXNoX2lfY2FjaGUKKyhzcGFyYyBhbmQgc3BhcmNsaXRlIG9ubHkpIFdyaXRlIHRoaXMgc3Vicm91dGluZSB0byBmbHVzaCB0aGUKK2luc3RydWN0aW9uIGNhY2hlLCBpZiBhbnksIG9uIHlvdXIgdGFyZ2V0IG1hY2hpbmUuICBJZiB0aGVyZSBpcyBubworaW5zdHJ1Y3Rpb24gY2FjaGUsIHRoaXMgc3Vicm91dGluZSBtYXkgYmUgYSBuby1vcC4KKworT24gdGFyZ2V0IG1hY2hpbmVzIHRoYXQgaGF2ZSBpbnN0cnVjdGlvbiBjYWNoZXMsIEB2YWx1ZXtHREJOfSByZXF1aXJlcyB0aGlzCitmdW5jdGlvbiB0byBtYWtlIGNlcnRhaW4gdGhhdCB0aGUgc3RhdGUgb2YgeW91ciBwcm9ncmFtIGlzIHN0YWJsZS4KK0BlbmQgdGFibGUKKworQG5vaW5kZW50CitZb3UgbXVzdCBhbHNvIG1ha2Ugc3VyZSB0aGlzIGxpYnJhcnkgcm91dGluZSBpcyBhdmFpbGFibGU6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gdm9pZCAqbWVtc2V0KHZvaWQgKiwgaW50LCBpbnQpCitAa2luZGV4IG1lbXNldAorVGhpcyBpcyB0aGUgc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbiBAY29kZXttZW1zZXR9IHRoYXQgc2V0cyBhbiBhcmVhIG9mCittZW1vcnkgdG8gYSBrbm93biB2YWx1ZS4gIElmIHlvdSBoYXZlIG9uZSBvZiB0aGUgZnJlZSB2ZXJzaW9ucyBvZgorQGNvZGV7bGliYy5hfSwgQGNvZGV7bWVtc2V0fSBjYW4gYmUgZm91bmQgdGhlcmU7IG90aGVyd2lzZSwgeW91IG11c3QKK2VpdGhlciBvYnRhaW4gaXQgZnJvbSB5b3VyIGhhcmR3YXJlIG1hbnVmYWN0dXJlciwgb3Igd3JpdGUgeW91ciBvd24uCitAZW5kIHRhYmxlCisKK0lmIHlvdSBkbyBub3QgdXNlIHRoZSBHTlUgQyBjb21waWxlciwgeW91IG1heSBuZWVkIG90aGVyIHN0YW5kYXJkCitsaWJyYXJ5IHN1YnJvdXRpbmVzIGFzIHdlbGw7IHRoaXMgdmFyaWVzIGZyb20gb25lIHN0dWIgdG8gYW5vdGhlciwKK2J1dCBpbiBnZW5lcmFsIHRoZSBzdHVicyBhcmUgbGlrZWx5IHRvIHVzZSBhbnkgb2YgdGhlIGNvbW1vbiBsaWJyYXJ5CitzdWJyb3V0aW5lcyB3aGljaCBAY29kZXtnY2N9IGdlbmVyYXRlcyBhcyBpbmxpbmUgY29kZS4KKworCitAbm9kZSBEZWJ1ZyBTZXNzaW9uCitAc3Vic3Vic2VjdGlvbiBQdXR0aW5nIGl0IGFsbCB0b2dldGhlcgorCitAY2luZGV4IHJlbW90ZSBzZXJpYWwgZGVidWdnaW5nIHN1bW1hcnkKK0luIHN1bW1hcnksIHdoZW4geW91ciBwcm9ncmFtIGlzIHJlYWR5IHRvIGRlYnVnLCB5b3UgbXVzdCBmb2xsb3cgdGhlc2UKK3N0ZXBzLgorCitAZW51bWVyYXRlCitAaXRlbQorTWFrZSBzdXJlIHlvdSBoYXZlIHRoZSBzdXBwb3J0aW5nIGxvdy1sZXZlbCByb3V0aW5lcworKEBweHJlZntCb290c3RyYXBwaW5nLCxXaGF0IHlvdSBtdXN0IGRvIGZvciB0aGUgc3R1Yn0pOgorQGRpc3BsYXkKK0Bjb2Rle2dldERlYnVnQ2hhcn0sIEBjb2Rle3B1dERlYnVnQ2hhcn0sCitAY29kZXtmbHVzaF9pX2NhY2hlfSwgQGNvZGV7bWVtc2V0fSwgQGNvZGV7ZXhjZXB0aW9uSGFuZGxlcn0uCitAZW5kIGRpc3BsYXkKKworQGl0ZW0KK0luc2VydCB0aGVzZSBsaW5lcyBuZWFyIHRoZSB0b3Agb2YgeW91ciBwcm9ncmFtOgorCitAZXhhbXBsZQorc2V0X2RlYnVnX3RyYXBzKCk7CiticmVha3BvaW50KCk7CitAZW5kIGV4YW1wbGUKKworQGl0ZW0KK0ZvciB0aGUgNjgweDAgc3R1YiBvbmx5LCB5b3UgbmVlZCB0byBwcm92aWRlIGEgdmFyaWFibGUgY2FsbGVkCitAY29kZXtleGNlcHRpb25Ib29rfS4gIE5vcm1hbGx5IHlvdSBqdXN0IHVzZToKKworQGV4YW1wbGUKK3ZvaWQgKCpleGNlcHRpb25Ib29rKSgpID0gMDsKK0BlbmQgZXhhbXBsZQorCitidXQgaWYgYmVmb3JlIGNhbGxpbmcgQGNvZGV7c2V0X2RlYnVnX3RyYXBzfSwgeW91IHNldCBpdCB0byBwb2ludCB0byBhCitmdW5jdGlvbiBpbiB5b3VyIHByb2dyYW0sIHRoYXQgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4KK0Bjb2Rle0B2YWx1ZXtHREJOfX0gY29udGludWVzIGFmdGVyIHN0b3BwaW5nIG9uIGEgdHJhcCAoZm9yIGV4YW1wbGUsIGJ1cworZXJyb3IpLiAgVGhlIGZ1bmN0aW9uIGluZGljYXRlZCBieSBAY29kZXtleGNlcHRpb25Ib29rfSBpcyBjYWxsZWQgd2l0aAorb25lIHBhcmFtZXRlcjogYW4gQGNvZGV7aW50fSB3aGljaCBpcyB0aGUgZXhjZXB0aW9uIG51bWJlci4KKworQGl0ZW0KK0NvbXBpbGUgYW5kIGxpbmsgdG9nZXRoZXI6IHlvdXIgcHJvZ3JhbSwgdGhlIEB2YWx1ZXtHREJOfSBkZWJ1Z2dpbmcgc3R1YiBmb3IKK3lvdXIgdGFyZ2V0IGFyY2hpdGVjdHVyZSwgYW5kIHRoZSBzdXBwb3J0aW5nIHN1YnJvdXRpbmVzLgorCitAaXRlbQorTWFrZSBzdXJlIHlvdSBoYXZlIGEgc2VyaWFsIGNvbm5lY3Rpb24gYmV0d2VlbiB5b3VyIHRhcmdldCBtYWNoaW5lIGFuZAordGhlIEB2YWx1ZXtHREJOfSBob3N0LCBhbmQgaWRlbnRpZnkgdGhlIHNlcmlhbCBwb3J0IG9uIHRoZSBob3N0LgorCitAaXRlbQorQGMgVGhlICJyZW1vdGUiIHRhcmdldCBub3cgcHJvdmlkZXMgYSBgbG9hZCcgY29tbWFuZCwgc28gd2Ugc2hvdWxkCitAYyBkb2N1bWVudCB0aGF0LiAgRklYTUUuCitEb3dubG9hZCB5b3VyIHByb2dyYW0gdG8geW91ciB0YXJnZXQgbWFjaGluZSAob3IgZ2V0IGl0IHRoZXJlIGJ5Cit3aGF0ZXZlciBtZWFucyB0aGUgbWFudWZhY3R1cmVyIHByb3ZpZGVzKSwgYW5kIHN0YXJ0IGl0LgorCitAaXRlbQorVG8gc3RhcnQgcmVtb3RlIGRlYnVnZ2luZywgcnVuIEB2YWx1ZXtHREJOfSBvbiB0aGUgaG9zdCBtYWNoaW5lLCBhbmQgc3BlY2lmeQorYXMgYW4gZXhlY3V0YWJsZSBmaWxlIHRoZSBwcm9ncmFtIHRoYXQgaXMgcnVubmluZyBpbiB0aGUgcmVtb3RlIG1hY2hpbmUuCitUaGlzIHRlbGxzIEB2YWx1ZXtHREJOfSBob3cgdG8gZmluZCB5b3VyIHByb2dyYW0ncyBzeW1ib2xzIGFuZCB0aGUgY29udGVudHMKK29mIGl0cyBwdXJlIHRleHQuCisKK0BjaW5kZXggc2VyaWFsIGxpbmUsIEBjb2Rle3RhcmdldCByZW1vdGV9CitUaGVuIGVzdGFibGlzaCBjb21tdW5pY2F0aW9uIHVzaW5nIHRoZSBAY29kZXt0YXJnZXQgcmVtb3RlfSBjb21tYW5kLgorSXRzIGFyZ3VtZW50IHNwZWNpZmllcyBob3cgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgdGFyZ2V0CittYWNoaW5lLS0tZWl0aGVyIHZpYSBhIGRldmljZW5hbWUgYXR0YWNoZWQgdG8gYSBkaXJlY3Qgc2VyaWFsIGxpbmUsIG9yIGEKK1RDUCBwb3J0ICh1c3VhbGx5IHRvIGEgdGVybWluYWwgc2VydmVyIHdoaWNoIGluIHR1cm4gaGFzIGEgc2VyaWFsIGxpbmUKK3RvIHRoZSB0YXJnZXQpLiAgRm9yIGV4YW1wbGUsIHRvIHVzZSBhIHNlcmlhbCBsaW5lIGNvbm5lY3RlZCB0byB0aGUKK2RldmljZSBuYW1lZCBAZmlsZXsvZGV2L3R0eWJ9OgorCitAZXhhbXBsZQordGFyZ2V0IHJlbW90ZSAvZGV2L3R0eWIKK0BlbmQgZXhhbXBsZQorCitAY2luZGV4IFRDUCBwb3J0LCBAY29kZXt0YXJnZXQgcmVtb3RlfQorVG8gdXNlIGEgVENQIGNvbm5lY3Rpb24sIHVzZSBhbiBhcmd1bWVudCBvZiB0aGUgZm9ybQorQGNvZGV7QHZhcntob3N0fTpwb3J0fS4gIEZvciBleGFtcGxlLCB0byBjb25uZWN0IHRvIHBvcnQgMjgyOCBvbiBhCit0ZXJtaW5hbCBzZXJ2ZXIgbmFtZWQgQGNvZGV7bWFueWZhcm1zfToKKworQGV4YW1wbGUKK3RhcmdldCByZW1vdGUgbWFueWZhcm1zOjI4MjgKK0BlbmQgZXhhbXBsZQorQGVuZCBlbnVtZXJhdGUKKworTm93IHlvdSBjYW4gdXNlIGFsbCB0aGUgdXN1YWwgY29tbWFuZHMgdG8gZXhhbWluZSBhbmQgY2hhbmdlIGRhdGEgYW5kIHRvCitzdGVwIGFuZCBjb250aW51ZSB0aGUgcmVtb3RlIHByb2dyYW0uCisKK1RvIHJlc3VtZSB0aGUgcmVtb3RlIHByb2dyYW0gYW5kIHN0b3AgZGVidWdnaW5nIGl0LCB1c2UgdGhlIEBjb2Rle2RldGFjaH0KK2NvbW1hbmQuCisKK0BjaW5kZXggaW50ZXJydXB0aW5nIHJlbW90ZSBwcm9ncmFtcworQGNpbmRleCByZW1vdGUgcHJvZ3JhbXMsIGludGVycnVwdGluZworV2hlbmV2ZXIgQHZhbHVle0dEQk59IGlzIHdhaXRpbmcgZm9yIHRoZSByZW1vdGUgcHJvZ3JhbSwgaWYgeW91IHR5cGUgdGhlCitpbnRlcnJ1cHQgY2hhcmFjdGVyIChvZnRlbiBAa2V5e0MtQ30pLCBAdmFsdWV7R0RCTn0gYXR0ZW1wdHMgdG8gc3RvcCB0aGUKK3Byb2dyYW0uICBUaGlzIG1heSBvciBtYXkgbm90IHN1Y2NlZWQsIGRlcGVuZGluZyBpbiBwYXJ0IG9uIHRoZSBoYXJkd2FyZQorYW5kIHRoZSBzZXJpYWwgZHJpdmVycyB0aGUgcmVtb3RlIHN5c3RlbSB1c2VzLiAgSWYgeW91IHR5cGUgdGhlCitpbnRlcnJ1cHQgY2hhcmFjdGVyIG9uY2UgYWdhaW4sIEB2YWx1ZXtHREJOfSBkaXNwbGF5cyB0aGlzIHByb21wdDoKKworQGV4YW1wbGUKK0ludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBwcm9ncmFtLgorR2l2ZSB1cCAoYW5kIHN0b3AgZGVidWdnaW5nIGl0KT8gICh5IG9yIG4pCitAZW5kIGV4YW1wbGUKKworSWYgeW91IHR5cGUgQGtiZHt5fSwgQHZhbHVle0dEQk59IGFiYW5kb25zIHRoZSByZW1vdGUgZGVidWdnaW5nIHNlc3Npb24uCisoSWYgeW91IGRlY2lkZSB5b3Ugd2FudCB0byB0cnkgYWdhaW4gbGF0ZXIsIHlvdSBjYW4gdXNlIEBzYW1we3RhcmdldAorcmVtb3RlfSBhZ2FpbiB0byBjb25uZWN0IG9uY2UgbW9yZS4pICBJZiB5b3UgdHlwZSBAa2Jke259LCBAdmFsdWV7R0RCTn0KK2dvZXMgYmFjayB0byB3YWl0aW5nLgorCitAbm9kZSBQcm90b2NvbAorQHN1YnN1YnNlY3Rpb24gQ29tbXVuaWNhdGlvbiBwcm90b2NvbAorCitAY2luZGV4IGRlYnVnZ2luZyBzdHViLCBleGFtcGxlCitAY2luZGV4IHJlbW90ZSBzdHViLCBleGFtcGxlCitAY2luZGV4IHN0dWIgZXhhbXBsZSwgcmVtb3RlIGRlYnVnZ2luZworVGhlIHN0dWIgZmlsZXMgcHJvdmlkZWQgd2l0aCBAdmFsdWV7R0RCTn0gaW1wbGVtZW50IHRoZSB0YXJnZXQgc2lkZSBvZiB0aGUKK2NvbW11bmljYXRpb24gcHJvdG9jb2wsIGFuZCB0aGUgQHZhbHVle0dEQk59IHNpZGUgaXMgaW1wbGVtZW50ZWQgaW4gdGhlCitAdmFsdWV7R0RCTn0gc291cmNlIGZpbGUgQGZpbGV7cmVtb3RlLmN9LiAgTm9ybWFsbHksIHlvdSBjYW4gc2ltcGx5IGFsbG93Cit0aGVzZSBzdWJyb3V0aW5lcyB0byBjb21tdW5pY2F0ZSwgYW5kIGlnbm9yZSB0aGUgZGV0YWlscy4gIChJZiB5b3UncmUKK2ltcGxlbWVudGluZyB5b3VyIG93biBzdHViIGZpbGUsIHlvdSBjYW4gc3RpbGwgaWdub3JlIHRoZSBkZXRhaWxzOiBzdGFydAord2l0aCBvbmUgb2YgdGhlIGV4aXN0aW5nIHN0dWIgZmlsZXMuICBAZmlsZXtzcGFyYy1zdHViLmN9IGlzIHRoZSBiZXN0Citvcmdhbml6ZWQsIGFuZCB0aGVyZWZvcmUgdGhlIGVhc2llc3QgdG8gcmVhZC4pCisKK0hvd2V2ZXIsIHRoZXJlIG1heSBiZSBvY2Nhc2lvbnMgd2hlbiB5b3UgbmVlZCB0byBrbm93IHNvbWV0aGluZyBhYm91dAordGhlIHByb3RvY29sLS0tZm9yIGV4YW1wbGUsIGlmIHRoZXJlIGlzIG9ubHkgb25lIHNlcmlhbCBwb3J0IHRvIHlvdXIKK3RhcmdldCBtYWNoaW5lLCB5b3UgbWlnaHQgd2FudCB5b3VyIHByb2dyYW0gdG8gZG8gc29tZXRoaW5nIHNwZWNpYWwgaWYKK2l0IHJlY29nbml6ZXMgYSBwYWNrZXQgbWVhbnQgZm9yIEB2YWx1ZXtHREJOfS4KKworQGNpbmRleCBwcm90b2NvbCwgQHZhbHVle0dEQk59IHJlbW90ZSBzZXJpYWwKK0BjaW5kZXggc2VyaWFsIHByb3RvY29sLCBAdmFsdWV7R0RCTn0gcmVtb3RlCitAY2luZGV4IHJlbW90ZSBzZXJpYWwgcHJvdG9jb2wKK0FsbCBAdmFsdWV7R0RCTn0gY29tbWFuZHMgYW5kIHJlc3BvbnNlcyAob3RoZXIgdGhhbiBhY2tub3dsZWRnZW1lbnRzLCB3aGljaAorYXJlIHNpbmdsZSBjaGFyYWN0ZXJzKSBhcmUgc2VudCBhcyBhIHBhY2tldCB3aGljaCBpbmNsdWRlcyBhCitjaGVja3N1bS4gIEEgcGFja2V0IGlzIGludHJvZHVjZWQgd2l0aCB0aGUgY2hhcmFjdGVyIEBzYW1weyR9LCBhbmQgZW5kcword2l0aCB0aGUgY2hhcmFjdGVyIEBzYW1weyN9IGZvbGxvd2VkIGJ5IGEgdHdvLWRpZ2l0IGNoZWNrc3VtOgorCitAZXhhbXBsZQorJEB2YXJ7cGFja2V0IGluZm99I0B2YXJ7Y2hlY2tzdW19CitAZW5kIGV4YW1wbGUKKworQGNpbmRleCBjaGVja3N1bSwgZm9yIEB2YWx1ZXtHREJOfSByZW1vdGUKK0Bub2luZGVudAorQHZhcntjaGVja3N1bX0gaXMgY29tcHV0ZWQgYXMgdGhlIG1vZHVsbyAyNTYgc3VtIG9mIHRoZSBAdmFye3BhY2tldAoraW5mb30gY2hhcmFjdGVycy4KKworV2hlbiBlaXRoZXIgdGhlIGhvc3Qgb3IgdGhlIHRhcmdldCBtYWNoaW5lIHJlY2VpdmVzIGEgcGFja2V0LCB0aGUgZmlyc3QKK3Jlc3BvbnNlIGV4cGVjdGVkIGlzIGFuIGFja25vd2xlZGdlbWVudDogYSBzaW5nbGUgY2hhcmFjdGVyLCBlaXRoZXIKK0BzYW1weyt9ICh0byBpbmRpY2F0ZSB0aGUgcGFja2FnZSB3YXMgcmVjZWl2ZWQgY29ycmVjdGx5KSBvciBAc2FtcHstfQorKHRvIHJlcXVlc3QgcmV0cmFuc21pc3Npb24pLgorCitUaGUgaG9zdCAoQHZhbHVle0dEQk59KSBzZW5kcyBjb21tYW5kcywgYW5kIHRoZSB0YXJnZXQgKHRoZSBkZWJ1Z2dpbmcgc3R1YgoraW5jb3Jwb3JhdGVkIGluIHlvdXIgcHJvZ3JhbSkgc2VuZHMgZGF0YSBpbiByZXNwb25zZS4gIFRoZSB0YXJnZXQgYWxzbworc2VuZHMgZGF0YSB3aGVuIHlvdXIgcHJvZ3JhbSBzdG9wcy4KKworQ29tbWFuZCBwYWNrZXRzIGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZWlyIGZpcnN0IGNoYXJhY3Rlciwgd2hpY2gKK2lkZW50aWZpZXMgdGhlIGtpbmQgb2YgY29tbWFuZC4KKworVGhlc2UgYXJlIHNvbWUgb2YgdGhlIGNvbW1hbmRzIGN1cnJlbnRseSBzdXBwb3J0ZWQgKGZvciBhIGNvbXBsZXRlIGxpc3Qgb2YgCitjb21tYW5kcywgbG9vayBpbiBAZmlsZXtnZGIvcmVtb3RlLmMufSk6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gZworUmVxdWVzdHMgdGhlIHZhbHVlcyBvZiBDUFUgcmVnaXN0ZXJzLgorCitAaXRlbSBHCitTZXRzIHRoZSB2YWx1ZXMgb2YgQ1BVIHJlZ2lzdGVycy4KKworQGl0ZW0gbUB2YXJ7YWRkcn0sQHZhcntjb3VudH0KK1JlYWQgQHZhcntjb3VudH0gYnl0ZXMgYXQgbG9jYXRpb24gQHZhcnthZGRyfS4KKworQGl0ZW0gTUB2YXJ7YWRkcn0sQHZhcntjb3VudH06QGRvdHN7fQorV3JpdGUgQHZhcntjb3VudH0gYnl0ZXMgYXQgbG9jYXRpb24gQHZhcnthZGRyfS4KKworQG5lZWQgNTAwCitAaXRlbSBjCitAaXRlbXggY0B2YXJ7YWRkcn0KK1Jlc3VtZSBleGVjdXRpb24gYXQgdGhlIGN1cnJlbnQgYWRkcmVzcyAob3IgYXQgQHZhcnthZGRyfSBpZiBzdXBwbGllZCkuCisKK0BuZWVkIDUwMAorQGl0ZW0gcworQGl0ZW14IHNAdmFye2FkZHJ9CitTdGVwIHRoZSB0YXJnZXQgcHJvZ3JhbSBmb3Igb25lIGluc3RydWN0aW9uLCBmcm9tIGVpdGhlciB0aGUgY3VycmVudAorcHJvZ3JhbSBjb3VudGVyIG9yIGZyb20gQHZhcnthZGRyfSBpZiBzdXBwbGllZC4KKworQGl0ZW0gaworS2lsbCB0aGUgdGFyZ2V0IHByb2dyYW0uCisKK0BpdGVtID8KK1JlcG9ydCB0aGUgbW9zdCByZWNlbnQgc2lnbmFsLiAgVG8gYWxsb3cgeW91IHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZQorQHZhbHVle0dEQk59IHNpZ25hbCBoYW5kbGluZyBjb21tYW5kcywgb25lIG9mIHRoZSBmdW5jdGlvbnMgb2YgdGhlIGRlYnVnZ2luZworc3R1YiBpcyB0byByZXBvcnQgQ1BVIHRyYXBzIGFzIHRoZSBjb3JyZXNwb25kaW5nIFBPU0lYIHNpZ25hbCB2YWx1ZXMuCisKK0BpdGVtIFQKK0FsbG93cyB0aGUgcmVtb3RlIHN0dWIgdG8gc2VuZCBvbmx5IHRoZSByZWdpc3RlcnMgdGhhdCBAdmFsdWV7R0RCTn0gbmVlZHMKK3RvIG1ha2UgYSBxdWljayBkZWNpc2lvbiBhYm91dCBzaW5nbGUtc3RlcHBpbmcgb3IgY29uZGl0aW9uYWwgYnJlYWtwb2ludHMuCitUaGlzIGVsaW1pbmF0ZXMgdGhlIG5lZWQgdG8gZmV0Y2ggdGhlIGVudGlyZSByZWdpc3RlciBzZXQgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24KK2JlaW5nIHN0ZXBwZWQgdGhyb3VnaC4KKworQHZhbHVle0dEQk59IG5vdyBpbXBsZW1lbnRzIGEgd3JpdGUtdGhyb3VnaCBjYWNoZSBmb3IgcmVnaXN0ZXJzIGFuZCBvbmx5CityZS1yZWFkcyB0aGUgcmVnaXN0ZXJzIGlmIHRoZSB0YXJnZXQgaGFzIHJ1bi4KK0BlbmQgdGFibGUKKworQGtpbmRleCBzZXQgcmVtb3RlZGVidWcKK0BraW5kZXggc2hvdyByZW1vdGVkZWJ1ZworQGNpbmRleCBwYWNrZXRzLCByZXBvcnRpbmcgb24gc3Rkb3V0CitAY2luZGV4IHNlcmlhbCBjb25uZWN0aW9ucywgZGVidWdnaW5nCitJZiB5b3UgaGF2ZSB0cm91YmxlIHdpdGggdGhlIHNlcmlhbCBjb25uZWN0aW9uLCB5b3UgY2FuIHVzZSB0aGUgY29tbWFuZAorQGNvZGV7c2V0IHJlbW90ZWRlYnVnfS4gIFRoaXMgbWFrZXMgQHZhbHVle0dEQk59IHJlcG9ydCBvbiBhbGwgcGFja2V0cyBzZW50CitiYWNrIGFuZCBmb3J0aCBhY3Jvc3MgdGhlIHNlcmlhbCBsaW5lIHRvIHRoZSByZW1vdGUgbWFjaGluZS4gIFRoZQorcGFja2V0LWRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBwcmludGVkIG9uIHRoZSBAdmFsdWV7R0RCTn0gc3RhbmRhcmQgb3V0cHV0CitzdHJlYW0uICBAY29kZXtzZXQgcmVtb3RlZGVidWcgb2ZmfSB0dXJucyBpdCBvZmYsIGFuZCBAY29kZXtzaG93CityZW1vdGVkZWJ1Z30gc2hvd3MgeW91IGl0cyBjdXJyZW50IHN0YXRlLgorCitAaWZzZXQgR0RCU0VSVkVSCitAbm9kZSBTZXJ2ZXIKK0BzdWJzdWJzZWN0aW9uIFVzaW5nIHRoZSBAY29kZXtnZGJzZXJ2ZXJ9IHByb2dyYW0KKworQGtpbmRleCBnZGJzZXJ2ZXIKK0BjaW5kZXggcmVtb3RlIGNvbm5lY3Rpb24gd2l0aG91dCBzdHVicworQGNvZGV7Z2Ric2VydmVyfSBpcyBhIGNvbnRyb2wgcHJvZ3JhbSBmb3IgVW5peC1saWtlIHN5c3RlbXMsIHdoaWNoCithbGxvd3MgeW91IHRvIGNvbm5lY3QgeW91ciBwcm9ncmFtIHdpdGggYSByZW1vdGUgQHZhbHVle0dEQk59IHZpYQorQGNvZGV7dGFyZ2V0IHJlbW90ZX0tLS1idXQgd2l0aG91dCBsaW5raW5nIGluIHRoZSB1c3VhbCBkZWJ1Z2dpbmcgc3R1Yi4KKworQGNvZGV7Z2Ric2VydmVyfSBpcyBub3QgYSBjb21wbGV0ZSByZXBsYWNlbWVudCBmb3IgdGhlIGRlYnVnZ2luZyBzdHVicywKK2JlY2F1c2UgaXQgcmVxdWlyZXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgb3BlcmF0aW5nLXN5c3RlbSBmYWNpbGl0aWVzCit0aGF0IEB2YWx1ZXtHREJOfSBpdHNlbGYgZG9lcy4gIEluIGZhY3QsIGEgc3lzdGVtIHRoYXQgY2FuIHJ1bgorQGNvZGV7Z2Ric2VydmVyfSB0byBjb25uZWN0IHRvIGEgcmVtb3RlIEB2YWx1ZXtHREJOfSBjb3VsZCBhbHNvIHJ1bgorQHZhbHVle0dEQk59IGxvY2FsbHkhICBAY29kZXtnZGJzZXJ2ZXJ9IGlzIHNvbWV0aW1lcyB1c2VmdWwgbmV2ZXJ0aGVsZXNzLAorYmVjYXVzZSBpdCBpcyBhIG11Y2ggc21hbGxlciBwcm9ncmFtIHRoYW4gQHZhbHVle0dEQk59IGl0c2VsZi4gIEl0IGlzCithbHNvIGVhc2llciB0byBwb3J0IHRoYW4gYWxsIG9mIEB2YWx1ZXtHREJOfSwgc28geW91IG1heSBiZSBhYmxlIHRvIGdldAorc3RhcnRlZCBtb3JlIHF1aWNrbHkgb24gYSBuZXcgc3lzdGVtIGJ5IHVzaW5nIEBjb2Rle2dkYnNlcnZlcn0uCitGaW5hbGx5LCBpZiB5b3UgZGV2ZWxvcCBjb2RlIGZvciByZWFsLXRpbWUgc3lzdGVtcywgeW91IG1heSBmaW5kIHRoYXQKK3RoZSB0cmFkZW9mZnMgaW52b2x2ZWQgaW4gcmVhbC10aW1lIG9wZXJhdGlvbiBtYWtlIGl0IG1vcmUgY29udmVuaWVudCB0bworZG8gYXMgbXVjaCBkZXZlbG9wbWVudCB3b3JrIGFzIHBvc3NpYmxlIG9uIGFub3RoZXIgc3lzdGVtLCBmb3IgZXhhbXBsZQorYnkgY3Jvc3MtY29tcGlsaW5nLiAgWW91IGNhbiB1c2UgQGNvZGV7Z2Ric2VydmVyfSB0byBtYWtlIGEgc2ltaWxhcgorY2hvaWNlIGZvciBkZWJ1Z2dpbmcuCisKK0B2YWx1ZXtHREJOfSBhbmQgQGNvZGV7Z2Ric2VydmVyfSBjb21tdW5pY2F0ZSB2aWEgZWl0aGVyIGEgc2VyaWFsIGxpbmUKK29yIGEgVENQIGNvbm5lY3Rpb24sIHVzaW5nIHRoZSBzdGFuZGFyZCBAdmFsdWV7R0RCTn0gcmVtb3RlIHNlcmlhbAorcHJvdG9jb2wuCisKK0B0YWJsZSBAZW1waAorQGl0ZW0gT24gdGhlIHRhcmdldCBtYWNoaW5lLAoreW91IG5lZWQgdG8gaGF2ZSBhIGNvcHkgb2YgdGhlIHByb2dyYW0geW91IHdhbnQgdG8gZGVidWcuCitAY29kZXtnZGJzZXJ2ZXJ9IGRvZXMgbm90IG5lZWQgeW91ciBwcm9ncmFtJ3Mgc3ltYm9sIHRhYmxlLCBzbyB5b3UgY2FuCitzdHJpcCB0aGUgcHJvZ3JhbSBpZiBuZWNlc3NhcnkgdG8gc2F2ZSBzcGFjZS4gIEB2YWx1ZXtHREJOfSBvbiB0aGUgaG9zdAorc3lzdGVtIGRvZXMgYWxsIHRoZSBzeW1ib2wgaGFuZGxpbmcuCisKK1RvIHVzZSB0aGUgc2VydmVyLCB5b3UgbXVzdCB0ZWxsIGl0IGhvdyB0byBjb21tdW5pY2F0ZSB3aXRoIEB2YWx1ZXtHREJOfTsKK3RoZSBuYW1lIG9mIHlvdXIgcHJvZ3JhbTsgYW5kIHRoZSBhcmd1bWVudHMgZm9yIHlvdXIgcHJvZ3JhbS4gIFRoZQorc3ludGF4IGlzOgorCitAc21hbGxleGFtcGxlCit0YXJnZXQ+IGdkYnNlcnZlciBAdmFye2NvbW19IEB2YXJ7cHJvZ3JhbX0gWyBAdmFye2FyZ3N9IEBkb3Rze30gXQorQGVuZCBzbWFsbGV4YW1wbGUKKworQHZhcntjb21tfSBpcyBlaXRoZXIgYSBkZXZpY2UgbmFtZSAodG8gdXNlIGEgc2VyaWFsIGxpbmUpIG9yIGEgVENQCitob3N0bmFtZSBhbmQgcG9ydG51bWJlci4gIEZvciBleGFtcGxlLCB0byBkZWJ1ZyBFbWFjcyB3aXRoIHRoZSBhcmd1bWVudAorQHNhbXB7Zm9vLnR4dH0gYW5kIGNvbW11bmljYXRlIHdpdGggQHZhbHVle0dEQk59IG92ZXIgdGhlIHNlcmlhbCBwb3J0CitAZmlsZXsvZGV2L2NvbTF9OgorCitAc21hbGxleGFtcGxlCit0YXJnZXQ+IGdkYnNlcnZlciAvZGV2L2NvbTEgZW1hY3MgZm9vLnR4dAorQGVuZCBzbWFsbGV4YW1wbGUKKworQGNvZGV7Z2Ric2VydmVyfSB3YWl0cyBwYXNzaXZlbHkgZm9yIHRoZSBob3N0IEB2YWx1ZXtHREJOfSB0byBjb21tdW5pY2F0ZQord2l0aCBpdC4KKworVG8gdXNlIGEgVENQIGNvbm5lY3Rpb24gaW5zdGVhZCBvZiBhIHNlcmlhbCBsaW5lOgorCitAc21hbGxleGFtcGxlCit0YXJnZXQ+IGdkYnNlcnZlciBob3N0OjIzNDUgZW1hY3MgZm9vLnR4dAorQGVuZCBzbWFsbGV4YW1wbGUKKworVGhlIG9ubHkgZGlmZmVyZW5jZSBmcm9tIHRoZSBwcmV2aW91cyBleGFtcGxlIGlzIHRoZSBmaXJzdCBhcmd1bWVudCwKK3NwZWNpZnlpbmcgdGhhdCB5b3UgYXJlIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgaG9zdCBAdmFsdWV7R0RCTn0gdmlhCitUQ1AuICBUaGUgQHNhbXB7aG9zdDoyMzQ1fSBhcmd1bWVudCBtZWFucyB0aGF0IEBjb2Rle2dkYnNlcnZlcn0gaXMgdG8KK2V4cGVjdCBhIFRDUCBjb25uZWN0aW9uIGZyb20gbWFjaGluZSBAc2FtcHtob3N0fSB0byBsb2NhbCBUQ1AgcG9ydCAyMzQ1LgorKEN1cnJlbnRseSwgdGhlIEBzYW1we2hvc3R9IHBhcnQgaXMgaWdub3JlZC4pICBZb3UgY2FuIGNob29zZSBhbnkgbnVtYmVyCit5b3Ugd2FudCBmb3IgdGhlIHBvcnQgbnVtYmVyIGFzIGxvbmcgYXMgaXQgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBhbnkKK1RDUCBwb3J0cyBhbHJlYWR5IGluIHVzZSBvbiB0aGUgdGFyZ2V0IHN5c3RlbSAoZm9yIGV4YW1wbGUsIEBjb2RlezIzfSBpcworcmVzZXJ2ZWQgZm9yIEBjb2Rle3RlbG5ldH0pLkBmb290bm90ZXtJZiB5b3UgY2hvb3NlIGEgcG9ydCBudW1iZXIgdGhhdAorY29uZmxpY3RzIHdpdGggYW5vdGhlciBzZXJ2aWNlLCBAY29kZXtnZGJzZXJ2ZXJ9IHByaW50cyBhbiBlcnJvciBtZXNzYWdlCithbmQgZXhpdHMufSBZb3UgbXVzdCB1c2UgdGhlIHNhbWUgcG9ydCBudW1iZXIgd2l0aCB0aGUgaG9zdCBAdmFsdWV7R0RCTn0KK0Bjb2Rle3RhcmdldCByZW1vdGV9IGNvbW1hbmQuCisKK0BpdGVtIE9uIHRoZSBAdmFsdWV7R0RCTn0gaG9zdCBtYWNoaW5lLAoreW91IG5lZWQgYW4gdW5zdHJpcHBlZCBjb3B5IG9mIHlvdXIgcHJvZ3JhbSwgc2luY2UgQHZhbHVle0dEQk59IG5lZWRzCitzeW1ib2xzIGFuZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBTdGFydCB1cCBAdmFsdWV7R0RCTn0gYXMgdXN1YWwsCit1c2luZyB0aGUgbmFtZSBvZiB0aGUgbG9jYWwgY29weSBvZiB5b3VyIHByb2dyYW0gYXMgdGhlIGZpcnN0IGFyZ3VtZW50LgorKFlvdSBtYXkgYWxzbyBuZWVkIHRoZSBAd3tAc2FtcHstLWJhdWR9fSBvcHRpb24gaWYgdGhlIHNlcmlhbCBsaW5lIGlzCitydW5uaW5nIGF0IGFueXRoaW5nIG90aGVyIHRoYW4gOTYwMCBicHMuKSAgQWZ0ZXIgdGhhdCwgdXNlIEBjb2Rle3RhcmdldAorcmVtb3RlfSB0byBlc3RhYmxpc2ggY29tbXVuaWNhdGlvbnMgd2l0aCBAY29kZXtnZGJzZXJ2ZXJ9LiAgSXRzIGFyZ3VtZW50CitpcyBlaXRoZXIgYSBkZXZpY2UgbmFtZSAodXN1YWxseSBhIHNlcmlhbCBkZXZpY2UsIGxpa2UKK0BmaWxley9kZXYvdHR5Yn0pLCBvciBhIFRDUCBwb3J0IGRlc2NyaXB0b3IgaW4gdGhlIGZvcm0KK0Bjb2Rle0B2YXJ7aG9zdH06QHZhcntQT1JUfX0uICBGb3IgZXhhbXBsZToKKworQHNtYWxsZXhhbXBsZQorKEB2YWx1ZXtHREJQfSkgdGFyZ2V0IHJlbW90ZSAvZGV2L3R0eWIKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2luZGVudAorY29tbXVuaWNhdGVzIHdpdGggdGhlIHNlcnZlciB2aWEgc2VyaWFsIGxpbmUgQGZpbGV7L2Rldi90dHlifSwgYW5kCisKK0BzbWFsbGV4YW1wbGUKKyhAdmFsdWV7R0RCUH0pIHRhcmdldCByZW1vdGUgdGhlLXRhcmdldDoyMzQ1CitAZW5kIHNtYWxsZXhhbXBsZQorCitAbm9pbmRlbnQKK2NvbW11bmljYXRlcyB2aWEgYSBUQ1AgY29ubmVjdGlvbiB0byBwb3J0IDIzNDUgb24gaG9zdCBAd3tAZmlsZXt0aGUtdGFyZ2V0fX0uCitGb3IgVENQIGNvbm5lY3Rpb25zLCB5b3UgbXVzdCBzdGFydCB1cCBAY29kZXtnZGJzZXJ2ZXJ9IHByaW9yIHRvIHVzaW5nCit0aGUgQGNvZGV7dGFyZ2V0IHJlbW90ZX0gY29tbWFuZC4gIE90aGVyd2lzZSB5b3UgbWF5IGdldCBhbiBlcnJvciB3aG9zZQordGV4dCBkZXBlbmRzIG9uIHRoZSBob3N0IHN5c3RlbSwgYnV0IHdoaWNoIHVzdWFsbHkgbG9va3Mgc29tZXRoaW5nIGxpa2UKK0BzYW1we0Nvbm5lY3Rpb24gcmVmdXNlZH0uCitAZW5kIHRhYmxlCitAZW5kIGlmc2V0CisKK0BpZnNldCBHREJTRVJWRQorQG5vZGUgTmV0V2FyZQorQHN1YnN1YnNlY3Rpb24gVXNpbmcgdGhlIEBjb2Rle2dkYnNlcnZlLm5sbX0gcHJvZ3JhbQorCitAa2luZGV4IGdkYnNlcnZlLm5sbQorQGNvZGV7Z2Ric2VydmUubmxtfSBpcyBhIGNvbnRyb2wgcHJvZ3JhbSBmb3IgTmV0V2FyZSBzeXN0ZW1zLCB3aGljaAorYWxsb3dzIHlvdSB0byBjb25uZWN0IHlvdXIgcHJvZ3JhbSB3aXRoIGEgcmVtb3RlIEB2YWx1ZXtHREJOfSB2aWEKK0Bjb2Rle3RhcmdldCByZW1vdGV9LgorCitAdmFsdWV7R0RCTn0gYW5kIEBjb2Rle2dkYnNlcnZlLm5sbX0gY29tbXVuaWNhdGUgdmlhIGEgc2VyaWFsIGxpbmUsCit1c2luZyB0aGUgc3RhbmRhcmQgQHZhbHVle0dEQk59IHJlbW90ZSBzZXJpYWwgcHJvdG9jb2wuCisKK0B0YWJsZSBAZW1waAorQGl0ZW0gT24gdGhlIHRhcmdldCBtYWNoaW5lLAoreW91IG5lZWQgdG8gaGF2ZSBhIGNvcHkgb2YgdGhlIHByb2dyYW0geW91IHdhbnQgdG8gZGVidWcuCitAY29kZXtnZGJzZXJ2ZS5ubG19IGRvZXMgbm90IG5lZWQgeW91ciBwcm9ncmFtJ3Mgc3ltYm9sIHRhYmxlLCBzbyB5b3UKK2NhbiBzdHJpcCB0aGUgcHJvZ3JhbSBpZiBuZWNlc3NhcnkgdG8gc2F2ZSBzcGFjZS4gIEB2YWx1ZXtHREJOfSBvbiB0aGUKK2hvc3Qgc3lzdGVtIGRvZXMgYWxsIHRoZSBzeW1ib2wgaGFuZGxpbmcuCisKK1RvIHVzZSB0aGUgc2VydmVyLCB5b3UgbXVzdCB0ZWxsIGl0IGhvdyB0byBjb21tdW5pY2F0ZSB3aXRoCitAdmFsdWV7R0RCTn07IHRoZSBuYW1lIG9mIHlvdXIgcHJvZ3JhbTsgYW5kIHRoZSBhcmd1bWVudHMgZm9yIHlvdXIKK3Byb2dyYW0uICBUaGUgc3ludGF4IGlzOgorCitAc21hbGxleGFtcGxlIAorbG9hZCBnZGJzZXJ2ZSBbIEJPQVJEPUB2YXJ7Ym9hcmR9IF0gWyBQT1JUPUB2YXJ7cG9ydH0gXQorICAgICAgICAgICAgICBbIEJBVUQ9QHZhcntiYXVkfSBdIEB2YXJ7cHJvZ3JhbX0gWyBAdmFye2FyZ3N9IEBkb3Rze30gXQorQGVuZCBzbWFsbGV4YW1wbGUKKworQHZhcntib2FyZH0gYW5kIEB2YXJ7cG9ydH0gc3BlY2lmeSB0aGUgc2VyaWFsIGxpbmU7IEB2YXJ7YmF1ZH0gc3BlY2lmaWVzCit0aGUgYmF1ZCByYXRlIHVzZWQgYnkgdGhlIGNvbm5lY3Rpb24uICBAdmFye3BvcnR9IGFuZCBAdmFye25vZGV9IGRlZmF1bHQKK3RvIDAsIEB2YXJ7YmF1ZH0gZGVmYXVsdHMgdG8gOTYwMCBicHMuCisKK0ZvciBleGFtcGxlLCB0byBkZWJ1ZyBFbWFjcyB3aXRoIHRoZSBhcmd1bWVudCBAc2FtcHtmb28udHh0fWFuZAorY29tbXVuaWNhdGUgd2l0aCBAdmFsdWV7R0RCTn0gb3ZlciBzZXJpYWwgcG9ydCBudW1iZXIgMiBvciBib2FyZCAxIAordXNpbmcgYSAxOTIwMCBicHMgY29ubmVjdGlvbjoKKworQHNtYWxsZXhhbXBsZQorbG9hZCBnZGJzZXJ2ZSBCT0FSRD0xIFBPUlQ9MiBCQVVEPTE5MjAwIGVtYWNzIGZvby50eHQKK0BlbmQgc21hbGxleGFtcGxlCisKK0BpdGVtIE9uIHRoZSBAdmFsdWV7R0RCTn0gaG9zdCBtYWNoaW5lLAoreW91IG5lZWQgYW4gdW5zdHJpcHBlZCBjb3B5IG9mIHlvdXIgcHJvZ3JhbSwgc2luY2UgQHZhbHVle0dEQk59IG5lZWRzCitzeW1ib2xzIGFuZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBTdGFydCB1cCBAdmFsdWV7R0RCTn0gYXMgdXN1YWwsCit1c2luZyB0aGUgbmFtZSBvZiB0aGUgbG9jYWwgY29weSBvZiB5b3VyIHByb2dyYW0gYXMgdGhlIGZpcnN0IGFyZ3VtZW50LgorKFlvdSBtYXkgYWxzbyBuZWVkIHRoZSBAd3tAc2FtcHstLWJhdWR9fSBvcHRpb24gaWYgdGhlIHNlcmlhbCBsaW5lIGlzCitydW5uaW5nIGF0IGFueXRoaW5nIG90aGVyIHRoYW4gOTYwMCBicHMuICBBZnRlciB0aGF0LCB1c2UgQGNvZGV7dGFyZ2V0CityZW1vdGV9IHRvIGVzdGFibGlzaCBjb21tdW5pY2F0aW9ucyB3aXRoIEBjb2Rle2dkYnNlcnZlLm5sbX0uICBJdHMKK2FyZ3VtZW50IGlzIGEgZGV2aWNlIG5hbWUgKHVzdWFsbHkgYSBzZXJpYWwgZGV2aWNlLCBsaWtlCitAZmlsZXsvZGV2L3R0eWJ9KS4gIEZvciBleGFtcGxlOgorCitAc21hbGxleGFtcGxlCisoQHZhbHVle0dEQlB9KSB0YXJnZXQgcmVtb3RlIC9kZXYvdHR5YgorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vaW5kZW50Citjb21tdW5pY2F0aW9ucyB3aXRoIHRoZSBzZXJ2ZXIgdmlhIHNlcmlhbCBsaW5lIEBmaWxley9kZXYvdHR5Yn0uCitAZW5kIHRhYmxlCitAZW5kIGlmc2V0CisKK0BlbmQgaWZzZXQKKworQGlmc2V0IEk5NjAKK0Bub2RlIGk5NjAtTmluZHkgUmVtb3RlCitAc3Vic2VjdGlvbiBAdmFsdWV7R0RCTn0gd2l0aCBhIHJlbW90ZSBpOTYwIChOaW5keSkKKworQGNpbmRleCBOaW5keQorQGNpbmRleCBpOTYwCitAZGZue05pbmR5fSBpcyBhIFJPTSBNb25pdG9yIHByb2dyYW0gZm9yIEludGVsIDk2MCB0YXJnZXQgc3lzdGVtcy4gIFdoZW4KK0B2YWx1ZXtHREJOfSBpcyBjb25maWd1cmVkIHRvIGNvbnRyb2wgYSByZW1vdGUgSW50ZWwgOTYwIHVzaW5nIE5pbmR5LCB5b3UgY2FuCit0ZWxsIEB2YWx1ZXtHREJOfSBob3cgdG8gY29ubmVjdCB0byB0aGUgOTYwIGluIHNldmVyYWwgd2F5czoKKworQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0KK1Rocm91Z2ggY29tbWFuZCBsaW5lIG9wdGlvbnMgc3BlY2lmeWluZyBzZXJpYWwgcG9ydCwgdmVyc2lvbiBvZiB0aGUKK05pbmR5IHByb3RvY29sLCBhbmQgY29tbXVuaWNhdGlvbnMgc3BlZWQ7CisKK0BpdGVtCitCeSByZXNwb25kaW5nIHRvIGEgcHJvbXB0IG9uIHN0YXJ0dXA7CisKK0BpdGVtCitCeSB1c2luZyB0aGUgQGNvZGV7dGFyZ2V0fSBjb21tYW5kIGF0IGFueSBwb2ludCBkdXJpbmcgeW91ciBAdmFsdWV7R0RCTn0KK3Nlc3Npb24uICBAeHJlZntUYXJnZXQgQ29tbWFuZHMsICxDb21tYW5kcyBmb3IgbWFuYWdpbmcgdGFyZ2V0c30uCisKK0BlbmQgaXRlbWl6ZQorCitAbWVudQorKiBOaW5keSBTdGFydHVwOjogICAgICAgICAgICAgICBTdGFydHVwIHdpdGggTmluZHkKKyogTmluZHkgT3B0aW9uczo6ICAgICAgICAgICAgICAgT3B0aW9ucyBmb3IgTmluZHkKKyogTmluZHkgUmVzZXQ6OiAgICAgICAgICAgICAgICAgTmluZHkgcmVzZXQgY29tbWFuZAorQGVuZCBtZW51CisKK0Bub2RlIE5pbmR5IFN0YXJ0dXAKK0BzdWJzdWJzZWN0aW9uIFN0YXJ0dXAgd2l0aCBOaW5keQorCitJZiB5b3Ugc2ltcGx5IHN0YXJ0IEBjb2Rle0B2YWx1ZXtHREJQfX0gd2l0aG91dCB1c2luZyBhbnkgY29tbWFuZC1saW5lCitvcHRpb25zLCB5b3UgYXJlIHByb21wdGVkIGZvciB3aGF0IHNlcmlhbCBwb3J0IHRvIHVzZSwgQGVtcGh7YmVmb3JlfSB5b3UKK3JlYWNoIHRoZSBvcmRpbmFyeSBAdmFsdWV7R0RCTn0gcHJvbXB0OgorCitAZXhhbXBsZQorQXR0YWNoIC9kZXYvdHR5Tk4gLS0gc3BlY2lmeSBOTiwgb3IgInF1aXQiIHRvIHF1aXQ6ICAKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK1Jlc3BvbmQgdG8gdGhlIHByb21wdCB3aXRoIHdoYXRldmVyIHN1ZmZpeCAoYWZ0ZXIgQHNhbXB7L2Rldi90dHl9KQoraWRlbnRpZmllcyB0aGUgc2VyaWFsIHBvcnQgeW91IHdhbnQgdG8gdXNlLiAgWW91IGNhbiwgaWYgeW91IGNob29zZSwKK3NpbXBseSBzdGFydCB1cCB3aXRoIG5vIE5pbmR5IGNvbm5lY3Rpb24gYnkgcmVzcG9uZGluZyB0byB0aGUgcHJvbXB0Cit3aXRoIGFuIGVtcHR5IGxpbmUuICBJZiB5b3UgZG8gdGhpcyBhbmQgbGF0ZXIgd2lzaCB0byBhdHRhY2ggdG8gTmluZHksCit1c2UgQGNvZGV7dGFyZ2V0fSAoQHB4cmVme1RhcmdldCBDb21tYW5kcywgLENvbW1hbmRzIGZvciBtYW5hZ2luZyB0YXJnZXRzfSkuCisKK0Bub2RlIE5pbmR5IE9wdGlvbnMKK0BzdWJzdWJzZWN0aW9uIE9wdGlvbnMgZm9yIE5pbmR5CisKK1RoZXNlIGFyZSB0aGUgc3RhcnR1cCBvcHRpb25zIGZvciBiZWdpbm5pbmcgeW91ciBAdmFsdWV7R0RCTn0gc2Vzc2lvbiB3aXRoIGEKK05pbmR5LTk2MCBib2FyZCBhdHRhY2hlZDoKKworQHRhYmxlIEBjb2RlCitAaXRlbSAtciBAdmFye3BvcnR9CitTcGVjaWZ5IHRoZSBzZXJpYWwgcG9ydCBuYW1lIG9mIGEgc2VyaWFsIGludGVyZmFjZSB0byBiZSB1c2VkIHRvIGNvbm5lY3QKK3RvIHRoZSB0YXJnZXQgc3lzdGVtLiAgVGhpcyBvcHRpb24gaXMgb25seSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7R0RCTn0gaXMKK2NvbmZpZ3VyZWQgZm9yIHRoZSBJbnRlbCA5NjAgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gIFlvdSBtYXkgc3BlY2lmeQorQHZhcntwb3J0fSBhcyBhbnkgb2Y6IGEgZnVsbCBwYXRobmFtZSAoZS5nLiBAc2FtcHstciAvZGV2L3R0eWF9KSwgYQorZGV2aWNlIG5hbWUgaW4gQGZpbGV7L2Rldn0gKGUuZy4gQHNhbXB7LXIgdHR5YX0pLCBvciBzaW1wbHkgdGhlIHVuaXF1ZQorc3VmZml4IGZvciBhIHNwZWNpZmljIEBjb2Rle3R0eX0gKGUuZy4gQHNhbXB7LXIgYX0pLgorCitAaXRlbSAtTworKEFuIHVwcGVyY2FzZSBsZXR0ZXIgYGBPJycsIG5vdCBhIHplcm8uKSAgU3BlY2lmeSB0aGF0IEB2YWx1ZXtHREJOfSBzaG91bGQgdXNlCit0aGUgYGBvbGQnJyBOaW5keSBtb25pdG9yIHByb3RvY29sIHRvIGNvbm5lY3QgdG8gdGhlIHRhcmdldCBzeXN0ZW0uCitUaGlzIG9wdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtHREJOfSBpcyBjb25maWd1cmVkIGZvciB0aGUgSW50ZWwgOTYwCit0YXJnZXQgYXJjaGl0ZWN0dXJlLgorCitAcXVvdGF0aW9uCitAZW1waHtXYXJuaW5nOn0gaWYgeW91IHNwZWNpZnkgQHNhbXB7LU99LCBidXQgYXJlIGFjdHVhbGx5IHRyeWluZyB0bworY29ubmVjdCB0byBhIHRhcmdldCBzeXN0ZW0gdGhhdCBleHBlY3RzIHRoZSBuZXdlciBwcm90b2NvbCwgdGhlIGNvbm5lY3Rpb24KK2ZhaWxzLCBhcHBlYXJpbmcgdG8gYmUgYSBzcGVlZCBtaXNtYXRjaC4gIEB2YWx1ZXtHREJOfSByZXBlYXRlZGx5CithdHRlbXB0cyB0byByZWNvbm5lY3QgYXQgc2V2ZXJhbCBkaWZmZXJlbnQgbGluZSBzcGVlZHMuICBZb3UgY2FuIGFib3J0Cit0aGlzIHByb2Nlc3Mgd2l0aCBhbiBpbnRlcnJ1cHQuCitAZW5kIHF1b3RhdGlvbgorCitAaXRlbSAtYnJrCitTcGVjaWZ5IHRoYXQgQHZhbHVle0dEQk59IHNob3VsZCBmaXJzdCBzZW5kIGEgQGNvZGV7QlJFQUt9IHNpZ25hbCB0byB0aGUgdGFyZ2V0CitzeXN0ZW0sIGluIGFuIGF0dGVtcHQgdG8gcmVzZXQgaXQsIGJlZm9yZSBjb25uZWN0aW5nIHRvIGEgTmluZHkgdGFyZ2V0LgorCitAcXVvdGF0aW9uCitAZW1waHtXYXJuaW5nOn0gTWFueSB0YXJnZXQgc3lzdGVtcyBkbyBub3QgaGF2ZSB0aGUgaGFyZHdhcmUgdGhhdCB0aGlzCityZXF1aXJlczsgaXQgb25seSB3b3JrcyB3aXRoIGEgZmV3IGJvYXJkcy4KK0BlbmQgcXVvdGF0aW9uCitAZW5kIHRhYmxlCisKK1RoZSBzdGFuZGFyZCBAc2FtcHstYn0gb3B0aW9uIGNvbnRyb2xzIHRoZSBsaW5lIHNwZWVkIHVzZWQgb24gdGhlIHNlcmlhbAorcG9ydC4KKworQGMgQGdyb3VwCitAbm9kZSBOaW5keSBSZXNldAorQHN1YnN1YnNlY3Rpb24gTmluZHkgcmVzZXQgY29tbWFuZAorCitAdGFibGUgQGNvZGUKK0BpdGVtIHJlc2V0CitAa2luZGV4IHJlc2V0CitGb3IgYSBOaW5keSB0YXJnZXQsIHRoaXMgY29tbWFuZCBzZW5kcyBhIGBgYnJlYWsnJyB0byB0aGUgcmVtb3RlIHRhcmdldAorc3lzdGVtOyB0aGlzIGlzIG9ubHkgdXNlZnVsIGlmIHRoZSB0YXJnZXQgaGFzIGJlZW4gZXF1aXBwZWQgd2l0aCBhCitjaXJjdWl0IHRvIHBlcmZvcm0gYSBoYXJkIHJlc2V0IChvciBzb21lIG90aGVyIGludGVyZXN0aW5nIGFjdGlvbikgd2hlbgorYSBicmVhayBpcyBkZXRlY3RlZC4KK0BlbmQgdGFibGUKK0BjIEBlbmQgZ3JvdXAKK0BlbmQgaWZzZXQKKworQGlmc2V0IEFNRDI5SworQG5vZGUgVURJMjlLIFJlbW90ZQorQHN1YnNlY3Rpb24gVGhlIFVESSBwcm90b2NvbCBmb3IgQU1EMjlLCisKK0BjaW5kZXggVURJCitAY2luZGV4IEFNRDI5SyB2aWEgVURJCitAdmFsdWV7R0RCTn0gc3VwcG9ydHMgQU1EJ3MgVURJIChgYFVuaXZlcnNhbCBEZWJ1Z2dlciBJbnRlcmZhY2UnJykKK3Byb3RvY29sIGZvciBkZWJ1Z2dpbmcgdGhlIGEyOWsgcHJvY2Vzc29yIGZhbWlseS4gIFRvIHVzZSB0aGlzCitjb25maWd1cmF0aW9uIHdpdGggQU1EIHRhcmdldHMgcnVubmluZyB0aGUgTWluaU1PTiBtb25pdG9yLCB5b3UgbmVlZCB0aGUKK3Byb2dyYW0gQGNvZGV7TU9OVElQfSwgYXZhaWxhYmxlIGZyb20gQU1EIGF0IG5vIGNoYXJnZS4gIFlvdSBjYW4gYWxzbwordXNlIEB2YWx1ZXtHREJOfSB3aXRoIHRoZSBVREktY29uZm9ybWFudCBhMjlrIHNpbXVsYXRvciBwcm9ncmFtCitAY29kZXtJU1NUSVB9LCBhbHNvIGF2YWlsYWJsZSBmcm9tIEFNRC4KKworQHRhYmxlIEBjb2RlCitAaXRlbSB0YXJnZXQgdWRpIEB2YXJ7a2V5d29yZH0KK0BraW5kZXggdWRpCitTZWxlY3QgdGhlIFVESSBpbnRlcmZhY2UgdG8gYSByZW1vdGUgYTI5ayBib2FyZCBvciBzaW11bGF0b3IsIHdoZXJlCitAdmFye2tleXdvcmR9IGlzIGFuIGVudHJ5IGluIHRoZSBBTUQgY29uZmlndXJhdGlvbiBmaWxlIEBmaWxle3VkaV9zb2N9LgorVGhpcyBmaWxlIGNvbnRhaW5zIGtleXdvcmQgZW50cmllcyB3aGljaCBzcGVjaWZ5IHBhcmFtZXRlcnMgdXNlZCB0bworY29ubmVjdCB0byBhMjlrIHRhcmdldHMuICBJZiB0aGUgQGZpbGV7dWRpX3NvY30gZmlsZSBpcyBub3QgaW4geW91cgord29ya2luZyBkaXJlY3RvcnksIHlvdSBtdXN0IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQHNhbXB7VURJQ09ORn0KK3RvIGl0cyBwYXRobmFtZS4KK0BlbmQgdGFibGUKKworQG5vZGUgRUIyOUsgUmVtb3RlCitAc3Vic2VjdGlvbiBUaGUgRUJNT04gcHJvdG9jb2wgZm9yIEFNRDI5SworCitAY2luZGV4IEVCMjlLIGJvYXJkCitAY2luZGV4IHJ1bm5pbmcgMjlLIHByb2dyYW1zCisKK0FNRCBkaXN0cmlidXRlcyBhIDI5SyBkZXZlbG9wbWVudCBib2FyZCBtZWFudCB0byBmaXQgaW4gYSBQQywgdG9nZXRoZXIKK3dpdGggYSBET1MtaG9zdGVkIG1vbml0b3IgcHJvZ3JhbSBjYWxsZWQgQGNvZGV7RUJNT059LiAgQXMgYSBzaG9ydGhhbmQKK3Rlcm0sIHRoaXMgZGV2ZWxvcG1lbnQgc3lzdGVtIGlzIGNhbGxlZCB0aGUgYGBFQjI5SycnLiAgVG8gdXNlCitAdmFsdWV7R0RCTn0gZnJvbSBhIFVuaXggc3lzdGVtIHRvIHJ1biBwcm9ncmFtcyBvbiB0aGUgRUIyOUsgYm9hcmQsIHlvdQorbXVzdCBmaXJzdCBjb25uZWN0IGEgc2VyaWFsIGNhYmxlIGJldHdlZW4gdGhlIFBDICh3aGljaCBob3N0cyB0aGUgRUIyOUsKK2JvYXJkKSBhbmQgYSBzZXJpYWwgcG9ydCBvbiB0aGUgVW5peCBzeXN0ZW0uICBJbiB0aGUgZm9sbG93aW5nLCB3ZQorYXNzdW1lIHlvdSd2ZSBob29rZWQgdGhlIGNhYmxlIGJldHdlZW4gdGhlIFBDJ3MgQGZpbGV7Q09NMX0gcG9ydCBhbmQKK0BmaWxley9kZXYvdHR5YX0gb24gdGhlIFVuaXggc3lzdGVtLgorCitAbWVudQorKiBDb21tcyAoRUIyOUspOjogICAgICAgICAgICAgICBDb21tdW5pY2F0aW9ucyBzZXR1cAorKiBnZGItRUIyOUs6OiAgICAgICAgICAgICAgICAgICBFQjI5SyBjcm9zcy1kZWJ1Z2dpbmcKKyogUmVtb3RlIExvZzo6ICAgICAgICAgICAgICAgICAgUmVtb3RlIGxvZworQGVuZCBtZW51CisKK0Bub2RlIENvbW1zIChFQjI5SykKK0BzdWJzdWJzZWN0aW9uIENvbW11bmljYXRpb25zIHNldHVwCisKK1RoZSBuZXh0IHN0ZXAgaXMgdG8gc2V0IHVwIHRoZSBQQydzIHBvcnQsIGJ5IGRvaW5nIHNvbWV0aGluZyBsaWtlIHRoaXMKK2luIERPUyBvbiB0aGUgUEM6CisKK0BleGFtcGxlCitDOlw+IE1PREUgY29tMTo5NjAwLG4sOCwxLG5vbmUKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK1RoaXMgZXhhbXBsZS0tLXJ1biBvbiBhbiBNUyBET1MgNC4wIHN5c3RlbS0tLXNldHMgdGhlIFBDIHBvcnQgdG8gOTYwMAorYnBzLCBubyBwYXJpdHksIGVpZ2h0IGRhdGEgYml0cywgb25lIHN0b3AgYml0LCBhbmQgbm8gYGByZXRyeScnIGFjdGlvbjsKK3lvdSBtdXN0IG1hdGNoIHRoZSBjb21tdW5pY2F0aW9ucyBwYXJhbWV0ZXJzIHdoZW4gZXN0YWJsaXNoaW5nIHRoZSBVbml4CitlbmQgb2YgdGhlIGNvbm5lY3Rpb24gYXMgd2VsbC4KK0BjIEZJWE1FOiBXaG8ga25vd3Mgd2hhdCB0aGlzICJubyByZXRyeSBhY3Rpb24iIGNydWQgZnJvbSB0aGUgRE9TIG1hbnVhbCBtYXkKK0BjICAgICAgIG1lYW4/ICBJdCdzIG9wdGlvbmFsOyBsZWF2ZSBpdCBvdXQ/IC0tLWRvY0BjeWdudXMuY29tLCAyNWZlYjkxIAorCitUbyBnaXZlIGNvbnRyb2wgb2YgdGhlIFBDIHRvIHRoZSBVbml4IHNpZGUgb2YgdGhlIHNlcmlhbCBsaW5lLCB0eXBlCit0aGUgZm9sbG93aW5nIGF0IHRoZSBET1MgY29uc29sZToKKworQGV4YW1wbGUKK0M6XD4gQ1RUWSBjb20xCitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CisoTGF0ZXIsIGlmIHlvdSB3aXNoIHRvIHJldHVybiBjb250cm9sIHRvIHRoZSBET1MgY29uc29sZSwgeW91IGNhbiB1c2UKK3RoZSBjb21tYW5kIEBjb2Rle0NUVFkgY29ufS0tLWJ1dCB5b3UgbXVzdCBzZW5kIGl0IG92ZXIgdGhlIGRldmljZSB0aGF0CitoYWQgY29udHJvbCwgaW4gb3VyIGV4YW1wbGUgb3ZlciB0aGUgQGZpbGV7Q09NMX0gc2VyaWFsIGxpbmUpLgorCitGcm9tIHRoZSBVbml4IGhvc3QsIHVzZSBhIGNvbW11bmljYXRpb25zIHByb2dyYW0gc3VjaCBhcyBAY29kZXt0aXB9IG9yCitAY29kZXtjdX0gdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgUEM7IGZvciBleGFtcGxlLAorCitAZXhhbXBsZQorY3UgLXMgOTYwMCAtbCAvZGV2L3R0eWEKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK1RoZSBAY29kZXtjdX0gb3B0aW9ucyBzaG93biBzcGVjaWZ5LCByZXNwZWN0aXZlbHksIHRoZSBsaW5lc3BlZWQgYW5kIHRoZQorc2VyaWFsIHBvcnQgdG8gdXNlLiAgSWYgeW91IHVzZSBAY29kZXt0aXB9IGluc3RlYWQsIHlvdXIgY29tbWFuZCBsaW5lCittYXkgbG9vayBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nOgorCitAZXhhbXBsZQordGlwIC05NjAwIC9kZXYvdHR5YQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorWW91ciBzeXN0ZW0gbWF5IHJlcXVpcmUgYSBkaWZmZXJlbnQgbmFtZSB3aGVyZSB3ZSBzaG93CitAZmlsZXsvZGV2L3R0eWF9IGFzIHRoZSBhcmd1bWVudCB0byBAY29kZXt0aXB9LiAgVGhlIGNvbW11bmljYXRpb25zCitwYXJhbWV0ZXJzLCBpbmNsdWRpbmcgd2hpY2ggcG9ydCB0byB1c2UsIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlCitAY29kZXt0aXB9IGFyZ3VtZW50IGluIHRoZSBgYHJlbW90ZScnIGRlc2NyaXB0aW9ucyBmaWxlLS0tbm9ybWFsbHkgdGhlCitzeXN0ZW0gdGFibGUgQGZpbGV7L2V0Yy9yZW1vdGV9LgorQGMgRklYTUU6IFdoYXQgaWYgYW55dGhpbmcgbmVlZHMgZG9pbmcgdG8gbWF0Y2ggdGhlICJuLDgsMSxub25lIiBwYXJ0IG9mCitAYyB0aGUgRE9TIHNpZGUncyBjb21tcyBzZXR1cD8gIGN1IGNhbiBzdXBwb3J0IC1vIChvZGQKK0BjIHBhcml0eSksIC1lIChldmVuIHBhcml0eSktLS1hcHBhcmVudGx5IG5vIHNldHRpbmdzIGZvciBubyBwYXJpdHkgb3IKK0BjIGZvciBjaGFyYWN0ZXIgc2l6ZS4gIFRha2VuIGZyb20gc3R0eSBtYXliZS4uLj8gIEpvaG4gcG9pbnRzIG91dCB0aXAKK0BjIGNhbiBzZXQgdGhlc2UgYXMgaW50ZXJuYWwgdmFyaWFibGVzLCBlZyB+cyBwYXJpdHk9bm9uZTsgbWFuIHN0dHkKK0BjIHN1Z2dlc3RzIHRoYXQgaXQgKm1pZ2h0KiB3b3JrIHRvIHN0dHkgdGhlc2Ugb3B0aW9ucyB3aXRoIHN0ZGluIG9yCitAYyBzdGRvdXQgcmVkaXJlY3RlZC4uLiAtLS1kb2NAY3lnbnVzLmNvbSwgMjVmZWI5MQorCitAa2luZGV4IEVCTU9OCitVc2luZyB0aGUgQGNvZGV7dGlwfSBvciBAY29kZXtjdX0gY29ubmVjdGlvbiwgY2hhbmdlIHRoZSBET1Mgd29ya2luZworZGlyZWN0b3J5IHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBhIGNvcHkgb2YgeW91ciAyOUsgcHJvZ3JhbSwgdGhlbgorc3RhcnQgdGhlIFBDIHByb2dyYW0gQGNvZGV7RUJNT059IChhbiBFQjI5SyBjb250cm9sIHByb2dyYW0gc3VwcGxpZWQKK3dpdGggeW91ciBib2FyZCBieSBBTUQpLiAgWW91IHNob3VsZCBzZWUgYW4gaW5pdGlhbCBkaXNwbGF5IGZyb20KK0Bjb2Rle0VCTU9OfSBzaW1pbGFyIHRvIHRoZSBvbmUgdGhhdCBmb2xsb3dzLCBlbmRpbmcgd2l0aCB0aGUKK0Bjb2Rle0VCTU9OfSBwcm9tcHQgQHNhbXB7I30tLS0KKworQGV4YW1wbGUKK0M6XD4gRzoKKworRzpcPiBDRCBcdXNyXGpvZVx3b3JrMjlrCisKK0c6XFVTUlxKT0VcV09SSzI5Sz4gRUJNT04KK0FtMjkwMDAgUEMgQ29wcm9jZXNzb3IgQm9hcmQgTW9uaXRvciwgdmVyc2lvbiAzLjAtMTgKK0NvcHlyaWdodCAxOTkwIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KK1dyaXR0ZW4gYnkgR2liYm9ucyBhbmQgQXNzb2NpYXRlcywgSW5jLgorCitFbnRlciAnPycgb3IgJ0gnIGZvciBoZWxwCisKK1BDIENvcHJvY2Vzc29yIFR5cGUgICA9IEVCMjlLCitJL08gQmFzZSAgICAgICAgICAgICAgPSAweDIwOAorTWVtb3J5IEJhc2UgICAgICAgICAgID0gMHhkMDAwMAorCitEYXRhIE1lbW9yeSBTaXplICAgICAgPSAyMDQ4S0IKK0F2YWlsYWJsZSBJLVJBTSBSYW5nZSA9IDB4ODAwMCB0byAweDFmZmZmZgorQXZhaWxhYmxlIEQtUkFNIFJhbmdlID0gMHg4MDAwMjAwMCB0byAweDgwMWZmZmZmCisKK1BhZ2VTaXplICAgICAgICAgICAgICA9IDB4NDAwCitSZWdpc3RlciBTdGFjayBTaXplICAgPSAweDgwMAorTWVtb3J5IFN0YWNrIFNpemUgICAgID0gMHgxODAwCisKK0NQVSBQUkwgICAgICAgICAgICAgICA9IDB4MworQW0yOTAyNyBBdmFpbGFibGUgICAgID0gTm8KK0J5dGUgV3JpdGUgQXZhaWxhYmxlICA9IFllcworCisjIH4uCitAZW5kIGV4YW1wbGUKKworVGhlbiBleGl0IHRoZSBAY29kZXtjdX0gb3IgQGNvZGV7dGlwfSBwcm9ncmFtIChkb25lIGluIHRoZSBleGFtcGxlIGJ5Cit0eXBpbmcgQGNvZGV7fi59IGF0IHRoZSBAY29kZXtFQk1PTn0gcHJvbXB0KS4gIEBjb2Rle0VCTU9OfSBrZWVwcworcnVubmluZywgcmVhZHkgZm9yIEB2YWx1ZXtHREJOfSB0byB0YWtlIG92ZXIuCisKK0ZvciB0aGlzIGV4YW1wbGUsIHdlJ3ZlIGFzc3VtZWQgd2hhdCBpcyBwcm9iYWJseSB0aGUgbW9zdCBjb252ZW5pZW50Cit3YXkgdG8gbWFrZSBzdXJlIHRoZSBzYW1lIDI5SyBwcm9ncmFtIGlzIG9uIGJvdGggdGhlIFBDIGFuZCB0aGUgVW5peAorc3lzdGVtOiBhIFBDL05GUyBjb25uZWN0aW9uIHRoYXQgZXN0YWJsaXNoZXMgYGBkcml2ZSBAY29kZXtHOn0nJyBvbiB0aGUKK1BDIGFzIGEgZmlsZSBzeXN0ZW0gb24gdGhlIFVuaXggaG9zdC4gIElmIHlvdSBkbyBub3QgaGF2ZSBQQy9ORlMgb3IKK3NvbWV0aGluZyBzaW1pbGFyIGNvbm5lY3RpbmcgdGhlIHR3byBzeXN0ZW1zLCB5b3UgbXVzdCBhcnJhbmdlIHNvbWUKK290aGVyIHdheS0tLXBlcmhhcHMgZmxvcHB5LWRpc2sgdHJhbnNmZXItLS1vZiBnZXR0aW5nIHRoZSAyOUsgcHJvZ3JhbQorZnJvbSB0aGUgVW5peCBzeXN0ZW0gdG8gdGhlIFBDOyBAdmFsdWV7R0RCTn0gZG9lcyBAZW1waHtub3R9IGRvd25sb2FkIGl0IG92ZXIgdGhlCitzZXJpYWwgbGluZS4KKworQG5vZGUgZ2RiLUVCMjlLCitAc3Vic3Vic2VjdGlvbiBFQjI5SyBjcm9zcy1kZWJ1Z2dpbmcKKworRmluYWxseSwgQGNvZGV7Y2R9IHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBhbiBpbWFnZSBvZiB5b3VyIDI5SworcHJvZ3JhbSBvbiB0aGUgVW5peCBzeXN0ZW0sIGFuZCBzdGFydCBAdmFsdWV7R0RCTn0tLS1zcGVjaWZ5aW5nIGFzIGFyZ3VtZW50IHRoZQorbmFtZSBvZiB5b3VyIDI5SyBwcm9ncmFtOgorCitAZXhhbXBsZQorY2QgL3Vzci9qb2Uvd29yazI5aworQHZhbHVle0dEQlB9IG15Zm9vCitAZW5kIGV4YW1wbGUKKworQG5lZWQgNTAwCitOb3cgeW91IGNhbiB1c2UgdGhlIEBjb2Rle3RhcmdldH0gY29tbWFuZDoKKworQGV4YW1wbGUKK3RhcmdldCBhbWQtZWIgL2Rldi90dHlhIDk2MDAgTVlGT08KK0BjIEZJWE1FOiB0ZXN0IGFib3ZlICd0YXJnZXQgYW1kLWViJyBhcyBzcGVsbGVkLCB3aXRoIGNhcHMhICBjYXBzIGFyZSBtZWFudCB0bworQGMgZW1waGFzaXplIHRoYXQgdGhpcyBpcyB0aGUgbmFtZSBhcyBzZWVuIGJ5IERPUyAoc2luY2UgSSB0aGluayBET1MgaXMKK0BjIHNpbmdsZS1taW5kZWQgYWJvdXQgY2FzZSBvZiBsZXR0ZXJzKS4gIC0tLWRvY0BjeWdudXMuY29tLCAyNWZlYjkxCitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitJbiB0aGlzIGV4YW1wbGUsIHdlJ3ZlIGFzc3VtZWQgeW91ciBwcm9ncmFtIGlzIGluIGEgZmlsZSBjYWxsZWQKK0BmaWxle215Zm9vfS4gIE5vdGUgdGhhdCB0aGUgZmlsZW5hbWUgZ2l2ZW4gYXMgdGhlIGxhc3QgYXJndW1lbnQgdG8KK0Bjb2Rle3RhcmdldCBhbWQtZWJ9IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSBhcyBpdCBhcHBlYXJzIHRvIERPUy4KK0luIG91ciBleGFtcGxlIHRoaXMgaXMgc2ltcGx5IEBjb2Rle01ZRk9PfSwgYnV0IGluIGdlbmVyYWwgaXQgY2FuIGluY2x1ZGUKK2EgRE9TIHBhdGgsIGFuZCBkZXBlbmRpbmcgb24geW91ciB0cmFuc2ZlciBtZWNoYW5pc20gbWF5IG5vdCByZXNlbWJsZQordGhlIG5hbWUgb24gdGhlIFVuaXggc2lkZS4KKworQXQgdGhpcyBwb2ludCwgeW91IGNhbiBzZXQgYW55IGJyZWFrcG9pbnRzIHlvdSB3aXNoOyB3aGVuIHlvdSBhcmUgcmVhZHkKK3RvIHNlZSB5b3VyIHByb2dyYW0gcnVuIG9uIHRoZSAyOUsgYm9hcmQsIHVzZSB0aGUgQHZhbHVle0dEQk59IGNvbW1hbmQKK0Bjb2Rle3J1bn0uCisKK1RvIHN0b3AgZGVidWdnaW5nIHRoZSByZW1vdGUgcHJvZ3JhbSwgdXNlIHRoZSBAdmFsdWV7R0RCTn0gQGNvZGV7ZGV0YWNofQorY29tbWFuZC4KKworVG8gcmV0dXJuIGNvbnRyb2wgb2YgdGhlIFBDIHRvIGl0cyBjb25zb2xlLCB1c2UgQGNvZGV7dGlwfSBvciBAY29kZXtjdX0KK29uY2UgYWdhaW4sIGFmdGVyIHlvdXIgQHZhbHVle0dEQk59IHNlc3Npb24gaGFzIGNvbmNsdWRlZCwgdG8gYXR0YWNoIHRvCitAY29kZXtFQk1PTn0uICBZb3UgY2FuIHRoZW4gdHlwZSB0aGUgY29tbWFuZCBAY29kZXtxfSB0byBzaHV0IGRvd24KK0Bjb2Rle0VCTU9OfSwgcmV0dXJuaW5nIGNvbnRyb2wgdG8gdGhlIERPUyBjb21tYW5kLWxpbmUgaW50ZXJwcmV0ZXIuCitUeXBlIEBjb2Rle0NUVFkgY29ufSB0byByZXR1cm4gY29tbWFuZCBpbnB1dCB0byB0aGUgbWFpbiBET1MgY29uc29sZSwKK2FuZCB0eXBlIEBrYmR7fi59IHRvIGxlYXZlIEBjb2Rle3RpcH0gb3IgQGNvZGV7Y3V9LgorCitAbm9kZSBSZW1vdGUgTG9nCitAc3Vic3Vic2VjdGlvbiBSZW1vdGUgbG9nCitAa2luZGV4IGViLmxvZworQGNpbmRleCBsb2cgZmlsZSBmb3IgRUIyOUsKKworVGhlIEBjb2Rle3RhcmdldCBhbWQtZWJ9IGNvbW1hbmQgY3JlYXRlcyBhIGZpbGUgQGZpbGV7ZWIubG9nfSBpbiB0aGUKK2N1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIHRvIGhlbHAgZGVidWcgcHJvYmxlbXMgd2l0aCB0aGUgY29ubmVjdGlvbi4KK0BmaWxle2ViLmxvZ30gcmVjb3JkcyBhbGwgdGhlIG91dHB1dCBmcm9tIEBjb2Rle0VCTU9OfSwgaW5jbHVkaW5nIGVjaG9lcworb2YgdGhlIGNvbW1hbmRzIHNlbnQgdG8gaXQuICBSdW5uaW5nIEBzYW1we3RhaWwgLWZ9IG9uIHRoaXMgZmlsZSBpbgorYW5vdGhlciB3aW5kb3cgb2Z0ZW4gaGVscHMgdG8gdW5kZXJzdGFuZCB0cm91YmxlIHdpdGggQGNvZGV7RUJNT059LCBvcgordW5leHBlY3RlZCBldmVudHMgb24gdGhlIFBDIHNpZGUgb2YgdGhlIGNvbm5lY3Rpb24uCisKK0BlbmQgaWZzZXQKKworQGlmc2V0IFNUMjAwMAorQG5vZGUgU1QyMDAwIFJlbW90ZQorQHN1YnNlY3Rpb24gQHZhbHVle0dEQk59IHdpdGggYSBUYW5kZW0gU1QyMDAwCisKK1RvIGNvbm5lY3QgeW91ciBTVDIwMDAgdG8gdGhlIGhvc3Qgc3lzdGVtLCBzZWUgdGhlIG1hbnVmYWN0dXJlcidzCittYW51YWwuICBPbmNlIHRoZSBTVDIwMDAgaXMgcGh5c2ljYWxseSBhdHRhY2hlZCwgeW91IGNhbiBydW46CisKK0BleGFtcGxlCit0YXJnZXQgc3QyMDAwIEB2YXJ7ZGV2fSBAdmFye3NwZWVkfQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAordG8gZXN0YWJsaXNoIGl0IGFzIHlvdXIgZGVidWdnaW5nIGVudmlyb25tZW50LiAgQHZhcntkZXZ9IGlzIG5vcm1hbGx5Cit0aGUgbmFtZSBvZiBhIHNlcmlhbCBkZXZpY2UsIHN1Y2ggYXMgQGZpbGV7L2Rldi90dHlhfSwgY29ubmVjdGVkIHRvIHRoZQorU1QyMDAwIHZpYSBhIHNlcmlhbCBsaW5lLiAgWW91IGNhbiBpbnN0ZWFkIHNwZWNpZnkgQHZhcntkZXZ9IGFzIGEgVENQCitjb25uZWN0aW9uIChmb3IgZXhhbXBsZSwgdG8gYSBzZXJpYWwgbGluZSBhdHRhY2hlZCB2aWEgYSB0ZXJtaW5hbAorY29uY2VudHJhdG9yKSB1c2luZyB0aGUgc3ludGF4IEBjb2Rle0B2YXJ7aG9zdG5hbWV9OkB2YXJ7cG9ydG51bWJlcn19LgorCitUaGUgQGNvZGV7bG9hZH0gYW5kIEBjb2Rle2F0dGFjaH0gY29tbWFuZHMgYXJlIEBlbXBoe25vdH0gZGVmaW5lZCBmb3IKK3RoaXMgdGFyZ2V0OyB5b3UgbXVzdCBsb2FkIHlvdXIgcHJvZ3JhbSBpbnRvIHRoZSBTVDIwMDAgYXMgeW91IG5vcm1hbGx5Cit3b3VsZCBmb3Igc3RhbmRhbG9uZSBvcGVyYXRpb24uICBAdmFsdWV7R0RCTn0gcmVhZHMgZGVidWdnaW5nIGluZm9ybWF0aW9uCisoc3VjaCBhcyBzeW1ib2xzKSBmcm9tIGEgc2VwYXJhdGUsIGRlYnVnZ2luZyB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtCithdmFpbGFibGUgb24geW91ciBob3N0IGNvbXB1dGVyLgorQGMgRklYTUUhISBUaGlzIGlzIHRlcnJpYmx5IHZhZ3VlOyB3aGF0IGxpdHRsZSBjb250ZW50IGlzIGhlcmUgaXMKK0BjIGJhc2ljYWxseSBoZWFyc2F5LgorCitAY2luZGV4IFNUMjAwMCBhdXhpbGlhcnkgY29tbWFuZHMKK1RoZXNlIGF1eGlsaWFyeSBAdmFsdWV7R0RCTn0gY29tbWFuZHMgYXJlIGF2YWlsYWJsZSB0byBoZWxwIHlvdSB3aXRoIHRoZSBTVDIwMDAKK2Vudmlyb25tZW50OgorCitAdGFibGUgQGNvZGUKK0BpdGVtIHN0MjAwMCBAdmFye2NvbW1hbmR9CitAa2luZGV4IHN0MjAwMCBAdmFye2NtZH0KK0BjaW5kZXggU1REQlVHIGNvbW1hbmRzIChTVDIwMDApCitAY2luZGV4IGNvbW1hbmRzIHRvIFNUREJVRyAoU1QyMDAwKQorU2VuZCBhIEB2YXJ7Y29tbWFuZH0gdG8gdGhlIFNUREJVRyBtb25pdG9yLiAgU2VlIHRoZSBtYW51ZmFjdHVyZXIncworbWFudWFsIGZvciBhdmFpbGFibGUgY29tbWFuZHMuCisKK0BpdGVtIGNvbm5lY3QKK0BjaW5kZXggY29ubmVjdCAodG8gU1REQlVHKQorQ29ubmVjdCB0aGUgY29udHJvbGxpbmcgdGVybWluYWwgdG8gdGhlIFNUREJVRyBjb21tYW5kIG1vbml0b3IuICBXaGVuCit5b3UgYXJlIGRvbmUgaW50ZXJhY3Rpbmcgd2l0aCBTVERCVUcsIHR5cGluZyBlaXRoZXIgb2YgdHdvIGNoYXJhY3Rlcgorc2VxdWVuY2VzIGdldHMgeW91IGJhY2sgdG8gdGhlIEB2YWx1ZXtHREJOfSBjb21tYW5kIHByb21wdDoKK0BrYmR7QGtleXtSRVR9fi59IChSZXR1cm4sIGZvbGxvd2VkIGJ5IHRpbGRlIGFuZCBwZXJpb2QpIG9yCitAa2Jke0BrZXl7UkVUfX5Aa2V5e0MtZH19IChSZXR1cm4sIGZvbGxvd2VkIGJ5IHRpbGRlIGFuZCBjb250cm9sLUQpLgorQGVuZCB0YWJsZQorQGVuZCBpZnNldAorCitAaWZzZXQgVlhXT1JLUworQG5vZGUgVnhXb3JrcyBSZW1vdGUKK0BzdWJzZWN0aW9uIEB2YWx1ZXtHREJOfSBhbmQgVnhXb3JrcworQGNpbmRleCBWeFdvcmtzCisKK0B2YWx1ZXtHREJOfSBlbmFibGVzIGRldmVsb3BlcnMgdG8gc3Bhd24gYW5kIGRlYnVnIHRhc2tzIHJ1bm5pbmcgb24gbmV0d29ya2VkCitWeFdvcmtzIHRhcmdldHMgZnJvbSBhIFVuaXggaG9zdC4gIEFscmVhZHktcnVubmluZyB0YXNrcyBzcGF3bmVkIGZyb20KK3RoZSBWeFdvcmtzIHNoZWxsIGNhbiBhbHNvIGJlIGRlYnVnZ2VkLiAgQHZhbHVle0dEQk59IHVzZXMgY29kZSB0aGF0IHJ1bnMgb24KK2JvdGggdGhlIFVuaXggaG9zdCBhbmQgb24gdGhlIFZ4V29ya3MgdGFyZ2V0LiAgVGhlIHByb2dyYW0KK0Bjb2Rle2dkYn0gaXMgaW5zdGFsbGVkIGFuZCBleGVjdXRlZCBvbiB0aGUgVW5peCBob3N0LiAgKEl0IG1heSBiZQoraW5zdGFsbGVkIHdpdGggdGhlIG5hbWUgQGNvZGV7dnhnZGJ9LCB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIGEKK0B2YWx1ZXtHREJOfSBmb3IgZGVidWdnaW5nIHByb2dyYW1zIG9uIHRoZSBob3N0IGl0c2VsZi4pCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gVnhXb3Jrcy10aW1lb3V0IEB2YXJ7YXJnc30KK0BraW5kZXggdnh3b3Jrcy10aW1lb3V0CitBbGwgVnhXb3Jrcy1iYXNlZCB0YXJnZXRzIG5vdyBzdXBwb3J0IHRoZSBvcHRpb24gQGNvZGV7dnh3b3Jrcy10aW1lb3V0fS4gIAorVGhpcyBvcHRpb24gaXMgc2V0IGJ5IHRoZSB1c2VyLCBhbmQgIEB2YXJ7YXJnc30gcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIAorc2Vjb25kcyBAdmFsdWV7R0RCTn0gd2FpdHMgZm9yIHJlc3BvbnNlcyB0byBycGMncy4gIFlvdSBtaWdodCB1c2UgdGhpcyBpZiAKK3lvdXIgVnhXb3JrcyB0YXJnZXQgaXMgYSBzbG93IHNvZnR3YXJlIHNpbXVsYXRvciBvciBpcyBvbiB0aGUgZmFyIHNpZGUgCitvZiBhIHRoaW4gbmV0d29yayBsaW5lLgorQGVuZCB0YWJsZQorCitUaGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIG9uIGNvbm5lY3RpbmcgdG8gVnhXb3JrcyB3YXMgY3VycmVudCB3aGVuCit0aGlzIG1hbnVhbCB3YXMgcHJvZHVjZWQ7IG5ld2VyIHJlbGVhc2VzIG9mIFZ4V29ya3MgbWF5IHVzZSByZXZpc2VkCitwcm9jZWR1cmVzLgorCitAa2luZGV4IElOQ0xVREVfUkRCCitUbyB1c2UgQHZhbHVle0dEQk59IHdpdGggVnhXb3JrcywgeW91IG11c3QgcmVidWlsZCB5b3VyIFZ4V29ya3Mga2VybmVsCit0byBpbmNsdWRlIHRoZSByZW1vdGUgZGVidWdnaW5nIGludGVyZmFjZSByb3V0aW5lcyBpbiB0aGUgVnhXb3JrcworbGlicmFyeSBAZmlsZXtyZGIuYX0uICBUbyBkbyB0aGlzLCBkZWZpbmUgQGNvZGV7SU5DTFVERV9SREJ9IGluIHRoZQorVnhXb3JrcyBjb25maWd1cmF0aW9uIGZpbGUgQGZpbGV7Y29uZmlnQWxsLmh9IGFuZCByZWJ1aWxkIHlvdXIgVnhXb3Jrcwora2VybmVsLiAgVGhlIHJlc3VsdGluZyBrZXJuZWwgY29udGFpbnMgQGZpbGV7cmRiLmF9LCBhbmQgc3Bhd25zIHRoZQorc291cmNlIGRlYnVnZ2luZyB0YXNrIEBjb2Rle3RSZGJUYXNrfSB3aGVuIFZ4V29ya3MgaXMgYm9vdGVkLiAgRm9yIG1vcmUKK2luZm9ybWF0aW9uIG9uIGNvbmZpZ3VyaW5nIGFuZCByZW1ha2luZyBWeFdvcmtzLCBzZWUgdGhlIG1hbnVmYWN0dXJlcidzCittYW51YWwuCitAYyBWeFdvcmtzLCBzZWUgdGhlIEBjaXRle1Z4V29ya3MgUHJvZ3JhbW1lcidzIEd1aWRlfS4KKworT25jZSB5b3UgaGF2ZSBpbmNsdWRlZCBAZmlsZXtyZGIuYX0gaW4geW91ciBWeFdvcmtzIHN5c3RlbSBpbWFnZSBhbmQgc2V0Cit5b3VyIFVuaXggZXhlY3V0aW9uIHNlYXJjaCBwYXRoIHRvIGZpbmQgQHZhbHVle0dEQk59LCB5b3UgYXJlIHJlYWR5IHRvCitydW4gQHZhbHVle0dEQk59LiAgRnJvbSB5b3VyIFVuaXggaG9zdCwgcnVuIEBjb2Rle2dkYn0gKG9yIEBjb2Rle3Z4Z2RifSwKK2RlcGVuZGluZyBvbiB5b3VyIGluc3RhbGxhdGlvbikuCisKK0B2YWx1ZXtHREJOfSBjb21lcyB1cCBzaG93aW5nIHRoZSBwcm9tcHQ6CisKK0BleGFtcGxlCisodnhnZGIpCitAZW5kIGV4YW1wbGUKKworQG1lbnUKKyogVnhXb3JrcyBDb25uZWN0aW9uOjogICAgICAgICAgQ29ubmVjdGluZyB0byBWeFdvcmtzCisqIFZ4V29ya3MgRG93bmxvYWQ6OiAgICAgICAgICAgIFZ4V29ya3MgZG93bmxvYWQKKyogVnhXb3JrcyBBdHRhY2g6OiAgICAgICAgICAgICAgUnVubmluZyB0YXNrcworQGVuZCBtZW51CisKK0Bub2RlIFZ4V29ya3MgQ29ubmVjdGlvbgorQHN1YnN1YnNlY3Rpb24gQ29ubmVjdGluZyB0byBWeFdvcmtzCisKK1RoZSBAdmFsdWV7R0RCTn0gY29tbWFuZCBAY29kZXt0YXJnZXR9IGxldHMgeW91IGNvbm5lY3QgdG8gYSBWeFdvcmtzIHRhcmdldCBvbiB0aGUKK25ldHdvcmsuICBUbyBjb25uZWN0IHRvIGEgdGFyZ2V0IHdob3NlIGhvc3QgbmFtZSBpcyBgYEBjb2Rle3R0fScnLCB0eXBlOgorCitAZXhhbXBsZQorKHZ4Z2RiKSB0YXJnZXQgdnh3b3JrcyB0dAorQGVuZCBleGFtcGxlCisKK0BuZWVkIDc1MAorQHZhbHVle0dEQk59IGRpc3BsYXlzIG1lc3NhZ2VzIGxpa2UgdGhlc2U6CisKK0BzbWFsbGV4YW1wbGUKK0F0dGFjaGluZyByZW1vdGUgbWFjaGluZSBhY3Jvc3MgbmV0Li4uIAorQ29ubmVjdGVkIHRvIHR0LgorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5lZWQgMTAwMAorQHZhbHVle0dEQk59IHRoZW4gYXR0ZW1wdHMgdG8gcmVhZCB0aGUgc3ltYm9sIHRhYmxlcyBvZiBhbnkgb2JqZWN0IG1vZHVsZXMKK2xvYWRlZCBpbnRvIHRoZSBWeFdvcmtzIHRhcmdldCBzaW5jZSBpdCB3YXMgbGFzdCBib290ZWQuICBAdmFsdWV7R0RCTn0gbG9jYXRlcwordGhlc2UgZmlsZXMgYnkgc2VhcmNoaW5nIHRoZSBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gdGhlIGNvbW1hbmQgc2VhcmNoCitwYXRoIChAcHhyZWZ7RW52aXJvbm1lbnQsICxZb3VyIHByb2dyYW0ncyBlbnZpcm9ubWVudH0pOyBpZiBpdCBmYWlscwordG8gZmluZCBhbiBvYmplY3QgZmlsZSwgaXQgZGlzcGxheXMgYSBtZXNzYWdlIHN1Y2ggYXM6CisKK0BleGFtcGxlCitwcm9nLm86IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkuCitAZW5kIGV4YW1wbGUKKworV2hlbiB0aGlzIGhhcHBlbnMsIGFkZCB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5IHRvIHRoZSBzZWFyY2ggcGF0aCB3aXRoCit0aGUgQHZhbHVle0dEQk59IGNvbW1hbmQgQGNvZGV7cGF0aH0sIGFuZCBleGVjdXRlIHRoZSBAY29kZXt0YXJnZXR9Citjb21tYW5kIGFnYWluLgorCitAbm9kZSBWeFdvcmtzIERvd25sb2FkCitAc3Vic3Vic2VjdGlvbiBWeFdvcmtzIGRvd25sb2FkCisKK0BjaW5kZXggZG93bmxvYWQgdG8gVnhXb3JrcworSWYgeW91IGhhdmUgY29ubmVjdGVkIHRvIHRoZSBWeFdvcmtzIHRhcmdldCBhbmQgeW91IHdhbnQgdG8gZGVidWcgYW4KK29iamVjdCB0aGF0IGhhcyBub3QgeWV0IGJlZW4gbG9hZGVkLCB5b3UgY2FuIHVzZSB0aGUgQHZhbHVle0dEQk59CitAY29kZXtsb2FkfSBjb21tYW5kIHRvIGRvd25sb2FkIGEgZmlsZSBmcm9tIFVuaXggdG8gVnhXb3JrcworaW5jcmVtZW50YWxseS4gIFRoZSBvYmplY3QgZmlsZSBnaXZlbiBhcyBhbiBhcmd1bWVudCB0byB0aGUgQGNvZGV7bG9hZH0KK2NvbW1hbmQgaXMgYWN0dWFsbHkgb3BlbmVkIHR3aWNlOiBmaXJzdCBieSB0aGUgVnhXb3JrcyB0YXJnZXQgaW4gb3JkZXIKK3RvIGRvd25sb2FkIHRoZSBjb2RlLCB0aGVuIGJ5IEB2YWx1ZXtHREJOfSBpbiBvcmRlciB0byByZWFkIHRoZSBzeW1ib2wKK3RhYmxlLiAgVGhpcyBjYW4gbGVhZCB0byBwcm9ibGVtcyBpZiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yaWVzIG9uCit0aGUgdHdvIHN5c3RlbXMgZGlmZmVyLiAgSWYgYm90aCBzeXN0ZW1zIGhhdmUgTkZTIG1vdW50ZWQgdGhlIHNhbWUKK2ZpbGVzeXN0ZW1zLCB5b3UgY2FuIGF2b2lkIHRoZXNlIHByb2JsZW1zIGJ5IHVzaW5nIGFic29sdXRlIHBhdGhzLgorT3RoZXJ3aXNlLCBpdCBpcyBzaW1wbGVzdCB0byBzZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9uIGJvdGggc3lzdGVtcwordG8gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgb2JqZWN0IGZpbGUgcmVzaWRlcywgYW5kIHRoZW4gdG8gcmVmZXJlbmNlCit0aGUgZmlsZSBieSBpdHMgbmFtZSwgd2l0aG91dCBhbnkgcGF0aC4gIEZvciBpbnN0YW5jZSwgYSBwcm9ncmFtCitAZmlsZXtwcm9nLm99IG1heSByZXNpZGUgaW4gQGZpbGV7QHZhcnt2eHBhdGh9L3Z3L2RlbW8vcmRifSBpbiBWeFdvcmtzCithbmQgaW4gQGZpbGV7QHZhcntob3N0cGF0aH0vdncvZGVtby9yZGJ9IG9uIHRoZSBob3N0LiAgVG8gbG9hZCB0aGlzCitwcm9ncmFtLCB0eXBlIHRoaXMgb24gVnhXb3JrczoKKworQGV4YW1wbGUKKy0+IGNkICJAdmFye3Z4cGF0aH0vdncvZGVtby9yZGIiCitAZW5kIGV4YW1wbGUKK3YKK1RoZW4sIGluIEB2YWx1ZXtHREJOfSwgdHlwZToKKworQGV4YW1wbGUKKyh2eGdkYikgY2QgQHZhcntob3N0cGF0aH0vdncvZGVtby9yZGIgCisodnhnZGIpIGxvYWQgcHJvZy5vCitAZW5kIGV4YW1wbGUKKworQHZhbHVle0dEQk59IGRpc3BsYXlzIGEgcmVzcG9uc2Ugc2ltaWxhciB0byB0aGlzOgorCitAc21hbGxleGFtcGxlCitSZWFkaW5nIHN5bWJvbCBkYXRhIGZyb20gd2hlcmV2ZXIvdncvZGVtby9yZGIvcHJvZy5vLi4uIGRvbmUuCitAZW5kIHNtYWxsZXhhbXBsZQorCitZb3UgY2FuIGFsc28gdXNlIHRoZSBAY29kZXtsb2FkfSBjb21tYW5kIHRvIHJlbG9hZCBhbiBvYmplY3QgbW9kdWxlCithZnRlciBlZGl0aW5nIGFuZCByZWNvbXBpbGluZyB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgZmlsZS4gIE5vdGUgdGhhdAordGhpcyBtYWtlcyBAdmFsdWV7R0RCTn0gZGVsZXRlIGFsbCBjdXJyZW50bHktZGVmaW5lZCBicmVha3BvaW50cywKK2F1dG8tZGlzcGxheXMsIGFuZCBjb252ZW5pZW5jZSB2YXJpYWJsZXMsIGFuZCB0byBjbGVhciB0aGUgdmFsdWUKK2hpc3RvcnkuICAoVGhpcyBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gcHJlc2VydmUgdGhlIGludGVncml0eSBvZgorZGVidWdnZXIgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgcmVmZXJlbmNlIHRoZSB0YXJnZXQgc3lzdGVtJ3Mgc3ltYm9sCit0YWJsZS4pCisKK0Bub2RlIFZ4V29ya3MgQXR0YWNoCitAc3Vic3Vic2VjdGlvbiBSdW5uaW5nIHRhc2tzCisKK0BjaW5kZXggcnVubmluZyBWeFdvcmtzIHRhc2tzCitZb3UgY2FuIGFsc28gYXR0YWNoIHRvIGFuIGV4aXN0aW5nIHRhc2sgdXNpbmcgdGhlIEBjb2Rle2F0dGFjaH0gY29tbWFuZCBhcworZm9sbG93czoKKworQGV4YW1wbGUKKyh2eGdkYikgYXR0YWNoIEB2YXJ7dGFza30KK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK3doZXJlIEB2YXJ7dGFza30gaXMgdGhlIFZ4V29ya3MgaGV4YWRlY2ltYWwgdGFzayBJRC4gIFRoZSB0YXNrIGNhbiBiZSBydW5uaW5nCitvciBzdXNwZW5kZWQgd2hlbiB5b3UgYXR0YWNoIHRvIGl0LiAgUnVubmluZyB0YXNrcyBhcmUgc3VzcGVuZGVkIGF0Cit0aGUgdGltZSBvZiBhdHRhY2htZW50LgorQGVuZCBpZnNldAorCitAaWZzZXQgU1BBUkNMRVQKK0Bub2RlIFNwYXJjbGV0IFJlbW90ZQorQHN1YnNlY3Rpb24gQHZhbHVle0dEQk59IGFuZCBTcGFyY2xldAorQGNpbmRleCBTcGFyY2xldAorCitAdmFsdWV7R0RCTn0gZW5hYmxlcyBkZXZlbG9wZXJzIHRvIGRlYnVnIHRhc2tzIHJ1bm5pbmcgb24gCitTcGFyY2xldCB0YXJnZXRzIGZyb20gYSBVbml4IGhvc3QuICAKK0B2YWx1ZXtHREJOfSB1c2VzIGNvZGUgdGhhdCBydW5zIG9uCitib3RoIHRoZSBVbml4IGhvc3QgYW5kIG9uIHRoZSBTcGFyY2xldCB0YXJnZXQuICBUaGUgcHJvZ3JhbQorQGNvZGV7Z2RifSBpcyBpbnN0YWxsZWQgYW5kIGV4ZWN1dGVkIG9uIHRoZSBVbml4IGhvc3QuICAKKworQHRhYmxlIEBjb2RlCitAaXRlbSB0aW1lb3V0IEB2YXJ7YXJnc30KK0BraW5kZXggcmVtb3RldGltZW91dAorQHZhbHVle0dEQk59IG5vdyBzdXBwb3J0cyB0aGUgb3B0aW9uIEBjb2Rle3JlbW90ZXRpbWVvdXR9LiAgCitUaGlzIG9wdGlvbiBpcyBzZXQgYnkgdGhlIHVzZXIsIGFuZCAgQHZhcnthcmdzfSByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgCitzZWNvbmRzIEB2YWx1ZXtHREJOfSB3YWl0cyBmb3IgcmVzcG9uc2VzLiAgCitAZW5kIHRhYmxlCisKK0BraW5kZXggQ29tcGlsaW5nCitXaGVuIGNvbXBpbGluZyBmb3IgZGVidWdnaW5nLCBpbmNsdWRlIHRoZSBvcHRpb25zICItZyIgdG8gZ2V0IGRlYnVnIAoraW5mb3JtYXRpb24gYW5kICItVHRleHQiIHRvIHJlbG9jYXRlIHRoZSBwcm9ncmFtIHRvIHdoZXJlIHlvdSB3aXNoIHRvCitsb2FkIGl0IG9uIHRoZSB0YXJnZXQuICBZb3UgbWF5IGFsc28gd2FudCB0byBhZGQgdGhlIG9wdGlvbnMgIi1uIiBvciAKKyItTiIgaW4gb3JkZXIgdG8gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBzZWN0aW9ucy4KKworQGV4YW1wbGUKK3NwYXJjbGV0LWFvdXQtZ2NjIHByb2cuYyAtVHRleHQgMHgxMjAxMDAwMCAtZyAtbyBwcm9nIC1OCitAZW5kIGV4YW1wbGUKKworWW91IGNhbiB1c2Ugb2JqZHVtcCB0byB2ZXJpZnkgdGhhdCB0aGUgYWRkcmVzc2VzIGFyZSB3aGF0IHlvdSBpbnRlbmRlZC4KKworQGV4YW1wbGUKK3NwYXJjbGV0LWFvdXQtb2JqZHVtcCAtLWhlYWRlcnMgLS1zeW1zIHByb2cKK0BlbmQgZXhhbXBsZQorCitAa2luZGV4IFJ1bm5pbmcKK09uY2UgeW91IGhhdmUgc2V0Cit5b3VyIFVuaXggZXhlY3V0aW9uIHNlYXJjaCBwYXRoIHRvIGZpbmQgQHZhbHVle0dEQk59LCB5b3UgYXJlIHJlYWR5IHRvCitydW4gQHZhbHVle0dEQk59LiAgRnJvbSB5b3VyIFVuaXggaG9zdCwgcnVuIEBjb2Rle2dkYn0gCisob3IgQGNvZGV7c3BhcmNsZXQtYW91dC1nZGJ9LCBkZXBlbmRpbmcgb24geW91ciBpbnN0YWxsYXRpb24pLgorCitAdmFsdWV7R0RCTn0gY29tZXMgdXAgc2hvd2luZyB0aGUgcHJvbXB0OgorCitAZXhhbXBsZQorKGdkYnNsZXQpCitAZW5kIGV4YW1wbGUKKworQG1lbnUKKyogU3BhcmNsZXQgRmlsZTo6ICAgICAgICAgICAgICAgIFNldHRpbmcgdGhlIGZpbGUgdG8gZGVidWcKKyogU3BhcmNsZXQgQ29ubmVjdGlvbjo6ICAgICAgICAgIENvbm5lY3RpbmcgdG8gU3BhcmNsZXQKKyogU3BhcmNsZXQgRG93bmxvYWQ6OiAgICAgICAgICAgIFNwYXJjbGV0IGRvd25sb2FkCisqIFNwYXJjbGV0IEV4ZWN1dGlvbjo6ICAgICAgICAgICBSdW5uaW5nIGFuZCBkZWJ1Z2dpbmcgCitAZW5kIG1lbnUKKworQG5vZGUgU3BhcmNsZXQgRmlsZQorQHN1YnN1YnNlY3Rpb24gU2V0dGluZyBmaWxlIHRvIGRlYnVnCisKK1RoZSBAdmFsdWV7R0RCTn0gY29tbWFuZCBAY29kZXtmaWxlfSBsZXRzIHlvdSBjaG9vc2Ugd2l0aCBwcm9ncmFtIHRvIGRlYnVnLgorCitAZXhhbXBsZQorKGdkYnNsZXQpIGZpbGUgcHJvZworQGVuZCBleGFtcGxlCisKK0BuZWVkIDEwMDAKK0B2YWx1ZXtHREJOfSB0aGVuIGF0dGVtcHRzIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZSBvZiBAZmlsZXtwcm9nfS4KK0B2YWx1ZXtHREJOfSBsb2NhdGVzCit0aGUgZmlsZSBieSBzZWFyY2hpbmcgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiB0aGUgY29tbWFuZCBzZWFyY2gKK3BhdGguCitJZiB0aGUgZmlsZSB3YXMgY29tcGlsZWQgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbiAob3B0aW9uICItZyIpLCBzb3VyY2UKK2ZpbGVzIHdpbGwgYmUgc2VhcmNoZWQgYXMgd2VsbC4KK0B2YWx1ZXtHREJOfSBsb2NhdGVzCit0aGUgc291cmNlIGZpbGVzIGJ5IHNlYXJjaGluZyB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGluIHRoZSBkaXJlY3Rvcnkgc2VhcmNoCitwYXRoIChAcHhyZWZ7RW52aXJvbm1lbnQsICxZb3VyIHByb2dyYW0ncyBlbnZpcm9ubWVudH0pLgorSWYgaXQgZmFpbHMKK3RvIGZpbmQgYSBmaWxlLCBpdCBkaXNwbGF5cyBhIG1lc3NhZ2Ugc3VjaCBhczoKKworQGV4YW1wbGUKK3Byb2c6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkuCitAZW5kIGV4YW1wbGUKKworV2hlbiB0aGlzIGhhcHBlbnMsIGFkZCB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMgdG8gdGhlIHNlYXJjaCBwYXRocyB3aXRoCit0aGUgQHZhbHVle0dEQk59IGNvbW1hbmRzIEBjb2Rle3BhdGh9IGFuZCBAY29kZXtkaXJ9LCBhbmQgZXhlY3V0ZSB0aGUgCitAY29kZXt0YXJnZXR9IGNvbW1hbmQgYWdhaW4uCisKK0Bub2RlIFNwYXJjbGV0IENvbm5lY3Rpb24KK0BzdWJzdWJzZWN0aW9uIENvbm5lY3RpbmcgdG8gU3BhcmNsZXQKKworVGhlIEB2YWx1ZXtHREJOfSBjb21tYW5kIEBjb2Rle3RhcmdldH0gbGV0cyB5b3UgY29ubmVjdCB0byBhIFNwYXJjbGV0IHRhcmdldC4KK1RvIGNvbm5lY3QgdG8gYSB0YXJnZXQgb24gc2VyaWFsIHBvcnQgYGBAY29kZXt0dHlhfScnLCB0eXBlOgorCitAZXhhbXBsZQorKGdkYnNsZXQpIHRhcmdldCBzcGFyY2xldCAvZGV2L3R0eWEKK1JlbW90ZSB0YXJnZXQgc3BhcmNsZXQgY29ubmVjdGVkIHRvIC9kZXYvdHR5YQorbWFpbiAoKSBhdCAuLi9wcm9nLmM6MyAKK0BlbmQgZXhhbXBsZQorCitAbmVlZCA3NTAKK0B2YWx1ZXtHREJOfSBkaXNwbGF5cyBtZXNzYWdlcyBsaWtlIHRoZXNlOgorCitAc21hbGxleGFtcGxlCitDb25uZWN0ZWQgdG8gdHR5YS4KK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2RlIFNwYXJjbGV0IERvd25sb2FkCitAc3Vic3Vic2VjdGlvbiBTcGFyY2xldCBkb3dubG9hZAorCitAY2luZGV4IGRvd25sb2FkIHRvIFNwYXJjbGV0CitPbmNlIGNvbm5lY3RlZCB0byB0aGUgU3BhcmNsZXQgdGFyZ2V0LCAKK3lvdSBjYW4gdXNlIHRoZSBAdmFsdWV7R0RCTn0KK0Bjb2Rle2xvYWR9IGNvbW1hbmQgdG8gZG93bmxvYWQgdGhlIGZpbGUgZnJvbSB0aGUgaG9zdCB0byB0aGUgdGFyZ2V0LgorVGhlIGZpbGUgbmFtZSBhbmQgbG9hZCBvZmZzZXQgc2hvdWxkIGJlIGdpdmVuIGFzIGFyZ3VtZW50cyB0byB0aGUgQGNvZGV7bG9hZH0KK2NvbW1hbmQuCitTaW5jZSB0aGUgZmlsZSBmb3JtYXQgaXMgYW91dCwgdGhlIHByb2dyYW0gbXVzdCBiZSBsb2FkZWQgdG8gdGhlIHN0YXJ0aW5nIAorYWRkcmVzcy4gIFlvdSBjYW4gdXNlIG9iamR1bXAgdG8gZmluZCBvdXQgd2hhdCB0aGlzIHZhbHVlIGlzLiAgVGhlIGxvYWQKK29mZnNldCBpcyBhbiBvZmZzZXQgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIFZNQSAodmlydHVhbCBtZW1vcnkgYWRkcmVzcykKK29mIGVhY2ggb2YgdGhlIGZpbGUncyBzZWN0aW9ucy4KK0ZvciBpbnN0YW5jZSwgaWYgdGhlIHByb2dyYW0KK0BmaWxle3Byb2d9IHdhcyBsaW5rZWQgdG8gdGV4dCBhZGRyZXNzIDB4MTIwMTAwMCwgd2l0aCBkYXRhIGF0IDB4MTIwMTAxNjAKK2FuZCBic3MgYXQgMHgxMjAxMDE3MCwgaW4gQHZhbHVle0dEQk59LCB0eXBlOgorCitAZXhhbXBsZQorKGdkYnNsZXQpIGxvYWQgcHJvZyAweDEyMDEwMDAwCitMb2FkaW5nIHNlY3Rpb24gLnRleHQsIHNpemUgMHhkYjAgdm1hIDB4MTIwMTAwMDAKK0BlbmQgZXhhbXBsZQorCitJZiB0aGUgY29kZSBpcyBsb2FkZWQgYXQgYSBkaWZmZXJlbnQgYWRkcmVzcyB0aGVuIHdoYXQgdGhlIHByb2dyYW0gd2FzIGxpbmtlZCAKK3RvLCB5b3UgbWF5IG5lZWQgdG8gdXNlIHRoZSBAY29kZXtzZWN0aW9ufSBhbmQgQGNvZGV7YWRkLXN5bWJvbC1maWxlfSBjb21tYW5kcyAKK3RvIHRlbGwgQHZhbHVle0dEQk59IHdoZXJlIHRvIG1hcCB0aGUgc3ltYm9sIHRhYmxlLgorCitAbm9kZSBTcGFyY2xldCBFeGVjdXRpb24KK0BzdWJzdWJzZWN0aW9uIFJ1bm5pbmcgYW5kIGRlYnVnZ2luZworCitAY2luZGV4IHJ1bm5pbmcgYW5kIGRlYnVnZ2luZyBTcGFyY2xldCBwcm9ncmFtcworWW91IGNhbiBub3cgYmVnaW4gZGVidWdnaW5nIHRoZSB0YXNrIHVzaW5nIEB2YWx1ZXtHREJOfSdzIGV4ZWN1dGlvbiBjb250cm9sCitjb21tYW5kcywgQGNvZGV7Yn0sIEBjb2Rle3N0ZXB9LCBAY29kZXtydW59LCBldGMuICBTZWUgdGhlIEB2YWx1ZXtHREJOfSAKK21hbnVhbCBmb3IgdGhlIGxpc3Qgb2YgY29tbWFuZHMuCisKK0BleGFtcGxlCisoZ2Ric2xldCkgYiBtYWluCitCcmVha3BvaW50IDEgYXQgMHgxMjAxMDAwMDogZmlsZSBwcm9nLmMsIGxpbmUgMy4KKyhnZGJzbGV0KSBydW4gCitTdGFydGluZyBwcm9ncmFtOiBwcm9nCitCcmVha3BvaW50IDEsIG1haW4gKGFyZ2M9MSwgYXJndj0weGVmZmZmMjFjKSBhdCBwcm9nLmM6MworMyAgICAgICAgY2hhciAqc3ltYXJnID0gMDsKKyhnZGJzbGV0KSBzdGVwCis0ICAgICAgICBjaGFyICpleGVjYXJnID0gImhlbGxvISI7CisoZ2Ric2xldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0BlbmQgZXhhbXBsZQorCitAZW5kIGlmc2V0CisKK0BpZnNldCBIOAorQG5vZGUgSGl0YWNoaSBSZW1vdGUKK0BzdWJzZWN0aW9uIEB2YWx1ZXtHREJOfSBhbmQgSGl0YWNoaSBtaWNyb3Byb2Nlc3NvcnMKK0B2YWx1ZXtHREJOfSBuZWVkcyB0byBrbm93IHRoZXNlIHRoaW5ncyB0byB0YWxrIHRvIHlvdXIKK0hpdGFjaGkgU0gsIEg4LzMwMCwgb3IgSDgvNTAwOiAKKworQGVudW1lcmF0ZQorQGl0ZW0KK3RoYXQgeW91IHdhbnQgdG8gdXNlIEBzYW1we3RhcmdldCBobXN9LCB0aGUgcmVtb3RlIGRlYnVnZ2luZyBpbnRlcmZhY2UKK2ZvciBIaXRhY2hpIG1pY3JvcHJvY2Vzc29ycywgb3IgQHNhbXB7dGFyZ2V0IGU3MDAwfSwgdGhlIGluLWNpcmN1aXQKK2VtdWxhdG9yIGZvciB0aGUgSGl0YWNoaSBTSCBhbmQgdGhlIEhpdGFjaGkgMzAwSC4gIChAc2FtcHt0YXJnZXQgaG1zfSBpcwordGhlIGRlZmF1bHQgd2hlbiBHREIgaXMgY29uZmlndXJlZCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBIaXRhY2hpIFNILAorSDgvMzAwLCBvciBIOC81MDAuKQorCitAaXRlbQord2hhdCBzZXJpYWwgZGV2aWNlIGNvbm5lY3RzIHlvdXIgaG9zdCB0byB5b3VyIEhpdGFjaGkgYm9hcmQgKHRoZSBmaXJzdAorc2VyaWFsIGRldmljZSBhdmFpbGFibGUgb24geW91ciBob3N0IGlzIHRoZSBkZWZhdWx0KS4KKworQGlmY2xlYXIgSDhFWENMVVNJVkUKK0BjIHRoaXMgaXMgb25seSBmb3IgVW5peCBob3N0cywgbm90IG9mIGludGVyZXN0IHRvIEhpdGFjaGkKK0BpdGVtCit3aGF0IHNwZWVkIHRvIHVzZSBvdmVyIHRoZSBzZXJpYWwgZGV2aWNlLgorQGVuZCBpZmNsZWFyCitAZW5kIGVudW1lcmF0ZQorCitAbWVudQorKiBIaXRhY2hpIEJvYXJkczo6ICAgICAgQ29ubmVjdGluZyB0byBIaXRhY2hpIGJvYXJkcy4KKyogSGl0YWNoaSBJQ0U6OiAgICAgICAgIFVzaW5nIHRoZSBFNzAwMCBJbi1DaXJjdWl0IEVtdWxhdG9yLgorKiBIaXRhY2hpIFNwZWNpYWw6OiAgICAgU3BlY2lhbCBAdmFsdWV7R0RCTn0gY29tbWFuZHMgZm9yIEhpdGFjaGkgbWljcm9zLgorQGVuZCBtZW51CisKK0Bub2RlIEhpdGFjaGkgQm9hcmRzCitAc3Vic3Vic2VjdGlvbiBDb25uZWN0aW5nIHRvIEhpdGFjaGkgYm9hcmRzCisKK0BpZmNsZWFyIEg4RVhDTFVTSVZFCitAYyBvbmx5IGZvciBVbml4IGhvc3RzCitAa2luZGV4IGRldmljZQorQGNpbmRleCBzZXJpYWwgZGV2aWNlLCBIaXRhY2hpIG1pY3JvcworVXNlIHRoZSBzcGVjaWFsIEBjb2Rle0B2YWx1ZXtHREJQfX0gY29tbWFuZCBAc2FtcHtkZXZpY2UgQHZhcntwb3J0fX0gaWYgeW91CituZWVkIHRvIGV4cGxpY2l0bHkgc2V0IHRoZSBzZXJpYWwgZGV2aWNlLiAgVGhlIGRlZmF1bHQgQHZhcntwb3J0fSBpcyB0aGUKK2ZpcnN0IGF2YWlsYWJsZSBwb3J0IG9uIHlvdXIgaG9zdC4gIFRoaXMgaXMgb25seSBuZWNlc3Nhcnkgb24gVW5peAoraG9zdHMsIHdoZXJlIGl0IGlzIHR5cGljYWxseSBzb21ldGhpbmcgbGlrZSBAZmlsZXsvZGV2L3R0eWF9LgorCitAa2luZGV4IHNwZWVkCitAY2luZGV4IHNlcmlhbCBsaW5lIHNwZWVkLCBIaXRhY2hpIG1pY3JvcworQGNvZGV7QHZhbHVle0dEQlB9fSBoYXMgYW5vdGhlciBzcGVjaWFsIGNvbW1hbmQgdG8gc2V0IHRoZSBjb21tdW5pY2F0aW9ucworc3BlZWQ6IEBzYW1we3NwZWVkIEB2YXJ7YnBzfX0uICBUaGlzIGNvbW1hbmQgYWxzbyBpcyBvbmx5IHVzZWQgZnJvbSBVbml4Citob3N0czsgb24gRE9TIGhvc3RzLCBzZXQgdGhlIGxpbmUgc3BlZWQgYXMgdXN1YWwgZnJvbSBvdXRzaWRlIEdEQiB3aXRoCit0aGUgRE9TIEBrYmR7bW9kZX0gY29tbWFuZCAoZm9yIGluc3RhbmNlLCBAd3tAc2FtcHttb2RlCitjb20yOjk2MDAsbiw4LDEscH19IGZvciBhIDk2MDAgYnBzIGNvbm5lY3Rpb24pLgorCitUaGUgQHNhbXB7ZGV2aWNlfSBhbmQgQHNhbXB7c3BlZWR9IGNvbW1hbmRzIGFyZSBhdmFpbGFibGUgb25seSB3aGVuIHlvdQordXNlIGEgVW5peCBob3N0IHRvIGRlYnVnIHlvdXIgSGl0YWNoaSBtaWNyb3Byb2Nlc3NvciBwcm9ncmFtcy4gIElmIHlvdQordXNlIGEgRE9TIGhvc3QsCitAZW5kIGlmY2xlYXIKK0B2YWx1ZXtHREJOfSBkZXBlbmRzIG9uIGFuIGF1eGlsaWFyeSB0ZXJtaW5hdGUtYW5kLXN0YXktcmVzaWRlbnQgcHJvZ3JhbQorY2FsbGVkIEBjb2Rle2FzeW5jdHNyfSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBkZXZlbG9wbWVudCBib2FyZAordGhyb3VnaCBhIFBDIHNlcmlhbCBwb3J0LiAgWW91IG11c3QgYWxzbyB1c2UgdGhlIERPUyBAY29kZXttb2RlfSBjb21tYW5kCit0byBzZXQgdXAgdGhlIHNlcmlhbCBwb3J0IG9uIHRoZSBET1Mgc2lkZS4KKworQGlmc2V0IERPU0hPU1QKK1RoZSBmb2xsb3dpbmcgc2FtcGxlIHNlc3Npb24gaWxsdXN0cmF0ZXMgdGhlIHN0ZXBzIG5lZWRlZCB0byBzdGFydCBhCitwcm9ncmFtIHVuZGVyIEB2YWx1ZXtHREJOfSBjb250cm9sIG9uIGFuIEg4LzMwMC4gIFRoZSBleGFtcGxlIHVzZXMgYQorc2FtcGxlIEg4LzMwMCBwcm9ncmFtIGNhbGxlZCBAZmlsZXt0Lnh9LiAgVGhlIHByb2NlZHVyZSBpcyB0aGUgc2FtZSBmb3IKK3RoZSBIaXRhY2hpIFNIIGFuZCB0aGUgSDgvNTAwLgorCitGaXJzdCBob29rIHVwIHlvdXIgZGV2ZWxvcG1lbnQgYm9hcmQuICBJbiB0aGlzIGV4YW1wbGUsIHdlIHVzZSBhCitib2FyZCBhdHRhY2hlZCB0byBzZXJpYWwgcG9ydCBAY29kZXtDT00yfTsgaWYgeW91IHVzZSBhIGRpZmZlcmVudCBzZXJpYWwKK3BvcnQsIHN1YnN0aXR1dGUgaXRzIG5hbWUgaW4gdGhlIGFyZ3VtZW50IG9mIHRoZSBAY29kZXttb2RlfSBjb21tYW5kLgorV2hlbiB5b3UgY2FsbCBAY29kZXthc3luY3Rzcn0sIHRoZSBhdXhpbGlhcnkgY29tbXMgcHJvZ3JhbSB1c2VkIGJ5IHRoZQorZGVndWdnZXIsIHlvdSBnaXZlIGl0IGp1c3QgdGhlIG51bWVyaWMgcGFydCBvZiB0aGUgc2VyaWFsIHBvcnQncyBuYW1lOworZm9yIGV4YW1wbGUsIEBzYW1we2FzeW5jc3RyIDJ9IGJlbG93IHJ1bnMgQGNvZGV7YXN5bmNzdHJ9IG9uCitAY29kZXtDT00yfS4KKworQGV4YW1wbGUKK0M6XEg4MzAwXFRFU1Q+IGFzeW5jdHNyIDIKK0M6XEg4MzAwXFRFU1Q+IG1vZGUgY29tMjo5NjAwLG4sOCwxLHAKKworUmVzaWRlbnQgcG9ydGlvbiBvZiBNT0RFIGxvYWRlZAorCitDT00yOiA5NjAwLCBuLCA4LCAxLCBwCisKK0BlbmQgZXhhbXBsZQorCitAcXVvdGF0aW9uCitAZW1waHtXYXJuaW5nOn0gV2UgaGF2ZSBub3RpY2VkIGEgYnVnIGluIFBDLU5GUyB0aGF0IGNvbmZsaWN0cyB3aXRoCitAY29kZXthc3luY3Rzcn0uICBJZiB5b3UgYWxzbyBydW4gUEMtTkZTIG9uIHlvdXIgRE9TIGhvc3QsIHlvdSBtYXkgbmVlZCB0bworZGlzYWJsZSBpdCwgb3IgZXZlbiBib290IHdpdGhvdXQgaXQsIHRvIHVzZSBAY29kZXthc3luY3Rzcn0gdG8gY29udHJvbAoreW91ciBkZXZlbG9wbWVudCBib2FyZC4KK0BlbmQgcXVvdGF0aW9uCisKK0BraW5kZXggdGFyZ2V0IGhtcworTm93IHRoYXQgc2VyaWFsIGNvbW11bmljYXRpb25zIGFyZSBzZXQgdXAsIGFuZCB0aGUgZGV2ZWxvcG1lbnQgYm9hcmQgaXMKK2Nvbm5lY3RlZCwgeW91IGNhbiBzdGFydCB1cCBAdmFsdWV7R0RCTn0uICBDYWxsIEBjb2Rle0B2YWx1ZXtHREJQfX0gd2l0aAordGhlIG5hbWUgb2YgeW91ciBwcm9ncmFtIGFzIHRoZSBhcmd1bWVudC4gIEBjb2Rle0B2YWx1ZXtHREJQfX0gcHJvbXB0cworeW91LCBhcyB1c3VhbCwgd2l0aCB0aGUgcHJvbXB0IEBzYW1weyhAdmFsdWV7R0RCUH0pfS4gIFVzZSB0d28gc3BlY2lhbAorY29tbWFuZHMgdG8gYmVnaW4geW91ciBkZWJ1Z2dpbmcgc2Vzc2lvbjogQHNhbXB7dGFyZ2V0IGhtc30gdG8gc3BlY2lmeQorY3Jvc3MtZGVidWdnaW5nIHRvIHRoZSBIaXRhY2hpIGJvYXJkLCBhbmQgdGhlIEBjb2Rle2xvYWR9IGNvbW1hbmQgdG8KK2Rvd25sb2FkIHlvdXIgcHJvZ3JhbSB0byB0aGUgYm9hcmQuICBAY29kZXtsb2FkfSBkaXNwbGF5cyB0aGUgbmFtZXMgb2YKK3RoZSBwcm9ncmFtJ3Mgc2VjdGlvbnMsIGFuZCBhIEBzYW1weyp9IGZvciBlYWNoIDJLIG9mIGRhdGEgZG93bmxvYWRlZC4KKyhJZiB5b3Ugd2FudCB0byByZWZyZXNoIEB2YWx1ZXtHREJOfSBkYXRhIG9uIHN5bWJvbHMgb3Igb24gdGhlCitleGVjdXRhYmxlIGZpbGUgd2l0aG91dCBkb3dubG9hZGluZywgdXNlIHRoZSBAdmFsdWV7R0RCTn0gY29tbWFuZHMKK0Bjb2Rle2ZpbGV9IG9yIEBjb2Rle3N5bWJvbC1maWxlfS4gIFRoZXNlIGNvbW1hbmRzLCBhbmQgQGNvZGV7bG9hZH0KK2l0c2VsZiwgYXJlIGRlc2NyaWJlZCBpbiBAcmVme0ZpbGVzLCxDb21tYW5kcyB0byBzcGVjaWZ5IGZpbGVzfS4pCisKK0BzbWFsbGV4YW1wbGUKKyhlZy1DOlxIODMwMFxURVNUKSBAdmFsdWV7R0RCUH0gdC54CitHREIgaXMgZnJlZSBzb2Z0d2FyZSBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIGRpc3RyaWJ1dGUgY29waWVzCisgb2YgaXQgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlICJzaG93IGNvcHlpbmciIHRvIHNlZSAKKyB0aGUgY29uZGl0aW9ucy4KK1RoZXJlIGlzIGFic29sdXRlbHkgbm8gd2FycmFudHkgZm9yIEdEQjsgdHlwZSAic2hvdyB3YXJyYW50eSIgCitmb3IgZGV0YWlscy4KK0dEQiBAdmFsdWV7R0RCVk59LCBDb3B5cmlnaHQgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4uLgorKGdkYikgdGFyZ2V0IGhtcworQ29ubmVjdGVkIHRvIHJlbW90ZSBIOC8zMDAgSE1TIHN5c3RlbS4KKyhnZGIpIGxvYWQgdC54CisudGV4dCAgIDogMHg4MDAwIC4uIDB4YWJkZSAqKioqKioqKioqKgorLmRhdGEgICA6IDB4YWJkZSAuLiAweGFkMzAgKgorLnN0YWNrICA6IDB4ZjAwMCAuLiAweGYwMTQgKgorQGVuZCBzbWFsbGV4YW1wbGUKKworQXQgdGhpcyBwb2ludCwgeW91J3JlIHJlYWR5IHRvIHJ1biBvciBkZWJ1ZyB5b3VyIHByb2dyYW0uICBGcm9tIGhlcmUgb24sCit5b3UgY2FuIHVzZSBhbGwgdGhlIHVzdWFsIEB2YWx1ZXtHREJOfSBjb21tYW5kcy4gIFRoZSBAY29kZXticmVha30gY29tbWFuZAorc2V0cyBicmVha3BvaW50czsgdGhlIEBjb2Rle3J1bn0gY29tbWFuZCBzdGFydHMgeW91ciBwcm9ncmFtOworQGNvZGV7cHJpbnR9IG9yIEBjb2Rle3h9IGRpc3BsYXkgZGF0YTsgdGhlIEBjb2Rle2NvbnRpbnVlfSBjb21tYW5kCityZXN1bWVzIGV4ZWN1dGlvbiBhZnRlciBzdG9wcGluZyBhdCBhIGJyZWFrcG9pbnQuICBZb3UgY2FuIHVzZSB0aGUKK0Bjb2Rle2hlbHB9IGNvbW1hbmQgYXQgYW55IHRpbWUgdG8gZmluZCBvdXQgbW9yZSBhYm91dCBAdmFsdWV7R0RCTn0gY29tbWFuZHMuCisKK1JlbWVtYmVyLCBob3dldmVyLCB0aGF0IEBlbXBoe29wZXJhdGluZyBzeXN0ZW19IGZhY2lsaXRpZXMgYXJlbid0CithdmFpbGFibGUgb24geW91ciBkZXZlbG9wbWVudCBib2FyZDsgZm9yIGV4YW1wbGUsIGlmIHlvdXIgcHJvZ3JhbSBoYW5ncywKK3lvdSBjYW4ndCBzZW5kIGFuIGludGVycnVwdC0tLWJ1dCB5b3UgY2FuIHByZXNzIHRoZSBAc2N7cmVzZXR9IHN3aXRjaCEKKworVXNlIHRoZSBAc2N7cmVzZXR9IGJ1dHRvbiBvbiB0aGUgZGV2ZWxvcG1lbnQgYm9hcmQKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCit0byBpbnRlcnJ1cHQgeW91ciBwcm9ncmFtIChkb24ndCB1c2UgQGtiZHtjdGwtQ30gb24gdGhlIERPUyBob3N0LS0taXQgaGFzCitubyB3YXkgdG8gcGFzcyBhbiBpbnRlcnJ1cHQgc2lnbmFsIHRvIHRoZSBkZXZlbG9wbWVudCBib2FyZCk7IGFuZAorCitAaXRlbQordG8gcmV0dXJuIHRvIHRoZSBAdmFsdWV7R0RCTn0gY29tbWFuZCBwcm9tcHQgYWZ0ZXIgeW91ciBwcm9ncmFtIGZpbmlzaGVzCitub3JtYWxseS4gIFRoZSBjb21tdW5pY2F0aW9ucyBwcm90b2NvbCBwcm92aWRlcyBubyBvdGhlciB3YXkgZm9yIEB2YWx1ZXtHREJOfQordG8gZGV0ZWN0IHByb2dyYW0gY29tcGxldGlvbi4KK0BlbmQgaXRlbWl6ZQorCitJbiBlaXRoZXIgY2FzZSwgQHZhbHVle0dEQk59IHNlZXMgdGhlIGVmZmVjdCBvZiBhIEBzY3tyZXNldH0gb24gdGhlCitkZXZlbG9wbWVudCBib2FyZCBhcyBhIGBgbm9ybWFsIGV4aXQnJyBvZiB5b3VyIHByb2dyYW0uCitAZW5kIGlmc2V0CisKK0Bub2RlIEhpdGFjaGkgSUNFCitAc3Vic3Vic2VjdGlvbiBVc2luZyB0aGUgRTcwMDAgaW4tY2lyY3VpdCBlbXVsYXRvcgorCitAa2luZGV4IHRhcmdldCBlNzAwMAorWW91IGNhbiB1c2UgdGhlIEU3MDAwIGluLWNpcmN1aXQgZW11bGF0b3IgdG8gZGV2ZWxvcCBjb2RlIGZvciBlaXRoZXIgdGhlCitIaXRhY2hpIFNIIG9yIHRoZSBIOC8zMDBILiAgVXNlIG9uZSBvZiB0aGVzZSBmb3JtcyBvZiB0aGUgQHNhbXB7dGFyZ2V0CitlNzAwMH0gY29tbWFuZCB0byBjb25uZWN0IEB2YWx1ZXtHREJOfSB0byB5b3VyIEU3MDAwOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIHRhcmdldCBlNzAwMCBAdmFye3BvcnR9IEB2YXJ7c3BlZWR9CitVc2UgdGhpcyBmb3JtIGlmIHlvdXIgRTcwMDAgaXMgY29ubmVjdGVkIHRvIGEgc2VyaWFsIHBvcnQuICBUaGUKK0B2YXJ7cG9ydH0gYXJndW1lbnQgaWRlbnRpZmllcyB3aGF0IHNlcmlhbCBwb3J0IHRvIHVzZSAoZm9yIGV4YW1wbGUsCitAc2FtcHtjb20yfSkuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIGxpbmUgc3BlZWQgaW4gYml0cyBwZXIgc2Vjb25kCisoZm9yIGV4YW1wbGUsIEBzYW1wezk2MDB9KS4KKworQGl0ZW0gdGFyZ2V0IGU3MDAwIEB2YXJ7aG9zdG5hbWV9CitJZiB5b3VyIEU3MDAwIGlzIGluc3RhbGxlZCBhcyBhIGhvc3Qgb24gYSBUQ1AvSVAgbmV0d29yaywgeW91IGNhbiBqdXN0CitzcGVjaWZ5IGl0cyBob3N0bmFtZTsgQHZhbHVle0dEQk59IHVzZXMgQGNvZGV7dGVsbmV0fSB0byBjb25uZWN0LgorQGVuZCB0YWJsZQorCitAbm9kZSBIaXRhY2hpIFNwZWNpYWwKK0BzdWJzdWJzZWN0aW9uIFNwZWNpYWwgQHZhbHVle0dEQk59IGNvbW1hbmRzIGZvciBIaXRhY2hpIG1pY3JvcworCitTb21lIEB2YWx1ZXtHREJOfSBjb21tYW5kcyBhcmUgYXZhaWxhYmxlIG9ubHkgb24gdGhlIEg4LzMwMCBvciB0aGUKK0g4LzUwMCBjb25maWd1cmF0aW9uczoKKworQHRhYmxlIEBjb2RlCitAa2luZGV4IHNldCBtYWNoaW5lCitAa2luZGV4IHNob3cgbWFjaGluZQorQGl0ZW0gc2V0IG1hY2hpbmUgaDgzMDAKK0BpdGVteCBzZXQgbWFjaGluZSBoODMwMGgKK0NvbmRpdGlvbiBAdmFsdWV7R0RCTn0gZm9yIG9uZSBvZiB0aGUgdHdvIHZhcmlhbnRzIG9mIHRoZSBIOC8zMDAKK2FyY2hpdGVjdHVyZSB3aXRoIEBzYW1we3NldCBtYWNoaW5lfS4gIFlvdSBjYW4gdXNlIEBzYW1we3Nob3cgbWFjaGluZX0KK3RvIGNoZWNrIHdoaWNoIHZhcmlhbnQgaXMgY3VycmVudGx5IGluIGVmZmVjdC4KKworQGtpbmRleCBzZXQgbWVtb3J5IEB2YXJ7bW9kfQorQGNpbmRleCBtZW1vcnkgbW9kZWxzLCBIOC81MDAKK0BpdGVtIHNldCBtZW1vcnkgQHZhcnttb2R9CitAaXRlbXggc2hvdyBtZW1vcnkKK1NwZWNpZnkgd2hpY2ggSDgvNTAwIG1lbW9yeSBtb2RlbCAoQHZhcnttb2R9KSB5b3UgYXJlIHVzaW5nIHdpdGgKK0BzYW1we3NldCBtZW1vcnl9OyBjaGVjayB3aGljaCBtZW1vcnkgbW9kZWwgaXMgaW4gZWZmZWN0IHdpdGggQHNhbXB7c2hvdworbWVtb3J5fS4gIFRoZSBhY2NlcHRlZCB2YWx1ZXMgZm9yIEB2YXJ7bW9kfSBhcmUgQGNvZGV7c21hbGx9LAorQGNvZGV7YmlnfSwgQGNvZGV7bWVkaXVtfSwgYW5kIEBjb2Rle2NvbXBhY3R9LgorQGVuZCB0YWJsZQorCitAZW5kIGlmc2V0CisKK0BpZnNldCBNSVBTCitAbm9kZSBNSVBTIFJlbW90ZQorQHN1YnNlY3Rpb24gQHZhbHVle0dEQk59IGFuZCByZW1vdGUgTUlQUyBib2FyZHMKKworQGNpbmRleCBNSVBTIGJvYXJkcworQHZhbHVle0dEQk59IGNhbiB1c2UgdGhlIE1JUFMgcmVtb3RlIGRlYnVnZ2luZyBwcm90b2NvbCB0byB0YWxrIHRvIGEKK01JUFMgYm9hcmQgYXR0YWNoZWQgdG8gYSBzZXJpYWwgbGluZS4gIFRoaXMgaXMgYXZhaWxhYmxlIHdoZW4KK3lvdSBjb25maWd1cmUgQHZhbHVle0dEQk59IHdpdGggQHNhbXB7LS10YXJnZXQ9bWlwcy1pZHQtZWNvZmZ9LgorCitAbmVlZCAxMDAwCitVc2UgdGhlc2UgQHZhbHVle0dEQk59IGNvbW1hbmRzIHRvIHNwZWNpZnkgdGhlIGNvbm5lY3Rpb24gdG8geW91ciB0YXJnZXQgYm9hcmQ6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gdGFyZ2V0IG1pcHMgQHZhcntwb3J0fQorQGtpbmRleCB0YXJnZXQgbWlwcyBAdmFye3BvcnR9CitUbyBydW4gYSBwcm9ncmFtIG9uIHRoZSBib2FyZCwgc3RhcnQgdXAgQGNvZGV7QHZhbHVle0dEQlB9fSB3aXRoIHRoZQorbmFtZSBvZiB5b3VyIHByb2dyYW0gYXMgdGhlIGFyZ3VtZW50LiAgVG8gY29ubmVjdCB0byB0aGUgYm9hcmQsIHVzZSB0aGUKK2NvbW1hbmQgQHNhbXB7dGFyZ2V0IG1pcHMgQHZhcntwb3J0fX0sIHdoZXJlIEB2YXJ7cG9ydH0gaXMgdGhlIG5hbWUgb2YKK3RoZSBzZXJpYWwgcG9ydCBjb25uZWN0ZWQgdG8gdGhlIGJvYXJkLiAgSWYgdGhlIHByb2dyYW0gaGFzIG5vdCBhbHJlYWR5CitiZWVuIGRvd25sb2FkZWQgdG8gdGhlIGJvYXJkLCB5b3UgbWF5IHVzZSB0aGUgQGNvZGV7bG9hZH0gY29tbWFuZCB0bworZG93bmxvYWQgaXQuICBZb3UgY2FuIHRoZW4gdXNlIGFsbCB0aGUgdXN1YWwgQHZhbHVle0dEQk59IGNvbW1hbmRzLgorCitGb3IgZXhhbXBsZSwgdGhpcyBzZXF1ZW5jZSBjb25uZWN0cyB0byB0aGUgdGFyZ2V0IGJvYXJkIHRocm91Z2ggYSBzZXJpYWwKK3BvcnQsIGFuZCBsb2FkcyBhbmQgcnVucyBhIHByb2dyYW0gY2FsbGVkIEB2YXJ7cHJvZ30gdGhyb3VnaCB0aGUKK2RlYnVnZ2VyOgorCitAZXhhbXBsZQoraG9zdCQgQHZhbHVle0dEQlB9IEB2YXJ7cHJvZ30KK0dEQiBpcyBmcmVlIHNvZnR3YXJlIGFuZCBAZG90c3t9CisoZ2RiKSB0YXJnZXQgbWlwcyAvZGV2L3R0eWIKKyhnZGIpIGxvYWQgQHZhcntwcm9nfQorKGdkYikgcnVuCitAZW5kIGV4YW1wbGUKKworQGl0ZW0gdGFyZ2V0IG1pcHMgQHZhcntob3N0bmFtZX06QHZhcntwb3J0bnVtYmVyfQorT24gc29tZSBAdmFsdWV7R0RCTn0gaG9zdCBjb25maWd1cmF0aW9ucywgeW91IGNhbiBzcGVjaWZ5IGEgVENQCitjb25uZWN0aW9uIChmb3IgaW5zdGFuY2UsIHRvIGEgc2VyaWFsIGxpbmUgbWFuYWdlZCBieSBhIHRlcm1pbmFsCitjb25jZW50cmF0b3IpIGluc3RlYWQgb2YgYSBzZXJpYWwgcG9ydCwgdXNpbmcgdGhlIHN5bnRheAorQHNhbXB7QHZhcntob3N0bmFtZX06QHZhcntwb3J0bnVtYmVyfX0uCisKK0BpdGVtIHRhcmdldCBwbW9uIEB2YXJ7cG9ydH0KK0BraW5kZXggdGFyZ2V0IHBtb24gQHZhcntwb3J0fQorCitAaXRlbSB0YXJnZXQgZGRiIEB2YXJ7cG9ydH0KK0BraW5kZXggdGFyZ2V0IGRkYiBAdmFye3BvcnR9CisKK0BpdGVtIHRhcmdldCBsc2kgQHZhcntwb3J0fQorQGtpbmRleCB0YXJnZXQgbHNpIEB2YXJ7cG9ydH0KKworQGVuZCB0YWJsZQorCisKK0Bub2luZGVudAorQHZhbHVle0dEQk59IGFsc28gc3VwcG9ydHMgdGhlc2Ugc3BlY2lhbCBjb21tYW5kcyBmb3IgTUlQUyB0YXJnZXRzOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIHNldCBwcm9jZXNzb3IgQHZhcnthcmdzfQorQGl0ZW14IHNob3cgcHJvY2Vzc29yCitAa2luZGV4IHNldCBwcm9jZXNzb3IgQHZhcnthcmdzfQorQGtpbmRleCBzaG93IHByb2Nlc3NvcgorVXNlIHRoZSBAY29kZXtzZXQgcHJvY2Vzc29yfSBjb21tYW5kIHRvIHNldCB0aGUgdHlwZSBvZiBNSVBTCitwcm9jZXNzb3Igd2hlbiB5b3Ugd2FudCB0byBhY2Nlc3MgcHJvY2Vzc29yLXR5cGUtc3BlY2lmaWMgcmVnaXN0ZXJzLgorRm9yIGV4YW1wbGUsIEBjb2Rle3NldCBwcm9jZXNzb3IgQHZhcntyMzA0MX19IHRlbGxzIEB2YWx1ZXtHREJOfSAKK3RvIHVzZSB0aGUgQ1BPIHJlZ2lzdGVycyBhcHByb3ByaWF0ZSBmb3IgdGhlIDMwNDEgY2hpcC4KK1VzZSB0aGUgQGNvZGV7c2hvdyBwcm9jZXNzb3J9IGNvbW1hbmQgdG8gc2VlIHdoYXQgTUlQUyBwcm9jZXNzb3IgQHZhbHVle0dEQk59IAoraXMgdXNpbmcuICBVc2UgdGhlIEBjb2Rle2luZm8gcmVnfSBjb21tYW5kIHRvIHNlZSB3aGF0IHJlZ2lzdGVycworQHZhbHVle0dEQk59IGlzIHVzaW5nLiAKKworQGl0ZW0gc2V0IG1pcHNmcHUgZG91YmxlCitAaXRlbXggc2V0IG1pcHNmcHUgc2luZ2xlCitAaXRlbXggc2V0IG1pcHNmcHUgbm9uZQorQGl0ZW14IHNob3cgbWlwc2ZwdQorQGtpbmRleCBzZXQgbWlwc2ZwdQorQGtpbmRleCBzaG93IG1pcHNmcHUKK0BjaW5kZXggTUlQUyByZW1vdGUgZmxvYXRpbmcgcG9pbnQKK0BjaW5kZXggZmxvYXRpbmcgcG9pbnQsIE1JUFMgcmVtb3RlCitJZiB5b3VyIHRhcmdldCBib2FyZCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBNSVBTIGZsb2F0aW5nIHBvaW50Citjb3Byb2Nlc3NvciwgeW91IHNob3VsZCB1c2UgdGhlIGNvbW1hbmQgQHNhbXB7c2V0IG1pcHNmcHUgbm9uZX0gKGlmIHlvdQorbmVlZCB0aGlzLCB5b3UgbWF5IHdpc2ggdG8gcHV0IHRoZSBjb21tYW5kIGluIHlvdXIgQHZhbHVle0dEQklOSVR9CitmaWxlKS4gIFRoaXMgdGVsbHMgQHZhbHVle0dEQk59IGhvdyB0byBmaW5kIHRoZSByZXR1cm4gdmFsdWUgb2YKK2Z1bmN0aW9ucyB3aGljaCByZXR1cm4gZmxvYXRpbmcgcG9pbnQgdmFsdWVzLiAgSXQgYWxzbyBhbGxvd3MKK0B2YWx1ZXtHREJOfSB0byBhdm9pZCBzYXZpbmcgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyB3aGVuIGNhbGxpbmcKK2Z1bmN0aW9ucyBvbiB0aGUgYm9hcmQuICBJZiB5b3UgYXJlIHVzaW5nIGEgZmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IKK3dpdGggb25seSBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQsIGFzIG9uIHRoZSBAc2N7cjQ2NTB9Citwcm9jZXNzb3IsIHVzZSB0aGUgY29tbWFuZCBAc2FtcHtzZXQgbWlwc2ZwdSBzaW5nbGV9LiAgVGhlIGRlZmF1bHQKK2RvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IgbWF5IGJlIHNlbGVjdGVkIHVzaW5nCitAc2FtcHtzZXQgbWlwc2ZwdSBkb3VibGV9LgorCitJbiBwcmV2aW91cyB2ZXJzaW9ucyB0aGUgb25seSBjaG9pY2VzIHdlcmUgZG91YmxlIHByZWNpc2lvbiBvciBubworZmxvYXRpbmcgcG9pbnQsIHNvIEBzYW1we3NldCBtaXBzZnB1IG9ufSB3aWxsIHNlbGVjdCBkb3VibGUgcHJlY2lzaW9uCithbmQgQHNhbXB7c2V0IG1pcHNmcHUgb2ZmfSB3aWxsIHNlbGVjdCBubyBmbG9hdGluZyBwb2ludC4KKworQXMgdXN1YWwsIHlvdSBjYW4gaW5xdWlyZSBhYm91dCB0aGUgQGNvZGV7bWlwc2ZwdX0gdmFyaWFibGUgd2l0aAorQHNhbXB7c2hvdyBtaXBzZnB1fS4KKworQGl0ZW0gc2V0IHJlbW90ZWRlYnVnIEB2YXJ7bn0KK0BpdGVteCBzaG93IHJlbW90ZWRlYnVnCitAa2luZGV4IHNldCByZW1vdGVkZWJ1ZworQGtpbmRleCBzaG93IHJlbW90ZWRlYnVnCitAY2luZGV4IEBjb2Rle3JlbW90ZWRlYnVnfSwgTUlQUyBwcm90b2NvbAorQGNpbmRleCBNSVBTIEBjb2Rle3JlbW90ZWRlYnVnfSBwcm90b2NvbAorQGMgRklYTUUhIEZvciB0aGlzIHRvIGJlIHVzZWZ1bCwgeW91IG11c3Qga25vdyBzb21ldGhpbmcgYWJvdXQgdGhlIE1JUFMKK0BjIEZJWE1FLi4ucHJvdG9jb2wuICBXaGVyZSBpcyBpdCBkZXNjcmliZWQ/CitZb3UgY2FuIHNlZSBzb21lIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhYm91dCBjb21tdW5pY2F0aW9ucyB3aXRoIHRoZSBib2FyZAorYnkgc2V0dGluZyB0aGUgQGNvZGV7cmVtb3RlZGVidWd9IHZhcmlhYmxlLiAgSWYgeW91IHNldCBpdCB0byBAY29kZXsxfSB1c2luZworQHNhbXB7c2V0IHJlbW90ZWRlYnVnIDF9LCBldmVyeSBwYWNrZXQgaXMgZGlzcGxheWVkLiAgSWYgeW91IHNldCBpdAordG8gQGNvZGV7Mn0sIGV2ZXJ5IGNoYXJhY3RlciBpcyBkaXNwbGF5ZWQuICBZb3UgY2FuIGNoZWNrIHRoZSBjdXJyZW50IHZhbHVlCithdCBhbnkgdGltZSB3aXRoIHRoZSBjb21tYW5kIEBzYW1we3Nob3cgcmVtb3RlZGVidWd9LgorCitAaXRlbSBzZXQgdGltZW91dCBAdmFye3NlY29uZHN9CitAaXRlbXggc2V0IHJldHJhbnNtaXQtdGltZW91dCBAdmFye3NlY29uZHN9CitAaXRlbXggc2hvdyB0aW1lb3V0CitAaXRlbXggc2hvdyByZXRyYW5zbWl0LXRpbWVvdXQKK0BjaW5kZXggQGNvZGV7dGltZW91dH0sIE1JUFMgcHJvdG9jb2wKK0BjaW5kZXggQGNvZGV7cmV0cmFuc21pdC10aW1lb3V0fSwgTUlQUyBwcm90b2NvbAorQGtpbmRleCBzZXQgdGltZW91dAorQGtpbmRleCBzaG93IHRpbWVvdXQKK0BraW5kZXggc2V0IHJldHJhbnNtaXQtdGltZW91dAorQGtpbmRleCBzaG93IHJldHJhbnNtaXQtdGltZW91dAorWW91IGNhbiBjb250cm9sIHRoZSB0aW1lb3V0IHVzZWQgd2hpbGUgd2FpdGluZyBmb3IgYSBwYWNrZXQsIGluIHRoZSBNSVBTCityZW1vdGUgcHJvdG9jb2wsIHdpdGggdGhlIEBjb2Rle3NldCB0aW1lb3V0IEB2YXJ7c2Vjb25kc319IGNvbW1hbmQuICBUaGUKK2RlZmF1bHQgaXMgNSBzZWNvbmRzLiAgU2ltaWxhcmx5LCB5b3UgY2FuIGNvbnRyb2wgdGhlIHRpbWVvdXQgdXNlZCB3aGlsZQord2FpdGluZyBmb3IgYW4gYWNrbm93bGVkZ2VtZW50IG9mIGEgcGFja2V0IHdpdGggdGhlIEBjb2Rle3NldAorcmV0cmFuc21pdC10aW1lb3V0IEB2YXJ7c2Vjb25kc319IGNvbW1hbmQuICBUaGUgZGVmYXVsdCBpcyAzIHNlY29uZHMuCitZb3UgY2FuIGluc3BlY3QgYm90aCB2YWx1ZXMgd2l0aCBAY29kZXtzaG93IHRpbWVvdXR9IGFuZCBAY29kZXtzaG93CityZXRyYW5zbWl0LXRpbWVvdXR9LiAgKFRoZXNlIGNvbW1hbmRzIGFyZSBAZW1waHtvbmx5fSBhdmFpbGFibGUgd2hlbgorQHZhbHVle0dEQk59IGlzIGNvbmZpZ3VyZWQgZm9yIEBzYW1wey0tdGFyZ2V0PW1pcHMtaWR0LWVjb2ZmfS4pCisKK1RoZSB0aW1lb3V0IHNldCBieSBAY29kZXtzZXQgdGltZW91dH0gZG9lcyBub3QgYXBwbHkgd2hlbiBAdmFsdWV7R0RCTn0KK2lzIHdhaXRpbmcgZm9yIHlvdXIgcHJvZ3JhbSB0byBzdG9wLiAgSW4gdGhhdCBjYXNlLCBAdmFsdWV7R0RCTn0gd2FpdHMKK2ZvcmV2ZXIgYmVjYXVzZSBpdCBoYXMgbm8gd2F5IG9mIGtub3dpbmcgaG93IGxvbmcgdGhlIHByb2dyYW0gaXMgZ29pbmcKK3RvIHJ1biBiZWZvcmUgc3RvcHBpbmcuCitAZW5kIHRhYmxlCitAZW5kIGlmc2V0CisKK0BpZnNldCBTSU1TCitAbm9kZSBTaW11bGF0b3IKK0BzdWJzZWN0aW9uIFNpbXVsYXRlZCBDUFUgdGFyZ2V0CisKK0BpZnNldCBHRU5FUklDCitAY2luZGV4IHNpbXVsYXRvcgorQGNpbmRleCBzaW11bGF0b3IsIFo4MDAwCitAY2luZGV4IFo4MDAwIHNpbXVsYXRvcgorQGNpbmRleCBzaW11bGF0b3IsIEg4LzMwMCBvciBIOC81MDAKK0BjaW5kZXggSDgvMzAwIG9yIEg4LzUwMCBzaW11bGF0b3IKK0BjaW5kZXggc2ltdWxhdG9yLCBIaXRhY2hpIFNICitAY2luZGV4IEhpdGFjaGkgU0ggc2ltdWxhdG9yCitAY2luZGV4IENQVSBzaW11bGF0b3IKK0ZvciBzb21lIGNvbmZpZ3VyYXRpb25zLCBAdmFsdWV7R0RCTn0gaW5jbHVkZXMgYSBDUFUgc2ltdWxhdG9yIHRoYXQgeW91CitjYW4gdXNlIGluc3RlYWQgb2YgYSBoYXJkd2FyZSBDUFUgdG8gZGVidWcgeW91ciBwcm9ncmFtcy4KK0N1cnJlbnRseSwgc2ltdWxhdG9ycyBhcmUgYXZhaWxhYmxlIGZvciBBUk0sIEQxMFYsIEQzMFYsIEZSMzAsIEg4LzMwMCwKK0g4LzUwMCwgaTk2MCwgTTMyUiwgTUlQUywgTU4xMDIwMCwgTU4xMDMwMCwgUG93ZXJQQywgU0gsIFNwYXJjLCBWODUwLAorVzY1LCBhbmQgWjgwMDAuCitAZW5kIGlmc2V0CisKK0BpZmNsZWFyIEdFTkVSSUMKK0BpZnNldCBIOAorQGNpbmRleCBzaW11bGF0b3IsIEg4LzMwMCBvciBIOC81MDAKK0BjaW5kZXggSGl0YWNoaSBIOC8zMDAgb3IgSDgvNTAwIHNpbXVsYXRvcgorQGNpbmRleCBzaW11bGF0b3IsIEhpdGFjaGkgU0gKK0BjaW5kZXggSGl0YWNoaSBTSCBzaW11bGF0b3IKK1doZW4gY29uZmlndXJlZCBmb3IgZGVidWdnaW5nIEhpdGFjaGkgbWljcm9wcm9jZXNzb3IgdGFyZ2V0cywKK0B2YWx1ZXtHREJOfSBpbmNsdWRlcyBhIENQVSBzaW11bGF0b3IgZm9yIHRoZSB0YXJnZXQgY2hpcCAoYSBIaXRhY2hpIFNILAorSDgvMzAwLCBvciBIOC81MDApLgorQGVuZCBpZnNldAorCitAaWZzZXQgWjhLCitAY2luZGV4IHNpbXVsYXRvciwgWjgwMDAKK0BjaW5kZXggWmlsb2cgWjgwMDAgc2ltdWxhdG9yCitXaGVuIGNvbmZpZ3VyZWQgZm9yIGRlYnVnZ2luZyBaaWxvZyBaODAwMCB0YXJnZXRzLCBAdmFsdWV7R0RCTn0gaW5jbHVkZXMKK2EgWjgwMDAgc2ltdWxhdG9yLgorQGVuZCBpZnNldAorQGVuZCBpZmNsZWFyCisKK0BpZnNldCBaOEsKK0ZvciB0aGUgWjgwMDAgZmFtaWx5LCBAc2FtcHt0YXJnZXQgc2ltfSBzaW11bGF0ZXMgZWl0aGVyIHRoZSBaODAwMiAodGhlCit1bnNlZ21lbnRlZCB2YXJpYW50IG9mIHRoZSBaODAwMCBhcmNoaXRlY3R1cmUpIG9yIHRoZSBaODAwMSAodGhlCitzZWdtZW50ZWQgdmFyaWFudCkuICBUaGUgc2ltdWxhdG9yIHJlY29nbml6ZXMgd2hpY2ggYXJjaGl0ZWN0dXJlIGlzCithcHByb3ByaWF0ZSBieSBpbnNwZWN0aW5nIHRoZSBvYmplY3QgY29kZS4KK0BlbmQgaWZzZXQKKworQHRhYmxlIEBjb2RlCitAaXRlbSB0YXJnZXQgc2ltIEB2YXJ7YXJnc30KK0BraW5kZXggc2ltCitAa2luZGV4IHRhcmdldCBzaW0KK0RlYnVnIHByb2dyYW1zIG9uIGEgc2ltdWxhdGVkIENQVS4gIElmIHRoZSBzaW11bGF0b3Igc3VwcG9ydHMgc2V0dXAKK29wdGlvbnMsIHNwZWNpZnkgdGhlbSB2aWEgQHZhcnthcmdzfS4KK0BlbmQgdGFibGUKKworQG5vaW5kZW50CitBZnRlciBzcGVjaWZ5aW5nIHRoaXMgdGFyZ2V0LCB5b3UgY2FuIGRlYnVnIHByb2dyYW1zIGZvciB0aGUgc2ltdWxhdGVkCitDUFUgaW4gdGhlIHNhbWUgc3R5bGUgYXMgcHJvZ3JhbXMgZm9yIHlvdXIgaG9zdCBjb21wdXRlcjsgdXNlIHRoZQorQGNvZGV7ZmlsZX0gY29tbWFuZCB0byBsb2FkIGEgbmV3IHByb2dyYW0gaW1hZ2UsIHRoZSBAY29kZXtydW59IGNvbW1hbmQKK3RvIHJ1biB5b3VyIHByb2dyYW0sIGFuZCBzbyBvbi4KKworQXMgd2VsbCBhcyBtYWtpbmcgYXZhaWxhYmxlIGFsbCB0aGUgdXN1YWwgbWFjaGluZSByZWdpc3RlcnMgKHNlZQorQGNvZGV7aW5mbyByZWd9KSwgdGhlIFo4MDAwIHNpbXVsYXRvciBwcm92aWRlcyB0aHJlZSBhZGRpdGlvbmFsIGl0ZW1zCitvZiBpbmZvcm1hdGlvbiBhcyBzcGVjaWFsbHkgbmFtZWQgcmVnaXN0ZXJzOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIGN5Y2xlcworQ291bnRzIGNsb2NrLXRpY2tzIGluIHRoZSBzaW11bGF0b3IuCisKK0BpdGVtIGluc3RzCitDb3VudHMgaW5zdHJ1Y3Rpb25zIHJ1biBpbiB0aGUgc2ltdWxhdG9yLgorCitAaXRlbSB0aW1lCitFeGVjdXRpb24gdGltZSBpbiA2MHRocyBvZiBhIHNlY29uZC4gCitAZW5kIHRhYmxlCisKK1lvdSBjYW4gcmVmZXIgdG8gdGhlc2UgdmFsdWVzIGluIEB2YWx1ZXtHREJOfSBleHByZXNzaW9ucyB3aXRoIHRoZSB1c3VhbAorY29udmVudGlvbnM7IGZvciBleGFtcGxlLCBAd3tAc2FtcHtiIGZwdXRjIGlmICRjeWNsZXM+NTAwMH19IHNldHMgYQorY29uZGl0aW9uYWwgYnJlYWtwb2ludCB0aGF0IHN1c3BlbmRzIG9ubHkgYWZ0ZXIgYXQgbGVhc3QgNTAwMAorc2ltdWxhdGVkIGNsb2NrIHRpY2tzLgorQGVuZCBpZnNldAorCitAYyBuZWVkIHRvIGFkZCBtdWNoIG1vcmUgZGV0YWlsIGFib3V0IHNpbXMhCmRpZmYgLS1naXQgYS9nZGIvZG9jL3N0YWJzLnRleGluZm8gYi9nZGIvZG9jL3N0YWJzLnRleGluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmMGJjOQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9kb2Mvc3RhYnMudGV4aW5mbwpAQCAtMCwwICsxLDQwMTkgQEAKK1xpbnB1dCB0ZXhpbmZvCitAc2V0ZmlsZW5hbWUgc3RhYnMuaW5mbworCitAYyBAZmluYWxvdXQKKworQGlmaW5mbworQGZvcm1hdAorU1RBUlQtSU5GTy1ESVItRU5UUlkKKyogU3RhYnM6IChzdGFicykuICAgICAgICAgICAgICAgICBUaGUgInN0YWJzIiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9ybWF0LgorRU5ELUlORk8tRElSLUVOVFJZCitAZW5kIGZvcm1hdAorQGVuZCBpZmluZm8KKworQGlmaW5mbworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIHN0YWJzIGRlYnVnZ2luZyBzeW1ib2wgdGFibGVzLgorCitDb3B5cmlnaHQgMTk5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4gIFdyaXR0ZW4gYnkgSnVsaWEgTWVuYXBhY2UsIEppbSBLaW5nZG9uLAorYW5kIERhdmlkIE1hY0tlbnppZS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCit0aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQorYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorCitAaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZXggYW5kIHByaW50IHRoZQorcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KK25vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAorKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgorCitAZW5kIGlnbm9yZQorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgb3IgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgKGZvciB3aGljaCBwdXJwb3NlIHRoaXMgdGV4dCBtYXkgYmUKK3JlZ2FyZGVkIGFzIGEgcHJvZ3JhbSBpbiB0aGUgbGFuZ3VhZ2UgVGVYKS4KK0BlbmQgaWZpbmZvCisKK0BzZXRjaGFwdGVybmV3cGFnZSBvZGQKK0BzZXR0aXRsZSBTVEFCUworQHRpdGxlcGFnZQorQHRpdGxlIFRoZSBgYHN0YWJzJycgZGVidWcgZm9ybWF0CitAYXV0aG9yIEp1bGlhIE1lbmFwYWNlLCBKaW0gS2luZ2RvbiwgRGF2aWQgTWFjS2VuemllCitAYXV0aG9yIEN5Z251cyBTdXBwb3J0CitAcGFnZQorQHRleAorXGRlZlwkIzEke3sjMX19ICAlIEtsdWdlOiBjb2xsZWN0IFJDUyByZXZpc2lvbiBpbmZvIHdpdGhvdXQgJC4uLiQKK1x4ZGVmXG1hbnZlcnN7XCRSZXZpc2lvbiR9ICAlIEZvciB1c2UgaW4gaGVhZGVycywgZm9vdGVycyB0b28KK3tccGFyc2tpcD0wcHQKK1xoZmlsbCBDeWdudXMgU3VwcG9ydFxwYXIKK1xoZmlsbCBcbWFudmVyc1xwYXIKK1xoZmlsbCBcVGVYe31pbmZvIFx0ZXhpbmZvdmVyc2lvblxwYXIKK30KK0BlbmQgdGV4CisKK0B2c2tpcCAwcHQgcGx1cyAxZmlsbGwKK0NvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCit0aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQorYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorCitAZW5kIHRpdGxlcGFnZQorCitAaWZpbmZvCitAbm9kZSBUb3AKK0B0b3AgVGhlICJzdGFicyIgcmVwcmVzZW50YXRpb24gb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uCisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBzdGFicyBkZWJ1Z2dpbmcgZm9ybWF0LgorCitAbWVudQorKiBPdmVydmlldzo6CQkJT3ZlcnZpZXcgb2Ygc3RhYnMKKyogUHJvZ3JhbSBTdHJ1Y3R1cmU6OgkJRW5jb2Rpbmcgb2YgdGhlIHN0cnVjdHVyZSBvZiB0aGUgcHJvZ3JhbQorKiBDb25zdGFudHM6OgkJCUNvbnN0YW50cworKiBWYXJpYWJsZXM6OgorKiBUeXBlczo6CQkJVHlwZSBkZWZpbml0aW9ucworKiBTeW1ib2wgVGFibGVzOjoJCVN5bWJvbCBpbmZvcm1hdGlvbiBpbiBzeW1ib2wgdGFibGVzCisqIENwbHVzcGx1czo6CQkJU3RhYnMgc3BlY2lmaWMgdG8gQysrCisqIFN0YWIgVHlwZXM6OgkJCVN5bWJvbCB0eXBlcyBpbiBhLm91dCBmaWxlcworKiBTeW1ib2wgRGVzY3JpcHRvcnM6OgkJVGFibGUgb2Ygc3ltYm9sIGRlc2NyaXB0b3JzCisqIFR5cGUgRGVzY3JpcHRvcnM6OgkJVGFibGUgb2YgdHlwZSBkZXNjcmlwdG9ycworKiBFeHBhbmRlZCBSZWZlcmVuY2U6OgkJUmVmZXJlbmNlIGluZm9ybWF0aW9uIGJ5IHN0YWIgdHlwZQorKiBRdWVzdGlvbnM6OgkJCVF1ZXN0aW9ucyBhbmQgYW5vbW9saWVzCisqIFN0YWIgU2VjdGlvbnM6OgkJSW4gc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzLCBzdGFicyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc2VjdGlvbnMuCisqIFN5bWJvbCBUeXBlcyBJbmRleDo6ICAgICAgICAgIEluZGV4IG9mIHN5bWJvbGljIHN0YWIgc3ltYm9sIHR5cGUgbmFtZXMuCitAZW5kIG1lbnUKK0BlbmQgaWZpbmZvCisKKworQG5vZGUgT3ZlcnZpZXcKK0BjaGFwdGVyIE92ZXJ2aWV3IG9mIFN0YWJzCisKK0BkZm57U3RhYnN9IHJlZmVycyB0byBhIGZvcm1hdCBmb3IgaW5mb3JtYXRpb24gdGhhdCBkZXNjcmliZXMgYSBwcm9ncmFtCit0byBhIGRlYnVnZ2VyLiAgVGhpcyBmb3JtYXQgd2FzIGFwcGFyZW50bHkgaW52ZW50ZWQgYnkKK1BldGVyIEtlc3NsZXIgYXQKK3RoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYXQgQmVya2VsZXksIGZvciB0aGUgQGNvZGV7cGR4fSBQYXNjYWwKK2RlYnVnZ2VyOyB0aGUgZm9ybWF0IGhhcyBzcHJlYWQgd2lkZWx5IHNpbmNlIHRoZW4uCisKK1RoaXMgZG9jdW1lbnQgaXMgb25lIG9mIHRoZSBmZXcgcHVibGlzaGVkIHNvdXJjZXMgb2YgZG9jdW1lbnRhdGlvbiBvbgorc3RhYnMuICBJdCBpcyBiZWxpZXZlZCB0byBiZSBjb21wcmVoZW5zaXZlIGZvciBzdGFicyB1c2VkIGJ5IEMuICBUaGUKK2xpc3RzIG9mIHN5bWJvbCBkZXNjcmlwdG9ycyAoQHB4cmVme1N5bWJvbCBEZXNjcmlwdG9yc30pIGFuZCB0eXBlCitkZXNjcmlwdG9ycyAoQHB4cmVme1R5cGUgRGVzY3JpcHRvcnN9KSBhcmUgYmVsaWV2ZWQgdG8gYmUgY29tcGxldGVseQorY29tcHJlaGVuc2l2ZS4gIFN0YWJzIGZvciBDT0JPTC1zcGVjaWZpYyBmZWF0dXJlcyBhbmQgZm9yIHZhcmlhbnQKK3JlY29yZHMgKHVzZWQgYnkgUGFzY2FsIGFuZCBNb2R1bGEtMikgYXJlIHBvb3JseSBkb2N1bWVudGVkIGhlcmUuCisKK0BjIEZJWE1FOiBOZWVkIHRvIGRvY3VtZW50IGFsbCBPUzkwMDAgc3R1ZmYgaW4gR0RCOyBzZWUgYWxsIHJlZmVyZW5jZXMKK0BjIHRvIG9zOWtfc3RhYnMgaW4gc3RhYnNyZWFkLmMuCisKK090aGVyIHNvdXJjZXMgb2YgaW5mb3JtYXRpb24gb24gc3RhYnMgYXJlIEBjaXRle0RieCBhbmQgRGJ4dG9vbAorSW50ZXJmYWNlc30sIDJuZCBlZGl0aW9uLCBieSBTdW4sIDE5ODgsIGFuZCBAY2l0ZXtBSVggVmVyc2lvbiAzLjIgRmlsZXMKK1JlZmVyZW5jZX0sIEZvdXJ0aCBFZGl0aW9uLCBTZXB0ZW1iZXIgMTk5MiwgImRieCBTdGFic3RyaW5nIEdyYW1tYXIiIGluCit0aGUgYS5vdXQgc2VjdGlvbiwgcGFnZSAyLTMxLiAgVGhpcyBkb2N1bWVudCBpcyBiZWxpZXZlZCB0byBpbmNvcnBvcmF0ZQordGhlIGluZm9ybWF0aW9uIGZyb20gdGhvc2UgdHdvIHNvdXJjZXMgZXhjZXB0IHdoZXJlIGl0IGV4cGxpY2l0bHkgZGlyZWN0cworeW91IHRvIHRoZW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0BtZW51CisqIEZsb3c6OgkJCU92ZXJ2aWV3IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmbG93CisqIFN0YWJzIEZvcm1hdDo6CQlPdmVydmlldyBvZiBzdGFiIGZvcm1hdAorKiBTdHJpbmcgRmllbGQ6OgkJVGhlIHN0cmluZyBmaWVsZAorKiBDIEV4YW1wbGU6OgkJCUEgc2ltcGxlIGV4YW1wbGUgaW4gQyBzb3VyY2UKKyogQXNzZW1ibHkgQ29kZTo6CQlUaGUgc2ltcGxlIGV4YW1wbGUgYXQgdGhlIGFzc2VtYmx5IGxldmVsCitAZW5kIG1lbnUKKworQG5vZGUgRmxvdworQHNlY3Rpb24gT3ZlcnZpZXcgb2YgRGVidWdnaW5nIEluZm9ybWF0aW9uIEZsb3cKKworVGhlIEdOVSBDIGNvbXBpbGVyIGNvbXBpbGVzIEMgc291cmNlIGluIGEgQGZpbGV7LmN9IGZpbGUgaW50byBhc3NlbWJseQorbGFuZ3VhZ2UgaW4gYSBAZmlsZXsuc30gZmlsZSwgd2hpY2ggdGhlIGFzc2VtYmxlciB0cmFuc2xhdGVzIGludG8KK2EgQGZpbGV7Lm99IGZpbGUsIHdoaWNoIHRoZSBsaW5rZXIgY29tYmluZXMgd2l0aCBvdGhlciBAZmlsZXsub30gZmlsZXMgYW5kCitsaWJyYXJpZXMgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlIGZpbGUuCisKK1dpdGggdGhlIEBzYW1wey1nfSBvcHRpb24sIEdDQyBwdXRzIGluIHRoZSBAZmlsZXsuc30gZmlsZSBhZGRpdGlvbmFsCitkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHdoaWNoIGlzIHNsaWdodGx5IHRyYW5zZm9ybWVkIGJ5IHRoZSBhc3NlbWJsZXIKK2FuZCBsaW5rZXIsIGFuZCBjYXJyaWVkIHRocm91Z2ggaW50byB0aGUgZmluYWwgZXhlY3V0YWJsZS4gIFRoaXMKK2RlYnVnZ2luZyBpbmZvcm1hdGlvbiBkZXNjcmliZXMgZmVhdHVyZXMgb2YgdGhlIHNvdXJjZSBmaWxlIGxpa2UgbGluZQorbnVtYmVycywgdGhlIHR5cGVzIGFuZCBzY29wZXMgb2YgdmFyaWFibGVzLCBhbmQgZnVuY3Rpb24gbmFtZXMsCitwYXJhbWV0ZXJzLCBhbmQgc2NvcGVzLgorCitGb3Igc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzLCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIGVuY2Fwc3VsYXRlZAoraW4gYXNzZW1ibGVyIGRpcmVjdGl2ZXMga25vd24gY29sbGVjdGl2ZWx5IGFzIEBkZm57c3RhYn0gKHN5bWJvbCB0YWJsZSkKK2RpcmVjdGl2ZXMsIHdoaWNoIGFyZSBpbnRlcnNwZXJzZWQgd2l0aCB0aGUgZ2VuZXJhdGVkIGNvZGUuICBTdGFicyBhcmUKK3RoZSBuYXRpdmUgZm9ybWF0IGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIGEub3V0IGFuZCBYQ09GRgorb2JqZWN0IGZpbGUgZm9ybWF0cy4gIFRoZSBHTlUgdG9vbHMgY2FuIGFsc28gZW1pdCBzdGFicyBpbiB0aGUgQ09GRiBhbmQKK0VDT0ZGIG9iamVjdCBmaWxlIGZvcm1hdHMuCisKK1RoZSBhc3NlbWJsZXIgYWRkcyB0aGUgaW5mb3JtYXRpb24gZnJvbSBzdGFicyB0byB0aGUgc3ltYm9sIGluZm9ybWF0aW9uCitpdCBwbGFjZXMgYnkgZGVmYXVsdCBpbiB0aGUgc3ltYm9sIHRhYmxlIGFuZCB0aGUgc3RyaW5nIHRhYmxlIG9mIHRoZQorQGZpbGV7Lm99IGZpbGUgaXQgaXMgYnVpbGRpbmcuICBUaGUgbGlua2VyIGNvbnNvbGlkYXRlcyB0aGUgQGZpbGV7Lm99CitmaWxlcyBpbnRvIG9uZSBleGVjdXRhYmxlIGZpbGUsIHdpdGggb25lIHN5bWJvbCB0YWJsZSBhbmQgb25lIHN0cmluZwordGFibGUuICBEZWJ1Z2dlcnMgdXNlIHRoZSBzeW1ib2wgYW5kIHN0cmluZyB0YWJsZXMgaW4gdGhlIGV4ZWN1dGFibGUgYXMKK2Egc291cmNlIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvZ3JhbS4KKworQG5vZGUgU3RhYnMgRm9ybWF0CitAc2VjdGlvbiBPdmVydmlldyBvZiBTdGFiIEZvcm1hdAorCitUaGVyZSBhcmUgdGhyZWUgb3ZlcmFsbCBmb3JtYXRzIGZvciBzdGFiIGFzc2VtYmxlciBkaXJlY3RpdmVzLAorZGlmZmVyZW50aWF0ZWQgYnkgdGhlIGZpcnN0IHdvcmQgb2YgdGhlIHN0YWIuICBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0aXZlCitkZXNjcmliZXMgd2hpY2ggY29tYmluYXRpb24gb2YgZm91ciBwb3NzaWJsZSBkYXRhIGZpZWxkcyBmb2xsb3dzLiAgSXQgaXMKK2VpdGhlciBAY29kZXsuc3RhYnN9IChzdHJpbmcpLCBAY29kZXsuc3RhYm59IChudW1iZXIpLCBvciBAY29kZXsuc3RhYmR9CisoZG90KS4gIElCTSdzIFhDT0ZGIGFzc2VtYmxlciB1c2VzIEBjb2Rley5zdGFieH0gKGFuZCBzb21lIG90aGVyCitkaXJlY3RpdmVzIHN1Y2ggYXMgQGNvZGV7LmZpbGV9IGFuZCBAY29kZXsuYml9KSBpbnN0ZWFkIG9mCitAY29kZXsuc3RhYnN9LCBAY29kZXsuc3RhYm59IG9yIEBjb2Rley5zdGFiZH0uCisKK1RoZSBvdmVyYWxsIGZvcm1hdCBvZiBlYWNoIGNsYXNzIG9mIHN0YWIgaXM6CisKK0BleGFtcGxlCisuc3RhYnMgIkB2YXJ7c3RyaW5nfSIsQHZhcnt0eXBlfSxAdmFye290aGVyfSxAdmFye2Rlc2N9LEB2YXJ7dmFsdWV9Cisuc3RhYm4gQHZhcnt0eXBlfSxAdmFye290aGVyfSxAdmFye2Rlc2N9LEB2YXJ7dmFsdWV9Cisuc3RhYmQgQHZhcnt0eXBlfSxAdmFye290aGVyfSxAdmFye2Rlc2N9Cisuc3RhYnggIkB2YXJ7c3RyaW5nfSIsQHZhcnt2YWx1ZX0sQHZhcnt0eXBlfSxAdmFye3NkYi10eXBlfQorQGVuZCBleGFtcGxlCisKK0BjIHdoYXQgaXMgdGhlIGNvcnJlY3QgdGVybSBmb3IgImN1cnJlbnQgZmlsZSBsb2NhdGlvbiI/ICBNeSBBSVgKK0BjIGFzc2VtYmxlciBtYW51YWwgY2FsbHMgaXQgInRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBjb3VudGVyIi4KK0ZvciBAY29kZXsuc3RhYm59IGFuZCBAY29kZXsuc3RhYmR9LCB0aGVyZSBpcyBubyBAdmFye3N0cmluZ30gKHRoZQorQGNvZGV7bl9zdHJ4fSBmaWVsZCBpcyB6ZXJvOyBzZWUgQHJlZntTeW1ib2wgVGFibGVzfSkuICBGb3IKK0Bjb2Rley5zdGFiZH0sIHRoZSBAdmFye3ZhbHVlfSBmaWVsZCBpcyBpbXBsaWNpdCBhbmQgaGFzIHRoZSB2YWx1ZSBvZgordGhlIGN1cnJlbnQgZmlsZSBsb2NhdGlvbi4gIEZvciBAY29kZXsuc3RhYnh9LCB0aGUgQHZhcntzZGItdHlwZX0gZmllbGQKK2lzIHVudXNlZCBmb3Igc3RhYnMgYW5kIGNhbiBhbHdheXMgYmUgc2V0IHRvIHplcm8uICBUaGUgQHZhcntvdGhlcn0KK2ZpZWxkIGlzIGFsbW9zdCBhbHdheXMgdW51c2VkIGFuZCBjYW4gYmUgc2V0IHRvIHplcm8uCisKK1RoZSBudW1iZXIgaW4gdGhlIEB2YXJ7dHlwZX0gZmllbGQgZ2l2ZXMgc29tZSBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dAord2hpY2ggdHlwZSBvZiBzdGFiIHRoaXMgaXMgKG9yIHdoZXRoZXIgaXQgQGVtcGh7aXN9IGEgc3RhYiwgYXMgb3Bwb3NlZAordG8gYW4gb3JkaW5hcnkgc3ltYm9sKS4gIEVhY2ggdmFsaWQgdHlwZSBudW1iZXIgZGVmaW5lcyBhIGRpZmZlcmVudCBzdGFiCit0eXBlOyBmdXJ0aGVyLCB0aGUgc3RhYiB0eXBlIGRlZmluZXMgdGhlIGV4YWN0IGludGVycHJldGF0aW9uIG9mLCBhbmQKK3Bvc3NpYmxlIHZhbHVlcyBmb3IsIGFueSByZW1haW5pbmcgQHZhcntzdHJpbmd9LCBAdmFye2Rlc2N9LCBvcgorQHZhcnt2YWx1ZX0gZmllbGRzIHByZXNlbnQgaW4gdGhlIHN0YWIuICBAeHJlZntTdGFiIFR5cGVzfSwgZm9yIGEgbGlzdAoraW4gbnVtZXJpYyBvcmRlciBvZiB0aGUgdmFsaWQgQHZhcnt0eXBlfSBmaWVsZCB2YWx1ZXMgZm9yIHN0YWIgZGlyZWN0aXZlcy4KKworQG5vZGUgU3RyaW5nIEZpZWxkCitAc2VjdGlvbiBUaGUgU3RyaW5nIEZpZWxkCisKK0ZvciBtb3N0IHN0YWJzIHRoZSBzdHJpbmcgZmllbGQgaG9sZHMgdGhlIG1lYXQgb2YgdGhlCitkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGUgZmxleGlibGUgbmF0dXJlIG9mIHRoaXMgZmllbGQKK2lzIHdoYXQgbWFrZXMgc3RhYnMgZXh0ZW5zaWJsZS4gIEZvciBzb21lIHN0YWIgdHlwZXMgdGhlIHN0cmluZyBmaWVsZAorY29udGFpbnMgb25seSBhIG5hbWUuICBGb3Igb3RoZXIgc3RhYiB0eXBlcyB0aGUgY29udGVudHMgY2FuIGJlIGEgZ3JlYXQKK2RlYWwgbW9yZSBjb21wbGV4LgorCitUaGUgb3ZlcmFsbCBmb3JtYXQgb2YgdGhlIHN0cmluZyBmaWVsZCBmb3IgbW9zdCBzdGFiIHR5cGVzIGlzOgorCitAZXhhbXBsZQorIkB2YXJ7bmFtZX06QHZhcntzeW1ib2wtZGVzY3JpcHRvcn0gQHZhcnt0eXBlLWluZm9ybWF0aW9ufSIKK0BlbmQgZXhhbXBsZQorCitAdmFye25hbWV9IGlzIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgcmVwcmVzZW50ZWQgYnkgdGhlIHN0YWI7IGl0IGNhbgorY29udGFpbiBhIHBhaXIgb2YgY29sb25zIChAcHhyZWZ7TmVzdGVkIFN5bWJvbHN9KS4gIEB2YXJ7bmFtZX0gY2FuIGJlCitvbWl0dGVkLCB3aGljaCBtZWFucyB0aGUgc3RhYiByZXByZXNlbnRzIGFuIHVubmFtZWQgb2JqZWN0LiAgRm9yCitleGFtcGxlLCBAc2FtcHs6dDEwPSoyfSBkZWZpbmVzIHR5cGUgMTAgYXMgYSBwb2ludGVyIHRvIHR5cGUgMiwgYnV0IGRvZXMKK25vdCBnaXZlIHRoZSB0eXBlIGEgbmFtZS4gIE9taXR0aW5nIHRoZSBAdmFye25hbWV9IGZpZWxkIGlzIHN1cHBvcnRlZCBieQorQUlYIGRieCBhbmQgR0RCIGFmdGVyIGFib3V0IHZlcnNpb24gNC44LCBidXQgbm90IG90aGVyIGRlYnVnZ2Vycy4gIEdDQworc29tZXRpbWVzIHVzZXMgYSBzaW5nbGUgc3BhY2UgYXMgdGhlIG5hbWUgaW5zdGVhZCBvZiBvbWl0dGluZyB0aGUgbmFtZQorYWx0b2dldGhlcjsgYXBwYXJlbnRseSB0aGF0IGlzIHN1cHBvcnRlZCBieSBtb3N0IGRlYnVnZ2Vycy4KKworVGhlIEB2YXJ7c3ltYm9sLWRlc2NyaXB0b3J9IGZvbGxvd2luZyB0aGUgQHNhbXB7On0gaXMgYW4gYWxwaGFiZXRpYworY2hhcmFjdGVyIHRoYXQgdGVsbHMgbW9yZSBzcGVjaWZpY2FsbHkgd2hhdCBraW5kIG9mIHN5bWJvbCB0aGUgc3RhYgorcmVwcmVzZW50cy4gSWYgdGhlIEB2YXJ7c3ltYm9sLWRlc2NyaXB0b3J9IGlzIG9taXR0ZWQsIGJ1dCB0eXBlCitpbmZvcm1hdGlvbiBmb2xsb3dzLCB0aGVuIHRoZSBzdGFiIHJlcHJlc2VudHMgYSBsb2NhbCB2YXJpYWJsZS4gIEZvciBhCitsaXN0IG9mIHN5bWJvbCBkZXNjcmlwdG9ycywgc2VlIEByZWZ7U3ltYm9sIERlc2NyaXB0b3JzfS4gIFRoZSBAc2FtcHtjfQorc3ltYm9sIGRlc2NyaXB0b3IgaXMgYW4gZXhjZXB0aW9uIGluIHRoYXQgaXQgaXMgbm90IGZvbGxvd2VkIGJ5IHR5cGUKK2luZm9ybWF0aW9uLiAgQHhyZWZ7Q29uc3RhbnRzfS4KKworQHZhcnt0eXBlLWluZm9ybWF0aW9ufSBpcyBlaXRoZXIgYSBAdmFye3R5cGUtbnVtYmVyfSwgb3IKK0BzYW1we0B2YXJ7dHlwZS1udW1iZXJ9PX0uICBBIEB2YXJ7dHlwZS1udW1iZXJ9IGFsb25lIGlzIGEgdHlwZQorcmVmZXJlbmNlLCByZWZlcnJpbmcgZGlyZWN0bHkgdG8gYSB0eXBlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLgorCitUaGUgQHNhbXB7QHZhcnt0eXBlLW51bWJlcn09fSBmb3JtIGlzIGEgdHlwZSBkZWZpbml0aW9uLCB3aGVyZSB0aGUKK251bWJlciByZXByZXNlbnRzIGEgbmV3IHR5cGUgd2hpY2ggaXMgYWJvdXQgdG8gYmUgZGVmaW5lZC4gIFRoZSB0eXBlCitkZWZpbml0aW9uIG1heSByZWZlciB0byBvdGhlciB0eXBlcyBieSBudW1iZXIsIGFuZCB0aG9zZSB0eXBlIG51bWJlcnMKK21heSBiZSBmb2xsb3dlZCBieSBAc2FtcHs9fSBhbmQgbmVzdGVkIGRlZmluaXRpb25zLiAgQWxzbywgdGhlIEx1Y2lkCitjb21waWxlciB3aWxsIHJlcGVhdCBAc2FtcHtAdmFye3R5cGUtbnVtYmVyfT19IG1vcmUgdGhhbiBvbmNlIGlmIGl0Cit3YW50cyB0byBkZWZpbmUgc2V2ZXJhbCB0eXBlIG51bWJlcnMgYXQgb25jZS4KKworSW4gYSB0eXBlIGRlZmluaXRpb24sIGlmIHRoZSBjaGFyYWN0ZXIgdGhhdCBmb2xsb3dzIHRoZSBlcXVhbHMgc2lnbiBpcworbm9uLW51bWVyaWMgdGhlbiBpdCBpcyBhIEB2YXJ7dHlwZS1kZXNjcmlwdG9yfSwgYW5kIHRlbGxzIHdoYXQga2luZCBvZgordHlwZSBpcyBhYm91dCB0byBiZSBkZWZpbmVkLiAgQW55IG90aGVyIHZhbHVlcyBmb2xsb3dpbmcgdGhlCitAdmFye3R5cGUtZGVzY3JpcHRvcn0gdmFyeSwgZGVwZW5kaW5nIG9uIHRoZSBAdmFye3R5cGUtZGVzY3JpcHRvcn0uCitAeHJlZntUeXBlIERlc2NyaXB0b3JzfSwgZm9yIGEgbGlzdCBvZiBAdmFye3R5cGUtZGVzY3JpcHRvcn0gdmFsdWVzLiAgSWYKK2EgbnVtYmVyIGZvbGxvd3MgdGhlIEBzYW1wez19IHRoZW4gdGhlIG51bWJlciBpcyBhIEB2YXJ7dHlwZS1yZWZlcmVuY2V9LgorRm9yIGEgZnVsbCBkZXNjcmlwdGlvbiBvZiB0eXBlcywgQHJlZntUeXBlc30uCisKK0EgQHZhcnt0eXBlLW51bWJlcn0gaXMgb2Z0ZW4gYSBzaW5nbGUgbnVtYmVyLiAgVGhlIEdOVSBhbmQgU3VuIHRvb2xzCithZGRpdGlvbmFsbHkgcGVybWl0IGEgQHZhcnt0eXBlLW51bWJlcn0gdG8gYmUgYSBwYWlyCisoQHZhcntmaWxlLW51bWJlcn0sQHZhcntmaWxldHlwZS1udW1iZXJ9KSAodGhlIHBhcmVudGhlc2VzIGFwcGVhciBpbiB0aGUKK3N0cmluZywgYW5kIHNlcnZlIHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28gY2FzZXMpLiAgVGhlIEB2YXJ7ZmlsZS1udW1iZXJ9CitpcyBhIG51bWJlciBzdGFydGluZyB3aXRoIDEgd2hpY2ggaXMgaW5jcmVtZW50ZWQgZm9yIGVhY2ggc2VwZXJhdGUKK3NvdXJjZSBmaWxlIGluIHRoZSBjb21waWxhdGlvbiAoZS5nLiwgaW4gQywgZWFjaCBoZWFkZXIgZmlsZSBnZXRzIGEKK2RpZmZlcmVudCBudW1iZXIpLiAgVGhlIEB2YXJ7ZmlsZXR5cGUtbnVtYmVyfSBpcyBhIG51bWJlciBzdGFydGluZyB3aXRoCisxIHdoaWNoIGlzIGluY3JlbWVudGVkIGZvciBlYWNoIG5ldyB0eXBlIGRlZmluZWQgaW4gdGhlIGZpbGUuCisoU2VwYXJhdGluZyB0aGUgZmlsZSBudW1iZXIgYW5kIHRoZSB0eXBlIG51bWJlciBwZXJtaXRzIHRoZQorQGNvZGV7Tl9CSU5DTH0gb3B0aW1pemF0aW9uIHRvIHN1Y2NlZWQgbW9yZSBvZnRlbjsgc2VlIEByZWZ7SW5jbHVkZQorRmlsZXN9KS4KKworVGhlcmUgaXMgYW4gQUlYIGV4dGVuc2lvbiBmb3IgdHlwZSBhdHRyaWJ1dGVzLiAgRm9sbG93aW5nIHRoZSBAc2FtcHs9fQorYXJlIGFueSBudW1iZXIgb2YgdHlwZSBhdHRyaWJ1dGVzLiAgRWFjaCBvbmUgc3RhcnRzIHdpdGggQHNhbXB7QEB9IGFuZAorZW5kcyB3aXRoIEBzYW1wezt9LiAgRGVidWdnZXJzLCBpbmNsdWRpbmcgQUlYJ3MgZGJ4IGFuZCBHREIgNC4xMCwgc2tpcAorYW55IHR5cGUgYXR0cmlidXRlcyB0aGV5IGRvIG5vdCByZWNvZ25pemUuICBHREIgNC45IGFuZCBvdGhlciB2ZXJzaW9ucworb2YgZGJ4IG1heSBub3QgZG8gdGhpcy4gIEJlY2F1c2Ugb2YgYSBjb25mbGljdCB3aXRoIEMrKworKEBweHJlZntDcGx1c3BsdXN9KSwgbmV3IGF0dHJpYnV0ZXMgc2hvdWxkIG5vdCBiZSBkZWZpbmVkIHdoaWNoIGJlZ2luCit3aXRoIGEgZGlnaXQsIEBzYW1weyh9LCBvciBAc2FtcHstfTsgR0RCIG1heSBiZSB1bmFibGUgdG8gZGlzdGluZ3Vpc2gKK3Rob3NlIGZyb20gdGhlIEMrKyB0eXBlIGRlc2NyaXB0b3IgQHNhbXB7QEB9LiAgVGhlIGF0dHJpYnV0ZXMgYXJlOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIGFAdmFye2JvdW5kYXJ5fQorQHZhcntib3VuZGFyeX0gaXMgYW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBhbGlnbm1lbnQuICBJIGFzc3VtZSBpdAorYXBwbGllcyB0byBhbGwgdmFyaWFibGVzIG9mIHRoaXMgdHlwZS4KKworQGl0ZW0gcEB2YXJ7aW50ZWdlcn0KK1BvaW50ZXIgY2xhc3MgKGZvciBjaGVja2luZykuICBOb3Qgc3VyZSB3aGF0IHRoaXMgbWVhbnMsIG9yIGhvdworQHZhcntpbnRlZ2VyfSBpcyBpbnRlcnByZXRlZC4KKworQGl0ZW0gUAorSW5kaWNhdGUgdGhpcyBpcyBhIHBhY2tlZCB0eXBlLCBtZWFuaW5nIHRoYXQgc3RydWN0dXJlIGZpZWxkcyBvciBhcnJheQorZWxlbWVudHMgYXJlIHBsYWNlZCBtb3JlIGNsb3NlbHkgaW4gbWVtb3J5LCB0byBzYXZlIG1lbW9yeSBhdCB0aGUKK2V4cGVuc2Ugb2Ygc3BlZWQuCisKK0BpdGVtIHNAdmFye3NpemV9CitTaXplIGluIGJpdHMgb2YgYSB2YXJpYWJsZSBvZiB0aGlzIHR5cGUuICBUaGlzIGlzIGZ1bGx5IHN1cHBvcnRlZCBieSBHREIKKzQuMTEgYW5kIGxhdGVyLgorCitAaXRlbSBTCitJbmRpY2F0ZSB0aGF0IHRoaXMgdHlwZSBpcyBhIHN0cmluZyBpbnN0ZWFkIG9mIGFuIGFycmF5IG9mIGNoYXJhY3RlcnMsCitvciBhIGJpdHN0cmluZyBpbnN0ZWFkIG9mIGEgc2V0LiAgSXQgZG9lc24ndCBjaGFuZ2UgdGhlIGxheW91dCBvZiB0aGUKK2RhdGEgYmVpbmcgcmVwcmVzZW50ZWQsIGJ1dCBkb2VzIGVuYWJsZSB0aGUgZGVidWdnZXIgdG8ga25vdyB3aGljaCB0eXBlCitpdCBpcy4KK0BlbmQgdGFibGUKKworQWxsIG9mIHRoaXMgY2FuIG1ha2UgdGhlIHN0cmluZyBmaWVsZCBxdWl0ZSBsb25nLiAgQWxsIHZlcnNpb25zIG9mIEdEQiwKK2FuZCBzb21lIHZlcnNpb25zIG9mIGRieCwgY2FuIGhhbmRsZSBhcmJpdHJhcmlseSBsb25nIHN0cmluZ3MuICBCdXQgbWFueQordmVyc2lvbnMgb2YgZGJ4IChvciBhc3NlbWJsZXJzIG9yIGxpbmtlcnMsIEknbSBub3Qgc3VyZSB3aGljaCkKK2NyZXRpbm91c2x5IGxpbWl0IHRoZSBzdHJpbmdzIHRvIGFib3V0IDgwIGNoYXJhY3RlcnMsIHNvIGNvbXBpbGVycyB3aGljaAorbXVzdCB3b3JrIHdpdGggc3VjaCBzeXN0ZW1zIG5lZWQgdG8gc3BsaXQgdGhlIEBjb2Rley5zdGFic30gZGlyZWN0aXZlCitpbnRvIHNldmVyYWwgQGNvZGV7LnN0YWJzfSBkaXJlY3RpdmVzLiAgRWFjaCBzdGFiIGR1cGxpY2F0ZXMgZXZlcnkgZmllbGQKK2V4Y2VwdCB0aGUgc3RyaW5nIGZpZWxkLiAgVGhlIHN0cmluZyBmaWVsZCBvZiBldmVyeSBzdGFiIGV4Y2VwdCB0aGUgbGFzdAoraXMgbWFya2VkIGFzIGNvbnRpbnVlZCB3aXRoIGEgYmFja3NsYXNoIGF0IHRoZSBlbmQgKGluIHRoZSBhc3NlbWJseSBjb2RlCit0aGlzIG1heSBiZSB3cml0dGVuIGFzIGEgZG91YmxlIGJhY2tzbGFzaCwgZGVwZW5kaW5nIG9uIHRoZSBhc3NlbWJsZXIpLgorUmVtb3ZpbmcgdGhlIGJhY2tzbGFzaGVzIGFuZCBjb25jYXRlbmF0aW5nIHRoZSBzdHJpbmcgZmllbGRzIG9mIGVhY2gKK3N0YWIgcHJvZHVjZXMgdGhlIG9yaWdpbmFsLCBsb25nIHN0cmluZy4gIEp1c3QgdG8gYmUgaW5jb21wYXRpYmxlIChvciBzbwordGhleSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHdoYXQgdGhlIGFzc2VtYmxlciBkb2VzIHdpdGgKK2JhY2tzbGFzaGVzKSwgQUlYIGNhbiB1c2UgQHNhbXB7P30gaW5zdGVhZCBvZiBiYWNrc2xhc2guCisKK0Bub2RlIEMgRXhhbXBsZQorQHNlY3Rpb24gQSBTaW1wbGUgRXhhbXBsZSBpbiBDIFNvdXJjZQorCitUbyBnZXQgdGhlIGZsYXZvciBvZiBob3cgc3RhYnMgZGVzY3JpYmUgc291cmNlIGluZm9ybWF0aW9uIGZvciBhIEMKK3Byb2dyYW0sIGxldCdzIGxvb2sgYXQgdGhlIHNpbXBsZSBwcm9ncmFtOgorCitAZXhhbXBsZQorbWFpbigpCitAeworICAgICAgICBwcmludGYoIkhlbGxvIHdvcmxkIik7CitAfQorQGVuZCBleGFtcGxlCisKK1doZW4gY29tcGlsZWQgd2l0aCBAc2FtcHstZ30sIHRoZSBwcm9ncmFtIGFib3ZlIHlpZWxkcyB0aGUgZm9sbG93aW5nCitAZmlsZXsuc30gZmlsZS4gIExpbmUgbnVtYmVycyBoYXZlIGJlZW4gYWRkZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVmZXIKK3RvIHBhcnRzIG9mIHRoZSBAZmlsZXsuc30gZmlsZSBpbiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHN0YWJzIHRoYXQKK2ZvbGxvd3MuCisKK0Bub2RlIEFzc2VtYmx5IENvZGUKK0BzZWN0aW9uIFRoZSBTaW1wbGUgRXhhbXBsZSBhdCB0aGUgQXNzZW1ibHkgTGV2ZWwKKworVGhpcyBzaW1wbGUgYGBoZWxsbyB3b3JsZCcnIGV4YW1wbGUgZGVtb25zdHJhdGVzIHNldmVyYWwgb2YgdGhlIHN0YWIKK3R5cGVzIHVzZWQgdG8gZGVzY3JpYmUgQyBsYW5ndWFnZSBzb3VyY2UgZmlsZXMuCisKK0BleGFtcGxlCisxICBnY2MyX2NvbXBpbGVkLjoKKzIgIC5zdGFicyAiL2N5Z2ludC9zMS91c2Vycy9qY20vcGxheS8iLDEwMCwwLDAsTHRleHQwCiszICAuc3RhYnMgImhlbGxvLmMiLDEwMCwwLDAsTHRleHQwCis0ICAudGV4dAorNSAgTHRleHQwOgorNiAgLnN0YWJzICJpbnQ6dDE9cjE7LTIxNDc0ODM2NDg7MjE0NzQ4MzY0NzsiLDEyOCwwLDAsMAorNyAgLnN0YWJzICJjaGFyOnQyPXIyOzA7MTI3OyIsMTI4LDAsMCwwCis4ICAuc3RhYnMgImxvbmcgaW50OnQzPXIxOy0yMTQ3NDgzNjQ4OzIxNDc0ODM2NDc7IiwxMjgsMCwwLDAKKzkgIC5zdGFicyAidW5zaWduZWQgaW50OnQ0PXIxOzA7LTE7IiwxMjgsMCwwLDAKKzEwIC5zdGFicyAibG9uZyB1bnNpZ25lZCBpbnQ6dDU9cjE7MDstMTsiLDEyOCwwLDAsMAorMTEgLnN0YWJzICJzaG9ydCBpbnQ6dDY9cjE7LTMyNzY4OzMyNzY3OyIsMTI4LDAsMCwwCisxMiAuc3RhYnMgImxvbmcgbG9uZyBpbnQ6dDc9cjE7MDstMTsiLDEyOCwwLDAsMAorMTMgLnN0YWJzICJzaG9ydCB1bnNpZ25lZCBpbnQ6dDg9cjE7MDs2NTUzNTsiLDEyOCwwLDAsMAorMTQgLnN0YWJzICJsb25nIGxvbmcgdW5zaWduZWQgaW50OnQ5PXIxOzA7LTE7IiwxMjgsMCwwLDAKKzE1IC5zdGFicyAic2lnbmVkIGNoYXI6dDEwPXIxOy0xMjg7MTI3OyIsMTI4LDAsMCwwCisxNiAuc3RhYnMgInVuc2lnbmVkIGNoYXI6dDExPXIxOzA7MjU1OyIsMTI4LDAsMCwwCisxNyAuc3RhYnMgImZsb2F0OnQxMj1yMTs0OzA7IiwxMjgsMCwwLDAKKzE4IC5zdGFicyAiZG91YmxlOnQxMz1yMTs4OzA7IiwxMjgsMCwwLDAKKzE5IC5zdGFicyAibG9uZyBkb3VibGU6dDE0PXIxOzg7MDsiLDEyOCwwLDAsMAorMjAgLnN0YWJzICJ2b2lkOnQxNT0xNSIsMTI4LDAsMCwwCisyMSAgICAgIC5hbGlnbiA0CisyMiBMQzA6CisyMyAgICAgIC5hc2NpaSAiSGVsbG8sIHdvcmxkIVwxMlwwIgorMjQgICAgICAuYWxpZ24gNAorMjUgICAgICAuZ2xvYmFsIF9tYWluCisyNiAgICAgIC5wcm9jIDEKKzI3IF9tYWluOgorMjggLnN0YWJuIDY4LDAsNCxMTTEKKzI5IExNMToKKzMwICAgICAgISNQUk9MT0dVRSMgMAorMzEgICAgICBzYXZlICVzcCwtMTM2LCVzcAorMzIgICAgICAhI1BST0xPR1VFIyAxCiszMyAgICAgIGNhbGwgX19fbWFpbiwwCiszNCAgICAgIG5vcAorMzUgLnN0YWJuIDY4LDAsNSxMTTIKKzM2IExNMjoKKzM3IExCQjI6CiszOCAgICAgIHNldGhpICVoaShMQzApLCVvMQorMzkgICAgICBvciAlbzEsJWxvKExDMCksJW8wCis0MCAgICAgIGNhbGwgX3ByaW50ZiwwCis0MSAgICAgIG5vcAorNDIgLnN0YWJuIDY4LDAsNixMTTMKKzQzIExNMzoKKzQ0IExCRTI6Cis0NSAuc3RhYm4gNjgsMCw2LExNNAorNDYgTE00OgorNDcgTDE6Cis0OCAgICAgIHJldAorNDkgICAgICByZXN0b3JlCis1MCAuc3RhYnMgIm1haW46RjEiLDM2LDAsMCxfbWFpbgorNTEgLnN0YWJuIDE5MiwwLDAsTEJCMgorNTIgLnN0YWJuIDIyNCwwLDAsTEJFMgorQGVuZCBleGFtcGxlCisKK0Bub2RlIFByb2dyYW0gU3RydWN0dXJlCitAY2hhcHRlciBFbmNvZGluZyB0aGUgU3RydWN0dXJlIG9mIHRoZSBQcm9ncmFtCisKK1RoZSBlbGVtZW50cyBvZiB0aGUgcHJvZ3JhbSBzdHJ1Y3R1cmUgdGhhdCBzdGFicyBlbmNvZGUgaW5jbHVkZSB0aGUgbmFtZQorb2YgdGhlIG1haW4gZnVuY3Rpb24sIHRoZSBuYW1lcyBvZiB0aGUgc291cmNlIGFuZCBpbmNsdWRlIGZpbGVzLCB0aGUKK2xpbmUgbnVtYmVycywgcHJvY2VkdXJlIG5hbWVzIGFuZCB0eXBlcywgYW5kIHRoZSBiZWdpbm5pbmdzIGFuZCBlbmRzIG9mCitibG9ja3Mgb2YgY29kZS4KKworQG1lbnUKKyogTWFpbiBQcm9ncmFtOjoJCUluZGljYXRlIHdoYXQgdGhlIG1haW4gcHJvZ3JhbSBpcworKiBTb3VyY2UgRmlsZXM6OgkJVGhlIHBhdGggYW5kIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlCisqIEluY2x1ZGUgRmlsZXM6OiAgICAgICAgICAgICAgIE5hbWVzIG9mIGluY2x1ZGUgZmlsZXMKKyogTGluZSBOdW1iZXJzOjoKKyogUHJvY2VkdXJlczo6CisqIE5lc3RlZCBQcm9jZWR1cmVzOjoKKyogQmxvY2sgU3RydWN0dXJlOjoKKyogQWx0ZXJuYXRlIEVudHJ5IFBvaW50czo6ICAgICAgRW50ZXJpbmcgcHJvY2VkdXJlcyBleGNlcHQgYXQgdGhlIGJlZ2lubmluZy4KK0BlbmQgbWVudQorCitAbm9kZSBNYWluIFByb2dyYW0KK0BzZWN0aW9uIE1haW4gUHJvZ3JhbQorCitAZmluZGV4IE5fTUFJTgorTW9zdCBsYW5ndWFnZXMgYWxsb3cgdGhlIG1haW4gcHJvZ3JhbSB0byBoYXZlIGFueSBuYW1lLiAgVGhlCitAY29kZXtOX01BSU59IHN0YWIgdHlwZSB0ZWxscyB0aGUgZGVidWdnZXIgdGhlIG5hbWUgdGhhdCBpcyB1c2VkIGluIHRoaXMKK3Byb2dyYW0uICBPbmx5IHRoZSBzdHJpbmcgZmllbGQgaXMgc2lnbmlmaWNhbnQ7IGl0IGlzIHRoZSBuYW1lIG9mCithIGZ1bmN0aW9uIHdoaWNoIGlzIHRoZSBtYWluIHByb2dyYW0uICBNb3N0IEMgY29tcGlsZXJzIGRvIG5vdCB1c2UgdGhpcworc3RhYiAodGhleSBleHBlY3QgdGhlIGRlYnVnZ2VyIHRvIGFzc3VtZSB0aGF0IHRoZSBuYW1lIGlzIEBjb2Rle21haW59KSwKK2J1dCBzb21lIEMgY29tcGlsZXJzIGVtaXQgYW4gQGNvZGV7Tl9NQUlOfSBzdGFiIGZvciB0aGUgQGNvZGV7bWFpbn0KK2Z1bmN0aW9uLiAgSSdtIG5vdCBzdXJlIGhvdyBYQ09GRiBoYW5kbGVzIHRoaXMuCisKK0Bub2RlIFNvdXJjZSBGaWxlcworQHNlY3Rpb24gUGF0aHMgYW5kIE5hbWVzIG9mIHRoZSBTb3VyY2UgRmlsZXMKKworQGZpbmRleCBOX1NPCitCZWZvcmUgYW55IG90aGVyIHN0YWJzIG9jY3VyLCB0aGVyZSBtdXN0IGJlIGEgc3RhYiBzcGVjaWZ5aW5nIHRoZSBzb3VyY2UKK2ZpbGUuICBUaGlzIGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbiBhIHN5bWJvbCBvZiBzdGFiIHR5cGUKK0Bjb2Rle05fU099OyB0aGUgc3RyaW5nIGZpZWxkIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiAgVGhlCit2YWx1ZSBvZiB0aGUgc3ltYm9sIGlzIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBwb3J0aW9uIG9mIHRoZQordGV4dCBzZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBmaWxlLgorCitXaXRoIHRoZSBTdW4gU29sYXJpczIgY29tcGlsZXIsIHRoZSBkZXNjIGZpZWxkIGNvbnRhaW5zIGEKK3NvdXJjZS1sYW5ndWFnZSBjb2RlLgorQGMgRG8gdGhlIGRlYnVnZ2VycyB1c2UgaXQ/ICBXaGF0IGFyZSB0aGUgY29kZXM/IC1kam0KKworU29tZSBjb21waWxlcnMgKGZvciBleGFtcGxlLCBHQ0MyIGFuZCBTdW5PUzQgQGZpbGV7L2Jpbi9jY30pIGFsc28KK2luY2x1ZGUgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgc291cmNlIHdhcyBjb21waWxlZCwgaW4gYSBzZWNvbmQKK0Bjb2Rle05fU099IHN5bWJvbCBwcmVjZWRpbmcgdGhlIG9uZSBjb250YWluaW5nIHRoZSBmaWxlIG5hbWUuICBUaGlzCitzeW1ib2wgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIGZhY3QgdGhhdCBpdCBlbmRzIGluIGEgc2xhc2guICBDb2RlCitmcm9tIHRoZSBAY29kZXtjZnJvbnR9IEMrKyBjb21waWxlciBjYW4gaGF2ZSBhZGRpdGlvbmFsIEBjb2Rle05fU099IHN5bWJvbHMgZm9yCitub25leGlzdGVudCBzb3VyY2UgZmlsZXMgYWZ0ZXIgdGhlIEBjb2Rle05fU099IGZvciB0aGUgcmVhbCBzb3VyY2UgZmlsZTsKK3RoZXNlIGFyZSBiZWxpZXZlZCB0byBjb250YWluIG5vIHVzZWZ1bCBpbmZvcm1hdGlvbi4KKworRm9yIGV4YW1wbGU6CisKK0BleGFtcGxlCisuc3RhYnMgIi9jeWdpbnQvczEvdXNlcnMvamNtL3BsYXkvIiwxMDAsMCwwLEx0ZXh0MCAgICAgIyBAcnsxMDAgaXMgTl9TT30KKy5zdGFicyAiaGVsbG8uYyIsMTAwLDAsMCxMdGV4dDAKKyAgICAgICAgLnRleHQKK0x0ZXh0MDoKK0BlbmQgZXhhbXBsZQorCitAZmluZGV4IENfRklMRQorSW5zdGVhZCBvZiBAY29kZXtOX1NPfSBzeW1ib2xzLCBYQ09GRiB1c2VzIGEgQGNvZGV7LmZpbGV9IGFzc2VtYmxlcgorZGlyZWN0aXZlIHdoaWNoIGFzc2VtYmxlcyB0byBhIEBjb2Rle0NfRklMRX0gc3ltYm9sOyBleHBsYWluaW5nIHRoaXMgaW4KK2RldGFpbCBpcyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGRvY3VtZW50LgorCitAYyBGSVhNRTogRXhhY3RseSB3aGVuIHNob3VsZCB0aGUgZW1wdHkgTl9TTyBiZSB1c2VkPyAgV2h5PworSWYgaXQgaXMgdXNlZnVsIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgYSBzb3VyY2UgZmlsZSwgdGhpcyBpcyBkb25lIHdpdGgKK2FuIEBjb2Rle05fU099IHN5bWJvbCB3aXRoIGFuIGVtcHR5IHN0cmluZyBmb3IgdGhlIG5hbWUuICBUaGUgdmFsdWUgaXMKK3RoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIHRleHQgc2VjdGlvbiBmb3IgdGhlIGZpbGUuICBGb3Igc29tZQorc3lzdGVtcywgdGhlcmUgaXMgbm8gaW5kaWNhdGlvbiBvZiB0aGUgZW5kIG9mIGEgc291cmNlIGZpbGUsIGFuZCB5b3UKK2p1c3QgbmVlZCB0byBmaWd1cmUgaXQgZW5kZWQgd2hlbiB5b3Ugc2VlIGFuIEBjb2Rle05fU099IGZvciBhIGRpZmZlcmVudAorc291cmNlIGZpbGUsIG9yIGEgc3ltYm9sIGVuZGluZyBpbiBAY29kZXsub30gKHdoaWNoIGF0IGxlYXN0IHNvbWUKK2xpbmtlcnMgaW5zZXJ0IHRvIG1hcmsgdGhlIHN0YXJ0IG9mIGEgbmV3IEBjb2Rley5vfSBmaWxlKS4KKworQG5vZGUgSW5jbHVkZSBGaWxlcworQHNlY3Rpb24gTmFtZXMgb2YgSW5jbHVkZSBGaWxlcworCitUaGVyZSBhcmUgc2V2ZXJhbCBzY2hlbWVzIGZvciBkZWFsaW5nIHdpdGggaW5jbHVkZSBmaWxlczogdGhlCit0cmFkaXRpb25hbCBAY29kZXtOX1NPTH0gYXBwcm9hY2gsIFN1bidzIEBjb2Rle05fQklOQ0x9IGFwcHJvYWNoLCBhbmQgdGhlCitYQ09GRiBAY29kZXtDX0JJTkNMfSBhcHByb2FjaCAod2hpY2ggZGVzcGl0ZSB0aGUgc2ltaWxhciBuYW1lIGhhcyBsaXR0bGUgaW4KK2NvbW1vbiB3aXRoIEBjb2Rle05fQklOQ0x9KS4KKworQGZpbmRleCBOX1NPTAorQW4gQGNvZGV7Tl9TT0x9IHN5bWJvbCBzcGVjaWZpZXMgd2hpY2ggaW5jbHVkZSBmaWxlIHN1YnNlcXVlbnQgc3ltYm9scworcmVmZXIgdG8uICBUaGUgc3RyaW5nIGZpZWxkIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGFuZCB0aGUgdmFsdWUgaXMgdGhlCit0ZXh0IGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyBpbmNsdWRlIGZpbGUgYW5kCit0aGUgc3RhcnQgb2YgdGhpcyBvbmUuICBUbyBzcGVjaWZ5IHRoZSBtYWluIHNvdXJjZSBmaWxlIGFnYWluLCB1c2UgYW4KK0Bjb2Rle05fU09MfSBzeW1ib2wgd2l0aCB0aGUgbmFtZSBvZiB0aGUgbWFpbiBzb3VyY2UgZmlsZS4KKworQGZpbmRleCBOX0JJTkNMCitAZmluZGV4IE5fRUlOQ0wKK0BmaW5kZXggTl9FWENMCitUaGUgQGNvZGV7Tl9CSU5DTH0gYXBwcm9hY2ggd29ya3MgYXMgZm9sbG93cy4gIEFuIEBjb2Rle05fQklOQ0x9IHN5bWJvbAorc3BlY2lmaWVzIHRoZSBzdGFydCBvZiBhbiBpbmNsdWRlIGZpbGUuICBJbiBhbiBvYmplY3QgZmlsZSwgb25seSB0aGUKK3N0cmluZyBpcyBzaWduaWZpY2FudDsgdGhlIGxpbmtlciBwdXRzIGRhdGEgaW50byBzb21lIG9mIHRoZSBvdGhlcgorZmllbGRzLiAgVGhlIGVuZCBvZiB0aGUgaW5jbHVkZSBmaWxlIGlzIG1hcmtlZCBieSBhbiBAY29kZXtOX0VJTkNMfQorc3ltYm9sICh3aGljaCBoYXMgbm8gc3RyaW5nIGZpZWxkKS4gIEluIGFuIG9iamVjdCBmaWxlLCB0aGVyZSBpcyBubworc2lnbmlmaWNhbnQgZGF0YSBpbiB0aGUgQGNvZGV7Tl9FSU5DTH0gc3ltYm9sLiAgQGNvZGV7Tl9CSU5DTH0gYW5kCitAY29kZXtOX0VJTkNMfSBjYW4gYmUgbmVzdGVkLgorCitJZiB0aGUgbGlua2VyIGRldGVjdHMgdGhhdCB0d28gc291cmNlIGZpbGVzIGhhdmUgaWRlbnRpY2FsIHN0YWJzIGJldHdlZW4KK2FuIEBjb2Rle05fQklOQ0x9IGFuZCBAY29kZXtOX0VJTkNMfSBwYWlyIChhcyB3aWxsIGdlbmVyYWxseSBiZSB0aGUgY2FzZQorZm9yIGEgaGVhZGVyIGZpbGUpLCB0aGVuIGl0IG9ubHkgcHV0cyBvdXQgdGhlIHN0YWJzIG9uY2UuICBFYWNoCithZGRpdGlvbmFsIG9jY3VyYW5jZSBpcyByZXBsYWNlZCBieSBhbiBAY29kZXtOX0VYQ0x9IHN5bWJvbC4gIEkgYmVsaWV2ZQordGhlIEdOVSBsaW5rZXIgYW5kIHRoZSBTdW4gKGJvdGggU3VuT1M0IGFuZCBTb2xhcmlzKSBsaW5rZXIgYXJlIHRoZSBvbmx5CitvbmVzIHdoaWNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4KKworQSBsaW5rZXIgd2hpY2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlIHdpbGwgc2V0IHRoZSB2YWx1ZSBvZiBhCitAY29kZXtOX0JJTkNMfSBzeW1ib2wgdG8gdGhlIHRvdGFsIG9mIGFsbCB0aGUgY2hhcmFjdGVycyBpbiB0aGUgc3RhYnMKK3N0cmluZ3MgaW5jbHVkZWQgaW4gdGhlIGhlYWRlciBmaWxlLCBvbWl0dGluZyBhbnkgZmlsZSBudW1iZXJzLiAgVGhlCit2YWx1ZSBvZiBhbiBAY29kZXtOX0VYQ0x9IHN5bWJvbCBpcyB0aGUgc2FtZSBhcyB0aGUgdmFsdWUgb2YgdGhlCitAY29kZXtOX0JJTkNMfSBzeW1ib2wgaXQgcmVwbGFjZXMuICBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkIHRvCittYXRjaCB1cCBAY29kZXtOX0VYQ0x9IGFuZCBAY29kZXtOX0JJTkNMfSBzeW1ib2xzIHdoaWNoIGhhdmUgdGhlIHNhbWUKK2ZpbGVuYW1lLiAgVGhlIEBjb2Rle05fRUlOQ0x9IHZhbHVlLCBhbmQgdGhlIHZhbHVlcyBvZiB0aGUgb3RoZXIgYW5kCitkZXNjcmlwdGlvbiBmaWVsZHMgZm9yIGFsbCB0aHJlZSwgYXBwZWFyIHRvIGFsd2F5cyBiZSB6ZXJvLgorCitAZmluZGV4IENfQklOQ0wKK0BmaW5kZXggQ19FSU5DTAorRm9yIHRoZSBzdGFydCBvZiBhbiBpbmNsdWRlIGZpbGUgaW4gWENPRkYsIHVzZSB0aGUgQGZpbGV7LmJpfSBhc3NlbWJsZXIKK2RpcmVjdGl2ZSwgd2hpY2ggZ2VuZXJhdGVzIGEgQGNvZGV7Q19CSU5DTH0gc3ltYm9sLiAgQSBAZmlsZXsuZWl9CitkaXJlY3RpdmUsIHdoaWNoIGdlbmVyYXRlcyBhIEBjb2Rle0NfRUlOQ0x9IHN5bWJvbCwgZGVub3RlcyB0aGUgZW5kIG9mCit0aGUgaW5jbHVkZSBmaWxlLiAgQm90aCBkaXJlY3RpdmVzIGFyZSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUKK3NvdXJjZSBmaWxlIGluIHF1b3Rlcywgd2hpY2ggYmVjb21lcyB0aGUgc3RyaW5nIGZvciB0aGUgc3ltYm9sLgorVGhlIHZhbHVlIG9mIGVhY2ggc3ltYm9sLCBwcm9kdWNlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBhc3NlbWJsZXIKK2FuZCBsaW5rZXIsIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgZXhlY3V0YWJsZSBvZiB0aGUgYmVnaW5uaW5nCisoaW5jbHVzaXZlLCBhcyB5b3UnZCBleHBlY3QpIG9yIGVuZCAoaW5jbHVzaXZlLCBhcyB5b3Ugd291bGQgbm90IGV4cGVjdCkKK29mIHRoZSBwb3J0aW9uIG9mIHRoZSBDT0ZGIGxpbmUgdGFibGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIGluY2x1ZGUKK2ZpbGUuICBAY29kZXtDX0JJTkNMfSBhbmQgQGNvZGV7Q19FSU5DTH0gZG8gbm90IG5lc3QuCisKK0Bub2RlIExpbmUgTnVtYmVycworQHNlY3Rpb24gTGluZSBOdW1iZXJzCisKK0BmaW5kZXggTl9TTElORQorQW4gQGNvZGV7Tl9TTElORX0gc3ltYm9sIHJlcHJlc2VudHMgdGhlIHN0YXJ0IG9mIGEgc291cmNlIGxpbmUuICBUaGUKK2Rlc2MgZmllbGQgY29udGFpbnMgdGhlIGxpbmUgbnVtYmVyIGFuZCB0aGUgdmFsdWUgY29udGFpbnMgdGhlIGNvZGUKK2FkZHJlc3MgZm9yIHRoZSBzdGFydCBvZiB0aGF0IHNvdXJjZSBsaW5lLiAgT24gbW9zdCBtYWNoaW5lcyB0aGUgYWRkcmVzcworaXMgYWJzb2x1dGU7IGZvciBzdGFicyBpbiBzZWN0aW9ucyAoQHB4cmVme1N0YWIgU2VjdGlvbnN9KSwgaXQgaXMKK3JlbGF0aXZlIHRvIHRoZSBmdW5jdGlvbiBpbiB3aGljaCB0aGUgQGNvZGV7Tl9TTElORX0gc3ltYm9sIG9jY3Vycy4KKworQGZpbmRleCBOX0RTTElORQorQGZpbmRleCBOX0JTTElORQorR05VIGRvY3VtZW50cyBAY29kZXtOX0RTTElORX0gYW5kIEBjb2Rle05fQlNMSU5FfSBzeW1ib2xzIGZvciBsaW5lCitudW1iZXJzIGluIHRoZSBkYXRhIG9yIGJzcyBzZWdtZW50cywgcmVzcGVjdGl2ZWx5LiAgVGhleSBhcmUgaWRlbnRpY2FsCit0byBAY29kZXtOX1NMSU5FfSBidXQgYXJlIHJlbG9jYXRlZCBkaWZmZXJlbnRseSBieSB0aGUgbGlua2VyLiAgVGhleQord2VyZSBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgYSB2YXJpYWJsZQorZGVjbGFyYXRpb24sIGJ1dCBJIGJlbGlldmUgdGhhdCBHQ0MyIGFjdHVhbGx5IHB1dHMgdGhlIGxpbmUgbnVtYmVyIGluCit0aGUgZGVzYyBmaWVsZCBvZiB0aGUgc3RhYiBmb3IgdGhlIHZhcmlhYmxlIGl0c2VsZi4gIEdEQiBoYXMgYmVlbgoraWdub3JpbmcgdGhlc2Ugc3ltYm9scyAodW5sZXNzIHRoZXkgY29udGFpbiBhIHN0cmluZyBmaWVsZCkgc2luY2UKK2F0IGxlYXN0IEdEQiAzLjUuCisKK0ZvciBzaW5nbGUgc291cmNlIGxpbmVzIHRoYXQgZ2VuZXJhdGUgZGlzY29udGlndW91cyBjb2RlLCBzdWNoIGFzIGZsb3cKK29mIGNvbnRyb2wgc3RhdGVtZW50cywgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUgbGluZSBudW1iZXIgZW50cnkgZm9yCit0aGUgc2FtZSBzb3VyY2UgbGluZS4gIEluIHRoaXMgY2FzZSB0aGVyZSBpcyBhIGxpbmUgbnVtYmVyIGVudHJ5IGF0IHRoZQorc3RhcnQgb2YgZWFjaCBjb2RlIHJhbmdlLCBlYWNoIHdpdGggdGhlIHNhbWUgbGluZSBudW1iZXIuCisKK1hDT0ZGIGRvZXMgbm90IHVzZSBzdGFicyBmb3IgbGluZSBudW1iZXJzLiAgSW5zdGVhZCwgaXQgdXNlcyBDT0ZGIGxpbmUKK251bWJlcnMgKHdoaWNoIGFyZSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGRvY3VtZW50KS4gIFN0YW5kYXJkIENPRkYKK2xpbmUgbnVtYmVycyBjYW5ub3QgZGVhbCB3aXRoIGluY2x1ZGUgZmlsZXMsIGJ1dCBpbiBYQ09GRiB0aGlzIGlzIGZpeGVkCit3aXRoIHRoZSBAY29kZXtDX0JJTkNMfSBtZXRob2Qgb2YgbWFya2luZyBpbmNsdWRlIGZpbGVzIChAcHhyZWZ7SW5jbHVkZQorRmlsZXN9KS4KKworQG5vZGUgUHJvY2VkdXJlcworQHNlY3Rpb24gUHJvY2VkdXJlcworCitAZmluZGV4IE5fRlVOLCBmb3IgZnVuY3Rpb25zCitAZmluZGV4IE5fRk5BTUUKK0BmaW5kZXggTl9TVFNZTSwgZm9yIGZ1bmN0aW9ucyAoU3VuIGFjYykKK0BmaW5kZXggTl9HU1lNLCBmb3IgZnVuY3Rpb25zIChTdW4gYWNjKQorQWxsIG9mIHRoZSBmb2xsb3dpbmcgc3RhYnMgbm9ybWFsbHkgdXNlIHRoZSBAY29kZXtOX0ZVTn0gc3ltYm9sIHR5cGUuCitIb3dldmVyLCBTdW4ncyBAY29kZXthY2N9IGNvbXBpbGVyIG9uIFN1bk9TNCB1c2VzIEBjb2Rle05fR1NZTX0gYW5kCitAY29kZXtOX1NUU1lNfSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIHN0YWIgZm9yIHRoZSBmdW5jdGlvbgoraXMgdXNlbGVzcyBhbmQgdGhlIGRlYnVnZ2VyIG11c3QgZ2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiBmcm9tCit0aGUgbm9uLXN0YWIgc3ltYm9scyBpbnN0ZWFkLiAgT24gc3lzdGVtcyB3aGVyZSBub24tc3RhYiBzeW1ib2xzIGhhdmUKK2xlYWRpbmcgdW5kZXJzY29yZXMsIHRoZSBzdGFicyB3aWxsIGxhY2sgdW5kZXJzY29yZXMgYW5kIHRoZSBkZWJ1Z2dlcgorbmVlZHMgdG8ga25vdyBhYm91dCB0aGUgbGVhZGluZyB1bmRlcnNjb3JlIHRvIG1hdGNoIHVwIHRoZSBzdGFiIGFuZCB0aGUKK25vbi1zdGFiIHN5bWJvbC4gIEJTRCBGb3J0cmFuIGlzIHNhaWQgdG8gdXNlIEBjb2Rle05fRk5BTUV9IHdpdGggdGhlCitzYW1lIHJlc3RyaWN0aW9uOyB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBpcyBub3QgdXNlZnVsIChJJ20gbm90IHN1cmUgaXQKK3JlYWxseSBkb2VzIHVzZSB0aGlzLCBiZWNhdXNlIEdEQiBkb2Vzbid0IGhhbmRsZSB0aGlzIGFuZCBubyBvbmUgaGFzCitjb21wbGFpbmVkKS4KKworQGZpbmRleCBDX0ZVTgorQSBmdW5jdGlvbiBpcyByZXByZXNlbnRlZCBieSBhbiBAc2FtcHtGfSBzeW1ib2wgZGVzY3JpcHRvciBmb3IgYSBnbG9iYWwKKyhleHRlcm4pIGZ1bmN0aW9uLCBhbmQgQHNhbXB7Zn0gZm9yIGEgc3RhdGljIChsb2NhbCkgZnVuY3Rpb24uICBGb3IKK2Eub3V0LCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlCitmdW5jdGlvbjsgaXQgaXMgYWxyZWFkeSByZWxvY2F0ZWQuICBGb3Igc3RhYnMgaW4gRUxGLCB0aGUgU3VuUFJPCitjb21waWxlciB2ZXJzaW9uIDIuMC4xIGFuZCBHQ0MgcHV0IG91dCBhbiBhZGRyZXNzIHdoaWNoIGdldHMgcmVsb2NhdGVkCitieSB0aGUgbGlua2VyLiAgSW4gYSBmdXR1cmUgcmVsZWFzZSBTdW5QUk8gaXMgcGxhbm5pbmcgdG8gcHV0IG91dCB6ZXJvLAoraW4gd2hpY2ggY2FzZSB0aGUgYWRkcmVzcyBjYW4gYmUgZm91bmQgZnJvbSB0aGUgRUxGIChub24tc3RhYikgc3ltYm9sLgorQmVjYXVzZSBsb29raW5nIHRoaW5ncyB1cCBpbiB0aGUgRUxGIHN5bWJvbHMgd291bGQgcHJvYmFibHkgYmUgc2xvdywgSSdtCitub3Qgc3VyZSBob3cgdG8gZmluZCB3aGljaCBzeW1ib2wgb2YgdGhhdCBuYW1lIGlzIHRoZSByaWdodCBvbmUsIGFuZAordGhpcyBkb2Vzbid0IHByb3ZpZGUgYW55IHdheSB0byBkZWFsIHdpdGggbmVzdGVkIGZ1bmN0aW9ucywgaXQgd291bGQKK3Byb2JhYmx5IGJlIGJldHRlciB0byBtYWtlIHRoZSB2YWx1ZSBvZiB0aGUgc3RhYiBhbiBhZGRyZXNzIHJlbGF0aXZlIHRvCit0aGUgc3RhcnQgb2YgdGhlIGZpbGUsIG9yIGp1c3QgYWJzb2x1dGUuICBTZWUgQHJlZntFTEYgTGlua2VyCitSZWxvY2F0aW9ufSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBsaW5rZXIgcmVsb2NhdGlvbiBvZiBzdGFicyBpbiBFTEYKK2ZpbGVzLiAgRm9yIFhDT0ZGLCB0aGUgc3RhYiB1c2VzIHRoZSBAY29kZXtDX0ZVTn0gc3RvcmFnZSBjbGFzcyBhbmQgdGhlCit2YWx1ZSBvZiB0aGUgc3RhYiBpcyBtZWFuaW5nbGVzczsgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGNhbiBiZQorZm91bmQgZnJvbSB0aGUgY3NlY3Qgc3ltYm9sIChYVFlfTEQvWE1DX1BSKS4KKworVGhlIHR5cGUgaW5mb3JtYXRpb24gb2YgdGhlIHN0YWIgcmVwcmVzZW50cyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlCitmdW5jdGlvbjsgdGh1cyBAc2FtcHtmb286ZjV9IG1lYW5zIHRoYXQgZm9vIGlzIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHR5cGUKKzUuICBUaGVyZSBpcyBubyBuZWVkIHRvIHRyeSB0byBnZXQgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBzdGFydCBvZiB0aGUKK2Z1bmN0aW9uIGZyb20gdGhlIHN0YWIgZm9yIHRoZSBmdW5jdGlvbjsgaXQgaXMgaW4gdGhlIG5leHQKK0Bjb2Rle05fU0xJTkV9IHN5bWJvbC4KKworQGMgRklYTUU6IHZlcmlmeSB3aGV0aGVyIHRoZSAiSSBzdXNwZWN0IiBiZWxvdyBpcyB0cnVlIG9yIG5vdC4KK1NvbWUgY29tcGlsZXJzIChzdWNoIGFzIFN1bidzIFNvbGFyaXMgY29tcGlsZXIpIHN1cHBvcnQgYW4gZXh0ZW5zaW9uIGZvcgorc3BlY2lmeWluZyB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cy4gIEkgc3VzcGVjdCB0aGlzIGV4dGVuc2lvbiBpcyBub3QKK3VzZWQgZm9yIG9sZCAobm9uLXByb3RvdHlwZWQpIGZ1bmN0aW9uIGRlZmluaXRpb25zIGluIEMuICBJZiB0aGUKK2V4dGVuc2lvbiBpcyBpbiB1c2UsIHRoZSB0eXBlIGluZm9ybWF0aW9uIG9mIHRoZSBzdGFiIGZvciB0aGUgZnVuY3Rpb24KK2lzIGZvbGxvd2VkIGJ5IHR5cGUgaW5mb3JtYXRpb24gZm9yIGVhY2ggYXJndW1lbnQsIHdpdGggZWFjaCBhcmd1bWVudAorcHJlY2VkZWQgYnkgQHNhbXB7O30uICBBbiBhcmd1bWVudCB0eXBlIG9mIDAgbWVhbnMgdGhhdCBhZGRpdGlvbmFsCithcmd1bWVudHMgYXJlIGJlaW5nIHBhc3NlZCwgd2hvc2UgdHlwZXMgYW5kIG51bWJlciBtYXkgdmFyeSAoQHNhbXB7Li4ufQoraW4gQU5TSSBDKS4gIEdEQiBoYXMgdG9sZXJhdGVkIHRoaXMgZXh0ZW5zaW9uIChwYXJzZWQgdGhlIHN5bnRheCwgaWYgbm90CituZWNlc3NhcmlseSB1c2VkIHRoZSBpbmZvcm1hdGlvbikgc2luY2UgYXQgbGVhc3QgdmVyc2lvbiA0Ljg7IEkgZG9uJ3QKK2tub3cgd2hldGhlciBhbGwgdmVyc2lvbnMgb2YgZGJ4IHRvbGVyYXRlIGl0LiAgVGhlIGFyZ3VtZW50IHR5cGVzIGdpdmVuCitoZXJlIGFyZSBub3QgcmVkdW5kYW50IHdpdGggdGhlIHN5bWJvbHMgZm9yIHRoZSBmb3JtYWwgcGFyYW1ldGVycworKEBweHJlZntQYXJhbWV0ZXJzfSk7IHRoZXkgYXJlIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIGFzIHRoZXkgYXJlCitwYXNzZWQsIGJlZm9yZSBhbnkgY29udmVyc2lvbnMgbWlnaHQgdGFrZSBwbGFjZS4gIEZvciBleGFtcGxlLCBpZiBhIEMKK2Z1bmN0aW9uIHdoaWNoIGlzIGRlY2xhcmVkIHdpdGhvdXQgYSBwcm90b3R5cGUgdGFrZXMgYSBAY29kZXtmbG9hdH0KK2FyZ3VtZW50LCB0aGUgdmFsdWUgaXMgcGFzc2VkIGFzIGEgQGNvZGV7ZG91YmxlfSBidXQgdGhlbiBjb252ZXJ0ZWQgdG8gYQorQGNvZGV7ZmxvYXR9LiAgRGVidWdnZXJzIG5lZWQgdG8gdXNlIHRoZSB0eXBlcyBnaXZlbiBpbiB0aGUgYXJndW1lbnRzCit3aGVuIHByaW50aW5nIHZhbHVlcywgYnV0IHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb24gdGhleSBuZWVkIHRvIHVzZSB0aGUKK3R5cGVzIGdpdmVuIGluIHRoZSBzeW1ib2wgZGVmaW5pbmcgdGhlIGZ1bmN0aW9uLgorCitJZiB0aGUgcmV0dXJuIHR5cGUgYW5kIHR5cGVzIG9mIGFyZ3VtZW50cyBvZiBhIGZ1bmN0aW9uIHdoaWNoIGlzIGRlZmluZWQKK2luIGFub3RoZXIgc291cmNlIGZpbGUgYXJlIHNwZWNpZmllZCAoaS5lLiwgYSBmdW5jdGlvbiBwcm90b3R5cGUgaW4gQU5TSQorQyksIHRyYWRpdGlvbmFsbHkgY29tcGlsZXJzIGVtaXQgbm8gc3RhYjsgdGhlIG9ubHkgd2F5IGZvciB0aGUgZGVidWdnZXIKK3RvIGZpbmQgdGhlIGluZm9ybWF0aW9uIGlzIGlmIHRoZSBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgZnVuY3Rpb24gaXMKK2RlZmluZWQgd2FzIGFsc28gY29tcGlsZWQgd2l0aCBkZWJ1Z2dpbmcgc3ltYm9scy4gIEFzIGFuIGV4dGVuc2lvbiB0aGUKK1NvbGFyaXMgY29tcGlsZXIgdXNlcyBzeW1ib2wgZGVzY3JpcHRvciBAc2FtcHtQfSBmb2xsb3dlZCBieSB0aGUgcmV0dXJuCit0eXBlIG9mIHRoZSBmdW5jdGlvbiwgZm9sbG93ZWQgYnkgdGhlIGFyZ3VtZW50cywgZWFjaCBwcmVjZWRlZCBieQorQHNhbXB7O30sIGFzIGluIGEgc3RhYiB3aXRoIHN5bWJvbCBkZXNjcmlwdG9yIEBzYW1we2Z9IG9yIEBzYW1we0Z9LgorVGhpcyB1c2Ugb2Ygc3ltYm9sIGRlc2NyaXB0b3IgQHNhbXB7UH0gY2FuIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBpdHMgdXNlCitmb3IgcmVnaXN0ZXIgcGFyYW1ldGVycyAoQHB4cmVme1JlZ2lzdGVyIFBhcmFtZXRlcnN9KSBieSB0aGUgZmFjdCB0aGF0IGl0IGhhcworc3ltYm9sIHR5cGUgQGNvZGV7Tl9GVU59LgorCitUaGUgQUlYIGRvY3VtZW50YXRpb24gYWxzbyBkZWZpbmVzIHN5bWJvbCBkZXNjcmlwdG9yIEBzYW1we0p9IGFzIGFuCitpbnRlcm5hbCBmdW5jdGlvbi4gIEkgYXNzdW1lIHRoaXMgbWVhbnMgYSBmdW5jdGlvbiBuZXN0ZWQgd2l0aGluIGFub3RoZXIKK2Z1bmN0aW9uLiAgSXQgYWxzbyBzYXlzIHN5bWJvbCBkZXNjcmlwdG9yIEBzYW1we219IGlzIGEgbW9kdWxlIGluCitNb2R1bGEtMiBvciBleHRlbmRlZCBQYXNjYWwuCisKK1Byb2NlZHVyZXMgKGZ1bmN0aW9ucyB3aGljaCBkbyBub3QgcmV0dXJuIHZhbHVlcykgYXJlIHJlcHJlc2VudGVkIGFzCitmdW5jdGlvbnMgcmV0dXJuaW5nIHRoZSBAY29kZXt2b2lkfSB0eXBlIGluIEMuICBJIGRvbid0IHNlZSB3aHkgdGhpcyBjb3VsZG4ndAorYmUgdXNlZCBmb3IgYWxsIGxhbmd1YWdlcyAoaW52ZW50aW5nIGEgQGNvZGV7dm9pZH0gdHlwZSBmb3IgdGhpcyBwdXJwb3NlIGlmCituZWNlc3NhcnkpLCBidXQgdGhlIEFJWCBkb2N1bWVudGF0aW9uIGRlZmluZXMgQHNhbXB7SX0sIEBzYW1we1B9LCBhbmQKK0BzYW1we1F9IGZvciBpbnRlcm5hbCwgZ2xvYmFsLCBhbmQgc3RhdGljIHByb2NlZHVyZXMsIHJlc3BlY3RpdmVseS4KK1RoZXNlIHN5bWJvbCBkZXNjcmlwdG9ycyBhcmUgdW51c3VhbCBpbiB0aGF0IHRoZXkgYXJlIG5vdCBmb2xsb3dlZCBieQordHlwZSBpbmZvcm1hdGlvbi4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGEgc3RhYiBmb3IgYSBmdW5jdGlvbiBAY29kZXttYWlufSB3aGljaAorcmV0dXJucyB0eXBlIG51bWJlciBAY29kZXsxfS4gIFRoZSBAY29kZXtfbWFpbn0gc3BlY2lmaWVkIGZvciB0aGUgdmFsdWUKK2lzIGEgcmVmZXJlbmNlIHRvIGFuIGFzc2VtYmxlciBsYWJlbCB3aGljaCBpcyB1c2VkIHRvIGZpbGwgaW4gdGhlIHN0YXJ0CithZGRyZXNzIG9mIHRoZSBmdW5jdGlvbi4KKworQGV4YW1wbGUKKy5zdGFicyAibWFpbjpGMSIsMzYsMCwwLF9tYWluICAgICAgIyBAcnszNiBpcyBOX0ZVTn0KK0BlbmQgZXhhbXBsZQorCitUaGUgc3RhYiByZXByZXNlbnRpbmcgYSBwcm9jZWR1cmUgaXMgbG9jYXRlZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlCitjb2RlIG9mIHRoZSBwcm9jZWR1cmUuICBUaGlzIHN0YWIgaXMgaW4gdHVybiBkaXJlY3RseSBmb2xsb3dlZCBieSBhCitncm91cCBvZiBvdGhlciBzdGFicyBkZXNjcmliaW5nIGVsZW1lbnRzIG9mIHRoZSBwcm9jZWR1cmUuICBUaGVzZSBvdGhlcgorc3RhYnMgZGVzY3JpYmUgdGhlIHByb2NlZHVyZSdzIHBhcmFtZXRlcnMsIGl0cyBibG9jayBsb2NhbCB2YXJpYWJsZXMsIGFuZAoraXRzIGJsb2NrIHN0cnVjdHVyZS4KKworSWYgZnVuY3Rpb25zIGNhbiBhcHBlYXIgaW4gZGlmZmVyZW50IHNlY3Rpb25zLCB0aGVuIHRoZSBkZWJ1Z2dlciBtYXkgbm90CitiZSBhYmxlIHRvIGZpbmQgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uLiAgUmVjZW50IHZlcnNpb25zIG9mIEdDQyB3aWxsIG1hcmsKK3RoZSBlbmQgb2YgYSBmdW5jdGlvbiB3aXRoIGFuIEBjb2Rle05fRlVOfSBzeW1ib2wgd2l0aCBhbiBlbXB0eSBzdHJpbmcKK2ZvciB0aGUgbmFtZS4gIFRoZSB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBjdXJyZW50CitmdW5jdGlvbi4gIFdpdGhvdXQgc3VjaCBhIHN5bWJvbCwgdGhlcmUgaXMgbm8gaW5kaWNhdGlvbiBvZiB0aGUgYWRkcmVzcworb2YgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uLCBhbmQgeW91IG11c3QgYXNzdW1lIHRoYXQgaXQgZW5kZWQgYXQgdGhlCitzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBuZXh0IGZ1bmN0aW9uIG9yIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQgc2VjdGlvbgorZm9yIHRoZSBwcm9ncmFtLgorCitAbm9kZSBOZXN0ZWQgUHJvY2VkdXJlcworQHNlY3Rpb24gTmVzdGVkIFByb2NlZHVyZXMKKworRm9yIGFueSBvZiB0aGUgc3ltYm9sIGRlc2NyaXB0b3JzIHJlcHJlc2VudGluZyBwcm9jZWR1cmVzLCBhZnRlciB0aGUKK3N5bWJvbCBkZXNjcmlwdG9yIGFuZCB0aGUgdHlwZSBpbmZvcm1hdGlvbiBpcyBvcHRpb25hbGx5IGEgc2NvcGUKK3NwZWNpZmllci4gIFRoaXMgY29uc2lzdHMgb2YgYSBjb21tYSwgdGhlIG5hbWUgb2YgdGhlIHByb2NlZHVyZSwgYW5vdGhlcgorY29tbWEsIGFuZCB0aGUgbmFtZSBvZiB0aGUgZW5jbG9zaW5nIHByb2NlZHVyZS4gIFRoZSBmaXJzdCBuYW1lIGlzIGxvY2FsCit0byB0aGUgc2NvcGUgc3BlY2lmaWVkLCBhbmQgc2VlbXMgdG8gYmUgcmVkdW5kYW50IHdpdGggdGhlIG5hbWUgb2YgdGhlCitzeW1ib2wgKGJlZm9yZSB0aGUgQHNhbXB7On0pLiAgVGhpcyBmZWF0dXJlIGlzIHVzZWQgYnkgR0NDLCBhbmQKK3ByZXN1bWFibHkgUGFzY2FsLCBNb2R1bGEtMiwgZXRjLiwgY29tcGlsZXJzLCBmb3IgbmVzdGVkIGZ1bmN0aW9ucy4KKworSWYgcHJvY2VkdXJlcyBhcmUgbmVzdGVkIG1vcmUgdGhhbiBvbmUgbGV2ZWwgZGVlcCwgb25seSB0aGUgaW1tZWRpYXRlbHkKK2NvbnRhaW5pbmcgc2NvcGUgaXMgc3BlY2lmaWVkLiAgRm9yIGV4YW1wbGUsIHRoaXMgY29kZToKKworQGV4YW1wbGUKK2ludAorZm9vIChpbnQgeCkKK0B7CisgIGludCBiYXIgKGludCB5KQorICAgIEB7CisgICAgICBpbnQgYmF6IChpbnQgeikKKyAgICAgICAgQHsKKyAgICAgICAgICByZXR1cm4geCArIHkgKyB6OworICAgICAgICBAfQorICAgICAgcmV0dXJuIGJheiAoeCArIDIgKiB5KTsKKyAgICBAfQorICByZXR1cm4geCArIGJhciAoMyAqIHgpOworQH0KK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK3Byb2R1Y2VzIHRoZSBzdGFiczoKKworQGV4YW1wbGUKKy5zdGFicyAiYmF6OmYxLGJheixiYXIiLDM2LDAsMCxfYmF6LjE1ICAgICAgICAgIyBAcnszNiBpcyBOX0ZVTn0KKy5zdGFicyAiYmFyOmYxLGJhcixmb28iLDM2LDAsMCxfYmFyLjEyCisuc3RhYnMgImZvbzpGMSIsMzYsMCwwLF9mb28KK0BlbmQgZXhhbXBsZQorCitAbm9kZSBCbG9jayBTdHJ1Y3R1cmUKK0BzZWN0aW9uIEJsb2NrIFN0cnVjdHVyZQorCitAZmluZGV4IE5fTEJSQUMKK0BmaW5kZXggTl9SQlJBQworQGMgRm9yIEdDQyAyLjUuOCBvciBzbyBzdGFicy1pbi1jb2ZmLCB0aGVzZSBhcmUgYWJzb2x1dGUgaW5zdGVhZCBvZgorQGMgZnVuY3Rpb24gcmVsYXRpdmUgKGFzIGRvY3VtZW50ZWQgYmVsb3cpLiAgQnV0IEdEQiBoYXMgbmV2ZXIgYmVlbiBhYmxlCitAYyB0byBkZWFsIHdpdGggdGhhdCAoaXQgaGFkIHdhbnRlZCB0aGVtIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBmaWxlLCBidXQKK0BjIEkganVzdCBmaXhlZCB0aGF0IChiZXR3ZWVuIEdEQiA0LjEyIGFuZCA0LjEzKSksIHNvIGl0IGlzIGZ1bmN0aW9uCitAYyByZWxhdGl2ZSBqdXN0IGxpa2UgRUxGIGFuZCBTT00gYW5kIHRoZSBiZWxvdyBkb2N1bWVudGF0aW9uLgorVGhlIHByb2dyYW0ncyBibG9jayBzdHJ1Y3R1cmUgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEBjb2Rle05fTEJSQUN9IChsZWZ0CiticmFjZSkgYW5kIHRoZSBAY29kZXtOX1JCUkFDfSAocmlnaHQgYnJhY2UpIHN0YWIgdHlwZXMuICBUaGUgdmFyaWFibGVzCitkZWZpbmVkIGluc2lkZSBhIGJsb2NrIHByZWNlZGUgdGhlIEBjb2Rle05fTEJSQUN9IHN5bWJvbCBmb3IgbW9zdAorY29tcGlsZXJzLCBpbmNsdWRpbmcgR0NDLiAgT3RoZXIgY29tcGlsZXJzLCBzdWNoIGFzIHRoZSBDb252ZXgsIEFjb3JuCitSSVNDIG1hY2hpbmUsIGFuZCBTdW4gQGNvZGV7YWNjfSBjb21waWxlcnMsIHB1dCB0aGUgdmFyaWFibGVzIGFmdGVyIHRoZQorQGNvZGV7Tl9MQlJBQ30gc3ltYm9sLiAgVGhlIHZhbHVlcyBvZiB0aGUgQGNvZGV7Tl9MQlJBQ30gYW5kCitAY29kZXtOX1JCUkFDfSBzeW1ib2xzIGFyZSB0aGUgc3RhcnQgYW5kIGVuZCBhZGRyZXNzZXMgb2YgdGhlIGNvZGUgb2YKK3RoZSBibG9jaywgcmVzcGVjdGl2ZWx5LiAgRm9yIG1vc3QgbWFjaGluZXMsIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZQorc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGlzIHNvdXJjZSBmaWxlLiAgRm9yIHRoZSBHb3VsZCBOUDEsIHRoZXkgYXJlCithYnNvbHV0ZS4gIEZvciBzdGFicyBpbiBzZWN0aW9ucyAoQHB4cmVme1N0YWIgU2VjdGlvbnN9KSwgdGhleSBhcmUKK3JlbGF0aXZlIHRvIHRoZSBmdW5jdGlvbiBpbiB3aGljaCB0aGV5IG9jY3VyLgorCitUaGUgQGNvZGV7Tl9MQlJBQ30gYW5kIEBjb2Rle05fUkJSQUN9IHN0YWJzIHRoYXQgZGVzY3JpYmUgdGhlIGJsb2NrCitzY29wZSBvZiBhIHByb2NlZHVyZSBhcmUgbG9jYXRlZCBhZnRlciB0aGUgQGNvZGV7Tl9GVU59IHN0YWIgdGhhdAorcmVwcmVzZW50cyB0aGUgcHJvY2VkdXJlIGl0c2VsZi4KKworU3VuIGRvY3VtZW50cyB0aGUgZGVzYyBmaWVsZCBvZiBAY29kZXtOX0xCUkFDfSBhbmQKK0Bjb2Rle05fUkJSQUN9IHN5bWJvbHMgYXMgY29udGFpbmluZyB0aGUgbmVzdGluZyBsZXZlbCBvZiB0aGUgYmxvY2suCitIb3dldmVyLCBkYnggc2VlbXMgdG8gbm90IGNhcmUsIGFuZCBHQ0MgYWx3YXlzIHNldHMgZGVzYyB0bworemVyby4KKworQGZpbmRleCAuYmIKK0BmaW5kZXggLmJlCitAZmluZGV4IENfQkxPQ0sKK0ZvciBYQ09GRiwgYmxvY2sgc2NvcGUgaXMgaW5kaWNhdGVkIHdpdGggQGNvZGV7Q19CTE9DS30gc3ltYm9scy4gIElmIHRoZQorbmFtZSBvZiB0aGUgc3ltYm9sIGlzIEBzYW1wey5iYn0sIHRoZW4gaXQgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2s7CitpZiB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIGlzIEBzYW1wey5iZX07IGl0IGlzIHRoZSBlbmQgb2YgdGhlIGJsb2NrLgorCitAbm9kZSBBbHRlcm5hdGUgRW50cnkgUG9pbnRzCitAc2VjdGlvbiBBbHRlcm5hdGUgRW50cnkgUG9pbnRzCisKK0BmaW5kZXggTl9FTlRSWQorQGZpbmRleCBDX0VOVFJZCitTb21lIGxhbmd1YWdlcywgbGlrZSBGb3J0cmFuLCBoYXZlIHRoZSBhYmlsaXR5IHRvIGVudGVyIHByb2NlZHVyZXMgYXQKK3NvbWUgcGxhY2Ugb3RoZXIgdGhhbiB0aGUgYmVnaW5uaW5nLiAgT25lIGNhbiBkZWNsYXJlIGFuIGFsdGVybmF0ZSBlbnRyeQorcG9pbnQuICBUaGUgQGNvZGV7Tl9FTlRSWX0gc3RhYiBpcyBmb3IgdGhpczsgaG93ZXZlciwgdGhlIFN1biBGT1JUUkFOCitjb21waWxlciBkb2Vzbid0IHVzZSBpdC4gIEFjY29yZGluZyB0byBBSVggZG9jdW1lbnRhdGlvbiwgb25seSB0aGUgbmFtZQorb2YgYSBAY29kZXtDX0VOVFJZfSBzdGFiIGlzIHNpZ25pZmljYW50OyB0aGUgYWRkcmVzcyBvZiB0aGUgYWx0ZXJuYXRlCitlbnRyeSBwb2ludCBjb21lcyBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGV4dGVybmFsIHN5bWJvbC4gIEEgcHJldmlvdXMKK3JldmlzaW9uIG9mIHRoaXMgZG9jdW1lbnQgc2FpZCB0aGF0IHRoZSB2YWx1ZSBvZiBhbiBAY29kZXtOX0VOVFJZfSBzdGFiCit3YXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGFsdGVybmF0ZSBlbnRyeSBwb2ludCwgYnV0IEkgZG9uJ3Qga25vdyB0aGUKK3NvdXJjZSBmb3IgdGhhdCBpbmZvcm1hdGlvbi4KKworQG5vZGUgQ29uc3RhbnRzCitAY2hhcHRlciBDb25zdGFudHMKKworVGhlIEBzYW1we2N9IHN5bWJvbCBkZXNjcmlwdG9yIGluZGljYXRlcyB0aGF0IHRoaXMgc3RhYiByZXByZXNlbnRzIGEKK2NvbnN0YW50LiAgVGhpcyBzeW1ib2wgZGVzY3JpcHRvciBpcyBhbiBleGNlcHRpb24gdG8gdGhlIGdlbmVyYWwgcnVsZQordGhhdCBzeW1ib2wgZGVzY3JpcHRvcnMgYXJlIGZvbGxvd2VkIGJ5IHR5cGUgaW5mb3JtYXRpb24uICBJbnN0ZWFkLCBpdAoraXMgZm9sbG93ZWQgYnkgQHNhbXB7PX0gYW5kIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIGIgQHZhcnt2YWx1ZX0KK0Jvb2xlYW4gY29uc3RhbnQuICBAdmFye3ZhbHVlfSBpcyBhIG51bWVyaWMgdmFsdWU7IEkgYXNzdW1lIGl0IGlzIDAgZm9yCitmYWxzZSBvciAxIGZvciB0cnVlLgorCitAaXRlbSBjIEB2YXJ7dmFsdWV9CitDaGFyYWN0ZXIgY29uc3RhbnQuICBAdmFye3ZhbHVlfSBpcyB0aGUgbnVtZXJpYyB2YWx1ZSBvZiB0aGUgY29uc3RhbnQuCisKK0BpdGVtIGUgQHZhcnt0eXBlLWluZm9ybWF0aW9ufSAsIEB2YXJ7dmFsdWV9CitDb25zdGFudCB3aG9zZSB2YWx1ZSBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgaW50ZWdyYWwuCitAdmFye3R5cGUtaW5mb3JtYXRpb259IGlzIHRoZSB0eXBlIG9mIHRoZSBjb25zdGFudCwgYXMgaXQgd291bGQgYXBwZWFyCithZnRlciBhIHN5bWJvbCBkZXNjcmlwdG9yIChAcHhyZWZ7U3RyaW5nIEZpZWxkfSkuICBAdmFye3ZhbHVlfSBpcyB0aGUKK251bWVyaWMgdmFsdWUgb2YgdGhlIGNvbnN0YW50LiAgR0RCIDQuOSBkb2VzIG5vdCBhY3R1YWxseSBnZXQgdGhlIHJpZ2h0Cit2YWx1ZSBpZiBAdmFye3ZhbHVlfSBkb2VzIG5vdCBmaXQgaW4gYSBob3N0IEBjb2Rle2ludH0sIGJ1dCBpdCBkb2VzIG5vdAorZG8gYW55dGhpbmcgdmlvbGVudCwgYW5kIGZ1dHVyZSBkZWJ1Z2dlcnMgY291bGQgYmUgZXh0ZW5kZWQgdG8gYWNjZXB0CitpbnRlZ2VycyBvZiBhbnkgc2l6ZSAod2hldGhlciB1bnNpZ25lZCBvciBub3QpLiAgVGhpcyBjb25zdGFudCB0eXBlIGlzCit1c3VhbGx5IGRvY3VtZW50ZWQgYXMgYmVpbmcgb25seSBmb3IgZW51bWVyYXRpb24gY29uc3RhbnRzLCBidXQgR0RCIGhhcworbmV2ZXIgaW1wb3NlZCB0aGF0IHJlc3RyaWN0aW9uOyBJIGRvbid0IGtub3cgYWJvdXQgb3RoZXIgZGVidWdnZXJzLgorCitAaXRlbSBpIEB2YXJ7dmFsdWV9CitJbnRlZ2VyIGNvbnN0YW50LiAgQHZhcnt2YWx1ZX0gaXMgdGhlIG51bWVyaWMgdmFsdWUuICBUaGUgdHlwZSBpcyBzb21lCitzb3J0IG9mIGdlbmVyaWMgaW50ZWdlciB0eXBlIChmb3IgR0RCLCBhIGhvc3QgQGNvZGV7aW50fSk7IHRvIHNwZWNpZnkKK3RoZSB0eXBlIGV4cGxpY2l0bHksIHVzZSBAc2FtcHtlfSBpbnN0ZWFkLgorCitAaXRlbSByIEB2YXJ7dmFsdWV9CitSZWFsIGNvbnN0YW50LiAgQHZhcnt2YWx1ZX0gaXMgdGhlIHJlYWwgdmFsdWUsIHdoaWNoIGNhbiBiZSBAc2FtcHtJTkZ9Cisob3B0aW9uYWxseSBwcmVjZWRlZCBieSBhIHNpZ24pIGZvciBpbmZpbml0eSwgQHNhbXB7UU5BTn0gZm9yIGEgcXVpZXQKK05hTiAobm90LWEtbnVtYmVyKSwgb3IgQHNhbXB7U05BTn0gZm9yIGEgc2lnbmFsbGluZyBOYU4uICBJZiBpdCBpcyBhCitub3JtYWwgbnVtYmVyIHRoZSBmb3JtYXQgaXMgdGhhdCBhY2NlcHRlZCBieSB0aGUgQyBsaWJyYXJ5IGZ1bmN0aW9uCitAY29kZXthdG9mfS4KKworQGl0ZW0gcyBAdmFye3N0cmluZ30KK1N0cmluZyBjb25zdGFudC4gIEB2YXJ7c3RyaW5nfSBpcyBhIHN0cmluZyBlbmNsb3NlZCBpbiBlaXRoZXIgQHNhbXB7J30KKyhpbiB3aGljaCBjYXNlIEBzYW1weyd9IGNoYXJhY3RlcnMgd2l0aGluIHRoZSBzdHJpbmcgYXJlIHJlcHJlc2VudGVkIGFzCitAc2FtcHtcJ30gb3IgQHNhbXB7In0gKGluIHdoaWNoIGNhc2UgQHNhbXB7In0gY2hhcmFjdGVycyB3aXRoaW4gdGhlCitzdHJpbmcgYXJlIHJlcHJlc2VudGVkIGFzIEBzYW1we1wifSkuCisKK0BpdGVtIFMgQHZhcnt0eXBlLWluZm9ybWF0aW9ufSAsIEB2YXJ7ZWxlbWVudHN9ICwgQHZhcntiaXRzfSAsIEB2YXJ7cGF0dGVybn0KK1NldCBjb25zdGFudC4gIEB2YXJ7dHlwZS1pbmZvcm1hdGlvbn0gaXMgdGhlIHR5cGUgb2YgdGhlIGNvbnN0YW50LCBhcyBpdAord291bGQgYXBwZWFyIGFmdGVyIGEgc3ltYm9sIGRlc2NyaXB0b3IgKEBweHJlZntTdHJpbmcgRmllbGR9KS4KK0B2YXJ7ZWxlbWVudHN9IGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNldCAoZG9lcyB0aGlzIG1lYW5zCitob3cgbWFueSBiaXRzIG9mIEB2YXJ7cGF0dGVybn0gYXJlIGFjdHVhbGx5IHVzZWQsIHdoaWNoIHdvdWxkIGJlCityZWR1bmRhbnQgd2l0aCB0aGUgdHlwZSwgb3IgcGVyaGFwcyB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluCitAdmFye3BhdHRlcm59PyAgSSBkb24ndCBnZXQgaXQpLCBAdmFye2JpdHN9IGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUKK2NvbnN0YW50IChtZWFuaW5nIGl0IHNwZWNpZmllcyB0aGUgbGVuZ3RoIG9mIEB2YXJ7cGF0dGVybn0sIEkgdGhpbmspLAorYW5kIEB2YXJ7cGF0dGVybn0gaXMgYSBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2V0LiAgQUlYCitkb2N1bWVudGF0aW9uIHJlZmVycyB0byBhIGxpbWl0IG9mIDMyIGJ5dGVzLCBidXQgSSBzZWUgbm8gcmVhc29uIHdoeQordGhpcyBsaW1pdCBzaG91bGQgZXhpc3QuICBUaGlzIGZvcm0gY291bGQgcHJvYmFibHkgYmUgdXNlZCBmb3IgYXJiaXRyYXJ5Citjb25zdGFudHMsIG5vdCBqdXN0IHNldHM7IHRoZSBvbmx5IGNhdGNoIGlzIHRoYXQgQHZhcntwYXR0ZXJufSBzaG91bGQgYmUKK3VuZGVyc3Rvb2QgdG8gYmUgdGFyZ2V0LCBub3QgaG9zdCwgYnl0ZSBvcmRlciBhbmQgZm9ybWF0LgorQGVuZCB0YWJsZQorCitUaGUgYm9vbGVhbiwgY2hhcmFjdGVyLCBzdHJpbmcsIGFuZCBzZXQgY29uc3RhbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5CitHREIgNC45LCBidXQgaXQgaWdub3JlcyB0aGVtLiAgR0RCIDQuOCBhbmQgZWFybGllciBnYXZlIGFuIGVycm9yCittZXNzYWdlIGFuZCByZWZ1c2VkIHRvIHJlYWQgc3ltYm9scyBmcm9tIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCitjb25zdGFudHMuCisKK1RoZSBhYm92ZSBpbmZvcm1hdGlvbiBpcyBmb2xsb3dlZCBieSBAc2FtcHs7fS4KKworQG5vZGUgVmFyaWFibGVzCitAY2hhcHRlciBWYXJpYWJsZXMKKworRGlmZmVyZW50IHR5cGVzIG9mIHN0YWJzIGRlc2NyaWJlIHRoZSB2YXJpb3VzIHdheXMgdGhhdCB2YXJpYWJsZXMgY2FuIGJlCithbGxvY2F0ZWQ6IG9uIHRoZSBzdGFjaywgZ2xvYmFsbHksIGluIHJlZ2lzdGVycywgaW4gY29tbW9uIGJsb2NrcywKK3N0YXRpY2FsbHksIG9yIGFzIGFyZ3VtZW50cyB0byBhIGZ1bmN0aW9uLgorCitAbWVudQorKiBTdGFjayBWYXJpYWJsZXM6OgkJVmFyaWFibGVzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suCisqIEdsb2JhbCBWYXJpYWJsZXM6OgkJVmFyaWFibGVzIHVzZWQgYnkgbW9yZSB0aGFuIG9uZSBzb3VyY2UgZmlsZS4KKyogUmVnaXN0ZXIgVmFyaWFibGVzOjoJCVZhcmlhYmxlcyBpbiByZWdpc3RlcnMuCisqIENvbW1vbiBCbG9ja3M6OgkJVmFyaWFibGVzIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHRvZ2V0aGVyLgorKiBTdGF0aWNzOjoJCQlWYXJpYWJsZXMgbG9jYWwgdG8gb25lIHNvdXJjZSBmaWxlLgorKiBCYXNlZCBWYXJpYWJsZXM6OgkJRm9ydHJhbiBwb2ludGVyIGJhc2VkIHZhcmlhYmxlcy4KKyogUGFyYW1ldGVyczo6CQkJVmFyaWFibGVzIGZvciBhcmd1bWVudHMgdG8gZnVuY3Rpb25zLgorQGVuZCBtZW51CisKK0Bub2RlIFN0YWNrIFZhcmlhYmxlcworQHNlY3Rpb24gQXV0b21hdGljIFZhcmlhYmxlcyBBbGxvY2F0ZWQgb24gdGhlIFN0YWNrCisKK0lmIGEgdmFyaWFibGUncyBzY29wZSBpcyBsb2NhbCB0byBhIGZ1bmN0aW9uIGFuZCBpdHMgbGlmZXRpbWUgaXMgb25seSBhcworbG9uZyBhcyB0aGF0IGZ1bmN0aW9uIGV4ZWN1dGVzIChDIGNhbGxzIHN1Y2ggdmFyaWFibGVzCitAZGZue2F1dG9tYXRpY30pLCBpdCBjYW4gYmUgYWxsb2NhdGVkIGluIGEgcmVnaXN0ZXIgKEBweHJlZntSZWdpc3RlcgorVmFyaWFibGVzfSkgb3Igb24gdGhlIHN0YWNrLgorCitAZmluZGV4IE5fTFNZTSwgZm9yIHN0YWNrIHZhcmlhYmxlcworQGZpbmRleCBDX0xTWU0KK0VhY2ggdmFyaWFibGUgYWxsb2NhdGVkIG9uIHRoZSBzdGFjayBoYXMgYSBzdGFiIHdpdGggdGhlIHN5bWJvbAorZGVzY3JpcHRvciBvbWl0dGVkLiAgU2luY2UgdHlwZSBpbmZvcm1hdGlvbiBzaG91bGQgYmVnaW4gd2l0aCBhIGRpZ2l0LAorQHNhbXB7LX0sIG9yIEBzYW1weyh9LCBvbmx5IHRob3NlIGNoYXJhY3RlcnMgcHJlY2x1ZGVkIGZyb20gYmVpbmcgdXNlZAorZm9yIHN5bWJvbCBkZXNjcmlwdG9ycy4gIEhvd2V2ZXIsIHRoZSBBY29ybiBSSVNDIG1hY2hpbmUgKEFSTSkgaXMgc2FpZAordG8gZ2V0IHRoaXMgd3Jvbmc6IGl0IHB1dHMgb3V0IGEgbWVyZSB0eXBlIGRlZmluaXRpb24gaGVyZSwgd2l0aG91dCB0aGUKK3ByZWNlZGluZyBAc2FtcHtAdmFye3R5cGUtbnVtYmVyfT19LiAgVGhpcyBpcyBhIGJhZCBpZGVhOyB0aGVyZSBpcyBubworZ3VhcmFudGVlIHRoYXQgdHlwZSBkZXNjcmlwdG9ycyBhcmUgZGlzdGluY3QgZnJvbSBzeW1ib2wgZGVzY3JpcHRvcnMuCitTdGFicyBmb3Igc3RhY2sgdmFyaWFibGVzIHVzZSB0aGUgQGNvZGV7Tl9MU1lNfSBzdGFiIHR5cGUsIG9yCitAY29kZXtDX0xTWU19IGZvciBYQ09GRi4KKworVGhlIHZhbHVlIG9mIHRoZSBzdGFiIGlzIHRoZSBvZmZzZXQgb2YgdGhlIHZhcmlhYmxlIHdpdGhpbiB0aGUKK2xvY2FsIHZhcmlhYmxlcy4gIE9uIG1vc3QgbWFjaGluZXMgdGhpcyBpcyBhbiBvZmZzZXQgZnJvbSB0aGUgZnJhbWUKK3BvaW50ZXIgYW5kIGlzIG5lZ2F0aXZlLiAgVGhlIGxvY2F0aW9uIG9mIHRoZSBzdGFiIHNwZWNpZmllcyB3aGljaCBibG9jaworaXQgaXMgZGVmaW5lZCBpbjsgc2VlIEByZWZ7QmxvY2sgU3RydWN0dXJlfS4KKworRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgQyBjb2RlOgorCitAZXhhbXBsZQoraW50CittYWluICgpCitAeworICBpbnQgeDsKK0B9CitAZW5kIGV4YW1wbGUKKworcHJvZHVjZXMgdGhlIGZvbGxvd2luZyBzdGFiczoKKworQGV4YW1wbGUKKy5zdGFicyAibWFpbjpGMSIsMzYsMCwwLF9tYWluICAgIyBAcnszNiBpcyBOX0ZVTn0KKy5zdGFicyAieDoxIiwxMjgsMCwwLC0xMiAgICAgICAgIyBAcnsxMjggaXMgTl9MU1lNfQorLnN0YWJuIDE5MiwwLDAsTEJCMiAgICAgICAgICAgICAjIEByezE5MiBpcyBOX0xCUkFDfQorLnN0YWJuIDIyNCwwLDAsTEJFMiAgICAgICAgICAgICAjIEByezIyNCBpcyBOX1JCUkFDfQorQGVuZCBleGFtcGxlCisKK0B4cmVme1Byb2NlZHVyZXN9IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBAY29kZXtOX0ZVTn0gc3RhYiwgYW5kCitAcmVme0Jsb2NrIFN0cnVjdHVyZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEBjb2Rle05fTEJSQUN9IGFuZAorQGNvZGV7Tl9SQlJBQ30gc3RhYnMuCisKK0Bub2RlIEdsb2JhbCBWYXJpYWJsZXMKK0BzZWN0aW9uIEdsb2JhbCBWYXJpYWJsZXMKKworQGZpbmRleCBOX0dTWU0KK0BmaW5kZXggQ19HU1lNCitAYyBGSVhNRTogdmVyaWZ5IGZvciBzdXJlIHRoYXQgaXQgcmVhbGx5IGlzIENfR1NZTSBvbiBYQ09GRgorQSB2YXJpYWJsZSB3aG9zZSBzY29wZSBpcyBub3Qgc3BlY2lmaWMgdG8ganVzdCBvbmUgc291cmNlIGZpbGUgaXMKK3JlcHJlc2VudGVkIGJ5IHRoZSBAc2FtcHtHfSBzeW1ib2wgZGVzY3JpcHRvci4gIFRoZXNlIHN0YWJzIHVzZSB0aGUKK0Bjb2Rle05fR1NZTX0gc3RhYiB0eXBlIChDX0dTWU0gZm9yIFhDT0ZGKS4gIFRoZSB0eXBlIGluZm9ybWF0aW9uIGZvcgordGhlIHN0YWIgKEBweHJlZntTdHJpbmcgRmllbGR9KSBnaXZlcyB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUuCisKK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHNvdXJjZSBjb2RlOgorCitAZXhhbXBsZQorY2hhciBnX2ZvbyA9ICdjJzsKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK3lpZWxkcyB0aGUgZm9sbG93aW5nIGFzc2VtYmx5IGNvZGU6CisKK0BleGFtcGxlCisuc3RhYnMgImdfZm9vOkcyIiwzMiwwLDAsMCAgICAgIyBAcnszMiBpcyBOX0dTWU19CisgICAgIC5nbG9iYWwgX2dfZm9vCisgICAgIC5kYXRhCitfZ19mb286CisgICAgIC5ieXRlIDk5CitAZW5kIGV4YW1wbGUKKworVGhlIGFkZHJlc3Mgb2YgdGhlIHZhcmlhYmxlIHJlcHJlc2VudGVkIGJ5IHRoZSBAY29kZXtOX0dTWU19IGlzIG5vdAorY29udGFpbmVkIGluIHRoZSBAY29kZXtOX0dTWU19IHN0YWIuICBUaGUgZGVidWdnZXIgZ2V0cyB0aGlzIGluZm9ybWF0aW9uCitmcm9tIHRoZSBleHRlcm5hbCBzeW1ib2wgZm9yIHRoZSBnbG9iYWwgdmFyaWFibGUuICBJbiB0aGUgZXhhbXBsZSBhYm92ZSwKK3RoZSBAY29kZXsuZ2xvYmFsIF9nX2Zvb30gYW5kIEBjb2Rle19nX2Zvbzp9IGxpbmVzIHRlbGwgdGhlIGFzc2VtYmxlciB0bworcHJvZHVjZSBhbiBleHRlcm5hbCBzeW1ib2wuCisKK1NvbWUgY29tcGlsZXJzLCBsaWtlIEdDQywgb3V0cHV0IEBjb2Rle05fR1NZTX0gc3RhYnMgb25seSBvbmNlLCB3aGVyZQordGhlIHZhcmlhYmxlIGlzIGRlZmluZWQuICBPdGhlciBjb21waWxlcnMsIGxpa2UgU3VuT1M0IC9iaW4vY2MsIG91dHB1dCBhCitAY29kZXtOX0dTWU19IHN0YWIgZm9yIGVhY2ggY29tcGlsYXRpb24gdW5pdCB3aGljaCByZWZlcmVuY2VzIHRoZQordmFyaWFibGUuCisKK0Bub2RlIFJlZ2lzdGVyIFZhcmlhYmxlcworQHNlY3Rpb24gUmVnaXN0ZXIgVmFyaWFibGVzCisKK0BmaW5kZXggTl9SU1lNCitAZmluZGV4IENfUlNZTQorQGMgQWNjb3JkaW5nIHRvIGFuIG9sZCB2ZXJzaW9uIG9mIHRoaXMgbWFudWFsLCBBSVggdXNlcyBDX1JQU1lNIGluc3RlYWQKK0BjIG9mIENfUlNZTS4gIEkgYW0gc2tlcHRpY2FsOyB0aGlzIHNob3VsZCBiZSB2ZXJpZmllZC4KK1JlZ2lzdGVyIHZhcmlhYmxlcyBoYXZlIHRoZWlyIG93biBzdGFiIHR5cGUsIEBjb2Rle05fUlNZTX0KKyhAY29kZXtDX1JTWU19IGZvciBYQ09GRiksIGFuZCB0aGVpciBvd24gc3ltYm9sIGRlc2NyaXB0b3IsIEBzYW1we3J9LgorVGhlIHN0YWIncyB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHRoZSByZWdpc3RlciB3aGVyZSB0aGUgdmFyaWFibGUgZGF0YQord2lsbCBiZSBzdG9yZWQuCitAYyAuc3RhYnMgIm5hbWU6dHlwZSIsTl9SU1lNLDAsUmVnU2l6ZSxSZWdOdW1iZXIgKFN1biBkb2MpCisKK0FJWCBkZWZpbmVzIGEgc2VwYXJhdGUgc3ltYm9sIGRlc2NyaXB0b3IgQHNhbXB7ZH0gZm9yIGZsb2F0aW5nIHBvaW50CityZWdpc3RlcnMuICBUaGlzIHNlZW1zIHVubmVjZXNzYXJ5OyB3aHkgbm90IGp1c3QganVzdCBnaXZlIGZsb2F0aW5nCitwb2ludCByZWdpc3RlcnMgZGlmZmVyZW50IHJlZ2lzdGVyIG51bWJlcnM/ICBJIGhhdmUgbm90IHZlcmlmaWVkIHdoZXRoZXIKK3RoZSBjb21waWxlciBhY3R1YWxseSB1c2VzIEBzYW1we2R9LgorCitJZiB0aGUgcmVnaXN0ZXIgaXMgZXhwbGljaXRseSBhbGxvY2F0ZWQgdG8gYSBnbG9iYWwgdmFyaWFibGUsIGJ1dCBub3QKK2luaXRpYWxpemVkLCBhcyBpbjoKKworQGV4YW1wbGUKK3JlZ2lzdGVyIGludCBnX2JhciBhc20gKCIlZzUiKTsKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK3RoZW4gdGhlIHN0YWIgbWF5IGJlIGVtaXR0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgb2JqZWN0IGZpbGUsIHdpdGgKK3RoZSBvdGhlciBic3Mgc3ltYm9scy4KKworQG5vZGUgQ29tbW9uIEJsb2NrcworQHNlY3Rpb24gQ29tbW9uIEJsb2NrcworCitBIGNvbW1vbiBibG9jayBpcyBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHNlY3Rpb24gb2YgbWVtb3J5IHdoaWNoIGNhbiBiZQorcmVmZXJyZWQgdG8gYnkgc2V2ZXJhbCBzb3VyY2UgZmlsZXMuICBJdCBtYXkgY29udGFpbiBzZXZlcmFsIHZhcmlhYmxlcy4KK0kgYmVsaWV2ZSBGb3J0cmFuIGlzIHRoZSBvbmx5IGxhbmd1YWdlIHdpdGggdGhpcyBmZWF0dXJlLgorCitAZmluZGV4IE5fQkNPTU0KK0BmaW5kZXggTl9FQ09NTQorQGZpbmRleCBDX0JDT01NCitAZmluZGV4IENfRUNPTU0KK0EgQGNvZGV7Tl9CQ09NTX0gc3RhYiBiZWdpbnMgYSBjb21tb24gYmxvY2sgYW5kIGFuIEBjb2Rle05fRUNPTU19IHN0YWIKK2VuZHMgaXQuICBUaGUgb25seSBmaWVsZCB0aGF0IGlzIHNpZ25pZmljYW50IGluIHRoZXNlIHR3byBzdGFicyBpcyB0aGUKK3N0cmluZywgd2hpY2ggbmFtZXMgYSBub3JtYWwgKG5vbi1kZWJ1Z2dpbmcpIHN5bWJvbCB0aGF0IGdpdmVzIHRoZQorYWRkcmVzcyBvZiB0aGUgY29tbW9uIGJsb2NrLiAgQWNjb3JkaW5nIHRvIElCTSBkb2N1bWVudGF0aW9uLCBvbmx5IHRoZQorQGNvZGV7Tl9CQ09NTX0gaGFzIHRoZSBuYW1lIG9mIHRoZSBjb21tb24gYmxvY2sgKGV2ZW4gdGhvdWdoIHRoZWlyCitjb21waWxlciBhY3R1YWxseSBwdXRzIGl0IGJvdGggcGxhY2VzKS4KKworQGZpbmRleCBOX0VDT01MCitAZmluZGV4IENfRUNPTUwKK1RoZSBzdGFicyBmb3IgdGhlIG1lbWJlcnMgb2YgdGhlIGNvbW1vbiBibG9jayBhcmUgYmV0d2VlbiB0aGUKK0Bjb2Rle05fQkNPTU19IGFuZCB0aGUgQGNvZGV7Tl9FQ09NTX07IHRoZSB2YWx1ZSBvZiBlYWNoIHN0YWIgaXMgdGhlCitvZmZzZXQgd2l0aGluIHRoZSBjb21tb24gYmxvY2sgb2YgdGhhdCB2YXJpYWJsZS4gIElCTSB1c2VzIHRoZQorQGNvZGV7Q19FQ09NTH0gc3RhYiB0eXBlLCBhbmQgdGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIEBjb2Rle05fRUNPTUx9CitzdGFiIHR5cGUsIGJ1dCBTdW4ncyBGb3J0cmFuIGNvbXBpbGVyIHVzZXMgQGNvZGV7Tl9HU1lNfSBpbnN0ZWFkLiAgVGhlCit2YXJpYWJsZXMgd2l0aGluIGEgY29tbW9uIGJsb2NrIHVzZSB0aGUgQHNhbXB7Vn0gc3ltYm9sIGRlc2NyaXB0b3IgKEkKK2JlbGlldmUgdGhpcyBpcyB0cnVlIG9mIGFsbCBGb3J0cmFuIHZhcmlhYmxlcykuICBPdGhlciBzdGFicyAoYXQgbGVhc3QKK3R5cGUgZGVjbGFyYXRpb25zIHVzaW5nIEBjb2Rle0NfREVDTH0pIGNhbiBhbHNvIGJlIGJldHdlZW4gdGhlCitAY29kZXtOX0JDT01NfSBhbmQgdGhlIEBjb2Rle05fRUNPTU19LgorCitAbm9kZSBTdGF0aWNzCitAc2VjdGlvbiBTdGF0aWMgVmFyaWFibGVzCisKK0luaXRpYWxpemVkIHN0YXRpYyB2YXJpYWJsZXMgYXJlIHJlcHJlc2VudGVkIGJ5IHRoZSBAc2FtcHtTfSBhbmQKK0BzYW1we1Z9IHN5bWJvbCBkZXNjcmlwdG9ycy4gIEBzYW1we1N9IG1lYW5zIGZpbGUgc2NvcGUgc3RhdGljLCBhbmQKK0BzYW1we1Z9IG1lYW5zIHByb2NlZHVyZSBzY29wZSBzdGF0aWMuICBPbmUgZXhjZXB0aW9uOiBpbiBYQ09GRiwgSUJNJ3MKK3hsYyBjb21waWxlciBhbHdheXMgdXNlcyBAc2FtcHtWfSwgYW5kIHdoZXRoZXIgaXQgaXMgZmlsZSBzY29wZSBvciBub3QKK2lzIGRpc3Rpbmd1aXNoZWQgYnkgd2hldGhlciB0aGUgc3RhYiBpcyBsb2NhdGVkIHdpdGhpbiBhIGZ1bmN0aW9uLgorCitAYyBUaGlzIGlzIHByb2JhYmx5IG5vdCB3b3J0aCBtZW50aW9uaW5nOyBpdCBpcyBvbmx5IHRydWUgb24gdGhlIHNwYXJjCitAYyBmb3IgYGRvdWJsZScgdmFyaWFibGVzIHdoaWNoIGFsdGhvdWdoIGRlY2xhcmVkIGNvbnN0IGFyZSBhY3R1YWxseSBpbgorQGMgdGhlIGRhdGEgc2VnbWVudCAodGhlIHRleHQgc2VnbWVudCBjYW4ndCBndWFyYW50ZWUgOCBieXRlIGFsaWdubWVudCkuCitAYyAoYWx0aG91Z2ggR0NDCitAYyAyLjQuNSBoYXMgYSBidWcgaW4gdGhhdCBpdCB1c2VzIEBjb2Rle05fRlVOfSwgc28gbmVpdGhlciBkYnggbm9yIEdEQiBjYW4KK0BjIGZpbmQgdGhlIHZhcmlhYmxlcykKK0BmaW5kZXggTl9TVFNZTQorQGZpbmRleCBOX0xDU1lNCitAZmluZGV4IE5fRlVOLCBmb3IgdmFyaWFibGVzCitAZmluZGV4IE5fUk9TWU0KK0luIGEub3V0IGZpbGVzLCBAY29kZXtOX1NUU1lNfSBtZWFucyB0aGUgZGF0YSBzZWN0aW9uLCBAY29kZXtOX0ZVTn0KK21lYW5zIHRoZSB0ZXh0IHNlY3Rpb24sIGFuZCBAY29kZXtOX0xDU1lNfSBtZWFucyB0aGUgYnNzIHNlY3Rpb24uICBGb3IKK3Rob3NlIHN5c3RlbXMgd2l0aCBhIHJlYWQtb25seSBkYXRhIHNlY3Rpb24gc2VwYXJhdGUgZnJvbSB0aGUgdGV4dAorc2VjdGlvbiAoU29sYXJpcyksIEBjb2Rle05fUk9TWU19IG1lYW5zIHRoZSByZWFkLW9ubHkgZGF0YSBzZWN0aW9uLgorCitGb3IgZXhhbXBsZSwgdGhlIHNvdXJjZSBsaW5lczoKKworQGV4YW1wbGUKK3N0YXRpYyBjb25zdCBpbnQgdmFyX2NvbnN0ID0gNTsKK3N0YXRpYyBpbnQgdmFyX2luaXQgPSAyOworc3RhdGljIGludCB2YXJfbm9pbml0OworQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAoreWllbGQgdGhlIGZvbGxvd2luZyBzdGFiczoKKworQGV4YW1wbGUKKy5zdGFicyAidmFyX2NvbnN0OlMxIiwzNiwwLDAsX3Zhcl9jb25zdCAgICAgICMgQHJ7MzYgaXMgTl9GVU59CitAZG90c3t9Cisuc3RhYnMgInZhcl9pbml0OlMxIiwzOCwwLDAsX3Zhcl9pbml0ICAgICAgICAjIEByezM4IGlzIE5fU1RTWU19CitAZG90c3t9Cisuc3RhYnMgInZhcl9ub2luaXQ6UzEiLDQwLDAsMCxfdmFyX25vaW5pdCAgICAjIEByezQwIGlzIE5fTENTWU19CitAZW5kIGV4YW1wbGUKKworQGZpbmRleCBDX1NUU1lNCitAZmluZGV4IENfQlNUQVQKK0BmaW5kZXggQ19FU1RBVAorSW4gWENPRkYgZmlsZXMsIHRoZSBzdGFiIHR5cGUgbmVlZCBub3QgaW5kaWNhdGUgdGhlIHNlY3Rpb247CitAY29kZXtDX1NUU1lNfSBjYW4gYmUgdXNlZCBmb3IgYWxsIHN0YXRpY3MuICBBbHNvLCBlYWNoIHN0YXRpYyB2YXJpYWJsZQoraXMgZW5jbG9zZWQgaW4gYSBzdGF0aWMgYmxvY2suICBBIEBjb2Rle0NfQlNUQVR9IChlbWl0dGVkIHdpdGggYQorQHNhbXB7LmJzfSBhc3NlbWJsZXIgZGlyZWN0aXZlKSBzeW1ib2wgYmVnaW5zIHRoZSBzdGF0aWMgYmxvY2s7IGl0cwordmFsdWUgaXMgdGhlIHN5bWJvbCBudW1iZXIgb2YgdGhlIGNzZWN0IHN5bWJvbCB3aG9zZSB2YWx1ZSBpcyB0aGUKK2FkZHJlc3Mgb2YgdGhlIHN0YXRpYyBibG9jaywgaXRzIHNlY3Rpb24gaXMgdGhlIHNlY3Rpb24gb2YgdGhlIHZhcmlhYmxlcworaW4gdGhhdCBzdGF0aWMgYmxvY2ssIGFuZCBpdHMgbmFtZSBpcyBAc2FtcHsuYnN9LiAgQSBAY29kZXtDX0VTVEFUfQorKGVtaXR0ZWQgd2l0aCBhIEBzYW1wey5lc30gYXNzZW1ibGVyIGRpcmVjdGl2ZSkgc3ltYm9sIGVuZHMgdGhlIHN0YXRpYworYmxvY2s7IGl0cyBuYW1lIGlzIEBzYW1wey5lc30gYW5kIGl0cyB2YWx1ZSBhbmQgc2VjdGlvbiBhcmUgaWdub3JlZC4KKworSW4gRUNPRkYgZmlsZXMsIHRoZSBzdG9yYWdlIGNsYXNzIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgc2VjdGlvbiwgc28gdGhlCitzdGFiIHR5cGUgbmVlZCBub3QgaW5kaWNhdGUgdGhlIHNlY3Rpb24uCisKK0luIEVMRiBmaWxlcywgZm9yIHRoZSBTdW5QUk8gY29tcGlsZXIgdmVyc2lvbiAyLjAuMSwgc3ltYm9sIGRlc2NyaXB0b3IKK0BzYW1we1N9IG1lYW5zIHRoYXQgdGhlIGFkZHJlc3MgaXMgYWJzb2x1dGUgKHRoZSBsaW5rZXIgcmVsb2NhdGVzIGl0KQorYW5kIHN5bWJvbCBkZXNjcmlwdG9yIEBzYW1we1Z9IG1lYW5zIHRoYXQgdGhlIGFkZHJlc3MgaXMgcmVsYXRpdmUgdG8gdGhlCitzdGFydCBvZiB0aGUgcmVsZXZhbnQgc2VjdGlvbiBmb3IgdGhhdCBjb21waWxhdGlvbiB1bml0LiAgU3VuUFJPIGhhcworcGxhbnMgdG8gaGF2ZSB0aGUgbGlua2VyIHN0b3AgcmVsb2NhdGluZyBzdGFiczsgSSBzdXNwZWN0IHRoYXQgdGhlaXIgdGhlCitkZWJ1Z2dlciBnZXRzIHRoZSBhZGRyZXNzIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgRUxGIChub3Qgc3RhYikgc3ltYm9sLgorSSdtIG5vdCBzdXJlIGhvdyB0byBmaW5kIHdoaWNoIHN5bWJvbCBvZiB0aGF0IG5hbWUgaXMgdGhlIHJpZ2h0IG9uZS4KK1RoZSBjbGVhbiB3YXkgdG8gZG8gYWxsIHRoaXMgd291bGQgYmUgdG8gaGF2ZSBhIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbAorZGVzY3JpcHRvciBAc2FtcHtTfSBzeW1ib2wgYmUgYW4gb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKK2ZpbGUsIGp1c3QgbGlrZSBldmVyeXRoaW5nIGVsc2UsIGJ1dCB0aGF0IGludHJvZHVjZXMgb2J2aW91cworY29tcGF0aWJpbGl0eSBwcm9ibGVtcy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGxpbmtlciBzdGFiIHJlbG9jYXRpb24sCitAeHJlZntFTEYgTGlua2VyIFJlbG9jYXRpb259LgorCitAbm9kZSBCYXNlZCBWYXJpYWJsZXMKK0BzZWN0aW9uIEZvcnRyYW4gQmFzZWQgVmFyaWFibGVzCisKK0ZvcnRyYW4gKGF0IGxlYXN0LCB0aGUgU3VuIGFuZCBTR0kgZGlhbGVjdHMgb2YgRk9SVFJBTi03NykgaGFzIGEgZmVhdHVyZQord2hpY2ggYWxsb3dzIGFsbG9jYXRpbmcgYXJyYXlzIHdpdGggQGNvZGV7bWFsbG9jfSwgYnV0IHdoaWNoIGF2b2lkcworYmx1cnJpbmcgdGhlIGxpbmUgYmV0d2VlbiBhcnJheXMgYW5kIHBvaW50ZXJzIHRoZSB3YXkgdGhhdCBDIGRvZXMuICBJbgorc3RhYnMgc3VjaCBhIHZhcmlhYmxlIHVzZXMgdGhlIEBzYW1we2J9IHN5bWJvbCBkZXNjcmlwdG9yLgorCitGb3IgZXhhbXBsZSwgdGhlIEZvcnRyYW4gZGVjbGFyYXRpb25zCisKK0BleGFtcGxlCityZWFsIGZvbywgZm9vMTAoMTApLCBmb28xMF81KDEwLDUpCitwb2ludGVyIChmb29wLCBmb28pCitwb2ludGVyIChmb28xMHAsIGZvbzEwKQorcG9pbnRlciAoZm9vMTA1cCwgZm9vMTBfNSkKK0BlbmQgZXhhbXBsZQorCitwcm9kdWNlIHRoZSBzdGFicworCitAZXhhbXBsZQorZm9vOmI2Citmb28xMDpiYXIzOzE7MTA7NgorZm9vMTBfNTpiYXIzOzE7NTthcjM7MTsxMDs2CitAZW5kIGV4YW1wbGUKKworSW4gdGhpcyBleGFtcGxlLCBAY29kZXtyZWFsfSBpcyB0eXBlIDYgYW5kIHR5cGUgMyBpcyBhbiBpbnRlZ3JhbCB0eXBlCit3aGljaCBpcyB0aGUgdHlwZSBvZiB0aGUgc3Vic2NyaXB0cyBvZiB0aGUgYXJyYXkgKHByb2JhYmx5CitAY29kZXtpbnRlZ2VyfSkuCisKK1RoZSBAc2FtcHtifSBzeW1ib2wgZGVzY3JpcHRvciBpcyBsaWtlIEBzYW1we1Z9IGluIHRoYXQgaXQgZGVub3RlcyBhCitzdGF0aWNhbGx5IGFsbG9jYXRlZCBzeW1ib2wgd2hvc2Ugc2NvcGUgaXMgbG9jYWwgdG8gYSBmdW5jdGlvbjsgc2VlCitAeHJlZntTdGF0aWNzfS4gIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLCBpbnN0ZWFkIG9mIGJlaW5nIHRoZSBhZGRyZXNzCitvZiB0aGUgdmFyaWFibGUgaXRzZWxmLCBpcyB0aGUgYWRkcmVzcyBvZiBhIHBvaW50ZXIgdG8gdGhhdCB2YXJpYWJsZS4KK1NvIGluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgdmFsdWUgb2YgdGhlIEBjb2Rle2Zvb30gc3RhYiBpcyB0aGUgYWRkcmVzcworb2YgYSBwb2ludGVyIHRvIGEgcmVhbCwgdGhlIHZhbHVlIG9mIHRoZSBAY29kZXtmb28xMH0gc3RhYiBpcyB0aGUKK2FkZHJlc3Mgb2YgYSBwb2ludGVyIHRvIGEgMTAtZWxlbWVudCBhcnJheSBvZiByZWFscywgYW5kIHRoZSB2YWx1ZSBvZgordGhlIEBjb2Rle2ZvbzEwXzV9IHN0YWIgaXMgdGhlIGFkZHJlc3Mgb2YgYSBwb2ludGVyIHRvIGEgNS1lbGVtZW50IGFycmF5CitvZiAxMC1lbGVtZW50IGFycmF5cyBvZiByZWFscy4KKworQG5vZGUgUGFyYW1ldGVycworQHNlY3Rpb24gUGFyYW1ldGVycworCitGb3JtYWwgcGFyYW1ldGVycyB0byBhIGZ1bmN0aW9uIGFyZSByZXByZXNlbnRlZCBieSBhIHN0YWIgKG9yIHNvbWV0aW1lcwordHdvOyBzZWUgYmVsb3cpIGZvciBlYWNoIHBhcmFtZXRlci4gIFRoZSBzdGFicyBhcmUgaW4gdGhlIG9yZGVyIGluIHdoaWNoCit0aGUgZGVidWdnZXIgc2hvdWxkIHByaW50IHRoZSBwYXJhbWV0ZXJzIChpLmUuLCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlCitwYXJhbWV0ZXJzIGFyZSBkZWNsYXJlZCBpbiB0aGUgc291cmNlIGZpbGUpLiAgVGhlIGV4YWN0IGZvcm0gb2YgdGhlIHN0YWIKK2RlcGVuZHMgb24gaG93IHRoZSBwYXJhbWV0ZXIgaXMgYmVpbmcgcGFzc2VkLgorCitAZmluZGV4IE5fUFNZTQorQGZpbmRleCBDX1BTWU0KK1BhcmFtZXRlcnMgcGFzc2VkIG9uIHRoZSBzdGFjayB1c2UgdGhlIHN5bWJvbCBkZXNjcmlwdG9yIEBzYW1we3B9IGFuZAordGhlIEBjb2Rle05fUFNZTX0gc3ltYm9sIHR5cGUgKG9yIEBjb2Rle0NfUFNZTX0gZm9yIFhDT0ZGKS4gIFRoZSB2YWx1ZQorb2YgdGhlIHN5bWJvbCBpcyBhbiBvZmZzZXQgdXNlZCB0byBsb2NhdGUgdGhlIHBhcmFtZXRlciBvbiB0aGUgc3RhY2s7CitpdHMgZXhhY3QgbWVhbmluZyBpcyBtYWNoaW5lLWRlcGVuZGVudCwgYnV0IG9uIG1vc3QgbWFjaGluZXMgaXQgaXMgYW4KK29mZnNldCBmcm9tIHRoZSBmcmFtZSBwb2ludGVyLgorCitBcyBhIHNpbXBsZSBleGFtcGxlLCB0aGUgY29kZToKKworQGV4YW1wbGUKK21haW4gKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICoqYXJndjsKK0BlbmQgZXhhbXBsZQorCitwcm9kdWNlcyB0aGUgc3RhYnM6CisKK0BleGFtcGxlCisuc3RhYnMgIm1haW46RjEiLDM2LDAsMCxfbWFpbiAgICAgICAgICAgICAgICAgIyBAcnszNiBpcyBOX0ZVTn0KKy5zdGFicyAiYXJnYzpwMSIsMTYwLDAsMCw2OCAgICAgICAgICAgICAgICAgICAjIEByezE2MCBpcyBOX1BTWU19Cisuc3RhYnMgImFyZ3Y6cDIwPSoyMT0qMiIsMTYwLDAsMCw3MgorQGVuZCBleGFtcGxlCisKK1RoZSB0eXBlIGRlZmluaXRpb24gb2YgQGNvZGV7YXJndn0gaXMgaW50ZXJlc3RpbmcgYmVjYXVzZSBpdCBjb250YWlucworc2V2ZXJhbCB0eXBlIGRlZmluaXRpb25zLiAgVHlwZSAyMSBpcyBwb2ludGVyIHRvIHR5cGUgMiAoY2hhcikgYW5kCitAY29kZXthcmd2fSAodHlwZSAyMCkgaXMgcG9pbnRlciB0byB0eXBlIDIxLgorCitAYyBGSVhNRTogZmlndXJlIG91dCB3aGF0IHRoZXNlIG1lYW4gYW5kIGRlc2NyaWJlIHRoZW0gY29oZXJlbnRseS4KK1RoZSBmb2xsb3dpbmcgc3ltYm9sIGRlc2NyaXB0b3JzIGFyZSBhbHNvIHNhaWQgdG8gZ28gd2l0aCBAY29kZXtOX1BTWU19LgorVGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgaXMgc2FpZCB0byBiZSBhbiBvZmZzZXQgZnJvbSB0aGUgYXJndW1lbnQKK3BvaW50ZXIgKEknbSBub3Qgc3VyZSB3aGV0aGVyIHRoaXMgaXMgdHJ1ZSBvciBub3QpLgorCitAZXhhbXBsZQorcFAgKDw8Pz8+PikKK3BGIEZvcnRyYW4gZnVuY3Rpb24gcGFyYW1ldGVyCitYICAoZnVuY3Rpb24gcmVzdWx0IHZhcmlhYmxlKQorQGVuZCBleGFtcGxlCisKK0BtZW51CisqIFJlZ2lzdGVyIFBhcmFtZXRlcnM6OgorKiBMb2NhbCBWYXJpYWJsZSBQYXJhbWV0ZXJzOjoKKyogUmVmZXJlbmNlIFBhcmFtZXRlcnM6OgorKiBDb25mb3JtYW50IEFycmF5czo6CitAZW5kIG1lbnUKKworQG5vZGUgUmVnaXN0ZXIgUGFyYW1ldGVycworQHN1YnNlY3Rpb24gUGFzc2luZyBQYXJhbWV0ZXJzIGluIFJlZ2lzdGVycworCitJZiB0aGUgcGFyYW1ldGVyIGlzIHBhc3NlZCBpbiBhIHJlZ2lzdGVyLCB0aGVuIHRyYWRpdGlvbmFsbHkgdGhlcmUgYXJlCit0d28gc3ltYm9scyBmb3IgZWFjaCBhcmd1bWVudDoKKworQGV4YW1wbGUKKy5zdGFicyAiYXJnOnAxIiAuIC4gLiAgICAgICA7IE5fUFNZTQorLnN0YWJzICJhcmc6cjEiIC4gLiAuICAgICAgIDsgTl9SU1lNCitAZW5kIGV4YW1wbGUKKworRGVidWdnZXJzIHVzZSB0aGUgc2Vjb25kIG9uZSB0byBmaW5kIHRoZSB2YWx1ZSwgYW5kIHRoZSBmaXJzdCBvbmUgdG8KK2tub3cgdGhhdCBpdCBpcyBhbiBhcmd1bWVudC4KKworQGZpbmRleCBDX1JQU1lNCitAZmluZGV4IE5fUlNZTSwgZm9yIHBhcmFtZXRlcnMKK0JlY2F1c2UgdGhhdCBhcHByb2FjaCBpcyBraW5kIG9mIHVnbHksIHNvbWUgY29tcGlsZXJzIHVzZSBzeW1ib2wKK2Rlc2NyaXB0b3IgQHNhbXB7UH0gb3IgQHNhbXB7Un0gdG8gaW5kaWNhdGUgYW4gYXJndW1lbnQgd2hpY2ggaXMgaW4gYQorcmVnaXN0ZXIuICBTeW1ib2wgdHlwZSBAY29kZXtDX1JQU1lNfSBpcyB1c2VkIGluIFhDT0ZGIGFuZCBAY29kZXtOX1JTWU19CitpcyB1c2VkIG90aGVyd2lzZS4gIFRoZSBzeW1ib2wncyB2YWx1ZSBpcyB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAgQHNhbXB7UH0KK2FuZCBAc2FtcHtSfSBtZWFuIHRoZSBzYW1lIHRoaW5nOyB0aGUgZGlmZmVyZW5jZSBpcyB0aGF0IEBzYW1we1B9IGlzIGEKK0dOVSBpbnZlbnRpb24gYW5kIEBzYW1we1J9IGlzIGFuIElCTSAoWENPRkYpIGludmVudGlvbi4gIEFzIG9mIHZlcnNpb24KKzQuOSwgR0RCIHNob3VsZCBoYW5kbGUgZWl0aGVyIG9uZS4KKworVGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2Ugd2hlcmUgR0NDIHVzZXMgYSBAc2FtcHtwfSBhbmQgQHNhbXB7cn0gcGFpcgorcmF0aGVyIHRoYW4gQHNhbXB7UH07IHRoaXMgaXMgd2hlcmUgdGhlIGFyZ3VtZW50IGlzIHBhc3NlZCBpbiB0aGUKK2FyZ3VtZW50IGxpc3QgYW5kIHRoZW4gbG9hZGVkIGludG8gYSByZWdpc3Rlci4KKworQWNjb3JkaW5nIHRvIHRoZSBBSVggZG9jdW1lbnRhdGlvbiwgc3ltYm9sIGRlc2NyaXB0b3IgQHNhbXB7RH0gaXMgZm9yIGEKK3BhcmFtZXRlciBwYXNzZWQgaW4gYSBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gIFRoaXMgc2VlbXMKK3VubmVjZXNzYXJ5LS0td2h5IG5vdCBqdXN0IHVzZSBAc2FtcHtSfSB3aXRoIGEgcmVnaXN0ZXIgbnVtYmVyIHdoaWNoCitpbmRpY2F0ZXMgdGhhdCBpdCdzIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXI/ICBJIGhhdmVuJ3QgdmVyaWZpZWQKK3doZXRoZXIgdGhlIHN5c3RlbSBhY3R1YWxseSBkb2VzIHdoYXQgdGhlIGRvY3VtZW50YXRpb24gaW5kaWNhdGVzLgorCitAYyBGSVhNRTogT24gdGhlIGhwcGEgdGhpcyBpcyBmb3IgYW55IHR5cGUgPiA4IGJ5dGVzLCBJIHRoaW5rLCBhbmQgbm90CitAYyBmb3Igc21hbGwgc3RydWN0dXJlcyAoaW52ZXN0aWdhdGUpLgorT24gdGhlIHNwYXJjIGFuZCBocHBhLCBmb3IgYSBAc2FtcHtQfSBzeW1ib2wgd2hvc2UgdHlwZSBpcyBhIHN0cnVjdHVyZQorb3IgdW5pb24sIHRoZSByZWdpc3RlciBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RydWN0dXJlLiAgT24gdGhlCitzcGFyYywgdGhpcyBpcyBhbHNvIHRydWUgb2YgYSBAc2FtcHtwfSBhbmQgQHNhbXB7cn0gcGFpciAodXNpbmcgU3VuCitAY29kZXtjY30pIG9yIGEgQHNhbXB7cH0gc3ltYm9sLiAgSG93ZXZlciwgaWYgYSAoc21hbGwpIHN0cnVjdHVyZSBpcworcmVhbGx5IGluIGEgcmVnaXN0ZXIsIEBzYW1we3J9IGlzIHVzZWQuICBBbmQsIHRvIHRvcCBpdCBhbGwgb2ZmLCBvbiB0aGUKK2hwcGEgaXQgbWlnaHQgYmUgYSBzdHJ1Y3R1cmUgd2hpY2ggd2FzIHBhc3NlZCBvbiB0aGUgc3RhY2sgYW5kIGxvYWRlZAoraW50byBhIHJlZ2lzdGVyIGFuZCBmb3Igd2hpY2ggdGhlcmUgaXMgYSBAc2FtcHtwfSBhbmQgQHNhbXB7cn0gcGFpciEgIEkKK2JlbGlldmUgdGhhdCBzeW1ib2wgZGVzY3JpcHRvciBAc2FtcHtpfSBpcyBzdXBwb3NlZCB0byBkZWFsIHdpdGggdGhpcworY2FzZSAoaXQgaXMgc2FpZCB0byBtZWFuICJ2YWx1ZSBwYXJhbWV0ZXIgYnkgcmVmZXJlbmNlLCBpbmRpcmVjdAorYWNjZXNzIjsgSSBkb24ndCBrbm93IHRoZSBzb3VyY2UgZm9yIHRoaXMgaW5mb3JtYXRpb24pLCBidXQgSSBkb24ndCBrbm93CitkZXRhaWxzIG9yIHdoYXQgY29tcGlsZXJzIG9yIGRlYnVnZ2VycyB1c2UgaXQsIGlmIGFueSAobm90IEdEQiBvciBHQ0MpLgorSXQgaXMgbm90IGNsZWFyIHRvIG1lIHdoZXRoZXIgdGhpcyBjYXNlIG5lZWRzIHRvIGJlIGRlYWx0IHdpdGgKK2RpZmZlcmVudGx5IHRoYW4gcGFyYW1ldGVycyBwYXNzZWQgYnkgcmVmZXJlbmNlIChAcHhyZWZ7UmVmZXJlbmNlIFBhcmFtZXRlcnN9KS4KKworQG5vZGUgTG9jYWwgVmFyaWFibGUgUGFyYW1ldGVycworQHN1YnNlY3Rpb24gU3RvcmluZyBQYXJhbWV0ZXJzIGFzIExvY2FsIFZhcmlhYmxlcworCitUaGVyZSBpcyBhIGNhc2Ugc2ltaWxhciB0byBhbiBhcmd1bWVudCBpbiBhIHJlZ2lzdGVyLCB3aGljaCBpcyBhbgorYXJndW1lbnQgdGhhdCBpcyBhY3R1YWxseSBzdG9yZWQgYXMgYSBsb2NhbCB2YXJpYWJsZS4gIFNvbWV0aW1lcyB0aGlzCitoYXBwZW5zIHdoZW4gdGhlIGFyZ3VtZW50IHdhcyBwYXNzZWQgaW4gYSByZWdpc3RlciBhbmQgdGhlbiB0aGUgY29tcGlsZXIKK3N0b3JlcyBpdCBhcyBhIGxvY2FsIHZhcmlhYmxlLiAgSWYgcG9zc2libGUsIHRoZSBjb21waWxlciBzaG91bGQgY2xhaW0KK3RoYXQgaXQncyBpbiBhIHJlZ2lzdGVyLCBidXQgdGhpcyBpc24ndCBhbHdheXMgZG9uZS4KKworSWYgYSBwYXJhbWV0ZXIgaXMgcGFzc2VkIGFzIG9uZSB0eXBlIGFuZCBjb252ZXJ0ZWQgdG8gYSBzbWFsbGVyIHR5cGUgYnkKK3RoZSBwcm9sb2d1ZSAoZm9yIGV4YW1wbGUsIHRoZSBwYXJhbWV0ZXIgaXMgZGVjbGFyZWQgYXMgYSBAY29kZXtmbG9hdH0sCitidXQgdGhlIGNhbGxpbmcgY29udmVudGlvbnMgc3BlY2lmeSB0aGF0IGl0IGlzIHBhc3NlZCBhcyBhCitAY29kZXtkb3VibGV9KSwgdGhlbiBHQ0MyIChzb21ldGltZXMpIHVzZXMgYSBwYWlyIG9mIHN5bWJvbHMuICBUaGUgZmlyc3QKK3N5bWJvbCB1c2VzIHN5bWJvbCBkZXNjcmlwdG9yIEBzYW1we3B9IGFuZCB0aGUgdHlwZSB3aGljaCBpcyBwYXNzZWQuCitUaGUgc2Vjb25kIHN5bWJvbCBoYXMgdGhlIHR5cGUgYW5kIGxvY2F0aW9uIHdoaWNoIHRoZSBwYXJhbWV0ZXIgYWN0dWFsbHkKK2hhcyBhZnRlciB0aGUgcHJvbG9ndWUuICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB0aGUgZm9sbG93aW5nIEMgY29kZQorYXBwZWFycyB3aXRoIG5vIHByb3RvdHlwZXMgaW52b2x2ZWQ6CisKK0BleGFtcGxlCit2b2lkCitzdWJyIChmKQorICAgICBmbG9hdCBmOworQHsKK0BlbmQgZXhhbXBsZQorCitpZiBAY29kZXtmfSBpcyBwYXNzZWQgYXMgYSBkb3VibGUgYXQgc3RhY2sgb2Zmc2V0IDgsIGFuZCB0aGUgcHJvbG9ndWUKK2NvbnZlcnRzIGl0IHRvIGEgZmxvYXQgaW4gcmVnaXN0ZXIgbnVtYmVyIDAsIHRoZW4gdGhlIHN0YWJzIGxvb2sgbGlrZToKKworQGV4YW1wbGUKKy5zdGFicyAiZjpwMTMiLDE2MCwwLDMsOCAgICMgQHJ7MTYwIGlzIEBjb2Rle05fUFNZTX0sIGhlcmUgMTMgaXMgQGNvZGV7ZG91YmxlfX0KKy5zdGFicyAiZjpyMTIiLDY0LDAsMywwICAgICMgQHJ7NjQgaXMgQGNvZGV7Tl9SU1lNfSwgaGVyZSAxMiBpcyBAY29kZXtmbG9hdH19CitAZW5kIGV4YW1wbGUKKworSW4gYm90aCBzdGFicyAzIGlzIHRoZSBsaW5lIG51bWJlciB3aGVyZSBAY29kZXtmfSBpcyBkZWNsYXJlZAorKEBweHJlZntMaW5lIE51bWJlcnN9KS4KKworQGZpbmRleCBOX0xTWU0sIGZvciBwYXJhbWV0ZXIKK0dDQywgYXQgbGVhc3Qgb24gdGhlIDk2MCwgaGFzIGFub3RoZXIgc29sdXRpb24gdG8gdGhlIHNhbWUgcHJvYmxlbS4gIEl0Cit1c2VzIGEgc2luZ2xlIEBzYW1we3B9IHN5bWJvbCBkZXNjcmlwdG9yIGZvciBhbiBhcmd1bWVudCB3aGljaCBpcyBzdG9yZWQKK2FzIGEgbG9jYWwgdmFyaWFibGUgYnV0IHVzZXMgQGNvZGV7Tl9MU1lNfSBpbnN0ZWFkIG9mIEBjb2Rle05fUFNZTX0uICBJbgordGhpcyBjYXNlLCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBpcyBhbiBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGxvY2FsCit2YXJpYWJsZXMgZm9yIHRoYXQgZnVuY3Rpb24sIG5vdCByZWxhdGl2ZSB0byB0aGUgYXJndW1lbnRzOyBvbiBzb21lCittYWNoaW5lcyB0aG9zZSBhcmUgdGhlIHNhbWUgdGhpbmcsIGJ1dCBub3Qgb24gYWxsLgorCitAYyBUaGlzIGlzIG1vc3RseSBqdXN0IGJhY2tncm91bmQgaW5mbzsgdGhlIHBhcnQgdGhhdCBsb2dpY2FsbHkgYmVsb25ncworQGMgaGVyZSBpcyB0aGUgbGFzdCBzZW50ZW5jZS4gIAorT24gdGhlIFZBWCBvciBvbiBvdGhlciBtYWNoaW5lcyBpbiB3aGljaCB0aGUgY2FsbGluZyBjb252ZW50aW9uIGluY2x1ZGVzCit0aGUgbnVtYmVyIG9mIHdvcmRzIG9mIGFyZ3VtZW50cyBhY3R1YWxseSBwYXNzZWQsIHRoZSBkZWJ1Z2dlciAoR0RCIGF0CitsZWFzdCkgdXNlcyB0aGUgcGFyYW1ldGVyIHN5bWJvbHMgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIGl0IG5lZWRzIHRvCitwcmludCBuYW1lbGVzcyBhcmd1bWVudHMgaW4gYWRkaXRpb24gdG8gdGhlIGZvcm1hbCBwYXJhbWV0ZXJzIHdoaWNoIGl0CitoYXMgcHJpbnRlZCBiZWNhdXNlIGVhY2ggb25lIGhhcyBhIHN0YWIuICBGb3IgZXhhbXBsZSwgaW4gCisKK0BleGFtcGxlCitleHRlcm4gaW50IGZwcmludGYgKEZJTEUgKnN0cmVhbSwgY2hhciAqZm9ybWF0LCBAZG90c3t9KTsKK0Bkb3Rze30KK2ZwcmludGYgKHN0ZG91dCwgIiVkXG4iLCB4KTsKK0BlbmQgZXhhbXBsZQorCit0aGVyZSBhcmUgc3RhYnMgZm9yIEBjb2Rle3N0cmVhbX0gYW5kIEBjb2Rle2Zvcm1hdH0uICBPbiBtb3N0IG1hY2hpbmVzLAordGhlIGRlYnVnZ2VyIGNhbiBvbmx5IHByaW50IHRob3NlIHR3byBhcmd1bWVudHMgKGJlY2F1c2UgaXQgaGFzIG5vIHdheQorb2Yga25vd2luZyB0aGF0IGFkZGl0aW9uYWwgYXJndW1lbnRzIHdlcmUgcGFzc2VkKSwgYnV0IG9uIHRoZSBWQVggb3IKK290aGVyIG1hY2hpbmVzIHdpdGggYSBjYWxsaW5nIGNvbnZlbnRpb24gd2hpY2ggaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YKK3dvcmRzIG9mIGFyZ3VtZW50cywgdGhlIGRlYnVnZ2VyIGNhbiBwcmludCBhbGwgdGhyZWUgYXJndW1lbnRzLiAgVG8gZG8KK3NvLCB0aGUgcGFyYW1ldGVyIHN5bWJvbCAoc3ltYm9sIGRlc2NyaXB0b3IgQHNhbXB7cH0pIChub3QgbmVjZXNzYXJpbHkKK0BzYW1we3J9IG9yIHN5bWJvbCBkZXNjcmlwdG9yIG9taXR0ZWQgc3ltYm9scykgbmVlZHMgdG8gY29udGFpbiB0aGUKK2FjdHVhbCB0eXBlIGFzIHBhc3NlZCAoZm9yIGV4YW1wbGUsIEBjb2Rle2RvdWJsZX0gbm90IEBjb2Rle2Zsb2F0fSBpZiBpdAoraXMgcGFzc2VkIGFzIGEgZG91YmxlIGFuZCBjb252ZXJ0ZWQgdG8gYSBmbG9hdCkuCisKK0Bub2RlIFJlZmVyZW5jZSBQYXJhbWV0ZXJzCitAc3Vic2VjdGlvbiBQYXNzaW5nIFBhcmFtZXRlcnMgYnkgUmVmZXJlbmNlCisKK0lmIHRoZSBwYXJhbWV0ZXIgaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZSAoZS5nLiwgUGFzY2FsIEBjb2Rle1ZBUn0KK3BhcmFtZXRlcnMpLCB0aGVuIHRoZSBzeW1ib2wgZGVzY3JpcHRvciBpcyBAc2FtcHt2fSBpZiBpdCBpcyBpbiB0aGUKK2FyZ3VtZW50IGxpc3QsIG9yIEBzYW1we2F9IGlmIGl0IGluIGEgcmVnaXN0ZXIuICBPdGhlciB0aGFuIHRoZSBmYWN0Cit0aGF0IHRoZXNlIGNvbnRhaW4gdGhlIGFkZHJlc3Mgb2YgdGhlIHBhcmFtZXRlciByYXRoZXIgdGhhbiB0aGUKK3BhcmFtZXRlciBpdHNlbGYsIHRoZXkgYXJlIGlkZW50aWNhbCB0byBAc2FtcHtwfSBhbmQgQHNhbXB7Un0sCityZXNwZWN0aXZlbHkuICBJIGJlbGlldmUgQHNhbXB7YX0gaXMgYW4gQUlYIGludmVudGlvbjsgQHNhbXB7dn0gaXMKK3N1cHBvcnRlZCBieSBhbGwgc3RhYnMtdXNpbmcgc3lzdGVtcyBhcyBmYXIgYXMgSSBrbm93LgorCitAbm9kZSBDb25mb3JtYW50IEFycmF5cworQHN1YnNlY3Rpb24gUGFzc2luZyBDb25mb3JtYW50IEFycmF5IFBhcmFtZXRlcnMKKworQGMgSXMgdGhpcyBwYXJhZ3JhcGggY29ycmVjdD8gIEl0IGlzIGJhc2VkIG9uIHBpZWNpbmcgdG9nZXRoZXIgcGF0Y2h5CitAYyBpbmZvcm1hdGlvbiBhbmQgc29tZSBndWVzc3dvcmsKK0NvbmZvcm1hbnQgYXJyYXlzIGFyZSBhIGZlYXR1cmUgb2YgTW9kdWxhLTIsIGFuZCBwZXJoYXBzIG90aGVyCitsYW5ndWFnZXMsIGluIHdoaWNoIHRoZSBzaXplIG9mIGFuIGFycmF5IHBhcmFtZXRlciBpcyBub3Qga25vd24gdG8gdGhlCitjYWxsZWQgZnVuY3Rpb24gdW50aWwgcnVuLXRpbWUuICBTdWNoIHBhcmFtZXRlcnMgaGF2ZSB0d28gc3RhYnM6IGEKK0BzYW1we3h9IGZvciB0aGUgYXJyYXkgaXRzZWxmLCBhbmQgYSBAc2FtcHtDfSwgd2hpY2ggcmVwcmVzZW50cyB0aGUgc2l6ZQorb2YgdGhlIGFycmF5LiAgVGhlIHZhbHVlIG9mIHRoZSBAc2FtcHt4fSBzdGFiIGlzIHRoZSBvZmZzZXQgaW4gdGhlCithcmd1bWVudCBsaXN0IHdoZXJlIHRoZSBhZGRyZXNzIG9mIHRoZSBhcnJheSBpcyBzdG9yZWQgKGl0IHRoaXMgcmlnaHQ/CitpdCBpcyBhIGd1ZXNzKTsgdGhlIHZhbHVlIG9mIHRoZSBAc2FtcHtDfSBzdGFiIGlzIHRoZSBvZmZzZXQgaW4gdGhlCithcmd1bWVudCBsaXN0IHdoZXJlIHRoZSBzaXplIG9mIHRoZSBhcnJheSAoaW4gZWxlbWVudHM/IGluIGJ5dGVzPykgaXMKK3N0b3JlZC4KKworQG5vZGUgVHlwZXMKK0BjaGFwdGVyIERlZmluaW5nIFR5cGVzCisKK1RoZSBleGFtcGxlcyBzbyBmYXIgaGF2ZSBkZXNjcmliZWQgdHlwZXMgYXMgcmVmZXJlbmNlcyB0byBwcmV2aW91c2x5CitkZWZpbmVkIHR5cGVzLCBvciBkZWZpbmVkIGluIHRlcm1zIG9mIHN1YnJhbmdlcyBvZiBvciBwb2ludGVycyB0bworcHJldmlvdXNseSBkZWZpbmVkIHR5cGVzLiAgVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyB0aGUgb3RoZXIgdHlwZQorZGVzY3JpcHRvcnMgdGhhdCBtYXkgZm9sbG93IHRoZSBAc2FtcHs9fSBpbiBhIHR5cGUgZGVmaW5pdGlvbi4KKworQG1lbnUKKyogQnVpbHRpbiBUeXBlczo6CQlJbnRlZ2VycywgZmxvYXRpbmcgcG9pbnQsIHZvaWQsIGV0Yy4KKyogTWlzY2VsbGFuZW91cyBUeXBlczo6CQlQb2ludGVycywgc2V0cywgZmlsZXMsIGV0Yy4KKyogQ3Jvc3MtUmVmZXJlbmNlczo6CQlSZWZlcnJpbmcgdG8gYSB0eXBlIG5vdCB5ZXQgZGVmaW5lZC4KKyogU3VicmFuZ2VzOjoJCQlBIHR5cGUgd2l0aCBhIHNwZWNpZmljIHJhbmdlLgorKiBBcnJheXM6OgkJCUFuIGFnZ3JlZ2F0ZSB0eXBlIG9mIHNhbWUtdHlwZWQgZWxlbWVudHMuCisqIFN0cmluZ3M6OgkJCUxpa2UgYW4gYXJyYXkgYnV0IGFsc28gaGFzIGEgbGVuZ3RoLgorKiBFbnVtZXJhdGlvbnM6OgkJTGlrZSBhbiBpbnRlZ2VyIGJ1dCB0aGUgdmFsdWVzIGhhdmUgbmFtZXMuCisqIFN0cnVjdHVyZXM6OgkJCUFuIGFnZ3JlZ2F0ZSB0eXBlIG9mIGRpZmZlcmVudC10eXBlZCBlbGVtZW50cy4KKyogVHlwZWRlZnM6OgkJCUdpdmluZyBhIHR5cGUgYSBuYW1lLgorKiBVbmlvbnM6OgkJCURpZmZlcmVudCB0eXBlcyBzaGFyaW5nIHN0b3JhZ2UuCisqIEZ1bmN0aW9uIFR5cGVzOjoKK0BlbmQgbWVudQorCitAbm9kZSBCdWlsdGluIFR5cGVzCitAc2VjdGlvbiBCdWlsdGluIFR5cGVzCisKK0NlcnRhaW4gdHlwZXMgYXJlIGJ1aWx0IGluIChAY29kZXtpbnR9LCBAY29kZXtzaG9ydH0sIEBjb2Rle3ZvaWR9LAorQGNvZGV7ZmxvYXR9LCBldGMuKTsgdGhlIGRlYnVnZ2VyIHJlY29nbml6ZXMgdGhlc2UgdHlwZXMgYW5kIGtub3dzIGhvdwordG8gaGFuZGxlIHRoZW0uICBUaHVzLCBkb24ndCBiZSBzdXJwcmlzZWQgaWYgc29tZSBvZiB0aGUgZm9sbG93aW5nIHdheXMKK29mIHNwZWNpZnlpbmcgYnVpbHRpbiB0eXBlcyBkbyBub3Qgc3BlY2lmeSBldmVyeXRoaW5nIHRoYXQgYSBkZWJ1Z2dlcgord291bGQgbmVlZCB0byBrbm93IGFib3V0IHRoZSB0eXBlLS0taW4gc29tZSBjYXNlcyB0aGV5IG1lcmVseSBzcGVjaWZ5Citlbm91Z2ggaW5mb3JtYXRpb24gdG8gZGlzdGluZ3Vpc2ggdGhlIHR5cGUgZnJvbSBvdGhlciB0eXBlcy4KKworVGhlIHRyYWRpdGlvbmFsIHdheSB0byBkZWZpbmUgYnVpbHRpbiB0eXBlcyBpcyBjb252b2x1bnRlZCwgc28gbmV3IHdheXMKK2hhdmUgYmVlbiBpbnZlbnRlZCB0byBkZXNjcmliZSB0aGVtLiAgU3VuJ3MgQGNvZGV7YWNjfSB1c2VzIHNwZWNpYWwKK2J1aWx0aW4gdHlwZSBkZXNjcmlwdG9ycyAoQHNhbXB7Yn0gYW5kIEBzYW1we1J9KSwgYW5kIElCTSB1c2VzIG5lZ2F0aXZlCit0eXBlIG51bWJlcnMuICBHREIgYWNjZXB0cyBhbGwgdGhyZWUgd2F5cywgYXMgb2YgdmVyc2lvbiA0Ljg7IGRieCBqdXN0CithY2NlcHRzIHRoZSB0cmFkaXRpb25hbCBidWlsdGluIHR5cGVzIGFuZCBwZXJoYXBzIG9uZSBvZiB0aGUgb3RoZXIgdHdvCitmb3JtYXRzLiAgVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBkZXNjcmliZSBlYWNoIG9mIHRoZXNlIGZvcm1hdHMuCisKK0BtZW51CisqIFRyYWRpdGlvbmFsIEJ1aWx0aW4gVHlwZXM6OglQdXQgb24geW91ciBzZWF0YmVsdHMgYW5kIHByZXBhcmUgZm9yIGtsdWRnZXJ5CisqIEJ1aWx0aW4gVHlwZSBEZXNjcmlwdG9yczo6CUJ1aWx0aW4gdHlwZXMgd2l0aCBzcGVjaWFsIHR5cGUgZGVzY3JpcHRvcnMKKyogTmVnYXRpdmUgVHlwZSBOdW1iZXJzOjoJQnVpbHRpbiB0eXBlcyB1c2luZyBuZWdhdGl2ZSB0eXBlIG51bWJlcnMKK0BlbmQgbWVudQorCitAbm9kZSBUcmFkaXRpb25hbCBCdWlsdGluIFR5cGVzCitAc3Vic2VjdGlvbiBUcmFkaXRpb25hbCBCdWlsdGluIFR5cGVzCisKK1RoaXMgaXMgdGhlIHRyYWRpdGlvbmFsLCBjb252b2x1dGVkIG1ldGhvZCBmb3IgZGVmaW5pbmcgYnVpbHRpbiB0eXBlcy4KK1RoZXJlIGFyZSBzZXZlcmFsIGNsYXNzZXMgb2Ygc3VjaCB0eXBlIGRlZmluaXRpb25zOiBpbnRlZ2VyLCBmbG9hdGluZworcG9pbnQsIGFuZCBAY29kZXt2b2lkfS4KKworQG1lbnUKKyogVHJhZGl0aW9uYWwgSW50ZWdlciBUeXBlczo6CisqIFRyYWRpdGlvbmFsIE90aGVyIFR5cGVzOjoKK0BlbmQgbWVudQorCitAbm9kZSBUcmFkaXRpb25hbCBJbnRlZ2VyIFR5cGVzCitAc3Vic3Vic2VjdGlvbiBUcmFkaXRpb25hbCBJbnRlZ2VyIFR5cGVzCisKK09mdGVuIHR5cGVzIGFyZSBkZWZpbmVkIGFzIHN1YnJhbmdlcyBvZiB0aGVtc2VsdmVzLiAgSWYgdGhlIGJvdW5kaW5nIHZhbHVlcworZml0IHdpdGhpbiBhbiBAY29kZXtpbnR9LCB0aGVuIHRoZXkgYXJlIGdpdmVuIG5vcm1hbGx5LiAgRm9yIGV4YW1wbGU6CisKK0BleGFtcGxlCisuc3RhYnMgImludDp0MT1yMTstMjE0NzQ4MzY0ODsyMTQ3NDgzNjQ3OyIsMTI4LDAsMCwwICAgICMgQHJ7MTI4IGlzIE5fTFNZTX0KKy5zdGFicyAiY2hhcjp0Mj1yMjswOzEyNzsiLDEyOCwwLDAsMAorQGVuZCBleGFtcGxlCisKK0J1aWx0aW4gdHlwZXMgY2FuIGFsc28gYmUgZGVzY3JpYmVkIGFzIHN1YnJhbmdlcyBvZiBAY29kZXtpbnR9OgorCitAZXhhbXBsZQorLnN0YWJzICJ1bnNpZ25lZCBzaG9ydDp0Nj1yMTswOzY1NTM1OyIsMTI4LDAsMCwwCitAZW5kIGV4YW1wbGUKKworSWYgdGhlIGxvd2VyIGJvdW5kIG9mIGEgc3VicmFuZ2UgaXMgMCBhbmQgdGhlIHVwcGVyIGJvdW5kIGlzIC0xLAordGhlIHR5cGUgaXMgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSB3aG9zZSBib3VuZHMgYXJlIHRvbworYmlnIHRvIGRlc2NyaWJlIGluIGFuIEBjb2Rle2ludH0uICBUcmFkaXRpb25hbGx5IHRoaXMgaXMgb25seSB1c2VkIGZvcgorQGNvZGV7dW5zaWduZWQgaW50fSBhbmQgQGNvZGV7dW5zaWduZWQgbG9uZ306CisKK0BleGFtcGxlCisuc3RhYnMgInVuc2lnbmVkIGludDp0ND1yMTswOy0xOyIsMTI4LDAsMCwwCitAZW5kIGV4YW1wbGUKKworRm9yIGxhcmdlciB0eXBlcywgR0NDIDIuNC41IHB1dHMgb3V0IGJvdW5kcyBpbiBvY3RhbCwgd2l0aCBvbmUgb3IgbW9yZQorbGVhZGluZyB6ZXJvZXMuICBJbiB0aGlzIGNhc2UgYSBuZWdhdGl2ZSBib3VuZCBjb25zaXN0cyBvZiBhIG51bWJlcgord2hpY2ggaXMgYSAxIGJpdCAoZm9yIHRoZSBzaWduIGJpdCkgZm9sbG93ZWQgYnkgYSAwIGJpdCBmb3IgZWFjaCBiaXQgaW4KK3RoZSBudW1iZXIgKGV4Y2VwdCB0aGUgc2lnbiBiaXQpLCBhbmQgYSBwb3NpdGl2ZSBib3VuZCBpcyBvbmUgd2hpY2ggaXMgYQorMSBiaXQgZm9yIGVhY2ggYml0IGluIHRoZSBudW1iZXIgKGV4Y2VwdCBwb3NzaWJseSB0aGUgc2lnbiBiaXQpLiAgQWxsCitrbm93biB2ZXJzaW9ucyBvZiBkYnggYW5kIEdEQiB2ZXJzaW9uIDQgYWNjZXB0IHRoaXMgKGF0IGxlYXN0IGluIHRoZQorc2Vuc2Ugb2Ygbm90IHJlZnVzaW5nIHRvIHByb2Nlc3MgdGhlIGZpbGUpLCBidXQgR0RCIDMuNSByZWZ1c2VzIHRvIHJlYWQKK3RoZSB3aG9sZSBmaWxlIGNvbnRhaW5pbmcgc3VjaCBzeW1ib2xzLiAgU28gR0NDIDIuMy4zIGRpZCBub3Qgb3V0cHV0IHRoZQorcHJvcGVyIHNpemUgZm9yIHRoZXNlIHR5cGVzLiAgQXMgYW4gZXhhbXBsZSBvZiBvY3RhbCBib3VuZHMsIHRoZSBzdHJpbmcKK2ZpZWxkcyBvZiB0aGUgc3RhYnMgZm9yIDY0IGJpdCBpbnRlZ2VyIHR5cGVzIGxvb2sgbGlrZToKKworQGMgLnN0YWJzIGRpcmVjdGl2ZXMsIGV0Yy4sIG9taXR0ZWQgdG8gbWFrZSBpdCBmaXQgb24gdGhlIHBhZ2UuCitAZXhhbXBsZQorbG9uZyBpbnQ6dDM9cjE7MDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwOzAwMDc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzsKK2xvbmcgdW5zaWduZWQgaW50OnQ1PXIxOzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDswMDE3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7CitAZW5kIGV4YW1wbGUKKworSWYgdGhlIGxvd2VyIGJvdW5kIG9mIGEgc3VicmFuZ2UgaXMgMCBhbmQgdGhlIHVwcGVyIGJvdW5kIGlzIG5lZ2F0aXZlLAordGhlIHR5cGUgaXMgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSB3aG9zZSBzaXplIGluIGJ5dGVzIGlzIHRoZQorYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHVwcGVyIGJvdW5kLiAgSSBiZWxpZXZlIHRoaXMgaXMgYSBDb252ZXgKK2NvbnZlbnRpb24gZm9yIEBjb2Rle3Vuc2lnbmVkIGxvbmcgbG9uZ30uCisKK0lmIHRoZSBsb3dlciBib3VuZCBvZiBhIHN1YnJhbmdlIGlzIG5lZ2F0aXZlIGFuZCB0aGUgdXBwZXIgYm91bmQgaXMgMCwKK3RoZSB0eXBlIGlzIGEgc2lnbmVkIGludGVncmFsIHR5cGUgd2hvc2Ugc2l6ZSBpbiBieXRlcyBpcwordGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBsb3dlciBib3VuZC4gIEkgYmVsaWV2ZSB0aGlzIGlzIGEgQ29udmV4Citjb252ZW50aW9uIGZvciBAY29kZXtsb25nIGxvbmd9LiAgVG8gZGlzdGluZ3Vpc2ggdGhpcyBmcm9tIGEgbGVnaXRpbWF0ZQorc3VicmFuZ2UsIHRoZSB0eXBlIHNob3VsZCBiZSBhIHN1YnJhbmdlIG9mIGl0c2VsZi4gIEknbSBub3Qgc3VyZSB3aGV0aGVyCit0aGlzIGlzIHRoZSBjYXNlIGZvciBDb252ZXguCisKK0Bub2RlIFRyYWRpdGlvbmFsIE90aGVyIFR5cGVzCitAc3Vic3Vic2VjdGlvbiBUcmFkaXRpb25hbCBPdGhlciBUeXBlcworCitJZiB0aGUgdXBwZXIgYm91bmQgb2YgYSBzdWJyYW5nZSBpcyAwIGFuZCB0aGUgbG93ZXIgYm91bmQgaXMgcG9zaXRpdmUsCit0aGUgdHlwZSBpcyBhIGZsb2F0aW5nIHBvaW50IHR5cGUsIGFuZCB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIHN1YnJhbmdlCitpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgdHlwZToKKworQGV4YW1wbGUKKy5zdGFicyAiZmxvYXQ6dDEyPXIxOzQ7MDsiLDEyOCwwLDAsMAorLnN0YWJzICJkb3VibGU6dDEzPXIxOzg7MDsiLDEyOCwwLDAsMAorQGVuZCBleGFtcGxlCisKK0hvd2V2ZXIsIEdDQyB3cml0ZXMgQGNvZGV7bG9uZyBkb3VibGV9IHRoZSBzYW1lIHdheSBpdCB3cml0ZXMKK0Bjb2Rle2RvdWJsZX0sIHNvIHRoZXJlIGlzIG5vIHdheSB0byBkaXN0aW5ndWlzaC4KKworQGV4YW1wbGUKKy5zdGFicyAibG9uZyBkb3VibGU6dDE0PXIxOzg7MDsiLDEyOCwwLDAsMAorQGVuZCBleGFtcGxlCisKK0NvbXBsZXggdHlwZXMgYXJlIGRlZmluZWQgdGhlIHNhbWUgd2F5IGFzIGZsb2F0aW5nLXBvaW50IHR5cGVzOyB0aGVyZSBpcworbm8gd2F5IHRvIGRpc3Rpbmd1aXNoIGEgc2luZ2xlLXByZWNpc2lvbiBjb21wbGV4IGZyb20gYSBkb3VibGUtcHJlY2lzaW9uCitmbG9hdGluZy1wb2ludCB0eXBlLgorCitUaGUgQyBAY29kZXt2b2lkfSB0eXBlIGlzIGRlZmluZWQgYXMgaXRzZWxmOgorCitAZXhhbXBsZQorLnN0YWJzICJ2b2lkOnQxNT0xNSIsMTI4LDAsMCwwCitAZW5kIGV4YW1wbGUKKworSSdtIG5vdCBzdXJlIGhvdyBhIGJvb2xlYW4gdHlwZSBpcyByZXByZXNlbnRlZC4KKworQG5vZGUgQnVpbHRpbiBUeXBlIERlc2NyaXB0b3JzCitAc3Vic2VjdGlvbiBEZWZpbmluZyBCdWlsdGluIFR5cGVzIFVzaW5nIEJ1aWx0aW4gVHlwZSBEZXNjcmlwdG9ycworCitUaGlzIGlzIHRoZSBtZXRob2QgdXNlZCBieSBTdW4ncyBAY29kZXthY2N9IGZvciBkZWZpbmluZyBidWlsdGluIHR5cGVzLgorVGhlc2UgYXJlIHRoZSB0eXBlIGRlc2NyaXB0b3JzIHRvIGRlZmluZSBidWlsdGluIHR5cGVzOgorCitAdGFibGUgQGNvZGUKK0BjIEZJWE1FOiBjbGVhbiB1cCBkZXNjcmlwdGlvbiBvZiB3aWR0aCBhbmQgb2Zmc2V0LCBvbmNlIHdlIGZpZ3VyZSBvdXQKK0BjIHdoYXQgdGhleSBtZWFuCitAaXRlbSBiIEB2YXJ7c2lnbmVkfSBAdmFye2NoYXItZmxhZ30gQHZhcnt3aWR0aH0gOyBAdmFye29mZnNldH0gOyBAdmFye25iaXRzfSA7CitEZWZpbmUgYW4gaW50ZWdyYWwgdHlwZS4gIEB2YXJ7c2lnbmVkfSBpcyBAc2FtcHt1fSBmb3IgdW5zaWduZWQgb3IKK0BzYW1we3N9IGZvciBzaWduZWQuICBAdmFye2NoYXItZmxhZ30gaXMgQHNhbXB7Y30gd2hpY2ggaW5kaWNhdGVzIHRoaXMKK2lzIGEgY2hhcmFjdGVyIHR5cGUsIG9yIGlzIG9taXR0ZWQuICBJIGFzc3VtZSB0aGlzIGlzIHRvIGRpc3Rpbmd1aXNoIGFuCitpbnRlZ3JhbCB0eXBlIGZyb20gYSBjaGFyYWN0ZXIgdHlwZSBvZiB0aGUgc2FtZSBzaXplLCBmb3IgZXhhbXBsZSBpdAorbWlnaHQgbWFrZSBzZW5zZSB0byBzZXQgaXQgZm9yIHRoZSBDIHR5cGUgQGNvZGV7d2NoYXJfdH0gc28gdGhlIGRlYnVnZ2VyCitjYW4gcHJpbnQgc3VjaCB2YXJpYWJsZXMgZGlmZmVyZW50bHkgKFNvbGFyaXMgZG9lcyBub3QgZG8gdGhpcykuICBTdW4KK3NldHMgaXQgb24gdGhlIEMgdHlwZXMgQGNvZGV7c2lnbmVkIGNoYXJ9IGFuZCBAY29kZXt1bnNpZ25lZCBjaGFyfSB3aGljaAorYXJndWFibHkgaXMgd3JvbmcuICBAdmFye3dpZHRofSBhbmQgQHZhcntvZmZzZXR9IGFwcGVhciB0byBiZSBmb3Igc21hbGwKK29iamVjdHMgc3RvcmVkIGluIGxhcmdlciBvbmVzLCBmb3IgZXhhbXBsZSBhIEBjb2Rle3Nob3J0fSBpbiBhbgorQGNvZGV7aW50fSByZWdpc3Rlci4gIEB2YXJ7d2lkdGh9IGlzIG5vcm1hbGx5IHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCit0eXBlLiAgQHZhcntvZmZzZXR9IHNlZW1zIHRvIGFsd2F5cyBiZSB6ZXJvLiAgQHZhcntuYml0c30gaXMgdGhlIG51bWJlcgorb2YgYml0cyBpbiB0aGUgdHlwZS4KKworTm90ZSB0aGF0IHR5cGUgZGVzY3JpcHRvciBAc2FtcHtifSB1c2VkIGZvciBidWlsdGluIHR5cGVzIGNvbmZsaWN0cyB3aXRoCitpdHMgdXNlIGZvciBQYXNjYWwgc3BhY2UgdHlwZXMgKEBweHJlZntNaXNjZWxsYW5lb3VzIFR5cGVzfSk7IHRoZXkgY2FuCitiZSBkaXN0aW5ndWlzaGVkIGJlY2F1c2UgdGhlIGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIHR5cGUgZGVzY3JpcHRvcgord2lsbCBiZSBhIGRpZ2l0LCBAc2FtcHsofSwgb3IgQHNhbXB7LX0gZm9yIGEgUGFzY2FsIHNwYWNlIHR5cGUsIG9yCitAc2FtcHt1fSBvciBAc2FtcHtzfSBmb3IgYSBidWlsdGluIHR5cGUuCisKK0BpdGVtIHcKK0RvY3VtZW50ZWQgYnkgQUlYIHRvIGRlZmluZSBhIHdpZGUgY2hhcmFjdGVyIHR5cGUsIGJ1dCB0aGVpciBjb21waWxlcgorYWN0dWFsbHkgdXNlcyBuZWdhdGl2ZSB0eXBlIG51bWJlcnMgKEBweHJlZntOZWdhdGl2ZSBUeXBlIE51bWJlcnN9KS4KKworQGl0ZW0gUiBAdmFye2ZwLXR5cGV9IDsgQHZhcntieXRlc30gOworRGVmaW5lIGEgZmxvYXRpbmcgcG9pbnQgdHlwZS4gIEB2YXJ7ZnAtdHlwZX0gaGFzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworQHRhYmxlIEBjb2RlCitAaXRlbSAxIChORl9TSU5HTEUpCitJRUVFIDMyLWJpdCAoc2luZ2xlIHByZWNpc2lvbikgZmxvYXRpbmcgcG9pbnQgZm9ybWF0LgorCitAaXRlbSAyIChORl9ET1VCTEUpCitJRUVFIDY0LWJpdCAoZG91YmxlIHByZWNpc2lvbikgZmxvYXRpbmcgcG9pbnQgZm9ybWF0LgorCitAaXRlbSAzIChORl9DT01QTEVYKQorQGl0ZW0gNCAoTkZfQ09NUExFWDE2KQorQGl0ZW0gNSAoTkZfQ09NUExFWDMyKQorQGMgIkdEQiBzb3VyY2UiIHJlYWxseSBtZWFucyBAZmlsZXtpbmNsdWRlL2FvdXQvc3RhYl9nbnUuaH0sIGJ1dCB0cnlpbmcKK0BjIHRvIHB1dCB0aGF0IGhlcmUgZ290IGFuIG92ZXJmdWxsIGhib3guCitUaGVzZSBhcmUgZm9yIGNvbXBsZXggbnVtYmVycy4gIEEgY29tbWVudCBpbiB0aGUgR0RCIHNvdXJjZSBkZXNjcmliZXMKK3RoZW0gYXMgRm9ydHJhbiBAY29kZXtjb21wbGV4fSwgQGNvZGV7ZG91YmxlIGNvbXBsZXh9LCBhbmQKK0Bjb2Rle2NvbXBsZXgqMTZ9LCByZXNwZWN0aXZlbHksIGJ1dCB3aGF0IGRvZXMgdGhhdCBtZWFuPyAgKGkuZS4sIFNpbmdsZQorcHJlY2lzaW9uPyAgRG91YmxlIHByZWNpc29uPykuCisKK0BpdGVtIDYgKE5GX0xET1VCTEUpCitMb25nIGRvdWJsZS4gIFRoaXMgc2hvdWxkIHByb2JhYmx5IG9ubHkgYmUgdXNlZCBmb3IgU3VuIGZvcm1hdAorQGNvZGV7bG9uZyBkb3VibGV9LCBhbmQgbmV3IGNvZGVzIHNob3VsZCBiZSB1c2VkIGZvciBvdGhlciBmbG9hdGluZworcG9pbnQgZm9ybWF0cyAoQGNvZGV7TkZfRE9VQkxFfSBjYW4gYmUgdXNlZCBpZiBhIEBjb2Rle2xvbmcgZG91YmxlfSBpcworcmVhbGx5IGp1c3QgYW4gSUVFRSBkb3VibGUsIG9mIGNvdXJzZSkuCitAZW5kIHRhYmxlCisKK0B2YXJ7Ynl0ZXN9IGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2NjdXBpZWQgYnkgdGhlIHR5cGUuICBUaGlzIGFsbG93cyBhCitkZWJ1Z2dlciB0byBwZXJmb3JtIHNvbWUgb3BlcmF0aW9ucyB3aXRoIHRoZSB0eXBlIGV2ZW4gaWYgaXQgZG9lc24ndAordW5kZXJzdGFuZCBAdmFye2ZwLXR5cGV9LgorCitAaXRlbSBnIEB2YXJ7dHlwZS1pbmZvcm1hdGlvbn0gOyBAdmFye25iaXRzfQorRG9jdW1lbnRlZCBieSBBSVggdG8gZGVmaW5lIGEgZmxvYXRpbmcgdHlwZSwgYnV0IHRoZWlyIGNvbXBpbGVyIGFjdHVhbGx5Cit1c2VzIG5lZ2F0aXZlIHR5cGUgbnVtYmVycyAoQHB4cmVme05lZ2F0aXZlIFR5cGUgTnVtYmVyc30pLgorCitAaXRlbSBjIEB2YXJ7dHlwZS1pbmZvcm1hdGlvbn0gOyBAdmFye25iaXRzfQorRG9jdW1lbnRlZCBieSBBSVggdG8gZGVmaW5lIGEgY29tcGxleCB0eXBlLCBidXQgdGhlaXIgY29tcGlsZXIgYWN0dWFsbHkKK3VzZXMgbmVnYXRpdmUgdHlwZSBudW1iZXJzIChAcHhyZWZ7TmVnYXRpdmUgVHlwZSBOdW1iZXJzfSkuCitAZW5kIHRhYmxlCisKK1RoZSBDIEBjb2Rle3ZvaWR9IHR5cGUgaXMgZGVmaW5lZCBhcyBhIHNpZ25lZCBpbnRlZ3JhbCB0eXBlIDAgYml0cyBsb25nOgorQGV4YW1wbGUKKy5zdGFicyAidm9pZDp0MTk9YnMwOzA7MCIsMTI4LDAsMCwwCitAZW5kIGV4YW1wbGUKK1RoZSBTb2xhcmlzIGNvbXBpbGVyIHNlZW1zIHRvIG9taXQgdGhlIHRyYWlsaW5nIHNlbWljb2xvbiBpbiB0aGlzIGNhc2UuCitHZXR0aW5nIHNsb3BweSBpbiB0aGlzIHdheSBpcyBub3QgYSBzd2lmdCBtb3ZlIGJlY2F1c2UgaWYgYSB0eXBlIGlzCitlbWJlZGRlZCBpbiBhIG1vcmUgY29tcGxleCBleHByZXNzaW9uIGl0IGlzIG5lY2Vzc2FyeSB0byBiZSBhYmxlIHRvIHRlbGwKK3doZXJlIGl0IGVuZHMuCisKK0knbSBub3Qgc3VyZSBob3cgYSBib29sZWFuIHR5cGUgaXMgcmVwcmVzZW50ZWQuCisKK0Bub2RlIE5lZ2F0aXZlIFR5cGUgTnVtYmVycworQHN1YnNlY3Rpb24gTmVnYXRpdmUgVHlwZSBOdW1iZXJzCisKK1RoaXMgaXMgdGhlIG1ldGhvZCB1c2VkIGluIFhDT0ZGIGZvciBkZWZpbmluZyBidWlsdGluIHR5cGVzLgorU2luY2UgdGhlIGRlYnVnZ2VyIGtub3dzIGFib3V0IHRoZSBidWlsdGluIHR5cGVzIGFueXdheSwgdGhlIGlkZWEgb2YKK25lZ2F0aXZlIHR5cGUgbnVtYmVycyBpcyBzaW1wbHkgdG8gZ2l2ZSBhIHNwZWNpYWwgdHlwZSBudW1iZXIgd2hpY2gKK2luZGljYXRlcyB0aGUgYnVpbHRpbiB0eXBlLiAgVGhlcmUgaXMgbm8gc3RhYiBkZWZpbmluZyB0aGVzZSB0eXBlcy4KKworVGhlcmUgYXJlIHNldmVyYWwgc3VidGxlIGlzc3VlcyB3aXRoIG5lZ2F0aXZlIHR5cGUgbnVtYmVycy4KKworT25lIGlzIHRoZSBzaXplIG9mIHRoZSB0eXBlLiAgQSBidWlsdGluIHR5cGUgKGZvciBleGFtcGxlIHRoZSBDIHR5cGVzCitAY29kZXtpbnR9IG9yIEBjb2Rle2xvbmd9KSBtaWdodCBoYXZlIGRpZmZlcmVudCBzaXplcyBkZXBlbmRpbmcgb24KK2NvbXBpbGVyIG9wdGlvbnMsIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLCB0aGUgQUJJLCBldGMuICBUaGlzIGlzc3VlCitkb2Vzbid0IGNvbWUgdXAgZm9yIElCTSB0b29scyBzaW5jZSAoc28gZmFyKSB0aGV5IGp1c3QgdGFyZ2V0IHRoZQorUlMvNjAwMDsgdGhlIHNpemVzIGluZGljYXRlZCBiZWxvdyBmb3IgZWFjaCBzaXplIGFyZSB3aGF0IHRoZSBJQk0KK1JTLzYwMDAgdG9vbHMgdXNlLiAgVG8gZGVhbCB3aXRoIGRpZmZlcmluZyBzaXplcywgZWl0aGVyIGRlZmluZSBzZXBhcmF0ZQorbmVnYXRpdmUgdHlwZSBudW1iZXJzIGZvciBlYWNoIHNpemUgKHdoaWNoIHdvcmtzIGJ1dCByZXF1aXJlcyBjaGFuZ2luZwordGhlIGRlYnVnZ2VyLCBhbmQsIHVubGVzcyB5b3UgZ2V0IGJvdGggQUlYIGRieCBhbmQgR0RCIHRvIGFjY2VwdCB0aGUKK2NoYW5nZSwgaW50cm9kdWNlcyBhbiBpbmNvbXBhdGliaWxpdHkpLCBvciB1c2UgYSB0eXBlIGF0dHJpYnV0ZQorKEBweHJlZntTdHJpbmcgRmllbGR9KSB0byBkZWZpbmUgYSBuZXcgdHlwZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBzaXplCisod2hpY2ggbWVyZWx5IHJlcXVpcmVzIGEgZGVidWdnZXIgd2hpY2ggdW5kZXJzdGFuZHMgdHlwZSBhdHRyaWJ1dGVzLAorbGlrZSBBSVggZGJ4IG9yIEdEQikuICBGb3IgZXhhbXBsZSwKKworQGV4YW1wbGUKKy5zdGFicyAiYm9vbGVhbjp0MTA9QEBzODstMTYiLDEyOCwwLDAsMAorQGVuZCBleGFtcGxlCisKK2RlZmluZXMgYW4gOC1iaXQgYm9vbGVhbiB0eXBlLCBhbmQKKworQGV4YW1wbGUKKy5zdGFicyAiYm9vbGVhbjp0MTA9QEBzNjQ7LTE2IiwxMjgsMCwwLDAKK0BlbmQgZXhhbXBsZQorCitkZWZpbmVzIGEgNjQtYml0IGJvb2xlYW4gdHlwZS4KKworQSBzaW1pbGFyIGlzc3VlIGlzIHRoZSBmb3JtYXQgb2YgdGhlIHR5cGUuICBUaGlzIGNvbWVzIHVwIG1vc3Qgb2Z0ZW4gZm9yCitmbG9hdGluZy1wb2ludCB0eXBlcywgd2hpY2ggY291bGQgaGF2ZSB2YXJpb3VzIGZvcm1hdHMgKHBhcnRpY3VsYXJseQorZXh0ZW5kZWQgZG91Ymxlcywgd2hpY2ggdmFyeSBxdWl0ZSBhIGJpdCBldmVuIGFtb25nIElFRUUgc3lzdGVtcykuCitBZ2FpbiwgaXQgaXMgYmVzdCB0byBkZWZpbmUgYSBuZXcgbmVnYXRpdmUgdHlwZSBudW1iZXIgZm9yIGVhY2gKK2RpZmZlcmVudCBmb3JtYXQ7IGNoYW5naW5nIHRoZSBmb3JtYXQgYmFzZWQgb24gdGhlIHRhcmdldCBzeXN0ZW0gaGFzCit2YXJpb3VzIHByb2JsZW1zLiAgT25lIHN1Y2ggcHJvYmxlbSBpcyB0aGF0IHRoZSBBbHBoYSBoYXMgYm90aCBWQVggYW5kCitJRUVFIGZsb2F0aW5nIHR5cGVzLiAgT25lIGNhbiBlYXNpbHkgaW1hZ2luZSBvbmUgbGlicmFyeSB1c2luZyB0aGUgVkFYCit0eXBlcyBhbmQgYW5vdGhlciBsaWJyYXJ5IGluIHRoZSBzYW1lIGV4ZWN1dGFibGUgdXNpbmcgdGhlIElFRUUgdHlwZXMuCitBbm90aGVyIGV4YW1wbGUgaXMgdGhhdCB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygd2hldGhlciBhIGJvb2xlYW4gaXMgdHJ1ZQorb3IgZmFsc2UgY2FuIGJlIGJhc2VkIG9uIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQsIG1vc3Qgc2lnbmlmaWNhbnQKK2JpdCwgd2hldGhlciBpdCBpcyB6ZXJvLCBldGMuLCBhbmQgZGlmZmVyZW50IGNvbXBpbGVycyAob3IgZGlmZmVyZW50CitvcHRpb25zIHRvIHRoZSBzYW1lIGNvbXBpbGVyKSBtaWdodCBwcm92aWRlIGRpZmZlcmVudCBraW5kcyBvZiBib29sZWFuLgorCitUaGUgbGFzdCBtYWpvciBpc3N1ZSBpcyB0aGUgbmFtZXMgb2YgdGhlIHR5cGVzLiAgVGhlIG5hbWUgb2YgYSBnaXZlbgordHlwZSBkZXBlbmRzIEBlbXBoe29ubHl9IG9uIHRoZSBuZWdhdGl2ZSB0eXBlIG51bWJlciBnaXZlbjsgdGhlc2UgZG8gbm90Cit2YXJ5IGRlcGVuZGluZyBvbiB0aGUgbGFuZ3VhZ2UsIHRoZSB0YXJnZXQgc3lzdGVtLCBvciBhbnl0aGluZyBlbHNlLgorT25lIGNhbiBhbHdheXMgZGVmaW5lIHNlcGFyYXRlIHR5cGUgbnVtYmVycy0tLWluIHRoZSBmb2xsb3dpbmcgbGlzdCB5b3UKK3dpbGwgc2VlIGZvciBleGFtcGxlIHNlcGFyYXRlIEBjb2Rle2ludH0gYW5kIEBjb2Rle2ludGVnZXIqNH0gdHlwZXMKK3doaWNoIGFyZSBpZGVudGljYWwgZXhjZXB0IGZvciB0aGUgbmFtZS4gIEJ1dCBjb21wYXRpYmlsaXR5IGNhbiBiZQorbWFpbnRhaW5lZCBieSBub3QgaW52ZW50aW5nIG5ldyBuZWdhdGl2ZSB0eXBlIG51bWJlcnMgYW5kIGluc3RlYWQganVzdAorZGVmaW5pbmcgYSBuZXcgdHlwZSB3aXRoIGEgbmV3IG5hbWUuICBGb3IgZXhhbXBsZToKKworQGV4YW1wbGUKKy5zdGFicyAiQ0FSRElOQUw6dDEwPS04IiwxMjgsMCwwLDAKK0BlbmQgZXhhbXBsZQorCitIZXJlIGlzIHRoZSBsaXN0IG9mIG5lZ2F0aXZlIHR5cGUgbnVtYmVycy4gIFRoZSBwaHJhc2UgQGRmbntpbnRlZ3JhbAordHlwZX0gaXMgdXNlZCB0byBtZWFuIHR3b3MtY29tcGxlbWVudCAoSSBzdHJvbmdseSBzdXNwZWN0IHRoYXQgYWxsCittYWNoaW5lcyB3aGljaCB1c2Ugc3RhYnMgdXNlIHR3b3MtY29tcGxlbWVudDsgbW9zdCBtYWNoaW5lcyB1c2UKK3R3b3MtY29tcGxlbWVudCB0aGVzZSBkYXlzKS4KKworQHRhYmxlIEBjb2RlCitAaXRlbSAtMQorQGNvZGV7aW50fSwgMzIgYml0IHNpZ25lZCBpbnRlZ3JhbCB0eXBlLgorCitAaXRlbSAtMgorQGNvZGV7Y2hhcn0sIDggYml0IHR5cGUgaG9sZGluZyBhIGNoYXJhY3Rlci4gICBCb3RoIEdEQiBhbmQgZGJ4IG9uIEFJWAordHJlYXQgdGhpcyBhcyBzaWduZWQuICBHQ0MgdXNlcyB0aGlzIHR5cGUgd2hldGhlciBAY29kZXtjaGFyfSBpcyBzaWduZWQKK29yIG5vdCwgd2hpY2ggc2VlbXMgbGlrZSBhIGJhZCBpZGVhLiAgVGhlIEFJWCBjb21waWxlciAoQGNvZGV7eGxjfSkgc2VlbXMgdG8KK2F2b2lkIHRoaXMgdHlwZTsgaXQgdXNlcyAtNSBpbnN0ZWFkIGZvciBAY29kZXtjaGFyfS4KKworQGl0ZW0gLTMKK0Bjb2Rle3Nob3J0fSwgMTYgYml0IHNpZ25lZCBpbnRlZ3JhbCB0eXBlLgorCitAaXRlbSAtNAorQGNvZGV7bG9uZ30sIDMyIGJpdCBzaWduZWQgaW50ZWdyYWwgdHlwZS4KKworQGl0ZW0gLTUKK0Bjb2Rle3Vuc2lnbmVkIGNoYXJ9LCA4IGJpdCB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlLgorCitAaXRlbSAtNgorQGNvZGV7c2lnbmVkIGNoYXJ9LCA4IGJpdCBzaWduZWQgaW50ZWdyYWwgdHlwZS4KKworQGl0ZW0gLTcKK0Bjb2Rle3Vuc2lnbmVkIHNob3J0fSwgMTYgYml0IHVuc2lnbmVkIGludGVncmFsIHR5cGUuCisKK0BpdGVtIC04CitAY29kZXt1bnNpZ25lZCBpbnR9LCAzMiBiaXQgdW5zaWduZWQgaW50ZWdyYWwgdHlwZS4KKworQGl0ZW0gLTkKK0Bjb2Rle3Vuc2lnbmVkfSwgMzIgYml0IHVuc2lnbmVkIGludGVncmFsIHR5cGUuCisKK0BpdGVtIC0xMAorQGNvZGV7dW5zaWduZWQgbG9uZ30sIDMyIGJpdCB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlLgorCitAaXRlbSAtMTEKK0Bjb2Rle3ZvaWR9LCB0eXBlIGluZGljYXRpbmcgdGhlIGxhY2sgb2YgYSB2YWx1ZS4KKworQGl0ZW0gLTEyCitAY29kZXtmbG9hdH0sIElFRUUgc2luZ2xlIHByZWNpc2lvbi4KKworQGl0ZW0gLTEzCitAY29kZXtkb3VibGV9LCBJRUVFIGRvdWJsZSBwcmVjaXNpb24uCisKK0BpdGVtIC0xNAorQGNvZGV7bG9uZyBkb3VibGV9LCBJRUVFIGRvdWJsZSBwcmVjaXNpb24uICBUaGUgY29tcGlsZXIgY2xhaW1zIHRoZSBzaXplCit3aWxsIGluY3JlYXNlIGluIGEgZnV0dXJlIHJlbGVhc2UsIGFuZCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgeW91IGhhdmUKK3RvIGF2b2lkIHVzaW5nIEBjb2Rle2xvbmcgZG91YmxlfS4gIEkgaG9wZSB3aGVuIHRoZXkgaW5jcmVhc2UgaXQgdGhleQordXNlIGEgbmV3IG5lZ2F0aXZlIHR5cGUgbnVtYmVyLgorCitAaXRlbSAtMTUKK0Bjb2Rle2ludGVnZXJ9LiAgMzIgYml0IHNpZ25lZCBpbnRlZ3JhbCB0eXBlLgorCitAaXRlbSAtMTYKK0Bjb2Rle2Jvb2xlYW59LiAgMzIgYml0IHR5cGUuICBHREIgYW5kIEdDQyBhc3N1bWUgdGhhdCB6ZXJvIGlzIGZhbHNlLAorb25lIGlzIHRydWUsIGFuZCBvdGhlciB2YWx1ZXMgaGF2ZSB1bnNwZWNpZmllZCBtZWFuaW5nLiAgSSBob3BlIHRoaXMKK2FncmVlcyB3aXRoIGhvdyB0aGUgSUJNIHRvb2xzIHVzZSB0aGUgdHlwZS4KKworQGl0ZW0gLTE3CitAY29kZXtzaG9ydCByZWFsfS4gIElFRUUgc2luZ2xlIHByZWNpc2lvbi4KKworQGl0ZW0gLTE4CitAY29kZXtyZWFsfS4gIElFRUUgZG91YmxlIHByZWNpc2lvbi4KKworQGl0ZW0gLTE5CitAY29kZXtzdHJpbmdwdHJ9LiAgQHhyZWZ7U3RyaW5nc30uCisKK0BpdGVtIC0yMAorQGNvZGV7Y2hhcmFjdGVyfSwgOCBiaXQgdW5zaWduZWQgY2hhcmFjdGVyIHR5cGUuCisKK0BpdGVtIC0yMQorQGNvZGV7bG9naWNhbCoxfSwgOCBiaXQgdHlwZS4gIFRoaXMgRm9ydHJhbiB0eXBlIGhhcyBhIHNwbGl0CitwZXJzb25hbGl0eSBpbiB0aGF0IGl0IGlzIHVzZWQgZm9yIGJvb2xlYW4gdmFyaWFibGVzLCBidXQgY2FuIGFsc28gYmUKK3VzZWQgZm9yIHVuc2lnbmVkIGludGVnZXJzLiAgMCBpcyBmYWxzZSwgMSBpcyB0cnVlLCBhbmQgb3RoZXIgdmFsdWVzIGFyZQorbm9uLWJvb2xlYW4uCisKK0BpdGVtIC0yMgorQGNvZGV7bG9naWNhbCoyfSwgMTYgYml0IHR5cGUuICBUaGlzIEZvcnRyYW4gdHlwZSBoYXMgYSBzcGxpdAorcGVyc29uYWxpdHkgaW4gdGhhdCBpdCBpcyB1c2VkIGZvciBib29sZWFuIHZhcmlhYmxlcywgYnV0IGNhbiBhbHNvIGJlCit1c2VkIGZvciB1bnNpZ25lZCBpbnRlZ2Vycy4gIDAgaXMgZmFsc2UsIDEgaXMgdHJ1ZSwgYW5kIG90aGVyIHZhbHVlcyBhcmUKK25vbi1ib29sZWFuLgorCitAaXRlbSAtMjMKK0Bjb2Rle2xvZ2ljYWwqNH0sIDMyIGJpdCB0eXBlLiAgVGhpcyBGb3J0cmFuIHR5cGUgaGFzIGEgc3BsaXQKK3BlcnNvbmFsaXR5IGluIHRoYXQgaXQgaXMgdXNlZCBmb3IgYm9vbGVhbiB2YXJpYWJsZXMsIGJ1dCBjYW4gYWxzbyBiZQordXNlZCBmb3IgdW5zaWduZWQgaW50ZWdlcnMuICAwIGlzIGZhbHNlLCAxIGlzIHRydWUsIGFuZCBvdGhlciB2YWx1ZXMgYXJlCitub24tYm9vbGVhbi4KKworQGl0ZW0gLTI0CitAY29kZXtsb2dpY2FsfSwgMzIgYml0IHR5cGUuICBUaGlzIEZvcnRyYW4gdHlwZSBoYXMgYSBzcGxpdAorcGVyc29uYWxpdHkgaW4gdGhhdCBpdCBpcyB1c2VkIGZvciBib29sZWFuIHZhcmlhYmxlcywgYnV0IGNhbiBhbHNvIGJlCit1c2VkIGZvciB1bnNpZ25lZCBpbnRlZ2Vycy4gIDAgaXMgZmFsc2UsIDEgaXMgdHJ1ZSwgYW5kIG90aGVyIHZhbHVlcyBhcmUKK25vbi1ib29sZWFuLgorCitAaXRlbSAtMjUKK0Bjb2Rle2NvbXBsZXh9LiAgQSBjb21wbGV4IHR5cGUgY29uc2lzdGluZyBvZiB0d28gSUVFRSBzaW5nbGUtcHJlY2lzaW9uCitmbG9hdGluZyBwb2ludCB2YWx1ZXMuCisKK0BpdGVtIC0yNgorQGNvZGV7Y29tcGxleH0uICBBIGNvbXBsZXggdHlwZSBjb25zaXN0aW5nIG9mIHR3byBJRUVFIGRvdWJsZS1wcmVjaXNpb24KK2Zsb2F0aW5nIHBvaW50IHZhbHVlcy4KKworQGl0ZW0gLTI3CitAY29kZXtpbnRlZ2VyKjF9LCA4IGJpdCBzaWduZWQgaW50ZWdyYWwgdHlwZS4KKworQGl0ZW0gLTI4CitAY29kZXtpbnRlZ2VyKjJ9LCAxNiBiaXQgc2lnbmVkIGludGVncmFsIHR5cGUuCisKK0BpdGVtIC0yOQorQGNvZGV7aW50ZWdlcio0fSwgMzIgYml0IHNpZ25lZCBpbnRlZ3JhbCB0eXBlLgorCitAaXRlbSAtMzAKK0Bjb2Rle3djaGFyfS4gIFdpZGUgY2hhcmFjdGVyLCAxNiBiaXRzIHdpZGUsIHVuc2lnbmVkICh3aGF0IGZvcm1hdD8KK1VuaWNvZGU/KS4KKworQGl0ZW0gLTMxCitAY29kZXtsb25nIGxvbmd9LCA2NCBiaXQgc2lnbmVkIGludGVncmFsIHR5cGUuCisKK0BpdGVtIC0zMgorQGNvZGV7dW5zaWduZWQgbG9uZyBsb25nfSwgNjQgYml0IHVuc2lnbmVkIGludGVncmFsIHR5cGUuCisKK0BpdGVtIC0zMworQGNvZGV7bG9naWNhbCo4fSwgNjQgYml0IHVuc2lnbmVkIGludGVncmFsIHR5cGUuCisKK0BpdGVtIC0zNAorQGNvZGV7aW50ZWdlcio4fSwgNjQgYml0IHNpZ25lZCBpbnRlZ3JhbCB0eXBlLgorQGVuZCB0YWJsZQorCitAbm9kZSBNaXNjZWxsYW5lb3VzIFR5cGVzCitAc2VjdGlvbiBNaXNjZWxsYW5lb3VzIFR5cGVzCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gYiBAdmFye3R5cGUtaW5mb3JtYXRpb259IDsgQHZhcntieXRlc30KK1Bhc2NhbCBzcGFjZSB0eXBlLiAgVGhpcyBpcyBkb2N1bWVudGVkIGJ5IElCTTsgd2hhdCBkb2VzIGl0IG1lYW4/CisKK1RoaXMgdXNlIG9mIHRoZSBAc2FtcHtifSB0eXBlIGRlc2NyaXB0b3IgY2FuIGJlIGRpc3Rpbmd1aXNoZWQKK2Zyb20gaXRzIHVzZSBmb3IgYnVpbHRpbiBpbnRlZ3JhbCB0eXBlcyAoQHB4cmVme0J1aWx0aW4gVHlwZQorRGVzY3JpcHRvcnN9KSBiZWNhdXNlIHRoZSBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSB0eXBlIGRlc2NyaXB0b3IgaXMKK2Fsd2F5cyBhIGRpZ2l0LCBAc2FtcHsofSwgb3IgQHNhbXB7LX0uCisKK0BpdGVtIEIgQHZhcnt0eXBlLWluZm9ybWF0aW9ufQorQSB2b2xhdGlsZS1xdWFsaWZpZWQgdmVyc2lvbiBvZiBAdmFye3R5cGUtaW5mb3JtYXRpb259LiAgVGhpcyBpcworYSBTdW4gZXh0ZW5zaW9uLiAgUmVmZXJlbmNlcyBhbmQgc3RvcmVzIHRvIGEgdmFyaWFibGUgd2l0aCBhCit2b2xhdGlsZS1xdWFsaWZpZWQgdHlwZSBtdXN0IG5vdCBiZSBvcHRpbWl6ZWQgb3IgY2FjaGVkOyB0aGV5CittdXN0IG9jY3VyIGFzIHRoZSB1c2VyIHNwZWNpZmllcyB0aGVtLgorCitAaXRlbSBkIEB2YXJ7dHlwZS1pbmZvcm1hdGlvbn0KK0ZpbGUgb2YgdHlwZSBAdmFye3R5cGUtaW5mb3JtYXRpb259LiAgQXMgZmFyIGFzIEkga25vdyB0aGlzIGlzIG9ubHkgdXNlZAorYnkgUGFzY2FsLgorCitAaXRlbSBrIEB2YXJ7dHlwZS1pbmZvcm1hdGlvbn0KK0EgY29uc3QtcXVhbGlmaWVkIHZlcnNpb24gb2YgQHZhcnt0eXBlLWluZm9ybWF0aW9ufS4gIFRoaXMgaXMgYSBTdW4KK2V4dGVuc2lvbi4gIEEgdmFyaWFibGUgd2l0aCBhIGNvbnN0LXF1YWxpZmllZCB0eXBlIGNhbm5vdCBiZSBtb2RpZmllZC4KKworQGl0ZW0gTSBAdmFye3R5cGUtaW5mb3JtYXRpb259IDsgQHZhcntsZW5ndGh9CitNdWx0aXBsZSBpbnN0YW5jZSB0eXBlLiAgVGhlIHR5cGUgc2VlbXMgdG8gY29tcG9zZWQgb2YgQHZhcntsZW5ndGh9CityZXBldGl0aW9ucyBvZiBAdmFye3R5cGUtaW5mb3JtYXRpb259LCBmb3IgZXhhbXBsZSBAY29kZXtjaGFyYWN0ZXIqM30gaXMKK3JlcHJlc2VudGVkIGJ5IEBzYW1we00tMjszfSwgd2hlcmUgQHNhbXB7LTJ9IGlzIGEgcmVmZXJlbmNlIHRvIGEKK2NoYXJhY3RlciB0eXBlIChAcHhyZWZ7TmVnYXRpdmUgVHlwZSBOdW1iZXJzfSkuICBJJ20gbm90IHN1cmUgaG93IHRoaXMKK2RpZmZlcnMgZnJvbSBhbiBhcnJheS4gIFRoaXMgYXBwZWFycyB0byBiZSBhIEZvcnRyYW4gZmVhdHVyZS4KK0B2YXJ7bGVuZ3RofSBpcyBhIGJvdW5kLCBsaWtlIHRob3NlIGluIHJhbmdlIHR5cGVzOyBzZWUgQHJlZntTdWJyYW5nZXN9LgorCitAaXRlbSBTIEB2YXJ7dHlwZS1pbmZvcm1hdGlvbn0KK1Bhc2NhbCBzZXQgdHlwZS4gIEB2YXJ7dHlwZS1pbmZvcm1hdGlvbn0gbXVzdCBiZSBhIHNtYWxsIHR5cGUgc3VjaCBhcyBhbgorZW51bWVyYXRpb24gb3IgYSBzdWJyYW5nZSwgYW5kIHRoZSB0eXBlIGlzIGEgYml0bWFzayB3aG9zZSBsZW5ndGggaXMKK3NwZWNpZmllZCBieSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIEB2YXJ7dHlwZS1pbmZvcm1hdGlvbn0uCisKK0luIENISUxMLCBpZiBpdCBpcyBhIGJpdHN0cmluZyBpbnN0ZWFkIG9mIGEgc2V0LCBhbHNvIHVzZSB0aGUgQHNhbXB7U30KK3R5cGUgYXR0cmlidXRlIChAcHhyZWZ7U3RyaW5nIEZpZWxkfSkuCisKK0BpdGVtICogQHZhcnt0eXBlLWluZm9ybWF0aW9ufQorUG9pbnRlciB0byBAdmFye3R5cGUtaW5mb3JtYXRpb259LgorQGVuZCB0YWJsZQorCitAbm9kZSBDcm9zcy1SZWZlcmVuY2VzCitAc2VjdGlvbiBDcm9zcy1SZWZlcmVuY2VzIHRvIE90aGVyIFR5cGVzCisKK0EgdHlwZSBjYW4gYmUgdXNlZCBiZWZvcmUgaXQgaXMgZGVmaW5lZDsgb25lIGNvbW1vbiB3YXkgdG8gZGVhbCB3aXRoCit0aGF0IHNpdHVhdGlvbiBpcyBqdXN0IHRvIHVzZSBhIHR5cGUgcmVmZXJlbmNlIHRvIGEgdHlwZSB3aGljaCBoYXMgbm90Cit5ZXQgYmVlbiBkZWZpbmVkLgorCitBbm90aGVyIHdheSBpcyB3aXRoIHRoZSBAc2FtcHt4fSB0eXBlIGRlc2NyaXB0b3IsIHdoaWNoIGlzIGZvbGxvd2VkIGJ5CitAc2FtcHtzfSBmb3IgYSBzdHJ1Y3R1cmUgdGFnLCBAc2FtcHt1fSBmb3IgYSB1bmlvbiB0YWcsIG9yIEBzYW1we2V9IGZvcgorYSBlbnVtZXJhdG9yIHRhZywgZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgdGhlIHRhZywgZm9sbG93ZWQgYnkgQHNhbXB7On0uCitJZiB0aGUgbmFtZSBjb250YWlucyBAc2FtcHs6On0gYmV0d2VlbiBhIEBzYW1wezx9IGFuZCBAc2FtcHs+fSBwYWlyIChmb3IKK0MrKyB0ZW1wbGF0ZXMpLCBzdWNoIGEgQHNhbXB7Ojp9IGRvZXMgbm90IGVuZCB0aGUgbmFtZS0tLW9ubHkgYSBzaW5nbGUKK0BzYW1wezp9IGVuZHMgdGhlIG5hbWU7IHNlZSBAcmVme05lc3RlZCBTeW1ib2xzfS4KKworRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgQyBkZWNsYXJhdGlvbnM6CisKK0BleGFtcGxlCitzdHJ1Y3QgZm9vOworc3RydWN0IGZvbyAqYmFyOworQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorcHJvZHVjZToKKworQGV4YW1wbGUKKy5zdGFicyAiYmFyOkcxNj0qMTc9eHNmb286IiwzMiwwLDAsMAorQGVuZCBleGFtcGxlCisKK05vdCBhbGwgZGVidWdnZXJzIHN1cHBvcnQgdGhlIEBzYW1we3h9IHR5cGUgZGVzY3JpcHRvciwgc28gb24gc29tZQorbWFjaGluZXMgR0NDIGRvZXMgbm90IHVzZSBpdC4gIEkgYmVsaWV2ZSB0aGF0IGZvciB0aGUgYWJvdmUgZXhhbXBsZSBpdAord291bGQganVzdCBlbWl0IGEgcmVmZXJlbmNlIHRvIHR5cGUgMTcgYW5kIG5ldmVyIGRlZmluZSBpdCwgYnV0IEkKK2hhdmVuJ3QgdmVyaWZpZWQgdGhhdC4KKworTW9kdWxhLTIgaW1wb3J0ZWQgdHlwZXMsIGF0IGxlYXN0IG9uIEFJWCwgdXNlIHRoZSBAc2FtcHtpfSB0eXBlCitkZXNjcmlwdG9yLCB3aGljaCBpcyBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIGZyb20gd2hpY2ggdGhlCit0eXBlIGlzIGltcG9ydGVkLCBmb2xsb3dlZCBieSBAc2FtcHs6fSwgZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgdGhlCit0eXBlLiAgVGhlcmUgaXMgdGhlbiBvcHRpb25hbGx5IGEgY29tbWEgZm9sbG93ZWQgYnkgdHlwZSBpbmZvcm1hdGlvbiBmb3IKK3RoZSB0eXBlLiAgVGhpcyBkaWZmZXJzIGZyb20gbWVyZWx5IG5hbWluZyB0aGUgdHlwZSAoQHB4cmVme1R5cGVkZWZzfSkgaW4KK3RoYXQgaXQgaWRlbnRpZmllcyB0aGUgbW9kdWxlOyBJIGRvbid0IHVuZGVyc3RhbmQgd2hldGhlciB0aGUgbmFtZSBvZgordGhlIHR5cGUgZ2l2ZW4gaGVyZSBpcyBhbHdheXMganVzdCB0aGUgc2FtZSBhcyB0aGUgbmFtZSB3ZSBhcmUgZ2l2aW5nCitpdCwgb3Igd2hldGhlciB0aGlzIHR5cGUgZGVzY3JpcHRvciBpcyB1c2VkIHdpdGggYSBuYW1lbGVzcyBzdGFiCisoQHB4cmVme1N0cmluZyBGaWVsZH0pLCBvciB3aGF0LiAgVGhlIHN5bWJvbCBlbmRzIHdpdGggQHNhbXB7O30uCisKK0Bub2RlIFN1YnJhbmdlcworQHNlY3Rpb24gU3VicmFuZ2UgVHlwZXMKKworVGhlIEBzYW1we3J9IHR5cGUgZGVzY3JpcHRvciBkZWZpbmVzIGEgdHlwZSBhcyBhIHN1YnJhbmdlIG9mIGFub3RoZXIKK3R5cGUuICBJdCBpcyBmb2xsb3dlZCBieSB0eXBlIGluZm9ybWF0aW9uIGZvciB0aGUgdHlwZSBvZiB3aGljaCBpdCBpcyBhCitzdWJyYW5nZSwgYSBzZW1pY29sb24sIGFuIGludGVncmFsIGxvd2VyIGJvdW5kLCBhIHNlbWljb2xvbiwgYW4KK2ludGVncmFsIHVwcGVyIGJvdW5kLCBhbmQgYSBzZW1pY29sb24uICBUaGUgQUlYIGRvY3VtZW50YXRpb24gZG9lcyBub3QKK3NwZWNpZnkgdGhlIHRyYWlsaW5nIHNlbWljb2xvbiwgaW4gYW4gZWZmb3J0IHRvIHNwZWNpZnkgYXJyYXkgaW5kZXhlcworbW9yZSBjbGVhbmx5LCBidXQgYSBzdWJyYW5nZSB3aGljaCBpcyBub3QgYW4gYXJyYXkgaW5kZXggaGFzIGFsd2F5cworaW5jbHVkZWQgYSB0cmFpbGluZyBzZW1pY29sb24gKEBweHJlZntBcnJheXN9KS4KKworSW5zdGVhZCBvZiBhbiBpbnRlZ2VyLCBlaXRoZXIgYm91bmQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIEEgQHZhcntvZmZzZXR9CitUaGUgYm91bmQgaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZSBvbiB0aGUgc3RhY2sgYXQgb2Zmc2V0IEB2YXJ7b2Zmc2V0fQorZnJvbSB0aGUgYXJndW1lbnQgbGlzdC4gIEB4cmVme1BhcmFtZXRlcnN9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdWNoCitvZmZzZXRzLgorCitAaXRlbSBUIEB2YXJ7b2Zmc2V0fQorVGhlIGJvdW5kIGlzIHBhc3NlZCBieSB2YWx1ZSBvbiB0aGUgc3RhY2sgYXQgb2Zmc2V0IEB2YXJ7b2Zmc2V0fSBmcm9tCit0aGUgYXJndW1lbnQgbGlzdC4KKworQGl0ZW0gYSBAdmFye3JlZ2lzdGVyLW51bWJlcn0KK1RoZSBib3VuZCBpcyBwYXNlZCBieSByZWZlcmVuY2UgaW4gcmVnaXN0ZXIgbnVtYmVyCitAdmFye3JlZ2lzdGVyLW51bWJlcn0uCisKK0BpdGVtIHQgQHZhcntyZWdpc3Rlci1udW1iZXJ9CitUaGUgYm91bmQgaXMgcGFzc2VkIGJ5IHZhbHVlIGluIHJlZ2lzdGVyIG51bWJlciBAdmFye3JlZ2lzdGVyLW51bWJlcn0uCisKK0BpdGVtIEoKK1RoZXJlIGlzIG5vIGJvdW5kLgorQGVuZCB0YWJsZQorCitTdWJyYW5nZXMgYXJlIGFsc28gdXNlZCBmb3IgYnVpbHRpbiB0eXBlczsgc2VlIEByZWZ7VHJhZGl0aW9uYWwgQnVpbHRpbiBUeXBlc30uCisKK0Bub2RlIEFycmF5cworQHNlY3Rpb24gQXJyYXkgVHlwZXMKKworQXJyYXlzIHVzZSB0aGUgQHNhbXB7YX0gdHlwZSBkZXNjcmlwdG9yLiAgRm9sbG93aW5nIHRoZSB0eXBlIGRlc2NyaXB0b3IKK2lzIHRoZSB0eXBlIG9mIHRoZSBpbmRleCBhbmQgdGhlIHR5cGUgb2YgdGhlIGFycmF5IGVsZW1lbnRzLiAgSWYgdGhlCitpbmRleCB0eXBlIGlzIGEgcmFuZ2UgdHlwZSwgaXQgZW5kcyBpbiBhIHNlbWljb2xvbjsgb3RoZXJ3aXNlCisoZm9yIGV4YW1wbGUsIGlmIGl0IGlzIGEgdHlwZSByZWZlcmVuY2UpLCB0aGVyZSBkb2VzIG5vdAorYXBwZWFyIHRvIGJlIGFueSB3YXkgdG8gdGVsbCB3aGVyZSB0aGUgdHlwZXMgYXJlIHNlcGFyYXRlZC4gIEluIGFuCitlZmZvcnQgdG8gY2xlYW4gdXAgdGhpcyBtZXNzLCBJQk0gZG9jdW1lbnRzIHRoZSB0d28gdHlwZXMgYXMgYmVpbmcKK3NlcGFyYXRlZCBieSBhIHNlbWljb2xvbiwgYW5kIGEgcmFuZ2UgdHlwZSBhcyBub3QgZW5kaW5nIGluIGEgc2VtaWNvbG9uCisoYnV0IHRoaXMgaXMgbm90IHJpZ2h0IGZvciByYW5nZSB0eXBlcyB3aGljaCBhcmUgbm90IGFycmF5IGluZGV4ZXMsCitAcHhyZWZ7U3VicmFuZ2VzfSkuICBJIHRoaW5rIHByb2JhYmx5IHRoZSBiZXN0IHNvbHV0aW9uIGlzIHRvIHNwZWNpZnkKK3RoYXQgYSBzZW1pY29sb24gZW5kcyBhIHJhbmdlIHR5cGUsIGFuZCB0aGF0IHRoZSBpbmRleCB0eXBlIGFuZCBlbGVtZW50Cit0eXBlIG9mIGFuIGFycmF5IGFyZSBzZXBhcmF0ZWQgYnkgYSBzZW1pY29sb24sIGJ1dCB0aGF0IGlmIHRoZSBpbmRleAordHlwZSBpcyBhIHJhbmdlIHR5cGUsIHRoZSBleHRyYSBzZW1pY29sb24gY2FuIGJlIG9taXR0ZWQuICBHREIgKGF0IGxlYXN0Cit0aHJvdWdoIHZlcnNpb24gNC45KSBkb2Vzbid0IHN1cHBvcnQgYW55IGtpbmQgb2YgaW5kZXggdHlwZSBvdGhlciB0aGFuIGEKK3JhbmdlIGFueXdheTsgSSdtIG5vdCBzdXJlIGFib3V0IGRieC4KKworSXQgaXMgd2VsbCBlc3RhYmxpc2hlZCwgYW5kIHdpZGVseSB1c2VkLCB0aGF0IHRoZSB0eXBlIG9mIHRoZSBpbmRleCwKK3VubGlrZSBtb3N0IHR5cGVzIGZvdW5kIGluIHRoZSBzdGFicywgaXMgbWVyZWx5IGEgdHlwZSBkZWZpbml0aW9uLCBub3QKK3R5cGUgaW5mb3JtYXRpb24gKEBweHJlZntTdHJpbmcgRmllbGR9KSAodGhhdCBpcywgaXQgbmVlZCBub3Qgc3RhcnQgd2l0aAorQHNhbXB7QHZhcnt0eXBlLW51bWJlcn09fSBpZiBpdCBpcyBkZWZpbmluZyBhIG5ldyB0eXBlKS4gIEFjY29yZGluZyB0byBhCitjb21tZW50IGluIEdEQiwgdGhpcyBpcyBhbHNvIHRydWUgb2YgdGhlIHR5cGUgb2YgdGhlIGFycmF5IGVsZW1lbnRzOyBpdAorZ2l2ZXMgQHNhbXB7YXIxOzE7MTA7YXIxOzE7MTA7NH0gYXMgYSBsZWdpdGltYXRlIHdheSB0byBleHByZXNzIGEgdHdvCitkaW1lbnNpb25hbCBhcnJheS4gIEFjY29yZGluZyB0byBBSVggZG9jdW1lbnRhdGlvbiwgdGhlIGVsZW1lbnQgdHlwZQorbXVzdCBiZSB0eXBlIGluZm9ybWF0aW9uLiAgR0RCIGFjY2VwdHMgZWl0aGVyLgorCitUaGUgdHlwZSBvZiB0aGUgaW5kZXggaXMgb2Z0ZW4gYSByYW5nZSB0eXBlLCBleHByZXNzZWQgYXMgdGhlIHR5cGUKK2Rlc2NyaXB0b3IgQHNhbXB7cn0gYW5kIHNvbWUgcGFyYW1ldGVycy4gIEl0IGRlZmluZXMgdGhlIHNpemUgb2YgdGhlCithcnJheS4gIEluIHRoZSBleGFtcGxlIGJlbG93LCB0aGUgcmFuZ2UgQHNhbXB7cjE7MDsyO30gZGVmaW5lcyBhbiBpbmRleAordHlwZSB3aGljaCBpcyBhIHN1YnJhbmdlIG9mIHR5cGUgMSAoaW50ZWdlciksIHdpdGggYSBsb3dlciBib3VuZCBvZiAwCithbmQgYW4gdXBwZXIgYm91bmQgb2YgMi4gIFRoaXMgZGVmaW5lcyB0aGUgdmFsaWQgcmFuZ2Ugb2Ygc3Vic2NyaXB0cyBvZgorYSB0aHJlZS1lbGVtZW50IEMgYXJyYXkuCisKK0ZvciBleGFtcGxlLCB0aGUgZGVmaW5pdGlvbjoKKworQGV4YW1wbGUKK2NoYXIgY2hhcl92ZWNbM10gPSBAeydhJywnYicsJ2MnQH07CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50Citwcm9kdWNlcyB0aGUgb3V0cHV0OgorCitAZXhhbXBsZQorLnN0YWJzICJjaGFyX3ZlYzpHMTk9YXIxOzA7MjsyIiwzMiwwLDAsMAorICAgICAuZ2xvYmFsIF9jaGFyX3ZlYworICAgICAuYWxpZ24gNAorX2NoYXJfdmVjOgorICAgICAuYnl0ZSA5NworICAgICAuYnl0ZSA5OAorICAgICAuYnl0ZSA5OQorQGVuZCBleGFtcGxlCisKK0lmIGFuIGFycmF5IGlzIEBkZm57cGFja2VkfSwgdGhlIGVsZW1lbnRzIGFyZSBzcGFjZWQgbW9yZQorY2xvc2VseSB0aGFuIG5vcm1hbCwgc2F2aW5nIG1lbW9yeSBhdCB0aGUgZXhwZW5zZSBvZiBzcGVlZC4gIEZvcgorZXhhbXBsZSwgYW4gYXJyYXkgb2YgMy1ieXRlIG9iamVjdHMgbWlnaHQsIGlmIHVucGFja2VkLCBoYXZlIGVhY2gKK2VsZW1lbnQgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSwgYnV0IGlmIHBhY2tlZCwgaGF2ZSBubyBwYWRkaW5nLgorT25lIHdheSB0byBzcGVjaWZ5IHRoYXQgc29tZXRoaW5nIGlzIHBhY2tlZCBpcyB3aXRoIHR5cGUgYXR0cmlidXRlcworKEBweHJlZntTdHJpbmcgRmllbGR9KS4gIEluIHRoZSBjYXNlIG9mIGFycmF5cywgYW5vdGhlciBpcyB0byB1c2UgdGhlCitAc2FtcHtQfSB0eXBlIGRlc2NyaXB0b3IgaW5zdGVhZCBvZiBAc2FtcHthfS4gIE90aGVyIHRoYW4gc3BlY2lmeWluZyBhCitwYWNrZWQgYXJyYXksIEBzYW1we1B9IGlzIGlkZW50aWNhbCB0byBAc2FtcHthfS4KKworQGMgRklYTUUtd2hhdCBpcyBpdD8gIEEgcG9pbnRlcj8KK0FuIG9wZW4gYXJyYXkgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEBzYW1we0F9IHR5cGUgZGVzY3JpcHRvciBmb2xsb3dlZCBieQordHlwZSBpbmZvcm1hdGlvbiBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIHRoZSBhcnJheSBlbGVtZW50cy4KKworQGMgRklYTUU6IHdoYXQgaXMgdGhlIGZvcm1hdCBvZiB0aGlzIHR5cGU/ICBBIHBvaW50ZXIgdG8gYSB2ZWN0b3Igb2YgcG9pbnRlcnM/CitBbiBOLWRpbWVuc2lvbmFsIGR5bmFtaWMgYXJyYXkgaXMgcmVwcmVzZW50ZWQgYnkKKworQGV4YW1wbGUKK0QgQHZhcntkaW1lbnNpb25zfSA7IEB2YXJ7dHlwZS1pbmZvcm1hdGlvbn0KK0BlbmQgZXhhbXBsZQorCitAYyBEb2VzIGRpbWVuc2lvbnMgcmVhbGx5IGhhdmUgdGhpcyBtZWFuaW5nPyAgVGhlIEFJWCBkb2N1bWVudGF0aW9uCitAYyBkb2Vzbid0IHNheS4KK0B2YXJ7ZGltZW5zaW9uc30gaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zOyBAdmFye3R5cGUtaW5mb3JtYXRpb259CitzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGFycmF5IGVsZW1lbnRzLgorCitAYyBGSVhNRTogd2hhdCBpcyB0aGUgZm9ybWF0IG9mIHRoaXMgdHlwZT8gIEEgcG9pbnRlciB0byBzb21lIG9mZnNldHMgaW4KK0BjIGFub3RoZXIgYXJyYXk/CitBIHN1YmFycmF5IG9mIGFuIE4tZGltZW5zaW9uYWwgYXJyYXkgaXMgcmVwcmVzZW50ZWQgYnkKKworQGV4YW1wbGUKK0UgQHZhcntkaW1lbnNpb25zfSA7IEB2YXJ7dHlwZS1pbmZvcm1hdGlvbn0KK0BlbmQgZXhhbXBsZQorCitAYyBEb2VzIGRpbWVuc2lvbnMgcmVhbGx5IGhhdmUgdGhpcyBtZWFuaW5nPyAgVGhlIEFJWCBkb2N1bWVudGF0aW9uCitAYyBkb2Vzbid0IHNheS4KK0B2YXJ7ZGltZW5zaW9uc30gaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zOyBAdmFye3R5cGUtaW5mb3JtYXRpb259CitzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGFycmF5IGVsZW1lbnRzLgorCitAbm9kZSBTdHJpbmdzCitAc2VjdGlvbiBTdHJpbmdzCisKK1NvbWUgbGFuZ3VhZ2VzLCBsaWtlIEMgb3IgdGhlIG9yaWdpbmFsIFBhc2NhbCwgZG8gbm90IGhhdmUgc3RyaW5nIHR5cGVzLAordGhleSBqdXN0IGhhdmUgcmVsYXRlZCB0aGluZ3MgbGlrZSBhcnJheXMgb2YgY2hhcmFjdGVycy4gIEJ1dCBtb3N0CitQYXNjYWxzIGFuZCB2YXJpb3VzIG90aGVyIGxhbmd1YWdlcyBoYXZlIHN0cmluZyB0eXBlcywgd2hpY2ggYXJlCitpbmRpY2F0ZWQgYXMgZm9sbG93czoKKworQHRhYmxlIEBjb2RlCitAaXRlbSBuIEB2YXJ7dHlwZS1pbmZvcm1hdGlvbn0gOyBAdmFye2J5dGVzfQorQHZhcntieXRlc30gaXMgdGhlIG1heGltdW0gbGVuZ3RoLiAgSSdtIG5vdCBzdXJlIHdoYXQKK0B2YXJ7dHlwZS1pbmZvcm1hdGlvbn0gaXM7IEkgc3VzcGVjdCB0aGF0IGl0IG1lYW5zIHRoYXQgdGhpcyBpcyBhIHN0cmluZworb2YgQHZhcnt0eXBlLWluZm9ybWF0aW9ufSAodGh1cyBhbGxvd2luZyBhIHN0cmluZyBvZiBpbnRlZ2VycywgYSBzdHJpbmcKK29mIHdpZGUgY2hhcmFjdGVycywgZXRjLiwgYXMgd2VsbCBhcyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzKS4gIE5vdCBzdXJlCit3aGF0IHRoZSBmb3JtYXQgb2YgdGhpcyB0eXBlIGlzLiAgVGhpcyBpcyBhbiBBSVggZmVhdHVyZS4KKworQGl0ZW0geiBAdmFye3R5cGUtaW5mb3JtYXRpb259IDsgQHZhcntieXRlc30KK0p1c3QgbGlrZSBAc2FtcHtufSBleGNlcHQgdGhhdCB0aGlzIGlzIGEgZ3N0cmluZywgbm90IGFuIG9yZGluYXJ5CitzdHJpbmcuICBJIGRvbid0IGtub3cgdGhlIGRpZmZlcmVuY2UuCisKK0BpdGVtIE4KK1Bhc2NhbCBTdHJpbmdwdHIuICBXaGF0IGlzIHRoaXM/ICBUaGlzIGlzIGFuIEFJWCBmZWF0dXJlLgorQGVuZCB0YWJsZQorCitMYW5ndWFnZXMsIHN1Y2ggYXMgQ0hJTEwgd2hpY2ggaGF2ZSBhIHN0cmluZyB0eXBlIHdoaWNoIGlzIGJhc2ljYWxseQoranVzdCBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzIHVzZSB0aGUgQHNhbXB7U30gdHlwZSBhdHRyaWJ1dGUKKyhAcHhyZWZ7U3RyaW5nIEZpZWxkfSkuCisKK0Bub2RlIEVudW1lcmF0aW9ucworQHNlY3Rpb24gRW51bWVyYXRpb25zCisKK0VudW1lcmF0aW9ucyBhcmUgZGVmaW5lZCB3aXRoIHRoZSBAc2FtcHtlfSB0eXBlIGRlc2NyaXB0b3IuCisKK0BjIEZJWE1FOiBXaGVyZSBkb2VzIHRoaXMgaW5mb3JtYXRpb24gcHJvcGVybHkgZ28/ICBQZXJoYXBzIGl0IGlzCitAYyByZWR1bmRhbnQgd2l0aCBzb21ldGhpbmcgd2UgYWxyZWFkeSBleHBsYWluLgorVGhlIHNvdXJjZSBsaW5lIGJlbG93IGRlY2xhcmVzIGFuIGVudW1lcmF0aW9uIHR5cGUgYXQgZmlsZSBzY29wZS4KK1RoZSB0eXBlIGRlZmluaXRpb24gaXMgbG9jYXRlZCBhZnRlciB0aGUgQGNvZGV7Tl9SQlJBQ30gdGhhdCBtYXJrcyB0aGUgZW5kIG9mCit0aGUgcHJldmlvdXMgcHJvY2VkdXJlJ3MgYmxvY2sgc2NvcGUsIGFuZCBiZWZvcmUgdGhlIEBjb2Rle05fRlVOfSB0aGF0IG1hcmtzCit0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHByb2NlZHVyZSdzIGJsb2NrIHNjb3BlLiAgVGhlcmVmb3JlIGl0IGRvZXMgbm90CitkZXNjcmliZSBhIGJsb2NrIGxvY2FsIHN5bWJvbCwgYnV0IGEgZmlsZSBsb2NhbCBvbmUuCisKK1RoZSBzb3VyY2UgbGluZToKKworQGV4YW1wbGUKK2VudW0gZV9wbGFjZXMgQHtmaXJzdCxzZWNvbmQ9MyxsYXN0QH07CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitnZW5lcmF0ZXMgdGhlIGZvbGxvd2luZyBzdGFiOgorCitAZXhhbXBsZQorLnN0YWJzICJlX3BsYWNlczpUMjI9ZWZpcnN0OjAsc2Vjb25kOjMsbGFzdDo0LDsiLDEyOCwwLDAsMAorQGVuZCBleGFtcGxlCisKK1RoZSBzeW1ib2wgZGVzY3JpcHRvciAoQHNhbXB7VH0pIHNheXMgdGhhdCB0aGUgc3RhYiBkZXNjcmliZXMgYQorc3RydWN0dXJlLCBlbnVtZXJhdGlvbiwgb3IgdW5pb24gdGFnLiAgVGhlIHR5cGUgZGVzY3JpcHRvciBAc2FtcHtlfSwKK2ZvbGxvd2luZyB0aGUgQHNhbXB7MjI9fSBvZiB0aGUgdHlwZSBkZWZpbml0aW9uIG5hcnJvd3MgaXQgZG93biB0byBhbgorZW51bWVyYXRpb24gdHlwZS4gIEZvbGxvd2luZyB0aGUgQHNhbXB7ZX0gaXMgYSBsaXN0IG9mIHRoZSBlbGVtZW50cyBvZgordGhlIGVudW1lcmF0aW9uLiAgVGhlIGZvcm1hdCBpcyBAc2FtcHtAdmFye25hbWV9OkB2YXJ7dmFsdWV9LH0uICBUaGUKK2xpc3Qgb2YgZWxlbWVudHMgZW5kcyB3aXRoIEBzYW1wezt9LiAgVGhlIGZhY3QgdGhhdCBAdmFye3ZhbHVlfSBpcworc3BlY2lmaWVkIGFzIGFuIGludGVnZXIgY2FuIGNhdXNlIHByb2JsZW1zIGlmIHRoZSB2YWx1ZSBpcyBsYXJnZS4gIEdDQworMi41LjIgdHJpZXMgdG8gb3V0cHV0IGl0IGluIG9jdGFsIGluIHRoYXQgY2FzZSB3aXRoIGEgbGVhZGluZyB6ZXJvLAord2hpY2ggaXMgcHJvYmFibHkgYSBnb29kIHRoaW5nLCBhbHRob3VnaCBHREIgNC4xMSBzdXBwb3J0cyBvY3RhbCBvbmx5IGluCitjYXNlcyB3aGVyZSBkZWNpbWFsIGlzIHBlcmZlY3RseSBnb29kLiAgTmVnYXRpdmUgZGVjaW1hbCB2YWx1ZXMgYXJlCitzdXBwb3J0ZWQgYnkgYm90aCBHREIgYW5kIGRieC4KKworVGhlcmUgaXMgbm8gc3RhbmRhcmQgd2F5IHRvIHNwZWNpZnkgdGhlIHNpemUgb2YgYW4gZW51bWVyYXRpb24gdHlwZTsgaXQKK2lzIGRldGVybWluZWQgYnkgdGhlIGFyY2hpdGVjdHVyZSAobm9ybWFsbHkgYWxsIGVudW1lcmF0aW9ucyB0eXBlcyBhcmUKKzMyIGJpdHMpLiAgVHlwZSBhdHRyaWJ1dGVzIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gZW51bWVyYXRpb24gdHlwZSBvZgorYW5vdGhlciBzaXplIGZvciBkZWJ1Z2dlcnMgd2hpY2ggc3VwcG9ydCB0aGVtOyBzZWUgQHJlZntTdHJpbmcgRmllbGR9LgorCitFbnVtZXJhdGlvbiB0eXBlcyBhcmUgdW51c3VhbCBpbiB0aGF0IHRoZXkgZGVmaW5lIHN5bWJvbHMgZm9yIHRoZQorZW51bWVyYXRpb24gdmFsdWVzIChAY29kZXtmaXJzdH0sIEBjb2Rle3NlY29uZH0sIGFuZCBAY29kZXt0aGlyZH0gaW4gdGhlCithYm92ZSBleGFtcGxlKSwgYW5kIGV2ZW4gdGhvdWdoIHRoZXNlIHN5bWJvbHMgYXJlIHZpc2libGUgaW4gdGhlIGZpbGUgYXMKK2Egd2hvbGUgKHJhdGhlciB0aGFuIGJlaW5nIGluIGEgbW9yZSBsb2NhbCBuYW1lc3BhY2UgbGlrZSBzdHJ1Y3R1cmUKK21lbWJlciBuYW1lcyksIHRoZXkgYXJlIGRlZmluZWQgaW4gdGhlIHR5cGUgZGVmaW5pdGlvbiBmb3IgdGhlCitlbnVtZXJhdGlvbiB0eXBlIHJhdGhlciB0aGFuIGVhY2ggaGF2aW5nIHRoZWlyIG93biBzeW1ib2wuICBJbiBvcmRlciB0bworYmUgZmFzdCwgR0RCIHdpbGwgb25seSBnZXQgc3ltYm9scyBmcm9tIHN1Y2ggdHlwZXMgKGluIGl0cyBpbml0aWFsIHNjYW4KK29mIHRoZSBzdGFicykgaWYgdGhlIHR5cGUgaXMgdGhlIGZpcnN0IHRoaW5nIGRlZmluZWQgYWZ0ZXIgYSBAc2FtcHtUfSBvcgorQHNhbXB7dH0gc3ltYm9sIGRlc2NyaXB0b3IgKHRoZSBhYm92ZSBleGFtcGxlIGZ1bGZpbGxzIHRoaXMKK3JlcXVpcmVtZW50KS4gIElmIHRoZSB0eXBlIGRvZXMgbm90IGhhdmUgYSBuYW1lLCB0aGUgY29tcGlsZXIgc2hvdWxkCitlbWl0IGl0IGluIGEgbmFtZWxlc3Mgc3RhYiAoQHB4cmVme1N0cmluZyBGaWVsZH0pOyBHQ0MgZG9lcyB0aGlzLgorCitAbm9kZSBTdHJ1Y3R1cmVzCitAc2VjdGlvbiBTdHJ1Y3R1cmVzCisKK1RoZSBlbmNvZGluZyBvZiBzdHJ1Y3R1cmVzIGluIHN0YWJzIGNhbiBiZSBzaG93biB3aXRoIGFuIGV4YW1wbGUuCisKK1RoZSBmb2xsb3dpbmcgc291cmNlIGNvZGUgZGVjbGFyZXMgYSBzdHJ1Y3R1cmUgdGFnIGFuZCBkZWZpbmVzIGFuCitpbnN0YW5jZSBvZiB0aGUgc3RydWN0dXJlIGluIGdsb2JhbCBzY29wZS4gVGhlbiBhIEBjb2Rle3R5cGVkZWZ9IGVxdWF0ZXMgdGhlCitzdHJ1Y3R1cmUgdGFnIHdpdGggYSBuZXcgdHlwZS4gIFNlcGVyYXRlIHN0YWJzIGFyZSBnZW5lcmF0ZWQgZm9yIHRoZQorc3RydWN0dXJlIHRhZywgdGhlIHN0cnVjdHVyZSBAY29kZXt0eXBlZGVmfSwgYW5kIHRoZSBzdHJ1Y3R1cmUgaW5zdGFuY2UuICBUaGUKK3N0YWJzIGZvciB0aGUgdGFnIGFuZCB0aGUgQGNvZGV7dHlwZWRlZn0gYXJlIGVtaXRlZCB3aGVuIHRoZSBkZWZpbml0aW9ucyBhcmUKK2VuY291bnRlcmVkLiAgU2luY2UgdGhlIHN0cnVjdHVyZSBlbGVtZW50cyBhcmUgbm90IGluaXRpYWxpemVkLCB0aGUKK3N0YWIgYW5kIGNvZGUgZm9yIHRoZSBzdHJ1Y3R1cmUgdmFyaWFibGUgaXRzZWxmIGlzIGxvY2F0ZWQgYXQgdGhlIGVuZAorb2YgdGhlIHByb2dyYW0gaW4gdGhlIGJzcyBzZWN0aW9uLgorCitAZXhhbXBsZQorc3RydWN0IHNfdGFnIEB7CisgIGludCAgIHNfaW50OworICBmbG9hdCBzX2Zsb2F0OworICBjaGFyICBzX2NoYXJfdmVjWzhdOworICBzdHJ1Y3Qgc190YWcqIHNfbmV4dDsKK0B9IGdfYW5fczsKKwordHlwZWRlZiBzdHJ1Y3Qgc190YWcgc190eXBlZGVmOworQGVuZCBleGFtcGxlCisKK1RoZSBzdHJ1Y3R1cmUgdGFnIGhhcyBhbiBAY29kZXtOX0xTWU19IHN0YWIgdHlwZSBiZWNhdXNlLCBsaWtlIHRoZQorZW51bWVyYXRpb24sIHRoZSBzeW1ib2wgaGFzIGZpbGUgc2NvcGUuICBMaWtlIHRoZSBlbnVtZXJhdGlvbiwgdGhlCitzeW1ib2wgZGVzY3JpcHRvciBpcyBAc2FtcHtUfSwgZm9yIGVudW1lcmF0aW9uLCBzdHJ1Y3R1cmUsIG9yIHRhZyB0eXBlLgorVGhlIHR5cGUgZGVzY3JpcHRvciBAc2FtcHtzfSBmb2xsb3dpbmcgdGhlIEBzYW1wezE2PX0gb2YgdGhlIHR5cGUKK2RlZmluaXRpb24gbmFycm93cyB0aGUgc3ltYm9sIHR5cGUgdG8gc3RydWN0dXJlLgorCitGb2xsb3dpbmcgdGhlIEBzYW1we3N9IHR5cGUgZGVzY3JpcHRvciBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZQorc3RydWN0dXJlIG9jY3VwaWVzLCBmb2xsb3dlZCBieSBhIGRlc2NyaXB0aW9uIG9mIGVhY2ggc3RydWN0dXJlIGVsZW1lbnQuCitUaGUgc3RydWN0dXJlIGVsZW1lbnQgZGVzY3JpcHRpb25zIGFyZSBvZiB0aGUgZm9ybSBAdmFye25hbWU6dHlwZSwgYml0CitvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHN0cnVjdCwgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGVsZW1lbnR9LgorCitAYyBGSVhNRTogcGhvbnkgbGluZSBicmVhay4gIENhbiBwcm9iYWJseSBiZSBmaXhlZCBieSB1c2luZyBhbiBleGFtcGxlCitAYyB3aXRoIGZld2VyIGZpZWxkcy4KK0BleGFtcGxlCisjIEByezEyOCBpcyBOX0xTWU19Cisuc3RhYnMgInNfdGFnOlQxNj1zMjBzX2ludDoxLDAsMzI7c19mbG9hdDoxMiwzMiwzMjsKKyAgICAgICAgc19jaGFyX3ZlYzoxNz1hcjE7MDs3OzIsNjQsNjQ7c19uZXh0OjE4PSoxNiwxMjgsMzI7OyIsMTI4LDAsMCwwCitAZW5kIGV4YW1wbGUKKworSW4gdGhpcyBleGFtcGxlLCB0aGUgZmlyc3QgdHdvIHN0cnVjdHVyZSBlbGVtZW50cyBhcmUgcHJldmlvdXNseSBkZWZpbmVkCit0eXBlcy4gIEZvciB0aGVzZSwgdGhlIHR5cGUgZm9sbG93aW5nIHRoZSBAc2FtcHtAdmFye25hbWV9On0gcGFydCBvZiB0aGUKK2VsZW1lbnQgZGVzY3JpcHRpb24gaXMgYSBzaW1wbGUgdHlwZSByZWZlcmVuY2UuICBUaGUgb3RoZXIgdHdvIHN0cnVjdHVyZQorZWxlbWVudHMgYXJlIG5ldyB0eXBlcy4gIEluIHRoaXMgY2FzZSB0aGVyZSBpcyBhIHR5cGUgZGVmaW5pdGlvbgorZW1iZWRkZWQgYWZ0ZXIgdGhlIEBzYW1we0B2YXJ7bmFtZX06fS4gIFRoZSB0eXBlIGRlZmluaXRpb24gZm9yIHRoZQorYXJyYXkgZWxlbWVudCBsb29rcyBqdXN0IGxpa2UgYSB0eXBlIGRlZmluaXRpb24gZm9yIGEgc3RhbmRhbG9uZSBhcnJheS4KK1RoZSBAY29kZXtzX25leHR9IGZpZWxkIGlzIGEgcG9pbnRlciB0byB0aGUgc2FtZSBraW5kIG9mIHN0cnVjdHVyZSB0aGF0Cit0aGUgZmllbGQgaXMgYW4gZWxlbWVudCBvZi4gIFNvIHRoZSBkZWZpbml0aW9uIG9mIHN0cnVjdHVyZSB0eXBlIDE2Citjb250YWlucyBhIHR5cGUgZGVmaW5pdGlvbiBmb3IgYW4gZWxlbWVudCB3aGljaCBpcyBhIHBvaW50ZXIgdG8gdHlwZSAxNi4KKworSWYgYSBmaWVsZCBpcyBhIHN0YXRpYyBtZW1iZXIgKHRoaXMgaXMgYSBDKysgZmVhdHVyZSBpbiB3aGljaCBhIHNpbmdsZQordmFyaWFibGUgYXBwZWFycyB0byBiZSBhIGZpZWxkIG9mIGV2ZXJ5IHN0cnVjdHVyZSBvZiBhIGdpdmVuIHR5cGUpIGl0CitzdGlsbCBzdGFydHMgb3V0IHdpdGggdGhlIGZpZWxkIG5hbWUsIGEgY29sb24sIGFuZCB0aGUgdHlwZSwgYnV0IHRoZW4KK2luc3RlYWQgb2YgYSBjb21tYSwgYml0IHBvc2l0aW9uLCBjb21tYSwgYW5kIGJpdCBzaXplLCB0aGVyZSBpcyBhIGNvbG9uCitmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgd2hpY2ggZWFjaCBzdWNoIGZpZWxkIHJlZmVycyB0by4KKworSWYgdGhlIHN0cnVjdHVyZSBoYXMgbWV0aG9kcyAoYSBDKysgZmVhdHVyZSksIHRoZXkgZm9sbG93IHRoZSBub24tbWV0aG9kCitmaWVsZHM7IHNlZSBAcmVme0NwbHVzcGx1c30uCisKK0Bub2RlIFR5cGVkZWZzCitAc2VjdGlvbiBHaXZpbmcgYSBUeXBlIGEgTmFtZQorCitAZmluZGV4IE5fTFNZTSwgZm9yIHR5cGVzCitAZmluZGV4IENfREVDTCwgZm9yIHR5cGVzCitUbyBnaXZlIGEgdHlwZSBhIG5hbWUsIHVzZSB0aGUgQHNhbXB7dH0gc3ltYm9sIGRlc2NyaXB0b3IuICBUaGUgdHlwZQoraXMgc3BlY2lmaWVkIGJ5IHRoZSB0eXBlIGluZm9ybWF0aW9uIChAcHhyZWZ7U3RyaW5nIEZpZWxkfSkgZm9yIHRoZSBzdGFiLgorRm9yIGV4YW1wbGUsCisKK0BleGFtcGxlCisuc3RhYnMgInNfdHlwZWRlZjp0MTYiLDEyOCwwLDAsMCAgICAgIyBAcnsxMjggaXMgTl9MU1lNfQorQGVuZCBleGFtcGxlCisKK3NwZWNpZmllcyB0aGF0IEBjb2Rle3NfdHlwZWRlZn0gcmVmZXJzIHRvIHR5cGUgbnVtYmVyIDE2LiAgU3VjaCBzdGFicworaGF2ZSBzeW1ib2wgdHlwZSBAY29kZXtOX0xTWU19IChvciBAY29kZXtDX0RFQ0x9IGZvciBYQ09GRikuICAoVGhlIFN1bgorZG9jdW1lbnRhdGlvbiBtZW50aW9ucyB1c2luZyBAY29kZXtOX0dTWU19IGluIHNvbWUgY2FzZXMpLgorCitJZiB5b3UgYXJlIHNwZWNpZnlpbmcgdGhlIHRhZyBuYW1lIGZvciBhIHN0cnVjdHVyZSwgdW5pb24sIG9yCitlbnVtZXJhdGlvbiwgdXNlIHRoZSBAc2FtcHtUfSBzeW1ib2wgZGVzY3JpcHRvciBpbnN0ZWFkLiAgSSBiZWxpZXZlIEMgaXMKK3RoZSBvbmx5IGxhbmd1YWdlIHdpdGggdGhpcyBmZWF0dXJlLgorCitJZiB0aGUgdHlwZSBpcyBhbiBvcGFxdWUgdHlwZSAoSSBiZWxpZXZlIHRoaXMgaXMgYSBNb2R1bGEtMiBmZWF0dXJlKSwKK0FJWCBwcm92aWRlcyBhIHR5cGUgZGVzY3JpcHRvciB0byBzcGVjaWZ5IGl0LiAgVGhlIHR5cGUgZGVzY3JpcHRvciBpcworQHNhbXB7b30gYW5kIGlzIGZvbGxvd2VkIGJ5IGEgbmFtZS4gIEkgZG9uJ3Qga25vdyB3aGF0IHRoZSBuYW1lCittZWFucy0tLWlzIGl0IGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSwgb3IgaXMgdGhpcyB0eXBlCitkZXNjcmlwdG9yIHVzZWQgd2l0aCBhIG5hbWVsZXNzIHN0YWIgKEBweHJlZntTdHJpbmcgRmllbGR9KT8gIFRoZXJlCitvcHRpb25hbGx5IGZvbGxvd3MgYSBjb21tYSBmb2xsb3dlZCBieSB0eXBlIGluZm9ybWF0aW9uIHdoaWNoIGRlZmluZXMKK3RoZSB0eXBlIG9mIHRoaXMgdHlwZS4gIElmIG9taXR0ZWQsIGEgc2VtaWNvbG9uIGlzIHVzZWQgaW4gcGxhY2Ugb2YgdGhlCitjb21tYSBhbmQgdGhlIHR5cGUgaW5mb3JtYXRpb24sIGFuZCB0aGUgdHlwZSBpcyBtdWNoIGxpa2UgYSBnZW5lcmljCitwb2ludGVyIHR5cGUtLS1pdCBoYXMgYSBrbm93biBzaXplIGJ1dCBsaXR0bGUgZWxzZSBhYm91dCBpdCBpcworc3BlY2lmaWVkLgorCitAbm9kZSBVbmlvbnMKK0BzZWN0aW9uIFVuaW9ucworCitAZXhhbXBsZQordW5pb24gdV90YWcgQHsKKyAgaW50ICB1X2ludDsKKyAgZmxvYXQgdV9mbG9hdDsKKyAgY2hhciogdV9jaGFyOworQH0gYW5fdTsKK0BlbmQgZXhhbXBsZQorCitUaGlzIGNvZGUgZ2VuZXJhdGVzIGEgc3RhYiBmb3IgYSB1bmlvbiB0YWcgYW5kIGEgc3RhYiBmb3IgYSB1bmlvbgordmFyaWFibGUuICBCb3RoIHVzZSB0aGUgQGNvZGV7Tl9MU1lNfSBzdGFiIHR5cGUuICBJZiBhIHVuaW9uIHZhcmlhYmxlIGlzCitzY29wZWQgbG9jYWxseSB0byB0aGUgcHJvY2VkdXJlIGluIHdoaWNoIGl0IGlzIGRlZmluZWQsIGl0cyBzdGFiIGlzCitsb2NhdGVkIGltbWVkaWF0ZWx5IHByZWNlZGluZyB0aGUgQGNvZGV7Tl9MQlJBQ30gZm9yIHRoZSBwcm9jZWR1cmUncyBibG9jaworc3RhcnQuCisKK1RoZSBzdGFiIGZvciB0aGUgdW5pb24gdGFnLCBob3dldmVyLCBpcyBsb2NhdGVkIHByZWNlZGluZyB0aGUgY29kZSBmb3IKK3RoZSBwcm9jZWR1cmUgaW4gd2hpY2ggaXQgaXMgZGVmaW5lZC4gIFRoZSBzdGFiIHR5cGUgaXMgQGNvZGV7Tl9MU1lNfS4gIFRoaXMKK3dvdWxkIHNlZW0gdG8gaW1wbHkgdGhhdCB0aGUgdW5pb24gdHlwZSBpcyBmaWxlIHNjb3BlLCBsaWtlIHRoZSBzdHJ1Y3QKK3R5cGUgQGNvZGV7c190YWd9LiAgVGhpcyBpcyBub3QgdHJ1ZS4gIFRoZSBjb250ZW50cyBhbmQgcG9zaXRpb24gb2YgdGhlIHN0YWIKK2ZvciBAY29kZXt1X3R5cGV9IGRvIG5vdCBjb252ZXkgYW55IGluZm9tYXRpb24gYWJvdXQgaXRzIHByb2NlZHVyZSBsb2NhbAorc2NvcGUuCisKK0BjIEZJWE1FOiBwaG9ueSBsaW5lIGJyZWFrLiAgQ2FuIHByb2JhYmx5IGJlIGZpeGVkIGJ5IHVzaW5nIGFuIGV4YW1wbGUKK0BjIHdpdGggZmV3ZXIgZmllbGRzLgorQHNtYWxsZXhhbXBsZQorIyBAcnsxMjggaXMgTl9MU1lNfQorLnN0YWJzICJ1X3RhZzpUMjM9dTR1X2ludDoxLDAsMzI7dV9mbG9hdDoxMiwwLDMyO3VfY2hhcjoyMSwwLDMyOzsiLAorICAgICAgIDEyOCwwLDAsMAorQGVuZCBzbWFsbGV4YW1wbGUKKworVGhlIHN5bWJvbCBkZXNjcmlwdG9yIEBzYW1we1R9LCBmb2xsb3dpbmcgdGhlIEBzYW1we25hbWU6fSBtZWFucyB0aGF0Cit0aGUgc3RhYiBkZXNjcmliZXMgYW4gZW51bWVyYXRpb24sIHN0cnVjdHVyZSwgb3IgdW5pb24gdGFnLiAgVGhlIHR5cGUKK2Rlc2NyaXB0b3IgQHNhbXB7dX0sIGZvbGxvd2luZyB0aGUgQHNhbXB7MjM9fSBvZiB0aGUgdHlwZSBkZWZpbml0aW9uLAorbmFycm93cyBpdCBkb3duIHRvIGEgdW5pb24gdHlwZSBkZWZpbml0aW9uLiAgRm9sbG93aW5nIHRoZSBAc2FtcHt1fSBpcwordGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgdW5pb24uICBBZnRlciB0aGF0IGlzIGEgbGlzdCBvZiB1bmlvbiBlbGVtZW50CitkZXNjcmlwdGlvbnMuICBUaGVpciBmb3JtYXQgaXMgQHZhcntuYW1lOnR5cGUsIGJpdCBvZmZzZXQgaW50byB0aGUKK3VuaW9uLCBudW1iZXIgb2YgYnl0ZXMgZm9yIHRoZSBlbGVtZW50O30uCisKK1RoZSBzdGFiIGZvciB0aGUgdW5pb24gdmFyaWFibGUgaXM6CisKK0BleGFtcGxlCisuc3RhYnMgImFuX3U6MjMiLDEyOCwwLDAsLTIwICAgICAjIEByezEyOCBpcyBOX0xTWU19CitAZW5kIGV4YW1wbGUKKworQHNhbXB7LTIwfSBzcGVjaWZpZXMgd2hlcmUgdGhlIHZhcmlhYmxlIGlzIHN0b3JlZCAoQHB4cmVme1N0YWNrCitWYXJpYWJsZXN9KS4KKworQG5vZGUgRnVuY3Rpb24gVHlwZXMKK0BzZWN0aW9uIEZ1bmN0aW9uIFR5cGVzCisKK1ZhcmlvdXMgdHlwZXMgY2FuIGJlIGRlZmluZWQgZm9yIGZ1bmN0aW9uIHZhcmlhYmxlcy4gIFRoZXNlIHR5cGVzIGFyZQorbm90IHVzZWQgaW4gZGVmaW5pbmcgZnVuY3Rpb25zIChAcHhyZWZ7UHJvY2VkdXJlc30pOyB0aGV5IGFyZSB1c2VkIGZvcgordGhpbmdzIGxpa2UgcG9pbnRlcnMgdG8gZnVuY3Rpb25zLgorCitUaGUgc2ltcGxlLCB0cmFkaXRpb25hbCwgdHlwZSBpcyB0eXBlIGRlc2NyaXB0b3IgQHNhbXB7Zn0gaXMgZm9sbG93ZWQgYnkKK3R5cGUgaW5mb3JtYXRpb24gZm9yIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24sIGZvbGxvd2VkIGJ5IGEKK3NlbWljb2xvbi4KKworVGhpcyBkb2VzIG5vdCBkZWFsIHdpdGggZnVuY3Rpb25zIGZvciB3aGljaCB0aGUgbnVtYmVyIGFuZCB0eXBlcyBvZiB0aGUKK3BhcmFtZXRlcnMgYXJlIHBhcnQgb2YgdGhlIHR5cGUsIGFzIGluIE1vZHVsYS0yIG9yIEFOU0kgQy4gIEFJWCBwcm92aWRlcworZXh0ZW5zaW9ucyB0byBzcGVjaWZ5IHRoZXNlLCB1c2luZyB0aGUgQHNhbXB7Zn0sIEBzYW1we0Z9LCBAc2FtcHtwfSwgYW5kCitAc2FtcHtSfSB0eXBlIGRlc2NyaXB0b3JzLgorCitGaXJzdCBjb21lcyB0aGUgdHlwZSBkZXNjcmlwdG9yLiAgSWYgaXQgaXMgQHNhbXB7Zn0gb3IgQHNhbXB7Rn0sIHRoaXMKK3R5cGUgaW52b2x2ZXMgYSBmdW5jdGlvbiByYXRoZXIgdGhhbiBhIHByb2NlZHVyZSwgYW5kIHRoZSB0eXBlCitpbmZvcm1hdGlvbiBmb3IgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbiBmb2xsb3dzLCBmb2xsb3dlZCBieSBhCitjb21tYS4gIFRoZW4gY29tZXMgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIHRvIHRoZSBmdW5jdGlvbiBhbmQgYQorc2VtaWNvbG9uLiAgVGhlbiwgZm9yIGVhY2ggcGFyYW1ldGVyLCB0aGVyZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyCitmb2xsb3dlZCBieSBhIGNvbG9uICh0aGlzIGlzIG9ubHkgcHJlc2VudCBmb3IgdHlwZSBkZXNjcmlwdG9ycyBAc2FtcHtSfQorYW5kIEBzYW1we0Z9IHdoaWNoIHJlcHJlc2VudCBQYXNjYWwgZnVuY3Rpb24gb3IgcHJvY2VkdXJlIHBhcmFtZXRlcnMpLAordHlwZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHBhcmFtZXRlciwgYSBjb21tYSwgMCBpZiBwYXNzZWQgYnkgcmVmZXJlbmNlIG9yCisxIGlmIHBhc3NlZCBieSB2YWx1ZSwgYW5kIGEgc2VtaWNvbG9uLiAgVGhlIHR5cGUgZGVmaW5pdGlvbiBlbmRzIHdpdGggYQorc2VtaWNvbG9uLgorCitGb3IgZXhhbXBsZSwgdGhpcyB2YXJpYWJsZSBkZWZpbml0aW9uOgorCitAZXhhbXBsZQoraW50ICgqZ19wZikoKTsKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK2dlbmVyYXRlcyB0aGUgZm9sbG93aW5nIGNvZGU6CisKK0BleGFtcGxlCisuc3RhYnMgImdfcGY6RzI0PSoyNT1mMSIsMzIsMCwwLDAKKyAgICAuY29tbW9uIF9nX3BmLDQsImJzcyIKK0BlbmQgZXhhbXBsZQorCitUaGUgdmFyaWFibGUgZGVmaW5lcyBhIG5ldyB0eXBlLCAyNCwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIGFub3RoZXIgbmV3Cit0eXBlLCAyNSwgd2hpY2ggaXMgYSBmdW5jdGlvbiByZXR1cm5pbmcgQGNvZGV7aW50fS4KKworQG5vZGUgU3ltYm9sIFRhYmxlcworQGNoYXB0ZXIgU3ltYm9sIEluZm9ybWF0aW9uIGluIFN5bWJvbCBUYWJsZXMKKworVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyB0aGUgZm9ybWF0IG9mIHN5bWJvbCB0YWJsZSBlbnRyaWVzCithbmQgaG93IHN0YWIgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgbWFwIHRvIHRoZW0uICBJdCBhbHNvIGRlc2NyaWJlcyB0aGUKK3RyYW5zZm9ybWF0aW9ucyB0aGF0IHRoZSBhc3NlbWJsZXIgYW5kIGxpbmtlciBtYWtlIG9uIGRhdGEgZnJvbSBzdGFicy4KKworQG1lbnUKKyogU3ltYm9sIFRhYmxlIEZvcm1hdDo6CisqIFRyYW5zZm9ybWF0aW9ucyBPbiBTeW1ib2wgVGFibGVzOjoKK0BlbmQgbWVudQorCitAbm9kZSBTeW1ib2wgVGFibGUgRm9ybWF0CitAc2VjdGlvbiBTeW1ib2wgVGFibGUgRm9ybWF0CisKK0VhY2ggdGltZSB0aGUgYXNzZW1ibGVyIGVuY291bnRlcnMgYSBzdGFiIGRpcmVjdGl2ZSwgaXQgcHV0cworZWFjaCBmaWVsZCBvZiB0aGUgc3RhYiBpbnRvIGEgY29ycmVzcG9uZGluZyBmaWVsZCBpbiBhIHN5bWJvbCB0YWJsZQorZW50cnkgb2YgaXRzIG91dHB1dCBmaWxlLiAgSWYgdGhlIHN0YWIgY29udGFpbnMgYSBzdHJpbmcgZmllbGQsIHRoZQorc3ltYm9sIHRhYmxlIGVudHJ5IGZvciB0aGF0IHN0YWIgcG9pbnRzIHRvIGEgc3RyaW5nIHRhYmxlIGVudHJ5Citjb250YWluaW5nIHRoZSBzdHJpbmcgZGF0YSBmcm9tIHRoZSBzdGFiLiAgQXNzZW1ibGVyIGxhYmVscyBiZWNvbWUKK3JlbG9jYXRhYmxlIGFkZHJlc3Nlcy4gIFN5bWJvbCB0YWJsZSBlbnRyaWVzIGluIGEub3V0IGhhdmUgdGhlIGZvcm1hdDoKKworQGMgRklYTUU6IHNob3VsZCByZWZlciB0byBleHRlcm5hbCwgbm90IGludGVybmFsLgorQGV4YW1wbGUKK3N0cnVjdCBpbnRlcm5hbF9ubGlzdCBAeworICB1bnNpZ25lZCBsb25nIG5fc3RyeDsgICAgICAgICAvKiBpbmRleCBpbnRvIHN0cmluZyB0YWJsZSBvZiBuYW1lICovCisgIHVuc2lnbmVkIGNoYXIgbl90eXBlOyAgICAgICAgIC8qIHR5cGUgb2Ygc3ltYm9sICovCisgIHVuc2lnbmVkIGNoYXIgbl9vdGhlcjsgICAgICAgIC8qIG1pc2MgaW5mbyAodXN1YWxseSBlbXB0eSkgKi8KKyAgdW5zaWduZWQgc2hvcnQgbl9kZXNjOyAgICAgICAgLyogZGVzY3JpcHRpb24gZmllbGQgKi8KKyAgYmZkX3ZtYSBuX3ZhbHVlOyAgICAgICAgICAgICAgLyogdmFsdWUgb2Ygc3ltYm9sICovCitAfTsKK0BlbmQgZXhhbXBsZQorCitJZiB0aGUgc3RhYiBoYXMgYSBzdHJpbmcsIHRoZSBAY29kZXtuX3N0cnh9IGZpZWxkIGhvbGRzIHRoZSBvZmZzZXQgaW4KK2J5dGVzIG9mIHRoZSBzdHJpbmcgd2l0aGluIHRoZSBzdHJpbmcgdGFibGUuICBUaGUgc3RyaW5nIGlzIHRlcm1pbmF0ZWQKK2J5IGEgTlVMIGNoYXJhY3Rlci4gIElmIHRoZSBzdGFiIGxhY2tzIGEgc3RyaW5nIChmb3IgZXhhbXBsZSwgaXQgd2FzCitwcm9kdWNlZCBieSBhIEBjb2Rley5zdGFibn0gb3IgQGNvZGV7LnN0YWJkfSBkaXJlY3RpdmUpLCB0aGUKK0Bjb2Rle25fc3RyeH0gZmllbGQgaXMgemVyby4KKworU3ltYm9sIHRhYmxlIGVudHJpZXMgd2l0aCBAY29kZXtuX3R5cGV9IGZpZWxkIHZhbHVlcyBncmVhdGVyIHRoYW4gMHgxZgorb3JpZ2luYXRlZCBhcyBzdGFicyBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyICh3aXRoIG9uZSByYW5kb20KK2V4Y2VwdGlvbikuICBUaGUgb3RoZXIgZW50cmllcyB3ZXJlIHBsYWNlZCBpbiB0aGUgc3ltYm9sIHRhYmxlIG9mIHRoZQorZXhlY3V0YWJsZSBieSB0aGUgYXNzZW1ibGVyIG9yIHRoZSBsaW5rZXIuCisKK0Bub2RlIFRyYW5zZm9ybWF0aW9ucyBPbiBTeW1ib2wgVGFibGVzCitAc2VjdGlvbiBUcmFuc2Zvcm1hdGlvbnMgb24gU3ltYm9sIFRhYmxlcworCitUaGUgbGlua2VyIGNvbmNhdGVuYXRlcyBvYmplY3QgZmlsZXMgYW5kIGRvZXMgZml4dXBzIG9mIGV4dGVybmFsbHkKK2RlZmluZWQgc3ltYm9scy4KKworWW91IGNhbiBzZWUgdGhlIHRyYW5zZm9ybWF0aW9ucyBtYWRlIG9uIHN0YWIgZGF0YSBieSB0aGUgYXNzZW1ibGVyIGFuZAorbGlua2VyIGJ5IGV4YW1pbmluZyB0aGUgc3ltYm9sIHRhYmxlIGFmdGVyIGVhY2ggcGFzcyBvZiB0aGUgYnVpbGQuICBUbworZG8gdGhpcywgdXNlIEBzYW1we25tIC1hcH0sIHdoaWNoIGR1bXBzIHRoZSBzeW1ib2wgdGFibGUsIGluY2x1ZGluZworZGVidWdnaW5nIGluZm9ybWF0aW9uLCB1bnNvcnRlZC4gIEZvciBzdGFiIGVudHJpZXMgdGhlIGNvbHVtbnMgYXJlOgorQHZhcnt2YWx1ZX0sIEB2YXJ7b3RoZXJ9LCBAdmFye2Rlc2N9LCBAdmFye3R5cGV9LCBAdmFye3N0cmluZ30uICBGb3IKK2Fzc2VtYmxlciBhbmQgbGlua2VyIHN5bWJvbHMsIHRoZSBjb2x1bW5zIGFyZTogQHZhcnt2YWx1ZX0sIEB2YXJ7dHlwZX0sCitAdmFye3N0cmluZ30uCisKK1RoZSBsb3cgNSBiaXRzIG9mIHRoZSBzdGFiIHR5cGUgdGVsbCB0aGUgbGlua2VyIGhvdyB0byByZWxvY2F0ZSB0aGUKK3ZhbHVlIG9mIHRoZSBzdGFiLiAgVGh1cyBmb3Igc3RhYiB0eXBlcyBsaWtlIEBjb2Rle05fUlNZTX0gYW5kCitAY29kZXtOX0xTWU19LCB3aGVyZSB0aGUgdmFsdWUgaXMgYW4gb2Zmc2V0IG9yIGEgcmVnaXN0ZXIgbnVtYmVyLCB0aGUKK2xvdyA1IGJpdHMgYXJlIEBjb2Rle05fQUJTfSwgd2hpY2ggdGVsbHMgdGhlIGxpbmtlciBub3QgdG8gcmVsb2NhdGUgdGhlCit2YWx1ZS4KKworV2hlcmUgdGhlIHZhbHVlIG9mIGEgc3RhYiBjb250YWlucyBhbiBhc3NlbWJseSBsYW5ndWFnZSBsYWJlbCwKK2l0IGlzIHRyYW5zZm9ybWVkIGJ5IGVhY2ggYnVpbGQgc3RlcC4gIFRoZSBhc3NlbWJsZXIgdHVybnMgaXQgaW50byBhCityZWxvY2F0YWJsZSBhZGRyZXNzIGFuZCB0aGUgbGlua2VyIHR1cm5zIGl0IGludG8gYW4gYWJzb2x1dGUgYWRkcmVzcy4KKworQG1lbnUKKyogVHJhbnNmb3JtYXRpb25zIE9uIFN0YXRpYyBWYXJpYWJsZXM6OgorKiBUcmFuc2Zvcm1hdGlvbnMgT24gR2xvYmFsIFZhcmlhYmxlczo6CisqIFN0YWIgU2VjdGlvbiBUcmFuc2Zvcm1hdGlvbnM6OgkgICBGb3Igc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5ncyBhcmUgYSBiaXQgZGlmZmVyZW50LgorQGVuZCBtZW51CisKK0Bub2RlIFRyYW5zZm9ybWF0aW9ucyBPbiBTdGF0aWMgVmFyaWFibGVzCitAc3Vic2VjdGlvbiBUcmFuc2Zvcm1hdGlvbnMgb24gU3RhdGljIFZhcmlhYmxlcworCitUaGlzIHNvdXJjZSBsaW5lIGRlZmluZXMgYSBzdGF0aWMgdmFyaWFibGUgYXQgZmlsZSBzY29wZToKKworQGV4YW1wbGUKK3N0YXRpYyBpbnQgc19nX3JlcGVhdAorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorVGhlIGZvbGxvd2luZyBzdGFiIGRlc2NyaWJlcyB0aGUgc3ltYm9sOgorCitAZXhhbXBsZQorLnN0YWJzICJzX2dfcmVwZWF0OlMxIiwzOCwwLDAsX3NfZ19yZXBlYXQKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK1RoZSBhc3NlbWJsZXIgdHJhbnNmb3JtcyB0aGUgc3RhYiBpbnRvIHRoaXMgc3ltYm9sIHRhYmxlIGVudHJ5IGluIHRoZQorQGZpbGV7Lm99IGZpbGUuICBUaGUgbG9jYXRpb24gaXMgZXhwcmVzc2VkIGFzIGEgZGF0YSBzZWdtZW50IG9mZnNldC4KKworQGV4YW1wbGUKKzAwMDAwMDg0IC0gMDAgMDAwMCBTVFNZTSBzX2dfcmVwZWF0OlMxCitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitJbiB0aGUgc3ltYm9sIHRhYmxlIGVudHJ5IGZyb20gdGhlIGV4ZWN1dGFibGUsIHRoZSBsaW5rZXIgaGFzIG1hZGUgdGhlCityZWxvY2F0YWJsZSBhZGRyZXNzIGFic29sdXRlLgorCitAZXhhbXBsZQorMDAwMGUwMGMgLSAwMCAwMDAwIFNUU1lNIHNfZ19yZXBlYXQ6UzEKK0BlbmQgZXhhbXBsZQorCitAbm9kZSBUcmFuc2Zvcm1hdGlvbnMgT24gR2xvYmFsIFZhcmlhYmxlcworQHN1YnNlY3Rpb24gVHJhbnNmb3JtYXRpb25zIG9uIEdsb2JhbCBWYXJpYWJsZXMKKworU3RhYnMgZm9yIGdsb2JhbCB2YXJpYWJsZXMgZG8gbm90IGNvbnRhaW4gbG9jYXRpb24gaW5mb3JtYXRpb24uIEluCit0aGlzIGNhc2UsIHRoZSBkZWJ1Z2dlciBmaW5kcyBsb2NhdGlvbiBpbmZvcm1hdGlvbiBpbiB0aGUgYXNzZW1ibGVyIG9yCitsaW5rZXIgc3ltYm9sIHRhYmxlIGVudHJ5IGRlc2NyaWJpbmcgdGhlIHZhcmlhYmxlLiAgVGhlIHNvdXJjZSBsaW5lOgorCitAZXhhbXBsZQorY2hhciBnX2ZvbyA9ICdjJzsKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK2dlbmVyYXRlcyB0aGUgc3RhYjoKKworQGV4YW1wbGUKKy5zdGFicyAiZ19mb286RzIiLDMyLDAsMCwwCitAZW5kIGV4YW1wbGUKKworVGhlIHZhcmlhYmxlIGlzIHJlcHJlc2VudGVkIGJ5IHR3byBzeW1ib2wgdGFibGUgZW50cmllcyBpbiB0aGUgb2JqZWN0CitmaWxlIChzZWUgYmVsb3cpLiAgVGhlIGZpcnN0IG9uZSBvcmlnaW5hdGVkIGFzIGEgc3RhYi4gIFRoZSBzZWNvbmQgb25lCitpcyBhbiBleHRlcm5hbCBzeW1ib2wuICBUaGUgdXBwZXIgY2FzZSBAc2FtcHtEfSBzaWduaWZpZXMgdGhhdCB0aGUKK0Bjb2Rle25fdHlwZX0gZmllbGQgb2YgdGhlIHN5bWJvbCB0YWJsZSBjb250YWlucyA3LCBAY29kZXtOX0RBVEF9IHdpdGgKK2xvY2FsIGxpbmthZ2UuICBUaGUgc3RhYidzIHZhbHVlIGlzIHplcm8gc2luY2UgdGhlIHZhbHVlIGlzIG5vdCB1c2VkIGZvcgorQGNvZGV7Tl9HU1lNfSBzdGFicy4gIFRoZSB2YWx1ZSBvZiB0aGUgbGlua2VyIHN5bWJvbCBpcyB0aGUgcmVsb2NhdGFibGUKK2FkZHJlc3MgY29ycmVzcG9uZGluZyB0byB0aGUgdmFyaWFibGUuCisKK0BleGFtcGxlCiswMDAwMDAwMCAtIDAwIDAwMDAgIEdTWU0gZ19mb286RzIKKzAwMDAwMDgwIEQgX2dfZm9vCitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50CitUaGVzZSBlbnRyaWVzIGFzIHRyYW5zZm9ybWVkIGJ5IHRoZSBsaW5rZXIuICBUaGUgbGlua2VyIHN5bWJvbCB0YWJsZQorZW50cnkgbm93IGhvbGRzIGFuIGFic29sdXRlIGFkZHJlc3M6CisKK0BleGFtcGxlCiswMDAwMDAwMCAtIDAwIDAwMDAgIEdTWU0gZ19mb286RzIKK0Bkb3Rze30KKzAwMDBlMDA4IEQgX2dfZm9vCitAZW5kIGV4YW1wbGUKKworQG5vZGUgU3RhYiBTZWN0aW9uIFRyYW5zZm9ybWF0aW9ucworQHN1YnNlY3Rpb24gVHJhbnNmb3JtYXRpb25zIG9mIFN0YWJzIGluIHNlcGFyYXRlIHNlY3Rpb25zCisKK0ZvciBvYmplY3QgZmlsZSBmb3JtYXRzIHVzaW5nIHN0YWJzIGluIHNlcGFyYXRlIHNlY3Rpb25zIChAcHhyZWZ7U3RhYgorU2VjdGlvbnN9KSwgdXNlIEBjb2Rle29iamR1bXAgLS1zdGFic30gaW5zdGVhZCBvZiBAY29kZXtubX0gdG8gc2hvdyB0aGUKK3N0YWJzIGluIGFuIG9iamVjdCBvciBleGVjdXRhYmxlIGZpbGUuICBAY29kZXtvYmpkdW1wfSBpcyBhIEdOVSB1dGlsaXR5OworU3VuIGRvZXMgbm90IHByb3ZpZGUgYW55IGVxdWl2YWxlbnQuCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBpcyBmb3IgYSBzdGFiIHdob3NlIHZhbHVlIGlzIGFuIGFkZHJlc3MgaXMKK3JlbGF0aXZlIHRvIHRoZSBjb21waWxhdGlvbiB1bml0IChAcHhyZWZ7RUxGIExpbmtlciBSZWxvY2F0aW9ufSkuICBGb3IKK2V4YW1wbGUsIGlmIHRoZSBzb3VyY2UgbGluZQorCitAZXhhbXBsZQorc3RhdGljIGludCBsZCA9IDU7CitAZW5kIGV4YW1wbGUKKworYXBwZWFycyB3aXRoaW4gYSBmdW5jdGlvbiwgdGhlbiB0aGUgYXNzZW1ibHkgbGFuZ3VhZ2Ugb3V0cHV0IGZyb20gdGhlCitjb21waWxlciBjb250YWluczoKKworQGV4YW1wbGUKKy5EZGF0YS5kYXRhOgorQGRvdHN7fQorICAgICAgICAuc3RhYnMgImxkOlYoMCwzKSIsMHgyNiwwLDQsLkwxOC1EZGF0YS5kYXRhICAgICMgQHJ7MHgyNiBpcyBOX1NUU1lNfQorQGRvdHN7fQorLkwxODoKKyAgICAgICAgLmFsaWduIDQKKyAgICAgICAgLndvcmQgMHg1CitAZW5kIGV4YW1wbGUKKworQmVjYXVzZSB0aGUgdmFsdWUgaXMgZm9ybWVkIGJ5IHN1YnRyYWN0aW5nIG9uZSBzeW1ib2wgZnJvbSBhbm90aGVyLCB0aGUKK3ZhbHVlIGlzIGFic29sdXRlLCBub3QgcmVsb2NhdGFibGUsIGFuZCBzbyB0aGUgb2JqZWN0IGZpbGUgY29udGFpbnMKKworQGV4YW1wbGUKK1N5bW51bSBuX3R5cGUgbl9vdGhyIG5fZGVzYyBuX3ZhbHVlICBuX3N0cnggU3RyaW5nCiszMSAgICAgU1RTWU0gIDAgICAgICA0ICAgICAgMDAwMDAwMDQgNjgwICAgIGxkOlYoMCwzKQorQGVuZCBleGFtcGxlCisKK3dpdGhvdXQgYW55IHJlbG9jYXRpb25zLCBhbmQgdGhlIGV4ZWN1dGFibGUgZmlsZSBhbHNvIGNvbnRhaW5zCisKK0BleGFtcGxlCitTeW1udW0gbl90eXBlIG5fb3RociBuX2Rlc2Mgbl92YWx1ZSAgbl9zdHJ4IFN0cmluZworMzEgICAgIFNUU1lNICAwICAgICAgNCAgICAgIDAwMDAwMDA0IDY4MCAgICBsZDpWKDAsMykKK0BlbmQgZXhhbXBsZQorCitAbm9kZSBDcGx1c3BsdXMKK0BjaGFwdGVyIEdOVSBDKysgU3RhYnMKKworQG1lbnUKKyogQ2xhc3MgTmFtZXM6OgkJCUMrKyBjbGFzcyBuYW1lcyBhcmUgYm90aCB0YWdzIGFuZCB0eXBlZGVmcy4KKyogTmVzdGVkIFN5bWJvbHM6OgkJQysrIHN5bWJvbCBuYW1lcyBjYW4gYmUgd2l0aGluIG90aGVyIHR5cGVzLgorKiBCYXNpYyBDcGx1c3BsdXMgVHlwZXM6OgorKiBTaW1wbGUgQ2xhc3Nlczo6CisqIENsYXNzIEluc3RhbmNlOjoKKyogTWV0aG9kczo6CQkJTWV0aG9kIGRlZmluaXRpb24KKyogTWV0aG9kIFR5cGUgRGVzY3JpcHRvcjo6ICAgICAgVGhlIEBzYW1weyN9IHR5cGUgZGVzY3JpcHRvcgorKiBNZW1iZXIgVHlwZSBEZXNjcmlwdG9yOjogICAgICBUaGUgQHNhbXB7QEB9IHR5cGUgZGVzY3JpcHRvcgorKiBQcm90ZWN0aW9uczo6CisqIE1ldGhvZCBNb2RpZmllcnM6OgorKiBWaXJ0dWFsIE1ldGhvZHM6OgorKiBJbmhlcml0ZW5jZTo6CisqIFZpcnR1YWwgQmFzZSBDbGFzc2VzOjoKKyogU3RhdGljIE1lbWJlcnM6OgorQGVuZCBtZW51CisKK0Bub2RlIENsYXNzIE5hbWVzCitAc2VjdGlvbiBDKysgQ2xhc3MgTmFtZXMKKworSW4gQysrLCBhIGNsYXNzIG5hbWUgd2hpY2ggaXMgZGVjbGFyZWQgd2l0aCBAY29kZXtjbGFzc30sIEBjb2Rle3N0cnVjdH0sCitvciBAY29kZXt1bmlvbn0sIGlzIG5vdCBvbmx5IGEgdGFnLCBhcyBpbiBDLCBidXQgYWxzbyBhIHR5cGUgbmFtZS4gIFRodXMKK3RoZXJlIHNob3VsZCBiZSBzdGFicyB3aXRoIGJvdGggQHNhbXB7dH0gYW5kIEBzYW1we1R9IHN5bWJvbCBkZXNjcmlwdG9ycworKEBweHJlZntUeXBlZGVmc30pLgorCitUbyBzYXZlIHNwYWNlLCB0aGVyZSBpcyBhIHNwZWNpYWwgYWJicmV2aWF0aW9uIGZvciB0aGlzIGNhc2UuICBJZiB0aGUKK0BzYW1we1R9IHN5bWJvbCBkZXNjcmlwdG9yIGlzIGZvbGxvd2VkIGJ5IEBzYW1we3R9LCB0aGVuIHRoZSBzdGFiCitkZWZpbmVzIGJvdGggYSB0eXBlIG5hbWUgYW5kIGEgdGFnLgorCitGb3IgZXhhbXBsZSwgdGhlIEMrKyBjb2RlCisKK0BleGFtcGxlCitzdHJ1Y3QgZm9vIEB7aW50IHg7QH07CitAZW5kIGV4YW1wbGUKKworY2FuIGJlIHJlcHJlc2VudGVkIGFzIGVpdGhlcgorCitAZXhhbXBsZQorLnN0YWJzICJmb286VDE5PXM0eDoxLDAsMzI7OyIsMTI4LDAsMCwwICAgICAgICMgQHJ7MTI4IGlzIE5fTFNZTX0KKy5zdGFicyAiZm9vOnQxOSIsMTI4LDAsMCwwCitAZW5kIGV4YW1wbGUKKworb3IKKworQGV4YW1wbGUKKy5zdGFicyAiZm9vOlR0MTk9czR4OjEsMCwzMjs7IiwxMjgsMCwwLDAKK0BlbmQgZXhhbXBsZQorCitAbm9kZSBOZXN0ZWQgU3ltYm9scworQHNlY3Rpb24gRGVmaW5pbmcgYSBTeW1ib2wgV2l0aGluIEFub3RoZXIgVHlwZQorCitJbiBDKyssIGEgc3ltYm9sIChzdWNoIGFzIGEgdHlwZSBuYW1lKSBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gYW5vdGhlciB0eXBlLgorQGMgRklYTUU6IE5lZWRzIGV4YW1wbGUuCisKK0luIHN0YWJzLCB0aGlzIGlzIHNvbWV0aW1lcyByZXByZXNlbnRlZCBieSBtYWtpbmcgdGhlIG5hbWUgb2YgYSBzeW1ib2wKK3doaWNoIGNvbnRhaW5zIEBzYW1wezo6fS4gIFN1Y2ggYSBwYWlyIG9mIGNvbG9ucyBkb2VzIG5vdCBlbmQgdGhlIG5hbWUKK29mIHRoZSBzeW1ib2wsIHRoZSB3YXkgYSBzaW5nbGUgY29sb24gd291bGQgKEBweHJlZntTdHJpbmcgRmllbGR9KS4gIEknbQorbm90IHN1cmUgaG93IGNvbnNpc3RlbnRseSB1c2VkIG9yIHdlbGwgdGhvdWdodCBvdXQgdGhpcyBtZWNoYW5pc20gaXMuCitTbyB0aGF0IGEgcGFpciBvZiBjb2xvbnMgaW4gdGhpcyBwb3NpdGlvbiBhbHdheXMgaGFzIHRoaXMgbWVhbmluZywKK0BzYW1wezp9IGNhbm5vdCBiZSB1c2VkIGFzIGEgc3ltYm9sIGRlc2NyaXB0b3IuCisKK0ZvciBleGFtcGxlLCBpZiB0aGUgc3RyaW5nIGZvciBhIHN0YWIgaXMgQHNhbXB7Zm9vOjpiYXI6OmJhejp0NT0qNn0sCit0aGVuIEBjb2Rle2Zvbzo6YmFyOjpiYXp9IGlzIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wsIEBzYW1we3R9IGlzIHRoZQorc3ltYm9sIGRlc2NyaXB0b3IsIGFuZCBAc2FtcHs1PSo2fSBpcyB0aGUgdHlwZSBpbmZvcm1hdGlvbi4KKworQG5vZGUgQmFzaWMgQ3BsdXNwbHVzIFR5cGVzCitAc2VjdGlvbiBCYXNpYyBUeXBlcyBGb3IgQysrCisKKzw8IHRoZSBleGFtcGxlcyB0aGF0IGZvbGxvdyBhcmUgYmFzZWQgb24gYTAxLkMgPj4KKworCitDKysgYWRkcyB0d28gbW9yZSBidWlsdGluIHR5cGVzIHRvIHRoZSBzZXQgZGVmaW5lZCBmb3IgQy4gIFRoZXNlIGFyZQordGhlIHVua25vd24gdHlwZSBhbmQgdGhlIHZ0YWJsZSByZWNvcmQgdHlwZS4gIFRoZSB1bmtub3duIHR5cGUsIHR5cGUKKzE2LCBpcyBkZWZpbmVkIGluIHRlcm1zIG9mIGl0c2VsZiBsaWtlIHRoZSB2b2lkIHR5cGUuCisKK1RoZSB2dGFibGUgcmVjb3JkIHR5cGUsIHR5cGUgMTcsIGlzIGRlZmluZWQgYXMgYSBzdHJ1Y3R1cmUgdHlwZSBhbmQKK3RoZW4gYXMgYSBzdHJ1Y3R1cmUgdGFnLiAgVGhlIHN0cnVjdHVyZSBoYXMgZm91ciBmaWVsZHM6IGRlbHRhLCBpbmRleCwKK3BmbiwgYW5kIGRlbHRhMi4gIHBmbiBpcyB0aGUgZnVuY3Rpb24gcG9pbnRlci4KKworPDwgSW4gYm9pbGVycGxhdGUgJHZ0YmxfcHRyX3R5cGUsIHdoYXQgYXJlIHRoZSBmaWVsZHMgZGVsdGEsCitpbmRleCwgYW5kIGRlbHRhMiB1c2VkIGZvcj8gPj4KKworVGhpcyBiYXNpYyB0eXBlIGlzIHByZXNlbnQgaW4gYWxsIEMrKyBwcm9ncmFtcyBldmVuIGlmIHRoZXJlIGFyZSBubwordmlydHVhbCBtZXRob2RzIGRlZmluZWQuCisKK0BkaXNwbGF5Cisuc3RhYnMgInN0cnVjdF9uYW1lOnN5bV9kZXNjKHR5cGUpdHlwZV9kZWYoMTcpPXR5cGVfZGVzYyhzdHJ1Y3Qpc3RydWN0X2J5dGVzKDgpCisgICAgICAgIGVsZW1fbmFtZShkZWx0YSk6dHlwZV9yZWYoc2hvcnQgaW50KSxiaXRfb2Zmc2V0KDApLGZpZWxkX2JpdHMoMTYpOworICAgICAgICBlbGVtX25hbWUoaW5kZXgpOnR5cGVfcmVmKHNob3J0IGludCksYml0X29mZnNldCgxNiksZmllbGRfYml0cygxNik7CisgICAgICAgIGVsZW1fbmFtZShwZm4pOnR5cGVfZGVmKDE4KT10eXBlX2Rlc2MocHRyIHRvKXR5cGVfcmVmKHZvaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X29mZnNldCgzMiksZmllbGRfYml0cygzMik7CisgICAgICAgIGVsZW1fbmFtZShkZWx0YTIpOnR5cGVfZGVmKHNob3J0IGludCk7Yml0X29mZnNldCgzMiksZmllbGRfYml0cygxNik7OyIKKyAgICAgICAgTl9MU1lNLCBOSUwsIE5JTAorQGVuZCBkaXNwbGF5CisKK0BzbWFsbGV4YW1wbGUKKy5zdGFicyAiJHZ0YmxfcHRyX3R5cGU6dDE3PXM4CisgICAgICAgIGRlbHRhOjYsMCwxNjtpbmRleDo2LDE2LDE2O3BmbjoxOD0qMTUsMzIsMzI7ZGVsdGEyOjYsMzIsMTY7OyIKKyAgICAgICAgLDEyOCwwLDAsMAorQGVuZCBzbWFsbGV4YW1wbGUKKworQGRpc3BsYXkKKy5zdGFicyAibmFtZTpzeW1fZGVjKHN0cnVjdCB0YWcpdHlwZV9yZWYoJHZ0YmxfcHRyX3R5cGUpIixOX0xTWU0sTklMLE5JTCxOSUwKK0BlbmQgZGlzcGxheQorCitAZXhhbXBsZQorLnN0YWJzICIkdnRibF9wdHJfdHlwZTpUMTciLDEyOCwwLDAsMAorQGVuZCBleGFtcGxlCisKK0Bub2RlIFNpbXBsZSBDbGFzc2VzCitAc2VjdGlvbiBTaW1wbGUgQ2xhc3MgRGVmaW5pdGlvbgorCitUaGUgc3RhYnMgZGVzY3JpYmluZyBDKysgbGFuZ3VhZ2UgZmVhdHVyZXMgYXJlIGFuIGV4dGVuc2lvbiBvZiB0aGUKK3N0YWJzIGRlc2NyaWJpbmcgQy4gIFN0YWJzIHJlcHJlc2VudGluZyBDKysgY2xhc3MgdHlwZXMgZWxhYm9yYXRlCitleHRlbnNpdmVseSBvbiB0aGUgc3RhYiBmb3JtYXQgdXNlZCB0byBkZXNjcmliZSBzdHJ1Y3R1cmUgdHlwZXMgaW4gQy4KK1N0YWJzIHJlcHJlc2VudGluZyBjbGFzcyB0eXBlIHZhcmlhYmxlcyBsb29rIGp1c3QgbGlrZSBzdGFicworcmVwcmVzZW50aW5nIEMgbGFuZ3VhZ2UgdmFyaWFibGVzLgorCitDb25zaWRlciB0aGUgZm9sbG93aW5nIHZlcnkgc2ltcGxlIGNsYXNzIGRlZmluaXRpb24uCisKK0BleGFtcGxlCitjbGFzcyBiYXNlQSBAeworcHVibGljOgorICAgICAgICBpbnQgQWRhdDsKKyAgICAgICAgaW50IEFtZXRoKGludCBpbiwgY2hhciBvdGhlcik7CitAfTsKK0BlbmQgZXhhbXBsZQorCitUaGUgY2xhc3MgQGNvZGV7YmFzZUF9IGlzIHJlcHJlc2VudGVkIGJ5IHR3byBzdGFicy4gIFRoZSBmaXJzdCBzdGFiIGRlc2NyaWJlcwordGhlIGNsYXNzIGFzIGEgc3RydWN0dXJlIHR5cGUuICBUaGUgc2Vjb25kIHN0YWIgZGVzY3JpYmVzIGEgc3RydWN0dXJlCit0YWcgb2YgdGhlIGNsYXNzIHR5cGUuICBCb3RoIHN0YWJzIGFyZSBvZiBzdGFiIHR5cGUgQGNvZGV7Tl9MU1lNfS4gIFNpbmNlIHRoZQorc3RhYiBpcyBub3QgbG9jYXRlZCBiZXR3ZWVuIGFuIEBjb2Rle05fRlVOfSBhbmQgYW4gQGNvZGV7Tl9MQlJBQ30gc3RhYiB0aGlzIGluZGljYXRlcwordGhhdCB0aGUgY2xhc3MgaXMgZGVmaW5lZCBhdCBmaWxlIHNjb3BlLiAgSWYgaXQgd2VyZSwgdGhlbiB0aGUgQGNvZGV7Tl9MU1lNfQord291bGQgc2lnbmlmeSBhIGxvY2FsIHZhcmlhYmxlLgorCitBIHN0YWIgZGVzY3JpYmluZyBhIEMrKyBjbGFzcyB0eXBlIGlzIHNpbWlsYXIgaW4gZm9ybWF0IHRvIGEgc3RhYgorZGVzY3JpYmluZyBhIEMgc3RydWN0LCB3aXRoIGVhY2ggY2xhc3MgbWVtYmVyIHNob3duIGFzIGEgZmllbGQgaW4gdGhlCitzdHJ1Y3R1cmUuICBUaGUgcGFydCBvZiB0aGUgc3RydWN0IGZvcm1hdCBkZXNjcmliaW5nIGZpZWxkcyBpcworZXhwYW5kZWQgdG8gaW5jbHVkZSBleHRyYSBpbmZvcm1hdGlvbiByZWxldmVudCB0byBDKysgY2xhc3MgbWVtYmVycy4KK0luIGFkZGl0aW9uLCBpZiB0aGUgY2xhc3MgaGFzIG11bHRpcGxlIGJhc2UgY2xhc3NlcyBvciB2aXJ0dWFsCitmdW5jdGlvbnMgdGhlIHN0cnVjdCBmb3JtYXQgb3V0c2lkZSBvZiB0aGUgZmllbGQgcGFydHMgaXMgYWxzbworYXVnbWVudGVkLgorCitJbiB0aGlzIHNpbXBsZSBleGFtcGxlIHRoZSBmaWVsZCBwYXJ0IG9mIHRoZSBDKysgY2xhc3Mgc3RhYgorcmVwcmVzZW50aW5nIG1lbWJlciBkYXRhIGxvb2tzIGp1c3QgbGlrZSB0aGUgZmllbGQgcGFydCBvZiBhIEMgc3RydWN0CitzdGFiLiAgVGhlIHNlY3Rpb24gb24gcHJvdGVjdGlvbnMgZGVzY3JpYmVzIGhvdyBpdHMgZm9ybWF0IGlzCitzb21ldGltZXMgZXh0ZW5kZWQgZm9yIG1lbWJlciBkYXRhLgorCitUaGUgZmllbGQgcGFydCBvZiBhIEMrKyBjbGFzcyBzdGFiIHJlcHJlc2VudGluZyBhIG1lbWJlciBmdW5jdGlvbgorZGlmZmVycyBzdWJzdGFudGlhbGx5IGZyb20gdGhlIGZpZWxkIHBhcnQgb2YgYSBDIHN0cnVjdCBzdGFiLiAgSXQKK3N0aWxsIGJlZ2lucyB3aXRoIEBzYW1we25hbWU6fSBidXQgdGhlbiBnb2VzIG9uIHRvIGRlZmluZSBhIG5ldyB0eXBlIG51bWJlcgorZm9yIHRoZSBtZW1iZXIgZnVuY3Rpb24sIGRlc2NyaWJlIGl0cyByZXR1cm4gdHlwZSwgaXRzIGFyZ3VtZW50IHR5cGVzLAoraXRzIHByb3RlY3Rpb24gbGV2ZWwsIGFueSBxdWFsaWZpZXJzIGFwcGxpZWQgdG8gdGhlIG1ldGhvZCBkZWZpbml0aW9uLAorYW5kIHdoZXRoZXIgdGhlIG1ldGhvZCBpcyB2aXJ0dWFsIG9yIG5vdC4gIElmIHRoZSBtZXRob2QgaXMgdmlydHVhbAordGhlbiB0aGUgbWV0aG9kIGRlc2NyaXB0aW9uIGdvZXMgb24gdG8gZ2l2ZSB0aGUgdnRhYmxlIGluZGV4IG9mIHRoZQorbWV0aG9kLCBhbmQgdGhlIHR5cGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBiYXNlIGNsYXNzIGRlZmluaW5nIHRoZQorbWV0aG9kLgorCitXaGVuIHRoZSBmaWVsZCBuYW1lIGlzIGEgbWV0aG9kIG5hbWUgaXQgaXMgZm9sbG93ZWQgYnkgdHdvIGNvbG9ucyByYXRoZXIKK3RoYW4gb25lLiAgVGhpcyBpcyBmb2xsb3dlZCBieSBhIG5ldyB0eXBlIGRlZmluaXRpb24gZm9yIHRoZSBtZXRob2QuCitUaGlzIGlzIGEgbnVtYmVyIGZvbGxvd2VkIGJ5IGFuIGVxdWFsIHNpZ24gYW5kIHRoZSB0eXBlIG9mIHRoZSBtZXRob2QuCitOb3JtYWxseSB0aGlzIHdpbGwgYmUgYSB0eXBlIGRlY2xhcmVkIHVzaW5nIHRoZSBAc2FtcHsjfSB0eXBlCitkZXNjcmlwdG9yOyBzZWUgQHJlZntNZXRob2QgVHlwZSBEZXNjcmlwdG9yfTsgc3RhdGljIG1lbWJlciBmdW5jdGlvbnMKK2FyZSBkZWNsYXJlZCB1c2luZyB0aGUgQHNhbXB7Zn0gdHlwZSBkZXNjcmlwdG9yIGluc3RlYWQ7IHNlZQorQHJlZntGdW5jdGlvbiBUeXBlc30uCisKK1RoZSBmb3JtYXQgb2YgYW4gb3ZlcmxvYWRlZCBvcGVyYXRvciBtZXRob2QgbmFtZSBkaWZmZXJzIGZyb20gdGhhdCBvZgorb3RoZXIgbWV0aG9kcy4gIEl0IGlzIEBzYW1we29wJDo6QHZhcntvcGVyYXRvci1uYW1lfS59IHdoZXJlCitAdmFye29wZXJhdG9yLW5hbWV9IGlzIHRoZSBvcGVyYXRvciBuYW1lIHN1Y2ggYXMgQHNhbXB7K30gb3IgQHNhbXB7Kz19LgorVGhlIG5hbWUgZW5kcyB3aXRoIGEgcGVyaW9kLCBhbmQgYW55IGNoYXJhY3RlcnMgZXhjZXB0IHRoZSBwZXJpb2QgY2FuCitvY2N1ciBpbiB0aGUgQHZhcntvcGVyYXRvci1uYW1lfSBzdHJpbmcuCisKK1RoZSBuZXh0IHBhcnQgb2YgdGhlIG1ldGhvZCBkZXNjcmlwdGlvbiByZXByZXNlbnRzIHRoZSBhcmd1bWVudHMgdG8gdGhlCittZXRob2QsIHByZWNlZWRlZCBieSBhIGNvbG9uIGFuZCBlbmRpbmcgd2l0aCBhIHNlbWktY29sb24uICBUaGUgdHlwZXMgb2YKK3RoZSBhcmd1bWVudHMgYXJlIGV4cHJlc3NlZCBpbiB0aGUgc2FtZSB3YXkgYXJndW1lbnQgdHlwZXMgYXJlIGV4cHJlc3NlZAoraW4gQysrIG5hbWUgbWFuZ2xpbmcuICBJbiB0aGlzIGV4YW1wbGUgYW4gQGNvZGV7aW50fSBhbmQgYSBAY29kZXtjaGFyfQorbWFwIHRvIEBzYW1we2ljfS4KKworVGhpcyBpcyBmb2xsb3dlZCBieSBhIG51bWJlciwgYSBsZXR0ZXIsIGFuZCBhbiBhc3RlcmlzayBvciBwZXJpb2QsCitmb2xsb3dlZCBieSBhbm90aGVyIHNlbWljb2xvbi4gIFRoZSBudW1iZXIgaW5kaWNhdGVzIHRoZSBwcm90ZWN0aW9ucwordGhhdCBhcHBseSB0byB0aGUgbWVtYmVyIGZ1bmN0aW9uLiAgSGVyZSB0aGUgMiBtZWFucyBwdWJsaWMuICBUaGUKK2xldHRlciBlbmNvZGVzIGFueSBxdWFsaWZpZXIgYXBwbGllZCB0byB0aGUgbWV0aG9kIGRlZmluaXRpb24uICBJbgordGhpcyBjYXNlLCBAc2FtcHtBfSBtZWFucyB0aGF0IGl0IGlzIGEgbm9ybWFsIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGUgZG90CitzaG93cyB0aGF0IHRoZSBtZXRob2QgaXMgbm90IHZpcnR1YWwuICBUaGUgc2VjdGlvbnMgdGhhdCBmb2xsb3cKK2VsYWJvcmF0ZSBmdXJ0aGVyIG9uIHRoZXNlIGZpZWxkcyBhbmQgZGVzY3JpYmUgdGhlIGFkZGl0aW9uYWwKK2luZm9ybWF0aW9uIHByZXNlbnQgZm9yIHZpcnR1YWwgbWV0aG9kcy4KKworCitAZGlzcGxheQorLnN0YWJzICJjbGFzc19uYW1lOnN5bV9kZXNjKHR5cGUpdHlwZV9kZWYoMjApPXR5cGVfZGVzYyhzdHJ1Y3Qpc3RydWN0X2J5dGVzKDQpCisgICAgICAgIGZpZWxkX25hbWUoQWRhdCk6dHlwZShpbnQpLGJpdF9vZmZzZXQoMCksZmllbGRfYml0cygzMik7CisKKyAgICAgICAgbWV0aG9kX25hbWUoQW1ldGgpOjp0eXBlX2RlZigyMSk9dHlwZV9kZXNjKG1ldGhvZClyZXR1cm5fdHlwZShpbnQpOworICAgICAgICA6YXJnX3R5cGVzKGludCBjaGFyKTsKKyAgICAgICAgcHJvdGVjdGlvbihwdWJsaWMpcXVhbGlmaWVyKG5vcm1hbCl2aXJ0dWFsKG5vKTs7IgorICAgICAgICBOX0xTWU0sTklMLE5JTCxOSUwKK0BlbmQgZGlzcGxheQorCitAc21hbGxleGFtcGxlCisuc3RhYnMgImJhc2VBOnQyMD1zNEFkYXQ6MSwwLDMyO0FtZXRoOjoyMT0jIzE7OmljOzJBLjs7IiwxMjgsMCwwLDAKKworLnN0YWJzICJjbGFzc19uYW1lOnN5bV9kZXNjKHN0cnVjdCB0YWcpIixOX0xTWU0sTklMLE5JTCxOSUwKKworLnN0YWJzICJiYXNlQTpUMjAiLDEyOCwwLDAsMAorQGVuZCBzbWFsbGV4YW1wbGUKKworQG5vZGUgQ2xhc3MgSW5zdGFuY2UKK0BzZWN0aW9uIENsYXNzIEluc3RhbmNlCisKK0FzIHNob3duIGFib3ZlLCBkZXNjcmliaW5nIGV2ZW4gYSBzaW1wbGUgQysrIGNsYXNzIGRlZmluaXRpb24gaXMKK2FjY29tcGxpc2hlZCBieSBtYXNzaXZlbHkgZXh0ZW5kaW5nIHRoZSBzdGFiIGZvcm1hdCB1c2VkIGluIEMgdG8KK2Rlc2NyaWJlIHN0cnVjdHVyZSB0eXBlcy4gIEhvd2V2ZXIsIG9uY2UgdGhlIGNsYXNzIGlzIGRlZmluZWQsIEMgc3RhYnMKK3dpdGggbm8gbW9kaWZpY2F0aW9ucyBjYW4gYmUgdXNlZCB0byBkZXNjcmliZSBjbGFzcyBpbnN0YW5jZXMuICBUaGUKK2ZvbGxvd2luZyBzb3VyY2U6CisKK0BleGFtcGxlCittYWluICgpIEB7CisgICAgICAgIGJhc2VBIEFiYXNlQTsKK0B9CitAZW5kIGV4YW1wbGUKKworQG5vaW5kZW50Cit5aWVsZHMgdGhlIGZvbGxvd2luZyBzdGFiIGRlc2NyaWJpbmcgdGhlIGNsYXNzIGluc3RhbmNlLiAgSXQgbG9va3Mgbm8KK2RpZmZlcmVudCBmcm9tIGEgc3RhbmRhcmQgQyBzdGFiIGRlc2NyaWJpbmcgYSBsb2NhbCB2YXJpYWJsZS4KKworQGRpc3BsYXkKKy5zdGFicyAibmFtZTp0eXBlX3JlZihiYXNlQSkiLCBOX0xTWU0sIE5JTCwgTklMLCBmcmFtZV9wdHJfb2Zmc2V0CitAZW5kIGRpc3BsYXkKKworQGV4YW1wbGUKKy5zdGFicyAiQWJhc2VBOjIwIiwxMjgsMCwwLC0yMAorQGVuZCBleGFtcGxlCisKK0Bub2RlIE1ldGhvZHMKK0BzZWN0aW9uIE1ldGhvZCBEZWZpbml0aW9uCisKK1RoZSBjbGFzcyBkZWZpbml0aW9uIHNob3duIGFib3ZlIGRlY2xhcmVzIEFtZXRoLiAgVGhlIEMrKyBzb3VyY2UgYmVsb3cKK2RlZmluZXMgQW1ldGg6CisKK0BleGFtcGxlCitpbnQKK2Jhc2VBOjpBbWV0aChpbnQgaW4sIGNoYXIgb3RoZXIpCitAeworICAgICAgICByZXR1cm4gaW47CitAfTsKK0BlbmQgZXhhbXBsZQorCisKK1RoaXMgbWV0aG9kIGRlZmluaXRpb24geWllbGRzIHRocmVlIHN0YWJzIGZvbGxvd2luZyB0aGUgY29kZSBvZiB0aGUKK21ldGhvZC4gIE9uZSBzdGFiIGRlc2NyaWJlcyB0aGUgbWV0aG9kIGl0c2VsZiBhbmQgZm9sbG93aW5nIHR3byBkZXNjcmliZQoraXRzIHBhcmFtZXRlcnMuICBBbHRob3VnaCB0aGVyZSBpcyBvbmx5IG9uZSBmb3JtYWwgYXJndW1lbnQgYWxsIG1ldGhvZHMKK2hhdmUgYW4gaW1wbGljaXQgYXJndW1lbnQgd2hpY2ggaXMgdGhlIEBjb2Rle3RoaXN9IHBvaW50ZXIuICBUaGUgQGNvZGV7dGhpc30KK3BvaW50ZXIgaXMgYSBwb2ludGVyIHRvIHRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGhvZCB3YXMgY2FsbGVkLiAgTm90ZQordGhhdCB0aGUgbWV0aG9kIG5hbWUgaXMgbWFuZ2xlZCB0byBlbmNvZGUgdGhlIGNsYXNzIG5hbWUgYW5kIGFyZ3VtZW50Cit0eXBlcy4gIE5hbWUgbWFuZ2xpbmcgaXMgZGVzY3JpYmVkIGluIHRoZSBAc2N7YXJtfSAoQGNpdGV7VGhlIEFubm90YXRlZAorQysrIFJlZmVyZW5jZSBNYW51YWx9LCBieSBFbGxpcyBhbmQgU3Ryb3VzdHJ1cCwgQHNje2lzYm59CiswLTIwMS01MTQ1OS0xKTsgQGZpbGV7Z3Bjb21wYXJlLnRleGl9IGluIEN5Z251cyBHQ0MgZGlzdHJpYnV0aW9ucworZGVzY3JpYmVzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIEdOVSBtYW5nbGluZyBhbmQgQHNje2FybX0KK21hbmdsaW5nLgorQGMgRklYTUU6IFVzZSBAeHJlZiwgZXNwZWNpYWxseSBpZiB0aGlzIGlzIGdlbmVyYWxseSBpbnN0YWxsZWQgaW4gdGhlCitAYyBpbmZvIHRyZWUuCitAYyBGSVhNRTogVGhpcyBpbmZvcm1hdGlvbiBzaG91bGQgYmUgaW4gYSBuZXQgcmVsZWFzZSwgZWl0aGVyIG9mIEdDQyBvcgorQGMgR0RCLiAgQnV0IGdwY29tcGFyZS50ZXhpIGRvZXNuJ3Qgc2VlbSB0byBiZSBpbiB0aGUgRlNGIEdDQy4KKworQGV4YW1wbGUKKy5zdGFicyAibmFtZTpzeW1ib2xfZGVzcmlwdG9yKGdsb2JhbCBmdW5jdGlvbilyZXR1cm5fdHlwZShpbnQpIiwKKyAgICAgICAgTl9GVU4sIE5JTCwgTklMLCBjb2RlX2FkZHJfb2ZfbWV0aG9kX3N0YXJ0CisKKy5zdGFicyAiQW1ldGhfXzViYXNlQWljOkYxIiwzNiwwLDAsX0FtZXRoX181YmFzZUFpYworQGVuZCBleGFtcGxlCisKK0hlcmUgaXMgdGhlIHN0YWIgZm9yIHRoZSBAY29kZXt0aGlzfSBwb2ludGVyIGltcGxpY2l0IGFyZ3VtZW50LiAgVGhlCituYW1lIG9mIHRoZSBAY29kZXt0aGlzfSBwb2ludGVyIGlzIGFsd2F5cyBAY29kZXt0aGlzfS4gIFR5cGUgMTksIHRoZQorQGNvZGV7dGhpc30gcG9pbnRlciBpcyBkZWZpbmVkIGFzIGEgcG9pbnRlciB0byB0eXBlIDIwLCBAY29kZXtiYXNlQX0sCitidXQgYSBzdGFiIGRlZmluaW5nIEBjb2Rle2Jhc2VBfSBoYXMgbm90IHlldCBiZWVuIGVtaXRlZC4gIFNpbmNlIHRoZQorY29tcGlsZXIga25vd3MgaXQgd2lsbCBiZSBlbWl0ZWQgc2hvcnRseSwgaGVyZSBpdCBqdXN0IG91dHB1dHMgYSBjcm9zcworcmVmZXJlbmNlIHRvIHRoZSB1bmRlZmluZWQgc3ltYm9sLCBieSBwcmVmaXhpbmcgdGhlIHN5bWJvbCBuYW1lIHdpdGgKK0BzYW1we3hzfS4KKworQGV4YW1wbGUKKy5zdGFicyAibmFtZTpzeW1fZGVzYyhyZWdpc3RlciBwYXJhbSl0eXBlX2RlZigxOSk9CisgICAgICAgIHR5cGVfZGVzYyhwdHIgdG8pdHlwZV9yZWYoYmFzZUEpPQorICAgICAgICB0eXBlX2Rlc2MoY3Jvc3MtcmVmZXJlbmNlIHRvKWJhc2VBOiIsTl9SU1lNLE5JTCxOSUwscmVnaXN0ZXJfbnVtYmVyCisKKy5zdGFicyAidGhpczpQMTk9KjIwPXhzYmFzZUE6Iiw2NCwwLDAsOAorQGVuZCBleGFtcGxlCisKK1RoZSBzdGFiIGZvciB0aGUgZXhwbGljaXQgaW50ZWdlciBhcmd1bWVudCBsb29rcyBqdXN0IGxpa2UgYSBwYXJhbWV0ZXIKK3RvIGEgQyBmdW5jdGlvbi4gIFRoZSBsYXN0IGZpZWxkIG9mIHRoZSBzdGFiIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUKK2FyZ3VtZW50IHBvaW50ZXIsIHdoaWNoIGluIG1vc3Qgc3lzdGVtcyBpcyB0aGUgc2FtZSBhcyB0aGUgZnJhbWUKK3BvaW50ZXIuCisKK0BleGFtcGxlCisuc3RhYnMgIm5hbWU6c3ltX2Rlc2ModmFsdWUgcGFyYW1ldGVyKXR5cGVfcmVmKGludCkiLAorICAgICAgICBOX1BTWU0sTklMLE5JTCxvZmZzZXRfZnJvbV9hcmdfcHRyCisKKy5zdGFicyAiaW46cDEiLDE2MCwwLDAsNzIKK0BlbmQgZXhhbXBsZQorCis8PCBUaGUgZXhhbXBsZXMgdGhhdCBmb2xsb3cgYXJlIGJhc2VkIG9uIEExLkMgPj4KKworQG5vZGUgTWV0aG9kIFR5cGUgRGVzY3JpcHRvcgorQHNlY3Rpb24gVGhlIEBzYW1weyN9IFR5cGUgRGVzY3JpcHRvcgorCitUaGlzIGlzIHVzZWQgdG8gZGVzY3JpYmUgYSBjbGFzcyBtZXRob2QuICBUaGlzIGlzIGEgZnVuY3Rpb24gd2hpY2ggdGFrZXMKK2FuIGV4dHJhIGFyZ3VtZW50IGFzIGl0cyBmaXJzdCBhcmd1bWVudCwgZm9yIHRoZSBAY29kZXt0aGlzfSBwb2ludGVyLgorCitJZiB0aGUgQHNhbXB7I30gaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW5vdGhlciBAc2FtcHsjfSwgdGhlIHNlY29uZAorb25lIHdpbGwgYmUgZm9sbG93ZWQgYnkgdGhlIHJldHVybiB0eXBlIGFuZCBhIHNlbWljb2xvbi4gIFRoZSBjbGFzcyBhbmQKK2FyZ3VtZW50IHR5cGVzIGFyZSBub3Qgc3BlY2lmaWVkLCBhbmQgbXVzdCBiZSBkZXRlcm1pbmVkIGJ5IGRlbWFuZ2xpbmcKK3RoZSBuYW1lIG9mIHRoZSBtZXRob2QgaWYgaXQgaXMgYXZhaWxhYmxlLgorCitPdGhlcndpc2UsIHRoZSBzaW5nbGUgQHNhbXB7I30gaXMgZm9sbG93ZWQgYnkgdGhlIGNsYXNzIHR5cGUsIGEgY29tbWEsCit0aGUgcmV0dXJuIHR5cGUsIGEgY29tbWEsIGFuZCB6ZXJvIG9yIG1vcmUgcGFyYW1ldGVyIHR5cGVzIHNlcGFyYXRlZCBieQorY29tbWFzLiAgVGhlIGxpc3Qgb2YgYXJndW1lbnRzIGlzIHRlcm1pbmF0ZWQgYnkgYSBzZW1pY29sb24uICBJbiB0aGUKK2RlYnVnZ2luZyBvdXRwdXQgZ2VuZXJhdGVkIGJ5IGdjYywgYSBmaW5hbCBhcmd1bWVudCB0eXBlIG9mIEBjb2Rle3ZvaWR9CitpbmRpY2F0ZXMgYSBtZXRob2Qgd2hpY2ggZG9lcyBub3QgdGFrZSBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuCitJZiB0aGUgZmluYWwgYXJndW1lbnQgdHlwZSBvZiBAY29kZXt2b2lkfSBkb2VzIG5vdCBhcHBlYXIsIHRoZSBtZXRob2QKK3dhcyBkZWNsYXJlZCB3aXRoIGFuIGVsbGlwc2lzLgorCitOb3RlIHRoYXQgYWx0aG91Z2ggc3VjaCBhIHR5cGUgd2lsbCBub3JtYWxseSBiZSB1c2VkIHRvIGRlc2NyaWJlIGZpZWxkcworaW4gc3RydWN0dXJlcywgdW5pb25zLCBvciBjbGFzc2VzLCBmb3IgYXQgbGVhc3Qgc29tZSB2ZXJzaW9ucyBvZiB0aGUKK2NvbXBpbGVyIGl0IGNhbiBhbHNvIGJlIHVzZWQgaW4gb3RoZXIgY29udGV4dHMuCisKK0Bub2RlIE1lbWJlciBUeXBlIERlc2NyaXB0b3IKK0BzZWN0aW9uIFRoZSBAc2FtcHtAQH0gVHlwZSBEZXNjcmlwdG9yCisKK1RoZSBAc2FtcHtAQH0gdHlwZSBkZXNjcmlwdG9yIGlzIGZvciBhIG1lbWJlciAoY2xhc3MgYW5kIHZhcmlhYmxlKSB0eXBlLgorSXQgaXMgZm9sbG93ZWQgYnkgdHlwZSBpbmZvcm1hdGlvbiBmb3IgdGhlIG9mZnNldCBiYXNldHlwZSwgYSBjb21tYSwgYW5kCit0eXBlIGluZm9ybWF0aW9uIGZvciB0aGUgdHlwZSBvZiB0aGUgZmllbGQgYmVpbmcgcG9pbnRlZCB0by4gIChGSVhNRToKK3RoaXMgaXMgYWNrbm93bGVkZ2VkIHRvIGJlIGdpYmJlcmlzaC4gIENhbiBhbnlvbmUgc2F5IHdoYXQgcmVhbGx5IGdvZXMKK2hlcmU/KS4KKworTm90ZSB0aGF0IHRoZXJlIGlzIGEgY29uZmxpY3QgYmV0d2VlbiB0aGlzIGFuZCB0eXBlIGF0dHJpYnV0ZXMKKyhAcHhyZWZ7U3RyaW5nIEZpZWxkfSk7IGJvdGggdXNlIHR5cGUgZGVzY3JpcHRvciBAc2FtcHtAQH0uCitGb3J0dW5hdGVseSwgdGhlIEBzYW1we0BAfSB0eXBlIGRlc2NyaXB0b3IgdXNlZCBpbiB0aGlzIEMrKyBzZW5zZSBhbHdheXMKK3dpbGwgYmUgZm9sbG93ZWQgYnkgYSBkaWdpdCwgQHNhbXB7KH0sIG9yIEBzYW1wey19LCBhbmQgdHlwZSBhdHRyaWJ1dGVzCituZXZlciBzdGFydCB3aXRoIHRob3NlIHRoaW5ncy4KKworQG5vZGUgUHJvdGVjdGlvbnMKK0BzZWN0aW9uIFByb3RlY3Rpb25zCisKK0luIHRoZSBzaW1wbGUgY2xhc3MgZGVmaW5pdGlvbiBzaG93biBhYm92ZSBhbGwgbWVtYmVyIGRhdGEgYW5kCitmdW5jdGlvbnMgd2VyZSBwdWJsaWNseSBhY2Nlc3NhYmxlLiAgVGhlIGV4YW1wbGUgdGhhdCBmb2xsb3dzCitjb250cmFzdHMgcHVibGljLCBwcm90ZWN0ZWQgYW5kIHByaXZhdGVseSBhY2Nlc3NhYmxlIGZpZWxkcyBhbmQgc2hvd3MKK2hvdyB0aGVzZSBwcm90ZWN0aW9ucyBhcmUgZW5jb2RlZCBpbiBDKysgc3RhYnMuCisKK0lmIHRoZSBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSBAc2FtcHtAdmFye2ZpZWxkLW5hbWV9On0gcGFydCBvZiB0aGUKK3N0cmluZyBpcyBAc2FtcHsvfSwgdGhlbiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgdGhlIHZpc2liaWxpdHkuICBAc2FtcHswfQorbWVhbnMgcHJpdmF0ZSwgQHNhbXB7MX0gbWVhbnMgcHJvdGVjdGVkLCBhbmQgQHNhbXB7Mn0gbWVhbnMgcHVibGljLgorRGVidWdnZXJzIHNob3VsZCBpZ25vcmUgdmlzaWJpbGl0eSBjaGFyYWN0ZXJzIHRoZXkgZG8gbm90IHJlY29nbml6ZSwgYW5kCithc3N1bWUgYSByZWFzb25hYmxlIGRlZmF1bHQgKHN1Y2ggYXMgcHVibGljKSAoR0RCIDQuMTEgZG9lcyBub3QsIGJ1dAordGhpcyBzaG91bGQgYmUgZml4ZWQgaW4gdGhlIG5leHQgR0RCIHJlbGVhc2UpLiAgSWYgbm8gdmlzaWJpbGl0eSBpcworc3BlY2lmaWVkIHRoZSBmaWVsZCBpcyBwdWJsaWMuICBUaGUgdmlzaWJpbGl0eSBAc2FtcHs5fSBtZWFucyB0aGF0IHRoZQorZmllbGQgaGFzIGJlZW4gb3B0aW1pemVkIG91dCBhbmQgaXMgcHVibGljICh0aGVyZSBpcyBubyB3YXkgdG8gc3BlY2lmeQorYW4gb3B0aW1pemVkIG91dCBmaWVsZCB3aXRoIGEgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgdmlzaWJpbGl0eSkuCitWaXNpYmlsaXR5IEBzYW1wezl9IGlzIG5vdCBzdXBwb3J0ZWQgYnkgR0RCIDQuMTE7IHRoaXMgc2hvdWxkIGJlIGZpeGVkCitpbiB0aGUgbmV4dCBHREIgcmVsZWFzZS4KKworVGhlIGZvbGxvd2luZyBDKysgc291cmNlOgorCitAZXhhbXBsZQorY2xhc3MgdmlzIEB7Citwcml2YXRlOgorICAgICAgICBpbnQgICBwcml2OworcHJvdGVjdGVkOgorICAgICAgICBjaGFyICBwcm90OworcHVibGljOgorICAgICAgICBmbG9hdCBwdWI7CitAfTsKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK2dlbmVyYXRlcyB0aGUgZm9sbG93aW5nIHN0YWI6CisKK0BleGFtcGxlCisjIEByezEyOCBpcyBOX0xTWU19Cisuc3RhYnMgInZpczpUMTk9czEycHJpdjovMDEsMCwzMjtwcm90Oi8xMiwzMiw4O3B1YjoxMiw2NCwzMjs7IiwxMjgsMCwwLDAKK0BlbmQgZXhhbXBsZQorCitAc2FtcHt2aXM6VDE5PXMxMn0gaW5kaWNhdGVzIHRoYXQgdHlwZSBudW1iZXIgMTkgaXMgYSAxMiBieXRlIHN0cnVjdHVyZQorbmFtZWQgQGNvZGV7dmlzfSBUaGUgQGNvZGV7cHJpdn0gZmllbGQgaGFzIHB1YmxpYyB2aXNpYmlsaXR5CisoQHNhbXB7LzB9KSwgdHlwZSBpbnQgKEBzYW1wezF9KSwgYW5kIG9mZnNldCBhbmQgc2l6ZSBAc2FtcHssMCwzMjt9LgorVGhlIEBjb2Rle3Byb3R9IGZpZWxkIGhhcyBwcm90ZWN0ZWQgdmlzaWJpbGl0eSAoQHNhbXB7LzF9KSwgdHlwZSBjaGFyCisoQHNhbXB7Mn0pIGFuZCBvZmZzZXQgYW5kIHNpemUgQHNhbXB7LDMyLDg7fS4gIFRoZSBAY29kZXtwdWJ9IGZpZWxkIGhhcwordHlwZSBmbG9hdCAoQHNhbXB7MTJ9KSwgYW5kIG9mZnNldCBhbmQgc2l6ZSBAc2FtcHssNjQsMzI7fS4KKworUHJvdGVjdGlvbnMgZm9yIG1lbWJlciBmdW5jdGlvbnMgYXJlIHNpZ25pZmllZCBieSBvbmUgZGlnaXQgZW1iZWRlZCBpbgordGhlIGZpZWxkIHBhcnQgb2YgdGhlIHN0YWIgZGVzY3JpYmluZyB0aGUgbWV0aG9kLiAgVGhlIGRpZ2l0IGlzIDAgaWYKK3ByaXZhdGUsIDEgaWYgcHJvdGVjdGVkIGFuZCAyIGlmIHB1YmxpYy4gIENvbnNpZGVyIHRoZSBDKysgY2xhc3MKK2RlZmluaXRpb24gYmVsb3c6CisKK0BleGFtcGxlCitjbGFzcyBhbGxfbWV0aG9kcyBAeworcHJpdmF0ZToKKyAgICAgICAgaW50ICAgcHJpdl9tZXRoKGludCBpbilAe3JldHVybiBpbjtAfTsKK3Byb3RlY3RlZDoKKyAgICAgICAgY2hhciAgcHJvdE1ldGgoY2hhciBpbilAe3JldHVybiBpbjtAfTsKK3B1YmxpYzoKKyAgICAgICAgZmxvYXQgcHViTWV0aChmbG9hdCBpbilAe3JldHVybiBpbjtAfTsKK0B9OworQGVuZCBleGFtcGxlCisKK0l0IGdlbmVyYXRlcyB0aGUgZm9sbG93aW5nIHN0YWIuICBUaGUgZGlnaXQgaW4gcXVlc3Rpb24gaXMgdG8gdGhlIGxlZnQKK29mIGFuIEBzYW1we0F9IGluIGVhY2ggY2FzZS4gIE5vdGljZSBhbHNvIHRoYXQgaW4gdGhpcyBjYXNlIHR3byBzeW1ib2wKK2Rlc2NyaXB0b3JzIGFwcGx5IHRvIHRoZSBjbGFzcyBuYW1lIHN0cnVjdCB0YWcgYW5kIHN0cnVjdCB0eXBlLgorCitAZGlzcGxheQorLnN0YWJzICJjbGFzc19uYW1lOnN5bV9kZXNjKHN0cnVjdCB0YWcmdHlwZSl0eXBlX2RlZigyMSk9CisgICAgICAgIHN5bV9kZXNjKHN0cnVjdClzdHJ1Y3RfYnl0ZXMoMSkKKyAgICAgICAgbWV0aF9uYW1lOjp0eXBlX2RlZigyMik9c3ltX2Rlc2MobWV0aG9kKXJldHVybmluZyhpbnQpOworICAgICAgICA6YXJncyhpbnQpO3Byb3RlY3Rpb24ocHJpdmF0ZSltb2RpZmllcihub3JtYWwpdmlydHVhbChubyk7CisgICAgICAgIG1ldGhfbmFtZTo6dHlwZV9kZWYoMjMpPXN5bV9kZXNjKG1ldGhvZClyZXR1cm5pbmcoY2hhcik7CisgICAgICAgIDphcmdzKGNoYXIpO3Byb3RlY3Rpb24ocHJvdGVjdGVkKW1vZGlmaWVyKG5vcm1hbCl2aXJ1YWwobm8pOworICAgICAgICBtZXRoX25hbWU6OnR5cGVfZGVmKDI0KT1zeW1fZGVzYyhtZXRob2QpcmV0dXJuaW5nKGZsb2F0KTsKKyAgICAgICAgOmFyZ3MoZmxvYXQpO3Byb3RlY3Rpb24ocHVibGljKW1vZGlmaWVyKG5vcm1hbCl2aXJ0dWFsKG5vKTs7IiwKKyAgICAgICAgTl9MU1lNLE5JTCxOSUwsTklMCitAZW5kIGRpc3BsYXkKKworQHNtYWxsZXhhbXBsZQorLnN0YWJzICJhbGxfbWV0aG9kczpUdDIxPXMxcHJpdl9tZXRoOjoyMj0jIzE7Omk7MEEuO3Byb3RNZXRoOjoyMz0jIzI7OmM7MUEuOworICAgICAgICBwdWJNZXRoOjoyND0jIzEyOzpmOzJBLjs7IiwxMjgsMCwwLDAKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2RlIE1ldGhvZCBNb2RpZmllcnMKK0BzZWN0aW9uIE1ldGhvZCBNb2RpZmllcnMgKEBjb2Rle2NvbnN0fSwgQGNvZGV7dm9sYXRpbGV9LCBAY29kZXtjb25zdCB2b2xhdGlsZX0pCisKKzw8IGJhc2VkIG9uIGE2LkMgPj4KKworSW4gdGhlIGNsYXNzIGV4YW1wbGUgZGVzY3JpYmVkIGFib3ZlIGFsbCB0aGUgbWV0aG9kcyBoYXZlIHRoZSBub3JtYWwKK21vZGlmaWVyLiAgVGhpcyBtZXRob2QgbW9kaWZpZXIgaW5mb3JtYXRpb24gaXMgbG9jYXRlZCBqdXN0IGFmdGVyIHRoZQorcHJvdGVjdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG1ldGhvZC4gIFRoaXMgZmllbGQgaGFzIGZvdXIgcG9zc2libGUKK2NoYXJhY3RlciB2YWx1ZXMuICBOb3JtYWwgbWV0aG9kcyB1c2UgQHNhbXB7QX0sIGNvbnN0IG1ldGhvZHMgdXNlCitAc2FtcHtCfSwgdm9sYXRpbGUgbWV0aG9kcyB1c2UgQHNhbXB7Q30sIGFuZCBjb25zdCB2b2xhdGlsZSBtZXRob2RzIHVzZQorQHNhbXB7RH0uICBDb25zaWRlciB0aGUgY2xhc3MgZGVmaW5pdGlvbiBiZWxvdzoKKworQGV4YW1wbGUKK2NsYXNzIEEgQHsKK3B1YmxpYzoKKyAgICAgICAgaW50IENvbnN0TWV0aCAoaW50IGFyZykgY29uc3QgQHsgcmV0dXJuIGFyZzsgQH07CisgICAgICAgIGNoYXIgVm9sYXRpbGVNZXRoIChjaGFyIGFyZykgdm9sYXRpbGUgQHsgcmV0dXJuIGFyZzsgQH07CisgICAgICAgIGZsb2F0IENvbnN0Vm9sTWV0aCAoZmxvYXQgYXJnKSBjb25zdCB2b2xhdGlsZSBAe3JldHVybiBhcmc7IEB9OworQH07CitAZW5kIGV4YW1wbGUKKworVGhpcyBjbGFzcyBpcyBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBzdGFiOgorCitAZGlzcGxheQorLnN0YWJzICJjbGFzcyhBKTpzeW1fZGVzYyhzdHJ1Y3QpdHlwZV9kZWYoMjApPXR5cGVfZGVzYyhzdHJ1Y3Qpc3RydWN0X2J5dGVzKDEpCisgICAgICAgIG1ldGhfbmFtZShDb25zdE1ldGgpOjp0eXBlX2RlZigyMSlzeW1fZGVzYyhtZXRob2QpCisgICAgICAgIHJldHVybmluZyhpbnQpOzphcmcoaW50KTtwcm90ZWN0aW9uKHB1YmxpYyltb2RpZmllcihjb25zdCl2aXJ0dWFsKG5vKTsKKyAgICAgICAgbWV0aF9uYW1lKFZvbGF0aWxlTWV0aCk6OnR5cGVfZGVmKDIyKT1zeW1fZGVzYyhtZXRob2QpCisgICAgICAgIHJldHVybmluZyhjaGFyKTs6YXJnKGNoYXIpO3Byb3RlY3Rpb24ocHVibGljKW1vZGlmaWVyKHZvbGF0aWxlKXZpcnQobm8pCisgICAgICAgIG1ldGhfbmFtZShDb25zdFZvbE1ldGgpOjp0eXBlX2RlZigyMyk9c3ltX2Rlc2MobWV0aG9kKQorICAgICAgICByZXR1cm5pbmcoZmxvYXQpOzphcmcoZmxvYXQpO3Byb3RlY3Rpb24ocHVibGljKW1vZGlmZXIoY29uc3Qgdm9sYXRpbGUpCisgICAgICAgIHZpcnR1YWwobm8pOzsiLCBAZG90c3t9CitAZW5kIGRpc3BsYXkKKworQGV4YW1wbGUKKy5zdGFicyAiQTpUMjA9czFDb25zdE1ldGg6OjIxPSMjMTs6aTsyQi47Vm9sYXRpbGVNZXRoOjoyMj0jIzI7OmM7MkMuOworICAgICAgICAgICAgIENvbnN0Vm9sTWV0aDo6MjM9IyMxMjs6ZjsyRC47OyIsMTI4LDAsMCwwCitAZW5kIGV4YW1wbGUKKworQG5vZGUgVmlydHVhbCBNZXRob2RzCitAc2VjdGlvbiBWaXJ0dWFsIE1ldGhvZHMKKworPDwgVGhlIGZvbGxvd2luZyBleGFtcGxlcyBhcmUgYmFzZWQgb24gYTQuQyA+PgorCitUaGUgcHJlc2VuY2Ugb2YgdmlydHVhbCBtZXRob2RzIGluIGEgY2xhc3MgZGVmaW5pdGlvbiBhZGRzIGFkZGl0aW9uYWwKK2RhdGEgdG8gdGhlIGNsYXNzIGRlc2NyaXB0aW9uLiAgVGhlIGV4dHJhIGRhdGEgaXMgYXBwZW5kZWQgdG8gdGhlCitkZXNjcmlwdGlvbiBvZiB0aGUgdmlydHVhbCBtZXRob2QgYW5kIHRvIHRoZSBlbmQgb2YgdGhlIGNsYXNzCitkZXNjcmlwdGlvbi4gIENvbnNpZGVyIHRoZSBjbGFzcyBkZWZpbml0aW9uIGJlbG93OgorCitAZXhhbXBsZQorY2xhc3MgQSBAeworcHVibGljOgorICAgICAgICBpbnQgQWRhdDsKKyAgICAgICAgdmlydHVhbCBpbnQgQV92aXJ0IChpbnQgYXJnKSBAeyByZXR1cm4gYXJnOyBAfTsKK0B9OworQGVuZCBleGFtcGxlCisKK1RoaXMgcmVzdWx0cyBpbiB0aGUgc3RhYiBiZWxvdyBkZXNjcmliaW5nIGNsYXNzIEEuICBJdCBkZWZpbmVzIGEgbmV3Cit0eXBlICgyMCkgd2hpY2ggaXMgYW4gOCBieXRlIHN0cnVjdHVyZS4gIFRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgY2xhc3MKK3N0cnVjdCBpcyBAc2FtcHtBZGF0fSwgYW4gaW50ZWdlciwgc3RhcnRpbmcgYXQgc3RydWN0dXJlIG9mZnNldCAwIGFuZAorb2NjdXB5aW5nIDMyIGJpdHMuCisKK1RoZSBzZWNvbmQgZmllbGQgaW4gdGhlIGNsYXNzIHN0cnVjdCBpcyBub3QgZXhwbGljaXRseSBkZWZpbmVkIGJ5IHRoZQorQysrIGNsYXNzIGRlZmluaXRpb24gYnV0IGlzIGltcGxpZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgY2xhc3MKK2NvbnRhaW5zIGEgdmlydHVhbCBtZXRob2QuICBUaGlzIGZpZWxkIGlzIHRoZSB2dGFibGUgcG9pbnRlci4gIFRoZQorbmFtZSBvZiB0aGUgdnRhYmxlIHBvaW50ZXIgZmllbGQgc3RhcnRzIHdpdGggQHNhbXB7JHZmfSBhbmQgY29udGludWVzIHdpdGggYQordHlwZSByZWZlcmVuY2UgdG8gdGhlIGNsYXNzIGl0IGlzIHBhcnQgb2YuICBJbiB0aGlzIGV4YW1wbGUgdGhlIHR5cGUKK3JlZmVyZW5jZSBmb3IgY2xhc3MgQSBpcyAyMCBzbyB0aGUgbmFtZSBvZiBpdHMgdnRhYmxlIHBvaW50ZXIgZmllbGQgaXMKK0BzYW1weyR2ZjIwfSwgZm9sbG93ZWQgYnkgdGhlIHVzdWFsIGNvbG9uLgorCitOZXh0IHRoZXJlIGlzIGEgdHlwZSBkZWZpbml0aW9uIGZvciB0aGUgdnRhYmxlIHBvaW50ZXIgdHlwZSAoMjEpLgorVGhpcyBpcyBpbiB0dXJuIGRlZmluZWQgYXMgYSBwb2ludGVyIHRvIGFub3RoZXIgbmV3IHR5cGUgKDIyKS4KKworVHlwZSAyMiBpcyB0aGUgdnRhYmxlIGl0c2VsZiwgd2hpY2ggaXMgZGVmaW5lZCBhcyBhbiBhcnJheSwgaW5kZXhlZCBieQorYSByYW5nZSBvZiBpbnRlZ2VycyBiZXR3ZWVuIDAgYW5kIDEsIGFuZCB3aG9zZSBlbGVtZW50cyBhcmUgb2YgdHlwZQorMTcuICBUeXBlIDE3IHdhcyB0aGUgdnRhYmxlIHJlY29yZCB0eXBlIGRlZmluZWQgYnkgdGhlIGJvaWxlcnBsYXRlIEMrKwordHlwZSBkZWZpbml0aW9ucywgYXMgc2hvd24gZWFybGllci4KKworVGhlIGJpdCBvZmZzZXQgb2YgdGhlIHZ0YWJsZSBwb2ludGVyIGZpZWxkIGlzIDMyLiAgVGhlIG51bWJlciBvZiBiaXRzCitpbiB0aGUgZmllbGQgYXJlIG5vdCBzcGVjaWZpZWQgd2hlbiB0aGUgZmllbGQgaXMgYSB2dGFibGUgcG9pbnRlci4KKworTmV4dCBpcyB0aGUgbWV0aG9kIGRlZmluaXRpb24gZm9yIHRoZSB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbiBAY29kZXtBX3ZpcnR9LgorSXRzIGRlc2NyaXB0aW9uIHN0YXJ0cyBvdXQgdXNpbmcgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBub24tdmlydHVhbAorbWVtYmVyIGZ1bmN0aW9ucyBkZXNjcmliZWQgYWJvdmUsIGV4Y2VwdCBpbnN0ZWFkIG9mIGEgZG90IGFmdGVyIHRoZQorQHNhbXB7QX0gdGhlcmUgaXMgYW4gYXN0ZXJpc2ssIGluZGljYXRpbmcgdGhhdCB0aGUgZnVuY3Rpb24gaXMgdmlydHVhbC4KK1NpbmNlIGlzIGlzIHZpcnR1YWwgc29tZSBhZGRpdGlvbiBpbmZvcm1hdGlvbiBpcyBhcHBlbmRlZCB0byB0aGUgZW5kCitvZiB0aGUgbWV0aG9kIGRlc2NyaXB0aW9uLgorCitUaGUgZmlyc3QgbnVtYmVyIHJlcHJlc2VudHMgdGhlIHZ0YWJsZSBpbmRleCBvZiB0aGUgbWV0aG9kLiAgVGhpcyBpcyBhCiszMiBiaXQgdW5zaWduZWQgbnVtYmVyIHdpdGggdGhlIGhpZ2ggYml0IHNldCwgZm9sbG93ZWQgYnkgYQorc2VtaS1jb2xvbi4KKworVGhlIHNlY29uZCBudW1iZXIgaXMgYSB0eXBlIHJlZmVyZW5jZSB0byB0aGUgZmlyc3QgYmFzZSBjbGFzcyBpbiB0aGUKK2luaGVyaXRlbmNlIGhpZXJhcmNoeSBkZWZpbmluZyB0aGUgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb24uICBJbiB0aGlzCitjYXNlIHRoZSBjbGFzcyBzdGFiIGRlc2NyaWJlcyBhIGJhc2UgY2xhc3Mgc28gdGhlIHZpcnR1YWwgZnVuY3Rpb24gaXMKK25vdCBvdmVycmlkaW5nIGFueSBvdGhlciBkZWZpbml0aW9uIG9mIHRoZSBtZXRob2QuICBUaGVyZWZvcmUgdGhlCityZWZlcmVuY2UgaXMgdG8gdGhlIHR5cGUgbnVtYmVyIG9mIHRoZSBjbGFzcyB0aGF0IHRoZSBzdGFiIGlzCitkZXNjcmliaW5nICgyMCkuCisKK1RoaXMgaXMgZm9sbG93ZWQgYnkgdGhyZWUgc2VtaS1jb2xvbnMuICBPbmUgbWFya3MgdGhlIGVuZCBvZiB0aGUKK2N1cnJlbnQgc3ViLXNlY3Rpb24sIG9uZSBtYXJrcyB0aGUgZW5kIG9mIHRoZSBtZXRob2QgZmllbGQsIGFuZCB0aGUKK3RoaXJkIG1hcmtzIHRoZSBlbmQgb2YgdGhlIHN0cnVjdCBkZWZpbml0aW9uLgorCitGb3IgY2xhc3NlcyBjb250YWluaW5nIHZpcnR1YWwgZnVuY3Rpb25zIHRoZSB2ZXJ5IGxhc3Qgc2VjdGlvbiBvZiB0aGUKK3N0cmluZyBwYXJ0IG9mIHRoZSBzdGFiIGhvbGRzIGEgdHlwZSByZWZlcmVuY2UgdG8gdGhlIGZpcnN0IGJhc2UKK2NsYXNzLiAgVGhpcyBpcyBwcmVjZWVkZWQgYnkgQHNhbXB7fiV9IGFuZCBmb2xsb3dlZCBieSBhIGZpbmFsIHNlbWktY29sb24uCisKK0BkaXNwbGF5Cisuc3RhYnMgImNsYXNzX25hbWUoQSk6dHlwZV9kZWYoMjApPXN5bV9kZXNjKHN0cnVjdClzdHJ1Y3RfYnl0ZXMoOCkKKyAgICAgICAgZmllbGRfbmFtZShBZGF0KTp0eXBlX3JlZihpbnQpLGJpdF9vZmZzZXQoMCksZmllbGRfYml0cygzMik7CisgICAgICAgIGZpZWxkX25hbWUoQSB2aXJ0IGZ1bmMgcHRyKTp0eXBlX2RlZigyMSk9dHlwZV9kZXNjKHB0ciB0byl0eXBlX2RlZigyMik9CisgICAgICAgIHN5bV9kZXNjKGFycmF5KWluZGV4X3R5cGVfcmVmKHJhbmdlIG9mIGludCBmcm9tIDAgdG8gMSk7CisgICAgICAgIGVsZW1fdHlwZV9yZWYodnRibCBlbGVtIHR5cGUpLAorICAgICAgICBiaXRfb2Zmc2V0KDMyKTsKKyAgICAgICAgbWV0aF9uYW1lKEFfdmlydCk6OnR5cGVkZWYoMjMpPXN5bV9kZXNjKG1ldGhvZClyZXR1cm5pbmcoaW50KTsKKyAgICAgICAgOmFyZ190eXBlKGludCkscHJvdGVjdGlvbihwdWJsaWMpbm9ybWFsKHllcyl2aXJ0dWFsKHllcykKKyAgICAgICAgdnRhYmxlX2luZGV4KDEpO2NsYXNzX2ZpcnN0X2RlZmluaW5nKEEpOzs7fiVmaXJzdF9iYXNlKEEpOyIsCisgICAgICAgIE5fTFNZTSxOSUwsTklMLE5JTAorQGVuZCBkaXNwbGF5CisKK0BjIEZJWE1FOiBib2d1cyBsaW5lIGJyZWFrLgorQGV4YW1wbGUKKy5zdGFicyAiQTp0MjA9czhBZGF0OjEsMCwzMjskdmYyMDoyMT0qMjI9YXIxOzA7MTsxNywzMjsKKyAgICAgICAgQV92aXJ0OjoyMz0jIzE7Omk7MkEqLTIxNDc0ODM2NDc7MjA7Ozt+JTIwOyIsMTI4LDAsMCwwCitAZW5kIGV4YW1wbGUKKworQG5vZGUgSW5oZXJpdGVuY2UKK0BzZWN0aW9uIEluaGVyaXRlbmNlCisKK1N0YWJzIGRlc2NyaWJpbmcgQysrIGRlcml2ZWQgY2xhc3NlcyBpbmNsdWRlIGFkZGl0aW9uYWwgc2VjdGlvbnMgdGhhdAorZGVzY3JpYmUgdGhlIGluaGVyaXRlbmNlIGhpZXJhcmNoeSBvZiB0aGUgY2xhc3MuICBBIGRlcml2ZWQgY2xhc3Mgc3RhYgorYWxzbyBlbmNvZGVzIHRoZSBudW1iZXIgb2YgYmFzZSBjbGFzc2VzLiAgRm9yIGVhY2ggYmFzZSBjbGFzcyBpdCB0ZWxscworaWYgdGhlIGJhc2UgY2xhc3MgaXMgdmlydHVhbCBvciBub3QsIGFuZCBpZiB0aGUgaW5oZXJpdGVuY2UgaXMgcHJpdmF0ZQorb3IgcHVibGljLiAgSXQgYWxzbyBnaXZlcyB0aGUgb2Zmc2V0IGludG8gdGhlIG9iamVjdCBvZiB0aGUgcG9ydGlvbiBvZgordGhlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIGVhY2ggYmFzZSBjbGFzcy4KKworVGhpcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzIGVtYmVkZWQgaW4gdGhlIGNsYXNzIHN0YWIgZm9sbG93aW5nIHRoZQorbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzdHJ1Y3QuICBGaXJzdCB0aGUgbnVtYmVyIG9mIGJhc2UgY2xhc3NlcworYXBwZWFycyBicmFja2V0ZWQgYnkgYW4gZXhjbGFtYXRpb24gcG9pbnQgYW5kIGEgY29tbWEuCisKK1RoZW4gZm9yIGVhY2ggYmFzZSB0eXBlIHRoZXJlIHJlcGVhdHMgYSBzZXJpZXM6IGEgdmlydHVhbCBjaGFyYWN0ZXIsIGEKK3Zpc2liaWx0eSBjaGFyYWN0ZXIsIGEgbnVtYmVyLCBhIGNvbW1hLCBhbm90aGVyIG51bWJlciwgYW5kIGEKK3NlbWktY29sb24uCisKK1RoZSB2aXJ0dWFsIGNoYXJhY3RlciBpcyBAc2FtcHsxfSBpZiB0aGUgYmFzZSBjbGFzcyBpcyB2aXJ0dWFsIGFuZAorQHNhbXB7MH0gaWYgbm90LiAgVGhlIHZpc2liaWxpdHkgY2hhcmFjdGVyIGlzIEBzYW1wezJ9IGlmIHRoZSBkZXJpdmF0aW9uCitpcyBwdWJsaWMsIEBzYW1wezF9IGlmIGl0IGlzIHByb3RlY3RlZCwgYW5kIEBzYW1wezB9IGlmIGl0IGlzIHByaXZhdGUuCitEZWJ1Z2dlcnMgc2hvdWxkIGlnbm9yZSB2aXJ0dWFsIG9yIHZpc2liaWxpdHkgY2hhcmFjdGVycyB0aGV5IGRvIG5vdAorcmVjb2duaXplLCBhbmQgYXNzdW1lIGEgcmVhc29uYWJsZSBkZWZhdWx0IChzdWNoIGFzIHB1YmxpYyBhbmQKK25vbi12aXJ0dWFsKSAoR0RCIDQuMTEgZG9lcyBub3QsIGJ1dCB0aGlzIHNob3VsZCBiZSBmaXhlZCBpbiB0aGUgbmV4dAorR0RCIHJlbGVhc2UpLgorCitUaGUgbnVtYmVyIGZvbGxvd2luZyB0aGUgdmlydHVhbCBhbmQgdmlzaWJpbGl0eSBjaGFyYWN0ZXJzIGlzIHRoZSBvZmZzZXQKK2Zyb20gdGhlIHN0YXJ0IG9mIHRoZSBvYmplY3QgdG8gdGhlIHBhcnQgb2YgdGhlIG9iamVjdCBwZXJ0YWluaW5nIHRvIHRoZQorYmFzZSBjbGFzcy4KKworQWZ0ZXIgdGhlIGNvbW1hLCB0aGUgc2Vjb25kIG51bWJlciBpcyBhIHR5cGVfZGVzY3JpcHRvciBmb3IgdGhlIGJhc2UKK3R5cGUuICBGaW5hbGx5IGEgc2VtaS1jb2xvbiBlbmRzIHRoZSBzZXJpZXMsIHdoaWNoIHJlcGVhdHMgZm9yIGVhY2gKK2Jhc2UgY2xhc3MuCisKK1RoZSBzb3VyY2UgYmVsb3cgZGVmaW5lcyB0aHJlZSBiYXNlIGNsYXNzZXMgQGNvZGV7QX0sIEBjb2Rle0J9LCBhbmQKK0Bjb2Rle0N9IGFuZCB0aGUgZGVyaXZlZCBjbGFzcyBAY29kZXtEfS4KKworCitAZXhhbXBsZQorY2xhc3MgQSBAeworcHVibGljOgorICAgICAgICBpbnQgQWRhdDsKKyAgICAgICAgdmlydHVhbCBpbnQgQV92aXJ0IChpbnQgYXJnKSBAeyByZXR1cm4gYXJnOyBAfTsKK0B9OworCitjbGFzcyBCIEB7CitwdWJsaWM6CisgICAgICAgIGludCBCX2RhdDsKKyAgICAgICAgdmlydHVhbCBpbnQgQl92aXJ0IChpbnQgYXJnKSBAe3JldHVybiBhcmc7IEB9OworQH07CisKK2NsYXNzIEMgQHsKK3B1YmxpYzoKKyAgICAgICAgaW50IENkYXQ7CisgICAgICAgIHZpcnR1YWwgaW50IENfdmlydCAoaW50IGFyZykgQHtyZXR1cm4gYXJnOyBAfTsKK0B9OworCitjbGFzcyBEIDogQSwgdmlydHVhbCBCLCBwdWJsaWMgQyBAeworcHVibGljOgorICAgICAgICBpbnQgRGRhdDsKKyAgICAgICAgdmlydHVhbCBpbnQgQV92aXJ0IChpbnQgYXJnICkgQHsgcmV0dXJuIGFyZysxOyBAfTsKKyAgICAgICAgdmlydHVhbCBpbnQgQl92aXJ0IChpbnQgYXJnKSAgQHsgcmV0dXJuIGFyZysyOyBAfTsKKyAgICAgICAgdmlydHVhbCBpbnQgQ192aXJ0IChpbnQgYXJnKSAgQHsgcmV0dXJuIGFyZyszOyBAfTsKKyAgICAgICAgdmlydHVhbCBpbnQgRF92aXJ0IChpbnQgYXJnKSAgQHsgcmV0dXJuIGFyZzsgQH07CitAfTsKK0BlbmQgZXhhbXBsZQorCitDbGFzcyBzdGFicyBzaW1pbGFyIHRvIHRoZSBvbmVzIGRlc2NyaWJlZCBlYXJsaWVyIGFyZSBnZW5lcmF0ZWQgZm9yCitlYWNoIGJhc2UgY2xhc3MuCisKK0BjIEZJWE1FISEhIHRoZSBsaW5lYnJlYWtzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBwcm9iYWJseSBtYWtlIHRoZQorQGMgZXhhbXBsZXMgbGl0ZXJhbGx5IHVudXNhYmxlLCBidXQgSSBkb24ndCBrbm93IGFueSBvdGhlciB3YXkgdG8gZ2V0CitAYyB0aGVtIG9uIHRoZSBwYWdlLgorQGMgT25lIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHB1dCBzb21lIG9mIHRoZSB0eXBlIGRlZmluaXRpb25zIGludG8KK0BjIHNlcGFyYXRlIHN0YWJzLCBldmVuIGlmIHRoYXQncyBub3QgZXhhY3RseSB3aGF0IHRoZSBjb21waWxlciBhY3R1YWxseQorQGMgZW1pdHMuCitAc21hbGxleGFtcGxlCisuc3RhYnMgIkE6VDIwPXM4QWRhdDoxLDAsMzI7JHZmMjA6MjE9KjIyPWFyMTswOzE7MTcsMzI7CisgICAgICAgIEFfdmlydDo6MjM9IyMxOzppOzJBKi0yMTQ3NDgzNjQ3OzIwOzs7fiUyMDsiLDEyOCwwLDAsMAorCisuc3RhYnMgIkI6VHQyNT1zOEJkYXQ6MSwwLDMyOyR2ZjI1OjIxLDMyO0JfdmlydDo6MjY9IyMxOworICAgICAgICA6aTsyQSotMjE0NzQ4MzY0NzsyNTs7O34lMjU7IiwxMjgsMCwwLDAKKworLnN0YWJzICJDOlR0Mjg9czhDZGF0OjEsMCwzMjskdmYyODoyMSwzMjtDX3ZpcnQ6OjI5PSMjMTsKKyAgICAgICAgOmk7MkEqLTIxNDc0ODM2NDc7Mjg7Ozt+JTI4OyIsMTI4LDAsMCwwCitAZW5kIHNtYWxsZXhhbXBsZQorCitJbiB0aGUgc3RhYiBkZXNjcmliaW5nIGRlcml2ZWQgY2xhc3MgQGNvZGV7RH0gYmVsb3csIHRoZSBpbmZvcm1hdGlvbiBhYm91dAordGhlIGRlcml2YXRpb24gb2YgdGhpcyBjbGFzcyBpcyBlbmNvZGVkIGFzIGZvbGxvd3MuCisKK0BkaXNwbGF5Cisuc3RhYnMgImRlcml2ZWRfY2xhc3NfbmFtZTpzeW1ib2xfZGVzY3JpcHRvcnMoc3RydWN0IHRhZyZ0eXBlKT0KKyAgICAgICAgdHlwZV9kZXNjcmlwdG9yKHN0cnVjdClzdHJ1Y3RfYnl0ZXMoMzIpIW51bV9iYXNlcygzKSwKKyAgICAgICAgYmFzZV92aXJ0dWFsKG5vKWluaGVyaXRlbmNlX3B1YmxpYyhubyliYXNlX29mZnNldCgwKSwKKyAgICAgICAgYmFzZV9jbGFzc190eXBlX3JlZihBKTsKKyAgICAgICAgYmFzZV92aXJ0dWFsKHllcylpbmhlcml0ZW5jZV9wdWJsaWMobm8pYmFzZV9vZmZzZXQoTklMKSwKKyAgICAgICAgYmFzZV9jbGFzc190eXBlX3JlZihCKTsKKyAgICAgICAgYmFzZV92aXJ0dWFsKG5vKWluaGVyaXRlbmNlX3B1YmxpYyh5ZXMpYmFzZV9vZmZzZXQoNjQpLAorICAgICAgICBiYXNlX2NsYXNzX3R5cGVfcmVmKEMpOyBAZG90c3t9CitAZW5kIGRpc3BsYXkKKworQGMgRklYTUUhIGZha2UgbGluZWJyZWFrcy4KK0BzbWFsbGV4YW1wbGUKKy5zdGFicyAiRDpUdDMxPXMzMiEzLDAwMCwyMDsxMDAsMjU7MDI2NCwyODskdmIyNToyNCwxMjg7RGRhdDoKKyAgICAgICAgMSwxNjAsMzI7QV92aXJ0OjozMj0jIzE7Omk7MkEqLTIxNDc0ODM2NDc7MjA7O0JfdmlydDoKKyAgICAgICAgOjMyOmk7MkEqLTIxNDc0ODM2NDc7MjU7O0NfdmlydDo6MzI6aTsyQSotMjE0NzQ4MzY0NzsKKyAgICAgICAgMjg7O0RfdmlydDo6MzI6aTsyQSotMjE0NzQ4MzY0NjszMTs7O34lMjA7IiwxMjgsMCwwLDAKK0BlbmQgc21hbGxleGFtcGxlCisKK0Bub2RlIFZpcnR1YWwgQmFzZSBDbGFzc2VzCitAc2VjdGlvbiBWaXJ0dWFsIEJhc2UgQ2xhc3NlcworCitBIGRlcml2ZWQgY2xhc3Mgb2JqZWN0IGNvbnNpc3RzIG9mIGEgY29uY2F0aW5hdGlvbiBpbiBtZW1vcnkgb2YgdGhlIGRhdGEKK2FyZWFzIGRlZmluZWQgYnkgZWFjaCBiYXNlIGNsYXNzLCBzdGFydGluZyB3aXRoIHRoZSBsZWZ0bW9zdCBhbmQgZW5kaW5nCit3aXRoIHRoZSByaWdodG1vc3QgaW4gdGhlIGxpc3Qgb2YgYmFzZSBjbGFzc2VzLiAgVGhlIGV4Y2VwdGlvbiB0byB0aGlzCitydWxlIGlzIGZvciB2aXJ0dWFsIGluaGVyaXRlbmNlLiAgSW4gdGhlIGV4YW1wbGUgYWJvdmUsIGNsYXNzIEBjb2Rle0R9Citpbmhlcml0cyB2aXJ0dWFsbHkgZnJvbSBiYXNlIGNsYXNzIEBjb2Rle0J9LiAgVGhpcyBtZWFucyB0aGF0IGFuCitpbnN0YW5jZSBvZiBhIEBjb2Rle0R9IG9iamVjdCB3aWxsIG5vdCBjb250YWluIGl0cyBvd24gQGNvZGV7Qn0gcGFydCBidXQKK21lcmVseSBhIHBvaW50ZXIgdG8gYSBAY29kZXtCfSBwYXJ0LCBrbm93biBhcyBhIHZpcnR1YWwgYmFzZSBwb2ludGVyLgorCitJbiBhIGRlcml2ZWQgY2xhc3Mgc3RhYiwgdGhlIGJhc2Ugb2Zmc2V0IHBhcnQgb2YgdGhlIGRlcml2YXRpb24KK2luZm9ybWF0aW9uLCBkZXNjcmliZWQgYWJvdmUsIHNob3dzIGhvdyB0aGUgYmFzZSBjbGFzcyBwYXJ0cyBhcmUKK29yZGVyZWQuICBUaGUgYmFzZSBvZmZzZXQgZm9yIGEgdmlydHVhbCBiYXNlIGNsYXNzIGlzIGFsd2F5cyBnaXZlbiBhcyAwLgorTm90aWNlIHRoYXQgdGhlIGJhc2Ugb2Zmc2V0IGZvciBAY29kZXtCfSBpcyBnaXZlbiBhcyAwIGV2ZW4gdGhvdWdoCitAY29kZXtCfSBpcyBub3QgdGhlIGZpcnN0IGJhc2UgY2xhc3MuICBUaGUgZmlyc3QgYmFzZSBjbGFzcyBAY29kZXtBfQorc3RhcnRzIGF0IG9mZnNldCAwLgorCitUaGUgZmllbGQgaW5mb3JtYXRpb24gcGFydCBvZiB0aGUgc3RhYiBmb3IgY2xhc3MgQGNvZGV7RH0gZGVzY3JpYmVzIHRoZSBmaWVsZAord2hpY2ggaXMgdGhlIHBvaW50ZXIgdG8gdGhlIHZpcnR1YWwgYmFzZSBjbGFzcyBAY29kZXtCfS4gVGhlIHZiYXNlIHBvaW50ZXIKK25hbWUgaXMgQHNhbXB7JHZifSBmb2xsb3dlZCBieSBhIHR5cGUgcmVmZXJlbmNlIHRvIHRoZSB2aXJ0dWFsIGJhc2UgY2xhc3MuCitTaW5jZSB0aGUgdHlwZSBpZCBmb3IgQGNvZGV7Qn0gaW4gdGhpcyBleGFtcGxlIGlzIDI1LCB0aGUgdmJhc2UgcG9pbnRlciBuYW1lCitpcyBAc2FtcHskdmIyNX0uCisKK0BjIEZJWE1FISEgZmFrZSBsaW5lYnJlYWtzIGJlbG93CitAc21hbGxleGFtcGxlCisuc3RhYnMgIkQ6VHQzMT1zMzIhMywwMDAsMjA7MTAwLDI1OzAyNjQsMjg7JHZiMjU6MjQsMTI4O0RkYXQ6MSwKKyAgICAgICAxNjAsMzI7QV92aXJ0OjozMj0jIzE7Omk7MkEqLTIxNDc0ODM2NDc7MjA7O0JfdmlydDo6MzI6aTsKKyAgICAgICAyQSotMjE0NzQ4MzY0NzsyNTs7Q192aXJ0OjozMjppOzJBKi0yMTQ3NDgzNjQ3OzI4OztEX3ZpcnQ6CisgICAgICAgOjMyOmk7MkEqLTIxNDc0ODM2NDY7MzE7Ozt+JTIwOyIsMTI4LDAsMCwwCitAZW5kIHNtYWxsZXhhbXBsZQorCitGb2xsb3dpbmcgdGhlIG5hbWUgYW5kIGEgc2VtaWNvbG9uIGlzIGEgdHlwZSByZWZlcmVuY2UgZGVzY3JpYmluZyB0aGUKK3R5cGUgb2YgdGhlIHZpcnR1YWwgYmFzZSBjbGFzcyBwb2ludGVyLCBpbiB0aGlzIGNhc2UgMjQuICBUeXBlIDI0IHdhcworZGVmaW5lZCBlYXJsaWVyIGFzIHRoZSB0eXBlIG9mIHRoZSBAY29kZXtCfSBjbGFzcyBAY29kZXt0aGlzfSBwb2ludGVyLiAgVGhlCitAY29kZXt0aGlzfSBwb2ludGVyIGZvciBhIGNsYXNzIGlzIGEgcG9pbnRlciB0byB0aGUgY2xhc3MgdHlwZS4KKworQGV4YW1wbGUKKy5zdGFicyAidGhpczpQMjQ9KjI1PXhzQjoiLDY0LDAsMCw4CitAZW5kIGV4YW1wbGUKKworRmluYWxseSB0aGUgZmllbGQgb2Zmc2V0IHBhcnQgb2YgdGhlIHZiYXNlIHBvaW50ZXIgZmllbGQgZGVzY3JpcHRpb24KK3Nob3dzIHRoYXQgdGhlIHZiYXNlIHBvaW50ZXIgaXMgdGhlIGZpcnN0IGZpZWxkIGluIHRoZSBAY29kZXtEfSBvYmplY3QsCitiZWZvcmUgYW55IGRhdGEgZmllbGRzIGRlZmluZWQgYnkgdGhlIGNsYXNzLiAgVGhlIGxheW91dCBvZiBhIEBjb2Rle0R9CitjbGFzcyBvYmplY3QgaXMgYSBmb2xsb3dzLCBAY29kZXtBZGF0fSBhdCAwLCB0aGUgdnRhYmxlIHBvaW50ZXIgZm9yCitAY29kZXtBfSBhdCAzMiwgQGNvZGV7Q2RhdH0gYXQgNjQsIHRoZSB2dGFibGUgcG9pbnRlciBmb3IgQyBhdCA5NiwgdGhlCit2aXJ0dWFsIGJhc2UgcG9pbnRlciBmb3IgQGNvZGV7Qn0gYXQgMTI4LCBhbmQgQGNvZGV7RGRhdH0gYXQgMTYwLgorCisKK0Bub2RlIFN0YXRpYyBNZW1iZXJzCitAc2VjdGlvbiBTdGF0aWMgTWVtYmVycworCitUaGUgZGF0YSBhcmVhIGZvciBhIGNsYXNzIGlzIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgc3BhY2UgdXNlZCBieSB0aGUKK2RhdGEgbWVtYmVycyBvZiB0aGUgY2xhc3MuICBJZiB0aGUgY2xhc3MgaGFzIHZpcnR1YWwgbWV0aG9kcywgYSB2dGFibGUKK3BvaW50ZXIgZm9sbG93cyB0aGUgY2xhc3MgZGF0YS4gIFRoZSBmaWVsZCBvZmZzZXQgcGFydCBvZiBlYWNoIGZpZWxkCitkZXNjcmlwdGlvbiBpbiB0aGUgY2xhc3Mgc3RhYiBzaG93cyB0aGlzIG9yZGVyaW5nLgorCis8PCBIb3cgaXMgdGhpcyByZWZsZWN0ZWQgaW4gc3RhYnM/ICBTZWUgQ3lnbnVzIGJ1ZyAjNjc3IGZvciBzb21lIGluZm8uICA+PgorCitAbm9kZSBTdGFiIFR5cGVzCitAYXBwZW5kaXggVGFibGUgb2YgU3RhYiBUeXBlcworCitUaGUgZm9sbG93aW5nIGFyZSBhbGwgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIHN0YWIgdHlwZSBmaWVsZCwgZm9yCithLm91dCBmaWxlcywgaW4gbnVtZXJpYyBvcmRlci4gIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gWENPRkYsIGJ1dAoraXQgZG9lcyBhcHBseSB0byBzdGFicyBpbiBzZWN0aW9ucyAoQHB4cmVme1N0YWIgU2VjdGlvbnN9KS4gIFN0YWJzIGluCitFQ09GRiB1c2UgdGhlc2UgdmFsdWVzIGJ1dCBhZGQgMHg4ZjMwMCB0byBkaXN0aW5ndWlzaCB0aGVtIGZyb20gbm9uLXN0YWIKK3N5bWJvbHMuCisKK1RoZSBzeW1ib2xpYyBuYW1lcyBhcmUgZGVmaW5lZCBpbiB0aGUgZmlsZSBAZmlsZXtpbmNsdWRlL2FvdXQvc3RhYnMuZGVmfS4KKworQG1lbnUKKyogTm9uLVN0YWIgU3ltYm9sIFR5cGVzOjoJVHlwZXMgZnJvbSAwIHRvIDB4MWYKKyogU3RhYiBTeW1ib2wgVHlwZXM6OgkJVHlwZXMgZnJvbSAweDIwIHRvIDB4ZmYKK0BlbmQgbWVudQorCitAbm9kZSBOb24tU3RhYiBTeW1ib2wgVHlwZXMKK0BhcHBlbmRpeHNlYyBOb24tU3RhYiBTeW1ib2wgVHlwZXMKKworVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgdXNlZCBieSB0aGUgbGlua2VyIGFuZCBhc3NlbWJsZXIsIG5vdCBieSBzdGFiCitkaXJlY3RpdmVzLiAgU2luY2UgdGhpcyBkb2N1bWVudCBkb2VzIG5vdCBhdHRlbXB0IHRvIGRlc2NyaWJlIGFzcGVjdHMgb2YKK29iamVjdCBmaWxlIGZvcm1hdCBvdGhlciB0aGFuIHRoZSBkZWJ1Z2dpbmcgZm9ybWF0LCBubyBkZXRhaWxzIGFyZQorZ2l2ZW4uCisKK0BjIFRyeSB0byBnZXQgbW9zdCBvZiB0aGVzZSB0byBmaXQgb24gYSBzaW5nbGUgbGluZS4KK0BpZnRleAorQHRhYmxlaW5kZW50PTEuNWluCitAZW5kIGlmdGV4CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gMHgwICAgICBOX1VOREYKK1VuZGVmaW5lZCBzeW1ib2wKKworQGl0ZW0gMHgyICAgICBOX0FCUworRmlsZSBzY29wZSBhYnNvbHV0ZSBzeW1ib2wKKworQGl0ZW0gMHgzICAgICBOX0FCUyB8IE5fRVhUCitFeHRlcm5hbCBhYnNvbHV0ZSBzeW1ib2wKKworQGl0ZW0gMHg0ICAgICBOX1RFWFQKK0ZpbGUgc2NvcGUgdGV4dCBzeW1ib2wKKworQGl0ZW0gMHg1ICAgICBOX1RFWFQgfCBOX0VYVAorRXh0ZXJuYWwgdGV4dCBzeW1ib2wKKworQGl0ZW0gMHg2ICAgICBOX0RBVEEKK0ZpbGUgc2NvcGUgZGF0YSBzeW1ib2wKKworQGl0ZW0gMHg3ICAgICBOX0RBVEEgfCBOX0VYVAorRXh0ZXJuYWwgZGF0YSBzeW1ib2wKKworQGl0ZW0gMHg4ICAgICBOX0JTUworRmlsZSBzY29wZSBCU1Mgc3ltYm9sCisKK0BpdGVtIDB4OSAgICAgTl9CU1MgfCBOX0VYVAorRXh0ZXJuYWwgQlNTIHN5bWJvbAorCitAaXRlbSAweDBjICAgIE5fRk5fU0VRCitTYW1lIGFzIEBjb2Rle05fRk59LCBmb3IgU2VxdWVudCBjb21waWxlcnMKKworQGl0ZW0gMHgwYSAgICBOX0lORFIKK1N5bWJvbCBpcyBpbmRpcmVjdGVkIHRvIGFub3RoZXIgc3ltYm9sCisKK0BpdGVtIDB4MTIgICAgTl9DT01NCitDb21tb24tLS12aXNpYmxlIGFmdGVyIHNoYXJlZCBsaWJyYXJ5IGR5bmFtaWMgbGluaworCitAaXRlbSAweDE0IE5fU0VUQQorQGl0ZW14IDB4MTUgTl9TRVRBIHwgTl9FWFQKK0Fic29sdXRlIHNldCBlbGVtZW50CisKK0BpdGVtIDB4MTYgTl9TRVRUCitAaXRlbXggMHgxNyBOX1NFVFQgfCBOX0VYVAorVGV4dCBzZWdtZW50IHNldCBlbGVtZW50CisKK0BpdGVtIDB4MTggTl9TRVRECitAaXRlbXggMHgxOSBOX1NFVEQgfCBOX0VYVAorRGF0YSBzZWdtZW50IHNldCBlbGVtZW50CisKK0BpdGVtIDB4MWEgTl9TRVRCCitAaXRlbXggMHgxYiBOX1NFVEIgfCBOX0VYVAorQlNTIHNlZ21lbnQgc2V0IGVsZW1lbnQKKworQGl0ZW0gMHgxYyBOX1NFVFYKK0BpdGVteCAweDFkIE5fU0VUViB8IE5fRVhUCitQb2ludGVyIHRvIHNldCB2ZWN0b3IKKworQGl0ZW0gMHgxZSBOX1dBUk5JTkcKK1ByaW50IGEgd2FybmluZyBtZXNzYWdlIGR1cmluZyBsaW5raW5nCisKK0BpdGVtIDB4MWYgICAgTl9GTgorRmlsZSBuYW1lIG9mIGEgQGZpbGV7Lm99IGZpbGUKK0BlbmQgdGFibGUKKworQG5vZGUgU3RhYiBTeW1ib2wgVHlwZXMKK0BhcHBlbmRpeHNlYyBTdGFiIFN5bWJvbCBUeXBlcworCitUaGUgZm9sbG93aW5nIHN5bWJvbCB0eXBlcyBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYSBzdGFiLiAgVGhpcyBpcyB0aGUKK2Z1bGwgbGlzdCBvZiBzdGFiIG51bWJlcnMsIGluY2x1ZGluZyBzdGFiIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4KK2xhbmd1YWdlcyBvdGhlciB0aGFuIEMuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gMHgyMCAgICAgTl9HU1lNCitHbG9iYWwgc3ltYm9sOyBzZWUgQHJlZntHbG9iYWwgVmFyaWFibGVzfS4KKworQGl0ZW0gMHgyMiAgICAgTl9GTkFNRQorRnVuY3Rpb24gbmFtZSAoZm9yIEJTRCBGb3J0cmFuKTsgc2VlIEByZWZ7UHJvY2VkdXJlc30uCisKK0BpdGVtIDB4MjQgICAgIE5fRlVOCitGdW5jdGlvbiBuYW1lIChAcHhyZWZ7UHJvY2VkdXJlc30pIG9yIHRleHQgc2VnbWVudCB2YXJpYWJsZQorKEBweHJlZntTdGF0aWNzfSkuCisKK0BpdGVtIDB4MjYgTl9TVFNZTQorRGF0YSBzZWdtZW50IGZpbGUtc2NvcGUgdmFyaWFibGU7IHNlZSBAcmVme1N0YXRpY3N9LgorCitAaXRlbSAweDI4IE5fTENTWU0KK0JTUyBzZWdtZW50IGZpbGUtc2NvcGUgdmFyaWFibGU7IHNlZSBAcmVme1N0YXRpY3N9LgorCitAaXRlbSAweDJhIE5fTUFJTgorTmFtZSBvZiBtYWluIHJvdXRpbmU7IHNlZSBAcmVme01haW4gUHJvZ3JhbX0uCisKK0BpdGVtIDB4MmMgTl9ST1NZTQorVmFyaWFibGUgaW4gQGNvZGV7LnJvZGF0YX0gc2VjdGlvbjsgc2VlIEByZWZ7U3RhdGljc30uCisKK0BpdGVtIDB4MzAgICAgIE5fUEMKK0dsb2JhbCBzeW1ib2wgKGZvciBQYXNjYWwpOyBzZWUgQHJlZntOX1BDfS4KKworQGl0ZW0gMHgzMiAgICAgTl9OU1lNUworTnVtYmVyIG9mIHN5bWJvbHMgKGFjY29yZGluZyB0byBVbHRyaXggVjQuMCk7IHNlZSBAcmVme05fTlNZTVN9LgorCitAaXRlbSAweDM0ICAgICBOX05PTUFQCitObyBEU1QgbWFwOyBzZWUgQHJlZntOX05PTUFQfS4KKworQGMgRklYTUU6IGRlc2NyaWJlIHRoaXMgc29sYXJpcyBmZWF0dXJlIGluIHRoZSBib2R5IG9mIHRoZSB0ZXh0IChzZWUKK0BjIGNvbW1lbnRzIGluIGluY2x1ZGUvYW91dC9zdGFiLmRlZikuCitAaXRlbSAweDM4IE5fT0JKCitPYmplY3QgZmlsZSAoU29sYXJpczIpLgorCitAYyBTZWUgaW5jbHVkZS9hb3V0L3N0YWIuZGVmIGZvciAoYSBsaXR0bGUpIG1vcmUgaW5mby4KK0BpdGVtIDB4M2MgTl9PUFQKK0RlYnVnZ2VyIG9wdGlvbnMgKFNvbGFyaXMyKS4KKworQGl0ZW0gMHg0MCAgICAgTl9SU1lNCitSZWdpc3RlciB2YXJpYWJsZTsgc2VlIEByZWZ7UmVnaXN0ZXIgVmFyaWFibGVzfS4KKworQGl0ZW0gMHg0MiAgICAgTl9NMkMKK01vZHVsYS0yIGNvbXBpbGF0aW9uIHVuaXQ7IHNlZSBAcmVme05fTTJDfS4KKworQGl0ZW0gMHg0NCAgICAgTl9TTElORQorTGluZSBudW1iZXIgaW4gdGV4dCBzZWdtZW50OyBzZWUgQHJlZntMaW5lIE51bWJlcnN9LgorCitAaXRlbSAweDQ2ICAgICBOX0RTTElORQorTGluZSBudW1iZXIgaW4gZGF0YSBzZWdtZW50OyBzZWUgQHJlZntMaW5lIE51bWJlcnN9LgorCitAaXRlbSAweDQ4ICAgICBOX0JTTElORQorTGluZSBudW1iZXIgaW4gYnNzIHNlZ21lbnQ7IHNlZSBAcmVme0xpbmUgTnVtYmVyc30uCisKK0BpdGVtIDB4NDggICAgIE5fQlJPV1MKK1N1biBzb3VyY2UgY29kZSBicm93c2VyLCBwYXRoIHRvIEBmaWxley5jYn0gZmlsZTsgc2VlIEByZWZ7Tl9CUk9XU30uCisKK0BpdGVtIDB4NGEgICAgIE5fREVGRAorR05VIE1vZHVsYTIgZGVmaW5pdGlvbiBtb2R1bGUgZGVwZW5kZW5jeTsgc2VlIEByZWZ7Tl9ERUZEfS4KKworQGl0ZW0gMHg0YyBOX0ZMSU5FCitGdW5jdGlvbiBzdGFydC9ib2R5L2VuZCBsaW5lIG51bWJlcnMgKFNvbGFyaXMyKS4KKworQGl0ZW0gMHg1MCAgICAgTl9FSERFQ0wKK0dOVSBDKysgZXhjZXB0aW9uIHZhcmlhYmxlOyBzZWUgQHJlZntOX0VIREVDTH0uCisKK0BpdGVtIDB4NTAgICAgIE5fTU9EMgorTW9kdWxhMiBpbmZvICJmb3IgaW1jIiAoYWNjb3JkaW5nIHRvIFVsdHJpeCBWNC4wKTsgc2VlIEByZWZ7Tl9NT0QyfS4KKworQGl0ZW0gMHg1NCAgICAgTl9DQVRDSAorR05VIEMrKyBAY29kZXtjYXRjaH0gY2xhdXNlOyBzZWUgQHJlZntOX0NBVENIfS4KKworQGl0ZW0gMHg2MCAgICAgTl9TU1lNCitTdHJ1Y3R1cmUgb2YgdW5pb24gZWxlbWVudDsgc2VlIEByZWZ7Tl9TU1lNfS4KKworQGl0ZW0gMHg2MiBOX0VORE0KK0xhc3Qgc3RhYiBmb3IgbW9kdWxlIChTb2xhcmlzMikuCisKK0BpdGVtIDB4NjQgICAgIE5fU08KK1BhdGggYW5kIG5hbWUgb2Ygc291cmNlIGZpbGU7IHNlZSBAcmVme1NvdXJjZSBGaWxlc30uCisKK0BpdGVtIDB4ODAgTl9MU1lNCitTdGFjayB2YXJpYWJsZSAoQHB4cmVme1N0YWNrIFZhcmlhYmxlc30pIG9yIHR5cGUgKEBweHJlZntUeXBlZGVmc30pLgorCitAaXRlbSAweDgyICAgICBOX0JJTkNMCitCZWdpbm5pbmcgb2YgYW4gaW5jbHVkZSBmaWxlIChTdW4gb25seSk7IHNlZSBAcmVme0luY2x1ZGUgRmlsZXN9LgorCitAaXRlbSAweDg0ICAgICBOX1NPTAorTmFtZSBvZiBpbmNsdWRlIGZpbGU7IHNlZSBAcmVme0luY2x1ZGUgRmlsZXN9LgorCitAaXRlbSAweGEwICAgICBOX1BTWU0KK1BhcmFtZXRlciB2YXJpYWJsZTsgc2VlIEByZWZ7UGFyYW1ldGVyc30uCisKK0BpdGVtIDB4YTIgICAgIE5fRUlOQ0wKK0VuZCBvZiBhbiBpbmNsdWRlIGZpbGU7IHNlZSBAcmVme0luY2x1ZGUgRmlsZXN9LgorCitAaXRlbSAweGE0ICAgICBOX0VOVFJZCitBbHRlcm5hdGUgZW50cnkgcG9pbnQ7IHNlZSBAcmVme0FsdGVybmF0ZSBFbnRyeSBQb2ludHN9LgorCitAaXRlbSAweGMwICAgICBOX0xCUkFDCitCZWdpbm5pbmcgb2YgYSBsZXhpY2FsIGJsb2NrOyBzZWUgQHJlZntCbG9jayBTdHJ1Y3R1cmV9LgorCitAaXRlbSAweGMyICAgICBOX0VYQ0wKK1BsYWNlIGhvbGRlciBmb3IgYSBkZWxldGVkIGluY2x1ZGUgZmlsZTsgc2VlIEByZWZ7SW5jbHVkZSBGaWxlc30uCisKK0BpdGVtIDB4YzQgICAgIE5fU0NPUEUKK01vZHVsYTIgc2NvcGUgaW5mb3JtYXRpb24gKFN1biBsaW5rZXIpOyBzZWUgQHJlZntOX1NDT1BFfS4KKworQGl0ZW0gMHhlMCAgICAgTl9SQlJBQworRW5kIG9mIGEgbGV4aWNhbCBibG9jazsgc2VlIEByZWZ7QmxvY2sgU3RydWN0dXJlfS4KKworQGl0ZW0gMHhlMiAgICAgTl9CQ09NTQorQmVnaW4gbmFtZWQgY29tbW9uIGJsb2NrOyBzZWUgQHJlZntDb21tb24gQmxvY2tzfS4KKworQGl0ZW0gMHhlNCAgICAgTl9FQ09NTQorRW5kIG5hbWVkIGNvbW1vbiBibG9jazsgc2VlIEByZWZ7Q29tbW9uIEJsb2Nrc30uCisKK0BpdGVtIDB4ZTggICAgIE5fRUNPTUwKK01lbWJlciBvZiBhIGNvbW1vbiBibG9jazsgc2VlIEByZWZ7Q29tbW9uIEJsb2Nrc30uCisKK0BjIEZJWE1FOiBIb3cgZG9lcyB0aGlzIHJlYWxseSB3b3JrPyAgTW92ZSBpdCB0byBtYWluIGJvZHkgb2YgZG9jdW1lbnQuCitAaXRlbSAweGVhIE5fV0lUSAorUGFzY2FsIEBjb2Rle3dpdGh9IHN0YXRlbWVudDogdHlwZSwsMCwwLG9mZnNldCAoU29sYXJpczIpLgorCitAaXRlbSAweGYwICAgICBOX05CVEVYVAorR291bGQgbm9uLWJhc2UgcmVnaXN0ZXJzOyBzZWUgQHJlZntHb3VsZH0uCisKK0BpdGVtIDB4ZjIgICAgIE5fTkJEQVRBCitHb3VsZCBub24tYmFzZSByZWdpc3RlcnM7IHNlZSBAcmVme0dvdWxkfS4KKworQGl0ZW0gMHhmNCAgICAgTl9OQkJTUworR291bGQgbm9uLWJhc2UgcmVnaXN0ZXJzOyBzZWUgQHJlZntHb3VsZH0uCisKK0BpdGVtIDB4ZjYgICAgIE5fTkJTVFMKK0dvdWxkIG5vbi1iYXNlIHJlZ2lzdGVyczsgc2VlIEByZWZ7R291bGR9LgorCitAaXRlbSAweGY4ICAgICBOX05CTENTCitHb3VsZCBub24tYmFzZSByZWdpc3RlcnM7IHNlZSBAcmVme0dvdWxkfS4KK0BlbmQgdGFibGUKKworQGMgUmVzdG9yZSB0aGUgZGVmYXVsdCB0YWJsZSBpbmRlbnQKK0BpZnRleAorQHRhYmxlaW5kZW50PS44aW4KK0BlbmQgaWZ0ZXgKKworQG5vZGUgU3ltYm9sIERlc2NyaXB0b3JzCitAYXBwZW5kaXggVGFibGUgb2YgU3ltYm9sIERlc2NyaXB0b3JzCisKK1RoZSBzeW1ib2wgZGVzY3JpcHRvciBpcyB0aGUgY2hhcmFjdGVyIHdoaWNoIGZvbGxvd3MgdGhlIGNvbG9uIGluIG1hbnkKK3N0YWJzLCBhbmQgd2hpY2ggdGVsbHMgd2hhdCBraW5kIG9mIHN0YWIgaXQgaXMuICBAeHJlZntTdHJpbmcgRmllbGR9LAorZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlaXIgdXNlLgorCitAYyBQbGVhc2Uga2VlcCB0aGlzIGFscGhhYmV0aWNhbAorQHRhYmxlIEBjb2RlCitAYyBJbiBUZVgsIHRoaXMgbG9va3MgZ3JlYXQsIGRpZ2l0IGlzIGluIGl0YWxpY3MuICBCdXQgbWFrZWluZm8gaW5zaXN0cworQGMgb24gcHV0dGluZyBpdCBpbiBgJywgbm90IHJlYWxpemluZyB0aGF0IEB2YXIgc2hvdWxkIG92ZXJyaWRlIEBjb2RlLgorQGMgSSBkb24ndCBrbm93IG9mIGFueSB3YXkgdG8gbWFrZSBtYWtlaW5mbyBkbyB0aGUgcmlnaHQgdGhpbmcuICBTZWVtcworQGMgbGlrZSBhIG1ha2VpbmZvIGJ1ZyB0byBtZS4KK0BpdGVtIEB2YXJ7ZGlnaXR9CitAaXRlbXggKAorQGl0ZW14IC0KK1ZhcmlhYmxlIG9uIHRoZSBzdGFjazsgc2VlIEByZWZ7U3RhY2sgVmFyaWFibGVzfS4KKworQGl0ZW0gOgorQysrIG5lc3RlZCBzeW1ib2w7IHNlZSBAeHJlZntOZXN0ZWQgU3ltYm9sc30KKworQGl0ZW0gYQorUGFyYW1ldGVyIHBhc3NlZCBieSByZWZlcmVuY2UgaW4gcmVnaXN0ZXI7IHNlZSBAcmVme1JlZmVyZW5jZSBQYXJhbWV0ZXJzfS4KKworQGl0ZW0gYgorQmFzZWQgdmFyaWFibGU7IHNlZSBAcmVme0Jhc2VkIFZhcmlhYmxlc30uCisKK0BpdGVtIGMKK0NvbnN0YW50OyBzZWUgQHJlZntDb25zdGFudHN9LgorCitAaXRlbSBDCitDb25mb3JtYW50IGFycmF5IGJvdW5kIChQYXNjYWwsIG1heWJlIG90aGVyIGxhbmd1YWdlcyk7IEByZWZ7Q29uZm9ybWFudAorQXJyYXlzfS4gIE5hbWUgb2YgYSBjYXVnaHQgZXhjZXB0aW9uIChHTlUgQysrKS4gIFRoZXNlIGNhbiBiZQorZGlzdGluZ3Vpc2hlZCBiZWNhdXNlIHRoZSBsYXR0ZXIgdXNlcyBAY29kZXtOX0NBVENIfSBhbmQgdGhlIGZvcm1lciB1c2VzCithbm90aGVyIHN5bWJvbCB0eXBlLgorCitAaXRlbSBkCitGbG9hdGluZyBwb2ludCByZWdpc3RlciB2YXJpYWJsZTsgc2VlIEByZWZ7UmVnaXN0ZXIgVmFyaWFibGVzfS4KKworQGl0ZW0gRAorUGFyYW1ldGVyIGluIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyOyBzZWUgQHJlZntSZWdpc3RlciBQYXJhbWV0ZXJzfS4KKworQGl0ZW0gZgorRmlsZSBzY29wZSBmdW5jdGlvbjsgc2VlIEByZWZ7UHJvY2VkdXJlc30uCisKK0BpdGVtIEYKK0dsb2JhbCBmdW5jdGlvbjsgc2VlIEByZWZ7UHJvY2VkdXJlc30uCisKK0BpdGVtIEcKK0dsb2JhbCB2YXJpYWJsZTsgc2VlIEByZWZ7R2xvYmFsIFZhcmlhYmxlc30uCisKK0BpdGVtIGkKK0B4cmVme1JlZ2lzdGVyIFBhcmFtZXRlcnN9LgorCitAaXRlbSBJCitJbnRlcm5hbCAobmVzdGVkKSBwcm9jZWR1cmU7IHNlZSBAcmVme05lc3RlZCBQcm9jZWR1cmVzfS4KKworQGl0ZW0gSgorSW50ZXJuYWwgKG5lc3RlZCkgZnVuY3Rpb247IHNlZSBAcmVme05lc3RlZCBQcm9jZWR1cmVzfS4KKworQGl0ZW0gTAorTGFiZWwgbmFtZSAoZG9jdW1lbnRlZCBieSBBSVgsIG5vIGZ1cnRoZXIgaW5mb3JtYXRpb24ga25vd24pLgorCitAaXRlbSBtCitNb2R1bGU7IHNlZSBAcmVme1Byb2NlZHVyZXN9LgorCitAaXRlbSBwCitBcmd1bWVudCBsaXN0IHBhcmFtZXRlcjsgc2VlIEByZWZ7UGFyYW1ldGVyc30uCisKK0BpdGVtIHBQCitAeHJlZntQYXJhbWV0ZXJzfS4KKworQGl0ZW0gcEYKK0ZvcnRyYW4gRnVuY3Rpb24gcGFyYW1ldGVyOyBzZWUgQHJlZntQYXJhbWV0ZXJzfS4KKworQGl0ZW0gUAorVW5mb3J0dW5hdGVseSwgdGhyZWUgc2VwYXJhdGUgbWVhbmluZ3MgaGF2ZSBiZWVuIGluZGVwZW5kZW50bHkgaW52ZW50ZWQKK2ZvciB0aGlzIHN5bWJvbCBkZXNjcmlwdG9yLiAgQXQgbGVhc3QgdGhlIEdOVSBhbmQgU3VuIHVzZXMgY2FuIGJlCitkaXN0aW5ndWlzaGVkIGJ5IHRoZSBzeW1ib2wgdHlwZS4gIEdsb2JhbCBQcm9jZWR1cmUgKEFJWCkgKHN5bWJvbCB0eXBlCit1c2VkIHVua25vd24pOyBzZWUgQHJlZntQcm9jZWR1cmVzfS4gIFJlZ2lzdGVyIHBhcmFtZXRlciAoR05VKSAoc3ltYm9sCit0eXBlIEBjb2Rle05fUFNZTX0pOyBzZWUgQHJlZntQYXJhbWV0ZXJzfS4gIFByb3RvdHlwZSBvZiBmdW5jdGlvbgorcmVmZXJlbmNlZCBieSB0aGlzIGZpbGUgKFN1biBAY29kZXthY2N9KSAoc3ltYm9sIHR5cGUgQGNvZGV7Tl9GVU59KS4KKworQGl0ZW0gUQorU3RhdGljIFByb2NlZHVyZTsgc2VlIEByZWZ7UHJvY2VkdXJlc30uCisKK0BpdGVtIFIKK1JlZ2lzdGVyIHBhcmFtZXRlcjsgc2VlIEByZWZ7UmVnaXN0ZXIgUGFyYW1ldGVyc30uCisKK0BpdGVtIHIKK1JlZ2lzdGVyIHZhcmlhYmxlOyBzZWUgQHJlZntSZWdpc3RlciBWYXJpYWJsZXN9LgorCitAaXRlbSBTCitGaWxlIHNjb3BlIHZhcmlhYmxlOyBzZWUgQHJlZntTdGF0aWNzfS4KKworQGl0ZW0gcworTG9jYWwgdmFyaWFibGUgKE9TOTAwMCkuCisKK0BpdGVtIHQKK1R5cGUgbmFtZTsgc2VlIEByZWZ7VHlwZWRlZnN9LgorCitAaXRlbSBUCitFbnVtZXJhdGlvbiwgc3RydWN0dXJlLCBvciB1bmlvbiB0YWc7IHNlZSBAcmVme1R5cGVkZWZzfS4KKworQGl0ZW0gdgorUGFyYW1ldGVyIHBhc3NlZCBieSByZWZlcmVuY2U7IHNlZSBAcmVme1JlZmVyZW5jZSBQYXJhbWV0ZXJzfS4KKworQGl0ZW0gVgorUHJvY2VkdXJlIHNjb3BlIHN0YXRpYyB2YXJpYWJsZTsgc2VlIEByZWZ7U3RhdGljc30uCisKK0BpdGVtIHgKK0NvbmZvcm1hbnQgYXJyYXk7IHNlZSBAcmVme0NvbmZvcm1hbnQgQXJyYXlzfS4KKworQGl0ZW0gWAorRnVuY3Rpb24gcmV0dXJuIHZhcmlhYmxlOyBzZWUgQHJlZntQYXJhbWV0ZXJzfS4KK0BlbmQgdGFibGUKKworQG5vZGUgVHlwZSBEZXNjcmlwdG9ycworQGFwcGVuZGl4IFRhYmxlIG9mIFR5cGUgRGVzY3JpcHRvcnMKKworVGhlIHR5cGUgZGVzY3JpcHRvciBpcyB0aGUgY2hhcmFjdGVyIHdoaWNoIGZvbGxvd3MgdGhlIHR5cGUgbnVtYmVyIGFuZAorYW4gZXF1YWxzIHNpZ24uICBJdCBzcGVjaWZpZXMgd2hhdCBraW5kIG9mIHR5cGUgaXMgYmVpbmcgZGVmaW5lZC4KK0B4cmVme1N0cmluZyBGaWVsZH0sIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZWlyIHVzZS4KKworQHRhYmxlIEBjb2RlCitAaXRlbSBAdmFye2RpZ2l0fQorQGl0ZW14ICgKK1R5cGUgcmVmZXJlbmNlOyBzZWUgQHJlZntTdHJpbmcgRmllbGR9LgorCitAaXRlbSAtCitSZWZlcmVuY2UgdG8gYnVpbHRpbiB0eXBlOyBzZWUgQHJlZntOZWdhdGl2ZSBUeXBlIE51bWJlcnN9LgorCitAaXRlbSAjCitNZXRob2QgKEMrKyk7IHNlZSBAcmVme01ldGhvZCBUeXBlIERlc2NyaXB0b3J9LgorCitAaXRlbSAqCitQb2ludGVyOyBzZWUgQHJlZntNaXNjZWxsYW5lb3VzIFR5cGVzfS4KKworQGl0ZW0gJgorUmVmZXJlbmNlIChDKyspLgorCitAaXRlbSBAQAorVHlwZSBBdHRyaWJ1dGVzIChBSVgpOyBzZWUgQHJlZntTdHJpbmcgRmllbGR9LiAgTWVtYmVyIChjbGFzcyBhbmQgdmFyaWFibGUpCit0eXBlIChHTlUgQysrKTsgc2VlIEByZWZ7TWVtYmVyIFR5cGUgRGVzY3JpcHRvcn0uCisKK0BpdGVtIGEKK0FycmF5OyBzZWUgQHJlZntBcnJheXN9LgorCitAaXRlbSBBCitPcGVuIGFycmF5OyBzZWUgQHJlZntBcnJheXN9LgorCitAaXRlbSBiCitQYXNjYWwgc3BhY2UgdHlwZSAoQUlYKTsgc2VlIEByZWZ7TWlzY2VsbGFuZW91cyBUeXBlc30uICBCdWlsdGluIGludGVnZXIKK3R5cGUgKFN1bik7IHNlZSBAcmVme0J1aWx0aW4gVHlwZSBEZXNjcmlwdG9yc30uICBDb25zdCBhbmQgdm9sYXRpbGUKK3F1YWxmaWVkIHR5cGUgKE9TOTAwMCkuCisKK0BpdGVtIEIKK1ZvbGF0aWxlLXF1YWxpZmllZCB0eXBlOyBzZWUgQHJlZntNaXNjZWxsYW5lb3VzIFR5cGVzfS4KKworQGl0ZW0gYworQ29tcGxleCBidWlsdGluIHR5cGUgKEFJWCk7IHNlZSBAcmVme0J1aWx0aW4gVHlwZSBEZXNjcmlwdG9yc30uCitDb25zdC1xdWFsaWZpZWQgdHlwZSAoT1M5MDAwKS4KKworQGl0ZW0gQworQ09CT0wgUGljdHVyZSB0eXBlLiAgU2VlIEFJWCBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgorCitAaXRlbSBkCitGaWxlIHR5cGU7IHNlZSBAcmVme01pc2NlbGxhbmVvdXMgVHlwZXN9LgorCitAaXRlbSBECitOLWRpbWVuc2lvbmFsIGR5bmFtaWMgYXJyYXk7IHNlZSBAcmVme0FycmF5c30uCisKK0BpdGVtIGUKK0VudW1lcmF0aW9uIHR5cGU7IHNlZSBAcmVme0VudW1lcmF0aW9uc30uCisKK0BpdGVtIEUKK04tZGltZW5zaW9uYWwgc3ViYXJyYXk7IHNlZSBAcmVme0FycmF5c30uCisKK0BpdGVtIGYKK0Z1bmN0aW9uIHR5cGU7IHNlZSBAcmVme0Z1bmN0aW9uIFR5cGVzfS4KKworQGl0ZW0gRgorUGFzY2FsIGZ1bmN0aW9uIHBhcmFtZXRlcjsgc2VlIEByZWZ7RnVuY3Rpb24gVHlwZXN9CisKK0BpdGVtIGcKK0J1aWx0aW4gZmxvYXRpbmcgcG9pbnQgdHlwZTsgc2VlIEByZWZ7QnVpbHRpbiBUeXBlIERlc2NyaXB0b3JzfS4KKworQGl0ZW0gRworQ09CT0wgR3JvdXAuICBTZWUgQUlYIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCisKK0BpdGVtIGkKK0ltcG9ydGVkIHR5cGUgKEFJWCk7IHNlZSBAcmVme0Nyb3NzLVJlZmVyZW5jZXN9LiAgVm9sYXRpbGUtcXVhbGlmaWVkCit0eXBlIChPUzkwMDApLgorCitAaXRlbSBrCitDb25zdC1xdWFsaWZpZWQgdHlwZTsgc2VlIEByZWZ7TWlzY2VsbGFuZW91cyBUeXBlc30uCisKK0BpdGVtIEsKK0NPQk9MIEZpbGUgRGVzY3JpcHRvci4gIFNlZSBBSVggZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KKworQGl0ZW0gTQorTXVsdGlwbGUgaW5zdGFuY2UgdHlwZTsgc2VlIEByZWZ7TWlzY2VsbGFuZW91cyBUeXBlc30uCisKK0BpdGVtIG4KK1N0cmluZyB0eXBlOyBzZWUgQHJlZntTdHJpbmdzfS4KKworQGl0ZW0gTgorU3RyaW5ncHRyOyBzZWUgQHJlZntTdHJpbmdzfS4KKworQGl0ZW0gbworT3BhcXVlIHR5cGU7IHNlZSBAcmVme1R5cGVkZWZzfS4KKworQGl0ZW0gcAorUHJvY2VkdXJlOyBzZWUgQHJlZntGdW5jdGlvbiBUeXBlc30uCisKK0BpdGVtIFAKK1BhY2tlZCBhcnJheTsgc2VlIEByZWZ7QXJyYXlzfS4KKworQGl0ZW0gcgorUmFuZ2UgdHlwZTsgc2VlIEByZWZ7U3VicmFuZ2VzfS4KKworQGl0ZW0gUgorQnVpbHRpbiBmbG9hdGluZyB0eXBlOyBzZWUgQHJlZntCdWlsdGluIFR5cGUgRGVzY3JpcHRvcnN9IChTdW4pLiAgUGFzY2FsCitzdWJyb3V0aW5lIHBhcmFtZXRlcjsgc2VlIEByZWZ7RnVuY3Rpb24gVHlwZXN9IChBSVgpLiAgRGV0ZWN0aW5nIHRoaXMKK2NvbmZsaWN0IGlzIHBvc3NpYmxlIHdpdGggY2FyZWZ1bCBwYXJzaW5nIChoaW50OiBhIFBhc2NhbCBzdWJyb3V0aW5lCitwYXJhbWV0ZXIgdHlwZSB3aWxsIGFsd2F5cyBjb250YWluIGEgY29tbWEsIGFuZCBhIGJ1aWx0aW4gdHlwZQorZGVzY3JpcHRvciBuZXZlciB3aWxsKS4KKworQGl0ZW0gcworU3RydWN0dXJlIHR5cGU7IHNlZSBAcmVme1N0cnVjdHVyZXN9LgorCitAaXRlbSBTCitTZXQgdHlwZTsgc2VlIEByZWZ7TWlzY2VsbGFuZW91cyBUeXBlc30uCisKK0BpdGVtIHUKK1VuaW9uOyBzZWUgQHJlZntVbmlvbnN9LgorCitAaXRlbSB2CitWYXJpYW50IHJlY29yZC4gIFRoaXMgaXMgYSBQYXNjYWwgYW5kIE1vZHVsYS0yIGZlYXR1cmUgd2hpY2ggaXMgbGlrZSBhCit1bmlvbiB3aXRoaW4gYSBzdHJ1Y3QgaW4gQy4gIFNlZSBBSVggZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KKworQGl0ZW0gdworV2lkZSBjaGFyYWN0ZXI7IHNlZSBAcmVme0J1aWx0aW4gVHlwZSBEZXNjcmlwdG9yc30uCisKK0BpdGVtIHgKK0Nyb3NzLXJlZmVyZW5jZTsgc2VlIEByZWZ7Q3Jvc3MtUmVmZXJlbmNlc30uCisKK0BpdGVtIFkKK1VzZWQgYnkgSUJNJ3MgeGxDIEMrKyBjb21waWxlciAoZm9yIHN0cnVjdHVyZXMsIEkgdGhpbmspLgorCitAaXRlbSB6Citnc3RyaW5nOyBzZWUgQHJlZntTdHJpbmdzfS4KK0BlbmQgdGFibGUKKworQG5vZGUgRXhwYW5kZWQgUmVmZXJlbmNlCitAYXBwZW5kaXggRXhwYW5kZWQgUmVmZXJlbmNlIGJ5IFN0YWIgVHlwZQorCitAYyBGSVhNRTogVGhpcyBhcHBlbmRpeCBzaG91bGQgZ28gYXdheTsgc2VlIE5fUFNZTSBvciBOX1NPIGZvciBhbiBleGFtcGxlLgorCitGb3IgYSBmdWxsIGxpc3Qgb2Ygc3RhYiB0eXBlcywgYW5kIGNyb3NzLXJlZmVyZW5jZXMgdG8gd2hlcmUgdGhleSBhcmUKK2Rlc2NyaWJlZCwgc2VlIEByZWZ7U3RhYiBUeXBlc30uICBUaGlzIGFwcGVuZGl4IGp1c3QgY292ZXJzIGNlcnRhaW4KK3N0YWJzIHdoaWNoIGFyZSBub3QgeWV0IGRlc2NyaWJlZCBpbiB0aGUgbWFpbiBib2R5IG9mIHRoaXMgZG9jdW1lbnQ7CitldmVudHVhbGx5IHRoZSBpbmZvcm1hdGlvbiB3aWxsIGFsbCBiZSBpbiBvbmUgcGxhY2UuCisKK0Zvcm1hdCBvZiBhbiBlbnRyeToKKworVGhlIGZpcnN0IGxpbmUgaXMgdGhlIHN5bWJvbCB0eXBlIChzZWUgQGZpbGV7aW5jbHVkZS9hb3V0L3N0YWIuZGVmfSkuCisKK1RoZSBzZWNvbmQgbGluZSBkZXNjcmliZXMgdGhlIGxhbmd1YWdlIGNvbnN0cnVjdHMgdGhlIHN5bWJvbCB0eXBlCityZXByZXNlbnRzLgorCitUaGUgdGhpcmQgbGluZSBpcyB0aGUgc3RhYiBmb3JtYXQgd2l0aCB0aGUgc2lnbmlmaWNhbnQgc3RhYiBmaWVsZHMKK25hbWVkIGFuZCB0aGUgcmVzdCBOSUwuCisKK1N1YnNlcXVlbnQgbGluZXMgZXhwYW5kIHVwb24gdGhlIG1lYW5pbmcgYW5kIHBvc3NpYmxlIHZhbHVlcyBmb3IgZWFjaAorc2lnbmlmaWNhbnQgc3RhYiBmaWVsZC4KKworRmluYWxseSwgYW55IGZ1cnRoZXIgaW5mb3JtYXRpb24uCisKK0BtZW51CisqIE5fUEM6OgkJCVBhc2NhbCBnbG9iYWwgc3ltYm9sCisqIE5fTlNZTVM6OgkJCU51bWJlciBvZiBzeW1ib2xzCisqIE5fTk9NQVA6OgkJCU5vIERTVCBtYXAKKyogTl9NMkM6OgkJCU1vZHVsYS0yIGNvbXBpbGF0aW9uIHVuaXQKKyogTl9CUk9XUzo6CQkJUGF0aCB0byAuY2IgZmlsZSBmb3IgU3VuIHNvdXJjZSBjb2RlIGJyb3dzZXIKKyogTl9ERUZEOjoJCQlHTlUgTW9kdWxhMiBkZWZpbml0aW9uIG1vZHVsZSBkZXBlbmRlbmN5CisqIE5fRUhERUNMOjoJCQlHTlUgQysrIGV4Y2VwdGlvbiB2YXJpYWJsZQorKiBOX01PRDI6OgkJCU1vZHVsYTIgaW5mb3JtYXRpb24gImZvciBpbWMiCisqIE5fQ0FUQ0g6OgkJCUdOVSBDKysgImNhdGNoIiBjbGF1c2UKKyogTl9TU1lNOjoJCQlTdHJ1Y3R1cmUgb3IgdW5pb24gZWxlbWVudAorKiBOX1NDT1BFOjoJCQlNb2R1bGEyIHNjb3BlIGluZm9ybWF0aW9uIChTdW4gb25seSkKKyogR291bGQ6OgkJCW5vbi1iYXNlIHJlZ2lzdGVyIHN5bWJvbHMgdXNlZCBvbiBHb3VsZCBzeXN0ZW1zCisqIE5fTEVORzo6CQkJTGVuZ3RoIG9mIHByZWNlZGluZyBlbnRyeQorQGVuZCBtZW51CisKK0Bub2RlIE5fUEMKK0BzZWN0aW9uIE5fUEMKKworQGRlZmZuIEBjb2Rley5zdGFic30gTl9QQworQGZpbmRleCBOX1BDCitHbG9iYWwgc3ltYm9sIChmb3IgUGFzY2FsKS4KKworQGV4YW1wbGUKKyJuYW1lIiAtPiAic3ltYm9sX25hbWUiICA8PD8+PgordmFsdWUgIC0+IHN1cHBvc2VkbHkgdGhlIGxpbmUgbnVtYmVyIChzdGFiLmRlZiBpcyBza2VwdGljYWwpCitAZW5kIGV4YW1wbGUKKworQGRpc3BsYXkKK0BmaWxle3N0YWJkdW1wLmN9IHNheXM6CisKK2dsb2JhbCBwYXNjYWwgc3ltYm9sOiBuYW1lLCwwLHN1YnR5cGUsbGluZQorPDwgc3VidHlwZT8gPj4KK0BlbmQgZGlzcGxheQorQGVuZCBkZWZmbgorCitAbm9kZSBOX05TWU1TCitAc2VjdGlvbiBOX05TWU1TCisKK0BkZWZmbiBAY29kZXsuc3RhYm59IE5fTlNZTVMKK0BmaW5kZXggTl9OU1lNUworTnVtYmVyIG9mIHN5bWJvbHMgKGFjY29yZGluZyB0byBVbHRyaXggVjQuMCkuCisKK0BkaXNwbGF5CisgICAgICAgIDAsIGZpbGVzLCxmdW5jcyxsaW5lcyAoc3RhYi5kZWYpCitAZW5kIGRpc3BsYXkKK0BlbmQgZGVmZm4KKworQG5vZGUgTl9OT01BUAorQHNlY3Rpb24gTl9OT01BUAorCitAZGVmZm4gQGNvZGV7LnN0YWJzfSBOX05PTUFQCitAZmluZGV4IE5fTk9NQVAKK05vIERTVCBtYXAgZm9yIHN5bWJvbCAoYWNjb3JkaW5nIHRvIFVsdHJpeCBWNC4wKS4gIEkgdGhpbmsgdGhpcyBtZWFucyBhCit2YXJpYWJsZSBoYXMgYmVlbiBvcHRpbWl6ZWQgb3V0LgorCitAZGlzcGxheQorICAgICAgICBuYW1lLCAsMCx0eXBlLGlnbm9yZWQgKHN0YWIuZGVmKQorQGVuZCBkaXNwbGF5CitAZW5kIGRlZmZuCisKK0Bub2RlIE5fTTJDCitAc2VjdGlvbiBOX00yQworCitAZGVmZm4gQGNvZGV7LnN0YWJzfSBOX00yQworQGZpbmRleCBOX00yQworTW9kdWxhLTIgY29tcGlsYXRpb24gdW5pdC4KKworQGV4YW1wbGUKKyJzdHJpbmciIC0+ICJ1bml0X25hbWUsdW5pdF90aW1lX3N0YW1wWyxjb2RlX3RpbWVfc3RhbXBdIgorZGVzYyAgIC0+IHVuaXRfbnVtYmVyCit2YWx1ZSAgLT4gMCAobWFpbiB1bml0KQorICAgICAgICAgIDEgKGFueSBvdGhlciB1bml0KQorQGVuZCBleGFtcGxlCisKK1NlZSBAY2l0ZXtEYnggYW5kIERieHRvb2wgSW50ZXJmYWNlc30sIDJuZCBlZGl0aW9uLCBieSBTdW4sIDE5ODgsIGZvcgorbW9yZSBpbmZvcm1hdGlvbi4KKworQGVuZCBkZWZmbgorCitAbm9kZSBOX0JST1dTCitAc2VjdGlvbiBOX0JST1dTCisKK0BkZWZmbiBAY29kZXsuc3RhYnN9IE5fQlJPV1MKK0BmaW5kZXggTl9CUk9XUworU3VuIHNvdXJjZSBjb2RlIGJyb3dzZXIsIHBhdGggdG8gQGZpbGV7LmNifSBmaWxlCisKKzw8Pz4+CisicGF0aCB0byBhc3NvY2lhdGVkIEBmaWxley5jYn0gZmlsZSIKKworTm90ZTogTl9CUk9XUyBoYXMgdGhlIHNhbWUgdmFsdWUgYXMgTl9CU0xJTkUuCitAZW5kIGRlZmZuCisKK0Bub2RlIE5fREVGRAorQHNlY3Rpb24gTl9ERUZECisKK0BkZWZmbiBAY29kZXsuc3RhYm59IE5fREVGRAorQGZpbmRleCBOX0RFRkQKK0dOVSBNb2R1bGEyIGRlZmluaXRpb24gbW9kdWxlIGRlcGVuZGVuY3kuCisKK0dOVSBNb2R1bGEtMiBkZWZpbml0aW9uIG1vZHVsZSBkZXBlbmRlbmN5LiAgVGhlIHZhbHVlIGlzIHRoZQorbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGRlZmluaXRpb24gZmlsZS4gIFRoZSBvdGhlciBmaWVsZCBpcyBub24temVybworaWYgaXQgaXMgaW1wb3J0ZWQgd2l0aCB0aGUgR05VIE0yIGtleXdvcmQgQGNvZGV7JUlOSVRJQUxJWkV9LiAgUGVyaGFwcworQGNvZGV7Tl9NMkN9IGNhbiBiZSB1c2VkIGlmIHRoZXJlIGFyZSBlbm91Z2ggZW1wdHkgZmllbGRzPworQGVuZCBkZWZmbgorCitAbm9kZSBOX0VIREVDTAorQHNlY3Rpb24gTl9FSERFQ0wKKworQGRlZmZuIEBjb2Rley5zdGFic30gTl9FSERFQ0wKK0BmaW5kZXggTl9FSERFQ0wKK0dOVSBDKysgZXhjZXB0aW9uIHZhcmlhYmxlIDw8Pz4+LgorCisiQHZhcntzdHJpbmd9IGlzIHZhcmlhYmxlIG5hbWUiCisKK05vdGU6IGNvbmZsaWN0cyB3aXRoIEBjb2Rle05fTU9EMn0uCitAZW5kIGRlZmZuCisKK0Bub2RlIE5fTU9EMgorQHNlY3Rpb24gTl9NT0QyCisKK0BkZWZmbiBAY29kZXsuc3RhYj99IE5fTU9EMgorQGZpbmRleCBOX01PRDIKK01vZHVsYTIgaW5mbyAiZm9yIGltYyIgKGFjY29yZGluZyB0byBVbHRyaXggVjQuMCkKKworTm90ZTogY29uZmxpY3RzIHdpdGggQGNvZGV7Tl9FSERFQ0x9ICA8PD8+PgorQGVuZCBkZWZmbgorCitAbm9kZSBOX0NBVENICitAc2VjdGlvbiBOX0NBVENICisKK0BkZWZmbiBAY29kZXsuc3RhYm59IE5fQ0FUQ0gKK0BmaW5kZXggTl9DQVRDSAorR05VIEMrKyBAY29kZXtjYXRjaH0gY2xhdXNlCisKK0dOVSBDKysgQGNvZGV7Y2F0Y2h9IGNsYXVzZS4gIFRoZSB2YWx1ZSBpcyBpdHMgYWRkcmVzcy4gIFRoZSBkZXNjIGZpZWxkCitpcyBub256ZXJvIGlmIHRoaXMgZW50cnkgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBAY29kZXtDQVVHSFR9IHN0YWIKK3NheWluZyB3aGF0IGV4Y2VwdGlvbiB3YXMgY2F1Z2h0LiAgTXVsdGlwbGUgQGNvZGV7Q0FVR0hUfSBzdGFicyBtZWFucwordGhhdCBtdWx0aXBsZSBleGNlcHRpb25zIGNhbiBiZSBjYXVnaHQgaGVyZS4gIElmIGRlc2MgaXMgMCwgaXQgbWVhbnMgYWxsCitleGNlcHRpb25zIGFyZSBjYXVnaHQgaGVyZS4KK0BlbmQgZGVmZm4KKworQG5vZGUgTl9TU1lNCitAc2VjdGlvbiBOX1NTWU0KKworQGRlZmZuIEBjb2Rley5zdGFibn0gTl9TU1lNCitAZmluZGV4IE5fU1NZTQorU3RydWN0dXJlIG9yIHVuaW9uIGVsZW1lbnQuCisKK1RoZSB2YWx1ZSBpcyB0aGUgb2Zmc2V0IGluIHRoZSBzdHJ1Y3R1cmUuCisKKzw8P2xvb2tpbmcgYXQgc3RydWN0cyBhbmQgdW5pb25zIGluIEMgSSBkaWRuJ3Qgc2VlIHRoZXNlPj4KK0BlbmQgZGVmZm4KKworQG5vZGUgTl9TQ09QRQorQHNlY3Rpb24gTl9TQ09QRQorCitAZGVmZm4gQGNvZGV7LnN0YWI/fSBOX1NDT1BFCitAZmluZGV4IE5fU0NPUEUKK01vZHVsYTIgc2NvcGUgaW5mb3JtYXRpb24gKFN1biBsaW5rZXIpCis8PD8+PgorQGVuZCBkZWZmbgorCitAbm9kZSBHb3VsZAorQHNlY3Rpb24gTm9uLWJhc2UgcmVnaXN0ZXJzIG9uIEdvdWxkIHN5c3RlbXMKKworQGRlZmZuIEBjb2Rley5zdGFiP30gTl9OQlRFWFQKK0BkZWZmbnggQGNvZGV7LnN0YWI/fSBOX05CREFUQQorQGRlZmZueCBAY29kZXsuc3RhYj99IE5fTkJCU1MKK0BkZWZmbnggQGNvZGV7LnN0YWI/fSBOX05CU1RTCitAZGVmZm54IEBjb2Rley5zdGFiP30gTl9OQkxDUworQGZpbmRleCBOX05CVEVYVAorQGZpbmRleCBOX05CREFUQQorQGZpbmRleCBOX05CQlNTCitAZmluZGV4IE5fTkJTVFMKK0BmaW5kZXggTl9OQkxDUworVGhlc2UgYXJlIHVzZWQgb24gR291bGQgc3lzdGVtcyBmb3Igbm9uLWJhc2UgcmVnaXN0ZXJzIHN5bXMuCisKK0hvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBub3QgdGhlIHZhbHVlcyB1c2VkIGJ5IEdvdWxkOyB0aGV5IGFyZQordGhlIHZhbHVlcyB3aGljaCBHTlUgaGFzIGJlZW4gZG9jdW1lbnRpbmcgZm9yIHRoZXNlIHZhbHVlcyBmb3IgYSBsb25nCit0aW1lLCB3aXRob3V0IGFjdHVhbGx5IGNoZWNraW5nIHdoYXQgR291bGQgdXNlcy4gIEkgaW5jbHVkZSB0aGVzZSB2YWx1ZXMKK29ubHkgYmVjYXVzZSBwZXJoYXBzIHNvbWUgc29tZW9uZSBhY3R1YWxseSBkaWQgc29tZXRoaW5nIHdpdGggdGhlIEdOVQoraW5mb3JtYXRpb24gKEkgaG9wZSBub3QsIHdoeSBHTlUga25vd2luZ2x5IGFzc2lnbmVkIHdyb25nIHZhbHVlcyB0bwordGhlc2UgaW4gdGhlIGhlYWRlciBmaWxlIGlzIGEgY29tcGxldGUgbXlzdGVyeSB0byBtZSkuCisKK0BleGFtcGxlCisyNDAgICAgMHhmMCAgICAgTl9OQlRFWFQgID8/CisyNDIgICAgMHhmMiAgICAgTl9OQkRBVEEgID8/CisyNDQgICAgMHhmNCAgICAgTl9OQkJTUyAgID8/CisyNDYgICAgMHhmNiAgICAgTl9OQlNUUyAgID8/CisyNDggICAgMHhmOCAgICAgTl9OQkxDUyAgID8/CitAZW5kIGV4YW1wbGUKK0BlbmQgZGVmZm4KKworQG5vZGUgTl9MRU5HCitAc2VjdGlvbiBOX0xFTkcKKworQGRlZmZuIEBjb2Rley5zdGFibn0gTl9MRU5HCitAZmluZGV4IE5fTEVORworU2Vjb25kIHN5bWJvbCBlbnRyeSBjb250YWluaW5nIGEgbGVuZ3RoLXZhbHVlIGZvciB0aGUgcHJlY2VkaW5nIGVudHJ5LgorVGhlIHZhbHVlIGlzIHRoZSBsZW5ndGguCitAZW5kIGRlZmZuCisKK0Bub2RlIFF1ZXN0aW9ucworQGFwcGVuZGl4IFF1ZXN0aW9ucyBhbmQgQW5vbWFsaWVzCisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitAYyBJIHRoaW5rIHRoaXMgaXMgY2hhbmdlZCBpbiBHQ0MgMi40LjUgdG8gcHV0IHRoZSBsaW5lIG51bWJlciB0aGVyZS4KK0ZvciBHTlUgQyBzdGFicyBkZWZpbmluZyBsb2NhbCBhbmQgZ2xvYmFsIHZhcmlhYmxlcyAoQGNvZGV7Tl9MU1lNfSBhbmQKK0Bjb2Rle05fR1NZTX0pLCB0aGUgZGVzYyBmaWVsZCBpcyBzdXBwb3NlZCB0byBjb250YWluIHRoZSBzb3VyY2UKK2xpbmUgbnVtYmVyIG9uIHdoaWNoIHRoZSB2YXJpYWJsZSBpcyBkZWZpbmVkLiAgSW4gcmVhbGl0eSB0aGUgZGVzYworZmllbGQgaXMgYWx3YXlzIDAuICAoVGhpcyBiZWhhdmlvciBpcyBkZWZpbmVkIGluIEBmaWxle2RieG91dC5jfSBhbmQKK3B1dHRpbmcgYSBsaW5lIG51bWJlciBpbiBkZXNjIGlzIGNvbnRyb2xsZWQgYnkgQHNhbXB7I2lmZGVmCitXSU5OSU5HX0dEQn0sIHdoaWNoIGRlZmF1bHRzIHRvIGZhbHNlKS4gR0RCIHN1cHBvc2VkbHkgdXNlcyB0aGlzCitpbmZvcm1hdGlvbiBpZiB5b3Ugc2F5IEBzYW1we2xpc3QgQHZhcnt2YXJ9fS4gIEluIHJlYWxpdHksIEB2YXJ7dmFyfSBjYW4KK2JlIGEgdmFyaWFibGUgZGVmaW5lZCBpbiB0aGUgcHJvZ3JhbSBhbmQgR0RCIHNheXMgQHNhbXB7ZnVuY3Rpb24KK0B2YXJ7dmFyfSBub3QgZGVmaW5lZH0uCisKK0BpdGVtCitJbiBHTlUgQyBzdGFicywgdGhlcmUgc2VlbXMgdG8gYmUgbm8gd2F5IHRvIGRpZmZlcmVudGlhdGUgdGFnIHR5cGVzOgorc3RydWN0dXJlcywgdW5pb25zLCBhbmQgZW51bXMgKHN5bWJvbCBkZXNjcmlwdG9yIEBzYW1we1R9KSBhbmQgdHlwZWRlZnMKKyhzeW1ib2wgZGVzY3JpcHRvciBAc2FtcHt0fSkgZGVmaW5lZCBhdCBmaWxlIHNjb3BlIGZyb20gdHlwZXMgZGVmaW5lZCBsb2NhbGx5Cit0byBhIHByb2NlZHVyZSBvciBvdGhlciBtb3JlIGxvY2FsIHNjb3BlLiAgVGhleSBhbGwgdXNlIHRoZSBAY29kZXtOX0xTWU19CitzdGFiIHR5cGUuICBUeXBlcyBkZWZpbmVkIGF0IHByb2NlZHVyZSBzY29wZSBhcmUgZW1pdGVkIGFmdGVyIHRoZQorQGNvZGV7Tl9SQlJBQ30gb2YgdGhlIHByZWNlZGluZyBmdW5jdGlvbiBhbmQgYmVmb3JlIHRoZSBjb2RlIG9mIHRoZQorcHJvY2VkdXJlIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQuICBUaGlzIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMKK3R5cGVzIGRlZmluZWQgaW4gdGhlIHNvdXJjZSBmaWxlIGJldHdlZW4gdGhlIHR3byBwcm9jZWR1cmUgYm9kaWVzLgorR0RCIG92ZXJjb21wZW5zYXRlcyBieSBwbGFjaW5nIGFsbCB0eXBlcyBpbiBibG9jayAjMSwgdGhlIGJsb2NrIGZvcgorc3ltYm9scyBvZiBmaWxlIHNjb3BlLiAgVGhpcyBpcyB0cnVlIGZvciBkZWZhdWx0LCBAc2FtcHstYW5zaX0gYW5kCitAc2FtcHstdHJhZGl0aW9uYWx9IGNvbXBpbGVyIG9wdGlvbnMuIChCdWdzIGdjYy8xMDYzLCBnZGIvMTA2Ni4pCisKK0BpdGVtCitXaGF0IGVuZHMgdGhlIHByb2NlZHVyZSBzY29wZT8gIElzIGl0IHRoZSBwcm9jIGJsb2NrJ3MgQGNvZGV7Tl9SQlJBQ30gb3IgdGhlCituZXh0IEBjb2Rle05fRlVOfT8gIChJIGJlbGlldmUgaXRzIHRoZSBmaXJzdC4pCitAZW5kIGl0ZW1pemUKKworQG5vZGUgU3RhYiBTZWN0aW9ucworQGFwcGVuZGl4IFVzaW5nIFN0YWJzIGluIFRoZWlyIE93biBTZWN0aW9ucworCitNYW55IG9iamVjdCBmaWxlIGZvcm1hdHMgYWxsb3cgdG9vbHMgdG8gY3JlYXRlIG9iamVjdCBmaWxlcyB3aXRoIGN1c3RvbQorc2VjdGlvbnMgY29udGFpbmluZyBhbnkgYXJiaXRyYXJ5IGRhdGEuICBGb3IgYW55IHN1Y2ggb2JqZWN0IGZpbGUKK2Zvcm1hdCwgc3RhYnMgY2FuIGJlIGVtYmVkZGVkIGluIHNwZWNpYWwgc2VjdGlvbnMuICBUaGlzIGlzIGhvdyBzdGFicworYXJlIHVzZWQgd2l0aCBFTEYgYW5kIFNPTSwgYW5kIGFzaWRlIGZyb20gRUNPRkYgYW5kIFhDT0ZGLCBpcyBob3cgc3RhYnMKK2FyZSB1c2VkIHdpdGggQ09GRi4KKworQG1lbnUKKyogU3RhYiBTZWN0aW9uIEJhc2ljczo6ICAgIEhvdyB0byBlbWJlZCBzdGFicyBpbiBzZWN0aW9ucworKiBFTEYgTGlua2VyIFJlbG9jYXRpb246OiAgU3VuIEVMRiBoYWNrcworQGVuZCBtZW51CisKK0Bub2RlIFN0YWIgU2VjdGlvbiBCYXNpY3MKK0BhcHBlbmRpeHNlYyBIb3cgdG8gRW1iZWQgU3RhYnMgaW4gU2VjdGlvbnMKKworVGhlIGFzc2VtYmxlciBjcmVhdGVzIHR3byBjdXN0b20gc2VjdGlvbnMsIGEgc2VjdGlvbiBuYW1lZCBAY29kZXsuc3RhYn0KK3doaWNoIGNvbnRhaW5zIGFuIGFycmF5IG9mIGZpeGVkIGxlbmd0aCBzdHJ1Y3R1cmVzLCBvbmUgc3RydWN0IHBlciBzdGFiLAorYW5kIGEgc2VjdGlvbiBuYW1lZCBAY29kZXsuc3RhYnN0cn0gY29udGFpbmluZyBhbGwgdGhlIHZhcmlhYmxlIGxlbmd0aAorc3RyaW5ncyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IHN0YWJzIGluIHRoZSBAY29kZXsuc3RhYn0gc2VjdGlvbi4gIFRoZQorYnl0ZSBvcmRlciBvZiB0aGUgc3RhYnMgYmluYXJ5IGRhdGEgZGVwZW5kcyBvbiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LgorRm9yIEVMRiwgaXQgbWF0Y2hlcyB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgRUxGIGZpbGUgaXRzZWxmLCBhcyBkZXRlcm1pbmVkCitmcm9tIHRoZSBAY29kZXtFSV9EQVRBfSBmaWVsZCBpbiB0aGUgQGNvZGV7ZV9pZGVudH0gbWVtYmVyIG9mIHRoZSBFTEYKK2hlYWRlci4gIEZvciBTT00sIGl0IGlzIGFsd2F5cyBiaWctZW5kaWFuIChpcyB0aGlzIHRydWU/Pz8gRklYTUUpLiAgRm9yCitDT0ZGLCBpdCBtYXRjaGVzIHRoZSBieXRlIG9yZGVyIG9mIHRoZSBDT0ZGIGhlYWRlcnMuICBUaGUgbWVhbmluZyBvZiB0aGUKK2ZpZWxkcyBpcyB0aGUgc2FtZSBhcyBmb3IgYS5vdXQgKEBweHJlZntTeW1ib2wgVGFibGUgRm9ybWF0fSksIGV4Y2VwdAordGhhdCB0aGUgQGNvZGV7bl9zdHJ4fSBmaWVsZCBpcyByZWxhdGl2ZSB0byB0aGUgc3RyaW5ncyBmb3IgdGhlIGN1cnJlbnQKK2NvbXBpbGF0aW9uIHVuaXQgKHdoaWNoIGNhbiBiZSBmb3VuZCB1c2luZyB0aGUgc3ludGhldGljIE5fVU5ERiBzdGFiCitkZXNjcmliZWQgYmVsb3cpLCByYXRoZXIgdGhhbiB0aGUgZW50aXJlIHN0cmluZyB0YWJsZS4KKworVGhlIGZpcnN0IHN0YWIgaW4gdGhlIEBjb2Rley5zdGFifSBzZWN0aW9uIGZvciBlYWNoIGNvbXBpbGF0aW9uIHVuaXQgaXMKK3N5bnRoZXRpYywgZ2VuZXJhdGVkIGVudGlyZWx5IGJ5IHRoZSBhc3NlbWJsZXIsIHdpdGggbm8gY29ycmVzcG9uZGluZworQGNvZGV7LnN0YWJ9IGRpcmVjdGl2ZSBhcyBpbnB1dCB0byB0aGUgYXNzZW1ibGVyLiAgVGhpcyBzdGFiIGNvbnRhaW5zCit0aGUgZm9sbG93aW5nIGZpZWxkczoKKworQHRhYmxlIEBjb2RlCitAaXRlbSBuX3N0cngKK09mZnNldCBpbiB0aGUgQGNvZGV7LnN0YWJzdHJ9IHNlY3Rpb24gdG8gdGhlIHNvdXJjZSBmaWxlbmFtZS4KKworQGl0ZW0gbl90eXBlCitAY29kZXtOX1VOREZ9LgorCitAaXRlbSBuX290aGVyCitVbnVzZWQgZmllbGQsIGFsd2F5cyB6ZXJvLgorVGhpcyBtYXkgZXZlbnR1YWxseSBiZSB1c2VkIHRvIGhvbGQgb3ZlcmZsb3dzIGZyb20gdGhlIGNvdW50IGluCit0aGUgQGNvZGV7bl9kZXNjfSBmaWVsZC4KKworQGl0ZW0gbl9kZXNjCitDb3VudCBvZiB1cGNvbWluZyBzeW1ib2xzLCBpLmUuLCB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBzdGFicyBmb3IgdGhpcworc291cmNlIGZpbGUuCisKK0BpdGVtIG5fdmFsdWUKK1NpemUgb2YgdGhlIHN0cmluZyB0YWJsZSBmcmFnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzb3VyY2UgZmlsZSwgaW4KK2J5dGVzLgorQGVuZCB0YWJsZQorCitUaGUgQGNvZGV7LnN0YWJzdHJ9IHNlY3Rpb24gYWx3YXlzIHN0YXJ0cyB3aXRoIGEgbnVsbCBieXRlIChzbyB0aGF0IHN0cmluZworb2Zmc2V0cyBvZiB6ZXJvIHJlZmVyZW5jZSBhIG51bGwgc3RyaW5nKSwgZm9sbG93ZWQgYnkgcmFuZG9tIGxlbmd0aCBzdHJpbmdzLAorZWFjaCBvZiB3aGljaCBpcyBudWxsIGJ5dGUgdGVybWluYXRlZC4KKworVGhlIEVMRiBzZWN0aW9uIGhlYWRlciBmb3IgdGhlIEBjb2Rley5zdGFifSBzZWN0aW9uIGhhcyBpdHMKK0Bjb2Rle3NoX2xpbmt9IG1lbWJlciBzZXQgdG8gdGhlIHNlY3Rpb24gbnVtYmVyIG9mIHRoZSBAY29kZXsuc3RhYnN0cn0KK3NlY3Rpb24sIGFuZCB0aGUgQGNvZGV7LnN0YWJzdHJ9IHNlY3Rpb24gaGFzIGl0cyBFTEYgc2VjdGlvbgoraGVhZGVyIEBjb2Rle3NoX3R5cGV9IG1lbWJlciBzZXQgdG8gQGNvZGV7U0hUX1NUUlRBQn0gdG8gbWFyayBpdCBhcyBhCitzdHJpbmcgdGFibGUuICBTT00gYW5kIENPRkYgaGF2ZSBubyB3YXkgb2YgbGlua2luZyB0aGUgc2VjdGlvbnMgdG9nZXRoZXIKK29yIG1hcmtpbmcgdGhlbSBhcyBzdHJpbmcgdGFibGVzLgorCitGb3IgQ09GRiwgdGhlIEBjb2Rley5zdGFifSBhbmQgQGNvZGV7LnN0YWJzdHJ9IHNlY3Rpb25zIG1heSBiZSBzaW1wbHkKK2NvbmNhdGVuYXRlZCBieSB0aGUgbGlua2VyLiAgR0RCIHRoZW4gdXNlcyB0aGUgQGNvZGV7bl9kZXNjfSBmaWVsZHMgdG8KK2ZpZ3VyZSBvdXQgdGhlIGV4dGVudCBvZiB0aGUgb3JpZ2luYWwgc2VjdGlvbnMuICBTaW1pbGFybHksIHRoZQorQGNvZGV7bl92YWx1ZX0gZmllbGRzIG9mIHRoZSBoZWFkZXIgc3ltYm9scyBhcmUgYWRkZWQgdG9nZXRoZXIgaW4gb3JkZXIKK3RvIGdldCB0aGUgYWN0dWFsIHBvc2l0aW9uIG9mIHRoZSBzdHJpbmdzIGluIGEgZGVzaXJlZCBAY29kZXsuc3RhYnN0cn0KK3NlY3Rpb24uICBBbHRob3VnaCB0aGlzIGRlc2lnbiBvYnZpYXRlcyBhbnkgbmVlZCBmb3IgdGhlIGxpbmtlciB0bworcmVsb2NhdGUgb3Igb3RoZXJ3aXNlIG1hbmlwdWxhdGUgQGNvZGV7LnN0YWJ9IGFuZCBAY29kZXsuc3RhYnN0cn0KK3NlY3Rpb25zLCBpdCBhbHNvIHJlcXVpcmVzIHNvbWUgY2FyZSB0byBlbnN1cmUgdGhhdCB0aGUgb2Zmc2V0cyBhcmUKK2NhbGN1bGF0ZWQgY29ycmVjdGx5LiAgRm9yIGluc3RhbmNlLCBpZiB0aGUgbGlua2VyIHdlcmUgdG8gcGFkIGluCitiZXR3ZWVuIHRoZSBAY29kZXsuc3RhYnN0cn0gc2VjdGlvbnMgYmVmb3JlIGNvbmNhdGVuYXRpbmcsIHRoZW4gdGhlCitvZmZzZXRzIHRvIHN0cmluZ3MgaW4gdGhlIG1pZGRsZSBvZiB0aGUgZXhlY3V0YWJsZSdzIEBjb2Rley5zdGFic3RyfQorc2VjdGlvbiB3b3VsZCBiZSB3cm9uZy4KKworVGhlIEdOVSBsaW5rZXIgaXMgYWJsZSB0byBvcHRpbWl6ZSBzdGFicyBpbmZvcm1hdGlvbiBieSBtZXJnaW5nCitkdXBsaWNhdGUgc3RyaW5ncyBhbmQgcmVtb3ZpbmcgZHVwbGljYXRlIGhlYWRlciBmaWxlIGluZm9ybWF0aW9uCisoQHB4cmVme0luY2x1ZGUgRmlsZXN9KS4gIFdoZW4gc29tZSB2ZXJzaW9ucyBvZiB0aGUgR05VIGxpbmtlciBvcHRpbWl6ZQorc3RhYnMgaW4gc2VjdGlvbnMsIHRoZXkgcmVtb3ZlIHRoZSBsZWFkaW5nIEBjb2Rle05fVU5ERn0gc3ltYm9sIGFuZAorYXJyYW5nZXMgZm9yIGFsbCB0aGUgQGNvZGV7bl9zdHJ4fSBmaWVsZHMgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCit0aGUgQGNvZGV7LnN0YWJzdHJ9IHNlY3Rpb24uCisKK0Bub2RlIEVMRiBMaW5rZXIgUmVsb2NhdGlvbgorQGFwcGVuZGl4c2VjIEhhdmluZyB0aGUgTGlua2VyIFJlbG9jYXRlIFN0YWJzIGluIEVMRiAKKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBzb21lIFN1biBoYWNrcyBmb3IgU3RhYnMgaW4gRUxGOyBpdCBkb2VzIG5vdAorYXBwbHkgdG8gQ09GRiBvciBTT00uCisKK1RvIGtlZXAgbGlua2luZyBmYXN0LCB5b3UgZG9uJ3Qgd2FudCB0aGUgbGlua2VyIHRvIGhhdmUgdG8gcmVsb2NhdGUgdmVyeQorbWFueSBzdGFicy4gIE1ha2luZyBzdXJlIHRoaXMgaXMgZG9uZSBmb3IgQGNvZGV7Tl9TTElORX0sCitAY29kZXtOX1JCUkFDfSwgYW5kIEBjb2Rle05fTEJSQUN9IHN0YWJzIGlzIHRoZSBtb3N0IGltcG9ydGFudCB0aGluZworKHNlZSB0aGUgZGVzY3JpcHRpb25zIG9mIHRob3NlIHN0YWJzIGZvciBtb3JlIGluZm9ybWF0aW9uKS4gIEJ1dCBTdW4ncworc3RhYnMgaW4gRUxGIGhhcyB0YWtlbiB0aGlzIGZ1cnRoZXIsIHRvIG1ha2UgYWxsIGFkZHJlc3NlcyBpbiB0aGUKK0Bjb2Rle25fdmFsdWV9IGZpZWxkIChmdW5jdGlvbnMgYW5kIHN0YXRpYyB2YXJpYWJsZXMpIHJlbGF0aXZlIHRvIHRoZQorc291cmNlIGZpbGUuICBGb3IgdGhlIEBjb2Rle05fU099IHN5bWJvbCBpdHNlbGYsIFN1biBzaW1wbHkgb21pdHMgdGhlCithZGRyZXNzLiAgVG8gZmluZCB0aGUgYWRkcmVzcyBvZiBlYWNoIHNlY3Rpb24gY29ycmVzcG9uZGluZyB0byBhIGdpdmVuCitzb3VyY2UgZmlsZSwgdGhlIGNvbXBpbGVyIHB1dHMgb3V0IHN5bWJvbHMgZ2l2aW5nIHRoZSBhZGRyZXNzIG9mIGVhY2gKK3NlY3Rpb24gZm9yIGEgZ2l2ZW4gc291cmNlIGZpbGUuICBTaW5jZSB0aGVzZSBhcmUgRUxGIChub3Qgc3RhYikKK3N5bWJvbHMsIHRoZSBsaW5rZXIgcmVsb2NhdGVzIHRoZW0gY29ycmVjdGx5IHdpdGhvdXQgaGF2aW5nIHRvIHRvdWNoIHRoZQorc3RhYnMgc2VjdGlvbi4gIFRoZXkgYXJlIG5hbWVkIEBjb2Rle0Jic3MuYnNzfSBmb3IgdGhlIGJzcyBzZWN0aW9uLAorQGNvZGV7RGRhdGEuZGF0YX0gZm9yIHRoZSBkYXRhIHNlY3Rpb24sIGFuZCBAY29kZXtEcm9kYXRhLnJvZGF0YX0gZm9yCit0aGUgcm9kYXRhIHNlY3Rpb24uICBGb3IgdGhlIHRleHQgc2VjdGlvbiwgdGhlcmUgaXMgbm8gc3VjaCBzeW1ib2wgKGJ1dAordGhlcmUgc2hvdWxkIGJlLCBzZWUgYmVsb3cpLiAgRm9yIGFuIGV4YW1wbGUgb2YgaG93IHRoZXNlIHN5bWJvbHMgd29yaywKK0B4cmVme1N0YWIgU2VjdGlvbiBUcmFuc2Zvcm1hdGlvbnN9LiAgR0NDIGRvZXMgbm90IHByb3ZpZGUgdGhlc2Ugc3ltYm9sczsKK2l0IGluc3RlYWQgcmVsaWVzIG9uIHRoZSBzdGFicyBnZXR0aW5nIHJlbG9jYXRlZC4gIFRodXMgYWRkcmVzc2VzIHdoaWNoCit3b3VsZCBub3JtYWxseSBiZSByZWxhdGl2ZSB0byBAY29kZXtCYnNzLmJzc30sIGV0Yy4sIGFyZSBhbHJlYWR5CityZWxvY2F0ZWQuICBUaGUgU3VuIGxpbmtlciBwcm92aWRlZCB3aXRoIFNvbGFyaXMgMi4yIGFuZCBlYXJsaWVyCityZWxvY2F0ZXMgc3RhYnMgdXNpbmcgbm9ybWFsIEVMRiByZWxvY2F0aW9uIGluZm9ybWF0aW9uLCBhcyBpdCB3b3VsZCBkbworZm9yIGFueSBzZWN0aW9uLiAgU3VuIGhhcyBiZWVuIHRocmVhdGVuaW5nIHRvIGtsdWRnZSB0aGVpciBsaW5rZXIgdG8gbm90CitkbyB0aGlzICh0byBzcGVlZCB1cCBsaW5raW5nKSwgZXZlbiB0aG91Z2ggdGhlIGNvcnJlY3Qgd2F5IHRvIGF2b2lkCitoYXZpbmcgdGhlIGxpbmtlciBkbyB0aGVzZSByZWxvY2F0aW9ucyBpcyB0byBoYXZlIHRoZSBjb21waWxlciBubyBsb25nZXIKK291dHB1dCByZWxvY2F0YWJsZSB2YWx1ZXMuICBMYXN0IEkgaGVhcmQgdGhleSBoYWQgYmVlbiB0YWxrZWQgb3V0IG9mIHRoZQorbGlua2VyIGtsdWRnZS4gIFNlZSBTdW4gcG9pbnQgcGF0Y2ggMTAxMDUyLTAxIGFuZCBTdW4gYnVnIDExNDIxMDkuICBXaXRoCit0aGUgU3VuIGNvbXBpbGVyIHRoaXMgYWZmZWN0cyBAc2FtcHtTfSBzeW1ib2wgZGVzY3JpcHRvciBzdGFicworKEBweHJlZntTdGF0aWNzfSkgYW5kIGZ1bmN0aW9ucyAoQHB4cmVme1Byb2NlZHVyZXN9KS4gIEluIHRoZSBsYXR0ZXIKK2Nhc2UsIHRvIGFkb3B0IHRoZSBjbGVhbiBzb2x1dGlvbiAobWFraW5nIHRoZSB2YWx1ZSBvZiB0aGUgc3RhYiByZWxhdGl2ZQordG8gdGhlIHN0YXJ0IG9mIHRoZSBjb21waWxhdGlvbiB1bml0KSwgaXQgd291bGQgYmUgbmVjZXNzYXJ5IHRvIGludmVudCBhCitAY29kZXtUdGV4dC50ZXh0fSBzeW1ib2wsIGFuYWxvZ291cyB0byB0aGUgQGNvZGV7QmJzcy5ic3N9LCBldGMuLAorc3ltYm9scy4gIEkgcmVjb21tZW5kIHRoaXMgcmF0aGVyIHRoYW4gdXNpbmcgYSB6ZXJvIHZhbHVlIGFuZCBnZXR0aW5nCit0aGUgYWRkcmVzcyBmcm9tIHRoZSBFTEYgc3ltYm9scy4KKworRmluZGluZyB0aGUgY29ycmVjdCBAY29kZXtCYnNzLmJzc30sIGV0Yy4sIHN5bWJvbCBpcyBkaWZmaWN1bHQsIGJlY2F1c2UKK3RoZSBsaW5rZXIgc2ltcGx5IGNvbmNhdGVuYXRlcyB0aGUgQGNvZGV7LnN0YWJ9IHNlY3Rpb25zIGZyb20gZWFjaAorQGZpbGV7Lm99IGZpbGUgd2l0aG91dCBpbmNsdWRpbmcgYW55IGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIHBhcnQgb2YgYQorQGNvZGV7LnN0YWJ9IHNlY3Rpb24gY29tZXMgZnJvbSB3aGljaCBAZmlsZXsub30gZmlsZS4gIFRoZSB3YXkgR0RCIGRvZXMKK3RoaXMgaXMgdG8gbG9vayBmb3IgYW4gRUxGIEBjb2Rle1NUVF9GSUxFfSBzeW1ib2wgd2hpY2ggaGFzIHRoZSBzYW1lCituYW1lIGFzIHRoZSBsYXN0IGNvbXBvbmVudCBvZiB0aGUgZmlsZSBuYW1lIGZyb20gdGhlIEBjb2Rle05fU099IHN5bWJvbAoraW4gdGhlIHN0YWJzIChmb3IgZXhhbXBsZSwgaWYgdGhlIGZpbGUgbmFtZSBpcyBAZmlsZXsuLi8uLi9nZGIvbWFpbi5jfSwKK2l0IGxvb2tzIGZvciBhbiBFTEYgQGNvZGV7U1RUX0ZJTEV9IHN5bWJvbCBuYW1lZCBAY29kZXttYWluLmN9KS4gIFRoaXMKK2xvc2VzIGlmIGRpZmZlcmVudCBmaWxlcyBoYXZlIHRoZSBzYW1lIG5hbWUgKHRoZXkgY291bGQgYmUgaW4gZGlmZmVyZW50CitkaXJlY3RvcmllcywgYSBsaWJyYXJ5IGNvdWxkIGhhdmUgYmVlbiBjb3BpZWQgZnJvbSBvbmUgc3lzdGVtIHRvCithbm90aGVyLCBldGMuKS4gIEl0IHdvdWxkIGJlIG11Y2ggY2xlYW5lciB0byBoYXZlIHRoZSBAY29kZXtCYnNzLmJzc30KK3N5bWJvbHMgaW4gdGhlIHN0YWJzIHRoZW1zZWx2ZXMuICBIYXZpbmcgdGhlIGxpbmtlciByZWxvY2F0ZSB0aGVtIHRoZXJlCitpcyBubyBtb3JlIHdvcmsgdGhhbiBoYXZpbmcgdGhlIGxpbmtlciByZWxvY2F0ZSBFTEYgc3ltYm9scywgYW5kIGl0Citzb2x2ZXMgdGhlIHByb2JsZW0gb2YgaGF2aW5nIHRvIGFzc29jaWF0ZSB0aGUgRUxGIGFuZCBzdGFiIHN5bWJvbHMuCitIb3dldmVyLCBubyBvbmUgaGFzIHlldCBkZXNpZ25lZCBvciBpbXBsZW1lbnRlZCBzdWNoIGEgc2NoZW1lLgorCitAbm9kZSBTeW1ib2wgVHlwZXMgSW5kZXgKK0B1bm51bWJlcmVkIFN5bWJvbCBUeXBlcyBJbmRleAorCitAcHJpbnRpbmRleCBmbgorCitAY29udGVudHMKK0BieWUKZGlmZiAtLWdpdCBhL2dkYi9kcHgyLW5hdC5jIGIvZ2RiL2RweDItbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkYzEzNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9kcHgyLW5hdC5jCkBAIC0wLDAgKzEsODMgQEAKKy8qIERQWDIgaG9zdCBpbnRlcmZhY2UuCisgICBDb3B5cmlnaHQgKEMpIDE5ODgsIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL2Rpci5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy91c2VyLmg+CisjaW5jbHVkZSA8c3lzL3JlZy5oPgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisKKwwKKy8qIHRoaXMgdGFibGUgbXVzdCBsaW5lIHVwIHdpdGggUkVHSVNURVJfTkFNRVMgaW4gdG0tNjhrLmggKi8KKy8qIHN5bWJvbHMgbGlrZSAnQTAnIGNvbWUgZnJvbSA8c3lzL3JlZy5oPiAqLworc3RhdGljIGludCByZWdtYXBbXSA9IAoreworICBSMCwgUjEsIFIyLCBSMywgUjQsIFI1LCBSNiwgUjcsCisgIEEwLCBBMSwgQTIsIEEzLCBBNCwgQTUsIEE2LCBTUCwKKyAgUFMsIFBDLAorICBGUDAsIEZQMSwgRlAyLCBGUDMsIEZQNCwgRlA1LCBGUDYsIEZQNywKKyAgRlBfQ1IsIEZQX1NSLCBGUF9JQVIKK307CisKKy8qIGJsb2NrZW5kIGlzIHRoZSB2YWx1ZSBvZiB1LnVfYXIwLCBhbmQgcG9pbnRzIHRvIHRoZQorICogcGxhY2Ugd2hlcmUgRDAgaXMgc3RvcmVkCisgKi8KKworaW50CitkcHgyX3JlZ2lzdGVyX3VfYWRkciAoYmxvY2tlbmQsIHJlZ251bSkKKyAgICAgaW50IGJsb2NrZW5kOworICAgICBpbnQgcmVnbnVtOworeworICBpZiAocmVnbnVtIDwgRlAwX1JFR05VTSkKKyAgICByZXR1cm4gKGJsb2NrZW5kICsgNCAqIHJlZ21hcFtyZWdudW1dKTsKKyAgZWxzZQorICAgIHJldHVybiAoaW50KSAmKCgoc3RydWN0IHVzZXIgKikwKS0+dV9mcHN0YXRlW3JlZ21hcFtyZWdudW1dXSk7Cit9CisKKy8qIFRoaXMgaXMgdGhlIGFtb3VudCB0byBzdWJ0cmFjdCBmcm9tIHUudV9hcjAKKyAgIHRvIGdldCB0aGUgb2Zmc2V0IGluIHRoZSBjb3JlIGZpbGUgb2YgdGhlIHJlZ2lzdGVyIHZhbHVlcy4KKyAgIFVuZm9ydHVuYXRlbHkgdGhpcyBpcyBub3QgcHJvdmlkZWQgaW4gdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMuCisgICBUbyBtYWtlIG1hdHRlcnMgd29yc2UsIHRoaXMgdmFsdWUgYWxzbyBkaWZmZXJzIGJldHdlZW4KKyAgIHRoZSBkcHgvMjIwMCBhbmQgZHB4LzIzMDAgbW9kZWxzIGFuZCBubGlzdCBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSBkcHgyLgorICAgV2UgdXNlIHV0c25hbWUoKSB0byBkZWNpZGUgb24gd2hpY2ggbW9kZWwgd2UgYXJlIHJ1bm5pbmcuCisgICBGSVhNRTogVGhpcyBicmVha3MgY3Jvc3MgZXhhbWluYXRpb24gb2YgY29yZSBmaWxlcyAoaXQgd291bGQgbm90IGJlIGhhcmQKKyAgIHRvIGNoZWNrIHdoZXRoZXIgdS51X2FyMCBpcyBiZXR3ZWVuIDB4N2ZmZjUwMDAgYW5kIDB4N2ZmZmMwMDAgYW5kIGlmIHNvCisgICB1c2UgMHg3ZmZmNTAwMCBhbmQgaWYgbm90IHVzZSAweDdmZmZjMDAwLiAgRklYTUUpLiAgKi8KKworI2RlZmluZSBLRVJORUxfVV9BRERSXzIwMCAweDdmZmY1MDAwCisjZGVmaW5lIEtFUk5FTF9VX0FERFJfMzAwIDB4N2ZmZmMwMDAKKworQ09SRV9BRERSIGtlcm5lbF91X2FkZHI7CisKK3ZvaWQKK19pbml0aWFsaXplX2RweDJfbmF0ICgpCit7CisgIHN0cnVjdCB1dHNuYW1lIHV0czsKKworICBpZiAodW5hbWUgKCZ1dHMpID09IDAgJiYgc3RyY21wICh1dHMubWFjaGluZSwgIkRQWC8yMjAwIikgPT0gMCkKKyAgICBrZXJuZWxfdV9hZGRyID0gS0VSTkVMX1VfQUREUl8yMDA7CisgIGVsc2UKKyAgICBrZXJuZWxfdV9hZGRyID0gS0VSTkVMX1VfQUREUl8zMDA7Cit9CmRpZmYgLS1naXQgYS9nZGIvZHNyZWMuYyBiL2dkYi9kc3JlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YzI5MjkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZHNyZWMuYwpAQCAtMCwwICsxLDMxMiBAQAorLyogUy1yZWNvcmQgZG93bmxvYWQgc3VwcG9ydCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJzZXJpYWwuaCIKKyNpbmNsdWRlICJzcmVjLmgiCisjaW5jbHVkZSA8dGltZS5oPgorCitpbnQgKCp1aV9sb2FkX3Byb2dyZXNzX2hvb2spIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOworZXh0ZXJuIHZvaWQgcmVwb3J0X3RyYW5zZmVyX3BlcmZvcm1hbmNlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIHRpbWVfdCwgdGltZV90KSk7CisKK2V4dGVybiBpbnQgcmVtb3RlX2RlYnVnOworCitzdGF0aWMgaW50IG1ha2Vfc3JlYyBQQVJBTVMgKChjaGFyICpzcmVjLCBDT1JFX0FERFIgdGFyZ19hZGRyLCBiZmQgKmFiZmQsCisJCQkgICAgICBhc2VjdGlvbiAqc2VjdCwgaW50IHNlY3RvZmYsIGludCAqbWF4cmVjc2l6ZSwKKwkJCSAgICAgIGludCBmbGFncykpOworCisvKiBEb3dubG9hZCBhbiBleGVjdXRhYmxlIGJ5IGNvbnZlcnRpbmcgaXQgdG8gUyByZWNvcmRzLiAgREVTQyBpcyBhCisgICAgc2VyaWFsX3QgdG8gc2VuZCB0aGUgZGF0YSB0by4gIEZJTEUgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gYmUKKyAgICBsb2FkZWQuICBMT0FEX09GRlNFVCBpcyB0aGUgb2Zmc2V0IGludG8gbWVtb3J5IHRvIGxvYWQgZGF0YSBpbnRvLgorICAgIEl0IGlzIHVzdWFsbHkgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIGFuZCBpcyB1c2VmdWwgd2l0aCB0aGUgYS5vdXQKKyAgICBmaWxlIGZvcm1hdC4gIE1BWFJFQ1NJWkUgaXMgdGhlIGxlbmd0aCBpbiBjaGFycyBvZiB0aGUgbGFyZ2VzdAorICAgIFMtcmVjb3JkIHRoZSBob3N0IGNhbiBhY2NvbW9kYXRlLiAgVGhpcyBpcyBtZWFzdXJlZCBmcm9tIHRoZQorICAgIHN0YXJ0aW5nIGBTJyB0byB0aGUgbGFzdCBjaGFyIG9mIHRoZSBjaGVja3N1bS4gIEZMQUdTIGlzIHZhcmlvdXMKKyAgICByYW5kb20gZmxhZ3MsIGFuZCBIQVNITUFSSyBpcyBub24temVybyB0byBjYXVzZSBhIGAjJyB0byBiZQorICAgIHByaW50ZWQgb3V0IGZvciBlYWNoIHJlY29yZCBsb2FkZWQuICBXQUlUQUNLLCBpZiBub24tTlVMTCwgaXMgYQorICAgIGZ1bmN0aW9uIHRoYXQgd2FpdHMgZm9yIGFuIGFja25vd2xlZGdlbWVudCBhZnRlciBlYWNoIFMtcmVjb3JkLAorICAgIGFuZCByZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBhY2sgaXMgcmVhZCBjb3JyZWN0bHkuICAqLworCit2b2lkCitsb2FkX3NyZWMgKGRlc2MsIGZpbGUsIGxvYWRfb2Zmc2V0LCBtYXhyZWNzaXplLCBmbGFncywgaGFzaG1hcmssIHdhaXRhY2spCisgICAgIHNlcmlhbF90IGRlc2M7CisgICAgIGNvbnN0IGNoYXIgKmZpbGU7CisgICAgIGJmZF92bWEgbG9hZF9vZmZzZXQ7CisgICAgIGludCBtYXhyZWNzaXplOworICAgICBpbnQgZmxhZ3M7CisgICAgIGludCBoYXNobWFyazsKKyAgICAgaW50ICgqd2FpdGFjaykgUEFSQU1TICgodm9pZCkpOworeworICBiZmQgKmFiZmQ7CisgIGFzZWN0aW9uICpzOworICBjaGFyICpzcmVjOworICBpbnQgaTsKKyAgaW50IHJlY2xlbjsKKyAgdGltZV90IHN0YXJ0X3RpbWUsIGVuZF90aW1lOworICB1bnNpZ25lZCBsb25nIGRhdGFfY291bnQgPSAwOworCisgIHNyZWMgPSAoY2hhciAqKSBhbGxvY2EgKG1heHJlY3NpemUgKyAxKTsKKworICBhYmZkID0gYmZkX29wZW5yIChmaWxlLCAwKTsKKyAgaWYgKCFhYmZkKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlVuYWJsZSB0byBvcGVuIGZpbGUgJXNcbiIsIGZpbGUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkgPT0gMCkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJGaWxlIGlzIG5vdCBhbiBvYmplY3QgZmlsZVxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHN0YXJ0X3RpbWUgPSB0aW1lIChOVUxMKTsKKworICAvKiBXcml0ZSBhIHR5cGUgMCBoZWFkZXIgcmVjb3JkLiBubyBkYXRhIGZvciBhIHR5cGUgMCwgYW5kIHRoZXJlCisgICAgIGlzIG5vIGRhdGEsIHNvIGxlbiBpcyAwLiAgKi8KKworICByZWNsZW4gPSBtYXhyZWNzaXplOworICBtYWtlX3NyZWMgKHNyZWMsIDAsIE5VTEwsIChhc2VjdGlvbiAqKTEsIDAsICZyZWNsZW4sIGZsYWdzKTsKKyAgaWYgKHJlbW90ZV9kZWJ1ZykKKyAgICB7CisgICAgICBzcmVjW3JlY2xlbl0gPSAnXDAnOworICAgICAgcHV0c19kZWJ1ZyAoInNlbnQgLS0+Iiwgc3JlYywgIjwtLSIpOworICAgIH0KKyAgU0VSSUFMX1dSSVRFIChkZXNjLCBzcmVjLCByZWNsZW4pOworCisgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKKyAgICBpZiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkKKyAgICAgIHsKKwlpbnQgbnVtYnl0ZXM7CisJYmZkX3ZtYSBhZGRyID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgcykgKyBsb2FkX29mZnNldDsKKwliZmRfc2l6ZV90eXBlIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHMpOworCWNoYXIgKiBzZWN0aW9uX25hbWUgPSAoY2hhciAqKWJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzKTsKKwlwcmludGZfZmlsdGVyZWQgKCIlc1x0OiAweCUwOHggLi4gMHglMDh4ICAiLAorCQkJIHNlY3Rpb25fbmFtZSwgKGludCkgYWRkciwgKGludCkgYWRkciArIHNpemUpOworCWdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisKKwlkYXRhX2NvdW50ICs9IHNpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBudW1ieXRlcykKKwkgIHsKKwkgICAgcmVjbGVuID0gbWF4cmVjc2l6ZTsKKwkgICAgbnVtYnl0ZXMgPSBtYWtlX3NyZWMgKHNyZWMsIChDT1JFX0FERFIpIChhZGRyICsgaSksIGFiZmQsIHMsCisJCQkJICBpLCAmcmVjbGVuLCBmbGFncyk7CisKKwkgICAgaWYgKHJlbW90ZV9kZWJ1ZykKKwkgICAgICB7CisJCXNyZWNbcmVjbGVuXSA9ICdcMCc7CisJCXB1dHNfZGVidWcgKCJzZW50IC0tPiIsIHNyZWMsICI8LS0iKTsKKwkgICAgICB9CisKKwkgICAgLyogUmVwZWF0ZWRseSBzZW5kIHRoZSBTLXJlY29yZCB1bnRpbCBhIGdvb2QKKwkgICAgICAgYWNrbm93bGVkZ2VtZW50IGlzIHNlbnQgYmFjay4gICovCisJICAgIGRvCisJICAgICAgeworCSAgICAgICAgU0VSSUFMX1dSSVRFIChkZXNjLCBzcmVjLCByZWNsZW4pOworCQlpZiAodWlfbG9hZF9wcm9ncmVzc19ob29rKQorCQkgIGlmICh1aV9sb2FkX3Byb2dyZXNzX2hvb2sgKHNlY3Rpb25fbmFtZSwgKHVuc2lnbmVkIGxvbmcpIGkpKQorCQkgICAgZXJyb3IgKCJDYW5jZWxlZCB0aGUgZG93bmxvYWQiKTsKKwkgICAgICB9CisJICAgIHdoaWxlICh3YWl0YWNrICE9IE5VTEwgJiYgIXdhaXRhY2sgKCkpOworCisJICAgIGlmIChoYXNobWFyaykKKwkgICAgICB7CisJCXB1dGNoYXJfdW5maWx0ZXJlZCAoJyMnKTsKKwkJZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwkgICAgICB9CisJICB9CQkJLyogUGVyLXBhY2tldCAob3IgUy1yZWNvcmQpIGxvb3AgKi8KKworCWlmICh1aV9sb2FkX3Byb2dyZXNzX2hvb2spCisJICBpZiAodWlfbG9hZF9wcm9ncmVzc19ob29rIChzZWN0aW9uX25hbWUsICh1bnNpZ25lZCBsb25nKSBpKSkKKwkgICAgZXJyb3IgKCJDYW5jZWxlZCB0aGUgZG93bmxvYWQiKTsKKwlwdXRjaGFyX3VuZmlsdGVyZWQgKCdcbicpOworICAgICAgfQorCisgIGlmIChoYXNobWFyaykgCisgICAgcHV0Y2hhcl91bmZpbHRlcmVkICgnXG4nKTsKKworICBlbmRfdGltZSA9IHRpbWUgKE5VTEwpOworICAKKyAgLyogV3JpdGUgYSB0ZXJtaW5hdG9yIHJlY29yZC4gICovCisKKyAgcmVjbGVuID0gbWF4cmVjc2l6ZTsKKyAgbWFrZV9zcmVjIChzcmVjLCBhYmZkLT5zdGFydF9hZGRyZXNzLCBOVUxMLCBOVUxMLCAwLCAmcmVjbGVuLCBmbGFncyk7CisKKyAgaWYgKHJlbW90ZV9kZWJ1ZykKKyAgICB7CisgICAgICBzcmVjW3JlY2xlbl0gPSAnXDAnOworICAgICAgcHV0c19kZWJ1ZyAoInNlbnQgLS0+Iiwgc3JlYywgIjwtLSIpOworICAgIH0KKworICBTRVJJQUxfV1JJVEUgKGRlc2MsIHNyZWMsIHJlY2xlbik7CisKKyAgLyogU29tZSBtb25pdG9ycyBuZWVkIHRoZXNlIHRvIHdha2UgdXAgcHJvcGVybHkuICAoV2hpY2ggb25lcz8gLXN0cykgICovCisgIFNFUklBTF9XUklURSAoZGVzYywgIlxyXHIiLCAyKTsKKyAgaWYgKHJlbW90ZV9kZWJ1ZykKKyAgICBwdXRzX2RlYnVnICgic2VudCAtLT4iLCAiXHJcciIsICI8LS0tIik7CisKKyAgU0VSSUFMX0ZMVVNIX0lOUFVUIChkZXNjKTsKKworICByZXBvcnRfdHJhbnNmZXJfcGVyZm9ybWFuY2UgKGRhdGFfY291bnQsIHN0YXJ0X3RpbWUsIGVuZF90aW1lKTsKK30KKworLyoKKyAqIG1ha2Vfc3JlYyAtLSBtYWtlIGFuIHNyZWNvcmQuIFRoaXMgd3JpdGVzIGVhY2ggbGluZSwgb25lIGF0IGEKKyAqCXRpbWUsIGVhY2ggd2l0aCBpdCdzIG93biBoZWFkZXIgYW5kIHRyYWlsZXIgbGluZS4KKyAqCUFuIHNyZWNvcmQgbG9va3MgbGlrZSB0aGlzOgorICoKKyAqIGJ5dGUgY291bnQtKyAgICAgYWRkcmVzcworICogc3RhcnQgLS0tKyB8ICAgICAgICB8ICAgICAgIGRhdGEgICAgICAgICstIGNoZWNrc3VtCisgKgkgICAgfCB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwKKyAqCSAgUzAxMDAwMDA2RjZCNjkyRDc0NjU3Mzc0MkU3MzcyNjU2M0U0CisgKgkgIFMzMTUwMDA0NDg2MDAwMDAwMDAwMDAwMDAwMDBGQzAwMDA1OTAwMDAwMDAwRTkKKyAqCSAgUzMxQTAwMDQwMDAwMjNDMTQwMDAzN0RFMDBGMDIzNjA0MDAwMzc3QjAwOTAyMDgyNTAwMDM0OEQKKyAqCSAgUzMwQjAwMDQ0ODVBMDAwMDAwMDAwMDAwNEUKKyAqCSAgUzcwNTAwMDQwMDAwRjYKKyAqCisgKglTPHR5cGU+PGxlbmd0aD48YWRkcmVzcz48ZGF0YT48Y2hlY2tzdW0+CisgKgorICogICAgICBXaGVyZQorICogICAgICAtIGxlbmd0aAorICogICAgICAgIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9sbG93aW5nIHVwdG8gdGhlIGNoZWNrc3VtLiBOb3RlIHRoYXQKKyAqICAgICAgICB0aGlzIGlzIG5vdCB0aGUgbnVtYmVyIG9mIGNoYXJzIGZvbGxvd2luZywgc2luY2UgaXQgdGFrZXMgdHdvCisgKiAgICAgICAgY2hhcnMgdG8gcmVwcmVzZW50IGEgYnl0ZS4KKyAqICAgICAgLSB0eXBlCisgKiAgICAgICAgaXMgb25lIG9mOgorICogICAgICAgIDApIGhlYWRlciByZWNvcmQKKyAqICAgICAgICAxKSB0d28gYnl0ZSBhZGRyZXNzIGRhdGEgcmVjb3JkCisgKiAgICAgICAgMikgdGhyZWUgYnl0ZSBhZGRyZXNzIGRhdGEgcmVjb3JkCisgKiAgICAgICAgMykgZm91ciBieXRlIGFkZHJlc3MgZGF0YSByZWNvcmQKKyAqICAgICAgICA3KSBmb3VyIGJ5dGUgYWRkcmVzcyB0ZXJtaW5hdGlvbiByZWNvcmQKKyAqICAgICAgICA4KSB0aHJlZSBieXRlIGFkZHJlc3MgdGVybWluYXRpb24gcmVjb3JkCisgKiAgICAgICAgOSkgdHdvIGJ5dGUgYWRkcmVzcyB0ZXJtaW5hdGlvbiByZWNvcmQKKyAqICAgICAgIAorICogICAgICAtIGFkZHJlc3MKKyAqICAgICAgICBpcyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZGF0YSBmb2xsb3dpbmcsIG9yIGluIHRoZSBjYXNlIG9mCisgKiAgICAgICAgYSB0ZXJtaW5hdGlvbiByZWNvcmQsIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBpbWFnZQorICogICAgICAtIGRhdGEKKyAqICAgICAgICBpcyB0aGUgZGF0YS4KKyAqICAgICAgLSBjaGVja3N1bQorICoJICBpcyB0aGUgc3VtIG9mIGFsbCB0aGUgcmF3IGJ5dGUgZGF0YSBpbiB0aGUgcmVjb3JkLCBmcm9tIHRoZSBsZW5ndGgKKyAqICAgICAgICB1cHdhcmRzLCBtb2R1bG8gMjU2IGFuZCBzdWJ0cmFjdGVkIGZyb20gMjU1LgorICoKKyAqIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIFMtcmVjb3JkLgorICoKKyAqLworCitzdGF0aWMgaW50CittYWtlX3NyZWMgKHNyZWMsIHRhcmdfYWRkciwgYWJmZCwgc2VjdCwgc2VjdG9mZiwgbWF4cmVjc2l6ZSwgZmxhZ3MpCisgICAgIGNoYXIgKnNyZWM7CisgICAgIENPUkVfQUREUiB0YXJnX2FkZHI7CisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Q7CisgICAgIGludCBzZWN0b2ZmOworICAgICBpbnQgKm1heHJlY3NpemU7CisgICAgIGludCBmbGFnczsKK3sKKyAgdW5zaWduZWQgY2hhciBjaGVja3N1bTsKKyAgaW50IHRtcDsKKyAgY29uc3Qgc3RhdGljIGNoYXIgaGV4dGFiW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisgIGNvbnN0IHN0YXRpYyBjaGFyIGRhdGFfY29kZV90YWJsZVtdID0gIjEyMyI7CisgIGNvbnN0IHN0YXRpYyBjaGFyIHRlcm1fY29kZV90YWJsZVtdID0gIjk4NyI7CisgIGNvbnN0IHN0YXRpYyBjaGFyIGhlYWRlcl9jb2RlX3RhYmxlW10gPSAiMDAwIjsKKyAgY29uc3Qgc3RhdGljIGNoYXIgKmZvcm1hdHNbXSA9IHsgIlMlYyUwMlglMDRYIiwKKwkJCQkgICAiUyVjJTAyWCUwNlgiLAorCQkJCSAgICJTJWMlMDJYJTA4WCIgfTsKKyAgY2hhciBjb25zdCAqY29kZV90YWJsZTsKKyAgaW50IGFkZHJfc2l6ZTsKKyAgaW50IHBheWxvYWRfc2l6ZTsKKyAgY2hhciAqYmluYnVmOworICBjaGFyICpwOworCisgIGlmIChzZWN0KQorICAgIHsKKyAgICAgIHRtcCA9IGZsYWdzOwkJLyogRGF0YSBvciBoZWFkZXIgcmVjb3JkICovCisgICAgICBjb2RlX3RhYmxlID0gYWJmZCA/IGRhdGFfY29kZV90YWJsZSA6IGhlYWRlcl9jb2RlX3RhYmxlOworICAgICAgYmluYnVmID0gYWxsb2NhICgqbWF4cmVjc2l6ZS8yKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB0bXAgPSBmbGFncyA+PiBTUkVDX1RFUk1fU0hJRlQ7IC8qIFRlcm0gcmVjb3JkICovCisgICAgICBjb2RlX3RhYmxlID0gdGVybV9jb2RlX3RhYmxlOworICAgIH0KKworICBpZiAoKHRtcCAmIFNSRUNfMl9CWVRFX0FERFIpICYmICh0YXJnX2FkZHIgPD0gMHhmZmZmKSkKKyAgICBhZGRyX3NpemUgPSAyOworICBlbHNlIGlmICgodG1wICYgU1JFQ18zX0JZVEVfQUREUikgJiYgKHRhcmdfYWRkciA8PSAweGZmZmZmZikpCisgICAgYWRkcl9zaXplID0gMzsKKyAgZWxzZSBpZiAodG1wICYgU1JFQ180X0JZVEVfQUREUikKKyAgICBhZGRyX3NpemUgPSA0OworICBlbHNlCisgICAgZmF0YWwgKCJtYWtlX3NyZWM6ICBCYWQgYWRkcmVzcyAoMHgleCksIG9yIGJhZCBmbGFncyAoMHgleCkuIiwKKwkgICB0YXJnX2FkZHIsIGZsYWdzKTsKKworICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBhZGRyZXNzIHNpemUsIHdlIGNhbiBmaWd1cmUgb3V0IGhvdyBtdWNoCisgICAgIGRhdGEgdGhpcyByZWNvcmQgY2FuIGhvbGQuICAqLworCisgIGlmIChzZWN0ICYmIGFiZmQpCisgICAgeworICAgICAgcGF5bG9hZF9zaXplID0gKCptYXhyZWNzaXplIC0gKDEgKyAxICsgMiArIGFkZHJfc2l6ZSAqIDIgKyAyKSkgLyAyOworICAgICAgcGF5bG9hZF9zaXplID0gbWluIChwYXlsb2FkX3NpemUsIHNlY3QtPl9yYXdfc2l6ZSAtIHNlY3RvZmYpOworCisgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3QsIGJpbmJ1Ziwgc2VjdG9mZiwgcGF5bG9hZF9zaXplKTsKKyAgICB9CisgIGVsc2UKKyAgICBwYXlsb2FkX3NpemUgPSAwOwkJLyogVGVybSBvciBoZWFkZXIgcGFja2V0cyBoYXZlIG5vIHBheWxvYWQgKi8KKworICAvKiBPdXRwdXQgdGhlIGhlYWRlci4gICovCisKKyAgc3ByaW50ZiAoc3JlYywgZm9ybWF0c1thZGRyX3NpemUgLSAyXSwgY29kZV90YWJsZVthZGRyX3NpemUgLSAyXSwKKwkgICBhZGRyX3NpemUgKyBwYXlsb2FkX3NpemUgKyAxLCAoaW50KXRhcmdfYWRkcik7CisKKyAgLyogTm90ZSB0aGF0IHRoZSBjaGVja3N1bSBpcyBjYWxjdWxhdGVkIG9uIHRoZSByYXcgZGF0YSwgbm90IHRoZQorICAgICBoZXhpZmllZCBkYXRhLiAgSXQgaW5jbHVkZXMgdGhlIGxlbmd0aCwgYWRkcmVzcyBhbmQgdGhlIGRhdGEKKyAgICAgcG9ydGlvbnMgb2YgdGhlIHBhY2tldC4gICovCisKKyAgY2hlY2tzdW0gPSAwOworICAKKyAgY2hlY2tzdW0gKz0gKHBheWxvYWRfc2l6ZSArIGFkZHJfc2l6ZSArIDEJLyogUGFja2V0IGxlbmd0aCAqLworCSAgICAgICArICh0YXJnX2FkZHIgJiAweGZmKQkJLyogQWRkcmVzcy4uLiAqLworCSAgICAgICArICgodGFyZ19hZGRyID4+ICA4KSAmIDB4ZmYpCisJICAgICAgICsgKCh0YXJnX2FkZHIgPj4gMTYpICYgMHhmZikKKwkgICAgICAgKyAoKHRhcmdfYWRkciA+PiAyNCkgJiAweGZmKSk7CisgIAorICBwID0gc3JlYyArIDEgKyAxICsgMiArIGFkZHJfc2l6ZSAqIDI7CisKKyAgLyogQnVpbGQgdGhlIFNyZWNvcmQuICAqLworICBmb3IgKHRtcCA9IDA7IHRtcCA8IHBheWxvYWRfc2l6ZTsgdG1wKyspCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciBrOworCisgICAgICBrID0gYmluYnVmW3RtcF07CisgICAgICAqcCsrID0gaGV4dGFiIFtrID4+IDRdOworICAgICAgKnArKyA9IGhleHRhYiBbayAmIDB4Zl07CisgICAgICBjaGVja3N1bSArPSBrOworICAgIH0KKworICBjaGVja3N1bSA9IH5jaGVja3N1bTsKKworICAqcCsrID0gaGV4dGFiW2NoZWNrc3VtID4+IDRdOworICAqcCsrID0gaGV4dGFiW2NoZWNrc3VtICYgMHhmXTsKKyAgKnArKyA9ICdccic7CisKKyAgKm1heHJlY3NpemUgPSBwIC0gc3JlYzsKKyAgcmV0dXJuIHBheWxvYWRfc2l6ZTsKK30KZGlmZiAtLWdpdCBhL2dkYi9kc3QuaCBiL2dkYi9kc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTJhM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2RzdC5oCkBAIC0wLDAgKzEsMTY1OSBAQAorLyogPGFwb2xsby9kc3QuaD4gKi8KKy8qIEFwb2xsbyBvYmplY3QgbW9kdWxlIERTVCAoZGVidWcgc3ltYm9sIHRhYmxlKSBkZXNjcmlwdGlvbiAqLworCisjaWZuZGVmIGFwb2xsb19kc3RfaAorI2RlZmluZSBhcG9sbG9fZHN0X2ggCisKKyNpZiBkZWZpbmVkKGFwb2xsbykgJiYgIWRlZmluZWQoX19HTlVDX18pCisjZGVmaW5lIEFMSUdORUQxICBfX2F0dHJpYnV0ZSggKGFsaWduZWQoMSkpICkKKyNlbHNlCisvKiBSZW1vdmUgYXR0cmlidXRlIGRpcmVjdGl2ZXMgZnJvbSBub24tQXBvbGxvIGNvZGU6ICovCisjZGVmaW5lIEFMSUdORUQxICAgLyogbmlsICovCisjZW5kaWYKKworCisKKy8qIElkZW50aWZpY2F0aW9uIG9mIHRoaXMgdmVyc2lvbiBvZiB0aGUgZGVidWcgc3ltYm9sIHRhYmxlLiAgUHJvZHVjZXJzIG9mIHRoZQorICAgZGVidWcgc3ltYm9sIHRhYmxlIG11c3Qgd3JpdGUgdGhlc2UgdmFsdWVzIGludG8gdGhlIHZlcnNpb24gbnVtYmVyIGZpZWxkIG9mCisgICB0aGUgY29tcGlsYXRpb24gdW5pdCByZWNvcmQgaW4gLmJsb2NrcyAuCisqLworI2RlZmluZSBkc3RfdmVyc2lvbl9tYWpvciAgICAxICAgIAorI2RlZmluZSBkc3RfdmVyc2lvbl9taW5vciAgICAzICAgIAorCisKKy8qCisqKiBFbnVtZXJhdGlvbiBvZiBkZWJ1ZyByZWNvcmQgdHlwZXMgYXBwZWFyaW5nIGluIC5ibG9ja3MgYW5kIC5zeW1ib2xzIC4uLgorKi8KK3R5cGVkZWYgZW51bQorICAgIHsKKyAgICBkc3RfdHlwX3BhZCwgICAgICAgICAgICAgICAgICAgLyogIDAgKi8KKyAgICBkc3RfdHlwX2NvbXBfdW5pdCwgICAgICAgICAgICAgLyogIDEgKi8KKyAgICBkc3RfdHlwX3NlY3Rpb25fdGFiLCAgICAgICAgICAgLyogIDIgKi8KKyAgICBkc3RfdHlwX2ZpbGVfdGFiLCAgICAgICAgICAgICAgLyogIDMgKi8KKyAgICBkc3RfdHlwX2Jsb2NrLCAgICAgICAgICAgICAgICAgLyogIDQgKi8KKyAgICBkc3RfdHlwXzUsCisgICAgZHN0X3R5cF92YXIsCisgICAgZHN0X3R5cF9wb2ludGVyLCAgICAgICAgICAgICAgIC8qICA3ICovCisgICAgZHN0X3R5cF9hcnJheSwgICAgICAgICAgICAgICAgIC8qICA4ICovCisgICAgZHN0X3R5cF9zdWJyYW5nZSwgICAgICAgICAgICAgIC8qICA5ICovCisgICAgZHN0X3R5cF9zZXQsICAgICAgICAgICAgICAgICAgIC8qIDEwICovCisgICAgZHN0X3R5cF9pbXBsaWNpdF9lbnVtLCAgICAgICAgIC8qIDExICovCisgICAgZHN0X3R5cF9leHBsaWNpdF9lbnVtLCAgICAgICAgIC8qIDEyICovCisgICAgZHN0X3R5cF9zaG9ydF9yZWMsICAgICAgICAgICAgIC8qIDEzICovCisgICAgZHN0X3R5cF9vbGRfcmVjb3JkLAorICAgIGRzdF90eXBfc2hvcnRfdW5pb24sICAgICAgICAgICAvKiAxNSAqLworICAgIGRzdF90eXBfb2xkX3VuaW9uLAorICAgIGRzdF90eXBfZmlsZSwgICAgICAgICAgICAgICAgICAvKiAxNyAqLworICAgIGRzdF90eXBfb2Zmc2V0LCAgICAgICAgICAgICAgICAvKiAxOCAqLworICAgIGRzdF90eXBfYWxpYXMsICAgICAgICAgICAgICAgICAvKiAxOSAqLworICAgIGRzdF90eXBfc2lnbmF0dXJlLCAgICAgICAgICAgICAvKiAyMCAqLworICAgIGRzdF90eXBfMjEsCisgICAgZHN0X3R5cF9vbGRfbGFiZWwsCQkgICAvKiAyMiAqLworICAgIGRzdF90eXBfc2NvcGUsCQkgICAvKiAyMyAqLworICAgIGRzdF90eXBfZW5kX3Njb3BlLCAgICAgICAgICAgICAvKiAyNCAqLworICAgIGRzdF90eXBfMjUsCisgICAgZHN0X3R5cF8yNiwKKyAgICBkc3RfdHlwX3N0cmluZ190YWIsICAgICAgICAgICAgLyogMjcgKi8KKyAgICBkc3RfdHlwX2dsb2JhbF9uYW1lX3RhYiwgICAgICAgLyogMjggKi8KKyAgICBkc3RfdHlwX2ZvcndhcmQsICAgICAgICAgICAgICAgLyogMjkgKi8KKyAgICBkc3RfdHlwX2F1eF9zaXplLCAgICAgICAgICAgICAgLyogMzAgKi8KKyAgICBkc3RfdHlwX2F1eF9hbGlnbiwgICAgICAgICAgICAgLyogMzEgKi8KKyAgICBkc3RfdHlwX2F1eF9maWVsZF9zaXplLCAgICAgICAgLyogMzIgKi8KKyAgICBkc3RfdHlwX2F1eF9maWVsZF9vZmYsICAgICAgICAgLyogMzMgKi8KKyAgICBkc3RfdHlwX2F1eF9maWVsZF9hbGlnbiwgICAgICAgLyogMzQgKi8KKyAgICBkc3RfdHlwX2F1eF9xdWFsLCAgICAgICAgICAgICAgLyogMzUgKi8KKyAgICBkc3RfdHlwX2F1eF92YXJfYm91bmQsICAgICAgICAgLyogMzYgKi8KKyAgICBkc3RfdHlwX2V4dGVuc2lvbiwgICAgICAgICAgICAgLyogMzcgKi8KKyAgICBkc3RfdHlwX3N0cmluZywgICAgICAgICAgICAgICAgLyogMzggKi8KKyAgICBkc3RfdHlwX29sZF9lbnRyeSwKKyAgICBkc3RfdHlwX2NvbnN0LCAgICAgICAgICAgICAgICAgLyogNDAgKi8KKyAgICBkc3RfdHlwX3JlZmVyZW5jZSwgICAgICAgICAgICAgLyogNDEgKi8KKyAgICBkc3RfdHlwX3JlY29yZCwgICAgICAgICAgICAgICAgLyogNDIgKi8KKyAgICBkc3RfdHlwX3VuaW9uLCAgICAgICAgICAgICAgICAgLyogNDMgKi8KKyAgICBkc3RfdHlwX2F1eF90eXBlX2Rlcml2LCAgICAgICAgLyogNDQgKi8KKyAgICBkc3RfdHlwX2xvY3Bvb2wsICAgICAgICAgICAgICAgLyogNDUgKi8KKyAgICBkc3RfdHlwX3ZhcmlhYmxlLCAgICAgICAgICAgICAgLyogNDYgKi8KKyAgICBkc3RfdHlwX2xhYmVsLCAgICAgICAgICAgICAgICAgLyogNDcgKi8KKyAgICBkc3RfdHlwX2VudHJ5LCAgICAgICAgICAgICAgICAgLyogNDggKi8KKyAgICBkc3RfdHlwX2F1eF9saWZldGltZSwgICAgICAgICAgLyogNDkgKi8KKyAgICBkc3RfdHlwX2F1eF9wdHJfYmFzZSwgICAgICAgICAgLyogNTAgKi8KKyAgICBkc3RfdHlwX2F1eF9zcmNfcmFuZ2UsICAgICAgICAgLyogNTEgKi8KKyAgICBkc3RfdHlwX2F1eF9yZWdfdmFsLCAgICAgICAgICAgLyogNTIgKi8KKyAgICBkc3RfdHlwX2F1eF91bml0X25hbWVzLCAgICAgICAgLyogNTMgKi8KKyAgICBkc3RfdHlwX2F1eF9zZWN0X2luZm8sICAgICAgICAgLyogNTQgKi8KKyAgICBkc3RfdHlwX0VORF9PRl9FTlVNCisgICAgfSAgICAKKyAgICBkc3RfcmVjX3R5cGVfdDsKKworCisvKgorKiogRHVtbXkgYm91bmRzIGZvciB2YXJpYWJseSBkaW1lbnNpb25lZCBhcnJheXM6CisqLworI2RlZmluZSBkc3RfZHVtbXlfYXJyYXlfc2l6ZSAgMTAwCisKKworLyoKKyoqIFJlZmVyZW5jZSB0byBhbm90aGVyIGl0ZW0gaW4gdGhlIHN5bWJvbCB0YWJsZS4KKyoqCisqKiBUaGUgdmFsdWUgb2YgYSBkc3RfcmVsX29mZnNldF90IGlzIHRoZSByZWxhdGl2ZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCisqKiByZWZlcmVuY2luZyByZWNvcmQgdG8gdGhlIHN0YXJ0IG9mIHRoZSByZWZlcmVuY2VkIHJlY29yZCwgc3RyaW5nLCBldGMuIAorKioKKyoqIFRoZSB2YWx1ZSBvZiBhIE5JTCBkc3RfcmVsX29mZnNldF90IGlzIHplcm8uCisqLworCit0eXBlZGVmIGxvbmcgZHN0X3JlbF9vZmZzZXRfdCAgQUxJR05FRDE7CisKKworLyogRklYTUU6IEhlcmUgYW5kIG1hbnkgcGxhY2VzIHdlIG1ha2UgYXNzdW1wdGlvbnMgYWJvdXQgc2l6ZXMgb2YgaG9zdAorICAgZGF0YSB0eXBlcywgc3RydWN0dXJlIGxheW91dCwgZXRjLiAgT25seSBuZWVkcyB0byBiZSBmaXhlZCBpZiB3ZSBjYXJlCisgICBhYm91dCBjcm9zcy1kZWJ1Z2dpbmcsIHRob3VnaC4gICovCisKKy8qCisqKiBTZWN0aW9uLXJlbGF0aXZlIHJlZmVyZW5jZS4gCisqKgorKiogVGhlIHNlY3Rpb24gaW5kZXggZmllbGQgaXMgYW4gaW5kZXggaW50byB0aGUgbG9jYWwgY29tcGlsYXRpb24gdW5pdCdzCisqKiBzZWN0aW9uIHRhYmxlIChzZWUgZHN0X3JlY19zZWN0aW9uX3RhYl90KS0tTk9UIGludG8gdGhlIG9iamVjdCBtb2R1bGUKKyoqIHNlY3Rpb24gdGFibGUhCisqKgorKiogVGhlIHNlY3Rfb2Zmc2V0IGZpZWxkIGlzIHRoZSBvZmZzZXQgaW4gYnl0ZXMgaW50byB0aGUgc2VjdGlvbi4KKyoqCisqKiBBIE5JTCBkc3Rfc2VjdF9yZWZfdCBoYXMgYSBzZWN0X2luZGV4IGZpZWxkIG9mIHplcm8uICBJbmRleGVzIG9yaWdpbmF0ZQorKiogYXQgb25lLgorKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgdW5zaWduZWQgc2hvcnQgIHNlY3RfaW5kZXg7CisgICAgdW5zaWduZWQgbG9uZyAgIHNlY3Rfb2Zmc2V0IEFMSUdORUQxOworICAgIH0KKyAgICBkc3Rfc2VjdF9yZWZfdDsKKworI2RlZmluZSBkc3Rfc2VjdF9pbmRleF9uaWwgICAgMAorI2RlZmluZSBkc3Rfc2VjdF9pbmRleF9vcmlnaW4gMQorCisKKy8qCisqKiBTb3VyY2UgbG9jYXRpb24gZGVzY3JpcHRvci4KKyoqCisqKiBUaGUgZmlsZV9pbmRleCBmaWVsZCBpcyBhbiBpbmRleCBpbnRvIHRoZSBsb2NhbCBjb21waWxhdGlvbiB1bml0J3MKKyoqIGZpbGUgdGFibGUgKHNlZSBkc3RfcmVjX2ZpbGVfdGFiX3QpLgorKioKKyoqIEEgTklMIGRzdF9zcmNfbG9jX3QgaGFzIGEgZmlsZV9pbmRleCBmaWVsZCBvZiB6ZXJvLiAgSW5kZXhlcyBvcmlnaW5hdGUKKyoqIGF0IG9uZS4KKyovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIGJvb2xlYW4gIHJlc2VydmVkICAgIDogIDE7ICAvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworICAgIGludCAgICAgIGZpbGVfaW5kZXggIDogMTE7ICAvKiBpbmRleCBpbnRvIC5ibG9ja3Mgc291cmNlIGZpbGUgbGlzdCAqLworICAgIGludCAgICAgIGxpbmVfbnVtYmVyIDogMjA7ICAvKiBzb3VyY2UgbGluZSBudW1iZXIgKi8KKyAgICB9CisgICAgZHN0X3NyY19sb2NfdDsKKworI2RlZmluZSBkc3RfZmlsZV9pbmRleF9uaWwgICAgMAorI2RlZmluZSBkc3RfZmlsZV9pbmRleF9vcmlnaW4gMQorCisKKy8qCisqKiBTdGFuZGFyZCAocHJpbWl0aXZlKSB0eXBlIGNvZGVzLgorKi8KKwordHlwZWRlZiBlbnVtCisgICAgeworICAgIGRzdF9ub25fc3RkX3R5cGUsCisgICAgZHN0X2ludDhfdHlwZSwgICAgICAgICAvKiA4IGJpdCBpbnRlZ2VyICovCisgICAgZHN0X2ludDE2X3R5cGUsICAgICAgICAvKiAxNiBiaXQgaW50ZWdlciAqLworICAgIGRzdF9pbnQzMl90eXBlLCAgICAgICAgLyogMzIgYml0IGludGVnZXIgKi8KKyAgICBkc3RfdWludDhfdHlwZSwgICAgICAgIC8qIDggYml0IHVuc2lnbmVkIGludGVnZXIgKi8KKyAgICBkc3RfdWludDE2X3R5cGUsICAgICAgIC8qIDE2IGJpdCB1bnNpZ25lZCBpbnRlZ2VyICovCisgICAgZHN0X3VpbnQzMl90eXBlLCAgICAgICAvKiAzMiBiaXQgdW5zaWduZWQgaW50ZWdlciAqLworICAgIGRzdF9yZWFsMzJfdHlwZSwgICAgICAgLyogc2luZ2xlIHByZWNpc2lvbiBpZWVlIGZsb2F0aW5pbmcgcG9pbnQgKi8KKyAgICBkc3RfcmVhbDY0X3R5cGUsICAgICAgIC8qIGRvdWJsZSBwcmVjaXNpb24gaWVlZSBmbG9hdGluaW5nIHBvaW50ICovCisgICAgZHN0X2NvbXBsZXhfdHlwZSwgICAgICAvKiBzaW5nbGUgcHJlY2lzaW9uIGNvbXBsZXggKi8gICAgCisgICAgZHN0X2Rjb21wbGV4X3R5cGUsICAgICAvKiBkb3VibGUgcHJlY2lzaW9uIGNvbXBsZXggKi8KKyAgICBkc3RfYm9vbDhfdHlwZSwgICAgICAgIC8qIGJvb2xlYW4gPWxvZ2ljYWwqMSAqLworICAgIGRzdF9ib29sMTZfdHlwZSwgICAgICAgLyogYm9vbGVhbiA9bG9naWNhbCoyICovCisgICAgZHN0X2Jvb2wzMl90eXBlLCAgICAgICAvKiBib29sZWFuID1sb2dpY2FsKjQgKi8KKyAgICBkc3RfY2hhcl90eXBlLCAgICAgICAgIC8qIDggYml0IGFzY2lpIGNoYXJhY3RlciAqLworICAgIGRzdF9zdHJpbmdfdHlwZSwgICAgICAgLyogc3RyaW5nIG9mIDggYml0IGFzY2lpIGNoYXJhY3RlcnMgKi8KKyAgICBkc3RfcHRyX3R5cGUsICAgICAgICAgIC8qIHVuaXZfcG9pbnRlciAqLworICAgIGRzdF9zZXRfdHlwZSwgICAgICAgICAgLyogZ2VuZXJpYyAyNTYgYml0IHNldCAqLworICAgIGRzdF9wcm9jX3R5cGUsICAgICAgICAgLyogZ2VuZXJpYyBwcm9jZWR1cmUgKHNpZ25hdHVyZSBub3Qgc3BlY2lmaWVkKSAqLworICAgIGRzdF9mdW5jX3R5cGUsICAgICAgICAgLyogZ2VuZXJpYyBmdW5jdGlvbiAoc2lnbmF0dXJlIG5vdCBzcGVjaWZpZWQpICovCisgICAgZHN0X3ZvaWRfdHlwZSwgICAgICAgICAvKiBjIHZvaWQgdHlwZSAqLworICAgIGRzdF91Y2hhcl90eXBlLCAgICAgICAgLyogYyB1bnNpZ25lZCBjaGFyICovCisgICAgZHN0X3N0ZF90eXBlX0VORF9PRl9FTlVNCisgICAgfSAgICAKKyAgICBkc3Rfc3RkX3R5cGVfdDsKKworCisvKgorKiogR2VuZXJhbCBkYXRhIHR5cGUgZGVzY3JpcHRvcgorKioKKyoqIElmIHRoZSB1c2VyX2RlZmluZWRfdHlwZSBiaXQgaXMgY2xlYXIsIHRoZW4gdGhlIHR5cGUgaXMgYSBzdGFuZGFyZCB0eXBlLCBhbmQKKyoqIHRoZSByZW1haW5pbmcgYml0cyBjb250YWluIHRoZSBkc3Rfc3RkX3R5cGVfdCBvZiB0aGUgdHlwZS4gIElmIHRoZSBiaXQgaXMKKyoqIHNldCwgdGhlbiB0aGUgdHlwZSBpcyBkZWZpbmVkIGluIGEgc2VwYXJhdGUgZHN0IHJlY29yZCwgd2hpY2ggaXMgcmVmZXJlbmNlZAorKiogYnkgdGhlIHJlbWFpbmluZyBiaXRzIGFzIGEgZHN0X3JlbF9vZmZzZXRfdC4KKyovCisKK3R5cGVkZWYgdW5pb24KKyAgICB7CisgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgYm9vbGVhbiAgICAgICAgIHVzZXJfZGVmaW5lZF90eXBlIDogIDE7ICAvKiB0YWcgZmllbGQgKi8KKyAgICAgICAgaW50ICAgICAgICAgICAgIG11c3RfYmVfemVybyAgICAgIDogMjM7ICAvKiAyMyBiaXRzIG9mIHBhZCAqLworICAgICAgICBkc3Rfc3RkX3R5cGVfdCAgZHRjICAgICAgICAgICAgICAgOiAgODsgIC8qIDggYml0IHByaW1pdGl2ZSBkYXRhICovCisgICAgICAgIH0KKyAgICAgICAgc3RkX3R5cGU7CisgICAKKyAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICBib29sZWFuICAgICAgICAgdXNlcl9kZWZpbmVkX3R5cGUgOiAgMTsgIC8qIHRhZyBmaWVsZCAqLworICAgICAgICBpbnQgICAgICAgICAgICAgZG9mZnNldCAgICAgICAgICAgOiAzMTsgIC8qIG9mZnNldCB0byB0eXBlIHJlY29yZCAqLworICAgICAgICB9CisgICAgICAgIHVzZXJfdHlwZTsKKyAgICB9CisgICAgZHN0X3R5cGVfdCBBTElHTkVEMTsKKworLyogVGhlIHVzZXJfdHlwZS5kb2Zmc2V0IGZpZWxkIGlzIGEgMzEtYml0IHNpZ25lZCB2YWx1ZS4gIFNvbWUgdmVyc2lvbnMgb2YgQworICAgZG8gbm90IHN1cHBvcnQgc2lnbmVkIGJpdCBmaWVsZHMuICBUaGUgZm9sbG93aW5nIG1hY3JvIHdpbGwgZXh0cmFjdCB0aGF0CisgICBmaWVsZCBhcyBhIHNpZ25lZCB2YWx1ZToKKyovCisjZGVmaW5lIGRzdF91c2VyX3R5cGVfb2Zmc2V0KHR5cGVfcmVjKSBcCisgICAgKCAoKGludCkgKCh0eXBlX3JlYykudXNlcl90eXBlLmRvZmZzZXQgPDwgMSkpID4+IDEgKQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qPT09PT09PT09PSBSRUNPUkRTIElOIC5ibG9ja3MgU0VDVElPTiA9PT09PT09PT09Ki8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBDT01QSUxBVElPTiBVTklUIHJlY29yZCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgVGhpcyBtdXN0IGJlIHRoZSBmaXJzdCByZWNvcmQgaW4gZWFjaCAuYmxvY2tzIHNlY3Rpb24uCisgIFByb3ZpZGVzIGEgc2V0IG9mIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhlIG91dHB1dCBvZiBhIHNpbmdsZSBjb21waWxhdGlvbgorICBhbmQgcG9pbnRlcnMgdG8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCisqLworCit0eXBlZGVmIGVudW0KKyAgICB7IAorICAgIGRzdF9wY19jb2RlX2xvY3MsICAgICAgICAgIC8qIHJhbmdlcyBpbiBsb2Mgc3RyaW5ncyBhcmUgcGMgcmFuZ2VzICovCisgICAgZHN0X2NvbXBfdW5pdF9FTkRfT0ZfRU5VTQorICAgIH0gICAgCisgICAgZHN0X2NvbXBfdW5pdF9mbGFnX3Q7CisKK3R5cGVkZWYgZW51bQorICAgIHsKKyAgICBkc3RfbGFuZ191bmssICAgICAgICAgIC8qIHVua25vd24gbGFuZ3VhZ2UgKi8KKyAgICBkc3RfbGFuZ19wYXMsICAgICAgICAgIC8qIFBhc2NhbCAqLworICAgIGRzdF9sYW5nX2Z0biwgICAgICAgICAgLyogRk9SVFJBTiAqLworICAgIGRzdF9sYW5nX2MsICAgICAgICAgICAgLyogQyAqLworICAgIGRzdF9sYW5nX21vZDIsICAgICAgICAgLyogTW9kdWxhLTIgKi8KKyAgICBkc3RfbGFuZ19hc21fbTY4aywgICAgIC8qIDY4SyBhc3NlbWJseSBsYW5ndWFnZSAqLworICAgIGRzdF9sYW5nX2FzbV9hODhrLCAgICAgLyogQVQgYXNzZW1ibHkgbGFuZ3VhZ2UgKi8KKyAgICBkc3RfbGFuZ19hZGEsICAgICAgICAgIC8qIEFkYSAqLworICAgIGRzdF9sYW5nX2N4eCwgICAgICAgICAgLyogQysrICovCisgICAgZHN0X2xhbmdfRU5EX09GX0VOVU0KKyAgICB9ICAgIAorICAgIGRzdF9sYW5nX3R5cGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBtYWpvcl9wYXJ0OyAgICAgICAgIC8qID0gZHN0X3ZlcnNpb25fbWFqb3IgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciBtaW5vcl9wYXJ0OyAgICAgICAgIC8qID0gZHN0X3ZlcnNpb25fbWlub3IgKi8KKyAgICAgICAgfSAgICAgICAgICAgCisgICAgICAgIHZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXJzaW9uIG9mIGRzdCAqLworICAgIHVuc2lnbmVkIHNob3J0ICAgIGZsYWdzOyAgICAgICAgICAgICAgLyogbWFzayBvZiBkc3RfY29tcF91bml0X2ZsYWdfdCAqLworICAgIHVuc2lnbmVkIHNob3J0ICAgbGFuZ190eXBlOyAgICAgICAgICAvKiBzb3VyY2UgbGFuZ3VhZ2UgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCAgICBudW1iZXJfb2ZfYmxvY2tzOyAgIC8qIG51bWJlciBvZiBibG9ja3MgcmVjb3JkcyAqLworICAgIGRzdF9yZWxfb2Zmc2V0X3QgIHJvb3RfYmxvY2tfb2Zmc2V0OyAgLyogb2Zmc2V0IHRvIHJvb3QgYmxvY2sgKG1vZHVsZT8pICovCisgICAgZHN0X3JlbF9vZmZzZXRfdCAgc2VjdGlvbl90YWJsZSAgICAgICAvKiBvZmZzZXQgdG8gc2VjdGlvbiB0YWJsZSByZWNvcmQgKi87CisgICAgZHN0X3JlbF9vZmZzZXRfdCAgZmlsZV90YWJsZTsgICAgICAgICAvKiBvZmZzZXQgdG8gZmlsZSB0YWJsZSByZWNvcmQgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgICBkYXRhX3NpemU7ICAgICAgICAgIC8qIHRvdGFsIHNpemUgb2YgLmJsb2NrcyBkYXRhICovCisgICAgfQorICAgIGRzdF9yZWNfY29tcF91bml0X3QgQUxJR05FRDE7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLQorICBTRUNUSU9OIFRBQkxFIHJlY29yZAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICBUaGVyZSBtdXN0IGJlIG9uZSBzZWN0aW9uIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGNvbXBpbGF0aW9uIHVuaXQuCisgIE90aGVyIGRlYnVnIHJlY29yZHMgcmVmZXIgdG8gc2VjdGlvbnMgdmlhIHRoZWlyIGluZGV4IGluIHRoaXMgdGFibGUuICBUaGUKKyAgc2VjdGlvbiBiYXNlIGFkZHJlc3NlcyBpbiB0aGUgdGFibGUgYXJlIHZpcnR1YWwgYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucywKKyAgcmVsb2NhdGVkIGJ5IHRoZSBsaW5rZXIuCisqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCAgbnVtYmVyX29mX3NlY3Rpb25zOyAgIC8qIHNpemUgb2YgYXJyYXk6ICovICAgIAorICAgIHVuc2lnbmVkIGxvbmcgICBzZWN0aW9uX2Jhc2VbZHN0X2R1bW15X2FycmF5X3NpemVdIEFMSUdORUQxOworICAgIH0KKyAgICBkc3RfcmVjX3NlY3Rpb25fdGFiX3QgQUxJR05FRDE7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLQorICBGSUxFIFRBQkxFIHJlY29yZAorICAtLS0tLS0tLS0tLS0tLS0tLQorICBUaGVyZSBtdXN0IGJlIG9uZSBmaWxlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGNvbXBpbGF0aW9uIHVuaXQgZGVzY3JpYmluZworICB0aGUgc291cmNlIChhbmQgaW5jbHVkZSkgZmlsZXMgdXNlZCBieSBlYWNoIGNvbXBpbGF0aW9uIHVuaXQuICBPdGhlciBkZWJ1ZyAKKyAgcmVjb3JkcyByZWZlciB0byBmaWxlcyB2aWEgdGhlaXIgaW5kZXggaW4gdGhpcyB0YWJsZS4gIFRoZSBmaXJzdCBlbnRyeSBpcyB0aGUKKyAgcHJpbWFyeSBzb3VyY2UgZmlsZS4KKyovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIGxvbmcgICAgICAgICAgICAgIGR0bTsgICAgICAgIC8qIHRpbWUgbGFzdCBtb2RpZmllZCAodGltZV8kY2xvY2tfdCkgKi8KKyAgICBkc3RfcmVsX29mZnNldF90ICBub2Zmc2V0OyAgICAvKiBvZmZzZXQgdG8gbmFtZSBzdHJpbmcgZm9yIHNvdXJjZSBmaWxlICovCisgICAgfQorICAgIGRzdF9maWxlX2Rlc2NfdDsKKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgdW5zaWduZWQgc2hvcnQgICBudW1iZXJfb2ZfZmlsZXM7ICAgIC8qIHNpemUgb2YgYXJyYXk6ICovCisgICAgZHN0X2ZpbGVfZGVzY190ICBmaWxlc1tkc3RfZHVtbXlfYXJyYXlfc2l6ZV0gQUxJR05FRDE7CisgICAgfQorICAgIGRzdF9yZWNfZmlsZV90YWJfdCBBTElHTkVEMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tCisgIE5BTUUgVEFCTEUgcmVjb3JkCisgIC0tLS0tLS0tLS0tLS0tLS0tCisgIEEgbmFtZSB0YWJsZSByZWNvcmQgbWF5IGFwcGVhciBhcyBhbiBhdXhpbGlhcnkgcmVjb3JkIHRvIHRoZSBmaWxlIHRhYmxlLAorICBwcm92aWRpbmcgYWRkaXRpb25hbCBxdWFsaWZpY2F0aW9uIG9mIHRoZSBmaWxlIGluZGV4ZXMgZm9yIGxhbmd1YWdlcyB0aGF0IAorICBuZWVkIGl0IChpLmUuIEFkYSkuICBOYW1lIHRhYmxlIGVudHJpZXMgcGFyYWxsZWwgZmlsZSB0YWJsZSBlbnRyaWVzIG9mIHRoZQorICBzYW1lIGZpbGUgaW5kZXguCisqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCAgICBudW1iZXJfb2ZfbmFtZXM7ICAgIC8qIHNpemUgb2YgYXJyYXk6ICovCisgICAgZHN0X3JlbF9vZmZzZXRfdCAgbmFtZXNbZHN0X2R1bW15X2FycmF5X3NpemVdIEFMSUdORUQxOworICAgIH0KKyAgICBkc3RfcmVjX25hbWVfdGFiX3QgQUxJR05FRDE7CisKKworLyotLS0tLS0tLS0tLS0tLQorICBCTE9DSyByZWNvcmQKKyAgLS0tLS0tLS0tLS0tLS0KKyAgRGVzY3JpYmVzIGEgbGV4aWNhbCBwcm9ncmFtIGJsb2NrLS1hIHByb2NlZHVyZSwgZnVuY3Rpb24sIG1vZHVsZSwgZXRjLgorKi8KKworLyogQmxvY2sgdHlwZXMuICBUaGVzZSBtYXkgYmUgdXNlZCBpbiBhbnkgd2F5IGRlc2lyZWQgYnkgdGhlIGNvbXBpbGVyIHdyaXRlcnMuIAorICAgVGhlIGRlYnVnZ2VyIHVzZXMgdGhlbSBvbmx5IHRvIGdpdmUgYSBkZXNjcmlwdGlvbiB0byB0aGUgdXNlciBvZiB0aGUgdHlwZSBvZgorICAgYSBibG9jay4gIFRoZSBkZWJ1Z2dlciBtYWtlcyBubyBvdGhlciBhc3N1bXB0aW9ucyBhYm91dCB0aGUgbWVhbmluZyBvZiBhbnkKKyAgIG9mIHRoZXNlLiAgRm9yIGV4YW1wbGUsIHRoZSBmYWN0IHRoYXQgYSBibG9jayBpcyBleGVjdXRhYmxlIChlLmcuLCBwcm9ncmFtKQorICAgb3Igbm90IChlLmcuLCBtb2R1bGUpIGlzIGV4cHJlc3NlZCBpbiBibG9jayBhdHRyaWJ1dGVzIChzZWUgYmVsb3cpLCBub3QKKyAgIGd1ZXNzZWQgYXQgZnJvbSB0aGUgYmxvY2sgdHlwZS4KKyovICAgIAordHlwZWRlZiBlbnVtCisgICAgeworICAgIGRzdF9ibG9ja19tb2R1bGUsICAgICAgICAgIC8qIHNvbWUgcGFzY2FsID0gbW9kdWxhID0gYWRhIHR5cGVzICovCisgICAgZHN0X2Jsb2NrX3Byb2dyYW0sICAgICAgICAgCisgICAgZHN0X2Jsb2NrX3Byb2NlZHVyZSwgICAgICAKKyAgICBkc3RfYmxvY2tfZnVuY3Rpb24sICAgICAgICAvKiBDIGZ1bmN0aW9uICovCisgICAgZHN0X2Jsb2NrX3N1YnJvdXRpbmUsICAgICAgLyogc29tZSBmb3J0cmFuIGJsb2NrIHR5cGVzICovCisgICAgZHN0X2Jsb2NrX2Jsb2NrX2RhdGEsICAgICAgCisgICAgZHN0X2Jsb2NrX3N0bXRfZnVuY3Rpb24sICAKKyAgICBkc3RfYmxvY2tfcGFja2FnZSwgICAgICAgICAvKiBhIGZldyBwYXJ0aWN1bGFyIHRvIEFkYSAqLworICAgIGRzdF9ibG9ja19wYWNrYWdlX2JvZHksICAKKyAgICBkc3RfYmxvY2tfc3VidW5pdCwgICAgICAgIAorICAgIGRzdF9ibG9ja190YXNrLCAgICAgICAgICAgIAorICAgIGRzdF9ibG9ja19maWxlLCAgICAgICAgICAgIC8qIGEgQyBvdXRlciBzY29wZT8gKi8KKyAgICBkc3RfYmxvY2tfY2xhc3MsICAgICAgICAgICAvKiBDKysgb3IgU2ltdWxhICovCisgICAgZHN0X2Jsb2NrX0VORF9PRl9FTlVNCisgICAgfSAgICAKKyAgICBkc3RfYmxvY2tfdHlwZV90OworCisvKiBCbG9jayBhdHRyaWJ1dGVzLiAgVGhpcyBpcyB0aGUgaW5mb3JtYXRpb24gdXNlZCBieSB0aGUgZGVidWdnZXIgdG8gcmVwcmVzZW50CisgICB0aGUgc2VtYW50aWNzIG9mIGJsb2Nrcy4KKyovCit0eXBlZGVmIGVudW0KKyAgICB7CisgICAgZHN0X2Jsb2NrX21haW5fZW50cnksICAgICAgLyogdGhlIGJsb2NrJ3MgZW50cnkgcG9pbnQgaXMgYSBtYWluIGVudHJ5IGludG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdCAqLyAgICAKKyAgICBkc3RfYmxvY2tfZXhlY3V0YWJsZSwgICAgICAvKiB0aGUgYmxvY2sgaGFzIGFuIGVudHJ5IHBvaW50ICovCisgICAgZHN0X2Jsb2NrX2F0dHJfRU5EX09GX0VOVU0KKyAgICB9ICAgIAorICAgIGRzdF9ibG9ja19hdHRyX3Q7CisKKy8qIENvZGUgcmFuZ2UuICBFYWNoIGJsb2NrIGhhcyBhc3NvY2lhdGVkIHdpdGggaXQgb25lIG9yIG1vcmUgY29kZSByYW5nZXMuIEFuCisgICBpbmRpdmlkdWFsIGNvZGUgcmFuZ2UgaXMgaWRlbnRpZmllZCBieSBhIHJhbmdlIG9mIHNvdXJjZSAocG9zc2libHkgbmlsKSBhbmQKKyAgIGEgcmFuZ2Ugb2YgZXhlY3V0YWJsZSBjb2RlLiAgRm9yIGV4YW1wbGUsIGEgYmxvY2sgd2hpY2ggaGFzIGl0cyBleGVjdXRhYmxlCisgICBjb2RlIHNwcmVhZCBvdmVyIG11bHRpcGxlIHNlY3Rpb25zIHdpbGwgaGF2ZSBvbmUgY29kZSByYW5nZSBwZXIgc2VjdGlvbi4KKyovCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICB1bnNpZ25lZCBsb25nICAgY29kZV9zaXplOyAgICAgIC8qIHNpemUgb2YgZXhlY3V0YWJsZSBjb2RlIChpbiBieXRlcyApICovCisgICAgZHN0X3NlY3RfcmVmX3QgIGNvZGVfc3RhcnQ7ICAgICAvKiBzdGFydGluZyBhZGRyZXNzIG9mIGV4ZWN1dGFibGUgY29kZSAqLworICAgIGRzdF9zZWN0X3JlZl90ICBsaW5lc19zdGFydDsgICAgLyogc3RhcnQgb2YgbGluZSBudW1iZXIgdGFibGVzICovCisgICAgfQorICAgIGRzdF9jb2RlX3JhbmdlX3Q7CisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIGRzdF9ibG9ja190eXBlX3QgIGJsb2NrX3R5cGUgOiA4OyAKKyAgICB1bnNpZ25lZCBzaG9ydCAgICBmbGFncyAgICAgIDogODsgICAgICAgLyogbWFzayBvZiBkc3RfYmxvY2tfYXR0cl90IGZsYWdzICovCisgICAgZHN0X3JlbF9vZmZzZXRfdCAgc2libGluZ19ibG9ja19vZmY7ICAgIC8qIG9mZnNldCB0byBuZXh0IHNpYmxpbmcgYmxvY2sgKi8KKyAgICBkc3RfcmVsX29mZnNldF90ICBjaGlsZF9ibG9ja19vZmY7ICAgICAgLyogb2Zmc2V0IHRvIGZpcnN0IGNvbnRhaW5lZCBibG9jayAqLworICAgIGRzdF9yZWxfb2Zmc2V0X3QgIG5vZmZzZXQ7ICAgICAgICAgICAgICAvKiBvZmZzZXQgdG8gYmxvY2sgbmFtZSBzdHJpbmcgKi8gICAgCisgICAgZHN0X3NlY3RfcmVmX3QgICAgc3ltYm9sc19zdGFydDsgICAgICAgIC8qIHN0YXJ0IG9mIGRlYnVnIHN5bWJvbHMgICovCisgICAgdW5zaWduZWQgc2hvcnQgICAgbl9vZl9jb2RlX3JhbmdlczsgICAgIC8qIHNpemUgb2YgYXJyYXkuLi4gKi8KKyAgICBkc3RfY29kZV9yYW5nZV90ICBjb2RlX3Jhbmdlc1tkc3RfZHVtbXlfYXJyYXlfc2l6ZV0gQUxJR05FRDE7CisgICAgfQorICAgIGRzdF9yZWNfYmxvY2tfdCBBTElHTkVEMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEFVWCBTRUNUIElORk8gVEFCTEUgcmVjb3JkCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEFwcGVhcnMgYXMgYW4gYXV4aWxpYXJ5IHRvIGEgYmxvY2sgcmVjb3JkLiAgRXhwYW5kcyBjb2RlIHJhbmdlIGluZm9ybWF0aW9uCisgIGJ5IHByb3ZpZGluZyByZWZlcmVuY2VzIGludG8gYWRkaXRpb25hbCwgbGFuZ3VhZ2UtZGVwZW5kZW50IHNlY3Rpb25zIGZvciAKKyAgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBzcGVjaWZpYyBjb2RlIHJhbmdlcyBvZiB0aGUgYmxvY2suICBTZWN0IGluZm8gdGFibGUKKyAgZW50cmllcyBwYXJhbGxlbCBjb2RlIHJhbmdlIGFycmF5IGVudHJpZXMgb2YgdGhlIHNhbWUgaW5kZXguCisqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICB1bnNpZ25lZCBjaGFyICAgIHRhZzsgICAgICAgICAgICAgICAvKiBjdXJyZW50bHkgY2FuIG9ubHkgYmUgemVybyAqLworICAgIHVuc2lnbmVkIGNoYXIgICAgbnVtYmVyX29mX3JlZnM7ICAgIC8qIHNpemUgb2YgYXJyYXk6ICovCisgICAgZHN0X3NlY3RfcmVmX3QgICByZWZzW2RzdF9kdW1teV9hcnJheV9zaXplXSBBTElHTkVEMTsKKyAgICB9CisgICAgZHN0X3JlY19zZWN0X2luZm9fdGFiX3QgQUxJR05FRDE7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKj09PT09PT09PT0gUkVDT1JEUyBJTiAuc3ltYm9scyBTRUNUSU9OID09PT09PT09PT0qLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLQorICBDT05TVEFOVCByZWNvcmQKKyAgLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGVzY3JpYmVzIGEgc3ltYm9saWMgY29uc3RhbnQuCisqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBmbG9hdCAgICByOyAgICAgIC8qIHJlYWwgcGFydCAqLworICAgIGZsb2F0ICAgIGk7ICAgICAgLyogaW1hZ2luYXJ5IHBhcnQgKi8KKyAgICB9CisgICAgZHN0X2NvbXBsZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgZG91YmxlICAgIGRyOyAgICAgLyogcmVhbCBwYXJ0ICovCisgICAgZG91YmxlICAgIGRpOyAgICAgLyogaW1hZ2luYXJ5IHBhcnQgKi8KKyAgICB9CisgICAgZHN0X2RvdWJsZV9jb21wbGV4X3Q7CisKKy8qIFRoZSBmb2xsb3dpbmcgcmVjb3JkIHByb3ZpZGVzIGEgd2F5IG9mIGRlc2NyaWJpbmcgY29uc3RhbnQgdmFsdWVzIHdpdGggCisgICBub24tc3RhbmRhcmQgdHlwZSBhbmQgbm8gbGltaXQgb24gc2l6ZS4gCisqLwordHlwZWRlZiB1bmlvbgorICAgIHsKKyAgICBjaGFyICAgIGNoYXJfZGF0YVtkc3RfZHVtbXlfYXJyYXlfc2l6ZV07CisgICAgc2hvcnQgICBpbnRfZGF0YSBbZHN0X2R1bW15X2FycmF5X3NpemVdOworICAgIGxvbmcgICAgbG9uZ19kYXRhW2RzdF9kdW1teV9hcnJheV9zaXplXTsKKyAgICB9CisgICAgZHN0X2JpZ19rb25fdDsKKworLyogUmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIGEgZ2VuZXJhbCBjb25zdGFudC4KKyovCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgIGxlbmd0aDsgICAgIC8qIHNpemUgb2YgY29uc3RhbnQgdmFsdWUgKGJ5dGVzKSAqLworCisgICAgdW5pb24KKyAgICAgICAgeworICAgICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAga29uX2ludDg7CisgICAgICAgIHNob3J0ICAgICAgICAgICAgICAgICBrb25faW50MTY7CisgICAgICAgIGxvbmcgICAgICAgICAgICAgICAgICBrb25faW50MzIgICBBTElHTkVEMTsKKyAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgIGtvbl9yZWFsICAgIEFMSUdORUQxOworICAgICAgICBkb3VibGUgICAgICAgICAgICAgICAga29uX2RibCAgICAgQUxJR05FRDE7CisgICAgICAgIGRzdF9jb21wbGV4X3QgICAgICAgICBrb25fY3BseCAgICBBTElHTkVEMTsKKyAgICAgICAgZHN0X2RvdWJsZV9jb21wbGV4X3QgIGtvbl9kY3BseCAgIEFMSUdORUQxOworICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAga29uX2NoYXI7CisgICAgICAgIGRzdF9iaWdfa29uX3QgICAgICAgICBrb24gICAgICAgICBBTElHTkVEMTsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2YWx1ZSBkYXRhIG9mIGNvbnN0YW50ICovCisgICAgfQorICAgIGRzdF9jb25zdF90IEFMSUdORUQxOworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBkc3RfcmVsX29mZnNldF90ICAgbm9mZnNldDsgICAgICAgIC8qIG9mZnNldCB0byBuYW1lIHN0cmluZyAqLworICAgIGRzdF9zcmNfbG9jX3QgICAgICBzcmNfbG9jOyAgICAgICAgLyogZmlsZS9saW5lIG9mIGNvbnN0IGRlZmluaXRpb24gKi8KKyAgICBkc3RfdHlwZV90ICAgICAgICAgdHlwZV9kZXNjOyAgICAgIC8qIHR5cGUgb2YgdGhpcyAobWFuaWZlc3QpIGNvbnN0YW50ICovCisgICAgZHN0X2NvbnN0X3QgICAgICAgIHZhbHVlOyAKKyAgICB9CisgICAgZHN0X3JlY19jb25zdF90IEFMSUdORUQxOworCisvKi0tLS0tLS0tLS0tLS0tLS0KKyAgVkFSSUFCTEUgcmVjb3JkCisgIC0tLS0tLS0tLS0tLS0tLS0KKyAgRGVzY3JpYmVzIGEgcHJvZ3JhbSB2YXJpYWJsZS4KKyovCisKKy8qIFZhcmlhYmxlIGF0dHJpYnV0ZXMuICBUaGVzZSBkZWZpbmUgY2VydGFpbiB2YXJpYWJsZSBzZW1hbnRpY3MgdG8gdGhlCisgICBkZWJ1Z2dlci4KKyovCit0eXBlZGVmIGVudW0KKyAgICB7CisgICAgZHN0X3Zhcl9hdHRyX3JlYWRfb25seSwgICAgICAvKiBpcyByZWFkLW9ubHkgKGEgcHJvZ3JhbSBsaXRlcmFsKSAqLworICAgIGRzdF92YXJfYXR0cl92b2xhdGlsZSwgICAgICAgLyogc2FtZSBhcyBjb21waWxlcidzIFZPTEFUSUxFIGF0dHJpYnV0ZSAqLworICAgIGRzdF92YXJfYXR0cl9nbG9iYWwsICAgICAgICAgLyogaXMgYSBnbG9iYWwgZGVmaW5pdGlvbiBvciByZWZlcmVuY2UgKi8gICAgCisgICAgZHN0X3Zhcl9hdHRyX2NvbXBpbGVyX2dlbiwgICAvKiBpcyBjb21waWxlci1nZW5lcmF0ZWQgKi8KKyAgICBkc3RfdmFyX2F0dHJfc3RhdGljLCAgICAgICAgIC8qIGhhcyBzdGF0aWMgbG9jYXRpb24gKi8KKyAgICBkc3RfdmFyX2F0dHJfRU5EX09GX0VOVU0KKyAgICB9ICAgIAorICAgIGRzdF92YXJfYXR0cl90OworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBkc3RfcmVsX29mZnNldF90ICBub2Zmc2V0OyAgICAgICAvKiBvZmZzZXQgdG8gbmFtZSBzdHJpbmcgKi8KKyAgICBkc3RfcmVsX29mZnNldF90ICBsb2Zmc2V0OyAgICAgICAvKiBvZmZzZXQgdG8gbG9jIHN0cmluZyAqLworICAgIGRzdF9zcmNfbG9jX3QgICAgIHNyY19sb2M7ICAgICAgIC8qIGZpbGUvbGluZSBvZiB2YXJpYWJsZSBkZWZpbml0aW9uICovCisgICAgZHN0X3R5cGVfdCAgICAgICAgdHlwZV9kZXNjOyAgICAgLyogdHlwZSBkZXNjcmlwdG9yICovCisgICAgdW5zaWduZWQgc2hvcnQgICAgYXR0cmlidXRlczsgICAgLyogbWFzayBvZiBkc3RfdmFyX2F0dHJfdCBmbGFncyAqLworICAgIH0KKyAgICBkc3RfcmVjX3ZhcmlhYmxlX3QgQUxJR05FRDE7CisKKworLyotLS0tLS0tLS0tLS0tLS0tCisgIG9sZCBWQVIgcmVjb3JkCisgLS0tLS0tLS0tLS0tLS0tLS0KKyBVc2VkIGJ5IG9sZGVyIGNvbXBpbGVycyB0byBkZXNjcmliZSBhIHZhcmlhYmxlCisqLworCit0eXBlZGVmIGVudW0KKyAgICB7CisgICAgZHN0X3Zhcl9sb2NfdW5rbm93biwJLyogQWN0dWFsbHkgZGVmaW5lZCBhcyAidW5rbm93biIgKi8KKyAgICBkc3RfdmFyX2xvY19hYnMsCQkvKiBBYnNvbHV0ZSBhZGRyZXNzICovCisgICAgZHN0X3Zhcl9sb2Nfc2VjdF9vZmYsCS8qIEFic29sdXRlIGFkZHJlc3MgYXMgYSBzZWN0aW9uIG9mZnNldCAqLworICAgIGRzdF92YXJfbG9jX2luZF9zZWN0X29mZiwJLyogQW4gaW5kZXhlZCBzZWN0aW9uIG9mZnNldCA/Pz8/ICovCisgICAgZHN0X3Zhcl9sb2NfcmVnLAkJLyogcmVnaXN0ZXIgKi8KKyAgICBkc3RfdmFyX2xvY19yZWdfcmVsLAkvKiByZWdpc3RlciByZWxhdGl2ZSAtIHVzdWFsbHkgZnAgKi8KKyAgICBkc3RfdmFyX2xvY19pbmRfcmVnX3JlbCwJLyogSW5kZXhlZCByZWdpc3RlciByZWxhdGl2ZSAqLworICAgIGRzdF92YXJfbG9jX2Z0bl9wdHJfYmFzZWQsCS8qIEZvcnRyYW4gcG9pbnRlciBiYXNlZCAqLworICAgIGRzdF92YXJfbG9jX3BjX3JlbCwJCS8qIFBDIHJlbGF0aXZlLiBSZWFsbHkuICovCisgICAgZHN0X3Zhcl9sb2NfZXh0ZXJuYWwsCS8qIEV4dGVybmFsICovCisgICAgZHN0X3Zhcl9sb2NfRU5EX09GX0VOVU0KKyAgICB9CisgICAgZHN0X3Zhcl9sb2NfdDsKKworLyogTG9jYXRpb25zIGNvbWUgaW4gdHdvIHZlcnNpb25zLiBUaGUgc29ydCwgYW5kIHRoZSBsb25nLiBUaGUgZGlmZmVyZW5jZQorICogYmV0d2VlbiB0aGUgc2hvcnQgYW5kIHRoZSBsb25nIGlzIHRoZSBhZGRpdGlvbiBvZiBhIHN0YXRlbWVudCBudW1iZXIKKyAqIGZpZWxkIHRvIHRoZSBzdGFydCBhbmRlbmQgb2YgdGhlIHJhbmdlIG9mIHRoZSBsb25nLCBhbmQgYW5kIHVua293bgorICogcHVycG9zZSBmaWVsZCBpbiB0aGUgbWlkZGxlLiBBbHNvLCBsb2NfdHlwZSBhbmQgbG9jX2luZGV4IGFyZW4ndAorICogYml0ZmllbGRzIGluIHRoZSBsb25nIHZlcnNpb24uCisgKi8KKwordHlwZWRlZglzdHJ1Y3QKKyAgICB7CisgICAgdW5zaWduZWQgc2hvcnQJbG9jX3R5cGUgOiA0OworICAgIHVuc2lnbmVkIHNob3J0CWxvY19pbmRleCA6IDEyOworICAgIGxvbmcJCWxvY2F0aW9uOworICAgIHNob3J0CQlzdGFydF9saW5lOwkvKiBzdGFydF9saW5lIGFuZCBlbmRfbGluZT8gKi8KKyAgICBzaG9ydAkJZW5kX2xpbmU7CS8qIEknbSBndWVzc2luZyBoZXJlLgkgICAgKi8KKyAgICB9IGRzdF92YXJfbG9jX3Nob3J0X3Q7CisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIHVuc2lnbmVkIHNob3J0CWxvY190eXBlOworICAgIHVuc2lnbmVkIHNob3J0CWxvY19pbmRleDsKKyAgICBsb25nCQlsb2NhdGlvbjsKKyAgICBzaG9ydAkJdW5rbm93bjsJLyogQWx3YXlzIDAwMDMgb3IgM2IzYy4gV2h5PyAqLworICAgIHNob3J0CQlzdGFydF9zdGF0ZW1lbnQ7CisgICAgc2hvcnQJCXN0YXJ0X2xpbmU7CisgICAgc2hvcnQJCWVuZF9zdGF0ZW1lbnQ7CisgICAgc2hvcnQJCWVuZF9saW5lOworICAgIH0gZHN0X3Zhcl9sb2NfbG9uZ190OworCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIGRzdF9yZWxfb2Zmc2V0X3QJbm9mZnNldDsJLyogb2Zmc2V0IHRvIG5hbWUgc3RyaW5nICovCisgICAgZHN0X3NyY19sb2NfdAlzcmNfbG9jOwkvKiBmaWxlL2xpbmUgb2YgZGVzY3JpcHRpb24gKi8KKyAgICBkc3RfdHlwZV90CQl0eXBlX2Rlc2M7CS8qIFR5cGUgZGVzY3JpcHRpb24gKi8KKyAgICB1bnNpZ25lZCBzaG9ydAlhdHRyaWJ1dGVzOwkvKiBtYXNrIG9mIGRzdF92YXJfYXR0cl90IGZsYWdzICovCisgICAgdW5zaWduZWQgc2hvcnQJbm9fb2ZfbG9jcyA6IDE1Oy8qIE51bWJlciBvZiBsb2NhdGlvbnMgKi8KKyAgICB1bnNpZ25lZCBzaG9ydAlzaG9ydF9sb2NzIDogMTsJLyogVHJ1ZSBpZiBzaG9ydCBsb2NhdGlvbnMuICovCisgICAgdW5pb24KKwl7CisJZHN0X3Zhcl9sb2Nfc2hvcnRfdCBzaG9ydHNbZHN0X2R1bW15X2FycmF5X3NpemVdOworCWRzdF92YXJfbG9jX2xvbmdfdCBsb25nc1tkc3RfZHVtbXlfYXJyYXlfc2l6ZV07CisJfSBsb2NzOworICAgIH0gZHN0X3JlY192YXJfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tCisgIG9sZCBMQUJFTCByZWNvcmQKKyAtLS0tLS0tLS0tLS0tLS0tLQorIFVzZWQgYnkgb2xkZXIgY29tcGlsZXJzIHRvIGRlc2NyaWJlIGEgbGFiZWwKKyovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIGRzdF9yZWxfb2Zmc2V0X3QJbm9mZnNldDsJLyogb2Zmc2V0IHRvIG5hbWUgc3RyaW5nICovCisgICAgZHN0X3NyY19sb2NfdAlzcmNfbG9jOwkvKiBmaWxlL2xpbmUgb2YgZGVzY3JpcHRpb24gKi8KKyAgICBjaGFyCQlsb2NhdGlvblsxMl07CS8qIGxvY2F0aW9uIHN0cmluZyAqLworICAgIH0KKyAgICBkc3RfcmVjX29sZF9sYWJlbF90IEFMSUdORUQxOworCisvKi0tLS0tLS0tLS0tLS0tLS0KKyAgUE9JTlRFUiByZWNvcmQKKyAgLS0tLS0tLS0tLS0tLS0tLQorICBEZXNjcmliZXMgYSBwb2ludGVyIHR5cGUuCisqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBkc3RfcmVsX29mZnNldF90ICBub2Zmc2V0OyAgICAvKiBvZmZzZXQgdG8gdGhlIG5hbWUgc3RyaW5nIGZvciB0aGlzIHR5cGUgKi8KKyAgICBkc3Rfc3JjX2xvY190ICAgICBzcmNfbG9jOyAgICAvKiBmaWxlL2xpbmUgb2YgZGVmaW5pdGlvbiAqLworICAgIGRzdF90eXBlX3QgICAgICAgIHR5cGVfZGVzYzsgIC8qIGJhc2UgdHlwZSBvZiB0aGlzIHBvaW50ZXIgKi8KKyAgICB9CisgICAgZHN0X3JlY19wb2ludGVyX3QgQUxJR05FRDE7CisKKworLyotLS0tLS0tLS0tLS0tCisgIEFSUkFZIHJlY29yZAorICAtLS0tLS0tLS0tLS0tCisgIERlc2NyaWJlcyBhbiBhcnJheSB0eXBlLgorCisgIE11bHRpZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBkZXNjcmliZWQgd2l0aCBhIG51bWJlciBvZiBkc3RfcmVjX2FycmF5X3QgCisgIHJlY29yZHMsIG9uZSBwZXIgYXJyYXkgZGltZW5zaW9uLCBlYWNoIGxpbmtlZCB0byB0aGUgbmV4dCB0aHJvdWdoIHRoZQorICBlbGVtX3R5cGVfZGVzYy5kb2Zmc2V0IGZpZWxkLiAgRWFjaCByZWNvcmQgbXVzdCBoYXZlIGl0cyBtdWx0aV9kaW0gZmxhZworICBzZXQuCisKKyAgSWYgY29sdW1uX21ham9yIGlzIHRydWUgKGFzIHdpdGggRk9SVFJBTiBhcnJheXMpIHRoZW4gdGhlIGxhc3QgYXJyYXkgYm91bmQgaW4KKyAgdGhlIGRlY2xhcmF0aW9uIGlzIHRoZSBmaXJzdCBhcnJheSBpbmRleCBpbiBtZW1vcnksIHdoaWNoIGlzIHRoZSBvcHBvc2l0ZSBvZgorICB0aGUgdXN1YWwgY2FzZSAoYXMgd2l0aCBQYXNjYWwgYW5kIEMgYXJyYXlzKS4KKworICBWYXJpYWJsZSBhcnJheSBib3VuZHMgYXJlIGRlc2NyaWJlZCBieSBhdXhpbGlhcnkgcmVjb3JkczsgaWYgYXV4X3Zhcl9ib3VuZAorICByZWNvcmRzIGFyZSBwcmVzZW50LCB0aGUgbG9fYm91bmQgYW5kIGhpX2JvdW5kIGZpZWxkcyBvZiB0aGlzIHJlY29yZCBhcmUKKyAgaWdub3JlZCBieSB0aGUgZGVidWdnZXIuCisKKyAgc3Bhbl9jb21wIGlkZW50aWZpZXMgb25lIG9mIHRoZSBsYW5ndWFnZS1kZXBlbmRlbnQgd2F5cyBpbiB3aGljaCB0aGUgZGlzdGFuY2UKKyAgYmV0d2VlbiBzdWNjZXNzaXZlIGFycmF5IGVsZW1lbnRzIChzcGFuKSBpcyBjYWxjdWxhdGVkLiAgCisgICAgIGRzdF91c2Vfc3Bhbl9maWVsZCAgICAtLSB0aGUgc3BhbiBpcyB0aGUgdmFsdWUgb2Ygc3BhbiBmaWVsZC4KKyAgICAgZHN0X2NvbXB1dGVfZnJvbV9wcmV2IC0tIHRoZSBzcGFuIGlzIHRoZSBzaXplIG9mIHRoZSBwcmV2aW91cyBkaW1lbnNpb24uCisgICAgIGRzdF9jb21wdXRlX2Zyb21fbmV4dCAtLSB0aGUgc3BhbiBpcyB0aGUgc2l6ZSBvZiB0aGUgbmV4dCBkaW1lbnNpb24uCisgIEluIHRoZSBsYXR0ZXIgdHdvIGNhc2VzLCB0aGUgc3BhbiBmaWVsZCBjb250YWlucyBhbiBhbW91bnQgb2YgcGFkZGluZyB0byBhZGQKKyAgdG8gdGhlIHNpemUgb2YgdGhlIGFwcHJvcHJpYXRlIGRpbWVuc2lvbiB0byBjYWxjdWxhdGUgdGhlIHNwYW4uCisqLworCit0eXBlZGVmIGVudW0KKyAgICB7CisgICAgZHN0X3VzZV9zcGFuX2ZpZWxkLCAgCisgICAgZHN0X2NvbXB1dGVfZnJvbV9wcmV2LAorICAgIGRzdF9jb21wdXRlX2Zyb21fbmV4dCwgICAgICAgIAorICAgIGRzdF9zcGFuX2NvbXBfRU5EX09GX0VOVU0KKyAgICB9CisgICAgZHN0X3NwYW5fY29tcF90OworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBkc3RfcmVsX29mZnNldF90ICBub2Zmc2V0OyAgICAgICAgICAgLyogb2Zmc2V0IHRvIG5hbWUgc3RyaW5nICovCisgICAgZHN0X3NyY19sb2NfdCAgICAgc3JjX2xvYzsgICAgICAgICAgIC8qIGZpbGUvbGluZSBvZiBkZWZpbml0aW9uICovCisgICAgZHN0X3R5cGVfdCAgICAgICAgZWxlbV90eXBlX2Rlc2M7ICAgIC8qIGFycmF5IGVsZW1lbnQgdHlwZSAqLyAgICAKKyAgICBkc3RfdHlwZV90ICAgICAgICBpbmR4X3R5cGVfZGVzYzsgICAgLyogYXJyYXkgaW5kZXggdHlwZSAqLworICAgIGxvbmcgICAgICAgICAgICAgIGxvX2JvdW5kOyAgICAgICAgICAvKiBsb3dlciBib3VuZCBvZiBpbmRleCAqLworICAgIGxvbmcgICAgICAgICAgICAgIGhpX2JvdW5kOyAgICAgICAgICAvKiB1cHBlciBib3VuZCBvZiBpbmRleCAqLworICAgIHVuc2lnbmVkIGxvbmcgICAgIHNwYW47ICAgICAgICAgICAgICAvKiBzZWUgYWJvdmUgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgICBzaXplOyAgICAgICAgICAgICAgLyogdG90YWwgYXJyYXkgc2l6ZSAoYnl0ZXMpICovCisgICAgYm9vbGVhbiAgICAgICAgICAgbXVsdGlfZGltIDogMTsKKyAgICBib29sZWFuICAgICAgICAgICBpc19wYWNrZWQgOiAxOyAgICAgLyogdHJ1ZSBpZiBwYWNrZWQgYXJyYXkgKi8gICAgCisgICAgYm9vbGVhbiAgICAgICAgICAgaXNfc2lnbmVkIDogMTsgICAgIC8qIHRydWUgaWYgcGFja2VkIGVsZW1lbnRzIGFyZSBzaWduZWQgKi8KKyAgICBkc3Rfc3Bhbl9jb21wX3QgICBzcGFuX2NvbXAgOiAyOyAgICAgLyogaG93IHRvIGNvbXB1dGUgc3BhbiAqLworICAgIGJvb2xlYW4gICAgICAgICAgIGNvbHVtbl9tYWpvciA6IDE7CisgICAgdW5zaWduZWQgc2hvcnQgICAgcmVzZXJ2ZWQgIDogMjsgICAgIC8qIG11c3QgYmUgemVybyAqLworICAgIHVuc2lnbmVkIHNob3J0ICAgIGVsZW1fc2l6ZSA6IDg7ICAgICAvKiBlbGVtZW50IHNpemUgaWYgcGFja2VkIChiaXRzKSAqLworICAgIH0gICAgCisgICAgZHN0X3JlY19hcnJheV90IEFMSUdORUQxOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0KKyAgU1VCUkFOR0UgcmVjb3JkCisgIC0tLS0tLS0tLS0tLS0tLS0tCisgIERlc2NyaWJlcyBhIHN1YnJhbmdlIHR5cGUuCisqLworCisvKiBWYXJpYWJsZSBzdWJyYW5nZSBib3VuZHMgYXJlIGRlc2NyaWJlZCBieSBhdXhpbGlhcnkgcmVjb3JkczsgaWYgYXV4X3Zhcl9ib3VuZAorICAgcmVjb3JkcyBhcmUgcHJlc2VudCwgdGhlIGxvX2JvdW5kIGFuZCBoaV9ib3VuZCBmaWVsZHMgb2YgdGhpcyByZWNvcmQgYXJlCisgICBpZ25vcmVkIGJ5IHRoZSBkZWJ1Z2dlci4KKyovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIGRzdF9yZWxfb2Zmc2V0X3QgIG5vZmZzZXQ7ICAgICAgIC8qIG9mZnNldCB0byBuYW1lIHN0cmluZyAqLworICAgIGRzdF9zcmNfbG9jX3QgICAgIHNyY19sb2M7ICAgICAgIC8qIGZpbGUvbGluZSBvZiBzdWJyYW5nZSBkZWZpbml0aW9uICovCisgICAgZHN0X3R5cGVfdCAgICAgICAgdHlwZV9kZXNjOyAgICAgLyogcGFyZW50IHR5cGUgKi8gICAgCisgICAgbG9uZyAgICAgICAgICAgICAgbG9fYm91bmQ7ICAgICAgLyogbG93ZXIgYm91bmQgb2Ygc3VicmFuZ2UgKi8KKyAgICBsb25nICAgICAgICAgICAgICBoaV9ib3VuZDsgICAgICAvKiB1cHBlciBib3VuZCBvZiBzdWJyYW5nZSAqLworICAgIHVuc2lnbmVkIHNob3J0ICAgIHNpemU7ICAgICAgICAgIC8qIHN0b3JhZ2Ugc2l6ZSAoYnl0ZXMpICovCisgICAgfQorICAgIGRzdF9yZWNfc3VicmFuZ2VfdCBBTElHTkVEMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLQorICBTVFJJTkcgcmVjb3JkIAorICAtLS0tLS0tLS0tLS0tLS0KKyAgRGVzY3JpYmVzIGEgc3RyaW5nIHR5cGUuCisqLworCisvKiBWYXJpYWJsZSBzdWJyYW5nZSBib3VuZHMgYXJlIGRlc2NyaWJlZCBieSBhdXhpbGlhcnkgcmVjb3JkczsgaWYgYXV4X3Zhcl9ib3VuZAorICAgcmVjb3JkcyBhcmUgcHJlc2VudCwgdGhlIGxvX2JvdW5kIGFuZCBoaV9ib3VuZCBmaWVsZHMgb2YgdGhpcyByZWNvcmQgYXJlCisgICBpZ25vcmVkIGJ5IHRoZSBkZWJ1Z2dlci4KKyovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIGRzdF9yZWxfb2Zmc2V0X3QgIG5vZmZzZXQ7ICAgICAgICAgIC8qIG9mZnNldCB0byBuYW1lIHN0cmluZyAqLworICAgIGRzdF9zcmNfbG9jX3QgICAgIHNyY19sb2M7ICAgICAgICAgIC8qIGZpbGUvbGluZSBvZiBzdHJpbmcgZGVmaW5pdGlvbiAqLworICAgIGRzdF90eXBlX3QgICAgICAgIGVsZW1fdHlwZV9kZXNjOyAgIC8qIGVsZW1lbnQgdHlwZSAqLyAgICAKKyAgICBkc3RfdHlwZV90ICAgICAgICBpbmR4X3R5cGVfZGVzYzsgICAvKiBpbmRleCB0eXBlICovCisgICAgbG9uZyAgICAgICAgICAgICAgbG9fYm91bmQ7ICAgICAgICAgLyogbG93ZXIgYm91bmQgKi8KKyAgICBsb25nICAgICAgICAgICAgICBoaV9ib3VuZDsgICAgICAgICAvKiB1cHBlciBib3VuZCAqLworICAgIHVuc2lnbmVkIGxvbmcgICAgIHNpemU7ICAgICAgICAgICAgIC8qIHRvdGFsIHN0cmluZyBzaXplIChieXRlcykgaWYgZml4ZWQgKi8KKyAgICB9CisgICAgZHN0X3JlY19zdHJpbmdfdCBBTElHTkVEMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLQorICBTRVQgcmVjb3JkIAorICAtLS0tLS0tLS0tLS0tLS0KKyAgRGVzY3JpYmVzIGEgc2V0IHR5cGUuCisqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBkc3RfcmVsX29mZnNldF90ICBub2Zmc2V0OyAgICAgICAvKiBvZmZzZXQgdG8gbmFtZSBzdHJpbmcgKi8KKyAgICBkc3Rfc3JjX2xvY190ICAgICBzcmNfbG9jOyAgICAgICAvKiBmaWxlL2xpbmUgb2YgZGVmaW5pdGlvbiAqLworICAgIGRzdF90eXBlX3QgICAgICAgIHR5cGVfZGVzYzsgICAgIC8qIGVsZW1lbnQgdHlwZSAqLyAgICAKKyAgICB1bnNpZ25lZCBzaG9ydCAgICBuYml0czsgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiBzZXQgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCAgICBzaXplOyAgICAgICAgICAvKiBzdG9yYWdlIHNpemUgKGJ5dGVzKSAqLworICAgIH0KKyAgICBkc3RfcmVjX3NldF90IEFMSUdORUQxOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgSU1QTElDSVQgRU5VTUVSQVRJT04gcmVjb3JkIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEZXNjcmliZXMgYW4gZW51bWVyYXRpb24gdHlwZSB3aXRoIGltcGxpY2l0IGVsZW1lbnQgdmFsdWVzID0gMCwgMSwgMiwgLi4uCisgIChQYXNjYWwtc3R5bGUpLgorKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgZHN0X3JlbF9vZmZzZXRfdCAgIG5vZmZzZXQ7ICAgICAgLyogb2Zmc2V0IHRvIG5hbWUgc3RyaW5nICovICAgIAorICAgIGRzdF9zcmNfbG9jX3QgICAgICBzcmNfbG9jOyAgICAgIC8qIGZpbGUvbGluZSBvZiBkZWZpbml0aW9uICovCisgICAgdW5zaWduZWQgc2hvcnQgICAgIG5lbGVtczsgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGVudW1lcmF0aW9uICovCisgICAgdW5zaWduZWQgc2hvcnQgICAgIHNpemU7ICAgICAgICAgLyogc3RvcmFnZSBzaXplIChieXRlcykgKi8KKyAgICAvKiBvZmZzZXRzIHRvIG5hbWUgc3RyaW5ncyBvZiBlbGVtZW50cyAwLCAxLCAyLCAuLi4gKi8KKyAgICBkc3RfcmVsX29mZnNldF90ICAgZWxlbV9ub2Zmc2V0c1tkc3RfZHVtbXlfYXJyYXlfc2l6ZV07IAorICAgIH0KKyAgICBkc3RfcmVjX2ltcGxpY2l0X2VudW1fdCBBTElHTkVEMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEVYUExJQ0lUIEVOVU1FUkFUSU9OIHJlY29yZCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGVzY3JpYmVzIGFuIGVudW1lcmF0aW9uIHR5cGUgd2l0aCBleHBsaWNpdGx5IGFzc2lnbmVkIGVsZW1lbnQgdmFsdWVzCisgIChDLXN0eWxlKS4KKyovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIGRzdF9yZWxfb2Zmc2V0X3QgICBub2Zmc2V0OyAgICAgICAvKiBvZmZzZXQgdG8gZWxlbWVudCBuYW1lIHN0cmluZyAqLworICAgIGxvbmcgICAgICAgICAgICAgICB2YWx1ZTsgICAgICAgICAvKiBlbGVtZW50IHZhbHVlICovCisgICAgfQorICAgIGRzdF9lbnVtX2VsZW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgZHN0X3JlbF9vZmZzZXRfdCAgIG5vZmZzZXQ7ICAgICAgIC8qIG9mZnNldCB0byBuYW1lIHN0cmluZyAqLworICAgIGRzdF9zcmNfbG9jX3QgICAgICBzcmNfbG9jOyAgICAgICAvKiBmaWxlL2xpbmUgb2YgZGVmaW5pdGlvbiAqLworICAgIHVuc2lnbmVkIHNob3J0ICAgICBuZWxlbXM7ICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gZW51bWVyYXRpb24gKi8KKyAgICB1bnNpZ25lZCBzaG9ydCAgICAgc2l6ZTsgICAgICAgICAgLyogc3RvcmFnZSBzaXplIChieXRlcykgKi8KKyAgICAvKiBuYW1lL3ZhbHVlIHBhaXJzLCBvbmUgZGVzY3JpYmluZyBlYWNoIGVudW1lcmF0aW9uIHZhbHVlOiAqLworICAgIGRzdF9lbnVtX2VsZW1fdCAgICBlbGVtc1tkc3RfZHVtbXlfYXJyYXlfc2l6ZV07IAorICAgIH0KKyAgICBkc3RfcmVjX2V4cGxpY2l0X2VudW1fdCBBTElHTkVEMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFJFQ09SRCAvIFVOSU9OIHJlY29yZCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGVzY3JpYmVzIGEgcmVjb3JkIChzdHJ1Y3QpIG9yIHVuaW9uLgorCisgIElmIHRoZSByZWNvcmQgaXMgbGFyZ2VyIHRoYW4gMioqMTYgYnl0ZXMgdGhlbiBhbiBhdHRhY2hlZCBhdXggcmVjb3JkCisgIHNwZWNpZmllcyBpdHMgc2l6ZS4gIEFsc28sIGlmIHRoZSByZWNvcmQgaXMgc3RvcmVkIGluIHNob3J0IGZvcm0gdGhlbgorICBhdHRhY2hlZCByZWNvcmRzIHNwZWNpZnkgZmllbGQgb2Zmc2V0cyBsYXJnZXIgdGhhbiAyKioxNiBieXRlcy4KKworICBXaGV0aGVyIHRoZSBmaWVsZHNbXSBhcnJheSBvciBzZmllbGRzW10gYXJyYXkgaXMgdXNlZCBpcyBzZWxlY3RlZCBieQorICB0aGUgZHN0X3JlY190eXBlX3Qgb2YgdGhlIG92ZXJhbGwgZHN0IHJlY29yZC4KKyovCisKKy8qCisgICBSZWNvcmQgZmllbGQgZGVzY3JpcHRvciwgc2hvcnQgZm9ybS4gIFRoaXMgZm9ybSBoYW5kbGVzIG9ubHkgZmllbGRzIHdoaWNoCisgICBhcmUgYW4gZXZlbiBudW1iZXIgb2YgYnl0ZXMgbG9uZywgbG9jYXRlZCBzb21lIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZQorICAgc3RhcnQgb2YgdGhlIHJlY29yZC4KKyovCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBkc3RfcmVsX29mZnNldF90ICBub2Zmc2V0OyAgICAgLyogb2Zmc2V0IHRvIGZpZWxkIG5hbWUgc3RyaW5nICovCisgICAgZHN0X3R5cGVfdCAgICAgICAgdHlwZV9kZXNjOyAgIC8qIGZpZWxkIHR5cGUgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCAgICBmb2Zmc2V0OyAgICAgLyogZmllbGQgb2Zmc2V0IGZyb20gc3RhcnQgb2YgcmVjb3JkIChieXRlcykgKi8KKyAgICB9CisgICAgZHN0X3Nob3J0X2ZpZWxkX3QgQUxJR05FRDE7CisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIGRzdF9yZWxfb2Zmc2V0X3QJbm9mZnNldDsJLyogb2Zmc2V0IHRvIG5hbWUgc3RyaW5nICovCisgICAgZHN0X3R5cGVfdAkJdHlwZV9kZXNjOwkvKiBmaWVsZCB0eXBlICovCisgICAgdW5zaWduZWQgc2hvcnQJZm9mZnNldDsJLyogYnl0ZSBvZmZzZXQgKi8KKyAgICB1bnNpZ25lZCBzaG9ydAlpc19wYWNrZWQgOiAxOwkvKiBUcnVlIGlmIGZpZWxkIGlzIHBhY2tlZCAqLworICAgIHVuc2lnbmVkIHNob3J0CWJpdF9vZmZzZXQgOiA2OwkvKiBCaXQgb2Zmc2V0ICovCisgICAgdW5zaWduZWQgc2hvcnQJc2l6ZSA6IDY7CS8qIFNpemUgaW4gYml0cyAqLworICAgIHVuc2lnbmVkIHNob3J0CXNpZ24gOiAxOwkvKiBUcnVlIGlmIHNpZ25lZCAqLworICAgIHVuc2lnbmVkIHNob3J0CXBhZCA6IDI7CS8qIFBhZGRpbmcuIE11c3QgYmUgMCAqLworICAgIH0KKyAgICBkc3Rfb2xkX2ZpZWxkX3QgQUxJR05FRDE7CisKKy8qIFRhZyBlbnVtZXJhdGlvbiBmb3IgbG9uZyByZWNvcmQgZmllbGQgZGVzY3JpcHRvcjoKKyovCit0eXBlZGVmIGVudW0KKyAgICB7CisgICAgZHN0X2ZpZWxkX2J5dGUsCisgICAgZHN0X2ZpZWxkX2JpdCwKKyAgICBkc3RfZmllbGRfbG9jLAorICAgIGRzdF9maWVsZF9FTkRfT0ZfRU5VTQorICAgIH0KKyAgICBkc3RfZmllbGRfZm9ybWF0X3Q7CisKKy8qCisgICBSZWNvcmQgZmllbGQgZGVzY3JpcHRvciwgbG9uZyBmb3JtLiAgVGhlIGZvcm1hdCBvZiB0aGUgZmllbGQgaW5mb3JtYXRpb24KKyAgIGlzIGlkZW50aWZpZWQgYnkgdGhlIGZvcm1hdF90YWcsIHdoaWNoIGNvbnRhaW5zIG9uZSBvZiB0aGUgYWJvdmUgdmFsdWVzLgorICAgVGhlIGZpZWxkX2J5dGUgdmFyaWFudCBpcyBlcXVpdmFsZW50IHRvIHRoZSBzaG9ydCBmb3JtIG9mIGZpZWxkIGRlc2NyaXB0b3IuCisgICBUaGUgZmllbGRfYml0IHZhcmlhbnQgaGFuZGxlcyBmaWVsZHMgd2hpY2ggYXJlIGFueSBudW1iZXIgb2YgYml0cyBsb25nLAorICAgbG9jYXRlZCBzb21lIG51bWJlciBvZiBiaXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSByZWNvcmQuICBUaGUgZmllbGRfbG9jCisgICB2YXJpYW50IGFsbG93cyB0aGUgbG9jYXRpb24gb2YgdGhlIGZpZWxkIHRvIGJlIGRlc2NyaWJlZCBieSBhIGdlbmVyYWwgbG9jCisgICBzdHJpbmcuCisqLwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgZHN0X3JlbF9vZmZzZXRfdCAgIG5vZmZzZXQ7ICAgICAgICAgICAgICAgICAvKiBvZmZzZXQgdG8gbmFtZSBvZiBmaWVsZCAqLworICAgIGRzdF90eXBlX3QgICAgICAgICB0eXBlX2Rlc2M7ICAgICAgICAgICAgICAgLyogdHlwZSBvZiBmaWVsZCAqLworICAgIHVuaW9uCisgICAgICAgIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGRzdF9maWVsZF9mb3JtYXRfdCBmb3JtYXRfdGFnOiAyOyAgIC8qIGRzdF9maWVsZF9ieXRlICovCisgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgb2Zmc2V0OiAzMDsgICAgICAvKiBvZmZzZXQgb2YgZmllbGQgaW4gYnl0ZXMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpZWxkX2J5dGUgQUxJR05FRDE7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBkc3RfZmllbGRfZm9ybWF0X3QgZm9ybWF0X3RhZzogMjsgICAvKiBkc3RfZmllbGRfYml0ICovCisgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgbmJpdHM6IDY7ICAgICAgICAvKiBiaXQgc2l6ZSBvZiBmaWVsZCAqLworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgIGlzX3NpZ25lZDogMTsgICAgLyogc2lnbmVkL3Vuc2lnbmVkIGF0dHJpYnV0ZSAqLworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgIGJpdF9vZmZzZXQ6IDM7ICAgLyogYml0IG9mZnNldCBmcm9tIGJ5dGUgYm91bmRhcnkgKi8KKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBwYWQ6IDQ7ICAgICAgICAgIC8qIG11c3QgYmUgemVybyAqLworICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgICAgIGJ5dGVfb2Zmc2V0OyAgICAgLyogb2Zmc2V0IG9mIGJ5dGUgYm91bmRhcnkgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpZWxkX2JpdCBBTElHTkVEMTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGRzdF9maWVsZF9mb3JtYXRfdCBmb3JtYXRfdGFnOiAyOyAgIC8qIGRzdF9maWVsZF9sb2MgKi8KKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBsb2Zmc2V0OiAzMDsgICAgIC8qIGRzdF9yZWxfb2Zmc2V0X3QgdG8gbG9jIHN0cmluZyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmllbGRfbG9jIEFMSUdORUQxOworICAgICAgICB9CisgICAgICAgIGYgQUxJR05FRDE7CisgICAgfQorICAgIGRzdF9maWVsZF90OworCisvKiBUaGUgZmllbGRfbG9jLmxvZmZzZXQgZmllbGQgaXMgYSAzMC1iaXQgc2lnbmVkIHZhbHVlLiAgU29tZSB2ZXJzaW9ucyBvZiBDIGRvCisgICBub3Qgc3VwcG9ydCBzaWduZWQgYml0IGZpZWxkcy4gIFRoZSBmb2xsb3dpbmcgbWFjcm8gd2lsbCBleHRyYWN0IHRoYXQgZmllbGQKKyAgIGFzIGEgc2lnbmVkIHZhbHVlOgorKi8KKyNkZWZpbmUgZHN0X2ZpZWxkX2xvZmZzZXQoZmllbGRfcmVjKSBcCisgICAgKCAoKGludCkgKChmaWVsZF9yZWMpLmYuZmllbGRfbG9jLmxvZmZzZXQgPDwgMikpID4+IDIgKQorCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIGRzdF9yZWxfb2Zmc2V0X3QgICBub2Zmc2V0OyAgICAgIC8qIG9mZnNldCB0byByZWNvcmQgbmFtZSBzdHJpbmcgKi8KKyAgICBkc3Rfc3JjX2xvY190ICAgICAgc3JjX2xvYzsgICAgICAvKiBmaWxlL2xpbmUgd2hlcmUgdGhpcyByZWNvcmQgaXMgZGVmaW5lZCAqLworICAgIHVuc2lnbmVkIHNob3J0ICAgICAgc2l6ZTsgICAgICAgIC8qIHN0b3JhZ2Ugc2l6ZSAoYnl0ZXMpICovCisgICAgdW5zaWduZWQgc2hvcnQgICAgICBuZmllbGRzOyAgICAgLyogbnVtYmVyIG9mIGZpZWxkcyBpbiB0aGlzIHJlY29yZCAqLworICAgIHVuaW9uCisgICAgICAgIHsKKyAgICAgICAgZHN0X2ZpZWxkX3QgICAgICAgIGZpZWxkc1tkc3RfZHVtbXlfYXJyYXlfc2l6ZV07CisgICAgICAgIGRzdF9zaG9ydF9maWVsZF90ICBzZmllbGRzW2RzdF9kdW1teV9hcnJheV9zaXplXTsKKwlkc3Rfb2xkX2ZpZWxkX3QJICAgb2ZpZWxkc1tkc3RfZHVtbXlfYXJyYXlfc2l6ZV07CisgICAgICAgIH0KKyAgICAgICAgZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcnJheSBvZiBmaWVsZHMgKi8KKyAgICB9CisgICAgZHN0X3JlY19yZWNvcmRfdCBBTElHTkVEMTsKKworCisvKi0tLS0tLS0tLS0tLS0KKyAgRklMRSByZWNvcmQKKyAgLS0tLS0tLS0tLS0tLQorICBEZXNjcmliZXMgYSBmaWxlIHR5cGUuCisqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBkc3RfcmVsX29mZnNldF90ICBub2Zmc2V0OyAgICAgICAvKiBvZmZzZXQgdG8gbmFtZSBzdHJpbmcgKi8KKyAgICBkc3Rfc3JjX2xvY190ICAgICBzcmNfbG9jOyAgICAgICAvKiBmaWxlL2xpbmUgd2hlcmUgdHlwZSB3YXMgZGVmaW5lZCAqLworICAgIGRzdF90eXBlX3QgICAgICAgIHR5cGVfZGVzYzsgICAgIC8qIGZpbGUgZWxlbWVudCB0eXBlICovCisgICAgfQorICAgIGRzdF9yZWNfZmlsZV90IEFMSUdORUQxOworCisKKy8qLS0tLS0tLS0tLS0tLS0tCisgIE9GRlNFVCByZWNvcmQgCisgIC0tLS0tLS0tLS0tLS0tLQorICAgRGVzY3JpYmVzIGEgUGFzY2FsIG9mZnNldCB0eXBlLgorICAgKFRoaXMgdHlwZSwgYW4gdW5kb2N1bWVudGVkIERvbWFpbiBQYXNjYWwgZXh0ZW5zaW9uLCBpcyBjdXJyZW50bHkgbm90CisgICBzdXBwb3J0ZWQgYnkgdGhlIGRlYnVnZ2VyKQorKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgZHN0X3JlbF9vZmZzZXRfdCAgIG5vZmZzZXQ7ICAgICAgICAgICAvKiBvZmZzZXQgdG8gdGhlIG5hbWUgc3RyaW5nICovCisgICAgZHN0X3NyY19sb2NfdCAgICAgIHNyY19sb2M7ICAgICAgICAgICAvKiBmaWxlL2xpbmUgb2YgZGVmaW5pdGlvbiAqLworICAgIGRzdF90eXBlX3QgICAgICAgICBhcmVhX3R5cGVfZGVzYzsgICAgLyogYXJlYSB0eXBlICovICAgIAorICAgIGRzdF90eXBlX3QgICAgICAgICBiYXNlX3R5cGVfZGVzYzsgICAgLyogYmFzZSB0eXBlICovCisgICAgbG9uZyAgICAgICAgICAgICAgIGxvX2JvdW5kOyAgICAgICAgICAvKiBsb3cgYm91bmQgb2YgdGhlIG9mZnNldCByYW5nZSAqLworICAgIGxvbmcgICAgICAgICAgICAgICBoaV9ib3VuZDsgICAgICAgICAgLyogaGlnaCBib3VuZCBvZiB0aGUgb2Zmc2V0IHJhbmdlICovCisgICAgbG9uZyAgICAgICAgICAgICAgIGJpYXM7ICAgICAgICAgICAgICAvKiBiaWFzICovICAgIAorICAgIHVuc2lnbmVkIHNob3J0ICAgICBzY2FsZTsgICAgICAgICAgICAgLyogc2NhbGUgZmFjdG9yICovCisgICAgdW5zaWduZWQgc2hvcnQgICAgIHNpemU7ICAgICAgICAgICAgICAvKiBzdG9yYWdlIHNpemUgKGJ5dGVzKSAqLworICAgIH0KKyAgICBkc3RfcmVjX29mZnNldF90IEFMSUdORUQxOworCisKKy8qLS0tLS0tLS0tLS0tLS0KKyAgQUxJQVMgcmVjb3JkIAorICAtLS0tLS0tLS0tLS0tLQorICBEZXNjcmliZXMgYSB0eXBlIGFsaWFzIChlLmcuLCB0eXBlZGVmKS4KKyovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIGRzdF9yZWxfb2Zmc2V0X3QgICBub2Zmc2V0OyAgICAgIC8qIG9mZnNldCB0byBuYW1lIHN0cmluZyAqLworICAgIGRzdF9zcmNfbG9jX3QgICAgICBzcmNfbG9jOyAgICAgIC8qIGZpbGUvbGluZSBvZiBkZWZpbml0aW9uICovCisgICAgZHN0X3R5cGVfdCAgICAgICAgIHR5cGVfZGVzYzsgICAgLyogcGFyZW50IHR5cGUgKi8KKyAgICB9CisgICAgZHN0X3JlY19hbGlhc190IEFMSUdORUQxOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tCisgIFNJR05BVFVSRSByZWNvcmQKKyAgLS0tLS0tLS0tLS0tLS0tLS0tCisgIERlc2NyaWJlcyBhIHByb2NlZHVyZS9mdW5jdGlvbiB0eXBlLgorKi8KKworLyogRW51bWVyYXRpb24gb2YgYXJndW1lbnQgc2VtYW50aWNzLiAgTm90ZSB0aGF0IG1vc3QgYXJlIG11dHVhbGx5CisgICBleGNsdXNpdmUuCisqLwordHlwZWRlZiBlbnVtCisgICAgeworICAgIGRzdF9hcmdfYXR0cl92YWwsICAgICAgICAgIC8qIHBhc3NlZCBieSB2YWx1ZSAqLworICAgIGRzdF9hcmdfYXR0cl9yZWYsICAgICAgICAgIC8qIHBhc3NlZCBieSByZWZlcmVuY2UgKi8KKyAgICBkc3RfYXJnX2F0dHJfbmFtZSwgICAgICAgICAvKiBwYXNzZWQgYnkgbmFtZSAqLworICAgIGRzdF9hcmdfYXR0cl9pbiwgICAgICAgICAgIC8qIHJlYWRhYmxlIGluIHRoZSBjYWxsZWUgKi8KKyAgICBkc3RfYXJnX2F0dHJfb3V0LCAgICAgICAgICAvKiB3cml0YWJsZSBpbiB0aGUgY2FsbGVlICovICAgIAorICAgIGRzdF9hcmdfYXR0cl9oaWRkZW4sICAgICAgIC8qIG5vdCB2aXNpYmxlIGluIHRoZSBjYWxsZXIgKi8KKyAgICBkc3RfYXJnX2F0dHJfRU5EX09GX0VOVU0KKyAgICB9ICAgIAorICAgIGRzdF9hcmdfYXR0cl90OworCisvKiBBcmd1bWVudCBkZXNjcmlwdG9yLiAgQWN0dWFsbHkgcG9pbnRzIHRvIGEgdmFyaWFibGUgcmVjb3JkIGZvciBtb3N0IG9mIHRoZQorICAgaW5mb3JtYXRpb24uCisqLwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgZHN0X3JlbF9vZmZzZXRfdCAgdmFyX29mZnNldDsgICAgIC8qIG9mZnNldCB0byB2YXJpYWJsZSByZWNvcmQgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCAgICBhdHRyaWJ1dGVzOyAgICAgLyogYSBtYXNrIG9mIGRzdF9hcmdfYXR0cl90IGZsYWdzICovCisgICAgfQorICAgIGRzdF9hcmdfdCBBTElHTkVEMTsKKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgZHN0X3JlbF9vZmZzZXRfdCAgIG5vZmZzZXQ7ICAgIC8qIG9mZnNldCB0byBuYW1lIHN0cmluZyAqLworICAgIGRzdF9zcmNfbG9jX3QgICAgICBzcmNfbG9jOyAgICAvKiBmaWxlL2xpbmUgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbiAqLworICAgIGRzdF9yZWxfb2Zmc2V0X3QgICByZXN1bHQ7ICAgICAvKiBvZmZzZXQgdG8gZnVuY3Rpb24gcmVzdWx0IHZhcmlhYmxlIHJlY29yZCAqLworICAgIHVuc2lnbmVkIHNob3J0ICAgICBuYXJnczsgICAgICAvKiBudW1iZXIgb2YgYXJndW1lbnRzICovCisgICAgZHN0X2FyZ190ICAgICAgICAgIGFyZ3NbZHN0X2R1bW15X2FycmF5X3NpemVdOyAKKyAgICB9CisgICAgZHN0X3JlY19zaWduYXR1cmVfdCBBTElHTkVEMTsKKworLyotLS0tLS0tLS0tLS0tLQorICBTQ09QRSByZWNvcmQKKyAgLS0tLS0tLS0tLS0tLS0KKyAgT2Jzb2xldGUuIFVzZSB0aGUgbmV3IEVOVFJZIHR5cGUgaW5zdGVhZC4KKyAgT2xkIGNvbXBpbGVycyBtYXkgcHV0IHRoaXMgaW4gYXMgdGhlIGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24sCisgIHRlcm1pbmF0ZWQgYnkgYW4gZW5kIG9mIHNjb3BlIGVudHJ5LgorKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgZHN0X3JlbF9vZmZzZXRfdAlub2Zmc2V0OwkvKiBOYW1lIG9mZnNldCAqLworICAgIGRzdF9zcmNfbG9jX3QJc3RhcnRfbGluZTsJLyogU3RhcnRpbmcgbGluZSAqLworICAgIGRzdF9zcmNfbG9jX3QJZW5kX2xpbmU7CS8qIEVuZGluZyBsaW5lICovCisgICAgfQorICAgIGRzdF9yZWNfc2NvcGVfdCBBTElHTkVEMTsKKworLyotLS0tLS0tLS0tLS0tLQorICBFTlRSWSByZWNvcmQKKyAgLS0tLS0tLS0tLS0tLS0KKyAgRGVzY3JpYmVzIGEgcHJvY2VkdXJlL2Z1bmN0aW9uIGVudHJ5IHBvaW50LiAgQW4gZW50cnkgcmVjb3JkIGlzIHRvIGEKKyAgc2lnbmF0dXJlIHJlY29yZCByb3VnaGx5IGFzIGEgdmFyaWFibGUgcmVjb3JkIGlzIHRvIGEgdHlwZSBkZXNjcmlwdG9yIHJlY29yZC4KKworICBUaGUgZW50cnlfbnVtYmVyIGZpZWxkIGlzIGtleWVkIHRvIHRoZSBlbnRyeSBudW1iZXJzIGluIC5saW5lcyAtLSB0aGUgCisgIGRlYnVnZ2VyIGxvY2F0ZXMgdGhlIGNvZGUgbG9jYXRpb24gb2YgYW4gZW50cnkgYnkgc2VhcmNoaW5nIHRoZSBsaW5lCisgIG51bWJlciB0YWJsZSBmb3IgYW4gZW50cnkgbnVtYmVyZWQgd2l0aCB0aGUgdmFsdWUgb2YgZW50cnlfbnVtYmVyLiAgVGhlCisgIG1haW4gZW50cnkgaXMgbnVtYmVyZWQgemVyby4KKyovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIGRzdF9yZWxfb2Zmc2V0X3QgIG5vZmZzZXQ7ICAgICAgICAgICAvKiBvZmZzZXQgdG8gZW50cnkgbmFtZSBzdHJpbmcgKi8KKyAgICBkc3RfcmVsX29mZnNldF90ICBsb2Zmc2V0OyAgICAgICAgICAgLyogd2hlcmUgdG8ganVtcCB0byBjYWxsIHRoaXMgZW50cnkgKi8KKyAgICBkc3Rfc3JjX2xvY190ICAgICBzcmNfbG9jOyAgICAgICAgICAgLyogZmlsZS9saW5lIG9mIGRlZmluaXRpb24gKi8KKyAgICBkc3RfcmVsX29mZnNldF90ICBzaWdfZGVzYzsgICAgICAgICAgLyogb2Zmc2V0IHRvIHNpZ25hdHVyZSBkZXNjcmlwdG9yICovCisgICAgdW5zaWduZWQgaW50ICAgICAgZW50cnlfbnVtYmVyOiA4OworICAgIGludCAgICAgICAgICAgICAgIHBhZDogODsgICAgICAgICAgICAvKiBtdXN0IGJlIHplcm8gKi8KKyAgICB9CisgICAgZHN0X3JlY19lbnRyeV90IEFMSUdORUQxOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIE9sZCBmb3JtYXQgRU5UUlkgcmVjb3JkCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFN1cHBvc2VkbHkgb2Jzb2xldGUgYnV0IHN0aWxsIHVzZWQgYnkgc29tZSBjb21waWxlcnMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgZHN0X3JlbF9vZmZzZXRfdAlub2Zmc2V0OwkvKiBPZmZzZXQgdG8gZW50cnkgbmFtZSBzdHJpbmcgKi8KKyAgICBkc3Rfc3JjX2xvY190CXNyY19sb2M7CS8qIExvY2F0aW9uIGluIHNvdXJjZSAqLworICAgIGRzdF9yZWxfb2Zmc2V0X3QJc2lnX2Rlc2M7CS8qIFNpZ25hdHVyZSBkZXNjcmlwdGlvbiAqLworICAgIGNoYXIJCXVua25vd25bMzZdOworICAgIH0KKyAgICBkc3RfcmVjX29sZF9lbnRyeV90IEFMSUdORUQxOworCisvKi0tLS0tLS0tLS0tLS0tCisgIExBQkVMIHJlY29yZCAKKyAgLS0tLS0tLS0tLS0tLS0KKyAgRGVzY3JpYmVzIGEgcHJvZ3JhbSBsYWJlbC4KKyovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIGRzdF9yZWxfb2Zmc2V0X3QgICBub2Zmc2V0OyAgICAgICAgLyogb2Zmc2V0IHRvIGxhYmVsIHN0cmluZyAqLworICAgIGRzdF9yZWxfb2Zmc2V0X3QgICBsb2Zmc2V0OyAgICAgICAgLyogb2Zmc2V0IHRvIGxvYyBzdHJpbmcgKi8KKyAgICBkc3Rfc3JjX2xvY190ICAgICAgc3JjX2xvYzsgICAgICAgIC8qIGZpbGUvbGluZSBvZiBkZWZpbml0aW9uICovCisgICAgfQorICAgIGRzdF9yZWNfbGFiZWxfdCBBTElHTkVEMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEFVWElMSUFSWSBTSVpFIHJlY29yZAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBNYXkgYXBwZWFyIGluIHRoZSBhdXhpbGlhcnkgcmVjb3JkIGxpc3Qgb2YgYW55IHR5cGUgb3IgdmFyaWFibGUgcmVjb3JkIHRvCisgIG1vZGlmeSB0aGUgZGVmYXVsdCBzaXplIG9mIHRoZSB0eXBlIG9yIHZhcmlhYmxlLgorKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgdW5zaWduZWQgbG9uZyAgc2l6ZTsgICAgICAgLyogc2l6ZSAoYnl0ZXMpICovCisgICAgfQorICAgIGRzdF9yZWNfYXV4X3NpemVfdCBBTElHTkVEMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEFVWElMSUFSWSBBTElHTiByZWNvcmQKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgTWF5IGFwcGVhciBpbiB0aGUgYXV4aWxpYXJ5IHJlY29yZCBsaXN0IG9mIGFueSB0eXBlIG9yIHZhcmlhYmxlIHJlY29yZCB0bworICBtb2RpZnkgdGhlIGRlZmF1bHQgYWxpZ25tZW50IG9mIHRoZSB0eXBlIG9yIHZhcmlhYmxlLgorKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgdW5zaWduZWQgc2hvcnQgICAgYWxpZ25tZW50OyAgLyogIyBvZiBsb3cgb3JkZXIgemVybyBiaXRzICovCisgICAgfQorICAgIGRzdF9yZWNfYXV4X2FsaWduX3QgQUxJR05FRDE7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBBVVhJTElBUlkgRklFTEQgU0laRSByZWNvcmQKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgTWF5IGFwcGVhciBpbiB0aGUgYXV4aWxpYXJ5IHJlY29yZCBsaXN0IG9mIGFueSBSRUNPUkQvVU5JT04gcmVjb3JkIHRvIAorICBtb2RpZnkgdGhlIGRlZmF1bHQgc2l6ZSBvZiBhIGZpZWxkLgorKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgdW5zaWduZWQgc2hvcnQgZmllbGRfbm87ICAgICAgIC8qIGZpZWxkIG51bWJlciAqLworICAgIHVuc2lnbmVkIGxvbmcgIHNpemU7ICAgICAgICAgICAvKiBzaXplIChiaXRzKSAqLworICAgIH0KKyAgICBkc3RfcmVjX2F1eF9maWVsZF9zaXplX3QgQUxJR05FRDE7CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEFVWElMSUFSWSBGSUVMRCBPRkZTRVQgcmVjb3JkCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIE1heSBhcHBlYXIgaW4gdGhlIGF1eGlsaWFyeSByZWNvcmQgbGlzdCBvZiBhbnkgUkVDT1JEL1VOSU9OIHJlY29yZCB0byAKKyAgc3BlY2lmeSBhIGZpZWxkIG9mZnNldCBsYXJnZXIgdGhhbiAyKioxNi4KKyovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIHVuc2lnbmVkIHNob3J0IGZpZWxkX25vOyAgICAgICAvKiBmaWVsZCBudW1iZXIgKi8KKyAgICB1bnNpZ25lZCBsb25nICBmb2Zmc2V0OyAgICAgICAgLyogb2Zmc2V0ICovCisgICAgfQorICAgIGRzdF9yZWNfYXV4X2ZpZWxkX29mZl90IEFMSUdORUQxOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQVVYSUxJQVJZIEZJRUxEIEFMSUdOIHJlY29yZAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBNYXkgYXBwZWFyIGluIHRoZSBhdXhpbGlhcnkgcmVjb3JkIGxpc3Qgb2YgYW55IFJFQ09SRC9VTklPTiByZWNvcmQgdG8gCisgIG1vZGlmeSB0aGUgZGVmYXVsdCBhbGlnbm1lbnQgb2YgYSBmaWVsZC4KKyovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIHVuc2lnbmVkIHNob3J0IGZpZWxkX25vOyAgICAgICAvKiBmaWVsZCBudW1iZXIgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBhbGlnbm1lbnQ7ICAgICAgLyogbnVtYmVyIG9mIGxvdyBvcmRlciB6ZXJvIGJpdHMgKi8KKyAgICB9CisgICAgZHN0X3JlY19hdXhfZmllbGRfYWxpZ25fdCBBTElHTkVEMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQVVYSUxJQVJZIFZBUiBCT1VORCByZWNvcmQKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBNYXkgYXBwZWFyIGluIHRoZSBhdXhpbGlhcnkgcmVjb3JkIGxpc3Qgb2YgYW55IEFSUkFZLCBTVUJSQU5HRSBvciBTVFJJTkcKKyAgcmVjb3JkIHRvIGRlc2NyaWJlIGEgdmFyaWFibGUgYm91bmQgZm9yIHRoZSByYW5nZSBvZiB0aGUgdHlwZS4KKyovCisKK3R5cGVkZWYgZW51bQorICAgIHsKKyAgICBkc3RfbG93X2JvdW5kLCAgICAgICAvKiB0aGUgbG93IGJvdW5kIGlzIHZhcmlhYmxlICovCisgICAgZHN0X2hpZ2hfYm91bmQsICAgICAgLyogdGhlIGhpZ2ggYm91bmQgaXMgdmFyaWFibGUgKi8KKyAgICBkc3RfdmFyX2JvdW5kX0VORF9PRl9FTlVNCisgICAgfQorICAgIGRzdF92YXJfYm91bmRfdDsKKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgdW5zaWduZWQgc2hvcnQgICAgd2hpY2g7ICAgICAgICAgICAgICAvKiB3aGljaCBib3VuZCAqLworICAgIGRzdF9yZWxfb2Zmc2V0X3QgICB2b2Zmc2V0IEFMSUdORUQxOyAgIC8qIHZhcmlhYmxlIHRoYXQgZGVmaW5lcyBib3VuZCAqLworICAgIH0gICAgCisgICAgZHN0X3JlY19hdXhfdmFyX2JvdW5kX3QgQUxJR05FRDE7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEFVWElMSUFSWSBUWVBFIERFUklWQVRJT04gcmVjb3JkIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIE1heSBhcHBlYXIgaW4gdGhlIGF1eGlsaWFyeSByZWNvcmQgbGlzdCBvZiBhbnkgUkVDT1JEL1VOSU9OIHJlY29yZCB0byBkZW5vdGUKKyAgY2xhc3MgaW5oZXJpdGFuY2Ugb2YgdGhhdCB0eXBlIGZyb20gYSBwYXJlbnQgdHlwZS4KKworICBJbmhlcml0YW5jZSBpbXBsaWVzIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gY29udmVydCB0aGUgaW5oZXJpdG9yIHR5cGUgdG8gdGhlCisgIGluaGVyaXRlZCB0eXBlLCByZXRhaW5pbmcgdGhvc2UgZmllbGRzIHdoaWNoIHdlcmUgaW5oZXJpdGVkLiAgVG8gYWxsb3cgdGhpcywKKyAgb3JpZ19maWVsZF9ubywgYSBmaWVsZCBudW1iZXIgaW50byB0aGUgcmVjb3JkIHR5cGUsIGlzIHByb3ZpZGVkLiAgSWYgCisgIG9yaWdfaXNfcG9pbnRlciBpcyBmYWxzZSwgdGhlbiB0aGUgc3RhcnQgb2YgdGhlIGluaGVyaXRlZCByZWNvcmQgaXMgbG9jYXRlZAorICBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIGZpZWxkIGluZGV4ZWQgYnkgb3JpZ19maWVsZF9uby4gIElmIG9yaWdfaXNfcG9pbnRlcgorICBpcyB0cnVlLCB0aGVuIGl0IGlzIGxvY2F0ZWQgYXQgdGhlIGFkZHJlc3MgY29udGFpbmVkIGluIHRoZSBmaWVsZCBpbmRleGVkCisgIGJ5IG9yaWdfZmllbGRfbm8gKGFzc3VtZWQgdG8gYmUgYSBwb2ludGVyKS4KKyovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIGRzdF90eXBlX3QgICAgIHBhcmVudF90eXBlOyAgICAgICAgICAgICAvKiByZWZlcmVuY2UgdG8gaW5oZXJpdGVkIHR5cGUgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBvcmlnX2ZpZWxkX25vOworICAgIGJvb2xlYW4gICAgICAgIG9yaWdfaXNfcG9pbnRlcjogMTsKKyAgICBpbnQgICAgICAgICAgICB1bnVzZWQ6IDE1OyAgICAgICAgICAgICAgLyogbXVzdCBiZSB6ZXJvICovCisgICAgfQorICAgIGRzdF9yZWNfYXV4X3R5cGVfZGVyaXZfdCBBTElHTkVEMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBBVVhJTElBUlkgVkFSSUFCTEUgTElGRVRJTUUgcmVjb3JkCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBNYXkgYXBwZWFyIGluIHRoZSBhdXhpbGlhcnkgcmVjb3JkIGxpc3Qgb2YgYSBWQVJJQUJMRSByZWNvcmQgdG8gYWRkIGxvY2F0aW9uCisgIGluZm9ybWF0aW9uIGZvciBhbiBhZGRpdGlvbmFsIHZhcmlhYmxlIGxpZmV0aW1lLgorKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgZHN0X3JlbF9vZmZzZXRfdCBsb2Zmc2V0OworICAgIH0KKyAgICBkc3RfcmVjX2F1eF9saWZldGltZV90IEFMSUdORUQxOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBBVVhJTElBUlkgUE9JTlRFUiBCQVNFIHJlY29yZCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBNYXkgYXBwZWFyIGluIHRoZSBhdXhpbGlhcnkgcmVjb3JkIGxpc3Qgb2YgYSBWQVJJQUJMRSByZWNvcmQgdG8gcHJvdmlkZSBhCisgIHBvaW50ZXIgYmFzZSB0byBzdWJzdGl0dXRlIGZvciByZWZlcmVuY2VzIHRvIGFueSBzdWNoIGJhc2VzIGluIHRoZSBsb2NhdGlvbgorICBzdHJpbmcgb2YgdGhlIHZhcmlhYmxlLiAgQSBwb2ludGVyIGJhc2UgaXMgYW5vdGhlciBWQVJJQUJMRSByZWNvcmQuICBXaGVuCisgIHRoZSB2YXJpYWJsZSBpcyBldmFsdWF0ZWQgYnkgdGhlIGRlYnVnZ2VyLCBpdCB1c2VzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZQorICBwb2ludGVyIGJhc2UgdmFyaWFibGUgaW4gY29tcHV0aW5nIGl0cyBsb2NhdGlvbi4KKworICBUaGlzIGlzIHVzZWZ1bCBmb3IgcmVwcmVzZW50aW5nIEZPUlRSQU4gcG9pbnRlci1iYXNlZCB2YXJpYWJsZXMuCisqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBkc3RfcmVsX29mZnNldF90IHZvZmZzZXQ7CisgICAgfQorICAgIGRzdF9yZWNfYXV4X3B0cl9iYXNlX3QgQUxJR05FRDE7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQVVYSUxJQVJZIFJFR0lTVEVSIFZBTFVFIHJlY29yZCAKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIE1heSBhcHBlYXIgaW4gdGhlIGF1eGlsaWFyeSByZWNvcmQgbGlzdCBvZiBhbiBFTlRSWSByZWNvcmQgdG8gc3BlY2lmeQorICBhIHJlZ2lzdGVyIHRoYXQgbXVzdCBiZSBzZXQgdG8gYSBzcGVjaWZpYyB2YWx1ZSBiZWZvcmUganVtcGluZyB0byB0aGUgZW50cnkKKyAgcG9pbnQgaW4gYSBkZWJ1Z2dlciAiY2FsbCIuICBUaGUgZGVidWdnZXIgbXVzdCBzZXQgdGhlIGRlYnVnZ2VlIHJlZ2lzdGVyLAorICBzcGVjaWZpZWQgYnkgdGhlIHJlZ2lzdGVyIGNvZGUsIHRvIHRoZSB2YWx1ZSBvZiB0aGUgKmFkZHJlc3MqIHRvIHdoaWNoIHRoZQorICBsb2NhdGlvbiBzdHJpbmcgcmVzb2x2ZXMuICBJZiB0aGUgYWRkcmVzcyBpcyByZWdpc3Rlci1yZWxhdGl2ZSwgdGhlbiB0aGUKKyAgY2FsbCBjYW5ub3QgYmUgbWFkZSB1bmxlc3MgdGhlIGN1cnJlbnQgc3RhY2sgZnJhbWUgaXMgdGhlIGxleGljYWwgcGFyZW50CisgIG9mIHRoZSBlbnRyeS4gIEFuIGV4YW1wbGUgb2YgdGhpcyBpcyB3aGVuIGEgKFBhc2NhbCkgbmVzdGVkIHByb2NlZHVyZQorICBjb250YWlucyByZWZlcmVuY2VzIHRvIGl0cyBwYXJlbnQncyB2YXJpYWJsZXMsIHdoaWNoIGl0IGFjY2Vzc2VzIHRocm91Z2gKKyAgYSBzdGF0aWMgbGluayByZWdpc3Rlci4gIFRoZSBzdGF0aWMgbGluayByZWdpc3RlciBtdXN0IGJlIHNldCB0byBzb21lCisgIGFkZHJlc3MgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCdzIHN0YWNrIGJhc2UgcmVnaXN0ZXIuCisqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCAgICByZWc7ICAgICAgICAvKiBpZGVudGlmaWVzIHJlZ2lzdGVyIHRvIHNldCAoaXNwIGVudW0pICovCisgICAgZHN0X3JlbF9vZmZzZXRfdCAgbG9mZnNldDsgICAgLyogcmVmZXJlbmNlcyBhIGxvY2F0aW9uIHN0cmluZyAqLworICAgIH0KKyAgICBkc3RfcmVjX2F1eF9yZWdfdmFsX3QgQUxJR05FRDE7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qPT09PT09PT09PSBSRUNPUkRTIFVTRUQgSU4gLmJsb2NrcyBBTkQgLnN5bWJvbHMgPT09PT09PT09PSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBTVFJJTkcgVEFCTEUgcmVjb3JkCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBBIHN0cmluZyB0YWJsZSByZWNvcmQgY29udGFpbnMgYW55IG51bWJlciBvZiBudWxsLXRlcm1pbmF0ZWQsIHZhcmlhYmxlIGxlbmd0aAorICBzdHJpbmdzLiAgIFRoZSBsZW5ndGggZmllbGQgZ2l2ZXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHRleHQgZmllbGQsIHdoaWNoCisgIGNhbiBiZSBhbnkgc2l6ZS4KKworICBUaGUgZ2xvYmFsIG5hbWUgdGFibGUgc2hhcmVzIHRoaXMgZm9ybWF0LiAgVGhpcyByZWNvcmQgYXBwZWFycyBpbiB0aGUKKyAgLmJsb2NrcyBzZWN0aW9uLiAgRWFjaCBzdHJpbmcgaW4gdGhlIHRhYmxlIGlkZW50aWZpZXMgYSBnbG9iYWwgZGVmaW5lZCBpbgorICB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LgorCisgIFRoZSBsb2MgcG9vbCByZWNvcmQgc2hhcmVzIHRoaXMgZm9ybWF0IGFzIHdlbGwuICBMb2Mgc3RyaW5ncyBhcmUgZGVzY3JpYmVkCisgIGVsc2V3aGVyZS4KKyovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOyAgICAgICAgICAgICAgIAorICAgIGNoYXIgICAgICAgICAgdGV4dFtkc3RfZHVtbXlfYXJyYXlfc2l6ZV07CisgICAgfQorICAgIGRzdF9yZWNfc3RyaW5nX3RhYl90IEFMSUdORUQxOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQVVYSUxJQVJZIFFVQUwgcmVjb3JkIAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBNYXkgYXBwZWFyIGluIHRoZSBhdXhpbGlhcnkgcmVjb3JkIGxpc3Qgb2YgYW55IEJMT0NLLCBWQVJJQUJMRSwgb3IgdHlwZSByZWNvcmQKKyAgdG8gcHJvdmlkZSBpdCB3aXRoIGEgZnVsbHktcXVhbGlmaWVkLCBsYW5ndWFnZS1kZXBlbmRlbnQgbmFtZS4KKyovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIGRzdF9yZWxfb2Zmc2V0X3QgICBsYW5nX3F1YWxfbmFtZTsKKyAgICB9CisgICAgZHN0X3JlY19hdXhfcXVhbF90IEFMSUdORUQxOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLQorICBGT1JXQVJEIHJlY29yZAorICAtLS0tLS0tLS0tLS0tLS0tCisgIFJlZmVyZW5jZSB0byBhIHJlY29yZCBzb21ld2hlcmUgZWxzZS4gIFRoaXMgYWxsb3dzIGlkZW50aWNhbCBkZWZpbml0aW9ucyBpbgorICBkaWZmZXJlbnQgc2NvcGVzIHRvIHNoYXJlIGRhdGEuCisqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBkc3RfcmVsX29mZnNldF90ICAgcmVjX29mZjsKKyAgICB9CisgICAgZHN0X3JlY19mb3J3YXJkX3QgQUxJR05FRDE7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEFVWElMSUFSWSBTT1VSQ0UgUkFOR0UgcmVjb3JkCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgTWF5IGFwcGVhciBpbiB0aGUgYXV4aWxpYXJ5IHJlY29yZCBsaXN0IG9mIGFueSBCTE9DSyByZWNvcmQgdG8gc3BlY2lmeSBhCisgIHJhbmdlIG9mIHNvdXJjZSBsaW5lcyBvdmVyIHdoaWNoIHRoZSBibG9jayBpcyBhY3RpdmUuCisqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBkc3Rfc3JjX2xvY190ICAgZmlyc3RfbGluZTsgICAgICAgICAgICAgLyogZmlyc3Qgc291cmNlIGxpbmUgKi8KKyAgICBkc3Rfc3JjX2xvY190ICAgbGFzdF9saW5lOyAgICAgICAgICAgICAgLyogbGFzdCBzb3VyY2UgbGluZSAqLworICAgIH0KKyAgICBkc3RfcmVjX2F1eF9zcmNfcmFuZ2VfdCBBTElHTkVEMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLQorICBFWFRFTlNJT04gcmVjb3JkIAorICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAgUHJvdmlzaW9uIGZvciAiZm9yZWlnbiIgcmVjb3Jkcywgc3VjaCBhcyBtaWdodCBiZSBnZW5lcmF0ZWQgYnkgYSBub24tQXBvbGxvCisgIGNvbXBpbGVyLiAgQXBvbGxvIHNvZnR3YXJlIHdpbGwgaWdub3JlIHRoZXNlLgorKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgdW5zaWduZWQgc2hvcnQgIHJlY19zaXplOyAgIC8qIHJlY29yZCBzaXplIChieXRlcykgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCAgZXh0X3R5cGU7ICAgLyogZGVmaW5lZCBieSB3aG9ldmVyIGdlbmVyYXRlcyBpdCAqLworICAgIHVuc2lnbmVkIHNob3J0ICBleHRfZGF0YTsgICAvKiBwbGFjZS1ob2xkZXIgZm9yIGFyYml0cmFyeSBhbW91bnQgb2YgZGF0YSAqLworICAgIH0KKyAgICBkc3RfcmVjX2V4dGVuc2lvbl90IEFMSUdORUQxOworCisKKy8qCisqKiBERUJVRyBTWU1CT0wgcmVjb3JkIC0tIFRoZSB3cmFwcGVyIGZvciBhbGwgLmJsb2NrcyBhbmQgLnN5bWJvbHMgcmVjb3Jkcy4KKyoqCisqKiBUaGlzIHJlY29yZCB0aWVzIHRvZ2V0aGVyIGFsbCBwcmV2aW91cyAuYmxvY2tzIGFuZCAuc3ltYm9scyByZWNvcmRzIAorKiogdG9nZXRoZXIgaW4gYSB1bmlvbiB3aXRoIGEgY29tbW9uIGhlYWRlci4gIFRoZSByZWNfdHlwZSBmaWVsZCBvZiB0aGUKKyoqIGhlYWRlciBpZGVudGlmaWVzIHRoZSByZWNvcmQgdHlwZS4gIFRoZSByZWNfZmxhZ3MgZmllbGQgY3VycmVudGx5IG9ubHkKKyoqIGRlZmluZXMgYXV4aWxpYXJ5IHJlY29yZCBsaXN0cy4gCisqKgorKiogSWYgYSByZWNvcmQgY2FycmllcyB3aXRoIGl0IGEgbm9uLW51bGwgYXV4aWxpYXJ5IHJlY29yZCBsaXN0LCBpdHMKKyoqIGRzdF9mbGFnX2hhc19hdXhfcmVjcyBmbGFnIGlzIHNldCwgYW5kIGVhY2ggb2YgdGhlIHJlY29yZHMgdGhhdCBmb2xsb3cKKyoqIGl0IGFyZSB0cmVhdGVkIGFzIGl0cyBhdXhpbGlhcnkgcmVjb3JkcywgdW50aWwgdGhlIGVuZCBvZiB0aGUgY29tcGlsYXRpb24KKyoqIHVuaXQgb3Igc2NvcGUgaXMgcmVhY2hlZCwgb3IgdW50aWwgYW4gYXV4aWxpYXJ5IHJlY29yZCB3aXRoIGl0cworKiogZHN0X2ZsYWdfbGFzdF9hdXhfcmVjIGZsYWcgc2V0IGlzIHJlYWNoZWQuCisqLworCit0eXBlZGVmIGVudW0KKyAgICB7CisgICAgZHN0X2ZsYWdfaGFzX2F1eF9yZWNzLAorICAgIGRzdF9mbGFnX2xhc3RfYXV4X3JlYywKKyAgICBkc3RfcmVjX2ZsYWdfRU5EX09GX0VOVU0KKyAgICB9ICAgIAorICAgIGRzdF9yZWNfZmxhZ3NfdDsKKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgZHN0X3JlY190eXBlX3QgICAgcmVjX3R5cGUgOiA4OyAgICAgLyogcmVjb3JkIHR5cGUgKi8KKyAgICBpbnQgICAgICAgICAgICAgICByZWNfZmxhZ3M6IDg7ICAgICAvKiBtYXNrIG9mIGRzdF9yZWNfZmxhZ3NfdCAqLworICAgIHVuaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN3aXRjaGVkIG9uIHJlY190eXBlIGZpZWxkIGFib3ZlICovCisgICAgICAgIHsKKyAgICAgICAgICAgLyogZHN0X3R5cF9wYWQgcmVxdWlyZXMgbm8gYWRkaXRpb25hbCBmaWVsZHMgKi8KKyAgICAgICAgZHN0X3JlY19jb21wX3VuaXRfdCAgICAgICAgY29tcF91bml0XzsKKyAgICAgICAgZHN0X3JlY19zZWN0aW9uX3RhYl90ICAgICAgc2VjdGlvbl90YWJfOworICAgICAgICBkc3RfcmVjX2ZpbGVfdGFiX3QgICAgICAgICBmaWxlX3RhYl87ICAKKyAgICAgICAgZHN0X3JlY19ibG9ja190ICAgICAgICAgICAgYmxvY2tfOyAgIAorCWRzdF9yZWNfdmFyX3QJCSAgIHZhcl87CisgICAgICAgIGRzdF9yZWNfcG9pbnRlcl90ICAgICAgICAgIHBvaW50ZXJfOyAgIAorICAgICAgICBkc3RfcmVjX2FycmF5X3QgICAgICAgICAgICBhcnJheV87IAorICAgICAgICBkc3RfcmVjX3N1YnJhbmdlX3QgICAgICAgICBzdWJyYW5nZV87CisgICAgICAgIGRzdF9yZWNfc2V0X3QgICAgICAgICAgICAgIHNldF87CisgICAgICAgIGRzdF9yZWNfaW1wbGljaXRfZW51bV90ICAgIGltcGxpY2l0X2VudW1fOyAgIAorICAgICAgICBkc3RfcmVjX2V4cGxpY2l0X2VudW1fdCAgICBleHBsaWNpdF9lbnVtXzsKKyAgICAgICAgICAgLyogZHN0X3R5cF9zaG9ydF97cmVjLHVuaW9ufSBhcmUgcmVwcmVzZW50ZWQgYnkgJ3JlYycgKGJlbG93KSAqLworICAgICAgICBkc3RfcmVjX2ZpbGVfdCAgICAgICAgICAgICBmaWxlXzsgICAKKyAgICAgICAgZHN0X3JlY19vZmZzZXRfdCAgICAgICAgICAgb2Zmc2V0XzsgICAKKyAgICAgICAgZHN0X3JlY19hbGlhc190ICAgICAgICAgICAgYWxpYXNfOyAKKyAgICAgICAgZHN0X3JlY19zaWduYXR1cmVfdCAgICAgICAgc2lnbmF0dXJlXzsKKwlkc3RfcmVjX29sZF9sYWJlbF90CSAgIG9sZF9sYWJlbF87CisJZHN0X3JlY19zY29wZV90CQkgICBzY29wZV87CisgICAgICAgICAgIC8qIGRzdF90eXBfZW5kX3Njb3BlIHJlcXVpcmVzIG5vIGFkZGl0aW9uYWwgZmllbGRzICovCisgICAgICAgIGRzdF9yZWNfc3RyaW5nX3RhYl90ICAgICAgIHN0cmluZ190YWJfOyAgIAorICAgICAgICAgICAvKiBkc3RfdHlwX2dsb2JhbF9uYW1lX3RhYiBpcyByZXByZXNlbnRlZCBieSAnc3RyaW5nX3RhYicgKGFib3ZlKSAqLworICAgICAgICBkc3RfcmVjX2ZvcndhcmRfdCAgICAgICAgICBmb3J3YXJkXzsgICAKKyAgICAgICAgZHN0X3JlY19hdXhfc2l6ZV90ICAgICAgICAgYXV4X3NpemVfOyAgIAorICAgICAgICBkc3RfcmVjX2F1eF9hbGlnbl90ICAgICAgICBhdXhfYWxpZ25fOyAgCisgICAgICAgIGRzdF9yZWNfYXV4X2ZpZWxkX3NpemVfdCAgIGF1eF9maWVsZF9zaXplXzsgCisgICAgICAgIGRzdF9yZWNfYXV4X2ZpZWxkX29mZl90ICAgIGF1eF9maWVsZF9vZmZfOworICAgICAgICBkc3RfcmVjX2F1eF9maWVsZF9hbGlnbl90ICBhdXhfZmllbGRfYWxpZ25fOworICAgICAgICBkc3RfcmVjX2F1eF9xdWFsX3QgICAgICAgICBhdXhfcXVhbF87ICAgCisgICAgICAgIGRzdF9yZWNfYXV4X3Zhcl9ib3VuZF90ICAgIGF1eF92YXJfYm91bmRfOyAgCisgICAgICAgIGRzdF9yZWNfZXh0ZW5zaW9uX3QgICAgICAgIGV4dGVuc2lvbl87CisgICAgICAgIGRzdF9yZWNfc3RyaW5nX3QgICAgICAgICAgIHN0cmluZ187ICAKKyAgICAgICAgZHN0X3JlY19jb25zdF90ICAgICAgICAgICAgY29uc3RfOyAKKyAgICAgICAgICAgLyogZHN0X3R5cF9yZWZlcmVuY2UgaXMgcmVwcmVzZW50ZWQgYnkgJ3BvaW50ZXInIChhYm92ZSkgKi8KKyAgICAgICAgZHN0X3JlY19yZWNvcmRfdCAgICAgICAgICAgcmVjb3JkXzsgCisgICAgICAgICAgIC8qIGRzdF90eXBfdW5pb24gaXMgcmVwcmVzZW50ZWQgYnkgJ3JlY29yZCcgKGFib3ZlKSAqLworICAgICAgICBkc3RfcmVjX2F1eF90eXBlX2Rlcml2X3QgICBhdXhfdHlwZV9kZXJpdl87IAorICAgICAgICAgICAvKiBkc3RfdHlwX2xvY3Bvb2wgaXMgcmVwcmVzZW50ZWQgYnkgJ3N0cmluZ190YWInIChhYm92ZSkgKi8KKyAgICAgICAgZHN0X3JlY192YXJpYWJsZV90ICAgICAgICAgdmFyaWFibGVfOyAgCisgICAgICAgIGRzdF9yZWNfbGFiZWxfdCAgICAgICAgICAgIGxhYmVsXzsgCisgICAgICAgIGRzdF9yZWNfZW50cnlfdCAgICAgICAgICAgIGVudHJ5XzsgCisgICAgICAgIGRzdF9yZWNfYXV4X2xpZmV0aW1lX3QgICAgIGF1eF9saWZldGltZV87CisgICAgICAgIGRzdF9yZWNfYXV4X3B0cl9iYXNlX3QgICAgIGF1eF9wdHJfYmFzZV87CisgICAgICAgIGRzdF9yZWNfYXV4X3NyY19yYW5nZV90ICAgIGF1eF9zcmNfcmFuZ2VfOyAgCisgICAgICAgIGRzdF9yZWNfYXV4X3JlZ192YWxfdCAgICAgIGF1eF9yZWdfdmFsXzsKKyAgICAgICAgZHN0X3JlY19uYW1lX3RhYl90ICAgICAgICAgYXV4X3VuaXRfbmFtZXNfOworICAgICAgICBkc3RfcmVjX3NlY3RfaW5mb190YWJfdCAgICBhdXhfc2VjdF9pbmZvXzsKKyAgICAgICAgfQorICAgICAgICByZWNfZGF0YSAgICBBTElHTkVEMTsKKyAgICB9CisgICAgZHN0X3JlY190LCAqZHN0X3JlY19wdHJfdDsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qPT09PT09PT09PSAubGluZXMgU0VDVElPTiBERUZJTklUSU9OUyA9PT09PT09PT0qLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKgorICBUaGUgLmxpbmVzIHNlY3Rpb24gY29udGFpbnMgYSBzZXF1ZW5jZSBvZiBsaW5lIG51bWJlciB0YWJsZXMuICBUaGVyZSBpcyBubworICByZWNvcmQgc3RydWN0dXJlIHdpdGhpbiB0aGUgc2VjdGlvbi4gIFRoZSBzdGFydCBvZiB0aGUgdGFibGUgZm9yIGEgcm91dGluZQorICBpcyBwb2ludGVkIHRvIGJ5IHRoZSBibG9jayByZWNvcmQsIGFuZCB0aGUgZW5kIG9mIHRoZSB0YWJsZSBpcyBzaWduYWxlZCBieQorICBhbiBlc2NhcGUgY29kZS4KKworICBBIGxpbmUgbnVtYmVyIHRhYmxlIGlzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuICBUaGUgZGVmYXVsdCBlbnRyeSBjb250YWlucyBhIGxpbmUKKyAgbnVtYmVyIGRlbHRhICgtNy4uKzcpIGluIHRoZSBoaWdoIDQgYml0cyBhbmQgYSBwYyBkZWx0YSAoMC4uMTUpIGluIHRoZSBsb3cgNCAKKyAgYml0cy4gU3BlY2lhbCBjYXNlcywgaW5jbHVkaW5nIHdoZW4gb25lIG9yIGJvdGggb2YgdGhlIHZhbHVlcyBpcyB0b28gbGFyZ2UKKyAgdG8gZml0IGluIDQgYml0cyBhbmQgb3RoZXIgc3BlY2lhbCBjYXNlcyBhcmUgaGFuZGxlZCB0aHJvdWdoIGVzY2FwZSBlbnRyaWVzLgorICBFc2NhcGUgZW50cmllcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgdmFsdWUgMHg4IGluIHRoZSBoaWdoIDQgYml0cy4gIFRoZSBsb3cgNAorICBiaXRzIGFyZSBvY2N1cGllZCBieSBhIGZ1bmN0aW9uIGNvZGUuICBTb21lIGVzY2FwZSBlbnRyaWVzIGFyZSBmb2xsb3dlZCBieQorICBhZGRpdGlvbmFsIGFyZ3VtZW50cywgd2hpY2ggbWF5IGJlIGJ5dGVzLCB3b3Jkcywgb3IgbG9uZ3dvcmRzLiAgVGhpcyBkYXRhIGlzCisgIG5vdCBhbGlnbmVkLiAKKworICBUaGUgaW5pdGlhbCBQQyBvZmZzZXQsIGZpbGUgbnVtYmVyIGFuZCBsaW5lIG51bWJlciBhcmUgemVyby4gIE5vcm1hbGx5LCB0aGUKKyAgdGFibGUgYmVnaW5zIHdpdGggYSBkc3RfbG5fZmlsZSBlc2NhcGUgd2hpY2ggZXN0YWJsaXNoZXMgdGhlIGluaXRpYWwgZmlsZQorICBhbmQgbGluZSBudW1iZXIuICBBbGwgUEMgZGVsdGFzIGFyZSB1bnNpZ25lZCAodGh1cyB0aGUgdGFibGUgaXMgb3JkZXJlZCBieQorICBpbmNyZWFzaW5nIFBDKTsgbGluZSBudW1iZXIgZGVsdGFzIGFyZSBzaWduZWQuICBUaGUgdGFibGUgZW5kcyB3aXRoIGEgCisgIGRzdF9sbl9lbmQgZXNjYXBlLCB3aGljaCBpcyBmb2xsb3dlZCBieSBhIGZpbmFsIHRhYmxlIGVudHJ5IHdob3NlIFBDIGRlbHRhCisgIGdpdmVzIHRoZSBjb2RlIHNpemUgb2YgdGhlIGxhc3Qgc3RhdGVtZW50LgorCisgIEVzY2FwZSAgICAgU2VtYW50aWMKKyAgLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgZmlsZSAgICAgICBDaGFuZ2VzIGZpbGUgc3RhdGUuICBUaGUgY3VycmVudCBzb3VyY2UgZmlsZSByZW1haW5zIGNvbnN0YW50CisgICAgICAgICAgICAgdW50aWwgYW5vdGhlciBmaWxlIGVzY2FwZS4gIFRob3VnaCB0aGUgbGluZSBudW1iZXIgc3RhdGUgaXMKKyAgICAgICAgICAgICBhbHNvIHVwZGF0ZWQgYnkgYSBmaWxlIGVzY2FwZSwgYSBmaWxlIGVzY2FwZSBkb2VzIE5PVCAKKyAgICAgICAgICAgICBjb25zdGl0dXRlIGEgbGluZSB0YWJsZSBlbnRyeS4KKworICBzdGF0ZW1lbnQgIEFsdGVycyB0aGUgc3RhdGVtZW50IG51bWJlciBvZiB0aGUgbmV4dCB0YWJsZSBlbnRyeS4gIEJ5IAorICAgICAgICAgICAgIGRlZmF1bHQsIGFsbCB0YWJsZSBlbnRyaWVzIHJlZmVyIHRvIHRoZSBmaXJzdCBzdGF0ZW1lbnQgb24gYQorICAgICAgICAgICAgIGxpbmUuICBTdGF0ZW1lbnQgbnVtYmVyIG9uZSBpcyB0aGUgc2Vjb25kIHN0YXRlbWVudCwgYW5kIHNvIG9uLgorCisgIGVudHJ5ICAgICAgSWRlbnRpZmllcyB0aGUgbmV4dCB0YWJsZSBlbnRyeSBhcyB0aGUgcG9zaXRpb24gb2YgYW4gZW50cnkgCisgICAgICAgICAgICAgcG9pbnQgZm9yIHRoZSBjdXJyZW50IGJsb2NrLiAgVGhlIFBDIHBvc2l0aW9uIHNob3VsZCBmb2xsb3cgCisgICAgICAgICAgICAgYW55IHByb2NlZHVyZSBwcm9sb2d1ZSBjb2RlLiAgQW4gYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBlbnRyeQorICAgICAgICAgICAgIG51bWJlciwgd2hpY2ggaXMga2V5ZWQgdG8gdGhlIGVudHJ5IG51bWJlciBvZiB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgICAgIC5zeW1ib2xzIEVOVFJZIHJlY29yZC4KKworICBleGl0ICAgICAgIElkZW50aWZpZXMgdGhlIG5leHQgdGFibGUgZW50cnkgYXMgdGhlIGxhc3QgcG9zaXRpb24gd2l0aGluIAorICAgICAgICAgICAgIHRoZSBjdXJyZW50IGJsb2NrIGJlZm9yZSBhIHByb2NlZHVyZSBlcGlsb2dlIGFuZCBzdWJzZXF1ZW50CisgICAgICAgICAgICAgcHJvY2VkdXJlIGV4aXQuCisKKyAgZ2FwICAgICAgICBCeSBkZWZhdWx0LCB0aGUgZXhlY3V0YWJsZSBjb2RlIGNvcnJlc3BvbmRpbmcgdG8gYSB0YWJsZSBlbnRyeSAKKyAgICAgICAgICAgICBpcyBhc3N1bWVkIHRvIGV4dGVuZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHRhYmxlIGVudHJ5LgorICAgICAgICAgICAgIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLS10aGVyZSBpcyBhICJob2xlIiBpbiB0aGUgdGFibGUtLXRoZW4KKyAgICAgICAgICAgICBhIGdhcCBlc2NhcGUgc2hvdWxkIGZvbGxvdyB0aGUgZmlyc3QgdGFibGUgZW50cnkgdG8gc3BlY2lmeQorICAgICAgICAgICAgIHdoZXJlIHRoZSBjb2RlIGZvciB0aGF0IGVudHJ5IGVuZHMuCisqLworCisjZGVmaW5lIGRzdF9sbl9lc2NhcGVfZmxhZyAgICAtOCAgICAKKworLyoKKyAgRXNjYXBlIGZ1bmN0aW9uIGNvZGVzOgorKi8KK3R5cGVkZWYgZW51bQorICAgIHsKKyAgICBkc3RfbG5fcGFkLCAgICAgICAgICAvKiBwYWQgYnl0ZSAqLworICAgIGRzdF9sbl9maWxlLCAgICAgICAgIC8qIGZpbGUgZXNjYXBlLiAgTmV4dCA0IGJ5dGVzIGFyZSBhIGRzdF9zcmNfbG9jX3QgKi8KKyAgICBkc3RfbG5fZGxuMV9kcGMxLCAgICAvKiAxIGJ5dGUgbGluZSBkZWx0YSwgMSBieXRlIHBjIGRlbHRhICovICAgIAorICAgIGRzdF9sbl9kbG4yX2RwYzIsICAgIC8qIDIgYnl0ZXMgbGluZSBkZWx0YSwgMiBieXRlcyBwYyBkZWx0YSAqLworICAgIGRzdF9sbl9sbjRfcGM0LCAgICAgIC8qIDQgYnl0ZXMgQUJTT0xVVEUgbGluZSBudW1iZXIsIDQgYnl0ZXMgQUJTT0xVVEUgcGMgKi8KKyAgICBkc3RfbG5fZGxuMV9kcGMwLCAgICAvKiAxIGJ5dGUgbGluZSBkZWx0YSwgcGMgZGVsdGEgPSAwICovCisgICAgZHN0X2xuX2xuX29mZl8xLCAgICAgLyogc3RhdGVtZW50IGVzY2FwZSwgc3RtdCAjID0gMSAoMm5kIHN0bXQgb24gbGluZSkgKi8KKyAgICBkc3RfbG5fbG5fb2ZmLCAgICAgICAvKiBzdGF0ZW1lbnQgZXNjYXBlLCBzdG10ICMgPSBuZXh0IGJ5dGUgKi8KKyAgICBkc3RfbG5fZW50cnksICAgICAgICAvKiBlbnRyeSBlc2NhcGUsIG5leHQgYnl0ZSBpcyBlbnRyeSBudW1iZXIgKi8gICAgCisgICAgZHN0X2xuX2V4aXQsICAgICAgICAgLyogZXhpdCBlc2NhcGUgKi8KKyAgICBkc3RfbG5fc3RtdF9lbmQsICAgICAvKiBnYXAgZXNjYXBlLCA0IGJ5dGVzIHBjIGRlbHRhICovCisgICAgZHN0X2xuX2VzY2FwZV8xMSwgICAgLyogcmVzZXJ2ZWQgKi8KKyAgICBkc3RfbG5fZXNjYXBlXzEyLCAgICAvKiByZXNlcnZlZCAqLworICAgIGRzdF9sbl9lc2NhcGVfMTMsICAgIC8qIHJlc2VydmVkICovCisgICAgZHN0X2xuX254dF9ieXRlLCAgICAgLyogbmV4dCBieXRlIGNvbnRhaW5zIHRoZSByZWFsIGVzY2FwZSBjb2RlICovCisgICAgZHN0X2xuX2VuZCwgICAgICAgICAgLyogZW5kIGVzY2FwZSwgZmluYWwgZW50cnkgZm9sbG93cyAqLworICAgIGRzdF9sbl9lc2NhcGVfRU5EX09GX0VOVU0KKyAgICB9ICAgIAorICAgIGRzdF9sbl9lc2NhcGVfdDsKKworLyoKKyAgTGluZSBudW1iZXIgdGFibGUgZW50cnkKKyovCit0eXBlZGVmIHVuaW9uCisgICAgeworICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCAgICBsbl9kZWx0YSA6IDQ7ICAgICAgICAgICAvKiA0IGJpdCBsaW5lIG51bWJlciBkZWx0YSAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICAgcGNfZGVsdGEgOiA0OyAgICAgICAgICAgLyogNCBiaXQgcGMgZGVsdGEgKi8KKyAgICAgICAgfQorICAgICAgICBkZWx0YTsKKyAgICAKKyAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgICAgZXNjX2ZsYWcgOiA0OyAgICAgICAvKiBhbGlhcyBmb3IgbG5fZGVsdGEgKi8KKyAgICAgICAgZHN0X2xuX2VzY2FwZV90IGVzY19jb2RlIDogNDsgICAgICAgLyogZXNjYXBlIGZ1bmN0aW9uIGNvZGUgKi8KKyAgICAgICAgfQorICAgICAgICBlc2M7CisgICAgCisgICAgY2hhciAgICAgICAgICAgICAgIHNkYXRhOyAgICAgICAgICAgICAgICAgIC8qIHNpZ25lZCBkYXRhIGJ5dGUgKi8gICAgCisgICAgdW5zaWduZWQgY2hhciAgICAgIHVkYXRhOyAgICAgICAgICAgICAgICAgIC8qIHVuc2lnbmVkIGRhdGEgYnl0ZSAqLworICAgIH0KKyAgICBkc3RfbG5fZW50cnlfdCwKKyAgICAqZHN0X2xuX2VudHJ5X3B0cl90LAorICAgIGRzdF9sbl90YWJsZV90W2RzdF9kdW1teV9hcnJheV9zaXplXTsKKworLyogVGhlIGZvbGxvd2luZyBtYWNybyB3aWxsIGV4dHJhY3QgdGhlIGxuX2RlbHRhIGZpZWxkIGFzIGEgc2lnbmVkIHZhbHVlOgorKi8KKyNkZWZpbmUgZHN0X2xuX2xuX2RlbHRhKGxuX3JlYykgXAorICAgICggKChzaG9ydCkgKChsbl9yZWMpLmRlbHRhLmxuX2RlbHRhIDw8IDEyKSkgPj4gMTIgKQorCisKKworCit0eXBlZGVmIHN0cnVjdCBkc3Rfc2VjX3N0cnVjdCB7CisJY2hhcgkqYnVmZmVyOworCWxvbmcJcG9zaXRpb247CisJbG9uZwlzaXplOworCWxvbmcJYmFzZTsKK30gZHN0X3NlYzsKKworCisvKiBNYWNyb3MgZm9yIGFjY2VzcyB0byB0aGUgZGF0YSAqLworCisjZGVmaW5lIERTVF9jb21wX3VuaXQoeCkgCSgoeCktPnJlY19kYXRhLmNvbXBfdW5pdF8pCisjZGVmaW5lIERTVF9zZWN0aW9uX3RhYih4KSAJKCh4KS0+cmVjX2RhdGEuc2VjdGlvbl90YWJfKQorI2RlZmluZSBEU1RfZmlsZV90YWIoeCkgCSgoeCktPnJlY19kYXRhLmZpbGVfdGFiXykKKyNkZWZpbmUgRFNUX2Jsb2NrKHgpIAkJKCh4KS0+cmVjX2RhdGEuYmxvY2tfKQorI2RlZmluZQlEU1RfdmFyKHgpCQkoKHgpLT5yZWNfZGF0YS52YXJfKQorI2RlZmluZSBEU1RfcG9pbnRlcih4KSAJCSgoeCktPnJlY19kYXRhLnBvaW50ZXJfKQorI2RlZmluZSBEU1RfYXJyYXkoeCkgCQkoKHgpLT5yZWNfZGF0YS5hcnJheV8pCisjZGVmaW5lIERTVF9zdWJyYW5nZSh4KSAJKCh4KS0+cmVjX2RhdGEuc3VicmFuZ2VfKQorI2RlZmluZSBEU1Rfc2V0KHgpCSAJKCh4KS0+cmVjX2RhdGEuc2V0XykKKyNkZWZpbmUgRFNUX2ltcGxpY2l0X2VudW0oeCkgCSgoeCktPnJlY19kYXRhLmltcGxpY2l0X2VudW1fKQorI2RlZmluZSBEU1RfZXhwbGljaXRfZW51bSh4KSAJKCh4KS0+cmVjX2RhdGEuZXhwbGljaXRfZW51bV8pCisjZGVmaW5lIERTVF9zaG9ydF9yZWMoeCkgCSgoeCktPnJlY19kYXRhLnJlY29yZF8pCisjZGVmaW5lIERTVF9zaG9ydF91bmlvbih4KSAJKCh4KS0+cmVjX2RhdGEucmVjb3JkXykKKyNkZWZpbmUgRFNUX2ZpbGUoeCkgCQkoKHgpLT5yZWNfZGF0YS5maWxlXykKKyNkZWZpbmUgRFNUX29mZnNldCh4KSAJCSgoeCktPnJlY19kYXRhLm9mZnNldF8pCisjZGVmaW5lIERTVF9hbGlhcyh4KQkgCSgoeCktPnJlY19kYXRhLmFsaWFzXykKKyNkZWZpbmUgRFNUX3NpZ25hdHVyZSh4KSAJKCh4KS0+cmVjX2RhdGEuc2lnbmF0dXJlXykKKyNkZWZpbmUgRFNUX29sZF9sYWJlbCh4KSAJKCh4KS0+cmVjX2RhdGEub2xkX2xhYmVsXykKKyNkZWZpbmUgRFNUX3Njb3BlKHgpIAkJKCh4KS0+cmVjX2RhdGEuc2NvcGVfKQorI2RlZmluZSBEU1Rfc3RyaW5nX3RhYih4KSAJKCh4KS0+cmVjX2RhdGEuc3RyaW5nX3RhYl8pCisjZGVmaW5lIERTVF9nbG9iYWxfbmFtZV90YWIoeCkgCSgoeCktPnJlY19kYXRhLnN0cmluZ190YWJfKQorI2RlZmluZSBEU1RfZm9yd2FyZCh4KSAJCSgoeCktPnJlY19kYXRhLmZvcndhcmRfKQorI2RlZmluZSBEU1RfYXV4X3NpemUoeCkgCSgoeCktPnJlY19kYXRhLmF1eF9zaXplXykKKyNkZWZpbmUgRFNUX2F1eF9hbGlnbih4KSAJKCh4KS0+cmVjX2RhdGEuYXV4X2FsaWduXykKKyNkZWZpbmUgRFNUX2F1eF9maWVsZF9zaXplKHgpIAkoKHgpLT5yZWNfZGF0YS5hdXhfZmllbGRfc2l6ZV8pCisjZGVmaW5lIERTVF9hdXhfZmllbGRfb2ZmKHgpIAkoKHgpLT5yZWNfZGF0YS5hdXhfZmllbGRfb2ZmXykKKyNkZWZpbmUgRFNUX2F1eF9maWVsZF9hbGlnbih4KSAJKCh4KS0+cmVjX2RhdGEuYXV4X2ZpZWxkX2FsaWduXykKKyNkZWZpbmUgRFNUX2F1eF9xdWFsKHgpIAkoKHgpLT5yZWNfZGF0YS5hdXhfcXVhbF8pCisjZGVmaW5lIERTVF9hdXhfdmFyX2JvdW5kKHgpIAkoKHgpLT5yZWNfZGF0YS5hdXhfdmFyX2JvdW5kXykKKyNkZWZpbmUgRFNUX2V4dGVuc2lvbih4KSAJKCh4KS0+cmVjX2RhdGEuZXh0ZW5zaW9uXykKKyNkZWZpbmUgRFNUX3N0cmluZyh4KSAJCSgoeCktPnJlY19kYXRhLnN0cmluZ18pCisjZGVmaW5lIERTVF9jb25zdCh4KSAJCSgoeCktPnJlY19kYXRhLmNvbnN0XykKKyNkZWZpbmUgRFNUX3JlZmVyZW5jZSh4KSAJKCh4KS0+cmVjX2RhdGEucG9pbnRlcl8pCisjZGVmaW5lIERTVF9yZWNvcmQoeCkgCQkoKHgpLT5yZWNfZGF0YS5yZWNvcmRfKQorI2RlZmluZSBEU1RfdW5pb24oeCkgCQkoKHgpLT5yZWNfZGF0YS5yZWNvcmRfKQorI2RlZmluZSBEU1RfYXV4X3R5cGVfZGVyaXYoeCkgCSgoeCktPnJlY19kYXRhLmF1eF90eXBlX2Rlcml2XykKKyNkZWZpbmUgRFNUX2xvY3Bvb2woeCkgCQkoKHgpLT5yZWNfZGF0YS5zdHJpbmdfdGFiXykKKyNkZWZpbmUgRFNUX3ZhcmlhYmxlKHgpIAkoKHgpLT5yZWNfZGF0YS52YXJpYWJsZV8pCisjZGVmaW5lIERTVF9sYWJlbCh4KSAJCSgoeCktPnJlY19kYXRhLmxhYmVsXykKKyNkZWZpbmUgRFNUX2VudHJ5KHgpIAkJKCh4KS0+cmVjX2RhdGEuZW50cnlfKQorI2RlZmluZSBEU1RfYXV4X2xpZmV0aW1lKHgpIAkoKHgpLT5yZWNfZGF0YS5hdXhfbGlmZXRpbWVfKQorI2RlZmluZSBEU1RfYXV4X3B0cl9iYXNlKHgpIAkoKHgpLT5yZWNfZGF0YS5hdXhfcHRyX2Jhc2VfKQorI2RlZmluZSBEU1RfYXV4X3NyY19yYW5nZSh4KSAJKCh4KS0+cmVjX2RhdGEuYXV4X3NyY19yYW5nZV8pCisjZGVmaW5lIERTVF9hdXhfcmVnX3ZhbCh4KSAJKCh4KS0+cmVjX2RhdGEuYXV4X3JlZ192YWxfKQorI2RlZmluZSBEU1RfYXV4X3VuaXRfbmFtZXMoeCkgCSgoeCktPnJlY19kYXRhLmF1eF91bml0X25hbWVzXykKKyNkZWZpbmUgRFNUX2F1eF9zZWN0X2luZm8oeCkgCSgoeCktPnJlY19kYXRhLmF1eF9zZWN0X2luZm9fKQorCisKKy8qCisgKiBUeXBlIGNvZGVzIGZvciBsb2Mgc3RyaW5ncy4gSSdtIG5vdCBlbnRpcmVseSBjZXJ0YWluIGFib3V0IGFsbCBvZgorICogdGhlc2UsIGJ1dCB0aGV5IHNlZW0gdG8gd29yay4KKyAqCQkJCXRyb3lAY2JtZS51bnN3LkVEVS5BVQorICogSWYgeW91IGZpbmQgYSB2YXJpYWJsZSB3aG9zZSBsb2NhdGlvbiBjYW4ndCBiZSBkZWNvZGVkLCB5b3Ugc2hvdWxkCisgKiBmaW5kIG91dCBpdCdzIGNvZGUgdXNpbmcgImRzdGR1bXAgLXMgZmlsZW5hbWUiLiBJdCB3aWxsIHJlY29yZCBhbgorICogZW50cnkgZm9yIHRoZSB2YXJpYWJsZSwgYW5kIGdpdmUgYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHdoYXQKKyAqIHRoZSBsb2NzdHJpbmcgbWVhbnMuIEJlZm9yZSB0aGF0IGV4cGxhaW5hdGlvbiB0aGVyZSB3aWxsIGJlIGEKKyAqIG51bWJlci4gSW4gdGhlIExPQ1NUUklORyB0YWJsZSwgdGhhdCBudW1iZXIgd2lsbCBhcHBlYXIgYmVmb3JlCisgKiB0aGUgc3RhcnQgb2YgdGhlIGxvY2F0aW9uIHN0cmluZy4gTG9jYXRpb24gc3RyaW5nIGNvZGVzIGFyZQorICogZml2ZSBiaXQgY29kZXMgd2l0aCBhIDMgYml0IGFyZ3VtZW50LiBDaGVjayB0aGUgaGlnaCA1IGJpdHMgb2YKKyAqIHRoZSBvbmUgYnl0ZSBjb2RlLCBhbmQgZmlndXJlIG91dCB3aGVyZSBpdCBnb2VzIGluIGhlcmUuCisgKiBUaGVuIGZpZ3VyZSBvdXQgZXhhY3RseSB3aGF0IHRoZSBtZWFuaW5nIGlzIGFuZCBjb2RlIGl0IGluCisgKiBkc3RyZWFkLmMKKyAqCisgKiBOb3RlIHRoYXQgcmFuZ2VkIGxvY3MgbWVhbiB0aGF0IHRoZSB2YXJpYWJsZSBpcyBpbiBkaWZmZXJlbnQgbG9jYXRpb25zCisgKiBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgUEMuIFdlIGlnbm9yZSB0aGVzZSBiZWNhdXNlIChhKSBnY2MgY2FuJ3QgaGFuZGxlCisgKiB0aGVtLCBhbmQgKGIpLCBJZiB5b3UgZG9uJ3QgdXNlIGhpZ2ggbGV2ZWxzIG9mIG9wdGltaXNhdGlvbiB0aGV5IHdvbid0CisgKiBvY2N1ci4KKyAqLwordHlwZWRlZiBlbnVtCit7CisJZHN0X2xzY19lbmQsCQkvKiBFbmQgb2Ygc3RyaW5nICovCisJZHN0X2xzY19pbmRpcmVjdCwJLyogSW5kaXJlY3QgdGhyb3VnaCBwcmV2aW91cy4gQXJnID09IDYgKi8KKwkJCQkvKiBPciByZWdpc3RlciBheCAoeD1hcmcpICovCisJZHN0X2xzY19kcmVnLAkJLyogcmVnaXN0ZXIgZHggKHg9YXJnKSAqLworCWRzdF9sc2NfMDMsCisJZHN0X2xzY19zZWN0aW9uLAkvKiBTZWN0aW9uIChhcmcrMSkgKi8KKwlkc3RfbHNjXzA1LAorCWRzdF9sc2NfMDYsCisJZHN0X2xzY19hZGQsCQkvKiBBZGQgKGFyZysxKSoyICovCisJZHN0X2xzY19zdWIsCQkvKiBTdWJ0cmFjdCAoYXJnKzEpKjIgKi8KKwlkc3RfbHNjXzA5LAorCWRzdF9sc2NfMGEsCisJZHN0X2xzY19zZWNfYnl0ZSwJLyogU2VjdGlvbiBvZiBuZXh0IGJ5dGUrMSAqLworCWRzdF9sc2NfYWRkX2J5dGUsCS8qIEFkZCBuZXh0IGJ5dGUgKGFyZyA9PSA1KSBvciBuZXh0IHdvcmQKKwkJCQkgKiAoYXJnID09IDYpCisJCQkJICovCisJZHN0X2xzY19zdWJfYnl0ZSwJLyogU3VidHJhY3QgbmV4dCBieXRlLiAoYXJnID09IDEpIG9yIG5leHQKKwkJCQkgKiB3b3JkIChhcmcgPT0gNiA/KQorCQkJCSAqLworCWRzdF9sc2Nfc2JyZWcsCQkvKiBTdGFjayBiYXNlIHJlZ2lzdGVyIChmcmFtZSBwb2ludGVyKS4gQXJnPT0wKi8KKwlkc3RfbHNjXzBmLAorCWRzdF9sc2NfcmFuZ2VkLAkJLyogbG9jYXRpb24gaXMgcGMgZGVwZW5kZW50ICovCisJZHN0X2xzY18xMSwKKwlkc3RfbHNjXzEyLAorCWRzdF9sc2NfMTMsCisJZHN0X2xzY18xNCwKKwlkc3RfbHNjXzE1LAorCWRzdF9sc2NfMTYsCisJZHN0X2xzY18xNywKKwlkc3RfbHNjXzE4LAorCWRzdF9sc2NfMTksCisJZHN0X2xzY18xYSwKKwlkc3RfbHNjXzFiLAorCWRzdF9sc2NfMWMsCisJZHN0X2xzY18xZCwKKwlkc3RfbHNjXzFlLAorCWRzdF9sc2NfMWYKK30gZHN0X2xvY19zdHJpbmdfY29kZV90OworCisvKiBJZiB0aGUgZm9sbG93aW5nIG9jY3VycyBhZnRlciBhbiBhZGRpdGlvbi9zdWJ0cmFjdGlvbiwgdGhhdCBhZGRpdGlvbgorICogb3Igc3VidHJhY3Rpb24gc2hvdWxkIGJlIG11bHRpcGxpZWQgYnkgMjU2LiBJdCdzIGEgY29tcGxldGUgYnl0ZSwgbm90CisgKiBhIGNvZGUuCisgKi8KKworI2RlZmluZQlkc3RfbXVsdGlwbHlfMjU2CSgoY2hhcikgMHg3MykKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKwljaGFyCWNvZGUgOiA1OworCWNoYXIJYXJnIDogMzsKK30gZHN0X2xvY19oZWFkZXJfdCBBTElHTkVEMTsKKwordHlwZWRlZiB1bmlvbgoreworCWRzdF9sb2NfaGVhZGVyX3QgaGVhZGVyOworCWNoYXIJZGF0YTsKK30gZHN0X2xvY19lbnRyeV90IEFMSUdORUQxOworCisjdW5kZWYgQUxJR05FRDEKKyNlbmRpZiAgLyogYXBvbGxvX2RzdF9oICovCmRpZmYgLS1naXQgYS9nZGIvZHN0cmVhZC5jIGIvZ2RiL2RzdHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjNmOWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2RzdHJlYWQuYwpAQCAtMCwwICsxLDE2NjUgQEAKKy8qIFJlYWQgYXBvbGxvIERTVCBzeW1ib2wgdGFibGVzIGFuZCBjb252ZXJ0IHRvIGludGVybmFsIGZvcm1hdCwgZm9yIEdEQi4KKyAgIENvbnRyaWJ1dGVkIGJ5IFRyb3kgUm9sbG8sIFVuaXZlcnNpdHkgb2YgTlNXICh0cm95QGNibWUudW5zdy5lZHUuYXUpLgorICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKwwKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJicmVha3BvaW50LmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgIm9iamZpbGVzLmgiCisjaW5jbHVkZSAiYnVpbGRzeW0uaCIKKyNpbmNsdWRlICJvYnN0YWNrLmgiCisKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisKKyNpbmNsdWRlICJkc3QuaCIKKworQ09SRV9BRERSIGN1cl9zcmNfc3RhcnRfYWRkciwgY3VyX3NyY19lbmRfYWRkcjsKK2RzdF9zZWMJYmxvY2tzX2luZm8sIGxpbmVzX2luZm8sIHN5bWJvbHNfaW5mbzsKKworLyogVmVjdG9yIG9mIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgKi8KKworc3RhdGljIHN0cnVjdCBsaW5ldGFibGUgKmxpbmVfdmVjdG9yOworCisvKiBJbmRleCBvZiBuZXh0IGVudHJ5IHRvIGdvIGluIGxpbmVfdmVjdG9yX2luZGV4LiAgKi8KKworc3RhdGljIGludCBsaW5lX3ZlY3Rvcl9pbmRleDsKKworLyogTGFzdCBsaW5lIG51bWJlciByZWNvcmRlZCBpbiB0aGUgbGluZSB2ZWN0b3IuICAqLworCitzdGF0aWMgaW50IHByZXZfbGluZV9udW1iZXI7CisKKy8qIE51bWJlciBvZiBlbGVtZW50cyBhbGxvY2F0ZWQgZm9yIGxpbmVfdmVjdG9yIGN1cnJlbnRseS4gICovCisKK3N0YXRpYyBpbnQgbGluZV92ZWN0b3JfbGVuZ3RoOworCitzdGF0aWMgaW50Citpbml0X2RzdF9zZWN0aW9ucyBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIHZvaWQKK3JlYWRfZHN0X3N5bXRhYiBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCitmaW5kX2RzdF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSKSk7CisKK3N0YXRpYyB2b2lkCitkc3Rfc3ltZmlsZV9pbml0IFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQKK2RzdF9uZXdfaW5pdCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCitkc3Rfc3ltZmlsZV9yZWFkIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitkc3Rfc3ltZmlsZV9maW5pc2ggUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZAorZHN0X2VuZF9zeW10YWIgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZAorY29tcGxldGVfc3ltdGFiIFBBUkFNUyAoKGNoYXIgKiwgQ09SRV9BRERSLCB1bnNpZ25lZCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2RzdF9zdGFydF9zeW10YWIgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZAorZHN0X3JlY29yZF9saW5lIFBBUkFNUyAoKGludCwgQ09SRV9BRERSKSk7CisKKy8qIE1hbmFnZSB0aGUgdmVjdG9yIG9mIGxpbmUgbnVtYmVycy4gICovCisvKiBGSVhNRTogVXNlIHJlY29yZF9saW5lIGluc3RlYWQuICAqLworCitzdGF0aWMgdm9pZAorZHN0X3JlY29yZF9saW5lIChsaW5lLCBwYykKKyAgICAgaW50IGxpbmU7CisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgc3RydWN0IGxpbmV0YWJsZV9lbnRyeSAqZTsKKyAgLyogTWFrZSBzdXJlIGxpbmUgdmVjdG9yIGlzIGJpZyBlbm91Z2guICAqLworCisgIGlmIChsaW5lX3ZlY3Rvcl9pbmRleCArIDIgPj0gbGluZV92ZWN0b3JfbGVuZ3RoKQorICAgIHsKKyAgICAgIGxpbmVfdmVjdG9yX2xlbmd0aCAqPSAyOworICAgICAgbGluZV92ZWN0b3IgPSAoc3RydWN0IGxpbmV0YWJsZSAqKQorCXhyZWFsbG9jICgoY2hhciAqKSBsaW5lX3ZlY3Rvciwgc2l6ZW9mIChzdHJ1Y3QgbGluZXRhYmxlKQorCQkgICsgKGxpbmVfdmVjdG9yX2xlbmd0aAorCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5KSkpOworICAgIH0KKworICBlID0gbGluZV92ZWN0b3ItPml0ZW0gKyBsaW5lX3ZlY3Rvcl9pbmRleCsrOworICBlLT5saW5lID0gbGluZTsgZS0+cGMgPSBwYzsKK30KKwwKKy8qIFN0YXJ0IGEgbmV3IHN5bXRhYiBmb3IgYSBuZXcgc291cmNlIGZpbGUuCisgICBJdCBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIGRhdGEgZm9yIG9uZSBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gICovCisvKiBGSVhNRTogdXNlIHN0YXJ0X3N5bXRhYiwgbGlrZSBjb2ZmcmVhZC5jIG5vdyBkb2VzLiAgKi8KKworc3RhdGljIHZvaWQKK2RzdF9zdGFydF9zeW10YWIgKCkKK3sKKyAgLyogSW5pdGlhbGl6ZSB0aGUgc291cmNlIGZpbGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoaXMgZmlsZS4gICovCisKKyAgaWYgKGxpbmVfdmVjdG9yKQkJLyogVW5saWtlbHksIGJ1dCBtYXliZSBwb3NzaWJsZT8gKi8KKyAgICBmcmVlICgoUFRSKWxpbmVfdmVjdG9yKTsKKyAgbGluZV92ZWN0b3JfaW5kZXggPSAwOworICBsaW5lX3ZlY3Rvcl9sZW5ndGggPSAxMDAwOworICBwcmV2X2xpbmVfbnVtYmVyID0gLTI7CS8qIEZvcmNlIGZpcnN0IGxpbmUgbnVtYmVyIHRvIGJlIGV4cGxpY2l0ICovCisgIGxpbmVfdmVjdG9yID0gKHN0cnVjdCBsaW5ldGFibGUgKikKKyAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBsaW5ldGFibGUpCisJICAgICArIGxpbmVfdmVjdG9yX2xlbmd0aCAqIHNpemVvZiAoc3RydWN0IGxpbmV0YWJsZV9lbnRyeSkpOworfQorCisvKiBTYXZlIHRoZSB2aXRhbCBpbmZvcm1hdGlvbiBmcm9tIHdoZW4gc3RhcnRpbmcgdG8gcmVhZCBhIGZpbGUsCisgICBmb3IgdXNlIHdoZW4gY2xvc2luZyBvZmYgdGhlIGN1cnJlbnQgZmlsZS4KKyAgIE5BTUUgaXMgdGhlIGZpbGUgbmFtZSB0aGUgc3ltYm9scyBjYW1lIGZyb20sIFNUQVJUX0FERFIgaXMgdGhlIGZpcnN0CisgICB0ZXh0IGFkZHJlc3MgZm9yIHRoZSBmaWxlLCBhbmQgU0laRSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHRleHQuICAqLworCitzdGF0aWMgdm9pZAorY29tcGxldGVfc3ltdGFiIChuYW1lLCBzdGFydF9hZGRyLCBzaXplKQorICAgIGNoYXIgKm5hbWU7CisgICAgQ09SRV9BRERSIHN0YXJ0X2FkZHI7CisgICAgdW5zaWduZWQgaW50IHNpemU7Cit7CisgIGxhc3Rfc291cmNlX2ZpbGUgPSBzYXZlc3RyaW5nIChuYW1lLCBzdHJsZW4gKG5hbWUpKTsKKyAgY3VyX3NyY19zdGFydF9hZGRyID0gc3RhcnRfYWRkcjsKKyAgY3VyX3NyY19lbmRfYWRkciA9IHN0YXJ0X2FkZHIgKyBzaXplOworCisgIGlmIChjdXJyZW50X29iamZpbGUgLT4gZWkuZW50cnlfcG9pbnQgPj0gY3VyX3NyY19zdGFydF9hZGRyICYmCisgICAgICBjdXJyZW50X29iamZpbGUgLT4gZWkuZW50cnlfcG9pbnQgPCAgY3VyX3NyY19lbmRfYWRkcikKKyAgICB7CisgICAgICBjdXJyZW50X29iamZpbGUgLT4gZWkuZW50cnlfZmlsZV9sb3dwYyA9IGN1cl9zcmNfc3RhcnRfYWRkcjsKKyAgICAgIGN1cnJlbnRfb2JqZmlsZSAtPiBlaS5lbnRyeV9maWxlX2hpZ2hwYyA9IGN1cl9zcmNfZW5kX2FkZHI7CisgICAgfQorfQorCisvKiBGaW5pc2ggdGhlIHN5bWJvbCBkZWZpbml0aW9ucyBmb3Igb25lIG1haW4gc291cmNlIGZpbGUsCisgICBjbG9zZSBvZmYgYWxsIHRoZSBsZXhpY2FsIGNvbnRleHRzIGZvciB0aGF0IGZpbGUKKyAgIChjcmVhdGluZyBzdHJ1Y3QgYmxvY2sncyBmb3IgdGhlbSksIHRoZW4gbWFrZSB0aGUKKyAgIHN0cnVjdCBzeW10YWIgZm9yIHRoYXQgZmlsZSBhbmQgcHV0IGl0IGluIHRoZSBsaXN0IG9mIGFsbCBzdWNoLiAqLworLyogRklYTUU6IFVzZSBlbmRfc3ltdGFiLCBsaWtlIGNvZmZyZWFkLmMgbm93IGRvZXMuICAqLworCitzdGF0aWMgdm9pZAorZHN0X2VuZF9zeW10YWIgKG9iamZpbGUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICByZWdpc3RlciBzdHJ1Y3Qgc3ltdGFiICpzeW10YWI7CisgIHJlZ2lzdGVyIHN0cnVjdCBibG9ja3ZlY3RvciAqYmxvY2t2ZWN0b3I7CisgIHJlZ2lzdGVyIHN0cnVjdCBsaW5ldGFibGUgKmx2OworCisgIC8qIENyZWF0ZSB0aGUgYmxvY2t2ZWN0b3IgdGhhdCBwb2ludHMgdG8gYWxsIHRoZSBmaWxlJ3MgYmxvY2tzLiAgKi8KKworICBibG9ja3ZlY3RvciA9IG1ha2VfYmxvY2t2ZWN0b3IgKG9iamZpbGUpOworCisgIC8qIE5vdyBjcmVhdGUgdGhlIHN5bXRhYiBvYmplY3QgZm9yIHRoaXMgc291cmNlIGZpbGUuICAqLworICBzeW10YWIgPSBhbGxvY2F0ZV9zeW10YWIgKGxhc3Rfc291cmNlX2ZpbGUsIG9iamZpbGUpOworCisgIC8qIEZpbGwgaW4gaXRzIGNvbXBvbmVudHMuICAqLworICBzeW10YWItPmJsb2NrdmVjdG9yID0gYmxvY2t2ZWN0b3I7CisgIHN5bXRhYi0+ZnJlZV9jb2RlID0gZnJlZV9saW5ldGFibGU7CisgIHN5bXRhYi0+ZnJlZV9wdHIgPSAwOworICBzeW10YWItPmZpbGVuYW1lID0gbGFzdF9zb3VyY2VfZmlsZTsKKyAgc3ltdGFiLT5kaXJuYW1lID0gTlVMTDsKKyAgc3ltdGFiLT5kZWJ1Z2Zvcm1hdCA9IG9ic2F2ZXN0cmluZyAoIkFwb2xsbyBEU1QiLCAxMCwKKwkJCQkgICAgICAmb2JqZmlsZSAtPiBzeW1ib2xfb2JzdGFjayk7CisgIGx2ID0gbGluZV92ZWN0b3I7CisgIGx2LT5uaXRlbXMgPSBsaW5lX3ZlY3Rvcl9pbmRleDsKKyAgc3ltdGFiLT5saW5ldGFibGUgPSAoc3RydWN0IGxpbmV0YWJsZSAqKQorICAgIHhyZWFsbG9jICgoY2hhciAqKSBsdiwgKHNpemVvZiAoc3RydWN0IGxpbmV0YWJsZSkKKwkJICAgKyBsdi0+bml0ZW1zICogc2l6ZW9mIChzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5KSkpOworCisgIGZyZWVfbmFtZWRfc3ltdGFicyAoc3ltdGFiLT5maWxlbmFtZSk7CisKKyAgLyogUmVpbml0aWFsaXplIGZvciBiZWdpbm5pbmcgb2YgbmV3IGZpbGUuICovCisgIGxpbmVfdmVjdG9yID0gMDsKKyAgbGluZV92ZWN0b3JfbGVuZ3RoID0gLTE7CisgIGxhc3Rfc291cmNlX2ZpbGUgPSBOVUxMOworfQorDAorLyogZHN0X3N5bWZpbGVfaW5pdCAoKQorICAgaXMgdGhlIGRzdC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciByZWFkaW5nIHN5bWJvbHMuCisKKyAgIFdlIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhpcyBpcyBhIERTVCBvciBEU1QtbGlrZSBmaWxlLgorICAgQkZEIGhhbmRsZXMgZmlndXJpbmcgb3V0IHRoZSBmb3JtYXQgb2YgdGhlIGZpbGUsIGFuZCBjb2RlIGluIHN5bXRhYi5jCisgICB1c2VzIEJGRCdzIGRldGVybWluYXRpb24gdG8gdmVjdG9yIHRvIHVzLgorCisgICBUaGUgdWx0aW1hdGUgcmVzdWx0IGlzIGEgbmV3IHN5bXRhYiAob3IsIEZJWE1FLCBldmVudHVhbGx5IGEgcHN5bXRhYikuICAqLworCitzdGF0aWMgdm9pZAorZHN0X3N5bWZpbGVfaW5pdCAob2JqZmlsZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIGFzZWN0aW9uCSpzZWN0aW9uOworICBiZmQgKmFiZmQgPSBvYmpmaWxlLT5vYmZkOworCisgIGluaXRfZW50cnlfcG9pbnRfaW5mbyAob2JqZmlsZSk7CisKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGV2ZXJ5IHNlY3Rpb247IGl0IGZpbmRzIHRoZSBvdXRlciBsaW1pdHMKKyAgIG9mIHRoZSBsaW5lIHRhYmxlIChtaW5pbXVtIGFuZCBtYXhpbXVtIGZpbGUgb2Zmc2V0KSBzbyB0aGF0IHRoZQorICAgbWFpbmxpbmUgY29kZSBjYW4gcmVhZCB0aGUgd2hvbGUgdGhpbmcgZm9yIGVmZmljaWVuY3kuICAqLworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2ZpbmRfZHN0X3NlY3Rpb25zIChhYmZkLCBhc2VjdCwgdnBpbmZvKQorICAgICBiZmQgKmFiZmQ7CisgICAgIHNlY19wdHIgYXNlY3Q7CisgICAgIFBUUiB2cGluZm87Cit7CisgIGludCBzaXplLCBjb3VudDsKKyAgbG9uZyBiYXNlOworICBmaWxlX3B0ciBvZmZzZXQsIG1heG9mZjsKKyAgZHN0X3NlYyAqc2VjdGlvbjsKKworLyogV0FSTklORyBXSUxMIFJPQklOU09OISAgQUNDRVNTSU5HIEJGRC1QUklWQVRFIERBVEEgSEVSRSEgIEZJWE1FISAgKi8KKyAgc2l6ZSA9IGFzZWN0LT5fcmF3X3NpemU7CisgIG9mZnNldCA9IGFzZWN0LT5maWxlcG9zOworICBiYXNlID0gYXNlY3QtPnZtYTsKKy8qIEVuZCBvZiB3YXJuaW5nICovCisKKyAgc2VjdGlvbiA9IE5VTEw7CisgIGlmICghc3RyY21wKGFzZWN0LT5uYW1lLCAiLmJsb2NrcyIpKQorICAgIHNlY3Rpb24gPSAmYmxvY2tzX2luZm87CisgIGVsc2UgaWYgKCFzdHJjbXAoYXNlY3QtPm5hbWUsICIubGluZXMiKSkKKyAgICBzZWN0aW9uID0gJmxpbmVzX2luZm87CisgIGVsc2UgaWYgKCFzdHJjbXAoYXNlY3QtPm5hbWUsICIuc3ltYm9scyIpKQorICAgIHNlY3Rpb24gPSAmc3ltYm9sc19pbmZvOworICBpZiAoIXNlY3Rpb24pCisgICAgcmV0dXJuOworICBzZWN0aW9uLT5zaXplID0gc2l6ZTsKKyAgc2VjdGlvbi0+cG9zaXRpb24gPSBvZmZzZXQ7CisgIHNlY3Rpb24tPmJhc2UgPSBiYXNlOworfQorCisKKy8qIFRoZSBCRkQgZm9yIHRoaXMgZmlsZSAtLSBvbmx5IGdvb2Qgd2hpbGUgd2UncmUgYWN0aXZlbHkgcmVhZGluZworICAgc3ltYm9scyBpbnRvIGEgcHN5bXRhYiBvciBhIHN5bXRhYi4gICovCisKK3N0YXRpYyBiZmQgKnN5bWZpbGVfYmZkOworCisvKiBSZWFkIGEgc3ltYm9sIGZpbGUsIGFmdGVyIGluaXRpYWxpemF0aW9uIGJ5IGRzdF9zeW1maWxlX2luaXQuICAqLworLyogRklYTUUhICBBZGRyIGFuZCBNYWlubGluZSBhcmUgbm90IHVzZWQgeWV0IC0tIHRoaXMgd2lsbCBub3Qgd29yayBmb3IKKyAgIHNoYXJlZCBsaWJyYXJpZXMgb3IgYWRkX2ZpbGUhICAqLworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2RzdF9zeW1maWxlX3JlYWQgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywgbWFpbmxpbmUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHM7CisgICAgIGludCBtYWlubGluZTsKK3sKKyAgYmZkICphYmZkID0gb2JqZmlsZS0+b2JmZDsKKyAgY2hhciAqbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOworICBpbnQgZGVzYzsKKyAgcmVnaXN0ZXIgaW50IHZhbDsKKyAgaW50IG51bV9zeW1ib2xzOworICBpbnQgc3ltdGFiX29mZnNldDsKKyAgaW50IHN0cmluZ3RhYl9vZmZzZXQ7CisKKyAgc3ltZmlsZV9iZmQgPSBhYmZkOwkJCS8qIEtsdWRnZSBmb3Igc3dhcCByb3V0aW5lcyAqLworCisvKiBXQVJOSU5HIFdJTEwgUk9CSU5TT04hICBBQ0NFU1NJTkcgQkZELVBSSVZBVEUgREFUQSBIRVJFISAgRklYTUUhICAqLworICAgZGVzYyA9IGZpbGVubyAoKEZJTEUgKikoYWJmZC0+aW9zdHJlYW0pKTsJLyogRmlsZSBkZXNjcmlwdG9yICovCisKKyAgLyogUmVhZCB0aGUgbGluZSBudW1iZXIgdGFibGUsIGFsbCBhdCBvbmNlLiAgKi8KKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBmaW5kX2RzdF9zZWN0aW9ucywgKFBUUilOVUxMKTsKKworICB2YWwgPSBpbml0X2RzdF9zZWN0aW9ucyAoZGVzYyk7CisgIGlmICh2YWwgPCAwKQorICAgIGVycm9yICgiXCIlc1wiOiBlcnJvciByZWFkaW5nIGRlYnVnZ2luZyBzeW1ib2wgdGFibGVzXG4iLCBuYW1lKTsKKworICBpbml0X21pbmltYWxfc3ltYm9sX2NvbGxlY3Rpb24gKCk7CisgIG1ha2VfY2xlYW51cCAoZGlzY2FyZF9taW5pbWFsX3N5bWJvbHMsIDApOworCisgIC8qIE5vdyB0aGF0IHRoZSBleGVjdXRhYmxlIGZpbGUgaXMgcG9zaXRpb25lZCBhdCBzeW1ib2wgdGFibGUsCisgICAgIHByb2Nlc3MgaXQgYW5kIGRlZmluZSBzeW1ib2xzIGFjY29yZGluZ2x5LiAgKi8KKworICByZWFkX2RzdF9zeW10YWIgKG9iamZpbGUpOworCisgIC8qIFNvcnQgc3ltYm9scyBhbHBoYWJldGljYWxseSB3aXRoaW4gZWFjaCBibG9jay4gICovCisKKyAgeworICAgIHN0cnVjdCBzeW10YWIgKnM7CisgICAgZm9yIChzID0gb2JqZmlsZSAtPiBzeW10YWJzOyBzICE9IE5VTEw7IHMgPSBzIC0+IG5leHQpCisgICAgICB7CisJc29ydF9zeW10YWJfc3ltcyAocyk7CisgICAgICB9CisgIH0KKworICAvKiBJbnN0YWxsIGFueSBtaW5pbWFsIHN5bWJvbHMgdGhhdCBoYXZlIGJlZW4gY29sbGVjdGVkIGFzIHRoZSBjdXJyZW50CisgICAgIG1pbmltYWwgc3ltYm9scyBmb3IgdGhpcyBvYmpmaWxlLiAqLworCisgIGluc3RhbGxfbWluaW1hbF9zeW1ib2xzIChvYmpmaWxlKTsKK30KKworc3RhdGljIHZvaWQKK2RzdF9uZXdfaW5pdCAoaWdub3JlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqaWdub3JlOworeworCS8qIE5vdGhpbicgdG8gZG8gKi8KK30KKworLyogUGVyZm9ybSBhbnkgbG9jYWwgY2xlYW51cHMgcmVxdWlyZWQgd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIGEgcGFydGljdWxhcgorICAgb2JqZmlsZS4gIEkuRSwgd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGRpc2NhcmRpbmcgYWxsIHN5bWJvbCBpbmZvcm1hdGlvbgorICAgZm9yIGFuIG9iamZpbGUsIGZyZWVpbmcgdXAgYWxsIG1lbW9yeSBoZWxkIGZvciBpdCwgYW5kIHVubGlua2luZyB0aGUKKyAgIG9iamZpbGUgc3RydWN0IGZyb20gdGhlIGdsb2JhbCBsaXN0IG9mIGtub3duIG9iamZpbGVzLiAqLworCitzdGF0aWMgdm9pZAorZHN0X3N5bWZpbGVfZmluaXNoIChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCit9CisKKwwKKy8qIEdldCB0aGUgbmV4dCBsaW5lIG51bWJlciBmcm9tIHRoZSBEU1QuIFJldHVybnMgMCB3aGVuIHdlIGhpdCBhbgorICogZW5kIGRpcmVjdGl2ZSBvciBjYW5ub3QgY29udGludWUgZm9yIGFueSBvdGhlciByZWFzb24uCisgKgorICogTm90ZSB0aGF0IG9yZGluYXJ5IHBjIGRlbHRhcyBhcmUgbXVsdGlwbGllZCBieSB0d28uIEFwcGFyZW50bHkKKyAqIHRoaXMgaXMgd2hhdCB3YXMgcmVhbGx5IGludGVuZGVkLgorICovCitzdGF0aWMgaW50CitnZXRfZHN0X2xpbmUoYnVmZmVyLCBwYykKKyAgICBzaWduZWQgY2hhciAqKmJ1ZmZlcjsKKyAgICBsb25nICpwYzsKK3sKKwlzdGF0aWMgbGFzdF9wYyA9IDA7CisJc3RhdGljIGxvbmcgbGFzdF9saW5lID0gMDsKKwlzdGF0aWMgaW50IGxhc3RfZmlsZSA9IDA7CisJZHN0X2xuX2VudHJ5X3B0cl90IGVudHJ5OworCWludCBzaXplOworCWRzdF9zcmNfbG9jX3QgKnNyY19sb2M7CisKKwlpZiAoKnBjICE9IC0xKQorCXsKKwkJbGFzdF9wYyA9ICpwYzsKKwkJKnBjID0gLTE7CisJfQorCWVudHJ5ID0gKGRzdF9sbl9lbnRyeV9wdHJfdCkgKmJ1ZmZlcjsKKworCXdoaWxlIChkc3RfbG5fbG5fZGVsdGEoKmVudHJ5KSA9PSBkc3RfbG5fZXNjYXBlX2ZsYWcpCisJeworCQlzd2l0Y2goZW50cnktPmVzYy5lc2NfY29kZSkKKwkJeworCQljYXNlIGRzdF9sbl9wYWQ6CisJCQlzaXplID0gMTsgICAgICAgICAvKiBwYWQgYnl0ZSAqLworCQkJYnJlYWs7CisJCWNhc2UgZHN0X2xuX2ZpbGU6CisJCSAgICAgICAgLyogZmlsZSBlc2NhcGUuICBOZXh0IDQgYnl0ZXMgYXJlIGEgZHN0X3NyY19sb2NfdCAqLworCQkJc2l6ZSA9IDU7CisJCQlzcmNfbG9jID0gKGRzdF9zcmNfbG9jX3QgKikgKCpidWZmZXIgKyAxKTsKKwkJCWxhc3RfbGluZSA9IHNyY19sb2MtPmxpbmVfbnVtYmVyOworCQkJbGFzdF9maWxlID0gc3JjX2xvYy0+ZmlsZV9pbmRleDsKKwkJCWJyZWFrOworCQljYXNlIGRzdF9sbl9kbG4xX2RwYzE6CisJCQkvKiAxIGJ5dGUgbGluZSBkZWx0YSwgMSBieXRlIHBjIGRlbHRhICovICAgIAorCQkJbGFzdF9saW5lICs9ICgqYnVmZmVyKVsxXTsKKwkJCWxhc3RfcGMgKz0gMiAqICh1bnNpZ25lZCBjaGFyKSAoKmJ1ZmZlcilbMl07CisJCQlkc3RfcmVjb3JkX2xpbmUobGFzdF9saW5lLCBsYXN0X3BjKTsKKwkJCXNpemUgPSAzOworCQkJYnJlYWs7CisJCWNhc2UgZHN0X2xuX2RsbjJfZHBjMjoKKwkJCS8qIDIgYnl0ZXMgbGluZSBkZWx0YSwgMiBieXRlcyBwYyBkZWx0YSAqLworCQkJbGFzdF9saW5lICs9ICooc2hvcnQgKikgKCpidWZmZXIgKyAxKTsKKwkJCWxhc3RfcGMgKz0gMiAqICgqKHNob3J0ICopICgqYnVmZmVyICsgMykpOworCQkJc2l6ZSA9IDU7CisJCQlkc3RfcmVjb3JkX2xpbmUobGFzdF9saW5lLCBsYXN0X3BjKTsKKwkJCWJyZWFrOworCQljYXNlIGRzdF9sbl9sbjRfcGM0OgorCQkJLyogNCBieXRlcyBBQlNPTFVURSBsaW5lIG51bWJlciwgNCBieXRlcyBBQlNPTFVURSBwYyAqLworCQkJbGFzdF9saW5lID0gKih1bnNpZ25lZCBsb25nICopICgqYnVmZmVyICsgMSk7CisJCQlsYXN0X3BjID0gKih1bnNpZ25lZCBsb25nICopICgqYnVmZmVyICsgNSk7CisJCQlzaXplID0gOTsKKwkJCWRzdF9yZWNvcmRfbGluZShsYXN0X2xpbmUsIGxhc3RfcGMpOworCQkJYnJlYWs7CisJCWNhc2UgZHN0X2xuX2RsbjFfZHBjMDoKKwkJCS8qIDEgYnl0ZSBsaW5lIGRlbHRhLCBwYyBkZWx0YSA9IDAgKi8KKwkJCXNpemUgPSAyOworCQkJbGFzdF9saW5lKz0gKCpidWZmZXIpWzFdOworCQkJYnJlYWs7CisJCSBjYXNlIGRzdF9sbl9sbl9vZmZfMToKKwkJCS8qIHN0YXRlbWVudCBlc2NhcGUsIHN0bXQgIyA9IDEgKDJuZCBzdG10IG9uIGxpbmUpICovCisJCQlzaXplID0gMTsKKwkJCWJyZWFrOworCQljYXNlIGRzdF9sbl9sbl9vZmY6CisJCQkvKiBzdGF0ZW1lbnQgZXNjYXBlLCBzdG10ICMgPSBuZXh0IGJ5dGUgKi8KKwkJCXNpemUgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgZHN0X2xuX2VudHJ5OgorCQkJLyogZW50cnkgZXNjYXBlLCBuZXh0IGJ5dGUgaXMgZW50cnkgbnVtYmVyICovICAgIAorCQkJc2l6ZSA9IDI7CisJCQlicmVhazsKKwkJY2FzZSBkc3RfbG5fZXhpdDoKKwkJCS8qIGV4aXQgZXNjYXBlICovCisJCQlzaXplID0gMTsKKwkJCWJyZWFrOworCQljYXNlIGRzdF9sbl9zdG10X2VuZDoKKwkJCS8qIGdhcCBlc2NhcGUsIDQgYnl0ZXMgcGMgZGVsdGEgKi8KKwkJCXNpemUgPSA1OworCQkJLyogbGFzdF9wYyArPSAyICogKCoobG9uZyAqKSAoKmJ1ZmZlciArIDEpKTsgKi8KKwkJCS8qIEFwcGFyZW50bHkgdGhpcyBpc24ndCBzdXBwb3NlZCB0byBhY3R1YWxseSBtb2RpZnkKKwkJCSAqIHRoZSBwYyB2YWx1ZS4gVG90YWxseSB3ZWlyZC4KKwkJCSAqLworCQkJYnJlYWs7CisJCSBjYXNlIGRzdF9sbl9lc2NhcGVfMTE6CisJCSBjYXNlIGRzdF9sbl9lc2NhcGVfMTI6CisJCSBjYXNlIGRzdF9sbl9lc2NhcGVfMTM6CisJCQlzaXplID0gMTsKKwkJCWJyZWFrOworCQkgY2FzZSBkc3RfbG5fbnh0X2J5dGU6CisJCQkvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4uIElmIGl0IGRvZXMsIHdlJ3JlIFNPTCAqLworCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJIGNhc2UgZHN0X2xuX2VuZDoKKwkJCS8qIGVuZCBlc2NhcGUsIGZpbmFsIGVudHJ5IGZvbGxvd3MgKi8KKwkJCXJldHVybiAwOworCQl9CisJCSpidWZmZXIgKz0gKHNpemUgPCAwKSA/IC1zaXplIDogc2l6ZTsKKwkJZW50cnkgPSAoZHN0X2xuX2VudHJ5X3B0cl90KSAqYnVmZmVyOworCX0KKwlsYXN0X2xpbmUgKz0gZHN0X2xuX2xuX2RlbHRhKCplbnRyeSk7CisJbGFzdF9wYyArPSBlbnRyeS0+ZGVsdGEucGNfZGVsdGEgKiAyOworCSgqYnVmZmVyKSsrOworCWRzdF9yZWNvcmRfbGluZShsYXN0X2xpbmUsIGxhc3RfcGMpOworCXJldHVybiAxOworfQorCitzdGF0aWMJdm9pZAorZW50ZXJfYWxsX2xpbmVzKGJ1ZmZlciwgYWRkcmVzcykKKyAgICBjaGFyICpidWZmZXI7CisgICAgbG9uZyBhZGRyZXNzOworeworICAgIGlmIChidWZmZXIpCisJd2hpbGUgKGdldF9kc3RfbGluZSgmYnVmZmVyLCAmYWRkcmVzcykpOworfQorCitzdGF0aWMgaW50CitnZXRfZHN0X2VudHJ5KGJ1ZmZlciwgcmV0X2VudHJ5KQorICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICBkc3RfcmVjX3B0cl90ICpyZXRfZW50cnk7Cit7CisgICAgaW50IHNpemU7CisgICAgZHN0X3JlY19wdHJfdCBlbnRyeTsKKyAgICBzdGF0aWMgaW50IGxhc3RfdHlwZTsKKyAgICBpbnQJYXJfc2l6ZTsKKyAgICBzdGF0aWMgdW5zaWduZWQgbHUzOworCisgICAgZW50cnkgPSAoZHN0X3JlY19wdHJfdCkgYnVmZmVyOworICAgIHN3aXRjaChlbnRyeS0+cmVjX3R5cGUpCisgICAgeworICAgIGNhc2UgZHN0X3R5cF9wYWQ6CisJc2l6ZSA9IDA7CisJYnJlYWs7CisgICAgY2FzZSBkc3RfdHlwX2NvbXBfdW5pdDoKKwlzaXplID0gc2l6ZW9mKERTVF9jb21wX3VuaXQoZW50cnkpKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfc2VjdGlvbl90YWI6CisJc2l6ZSA9IHNpemVvZihEU1Rfc2VjdGlvbl90YWIoZW50cnkpKQorCQkrICgoaW50KSBEU1Rfc2VjdGlvbl90YWIoZW50cnkpLm51bWJlcl9vZl9zZWN0aW9ucworCQkgICAtIGRzdF9kdW1teV9hcnJheV9zaXplKSAqIHNpemVvZihsb25nKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfZmlsZV90YWI6CisJc2l6ZSA9IHNpemVvZihEU1RfZmlsZV90YWIoZW50cnkpKQorCQkrICgoaW50KSBEU1RfZmlsZV90YWIoZW50cnkpLm51bWJlcl9vZl9maWxlcworCQkgICAtIGRzdF9kdW1teV9hcnJheV9zaXplKSAqIHNpemVvZihkc3RfZmlsZV9kZXNjX3QpOworCWJyZWFrOworICAgIGNhc2UgZHN0X3R5cF9ibG9jazoKKwlzaXplID0gc2l6ZW9mKERTVF9ibG9jayhlbnRyeSkpCisJCSsgKChpbnQpIERTVF9ibG9jayhlbnRyeSkubl9vZl9jb2RlX3JhbmdlcworCQkgICAtIGRzdF9kdW1teV9hcnJheV9zaXplKSAqIHNpemVvZihkc3RfY29kZV9yYW5nZV90KTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfNToKKwlzaXplID0gLTE7CisJYnJlYWs7CisgICAgY2FzZSBkc3RfdHlwX3ZhcjoKKwlzaXplID0gc2l6ZW9mKERTVF92YXIoZW50cnkpKSAtCisJCXNpemVvZihkc3RfdmFyX2xvY19sb25nX3QpICogZHN0X2R1bW15X2FycmF5X3NpemUgKworCQlEU1RfdmFyKGVudHJ5KS5ub19vZl9sb2NzICoKKwkJKCBEU1RfdmFyKGVudHJ5KS5zaG9ydF9sb2NzID8KKwkJICBzaXplb2YoZHN0X3Zhcl9sb2Nfc2hvcnRfdCk6CisJCSAgc2l6ZW9mKGRzdF92YXJfbG9jX2xvbmdfdCkpOworCWJyZWFrOworICAgIGNhc2UgZHN0X3R5cF9wb2ludGVyOgorCXNpemUgPSBzaXplb2YoRFNUX3BvaW50ZXIoZW50cnkpKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfYXJyYXk6CisJc2l6ZSA9IHNpemVvZihEU1RfYXJyYXkoZW50cnkpKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfc3VicmFuZ2U6CisJc2l6ZSA9IHNpemVvZihEU1Rfc3VicmFuZ2UoZW50cnkpKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfc2V0OgorCXNpemUgPSBzaXplb2YoRFNUX3NldChlbnRyeSkpOworCWJyZWFrOworICAgIGNhc2UgZHN0X3R5cF9pbXBsaWNpdF9lbnVtOgorCXNpemUgPSBzaXplb2YoRFNUX2ltcGxpY2l0X2VudW0oZW50cnkpKQorCQkrICgoaW50KSBEU1RfaW1wbGljaXRfZW51bShlbnRyeSkubmVsZW1zCisJCSAgIC0gZHN0X2R1bW15X2FycmF5X3NpemUpICogc2l6ZW9mKGRzdF9yZWxfb2Zmc2V0X3QpOworCWJyZWFrOworICAgIGNhc2UgZHN0X3R5cF9leHBsaWNpdF9lbnVtOgorCXNpemUgPSBzaXplb2YoRFNUX2V4cGxpY2l0X2VudW0oZW50cnkpKQorCQkrICgoaW50KSBEU1RfZXhwbGljaXRfZW51bShlbnRyeSkubmVsZW1zCisJCSAgIC0gZHN0X2R1bW15X2FycmF5X3NpemUpICogc2l6ZW9mKGRzdF9lbnVtX2VsZW1fdCk7CisJYnJlYWs7CisgICAgY2FzZSBkc3RfdHlwX3Nob3J0X3JlYzoKKwlzaXplID0gc2l6ZW9mKERTVF9zaG9ydF9yZWMoZW50cnkpKQorCQkrIERTVF9zaG9ydF9yZWMoZW50cnkpLm5maWVsZHMgKiBzaXplb2YoZHN0X3Nob3J0X2ZpZWxkX3QpCisJCS0gZHN0X2R1bW15X2FycmF5X3NpemUgKiBzaXplb2YoZHN0X2ZpZWxkX3QpOworCWJyZWFrOworICAgIGNhc2UgZHN0X3R5cF9zaG9ydF91bmlvbjoKKwlzaXplID0gc2l6ZW9mKERTVF9zaG9ydF91bmlvbihlbnRyeSkpCisJCSsgRFNUX3Nob3J0X3VuaW9uKGVudHJ5KS5uZmllbGRzICogc2l6ZW9mKGRzdF9zaG9ydF9maWVsZF90KQorCQktIGRzdF9kdW1teV9hcnJheV9zaXplICogc2l6ZW9mKGRzdF9maWVsZF90KTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfZmlsZToKKwlzaXplID0gc2l6ZW9mKERTVF9maWxlKGVudHJ5KSk7CisJYnJlYWs7CisgICAgY2FzZSBkc3RfdHlwX29mZnNldDoKKwlzaXplID0gc2l6ZW9mKERTVF9vZmZzZXQoZW50cnkpKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfYWxpYXM6CisJc2l6ZSA9IHNpemVvZihEU1RfYWxpYXMoZW50cnkpKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfc2lnbmF0dXJlOgorCXNpemUgPSBzaXplb2YoRFNUX3NpZ25hdHVyZShlbnRyeSkpICsKKwkJKChpbnQpIERTVF9zaWduYXR1cmUoZW50cnkpLm5hcmdzIC0KKwkJIGRzdF9kdW1teV9hcnJheV9zaXplKSAqIHNpemVvZihkc3RfYXJnX3QpOworCWJyZWFrOworICAgIGNhc2UgZHN0X3R5cF8yMToKKwlzaXplID0gLTE7CisJYnJlYWs7CisgICAgY2FzZSBkc3RfdHlwX29sZF9sYWJlbDoKKwlzaXplID0gc2l6ZW9mKERTVF9vbGRfbGFiZWwoZW50cnkpKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfc2NvcGU6CisJc2l6ZSA9IHNpemVvZihEU1Rfc2NvcGUoZW50cnkpKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfZW5kX3Njb3BlOgorCXNpemUgPSAwOworCWJyZWFrOworICAgIGNhc2UgZHN0X3R5cF8yNToKKyAgICBjYXNlIGRzdF90eXBfMjY6CisJc2l6ZSA9IC0xOworCWJyZWFrOworICAgIGNhc2UgZHN0X3R5cF9zdHJpbmdfdGFiOgorICAgIGNhc2UgZHN0X3R5cF9nbG9iYWxfbmFtZV90YWI6CisJc2l6ZSA9IHNpemVvZihEU1Rfc3RyaW5nX3RhYihlbnRyeSkpCisJCSsgRFNUX3N0cmluZ190YWIoZW50cnkpLmxlbmd0aAorCQktIGRzdF9kdW1teV9hcnJheV9zaXplOworCWJyZWFrOworICAgIGNhc2UgZHN0X3R5cF9mb3J3YXJkOgorCXNpemUgPSBzaXplb2YoRFNUX2ZvcndhcmQoZW50cnkpKTsKKwlnZXRfZHN0X2VudHJ5KChjaGFyICopIGVudHJ5ICsgRFNUX2ZvcndhcmQoZW50cnkpLnJlY19vZmYsICZlbnRyeSk7CisJYnJlYWs7CisgICAgY2FzZSBkc3RfdHlwX2F1eF9zaXplOgorCXNpemUgPSBzaXplb2YoRFNUX2F1eF9zaXplKGVudHJ5KSk7CisJYnJlYWs7CisgICAgY2FzZSBkc3RfdHlwX2F1eF9hbGlnbjoKKwlzaXplID0gc2l6ZW9mKERTVF9hdXhfYWxpZ24oZW50cnkpKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfYXV4X2ZpZWxkX3NpemU6CisJc2l6ZSA9IHNpemVvZihEU1RfYXV4X2ZpZWxkX3NpemUoZW50cnkpKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfYXV4X2ZpZWxkX29mZjoKKwlzaXplID0gc2l6ZW9mKERTVF9hdXhfZmllbGRfb2ZmKGVudHJ5KSk7CisJYnJlYWs7CisgICAgY2FzZSBkc3RfdHlwX2F1eF9maWVsZF9hbGlnbjoKKwlzaXplID0gc2l6ZW9mKERTVF9hdXhfZmllbGRfYWxpZ24oZW50cnkpKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfYXV4X3F1YWw6CisJc2l6ZSA9IHNpemVvZihEU1RfYXV4X3F1YWwoZW50cnkpKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfYXV4X3Zhcl9ib3VuZDoKKwlzaXplID0gc2l6ZW9mKERTVF9hdXhfdmFyX2JvdW5kKGVudHJ5KSk7CisJYnJlYWs7CisgICAgY2FzZSBkc3RfdHlwX2V4dGVuc2lvbjoKKwlzaXplID0gRFNUX2V4dGVuc2lvbihlbnRyeSkucmVjX3NpemU7CisJYnJlYWs7CisgICAgY2FzZSBkc3RfdHlwX3N0cmluZzoKKwlzaXplID0gc2l6ZW9mKERTVF9zdHJpbmcoZW50cnkpKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfb2xkX2VudHJ5OgorCXNpemUgPSA0ODsgLyogT2Jzb2xldGUgZW50cnkgdHlwZSAqLworCWJyZWFrOworICAgIGNhc2UgZHN0X3R5cF9jb25zdDoKKwlzaXplID0gc2l6ZW9mKERTVF9jb25zdChlbnRyeSkpCisJCSsgRFNUX2NvbnN0KGVudHJ5KS52YWx1ZS5sZW5ndGgKKwkJLSBzaXplb2YoRFNUX2NvbnN0KGVudHJ5KS52YWx1ZS52YWwpOworCWJyZWFrOworICAgIGNhc2UgZHN0X3R5cF9yZWZlcmVuY2U6CisJc2l6ZSA9IHNpemVvZihEU1RfcmVmZXJlbmNlKGVudHJ5KSk7CisJYnJlYWs7CisgICAgY2FzZSBkc3RfdHlwX29sZF9yZWNvcmQ6CisgICAgY2FzZSBkc3RfdHlwX29sZF91bmlvbjoKKyAgICBjYXNlIGRzdF90eXBfcmVjb3JkOgorICAgIGNhc2UgZHN0X3R5cF91bmlvbjoKKwlzaXplID0gc2l6ZW9mKERTVF9yZWNvcmQoZW50cnkpKQorCQkrICgoaW50KSBEU1RfcmVjb3JkKGVudHJ5KS5uZmllbGRzCisJCSAgIC0gZHN0X2R1bW15X2FycmF5X3NpemUpICogc2l6ZW9mKGRzdF9maWVsZF90KTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfYXV4X3R5cGVfZGVyaXY6CisJc2l6ZSA9IHNpemVvZihEU1RfYXV4X3R5cGVfZGVyaXYoZW50cnkpKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfbG9jcG9vbDoKKwlzaXplID0gc2l6ZW9mKERTVF9sb2Nwb29sKGVudHJ5KSkKKwkJKyAoKGludCkgRFNUX2xvY3Bvb2woZW50cnkpLmxlbmd0aCAtCisJCSAgIGRzdF9kdW1teV9hcnJheV9zaXplKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfdmFyaWFibGU6CisJc2l6ZSA9IHNpemVvZihEU1RfdmFyaWFibGUoZW50cnkpKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfbGFiZWw6CisJc2l6ZSA9IHNpemVvZihEU1RfbGFiZWwoZW50cnkpKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfZW50cnk6CisJc2l6ZSA9IHNpemVvZihEU1RfZW50cnkoZW50cnkpKTsKKwlicmVhazsKKyAgICBjYXNlIGRzdF90eXBfYXV4X2xpZmV0aW1lOgorCXNpemUgPSBzaXplb2YoRFNUX2F1eF9saWZldGltZShlbnRyeSkpOworCWJyZWFrOworICAgIGNhc2UgZHN0X3R5cF9hdXhfcHRyX2Jhc2U6CisJc2l6ZSA9IHNpemVvZihEU1RfYXV4X3B0cl9iYXNlKGVudHJ5KSk7CisJYnJlYWs7CisgICAgY2FzZSBkc3RfdHlwX2F1eF9zcmNfcmFuZ2U6CisJc2l6ZSA9IHNpemVvZihEU1RfYXV4X3NyY19yYW5nZShlbnRyeSkpOworCWJyZWFrOworICAgIGNhc2UgZHN0X3R5cF9hdXhfcmVnX3ZhbDoKKwlzaXplID0gc2l6ZW9mKERTVF9hdXhfcmVnX3ZhbChlbnRyeSkpOworCWJyZWFrOworICAgIGNhc2UgZHN0X3R5cF9hdXhfdW5pdF9uYW1lczoKKwlzaXplID0gc2l6ZW9mKERTVF9hdXhfdW5pdF9uYW1lcyhlbnRyeSkpCisJCSsgKChpbnQpIERTVF9hdXhfdW5pdF9uYW1lcyhlbnRyeSkubnVtYmVyX29mX25hbWVzCisJCSAgIC0gZHN0X2R1bW15X2FycmF5X3NpemUpICogc2l6ZW9mKGRzdF9yZWxfb2Zmc2V0X3QpOworCWJyZWFrOworICAgIGNhc2UgZHN0X3R5cF9hdXhfc2VjdF9pbmZvOgorCXNpemUgPSBzaXplb2YoRFNUX2F1eF9zZWN0X2luZm8oZW50cnkpKQorCQkrICgoaW50KSBEU1RfYXV4X3NlY3RfaW5mbyhlbnRyeSkubnVtYmVyX29mX3JlZnMKKwkJICAgLSBkc3RfZHVtbXlfYXJyYXlfc2l6ZSkgKiBzaXplb2YoZHN0X3NlY3RfcmVmX3QpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJc2l6ZSA9IC0xOworCWJyZWFrOworICAgIH0KKyAgICBpZiAoc2l6ZSA9PSAtMSkKKyAgICB7CisJZnByaW50Zl91bmZpbHRlcmVkKGdkYl9zdGRlcnIsICJXYXJuaW5nOiB1bmV4cGVjdGVkIERTVCBlbnRyeSB0eXBlICglZCkgZm91bmRcbkxhc3QgdmFsaWQgZW50cnkgd2FzIG9mIHR5cGU6ICVkXG4iLAorCQkoaW50KSBlbnRyeS0+cmVjX3R5cGUsCisJCWxhc3RfdHlwZSk7CisJZnByaW50Zl91bmZpbHRlcmVkKGdkYl9zdGRlcnIsICJMYXN0IHVua25vd25fMyB2YWx1ZTogJWRcbiIsIGx1Myk7CisJc2l6ZSA9IDA7CisgICAgfQorICAgIGVsc2UKKwlsYXN0X3R5cGUgPSBlbnRyeS0+cmVjX3R5cGU7CisgICAgaWYgKHNpemUgJiAxKSAvKiBBbGlnbiBvbiBhIHdvcmQgYm91bmRhcnkgKi8KKwlzaXplKys7CisgICBzaXplICs9IDI7CisgICAqcmV0X2VudHJ5ID0gZW50cnk7CisgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljCWludCBuZXh0X2RzdF9lbnRyeShidWZmZXIsIGVudHJ5LCB0YWJsZSkKKyAgICBjaGFyICoqYnVmZmVyOworICAgIGRzdF9yZWNfcHRyX3QgKmVudHJ5OworICAgIGRzdF9zZWMgKnRhYmxlOworeworICAgIGlmICgqYnVmZmVyIC0gdGFibGUtPmJ1ZmZlciA+PSB0YWJsZS0+c2l6ZSkKKyAgICB7CisJKmVudHJ5ID0gTlVMTDsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgKmJ1ZmZlciArPSBnZXRfZHN0X2VudHJ5KCpidWZmZXIsIGVudHJ5KTsKKyAgICByZXR1cm4gMTsKK30KKworI2RlZmluZSBORVhUX0JMSyhhLCBiKSBuZXh0X2RzdF9lbnRyeShhLCBiLCAmYmxvY2tzX2luZm8pCisjZGVmaW5lIE5FWFRfU1lNKGEsIGIpIG5leHRfZHN0X2VudHJ5KGEsIGIsICZzeW1ib2xzX2luZm8pCisjZGVmaW5lCURTVF9PRkZTRVQoYSwgYikgKChjaGFyICopIChhKSArIChiKSkKKworc3RhdGljCWRzdF9yZWNfcHRyX3QJc2VjdGlvbl90YWJsZSA9IE5VTEw7CisKK2NoYXIgKgorZ2V0X3NlY19yZWYocmVmKQorICAgIGRzdF9zZWN0X3JlZl90ICpyZWY7Cit7CisJZHN0X3NlYyAqc2VjdGlvbiA9IE5VTEw7CisJbG9uZyBvZmZzZXQ7CisKKwlpZiAoIXNlY3Rpb25fdGFibGUgfHwgIXJlZi0+c2VjdF9pbmRleCkKKwkJcmV0dXJuIE5VTEw7CisJb2Zmc2V0ID0gRFNUX3NlY3Rpb25fdGFiKHNlY3Rpb25fdGFibGUpLnNlY3Rpb25fYmFzZVtyZWYtPnNlY3RfaW5kZXgtMV0KKwkJKyByZWYtPnNlY3Rfb2Zmc2V0OworCWlmIChvZmZzZXQgPj0gYmxvY2tzX2luZm8uYmFzZSAmJgorCSAgICBvZmZzZXQgPCBibG9ja3NfaW5mby5iYXNlICsgYmxvY2tzX2luZm8uc2l6ZSkKKwkJc2VjdGlvbiA9ICZibG9ja3NfaW5mbzsKKwllbHNlIGlmIChvZmZzZXQgPj0gc3ltYm9sc19pbmZvLmJhc2UgJiYKKwkJIG9mZnNldCA8IHN5bWJvbHNfaW5mby5iYXNlICsgc3ltYm9sc19pbmZvLnNpemUpCisJCXNlY3Rpb24gPSAmc3ltYm9sc19pbmZvOworCWVsc2UgaWYgKG9mZnNldCA+PSBsaW5lc19pbmZvLmJhc2UgJiYKKwkJIG9mZnNldCA8IGxpbmVzX2luZm8uYmFzZSArIGxpbmVzX2luZm8uc2l6ZSkKKwkJc2VjdGlvbiA9ICZsaW5lc19pbmZvOworCWlmICghc2VjdGlvbikKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHNlY3Rpb24tPmJ1ZmZlciArIChvZmZzZXQgLSBzZWN0aW9uLT5iYXNlKTsKK30KKworQ09SRV9BRERSCitkc3RfZ2V0X2FkZHIoaW50IHNlY3Rpb24sIGxvbmcgb2Zmc2V0KQoreworCWlmICghc2VjdGlvbl90YWJsZSB8fCAhc2VjdGlvbikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIERTVF9zZWN0aW9uX3RhYihzZWN0aW9uX3RhYmxlKS5zZWN0aW9uX2Jhc2Vbc2VjdGlvbi0xXSArIG9mZnNldDsKK30KKworQ09SRV9BRERSCitkc3Rfc3ltX2FkZHIocmVmKQorICAgIGRzdF9zZWN0X3JlZl90ICpyZWY7Cit7CisJaWYgKCFzZWN0aW9uX3RhYmxlIHx8ICFyZWYtPnNlY3RfaW5kZXgpCisJCXJldHVybiAwOworCXJldHVybiBEU1Rfc2VjdGlvbl90YWIoc2VjdGlvbl90YWJsZSkuc2VjdGlvbl9iYXNlW3JlZi0+c2VjdF9pbmRleC0xXQorCQkrIHJlZi0+c2VjdF9vZmZzZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitjcmVhdGVfbmV3X3R5cGUob2JqZmlsZSkKKyAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKwlzdHJ1Y3QgdHlwZSAqdHlwZTsKKworCXR5cGUgPSAoc3RydWN0IHR5cGUgKikKKwkJb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrLCBzaXplb2YgKHN0cnVjdCB0eXBlKSk7CisJbWVtc2V0KHR5cGUsIDAsIHNpemVvZihzdHJ1Y3QgdHlwZSkpOworCXJldHVybiB0eXBlOworfQorCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqCitjcmVhdGVfbmV3X3N5bWJvbChvYmpmaWxlLCBuYW1lKQorICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgIGNoYXIgKm5hbWU7Cit7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gKHN0cnVjdCBzeW1ib2wgKikKKwkgICAgICAgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrLCBzaXplb2YgKHN0cnVjdCBzeW1ib2wpKTsKKwltZW1zZXQgKHN5bSwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisJU1lNQk9MX05BTUUgKHN5bSkgPSBvYnNhdmVzdHJpbmcgKG5hbWUsIHN0cmxlbiAobmFtZSksCisJCQkJCSAgJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrKTsKKwlTWU1CT0xfVkFMVUUgKHN5bSkgPSAwOworCVNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworCisJU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0JMT0NLOworCXJldHVybiBzeW07Cit9OworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorZGVjb2RlX2RzdF90eXBlIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIGRzdF9yZWNfcHRyX3QpKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2RlY29kZV90eXBlX2Rlc2Mob2JqZmlsZSwgdHlwZV9kZXNjLCBiYXNlKQorCXN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworCWRzdF90eXBlX3QgKnR5cGVfZGVzYzsKKwlkc3RfcmVjX3B0cl90IGJhc2U7Cit7CisJc3RydWN0IHR5cGUgKnR5cGU7CisJZHN0X3JlY19wdHJfdCBlbnRyeTsKKwlpZiAodHlwZV9kZXNjLT5zdGRfdHlwZS51c2VyX2RlZmluZWRfdHlwZSkKKwl7CisJCWVudHJ5ID0gKGRzdF9yZWNfcHRyX3QpIERTVF9PRkZTRVQoYmFzZSwKKwkJCQkJZHN0X3VzZXJfdHlwZV9vZmZzZXQoKnR5cGVfZGVzYykpOworCQl0eXBlID0gZGVjb2RlX2RzdF90eXBlKG9iamZpbGUsIGVudHJ5KTsKKwl9CisJZWxzZQorCXsKKwkJc3dpdGNoKHR5cGVfZGVzYy0+c3RkX3R5cGUuZHRjKQorCQl7CisJCWNhc2UgZHN0X2ludDhfdHlwZToKKwkJCXR5cGUgPSBidWlsdGluX3R5cGVfc2lnbmVkX2NoYXI7CisJCQlicmVhazsKKwkJY2FzZSBkc3RfaW50MTZfdHlwZToKKwkJCXR5cGUgPSBidWlsdGluX3R5cGVfc2hvcnQ7CisJCQlicmVhazsKKwkJY2FzZSBkc3RfaW50MzJfdHlwZToKKwkJCXR5cGUgPSBidWlsdGluX3R5cGVfbG9uZzsKKwkJCWJyZWFrOworCQljYXNlIGRzdF91aW50OF90eXBlOgorCQkJdHlwZSA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9jaGFyOworCQkJYnJlYWs7CisJCWNhc2UgZHN0X3VpbnQxNl90eXBlOgorCQkJdHlwZSA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9zaG9ydDsKKwkJCWJyZWFrOworCQljYXNlIGRzdF91aW50MzJfdHlwZToKKwkJCXR5cGUgPSBidWlsdGluX3R5cGVfdW5zaWduZWRfbG9uZzsKKwkJCWJyZWFrOworCQljYXNlIGRzdF9yZWFsMzJfdHlwZToKKwkJCXR5cGUgPSBidWlsdGluX3R5cGVfZmxvYXQ7CisJCQlicmVhazsKKwkJY2FzZSBkc3RfcmVhbDY0X3R5cGU6CisJCQl0eXBlID0gYnVpbHRpbl90eXBlX2RvdWJsZTsKKwkJCWJyZWFrOworCQljYXNlIGRzdF9jb21wbGV4X3R5cGU6CisJCQl0eXBlID0gYnVpbHRpbl90eXBlX2NvbXBsZXg7CisJCQlicmVhazsKKwkJY2FzZSBkc3RfZGNvbXBsZXhfdHlwZToKKwkJCXR5cGUgPSBidWlsdGluX3R5cGVfZG91YmxlX2NvbXBsZXg7CisJCQlicmVhazsKKwkJY2FzZSBkc3RfYm9vbDhfdHlwZToKKwkJCXR5cGUgPSBidWlsdGluX3R5cGVfY2hhcjsKKwkJCWJyZWFrOworCQljYXNlIGRzdF9ib29sMTZfdHlwZToKKwkJCXR5cGUgPSBidWlsdGluX3R5cGVfc2hvcnQ7CisJCQlicmVhazsKKwkJY2FzZSBkc3RfYm9vbDMyX3R5cGU6CisJCQl0eXBlID0gYnVpbHRpbl90eXBlX2xvbmc7CisJCQlicmVhazsKKwkJY2FzZSBkc3RfY2hhcl90eXBlOgorCQkJdHlwZSA9IGJ1aWx0aW5fdHlwZV9jaGFyOworCQkJYnJlYWs7CisJCS8qIFRoZSBuZXh0IGZldyBhcmUgbW9yZSBjb21wbGV4LiBJIHdpbGwgdGFrZSBjYXJlCisJCSAqIG9mIHRoZW0gcHJvcGVybHkgYXQgYSBsYXRlciBwb2ludC4KKwkJICovCisJCWNhc2UgZHN0X3N0cmluZ190eXBlOgorCQkJdHlwZSA9IGJ1aWx0aW5fdHlwZV92b2lkOworCQkJYnJlYWs7CisJCWNhc2UgZHN0X3B0cl90eXBlOgorCQkJdHlwZSA9IGJ1aWx0aW5fdHlwZV92b2lkOworCQkJYnJlYWs7CisJCWNhc2UgZHN0X3NldF90eXBlOgorCQkJdHlwZSA9IGJ1aWx0aW5fdHlwZV92b2lkOworCQkJYnJlYWs7CisJCWNhc2UgZHN0X3Byb2NfdHlwZToKKwkJCXR5cGUgPSBidWlsdGluX3R5cGVfdm9pZDsKKwkJCWJyZWFrOworCQljYXNlIGRzdF9mdW5jX3R5cGU6CisJCQl0eXBlID0gYnVpbHRpbl90eXBlX3ZvaWQ7CisJCQlicmVhazsKKwkJLyogQmFjayB0dG8gc29tZSBvcmRpbmFyeSBvbmVzICovCisJCWNhc2UgZHN0X3ZvaWRfdHlwZToKKwkJCXR5cGUgPSBidWlsdGluX3R5cGVfdm9pZDsKKwkJCWJyZWFrOworCQljYXNlIGRzdF91Y2hhcl90eXBlOgorCQkJdHlwZSA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9jaGFyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0eXBlID0gYnVpbHRpbl90eXBlX3ZvaWQ7CisJCQlicmVhazsKKwkJfQorCX0gCisJcmV0dXJuIHR5cGU7Cit9CisKK3N0cnVjdAlzdHJ1Y3R1cmVfbGlzdAorICAgIHsKKyAgICBzdHJ1Y3Qgc3RydWN0dXJlX2xpc3QgKm5leHQ7CisgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgfTsKKworc3RhdGljIHN0cnVjdCBzdHJ1Y3R1cmVfbGlzdCAqc3RydWN0X2xpc3QgPSBOVUxMOworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorZmluZF9kc3Rfc3RydWN0dXJlKG5hbWUpCisgICAgY2hhciAqbmFtZTsKK3sKKwlzdHJ1Y3Qgc3RydWN0dXJlX2xpc3QgKmVsZW1lbnQ7CisKKwlmb3IgKGVsZW1lbnQgPSBzdHJ1Y3RfbGlzdDsgZWxlbWVudDsgZWxlbWVudCA9IGVsZW1lbnQtPm5leHQpCisJCWlmICghc3RyY21wKG5hbWUsIFRZUEVfTkFNRShlbGVtZW50LT50eXBlKSkpCisJCQlyZXR1cm4gZWxlbWVudC0+dHlwZTsKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorZGVjb2RlX2RzdF9zdHJ1Y3R1cmUob2JqZmlsZSwgZW50cnksIGNvZGUsIHZlcnNpb24pCisgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgZHN0X3JlY19wdHJfdCBlbnRyeTsKKyAgICBpbnQgY29kZTsKKyAgICBpbnQgdmVyc2lvbjsKK3sKKwlzdHJ1Y3QJdHlwZSAqdHlwZSwgKmNoaWxkX3R5cGU7CisJY2hhcgkqc3RydWN0X25hbWU7CisJY2hhcgkqbmFtZSwgKmZpZWxkX25hbWU7CisJaW50CWk7CisJaW50CWZpZWxkb2Zmc2V0LCBmaWVsZHNpemU7CisJZHN0X3R5cGVfdCB0eXBlX2Rlc2M7CisJc3RydWN0IHN0cnVjdHVyZV9saXN0ICplbGVtZW50OworCisJc3RydWN0X25hbWUgPSBEU1RfT0ZGU0VUKGVudHJ5LCBEU1RfcmVjb3JkKGVudHJ5KS5ub2Zmc2V0KTsKKwluYW1lID0gY29uY2F0KCAoY29kZSA9PSBUWVBFX0NPREVfVU5JT04pPyJ1bmlvbiAiOiJzdHJ1Y3QgIiwKKwkJCXN0cnVjdF9uYW1lLCBOVUxMKTsKKwl0eXBlID0gZmluZF9kc3Rfc3RydWN0dXJlKG5hbWUpOworCWlmICh0eXBlKQorCXsKKwkJZnJlZSgoUFRSKSBuYW1lKTsKKwkJcmV0dXJuIHR5cGU7CisJfQorCXR5cGUgPSBjcmVhdGVfbmV3X3R5cGUob2JqZmlsZSk7CisJVFlQRV9OQU1FKHR5cGUpID0gb2JzdGFja19jb3B5MCAoJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrLAorCQkJCQkJbmFtZSwgc3RybGVuKG5hbWUpKTsKKwlmcmVlKChQVFIpIG5hbWUpOworCVRZUEVfQ09ERSh0eXBlKSA9IGNvZGU7CisJVFlQRV9MRU5HVEgodHlwZSkgPSBEU1RfcmVjb3JkKGVudHJ5KS5zaXplOworCVRZUEVfTkZJRUxEUyh0eXBlKSA9IERTVF9yZWNvcmQoZW50cnkpLm5maWVsZHM7CisJVFlQRV9GSUVMRFModHlwZSkgPSAoc3RydWN0IGZpZWxkICopCisJICAgICAgIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywgc2l6ZW9mIChzdHJ1Y3QgZmllbGQpICoKKwkJCQkJRFNUX3JlY29yZChlbnRyeSkubmZpZWxkcyk7CisJZmllbGRvZmZzZXQgPSBmaWVsZHNpemUgPSAwOworCUlOSVRfQ1BMVVNfU1BFQ0lGSUModHlwZSk7CisJZWxlbWVudCA9IChzdHJ1Y3Qgc3RydWN0dXJlX2xpc3QgKikKKwkJCQl4bWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RydWN0dXJlX2xpc3QpKTsKKwllbGVtZW50LT50eXBlID0gdHlwZTsKKwllbGVtZW50LT5uZXh0ID0gc3RydWN0X2xpc3Q7CisJc3RydWN0X2xpc3QgPSBlbGVtZW50OworCWZvciAoaSA9IDA7IGkgPCBEU1RfcmVjb3JkKGVudHJ5KS5uZmllbGRzOyBpKyspCisJeworCQlzd2l0Y2ggKHZlcnNpb24pCisJCXsKKwkJY2FzZSAyOgorCQkJZmllbGRfbmFtZSA9IERTVF9PRkZTRVQoZW50cnksCisJCQkJCURTVF9yZWNvcmQoZW50cnkpLmYub2ZpZWxkc1tpXS5ub2Zmc2V0KTsKKwkJCWZpZWxkb2Zmc2V0ID0gRFNUX3JlY29yZChlbnRyeSkuZi5vZmllbGRzW2ldLmZvZmZzZXQqOCArCisJCQkJICAgICAgRFNUX3JlY29yZChlbnRyeSkuZi5vZmllbGRzW2ldLmJpdF9vZmZzZXQ7CisJCQlmaWVsZHNpemUgPSBEU1RfcmVjb3JkKGVudHJ5KS5mLm9maWVsZHNbaV0uc2l6ZTsKKwkJCXR5cGVfZGVzYyA9IERTVF9yZWNvcmQoZW50cnkpLmYub2ZpZWxkc1tpXS50eXBlX2Rlc2M7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJZmllbGRfbmFtZSA9IERTVF9PRkZTRVQoZW50cnksCisJCQkJCURTVF9yZWNvcmQoZW50cnkpLmYuZmllbGRzW2ldLm5vZmZzZXQpOworCQkJdHlwZV9kZXNjID0gRFNUX3JlY29yZChlbnRyeSkuZi5maWVsZHNbaV0udHlwZV9kZXNjOworCQkJc3dpdGNoKERTVF9yZWNvcmQoZW50cnkpLmYuZmllbGRzW2ldLmYuZmllbGRfbG9jLmZvcm1hdF90YWcpCisJCQl7CisJCQljYXNlIGRzdF9maWVsZF9ieXRlOgorCQkJCWZpZWxkb2Zmc2V0ID0gRFNUX3JlY29yZChlbnRyeSkuZi4KKwkJCQkJZmllbGRzW2ldLmYuZmllbGRfYnl0ZS5vZmZzZXQgKiA4OworCQkJCWZpZWxkc2l6ZSA9IC0xOworCQkJCWJyZWFrOworCQkJY2FzZSBkc3RfZmllbGRfYml0OgorCQkJCWZpZWxkb2Zmc2V0ID0gRFNUX3JlY29yZChlbnRyeSkuZi4KKwkJCQkJZmllbGRzW2ldLmYuZmllbGRfYml0LmJ5dGVfb2Zmc2V0ICogOCArCisJCQkJCSAgICAgIERTVF9yZWNvcmQoZW50cnkpLmYuCisJCQkJCWZpZWxkc1tpXS5mLmZpZWxkX2JpdC5iaXRfb2Zmc2V0OworCQkJCWZpZWxkc2l6ZSA9IERTVF9yZWNvcmQoZW50cnkpLmYuCisJCQkJCWZpZWxkc1tpXS5mLmZpZWxkX2JpdC5uYml0czsKKwkJCQlicmVhazsKKwkJCWNhc2UgZHN0X2ZpZWxkX2xvYzoKKwkJCQlmaWVsZG9mZnNldCArPSBmaWVsZHNpemU7CisJCQkJZmllbGRzaXplID0gLTE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQkJZmllbGRfbmFtZSA9IERTVF9PRkZTRVQoZW50cnksCisJCQkJCURTVF9yZWNvcmQoZW50cnkpLmYuc2ZpZWxkc1tpXS5ub2Zmc2V0KTsKKwkJCWZpZWxkb2Zmc2V0ID0gRFNUX3JlY29yZChlbnRyeSkuZi5zZmllbGRzW2ldLmZvZmZzZXQ7CisJCQl0eXBlX2Rlc2MgPSBEU1RfcmVjb3JkKGVudHJ5KS5mLnNmaWVsZHNbaV0udHlwZV9kZXNjOworCQkJaWYgKGkgPCBEU1RfcmVjb3JkKGVudHJ5KS5uZmllbGRzIC0gMSkKKwkJCQlmaWVsZHNpemUgPSBEU1RfcmVjb3JkKGVudHJ5KS5mLnNmaWVsZHNbaSsxXS5mb2Zmc2V0OworCQkJZWxzZQorCQkJCWZpZWxkc2l6ZSA9IERTVF9yZWNvcmQoZW50cnkpLnNpemU7CisJCQlmaWVsZHNpemUgLT0gZmllbGRvZmZzZXQ7CisJCQlmaWVsZG9mZnNldCAqPSA4OworCQkJZmllbGRzaXplICo9IDg7CisJCX0KKwkJVFlQRV9GSUVMRFModHlwZSlbaV0ubmFtZSA9IAorCQkJb2JzdGFja19jb3B5MCAoJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrLAorCQkJCQkJZmllbGRfbmFtZSwgc3RybGVuKGZpZWxkX25hbWUpKTsKKwkJVFlQRV9GSUVMRFModHlwZSlbaV0udHlwZSA9IGRlY29kZV90eXBlX2Rlc2Mob2JqZmlsZSwKKwkJCQkJCSZ0eXBlX2Rlc2MsCisJCQkJCQllbnRyeSk7CisJCWlmIChmaWVsZHNpemUgPT0gLTEpCisJCQlmaWVsZHNpemUgPSBUWVBFX0xFTkdUSChUWVBFX0ZJRUxEUyh0eXBlKVtpXS50eXBlKSAqCisJCQkJCTg7CisJCVRZUEVfRklFTERTKHR5cGUpW2ldLmJpdHNpemUgPSBmaWVsZHNpemU7CisJCVRZUEVfRklFTERTKHR5cGUpW2ldLmJpdHBvcyA9IGZpZWxkb2Zmc2V0OworCX0KKwlyZXR1cm4gdHlwZTsKK30KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2RlY29kZV9kc3RfdHlwZShvYmpmaWxlLCBlbnRyeSkKKyAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICBkc3RfcmVjX3B0cl90IGVudHJ5OworeworCXN0cnVjdCB0eXBlICpjaGlsZF90eXBlLCAqdHlwZSwgKnJhbmdlX3R5cGUsICppbmRleF90eXBlOworCisJc3dpdGNoKGVudHJ5LT5yZWNfdHlwZSkKKwl7CisJY2FzZSBkc3RfdHlwX3ZhcjoKKwkJcmV0dXJuIGRlY29kZV90eXBlX2Rlc2Mob2JqZmlsZSwKKwkJCQkgCSZEU1RfdmFyKGVudHJ5KS50eXBlX2Rlc2MsCisJCQkJCWVudHJ5KTsKKwkJYnJlYWs7CisJY2FzZSBkc3RfdHlwX3ZhcmlhYmxlOgorCQlyZXR1cm4gZGVjb2RlX3R5cGVfZGVzYyhvYmpmaWxlLAorCQkJCSAJJkRTVF92YXJpYWJsZShlbnRyeSkudHlwZV9kZXNjLAorCQkJCQllbnRyeSk7CisJCWJyZWFrOworCWNhc2UgZHN0X3R5cF9zaG9ydF9yZWM6CisJCXJldHVybiBkZWNvZGVfZHN0X3N0cnVjdHVyZShvYmpmaWxlLCBlbnRyeSwgVFlQRV9DT0RFX1NUUlVDVCwwKTsKKwljYXNlIGRzdF90eXBfc2hvcnRfdW5pb246CisJCXJldHVybiBkZWNvZGVfZHN0X3N0cnVjdHVyZShvYmpmaWxlLCBlbnRyeSwgVFlQRV9DT0RFX1VOSU9OLCAwKTsKKwljYXNlIGRzdF90eXBfdW5pb246CisJCXJldHVybiBkZWNvZGVfZHN0X3N0cnVjdHVyZShvYmpmaWxlLCBlbnRyeSwgVFlQRV9DT0RFX1VOSU9OLCAxKTsKKwljYXNlIGRzdF90eXBfcmVjb3JkOgorCQlyZXR1cm4gZGVjb2RlX2RzdF9zdHJ1Y3R1cmUob2JqZmlsZSwgZW50cnksIFRZUEVfQ09ERV9TVFJVQ1QsMSk7CisJY2FzZSBkc3RfdHlwX29sZF91bmlvbjoKKwkJcmV0dXJuIGRlY29kZV9kc3Rfc3RydWN0dXJlKG9iamZpbGUsIGVudHJ5LCBUWVBFX0NPREVfVU5JT04sIDIpOworCWNhc2UgZHN0X3R5cF9vbGRfcmVjb3JkOgorCQlyZXR1cm4gZGVjb2RlX2RzdF9zdHJ1Y3R1cmUob2JqZmlsZSwgZW50cnksIFRZUEVfQ09ERV9TVFJVQ1QsMik7CisJY2FzZSBkc3RfdHlwX3BvaW50ZXI6CisJCXJldHVybiBtYWtlX3BvaW50ZXJfdHlwZSgKKwkJCQlkZWNvZGVfdHlwZV9kZXNjKG9iamZpbGUsCisJCQkJCSZEU1RfcG9pbnRlcihlbnRyeSkudHlwZV9kZXNjLAorCQkJCQllbnRyeSksCisJCQkJTlVMTCk7CisJY2FzZSBkc3RfdHlwX2FycmF5OgorCQljaGlsZF90eXBlID0gZGVjb2RlX3R5cGVfZGVzYyhvYmpmaWxlLAorCQkJCQkgICAgICZEU1RfcG9pbnRlcihlbnRyeSkudHlwZV9kZXNjLAorCQkJCQkgICAgIGVudHJ5KTsKKwkJaW5kZXhfdHlwZSA9IGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlKG9iamZpbGUsCisJCQkJCQkJRlRfSU5URUdFUik7CisJCXJhbmdlX3R5cGUgPSBjcmVhdGVfcmFuZ2VfdHlwZSAoKHN0cnVjdCB0eXBlICopIE5VTEwsCisJCQkJaW5kZXhfdHlwZSwgRFNUX2FycmF5KGVudHJ5KS5sb19ib3VuZCwKKwkJCQkJRFNUX2FycmF5KGVudHJ5KS5oaV9ib3VuZCk7CisJCXJldHVybiBjcmVhdGVfYXJyYXlfdHlwZSAoKHN0cnVjdCB0eXBlICopIE5VTEwsIGNoaWxkX3R5cGUsCisJCQkJCXJhbmdlX3R5cGUpOworCWNhc2UgZHN0X3R5cF9hbGlhczoKKwkJcmV0dXJuIGRlY29kZV90eXBlX2Rlc2Mob2JqZmlsZSwKKwkJCQkJJkRTVF9hbGlhcyhlbnRyeSkudHlwZV9kZXNjLAorCQkJCQllbnRyeSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGJ1aWx0aW5fdHlwZV9pbnQ7CisJfQorfQorCitzdHJ1Y3QJc3ltYm9sX2xpc3QgeworCXN0cnVjdCBzeW1ib2xfbGlzdCAqbmV4dDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW1ib2w7Cit9OworCitzdGF0aWMJc3RydWN0CXN5bWJvbF9saXN0ICpkc3RfZ2xvYmFsX3N5bWJvbHMgPSBOVUxMOworc3RhdGljCWludAl0b3RhbF9nbG9iYWxzID0gMDsKKworc3RhdGljIHZvaWQKK2RlY29kZV9kc3RfbG9jc3RyaW5nKGxvY3N0ciwgc3ltKQorICAgIGNoYXIgKmxvY3N0cjsKKyAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07Cit7CisJZHN0X2xvY19lbnRyeV90ICplbnRyeSwgKm5leHRfZW50cnk7CisJQ09SRV9BRERSCXRlbXA7CisJaW50IGNvdW50ID0gMDsKKworCXdoaWxlKDEpCisJeworCQlpZiAoY291bnQrKyA9PSAxMDApCisJCXsKKwkJCWZwcmludGZfdW5maWx0ZXJlZChnZGJfc3RkZXJyLCAiRXJyb3IgcmVhZGluZyBsb2NzdHJpbmdcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJZW50cnkgPSAoZHN0X2xvY19lbnRyeV90ICopIGxvY3N0cjsKKwkJbmV4dF9lbnRyeSA9IChkc3RfbG9jX2VudHJ5X3QgKikgKGxvY3N0ciArIDEpOworCQlzd2l0Y2ggKGVudHJ5LT5oZWFkZXIuY29kZSkKKwkJeworCQljYXNlIGRzdF9sc2NfZW5kOgkvKiBFbmQgb2Ygc3RyaW5nICovCisJCQlyZXR1cm47CisJCWNhc2UgZHN0X2xzY19pbmRpcmVjdDovKiBJbmRpcmVjdCB0aHJvdWdoIHByZXZpb3VzLiBBcmcgPT0gNiAqLworCQkJCQkvKiBPciByZWdpc3RlciBheCB4ID09IGFyZyAqLworCQkJaWYgKGVudHJ5LT5oZWFkZXIuYXJnIDwgNikKKwkJCXsKKwkJCQlTWU1CT0xfQ0xBU1Moc3ltKSA9IExPQ19SRUdJU1RFUjsKKwkJCQlTWU1CT0xfVkFMVUUoc3ltKSA9IGVudHJ5LT5oZWFkZXIuYXJnICsgODsKKwkJCX0KKwkJCS8qIFdlIHByZWRpY3QgaW5kaXJlY3RzICovCisJCQlsb2NzdHIrKzsKKwkJCWJyZWFrOworCQljYXNlIGRzdF9sc2NfZHJlZzoKKwkJCVNZTUJPTF9DTEFTUyhzeW0pID0gTE9DX1JFR0lTVEVSOworCQkJU1lNQk9MX1ZBTFVFKHN5bSkgPSBlbnRyeS0+aGVhZGVyLmFyZzsKKwkJCWxvY3N0cisrOworCQkJYnJlYWs7CisJCWNhc2UgZHN0X2xzY19zZWN0aW9uOi8qIFNlY3Rpb24gKGFyZysxKSAqLworCQkJU1lNQk9MX1ZBTFVFKHN5bSkgPSBkc3RfZ2V0X2FkZHIoZW50cnktPmhlYWRlci5hcmcrMSwgMCk7CisJCQlsb2NzdHIrKzsKKwkJCWJyZWFrOworCQljYXNlIGRzdF9sc2Nfc2VjX2J5dGU6IC8qIFNlY3Rpb24gKG5leHRfYnl0ZSsxKSAqLworCQkJU1lNQk9MX1ZBTFVFKHN5bSkgPSBkc3RfZ2V0X2FkZHIobG9jc3RyWzFdKzEsIDApOworCQkJbG9jc3RyKz0yOworCQkJYnJlYWs7CisJCWNhc2UgZHN0X2xzY19hZGQ6CS8qIEFkZCAoYXJnKzEpKjIgKi8KKwkJY2FzZSBkc3RfbHNjX3N1YjoJLyogU3VidHJhY3QgKGFyZysxKSoyICovCisJCQl0ZW1wID0gKGVudHJ5LT5oZWFkZXIuYXJnICsgMSkgKiAyOworCQkJbG9jc3RyKys7CisJCQlpZiAoKmxvY3N0ciA9PSBkc3RfbXVsdGlwbHlfMjU2KQorCQkJeworCQkJCXRlbXAgPDw9IDg7CisJCQkJbG9jc3RyKys7CisJCQl9CisJCQlzd2l0Y2goZW50cnktPmhlYWRlci5jb2RlKQorCQkJeworCQkJY2FzZSBkc3RfbHNjX2FkZDoKKwkJCQlpZiAoU1lNQk9MX0NMQVNTKHN5bSkgPT0gTE9DX0xPQ0FMKQorCQkJCQlTWU1CT0xfQ0xBU1Moc3ltKSA9IExPQ19BUkc7CisJCQkJU1lNQk9MX1ZBTFVFKHN5bSkgKz0gdGVtcDsKKwkJCQlicmVhazsKKwkJCWNhc2UgZHN0X2xzY19zdWI6CisJCQkJU1lNQk9MX1ZBTFVFKHN5bSkgLT0gdGVtcDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIGRzdF9sc2NfYWRkX2J5dGU6CisJCWNhc2UgZHN0X2xzY19zdWJfYnl0ZToKKwkJCXN3aXRjaCAoZW50cnktPmhlYWRlci5hcmcgJiAweDAzKQorCQkJeworCQkJY2FzZSAxOgorCQkJCXRlbXAgPSAodW5zaWduZWQgY2hhcikgbG9jc3RyWzFdOworCQkJCWxvY3N0ciArPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXRlbXAgPSAqICh1bnNpZ25lZCBzaG9ydCAqKSAobG9jc3RyICsgMSk7CisJCQkJbG9jc3RyICs9IDM7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJdGVtcCA9ICogKHVuc2lnbmVkIGxvbmcgKikgKGxvY3N0ciArIDEpOworCQkJCWxvY3N0ciArPSA1OworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCpsb2NzdHIgPT0gZHN0X211bHRpcGx5XzI1NikKKwkJCXsKKwkJCQl0ZW1wIDw8PSA4OworCQkJCWxvY3N0cisrOworCQkJfQorCQkJc3dpdGNoKGVudHJ5LT5oZWFkZXIuY29kZSkKKwkJCXsKKwkJCWNhc2UgZHN0X2xzY19hZGRfYnl0ZToKKwkJCQlpZiAoU1lNQk9MX0NMQVNTKHN5bSkgPT0gTE9DX0xPQ0FMKQorCQkJCQlTWU1CT0xfQ0xBU1Moc3ltKSA9IExPQ19BUkc7CisJCQkJU1lNQk9MX1ZBTFVFKHN5bSkgKz0gdGVtcDsKKwkJCQlicmVhazsKKwkJCWNhc2UgZHN0X2xzY19zdWJfYnl0ZToKKwkJCQlTWU1CT0xfVkFMVUUoc3ltKSAtPSB0ZW1wOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgZHN0X2xzY19zYnJlZzoJLyogU3RhY2sgYmFzZSByZWdpc3RlciAoZnJhbWUgcG9pbnRlcikuIEFyZz09MCovCisJCQlpZiAobmV4dF9lbnRyeS0+aGVhZGVyLmNvZGUgIT0gZHN0X2xzY19pbmRpcmVjdCkKKwkJCXsKKwkJCQlTWU1CT0xfVkFMVUUoc3ltKSA9IDA7CisJCQkJU1lNQk9MX0NMQVNTKHN5bSkgPSBMT0NfU1RBVElDOworCQkJCXJldHVybjsKKwkJCX0KKwkJCVNZTUJPTF9WQUxVRShzeW0pID0gMDsKKwkJCVNZTUJPTF9DTEFTUyhzeW0pID0gTE9DX0xPQ0FMOworCQkJbG9jc3RyKys7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVNZTUJPTF9WQUxVRShzeW0pID0gMDsKKwkJCVNZTUJPTF9DTEFTUyhzeW0pID0gTE9DX1NUQVRJQzsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCBzeW1ib2xfbGlzdCAqCitwcm9jZXNzX2RzdF9zeW1ib2xzKG9iamZpbGUsIGVudHJ5LCBuYW1lLCBuc3ltc19yZXQpCisgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgZHN0X3JlY19wdHJfdCBlbnRyeTsKKyAgICBjaGFyICpuYW1lOworICAgIGludCAqbnN5bXNfcmV0OworeworCXN0cnVjdCBzeW1ib2xfbGlzdCAqbGlzdCA9IE5VTEwsICplbGVtZW50OworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwljaGFyICpzeW1uYW1lOworCWludCBuc3ltcyA9IDA7CisJY2hhciAqbG9jYXRpb247CisJbG9uZyBsaW5lOworCWRzdF90eXBlX3Qgc3ltdHlwZTsKKwlzdHJ1Y3QgdHlwZSAqdHlwZTsKKwlkc3RfdmFyX2F0dHJfdCBhdHRyOworCWRzdF92YXJfbG9jX3QgbG9jX3R5cGU7CisJdW5zaWduZWQgbG9jX2luZGV4OworCWxvbmcJbG9jX3ZhbHVlOworCisJaWYgKCFlbnRyeSkKKwl7CisJCSpuc3ltc19yZXQgPSAwOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbG9jYXRpb24gPSAoY2hhciAqKSBlbnRyeTsKKwl3aGlsZSAoTkVYVF9TWU0oJmxvY2F0aW9uLCAmZW50cnkpICYmCisJICAgICAgIGVudHJ5LT5yZWNfdHlwZSAhPSBkc3RfdHlwX2VuZF9zY29wZSkKKwl7CisJCWlmIChlbnRyeS0+cmVjX3R5cGUgPT0gZHN0X3R5cF92YXIpCisJCXsKKwkJCWlmIChEU1RfdmFyKGVudHJ5KS5zaG9ydF9sb2NzKQorCQkJeworCQkJCWxvY190eXBlID0gRFNUX3ZhcihlbnRyeSkubG9jcy5zaG9ydHNbMF0ubG9jX3R5cGU7CisJCQkJbG9jX2luZGV4ID0gRFNUX3ZhcihlbnRyeSkubG9jcy5zaG9ydHNbMF0ubG9jX2luZGV4OworCQkJCWxvY192YWx1ZSA9IERTVF92YXIoZW50cnkpLmxvY3Muc2hvcnRzWzBdLmxvY2F0aW9uOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWxvY190eXBlID0gRFNUX3ZhcihlbnRyeSkubG9jcy5sb25nc1swXS5sb2NfdHlwZTsKKwkJCQlsb2NfaW5kZXggPSBEU1RfdmFyKGVudHJ5KS5sb2NzLmxvbmdzWzBdLmxvY19pbmRleDsKKwkJCQlsb2NfdmFsdWUgPSBEU1RfdmFyKGVudHJ5KS5sb2NzLmxvbmdzWzBdLmxvY2F0aW9uOworCQkJfQorCQkJaWYgKGxvY190eXBlID09IGRzdF92YXJfbG9jX2V4dGVybmFsKQorCQkJCWNvbnRpbnVlOworCQkJc3ltbmFtZSA9IERTVF9PRkZTRVQoZW50cnksIERTVF92YXIoZW50cnkpLm5vZmZzZXQpOworCQkJbGluZSA9IERTVF92YXIoZW50cnkpLnNyY19sb2MubGluZV9udW1iZXI7CisJCQlzeW10eXBlID0gRFNUX3ZhcihlbnRyeSkudHlwZV9kZXNjOworCQkJYXR0ciA9IERTVF92YXIoZW50cnkpLmF0dHJpYnV0ZXM7CisJCX0KKwkJZWxzZSBpZiAoZW50cnktPnJlY190eXBlID09IGRzdF90eXBfdmFyaWFibGUpCisJCXsKKwkJCXN5bW5hbWUgPSBEU1RfT0ZGU0VUKGVudHJ5LAorCQkJCQkJRFNUX3ZhcmlhYmxlKGVudHJ5KS5ub2Zmc2V0KTsKKwkJCWxpbmUgPSBEU1RfdmFyaWFibGUoZW50cnkpLnNyY19sb2MubGluZV9udW1iZXI7CisJCQlzeW10eXBlID0gRFNUX3ZhcmlhYmxlKGVudHJ5KS50eXBlX2Rlc2M7CisJCQlhdHRyID0gRFNUX3ZhcmlhYmxlKGVudHJ5KS5hdHRyaWJ1dGVzOworCQl9CisJCWVsc2UKKwkJeworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN5bW5hbWUgJiYgbmFtZSAmJiAhc3RyY21wKHN5bW5hbWUsIG5hbWUpKQorCQkJLyogSXQncyB0aGUgZnVuY3Rpb24gcmV0dXJuIHZhbHVlICovCisJCQljb250aW51ZTsKKwkJc3ltID0gY3JlYXRlX25ld19zeW1ib2wob2JqZmlsZSwgc3ltbmFtZSk7CisKKwkJaWYgKChhdHRyICYgKDE8PGRzdF92YXJfYXR0cl9nbG9iYWwpKSB8fAorCQkgICAgKGF0dHIgJiAoMTw8ZHN0X3Zhcl9hdHRyX3N0YXRpYykpKQorCQkJU1lNQk9MX0NMQVNTKHN5bSkgPSBMT0NfU1RBVElDOworCQllbHNlCisJCQlTWU1CT0xfQ0xBU1Moc3ltKSA9IExPQ19MT0NBTDsKKwkJU1lNQk9MX0xJTkUoc3ltKSA9IGxpbmU7CisJCVNZTUJPTF9UWVBFKHN5bSkgPSBkZWNvZGVfdHlwZV9kZXNjKG9iamZpbGUsICZzeW10eXBlLAorCQkJCQkJZW50cnkpOworCQlTWU1CT0xfVkFMVUUoc3ltKSA9IDA7CisJCXN3aXRjaCAoZW50cnktPnJlY190eXBlKQorCQl7CisJCWNhc2UgZHN0X3R5cF92YXI6CisJCQlzd2l0Y2gobG9jX3R5cGUpCisJCQl7CisJCQljYXNlIGRzdF92YXJfbG9jX2FiczoKKwkJCQlTWU1CT0xfVkFMVUVfQUREUkVTUyhzeW0pID0gbG9jX3ZhbHVlOworCQkJCWJyZWFrOworCQkJY2FzZSBkc3RfdmFyX2xvY19zZWN0X29mZjoKKwkJCWNhc2UgZHN0X3Zhcl9sb2NfaW5kX3NlY3Rfb2ZmOiAvKiBXaGF0IGlzIHRoaXM/ICovCisJCQkJU1lNQk9MX1ZBTFVFX0FERFJFU1Moc3ltKSA9IGRzdF9nZXRfYWRkcigKKwkJCQkJCWxvY19pbmRleCwKKwkJCQkJCWxvY192YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIGRzdF92YXJfbG9jX2luZF9yZWdfcmVsOiAvKiBXaGF0IGlzIHRoaXM/ICovCisJCQljYXNlIGRzdF92YXJfbG9jX3JlZ19yZWw6CisJCQkJLyogSWYgaXQgaXNuJ3QgZnAgcmVsYXRpdmUsIHNwZWNpZnkgdGhlCisJCQkJICogcmVnaXN0ZXIgaXQncyByZWxhdGl2ZSB0by4KKwkJCQkgKi8KKwkJCQlpZiAobG9jX2luZGV4KQorCQkJCXsKKwkJCQkJc3ltLT5hdXhfdmFsdWUuYmFzZXJlZyA9IGxvY19pbmRleDsKKwkJCQl9CisJCQkJU1lNQk9MX1ZBTFVFKHN5bSkgPSBsb2NfdmFsdWU7CisJCQkJaWYgKGxvY192YWx1ZSA+IDAgJiYKKwkJCQkgICAgU1lNQk9MX0NMQVNTKHN5bSkgPT0gTE9DX0JBU0VSRUcpCisJCQkJCVNZTUJPTF9DTEFTUyhzeW0pID0gTE9DX0JBU0VSRUdfQVJHOworCQkJCWJyZWFrOworCQkJY2FzZSBkc3RfdmFyX2xvY19yZWc6CisJCQkJU1lNQk9MX1ZBTFVFKHN5bSkgPSBsb2NfaW5kZXg7CisJCQkJU1lNQk9MX0NMQVNTKHN5bSkgPSBMT0NfUkVHSVNURVI7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBkc3RfdHlwX3ZhcmlhYmxlOgorCQkJLyogRXh0ZXJuYWwgdmFyaWFibGUuLi4uLiBkb24ndCB0cnkgdG8gaW50ZXJwcmV0CisJCQkgKiBpdHMgbm9uZXhpc3RhbnQgbG9jc3RyaW5nLgorCQkJICovCisJCQlpZiAoRFNUX3ZhcmlhYmxlKGVudHJ5KS5sb2Zmc2V0ID09IC0xKQorCQkJCWNvbnRpbnVlOworCQkJZGVjb2RlX2RzdF9sb2NzdHJpbmcoRFNUX09GRlNFVChlbnRyeSwKKwkJCQkJCURTVF92YXJpYWJsZShlbnRyeSkubG9mZnNldCksCisJCQkJCSAgICAgc3ltKTsKKwkJfQorCQllbGVtZW50ID0gKHN0cnVjdCBzeW1ib2xfbGlzdCAqKQorCQkJCXhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzeW1ib2xfbGlzdCkpOworCQkKKwkJaWYgKGF0dHIgJiAoMTw8ZHN0X3Zhcl9hdHRyX2dsb2JhbCkpCisJCXsKKwkJCWVsZW1lbnQtPm5leHQgPSBkc3RfZ2xvYmFsX3N5bWJvbHM7CisJCQlkc3RfZ2xvYmFsX3N5bWJvbHMgPSBlbGVtZW50OworCQkJdG90YWxfZ2xvYmFscysrOworCQl9CisJCWVsc2UKKwkJeworCQkJZWxlbWVudC0+bmV4dCA9IGxpc3Q7CisJCQlsaXN0ID0gZWxlbWVudDsKKwkJCW5zeW1zKys7CisJCX0KKwkJZWxlbWVudC0+c3ltYm9sID0gc3ltOworCX0KKwkqbnN5bXNfcmV0ID0gbnN5bXM7CisJcmV0dXJuIGxpc3Q7Cit9CisKKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKgorcHJvY2Vzc19kc3RfZnVuY3Rpb24ob2JqZmlsZSwgZW50cnksIG5hbWUsIGFkZHJlc3MpCisgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgZHN0X3JlY19wdHJfdCBlbnRyeTsKKyAgICBjaGFyICpuYW1lOworICAgIENPUkVfQUREUiBhZGRyZXNzOworeworCXN0cnVjdAlzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QJdHlwZSAqdHlwZSwgKmZ0eXBlOworCWRzdF9yZWNfcHRyX3Qgc3ltX2VudHJ5LCB0eXBfZW50cnk7CisJY2hhciAqbG9jYXRpb247CisJc3RydWN0IHN5bWJvbF9saXN0ICplbGVtZW50OworCisJdHlwZSA9IGJ1aWx0aW5fdHlwZV9pbnQ7CisJc3ltID0gY3JlYXRlX25ld19zeW1ib2wob2JqZmlsZSwgbmFtZSk7CisJU1lNQk9MX0NMQVNTKHN5bSkgPSBMT0NfQkxPQ0s7CisKKwlpZiAoZW50cnkpCisJeworCQlsb2NhdGlvbiA9IChjaGFyICopIGVudHJ5OworCQlkbworCQl7CisJCQlORVhUX1NZTSgmbG9jYXRpb24sICZzeW1fZW50cnkpOworCQl9IHdoaWxlIChzeW1fZW50cnkgJiYgc3ltX2VudHJ5LT5yZWNfdHlwZSAhPSBkc3RfdHlwX3NpZ25hdHVyZSk7CisKKwkJaWYgKHN5bV9lbnRyeSkKKwkJeworCQkJU1lNQk9MX0xJTkUoc3ltKSA9CisJCQkJRFNUX3NpZ25hdHVyZShzeW1fZW50cnkpLnNyY19sb2MubGluZV9udW1iZXI7CisJCQlpZiAoRFNUX3NpZ25hdHVyZShzeW1fZW50cnkpLnJlc3VsdCkKKwkJCXsKKwkJCQl0eXBfZW50cnkgPSAoZHN0X3JlY19wdHJfdCkKKwkJCQkJICAgIERTVF9PRkZTRVQoc3ltX2VudHJ5LAorCQkJCQkgICAgRFNUX3NpZ25hdHVyZShzeW1fZW50cnkpLnJlc3VsdCk7CisJCQkJdHlwZSA9IGRlY29kZV9kc3RfdHlwZShvYmpmaWxlLCB0eXBfZW50cnkpOworCQkJfQorCQl9CisJfQorCisJaWYgKCF0eXBlLT5mdW5jdGlvbl90eXBlKQorCXsKKwkJZnR5cGUgPSBjcmVhdGVfbmV3X3R5cGUob2JqZmlsZSk7CisJCXR5cGUtPmZ1bmN0aW9uX3R5cGUgPSBmdHlwZTsKKwkJZnR5cGUtPnRhcmdldF90eXBlID0gdHlwZTsKKwkJZnR5cGUtPmNvZGUgPSBUWVBFX0NPREVfRlVOQzsKKwl9CisJU1lNQk9MX1RZUEUoc3ltKSA9IHR5cGUtPmZ1bmN0aW9uX3R5cGU7CisKKwkvKiBOb3cgYWRkIG91cnNlbHZlcyB0byB0aGUgZ2xvYmFsIHN5bWJvbHMgbGlzdCAqLworCWVsZW1lbnQgPSAoc3RydWN0IHN5bWJvbF9saXN0ICopCisJCQl4bWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3ltYm9sX2xpc3QpKTsKKworCWVsZW1lbnQtPm5leHQgPSBkc3RfZ2xvYmFsX3N5bWJvbHM7CisJZHN0X2dsb2JhbF9zeW1ib2xzID0gZWxlbWVudDsKKwl0b3RhbF9nbG9iYWxzKys7CisJZWxlbWVudC0+c3ltYm9sID0gc3ltOworCisJcmV0dXJuIHN5bTsKK30KKworc3RhdGljIHN0cnVjdCBibG9jayAqCitwcm9jZXNzX2RzdF9ibG9jayhvYmpmaWxlLCBlbnRyeSkKKyAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICBkc3RfcmVjX3B0cl90IGVudHJ5OworeworCXN0cnVjdAlibG9jawkqYmxvY2s7CisJc3RydWN0CXN5bWJvbAkqZnVuY3Rpb24gPSBOVUxMOworCUNPUkVfQUREUiBhZGRyZXNzOworCWxvbmcJc2l6ZTsKKwljaGFyCSpuYW1lOworCWRzdF9yZWNfcHRyX3QgY2hpbGRfZW50cnksIHN5bWJvbF9lbnRyeTsKKwlzdHJ1Y3QgYmxvY2sgKmNoaWxkX2Jsb2NrOworCWludAl0b3RhbF9zeW1ib2xzID0gMDsKKwljaGFyCWZha2VfbmFtZVsyMF07CisJc3RhdGljCWxvbmcJZmFrZV9zZXEgPSAwOworCXN0cnVjdCBzeW1ib2xfbGlzdCAqc3ltbGlzdCwgKm5leHRzeW07CisJaW50CXN5bW51bTsKKworCWlmIChEU1RfYmxvY2soZW50cnkpLm5vZmZzZXQpCisJCW5hbWUgPSBEU1RfT0ZGU0VUKGVudHJ5LCBEU1RfYmxvY2soZW50cnkpLm5vZmZzZXQpOworCWVsc2UKKwkJbmFtZSA9IE5VTEw7CisJaWYgKERTVF9ibG9jayhlbnRyeSkubl9vZl9jb2RlX3JhbmdlcykKKwl7CisJCWFkZHJlc3MgPSBkc3Rfc3ltX2FkZHIoCisJCQkJJkRTVF9ibG9jayhlbnRyeSkuY29kZV9yYW5nZXNbMF0uY29kZV9zdGFydCk7CisJCXNpemUgPSBEU1RfYmxvY2soZW50cnkpLmNvZGVfcmFuZ2VzWzBdLmNvZGVfc2l6ZTsKKwl9CisJZWxzZQorCXsKKwkJYWRkcmVzcyA9IC0xOworCQlzaXplID0gMDsKKwl9CisJc3ltYm9sX2VudHJ5ID0gKGRzdF9yZWNfcHRyX3QpIGdldF9zZWNfcmVmKCZEU1RfYmxvY2soZW50cnkpLnN5bWJvbHNfc3RhcnQpOworCXN3aXRjaChEU1RfYmxvY2soZW50cnkpLmJsb2NrX3R5cGUpCisJeworCS8qIFRoZXNlIGFyZSBhbGwgcmVhbGx5IGZ1bmN0aW9ucy4gRXZlbiB0aGUgInByb2dyYW0iIHR5cGUuCisJICogVGhpcyBpcyBiZWNhdXNlIHRoZSBBcG9sbG8gT1Mgd2FzIHdyaXR0ZW4gaW4gUGFzY2FsLCBhbmQKKwkgKiBpbiBQYXNjYWwsIHRoZSBtYWluIHByb2NlZHVyZSBpcyBkZXNjcmliZWQgYXMgdGhlIFByb2dyYW0uCisJICogQ3V0ZSwgaHVoPworCSAqLworCWNhc2UgZHN0X2Jsb2NrX3Byb2NlZHVyZToKKwljYXNlIGRzdF9ibG9ja19mdW5jdGlvbjoKKwljYXNlIGRzdF9ibG9ja19zdWJyb3V0aW5lOgorCWNhc2UgZHN0X2Jsb2NrX3Byb2dyYW06CisJCXByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9sKG5hbWUsIGFkZHJlc3MsIG1zdF90ZXh0LCBvYmpmaWxlKTsKKwkJZnVuY3Rpb24gPSBwcm9jZXNzX2RzdF9mdW5jdGlvbigKKwkJCW9iamZpbGUsCisJCQlzeW1ib2xfZW50cnksCisJCQluYW1lLAorCQkJYWRkcmVzcyk7CisJCWVudGVyX2FsbF9saW5lcyhnZXRfc2VjX3JlZigmRFNUX2Jsb2NrKGVudHJ5KS5jb2RlX3Jhbmdlc1swXS5saW5lc19zdGFydCksIGFkZHJlc3MpOworCQlicmVhazsKKwljYXNlIGRzdF9ibG9ja19ibG9ja19kYXRhOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIEdEQiBoYXMgdG8gY2FsbCBpdCBzb21ldGhpbmcsIGFuZCB0aGUgbW9kdWxlIG5hbWUKKwkJICogd29uJ3QgY3V0IGl0CisJCSAqLworCQlzcHJpbnRmKGZha2VfbmFtZSwgImJsb2NrXyUwOGx4IiwgZmFrZV9zZXErKyk7CisJCWZ1bmN0aW9uID0gcHJvY2Vzc19kc3RfZnVuY3Rpb24oCisJCQlvYmpmaWxlLCBOVUxMLCBmYWtlX25hbWUsIGFkZHJlc3MpOworCQlicmVhazsKKwl9CisJc3ltbGlzdCA9IHByb2Nlc3NfZHN0X3N5bWJvbHMob2JqZmlsZSwgc3ltYm9sX2VudHJ5LAorCQkJCQluYW1lLCAmdG90YWxfc3ltYm9scyk7CisJYmxvY2sgPSAoc3RydWN0IGJsb2NrICopCisJICAgIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywKKwkJCQlzaXplb2YgKHN0cnVjdCBibG9jaykgKworCQkJCSh0b3RhbF9zeW1ib2xzIC0gMSkgKiBzaXplb2YgKHN0cnVjdCBzeW1ib2wgKikpOworCisJc3ltbnVtID0gMDsKKwl3aGlsZSAoc3ltbGlzdCkKKwl7CisJCW5leHRzeW0gPSBzeW1saXN0LT5uZXh0OworCisJCWJsb2NrLT5zeW1bc3ltbnVtXSA9IHN5bWxpc3QtPnN5bWJvbDsKKworCQlmcmVlKChQVFIpIHN5bWxpc3QpOworCQlzeW1saXN0ID0gbmV4dHN5bTsKKwkJc3ltbnVtKys7CisJfQorCUJMT0NLX05TWU1TIChibG9jaykgPSB0b3RhbF9zeW1ib2xzOworCUJMT0NLX1NUQVJUIChibG9jaykgPSBhZGRyZXNzOworCUJMT0NLX0VORCAoYmxvY2spID0gYWRkcmVzcyArIHNpemU7CisJQkxPQ0tfU1VQRVJCTE9DSyAoYmxvY2spID0gMDsKKwlpZiAoZnVuY3Rpb24pCisJeworCQlTWU1CT0xfQkxPQ0tfVkFMVUUgKGZ1bmN0aW9uKSA9IGJsb2NrOworCQlCTE9DS19GVU5DVElPTiAoYmxvY2spID0gZnVuY3Rpb247CisJfQorCWVsc2UKKwkJQkxPQ0tfRlVOQ1RJT04gKGJsb2NrKSA9IDA7CisKKwlpZiAoRFNUX2Jsb2NrKGVudHJ5KS5jaGlsZF9ibG9ja19vZmYpCisJeworCQljaGlsZF9lbnRyeSA9IChkc3RfcmVjX3B0cl90KSBEU1RfT0ZGU0VUKGVudHJ5LAorCQkJCQlEU1RfYmxvY2soZW50cnkpLmNoaWxkX2Jsb2NrX29mZik7CisJCXdoaWxlIChjaGlsZF9lbnRyeSkKKwkJeworCQkJY2hpbGRfYmxvY2sgPSBwcm9jZXNzX2RzdF9ibG9jayhvYmpmaWxlLCBjaGlsZF9lbnRyeSk7CisJCQlpZiAoY2hpbGRfYmxvY2spCisJCQl7CisJCQkJaWYgKEJMT0NLX1NUQVJUKGNoaWxkX2Jsb2NrKSA8CisJCQkJICAgICBCTE9DS19TVEFSVChibG9jaykgfHwKKwkJCQkgICAgQkxPQ0tfU1RBUlQoYmxvY2spID09IC0xKQorCQkJCQlCTE9DS19TVEFSVChibG9jaykgPQorCQkJCQkgICAgIEJMT0NLX1NUQVJUKGNoaWxkX2Jsb2NrKTsKKwkJCQlpZiAoQkxPQ0tfRU5EKGNoaWxkX2Jsb2NrKSA+CisJCQkJICAgICBCTE9DS19FTkQoYmxvY2spIHx8CisJCQkJICAgIEJMT0NLX0VORChibG9jaykgPT0gLTEpCisJCQkJCUJMT0NLX0VORChibG9jaykgPQorCQkJCQkgICAgIEJMT0NLX0VORChjaGlsZF9ibG9jayk7CisJCQkJQkxPQ0tfU1VQRVJCTE9DSyAoY2hpbGRfYmxvY2spID0gYmxvY2s7CisJCQl9CisJCQlpZiAoRFNUX2Jsb2NrKGNoaWxkX2VudHJ5KS5zaWJsaW5nX2Jsb2NrX29mZikKKwkJCQljaGlsZF9lbnRyeSA9IChkc3RfcmVjX3B0cl90KSBEU1RfT0ZGU0VUKAorCQkJCQljaGlsZF9lbnRyeSwKKwkJCQkJRFNUX2Jsb2NrKGNoaWxkX2VudHJ5KS5zaWJsaW5nX2Jsb2NrX29mZik7CisJCQllbHNlCisJCQkJY2hpbGRfZW50cnkgPSBOVUxMOworCQl9CisJfQorCXJlY29yZF9wZW5kaW5nX2Jsb2NrIChvYmpmaWxlLCBibG9jaywgTlVMTCk7CisJcmV0dXJuIGJsb2NrOworfQorCisKK3N0YXRpYyB2b2lkCityZWFkX2RzdF9zeW10YWIgKG9iamZpbGUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworCWNoYXIJKmJ1ZmZlcjsKKwlkc3RfcmVjX3B0cl90IGVudHJ5LCBmaWxlX3RhYmxlLCByb290X2Jsb2NrOworCWNoYXIJKnNvdXJjZV9maWxlOworCXN0cnVjdAlibG9jayAqYmxvY2ssICpnbG9iYWxfYmxvY2s7CisJaW50CXN5bW51bTsKKwlzdHJ1Y3Qgc3ltYm9sX2xpc3QgKm5leHRzeW07CisJaW50CW1vZHVsZV9udW0gPSAwOworCXN0cnVjdAlzdHJ1Y3R1cmVfbGlzdCAqZWxlbWVudDsKKworCWN1cnJlbnRfb2JqZmlsZSA9IG9iamZpbGU7CisJYnVmZmVyID0gYmxvY2tzX2luZm8uYnVmZmVyOworCXdoaWxlIChORVhUX0JMSygmYnVmZmVyLCAmZW50cnkpKQorCXsKKwkJaWYgKGVudHJ5LT5yZWNfdHlwZSA9PSBkc3RfdHlwX2NvbXBfdW5pdCkKKwkJeworCQkJZmlsZV90YWJsZSA9IChkc3RfcmVjX3B0cl90KSBEU1RfT0ZGU0VUKGVudHJ5LAorCQkJCQlEU1RfY29tcF91bml0KGVudHJ5KS5maWxlX3RhYmxlKTsKKwkJCXNlY3Rpb25fdGFibGUgPSAoZHN0X3JlY19wdHJfdCkgRFNUX09GRlNFVChlbnRyeSwKKwkJCQkJRFNUX2NvbXBfdW5pdChlbnRyeSkuc2VjdGlvbl90YWJsZSk7CisJCQlyb290X2Jsb2NrID0gKGRzdF9yZWNfcHRyX3QpIERTVF9PRkZTRVQoZW50cnksCisJCQkJCURTVF9jb21wX3VuaXQoZW50cnkpLnJvb3RfYmxvY2tfb2Zmc2V0KTsKKwkJCXNvdXJjZV9maWxlID0gRFNUX09GRlNFVChmaWxlX3RhYmxlLAorCQkJCQlEU1RfZmlsZV90YWIoZmlsZV90YWJsZSkuZmlsZXNbMF0ubm9mZnNldCk7CisJCQkvKiBQb2ludCBidWZmZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGNvbXBfdW5pdCAqLworCQkJYnVmZmVyID0gRFNUX09GRlNFVChlbnRyeSwKKwkJCQkJRFNUX2NvbXBfdW5pdChlbnRyeSkuZGF0YV9zaXplKTsKKwkJCWRzdF9zdGFydF9zeW10YWIoKTsKKworCQkJYmxvY2sgPSBwcm9jZXNzX2RzdF9ibG9jayhvYmpmaWxlLCByb290X2Jsb2NrKTsKKworCQkJZ2xvYmFsX2Jsb2NrID0gKHN0cnVjdCBibG9jayAqKQorCQkJCSAgICBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssCisJCQkJCXNpemVvZiAoc3RydWN0IGJsb2NrKSArCisJCQkJCSh0b3RhbF9nbG9iYWxzIC0gMSkgKgorCQkJCQlzaXplb2YgKHN0cnVjdCBzeW1ib2wgKikpOworCQkJQkxPQ0tfTlNZTVMoZ2xvYmFsX2Jsb2NrKSA9IHRvdGFsX2dsb2JhbHM7CisJCQlmb3IgKHN5bW51bSA9IDA7IHN5bW51bSA8IHRvdGFsX2dsb2JhbHM7IHN5bW51bSsrKQorCQkJeworCQkJCW5leHRzeW0gPSBkc3RfZ2xvYmFsX3N5bWJvbHMtPm5leHQ7CisKKwkJCQlnbG9iYWxfYmxvY2stPnN5bVtzeW1udW1dID0KKwkJCQkJCWRzdF9nbG9iYWxfc3ltYm9scy0+c3ltYm9sOworCisJCQkJZnJlZSgoUFRSKSBkc3RfZ2xvYmFsX3N5bWJvbHMpOworCQkJCWRzdF9nbG9iYWxfc3ltYm9scyA9IG5leHRzeW07CisJCQl9CisJCQlkc3RfZ2xvYmFsX3N5bWJvbHMgPSBOVUxMOworCQkJdG90YWxfZ2xvYmFscyA9IDA7CisJCQlCTE9DS19GVU5DVElPTihnbG9iYWxfYmxvY2spID0gMDsKKwkJCUJMT0NLX1NUQVJUKGdsb2JhbF9ibG9jaykgPSBCTE9DS19TVEFSVChibG9jayk7CisJCQlCTE9DS19FTkQoZ2xvYmFsX2Jsb2NrKSA9IEJMT0NLX0VORChibG9jayk7CisJCQlCTE9DS19TVVBFUkJMT0NLKGdsb2JhbF9ibG9jaykgPSAwOworCQkJQkxPQ0tfU1VQRVJCTE9DSyhibG9jaykgPSBnbG9iYWxfYmxvY2s7CisJCQlyZWNvcmRfcGVuZGluZ19ibG9jayAob2JqZmlsZSwgZ2xvYmFsX2Jsb2NrLCBOVUxMKTsKKworCQkJY29tcGxldGVfc3ltdGFiKHNvdXJjZV9maWxlLAorCQkJCQlCTE9DS19TVEFSVChibG9jayksIAorCQkJCQlCTE9DS19FTkQoYmxvY2spIC0gQkxPQ0tfU1RBUlQoYmxvY2spKTsKKwkJCW1vZHVsZV9udW0rKzsKKwkJCWRzdF9lbmRfc3ltdGFiKG9iamZpbGUpOworCQl9CisJfQorCWlmIChtb2R1bGVfbnVtKQorCQlwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbCgiPGVuZF9vZl9wcm9ncmFtPiIsCisJCQkJQkxPQ0tfRU5EKGJsb2NrKSwgbXN0X3RleHQsIG9iamZpbGUpOworCS8qIE9uZSBtb3JlIGZha2VkIHN5bWJvbCB0byBtYWtlIHN1cmUgbm90aGluZyBjYW4gZXZlciBydW4gb2ZmIHRoZQorCSAqIGVuZCBvZiB0aGUgc3ltYm9sIHRhYmxlLiBUaGlzIG9uZSByZXByZXNlbnRzIHRoZSBlbmQgb2YgdGhlCisJICogdGV4dCBzcGFjZS4gSXQgdXNlZCB0byBiZSAoQ09SRV9BRERSKSAtMSAoZWZmZWN0aXZlbHkgdGhlIGhpZ2hlc3QKKwkgKiBpbnQgcG9zc2libGUpLCBidXQgc29tZSBwYXJ0cyBvZiBnZGIgdHJlYXRlZCBpdCBhcyBhIHNpZ25lZAorCSAqIG51bWJlciBhbmQgZmFpbGVkIGNvbXBhcmlzb25zLiBXZSBjb3VsZCBlcXVhbGx5IHVzZSA3ZmZmZmZmZiwKKwkgKiBidXQgbm8gZnVuY3Rpb25zIGFyZSBldmVyIG1hcHBlZCB0byBhbiBhZGRyZXNzIGhpZ2hlciB0aGFuCisJICogNDAwMDAwMDAKKwkgKi8KKwlwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbCgiPGVuZF9vZl90ZXh0PiIsCisJCQkJKENPUkVfQUREUikgMHg0MDAwMDAwMCwKKwkJCQltc3RfdGV4dCwgb2JqZmlsZSk7CisJd2hpbGUgKHN0cnVjdF9saXN0KQorCXsKKwkJZWxlbWVudCA9IHN0cnVjdF9saXN0OworCQlzdHJ1Y3RfbGlzdCA9IGVsZW1lbnQtPm5leHQ7CisJCWZyZWUoKFBUUikgZWxlbWVudCk7CisJfQorfQorCisMCisvKiBTdXBwb3J0IGZvciBsaW5lIG51bWJlciBoYW5kbGluZyAqLworc3RhdGljIGNoYXIgKmxpbmV0YWIgPSBOVUxMOworc3RhdGljIGxvbmcgbGluZXRhYl9vZmZzZXQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsaW5ldGFiX3NpemU7CisKKy8qIFJlYWQgaW4gYWxsIHRoZSBsaW5lIG51bWJlcnMgZm9yIGZhc3QgbG9va3VwcyBsYXRlci4gIExlYXZlIHRoZW0gaW4KKyAgIGV4dGVybmFsICh1bnN3YXBwZWQpIGZvcm1hdCBpbiBtZW1vcnk7IHdlJ2xsIHN3YXAgdGhlbSBhcyB3ZSBlbnRlcgorICAgdGhlbSBpbnRvIEdEQidzIGRhdGEgc3RydWN0dXJlcy4gICovCitzdGF0aWMgaW50Citpbml0X29uZV9zZWN0aW9uKGNoYW4sIHNlY2luZm8pCisgICAgaW50IGNoYW47CisgICAgZHN0X3NlYyAqc2VjaW5mbzsKK3sKKyAgaWYgKHNlY2luZm8tPnNpemUgPT0gMAorICAgICAgfHwgbHNlZWsoY2hhbiwgc2VjaW5mby0+cG9zaXRpb24sIDApID09IC0xCisgICAgICB8fCAoc2VjaW5mby0+YnVmZmVyID0geG1hbGxvYyhzZWNpbmZvLT5zaXplKSkgPT0gTlVMTAorICAgICAgfHwgbXlyZWFkKGNoYW4sIHNlY2luZm8tPmJ1ZmZlciwgc2VjaW5mby0+c2l6ZSkgPT0gLTEpCisJcmV0dXJuIDA7CisgIGVsc2UKKwlyZXR1cm4gMTsKK30KKyAKK3N0YXRpYyBpbnQKK2luaXRfZHN0X3NlY3Rpb25zIChjaGFuKQorICAgIGludCBjaGFuOworeworCisgIGlmICghaW5pdF9vbmVfc2VjdGlvbihjaGFuLCAmYmxvY2tzX2luZm8pIHx8CisgICAgICAhaW5pdF9vbmVfc2VjdGlvbihjaGFuLCAmbGluZXNfaW5mbykgfHwKKyAgICAgICFpbml0X29uZV9zZWN0aW9uKGNoYW4sICZzeW1ib2xzX2luZm8pKQorICAgIHJldHVybiAtMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBGYWtlIHVwIHN1cHBvcnQgZm9yIHJlbG9jYXRpbmcgc3ltYm9sIGFkZHJlc3Nlcy4gIEZJWE1FLiAgKi8KKworc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyBkc3Rfc3ltZmlsZV9mYWtlciA9IHswfTsKKworc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqCitkc3Rfc3ltZmlsZV9vZmZzZXRzIChvYmpmaWxlLCBhZGRyKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgQ09SRV9BRERSIGFkZHI7Cit7CisgIG9iamZpbGUtPm51bV9zZWN0aW9ucyA9IDE7CisgIHJldHVybiAmZHN0X3N5bWZpbGVfZmFrZXI7Cit9CisKKy8qIFJlZ2lzdGVyIG91ciBhYmlsaXR5IHRvIHBhcnNlIHN5bWJvbHMgZm9yIERTVCBCRkQgZmlsZXMgKi8KKworc3RhdGljIHN0cnVjdCBzeW1fZm5zIGRzdF9zeW1fZm5zID0KK3sKKyAgLyogRklYTUU6IENhbiB0aGlzIGJlIGludGVncmF0ZWQgd2l0aCBjb2ZmcmVhZC5jPyAgSWYgbm90LCBzaG91bGQgaXQgYmUKKyAgICAgYSBzZXBhcmF0ZSBmbGF2b3VyIGxpa2UgZWNvZmY/ICAqLworICAoZW51bSBiZmRfZmxhdm91ciktMiwKKworICBkc3RfbmV3X2luaXQsCQkvKiBzeW1fbmV3X2luaXQ6IGluaXQgYW55dGhpbmcgZ2JsIHRvIGVudGlyZSBzeW10YWIgKi8KKyAgZHN0X3N5bWZpbGVfaW5pdCwJLyogc3ltX2luaXQ6IHJlYWQgaW5pdGlhbCBpbmZvLCBzZXR1cCBmb3Igc3ltX3JlYWQoKSAqLworICBkc3Rfc3ltZmlsZV9yZWFkLAkvKiBzeW1fcmVhZDogcmVhZCBhIHN5bWJvbCBmaWxlIGludG8gc3ltdGFiICovCisgIGRzdF9zeW1maWxlX2ZpbmlzaCwJLyogc3ltX2ZpbmlzaDogZmluaXNoZWQgd2l0aCBmaWxlLCBjbGVhbnVwICovCisgIGRzdF9zeW1maWxlX29mZnNldHMsIC8qIHN5bV9vZmZzZXRzOiAgeGxhdGUgZXh0ZXJuYWwgdG8gaW50ZXJuYWwgZm9ybSAqLworICBOVUxMCQkJLyogbmV4dDogcG9pbnRlciB0byBuZXh0IHN0cnVjdCBzeW1fZm5zICovCit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9kc3RyZWFkICgpCit7CisgIGFkZF9zeW10YWJfZm5zKCZkc3Rfc3ltX2Zucyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvZHZlMzkwMC1yb20uYyBiL2dkYi9kdmUzOTAwLXJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NmRhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZHZlMzkwMC1yb20uYwpAQCAtMCwwICsxLDk2MiBAQAorLyogUmVtb3RlIGRlYnVnZ2luZyBpbnRlcmZhY2UgZm9yIERlbnNhbiBEVkUtUjM5MDAgUk9NIG1vbml0b3IgZm9yCisgICBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJtb25pdG9yLmgiCisjaW5jbHVkZSAic2VyaWFsLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJjb21tYW5kLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgPHRpbWUuaD4KKworLyogVHlwZSBvZiBmdW5jdGlvbiBwYXNzZWQgdG8gYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KKwordHlwZWRlZiB2b2lkICgqc2VjdGlvbl9tYXBfZnVuYykgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdCwgUFRSIG9iaikpOworCisvKiBQYWNrZXQgZXNjYXBlIGNoYXJhY3RlciB1c2VkIGJ5IERlbnNhbiBtb25pdG9yLiAgKi8KKworI2RlZmluZSBQRVNDIDB4ZGMKKworLyogTWF4aW11bSBwYWNrZXQgc2l6ZS4gIFRoaXMgaXMgYWN0dWFsbHkgc21hbGxlciB0aGFuIG5lY2Vzc2FyeQorICAganVzdCB0byBiZSBzYWZlLiAgKi8KKworI2RlZmluZSBNQVhQU0laRSAxMDI0CisKKy8qIEV4dGVybmFsIGZ1bmN0aW9ucy4gICovCisKK2V4dGVybiB2b2lkIHJlcG9ydF90cmFuc2Zlcl9wZXJmb3JtYW5jZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLAorCQkJCQkJIHRpbWVfdCwgdGltZV90KSk7CisKKy8qIENlcnRhaW4gcmVnaXN0ZXJzIGFyZSAiYml0bWFwcGVkIiwgaW4gdGhhdCB0aGUgbW9uaXRvciBjYW4gb25seSBkaXNwbGF5CisgICB0aGVtIG9yIGxldCB0aGUgdXNlciBtb2RpZnkgdGhlbSBhcyBhIHNlcmllcyBvZiBuYW1lZCBiaXRmaWVsZHMuCisgICBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBmaWVsZCBpbiBhIGJpdG1hcHBlZCByZWdpc3Rlci4gICovCisKK3N0cnVjdCBiaXRfZmllbGQKK3sKKyAgY2hhciAqcHJlZml4OwkJLyogc3RyaW5nIGFwcGVhcmluZyBiZWZvcmUgdGhlIHZhbHVlICovCisgIGNoYXIgKnN1ZmZpeDsJCS8qIHN0cmluZyBhcHBlYXJpbmcgYWZ0ZXIgdGhlIHZhbHVlICovCisgIGNoYXIgKnVzZXJfbmFtZTsJLyogbmFtZSB1c2VkIGJ5IGh1bWFuIHdoZW4gZW50ZXJpbmcgZmllbGQgdmFsdWUgKi8KKyAgaW50ICBsZW5ndGg7CQkvKiBudW1iZXIgb2YgYml0cyBpbiB0aGUgZmllbGQgKi8KKyAgaW50ICBzdGFydDsJCS8qIHN0YXJ0aW5nIChsZWFzdCBzaWduaWZpY2FudCkgYml0IG51bWJlciBvZiBmaWVsZCAqLworfTsKKyAgICAgICAgCisvKiBMb2NhbCBmdW5jdGlvbnMgZm9yIHJlZ2lzdGVyIG1hbmlwdWxhdGlvbi4gICovCisKK3N0YXRpYyB2b2lkIHIzOTAwX3N1cHBseV9yZWdpc3RlciBQQVJBTVMgKChjaGFyICpyZWduYW1lLCBpbnQgcmVnbmFtZWxlbiwKKwkJCQkJICAgY2hhciAqdmFsLCBpbnQgdmFsbGVuKSk7CitzdGF0aWMgdm9pZCBmZXRjaF9iYWRfdmFkZHIgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZmV0Y2hfZmllbGRzIFBBUkFNUyAoKHN0cnVjdCBiaXRfZmllbGQgKmJmKSk7CitzdGF0aWMgdm9pZCBmZXRjaF9iaXRtYXBwZWRfcmVnaXN0ZXIgUEFSQU1TICgoaW50IHJlZ25vLAorCQkJCQkJICAgc3RydWN0IGJpdF9maWVsZCAqYmYpKTsKK3N0YXRpYyB2b2lkIHIzOTAwX2ZldGNoX3JlZ2lzdGVycyBQQVJBTVMgKChpbnQgcmVnbm8pKTsKK3N0YXRpYyB2b2lkIHN0b3JlX2JpdG1hcHBlZF9yZWdpc3RlciBQQVJBTVMgKChpbnQgcmVnbm8sCisJCQkJCQkgICAgc3RydWN0IGJpdF9maWVsZCAqYmYpKTsKK3N0YXRpYyB2b2lkIHIzOTAwX3N0b3JlX3JlZ2lzdGVycyBQQVJBTVMgKChpbnQgcmVnbm8pKTsKKworLyogTG9jYWwgZnVuY3Rpb25zIGZvciBmYXN0IGJpbmFyeSBsb2FkaW5nLiAgKi8KKworc3RhdGljIHZvaWQgd3JpdGVfbG9uZyBQQVJBTVMgKChjaGFyICpidWYsIGxvbmcgbikpOworc3RhdGljIHZvaWQgd3JpdGVfbG9uZ19sZSBQQVJBTVMgKChjaGFyICpidWYsIGxvbmcgbikpOworc3RhdGljIGludCAgZGVidWdfcmVhZGNoYXIgUEFSQU1TICgoaW50IGhleCkpOworc3RhdGljIHZvaWQgZGVidWdfd3JpdGUgUEFSQU1TICgodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmbGVuKSk7CitzdGF0aWMgdm9pZCBpZ25vcmVfcGFja2V0IFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHNlbmRfcGFja2V0IFBBUkFNUyAoKGNoYXIgdHlwZSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmbGVuLAorCQkJCSBpbnQgc2VxKSk7CitzdGF0aWMgdm9pZCBwcm9jZXNzX3JlYWRfcmVxdWVzdCBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICpidWYsIGludCBidWZsZW4pKTsKK3N0YXRpYyB2b2lkIGNvdW50X3NlY3Rpb24gUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqcywKKwkJCQkgICB1bnNpZ25lZCBpbnQgKnNlY3Rpb25fY291bnQpKTsKK3N0YXRpYyB2b2lkIGxvYWRfc2VjdGlvbiBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzLAorCQkJCSAgdW5zaWduZWQgaW50ICpkYXRhX2NvdW50KSk7CitzdGF0aWMgdm9pZCByMzkwMF9sb2FkIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lLCBpbnQgZnJvbV90dHkpKTsKKworLyogTWlzY2VsbGFuZW91cyBsb2NhbCBmdW5jdGlvbnMuICAqLworCitzdGF0aWMgdm9pZCByMzkwMF9vcGVuIFBBUkFNUyAoKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkpOworCisKKy8qIFBvaW50ZXJzIHRvIHN0YXRpYyBmdW5jdGlvbnMgaW4gbW9uaXRvci5jIGZvciBmZXRjaGluZyBhbmQgc3RvcmluZworICAgcmVnaXN0ZXJzLiAgV2UgY2FuJ3QgdXNlIHRoZXNlIGZ1bmN0aW9uIGluIGNlcnRhaW4gY2FzZXMgd2hlcmUgdGhlIERlbnNhbgorICAgbW9uaXRvciBhY3RzIHBlcnZlcnNlbHk6IGZvciByZWdpc3RlcnMgdGhhdCBpdCBkaXNwbGF5cyBpbiBiaXQtbWFwCisgICBmb3JtYXQsIGFuZCB0aG9zZSB0aGF0IGNhbid0IGJlIG1vZGlmaWVkIGF0IGFsbC4gIEluIHRob3NlIGNhc2VzCisgICB3ZSBoYXZlIHRvIHVzZSBvdXIgb3duIGZ1bmN0aW9ucyB0byBmZXRjaCBhbmQgc3RvcmUgdGhlaXIgdmFsdWVzLiAgKi8KKworc3RhdGljIHZvaWQgKCpvcmlnX21vbml0b3JfZmV0Y2hfcmVnaXN0ZXJzKSBQQVJBTVMgKChpbnQgcmVnbm8pKTsKK3N0YXRpYyB2b2lkICgqb3JpZ19tb25pdG9yX3N0b3JlX3JlZ2lzdGVycykgUEFSQU1TICgoaW50IHJlZ25vKSk7CisKKy8qIFBvaW50ZXIgdG8gc3RhdGljIGZ1bmN0aW9uIGluIG1vbml0b3IuIGZvciBsb2FkaW5nIHByb2dyYW1zLgorICAgV2UgdXNlIHRoaXMgZnVuY3Rpb24gZm9yIGxvYWRpbmcgUy1yZWNvcmRzIHZpYSB0aGUgc2VyaWFsIGxpbmsuICAqLworCitzdGF0aWMgdm9pZCAoKm9yaWdfbW9uaXRvcl9sb2FkKSBQQVJBTVMgKChjaGFyICpmaWxlLCBpbnQgZnJvbV90dHkpKTsKKworLyogVGhpcyBmbGFnIGlzIHNldCBpZiBhIGZhc3QgZXRoZXJuZXQgZG93bmxvYWQgc2hvdWxkIGJlIHVzZWQuICAqLworCitzdGF0aWMgaW50IGV0aGVybmV0ID0gMDsKKworLyogVGhpcyBhcnJheSBvZiByZWdpc3RlcnMgbmVlZHMgdG8gbWF0Y2ggdGhlIGluZGV4ZXMgdXNlZCBieSBHREIuIFRoZQorICAgd2hvbGUgcmVhc29uIHRoaXMgZXhpc3RzIGlzIGJlY2F1c2UgdGhlIHZhcmlvdXMgUk9NIG1vbml0b3JzIHVzZQorICAgZGlmZmVyZW50IG5hbWVzIHRoYW4gR0RCIGRvZXMsIGFuZCBkb24ndCBzdXBwb3J0IGFsbCB0aGUgcmVnaXN0ZXJzCisgICBlaXRoZXIuICAqLworCitzdGF0aWMgY2hhciAqcjM5MDBfcmVnbmFtZXNbTlVNX1JFR1NdID0KK3sKKyAgInIwIiwgICAicjEiLCAgICJyMiIsICAgInIzIiwgICAicjQiLCAgICJyNSIsICAgInI2IiwgICAicjciLAorICAicjgiLCAgICJyOSIsICAgInIxMCIsICAicjExIiwgICJyMTIiLCAgInIxMyIsICAicjE0IiwgICJyMTUiLAorICAicjE2IiwgICJyMTciLCAgInIxOCIsICAicjE5IiwgICJyMjAiLCAgInIyMSIsICAicjIyIiwgICJyMjMiLAorICAicjI0IiwgICJyMjUiLCAgInIyNiIsICAicjI3IiwgICJyMjgiLCAgInIyOSIsICAicjMwIiwgICJyMzEiLAorCisgICJTIiwgCQkvKiBQU19SRUdOVU0gKi8KKyAgImwiLAkJLyogTE9fUkVHTlVNICovCisgICJoIiwJCS8qIEhJX1JFR05VTSAqLworICAiQiIsCQkvKiBCQURWQUREUl9SRUdOVU0gKi8KKyAgIlBjYXVzZSIsCS8qIENBVVNFX1JFR05VTSAqLworICAicCIJCS8qIFBDX1JFR05VTSAqLworfTsKKworCisvKiBUYWJsZSBvZiByZWdpc3RlciBuYW1lcyBwcm9kdWNlZCBieSBtb25pdG9yJ3MgcmVnaXN0ZXIgZHVtcCBjb21tYW5kLiAgKi8KKworc3RhdGljIHN0cnVjdCByZWdfZW50cnkKK3sKKyAgY2hhciAqbmFtZTsKKyAgaW50IHJlZ25vOworfSByZWdfdGFibGVbXSA9Cit7CisgIHsgInIwX3plcm8iLCAwIH0sICB7ICJyMV9hdCIsICAgMSB9LCAgeyAicjJfdjAiLCAgIDIgfSwgIHsgInIzX3YxIiwgICAzIH0sCisgIHsgInI0X2EwIiwgICA0IH0sICB7ICJyNV9hMSIsICAgNSB9LCAgeyAicjZfYTIiLCAgIDYgfSwgIHsgInI3X2EzIiwgICA3IH0sCisgIHsgInI4X3QwIiwgICA4IH0sICB7ICJyOV90MSIsICAgOSB9LCAgeyAicjEwX3QyIiwgMTAgfSwgIHsgInIxMV90MyIsIDExIH0sCisgIHsgInIxMl90NCIsIDEyIH0sICB7ICJyMTNfdDUiLCAxMyB9LCAgeyAicjE0X3Q2IiwgMTQgfSwgIHsgInIxNV90NyIsIDE1IH0sCisgIHsgInIxNl9zMCIsIDE2IH0sICB7ICJyMTdfczEiLCAxNyB9LCAgeyAicjE4X3MyIiwgMTggfSwgIHsgInIxOV9zMyIsIDE5IH0sCisgIHsgInIyMF9zNCIsIDIwIH0sICB7ICJyMjFfczUiLCAyMSB9LCAgeyAicjIyX3M2IiwgMjIgfSwgIHsgInIyM19zNyIsIDIzIH0sCisgIHsgInIyNF90OCIsIDI0IH0sICB7ICJyMjVfdDkiLCAyNSB9LCAgeyAicjI2X2swIiwgMjYgfSwgIHsgInIyN19rMSIsIDI3IH0sCisgIHsgInIyOF9ncCIsIDI4IH0sICB7ICJyMjlfc3AiLCAyOSB9LCAgeyAicjMwX2ZwIiwgMzAgfSwgIHsgInIzMV9yYSIsIDMxIH0sCisgIHsgIkhJIiwgICAgIEhJX1JFR05VTSB9LAorICB7ICJMTyIsICAgICBMT19SRUdOVU0gfSwKKyAgeyAiUEMiLCAgICAgUENfUkVHTlVNIH0sCisgIHsgIkJhZFYiLCAgIEJBRFZBRERSX1JFR05VTSB9LAorICB7IE5VTEwsICAgICAwIH0KK307CisKKworLyogVGhlIG1vbml0b3IgZGlzcGxheXMgdGhlIGNhY2hlIHJlZ2lzdGVyIGFsb25nIHdpdGggdGhlIHN0YXR1cyByZWdpc3RlciwKKyAgIGFzIGlmIHRoZXkgd2VyZSBhIHNpbmdsZSByZWdpc3Rlci4gIFNvIHdoZW4gd2Ugd2FudCB0byBmZXRjaCB0aGUKKyAgIHN0YXR1cyByZWdpc3RlciwgcGFyc2UgYnV0IG90aGVyd2lzZSBpZ25vcmUgdGhlIGZpZWxkcyBvZiB0aGUKKyAgIGNhY2hlIHJlZ2lzdGVyIHRoYXQgdGhlIG1vbml0b3IgZGlzcGxheXMuICBSZWdpc3RlciBmaWVsZHMgdGhhdCBzaG91bGQKKyAgIGJlIGlnbm9yZWQgaGF2ZSBhIGxlbmd0aCBvZiB6ZXJvIGluIHRoZSB0YWJsZXMgYmVsb3cuICAqLworCitzdGF0aWMgc3RydWN0IGJpdF9maWVsZCBzdGF0dXNfZmllbGRzIFtdID0KK3sKKyAgLyogU3RhdHVzIHJlZ2lzdGVyIHBvcnRpb24gKi8KKyAgeyAiU1JbPENVPSIsCSIgIiwJImN1IiwJNCwgMjggfSwKKyAgeyAiUkU9IiwJIiAiLAkicmUiLAkxLCAyNSB9LAorICB7ICJCRVY9IiwJIiAiLAkiYmV2IiwJMSwgMjIgfSwKKyAgeyAiVFM9IiwJIiAiLAkidHMiLAkxLCAyMSB9LAorICB7ICJObWk9IiwJIiAiLAkibm1pIiwJMSwgMjAgfSwKKyAgeyAiSU5UPSIsCSIgIiwJImludCIsICA2LCAxMCB9LAorICB7ICJTVz0iLAkiPl0iLAkic3ciLCAgIDIsICA4IH0sCisgIHsgIls8S1VPPSIsCSIgIiwJImt1byIsICAxLCAgNSB9LAorICB7ICJJRU89IiwJIiAiLAkiaWVvIiwgIDEsICA0IH0sCisgIHsgIktVUD0iLAkiICIsCSJrdXAiLCAgMSwgIDMgfSwKKyAgeyAiSUVQPSIsCSIgIiwJImllcCIsICAxLCAgMiB9LAorICB7ICJLVUM9IiwJIiAiLAkia3VjIiwgIDEsICAxIH0sCisgIHsgIklFQz0iLAkiPl0iLAkiaWVjIiwgIDEsICAwIH0sCisKKyAgLyogQ2FjaGUgcmVnaXN0ZXIgcG9ydGlvbiAoZHVtbXkgZm9yIHBhcnNpbmcgb25seSkgKi8KKyAgeyAiQ1JbPElhbE89IiwiICIsCSJpYWxvIiwJMCwgMTMgfSwKKyAgeyAiRGFsTz0iLAkiICIsCSJkYWxvIiwJMCwgMTIgfSwKKyAgeyAiSWFsUD0iLAkiICIsCSJpYWxwIiwJMCwgMTEgfSwKKyAgeyAiRGFsUD0iLAkiICIsCSJkYWxwIiwJMCwgMTAgfSwKKyAgeyAiSWFsQz0iLAkiICIsCSJpYWxjIiwJMCwgIDkgfSwKKyAgeyAiRGFsQz0iLAkiPl0gIiwJImRhbGMiLAkwLCAgOCB9LAorCisgIHsgTlVMTCwJTlVMTCwJMCwgIDAgfQkJLyogZW5kIG9mIHRhYmxlIG1hcmtlciAqLworfTsKKworCisjaWYgMAkvKiBGSVhNRTogRW5hYmxlIHdoZW4gd2UgYWRkIHN1cHBvcnQgZm9yIG1vZGlmeWluZyBjYWNoZSByZWdpc3Rlci4gICovCitzdGF0aWMgc3RydWN0IGJpdF9maWVsZCBjYWNoZV9maWVsZHMgW10gPQoreworICAvKiBTdGF0dXMgcmVnaXN0ZXIgcG9ydGlvbiAoZHVtbXkgZm9yIHBhcnNpbmcgb25seSkgKi8KKyAgeyAiU1JbPENVPSIsCSIgIiwJImN1IiwJMCwgMjggfSwKKyAgeyAiUkU9IiwJIiAiLAkicmUiLAkwLCAyNSB9LAorICB7ICJCRVY9IiwJIiAiLAkiYmV2IiwJMCwgMjIgfSwKKyAgeyAiVFM9IiwJIiAiLAkidHMiLAkwLCAyMSB9LAorICB7ICJObWk9IiwJIiAiLAkibm1pIiwJMCwgMjAgfSwKKyAgeyAiSU5UPSIsCSIgIiwJImludCIsICAwLCAxMCB9LAorICB7ICJTVz0iLAkiPl0iLAkic3ciLCAgIDAsICA4IH0sCisgIHsgIls8S1VPPSIsCSIgIiwJImt1byIsICAwLCAgNSB9LAorICB7ICJJRU89IiwJIiAiLAkiaWVvIiwgIDAsICA0IH0sCisgIHsgIktVUD0iLAkiICIsCSJrdXAiLCAgMCwgIDMgfSwKKyAgeyAiSUVQPSIsCSIgIiwJImllcCIsICAwLCAgMiB9LAorICB7ICJLVUM9IiwJIiAiLAkia3VjIiwgIDAsICAxIH0sCisgIHsgIklFQz0iLAkiPl0iLAkiaWVjIiwgIDAsICAwIH0sCisKKyAgLyogQ2FjaGUgcmVnaXN0ZXIgcG9ydGlvbiAgKi8KKyAgeyAiQ1JbPElhbE89IiwiICIsCSJpYWxvIiwJMSwgMTMgfSwKKyAgeyAiRGFsTz0iLAkiICIsCSJkYWxvIiwJMSwgMTIgfSwKKyAgeyAiSWFsUD0iLAkiICIsCSJpYWxwIiwJMSwgMTEgfSwKKyAgeyAiRGFsUD0iLAkiICIsCSJkYWxwIiwJMSwgMTAgfSwKKyAgeyAiSWFsQz0iLAkiICIsCSJpYWxjIiwJMSwgIDkgfSwKKyAgeyAiRGFsQz0iLAkiPl0gIiwJImRhbGMiLAkxLCAgOCB9LAorCisgIHsgTlVMTCwJTlVMTCwJTlVMTCwJMCwgIDAgfQkJLyogZW5kIG9mIHRhYmxlIG1hcmtlciAqLworfTsKKyNlbmRpZgorCisKK3N0YXRpYyBzdHJ1Y3QgYml0X2ZpZWxkIGNhdXNlX2ZpZWxkc1tdID0gCit7CisgIHsgIjxCRD0iLAkiICIsCSJiZCIsICAgMSwgMzEgfSwKKyAgeyAiQ0U9IiwJIiAiLAkiY2UiLCAgIDIsIDI4IH0sCisgIHsgIklQPSIsCSIgIiwJImlwIiwgICA2LCAxMCB9LAorICB7ICJTVz0iLCAJIiAiLAkic3ciLCAgIDIsICA4IH0sCisgIHsgIkVDPSIsIAkiPl0iICwJImVjIiwgICA1LCAgMiB9LAorCisgIHsgTlVMTCwJTlVMTCwJTlVMTCwJMCwgIDAgfQkJLyogZW5kIG9mIHRhYmxlIG1hcmtlciAqLworfTsKKworCisvKiBUaGUgbW9uaXRvciBwcmludHMgcmVnaXN0ZXIgdmFsdWVzIGluIHRoZSBmb3JtCisKKwlyZWduYW1lID0geHh4eCB4eHh4CisKKyAgIFdlIGxvb2sgdXAgdGhlIHJlZ2lzdGVyIG5hbWUgaW4gYSB0YWJsZSwgYW5kIHJlbW92ZSB0aGUgZW1iZWRkZWQgc3BhY2UgaW4KKyAgIHRoZSBoZXggdmFsdWUgYmVmb3JlIHBhc3NpbmcgaXQgdG8gbW9uaXRvcl9zdXBwbHlfcmVnaXN0ZXIuICAqLworCitzdGF0aWMgdm9pZAorcjM5MDBfc3VwcGx5X3JlZ2lzdGVyIChyZWduYW1lLCByZWduYW1lbGVuLCB2YWwsIHZhbGxlbikKKyAgICAgY2hhciAqcmVnbmFtZTsKKyAgICAgaW50IHJlZ25hbWVsZW47CisgICAgIGNoYXIgKnZhbDsKKyAgICAgaW50IHZhbGxlbjsKK3sKKyAgaW50IHJlZ25vID0gLTE7CisgIGludCBpOworICBjaGFyIHZhbGJ1ZlsxMF07CisgIGNoYXIgKnA7CisKKyAgLyogUGVyZm9ybSBzb21lIHNhbml0eSBjaGVja3Mgb24gdGhlIHJlZ2lzdGVyIG5hbWUgYW5kIHZhbHVlLiAgKi8KKyAgaWYgKHJlZ25hbWVsZW4gPCAyIHx8IHJlZ25hbWVsZW4gPiA3IHx8IHZhbGxlbiAhPSA5KQorICAgIHJldHVybjsKKworICAvKiBMb29rIHVwIHRoZSByZWdpc3RlciBuYW1lLiAgKi8KKyAgZm9yIChpID0gMDsgcmVnX3RhYmxlW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgIHsKKyAgICAgIGludCBybGVuID0gc3RybGVuIChyZWdfdGFibGVbaV0ubmFtZSk7CisgICAgICBpZiAocmxlbiA9PSByZWduYW1lbGVuICYmIHN0cm5jbXAgKHJlZ25hbWUsIHJlZ190YWJsZVtpXS5uYW1lLCBybGVuKSA9PSAwKQorCXsKKwkgIHJlZ25vID0gcmVnX3RhYmxlW2ldLnJlZ25vOworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgaWYgKHJlZ25vID09IC0xKQorICAgIHJldHVybjsKKworICAvKiBDb3B5IHRoZSBoZXggdmFsdWUgdG8gYSBidWZmZXIgYW5kIGVsaW1pbmF0ZSB0aGUgZW1iZWRkZWQgc3BhY2UuICovCisgIGZvciAoaSA9IDAsIHAgPSB2YWxidWY7IGkgPCB2YWxsZW47IGkrKykKKyAgICBpZiAodmFsW2ldICE9ICcgJykKKyAgICAgICpwKysgPSB2YWxbaV07CisgICpwID0gJ1wwJzsKKworICBtb25pdG9yX3N1cHBseV9yZWdpc3RlciAocmVnbm8sIHZhbGJ1Zik7Cit9CisKKworLyogRmV0Y2ggdGhlIEJhZFZhZGRyIHJlZ2lzdGVyLiAgVW5saWtlIHRoZSBvdGhlciByZWdpc3RlcnMsIHRoaXMKKyAgIG9uZSBjYW4ndCBiZSBtb2RpZmllZCwgYW5kIHRoZSBtb25pdG9yIHdvbid0IGV2ZW4gcHJvbXB0IHRvIGxldAorICAgeW91IG1vZGlmeSBpdC4gICovCisKK3N0YXRpYyB2b2lkCitmZXRjaF9iYWRfdmFkZHIoKQoreworICBjaGFyIGJ1ZlsyMF07CisKKyAgbW9uaXRvcl9wcmludGYgKCJ4QlxyIik7CisgIG1vbml0b3JfZXhwZWN0ICgiQmFkVj0iLCBOVUxMLCAwKTsKKyAgbW9uaXRvcl9leHBlY3RfcHJvbXB0IChidWYsIHNpemVvZihidWYpKTsKKyAgbW9uaXRvcl9zdXBwbHlfcmVnaXN0ZXIgKEJBRFZBRERSX1JFR05VTSwgYnVmKTsKK30KKworICAgIAorLyogUmVhZCBhIHNlcmllcyBvZiBiaXQgZmllbGRzIGZyb20gdGhlIG1vbml0b3IsIGFuZCByZXR1cm4gdGhlaXIKKyAgIGNvbWJpbmVkIGJpbmFyeSB2YWx1ZS4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitmZXRjaF9maWVsZHMgKGJmKQorICAgICBzdHJ1Y3QgYml0X2ZpZWxkICpiZjsKK3sKKyAgY2hhciBidWZbMjBdOworICB1bnNpZ25lZCBsb25nIHZhbCA9IDA7CisgIHVuc2lnbmVkIGxvbmcgYml0czsKKworICBmb3IgKCA7IGJmLT5wcmVmaXggIT0gTlVMTDsgYmYrKykKKyAgICB7CisgICAgICBtb25pdG9yX2V4cGVjdCAoYmYtPnByZWZpeCwgTlVMTCwgMCk7CQkvKiBnZXQgcHJlZml4ICovCisgICAgICBtb25pdG9yX2V4cGVjdCAoYmYtPnN1ZmZpeCwgYnVmLCBzaXplb2YgKGJ1ZikpOwkvKiBoZXggdmFsdWUsIHN1ZmZpeCAqLworICAgICAgaWYgKGJmLT5sZW5ndGggIT0gMCkKKyAgICAgICAgeworCSAgYml0cyA9IHN0cnRvdWwgKGJ1ZiwgTlVMTCwgMTYpOwkvKiBnZXQgZmllbGQgdmFsdWUgKi8KKwkgIGJpdHMgJj0gKCgxIDw8IGJmLT5sZW5ndGgpIC0gMSk7CS8qIG1hc2sgb3V0IHVzZWxlc3MgYml0cyAqLworCSAgdmFsIHw9IGJpdHMgPDwgYmYtPnN0YXJ0OwkJLyogaW5zZXJ0IGludG8gcmVnaXN0ZXIgKi8KKwl9CisJICAKKyAgICB9CisKKyAgcmV0dXJuIHZhbDsKK30KKworCitzdGF0aWMgdm9pZAorZmV0Y2hfYml0bWFwcGVkX3JlZ2lzdGVyIChyZWdubywgYmYpCisgICAgIGludCByZWdubzsKKyAgICAgc3RydWN0IGJpdF9maWVsZCAqYmY7Cit7CisgIHVuc2lnbmVkIGxvbmcgdmFsOworICB1bnNpZ25lZCBjaGFyIHJlZ2J1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworCisgIG1vbml0b3JfcHJpbnRmICgieCVzXHIiLCByMzkwMF9yZWduYW1lc1tyZWdub10pOworICB2YWwgPSBmZXRjaF9maWVsZHMgKGJmKTsKKyAgbW9uaXRvcl9wcmludGYgKCIuXHIiKTsKKyAgbW9uaXRvcl9leHBlY3RfcHJvbXB0IChOVUxMLCAwKTsKKworICAvKiBzdXBwbHkgcmVnaXN0ZXIgc3RvcmVzIGluIHRhcmdldCBieXRlIG9yZGVyLCBzbyBzd2FwIGhlcmUgKi8KKworICBzdG9yZV91bnNpZ25lZF9pbnRlZ2VyIChyZWdidWYsIFJFR0lTVEVSX1JBV19TSVpFIChyZWdubyksIHZhbCk7CisgIHN1cHBseV9yZWdpc3RlciAocmVnbm8sIHJlZ2J1Zik7CisKK30KKworCisvKiBGZXRjaCBhbGwgcmVnaXN0ZXJzIChpZiByZWdubyBpcyAtMSksIG9yIG9uZSByZWdpc3RlciBmcm9tIHRoZQorICAgbW9uaXRvci4gIEZvciBtb3N0IHJlZ2lzdGVycywgd2UgY2FuIHVzZSB0aGUgZ2VuZXJpYyBtb25pdG9yXworICAgbW9uaXRvcl9mZXRjaF9yZWdpc3RlcnMgZnVuY3Rpb24uICBCdXQgb3RoZXJzIGFyZSBkaXNwbGF5ZWQgaW4KKyAgIGEgdmVyeSB1bnVzdWFsIGZhc2hpb24gYnkgdGhlIG1vbml0b3IsIGFuZCBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5LiAgKi8KKworc3RhdGljIHZvaWQKK3IzOTAwX2ZldGNoX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgc3dpdGNoIChyZWdubykKKyAgICB7CisgICAgY2FzZSBCQURWQUREUl9SRUdOVU06CisgICAgICBmZXRjaF9iYWRfdmFkZHIgKCk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBQU19SRUdOVU06CisgICAgICBmZXRjaF9iaXRtYXBwZWRfcmVnaXN0ZXIgKFBTX1JFR05VTSwgc3RhdHVzX2ZpZWxkcyk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBDQVVTRV9SRUdOVU06CisgICAgICBmZXRjaF9iaXRtYXBwZWRfcmVnaXN0ZXIgKENBVVNFX1JFR05VTSwgY2F1c2VfZmllbGRzKTsKKyAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgb3JpZ19tb25pdG9yX2ZldGNoX3JlZ2lzdGVycyAocmVnbm8pOworICAgIH0KK30KKworCisvKiBXcml0ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBiaXRtYXBwZWQgcmVnaXN0ZXIgdG8gdGhlIG1vbml0b3IuICAqLworCitzdGF0aWMgdm9pZAorc3RvcmVfYml0bWFwcGVkX3JlZ2lzdGVyIChyZWdubywgYmYpCisgICAgIGludCByZWdubzsKKyAgICAgc3RydWN0IGJpdF9maWVsZCAqYmY7Cit7CisgIHVuc2lnbmVkIGxvbmcgb2xkdmFsLCBuZXd2YWw7CisKKyAgLyogRmV0Y2ggdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyLiAgKi8KKyAgbW9uaXRvcl9wcmludGYgKCJ4JXNcciIsIHIzOTAwX3JlZ25hbWVzW3JlZ25vXSk7CisgIG9sZHZhbCA9IGZldGNoX2ZpZWxkcyAoYmYpOworICBuZXd2YWwgPSByZWFkX3JlZ2lzdGVyIChyZWdubyk7CisKKyAgLyogVG8gc2F2ZSB0aW1lLCB3cml0ZSBqdXN0IHRoZSBmaWVsZHMgdGhhdCBoYXZlIGNoYW5nZWQuICAqLworICBmb3IgKCA7IGJmLT5wcmVmaXggIT0gTlVMTDsgYmYrKykKKyAgICB7CisgICAgICBpZiAoYmYtPmxlbmd0aCAhPSAwKQorICAgICAgICB7CisJICB1bnNpZ25lZCBsb25nIG9sZGJpdHMsIG5ld2JpdHMsIG1hc2s7CisKKwkgIG1hc2sgPSAoMSA8PCBiZi0+bGVuZ3RoKSAtIDE7CisJICBvbGRiaXRzID0gKG9sZHZhbCA+PiBiZi0+c3RhcnQpICYgbWFzazsKKwkgIG5ld2JpdHMgPSAobmV3dmFsID4+IGJmLT5zdGFydCkgJiBtYXNrOworCSAgaWYgKG9sZGJpdHMgIT0gbmV3Yml0cykKKwkgICAgbW9uaXRvcl9wcmludGYgKCIlcyAleCAiLCBiZi0+dXNlcl9uYW1lLCBuZXdiaXRzKTsKKwl9CisgICAgfQorCisgIG1vbml0b3JfcHJpbnRmICgiLlxyIik7CisgIG1vbml0b3JfZXhwZWN0X3Byb21wdCAoTlVMTCwgMCk7Cit9CisKKworc3RhdGljIHZvaWQKK3IzOTAwX3N0b3JlX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgc3dpdGNoIChyZWdubykKKyAgICB7CisgICAgY2FzZSBQU19SRUdOVU06CisgICAgICBzdG9yZV9iaXRtYXBwZWRfcmVnaXN0ZXIgKFBTX1JFR05VTSwgc3RhdHVzX2ZpZWxkcyk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBDQVVTRV9SRUdOVU06CisgICAgICBzdG9yZV9iaXRtYXBwZWRfcmVnaXN0ZXIgKENBVVNFX1JFR05VTSwgY2F1c2VfZmllbGRzKTsKKyAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgb3JpZ19tb25pdG9yX3N0b3JlX3JlZ2lzdGVycyAocmVnbm8pOworICAgIH0KK30KKworCisvKiBXcml0ZSBhIDQtYnl0ZSBpbnRlZ2VyIHRvIHRoZSBidWZmZXIgaW4gYmlnLWVuZGlhbiBvcmRlci4gICovCisKK3N0YXRpYyB2b2lkCit3cml0ZV9sb25nIChidWYsIG4pCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgbG9uZyBuOworeworICBidWZbMF0gPSAobiA+PiAyNCkgJiAweGZmOworICBidWZbMV0gPSAobiA+PiAxNikgJiAweGZmOworICBidWZbMl0gPSAobiA+PiA4KSAmIDB4ZmY7CisgIGJ1ZlszXSA9IG4gJiAweGZmOworfQorCisKKy8qIFdyaXRlIGEgNC1ieXRlIGludGVnZXIgdG8gdGhlIGJ1ZmZlciBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyLiAgKi8KKworc3RhdGljIHZvaWQKK3dyaXRlX2xvbmdfbGUgKGJ1ZiwgbikKKyAgICAgY2hhciAqYnVmOworICAgICBsb25nIG47Cit7CisgIGJ1ZlswXSA9IG4gJiAweGZmOworICBidWZbMV0gPSAobiA+PiA4KSAmIDB4ZmY7CisgIGJ1ZlsyXSA9IChuID4+IDE2KSAmIDB4ZmY7CisgIGJ1ZlszXSA9IChuID4+IDI0KSAmIDB4ZmY7Cit9CisKKworLyogUmVhZCBhIGNoYXJhY3RlciBmcm9tIHRoZSBtb25pdG9yLiAgSWYgcmVtb3RlIGRlYnVnZ2luZyBpcyBvbiwKKyAgIHByaW50IHRoZSByZWNlaXZlZCBjaGFyYWN0ZXIuICBJZiBIRVggaXMgbm9uLXplcm8sIHByaW50IHRoZQorICAgY2hhcmFjdGVyIGluIGhleGFkZWNpbWFsOyBvdGhlcndpc2UsIHByaW50IGl0IGluIEFTQ0lJLiAgKi8KKworc3RhdGljIGludAorZGVidWdfcmVhZGNoYXIgKGhleCkKKyAgICAgaW50IGhleDsKK3sKKyAgY2hhciBidWYgWzEwXTsKKyAgaW50IGMgPSBtb25pdG9yX3JlYWRjaGFyICgpOworCisgIGlmIChyZW1vdGVfZGVidWcgPiAwKQorICAgIHsKKyAgICAgIGlmIChoZXgpCisJc3ByaW50ZiAoYnVmLCAiWyUwMnhdIiwgYyAmIDB4ZmYpOworICAgICAgZWxzZSBpZiAoYyA9PSAnXDAnKQorCXN0cmNweSAoYnVmLCAiXFwwIik7CisgICAgICBlbHNlIAorCXsKKwkgIGJ1ZlswXSA9IGM7CisJICBidWZbMV0gPSAnXDAnOworCX0KKyAgICAgIHB1dHNfZGVidWcgKCJSZWFkIC0tPiIsIGJ1ZiwgIjwtLSIpOworICAgIH0KKyAgcmV0dXJuIGM7Cit9CisKKworLyogU2VuZCBhIGJ1ZmZlciBvZiBjaGFyYWN0ZXJzIHRvIHRoZSBtb25pdG9yLiAgSWYgcmVtb3RlIGRlYnVnZ2luZyBpcyBvbiwKKyAgIHByaW50IHRoZSBzZW50IGJ1ZmZlciBpbiBoZXguICAqLworCitzdGF0aWMgdm9pZAorZGVidWdfd3JpdGUgKGJ1ZiwgYnVmbGVuKQorICAgICB1bnNpZ25lZCBjaGFyICpidWY7CisgICAgIGludCBidWZsZW47Cit7CisgIGNoYXIgc1sxMF07CisKKyAgbW9uaXRvcl93cml0ZSAoYnVmLCBidWZsZW4pOworCisgIGlmIChyZW1vdGVfZGVidWcgPiAwKQorICAgIHsKKyAgICAgIHdoaWxlIChidWZsZW4tLSA+IDApCisJeworCSAgc3ByaW50ZiAocywgIlslMDJ4XSIsICpidWYgJiAweGZmKTsKKwkgIHB1dHNfZGVidWcgKCJTZW50IC0tPiIsIHMsICI8LS0iKTsKKwkgIGJ1ZisrOworCX0KKyAgICB9Cit9CisKKworLyogSWdub3JlIGEgcGFja2V0IHNlbnQgdG8gdXMgYnkgdGhlIG1vbml0b3IuICBJdCBzZW5kIHBhY2tldHMKKyAgIHdoZW4gaXRzIGNvbnNvbGUgaXMgaW4gImNvbW11bmljYXRpb25zIGludGVyZmFjZSIgbW9kZS4gICBBIHBhY2tldAorICAgaXMgb2YgdGhpcyBmb3JtOgorCisgICAgICBzdGFydCBvZiBwYWNrZXQgZmxhZyAob25lIGJ5dGU6IDB4ZGMpCisgICAgICBwYWNrZXQgdHlwZSAob25lIGJ5dGUpCisgICAgICBsZW5ndGggKGxvdyBieXRlKQorICAgICAgbGVuZ3RoIChoaWdoIGJ5dGUpCisgICAgICBkYXRhIChsZW5ndGggYnl0ZXMpCisKKyAgIFRoZSBsYXN0IHR3byBieXRlcyBvZiB0aGUgZGF0YSBmaWVsZCBhcmUgYSBjaGVja3N1bSwgYnV0IHdlIGRvbid0CisgICBib3RoZXIgdG8gdmVyaWZ5IGl0LgorKi8KKworc3RhdGljIHZvaWQKK2lnbm9yZV9wYWNrZXQgKCkKK3sKKyAgaW50IGM7CisgIGludCBsZW47ICAKKworICAvKiBJZ25vcmUgbG90cyBvZiB0cmFzaCAobWVzc2FnZXMgYWJvdXQgc2VjdGlvbiBhZGRyZXNzZXMsIGZvciBleGFtcGxlKQorICAgICB1bnRpbCB3ZSBzZWUgdGhlIHN0YXJ0IG9mIGEgcGFja2V0LiAgKi8KKyAgZm9yIChsZW4gPSAwOyBsZW4gPCAyNTY7IGxlbisrKQorICAgIHsKKyAgICAgIGMgPSBkZWJ1Z19yZWFkY2hhciAoMCk7CisgICAgICBpZiAoYyA9PSBQRVNDKQorCWJyZWFrOworICAgIH0KKyAgaWYgKGxlbiA9PSA4KQorICAgIGVycm9yICgiUGFja2V0IGhlYWRlciBieXRlIG5vdCBmb3VuZDsgJTAyeCBzZWVuIGluc3RlYWQuIiwgYyk7CisKKyAgLyogUmVhZCB0aGUgcGFja2V0IHR5cGUgYW5kIGxlbmd0aC4gICovCisgIGMgPSBkZWJ1Z19yZWFkY2hhciAoMSk7CQkJLyogdHlwZSAqLworCisgIGMgPSBkZWJ1Z19yZWFkY2hhciAoMSk7CQkJLyogbG93IGJ5dGUgb2YgbGVuZ3RoICovCisgIGxlbiA9IGMgJiAweGZmOworCisgIGMgPSBkZWJ1Z19yZWFkY2hhciAoMSk7CQkJLyogaGlnaCBieXRlIG9mIGxlbmd0aCAqLworICBsZW4gKz0gKGMgJiAweGZmKSA8PCA4OworCisgIC8qIElnbm9yZSB0aGUgcmVzdCBvZiB0aGUgcGFja2V0LiAgKi8KKyAgd2hpbGUgKGxlbi0tID4gMCkKKyAgICBjID0gZGVidWdfcmVhZGNoYXIgKDEpOworfQorCisKKy8qIEVuY2Fwc3VsYXRlIHNvbWUgZGF0YSBpbnRvIGEgcGFja2V0IGFuZCBzZW5kIGl0IHRvIHRoZSBtb25pdG9yLgorCisgICBUaGUgJ3AnIHBhY2tldCBpcyBhIHNwZWNpYWwgY2FzZS4gIFRoaXMgaXMgYSBwYWNrZXQgd2Ugc2VuZAorICAgaW4gcmVzcG9uc2UgdG8gYSByZWFkICgncicpIHBhY2tldCBmcm9tIHRoZSBtb25pdG9yLiAgVGhpcyBmdW5jdGlvbgorICAgYXBwZW5kcyBhIG9uZS1ieXRlIHNlcXVlbmNlIG51bWJlciB0byB0aGUgZGF0YSBmaWVsZCBvZiBzdWNoIGEgcGFja2V0LgorKi8KKworc3RhdGljIHZvaWQKK3NlbmRfcGFja2V0ICh0eXBlLCBidWYsIGJ1Zmxlbiwgc2VxKQorICAgICBjaGFyIHR5cGU7CisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICAgaW50IGJ1Zmxlbiwgc2VxOworeworICB1bnNpZ25lZCBjaGFyIGhkcls0XTsKKyAgaW50IGxlbiA9IGJ1ZmxlbjsKKyAgaW50IHN1bSwgaTsKKworICAvKiBJZiB0aGlzIGlzIGEgJ3AnIHBhY2tldCwgYWRkIG9uZSBieXRlIGZvciBhIHNlcXVlbmNlIG51bWJlci4gICovCisgIGlmICh0eXBlID09ICdwJykKKyAgICBsZW4rKzsKKworICAvKiBJZiB0aGUgYnVmZmVyIGhhcyBhIG5vbi16ZXJvIGxlbmd0aCwgYWRkIHR3byBieXRlcyBmb3IgYSBjaGVja3N1bS4gICovCisgIGlmIChsZW4gPiAwKQorICAgIGxlbiArPSAyOworCisgIC8qIFdyaXRlIHRoZSBwYWNrZXQgaGVhZGVyLiAgKi8KKyAgaGRyWzBdID0gUEVTQzsKKyAgaGRyWzFdID0gdHlwZTsKKyAgaGRyWzJdID0gbGVuICYgMHhmZjsKKyAgaGRyWzNdID0gKGxlbiA+PiA4KSAmIDB4ZmY7CisgIGRlYnVnX3dyaXRlIChoZHIsIHNpemVvZiAoaGRyKSk7CisKKyAgaWYgKGxlbikKKyAgICB7CisgICAgICAvKiBXcml0ZSB0aGUgcGFja2V0IGRhdGEuICAqLworICAgICAgZGVidWdfd3JpdGUgKGJ1ZiwgYnVmbGVuKTsKKworICAgICAgLyogV3JpdGUgdGhlIHNlcXVlbmNlIG51bWJlciBpZiB0aGlzIGlzIGEgJ3AnIHBhY2tldC4gICovCisgICAgICBpZiAodHlwZSA9PSAncCcpCisJeworCSAgaGRyWzBdID0gc2VxOworCSAgZGVidWdfd3JpdGUgKGhkciwgMSk7CisJfQorCisgICAgICAvKiBXcml0ZSB0aGUgY2hlY2tzdW0uICAqLworICAgICAgc3VtID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBidWZsZW47IGkrKykKKwl7CisJICBpbnQgdG1wID0gKGJ1ZltpXSAmIDB4ZmYpOworCSAgaWYgKGkgJiAxKQorCSAgICBzdW0gKz0gdG1wOworCSAgZWxzZQorCSAgICBzdW0gKz0gdG1wIDw8IDg7CisJfQorICAgICAgaWYgKHR5cGUgPT0gJ3AnKQorICAgICAgICB7CisJICBpZiAoYnVmbGVuICYgMSkKKwkgICAgc3VtICs9IChzZXEgJiAweGZmKTsKKwkgIGVsc2UKKwkgICAgc3VtICs9IChzZXEgJiAweGZmKSA8PCA4OworCX0KKyAgICAgIHN1bSA9IChzdW0gJiAweGZmZmYpICsgKChzdW0gPj4gMTYpICYgMHhmZmZmKTsKKyAgICAgIHN1bSArPSAoc3VtID4+IDE2KSAmIDE7CisgICAgICBzdW0gPSB+c3VtOyAgCisKKyAgICAgIGhkclswXSA9IChzdW0gPj4gOCkgJiAweGZmOworICAgICAgaGRyWzFdID0gc3VtICYgMHhmZjsKKyAgICAgIGRlYnVnX3dyaXRlIChoZHIsIDIpOworICAgIH0KK30KKworCisvKiBSZXNwb25kIHRvIGFuIGV4cGVjdGVkIHJlYWQgcmVxdWVzdCBmcm9tIHRoZSBtb25pdG9yIGJ5IHNlbmRpbmcKKyAgIGRhdGEgaW4gY2h1bmtzLiAgSGFuZGxlIGFsbCBhY2tub3dsZWRnZW1lbnRzIGFuZCBoYW5kc2hha2luZyBwYWNrZXRzLgorCisgICBUaGUgbW9uaXRvciBleHBlY3RzIGEgcmVzcG9uc2UgY29uc2lzdGluZyBvZiBhIG9uZSBvciBtb3JlICdwJyBwYWNrZXRzLAorICAgZWFjaCBmb2xsb3dlZCBieSBhIHBvcnRpb24gb2YgdGhlIGRhdGEgcmVxdWVzdGVkLiAgVGhlICdwJyBwYWNrZXQKKyAgIGNvbnRhaW5zIG9ubHkgYSBmb3VyLWJ5dGUgaW50ZWdlciwgdGhlIHZhbHVlIG9mIHdoaWNoIGlzIHRoZSBudW1iZXIKKyAgIG9mIGJ5dGVzIG9mIGRhdGEgd2UgYXJlIGFib3V0IHRvIHNlbmQuICBGb2xsb3dpbmcgdGhlICdwJyBwYWNrZXQsCisgICB0aGUgbW9uaXRvciBleHBlY3RzIHRoZSBkYXRhIGJ5dGVzIHRoZW1zZWx2ZXMgaW4gcmF3LCB1bnBhY2tldGl6ZWQsCisgICBmb3JtLCB3aXRob3V0IGV2ZW4gYSBjaGVja3N1bS4KKyAqLworCitzdGF0aWMgdm9pZAorcHJvY2Vzc19yZWFkX3JlcXVlc3QgKGJ1ZiwgYnVmbGVuKQorICAgICB1bnNpZ25lZCBjaGFyICpidWY7CisgICAgIGludCBidWZsZW47Cit7CisgIHVuc2lnbmVkIGNoYXIgbGVuWzRdOworICBpbnQgaSwgY2h1bms7CisgIHVuc2lnbmVkIGNoYXIgc2VxOworCisgIC8qIERpc2NhcmQgdGhlIHJlYWQgcmVxdWVzdC4gIEZJWE1FOiB3ZSBoYXZlIHRvIGhvcGUgaXQncyBmb3IKKyAgICAgdGhlIGV4YWN0IG51bWJlciBvZiBieXRlcyB3ZSB3YW50IHRvIHNlbmQ7IHNob3VsZCBjaGVjayBmb3IgdGhpcy4gICovCisgIGlnbm9yZV9wYWNrZXQgKCk7CisKKyAgZm9yIChpID0gY2h1bmsgPSAwLCBzZXEgPSAwOyBpIDwgYnVmbGVuOyBpICs9IGNodW5rLCBzZXErKykKKyAgICB7CisgICAgICAvKiBEb24ndCBzZW5kIG1vcmUgdGhhbiBNQVhQU0laRSBieXRlcyBhdCBhIHRpbWUuICAqLworICAgICAgY2h1bmsgPSBidWZsZW4gLSBpOworICAgICAgaWYgKGNodW5rID4gTUFYUFNJWkUpCisJY2h1bmsgPSBNQVhQU0laRTsKKworICAgICAgLyogV3JpdGUgYSBwYWNrZXQgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGFyZSBzZW5kaW5nLiAgKi8KKyAgICAgIHdyaXRlX2xvbmdfbGUgKGxlbiwgY2h1bmspOworICAgICAgc2VuZF9wYWNrZXQgKCdwJywgbGVuLCBzaXplb2YgKGxlbiksIHNlcSk7CisKKyAgICAgIC8qIFdyaXRlIHRoZSBkYXRhIGluIHJhdyBmb3JtIGZvbGxvd2luZyB0aGUgcGFja2V0LiAgKi8KKyAgICAgIGRlYnVnX3dyaXRlICgmYnVmW2ldLCBjaHVuayk7CisKKyAgICAgIC8qIERpc2NhcmQgdGhlIEFDSyBwYWNrZXQuICAqLworICAgICAgaWdub3JlX3BhY2tldCAoKTsKKyAgICB9CisKKyAgLyogU2VuZCBhbiAiZW5kIG9mIGRhdGEiIHBhY2tldC4gICovCisgIHNlbmRfcGFja2V0ICgnZScsICIiLCAwLCAwKTsKK30KKworCisvKiBDb3VudCBsb2FkYWJsZSBzZWN0aW9ucyAoaGVscGVyIGZ1bmN0aW9uIGZvciByMzkwMF9sb2FkKS4gICovCisKK3N0YXRpYyB2b2lkCitjb3VudF9zZWN0aW9uIChhYmZkLCBzLCBzZWN0aW9uX2NvdW50KQorICAgICBiZmQgICAgICAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnM7CisgICAgIHVuc2lnbmVkIGludCAqc2VjdGlvbl9jb3VudDsKK3sKKyAgaWYgKHMtPmZsYWdzICYgU0VDX0xPQUQgJiYgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcykgIT0gMCkKKyAgICAoKnNlY3Rpb25fY291bnQpKys7Cit9CisKKworLyogTG9hZCBhIHNpbmdsZSBCRkQgc2VjdGlvbiAoaGVscGVyIGZ1bmN0aW9uIGZvciByMzkwMF9sb2FkKS4KKworICAgV0FSTklORzogdGhpcyBjb2RlIGlzIGZpbGxlZCB3aXRoIGFzc3VtcHRpb25zIGFib3V0IGhvdworICAgdGhlIERlbnNhbiBtb25pdG9yIGxvYWRzIHByb2dyYW1zLiAgVGhlIG1vbml0b3IgaXNzdWVzCisgICBwYWNrZXRzIGNvbnRhaW5pbmcgcmVhZCByZXF1ZXN0cywgYnV0IHJhdGhlciB0aGFuIHJlc3BvbmQKKyAgIHRvIHRoZW0gaW4gYW4gZ2VuZXJhbCB3YXksIHdlIGV4cGVjdCB0aGVtIHRvIGZvbGxvd2luZworICAgYSBjZXJ0YWluIHBhdHRlcm4uCisgICAKKyAgIEZvciBleGFtcGxlLCB3ZSBrbm93IHRoYXQgdGhlIG1vbml0b3Igd2lsbCBzdGFydCBsb2FkaW5nIGJ5CisgICBpc3N1aW5nIGFuIDgtYnl0ZSByZWFkIHJlcXVlc3QgZm9yIHRoZSBiaW5hcnkgZmlsZSBoZWFkZXIuCisgICBXZSBrbm93IHRoaXMgaXMgY29taW5nIGFuZCBpZ25vcmUgdGhlIGFjdHVhbCBjb250ZW50cworICAgb2YgdGhlIHJlYWQgcmVxdWVzdCBwYWNrZXQuCisqLworCitzdGF0aWMgdm9pZAorbG9hZF9zZWN0aW9uIChhYmZkLCBzLCBkYXRhX2NvdW50KQorICAgICBiZmQgICAgICAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnM7CisgICAgIHVuc2lnbmVkIGludCAqZGF0YV9jb3VudDsKK3sKKyAgaWYgKHMtPmZsYWdzICYgU0VDX0xPQUQpCisgICAgeworICAgICAgYmZkX3NpemVfdHlwZSBzZWN0aW9uX3NpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzKTsKKyAgICAgIGJmZF92bWEgICAgICAgc2VjdGlvbl9iYXNlID0gYmZkX3NlY3Rpb25fbG1hICAoYWJmZCwgcyk7CisgICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgICAgICB1bnNpZ25lZCBjaGFyIGhlYWRlcls4XTsKKworICAgICAgLyogRG9uJ3Qgb3V0cHV0IHplcm8tbGVuZ3RoIHNlY3Rpb25zLiAgKi8KKyAgICAgIGlmIChzZWN0aW9uX3NpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgICAgaWYgKGRhdGFfY291bnQpCisJKmRhdGFfY291bnQgKz0gc2VjdGlvbl9zaXplOworCisgICAgICAvKiBQcmludCBzb21lIGZsdWZmIGFib3V0IHRoZSBzZWN0aW9uIGJlaW5nIGxvYWRlZC4gICovCisgICAgICBwcmludGZfZmlsdGVyZWQgKCJMb2FkaW5nIHNlY3Rpb24gJXMsIHNpemUgMHglbHggbG1hICIsCisJCSAgICAgICBiZmRfc2VjdGlvbl9uYW1lIChhYmZkLCBzKSwgKGxvbmcpc2VjdGlvbl9zaXplKTsKKyAgICAgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoc2VjdGlvbl9iYXNlLCAxLCBnZGJfc3Rkb3V0KTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCisgICAgICAvKiBXcml0ZSB0aGUgc2VjdGlvbiBoZWFkZXIgKGxvY2F0aW9uIGFuZCBzaXplKS4gICovCisgICAgICB3cml0ZV9sb25nICgmaGVhZGVyWzBdLCAobG9uZylzZWN0aW9uX2Jhc2UpOworICAgICAgd3JpdGVfbG9uZyAoJmhlYWRlcls0XSwgKGxvbmcpc2VjdGlvbl9zaXplKTsKKyAgICAgIHByb2Nlc3NfcmVhZF9yZXF1ZXN0IChoZWFkZXIsIHNpemVvZiAoaGVhZGVyKSk7CisKKyAgICAgIC8qIFJlYWQgdGhlIHNlY3Rpb24gY29udGVudHMgaW50byBhIGJ1ZmZlciwgd3JpdGUgaXQgb3V0LAorICAgICAgICAgdGhlbiBmcmVlIHRoZSBidWZmZXIuICAqLworICAgICAgYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoc2VjdGlvbl9zaXplKTsKKyAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgYnVmZmVyLCAwLCBzZWN0aW9uX3NpemUpOworICAgICAgcHJvY2Vzc19yZWFkX3JlcXVlc3QgKGJ1ZmZlciwgc2VjdGlvbl9zaXplKTsKKyAgICAgIGZyZWUgKGJ1ZmZlcik7CisgIH0KK30KKworCisvKiBXaGVuIHRoZSBldGhlcm5ldCBpcyB1c2VkIGFzIHRoZSBjb25zb2xlIHBvcnQgb24gdGhlIERlbnNhbiBib2FyZCwKKyAgIHdlIGNhbiB1c2UgdGhlICJSbSIgY29tbWFuZCB0byBkbyBhIGZhc3QgYmluYXJ5IGxvYWQuICBUaGUgZm9ybWF0CisgICBvZiB0aGUgZG93bmxvYWQgZGF0YSBpczoKKworCW51bWJlciBvZiBzZWN0aW9ucyAoNCBieXRlcykKKwlzdGFydGluZyBhZGRyZXNzICg0IGJ5dGVzKQorCXJlcGVhdCBmb3IgZWFjaCBzZWN0aW9uOgorCSAgICBsb2NhdGlvbiBhZGRyZXNzICg0IGJ5dGVzKQorCSAgICBzZWN0aW9uIHNpemUgKDQgYnl0ZXMpCisJICAgIGJpbmFyeSBkYXRhCisKKyAgIFRoZSA0LWJ5dGUgZmllbGRzIGFyZSBhbGwgaW4gYmlnLWVuZGlhbiBvcmRlci4KKworICAgVXNpbmcgdGhpcyBjb21tYW5kIGlzIHRyaWNreSBiZWNhdXNlIHdlIGhhdmUgdG8gcHV0IHRoZSBtb25pdG9yCisgICBpbnRvIGEgc3BlY2lhbCBmdW5reSAiY29tbXVuaWNhdGlvbnMgaW50ZXJmYWNlIiBtb2RlLCBpbiB3aGljaAorICAgaXQgc2VuZHMgYW5kIHJlY2VpdmVzIHBhY2tldHMgb2YgZGF0YSBhbG9uZyB3aXRoIHRoZSBub3JtYWwgcHJvbXB0LgorICovCisKK3N0YXRpYyB2b2lkCityMzkwMF9sb2FkIChmaWxlbmFtZSwgZnJvbV90dHkpIAorICAgIGNoYXIgKmZpbGVuYW1lOworICAgIGludCBmcm9tX3R0eTsKK3sKKyAgYmZkICphYmZkOworICB1bnNpZ25lZCBpbnQgZGF0YV9jb3VudCA9IDA7CisgIHRpbWVfdCBzdGFydF90aW1lLCBlbmRfdGltZTsJLyogZm9yIHRpbWluZyBvZiBkb3dubG9hZCAqLworICBpbnQgc2VjdGlvbl9jb3VudCA9IDA7CisgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzhdOworCisgIC8qIElmIHdlIGFyZSBub3QgdXNpbmcgdGhlIGV0aGVybmV0LCB1c2UgdGhlIG5vcm1hbCBtb25pdG9yIGxvYWQsCisgICAgIHdoaWNoIHNlbmRzIFMtcmVjb3JkcyBvdmVyIHRoZSBzZXJpYWwgbGluay4gICovCisgIGlmICghZXRoZXJuZXQpCisgICAgeworICAgICAgb3JpZ19tb25pdG9yX2xvYWQgKGZpbGVuYW1lLCBmcm9tX3R0eSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIE9wZW4gdGhlIGZpbGUuICAqLworICBpZiAoZmlsZW5hbWUgPT0gTlVMTCB8fCBmaWxlbmFtZVswXSA9PSAwKQorICAgIGZpbGVuYW1lID0gZ2V0X2V4ZWNfZmlsZSAoMSk7CisgIGFiZmQgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCAwKTsKKyAgaWYgKCFhYmZkKQorICAgIGVycm9yICgiVW5hYmxlIHRvIG9wZW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkgPT0gMCkKKyAgICBlcnJvciAoIkZpbGUgaXMgbm90IGFuIG9iamVjdCBmaWxlXG4iKTsKKworICAvKiBPdXRwdXQgdGhlICJ2Y29uc2kiIGNvbW1hbmQgdG8gZ2V0IHRoZSBtb25pdG9yIGluIHRoZSBjb21tdW5pY2F0aW9uCisgICAgIHN0YXRlIHdoZXJlIGl0IHdpbGwgYWNjZXB0IGEgbG9hZCBjb21tYW5kLiAgVGhpcyB3aWxsIGNhdXNlCisgICAgIHRoZSBtb25pdG9yIHRvIGVtaXQgYSBwYWNrZXQgYmVmb3JlIGVhY2ggcHJvbXB0LCBzbyBpZ25vcmUgdGhlIHBhY2tldC4gICovCisgIG1vbml0b3JfcHJpbnRmICgidmNvbnNpXHIiKTsKKyAgaWdub3JlX3BhY2tldCAoKTsKKyAgbW9uaXRvcl9leHBlY3RfcHJvbXB0IChOVUxMLCAwKTsKKworICAvKiBPdXRwdXQgdGhlICJSbSIgKGxvYWQpIGNvbW1hbmQgYW5kIHJlc3BvbmQgdG8gdGhlIHN1YnNlcXVlbnQgIm9wZW4iCisgICAgIHBhY2tldCBieSBzZW5kaW5nIGFuIEFDSyBwYWNrZXQuICAqLworICBtb25pdG9yX3ByaW50ZiAoIlJtXHIiKTsKKyAgaWdub3JlX3BhY2tldCAoKTsKKyAgc2VuZF9wYWNrZXQgKCdhJywgIiIsIDAsIDApOworICAKKyAgLyogT3V0cHV0IHRoZSBmYXN0IGxvYWQgaGVhZGVyIChudW1iZXIgb2Ygc2VjdGlvbnMgYW5kIHN0YXJ0aW5nIGFkZHJlc3MpLiAgKi8KKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zICgoYmZkICopIGFiZmQsIChzZWN0aW9uX21hcF9mdW5jKSBjb3VudF9zZWN0aW9uLAorCQkJICZzZWN0aW9uX2NvdW50KTsKKyAgd3JpdGVfbG9uZyAoJmJ1ZmZlclswXSwgKGxvbmcpc2VjdGlvbl9jb3VudCk7CisgIGlmIChleGVjX2JmZCkKKyAgICB3cml0ZV9sb25nICgmYnVmZmVyWzRdLCAobG9uZyliZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGV4ZWNfYmZkKSk7CisgIGVsc2UKKyAgICB3cml0ZV9sb25nICgmYnVmZmVyWzRdLCAwKTsKKyAgcHJvY2Vzc19yZWFkX3JlcXVlc3QgKGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpKTsKKworICAvKiBPdXRwdXQgdGhlIHNlY3Rpb24gZGF0YS4gICovCisgIHN0YXJ0X3RpbWUgPSB0aW1lIChOVUxMKTsKKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCAoc2VjdGlvbl9tYXBfZnVuYykgbG9hZF9zZWN0aW9uLCAmZGF0YV9jb3VudCk7CisgIGVuZF90aW1lID0gdGltZSAoTlVMTCk7CisKKyAgLyogQWNrbm93bGVkZ2UgdGhlIGNsb3NlIHBhY2tldCBhbmQgcHV0IHRoZSBtb25pdG9yIGJhY2sgaW50bworICAgICAibm9ybWFsIiBtb2RlIHNvIGl0IHdvbid0IHNlbmQgcGFja2V0cyBhbnkgbW9yZS4gICovCisgIGlnbm9yZV9wYWNrZXQgKCk7CisgIHNlbmRfcGFja2V0ICgnYScsICIiLCAwLCAwKTsKKyAgbW9uaXRvcl9leHBlY3RfcHJvbXB0IChOVUxMLCAwKTsKKyAgbW9uaXRvcl9wcmludGYgKCJ2Y29uc3hcciIpOworICBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKE5VTEwsIDApOworCisgIC8qIFByaW50IHN0YXJ0IGFkZHJlc3MgYW5kIGRvd25sb2FkIHBlcmZvcm1hbmNlIGluZm9ybWF0aW9uLiAgKi8KKyAgcHJpbnRmX2ZpbHRlcmVkICgiU3RhcnQgYWRkcmVzcyAweCVseFxuIiwgKGxvbmcpYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSk7CisgIHJlcG9ydF90cmFuc2Zlcl9wZXJmb3JtYW5jZSAoZGF0YV9jb3VudCwgc3RhcnRfdGltZSwgZW5kX3RpbWUpOworCisgIC8qIEZpbmFsbHksIG1ha2UgdGhlIFBDIHBvaW50IGF0IHRoZSBzdGFydCBhZGRyZXNzICovCisgIGlmIChleGVjX2JmZCkKKyAgICB3cml0ZV9wYyAoYmZkX2dldF9zdGFydF9hZGRyZXNzIChleGVjX2JmZCkpOworCisgIGluZmVyaW9yX3BpZCA9IDA7ICAgICAgICAgICAgIC8qIE5vIHByb2Nlc3Mgbm93ICovCisKKyAgLyogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBtYW55IHRoaW5ncyB3ZXJlIGJhc2VkIG9uIHRoZSBQQyBhdCB0aGUKKyAgICAgdGltZSB0aGF0IHdlIGF0dGFjaGVkIHRvIHRoZSBtb25pdG9yLCB3aGljaCBpcyBubyBsb25nZXIgdmFsaWQKKyAgICAgbm93IHRoYXQgd2UgaGF2ZSBsb2FkZWQgbmV3IGNvZGUgKGFuZCBqdXN0IGNoYW5nZWQgdGhlIFBDKS4KKyAgICAgQW5vdGhlciB3YXkgdG8gZG8gdGhpcyBtaWdodCBiZSB0byBjYWxsIG5vcm1hbF9zdG9wLCBleGNlcHQgdGhhdAorICAgICB0aGUgc3RhY2sgbWF5IG5vdCBiZSB2YWxpZCwgYW5kIHRoaW5ncyB3b3VsZCBnZXQgaG9ycmlibHkKKyAgICAgY29uZnVzZWQuLi4gKi8KKyAgY2xlYXJfc3ltdGFiX3VzZXJzICgpOworfQorCisKKy8qIENvbW1hbmRzIHRvIHNlbmQgdG8gdGhlIG1vbml0b3Igd2hlbiBmaXJzdCBjb25uZWN0aW5nOgorICAgICogVGhlIGJhcmUgY2FycmlhZ2UgcmV0dXJuIGZvcmNlcyBhIHByb21wdCBmcm9tIHRoZSBtb25pdG9yCisgICAgICAobW9uaXRvciBkb2Vzbid0IHByb21wdCBpbW1lZGlhdGVseSBhZnRlciBhIHJlc2V0KS4KKyAgICAqIFRoZSAidmNvbnN4IiBzd2l0Y2hlcyB0aGUgbW9uaXRvciBiYWNrIHRvIGludGVyYWN0aXZlIG1vZGUKKyAgICAgIGluIGNhc2UgYW4gYWJvcnRlZCBkb3dubG9hZCBoYWQgbGVmdCBpdCBpbiBwYWNrZXQgbW9kZS4KKyAgICAqIFRoZSAiWHRyIiBjb21tYW5kIGNhdXNlcyBzdWJzZXF1ZW50ICJ0IiAodHJhY2UpIGNvbW1hbmRzIHRvIGRpc3BsYXkKKyAgICAgIHRoZSBnZW5lcmFsIHJlZ2lzdGVycyBvbmx5LgorICAgICogVGhlICJYeHIiIGNvbW1hbmQgZG9lcyB0aGUgc2FtZSB0aGluZyBmb3IgdGhlICJ4IiAoZXhhbWluZQorICAgICAgcmVnaXN0ZXJzKSBjb21tYW5kLgorICAgICogVGhlICJieCIgY29tbWFuZCBjbGVhcnMgYWxsIGJyZWFrcG9pbnRzLgorKi8KKworc3RhdGljIGNoYXIgKnIzOTAwX2luaXRzW10gPSB7IlxyIiwgInZjb25zeFxyIiwgIlh0clxyIiwgIlh4clxyIiwgImJ4XHIiLCBOVUxMfTsKK3N0YXRpYyBjaGFyICpkdW1teV9pbml0c1tdID0geyBOVUxMIH07CisKK3N0YXRpYyBzdHJ1Y3QgdGFyZ2V0X29wcyByMzkwMF9vcHM7CitzdGF0aWMgc3RydWN0IG1vbml0b3Jfb3BzIHIzOTAwX2NtZHM7CisKK3N0YXRpYyB2b2lkCityMzkwMF9vcGVuIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjaGFyIGJ1Zls2NF07CisgIGludCBpOworCisgIG1vbml0b3Jfb3BlbiAoYXJncywgJnIzOTAwX2NtZHMsIGZyb21fdHR5KTsKKworICAvKiBXZSBoYXZlIHRvIGhhbmRsZSBzZW5kaW5nIHRoZSBpbml0IHN0cmluZ3Mgb3Vyc2VsdmVzLCBiZWNhdXNlCisgICAgIHRoZSBmaXJzdCB0d28gc3RyaW5ncyB3ZSBzZW5kIChjYXJyaWFnZSByZXR1cm5zKSBtYXkgbm90IGJlIGVjaG9lZAorICAgICBieSB0aGUgbW9uaXRvciwgYnV0IHRoZSByZXN0IHdpbGwgYmUuICAqLworICBtb25pdG9yX3ByaW50Zl9ub2VjaG8gKCJcclxyIik7CisgIGZvciAoaSA9IDA7IHIzOTAwX2luaXRzW2ldICE9IE5VTEw7IGkrKykKKyAgICB7CisgICAgICBtb25pdG9yX3ByaW50ZiAocjM5MDBfaW5pdHNbaV0pOworICAgICAgbW9uaXRvcl9leHBlY3RfcHJvbXB0IChOVUxMLCAwKTsKKyAgICB9CisKKyAgLyogQXR0ZW1wdCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29uc29sZSBkZXZpY2UgaXMgZXRoZXJuZXQgb3Igc2VyaWFsLgorICAgICBUaGlzIHdpbGwgdGVsbCB1cyB3aGljaCBraW5kIG9mIGxvYWQgdG8gdXNlIChTLXJlY29yZHMgb3ZlciBhIHNlcmlhbAorICAgICBsaW5rLCBvciB0aGUgRGVuc2FuIGZhc3QgYmluYXJ5IG11bHRpLXNlY3Rpb24gZm9ybWF0IG92ZXIgdGhlIG5ldCkuICAqLworCisgIGV0aGVybmV0ID0gMDsKKyAgbW9uaXRvcl9wcmludGYgKCJ2XHIiKTsKKyAgaWYgKG1vbml0b3JfZXhwZWN0ICgiY29uc29sZSBkZXZpY2UgOiIsIE5VTEwsIDApICE9IC0xKQorICAgICAgaWYgKG1vbml0b3JfZXhwZWN0ICgiXG4iLCBidWYsIHNpemVvZiAoYnVmKSkgIT0gLTEpCisJaWYgKHN0cnN0ciAoYnVmLCAiZXRoZXJuZXQiKSAhPSBOVUxMKQorCSAgZXRoZXJuZXQgPSAxOworICBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKE5VTEwsIDApOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9yMzkwMF9yb20gKCkKK3sKKyAgcjM5MDBfY21kcy5mbGFncyA9IE1PX05PX0VDSE9fT05fT1BFTiB8CisJCSAgICAgTU9fQUREUl9CSVRTX1JFTU9WRSB8CisJCSAgICAgTU9fQ0xSX0JSRUFLX1VTRVNfQUREUiB8CisJCSAgICAgTU9fR0VUTUVNX1JFQURfU0lOR0xFIHwKKwkJICAgICBNT19QUklOVF9QUk9HUkFNX09VVFBVVDsKKworICByMzkwMF9jbWRzLmluaXQgPSBkdW1teV9pbml0czsKKyAgcjM5MDBfY21kcy5jb250ID0gImdcciI7CisgIHIzOTAwX2NtZHMuc3RlcCA9ICJ0XHIiOworICByMzkwMF9jbWRzLnNldF9icmVhayA9ICJiICVBXHIiOwkJLyogQ09SRUFERFIgKi8KKyAgcjM5MDBfY21kcy5jbHJfYnJlYWsgPSAiYiAlQSwwXHIiOwkJLyogQ09SRUFERFIgKi8KKyAgcjM5MDBfY21kcy5maWxsID0gImZ4ICVBIHMgJXggJXhcciI7CQkvKiBDT1JFQUREUiwgbGVuLCB2YWwgKi8KKworICByMzkwMF9jbWRzLnNldG1lbS5jbWRiID0gInN4ICVBICV4XHIiOwkvKiBDT1JFQUREUiwgdmFsICovCisgIHIzOTAwX2NtZHMuc2V0bWVtLmNtZHcgPSAic2ggJUEgJXhcciI7CS8qIENPUkVBRERSLCB2YWwgKi8KKyAgcjM5MDBfY21kcy5zZXRtZW0uY21kbCA9ICJzdyAlQSAleFxyIjsJLyogQ09SRUFERFIsIHZhbCAqLworCisgIHIzOTAwX2NtZHMuZ2V0bWVtLmNtZGIgPSAic3ggJUFcciI7CQkvKiBDT1JFQUREUiAqLworICByMzkwMF9jbWRzLmdldG1lbS5jbWR3ID0gInNoICVBXHIiOwkJLyogQ09SRUFERFIgKi8KKyAgcjM5MDBfY21kcy5nZXRtZW0uY21kbCA9ICJzdyAlQVxyIjsJCS8qIENPUkVBRERSICovCisgIHIzOTAwX2NtZHMuZ2V0bWVtLnJlc3BfZGVsaW0gPSAiIDogIjsKKyAgcjM5MDBfY21kcy5nZXRtZW0udGVybSA9ICIgIjsKKyAgcjM5MDBfY21kcy5nZXRtZW0udGVybV9jbWQgPSAiLlxyIjsKKworICByMzkwMF9jbWRzLnNldHJlZy5jbWQgPSAieCVzICV4XHIiOwkJLyogcmVnbmFtZSwgdmFsICovCisKKyAgcjM5MDBfY21kcy5nZXRyZWcuY21kID0gInglc1xyIjsJCS8qIHJlZ25hbWUgKi8KKyAgcjM5MDBfY21kcy5nZXRyZWcucmVzcF9kZWxpbSA9ICI9IjsKKyAgcjM5MDBfY21kcy5nZXRyZWcudGVybSA9ICIgIjsKKyAgcjM5MDBfY21kcy5nZXRyZWcudGVybV9jbWQgPSAiLlxyIjsKKworICByMzkwMF9jbWRzLmR1bXBfcmVnaXN0ZXJzID0gInhcciI7CisgIHIzOTAwX2NtZHMucmVnaXN0ZXJfcGF0dGVybiA9CisJIlxcKFthLXpBLVowLTlfXStcXCkgKj1cXChbMC05YS1mXSsgWzAtOWEtZl0rXFxiXFwpIjsKKyAgcjM5MDBfY21kcy5zdXBwbHlfcmVnaXN0ZXIgPSByMzkwMF9zdXBwbHlfcmVnaXN0ZXI7CisgIC8qIFMtcmVjb3JkIGRvd25sb2FkLCB2aWEgImtleWJvYXJkIHBvcnQiLiAgKi8KKyAgcjM5MDBfY21kcy5sb2FkID0gInIwXHIiOworICByMzkwMF9jbWRzLnByb21wdCA9ICIjIjsKKyAgcjM5MDBfY21kcy5saW5lX3Rlcm0gPSAiXHIiOworICByMzkwMF9jbWRzLnRhcmdldCA9ICZyMzkwMF9vcHM7CisgIHIzOTAwX2NtZHMuc3RvcGJpdHMgPSBTRVJJQUxfMV9TVE9QQklUUzsKKyAgcjM5MDBfY21kcy5yZWduYW1lcyA9IHIzOTAwX3JlZ25hbWVzOworICByMzkwMF9jbWRzLm1hZ2ljID0gTU9OSVRPUl9PUFNfTUFHSUM7CisKKyAgaW5pdF9tb25pdG9yX29wcyAoJnIzOTAwX29wcyk7CisKKyAgcjM5MDBfb3BzLnRvX3Nob3J0bmFtZSA9ICJyMzkwMCI7CisgIHIzOTAwX29wcy50b19sb25nbmFtZSA9ICJSMzkwMCBtb25pdG9yIjsKKyAgcjM5MDBfb3BzLnRvX2RvYyA9ICJEZWJ1ZyB1c2luZyB0aGUgRFZFIFIzOTAwIG1vbml0b3IuXG5cCitTcGVjaWZ5IHRoZSBzZXJpYWwgZGV2aWNlIGl0IGlzIGNvbm5lY3RlZCB0byAoZS5nLiAvZGV2L3R0eWEpLiI7CisgIHIzOTAwX29wcy50b19vcGVuID0gcjM5MDBfb3BlbjsKKworICAvKiBPdmVycmlkZSB0aGUgZnVuY3Rpb25zIHRvIGZldGNoIGFuZCBzdG9yZSByZWdpc3RlcnMuICBCdXQgc2F2ZSB0aGUKKyAgICAgYWRkcmVzc2VzIG9mIHRoZSBkZWZhdWx0IGZ1bmN0aW9ucywgYmVjYXVzZSB3ZSB3aWxsIHVzZSB0aG9zZSBmdW5jdGlvbnMKKyAgICAgZm9yICJub3JtYWwiIHJlZ2lzdGVycy4gICovCisKKyAgb3JpZ19tb25pdG9yX2ZldGNoX3JlZ2lzdGVycyA9IHIzOTAwX29wcy50b19mZXRjaF9yZWdpc3RlcnM7CisgIG9yaWdfbW9uaXRvcl9zdG9yZV9yZWdpc3RlcnMgPSByMzkwMF9vcHMudG9fc3RvcmVfcmVnaXN0ZXJzOworICByMzkwMF9vcHMudG9fZmV0Y2hfcmVnaXN0ZXJzID0gcjM5MDBfZmV0Y2hfcmVnaXN0ZXJzOworICByMzkwMF9vcHMudG9fc3RvcmVfcmVnaXN0ZXJzID0gcjM5MDBfc3RvcmVfcmVnaXN0ZXJzOworCisgIC8qIE92ZXJyaWRlIHRoZSBsb2FkIGZ1bmN0aW9uLCBidXQgc2F2ZSB0aGUgYWRkcmVzcyBvZiB0aGUgZGVmYXVsdAorICAgICBmdW5jdGlvbiB0byB1c2Ugd2hlbiBsb2FkaW5nIFMtcmVjb3JkcyBvdmVyIGEgc2VyaWFsIGxpbmsuICAqLworICBvcmlnX21vbml0b3JfbG9hZCA9IHIzOTAwX29wcy50b19sb2FkOworICByMzkwMF9vcHMudG9fbG9hZCA9IHIzOTAwX2xvYWQ7CisKKyAgYWRkX3RhcmdldCAoJnIzOTAwX29wcyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvZHdhcmYycmVhZC5jIGIvZ2RiL2R3YXJmMnJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjUyMDY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2R3YXJmMnJlYWQuYwpAQCAtMCwwICsxLDU4NjUgQEAKKy8qIERXQVJGIDIgZGVidWdnaW5nIGZvcm1hdCBzdXBwb3J0IGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgQWRhcHRlZCBieSBHYXJ5IEZ1bmNrIChnYXJ5QGludHJlcGlkLmNvbSksIEludHJlcGlkIFRlY2hub2xvZ3ksCisgICBJbmMuICB3aXRoIHN1cHBvcnQgZnJvbSBGbG9yaWRhIFN0YXRlIFVuaXZlcnNpdHkgKHVuZGVyIGNvbnRyYWN0CisgICB3aXRoIHRoZSBBZGEgSm9pbnQgUHJvZ3JhbSBPZmZpY2UpLCBhbmQgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICAgSW5pdGlhbCBjb250cmlidXRpb24gYnkgQnJlbnQgQmVuc29uLCBIYXJyaXMgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLiwKKyAgIGJhc2VkIG9uIEZyZWQgRmlzaCdzIChDeWdudXMgU3VwcG9ydCkgaW1wbGVtZW50YXRpb24gb2YgRFdBUkYgMQorICAgc3VwcG9ydCBpbiBkd2FyZnJlYWQuYworCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Cit5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAiZWxmLWJmZC5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgIm9iamZpbGVzLmgiCisjaW5jbHVkZSAiZWxmL2R3YXJmMi5oIgorI2luY2x1ZGUgImJ1aWxkc3ltLmgiCisjaW5jbHVkZSAiZGVtYW5nbGUuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJjb21wbGFpbnRzLmgiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogLmRlYnVnX2luZm8gaGVhZGVyIGZvciBhIGNvbXBpbGF0aW9uIHVuaXQgCisgICBCZWNhdXNlIG9mIGFsaWdubWVudCBjb25zdHJhaW50cywgdGhpcyBzdHJ1Y3R1cmUgaGFzIHBhZGRpbmcgYW5kIGNhbm5vdAorICAgYmUgbWFwcGVkIGRpcmVjdGx5IG9udG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4gICovCit0eXBlZGVmIHN0cnVjdCBjb21wX3VuaXRfaGVhZGVyCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwkvKiBsZW5ndGggb2YgdGhlIC5kZWJ1Z19pbmZvCisJCQkJICAgY29udHJpYnV0aW9uICovCisgICAgdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsJLyogdmVyc2lvbiBudW1iZXIgLS0gMiBmb3IgRFdBUkYKKwkJCQkgICB2ZXJzaW9uIDIgKi8KKyAgICB1bnNpZ25lZCBpbnQgYWJicmV2X29mZnNldDsJLyogb2Zmc2V0IGludG8gLmRlYnVnX2FiYnJldiBzZWN0aW9uICovCisgICAgdW5zaWduZWQgY2hhciBhZGRyX3NpemU7CS8qIGJ5dGUgc2l6ZSBvZiBhbiBhZGRyZXNzIC0tIDQgKi8KKyAgfQorX0NPTVBfVU5JVF9IRUFERVI7CisjZGVmaW5lIF9BQ1RVQUxfQ09NUF9VTklUX0hFQURFUl9TSVpFIDExCisKKy8qIC5kZWJ1Z19wdWJuYW1lcyBoZWFkZXIKKyAgIEJlY2F1c2Ugb2YgYWxpZ25tZW50IGNvbnN0cmFpbnRzLCB0aGlzIHN0cnVjdHVyZSBoYXMgcGFkZGluZyBhbmQgY2Fubm90CisgICBiZSBtYXBwZWQgZGlyZWN0bHkgb250byB0aGUgYmVnaW5uaW5nIG9mIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uLiAgKi8KK3R5cGVkZWYgc3RydWN0IHB1Ym5hbWVzX2hlYWRlcgorICB7CisgICAgdW5zaWduZWQgaW50IGxlbmd0aDsJLyogbGVuZ3RoIG9mIHRoZSAuZGVidWdfcHVibmFtZXMKKwkJCQkgICBjb250cmlidXRpb24gICovCisgICAgdW5zaWduZWQgY2hhciB2ZXJzaW9uOwkvKiB2ZXJzaW9uIG51bWJlciAtLSAyIGZvciBEV0FSRgorCQkJCSAgIHZlcnNpb24gMiAqLworICAgIHVuc2lnbmVkIGludCBpbmZvX29mZnNldDsJLyogb2Zmc2V0IGludG8gLmRlYnVnX2luZm8gc2VjdGlvbiAqLworICAgIHVuc2lnbmVkIGludCBpbmZvX3NpemU7CS8qIGJ5dGUgc2l6ZSBvZiAuZGVidWdfaW5mbyBzZWN0aW9uCisJCQkJICAgcG9ydGlvbiAqLworICB9CitfUFVCTkFNRVNfSEVBREVSOworI2RlZmluZSBfQUNUVUFMX1BVQk5BTUVTX0hFQURFUl9TSVpFIDEzCisKKy8qIC5kZWJ1Z19wdWJuYW1lcyBoZWFkZXIKKyAgIEJlY2F1c2Ugb2YgYWxpZ25tZW50IGNvbnN0cmFpbnRzLCB0aGlzIHN0cnVjdHVyZSBoYXMgcGFkZGluZyBhbmQgY2Fubm90CisgICBiZSBtYXBwZWQgZGlyZWN0bHkgb250byB0aGUgYmVnaW5uaW5nIG9mIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uLiAgKi8KK3R5cGVkZWYgc3RydWN0IGFyYW5nZXNfaGVhZGVyCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwkvKiBieXRlIGxlbiBvZiB0aGUgLmRlYnVnX2FyYW5nZXMKKwkJCQkgICBjb250cmlidXRpb24gKi8KKyAgICB1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uOwkvKiB2ZXJzaW9uIG51bWJlciAtLSAyIGZvciBEV0FSRgorCQkJCSAgIHZlcnNpb24gMiAqLworICAgIHVuc2lnbmVkIGludCBpbmZvX29mZnNldDsJLyogb2Zmc2V0IGludG8gLmRlYnVnX2luZm8gc2VjdGlvbiAqLworICAgIHVuc2lnbmVkIGNoYXIgYWRkcl9zaXplOwkvKiBieXRlIHNpemUgb2YgYW4gYWRkcmVzcyAqLworICAgIHVuc2lnbmVkIGNoYXIgc2VnX3NpemU7CS8qIGJ5dGUgc2l6ZSBvZiBzZWdtZW50IGRlc2NyaXB0b3IgKi8KKyAgfQorX0FSQU5HRVNfSEVBREVSOworI2RlZmluZSBfQUNUVUFMX0FSQU5HRVNfSEVBREVSX1NJWkUgMTIKKworLyogLmRlYnVnX2xpbmUgc3RhdGVtZW50IHByb2dyYW0gcHJvbG9ndWUKKyAgIEJlY2F1c2Ugb2YgYWxpZ25tZW50IGNvbnN0cmFpbnRzLCB0aGlzIHN0cnVjdHVyZSBoYXMgcGFkZGluZyBhbmQgY2Fubm90CisgICBiZSBtYXBwZWQgZGlyZWN0bHkgb250byB0aGUgYmVnaW5uaW5nIG9mIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uLiAgKi8KK3R5cGVkZWYgc3RydWN0IHN0YXRlbWVudF9wcm9sb2d1ZQorICB7CisgICAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aDsJLyogYnl0ZSBsZW5ndGggb2YgdGhlIHN0YXRlbWVudAorCQkJCSAgIGluZm9ybWF0aW9uICovCisgICAgdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsJLyogdmVyc2lvbiBudW1iZXIgLS0gMiBmb3IgRFdBUkYKKwkJCQkgICB2ZXJzaW9uIDIgKi8KKyAgICB1bnNpZ25lZCBpbnQgcHJvbG9ndWVfbGVuZ3RoOwkvKiAjIGJ5dGVzIGJldHdlZW4gcHJvbG9ndWUgJgorCQkJCQkgICBzdG10IHByb2dyYW0gKi8KKyAgICB1bnNpZ25lZCBjaGFyIG1pbmltdW1faW5zdHJ1Y3Rpb25fbGVuZ3RoOwkvKiBieXRlIHNpemUgb2YKKwkJCQkJCSAgIHNtYWxsZXN0IGluc3RyICovCisgICAgdW5zaWduZWQgY2hhciBkZWZhdWx0X2lzX3N0bXQ7CS8qIGluaXRpYWwgdmFsdWUgb2YgaXNfc3RtdAorCQkJCQkgICByZWdpc3RlciAqLworICAgIGNoYXIgbGluZV9iYXNlOworICAgIHVuc2lnbmVkIGNoYXIgbGluZV9yYW5nZTsKKyAgICB1bnNpZ25lZCBjaGFyIG9wY29kZV9iYXNlOwkvKiBudW1iZXIgYXNzaWduZWQgdG8gZmlyc3Qgc3BlY2lhbAorCQkJCSAgIG9wY29kZSAqLworICAgIHVuc2lnbmVkIGNoYXIgKnN0YW5kYXJkX29wY29kZV9sZW5ndGhzOworICB9CitfU1RBVEVNRU5UX1BST0xPR1VFOworCisvKiBvZmZzZXRzIGFuZCBzaXplcyBvZiBkZWJ1Z2dpbmcgc2VjdGlvbnMgKi8KKworc3RhdGljIGZpbGVfcHRyIGR3YXJmX2luZm9fb2Zmc2V0Oworc3RhdGljIGZpbGVfcHRyIGR3YXJmX2FiYnJldl9vZmZzZXQ7CitzdGF0aWMgZmlsZV9wdHIgZHdhcmZfbGluZV9vZmZzZXQ7CitzdGF0aWMgZmlsZV9wdHIgZHdhcmZfcHVibmFtZXNfb2Zmc2V0Oworc3RhdGljIGZpbGVfcHRyIGR3YXJmX2FyYW5nZXNfb2Zmc2V0Oworc3RhdGljIGZpbGVfcHRyIGR3YXJmX2xvY19vZmZzZXQ7CitzdGF0aWMgZmlsZV9wdHIgZHdhcmZfbWFjaW5mb19vZmZzZXQ7CitzdGF0aWMgZmlsZV9wdHIgZHdhcmZfc3RyX29mZnNldDsKKworc3RhdGljIHVuc2lnbmVkIGludCBkd2FyZl9pbmZvX3NpemU7CitzdGF0aWMgdW5zaWduZWQgaW50IGR3YXJmX2FiYnJldl9zaXplOworc3RhdGljIHVuc2lnbmVkIGludCBkd2FyZl9saW5lX3NpemU7CitzdGF0aWMgdW5zaWduZWQgaW50IGR3YXJmX3B1Ym5hbWVzX3NpemU7CitzdGF0aWMgdW5zaWduZWQgaW50IGR3YXJmX2FyYW5nZXNfc2l6ZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHdhcmZfbG9jX3NpemU7CitzdGF0aWMgdW5zaWduZWQgaW50IGR3YXJmX21hY2luZm9fc2l6ZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHdhcmZfc3RyX3NpemU7CisKKy8qIG5hbWVzIG9mIHRoZSBkZWJ1Z2dpbmcgc2VjdGlvbnMgKi8KKworI2RlZmluZSBJTkZPX1NFQ1RJT04gICAgICIuZGVidWdfaW5mbyIKKyNkZWZpbmUgQUJCUkVWX1NFQ1RJT04gICAiLmRlYnVnX2FiYnJldiIKKyNkZWZpbmUgTElORV9TRUNUSU9OICAgICAiLmRlYnVnX2xpbmUiCisjZGVmaW5lIFBVQk5BTUVTX1NFQ1RJT04gIi5kZWJ1Z19wdWJuYW1lcyIKKyNkZWZpbmUgQVJBTkdFU19TRUNUSU9OICAiLmRlYnVnX2FyYW5nZXMiCisjZGVmaW5lIExPQ19TRUNUSU9OICAgICAgIi5kZWJ1Z19sb2MiCisjZGVmaW5lIE1BQ0lORk9fU0VDVElPTiAgIi5kZWJ1Z19tYWNpbmZvIgorI2RlZmluZSBTVFJfU0VDVElPTiAgICAgICIuZGVidWdfc3RyIgorCisvKiBsb2NhbCBkYXRhIHR5cGVzICovCisKKy8qIFRoZSBkYXRhIGluIGEgY29tcGlsYXRpb24gdW5pdCBoZWFkZXIgbG9va3MgbGlrZSB0aGlzLiAgKi8KK3N0cnVjdCBjb21wX3VuaXRfaGVhZAorICB7CisgICAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyAgICBzaG9ydCB2ZXJzaW9uOworICAgIHVuc2lnbmVkIGludCBhYmJyZXZfb2Zmc2V0OworICAgIHVuc2lnbmVkIGNoYXIgYWRkcl9zaXplOworICB9OworCisvKiBUaGUgZGF0YSBpbiB0aGUgLmRlYnVnX2xpbmUgc3RhdGVtZW50IHByb2xvZ3VlIGxvb2tzIGxpa2UgdGhpcy4gICovCitzdHJ1Y3QgbGluZV9oZWFkCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuZ3RoOworICAgIHVuc2lnbmVkIHNob3J0IHZlcnNpb247CisgICAgdW5zaWduZWQgaW50IHByb2xvZ3VlX2xlbmd0aDsKKyAgICB1bnNpZ25lZCBjaGFyIG1pbmltdW1faW5zdHJ1Y3Rpb25fbGVuZ3RoOworICAgIHVuc2lnbmVkIGNoYXIgZGVmYXVsdF9pc19zdG10OworICAgIGludCBsaW5lX2Jhc2U7CisgICAgdW5zaWduZWQgY2hhciBsaW5lX3JhbmdlOworICAgIHVuc2lnbmVkIGNoYXIgb3Bjb2RlX2Jhc2U7CisgICAgdW5zaWduZWQgY2hhciAqc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHM7CisgIH07CisKKy8qIFdoZW4gd2UgY29uc3RydWN0IGEgcGFydGlhbCBzeW1ib2wgdGFibGUgZW50cnkgd2Ugb25seQorICAgbmVlZCB0aGlzIG11Y2ggaW5mb3JtYXRpb24uICovCitzdHJ1Y3QgcGFydGlhbF9kaWVfaW5mbworICB7CisgICAgZW51bSBkd2FyZl90YWcgdGFnOworICAgIHVuc2lnbmVkIGNoYXIgaGFzX2NoaWxkcmVuOworICAgIHVuc2lnbmVkIGNoYXIgaXNfZXh0ZXJuYWw7CisgICAgdW5zaWduZWQgY2hhciBpc19kZWNsYXJhdGlvbjsKKyAgICB1bnNpZ25lZCBjaGFyIGhhc190eXBlOworICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7CisgICAgdW5zaWduZWQgaW50IGFiYnJldjsKKyAgICBjaGFyICpuYW1lOworICAgIENPUkVfQUREUiBsb3dwYzsKKyAgICBDT1JFX0FERFIgaGlnaHBjOworICAgIHN0cnVjdCBkd2FyZl9ibG9jayAqbG9jZGVzYzsKKyAgICB1bnNpZ25lZCBpbnQgbGFuZ3VhZ2U7CisgICAgY2hhciAqc2libGluZzsKKyAgfTsKKworLyogVGhpcyBkYXRhIHN0cnVjdHVyZSBob2xkcyB0aGUgaW5mb3JtYXRpb24gb2YgYW4gYWJicmV2LiAqLworc3RydWN0IGFiYnJldl9pbmZvCisgIHsKKyAgICB1bnNpZ25lZCBpbnQgbnVtYmVyOwkvKiBudW1iZXIgaWRlbnRpZnlpbmcgYWJicmV2ICovCisgICAgZW51bSBkd2FyZl90YWcgdGFnOwkJLyogZHdhcmYgdGFnICovCisgICAgaW50IGhhc19jaGlsZHJlbjsJCS8qIGJvb2xlYW4gKi8KKyAgICB1bnNpZ25lZCBpbnQgbnVtX2F0dHJzOwkvKiBudW1iZXIgb2YgYXR0cmlidXRlcyAqLworICAgIHN0cnVjdCBhdHRyX2FiYnJldiAqYXR0cnM7CS8qIGFuIGFycmF5IG9mIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbnMgKi8KKyAgICBzdHJ1Y3QgYWJicmV2X2luZm8gKm5leHQ7CS8qIG5leHQgaW4gY2hhaW4gKi8KKyAgfTsKKworc3RydWN0IGF0dHJfYWJicmV2CisgIHsKKyAgICBlbnVtIGR3YXJmX2F0dHJpYnV0ZSBuYW1lOworICAgIGVudW0gZHdhcmZfZm9ybSBmb3JtOworICB9OworCisvKiBUaGlzIGRhdGEgc3RydWN0dXJlIGhvbGRzIGEgY29tcGxldGUgZGllIHN0cnVjdHVyZS4gKi8KK3N0cnVjdCBkaWVfaW5mbworICB7CisgICAgZW51bSBkd2FyZl90YWcgdGFnOwkJIC8qIFRhZyBpbmRpY2F0aW5nIHR5cGUgb2YgZGllICovCisgICAgdW5zaWduZWQgc2hvcnQgaGFzX2NoaWxkcmVuOyAvKiBEb2VzIHRoZSBkaWUgaGF2ZSBjaGlsZHJlbiAqLworICAgIHVuc2lnbmVkIGludCBhYmJyZXY7CSAvKiBBYmJyZXYgbnVtYmVyICovCisgICAgdW5zaWduZWQgaW50IG9mZnNldDsJIC8qIE9mZnNldCBpbiAuZGVidWdfaW5mbyBzZWN0aW9uICovCisgICAgdW5zaWduZWQgaW50IG51bV9hdHRyczsJIC8qIE51bWJlciBvZiBhdHRyaWJ1dGVzICovCisgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cnM7CSAvKiBBbiBhcnJheSBvZiBhdHRyaWJ1dGVzICovCisgICAgc3RydWN0IGRpZV9pbmZvICpuZXh0X3JlZjsJIC8qIE5leHQgZGllIGluIHJlZiBoYXNoIHRhYmxlICovCisgICAgc3RydWN0IGRpZV9pbmZvICpuZXh0OwkgLyogTmV4dCBkaWUgaW4gbGlua2VkIGxpc3QgKi8KKyAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsJCSAvKiBDYWNoZWQgdHlwZSBpbmZvcm1hdGlvbiAqLworICB9OworCisvKiBBdHRyaWJ1dGVzIGhhdmUgYSBuYW1lIGFuZCBhIHZhbHVlICovCitzdHJ1Y3QgYXR0cmlidXRlCisgIHsKKyAgICBlbnVtIGR3YXJmX2F0dHJpYnV0ZSBuYW1lOworICAgIGVudW0gZHdhcmZfZm9ybSBmb3JtOworICAgIHVuaW9uCisgICAgICB7CisJY2hhciAqc3RyOworCXN0cnVjdCBkd2FyZl9ibG9jayAqYmxrOworCXVuc2lnbmVkIGludCB1bnNuZDsKKwlpbnQgc25kOworCUNPUkVfQUREUiBhZGRyOworICAgICAgfQorICAgIHU7CisgIH07CisKKy8qIEdldCBhdCBwYXJ0cyBvZiBhbiBhdHRyaWJ1dGUgc3RydWN0dXJlICovCisKKyNkZWZpbmUgRFdfU1RSSU5HKGF0dHIpICAgICgoYXR0ciktPnUuc3RyKQorI2RlZmluZSBEV19VTlNORChhdHRyKSAgICAgKChhdHRyKS0+dS51bnNuZCkKKyNkZWZpbmUgRFdfQkxPQ0soYXR0cikgICAgICgoYXR0ciktPnUuYmxrKQorI2RlZmluZSBEV19TTkQoYXR0cikgICAgICAgKChhdHRyKS0+dS5zbmQpCisjZGVmaW5lIERXX0FERFIoYXR0cikJICAgKChhdHRyKS0+dS5hZGRyKQorCisvKiBCbG9ja3MgYXJlIGEgYnVuY2ggb2YgdW50eXBlZCBieXRlcy4gKi8KK3N0cnVjdCBkd2FyZl9ibG9jaworICB7CisgICAgdW5zaWduZWQgaW50IHNpemU7CisgICAgY2hhciAqZGF0YTsKKyAgfTsKKworLyogV2Ugb25seSBob2xkIG9uZSBjb21waWxhdGlvbiB1bml0J3MgYWJicmV2cyBpbgorICAgbWVtb3J5IGF0IGFueSBvbmUgdGltZS4gICovCisjaWZuZGVmIEFCQlJFVl9IQVNIX1NJWkUKKyNkZWZpbmUgQUJCUkVWX0hBU0hfU0laRSAxMjEKKyNlbmRpZgorI2lmbmRlZiBBVFRSX0FMTE9DX0NIVU5LCisjZGVmaW5lIEFUVFJfQUxMT0NfQ0hVTksgNAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgYWJicmV2X2luZm8gKmR3YXJmMl9hYmJyZXZzW0FCQlJFVl9IQVNIX1NJWkVdOworCisvKiBBIGhhc2ggdGFibGUgb2YgZGllIG9mZnNldHMgZm9yIGZvbGxvd2luZyByZWZlcmVuY2VzLiAgKi8KKyNpZm5kZWYgUkVGX0hBU0hfU0laRQorI2RlZmluZSBSRUZfSEFTSF9TSVpFIDEwMjEKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGRpZV9pbmZvICpkaWVfcmVmX3RhYmxlW1JFRl9IQVNIX1NJWkVdOworCisvKiBPYnN0YWNrIGZvciBhbGxvY2F0aW5nIHRlbXBvcmFyeSBzdG9yYWdlIHVzZWQgZHVyaW5nIHN5bWJvbCByZWFkaW5nLiAgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2JzdGFjayBkd2FyZjJfdG1wX29ic3RhY2s7CisKKy8qIE9mZnNldCB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0IGhlYWRlciwKKyAgIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgcmVmZXJlbmNlIGRpZXMuICovCitzdGF0aWMgdW5zaWduZWQgaW50IGN1X2hlYWRlcl9vZmZzZXQ7CisKKy8qIEFsbG9jYXRlIGZpZWxkcyBmb3Igc3RydWN0cywgdW5pb25zIGFuZCBlbnVtcyBpbiB0aGlzIHNpemUuICAqLworI2lmbmRlZiBEV19GSUVMRF9BTExPQ19DSFVOSworI2RlZmluZSBEV19GSUVMRF9BTExPQ19DSFVOSyA0CisjZW5kaWYKKworLyogVGhlIGxhbmd1YWdlIHdlIGFyZSBkZWJ1Z2dpbmcuICAqLworc3RhdGljIGVudW0gbGFuZ3VhZ2UgY3VfbGFuZ3VhZ2U7CitzdGF0aWMgY29uc3Qgc3RydWN0IGxhbmd1YWdlX2RlZm4gKmN1X2xhbmd1YWdlX2RlZm47CisKKy8qIEFjdHVhbGx5IGRhdGEgZnJvbSB0aGUgc2VjdGlvbnMuICAqLworc3RhdGljIGNoYXIgKmR3YXJmX2luZm9fYnVmZmVyOworc3RhdGljIGNoYXIgKmR3YXJmX2FiYnJldl9idWZmZXI7CitzdGF0aWMgY2hhciAqZHdhcmZfbGluZV9idWZmZXI7CisKKy8qIEEgemVyb2VkIHZlcnNpb24gb2YgYSBwYXJ0aWFsIGRpZSBmb3IgaW5pdGlhbGl6YXRpb24gcHVycG9zZXMuICAqLworc3RhdGljIHN0cnVjdCBwYXJ0aWFsX2RpZV9pbmZvIHplcm9lZF9wYXJ0aWFsX2RpZTsKKworLyogVGhlIGdlbmVyaWMgc3ltYm9sIHRhYmxlIGJ1aWxkaW5nIHJvdXRpbmVzIGhhdmUgc2VwYXJhdGUgbGlzdHMgZm9yCisgICBmaWxlIHNjb3BlIHN5bWJvbHMgYW5kIGFsbCBhbGwgb3RoZXIgc2NvcGVzIChsb2NhbCBzY29wZXMpLiAgU28KKyAgIHdlIG5lZWQgdG8gc2VsZWN0IHRoZSByaWdodCBvbmUgdG8gcGFzcyB0byBhZGRfc3ltYm9sX3RvX2xpc3QoKS4KKyAgIFdlIGRvIGl0IGJ5IGtlZXBpbmcgYSBwb2ludGVyIHRvIHRoZSBjb3JyZWN0IGxpc3QgaW4gbGlzdF9pbl9zY29wZS4KKworICAgRklYTUU6ICBUaGUgb3JpZ2luYWwgZHdhcmYgY29kZSBqdXN0IHRyZWF0ZWQgdGhlIGZpbGUgc2NvcGUgYXMgdGhlIGZpcnN0CisgICBsb2NhbCBzY29wZSwgYW5kIGFsbCBvdGhlciBsb2NhbCBzY29wZXMgYXMgbmVzdGVkIGxvY2FsIHNjb3BlcywgYW5kIHdvcmtlZAorICAgZmluZS4gIENoZWNrIHRvIHNlZSBpZiB3ZSByZWFsbHkgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGVzZQorICAgaW4gYnVpbGRzeW0uYy4gICovCitzdGF0aWMgc3RydWN0IHBlbmRpbmcgKipsaXN0X2luX3Njb3BlID0gJmZpbGVfc3ltYm9sczsKKworLyogRklYTUU6IFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIHBhc3MgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmcm9tCisgICBkZWNvZGVfbG9jZGVzYyB0byB0aGUgY2FsbGVyLiAgKi8KK3N0YXRpYyBpbnQgb3B0aW1pemVkX291dDsJLyogS2x1ZGdlIHRvIGlkZW50aWZ5IG9wdGltaXplZCBvdXQgdmFyaWFibGVzICovCitzdGF0aWMgaW50IGlzcmVnOwkJLyogS2x1ZGdlIHRvIGlkZW50aWZ5IHJlZ2lzdGVyIHZhcmlhYmxlcyAqLworc3RhdGljIGludCBvZmZyZWc7CQkvKiBLbHVkZ2UgdG8gaWRlbnRpZnkgYmFzZXJlZyByZWZlcmVuY2VzICovCitzdGF0aWMgaW50IGJhc2VyZWc7CQkvKiBXaGljaCBiYXNlIHJlZ2lzdGVyIGlzIGl0IHJlbGF0aXZlIHRvPyAgKi8KK3N0YXRpYyBpbnQgaXNsb2NhbDsJCS8qIEtsdWRnZSB0byBpZGVudGlmeSBsb2NhbCB2YXJpYWJsZXMgKi8KKworLyogRFdfQVRfZnJhbWVfYmFzZSB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICAgZnJhbWVfYmFzZV9yZWcgaXMgLTEgaWYgRFdfQVRfZnJhbWVfYmFzZSBpcyBtaXNzaW5nLCBvdGhlcndpc2UgaXQKKyAgIGNvbnRhaW5zIHRoZSByZWdpc3RlciBudW1iZXIgZm9yIHRoZSBmcmFtZSByZWdpc3Rlci4KKyAgIGZyYW1lX2Jhc2Vfb2Zmc2V0IGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUgZnJhbWUgcmVnaXN0ZXIgdG8gdGhlCisgICB2aXJ0dWFsIHN0YWNrIGZyYW1lLiAqLworc3RhdGljIGludCBmcmFtZV9iYXNlX3JlZzsKK3N0YXRpYyBDT1JFX0FERFIgZnJhbWVfYmFzZV9vZmZzZXQ7CisKKy8qIFRoaXMgdmFsdWUgaXMgYWRkZWQgdG8gZWFjaCBzeW1ib2wgdmFsdWUuICBGSVhNRTogIEdlbmVyYWxpemUgdG8gCisgICB0aGUgc2VjdGlvbl9vZmZzZXRzIHN0cnVjdHVyZSB1c2VkIGJ5IGRieHJlYWQgKG9uY2UgdGhpcyBpcyBkb25lLAorICAgcGFzcyB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbiBudW1iZXIgdG8gZW5kX3N5bXRhYikuICAqLworc3RhdGljIENPUkVfQUREUiBiYXNlYWRkcjsJLyogQWRkIHRvIGVhY2ggc3ltYm9sIHZhbHVlICovCisKKy8qIFdlIHB1dCBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUgaW4gdGhlIHJlYWRfc3ltdGFiX3ByaXZhdGUgZmllbGQKKyAgIG9mIHRoZSBwc3ltdGFiLgorICAgVGhlIGNvbXBsZXRlIGR3YXJmIGluZm9ybWF0aW9uIGZvciBhbiBvYmpmaWxlIGlzIGtlcHQgaW4gdGhlCisgICBwc3ltYm9sX29ic3RhY2ssIHNvIHRoYXQgYWJzb2x1dGUgZGllIHJlZmVyZW5jZXMgY2FuIGJlIGhhbmRsZWQuCisgICBNb3N0IG9mIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIHN0cnVjdHVyZSBpcyByZWxhdGVkIHRvIGFuIGVudGlyZQorICAgb2JqZWN0IGZpbGUgYW5kIGNvdWxkIGJlIHBhc3NlZCB2aWEgdGhlIHN5bV9wcml2YXRlIGZpZWxkIG9mIHRoZSBvYmpmaWxlLgorICAgSXQgaXMgaG93ZXZlciBjb25jZWl2YWJsZSB0aGF0IGR3YXJmMiBtaWdodCBub3QgYmUgdGhlIG9ubHkgdHlwZQorICAgb2Ygc3ltYm9scyByZWFkIGZyb20gYW4gb2JqZWN0IGZpbGUuICAqLworCitzdHJ1Y3QgZHdhcmYyX3BpbmZvCit7CisgIC8qIFBvaW50ZXIgdG8gc3RhcnQgb2YgZHdhcmYgaW5mbyBidWZmZXIgZm9yIHRoZSBvYmpmaWxlLiAgKi8KKworICBjaGFyICpkd2FyZl9pbmZvX2J1ZmZlcjsKKworICAvKiBPZmZzZXQgaW4gZHdhcmZfaW5mb19idWZmZXIgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdC4gKi8KKworICB1bnNpZ25lZCBsb25nIGR3YXJmX2luZm9fb2Zmc2V0OworCisgIC8qIFBvaW50ZXIgdG8gc3RhcnQgb2YgZHdhcmYgYWJicmV2aWF0aW9uIGJ1ZmZlciBmb3IgdGhlIG9iamZpbGUuICAqLworCisgIGNoYXIgKmR3YXJmX2FiYnJldl9idWZmZXI7CisKKyAgLyogU2l6ZSBvZiBkd2FyZiBhYmJyZXZpYXRpb24gc2VjdGlvbiBmb3IgdGhlIG9iamZpbGUuICAqLworCisgIHVuc2lnbmVkIGludCBkd2FyZl9hYmJyZXZfc2l6ZTsKKworICAvKiBQb2ludGVyIHRvIHN0YXJ0IG9mIGR3YXJmIGxpbmUgYnVmZmVyIGZvciB0aGUgb2JqZmlsZS4gICovCisKKyAgY2hhciAqZHdhcmZfbGluZV9idWZmZXI7Cit9OworCisjZGVmaW5lIFBTVF9QUklWQVRFKHApICgoc3RydWN0IGR3YXJmMl9waW5mbyAqKShwKS0+cmVhZF9zeW10YWJfcHJpdmF0ZSkKKyNkZWZpbmUgRFdBUkZfSU5GT19CVUZGRVIocCkgKFBTVF9QUklWQVRFKHApLT5kd2FyZl9pbmZvX2J1ZmZlcikKKyNkZWZpbmUgRFdBUkZfSU5GT19PRkZTRVQocCkgKFBTVF9QUklWQVRFKHApLT5kd2FyZl9pbmZvX29mZnNldCkKKyNkZWZpbmUgRFdBUkZfQUJCUkVWX0JVRkZFUihwKSAoUFNUX1BSSVZBVEUocCktPmR3YXJmX2FiYnJldl9idWZmZXIpCisjZGVmaW5lIERXQVJGX0FCQlJFVl9TSVpFKHApIChQU1RfUFJJVkFURShwKS0+ZHdhcmZfYWJicmV2X3NpemUpCisjZGVmaW5lIERXQVJGX0xJTkVfQlVGRkVSKHApIChQU1RfUFJJVkFURShwKS0+ZHdhcmZfbGluZV9idWZmZXIpCisKKy8qIE1haW50YWluIGFuIGFycmF5IG9mIHJlZmVyZW5jZWQgZnVuZGFtZW50YWwgdHlwZXMgZm9yIHRoZSBjdXJyZW50CisgICBjb21waWxhdGlvbiB1bml0IGJlaW5nIHJlYWQuICBGb3IgRFdBUkYgdmVyc2lvbiAxLCB3ZSBoYXZlIHRvIGNvbnN0cnVjdAorICAgdGhlIGZ1bmRhbWVudGFsIHR5cGVzIG9uIHRoZSBmbHksIHNpbmNlIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgZnVuZGFtZW50YWwgdHlwZXMgaXMgc3VwcGxpZWQuICBFYWNoIHN1Y2ggZnVuZGFtZW50YWwgdHlwZSBpcyBjcmVhdGVkIGJ5CisgICBjYWxsaW5nIGEgbGFuZ3VhZ2UgZGVwZW5kZW50IHJvdXRpbmUgdG8gY3JlYXRlIHRoZSB0eXBlLCBhbmQgdGhlbiBhCisgICBwb2ludGVyIHRvIHRoYXQgdHlwZSBpcyB0aGVuIHBsYWNlZCBpbiB0aGUgYXJyYXkgYXQgdGhlIGluZGV4IHNwZWNpZmllZAorICAgYnkgaXQncyBGVF88VFlQRU5BTUU+IHZhbHVlLiAgVGhlIGFycmF5IGhhcyBhIGZpeGVkIHNpemUgc2V0IGJ5IHRoZQorICAgRlRfTlVNX01FTUJFUlMgY29tcGlsZSB0aW1lIGNvbnN0YW50LCB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHByZWRlZmluZWQKKyAgIGZ1bmRhbWVudGFsIHR5cGVzIGdkYiBrbm93cyBob3cgdG8gY29uc3RydWN0LiAgKi8KK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqZnR5cGVzW0ZUX05VTV9NRU1CRVJTXTsJLyogRnVuZGFtZW50YWwgdHlwZXMgKi8KKworLyogRklYTUU6IFdlIG1pZ2h0IHdhbnQgdG8gc2V0IHRoaXMgZnJvbSBCRkQgdmlhIGJmZF9hcmNoX2JpdHNfcGVyX2J5dGUsCisgICBidXQgdGhpcyB3b3VsZCByZXF1aXJlIGEgY29ycmVzcG9uZGluZyBjaGFuZ2UgaW4gdW5wYWNrX2ZpZWxkX2FzX2xvbmcKKyAgIGFuZCBmcmllbmRzLiAgKi8KK3N0YXRpYyBpbnQgYml0c19wZXJfYnl0ZSA9IDg7CisKKy8qIFRoZSByb3V0aW5lcyB0aGF0IHJlYWQgYW5kIHByb2Nlc3MgZGllcyBmb3IgYSBDIHN0cnVjdCBvciBDKysgY2xhc3MKKyAgIHBhc3MgbGlzdHMgb2YgZGF0YSBtZW1iZXIgZmllbGRzIGFuZCBsaXN0cyBvZiBtZW1iZXIgZnVuY3Rpb24gZmllbGRzCisgICBpbiBhbiBpbnN0YW5jZSBvZiBhIGZpZWxkX2luZm8gc3RydWN0dXJlLCBhcyBkZWZpbmVkIGJlbG93LiAgKi8KK3N0cnVjdCBmaWVsZF9pbmZvCit7CisgIC8qIExpc3Qgb2YgZGF0YSBtZW1iZXIgYW5kIGJhc2VjbGFzc2VzIGZpZWxkcy4gKi8KKyAgc3RydWN0IG5leHRmaWVsZAorICAgIHsKKyAgICAgIHN0cnVjdCBuZXh0ZmllbGQgKm5leHQ7CisgICAgICBpbnQgYWNjZXNzaWJpbGl0eTsKKyAgICAgIGludCB2aXJ0dWFsaXR5OworICAgICAgc3RydWN0IGZpZWxkIGZpZWxkOworICAgIH0gKmZpZWxkczsKKworICAvKiBOdW1iZXIgb2YgZmllbGRzLiAgKi8KKyAgaW50IG5maWVsZHM7CisKKyAgLyogTnVtYmVyIG9mIGJhc2VjbGFzc2VzLiAgKi8KKyAgaW50IG5iYXNlY2xhc3NlczsKKworICAvKiBTZXQgaWYgdGhlIGFjY2VzaWJpbGl0eSBvZiBvbmUgb2YgdGhlIGZpZWxkcyBpcyBub3QgcHVibGljLiAgKi8KKyAgaW50IG5vbl9wdWJsaWNfZmllbGRzOworCisgIC8qIE1lbWJlciBmdW5jdGlvbiBmaWVsZHMgYXJyYXksIGVudHJpZXMgYXJlIGFsbG9jYXRlZCBpbiB0aGUgb3JkZXIgdGhleQorICAgICBhcmUgZW5jb3VudGVyZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KKyAgc3RydWN0IG5leHRmbmZpZWxkCisgICAgeworICAgICAgc3RydWN0IG5leHRmbmZpZWxkICpuZXh0OworICAgICAgc3RydWN0IGZuX2ZpZWxkIGZuZmllbGQ7CisgICAgfSAqZm5maWVsZHM7CisKKyAgLyogTWVtYmVyIGZ1bmN0aW9uIGZpZWxkbGlzdCBhcnJheSwgY29udGFpbnMgbmFtZSBvZiBwb3NzaWJseSBvdmVybG9hZGVkCisgICAgIG1lbWJlciBmdW5jdGlvbiwgbnVtYmVyIG9mIG92ZXJsb2FkZWQgbWVtYmVyIGZ1bmN0aW9ucyBhbmQgYSBwb2ludGVyCisgICAgIHRvIHRoZSBoZWFkIG9mIHRoZSBtZW1iZXIgZnVuY3Rpb24gZmllbGQgY2hhaW4uICAqLworICBzdHJ1Y3QgZm5maWVsZGxpc3QKKyAgICB7CisgICAgICBjaGFyICpuYW1lOworICAgICAgaW50IGxlbmd0aDsKKyAgICAgIHN0cnVjdCBuZXh0Zm5maWVsZCAqaGVhZDsKKyAgICB9ICpmbmZpZWxkbGlzdHM7CisKKyAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGZuZmllbGRsaXN0cyBhcnJheS4gICovCisgIGludCBuZm5maWVsZHM7Cit9OworCisvKiBGSVhNRTogS2x1ZGdlIHRvIG1hcmsgYSB2YXJhcmdzIGZ1bmN0aW9uIHR5cGUgZm9yIEMrKyBtZW1iZXIgZnVuY3Rpb24KKyAgIGFyZ3VtZW50IHByb2Nlc3NpbmcuICAqLworI2RlZmluZSBUWVBFX0ZMQUdfVkFSQVJHUwkoMSA8PCAxMCkKKworLyogRHdhcmYyIGhhcyBubyBjbGVhbiB3YXkgdG8gZGlzY2VybiBDKysgc3RhdGljIGFuZCBub24tc3RhdGljIG1lbWJlcgorICAgZnVuY3Rpb25zLiBHKysgaGVscHMgR0RCIGJ5IG1hcmtpbmcgdGhlIGZpcnN0IHBhcmFtZXRlciBmb3Igbm9uLXN0YXRpYworICAgbWVtYmVyIGZ1bmN0aW9ucyAod2hpY2ggaXMgdGhlIHRoaXMgcG9pbnRlcikgYXMgYXJ0aWZpY2lhbC4KKyAgIFdlIHBhc3MgdGhpcyBpbmZvcm1hdGlvbiBiZXR3ZWVuIGR3YXJmMl9hZGRfbWVtYmVyX2ZuIGFuZAorICAgcmVhZF9zdWJyb3V0aW5lX3R5cGUgdmlhIFRZUEVfRklFTERfQVJUSUZJQ0lBTC4gICovCisjZGVmaW5lIFRZUEVfRklFTERfQVJUSUZJQ0lBTAlUWVBFX0ZJRUxEX0JJVFBPUworCisvKiBWYXJpb3VzIGNvbXBsYWludHMgYWJvdXQgc3ltYm9sIHJlYWRpbmcgdGhhdCBkb24ndCBhYm9ydCB0aGUgcHJvY2VzcyAqLworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCBkd2FyZjJfY29uc3RfaWdub3JlZCA9Cit7CisgICJ0eXBlIHF1YWxpZmllciAnY29uc3QnIGlnbm9yZWQiLCAwLCAwCit9Oworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgZHdhcmYyX3ZvbGF0aWxlX2lnbm9yZWQgPQoreworICAidHlwZSBxdWFsaWZpZXIgJ3ZvbGF0aWxlJyBpZ25vcmVkIiwgMCwgMAorfTsKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGR3YXJmMl9ub25fY29uc3RfYXJyYXlfYm91bmRfaWdub3JlZCA9Cit7CisgICJub24tY29uc3RhbnQgYXJyYXkgYm91bmRzIGZvcm0gJyVzJyBpZ25vcmVkIiwgMCwgMAorfTsKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGR3YXJmMl9taXNzaW5nX2xpbmVfbnVtYmVyX3NlY3Rpb24gPQoreworICAibWlzc2luZyAuZGVidWdfbGluZSBzZWN0aW9uIiwgMCwgMAorfTsKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGR3YXJmMl9tYW5nbGVkX2xpbmVfbnVtYmVyX3NlY3Rpb24gPQoreworICAibWFuZ2xlZCAuZGVidWdfbGluZSBzZWN0aW9uIiwgMCwgMAorfTsKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGR3YXJmMl91bnN1cHBvcnRlZF9kaWVfcmVmX2F0dHIgPQoreworICAidW5zdXBwb3J0ZWQgZGllIHJlZiBhdHRyaWJ1dGUgZm9ybTogJyVzJyIsIDAsIDAKK307CitzdGF0aWMgc3RydWN0IGNvbXBsYWludCBkd2FyZjJfdW5zdXBwb3J0ZWRfc3RhY2tfb3AgPQoreworICAidW5zdXBwb3J0ZWQgc3RhY2sgb3A6ICclcyciLCAwLCAwCit9Oworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgZHdhcmYyX3Vuc3VwcG9ydGVkX3RhZyA9Cit7CisgICJ1bnN1cHBvcnRlZCB0YWc6ICclcyciLCAwLCAwCit9Oworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgZHdhcmYyX3Vuc3VwcG9ydGVkX2F0X2VuY29kaW5nID0KK3sKKyAgInVuc3VwcG9ydGVkIERXX0FUX2VuY29kaW5nOiAnJXMnIiwgMCwgMAorfTsKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGR3YXJmMl91bnN1cHBvcnRlZF9hdF9mcmFtZV9iYXNlID0KK3sKKyAgInVuc3VwcG9ydGVkIERXX0FUX2ZyYW1lX2Jhc2UgZm9yIGZ1bmN0aW9uICclcyciLCAwLCAwCit9Oworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgZHdhcmYyX3VuZXhwZWN0ZWRfdGFnID0KK3sKKyAgInVuZXhlcGVjdGVkIHRhZyBpbiByZWFkX3R5cGVfZGllOiAnJXMnIiwgMCwgMAorfTsKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGR3YXJmMl9taXNzaW5nX2F0X2ZyYW1lX2Jhc2UgPQoreworICAiRFdfQVRfZnJhbWVfYmFzZSBtaXNzaW5nIGZvciBEV19PUF9mYnJlZyIsIDAsIDAKK307CitzdGF0aWMgc3RydWN0IGNvbXBsYWludCBkd2FyZjJfYmFkX3N0YXRpY19tZW1iZXJfbmFtZSA9Cit7CisgICJ1bnJlY29nbml6ZWQgc3RhdGljIGRhdGEgbWVtYmVyIG5hbWUgJyVzJyIsIDAsIDAKK307CitzdGF0aWMgc3RydWN0IGNvbXBsYWludCBkd2FyZjJfdW5zdXBwb3J0ZWRfYWNjZXNzaWJpbGl0eSA9Cit7CisgICJ1bnN1cHBvcnRlZCBhY2Nlc3NpYmlsaXR5ICVkIiwgMCwgMAorfTsKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGR3YXJmMl9iYWRfbWVtYmVyX25hbWVfY29tcGxhaW50ID0KK3sKKyAgImNhbm5vdCBleHRyYWN0IG1lbWJlciBuYW1lIGZyb20gJyVzJyIsIDAsIDAKK307CitzdGF0aWMgc3RydWN0IGNvbXBsYWludCBkd2FyZjJfbWlzc2luZ19tZW1iZXJfZm5fdHlwZV9jb21wbGFpbnQgPQoreworICAibWVtYmVyIGZ1bmN0aW9uIHR5cGUgbWlzc2luZyBmb3IgJyVzJyIsIDAsIDAKK307CitzdGF0aWMgc3RydWN0IGNvbXBsYWludCBkd2FyZjJfdnRibF9ub3RfZm91bmRfY29tcGxhaW50ID0KK3sKKyAgInZpcnR1YWwgZnVuY3Rpb24gdGFibGUgcG9pbnRlciBub3QgZm91bmQgd2hlbiBkZWZpbmluZyBjbGFzcyAnJXMnIiwgMCwgMAorfTsKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGR3YXJmMl9hYnNvbHV0ZV9zaWJsaW5nX2NvbXBsYWludCA9Cit7CisgICJpZ25vcmluZyBhYnNvbHV0ZSBEV19BVF9zaWJsaW5nIiwgMCwgMAorfTsKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGR3YXJmMl9jb25zdF92YWx1ZV9sZW5ndGhfbWlzbWF0Y2ggPQoreworICAiY29uc3QgdmFsdWUgbGVuZ3RoIG1pc21hdGNoIGZvciAnJXMnLCBnb3QgJWQsIGV4cGVjdGVkICVkIiwgMCwgMAorfTsKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGR3YXJmMl91bnN1cHBvcnRlZF9jb25zdF92YWx1ZV9hdHRyID0KK3sKKyAgInVuc3VwcG9ydGVkIGNvbnN0IHZhbHVlIGF0dHJpYnV0ZSBmb3JtOiAnJXMnIiwgMCwgMAorfTsKKworLyogUmVtZW1iZXIgdGhlIGFkZHJfc2l6ZSByZWFkIGZyb20gdGhlIGR3YXJmLgorICAgSWYgYSB0YXJnZXQgZXhwZWN0cyB0byBsaW5rIGNvbXBpbGF0aW9uIHVuaXRzIHdpdGggZGlmZmVyaW5nIGFkZHJlc3MKKyAgIHNpemVzLCBnZGIgbmVlZHMgdG8gYmUgc3VyZSB0aGF0IHRoZSBhcHByb3ByaWF0ZSBzaXplIGlzIGhlcmUgZm9yCisgICB3aGF0ZXZlciBzY29wZSBpcyBjdXJyZW50bHkgZ2V0dGluZyByZWFkLiAqLworc3RhdGljIGludCBhZGRyZXNzX3NpemU7CisKKy8qIFNvbWUgZWxmMzIgb2JqZWN0IGZpbGUgZm9ybWF0cyB3aGlsZSBsaW5rZWQgZm9yIGEgMzIgYml0IGFkZHJlc3MKKyAgIHNwYWNlIGNvbnRhaW4gZGVidWcgaW5mb3JtYXRpb24gdGhhdCBoYXMgYXNzdW1lZCA2NCBiaXQKKyAgIGFkZHJlc3Nlcy4gRWcgNjQgYml0IE1JUFMgdGFyZ2V0IHByb2R1Y2VkIGJ5IEdDQy9HQVMvTEQgd2hlcmUgdGhlCisgICBzeW1ib2wgdGFibGUgY29udGFpbnMgMzJiaXQgYWRkcmVzcyB2YWx1ZXMgd2hpbGUgaXRzIC5kZWJ1Z19pbmZvCisgICBzZWN0aW9uIGNvbnRhaW5zIDY0IGJpdCBhZGRyZXNzIHZhbHVlcy4KKyAgIEFERFJFU1NfU0lHTklGSUNBTlRfU0laRSBzcGVjaWZpZXMgdGhlIG51bWJlciBzaWduaWZpY2FudCBiaXRzIGluCisgICB0aGUgQUREUkVTU19TSVpFIGJ5dGVzIHJlYWQgZnJvbSB0aGUgZmlsZSAqLworc3RhdGljIGludCBhZGRyZXNzX3NpZ25pZmljYW50X3NpemU7CisKKy8qIEV4dGVybmFscyByZWZlcmVuY2VzLiAgKi8KK2V4dGVybiBpbnQgaW5mb192ZXJib3NlOwkvKiBGcm9tIG1haW4uYzsgbm9uemVybyA9PiB2ZXJib3NlICovCisKKy8qIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQgZHdhcmYyX2xvY2F0ZV9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7CisKKyNpZiAwCitzdGF0aWMgdm9pZCBkd2FyZjJfYnVpbGRfcHN5bXRhYnNfZWFzeSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLAorCQkJCQkJc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqLAorCQkJCQkJaW50KSk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgZHdhcmYyX2J1aWxkX3BzeW10YWJzX2hhcmQgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwKKwkJCQkJCXN0cnVjdCBzZWN0aW9uX29mZnNldHMgKiwKKwkJCQkJCWludCkpOworCitzdGF0aWMgY2hhciAqc2Nhbl9wYXJ0aWFsX3N5bWJvbHMgUEFSQU1TICgoY2hhciAqLCBzdHJ1Y3Qgb2JqZmlsZSAqLAorCQkJCQkgICBDT1JFX0FERFIgKiwgQ09SRV9BRERSICopKTsKKworc3RhdGljIHZvaWQgYWRkX3BhcnRpYWxfc3ltYm9sIFBBUkFNUyAoKHN0cnVjdCBwYXJ0aWFsX2RpZV9pbmZvICosCisJCQkJCXN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQgZHdhcmYyX3BzeW10YWJfdG9fc3ltdGFiIFBBUkFNUyAoKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSk7CisKK3N0YXRpYyB2b2lkIHBzeW10YWJfdG9fc3ltdGFiXzEgUEFSQU1TICgoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKKworc3RhdGljIGNoYXIgKmR3YXJmMl9yZWFkX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgZmlsZV9wdHIsCisJCQkJCSAgdW5zaWduZWQgaW50KSk7CisKK3N0YXRpYyB2b2lkIGR3YXJmMl9yZWFkX2FiYnJldnMgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCkpOworCitzdGF0aWMgdm9pZCBkd2FyZjJfZW1wdHlfYWJicmV2X3RhYmxlIFBBUkFNUyAoKFBUUikpOworCitzdGF0aWMgc3RydWN0IGFiYnJldl9pbmZvICpkd2FyZjJfbG9va3VwX2FiYnJldiBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKKworc3RhdGljIGNoYXIgKnJlYWRfcGFydGlhbF9kaWUgUEFSQU1TICgoc3RydWN0IHBhcnRpYWxfZGllX2luZm8gKiwKKwkJCQkgICAgICAgYmZkICosIGNoYXIgKiwgaW50ICopKTsKKworc3RhdGljIGNoYXIgKnJlYWRfZnVsbF9kaWUgUEFSQU1TICgoc3RydWN0IGRpZV9pbmZvICoqLCBiZmQgKiwgY2hhciAqKSk7CisKK3N0YXRpYyBjaGFyICpyZWFkX2F0dHJpYnV0ZSBQQVJBTVMgKChzdHJ1Y3QgYXR0cmlidXRlICosIHN0cnVjdCBhdHRyX2FiYnJldiAqLAorCQkJCSAgICAgYmZkICosIGNoYXIgKikpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfMV9ieXRlIFBBUkFNUyAoKGJmZCAqLCBjaGFyICopKTsKKworc3RhdGljIGludCByZWFkXzFfc2lnbmVkX2J5dGUgUEFSQU1TICgoYmZkICosIGNoYXIgKikpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfMl9ieXRlcyBQQVJBTVMgKChiZmQgKiwgY2hhciAqKSk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVhZF80X2J5dGVzIFBBUkFNUyAoKGJmZCAqLCBjaGFyICopKTsKKworc3RhdGljIHVuc2lnbmVkIGludCByZWFkXzhfYnl0ZXMgUEFSQU1TICgoYmZkICosIGNoYXIgKikpOworCitzdGF0aWMgQ09SRV9BRERSIHJlYWRfYWRkcmVzcyBQQVJBTVMgKChiZmQgKiwgY2hhciAqKSk7CisKK3N0YXRpYyBjaGFyICpyZWFkX25fYnl0ZXMgUEFSQU1TICgoYmZkICosIGNoYXIgKiwgdW5zaWduZWQgaW50KSk7CisKK3N0YXRpYyBjaGFyICpyZWFkX3N0cmluZyBQQVJBTVMgKChiZmQgKiwgY2hhciAqLCB1bnNpZ25lZCBpbnQgKikpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfdW5zaWduZWRfbGViMTI4IFBBUkFNUyAoKGJmZCAqLCBjaGFyICosCisJCQkJCQkgIHVuc2lnbmVkIGludCAqKSk7CisKK3N0YXRpYyBpbnQgcmVhZF9zaWduZWRfbGViMTI4IFBBUkFNUyAoKGJmZCAqLCBjaGFyICosIHVuc2lnbmVkIGludCAqKSk7CisKK3N0YXRpYyB2b2lkIHNldF9jdV9sYW5ndWFnZSBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmR3YXJmX2F0dHIgUEFSQU1TICgoc3RydWN0IGRpZV9pbmZvICosCisJCQkJCSAgICAgdW5zaWduZWQgaW50KSk7CisKK3N0YXRpYyB2b2lkIGR3YXJmX2RlY29kZV9saW5lcyBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGNoYXIgKiwgYmZkICopKTsKKworc3RhdGljIHZvaWQgZHdhcmYyX3N0YXJ0X3N1YmZpbGUgUEFSQU1TICgoY2hhciAqLCBjaGFyICopKTsKKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKm5ld19zeW1ib2wgUEFSQU1TICgoc3RydWN0IGRpZV9pbmZvICosIHN0cnVjdCB0eXBlICosCisJCQkJCSAgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZCBkd2FyZjJfY29uc3RfdmFsdWUgUEFSQU1TICgoc3RydWN0IGF0dHJpYnV0ZSAqLCBzdHJ1Y3Qgc3ltYm9sICosCisJCQkJCXN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICpkaWVfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgZGllX2luZm8gKiwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKmRpZV9jb250YWluaW5nX3R5cGUgUEFSQU1TICgoc3RydWN0IGRpZV9pbmZvICosCisJCQkJCQkgc3RydWN0IG9iamZpbGUgKikpOworCisjaWYgMAorc3RhdGljIHN0cnVjdCB0eXBlICp0eXBlX2F0X29mZnNldCBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIHN0cnVjdCBvYmpmaWxlICopKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHR5cGUgKnRhZ190eXBlX3RvX3R5cGUgUEFSQU1TICgoc3RydWN0IGRpZV9pbmZvICosCisJCQkJCSAgICAgIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQgcmVhZF90eXBlX2RpZSBQQVJBTVMgKChzdHJ1Y3QgZGllX2luZm8gKiwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZCByZWFkX3R5cGVkZWYgUEFSQU1TICgoc3RydWN0IGRpZV9pbmZvICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQgcmVhZF9iYXNlX3R5cGUgUEFSQU1TICgoc3RydWN0IGRpZV9pbmZvICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQgcmVhZF9maWxlX3Njb3BlIFBBUkFNUyAoKHN0cnVjdCBkaWVfaW5mbyAqLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkIHJlYWRfZnVuY19zY29wZSBQQVJBTVMgKChzdHJ1Y3QgZGllX2luZm8gKiwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZCByZWFkX2xleGljYWxfYmxvY2tfc2NvcGUgUEFSQU1TICgoc3RydWN0IGRpZV9pbmZvICosCisJCQkJCSAgICAgIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIGludCBkd2FyZjJfZ2V0X3BjX2JvdW5kcyBQQVJBTVMgKChzdHJ1Y3QgZGllX2luZm8gKiwKKwkJCQkJIENPUkVfQUREUiAqLCBDT1JFX0FERFIgKiwKKwkJCQkJIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQgZHdhcmYyX2FkZF9maWVsZCBQQVJBTVMgKChzdHJ1Y3QgZmllbGRfaW5mbyAqLCBzdHJ1Y3QgZGllX2luZm8gKiwKKwkJCQkgICAgICBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkIGR3YXJmMl9hdHRhY2hfZmllbGRzX3RvX3R5cGUgUEFSQU1TICgoc3RydWN0IGZpZWxkX2luZm8gKiwKKwkJCQkJCSAgc3RydWN0IHR5cGUgKiwgCisJCQkJCQkgIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIGNoYXIgKnNraXBfbWVtYmVyX2ZuX25hbWUgUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyB2b2lkIGR3YXJmMl9hZGRfbWVtYmVyX2ZuIFBBUkFNUyAoKHN0cnVjdCBmaWVsZF9pbmZvICosCisJCQkJCSAgc3RydWN0IGRpZV9pbmZvICosIHN0cnVjdCB0eXBlICosCisJCQkJCSAgc3RydWN0IG9iamZpbGUgKm9iamZpbGUpKTsKKworc3RhdGljIHZvaWQgZHdhcmYyX2F0dGFjaF9mbl9maWVsZHNfdG9fdHlwZSBQQVJBTVMgKChzdHJ1Y3QgZmllbGRfaW5mbyAqLAorCQkJCQkJICAgICBzdHJ1Y3QgdHlwZSAqLAorCQkJCQkJICAgICBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkIHJlYWRfc3RydWN0dXJlX3Njb3BlIFBBUkFNUyAoKHN0cnVjdCBkaWVfaW5mbyAqLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkIHJlYWRfY29tbW9uX2Jsb2NrIFBBUkFNUyAoKHN0cnVjdCBkaWVfaW5mbyAqLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkIHJlYWRfZW51bWVyYXRpb24gUEFSQU1TICgoc3RydWN0IGRpZV9pbmZvICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICpkd2FyZl9iYXNlX3R5cGUgUEFSQU1TICgoaW50LCBpbnQsIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIENPUkVfQUREUiBkZWNvZGVfbG9jZGVzYyBQQVJBTVMgKChzdHJ1Y3QgZHdhcmZfYmxvY2sgKiwKKwkJCQkJIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQgcmVhZF9hcnJheV90eXBlIFBBUkFNUyAoKHN0cnVjdCBkaWVfaW5mbyAqLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkIHJlYWRfdGFnX3BvaW50ZXJfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgZGllX2luZm8gKiwKKwkJCQkJICAgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZCByZWFkX3RhZ19wdHJfdG9fbWVtYmVyX3R5cGUgUEFSQU1TICgoc3RydWN0IGRpZV9pbmZvICosCisJCQkJCQkgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZCByZWFkX3RhZ19yZWZlcmVuY2VfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgZGllX2luZm8gKiwKKwkJCQkJICAgICBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkIHJlYWRfdGFnX2NvbnN0X3R5cGUgUEFSQU1TICgoc3RydWN0IGRpZV9pbmZvICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQgcmVhZF90YWdfdm9sYXRpbGVfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgZGllX2luZm8gKiwKKwkJCQkJICAgIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQgcmVhZF90YWdfc3RyaW5nX3R5cGUgUEFSQU1TICgoc3RydWN0IGRpZV9pbmZvICosCisJCQkJCSAgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZCByZWFkX3N1YnJvdXRpbmVfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgZGllX2luZm8gKiwKKwkJCQkJICBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0cnVjdCBkaWVfaW5mbyAqcmVhZF9jb21wX3VuaXQgUEFSQU1TICgoY2hhciAqLCBiZmQgKikpOworCitzdGF0aWMgdm9pZCBmcmVlX2RpZV9saXN0IFBBUkFNUyAoKHN0cnVjdCBkaWVfaW5mbyAqKSk7CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfZGllIFBBUkFNUyAoKHN0cnVjdCBkaWVfaW5mbyAqLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyBjaGFyICpkd2FyZjJfbGlua2FnZV9uYW1lIFBBUkFNUyAoKHN0cnVjdCBkaWVfaW5mbyAqKSk7CisKK3N0YXRpYyBjaGFyICpkd2FyZl90YWdfbmFtZSBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKKworc3RhdGljIGNoYXIgKmR3YXJmX2F0dHJfbmFtZSBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKKworc3RhdGljIGNoYXIgKmR3YXJmX2Zvcm1fbmFtZSBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKKworc3RhdGljIGNoYXIgKmR3YXJmX3N0YWNrX29wX25hbWUgUEFSQU1TICgodW5zaWduZWQgaW50KSk7CisKK3N0YXRpYyBjaGFyICpkd2FyZl9ib29sX25hbWUgUEFSQU1TICgodW5zaWduZWQgaW50KSk7CisKK3N0YXRpYyBjaGFyICpkd2FyZl90eXBlX2VuY29kaW5nX25hbWUgUEFSQU1TICgodW5zaWduZWQgaW50KSk7CisKKyNpZiAwCitzdGF0aWMgY2hhciAqZHdhcmZfY2ZpX25hbWUgUEFSQU1TICgodW5zaWduZWQgaW50KSk7CisKK3N0cnVjdCBkaWVfaW5mbyAqY29weV9kaWUgUEFSQU1TICgoc3RydWN0IGRpZV9pbmZvICopKTsKKyNlbmRpZgorCitzdHJ1Y3QgZGllX2luZm8gKnNpYmxpbmdfZGllIFBBUkFNUyAoKHN0cnVjdCBkaWVfaW5mbyAqKSk7CisKK3ZvaWQgZHVtcF9kaWUgUEFSQU1TICgoc3RydWN0IGRpZV9pbmZvICopKTsKKwordm9pZCBkdW1wX2RpZV9saXN0IFBBUkFNUyAoKHN0cnVjdCBkaWVfaW5mbyAqKSk7CisKK3ZvaWQgc3RvcmVfaW5fcmVmX3RhYmxlIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgc3RydWN0IGRpZV9pbmZvICopKTsKKworc3RhdGljIHZvaWQgZHdhcmYyX2VtcHR5X2RpZV9yZWZfdGFibGUgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGR3YXJmMl9nZXRfcmVmX2RpZV9vZmZzZXQgUEFSQU1TICgoc3RydWN0IGF0dHJpYnV0ZSAqKSk7CisKK3N0cnVjdCBkaWVfaW5mbyAqZm9sbG93X2RpZV9yZWYgUEFSQU1TICgodW5zaWduZWQgaW50KSk7CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqZHdhcmYyX2Z1bmRhbWVudGFsX3R5cGUgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgaW50KSk7CisKKy8qIG1lbW9yeSBhbGxvY2F0aW9uIGludGVyZmFjZSAqLworCitzdGF0aWMgdm9pZCBkd2FyZjJfZnJlZV90bXBfb2JzdGFjayBQQVJBTVMgKChQVFIpKTsKKworc3RhdGljIHN0cnVjdCBkd2FyZl9ibG9jayAqZHdhcmZfYWxsb2NfYmxvY2sgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgc3RydWN0IGFiYnJldl9pbmZvICpkd2FyZl9hbGxvY19hYmJyZXYgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgc3RydWN0IGRpZV9pbmZvICpkd2FyZl9hbGxvY19kaWUgUEFSQU1TICgodm9pZCkpOworCisvKiBUcnkgdG8gbG9jYXRlIHRoZSBzZWN0aW9ucyB3ZSBuZWVkIGZvciBEV0FSRiAyIGRlYnVnZ2luZworICAgaW5mb3JtYXRpb24gYW5kIHJldHVybiB0cnVlIGlmIHdlIGhhdmUgZW5vdWdoIHRvIGRvIHNvbWV0aGluZy4gICovCisKK2ludAorZHdhcmYyX2hhc19pbmZvIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIGR3YXJmX2luZm9fb2Zmc2V0ID0gZHdhcmZfYWJicmV2X29mZnNldCA9IGR3YXJmX2xpbmVfb2Zmc2V0ID0gMDsKKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBkd2FyZjJfbG9jYXRlX3NlY3Rpb25zLCBOVUxMKTsKKyAgaWYgKGR3YXJmX2luZm9fb2Zmc2V0ICYmIGR3YXJmX2FiYnJldl9vZmZzZXQpCisgICAgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIG1hcHBlZCBhY3Jvc3MgdGhlIHNlY3Rpb25zIGFuZCByZW1lbWJlcnMgdGhlCisgICBvZmZzZXQgYW5kIHNpemUgb2YgZWFjaCBvZiB0aGUgZGVidWdnaW5nIHNlY3Rpb25zIHdlIGFyZSBpbnRlcmVzdGVkCisgICBpbi4gICovCisKK3N0YXRpYyB2b2lkCitkd2FyZjJfbG9jYXRlX3NlY3Rpb25zIChpZ25vcmVfYWJmZCwgc2VjdHAsIGlnbm9yZV9wdHIpCisgICAgIGJmZCAqaWdub3JlX2FiZmQ7CisgICAgIGFzZWN0aW9uICpzZWN0cDsKKyAgICAgUFRSIGlnbm9yZV9wdHI7Cit7CisgIGlmIChTVFJFUSAoc2VjdHAtPm5hbWUsIElORk9fU0VDVElPTikpCisgICAgeworICAgICAgZHdhcmZfaW5mb19vZmZzZXQgPSBzZWN0cC0+ZmlsZXBvczsKKyAgICAgIGR3YXJmX2luZm9fc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdHApOworICAgIH0KKyAgZWxzZSBpZiAoU1RSRVEgKHNlY3RwLT5uYW1lLCBBQkJSRVZfU0VDVElPTikpCisgICAgeworICAgICAgZHdhcmZfYWJicmV2X29mZnNldCA9IHNlY3RwLT5maWxlcG9zOworICAgICAgZHdhcmZfYWJicmV2X3NpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3RwKTsKKyAgICB9CisgIGVsc2UgaWYgKFNUUkVRIChzZWN0cC0+bmFtZSwgTElORV9TRUNUSU9OKSkKKyAgICB7CisgICAgICBkd2FyZl9saW5lX29mZnNldCA9IHNlY3RwLT5maWxlcG9zOworICAgICAgZHdhcmZfbGluZV9zaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWN0cCk7CisgICAgfQorICBlbHNlIGlmIChTVFJFUSAoc2VjdHAtPm5hbWUsIFBVQk5BTUVTX1NFQ1RJT04pKQorICAgIHsKKyAgICAgIGR3YXJmX3B1Ym5hbWVzX29mZnNldCA9IHNlY3RwLT5maWxlcG9zOworICAgICAgZHdhcmZfcHVibmFtZXNfc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdHApOworICAgIH0KKyAgZWxzZSBpZiAoU1RSRVEgKHNlY3RwLT5uYW1lLCBBUkFOR0VTX1NFQ1RJT04pKQorICAgIHsKKyAgICAgIGR3YXJmX2FyYW5nZXNfb2Zmc2V0ID0gc2VjdHAtPmZpbGVwb3M7CisgICAgICBkd2FyZl9hcmFuZ2VzX3NpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3RwKTsKKyAgICB9CisgIGVsc2UgaWYgKFNUUkVRIChzZWN0cC0+bmFtZSwgTE9DX1NFQ1RJT04pKQorICAgIHsKKyAgICAgIGR3YXJmX2xvY19vZmZzZXQgPSBzZWN0cC0+ZmlsZXBvczsKKyAgICAgIGR3YXJmX2xvY19zaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWN0cCk7CisgICAgfQorICBlbHNlIGlmIChTVFJFUSAoc2VjdHAtPm5hbWUsIE1BQ0lORk9fU0VDVElPTikpCisgICAgeworICAgICAgZHdhcmZfbWFjaW5mb19vZmZzZXQgPSBzZWN0cC0+ZmlsZXBvczsKKyAgICAgIGR3YXJmX21hY2luZm9fc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdHApOworICAgIH0KKyAgZWxzZSBpZiAoU1RSRVEgKHNlY3RwLT5uYW1lLCBTVFJfU0VDVElPTikpCisgICAgeworICAgICAgZHdhcmZfc3RyX29mZnNldCA9IHNlY3RwLT5maWxlcG9zOworICAgICAgZHdhcmZfc3RyX3NpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3RwKTsKKyAgICB9Cit9CisKKy8qIEJ1aWxkIGEgcGFydGlhbCBzeW1ib2wgdGFibGUuICAqLworCit2b2lkCitkd2FyZjJfYnVpbGRfcHN5bXRhYnMgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywgbWFpbmxpbmUpCisgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworICAgIGludCBtYWlubGluZTsKK3sKKworICAvKiBXZSBkZWZpbml0ZWx5IG5lZWQgdGhlIC5kZWJ1Z19pbmZvIGFuZCAuZGVidWdfYWJicmV2IHNlY3Rpb25zICovCisKKyAgZHdhcmZfaW5mb19idWZmZXIgPSBkd2FyZjJfcmVhZF9zZWN0aW9uIChvYmpmaWxlLAorCQkJCQkgICBkd2FyZl9pbmZvX29mZnNldCwKKwkJCQkJICAgZHdhcmZfaW5mb19zaXplKTsKKyAgZHdhcmZfYWJicmV2X2J1ZmZlciA9IGR3YXJmMl9yZWFkX3NlY3Rpb24gKG9iamZpbGUsCisJCQkJCSAgICAgZHdhcmZfYWJicmV2X29mZnNldCwKKwkJCQkJICAgICBkd2FyZl9hYmJyZXZfc2l6ZSk7CisgIGR3YXJmX2xpbmVfYnVmZmVyID0gZHdhcmYyX3JlYWRfc2VjdGlvbiAob2JqZmlsZSwKKwkJCQkJICAgZHdhcmZfbGluZV9vZmZzZXQsCisJCQkJCSAgIGR3YXJmX2xpbmVfc2l6ZSk7CisKKyAgaWYgKG1haW5saW5lIHx8IG9iamZpbGUtPmdsb2JhbF9wc3ltYm9scy5zaXplID09IDAgfHwKKyAgICAgIG9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5zaXplID09IDApCisgICAgeworICAgICAgaW5pdF9wc3ltYm9sX2xpc3QgKG9iamZpbGUsIDEwMjQpOworICAgIH0KKworI2lmIDAKKyAgaWYgKGR3YXJmX2FyYW5nZXNfb2Zmc2V0ICYmIGR3YXJmX3B1Ym5hbWVzX29mZnNldCkKKyAgICB7CisgICAgICAvKiBUaGluZ3MgYXJlIHNpZ25pZmljYW5sdHkgZWFzaWVyIGlmIHdlIGhhdmUgLmRlYnVnX2FyYW5nZXMgYW5kCisgICAgICAgICAuZGVidWdfcHVibmFtZXMgc2VjdGlvbnMgKi8KKworICAgICAgZHdhcmYyX2J1aWxkX3BzeW10YWJzX2Vhc3kgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywgbWFpbmxpbmUpOworICAgIH0KKyAgZWxzZQorI2VuZGlmCisgICAgLyogb25seSB0ZXN0IHRoaXMgY2FzZSBmb3Igbm93ICovCisgICAgewkJCisgICAgICAvKiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byB3b3JrIGEgYml0IGhhcmRlciAqLworICAgICAgZHdhcmYyX2J1aWxkX3BzeW10YWJzX2hhcmQgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywgbWFpbmxpbmUpOworICAgIH0KK30KKworI2lmIDAKKy8qIEJ1aWxkIHRoZSBwYXJ0aWFsIHN5bWJvbCB0YWJsZSBmcm9tIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUKKyAgIC5kZWJ1Z19wdWJuYW1lcyBhbmQgLmRlYnVnX2FyYW5nZXMgc2VjdGlvbnMuICAqLworCitzdGF0aWMgdm9pZAorZHdhcmYyX2J1aWxkX3BzeW10YWJzX2Vhc3kgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywgbWFpbmxpbmUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHM7CisgICAgIGludCBtYWlubGluZTsKK3sKKyAgYmZkICphYmZkID0gb2JqZmlsZS0+b2JmZDsKKyAgY2hhciAqYXJhbmdlc19idWZmZXIsICpwdWJuYW1lc19idWZmZXI7CisgIGNoYXIgKmFyYW5nZXNfcHRyLCAqcHVibmFtZXNfcHRyOworICB1bnNpZ25lZCBpbnQgZW50cnlfbGVuZ3RoLCB2ZXJzaW9uLCBpbmZvX29mZnNldCwgaW5mb19zaXplOworCisgIHB1Ym5hbWVzX2J1ZmZlciA9IGR3YXJmMl9yZWFkX3NlY3Rpb24gKG9iamZpbGUsCisJCQkJCSBkd2FyZl9wdWJuYW1lc19vZmZzZXQsCisJCQkJCSBkd2FyZl9wdWJuYW1lc19zaXplKTsKKyAgcHVibmFtZXNfcHRyID0gcHVibmFtZXNfYnVmZmVyOworICB3aGlsZSAoKHB1Ym5hbWVzX3B0ciAtIHB1Ym5hbWVzX2J1ZmZlcikgPCBkd2FyZl9wdWJuYW1lc19zaXplKQorICAgIHsKKyAgICAgIGVudHJ5X2xlbmd0aCA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgcHVibmFtZXNfcHRyKTsKKyAgICAgIHB1Ym5hbWVzX3B0ciArPSA0OworICAgICAgdmVyc2lvbiA9IHJlYWRfMV9ieXRlIChhYmZkLCBwdWJuYW1lc19wdHIpOworICAgICAgcHVibmFtZXNfcHRyICs9IDE7CisgICAgICBpbmZvX29mZnNldCA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgcHVibmFtZXNfcHRyKTsKKyAgICAgIHB1Ym5hbWVzX3B0ciArPSA0OworICAgICAgaW5mb19zaXplID0gcmVhZF80X2J5dGVzIChhYmZkLCBwdWJuYW1lc19wdHIpOworICAgICAgcHVibmFtZXNfcHRyICs9IDQ7CisgICAgfQorCisgIGFyYW5nZXNfYnVmZmVyID0gZHdhcmYyX3JlYWRfc2VjdGlvbiAob2JqZmlsZSwKKwkJCQkJZHdhcmZfYXJhbmdlc19vZmZzZXQsCisJCQkJCWR3YXJmX2FyYW5nZXNfc2l6ZSk7CisKK30KKyNlbmRpZgorCisvKiBCdWlsZCB0aGUgcGFydGlhbCBzeW1ib2wgdGFibGUgYnkgZG9pbmcgYSBxdWljayBwYXNzIHRocm91Z2ggdGhlCisgICAuZGVidWdfaW5mbyBhbmQgLmRlYnVnX2FiYnJldiBzZWN0aW9ucy4gICovCisKK3N0YXRpYyB2b2lkCitkd2FyZjJfYnVpbGRfcHN5bXRhYnNfaGFyZCAob2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzLCBtYWlubGluZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKyAgICAgaW50IG1haW5saW5lOworeworICAvKiBJbnN0ZWFkIG9mIHJlYWRpbmcgdGhpcyBpbnRvIGEgYmlnIGJ1ZmZlciwgd2Ugc2hvdWxkIHByb2JhYmx5IHVzZQorICAgICBtbWFwKCkgIG9uIGFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0IGl0LiAoRklYTUUpICovCisgIGJmZCAqYWJmZCA9IG9iamZpbGUtPm9iZmQ7CisgIGNoYXIgKmluZm9fcHRyLCAqYWJicmV2X3B0cjsKKyAgY2hhciAqYmVnX29mX2NvbXBfdW5pdDsKKyAgc3RydWN0IGNvbXBfdW5pdF9oZWFkIGN1X2hlYWRlcjsKKyAgc3RydWN0IHBhcnRpYWxfZGllX2luZm8gY29tcF91bml0X2RpZTsKKyAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7CisgIHN0cnVjdCBjbGVhbnVwICpiYWNrX3RvOworICBpbnQgY29tcF91bml0X2hhc19wY19pbmZvOworICBDT1JFX0FERFIgbG93cGMsIGhpZ2hwYzsKKworICAvKiBOdW1iZXIgb2YgYnl0ZXMgb2YgYW55IGFkZHJlc3NlcyB0aGF0IGFyZSBzaWduZmljYW50ICovCisgIGFkZHJlc3Nfc2lnbmlmaWNhbnRfc2l6ZSA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+YXJjaF9zaXplIC8gODsKKworICBpbmZvX3B0ciA9IGR3YXJmX2luZm9fYnVmZmVyOworICBhYmJyZXZfcHRyID0gZHdhcmZfYWJicmV2X2J1ZmZlcjsKKworICBvYnN0YWNrX2luaXQgKCZkd2FyZjJfdG1wX29ic3RhY2spOworICBiYWNrX3RvID0gbWFrZV9jbGVhbnVwIChkd2FyZjJfZnJlZV90bXBfb2JzdGFjaywgTlVMTCk7CisKKyAgd2hpbGUgKCh1bnNpZ25lZCBpbnQpIChpbmZvX3B0ciAtIGR3YXJmX2luZm9fYnVmZmVyKQorCSAgKyAoKGluZm9fcHRyIC0gZHdhcmZfaW5mb19idWZmZXIpICUgNCkgPCBkd2FyZl9pbmZvX3NpemUpCisgICAgeworICAgICAgYmVnX29mX2NvbXBfdW5pdCA9IGluZm9fcHRyOworICAgICAgY3VfaGVhZGVyLmxlbmd0aCA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOworICAgICAgaW5mb19wdHIgKz0gNDsKKyAgICAgIGN1X2hlYWRlci52ZXJzaW9uID0gcmVhZF8yX2J5dGVzIChhYmZkLCBpbmZvX3B0cik7CisgICAgICBpbmZvX3B0ciArPSAyOworICAgICAgY3VfaGVhZGVyLmFiYnJldl9vZmZzZXQgPSByZWFkXzRfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKKyAgICAgIGluZm9fcHRyICs9IDQ7CisgICAgICBjdV9oZWFkZXIuYWRkcl9zaXplID0gcmVhZF8xX2J5dGUgKGFiZmQsIGluZm9fcHRyKTsKKyAgICAgIGluZm9fcHRyICs9IDE7CisgICAgICBhZGRyZXNzX3NpemUgPSBjdV9oZWFkZXIuYWRkcl9zaXplOworCisgICAgICBpZiAoY3VfaGVhZGVyLnZlcnNpb24gIT0gMikKKwl7CisJICBlcnJvciAoIkR3YXJmIEVycm9yOiB3cm9uZyB2ZXJzaW9uIGluIGNvbXBpbGF0aW9uIHVuaXQgaGVhZGVyLiIpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGlmIChjdV9oZWFkZXIuYWJicmV2X29mZnNldCA+PSBkd2FyZl9hYmJyZXZfc2l6ZSkKKwl7CisJICBlcnJvciAoIkR3YXJmIEVycm9yOiBiYWQgb2Zmc2V0ICgweCVseCkgaW4gY29tcGlsYXRpb24gdW5pdCBoZWFkZXIgKG9mZnNldCAweCVseCArIDYpLiIsCisJCSAobG9uZykgY3VfaGVhZGVyLmFiYnJldl9vZmZzZXQsCisJCSAobG9uZykgKGJlZ19vZl9jb21wX3VuaXQgLSBkd2FyZl9pbmZvX2J1ZmZlcikpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGlmIChiZWdfb2ZfY29tcF91bml0ICsgY3VfaGVhZGVyLmxlbmd0aCArIDQKKwkgID4gZHdhcmZfaW5mb19idWZmZXIgKyBkd2FyZl9pbmZvX3NpemUpCisJeworCSAgZXJyb3IgKCJEd2FyZiBFcnJvcjogYmFkIGxlbmd0aCAoMHglbHgpIGluIGNvbXBpbGF0aW9uIHVuaXQgaGVhZGVyIChvZmZzZXQgMHglbHggKyAwKS4iLAorCQkgKGxvbmcpIGN1X2hlYWRlci5sZW5ndGgsCisJCSAobG9uZykgKGJlZ19vZl9jb21wX3VuaXQgLSBkd2FyZl9pbmZvX2J1ZmZlcikpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGlmIChhZGRyZXNzX3NpemUgPCBhZGRyZXNzX3NpZ25pZmljYW50X3NpemUpCisJeworCSAgZXJyb3IgKCJEd2FyZiBFcnJvcjogYmFkIGFkZHJlc3Mgc2l6ZSAoJWxkKSBpbiBjb21waWxhdGlvbiB1bml0IGhlYWRlciAob2Zmc2V0IDB4JWx4ICsgMTEpLiIsCisJCSAobG9uZykgY3VfaGVhZGVyLmFkZHJfc2l6ZSwKKwkJIChsb25nKSAoYmVnX29mX2NvbXBfdW5pdCAtIGR3YXJmX2luZm9fYnVmZmVyKSk7CisJfQorCisgICAgICAvKiBSZWFkIHRoZSBhYmJyZXZzIGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaW50byBhIHRhYmxlICovCisgICAgICBkd2FyZjJfcmVhZF9hYmJyZXZzIChhYmZkLCBjdV9oZWFkZXIuYWJicmV2X29mZnNldCk7CisgICAgICBtYWtlX2NsZWFudXAgKGR3YXJmMl9lbXB0eV9hYmJyZXZfdGFibGUsIE5VTEwpOworCisgICAgICAvKiBSZWFkIHRoZSBjb21waWxhdGlvbiB1bml0IGRpZSAqLworICAgICAgaW5mb19wdHIgPSByZWFkX3BhcnRpYWxfZGllICgmY29tcF91bml0X2RpZSwgYWJmZCwKKwkJCQkgICBpbmZvX3B0ciwgJmNvbXBfdW5pdF9oYXNfcGNfaW5mbyk7CisKKyAgICAgIC8qIFNldCB0aGUgbGFuZ3VhZ2Ugd2UncmUgZGVidWdnaW5nICovCisgICAgICBzZXRfY3VfbGFuZ3VhZ2UgKGNvbXBfdW5pdF9kaWUubGFuZ3VhZ2UpOworCisgICAgICAvKiBBbGxvY2F0ZSBhIG5ldyBwYXJ0aWFsIHN5bWJvbCB0YWJsZSBzdHJ1Y3R1cmUgKi8KKyAgICAgIHBzdCA9IHN0YXJ0X3BzeW10YWJfY29tbW9uIChvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMsCisJCQkgICAgICAgICAgY29tcF91bml0X2RpZS5uYW1lID8gY29tcF91bml0X2RpZS5uYW1lIDogIiIsCisJCQkJICBjb21wX3VuaXRfZGllLmxvd3BjLAorCQkJCSAgb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLm5leHQsCisJCQkJICBvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMubmV4dCk7CisKKyAgICAgIHBzdC0+cmVhZF9zeW10YWJfcHJpdmF0ZSA9IChjaGFyICopCisJb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnBzeW1ib2xfb2JzdGFjaywgc2l6ZW9mIChzdHJ1Y3QgZHdhcmYyX3BpbmZvKSk7CisgICAgICBjdV9oZWFkZXJfb2Zmc2V0ID0gYmVnX29mX2NvbXBfdW5pdCAtIGR3YXJmX2luZm9fYnVmZmVyOworICAgICAgRFdBUkZfSU5GT19CVUZGRVIocHN0KSA9IGR3YXJmX2luZm9fYnVmZmVyOworICAgICAgRFdBUkZfSU5GT19PRkZTRVQocHN0KSA9IGJlZ19vZl9jb21wX3VuaXQgLSBkd2FyZl9pbmZvX2J1ZmZlcjsKKyAgICAgIERXQVJGX0FCQlJFVl9CVUZGRVIocHN0KSA9IGR3YXJmX2FiYnJldl9idWZmZXI7CisgICAgICBEV0FSRl9BQkJSRVZfU0laRShwc3QpID0gZHdhcmZfYWJicmV2X3NpemU7CisgICAgICBEV0FSRl9MSU5FX0JVRkZFUihwc3QpID0gZHdhcmZfbGluZV9idWZmZXI7CisgICAgICBiYXNlYWRkciA9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIDApOworCisgICAgICAvKiBTdG9yZSB0aGUgZnVuY3Rpb24gdGhhdCByZWFkcyBpbiB0aGUgcmVzdCBvZiB0aGUgc3ltYm9sIHRhYmxlICovCisgICAgICBwc3QtPnJlYWRfc3ltdGFiID0gZHdhcmYyX3BzeW10YWJfdG9fc3ltdGFiOworCisgICAgICAvKiBDaGVjayBpZiBjb21wIHVuaXQgaGFzX2NoaWxkcmVuLgorICAgICAgICAgSWYgc28sIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIHBhcnRpYWwgc3ltYm9scyBmcm9tIHRoaXMgY29tcCB1bml0LgorICAgICAgICAgSWYgbm90LCB0aGVyZSdzIG5vIG1vcmUgZGVidWdfaW5mbyBmb3IgdGhpcyBjb21wIHVuaXQuICovCisgICAgICBpZiAoY29tcF91bml0X2RpZS5oYXNfY2hpbGRyZW4pCisJeworCSAgaW5mb19wdHIgPSBzY2FuX3BhcnRpYWxfc3ltYm9scyAoaW5mb19wdHIsIG9iamZpbGUsICZsb3dwYywgJmhpZ2hwYyk7CisKKwkgIC8qIElmIHRoZSBjb21waWxhdGlvbiB1bml0IGRpZG4ndCBoYXZlIGFuIGV4cGxpY2l0IGFkZHJlc3MgcmFuZ2UsCisJICAgICB0aGVuIHVzZSB0aGUgaW5mb3JtYXRpb24gZXh0cmFjdGVkIGZyb20gaXRzIGNoaWxkIGRpZXMuICAqLworCSAgaWYgKCFjb21wX3VuaXRfaGFzX3BjX2luZm8pCisJICAgIHsKKwkgICAgICBjb21wX3VuaXRfZGllLmxvd3BjICA9IGxvd3BjOworCSAgICAgIGNvbXBfdW5pdF9kaWUuaGlnaHBjID0gaGlnaHBjOworCSAgICB9CisJfQorICAgICAgcHN0LT50ZXh0bG93ICA9IGNvbXBfdW5pdF9kaWUubG93cGMgKyBiYXNlYWRkcjsKKyAgICAgIHBzdC0+dGV4dGhpZ2ggPSBjb21wX3VuaXRfZGllLmhpZ2hwYyArIGJhc2VhZGRyOworCisgICAgICBwc3QtPm5fZ2xvYmFsX3N5bXMgPSBvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMubmV4dCAtCisJKG9iamZpbGUtPmdsb2JhbF9wc3ltYm9scy5saXN0ICsgcHN0LT5nbG9iYWxzX29mZnNldCk7CisgICAgICBwc3QtPm5fc3RhdGljX3N5bXMgPSBvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMubmV4dCAtCisJKG9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5saXN0ICsgcHN0LT5zdGF0aWNzX29mZnNldCk7CisgICAgICBzb3J0X3BzdF9zeW1ib2xzIChwc3QpOworCisgICAgICAvKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgcHN5bXRhYiBvciBzeW10YWIgZm9yIGEgZmlsZSBvZiB0aGlzCisgICAgICAgICBuYW1lLCByZW1vdmUgaXQuIChJZiB0aGVyZSBpcyBhIHN5bXRhYiwgbW9yZSBkcmFzdGljIHRoaW5ncworICAgICAgICAgYWxzbyBoYXBwZW4uKSBUaGlzIGhhcHBlbnMgaW4gVnhXb3Jrcy4gICovCisgICAgICBmcmVlX25hbWVkX3N5bXRhYnMgKHBzdC0+ZmlsZW5hbWUpOworCisgICAgICBpbmZvX3B0ciA9IGJlZ19vZl9jb21wX3VuaXQgKyBjdV9oZWFkZXIubGVuZ3RoICsgNDsKKyAgICB9CisgIGRvX2NsZWFudXBzIChiYWNrX3RvKTsKK30KKworLyogUmVhZCBpbiBhbGwgaW50ZXJlc3RpbmcgZGllcyB0byB0aGUgZW5kIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LiAgKi8KKworc3RhdGljIGNoYXIgKgorc2Nhbl9wYXJ0aWFsX3N5bWJvbHMgKGluZm9fcHRyLCBvYmpmaWxlLCBsb3dwYywgaGlnaHBjKQorICAgICBjaGFyICppbmZvX3B0cjsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIENPUkVfQUREUiAqbG93cGM7CisgICAgIENPUkVfQUREUiAqaGlnaHBjOworeworICBiZmQgKmFiZmQgPSBvYmpmaWxlLT5vYmZkOworICBzdHJ1Y3QgcGFydGlhbF9kaWVfaW5mbyBwZGk7CisKKyAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgd2UndmUgcmVhZCBpbiB0aGUgY29tcF91bml0X2RpZSBpbgorICAgICBvcmRlciB0byByZWFkIGl0cyBjaGlsZHJlbi4gIFdlIHN0YXJ0IHRoZSBuZXN0aW5nIGxldmVsIGF0IDEgc2luY2UKKyAgICAgd2UgaGF2ZSBwdXNoZWQgMSBsZXZlbCBkb3duIGluIG9yZGVyIHRvIHJlYWQgdGhlIGNvbXAgdW5pdCdzIGNoaWxkcmVuLgorICAgICBUaGUgY29tcCB1bml0IGl0c2VsZiBpcyBhdCBsZXZlbCAwLCBzbyB3ZSBzdG9wIHJlYWRpbmcgd2hlbiB3ZSBwb3AKKyAgICAgYmFjayB0byB0aGF0IGxldmVsLiAqLworCisgIGludCBuZXN0aW5nX2xldmVsID0gMTsKKyAgaW50IGhhc19wY19pbmZvOworICAKKyAgKmxvd3BjICA9ICgoQ09SRV9BRERSKSAtMSk7CisgICpoaWdocGMgPSAoKENPUkVfQUREUikgMCk7CisKKyAgd2hpbGUgKG5lc3RpbmdfbGV2ZWwpCisgICAgeworICAgICAgaW5mb19wdHIgPSByZWFkX3BhcnRpYWxfZGllICgmcGRpLCBhYmZkLCBpbmZvX3B0ciwgJmhhc19wY19pbmZvKTsKKworICAgICAgaWYgKHBkaS5uYW1lKQorCXsKKwkgIHN3aXRjaCAocGRpLnRhZykKKwkgICAgeworCSAgICBjYXNlIERXX1RBR19zdWJwcm9ncmFtOgorCSAgICAgIGlmIChoYXNfcGNfaW5mbykKKwkJeworCQkgIGlmIChwZGkubG93cGMgPCAqbG93cGMpCisJCSAgICB7CisJCSAgICAgICpsb3dwYyA9IHBkaS5sb3dwYzsKKwkJICAgIH0KKwkJICBpZiAocGRpLmhpZ2hwYyA+ICpoaWdocGMpCisJCSAgICB7CisJCSAgICAgICpoaWdocGMgPSBwZGkuaGlnaHBjOworCQkgICAgfQorCQkgIGlmICgocGRpLmlzX2V4dGVybmFsIHx8IG5lc3RpbmdfbGV2ZWwgPT0gMSkKKwkJICAgICAgJiYgIXBkaS5pc19kZWNsYXJhdGlvbikKKwkJICAgIHsKKwkJICAgICAgYWRkX3BhcnRpYWxfc3ltYm9sICgmcGRpLCBvYmpmaWxlKTsKKwkJICAgIH0KKwkJfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIERXX1RBR192YXJpYWJsZToKKwkgICAgY2FzZSBEV19UQUdfdHlwZWRlZjoKKwkgICAgY2FzZSBEV19UQUdfY2xhc3NfdHlwZToKKwkgICAgY2FzZSBEV19UQUdfc3RydWN0dXJlX3R5cGU6CisJICAgIGNhc2UgRFdfVEFHX3VuaW9uX3R5cGU6CisJICAgIGNhc2UgRFdfVEFHX2VudW1lcmF0aW9uX3R5cGU6CisJICAgICAgaWYgKChwZGkuaXNfZXh0ZXJuYWwgfHwgbmVzdGluZ19sZXZlbCA9PSAxKQorCQkgICYmICFwZGkuaXNfZGVjbGFyYXRpb24pCisJCXsKKwkJICBhZGRfcGFydGlhbF9zeW1ib2wgKCZwZGksIG9iamZpbGUpOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRFdfVEFHX2VudW1lcmF0b3I6CisJICAgICAgLyogRmlsZSBzY29wZSBlbnVtZXJhdG9ycyBhcmUgYWRkZWQgdG8gdGhlIHBhcnRpYWwgc3ltYm9sCisJCSB0YWJsZS4gICovCisJICAgICAgaWYgKG5lc3RpbmdfbGV2ZWwgPT0gMikKKwkJYWRkX3BhcnRpYWxfc3ltYm9sICgmcGRpLCBvYmpmaWxlKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBEV19UQUdfYmFzZV90eXBlOgorCSAgICAgIC8qIEZpbGUgc2NvcGUgYmFzZSB0eXBlIGRlZmluaXRpb25zIGFyZSBhZGRlZCB0byB0aGUgcGFydGlhbAorCQkgc3ltYm9sIHRhYmxlLiAgKi8KKwkgICAgICBpZiAobmVzdGluZ19sZXZlbCA9PSAxKQorCQlhZGRfcGFydGlhbF9zeW1ib2wgKCZwZGksIG9iamZpbGUpOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorCisgICAgICAvKiBJZiB0aGUgZGllIGhhcyBhIHNpYmxpbmcsIHNraXAgdG8gdGhlIHNpYmxpbmcuCisJIERvIG5vdCBza2lwIGVudW1lcmF0aW9uIHR5cGVzLCB3ZSB3YW50IHRvIHJlY29yZCB0aGVpcgorCSBlbnVtZXJhdG9ycy4gICovCisgICAgICBpZiAocGRpLnNpYmxpbmcgJiYgcGRpLnRhZyAhPSBEV19UQUdfZW51bWVyYXRpb25fdHlwZSkKKwl7CisJICBpbmZvX3B0ciA9IHBkaS5zaWJsaW5nOworCX0KKyAgICAgIGVsc2UgaWYgKHBkaS5oYXNfY2hpbGRyZW4pCisJeworCSAgLyogRGllIGhhcyBjaGlsZHJlbiwgYnV0IHRoZSBvcHRpb25hbCBEV19BVF9zaWJsaW5nIGF0dHJpYnV0ZQorCSAgICAgaXMgbWlzc2luZy4gICovCisJICBuZXN0aW5nX2xldmVsKys7CisJfQorCisgICAgICBpZiAocGRpLnRhZyA9PSAwKQorCXsKKwkgIG5lc3RpbmdfbGV2ZWwtLTsKKwl9CisgICAgfQorCisgIC8qIElmIHdlIGRpZG4ndCBmaW5kIGEgbG93cGMsIHNldCBpdCB0byBoaWdocGMgdG8gYXZvaWQgY29tcGxhaW50cworICAgICBmcm9tIGBtYWludCBjaGVjaycuICAqLworICBpZiAoKmxvd3BjID09ICgoQ09SRV9BRERSKSAtMSkpCisgICAgKmxvd3BjID0gKmhpZ2hwYzsKKyAgcmV0dXJuIGluZm9fcHRyOworfQorCitzdGF0aWMgdm9pZAorYWRkX3BhcnRpYWxfc3ltYm9sIChwZGksIG9iamZpbGUpCisgICAgIHN0cnVjdCBwYXJ0aWFsX2RpZV9pbmZvICpwZGk7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBDT1JFX0FERFIgYWRkciA9IDA7CisKKyAgc3dpdGNoIChwZGktPnRhZykKKyAgICB7CisgICAgY2FzZSBEV19UQUdfc3VicHJvZ3JhbToKKyAgICAgIGlmIChwZGktPmlzX2V4dGVybmFsKQorCXsKKwkgIC8qcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2wgKHBkaS0+bmFtZSwgcGRpLT5sb3dwYyArIGJhc2VhZGRyLAorCQkJCSAgICAgIG1zdF90ZXh0LCBvYmpmaWxlKTsqLworCSAgYWRkX3BzeW1ib2xfdG9fbGlzdCAocGRpLT5uYW1lLCBzdHJsZW4gKHBkaS0+bmFtZSksCisJCQkgICAgICAgVkFSX05BTUVTUEFDRSwgTE9DX0JMT0NLLAorCQkJICAgICAgICZvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMsCisJCQkgICAgICAgMCwgcGRpLT5sb3dwYyArIGJhc2VhZGRyLCBjdV9sYW5ndWFnZSwgb2JqZmlsZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2wgKHBkaS0+bmFtZSwgcGRpLT5sb3dwYyArIGJhc2VhZGRyLAorCQkJCSAgICAgIG1zdF9maWxlX3RleHQsIG9iamZpbGUpOyovCisJICBhZGRfcHN5bWJvbF90b19saXN0IChwZGktPm5hbWUsIHN0cmxlbiAocGRpLT5uYW1lKSwKKwkJCSAgICAgICBWQVJfTkFNRVNQQUNFLCBMT0NfQkxPQ0ssCisJCQkgICAgICAgJm9iamZpbGUtPnN0YXRpY19wc3ltYm9scywKKwkJCSAgICAgICAwLCBwZGktPmxvd3BjICsgYmFzZWFkZHIsIGN1X2xhbmd1YWdlLCBvYmpmaWxlKTsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX1RBR192YXJpYWJsZToKKyAgICAgIGlmIChwZGktPmlzX2V4dGVybmFsKQorCXsKKwkgIC8qIEdsb2JhbCBWYXJpYWJsZS4KKwkgICAgIERvbid0IGVudGVyIGludG8gdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlcyBhcyB0aGVyZSBpcworCSAgICAgYSBtaW5pbWFsIHN5bWJvbCB0YWJsZSBlbnRyeSBmcm9tIHRoZSBFTEYgc3ltYm9scyBhbHJlYWR5LgorCSAgICAgRW50ZXIgaW50byBwYXJ0aWFsIHN5bWJvbCB0YWJsZSBpZiBpdCBoYXMgYSBsb2NhdGlvbgorCSAgICAgZGVzY3JpcHRvciBvciBhIHR5cGUuCisJICAgICBJZiB0aGUgbG9jYXRpb24gZGVzY3JpcHRvciBpcyBtaXNzaW5nLCBuZXdfc3ltYm9sIHdpbGwgY3JlYXRlCisJICAgICBhIExPQ19VTlJFU09MVkVEIHN5bWJvbCwgdGhlIGFkZHJlc3Mgb2YgdGhlIHZhcmlhYmxlIHdpbGwgdGhlbgorCSAgICAgYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZSB3aGVuZXZlciB0aGUgdmFyaWFibGUKKwkgICAgIGlzIHJlZmVyZW5jZWQuCisJICAgICBUaGUgYWRkcmVzcyBmb3IgdGhlIHBhcnRpYWwgc3ltYm9sIHRhYmxlIGVudHJ5IGlzIG5vdAorCSAgICAgdXNlZCBieSBHREIsIGJ1dCBpdCBjb21lcyBpbiBoYW5keSBmb3IgZGVidWdnaW5nIHBhcnRpYWwgc3ltYm9sCisJICAgICB0YWJsZSBidWlsZGluZy4gICovCisKKwkgIGlmIChwZGktPmxvY2Rlc2MpCisJICAgIGFkZHIgPSBkZWNvZGVfbG9jZGVzYyAocGRpLT5sb2NkZXNjLCBvYmpmaWxlKTsKKwkgIGlmIChwZGktPmxvY2Rlc2MgfHwgcGRpLT5oYXNfdHlwZSkKKwkgICAgYWRkX3BzeW1ib2xfdG9fbGlzdCAocGRpLT5uYW1lLCBzdHJsZW4gKHBkaS0+bmFtZSksCisJCQkJIFZBUl9OQU1FU1BBQ0UsIExPQ19TVEFUSUMsCisJCQkJICZvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMsCisJCQkJIDAsIGFkZHIgKyBiYXNlYWRkciwgY3VfbGFuZ3VhZ2UsIG9iamZpbGUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBTdGF0aWMgVmFyaWFibGUuIFNraXAgc3ltYm9scyB3aXRob3V0IGxvY2F0aW9uIGRlc2NyaXB0b3JzLiAgKi8KKwkgIGlmIChwZGktPmxvY2Rlc2MgPT0gTlVMTCkKKwkgICAgcmV0dXJuOworCSAgYWRkciA9IGRlY29kZV9sb2NkZXNjIChwZGktPmxvY2Rlc2MsIG9iamZpbGUpOworCSAgLypwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbCAocGRpLT5uYW1lLCBhZGRyICsgYmFzZWFkZHIsCisJCQkJICAgICAgbXN0X2ZpbGVfZGF0YSwgb2JqZmlsZSk7Ki8KKwkgIGFkZF9wc3ltYm9sX3RvX2xpc3QgKHBkaS0+bmFtZSwgc3RybGVuIChwZGktPm5hbWUpLAorCQkJICAgICAgIFZBUl9OQU1FU1BBQ0UsIExPQ19TVEFUSUMsCisJCQkgICAgICAgJm9iamZpbGUtPnN0YXRpY19wc3ltYm9scywKKwkJCSAgICAgICAwLCBhZGRyICsgYmFzZWFkZHIsIGN1X2xhbmd1YWdlLCBvYmpmaWxlKTsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX1RBR190eXBlZGVmOgorICAgIGNhc2UgRFdfVEFHX2Jhc2VfdHlwZToKKyAgICAgIGFkZF9wc3ltYm9sX3RvX2xpc3QgKHBkaS0+bmFtZSwgc3RybGVuIChwZGktPm5hbWUpLAorCQkJICAgVkFSX05BTUVTUEFDRSwgTE9DX1RZUEVERUYsCisJCQkgICAmb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLAorCQkJICAgMCwgKENPUkVfQUREUikgMCwgY3VfbGFuZ3VhZ2UsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19UQUdfY2xhc3NfdHlwZToKKyAgICBjYXNlIERXX1RBR19zdHJ1Y3R1cmVfdHlwZToKKyAgICBjYXNlIERXX1RBR191bmlvbl90eXBlOgorICAgIGNhc2UgRFdfVEFHX2VudW1lcmF0aW9uX3R5cGU6CisgICAgICAvKiBTa2lwIGFnZ3JlZ2F0ZSB0eXBlcyB3aXRob3V0IGNoaWxkcmVuLCB0aGVzZSBhcmUgZXh0ZXJuYWwKKwkgcmVmZXJlbmNlcy4gICovCisgICAgICBpZiAocGRpLT5oYXNfY2hpbGRyZW4gPT0gMCkKKwlyZXR1cm47CisgICAgICBhZGRfcHN5bWJvbF90b19saXN0IChwZGktPm5hbWUsIHN0cmxlbiAocGRpLT5uYW1lKSwKKwkJCSAgIFNUUlVDVF9OQU1FU1BBQ0UsIExPQ19UWVBFREVGLAorCQkJICAgJm9iamZpbGUtPnN0YXRpY19wc3ltYm9scywKKwkJCSAgIDAsIChDT1JFX0FERFIpIDAsIGN1X2xhbmd1YWdlLCBvYmpmaWxlKTsKKworICAgICAgaWYgKGN1X2xhbmd1YWdlID09IGxhbmd1YWdlX2NwbHVzKQorCXsKKwkgIC8qIEZvciBDKyssIHRoZXNlIGltcGxpY2l0bHkgYWN0IGFzIHR5cGVkZWZzIGFzIHdlbGwuICovCisJICBhZGRfcHN5bWJvbF90b19saXN0IChwZGktPm5hbWUsIHN0cmxlbiAocGRpLT5uYW1lKSwKKwkJCSAgICAgICBWQVJfTkFNRVNQQUNFLCBMT0NfVFlQRURFRiwKKwkJCSAgICAgICAmb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLAorCQkJICAgICAgIDAsIChDT1JFX0FERFIpIDAsIGN1X2xhbmd1YWdlLCBvYmpmaWxlKTsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX1RBR19lbnVtZXJhdG9yOgorICAgICAgYWRkX3BzeW1ib2xfdG9fbGlzdCAocGRpLT5uYW1lLCBzdHJsZW4gKHBkaS0+bmFtZSksCisJCQkgICBWQVJfTkFNRVNQQUNFLCBMT0NfQ09OU1QsCisJCQkgICAmb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLAorCQkJICAgMCwgKENPUkVfQUREUikgMCwgY3VfbGFuZ3VhZ2UsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogRXhwYW5kIHRoaXMgcGFydGlhbCBzeW1ib2wgdGFibGUgaW50byBhIGZ1bGwgc3ltYm9sIHRhYmxlLiAgKi8KKworc3RhdGljIHZvaWQKK2R3YXJmMl9wc3ltdGFiX3RvX3N5bXRhYiAocHN0KQorICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdDsKK3sKKyAgLyogRklYTUU6IFRoaXMgaXMgYmFyZWx5IG1vcmUgdGhhbiBhIHN0dWIuICAqLworICBpZiAocHN0ICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHBzdC0+cmVhZGluKQorCXsKKwkgIHdhcm5pbmcgKCJidWc6IHBzeW10YWIgZm9yICVzIGlzIGFscmVhZHkgcmVhZCBpbi4iLCBwc3QtPmZpbGVuYW1lKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGluZm9fdmVyYm9zZSkKKwkgICAgeworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlJlYWRpbmcgaW4gc3ltYm9scyBmb3IgJXMuLi4iLCBwc3QtPmZpbGVuYW1lKTsKKwkgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCSAgICB9CisKKwkgIHBzeW10YWJfdG9fc3ltdGFiXzEgKHBzdCk7CisKKwkgIC8qIEZpbmlzaCB1cCB0aGUgZGVidWcgZXJyb3IgbWVzc2FnZS4gICovCisJICBpZiAoaW5mb192ZXJib3NlKQorCSAgICBwcmludGZfZmlsdGVyZWQgKCJkb25lLlxuIik7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK3BzeW10YWJfdG9fc3ltdGFiXzEgKHBzdCkKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7Cit7CisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlID0gcHN0LT5vYmpmaWxlOworICBiZmQgKmFiZmQgPSBvYmpmaWxlLT5vYmZkOworICBzdHJ1Y3QgY29tcF91bml0X2hlYWQgY3VfaGVhZGVyOworICBzdHJ1Y3QgZGllX2luZm8gKmRpZXM7CisgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworICBDT1JFX0FERFIgbG93cGMsIGhpZ2hwYzsKKyAgc3RydWN0IGRpZV9pbmZvICpjaGlsZF9kaWU7CisgIGNoYXIgKmluZm9fcHRyOworICBzdHJ1Y3Qgc3ltdGFiICpzeW10YWI7CisgIHN0cnVjdCBjbGVhbnVwICpiYWNrX3RvOworCisgIC8qIFNldCBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUgcGFydGlhbCBzeW1ib2wgdGFibGUgaW5mby4gICovCisgIG9mZnNldCA9IERXQVJGX0lORk9fT0ZGU0VUKHBzdCk7CisgIGR3YXJmX2luZm9fYnVmZmVyID0gRFdBUkZfSU5GT19CVUZGRVIocHN0KTsKKyAgZHdhcmZfYWJicmV2X2J1ZmZlciA9IERXQVJGX0FCQlJFVl9CVUZGRVIocHN0KTsKKyAgZHdhcmZfYWJicmV2X3NpemUgPSBEV0FSRl9BQkJSRVZfU0laRShwc3QpOworICBkd2FyZl9saW5lX2J1ZmZlciA9IERXQVJGX0xJTkVfQlVGRkVSKHBzdCk7CisgIGJhc2VhZGRyID0gQU5PRkZTRVQgKHBzdC0+c2VjdGlvbl9vZmZzZXRzLCAwKTsKKyAgY3VfaGVhZGVyX29mZnNldCA9IG9mZnNldDsKKyAgaW5mb19wdHIgPSBkd2FyZl9pbmZvX2J1ZmZlciArIG9mZnNldDsKKworICBvYnN0YWNrX2luaXQgKCZkd2FyZjJfdG1wX29ic3RhY2spOworICBiYWNrX3RvID0gbWFrZV9jbGVhbnVwIChkd2FyZjJfZnJlZV90bXBfb2JzdGFjaywgTlVMTCk7CisKKyAgYnVpbGRzeW1faW5pdCAoKTsKKyAgbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIHJlYWxseV9mcmVlX3BlbmRpbmdzLCBOVUxMKTsKKworICAvKiByZWFkIGluIHRoZSBjb21wX3VuaXQgaGVhZGVyICAqLworICBjdV9oZWFkZXIubGVuZ3RoID0gcmVhZF80X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7CisgIGluZm9fcHRyICs9IDQ7CisgIGN1X2hlYWRlci52ZXJzaW9uID0gcmVhZF8yX2J5dGVzIChhYmZkLCBpbmZvX3B0cik7CisgIGluZm9fcHRyICs9IDI7CisgIGN1X2hlYWRlci5hYmJyZXZfb2Zmc2V0ID0gcmVhZF80X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7CisgIGluZm9fcHRyICs9IDQ7CisgIGN1X2hlYWRlci5hZGRyX3NpemUgPSByZWFkXzFfYnl0ZSAoYWJmZCwgaW5mb19wdHIpOworICBpbmZvX3B0ciArPSAxOworCisgIC8qIFJlYWQgdGhlIGFiYnJldnMgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdCAgKi8KKyAgZHdhcmYyX3JlYWRfYWJicmV2cyAoYWJmZCwgY3VfaGVhZGVyLmFiYnJldl9vZmZzZXQpOworICBtYWtlX2NsZWFudXAgKGR3YXJmMl9lbXB0eV9hYmJyZXZfdGFibGUsIE5VTEwpOworCisgIGRpZXMgPSByZWFkX2NvbXBfdW5pdCAoaW5mb19wdHIsIGFiZmQpOworCisgIG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlX2RpZV9saXN0LCBkaWVzKTsKKworICAvKiBEbyBsaW5lIG51bWJlciBkZWNvZGluZyBpbiByZWFkX2ZpbGVfc2NvcGUgKCkgKi8KKyAgcHJvY2Vzc19kaWUgKGRpZXMsIG9iamZpbGUpOworCisgIGlmICghZHdhcmYyX2dldF9wY19ib3VuZHMgKGRpZXMsICZsb3dwYywgJmhpZ2hwYywgb2JqZmlsZSkpCisgICAgeworICAgICAgLyogU29tZSBjb21waWxlcnMgZG9uJ3QgZGVmaW5lIGEgRFdfQVRfaGlnaF9wYyBhdHRyaWJ1dGUgZm9yCisJIHRoZSBjb21waWxhdGlvbiB1bml0LiAgIElmIHRoZSBEV19BVF9oaWdoX3BjIGlzIG1pc3NpbmcsCisJIHN5bnRoZXNpemUgaXQsIGJ5IHNjYW5uaW5nIHRoZSBESUUncyBiZWxvdyB0aGUgY29tcGlsYXRpb24gdW5pdC4gICovCisgICAgICBoaWdocGMgPSAwOworICAgICAgaWYgKGRpZXMtPmhhc19jaGlsZHJlbikKKwl7CisJICBjaGlsZF9kaWUgPSBkaWVzLT5uZXh0OworCSAgd2hpbGUgKGNoaWxkX2RpZSAmJiBjaGlsZF9kaWUtPnRhZykKKwkgICAgeworCSAgICAgIGlmIChjaGlsZF9kaWUtPnRhZyA9PSBEV19UQUdfc3VicHJvZ3JhbSkKKwkJeworCQkgIENPUkVfQUREUiBsb3csIGhpZ2g7CisKKwkJICBpZiAoZHdhcmYyX2dldF9wY19ib3VuZHMgKGNoaWxkX2RpZSwgJmxvdywgJmhpZ2gsIG9iamZpbGUpKQorCQkgICAgeworCQkgICAgICBoaWdocGMgPSBtYXggKGhpZ2hwYywgaGlnaCk7CisJCSAgICB9CisJCX0KKwkgICAgICBjaGlsZF9kaWUgPSBzaWJsaW5nX2RpZSAoY2hpbGRfZGllKTsKKwkgICAgfQorCX0KKyAgICB9CisgIHN5bXRhYiA9IGVuZF9zeW10YWIgKGhpZ2hwYyArIGJhc2VhZGRyLCBvYmpmaWxlLCAwKTsKKworICAvKiBTZXQgc3ltdGFiIGxhbmd1YWdlIHRvIGxhbmd1YWdlIGZyb20gRFdfQVRfbGFuZ3VhZ2UuCisgICAgIElmIHRoZSBjb21waWxhdGlvbiBpcyBmcm9tIGEgQyBmaWxlIGdlbmVyYXRlZCBieSBsYW5ndWFnZSBwcmVwcm9jZXNzb3JzLAorICAgICBkbyBub3Qgc2V0IHRoZSBsYW5ndWFnZSBpZiBpdCB3YXMgYWxyZWFkeSBkZWR1Y2VkIGJ5IHN0YXJ0X3N1YmZpbGUuICAqLworICBpZiAoc3ltdGFiICE9IE5VTEwKKyAgICAgICYmICEoY3VfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfYyAmJiBzeW10YWItPmxhbmd1YWdlICE9IGxhbmd1YWdlX2MpKQorICAgIHsKKyAgICAgIHN5bXRhYi0+bGFuZ3VhZ2UgPSBjdV9sYW5ndWFnZTsKKyAgICB9CisgIHBzdC0+c3ltdGFiID0gc3ltdGFiOworICBwc3QtPnJlYWRpbiA9IDE7CisgIHNvcnRfc3ltdGFiX3N5bXMgKHBzdC0+c3ltdGFiKTsKKworICBkb19jbGVhbnVwcyAoYmFja190byk7Cit9CisKKy8qIFByb2Nlc3MgYSBkaWUgYW5kIGl0cyBjaGlsZHJlbi4gICovCisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX2RpZSAoZGllLCBvYmpmaWxlKQorICAgICBzdHJ1Y3QgZGllX2luZm8gKmRpZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN3aXRjaCAoZGllLT50YWcpCisgICAgeworICAgIGNhc2UgRFdfVEFHX3BhZGRpbmc6CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX1RBR19jb21waWxlX3VuaXQ6CisgICAgICByZWFkX2ZpbGVfc2NvcGUgKGRpZSwgb2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX1RBR19zdWJwcm9ncmFtOgorICAgICAgcmVhZF9zdWJyb3V0aW5lX3R5cGUgKGRpZSwgb2JqZmlsZSk7CisgICAgICByZWFkX2Z1bmNfc2NvcGUgKGRpZSwgb2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX1RBR19pbmxpbmVkX3N1YnJvdXRpbmU6CisgICAgICAvKiBGSVhNRTogIFRoZXNlIGFyZSBpZ25vcmVkIGZvciBub3cuCisJIFRoZXkgY291bGQgYmUgdXNlZCB0byBzZXQgYnJlYWtwb2ludHMgb24gYWxsIGlubGluZWQgaW5zdGFuY2VzCisJIG9mIGEgZnVuY3Rpb24gYW5kIG1ha2UgR0RCIGBuZXh0JyBwcm9wZXJseSBvdmVyIGlubGluZWQgZnVuY3Rpb25zLiAgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfVEFHX2xleGljYWxfYmxvY2s6CisgICAgICByZWFkX2xleGljYWxfYmxvY2tfc2NvcGUgKGRpZSwgb2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX1RBR19jbGFzc190eXBlOgorICAgIGNhc2UgRFdfVEFHX3N0cnVjdHVyZV90eXBlOgorICAgIGNhc2UgRFdfVEFHX3VuaW9uX3R5cGU6CisgICAgICByZWFkX3N0cnVjdHVyZV9zY29wZSAoZGllLCBvYmpmaWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfVEFHX2VudW1lcmF0aW9uX3R5cGU6CisgICAgICByZWFkX2VudW1lcmF0aW9uIChkaWUsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19UQUdfc3Vicm91dGluZV90eXBlOgorICAgICAgcmVhZF9zdWJyb3V0aW5lX3R5cGUgKGRpZSwgb2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX1RBR19hcnJheV90eXBlOgorICAgICAgcmVhZF9hcnJheV90eXBlIChkaWUsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19UQUdfcG9pbnRlcl90eXBlOgorICAgICAgcmVhZF90YWdfcG9pbnRlcl90eXBlIChkaWUsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlOgorICAgICAgcmVhZF90YWdfcHRyX3RvX21lbWJlcl90eXBlIChkaWUsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19UQUdfcmVmZXJlbmNlX3R5cGU6CisgICAgICByZWFkX3RhZ19yZWZlcmVuY2VfdHlwZSAoZGllLCBvYmpmaWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfVEFHX3N0cmluZ190eXBlOgorICAgICAgcmVhZF90YWdfc3RyaW5nX3R5cGUgKGRpZSwgb2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX1RBR19iYXNlX3R5cGU6CisgICAgICByZWFkX2Jhc2VfdHlwZSAoZGllLCBvYmpmaWxlKTsKKyAgICAgIGlmIChkd2FyZl9hdHRyIChkaWUsIERXX0FUX25hbWUpKQorCXsKKwkgIC8qIEFkZCBhIHR5cGVkZWYgc3ltYm9sIGZvciB0aGUgYmFzZSB0eXBlIGRlZmluaXRpb24uICAqLworCSAgbmV3X3N5bWJvbCAoZGllLCBkaWUtPnR5cGUsIG9iamZpbGUpOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfVEFHX2NvbW1vbl9ibG9jazoKKyAgICAgIHJlYWRfY29tbW9uX2Jsb2NrIChkaWUsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19UQUdfY29tbW9uX2luY2x1c2lvbjoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBuZXdfc3ltYm9sIChkaWUsIE5VTEwsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcmVhZF9maWxlX3Njb3BlIChkaWUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBkaWVfaW5mbyAqZGllOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgdW5zaWduZWQgaW50IGxpbmVfb2Zmc2V0ID0gMDsKKyAgQ09SRV9BRERSIGxvd3BjICA9ICgoQ09SRV9BRERSKSAtMSk7CisgIENPUkVfQUREUiBoaWdocGMgPSAoKENPUkVfQUREUikgMCk7CisgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHI7CisgIGNoYXIgKm5hbWUgPSAiPHVua25vd24+IjsKKyAgY2hhciAqY29tcF9kaXIgPSBOVUxMOworICBzdHJ1Y3QgZGllX2luZm8gKmNoaWxkX2RpZTsKKyAgYmZkICphYmZkID0gb2JqZmlsZS0+b2JmZDsKKworICBpZiAoIWR3YXJmMl9nZXRfcGNfYm91bmRzIChkaWUsICZsb3dwYywgJmhpZ2hwYywgb2JqZmlsZSkpCisgICAgeworICAgICAgaWYgKGRpZS0+aGFzX2NoaWxkcmVuKQorCXsKKwkgIGNoaWxkX2RpZSA9IGRpZS0+bmV4dDsKKwkgIHdoaWxlIChjaGlsZF9kaWUgJiYgY2hpbGRfZGllLT50YWcpCisJICAgIHsKKwkgICAgICBpZiAoY2hpbGRfZGllLT50YWcgPT0gRFdfVEFHX3N1YnByb2dyYW0pCisJCXsKKwkJICBDT1JFX0FERFIgbG93LCBoaWdoOworCisJCSAgaWYgKGR3YXJmMl9nZXRfcGNfYm91bmRzIChjaGlsZF9kaWUsICZsb3csICZoaWdoLCBvYmpmaWxlKSkKKwkJICAgIHsKKwkJICAgICAgbG93cGMgPSBtaW4gKGxvd3BjLCBsb3cpOworCQkgICAgICBoaWdocGMgPSBtYXggKGhpZ2hwYywgaGlnaCk7CisJCSAgICB9CisJCX0KKwkgICAgICBjaGlsZF9kaWUgPSBzaWJsaW5nX2RpZSAoY2hpbGRfZGllKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogSWYgd2UgZGlkbid0IGZpbmQgYSBsb3dwYywgc2V0IGl0IHRvIGhpZ2hwYyB0byBhdm9pZCBjb21wbGFpbnRzCisgICAgIGZyb20gZmluaXNoX2Jsb2NrLiAgKi8KKyAgaWYgKGxvd3BjID09ICgoQ09SRV9BRERSKSAtMSkpCisgICAgbG93cGMgPSBoaWdocGM7CisgIGxvd3BjICs9IGJhc2VhZGRyOworICBoaWdocGMgKz0gYmFzZWFkZHI7CisKKyAgYXR0ciA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfbmFtZSk7CisgIGlmIChhdHRyKQorICAgIHsKKyAgICAgIG5hbWUgPSBEV19TVFJJTkcgKGF0dHIpOworICAgIH0KKyAgYXR0ciA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfY29tcF9kaXIpOworICBpZiAoYXR0cikKKyAgICB7CisgICAgICBjb21wX2RpciA9IERXX1NUUklORyAoYXR0cik7CisgICAgICBpZiAoY29tcF9kaXIpCisJeworCSAgLyogSXJpeCA2LjIgbmF0aXZlIGNjIHByZXBlbmRzIDxtYWNoaW5lPi46IHRvIHRoZSBjb21waWxhdGlvbgorCSAgICAgZGlyZWN0b3J5LCBnZXQgcmlkIG9mIGl0LiAgKi8KKwkgIGNoYXIgKmNwID0gc3RyY2hyIChjb21wX2RpciwgJzonKTsKKworCSAgaWYgKGNwICYmIGNwICE9IGNvbXBfZGlyICYmIGNwWy0xXSA9PSAnLicgJiYgY3BbMV0gPT0gJy8nKQorCSAgICBjb21wX2RpciA9IGNwICsgMTsKKwl9CisgICAgfQorCisgIGlmIChvYmpmaWxlLT5laS5lbnRyeV9wb2ludCA+PSBsb3dwYyAmJgorICAgICAgb2JqZmlsZS0+ZWkuZW50cnlfcG9pbnQgPCBoaWdocGMpCisgICAgeworICAgICAgb2JqZmlsZS0+ZWkuZW50cnlfZmlsZV9sb3dwYyA9IGxvd3BjOworICAgICAgb2JqZmlsZS0+ZWkuZW50cnlfZmlsZV9oaWdocGMgPSBoaWdocGM7CisgICAgfQorCisgIGF0dHIgPSBkd2FyZl9hdHRyIChkaWUsIERXX0FUX2xhbmd1YWdlKTsKKyAgaWYgKGF0dHIpCisgICAgeworICAgICAgc2V0X2N1X2xhbmd1YWdlIChEV19VTlNORCAoYXR0cikpOworICAgIH0KKworICAvKiBXZSBhc3N1bWUgdGhhdCB3ZSdyZSBwcm9jZXNzaW5nIEdDQyBvdXRwdXQuICovCisgIHByb2Nlc3NpbmdfZ2NjX2NvbXBpbGF0aW9uID0gMjsKKyNpZiAwCisgICAgLyogRklYTUU6RG8gc29tZXRoaW5nIGhlcmUuICAqLworICAgIGlmIChkaXAtPmF0X3Byb2R1Y2VyICE9IE5VTEwpCisgICAgeworICAgICAgaGFuZGxlX3Byb2R1Y2VyIChkaXAtPmF0X3Byb2R1Y2VyKTsKKyAgICB9CisjZW5kaWYKKworICAvKiBUaGUgY29tcGlsYXRpb24gdW5pdCBtYXkgYmUgaW4gYSBkaWZmZXJlbnQgbGFuZ3VhZ2Ugb3Igb2JqZmlsZSwKKyAgICAgemVybyBvdXQgYWxsIHJlbWVtYmVyZWQgZnVuZGFtZW50YWwgdHlwZXMuICAqLworICBtZW1zZXQgKGZ0eXBlcywgMCwgRlRfTlVNX01FTUJFUlMgKiBzaXplb2YgKHN0cnVjdCB0eXBlICopKTsKKworICBzdGFydF9zeW10YWIgKG5hbWUsIGNvbXBfZGlyLCBsb3dwYyk7CisgIHJlY29yZF9kZWJ1Z2Zvcm1hdCAoIkRXQVJGIDIiKTsKKworICAvKiBEZWNvZGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gaWYgcHJlc2VudC4gICovCisgIGF0dHIgPSBkd2FyZl9hdHRyIChkaWUsIERXX0FUX3N0bXRfbGlzdCk7CisgIGlmIChhdHRyKQorICAgIHsKKyAgICAgIGxpbmVfb2Zmc2V0ID0gRFdfVU5TTkQgKGF0dHIpOworICAgICAgZHdhcmZfZGVjb2RlX2xpbmVzIChsaW5lX29mZnNldCwgY29tcF9kaXIsIGFiZmQpOworICAgIH0KKworICAvKiBQcm9jZXNzIGFsbCBkaWVzIGluIGNvbXBpbGF0aW9uIHVuaXQuICAqLworICBpZiAoZGllLT5oYXNfY2hpbGRyZW4pCisgICAgeworICAgICAgY2hpbGRfZGllID0gZGllLT5uZXh0OworICAgICAgd2hpbGUgKGNoaWxkX2RpZSAmJiBjaGlsZF9kaWUtPnRhZykKKwl7CisJICBwcm9jZXNzX2RpZSAoY2hpbGRfZGllLCBvYmpmaWxlKTsKKwkgIGNoaWxkX2RpZSA9IHNpYmxpbmdfZGllIChjaGlsZF9kaWUpOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCityZWFkX2Z1bmNfc2NvcGUgKGRpZSwgb2JqZmlsZSkKKyAgICAgc3RydWN0IGRpZV9pbmZvICpkaWU7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICByZWdpc3RlciBzdHJ1Y3QgY29udGV4dF9zdGFjayAqbmV3OworICBDT1JFX0FERFIgbG93cGM7CisgIENPUkVfQUREUiBoaWdocGM7CisgIHN0cnVjdCBkaWVfaW5mbyAqY2hpbGRfZGllOworICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyOworICBjaGFyICpuYW1lOworCisgIG5hbWUgPSBkd2FyZjJfbGlua2FnZV9uYW1lIChkaWUpOworCisgIC8qIElnbm9yZSBmdW5jdGlvbnMgd2l0aCBtaXNzaW5nIG9yIGVtcHR5IG5hbWVzIGFuZCBmdW5jdGlvbnMgd2l0aAorICAgICBtaXNzaW5nIG9yIGludmFsaWQgbG93IGFuZCBoaWdoIHBjIGF0dHJpYnV0ZXMuICAqLworICBpZiAobmFtZSA9PSBOVUxMIHx8ICFkd2FyZjJfZ2V0X3BjX2JvdW5kcyAoZGllLCAmbG93cGMsICZoaWdocGMsIG9iamZpbGUpKQorICAgIHJldHVybjsKKworICBsb3dwYyArPSBiYXNlYWRkcjsKKyAgaGlnaHBjICs9IGJhc2VhZGRyOworCisgIGlmIChvYmpmaWxlLT5laS5lbnRyeV9wb2ludCA+PSBsb3dwYyAmJgorICAgICAgb2JqZmlsZS0+ZWkuZW50cnlfcG9pbnQgPCBoaWdocGMpCisgICAgeworICAgICAgb2JqZmlsZS0+ZWkuZW50cnlfZnVuY19sb3dwYyA9IGxvd3BjOworICAgICAgb2JqZmlsZS0+ZWkuZW50cnlfZnVuY19oaWdocGMgPSBoaWdocGM7CisgICAgfQorCisgIGlmIChTVFJFUSAobmFtZSwgIm1haW4iKSkJLyogRklYTUU6IGhhcmR3aXJlZCBuYW1lICovCisgICAgeworICAgICAgb2JqZmlsZS0+ZWkubWFpbl9mdW5jX2xvd3BjID0gbG93cGM7CisgICAgICBvYmpmaWxlLT5laS5tYWluX2Z1bmNfaGlnaHBjID0gaGlnaHBjOworICAgIH0KKworICAvKiBEZWNvZGUgRFdfQVRfZnJhbWVfYmFzZSBsb2NhdGlvbiBkZXNjcmlwdG9yIGlmIHByZXNlbnQsIGtlZXAgcmVzdWx0CisgICAgIGZvciBEV19PUF9mYnJlZyBvcGVyYW5kcyBpbiBkZWNvZGVfbG9jZGVzYy4gICovCisgIGZyYW1lX2Jhc2VfcmVnID0gLTE7CisgIGZyYW1lX2Jhc2Vfb2Zmc2V0ID0gMDsKKyAgYXR0ciA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfZnJhbWVfYmFzZSk7CisgIGlmIChhdHRyKQorICAgIHsKKyAgICAgIENPUkVfQUREUiBhZGRyID0gZGVjb2RlX2xvY2Rlc2MgKERXX0JMT0NLIChhdHRyKSwgb2JqZmlsZSk7CisgICAgICBpZiAoaXNyZWcpCisJZnJhbWVfYmFzZV9yZWcgPSBhZGRyOworICAgICAgZWxzZSBpZiAob2ZmcmVnKQorCXsKKwkgIGZyYW1lX2Jhc2VfcmVnID0gYmFzZXJlZzsKKwkgIGZyYW1lX2Jhc2Vfb2Zmc2V0ID0gYWRkcjsKKwl9CisgICAgICBlbHNlCisJY29tcGxhaW4gKCZkd2FyZjJfdW5zdXBwb3J0ZWRfYXRfZnJhbWVfYmFzZSwgbmFtZSk7CisgICAgfQorCisgIG5ldyA9IHB1c2hfY29udGV4dCAoMCwgbG93cGMpOworICBuZXctPm5hbWUgPSBuZXdfc3ltYm9sIChkaWUsIGRpZS0+dHlwZSwgb2JqZmlsZSk7CisgIGxpc3RfaW5fc2NvcGUgPSAmbG9jYWxfc3ltYm9sczsKKworICBpZiAoZGllLT5oYXNfY2hpbGRyZW4pCisgICAgeworICAgICAgY2hpbGRfZGllID0gZGllLT5uZXh0OworICAgICAgd2hpbGUgKGNoaWxkX2RpZSAmJiBjaGlsZF9kaWUtPnRhZykKKwl7CisJICBwcm9jZXNzX2RpZSAoY2hpbGRfZGllLCBvYmpmaWxlKTsKKwkgIGNoaWxkX2RpZSA9IHNpYmxpbmdfZGllIChjaGlsZF9kaWUpOworCX0KKyAgICB9CisKKyAgbmV3ID0gcG9wX2NvbnRleHQgKCk7CisgIC8qIE1ha2UgYSBibG9jayBmb3IgdGhlIGxvY2FsIHN5bWJvbHMgd2l0aGluLiAgKi8KKyAgZmluaXNoX2Jsb2NrIChuZXctPm5hbWUsICZsb2NhbF9zeW1ib2xzLCBuZXctPm9sZF9ibG9ja3MsCisJCWxvd3BjLCBoaWdocGMsIG9iamZpbGUpOworICBsaXN0X2luX3Njb3BlID0gJmZpbGVfc3ltYm9sczsKK30KKworLyogUHJvY2VzcyBhbGwgdGhlIERJRVMgY29udGFpbmVkIHdpdGhpbiBhIGxleGljYWwgYmxvY2sgc2NvcGUuICBTdGFydAorICAgYSBuZXcgc2NvcGUsIHByb2Nlc3MgdGhlIGRpZXMsIGFuZCB0aGVuIGNsb3NlIHRoZSBzY29wZS4gICovCisKK3N0YXRpYyB2b2lkCityZWFkX2xleGljYWxfYmxvY2tfc2NvcGUgKGRpZSwgb2JqZmlsZSkKKyAgICAgc3RydWN0IGRpZV9pbmZvICpkaWU7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICByZWdpc3RlciBzdHJ1Y3QgY29udGV4dF9zdGFjayAqbmV3OworICBDT1JFX0FERFIgbG93cGMsIGhpZ2hwYzsKKyAgc3RydWN0IGRpZV9pbmZvICpjaGlsZF9kaWU7CisKKyAgLyogSWdub3JlIGJsb2NrcyB3aXRoIG1pc3Npbmcgb3IgaW52YWxpZCBsb3cgYW5kIGhpZ2ggcGMgYXR0cmlidXRlcy4gICovCisgIGlmICghZHdhcmYyX2dldF9wY19ib3VuZHMgKGRpZSwgJmxvd3BjLCAmaGlnaHBjLCBvYmpmaWxlKSkKKyAgICByZXR1cm47CisgIGxvd3BjICs9IGJhc2VhZGRyOworICBoaWdocGMgKz0gYmFzZWFkZHI7CisKKyAgcHVzaF9jb250ZXh0ICgwLCBsb3dwYyk7CisgIGlmIChkaWUtPmhhc19jaGlsZHJlbikKKyAgICB7CisgICAgICBjaGlsZF9kaWUgPSBkaWUtPm5leHQ7CisgICAgICB3aGlsZSAoY2hpbGRfZGllICYmIGNoaWxkX2RpZS0+dGFnKQorCXsKKwkgIHByb2Nlc3NfZGllIChjaGlsZF9kaWUsIG9iamZpbGUpOworCSAgY2hpbGRfZGllID0gc2libGluZ19kaWUgKGNoaWxkX2RpZSk7CisJfQorICAgIH0KKyAgbmV3ID0gcG9wX2NvbnRleHQgKCk7CisKKyAgaWYgKGxvY2FsX3N5bWJvbHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBmaW5pc2hfYmxvY2sgKDAsICZsb2NhbF9zeW1ib2xzLCBuZXctPm9sZF9ibG9ja3MsIG5ldy0+c3RhcnRfYWRkciwKKwkJICAgIGhpZ2hwYywgb2JqZmlsZSk7CisgICAgfQorICBsb2NhbF9zeW1ib2xzID0gbmV3LT5sb2NhbHM7Cit9CisKKy8qIEdldCBsb3cgYW5kIGhpZ2ggcGMgYXR0cmlidXRlcyBmcm9tIGEgZGllLgorICAgUmV0dXJuIDEgaWYgdGhlIGF0dHJpYnV0ZXMgYXJlIHByZXNlbnQgYW5kIHZhbGlkLCBvdGhlcndpc2UsIHJldHVybiAwLiAgKi8KKworc3RhdGljIGludAorZHdhcmYyX2dldF9wY19ib3VuZHMgKGRpZSwgbG93cGMsIGhpZ2hwYywgb2JqZmlsZSkKKyAgICAgc3RydWN0IGRpZV9pbmZvICpkaWU7CisgICAgIENPUkVfQUREUiAqbG93cGM7CisgICAgIENPUkVfQUREUiAqaGlnaHBjOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cjsKKyAgQ09SRV9BRERSIGxvdzsKKyAgQ09SRV9BRERSIGhpZ2g7CisKKyAgYXR0ciA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfbG93X3BjKTsKKyAgaWYgKGF0dHIpCisgICAgbG93ID0gRFdfQUREUiAoYXR0cik7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKKyAgYXR0ciA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfaGlnaF9wYyk7CisgIGlmIChhdHRyKQorICAgIGhpZ2ggPSBEV19BRERSIChhdHRyKTsKKyAgZWxzZQorICAgIHJldHVybiAwOworCisgIGlmIChoaWdoIDwgbG93KQorICAgIHJldHVybiAwOworCisgIC8qIFdoZW4gdXNpbmcgdGhlIEdOVSBsaW5rZXIsIC5nbnUubGlua29uY2UuIHNlY3Rpb25zIGFyZSB1c2VkIHRvCisgICAgIGVsaW1pbmF0ZSBkdXBsaWNhdGUgY29waWVzIG9mIGZ1bmN0aW9ucyBhbmQgdnRhYmxlcyBhbmQgc3VjaC4KKyAgICAgVGhlIGxpbmtlciB3aWxsIGFyYml0cmFyaWx5IGNob29zZSBvbmUgYW5kIGRpc2NhcmQgdGhlIG90aGVycy4KKyAgICAgVGhlIEFUXypfcGMgdmFsdWVzIGZvciBzdWNoIGZ1bmN0aW9ucyByZWZlciB0byBsb2NhbCBsYWJlbHMgaW4KKyAgICAgdGhlc2Ugc2VjdGlvbnMuICBJZiB0aGUgc2VjdGlvbiBmcm9tIHRoYXQgZmlsZSB3YXMgZGlzY2FyZGVkLCB0aGUKKyAgICAgbGFiZWxzIGFyZSBub3QgaW4gdGhlIG91dHB1dCwgc28gdGhlIHJlbG9jcyBnZXQgYSB2YWx1ZSBvZiAwLgorICAgICBJZiB0aGlzIGlzIGEgZGlzY2FyZGVkIGZ1bmN0aW9uLCBtYXJrIHRoZSBwYyBib3VuZHMgYXMgaW52YWxpZCwKKyAgICAgc28gdGhhdCBHREIgd2lsbCBpZ25vcmUgaXQuICAqLworICBpZiAobG93ID09IDAgJiYgKGJmZF9nZXRfZmlsZV9mbGFncyAob2JqZmlsZS0+b2JmZCkgJiBIQVNfUkVMT0MpID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgKmxvd3BjID0gbG93OworICAqaGlnaHBjID0gaGlnaDsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIEFkZCBhbiBhZ2dyZWdhdGUgZmllbGQgdG8gdGhlIGZpZWxkIGxpc3QuICAqLworCitzdGF0aWMgdm9pZAorZHdhcmYyX2FkZF9maWVsZCAoZmlwLCBkaWUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBmaWVsZF9pbmZvICpmaXA7CisgICAgIHN0cnVjdCBkaWVfaW5mbyAqZGllOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IG5leHRmaWVsZCAqbmV3X2ZpZWxkOworICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyOworICBzdHJ1Y3QgZmllbGQgKmZwOworICBjaGFyICpmaWVsZG5hbWUgPSAiIjsKKworICAvKiBBbGxvY2F0ZSBhIG5ldyBmaWVsZCBsaXN0IGVudHJ5IGFuZCBsaW5rIGl0IGluLiAgKi8KKyAgbmV3X2ZpZWxkID0gKHN0cnVjdCBuZXh0ZmllbGQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbmV4dGZpZWxkKSk7CisgIG1ha2VfY2xlYW51cCAoZnJlZSwgbmV3X2ZpZWxkKTsKKyAgbWVtc2V0IChuZXdfZmllbGQsIDAsIHNpemVvZiAoc3RydWN0IG5leHRmaWVsZCkpOworICBuZXdfZmllbGQtPm5leHQgPSBmaXAtPmZpZWxkczsKKyAgZmlwLT5maWVsZHMgPSBuZXdfZmllbGQ7CisgIGZpcC0+bmZpZWxkcysrOworCisgIC8qIEhhbmRsZSBhY2Nlc3NpYmlsaXR5IGFuZCB2aXJ0dWFsaXR5IG9mIGZpZWxkLgorICAgICBUaGUgZGVmYXVsdCBhY2Nlc3NpYmlsaXR5IGZvciBtZW1iZXJzIGlzIHB1YmxpYywgdGhlIGRlZmF1bHQKKyAgICAgYWNjZXNzaWJpbGl0eSBmb3IgaW5oZXJpdGFuY2UgaXMgcHJpdmF0ZS4gICovCisgIGlmIChkaWUtPnRhZyAhPSBEV19UQUdfaW5oZXJpdGFuY2UpCisgICAgbmV3X2ZpZWxkLT5hY2Nlc3NpYmlsaXR5ID0gRFdfQUNDRVNTX3B1YmxpYzsKKyAgZWxzZQorICAgIG5ld19maWVsZC0+YWNjZXNzaWJpbGl0eSA9IERXX0FDQ0VTU19wcml2YXRlOworICBuZXdfZmllbGQtPnZpcnR1YWxpdHkgPSBEV19WSVJUVUFMSVRZX25vbmU7CisKKyAgYXR0ciA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfYWNjZXNzaWJpbGl0eSk7CisgIGlmIChhdHRyKQorICAgIG5ld19maWVsZC0+YWNjZXNzaWJpbGl0eSA9IERXX1VOU05EIChhdHRyKTsKKyAgaWYgKG5ld19maWVsZC0+YWNjZXNzaWJpbGl0eSAhPSBEV19BQ0NFU1NfcHVibGljKQorICAgIGZpcC0+bm9uX3B1YmxpY19maWVsZHMgPSAxOworICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF92aXJ0dWFsaXR5KTsKKyAgaWYgKGF0dHIpCisgICAgbmV3X2ZpZWxkLT52aXJ0dWFsaXR5ID0gRFdfVU5TTkQgKGF0dHIpOworCisgIGZwID0gJm5ld19maWVsZC0+ZmllbGQ7CisgIGlmIChkaWUtPnRhZyA9PSBEV19UQUdfbWVtYmVyKQorICAgIHsKKyAgICAgIC8qIEdldCB0eXBlIG9mIGZpZWxkLiAgKi8KKyAgICAgIGZwLT50eXBlID0gZGllX3R5cGUgKGRpZSwgb2JqZmlsZSk7CisKKyAgICAgIC8qIEdldCBiaXQgc2l6ZSBvZiBmaWVsZCAoemVybyBpZiBub25lKS4gICovCisgICAgICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9iaXRfc2l6ZSk7CisgICAgICBpZiAoYXR0cikKKwl7CisJICBGSUVMRF9CSVRTSVpFICgqZnApID0gRFdfVU5TTkQgKGF0dHIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBGSUVMRF9CSVRTSVpFICgqZnApID0gMDsKKwl9CisKKyAgICAgIC8qIEdldCBiaXQgb2Zmc2V0IG9mIGZpZWxkLiAgKi8KKyAgICAgIGF0dHIgPSBkd2FyZl9hdHRyIChkaWUsIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uKTsKKyAgICAgIGlmIChhdHRyKQorCXsKKwkgIEZJRUxEX0JJVFBPUyAoKmZwKSA9CisJICAgIGRlY29kZV9sb2NkZXNjIChEV19CTE9DSyAoYXR0ciksIG9iamZpbGUpICogYml0c19wZXJfYnl0ZTsKKwl9CisgICAgICBlbHNlCisJRklFTERfQklUUE9TICgqZnApID0gMDsKKyAgICAgIGF0dHIgPSBkd2FyZl9hdHRyIChkaWUsIERXX0FUX2JpdF9vZmZzZXQpOworICAgICAgaWYgKGF0dHIpCisJeworCSAgaWYgKEJJVFNfQklHX0VORElBTikKKwkgICAgeworCSAgICAgIC8qIEZvciBiaWcgZW5kaWFuIGJpdHMsIHRoZSBEV19BVF9iaXRfb2Zmc2V0IGdpdmVzIHRoZQorCQkgYWRkaXRpb25hbCBiaXQgb2Zmc2V0IGZyb20gdGhlIE1TQiBvZiB0aGUgY29udGFpbmluZworCQkgYW5vbnltb3VzIG9iamVjdCB0byB0aGUgTVNCIG9mIHRoZSBmaWVsZC4gIFdlIGRvbid0CisJCSBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgc2luY2Ugd2UgZG9uJ3QgbmVlZCB0bworCQkga25vdyB0aGUgc2l6ZSBvZiB0aGUgYW5vbnltb3VzIG9iamVjdC4gICovCisJICAgICAgRklFTERfQklUUE9TICgqZnApICs9IERXX1VOU05EIChhdHRyKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogRm9yIGxpdHRsZSBlbmRpYW4gYml0cywgY29tcHV0ZSB0aGUgYml0IG9mZnNldCB0byB0aGUKKwkJIE1TQiBvZiB0aGUgYW5vbnltb3VzIG9iamVjdCwgc3VidHJhY3Qgb2ZmIHRoZSBudW1iZXIgb2YKKwkJIGJpdHMgZnJvbSB0aGUgTVNCIG9mIHRoZSBmaWVsZCB0byB0aGUgTVNCIG9mIHRoZQorCQkgb2JqZWN0LCBhbmQgdGhlbiBzdWJ0cmFjdCBvZmYgdGhlIG51bWJlciBvZiBiaXRzIG9mCisJCSB0aGUgZmllbGQgaXRzZWxmLiAgVGhlIHJlc3VsdCBpcyB0aGUgYml0IG9mZnNldCBvZgorCQkgdGhlIExTQiBvZiB0aGUgZmllbGQuICAqLworCSAgICAgIGludCBhbm9ueW1vdXNfc2l6ZTsKKwkgICAgICBpbnQgYml0X29mZnNldCA9IERXX1VOU05EIChhdHRyKTsKKworCSAgICAgIGF0dHIgPSBkd2FyZl9hdHRyIChkaWUsIERXX0FUX2J5dGVfc2l6ZSk7CisJICAgICAgaWYgKGF0dHIpCisJCXsKKwkJICAvKiBUaGUgc2l6ZSBvZiB0aGUgYW5vbnltb3VzIG9iamVjdCBjb250YWluaW5nCisJCSAgICAgdGhlIGJpdCBmaWVsZCBpcyBleHBsaWNpdCwgc28gdXNlIHRoZQorCQkgICAgIGluZGljYXRlZCBzaXplIChpbiBieXRlcykuICAqLworCQkgIGFub255bW91c19zaXplID0gRFdfVU5TTkQgKGF0dHIpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogVGhlIHNpemUgb2YgdGhlIGFub255bW91cyBvYmplY3QgY29udGFpbmluZworCQkgICAgIHRoZSBiaXQgZmllbGQgbXVzdCBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlCisJCSAgICAgYXR0cmlidXRlIG9mIHRoZSBkYXRhIG1lbWJlciBjb250YWluaW5nIHRoZQorCQkgICAgIGJpdCBmaWVsZC4gICovCisJCSAgYW5vbnltb3VzX3NpemUgPSBUWVBFX0xFTkdUSCAoZnAtPnR5cGUpOworCQl9CisJICAgICAgRklFTERfQklUUE9TICgqZnApICs9IGFub255bW91c19zaXplICogYml0c19wZXJfYnl0ZQorCQktIGJpdF9vZmZzZXQgLSBGSUVMRF9CSVRTSVpFICgqZnApOworCSAgICB9CisJfQorCisgICAgICAvKiBHZXQgbmFtZSBvZiBmaWVsZC4gICovCisgICAgICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9uYW1lKTsKKyAgICAgIGlmIChhdHRyICYmIERXX1NUUklORyAoYXR0cikpCisJZmllbGRuYW1lID0gRFdfU1RSSU5HIChhdHRyKTsKKyAgICAgIGZwLT5uYW1lID0gb2JzYXZlc3RyaW5nIChmaWVsZG5hbWUsIHN0cmxlbiAoZmllbGRuYW1lKSwKKwkJCSAgICAgICAmb2JqZmlsZS0+dHlwZV9vYnN0YWNrKTsKKworICAgICAgLyogQ2hhbmdlIGFjY2Vzc2liaWxpdHkgZm9yIGFydGlmaWNpYWwgZmllbGRzIChlLmcuIHZpcnR1YWwgdGFibGUKKwkgcG9pbnRlciBvciB2aXJ0dWFsIGJhc2UgY2xhc3MgcG9pbnRlcikgdG8gcHJpdmF0ZS4gICovCisgICAgICBpZiAoZHdhcmZfYXR0ciAoZGllLCBEV19BVF9hcnRpZmljaWFsKSkKKwl7CisJICBuZXdfZmllbGQtPmFjY2Vzc2liaWxpdHkgPSBEV19BQ0NFU1NfcHJpdmF0ZTsKKwkgIGZpcC0+bm9uX3B1YmxpY19maWVsZHMgPSAxOworCX0KKyAgICB9CisgIGVsc2UgaWYgKGRpZS0+dGFnID09IERXX1RBR192YXJpYWJsZSkKKyAgICB7CisgICAgICBjaGFyICpwaHlzbmFtZTsKKyAgICAgIGNoYXIgKmNwOworCisgICAgICAvKiBDKysgc3RhdGljIG1lbWJlci4KKwkgR2V0IHBoeXNpY2FsIG5hbWUsIGV4dHJhY3QgZmllbGQgbmFtZSBmcm9tIHBoeXNpY2FsIG5hbWUuICAqLworICAgICAgcGh5c25hbWUgPSBkd2FyZjJfbGlua2FnZV9uYW1lIChkaWUpOworICAgICAgaWYgKHBoeXNuYW1lID09IE5VTEwpCisJcmV0dXJuOworCisgICAgICBjcCA9IHBoeXNuYW1lOworICAgICAgd2hpbGUgKCpjcCAmJiAhaXNfY3BsdXNfbWFya2VyICgqY3ApKQorCWNwKys7CisgICAgICBpZiAoKmNwKQorCWZpZWxkbmFtZSA9IGNwICsgMTsKKyAgICAgIGlmICgqZmllbGRuYW1lID09ICdcMCcpCisJeworCSAgY29tcGxhaW4gKCZkd2FyZjJfYmFkX3N0YXRpY19tZW1iZXJfbmFtZSwgcGh5c25hbWUpOworCX0KKworICAgICAgU0VUX0ZJRUxEX1BIWVNOQU1FICgqZnAsIG9ic2F2ZXN0cmluZyAocGh5c25hbWUsIHN0cmxlbiAocGh5c25hbWUpLAorCQkJCQkgICAgJm9iamZpbGUtPnR5cGVfb2JzdGFjaykpOworICAgICAgRklFTERfVFlQRSAoKmZwKSA9IGRpZV90eXBlIChkaWUsIG9iamZpbGUpOworICAgICAgRklFTERfTkFNRSAoKmZwKSA9IG9ic2F2ZXN0cmluZyAoZmllbGRuYW1lLCBzdHJsZW4gKGZpZWxkbmFtZSksCisJCQkgICAgICAgJm9iamZpbGUtPnR5cGVfb2JzdGFjayk7CisgICAgfQorICBlbHNlIGlmIChkaWUtPnRhZyA9PSBEV19UQUdfaW5oZXJpdGFuY2UpCisgICAgeworICAgICAgLyogQysrIGJhc2UgY2xhc3MgZmllbGQuICAqLworICAgICAgYXR0ciA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb24pOworICAgICAgaWYgKGF0dHIpCisJRklFTERfQklUUE9TICgqZnApID0gZGVjb2RlX2xvY2Rlc2MgKERXX0JMT0NLIChhdHRyKSwgb2JqZmlsZSkgKiBiaXRzX3Blcl9ieXRlOworICAgICAgRklFTERfQklUU0laRSAoKmZwKSA9IDA7CisgICAgICBGSUVMRF9UWVBFICgqZnApID0gZGllX3R5cGUgKGRpZSwgb2JqZmlsZSk7CisgICAgICBGSUVMRF9OQU1FICgqZnApID0gdHlwZV9uYW1lX25vX3RhZyAoZnAtPnR5cGUpOworICAgICAgZmlwLT5uYmFzZWNsYXNzZXMrKzsKKyAgICB9Cit9CisKKy8qIENyZWF0ZSB0aGUgdmVjdG9yIG9mIGZpZWxkcywgYW5kIGF0dGFjaCBpdCB0byB0aGUgdHlwZS4gICovCisKK3N0YXRpYyB2b2lkCitkd2FyZjJfYXR0YWNoX2ZpZWxkc190b190eXBlIChmaXAsIHR5cGUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBmaWVsZF9pbmZvICpmaXA7CisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaW50IG5maWVsZHMgPSBmaXAtPm5maWVsZHM7CisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZCBjb3VudCwgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBhcnJheSBvZiBmaWVsZHMsCisgICAgIGFuZCBjcmVhdGUgYmxhbmsgYWNjZXNzaWJpbGl0eSBiaXRmaWVsZHMgaWYgbmVjZXNzYXJ5LiAgKi8KKyAgVFlQRV9ORklFTERTICh0eXBlKSA9IG5maWVsZHM7CisgIFRZUEVfRklFTERTICh0eXBlKSA9IChzdHJ1Y3QgZmllbGQgKikKKyAgICBUWVBFX0FMTE9DICh0eXBlLCBzaXplb2YgKHN0cnVjdCBmaWVsZCkgKiBuZmllbGRzKTsKKyAgbWVtc2V0IChUWVBFX0ZJRUxEUyAodHlwZSksIDAsIHNpemVvZiAoc3RydWN0IGZpZWxkKSAqIG5maWVsZHMpOworCisgIGlmIChmaXAtPm5vbl9wdWJsaWNfZmllbGRzKQorICAgIHsKKyAgICAgIEFMTE9DQVRFX0NQTFVTX1NUUlVDVF9UWVBFICh0eXBlKTsKKworICAgICAgVFlQRV9GSUVMRF9QUklWQVRFX0JJVFMgKHR5cGUpID0KKwkoQl9UWVBFICopIFRZUEVfQUxMT0MgKHR5cGUsIEJfQllURVMgKG5maWVsZHMpKTsKKyAgICAgIEJfQ0xSQUxMIChUWVBFX0ZJRUxEX1BSSVZBVEVfQklUUyAodHlwZSksIG5maWVsZHMpOworCisgICAgICBUWVBFX0ZJRUxEX1BST1RFQ1RFRF9CSVRTICh0eXBlKSA9CisJKEJfVFlQRSAqKSBUWVBFX0FMTE9DICh0eXBlLCBCX0JZVEVTIChuZmllbGRzKSk7CisgICAgICBCX0NMUkFMTCAoVFlQRV9GSUVMRF9QUk9URUNURURfQklUUyAodHlwZSksIG5maWVsZHMpOworCisgICAgICBUWVBFX0ZJRUxEX0lHTk9SRV9CSVRTICh0eXBlKSA9CisJKEJfVFlQRSAqKSBUWVBFX0FMTE9DICh0eXBlLCBCX0JZVEVTIChuZmllbGRzKSk7CisgICAgICBCX0NMUkFMTCAoVFlQRV9GSUVMRF9JR05PUkVfQklUUyAodHlwZSksIG5maWVsZHMpOworICAgIH0KKworICAvKiBJZiB0aGUgdHlwZSBoYXMgYmFzZWNsYXNzZXMsIGFsbG9jYXRlIGFuZCBjbGVhciBhIGJpdCB2ZWN0b3IgZm9yCisgICAgIFRZUEVfRklFTERfVklSVFVBTF9CSVRTLiAgKi8KKyAgaWYgKGZpcC0+bmJhc2VjbGFzc2VzKQorICAgIHsKKyAgICAgIGludCBudW1fYnl0ZXMgPSBCX0JZVEVTIChmaXAtPm5iYXNlY2xhc3Nlcyk7CisgICAgICBjaGFyICpwb2ludGVyOworCisgICAgICBBTExPQ0FURV9DUExVU19TVFJVQ1RfVFlQRSAodHlwZSk7CisgICAgICBwb2ludGVyID0gKGNoYXIgKikgVFlQRV9BTExPQyAodHlwZSwgbnVtX2J5dGVzKTsKKyAgICAgIFRZUEVfRklFTERfVklSVFVBTF9CSVRTICh0eXBlKSA9IChCX1RZUEUgKikgcG9pbnRlcjsKKyAgICAgIEJfQ0xSQUxMIChUWVBFX0ZJRUxEX1ZJUlRVQUxfQklUUyAodHlwZSksIGZpcC0+bmJhc2VjbGFzc2VzKTsKKyAgICAgIFRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSkgPSBmaXAtPm5iYXNlY2xhc3NlczsKKyAgICB9CisKKyAgLyogQ29weSB0aGUgc2F2ZWQtdXAgZmllbGRzIGludG8gdGhlIGZpZWxkIHZlY3Rvci4gIFN0YXJ0IGZyb20gdGhlIGhlYWQKKyAgICAgb2YgdGhlIGxpc3QsIGFkZGluZyB0byB0aGUgdGFpbCBvZiB0aGUgZmllbGQgYXJyYXksIHNvIHRoYXQgdGhleSBlbmQKKyAgICAgdXAgaW4gdGhlIHNhbWUgb3JkZXIgaW4gdGhlIGFycmF5IGluIHdoaWNoIHRoZXkgd2VyZSBhZGRlZCB0byB0aGUgbGlzdC4gICovCisgIHdoaWxlIChuZmllbGRzLS0gPiAwKQorICAgIHsKKyAgICAgIFRZUEVfRklFTEQgKHR5cGUsIG5maWVsZHMpID0gZmlwLT5maWVsZHMtPmZpZWxkOworICAgICAgc3dpdGNoIChmaXAtPmZpZWxkcy0+YWNjZXNzaWJpbGl0eSkKKwl7CisJICBjYXNlIERXX0FDQ0VTU19wcml2YXRlOgorCSAgICBTRVRfVFlQRV9GSUVMRF9QUklWQVRFICh0eXBlLCBuZmllbGRzKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgRFdfQUNDRVNTX3Byb3RlY3RlZDoKKwkgICAgU0VUX1RZUEVfRklFTERfUFJPVEVDVEVEICh0eXBlLCBuZmllbGRzKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgRFdfQUNDRVNTX3B1YmxpYzoKKwkgICAgYnJlYWs7CisKKwkgIGRlZmF1bHQ6CisJICAgIC8qIFVua25vd24gYWNjZXNzaWJpbGl0eS4gIENvbXBsYWluIGFuZCB0cmVhdCBpdCBhcyBwdWJsaWMuICAqLworCSAgICB7CisJICAgICAgY29tcGxhaW4gKCZkd2FyZjJfdW5zdXBwb3J0ZWRfYWNjZXNzaWJpbGl0eSwKKwkJCWZpcC0+ZmllbGRzLT5hY2Nlc3NpYmlsaXR5KTsKKwkgICAgfQorCSAgICBicmVhazsKKwl9CisgICAgICBpZiAobmZpZWxkcyA8IGZpcC0+bmJhc2VjbGFzc2VzKQorCXsKKwkgIHN3aXRjaCAoZmlwLT5maWVsZHMtPnZpcnR1YWxpdHkpCisJICAgIHsKKwkgICAgICBjYXNlIERXX1ZJUlRVQUxJVFlfdmlydHVhbDoKKwkgICAgICBjYXNlIERXX1ZJUlRVQUxJVFlfcHVyZV92aXJ0dWFsOgorCQlTRVRfVFlQRV9GSUVMRF9WSVJUVUFMICh0eXBlLCBuZmllbGRzKTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisgICAgICBmaXAtPmZpZWxkcyA9IGZpcC0+ZmllbGRzLT5uZXh0OworICAgIH0KK30KKworLyogU2tpcCB0byB0aGUgZW5kIG9mIGEgbWVtYmVyIGZ1bmN0aW9uIG5hbWUgaW4gYSBtYW5nbGVkIG5hbWUuICAqLworCitzdGF0aWMgY2hhciAqCitza2lwX21lbWJlcl9mbl9uYW1lIChwaHlzbmFtZSkKKyAgICAgY2hhciAqcGh5c25hbWU7Cit7CisgIGNoYXIgKmVuZG5hbWUgPSBwaHlzbmFtZTsKKworICAvKiBTa2lwIG92ZXIgbGVhZGluZyB1bmRlcnNjb3Jlcy4gICovCisgIHdoaWxlICgqZW5kbmFtZSA9PSAnXycpCisgICAgZW5kbmFtZSsrOworCisgIC8qIEZpbmQgdHdvIHN1Y2Nlc2l2ZSB1bmRlcnNjb3Jlcy4gICovCisgIGRvCisgICAgZW5kbmFtZSA9IHN0cmNociAoZW5kbmFtZSwgJ18nKTsKKyAgd2hpbGUgKGVuZG5hbWUgIT0gTlVMTCAmJiAqKytlbmRuYW1lICE9ICdfJyk7CisKKyAgaWYgKGVuZG5hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBjb21wbGFpbiAoJmR3YXJmMl9iYWRfbWVtYmVyX25hbWVfY29tcGxhaW50LCBwaHlzbmFtZSk7CisgICAgICBlbmRuYW1lID0gcGh5c25hbWU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVGFrZSBjYXJlIG9mIHRyYWlsaW5nIHVuZGVyc2NvcmVzLiAgKi8KKyAgICAgIGlmIChlbmRuYW1lWzFdICE9ICdfJykKKyAgICAgICAgZW5kbmFtZS0tOworICAgIH0KKyAgcmV0dXJuIGVuZG5hbWU7Cit9CisKKy8qIEFkZCBhIG1lbWJlciBmdW5jdGlvbiB0byB0aGUgcHJvcGVyIGZpZWxkbGlzdC4gICovCisKK3N0YXRpYyB2b2lkCitkd2FyZjJfYWRkX21lbWJlcl9mbiAoZmlwLCBkaWUsIHR5cGUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBmaWVsZF9pbmZvICpmaXA7CisgICAgIHN0cnVjdCBkaWVfaW5mbyAqZGllOworICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHI7CisgIHN0cnVjdCBmbmZpZWxkbGlzdCAqZmxwOworICBpbnQgaTsKKyAgc3RydWN0IGZuX2ZpZWxkICpmbnA7CisgIGNoYXIgKmZpZWxkbmFtZTsKKyAgY2hhciAqcGh5c25hbWU7CisgIHN0cnVjdCBuZXh0Zm5maWVsZCAqbmV3X2ZuZmllbGQ7CisKKyAgLyogRXh0cmFjdCBtZW1iZXIgZnVuY3Rpb24gbmFtZSBmcm9tIG1hbmdsZWQgbmFtZS4gICovCisgIHBoeXNuYW1lID0gZHdhcmYyX2xpbmthZ2VfbmFtZSAoZGllKTsKKyAgaWYgKHBoeXNuYW1lID09IE5VTEwpCisgICAgcmV0dXJuOworICBpZiAoKHBoeXNuYW1lWzBdID09ICdfJyAmJiBwaHlzbmFtZVsxXSA9PSAnXycKKyAgICAgICAgJiYgc3RyY2hyICgiMDEyMzQ1Njc4OVF0IiwgcGh5c25hbWVbMl0pKQorICAgICAgfHwgREVTVFJVQ1RPUl9QUkVGSVhfUCAocGh5c25hbWUpKQorICAgIHsKKyAgICAgIC8qIENvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIGZpZWxkIG5hbWVzIGFyZSBzZXQgdG8gdGhlIG5hbWUKKwkgb2YgdGhlIGNsYXNzLCBidXQgd2l0aG91dCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdHMuCisJIFRoZSBuYW1lIG1pZ2h0IGJlIG1pc3NpbmcgZm9yIGFub255bW91cyBhZ2dyZWdhdGVzLiAgKi8KKyAgICAgIGlmIChUWVBFX1RBR19OQU1FICh0eXBlKSkKKwl7CisJICBjaGFyICpwID0gc3RyY2hyIChUWVBFX1RBR19OQU1FICh0eXBlKSwgJzwnKTsKKworCSAgaWYgKHAgPT0gTlVMTCkKKwkgICAgZmllbGRuYW1lID0gVFlQRV9UQUdfTkFNRSAodHlwZSk7CisJICBlbHNlCisJICAgIGZpZWxkbmFtZSA9IG9ic2F2ZXN0cmluZyAoVFlQRV9UQUdfTkFNRSAodHlwZSksCisJCQkJICAgICAgcCAtIFRZUEVfVEFHX05BTUUgKHR5cGUpLAorCQkJCSAgICAgICZvYmpmaWxlLT50eXBlX29ic3RhY2spOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjaGFyICphbm9uX25hbWUgPSAiIjsKKwkgIGZpZWxkbmFtZSA9IG9ic2F2ZXN0cmluZyAoYW5vbl9uYW1lLCBzdHJsZW4gKGFub25fbmFtZSksCisJCQkJICAgICZvYmpmaWxlLT50eXBlX29ic3RhY2spOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyICplbmRuYW1lID0gc2tpcF9tZW1iZXJfZm5fbmFtZSAocGh5c25hbWUpOworCisgICAgICAvKiBJZ25vcmUgbWVtYmVyIGZ1bmN0aW9uIGlmIHdlIHdlcmUgdW5hYmxlIG5vdCBleHRyYWN0IHRoZSBtZW1iZXIKKwkgZnVuY3Rpb24gbmFtZS4gICovCisgICAgICBpZiAoZW5kbmFtZSA9PSBwaHlzbmFtZSkKKwlyZXR1cm47CisgICAgICBmaWVsZG5hbWUgPSBvYnNhdmVzdHJpbmcgKHBoeXNuYW1lLCBlbmRuYW1lIC0gcGh5c25hbWUsCisJCQkJJm9iamZpbGUtPnR5cGVfb2JzdGFjayk7CisgICAgfQorCisgIC8qIExvb2sgdXAgbWVtYmVyIGZ1bmN0aW9uIG5hbWUgaW4gZmllbGRsaXN0LiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IGZpcC0+bmZuZmllbGRzOyBpKyspCisgICAgeworICAgICAgaWYgKFNUUkVRIChmaXAtPmZuZmllbGRsaXN0c1tpXS5uYW1lLCBmaWVsZG5hbWUpKQorCWJyZWFrOworICAgIH0KKworICAvKiBDcmVhdGUgbmV3IGxpc3QgZWxlbWVudCBpZiBuZWNlc3NhcnkuICAqLworICBpZiAoaSA8IGZpcC0+bmZuZmllbGRzKQorICAgIGZscCA9ICZmaXAtPmZuZmllbGRsaXN0c1tpXTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICgoZmlwLT5uZm5maWVsZHMgJSBEV19GSUVMRF9BTExPQ19DSFVOSykgPT0gMCkKKwl7CisJICBmaXAtPmZuZmllbGRsaXN0cyA9IChzdHJ1Y3QgZm5maWVsZGxpc3QgKikKKwkgICAgeHJlYWxsb2MgKGZpcC0+Zm5maWVsZGxpc3RzLAorCQkgICAgICAoZmlwLT5uZm5maWVsZHMgKyBEV19GSUVMRF9BTExPQ19DSFVOSykKKwkJICAgICAgICAqIHNpemVvZiAoc3RydWN0IGZuZmllbGRsaXN0KSk7CisJICBpZiAoZmlwLT5uZm5maWVsZHMgPT0gMCkKKwkgICAgbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfY3VycmVudF9jb250ZW50cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXAtPmZuZmllbGRsaXN0cyk7CisJfQorICAgICAgZmxwID0gJmZpcC0+Zm5maWVsZGxpc3RzW2ZpcC0+bmZuZmllbGRzXTsKKyAgICAgIGZscC0+bmFtZSA9IGZpZWxkbmFtZTsKKyAgICAgIGZscC0+bGVuZ3RoID0gMDsKKyAgICAgIGZscC0+aGVhZCA9IE5VTEw7CisgICAgICBmaXAtPm5mbmZpZWxkcysrOworICAgIH0KKworICAvKiBDcmVhdGUgYSBuZXcgbWVtYmVyIGZ1bmN0aW9uIGZpZWxkIGFuZCBjaGFpbiBpdCB0byB0aGUgZmllbGQgbGlzdAorICAgICBlbnRyeS4gKi8KKyAgbmV3X2ZuZmllbGQgPSAoc3RydWN0IG5leHRmbmZpZWxkICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG5leHRmbmZpZWxkKSk7CisgIG1ha2VfY2xlYW51cCAoZnJlZSwgbmV3X2ZuZmllbGQpOworICBtZW1zZXQgKG5ld19mbmZpZWxkLCAwLCBzaXplb2YgKHN0cnVjdCBuZXh0Zm5maWVsZCkpOworICBuZXdfZm5maWVsZC0+bmV4dCA9IGZscC0+aGVhZDsKKyAgZmxwLT5oZWFkID0gbmV3X2ZuZmllbGQ7CisgIGZscC0+bGVuZ3RoKys7CisKKyAgLyogRmlsbCBpbiB0aGUgbWVtYmVyIGZ1bmN0aW9uIGZpZWxkIGluZm8uICAqLworICBmbnAgPSAmbmV3X2ZuZmllbGQtPmZuZmllbGQ7CisgIGZucC0+cGh5c25hbWUgPSBvYnNhdmVzdHJpbmcgKHBoeXNuYW1lLCBzdHJsZW4gKHBoeXNuYW1lKSwKKwkJCQkmb2JqZmlsZS0+dHlwZV9vYnN0YWNrKTsKKyAgZm5wLT50eXBlID0gYWxsb2NfdHlwZSAob2JqZmlsZSk7CisgIGlmIChkaWUtPnR5cGUgJiYgVFlQRV9DT0RFIChkaWUtPnR5cGUpID09IFRZUEVfQ09ERV9GVU5DKQorICAgIHsKKyAgICAgIHN0cnVjdCB0eXBlICpyZXR1cm5fdHlwZSA9IFRZUEVfVEFSR0VUX1RZUEUgKGRpZS0+dHlwZSk7CisgICAgICBzdHJ1Y3QgdHlwZSAqKmFyZ190eXBlczsKKyAgICAgIGludCBucGFyYW1zID0gVFlQRV9ORklFTERTIChkaWUtPnR5cGUpOworICAgICAgaW50IGlwYXJhbXM7CisKKyAgICAgIC8qIENvcHkgYXJndW1lbnQgdHlwZXMgZnJvbSB0aGUgc3Vicm91dGluZSB0eXBlLiAgKi8KKyAgICAgIGFyZ190eXBlcyA9IChzdHJ1Y3QgdHlwZSAqKikKKwlUWVBFX0FMTE9DIChmbnAtPnR5cGUsIChucGFyYW1zICsgMSkgKiBzaXplb2YgKHN0cnVjdCB0eXBlICopKTsKKyAgICAgIGZvciAoaXBhcmFtcyA9IDA7IGlwYXJhbXMgPCBucGFyYW1zOyBpcGFyYW1zKyspCisJYXJnX3R5cGVzW2lwYXJhbXNdID0gVFlQRV9GSUVMRF9UWVBFIChkaWUtPnR5cGUsIGlwYXJhbXMpOworCisgICAgICAvKiBTZXQgbGFzdCBlbnRyeSBpbiBhcmd1bWVudCB0eXBlIHZlY3Rvci4gICovCisgICAgICBpZiAoVFlQRV9GTEFHUyAoZGllLT50eXBlKSAmIFRZUEVfRkxBR19WQVJBUkdTKQorCWFyZ190eXBlc1tucGFyYW1zXSA9IE5VTEw7CisgICAgICBlbHNlCisJYXJnX3R5cGVzW25wYXJhbXNdID0gZHdhcmYyX2Z1bmRhbWVudGFsX3R5cGUgKG9iamZpbGUsIEZUX1ZPSUQpOworCisgICAgICBzbWFzaF90b19tZXRob2RfdHlwZSAoZm5wLT50eXBlLCB0eXBlLCByZXR1cm5fdHlwZSwgYXJnX3R5cGVzKTsKKworICAgICAgLyogSGFuZGxlIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zLgorCSBEd2FyZjIgaGFzIG5vIGNsZWFuIHdheSB0byBkaXNjZXJuIEMrKyBzdGF0aWMgYW5kIG5vbi1zdGF0aWMKKwkgbWVtYmVyIGZ1bmN0aW9ucy4gRysrIGhlbHBzIEdEQiBieSBtYXJraW5nIHRoZSBmaXJzdAorCSBwYXJhbWV0ZXIgZm9yIG5vbi1zdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyAod2hpY2ggaXMgdGhlCisJIHRoaXMgcG9pbnRlcikgYXMgYXJ0aWZpY2lhbC4gV2Ugb2J0YWluIHRoaXMgaW5mb3JtYXRpb24KKwkgZnJvbSByZWFkX3N1YnJvdXRpbmVfdHlwZSB2aWEgVFlQRV9GSUVMRF9BUlRJRklDSUFMLiAgKi8KKyAgICAgIGlmIChucGFyYW1zID09IDAgfHwgVFlQRV9GSUVMRF9BUlRJRklDSUFMIChkaWUtPnR5cGUsIDApID09IDApCisJZm5wLT52b2Zmc2V0ID0gVk9GRlNFVF9TVEFUSUM7CisgICAgfQorICBlbHNlCisgICAgY29tcGxhaW4gKCZkd2FyZjJfbWlzc2luZ19tZW1iZXJfZm5fdHlwZV9jb21wbGFpbnQsIHBoeXNuYW1lKTsKKworICAvKiBHZXQgZmNvbnRleHQgZnJvbSBEV19BVF9jb250YWluaW5nX3R5cGUgaWYgcHJlc2VudC4gICovCisgIGlmIChkd2FyZl9hdHRyIChkaWUsIERXX0FUX2NvbnRhaW5pbmdfdHlwZSkgIT0gTlVMTCkKKyAgICBmbnAtPmZjb250ZXh0ID0gZGllX2NvbnRhaW5pbmdfdHlwZSAoZGllLCBvYmpmaWxlKTsKKworICAvKiBkd2FyZjIgZG9lc24ndCBoYXZlIHN0dWJiZWQgcGh5c2ljYWwgbmFtZXMsIHNvIHRoZSBzZXR0aW5nIG9mIGlzX2NvbnN0CisgICAgIGFuZCBpc192b2xhdGlsZSBpcyBpcnJlbGV2YW50LCBhcyBpdCBpcyBuZWVkZWQgYnkgZ2RiX21hbmdsZV9uYW1lIG9ubHkuICAqLworCisgIC8qIEdldCBhY2Nlc3NpYmlsaXR5LiAgKi8KKyAgYXR0ciA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfYWNjZXNzaWJpbGl0eSk7CisgIGlmIChhdHRyKQorICAgIHsKKyAgICAgIHN3aXRjaCAoRFdfVU5TTkQgKGF0dHIpKQorCXsKKwkgIGNhc2UgRFdfQUNDRVNTX3ByaXZhdGU6CisJICAgIGZucC0+aXNfcHJpdmF0ZSA9IDE7CisJICAgIGJyZWFrOworCSAgY2FzZSBEV19BQ0NFU1NfcHJvdGVjdGVkOgorCSAgICBmbnAtPmlzX3Byb3RlY3RlZCA9IDE7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgLyogR2V0IGluZGV4IGluIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgaWYgaXQgaXMgYSB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbi4gICovCisgIGF0dHIgPSBkd2FyZl9hdHRyIChkaWUsIERXX0FUX3Z0YWJsZV9lbGVtX2xvY2F0aW9uKTsKKyAgaWYgKGF0dHIpCisgICAgZm5wLT52b2Zmc2V0ID0gZGVjb2RlX2xvY2Rlc2MgKERXX0JMT0NLIChhdHRyKSwgb2JqZmlsZSkgKyAyOworfQorCisvKiBDcmVhdGUgdGhlIHZlY3RvciBvZiBtZW1iZXIgZnVuY3Rpb24gZmllbGRzLCBhbmQgYXR0YWNoIGl0IHRvIHRoZSB0eXBlLiAgKi8KKworc3RhdGljIHZvaWQKK2R3YXJmMl9hdHRhY2hfZm5fZmllbGRzX3RvX3R5cGUgKGZpcCwgdHlwZSwgb2JqZmlsZSkKKyAgICAgc3RydWN0IGZpZWxkX2luZm8gKmZpcDsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBzdHJ1Y3QgZm5maWVsZGxpc3QgKmZscDsKKyAgaW50IHRvdGFsX2xlbmd0aCA9IDA7CisgIGludCBpOworCisgIEFMTE9DQVRFX0NQTFVTX1NUUlVDVF9UWVBFICh0eXBlKTsKKyAgVFlQRV9GTl9GSUVMRExJU1RTICh0eXBlKSA9IChzdHJ1Y3QgZm5fZmllbGRsaXN0ICopCisgICAgVFlQRV9BTExPQyAodHlwZSwgc2l6ZW9mIChzdHJ1Y3QgZm5fZmllbGRsaXN0KSAqIGZpcC0+bmZuZmllbGRzKTsKKworICBmb3IgKGkgPSAwLCBmbHAgPSBmaXAtPmZuZmllbGRsaXN0czsgaSA8IGZpcC0+bmZuZmllbGRzOyBpKyssIGZscCsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBuZXh0Zm5maWVsZCAqbmZwID0gZmxwLT5oZWFkOworICAgICAgc3RydWN0IGZuX2ZpZWxkbGlzdCAqZm5fZmxwID0gJlRZUEVfRk5fRklFTERMSVNUICh0eXBlLCBpKTsKKyAgICAgIGludCBrOworCisgICAgICBUWVBFX0ZOX0ZJRUxETElTVF9OQU1FICh0eXBlLCBpKSA9IGZscC0+bmFtZTsKKyAgICAgIFRZUEVfRk5fRklFTERMSVNUX0xFTkdUSCAodHlwZSwgaSkgPSBmbHAtPmxlbmd0aDsKKyAgICAgIGZuX2ZscC0+Zm5fZmllbGRzID0gKHN0cnVjdCBmbl9maWVsZCAqKQorCVRZUEVfQUxMT0MgKHR5cGUsIHNpemVvZiAoc3RydWN0IGZuX2ZpZWxkKSAqIGZscC0+bGVuZ3RoKTsKKyAgICAgIGZvciAoayA9IGZscC0+bGVuZ3RoOyAoay0tLCBuZnApOyBuZnAgPSBuZnAtPm5leHQpCisgICAgICAgIGZuX2ZscC0+Zm5fZmllbGRzW2tdID0gbmZwLT5mbmZpZWxkOworCisgICAgICB0b3RhbF9sZW5ndGggKz0gZmxwLT5sZW5ndGg7CisgICAgfQorCisgIFRZUEVfTkZOX0ZJRUxEUyAodHlwZSkgPSBmaXAtPm5mbmZpZWxkczsKKyAgVFlQRV9ORk5fRklFTERTX1RPVEFMICh0eXBlKSA9IHRvdGFsX2xlbmd0aDsKK30KKworLyogQ2FsbGVkIHdoZW4gd2UgZmluZCB0aGUgRElFIHRoYXQgc3RhcnRzIGEgc3RydWN0dXJlIG9yIHVuaW9uIHNjb3BlCisgICAoZGVmaW5pdGlvbikgdG8gcHJvY2VzcyBhbGwgZGllcyB0aGF0IGRlZmluZSB0aGUgbWVtYmVycyBvZiB0aGUKKyAgIHN0cnVjdHVyZSBvciB1bmlvbi4KKworICAgTk9URTogd2UgbmVlZCB0byBjYWxsIHN0cnVjdF90eXBlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgdGhlCisgICBESUUgaGFzIGFuIGF0X25hbWUgYXR0cmlidXRlLCBzaW5jZSBpdCBtaWdodCBiZSBhbiBhbm9ueW1vdXMKKyAgIHN0cnVjdHVyZSBvciB1bmlvbi4gIFRoaXMgZ2V0cyB0aGUgdHlwZSBlbnRlcmVkIGludG8gb3VyIHNldCBvZgorICAgdXNlciBkZWZpbmVkIHR5cGVzLgorCisgICBIb3dldmVyLCBpZiB0aGUgc3RydWN0dXJlIGlzIGluY29tcGxldGUgKGFuIG9wYXF1ZSBzdHJ1Y3QvdW5pb24pCisgICB0aGVuIHN1cHByZXNzIGNyZWF0aW5nIGEgc3ltYm9sIHRhYmxlIGVudHJ5IGZvciBpdCBzaW5jZSBnZGIgb25seQorICAgd2FudHMgdG8gZmluZCB0aGUgb25lIHdpdGggdGhlIGNvbXBsZXRlIGRlZmluaXRpb24uICBOb3RlIHRoYXQgaWYKKyAgIGl0IGlzIGNvbXBsZXRlLCB3ZSBqdXN0IGNhbGwgbmV3X3N5bWJvbCwgd2hpY2ggZG9lcyBpdCdzIG93bgorICAgY2hlY2tpbmcgYWJvdXQgd2hldGhlciB0aGUgc3RydWN0L3VuaW9uIGlzIGFub255bW91cyBvciBub3QgKGFuZAorICAgc3VwcHJlc3NlcyBjcmVhdGluZyBhIHN5bWJvbCB0YWJsZSBlbnRyeSBpdHNlbGYpLiAgKi8KKworc3RhdGljIHZvaWQKK3JlYWRfc3RydWN0dXJlX3Njb3BlIChkaWUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBkaWVfaW5mbyAqZGllOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IHR5cGUgKnR5cGU7CisgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHI7CisKKyAgdHlwZSA9IGFsbG9jX3R5cGUgKG9iamZpbGUpOworCisgIElOSVRfQ1BMVVNfU1BFQ0lGSUMgKHR5cGUpOworICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9uYW1lKTsKKyAgaWYgKGF0dHIgJiYgRFdfU1RSSU5HIChhdHRyKSkKKyAgICB7CisgICAgICBUWVBFX1RBR19OQU1FICh0eXBlKSA9IG9ic2F2ZXN0cmluZyAoRFdfU1RSSU5HIChhdHRyKSwKKwkJCQkJICAgc3RybGVuIChEV19TVFJJTkcgKGF0dHIpKSwKKwkJCQkJICAgJm9iamZpbGUtPnR5cGVfb2JzdGFjayk7CisgICAgfQorCisgIGlmIChkaWUtPnRhZyA9PSBEV19UQUdfc3RydWN0dXJlX3R5cGUpCisgICAgeworICAgICAgVFlQRV9DT0RFICh0eXBlKSA9IFRZUEVfQ09ERV9TVFJVQ1Q7CisgICAgfQorICBlbHNlIGlmIChkaWUtPnRhZyA9PSBEV19UQUdfdW5pb25fdHlwZSkKKyAgICB7CisgICAgICBUWVBFX0NPREUgKHR5cGUpID0gVFlQRV9DT0RFX1VOSU9OOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEZJWE1FOiBUWVBFX0NPREVfQ0xBU1MgaXMgY3VycmVudGx5IGRlZmluZWQgdG8gVFlQRV9DT0RFX1NUUlVDVAorCSBpbiBnZGJ0eXBlcy5oLiAgKi8KKyAgICAgIFRZUEVfQ09ERSAodHlwZSkgPSBUWVBFX0NPREVfQ0xBU1M7CisgICAgfQorCisgIGF0dHIgPSBkd2FyZl9hdHRyIChkaWUsIERXX0FUX2J5dGVfc2l6ZSk7CisgIGlmIChhdHRyKQorICAgIHsKKyAgICAgIFRZUEVfTEVOR1RIICh0eXBlKSA9IERXX1VOU05EIChhdHRyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBUWVBFX0xFTkdUSCAodHlwZSkgPSAwOworICAgIH0KKworICAvKiBXZSBuZWVkIHRvIGFkZCB0aGUgdHlwZSBmaWVsZCB0byB0aGUgZGllIGltbWVkaWF0ZWx5IHNvIHdlIGRvbid0CisgICAgIGluZmluaXRlbHkgcmVjdXJzZSB3aGVuIGRlYWxpbmcgd2l0aCBwb2ludGVycyB0byB0aGUgc3RydWN0dXJlCisgICAgIHR5cGUgd2l0aGluIHRoZSBzdHJ1Y3R1cmUgaXRzZWxmLiAqLworICBkaWUtPnR5cGUgPSB0eXBlOworCisgIGlmIChkaWUtPmhhc19jaGlsZHJlbikKKyAgICB7CisgICAgICBzdHJ1Y3QgZmllbGRfaW5mbyBmaTsKKyAgICAgIHN0cnVjdCBkaWVfaW5mbyAqY2hpbGRfZGllOworICAgICAgc3RydWN0IGNsZWFudXAgKmJhY2tfdG8gPSBtYWtlX2NsZWFudXAgKG51bGxfY2xlYW51cCwgTlVMTCk7CisKKyAgICAgIG1lbXNldCAoJmZpLCAwLCBzaXplb2YgKHN0cnVjdCBmaWVsZF9pbmZvKSk7CisKKyAgICAgIGNoaWxkX2RpZSA9IGRpZS0+bmV4dDsKKworICAgICAgd2hpbGUgKGNoaWxkX2RpZSAmJiBjaGlsZF9kaWUtPnRhZykKKwl7CisJICBpZiAoY2hpbGRfZGllLT50YWcgPT0gRFdfVEFHX21lbWJlcikKKwkgICAgeworCSAgICAgIGR3YXJmMl9hZGRfZmllbGQgKCZmaSwgY2hpbGRfZGllLCBvYmpmaWxlKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoY2hpbGRfZGllLT50YWcgPT0gRFdfVEFHX3ZhcmlhYmxlKQorCSAgICB7CisJICAgICAgLyogQysrIHN0YXRpYyBtZW1iZXIuICAqLworCSAgICAgIGR3YXJmMl9hZGRfZmllbGQgKCZmaSwgY2hpbGRfZGllLCBvYmpmaWxlKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoY2hpbGRfZGllLT50YWcgPT0gRFdfVEFHX3N1YnByb2dyYW0pCisJICAgIHsKKwkgICAgICAvKiBDKysgbWVtYmVyIGZ1bmN0aW9uLiAqLworCSAgICAgIHByb2Nlc3NfZGllIChjaGlsZF9kaWUsIG9iamZpbGUpOworCSAgICAgIGR3YXJmMl9hZGRfbWVtYmVyX2ZuICgmZmksIGNoaWxkX2RpZSwgdHlwZSwgb2JqZmlsZSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKGNoaWxkX2RpZS0+dGFnID09IERXX1RBR19pbmhlcml0YW5jZSkKKwkgICAgeworCSAgICAgIC8qIEMrKyBiYXNlIGNsYXNzIGZpZWxkLiAgKi8KKwkgICAgICBkd2FyZjJfYWRkX2ZpZWxkICgmZmksIGNoaWxkX2RpZSwgb2JqZmlsZSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHByb2Nlc3NfZGllIChjaGlsZF9kaWUsIG9iamZpbGUpOworCSAgICB9CisJICBjaGlsZF9kaWUgPSBzaWJsaW5nX2RpZSAoY2hpbGRfZGllKTsKKwl9CisKKyAgICAgIC8qIEF0dGFjaCBmaWVsZHMgYW5kIG1lbWJlciBmdW5jdGlvbnMgdG8gdGhlIHR5cGUuICAqLworICAgICAgaWYgKGZpLm5maWVsZHMpCisJZHdhcmYyX2F0dGFjaF9maWVsZHNfdG9fdHlwZSAoJmZpLCB0eXBlLCBvYmpmaWxlKTsKKyAgICAgIGlmIChmaS5uZm5maWVsZHMpCisJeworCSAgZHdhcmYyX2F0dGFjaF9mbl9maWVsZHNfdG9fdHlwZSAoJmZpLCB0eXBlLCBvYmpmaWxlKTsKKworICAgICAgICAgIC8qIEdldCB0aGUgdHlwZSB3aGljaCByZWZlcnMgdG8gdGhlIGJhc2UgY2xhc3MgKHBvc3NpYmx5IHRoaXMKKwkgICAgIGNsYXNzIGl0c2VsZikgd2hpY2ggY29udGFpbnMgdGhlIHZ0YWJsZSBwb2ludGVyIGZvciB0aGUgY3VycmVudAorCSAgICAgY2xhc3MgZnJvbSB0aGUgRFdfQVRfY29udGFpbmluZ190eXBlIGF0dHJpYnV0ZS4gICovCisKKwkgIGlmIChkd2FyZl9hdHRyIChkaWUsIERXX0FUX2NvbnRhaW5pbmdfdHlwZSkgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIHN0cnVjdCB0eXBlICp0ID0gZGllX2NvbnRhaW5pbmdfdHlwZSAoZGllLCBvYmpmaWxlKTsKKworCSAgICAgIFRZUEVfVlBUUl9CQVNFVFlQRSAodHlwZSkgPSB0OworCSAgICAgIGlmICh0eXBlID09IHQpCisJCXsKKwkJICBzdGF0aWMgY29uc3QgY2hhciB2cHRyX25hbWVbXSA9IHsgJ18nLCd2JywncCcsJ3QnLCdyJywnXDAnIH07CisJCSAgaW50IGk7CisKKwkJICAvKiBPdXIgb3duIGNsYXNzIHByb3ZpZGVzIHZ0YmwgcHRyLiAgKi8KKwkJICBmb3IgKGkgPSBUWVBFX05GSUVMRFMgKHQpIC0gMTsKKwkJICAgICAgIGkgPj0gVFlQRV9OX0JBU0VDTEFTU0VTICh0KTsKKwkJICAgICAgIC0taSkKKwkJICAgIHsKKwkJICAgICAgY2hhciAqZmllbGRuYW1lID0gVFlQRV9GSUVMRF9OQU1FICh0LCBpKTsKKworCQkgICAgICBpZiAoU1RSRVFOIChmaWVsZG5hbWUsIHZwdHJfbmFtZSwgc3RybGVuICh2cHRyX25hbWUpIC0gMSkKKwkJCSAgJiYgaXNfY3BsdXNfbWFya2VyIChmaWVsZG5hbWVbc3RybGVuICh2cHRyX25hbWUpXSkpCisJCQl7CisJCQkgIFRZUEVfVlBUUl9GSUVMRE5PICh0eXBlKSA9IGk7CisJCQkgIGJyZWFrOworCQkJfQorCQkgICAgfQorCisJCSAgLyogQ29tcGxhaW4gaWYgdmlydHVhbCBmdW5jdGlvbiB0YWJsZSBmaWVsZCBub3QgZm91bmQuICAqLworCQkgIGlmIChpIDwgVFlQRV9OX0JBU0VDTEFTU0VTICh0KSkKKwkJICAgIGNvbXBsYWluICgmZHdhcmYyX3Z0Ymxfbm90X2ZvdW5kX2NvbXBsYWludCwKKwkJCSAgICAgIFRZUEVfVEFHX05BTUUgKHR5cGUpID8gVFlQRV9UQUdfTkFNRSAodHlwZSkgOiAiIik7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBUWVBFX1ZQVFJfRklFTEROTyAodHlwZSkgPSBUWVBFX1ZQVFJfRklFTEROTyAodCk7CisJCX0KKwkgICAgfQorCX0KKworICAgICAgbmV3X3N5bWJvbCAoZGllLCB0eXBlLCBvYmpmaWxlKTsKKworICAgICAgZG9fY2xlYW51cHMgKGJhY2tfdG8pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vIGNoaWxkcmVuLCBtdXN0IGJlIHN0dWIuICovCisgICAgICBUWVBFX0ZMQUdTICh0eXBlKSB8PSBUWVBFX0ZMQUdfU1RVQjsKKyAgICB9CisKKyAgZGllLT50eXBlID0gdHlwZTsKK30KKworLyogR2l2ZW4gYSBwb2ludGVyIHRvIGEgZGllIHdoaWNoIGJlZ2lucyBhbiBlbnVtZXJhdGlvbiwgcHJvY2VzcyBhbGwKKyAgIHRoZSBkaWVzIHRoYXQgZGVmaW5lIHRoZSBtZW1iZXJzIG9mIHRoZSBlbnVtZXJhdGlvbi4KKworICAgVGhpcyB3aWxsIGJlIG11Y2ggbmljZXIgaW4gZHJhZnQgNiBvZiB0aGUgRFdBUkYgc3BlYyB3aGVuIG91cgorICAgbWVtYmVycyB3aWxsIGJlIGRpZXMgaW5zdGVhZCBzcXVpc2hlZCBpbnRvIHRoZSBEV19BVF9lbGVtZW50X2xpc3QKKyAgIGF0dHJpYnV0ZS4KKworICAgTk9URTogV2UgcmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnQgbGlzdC4gICovCisKK3N0YXRpYyB2b2lkCityZWFkX2VudW1lcmF0aW9uIChkaWUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBkaWVfaW5mbyAqZGllOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IGRpZV9pbmZvICpjaGlsZF9kaWU7CisgIHN0cnVjdCB0eXBlICp0eXBlOworICBzdHJ1Y3QgZmllbGQgKmZpZWxkczsKKyAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cjsKKyAgc3RydWN0IHN5bWJvbCAqc3ltOworICBpbnQgbnVtX2ZpZWxkczsKKyAgaW50IHVuc2lnbmVkX2VudW0gPSAxOworCisgIHR5cGUgPSBhbGxvY190eXBlIChvYmpmaWxlKTsKKworICBUWVBFX0NPREUgKHR5cGUpID0gVFlQRV9DT0RFX0VOVU07CisgIGF0dHIgPSBkd2FyZl9hdHRyIChkaWUsIERXX0FUX25hbWUpOworICBpZiAoYXR0ciAmJiBEV19TVFJJTkcgKGF0dHIpKQorICAgIHsKKyAgICAgIFRZUEVfVEFHX05BTUUgKHR5cGUpID0gb2JzYXZlc3RyaW5nIChEV19TVFJJTkcgKGF0dHIpLAorCQkJCQkgICBzdHJsZW4gKERXX1NUUklORyAoYXR0cikpLAorCQkJCQkgICAmb2JqZmlsZS0+dHlwZV9vYnN0YWNrKTsKKyAgICB9CisKKyAgYXR0ciA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfYnl0ZV9zaXplKTsKKyAgaWYgKGF0dHIpCisgICAgeworICAgICAgVFlQRV9MRU5HVEggKHR5cGUpID0gRFdfVU5TTkQgKGF0dHIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFRZUEVfTEVOR1RIICh0eXBlKSA9IDA7CisgICAgfQorCisgIG51bV9maWVsZHMgPSAwOworICBmaWVsZHMgPSBOVUxMOworICBpZiAoZGllLT5oYXNfY2hpbGRyZW4pCisgICAgeworICAgICAgY2hpbGRfZGllID0gZGllLT5uZXh0OworICAgICAgd2hpbGUgKGNoaWxkX2RpZSAmJiBjaGlsZF9kaWUtPnRhZykKKwl7CisJICBpZiAoY2hpbGRfZGllLT50YWcgIT0gRFdfVEFHX2VudW1lcmF0b3IpCisJICAgIHsKKwkgICAgICBwcm9jZXNzX2RpZSAoY2hpbGRfZGllLCBvYmpmaWxlKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgYXR0ciA9IGR3YXJmX2F0dHIgKGNoaWxkX2RpZSwgRFdfQVRfbmFtZSk7CisJICAgICAgaWYgKGF0dHIpCisJCXsKKwkJICBzeW0gPSBuZXdfc3ltYm9sIChjaGlsZF9kaWUsIHR5cGUsIG9iamZpbGUpOworCQkgIGlmIChTWU1CT0xfVkFMVUUgKHN5bSkgPCAwKQorCQkgICAgdW5zaWduZWRfZW51bSA9IDA7CisKKwkJICBpZiAoKG51bV9maWVsZHMgJSBEV19GSUVMRF9BTExPQ19DSFVOSykgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgZmllbGRzID0gKHN0cnVjdCBmaWVsZCAqKQorCQkJeHJlYWxsb2MgKGZpZWxkcywKKwkJCQkgIChudW1fZmllbGRzICsgRFdfRklFTERfQUxMT0NfQ0hVTkspCisJCQkJICAgICogc2l6ZW9mIChzdHJ1Y3QgZmllbGQpKTsKKwkJICAgIH0KKworCQkgIEZJRUxEX05BTUUgKGZpZWxkc1tudW1fZmllbGRzXSkgPSBTWU1CT0xfTkFNRSAoc3ltKTsKKwkJICBGSUVMRF9UWVBFIChmaWVsZHNbbnVtX2ZpZWxkc10pID0gTlVMTDsKKwkJICBGSUVMRF9CSVRQT1MgKGZpZWxkc1tudW1fZmllbGRzXSkgPSBTWU1CT0xfVkFMVUUgKHN5bSk7CisJCSAgRklFTERfQklUU0laRSAoZmllbGRzW251bV9maWVsZHNdKSA9IDA7CisKKwkJICBudW1fZmllbGRzKys7CisJCX0KKwkgICAgfQorCisJICBjaGlsZF9kaWUgPSBzaWJsaW5nX2RpZSAoY2hpbGRfZGllKTsKKwl9CisKKyAgICAgIGlmIChudW1fZmllbGRzKQorCXsKKwkgIFRZUEVfTkZJRUxEUyAodHlwZSkgPSBudW1fZmllbGRzOworCSAgVFlQRV9GSUVMRFMgKHR5cGUpID0gKHN0cnVjdCBmaWVsZCAqKQorCSAgICBUWVBFX0FMTE9DICh0eXBlLCBzaXplb2YgKHN0cnVjdCBmaWVsZCkgKiBudW1fZmllbGRzKTsKKwkgIG1lbWNweSAoVFlQRV9GSUVMRFMgKHR5cGUpLCBmaWVsZHMsCisJCSAgc2l6ZW9mIChzdHJ1Y3QgZmllbGQpICogbnVtX2ZpZWxkcyk7CisJICBmcmVlIChmaWVsZHMpOworCX0KKyAgICAgIGlmICh1bnNpZ25lZF9lbnVtKQorCVRZUEVfRkxBR1MgKHR5cGUpIHw9IFRZUEVfRkxBR19VTlNJR05FRDsKKyAgICB9CisgIGRpZS0+dHlwZSA9IHR5cGU7CisgIG5ld19zeW1ib2wgKGRpZSwgdHlwZSwgb2JqZmlsZSk7Cit9CisKKy8qIEV4dHJhY3QgYWxsIGluZm9ybWF0aW9uIGZyb20gYSBEV19UQUdfYXJyYXlfdHlwZSBESUUgYW5kIHB1dCBpdCBpbgorICAgdGhlIERJRSdzIHR5cGUgZmllbGQuICBGb3Igbm93LCB0aGlzIG9ubHkgaGFuZGxlcyBvbmUgZGltZW5zaW9uYWwKKyAgIGFycmF5cy4gICovCisKK3N0YXRpYyB2b2lkCityZWFkX2FycmF5X3R5cGUgKGRpZSwgb2JqZmlsZSkKKyAgICAgc3RydWN0IGRpZV9pbmZvICpkaWU7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBzdHJ1Y3QgZGllX2luZm8gKmNoaWxkX2RpZTsKKyAgc3RydWN0IHR5cGUgKnR5cGUgPSBOVUxMOworICBzdHJ1Y3QgdHlwZSAqZWxlbWVudF90eXBlLCAqcmFuZ2VfdHlwZSwgKmluZGV4X3R5cGU7CisgIHN0cnVjdCB0eXBlICoqcmFuZ2VfdHlwZXMgPSBOVUxMOworICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyOworICBpbnQgbmRpbSA9IDA7CisgIHN0cnVjdCBjbGVhbnVwICpiYWNrX3RvOworCisgIC8qIFJldHVybiBpZiB3ZSd2ZSBhbHJlYWR5IGRlY29kZWQgdGhpcyB0eXBlLiAqLworICBpZiAoZGllLT50eXBlKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZWxlbWVudF90eXBlID0gZGllX3R5cGUgKGRpZSwgb2JqZmlsZSk7CisKKyAgLyogSXJpeCA2LjIgbmF0aXZlIGNjIGNyZWF0ZXMgYXJyYXkgdHlwZXMgd2l0aG91dCBjaGlsZHJlbiBmb3IKKyAgICAgYXJyYXlzIHdpdGggdW5zcGVjaWZpZWQgbGVuZ3RoLiAgKi8KKyAgaWYgKGRpZS0+aGFzX2NoaWxkcmVuID09IDApCisgICAgeworICAgICAgaW5kZXhfdHlwZSA9IGR3YXJmMl9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCBGVF9JTlRFR0VSKTsKKyAgICAgIHJhbmdlX3R5cGUgPSBjcmVhdGVfcmFuZ2VfdHlwZSAoTlVMTCwgaW5kZXhfdHlwZSwgMCwgLTEpOworICAgICAgZGllLT50eXBlID0gY3JlYXRlX2FycmF5X3R5cGUgKE5VTEwsIGVsZW1lbnRfdHlwZSwgcmFuZ2VfdHlwZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGJhY2tfdG8gPSBtYWtlX2NsZWFudXAgKG51bGxfY2xlYW51cCwgTlVMTCk7CisgIGNoaWxkX2RpZSA9IGRpZS0+bmV4dDsKKyAgd2hpbGUgKGNoaWxkX2RpZSAmJiBjaGlsZF9kaWUtPnRhZykKKyAgICB7CisgICAgICBpZiAoY2hpbGRfZGllLT50YWcgPT0gRFdfVEFHX3N1YnJhbmdlX3R5cGUpCisJeworCSAgdW5zaWduZWQgaW50IGxvdywgaGlnaDsKKworCSAgLyogRGVmYXVsdCBib3VuZHMgdG8gYW4gYXJyYXkgd2l0aCB1bnNwZWNpZmllZCBsZW5ndGguICAqLworCSAgbG93ID0gMDsKKwkgIGhpZ2ggPSAtMTsKKwkgIGlmIChjdV9sYW5ndWFnZSA9PSBsYW5ndWFnZV9mb3J0cmFuKQorCSAgICB7CisJICAgICAgLyogRk9SVFJBTiBpbXBsaWVzIGEgbG93ZXIgYm91bmQgb2YgMSwgaWYgbm90IGdpdmVuLiAgKi8KKwkgICAgICBsb3cgPSAxOworCSAgICB9CisKKwkgIGluZGV4X3R5cGUgPSBkaWVfdHlwZSAoY2hpbGRfZGllLCBvYmpmaWxlKTsKKwkgIGF0dHIgPSBkd2FyZl9hdHRyIChjaGlsZF9kaWUsIERXX0FUX2xvd2VyX2JvdW5kKTsKKwkgIGlmIChhdHRyKQorCSAgICB7CisJICAgICAgaWYgKGF0dHItPmZvcm0gPT0gRFdfRk9STV9zZGF0YSkKKwkJeworCQkgIGxvdyA9IERXX1NORCAoYXR0cik7CisJCX0KKwkgICAgICBlbHNlIGlmIChhdHRyLT5mb3JtID09IERXX0ZPUk1fdWRhdGEKKwkgICAgICAgICAgICAgICB8fCBhdHRyLT5mb3JtID09IERXX0ZPUk1fZGF0YTEKKwkgICAgICAgICAgICAgICB8fCBhdHRyLT5mb3JtID09IERXX0ZPUk1fZGF0YTIKKwkgICAgICAgICAgICAgICB8fCBhdHRyLT5mb3JtID09IERXX0ZPUk1fZGF0YTQpCisJCXsKKwkJICBsb3cgPSBEV19VTlNORCAoYXR0cik7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBjb21wbGFpbiAoJmR3YXJmMl9ub25fY29uc3RfYXJyYXlfYm91bmRfaWdub3JlZCwKKwkJCSAgICBkd2FyZl9mb3JtX25hbWUgKGF0dHItPmZvcm0pKTsKKyNpZmRlZiBGT1JUUkFOX0hBQ0sKKwkJICBkaWUtPnR5cGUgPSBsb29rdXBfcG9pbnRlcl90eXBlIChlbGVtZW50X3R5cGUpOworCQkgIHJldHVybjsKKyNlbHNlCisJCSAgbG93ID0gMDsKKyNlbmRpZgorCQl9CisJICAgIH0KKwkgIGF0dHIgPSBkd2FyZl9hdHRyIChjaGlsZF9kaWUsIERXX0FUX3VwcGVyX2JvdW5kKTsKKwkgIGlmIChhdHRyKQorCSAgICB7CisJICAgICAgaWYgKGF0dHItPmZvcm0gPT0gRFdfRk9STV9zZGF0YSkKKwkJeworCQkgIGhpZ2ggPSBEV19TTkQgKGF0dHIpOworCQl9CisJICAgICAgZWxzZSBpZiAoYXR0ci0+Zm9ybSA9PSBEV19GT1JNX3VkYXRhCisJICAgICAgICAgICAgICAgfHwgYXR0ci0+Zm9ybSA9PSBEV19GT1JNX2RhdGExCisJICAgICAgICAgICAgICAgfHwgYXR0ci0+Zm9ybSA9PSBEV19GT1JNX2RhdGEyCisJICAgICAgICAgICAgICAgfHwgYXR0ci0+Zm9ybSA9PSBEV19GT1JNX2RhdGE0KQorCQl7CisJCSAgaGlnaCA9IERXX1VOU05EIChhdHRyKTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKGF0dHItPmZvcm0gPT0gRFdfRk9STV9ibG9jazEpCisJCXsKKwkJICAvKiBHQ0MgZW5jb2RlcyBhcnJheXMgd2l0aCB1bnNwZWNpZmllZCBvciBkeW5hbWljIGxlbmd0aAorCQkgICAgIHdpdGggYSBEV19GT1JNX2Jsb2NrMSBhdHRyaWJ1dGUuCisJCSAgICAgRklYTUU6IEdEQiBkb2VzIG5vdCB5ZXQga25vdyBob3cgdG8gaGFuZGxlIGR5bmFtaWMKKwkJICAgICBhcnJheXMgcHJvcGVybHksIHRyZWF0IHRoZW0gYXMgYXJyYXlzIHdpdGggdW5zcGVjaWZpZWQKKwkJICAgICBsZW5ndGggZm9yIG5vdy4gICovCisJCSAgaGlnaCA9IC0xOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgY29tcGxhaW4gKCZkd2FyZjJfbm9uX2NvbnN0X2FycmF5X2JvdW5kX2lnbm9yZWQsCisJCQkgICAgZHdhcmZfZm9ybV9uYW1lIChhdHRyLT5mb3JtKSk7CisjaWZkZWYgRk9SVFJBTl9IQUNLCisJCSAgZGllLT50eXBlID0gbG9va3VwX3BvaW50ZXJfdHlwZSAoZWxlbWVudF90eXBlKTsKKwkJICByZXR1cm47CisjZWxzZQorCQkgIGhpZ2ggPSAxOworI2VuZGlmCisJCX0KKwkgICAgfQorCisJICAvKiBDcmVhdGUgYSByYW5nZSB0eXBlIGFuZCBzYXZlIGl0IGZvciBhcnJheSB0eXBlIGNyZWF0aW9uLiAgKi8KKwkgIGlmICgobmRpbSAlIERXX0ZJRUxEX0FMTE9DX0NIVU5LKSA9PSAwKQorCSAgICB7CisJICAgICAgcmFuZ2VfdHlwZXMgPSAoc3RydWN0IHR5cGUgKiopCisJCXhyZWFsbG9jIChyYW5nZV90eXBlcywgKG5kaW0gKyBEV19GSUVMRF9BTExPQ19DSFVOSykKKwkJCQkgICAgICAgICAqIHNpemVvZiAoc3RydWN0IHR5cGUgKikpOworCSAgICAgIGlmIChuZGltID09IDApCisJCW1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlX2N1cnJlbnRfY29udGVudHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhbmdlX3R5cGVzKTsKKwkgICAgfQorCSAgcmFuZ2VfdHlwZXNbbmRpbSsrXSA9IGNyZWF0ZV9yYW5nZV90eXBlIChOVUxMLCBpbmRleF90eXBlLCBsb3csIGhpZ2gpOworCX0KKyAgICAgIGNoaWxkX2RpZSA9IHNpYmxpbmdfZGllIChjaGlsZF9kaWUpOworICAgIH0KKworICAvKiBEd2FyZjIgZGltZW5zaW9ucyBhcmUgb3V0cHV0IGZyb20gbGVmdCB0byByaWdodCwgY3JlYXRlIHRoZQorICAgICBuZWNlc3NhcnkgYXJyYXkgdHlwZXMgaW4gYmFja3dhcmRzIG9yZGVyLiAgKi8KKyAgdHlwZSA9IGVsZW1lbnRfdHlwZTsKKyAgd2hpbGUgKG5kaW0tLSA+IDApCisgICAgdHlwZSA9IGNyZWF0ZV9hcnJheV90eXBlIChOVUxMLCB0eXBlLCByYW5nZV90eXBlc1tuZGltXSk7CisKKyAgZG9fY2xlYW51cHMgKGJhY2tfdG8pOworCisgIC8qIEluc3RhbGwgdGhlIHR5cGUgaW4gdGhlIGRpZS4gKi8KKyAgZGllLT50eXBlID0gdHlwZTsKK30KKworLyogRmlyc3QgY3V0OiBpbnN0YWxsIGVhY2ggY29tbW9uIGJsb2NrIG1lbWJlciBhcyBhIGdsb2JhbCB2YXJpYWJsZS4gICovCisKK3N0YXRpYyB2b2lkCityZWFkX2NvbW1vbl9ibG9jayAoZGllLCBvYmpmaWxlKQorICAgICBzdHJ1Y3QgZGllX2luZm8gKmRpZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCBkaWVfaW5mbyAqY2hpbGRfZGllOworICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyOworICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIENPUkVfQUREUiBiYXNlID0gKENPUkVfQUREUikgMDsKKworICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9sb2NhdGlvbik7CisgIGlmIChhdHRyKQorICAgIHsKKyAgICAgIGJhc2UgPSBkZWNvZGVfbG9jZGVzYyAoRFdfQkxPQ0sgKGF0dHIpLCBvYmpmaWxlKTsKKyAgICB9CisgIGlmIChkaWUtPmhhc19jaGlsZHJlbikKKyAgICB7CisgICAgICBjaGlsZF9kaWUgPSBkaWUtPm5leHQ7CisgICAgICB3aGlsZSAoY2hpbGRfZGllICYmIGNoaWxkX2RpZS0+dGFnKQorCXsKKwkgIHN5bSA9IG5ld19zeW1ib2wgKGNoaWxkX2RpZSwgTlVMTCwgb2JqZmlsZSk7CisJICBhdHRyID0gZHdhcmZfYXR0ciAoY2hpbGRfZGllLCBEV19BVF9kYXRhX21lbWJlcl9sb2NhdGlvbik7CisJICBpZiAoYXR0cikKKwkgICAgeworCSAgICAgIFNZTUJPTF9WQUxVRV9BRERSRVNTIChzeW0pID0KKwkJYmFzZSArIGRlY29kZV9sb2NkZXNjIChEV19CTE9DSyAoYXR0ciksIG9iamZpbGUpOworCSAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZ2xvYmFsX3N5bWJvbHMpOworCSAgICB9CisJICBjaGlsZF9kaWUgPSBzaWJsaW5nX2RpZSAoY2hpbGRfZGllKTsKKwl9CisgICAgfQorfQorCisvKiBFeHRyYWN0IGFsbCBpbmZvcm1hdGlvbiBmcm9tIGEgRFdfVEFHX3BvaW50ZXJfdHlwZSBESUUgYW5kIGFkZCB0bworICAgdGhlIHVzZXIgZGVmaW5lZCB0eXBlIHZlY3Rvci4gICovCisKK3N0YXRpYyB2b2lkCityZWFkX3RhZ19wb2ludGVyX3R5cGUgKGRpZSwgb2JqZmlsZSkKKyAgICAgc3RydWN0IGRpZV9pbmZvICpkaWU7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cjsKKworICBpZiAoZGllLT50eXBlKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgdHlwZSA9IGxvb2t1cF9wb2ludGVyX3R5cGUgKGRpZV90eXBlIChkaWUsIG9iamZpbGUpKTsKKyAgYXR0ciA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfYnl0ZV9zaXplKTsKKyAgaWYgKGF0dHIpCisgICAgeworICAgICAgVFlQRV9MRU5HVEggKHR5cGUpID0gRFdfVU5TTkQgKGF0dHIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFRZUEVfTEVOR1RIICh0eXBlKSA9IGFkZHJlc3Nfc2l6ZTsKKyAgICB9CisgIGRpZS0+dHlwZSA9IHR5cGU7Cit9CisKKy8qIEV4dHJhY3QgYWxsIGluZm9ybWF0aW9uIGZyb20gYSBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlIERJRSBhbmQgYWRkIHRvCisgICB0aGUgdXNlciBkZWZpbmVkIHR5cGUgdmVjdG9yLiAgKi8KKworc3RhdGljIHZvaWQKK3JlYWRfdGFnX3B0cl90b19tZW1iZXJfdHlwZSAoZGllLCBvYmpmaWxlKQorICAgICBzdHJ1Y3QgZGllX2luZm8gKmRpZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlOworICBzdHJ1Y3QgdHlwZSAqdG9fdHlwZTsKKyAgc3RydWN0IHR5cGUgKmRvbWFpbjsKKworICBpZiAoZGllLT50eXBlKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgdHlwZSA9IGFsbG9jX3R5cGUgKG9iamZpbGUpOworICB0b190eXBlID0gZGllX3R5cGUgKGRpZSwgb2JqZmlsZSk7CisgIGRvbWFpbiA9IGRpZV9jb250YWluaW5nX3R5cGUgKGRpZSwgb2JqZmlsZSk7CisgIHNtYXNoX3RvX21lbWJlcl90eXBlICh0eXBlLCBkb21haW4sIHRvX3R5cGUpOworCisgIGRpZS0+dHlwZSA9IHR5cGU7Cit9CisKKy8qIEV4dHJhY3QgYWxsIGluZm9ybWF0aW9uIGZyb20gYSBEV19UQUdfcmVmZXJlbmNlX3R5cGUgRElFIGFuZCBhZGQgdG8KKyAgIHRoZSB1c2VyIGRlZmluZWQgdHlwZSB2ZWN0b3IuICAqLworCitzdGF0aWMgdm9pZAorcmVhZF90YWdfcmVmZXJlbmNlX3R5cGUgKGRpZSwgb2JqZmlsZSkKKyAgICAgc3RydWN0IGRpZV9pbmZvICpkaWU7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cjsKKworICBpZiAoZGllLT50eXBlKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgdHlwZSA9IGxvb2t1cF9yZWZlcmVuY2VfdHlwZSAoZGllX3R5cGUgKGRpZSwgb2JqZmlsZSkpOworICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9ieXRlX3NpemUpOworICBpZiAoYXR0cikKKyAgICB7CisgICAgICBUWVBFX0xFTkdUSCAodHlwZSkgPSBEV19VTlNORCAoYXR0cik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgVFlQRV9MRU5HVEggKHR5cGUpID0gYWRkcmVzc19zaXplOworICAgIH0KKyAgZGllLT50eXBlID0gdHlwZTsKK30KKworc3RhdGljIHZvaWQKK3JlYWRfdGFnX2NvbnN0X3R5cGUgKGRpZSwgb2JqZmlsZSkKKyAgICAgc3RydWN0IGRpZV9pbmZvICpkaWU7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBpZiAoZGllLT50eXBlKQorICAgIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgY29tcGxhaW4gKCZkd2FyZjJfY29uc3RfaWdub3JlZCk7CisgIGRpZS0+dHlwZSA9IGRpZV90eXBlIChkaWUsIG9iamZpbGUpOworfQorCitzdGF0aWMgdm9pZAorcmVhZF90YWdfdm9sYXRpbGVfdHlwZSAoZGllLCBvYmpmaWxlKQorICAgICBzdHJ1Y3QgZGllX2luZm8gKmRpZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIGlmIChkaWUtPnR5cGUpCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKworICBjb21wbGFpbiAoJmR3YXJmMl92b2xhdGlsZV9pZ25vcmVkKTsKKyAgZGllLT50eXBlID0gZGllX3R5cGUgKGRpZSwgb2JqZmlsZSk7Cit9CisKKy8qIEV4dHJhY3QgYWxsIGluZm9ybWF0aW9uIGZyb20gYSBEV19UQUdfc3RyaW5nX3R5cGUgRElFIGFuZCBhZGQgdG8KKyAgIHRoZSB1c2VyIGRlZmluZWQgdHlwZSB2ZWN0b3IuICBJdCBpc24ndCByZWFsbHkgYSB1c2VyIGRlZmluZWQgdHlwZSwKKyAgIGJ1dCBpdCBiZWhhdmVzIGxpa2Ugb25lLCB3aXRoIG90aGVyIERJRSdzIHVzaW5nIGFuIEFUX3VzZXJfZGVmX3R5cGUKKyAgIGF0dHJpYnV0ZSB0byByZWZlcmVuY2UgaXQuICAqLworCitzdGF0aWMgdm9pZAorcmVhZF90YWdfc3RyaW5nX3R5cGUgKGRpZSwgb2JqZmlsZSkKKyAgICAgc3RydWN0IGRpZV9pbmZvICpkaWU7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBzdHJ1Y3QgdHlwZSAqdHlwZSwgKnJhbmdlX3R5cGUsICppbmRleF90eXBlLCAqY2hhcl90eXBlOworICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyOworICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworCisgIGlmIChkaWUtPnR5cGUpCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKworICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9zdHJpbmdfbGVuZ3RoKTsKKyAgaWYgKGF0dHIpCisgICAgeworICAgICAgbGVuZ3RoID0gRFdfVU5TTkQgKGF0dHIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxlbmd0aCA9IDE7CisgICAgfQorICBpbmRleF90eXBlID0gZHdhcmYyX2Z1bmRhbWVudGFsX3R5cGUgKG9iamZpbGUsIEZUX0lOVEVHRVIpOworICByYW5nZV90eXBlID0gY3JlYXRlX3JhbmdlX3R5cGUgKE5VTEwsIGluZGV4X3R5cGUsIDEsIGxlbmd0aCk7CisgIGNoYXJfdHlwZSA9IGR3YXJmMl9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCBGVF9DSEFSKTsKKyAgdHlwZSA9IGNyZWF0ZV9zdHJpbmdfdHlwZSAoY2hhcl90eXBlLCByYW5nZV90eXBlKTsKKyAgZGllLT50eXBlID0gdHlwZTsKK30KKworLyogSGFuZGxlIERJRVMgZHVlIHRvIEMgY29kZSBsaWtlOgorCisgICBzdHJ1Y3QgZm9vCisgICAgIHsKKyAgICAgICBpbnQgKCpmdW5jcCkoaW50IGEsIGxvbmcgbCk7CisgICAgICAgaW50IGI7CisgICAgIH07CisKKyAgICgnZnVuY3AnIGdlbmVyYXRlcyBhIERXX1RBR19zdWJyb3V0aW5lX3R5cGUgRElFKQorKi8KKworc3RhdGljIHZvaWQKK3JlYWRfc3Vicm91dGluZV90eXBlIChkaWUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBkaWVfaW5mbyAqZGllOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IHR5cGUgKnR5cGU7CQkvKiBUeXBlIHRoYXQgdGhpcyBmdW5jdGlvbiByZXR1cm5zICovCisgIHN0cnVjdCB0eXBlICpmdHlwZTsJCS8qIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhYm92ZSB0eXBlICovCisgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHI7CisKKyAgLyogRGVjb2RlIHRoZSB0eXBlIHRoYXQgdGhpcyBzdWJyb3V0aW5lIHJldHVybnMgKi8KKyAgaWYgKGRpZS0+dHlwZSkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorICB0eXBlID0gZGllX3R5cGUgKGRpZSwgb2JqZmlsZSk7CisgIGZ0eXBlID0gbG9va3VwX2Z1bmN0aW9uX3R5cGUgKHR5cGUpOworCisgIC8qIEFsbCBmdW5jdGlvbnMgaW4gQysrIGhhdmUgcHJvdG90eXBlcy4gICovCisgIGF0dHIgPSBkd2FyZl9hdHRyIChkaWUsIERXX0FUX3Byb3RvdHlwZWQpOworICBpZiAoKGF0dHIgJiYgKERXX1VOU05EIChhdHRyKSAhPSAwKSkKKyAgICAgIHx8IGN1X2xhbmd1YWdlID09IGxhbmd1YWdlX2NwbHVzKQorICAgIFRZUEVfRkxBR1MgKGZ0eXBlKSB8PSBUWVBFX0ZMQUdfUFJPVE9UWVBFRDsKKworICBpZiAoZGllLT5oYXNfY2hpbGRyZW4pCisgICAgeworICAgICAgc3RydWN0IGRpZV9pbmZvICpjaGlsZF9kaWU7CisgICAgICBpbnQgbnBhcmFtcyA9IDA7CisgICAgICBpbnQgaXBhcmFtcyA9IDA7CisKKyAgICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycy4KKyAgICAgICAgIEZJWE1FOiBHREIgY3VycmVudGx5IGlnbm9yZXMgdmFyYXJnIGZ1bmN0aW9ucywgYnV0IGtub3dzIGFib3V0CisgICAgICAgICB2YXJhcmcgbWVtYmVyIGZ1bmN0aW9ucy4gICovCisgICAgICBjaGlsZF9kaWUgPSBkaWUtPm5leHQ7CisgICAgICB3aGlsZSAoY2hpbGRfZGllICYmIGNoaWxkX2RpZS0+dGFnKQorCXsKKwkgIGlmIChjaGlsZF9kaWUtPnRhZyA9PSBEV19UQUdfZm9ybWFsX3BhcmFtZXRlcikKKwkgICAgbnBhcmFtcysrOworCSAgZWxzZSBpZiAoY2hpbGRfZGllLT50YWcgPT0gRFdfVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnMpCisJICAgIFRZUEVfRkxBR1MgKGZ0eXBlKSB8PSBUWVBFX0ZMQUdfVkFSQVJHUzsKKwkgIGNoaWxkX2RpZSA9IHNpYmxpbmdfZGllIChjaGlsZF9kaWUpOworCX0KKworICAgICAgLyogQWxsb2NhdGUgc3RvcmFnZSBmb3IgcGFyYW1ldGVycyBhbmQgZmlsbCB0aGVtIGluLiAgKi8KKyAgICAgIFRZUEVfTkZJRUxEUyAoZnR5cGUpID0gbnBhcmFtczsKKyAgICAgIFRZUEVfRklFTERTIChmdHlwZSkgPSAoc3RydWN0IGZpZWxkICopCisJVFlQRV9BTExPQyAoZnR5cGUsIG5wYXJhbXMgKiBzaXplb2YgKHN0cnVjdCBmaWVsZCkpOworCisgICAgICBjaGlsZF9kaWUgPSBkaWUtPm5leHQ7CisgICAgICB3aGlsZSAoY2hpbGRfZGllICYmIGNoaWxkX2RpZS0+dGFnKQorCXsKKwkgIGlmIChjaGlsZF9kaWUtPnRhZyA9PSBEV19UQUdfZm9ybWFsX3BhcmFtZXRlcikKKwkgICAgeworCSAgICAgIC8qIER3YXJmMiBoYXMgbm8gY2xlYW4gd2F5IHRvIGRpc2Nlcm4gQysrIHN0YXRpYyBhbmQgbm9uLXN0YXRpYworCQkgbWVtYmVyIGZ1bmN0aW9ucy4gRysrIGhlbHBzIEdEQiBieSBtYXJraW5nIHRoZSBmaXJzdAorCQkgcGFyYW1ldGVyIGZvciBub24tc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgKHdoaWNoIGlzIHRoZQorCQkgdGhpcyBwb2ludGVyKSBhcyBhcnRpZmljaWFsLiBXZSBwYXNzIHRoaXMgaW5mb3JtYXRpb24KKwkJIHRvIGR3YXJmMl9hZGRfbWVtYmVyX2ZuIHZpYSBUWVBFX0ZJRUxEX0FSVElGSUNJQUwuICAqLworCSAgICAgIGF0dHIgPSBkd2FyZl9hdHRyIChjaGlsZF9kaWUsIERXX0FUX2FydGlmaWNpYWwpOworCSAgICAgIGlmIChhdHRyKQorCQlUWVBFX0ZJRUxEX0FSVElGSUNJQUwgKGZ0eXBlLCBpcGFyYW1zKSA9IERXX1VOU05EIChhdHRyKTsKKwkgICAgICBlbHNlCisJCVRZUEVfRklFTERfQVJUSUZJQ0lBTCAoZnR5cGUsIGlwYXJhbXMpID0gMDsKKwkgICAgICBUWVBFX0ZJRUxEX1RZUEUgKGZ0eXBlLCBpcGFyYW1zKSA9IGRpZV90eXBlIChjaGlsZF9kaWUsIG9iamZpbGUpOworCSAgICAgIGlwYXJhbXMrKzsKKwkgICAgfQorCSAgY2hpbGRfZGllID0gc2libGluZ19kaWUgKGNoaWxkX2RpZSk7CisJfQorICAgIH0KKworICBkaWUtPnR5cGUgPSBmdHlwZTsKK30KKworc3RhdGljIHZvaWQKK3JlYWRfdHlwZWRlZiAoZGllLCBvYmpmaWxlKQorICAgICBzdHJ1Y3QgZGllX2luZm8gKmRpZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlOworCisgIGlmICghZGllLT50eXBlKQorICAgIHsKKyAgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHI7CisgICAgICBzdHJ1Y3QgdHlwZSAqeHR5cGU7CisKKyAgICAgIHh0eXBlID0gZGllX3R5cGUgKGRpZSwgb2JqZmlsZSk7CisKKyAgICAgIHR5cGUgPSBhbGxvY190eXBlIChvYmpmaWxlKTsKKyAgICAgIFRZUEVfQ09ERSAodHlwZSkgPSBUWVBFX0NPREVfVFlQRURFRjsKKyAgICAgIFRZUEVfRkxBR1MgKHR5cGUpIHw9IFRZUEVfRkxBR19UQVJHRVRfU1RVQjsKKyAgICAgIFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpID0geHR5cGU7CisgICAgICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9uYW1lKTsKKyAgICAgIGlmIChhdHRyICYmIERXX1NUUklORyAoYXR0cikpCisJVFlQRV9OQU1FICh0eXBlKSA9IG9ic2F2ZXN0cmluZyAoRFdfU1RSSU5HIChhdHRyKSwKKwkJCQkJIHN0cmxlbiAoRFdfU1RSSU5HIChhdHRyKSksCisJCQkJCSAmb2JqZmlsZS0+dHlwZV9vYnN0YWNrKTsKKworICAgICAgZGllLT50eXBlID0gdHlwZTsKKyAgICB9Cit9CisKKy8qIEZpbmQgYSByZXByZXNlbnRhdGlvbiBvZiBhIGdpdmVuIGJhc2UgdHlwZSBhbmQgaW5zdGFsbAorICAgaXQgaW4gdGhlIFRZUEUgZmllbGQgb2YgdGhlIGRpZS4gICovCisKK3N0YXRpYyB2b2lkCityZWFkX2Jhc2VfdHlwZSAoZGllLCBvYmpmaWxlKQorICAgICBzdHJ1Y3QgZGllX2luZm8gKmRpZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlOworICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyOworICBpbnQgZW5jb2RpbmcgPSAwLCBzaXplID0gMDsKKworICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IGRlY29kZWQgdGhpcyBkaWUsIHRoaXMgaXMgYSBuby1vcC4gKi8KKyAgaWYgKGRpZS0+dHlwZSkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGF0dHIgPSBkd2FyZl9hdHRyIChkaWUsIERXX0FUX2VuY29kaW5nKTsKKyAgaWYgKGF0dHIpCisgICAgeworICAgICAgZW5jb2RpbmcgPSBEV19VTlNORCAoYXR0cik7CisgICAgfQorICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9ieXRlX3NpemUpOworICBpZiAoYXR0cikKKyAgICB7CisgICAgICBzaXplID0gRFdfVU5TTkQgKGF0dHIpOworICAgIH0KKyAgYXR0ciA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfbmFtZSk7CisgIGlmIChhdHRyICYmIERXX1NUUklORyAoYXR0cikpCisgICAgeworICAgICAgZW51bSB0eXBlX2NvZGUgY29kZSA9IFRZUEVfQ09ERV9JTlQ7CisgICAgICBpbnQgaXNfdW5zaWduZWQgPSAwOworCisgICAgICBzd2l0Y2ggKGVuY29kaW5nKQorCXsKKwljYXNlIERXX0FURV9hZGRyZXNzOgorCSAgLyogVHVybiBEV19BVEVfYWRkcmVzcyBpbnRvIGEgdm9pZCAqIHBvaW50ZXIuICAqLworCSAgY29kZSA9IFRZUEVfQ09ERV9QVFI7CisJICBpc191bnNpZ25lZCA9IDE7CisJICBicmVhazsKKwljYXNlIERXX0FURV9ib29sZWFuOgorCSAgY29kZSA9IFRZUEVfQ09ERV9CT09MOworCSAgaXNfdW5zaWduZWQgPSAxOworCSAgYnJlYWs7CisJY2FzZSBEV19BVEVfY29tcGxleF9mbG9hdDoKKwkgIGNvZGUgPSBUWVBFX0NPREVfQ09NUExFWDsKKwkgIGJyZWFrOworCWNhc2UgRFdfQVRFX2Zsb2F0OgorCSAgY29kZSA9IFRZUEVfQ09ERV9GTFQ7CisJICBicmVhazsKKwljYXNlIERXX0FURV9zaWduZWQ6CisJY2FzZSBEV19BVEVfc2lnbmVkX2NoYXI6CisJICBicmVhazsKKwljYXNlIERXX0FURV91bnNpZ25lZDoKKwljYXNlIERXX0FURV91bnNpZ25lZF9jaGFyOgorCSAgaXNfdW5zaWduZWQgPSAxOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGNvbXBsYWluICgmZHdhcmYyX3Vuc3VwcG9ydGVkX2F0X2VuY29kaW5nLAorCQkgICAgZHdhcmZfdHlwZV9lbmNvZGluZ19uYW1lIChlbmNvZGluZykpOworCSAgYnJlYWs7CisJfQorICAgICAgdHlwZSA9IGluaXRfdHlwZSAoY29kZSwgc2l6ZSwgaXNfdW5zaWduZWQsIERXX1NUUklORyAoYXR0ciksIG9iamZpbGUpOworICAgICAgaWYgKGVuY29kaW5nID09IERXX0FURV9hZGRyZXNzKQorCVRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpID0gZHdhcmYyX2Z1bmRhbWVudGFsX3R5cGUgKG9iamZpbGUsIEZUX1ZPSUQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHR5cGUgPSBkd2FyZl9iYXNlX3R5cGUgKGVuY29kaW5nLCBzaXplLCBvYmpmaWxlKTsKKyAgICB9CisgIGRpZS0+dHlwZSA9IHR5cGU7Cit9CisKKy8qIFJlYWQgYSB3aG9sZSBjb21waWxhdGlvbiB1bml0IGludG8gYSBsaW5rZWQgbGlzdCBvZiBkaWVzLiAgKi8KKworc3RydWN0IGRpZV9pbmZvICoKK3JlYWRfY29tcF91bml0IChpbmZvX3B0ciwgYWJmZCkKKyAgICBjaGFyICppbmZvX3B0cjsKKyAgICBiZmQgKmFiZmQ7Cit7CisgIHN0cnVjdCBkaWVfaW5mbyAqZmlyc3RfZGllLCAqbGFzdF9kaWUsICpkaWU7CisgIGNoYXIgKmN1cl9wdHI7CisgIGludCBuZXN0aW5nX2xldmVsOworCisgIC8qIFJlc2V0IGRpZSByZWZlcmVuY2UgdGFibGUsIHdlIGFyZSBidWlsZGluZyBhIG5ldyBvbmUgbm93LiAqLworICBkd2FyZjJfZW1wdHlfZGllX3JlZl90YWJsZSAoKTsKKworICBjdXJfcHRyID0gaW5mb19wdHI7CisgIG5lc3RpbmdfbGV2ZWwgPSAwOworICBmaXJzdF9kaWUgPSBsYXN0X2RpZSA9IE5VTEw7CisgIGRvCisgICAgeworICAgICAgY3VyX3B0ciA9IHJlYWRfZnVsbF9kaWUgKCZkaWUsIGFiZmQsIGN1cl9wdHIpOworICAgICAgaWYgKGRpZS0+aGFzX2NoaWxkcmVuKQorCXsKKwkgIG5lc3RpbmdfbGV2ZWwrKzsKKwl9CisgICAgICBpZiAoZGllLT50YWcgPT0gMCkKKwl7CisJICBuZXN0aW5nX2xldmVsLS07CisJfQorCisgICAgICBkaWUtPm5leHQgPSBOVUxMOworCisgICAgICAvKiBFbnRlciBkaWUgaW4gcmVmZXJlbmNlIGhhc2ggdGFibGUgKi8KKyAgICAgIHN0b3JlX2luX3JlZl90YWJsZSAoZGllLT5vZmZzZXQsIGRpZSk7CisKKyAgICAgIGlmICghZmlyc3RfZGllKQorCXsKKwkgIGZpcnN0X2RpZSA9IGxhc3RfZGllID0gZGllOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBsYXN0X2RpZS0+bmV4dCA9IGRpZTsKKwkgIGxhc3RfZGllID0gZGllOworCX0KKyAgICB9CisgIHdoaWxlIChuZXN0aW5nX2xldmVsID4gMCk7CisgIHJldHVybiBmaXJzdF9kaWU7Cit9CisKKy8qIEZyZWUgYSBsaW5rZWQgbGlzdCBvZiBkaWVzLiAgKi8KKworc3RhdGljIHZvaWQKK2ZyZWVfZGllX2xpc3QgKGRpZXMpCisgICAgIHN0cnVjdCBkaWVfaW5mbyAqZGllczsKK3sKKyAgc3RydWN0IGRpZV9pbmZvICpkaWUsICpuZXh0OworCisgIGRpZSA9IGRpZXM7CisgIHdoaWxlIChkaWUpCisgICAgeworICAgICAgbmV4dCA9IGRpZS0+bmV4dDsKKyAgICAgIGZyZWUgKGRpZS0+YXR0cnMpOworICAgICAgZnJlZSAoZGllKTsKKyAgICAgIGRpZSA9IG5leHQ7CisgICAgfQorfQorCisvKiBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBhdCBPRkZTRVQgYW5kIG9mIHNpemUgU0laRSBmcm9tIHRoZQorICAgb2JqZWN0IGZpbGUgc3BlY2lmaWVkIGJ5IE9CSkZJTEUgaW50byB0aGUgcHN5bWJvbF9vYnN0YWNrIGFuZCByZXR1cm4gaXQuICAqLworCitzdGF0aWMgY2hhciAqCitkd2FyZjJfcmVhZF9zZWN0aW9uIChvYmpmaWxlLCBvZmZzZXQsIHNpemUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBmaWxlX3B0ciBvZmZzZXQ7CisgICAgIHVuc2lnbmVkIGludCBzaXplOworeworICBiZmQgKmFiZmQgPSBvYmpmaWxlLT5vYmZkOworICBjaGFyICpidWY7CisKKyAgaWYgKHNpemUgPT0gMCkKKyAgICByZXR1cm4gTlVMTDsKKworICBidWYgPSAoY2hhciAqKSBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+cHN5bWJvbF9vYnN0YWNrLCBzaXplKTsKKyAgaWYgKChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkgfHwKKyAgICAgIChiZmRfcmVhZCAoYnVmLCBzaXplLCAxLCBhYmZkKSAhPSBzaXplKSkKKyAgICB7CisgICAgICBidWYgPSBOVUxMOworICAgICAgZXJyb3IgKCJEd2FyZiBFcnJvcjogQ2FuJ3QgcmVhZCBEV0FSRiBkYXRhIGZyb20gJyVzJyIsCisgICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKKyAgICB9CisgIHJldHVybiBidWY7Cit9CisKKy8qIEluIERXQVJGIHZlcnNpb24gMiwgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMKKyAgIHN0b3JlZCBpbiBhIHNlcGFyYXRlIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbi4gIEJlZm9yZSB3ZSByZWFkIGFueQorICAgZGllcyBmcm9tIGEgc2VjdGlvbiB3ZSByZWFkIGluIGFsbCBhYmJyZXZpYXRpb25zIGFuZCBpbnN0YWxsIHRoZW0KKyAgIGluIGEgaGFzaCB0YWJsZS4gICovCisKK3N0YXRpYyB2b2lkCitkd2FyZjJfcmVhZF9hYmJyZXZzIChhYmZkLCBvZmZzZXQpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7Cit7CisgIGNoYXIgKmFiYnJldl9wdHI7CisgIHN0cnVjdCBhYmJyZXZfaW5mbyAqY3VyX2FiYnJldjsKKyAgdW5zaWduZWQgaW50IGFiYnJldl9udW1iZXIsIGJ5dGVzX3JlYWQsIGFiYnJldl9uYW1lOworICB1bnNpZ25lZCBpbnQgYWJicmV2X2Zvcm0sIGhhc2hfbnVtYmVyOworCisgIC8qIGVtcHR5IHRoZSB0YWJsZSAqLworICBkd2FyZjJfZW1wdHlfYWJicmV2X3RhYmxlIChOVUxMKTsKKworICBhYmJyZXZfcHRyID0gZHdhcmZfYWJicmV2X2J1ZmZlciArIG9mZnNldDsKKyAgYWJicmV2X251bWJlciA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7CisgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKKworICAvKiBsb29wIHVudGlsIHdlIHJlYWNoIGFuIGFiYnJldiBudW1iZXIgb2YgMCAqLworICB3aGlsZSAoYWJicmV2X251bWJlcikKKyAgICB7CisgICAgICBjdXJfYWJicmV2ID0gZHdhcmZfYWxsb2NfYWJicmV2ICgpOworCisgICAgICAvKiByZWFkIGluIGFiYnJldiBoZWFkZXIgKi8KKyAgICAgIGN1cl9hYmJyZXYtPm51bWJlciA9IGFiYnJldl9udW1iZXI7CisgICAgICBjdXJfYWJicmV2LT50YWcgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYWJicmV2X3B0ciwgJmJ5dGVzX3JlYWQpOworICAgICAgYWJicmV2X3B0ciArPSBieXRlc19yZWFkOworICAgICAgY3VyX2FiYnJldi0+aGFzX2NoaWxkcmVuID0gcmVhZF8xX2J5dGUgKGFiZmQsIGFiYnJldl9wdHIpOworICAgICAgYWJicmV2X3B0ciArPSAxOworCisgICAgICAvKiBub3cgcmVhZCBpbiBkZWNsYXJhdGlvbnMgKi8KKyAgICAgIGFiYnJldl9uYW1lID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKKyAgICAgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKKyAgICAgIGFiYnJldl9mb3JtID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKKyAgICAgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKKyAgICAgIHdoaWxlIChhYmJyZXZfbmFtZSkKKwl7CisJICBpZiAoKGN1cl9hYmJyZXYtPm51bV9hdHRycyAlIEFUVFJfQUxMT0NfQ0hVTkspID09IDApCisJICAgIHsKKwkgICAgICBjdXJfYWJicmV2LT5hdHRycyA9IChzdHJ1Y3QgYXR0cl9hYmJyZXYgKikKKwkJeHJlYWxsb2MgKGN1cl9hYmJyZXYtPmF0dHJzLAorCQkJICAoY3VyX2FiYnJldi0+bnVtX2F0dHJzICsgQVRUUl9BTExPQ19DSFVOSykKKwkJCSAgICAqIHNpemVvZiAoc3RydWN0IGF0dHJfYWJicmV2KSk7CisJICAgIH0KKwkgIGN1cl9hYmJyZXYtPmF0dHJzW2N1cl9hYmJyZXYtPm51bV9hdHRyc10ubmFtZSA9IGFiYnJldl9uYW1lOworCSAgY3VyX2FiYnJldi0+YXR0cnNbY3VyX2FiYnJldi0+bnVtX2F0dHJzKytdLmZvcm0gPSBhYmJyZXZfZm9ybTsKKwkgIGFiYnJldl9uYW1lID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKKwkgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKKwkgIGFiYnJldl9mb3JtID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKKwkgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKKwl9CisKKyAgICAgIGhhc2hfbnVtYmVyID0gYWJicmV2X251bWJlciAlIEFCQlJFVl9IQVNIX1NJWkU7CisgICAgICBjdXJfYWJicmV2LT5uZXh0ID0gZHdhcmYyX2FiYnJldnNbaGFzaF9udW1iZXJdOworICAgICAgZHdhcmYyX2FiYnJldnNbaGFzaF9udW1iZXJdID0gY3VyX2FiYnJldjsKKworICAgICAgLyogR2V0IG5leHQgYWJicmV2aWF0aW9uLgorICAgICAgICAgVW5kZXIgSXJpeDYgdGhlIGFiYnJldmlhdGlvbnMgZm9yIGEgY29tcGlsYXRpb24gdW5pdCBhcmUgbm90CisJIGFsd2F5cyBwcm9wZXJseSB0ZXJtaW5hdGVkIHdpdGggYW4gYWJicmV2IG51bWJlciBvZiAwLgorCSBFeGl0IGxvb3AgaWYgd2UgZW5jb3VudGVyIGFuIGFiYnJldmlhdGlvbiB3aGljaCB3ZSBoYXZlCisJIGFscmVhZHkgcmVhZCAod2hpY2ggbWVhbnMgd2UgYXJlIGFib3V0IHRvIHJlYWQgdGhlIGFiYnJldmlhdGlvbnMKKwkgZm9yIHRoZSBuZXh0IGNvbXBpbGUgdW5pdCkgb3IgaWYgdGhlIGVuZCBvZiB0aGUgYWJicmV2aWF0aW9uCisJIHRhYmxlIGlzIHJlYWNoZWQuICAqLworICAgICAgaWYgKCh1bnNpZ25lZCBpbnQpIChhYmJyZXZfcHRyIC0gZHdhcmZfYWJicmV2X2J1ZmZlcikKKwkgICAgPj0gZHdhcmZfYWJicmV2X3NpemUpCisJYnJlYWs7CisgICAgICBhYmJyZXZfbnVtYmVyID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKKyAgICAgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKKyAgICAgIGlmIChkd2FyZjJfbG9va3VwX2FiYnJldiAoYWJicmV2X251bWJlcikgIT0gTlVMTCkKKwlicmVhazsKKyAgICB9Cit9CisKKy8qIEVtcHR5IHRoZSBhYmJyZXYgdGFibGUgZm9yIGEgbmV3IGNvbXBpbGF0aW9uIHVuaXQuICAqLworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2R3YXJmMl9lbXB0eV9hYmJyZXZfdGFibGUgKGlnbm9yZSkKKyAgICAgUFRSIGlnbm9yZTsKK3sKKyAgaW50IGk7CisgIHN0cnVjdCBhYmJyZXZfaW5mbyAqYWJicmV2LCAqbmV4dDsKKworICBmb3IgKGkgPSAwOyBpIDwgQUJCUkVWX0hBU0hfU0laRTsgKytpKQorICAgIHsKKyAgICAgIG5leHQgPSBOVUxMOworICAgICAgYWJicmV2ID0gZHdhcmYyX2FiYnJldnNbaV07CisgICAgICB3aGlsZSAoYWJicmV2KQorCXsKKwkgIG5leHQgPSBhYmJyZXYtPm5leHQ7CisJICBmcmVlIChhYmJyZXYtPmF0dHJzKTsKKwkgIGZyZWUgKGFiYnJldik7CisJICBhYmJyZXYgPSBuZXh0OworCX0KKyAgICAgIGR3YXJmMl9hYmJyZXZzW2ldID0gTlVMTDsKKyAgICB9Cit9CisKKy8qIExvb2t1cCBhbiBhYmJyZXZfaW5mbyBzdHJ1Y3R1cmUgaW4gdGhlIGFiYnJldiBoYXNoIHRhYmxlLiAgKi8KKworc3RhdGljIHN0cnVjdCBhYmJyZXZfaW5mbyAqCitkd2FyZjJfbG9va3VwX2FiYnJldiAobnVtYmVyKQorICAgICB1bnNpZ25lZCBpbnQgbnVtYmVyOworeworICB1bnNpZ25lZCBpbnQgaGFzaF9udW1iZXI7CisgIHN0cnVjdCBhYmJyZXZfaW5mbyAqYWJicmV2OworCisgIGhhc2hfbnVtYmVyID0gbnVtYmVyICUgQUJCUkVWX0hBU0hfU0laRTsKKyAgYWJicmV2ID0gZHdhcmYyX2FiYnJldnNbaGFzaF9udW1iZXJdOworCisgIHdoaWxlIChhYmJyZXYpCisgICAgeworICAgICAgaWYgKGFiYnJldi0+bnVtYmVyID09IG51bWJlcikKKwlyZXR1cm4gYWJicmV2OworICAgICAgZWxzZQorCWFiYnJldiA9IGFiYnJldi0+bmV4dDsKKyAgICB9CisgIHJldHVybiBOVUxMOworfQorCisvKiBSZWFkIGEgbWluaW1hbCBhbW91bnQgb2YgaW5mb3JtYXRpb24gaW50byB0aGUgbWluaW1hbCBkaWUgc3RydWN0dXJlLiAgKi8KKworc3RhdGljIGNoYXIgKgorcmVhZF9wYXJ0aWFsX2RpZSAocGFydF9kaWUsIGFiZmQsIGluZm9fcHRyLCBoYXNfcGNfaW5mbykKKyAgICAgc3RydWN0IHBhcnRpYWxfZGllX2luZm8gKnBhcnRfZGllOworICAgICBiZmQgKiBhYmZkOworICAgICBjaGFyICppbmZvX3B0cjsKKyAgICAgaW50ICpoYXNfcGNfaW5mbzsKK3sKKyAgdW5zaWduZWQgaW50IGFiYnJldl9udW1iZXIsIGJ5dGVzX3JlYWQsIGk7CisgIHN0cnVjdCBhYmJyZXZfaW5mbyAqYWJicmV2OworICBzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisgIHN0cnVjdCBhdHRyaWJ1dGUgc3BlY19hdHRyOworICBpbnQgZm91bmRfc3BlY19hdHRyID0gMDsKKyAgaW50IGhhc19sb3dfcGNfYXR0ciAgPSAwOworICBpbnQgaGFzX2hpZ2hfcGNfYXR0ciA9IDA7CisKKyAgKnBhcnRfZGllID0gemVyb2VkX3BhcnRpYWxfZGllOworICAqaGFzX3BjX2luZm8gPSAwOworICBhYmJyZXZfbnVtYmVyID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7CisgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7CisgIGlmICghYWJicmV2X251bWJlcikKKyAgICByZXR1cm4gaW5mb19wdHI7CisKKyAgYWJicmV2ID0gZHdhcmYyX2xvb2t1cF9hYmJyZXYgKGFiYnJldl9udW1iZXIpOworICBpZiAoIWFiYnJldikKKyAgICB7CisgICAgICBlcnJvciAoIkR3YXJmIEVycm9yOiBDb3VsZCBub3QgZmluZCBhYmJyZXYgbnVtYmVyICVkLiIsIGFiYnJldl9udW1iZXIpOworICAgIH0KKyAgcGFydF9kaWUtPm9mZnNldCA9IGluZm9fcHRyIC0gZHdhcmZfaW5mb19idWZmZXI7CisgIHBhcnRfZGllLT50YWcgPSBhYmJyZXYtPnRhZzsKKyAgcGFydF9kaWUtPmhhc19jaGlsZHJlbiA9IGFiYnJldi0+aGFzX2NoaWxkcmVuOworICBwYXJ0X2RpZS0+YWJicmV2ID0gYWJicmV2X251bWJlcjsKKworICBmb3IgKGkgPSAwOyBpIDwgYWJicmV2LT5udW1fYXR0cnM7ICsraSkKKyAgICB7CisgICAgICBpbmZvX3B0ciA9IHJlYWRfYXR0cmlidXRlICgmYXR0ciwgJmFiYnJldi0+YXR0cnNbaV0sIGFiZmQsIGluZm9fcHRyKTsKKworICAgICAgLyogU3RvcmUgdGhlIGRhdGEgaWYgaXQgaXMgb2YgYW4gYXR0cmlidXRlIHdlIHdhbnQgdG8ga2VlcCBpbiBhCisJIHBhcnRpYWwgc3ltYm9sIHRhYmxlLiAgKi8KKyAgICAgIHN3aXRjaCAoYXR0ci5uYW1lKQorCXsKKwljYXNlIERXX0FUX25hbWU6CisKKwkgIC8qIFByZWZlciBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSBvdmVyIERXX0FUX25hbWUuICAqLworCSAgaWYgKHBhcnRfZGllLT5uYW1lID09IE5VTEwpCisJICAgIHBhcnRfZGllLT5uYW1lID0gRFdfU1RSSU5HICgmYXR0cik7CisJICBicmVhazsKKwljYXNlIERXX0FUX01JUFNfbGlua2FnZV9uYW1lOgorCSAgcGFydF9kaWUtPm5hbWUgPSBEV19TVFJJTkcgKCZhdHRyKTsKKwkgIGJyZWFrOworCWNhc2UgRFdfQVRfbG93X3BjOgorCSAgaGFzX2xvd19wY19hdHRyID0gMTsKKwkgIHBhcnRfZGllLT5sb3dwYyA9IERXX0FERFIgKCZhdHRyKTsKKwkgIGJyZWFrOworCWNhc2UgRFdfQVRfaGlnaF9wYzoKKwkgIGhhc19oaWdoX3BjX2F0dHIgPSAxOworCSAgcGFydF9kaWUtPmhpZ2hwYyA9IERXX0FERFIgKCZhdHRyKTsKKwkgIGJyZWFrOworCWNhc2UgRFdfQVRfbG9jYXRpb246CisJICBwYXJ0X2RpZS0+bG9jZGVzYyA9IERXX0JMT0NLICgmYXR0cik7CisJICBicmVhazsKKwljYXNlIERXX0FUX2xhbmd1YWdlOgorCSAgcGFydF9kaWUtPmxhbmd1YWdlID0gRFdfVU5TTkQgKCZhdHRyKTsKKwkgIGJyZWFrOworCWNhc2UgRFdfQVRfZXh0ZXJuYWw6CisJICBwYXJ0X2RpZS0+aXNfZXh0ZXJuYWwgPSBEV19VTlNORCAoJmF0dHIpOworCSAgYnJlYWs7CisJY2FzZSBEV19BVF9kZWNsYXJhdGlvbjoKKwkgIHBhcnRfZGllLT5pc19kZWNsYXJhdGlvbiA9IERXX1VOU05EICgmYXR0cik7CisJICBicmVhazsKKwljYXNlIERXX0FUX3R5cGU6CisJICBwYXJ0X2RpZS0+aGFzX3R5cGUgPSAxOworCSAgYnJlYWs7CisJY2FzZSBEV19BVF9hYnN0cmFjdF9vcmlnaW46CisJY2FzZSBEV19BVF9zcGVjaWZpY2F0aW9uOgorCSAgZm91bmRfc3BlY19hdHRyID0gMTsKKwkgIHNwZWNfYXR0ciA9IGF0dHI7CisJICBicmVhazsKKwljYXNlIERXX0FUX3NpYmxpbmc6CisJICAvKiBJZ25vcmUgYWJzb2x1dGUgc2libGluZ3MsIHRoZXkgbWlnaHQgcG9pbnQgb3V0c2lkZSBvZgorCSAgICAgdGhlIGN1cnJlbnQgY29tcGlsZSB1bml0LiAgKi8KKwkgIGlmIChhdHRyLmZvcm0gPT0gRFdfRk9STV9yZWZfYWRkcikKKwkgICAgY29tcGxhaW4oJmR3YXJmMl9hYnNvbHV0ZV9zaWJsaW5nX2NvbXBsYWludCk7CisJICBlbHNlCisJICAgIHBhcnRfZGllLT5zaWJsaW5nID0KKwkgICAgICBkd2FyZl9pbmZvX2J1ZmZlciArIGR3YXJmMl9nZXRfcmVmX2RpZV9vZmZzZXQgKCZhdHRyKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgfQorCisgIC8qIElmIHdlIGZvdW5kIGEgcmVmZXJlbmNlIGF0dHJpYnV0ZSBhbmQgdGhlIGRpZSBoYXMgbm8gbmFtZSwgdHJ5CisgICAgIHRvIGZpbmQgYSBuYW1lIGluIHRoZSByZWZlcnJlZCB0byBkaWUuICAqLworCisgIGlmIChmb3VuZF9zcGVjX2F0dHIgJiYgcGFydF9kaWUtPm5hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3QgcGFydGlhbF9kaWVfaW5mbyBzcGVjX2RpZTsKKyAgICAgIGNoYXIgKnNwZWNfcHRyOworICAgICAgaW50IGR1bW15OworCisgICAgICBzcGVjX3B0ciA9IGR3YXJmX2luZm9fYnVmZmVyICsgZHdhcmYyX2dldF9yZWZfZGllX29mZnNldCAoJnNwZWNfYXR0cik7CisgICAgICByZWFkX3BhcnRpYWxfZGllICgmc3BlY19kaWUsIGFiZmQsIHNwZWNfcHRyLCAmZHVtbXkpOworICAgICAgaWYgKHNwZWNfZGllLm5hbWUpCisJeworCSAgcGFydF9kaWUtPm5hbWUgPSBzcGVjX2RpZS5uYW1lOworCisJICAvKiBDb3B5IERXX0FUX2V4dGVybmFsIGF0dHJpYnV0ZSBpZiBpdCBpcyBzZXQuICAqLworCSAgaWYgKHNwZWNfZGllLmlzX2V4dGVybmFsKQorCSAgICBwYXJ0X2RpZS0+aXNfZXh0ZXJuYWwgPSBzcGVjX2RpZS5pc19leHRlcm5hbDsKKwl9CisgICAgfQorCisgIC8qIFdoZW4gdXNpbmcgdGhlIEdOVSBsaW5rZXIsIC5nbnUubGlua29uY2UuIHNlY3Rpb25zIGFyZSB1c2VkIHRvCisgICAgIGVsaW1pbmF0ZSBkdXBsaWNhdGUgY29waWVzIG9mIGZ1bmN0aW9ucyBhbmQgdnRhYmxlcyBhbmQgc3VjaC4KKyAgICAgVGhlIGxpbmtlciB3aWxsIGFyYml0cmFyaWx5IGNob29zZSBvbmUgYW5kIGRpc2NhcmQgdGhlIG90aGVycy4KKyAgICAgVGhlIEFUXypfcGMgdmFsdWVzIGZvciBzdWNoIGZ1bmN0aW9ucyByZWZlciB0byBsb2NhbCBsYWJlbHMgaW4KKyAgICAgdGhlc2Ugc2VjdGlvbnMuICBJZiB0aGUgc2VjdGlvbiBmcm9tIHRoYXQgZmlsZSB3YXMgZGlzY2FyZGVkLCB0aGUKKyAgICAgbGFiZWxzIGFyZSBub3QgaW4gdGhlIG91dHB1dCwgc28gdGhlIHJlbG9jcyBnZXQgYSB2YWx1ZSBvZiAwLgorICAgICBJZiB0aGlzIGlzIGEgZGlzY2FyZGVkIGZ1bmN0aW9uLCBtYXJrIHRoZSBwYyBib3VuZHMgYXMgaW52YWxpZCwKKyAgICAgc28gdGhhdCBHREIgd2lsbCBpZ25vcmUgaXQuICAqLworICBpZiAoaGFzX2xvd19wY19hdHRyICYmIGhhc19oaWdoX3BjX2F0dHIKKyAgICAgICYmIHBhcnRfZGllLT5sb3dwYyA8IHBhcnRfZGllLT5oaWdocGMKKyAgICAgICYmIChwYXJ0X2RpZS0+bG93cGMgIT0gMAorCSAgfHwgKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBIQVNfUkVMT0MpKSkKKyAgICAqaGFzX3BjX2luZm8gPSAxOworICByZXR1cm4gaW5mb19wdHI7Cit9CisKKy8qIFJlYWQgdGhlIGRpZSBmcm9tIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uIGJ1ZmZlci4gIEFuZCBzZXQgZGllcCB0bworICAgcG9pbnQgdG8gYSBuZXdseSBhbGxvY2F0ZWQgZGllIHdpdGggaXRzIGluZm9ybWF0aW9uLiAgKi8KKworc3RhdGljIGNoYXIgKgorcmVhZF9mdWxsX2RpZSAoZGllcCwgYWJmZCwgaW5mb19wdHIpCisgICAgIHN0cnVjdCBkaWVfaW5mbyAqKmRpZXA7CisgICAgIGJmZCAqYWJmZDsKKyAgICAgY2hhciAqaW5mb19wdHI7Cit7CisgIHVuc2lnbmVkIGludCBhYmJyZXZfbnVtYmVyLCBieXRlc19yZWFkLCBpLCBvZmZzZXQ7CisgIHN0cnVjdCBhYmJyZXZfaW5mbyAqYWJicmV2OworICBzdHJ1Y3QgZGllX2luZm8gKmRpZTsKKworICBvZmZzZXQgPSBpbmZvX3B0ciAtIGR3YXJmX2luZm9fYnVmZmVyOworICBhYmJyZXZfbnVtYmVyID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7CisgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7CisgIGlmICghYWJicmV2X251bWJlcikKKyAgICB7CisgICAgICBkaWUgPSBkd2FyZl9hbGxvY19kaWUgKCk7CisgICAgICBkaWUtPnRhZyA9IDA7CisgICAgICBkaWUtPmFiYnJldiA9IGFiYnJldl9udW1iZXI7CisgICAgICBkaWUtPnR5cGUgPSBOVUxMOworICAgICAgKmRpZXAgPSBkaWU7CisgICAgICByZXR1cm4gaW5mb19wdHI7CisgICAgfQorCisgIGFiYnJldiA9IGR3YXJmMl9sb29rdXBfYWJicmV2IChhYmJyZXZfbnVtYmVyKTsKKyAgaWYgKCFhYmJyZXYpCisgICAgeworICAgICAgZXJyb3IgKCJEd2FyZiBFcnJvcjogY291bGQgbm90IGZpbmQgYWJicmV2IG51bWJlciAlZC4iLCBhYmJyZXZfbnVtYmVyKTsKKyAgICB9CisgIGRpZSA9IGR3YXJmX2FsbG9jX2RpZSAoKTsKKyAgZGllLT5vZmZzZXQgPSBvZmZzZXQ7CisgIGRpZS0+dGFnID0gYWJicmV2LT50YWc7CisgIGRpZS0+aGFzX2NoaWxkcmVuID0gYWJicmV2LT5oYXNfY2hpbGRyZW47CisgIGRpZS0+YWJicmV2ID0gYWJicmV2X251bWJlcjsKKyAgZGllLT50eXBlID0gTlVMTDsKKworICBkaWUtPm51bV9hdHRycyA9IGFiYnJldi0+bnVtX2F0dHJzOworICBkaWUtPmF0dHJzID0gKHN0cnVjdCBhdHRyaWJ1dGUgKikKKyAgICB4bWFsbG9jIChkaWUtPm51bV9hdHRycyAqIHNpemVvZiAoc3RydWN0IGF0dHJpYnV0ZSkpOworCisgIGZvciAoaSA9IDA7IGkgPCBhYmJyZXYtPm51bV9hdHRyczsgKytpKQorICAgIHsKKyAgICAgIGluZm9fcHRyID0gcmVhZF9hdHRyaWJ1dGUgKCZkaWUtPmF0dHJzW2ldLCAmYWJicmV2LT5hdHRyc1tpXSwKKwkJCQkgYWJmZCwgaW5mb19wdHIpOworICAgIH0KKworICAqZGllcCA9IGRpZTsKKyAgcmV0dXJuIGluZm9fcHRyOworfQorCisvKiBSZWFkIGFuIGF0dHJpYnV0ZSBkZXNjcmliZWQgYnkgYW4gYWJicmV2aWF0ZWQgYXR0cmlidXRlLiAgKi8KKworc3RhdGljIGNoYXIgKgorcmVhZF9hdHRyaWJ1dGUgKGF0dHIsIGFiYnJldiwgYWJmZCwgaW5mb19wdHIpCisgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHI7CisgICAgIHN0cnVjdCBhdHRyX2FiYnJldiAqYWJicmV2OworICAgICBiZmQgKmFiZmQ7CisgICAgIGNoYXIgKmluZm9fcHRyOworeworICB1bnNpZ25lZCBpbnQgYnl0ZXNfcmVhZDsKKyAgc3RydWN0IGR3YXJmX2Jsb2NrICpibGs7CisKKyAgYXR0ci0+bmFtZSA9IGFiYnJldi0+bmFtZTsKKyAgYXR0ci0+Zm9ybSA9IGFiYnJldi0+Zm9ybTsKKyAgc3dpdGNoIChhYmJyZXYtPmZvcm0pCisgICAgeworICAgIGNhc2UgRFdfRk9STV9hZGRyOgorICAgIGNhc2UgRFdfRk9STV9yZWZfYWRkcjoKKyAgICAgIERXX0FERFIgKGF0dHIpID0gcmVhZF9hZGRyZXNzIChhYmZkLCBpbmZvX3B0cik7CisgICAgICBpbmZvX3B0ciArPSBhZGRyZXNzX3NpemU7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX0ZPUk1fYmxvY2syOgorICAgICAgYmxrID0gZHdhcmZfYWxsb2NfYmxvY2sgKCk7CisgICAgICBibGstPnNpemUgPSByZWFkXzJfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKKyAgICAgIGluZm9fcHRyICs9IDI7CisgICAgICBibGstPmRhdGEgPSByZWFkX25fYnl0ZXMgKGFiZmQsIGluZm9fcHRyLCBibGstPnNpemUpOworICAgICAgaW5mb19wdHIgKz0gYmxrLT5zaXplOworICAgICAgRFdfQkxPQ0sgKGF0dHIpID0gYmxrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19GT1JNX2Jsb2NrNDoKKyAgICAgIGJsayA9IGR3YXJmX2FsbG9jX2Jsb2NrICgpOworICAgICAgYmxrLT5zaXplID0gcmVhZF80X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7CisgICAgICBpbmZvX3B0ciArPSA0OworICAgICAgYmxrLT5kYXRhID0gcmVhZF9uX2J5dGVzIChhYmZkLCBpbmZvX3B0ciwgYmxrLT5zaXplKTsKKyAgICAgIGluZm9fcHRyICs9IGJsay0+c2l6ZTsKKyAgICAgIERXX0JMT0NLIChhdHRyKSA9IGJsazsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfRk9STV9kYXRhMjoKKyAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfMl9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOworICAgICAgaW5mb19wdHIgKz0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfRk9STV9kYXRhNDoKKyAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOworICAgICAgaW5mb19wdHIgKz0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfRk9STV9kYXRhODoKKyAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfOF9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOworICAgICAgaW5mb19wdHIgKz0gODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfRk9STV9zdHJpbmc6CisgICAgICBEV19TVFJJTkcgKGF0dHIpID0gcmVhZF9zdHJpbmcgKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7CisgICAgICBpbmZvX3B0ciArPSBieXRlc19yZWFkOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19GT1JNX2Jsb2NrOgorICAgICAgYmxrID0gZHdhcmZfYWxsb2NfYmxvY2sgKCk7CisgICAgICBibGstPnNpemUgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKKyAgICAgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7CisgICAgICBibGstPmRhdGEgPSByZWFkX25fYnl0ZXMgKGFiZmQsIGluZm9fcHRyLCBibGstPnNpemUpOworICAgICAgaW5mb19wdHIgKz0gYmxrLT5zaXplOworICAgICAgRFdfQkxPQ0sgKGF0dHIpID0gYmxrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19GT1JNX2Jsb2NrMToKKyAgICAgIGJsayA9IGR3YXJmX2FsbG9jX2Jsb2NrICgpOworICAgICAgYmxrLT5zaXplID0gcmVhZF8xX2J5dGUgKGFiZmQsIGluZm9fcHRyKTsKKyAgICAgIGluZm9fcHRyICs9IDE7CisgICAgICBibGstPmRhdGEgPSByZWFkX25fYnl0ZXMgKGFiZmQsIGluZm9fcHRyLCBibGstPnNpemUpOworICAgICAgaW5mb19wdHIgKz0gYmxrLT5zaXplOworICAgICAgRFdfQkxPQ0sgKGF0dHIpID0gYmxrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19GT1JNX2RhdGExOgorICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF8xX2J5dGUgKGFiZmQsIGluZm9fcHRyKTsKKyAgICAgIGluZm9fcHRyICs9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX0ZPUk1fZmxhZzoKKyAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfMV9ieXRlIChhYmZkLCBpbmZvX3B0cik7CisgICAgICBpbmZvX3B0ciArPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19GT1JNX3NkYXRhOgorICAgICAgRFdfU05EIChhdHRyKSA9IHJlYWRfc2lnbmVkX2xlYjEyOCAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKKyAgICAgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX0ZPUk1fdWRhdGE6CisgICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKKyAgICAgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX0ZPUk1fcmVmMToKKyAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfMV9ieXRlIChhYmZkLCBpbmZvX3B0cik7CisgICAgICBpbmZvX3B0ciArPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19GT1JNX3JlZjI6CisgICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzJfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKKyAgICAgIGluZm9fcHRyICs9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX0ZPUk1fcmVmNDoKKyAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOworICAgICAgaW5mb19wdHIgKz0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfRk9STV9yZWZfdWRhdGE6CisgICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgaW5mb19wdHIsICZieXRlc19yZWFkKTsKKyAgICAgIGluZm9fcHRyICs9IGJ5dGVzX3JlYWQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX0ZPUk1fc3RycDoKKyAgICBjYXNlIERXX0ZPUk1faW5kaXJlY3Q6CisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yICgiRHdhcmYgRXJyb3I6IENhbm5vdCBoYW5kbGUgJXMgaW4gRFdBUkYgcmVhZGVyLiIsCisJICAgICBkd2FyZl9mb3JtX25hbWUgKGFiYnJldi0+Zm9ybSkpOworICAgIH0KKyAgcmV0dXJuIGluZm9fcHRyOworfQorCisvKiByZWFkIGR3YXJmIGluZm9ybWF0aW9uIGZyb20gYSBidWZmZXIgKi8KKworc3RhdGljIHVuc2lnbmVkIGludAorcmVhZF8xX2J5dGUgKGFiZmQsIGJ1ZikKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICpidWY7Cit7CisgIHJldHVybiBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOworfQorCitzdGF0aWMgaW50CityZWFkXzFfc2lnbmVkX2J5dGUgKGFiZmQsIGJ1ZikKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICpidWY7Cit7CisgIHJldHVybiBiZmRfZ2V0X3NpZ25lZF84IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorcmVhZF8yX2J5dGVzIChhYmZkLCBidWYpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY2hhciAqYnVmOworeworICByZXR1cm4gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQKK3JlYWRfMl9zaWduZWRfYnl0ZXMgKGFiZmQsIGJ1ZikKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICpidWY7Cit7CisgIHJldHVybiBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3JlYWRfNF9ieXRlcyAoYWJmZCwgYnVmKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNoYXIgKmJ1ZjsKK3sKKyAgcmV0dXJuIGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOworfQorCitzdGF0aWMgaW50CityZWFkXzRfc2lnbmVkX2J5dGVzIChhYmZkLCBidWYpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY2hhciAqYnVmOworeworICByZXR1cm4gYmZkX2dldF9zaWduZWRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CityZWFkXzhfYnl0ZXMgKGFiZmQsIGJ1ZikKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICpidWY7Cit7CisgIHJldHVybiBiZmRfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKK30KKworc3RhdGljIENPUkVfQUREUgorcmVhZF9hZGRyZXNzIChhYmZkLCBidWYpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY2hhciAqYnVmOworeworICBDT1JFX0FERFIgcmV0dmFsID0gMDsKKworICBzd2l0Y2ggKGFkZHJlc3Nfc2l6ZSkKKyAgICB7CisgICAgY2FzZSA0OgorICAgICAgcmV0dmFsID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICByZXR2YWwgPSBiZmRfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiAqVEhFKiBhbHRlcm5hdGl2ZSBpcyA4LCByaWdodD8gKi8KKyAgICAgIGFib3J0ICgpOworICAgIH0KKyAgLyogSWYgdGhlIGFkZHJlc3MgYmVpbmcgcmVhZCBpcyBsYXJnZXIgdGhhbiB0aGUgYWRkcmVzcyB0aGF0IGlzCisgICAgIGFwcGxpY2FibGUgZm9yIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQgdGhlbiBtYXNrIGl0IGRvd24gdG8gdGhlCisgICAgIGNvcnJlY3Qgc2l6ZS4gIFRha2UgY2FyZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBzaGlmdCBvciBzaGlmdAorICAgICBvdmVyZmxvdyAqLworICBpZiAoYWRkcmVzc19zaXplID4gYWRkcmVzc19zaWduaWZpY2FudF9zaXplCisgICAgICAmJiBhZGRyZXNzX3NpZ25pZmljYW50X3NpemUgPCBzaXplb2YgKENPUkVfQUREUikpCisgICAgeworICAgICAgQ09SRV9BRERSIG1hc2sgPSAoKENPUkVfQUREUikgMCkgLSAxOworICAgICAgcmV0dmFsICY9IH4obWFzayA8PCAoYWRkcmVzc19zaWduaWZpY2FudF9zaXplICogOCkpOworICAgIH0KKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGNoYXIgKgorcmVhZF9uX2J5dGVzIChhYmZkLCBidWYsIHNpemUpCisgICAgIGJmZCAqIGFiZmQ7CisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgdW5zaWduZWQgaW50IHNpemU7Cit7CisgIC8qIElmIHRoZSBzaXplIG9mIGEgaG9zdCBjaGFyIGlzIDggYml0cywgd2UgY2FuIHJldHVybiBhIHBvaW50ZXIKKyAgICAgdG8gdGhlIGJ1ZmZlciwgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gY29weSB0aGUgZGF0YSB0byBhIGJ1ZmZlcgorICAgICBhbGxvY2F0ZWQgb24gdGhlIHRlbXBvcmFyeSBvYnN0YWNrLiAgKi8KKyNpZiBIT1NUX0NIQVJfQklUID09IDgKKyAgcmV0dXJuIGJ1ZjsKKyNlbHNlCisgIGNoYXIgKnJldDsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgcmV0ID0gb2JzdGFja19hbGxvYyAoJmR3YXJmMl90bXBfb2JzdGFjaywgc2l6ZSk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpCisgICAgeworICAgICAgcmV0W2ldID0gYmZkX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKKyAgICAgIGJ1ZisrOworICAgIH0KKyAgcmV0dXJuIHJldDsKKyNlbmRpZgorfQorCitzdGF0aWMgY2hhciAqCityZWFkX3N0cmluZyAoYWJmZCwgYnVmLCBieXRlc19yZWFkX3B0cikKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICpidWY7CisgICAgIHVuc2lnbmVkIGludCAqYnl0ZXNfcmVhZF9wdHI7Cit7CisgIC8qIElmIHRoZSBzaXplIG9mIGEgaG9zdCBjaGFyIGlzIDggYml0cywgd2UgY2FuIHJldHVybiBhIHBvaW50ZXIKKyAgICAgdG8gdGhlIHN0cmluZywgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gY29weSB0aGUgc3RyaW5nIHRvIGEgYnVmZmVyCisgICAgIGFsbG9jYXRlZCBvbiB0aGUgdGVtcG9yYXJ5IG9ic3RhY2suICAqLworI2lmIEhPU1RfQ0hBUl9CSVQgPT0gOAorICBpZiAoKmJ1ZiA9PSAnXDAnKQorICAgIHsKKyAgICAgICpieXRlc19yZWFkX3B0ciA9IDE7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICpieXRlc19yZWFkX3B0ciA9IHN0cmxlbiAoYnVmKSArIDE7CisgIHJldHVybiBidWY7CisjZWxzZQorICBpbnQgYnl0ZTsKKyAgdW5zaWduZWQgaW50IGkgPSAwOworCisgIHdoaWxlICgoYnl0ZSA9IGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGJ1ZikpICE9IDApCisgICAgeworICAgICAgb2JzdGFja18xZ3JvdyAoJmR3YXJmMl90bXBfb2JzdGFjaywgYnl0ZSk7CisgICAgICBpKys7CisgICAgICBidWYrKzsKKyAgICB9CisgIGlmIChpID09IDApCisgICAgeworICAgICAgKmJ5dGVzX3JlYWRfcHRyID0gMTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgb2JzdGFja18xZ3JvdyAoJmR3YXJmMl90bXBfb2JzdGFjaywgJ1wwJyk7CisgICpieXRlc19yZWFkX3B0ciA9IGkgKyAxOworICByZXR1cm4gb2JzdGFja19maW5pc2ggKCZkd2FyZjJfdG1wX29ic3RhY2spOworI2VuZGlmCit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3JlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBidWYsIGJ5dGVzX3JlYWRfcHRyKQorICAgICBiZmQgKmFiZmQ7CisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgdW5zaWduZWQgaW50ICpieXRlc19yZWFkX3B0cjsKK3sKKyAgdW5zaWduZWQgaW50IHJlc3VsdCwgbnVtX3JlYWQ7CisgIGludCBpLCBzaGlmdDsKKyAgdW5zaWduZWQgY2hhciBieXRlOworCisgIHJlc3VsdCA9IDA7CisgIHNoaWZ0ID0gMDsKKyAgbnVtX3JlYWQgPSAwOworICBpID0gMDsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgYnl0ZSA9IGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7CisgICAgICBidWYrKzsKKyAgICAgIG51bV9yZWFkKys7CisgICAgICByZXN1bHQgfD0gKChieXRlICYgMTI3KSA8PCBzaGlmdCk7CisgICAgICBpZiAoKGJ5dGUgJiAxMjgpID09IDApCisJeworCSAgYnJlYWs7CisJfQorICAgICAgc2hpZnQgKz0gNzsKKyAgICB9CisgICpieXRlc19yZWFkX3B0ciA9IG51bV9yZWFkOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CityZWFkX3NpZ25lZF9sZWIxMjggKGFiZmQsIGJ1ZiwgYnl0ZXNfcmVhZF9wdHIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgY2hhciAqYnVmOworICAgICB1bnNpZ25lZCBpbnQgKmJ5dGVzX3JlYWRfcHRyOworeworICBpbnQgcmVzdWx0OworICBpbnQgaSwgc2hpZnQsIHNpemUsIG51bV9yZWFkOworICB1bnNpZ25lZCBjaGFyIGJ5dGU7CisKKyAgcmVzdWx0ID0gMDsKKyAgc2hpZnQgPSAwOworICBzaXplID0gMzI7CisgIG51bV9yZWFkID0gMDsKKyAgaSA9IDA7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGJ5dGUgPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOworICAgICAgYnVmKys7CisgICAgICBudW1fcmVhZCsrOworICAgICAgcmVzdWx0IHw9ICgoYnl0ZSAmIDEyNykgPDwgc2hpZnQpOworICAgICAgc2hpZnQgKz0gNzsKKyAgICAgIGlmICgoYnl0ZSAmIDEyOCkgPT0gMCkKKwl7CisJICBicmVhazsKKwl9CisgICAgfQorICBpZiAoKHNoaWZ0IDwgc2l6ZSkgJiYgKGJ5dGUgJiAweDQwKSkKKyAgICB7CisgICAgICByZXN1bHQgfD0gLSgxIDw8IHNoaWZ0KTsKKyAgICB9CisgICpieXRlc19yZWFkX3B0ciA9IG51bV9yZWFkOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZAorc2V0X2N1X2xhbmd1YWdlIChsYW5nKQorICAgICB1bnNpZ25lZCBpbnQgbGFuZzsKK3sKKyAgc3dpdGNoIChsYW5nKQorICAgIHsKKyAgICBjYXNlIERXX0xBTkdfQzg5OgorICAgIGNhc2UgRFdfTEFOR19DOgorICAgICAgY3VfbGFuZ3VhZ2UgPSBsYW5ndWFnZV9jOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19MQU5HX0NfcGx1c19wbHVzOgorICAgICAgY3VfbGFuZ3VhZ2UgPSBsYW5ndWFnZV9jcGx1czsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfTEFOR19Gb3J0cmFuNzc6CisgICAgY2FzZSBEV19MQU5HX0ZvcnRyYW45MDoKKyAgICAgIGN1X2xhbmd1YWdlID0gbGFuZ3VhZ2VfZm9ydHJhbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfTEFOR19NaXBzX0Fzc2VtYmxlcjoKKyAgICAgIGN1X2xhbmd1YWdlID0gbGFuZ3VhZ2VfYXNtOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19MQU5HX0FkYTgzOgorICAgIGNhc2UgRFdfTEFOR19Db2JvbDc0OgorICAgIGNhc2UgRFdfTEFOR19Db2JvbDg1OgorICAgIGNhc2UgRFdfTEFOR19QYXNjYWw4MzoKKyAgICBjYXNlIERXX0xBTkdfTW9kdWxhMjoKKyAgICBkZWZhdWx0OgorICAgICAgY3VfbGFuZ3VhZ2UgPSBsYW5ndWFnZV91bmtub3duOworICAgICAgYnJlYWs7CisgICAgfQorICBjdV9sYW5ndWFnZV9kZWZuID0gbGFuZ3VhZ2VfZGVmIChjdV9sYW5ndWFnZSk7Cit9CisKKy8qIFJldHVybiB0aGUgbmFtZWQgYXR0cmlidXRlIG9yIE5VTEwgaWYgbm90IHRoZXJlLiAgKi8KKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKgorZHdhcmZfYXR0ciAoZGllLCBuYW1lKQorICAgICBzdHJ1Y3QgZGllX2luZm8gKmRpZTsKKyAgICAgdW5zaWduZWQgaW50IG5hbWU7Cit7CisgIHVuc2lnbmVkIGludCBpOworICBzdHJ1Y3QgYXR0cmlidXRlICpzcGVjID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgZGllLT5udW1fYXR0cnM7ICsraSkKKyAgICB7CisgICAgICBpZiAoZGllLT5hdHRyc1tpXS5uYW1lID09IG5hbWUpCisJeworCSAgcmV0dXJuICZkaWUtPmF0dHJzW2ldOworCX0KKyAgICAgIGlmIChkaWUtPmF0dHJzW2ldLm5hbWUgPT0gRFdfQVRfc3BlY2lmaWNhdGlvbgorCSAgfHwgZGllLT5hdHRyc1tpXS5uYW1lID09IERXX0FUX2Fic3RyYWN0X29yaWdpbikKKwlzcGVjID0gJmRpZS0+YXR0cnNbaV07CisgICAgfQorICBpZiAoc3BlYykKKyAgICB7CisgICAgICBzdHJ1Y3QgZGllX2luZm8gKnJlZl9kaWUgPQorCWZvbGxvd19kaWVfcmVmIChkd2FyZjJfZ2V0X3JlZl9kaWVfb2Zmc2V0IChzcGVjKSk7CisKKyAgICAgIGlmIChyZWZfZGllKQorCXJldHVybiBkd2FyZl9hdHRyIChyZWZfZGllLCBuYW1lKTsKKyAgICB9CisgICAgCisgIHJldHVybiBOVUxMOworfQorCisvKiBEZWNvZGUgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCB3aG9zZQorICAgbGluZSBudW1iZXIgaW5mbyBpcyBhdCBPRkZTRVQgaW4gdGhlIC5kZWJ1Z19saW5lIHNlY3Rpb24uCisgICBUaGUgY29tcGlsYXRpb24gZGlyZWN0b3J5IG9mIHRoZSBmaWxlIGlzIHBhc3NlZCBpbiBDT01QX0RJUi4gICovCisKK3N0cnVjdCBmaWxlbmFtZXMKK3sKKyAgdW5zaWduZWQgaW50IG51bV9maWxlczsKKyAgc3RydWN0IGZpbGVpbmZvCisgIHsKKyAgICBjaGFyICpuYW1lOworICAgIHVuc2lnbmVkIGludCBkaXI7CisgICAgdW5zaWduZWQgaW50IHRpbWU7CisgICAgdW5zaWduZWQgaW50IHNpemU7CisgIH0KKyAgKmZpbGVzOworfTsKKworc3RydWN0IGRpcmVjdG9yaWVzCit7CisgIHVuc2lnbmVkIGludCBudW1fZGlyczsKKyAgY2hhciAqKmRpcnM7Cit9OworCitzdGF0aWMgdm9pZAorZHdhcmZfZGVjb2RlX2xpbmVzIChvZmZzZXQsIGNvbXBfZGlyLCBhYmZkKQorICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworICAgICBjaGFyICpjb21wX2RpcjsKKyAgICAgYmZkICphYmZkOworeworICBjaGFyICpsaW5lX3B0cjsKKyAgY2hhciAqbGluZV9lbmQ7CisgIHN0cnVjdCBsaW5lX2hlYWQgbGg7CisgIHN0cnVjdCBjbGVhbnVwICpiYWNrX3RvOworICB1bnNpZ25lZCBpbnQgaSwgYnl0ZXNfcmVhZDsKKyAgY2hhciAqY3VyX2ZpbGUsICpjdXJfZGlyOworICB1bnNpZ25lZCBjaGFyIG9wX2NvZGUsIGV4dGVuZGVkX29wLCBhZGpfb3Bjb2RlOworCisjZGVmaW5lIEZJTEVfQUxMT0NfQ0hVTksgNQorI2RlZmluZSBESVJfQUxMT0NfQ0hVTksgNQorCisgIHN0cnVjdCBmaWxlbmFtZXMgZmlsZXM7CisgIHN0cnVjdCBkaXJlY3RvcmllcyBkaXJzOworCisgIGlmIChkd2FyZl9saW5lX2J1ZmZlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGNvbXBsYWluICgmZHdhcmYyX21pc3NpbmdfbGluZV9udW1iZXJfc2VjdGlvbik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGZpbGVzLm51bV9maWxlcyA9IDA7CisgIGZpbGVzLmZpbGVzID0gTlVMTDsKKworICBkaXJzLm51bV9kaXJzID0gMDsKKyAgZGlycy5kaXJzID0gTlVMTDsKKworICBsaW5lX3B0ciA9IGR3YXJmX2xpbmVfYnVmZmVyICsgb2Zmc2V0OworCisgIC8qIHJlYWQgaW4gdGhlIHByb2xvZ3VlICovCisgIGxoLnRvdGFsX2xlbmd0aCA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgbGluZV9wdHIpOworICBsaW5lX3B0ciArPSA0OworICBsaW5lX2VuZCA9IGxpbmVfcHRyICsgbGgudG90YWxfbGVuZ3RoOworICBsaC52ZXJzaW9uID0gcmVhZF8yX2J5dGVzIChhYmZkLCBsaW5lX3B0cik7CisgIGxpbmVfcHRyICs9IDI7CisgIGxoLnByb2xvZ3VlX2xlbmd0aCA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgbGluZV9wdHIpOworICBsaW5lX3B0ciArPSA0OworICBsaC5taW5pbXVtX2luc3RydWN0aW9uX2xlbmd0aCA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7CisgIGxpbmVfcHRyICs9IDE7CisgIGxoLmRlZmF1bHRfaXNfc3RtdCA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7CisgIGxpbmVfcHRyICs9IDE7CisgIGxoLmxpbmVfYmFzZSA9IHJlYWRfMV9zaWduZWRfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOworICBsaW5lX3B0ciArPSAxOworICBsaC5saW5lX3JhbmdlID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKKyAgbGluZV9wdHIgKz0gMTsKKyAgbGgub3Bjb2RlX2Jhc2UgPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOworICBsaW5lX3B0ciArPSAxOworICBsaC5zdGFuZGFyZF9vcGNvZGVfbGVuZ3RocyA9ICh1bnNpZ25lZCBjaGFyICopCisgICAgeG1hbGxvYyAobGgub3Bjb2RlX2Jhc2UgKiBzaXplb2YgKHVuc2lnbmVkIGNoYXIpKTsKKyAgYmFja190byA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlX2N1cnJlbnRfY29udGVudHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGguc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHMpOworCisgIGxoLnN0YW5kYXJkX29wY29kZV9sZW5ndGhzWzBdID0gMTsKKyAgZm9yIChpID0gMTsgaSA8IGxoLm9wY29kZV9iYXNlOyArK2kpCisgICAgeworICAgICAgbGguc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbaV0gPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOworICAgICAgbGluZV9wdHIgKz0gMTsKKyAgICB9CisKKyAgLyogUmVhZCBkaXJlY3RvcnkgdGFibGUgICovCisgIHdoaWxlICgoY3VyX2RpciA9IHJlYWRfc3RyaW5nIChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7CisgICAgICBpZiAoKGRpcnMubnVtX2RpcnMgJSBESVJfQUxMT0NfQ0hVTkspID09IDApCisJeworCSAgZGlycy5kaXJzID0gKGNoYXIgKiopCisJICAgIHhyZWFsbG9jIChkaXJzLmRpcnMsCisJCSAgICAgIChkaXJzLm51bV9kaXJzICsgRElSX0FMTE9DX0NIVU5LKSAqIHNpemVvZiAoY2hhciAqKSk7CisJICBpZiAoZGlycy5udW1fZGlycyA9PSAwKQorCSAgICBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZnJlZV9jdXJyZW50X2NvbnRlbnRzLCAmZGlycy5kaXJzKTsKKwl9CisgICAgICBkaXJzLmRpcnNbZGlycy5udW1fZGlycysrXSA9IGN1cl9kaXI7CisgICAgfQorICBsaW5lX3B0ciArPSBieXRlc19yZWFkOworCisgIC8qIFJlYWQgZmlsZSBuYW1lIHRhYmxlICovCisgIHdoaWxlICgoY3VyX2ZpbGUgPSByZWFkX3N0cmluZyAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOworICAgICAgaWYgKChmaWxlcy5udW1fZmlsZXMgJSBGSUxFX0FMTE9DX0NIVU5LKSA9PSAwKQorCXsKKwkgIGZpbGVzLmZpbGVzID0gKHN0cnVjdCBmaWxlaW5mbyAqKQorCSAgICB4cmVhbGxvYyAoZmlsZXMuZmlsZXMsCisJCSAgICAgIChmaWxlcy5udW1fZmlsZXMgKyBGSUxFX0FMTE9DX0NIVU5LKQorCQkJKiBzaXplb2YgKHN0cnVjdCBmaWxlaW5mbykpOworCSAgaWYgKGZpbGVzLm51bV9maWxlcyA9PSAwKQorCSAgICBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZnJlZV9jdXJyZW50X2NvbnRlbnRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVzLmZpbGVzKTsKKwl9CisgICAgICBmaWxlcy5maWxlc1tmaWxlcy5udW1fZmlsZXNdLm5hbWUgPSBjdXJfZmlsZTsKKyAgICAgIGZpbGVzLmZpbGVzW2ZpbGVzLm51bV9maWxlc10uZGlyID0KKwlyZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKKyAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7CisgICAgICBmaWxlcy5maWxlc1tmaWxlcy5udW1fZmlsZXNdLnRpbWUgPQorCXJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOworICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKKyAgICAgIGZpbGVzLmZpbGVzW2ZpbGVzLm51bV9maWxlc10uc2l6ZSA9CisJcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7CisgICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOworICAgICAgZmlsZXMubnVtX2ZpbGVzKys7CisgICAgfQorICBsaW5lX3B0ciArPSBieXRlc19yZWFkOworCisgIC8qIFJlYWQgdGhlIHN0YXRlbWVudCBzZXF1ZW5jZXMgdW50aWwgdGhlcmUncyBub3RoaW5nIGxlZnQuICAqLworICB3aGlsZSAobGluZV9wdHIgPCBsaW5lX2VuZCkKKyAgICB7CisgICAgICAvKiBzdGF0ZSBtYWNoaW5lIHJlZ2lzdGVycyAgKi8KKyAgICAgIENPUkVfQUREUiBhZGRyZXNzID0gMDsKKyAgICAgIHVuc2lnbmVkIGludCBmaWxlID0gMTsKKyAgICAgIHVuc2lnbmVkIGludCBsaW5lID0gMTsKKyAgICAgIHVuc2lnbmVkIGludCBjb2x1bW4gPSAwOworICAgICAgaW50IGlzX3N0bXQgPSBsaC5kZWZhdWx0X2lzX3N0bXQ7CisgICAgICBpbnQgYmFzaWNfYmxvY2sgPSAwOworICAgICAgaW50IGVuZF9zZXF1ZW5jZSA9IDA7CisKKyAgICAgIC8qIFN0YXJ0IGEgc3ViZmlsZSBmb3IgdGhlIGN1cnJlbnQgZmlsZSBvZiB0aGUgc3RhdGUgbWFjaGluZS4gICovCisgICAgICBpZiAoZmlsZXMubnVtX2ZpbGVzID49IGZpbGUpCisJeworCSAgLyogVGhlIGZpbGUgYW5kIGRpcmVjdG9yeSB0YWJsZXMgYXJlIDAgYmFzZWQsIHRoZSByZWZlcmVuY2VzCisJICAgICBhcmUgMSBiYXNlZC4gICovCisJICBkd2FyZjJfc3RhcnRfc3ViZmlsZSAoZmlsZXMuZmlsZXNbZmlsZSAtIDFdLm5hbWUsCisJCQkJKGZpbGVzLmZpbGVzW2ZpbGUgLSAxXS5kaXIKKwkJCQkgPyBkaXJzLmRpcnNbZmlsZXMuZmlsZXNbZmlsZSAtIDFdLmRpciAtIDFdCisJCQkJIDogY29tcF9kaXIpKTsKKwl9CisKKyAgICAgIC8qIERlY29kZSB0aGUgdGFibGUuICovCisgICAgICB3aGlsZSAoISBlbmRfc2VxdWVuY2UpCisJeworCSAgb3BfY29kZSA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7CisJICBsaW5lX3B0ciArPSAxOworCSAgc3dpdGNoIChvcF9jb2RlKQorCSAgICB7CisJICAgIGNhc2UgRFdfTE5TX2V4dGVuZGVkX29wOgorCSAgICAgIGxpbmVfcHRyICs9IDE7CS8qIGlnbm9yZSBsZW5ndGggKi8KKwkgICAgICBleHRlbmRlZF9vcCA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7CisJICAgICAgbGluZV9wdHIgKz0gMTsKKwkgICAgICBzd2l0Y2ggKGV4dGVuZGVkX29wKQorCQl7CisJCWNhc2UgRFdfTE5FX2VuZF9zZXF1ZW5jZToKKwkJICBlbmRfc2VxdWVuY2UgPSAxOworCQkgIHJlY29yZF9saW5lIChjdXJyZW50X3N1YmZpbGUsIGxpbmUsIGFkZHJlc3MpOworCQkgIGJyZWFrOworCQljYXNlIERXX0xORV9zZXRfYWRkcmVzczoKKwkJICBhZGRyZXNzID0gcmVhZF9hZGRyZXNzIChhYmZkLCBsaW5lX3B0cikgKyBiYXNlYWRkcjsKKwkJICBsaW5lX3B0ciArPSBhZGRyZXNzX3NpemU7CisJCSAgYnJlYWs7CisJCWNhc2UgRFdfTE5FX2RlZmluZV9maWxlOgorCQkgIGN1cl9maWxlID0gcmVhZF9zdHJpbmcgKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7CisJCSAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKKwkJICBpZiAoKGZpbGVzLm51bV9maWxlcyAlIEZJTEVfQUxMT0NfQ0hVTkspID09IDApCisJCSAgICB7CisJCSAgICAgIGZpbGVzLmZpbGVzID0gKHN0cnVjdCBmaWxlaW5mbyAqKQorCQkJeHJlYWxsb2MgKGZpbGVzLmZpbGVzLAorCQkJCSAgKGZpbGVzLm51bV9maWxlcyArIEZJTEVfQUxMT0NfQ0hVTkspCisJCQkJICAgICogc2l6ZW9mIChzdHJ1Y3QgZmlsZWluZm8pKTsKKwkJICAgICAgaWYgKGZpbGVzLm51bV9maWxlcyA9PSAwKQorCQkJbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfY3VycmVudF9jb250ZW50cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlcy5maWxlcyk7CisJCSAgICB9CisJCSAgZmlsZXMuZmlsZXNbZmlsZXMubnVtX2ZpbGVzXS5uYW1lID0gY3VyX2ZpbGU7CisJCSAgZmlsZXMuZmlsZXNbZmlsZXMubnVtX2ZpbGVzXS5kaXIgPQorCQkgICAgcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7CisJCSAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKKwkJICBmaWxlcy5maWxlc1tmaWxlcy5udW1fZmlsZXNdLnRpbWUgPQorCQkgICAgcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7CisJCSAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKKwkJICBmaWxlcy5maWxlc1tmaWxlcy5udW1fZmlsZXNdLnNpemUgPQorCQkgICAgcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7CisJCSAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKKwkJICBmaWxlcy5udW1fZmlsZXMrKzsKKwkJICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICBjb21wbGFpbiAoJmR3YXJmMl9tYW5nbGVkX2xpbmVfbnVtYmVyX3NlY3Rpb24pOworCQkgIGdvdG8gZG9uZTsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIERXX0xOU19jb3B5OgorCSAgICAgIHJlY29yZF9saW5lIChjdXJyZW50X3N1YmZpbGUsIGxpbmUsIGFkZHJlc3MpOworCSAgICAgIGJhc2ljX2Jsb2NrID0gMDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBEV19MTlNfYWR2YW5jZV9wYzoKKwkgICAgICBhZGRyZXNzICs9IGxoLm1pbmltdW1faW5zdHJ1Y3Rpb25fbGVuZ3RoCisJCSogcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7CisJICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBEV19MTlNfYWR2YW5jZV9saW5lOgorCSAgICAgIGxpbmUgKz0gcmVhZF9zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOworCSAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRFdfTE5TX3NldF9maWxlOgorCSAgICAgIC8qIFRoZSBmaWxlIGFuZCBkaXJlY3RvcnkgdGFibGVzIGFyZSAwIGJhc2VkLCB0aGUgcmVmZXJlbmNlcworCQkgYXJlIDEgYmFzZWQuICAqLworCSAgICAgIGZpbGUgPSByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKKwkgICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOworCSAgICAgIGR3YXJmMl9zdGFydF9zdWJmaWxlCisJCShmaWxlcy5maWxlc1tmaWxlIC0gMV0ubmFtZSwKKwkJIChmaWxlcy5maWxlc1tmaWxlIC0gMV0uZGlyCisJCSAgPyBkaXJzLmRpcnNbZmlsZXMuZmlsZXNbZmlsZSAtIDFdLmRpciAtIDFdCisJCSAgOiBjb21wX2RpcikpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIERXX0xOU19zZXRfY29sdW1uOgorCSAgICAgIGNvbHVtbiA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOworCSAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRFdfTE5TX25lZ2F0ZV9zdG10OgorCSAgICAgIGlzX3N0bXQgPSAoIWlzX3N0bXQpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIERXX0xOU19zZXRfYmFzaWNfYmxvY2s6CisJICAgICAgYmFzaWNfYmxvY2sgPSAxOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIERXX0xOU19jb25zdF9hZGRfcGM6CisJICAgICAgYWRkcmVzcyArPSAoMjU1IC0gbGgub3Bjb2RlX2Jhc2UpIC8gbGgubGluZV9yYW5nZTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBEV19MTlNfZml4ZWRfYWR2YW5jZV9wYzoKKwkgICAgICBhZGRyZXNzICs9IHJlYWRfMl9ieXRlcyAoYWJmZCwgbGluZV9wdHIpOworCSAgICAgIGxpbmVfcHRyICs9IDI7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CQkvKiBzcGVjaWFsIG9wZXJhbmQgKi8KKwkgICAgICBhZGpfb3Bjb2RlID0gb3BfY29kZSAtIGxoLm9wY29kZV9iYXNlOworCSAgICAgIGFkZHJlc3MgKz0gKGFkal9vcGNvZGUgLyBsaC5saW5lX3JhbmdlKQorCQkqIGxoLm1pbmltdW1faW5zdHJ1Y3Rpb25fbGVuZ3RoOworCSAgICAgIGxpbmUgKz0gbGgubGluZV9iYXNlICsgKGFkal9vcGNvZGUgJSBsaC5saW5lX3JhbmdlKTsKKwkgICAgICAvKiBhcHBlbmQgcm93IHRvIG1hdHJpeCB1c2luZyBjdXJyZW50IHZhbHVlcyAqLworCSAgICAgIHJlY29yZF9saW5lIChjdXJyZW50X3N1YmZpbGUsIGxpbmUsIGFkZHJlc3MpOworCSAgICAgIGJhc2ljX2Jsb2NrID0gMTsKKwkgICAgfQorCX0KKyAgICB9Citkb25lOgorICBkb19jbGVhbnVwcyAoYmFja190byk7Cit9CisKKy8qIFN0YXJ0IGEgc3ViZmlsZSBmb3IgRFdBUkYuICBGSUxFTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBhbmQKKyAgIERJUk5BTUUgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgRklMRU5BTUUKKyAgIG9yIE5VTEwgaWYgbm90IGtub3duLgorICAgVGhpcyByb3V0aW5lIHRyaWVzIHRvIGtlZXAgbGluZSBudW1iZXJzIGZyb20gaWRlbnRpY2FsIGFic29sdXRlIGFuZAorICAgcmVsYXRpdmUgZmlsZSBuYW1lcyBpbiBhIGNvbW1vbiBzdWJmaWxlLgorCisgICBVc2luZyB0aGUgYGxpc3QnIGV4YW1wbGUgZnJvbSB0aGUgR0RCIHRlc3RzdWl0ZSwgd2hpY2ggcmVzaWRlcyBpbgorICAgL3NyY2RpciBhbmQgY29tcGlsaW5nIGl0IHdpdGggSXJpeDYuMiBjYyBpbiAvY29tcGRpciB1c2luZyBhIGZpbGVuYW1lCisgICBvZiAvc3JjZGlyL2xpc3QwLmMgeWllbGRzIHRoZSBmb2xsb3dpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBsaXN0MC5jOgorCisJRFdfQVRfbmFtZToJCS9zcmNkaXIvbGlzdDAuYworCURXX0FUX2NvbXBfZGlyOgkJL2NvbXBkaXIKKwlmaWxlcy5maWxlc1swXS5uYW1lOglsaXN0MC5oCQkKKwlmaWxlcy5maWxlc1swXS5kaXI6CS9zcmNkaXIKKwlmaWxlcy5maWxlc1sxXS5uYW1lOglsaXN0MC5jCQkKKwlmaWxlcy5maWxlc1sxXS5kaXI6CS9zcmNkaXIKKworICAgVGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBsaXN0MC5jIGhhcyB0byBlbmQgdXAgaW4gYSBzaW5nbGUKKyAgIHN1YmZpbGUsIHNvIHRoYXQgYGJyZWFrIC9zcmNkaXIvbGlzdDAuYzoxJyB3b3JrcyBhcyBleHBlY3RlZC4gICovCisKK3N0YXRpYyB2b2lkCitkd2FyZjJfc3RhcnRfc3ViZmlsZSAoZmlsZW5hbWUsIGRpcm5hbWUpCisgICAgIGNoYXIgKmZpbGVuYW1lOworICAgICBjaGFyICpkaXJuYW1lOworeworICAvKiBJZiB0aGUgZmlsZW5hbWUgaXNuJ3QgYWJzb2x1dGUsIHRyeSB0byBtYXRjaCBhbiBleGlzdGluZyBzdWJmaWxlCisgICAgIHdpdGggdGhlIGZ1bGwgcGF0aG5hbWUuICAqLworCisgIGlmICgqZmlsZW5hbWUgIT0gJy8nICYmIGRpcm5hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3Qgc3ViZmlsZSAqc3ViZmlsZTsKKyAgICAgIGNoYXIgKmZ1bGxuYW1lID0gY29uY2F0IChkaXJuYW1lLCAiLyIsIGZpbGVuYW1lLCBOVUxMKTsKKworICAgICAgZm9yIChzdWJmaWxlID0gc3ViZmlsZXM7IHN1YmZpbGU7IHN1YmZpbGUgPSBzdWJmaWxlLT5uZXh0KQorCXsKKwkgIGlmIChTVFJFUSAoc3ViZmlsZS0+bmFtZSwgZnVsbG5hbWUpKQorCSAgICB7CisJICAgICAgY3VycmVudF9zdWJmaWxlID0gc3ViZmlsZTsKKwkgICAgICBmcmVlIChmdWxsbmFtZSk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJfQorICAgICAgZnJlZSAoZnVsbG5hbWUpOworICAgIH0KKyAgc3RhcnRfc3ViZmlsZSAoZmlsZW5hbWUsIGRpcm5hbWUpOworfQorCisvKiBHaXZlbiBhIHBvaW50ZXIgdG8gYSBEV0FSRiBpbmZvcm1hdGlvbiBlbnRyeSwgZmlndXJlIG91dCBpZiB3ZSBuZWVkCisgICB0byBtYWtlIGEgc3ltYm9sIHRhYmxlIGVudHJ5IGZvciBpdCwgYW5kIGlmIHNvLCBjcmVhdGUgYSBuZXcgZW50cnkKKyAgIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LgorICAgSWYgVFlQRSBpcyBOVUxMLCBkZXRlcm1pbmUgc3ltYm9sIHR5cGUgZnJvbSB0aGUgZGllLCBvdGhlcndpc2UKKyAgIHVzZWQgdGhlIHBhc3NlZCB0eXBlLgorICAqLworCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqCituZXdfc3ltYm9sIChkaWUsIHR5cGUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBkaWVfaW5mbyAqZGllOworICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCBzeW1ib2wgKnN5bSA9IE5VTEw7CisgIGNoYXIgKm5hbWU7CisgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIgPSBOVUxMOworICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyMiA9IE5VTEw7CisgIENPUkVfQUREUiBhZGRyOworCisgIG5hbWUgPSBkd2FyZjJfbGlua2FnZV9uYW1lIChkaWUpOworICBpZiAobmFtZSkKKyAgICB7CisgICAgICBzeW0gPSAoc3RydWN0IHN5bWJvbCAqKSBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssCisJCQkJCSAgICAgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisgICAgICBPQkpTVEFUIChvYmpmaWxlLCBuX3N5bXMrKyk7CisgICAgICBtZW1zZXQgKHN5bSwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisgICAgICBTWU1CT0xfTkFNRSAoc3ltKSA9IG9ic2F2ZXN0cmluZyAobmFtZSwgc3RybGVuIChuYW1lKSwKKwkJCQkJJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrKTsKKworICAgICAgLyogRGVmYXVsdCBhc3N1bXB0aW9ucy4KKwkgVXNlIHRoZSBwYXNzZWQgdHlwZSBvciBkZWNvZGUgaXQgZnJvbSB0aGUgZGllLiAgKi8KKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworICAgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX1NUQVRJQzsKKyAgICAgIGlmICh0eXBlICE9IE5VTEwpCisJU1lNQk9MX1RZUEUgKHN5bSkgPSB0eXBlOworICAgICAgZWxzZQorCVNZTUJPTF9UWVBFIChzeW0pID0gZGllX3R5cGUgKGRpZSwgb2JqZmlsZSk7CisgICAgICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9kZWNsX2xpbmUpOworICAgICAgaWYgKGF0dHIpCisJeworCSAgU1lNQk9MX0xJTkUgKHN5bSkgPSBEV19VTlNORCAoYXR0cik7CisJfQorCisgICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBmcm9tIGEgQysrIGNvbXBpbGF0aW9uLCB0aGVuIGF0dGVtcHQgdG8KKyAgICAgICAgIGNhY2hlIHRoZSBkZW1hbmdsZWQgZm9ybSBmb3IgZnV0dXJlIHJlZmVyZW5jZS4gIFRoaXMgaXMgYQorICAgICAgICAgdHlwaWNhbCB0aW1lIHZlcnN1cyBzcGFjZSB0cmFkZW9mZiwgdGhhdCB3YXMgZGVjaWRlZCBpbiBmYXZvcgorICAgICAgICAgb2YgdGltZSBiZWNhdXNlIGl0IHNwZWQgdXAgQysrIHN5bWJvbCBsb29rdXBzIGJ5IGEgZmFjdG9yIG9mCisgICAgICAgICBhYm91dCAyMC4gKi8KKworICAgICAgU1lNQk9MX0xBTkdVQUdFIChzeW0pID0gY3VfbGFuZ3VhZ2U7CisgICAgICBTWU1CT0xfSU5JVF9ERU1BTkdMRURfTkFNRSAoc3ltLCAmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2spOworICAgICAgc3dpdGNoIChkaWUtPnRhZykKKwl7CisJY2FzZSBEV19UQUdfbGFiZWw6CisJICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9sb3dfcGMpOworCSAgaWYgKGF0dHIpCisJICAgIHsKKwkgICAgICBTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltKSA9IERXX0FERFIgKGF0dHIpICsgYmFzZWFkZHI7CisJICAgIH0KKwkgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19MQUJFTDsKKwkgIGJyZWFrOworCWNhc2UgRFdfVEFHX3N1YnByb2dyYW06CisJICAvKiBTWU1CT0xfQkxPQ0tfVkFMVUUgKHN5bSkgd2lsbCBiZSBmaWxsZWQgaW4gbGF0ZXIgYnkKKwkgICAgIGZpbmlzaF9ibG9jay4gICovCisJICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfQkxPQ0s7CisJICBhdHRyMiA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfZXh0ZXJuYWwpOworCSAgaWYgKGF0dHIyICYmIChEV19VTlNORCAoYXR0cjIpICE9IDApKQorCSAgICB7CisJICAgICAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZnbG9iYWxfc3ltYm9scyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCBsaXN0X2luX3Njb3BlKTsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBEV19UQUdfdmFyaWFibGU6CisJICAvKiBDb21waWxhdGlvbiB3aXRoIG1pbmltYWwgZGVidWcgaW5mbyBtYXkgcmVzdWx0IGluIHZhcmlhYmxlcworCSAgICAgd2l0aCBtaXNzaW5nIHR5cGUgZW50cmllcy4gQ2hhbmdlIHRoZSBtaXNsZWFkaW5nIGB2b2lkJyB0eXBlCisJICAgICB0byBzb21ldGhpbmcgc2Vuc2libGUuICAqLworCSAgaWYgKFRZUEVfQ09ERSAoU1lNQk9MX1RZUEUgKHN5bSkpID09IFRZUEVfQ09ERV9WT0lEKQorCSAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwKKwkJCQkJICAgVEFSR0VUX0lOVF9CSVQgLyBIT1NUX0NIQVJfQklULCAwLAorCQkJCQkgICAiPHZhcmlhYmxlLCBubyBkZWJ1ZyBpbmZvPiIsCisJCQkJCSAgIG9iamZpbGUpOworCSAgYXR0ciA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfY29uc3RfdmFsdWUpOworCSAgaWYgKGF0dHIpCisJICAgIHsKKwkgICAgICBkd2FyZjJfY29uc3RfdmFsdWUgKGF0dHIsIHN5bSwgb2JqZmlsZSk7CisJICAgICAgYXR0cjIgPSBkd2FyZl9hdHRyIChkaWUsIERXX0FUX2V4dGVybmFsKTsKKwkgICAgICBpZiAoYXR0cjIgJiYgKERXX1VOU05EIChhdHRyMikgIT0gMCkpCisJCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZ2xvYmFsX3N5bWJvbHMpOworCSAgICAgIGVsc2UKKwkJYWRkX3N5bWJvbF90b19saXN0IChzeW0sIGxpc3RfaW5fc2NvcGUpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9sb2NhdGlvbik7CisJICBpZiAoYXR0cikKKwkgICAgeworCSAgICAgIGF0dHIyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9leHRlcm5hbCk7CisJICAgICAgaWYgKGF0dHIyICYmIChEV19VTlNORCAoYXR0cjIpICE9IDApKQorCQl7CisJCSAgU1lNQk9MX1ZBTFVFX0FERFJFU1MgKHN5bSkgPQorCQkgICAgZGVjb2RlX2xvY2Rlc2MgKERXX0JMT0NLIChhdHRyKSwgb2JqZmlsZSk7CisJCSAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZnbG9iYWxfc3ltYm9scyk7CisKKwkgCSAgLyogSW4gc2hhcmVkIGxpYnJhcmllcyB0aGUgYWRkcmVzcyBvZiB0aGUgdmFyaWFibGUKKwkJICAgICBpbiB0aGUgbG9jYXRpb24gZGVzY3JpcHRvciBtaWdodCBzdGlsbCBiZSByZWxvY2F0YWJsZSwKKwkJICAgICBzbyBpdHMgdmFsdWUgY291bGQgYmUgemVyby4KKwkJICAgICBFbnRlciB0aGUgc3ltYm9sIGFzIGEgTE9DX1VOUkVTT0xWRUQgc3ltYm9sLCBpZiBpdHMKKwkJICAgICB2YWx1ZSBpcyB6ZXJvLCB0aGUgYWRkcmVzcyBvZiB0aGUgdmFyaWFibGUgd2lsbCB0aGVuCisJCSAgICAgYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZSB3aGVuZXZlcgorCQkgICAgIHRoZSB2YXJpYWJsZSBpcyByZWZlcmVuY2VkLiAgKi8KKwkJICBpZiAoU1lNQk9MX1ZBTFVFX0FERFJFU1MgKHN5bSkpCisJCSAgICB7CisJCSAgICAgIFNZTUJPTF9WQUxVRV9BRERSRVNTIChzeW0pICs9IGJhc2VhZGRyOworCQkgICAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfU1RBVElDOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19VTlJFU09MVkVEOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgU1lNQk9MX1ZBTFVFIChzeW0pID0gYWRkciA9CisJCSAgICBkZWNvZGVfbG9jZGVzYyAoRFdfQkxPQ0sgKGF0dHIpLCBvYmpmaWxlKTsKKwkJICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgbGlzdF9pbl9zY29wZSk7CisJCSAgaWYgKG9wdGltaXplZF9vdXQpCisJCSAgICB7CisJCSAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19PUFRJTUlaRURfT1VUOworCQkgICAgfQorCQkgIGVsc2UgaWYgKGlzcmVnKQorCQkgICAgeworCQkgICAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfUkVHSVNURVI7CisJCSAgICB9CisJCSAgZWxzZSBpZiAob2ZmcmVnKQorCQkgICAgeworCQkgICAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfQkFTRVJFRzsKKwkJICAgICAgU1lNQk9MX0JBU0VSRUcgKHN5bSkgPSBiYXNlcmVnOworCQkgICAgfQorCQkgIGVsc2UgaWYgKGlzbG9jYWwpCisJCSAgICB7CisJCSAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19MT0NBTDsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19TVEFUSUM7CisJCSAgICAgIFNZTUJPTF9WQUxVRV9BRERSRVNTIChzeW0pID0gYWRkciArIGJhc2VhZGRyOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFdlIGRvIG5vdCBrbm93IHRoZSBhZGRyZXNzIG9mIHRoaXMgc3ltYm9sLgorCQkgSWYgaXQgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sIGFuZCB3ZSBoYXZlIHR5cGUgaW5mb3JtYXRpb24KKwkJIGZvciBpdCwgZW50ZXIgdGhlIHN5bWJvbCBhcyBhIExPQ19VTlJFU09MVkVEIHN5bWJvbC4KKwkJIFRoZSBhZGRyZXNzIG9mIHRoZSB2YXJpYWJsZSB3aWxsIHRoZW4gYmUgZGV0ZXJtaW5lZCBmcm9tCisJCSB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGUgd2hlbmV2ZXIgdGhlIHZhcmlhYmxlIGlzCisJCSByZWZlcmVuY2VkLiAgKi8KKwkgICAgICBhdHRyMiA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfZXh0ZXJuYWwpOworCSAgICAgIGlmIChhdHRyMiAmJiAoRFdfVU5TTkQgKGF0dHIyKSAhPSAwKQorCQkgICYmIGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfdHlwZSkgIT0gTlVMTCkKKwkJeworCQkgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19VTlJFU09MVkVEOworCQkgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZ2xvYmFsX3N5bWJvbHMpOworCQl9CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXI6CisJICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9sb2NhdGlvbik7CisJICBpZiAoYXR0cikKKwkgICAgeworCSAgICAgIFNZTUJPTF9WQUxVRSAoc3ltKSA9IGRlY29kZV9sb2NkZXNjIChEV19CTE9DSyAoYXR0ciksIG9iamZpbGUpOworCSAgICAgIGlmIChpc3JlZykKKwkJeworCQkgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19SRUdQQVJNOworCQl9CisJICAgICAgZWxzZSBpZiAob2ZmcmVnKQorCQl7CisJCSAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0JBU0VSRUdfQVJHOworCQkgIFNZTUJPTF9CQVNFUkVHIChzeW0pID0gYmFzZXJlZzsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19BUkc7CisJCX0KKwkgICAgfQorCSAgYXR0ciA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfY29uc3RfdmFsdWUpOworCSAgaWYgKGF0dHIpCisJICAgIHsKKwkgICAgICBkd2FyZjJfY29uc3RfdmFsdWUgKGF0dHIsIHN5bSwgb2JqZmlsZSk7CisJICAgIH0KKwkgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCBsaXN0X2luX3Njb3BlKTsKKwkgIGJyZWFrOworCWNhc2UgRFdfVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnM6CisJICAvKiBGcm9tIHZhcmFyZ3MgZnVuY3Rpb25zOyBnZGIgZG9lc24ndCBzZWVtIHRvIGhhdmUgYW55CisJICAgICBpbnRlcmVzdCBpbiB0aGlzIGluZm9ybWF0aW9uLCBzbyBqdXN0IGlnbm9yZSBpdCBmb3Igbm93LgorCSAgICAgKEZJWE1FPykgKi8KKwkgIGJyZWFrOworCWNhc2UgRFdfVEFHX2NsYXNzX3R5cGU6CisJY2FzZSBEV19UQUdfc3RydWN0dXJlX3R5cGU6CisJY2FzZSBEV19UQUdfdW5pb25fdHlwZToKKwljYXNlIERXX1RBR19lbnVtZXJhdGlvbl90eXBlOgorCSAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX1RZUEVERUY7CisJICBTWU1CT0xfTkFNRVNQQUNFIChzeW0pID0gU1RSVUNUX05BTUVTUEFDRTsKKwkgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCBsaXN0X2luX3Njb3BlKTsKKworCSAgLyogVGhlIHNlbWFudGljcyBvZiBDKysgc3RhdGUgdGhhdCAic3RydWN0IGZvbyB7IC4uLiB9IiBhbHNvCisJICAgICBkZWZpbmVzIGEgdHlwZWRlZiBmb3IgImZvbyIuIFN5bnRoZXNpemUgYSB0eXBlZGVmIHN5bWJvbCBzbworCSAgICAgdGhhdCAicHR5cGUgZm9vIiB3b3JrcyBhcyBleHBlY3RlZC4gICovCisJICBpZiAoY3VfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfY3BsdXMpCisJICAgIHsKKwkgICAgICBzdHJ1Y3Qgc3ltYm9sICp0eXBlZGVmX3N5bSA9IChzdHJ1Y3Qgc3ltYm9sICopCisJCW9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywKKwkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBzeW1ib2wpKTsKKwkgICAgICAqdHlwZWRlZl9zeW0gPSAqc3ltOworCSAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHR5cGVkZWZfc3ltKSA9IFZBUl9OQU1FU1BBQ0U7CisJICAgICAgaWYgKFRZUEVfTkFNRSAoU1lNQk9MX1RZUEUgKHN5bSkpID09IDApCisJCVRZUEVfTkFNRSAoU1lNQk9MX1RZUEUgKHN5bSkpID0KKwkJICBvYnNhdmVzdHJpbmcgKFNZTUJPTF9OQU1FIChzeW0pLAorCQkJCXN0cmxlbiAoU1lNQk9MX05BTUUgKHN5bSkpLAorCQkJCSZvYmpmaWxlLT50eXBlX29ic3RhY2spOworCSAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAodHlwZWRlZl9zeW0sIGxpc3RfaW5fc2NvcGUpOworCSAgICB9CisJICBicmVhazsKKwljYXNlIERXX1RBR190eXBlZGVmOgorCWNhc2UgRFdfVEFHX2Jhc2VfdHlwZToKKwkgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19UWVBFREVGOworCSAgU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9IFZBUl9OQU1FU1BBQ0U7CisJICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgbGlzdF9pbl9zY29wZSk7CisJICBicmVhazsKKwljYXNlIERXX1RBR19lbnVtZXJhdG9yOgorCSAgYXR0ciA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfY29uc3RfdmFsdWUpOworCSAgaWYgKGF0dHIpCisJICAgIHsKKwkgICAgICBkd2FyZjJfY29uc3RfdmFsdWUgKGF0dHIsIHN5bSwgb2JqZmlsZSk7CisJICAgIH0KKwkgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCBsaXN0X2luX3Njb3BlKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICAvKiBOb3QgYSB0YWcgd2UgcmVjb2duaXplLiAgSG9wZWZ1bGx5IHdlIGFyZW4ndCBwcm9jZXNzaW5nCisJICAgICB0cmFzaCBkYXRhLCBidXQgc2luY2Ugd2UgbXVzdCBzcGVjaWZpY2FsbHkgaWdub3JlIHRoaW5ncworCSAgICAgd2UgZG9uJ3QgcmVjb2duaXplLCB0aGVyZSBpcyBub3RoaW5nIGVsc2Ugd2Ugc2hvdWxkIGRvIGF0CisJICAgICB0aGlzIHBvaW50LiAqLworCSAgY29tcGxhaW4gKCZkd2FyZjJfdW5zdXBwb3J0ZWRfdGFnLCBkd2FyZl90YWdfbmFtZSAoZGllLT50YWcpKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIHJldHVybiAoc3ltKTsKK30KKworLyogQ29weSBjb25zdGFudCB2YWx1ZSBmcm9tIGFuIGF0dHJpYnV0ZSB0byBhIHN5bWJvbC4gICovCisKK3N0YXRpYyB2b2lkCitkd2FyZjJfY29uc3RfdmFsdWUgKGF0dHIsIHN5bSwgb2JqZmlsZSkKKyAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cjsKKyAgICAgc3RydWN0IHN5bWJvbCAqc3ltOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IGR3YXJmX2Jsb2NrICpibGs7CisKKyAgc3dpdGNoIChhdHRyLT5mb3JtKQorICAgIHsKKyAgICBjYXNlIERXX0ZPUk1fYWRkcjoKKyAgICAgIGlmIChUWVBFX0xFTkdUSCAoU1lNQk9MX1RZUEUgKHN5bSkpICE9ICh1bnNpZ25lZCBpbnQpIGFkZHJlc3Nfc2l6ZSkKKwljb21wbGFpbiAoJmR3YXJmMl9jb25zdF92YWx1ZV9sZW5ndGhfbWlzbWF0Y2gsIFNZTUJPTF9OQU1FIChzeW0pLAorCQkgIGFkZHJlc3Nfc2l6ZSwgVFlQRV9MRU5HVEggKFNZTUJPTF9UWVBFIChzeW0pKSk7CisgICAgICBTWU1CT0xfVkFMVUVfQllURVMgKHN5bSkgPSAoY2hhciAqKQorCW9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywgYWRkcmVzc19zaXplKTsKKyAgICAgIHN0b3JlX2FkZHJlc3MgKFNZTUJPTF9WQUxVRV9CWVRFUyAoc3ltKSwgYWRkcmVzc19zaXplLCBEV19BRERSIChhdHRyKSk7CisgICAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfQ09OU1RfQllURVM7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX0ZPUk1fYmxvY2sxOgorICAgIGNhc2UgRFdfRk9STV9ibG9jazI6CisgICAgY2FzZSBEV19GT1JNX2Jsb2NrNDoKKyAgICBjYXNlIERXX0ZPUk1fYmxvY2s6CisgICAgICBibGsgPSBEV19CTE9DSyAoYXR0cik7CisgICAgICBpZiAoVFlQRV9MRU5HVEggKFNZTUJPTF9UWVBFIChzeW0pKSAhPSBibGstPnNpemUpCisJY29tcGxhaW4gKCZkd2FyZjJfY29uc3RfdmFsdWVfbGVuZ3RoX21pc21hdGNoLCBTWU1CT0xfTkFNRSAoc3ltKSwKKwkJICBibGstPnNpemUsIFRZUEVfTEVOR1RIIChTWU1CT0xfVFlQRSAoc3ltKSkpOworICAgICAgU1lNQk9MX1ZBTFVFX0JZVEVTIChzeW0pID0gKGNoYXIgKikKKwlvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssIGJsay0+c2l6ZSk7CisgICAgICBtZW1jcHkgKFNZTUJPTF9WQUxVRV9CWVRFUyAoc3ltKSwgYmxrLT5kYXRhLCBibGstPnNpemUpOworICAgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0NPTlNUX0JZVEVTOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19GT1JNX2RhdGEyOgorICAgIGNhc2UgRFdfRk9STV9kYXRhNDoKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTg6CisgICAgY2FzZSBEV19GT1JNX2RhdGExOgorICAgIGNhc2UgRFdfRk9STV9zZGF0YToKKyAgICBjYXNlIERXX0ZPUk1fdWRhdGE6CisgICAgICBTWU1CT0xfVkFMVUUgKHN5bSkgPSBEV19VTlNORCAoYXR0cik7CisgICAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfQ09OU1Q7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgY29tcGxhaW4gKCZkd2FyZjJfdW5zdXBwb3J0ZWRfY29uc3RfdmFsdWVfYXR0ciwKKwkJZHdhcmZfZm9ybV9uYW1lIChhdHRyLT5mb3JtKSk7CisgICAgICBTWU1CT0xfVkFMVUUgKHN5bSkgPSAwOworICAgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0NPTlNUOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGRpZSBpbiBxdWVzdGlvbiB1c2luZyBpdHMgRFdfQVRfdHlwZSBhdHRyaWJ1dGUuICAqLworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorZGllX3R5cGUgKGRpZSwgb2JqZmlsZSkKKyAgICAgc3RydWN0IGRpZV9pbmZvICpkaWU7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgc3RydWN0IGF0dHJpYnV0ZSAqdHlwZV9hdHRyOworICBzdHJ1Y3QgZGllX2luZm8gKnR5cGVfZGllOworICB1bnNpZ25lZCBpbnQgcmVmOworCisgIHR5cGVfYXR0ciA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfdHlwZSk7CisgIGlmICghdHlwZV9hdHRyKQorICAgIHsKKyAgICAgIC8qIEEgbWlzc2luZyBEV19BVF90eXBlIHJlcHJlc2VudHMgYSB2b2lkIHR5cGUuICAqLworICAgICAgcmV0dXJuIGR3YXJmMl9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCBGVF9WT0lEKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZWYgPSBkd2FyZjJfZ2V0X3JlZl9kaWVfb2Zmc2V0ICh0eXBlX2F0dHIpOworICAgICAgdHlwZV9kaWUgPSBmb2xsb3dfZGllX3JlZiAocmVmKTsKKyAgICAgIGlmICghdHlwZV9kaWUpCisJeworCSAgZXJyb3IgKCJEd2FyZiBFcnJvcjogQ2Fubm90IGZpbmQgcmVmZXJlbnQgYXQgb2Zmc2V0ICVkLiIsIHJlZik7CisJICByZXR1cm4gTlVMTDsKKwl9CisgICAgfQorICB0eXBlID0gdGFnX3R5cGVfdG9fdHlwZSAodHlwZV9kaWUsIG9iamZpbGUpOworICBpZiAoIXR5cGUpCisgICAgeworICAgICAgZHVtcF9kaWUgKHR5cGVfZGllKTsKKyAgICAgIGVycm9yICgiRHdhcmYgRXJyb3I6IFByb2JsZW0gdHVybmluZyB0eXBlIGRpZSBhdCBvZmZzZXQgaW50byBnZGIgdHlwZS4iKTsKKyAgICB9CisgIHJldHVybiB0eXBlOworfQorCisvKiBSZXR1cm4gdGhlIGNvbnRhaW5pbmcgdHlwZSBvZiB0aGUgZGllIGluIHF1ZXN0aW9uIHVzaW5nIGl0cworICAgRFdfQVRfY29udGFpbmluZ190eXBlIGF0dHJpYnV0ZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitkaWVfY29udGFpbmluZ190eXBlIChkaWUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBkaWVfaW5mbyAqZGllOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IHR5cGUgKnR5cGUgPSBOVUxMOworICBzdHJ1Y3QgYXR0cmlidXRlICp0eXBlX2F0dHI7CisgIHN0cnVjdCBkaWVfaW5mbyAqdHlwZV9kaWUgPSBOVUxMOworICB1bnNpZ25lZCBpbnQgcmVmOworCisgIHR5cGVfYXR0ciA9IGR3YXJmX2F0dHIgKGRpZSwgRFdfQVRfY29udGFpbmluZ190eXBlKTsKKyAgaWYgKHR5cGVfYXR0cikKKyAgICB7CisgICAgICByZWYgPSBkd2FyZjJfZ2V0X3JlZl9kaWVfb2Zmc2V0ICh0eXBlX2F0dHIpOworICAgICAgdHlwZV9kaWUgPSBmb2xsb3dfZGllX3JlZiAocmVmKTsKKyAgICAgIGlmICghdHlwZV9kaWUpCisJeworCSAgZXJyb3IgKCJEd2FyZiBFcnJvcjogQ2Fubm90IGZpbmQgcmVmZXJlbnQgYXQgb2Zmc2V0ICVkLiIsIHJlZik7CisJICByZXR1cm4gTlVMTDsKKwl9CisgICAgICB0eXBlID0gdGFnX3R5cGVfdG9fdHlwZSAodHlwZV9kaWUsIG9iamZpbGUpOworICAgIH0KKyAgaWYgKCF0eXBlKQorICAgIHsKKyAgICAgIGlmICh0eXBlX2RpZSkKKwlkdW1wX2RpZSAodHlwZV9kaWUpOworICAgICAgZXJyb3IgKCJEd2FyZiBFcnJvcjogUHJvYmxlbSB0dXJuaW5nIGNvbnRhaW5pbmcgdHlwZSBpbnRvIGdkYiB0eXBlLiIpOworICAgIH0KKyAgcmV0dXJuIHR5cGU7Cit9CisKKyNpZiAwCitzdGF0aWMgc3RydWN0IHR5cGUgKgordHlwZV9hdF9vZmZzZXQgKG9mZnNldCwgb2JqZmlsZSkKKyAgICAgdW5zaWduZWQgaW50IG9mZnNldDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCBkaWVfaW5mbyAqZGllOworICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKworICBkaWUgPSBmb2xsb3dfZGllX3JlZiAob2Zmc2V0KTsKKyAgaWYgKCFkaWUpCisgICAgeworICAgICAgZXJyb3IgKCJEd2FyZiBFcnJvcjogQ2Fubm90IGZpbmQgdHlwZSByZWZlcmVudCBhdCBvZmZzZXQgJWQuIiwgb2Zmc2V0KTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgdHlwZSA9IHRhZ190eXBlX3RvX3R5cGUgKGRpZSwgb2JqZmlsZSk7CisgIHJldHVybiB0eXBlOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCit0YWdfdHlwZV90b190eXBlIChkaWUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBkaWVfaW5mbyAqZGllOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaWYgKGRpZS0+dHlwZSkKKyAgICB7CisgICAgICByZXR1cm4gZGllLT50eXBlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJlYWRfdHlwZV9kaWUgKGRpZSwgb2JqZmlsZSk7CisgICAgICBpZiAoIWRpZS0+dHlwZSkKKwl7CisJICBkdW1wX2RpZSAoZGllKTsKKwkgIGVycm9yICgiRHdhcmYgRXJyb3I6IENhbm5vdCBmaW5kIHR5cGUgb2YgZGllLiIpOworCX0KKyAgICAgIHJldHVybiBkaWUtPnR5cGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcmVhZF90eXBlX2RpZSAoZGllLCBvYmpmaWxlKQorICAgICBzdHJ1Y3QgZGllX2luZm8gKmRpZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN3aXRjaCAoZGllLT50YWcpCisgICAgeworICAgIGNhc2UgRFdfVEFHX2NsYXNzX3R5cGU6CisgICAgY2FzZSBEV19UQUdfc3RydWN0dXJlX3R5cGU6CisgICAgY2FzZSBEV19UQUdfdW5pb25fdHlwZToKKyAgICAgIHJlYWRfc3RydWN0dXJlX3Njb3BlIChkaWUsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19UQUdfZW51bWVyYXRpb25fdHlwZToKKyAgICAgIHJlYWRfZW51bWVyYXRpb24gKGRpZSwgb2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX1RBR19zdWJwcm9ncmFtOgorICAgIGNhc2UgRFdfVEFHX3N1YnJvdXRpbmVfdHlwZToKKyAgICAgIHJlYWRfc3Vicm91dGluZV90eXBlIChkaWUsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19UQUdfYXJyYXlfdHlwZToKKyAgICAgIHJlYWRfYXJyYXlfdHlwZSAoZGllLCBvYmpmaWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfVEFHX3BvaW50ZXJfdHlwZToKKyAgICAgIHJlYWRfdGFnX3BvaW50ZXJfdHlwZSAoZGllLCBvYmpmaWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZToKKyAgICAgIHJlYWRfdGFnX3B0cl90b19tZW1iZXJfdHlwZSAoZGllLCBvYmpmaWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfVEFHX3JlZmVyZW5jZV90eXBlOgorICAgICAgcmVhZF90YWdfcmVmZXJlbmNlX3R5cGUgKGRpZSwgb2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX1RBR19jb25zdF90eXBlOgorICAgICAgcmVhZF90YWdfY29uc3RfdHlwZSAoZGllLCBvYmpmaWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfVEFHX3ZvbGF0aWxlX3R5cGU6CisgICAgICByZWFkX3RhZ192b2xhdGlsZV90eXBlIChkaWUsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19UQUdfc3RyaW5nX3R5cGU6CisgICAgICByZWFkX3RhZ19zdHJpbmdfdHlwZSAoZGllLCBvYmpmaWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRFdfVEFHX3R5cGVkZWY6CisgICAgICByZWFkX3R5cGVkZWYgKGRpZSwgb2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIERXX1RBR19iYXNlX3R5cGU6CisgICAgICByZWFkX2Jhc2VfdHlwZSAoZGllLCBvYmpmaWxlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBjb21wbGFpbiAoJmR3YXJmMl91bmV4cGVjdGVkX3RhZywgZHdhcmZfdGFnX25hbWUgKGRpZS0+dGFnKSk7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitkd2FyZl9iYXNlX3R5cGUgKGVuY29kaW5nLCBzaXplLCBvYmpmaWxlKQorICAgICBpbnQgZW5jb2Rpbmc7CisgICAgIGludCBzaXplOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgLyogRklYTUUgLSB0aGlzIHNob3VsZCBub3QgcHJvZHVjZSBhIG5ldyAoc3RydWN0IHR5cGUgKikKKyAgICAgZXZlcnkgdGltZS4gIEl0IHNob3VsZCBjYWNoZSBiYXNlIHR5cGVzLiAgKi8KKyAgc3RydWN0IHR5cGUgKnR5cGU7CisgIHN3aXRjaCAoZW5jb2RpbmcpCisgICAgeworICAgIGNhc2UgRFdfQVRFX2FkZHJlc3M6CisgICAgICB0eXBlID0gZHdhcmYyX2Z1bmRhbWVudGFsX3R5cGUgKG9iamZpbGUsIEZUX1ZPSUQpOworICAgICAgcmV0dXJuIHR5cGU7CisgICAgY2FzZSBEV19BVEVfYm9vbGVhbjoKKyAgICAgIHR5cGUgPSBkd2FyZjJfZnVuZGFtZW50YWxfdHlwZSAob2JqZmlsZSwgRlRfQk9PTEVBTik7CisgICAgICByZXR1cm4gdHlwZTsKKyAgICBjYXNlIERXX0FURV9jb21wbGV4X2Zsb2F0OgorICAgICAgaWYgKHNpemUgPT0gMTYpCisJeworCSAgdHlwZSA9IGR3YXJmMl9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCBGVF9EQkxfUFJFQ19DT01QTEVYKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdHlwZSA9IGR3YXJmMl9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCBGVF9DT01QTEVYKTsKKwl9CisgICAgICByZXR1cm4gdHlwZTsKKyAgICBjYXNlIERXX0FURV9mbG9hdDoKKyAgICAgIGlmIChzaXplID09IDgpCisJeworCSAgdHlwZSA9IGR3YXJmMl9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCBGVF9EQkxfUFJFQ19GTE9BVCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHR5cGUgPSBkd2FyZjJfZnVuZGFtZW50YWxfdHlwZSAob2JqZmlsZSwgRlRfRkxPQVQpOworCX0KKyAgICAgIHJldHVybiB0eXBlOworICAgIGNhc2UgRFdfQVRFX3NpZ25lZDoKKyAgICAgIHN3aXRjaCAoc2l6ZSkKKwl7CisJY2FzZSAxOgorCSAgdHlwZSA9IGR3YXJmMl9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCBGVF9TSUdORURfQ0hBUik7CisJICBicmVhazsKKwljYXNlIDI6CisJICB0eXBlID0gZHdhcmYyX2Z1bmRhbWVudGFsX3R5cGUgKG9iamZpbGUsIEZUX1NJR05FRF9TSE9SVCk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgNDoKKwkgIHR5cGUgPSBkd2FyZjJfZnVuZGFtZW50YWxfdHlwZSAob2JqZmlsZSwgRlRfU0lHTkVEX0lOVEVHRVIpOworCSAgYnJlYWs7CisJfQorICAgICAgcmV0dXJuIHR5cGU7CisgICAgY2FzZSBEV19BVEVfc2lnbmVkX2NoYXI6CisgICAgICB0eXBlID0gZHdhcmYyX2Z1bmRhbWVudGFsX3R5cGUgKG9iamZpbGUsIEZUX1NJR05FRF9DSEFSKTsKKyAgICAgIHJldHVybiB0eXBlOworICAgIGNhc2UgRFdfQVRFX3Vuc2lnbmVkOgorICAgICAgc3dpdGNoIChzaXplKQorCXsKKwljYXNlIDE6CisJICB0eXBlID0gZHdhcmYyX2Z1bmRhbWVudGFsX3R5cGUgKG9iamZpbGUsIEZUX1VOU0lHTkVEX0NIQVIpOworCSAgYnJlYWs7CisJY2FzZSAyOgorCSAgdHlwZSA9IGR3YXJmMl9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCBGVF9VTlNJR05FRF9TSE9SVCk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgNDoKKwkgIHR5cGUgPSBkd2FyZjJfZnVuZGFtZW50YWxfdHlwZSAob2JqZmlsZSwgRlRfVU5TSUdORURfSU5URUdFUik7CisJICBicmVhazsKKwl9CisgICAgICByZXR1cm4gdHlwZTsKKyAgICBjYXNlIERXX0FURV91bnNpZ25lZF9jaGFyOgorICAgICAgdHlwZSA9IGR3YXJmMl9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCBGVF9VTlNJR05FRF9DSEFSKTsKKyAgICAgIHJldHVybiB0eXBlOworICAgIGRlZmF1bHQ6CisgICAgICB0eXBlID0gZHdhcmYyX2Z1bmRhbWVudGFsX3R5cGUgKG9iamZpbGUsIEZUX1NJR05FRF9JTlRFR0VSKTsKKyAgICAgIHJldHVybiB0eXBlOworICAgIH0KK30KKworI2lmIDAKK3N0cnVjdCBkaWVfaW5mbyAqCitjb3B5X2RpZSAob2xkX2RpZSkKKyAgICAgc3RydWN0IGRpZV9pbmZvICpvbGRfZGllOworeworICBzdHJ1Y3QgZGllX2luZm8gKm5ld19kaWU7CisgIGludCBpLCBudW1fYXR0cnM7CisKKyAgbmV3X2RpZSA9IChzdHJ1Y3QgZGllX2luZm8gKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZGllX2luZm8pKTsKKyAgbWVtc2V0IChuZXdfZGllLCAwLCBzaXplb2YgKHN0cnVjdCBkaWVfaW5mbykpOworCisgIG5ld19kaWUtPnRhZyA9IG9sZF9kaWUtPnRhZzsKKyAgbmV3X2RpZS0+aGFzX2NoaWxkcmVuID0gb2xkX2RpZS0+aGFzX2NoaWxkcmVuOworICBuZXdfZGllLT5hYmJyZXYgPSBvbGRfZGllLT5hYmJyZXY7CisgIG5ld19kaWUtPm9mZnNldCA9IG9sZF9kaWUtPm9mZnNldDsKKyAgbmV3X2RpZS0+dHlwZSA9IE5VTEw7CisKKyAgbnVtX2F0dHJzID0gb2xkX2RpZS0+bnVtX2F0dHJzOworICBuZXdfZGllLT5udW1fYXR0cnMgPSBudW1fYXR0cnM7CisgIG5ld19kaWUtPmF0dHJzID0gKHN0cnVjdCBhdHRyaWJ1dGUgKikKKyAgICB4bWFsbG9jIChudW1fYXR0cnMgKiBzaXplb2YgKHN0cnVjdCBhdHRyaWJ1dGUpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgb2xkX2RpZS0+bnVtX2F0dHJzOyArK2kpCisgICAgeworICAgICAgbmV3X2RpZS0+YXR0cnNbaV0ubmFtZSA9IG9sZF9kaWUtPmF0dHJzW2ldLm5hbWU7CisgICAgICBuZXdfZGllLT5hdHRyc1tpXS5mb3JtID0gb2xkX2RpZS0+YXR0cnNbaV0uZm9ybTsKKyAgICAgIG5ld19kaWUtPmF0dHJzW2ldLnUuYWRkciA9IG9sZF9kaWUtPmF0dHJzW2ldLnUuYWRkcjsKKyAgICB9CisKKyAgbmV3X2RpZS0+bmV4dCA9IE5VTEw7CisgIHJldHVybiBuZXdfZGllOworfQorI2VuZGlmCisKKy8qIFJldHVybiBzaWJsaW5nIG9mIGRpZSwgTlVMTCBpZiBubyBzaWJsaW5nLiAgKi8KKworc3RydWN0IGRpZV9pbmZvICoKK3NpYmxpbmdfZGllIChkaWUpCisgICAgIHN0cnVjdCBkaWVfaW5mbyAqZGllOworeworICBpbnQgbmVzdGluZ19sZXZlbCA9IDA7CisKKyAgaWYgKCFkaWUtPmhhc19jaGlsZHJlbikKKyAgICB7CisgICAgICBpZiAoZGllLT5uZXh0ICYmIChkaWUtPm5leHQtPnRhZyA9PSAwKSkKKwl7CisJICByZXR1cm4gTlVMTDsKKwl9CisgICAgICBlbHNlCisJeworCSAgcmV0dXJuIGRpZS0+bmV4dDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZG8KKwl7CisJICBpZiAoZGllLT5oYXNfY2hpbGRyZW4pCisJICAgIHsKKwkgICAgICBuZXN0aW5nX2xldmVsKys7CisJICAgIH0KKwkgIGlmIChkaWUtPnRhZyA9PSAwKQorCSAgICB7CisJICAgICAgbmVzdGluZ19sZXZlbC0tOworCSAgICB9CisJICBkaWUgPSBkaWUtPm5leHQ7CisJfQorICAgICAgd2hpbGUgKG5lc3RpbmdfbGV2ZWwpOworICAgICAgaWYgKGRpZSAmJiAoZGllLT50YWcgPT0gMCkpCisJeworCSAgcmV0dXJuIE5VTEw7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHJldHVybiBkaWU7CisJfQorICAgIH0KK30KKworLyogR2V0IGxpbmthZ2UgbmFtZSBvZiBhIGRpZSwgcmV0dXJuIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KKworc3RhdGljIGNoYXIgKgorZHdhcmYyX2xpbmthZ2VfbmFtZSAoZGllKQorICAgICBzdHJ1Y3QgZGllX2luZm8gKmRpZTsKK3sKKyAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cjsKKworICBhdHRyID0gZHdhcmZfYXR0ciAoZGllLCBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSk7CisgIGlmIChhdHRyICYmIERXX1NUUklORyAoYXR0cikpCisgICAgcmV0dXJuIERXX1NUUklORyAoYXR0cik7CisgIGF0dHIgPSBkd2FyZl9hdHRyIChkaWUsIERXX0FUX25hbWUpOworICBpZiAoYXR0ciAmJiBEV19TVFJJTkcgKGF0dHIpKQorICAgIHJldHVybiBEV19TVFJJTkcgKGF0dHIpOworICByZXR1cm4gTlVMTDsKK30KKworLyogQ29udmVydCBhIERJRSB0YWcgaW50byBpdHMgc3RyaW5nIG5hbWUuICAqLworCitzdGF0aWMgY2hhciAqCitkd2FyZl90YWdfbmFtZSAodGFnKQorICAgICByZWdpc3RlciB1bnNpZ25lZCB0YWc7Cit7CisgIHN3aXRjaCAodGFnKQorICAgIHsKKyAgICBjYXNlIERXX1RBR19wYWRkaW5nOgorICAgICAgcmV0dXJuICJEV19UQUdfcGFkZGluZyI7CisgICAgY2FzZSBEV19UQUdfYXJyYXlfdHlwZToKKyAgICAgIHJldHVybiAiRFdfVEFHX2FycmF5X3R5cGUiOworICAgIGNhc2UgRFdfVEFHX2NsYXNzX3R5cGU6CisgICAgICByZXR1cm4gIkRXX1RBR19jbGFzc190eXBlIjsKKyAgICBjYXNlIERXX1RBR19lbnRyeV9wb2ludDoKKyAgICAgIHJldHVybiAiRFdfVEFHX2VudHJ5X3BvaW50IjsKKyAgICBjYXNlIERXX1RBR19lbnVtZXJhdGlvbl90eXBlOgorICAgICAgcmV0dXJuICJEV19UQUdfZW51bWVyYXRpb25fdHlwZSI7CisgICAgY2FzZSBEV19UQUdfZm9ybWFsX3BhcmFtZXRlcjoKKyAgICAgIHJldHVybiAiRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIiOworICAgIGNhc2UgRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uOgorICAgICAgcmV0dXJuICJEV19UQUdfaW1wb3J0ZWRfZGVjbGFyYXRpb24iOworICAgIGNhc2UgRFdfVEFHX2xhYmVsOgorICAgICAgcmV0dXJuICJEV19UQUdfbGFiZWwiOworICAgIGNhc2UgRFdfVEFHX2xleGljYWxfYmxvY2s6CisgICAgICByZXR1cm4gIkRXX1RBR19sZXhpY2FsX2Jsb2NrIjsKKyAgICBjYXNlIERXX1RBR19tZW1iZXI6CisgICAgICByZXR1cm4gIkRXX1RBR19tZW1iZXIiOworICAgIGNhc2UgRFdfVEFHX3BvaW50ZXJfdHlwZToKKyAgICAgIHJldHVybiAiRFdfVEFHX3BvaW50ZXJfdHlwZSI7CisgICAgY2FzZSBEV19UQUdfcmVmZXJlbmNlX3R5cGU6CisgICAgICByZXR1cm4gIkRXX1RBR19yZWZlcmVuY2VfdHlwZSI7CisgICAgY2FzZSBEV19UQUdfY29tcGlsZV91bml0OgorICAgICAgcmV0dXJuICJEV19UQUdfY29tcGlsZV91bml0IjsKKyAgICBjYXNlIERXX1RBR19zdHJpbmdfdHlwZToKKyAgICAgIHJldHVybiAiRFdfVEFHX3N0cmluZ190eXBlIjsKKyAgICBjYXNlIERXX1RBR19zdHJ1Y3R1cmVfdHlwZToKKyAgICAgIHJldHVybiAiRFdfVEFHX3N0cnVjdHVyZV90eXBlIjsKKyAgICBjYXNlIERXX1RBR19zdWJyb3V0aW5lX3R5cGU6CisgICAgICByZXR1cm4gIkRXX1RBR19zdWJyb3V0aW5lX3R5cGUiOworICAgIGNhc2UgRFdfVEFHX3R5cGVkZWY6CisgICAgICByZXR1cm4gIkRXX1RBR190eXBlZGVmIjsKKyAgICBjYXNlIERXX1RBR191bmlvbl90eXBlOgorICAgICAgcmV0dXJuICJEV19UQUdfdW5pb25fdHlwZSI7CisgICAgY2FzZSBEV19UQUdfdW5zcGVjaWZpZWRfcGFyYW1ldGVyczoKKyAgICAgIHJldHVybiAiRFdfVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnMiOworICAgIGNhc2UgRFdfVEFHX3ZhcmlhbnQ6CisgICAgICByZXR1cm4gIkRXX1RBR192YXJpYW50IjsKKyAgICBjYXNlIERXX1RBR19jb21tb25fYmxvY2s6CisgICAgICByZXR1cm4gIkRXX1RBR19jb21tb25fYmxvY2siOworICAgIGNhc2UgRFdfVEFHX2NvbW1vbl9pbmNsdXNpb246CisgICAgICByZXR1cm4gIkRXX1RBR19jb21tb25faW5jbHVzaW9uIjsKKyAgICBjYXNlIERXX1RBR19pbmhlcml0YW5jZToKKyAgICAgIHJldHVybiAiRFdfVEFHX2luaGVyaXRhbmNlIjsKKyAgICBjYXNlIERXX1RBR19pbmxpbmVkX3N1YnJvdXRpbmU6CisgICAgICByZXR1cm4gIkRXX1RBR19pbmxpbmVkX3N1YnJvdXRpbmUiOworICAgIGNhc2UgRFdfVEFHX21vZHVsZToKKyAgICAgIHJldHVybiAiRFdfVEFHX21vZHVsZSI7CisgICAgY2FzZSBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlOgorICAgICAgcmV0dXJuICJEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlIjsKKyAgICBjYXNlIERXX1RBR19zZXRfdHlwZToKKyAgICAgIHJldHVybiAiRFdfVEFHX3NldF90eXBlIjsKKyAgICBjYXNlIERXX1RBR19zdWJyYW5nZV90eXBlOgorICAgICAgcmV0dXJuICJEV19UQUdfc3VicmFuZ2VfdHlwZSI7CisgICAgY2FzZSBEV19UQUdfd2l0aF9zdG10OgorICAgICAgcmV0dXJuICJEV19UQUdfd2l0aF9zdG10IjsKKyAgICBjYXNlIERXX1RBR19hY2Nlc3NfZGVjbGFyYXRpb246CisgICAgICByZXR1cm4gIkRXX1RBR19hY2Nlc3NfZGVjbGFyYXRpb24iOworICAgIGNhc2UgRFdfVEFHX2Jhc2VfdHlwZToKKyAgICAgIHJldHVybiAiRFdfVEFHX2Jhc2VfdHlwZSI7CisgICAgY2FzZSBEV19UQUdfY2F0Y2hfYmxvY2s6CisgICAgICByZXR1cm4gIkRXX1RBR19jYXRjaF9ibG9jayI7CisgICAgY2FzZSBEV19UQUdfY29uc3RfdHlwZToKKyAgICAgIHJldHVybiAiRFdfVEFHX2NvbnN0X3R5cGUiOworICAgIGNhc2UgRFdfVEFHX2NvbnN0YW50OgorICAgICAgcmV0dXJuICJEV19UQUdfY29uc3RhbnQiOworICAgIGNhc2UgRFdfVEFHX2VudW1lcmF0b3I6CisgICAgICByZXR1cm4gIkRXX1RBR19lbnVtZXJhdG9yIjsKKyAgICBjYXNlIERXX1RBR19maWxlX3R5cGU6CisgICAgICByZXR1cm4gIkRXX1RBR19maWxlX3R5cGUiOworICAgIGNhc2UgRFdfVEFHX2ZyaWVuZDoKKyAgICAgIHJldHVybiAiRFdfVEFHX2ZyaWVuZCI7CisgICAgY2FzZSBEV19UQUdfbmFtZWxpc3Q6CisgICAgICByZXR1cm4gIkRXX1RBR19uYW1lbGlzdCI7CisgICAgY2FzZSBEV19UQUdfbmFtZWxpc3RfaXRlbToKKyAgICAgIHJldHVybiAiRFdfVEFHX25hbWVsaXN0X2l0ZW0iOworICAgIGNhc2UgRFdfVEFHX3BhY2tlZF90eXBlOgorICAgICAgcmV0dXJuICJEV19UQUdfcGFja2VkX3R5cGUiOworICAgIGNhc2UgRFdfVEFHX3N1YnByb2dyYW06CisgICAgICByZXR1cm4gIkRXX1RBR19zdWJwcm9ncmFtIjsKKyAgICBjYXNlIERXX1RBR190ZW1wbGF0ZV90eXBlX3BhcmFtOgorICAgICAgcmV0dXJuICJEV19UQUdfdGVtcGxhdGVfdHlwZV9wYXJhbSI7CisgICAgY2FzZSBEV19UQUdfdGVtcGxhdGVfdmFsdWVfcGFyYW06CisgICAgICByZXR1cm4gIkRXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbSI7CisgICAgY2FzZSBEV19UQUdfdGhyb3duX3R5cGU6CisgICAgICByZXR1cm4gIkRXX1RBR190aHJvd25fdHlwZSI7CisgICAgY2FzZSBEV19UQUdfdHJ5X2Jsb2NrOgorICAgICAgcmV0dXJuICJEV19UQUdfdHJ5X2Jsb2NrIjsKKyAgICBjYXNlIERXX1RBR192YXJpYW50X3BhcnQ6CisgICAgICByZXR1cm4gIkRXX1RBR192YXJpYW50X3BhcnQiOworICAgIGNhc2UgRFdfVEFHX3ZhcmlhYmxlOgorICAgICAgcmV0dXJuICJEV19UQUdfdmFyaWFibGUiOworICAgIGNhc2UgRFdfVEFHX3ZvbGF0aWxlX3R5cGU6CisgICAgICByZXR1cm4gIkRXX1RBR192b2xhdGlsZV90eXBlIjsKKyAgICBjYXNlIERXX1RBR19NSVBTX2xvb3A6CisgICAgICByZXR1cm4gIkRXX1RBR19NSVBTX2xvb3AiOworICAgIGNhc2UgRFdfVEFHX2Zvcm1hdF9sYWJlbDoKKyAgICAgIHJldHVybiAiRFdfVEFHX2Zvcm1hdF9sYWJlbCI7CisgICAgY2FzZSBEV19UQUdfZnVuY3Rpb25fdGVtcGxhdGU6CisgICAgICByZXR1cm4gIkRXX1RBR19mdW5jdGlvbl90ZW1wbGF0ZSI7CisgICAgY2FzZSBEV19UQUdfY2xhc3NfdGVtcGxhdGU6CisgICAgICByZXR1cm4gIkRXX1RBR19jbGFzc190ZW1wbGF0ZSI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiRFdfVEFHXzx1bmtub3duPiI7CisgICAgfQorfQorCisvKiBDb252ZXJ0IGEgRFdBUkYgYXR0cmlidXRlIGNvZGUgaW50byBpdHMgc3RyaW5nIG5hbWUuICAqLworCitzdGF0aWMgY2hhciAqCitkd2FyZl9hdHRyX25hbWUgKGF0dHIpCisgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGF0dHI7Cit7CisgIHN3aXRjaCAoYXR0cikKKyAgICB7CisgICAgY2FzZSBEV19BVF9zaWJsaW5nOgorICAgICAgcmV0dXJuICJEV19BVF9zaWJsaW5nIjsKKyAgICBjYXNlIERXX0FUX2xvY2F0aW9uOgorICAgICAgcmV0dXJuICJEV19BVF9sb2NhdGlvbiI7CisgICAgY2FzZSBEV19BVF9uYW1lOgorICAgICAgcmV0dXJuICJEV19BVF9uYW1lIjsKKyAgICBjYXNlIERXX0FUX29yZGVyaW5nOgorICAgICAgcmV0dXJuICJEV19BVF9vcmRlcmluZyI7CisgICAgY2FzZSBEV19BVF9zdWJzY3JfZGF0YToKKyAgICAgIHJldHVybiAiRFdfQVRfc3Vic2NyX2RhdGEiOworICAgIGNhc2UgRFdfQVRfYnl0ZV9zaXplOgorICAgICAgcmV0dXJuICJEV19BVF9ieXRlX3NpemUiOworICAgIGNhc2UgRFdfQVRfYml0X29mZnNldDoKKyAgICAgIHJldHVybiAiRFdfQVRfYml0X29mZnNldCI7CisgICAgY2FzZSBEV19BVF9iaXRfc2l6ZToKKyAgICAgIHJldHVybiAiRFdfQVRfYml0X3NpemUiOworICAgIGNhc2UgRFdfQVRfZWxlbWVudF9saXN0OgorICAgICAgcmV0dXJuICJEV19BVF9lbGVtZW50X2xpc3QiOworICAgIGNhc2UgRFdfQVRfc3RtdF9saXN0OgorICAgICAgcmV0dXJuICJEV19BVF9zdG10X2xpc3QiOworICAgIGNhc2UgRFdfQVRfbG93X3BjOgorICAgICAgcmV0dXJuICJEV19BVF9sb3dfcGMiOworICAgIGNhc2UgRFdfQVRfaGlnaF9wYzoKKyAgICAgIHJldHVybiAiRFdfQVRfaGlnaF9wYyI7CisgICAgY2FzZSBEV19BVF9sYW5ndWFnZToKKyAgICAgIHJldHVybiAiRFdfQVRfbGFuZ3VhZ2UiOworICAgIGNhc2UgRFdfQVRfbWVtYmVyOgorICAgICAgcmV0dXJuICJEV19BVF9tZW1iZXIiOworICAgIGNhc2UgRFdfQVRfZGlzY3I6CisgICAgICByZXR1cm4gIkRXX0FUX2Rpc2NyIjsKKyAgICBjYXNlIERXX0FUX2Rpc2NyX3ZhbHVlOgorICAgICAgcmV0dXJuICJEV19BVF9kaXNjcl92YWx1ZSI7CisgICAgY2FzZSBEV19BVF92aXNpYmlsaXR5OgorICAgICAgcmV0dXJuICJEV19BVF92aXNpYmlsaXR5IjsKKyAgICBjYXNlIERXX0FUX2ltcG9ydDoKKyAgICAgIHJldHVybiAiRFdfQVRfaW1wb3J0IjsKKyAgICBjYXNlIERXX0FUX3N0cmluZ19sZW5ndGg6CisgICAgICByZXR1cm4gIkRXX0FUX3N0cmluZ19sZW5ndGgiOworICAgIGNhc2UgRFdfQVRfY29tbW9uX3JlZmVyZW5jZToKKyAgICAgIHJldHVybiAiRFdfQVRfY29tbW9uX3JlZmVyZW5jZSI7CisgICAgY2FzZSBEV19BVF9jb21wX2RpcjoKKyAgICAgIHJldHVybiAiRFdfQVRfY29tcF9kaXIiOworICAgIGNhc2UgRFdfQVRfY29uc3RfdmFsdWU6CisgICAgICByZXR1cm4gIkRXX0FUX2NvbnN0X3ZhbHVlIjsKKyAgICBjYXNlIERXX0FUX2NvbnRhaW5pbmdfdHlwZToKKyAgICAgIHJldHVybiAiRFdfQVRfY29udGFpbmluZ190eXBlIjsKKyAgICBjYXNlIERXX0FUX2RlZmF1bHRfdmFsdWU6CisgICAgICByZXR1cm4gIkRXX0FUX2RlZmF1bHRfdmFsdWUiOworICAgIGNhc2UgRFdfQVRfaW5saW5lOgorICAgICAgcmV0dXJuICJEV19BVF9pbmxpbmUiOworICAgIGNhc2UgRFdfQVRfaXNfb3B0aW9uYWw6CisgICAgICByZXR1cm4gIkRXX0FUX2lzX29wdGlvbmFsIjsKKyAgICBjYXNlIERXX0FUX2xvd2VyX2JvdW5kOgorICAgICAgcmV0dXJuICJEV19BVF9sb3dlcl9ib3VuZCI7CisgICAgY2FzZSBEV19BVF9wcm9kdWNlcjoKKyAgICAgIHJldHVybiAiRFdfQVRfcHJvZHVjZXIiOworICAgIGNhc2UgRFdfQVRfcHJvdG90eXBlZDoKKyAgICAgIHJldHVybiAiRFdfQVRfcHJvdG90eXBlZCI7CisgICAgY2FzZSBEV19BVF9yZXR1cm5fYWRkcjoKKyAgICAgIHJldHVybiAiRFdfQVRfcmV0dXJuX2FkZHIiOworICAgIGNhc2UgRFdfQVRfc3RhcnRfc2NvcGU6CisgICAgICByZXR1cm4gIkRXX0FUX3N0YXJ0X3Njb3BlIjsKKyAgICBjYXNlIERXX0FUX3N0cmlkZV9zaXplOgorICAgICAgcmV0dXJuICJEV19BVF9zdHJpZGVfc2l6ZSI7CisgICAgY2FzZSBEV19BVF91cHBlcl9ib3VuZDoKKyAgICAgIHJldHVybiAiRFdfQVRfdXBwZXJfYm91bmQiOworICAgIGNhc2UgRFdfQVRfYWJzdHJhY3Rfb3JpZ2luOgorICAgICAgcmV0dXJuICJEV19BVF9hYnN0cmFjdF9vcmlnaW4iOworICAgIGNhc2UgRFdfQVRfYWNjZXNzaWJpbGl0eToKKyAgICAgIHJldHVybiAiRFdfQVRfYWNjZXNzaWJpbGl0eSI7CisgICAgY2FzZSBEV19BVF9hZGRyZXNzX2NsYXNzOgorICAgICAgcmV0dXJuICJEV19BVF9hZGRyZXNzX2NsYXNzIjsKKyAgICBjYXNlIERXX0FUX2FydGlmaWNpYWw6CisgICAgICByZXR1cm4gIkRXX0FUX2FydGlmaWNpYWwiOworICAgIGNhc2UgRFdfQVRfYmFzZV90eXBlczoKKyAgICAgIHJldHVybiAiRFdfQVRfYmFzZV90eXBlcyI7CisgICAgY2FzZSBEV19BVF9jYWxsaW5nX2NvbnZlbnRpb246CisgICAgICByZXR1cm4gIkRXX0FUX2NhbGxpbmdfY29udmVudGlvbiI7CisgICAgY2FzZSBEV19BVF9jb3VudDoKKyAgICAgIHJldHVybiAiRFdfQVRfY291bnQiOworICAgIGNhc2UgRFdfQVRfZGF0YV9tZW1iZXJfbG9jYXRpb246CisgICAgICByZXR1cm4gIkRXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uIjsKKyAgICBjYXNlIERXX0FUX2RlY2xfY29sdW1uOgorICAgICAgcmV0dXJuICJEV19BVF9kZWNsX2NvbHVtbiI7CisgICAgY2FzZSBEV19BVF9kZWNsX2ZpbGU6CisgICAgICByZXR1cm4gIkRXX0FUX2RlY2xfZmlsZSI7CisgICAgY2FzZSBEV19BVF9kZWNsX2xpbmU6CisgICAgICByZXR1cm4gIkRXX0FUX2RlY2xfbGluZSI7CisgICAgY2FzZSBEV19BVF9kZWNsYXJhdGlvbjoKKyAgICAgIHJldHVybiAiRFdfQVRfZGVjbGFyYXRpb24iOworICAgIGNhc2UgRFdfQVRfZGlzY3JfbGlzdDoKKyAgICAgIHJldHVybiAiRFdfQVRfZGlzY3JfbGlzdCI7CisgICAgY2FzZSBEV19BVF9lbmNvZGluZzoKKyAgICAgIHJldHVybiAiRFdfQVRfZW5jb2RpbmciOworICAgIGNhc2UgRFdfQVRfZXh0ZXJuYWw6CisgICAgICByZXR1cm4gIkRXX0FUX2V4dGVybmFsIjsKKyAgICBjYXNlIERXX0FUX2ZyYW1lX2Jhc2U6CisgICAgICByZXR1cm4gIkRXX0FUX2ZyYW1lX2Jhc2UiOworICAgIGNhc2UgRFdfQVRfZnJpZW5kOgorICAgICAgcmV0dXJuICJEV19BVF9mcmllbmQiOworICAgIGNhc2UgRFdfQVRfaWRlbnRpZmllcl9jYXNlOgorICAgICAgcmV0dXJuICJEV19BVF9pZGVudGlmaWVyX2Nhc2UiOworICAgIGNhc2UgRFdfQVRfbWFjcm9faW5mbzoKKyAgICAgIHJldHVybiAiRFdfQVRfbWFjcm9faW5mbyI7CisgICAgY2FzZSBEV19BVF9uYW1lbGlzdF9pdGVtczoKKyAgICAgIHJldHVybiAiRFdfQVRfbmFtZWxpc3RfaXRlbXMiOworICAgIGNhc2UgRFdfQVRfcHJpb3JpdHk6CisgICAgICByZXR1cm4gIkRXX0FUX3ByaW9yaXR5IjsKKyAgICBjYXNlIERXX0FUX3NlZ21lbnQ6CisgICAgICByZXR1cm4gIkRXX0FUX3NlZ21lbnQiOworICAgIGNhc2UgRFdfQVRfc3BlY2lmaWNhdGlvbjoKKyAgICAgIHJldHVybiAiRFdfQVRfc3BlY2lmaWNhdGlvbiI7CisgICAgY2FzZSBEV19BVF9zdGF0aWNfbGluazoKKyAgICAgIHJldHVybiAiRFdfQVRfc3RhdGljX2xpbmsiOworICAgIGNhc2UgRFdfQVRfdHlwZToKKyAgICAgIHJldHVybiAiRFdfQVRfdHlwZSI7CisgICAgY2FzZSBEV19BVF91c2VfbG9jYXRpb246CisgICAgICByZXR1cm4gIkRXX0FUX3VzZV9sb2NhdGlvbiI7CisgICAgY2FzZSBEV19BVF92YXJpYWJsZV9wYXJhbWV0ZXI6CisgICAgICByZXR1cm4gIkRXX0FUX3ZhcmlhYmxlX3BhcmFtZXRlciI7CisgICAgY2FzZSBEV19BVF92aXJ0dWFsaXR5OgorICAgICAgcmV0dXJuICJEV19BVF92aXJ0dWFsaXR5IjsKKyAgICBjYXNlIERXX0FUX3Z0YWJsZV9lbGVtX2xvY2F0aW9uOgorICAgICAgcmV0dXJuICJEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbiI7CisKKyNpZmRlZiBNSVBTCisgICAgY2FzZSBEV19BVF9NSVBTX2ZkZToKKyAgICAgIHJldHVybiAiRFdfQVRfTUlQU19mZGUiOworICAgIGNhc2UgRFdfQVRfTUlQU19sb29wX2JlZ2luOgorICAgICAgcmV0dXJuICJEV19BVF9NSVBTX2xvb3BfYmVnaW4iOworICAgIGNhc2UgRFdfQVRfTUlQU190YWlsX2xvb3BfYmVnaW46CisgICAgICByZXR1cm4gIkRXX0FUX01JUFNfdGFpbF9sb29wX2JlZ2luIjsKKyAgICBjYXNlIERXX0FUX01JUFNfZXBpbG9nX2JlZ2luOgorICAgICAgcmV0dXJuICJEV19BVF9NSVBTX2VwaWxvZ19iZWdpbiI7CisgICAgY2FzZSBEV19BVF9NSVBTX2xvb3BfdW5yb2xsX2ZhY3RvcjoKKyAgICAgIHJldHVybiAiRFdfQVRfTUlQU19sb29wX3Vucm9sbF9mYWN0b3IiOworICAgIGNhc2UgRFdfQVRfTUlQU19zb2Z0d2FyZV9waXBlbGluZV9kZXB0aDoKKyAgICAgIHJldHVybiAiRFdfQVRfTUlQU19zb2Z0d2FyZV9waXBlbGluZV9kZXB0aCI7CisgICAgY2FzZSBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZToKKyAgICAgIHJldHVybiAiRFdfQVRfTUlQU19saW5rYWdlX25hbWUiOworI2VuZGlmCisKKyAgICBjYXNlIERXX0FUX3NmX25hbWVzOgorICAgICAgcmV0dXJuICJEV19BVF9zZl9uYW1lcyI7CisgICAgY2FzZSBEV19BVF9zcmNfaW5mbzoKKyAgICAgIHJldHVybiAiRFdfQVRfc3JjX2luZm8iOworICAgIGNhc2UgRFdfQVRfbWFjX2luZm86CisgICAgICByZXR1cm4gIkRXX0FUX21hY19pbmZvIjsKKyAgICBjYXNlIERXX0FUX3NyY19jb29yZHM6CisgICAgICByZXR1cm4gIkRXX0FUX3NyY19jb29yZHMiOworICAgIGNhc2UgRFdfQVRfYm9keV9iZWdpbjoKKyAgICAgIHJldHVybiAiRFdfQVRfYm9keV9iZWdpbiI7CisgICAgY2FzZSBEV19BVF9ib2R5X2VuZDoKKyAgICAgIHJldHVybiAiRFdfQVRfYm9keV9lbmQiOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gIkRXX0FUXzx1bmtub3duPiI7CisgICAgfQorfQorCisvKiBDb252ZXJ0IGEgRFdBUkYgdmFsdWUgZm9ybSBjb2RlIGludG8gaXRzIHN0cmluZyBuYW1lLiAgKi8KKworc3RhdGljIGNoYXIgKgorZHdhcmZfZm9ybV9uYW1lIChmb3JtKQorICAgICByZWdpc3RlciB1bnNpZ25lZCBmb3JtOworeworICBzd2l0Y2ggKGZvcm0pCisgICAgeworICAgIGNhc2UgRFdfRk9STV9hZGRyOgorICAgICAgcmV0dXJuICJEV19GT1JNX2FkZHIiOworICAgIGNhc2UgRFdfRk9STV9ibG9jazI6CisgICAgICByZXR1cm4gIkRXX0ZPUk1fYmxvY2syIjsKKyAgICBjYXNlIERXX0ZPUk1fYmxvY2s0OgorICAgICAgcmV0dXJuICJEV19GT1JNX2Jsb2NrNCI7CisgICAgY2FzZSBEV19GT1JNX2RhdGEyOgorICAgICAgcmV0dXJuICJEV19GT1JNX2RhdGEyIjsKKyAgICBjYXNlIERXX0ZPUk1fZGF0YTQ6CisgICAgICByZXR1cm4gIkRXX0ZPUk1fZGF0YTQiOworICAgIGNhc2UgRFdfRk9STV9kYXRhODoKKyAgICAgIHJldHVybiAiRFdfRk9STV9kYXRhOCI7CisgICAgY2FzZSBEV19GT1JNX3N0cmluZzoKKyAgICAgIHJldHVybiAiRFdfRk9STV9zdHJpbmciOworICAgIGNhc2UgRFdfRk9STV9ibG9jazoKKyAgICAgIHJldHVybiAiRFdfRk9STV9ibG9jayI7CisgICAgY2FzZSBEV19GT1JNX2Jsb2NrMToKKyAgICAgIHJldHVybiAiRFdfRk9STV9ibG9jazEiOworICAgIGNhc2UgRFdfRk9STV9kYXRhMToKKyAgICAgIHJldHVybiAiRFdfRk9STV9kYXRhMSI7CisgICAgY2FzZSBEV19GT1JNX2ZsYWc6CisgICAgICByZXR1cm4gIkRXX0ZPUk1fZmxhZyI7CisgICAgY2FzZSBEV19GT1JNX3NkYXRhOgorICAgICAgcmV0dXJuICJEV19GT1JNX3NkYXRhIjsKKyAgICBjYXNlIERXX0ZPUk1fc3RycDoKKyAgICAgIHJldHVybiAiRFdfRk9STV9zdHJwIjsKKyAgICBjYXNlIERXX0ZPUk1fdWRhdGE6CisgICAgICByZXR1cm4gIkRXX0ZPUk1fdWRhdGEiOworICAgIGNhc2UgRFdfRk9STV9yZWZfYWRkcjoKKyAgICAgIHJldHVybiAiRFdfRk9STV9yZWZfYWRkciI7CisgICAgY2FzZSBEV19GT1JNX3JlZjE6CisgICAgICByZXR1cm4gIkRXX0ZPUk1fcmVmMSI7CisgICAgY2FzZSBEV19GT1JNX3JlZjI6CisgICAgICByZXR1cm4gIkRXX0ZPUk1fcmVmMiI7CisgICAgY2FzZSBEV19GT1JNX3JlZjQ6CisgICAgICByZXR1cm4gIkRXX0ZPUk1fcmVmNCI7CisgICAgY2FzZSBEV19GT1JNX3JlZjg6CisgICAgICByZXR1cm4gIkRXX0ZPUk1fcmVmOCI7CisgICAgY2FzZSBEV19GT1JNX3JlZl91ZGF0YToKKyAgICAgIHJldHVybiAiRFdfRk9STV9yZWZfdWRhdGEiOworICAgIGNhc2UgRFdfRk9STV9pbmRpcmVjdDoKKyAgICAgIHJldHVybiAiRFdfRk9STV9pbmRpcmVjdCI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiRFdfRk9STV88dW5rbm93bj4iOworICAgIH0KK30KKworLyogQ29udmVydCBhIERXQVJGIHN0YWNrIG9wY29kZSBpbnRvIGl0cyBzdHJpbmcgbmFtZS4gICovCisKK3N0YXRpYyBjaGFyICoKK2R3YXJmX3N0YWNrX29wX25hbWUgKG9wKQorICAgICByZWdpc3RlciB1bnNpZ25lZCBvcDsKK3sKKyAgc3dpdGNoIChvcCkKKyAgICB7CisgICAgY2FzZSBEV19PUF9hZGRyOgorICAgICAgcmV0dXJuICJEV19PUF9hZGRyIjsKKyAgICBjYXNlIERXX09QX2RlcmVmOgorICAgICAgcmV0dXJuICJEV19PUF9kZXJlZiI7CisgICAgY2FzZSBEV19PUF9jb25zdDF1OgorICAgICAgcmV0dXJuICJEV19PUF9jb25zdDF1IjsKKyAgICBjYXNlIERXX09QX2NvbnN0MXM6CisgICAgICByZXR1cm4gIkRXX09QX2NvbnN0MXMiOworICAgIGNhc2UgRFdfT1BfY29uc3QydToKKyAgICAgIHJldHVybiAiRFdfT1BfY29uc3QydSI7CisgICAgY2FzZSBEV19PUF9jb25zdDJzOgorICAgICAgcmV0dXJuICJEV19PUF9jb25zdDJzIjsKKyAgICBjYXNlIERXX09QX2NvbnN0NHU6CisgICAgICByZXR1cm4gIkRXX09QX2NvbnN0NHUiOworICAgIGNhc2UgRFdfT1BfY29uc3Q0czoKKyAgICAgIHJldHVybiAiRFdfT1BfY29uc3Q0cyI7CisgICAgY2FzZSBEV19PUF9jb25zdDh1OgorICAgICAgcmV0dXJuICJEV19PUF9jb25zdDh1IjsKKyAgICBjYXNlIERXX09QX2NvbnN0OHM6CisgICAgICByZXR1cm4gIkRXX09QX2NvbnN0OHMiOworICAgIGNhc2UgRFdfT1BfY29uc3R1OgorICAgICAgcmV0dXJuICJEV19PUF9jb25zdHUiOworICAgIGNhc2UgRFdfT1BfY29uc3RzOgorICAgICAgcmV0dXJuICJEV19PUF9jb25zdHMiOworICAgIGNhc2UgRFdfT1BfZHVwOgorICAgICAgcmV0dXJuICJEV19PUF9kdXAiOworICAgIGNhc2UgRFdfT1BfZHJvcDoKKyAgICAgIHJldHVybiAiRFdfT1BfZHJvcCI7CisgICAgY2FzZSBEV19PUF9vdmVyOgorICAgICAgcmV0dXJuICJEV19PUF9vdmVyIjsKKyAgICBjYXNlIERXX09QX3BpY2s6CisgICAgICByZXR1cm4gIkRXX09QX3BpY2siOworICAgIGNhc2UgRFdfT1Bfc3dhcDoKKyAgICAgIHJldHVybiAiRFdfT1Bfc3dhcCI7CisgICAgY2FzZSBEV19PUF9yb3Q6CisgICAgICByZXR1cm4gIkRXX09QX3JvdCI7CisgICAgY2FzZSBEV19PUF94ZGVyZWY6CisgICAgICByZXR1cm4gIkRXX09QX3hkZXJlZiI7CisgICAgY2FzZSBEV19PUF9hYnM6CisgICAgICByZXR1cm4gIkRXX09QX2FicyI7CisgICAgY2FzZSBEV19PUF9hbmQ6CisgICAgICByZXR1cm4gIkRXX09QX2FuZCI7CisgICAgY2FzZSBEV19PUF9kaXY6CisgICAgICByZXR1cm4gIkRXX09QX2RpdiI7CisgICAgY2FzZSBEV19PUF9taW51czoKKyAgICAgIHJldHVybiAiRFdfT1BfbWludXMiOworICAgIGNhc2UgRFdfT1BfbW9kOgorICAgICAgcmV0dXJuICJEV19PUF9tb2QiOworICAgIGNhc2UgRFdfT1BfbXVsOgorICAgICAgcmV0dXJuICJEV19PUF9tdWwiOworICAgIGNhc2UgRFdfT1BfbmVnOgorICAgICAgcmV0dXJuICJEV19PUF9uZWciOworICAgIGNhc2UgRFdfT1Bfbm90OgorICAgICAgcmV0dXJuICJEV19PUF9ub3QiOworICAgIGNhc2UgRFdfT1Bfb3I6CisgICAgICByZXR1cm4gIkRXX09QX29yIjsKKyAgICBjYXNlIERXX09QX3BsdXM6CisgICAgICByZXR1cm4gIkRXX09QX3BsdXMiOworICAgIGNhc2UgRFdfT1BfcGx1c191Y29uc3Q6CisgICAgICByZXR1cm4gIkRXX09QX3BsdXNfdWNvbnN0IjsKKyAgICBjYXNlIERXX09QX3NobDoKKyAgICAgIHJldHVybiAiRFdfT1Bfc2hsIjsKKyAgICBjYXNlIERXX09QX3NocjoKKyAgICAgIHJldHVybiAiRFdfT1Bfc2hyIjsKKyAgICBjYXNlIERXX09QX3NocmE6CisgICAgICByZXR1cm4gIkRXX09QX3NocmEiOworICAgIGNhc2UgRFdfT1BfeG9yOgorICAgICAgcmV0dXJuICJEV19PUF94b3IiOworICAgIGNhc2UgRFdfT1BfYnJhOgorICAgICAgcmV0dXJuICJEV19PUF9icmEiOworICAgIGNhc2UgRFdfT1BfZXE6CisgICAgICByZXR1cm4gIkRXX09QX2VxIjsKKyAgICBjYXNlIERXX09QX2dlOgorICAgICAgcmV0dXJuICJEV19PUF9nZSI7CisgICAgY2FzZSBEV19PUF9ndDoKKyAgICAgIHJldHVybiAiRFdfT1BfZ3QiOworICAgIGNhc2UgRFdfT1BfbGU6CisgICAgICByZXR1cm4gIkRXX09QX2xlIjsKKyAgICBjYXNlIERXX09QX2x0OgorICAgICAgcmV0dXJuICJEV19PUF9sdCI7CisgICAgY2FzZSBEV19PUF9uZToKKyAgICAgIHJldHVybiAiRFdfT1BfbmUiOworICAgIGNhc2UgRFdfT1Bfc2tpcDoKKyAgICAgIHJldHVybiAiRFdfT1Bfc2tpcCI7CisgICAgY2FzZSBEV19PUF9saXQwOgorICAgICAgcmV0dXJuICJEV19PUF9saXQwIjsKKyAgICBjYXNlIERXX09QX2xpdDE6CisgICAgICByZXR1cm4gIkRXX09QX2xpdDEiOworICAgIGNhc2UgRFdfT1BfbGl0MjoKKyAgICAgIHJldHVybiAiRFdfT1BfbGl0MiI7CisgICAgY2FzZSBEV19PUF9saXQzOgorICAgICAgcmV0dXJuICJEV19PUF9saXQzIjsKKyAgICBjYXNlIERXX09QX2xpdDQ6CisgICAgICByZXR1cm4gIkRXX09QX2xpdDQiOworICAgIGNhc2UgRFdfT1BfbGl0NToKKyAgICAgIHJldHVybiAiRFdfT1BfbGl0NSI7CisgICAgY2FzZSBEV19PUF9saXQ2OgorICAgICAgcmV0dXJuICJEV19PUF9saXQ2IjsKKyAgICBjYXNlIERXX09QX2xpdDc6CisgICAgICByZXR1cm4gIkRXX09QX2xpdDciOworICAgIGNhc2UgRFdfT1BfbGl0ODoKKyAgICAgIHJldHVybiAiRFdfT1BfbGl0OCI7CisgICAgY2FzZSBEV19PUF9saXQ5OgorICAgICAgcmV0dXJuICJEV19PUF9saXQ5IjsKKyAgICBjYXNlIERXX09QX2xpdDEwOgorICAgICAgcmV0dXJuICJEV19PUF9saXQxMCI7CisgICAgY2FzZSBEV19PUF9saXQxMToKKyAgICAgIHJldHVybiAiRFdfT1BfbGl0MTEiOworICAgIGNhc2UgRFdfT1BfbGl0MTI6CisgICAgICByZXR1cm4gIkRXX09QX2xpdDEyIjsKKyAgICBjYXNlIERXX09QX2xpdDEzOgorICAgICAgcmV0dXJuICJEV19PUF9saXQxMyI7CisgICAgY2FzZSBEV19PUF9saXQxNDoKKyAgICAgIHJldHVybiAiRFdfT1BfbGl0MTQiOworICAgIGNhc2UgRFdfT1BfbGl0MTU6CisgICAgICByZXR1cm4gIkRXX09QX2xpdDE1IjsKKyAgICBjYXNlIERXX09QX2xpdDE2OgorICAgICAgcmV0dXJuICJEV19PUF9saXQxNiI7CisgICAgY2FzZSBEV19PUF9saXQxNzoKKyAgICAgIHJldHVybiAiRFdfT1BfbGl0MTciOworICAgIGNhc2UgRFdfT1BfbGl0MTg6CisgICAgICByZXR1cm4gIkRXX09QX2xpdDE4IjsKKyAgICBjYXNlIERXX09QX2xpdDE5OgorICAgICAgcmV0dXJuICJEV19PUF9saXQxOSI7CisgICAgY2FzZSBEV19PUF9saXQyMDoKKyAgICAgIHJldHVybiAiRFdfT1BfbGl0MjAiOworICAgIGNhc2UgRFdfT1BfbGl0MjE6CisgICAgICByZXR1cm4gIkRXX09QX2xpdDIxIjsKKyAgICBjYXNlIERXX09QX2xpdDIyOgorICAgICAgcmV0dXJuICJEV19PUF9saXQyMiI7CisgICAgY2FzZSBEV19PUF9saXQyMzoKKyAgICAgIHJldHVybiAiRFdfT1BfbGl0MjMiOworICAgIGNhc2UgRFdfT1BfbGl0MjQ6CisgICAgICByZXR1cm4gIkRXX09QX2xpdDI0IjsKKyAgICBjYXNlIERXX09QX2xpdDI1OgorICAgICAgcmV0dXJuICJEV19PUF9saXQyNSI7CisgICAgY2FzZSBEV19PUF9saXQyNjoKKyAgICAgIHJldHVybiAiRFdfT1BfbGl0MjYiOworICAgIGNhc2UgRFdfT1BfbGl0Mjc6CisgICAgICByZXR1cm4gIkRXX09QX2xpdDI3IjsKKyAgICBjYXNlIERXX09QX2xpdDI4OgorICAgICAgcmV0dXJuICJEV19PUF9saXQyOCI7CisgICAgY2FzZSBEV19PUF9saXQyOToKKyAgICAgIHJldHVybiAiRFdfT1BfbGl0MjkiOworICAgIGNhc2UgRFdfT1BfbGl0MzA6CisgICAgICByZXR1cm4gIkRXX09QX2xpdDMwIjsKKyAgICBjYXNlIERXX09QX2xpdDMxOgorICAgICAgcmV0dXJuICJEV19PUF9saXQzMSI7CisgICAgY2FzZSBEV19PUF9yZWcwOgorICAgICAgcmV0dXJuICJEV19PUF9yZWcwIjsKKyAgICBjYXNlIERXX09QX3JlZzE6CisgICAgICByZXR1cm4gIkRXX09QX3JlZzEiOworICAgIGNhc2UgRFdfT1BfcmVnMjoKKyAgICAgIHJldHVybiAiRFdfT1BfcmVnMiI7CisgICAgY2FzZSBEV19PUF9yZWczOgorICAgICAgcmV0dXJuICJEV19PUF9yZWczIjsKKyAgICBjYXNlIERXX09QX3JlZzQ6CisgICAgICByZXR1cm4gIkRXX09QX3JlZzQiOworICAgIGNhc2UgRFdfT1BfcmVnNToKKyAgICAgIHJldHVybiAiRFdfT1BfcmVnNSI7CisgICAgY2FzZSBEV19PUF9yZWc2OgorICAgICAgcmV0dXJuICJEV19PUF9yZWc2IjsKKyAgICBjYXNlIERXX09QX3JlZzc6CisgICAgICByZXR1cm4gIkRXX09QX3JlZzciOworICAgIGNhc2UgRFdfT1BfcmVnODoKKyAgICAgIHJldHVybiAiRFdfT1BfcmVnOCI7CisgICAgY2FzZSBEV19PUF9yZWc5OgorICAgICAgcmV0dXJuICJEV19PUF9yZWc5IjsKKyAgICBjYXNlIERXX09QX3JlZzEwOgorICAgICAgcmV0dXJuICJEV19PUF9yZWcxMCI7CisgICAgY2FzZSBEV19PUF9yZWcxMToKKyAgICAgIHJldHVybiAiRFdfT1BfcmVnMTEiOworICAgIGNhc2UgRFdfT1BfcmVnMTI6CisgICAgICByZXR1cm4gIkRXX09QX3JlZzEyIjsKKyAgICBjYXNlIERXX09QX3JlZzEzOgorICAgICAgcmV0dXJuICJEV19PUF9yZWcxMyI7CisgICAgY2FzZSBEV19PUF9yZWcxNDoKKyAgICAgIHJldHVybiAiRFdfT1BfcmVnMTQiOworICAgIGNhc2UgRFdfT1BfcmVnMTU6CisgICAgICByZXR1cm4gIkRXX09QX3JlZzE1IjsKKyAgICBjYXNlIERXX09QX3JlZzE2OgorICAgICAgcmV0dXJuICJEV19PUF9yZWcxNiI7CisgICAgY2FzZSBEV19PUF9yZWcxNzoKKyAgICAgIHJldHVybiAiRFdfT1BfcmVnMTciOworICAgIGNhc2UgRFdfT1BfcmVnMTg6CisgICAgICByZXR1cm4gIkRXX09QX3JlZzE4IjsKKyAgICBjYXNlIERXX09QX3JlZzE5OgorICAgICAgcmV0dXJuICJEV19PUF9yZWcxOSI7CisgICAgY2FzZSBEV19PUF9yZWcyMDoKKyAgICAgIHJldHVybiAiRFdfT1BfcmVnMjAiOworICAgIGNhc2UgRFdfT1BfcmVnMjE6CisgICAgICByZXR1cm4gIkRXX09QX3JlZzIxIjsKKyAgICBjYXNlIERXX09QX3JlZzIyOgorICAgICAgcmV0dXJuICJEV19PUF9yZWcyMiI7CisgICAgY2FzZSBEV19PUF9yZWcyMzoKKyAgICAgIHJldHVybiAiRFdfT1BfcmVnMjMiOworICAgIGNhc2UgRFdfT1BfcmVnMjQ6CisgICAgICByZXR1cm4gIkRXX09QX3JlZzI0IjsKKyAgICBjYXNlIERXX09QX3JlZzI1OgorICAgICAgcmV0dXJuICJEV19PUF9yZWcyNSI7CisgICAgY2FzZSBEV19PUF9yZWcyNjoKKyAgICAgIHJldHVybiAiRFdfT1BfcmVnMjYiOworICAgIGNhc2UgRFdfT1BfcmVnMjc6CisgICAgICByZXR1cm4gIkRXX09QX3JlZzI3IjsKKyAgICBjYXNlIERXX09QX3JlZzI4OgorICAgICAgcmV0dXJuICJEV19PUF9yZWcyOCI7CisgICAgY2FzZSBEV19PUF9yZWcyOToKKyAgICAgIHJldHVybiAiRFdfT1BfcmVnMjkiOworICAgIGNhc2UgRFdfT1BfcmVnMzA6CisgICAgICByZXR1cm4gIkRXX09QX3JlZzMwIjsKKyAgICBjYXNlIERXX09QX3JlZzMxOgorICAgICAgcmV0dXJuICJEV19PUF9yZWczMSI7CisgICAgY2FzZSBEV19PUF9icmVnMDoKKyAgICAgIHJldHVybiAiRFdfT1BfYnJlZzAiOworICAgIGNhc2UgRFdfT1BfYnJlZzE6CisgICAgICByZXR1cm4gIkRXX09QX2JyZWcxIjsKKyAgICBjYXNlIERXX09QX2JyZWcyOgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMiI7CisgICAgY2FzZSBEV19PUF9icmVnMzoKKyAgICAgIHJldHVybiAiRFdfT1BfYnJlZzMiOworICAgIGNhc2UgRFdfT1BfYnJlZzQ6CisgICAgICByZXR1cm4gIkRXX09QX2JyZWc0IjsKKyAgICBjYXNlIERXX09QX2JyZWc1OgorICAgICAgcmV0dXJuICJEV19PUF9icmVnNSI7CisgICAgY2FzZSBEV19PUF9icmVnNjoKKyAgICAgIHJldHVybiAiRFdfT1BfYnJlZzYiOworICAgIGNhc2UgRFdfT1BfYnJlZzc6CisgICAgICByZXR1cm4gIkRXX09QX2JyZWc3IjsKKyAgICBjYXNlIERXX09QX2JyZWc4OgorICAgICAgcmV0dXJuICJEV19PUF9icmVnOCI7CisgICAgY2FzZSBEV19PUF9icmVnOToKKyAgICAgIHJldHVybiAiRFdfT1BfYnJlZzkiOworICAgIGNhc2UgRFdfT1BfYnJlZzEwOgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMTAiOworICAgIGNhc2UgRFdfT1BfYnJlZzExOgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMTEiOworICAgIGNhc2UgRFdfT1BfYnJlZzEyOgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMTIiOworICAgIGNhc2UgRFdfT1BfYnJlZzEzOgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMTMiOworICAgIGNhc2UgRFdfT1BfYnJlZzE0OgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMTQiOworICAgIGNhc2UgRFdfT1BfYnJlZzE1OgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMTUiOworICAgIGNhc2UgRFdfT1BfYnJlZzE2OgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMTYiOworICAgIGNhc2UgRFdfT1BfYnJlZzE3OgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMTciOworICAgIGNhc2UgRFdfT1BfYnJlZzE4OgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMTgiOworICAgIGNhc2UgRFdfT1BfYnJlZzE5OgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMTkiOworICAgIGNhc2UgRFdfT1BfYnJlZzIwOgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMjAiOworICAgIGNhc2UgRFdfT1BfYnJlZzIxOgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMjEiOworICAgIGNhc2UgRFdfT1BfYnJlZzIyOgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMjIiOworICAgIGNhc2UgRFdfT1BfYnJlZzIzOgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMjMiOworICAgIGNhc2UgRFdfT1BfYnJlZzI0OgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMjQiOworICAgIGNhc2UgRFdfT1BfYnJlZzI1OgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMjUiOworICAgIGNhc2UgRFdfT1BfYnJlZzI2OgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMjYiOworICAgIGNhc2UgRFdfT1BfYnJlZzI3OgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMjciOworICAgIGNhc2UgRFdfT1BfYnJlZzI4OgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMjgiOworICAgIGNhc2UgRFdfT1BfYnJlZzI5OgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMjkiOworICAgIGNhc2UgRFdfT1BfYnJlZzMwOgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMzAiOworICAgIGNhc2UgRFdfT1BfYnJlZzMxOgorICAgICAgcmV0dXJuICJEV19PUF9icmVnMzEiOworICAgIGNhc2UgRFdfT1BfcmVneDoKKyAgICAgIHJldHVybiAiRFdfT1BfcmVneCI7CisgICAgY2FzZSBEV19PUF9mYnJlZzoKKyAgICAgIHJldHVybiAiRFdfT1BfZmJyZWciOworICAgIGNhc2UgRFdfT1BfYnJlZ3g6CisgICAgICByZXR1cm4gIkRXX09QX2JyZWd4IjsKKyAgICBjYXNlIERXX09QX3BpZWNlOgorICAgICAgcmV0dXJuICJEV19PUF9waWVjZSI7CisgICAgY2FzZSBEV19PUF9kZXJlZl9zaXplOgorICAgICAgcmV0dXJuICJEV19PUF9kZXJlZl9zaXplIjsKKyAgICBjYXNlIERXX09QX3hkZXJlZl9zaXplOgorICAgICAgcmV0dXJuICJEV19PUF94ZGVyZWZfc2l6ZSI7CisgICAgY2FzZSBEV19PUF9ub3A6CisgICAgICByZXR1cm4gIkRXX09QX25vcCI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiT1BfPHVua25vd24+IjsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICoKK2R3YXJmX2Jvb2xfbmFtZSAobXlib29sKQorICAgICB1bnNpZ25lZCBteWJvb2w7Cit7CisgIGlmIChteWJvb2wpCisgICAgcmV0dXJuICJUUlVFIjsKKyAgZWxzZQorICAgIHJldHVybiAiRkFMU0UiOworfQorCisvKiBDb252ZXJ0IGEgRFdBUkYgdHlwZSBjb2RlIGludG8gaXRzIHN0cmluZyBuYW1lLiAgKi8KKworc3RhdGljIGNoYXIgKgorZHdhcmZfdHlwZV9lbmNvZGluZ19uYW1lIChlbmMpCisgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGVuYzsKK3sKKyAgc3dpdGNoIChlbmMpCisgICAgeworICAgIGNhc2UgRFdfQVRFX2FkZHJlc3M6CisgICAgICByZXR1cm4gIkRXX0FURV9hZGRyZXNzIjsKKyAgICBjYXNlIERXX0FURV9ib29sZWFuOgorICAgICAgcmV0dXJuICJEV19BVEVfYm9vbGVhbiI7CisgICAgY2FzZSBEV19BVEVfY29tcGxleF9mbG9hdDoKKyAgICAgIHJldHVybiAiRFdfQVRFX2NvbXBsZXhfZmxvYXQiOworICAgIGNhc2UgRFdfQVRFX2Zsb2F0OgorICAgICAgcmV0dXJuICJEV19BVEVfZmxvYXQiOworICAgIGNhc2UgRFdfQVRFX3NpZ25lZDoKKyAgICAgIHJldHVybiAiRFdfQVRFX3NpZ25lZCI7CisgICAgY2FzZSBEV19BVEVfc2lnbmVkX2NoYXI6CisgICAgICByZXR1cm4gIkRXX0FURV9zaWduZWRfY2hhciI7CisgICAgY2FzZSBEV19BVEVfdW5zaWduZWQ6CisgICAgICByZXR1cm4gIkRXX0FURV91bnNpZ25lZCI7CisgICAgY2FzZSBEV19BVEVfdW5zaWduZWRfY2hhcjoKKyAgICAgIHJldHVybiAiRFdfQVRFX3Vuc2lnbmVkX2NoYXIiOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gIkRXX0FURV88dW5rbm93bj4iOworICAgIH0KK30KKworLyogQ29udmVydCBhIERXQVJGIGNhbGwgZnJhbWUgaW5mbyBvcGVyYXRpb24gdG8gaXRzIHN0cmluZyBuYW1lLiAqLworCisjaWYgMAorc3RhdGljIGNoYXIgKgorZHdhcmZfY2ZpX25hbWUgKGNmaV9vcGMpCisgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNmaV9vcGM7Cit7CisgIHN3aXRjaCAoY2ZpX29wYykKKyAgICB7CisgICAgY2FzZSBEV19DRkFfYWR2YW5jZV9sb2M6CisgICAgICByZXR1cm4gIkRXX0NGQV9hZHZhbmNlX2xvYyI7CisgICAgY2FzZSBEV19DRkFfb2Zmc2V0OgorICAgICAgcmV0dXJuICJEV19DRkFfb2Zmc2V0IjsKKyAgICBjYXNlIERXX0NGQV9yZXN0b3JlOgorICAgICAgcmV0dXJuICJEV19DRkFfcmVzdG9yZSI7CisgICAgY2FzZSBEV19DRkFfbm9wOgorICAgICAgcmV0dXJuICJEV19DRkFfbm9wIjsKKyAgICBjYXNlIERXX0NGQV9zZXRfbG9jOgorICAgICAgcmV0dXJuICJEV19DRkFfc2V0X2xvYyI7CisgICAgY2FzZSBEV19DRkFfYWR2YW5jZV9sb2MxOgorICAgICAgcmV0dXJuICJEV19DRkFfYWR2YW5jZV9sb2MxIjsKKyAgICBjYXNlIERXX0NGQV9hZHZhbmNlX2xvYzI6CisgICAgICByZXR1cm4gIkRXX0NGQV9hZHZhbmNlX2xvYzIiOworICAgIGNhc2UgRFdfQ0ZBX2FkdmFuY2VfbG9jNDoKKyAgICAgIHJldHVybiAiRFdfQ0ZBX2FkdmFuY2VfbG9jNCI7CisgICAgY2FzZSBEV19DRkFfb2Zmc2V0X2V4dGVuZGVkOgorICAgICAgcmV0dXJuICJEV19DRkFfb2Zmc2V0X2V4dGVuZGVkIjsKKyAgICBjYXNlIERXX0NGQV9yZXN0b3JlX2V4dGVuZGVkOgorICAgICAgcmV0dXJuICJEV19DRkFfcmVzdG9yZV9leHRlbmRlZCI7CisgICAgY2FzZSBEV19DRkFfdW5kZWZpbmVkOgorICAgICAgcmV0dXJuICJEV19DRkFfdW5kZWZpbmVkIjsKKyAgICBjYXNlIERXX0NGQV9zYW1lX3ZhbHVlOgorICAgICAgcmV0dXJuICJEV19DRkFfc2FtZV92YWx1ZSI7CisgICAgY2FzZSBEV19DRkFfcmVnaXN0ZXI6CisgICAgICByZXR1cm4gIkRXX0NGQV9yZWdpc3RlciI7CisgICAgY2FzZSBEV19DRkFfcmVtZW1iZXJfc3RhdGU6CisgICAgICByZXR1cm4gIkRXX0NGQV9yZW1lbWJlcl9zdGF0ZSI7CisgICAgY2FzZSBEV19DRkFfcmVzdG9yZV9zdGF0ZToKKyAgICAgIHJldHVybiAiRFdfQ0ZBX3Jlc3RvcmVfc3RhdGUiOworICAgIGNhc2UgRFdfQ0ZBX2RlZl9jZmE6CisgICAgICByZXR1cm4gIkRXX0NGQV9kZWZfY2ZhIjsKKyAgICBjYXNlIERXX0NGQV9kZWZfY2ZhX3JlZ2lzdGVyOgorICAgICAgcmV0dXJuICJEV19DRkFfZGVmX2NmYV9yZWdpc3RlciI7CisgICAgY2FzZSBEV19DRkFfZGVmX2NmYV9vZmZzZXQ6CisgICAgICByZXR1cm4gIkRXX0NGQV9kZWZfY2ZhX29mZnNldCI7CisgICAgICAvKiBTR0kvTUlQUyBzcGVjaWZpYyAqLworICAgIGNhc2UgRFdfQ0ZBX01JUFNfYWR2YW5jZV9sb2M4OgorICAgICAgcmV0dXJuICJEV19DRkFfTUlQU19hZHZhbmNlX2xvYzgiOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gIkRXX0NGQV88dW5rbm93bj4iOworICAgIH0KK30KKyNlbmRpZgorCit2b2lkCitkdW1wX2RpZSAoZGllKQorICAgICBzdHJ1Y3QgZGllX2luZm8gKmRpZTsKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgZnByaW50ZiAoc3RkZXJyLCAiRGllOiAlcyAoYWJicmV2ID0gJWQsIG9mZnNldCA9ICVkKVxuIiwKKwkgICBkd2FyZl90YWdfbmFtZSAoZGllLT50YWcpLCBkaWUtPmFiYnJldiwgZGllLT5vZmZzZXQpOworICBmcHJpbnRmIChzdGRlcnIsICJcdGhhcyBjaGlsZHJlbjogJXNcbiIsCisJICAgZHdhcmZfYm9vbF9uYW1lIChkaWUtPmhhc19jaGlsZHJlbikpOworCisgIGZwcmludGYgKHN0ZGVyciwgIlx0YXR0cmlidXRlczpcbiIpOworICBmb3IgKGkgPSAwOyBpIDwgZGllLT5udW1fYXR0cnM7ICsraSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcdFx0JXMgKCVzKSAiLAorCSAgICAgICBkd2FyZl9hdHRyX25hbWUgKGRpZS0+YXR0cnNbaV0ubmFtZSksCisJICAgICAgIGR3YXJmX2Zvcm1fbmFtZSAoZGllLT5hdHRyc1tpXS5mb3JtKSk7CisgICAgICBzd2l0Y2ggKGRpZS0+YXR0cnNbaV0uZm9ybSkKKwl7CisJY2FzZSBEV19GT1JNX3JlZl9hZGRyOgorCWNhc2UgRFdfRk9STV9hZGRyOgorCSAgZnByaW50ZiAoc3RkZXJyLCAiYWRkcmVzczogIik7CisJICBwcmludF9hZGRyZXNzX251bWVyaWMgKERXX0FERFIgKCZkaWUtPmF0dHJzW2ldKSwgMSwgZ2RiX3N0ZGVycik7CisJICBicmVhazsKKwljYXNlIERXX0ZPUk1fYmxvY2syOgorCWNhc2UgRFdfRk9STV9ibG9jazQ6CisJY2FzZSBEV19GT1JNX2Jsb2NrOgorCWNhc2UgRFdfRk9STV9ibG9jazE6CisJICBmcHJpbnRmIChzdGRlcnIsICJibG9jazogc2l6ZSAlZCIsIERXX0JMT0NLICgmZGllLT5hdHRyc1tpXSktPnNpemUpOworCSAgYnJlYWs7CisJY2FzZSBEV19GT1JNX2RhdGExOgorCWNhc2UgRFdfRk9STV9kYXRhMjoKKwljYXNlIERXX0ZPUk1fZGF0YTQ6CisJY2FzZSBEV19GT1JNX3JlZjE6CisJY2FzZSBEV19GT1JNX3JlZjI6CisJY2FzZSBEV19GT1JNX3JlZjQ6CisJY2FzZSBEV19GT1JNX3VkYXRhOgorCWNhc2UgRFdfRk9STV9zZGF0YToKKwkgIGZwcmludGYgKHN0ZGVyciwgImNvbnN0YW50OiAlZCIsIERXX1VOU05EICgmZGllLT5hdHRyc1tpXSkpOworCSAgYnJlYWs7CisJY2FzZSBEV19GT1JNX3N0cmluZzoKKwkgIGZwcmludGYgKHN0ZGVyciwgInN0cmluZzogXCIlc1wiIiwKKwkJICAgRFdfU1RSSU5HICgmZGllLT5hdHRyc1tpXSkKKwkJICAgICA/IERXX1NUUklORyAoJmRpZS0+YXR0cnNbaV0pIDogIiIpOworCSAgYnJlYWs7CisJY2FzZSBEV19GT1JNX2ZsYWc6CisJICBpZiAoRFdfVU5TTkQgKCZkaWUtPmF0dHJzW2ldKSkKKwkgICAgZnByaW50ZiAoc3RkZXJyLCAiZmxhZzogVFJVRSIpOworCSAgZWxzZQorCSAgICBmcHJpbnRmIChzdGRlcnIsICJmbGFnOiBGQUxTRSIpOworCSAgYnJlYWs7CisJY2FzZSBEV19GT1JNX3N0cnA6CS8qIHdlIGRvIG5vdCBzdXBwb3J0IHNlcGFyYXRlIHN0cmluZworCQkJCSAgIHNlY3Rpb24geWV0ICovCisJY2FzZSBEV19GT1JNX2luZGlyZWN0OgkvKiB3ZSBkbyBub3QgaGFuZGxlIGluZGlyZWN0IHlldCAqLworCWNhc2UgRFdfRk9STV9kYXRhODoJLyogd2UgZG8gbm90IGhhdmUgNjQgYml0IHF1YW50aXRpZXMgKi8KKwlkZWZhdWx0OgorCSAgZnByaW50ZiAoc3RkZXJyLCAidW5zdXBwb3J0ZWQgYXR0cmlidXRlIGZvcm06ICVkLiIsCisJCQkgICBkaWUtPmF0dHJzW2ldLmZvcm0pOworCX0KKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7CisgICAgfQorfQorCit2b2lkCitkdW1wX2RpZV9saXN0IChkaWUpCisgICAgIHN0cnVjdCBkaWVfaW5mbyAqZGllOworeworICB3aGlsZSAoZGllKQorICAgIHsKKyAgICAgIGR1bXBfZGllIChkaWUpOworICAgICAgZGllID0gZGllLT5uZXh0OworICAgIH0KK30KKwordm9pZAorc3RvcmVfaW5fcmVmX3RhYmxlIChvZmZzZXQsIGRpZSkKKyAgICAgdW5zaWduZWQgaW50IG9mZnNldDsKKyAgICAgc3RydWN0IGRpZV9pbmZvICpkaWU7Cit7CisgIGludCBoOworICBzdHJ1Y3QgZGllX2luZm8gKm9sZDsKKworICBoID0gKG9mZnNldCAlIFJFRl9IQVNIX1NJWkUpOworICBvbGQgPSBkaWVfcmVmX3RhYmxlW2hdOworICBkaWUtPm5leHRfcmVmID0gb2xkOworICBkaWVfcmVmX3RhYmxlW2hdID0gZGllOworfQorCisKK3N0YXRpYyB2b2lkCitkd2FyZjJfZW1wdHlfZGllX3JlZl90YWJsZSAoKQoreworICBtZW1zZXQgKGRpZV9yZWZfdGFibGUsIDAsIHNpemVvZiAoZGllX3JlZl90YWJsZSkpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Citkd2FyZjJfZ2V0X3JlZl9kaWVfb2Zmc2V0IChhdHRyKQorICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyOworeworICB1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKKworICBzd2l0Y2ggKGF0dHItPmZvcm0pCisgICAgeworICAgIGNhc2UgRFdfRk9STV9yZWZfYWRkcjoKKyAgICAgIHJlc3VsdCA9IERXX0FERFIgKGF0dHIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEV19GT1JNX3JlZjE6CisgICAgY2FzZSBEV19GT1JNX3JlZjI6CisgICAgY2FzZSBEV19GT1JNX3JlZjQ6CisgICAgY2FzZSBEV19GT1JNX3JlZl91ZGF0YToKKyAgICAgIHJlc3VsdCA9IGN1X2hlYWRlcl9vZmZzZXQgKyBEV19VTlNORCAoYXR0cik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgY29tcGxhaW4gKCZkd2FyZjJfdW5zdXBwb3J0ZWRfZGllX3JlZl9hdHRyLCBkd2FyZl9mb3JtX25hbWUgKGF0dHItPmZvcm0pKTsKKyAgICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cnVjdCBkaWVfaW5mbyAqCitmb2xsb3dfZGllX3JlZiAob2Zmc2V0KQorICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworeworICBzdHJ1Y3QgZGllX2luZm8gKmRpZTsKKyAgaW50IGg7CisKKyAgaCA9IChvZmZzZXQgJSBSRUZfSEFTSF9TSVpFKTsKKyAgZGllID0gZGllX3JlZl90YWJsZVtoXTsKKyAgd2hpbGUgKGRpZSkKKyAgICB7CisgICAgICBpZiAoZGllLT5vZmZzZXQgPT0gb2Zmc2V0KQorCXsKKwkgIHJldHVybiBkaWU7CisJfQorICAgICAgZGllID0gZGllLT5uZXh0X3JlZjsKKyAgICB9CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHR5cGUgKgorZHdhcmYyX2Z1bmRhbWVudGFsX3R5cGUgKG9iamZpbGUsIHR5cGVpZCkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIGludCB0eXBlaWQ7Cit7CisgIGlmICh0eXBlaWQgPCAwIHx8IHR5cGVpZCA+PSBGVF9OVU1fTUVNQkVSUykKKyAgICB7CisgICAgICBlcnJvciAoIkR3YXJmIEVycm9yOiBpbnRlcm5hbCBlcnJvciAtIGludmFsaWQgZnVuZGFtZW50YWwgdHlwZSBpZCAlZC4iLAorCSAgICAgdHlwZWlkKTsKKyAgICB9CisKKyAgLyogTG9vayBmb3IgdGhpcyBwYXJ0aWN1bGFyIHR5cGUgaW4gdGhlIGZ1bmRhbWVudGFsIHR5cGUgdmVjdG9yLiAgSWYKKyAgICAgb25lIGlzIG5vdCBmb3VuZCwgY3JlYXRlIGFuZCBpbnN0YWxsIG9uZSBhcHByb3ByaWF0ZSBmb3IgdGhlCisgICAgIGN1cnJlbnQgbGFuZ3VhZ2UgYW5kIHRoZSBjdXJyZW50IHRhcmdldCBtYWNoaW5lLiAqLworCisgIGlmIChmdHlwZXNbdHlwZWlkXSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZ0eXBlc1t0eXBlaWRdID0gY3VfbGFuZ3VhZ2VfZGVmbi0+bGFfZnVuZF90eXBlIChvYmpmaWxlLCB0eXBlaWQpOworICAgIH0KKworICByZXR1cm4gKGZ0eXBlc1t0eXBlaWRdKTsKK30KKworLyogRGVjb2RlIHNpbXBsZSBsb2NhdGlvbiBkZXNjcmlwdGlvbnMuCisgICBHaXZlbiBhIHBvaW50ZXIgdG8gYSBkd2FyZiBibG9jayB0aGF0IGRlZmluZXMgYSBsb2NhdGlvbiwgY29tcHV0ZQorICAgdGhlIGxvY2F0aW9uIGFuZCByZXR1cm4gdGhlIHZhbHVlLgorCisgICBGSVhNRTogVGhpcyBpcyBhIGtsdWRnZSB1bnRpbCB3ZSBmaWd1cmUgb3V0IGEgYmV0dGVyCisgICB3YXkgdG8gaGFuZGxlIHRoZSBsb2NhdGlvbiBkZXNjcmlwdGlvbnMuCisgICBHZGIncyBkZXNpZ24gZG9lcyBub3QgbWVzaCB3ZWxsIHdpdGggdGhlIERXQVJGMiBub3Rpb24gb2YgYSBsb2NhdGlvbgorICAgY29tcHV0aW5nIGludGVycHJldGVyLCB3aGljaCBpcyBhIHNoYW1lIGJlY2F1c2UgdGhlIGZsZXhpYmlsaXR5IGdvZXMgdW51c2VkLgorICAgRklYTUU6IEltcGxlbWVudCBtb3JlIG9wZXJhdGlvbnMgYXMgbmVjZXNzYXJ5LgorCisgICBBIGxvY2F0aW9uIGRlc2NyaXB0aW9uIGNvbnRhaW5pbmcgbm8gb3BlcmF0aW9ucyBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAgIG9iamVjdCBpcyBvcHRpbWl6ZWQgb3V0LiBUaGUgZ2xvYmFsIG9wdGltaXplZF9vdXQgZmxhZyBpcyBzZXQgZm9yCisgICB0aG9zZSwgdGhlIHJldHVybiB2YWx1ZSBpcyBtZWFuaW5nbGVzcy4KKworICAgV2hlbiB0aGUgcmVzdWx0IGlzIGEgcmVnaXN0ZXIgbnVtYmVyLCB0aGUgZ2xvYmFsIGlzcmVnIGZsYWcgaXMgc2V0LAorICAgb3RoZXJ3aXNlIGl0IGlzIGNsZWFyZWQuCisKKyAgIFdoZW4gdGhlIHJlc3VsdCBpcyBhIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0LCB0aGUgZ2xvYmFsIG9mZnJlZyBmbGFnIGlzIHNldAorICAgYW5kIHRoZSByZWdpc3RlciBudW1iZXIgaXMgcmV0dXJuZWQgaW4gYmFzZXJlZywgb3RoZXJ3aXNlIGl0IGlzIGNsZWFyZWQuCisKKyAgIFdoZW4gdGhlIERXX09QX2ZicmVnIG9wZXJhdGlvbiBpcyBlbmNvdW50ZXJlZCB3aXRob3V0IGEgY29ycmVzcG9uZGluZworICAgRFdfQVRfZnJhbWVfYmFzZSBhdHRyaWJ1dGUsIHRoZSBnbG9iYWwgaXNsb2NhbCBmbGFnIGlzIHNldC4KKyAgIEhvcGVmdWxseSB0aGUgbWFjaGluZSBkZXBlbmRlbnQgY29kZSBrbm93cyBob3cgdG8gc2V0IHVwIGEgdmlydHVhbAorICAgZnJhbWUgcG9pbnRlciBmb3IgdGhlIGxvY2FsIHJlZmVyZW5jZXMuCisgCisgICBOb3RlIHRoYXQgc3RhY2tbMF0gaXMgdW51c2VkIGV4Y2VwdCBhcyBhIGRlZmF1bHQgZXJyb3IgcmV0dXJuLgorICAgTm90ZSB0aGF0IHN0YWNrIG92ZXJmbG93IGlzIG5vdCB5ZXQgaGFuZGxlZC4gICovCisKK3N0YXRpYyBDT1JFX0FERFIKK2RlY29kZV9sb2NkZXNjIChibGssIG9iamZpbGUpCisgICAgIHN0cnVjdCBkd2FyZl9ibG9jayAqYmxrOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaW50IGk7CisgIGludCBzaXplID0gYmxrLT5zaXplOworICBjaGFyICpkYXRhID0gYmxrLT5kYXRhOworICBDT1JFX0FERFIgc3RhY2tbNjRdOworICBpbnQgc3RhY2tpOworICB1bnNpZ25lZCBpbnQgYnl0ZXNfcmVhZCwgdW5zbmQ7CisgIHVuc2lnbmVkIGNoYXIgb3A7CisKKyAgaSA9IDA7CisgIHN0YWNraSA9IDA7CisgIHN0YWNrW3N0YWNraV0gPSAwOworICBpc3JlZyA9IDA7CisgIG9mZnJlZyA9IDA7CisgIGlzbG9jYWwgPSAwOworICBvcHRpbWl6ZWRfb3V0ID0gMTsKKworICB3aGlsZSAoaSA8IHNpemUpCisgICAgeworICAgICAgb3B0aW1pemVkX291dCA9IDA7CisgICAgICBvcCA9IGRhdGFbaSsrXTsKKyAgICAgIHN3aXRjaCAob3ApCisJeworCWNhc2UgRFdfT1BfcmVnMDoKKwljYXNlIERXX09QX3JlZzE6CisJY2FzZSBEV19PUF9yZWcyOgorCWNhc2UgRFdfT1BfcmVnMzoKKwljYXNlIERXX09QX3JlZzQ6CisJY2FzZSBEV19PUF9yZWc1OgorCWNhc2UgRFdfT1BfcmVnNjoKKwljYXNlIERXX09QX3JlZzc6CisJY2FzZSBEV19PUF9yZWc4OgorCWNhc2UgRFdfT1BfcmVnOToKKwljYXNlIERXX09QX3JlZzEwOgorCWNhc2UgRFdfT1BfcmVnMTE6CisJY2FzZSBEV19PUF9yZWcxMjoKKwljYXNlIERXX09QX3JlZzEzOgorCWNhc2UgRFdfT1BfcmVnMTQ6CisJY2FzZSBEV19PUF9yZWcxNToKKwljYXNlIERXX09QX3JlZzE2OgorCWNhc2UgRFdfT1BfcmVnMTc6CisJY2FzZSBEV19PUF9yZWcxODoKKwljYXNlIERXX09QX3JlZzE5OgorCWNhc2UgRFdfT1BfcmVnMjA6CisJY2FzZSBEV19PUF9yZWcyMToKKwljYXNlIERXX09QX3JlZzIyOgorCWNhc2UgRFdfT1BfcmVnMjM6CisJY2FzZSBEV19PUF9yZWcyNDoKKwljYXNlIERXX09QX3JlZzI1OgorCWNhc2UgRFdfT1BfcmVnMjY6CisJY2FzZSBEV19PUF9yZWcyNzoKKwljYXNlIERXX09QX3JlZzI4OgorCWNhc2UgRFdfT1BfcmVnMjk6CisJY2FzZSBEV19PUF9yZWczMDoKKwljYXNlIERXX09QX3JlZzMxOgorCSAgaXNyZWcgPSAxOworCSAgc3RhY2tbKytzdGFja2ldID0gb3AgLSBEV19PUF9yZWcwOworCSAgYnJlYWs7CisKKwljYXNlIERXX09QX3JlZ3g6CisJICBpc3JlZyA9IDE7CisJICB1bnNuZCA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChOVUxMLCAoZGF0YSArIGkpLCAmYnl0ZXNfcmVhZCk7CisJICBpICs9IGJ5dGVzX3JlYWQ7CisjaWYgZGVmaW5lZChIQVJSSVNfVEFSR0VUKSAmJiBkZWZpbmVkKF9NODhLKQorCSAgLyogVGhlIEhhcnJpcyA4ODExMCBnZGIgcG9ydHMgaGF2ZSBsb25nIGtlcHQgdGhlaXIgc3BlY2lhbCByZWcKKwkgICAgIG51bWJlcnMgYmV0d2VlbiB0aGVpciBncC1yZWdzIGFuZCB0aGVpciB4LXJlZ3MuICBUaGlzIGlzCisJICAgICBub3QgaG93IG91ciBkd2FyZiBpcyBnZW5lcmF0ZWQuICBQdW50LiAqLworCSAgdW5zbmQgKz0gNjsKKyNlbmRpZgorCSAgc3RhY2tbKytzdGFja2ldID0gdW5zbmQ7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfYnJlZzA6CisJY2FzZSBEV19PUF9icmVnMToKKwljYXNlIERXX09QX2JyZWcyOgorCWNhc2UgRFdfT1BfYnJlZzM6CisJY2FzZSBEV19PUF9icmVnNDoKKwljYXNlIERXX09QX2JyZWc1OgorCWNhc2UgRFdfT1BfYnJlZzY6CisJY2FzZSBEV19PUF9icmVnNzoKKwljYXNlIERXX09QX2JyZWc4OgorCWNhc2UgRFdfT1BfYnJlZzk6CisJY2FzZSBEV19PUF9icmVnMTA6CisJY2FzZSBEV19PUF9icmVnMTE6CisJY2FzZSBEV19PUF9icmVnMTI6CisJY2FzZSBEV19PUF9icmVnMTM6CisJY2FzZSBEV19PUF9icmVnMTQ6CisJY2FzZSBEV19PUF9icmVnMTU6CisJY2FzZSBEV19PUF9icmVnMTY6CisJY2FzZSBEV19PUF9icmVnMTc6CisJY2FzZSBEV19PUF9icmVnMTg6CisJY2FzZSBEV19PUF9icmVnMTk6CisJY2FzZSBEV19PUF9icmVnMjA6CisJY2FzZSBEV19PUF9icmVnMjE6CisJY2FzZSBEV19PUF9icmVnMjI6CisJY2FzZSBEV19PUF9icmVnMjM6CisJY2FzZSBEV19PUF9icmVnMjQ6CisJY2FzZSBEV19PUF9icmVnMjU6CisJY2FzZSBEV19PUF9icmVnMjY6CisJY2FzZSBEV19PUF9icmVnMjc6CisJY2FzZSBEV19PUF9icmVnMjg6CisJY2FzZSBEV19PUF9icmVnMjk6CisJY2FzZSBEV19PUF9icmVnMzA6CisJY2FzZSBEV19PUF9icmVnMzE6CisJICBvZmZyZWcgPSAxOworCSAgYmFzZXJlZyA9IG9wIC0gRFdfT1BfYnJlZzA7CisJICBzdGFja1srK3N0YWNraV0gPSByZWFkX3NpZ25lZF9sZWIxMjggKE5VTEwsIChkYXRhICsgaSksICZieXRlc19yZWFkKTsKKwkgIGkgKz0gYnl0ZXNfcmVhZDsKKwkgIGJyZWFrOworCisJY2FzZSBEV19PUF9mYnJlZzoKKwkgIHN0YWNrWysrc3RhY2tpXSA9IHJlYWRfc2lnbmVkX2xlYjEyOCAoTlVMTCwgKGRhdGEgKyBpKSwgJmJ5dGVzX3JlYWQpOworCSAgaSArPSBieXRlc19yZWFkOworCSAgaWYgKGZyYW1lX2Jhc2VfcmVnID49IDApCisJICAgIHsKKwkgICAgICBvZmZyZWcgPSAxOworCSAgICAgIGJhc2VyZWcgPSBmcmFtZV9iYXNlX3JlZzsKKwkgICAgICBzdGFja1tzdGFja2ldICs9IGZyYW1lX2Jhc2Vfb2Zmc2V0OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb21wbGFpbiAoJmR3YXJmMl9taXNzaW5nX2F0X2ZyYW1lX2Jhc2UpOworCSAgICAgIGlzbG9jYWwgPSAxOworCSAgICB9CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfYWRkcjoKKwkgIHN0YWNrWysrc3RhY2tpXSA9IHJlYWRfYWRkcmVzcyAob2JqZmlsZS0+b2JmZCwgJmRhdGFbaV0pOworCSAgaSArPSBhZGRyZXNzX3NpemU7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfY29uc3QxdToKKwkgIHN0YWNrWysrc3RhY2tpXSA9IHJlYWRfMV9ieXRlIChvYmpmaWxlLT5vYmZkLCAmZGF0YVtpXSk7CisJICBpICs9IDE7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfY29uc3QxczoKKwkgIHN0YWNrWysrc3RhY2tpXSA9IHJlYWRfMV9zaWduZWRfYnl0ZSAob2JqZmlsZS0+b2JmZCwgJmRhdGFbaV0pOworCSAgaSArPSAxOworCSAgYnJlYWs7CisKKwljYXNlIERXX09QX2NvbnN0MnU6CisJICBzdGFja1srK3N0YWNraV0gPSByZWFkXzJfYnl0ZXMgKG9iamZpbGUtPm9iZmQsICZkYXRhW2ldKTsKKwkgIGkgKz0gMjsKKwkgIGJyZWFrOworCisJY2FzZSBEV19PUF9jb25zdDJzOgorCSAgc3RhY2tbKytzdGFja2ldID0gcmVhZF8yX3NpZ25lZF9ieXRlcyAob2JqZmlsZS0+b2JmZCwgJmRhdGFbaV0pOworCSAgaSArPSAyOworCSAgYnJlYWs7CisKKwljYXNlIERXX09QX2NvbnN0NHU6CisJICBzdGFja1srK3N0YWNraV0gPSByZWFkXzRfYnl0ZXMgKG9iamZpbGUtPm9iZmQsICZkYXRhW2ldKTsKKwkgIGkgKz0gNDsKKwkgIGJyZWFrOworCisJY2FzZSBEV19PUF9jb25zdDRzOgorCSAgc3RhY2tbKytzdGFja2ldID0gcmVhZF80X3NpZ25lZF9ieXRlcyAob2JqZmlsZS0+b2JmZCwgJmRhdGFbaV0pOworCSAgaSArPSA0OworCSAgYnJlYWs7CisKKwljYXNlIERXX09QX2NvbnN0dToKKwkgIHN0YWNrWysrc3RhY2tpXSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChOVUxMLCAoZGF0YSArIGkpLAorCQkJCQkJCSAmYnl0ZXNfcmVhZCk7CisJICBpICs9IGJ5dGVzX3JlYWQ7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfY29uc3RzOgorCSAgc3RhY2tbKytzdGFja2ldID0gcmVhZF9zaWduZWRfbGViMTI4IChOVUxMLCAoZGF0YSArIGkpLCAmYnl0ZXNfcmVhZCk7CisJICBpICs9IGJ5dGVzX3JlYWQ7CisJICBicmVhazsKKworCWNhc2UgRFdfT1BfcGx1czoKKwkgIHN0YWNrW3N0YWNraSAtIDFdICs9IHN0YWNrW3N0YWNraV07CisJICBzdGFja2ktLTsKKwkgIGJyZWFrOworCisJY2FzZSBEV19PUF9wbHVzX3Vjb25zdDoKKwkgIHN0YWNrW3N0YWNraV0gKz0gcmVhZF91bnNpZ25lZF9sZWIxMjggKE5VTEwsIChkYXRhICsgaSksICZieXRlc19yZWFkKTsKKwkgIGkgKz0gYnl0ZXNfcmVhZDsKKwkgIGJyZWFrOworCisJY2FzZSBEV19PUF9taW51czoKKwkgIHN0YWNrW3N0YWNraSAtIDFdID0gc3RhY2tbc3RhY2tpXSAtIHN0YWNrW3N0YWNraSAtIDFdOworCSAgc3RhY2tpLS07CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBjb21wbGFpbiAoJmR3YXJmMl91bnN1cHBvcnRlZF9zdGFja19vcCwgZHdhcmZfc3RhY2tfb3BfbmFtZShvcCkpOworCSAgcmV0dXJuIChzdGFja1tzdGFja2ldKTsKKwl9CisgICAgfQorICByZXR1cm4gKHN0YWNrW3N0YWNraV0pOworfQorCisvKiBtZW1vcnkgYWxsb2NhdGlvbiBpbnRlcmZhY2UgKi8KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitkd2FyZjJfZnJlZV90bXBfb2JzdGFjayAoaWdub3JlKQorICAgICBQVFIgaWdub3JlOworeworICBvYnN0YWNrX2ZyZWUgKCZkd2FyZjJfdG1wX29ic3RhY2ssIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGR3YXJmX2Jsb2NrICoKK2R3YXJmX2FsbG9jX2Jsb2NrICgpCit7CisgIHN0cnVjdCBkd2FyZl9ibG9jayAqYmxrOworCisgIGJsayA9IChzdHJ1Y3QgZHdhcmZfYmxvY2sgKikKKyAgICBvYnN0YWNrX2FsbG9jICgmZHdhcmYyX3RtcF9vYnN0YWNrLCBzaXplb2YgKHN0cnVjdCBkd2FyZl9ibG9jaykpOworICByZXR1cm4gKGJsayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWJicmV2X2luZm8gKgorZHdhcmZfYWxsb2NfYWJicmV2ICgpCit7CisgIHN0cnVjdCBhYmJyZXZfaW5mbyAqYWJicmV2OworCisgIGFiYnJldiA9IChzdHJ1Y3QgYWJicmV2X2luZm8gKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYWJicmV2X2luZm8pKTsKKyAgbWVtc2V0IChhYmJyZXYsIDAsIHNpemVvZiAoc3RydWN0IGFiYnJldl9pbmZvKSk7CisgIHJldHVybiAoYWJicmV2KTsKK30KKworc3RhdGljIHN0cnVjdCBkaWVfaW5mbyAqCitkd2FyZl9hbGxvY19kaWUgKCkKK3sKKyAgc3RydWN0IGRpZV9pbmZvICpkaWU7CisKKyAgZGllID0gKHN0cnVjdCBkaWVfaW5mbyAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBkaWVfaW5mbykpOworICBtZW1zZXQgKGRpZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgZGllX2luZm8pKTsKKyAgcmV0dXJuIChkaWUpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2R3YXJmcmVhZC5jIGIvZ2RiL2R3YXJmcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZTAzMTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZHdhcmZyZWFkLmMKQEAgLTAsMCArMSwzOTE1IEBACisvKiBEV0FSRiBkZWJ1Z2dpbmcgZm9ybWF0IHN1cHBvcnQgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBhdCBDeWdudXMgU3VwcG9ydC4gIFBvcnRpb25zIGJhc2VkIG9uIGRieHJlYWQuYywKKyAgIG1pcHNyZWFkLmMsIGNvZmZyZWFkLmMsIGFuZCBkd2FyZnJlYWQuYyBmcm9tIGEgRGF0YSBHZW5lcmFsIFNWUjQgZ2RiIHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKworRklYTUU6IERvIHdlIG5lZWQgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jaWVzIGluIHBhcnRpYWwgc3ltdGFicz8KKyhQZXJoYXBzIHdlIGRvbid0IG5lZWQgdG8pLgorCitGSVhNRTogUmVzb2x2ZSBtaW5vciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHdoYXQgaW5mb3JtYXRpb24gd2UgcHV0IGluIHRoZQorcGFydGlhbCBzeW1ib2wgdGFibGUgYW5kIHdoYXQgZGJ4cmVhZCBwdXRzIGluLiAgRm9yIGV4YW1wbGUsIHdlIGRvbid0IHlldAorcHV0IGVudW0gY29uc3RhbnRzIHRoZXJlLiAgQW5kIGRieHJlYWQgc2VlbXMgdG8gaW52ZW50IGEgbG90IG9mIHR5cGVkZWZzCit3ZSBuZXZlciBzZWUuICBVc2UgdGhlIG5ldyBwcmludHBzeW0gY29tbWFuZCB0byBzZWUgdGhlIHBhcnRpYWwgc3ltYm9sIHRhYmxlCitjb250ZW50cy4KKworRklYTUU6IEZpZ3VyZSBvdXQgYSBiZXR0ZXIgd2F5IHRvIHRlbGwgZ2RiIGFib3V0IHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbgorY29udGFpbiB0aGUgdXNlcidzIGVudHJ5IHBvaW50IChJLkUuIG1haW4oKSkKKworRklYTUU6IFNlZSBvdGhlciBGSVhNRSdzIGFuZCAiaWZkZWYgMCIgc2NhdHRlcmVkIHRocm91Z2hvdXQgdGhlIGNvZGUgZm9yCitvdGhlciB0aGluZ3MgdG8gd29yayBvbiwgaWYgeW91IGdldCBib3JlZC4gOi0pCisKKyovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJlbGYvZHdhcmYuaCIKKyNpbmNsdWRlICJidWlsZHN5bS5oIgorI2luY2x1ZGUgImRlbWFuZ2xlLmgiCisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgkvKiBOZWVkZWQgZm9yIGVudW0gZXhwX29wY29kZSBpbiBsYW5ndWFnZS5oLCBzaWdoLi4uICovCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJjb21wbGFpbnRzLmgiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKworLyogU29tZSBtYWNyb3MgdG8gcHJvdmlkZSBESUUgaW5mbyBmb3IgY29tcGxhaW50cy4gKi8KKworI2RlZmluZSBESUVfSUQgKGN1cmRpZSE9TlVMTCA/IGN1cmRpZS0+ZGllX3JlZiA6IDApCisjZGVmaW5lIERJRV9OQU1FIChjdXJkaWUhPU5VTEwgJiYgY3VyZGllLT5hdF9uYW1lIT1OVUxMKSA/IGN1cmRpZS0+YXRfbmFtZSA6ICIiCisKKy8qIENvbXBsYWludHMgdGhhdCBjYW4gYmUgaXNzdWVkIGR1cmluZyBEV0FSRiBkZWJ1ZyBpbmZvIHJlYWRpbmcuICovCisKK3N0cnVjdCBjb21wbGFpbnQgbm9fYmZkX2dldF9OID0KK3sKKyAgIkRJRSBAIDB4JXggXCIlc1wiLCBubyBiZmQgc3VwcG9ydCBmb3IgJWQgYnl0ZSBkYXRhIG9iamVjdCIsIDAsIDAKK307CisKK3N0cnVjdCBjb21wbGFpbnQgbWFsZm9ybWVkX2RpZSA9Cit7CisgICJESUUgQCAweCV4IFwiJXNcIiwgbWFsZm9ybWVkIERJRSwgYmFkIGxlbmd0aCAoJWQgYnl0ZXMpIiwgMCwgMAorfTsKKworc3RydWN0IGNvbXBsYWludCBiYWRfZGllX3JlZiA9Cit7CisgICJESUUgQCAweCV4IFwiJXNcIiwgcmVmZXJlbmNlIHRvIERJRSAoMHgleCkgb3V0c2lkZSBjb21waWxhdGlvbiB1bml0IiwgMCwgMAorfTsKKworc3RydWN0IGNvbXBsYWludCB1bmtub3duX2F0dHJpYnV0ZV9mb3JtID0KK3sKKyAgIkRJRSBAIDB4JXggXCIlc1wiLCB1bmtub3duIGF0dHJpYnV0ZSBmb3JtICgweCV4KSIsIDAsIDAKK307CisKK3N0cnVjdCBjb21wbGFpbnQgdW5rbm93bl9hdHRyaWJ1dGVfbGVuZ3RoID0KK3sKKyAgIkRJRSBAIDB4JXggXCIlc1wiLCB1bmtub3duIGF0dHJpYnV0ZSBsZW5ndGgsIHNraXBwZWQgcmVtYWluaW5nIGF0dHJpYnV0ZXMiLCAwLCAwCit9OworCitzdHJ1Y3QgY29tcGxhaW50IHVuZXhwZWN0ZWRfZnVuZF90eXBlID0KK3sKKyAgIkRJRSBAIDB4JXggXCIlc1wiLCB1bmV4cGVjdGVkIGZ1bmRhbWVudGFsIHR5cGUgMHgleCIsIDAsIDAKK307CisKK3N0cnVjdCBjb21wbGFpbnQgdW5rbm93bl90eXBlX21vZGlmaWVyID0KK3sKKyAgIkRJRSBAIDB4JXggXCIlc1wiLCB1bmtub3duIHR5cGUgbW9kaWZpZXIgJXUiLCAwLCAwCit9OworCitzdHJ1Y3QgY29tcGxhaW50IHZvbGF0aWxlX2lnbm9yZWQgPQoreworICAiRElFIEAgMHgleCBcIiVzXCIsIHR5cGUgbW9kaWZpZXIgJ3ZvbGF0aWxlJyBpZ25vcmVkIiwgMCwgMAorfTsKKworc3RydWN0IGNvbXBsYWludCBjb25zdF9pZ25vcmVkID0KK3sKKyAgIkRJRSBAIDB4JXggXCIlc1wiLCB0eXBlIG1vZGlmaWVyICdjb25zdCcgaWdub3JlZCIsIDAsIDAKK307CisKK3N0cnVjdCBjb21wbGFpbnQgYm90Y2hlZF9tb2RpZmllZF90eXBlID0KK3sKKyAgIkRJRSBAIDB4JXggXCIlc1wiLCBib3RjaGVkIG1vZGlmaWVkIHR5cGUgZGVjb2RpbmcgKG10eXBlIDB4JXgpIiwgMCwgMAorfTsKKworc3RydWN0IGNvbXBsYWludCBvcF9kZXJlZjIgPQoreworICAiRElFIEAgMHgleCBcIiVzXCIsIE9QX0RFUkVGMiBhZGRyZXNzIDB4JXggbm90IGhhbmRsZWQiLCAwLCAwCit9OworCitzdHJ1Y3QgY29tcGxhaW50IG9wX2RlcmVmNCA9Cit7CisgICJESUUgQCAweCV4IFwiJXNcIiwgT1BfREVSRUY0IGFkZHJlc3MgMHgleCBub3QgaGFuZGxlZCIsIDAsIDAKK307CisKK3N0cnVjdCBjb21wbGFpbnQgYmFzZXJlZ19ub3RfaGFuZGxlZCA9Cit7CisgICJESUUgQCAweCV4IFwiJXNcIiwgQkFTRVJFRyAlZCBub3QgaGFuZGxlZCIsIDAsIDAKK307CisKK3N0cnVjdCBjb21wbGFpbnQgZHVwX3VzZXJfdHlwZV9hbGxvY2F0aW9uID0KK3sKKyAgIkRJRSBAIDB4JXggXCIlc1wiLCBpbnRlcm5hbCBlcnJvcjogZHVwbGljYXRlIHVzZXIgdHlwZSBhbGxvY2F0aW9uIiwgMCwgMAorfTsKKworc3RydWN0IGNvbXBsYWludCBkdXBfdXNlcl90eXBlX2RlZmluaXRpb24gPQoreworICAiRElFIEAgMHgleCBcIiVzXCIsIGludGVybmFsIGVycm9yOiBkdXBsaWNhdGUgdXNlciB0eXBlIGRlZmluaXRpb24iLCAwLCAwCit9OworCitzdHJ1Y3QgY29tcGxhaW50IG1pc3NpbmdfdGFnID0KK3sKKyAgIkRJRSBAIDB4JXggXCIlc1wiLCBtaXNzaW5nIGNsYXNzLCBzdHJ1Y3R1cmUsIG9yIHVuaW9uIHRhZyIsIDAsIDAKK307CisKK3N0cnVjdCBjb21wbGFpbnQgYmFkX2FycmF5X2VsZW1lbnRfdHlwZSA9Cit7CisgICJESUUgQCAweCV4IFwiJXNcIiwgYmFkIGFycmF5IGVsZW1lbnQgdHlwZSBhdHRyaWJ1dGUgMHgleCIsIDAsIDAKK307CisKK3N0cnVjdCBjb21wbGFpbnQgc3Vic2NyaXB0X2RhdGFfaXRlbXMgPQoreworICAiRElFIEAgMHgleCBcIiVzXCIsIGNhbid0IGRlY29kZSBzdWJzY3JpcHQgZGF0YSBpdGVtcyIsIDAsIDAKK307CisKK3N0cnVjdCBjb21wbGFpbnQgdW5oYW5kbGVkX2FycmF5X3N1YnNjcmlwdF9mb3JtYXQgPQoreworICAiRElFIEAgMHgleCBcIiVzXCIsIGFycmF5IHN1YnNjcmlwdCBmb3JtYXQgMHgleCBub3QgaGFuZGxlZCB5ZXQiLCAwLCAwCit9OworCitzdHJ1Y3QgY29tcGxhaW50IHVua25vd25fYXJyYXlfc3Vic2NyaXB0X2Zvcm1hdCA9Cit7CisgICJESUUgQCAweCV4IFwiJXNcIiwgdW5rbm93biBhcnJheSBzdWJzY3JpcHQgZm9ybWF0ICV4IiwgMCwgMAorfTsKKworc3RydWN0IGNvbXBsYWludCBub3Rfcm93X21ham9yID0KK3sKKyAgIkRJRSBAIDB4JXggXCIlc1wiLCBhcnJheSBub3Qgcm93IG1ham9yOyBub3QgaGFuZGxlZCBjb3JyZWN0bHkiLCAwLCAwCit9OworCitzdHJ1Y3QgY29tcGxhaW50IG1pc3NpbmdfYXRfbmFtZSA9Cit7CisgICJESUUgQCAweCV4LCBBVF9uYW1lIHRhZyBtaXNzaW5nIiwgMCwgMAorfTsKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgRElFX1JFRjsJLyogUmVmZXJlbmNlIHRvIGEgRElFICovCisKKyNpZm5kZWYgR0NDX1BST0RVQ0VSCisjZGVmaW5lIEdDQ19QUk9EVUNFUiAiR05VIEMgIgorI2VuZGlmCisKKyNpZm5kZWYgR1BMVVNfUFJPRFVDRVIKKyNkZWZpbmUgR1BMVVNfUFJPRFVDRVIgIkdOVSBDKysgIgorI2VuZGlmCisKKyNpZm5kZWYgTENDX1BST0RVQ0VSCisjZGVmaW5lIExDQ19QUk9EVUNFUiAiTkNSIEMvQysrIgorI2VuZGlmCisKKyNpZm5kZWYgQ0hJTExfUFJPRFVDRVIKKyNkZWZpbmUgQ0hJTExfUFJPRFVDRVIgIkdOVSBDaGlsbCAiCisjZW5kaWYKKworLyogUHJvdmlkZSBhIGRlZmF1bHQgbWFwcGluZyBmcm9tIGEgRFdBUkYgcmVnaXN0ZXIgbnVtYmVyIHRvIGEgZ2RiIFJFR05VTS4gICovCisjaWZuZGVmIERXQVJGX1JFR19UT19SRUdOVU0KKyNkZWZpbmUgRFdBUkZfUkVHX1RPX1JFR05VTShudW0pIChudW0pCisjZW5kaWYKKworLyogRmxhZ3MgdG8gdGFyZ2V0X3RvX2hvc3QoKSB0aGF0IHRlbGwgd2hldGhlciBvciBub3QgdGhlIGRhdGEgb2JqZWN0IGlzCisgICBleHBlY3RlZCB0byBiZSBzaWduZWQuICBVc2VkLCBmb3IgZXhhbXBsZSwgd2hlbiBmZXRjaGluZyBhIHNpZ25lZAorICAgaW50ZWdlciBpbiB0aGUgdGFyZ2V0IGVudmlyb25tZW50IHdoaWNoIGlzIHVzZWQgYXMgYSBzaWduZWQgaW50ZWdlcgorICAgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQsIGFuZCB0aGUgdHdvIGVudmlyb25tZW50cyBoYXZlIGRpZmZlcmVudCBzaXplZAorICAgaW50cy4gIEluIHRoaXMgY2FzZSwgKnNvbWVib2R5KiBoYXMgdG8gc2lnbiBleHRlbmQgdGhlIHNtYWxsZXIgc2l6ZWQKKyAgIGludC4gKi8KKworI2RlZmluZSBHRVRfVU5TSUdORUQJMAkvKiBObyBzaWduIGV4dGVuc2lvbiByZXF1aXJlZCAqLworI2RlZmluZSBHRVRfU0lHTkVECTEJLyogU2lnbiBleHRlbnNpb24gcmVxdWlyZWQgKi8KKworLyogRGVmaW5lcyBmb3IgdGhpbmdzIHdoaWNoIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGRvY3VtZW50ICJEV0FSRiBEZWJ1Z2dpbmcKKyAgIEluZm9ybWF0aW9uIEZvcm1hdCIgcHVibGlzaGVkIGJ5IFVOSVggSW50ZXJuYXRpb25hbCwgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2VzCisgICBTSUcuICBUaGVzZSBkZWZpbmVzIGFyZSBiYXNlZCBvbiByZXZpc2lvbiAxLjAuMCwgSmFuIDIwLCAxOTkyLiAqLworCisjZGVmaW5lIFNJWkVPRl9ESUVfTEVOR1RICTQKKyNkZWZpbmUgU0laRU9GX0RJRV9UQUcJCTIKKyNkZWZpbmUgU0laRU9GX0FUVFJJQlVURQkyCisjZGVmaW5lIFNJWkVPRl9GT1JNQVRfU1BFQ0lGSUVSCTEKKyNkZWZpbmUgU0laRU9GX0ZNVF9GVAkJMgorI2RlZmluZSBTSVpFT0ZfTElORVRCTF9MRU5HVEgJNAorI2RlZmluZSBTSVpFT0ZfTElORVRCTF9MSU5FTk8JNAorI2RlZmluZSBTSVpFT0ZfTElORVRCTF9TVE1UCTIKKyNkZWZpbmUgU0laRU9GX0xJTkVUQkxfREVMVEEJNAorI2RlZmluZSBTSVpFT0ZfTE9DX0FUT01fQ09ERQkxCisKKyNkZWZpbmUgRk9STV9GUk9NX0FUVFIoYXR0cikJKChhdHRyKSAmIDB4RikJLyogSW1wbGljaXRseSBzcGVjaWZpZWQgKi8KKworLyogTWFjcm9zIHRoYXQgcmV0dXJuIHRoZSBzaXplcyBvZiB2YXJpb3VzIHR5cGVzIG9mIGRhdGEgaW4gdGhlIHRhcmdldAorICAgZW52aXJvbm1lbnQuCisKKyAgIEZJWE1FOiAgQ3VycmVudGx5IHRoZXNlIGFyZSBqdXN0IGNvbXBpbGUgdGltZSBjb25zdGFudHMgKGFzIHRoZXkgYXJlIGluCisgICBvdGhlciBwYXJ0cyBvZiBnZGIgYXMgd2VsbCkuICBUaGV5IG5lZWQgdG8gYmUgYWJsZSB0byBnZXQgdGhlIHJpZ2h0IHNpemUKKyAgIGVpdGhlciBmcm9tIHRoZSBiZmQgb3IgcG9zc2libHkgZnJvbSB0aGUgRFdBUkYgaW5mby4gIEl0IHdvdWxkIGJlIG5pY2UgaWYKKyAgIHRoZSBEV0FSRiBwcm9kdWNlciBpbnNlcnRlZCBESUVTIHRoYXQgZGVzY3JpYmUgdGhlIGZ1bmRhbWVudGFsIHR5cGVzIGluCisgICB0aGUgdGFyZ2V0IGVudmlyb25tZW50IGludG8gdGhlIERXQVJGIGluZm8sIHNpbWlsYXIgdG8gdGhlIHdheSBkYnggc3RhYnMKKyAgIHByb2R1Y2VycyBwcm9kdWNlIGluZm9ybWF0aW9uIGFib3V0IHRoZWlyIGZ1bmRhbWVudGFsIHR5cGVzLiAqLworCisjZGVmaW5lIFRBUkdFVF9GVF9QT0lOVEVSX1NJWkUob2JqZmlsZSkJKFRBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUKQorI2RlZmluZSBUQVJHRVRfRlRfTE9OR19TSVpFKG9iamZpbGUpCShUQVJHRVRfTE9OR19CSVQgLyBUQVJHRVRfQ0hBUl9CSVQpCisKKy8qIFRoZSBBbWlnYSBTVlI0IGhlYWRlciBmaWxlIDxkd2FyZi5oPiBkZWZpbmVzIEFUX2VsZW1lbnRfbGlzdCBhcyBhCisgICBGT1JNX0JMT0NLMiwgYW5kIHRoaXMgaXMgdGhlIHZhbHVlIGVtaXR0ZWQgYnkgdGhlIEFUJlQgY29tcGlsZXIuCisgICBIb3dldmVyLCB0aGUgSXNzdWUgMiBEV0FSRiBzcGVjaWZpY2F0aW9uIGZyb20gQVQmVCBkZWZpbmVzIGl0IGFzCisgICBhIEZPUk1fQkxPQ0s0LCBhcyBkb2VzIHRoZSBsYXRlc3Qgc3BlY2lmaWNhdGlvbiBmcm9tIFVJL1BMU0lHLgorICAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEFUJlQgY29tcGlsZXIgcHJvZHVjZWQgZXhlY3V0YWJsZXMKKyAgIHdlIGRlZmluZSBBVF9zaG9ydF9lbGVtZW50X2xpc3QgZm9yIHRoaXMgdmFyaWFudC4gKi8KKworI2RlZmluZQlBVF9zaG9ydF9lbGVtZW50X2xpc3QJICgweDAwZjB8Rk9STV9CTE9DSzIpCisKKy8qIEV4dGVybmFsIHZhcmlhYmxlcyByZWZlcmVuY2VkLiAqLworCitleHRlcm4gaW50IGluZm9fdmVyYm9zZTsJCS8qIEZyb20gbWFpbi5jOyBub256ZXJvID0+IHZlcmJvc2UgKi8KK2V4dGVybiBjaGFyICp3YXJuaW5nX3ByZV9wcmludDsJCS8qIEZyb20gdXRpbHMuYyAqLworCisvKiBUaGUgRFdBUkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGNvbnNpc3RzIG9mIHR3byBtYWpvciBwaWVjZXMsCisgICBvbmUgaXMgYSBibG9jayBvZiBEV0FSRiBJbmZvcm1hdGlvbiBFbnRyaWVzIChESUUncykgYW5kIHRoZSBvdGhlcgorICAgaXMgYSBsaW5lIG51bWJlciB0YWJsZS4gIFRoZSAic3RydWN0IGRpZWluZm8iIHN0cnVjdHVyZSBjb250YWlucworICAgdGhlIGluZm9ybWF0aW9uIGZvciBhIHNpbmdsZSBESUUsIHRoZSBvbmUgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4KKworICAgSW4gb3JkZXIgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmFuZG9tbHkgYWNjZXNzIHRoZSBhdHRyaWJ1dGUgZmllbGRzCisgICBvZiB0aGUgY3VycmVudCBESUUsIHdoaWNoIGFyZSBzcGVjaWZpY2FsbHkgdW5vcmRlcmVkIHdpdGhpbiB0aGUgRElFLAorICAgZWFjaCBESUUgaXMgc2Nhbm5lZCBhbmQgYW4gaW5zdGFuY2Ugb2YgdGhlICJzdHJ1Y3QgZGllaW5mbyIKKyAgIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZC4KKworICAgSW5pdGlhbGl6YXRpb24gaXMgZG9uZSBpbiB0d28gbGV2ZWxzLiAgVGhlIGZpcnN0LCBkb25lIGJ5IGJhc2ljZGllaW5mbygpLAorICAganVzdCBpbml0aWFsaXplcyB0aG9zZSBmaWVsZHMgdGhhdCBhcmUgdml0YWwgdG8gZGVjaWRpbmcgd2hldGhlciBvciBub3QKKyAgIHRvIHVzZSB0aGlzIERJRSwgaG93IHRvIHNraXAgcGFzdCBpdCwgZXRjLiAgVGhlIHNlY29uZCwgZG9uZSBieSB0aGUKKyAgIGZ1bmN0aW9uIGNvbXBsZXRlZGllaW5mbygpLCBmaWxscyBpbiB0aGUgcmVzdCBvZiB0aGUgaW5mb3JtYXRpb24uCisKKyAgIEF0dHJpYnV0ZXMgd2hpY2ggaGF2ZSBibG9jayBmb3JtcyBhcmUgbm90IGludGVycHJldGVkIGF0IHRoZSB0aW1lCisgICB0aGUgRElFIGlzIHNjYW5uZWQsIGluc3RlYWQgd2UganVzdCBzYXZlIHBvaW50ZXJzIHRvIHRoZSBzdGFydAorICAgb2YgdGhlaXIgdmFsdWUgZmllbGRzLgorCisgICBTb21lIGZpZWxkcyBoYXZlIGEgZmxhZyA8bmFtZT5fcCB0aGF0IGlzIHNldCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUKKyAgIGZpZWxkIGlzIHZhbGlkIChJLkUuIHdlIGZvdW5kIGEgbWF0Y2hpbmcgYXR0cmlidXRlIGluIHRoZSBESUUpLiAgU2luY2UKKyAgIHdlIG1heSB3YW50IHRvIHRlc3QgZm9yIHRoZSBwcmVzZW5jZSBvZiBzb21lIGF0dHJpYnV0ZXMgaW4gdGhlIERJRSwKKyAgIHN1Y2ggYXMgQVRfbG93X3BjLCB3aXRob3V0IHJlc3RyaWN0aW5nIHRoZSB2YWx1ZXMgb2YgdGhlIGZpZWxkLAorICAgd2UgbmVlZCBzb21ld2F5IHRvIG5vdGUgdGhhdCB3ZSBmb3VuZCBzdWNoIGFuIGF0dHJpYnV0ZS4KKyAgIAorICovCisgICAKK3R5cGVkZWYgY2hhciBCTE9DSzsKKworc3RydWN0IGRpZWluZm8geworICBjaGFyICoJCWRpZTsJCS8qIFBvaW50ZXIgdG8gdGhlIHJhdyBESUUgZGF0YSAqLworICB1bnNpZ25lZCBsb25nIAlkaWVfbGVuZ3RoOwkvKiBMZW5ndGggb2YgdGhlIHJhdyBESUUgZGF0YSAqLworICBESUVfUkVGCQlkaWVfcmVmOwkvKiBPZmZzZXQgb2YgdGhpcyBESUUgKi8KKyAgdW5zaWduZWQgc2hvcnQJZGllX3RhZzsJLyogVGFnIGZvciB0aGlzIERJRSAqLworICB1bnNpZ25lZCBsb25nCQlhdF9wYWRkaW5nOworICB1bnNpZ25lZCBsb25nCQlhdF9zaWJsaW5nOworICBCTE9DSyAqCQlhdF9sb2NhdGlvbjsKKyAgY2hhciAqCQlhdF9uYW1lOworICB1bnNpZ25lZCBzaG9ydAlhdF9mdW5kX3R5cGU7CisgIEJMT0NLICoJCWF0X21vZF9mdW5kX3R5cGU7CisgIHVuc2lnbmVkIGxvbmcJCWF0X3VzZXJfZGVmX3R5cGU7CisgIEJMT0NLICoJCWF0X21vZF91X2RfdHlwZTsKKyAgdW5zaWduZWQgc2hvcnQJYXRfb3JkZXJpbmc7CisgIEJMT0NLICoJCWF0X3N1YnNjcl9kYXRhOworICB1bnNpZ25lZCBsb25nCQlhdF9ieXRlX3NpemU7CisgIHVuc2lnbmVkIHNob3J0CWF0X2JpdF9vZmZzZXQ7CisgIHVuc2lnbmVkIGxvbmcJCWF0X2JpdF9zaXplOworICBCTE9DSyAqCQlhdF9lbGVtZW50X2xpc3Q7CisgIHVuc2lnbmVkIGxvbmcJCWF0X3N0bXRfbGlzdDsKKyAgQ09SRV9BRERSCQlhdF9sb3dfcGM7CisgIENPUkVfQUREUgkJYXRfaGlnaF9wYzsKKyAgdW5zaWduZWQgbG9uZwkJYXRfbGFuZ3VhZ2U7CisgIHVuc2lnbmVkIGxvbmcJCWF0X21lbWJlcjsKKyAgdW5zaWduZWQgbG9uZwkJYXRfZGlzY3I7CisgIEJMT0NLICoJCWF0X2Rpc2NyX3ZhbHVlOworICBCTE9DSyAqCQlhdF9zdHJpbmdfbGVuZ3RoOworICBjaGFyICoJCWF0X2NvbXBfZGlyOworICBjaGFyICoJCWF0X3Byb2R1Y2VyOworICB1bnNpZ25lZCBsb25nCQlhdF9zdGFydF9zY29wZTsKKyAgdW5zaWduZWQgbG9uZwkJYXRfc3RyaWRlX3NpemU7CisgIHVuc2lnbmVkIGxvbmcJCWF0X3NyY19pbmZvOworICBjaGFyICoJCWF0X3Byb3RvdHlwZWQ7CisgIHVuc2lnbmVkIGludAkJaGFzX2F0X2xvd19wYzoxOworICB1bnNpZ25lZCBpbnQJCWhhc19hdF9zdG10X2xpc3Q6MTsKKyAgdW5zaWduZWQgaW50CQloYXNfYXRfYnl0ZV9zaXplOjE7CisgIHVuc2lnbmVkIGludAkJc2hvcnRfZWxlbWVudF9saXN0OjE7CisKKyAgLyogS2x1ZGdlIHRvIGlkZW50aWZ5IHJlZ2lzdGVyIHZhcmlhYmxlcyAqLworCisgIHVuc2lnbmVkIGludAkJaXNyZWc7CisKKyAgLyogS2x1ZGdlIHRvIGlkZW50aWZ5IG9wdGltaXplZCBvdXQgdmFyaWFibGVzICovCisKKyAgdW5zaWduZWQgaW50CQlvcHRpbWl6ZWRfb3V0OworCisgIC8qIEtsdWRnZSB0byBpZGVudGlmeSBiYXNlcmVnIHJlZmVyZW5jZXMuCisgICAgIE5vbnplcm8gaWYgd2UgaGF2ZSBhbiBvZmZzZXQgcmVsYXRpdmUgdG8gYSBiYXNlcmVnLiAgKi8KKworICB1bnNpZ25lZCBpbnQJCW9mZnJlZzsKKworICAvKiBLbHVkZ2UgdG8gaWRlbnRpZnkgd2hpY2ggYmFzZSByZWdpc3RlciBpcyBpdCByZWxhdGl2ZSB0by4gICovCisKKyAgdW5zaWduZWQgaW50CQliYXNlcmVnOworfTsKKworc3RhdGljIGludCBkaWVjb3VudDsJLyogQXBwcm94aW1hdGUgY291bnQgb2YgZGllcyBmb3IgY29tcGlsYXRpb24gdW5pdCAqLworc3RhdGljIHN0cnVjdCBkaWVpbmZvICpjdXJkaWU7CS8qIEZvciB3YXJuaW5ncyBhbmQgc3VjaCAqLworCitzdGF0aWMgY2hhciAqZGJiYXNlOwkvKiBCYXNlIHBvaW50ZXIgdG8gZHdhcmYgaW5mbyAqLworc3RhdGljIGludCBkYnNpemU7CS8qIFNpemUgb2YgZHdhcmYgaW5mbyBpbiBieXRlcyAqLworc3RhdGljIGludCBkYnJvZmY7CS8qIFJlbGF0aXZlIG9mZnNldCBmcm9tIHN0YXJ0IG9mIC5kZWJ1ZyBzZWN0aW9uICovCitzdGF0aWMgY2hhciAqbG5iYXNlOwkvKiBCYXNlIHBvaW50ZXIgdG8gbGluZSBzZWN0aW9uICovCisKKy8qIFRoaXMgdmFsdWUgaXMgYWRkZWQgdG8gZWFjaCBzeW1ib2wgdmFsdWUuICBGSVhNRTogIEdlbmVyYWxpemUgdG8gCisgICB0aGUgc2VjdGlvbl9vZmZzZXRzIHN0cnVjdHVyZSB1c2VkIGJ5IGRieHJlYWQgKG9uY2UgdGhpcyBpcyBkb25lLAorICAgcGFzcyB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbiBudW1iZXIgdG8gZW5kX3N5bXRhYikuICAqLworc3RhdGljIENPUkVfQUREUiBiYXNlYWRkcjsJLyogQWRkIHRvIGVhY2ggc3ltYm9sIHZhbHVlICovCisKKy8qIFRoZSBzZWN0aW9uIG9mZnNldHMgdXNlZCBpbiB0aGUgY3VycmVudCBwc3ltdGFiIG9yIHN5bXRhYi4gIEZJWE1FLAorICAgb25seSB1c2VkIHRvIHBhc3Mgb25lIHZhbHVlIChiYXNlYWRkcikgYXQgdGhlIG1vbWVudC4gICovCitzdGF0aWMgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqYmFzZV9zZWN0aW9uX29mZnNldHM7CisKKy8qIFdlIHB1dCBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUgaW4gdGhlIHJlYWRfc3ltdGFiX3ByaXZhdGUgZmllbGQKKyAgIG9mIHRoZSBwc3ltdGFiLiAgKi8KKworc3RydWN0IGR3ZmluZm8geworICAvKiBBbHdheXMgdGhlIGFic29sdXRlIGZpbGUgb2Zmc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgIi5kZWJ1ZyIKKyAgICAgc2VjdGlvbiBmb3IgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgRElFJ3MgYmVpbmcgYWNjZXNzZWQuICAqLworICBmaWxlX3B0ciBkYmZvZmY7CisgIC8qIFJlbGF0aXZlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgIi5kZWJ1ZyIgc2VjdGlvbiB0byB0aGUKKyAgICAgZmlyc3QgRElFIHRvIGJlIGFjY2Vzc2VkLiAgV2hlbiBidWlsZGluZyB0aGUgcGFydGlhbCBzeW1ib2wKKyAgICAgdGFibGUsIHRoaXMgdmFsdWUgd2lsbCBiZSB6ZXJvIHNpbmNlIHdlIGFyZSBhY2Nlc3NpbmcgdGhlCisgICAgIGVudGlyZSAiLmRlYnVnIiBzZWN0aW9uLiAgV2hlbiBleHBhbmRpbmcgYSBwYXJ0aWFsIHN5bWJvbAorICAgICB0YWJsZSBlbnRyeSwgdGhpcyB2YWx1ZSB3aWxsIGJlIHRoZSBvZmZzZXQgdG8gdGhlIGZpcnN0CisgICAgIERJRSBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQgY29udGFpbmluZyB0aGUgc3ltYm9sIHRoYXQKKyAgICAgdHJpZ2dlcnMgdGhlIGV4cGFuc2lvbi4gICovCisgIGludCBkYnJvZmY7CisgIC8qIFRoZSBzaXplIG9mIHRoZSBjaHVuayBvZiBESUUncyBiZWluZyBleGFtaW5lZCwgaW4gYnl0ZXMuICAqLworICBpbnQgZGJsZW5ndGg7CisgIC8qIFRoZSBhYnNvbHV0ZSBmaWxlIG9mZnNldCB0byB0aGUgbGluZSB0YWJsZSBmcmFnbWVudC4gIElnbm9yZWQKKyAgICAgd2hlbiBidWlsZGluZyBwYXJ0aWFsIHN5bWJvbCB0YWJsZXMsIGJ1dCB1c2VkIHdoZW4gZXhwYW5kaW5nCisgICAgIHRoZW0sIGFuZCBjb250YWlucyB0aGUgYWJzb2x1dGUgZmlsZSBvZmZzZXQgdG8gdGhlIGZyYWdtZW50CisgICAgIG9mIHRoZSAiLmxpbmUiIHNlY3Rpb24gY29udGFpbmluZyB0aGUgbGluZSBudW1iZXJzIGZvciB0aGUKKyAgICAgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgKi8KKyAgZmlsZV9wdHIgbG5mb2ZmOworfTsKKworI2RlZmluZSBEQkZPRkYocCkgKCgoc3RydWN0IGR3ZmluZm8gKikoKHApLT5yZWFkX3N5bXRhYl9wcml2YXRlKSktPmRiZm9mZikKKyNkZWZpbmUgREJST0ZGKHApICgoKHN0cnVjdCBkd2ZpbmZvICopKChwKS0+cmVhZF9zeW10YWJfcHJpdmF0ZSkpLT5kYnJvZmYpCisjZGVmaW5lIERCTEVOR1RIKHApICgoKHN0cnVjdCBkd2ZpbmZvICopKChwKS0+cmVhZF9zeW10YWJfcHJpdmF0ZSkpLT5kYmxlbmd0aCkKKyNkZWZpbmUgTE5GT0ZGKHApICgoKHN0cnVjdCBkd2ZpbmZvICopKChwKS0+cmVhZF9zeW10YWJfcHJpdmF0ZSkpLT5sbmZvZmYpCisKKy8qIFRoZSBnZW5lcmljIHN5bWJvbCB0YWJsZSBidWlsZGluZyByb3V0aW5lcyBoYXZlIHNlcGFyYXRlIGxpc3RzIGZvcgorICAgZmlsZSBzY29wZSBzeW1ib2xzIGFuZCBhbGwgYWxsIG90aGVyIHNjb3BlcyAobG9jYWwgc2NvcGVzKS4gIFNvCisgICB3ZSBuZWVkIHRvIHNlbGVjdCB0aGUgcmlnaHQgb25lIHRvIHBhc3MgdG8gYWRkX3N5bWJvbF90b19saXN0KCkuCisgICBXZSBkbyBpdCBieSBrZWVwaW5nIGEgcG9pbnRlciB0byB0aGUgY29ycmVjdCBsaXN0IGluIGxpc3RfaW5fc2NvcGUuCisKKyAgIEZJWE1FOiAgVGhlIG9yaWdpbmFsIGR3YXJmIGNvZGUganVzdCB0cmVhdGVkIHRoZSBmaWxlIHNjb3BlIGFzIHRoZSBmaXJzdAorICAgbG9jYWwgc2NvcGUsIGFuZCBhbGwgb3RoZXIgbG9jYWwgc2NvcGVzIGFzIG5lc3RlZCBsb2NhbCBzY29wZXMsIGFuZCB3b3JrZWQKKyAgIGZpbmUuICBDaGVjayB0byBzZWUgaWYgd2UgcmVhbGx5IG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlc2UgaW4gYnVpbGRzeW0uYyAqLworCitzdHJ1Y3QgcGVuZGluZyAqKmxpc3RfaW5fc2NvcGUgPSAmZmlsZV9zeW1ib2xzOworCisvKiBESUVTIHdoaWNoIGhhdmUgdXNlciBkZWZpbmVkIHR5cGVzIG9yIG1vZGlmaWVkIHVzZXIgZGVmaW5lZCB0eXBlcyByZWZlciB0bworICAgb3RoZXIgRElFUyBmb3IgdGhlIHR5cGUgaW5mb3JtYXRpb24uICBUaHVzIHdlIG5lZWQgdG8gYXNzb2NpYXRlIHRoZSBvZmZzZXQKKyAgIG9mIGEgRElFIGZvciBhIHVzZXIgZGVmaW5lZCB0eXBlIHdpdGggYSBwb2ludGVyIHRvIHRoZSB0eXBlIGluZm9ybWF0aW9uLgorCisgICBPcmlnaW5hbGx5IHRoaXMgd2FzIGRvbmUgdXNpbmcgYSBzaW1wbGUgYnV0IGV4cGVuc2l2ZSBhbGdvcml0aG0sIHdpdGggYW4KKyAgIGFycmF5IG9mIHVuc29ydGVkIHN0cnVjdHVyZXMsIGVhY2ggY29udGFpbmluZyBhbiBvZmZzZXQvdHlwZS1wb2ludGVyIHBhaXIuCisgICBUaGlzIGFycmF5IHdhcyBzY2FubmVkIGxpbmVhcmx5IGVhY2ggdGltZSBhIGxvb2t1cCB3YXMgZG9uZS4gIFRoZSByZXN1bHQKKyAgIHdhcyB0aGF0IGdkYiB3YXMgc3BlbmRpbmcgb3ZlciBoYWxmIGl0J3Mgc3RhcnR1cCB0aW1lIG11bmdpbmcgdGhyb3VnaCB0aGlzCisgICBhcnJheSBvZiBwb2ludGVycyBsb29raW5nIGZvciBhIHN0cnVjdHVyZSB0aGF0IGhhZCB0aGUgcmlnaHQgb2Zmc2V0IG1lbWJlci4KKworICAgVGhlIHNlY29uZCBhdHRlbXB0IHVzZWQgdGhlIHNhbWUgYXJyYXkgb2Ygc3RydWN0dXJlcywgYnV0IHRoZSBhcnJheSB3YXMKKyAgIHNvcnRlZCB1c2luZyBxc29ydCBlYWNoIHRpbWUgYSBuZXcgb2Zmc2V0L3R5cGUgd2FzIHJlY29yZGVkLCBhbmQgYSBiaW5hcnkKKyAgIHNlYXJjaCB3YXMgdXNlZCB0byBmaW5kIHRoZSB0eXBlIHBvaW50ZXIgZm9yIGEgZ2l2ZW4gRElFIG9mZnNldC4gIFRoaXMgd2FzCisgICBldmVuIHNsb3dlciwgZHVlIHRvIHRoZSBvdmVyaGVhZCBvZiBzb3J0aW5nIHRoZSBhcnJheSBlYWNoIHRpbWUgYSBuZXcKKyAgIG9mZnNldC90eXBlIHBhaXIgd2FzIGVudGVyZWQuCisKKyAgIFRoZSB0aGlyZCBhdHRlbXB0IHVzZXMgYSBmaXhlZCBzaXplIGFycmF5IG9mIHR5cGUgcG9pbnRlcnMsIGluZGV4ZWQgYnkgYQorICAgdmFsdWUgZGVyaXZlZCBmcm9tIHRoZSBESUUgb2Zmc2V0LiAgU2luY2UgdGhlIG1pbmltdW0gRElFIHNpemUgaXMgNCBieXRlcywKKyAgIHdlIGNhbiBkaXZpZGUgYW55IERJRSBvZmZzZXQgYnkgNCB0byBvYnRhaW4gYSB1bmlxdWUgaW5kZXggaW50byB0aGlzIGZpeGVkCisgICBzaXplIGFycmF5LiAgU2luY2UgZWFjaCBlbGVtZW50IGlzIGEgNCBieXRlIHBvaW50ZXIsIGl0IHRha2VzIGV4YWN0bHkgYXMKKyAgIG11Y2ggbWVtb3J5IHRvIGhvbGQgdGhpcyBhcnJheSBhcyB0byBob2xkIHRoZSBEV0FSRiBpbmZvIGZvciBhIGdpdmVuCisgICBjb21waWxhdGlvbiB1bml0LiAgQnV0IGl0IGdldHMgZnJlZWQgYXMgc29vbiBhcyB3ZSBhcmUgZG9uZSB3aXRoIGl0LgorICAgVGhpcyBoYXMgd29ya2VkIHdlbGwgaW4gcHJhY3RpY2UsIGFzIGEgcmVhc29uYWJsZSB0cmFkZW9mZiBiZXR3ZWVuIG1lbW9yeQorICAgY29uc3VtcHRpb24gYW5kIHNwZWVkLCB3aXRob3V0IGhhdmluZyB0byByZXNvcnQgdG8gbXVjaCBtb3JlIGNvbXBsaWNhdGVkCisgICBhbGdvcml0aG1zLiAqLworCitzdGF0aWMgc3RydWN0IHR5cGUgKip1dHlwZXM7CS8qIFBvaW50ZXIgdG8gYXJyYXkgb2YgdXNlciB0eXBlIHBvaW50ZXJzICovCitzdGF0aWMgaW50IG51bXV0eXBlczsJCS8qIE1heCBudW1iZXIgb2YgdXNlciB0eXBlIHBvaW50ZXJzICovCisKKy8qIE1haW50YWluIGFuIGFycmF5IG9mIHJlZmVyZW5jZWQgZnVuZGFtZW50YWwgdHlwZXMgZm9yIHRoZSBjdXJyZW50CisgICBjb21waWxhdGlvbiB1bml0IGJlaW5nIHJlYWQuICBGb3IgRFdBUkYgdmVyc2lvbiAxLCB3ZSBoYXZlIHRvIGNvbnN0cnVjdAorICAgdGhlIGZ1bmRhbWVudGFsIHR5cGVzIG9uIHRoZSBmbHksIHNpbmNlIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgZnVuZGFtZW50YWwgdHlwZXMgaXMgc3VwcGxpZWQuICBFYWNoIHN1Y2ggZnVuZGFtZW50YWwgdHlwZSBpcyBjcmVhdGVkIGJ5CisgICBjYWxsaW5nIGEgbGFuZ3VhZ2UgZGVwZW5kZW50IHJvdXRpbmUgdG8gY3JlYXRlIHRoZSB0eXBlLCBhbmQgdGhlbiBhCisgICBwb2ludGVyIHRvIHRoYXQgdHlwZSBpcyB0aGVuIHBsYWNlZCBpbiB0aGUgYXJyYXkgYXQgdGhlIGluZGV4IHNwZWNpZmllZAorICAgYnkgaXQncyBGVF88VFlQRU5BTUU+IHZhbHVlLiAgVGhlIGFycmF5IGhhcyBhIGZpeGVkIHNpemUgc2V0IGJ5IHRoZQorICAgRlRfTlVNX01FTUJFUlMgY29tcGlsZSB0aW1lIGNvbnN0YW50LCB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHByZWRlZmluZWQKKyAgIGZ1bmRhbWVudGFsIHR5cGVzIGdkYiBrbm93cyBob3cgdG8gY29uc3RydWN0LiAqLworCitzdGF0aWMgc3RydWN0IHR5cGUgKmZ0eXBlc1tGVF9OVU1fTUVNQkVSU107ICAvKiBGdW5kYW1lbnRhbCB0eXBlcyAqLworCisvKiBSZWNvcmQgdGhlIGxhbmd1YWdlIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCB3aGljaCBpcyBjdXJyZW50bHkgYmVpbmcKKyAgIHByb2Nlc3NlZC4gIFdlIGtub3cgaXQgb25jZSB3ZSBoYXZlIHNlZW4gdGhlIFRBR19jb21waWxlX3VuaXQgRElFLAorICAgYW5kIHdlIG5lZWQgaXQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgRElFJ3MgZm9yIHRoYXQgY29tcGlsYXRpb24gdW5pdC4KKyAgIEl0IGlzIGV2ZW50dWFsbHkgc2F2ZWQgaW4gdGhlIHN5bXRhYiBzdHJ1Y3R1cmUsIGJ1dCB3ZSBkb24ndCBmaW5hbGl6ZQorICAgdGhlIHN5bXRhYiBzdHJ1Y3QgdW50aWwgd2UgaGF2ZSBwcm9jZXNzZWQgYWxsIHRoZSBESUUncyBmb3IgdGhlCisgICBjb21waWxhdGlvbiB1bml0LiAgV2UgYWxzbyBuZWVkIHRvIGdldCBhbmQgc2F2ZSBhIHBvaW50ZXIgdG8gdGhlIAorICAgbGFuZ3VhZ2Ugc3RydWN0IGZvciB0aGlzIGxhbmd1YWdlLCBzbyB3ZSBjYW4gY2FsbCB0aGUgbGFuZ3VhZ2UKKyAgIGRlcGVuZGVudCByb3V0aW5lcyBmb3IgZG9pbmcgdGhpbmdzIHN1Y2ggYXMgY3JlYXRpbmcgZnVuZGFtZW50YWwKKyAgIHR5cGVzLiAqLworCitzdGF0aWMgZW51bSBsYW5ndWFnZSBjdV9sYW5ndWFnZTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGFuZ3VhZ2VfZGVmbiAqY3VfbGFuZ3VhZ2VfZGVmbjsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2Ygc3RhdGljIGZ1bmN0aW9ucyBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5CisgICBhYm91dCBvcmRlcmluZyB3aXRoaW4gdGhpcyBmaWxlLiAgKi8KKworc3RhdGljIHZvaWQKK2ZyZWVfdXR5cGVzIFBBUkFNUyAoKFBUUikpOworCitzdGF0aWMgaW50CithdHRyaWJ1dGVfc2l6ZSBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKKworc3RhdGljIENPUkVfQUREUgordGFyZ2V0X3RvX2hvc3QgUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZAorYWRkX2VudW1fcHN5bWJvbCBQQVJBTVMgKChzdHJ1Y3QgZGllaW5mbyAqLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfcHJvZHVjZXIgUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyB2b2lkCityZWFkX2ZpbGVfc2NvcGUgUEFSQU1TICgoc3RydWN0IGRpZWluZm8gKiwgY2hhciAqLCBjaGFyICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQKK3JlYWRfZnVuY19zY29wZSBQQVJBTVMgKChzdHJ1Y3QgZGllaW5mbyAqLCBjaGFyICosIGNoYXIgKiwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZAorcmVhZF9sZXhpY2FsX2Jsb2NrX3Njb3BlIFBBUkFNUyAoKHN0cnVjdCBkaWVpbmZvICosIGNoYXIgKiwgY2hhciAqLAorCQkJCSAgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZAorc2Nhbl9wYXJ0aWFsX3N5bWJvbHMgUEFSQU1TICgoY2hhciAqLCBjaGFyICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQKK3NjYW5fY29tcGlsYXRpb25fdW5pdHMgUEFSQU1TICgoY2hhciAqLCBjaGFyICosIGZpbGVfcHRyLAorCQkJCWZpbGVfcHRyLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCithZGRfcGFydGlhbF9zeW1ib2wgUEFSQU1TICgoc3RydWN0IGRpZWluZm8gKiwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZAorYmFzaWNkaWVpbmZvIFBBUkFNUyAoKHN0cnVjdCBkaWVpbmZvICosIGNoYXIgKiwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZAorY29tcGxldGVkaWVpbmZvIFBBUkFNUyAoKHN0cnVjdCBkaWVpbmZvICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQKK2R3YXJmX3BzeW10YWJfdG9fc3ltdGFiIFBBUkFNUyAoKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSk7CisKK3N0YXRpYyB2b2lkCitwc3ltdGFiX3RvX3N5bXRhYl8xIFBBUkFNUyAoKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSk7CisKK3N0YXRpYyB2b2lkCityZWFkX29maWxlX3N5bXRhYiBQQVJBTVMgKChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworCitzdGF0aWMgdm9pZAorcHJvY2Vzc19kaWVzIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCityZWFkX3N0cnVjdHVyZV9zY29wZSBQQVJBTVMgKChzdHJ1Y3QgZGllaW5mbyAqLCBjaGFyICosIGNoYXIgKiwKKwkJCSAgICAgIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2RlY29kZV9hcnJheV9lbGVtZW50X3R5cGUgUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitkZWNvZGVfc3Vic2NyaXB0X2RhdGFfaXRlbSBQQVJBTVMgKChjaGFyICosIGNoYXIgKikpOworCitzdGF0aWMgdm9pZAorZHdhcmZfcmVhZF9hcnJheV90eXBlIFBBUkFNUyAoKHN0cnVjdCBkaWVpbmZvICopKTsKKworc3RhdGljIHZvaWQKK3JlYWRfdGFnX3BvaW50ZXJfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgZGllaW5mbyAqZGlwKSk7CisKK3N0YXRpYyB2b2lkCityZWFkX3RhZ19zdHJpbmdfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgZGllaW5mbyAqZGlwKSk7CisKK3N0YXRpYyB2b2lkCityZWFkX3N1YnJvdXRpbmVfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgZGllaW5mbyAqLCBjaGFyICosIGNoYXIgKikpOworCitzdGF0aWMgdm9pZAorcmVhZF9lbnVtZXJhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZGllaW5mbyAqLCBjaGFyICosIGNoYXIgKiwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorc3RydWN0X3R5cGUgUEFSQU1TICgoc3RydWN0IGRpZWluZm8gKiwgY2hhciAqLCBjaGFyICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2VudW1fdHlwZSBQQVJBTVMgKChzdHJ1Y3QgZGllaW5mbyAqLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCitkZWNvZGVfbGluZV9udW1iZXJzIFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorZGVjb2RlX2RpZV90eXBlIFBBUkFNUyAoKHN0cnVjdCBkaWVpbmZvICopKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2RlY29kZV9tb2RfZnVuZF90eXBlIFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorZGVjb2RlX21vZF91X2RfdHlwZSBQQVJBTVMgKChjaGFyICopKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2RlY29kZV9tb2RpZmllZF90eXBlIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgaW50LCBpbnQpKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2RlY29kZV9mdW5kX3R5cGUgUEFSQU1TICgodW5zaWduZWQgaW50KSk7CisKK3N0YXRpYyBjaGFyICoKK2NyZWF0ZV9uYW1lIFBBUkFNUyAoKGNoYXIgKiwgc3RydWN0IG9ic3RhY2sgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorbG9va3VwX3V0eXBlIFBBUkFNUyAoKERJRV9SRUYpKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2FsbG9jX3V0eXBlIFBBUkFNUyAoKERJRV9SRUYsIHN0cnVjdCB0eXBlICopKTsKKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKgorbmV3X3N5bWJvbCBQQVJBTVMgKChzdHJ1Y3QgZGllaW5mbyAqLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCitzeW50aGVzaXplX3R5cGVkZWYgUEFSQU1TICgoc3RydWN0IGRpZWluZm8gKiwgc3RydWN0IG9iamZpbGUgKiwKKwkJCSAgICBzdHJ1Y3QgdHlwZSAqKSk7CisKK3N0YXRpYyBpbnQKK2xvY3ZhbCBQQVJBTVMgKChzdHJ1Y3QgZGllaW5mbyAqKSk7CisKK3N0YXRpYyB2b2lkCitzZXRfY3VfbGFuZ3VhZ2UgUEFSQU1TICgoc3RydWN0IGRpZWluZm8gKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorZHdhcmZfZnVuZGFtZW50YWxfdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBpbnQpKTsKKworCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJZHdhcmZfZnVuZGFtZW50YWxfdHlwZSAtLSBsb29rdXAgb3IgY3JlYXRlIGEgZnVuZGFtZW50YWwgdHlwZQorCitTWU5PUFNJUworCisJc3RydWN0IHR5cGUgKgorCWR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgKHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlLCBpbnQgdHlwZWlkKQorCitERVNDUklQVElPTgorCisJRFdBUkYgdmVyc2lvbiAxIGRvZXNuJ3Qgc3VwcGx5IGFueSBmdW5kYW1lbnRhbCB0eXBlIGluZm9ybWF0aW9uLAorCXNvIGdkYiBoYXMgdG8gY29uc3RydWN0IHN1Y2ggdHlwZXMuICBJdCBoYXMgYSBmaXhlZCBudW1iZXIgb2YKKwlmdW5kYW1lbnRhbCB0eXBlcyB0aGF0IGl0IGtub3dzIGhvdyB0byBjb25zdHJ1Y3QsIHdoaWNoIGlzIHRoZQorCXVuaW9uIG9mIGFsbCB0eXBlcyB0aGF0IGl0IGtub3dzIGhvdyB0byBjb25zdHJ1Y3QgZm9yIGFsbCBsYW5ndWFnZXMKKwl0aGF0IGl0IGtub3dzIGFib3V0LiAgVGhlc2UgYXJlIGVudW1lcmF0ZWQgaW4gZ2RidHlwZXMuaC4KKworCUFzIGFuIGV4YW1wbGUsIGFzc3VtZSB3ZSBmaW5kIGEgRElFIHRoYXQgcmVmZXJlbmNlcyBhIERXQVJGCisJZnVuZGFtZW50YWwgdHlwZSBvZiBGVF9pbnRlZ2VyLiAgV2UgZmlyc3QgbG9vayBpbiB0aGUgZnR5cGVzCisJYXJyYXkgdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBzdWNoIGEgdHlwZSwgaW5kZXhlZCBieSB0aGUKKwlnZGIgaW50ZXJuYWwgdmFsdWUgb2YgRlRfSU5URUdFUi4gIElmIHNvLCB3ZSBzaW1wbHkgcmV0dXJuIGEKKwlwb2ludGVyIHRvIHRoYXQgdHlwZS4gIElmIG5vdCwgdGhlbiB3ZSBhc2sgYW4gYXBwcm9wcmlhdGUKKwlsYW5ndWFnZSBkZXBlbmRlbnQgcm91dGluZSB0byBjcmVhdGUgYSB0eXBlIEZUX0lOVEVHRVIsIHVzaW5nCisJZGVmYXVsdHMgcmVhc29uYWJsZSBmb3IgdGhlIGN1cnJlbnQgdGFyZ2V0IG1hY2hpbmUsIGFuZCBpbnN0YWxsCisJdGhhdCB0eXBlIGluIGZ0eXBlcyBmb3IgZnV0dXJlIHJlZmVyZW5jZS4KKworUkVUVVJOUworCisJUG9pbnRlciB0byBhIGZ1bmRhbWVudGFsIHR5cGUuCisKKyovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitkd2FyZl9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCB0eXBlaWQpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBpbnQgdHlwZWlkOworeworICBpZiAodHlwZWlkIDwgMCB8fCB0eXBlaWQgPj0gRlRfTlVNX01FTUJFUlMpCisgICAgeworICAgICAgZXJyb3IgKCJpbnRlcm5hbCBlcnJvciAtIGludmFsaWQgZnVuZGFtZW50YWwgdHlwZSBpZCAlZCIsIHR5cGVpZCk7CisgICAgfQorCisgIC8qIExvb2sgZm9yIHRoaXMgcGFydGljdWxhciB0eXBlIGluIHRoZSBmdW5kYW1lbnRhbCB0eXBlIHZlY3Rvci4gIElmIG9uZSBpcworICAgICBub3QgZm91bmQsIGNyZWF0ZSBhbmQgaW5zdGFsbCBvbmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlCisgICAgIGFuZCB0aGUgY3VycmVudCB0YXJnZXQgbWFjaGluZS4gKi8KKworICBpZiAoZnR5cGVzW3R5cGVpZF0gPT0gTlVMTCkKKyAgICB7CisgICAgICBmdHlwZXNbdHlwZWlkXSA9IGN1X2xhbmd1YWdlX2RlZm4gLT4gbGFfZnVuZF90eXBlKG9iamZpbGUsIHR5cGVpZCk7CisgICAgfQorCisgIHJldHVybiAoZnR5cGVzW3R5cGVpZF0pOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJc2V0X2N1X2xhbmd1YWdlIC0tIHNldCBsb2NhbCBjb3B5IG9mIGxhbmd1YWdlIGZvciBjb21waWxhdGlvbiB1bml0CisKK1NZTk9QU0lTCisKKwl2b2lkCisJc2V0X2N1X2xhbmd1YWdlIChzdHJ1Y3QgZGllaW5mbyAqZGlwKQorCitERVNDUklQVElPTgorCisJRGVjb2RlIHRoZSBsYW5ndWFnZSBhdHRyaWJ1dGUgZm9yIGEgY29tcGlsYXRpb24gdW5pdCBESUUgYW5kCisJcmVtZW1iZXIgd2hhdCB0aGUgbGFuZ3VhZ2Ugd2FzLiAgV2UgdXNlIHRoaXMgYXQgdmFyaW91cyB0aW1lcworCXdoZW4gcHJvY2Vzc2luZyBESUUncyBmb3IgYSBnaXZlbiBjb21waWxhdGlvbiB1bml0LgorCitSRVRVUk5TCisKKwlObyByZXR1cm4gdmFsdWUuCisKKyAqLworCitzdGF0aWMgdm9pZAorc2V0X2N1X2xhbmd1YWdlIChkaXApCisgICAgIHN0cnVjdCBkaWVpbmZvICpkaXA7Cit7CisgIHN3aXRjaCAoZGlwIC0+IGF0X2xhbmd1YWdlKQorICAgIHsKKyAgICAgIGNhc2UgTEFOR19DODk6CisgICAgICBjYXNlIExBTkdfQzoKKyAgICAgICAgY3VfbGFuZ3VhZ2UgPSBsYW5ndWFnZV9jOworCWJyZWFrOworICAgICAgY2FzZSBMQU5HX0NfUExVU19QTFVTOgorCWN1X2xhbmd1YWdlID0gbGFuZ3VhZ2VfY3BsdXM7CisJYnJlYWs7CisgICAgICBjYXNlIExBTkdfQ0hJTEw6CisJY3VfbGFuZ3VhZ2UgPSBsYW5ndWFnZV9jaGlsbDsKKwlicmVhazsKKyAgICAgIGNhc2UgTEFOR19NT0RVTEEyOgorCWN1X2xhbmd1YWdlID0gbGFuZ3VhZ2VfbTI7CisJYnJlYWs7CisgICAgICBjYXNlIExBTkdfRk9SVFJBTjc3OgorICAgICAgY2FzZSBMQU5HX0ZPUlRSQU45MDoKKwljdV9sYW5ndWFnZSA9IGxhbmd1YWdlX2ZvcnRyYW47CisJYnJlYWs7CisgICAgICBjYXNlIExBTkdfQURBODM6CisgICAgICBjYXNlIExBTkdfQ09CT0w3NDoKKyAgICAgIGNhc2UgTEFOR19DT0JPTDg1OgorICAgICAgY2FzZSBMQU5HX1BBU0NBTDgzOgorCS8qIFdlIGRvbid0IGtub3cgYW55dGhpbmcgc3BlY2lhbCBhYm91dCB0aGVzZSB5ZXQuICovCisJY3VfbGFuZ3VhZ2UgPSBsYW5ndWFnZV91bmtub3duOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwkvKiBJZiBubyBhdF9sYW5ndWFnZSwgdHJ5IHRvIGRlZHVjZSBvbmUgZnJvbSB0aGUgZmlsZW5hbWUgKi8KKwljdV9sYW5ndWFnZSA9IGRlZHVjZV9sYW5ndWFnZV9mcm9tX2ZpbGVuYW1lIChkaXAgLT4gYXRfbmFtZSk7CisJYnJlYWs7CisgICAgfQorICBjdV9sYW5ndWFnZV9kZWZuID0gbGFuZ3VhZ2VfZGVmIChjdV9sYW5ndWFnZSk7Cit9CisKKy8qCisKK0dMT0JBTCBGVU5DVElPTgorCisJZHdhcmZfYnVpbGRfcHN5bXRhYnMgLS0gYnVpbGQgcGFydGlhbCBzeW10YWJzIGZyb20gRFdBUkYgZGVidWcgaW5mbworCitTWU5PUFNJUworCisJdm9pZCBkd2FyZl9idWlsZF9wc3ltdGFicyAoc3RydWN0IG9iamZpbGUgKm9iamZpbGUsCisJICAgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHMsCisJICAgICBpbnQgbWFpbmxpbmUsIGZpbGVfcHRyIGRiZm9mZiwgdW5zaWduZWQgaW50IGRiZnNpemUsCisJICAgICBmaWxlX3B0ciBsbm9mZnNldCwgdW5zaWduZWQgaW50IGxuc2l6ZSkKKworREVTQ1JJUFRJT04KKworCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHVwb24gdG8gYnVpbGQgcGFydGlhbCBzeW10YWJzIGZyb20gZmlsZXMKKwljb250YWluaW5nIERJRSdzIChEd2FyZiBJbmZvcm1hdGlvbiBFbnRyaWVzKSBhbmQgRFdBUkYgbGluZSBudW1iZXJzLgorCisJSXQgaXMgcGFzc2VkIGEgYmZkKiBjb250YWluaW5nIHRoZSBESUVTCisJYW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLCB0aGUgY29ycmVzcG9uZGluZyBmaWxlbmFtZSBmb3IgdGhhdAorCWZpbGUsIGEgYmFzZSBhZGRyZXNzIGZvciByZWxvY2F0aW5nIHRoZSBzeW1ib2xzLCBhIGZsYWcgaW5kaWNhdGluZworCXdoZXRoZXIgb3Igbm90IHRoaXMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIGZyb20gYSAibWFpbiBzeW1ib2wKKwl0YWJsZSIgcmF0aGVyIHRoYW4gYSBzaGFyZWQgbGlicmFyeSBvciBkeW5hbWljYWxseSBsaW5rZWQgZmlsZSwKKwlhbmQgZmlsZSBvZmZzZXQvc2l6ZSBwYWlycyBmb3IgdGhlIERJRSBpbmZvcm1hdGlvbiBhbmQgbGluZSBudW1iZXIKKwlpbmZvcm1hdGlvbi4KKworUkVUVVJOUworCisJTm8gcmV0dXJuIHZhbHVlLgorCisgKi8KKwordm9pZAorZHdhcmZfYnVpbGRfcHN5bXRhYnMgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywgbWFpbmxpbmUsIGRiZm9mZiwgZGJmc2l6ZSwKKwkJICAgICAgbG5vZmZzZXQsIGxuc2l6ZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKyAgICAgaW50IG1haW5saW5lOworICAgICBmaWxlX3B0ciBkYmZvZmY7CisgICAgIHVuc2lnbmVkIGludCBkYmZzaXplOworICAgICBmaWxlX3B0ciBsbm9mZnNldDsKKyAgICAgdW5zaWduZWQgaW50IGxuc2l6ZTsKK3sKKyAgYmZkICphYmZkID0gb2JqZmlsZS0+b2JmZDsKKyAgc3RydWN0IGNsZWFudXAgKmJhY2tfdG87CisgIAorICBjdXJyZW50X29iamZpbGUgPSBvYmpmaWxlOworICBkYnNpemUgPSBkYmZzaXplOworICBkYmJhc2UgPSB4bWFsbG9jIChkYnNpemUpOworICBkYnJvZmYgPSAwOworICBpZiAoKGJmZF9zZWVrIChhYmZkLCBkYmZvZmYsIFNFRUtfU0VUKSAhPSAwKSB8fAorICAgICAgKGJmZF9yZWFkIChkYmJhc2UsIGRic2l6ZSwgMSwgYWJmZCkgIT0gZGJzaXplKSkKKyAgICB7CisgICAgICBmcmVlIChkYmJhc2UpOworICAgICAgZXJyb3IgKCJjYW4ndCByZWFkIERXQVJGIGRhdGEgZnJvbSAnJXMnIiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOworICAgIH0KKyAgYmFja190byA9IG1ha2VfY2xlYW51cCAoZnJlZSwgZGJiYXNlKTsKKyAgCisgIC8qIElmIHdlIGFyZSByZWluaXRpYWxpemluZywgb3IgaWYgd2UgaGF2ZSBuZXZlciBsb2FkZWQgc3ltcyB5ZXQsIGluaXQuCisgICAgIFNpbmNlIHdlIGhhdmUgbm8gaWRlYSBob3cgbWFueSBESUVTIHdlIGFyZSBsb29raW5nIGF0LCB3ZSBqdXN0IGd1ZXNzCisgICAgIHNvbWUgYXJiaXRyYXJ5IHZhbHVlLiAqLworICAKKyAgaWYgKG1haW5saW5lIHx8IG9iamZpbGUgLT4gZ2xvYmFsX3BzeW1ib2xzLnNpemUgPT0gMCB8fAorICAgICAgb2JqZmlsZSAtPiBzdGF0aWNfcHN5bWJvbHMuc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIGluaXRfcHN5bWJvbF9saXN0IChvYmpmaWxlLCAxMDI0KTsKKyAgICB9CisgIAorICAvKiBTYXZlIHRoZSByZWxvY2F0aW9uIGZhY3RvciB3aGVyZSBldmVyeWJvZHkgY2FuIHNlZSBpdC4gICovCisKKyAgYmFzZV9zZWN0aW9uX29mZnNldHMgPSBzZWN0aW9uX29mZnNldHM7CisgIGJhc2VhZGRyID0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgMCk7CisKKyAgLyogRm9sbG93IHRoZSBjb21waWxhdGlvbiB1bml0IHNpYmxpbmcgY2hhaW4sIGJ1aWxkaW5nIGEgcGFydGlhbCBzeW1ib2wKKyAgICAgdGFibGUgZW50cnkgZm9yIGVhY2ggb25lLiAgU2F2ZSBlbm91Z2ggaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBjb21waWxhdGlvbgorICAgICB1bml0IHRvIGxvY2F0ZSB0aGUgZnVsbCBEV0FSRiBpbmZvcm1hdGlvbiBsYXRlci4gKi8KKyAgCisgIHNjYW5fY29tcGlsYXRpb25fdW5pdHMgKGRiYmFzZSwgZGJiYXNlICsgZGJzaXplLCBkYmZvZmYsIGxub2Zmc2V0LCBvYmpmaWxlKTsKKyAgCisgIGRvX2NsZWFudXBzIChiYWNrX3RvKTsKKyAgY3VycmVudF9vYmpmaWxlID0gTlVMTDsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCXJlYWRfbGV4aWNhbF9ibG9ja19zY29wZSAtLSBwcm9jZXNzIGFsbCBkaWVzIGluIGEgbGV4aWNhbCBibG9jaworCitTWU5PUFNJUworCisJc3RhdGljIHZvaWQgcmVhZF9sZXhpY2FsX2Jsb2NrX3Njb3BlIChzdHJ1Y3QgZGllaW5mbyAqZGlwLAorCQljaGFyICp0aGlzZGllLCBjaGFyICplbmRkaWUpCisKK0RFU0NSSVBUSU9OCisKKwlQcm9jZXNzIGFsbCB0aGUgRElFUyBjb250YWluZWQgd2l0aGluIGEgbGV4aWNhbCBibG9jayBzY29wZS4KKwlTdGFydCBhIG5ldyBzY29wZSwgcHJvY2VzcyB0aGUgZGllcywgYW5kIHRoZW4gY2xvc2UgdGhlIHNjb3BlLgorCisgKi8KKworc3RhdGljIHZvaWQKK3JlYWRfbGV4aWNhbF9ibG9ja19zY29wZSAoZGlwLCB0aGlzZGllLCBlbmRkaWUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBkaWVpbmZvICpkaXA7CisgICAgIGNoYXIgKnRoaXNkaWU7CisgICAgIGNoYXIgKmVuZGRpZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBjb250ZXh0X3N0YWNrICpuZXc7CisKKyAgcHVzaF9jb250ZXh0ICgwLCBkaXAgLT4gYXRfbG93X3BjKTsKKyAgcHJvY2Vzc19kaWVzICh0aGlzZGllICsgZGlwIC0+IGRpZV9sZW5ndGgsIGVuZGRpZSwgb2JqZmlsZSk7CisgIG5ldyA9IHBvcF9jb250ZXh0ICgpOworICBpZiAobG9jYWxfc3ltYm9scyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZpbmlzaF9ibG9jayAoMCwgJmxvY2FsX3N5bWJvbHMsIG5ldyAtPiBvbGRfYmxvY2tzLCBuZXcgLT4gc3RhcnRfYWRkciwKKwkJICAgIGRpcCAtPiBhdF9oaWdoX3BjLCBvYmpmaWxlKTsKKyAgICB9CisgIGxvY2FsX3N5bWJvbHMgPSBuZXcgLT4gbG9jYWxzOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJbG9va3VwX3V0eXBlIC0tIGxvb2sgdXAgYSB1c2VyIGRlZmluZWQgdHlwZSBmcm9tIGRpZSByZWZlcmVuY2UKKworU1lOT1BTSVMKKworCXN0YXRpYyB0eXBlICpsb29rdXBfdXR5cGUgKERJRV9SRUYgZGllX3JlZikKKworREVTQ1JJUFRJT04KKworCUdpdmVuIGEgRElFIHJlZmVyZW5jZSwgbG9va3VwIHRoZSB1c2VyIGRlZmluZWQgdHlwZSBhc3NvY2lhdGVkIHdpdGgKKwl0aGF0IERJRSwgaWYgaXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCBhbHJlYWR5LiAgSWYgbm90IHJlZ2lzdGVyZWQsIHRoZW4KKwlyZXR1cm4gTlVMTC4gIEFsbG9jX3V0eXBlKCkgY2FuIGJlIGNhbGxlZCB0byByZWdpc3RlciBhbiBlbXB0eQorCXR5cGUgZm9yIHRoaXMgcmVmZXJlbmNlLCB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiBsYXRlciB3aGVuIHRoZQorCWFjdHVhbCByZWZlcmVuY2VkIERJRSBpcyBwcm9jZXNzZWQuCisgKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2xvb2t1cF91dHlwZSAoZGllX3JlZikKKyAgICAgRElFX1JFRiBkaWVfcmVmOworeworICBzdHJ1Y3QgdHlwZSAqdHlwZSA9IE5VTEw7CisgIGludCB1dHlwZWlkeDsKKyAgCisgIHV0eXBlaWR4ID0gKGRpZV9yZWYgLSBkYnJvZmYpIC8gNDsKKyAgaWYgKCh1dHlwZWlkeCA8IDApIHx8ICh1dHlwZWlkeCA+PSBudW11dHlwZXMpKQorICAgIHsKKyAgICAgIGNvbXBsYWluICgmYmFkX2RpZV9yZWYsIERJRV9JRCwgRElFX05BTUUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHR5cGUgPSAqKHV0eXBlcyArIHV0eXBlaWR4KTsKKyAgICB9CisgIHJldHVybiAodHlwZSk7Cit9CisKKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWFsbG9jX3V0eXBlICAtLSBhZGQgYSB1c2VyIGRlZmluZWQgdHlwZSBmb3IgZGllIHJlZmVyZW5jZQorCitTWU5PUFNJUworCisJc3RhdGljIHR5cGUgKmFsbG9jX3V0eXBlIChESUVfUkVGIGRpZV9yZWYsIHN0cnVjdCB0eXBlICp1dHlwZXApCisKK0RFU0NSSVBUSU9OCisKKwlHaXZlbiBhIGRpZSByZWZlcmVuY2UgRElFX1JFRiwgYW5kIGEgcG9zc2libGUgcG9pbnRlciB0byBhIHVzZXIKKwlkZWZpbmVkIHR5cGUgVVRZUEVQLCByZWdpc3RlciB0aGF0IHRoaXMgcmVmZXJlbmNlIGhhcyBhIHVzZXIKKwlkZWZpbmVkIHR5cGUgYW5kIGVpdGhlciB1c2UgdGhlIHNwZWNpZmllZCB0eXBlIGluIFVUWVBFUCBvcgorCW1ha2UgYSBuZXcgZW1wdHkgdHlwZSB0aGF0IHdpbGwgYmUgZmlsbGVkIGluIGxhdGVyLgorCisJV2Ugc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGNhbGxpbmcgbG9va3VwX3V0eXBlKCkgdG8gdmVyaWZ5IHRoYXQKKwl0aGVyZSBpcyBub3QgY3VycmVudGx5IGEgdHlwZSByZWdpc3RlcmVkIGZvciBESUVfUkVGLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCithbGxvY191dHlwZSAoZGllX3JlZiwgdXR5cGVwKQorICAgICBESUVfUkVGIGRpZV9yZWY7CisgICAgIHN0cnVjdCB0eXBlICp1dHlwZXA7Cit7CisgIHN0cnVjdCB0eXBlICoqdHlwZXA7CisgIGludCB1dHlwZWlkeDsKKyAgCisgIHV0eXBlaWR4ID0gKGRpZV9yZWYgLSBkYnJvZmYpIC8gNDsKKyAgdHlwZXAgPSB1dHlwZXMgKyB1dHlwZWlkeDsKKyAgaWYgKCh1dHlwZWlkeCA8IDApIHx8ICh1dHlwZWlkeCA+PSBudW11dHlwZXMpKQorICAgIHsKKyAgICAgIHV0eXBlcCA9IGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfSU5URUdFUik7CisgICAgICBjb21wbGFpbiAoJmJhZF9kaWVfcmVmLCBESUVfSUQsIERJRV9OQU1FKTsKKyAgICB9CisgIGVsc2UgaWYgKCp0eXBlcCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHV0eXBlcCA9ICp0eXBlcDsKKyAgICAgIGNvbXBsYWluICgmZHVwX3VzZXJfdHlwZV9hbGxvY2F0aW9uLCBESUVfSUQsIERJRV9OQU1FKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAodXR5cGVwID09IE5VTEwpCisJeworCSAgdXR5cGVwID0gYWxsb2NfdHlwZSAoY3VycmVudF9vYmpmaWxlKTsKKwl9CisgICAgICAqdHlwZXAgPSB1dHlwZXA7CisgICAgfQorICByZXR1cm4gKHV0eXBlcCk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlmcmVlX3V0eXBlcyAtLSBmcmVlIHRoZSB1dHlwZXMgYXJyYXkgYW5kIHJlc2V0IHBvaW50ZXIgJiBjb3VudAorCitTWU5PUFNJUworCisJc3RhdGljIHZvaWQgZnJlZV91dHlwZXMgKFBUUiBkdW1teSkKKworREVTQ1JJUFRJT04KKworCUNhbGxlZCB2aWEgZG9fY2xlYW51cHMgdG8gZnJlZSB0aGUgdXR5cGVzIGFycmF5LCByZXNldCB0aGUgcG9pbnRlciB0byBOVUxMLAorCWFuZCBzZXQgbnVtdXR5cGVzIGJhY2sgdG8gemVyby4gIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB1dHlwZXMgZG9lcyBub3QgZ2V0CisJcmVmZXJlbmNlZCBhZnRlciBiZWluZyBmcmVlZC4KKyAqLworCitzdGF0aWMgdm9pZAorZnJlZV91dHlwZXMgKGR1bW15KQorICAgICBQVFIgZHVtbXk7Cit7CisgIGZyZWUgKHV0eXBlcyk7CisgIHV0eXBlcyA9IE5VTEw7CisgIG51bXV0eXBlcyA9IDA7Cit9CisKKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWRlY29kZV9kaWVfdHlwZSAtLSByZXR1cm4gYSB0eXBlIGZvciBhIHNwZWNpZmllZCBkaWUKKworU1lOT1BTSVMKKworCXN0YXRpYyBzdHJ1Y3QgdHlwZSAqZGVjb2RlX2RpZV90eXBlIChzdHJ1Y3QgZGllaW5mbyAqZGlwKQorCitERVNDUklQVElPTgorCisJR2l2ZW4gYSBwb2ludGVyIHRvIGEgZGllIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBESVAsIGRlY29kZSB0aGUKKwl0eXBlIG9mIHRoZSBkaWUgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGRlY29kZWQgdHlwZS4gIEFsbAorCWRpZXMgd2l0aG91dCBzcGVjaWZpYyB0eXBlcyBkZWZhdWx0IHRvIHR5cGUgaW50LgorICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitkZWNvZGVfZGllX3R5cGUgKGRpcCkKKyAgICAgc3RydWN0IGRpZWluZm8gKmRpcDsKK3sKKyAgc3RydWN0IHR5cGUgKnR5cGUgPSBOVUxMOworICAKKyAgaWYgKGRpcCAtPiBhdF9mdW5kX3R5cGUgIT0gMCkKKyAgICB7CisgICAgICB0eXBlID0gZGVjb2RlX2Z1bmRfdHlwZSAoZGlwIC0+IGF0X2Z1bmRfdHlwZSk7CisgICAgfQorICBlbHNlIGlmIChkaXAgLT4gYXRfbW9kX2Z1bmRfdHlwZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHR5cGUgPSBkZWNvZGVfbW9kX2Z1bmRfdHlwZSAoZGlwIC0+IGF0X21vZF9mdW5kX3R5cGUpOworICAgIH0KKyAgZWxzZSBpZiAoZGlwIC0+IGF0X3VzZXJfZGVmX3R5cGUpCisgICAgeworICAgICAgaWYgKCh0eXBlID0gbG9va3VwX3V0eXBlIChkaXAgLT4gYXRfdXNlcl9kZWZfdHlwZSkpID09IE5VTEwpCisJeworCSAgdHlwZSA9IGFsbG9jX3V0eXBlIChkaXAgLT4gYXRfdXNlcl9kZWZfdHlwZSwgTlVMTCk7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoZGlwIC0+IGF0X21vZF91X2RfdHlwZSkKKyAgICB7CisgICAgICB0eXBlID0gZGVjb2RlX21vZF91X2RfdHlwZSAoZGlwIC0+IGF0X21vZF91X2RfdHlwZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdHlwZSA9IGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfVk9JRCk7CisgICAgfQorICByZXR1cm4gKHR5cGUpOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJc3RydWN0X3R5cGUgLS0gY29tcHV0ZSBhbmQgcmV0dXJuIHRoZSB0eXBlIGZvciBhIHN0cnVjdCBvciB1bmlvbgorCitTWU5PUFNJUworCisJc3RhdGljIHN0cnVjdCB0eXBlICpzdHJ1Y3RfdHlwZSAoc3RydWN0IGRpZWluZm8gKmRpcCwgY2hhciAqdGhpc2RpZSwKKwkgICAgY2hhciAqZW5kZGllLCBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSkKKworREVTQ1JJUFRJT04KKworCUdpdmVuIHBvaW50ZXIgdG8gYSBkaWUgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciBhIGRpZSB3aGljaAorCWRlZmluZXMgYSB1bmlvbiBvciBzdHJ1Y3R1cmUgKGFuZCBNVVNUIGRlZmluZSBvbmUgb3IgdGhlIG90aGVyKSwKKwlhbmQgcG9pbnRlcnMgdG8gdGhlIHJhdyBkaWUgZGF0YSB0aGF0IGRlZmluZSB0aGUgcmFuZ2Ugb2YgZGllcyB3aGljaAorCWRlZmluZSB0aGUgbWVtYmVycywgY29tcHV0ZSBhbmQgcmV0dXJuIHRoZSB1c2VyIGRlZmluZWQgdHlwZSBmb3IgdGhlCisJc3RydWN0dXJlIG9yIHVuaW9uLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitzdHJ1Y3RfdHlwZSAoZGlwLCB0aGlzZGllLCBlbmRkaWUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBkaWVpbmZvICpkaXA7CisgICAgIGNoYXIgKnRoaXNkaWU7CisgICAgIGNoYXIgKmVuZGRpZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlOworICBzdHJ1Y3QgbmV4dGZpZWxkIHsKKyAgICBzdHJ1Y3QgbmV4dGZpZWxkICpuZXh0OworICAgIHN0cnVjdCBmaWVsZCBmaWVsZDsKKyAgfTsKKyAgc3RydWN0IG5leHRmaWVsZCAqbGlzdCA9IE5VTEw7CisgIHN0cnVjdCBuZXh0ZmllbGQgKm5ldzsKKyAgaW50IG5maWVsZHMgPSAwOworICBpbnQgbjsKKyAgc3RydWN0IGRpZWluZm8gbWJyOworICBjaGFyICpuZXh0ZGllOworICBpbnQgYW5vbnltb3VzX3NpemU7CisgIAorICBpZiAoKHR5cGUgPSBsb29rdXBfdXR5cGUgKGRpcCAtPiBkaWVfcmVmKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBObyBmb3J3YXJkIHJlZmVyZW5jZXMgY3JlYXRlZCBhbiBlbXB0eSB0eXBlLCBzbyBpbnN0YWxsIG9uZSBub3cgKi8KKyAgICAgIHR5cGUgPSBhbGxvY191dHlwZSAoZGlwIC0+IGRpZV9yZWYsIE5VTEwpOworICAgIH0KKyAgSU5JVF9DUExVU19TUEVDSUZJQyh0eXBlKTsKKyAgc3dpdGNoIChkaXAgLT4gZGllX3RhZykKKyAgICB7CisgICAgICBjYXNlIFRBR19jbGFzc190eXBlOgorICAgICAgICBUWVBFX0NPREUgKHR5cGUpID0gVFlQRV9DT0RFX0NMQVNTOworCWJyZWFrOworICAgICAgY2FzZSBUQUdfc3RydWN0dXJlX3R5cGU6CisgICAgICAgIFRZUEVfQ09ERSAodHlwZSkgPSBUWVBFX0NPREVfU1RSVUNUOworCWJyZWFrOworICAgICAgY2FzZSBUQUdfdW5pb25fdHlwZToKKwlUWVBFX0NPREUgKHR5cGUpID0gVFlQRV9DT0RFX1VOSU9OOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCisJVFlQRV9DT0RFICh0eXBlKSA9IFRZUEVfQ09ERV9VTkRFRjsKKwljb21wbGFpbiAoJm1pc3NpbmdfdGFnLCBESUVfSUQsIERJRV9OQU1FKTsKKwlicmVhazsKKyAgICB9CisgIC8qIFNvbWUgY29tcGlsZXJzIHRyeSB0byBiZSBoZWxwZnVsIGJ5IGludmVudGluZyAiZmFrZSIgbmFtZXMgZm9yCisgICAgIGFub255bW91cyBlbnVtcywgc3RydWN0dXJlcywgYW5kIHVuaW9ucywgbGlrZSAifjBmYWtlIiBvciAiLjBmYWtlIi4KKyAgICAgVGhhbmtzLCBidXQgbm8gdGhhbmtzLi4uICovCisgIGlmIChkaXAgLT4gYXRfbmFtZSAhPSBOVUxMCisgICAgICAmJiAqZGlwIC0+IGF0X25hbWUgIT0gJ34nCisgICAgICAmJiAqZGlwIC0+IGF0X25hbWUgIT0gJy4nKQorICAgIHsKKyAgICAgIFRZUEVfVEFHX05BTUUgKHR5cGUpID0gb2Jjb25jYXQgKCZvYmpmaWxlIC0+IHR5cGVfb2JzdGFjaywKKwkJCQkgICAgICAgIiIsICIiLCBkaXAgLT4gYXRfbmFtZSk7CisgICAgfQorICAvKiBVc2Ugd2hhdGV2ZXIgc2l6ZSBpcyBrbm93bi4gIFplcm8gaXMgYSB2YWxpZCBzaXplLiAgV2UgbWlnaHQgaG93ZXZlcgorICAgICB3aXNoIHRvIGNoZWNrIGhhc19hdF9ieXRlX3NpemUgdG8gbWFrZSBzdXJlIHRoYXQgc29tZSBieXRlIHNpemUgd2FzCisgICAgIGdpdmVuIGV4cGxpY2l0bHksIGJ1dCBEV0FSRiBkb2Vzbid0IHNwZWNpZnkgdGhhdCBleHBsaWNpdCBzaXplcyBvZgorICAgICB6ZXJvIGhhdmUgdG8gcHJlc2VudCwgc28gY29tcGxhaW5pbmcgYWJvdXQgbWlzc2luZyBzaXplcyBzaG91bGQgCisgICAgIHByb2JhYmx5IG5vdCBiZSB0aGUgZGVmYXVsdC4gKi8KKyAgVFlQRV9MRU5HVEggKHR5cGUpID0gZGlwIC0+IGF0X2J5dGVfc2l6ZTsKKyAgdGhpc2RpZSArPSBkaXAgLT4gZGllX2xlbmd0aDsKKyAgd2hpbGUgKHRoaXNkaWUgPCBlbmRkaWUpCisgICAgeworICAgICAgYmFzaWNkaWVpbmZvICgmbWJyLCB0aGlzZGllLCBvYmpmaWxlKTsKKyAgICAgIGNvbXBsZXRlZGllaW5mbyAoJm1iciwgb2JqZmlsZSk7CisgICAgICBpZiAobWJyLmRpZV9sZW5ndGggPD0gU0laRU9GX0RJRV9MRU5HVEgpCisJeworCSAgYnJlYWs7CisJfQorICAgICAgZWxzZSBpZiAobWJyLmF0X3NpYmxpbmcgIT0gMCkKKwl7CisJICBuZXh0ZGllID0gZGJiYXNlICsgbWJyLmF0X3NpYmxpbmcgLSBkYnJvZmY7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG5leHRkaWUgPSB0aGlzZGllICsgbWJyLmRpZV9sZW5ndGg7CisJfQorICAgICAgc3dpdGNoIChtYnIuZGllX3RhZykKKwl7CisJY2FzZSBUQUdfbWVtYmVyOgorCSAgLyogR2V0IHNwYWNlIHRvIHJlY29yZCB0aGUgbmV4dCBmaWVsZCdzIGRhdGEuICAqLworCSAgbmV3ID0gKHN0cnVjdCBuZXh0ZmllbGQgKikgYWxsb2NhIChzaXplb2YgKHN0cnVjdCBuZXh0ZmllbGQpKTsKKwkgIG5ldyAtPiBuZXh0ID0gbGlzdDsKKwkgIGxpc3QgPSBuZXc7CisJICAvKiBTYXZlIHRoZSBkYXRhLiAgKi8KKwkgIGxpc3QgLT4gZmllbGQubmFtZSA9CisJICAgICAgb2JzYXZlc3RyaW5nIChtYnIuYXRfbmFtZSwgc3RybGVuIChtYnIuYXRfbmFtZSksCisJCQkgICAgJm9iamZpbGUgLT4gdHlwZV9vYnN0YWNrKTsKKwkgIEZJRUxEX1RZUEUgKGxpc3QtPmZpZWxkKSA9IGRlY29kZV9kaWVfdHlwZSAoJm1icik7CisJICBGSUVMRF9CSVRQT1MgKGxpc3QtPmZpZWxkKSA9IDggKiBsb2N2YWwgKCZtYnIpOworCSAgLyogSGFuZGxlIGJpdCBmaWVsZHMuICovCisJICBGSUVMRF9CSVRTSVpFIChsaXN0LT5maWVsZCkgPSBtYnIuYXRfYml0X3NpemU7CisJICBpZiAoQklUU19CSUdfRU5ESUFOKQorCSAgICB7CisJICAgICAgLyogRm9yIGJpZyBlbmRpYW4gYml0cywgdGhlIGF0X2JpdF9vZmZzZXQgZ2l2ZXMgdGhlCisJCSBhZGRpdGlvbmFsIGJpdCBvZmZzZXQgZnJvbSB0aGUgTVNCIG9mIHRoZSBjb250YWluaW5nCisJCSBhbm9ueW1vdXMgb2JqZWN0IHRvIHRoZSBNU0Igb2YgdGhlIGZpZWxkLiAgV2UgZG9uJ3QKKwkJIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCBzaW5jZSB3ZSBkb24ndCBuZWVkIHRvCisJCSBrbm93IHRoZSBzaXplIG9mIHRoZSBhbm9ueW1vdXMgb2JqZWN0LiAqLworCSAgICAgIEZJRUxEX0JJVFBPUyAobGlzdC0+ZmllbGQpICs9IG1ici5hdF9iaXRfb2Zmc2V0OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBGb3IgbGl0dGxlIGVuZGlhbiBiaXRzLCB3ZSBuZWVkIHRvIGhhdmUgYSBub24temVybworCQkgYXRfYml0X3NpemUsIHNvIHRoYXQgd2Uga25vdyB3ZSBhcmUgaW4gZmFjdCBkZWFsaW5nCisJCSB3aXRoIGEgYml0ZmllbGQuICBDb21wdXRlIHRoZSBiaXQgb2Zmc2V0IHRvIHRoZSBNU0IKKwkJIG9mIHRoZSBhbm9ueW1vdXMgb2JqZWN0LCBzdWJ0cmFjdCBvZmYgdGhlIG51bWJlciBvZgorCQkgYml0cyBmcm9tIHRoZSBNU0Igb2YgdGhlIGZpZWxkIHRvIHRoZSBNU0Igb2YgdGhlCisJCSBvYmplY3QsIGFuZCB0aGVuIHN1YnRyYWN0IG9mZiB0aGUgbnVtYmVyIG9mIGJpdHMgb2YKKwkJIHRoZSBmaWVsZCBpdHNlbGYuICBUaGUgcmVzdWx0IGlzIHRoZSBiaXQgb2Zmc2V0IG9mCisJCSB0aGUgTFNCIG9mIHRoZSBmaWVsZC4gKi8KKwkgICAgICBpZiAobWJyLmF0X2JpdF9zaXplID4gMCkKKwkJeworCQkgIGlmIChtYnIuaGFzX2F0X2J5dGVfc2l6ZSkKKwkJICAgIHsKKwkJICAgICAgLyogVGhlIHNpemUgb2YgdGhlIGFub255bW91cyBvYmplY3QgY29udGFpbmluZworCQkJIHRoZSBiaXQgZmllbGQgaXMgZXhwbGljaXQsIHNvIHVzZSB0aGUKKwkJCSBpbmRpY2F0ZWQgc2l6ZSAoaW4gYnl0ZXMpLiAqLworCQkgICAgICBhbm9ueW1vdXNfc2l6ZSA9IG1ici5hdF9ieXRlX3NpemU7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvKiBUaGUgc2l6ZSBvZiB0aGUgYW5vbnltb3VzIG9iamVjdCBjb250YWluaW5nCisJCQkgdGhlIGJpdCBmaWVsZCBtYXRjaGVzIHRoZSBzaXplIG9mIGFuIG9iamVjdAorCQkJIG9mIHRoZSBiaXQgZmllbGQncyB0eXBlLiAgRFdBUkYgYWxsb3dzCisJCQkgYXRfYnl0ZV9zaXplIHRvIGJlIGxlZnQgb3V0IGluIHN1Y2ggY2FzZXMsIGFzCisJCQkgYSBkZWJ1ZyBpbmZvcm1hdGlvbiBzaXplIG9wdGltaXphdGlvbi4gKi8KKwkJICAgICAgYW5vbnltb3VzX3NpemUgPSBUWVBFX0xFTkdUSCAobGlzdCAtPiBmaWVsZC50eXBlKTsKKwkJICAgIH0KKwkJICBGSUVMRF9CSVRQT1MgKGxpc3QtPmZpZWxkKSArPQorCQkgICAgYW5vbnltb3VzX3NpemUgKiA4IC0gbWJyLmF0X2JpdF9vZmZzZXQgLSBtYnIuYXRfYml0X3NpemU7CisJCX0KKwkgICAgfQorCSAgbmZpZWxkcysrOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHByb2Nlc3NfZGllcyAodGhpc2RpZSwgbmV4dGRpZSwgb2JqZmlsZSk7CisJICBicmVhazsKKwl9CisgICAgICB0aGlzZGllID0gbmV4dGRpZTsKKyAgICB9CisgIC8qIE5vdyBjcmVhdGUgdGhlIHZlY3RvciBvZiBmaWVsZHMsIGFuZCByZWNvcmQgaG93IGJpZyBpdCBpcy4gIFdlIG1heQorICAgICBub3QgZXZlbiBoYXZlIGFueSBmaWVsZHMsIGlmIHRoaXMgRElFIHdhcyBnZW5lcmF0ZWQgZHVlIHRvIGEgcmVmZXJlbmNlCisgICAgIHRvIGFuIGFub255bW91cyBzdHJ1Y3R1cmUgb3IgdW5pb24uICBJbiB0aGlzIGNhc2UsIFRZUEVfRkxBR19TVFVCIGlzCisgICAgIHNldCwgd2hpY2ggY2x1ZXMgZ2RiIGluIHRvIHRoZSBmYWN0IHRoYXQgaXQgbmVlZHMgdG8gc2VhcmNoIGVsc2V3aGVyZQorICAgICBmb3IgdGhlIGZ1bGwgc3RydWN0dXJlIGRlZmluaXRpb24uICovCisgIGlmIChuZmllbGRzID09IDApCisgICAgeworICAgICAgVFlQRV9GTEFHUyAodHlwZSkgfD0gVFlQRV9GTEFHX1NUVUI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgVFlQRV9ORklFTERTICh0eXBlKSA9IG5maWVsZHM7CisgICAgICBUWVBFX0ZJRUxEUyAodHlwZSkgPSAoc3RydWN0IGZpZWxkICopCisJVFlQRV9BTExPQyAodHlwZSwgc2l6ZW9mIChzdHJ1Y3QgZmllbGQpICogbmZpZWxkcyk7CisgICAgICAvKiBDb3B5IHRoZSBzYXZlZC11cCBmaWVsZHMgaW50byB0aGUgZmllbGQgdmVjdG9yLiAgKi8KKyAgICAgIGZvciAobiA9IG5maWVsZHM7IGxpc3Q7IGxpc3QgPSBsaXN0IC0+IG5leHQpCisJeworCSAgVFlQRV9GSUVMRCAodHlwZSwgLS1uKSA9IGxpc3QgLT4gZmllbGQ7CisJfQkKKyAgICB9CisgIHJldHVybiAodHlwZSk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlyZWFkX3N0cnVjdHVyZV9zY29wZSAtLSBwcm9jZXNzIGFsbCBkaWVzIHdpdGhpbiBzdHJ1Y3Qgb3IgdW5pb24KKworU1lOT1BTSVMKKworCXN0YXRpYyB2b2lkIHJlYWRfc3RydWN0dXJlX3Njb3BlIChzdHJ1Y3QgZGllaW5mbyAqZGlwLAorCQljaGFyICp0aGlzZGllLCBjaGFyICplbmRkaWUsIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlKQorCitERVNDUklQVElPTgorCisJQ2FsbGVkIHdoZW4gd2UgZmluZCB0aGUgRElFIHRoYXQgc3RhcnRzIGEgc3RydWN0dXJlIG9yIHVuaW9uCisJc2NvcGUgKGRlZmluaXRpb24pIHRvIHByb2Nlc3MgYWxsIGRpZXMgdGhhdCBkZWZpbmUgdGhlIG1lbWJlcnMKKwlvZiB0aGUgc3RydWN0dXJlIG9yIHVuaW9uLiAgRElQIGlzIGEgcG9pbnRlciB0byB0aGUgZGllIGluZm8KKwlzdHJ1Y3QgZm9yIHRoZSBESUUgdGhhdCBuYW1lcyB0aGUgc3RydWN0dXJlIG9yIHVuaW9uLgorCitOT1RFUworCisJTm90ZSB0aGF0IHdlIG5lZWQgdG8gY2FsbCBzdHJ1Y3RfdHlwZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90CisJdGhlIERJRSBoYXMgYW4gYXRfbmFtZSBhdHRyaWJ1dGUsIHNpbmNlIGl0IG1pZ2h0IGJlIGFuIGFub255bW91cworCXN0cnVjdHVyZSBvciB1bmlvbi4gIFRoaXMgZ2V0cyB0aGUgdHlwZSBlbnRlcmVkIGludG8gb3VyIHNldCBvZgorCXVzZXIgZGVmaW5lZCB0eXBlcy4KKworCUhvd2V2ZXIsIGlmIHRoZSBzdHJ1Y3R1cmUgaXMgaW5jb21wbGV0ZSAoYW4gb3BhcXVlIHN0cnVjdC91bmlvbikKKwl0aGVuIHN1cHByZXNzIGNyZWF0aW5nIGEgc3ltYm9sIHRhYmxlIGVudHJ5IGZvciBpdCBzaW5jZSBnZGIgb25seQorCXdhbnRzIHRvIGZpbmQgdGhlIG9uZSB3aXRoIHRoZSBjb21wbGV0ZSBkZWZpbml0aW9uLiAgTm90ZSB0aGF0IGlmCisJaXQgaXMgY29tcGxldGUsIHdlIGp1c3QgY2FsbCBuZXdfc3ltYm9sLCB3aGljaCBkb2VzIGl0J3Mgb3duCisJY2hlY2tpbmcgYWJvdXQgd2hldGhlciB0aGUgc3RydWN0L3VuaW9uIGlzIGFub255bW91cyBvciBub3QgKGFuZAorCXN1cHByZXNzZXMgY3JlYXRpbmcgYSBzeW1ib2wgdGFibGUgZW50cnkgaXRzZWxmKS4KKwkKKyAqLworCitzdGF0aWMgdm9pZAorcmVhZF9zdHJ1Y3R1cmVfc2NvcGUgKGRpcCwgdGhpc2RpZSwgZW5kZGllLCBvYmpmaWxlKQorICAgICBzdHJ1Y3QgZGllaW5mbyAqZGlwOworICAgICBjaGFyICp0aGlzZGllOworICAgICBjaGFyICplbmRkaWU7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgc3RydWN0IHN5bWJvbCAqc3ltOworICAKKyAgdHlwZSA9IHN0cnVjdF90eXBlIChkaXAsIHRoaXNkaWUsIGVuZGRpZSwgb2JqZmlsZSk7CisgIGlmICghKFRZUEVfRkxBR1MgKHR5cGUpICYgVFlQRV9GTEFHX1NUVUIpKQorICAgIHsKKyAgICAgIHN5bSA9IG5ld19zeW1ib2wgKGRpcCwgb2JqZmlsZSk7CisgICAgICBpZiAoc3ltICE9IE5VTEwpCisJeworCSAgU1lNQk9MX1RZUEUgKHN5bSkgPSB0eXBlOworCSAgaWYgKGN1X2xhbmd1YWdlID09IGxhbmd1YWdlX2NwbHVzKQorCSAgICB7CisJICAgICAgc3ludGhlc2l6ZV90eXBlZGVmIChkaXAsIG9iamZpbGUsIHR5cGUpOworCSAgICB9CisJfQorICAgIH0KK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWRlY29kZV9hcnJheV9lbGVtZW50X3R5cGUgLS0gZGVjb2RlIHR5cGUgb2YgdGhlIGFycmF5IGVsZW1lbnRzCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgc3RydWN0IHR5cGUgKmRlY29kZV9hcnJheV9lbGVtZW50X3R5cGUgKGNoYXIgKnNjYW4sIGNoYXIgKmVuZCkKKworREVTQ1JJUFRJT04KKworCUFzIHRoZSBsYXN0IHN0ZXAgaW4gZGVjb2RpbmcgdGhlIGFycmF5IHN1YnNjcmlwdCBpbmZvcm1hdGlvbiBmb3IgYW4KKwlhcnJheSBESUUsIHdlIG5lZWQgdG8gZGVjb2RlIHRoZSB0eXBlIG9mIHRoZSBhcnJheSBlbGVtZW50cy4gIFdlIGFyZQorCXBhc3NlZCBhIHBvaW50ZXIgdG8gdGhpcyBsYXN0IHBhcnQgb2YgdGhlIHN1YnNjcmlwdCBpbmZvcm1hdGlvbiBhbmQKKwltdXN0IHJldHVybiB0aGUgYXBwcm9wcmlhdGUgdHlwZS4gIElmIHRoZSB0eXBlIGF0dHJpYnV0ZSBpcyBub3QKKwlyZWNvZ25pemVkLCBqdXN0IHdhcm4gYWJvdXQgdGhlIHByb2JsZW0gYW5kIHJldHVybiB0eXBlIGludC4KKyAqLworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorZGVjb2RlX2FycmF5X2VsZW1lbnRfdHlwZSAoc2NhbikKKyAgICAgY2hhciAqc2NhbjsKK3sKKyAgc3RydWN0IHR5cGUgKnR5cGVwOworICBESUVfUkVGIGRpZV9yZWY7CisgIHVuc2lnbmVkIHNob3J0IGF0dHJpYnV0ZTsKKyAgdW5zaWduZWQgc2hvcnQgZnVuZHR5cGU7CisgIGludCBuYnl0ZXM7CisgIAorICBhdHRyaWJ1dGUgPSB0YXJnZXRfdG9faG9zdCAoc2NhbiwgU0laRU9GX0FUVFJJQlVURSwgR0VUX1VOU0lHTkVELAorCQkJICAgICAgY3VycmVudF9vYmpmaWxlKTsKKyAgc2NhbiArPSBTSVpFT0ZfQVRUUklCVVRFOworICBpZiAoKG5ieXRlcyA9IGF0dHJpYnV0ZV9zaXplIChhdHRyaWJ1dGUpKSA9PSAtMSkKKyAgICB7CisgICAgICBjb21wbGFpbiAoJmJhZF9hcnJheV9lbGVtZW50X3R5cGUsIERJRV9JRCwgRElFX05BTUUsIGF0dHJpYnV0ZSk7CisgICAgICB0eXBlcCA9IGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfSU5URUdFUik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpCisJeworCSAgY2FzZSBBVF9mdW5kX3R5cGU6CisJICAgIGZ1bmR0eXBlID0gdGFyZ2V0X3RvX2hvc3QgKHNjYW4sIG5ieXRlcywgR0VUX1VOU0lHTkVELAorCQkJCSAgICAgICBjdXJyZW50X29iamZpbGUpOworCSAgICB0eXBlcCA9IGRlY29kZV9mdW5kX3R5cGUgKGZ1bmR0eXBlKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIEFUX21vZF9mdW5kX3R5cGU6CisJICAgIHR5cGVwID0gZGVjb2RlX21vZF9mdW5kX3R5cGUgKHNjYW4pOworCSAgICBicmVhazsKKwkgIGNhc2UgQVRfdXNlcl9kZWZfdHlwZToKKwkgICAgZGllX3JlZiA9IHRhcmdldF90b19ob3N0IChzY2FuLCBuYnl0ZXMsIEdFVF9VTlNJR05FRCwKKwkJCQkgICAgICBjdXJyZW50X29iamZpbGUpOworCSAgICBpZiAoKHR5cGVwID0gbG9va3VwX3V0eXBlIChkaWVfcmVmKSkgPT0gTlVMTCkKKwkgICAgICB7CisJCXR5cGVwID0gYWxsb2NfdXR5cGUgKGRpZV9yZWYsIE5VTEwpOworCSAgICAgIH0KKwkgICAgYnJlYWs7CisJICBjYXNlIEFUX21vZF91X2RfdHlwZToKKwkgICAgdHlwZXAgPSBkZWNvZGVfbW9kX3VfZF90eXBlIChzY2FuKTsKKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICBjb21wbGFpbiAoJmJhZF9hcnJheV9lbGVtZW50X3R5cGUsIERJRV9JRCwgRElFX05BTUUsIGF0dHJpYnV0ZSk7CisJICAgIHR5cGVwID0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSAoY3VycmVudF9vYmpmaWxlLCBGVF9JTlRFR0VSKTsKKwkgICAgYnJlYWs7CisJICB9CisgICAgfQorICByZXR1cm4gKHR5cGVwKTsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWRlY29kZV9zdWJzY3JpcHRfZGF0YV9pdGVtIC0tIGRlY29kZSBhcnJheSBzdWJzY3JpcHQgaXRlbQorCitTWU5PUFNJUworCisJc3RhdGljIHN0cnVjdCB0eXBlICoKKwlkZWNvZGVfc3Vic2NyaXB0X2RhdGFfaXRlbSAoY2hhciAqc2NhbiwgY2hhciAqZW5kKQorCitERVNDUklQVElPTgorCisJVGhlIGFycmF5IHN1YnNjcmlwdHMgYW5kIHRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnRzIG9mIGFuCisJYXJyYXkgYXJlIGRlc2NyaWJlZCBieSBhIGxpc3Qgb2YgZGF0YSBpdGVtcywgc3RvcmVkIGFzIGEgYmxvY2sKKwlvZiBjb250aWd1b3VzIGJ5dGVzLiAgVGhlcmUgaXMgYSBkYXRhIGl0ZW0gZGVzY3JpYmluZyBlYWNoIGFycmF5CisJZGltZW5zaW9uLCBhbmQgYSBmaW5hbCBkYXRhIGl0ZW0gZGVzY3JpYmluZyB0aGUgZWxlbWVudCB0eXBlLgorCVRoZSBkYXRhIGl0ZW1zIGFyZSBvcmRlcmVkIHRoZSBzYW1lIGFzIHRoZWlyIGFwcGVhcmFuY2UgaW4gdGhlCisJc291cmNlIChJLkUuIGxlZnRtb3N0IGRpbWVuc2lvbiBmaXJzdCwgbmV4dCB0byBsZWZ0bW9zdCBzZWNvbmQsCisJZXRjKS4KKworCVRoZSBkYXRhIGl0ZW1zIGRlc2NyaWJpbmcgZWFjaCBhcnJheSBkaW1lbnNpb24gY29uc2lzdCBvZiBmb3VyCisJcGFydHM6ICgxKSBhIGZvcm1hdCBzcGVjaWZpZXIsICgyKSB0eXBlIHR5cGUgb2YgdGhlIHN1YnNjcmlwdAorCWluZGV4LCAoMykgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbG93IGJvdW5kIG9mIHRoZSBhcnJheSBkaW1lbnNpb24sCisJYW5kICg0KSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBoaWdoIGJvdW5kIG9mIHRoZSBhcnJheSBkaW1lbnNpb24uCisKKwlUaGUgbGFzdCBkYXRhIGl0ZW0gaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0eXBlIG9mIGVhY2ggb2YKKwl0aGUgYXJyYXkgZWxlbWVudHMuCisKKwlXZSBhcmUgcGFzc2VkIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9mIGJ5dGVzCisJY29udGFpbmluZyB0aGUgcmVtYWluaW5nIGRhdGEgaXRlbXMsIGFuZCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0CisJYnl0ZSBwYXN0IHRoZSBkYXRhLiAgVGhpcyBmdW5jdGlvbiByZWN1cnNpdmVseSBkZWNvZGVzIHRoZQorCXJlbWFpbmluZyBkYXRhIGl0ZW1zIGFuZCByZXR1cm5zIGEgdHlwZS4KKworCUlmIHdlIHNvbWVob3cgZmFpbCB0byBkZWNvZGUgc29tZSBkYXRhLCB3ZSBjb21wbGFpbiBhYm91dCBpdAorCWFuZCByZXR1cm4gYSB0eXBlICJhcnJheSBvZiBpbnQiLgorCitCVUdTCisJRklYTUU6ICBUaGlzIGNvZGUgb25seSBpbXBsZW1lbnRzIHRoZSBmb3JtcyBjdXJyZW50bHkgdXNlZAorCWJ5IHRoZSBBVCZUIGFuZCBHTlUgQyBjb21waWxlcnMuCisKKwlUaGUgZW5kIHBvaW50ZXIgaXMgc3VwcGxpZWQgZm9yIGVycm9yIGNoZWNraW5nLCBtYXliZSB3ZSBzaG91bGQKKwl1c2UgaXQgZm9yIHRoYXQuLi4KKyAqLworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorZGVjb2RlX3N1YnNjcmlwdF9kYXRhX2l0ZW0gKHNjYW4sIGVuZCkKKyAgICAgY2hhciAqc2NhbjsKKyAgICAgY2hhciAqZW5kOworeworICBzdHJ1Y3QgdHlwZSAqdHlwZXAgPSBOVUxMOwkvKiBBcnJheSB0eXBlIHdlIGFyZSBidWlsZGluZyAqLworICBzdHJ1Y3QgdHlwZSAqbmV4dHR5cGU7CS8qIFR5cGUgb2YgZWFjaCBlbGVtZW50IChtYXkgYmUgYXJyYXkpICovCisgIHN0cnVjdCB0eXBlICppbmRleHR5cGU7CS8qIFR5cGUgb2YgdGhpcyBpbmRleCAqLworICBzdHJ1Y3QgdHlwZSAqcmFuZ2V0eXBlOworICB1bnNpZ25lZCBpbnQgZm9ybWF0OworICB1bnNpZ25lZCBzaG9ydCBmdW5kdHlwZTsKKyAgdW5zaWduZWQgbG9uZyBsb3dib3VuZDsKKyAgdW5zaWduZWQgbG9uZyBoaWdoYm91bmQ7CisgIGludCBuYnl0ZXM7CisgIAorICBmb3JtYXQgPSB0YXJnZXRfdG9faG9zdCAoc2NhbiwgU0laRU9GX0ZPUk1BVF9TUEVDSUZJRVIsIEdFVF9VTlNJR05FRCwKKwkJCSAgIGN1cnJlbnRfb2JqZmlsZSk7CisgIHNjYW4gKz0gU0laRU9GX0ZPUk1BVF9TUEVDSUZJRVI7CisgIHN3aXRjaCAoZm9ybWF0KQorICAgIHsKKyAgICBjYXNlIEZNVF9FVDoKKyAgICAgIHR5cGVwID0gZGVjb2RlX2FycmF5X2VsZW1lbnRfdHlwZSAoc2Nhbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZNVF9GVF9DX0M6CisgICAgICBmdW5kdHlwZSA9IHRhcmdldF90b19ob3N0IChzY2FuLCBTSVpFT0ZfRk1UX0ZULCBHRVRfVU5TSUdORUQsCisJCQkJIGN1cnJlbnRfb2JqZmlsZSk7CisgICAgICBpbmRleHR5cGUgPSBkZWNvZGVfZnVuZF90eXBlIChmdW5kdHlwZSk7CisgICAgICBzY2FuICs9IFNJWkVPRl9GTVRfRlQ7CisgICAgICBuYnl0ZXMgPSBUQVJHRVRfRlRfTE9OR19TSVpFIChjdXJyZW50X29iamZpbGUpOworICAgICAgbG93Ym91bmQgPSB0YXJnZXRfdG9faG9zdCAoc2NhbiwgbmJ5dGVzLCBHRVRfVU5TSUdORUQsIGN1cnJlbnRfb2JqZmlsZSk7CisgICAgICBzY2FuICs9IG5ieXRlczsKKyAgICAgIGhpZ2hib3VuZCA9IHRhcmdldF90b19ob3N0IChzY2FuLCBuYnl0ZXMsIEdFVF9VTlNJR05FRCwgY3VycmVudF9vYmpmaWxlKTsKKyAgICAgIHNjYW4gKz0gbmJ5dGVzOworICAgICAgbmV4dHR5cGUgPSBkZWNvZGVfc3Vic2NyaXB0X2RhdGFfaXRlbSAoc2NhbiwgZW5kKTsKKyAgICAgIGlmIChuZXh0dHlwZSA9PSBOVUxMKQorCXsKKwkgIC8qIE11bmdlZCBzdWJzY3JpcHQgZGF0YSBvciBvdGhlciBwcm9ibGVtLCBmYWtlIGl0LiAqLworCSAgY29tcGxhaW4gKCZzdWJzY3JpcHRfZGF0YV9pdGVtcywgRElFX0lELCBESUVfTkFNRSk7CisJICBuZXh0dHlwZSA9IGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfSU5URUdFUik7CisJfQorICAgICAgcmFuZ2V0eXBlID0gY3JlYXRlX3JhbmdlX3R5cGUgKChzdHJ1Y3QgdHlwZSAqKSBOVUxMLCBpbmRleHR5cGUsCisJCQkJICAgICAgbG93Ym91bmQsIGhpZ2hib3VuZCk7CisgICAgICB0eXBlcCA9IGNyZWF0ZV9hcnJheV90eXBlICgoc3RydWN0IHR5cGUgKikgTlVMTCwgbmV4dHR5cGUsIHJhbmdldHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZNVF9GVF9DX1g6CisgICAgY2FzZSBGTVRfRlRfWF9DOgorICAgIGNhc2UgRk1UX0ZUX1hfWDoKKyAgICBjYXNlIEZNVF9VVF9DX0M6CisgICAgY2FzZSBGTVRfVVRfQ19YOgorICAgIGNhc2UgRk1UX1VUX1hfQzoKKyAgICBjYXNlIEZNVF9VVF9YX1g6CisgICAgICBjb21wbGFpbiAoJnVuaGFuZGxlZF9hcnJheV9zdWJzY3JpcHRfZm9ybWF0LCBESUVfSUQsIERJRV9OQU1FLCBmb3JtYXQpOworICAgICAgbmV4dHR5cGUgPSBkd2FyZl9mdW5kYW1lbnRhbF90eXBlIChjdXJyZW50X29iamZpbGUsIEZUX0lOVEVHRVIpOworICAgICAgcmFuZ2V0eXBlID0gY3JlYXRlX3JhbmdlX3R5cGUgKChzdHJ1Y3QgdHlwZSAqKSBOVUxMLCBuZXh0dHlwZSwgMCwgMCk7CisgICAgICB0eXBlcCA9IGNyZWF0ZV9hcnJheV90eXBlICgoc3RydWN0IHR5cGUgKikgTlVMTCwgbmV4dHR5cGUsIHJhbmdldHlwZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgY29tcGxhaW4gKCZ1bmtub3duX2FycmF5X3N1YnNjcmlwdF9mb3JtYXQsIERJRV9JRCwgRElFX05BTUUsIGZvcm1hdCk7CisgICAgICBuZXh0dHlwZSA9IGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfSU5URUdFUik7CisgICAgICByYW5nZXR5cGUgPSBjcmVhdGVfcmFuZ2VfdHlwZSAoKHN0cnVjdCB0eXBlICopIE5VTEwsIG5leHR0eXBlLCAwLCAwKTsKKyAgICAgIHR5cGVwID0gY3JlYXRlX2FycmF5X3R5cGUgKChzdHJ1Y3QgdHlwZSAqKSBOVUxMLCBuZXh0dHlwZSwgcmFuZ2V0eXBlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuICh0eXBlcCk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlkd2FyZl9yZWFkX2FycmF5X3R5cGUgLS0gcmVhZCBUQUdfYXJyYXlfdHlwZSBESUUKKworU1lOT1BTSVMKKworCXN0YXRpYyB2b2lkIGR3YXJmX3JlYWRfYXJyYXlfdHlwZSAoc3RydWN0IGRpZWluZm8gKmRpcCkKKworREVTQ1JJUFRJT04KKworCUV4dHJhY3QgYWxsIGluZm9ybWF0aW9uIGZyb20gYSBUQUdfYXJyYXlfdHlwZSBESUUgYW5kIGFkZCB0bworCXRoZSB1c2VyIGRlZmluZWQgdHlwZSB2ZWN0b3IuCisgKi8KKworc3RhdGljIHZvaWQKK2R3YXJmX3JlYWRfYXJyYXlfdHlwZSAoZGlwKQorICAgICBzdHJ1Y3QgZGllaW5mbyAqZGlwOworeworICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgc3RydWN0IHR5cGUgKnV0eXBlOworICBjaGFyICpzdWI7CisgIGNoYXIgKnN1YmVuZDsKKyAgdW5zaWduZWQgc2hvcnQgYmxvY2tzejsKKyAgaW50IG5ieXRlczsKKyAgCisgIGlmIChkaXAgLT4gYXRfb3JkZXJpbmcgIT0gT1JEX3Jvd19tYWpvcikKKyAgICB7CisgICAgICAvKiBGSVhNRTogIENhbiBnZGIgZXZlbiBoYW5kbGUgY29sdW1uIG1ham9yIGFycmF5cz8gKi8KKyAgICAgIGNvbXBsYWluICgmbm90X3Jvd19tYWpvciwgRElFX0lELCBESUVfTkFNRSk7CisgICAgfQorICBpZiAoKHN1YiA9IGRpcCAtPiBhdF9zdWJzY3JfZGF0YSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBuYnl0ZXMgPSBhdHRyaWJ1dGVfc2l6ZSAoQVRfc3Vic2NyX2RhdGEpOworICAgICAgYmxvY2tzeiA9IHRhcmdldF90b19ob3N0IChzdWIsIG5ieXRlcywgR0VUX1VOU0lHTkVELCBjdXJyZW50X29iamZpbGUpOworICAgICAgc3ViZW5kID0gc3ViICsgbmJ5dGVzICsgYmxvY2tzejsKKyAgICAgIHN1YiArPSBuYnl0ZXM7CisgICAgICB0eXBlID0gZGVjb2RlX3N1YnNjcmlwdF9kYXRhX2l0ZW0gKHN1Yiwgc3ViZW5kKTsKKyAgICAgIGlmICgodXR5cGUgPSBsb29rdXBfdXR5cGUgKGRpcCAtPiBkaWVfcmVmKSkgPT0gTlVMTCkKKwl7CisJICAvKiBJbnN0YWxsIHVzZXIgZGVmaW5lZCB0eXBlIHRoYXQgaGFzIG5vdCBiZWVuIHJlZmVyZW5jZWQgeWV0LiAqLworCSAgYWxsb2NfdXR5cGUgKGRpcCAtPiBkaWVfcmVmLCB0eXBlKTsKKwl9CisgICAgICBlbHNlIGlmIChUWVBFX0NPREUgKHV0eXBlKSA9PSBUWVBFX0NPREVfVU5ERUYpCisJeworCSAgLyogSWNrISAgQSBmb3J3YXJkIHJlZiBoYXMgYWxyZWFkeSBnZW5lcmF0ZWQgYSBibGFuayB0eXBlIGluIG91cgorCSAgICAgc2xvdCwgYW5kIHRoaXMgdHlwZSBwcm9iYWJseSBhbHJlYWR5IGhhcyB0aGluZ3MgcG9pbnRpbmcgdG8gaXQKKwkgICAgICh3aGljaCBpcyB3aGF0IGNhdXNlZCBpdCB0byBiZSBjcmVhdGVkIGluIHRoZSBmaXJzdCBwbGFjZSkuCisJICAgICBJZiBpdCdzIGp1c3QgYSBwbGFjZSBob2xkZXIgd2UgY2FuIHBsb3Agb3VyIGZ1bGx5IGRlZmluZWQgdHlwZQorCSAgICAgb24gdG9wIG9mIGl0LiAgV2UgY2FuJ3QgcmVjb3ZlciB0aGUgc3BhY2UgYWxsb2NhdGVkIGZvciBvdXIKKwkgICAgIG5ldyB0eXBlIHNpbmNlIGl0IG1pZ2h0IGJlIG9uIGFuIG9ic3RhY2ssIGJ1dCB3ZSBjb3VsZCByZXVzZQorCSAgICAgaXQgaWYgd2Uga2VwdCBhIGxpc3Qgb2YgdGhlbSwgYnV0IGl0IG1pZ2h0IG5vdCBiZSB3b3J0aCBpdAorCSAgICAgKEZJWE1FKS4gKi8KKwkgICp1dHlwZSA9ICp0eXBlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBEb3VibGUgaWNrISAgTm90IG9ubHkgaXMgYSB0eXBlIGFscmVhZHkgaW4gb3VyIHNsb3QsIGJ1dAorCSAgICAgc29tZW9uZSBoYXMgZGVjb3JhdGVkIGl0LiAgQ29tcGxhaW4gYW5kIGxlYXZlIGl0IGFsb25lLiAqLworCSAgY29tcGxhaW4gKCZkdXBfdXNlcl90eXBlX2RlZmluaXRpb24sIERJRV9JRCwgRElFX05BTUUpOworCX0KKyAgICB9Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlyZWFkX3RhZ19wb2ludGVyX3R5cGUgLS0gcmVhZCBUQUdfcG9pbnRlcl90eXBlIERJRQorCitTWU5PUFNJUworCisJc3RhdGljIHZvaWQgcmVhZF90YWdfcG9pbnRlcl90eXBlIChzdHJ1Y3QgZGllaW5mbyAqZGlwKQorCitERVNDUklQVElPTgorCisJRXh0cmFjdCBhbGwgaW5mb3JtYXRpb24gZnJvbSBhIFRBR19wb2ludGVyX3R5cGUgRElFIGFuZCBhZGQgdG8KKwl0aGUgdXNlciBkZWZpbmVkIHR5cGUgdmVjdG9yLgorICovCisKK3N0YXRpYyB2b2lkCityZWFkX3RhZ19wb2ludGVyX3R5cGUgKGRpcCkKKyAgICAgc3RydWN0IGRpZWluZm8gKmRpcDsKK3sKKyAgc3RydWN0IHR5cGUgKnR5cGU7CisgIHN0cnVjdCB0eXBlICp1dHlwZTsKKyAgCisgIHR5cGUgPSBkZWNvZGVfZGllX3R5cGUgKGRpcCk7CisgIGlmICgodXR5cGUgPSBsb29rdXBfdXR5cGUgKGRpcCAtPiBkaWVfcmVmKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICB1dHlwZSA9IGxvb2t1cF9wb2ludGVyX3R5cGUgKHR5cGUpOworICAgICAgYWxsb2NfdXR5cGUgKGRpcCAtPiBkaWVfcmVmLCB1dHlwZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgVFlQRV9UQVJHRVRfVFlQRSAodXR5cGUpID0gdHlwZTsKKyAgICAgIFRZUEVfUE9JTlRFUl9UWVBFICh0eXBlKSA9IHV0eXBlOworCisgICAgICAvKiBXZSBhc3N1bWUgdGhlIG1hY2hpbmUgaGFzIG9ubHkgb25lIHJlcHJlc2VudGF0aW9uIGZvciBwb2ludGVycyEgICovCisgICAgICAvKiBGSVhNRTogIFBvc3NhYmx5IGEgcG9vciBhc3N1bXB0aW9uICAqLworICAgICAgVFlQRV9MRU5HVEggKHV0eXBlKSA9IFRBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUIDsKKyAgICAgIFRZUEVfQ09ERSAodXR5cGUpID0gVFlQRV9DT0RFX1BUUjsKKyAgICB9Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlyZWFkX3RhZ19zdHJpbmdfdHlwZSAtLSByZWFkIFRBR19zdHJpbmdfdHlwZSBESUUKKworU1lOT1BTSVMKKworCXN0YXRpYyB2b2lkIHJlYWRfdGFnX3N0cmluZ190eXBlIChzdHJ1Y3QgZGllaW5mbyAqZGlwKQorCitERVNDUklQVElPTgorCisJRXh0cmFjdCBhbGwgaW5mb3JtYXRpb24gZnJvbSBhIFRBR19zdHJpbmdfdHlwZSBESUUgYW5kIGFkZCB0bworCXRoZSB1c2VyIGRlZmluZWQgdHlwZSB2ZWN0b3IuICBJdCBpc24ndCByZWFsbHkgYSB1c2VyIGRlZmluZWQKKwl0eXBlLCBidXQgaXQgYmVoYXZlcyBsaWtlIG9uZSwgd2l0aCBvdGhlciBESUUncyB1c2luZyBhbgorCUFUX3VzZXJfZGVmX3R5cGUgYXR0cmlidXRlIHRvIHJlZmVyZW5jZSBpdC4KKyAqLworCitzdGF0aWMgdm9pZAorcmVhZF90YWdfc3RyaW5nX3R5cGUgKGRpcCkKKyAgICAgc3RydWN0IGRpZWluZm8gKmRpcDsKK3sKKyAgc3RydWN0IHR5cGUgKnV0eXBlOworICBzdHJ1Y3QgdHlwZSAqaW5kZXh0eXBlOworICBzdHJ1Y3QgdHlwZSAqcmFuZ2V0eXBlOworICB1bnNpZ25lZCBsb25nIGxvd2JvdW5kID0gMDsKKyAgdW5zaWduZWQgbG9uZyBoaWdoYm91bmQ7CisKKyAgaWYgKGRpcCAtPiBoYXNfYXRfYnl0ZV9zaXplKQorICAgIHsKKyAgICAgIC8qIEEgZml4ZWQgYm91bmRzIHN0cmluZyAqLworICAgICAgaGlnaGJvdW5kID0gZGlwIC0+IGF0X2J5dGVfc2l6ZSAtIDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogQSB2YXJ5aW5nIGxlbmd0aCBzdHJpbmcuICBTdHViIGZvciBub3cuICAoRklYTUUpICovCisgICAgICBoaWdoYm91bmQgPSAxOworICAgIH0KKyAgaW5kZXh0eXBlID0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSAoY3VycmVudF9vYmpmaWxlLCBGVF9JTlRFR0VSKTsKKyAgcmFuZ2V0eXBlID0gY3JlYXRlX3JhbmdlX3R5cGUgKChzdHJ1Y3QgdHlwZSAqKSBOVUxMLCBpbmRleHR5cGUsIGxvd2JvdW5kLAorCQkJCSBoaWdoYm91bmQpOworICAgICAgCisgIHV0eXBlID0gbG9va3VwX3V0eXBlIChkaXAgLT4gZGllX3JlZik7CisgIGlmICh1dHlwZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIE5vIHR5cGUgZGVmaW5lZCwgZ28gYWhlYWQgYW5kIGNyZWF0ZSBhIGJsYW5rIG9uZSB0byB1c2UuICovCisgICAgICB1dHlwZSA9IGFsbG9jX3V0eXBlIChkaXAgLT4gZGllX3JlZiwgKHN0cnVjdCB0eXBlICopIE5VTEwpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEFscmVhZHkgYSB0eXBlIGluIG91ciBzbG90IGR1ZSB0byBhIGZvcndhcmQgcmVmZXJlbmNlLiBNYWtlIHN1cmUgaXQKKwkgaXMgYSBibGFuayBvbmUuICBJZiBub3QsIGNvbXBsYWluIGFuZCBsZWF2ZSBpdCBhbG9uZS4gKi8KKyAgICAgIGlmIChUWVBFX0NPREUgKHV0eXBlKSAhPSBUWVBFX0NPREVfVU5ERUYpCisJeworCSAgY29tcGxhaW4gKCZkdXBfdXNlcl90eXBlX2RlZmluaXRpb24sIERJRV9JRCwgRElFX05BTUUpOworCSAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgLyogQ3JlYXRlIHRoZSBzdHJpbmcgdHlwZSB1c2luZyB0aGUgYmxhbmsgdHlwZSB3ZSBlaXRoZXIgZm91bmQgb3IgY3JlYXRlZC4gKi8KKyAgdXR5cGUgPSBjcmVhdGVfc3RyaW5nX3R5cGUgKHV0eXBlLCByYW5nZXR5cGUpOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJcmVhZF9zdWJyb3V0aW5lX3R5cGUgLS0gcHJvY2VzcyBUQUdfc3Vicm91dGluZV90eXBlIGRpZXMKKworU1lOT1BTSVMKKworCXN0YXRpYyB2b2lkIHJlYWRfc3Vicm91dGluZV90eXBlIChzdHJ1Y3QgZGllaW5mbyAqZGlwLCBjaGFyIHRoaXNkaWUsCisJCWNoYXIgKmVuZGRpZSkKKworREVTQ1JJUFRJT04KKworCUhhbmRsZSBESUVTIGR1ZSB0byBDIGNvZGUgbGlrZToKKworCXN0cnVjdCBmb28geworCSAgICBpbnQgKCpmdW5jcCkoaW50IGEsIGxvbmcgbCk7ICAoR2VuZXJhdGVzIFRBR19zdWJyb3V0aW5lX3R5cGUgRElFKQorCSAgICBpbnQgYjsKKwl9OworCitOT1RFUworCisJVGhlIHBhcmFtZXRlciBESUVTIGFyZSBjdXJyZW50bHkgaWdub3JlZC4gIFNlZSBpZiBnZGIgaGFzIGEgd2F5IHRvCisJaW5jbHVkZSB0aGlzIGluZm8gaW4gaXQncyB0eXBlIHN5c3RlbSwgYW5kIGRlY29kZSB0aGVtIGlmIHNvLiAgSXMKKwl0aGlzIHdoYXQgdGhlIHR5cGUgc3RydWN0dXJlJ3MgImFyZ190eXBlcyIgZmllbGQgaXMgZm9yPyAgKEZJWE1FKQorICovCisKK3N0YXRpYyB2b2lkCityZWFkX3N1YnJvdXRpbmVfdHlwZSAoZGlwLCB0aGlzZGllLCBlbmRkaWUpCisgICAgIHN0cnVjdCBkaWVpbmZvICpkaXA7CisgICAgIGNoYXIgKnRoaXNkaWU7CisgICAgIGNoYXIgKmVuZGRpZTsKK3sKKyAgc3RydWN0IHR5cGUgKnR5cGU7CQkvKiBUeXBlIHRoYXQgdGhpcyBmdW5jdGlvbiByZXR1cm5zICovCisgIHN0cnVjdCB0eXBlICpmdHlwZTsJCS8qIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhYm92ZSB0eXBlICovCisgIAorICAvKiBEZWNvZGUgdGhlIHR5cGUgdGhhdCB0aGlzIHN1YnJvdXRpbmUgcmV0dXJucyAqLworCisgIHR5cGUgPSBkZWNvZGVfZGllX3R5cGUgKGRpcCk7CisKKyAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHBhcnRpYWxseSBjb25zdHJ1Y3RlZCB1c2VyCisgICAgIGRlZmluZWQgdHlwZSBmb3IgdGhpcyBESUUsIGZyb20gYSBmb3J3YXJkIHJlZmVyZW5jZS4gKi8KKworICBpZiAoKGZ0eXBlID0gbG9va3VwX3V0eXBlIChkaXAgLT4gZGllX3JlZikpID09IE5VTEwpCisgICAgeworICAgICAgLyogVGhpcyBpcyB0aGUgZmlyc3QgcmVmZXJlbmNlIHRvIG9uZSBvZiB0aGVzZSB0eXBlcy4gIE1ha2UKKwkgYSBuZXcgb25lIGFuZCBwbGFjZSBpdCBpbiB0aGUgdXNlciBkZWZpbmVkIHR5cGVzLiAqLworICAgICAgZnR5cGUgPSBsb29rdXBfZnVuY3Rpb25fdHlwZSAodHlwZSk7CisgICAgICBhbGxvY191dHlwZSAoZGlwIC0+IGRpZV9yZWYsIGZ0eXBlKTsKKyAgICB9CisgIGVsc2UgaWYgKFRZUEVfQ09ERSAoZnR5cGUpID09IFRZUEVfQ09ERV9VTkRFRikKKyAgICB7CisgICAgICAvKiBXZSBoYXZlIGFuIGV4aXN0aW5nIHBhcnRpYWxseSBjb25zdHJ1Y3RlZCB0eXBlLCBzbyBiYXNoIGl0CisJIGludG8gdGhlIGNvcnJlY3QgdHlwZS4gKi8KKyAgICAgIFRZUEVfVEFSR0VUX1RZUEUgKGZ0eXBlKSA9IHR5cGU7CisgICAgICBUWVBFX0xFTkdUSCAoZnR5cGUpID0gMTsKKyAgICAgIFRZUEVfQ09ERSAoZnR5cGUpID0gVFlQRV9DT0RFX0ZVTkM7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29tcGxhaW4gKCZkdXBfdXNlcl90eXBlX2RlZmluaXRpb24sIERJRV9JRCwgRElFX05BTUUpOworICAgIH0KK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCXJlYWRfZW51bWVyYXRpb24gLS0gcHJvY2VzcyBkaWVzIHdoaWNoIGRlZmluZSBhbiBlbnVtZXJhdGlvbgorCitTWU5PUFNJUworCisJc3RhdGljIHZvaWQgcmVhZF9lbnVtZXJhdGlvbiAoc3RydWN0IGRpZWluZm8gKmRpcCwgY2hhciAqdGhpc2RpZSwKKwkJY2hhciAqZW5kZGllLCBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSkKKworREVTQ1JJUFRJT04KKworCUdpdmVuIGEgcG9pbnRlciB0byBhIGRpZSB3aGljaCBiZWdpbnMgYW4gZW51bWVyYXRpb24sIHByb2Nlc3MgYWxsCisJdGhlIGRpZXMgdGhhdCBkZWZpbmUgdGhlIG1lbWJlcnMgb2YgdGhlIGVudW1lcmF0aW9uLgorCitOT1RFUworCisJTm90ZSB0aGF0IHdlIG5lZWQgdG8gY2FsbCBlbnVtX3R5cGUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB3ZQorCWhhdmUgYSBzeW1ib2wsIHNpbmNlIHdlIG1pZ2h0IGhhdmUgYW4gZW51bSB3aXRob3V0IGEgdGFnIG5hbWUgKHRodXMKKwlubyBzeW1ib2wgZm9yIHRoZSB0YWduYW1lKS4KKyAqLworCitzdGF0aWMgdm9pZAorcmVhZF9lbnVtZXJhdGlvbiAoZGlwLCB0aGlzZGllLCBlbmRkaWUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBkaWVpbmZvICpkaXA7CisgICAgIGNoYXIgKnRoaXNkaWU7CisgICAgIGNoYXIgKmVuZGRpZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlOworICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIAorICB0eXBlID0gZW51bV90eXBlIChkaXAsIG9iamZpbGUpOworICBzeW0gPSBuZXdfc3ltYm9sIChkaXAsIG9iamZpbGUpOworICBpZiAoc3ltICE9IE5VTEwpCisgICAgeworICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSB0eXBlOworICAgICAgaWYgKGN1X2xhbmd1YWdlID09IGxhbmd1YWdlX2NwbHVzKQorCXsKKwkgIHN5bnRoZXNpemVfdHlwZWRlZiAoZGlwLCBvYmpmaWxlLCB0eXBlKTsKKwl9CisgICAgfQorfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJZW51bV90eXBlIC0tIGRlY29kZSBhbmQgcmV0dXJuIGEgdHlwZSBmb3IgYW4gZW51bWVyYXRpb24KKworU1lOT1BTSVMKKworCXN0YXRpYyB0eXBlICplbnVtX3R5cGUgKHN0cnVjdCBkaWVpbmZvICpkaXAsIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlKQorCitERVNDUklQVElPTgorCisJR2l2ZW4gYSBwb2ludGVyIHRvIGEgZGllIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGRpZSB3aGljaAorCXN0YXJ0cyBhbiBlbnVtZXJhdGlvbiwgcHJvY2VzcyBhbGwgdGhlIGRpZXMgdGhhdCBkZWZpbmUgdGhlIG1lbWJlcnMKKwlvZiB0aGUgZW51bWVyYXRpb24gYW5kIHJldHVybiBhIHR5cGUgcG9pbnRlciBmb3IgdGhlIGVudW1lcmF0aW9uLgorCisJQXQgdGhlIHNhbWUgdGltZSwgZm9yIGVhY2ggbWVtYmVyIG9mIHRoZSBlbnVtZXJhdGlvbiwgY3JlYXRlIGEKKwlzeW1ib2wgZm9yIGl0IHdpdGggbmFtZXNwYWNlIFZBUl9OQU1FU1BBQ0UgYW5kIGNsYXNzIExPQ19DT05TVCwKKwlhbmQgZ2l2ZSBpdCB0aGUgdHlwZSBvZiB0aGUgZW51bWVyYXRpb24gaXRzZWxmLgorCitOT1RFUworCisJTm90ZSB0aGF0IHRoZSBEV0FSRiBzcGVjaWZpY2F0aW9uIGV4cGxpY2l0bHkgbWFuZGF0ZXMgdGhhdCBlbnVtCisJY29uc3RhbnRzIG9jY3VyIGluIHJldmVyc2Ugb3JkZXIgZnJvbSB0aGUgc291cmNlIHByb2dyYW0gb3JkZXIsCisJZm9yICJjb25zaXN0ZW5jeSIgYW5kIGJlY2F1c2UgdGhpcyBvcmRlcmluZyBpcyBlYXNpZXIgZm9yIG1hbnkKKwljb21waWxlcnMgdG8gZ2VuZXJhdGUuIChEcmFmdCA2LCBzZWMgMy44LjUsIEVudW1lcmF0aW9uIHR5cGUKKwlFbnRyaWVzKS4gIEJlY2F1c2UgZ2RiIHdhbnRzIHRvIHNlZSB0aGUgZW51bSBtZW1iZXJzIGluIHByb2dyYW0KKwlzb3VyY2Ugb3JkZXIsIHdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgdGhlIG9yZGVyIGdldHMgcmV2ZXJzZWQgd2hpbGUKKwl3ZSBhcmUgcHJvY2Vzc2luZyB0aGVtLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitlbnVtX3R5cGUgKGRpcCwgb2JqZmlsZSkKKyAgICAgc3RydWN0IGRpZWluZm8gKmRpcDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlOworICBzdHJ1Y3QgbmV4dGZpZWxkIHsKKyAgICBzdHJ1Y3QgbmV4dGZpZWxkICpuZXh0OworICAgIHN0cnVjdCBmaWVsZCBmaWVsZDsKKyAgfTsKKyAgc3RydWN0IG5leHRmaWVsZCAqbGlzdCA9IE5VTEw7CisgIHN0cnVjdCBuZXh0ZmllbGQgKm5ldzsKKyAgaW50IG5maWVsZHMgPSAwOworICBpbnQgbjsKKyAgY2hhciAqc2NhbjsKKyAgY2hhciAqbGlzdGVuZDsKKyAgdW5zaWduZWQgc2hvcnQgYmxvY2tzejsKKyAgc3RydWN0IHN5bWJvbCAqc3ltOworICBpbnQgbmJ5dGVzOworICBpbnQgdW5zaWduZWRfZW51bSA9IDE7CisgIAorICBpZiAoKHR5cGUgPSBsb29rdXBfdXR5cGUgKGRpcCAtPiBkaWVfcmVmKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBObyBmb3J3YXJkIHJlZmVyZW5jZXMgY3JlYXRlZCBhbiBlbXB0eSB0eXBlLCBzbyBpbnN0YWxsIG9uZSBub3cgKi8KKyAgICAgIHR5cGUgPSBhbGxvY191dHlwZSAoZGlwIC0+IGRpZV9yZWYsIE5VTEwpOworICAgIH0KKyAgVFlQRV9DT0RFICh0eXBlKSA9IFRZUEVfQ09ERV9FTlVNOworICAvKiBTb21lIGNvbXBpbGVycyB0cnkgdG8gYmUgaGVscGZ1bCBieSBpbnZlbnRpbmcgImZha2UiIG5hbWVzIGZvcgorICAgICBhbm9ueW1vdXMgZW51bXMsIHN0cnVjdHVyZXMsIGFuZCB1bmlvbnMsIGxpa2UgIn4wZmFrZSIgb3IgIi4wZmFrZSIuCisgICAgIFRoYW5rcywgYnV0IG5vIHRoYW5rcy4uLiAqLworICBpZiAoZGlwIC0+IGF0X25hbWUgIT0gTlVMTAorICAgICAgJiYgKmRpcCAtPiBhdF9uYW1lICE9ICd+JworICAgICAgJiYgKmRpcCAtPiBhdF9uYW1lICE9ICcuJykKKyAgICB7CisgICAgICBUWVBFX1RBR19OQU1FICh0eXBlKSA9IG9iY29uY2F0ICgmb2JqZmlsZSAtPiB0eXBlX29ic3RhY2ssCisJCQkJICAgICAgICIiLCAiIiwgZGlwIC0+IGF0X25hbWUpOworICAgIH0KKyAgaWYgKGRpcCAtPiBhdF9ieXRlX3NpemUgIT0gMCkKKyAgICB7CisgICAgICBUWVBFX0xFTkdUSCAodHlwZSkgPSBkaXAgLT4gYXRfYnl0ZV9zaXplOworICAgIH0KKyAgaWYgKChzY2FuID0gZGlwIC0+IGF0X2VsZW1lbnRfbGlzdCkgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZGlwIC0+IHNob3J0X2VsZW1lbnRfbGlzdCkKKwl7CisJICBuYnl0ZXMgPSBhdHRyaWJ1dGVfc2l6ZSAoQVRfc2hvcnRfZWxlbWVudF9saXN0KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbmJ5dGVzID0gYXR0cmlidXRlX3NpemUgKEFUX2VsZW1lbnRfbGlzdCk7CisJfQorICAgICAgYmxvY2tzeiA9IHRhcmdldF90b19ob3N0IChzY2FuLCBuYnl0ZXMsIEdFVF9VTlNJR05FRCwgb2JqZmlsZSk7CisgICAgICBsaXN0ZW5kID0gc2NhbiArIG5ieXRlcyArIGJsb2Nrc3o7CisgICAgICBzY2FuICs9IG5ieXRlczsKKyAgICAgIHdoaWxlIChzY2FuIDwgbGlzdGVuZCkKKwl7CisJICBuZXcgPSAoc3RydWN0IG5leHRmaWVsZCAqKSBhbGxvY2EgKHNpemVvZiAoc3RydWN0IG5leHRmaWVsZCkpOworCSAgbmV3IC0+IG5leHQgPSBsaXN0OworCSAgbGlzdCA9IG5ldzsKKwkgIEZJRUxEX1RZUEUgKGxpc3QtPmZpZWxkKSA9IE5VTEw7CisJICBGSUVMRF9CSVRTSVpFIChsaXN0LT5maWVsZCkgPSAwOworCSAgRklFTERfQklUUE9TIChsaXN0LT5maWVsZCkgPQorCSAgICB0YXJnZXRfdG9faG9zdCAoc2NhbiwgVEFSR0VUX0ZUX0xPTkdfU0laRSAob2JqZmlsZSksIEdFVF9TSUdORUQsCisJCQkgICAgb2JqZmlsZSk7CisJICBzY2FuICs9IFRBUkdFVF9GVF9MT05HX1NJWkUgKG9iamZpbGUpOworCSAgbGlzdCAtPiBmaWVsZC5uYW1lID0gb2JzYXZlc3RyaW5nIChzY2FuLCBzdHJsZW4gKHNjYW4pLAorCQkJCQkgICAgICZvYmpmaWxlIC0+IHR5cGVfb2JzdGFjayk7CisJICBzY2FuICs9IHN0cmxlbiAoc2NhbikgKyAxOworCSAgbmZpZWxkcysrOworCSAgLyogSGFuZGNyYWZ0IGEgbmV3IHN5bWJvbCBmb3IgdGhpcyBlbnVtIG1lbWJlci4gKi8KKwkgIHN5bSA9IChzdHJ1Y3Qgc3ltYm9sICopIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywKKwkJCQkJCSBzaXplb2YgKHN0cnVjdCBzeW1ib2wpKTsKKwkgIG1lbXNldCAoc3ltLCAwLCBzaXplb2YgKHN0cnVjdCBzeW1ib2wpKTsKKwkgIFNZTUJPTF9OQU1FIChzeW0pID0gY3JlYXRlX25hbWUgKGxpc3QgLT4gZmllbGQubmFtZSwKKwkJCQkJICAgJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrKTsKKwkgIFNZTUJPTF9JTklUX0xBTkdVQUdFX1NQRUNJRklDIChzeW0sIGN1X2xhbmd1YWdlKTsKKwkgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworCSAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0NPTlNUOworCSAgU1lNQk9MX1RZUEUgKHN5bSkgPSB0eXBlOworCSAgU1lNQk9MX1ZBTFVFIChzeW0pID0gRklFTERfQklUUE9TIChsaXN0LT5maWVsZCk7CisJICBpZiAoU1lNQk9MX1ZBTFVFIChzeW0pIDwgMCkKKwkgICAgdW5zaWduZWRfZW51bSA9IDA7CisJICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgbGlzdF9pbl9zY29wZSk7CisJfQorICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdmVjdG9yIG9mIGZpZWxkcywgYW5kIHJlY29yZCBob3cgYmlnIGl0IGlzLiBUaGlzIGlzCisJIHdoZXJlIHdlIHJldmVyc2UgdGhlIG9yZGVyLCBieSBwdWxsaW5nIHRoZSBtZW1iZXJzIG9mZiB0aGUgbGlzdCBpbgorCSByZXZlcnNlIG9yZGVyIGZyb20gaG93IHRoZXkgd2VyZSBpbnNlcnRlZC4gIElmIHdlIGhhdmUgbm8gZmllbGRzCisJICh0aGlzIGlzIGFwcGFyZW50bHkgcG9zc2libGUgaW4gQysrKSB0aGVuIHNraXAgYnVpbGRpbmcgYSBmaWVsZAorCSB2ZWN0b3IuICovCisgICAgICBpZiAobmZpZWxkcyA+IDApCisJeworCSAgaWYgKHVuc2lnbmVkX2VudW0pCisJICAgIFRZUEVfRkxBR1MgKHR5cGUpIHw9IFRZUEVfRkxBR19VTlNJR05FRDsKKwkgIFRZUEVfTkZJRUxEUyAodHlwZSkgPSBuZmllbGRzOworCSAgVFlQRV9GSUVMRFMgKHR5cGUpID0gKHN0cnVjdCBmaWVsZCAqKQorCSAgICBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssIHNpemVvZiAoc3RydWN0IGZpZWxkKSAqIG5maWVsZHMpOworCSAgLyogQ29weSB0aGUgc2F2ZWQtdXAgZmllbGRzIGludG8gdGhlIGZpZWxkIHZlY3Rvci4gICovCisJICBmb3IgKG4gPSAwOyAobiA8IG5maWVsZHMpICYmIChsaXN0ICE9IE5VTEwpOyBsaXN0ID0gbGlzdCAtPiBuZXh0KQorCSAgICB7CisJICAgICAgVFlQRV9GSUVMRCAodHlwZSwgbisrKSA9IGxpc3QgLT4gZmllbGQ7CisJICAgIH0JCisJfQorICAgIH0KKyAgcmV0dXJuICh0eXBlKTsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCXJlYWRfZnVuY19zY29wZSAtLSBwcm9jZXNzIGFsbCBkaWVzIHdpdGhpbiBhIGZ1bmN0aW9uIHNjb3BlCisKK0RFU0NSSVBUSU9OCisKKwlQcm9jZXNzIGFsbCBkaWVzIHdpdGhpbiBhIGdpdmVuIGZ1bmN0aW9uIHNjb3BlLiAgV2UgYXJlIHBhc3NlZAorCWEgZGllIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBwb2ludGVyIERJUCBmb3IgdGhlIGRpZSB3aGljaAorCXN0YXJ0cyB0aGUgZnVuY3Rpb24gc2NvcGUsIGFuZCBwb2ludGVycyBpbnRvIHRoZSByYXcgZGllIGRhdGEKKwl0aGF0IGRlZmluZSB0aGUgZGllcyB3aXRoaW4gdGhlIGZ1bmN0aW9uIHNjb3BlLgorCisJRm9yIG5vdywgd2UgaWdub3JlIGxleGljYWwgYmxvY2sgc2NvcGVzIHdpdGhpbiB0aGUgZnVuY3Rpb24uCisJVGhlIHByb2JsZW0gaXMgdGhhdCBBVCZUIGNjIGRvZXMgbm90IGRlZmluZSBhIERXQVJGIGxleGljYWwKKwlibG9jayBzY29wZSBmb3IgdGhlIGZ1bmN0aW9uIGl0c2VsZiwgd2hpbGUgZ2NjIGRlZmluZXMgYQorCWxleGljYWwgYmxvY2sgc2NvcGUgZm9yIHRoZSBmdW5jdGlvbi4gIFdlIG5lZWQgdG8gdGhpbmsgYWJvdXQKKwlob3cgdG8gaGFuZGxlIHRoaXMgZGlmZmVyZW5jZSwgb3IgaWYgaXQgaXMgZXZlbiBhIHByb2JsZW0uCisJKEZJWE1FKQorICovCisKK3N0YXRpYyB2b2lkCityZWFkX2Z1bmNfc2NvcGUgKGRpcCwgdGhpc2RpZSwgZW5kZGllLCBvYmpmaWxlKQorICAgICBzdHJ1Y3QgZGllaW5mbyAqZGlwOworICAgICBjaGFyICp0aGlzZGllOworICAgICBjaGFyICplbmRkaWU7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICByZWdpc3RlciBzdHJ1Y3QgY29udGV4dF9zdGFjayAqbmV3OworICAKKyAgLyogQVRfbmFtZSBpcyBhYnNlbnQgaWYgdGhlIGZ1bmN0aW9uIGlzIGRlc2NyaWJlZCB3aXRoIGFuCisgICAgIEFUX2Fic3RyYWN0X29yaWdpbiB0YWcuCisgICAgIElnbm9yZSB0aGUgZnVuY3Rpb24gZGVzY3JpcHRpb24gZm9yIG5vdyB0byBhdm9pZCBHREIgY29yZSBkdW1wcy4KKyAgICAgRklYTUU6IEFkZCBjb2RlIHRvIGhhbmRsZSBBVF9hYnN0cmFjdF9vcmlnaW4gdGFncyBwcm9wZXJseS4gICovCisgIGlmIChkaXAgLT4gYXRfbmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGNvbXBsYWluICgmbWlzc2luZ19hdF9uYW1lLCBESUVfSUQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAob2JqZmlsZSAtPiBlaS5lbnRyeV9wb2ludCA+PSBkaXAgLT4gYXRfbG93X3BjICYmCisgICAgICBvYmpmaWxlIC0+IGVpLmVudHJ5X3BvaW50IDwgIGRpcCAtPiBhdF9oaWdoX3BjKQorICAgIHsKKyAgICAgIG9iamZpbGUgLT4gZWkuZW50cnlfZnVuY19sb3dwYyA9IGRpcCAtPiBhdF9sb3dfcGM7CisgICAgICBvYmpmaWxlIC0+IGVpLmVudHJ5X2Z1bmNfaGlnaHBjID0gZGlwIC0+IGF0X2hpZ2hfcGM7CisgICAgfQorICBpZiAoU1RSRVEgKGRpcCAtPiBhdF9uYW1lLCAibWFpbiIpKQkvKiBGSVhNRTogaGFyZHdpcmVkIG5hbWUgKi8KKyAgICB7CisgICAgICBvYmpmaWxlIC0+IGVpLm1haW5fZnVuY19sb3dwYyA9IGRpcCAtPiBhdF9sb3dfcGM7CisgICAgICBvYmpmaWxlIC0+IGVpLm1haW5fZnVuY19oaWdocGMgPSBkaXAgLT4gYXRfaGlnaF9wYzsKKyAgICB9CisgIG5ldyA9IHB1c2hfY29udGV4dCAoMCwgZGlwIC0+IGF0X2xvd19wYyk7CisgIG5ldyAtPiBuYW1lID0gbmV3X3N5bWJvbCAoZGlwLCBvYmpmaWxlKTsKKyAgbGlzdF9pbl9zY29wZSA9ICZsb2NhbF9zeW1ib2xzOworICBwcm9jZXNzX2RpZXMgKHRoaXNkaWUgKyBkaXAgLT4gZGllX2xlbmd0aCwgZW5kZGllLCBvYmpmaWxlKTsKKyAgbmV3ID0gcG9wX2NvbnRleHQgKCk7CisgIC8qIE1ha2UgYSBibG9jayBmb3IgdGhlIGxvY2FsIHN5bWJvbHMgd2l0aGluLiAgKi8KKyAgZmluaXNoX2Jsb2NrIChuZXcgLT4gbmFtZSwgJmxvY2FsX3N5bWJvbHMsIG5ldyAtPiBvbGRfYmxvY2tzLAorCQluZXcgLT4gc3RhcnRfYWRkciwgZGlwIC0+IGF0X2hpZ2hfcGMsIG9iamZpbGUpOworICBsaXN0X2luX3Njb3BlID0gJmZpbGVfc3ltYm9sczsKK30KKworCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJaGFuZGxlX3Byb2R1Y2VyIC0tIHByb2Nlc3MgdGhlIEFUX3Byb2R1Y2VyIGF0dHJpYnV0ZQorCitERVNDUklQVElPTgorCisJUGVyZm9ybSBhbnkgb3BlcmF0aW9ucyB0aGF0IGRlcGVuZCBvbiBmaW5kaW5nIGEgcGFydGljdWxhcgorCUFUX3Byb2R1Y2VyIGF0dHJpYnV0ZS4KKworICovCisKK3N0YXRpYyB2b2lkCitoYW5kbGVfcHJvZHVjZXIgKHByb2R1Y2VyKQorICAgICBjaGFyICpwcm9kdWNlcjsKK3sKKworICAvKiBJZiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgd2FzIGNvbXBpbGVkIHdpdGggZysrIG9yIGdjYywgdGhlbiBzZXQgdGhlCisgICAgIHByb2Nlc3NpbmdfZ2NjX2NvbXBpbGF0aW9uIGZsYWcuICovCisKKyAgaWYgKFNUUkVRTiAocHJvZHVjZXIsIEdDQ19QUk9EVUNFUiwgc3RybGVuIChHQ0NfUFJPRFVDRVIpKSkKKyAgICB7CisgICAgICBjaGFyIHZlcnNpb24gPSBwcm9kdWNlcltzdHJsZW4gKEdDQ19QUk9EVUNFUildOworICAgICAgcHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24gPSAodmVyc2lvbiA9PSAnMicgPyAyIDogMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24gPQorCVNUUkVRTiAocHJvZHVjZXIsIEdQTFVTX1BST0RVQ0VSLCBzdHJsZW4gKEdQTFVTX1BST0RVQ0VSKSkKKwl8fCBTVFJFUU4gKHByb2R1Y2VyLCBDSElMTF9QUk9EVUNFUiwgc3RybGVuIChDSElMTF9QUk9EVUNFUikpOworICAgIH0KKworICAvKiBTZWxlY3QgYSBkZW1hbmdsaW5nIHN0eWxlIGlmIHdlIGNhbiBpZGVudGlmeSB0aGUgcHJvZHVjZXIgYW5kIGlmCisgICAgIHRoZSBjdXJyZW50IHN0eWxlIGlzIGF1dG8uICBXZSBsZWF2ZSB0aGUgY3VycmVudCBzdHlsZSBhbG9uZSBpZiBpdAorICAgICBpcyBub3QgYXV0by4gIFdlIGFsc28gbGVhdmUgdGhlIGRlbWFuZ2xpbmcgc3R5bGUgYWxvbmUgaWYgd2UgZmluZCBhCisgICAgIGdjYyAoY2MxKSBwcm9kdWNlciwgYXMgb3Bwb3NlZCB0byBhIGcrKyAoY2MxcGx1cykgcHJvZHVjZXIuICovCisKKyAgaWYgKEFVVE9fREVNQU5HTElORykKKyAgICB7CisgICAgICBpZiAoU1RSRVFOIChwcm9kdWNlciwgR1BMVVNfUFJPRFVDRVIsIHN0cmxlbiAoR1BMVVNfUFJPRFVDRVIpKSkKKwl7CisJICBzZXRfZGVtYW5nbGluZ19zdHlsZSAoR05VX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HKTsKKwl9CisgICAgICBlbHNlIGlmIChTVFJFUU4gKHByb2R1Y2VyLCBMQ0NfUFJPRFVDRVIsIHN0cmxlbiAoTENDX1BST0RVQ0VSKSkpCisJeworCSAgc2V0X2RlbWFuZ2xpbmdfc3R5bGUgKExVQ0lEX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HKTsKKwl9CisgICAgfQorfQorCisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlyZWFkX2ZpbGVfc2NvcGUgLS0gcHJvY2VzcyBhbGwgZGllcyB3aXRoaW4gYSBmaWxlIHNjb3BlCisKK0RFU0NSSVBUSU9OCisKKwlQcm9jZXNzIGFsbCBkaWVzIHdpdGhpbiBhIGdpdmVuIGZpbGUgc2NvcGUuICBXZSBhcmUgcGFzc2VkIGEKKwlwb2ludGVyIHRvIHRoZSBkaWUgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgZGllIHdoaWNoCisJc3RhcnRzIHRoZSBmaWxlIHNjb3BlLCBhbmQgcG9pbnRlcnMgaW50byB0aGUgcmF3IGRpZSBkYXRhIHdoaWNoCisJbWFyayB0aGUgcmFuZ2Ugb2YgZGllcyB3aXRoaW4gdGhlIGZpbGUgc2NvcGUuCisKKwlXaGVuIHRoZSBwYXJ0aWFsIHN5bWJvbCB0YWJsZSBpcyBidWlsdCwgdGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgbGluZQorCW51bWJlciB0YWJsZSBmb3IgZWFjaCBjb21waWxhdGlvbiB1bml0IGlzIHNhdmVkIGluIHRoZSBwYXJ0aWFsIHN5bWJvbAorCXRhYmxlIGVudHJ5IGZvciB0aGF0IGNvbXBpbGF0aW9uIHVuaXQuICBBcyB0aGUgc3ltYm9scyBmb3IgZWFjaAorCWNvbXBpbGF0aW9uIHVuaXQgYXJlIHJlYWQsIHRoZSBsaW5lIG51bWJlciB0YWJsZSBpcyByZWFkIGludG8gbWVtb3J5CisJYW5kIHRoZSB2YXJpYWJsZSBsbmJhc2UgaXMgc2V0IHRvIHBvaW50IHRvIGl0LiAgVGh1cyBhbGwgd2UgaGF2ZSB0bworCWRvIGlzIHVzZSBsbmJhc2UgdG8gYWNjZXNzIHRoZSBsaW5lIG51bWJlciB0YWJsZSBmb3IgdGhlIGN1cnJlbnQKKwljb21waWxhdGlvbiB1bml0LgorICovCisKK3N0YXRpYyB2b2lkCityZWFkX2ZpbGVfc2NvcGUgKGRpcCwgdGhpc2RpZSwgZW5kZGllLCBvYmpmaWxlKQorICAgICBzdHJ1Y3QgZGllaW5mbyAqZGlwOworICAgICBjaGFyICp0aGlzZGllOworICAgICBjaGFyICplbmRkaWU7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBzdHJ1Y3QgY2xlYW51cCAqYmFja190bzsKKyAgc3RydWN0IHN5bXRhYiAqc3ltdGFiOworICAKKyAgaWYgKG9iamZpbGUgLT4gZWkuZW50cnlfcG9pbnQgPj0gZGlwIC0+IGF0X2xvd19wYyAmJgorICAgICAgb2JqZmlsZSAtPiBlaS5lbnRyeV9wb2ludCA8ICBkaXAgLT4gYXRfaGlnaF9wYykKKyAgICB7CisgICAgICBvYmpmaWxlIC0+IGVpLmVudHJ5X2ZpbGVfbG93cGMgPSBkaXAgLT4gYXRfbG93X3BjOworICAgICAgb2JqZmlsZSAtPiBlaS5lbnRyeV9maWxlX2hpZ2hwYyA9IGRpcCAtPiBhdF9oaWdoX3BjOworICAgIH0KKyAgc2V0X2N1X2xhbmd1YWdlIChkaXApOworICBpZiAoZGlwIC0+IGF0X3Byb2R1Y2VyICE9IE5VTEwpCisgICAgeworICAgICAgaGFuZGxlX3Byb2R1Y2VyIChkaXAgLT4gYXRfcHJvZHVjZXIpOworICAgIH0KKyAgbnVtdXR5cGVzID0gKGVuZGRpZSAtIHRoaXNkaWUpIC8gNDsKKyAgdXR5cGVzID0gKHN0cnVjdCB0eXBlICoqKSB4bWFsbG9jIChudW11dHlwZXMgKiBzaXplb2YgKHN0cnVjdCB0eXBlICopKTsKKyAgYmFja190byA9IG1ha2VfY2xlYW51cCAoZnJlZV91dHlwZXMsIE5VTEwpOworICBtZW1zZXQgKHV0eXBlcywgMCwgbnVtdXR5cGVzICogc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSk7CisgIG1lbXNldCAoZnR5cGVzLCAwLCBGVF9OVU1fTUVNQkVSUyAqIHNpemVvZiAoc3RydWN0IHR5cGUgKikpOworICBzdGFydF9zeW10YWIgKGRpcCAtPiBhdF9uYW1lLCBkaXAgLT4gYXRfY29tcF9kaXIsIGRpcCAtPiBhdF9sb3dfcGMpOworICByZWNvcmRfZGVidWdmb3JtYXQgKCJEV0FSRiAxIik7CisgIGRlY29kZV9saW5lX251bWJlcnMgKGxuYmFzZSk7CisgIHByb2Nlc3NfZGllcyAodGhpc2RpZSArIGRpcCAtPiBkaWVfbGVuZ3RoLCBlbmRkaWUsIG9iamZpbGUpOworCisgIHN5bXRhYiA9IGVuZF9zeW10YWIgKGRpcCAtPiBhdF9oaWdoX3BjLCBvYmpmaWxlLCAwKTsKKyAgaWYgKHN5bXRhYiAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN5bXRhYiAtPiBsYW5ndWFnZSA9IGN1X2xhbmd1YWdlOworICAgIH0gICAgICAKKyAgZG9fY2xlYW51cHMgKGJhY2tfdG8pOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJcHJvY2Vzc19kaWVzIC0tIHByb2Nlc3MgYSByYW5nZSBvZiBEV0FSRiBJbmZvcm1hdGlvbiBFbnRyaWVzCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgdm9pZCBwcm9jZXNzX2RpZXMgKGNoYXIgKnRoaXNkaWUsIGNoYXIgKmVuZGRpZSwKKwkJCQkgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlKQorCitERVNDUklQVElPTgorCisJUHJvY2VzcyBhbGwgRElFJ3MgaW4gYSBzcGVjaWZpZWQgcmFuZ2UuICBNYXkgYmUgKGFuZCBhbG1vc3QKKwljZXJ0YWlubHkgd2lsbCBiZSkgY2FsbGVkIHJlY3Vyc2l2ZWx5LgorICovCisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX2RpZXMgKHRoaXNkaWUsIGVuZGRpZSwgb2JqZmlsZSkKKyAgICAgY2hhciAqdGhpc2RpZTsKKyAgICAgY2hhciAqZW5kZGllOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgY2hhciAqbmV4dGRpZTsKKyAgc3RydWN0IGRpZWluZm8gZGk7CisgIAorICB3aGlsZSAodGhpc2RpZSA8IGVuZGRpZSkKKyAgICB7CisgICAgICBiYXNpY2RpZWluZm8gKCZkaSwgdGhpc2RpZSwgb2JqZmlsZSk7CisgICAgICBpZiAoZGkuZGllX2xlbmd0aCA8IFNJWkVPRl9ESUVfTEVOR1RIKQorCXsKKwkgIGJyZWFrOworCX0KKyAgICAgIGVsc2UgaWYgKGRpLmRpZV90YWcgPT0gVEFHX3BhZGRpbmcpCisJeworCSAgbmV4dGRpZSA9IHRoaXNkaWUgKyBkaS5kaWVfbGVuZ3RoOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjb21wbGV0ZWRpZWluZm8gKCZkaSwgb2JqZmlsZSk7CisJICBpZiAoZGkuYXRfc2libGluZyAhPSAwKQorCSAgICB7CisJICAgICAgbmV4dGRpZSA9IGRiYmFzZSArIGRpLmF0X3NpYmxpbmcgLSBkYnJvZmY7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG5leHRkaWUgPSB0aGlzZGllICsgZGkuZGllX2xlbmd0aDsKKwkgICAgfQorI2lmZGVmIFNNQVNIX1RFWFRfQUREUkVTUworCSAgLyogSSB0aGluayB0aGF0IHRoZXNlIGFyZSBhbHdheXMgdGV4dCwgbm90IGRhdGEsIGFkZHJlc3Nlcy4gICovCisJICBTTUFTSF9URVhUX0FERFJFU1MgKGRpLmF0X2xvd19wYyk7CisJICBTTUFTSF9URVhUX0FERFJFU1MgKGRpLmF0X2hpZ2hfcGMpOworI2VuZGlmCisJICBzd2l0Y2ggKGRpLmRpZV90YWcpCisJICAgIHsKKwkgICAgY2FzZSBUQUdfY29tcGlsZV91bml0OgorCSAgICAgIC8qIFNraXAgVGFnX2NvbXBpbGVfdW5pdCBpZiB3ZSBhcmUgYWxyZWFkeSBpbnNpZGUgYSBjb21waWxhdGlvbgorCQkgdW5pdCwgd2UgYXJlIHVuYWJsZSB0byBoYW5kbGUgbmVzdGVkIGNvbXBpbGF0aW9uIHVuaXRzCisJCSBwcm9wZXJseSAoRklYTUUpLiAgKi8KKwkgICAgICBpZiAoY3VycmVudF9zdWJmaWxlID09IE5VTEwpCisJCXJlYWRfZmlsZV9zY29wZSAoJmRpLCB0aGlzZGllLCBuZXh0ZGllLCBvYmpmaWxlKTsKKwkgICAgICBlbHNlCisJCW5leHRkaWUgPSB0aGlzZGllICsgZGkuZGllX2xlbmd0aDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBUQUdfZ2xvYmFsX3N1YnJvdXRpbmU6CisJICAgIGNhc2UgVEFHX3N1YnJvdXRpbmU6CisJICAgICAgaWYgKGRpLmhhc19hdF9sb3dfcGMpCisJCXsKKwkJICByZWFkX2Z1bmNfc2NvcGUgKCZkaSwgdGhpc2RpZSwgbmV4dGRpZSwgb2JqZmlsZSk7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBUQUdfbGV4aWNhbF9ibG9jazoKKwkgICAgICByZWFkX2xleGljYWxfYmxvY2tfc2NvcGUgKCZkaSwgdGhpc2RpZSwgbmV4dGRpZSwgb2JqZmlsZSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgVEFHX2NsYXNzX3R5cGU6CisJICAgIGNhc2UgVEFHX3N0cnVjdHVyZV90eXBlOgorCSAgICBjYXNlIFRBR191bmlvbl90eXBlOgorCSAgICAgIHJlYWRfc3RydWN0dXJlX3Njb3BlICgmZGksIHRoaXNkaWUsIG5leHRkaWUsIG9iamZpbGUpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFRBR19lbnVtZXJhdGlvbl90eXBlOgorCSAgICAgIHJlYWRfZW51bWVyYXRpb24gKCZkaSwgdGhpc2RpZSwgbmV4dGRpZSwgb2JqZmlsZSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgVEFHX3N1YnJvdXRpbmVfdHlwZToKKwkgICAgICByZWFkX3N1YnJvdXRpbmVfdHlwZSAoJmRpLCB0aGlzZGllLCBuZXh0ZGllKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBUQUdfYXJyYXlfdHlwZToKKwkgICAgICBkd2FyZl9yZWFkX2FycmF5X3R5cGUgKCZkaSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgVEFHX3BvaW50ZXJfdHlwZToKKwkgICAgICByZWFkX3RhZ19wb2ludGVyX3R5cGUgKCZkaSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgVEFHX3N0cmluZ190eXBlOgorCSAgICAgIHJlYWRfdGFnX3N0cmluZ190eXBlICgmZGkpOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIG5ld19zeW1ib2wgKCZkaSwgb2JqZmlsZSk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgICB0aGlzZGllID0gbmV4dGRpZTsKKyAgICB9Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlkZWNvZGVfbGluZV9udW1iZXJzIC0tIGRlY29kZSBhIGxpbmUgbnVtYmVyIHRhYmxlIGZyYWdtZW50CisKK1NZTk9QU0lTCisKKwlzdGF0aWMgdm9pZCBkZWNvZGVfbGluZV9udW1iZXJzIChjaGFyICp0YmxzY2FuLCBjaGFyICp0YmxlbmQsCisJCWxvbmcgbGVuZ3RoLCBsb25nIGJhc2UsIGxvbmcgbGluZSwgbG9uZyBwYykKKworREVTQ1JJUFRJT04KKworCVRyYW5zbGF0ZSB0aGUgRFdBUkYgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gdG8gZ2RiIGZvcm0uCisKKwlUaGUgIi5saW5lIiBzZWN0aW9uIGNvbnRhaW5zIG9uZSBvciBtb3JlIGxpbmUgbnVtYmVyIHRhYmxlcywgb25lIGZvcgorCWVhY2ggIi5saW5lIiBzZWN0aW9uIGZyb20gdGhlIG9iamVjdHMgdGhhdCB3ZXJlIGxpbmtlZC4KKworCVRoZSBBVF9zdG10X2xpc3QgYXR0cmlidXRlIGZvciBlYWNoIFRBR19zb3VyY2VfZmlsZSBlbnRyeSBpbiB0aGUKKwkiLmRlYnVnIiBzZWN0aW9uIGNvbnRhaW5zIHRoZSBvZmZzZXQgaW50byB0aGUgIi5saW5lIiBzZWN0aW9uIGZvciB0aGUKKwlzdGFydCBvZiB0aGUgdGFibGUgZm9yIHRoYXQgZmlsZS4KKworCVRoZSB0YWJsZSBpdHNlbGYgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorCisJPHRhYmxlIGxlbmd0aD48YmFzZSBhZGRyZXNzPjxzb3VyY2Ugc3RhdGVtZW50IGVudHJ5PgorCTQgYnl0ZXMgICAgICAgNCBieXRlcyAgICAgICAxMCBieXRlcworCisJVGhlIHRhYmxlIGxlbmd0aCBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgdGFibGUsIGluY2x1ZGluZyB0aGUgNCBieXRlcworCWZvciB0aGUgbGVuZ3RoIGluZm9ybWF0aW9uLgorCisJVGhlIGJhc2UgYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gZ2VuZXJhdGVkCisJZm9yIHRoZSBzb3VyY2UgZmlsZS4KKworCUVhY2ggc291cmNlIHN0YXRlbWVudCBlbnRyeSBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisKKwk8bGluZSBudW1iZXI+PHN0YXRlbWVudCBwb3NpdGlvbj48YWRkcmVzcyBkZWx0YT4KKwk0IGJ5dGVzICAgICAgMiBieXRlcyAgICAgICAgICAgICA0IGJ5dGVzCisKKwlUaGUgbGluZSBudW1iZXIgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLCBzdGFydGluZyB3aXRoCisJbGluZSAxLgorCisJVGhlIHN0YXRlbWVudCBwb3NpdGlvbiBlaXRoZXIgLTEgKDB4RkZGRikgb3IgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzCisJZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0YXRlbWVudC4KKworCVRoZSBhZGRyZXNzIGRlbHRhIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGJhc2UgYWRkcmVzcyBhbmQKKwl0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBzdGF0ZW1lbnQuCisKKwlOb3RlIHRoYXQgd2UgbXVzdCBjb3B5IHRoZSBieXRlcyBmcm9tIHRoZSBwYWNrZWQgdGFibGUgdG8gb3VyIGxvY2FsCisJdmFyaWFibGVzIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHVzZSB0aGVtLCB0byBhdm9pZCBhbGlnbm1lbnQgcHJvYmxlbXMKKwlvbiBzb21lIG1hY2hpbmVzLCBwYXJ0aWN1bGFybHkgUklTQyBwcm9jZXNzb3JzLgorCitCVUdTCisKKwlEb2VzIGdkYiBleHBlY3QgdGhlIGxpbmUgbnVtYmVycyB0byBiZSBzb3J0ZWQ/ICBUaGV5IGFyZSBub3cgYnkKKwljaGFuY2UvbHVjaywgYnV0IGFyZSBub3QgcmVxdWlyZWQgdG8gYmUuICAoRklYTUUpCisKKwlUaGUgbGluZSB3aXRoIG51bWJlciAwIGlzIHVudXNlZCwgZ2RiIGFwcGFyZW50bHkgY2FuIGRpc2NvdmVyIHRoZQorCXNwYW4gb2YgdGhlIGxhc3QgbGluZSBzb21lIG90aGVyIHdheS4gSG93PyAgKEZJWE1FKQorICovCisKK3N0YXRpYyB2b2lkCitkZWNvZGVfbGluZV9udW1iZXJzIChsaW5ldGFibGUpCisgICAgIGNoYXIgKmxpbmV0YWJsZTsKK3sKKyAgY2hhciAqdGJsc2NhbjsKKyAgY2hhciAqdGJsZW5kOworICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgdW5zaWduZWQgbG9uZyBiYXNlOworICB1bnNpZ25lZCBsb25nIGxpbmU7CisgIHVuc2lnbmVkIGxvbmcgcGM7CisgIAorICBpZiAobGluZXRhYmxlICE9IE5VTEwpCisgICAgeworICAgICAgdGJsc2NhbiA9IHRibGVuZCA9IGxpbmV0YWJsZTsKKyAgICAgIGxlbmd0aCA9IHRhcmdldF90b19ob3N0ICh0YmxzY2FuLCBTSVpFT0ZfTElORVRCTF9MRU5HVEgsIEdFVF9VTlNJR05FRCwKKwkJCSAgICAgICBjdXJyZW50X29iamZpbGUpOworICAgICAgdGJsc2NhbiArPSBTSVpFT0ZfTElORVRCTF9MRU5HVEg7CisgICAgICB0YmxlbmQgKz0gbGVuZ3RoOworICAgICAgYmFzZSA9IHRhcmdldF90b19ob3N0ICh0YmxzY2FuLCBUQVJHRVRfRlRfUE9JTlRFUl9TSVpFIChvYmpmaWxlKSwKKwkJCSAgICAgR0VUX1VOU0lHTkVELCBjdXJyZW50X29iamZpbGUpOworICAgICAgdGJsc2NhbiArPSBUQVJHRVRfRlRfUE9JTlRFUl9TSVpFIChvYmpmaWxlKTsKKyAgICAgIGJhc2UgKz0gYmFzZWFkZHI7CisgICAgICB3aGlsZSAodGJsc2NhbiA8IHRibGVuZCkKKwl7CisJICBsaW5lID0gdGFyZ2V0X3RvX2hvc3QgKHRibHNjYW4sIFNJWkVPRl9MSU5FVEJMX0xJTkVOTywgR0VUX1VOU0lHTkVELAorCQkJCSBjdXJyZW50X29iamZpbGUpOworCSAgdGJsc2NhbiArPSBTSVpFT0ZfTElORVRCTF9MSU5FTk8gKyBTSVpFT0ZfTElORVRCTF9TVE1UOworCSAgcGMgPSB0YXJnZXRfdG9faG9zdCAodGJsc2NhbiwgU0laRU9GX0xJTkVUQkxfREVMVEEsIEdFVF9VTlNJR05FRCwKKwkJCSAgICAgICBjdXJyZW50X29iamZpbGUpOworCSAgdGJsc2NhbiArPSBTSVpFT0ZfTElORVRCTF9ERUxUQTsKKwkgIHBjICs9IGJhc2U7CisJICBpZiAobGluZSAhPSAwKQorCSAgICB7CisJICAgICAgcmVjb3JkX2xpbmUgKGN1cnJlbnRfc3ViZmlsZSwgbGluZSwgcGMpOworCSAgICB9CisJfQorICAgIH0KK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWxvY3ZhbCAtLSBjb21wdXRlIHRoZSB2YWx1ZSBvZiBhIGxvY2F0aW9uIGF0dHJpYnV0ZQorCitTWU5PUFNJUworCisJc3RhdGljIGludCBsb2N2YWwgKHN0cnVjdCBkaWVpbmZvICpkaXApCisKK0RFU0NSSVBUSU9OCisKKwlHaXZlbiBwb2ludGVyIHRvIGEgc3RyaW5nIG9mIGJ5dGVzIHRoYXQgZGVmaW5lIGEgbG9jYXRpb24sIGNvbXB1dGUKKwl0aGUgbG9jYXRpb24gYW5kIHJldHVybiB0aGUgdmFsdWUuCisJQSBsb2NhdGlvbiBkZXNjcmlwdGlvbiBjb250YWluaW5nIG5vIGF0b21zIGluZGljYXRlcyB0aGF0IHRoZQorCW9iamVjdCBpcyBvcHRpbWl6ZWQgb3V0LiBUaGUgb3B0aW1pemVkX291dCBmbGFnIGlzIHNldCBmb3IgdGhvc2UsCisJdGhlIHJldHVybiB2YWx1ZSBpcyBtZWFuaW5nbGVzcy4KKworCVdoZW4gY29tcHV0aW5nIHZhbHVlcyBpbnZvbHZpbmcgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGZyYW1lIHBvaW50ZXIsCisJdGhlIHZhbHVlIHplcm8gaXMgdXNlZCwgd2hpY2ggcmVzdWx0cyBpbiBhIHZhbHVlIHJlbGF0aXZlIHRvIHRoZSBmcmFtZQorCXBvaW50ZXIsIHJhdGhlciB0aGFuIHRoZSBhYnNvbHV0ZSB2YWx1ZS4gIFRoaXMgaXMgd2hhdCBHREIgd2FudHMKKwlhbnl3YXkuCisgICAgCisJV2hlbiB0aGUgcmVzdWx0IGlzIGEgcmVnaXN0ZXIgbnVtYmVyLCB0aGUgaXNyZWcgZmxhZyBpcyBzZXQsIG90aGVyd2lzZQorCWl0IGlzIGNsZWFyZWQuICBUaGlzIGlzIGEga2x1ZGdlIHVudGlsIHdlIGZpZ3VyZSBvdXQgYSBiZXR0ZXIKKwl3YXkgdG8gaGFuZGxlIHRoZSBwcm9ibGVtLiAgR2RiJ3MgZGVzaWduIGRvZXMgbm90IG1lc2ggd2VsbCB3aXRoIHRoZQorCURXQVJGIG5vdGlvbiBvZiBhIGxvY2F0aW9uIGNvbXB1dGluZyBpbnRlcnByZXRlciwgd2hpY2ggaXMgYSBzaGFtZQorCWJlY2F1c2UgdGhlIGZsZXhpYmlsaXR5IGdvZXMgdW51c2VkLgorCitOT1RFUworCisJTm90ZSB0aGF0IHN0YWNrWzBdIGlzIHVudXNlZCBleGNlcHQgYXMgYSBkZWZhdWx0IGVycm9yIHJldHVybi4KKwlOb3RlIHRoYXQgc3RhY2sgb3ZlcmZsb3cgaXMgbm90IHlldCBoYW5kbGVkLgorICovCisKK3N0YXRpYyBpbnQKK2xvY3ZhbCAoZGlwKQorICAgICBzdHJ1Y3QgZGllaW5mbyAqZGlwOworeworICB1bnNpZ25lZCBzaG9ydCBuYnl0ZXM7CisgIHVuc2lnbmVkIHNob3J0IGxvY3NpemU7CisgIGF1dG8gbG9uZyBzdGFja1s2NF07CisgIGludCBzdGFja2k7CisgIGNoYXIgKmxvYzsKKyAgY2hhciAqZW5kOworICBpbnQgbG9jX2F0b21fY29kZTsKKyAgaW50IGxvY192YWx1ZV9zaXplOworICAKKyAgbG9jID0gZGlwIC0+IGF0X2xvY2F0aW9uOworICBuYnl0ZXMgPSBhdHRyaWJ1dGVfc2l6ZSAoQVRfbG9jYXRpb24pOworICBsb2NzaXplID0gdGFyZ2V0X3RvX2hvc3QgKGxvYywgbmJ5dGVzLCBHRVRfVU5TSUdORUQsIGN1cnJlbnRfb2JqZmlsZSk7CisgIGxvYyArPSBuYnl0ZXM7CisgIGVuZCA9IGxvYyArIGxvY3NpemU7CisgIHN0YWNraSA9IDA7CisgIHN0YWNrW3N0YWNraV0gPSAwOworICBkaXAgLT4gaXNyZWcgPSAwOworICBkaXAgLT4gb2ZmcmVnID0gMDsKKyAgZGlwIC0+IG9wdGltaXplZF9vdXQgPSAxOworICBsb2NfdmFsdWVfc2l6ZSA9IFRBUkdFVF9GVF9MT05HX1NJWkUgKGN1cnJlbnRfb2JqZmlsZSk7CisgIHdoaWxlIChsb2MgPCBlbmQpCisgICAgeworICAgICAgZGlwIC0+IG9wdGltaXplZF9vdXQgPSAwOworICAgICAgbG9jX2F0b21fY29kZSA9IHRhcmdldF90b19ob3N0IChsb2MsIFNJWkVPRl9MT0NfQVRPTV9DT0RFLCBHRVRfVU5TSUdORUQsCisJCQkJICAgICAgY3VycmVudF9vYmpmaWxlKTsKKyAgICAgIGxvYyArPSBTSVpFT0ZfTE9DX0FUT01fQ09ERTsKKyAgICAgIHN3aXRjaCAobG9jX2F0b21fY29kZSkKKwl7CisJICBjYXNlIDA6CisJICAgIC8qIGVycm9yICovCisJICAgIGxvYyA9IGVuZDsKKwkgICAgYnJlYWs7CisJICBjYXNlIE9QX1JFRzoKKwkgICAgLyogcHVzaCByZWdpc3RlciAobnVtYmVyKSAqLworCSAgICBzdGFja1srK3N0YWNraV0KKwkgICAgICA9IERXQVJGX1JFR19UT19SRUdOVU0gKHRhcmdldF90b19ob3N0IChsb2MsIGxvY192YWx1ZV9zaXplLAorCQkJCQkJICAgICBHRVRfVU5TSUdORUQsCisJCQkJCQkgICAgIGN1cnJlbnRfb2JqZmlsZSkpOworCSAgICBsb2MgKz0gbG9jX3ZhbHVlX3NpemU7CisJICAgIGRpcCAtPiBpc3JlZyA9IDE7CisJICAgIGJyZWFrOworCSAgY2FzZSBPUF9CQVNFUkVHOgorCSAgICAvKiBwdXNoIHZhbHVlIG9mIHJlZ2lzdGVyIChudW1iZXIpICovCisJICAgIC8qIEFjdHVhbGx5LCB3ZSBjb21wdXRlIHRoZSB2YWx1ZSBhcyBpZiByZWdpc3RlciBoYXMgMCwgc28gdGhlCisJICAgICAgIHZhbHVlIGVuZHMgdXAgYmVpbmcgdGhlIG9mZnNldCBmcm9tIHRoYXQgcmVnaXN0ZXIuICAqLworCSAgICBkaXAgLT4gb2ZmcmVnID0gMTsKKwkgICAgZGlwIC0+IGJhc2VyZWcgPSB0YXJnZXRfdG9faG9zdCAobG9jLCBsb2NfdmFsdWVfc2l6ZSwgR0VUX1VOU0lHTkVELAorCQkJCQkgICAgIGN1cnJlbnRfb2JqZmlsZSk7CisJICAgIGxvYyArPSBsb2NfdmFsdWVfc2l6ZTsKKwkgICAgc3RhY2tbKytzdGFja2ldID0gMDsKKwkgICAgYnJlYWs7CisJICBjYXNlIE9QX0FERFI6CisJICAgIC8qIHB1c2ggYWRkcmVzcyAocmVsb2NhdGVkIGFkZHJlc3MpICovCisJICAgIHN0YWNrWysrc3RhY2tpXSA9IHRhcmdldF90b19ob3N0IChsb2MsIGxvY192YWx1ZV9zaXplLAorCQkJCQkgICAgICBHRVRfVU5TSUdORUQsIGN1cnJlbnRfb2JqZmlsZSk7CisJICAgIGxvYyArPSBsb2NfdmFsdWVfc2l6ZTsKKwkgICAgYnJlYWs7CisJICBjYXNlIE9QX0NPTlNUOgorCSAgICAvKiBwdXNoIGNvbnN0YW50IChudW1iZXIpICAgRklYTUU6IHNpZ25lZCBvciB1bnNpZ25lZCEgKi8KKwkgICAgc3RhY2tbKytzdGFja2ldID0gdGFyZ2V0X3RvX2hvc3QgKGxvYywgbG9jX3ZhbHVlX3NpemUsCisJCQkJCSAgICAgIEdFVF9TSUdORUQsIGN1cnJlbnRfb2JqZmlsZSk7CisJICAgIGxvYyArPSBsb2NfdmFsdWVfc2l6ZTsKKwkgICAgYnJlYWs7CisJICBjYXNlIE9QX0RFUkVGMjoKKwkgICAgLyogcG9wLCBkZXJlZiBhbmQgcHVzaCAyIGJ5dGVzIChhcyBhIGxvbmcpICovCisJICAgIGNvbXBsYWluICgmb3BfZGVyZWYyLCBESUVfSUQsIERJRV9OQU1FLCBzdGFja1tzdGFja2ldKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIE9QX0RFUkVGNDoJLyogcG9wLCBkZXJlZiBhbmQgcHVzaCA0IGJ5dGVzIChhcyBhIGxvbmcpICovCisJICAgIGNvbXBsYWluICgmb3BfZGVyZWY0LCBESUVfSUQsIERJRV9OQU1FLCBzdGFja1tzdGFja2ldKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIE9QX0FERDoJLyogcG9wIHRvcCAyIGl0ZW1zLCBhZGQsIHB1c2ggcmVzdWx0ICovCisJICAgIHN0YWNrW3N0YWNraSAtIDFdICs9IHN0YWNrW3N0YWNraV07CisJICAgIHN0YWNraS0tOworCSAgICBicmVhazsKKwl9CisgICAgfQorICByZXR1cm4gKHN0YWNrW3N0YWNraV0pOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJcmVhZF9vZmlsZV9zeW10YWIgLS0gYnVpbGQgYSBmdWxsIHN5bXRhYiBlbnRyeSBmcm9tIGNodW5rIG9mIERJRSdzCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgdm9pZCByZWFkX29maWxlX3N5bXRhYiAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3QpCisKK0RFU0NSSVBUSU9OCisKKwlXaGVuIGV4cGFuZGluZyBhIHBhcnRpYWwgc3ltYm9sIHRhYmxlIGVudHJ5IHRvIGEgZnVsbCBzeW1ib2wgdGFibGUKKwllbnRyeSwgdGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCB0byByZWFkIGluIHRoZSBzeW1ib2xzCisJZm9yIHRoZSBjb21waWxhdGlvbiB1bml0LiAgQSBwb2ludGVyIHRvIHRoZSBuZXdseSBjb25zdHJ1Y3RlZCBzeW10YWIsCisJd2hpY2ggaXMgbm93IHRoZSBuZXcgZmlyc3Qgb25lIG9uIHRoZSBvYmpmaWxlJ3Mgc3ltdGFiIGxpc3QsIGlzCisJc3Rhc2hlZCBpbiB0aGUgcGFydGlhbCBzeW1ib2wgdGFibGUgZW50cnkuCisgKi8KKworc3RhdGljIHZvaWQKK3JlYWRfb2ZpbGVfc3ltdGFiIChwc3QpCisgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN0OworeworICBzdHJ1Y3QgY2xlYW51cCAqYmFja190bzsKKyAgdW5zaWduZWQgbG9uZyBsbnNpemU7CisgIGZpbGVfcHRyIGZvZmZzZXQ7CisgIGJmZCAqYWJmZDsKKyAgY2hhciBsbnNpemVkYXRhW1NJWkVPRl9MSU5FVEJMX0xFTkdUSF07CisKKyAgYWJmZCA9IHBzdCAtPiBvYmpmaWxlIC0+IG9iZmQ7CisgIGN1cnJlbnRfb2JqZmlsZSA9IHBzdCAtPiBvYmpmaWxlOworCisgIC8qIEFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgZW50aXJlIGNodW5rIG9mIERJRSdzIGZvciB0aGlzIGNvbXBpbGF0aW9uCisgICAgIHVuaXQsIHNlZWsgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBmaWxlLCBhbmQgcmVhZCBpbiBhbGwgdGhlIERJRSdzLiAqLworCisgIGRpZWNvdW50ID0gMDsKKyAgZGJzaXplID0gREJMRU5HVEggKHBzdCk7CisgIGRiYmFzZSA9IHhtYWxsb2MgKGRic2l6ZSk7CisgIGRicm9mZiA9IERCUk9GRihwc3QpOworICBmb2Zmc2V0ID0gREJGT0ZGKHBzdCkgKyBkYnJvZmY7CisgIGJhc2Vfc2VjdGlvbl9vZmZzZXRzID0gcHN0LT5zZWN0aW9uX29mZnNldHM7CisgIGJhc2VhZGRyID0gQU5PRkZTRVQgKHBzdC0+c2VjdGlvbl9vZmZzZXRzLCAwKTsKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBmb2Zmc2V0LCBTRUVLX1NFVCkgfHwKKyAgICAgIChiZmRfcmVhZCAoZGJiYXNlLCBkYnNpemUsIDEsIGFiZmQpICE9IGRic2l6ZSkpCisgICAgeworICAgICAgZnJlZSAoZGJiYXNlKTsKKyAgICAgIGVycm9yICgiY2FuJ3QgcmVhZCBEV0FSRiBkYXRhIik7CisgICAgfQorICBiYWNrX3RvID0gbWFrZV9jbGVhbnVwIChmcmVlLCBkYmJhc2UpOworCisgIC8qIElmIHRoZXJlIGlzIGEgbGluZSBudW1iZXIgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tcGlsYXRpb24gdW5pdAorICAgICB0aGVuIHJlYWQgdGhlIHNpemUgb2YgdGhpcyBmcmFnbWVudCBpbiBieXRlcywgZnJvbSB0aGUgZnJhZ21lbnQgaXRzZWxmLgorICAgICBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIGZyYWdtZW50IGFuZCByZWFkIGl0IGluIGZvciBmdXR1cmUgCisgICAgIHByb2Nlc3NpbmcuICovCisKKyAgbG5iYXNlID0gTlVMTDsKKyAgaWYgKExORk9GRiAocHN0KSkKKyAgICB7CisgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIExORk9GRiAocHN0KSwgU0VFS19TRVQpIHx8CisJICAoYmZkX3JlYWQgKChQVFIpIGxuc2l6ZWRhdGEsIHNpemVvZiAobG5zaXplZGF0YSksIDEsIGFiZmQpICE9CisJICAgc2l6ZW9mIChsbnNpemVkYXRhKSkpCisJeworCSAgZXJyb3IgKCJjYW4ndCByZWFkIERXQVJGIGxpbmUgbnVtYmVyIHRhYmxlIHNpemUiKTsKKwl9CisgICAgICBsbnNpemUgPSB0YXJnZXRfdG9faG9zdCAobG5zaXplZGF0YSwgU0laRU9GX0xJTkVUQkxfTEVOR1RILAorCQkJICAgICAgIEdFVF9VTlNJR05FRCwgcHN0IC0+IG9iamZpbGUpOworICAgICAgbG5iYXNlID0geG1hbGxvYyAobG5zaXplKTsKKyAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgTE5GT0ZGIChwc3QpLCBTRUVLX1NFVCkgfHwKKwkgIChiZmRfcmVhZCAobG5iYXNlLCBsbnNpemUsIDEsIGFiZmQpICE9IGxuc2l6ZSkpCisJeworCSAgZnJlZSAobG5iYXNlKTsKKwkgIGVycm9yICgiY2FuJ3QgcmVhZCBEV0FSRiBsaW5lIG51bWJlcnMiKTsKKwl9CisgICAgICBtYWtlX2NsZWFudXAgKGZyZWUsIGxuYmFzZSk7CisgICAgfQorCisgIHByb2Nlc3NfZGllcyAoZGJiYXNlLCBkYmJhc2UgKyBkYnNpemUsIHBzdCAtPiBvYmpmaWxlKTsKKyAgZG9fY2xlYW51cHMgKGJhY2tfdG8pOworICBjdXJyZW50X29iamZpbGUgPSBOVUxMOworICBwc3QgLT4gc3ltdGFiID0gcHN0IC0+IG9iamZpbGUgLT4gc3ltdGFiczsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCXBzeW10YWJfdG9fc3ltdGFiXzEgLS0gZG8gZ3J1bnQgd29yayBmb3IgYnVpbGRpbmcgYSBmdWxsIHN5bXRhYiBlbnRyeQorCitTWU5PUFNJUworCisJc3RhdGljIHZvaWQgcHN5bXRhYl90b19zeW10YWJfMSAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3QpCisKK0RFU0NSSVBUSU9OCisKKwlDYWxsZWQgb25jZSBmb3IgZWFjaCBwYXJ0aWFsIHN5bWJvbCB0YWJsZSBlbnRyeSB0aGF0IG5lZWRzIHRvIGJlCisJZXhwYW5kZWQgaW50byBhIGZ1bGwgc3ltYm9sIHRhYmxlIGVudHJ5LgorCisqLworCitzdGF0aWMgdm9pZAorcHN5bXRhYl90b19zeW10YWJfMSAocHN0KQorICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdDsKK3sKKyAgaW50IGk7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisgIAorICBpZiAocHN0ICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHBzdC0+cmVhZGluKQorCXsKKwkgIHdhcm5pbmcgKCJwc3ltdGFiIGZvciAlcyBhbHJlYWR5IHJlYWQgaW4uICBTaG91bGRuJ3QgaGFwcGVuLiIsCisJCSAgIHBzdCAtPiBmaWxlbmFtZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFJlYWQgaW4gYWxsIHBhcnRpYWwgc3ltdGFicyBvbiB3aGljaCB0aGlzIG9uZSBpcyBkZXBlbmRlbnQgKi8KKwkgIGZvciAoaSA9IDA7IGkgPCBwc3QgLT4gbnVtYmVyX29mX2RlcGVuZGVuY2llczsgaSsrKQorCSAgICB7CisJICAgICAgaWYgKCFwc3QgLT4gZGVwZW5kZW5jaWVzW2ldIC0+IHJlYWRpbikKKwkJeworCQkgIC8qIEluZm9ybSBhYm91dCBhZGRpdGlvbmFsIGZpbGVzIHRoYXQgbmVlZCB0byBiZSByZWFkIGluLiAqLworCQkgIGlmIChpbmZvX3ZlcmJvc2UpCisJCSAgICB7CisJCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiICIsIGdkYl9zdGRvdXQpOworCQkgICAgICB3cmFwX2hlcmUgKCIiKTsKKwkJICAgICAgZnB1dHNfZmlsdGVyZWQgKCJhbmQgIiwgZ2RiX3N0ZG91dCk7CisJCSAgICAgIHdyYXBfaGVyZSAoIiIpOworCQkgICAgICBwcmludGZfZmlsdGVyZWQgKCIlcy4uLiIsCisJCQkJICAgICAgIHBzdCAtPiBkZXBlbmRlbmNpZXNbaV0gLT4gZmlsZW5hbWUpOworCQkgICAgICB3cmFwX2hlcmUgKCIiKTsKKwkJICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsJCS8qIEZsdXNoIG91dHB1dCAqLworCQkgICAgfQorCQkgIHBzeW10YWJfdG9fc3ltdGFiXzEgKHBzdCAtPiBkZXBlbmRlbmNpZXNbaV0pOworCQl9CisJICAgIH0JICAKKwkgIGlmIChEQkxFTkdUSCAocHN0KSkJCS8qIE90aGVyd2lzZSBpdCdzIGEgZHVtbXkgKi8KKwkgICAgeworCSAgICAgIGJ1aWxkc3ltX2luaXQgKCk7CisJICAgICAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxseV9mcmVlX3BlbmRpbmdzLCAwKTsKKwkgICAgICByZWFkX29maWxlX3N5bXRhYiAocHN0KTsKKwkgICAgICBpZiAoaW5mb192ZXJib3NlKQorCQl7CisJCSAgcHJpbnRmX2ZpbHRlcmVkICgiJWQgRElFJ3MsIHNvcnRpbmcuLi4iLCBkaWVjb3VudCk7CisJCSAgd3JhcF9oZXJlICgiIik7CisJCSAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwkJfQorCSAgICAgIHNvcnRfc3ltdGFiX3N5bXMgKHBzdCAtPiBzeW10YWIpOworCSAgICAgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworCSAgICB9CisJICBwc3QgLT4gcmVhZGluID0gMTsKKwl9CisgICAgfQorfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJZHdhcmZfcHN5bXRhYl90b19zeW10YWIgLS0gYnVpbGQgYSBmdWxsIHN5bXRhYiBlbnRyeSBmcm9tIHBhcnRpYWwgb25lCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgdm9pZCBkd2FyZl9wc3ltdGFiX3RvX3N5bXRhYiAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3QpCisKK0RFU0NSSVBUSU9OCisKKwlUaGlzIGlzIHRoZSBEV0FSRiBzdXBwb3J0IGVudHJ5IHBvaW50IGZvciBidWlsZGluZyBhIGZ1bGwgc3ltYm9sCisJdGFibGUgZW50cnkgZnJvbSBhIHBhcnRpYWwgc3ltYm9sIHRhYmxlIGVudHJ5LiAgV2UgYXJlIHBhc3NlZCBhCisJcG9pbnRlciB0byB0aGUgcGFydGlhbCBzeW1ib2wgdGFibGUgZW50cnkgdGhhdCBuZWVkcyB0byBiZSBleHBhbmRlZC4KKworKi8KKworc3RhdGljIHZvaWQKK2R3YXJmX3BzeW10YWJfdG9fc3ltdGFiIChwc3QpCisgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN0OworeworCisgIGlmIChwc3QgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAocHN0IC0+IHJlYWRpbikKKwl7CisJICB3YXJuaW5nICgicHN5bXRhYiBmb3IgJXMgYWxyZWFkeSByZWFkIGluLiAgU2hvdWxkbid0IGhhcHBlbi4iLAorCQkgICBwc3QgLT4gZmlsZW5hbWUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoREJMRU5HVEggKHBzdCkgfHwgcHN0IC0+IG51bWJlcl9vZl9kZXBlbmRlbmNpZXMpCisJICAgIHsKKwkgICAgICAvKiBQcmludCB0aGUgbWVzc2FnZSBub3csIGJlZm9yZSBzdGFydGluZyBzZXJpb3VzIHdvcmssIHRvIGF2b2lkCisJCSBkaXNjb25jZXJ0aW5nIHBhdXNlcy4gICovCisJICAgICAgaWYgKGluZm9fdmVyYm9zZSkKKwkJeworCQkgIHByaW50Zl9maWx0ZXJlZCAoIlJlYWRpbmcgaW4gc3ltYm9scyBmb3IgJXMuLi4iLAorCQkJCSAgIHBzdCAtPiBmaWxlbmFtZSk7CisJCSAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwkJfQorCSAgICAgIAorCSAgICAgIHBzeW10YWJfdG9fc3ltdGFiXzEgKHBzdCk7CisJICAgICAgCisjaWYgMAkgICAgICAvKiBGSVhNRTogIENoZWNrIHRvIHNlZSB3aGF0IGRieHJlYWQgaXMgZG9pbmcgaGVyZSBhbmQgc2VlIGlmCisJCSB3ZSBuZWVkIHRvIGRvIGFuIGVxdWl2YWxlbnQgb3IgaXMgdGhpcyBzb21ldGhpbmcgcGVjdWxpYXIgdG8KKwkJIHN0YWJzL2Eub3V0IGZvcm1hdC4KKwkJIE1hdGNoIHdpdGggZ2xvYmFsIHN5bWJvbHMuICBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBvbmNlLAorCQkgYWZ0ZXIgYWxsIG9mIHRoZSBzeW10YWJzIGFuZCBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIHJlYWQgaW4uCisJCSAqLworCSAgICAgIHNjYW5fZmlsZV9nbG9iYWxzIChwc3QgLT4gb2JqZmlsZSk7CisjZW5kaWYKKwkgICAgICAKKwkgICAgICAvKiBGaW5pc2ggdXAgdGhlIHZlcmJvc2UgaW5mbyBtZXNzYWdlLiAgKi8KKwkgICAgICBpZiAoaW5mb192ZXJib3NlKQorCQl7CisJCSAgcHJpbnRmX2ZpbHRlcmVkICgiZG9uZS5cbiIpOworCQkgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlhZGRfZW51bV9wc3ltYm9sIC0tIGFkZCBlbnVtZXJhdGlvbiBtZW1iZXJzIHRvIHBhcnRpYWwgc3ltYm9sIHRhYmxlCisKK0RFU0NSSVBUSU9OCisKKwlHaXZlbiBwb2ludGVyIHRvIGEgRElFIHRoYXQgaXMga25vd24gdG8gYmUgZm9yIGFuIGVudW1lcmF0aW9uLAorCWV4dHJhY3QgdGhlIHN5bWJvbGljIG5hbWVzIG9mIHRoZSBlbnVtZXJhdGlvbiBtZW1iZXJzIGFuZCBhZGQKKwlwYXJ0aWFsIHN5bWJvbHMgZm9yIHRoZW0uCisqLworCitzdGF0aWMgdm9pZAorYWRkX2VudW1fcHN5bWJvbCAoZGlwLCBvYmpmaWxlKQorICAgICBzdHJ1Y3QgZGllaW5mbyAqZGlwOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgY2hhciAqc2NhbjsKKyAgY2hhciAqbGlzdGVuZDsKKyAgdW5zaWduZWQgc2hvcnQgYmxvY2tzejsKKyAgaW50IG5ieXRlczsKKyAgCisgIGlmICgoc2NhbiA9IGRpcCAtPiBhdF9lbGVtZW50X2xpc3QpICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGRpcCAtPiBzaG9ydF9lbGVtZW50X2xpc3QpCisJeworCSAgbmJ5dGVzID0gYXR0cmlidXRlX3NpemUgKEFUX3Nob3J0X2VsZW1lbnRfbGlzdCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG5ieXRlcyA9IGF0dHJpYnV0ZV9zaXplIChBVF9lbGVtZW50X2xpc3QpOworCX0KKyAgICAgIGJsb2Nrc3ogPSB0YXJnZXRfdG9faG9zdCAoc2NhbiwgbmJ5dGVzLCBHRVRfVU5TSUdORUQsIG9iamZpbGUpOworICAgICAgc2NhbiArPSBuYnl0ZXM7CisgICAgICBsaXN0ZW5kID0gc2NhbiArIGJsb2Nrc3o7CisgICAgICB3aGlsZSAoc2NhbiA8IGxpc3RlbmQpCisJeworCSAgc2NhbiArPSBUQVJHRVRfRlRfTE9OR19TSVpFIChvYmpmaWxlKTsKKwkgIGFkZF9wc3ltYm9sX3RvX2xpc3QgKHNjYW4sIHN0cmxlbiAoc2NhbiksIFZBUl9OQU1FU1BBQ0UsIExPQ19DT05TVCwKKwkJCSAgICAgICAmb2JqZmlsZSAtPiBzdGF0aWNfcHN5bWJvbHMsIDAsIDAsIGN1X2xhbmd1YWdlLAorCQkJICAgICAgIG9iamZpbGUpOworCSAgc2NhbiArPSBzdHJsZW4gKHNjYW4pICsgMTsKKwl9CisgICAgfQorfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJYWRkX3BhcnRpYWxfc3ltYm9sIC0tIGFkZCBzeW1ib2wgdG8gcGFydGlhbCBzeW1ib2wgdGFibGUKKworREVTQ1JJUFRJT04KKworCUdpdmVuIGEgRElFLCBpZiBpdCBpcyBvbmUgb2YgdGhlIHR5cGVzIHRoYXQgd2Ugd2FudCB0bworCWFkZCB0byBhIHBhcnRpYWwgc3ltYm9sIHRhYmxlLCBmaW5pc2ggZmlsbGluZyBpbiB0aGUgZGllIGluZm8KKwlhbmQgdGhlbiBhZGQgYSBwYXJ0aWFsIHN5bWJvbCB0YWJsZSBlbnRyeSBmb3IgaXQuCisKK05PVEVTCisKKwlUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlIERJRSBoYXMgYSB2YWxpZCBuYW1lIGF0dHJpYnV0ZS4KKyovCisKK3N0YXRpYyB2b2lkCithZGRfcGFydGlhbF9zeW1ib2wgKGRpcCwgb2JqZmlsZSkKKyAgICAgc3RydWN0IGRpZWluZm8gKmRpcDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN3aXRjaCAoZGlwIC0+IGRpZV90YWcpCisgICAgeworICAgIGNhc2UgVEFHX2dsb2JhbF9zdWJyb3V0aW5lOgorICAgICAgYWRkX3BzeW1ib2xfdG9fbGlzdCAoZGlwIC0+IGF0X25hbWUsIHN0cmxlbiAoZGlwIC0+IGF0X25hbWUpLAorCQkJCVZBUl9OQU1FU1BBQ0UsIExPQ19CTE9DSywKKwkJCQkmb2JqZmlsZSAtPiBnbG9iYWxfcHN5bWJvbHMsCisJCQkJMCwgZGlwIC0+IGF0X2xvd19wYywgY3VfbGFuZ3VhZ2UsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQUdfZ2xvYmFsX3ZhcmlhYmxlOgorICAgICAgYWRkX3BzeW1ib2xfdG9fbGlzdCAoZGlwIC0+IGF0X25hbWUsIHN0cmxlbiAoZGlwIC0+IGF0X25hbWUpLAorCQkJICAgVkFSX05BTUVTUEFDRSwgTE9DX1NUQVRJQywKKwkJCSAgICZvYmpmaWxlIC0+IGdsb2JhbF9wc3ltYm9scywKKwkJCSAgIDAsIDAsIGN1X2xhbmd1YWdlLCBvYmpmaWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFHX3N1YnJvdXRpbmU6CisgICAgICBhZGRfcHN5bWJvbF90b19saXN0IChkaXAgLT4gYXRfbmFtZSwgc3RybGVuIChkaXAgLT4gYXRfbmFtZSksCisJCQkJVkFSX05BTUVTUEFDRSwgTE9DX0JMT0NLLAorCQkJCSZvYmpmaWxlIC0+IHN0YXRpY19wc3ltYm9scywKKwkJCQkwLCBkaXAgLT4gYXRfbG93X3BjLCBjdV9sYW5ndWFnZSwgb2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRBR19sb2NhbF92YXJpYWJsZToKKyAgICAgIGFkZF9wc3ltYm9sX3RvX2xpc3QgKGRpcCAtPiBhdF9uYW1lLCBzdHJsZW4gKGRpcCAtPiBhdF9uYW1lKSwKKwkJCSAgIFZBUl9OQU1FU1BBQ0UsIExPQ19TVEFUSUMsCisJCQkgICAmb2JqZmlsZSAtPiBzdGF0aWNfcHN5bWJvbHMsCisJCQkgICAwLCAwLCBjdV9sYW5ndWFnZSwgb2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRBR190eXBlZGVmOgorICAgICAgYWRkX3BzeW1ib2xfdG9fbGlzdCAoZGlwIC0+IGF0X25hbWUsIHN0cmxlbiAoZGlwIC0+IGF0X25hbWUpLAorCQkJICAgVkFSX05BTUVTUEFDRSwgTE9DX1RZUEVERUYsCisJCQkgICAmb2JqZmlsZSAtPiBzdGF0aWNfcHN5bWJvbHMsCisJCQkgICAwLCAwLCBjdV9sYW5ndWFnZSwgb2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRBR19jbGFzc190eXBlOgorICAgIGNhc2UgVEFHX3N0cnVjdHVyZV90eXBlOgorICAgIGNhc2UgVEFHX3VuaW9uX3R5cGU6CisgICAgY2FzZSBUQUdfZW51bWVyYXRpb25fdHlwZToKKyAgICAgIC8qIERvIG5vdCBhZGQgb3BhcXVlIGFnZ3JlZ2F0ZSBkZWZpbml0aW9ucyB0byB0aGUgcHN5bXRhYi4gICovCisgICAgICBpZiAoIWRpcCAtPiBoYXNfYXRfYnl0ZV9zaXplKQorCWJyZWFrOworICAgICAgYWRkX3BzeW1ib2xfdG9fbGlzdCAoZGlwIC0+IGF0X25hbWUsIHN0cmxlbiAoZGlwIC0+IGF0X25hbWUpLAorCQkJICAgU1RSVUNUX05BTUVTUEFDRSwgTE9DX1RZUEVERUYsCisJCQkgICAmb2JqZmlsZSAtPiBzdGF0aWNfcHN5bWJvbHMsCisJCQkgICAwLCAwLCBjdV9sYW5ndWFnZSwgb2JqZmlsZSk7CisgICAgICBpZiAoY3VfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfY3BsdXMpCisJeworCSAgLyogRm9yIEMrKywgdGhlc2UgaW1wbGljaXRseSBhY3QgYXMgdHlwZWRlZnMgYXMgd2VsbC4gKi8KKwkgIGFkZF9wc3ltYm9sX3RvX2xpc3QgKGRpcCAtPiBhdF9uYW1lLCBzdHJsZW4gKGRpcCAtPiBhdF9uYW1lKSwKKwkJCSAgICAgICBWQVJfTkFNRVNQQUNFLCBMT0NfVFlQRURFRiwKKwkJCSAgICAgICAmb2JqZmlsZSAtPiBzdGF0aWNfcHN5bWJvbHMsCisJCQkgICAgICAgMCwgMCwgY3VfbGFuZ3VhZ2UsIG9iamZpbGUpOworCX0KKyAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCXNjYW5fcGFydGlhbF9zeW1ib2xzIC0tIHNjYW4gRElFJ3Mgd2l0aGluIGEgc2luZ2xlIGNvbXBpbGF0aW9uIHVuaXQKKworREVTQ1JJUFRJT04KKworCVByb2Nlc3MgdGhlIERJRSdzIHdpdGhpbiBhIHNpbmdsZSBjb21waWxhdGlvbiB1bml0LCBsb29raW5nIGZvcgorCWludGVyZXN0aW5nIERJRSdzIHRoYXQgY29udHJpYnV0ZSB0byB0aGUgcGFydGlhbCBzeW1ib2wgdGFibGUgZW50cnkKKwlmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0LgorCitOT1RFUworCisJVGhlcmUgYXJlIHNvbWUgRElFJ3MgdGhhdCBtYXkgYXBwZWFyIGJvdGggYXQgZmlsZSBzY29wZSBhbmQgd2l0aGluCisJdGhlIHNjb3BlIG9mIGEgZnVuY3Rpb24uICBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBvbmVzIGF0IGZpbGUKKwlzY29wZSwgYW5kIHRoZSBvbmx5IHdheSB0byB0ZWxsIHRoZW0gYXBhcnQgaXMgdG8ga2VlcCB0cmFjayBvZiB0aGUKKwlzY29wZS4gIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgdGVzdCBjYXNlOgorCisJCXN0YXRpYyBpbnQgaTsKKwkJbWFpbiAoKSB7IGludCBqOyB9CisKKwlmb3Igd2hpY2ggdGhlIHJlbGV2YW50IERXQVJGIHNlZ21lbnQgaGFzIHRoZSBzdHJ1Y3R1cmU6CisJCisJCTB4NTE6CisJCTB4MjMgICBnbG9iYWwgc3VicnRuICAgc2libGluZyAgICAgMHg5YgorCQkgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgICAgICAgIG1haW4KKwkJICAgICAgICAgICAgICAgICAgICAgICBmdW5kX3R5cGUgICBGVF9pbnRlZ2VyCisJCSAgICAgICAgICAgICAgICAgICAgICAgbG93X3BjICAgICAgMHg4MDAwMDRjYworCQkgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hfcGMgICAgIDB4ODAwMDA0ZDQKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkweDc0OgorCQkweDIzICAgbG9jYWwgdmFyICAgICAgIHNpYmxpbmcgICAgIDB4OTcKKwkJICAgICAgICAgICAgICAgICAgICAgICBuYW1lICAgICAgICBqCisJCSAgICAgICAgICAgICAgICAgICAgICAgZnVuZF90eXBlICAgRlRfaW50ZWdlcgorCQkgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uICAgIE9QX0JBU0VSRUcgMHhlCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BfQ09OU1QgMHhmZmZmZmZmYworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QX0FERAorCQkweDk3OgorCQkweDQgICAgICAgICAKKwkJCisJCTB4OWI6CisJCTB4MWQgICBsb2NhbCB2YXIgICAgICAgc2libGluZyAgICAgMHhiOAorCQkgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgICAgICAgIGkKKwkJICAgICAgICAgICAgICAgICAgICAgICBmdW5kX3R5cGUgICBGVF9pbnRlZ2VyCisJCSAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gICAgT1BfQUREUiAweDgwMDAyNWRjCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJMHhiODoKKwkJMHg0ICAgICAgICAgCisKKwlXZSB3YW50IHRvIGluY2x1ZGUgdGhlIHN5bWJvbCAnaScgaW4gdGhlIHBhcnRpYWwgc3ltYm9sIHRhYmxlLCBidXQKKwlub3QgdGhlIHN5bWJvbCAnaicuICBJbiBlc3NlbmNlLCB3ZSB3YW50IHRvIHNraXAgYWxsIHRoZSBkaWVzIHdpdGhpbgorCXRoZSBzY29wZSBvZiBhIFRBR19nbG9iYWxfc3Vicm91dGluZSBESUUuCisKKwlEb24ndCBhdHRlbXB0IHRvIGFkZCBhbm9ueW1vdXMgc3RydWN0dXJlcyBvciB1bmlvbnMgc2luY2UgdGhleSBoYXZlCisJbm8gbmFtZS4gIEFub255bW91cyBlbnVtZXJhdGlvbnMgaG93ZXZlciBhcmUgcHJvY2Vzc2VkLCBiZWNhdXNlIHdlCisJd2FudCB0byBleHRyYWN0IHRoZWlyIG1lbWJlciBuYW1lcyAodGhlIGNoZWNrIGZvciBhIHRhZyBuYW1lIGlzCisJZG9uZSBsYXRlcikuCisKKwlBbHNvLCBmb3IgdmFyaWFibGVzIGFuZCBzdWJyb3V0aW5lcywgY2hlY2sgdGhhdCB0aGlzIGlzIHRoZSBwbGFjZQorCXdoZXJlIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvY2N1cnMsIHJhdGhlciB0aGFuIGp1c3QgYSByZWZlcmVuY2UKKwl0byBhbiBleHRlcm5hbC4KKyAqLworCitzdGF0aWMgdm9pZAorc2Nhbl9wYXJ0aWFsX3N5bWJvbHMgKHRoaXNkaWUsIGVuZGRpZSwgb2JqZmlsZSkKKyAgICAgY2hhciAqdGhpc2RpZTsKKyAgICAgY2hhciAqZW5kZGllOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgY2hhciAqbmV4dGRpZTsKKyAgY2hhciAqdGVtcDsKKyAgc3RydWN0IGRpZWluZm8gZGk7CisgIAorICB3aGlsZSAodGhpc2RpZSA8IGVuZGRpZSkKKyAgICB7CisgICAgICBiYXNpY2RpZWluZm8gKCZkaSwgdGhpc2RpZSwgb2JqZmlsZSk7CisgICAgICBpZiAoZGkuZGllX2xlbmd0aCA8IFNJWkVPRl9ESUVfTEVOR1RIKQorCXsKKwkgIGJyZWFrOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBuZXh0ZGllID0gdGhpc2RpZSArIGRpLmRpZV9sZW5ndGg7CisJICAvKiBUbyBhdm9pZCBnZXR0aW5nIGNvbXBsZXRlIGRpZSBpbmZvcm1hdGlvbiBmb3IgZXZlcnkgZGllLCB3ZQorCSAgICAgb25seSBkbyBpdCAoYmVsb3cpIGZvciB0aGUgY2FzZXMgd2UgYXJlIGludGVyZXN0ZWQgaW4uICovCisJICBzd2l0Y2ggKGRpLmRpZV90YWcpCisJICAgIHsKKwkgICAgY2FzZSBUQUdfZ2xvYmFsX3N1YnJvdXRpbmU6CisJICAgIGNhc2UgVEFHX3N1YnJvdXRpbmU6CisJICAgICAgY29tcGxldGVkaWVpbmZvICgmZGksIG9iamZpbGUpOworCSAgICAgIGlmIChkaS5hdF9uYW1lICYmIChkaS5oYXNfYXRfbG93X3BjIHx8IGRpLmF0X2xvY2F0aW9uKSkKKwkJeworCQkgIGFkZF9wYXJ0aWFsX3N5bWJvbCAoJmRpLCBvYmpmaWxlKTsKKwkJICAvKiBJZiB0aGVyZSBpcyBhIHNpYmxpbmcgYXR0cmlidXRlLCBhZGp1c3QgdGhlIG5leHRkaWUKKwkJICAgICBwb2ludGVyIHRvIHNraXAgdGhlIGVudGlyZSBzY29wZSBvZiB0aGUgc3Vicm91dGluZS4KKwkJICAgICBBcHBseSBzb21lIHNhbml0eSBjaGVja2luZyB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgCisJCSAgICAgb3ZlcnJ1biBvciB1bmRlcnJ1biB0aGUgcmFuZ2Ugb2YgcmVtYWluaW5nIERJRSdzICovCisJCSAgaWYgKGRpLmF0X3NpYmxpbmcgIT0gMCkKKwkJICAgIHsKKwkJICAgICAgdGVtcCA9IGRiYmFzZSArIGRpLmF0X3NpYmxpbmcgLSBkYnJvZmY7CisJCSAgICAgIGlmICgodGVtcCA8IHRoaXNkaWUpIHx8ICh0ZW1wID49IGVuZGRpZSkpCisJCQl7CisJCQkgIGNvbXBsYWluICgmYmFkX2RpZV9yZWYsIERJRV9JRCwgRElFX05BTUUsCisJCQkJICAgIGRpLmF0X3NpYmxpbmcpOworCQkJfQorCQkgICAgICBlbHNlCisJCQl7CisJCQkgIG5leHRkaWUgPSB0ZW1wOworCQkJfQorCQkgICAgfQorCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgVEFHX2dsb2JhbF92YXJpYWJsZToKKwkgICAgY2FzZSBUQUdfbG9jYWxfdmFyaWFibGU6CisJICAgICAgY29tcGxldGVkaWVpbmZvICgmZGksIG9iamZpbGUpOworCSAgICAgIGlmIChkaS5hdF9uYW1lICYmIChkaS5oYXNfYXRfbG93X3BjIHx8IGRpLmF0X2xvY2F0aW9uKSkKKwkJeworCQkgIGFkZF9wYXJ0aWFsX3N5bWJvbCAoJmRpLCBvYmpmaWxlKTsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFRBR190eXBlZGVmOgorCSAgICBjYXNlIFRBR19jbGFzc190eXBlOgorCSAgICBjYXNlIFRBR19zdHJ1Y3R1cmVfdHlwZToKKwkgICAgY2FzZSBUQUdfdW5pb25fdHlwZToKKwkgICAgICBjb21wbGV0ZWRpZWluZm8gKCZkaSwgb2JqZmlsZSk7CisJICAgICAgaWYgKGRpLmF0X25hbWUpCisJCXsKKwkJICBhZGRfcGFydGlhbF9zeW1ib2wgKCZkaSwgb2JqZmlsZSk7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBUQUdfZW51bWVyYXRpb25fdHlwZToKKwkgICAgICBjb21wbGV0ZWRpZWluZm8gKCZkaSwgb2JqZmlsZSk7CisJICAgICAgaWYgKGRpLmF0X25hbWUpCisJCXsKKwkJICBhZGRfcGFydGlhbF9zeW1ib2wgKCZkaSwgb2JqZmlsZSk7CisJCX0KKwkgICAgICBhZGRfZW51bV9wc3ltYm9sICgmZGksIG9iamZpbGUpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgdGhpc2RpZSA9IG5leHRkaWU7CisgICAgfQorfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJc2Nhbl9jb21waWxhdGlvbl91bml0cyAtLSBidWlsZCBhIHBzeW10YWIgZW50cnkgZm9yIGVhY2ggY29tcGlsYXRpb24KKworREVTQ1JJUFRJT04KKworCVRoaXMgaXMgdGhlIHRvcCBsZXZlbCBkd2FyZiBwYXJzaW5nIHJvdXRpbmUgZm9yIGJ1aWxkaW5nIHBhcnRpYWwKKwlzeW1ib2wgdGFibGVzLgorCisJSXQgc2NhbnMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBEV0FSRiB0YWJsZSBsb29raW5nIGZvciB0aGUgZmlyc3QKKwlUQUdfY29tcGlsZV91bml0IERJRSwgYW5kIHRoZW4gZm9sbG93cyB0aGUgc2libGluZyBjaGFpbiB0byBsb2NhdGUKKwllYWNoIGFkZGl0aW9uYWwgVEFHX2NvbXBpbGVfdW5pdCBESUUuCisgICAKKwlGb3IgZWFjaCBUQUdfY29tcGlsZV91bml0IERJRSBpdCBjcmVhdGVzIGEgcGFydGlhbCBzeW10YWIgc3RydWN0dXJlLAorCWNhbGxzIGEgc3Vib3JkaW5hdGUgcm91dGluZSB0byBjb2xsZWN0IGFsbCB0aGUgY29tcGlsYXRpb24gdW5pdCdzCisJZ2xvYmFsIERJRSdzLCBmaWxlIHNjb3BlIERJRXMsIHR5cGVkZWYgRElFcywgZXRjLCBhbmQgdGhlbiBsaW5rcyB0aGUKKwluZXcgcGFydGlhbCBzeW10YWIgc3RydWN0dXJlIGludG8gdGhlIHBhcnRpYWwgc3ltYm9sIHRhYmxlLiAgSXQgYWxzbworCXJlY29yZHMgdGhlIGFwcHJvcHJpYXRlIGluZm9ybWF0aW9uIGluIHRoZSBwYXJ0aWFsIHN5bWJvbCB0YWJsZSBlbnRyeQorCXRvIGFsbG93IHRoZSBjaHVuayBvZiBESUUncyBhbmQgbGluZSBudW1iZXIgdGFibGUgZm9yIHRoaXMgY29tcGlsYXRpb24KKwl1bml0IHRvIGJlIGxvY2F0ZWQgYW5kIHJlLXJlYWQgbGF0ZXIsIHRvIGdlbmVyYXRlIGEgY29tcGxldGUgc3ltYm9sCisJdGFibGUgZW50cnkgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0LgorCisJVGh1cyBpdCBlZmZlY3RpdmVseSBwYXJ0aXRpb25zIHVwIGEgY2h1bmsgb2YgRElFJ3MgZm9yIG11bHRpcGxlCisJY29tcGlsYXRpb24gdW5pdHMgaW50byBzbWFsbGVyIERJRSBjaHVua3MgYW5kIGxpbmUgbnVtYmVyIHRhYmxlcywKKwlhbmQgYXNzb2NpYXRlcyB0aGVtIHdpdGggYSBwYXJ0aWFsIHN5bWJvbCB0YWJsZSBlbnRyeS4KKworTk9URVMKKworCUlmIGFueSBjb21waWxhdGlvbiB1bml0IGhhcyBubyBsaW5lIG51bWJlciB0YWJsZSBhc3NvY2lhdGVkIHdpdGgKKwlpdCBmb3Igc29tZSByZWFzb24gKGEgbWlzc2luZyBhdF9zdG10X2xpc3QgYXR0cmlidXRlLCByYXRoZXIgdGhhbgorCWp1c3Qgb25lIHdpdGggYSB2YWx1ZSBvZiB6ZXJvLCB3aGljaCBpcyB2YWxpZCkgdGhlbiB3ZSBlbnN1cmUgdGhhdAorCXRoZSByZWNvcmRlZCBmaWxlIG9mZnNldCBpcyB6ZXJvIHNvIHRoYXQgdGhlIHJvdXRpbmUgd2hpY2ggbGF0ZXIKKwlyZWFkcyBsaW5lIG51bWJlciB0YWJsZSBmcmFnbWVudHMga25vd3MgdGhhdCB0aGVyZSBpcyBubyBmcmFnbWVudAorCXRvIHJlYWQuCisKK1JFVFVSTlMKKworCVJldHVybnMgbm8gdmFsdWUuCisKKyAqLworCitzdGF0aWMgdm9pZAorc2Nhbl9jb21waWxhdGlvbl91bml0cyAodGhpc2RpZSwgZW5kZGllLCBkYmZvZmYsIGxub2Zmc2V0LCBvYmpmaWxlKQorICAgICBjaGFyICp0aGlzZGllOworICAgICBjaGFyICplbmRkaWU7CisgICAgIGZpbGVfcHRyIGRiZm9mZjsKKyAgICAgZmlsZV9wdHIgbG5vZmZzZXQ7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBjaGFyICpuZXh0ZGllOworICBzdHJ1Y3QgZGllaW5mbyBkaTsKKyAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7CisgIGludCBjdWxlbmd0aDsKKyAgaW50IGN1cm9mZjsKKyAgZmlsZV9wdHIgY3VybG5vZmZzZXQ7CisKKyAgd2hpbGUgKHRoaXNkaWUgPCBlbmRkaWUpCisgICAgeworICAgICAgYmFzaWNkaWVpbmZvICgmZGksIHRoaXNkaWUsIG9iamZpbGUpOworICAgICAgaWYgKGRpLmRpZV9sZW5ndGggPCBTSVpFT0ZfRElFX0xFTkdUSCkKKwl7CisJICBicmVhazsKKwl9CisgICAgICBlbHNlIGlmIChkaS5kaWVfdGFnICE9IFRBR19jb21waWxlX3VuaXQpCisJeworCSAgbmV4dGRpZSA9IHRoaXNkaWUgKyBkaS5kaWVfbGVuZ3RoOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjb21wbGV0ZWRpZWluZm8gKCZkaSwgb2JqZmlsZSk7CisJICBzZXRfY3VfbGFuZ3VhZ2UgKCZkaSk7CisJICBpZiAoZGkuYXRfc2libGluZyAhPSAwKQorCSAgICB7CisJICAgICAgbmV4dGRpZSA9IGRiYmFzZSArIGRpLmF0X3NpYmxpbmcgLSBkYnJvZmY7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG5leHRkaWUgPSB0aGlzZGllICsgZGkuZGllX2xlbmd0aDsKKwkgICAgfQorCSAgY3Vyb2ZmID0gdGhpc2RpZSAtIGRiYmFzZTsKKwkgIGN1bGVuZ3RoID0gbmV4dGRpZSAtIHRoaXNkaWU7CisJICBjdXJsbm9mZnNldCA9IGRpLmhhc19hdF9zdG10X2xpc3QgPyBsbm9mZnNldCArIGRpLmF0X3N0bXRfbGlzdCA6IDA7CisKKwkgIC8qIEZpcnN0IGFsbG9jYXRlIGEgbmV3IHBhcnRpYWwgc3ltYm9sIHRhYmxlIHN0cnVjdHVyZSAqLworCisJICBwc3QgPSBzdGFydF9wc3ltdGFiX2NvbW1vbiAob2JqZmlsZSwgYmFzZV9zZWN0aW9uX29mZnNldHMsCisJCQkJICAgICAgZGkuYXRfbmFtZSwgZGkuYXRfbG93X3BjLAorCQkJCSAgICAgIG9iamZpbGUgLT4gZ2xvYmFsX3BzeW1ib2xzLm5leHQsCisJCQkJICAgICAgb2JqZmlsZSAtPiBzdGF0aWNfcHN5bWJvbHMubmV4dCk7CisKKwkgIHBzdCAtPiB0ZXh0aGlnaCA9IGRpLmF0X2hpZ2hfcGM7CisJICBwc3QgLT4gcmVhZF9zeW10YWJfcHJpdmF0ZSA9IChjaGFyICopCisJICAgICAgb2JzdGFja19hbGxvYyAoJm9iamZpbGUgLT4gcHN5bWJvbF9vYnN0YWNrLAorCQkJICAgICBzaXplb2YgKHN0cnVjdCBkd2ZpbmZvKSk7CisJICBEQkZPRkYgKHBzdCkgPSBkYmZvZmY7CisJICBEQlJPRkYgKHBzdCkgPSBjdXJvZmY7CisJICBEQkxFTkdUSCAocHN0KSA9IGN1bGVuZ3RoOworCSAgTE5GT0ZGIChwc3QpICA9IGN1cmxub2Zmc2V0OworCSAgcHN0IC0+IHJlYWRfc3ltdGFiID0gZHdhcmZfcHN5bXRhYl90b19zeW10YWI7CisKKwkgIC8qIE5vdyBsb29rIGZvciBwYXJ0aWFsIHN5bWJvbHMgKi8KKworCSAgc2Nhbl9wYXJ0aWFsX3N5bWJvbHMgKHRoaXNkaWUgKyBkaS5kaWVfbGVuZ3RoLCBuZXh0ZGllLCBvYmpmaWxlKTsKKworCSAgcHN0IC0+IG5fZ2xvYmFsX3N5bXMgPSBvYmpmaWxlIC0+IGdsb2JhbF9wc3ltYm9scy5uZXh0IC0KKwkgICAgKG9iamZpbGUgLT4gZ2xvYmFsX3BzeW1ib2xzLmxpc3QgKyBwc3QgLT4gZ2xvYmFsc19vZmZzZXQpOworCSAgcHN0IC0+IG5fc3RhdGljX3N5bXMgPSBvYmpmaWxlIC0+IHN0YXRpY19wc3ltYm9scy5uZXh0IC0gCisJICAgIChvYmpmaWxlIC0+IHN0YXRpY19wc3ltYm9scy5saXN0ICsgcHN0IC0+IHN0YXRpY3Nfb2Zmc2V0KTsKKwkgIHNvcnRfcHN0X3N5bWJvbHMgKHBzdCk7CisJICAvKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgcHN5bXRhYiBvciBzeW10YWIgZm9yIGEgZmlsZSBvZiB0aGlzIG5hbWUsCisJICAgICByZW1vdmUgaXQuIChJZiB0aGVyZSBpcyBhIHN5bXRhYiwgbW9yZSBkcmFzdGljIHRoaW5ncyBhbHNvCisJICAgICBoYXBwZW4uKSAgVGhpcyBoYXBwZW5zIGluIFZ4V29ya3MuICAqLworCSAgZnJlZV9uYW1lZF9zeW10YWJzIChwc3QgLT4gZmlsZW5hbWUpOworCX0KKyAgICAgIHRoaXNkaWUgPSBuZXh0ZGllOyAgICAgIAorICAgIH0KK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCW5ld19zeW1ib2wgLS0gbWFrZSBhIHN5bWJvbCB0YWJsZSBlbnRyeSBmb3IgYSBuZXcgc3ltYm9sCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgc3RydWN0IHN5bWJvbCAqbmV3X3N5bWJvbCAoc3RydWN0IGRpZWluZm8gKmRpcCwKKwkJCQkJICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSkKKworREVTQ1JJUFRJT04KKworCUdpdmVuIGEgcG9pbnRlciB0byBhIERXQVJGIGluZm9ybWF0aW9uIGVudHJ5LCBmaWd1cmUgb3V0IGlmIHdlIG5lZWQKKwl0byBtYWtlIGEgc3ltYm9sIHRhYmxlIGVudHJ5IGZvciBpdCwgYW5kIGlmIHNvLCBjcmVhdGUgYSBuZXcgZW50cnkKKwlhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4KKyAqLworCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqCituZXdfc3ltYm9sIChkaXAsIG9iamZpbGUpCisgICAgIHN0cnVjdCBkaWVpbmZvICpkaXA7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBOVUxMOworICAKKyAgaWYgKGRpcCAtPiBhdF9uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgc3ltID0gKHN0cnVjdCBzeW1ib2wgKikgb2JzdGFja19hbGxvYyAoJm9iamZpbGUgLT4gc3ltYm9sX29ic3RhY2ssCisJCQkJCSAgICAgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisgICAgICBPQkpTVEFUIChvYmpmaWxlLCBuX3N5bXMrKyk7CisgICAgICBtZW1zZXQgKHN5bSwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisgICAgICBTWU1CT0xfTkFNRSAoc3ltKSA9IGNyZWF0ZV9uYW1lIChkaXAgLT4gYXRfbmFtZSwKKwkJCQkgICAgICAgJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrKTsKKyAgICAgIC8qIGRlZmF1bHQgYXNzdW1wdGlvbnMgKi8KKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworICAgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX1NUQVRJQzsKKyAgICAgIFNZTUJPTF9UWVBFIChzeW0pID0gZGVjb2RlX2RpZV90eXBlIChkaXApOworCisgICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBmcm9tIGEgQysrIGNvbXBpbGF0aW9uLCB0aGVuIGF0dGVtcHQgdG8gY2FjaGUgdGhlCisJIGRlbWFuZ2xlZCBmb3JtIGZvciBmdXR1cmUgcmVmZXJlbmNlLiAgVGhpcyBpcyBhIHR5cGljYWwgdGltZSB2ZXJzdXMKKwkgc3BhY2UgdHJhZGVvZmYsIHRoYXQgd2FzIGRlY2lkZWQgaW4gZmF2b3Igb2YgdGltZSBiZWNhdXNlIGl0IHNwZWQgdXAKKwkgQysrIHN5bWJvbCBsb29rdXBzIGJ5IGEgZmFjdG9yIG9mIGFib3V0IDIwLiAqLworCisgICAgICBTWU1CT0xfTEFOR1VBR0UgKHN5bSkgPSBjdV9sYW5ndWFnZTsKKyAgICAgIFNZTUJPTF9JTklUX0RFTUFOR0xFRF9OQU1FIChzeW0sICZvYmpmaWxlIC0+IHN5bWJvbF9vYnN0YWNrKTsKKyAgICAgIHN3aXRjaCAoZGlwIC0+IGRpZV90YWcpCisJeworCWNhc2UgVEFHX2xhYmVsOgorCSAgU1lNQk9MX1ZBTFVFX0FERFJFU1MgKHN5bSkgPSBkaXAgLT4gYXRfbG93X3BjOworCSAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0xBQkVMOworCSAgYnJlYWs7CisJY2FzZSBUQUdfZ2xvYmFsX3N1YnJvdXRpbmU6CisJY2FzZSBUQUdfc3Vicm91dGluZToKKwkgIFNZTUJPTF9WQUxVRV9BRERSRVNTIChzeW0pID0gZGlwIC0+IGF0X2xvd19wYzsKKwkgIFNZTUJPTF9UWVBFIChzeW0pID0gbG9va3VwX2Z1bmN0aW9uX3R5cGUgKFNZTUJPTF9UWVBFIChzeW0pKTsKKwkgIGlmIChkaXAgLT4gYXRfcHJvdG90eXBlZCkKKwkgICAgVFlQRV9GTEFHUyAoU1lNQk9MX1RZUEUgKHN5bSkpIHw9IFRZUEVfRkxBR19QUk9UT1RZUEVEOworCSAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0JMT0NLOworCSAgaWYgKGRpcCAtPiBkaWVfdGFnID09IFRBR19nbG9iYWxfc3Vicm91dGluZSkKKwkgICAgeworCSAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZ2xvYmFsX3N5bWJvbHMpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgbGlzdF9pbl9zY29wZSk7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgVEFHX2dsb2JhbF92YXJpYWJsZToKKwkgIGlmIChkaXAgLT4gYXRfbG9jYXRpb24gIT0gTlVMTCkKKwkgICAgeworCSAgICAgIFNZTUJPTF9WQUxVRV9BRERSRVNTIChzeW0pID0gbG9jdmFsIChkaXApOworCSAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZ2xvYmFsX3N5bWJvbHMpOworCSAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19TVEFUSUM7CisJICAgICAgU1lNQk9MX1ZBTFVFIChzeW0pICs9IGJhc2VhZGRyOworCSAgICB9CisJICBicmVhazsKKwljYXNlIFRBR19sb2NhbF92YXJpYWJsZToKKwkgIGlmIChkaXAgLT4gYXRfbG9jYXRpb24gIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGludCBsb2MgPSBsb2N2YWwgKGRpcCk7CisJICAgICAgaWYgKGRpcCAtPiBvcHRpbWl6ZWRfb3V0KQorCQl7CisJCSAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX09QVElNSVpFRF9PVVQ7CisJCX0KKwkgICAgICBlbHNlIGlmIChkaXAgLT4gaXNyZWcpCisJCXsKKwkJICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfUkVHSVNURVI7CisJCX0KKwkgICAgICBlbHNlIGlmIChkaXAgLT4gb2ZmcmVnKQorCQl7CisJCSAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0JBU0VSRUc7CisJCSAgU1lNQk9MX0JBU0VSRUcgKHN5bSkgPSBkaXAgLT4gYmFzZXJlZzsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19TVEFUSUM7CisJCSAgU1lNQk9MX1ZBTFVFIChzeW0pICs9IGJhc2VhZGRyOworCQl9CisJICAgICAgaWYgKFNZTUJPTF9DTEFTUyAoc3ltKSA9PSBMT0NfU1RBVElDKQorCQl7CisJCSAgLyogTE9DX1NUQVRJQyBhZGRyZXNzIGNsYXNzIE1VU1QgdXNlIFNZTUJPTF9WQUxVRV9BRERSRVNTLAorCQkgICAgIHdoaWNoIG1heSBzdG9yZSB0byBhIGJpZ2dlciBsb2NhdGlvbiB0aGFuIFNZTUJPTF9WQUxVRS4gKi8KKwkJICBTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltKSA9IGxvYzsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIFNZTUJPTF9WQUxVRSAoc3ltKSA9IGxvYzsKKwkJfQorCSAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCBsaXN0X2luX3Njb3BlKTsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBUQUdfZm9ybWFsX3BhcmFtZXRlcjoKKwkgIGlmIChkaXAgLT4gYXRfbG9jYXRpb24gIT0gTlVMTCkKKwkgICAgeworCSAgICAgIFNZTUJPTF9WQUxVRSAoc3ltKSA9IGxvY3ZhbCAoZGlwKTsKKwkgICAgfQorCSAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sIGxpc3RfaW5fc2NvcGUpOworCSAgaWYgKGRpcCAtPiBpc3JlZykKKwkgICAgeworCSAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19SRUdQQVJNOworCSAgICB9CisJICBlbHNlIGlmIChkaXAgLT4gb2ZmcmVnKQorCSAgICB7CisJICAgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0JBU0VSRUdfQVJHOworCSAgICAgIFNZTUJPTF9CQVNFUkVHIChzeW0pID0gZGlwIC0+IGJhc2VyZWc7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19BUkc7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnM6CisJICAvKiBGcm9tIHZhcmFyZ3MgZnVuY3Rpb25zOyBnZGIgZG9lc24ndCBzZWVtIHRvIGhhdmUgYW55IGludGVyZXN0IGluCisJICAgICB0aGlzIGluZm9ybWF0aW9uLCBzbyBqdXN0IGlnbm9yZSBpdCBmb3Igbm93LiAoRklYTUU/KSAqLworCSAgYnJlYWs7CisJY2FzZSBUQUdfY2xhc3NfdHlwZToKKwljYXNlIFRBR19zdHJ1Y3R1cmVfdHlwZToKKwljYXNlIFRBR191bmlvbl90eXBlOgorCWNhc2UgVEFHX2VudW1lcmF0aW9uX3R5cGU6CisJICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfVFlQRURFRjsKKwkgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBTVFJVQ1RfTkFNRVNQQUNFOworCSAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sIGxpc3RfaW5fc2NvcGUpOworCSAgYnJlYWs7CisJY2FzZSBUQUdfdHlwZWRlZjoKKwkgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19UWVBFREVGOworCSAgU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9IFZBUl9OQU1FU1BBQ0U7CisJICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgbGlzdF9pbl9zY29wZSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgLyogTm90IGEgdGFnIHdlIHJlY29nbml6ZS4gIEhvcGVmdWxseSB3ZSBhcmVuJ3QgcHJvY2Vzc2luZyB0cmFzaAorCSAgICAgZGF0YSwgYnV0IHNpbmNlIHdlIG11c3Qgc3BlY2lmaWNhbGx5IGlnbm9yZSB0aGluZ3Mgd2UgZG9uJ3QKKwkgICAgIHJlY29nbml6ZSwgdGhlcmUgaXMgbm90aGluZyBlbHNlIHdlIHNob3VsZCBkbyBhdCB0aGlzIHBvaW50LiAqLworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgcmV0dXJuIChzeW0pOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJc3ludGhlc2l6ZV90eXBlZGVmIC0tIG1ha2UgYSBzeW1ib2wgdGFibGUgZW50cnkgZm9yIGEgImZha2UiIHR5cGVkZWYKKworU1lOT1BTSVMKKworCXN0YXRpYyB2b2lkIHN5bnRoZXNpemVfdHlwZWRlZiAoc3RydWN0IGRpZWluZm8gKmRpcCwKKwkJCQkJc3RydWN0IG9iamZpbGUgKm9iamZpbGUsCisJCQkJCXN0cnVjdCB0eXBlICp0eXBlKTsKKworREVTQ1JJUFRJT04KKworCUdpdmVuIGEgcG9pbnRlciB0byBhIERXQVJGIGluZm9ybWF0aW9uIGVudHJ5LCBzeW50aGVzaXplIGEgdHlwZWRlZgorCWZvciB0aGUgbmFtZSBpbiB0aGUgRElFLCB1c2luZyB0aGUgc3BlY2lmaWVkIHR5cGUuCisKKwlUaGlzIGlzIHVzZWQgZm9yIEMrKyBjbGFzcywgc3RydWN0cywgdW5pb25zLCBhbmQgZW51bWVyYXRpb25zIHRvCisJc2V0IHVwIHRoZSB0YWcgbmFtZSBhcyBhIHR5cGUuCisKKyAqLworCitzdGF0aWMgdm9pZAorc3ludGhlc2l6ZV90eXBlZGVmIChkaXAsIG9iamZpbGUsIHR5cGUpCisgICAgIHN0cnVjdCBkaWVpbmZvICpkaXA7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgc3RydWN0IHN5bWJvbCAqc3ltID0gTlVMTDsKKyAgCisgIGlmIChkaXAgLT4gYXRfbmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN5bSA9IChzdHJ1Y3Qgc3ltYm9sICopCisJb2JzdGFja19hbGxvYyAoJm9iamZpbGUgLT4gc3ltYm9sX29ic3RhY2ssIHNpemVvZiAoc3RydWN0IHN5bWJvbCkpOworICAgICAgT0JKU1RBVCAob2JqZmlsZSwgbl9zeW1zKyspOworICAgICAgbWVtc2V0IChzeW0sIDAsIHNpemVvZiAoc3RydWN0IHN5bWJvbCkpOworICAgICAgU1lNQk9MX05BTUUgKHN5bSkgPSBjcmVhdGVfbmFtZSAoZGlwIC0+IGF0X25hbWUsCisJCQkJICAgICAgICZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjayk7CisgICAgICBTWU1CT0xfSU5JVF9MQU5HVUFHRV9TUEVDSUZJQyAoc3ltLCBjdV9sYW5ndWFnZSk7CisgICAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IHR5cGU7CisgICAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfVFlQRURFRjsKKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworICAgICAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sIGxpc3RfaW5fc2NvcGUpOworICAgIH0KK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWRlY29kZV9tb2RfZnVuZF90eXBlIC0tIGRlY29kZSBhIG1vZGlmaWVkIGZ1bmRhbWVudGFsIHR5cGUKKworU1lOT1BTSVMKKworCXN0YXRpYyBzdHJ1Y3QgdHlwZSAqZGVjb2RlX21vZF9mdW5kX3R5cGUgKGNoYXIgKnR5cGVkYXRhKQorCitERVNDUklQVElPTgorCisJRGVjb2RlIGEgYmxvY2sgb2YgZGF0YSBjb250YWluaW5nIGEgbW9kaWZpZWQgZnVuZGFtZW50YWwKKwl0eXBlIHNwZWNpZmljYXRpb24uICBUWVBFREFUQSBpcyBhIHBvaW50ZXIgdG8gdGhlIGJsb2NrLAorCXdoaWNoIHN0YXJ0cyB3aXRoIGEgbGVuZ3RoIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgdGhlIHJlc3QKKwlvZiB0aGUgYmxvY2suICBBdCB0aGUgZW5kIG9mIHRoZSBibG9jayBpcyBhIGZ1bmRtZW50YWwgdHlwZQorCWNvZGUgdmFsdWUgdGhhdCBnaXZlcyB0aGUgZnVuZGFtZW50YWwgdHlwZS4gIEV2ZXJ5dGhpbmcKKwlpbiBiZXR3ZWVuIGFyZSB0eXBlIG1vZGlmaWVycy4KKworCVdlIHNpbXBseSBjb21wdXRlIHRoZSBudW1iZXIgb2YgbW9kaWZpZXJzIGFuZCBjYWxsIHRoZSBnZW5lcmFsCisJZnVuY3Rpb24gZGVjb2RlX21vZGlmaWVkX3R5cGUgdG8gZG8gdGhlIGFjdHVhbCB3b3JrLgorKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2RlY29kZV9tb2RfZnVuZF90eXBlICh0eXBlZGF0YSkKKyAgICAgY2hhciAqdHlwZWRhdGE7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlcCA9IE5VTEw7CisgIHVuc2lnbmVkIHNob3J0IG1vZGNvdW50OworICBpbnQgbmJ5dGVzOworICAKKyAgLyogR2V0IHRoZSB0b3RhbCBzaXplIG9mIHRoZSBibG9jaywgZXhjbHVzaXZlIG9mIHRoZSBzaXplIGl0c2VsZiAqLworCisgIG5ieXRlcyA9IGF0dHJpYnV0ZV9zaXplIChBVF9tb2RfZnVuZF90eXBlKTsKKyAgbW9kY291bnQgPSB0YXJnZXRfdG9faG9zdCAodHlwZWRhdGEsIG5ieXRlcywgR0VUX1VOU0lHTkVELCBjdXJyZW50X29iamZpbGUpOworICB0eXBlZGF0YSArPSBuYnl0ZXM7CisKKyAgLyogRGVkdWN0IHRoZSBzaXplIG9mIHRoZSBmdW5kYW1lbnRhbCB0eXBlIGJ5dGVzIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrLiAqLworCisgIG1vZGNvdW50IC09IGF0dHJpYnV0ZV9zaXplIChBVF9mdW5kX3R5cGUpOworCisgIC8qIE5vdyBkbyB0aGUgYWN0dWFsIGRlY29kaW5nICovCisKKyAgdHlwZXAgPSBkZWNvZGVfbW9kaWZpZWRfdHlwZSAodHlwZWRhdGEsIG1vZGNvdW50LCBBVF9tb2RfZnVuZF90eXBlKTsKKyAgcmV0dXJuICh0eXBlcCk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlkZWNvZGVfbW9kX3VfZF90eXBlIC0tIGRlY29kZSBhIG1vZGlmaWVkIHVzZXIgZGVmaW5lZCB0eXBlCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgc3RydWN0IHR5cGUgKmRlY29kZV9tb2RfdV9kX3R5cGUgKGNoYXIgKnR5cGVkYXRhKQorCitERVNDUklQVElPTgorCisJRGVjb2RlIGEgYmxvY2sgb2YgZGF0YSBjb250YWluaW5nIGEgbW9kaWZpZWQgdXNlciBkZWZpbmVkCisJdHlwZSBzcGVjaWZpY2F0aW9uLiAgVFlQRURBVEEgaXMgYSBwb2ludGVyIHRvIHRoZSBibG9jaywKKwl3aGljaCBjb25zaXN0cyBvZiBhIHR3byBieXRlIGxlbmd0aCwgY29udGFpbmluZyB0aGUgc2l6ZQorCW9mIHRoZSByZXN0IG9mIHRoZSBibG9jay4gIEF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrIGlzIGEKKwlmb3VyIGJ5dGUgdmFsdWUgdGhhdCBnaXZlcyBhIHJlZmVyZW5jZSB0byBhIHVzZXIgZGVmaW5lZCB0eXBlLgorCUV2ZXJ5dGhpbmcgaW4gYmV0d2VlbiBhcmUgdHlwZSBtb2RpZmllcnMuCisKKwlXZSBzaW1wbHkgY29tcHV0ZSB0aGUgbnVtYmVyIG9mIG1vZGlmaWVycyBhbmQgY2FsbCB0aGUgZ2VuZXJhbAorCWZ1bmN0aW9uIGRlY29kZV9tb2RpZmllZF90eXBlIHRvIGRvIHRoZSBhY3R1YWwgd29yay4KKyovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitkZWNvZGVfbW9kX3VfZF90eXBlICh0eXBlZGF0YSkKKyAgICAgY2hhciAqdHlwZWRhdGE7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlcCA9IE5VTEw7CisgIHVuc2lnbmVkIHNob3J0IG1vZGNvdW50OworICBpbnQgbmJ5dGVzOworICAKKyAgLyogR2V0IHRoZSB0b3RhbCBzaXplIG9mIHRoZSBibG9jaywgZXhjbHVzaXZlIG9mIHRoZSBzaXplIGl0c2VsZiAqLworCisgIG5ieXRlcyA9IGF0dHJpYnV0ZV9zaXplIChBVF9tb2RfdV9kX3R5cGUpOworICBtb2Rjb3VudCA9IHRhcmdldF90b19ob3N0ICh0eXBlZGF0YSwgbmJ5dGVzLCBHRVRfVU5TSUdORUQsIGN1cnJlbnRfb2JqZmlsZSk7CisgIHR5cGVkYXRhICs9IG5ieXRlczsKKworICAvKiBEZWR1Y3QgdGhlIHNpemUgb2YgdGhlIHJlZmVyZW5jZSB0eXBlIGJ5dGVzIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrLiAqLworCisgIG1vZGNvdW50IC09IGF0dHJpYnV0ZV9zaXplIChBVF91c2VyX2RlZl90eXBlKTsKKworICAvKiBOb3cgZG8gdGhlIGFjdHVhbCBkZWNvZGluZyAqLworCisgIHR5cGVwID0gZGVjb2RlX21vZGlmaWVkX3R5cGUgKHR5cGVkYXRhLCBtb2Rjb3VudCwgQVRfbW9kX3VfZF90eXBlKTsKKyAgcmV0dXJuICh0eXBlcCk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlkZWNvZGVfbW9kaWZpZWRfdHlwZSAtLSBkZWNvZGUgbW9kaWZpZWQgdXNlciBvciBmdW5kYW1lbnRhbCB0eXBlCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgc3RydWN0IHR5cGUgKmRlY29kZV9tb2RpZmllZF90eXBlIChjaGFyICptb2RpZmllcnMsCisJICAgIHVuc2lnbmVkIHNob3J0IG1vZGNvdW50LCBpbnQgbXR5cGUpCisKK0RFU0NSSVBUSU9OCisKKwlEZWNvZGUgYSBtb2RpZmllZCB0eXBlLCBlaXRoZXIgYSBtb2RpZmllZCBmdW5kYW1lbnRhbCB0eXBlIG9yCisJYSBtb2RpZmllZCB1c2VyIGRlZmluZWQgdHlwZS4gIE1PRElGSUVSUyBpcyBhIHBvaW50ZXIgdG8gdGhlCisJYmxvY2sgb2YgYnl0ZXMgdGhhdCBkZWZpbmUgTU9EQ09VTlQgbW9kaWZpZXJzLiAgSW1tZWRpYXRlbHkKKwlmb2xsb3dpbmcgdGhlIGxhc3QgbW9kaWZpZXIgaXMgYSBzaG9ydCBjb250YWluaW5nIHRoZSBmdW5kYW1lbnRhbAorCXR5cGUgb3IgYSBsb25nIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZSB0byB0aGUgdXNlciBkZWZpbmVkCisJdHlwZS4gIFdoaWNoIG9uZSBpcyBkZXRlcm1pbmVkIGJ5IE1UWVBFLCB3aGljaCBpcyBlaXRoZXIKKwlBVF9tb2RfZnVuZF90eXBlIG9yIEFUX21vZF91X2RfdHlwZSB0byBpbmRpY2F0ZSB3aGF0IG1vZGlmaWVkCisJdHlwZSB3ZSBhcmUgZ2VuZXJhdGluZy4KKworCVdlIGNhbGwgb3Vyc2VsZiByZWN1cnNpdmVseSB0byBnZW5lcmF0ZSBlYWNoIG1vZGlmaWVkIHR5cGUsYAorCXVudGlsIE1PRENPVU5UIHJlYWNoZXMgemVybywgYXQgd2hpY2ggcG9pbnQgd2UgaGF2ZSBjb25zdW1lZAorCWFsbCB0aGUgbW9kaWZpZXJzIGFuZCBnZW5lcmF0ZSBlaXRoZXIgdGhlIGZ1bmRhbWVudGFsIHR5cGUgb3IKKwl1c2VyIGRlZmluZWQgdHlwZS4gIFdoZW4gdGhlIHJlY3Vyc2lvbiB1bndpbmRzLCBlYWNoIG1vZGlmaWVyCisJaXMgYXBwbGllZCBpbiB0dXJuIHRvIGdlbmVyYXRlIHRoZSBmdWxsIG1vZGlmaWVkIHR5cGUuCisKK05PVEVTCisKKwlJZiB3ZSBmaW5kIGEgbW9kaWZpZXIgdGhhdCB3ZSBkb24ndCByZWNvZ25pemUsIGFuZCBpdCBpcyBub3Qgb25lCisJb2YgdGhvc2UgcmVzZXJ2ZWQgZm9yIGFwcGxpY2F0aW9uIHNwZWNpZmljIHVzZSwgdGhlbiB3ZSBpc3N1ZSBhCisJd2FybmluZyBhbmQgc2ltcGx5IGlnbm9yZSB0aGUgbW9kaWZpZXIuCisKK0JVR1MKKworCVdlIGN1cnJlbnRseSBpZ25vcmUgTU9EX2NvbnN0IGFuZCBNT0Rfdm9sYXRpbGUuICAoRklYTUUpCisKKyAqLworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorZGVjb2RlX21vZGlmaWVkX3R5cGUgKG1vZGlmaWVycywgbW9kY291bnQsIG10eXBlKQorICAgICBjaGFyICptb2RpZmllcnM7CisgICAgIHVuc2lnbmVkIGludCBtb2Rjb3VudDsKKyAgICAgaW50IG10eXBlOworeworICBzdHJ1Y3QgdHlwZSAqdHlwZXAgPSBOVUxMOworICB1bnNpZ25lZCBzaG9ydCBmdW5kdHlwZTsKKyAgRElFX1JFRiBkaWVfcmVmOworICBjaGFyIG1vZGlmaWVyOworICBpbnQgbmJ5dGVzOworICAKKyAgaWYgKG1vZGNvdW50ID09IDApCisgICAgeworICAgICAgc3dpdGNoIChtdHlwZSkKKwl7CisJY2FzZSBBVF9tb2RfZnVuZF90eXBlOgorCSAgbmJ5dGVzID0gYXR0cmlidXRlX3NpemUgKEFUX2Z1bmRfdHlwZSk7CisJICBmdW5kdHlwZSA9IHRhcmdldF90b19ob3N0IChtb2RpZmllcnMsIG5ieXRlcywgR0VUX1VOU0lHTkVELAorCQkJCSAgICAgY3VycmVudF9vYmpmaWxlKTsKKwkgIHR5cGVwID0gZGVjb2RlX2Z1bmRfdHlwZSAoZnVuZHR5cGUpOworCSAgYnJlYWs7CisJY2FzZSBBVF9tb2RfdV9kX3R5cGU6CisJICBuYnl0ZXMgPSBhdHRyaWJ1dGVfc2l6ZSAoQVRfdXNlcl9kZWZfdHlwZSk7CisJICBkaWVfcmVmID0gdGFyZ2V0X3RvX2hvc3QgKG1vZGlmaWVycywgbmJ5dGVzLCBHRVRfVU5TSUdORUQsCisJCQkJICAgIGN1cnJlbnRfb2JqZmlsZSk7CisJICBpZiAoKHR5cGVwID0gbG9va3VwX3V0eXBlIChkaWVfcmVmKSkgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHR5cGVwID0gYWxsb2NfdXR5cGUgKGRpZV9yZWYsIE5VTEwpOworCSAgICB9CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgY29tcGxhaW4gKCZib3RjaGVkX21vZGlmaWVkX3R5cGUsIERJRV9JRCwgRElFX05BTUUsIG10eXBlKTsKKwkgIHR5cGVwID0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSAoY3VycmVudF9vYmpmaWxlLCBGVF9JTlRFR0VSKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtb2RpZmllciA9ICptb2RpZmllcnMrKzsKKyAgICAgIHR5cGVwID0gZGVjb2RlX21vZGlmaWVkX3R5cGUgKG1vZGlmaWVycywgLS1tb2Rjb3VudCwgbXR5cGUpOworICAgICAgc3dpdGNoIChtb2RpZmllcikKKwl7CisJICBjYXNlIE1PRF9wb2ludGVyX3RvOgorCSAgICB0eXBlcCA9IGxvb2t1cF9wb2ludGVyX3R5cGUgKHR5cGVwKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIE1PRF9yZWZlcmVuY2VfdG86CisJICAgIHR5cGVwID0gbG9va3VwX3JlZmVyZW5jZV90eXBlICh0eXBlcCk7CisJICAgIGJyZWFrOworCSAgY2FzZSBNT0RfY29uc3Q6CisJICAgIGNvbXBsYWluICgmY29uc3RfaWdub3JlZCwgRElFX0lELCBESUVfTkFNRSk7ICAvKiBGSVhNRSAqLworCSAgICBicmVhazsKKwkgIGNhc2UgTU9EX3ZvbGF0aWxlOgorCSAgICBjb21wbGFpbiAoJnZvbGF0aWxlX2lnbm9yZWQsIERJRV9JRCwgRElFX05BTUUpOyAvKiBGSVhNRSAqLworCSAgICBicmVhazsKKwkgIGRlZmF1bHQ6CisJICAgIGlmICghKE1PRF9sb191c2VyIDw9ICh1bnNpZ25lZCBjaGFyKSBtb2RpZmllcgorCQkgICYmICh1bnNpZ25lZCBjaGFyKSBtb2RpZmllciA8PSBNT0RfaGlfdXNlcikpCisJICAgICAgeworCQljb21wbGFpbiAoJnVua25vd25fdHlwZV9tb2RpZmllciwgRElFX0lELCBESUVfTkFNRSwgbW9kaWZpZXIpOworCSAgICAgIH0KKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgcmV0dXJuICh0eXBlcCk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlkZWNvZGVfZnVuZF90eXBlIC0tIHRyYW5zbGF0ZSBiYXNpYyBEV0FSRiB0eXBlIHRvIGdkYiBiYXNlIHR5cGUKKworREVTQ1JJUFRJT04KKworCUdpdmVuIGFuIGludGVnZXIgdGhhdCBpcyBvbmUgb2YgdGhlIGZ1bmRhbWVudGFsIERXQVJGIHR5cGVzLAorCXRyYW5zbGF0ZSBpdCB0byBvbmUgb2YgdGhlIGJhc2ljIGludGVybmFsIGdkYiB0eXBlcyBhbmQgcmV0dXJuCisJYSBwb2ludGVyIHRvIHRoZSBhcHByb3ByaWF0ZSBnZGIgdHlwZSAoYSAic3RydWN0IHR5cGUgKiIpLgorCitOT1RFUworCisJRm9yIHJvYnVzdG5lc3MsIGlmIHdlIGFyZSBhc2tlZCB0byB0cmFuc2xhdGUgYSBmdW5kYW1lbnRhbAorCXR5cGUgdGhhdCB3ZSBhcmUgdW5wcmVwYXJlZCB0byBkZWFsIHdpdGgsIHdlIHJldHVybiBpbnQgc28KKwljYWxsZXJzIGNhbiBhbHdheXMgZGVwZW5kIHVwb24gYSB2YWxpZCB0eXBlIGJlaW5nIHJldHVybmVkLAorCWFuZCBzbyBnZGIgbWF5IGF0IGxlYXN0IGRvIHNvbWV0aGluZyByZWFzb25hYmxlIGJ5IGRlZmF1bHQuCisJSWYgdGhlIHR5cGUgaXMgbm90IGluIHRoZSByYW5nZSBvZiB0aG9zZSB0eXBlcyBkZWZpbmVkIGFzCisJYXBwbGljYXRpb24gc3BlY2lmaWMgdHlwZXMsIHdlIGFsc28gaXNzdWUgYSB3YXJuaW5nLgorKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2RlY29kZV9mdW5kX3R5cGUgKGZ1bmR0eXBlKQorICAgICB1bnNpZ25lZCBpbnQgZnVuZHR5cGU7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlcCA9IE5VTEw7CisgIAorICBzd2l0Y2ggKGZ1bmR0eXBlKQorICAgIHsKKworICAgIGNhc2UgRlRfdm9pZDoKKyAgICAgIHR5cGVwID0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSAoY3VycmVudF9vYmpmaWxlLCBGVF9WT0lEKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgRlRfYm9vbGVhbjoJCS8qIFdhcyBGVF9zZXQgaW4gQVQmVCB2ZXJzaW9uICovCisgICAgICB0eXBlcCA9IGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfQk9PTEVBTik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRlRfcG9pbnRlcjoJCS8qICh2b2lkICopICovCisgICAgICB0eXBlcCA9IGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfVk9JRCk7CisgICAgICB0eXBlcCA9IGxvb2t1cF9wb2ludGVyX3R5cGUgKHR5cGVwKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgRlRfY2hhcjoKKyAgICAgIHR5cGVwID0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSAoY3VycmVudF9vYmpmaWxlLCBGVF9DSEFSKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgRlRfc2lnbmVkX2NoYXI6CisgICAgICB0eXBlcCA9IGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfU0lHTkVEX0NIQVIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZUX3Vuc2lnbmVkX2NoYXI6CisgICAgICB0eXBlcCA9IGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfVU5TSUdORURfQ0hBUik7CisgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIEZUX3Nob3J0OgorICAgICAgdHlwZXAgPSBkd2FyZl9mdW5kYW1lbnRhbF90eXBlIChjdXJyZW50X29iamZpbGUsIEZUX1NIT1JUKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGVF9zaWduZWRfc2hvcnQ6CisgICAgICB0eXBlcCA9IGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfU0lHTkVEX1NIT1JUKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgRlRfdW5zaWduZWRfc2hvcnQ6CisgICAgICB0eXBlcCA9IGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfVU5TSUdORURfU0hPUlQpOworICAgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBGVF9pbnRlZ2VyOgorICAgICAgdHlwZXAgPSBkd2FyZl9mdW5kYW1lbnRhbF90eXBlIChjdXJyZW50X29iamZpbGUsIEZUX0lOVEVHRVIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZUX3NpZ25lZF9pbnRlZ2VyOgorICAgICAgdHlwZXAgPSBkd2FyZl9mdW5kYW1lbnRhbF90eXBlIChjdXJyZW50X29iamZpbGUsIEZUX1NJR05FRF9JTlRFR0VSKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgRlRfdW5zaWduZWRfaW50ZWdlcjoKKyAgICAgIHR5cGVwID0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSAoY3VycmVudF9vYmpmaWxlLCBGVF9VTlNJR05FRF9JTlRFR0VSKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgRlRfbG9uZzoKKyAgICAgIHR5cGVwID0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSAoY3VycmVudF9vYmpmaWxlLCBGVF9MT05HKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGVF9zaWduZWRfbG9uZzoKKyAgICAgIHR5cGVwID0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSAoY3VycmVudF9vYmpmaWxlLCBGVF9TSUdORURfTE9ORyk7CisgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIEZUX3Vuc2lnbmVkX2xvbmc6CisgICAgICB0eXBlcCA9IGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfVU5TSUdORURfTE9ORyk7CisgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIEZUX2xvbmdfbG9uZzoKKyAgICAgIHR5cGVwID0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSAoY3VycmVudF9vYmpmaWxlLCBGVF9MT05HX0xPTkcpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZUX3NpZ25lZF9sb25nX2xvbmc6CisgICAgICB0eXBlcCA9IGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfU0lHTkVEX0xPTkdfTE9ORyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRlRfdW5zaWduZWRfbG9uZ19sb25nOgorICAgICAgdHlwZXAgPSBkd2FyZl9mdW5kYW1lbnRhbF90eXBlIChjdXJyZW50X29iamZpbGUsIEZUX1VOU0lHTkVEX0xPTkdfTE9ORyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRlRfZmxvYXQ6CisgICAgICB0eXBlcCA9IGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfRkxPQVQpOworICAgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSBGVF9kYmxfcHJlY19mbG9hdDoKKyAgICAgIHR5cGVwID0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSAoY3VycmVudF9vYmpmaWxlLCBGVF9EQkxfUFJFQ19GTE9BVCk7CisgICAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIEZUX2V4dF9wcmVjX2Zsb2F0OgorICAgICAgdHlwZXAgPSBkd2FyZl9mdW5kYW1lbnRhbF90eXBlIChjdXJyZW50X29iamZpbGUsIEZUX0VYVF9QUkVDX0ZMT0FUKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgRlRfY29tcGxleDoKKyAgICAgIHR5cGVwID0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSAoY3VycmVudF9vYmpmaWxlLCBGVF9DT01QTEVYKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgRlRfZGJsX3ByZWNfY29tcGxleDoKKyAgICAgIHR5cGVwID0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSAoY3VycmVudF9vYmpmaWxlLCBGVF9EQkxfUFJFQ19DT01QTEVYKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgRlRfZXh0X3ByZWNfY29tcGxleDoKKyAgICAgIHR5cGVwID0gZHdhcmZfZnVuZGFtZW50YWxfdHlwZSAoY3VycmVudF9vYmpmaWxlLCBGVF9FWFRfUFJFQ19DT01QTEVYKTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIH0KKworICBpZiAodHlwZXAgPT0gTlVMTCkKKyAgICB7CisgICAgICB0eXBlcCA9IGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgKGN1cnJlbnRfb2JqZmlsZSwgRlRfSU5URUdFUik7CisgICAgICBpZiAoIShGVF9sb191c2VyIDw9IGZ1bmR0eXBlICYmIGZ1bmR0eXBlIDw9IEZUX2hpX3VzZXIpKQorCXsKKwkgIGNvbXBsYWluICgmdW5leHBlY3RlZF9mdW5kX3R5cGUsIERJRV9JRCwgRElFX05BTUUsIGZ1bmR0eXBlKTsKKwl9CisgICAgfQorICAgIAorICByZXR1cm4gKHR5cGVwKTsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWNyZWF0ZV9uYW1lIC0tIGFsbG9jYXRlIGEgZnJlc2ggY29weSBvZiBhIHN0cmluZyBvbiBhbiBvYnN0YWNrCisKK0RFU0NSSVBUSU9OCisKKwlHaXZlbiBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgYW5kIGEgcG9pbnRlciB0byBhbiBvYnN0YWNrLCBhbGxvY2F0ZXMKKwlhIGZyZXNoIGNvcHkgb2YgdGhlIHN0cmluZyBvbiB0aGUgc3BlY2lmaWVkIG9ic3RhY2suCisKKyovCisKK3N0YXRpYyBjaGFyICoKK2NyZWF0ZV9uYW1lIChuYW1lLCBvYnN0YWNrcCkKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2twOworeworICBpbnQgbGVuZ3RoOworICBjaGFyICpuZXduYW1lOworCisgIGxlbmd0aCA9IHN0cmxlbiAobmFtZSkgKyAxOworICBuZXduYW1lID0gKGNoYXIgKikgb2JzdGFja19hbGxvYyAob2JzdGFja3AsIGxlbmd0aCk7CisgIHN0cmNweSAobmV3bmFtZSwgbmFtZSk7CisgIHJldHVybiAobmV3bmFtZSk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwliYXNpY2RpZWluZm8gLS0gZXh0cmFjdCB0aGUgbWluaW1hbCBkaWUgaW5mbyBmcm9tIHJhdyBkaWUgZGF0YQorCitTWU5PUFNJUworCisJdm9pZCBiYXNpY2RpZWluZm8gKGNoYXIgKmRpZXAsIHN0cnVjdCBkaWVpbmZvICpkaXAsCisJCQkgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSkKKworREVTQ1JJUFRJT04KKworCUdpdmVuIGEgcG9pbnRlciB0byByYXcgRElFIGRhdGEsIGFuZCBhIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2Ugb2YgYQorCWRpZSBpbmZvIHN0cnVjdHVyZSwgdGhpcyBmdW5jdGlvbiBleHRyYWN0cyB0aGUgYmFzaWMgaW5mb3JtYXRpb24KKwlmcm9tIHRoZSBESUUgZGF0YSByZXF1aXJlZCB0byBjb250aW51ZSBwcm9jZXNzaW5nIHRoaXMgRElFLCBhbG9uZworCXdpdGggc29tZSBib29ra2VlcGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgRElFLgorCisJVGhlIGluZm9ybWF0aW9uIHdlIGFic29sdXRlbHkgbXVzdCBoYXZlIGluY2x1ZGVzIHRoZSBESUUgdGFnLAorCWFuZCB0aGUgRElFIGxlbmd0aC4gIElmIHdlIG5lZWQgdGhlIHNpYmxpbmcgcmVmZXJlbmNlLCB0aGVuIHdlCisJd2lsbCBoYXZlIHRvIGNhbGwgY29tcGxldGVkaWVpbmZvKCkgdG8gcHJvY2VzcyBhbGwgdGhlIHJlbWFpbmluZworCURJRSBpbmZvcm1hdGlvbi4KKworCU5vdGUgdGhhdCBzaW5jZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgZGF0YSBpcyBwcm9wZXJseQorCWFsaWduZWQgaW4gbWVtb3J5IGZvciB0aGUgdHlwZSBvZiBhY2Nlc3MgcmVxdWlyZWQgKGluZGlyZWN0aW9uCisJdGhyb3VnaCBhbnl0aGluZyBvdGhlciB0aGFuIGEgY2hhciBwb2ludGVyKSwgYW5kIHRoZXJlIGlzIG5vCisJZ3VhcmFudGVlIHRoYXQgaXQgaXMgaW4gdGhlIHNhbWUgYnl0ZSBvcmRlciBhcyB0aGUgZ2RiIGhvc3QsCisJd2UgY2FsbCBhIGZ1bmN0aW9uIHdoaWNoIGRlYWxzIHdpdGggYm90aCBhbGlnbm1lbnQgYW5kIGJ5dGUKKwlzd2FwcGluZyBpc3N1ZXMuICBQb3NzaWJseSBpbmVmZmljaWVudCwgYnV0IHF1aXRlIHBvcnRhYmxlLgorCisJV2UgYWxzbyB0YWtlIGNhcmUgb2Ygc29tZSBvdGhlciBiYXNpYyB0aGluZ3MgYXQgdGhpcyBwb2ludCwgc3VjaAorCWFzIGVuc3VyaW5nIHRoYXQgdGhlIGluc3RhbmNlIG9mIHRoZSBkaWUgaW5mbyBzdHJ1Y3R1cmUgc3RhcnRzCisJb3V0IGNvbXBsZXRlbHkgemVybydkIGFuZCB0aGF0IGN1cmRpZSBpcyBpbml0aWFsaXplZCBmb3IgdXNlCisJaW4gZXJyb3IgcmVwb3J0aW5nIGlmIHdlIGhhdmUgYSBwcm9ibGVtIHdpdGggdGhlIGN1cnJlbnQgZGllLgorCitOT1RFUworCisJQWxsIERJRSdzIG11c3QgaGF2ZSBhdCBsZWFzdCBhIHZhbGlkIGxlbmd0aCwgdGh1cyB0aGUgbWluaW11bQorCURJRSBzaXplIGlzIFNJWkVPRl9ESUVfTEVOR1RILiAgSW4gb3JkZXIgdG8gaGF2ZSBhIHZhbGlkIHRhZywgdGhlCisJRElFIHNpemUgbXVzdCBiZSBhdCBsZWFzdCBTSVpFT0ZfRElFX1RBRyBsYXJnZXIsIG90aGVyd2lzZSB0aGV5CisJYXJlIGZvcmNlZCB0byBiZSBUQUdfcGFkZGluZyBESUVTLgorCisJUGFkZGluZyBESUVTIG11c3QgYmUgYXQgbGVhc3QgU0laRU9GX0RJRV9MRU5HVEggaW4gbGVuZ3RoLCBpbXBseWluZworCXRoYXQgaWYgYSBwYWRkaW5nIERJRSBpcyB1c2VkIGZvciBhbGlnbm1lbnQgYW5kIHRoZSBhbW91bnQgbmVlZGVkIGlzCisJbGVzcyB0aGFuIFNJWkVPRl9ESUVfTEVOR1RILCB0aGVuIHRoZSBwYWRkaW5nIERJRSBoYXMgdG8gYmUgYmlnCisJZW5vdWdoIHRvIGFsaWduIHRvIHRoZSBuZXh0IGFsaWdubWVudCBib3VuZHJ5LgorCisJV2UgZG8gc29tZSBiYXNpYyBzYW5pdHkgY2hlY2tpbmcgaGVyZSwgc3VjaCBhcyB2ZXJpZnlpbmcgdGhhdCB0aGUKKwlsZW5ndGggb2YgdGhlIGRpZSB3b3VsZCBub3QgY2F1c2UgaXQgdG8gb3ZlcnJ1biB0aGUgcmVjb3JkZWQgZW5kIG9mCisJdGhlIGJ1ZmZlciBob2xkaW5nIHRoZSBESUUgaW5mby4gIElmIHdlIGZpbmQgYSBESUUgdGhhdCBpcyBlaXRoZXIKKwl0b28gc21hbGwgb3IgdG9vIGxhcmdlLCB3ZSBmb3JjZSBpdCdzIGxlbmd0aCB0byB6ZXJvIHdoaWNoIHNob3VsZAorCWNhdXNlIHRoZSBjYWxsZXIgdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24uCisgKi8KKworc3RhdGljIHZvaWQKK2Jhc2ljZGllaW5mbyAoZGlwLCBkaWVwLCBvYmpmaWxlKQorICAgICBzdHJ1Y3QgZGllaW5mbyAqZGlwOworICAgICBjaGFyICpkaWVwOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgY3VyZGllID0gZGlwOworICBtZW1zZXQgKGRpcCwgMCwgc2l6ZW9mIChzdHJ1Y3QgZGllaW5mbykpOworICBkaXAgLT4gZGllID0gZGllcDsKKyAgZGlwIC0+IGRpZV9yZWYgPSBkYnJvZmYgKyAoZGllcCAtIGRiYmFzZSk7CisgIGRpcCAtPiBkaWVfbGVuZ3RoID0gdGFyZ2V0X3RvX2hvc3QgKGRpZXAsIFNJWkVPRl9ESUVfTEVOR1RILCBHRVRfVU5TSUdORUQsCisJCQkJICAgICAgb2JqZmlsZSk7CisgIGlmICgoZGlwIC0+IGRpZV9sZW5ndGggPCBTSVpFT0ZfRElFX0xFTkdUSCkgfHwKKyAgICAgICgoZGllcCArIGRpcCAtPiBkaWVfbGVuZ3RoKSA+IChkYmJhc2UgKyBkYnNpemUpKSkKKyAgICB7CisgICAgICBjb21wbGFpbiAoJm1hbGZvcm1lZF9kaWUsIERJRV9JRCwgRElFX05BTUUsIGRpcCAtPiBkaWVfbGVuZ3RoKTsKKyAgICAgIGRpcCAtPiBkaWVfbGVuZ3RoID0gMDsKKyAgICB9CisgIGVsc2UgaWYgKGRpcCAtPiBkaWVfbGVuZ3RoIDwgKFNJWkVPRl9ESUVfTEVOR1RIICsgU0laRU9GX0RJRV9UQUcpKQorICAgIHsKKyAgICAgIGRpcCAtPiBkaWVfdGFnID0gVEFHX3BhZGRpbmc7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZGllcCArPSBTSVpFT0ZfRElFX0xFTkdUSDsKKyAgICAgIGRpcCAtPiBkaWVfdGFnID0gdGFyZ2V0X3RvX2hvc3QgKGRpZXAsIFNJWkVPRl9ESUVfVEFHLCBHRVRfVU5TSUdORUQsCisJCQkJICAgICAgIG9iamZpbGUpOworICAgIH0KK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWNvbXBsZXRlZGllaW5mbyAtLSBmaW5pc2ggcmVhZGluZyB0aGUgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gRElFCisKK1NZTk9QU0lTCisKKwl2b2lkIGNvbXBsZXRlZGllaW5mbyAoc3RydWN0IGRpZWluZm8gKmRpcCwgc3RydWN0IG9iamZpbGUgKm9iamZpbGUpCisKK0RFU0NSSVBUSU9OCisKKwlHaXZlbiBhIHBvaW50ZXIgdG8gYW4gYWxyZWFkeSBwYXJ0aWFsbHkgaW5pdGlhbGl6ZWQgZGllIGluZm8gc3RydWN0dXJlLAorCXNjYW4gdGhlIHJhdyBESUUgZGF0YSBhbmQgZmluaXNoIGZpbGxpbmcgaW4gdGhlIGRpZSBpbmZvIHN0cnVjdHVyZQorCWZyb20gdGhlIHZhcmlvdXMgYXR0cmlidXRlcyBmb3VuZC4KKyAgIAorCU5vdGUgdGhhdCBzaW5jZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgZGF0YSBpcyBwcm9wZXJseQorCWFsaWduZWQgaW4gbWVtb3J5IGZvciB0aGUgdHlwZSBvZiBhY2Nlc3MgcmVxdWlyZWQgKGluZGlyZWN0aW9uCisJdGhyb3VnaCBhbnl0aGluZyBvdGhlciB0aGFuIGEgY2hhciBwb2ludGVyKSwgYW5kIHRoZXJlIGlzIG5vCisJZ3VhcmFudGVlIHRoYXQgaXQgaXMgaW4gdGhlIHNhbWUgYnl0ZSBvcmRlciBhcyB0aGUgZ2RiIGhvc3QsCisJd2UgY2FsbCBhIGZ1bmN0aW9uIHdoaWNoIGRlYWxzIHdpdGggYm90aCBhbGlnbm1lbnQgYW5kIGJ5dGUKKwlzd2FwcGluZyBpc3N1ZXMuICBQb3NzaWJseSBpbmVmZmljaWVudCwgYnV0IHF1aXRlIHBvcnRhYmxlLgorCitOT1RFUworCisJRWFjaCB0aW1lIHdlIGFyZSBjYWxsZWQsIHdlIGluY3JlbWVudCB0aGUgZGllY291bnQgdmFyaWFibGUsIHdoaWNoCisJa2VlcHMgYW4gYXBwcm94aW1hdGUgY291bnQgb2YgdGhlIG51bWJlciBvZiBkaWVzIHByb2Nlc3NlZCBmb3IKKwllYWNoIGNvbXBpbGF0aW9uIHVuaXQuICBUaGlzIGluZm9ybWF0aW9uIGlzIHByZXNlbnRlZCB0byB0aGUgdXNlcgorCWlmIHRoZSBpbmZvX3ZlcmJvc2UgZmxhZyBpcyBzZXQuCisKKyAqLworCitzdGF0aWMgdm9pZAorY29tcGxldGVkaWVpbmZvIChkaXAsIG9iamZpbGUpCisgICAgIHN0cnVjdCBkaWVpbmZvICpkaXA7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBjaGFyICpkaWVwOwkJCS8qIEN1cnJlbnQgcG9pbnRlciBpbnRvIHJhdyBESUUgZGF0YSAqLworICBjaGFyICplbmQ7CQkJLyogVGVybWluYXRlIERJRSBzY2FuIGhlcmUgKi8KKyAgdW5zaWduZWQgc2hvcnQgYXR0cjsJCS8qIEN1cnJlbnQgYXR0cmlidXRlIGJlaW5nIHNjYW5uZWQgKi8KKyAgdW5zaWduZWQgc2hvcnQgZm9ybTsJCS8qIEZvcm0gb2YgdGhlIGF0dHJpYnV0ZSAqLworICBpbnQgbmJ5dGVzOwkJCS8qIFNpemUgb2YgbmV4dCBmaWVsZCB0byByZWFkICovCisgIAorICBkaWVjb3VudCsrOworICBkaWVwID0gZGlwIC0+IGRpZTsKKyAgZW5kID0gZGllcCArIGRpcCAtPiBkaWVfbGVuZ3RoOworICBkaWVwICs9IFNJWkVPRl9ESUVfTEVOR1RIICsgU0laRU9GX0RJRV9UQUc7CisgIHdoaWxlIChkaWVwIDwgZW5kKQorICAgIHsKKyAgICAgIGF0dHIgPSB0YXJnZXRfdG9faG9zdCAoZGllcCwgU0laRU9GX0FUVFJJQlVURSwgR0VUX1VOU0lHTkVELCBvYmpmaWxlKTsKKyAgICAgIGRpZXAgKz0gU0laRU9GX0FUVFJJQlVURTsKKyAgICAgIGlmICgobmJ5dGVzID0gYXR0cmlidXRlX3NpemUgKGF0dHIpKSA9PSAtMSkKKwl7CisJICBjb21wbGFpbiAoJnVua25vd25fYXR0cmlidXRlX2xlbmd0aCwgRElFX0lELCBESUVfTkFNRSk7CisJICBkaWVwID0gZW5kOworCSAgY29udGludWU7CisJfQorICAgICAgc3dpdGNoIChhdHRyKQorCXsKKwljYXNlIEFUX2Z1bmRfdHlwZToKKwkgIGRpcCAtPiBhdF9mdW5kX3R5cGUgPSB0YXJnZXRfdG9faG9zdCAoZGllcCwgbmJ5dGVzLCBHRVRfVU5TSUdORUQsCisJCQkJCQlvYmpmaWxlKTsKKwkgIGJyZWFrOworCWNhc2UgQVRfb3JkZXJpbmc6CisJICBkaXAgLT4gYXRfb3JkZXJpbmcgPSB0YXJnZXRfdG9faG9zdCAoZGllcCwgbmJ5dGVzLCBHRVRfVU5TSUdORUQsCisJCQkJCSAgICAgICBvYmpmaWxlKTsKKwkgIGJyZWFrOworCWNhc2UgQVRfYml0X29mZnNldDoKKwkgIGRpcCAtPiBhdF9iaXRfb2Zmc2V0ID0gdGFyZ2V0X3RvX2hvc3QgKGRpZXAsIG5ieXRlcywgR0VUX1VOU0lHTkVELAorCQkJCQkJIG9iamZpbGUpOworCSAgYnJlYWs7CisJY2FzZSBBVF9zaWJsaW5nOgorCSAgZGlwIC0+IGF0X3NpYmxpbmcgPSB0YXJnZXRfdG9faG9zdCAoZGllcCwgbmJ5dGVzLCBHRVRfVU5TSUdORUQsCisJCQkJCSAgICAgIG9iamZpbGUpOworCSAgYnJlYWs7CisJY2FzZSBBVF9zdG10X2xpc3Q6CisJICBkaXAgLT4gYXRfc3RtdF9saXN0ID0gdGFyZ2V0X3RvX2hvc3QgKGRpZXAsIG5ieXRlcywgR0VUX1VOU0lHTkVELAorCQkJCQkJb2JqZmlsZSk7CisJICBkaXAgLT4gaGFzX2F0X3N0bXRfbGlzdCA9IDE7CisJICBicmVhazsKKwljYXNlIEFUX2xvd19wYzoKKwkgIGRpcCAtPiBhdF9sb3dfcGMgPSB0YXJnZXRfdG9faG9zdCAoZGllcCwgbmJ5dGVzLCBHRVRfVU5TSUdORUQsCisJCQkJCSAgICAgb2JqZmlsZSk7CisJICBkaXAgLT4gYXRfbG93X3BjICs9IGJhc2VhZGRyOworCSAgZGlwIC0+IGhhc19hdF9sb3dfcGMgPSAxOworCSAgYnJlYWs7CisJY2FzZSBBVF9oaWdoX3BjOgorCSAgZGlwIC0+IGF0X2hpZ2hfcGMgPSB0YXJnZXRfdG9faG9zdCAoZGllcCwgbmJ5dGVzLCBHRVRfVU5TSUdORUQsCisJCQkJCSAgICAgIG9iamZpbGUpOworCSAgZGlwIC0+IGF0X2hpZ2hfcGMgKz0gYmFzZWFkZHI7CisJICBicmVhazsKKwljYXNlIEFUX2xhbmd1YWdlOgorCSAgZGlwIC0+IGF0X2xhbmd1YWdlID0gdGFyZ2V0X3RvX2hvc3QgKGRpZXAsIG5ieXRlcywgR0VUX1VOU0lHTkVELAorCQkJCQkgICAgICAgb2JqZmlsZSk7CisJICBicmVhazsKKwljYXNlIEFUX3VzZXJfZGVmX3R5cGU6CisJICBkaXAgLT4gYXRfdXNlcl9kZWZfdHlwZSA9IHRhcmdldF90b19ob3N0IChkaWVwLCBuYnl0ZXMsCisJCQkJCQkgICAgR0VUX1VOU0lHTkVELCBvYmpmaWxlKTsKKwkgIGJyZWFrOworCWNhc2UgQVRfYnl0ZV9zaXplOgorCSAgZGlwIC0+IGF0X2J5dGVfc2l6ZSA9IHRhcmdldF90b19ob3N0IChkaWVwLCBuYnl0ZXMsIEdFVF9VTlNJR05FRCwKKwkJCQkJCW9iamZpbGUpOworCSAgZGlwIC0+IGhhc19hdF9ieXRlX3NpemUgPSAxOworCSAgYnJlYWs7CisJY2FzZSBBVF9iaXRfc2l6ZToKKwkgIGRpcCAtPiBhdF9iaXRfc2l6ZSA9IHRhcmdldF90b19ob3N0IChkaWVwLCBuYnl0ZXMsIEdFVF9VTlNJR05FRCwKKwkJCQkJICAgICAgIG9iamZpbGUpOworCSAgYnJlYWs7CisJY2FzZSBBVF9tZW1iZXI6CisJICBkaXAgLT4gYXRfbWVtYmVyID0gdGFyZ2V0X3RvX2hvc3QgKGRpZXAsIG5ieXRlcywgR0VUX1VOU0lHTkVELAorCQkJCQkgICAgIG9iamZpbGUpOworCSAgYnJlYWs7CisJY2FzZSBBVF9kaXNjcjoKKwkgIGRpcCAtPiBhdF9kaXNjciA9IHRhcmdldF90b19ob3N0IChkaWVwLCBuYnl0ZXMsIEdFVF9VTlNJR05FRCwKKwkJCQkJICAgIG9iamZpbGUpOworCSAgYnJlYWs7CisJY2FzZSBBVF9sb2NhdGlvbjoKKwkgIGRpcCAtPiBhdF9sb2NhdGlvbiA9IGRpZXA7CisJICBicmVhazsKKwljYXNlIEFUX21vZF9mdW5kX3R5cGU6CisJICBkaXAgLT4gYXRfbW9kX2Z1bmRfdHlwZSA9IGRpZXA7CisJICBicmVhazsKKwljYXNlIEFUX3N1YnNjcl9kYXRhOgorCSAgZGlwIC0+IGF0X3N1YnNjcl9kYXRhID0gZGllcDsKKwkgIGJyZWFrOworCWNhc2UgQVRfbW9kX3VfZF90eXBlOgorCSAgZGlwIC0+IGF0X21vZF91X2RfdHlwZSA9IGRpZXA7CisJICBicmVhazsKKwljYXNlIEFUX2VsZW1lbnRfbGlzdDoKKwkgIGRpcCAtPiBhdF9lbGVtZW50X2xpc3QgPSBkaWVwOworCSAgZGlwIC0+IHNob3J0X2VsZW1lbnRfbGlzdCA9IDA7CisJICBicmVhazsKKwljYXNlIEFUX3Nob3J0X2VsZW1lbnRfbGlzdDoKKwkgIGRpcCAtPiBhdF9lbGVtZW50X2xpc3QgPSBkaWVwOworCSAgZGlwIC0+IHNob3J0X2VsZW1lbnRfbGlzdCA9IDE7CisJICBicmVhazsKKwljYXNlIEFUX2Rpc2NyX3ZhbHVlOgorCSAgZGlwIC0+IGF0X2Rpc2NyX3ZhbHVlID0gZGllcDsKKwkgIGJyZWFrOworCWNhc2UgQVRfc3RyaW5nX2xlbmd0aDoKKwkgIGRpcCAtPiBhdF9zdHJpbmdfbGVuZ3RoID0gZGllcDsKKwkgIGJyZWFrOworCWNhc2UgQVRfbmFtZToKKwkgIGRpcCAtPiBhdF9uYW1lID0gZGllcDsKKwkgIGJyZWFrOworCWNhc2UgQVRfY29tcF9kaXI6CisJICAvKiBGb3Igbm93LCBpZ25vcmUgYW55ICJob3N0bmFtZToiIHBvcnRpb24sIHNpbmNlIGdkYiBkb2Vzbid0CisJICAgICBrbm93IGhvdyB0byBkZWFsIHdpdGggaXQuICAoRklYTUUpLiAqLworCSAgZGlwIC0+IGF0X2NvbXBfZGlyID0gc3RycmNociAoZGllcCwgJzonKTsKKwkgIGlmIChkaXAgLT4gYXRfY29tcF9kaXIgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGRpcCAtPiBhdF9jb21wX2RpcisrOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBkaXAgLT4gYXRfY29tcF9kaXIgPSBkaWVwOworCSAgICB9CisJICBicmVhazsKKwljYXNlIEFUX3Byb2R1Y2VyOgorCSAgZGlwIC0+IGF0X3Byb2R1Y2VyID0gZGllcDsKKwkgIGJyZWFrOworCWNhc2UgQVRfc3RhcnRfc2NvcGU6CisJICBkaXAgLT4gYXRfc3RhcnRfc2NvcGUgPSB0YXJnZXRfdG9faG9zdCAoZGllcCwgbmJ5dGVzLCBHRVRfVU5TSUdORUQsCisJCQkJCQkgIG9iamZpbGUpOworCSAgYnJlYWs7CisJY2FzZSBBVF9zdHJpZGVfc2l6ZToKKwkgIGRpcCAtPiBhdF9zdHJpZGVfc2l6ZSA9IHRhcmdldF90b19ob3N0IChkaWVwLCBuYnl0ZXMsIEdFVF9VTlNJR05FRCwKKwkJCQkJCSAgb2JqZmlsZSk7CisJICBicmVhazsKKwljYXNlIEFUX3NyY19pbmZvOgorCSAgZGlwIC0+IGF0X3NyY19pbmZvID0gdGFyZ2V0X3RvX2hvc3QgKGRpZXAsIG5ieXRlcywgR0VUX1VOU0lHTkVELAorCQkJCQkgICAgICAgb2JqZmlsZSk7CisJICBicmVhazsKKwljYXNlIEFUX3Byb3RvdHlwZWQ6CisJICBkaXAgLT4gYXRfcHJvdG90eXBlZCA9IGRpZXA7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgLyogRm91bmQgYW4gYXR0cmlidXRlIHRoYXQgd2UgYXJlIHVucHJlcGFyZWQgdG8gaGFuZGxlLiAgSG93ZXZlcgorCSAgICAgaXQgaXMgc3BlY2lmaWNhbGx5IG9uZSBvZiB0aGUgZGVzaWduIGdvYWxzIG9mIERXQVJGIHRoYXQKKwkgICAgIGNvbnN1bWVycyBzaG91bGQgaWdub3JlIHVua25vd24gYXR0cmlidXRlcy4gIEFzIGxvbmcgYXMgdGhlCisJICAgICBmb3JtIGlzIG9uZSB0aGF0IHdlIHJlY29nbml6ZSAoc28gd2Uga25vdyBob3cgdG8gc2tpcCBpdCksCisJICAgICB3ZSBjYW4ganVzdCBpZ25vcmUgdGhlIHVua25vd24gYXR0cmlidXRlLiAqLworCSAgYnJlYWs7CisJfQorICAgICAgZm9ybSA9IEZPUk1fRlJPTV9BVFRSIChhdHRyKTsKKyAgICAgIHN3aXRjaCAoZm9ybSkKKwl7CisJY2FzZSBGT1JNX0RBVEEyOgorCSAgZGllcCArPSAyOworCSAgYnJlYWs7CisJY2FzZSBGT1JNX0RBVEE0OgorCWNhc2UgRk9STV9SRUY6CisJICBkaWVwICs9IDQ7CisJICBicmVhazsKKwljYXNlIEZPUk1fREFUQTg6CisJICBkaWVwICs9IDg7CisJICBicmVhazsKKwljYXNlIEZPUk1fQUREUjoKKwkgIGRpZXAgKz0gVEFSR0VUX0ZUX1BPSU5URVJfU0laRSAob2JqZmlsZSk7CisJICBicmVhazsKKwljYXNlIEZPUk1fQkxPQ0syOgorCSAgZGllcCArPSAyICsgdGFyZ2V0X3RvX2hvc3QgKGRpZXAsIG5ieXRlcywgR0VUX1VOU0lHTkVELCBvYmpmaWxlKTsKKwkgIGJyZWFrOworCWNhc2UgRk9STV9CTE9DSzQ6CisJICBkaWVwICs9IDQgKyB0YXJnZXRfdG9faG9zdCAoZGllcCwgbmJ5dGVzLCBHRVRfVU5TSUdORUQsIG9iamZpbGUpOworCSAgYnJlYWs7CisJY2FzZSBGT1JNX1NUUklORzoKKwkgIGRpZXAgKz0gc3RybGVuIChkaWVwKSArIDE7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgY29tcGxhaW4gKCZ1bmtub3duX2F0dHJpYnV0ZV9mb3JtLCBESUVfSUQsIERJRV9OQU1FLCBmb3JtKTsKKwkgIGRpZXAgPSBlbmQ7CisJICBicmVhazsKKwl9CisgICAgfQorfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJdGFyZ2V0X3RvX2hvc3QgLS0gc3dhcCBpbiB0YXJnZXQgZGF0YSB0byBob3N0CisKK1NZTk9QU0lTCisKKwl0YXJnZXRfdG9faG9zdCAoY2hhciAqZnJvbSwgaW50IG5ieXRlcywgaW50IHNpZ25leHRlbmQsCisJCQlzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSkKKworREVTQ1JJUFRJT04KKworCUdpdmVuIHBvaW50ZXIgdG8gZGF0YSBpbiB0YXJnZXQgZm9ybWF0IGluIEZST00sIGEgYnl0ZSBjb3VudCBmb3IKKwl0aGUgc2l6ZSBvZiB0aGUgZGF0YSBpbiBOQllURVMsIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90CisJdGhlIGRhdGEgaXMgc2lnbmVkIGluIFNJR05FWFRFTkQsIGFuZCBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQKKwlvYmpmaWxlIGluIE9CSkZJTEUsIGNvbnZlcnQgdGhlIGRhdGEgdG8gaG9zdCBmb3JtYXQgYW5kIHJldHVybgorCXRoZSBjb252ZXJ0ZWQgdmFsdWUuCisKK05PVEVTCisKKwlGSVhNRTogIElmIHdlIHJlYWQgZGF0YSB0aGF0IGlzIGtub3duIHRvIGJlIHNpZ25lZCwgYW5kIGV4cGVjdCB0bworCXVzZSBpdCBhcyBzaWduZWQgZGF0YSwgdGhlbiB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgc2lnbiBleHRlbmQgdGhlCisJcmVzdWx0IHVudGlsIHRoZSBiZmQgbGlicmFyeSBpcyBhYmxlIHRvIGRvIHRoaXMgZm9yIHVzLgorCisJRklYTUU6IFdvdWxkIGEgMzIgYml0IHRhcmdldCBldmVyIG5lZWQgYW4gOCBieXRlIHJlc3VsdD8KKworICovCisKK3N0YXRpYyBDT1JFX0FERFIKK3RhcmdldF90b19ob3N0IChmcm9tLCBuYnl0ZXMsIHNpZ25leHRlbmQsIG9iamZpbGUpCisgICAgIGNoYXIgKmZyb207CisgICAgIGludCBuYnl0ZXM7CisgICAgIGludCBzaWduZXh0ZW5kOwkJLyogRklYTUU6ICBVbnVzZWQgKi8KKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIENPUkVfQUREUiBydG52YWw7CisKKyAgc3dpdGNoIChuYnl0ZXMpCisgICAgeworICAgICAgY2FzZSA4OgorICAgICAgICBydG52YWwgPSBiZmRfZ2V0XzY0IChvYmpmaWxlIC0+IG9iZmQsIChiZmRfYnl0ZSAqKSBmcm9tKTsKKwlicmVhazsKKyAgICAgIGNhc2UgNDoKKwlydG52YWwgPSBiZmRfZ2V0XzMyIChvYmpmaWxlIC0+IG9iZmQsIChiZmRfYnl0ZSAqKSBmcm9tKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMjoKKwlydG52YWwgPSBiZmRfZ2V0XzE2IChvYmpmaWxlIC0+IG9iZmQsIChiZmRfYnl0ZSAqKSBmcm9tKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMToKKwlydG52YWwgPSBiZmRfZ2V0XzggKG9iamZpbGUgLT4gb2JmZCwgKGJmZF9ieXRlICopIGZyb20pOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwljb21wbGFpbiAoJm5vX2JmZF9nZXRfTiwgRElFX0lELCBESUVfTkFNRSwgbmJ5dGVzKTsKKwlydG52YWwgPSAwOworCWJyZWFrOworICAgIH0KKyAgcmV0dXJuIChydG52YWwpOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJYXR0cmlidXRlX3NpemUgLS0gY29tcHV0ZSBzaXplIG9mIGRhdGEgZm9yIGEgRFdBUkYgYXR0cmlidXRlCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgaW50IGF0dHJpYnV0ZV9zaXplICh1bnNpZ25lZCBpbnQgYXR0cikKKworREVTQ1JJUFRJT04KKworCUdpdmVuIGEgRFdBUkYgYXR0cmlidXRlIGluIEFUVFIsIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGZpcnN0CisJcGllY2Ugb2YgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhdHRyaWJ1dGUgYW5kIHJldHVybiB0aGF0CisJc2l6ZS4KKworCVJldHVybnMgLTEgZm9yIHVucmVjb2duaXplZCBhdHRyaWJ1dGVzLgorCisgKi8KKworc3RhdGljIGludAorYXR0cmlidXRlX3NpemUgKGF0dHIpCisgICAgIHVuc2lnbmVkIGludCBhdHRyOworeworICBpbnQgbmJ5dGVzOwkJCS8qIFNpemUgb2YgbmV4dCBkYXRhIGZvciB0aGlzIGF0dHJpYnV0ZSAqLworICB1bnNpZ25lZCBzaG9ydCBmb3JtOwkJLyogRm9ybSBvZiB0aGUgYXR0cmlidXRlICovCisKKyAgZm9ybSA9IEZPUk1fRlJPTV9BVFRSIChhdHRyKTsKKyAgc3dpdGNoIChmb3JtKQorICAgIHsKKyAgICAgIGNhc2UgRk9STV9TVFJJTkc6CQkvKiBBIHZhcmlhYmxlIGxlbmd0aCBmaWVsZCBpcyBuZXh0ICovCisgICAgICAgIG5ieXRlcyA9IDA7CisJYnJlYWs7CisgICAgICBjYXNlIEZPUk1fREFUQTI6CQkvKiBOZXh0IDIgYnl0ZSBmaWVsZCBpcyB0aGUgZGF0YSBpdHNlbGYgKi8KKyAgICAgIGNhc2UgRk9STV9CTE9DSzI6CQkvKiBOZXh0IDIgYnl0ZSBmaWVsZCBpcyBhIGJsb2NrIGxlbmd0aCAqLworCW5ieXRlcyA9IDI7CisJYnJlYWs7CisgICAgICBjYXNlIEZPUk1fREFUQTQ6CQkvKiBOZXh0IDQgYnl0ZSBmaWVsZCBpcyB0aGUgZGF0YSBpdHNlbGYgKi8KKyAgICAgIGNhc2UgRk9STV9CTE9DSzQ6CQkvKiBOZXh0IDQgYnl0ZSBmaWVsZCBpcyBhIGJsb2NrIGxlbmd0aCAqLworICAgICAgY2FzZSBGT1JNX1JFRjoJCS8qIE5leHQgNCBieXRlIGZpZWxkIGlzIGEgRElFIG9mZnNldCAqLworCW5ieXRlcyA9IDQ7CisJYnJlYWs7CisgICAgICBjYXNlIEZPUk1fREFUQTg6CQkvKiBOZXh0IDggYnl0ZSBmaWVsZCBpcyB0aGUgZGF0YSBpdHNlbGYgKi8KKwluYnl0ZXMgPSA4OworCWJyZWFrOworICAgICAgY2FzZSBGT1JNX0FERFI6CQkvKiBOZXh0IGZpZWxkIHNpemUgaXMgdGFyZ2V0IHNpemVvZih2b2lkICopICovCisJbmJ5dGVzID0gVEFSR0VUX0ZUX1BPSU5URVJfU0laRSAob2JqZmlsZSk7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCWNvbXBsYWluICgmdW5rbm93bl9hdHRyaWJ1dGVfZm9ybSwgRElFX0lELCBESUVfTkFNRSwgZm9ybSk7CisJbmJ5dGVzID0gLTE7CisJYnJlYWs7CisgICAgICB9CisgIHJldHVybiAobmJ5dGVzKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9lbGZyZWFkLmMgYi9nZGIvZWxmcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNzAzOWUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZWxmcmVhZC5jCkBAIC0wLDAgKzEsODQ5IEBACisvKiBSZWFkIEVMRiAoRXhlY3V0YWJsZSBhbmQgTGlua2luZyBGb3JtYXQpIG9iamVjdCBmaWxlcyBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIGF0IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImVsZi1iZmQuaCIKKyNpbmNsdWRlICJlbGYvbWlwcy5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIKKyNpbmNsdWRlICJvYmpmaWxlcy5oIgorI2luY2x1ZGUgImJ1aWxkc3ltLmgiCisjaW5jbHVkZSAic3RhYnNyZWFkLmgiCisjaW5jbHVkZSAiZ2RiLXN0YWJzLmgiCisjaW5jbHVkZSAiY29tcGxhaW50cy5oIgorI2luY2x1ZGUgImRlbWFuZ2xlLmgiCisKKy8qIFRoZSBzdHJ1Y3QgZWxmaW5mbyBpcyBhdmFpbGFibGUgb25seSBkdXJpbmcgRUxGIHN5bWJvbCB0YWJsZSBhbmQKKyAgIHBzeW10YWIgcmVhZGluZy4gIEl0IGlzIGRlc3Ryb3llZCBhdCB0aGUgY29tcGxhdGlvbiBvZiBwc3ltdGFiLXJlYWRpbmcuCisgICBJdCdzIGxvY2FsIHRvIGVsZl9zeW1maWxlX3JlYWQuICAqLworCitzdHJ1Y3QgZWxmaW5mbyB7CisgIGZpbGVfcHRyIGRib2Zmc2V0OwkJLyogT2Zmc2V0IHRvIGR3YXJmIGRlYnVnIHNlY3Rpb24gKi8KKyAgdW5zaWduZWQgaW50IGRic2l6ZTsJCS8qIFNpemUgb2YgZHdhcmYgZGVidWcgc2VjdGlvbiAqLworICBmaWxlX3B0ciBsbm9mZnNldDsJCS8qIE9mZnNldCB0byBkd2FyZiBsaW5lIG51bWJlciBzZWN0aW9uICovCisgIHVuc2lnbmVkIGludCBsbnNpemU7CQkvKiBTaXplIG9mIGR3YXJmIGxpbmUgbnVtYmVyIHNlY3Rpb24gKi8KKyAgYXNlY3Rpb24gKnN0YWJzZWN0OwkJLyogU2VjdGlvbiBwb2ludGVyIGZvciAuc3RhYiBzZWN0aW9uICovCisgIGFzZWN0aW9uICpzdGFiaW5kZXhzZWN0OwkvKiBTZWN0aW9uIHBvaW50ZXIgZm9yIC5zdGFiLmluZGV4IHNlY3Rpb24gKi8KKyAgYXNlY3Rpb24gKm1kZWJ1Z3NlY3Q7CQkvKiBTZWN0aW9uIHBvaW50ZXIgZm9yIC5tZGVidWcgc2VjdGlvbiAqLworfTsKKworLyogVmFyaW91cyB0aGluZ3Mgd2UgbWlnaHQgY29tcGxhaW4gYWJvdXQuLi4gKi8KKworc3RydWN0IGNvbXBsYWludCBzZWN0aW9uX2luZm9fY29tcGxhaW50ID0gCisgIHsiZWxmL3N0YWIgc2VjdGlvbiBpbmZvcm1hdGlvbiAlcyB3aXRob3V0IGEgcHJlY2VkaW5nIGZpbGUgc3ltYm9sIiwgMCwgMH07CisKK3N0cnVjdCBjb21wbGFpbnQgc2VjdGlvbl9pbmZvX2R1cF9jb21wbGFpbnQgPSAKKyAgeyJkdXBsaWNhdGVkIGVsZi9zdGFiIHNlY3Rpb24gaW5mb3JtYXRpb24gZm9yICVzIiwgMCwgMH07CisKK3N0cnVjdCBjb21wbGFpbnQgc3RhYl9pbmZvX21pc21hdGNoX2NvbXBsYWludCA9IAorICB7ImVsZi9zdGFiIHNlY3Rpb24gaW5mb3JtYXRpb24gbWlzc2luZyBmb3IgJXMiLCAwLCAwfTsKKworc3RydWN0IGNvbXBsYWludCBzdGFiX2luZm9fcXVlc3Rpb25hYmxlX2NvbXBsYWludCA9IAorICB7ImVsZi9zdGFiIHNlY3Rpb24gaW5mb3JtYXRpb24gcXVlc3Rpb25hYmxlIGZvciAlcyIsIDAsIDB9OworCitzdGF0aWMgdm9pZAorZWxmX3N5bWZpbGVfaW5pdCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCitlbGZfbmV3X2luaXQgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZAorZWxmX3N5bWZpbGVfcmVhZCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICosIGludCkpOworCitzdGF0aWMgdm9pZAorZWxmX3N5bWZpbGVfZmluaXNoIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQKK2VsZl9zeW10YWJfcmVhZCBQQVJBTVMgKChiZmQgKiwgIENPUkVfQUREUiwgc3RydWN0IG9iamZpbGUgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitmcmVlX2VsZmluZm8gUEFSQU1TICgodm9pZCAqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKgorcmVjb3JkX21pbmltYWxfc3ltYm9sX2FuZF9pbmZvIFBBUkFNUyAoKGNoYXIgKiwgQ09SRV9BRERSLAorCQkJCQllbnVtIG1pbmltYWxfc3ltYm9sX3R5cGUsIGNoYXIgKiwKKwkJCQkJYXNlY3Rpb24gKmJmZF9zZWN0aW9uLAorCQkJCQlzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCitlbGZfbG9jYXRlX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCB2b2lkICopKTsKKworLyogV2UgYXJlIGNhbGxlZCBvbmNlIHBlciBzZWN0aW9uIGZyb20gZWxmX3N5bWZpbGVfcmVhZC4gIFdlCisgICBuZWVkIHRvIGV4YW1pbmUgZWFjaCBzZWN0aW9uIHdlIGFyZSBwYXNzZWQsIGNoZWNrIHRvIHNlZQorICAgaWYgaXQgaXMgc29tZXRoaW5nIHdlIGFyZSBpbnRlcmVzdGVkIGluIHByb2Nlc3NpbmcsIGFuZAorICAgaWYgc28sIHN0YXNoIGF3YXkgc29tZSBhY2Nlc3MgaW5mb3JtYXRpb24gZm9yIHRoZSBzZWN0aW9uLgorCisgICBGb3Igbm93IHdlIHJlY29nbml6ZSB0aGUgZHdhcmYgZGVidWcgaW5mb3JtYXRpb24gc2VjdGlvbnMgYW5kCisgICBsaW5lIG51bWJlciBzZWN0aW9ucyBmcm9tIG1hdGNoaW5nIHRoZWlyIHNlY3Rpb24gbmFtZXMuICBUaGUKKyAgIEVMRiBkZWZpbml0aW9uIGlzIG5vIHJlYWwgaGVscCBoZXJlIHNpbmNlIGl0IGhhcyBubyBkaXJlY3QKKyAgIGtub3dsZWRnZSBvZiBEV0FSRiAoYnkgZGVzaWduLCBzbyBhbnkgZGVidWdnaW5nIGZvcm1hdCBjYW4gYmUKKyAgIHVzZWQpLgorCisgICBXZSBhbHNvIHJlY29nbml6ZSB0aGUgIi5zdGFiIiBzZWN0aW9ucyB1c2VkIGJ5IHRoZSBTdW4gY29tcGlsZXJzCisgICByZWxlYXNlZCB3aXRoIFNvbGFyaXMgMi4KKworICAgRklYTUU6IFRoZSBzZWN0aW9uIG5hbWVzIHNob3VsZCBub3QgYmUgaGFyZHdpcmVkIHN0cmluZ3MgKHdoYXQKKyAgIHNob3VsZCB0aGV5IGJlPyAgSSBkb24ndCB0aGluayBtb3N0IG9iamVjdCBmaWxlIGZvcm1hdHMgaGF2ZSBlbm91Z2gKKyAgIHNlY3Rpb24gZmxhZ3MgdG8gc3BlY2lmeSB3aGF0IGtpbmQgb2YgZGVidWcgc2VjdGlvbiBpdCBpcworICAgLWtpbmdkb24pLiAgKi8KKworc3RhdGljIHZvaWQKK2VsZl9sb2NhdGVfc2VjdGlvbnMgKGlnbm9yZV9hYmZkLCBzZWN0cCwgZWlwKQorICAgICBiZmQgKmlnbm9yZV9hYmZkOworICAgICBhc2VjdGlvbiAqc2VjdHA7CisgICAgIFBUUiBlaXA7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBlbGZpbmZvICplaTsKKworICBlaSA9IChzdHJ1Y3QgZWxmaW5mbyAqKSBlaXA7CisgIGlmIChTVFJFUSAoc2VjdHAgLT4gbmFtZSwgIi5kZWJ1ZyIpKQorICAgIHsKKyAgICAgIGVpIC0+IGRib2Zmc2V0ID0gc2VjdHAgLT4gZmlsZXBvczsKKyAgICAgIGVpIC0+IGRic2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdHApOworICAgIH0KKyAgZWxzZSBpZiAoU1RSRVEgKHNlY3RwIC0+IG5hbWUsICIubGluZSIpKQorICAgIHsKKyAgICAgIGVpIC0+IGxub2Zmc2V0ID0gc2VjdHAgLT4gZmlsZXBvczsKKyAgICAgIGVpIC0+IGxuc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdHApOworICAgIH0KKyAgZWxzZSBpZiAoU1RSRVEgKHNlY3RwIC0+IG5hbWUsICIuc3RhYiIpKQorICAgIHsKKyAgICAgIGVpIC0+IHN0YWJzZWN0ID0gc2VjdHA7CisgICAgfQorICBlbHNlIGlmIChTVFJFUSAoc2VjdHAgLT4gbmFtZSwgIi5zdGFiLmluZGV4IikpCisgICAgeworICAgICAgZWkgLT4gc3RhYmluZGV4c2VjdCA9IHNlY3RwOworICAgIH0KKyAgZWxzZSBpZiAoU1RSRVEgKHNlY3RwIC0+IG5hbWUsICIubWRlYnVnIikpCisgICAgeworICAgICAgZWkgLT4gbWRlYnVnc2VjdCA9IHNlY3RwOworICAgIH0KK30KKworI2lmIDAJLyogQ3VycmVudGx5IHVudXNlZCAqLworCitjaGFyICoKK2VsZl9pbnRlcnByZXRlciAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBzZWNfcHRyIGludGVycF9zZWM7CisgIHVuc2lnbmVkIHNpemU7CisgIGNoYXIgKmludGVycCA9IE5VTEw7CisKKyAgaW50ZXJwX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmludGVycCIpOworICBpZiAoaW50ZXJwX3NlYykKKyAgICB7CisgICAgICBzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgaW50ZXJwX3NlYyk7CisgICAgICBpbnRlcnAgPSBhbGxvY2EgKHNpemUpOworICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaW50ZXJwX3NlYywgaW50ZXJwLCAoZmlsZV9wdHIpMCwKKwkJCQkgICAgc2l6ZSkpCisJeworCSAgaW50ZXJwID0gc2F2ZXN0cmluZyAoaW50ZXJwLCBzaXplIC0gMSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGludGVycCA9IE5VTEw7CisJfQorICAgIH0KKyAgcmV0dXJuIChpbnRlcnApOworfQorCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqCityZWNvcmRfbWluaW1hbF9zeW1ib2xfYW5kX2luZm8gKG5hbWUsIGFkZHJlc3MsIG1zX3R5cGUsIGluZm8sIGJmZF9zZWN0aW9uLAorCQkJCW9iamZpbGUpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIENPUkVfQUREUiBhZGRyZXNzOworICAgICBlbnVtIG1pbmltYWxfc3ltYm9sX3R5cGUgbXNfdHlwZTsKKyAgICAgY2hhciAqaW5mbzsJCS8qIEZJWE1FLCBpcyB0aGlzIHJlYWxseSBjaGFyICo/ICovCisgICAgIGFzZWN0aW9uICpiZmRfc2VjdGlvbjsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIGludCBzZWN0aW9uOworCisgIC8qIEd1ZXNzIHRoZSBzZWN0aW9uIGZyb20gdGhlIHR5cGUuICBUaGlzIGlzIGxpa2VseSB0byBiZSB3cm9uZyBpbgorICAgICBzb21lIGNhc2VzLiAgKi8KKyAgc3dpdGNoIChtc190eXBlKQorICAgIHsKKyAgICBjYXNlIG1zdF90ZXh0OgorICAgIGNhc2UgbXN0X2ZpbGVfdGV4dDoKKyAgICAgIHNlY3Rpb24gPSBTRUNUX09GRl9URVhUOworI2lmZGVmIFNNQVNIX1RFWFRfQUREUkVTUworICAgICAgU01BU0hfVEVYVF9BRERSRVNTIChhZGRyZXNzKTsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgY2FzZSBtc3RfZGF0YToKKyAgICBjYXNlIG1zdF9maWxlX2RhdGE6CisgICAgICBzZWN0aW9uID0gU0VDVF9PRkZfREFUQTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgbXN0X2JzczoKKyAgICBjYXNlIG1zdF9maWxlX2JzczoKKyAgICAgIHNlY3Rpb24gPSBTRUNUX09GRl9CU1M7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgc2VjdGlvbiA9IC0xOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbF9hbmRfaW5mbworICAgIChuYW1lLCBhZGRyZXNzLCBtc190eXBlLCBpbmZvLCBzZWN0aW9uLCBiZmRfc2VjdGlvbiwgb2JqZmlsZSk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwllbGZfc3ltdGFiX3JlYWQgLS0gcmVhZCB0aGUgc3ltYm9sIHRhYmxlIG9mIGFuIEVMRiBmaWxlCisKK1NZTk9QU0lTCisKKwl2b2lkIGVsZl9zeW10YWJfcmVhZCAoYmZkICphYmZkLCBDT1JFX0FERFIgYWRkciwKKwkJCSAgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlLCBpbnQgZHluYW1pYykKKworREVTQ1JJUFRJT04KKworCUdpdmVuIGFuIG9wZW4gYmZkLCBhIGJhc2UgYWRkcmVzcyB0byByZWxvY2F0ZSBzeW1ib2xzIHRvLCBhbmQgYQorCWZsYWcgdGhhdCBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBiZmQgaXMgZm9yIGFuIGV4ZWN1dGFibGUKKwlvciBub3QgKG1heSBiZSBzaGFyZWQgbGlicmFyeSBmb3IgZXhhbXBsZSksIGFkZCBhbGwgdGhlIGdsb2JhbAorCWZ1bmN0aW9uIGFuZCBkYXRhIHN5bWJvbHMgdG8gdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlLgorCisJSW4gc3RhYnMtaW4tRUxGLCBhcyBpbXBsZW1lbnRlZCBieSBTdW4sIHRoZXJlIGFyZSBzb21lIGxvY2FsIHN5bWJvbHMKKwlkZWZpbmVkIGluIHRoZSBFTEYgc3ltYm9sIHRhYmxlLCB3aGljaCBjYW4gYmUgdXNlZCB0byBsb2NhdGUKKwl0aGUgYmVnaW5uaW5ncyBvZiBzZWN0aW9ucyBmcm9tIGVhY2ggIi5vIiBmaWxlIHRoYXQgd2FzIGxpbmtlZCB0bworCWZvcm0gdGhlIGV4ZWN1dGFibGUgb2JqZmlsZS4gIFdlIGdhdGhlciBhbnkgc3VjaCBpbmZvIGFuZCByZWNvcmQgaXQKKwlpbiBkYXRhIHN0cnVjdHVyZXMgaHVuZyBvZmYgdGhlIG9iamZpbGUncyBwcml2YXRlIGRhdGEuCisKKyovCisKK3N0YXRpYyB2b2lkCitlbGZfc3ltdGFiX3JlYWQgKGFiZmQsIGFkZHIsIG9iamZpbGUsIGR5bmFtaWMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBpbnQgZHluYW1pYzsKK3sKKyAgbG9uZyBzdG9yYWdlX25lZWRlZDsKKyAgYXN5bWJvbCAqc3ltOworICBhc3ltYm9sICoqc3ltYm9sX3RhYmxlOworICBsb25nIG51bWJlcl9vZl9zeW1ib2xzOworICBsb25nIGk7CisgIGludCBpbmRleDsKKyAgc3RydWN0IGNsZWFudXAgKmJhY2tfdG87CisgIENPUkVfQUREUiBzeW1hZGRyOworICBlbnVtIG1pbmltYWxfc3ltYm9sX3R5cGUgbXNfdHlwZTsKKyAgLyogSWYgc2VjdGluZm8gaXMgbm9uTlVMTCwgaXQgY29udGFpbnMgc2VjdGlvbiBpbmZvIHRoYXQgc2hvdWxkIGVuZCB1cAorICAgICBmaWxlZCBpbiB0aGUgb2JqZmlsZS4gICovCisgIHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbyAqc2VjdGluZm8gPSBOVUxMOworICAvKiBJZiBmaWxlc3ltIGlzIG5vbnplcm8sIGl0IHBvaW50cyB0byBhIGZpbGUgc3ltYm9sLCBidXQgd2UgaGF2ZW4ndAorICAgICBzZWVuIGFueSBzZWN0aW9uIGluZm8gZm9yIGl0IHlldC4gICovCisgIGFzeW1ib2wgKmZpbGVzeW0gPSAwOworI2lmZGVmIFNPRlVOX0FERFJFU1NfTUFZQkVfTUlTU0lORworICAvKiBOYW1lIG9mIGZpbGVzeW0sIGFzIHNhdmVkIG9uIHRoZSBzeW1ib2xfb2JzdGFjay4gICovCisgIGNoYXIgKmZpbGVzeW1uYW1lID0gb2JzYXZlc3RyaW5nICgiIiwgMCwgJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrKTsKKyNlbmRpZgorICBzdHJ1Y3QgZGJ4X3N5bWZpbGVfaW5mbyAqZGJ4ID0gb2JqZmlsZS0+c3ltX3N0YWJfaW5mbzsKKyAgdW5zaWduZWQgbG9uZyBzaXplOworICBpbnQgc3RyaXBwZWQgPSAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCk7CisgCisgIGlmIChkeW5hbWljKQorICAgIHsKKyAgICAgIHN0b3JhZ2VfbmVlZGVkID0gYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7CisKKyAgICAgIC8qIE5vdGhpbmcgdG8gYmUgZG9uZSBpZiB0aGVyZSBpcyBubyBkeW5hbWljIHN5bXRhYi4gICovCisgICAgICBpZiAoc3RvcmFnZV9uZWVkZWQgPCAwKQorCXJldHVybjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdG9yYWdlX25lZWRlZCA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKKyAgICAgIGlmIChzdG9yYWdlX25lZWRlZCA8IDApCisJZXJyb3IgKCJDYW4ndCByZWFkIHN5bWJvbHMgZnJvbSAlczogJXMiLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKKwkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICAgIH0KKyAgaWYgKHN0b3JhZ2VfbmVlZGVkID4gMCkKKyAgICB7CisgICAgICBzeW1ib2xfdGFibGUgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZV9uZWVkZWQpOworICAgICAgYmFja190byA9IG1ha2VfY2xlYW51cCAoZnJlZSwgc3ltYm9sX3RhYmxlKTsKKyAgICAgIGlmIChkeW5hbWljKQorICAgICAgICBudW1iZXJfb2Zfc3ltYm9scyA9IGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsCisJCQkJCQkJICAgICBzeW1ib2xfdGFibGUpOworICAgICAgZWxzZQorICAgICAgICBudW1iZXJfb2Zfc3ltYm9scyA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChhYmZkLCBzeW1ib2xfdGFibGUpOworICAgICAgaWYgKG51bWJlcl9vZl9zeW1ib2xzIDwgMCkKKwllcnJvciAoIkNhbid0IHJlYWQgc3ltYm9scyBmcm9tICVzOiAlcyIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAorCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyX29mX3N5bWJvbHM7IGkrKykKKwl7CisJICBzeW0gPSBzeW1ib2xfdGFibGVbaV07CisJICBpZiAoc3ltIC0+IG5hbWUgPT0gTlVMTCB8fCAqc3ltIC0+IG5hbWUgPT0gJ1wwJykKKwkgICAgeworCSAgICAgIC8qIFNraXAgbmFtZXMgdGhhdCBkb24ndCBleGlzdCAoc2hvdWxkbid0IGhhcHBlbiksIG9yIG5hbWVzCisJCSB0aGF0IGFyZSBudWxsIHN0cmluZ3MgKG1heSBoYXBwZW4pLiAqLworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIGlmIChkeW5hbWljCisJICAgICAgJiYgc3ltIC0+IHNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbgorCSAgICAgICYmIChzeW0gLT4gZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pKQorCSAgICB7CisJICAgICAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltOworCisJICAgICAgLyogU3ltYm9sIGlzIGEgcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24gZGVmaW5lZCBpbgorCQkgYSBzaGFyZWQgbGlicmFyeS4KKwkJIElmIGl0cyB2YWx1ZSBpcyBub24gemVybyB0aGVuIGl0IGlzIHVzdWFsbHkgdGhlIGFkZHJlc3MKKwkJIG9mIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwKKwkJIHJlbGF0aXZlIHRvIHRoZSBiYXNlIGFkZHJlc3MuCisJCSBJZiBpdHMgdmFsdWUgaXMgemVybyB0aGVuIHRoZSBkeW5hbWljIGxpbmtlciBoYXMgdG8gcmVzb2x2ZQorCQkgdGhlIHN5bWJvbC4gV2UgYXJlIHVuYWJsZSB0byBmaW5kIGFueSBtZWFuaW5nZnVsIGFkZHJlc3MKKwkJIGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgZXhlY3V0YWJsZSBmaWxlLCBzbyB3ZSBza2lwIGl0LiAgKi8KKwkgICAgICBzeW1hZGRyID0gc3ltIC0+IHZhbHVlOworCSAgICAgIGlmIChzeW1hZGRyID09IDApCisJCWNvbnRpbnVlOworCSAgICAgIHN5bWFkZHIgKz0gYWRkcjsKKwkgICAgICBtc3ltID0gcmVjb3JkX21pbmltYWxfc3ltYm9sX2FuZF9pbmZvCisJCSgoY2hhciAqKSBzeW0gLT4gbmFtZSwgc3ltYWRkciwKKwkJbXN0X3NvbGliX3RyYW1wb2xpbmUsIE5VTEwsIHN5bSAtPiBzZWN0aW9uLCBvYmpmaWxlKTsKKyNpZmRlZiBTT0ZVTl9BRERSRVNTX01BWUJFX01JU1NJTkcKKwkgICAgICBpZiAobXN5bSAhPSBOVUxMKQorCQltc3ltLT5maWxlbmFtZSA9IGZpbGVzeW1uYW1lOworI2VuZGlmCisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgLyogSWYgaXQgaXMgYSBub25zdHJpcHBlZCBleGVjdXRhYmxlLCBkbyBub3QgZW50ZXIgZHluYW1pYworCSAgICAgc3ltYm9scywgYXMgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGlzIHVzdWFsbHkgYSBzdWJzZXQKKwkgICAgIG9mIHRoZSBtYWluIHN5bWJvbCB0YWJsZS4gICovCisJICBpZiAoZHluYW1pYyAmJiAhc3RyaXBwZWQpCisJICAgIGNvbnRpbnVlOworCSAgaWYgKHN5bSAtPiBmbGFncyAmIEJTRl9GSUxFKQorCSAgICB7CisJICAgICAgLyogU1RUX0ZJTEUgZGVidWdnaW5nIHN5bWJvbCB0aGF0IGhlbHBzIHN0YWJzLWluLWVsZiBkZWJ1Z2dpbmcuCisJCSBDaGFpbiBhbnkgb2xkIG9uZSBvbnRvIHRoZSBvYmpmaWxlOyByZW1lbWJlciBuZXcgc3ltLiAgKi8KKwkgICAgICBpZiAoc2VjdGluZm8gIT0gTlVMTCkKKwkJeworCQkgIHNlY3RpbmZvIC0+IG5leHQgPSBkYnggLT4gc3RhYl9zZWN0aW9uX2luZm87CisJCSAgZGJ4IC0+IHN0YWJfc2VjdGlvbl9pbmZvID0gc2VjdGluZm87CisJCSAgc2VjdGluZm8gPSBOVUxMOworCQl9CisJICAgICAgZmlsZXN5bSA9IHN5bTsKKyNpZmRlZiBTT0ZVTl9BRERSRVNTX01BWUJFX01JU1NJTkcKKwkgICAgICBmaWxlc3ltbmFtZSA9CisJCW9ic2F2ZXN0cmluZyAoKGNoYXIgKilmaWxlc3ltLT5uYW1lLCBzdHJsZW4gKGZpbGVzeW0tPm5hbWUpLAorCQkJICAgICAgJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrKTsKKyNlbmRpZgorCSAgICB9CisJICBlbHNlIGlmIChzeW0gLT4gZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9MT0NBTCB8IEJTRl9XRUFLKSkKKwkgICAgeworCSAgICAgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bTsKKworCSAgICAgIC8qIFNlbGVjdCBnbG9iYWwvbG9jYWwvd2VhayBzeW1ib2xzLiAgTm90ZSB0aGF0IGJmZCBwdXRzIGFicworCQkgc3ltYm9scyBpbiB0aGVpciBvd24gc2VjdGlvbiwgc28gYWxsIHN5bWJvbHMgd2UgYXJlCisJCSBpbnRlcmVzdGVkIGluIHdpbGwgaGF2ZSBhIHNlY3Rpb24uICovCisJICAgICAgLyogQmZkIHN5bWJvbHMgYXJlIHNlY3Rpb24gcmVsYXRpdmUuICovCisJICAgICAgc3ltYWRkciA9IHN5bSAtPiB2YWx1ZSArIHN5bSAtPiBzZWN0aW9uIC0+IHZtYTsKKwkgICAgICAvKiBSZWxvY2F0ZSBhbGwgbm9uLWFic29sdXRlIHN5bWJvbHMgYnkgYmFzZSBhZGRyZXNzLiAgKi8KKwkgICAgICBpZiAoc3ltIC0+IHNlY3Rpb24gIT0gJmJmZF9hYnNfc2VjdGlvbikKKwkJeworCQkgIHN5bWFkZHIgKz0gYWRkcjsKKwkJfQorCSAgICAgIC8qIEZvciBub24tYWJzb2x1dGUgc3ltYm9scywgdXNlIHRoZSB0eXBlIG9mIHRoZSBzZWN0aW9uCisJCSB0aGV5IGFyZSByZWxhdGl2ZSB0bywgdG8gaW50dWl0IHRleHQvZGF0YS4gIEJmZCBwcm92aWRlcworCQkgbm8gd2F5IG9mIGZpZ3VyaW5nIHRoaXMgb3V0IGZvciBhYnNvbHV0ZSBzeW1ib2xzLiAqLworCSAgICAgIGlmIChzeW0gLT4gc2VjdGlvbiA9PSAmYmZkX2Fic19zZWN0aW9uKQorCQl7CisJCSAgLyogVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IHRoZSBtaW5pbWFsIHN5bWJvbCB0eXBlCisJCSAgICAgcmlnaHQgZm9yIElyaXggNSwgd2hpY2ggaGFzIGFic29sdXRlIGFkcmVzc2VzCisJCSAgICAgd2l0aCBzcGVjaWFsIHNlY3Rpb24gaW5kaWNlcyBmb3IgZHluYW1pYyBzeW1ib2xzLiAqLworCQkgIHVuc2lnbmVkIHNob3J0IHNobmR4ID0KKwkJICAgICgoZWxmX3N5bWJvbF90eXBlICopIHN5bSktPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHg7CisKKwkJICBzd2l0Y2ggKHNobmR4KQorCQkgICAgeworCQkgICAgY2FzZSBTSE5fTUlQU19URVhUOgorCQkgICAgICBtc190eXBlID0gbXN0X3RleHQ7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSBTSE5fTUlQU19EQVRBOgorCQkgICAgICBtc190eXBlID0gbXN0X2RhdGE7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSBTSE5fTUlQU19BQ09NTU9OOgorCQkgICAgICBtc190eXBlID0gbXN0X2JzczsKKwkJICAgICAgYnJlYWs7CisJCSAgICBkZWZhdWx0OgorCQkgICAgICBtc190eXBlID0gbXN0X2FiczsKKwkJICAgIH0KKworCQkgIC8qIElmIGl0IGlzIGFuIElyaXggZHluYW1pYyBzeW1ib2wsIHNraXAgc2VjdGlvbiBuYW1lCisJCSAgICAgc3ltYm9scywgcmVsb2NhdGUgYWxsIG90aGVycy4gKi8KKwkJICBpZiAobXNfdHlwZSAhPSBtc3RfYWJzKQorCQkgICAgeworCQkgICAgICBpZiAoc3ltLT5uYW1lWzBdID09ICcuJykKKwkJCWNvbnRpbnVlOworCQkgICAgICBzeW1hZGRyICs9IGFkZHI7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlIGlmIChzeW0gLT4gc2VjdGlvbiAtPiBmbGFncyAmIFNFQ19DT0RFKQorCQl7CisJCSAgaWYgKHN5bSAtPiBmbGFncyAmIEJTRl9HTE9CQUwpCisJCSAgICB7CisJCSAgICAgIG1zX3R5cGUgPSBtc3RfdGV4dDsKKwkJICAgIH0KKwkJICBlbHNlIGlmICgoc3ltLT5uYW1lWzBdID09ICcuJyAmJiBzeW0tPm5hbWVbMV0gPT0gJ0wnKQorCQkJICAgfHwgKChzeW0gLT4gZmxhZ3MgJiBCU0ZfTE9DQUwpCisJCQkgICAgICAgJiYgc3ltLT5uYW1lWzBdID09ICckJworCQkJICAgICAgICYmIHN5bS0+bmFtZVsxXSA9PSAnTCcpKQorCQkgICAgLyogTG9va3MgbGlrZSBhIGNvbXBpbGVyLWdlbmVyYXRlZCBsYWJlbC4gIFNraXAgaXQuCisJCSAgICAgICBUaGUgYXNzZW1ibGVyIHNob3VsZCBiZSBza2lwcGluZyB0aGVzZSAodG8ga2VlcAorCQkgICAgICAgZXhlY3V0YWJsZXMgc21hbGwpLCBidXQgYXBwYXJlbnRseSB3aXRoIGdjYyBvbiB0aGUKKwkJICAgICAgIGRlbHRhIG04OGsgU1ZSNCwgaXQgbG9zZXMuICBTbyB0byBoYXZlIHVzIGNoZWNrIHRvbworCQkgICAgICAgc2hvdWxkIGJlIGhhcm1sZXNzIChidXQgSSBlbmNvdXJhZ2UgcGVvcGxlIHRvIGZpeCB0aGlzCisJCSAgICAgICBpbiB0aGUgYXNzZW1ibGVyIGluc3RlYWQgb2YgYWRkaW5nIGNoZWNrcyBoZXJlKS4gICovCisJCSAgICBjb250aW51ZTsKKyNpZmRlZiBIQVJSSVNfVEFSR0VUCisJCSAgZWxzZSBpZiAoc3ltLT5uYW1lWzBdID09ICcuJyAmJiBzeW0tPm5hbWVbMV0gPT0gJy4nKQorCQkgICAgeworCQkgICAgICAvKiBMb29rcyBsaWtlIGEgSGFycmlzIGNvbXBpbGVyIGdlbmVyYXRlZCBsYWJlbCBmb3IgdGhlCisJCQkgcHVycG9zZSBvZiBtYXJraW5nIGluc3RydWN0aW9ucyB0aGF0IGFyZSByZWxldmFudCB0bworCQkJIERXQVJGIGRpZXMuICBUaGUgYXNzZW1ibGVyIGNhbid0IGdldCByaWQgb2YgdGhlc2UgCisJCQkgYmVjYXVzZSB0aGV5IGFyZSByZWxvY2F0YWJsZSBhZGRyZXNzZXMgdGhhdCB0aGUKKwkJCSBsaW5rZXIgbmVlZHMgdG8gcmVzb2x2ZS4gKi8KKwkJICAgICAgY29udGludWU7CisJCSAgICB9CisjZW5kaWYJICAKKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIG1zX3R5cGUgPSBtc3RfZmlsZV90ZXh0OworCQkgICAgfQorCQl9CisJICAgICAgZWxzZSBpZiAoc3ltIC0+IHNlY3Rpb24gLT4gZmxhZ3MgJiBTRUNfQUxMT0MpCisJCXsKKwkJICBpZiAoc3ltIC0+IGZsYWdzICYgQlNGX0dMT0JBTCkKKwkJICAgIHsKKwkJICAgICAgaWYgKHN5bSAtPiBzZWN0aW9uIC0+IGZsYWdzICYgU0VDX0xPQUQpCisJCQl7CisJCQkgIG1zX3R5cGUgPSBtc3RfZGF0YTsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICBtc190eXBlID0gbXN0X2JzczsKKwkJCX0KKwkJICAgIH0KKwkJICBlbHNlIGlmIChzeW0gLT4gZmxhZ3MgJiBCU0ZfTE9DQUwpCisJCSAgICB7CisJCSAgICAgIC8qIE5hbWVkIExvY2FsIHZhcmlhYmxlIGluIGEgRGF0YSBzZWN0aW9uLiAgQ2hlY2sgaXRzCisJCQkgbmFtZSBmb3Igc3RhYnMtaW4tZWxmLiAgVGhlIFNUUkVRIG1hY3JvIGNoZWNrcyB0aGUKKwkJCSBmaXJzdCBjaGFyYWN0ZXIgaW5saW5lLCBzbyB3ZSBvbmx5IGFjdHVhbGx5IGRvIGEKKwkJCSBzdHJjbXAgZnVuY3Rpb24gY2FsbCBvbiBuYW1lcyB0aGF0IHN0YXJ0IHdpdGggJ0InCisJCQkgb3IgJ0QnICovCisJCSAgICAgIGluZGV4ID0gU0VDVF9PRkZfTUFYOworCQkgICAgICBpZiAoU1RSRVEgKCJCYnNzLmJzcyIsIHN5bSAtPiBuYW1lKSkKKwkJCXsKKwkJCSAgaW5kZXggPSBTRUNUX09GRl9CU1M7CisJCQl9CisJCSAgICAgIGVsc2UgaWYgKFNUUkVRICgiRGRhdGEuZGF0YSIsIHN5bSAtPiBuYW1lKSkKKwkJCXsKKwkJCSAgaW5kZXggPSBTRUNUX09GRl9EQVRBOworCQkJfQorCQkgICAgICBlbHNlIGlmIChTVFJFUSAoIkRyb2RhdGEucm9kYXRhIiwgc3ltIC0+IG5hbWUpKQorCQkJeworCQkJICBpbmRleCA9IFNFQ1RfT0ZGX1JPREFUQTsKKwkJCX0KKwkJICAgICAgaWYgKGluZGV4ICE9IFNFQ1RfT0ZGX01BWCkKKwkJCXsKKwkJCSAgLyogRm91bmQgYSBzcGVjaWFsIGxvY2FsIHN5bWJvbC4gIEFsbG9jYXRlIGEKKwkJCSAgICAgc2VjdGluZm8sIGlmIG5lZWRlZCwgYW5kIGZpbGwgaXQgaW4uICAqLworCQkJICBpZiAoc2VjdGluZm8gPT0gTlVMTCkKKwkJCSAgICB7CisJCQkgICAgICBzZWN0aW5mbyA9IChzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKikKKwkJCQl4bW1hbGxvYyAob2JqZmlsZSAtPiBtZCwgc2l6ZW9mICgqc2VjdGluZm8pKTsKKwkJCSAgICAgIG1lbXNldCAoKFBUUikgc2VjdGluZm8sIDAsIHNpemVvZiAoKnNlY3RpbmZvKSk7CisJCQkgICAgICBpZiAoZmlsZXN5bSA9PSBOVUxMKQorCQkJCXsKKwkJCQkgIGNvbXBsYWluICgmc2VjdGlvbl9pbmZvX2NvbXBsYWludCwKKwkJCQkJICAgIHN5bSAtPiBuYW1lKTsKKwkJCQl9CisJCQkgICAgICBlbHNlCisJCQkJeworCQkJCSAgc2VjdGluZm8gLT4gZmlsZW5hbWUgPQorCQkJCSAgICAoY2hhciAqKSBmaWxlc3ltIC0+IG5hbWU7CisJCQkJfQorCQkJICAgIH0KKwkJCSAgaWYgKHNlY3RpbmZvIC0+IHNlY3Rpb25zW2luZGV4XSAhPSAwKQorCQkJICAgIHsKKwkJCSAgICAgIGNvbXBsYWluICgmc2VjdGlvbl9pbmZvX2R1cF9jb21wbGFpbnQsCisJCQkJCXNlY3RpbmZvIC0+IGZpbGVuYW1lKTsKKwkJCSAgICB9CisJCQkgIC8qIEJmZCBzeW1ib2xzIGFyZSBzZWN0aW9uIHJlbGF0aXZlLiAqLworCQkJICBzeW1hZGRyID0gc3ltIC0+IHZhbHVlICsgc3ltIC0+IHNlY3Rpb24gLT4gdm1hOworCQkJICAvKiBSZWxvY2F0ZSBub24tYWJzb2x1dGUgc3ltYm9scyBieSBiYXNlIGFkZHJlc3MuICAqLworCQkJICBpZiAoc3ltIC0+IHNlY3Rpb24gIT0gJmJmZF9hYnNfc2VjdGlvbikKKwkJCSAgICB7CisJCQkgICAgICBzeW1hZGRyICs9IGFkZHI7CisJCQkgICAgfQorCQkJICBzZWN0aW5mbyAtPiBzZWN0aW9uc1tpbmRleF0gPSBzeW1hZGRyOworCQkJICAvKiBUaGUgc3BlY2lhbCBsb2NhbCBzeW1ib2xzIGRvbid0IGdvIGluIHRoZQorCQkJICAgICBtaW5pbWFsIHN5bWJvbCB0YWJsZSwgc28gaWdub3JlIHRoaXMgb25lLiAqLworCQkJICBjb250aW51ZTsKKwkJCX0KKwkJICAgICAgLyogTm90IGEgc3BlY2lhbCBzdGFicy1pbi1lbGYgc3ltYm9sLCBkbyByZWd1bGFyCisJCQkgc3ltYm9sIHByb2Nlc3NpbmcuICovCisJCSAgICAgIGlmIChzeW0gLT4gc2VjdGlvbiAtPiBmbGFncyAmIFNFQ19MT0FEKQorCQkJeworCQkJICBtc190eXBlID0gbXN0X2ZpbGVfZGF0YTsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICBtc190eXBlID0gbXN0X2ZpbGVfYnNzOworCQkJfQorCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgbXNfdHlwZSA9IG1zdF91bmtub3duOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogRklYTUU6ICBTb2xhcmlzMiBzaGFyZWQgbGlicmFyaWVzIGluY2x1ZGUgbG90cyBvZgorCQkgICAgIG9kZCAiYWJzb2x1dGUiIGFuZCAidW5kZWZpbmVkIiBzeW1ib2xzLCB0aGF0IHBsYXkgCisJCSAgICAgaG9iIHdpdGggYWN0aW9ucyBsaWtlIGZpbmRpbmcgd2hhdCBmdW5jdGlvbiB0aGUgUEMKKwkJICAgICBpcyBpbi4gIElnbm9yZSB0aGVtIGlmIHRoZXkgYXJlbid0IHRleHQsIGRhdGEsIG9yIGJzcy4gICovCisJCSAgLyogbXNfdHlwZSA9IG1zdF91bmtub3duOyAqLworCQkgIGNvbnRpbnVlOwkJLyogU2tpcCB0aGlzIHN5bWJvbC4gKi8KKwkJfQorCSAgICAgIC8qIFBhc3Mgc3ltYm9sIHNpemUgZmllbGQgaW4gdmlhIEJGRC4gIEZJWE1FISEhICAqLworCSAgICAgIHNpemUgPSAoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW0pIC0+IGludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZTsKKwkgICAgICBtc3ltID0gcmVjb3JkX21pbmltYWxfc3ltYm9sX2FuZF9pbmZvCisJCSgoY2hhciAqKSBzeW0gLT4gbmFtZSwgc3ltYWRkciwKKwkJIG1zX3R5cGUsIChQVFIpIHNpemUsIHN5bSAtPiBzZWN0aW9uLCBvYmpmaWxlKTsKKyNpZmRlZiBTT0ZVTl9BRERSRVNTX01BWUJFX01JU1NJTkcKKwkgICAgICBpZiAobXN5bSAhPSBOVUxMKQorCQltc3ltLT5maWxlbmFtZSA9IGZpbGVzeW1uYW1lOworI2VuZGlmCisjaWZkZWYgRUxGX01BS0VfTVNZTUJPTF9TUEVDSUFMCisJICAgICAgRUxGX01BS0VfTVNZTUJPTF9TUEVDSUFMKHN5bSxtc3ltKTsKKyNlbmRpZgorCSAgICB9CisJfQorICAgICAgZG9fY2xlYW51cHMgKGJhY2tfdG8pOworICAgIH0KK30KKworLyogU2NhbiBhbmQgYnVpbGQgcGFydGlhbCBzeW1ib2xzIGZvciBhIHN5bWJvbCBmaWxlLgorICAgV2UgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJ5IGEgY2FsbCB0byBlbGZfc3ltZmlsZV9pbml0LCB3aGljaCAKKyAgIGN1cnJlbnRseSBkb2VzIG5vdGhpbmcuCisKKyAgIFNFQ1RJT05fT0ZGU0VUUyBpcyBhIHNldCBvZiBvZmZzZXRzIHRvIGFwcGx5IHRvIHJlbG9jYXRlIHRoZSBzeW1ib2xzCisgICBpbiBlYWNoIHNlY3Rpb24uICBXZSBzaW1wbGlmeSBpdCBkb3duIHRvIGEgc2luZ2xlIG9mZnNldCBmb3IgYWxsCisgICBzeW1ib2xzLiAgRklYTUUuCisKKyAgIE1BSU5MSU5FIGlzIHRydWUgaWYgd2UgYXJlIHJlYWRpbmcgdGhlIG1haW4gc3ltYm9sCisgICB0YWJsZSAoYXMgb3Bwb3NlZCB0byBhIHNoYXJlZCBsaWIgb3IgZHluYW1pY2FsbHkgbG9hZGVkIGZpbGUpLgorCisgICBUaGlzIGZ1bmN0aW9uIG9ubHkgZG9lcyB0aGUgbWluaW11bSB3b3JrIG5lY2Vzc2FyeSBmb3IgbGV0dGluZyB0aGUKKyAgIHVzZXIgIm5hbWUiIHRoaW5ncyBzeW1ib2xpY2FsbHk7IGl0IGRvZXMgbm90IHJlYWQgdGhlIGVudGlyZSBzeW10YWIuCisgICBJbnN0ZWFkLCBpdCByZWFkcyB0aGUgZXh0ZXJuYWwgYW5kIHN0YXRpYyBzeW1ib2xzIGFuZCBwdXRzIHRoZW0gaW4gcGFydGlhbAorICAgc3ltYm9sIHRhYmxlcy4gIFdoZW4gbW9yZSBleHRlbnNpdmUgaW5mb3JtYXRpb24gaXMgcmVxdWVzdGVkIG9mIGEKKyAgIGZpbGUsIHRoZSBjb3JyZXNwb25kaW5nIHBhcnRpYWwgc3ltYm9sIHRhYmxlIGlzIG11dGF0ZWQgaW50byBhIGZ1bGwKKyAgIGZsZWRnZWQgc3ltYm9sIHRhYmxlIGJ5IGdvaW5nIGJhY2sgYW5kIHJlYWRpbmcgdGhlIHN5bWJvbHMKKyAgIGZvciByZWFsLgorCisgICBXZSBsb29rIGZvciBzZWN0aW9ucyB3aXRoIHNwZWNpZmljIG5hbWVzLCB0byB0ZWxsIHVzIHdoYXQgZGVidWcKKyAgIGZvcm1hdCB0byBsb29rIGZvcjogIEZJWE1FISEhCisKKyAgIGR3YXJmX2J1aWxkX3BzeW10YWJzKCkgYnVpbGRzIHBzeW10YWJzIGZvciBEV0FSRiBzeW1ib2xzOworICAgZWxmc3RhYl9idWlsZF9wc3ltdGFicygpIGhhbmRsZXMgU1RBQlMgc3ltYm9sczsKKyAgIG1kZWJ1Z19idWlsZF9wc3ltdGFicygpIGhhbmRsZXMgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLgorCisgICBOb3RlIHRoYXQgRUxGIGZpbGVzIGhhdmUgYSAibWluaW1hbCIgc3ltYm9sIHRhYmxlLCB3aGljaCBsb29rcyBhIGxvdAorICAgbGlrZSBhIENPRkYgc3ltYm9sIHRhYmxlLCBidXQgaGFzIG9ubHkgdGhlIG1pbmltYWwgaW5mb3JtYXRpb24gbmVjZXNzYXJ5CisgICBmb3IgbGlua2luZy4gIFdlIHByb2Nlc3MgdGhpcyBhbHNvLCBhbmQgdXNlIHRoZSBpbmZvcm1hdGlvbiB0bworICAgYnVpbGQgZ2RiJ3MgbWluaW1hbCBzeW1ib2wgdGFibGUuICBUaGlzIGdpdmVzIHVzIHNvbWUgbWluaW1hbCBkZWJ1Z2dpbmcKKyAgIGNhcGFiaWxpdHkgZXZlbiBmb3IgZmlsZXMgY29tcGlsZWQgd2l0aG91dCAtZy4gICovCisKK3N0YXRpYyB2b2lkCitlbGZfc3ltZmlsZV9yZWFkIChvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMsIG1haW5saW5lKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworICAgICBpbnQgbWFpbmxpbmU7Cit7CisgIGJmZCAqYWJmZCA9IG9iamZpbGUtPm9iZmQ7CisgIHN0cnVjdCBlbGZpbmZvIGVpOworICBzdHJ1Y3QgY2xlYW51cCAqYmFja190bzsKKyAgQ09SRV9BRERSIG9mZnNldDsKKworICBpbml0X21pbmltYWxfc3ltYm9sX2NvbGxlY3Rpb24gKCk7CisgIGJhY2tfdG8gPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZGlzY2FyZF9taW5pbWFsX3N5bWJvbHMsIDApOworCisgIG1lbXNldCAoKGNoYXIgKikgJmVpLCAwLCBzaXplb2YgKGVpKSk7CisKKyAgLyogQWxsb2NhdGUgc3RydWN0IHRvIGtlZXAgdHJhY2sgb2YgdGhlIHN5bWZpbGUgKi8KKyAgb2JqZmlsZS0+c3ltX3N0YWJfaW5mbyA9IChzdHJ1Y3QgZGJ4X3N5bWZpbGVfaW5mbyAqKQorICAgIHhtbWFsbG9jIChvYmpmaWxlIC0+IG1kLCBzaXplb2YgKHN0cnVjdCBkYnhfc3ltZmlsZV9pbmZvKSk7CisgIG1lbXNldCAoKGNoYXIgKikgb2JqZmlsZS0+c3ltX3N0YWJfaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3QgZGJ4X3N5bWZpbGVfaW5mbykpOworICBtYWtlX2NsZWFudXAgKGZyZWVfZWxmaW5mbywgKFBUUikgb2JqZmlsZSk7CisKKyAgLyogUHJvY2VzcyB0aGUgbm9ybWFsIEVMRiBzeW1ib2wgdGFibGUgZmlyc3QuICBUaGlzIG1heSB3cml0ZSBzb21lIAorICAgICBjaGFpbiBvZiBpbmZvIGludG8gdGhlIGRieF9zeW1maWxlX2luZm8gaW4gb2JqZmlsZS0+c3ltX3N0YWJfaW5mbywKKyAgICAgd2hpY2ggY2FuIGxhdGVyIGJlIHVzZWQgYnkgZWxmc3RhYl9vZmZzZXRfc2VjdGlvbnMuICAqLworCisgIC8qIEZJWE1FLCBzaG91bGQgdGFrZSBhIHNlY3Rpb25fb2Zmc2V0cyBwYXJhbSwgbm90IGp1c3QgYW4gb2Zmc2V0LiAgKi8KKyAgb2Zmc2V0ID0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgMCk7CisgIGVsZl9zeW10YWJfcmVhZCAoYWJmZCwgb2Zmc2V0LCBvYmpmaWxlLCAwKTsKKworICAvKiBBZGQgdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCisKKyAgZWxmX3N5bXRhYl9yZWFkIChhYmZkLCBvZmZzZXQsIG9iamZpbGUsIDEpOworCisgIC8qIE5vdyBwcm9jZXNzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgd2hpY2ggaXMgY29udGFpbmVkIGluCisgICAgIHNwZWNpYWwgRUxGIHNlY3Rpb25zLiAqLworCisgIC8qIElmIHdlIGFyZSByZWluaXRpYWxpemluZywgb3IgaWYgd2UgaGF2ZSBuZXZlciBsb2FkZWQgc3ltcyB5ZXQsCisgICAgIHNldCB0YWJsZSB0byBlbXB0eS4gIE1BSU5MSU5FIGlzIGNsZWFyZWQgc28gdGhhdCAqX3JlYWRfcHN5bXRhYgorICAgICBmdW5jdGlvbnMgZG8gbm90IGFsbCBhbHNvIHJlLWluaXRpYWxpemUgdGhlIHBzeW1ib2wgdGFibGUuICovCisgIGlmIChtYWlubGluZSkKKyAgICB7CisgICAgICBpbml0X3BzeW1ib2xfbGlzdCAob2JqZmlsZSwgMCk7CisgICAgICBtYWlubGluZSA9IDA7CisgICAgfQorCisgIC8qIFdlIGZpcnN0IGhhdmUgdG8gZmluZCB0aGVtLi4uICovCisgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgZWxmX2xvY2F0ZV9zZWN0aW9ucywgKFBUUikgJmVpKTsKKworICAvKiBFTEYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIGluc2VydGVkIGludG8gdGhlIHBzeW10YWIgaW4gdGhlCisgICAgIG9yZGVyIG9mIGxlYXN0IGluZm9ybWF0aXZlIGZpcnN0IC0gbW9zdCBpbmZvcm1hdGl2ZSBsYXN0LiAgU2luY2UKKyAgICAgdGhlIHBzeW10YWIgdGFibGUgaXMgc2VhcmNoZWQgYG1vc3QgcmVjZW50IGluc2VydGlvbiBmaXJzdCcgdGhpcworICAgICBpbmNyZWFzZXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgbW9yZSBkZXRhaWxlZCBkZWJ1ZyBpbmZvcm1hdGlvbgorICAgICBmb3IgYSBzZWN0aW9uIGlzIGZvdW5kLgorCisgICAgIEZvciBpbnN0YW5jZSwgYW4gb2JqZWN0IGZpbGUgbWlnaHQgY29udGFpbiBib3RoIC5tZGVidWcgKFhDT0ZGKQorICAgICBhbmQgLmRlYnVnX2luZm8gKERXQVJGMikgc2VjdGlvbnMgdGhlbiAubWRlYnVnIGlzIGluc2VydGVkIGZpcnN0CisgICAgIChzZWFyY2hlZCBsYXN0KSBhbmQgRFdBUkYyIGlzIGluc2VydGVkIGxhc3QgKHNlYXJjaGVkIGZpcnN0KS4gIElmCisgICAgIHdlIGRvbid0IGRvIHRoaXMgdGhlbiB0aGUgWENPRkYgaW5mbyBpcyBmb3VuZCBmaXJzdCAtIGZvciBjb2RlIGluCisgICAgIGFuIGluY2x1ZGVkIGZpbGUgWENPRkYgaW5mbyBpcyB1c2VsZXNzLiAqLworCisgIGlmIChlaS5tZGVidWdzZWN0KQorICAgIHsKKyAgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOworCisgICAgICAvKiAubWRlYnVnIHNlY3Rpb24sIHByZXN1bWFibHkgaG9sZGluZyBFQ09GRiBkZWJ1Z2dpbmcKKwkgaW5mb3JtYXRpb24uICAqLworICAgICAgc3dhcCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKKyAgICAgIGlmIChzd2FwKQorCWVsZm1kZWJ1Z19idWlsZF9wc3ltdGFicyAob2JqZmlsZSwgc3dhcCwgZWkubWRlYnVnc2VjdCwKKwkJCQkgIHNlY3Rpb25fb2Zmc2V0cyk7CisgICAgfQorICBpZiAoZWkuc3RhYnNlY3QpCisgICAgeworICAgICAgYXNlY3Rpb24gKnN0cl9zZWN0OworCisgICAgICAvKiBTdGFiIHNlY3Rpb25zIGhhdmUgYW4gYXNzb2NpYXRlZCBzdHJpbmcgdGFibGUgdGhhdCBsb29rcyBsaWtlCisJIGEgc2VwYXJhdGUgc2VjdGlvbi4gICovCisgICAgICBzdHJfc2VjdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWJzdHIiKTsKKworICAgICAgLyogRklYTUUgc2hvdWxkIHByb2JhYmx5IHdhcm4gYWJvdXQgYSBzdGFiIHNlY3Rpb24gd2l0aG91dCBhIHN0YWJzdHIuICAqLworICAgICAgaWYgKHN0cl9zZWN0KQorCWVsZnN0YWJfYnVpbGRfcHN5bXRhYnMgKG9iamZpbGUsCisJCQkJc2VjdGlvbl9vZmZzZXRzLAorCQkJCW1haW5saW5lLAorCQkJCWVpLnN0YWJzZWN0LT5maWxlcG9zLAorCQkJCWJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGVpLnN0YWJzZWN0KSwKKwkJCQlzdHJfc2VjdC0+ZmlsZXBvcywKKwkJCQliZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdHJfc2VjdCkpOworICAgIH0KKyAgaWYgKGR3YXJmMl9oYXNfaW5mbyAoYWJmZCkpCisgICAgeworICAgICAgLyogRFdBUkYgMiBzZWN0aW9ucyAqLworICAgICAgZHdhcmYyX2J1aWxkX3BzeW10YWJzIChvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMsIG1haW5saW5lKTsKKyAgICB9CisgIGVsc2UgaWYgKGVpLmRib2Zmc2V0ICYmIGVpLmxub2Zmc2V0KQorICAgIHsKKyAgICAgIC8qIERXQVJGIHNlY3Rpb25zICovCisgICAgICBkd2FyZl9idWlsZF9wc3ltdGFicyAob2JqZmlsZSwKKwkJCSAgICBzZWN0aW9uX29mZnNldHMsIG1haW5saW5lLAorCQkJICAgIGVpLmRib2Zmc2V0LCBlaS5kYnNpemUsCisJCQkgICAgZWkubG5vZmZzZXQsIGVpLmxuc2l6ZSk7CisgICAgfQorCisgIC8qIEluc3RhbGwgYW55IG1pbmltYWwgc3ltYm9scyB0aGF0IGhhdmUgYmVlbiBjb2xsZWN0ZWQgYXMgdGhlIGN1cnJlbnQKKyAgICAgbWluaW1hbCBzeW1ib2xzIGZvciB0aGlzIG9iamZpbGUuICovCisKKyAgaW5zdGFsbF9taW5pbWFsX3N5bWJvbHMgKG9iamZpbGUpOworCisgIGRvX2NsZWFudXBzIChiYWNrX3RvKTsKK30KKworLyogVGhpcyBjbGVhbnMgdXAgdGhlIG9iamZpbGUncyBzeW1fc3RhYl9pbmZvIHBvaW50ZXIsIGFuZCB0aGUgY2hhaW4gb2YKKyAgIHN0YWJfc2VjdGlvbl9pbmZvJ3MsIHRoYXQgbWlnaHQgYmUgZGFuZ2xpbmcgZnJvbSBpdC4gICovCisKK3N0YXRpYyB2b2lkCitmcmVlX2VsZmluZm8gKG9ianApCisgICAgIFBUUiBvYmpwOworeworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSA9IChzdHJ1Y3Qgb2JqZmlsZSAqKW9ianA7CisgIHN0cnVjdCBkYnhfc3ltZmlsZV9pbmZvICpkYnhpbmZvID0gb2JqZmlsZS0+c3ltX3N0YWJfaW5mbzsKKyAgc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICpzc2ksICpuc3NpOworCisgIHNzaSA9IGRieGluZm8tPnN0YWJfc2VjdGlvbl9pbmZvOworICB3aGlsZSAoc3NpKQorICAgIHsKKyAgICAgIG5zc2kgPSBzc2ktPm5leHQ7CisgICAgICBtZnJlZSAob2JqZmlsZS0+bWQsIHNzaSk7CisgICAgICBzc2kgPSBuc3NpOworICAgIH0KKworICBkYnhpbmZvLT5zdGFiX3NlY3Rpb25faW5mbyA9IDA7CS8qIEp1c3Qgc2F5IE5vIG1vIGluZm8gYWJvdXQgdGhpcy4gICovCit9CisKKworLyogSW5pdGlhbGl6ZSBhbnl0aGluZyB0aGF0IG5lZWRzIGluaXRpYWxpemluZyB3aGVuIGEgY29tcGxldGVseSBuZXcgc3ltYm9sCisgICBmaWxlIGlzIHNwZWNpZmllZCAobm90IGp1c3QgYWRkaW5nIHNvbWUgc3ltYm9scyBmcm9tIGFub3RoZXIgZmlsZSwgZS5nLiBhCisgICBzaGFyZWQgbGlicmFyeSkuCisKKyAgIFdlIHJlaW5pdGlhbGl6ZSBidWlsZHN5bSwgc2luY2Ugd2UgbWF5IGJlIHJlYWRpbmcgc3RhYnMgZnJvbSBhbiBFTEYgZmlsZS4gICovCisKK3N0YXRpYyB2b2lkCitlbGZfbmV3X2luaXQgKGlnbm9yZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKmlnbm9yZTsKK3sKKyAgc3RhYnNyZWFkX25ld19pbml0ICgpOworICBidWlsZHN5bV9uZXdfaW5pdCAoKTsKK30KKworLyogUGVyZm9ybSBhbnkgbG9jYWwgY2xlYW51cHMgcmVxdWlyZWQgd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIGEgcGFydGljdWxhcgorICAgb2JqZmlsZS4gIEkuRSwgd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGRpc2NhcmRpbmcgYWxsIHN5bWJvbCBpbmZvcm1hdGlvbgorICAgZm9yIGFuIG9iamZpbGUsIGZyZWVpbmcgdXAgYWxsIG1lbW9yeSBoZWxkIGZvciBpdCwgYW5kIHVubGlua2luZyB0aGUKKyAgIG9iamZpbGUgc3RydWN0IGZyb20gdGhlIGdsb2JhbCBsaXN0IG9mIGtub3duIG9iamZpbGVzLiAqLworCitzdGF0aWMgdm9pZAorZWxmX3N5bWZpbGVfZmluaXNoIChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaWYgKG9iamZpbGUgLT4gc3ltX3N0YWJfaW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgIG1mcmVlIChvYmpmaWxlIC0+IG1kLCBvYmpmaWxlIC0+IHN5bV9zdGFiX2luZm8pOworICAgIH0KK30KKworLyogRUxGIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIHJlYWRpbmcgc3ltYm9scy4KKworICAgSXQgaXMgcGFzc2VkIGEgcG9pbnRlciB0byBhIHN0cnVjdCBzeW1fZm5zIHdoaWNoIGNvbnRhaW5zLCBhbW9uZyBvdGhlcgorICAgdGhpbmdzLCB0aGUgQkZEIGZvciB0aGUgZmlsZSB3aG9zZSBzeW1ib2xzIGFyZSBiZWluZyByZWFkLCBhbmQgYSBzbG90IGZvcgorICAgYSBwb2ludGVyIHRvICJwcml2YXRlIGRhdGEiIHdoaWNoIHdlIGNhbiBmaWxsIHdpdGggZ29vZGllcy4KKworICAgRm9yIG5vdyBhdCBsZWFzdCwgd2UgaGF2ZSBub3RoaW5nIGluIHBhcnRpY3VsYXIgdG8gZG8sIHNvIHRoaXMgZnVuY3Rpb24gaXMKKyAgIGp1c3QgYSBzdHViLiAqLworCitzdGF0aWMgdm9pZAorZWxmX3N5bWZpbGVfaW5pdCAob2JqZmlsZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIC8qIEVMRiBvYmplY3RzIG1heSBiZSByZW9yZGVyZWQsIHNvIHNldCBPQkpGX1JFT1JERVJFRC4gIElmIHdlCisgICAgIGZpbmQgdGhpcyBjYXVzZXMgYSBzaWduaWZpY2FudCBzbG93ZG93biBpbiBnZGIgdGhlbiB3ZSBjb3VsZAorICAgICBzZXQgaXQgaW4gdGhlIGRlYnVnIHN5bWJvbCByZWFkZXJzIG9ubHkgd2hlbiBuZWNlc3NhcnkuICAqLworICBvYmpmaWxlLT5mbGFncyB8PSBPQkpGX1JFT1JERVJFRDsKK30KKworLyogV2hlbiBoYW5kbGluZyBhbiBFTEYgZmlsZSB0aGF0IGNvbnRhaW5zIFN1biBTVEFCUyBkZWJ1ZyBpbmZvLAorICAgc29tZSBvZiB0aGUgZGVidWcgaW5mbyBpcyByZWxhdGl2ZSB0byB0aGUgcGFydGljdWxhciBjaHVuayBvZiB0aGUKKyAgIHNlY3Rpb24gdGhhdCB3YXMgZ2VuZXJhdGVkIGluIGl0cyBpbmRpdmlkdWFsIC5vIGZpbGUuICBFLmcuCisgICBvZmZzZXRzIHRvIHN0YXRpYyB2YXJpYWJsZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgZGF0YQorICAgc2VnbWVudCAqZm9yIHRoYXQgbW9kdWxlIGJlZm9yZSBsaW5raW5nKi4gIFRoaXMgaW5mb3JtYXRpb24gaXMKKyAgIHBhaW5mdWxseSBzcXVpcnJlbGVkIGF3YXkgaW4gdGhlIEVMRiBzeW1ib2wgdGFibGUgYXMgbG9jYWwgc3ltYm9scworICAgd2l0aCB3aWVyZCBuYW1lcy4gIEdvIGdldCAnZW0gd2hlbiBuZWVkZWQuICAqLworCit2b2lkCitlbGZzdGFiX29mZnNldF9zZWN0aW9ucyAob2JqZmlsZSwgcHN0KQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7Cit7CisgIGNoYXIgKmZpbGVuYW1lID0gcHN0LT5maWxlbmFtZTsKKyAgc3RydWN0IGRieF9zeW1maWxlX2luZm8gKmRieCA9IG9iamZpbGUtPnN5bV9zdGFiX2luZm87CisgIHN0cnVjdCBzdGFiX3NlY3Rpb25faW5mbyAqbWF5YmUgPSBkYngtPnN0YWJfc2VjdGlvbl9pbmZvOworICBzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKnF1ZXN0aW9uYWJsZSA9IDA7CisgIGludCBpOworICBjaGFyICpwOworCisgIC8qIFRoZSBFTEYgc3ltYm9sIGluZm8gZG9lc24ndCBpbmNsdWRlIHBhdGggbmFtZXMsIHNvIHN0cmlwIHRoZSBwYXRoCisgICAgIChpZiBhbnkpIGZyb20gdGhlIHBzeW10YWIgZmlsZW5hbWUuICAqLworICB3aGlsZSAoMCAhPSAocCA9IHN0cmNociAoZmlsZW5hbWUsICcvJykpKQorICAgIGZpbGVuYW1lID0gcCsxOworCisgIC8qIEZJWE1FOiAgVGhpcyBsaW5lYXIgc2VhcmNoIGNvdWxkIHNwZWVkIHVwIHNpZ25pZmljYW50bHkKKyAgICAgaWYgaXQgd2FzIGNoYWluZWQgaW4gdGhlIHJpZ2h0IG9yZGVyIHRvIG1hdGNoIGhvdyB3ZSBzZWFyY2ggaXQsCisgICAgIGFuZCBpZiB3ZSB1bmNoYWluZWQgd2hlbiB3ZSBmb3VuZCBhIG1hdGNoLiAqLworICBmb3IgKDsgbWF5YmU7IG1heWJlID0gbWF5YmUtPm5leHQpCisgICAgeworICAgICAgaWYgKGZpbGVuYW1lWzBdID09IG1heWJlLT5maWxlbmFtZVswXQorCSAgJiYgU1RSRVEgKGZpbGVuYW1lLCBtYXliZS0+ZmlsZW5hbWUpKQorCXsKKwkgIC8qIFdlIGZvdW5kIGEgbWF0Y2guICBCdXQgdGhlcmUgbWlnaHQgYmUgc2V2ZXJhbCBzb3VyY2UgZmlsZXMKKwkgICAgIChmcm9tIGRpZmZlcmVudCBkaXJlY3Rvcmllcykgd2l0aCB0aGUgc2FtZSBuYW1lLiAgKi8KKwkgIGlmICgwID09IG1heWJlLT5mb3VuZCkKKwkgICAgYnJlYWs7CisJICBxdWVzdGlvbmFibGUgPSBtYXliZTsJCS8qIE1pZ2h0IHVzZSBpdCBsYXRlci4gICovCisJfQorICAgIH0KKworICBpZiAobWF5YmUgPT0gMCAmJiBxdWVzdGlvbmFibGUgIT0gMCkKKyAgICB7CisgICAgICBjb21wbGFpbiAoJnN0YWJfaW5mb19xdWVzdGlvbmFibGVfY29tcGxhaW50LCBmaWxlbmFtZSk7CisgICAgICBtYXliZSA9IHF1ZXN0aW9uYWJsZTsKKyAgICB9CisKKyAgaWYgKG1heWJlKQorICAgIHsKKyAgICAgIC8qIEZvdW5kIGl0ISAgQWxsb2NhdGUgYSBuZXcgcHN5bXRhYiBzdHJ1Y3QsIGFuZCBmaWxsIGl0IGluLiAgKi8KKyAgICAgIG1heWJlLT5mb3VuZCsrOworICAgICAgcHN0LT5zZWN0aW9uX29mZnNldHMgPSAoc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqKQorCW9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlIC0+IHBzeW1ib2xfb2JzdGFjaywKKwkJICAgICAgIHNpemVvZiAoc3RydWN0IHNlY3Rpb25fb2Zmc2V0cykgKworCSAgICAgICBzaXplb2YgKHBzdC0+c2VjdGlvbl9vZmZzZXRzLT5vZmZzZXRzKSAqIChTRUNUX09GRl9NQVgtMSkpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgU0VDVF9PRkZfTUFYOyBpKyspCisJQU5PRkZTRVQgKHBzdC0+c2VjdGlvbl9vZmZzZXRzLCBpKSA9IG1heWJlLT5zZWN0aW9uc1tpXTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogV2Ugd2VyZSB1bmFibGUgdG8gZmluZCBhbnkgb2Zmc2V0cyBmb3IgdGhpcyBmaWxlLiAgQ29tcGxhaW4uICAqLworICBpZiAoZGJ4LT5zdGFiX3NlY3Rpb25faW5mbykJCS8qIElmIHRoZXJlICppcyogYW55IGluZm8sICovCisgICAgY29tcGxhaW4gKCZzdGFiX2luZm9fbWlzbWF0Y2hfY29tcGxhaW50LCBmaWxlbmFtZSk7Cit9CisMCisvKiBSZWdpc3RlciB0aGF0IHdlIGFyZSBhYmxlIHRvIGhhbmRsZSBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0cy4gICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3ltX2ZucyBlbGZfc3ltX2ZucyA9Cit7CisgIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIsCisgIGVsZl9uZXdfaW5pdCwJCS8qIHN5bV9uZXdfaW5pdDogaW5pdCBhbnl0aGluZyBnYmwgdG8gZW50aXJlIHN5bXRhYiAqLworICBlbGZfc3ltZmlsZV9pbml0LAkvKiBzeW1faW5pdDogcmVhZCBpbml0aWFsIGluZm8sIHNldHVwIGZvciBzeW1fcmVhZCgpICovCisgIGVsZl9zeW1maWxlX3JlYWQsCS8qIHN5bV9yZWFkOiByZWFkIGEgc3ltYm9sIGZpbGUgaW50byBzeW10YWIgKi8KKyAgZWxmX3N5bWZpbGVfZmluaXNoLAkvKiBzeW1fZmluaXNoOiBmaW5pc2hlZCB3aXRoIGZpbGUsIGNsZWFudXAgKi8KKyAgZGVmYXVsdF9zeW1maWxlX29mZnNldHMsCisJCQkvKiBzeW1fb2Zmc2V0czogIFRyYW5zbGF0ZSBleHQuIHRvIGludC4gcmVsb2NhdGlvbiAqLworICBOVUxMCQkJLyogbmV4dDogcG9pbnRlciB0byBuZXh0IHN0cnVjdCBzeW1fZm5zICovCit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9lbGZyZWFkICgpCit7CisgIGFkZF9zeW10YWJfZm5zICgmZWxmX3N5bV9mbnMpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2Vudmlyb24uYyBiL2dkYi9lbnZpcm9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyOTZiZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9lbnZpcm9uLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qIGVudmlyb24uYyAtLSBsaWJyYXJ5IGZvciBtYW5pcHVsYXRpbmcgZW52aXJvbm1lbnRzIGZvciBHTlUuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgbWluKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIG1heChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImVudmlyb24uaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorCisMCisvKiBSZXR1cm4gYSBuZXcgZW52aXJvbm1lbnQgb2JqZWN0LiAgKi8KKworc3RydWN0IGVudmlyb24gKgorbWFrZV9lbnZpcm9uICgpCit7CisgIHJlZ2lzdGVyIHN0cnVjdCBlbnZpcm9uICplOworCisgIGUgPSAoc3RydWN0IGVudmlyb24gKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZW52aXJvbikpOworCisgIGUtPmFsbG9jYXRlZCA9IDEwOworICBlLT52ZWN0b3IgPSAoY2hhciAqKikgeG1hbGxvYyAoKGUtPmFsbG9jYXRlZCArIDEpICogc2l6ZW9mIChjaGFyICopKTsKKyAgZS0+dmVjdG9yWzBdID0gMDsKKyAgcmV0dXJuIGU7Cit9CisKKy8qIEZyZWUgYW4gZW52aXJvbm1lbnQgYW5kIGFsbCB0aGUgc3RyaW5ncyBpbiBpdC4gICovCisKK3ZvaWQKK2ZyZWVfZW52aXJvbiAoZSkKKyAgICAgcmVnaXN0ZXIgc3RydWN0IGVudmlyb24gKmU7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKip2ZWN0b3IgPSBlLT52ZWN0b3I7CisKKyAgd2hpbGUgKCp2ZWN0b3IpCisgICAgZnJlZSAoKnZlY3RvcisrKTsKKworICBmcmVlIChlKTsKK30KKworLyogQ29weSB0aGUgZW52aXJvbm1lbnQgZ2l2ZW4gdG8gdGhpcyBwcm9jZXNzIGludG8gRS4KKyAgIEFsc28gY29waWVzIGFsbCB0aGUgc3RyaW5ncyBpbiBpdCwgc28gd2UgY2FuIGJlIHN1cmUKKyAgIHRoYXQgYWxsIHN0cmluZ3MgaW4gdGhlc2UgZW52aXJvbm1lbnRzIGFyZSBzYWZlIHRvIGZyZWUuICAqLworCit2b2lkCitpbml0X2Vudmlyb24gKGUpCisgICAgIHJlZ2lzdGVyIHN0cnVjdCBlbnZpcm9uICplOworeworICBleHRlcm4gY2hhciAqKmVudmlyb247CisgIHJlZ2lzdGVyIGludCBpOworCisgIGlmIChlbnZpcm9uID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGZvciAoaSA9IDA7IGVudmlyb25baV07IGkrKykgLypFTVBUWSovOworCisgIGlmIChlLT5hbGxvY2F0ZWQgPCBpKQorICAgIHsKKyAgICAgIGUtPmFsbG9jYXRlZCA9IG1heCAoaSwgZS0+YWxsb2NhdGVkICsgMTApOworICAgICAgZS0+dmVjdG9yID0gKGNoYXIgKiopIHhyZWFsbG9jICgoY2hhciAqKWUtPnZlY3RvciwKKwkJCQkgICAgICAoZS0+YWxsb2NhdGVkICsgMSkgKiBzaXplb2YgKGNoYXIgKikpOworICAgIH0KKworICBtZW1jcHkgKGUtPnZlY3RvciwgZW52aXJvbiwgKGkgKyAxKSAqIHNpemVvZiAoY2hhciAqKSk7CisKKyAgd2hpbGUgKC0taSA+PSAwKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIGludCBsZW4gPSBzdHJsZW4gKGUtPnZlY3RvcltpXSk7CisgICAgICByZWdpc3RlciBjaGFyICpuZXcgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKKyAgICAgIG1lbWNweSAobmV3LCBlLT52ZWN0b3JbaV0sIGxlbiArIDEpOworICAgICAgZS0+dmVjdG9yW2ldID0gbmV3OworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSB2ZWN0b3Igb2YgZW52aXJvbm1lbnQgRS4KKyAgIFRoaXMgaXMgdXNlZCB0byBnZXQgc29tZXRoaW5nIHRvIHBhc3MgdG8gZXhlY3ZlLiAgKi8KKworY2hhciAqKgorZW52aXJvbl92ZWN0b3IgKGUpCisgICAgIHN0cnVjdCBlbnZpcm9uICplOworeworICByZXR1cm4gZS0+dmVjdG9yOworfQorDAorLyogUmV0dXJuIHRoZSB2YWx1ZSBpbiBlbnZpcm9ubWVudCBFIG9mIHZhcmlhYmxlIFZBUi4gICovCisKK2NoYXIgKgorZ2V0X2luX2Vudmlyb24gKGUsIHZhcikKKyAgICAgY29uc3Qgc3RydWN0IGVudmlyb24gKmU7CisgICAgIGNvbnN0IGNoYXIgKnZhcjsKK3sKKyAgcmVnaXN0ZXIgaW50IGxlbiA9IHN0cmxlbiAodmFyKTsKKyAgcmVnaXN0ZXIgY2hhciAqKnZlY3RvciA9IGUtPnZlY3RvcjsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKworICBmb3IgKDsgKHMgPSAqdmVjdG9yKSAhPSBOVUxMOyB2ZWN0b3IrKykKKyAgICBpZiAoU1RSRVFOIChzLCB2YXIsIGxlbikgJiYgc1tsZW5dID09ICc9JykKKyAgICAgIHJldHVybiAmc1tsZW4gKyAxXTsKKworICByZXR1cm4gMDsKK30KKworLyogU3RvcmUgdGhlIHZhbHVlIGluIEUgb2YgVkFSIGFzIFZBTFVFLiAgKi8KKwordm9pZAorc2V0X2luX2Vudmlyb24gKGUsIHZhciwgdmFsdWUpCisgICAgIHN0cnVjdCBlbnZpcm9uICplOworICAgICBjb25zdCBjaGFyICp2YXI7CisgICAgIGNvbnN0IGNoYXIgKnZhbHVlOworeworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgaW50IGxlbiA9IHN0cmxlbiAodmFyKTsKKyAgcmVnaXN0ZXIgY2hhciAqKnZlY3RvciA9IGUtPnZlY3RvcjsKKyAgcmVnaXN0ZXIgY2hhciAqczsKKworICBmb3IgKGkgPSAwOyAocyA9IHZlY3RvcltpXSkgIT0gTlVMTDsgaSsrKQorICAgIGlmIChTVFJFUU4gKHMsIHZhciwgbGVuKSAmJiBzW2xlbl0gPT0gJz0nKQorICAgICAgYnJlYWs7CisKKyAgaWYgKHMgPT0gMCkKKyAgICB7CisgICAgICBpZiAoaSA9PSBlLT5hbGxvY2F0ZWQpCisJeworCSAgZS0+YWxsb2NhdGVkICs9IDEwOworCSAgdmVjdG9yID0gKGNoYXIgKiopIHhyZWFsbG9jICgoY2hhciAqKXZlY3RvciwKKwkJCQkgICAgICAgKGUtPmFsbG9jYXRlZCArIDEpICogc2l6ZW9mIChjaGFyICopKTsKKwkgIGUtPnZlY3RvciA9IHZlY3RvcjsKKwl9CisgICAgICB2ZWN0b3JbaSArIDFdID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICBmcmVlIChzKTsKKworICBzID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgc3RybGVuICh2YWx1ZSkgKyAyKTsKKyAgc3RyY3B5IChzLCB2YXIpOworICBzdHJjYXQgKHMsICI9Iik7CisgIHN0cmNhdCAocywgdmFsdWUpOworICB2ZWN0b3JbaV0gPSBzOworCisgIC8qIFRoaXMgdXNlZCB0byBoYW5kbGUgc2V0dGluZyB0aGUgUEFUSCBhbmQgR05VVEFSR0VUIHZhcmlhYmxlcworICAgICBzcGVjaWFsbHkuICBUaGUgbGF0dGVyIGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICJzZXQgZ251dGFyZ2V0IgorICAgICAod2hpY2ggaGFzIHdvcmtlZCBzaW5jZSBHREIgNC4xMSkuICBUaGUgZm9ybWVyIGFmZmVjdHMgc2VhcmNoaW5nCisgICAgIHRoZSBQQVRIIHRvIGZpbmQgU0hFTEwsIGFuZCBzZWFyY2hpbmcgdGhlIFBBVEggdG8gZmluZCB0aGUKKyAgICAgYXJndW1lbnQgb2YgInN5bWJvbC1maWxlIiBvciAiZXhlYy1maWxlIi4gIE1heWJlIHdlIHNob3VsZCBoYXZlCisgICAgIHNvbWUga2luZCBvZiAic2V0IGV4ZWMtcGF0aCIgZm9yIHRoYXQuICBCdXQgaW4gYW55IGV2ZW50LCBoYXZpbmcKKyAgICAgInNldCBlbnYiIGFmZmVjdCBhbnl0aGluZyBiZXNpZGVzIHRoZSBpbmZlcmlvciBpcyBhIGJhZCBpZGVhLgorICAgICBXaGF0IGlmIHdlIHdhbnQgdG8gY2hhbmdlIHRoZSBlbnZpcm9ubWVudCB3ZSBwYXNzIHRvIHRoZSBwcm9ncmFtCisgICAgIHdpdGhvdXQgYWZlY3RpbmcgR0RCJ3MgYmVoYXZpb3I/ICAqLworCisgIHJldHVybjsKK30KKworLyogUmVtb3ZlIHRoZSBzZXR0aW5nIGZvciB2YXJpYWJsZSBWQVIgZnJvbSBlbnZpcm9ubWVudCBFLiAgKi8KKwordm9pZAordW5zZXRfaW5fZW52aXJvbiAoZSwgdmFyKQorICAgICBzdHJ1Y3QgZW52aXJvbiAqZTsKKyAgICAgY2hhciAqdmFyOworeworICByZWdpc3RlciBpbnQgbGVuID0gc3RybGVuICh2YXIpOworICByZWdpc3RlciBjaGFyICoqdmVjdG9yID0gZS0+dmVjdG9yOworICByZWdpc3RlciBjaGFyICpzOworCisgIGZvciAoOyAocyA9ICp2ZWN0b3IpICE9IE5VTEw7IHZlY3RvcisrKQorICAgIHsKKyAgICAgIGlmIChTVFJFUU4gKHMsIHZhciwgbGVuKSAmJiBzW2xlbl0gPT0gJz0nKQorCXsKKwkgIGZyZWUgKHMpOworCSAgLyogV2FsayB0aHJvdWdoIHRoZSB2ZWN0b3IsIHNodWZmbGluZyBhcmdzIGRvd24gYnkgb25lLCBpbmNsdWRpbmcKKwkgICAgIHRoZSBOVUxMIHRlcm1pbmF0b3IuICBDYW4ndCB1c2UgbWVtY3B5KCkgaGVyZSBzaW5jZSB0aGUgcmVnaW9ucworCSAgICAgb3ZlcmxhcCwgYW5kIG1lbW1vdmUoKSBtaWdodCBub3QgYmUgYXZhaWxhYmxlLiAqLworCSAgd2hpbGUgKCh2ZWN0b3JbMF0gPSB2ZWN0b3JbMV0pICE9IE5VTEwpCisJICAgIHsKKwkgICAgICB2ZWN0b3IrKzsKKwkgICAgfQorCSAgYnJlYWs7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dkYi9lbnZpcm9uLmggYi9nZGIvZW52aXJvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YTUzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZW52aXJvbi5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIEhlYWRlciBmb3IgZW52aXJvbm1lbnQgbWFuaXB1bGF0aW9uIGxpYnJhcnkuCisgICBDb3B5cmlnaHQgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCAoRU5WSVJPTl9IKQorI2RlZmluZSBFTlZJUk9OX0ggMQorCisvKiBXZSBtYW5pcHVsYXRlIGVudmlyb25tZW50cyByZXByZXNlbnRlZCBhcyB0aGVzZSBzdHJ1Y3R1cmVzLiAgKi8KKworc3RydWN0IGVudmlyb24KK3sKKyAgLyogTnVtYmVyIG9mIHVzYWJsZSBzbG90cyBhbGxvY2F0ZWQgaW4gVkVDVE9SLgorICAgICBWRUNUT1IgYWx3YXlzIGhhcyBvbmUgc2xvdCBub3QgY291bnRlZCBoZXJlLAorICAgICB0byBob2xkIHRoZSB0ZXJtaW5hdGluZyB6ZXJvLiAgKi8KKyAgaW50IGFsbG9jYXRlZDsKKyAgLyogQSB2ZWN0b3Igb2Ygc2xvdHMsIEFMTE9DQVRFRCArIDEgb2YgdGhlbS4KKyAgICAgVGhlIGZpcnN0IGZldyBzbG90cyBjb250YWluIHN0cmluZ3MgIlZBUj1WQUxVRSIKKyAgICAgYW5kIHRoZSBuZXh0IG9uZSBjb250YWlucyB6ZXJvLgorICAgICBUaGVuIGNvbWUgc29tZSB1bnVzZWQgc2xvdHMuICAqLworICBjaGFyICoqdmVjdG9yOworfTsKKworZXh0ZXJuIHN0cnVjdCBlbnZpcm9uICoKK21ha2VfZW52aXJvbiBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkCitmcmVlX2Vudmlyb24gUEFSQU1TICgoc3RydWN0IGVudmlyb24gKikpOworCitleHRlcm4gdm9pZAoraW5pdF9lbnZpcm9uIFBBUkFNUyAoKHN0cnVjdCBlbnZpcm9uICopKTsKKworZXh0ZXJuIGNoYXIgKgorZ2V0X2luX2Vudmlyb24gUEFSQU1TICgoY29uc3Qgc3RydWN0IGVudmlyb24gKiwgY29uc3QgY2hhciAqKSk7CisKK2V4dGVybiB2b2lkCitzZXRfaW5fZW52aXJvbiBQQVJBTVMgKChzdHJ1Y3QgZW52aXJvbiAqLCBjb25zdCBjaGFyICosCisJCQljb25zdCBjaGFyICopKTsKKworZXh0ZXJuIHZvaWQKK3Vuc2V0X2luX2Vudmlyb24gUEFSQU1TICgoc3RydWN0IGVudmlyb24gKiwgY2hhciAqKSk7CisKK2V4dGVybiBjaGFyICoqCitlbnZpcm9uX3ZlY3RvciBQQVJBTVMgKChzdHJ1Y3QgZW52aXJvbiAqKSk7CisKKyNlbmRpZgkvKiBkZWZpbmVkIChFTlZJUk9OX0gpICovCmRpZmYgLS1naXQgYS9nZGIvZXZhbC5jIGIvZ2RiL2V2YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2MzNDY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2V2YWwuYwpAQCAtMCwwICsxLDE5ODkgQEAKKy8qIEV2YWx1YXRlIGV4cHJlc3Npb25zIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk4NiwgODcsIDg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImRlbWFuZ2xlLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIJLyogRm9yIENBU1RfSVNfQ09OVkVSU0lPTiAqLworI2luY2x1ZGUgImYtbGFuZy5oIgkvKiBmb3IgYXJyYXkgYm91bmQgc3R1ZmYgKi8KKworLyogRGVmaW5lZCBpbiBzeW10YWIuYyAqLyAKK2V4dGVybiBpbnQgaHBfc29tX3NvbV9vYmplY3RfcHJlc2VudDsKKworLyogVGhpcyBpcyBkZWZpbmVkIGluIHZhbG9wcy5jICovIAorZXh0ZXJuIGludCBvdmVybG9hZF9yZXNvbHV0aW9uOworCisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gKi8KKworc3RhdGljIHZhbHVlX3B0ciBldmFsdWF0ZV9zdWJleHBfZm9yX3NpemVvZiBQQVJBTVMgKChzdHJ1Y3QgZXhwcmVzc2lvbiAqLAorCQkJCQkJICAgICBpbnQgKikpOworCitzdGF0aWMgdmFsdWVfcHRyIGV2YWx1YXRlX3N1YmV4cF9mb3JfYWRkcmVzcyBQQVJBTVMgKChzdHJ1Y3QgZXhwcmVzc2lvbiAqLAorCQkJCQkJICAgICAgaW50ICosIGVudW0gbm9zaWRlKSk7CisKK3N0YXRpYyB2YWx1ZV9wdHIgZXZhbHVhdGVfc3ViZXhwIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIHN0cnVjdCBleHByZXNzaW9uICosCisJCQkJCSAgaW50ICosIGVudW0gbm9zaWRlKSk7CisKK3N0YXRpYyBjaGFyICpnZXRfbGFiZWwgUEFSQU1TICgoc3RydWN0IGV4cHJlc3Npb24gKiwgaW50ICopKTsKKworc3RhdGljIHZhbHVlX3B0cgorZXZhbHVhdGVfc3RydWN0X3R1cGxlIFBBUkFNUyAoKHZhbHVlX3B0ciwgc3RydWN0IGV4cHJlc3Npb24gKiwgaW50ICosCisJCQkgICAgICAgZW51bSBub3NpZGUsIGludCkpOworCitzdGF0aWMgTE9OR0VTVAoraW5pdF9hcnJheV9lbGVtZW50IFBBUkFNUyAoKHZhbHVlX3B0ciwgdmFsdWVfcHRyLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqLAorCQkJICAgIGludCAqLCBlbnVtIG5vc2lkZSwgTE9OR0VTVCwgTE9OR0VTVCkpOworCisjaWZkZWYgX19HTlVDX18KK2lubGluZQorI2VuZGlmCitzdGF0aWMgdmFsdWVfcHRyCitldmFsdWF0ZV9zdWJleHAgKGV4cGVjdF90eXBlLCBleHAsIHBvcywgbm9zaWRlKQorICAgICBzdHJ1Y3QgdHlwZSAqZXhwZWN0X3R5cGU7CisgICAgIHJlZ2lzdGVyIHN0cnVjdCBleHByZXNzaW9uICpleHA7CisgICAgIHJlZ2lzdGVyIGludCAqcG9zOworICAgICBlbnVtIG5vc2lkZSBub3NpZGU7Cit7CisgIHJldHVybiAoKmV4cC0+bGFuZ3VhZ2VfZGVmbi0+ZXZhbHVhdGVfZXhwKSAoZXhwZWN0X3R5cGUsIGV4cCwgcG9zLCBub3NpZGUpOworfQorDAorLyogUGFyc2UgdGhlIHN0cmluZyBFWFAgYXMgYSBDIGV4cHJlc3Npb24sIGV2YWx1YXRlIGl0LAorICAgYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIGEgbnVtYmVyLiAgKi8KKworQ09SRV9BRERSCitwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIChleHApCisgICAgIGNoYXIgKmV4cDsKK3sKKyAgc3RydWN0IGV4cHJlc3Npb24gKmV4cHIgPSBwYXJzZV9leHByZXNzaW9uIChleHApOworICByZWdpc3RlciBDT1JFX0FERFIgYWRkcjsKKyAgcmVnaXN0ZXIgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbiA9IAorICAgICAgbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfY3VycmVudF9jb250ZW50cywgJmV4cHIpOworCisgIGFkZHIgPSB2YWx1ZV9hc19wb2ludGVyIChldmFsdWF0ZV9leHByZXNzaW9uIChleHByKSk7CisgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworICByZXR1cm4gYWRkcjsKK30KKworLyogTGlrZSBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIGJ1dCB0YWtlcyBhIHBvaW50ZXIgdG8gYSBjaGFyICogdmFyaWFibGUKKyAgIGFuZCBhZHZhbmNlZCB0aGF0IHZhcmlhYmxlIGFjcm9zcyB0aGUgY2hhcmFjdGVycyBwYXJzZWQuICAqLworCitDT1JFX0FERFIKK3BhcnNlX2FuZF9ldmFsX2FkZHJlc3NfMSAoZXhwcHRyKQorICAgICBjaGFyICoqZXhwcHRyOworeworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwciA9IHBhcnNlX2V4cF8xIChleHBwdHIsIChzdHJ1Y3QgYmxvY2sgKikwLCAwKTsKKyAgcmVnaXN0ZXIgQ09SRV9BRERSIGFkZHI7CisgIHJlZ2lzdGVyIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW4gPQorICAgICAgbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfY3VycmVudF9jb250ZW50cywgJmV4cHIpOworCisgIGFkZHIgPSB2YWx1ZV9hc19wb2ludGVyIChldmFsdWF0ZV9leHByZXNzaW9uIChleHByKSk7CisgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworICByZXR1cm4gYWRkcjsKK30KKwordmFsdWVfcHRyCitwYXJzZV9hbmRfZXZhbCAoZXhwKQorICAgICBjaGFyICpleHA7Cit7CisgIHN0cnVjdCBleHByZXNzaW9uICpleHByID0gcGFyc2VfZXhwcmVzc2lvbiAoZXhwKTsKKyAgcmVnaXN0ZXIgdmFsdWVfcHRyIHZhbDsKKyAgcmVnaXN0ZXIgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbgorICAgID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfY3VycmVudF9jb250ZW50cywgJmV4cHIpOworCisgIHZhbCA9IGV2YWx1YXRlX2V4cHJlc3Npb24gKGV4cHIpOworICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKKyAgcmV0dXJuIHZhbDsKK30KKworLyogUGFyc2UgdXAgdG8gYSBjb21tYSAob3IgdG8gYSBjbG9zZXBhcmVuKQorICAgaW4gdGhlIHN0cmluZyBFWFBQIGFzIGFuIGV4cHJlc3Npb24sIGV2YWx1YXRlIGl0LCBhbmQgcmV0dXJuIHRoZSB2YWx1ZS4KKyAgIEVYUFAgaXMgYWR2YW5jZWQgdG8gcG9pbnQgdG8gdGhlIGNvbW1hLiAgKi8KKwordmFsdWVfcHRyCitwYXJzZV90b19jb21tYV9hbmRfZXZhbCAoZXhwcCkKKyAgICAgY2hhciAqKmV4cHA7Cit7CisgIHN0cnVjdCBleHByZXNzaW9uICpleHByID0gcGFyc2VfZXhwXzEgKGV4cHAsIChzdHJ1Y3QgYmxvY2sgKikgMCwgMSk7CisgIHJlZ2lzdGVyIHZhbHVlX3B0ciB2YWw7CisgIHJlZ2lzdGVyIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW4KKyAgICA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlX2N1cnJlbnRfY29udGVudHMsICZleHByKTsKKworICB2YWwgPSBldmFsdWF0ZV9leHByZXNzaW9uIChleHByKTsKKyAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisgIHJldHVybiB2YWw7Cit9CisMCisvKiBFdmFsdWF0ZSBhbiBleHByZXNzaW9uIGluIGludGVybmFsIHByZWZpeCBmb3JtCisgICBzdWNoIGFzIGlzIGNvbnN0cnVjdGVkIGJ5IHBhcnNlLnkuCisKKyAgIFNlZSBleHByZXNzaW9uLmggZm9yIGluZm8gb24gdGhlIGZvcm1hdCBvZiBhbiBleHByZXNzaW9uLiAgKi8KKwordmFsdWVfcHRyCitldmFsdWF0ZV9leHByZXNzaW9uIChleHApCisgICAgIHN0cnVjdCBleHByZXNzaW9uICpleHA7Cit7CisgIGludCBwYyA9IDA7CisgIHJldHVybiBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCAmcGMsIEVWQUxfTk9STUFMKTsKK30KKworLyogRXZhbHVhdGUgYW4gZXhwcmVzc2lvbiwgYXZvaWRpbmcgYWxsIG1lbW9yeSByZWZlcmVuY2VzCisgICBhbmQgZ2V0dGluZyBhIHZhbHVlIHdob3NlIHR5cGUgYWxvbmUgaXMgY29ycmVjdC4gICovCisKK3ZhbHVlX3B0cgorZXZhbHVhdGVfdHlwZSAoZXhwKQorICAgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwOworeworICBpbnQgcGMgPSAwOworICByZXR1cm4gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgJnBjLCBFVkFMX0FWT0lEX1NJREVfRUZGRUNUUyk7Cit9CisKKy8qIElmIHRoZSBuZXh0IGV4cHJlc3Npb24gaXMgYW4gT1BfTEFCRUxFRCwgc2tpcHMgcGFzdCBpdCwKKyAgIHJldHVybmluZyB0aGUgbGFiZWwuICBPdGhlcndpc2UsIGRvZXMgbm90aGluZyBhbmQgcmV0dXJucyBOVUxMLiAqLworCitzdGF0aWMgY2hhcioKK2dldF9sYWJlbCAoZXhwLCBwb3MpCisgICAgIHJlZ2lzdGVyIHN0cnVjdCBleHByZXNzaW9uICpleHA7CisgICAgIGludCAqcG9zOworeworICBpZiAoZXhwLT5lbHRzWypwb3NdLm9wY29kZSA9PSBPUF9MQUJFTEVEKQorICAgIHsKKyAgICAgIGludCBwYyA9ICgqcG9zKSsrOworICAgICAgY2hhciAqbmFtZSA9ICZleHAtPmVsdHNbcGMgKyAyXS5zdHJpbmc7CisgICAgICBpbnQgdGVtID0gbG9uZ2VzdF90b19pbnQgKGV4cC0+ZWx0c1twYyArIDFdLmxvbmdjb25zdCk7CisgICAgICAoKnBvcykgKz0gMyArIEJZVEVTX1RPX0VYUF9FTEVNICh0ZW0gKyAxKTsKKyAgICAgIHJldHVybiBuYW1lOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGV2YWx1YXRlcyB0dXBlcyAoaW4gQ2hpbGwpIG9yIGJyYWNlLWluaXRpYWxpemVycworICAgKGluIEMvQysrKSBmb3Igc3RydWN0dXJlIHR5cGVzLiAgKi8KKworc3RhdGljIHZhbHVlX3B0cgorZXZhbHVhdGVfc3RydWN0X3R1cGxlIChzdHJ1Y3RfdmFsLCBleHAsIHBvcywgbm9zaWRlLCBuYXJncykKKyAgICAgdmFsdWVfcHRyIHN0cnVjdF92YWw7CisgICAgIHJlZ2lzdGVyIHN0cnVjdCBleHByZXNzaW9uICpleHA7CisgICAgIHJlZ2lzdGVyIGludCAqcG9zOworICAgICBlbnVtIG5vc2lkZSBub3NpZGU7CisgICAgIGludCBuYXJnczsKK3sKKyAgc3RydWN0IHR5cGUgKnN0cnVjdF90eXBlID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoc3RydWN0X3ZhbCkpOworICBzdHJ1Y3QgdHlwZSAqc3Vic3RydWN0X3R5cGUgPSBzdHJ1Y3RfdHlwZTsKKyAgc3RydWN0IHR5cGUgKmZpZWxkX3R5cGU7CisgIGludCBmaWVsZG5vID0gLTE7CisgIGludCB2YXJpYW50bm8gPSAtMTsKKyAgaW50IHN1YmZpZWxkbm8gPSAtMTsKKyAgIHdoaWxlICgtLW5hcmdzID49IDApCisgICAgeworICAgICAgaW50IHBjID0gKnBvczsKKyAgICAgIHZhbHVlX3B0ciB2YWwgPSBOVUxMOworICAgICAgaW50IG5sYWJlbHMgPSAwOworICAgICAgaW50IGJpdHBvcywgYml0c2l6ZTsKKyAgICAgIGNoYXIgKmFkZHI7CisgICAgICAKKyAgICAgIC8qIFNraXAgcGFzdCB0aGUgbGFiZWxzLCBhbmQgY291bnQgdGhlbS4gKi8KKyAgICAgIHdoaWxlIChnZXRfbGFiZWwgKGV4cCwgcG9zKSAhPSBOVUxMKQorCW5sYWJlbHMrKzsKKworICAgICAgZG8KKwl7CisJICBjaGFyICpsYWJlbCA9IGdldF9sYWJlbCAoZXhwLCAmcGMpOworCSAgaWYgKGxhYmVsKQorCSAgICB7CisJICAgICAgZm9yIChmaWVsZG5vID0gMDsgZmllbGRubyA8IFRZUEVfTkZJRUxEUyAoc3RydWN0X3R5cGUpOworCQkgICBmaWVsZG5vKyspCisJCXsKKwkJICBjaGFyICpmaWVsZF9uYW1lID0gVFlQRV9GSUVMRF9OQU1FIChzdHJ1Y3RfdHlwZSwgZmllbGRubyk7CisJCSAgaWYgKGZpZWxkX25hbWUgIT0gTlVMTCAmJiBTVFJFUSAoZmllbGRfbmFtZSwgbGFiZWwpKQorCQkgICAgeworCQkgICAgICB2YXJpYW50bm8gPSAtMTsKKwkJICAgICAgc3ViZmllbGRubyA9IGZpZWxkbm87CisJCSAgICAgIHN1YnN0cnVjdF90eXBlID0gc3RydWN0X3R5cGU7CisJCSAgICAgIGdvdG8gZm91bmQ7CisJCSAgICB9CisJCX0KKwkgICAgICBmb3IgKGZpZWxkbm8gPSAwOyBmaWVsZG5vIDwgVFlQRV9ORklFTERTIChzdHJ1Y3RfdHlwZSk7CisJCSAgIGZpZWxkbm8rKykKKwkJeworCQkgIGNoYXIgKmZpZWxkX25hbWUgPSBUWVBFX0ZJRUxEX05BTUUgKHN0cnVjdF90eXBlLCBmaWVsZG5vKTsKKwkJICBmaWVsZF90eXBlID0gVFlQRV9GSUVMRF9UWVBFIChzdHJ1Y3RfdHlwZSwgZmllbGRubyk7CisJCSAgaWYgKChmaWVsZF9uYW1lID09IDAgfHwgKmZpZWxkX25hbWUgPT0gJ1wwJykKKwkJICAgICAgJiYgVFlQRV9DT0RFIChmaWVsZF90eXBlKSA9PSBUWVBFX0NPREVfVU5JT04pCisJCSAgICB7CisJCSAgICAgIHZhcmlhbnRubyA9IDA7CisJCSAgICAgIGZvciAoOyB2YXJpYW50bm8gPCBUWVBFX05GSUVMRFMgKGZpZWxkX3R5cGUpOworCQkJICAgdmFyaWFudG5vKyspCisJCQl7CisJCQkgIHN1YnN0cnVjdF90eXBlCisJCQkgICAgPSBUWVBFX0ZJRUxEX1RZUEUgKGZpZWxkX3R5cGUsIHZhcmlhbnRubyk7CisJCQkgIGlmIChUWVBFX0NPREUgKHN1YnN0cnVjdF90eXBlKSA9PSBUWVBFX0NPREVfU1RSVUNUKQorCQkJICAgIHsgCisJCQkgICAgICBmb3IgKHN1YmZpZWxkbm8gPSAwOworCQkJCSAgIHN1YmZpZWxkbm8gPCBUWVBFX05GSUVMRFMgKHN1YnN0cnVjdF90eXBlKTsKKwkJCQkgICBzdWJmaWVsZG5vKyspCisJCQkJeworCQkJCSAgaWYgKFNUUkVRIChUWVBFX0ZJRUxEX05BTUUgKHN1YnN0cnVjdF90eXBlLAorCQkJCQkJCSAgICAgIHN1YmZpZWxkbm8pLAorCQkJCQkgICAgIGxhYmVsKSkKKwkJCQkgICAgeworCQkJCSAgICAgIGdvdG8gZm91bmQ7CisJCQkJICAgIH0KKwkJCQl9CisJCQkgICAgfQorCQkJfQorCQkgICAgfQorCQl9CisJICAgICAgZXJyb3IgKCJ0aGVyZSBpcyBubyBmaWVsZCBuYW1lZCAlcyIsIGxhYmVsKTsKKwkgICAgZm91bmQ6CisJICAgICAgOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBVbmxhYmVsbGVkIHR1cGxlIGVsZW1lbnQgLSBnbyB0byBuZXh0IGZpZWxkLiAqLworCSAgICAgIGlmICh2YXJpYW50bm8gPj0gMCkKKwkJeworCQkgIHN1YmZpZWxkbm8rKzsKKwkJICBpZiAoc3ViZmllbGRubyA+PSBUWVBFX05GSUVMRFMgKHN1YnN0cnVjdF90eXBlKSkKKwkJICAgIHsKKwkJICAgICAgdmFyaWFudG5vID0gLTE7CisJCSAgICAgIHN1YnN0cnVjdF90eXBlID0gc3RydWN0X3R5cGU7CisJCSAgICB9CisJCX0KKwkgICAgICBpZiAodmFyaWFudG5vIDwgMCkKKwkJeworCQkgIGZpZWxkbm8rKzsKKwkJICBzdWJmaWVsZG5vID0gZmllbGRubzsKKwkJICBpZiAoZmllbGRubyA+PSBUWVBFX05GSUVMRFMgKHN0cnVjdF90eXBlKSkKKwkJICAgIGVycm9yICgidG9vIG1hbnkgaW5pdGlhbGl6ZXJzIik7CisJCSAgZmllbGRfdHlwZSA9IFRZUEVfRklFTERfVFlQRSAoc3RydWN0X3R5cGUsIGZpZWxkbm8pOworCQkgIGlmIChUWVBFX0NPREUgKGZpZWxkX3R5cGUpID09IFRZUEVfQ09ERV9VTklPTgorCQkgICAgICAmJiBUWVBFX0ZJRUxEX05BTUUgKHN0cnVjdF90eXBlLCBmaWVsZG5vKVswXSA9PSAnMCcpCisJCSAgICBlcnJvciAoImRvbid0IGtub3cgd2hpY2ggdmFyaWFudCB5b3Ugd2FudCB0byBzZXQiKTsKKwkJfQorCSAgICB9CisKKwkgIC8qIEhlcmUsIHN0cnVjdF90eXBlIGlzIHRoZSB0eXBlIG9mIHRoZSBpbm5lciBzdHJ1Y3QsCisJICAgICB3aGlsZSBzdWJzdHJ1Y3RfdHlwZSBpcyB0aGUgdHlwZSBvZiB0aGUgaW5uZXIgc3RydWN0LgorCSAgICAgVGhlc2UgYXJlIHRoZSBzYW1lIGZvciBub3JtYWwgc3RydWN0dXJlcywgYnV0IGEgdmFyaWFudCBzdHJ1Y3QKKwkgICAgIGNvbnRhaW5zIGFub255bW91cyB1bmlvbiBmaWVsZHMgdGhhdCBjb250YWluIHN1YnN0cnVjdCBmaWVsZHMuCisJICAgICBUaGUgdmFsdWUgZmllbGRubyBpcyB0aGUgaW5kZXggb2YgdGhlIHRvcC1sZXZlbCAobm9ybWFsIG9yCisJICAgICBhbm9ueW1vdXMgdW5pb24pIGZpZWxkIGluIHN0cnVjdF9maWVsZCwgd2hpbGUgdGhlIHZhbHVlCisJICAgICBzdWJmaWVsZG5vIGlzIHRoZSBpbmRleCBvZiB0aGUgYWN0dWFsIHJlYWwgKG5hbWVkIGlubmVyKSBmaWVsZAorCSAgICAgaW4gc3Vic3RydWN0X3R5cGUuICovCisKKwkgIGZpZWxkX3R5cGUgPSBUWVBFX0ZJRUxEX1RZUEUgKHN1YnN0cnVjdF90eXBlLCBzdWJmaWVsZG5vKTsKKwkgIGlmICh2YWwgPT0gMCkKKwkgICAgdmFsID0gZXZhbHVhdGVfc3ViZXhwIChmaWVsZF90eXBlLCBleHAsIHBvcywgbm9zaWRlKTsKKworCSAgLyogTm93IGFjdHVhbGx5IHNldCB0aGUgZmllbGQgaW4gc3RydWN0X3ZhbC4gKi8KKworCSAgLyogQXNzaWduIHZhbCB0byBmaWVsZCBmaWVsZG5vLiAqLworCSAgaWYgKFZBTFVFX1RZUEUgKHZhbCkgIT0gZmllbGRfdHlwZSkKKwkgICAgdmFsID0gdmFsdWVfY2FzdCAoZmllbGRfdHlwZSwgdmFsKTsKKworCSAgYml0c2l6ZSA9IFRZUEVfRklFTERfQklUU0laRSAoc3Vic3RydWN0X3R5cGUsIHN1YmZpZWxkbm8pOworCSAgYml0cG9zID0gVFlQRV9GSUVMRF9CSVRQT1MgKHN0cnVjdF90eXBlLCBmaWVsZG5vKTsKKwkgIGlmICh2YXJpYW50bm8gPj0gMCkKKwkgICAgYml0cG9zICs9IFRZUEVfRklFTERfQklUUE9TIChzdWJzdHJ1Y3RfdHlwZSwgc3ViZmllbGRubyk7CisJICBhZGRyID0gVkFMVUVfQ09OVEVOVFMgKHN0cnVjdF92YWwpICsgYml0cG9zIC8gODsKKwkgIGlmIChiaXRzaXplKQorCSAgICBtb2RpZnlfZmllbGQgKGFkZHIsIHZhbHVlX2FzX2xvbmcgKHZhbCksCisJCQkgIGJpdHBvcyAlIDgsIGJpdHNpemUpOworCSAgZWxzZQorCSAgICBtZW1jcHkgKGFkZHIsIFZBTFVFX0NPTlRFTlRTICh2YWwpLAorCQkgICAgVFlQRV9MRU5HVEggKFZBTFVFX1RZUEUgKHZhbCkpKTsKKwl9IHdoaWxlICgtLW5sYWJlbHMgPiAwKTsKKyAgICB9CisgIHJldHVybiBzdHJ1Y3RfdmFsOworfQorCisvKiBSZWN1cnNpdmUgaGVscGVyIGZ1bmN0aW9uIGZvciBzZXR0aW5nIGVsZW1lbnRzIG9mIGFycmF5IHR1cGxlcyBmb3IgQ2hpbGwuCisgICBUaGUgdGFyZ2V0IGlzIEFSUkFZICh3aGljaCBoYXMgYm91bmRzIExPV19CT1VORCB0byBISUdIX0JPVU5EKTsKKyAgIHRoZSBlbGVtZW50IHZhbHVlIGlzIEVMRU1FTlQ7CisgICBFWFAsIFBPUyBhbmQgTk9TSURFIGFyZSBhcyB1c3VhbC4KKyAgIEV2YWx1YXRlcyBpbmRleCBleHByZXNpb25zIGFuZCBzZXRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudChzKSBvZgorICAgQVJSQVkgdG8gRUxFTUVOVC4KKyAgIFJldHVybnMgbGFzdCBpbmRleCB2YWx1ZS4gICovCisKK3N0YXRpYyBMT05HRVNUCitpbml0X2FycmF5X2VsZW1lbnQgKGFycmF5LCBlbGVtZW50LCBleHAsIHBvcywgbm9zaWRlLCBsb3dfYm91bmQsIGhpZ2hfYm91bmQpCisgICAgIHZhbHVlX3B0ciBhcnJheSwgZWxlbWVudDsKKyAgICAgcmVnaXN0ZXIgc3RydWN0IGV4cHJlc3Npb24gKmV4cDsKKyAgICAgcmVnaXN0ZXIgaW50ICpwb3M7CisgICAgIGVudW0gbm9zaWRlIG5vc2lkZTsKKyAgICAgTE9OR0VTVCBsb3dfYm91bmQsIGhpZ2hfYm91bmQ7Cit7CisgIExPTkdFU1QgaW5kZXg7CisgIGludCBlbGVtZW50X3NpemUgPSBUWVBFX0xFTkdUSCAoVkFMVUVfVFlQRSAoZWxlbWVudCkpOworICBpZiAoZXhwLT5lbHRzWypwb3NdLm9wY29kZSA9PSBCSU5PUF9DT01NQSkKKyAgICB7CisgICAgICAoKnBvcykrKzsKKyAgICAgIGluaXRfYXJyYXlfZWxlbWVudCAoYXJyYXksIGVsZW1lbnQsIGV4cCwgcG9zLCBub3NpZGUsCisJCQkgIGxvd19ib3VuZCwgaGlnaF9ib3VuZCk7CisgICAgICByZXR1cm4gaW5pdF9hcnJheV9lbGVtZW50IChhcnJheSwgZWxlbWVudCwKKwkJCQkgZXhwLCBwb3MsIG5vc2lkZSwgbG93X2JvdW5kLCBoaWdoX2JvdW5kKTsKKyAgICB9CisgIGVsc2UgaWYgKGV4cC0+ZWx0c1sqcG9zXS5vcGNvZGUgPT0gQklOT1BfUkFOR0UpCisgICAgeworICAgICAgTE9OR0VTVCBsb3csIGhpZ2g7CisgICAgICAoKnBvcykrKzsKKyAgICAgIGxvdyA9IHZhbHVlX2FzX2xvbmcgKGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgbm9zaWRlKSk7CisgICAgICBoaWdoID0gdmFsdWVfYXNfbG9uZyAoZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpKTsKKyAgICAgIGlmIChsb3cgPCBsb3dfYm91bmQgfHwgaGlnaCA+IGhpZ2hfYm91bmQpCisJZXJyb3IgKCJ0dXBsZSByYW5nZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgIGZvciAoaW5kZXggPSBsb3cgOyBpbmRleCA8PSBoaWdoOyBpbmRleCsrKQorCXsKKwkgIG1lbWNweSAoVkFMVUVfQ09OVEVOVFNfUkFXIChhcnJheSkKKwkJICArIChpbmRleCAtIGxvd19ib3VuZCkgKiBlbGVtZW50X3NpemUsCisJCSAgVkFMVUVfQ09OVEVOVFMgKGVsZW1lbnQpLCBlbGVtZW50X3NpemUpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbmRleCA9IHZhbHVlX2FzX2xvbmcgKGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgbm9zaWRlKSk7CisgICAgICBpZiAoaW5kZXggPCBsb3dfYm91bmQgfHwgaW5kZXggPiBoaWdoX2JvdW5kKQorCWVycm9yICgidHVwbGUgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICBtZW1jcHkgKFZBTFVFX0NPTlRFTlRTX1JBVyAoYXJyYXkpICsgKGluZGV4IC0gbG93X2JvdW5kKSAqIGVsZW1lbnRfc2l6ZSwKKwkgICAgICBWQUxVRV9DT05URU5UUyAoZWxlbWVudCksIGVsZW1lbnRfc2l6ZSk7CisgICAgfQorICByZXR1cm4gaW5kZXg7Cit9CisKK3ZhbHVlX3B0cgorZXZhbHVhdGVfc3ViZXhwX3N0YW5kYXJkIChleHBlY3RfdHlwZSwgZXhwLCBwb3MsIG5vc2lkZSkKKyAgICAgc3RydWN0IHR5cGUgKmV4cGVjdF90eXBlOworICAgICByZWdpc3RlciBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwOworICAgICByZWdpc3RlciBpbnQgKnBvczsKKyAgICAgZW51bSBub3NpZGUgbm9zaWRlOworeworICBlbnVtIGV4cF9vcGNvZGUgb3A7CisgIGludCB0ZW0sIHRlbTIsIHRlbTM7CisgIHJlZ2lzdGVyIGludCBwYywgcGMyID0gMCwgb2xkcG9zOworICByZWdpc3RlciB2YWx1ZV9wdHIgYXJnMSA9IE5VTEwsIGFyZzIgPSBOVUxMLCBhcmczOworICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgaW50IG5hcmdzOworICB2YWx1ZV9wdHIgKmFyZ3ZlYzsKKyAgaW50IHVwcGVyLCBsb3dlciwgcmV0Y29kZTsgCisgIGludCBjb2RlOworICBpbnQgaXg7CisgIGxvbmcgbWVtX29mZnNldDsKKyAgc3RydWN0IHN5bWJvbCAqIHN5bTsKKyAgc3RydWN0IHR5cGUgKiogYXJnX3R5cGVzOworICBpbnQgc2F2ZV9wb3MxOworCisgIC8qIFRoaXMgZXhwZWN0X3R5cGUgY3JhcCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIEMuICBDIGV4cHJlc3Npb25zIGRvCisgICAgIG5vdCBoYXZlIGFueSBub3Rpb24gb2YgZXhwZWN0ZWQgdHlwZXMsIG5ldmVyIGhhcyBhbmQgKGdvZGRlc3MKKyAgICAgd2lsbGluZykgbmV2ZXIgd2lsbC4gIFRoZSBDKysgY29kZSB1c2VzIGl0IGZvciBzb21lIHR3aXN0ZWQKKyAgICAgcHVycG9zZSAoSSBoYXZlbid0IGludmVzdGlnYXRlZCBidXQgSSBzdXNwZWN0IGl0IGp1c3QgdGhlIHVzdWFsCisgICAgIGNvbWJpbmF0aW9uIG9mIFN0cm91c3RydXAgZmlndXJpbmcgb3V0IHNvbWUgY3JhenkgbGFuZ3VhZ2UKKyAgICAgZmVhdHVyZSBhbmQgVGllbWFubiBmaWd1cmluZyBvdXQgc29tZSBjcmF6aWVyIHdheSB0byB0cnkgdG8KKyAgICAgaW1wbGVtZW50IGl0KS4gIENISUxMIGhhcyB0aGUgdHVwbGUgc3R1ZmY7IEkgZG9uJ3Qga25vdyBlbm91Z2gKKyAgICAgYWJvdXQgQ0hJTEwgdG8ga25vdyB3aGV0aGVyIGV4cGVjdGVkIHR5cGVzIGlzIHRoZSB3YXkgdG8gZG8gaXQuCisgICAgIEZPUlRSQU4gSSBkb24ndCBrbm93LiAgKi8KKyAgaWYgKGV4cC0+bGFuZ3VhZ2VfZGVmbi0+bGFfbGFuZ3VhZ2UgIT0gbGFuZ3VhZ2VfY3BsdXMKKyAgICAgICYmIGV4cC0+bGFuZ3VhZ2VfZGVmbi0+bGFfbGFuZ3VhZ2UgIT0gbGFuZ3VhZ2VfY2hpbGwpCisgICAgZXhwZWN0X3R5cGUgPSBOVUxMX1RZUEU7CisKKyAgcGMgPSAoKnBvcykrKzsKKyAgb3AgPSBleHAtPmVsdHNbcGNdLm9wY29kZTsKKworICBzd2l0Y2ggKG9wKQorICAgIHsKKyAgICBjYXNlIE9QX1NDT1BFOgorICAgICAgdGVtID0gbG9uZ2VzdF90b19pbnQgKGV4cC0+ZWx0c1twYyArIDJdLmxvbmdjb25zdCk7CisgICAgICAoKnBvcykgKz0gNCArIEJZVEVTX1RPX0VYUF9FTEVNICh0ZW0gKyAxKTsKKyAgICAgIGFyZzEgPSB2YWx1ZV9zdHJ1Y3RfZWx0X2Zvcl9yZWZlcmVuY2UgKGV4cC0+ZWx0c1twYyArIDFdLnR5cGUsCisJCQkJCSAgICAgMCwKKwkJCQkJICAgICBleHAtPmVsdHNbcGMgKyAxXS50eXBlLAorCQkJCQkgICAgICZleHAtPmVsdHNbcGMgKyAzXS5zdHJpbmcsCisJCQkJCSAgICAgZXhwZWN0X3R5cGUpOworICAgICAgaWYgKGFyZzEgPT0gTlVMTCkKKwllcnJvciAoIlRoZXJlIGlzIG5vIGZpZWxkIG5hbWVkICVzIiwgJmV4cC0+ZWx0c1twYyArIDNdLnN0cmluZyk7CisgICAgICByZXR1cm4gYXJnMTsKKworICAgIGNhc2UgT1BfTE9ORzoKKyAgICAgICgqcG9zKSArPSAzOworICAgICAgcmV0dXJuIHZhbHVlX2Zyb21fbG9uZ2VzdCAoZXhwLT5lbHRzW3BjICsgMV0udHlwZSwKKwkJCQkgZXhwLT5lbHRzW3BjICsgMl0ubG9uZ2NvbnN0KTsKKworICAgIGNhc2UgT1BfRE9VQkxFOgorICAgICAgKCpwb3MpICs9IDM7CisgICAgICByZXR1cm4gdmFsdWVfZnJvbV9kb3VibGUgKGV4cC0+ZWx0c1twYyArIDFdLnR5cGUsCisJCQkJZXhwLT5lbHRzW3BjICsgMl0uZG91YmxlY29uc3QpOworCisgICAgY2FzZSBPUF9WQVJfVkFMVUU6CisgICAgICAoKnBvcykgKz0gMzsKKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQKQorCWdvdG8gbm9zaWRlcmV0OworICAgICAgaWYgKG5vc2lkZSA9PSBFVkFMX0FWT0lEX1NJREVfRUZGRUNUUykKKwl7CisJICBzdHJ1Y3Qgc3ltYm9sICogc3ltID0gZXhwLT5lbHRzW3BjICsgMl0uc3ltYm9sOworCSAgZW51bSBsdmFsX3R5cGUgbHY7CisKKwkgIHN3aXRjaCAoU1lNQk9MX0NMQVNTIChzeW0pKQorCSAgICB7CisJICAgIGNhc2UgTE9DX0NPTlNUOgorCSAgICBjYXNlIExPQ19MQUJFTDoKKwkgICAgY2FzZSBMT0NfQ09OU1RfQllURVM6CisJICAgICAgbHYgPSBub3RfbHZhbDsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIExPQ19SRUdJU1RFUjoKKwkgICAgY2FzZSBMT0NfUkVHUEFSTToKKwkgICAgICBsdiA9IGx2YWxfcmVnaXN0ZXI7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBsdiA9IGx2YWxfbWVtb3J5OworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIHJldHVybiB2YWx1ZV96ZXJvIChTWU1CT0xfVFlQRSAoc3ltKSwgbHYpOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gdmFsdWVfb2ZfdmFyaWFibGUgKGV4cC0+ZWx0c1twYyArIDJdLnN5bWJvbCwKKwkJCQkgIGV4cC0+ZWx0c1twYyArIDFdLmJsb2NrKTsKKworICAgIGNhc2UgT1BfTEFTVDoKKyAgICAgICgqcG9zKSArPSAyOworICAgICAgcmV0dXJuCisJYWNjZXNzX3ZhbHVlX2hpc3RvcnkgKGxvbmdlc3RfdG9faW50IChleHAtPmVsdHNbcGMgKyAxXS5sb25nY29uc3QpKTsKKworICAgIGNhc2UgT1BfUkVHSVNURVI6CisgICAgICB7CisJaW50IHJlZ25vICAgICA9IGxvbmdlc3RfdG9faW50IChleHAtPmVsdHNbcGMgKyAxXS5sb25nY29uc3QpOworCXZhbHVlX3B0ciB2YWwgPSB2YWx1ZV9vZl9yZWdpc3RlciAocmVnbm8pOworCisJKCpwb3MpICs9IDI7CisJaWYgKHZhbCA9PSBOVUxMKQorCSAgZXJyb3IgKCJWYWx1ZSBvZiByZWdpc3RlciAlcyBub3QgYXZhaWxhYmxlLiIsIFJFR0lTVEVSX05BTUUgKHJlZ25vKSk7CisJZWxzZQorCSAgcmV0dXJuIHZhbDsKKyAgICAgIH0KKyAgICBjYXNlIE9QX0JPT0w6CisgICAgICAoKnBvcykgKz0gMjsKKyAgICAgIHJldHVybiB2YWx1ZV9mcm9tX2xvbmdlc3QgKExBX0JPT0xfVFlQRSwKKwkJCQkgICBleHAtPmVsdHNbcGMgKyAxXS5sb25nY29uc3QpOworCisgICAgY2FzZSBPUF9JTlRFUk5BTFZBUjoKKyAgICAgICgqcG9zKSArPSAyOworICAgICAgcmV0dXJuIHZhbHVlX29mX2ludGVybmFsdmFyIChleHAtPmVsdHNbcGMgKyAxXS5pbnRlcm5hbHZhcik7CisKKyAgICBjYXNlIE9QX1NUUklORzoKKyAgICAgIHRlbSA9IGxvbmdlc3RfdG9faW50IChleHAtPmVsdHNbcGMgKyAxXS5sb25nY29uc3QpOworICAgICAgKCpwb3MpICs9IDMgKyBCWVRFU19UT19FWFBfRUxFTSAodGVtICsgMSk7CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfU0tJUCkKKwlnb3RvIG5vc2lkZXJldDsKKyAgICAgIHJldHVybiB2YWx1ZV9zdHJpbmcgKCZleHAtPmVsdHNbcGMgKyAyXS5zdHJpbmcsIHRlbSk7CisKKyAgICBjYXNlIE9QX0JJVFNUUklORzoKKyAgICAgIHRlbSA9IGxvbmdlc3RfdG9faW50IChleHAtPmVsdHNbcGMgKyAxXS5sb25nY29uc3QpOworICAgICAgKCpwb3MpCisJKz0gMyArIEJZVEVTX1RPX0VYUF9FTEVNICgodGVtICsgSE9TVF9DSEFSX0JJVCAtIDEpIC8gSE9TVF9DSEFSX0JJVCk7CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfU0tJUCkKKwlnb3RvIG5vc2lkZXJldDsKKyAgICAgIHJldHVybiB2YWx1ZV9iaXRzdHJpbmcgKCZleHAtPmVsdHNbcGMgKyAyXS5zdHJpbmcsIHRlbSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BfQVJSQVk6CisgICAgICAoKnBvcykgKz0gMzsKKyAgICAgIHRlbTIgPSBsb25nZXN0X3RvX2ludCAoZXhwLT5lbHRzW3BjICsgMV0ubG9uZ2NvbnN0KTsKKyAgICAgIHRlbTMgPSBsb25nZXN0X3RvX2ludCAoZXhwLT5lbHRzW3BjICsgMl0ubG9uZ2NvbnN0KTsKKyAgICAgIG5hcmdzID0gdGVtMyAtIHRlbTIgKyAxOworICAgICAgdHlwZSA9IGV4cGVjdF90eXBlID8gY2hlY2tfdHlwZWRlZiAoZXhwZWN0X3R5cGUpIDogTlVMTF9UWVBFOworCisgICAgICBpZiAoZXhwZWN0X3R5cGUgIT0gTlVMTF9UWVBFICYmIG5vc2lkZSAhPSBFVkFMX1NLSVAKKwkgICYmIFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1NUUlVDVCkKKwl7CisJICB2YWx1ZV9wdHIgcmVjID0gYWxsb2NhdGVfdmFsdWUgKGV4cGVjdF90eXBlKTsKKwkgIG1lbXNldCAoVkFMVUVfQ09OVEVOVFNfUkFXIChyZWMpLCAnXDAnLCBUWVBFX0xFTkdUSCAodHlwZSkpOworCSAgcmV0dXJuIGV2YWx1YXRlX3N0cnVjdF90dXBsZSAocmVjLCBleHAsIHBvcywgbm9zaWRlLCBuYXJncyk7CisJfQorCisgICAgICBpZiAoZXhwZWN0X3R5cGUgIT0gTlVMTF9UWVBFICYmIG5vc2lkZSAhPSBFVkFMX1NLSVAKKwkgICYmIFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX0FSUkFZKQorCXsKKwkgIHN0cnVjdCB0eXBlICpyYW5nZV90eXBlID0gVFlQRV9GSUVMRF9UWVBFICh0eXBlLCAwKTsKKwkgIHN0cnVjdCB0eXBlICplbGVtZW50X3R5cGUgPSBUWVBFX1RBUkdFVF9UWVBFICh0eXBlKTsKKwkgIHZhbHVlX3B0ciBhcnJheSA9IGFsbG9jYXRlX3ZhbHVlIChleHBlY3RfdHlwZSk7CisJICBpbnQgZWxlbWVudF9zaXplID0gVFlQRV9MRU5HVEggKGNoZWNrX3R5cGVkZWYgKGVsZW1lbnRfdHlwZSkpOworCSAgTE9OR0VTVCBsb3dfYm91bmQsIGhpZ2hfYm91bmQsIGluZGV4OworCSAgaWYgKGdldF9kaXNjcmV0ZV9ib3VuZHMgKHJhbmdlX3R5cGUsICZsb3dfYm91bmQsICZoaWdoX2JvdW5kKSA8IDApCisJICAgIHsKKwkgICAgICBsb3dfYm91bmQgPSAwOworCSAgICAgIGhpZ2hfYm91bmQgPSAoVFlQRV9MRU5HVEggKHR5cGUpIC8gZWxlbWVudF9zaXplKSAtIDE7CisJICAgIH0KKwkgIGluZGV4ID0gbG93X2JvdW5kOworCSAgbWVtc2V0IChWQUxVRV9DT05URU5UU19SQVcgKGFycmF5KSwgMCwgVFlQRV9MRU5HVEggKGV4cGVjdF90eXBlKSk7CisJICBmb3IgKHRlbSA9IG5hcmdzOyAgLS1uYXJncyA+PSAwOyAgKQorCSAgICB7CisJICAgICAgdmFsdWVfcHRyIGVsZW1lbnQ7CisJICAgICAgaW50IGluZGV4X3BjID0gMDsKKwkgICAgICBpZiAoZXhwLT5lbHRzWypwb3NdLm9wY29kZSA9PSBCSU5PUF9SQU5HRSkKKwkJeworCQkgIGluZGV4X3BjID0gKysoKnBvcyk7CisJCSAgZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBFVkFMX1NLSVApOworCQl9CisJICAgICAgZWxlbWVudCA9IGV2YWx1YXRlX3N1YmV4cCAoZWxlbWVudF90eXBlLCBleHAsIHBvcywgbm9zaWRlKTsKKwkgICAgICBpZiAoVkFMVUVfVFlQRSAoZWxlbWVudCkgIT0gZWxlbWVudF90eXBlKQorCQllbGVtZW50ID0gdmFsdWVfY2FzdCAoZWxlbWVudF90eXBlLCBlbGVtZW50KTsKKwkgICAgICBpZiAoaW5kZXhfcGMpCisJCXsKKwkJICBpbnQgY29udGludWVfcGMgPSAqcG9zOworCQkgICpwb3MgPSBpbmRleF9wYzsKKwkJICBpbmRleCA9IGluaXRfYXJyYXlfZWxlbWVudCAoYXJyYXksIGVsZW1lbnQsIGV4cCwgcG9zLCBub3NpZGUsCisJCQkJCSAgICAgIGxvd19ib3VuZCwgaGlnaF9ib3VuZCk7CisJCSAgKnBvcyA9IGNvbnRpbnVlX3BjOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKGluZGV4ID4gaGlnaF9ib3VuZCkKKwkJICAgIC8qIHRvIGF2b2lkIG1lbW9yeSBjb3JydXB0aW9uICovCisJCSAgICBlcnJvciAoIlRvbyBtYW55IGFycmF5IGVsZW1lbnRzIik7CisJCSAgbWVtY3B5IChWQUxVRV9DT05URU5UU19SQVcgKGFycmF5KQorCQkJICArIChpbmRleCAtIGxvd19ib3VuZCkgKiBlbGVtZW50X3NpemUsCisJCQkgIFZBTFVFX0NPTlRFTlRTIChlbGVtZW50KSwKKwkJCSAgZWxlbWVudF9zaXplKTsKKwkJfQorCSAgICAgIGluZGV4Kys7CisJICAgIH0KKwkgIHJldHVybiBhcnJheTsKKwl9CisKKyAgICAgIGlmIChleHBlY3RfdHlwZSAhPSBOVUxMX1RZUEUgJiYgbm9zaWRlICE9IEVWQUxfU0tJUAorCSAgJiYgVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfU0VUKQorCXsKKwkgIHZhbHVlX3B0ciBzZXQgPSBhbGxvY2F0ZV92YWx1ZSAoZXhwZWN0X3R5cGUpOworCSAgY2hhciAqdmFsYWRkciA9IFZBTFVFX0NPTlRFTlRTX1JBVyAoc2V0KTsKKwkgIHN0cnVjdCB0eXBlICplbGVtZW50X3R5cGUgPSBUWVBFX0lOREVYX1RZUEUgKHR5cGUpOworCSAgc3RydWN0IHR5cGUgKmNoZWNrX3R5cGUgPSBlbGVtZW50X3R5cGU7CisJICBMT05HRVNUIGxvd19ib3VuZCwgaGlnaF9ib3VuZDsKKworCSAgLyogZ2V0IHRhcmdldHR5cGUgb2YgZWxlbWVudHR5cGUgKi8KKwkgIHdoaWxlIChUWVBFX0NPREUgKGNoZWNrX3R5cGUpID09IFRZUEVfQ09ERV9SQU5HRSB8fAorCQkgVFlQRV9DT0RFIChjaGVja190eXBlKSA9PSBUWVBFX0NPREVfVFlQRURFRikKKwkgICAgY2hlY2tfdHlwZSA9IFRZUEVfVEFSR0VUX1RZUEUgKGNoZWNrX3R5cGUpOworCisJICBpZiAoZ2V0X2Rpc2NyZXRlX2JvdW5kcyAoZWxlbWVudF90eXBlLCAmbG93X2JvdW5kLCAmaGlnaF9ib3VuZCkgPCAwKQorCSAgICBlcnJvciAoIihwb3dlcilzZXQgdHlwZSB3aXRoIHVua25vd24gc2l6ZSIpOworCSAgbWVtc2V0ICh2YWxhZGRyLCAnXDAnLCBUWVBFX0xFTkdUSCAodHlwZSkpOworCSAgZm9yICh0ZW0gPSAwOyB0ZW0gPCBuYXJnczsgdGVtKyspCisJICAgIHsKKwkgICAgICBMT05HRVNUIHJhbmdlX2xvdywgcmFuZ2VfaGlnaDsKKwkgICAgICBzdHJ1Y3QgdHlwZSAqcmFuZ2VfbG93X3R5cGUsICpyYW5nZV9oaWdoX3R5cGU7CisJICAgICAgdmFsdWVfcHRyIGVsZW1fdmFsOworCSAgICAgIGlmIChleHAtPmVsdHNbKnBvc10ub3Bjb2RlID09IEJJTk9QX1JBTkdFKQorCQl7CisJCSAgKCpwb3MpKys7CisJCSAgZWxlbV92YWwgPSBldmFsdWF0ZV9zdWJleHAgKGVsZW1lbnRfdHlwZSwgZXhwLCBwb3MsIG5vc2lkZSk7CisJCSAgcmFuZ2VfbG93X3R5cGUgPSBWQUxVRV9UWVBFIChlbGVtX3ZhbCk7CisJCSAgcmFuZ2VfbG93ID0gdmFsdWVfYXNfbG9uZyAoZWxlbV92YWwpOworCQkgIGVsZW1fdmFsID0gZXZhbHVhdGVfc3ViZXhwIChlbGVtZW50X3R5cGUsIGV4cCwgcG9zLCBub3NpZGUpOworCQkgIHJhbmdlX2hpZ2hfdHlwZSA9IFZBTFVFX1RZUEUgKGVsZW1fdmFsKTsKKwkJICByYW5nZV9oaWdoID0gdmFsdWVfYXNfbG9uZyAoZWxlbV92YWwpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgZWxlbV92YWwgPSBldmFsdWF0ZV9zdWJleHAgKGVsZW1lbnRfdHlwZSwgZXhwLCBwb3MsIG5vc2lkZSk7CisJCSAgcmFuZ2VfbG93X3R5cGUgPSByYW5nZV9oaWdoX3R5cGUgPSBWQUxVRV9UWVBFIChlbGVtX3ZhbCk7CisJCSAgcmFuZ2VfbG93ID0gcmFuZ2VfaGlnaCA9IHZhbHVlX2FzX2xvbmcgKGVsZW1fdmFsKTsKKwkJfQorCSAgICAgIC8qIGNoZWNrIHR5cGVzIG9mIGVsZW1lbnRzIHRvIGF2b2lkIG1peHR1cmUgb2YgZWxlbWVudHMgZnJvbQorCQkgZGlmZmVyZW50IHR5cGVzLiBBbHNvIGNoZWNrIGlmIHR5cGUgb2YgZWxlbWVudCBpcyAiY29tcGF0aWJsZSIKKwkJIHdpdGggZWxlbWVudCB0eXBlIG9mIHBvd2Vyc2V0ICovCisJICAgICAgaWYgKFRZUEVfQ09ERSAocmFuZ2VfbG93X3R5cGUpID09IFRZUEVfQ09ERV9SQU5HRSkKKwkJcmFuZ2VfbG93X3R5cGUgPSBUWVBFX1RBUkdFVF9UWVBFIChyYW5nZV9sb3dfdHlwZSk7CisJICAgICAgaWYgKFRZUEVfQ09ERSAocmFuZ2VfaGlnaF90eXBlKSA9PSBUWVBFX0NPREVfUkFOR0UpCisJCXJhbmdlX2hpZ2hfdHlwZSA9IFRZUEVfVEFSR0VUX1RZUEUgKHJhbmdlX2hpZ2hfdHlwZSk7CisJICAgICAgaWYgKChUWVBFX0NPREUgKHJhbmdlX2xvd190eXBlKSAhPSBUWVBFX0NPREUgKHJhbmdlX2hpZ2hfdHlwZSkpIHx8CisJCSAgKFRZUEVfQ09ERSAocmFuZ2VfbG93X3R5cGUpID09IFRZUEVfQ09ERV9FTlVNICYmCisJCSAgIChyYW5nZV9sb3dfdHlwZSAhPSByYW5nZV9oaWdoX3R5cGUpKSkKKwkJLyogZGlmZmVyZW50IGVsZW1lbnQgbW9kZXMgKi8KKwkJZXJyb3IgKCJQT1dFUlNFVCB0dXBsZSBlbGVtZW50cyBvZiBkaWZmZXJlbnQgbW9kZSIpOworCSAgICAgIGlmICgoVFlQRV9DT0RFIChjaGVja190eXBlKSAhPSBUWVBFX0NPREUgKHJhbmdlX2xvd190eXBlKSkgfHwKKwkJICAoVFlQRV9DT0RFIChjaGVja190eXBlKSA9PSBUWVBFX0NPREVfRU5VTSAmJgorCQkgICByYW5nZV9sb3dfdHlwZSAhPSBjaGVja190eXBlKSkKKwkJZXJyb3IgKCJpbmNvbXBhdGlibGUgUE9XRVJTRVQgdHVwbGUgZWxlbWVudHMiKTsKKwkgICAgICBpZiAocmFuZ2VfbG93ID4gcmFuZ2VfaGlnaCkKKwkJeworCQkgIHdhcm5pbmcgKCJlbXB0eSBQT1dFUlNFVCB0dXBsZSByYW5nZSIpOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgaWYgKHJhbmdlX2xvdyA8IGxvd19ib3VuZCB8fCByYW5nZV9oaWdoID4gaGlnaF9ib3VuZCkKKwkJZXJyb3IgKCJQT1dFUlNFVCB0dXBsZSBlbGVtZW50IG91dCBvZiByYW5nZSIpOworCSAgICAgIHJhbmdlX2xvdyAtPSBsb3dfYm91bmQ7CisJICAgICAgcmFuZ2VfaGlnaCAtPSBsb3dfYm91bmQ7CisJICAgICAgZm9yICggOyByYW5nZV9sb3cgPD0gcmFuZ2VfaGlnaDsgcmFuZ2VfbG93KyspCisJCXsKKwkJICBpbnQgYml0X2luZGV4ID0gKHVuc2lnbmVkKSByYW5nZV9sb3cgJSBUQVJHRVRfQ0hBUl9CSVQ7CisJCSAgaWYgKEJJVFNfQklHX0VORElBTikKKwkJICAgIGJpdF9pbmRleCA9IFRBUkdFVF9DSEFSX0JJVCAtIDEgLSBiaXRfaW5kZXg7CisJCSAgdmFsYWRkciBbKHVuc2lnbmVkKSByYW5nZV9sb3cgLyBUQVJHRVRfQ0hBUl9CSVRdCisJCSAgICB8PSAxIDw8IGJpdF9pbmRleDsKKwkJfQorCSAgICB9CisJICByZXR1cm4gc2V0OworCX0KKworICAgICAgYXJndmVjID0gKHZhbHVlX3B0ciAqKSBhbGxvY2EgKHNpemVvZiAodmFsdWVfcHRyKSAqIG5hcmdzKTsKKyAgICAgIGZvciAodGVtID0gMDsgdGVtIDwgbmFyZ3M7IHRlbSsrKQorCXsKKwkgIC8qIEVuc3VyZSB0aGF0IGFycmF5IGV4cHJlc3Npb25zIGFyZSBjb2VyY2VkIGludG8gcG9pbnRlciBvYmplY3RzLiAqLworCSAgYXJndmVjW3RlbV0gPSBldmFsdWF0ZV9zdWJleHBfd2l0aF9jb2VyY2lvbiAoZXhwLCBwb3MsIG5vc2lkZSk7CisJfQorICAgICAgaWYgKG5vc2lkZSA9PSBFVkFMX1NLSVApCisJZ290byBub3NpZGVyZXQ7CisgICAgICByZXR1cm4gdmFsdWVfYXJyYXkgKHRlbTIsIHRlbTMsIGFyZ3ZlYyk7CisKKyAgICBjYXNlIFRFUk5PUF9TTElDRToKKyAgICAgIHsKKwl2YWx1ZV9wdHIgYXJyYXkgPSBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIG5vc2lkZSk7CisJaW50IGxvd2JvdW5kCisJICA9IHZhbHVlX2FzX2xvbmcgKGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgbm9zaWRlKSk7CisJaW50IHVwcGVyCisJICA9IHZhbHVlX2FzX2xvbmcgKGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgbm9zaWRlKSk7CisJaWYgKG5vc2lkZSA9PSBFVkFMX1NLSVApCisJICBnb3RvIG5vc2lkZXJldDsKKwlyZXR1cm4gdmFsdWVfc2xpY2UgKGFycmF5LCBsb3dib3VuZCwgdXBwZXIgLSBsb3dib3VuZCArIDEpOworICAgICAgfQorCisgICAgY2FzZSBURVJOT1BfU0xJQ0VfQ09VTlQ6CisgICAgICB7CisJdmFsdWVfcHRyIGFycmF5ID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworCWludCBsb3dib3VuZAorCSAgPSB2YWx1ZV9hc19sb25nIChldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIG5vc2lkZSkpOworCWludCBsZW5ndGgKKwkgID0gdmFsdWVfYXNfbG9uZyAoZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpKTsKKwlyZXR1cm4gdmFsdWVfc2xpY2UgKGFycmF5LCBsb3dib3VuZCwgbGVuZ3RoKTsKKyAgICAgIH0KKworICAgIGNhc2UgVEVSTk9QX0NPTkQ6CisgICAgICAvKiBTa2lwIHRoaXJkIGFuZCBzZWNvbmQgYXJncyB0byBldmFsdWF0ZSB0aGUgZmlyc3Qgb25lLiAgKi8KKyAgICAgIGFyZzEgPSBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICBpZiAodmFsdWVfbG9naWNhbF9ub3QgKGFyZzEpKQorCXsKKwkgIGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgRVZBTF9TS0lQKTsKKwkgIHJldHVybiBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIG5vc2lkZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGFyZzIgPSBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIG5vc2lkZSk7CisJICBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIEVWQUxfU0tJUCk7CisJICByZXR1cm4gYXJnMjsKKwl9CisKKyAgICBjYXNlIE9QX0ZVTkNBTEw6CisgICAgICAoKnBvcykgKz0gMjsKKyAgICAgIG9wID0gZXhwLT5lbHRzWypwb3NdLm9wY29kZTsKKyAgICAgIG5hcmdzID0gbG9uZ2VzdF90b19pbnQgKGV4cC0+ZWx0c1twYyArIDFdLmxvbmdjb25zdCk7CisgICAgICAvKiBBbGxvY2F0ZSBhcmcgdmVjdG9yLCBpbmNsdWRpbmcgc3BhY2UgZm9yIHRoZSBmdW5jdGlvbiB0byBiZQorCSBjYWxsZWQgaW4gYXJndmVjWzBdIGFuZCBhIHRlcm1pbmF0aW5nIE5VTEwgKi8KKyAgICAgIGFyZ3ZlYyA9ICh2YWx1ZV9wdHIgKikgYWxsb2NhIChzaXplb2YgKHZhbHVlX3B0cikgKiAobmFyZ3MgKyAzKSk7CisgICAgICBpZiAob3AgPT0gU1RSVUNUT1BfTUVNQkVSIHx8IG9wID09IFNUUlVDVE9QX01QVFIpCisJeworCSAgTE9OR0VTVCBmbnB0cjsKKworICAgICAgICAgIC8qIDE5OTctMDgtMDEgQ3VycmVudGx5IHdlIGRvIG5vdCBzdXBwb3J0IGZ1bmN0aW9uIGludm9jYXRpb24KKyAgICAgICAgICAgICB2aWEgcG9pbnRlcnMtdG8tbWV0aG9kcyB3aXRoIEhQIGFDQy4gUG9pbnRlciBkb2VzIG5vdCBwb2ludAorICAgICAgICAgICAgIHRvIHRoZSBmdW5jdGlvbiwgYnV0IHBvc3NpYmx5IHRvIHNvbWUgdGh1bmsuICovCisgICAgICAgICAgaWYgKGhwX3NvbV9zb21fb2JqZWN0X3ByZXNlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGVycm9yICgiTm90IGltcGxlbWVudGVkOiBmdW5jdGlvbiBpbnZvY2F0aW9uIHRocm91Z2ggcG9pbnRlciB0byBtZXRob2Qgd2l0aCBIUCBhQ0MiKTsKKyAgICAgICAgICAgIH0KKworCSAgbmFyZ3MrKzsKKwkgIC8qIEZpcnN0LCBldmFsdWF0ZSB0aGUgc3RydWN0dXJlIGludG8gYXJnMiAqLworCSAgcGMyID0gKCpwb3MpKys7CisKKwkgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQKQorCSAgICBnb3RvIG5vc2lkZXJldDsKKworCSAgaWYgKG9wID09IFNUUlVDVE9QX01FTUJFUikKKwkgICAgeworCSAgICAgIGFyZzIgPSBldmFsdWF0ZV9zdWJleHBfZm9yX2FkZHJlc3MgKGV4cCwgcG9zLCBub3NpZGUpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhcmcyID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworCSAgICB9CisKKwkgIC8qIElmIHRoZSBmdW5jdGlvbiBpcyBhIHZpcnR1YWwgZnVuY3Rpb24sIHRoZW4gdGhlCisJICAgICBhZ2dyZWdhdGUgdmFsdWUgKHByb3ZpZGluZyB0aGUgc3RydWN0dXJlKSBwbGF5cworCSAgICAgaXRzIHBhcnQgYnkgcHJvdmlkaW5nIHRoZSB2dGFibGUuICBPdGhlcndpc2UsCisJICAgICBpdCBpcyBqdXN0IGFsb25nIGZvciB0aGUgcmlkZTogY2FsbCB0aGUgZnVuY3Rpb24KKwkgICAgIGRpcmVjdGx5LiAgKi8KKworCSAgYXJnMSA9IGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgbm9zaWRlKTsKKworCSAgZm5wdHIgPSB2YWx1ZV9hc19sb25nIChhcmcxKTsKKworCSAgaWYgKE1FVEhPRF9QVFJfSVNfVklSVFVBTChmbnB0cikpCisJICAgIHsKKwkgICAgICBpbnQgZm5vZmZzZXQgPSBNRVRIT0RfUFRSX1RPX1ZPRkZTRVQoZm5wdHIpOworCSAgICAgIHN0cnVjdCB0eXBlICpiYXNldHlwZTsKKwkgICAgICBzdHJ1Y3QgdHlwZSAqZG9tYWluX3R5cGUgPQorCQkgIFRZUEVfRE9NQUlOX1RZUEUgKFRZUEVfVEFSR0VUX1RZUEUgKFZBTFVFX1RZUEUgKGFyZzEpKSk7CisJICAgICAgaW50IGksIGo7CisJICAgICAgYmFzZXR5cGUgPSBUWVBFX1RBUkdFVF9UWVBFIChWQUxVRV9UWVBFIChhcmcyKSk7CisJICAgICAgaWYgKGRvbWFpbl90eXBlICE9IGJhc2V0eXBlKQorCQkgIGFyZzIgPSB2YWx1ZV9jYXN0KGxvb2t1cF9wb2ludGVyX3R5cGUgKGRvbWFpbl90eXBlKSwgYXJnMik7CisJICAgICAgYmFzZXR5cGUgPSBUWVBFX1ZQVFJfQkFTRVRZUEUgKGRvbWFpbl90eXBlKTsKKwkgICAgICBmb3IgKGkgPSBUWVBFX05GTl9GSUVMRFMgKGJhc2V0eXBlKSAtIDE7IGkgPj0gMDsgaS0tKQorCQl7CisJCSAgc3RydWN0IGZuX2ZpZWxkICpmID0gVFlQRV9GTl9GSUVMRExJU1QxIChiYXNldHlwZSwgaSk7CisJCSAgLyogSWYgb25lIGlzIHZpcnR1YWwsIHRoZW4gYWxsIGFyZSB2aXJ0dWFsLiAgKi8KKwkJICBpZiAoVFlQRV9GTl9GSUVMRF9WSVJUVUFMX1AgKGYsIDApKQorCQkgICAgZm9yIChqID0gVFlQRV9GTl9GSUVMRExJU1RfTEVOR1RIIChiYXNldHlwZSwgaSkgLSAxOyBqID49IDA7IC0taikKKwkJICAgICAgaWYgKChpbnQpIFRZUEVfRk5fRklFTERfVk9GRlNFVCAoZiwgaikgPT0gZm5vZmZzZXQpCisJCQl7CisJCQkgIHZhbHVlX3B0ciB0ZW1wID0gdmFsdWVfaW5kIChhcmcyKTsKKwkJCSAgYXJnMSA9IHZhbHVlX3ZpcnR1YWxfZm5fZmllbGQgKCZ0ZW1wLCBmLCBqLCBkb21haW5fdHlwZSwgMCk7CisJCQkgIGFyZzIgPSB2YWx1ZV9hZGRyICh0ZW1wKTsKKwkJCSAgZ290byBnb3RfaXQ7CisJCQl9CisJCX0KKwkgICAgICBpZiAoaSA8IDApCisJCWVycm9yICgidmlydHVhbCBmdW5jdGlvbiBhdCBpbmRleCAlZCBub3QgZm91bmQiLCBmbm9mZnNldCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIFZBTFVFX1RZUEUgKGFyZzEpID0gbG9va3VwX3BvaW50ZXJfdHlwZSAoVFlQRV9UQVJHRVRfVFlQRSAoVkFMVUVfVFlQRSAoYXJnMSkpKTsKKwkgICAgfQorCWdvdF9pdDoKKworCSAgLyogTm93LCBzYXkgd2hpY2ggYXJndW1lbnQgdG8gc3RhcnQgZXZhbHVhdGluZyBmcm9tICovCisJICB0ZW0gPSAyOworCX0KKyAgICAgIGVsc2UgaWYgKG9wID09IFNUUlVDVE9QX1NUUlVDVCB8fCBvcCA9PSBTVFJVQ1RPUF9QVFIpCisJeworCSAgLyogSGFpciBmb3IgbWV0aG9kIGludm9jYXRpb25zICovCisJICBpbnQgdGVtMjsKKworCSAgbmFyZ3MrKzsKKwkgIC8qIEZpcnN0LCBldmFsdWF0ZSB0aGUgc3RydWN0dXJlIGludG8gYXJnMiAqLworCSAgcGMyID0gKCpwb3MpKys7CisJICB0ZW0yID0gbG9uZ2VzdF90b19pbnQgKGV4cC0+ZWx0c1twYzIgKyAxXS5sb25nY29uc3QpOworCSAgKnBvcyArPSAzICsgQllURVNfVE9fRVhQX0VMRU0gKHRlbTIgKyAxKTsKKwkgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQKQorCSAgICBnb3RvIG5vc2lkZXJldDsKKworCSAgaWYgKG9wID09IFNUUlVDVE9QX1NUUlVDVCkKKwkgICAgeworCSAgICAgIC8qIElmIHYgaXMgYSB2YXJpYWJsZSBpbiBhIHJlZ2lzdGVyLCBhbmQgdGhlIHVzZXIgdHlwZXMKKwkJIHYubWV0aG9kICgpLCB0aGlzIHdpbGwgcHJvZHVjZSBhbiBlcnJvciwgYmVjYXVzZSB2IGhhcworCQkgbm8gYWRkcmVzcy4KKworCQkgQSBwb3NzaWJsZSB3YXkgYXJvdW5kIHRoaXMgd291bGQgYmUgdG8gYWxsb2NhdGUgYQorCQkgY29weSBvZiB0aGUgdmFyaWFibGUgb24gdGhlIHN0YWNrLCBjb3B5IGluIHRoZQorCQkgY29udGVudHMsIGNhbGwgdGhlIGZ1bmN0aW9uLCBhbmQgY29weSBvdXQgdGhlCisJCSBjb250ZW50cy4gIEkuZS4gY29udmVydCB0aGlzIGZyb20gY2FsbCBieSByZWZlcmVuY2UKKwkJIHRvIGNhbGwgYnkgY29weS1yZXR1cm4gKG9yIHdoYXRldmVyIGl0J3MgY2FsbGVkKS4KKwkJIEhvd2V2ZXIsIHRoaXMgZG9lcyBub3Qgd29yayBiZWNhdXNlIGl0IGlzIG5vdCB0aGUKKwkJIHNhbWU6IHRoZSBtZXRob2QgYmVpbmcgY2FsbGVkIGNvdWxkIHN0YXNoIGEgY29weSBvZgorCQkgdGhlIGFkZHJlc3MsIGFuZCB0aGVuIGZ1dHVyZSB1c2VzIHRocm91Z2ggdGhhdCBhZGRyZXNzCisJCSAoYWZ0ZXIgdGhlIG1ldGhvZCByZXR1cm5zKSB3b3VsZCBiZSBleHBlY3RlZCB0bworCQkgdXNlIHRoZSB2YXJpYWJsZSBpdHNlbGYsIG5vdCBzb21lIGNvcHkgb2YgaXQuICAqLworCSAgICAgIGFyZzIgPSBldmFsdWF0ZV9zdWJleHBfZm9yX2FkZHJlc3MgKGV4cCwgcG9zLCBub3NpZGUpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhcmcyID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworCSAgICB9CisJICAvKiBOb3csIHNheSB3aGljaCBhcmd1bWVudCB0byBzdGFydCBldmFsdWF0aW5nIGZyb20gKi8KKwkgIHRlbSA9IDI7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIE5vbi1tZXRob2QgZnVuY3Rpb24gY2FsbCAqLworCSAgc2F2ZV9wb3MxID0gKnBvczsKKwkgIGFyZ3ZlY1swXSA9IGV2YWx1YXRlX3N1YmV4cF93aXRoX2NvZXJjaW9uIChleHAsIHBvcywgbm9zaWRlKTsKKwkgIHRlbSA9IDE7CisJICB0eXBlID0gVkFMVUVfVFlQRSAoYXJndmVjWzBdKTsKKwkgIGlmICh0eXBlICYmIFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1BUUikKKwkgICAgdHlwZSA9IFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpOworCSAgaWYgKHR5cGUgJiYgVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfRlVOQykKKwkgICAgeworCSAgICAgIGZvciAoOyB0ZW0gPD0gbmFyZ3MgJiYgdGVtIDw9IFRZUEVfTkZJRUxEUyAodHlwZSk7IHRlbSsrKQorCQl7CisgICAgICAgICAgICAgICAgICAvKiBwYWk6IEZJWE1FIFRoaXMgc2VlbXMgdG8gYmUgY29lcmNpbmcgYXJndW1lbnRzIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICogb3ZlcmxvYWQgcmVzb2x1dGlvbiBoYXMgYmVlbiBkb25lISAqLworCQkgIGFyZ3ZlY1t0ZW1dID0gZXZhbHVhdGVfc3ViZXhwIChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIHRlbS0xKSwKKwkJCQkJCSBleHAsIHBvcywgbm9zaWRlKTsKKwkJfQorCSAgICB9CisJfQorCisgICAgICAvKiBFdmFsdWF0ZSBhcmd1bWVudHMgKi8KKyAgICAgIGZvciAoOyB0ZW0gPD0gbmFyZ3M7IHRlbSsrKQorCXsKKwkgIC8qIEVuc3VyZSB0aGF0IGFycmF5IGV4cHJlc3Npb25zIGFyZSBjb2VyY2VkIGludG8gcG9pbnRlciBvYmplY3RzLiAqLworCSAgYXJndmVjW3RlbV0gPSBldmFsdWF0ZV9zdWJleHBfd2l0aF9jb2VyY2lvbiAoZXhwLCBwb3MsIG5vc2lkZSk7CisJfQorCisgICAgICAvKiBzaWduYWwgZW5kIG9mIGFyZ2xpc3QgKi8KKyAgICAgIGFyZ3ZlY1t0ZW1dID0gMDsKKworICAgICAgaWYgKG9wID09IFNUUlVDVE9QX1NUUlVDVCB8fCBvcCA9PSBTVFJVQ1RPUF9QVFIpCisJeworCSAgaW50IHN0YXRpY19tZW1mdW5jcDsKKwkgIHZhbHVlX3B0ciB0ZW1wID0gYXJnMjsKKwkgIGNoYXIgdHN0clsyNTZdOworICAgICAgICAgIHN0cnVjdCBmbl9maWVsZCAqIGZuc19wdHI7CisgICAgICAgICAgaW50IG51bV9mbnM7CisgICAgICAgICAgc3RydWN0IHR5cGUgKiBiYXNldHlwZTsKKyAgICAgICAgICBpbnQgYm9mZnNldDsKKworICAgICAgICAgIC8qIE1ldGhvZCBpbnZvY2F0aW9uIDogc3R1ZmYgInRoaXMiIGFzIGZpcnN0IHBhcmFtZXRlciAqLworICAgICAgICAgIC8qIHBhaTogdGhpcyB1c2VkIHRvIGhhdmUgbG9va3VwX3BvaW50ZXJfdHlwZSBmb3Igc29tZSByZWFzb24sCisgICAgICAgICAgICogYnV0IHRlbXAgaXMgYWxyZWFkeSBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdCAqLworCSAgYXJndmVjWzFdID0gdmFsdWVfZnJvbV9sb25nZXN0IChWQUxVRV9UWVBFICh0ZW1wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX0FERFJFU1MgKHRlbXApK1ZBTFVFX09GRlNFVCAodGVtcCkpOworICAgICAgICAgIC8qIE5hbWUgb2YgbWV0aG9kIGZyb20gZXhwcmVzc2lvbiAqLyAKKyAgICAgICAgICBzdHJjcHkodHN0ciwgJmV4cC0+ZWx0c1twYzIrMl0uc3RyaW5nKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAob3ZlcmxvYWRfcmVzb2x1dGlvbiAmJiAoZXhwLT5sYW5ndWFnZV9kZWZuLT5sYV9sYW5ndWFnZSA9PSBsYW5ndWFnZV9jcGx1cykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIExhbmd1YWdlIGlzIEMrKywgZG8gc29tZSBvdmVybG9hZCByZXNvbHV0aW9uIGJlZm9yZSBldmFsdWF0aW9uICovCisgICAgICAgICAgICAgIHZhbHVlX3B0ciB2YWxwID0gTlVMTDsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIC8qIFByZXBhcmUgbGlzdCBvZiBhcmd1bWVudCB0eXBlcyBmb3Igb3ZlcmxvYWQgcmVzb2x1dGlvbiAqLyAKKyAgICAgICAgICAgICAgYXJnX3R5cGVzID0gKHN0cnVjdCB0eXBlICoqKSB4bWFsbG9jIChuYXJncyAqIChzaXplb2YgKHN0cnVjdCB0eXBlICopKSk7CisgICAgICAgICAgICAgIGZvciAoaXg9MTsgaXggPD0gbmFyZ3M7IGl4KyspCisgICAgICAgICAgICAgICAgYXJnX3R5cGVzW2l4LTFdID0gVkFMVUVfVFlQRSAoYXJndmVjW2l4XSk7CisKKyAgICAgICAgICAgICAgKHZvaWQpIGZpbmRfb3ZlcmxvYWRfbWF0Y2ggKGFyZ190eXBlcywgbmFyZ3MsIHRzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8qIG1ldGhvZCAqLywgMCAvKiBzdHJpY3QgbWF0Y2ggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyIC8qIHRoZSBvYmplY3QgKi8sIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFscCwgTlVMTCwgJnN0YXRpY19tZW1mdW5jcCk7CisKKworICAgICAgICAgICAgICBhcmd2ZWNbMV0gPSBhcmcyOyAgLyogdGhlIGBgdGhpcycnIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgYXJndmVjWzBdID0gdmFscDsgIC8qIHVzZSB0aGUgbWV0aG9kIGZvdW5kIGFmdGVyIG92ZXJsb2FkIHJlc29sdXRpb24gKi8gCisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSAvKiBOb24tQysrIGNhc2UgLS0gb3Igbm8gb3ZlcmxvYWQgcmVzb2x1dGlvbiAqLyAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdGVtcCA9IGFyZzI7CisgICAgICAgICAgICAgIGFyZ3ZlY1swXSA9IHZhbHVlX3N0cnVjdF9lbHQgKCZ0ZW1wLCBhcmd2ZWMrMSwgdHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRpY19tZW1mdW5jcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPT0gU1RSVUNUT1BfU1RSVUNUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gInN0cnVjdHVyZSIgOiAic3RydWN0dXJlIHBvaW50ZXIiKTsKKyAgICAgICAgICAgICAgYXJndmVjWzFdID0gYXJnMjsgLyogdGhlIGBgdGhpcycnIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIH0KKworCSAgaWYgKHN0YXRpY19tZW1mdW5jcCkKKwkgICAgeworCSAgICAgIGFyZ3ZlY1sxXSA9IGFyZ3ZlY1swXTsKKwkgICAgICBuYXJncy0tOworCSAgICAgIGFyZ3ZlYysrOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAob3AgPT0gU1RSVUNUT1BfTUVNQkVSIHx8IG9wID09IFNUUlVDVE9QX01QVFIpCisJeworCSAgYXJndmVjWzFdID0gYXJnMjsKKwkgIGFyZ3ZlY1swXSA9IGFyZzE7CisJfQorICAgICAgZWxzZQorICAgICAgICB7IAorCSAgLyogTm9uLW1lbWJlciBmdW5jdGlvbiBiZWluZyBjYWxsZWQgKi8KKworICAgICAgICAgIGlmIChvdmVybG9hZF9yZXNvbHV0aW9uICYmIChleHAtPmxhbmd1YWdlX2RlZm4tPmxhX2xhbmd1YWdlID09IGxhbmd1YWdlX2NwbHVzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogTGFuZ3VhZ2UgaXMgQysrLCBkbyBzb21lIG92ZXJsb2FkIHJlc29sdXRpb24gYmVmb3JlIGV2YWx1YXRpb24gKi8KKyAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sICogc3ltcDsKKworICAgICAgICAgICAgICAvKiBQcmVwYXJlIGxpc3Qgb2YgYXJndW1lbnQgdHlwZXMgZm9yIG92ZXJsb2FkIHJlc29sdXRpb24gKi8gCisgICAgICAgICAgICAgIGFyZ190eXBlcyA9IChzdHJ1Y3QgdHlwZSAqKikgeG1hbGxvYyAobmFyZ3MgKiAoc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSkpOworICAgICAgICAgICAgICBmb3IgKGl4PTE7IGl4IDw9IG5hcmdzOyBpeCsrKQorICAgICAgICAgICAgICAgIGFyZ190eXBlc1tpeC0xXSA9IFZBTFVFX1RZUEUgKGFyZ3ZlY1tpeF0pOworCisgICAgICAgICAgICAgICh2b2lkKSBmaW5kX292ZXJsb2FkX21hdGNoIChhcmdfdHlwZXMsIG5hcmdzLCBOVUxMIC8qIG5vIG5lZWQgZm9yIG5hbWUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIG5vdCBtZXRob2QgKi8sIDAgLyogc3RyaWN0IG1hdGNoICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZXhwLT5lbHRzWzVdLnN5bWJvbCAvKiB0aGUgZnVuY3Rpb24gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmc3ltcCwgTlVMTCk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAvKiBOb3cgZml4IHRoZSBleHByZXNzaW9uIGJlaW5nIGV2YWx1YXRlZCAqLyAKKyAgICAgICAgICAgICAgZXhwLT5lbHRzWzVdLnN5bWJvbCA9IHN5bXA7CisgICAgICAgICAgICAgIGFyZ3ZlY1swXSA9IGV2YWx1YXRlX3N1YmV4cF93aXRoX2NvZXJjaW9uIChleHAsICZzYXZlX3BvczEsIG5vc2lkZSk7CisgICAgICAgICAgICB9IAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogTm90IEMrKywgb3Igbm8gb3ZlcmxvYWQgcmVzb2x1dGlvbiBhbGxvd2VkICovIAorICAgICAgICAgICAgICAvKiBub3RoaW5nIHRvIGJlIGRvbmU7IGFyZ3ZlYyBhbHJlYWR5IGNvcnJlY3RseSBzZXQgdXAgKi8gCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIGRvX2NhbGxfaXQ6CisKKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQKQorCWdvdG8gbm9zaWRlcmV0OworICAgICAgaWYgKG5vc2lkZSA9PSBFVkFMX0FWT0lEX1NJREVfRUZGRUNUUykKKwl7CisJICAvKiBJZiB0aGUgcmV0dXJuIHR5cGUgZG9lc24ndCBsb29rIGxpa2UgYSBmdW5jdGlvbiB0eXBlLCBjYWxsIGFuCisJICAgICBlcnJvci4gIFRoaXMgY2FuIGhhcHBlbiBpZiBzb21lYm9keSB0cmllcyB0byB0dXJuIGEgdmFyaWFibGUgaW50bworCSAgICAgYSBmdW5jdGlvbiBjYWxsLiBUaGlzIGlzIGhlcmUgYmVjYXVzZSBwZW9wbGUgb2Z0ZW4gd2FudCB0bworCSAgICAgY2FsbCwgZWcsIHN0cmNtcCwgd2hpY2ggZ2RiIGRvZXNuJ3Qga25vdyBpcyBhIGZ1bmN0aW9uLiAgSWYKKwkgICAgIGdkYiBpc24ndCBhc2tlZCBmb3IgaXQncyBvcGluaW9uIChpZS4gdGhyb3VnaCAid2hhdGlzIiksCisJICAgICBpdCB3b24ndCBvZmZlciBpdC4gKi8KKworCSAgc3RydWN0IHR5cGUgKmZ0eXBlID0KKwkgICAgVFlQRV9UQVJHRVRfVFlQRSAoVkFMVUVfVFlQRSAoYXJndmVjWzBdKSk7CisKKwkgIGlmIChmdHlwZSkKKwkgICAgcmV0dXJuIGFsbG9jYXRlX3ZhbHVlIChUWVBFX1RBUkdFVF9UWVBFIChWQUxVRV9UWVBFIChhcmd2ZWNbMF0pKSk7CisJICBlbHNlCisJICAgIGVycm9yICgiRXhwcmVzc2lvbiBvZiB0eXBlIG90aGVyIHRoYW4gXCJGdW5jdGlvbiByZXR1cm5pbmcgLi4uXCIgdXNlZCBhcyBmdW5jdGlvbiIpOworCX0KKyAgICAgIGlmIChhcmd2ZWNbMF0gPT0gTlVMTCkKKyAgICAgICAgZXJyb3IgKCJDYW5ub3QgZXZhbHVhdGUgZnVuY3Rpb24gLS0gbWF5IGJlIGlubGluZWQiKTsKKyAgICAgIHJldHVybiBjYWxsX2Z1bmN0aW9uX2J5X2hhbmQgKGFyZ3ZlY1swXSwgbmFyZ3MsIGFyZ3ZlYyArIDEpOworICAgICAgLyogcGFpOiBGSVhNRSBzYXZlIHZhbHVlIGZyb20gY2FsbF9mdW5jdGlvbl9ieV9oYW5kLCB0aGVuIGFkanVzdCBwYyBieSBhZGp1c3RfZm5fcGMgaWYgK3ZlICAqLworCisgICAgY2FzZSBPUF9GNzdfVU5ERVRFUk1JTkVEX0FSR0xJU1Q6IAorCisgICAgICAvKiBSZW1lbWJlciB0aGF0IGluIEY3NywgZnVuY3Rpb25zLCBzdWJzdHJpbmcgb3BzIGFuZCAKKyAgICAgICAgIGFycmF5IHN1YnNjcmlwdCBvcGVyYXRpb25zIGNhbm5vdCBiZSBkaXNhbWJpZ3VhdGVkIAorICAgICAgICAgYXQgcGFyc2UgdGltZS4gIFdlIGhhdmUgbWFkZSBhbGwgYXJyYXkgc3Vic2NyaXB0IG9wZXJhdGlvbnMsIAorICAgICAgICAgc3Vic3RyaW5nIG9wZXJhdGlvbnMgYXMgd2VsbCBhcyBmdW5jdGlvbiBjYWxscyAgY29tZSBoZXJlIAorICAgICAgICAgYW5kIHdlIG5vdyBoYXZlIHRvIGRpc2NvdmVyIHdoYXQgdGhlIGhlY2sgdGhpcyB0aGluZyBhY3R1YWxseSB3YXMuICAKKwkgSWYgaXQgaXMgYSBmdW5jdGlvbiwgd2UgcHJvY2VzcyBqdXN0IGFzIGlmIHdlIGdvdCBhbiBPUF9GVU5DQUxMLiAqLworCisgICAgICBuYXJncyA9IGxvbmdlc3RfdG9faW50IChleHAtPmVsdHNbcGMrMV0ubG9uZ2NvbnN0KTsKKyAgICAgICgqcG9zKSArPSAyOworCisgICAgICAvKiBGaXJzdCBkZXRlcm1pbmUgdGhlIHR5cGUgY29kZSB3ZSBhcmUgZGVhbGluZyB3aXRoLiAgKi8gCisgICAgICBhcmcxID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZzEpKTsKKyAgICAgIGNvZGUgPSBUWVBFX0NPREUgKHR5cGUpOworCisgICAgICBzd2l0Y2ggKGNvZGUpIAorCXsKKwljYXNlIFRZUEVfQ09ERV9BUlJBWToKKwkgIGdvdG8gbXVsdGlfZjc3X3N1YnNjcmlwdDsKKworCWNhc2UgVFlQRV9DT0RFX1NUUklORzoKKwkgIGdvdG8gb3BfZjc3X3N1YnN0cjsKKworCWNhc2UgVFlQRV9DT0RFX1BUUjoKKwljYXNlIFRZUEVfQ09ERV9GVU5DOgorCSAgLyogSXQncyBhIGZ1bmN0aW9uIGNhbGwuICovCisJICAvKiBBbGxvY2F0ZSBhcmcgdmVjdG9yLCBpbmNsdWRpbmcgc3BhY2UgZm9yIHRoZSBmdW5jdGlvbiB0byBiZQorCSAgICAgY2FsbGVkIGluIGFyZ3ZlY1swXSBhbmQgYSB0ZXJtaW5hdGluZyBOVUxMICovCisJICBhcmd2ZWMgPSAodmFsdWVfcHRyICopIGFsbG9jYSAoc2l6ZW9mICh2YWx1ZV9wdHIpICogKG5hcmdzICsgMikpOworCSAgYXJndmVjWzBdID0gYXJnMTsKKwkgIHRlbSA9IDE7CisJICBmb3IgKDsgdGVtIDw9IG5hcmdzOyB0ZW0rKykKKwkgICAgYXJndmVjW3RlbV0gPSBldmFsdWF0ZV9zdWJleHBfd2l0aF9jb2VyY2lvbiAoZXhwLCBwb3MsIG5vc2lkZSk7CisJICBhcmd2ZWNbdGVtXSA9IDA7IC8qIHNpZ25hbCBlbmQgb2YgYXJnbGlzdCAqLworCSAgZ290byBkb19jYWxsX2l0OworCisJZGVmYXVsdDoKKyAgICAgICAgICAgICAgZXJyb3IgKCJDYW5ub3QgcGVyZm9ybSBzdWJzdHJpbmcgb24gdGhpcyB0eXBlIik7IAorCX0KKworICAgIG9wX2Y3N19zdWJzdHI6CisgICAgICAvKiBXZSBoYXZlIGEgc3Vic3RyaW5nIG9wZXJhdGlvbiBvbiBvdXIgaGFuZHMgaGVyZSwgCisgICAgICAgICBsZXQgdXMgZ2V0IHRoZSBzdHJpbmcgd2Ugd2lsbCBiZSBkZWFsaW5nIHdpdGggKi8KKworICAgICAgLyogTm93IGV2YWx1YXRlIHRoZSAnZnJvbScgYW5kICd0bycgKi8KKworICAgICAgYXJnMiA9IGV2YWx1YXRlX3N1YmV4cF93aXRoX2NvZXJjaW9uIChleHAsIHBvcywgbm9zaWRlKTsKKworICAgICAgaWYgKG5hcmdzIDwgMikKKwlyZXR1cm4gdmFsdWVfc3Vic2NyaXB0IChhcmcxLCBhcmcyKTsKKworICAgICAgYXJnMyA9IGV2YWx1YXRlX3N1YmV4cF93aXRoX2NvZXJjaW9uIChleHAsIHBvcywgbm9zaWRlKTsKKworICAgICAgaWYgKG5vc2lkZSA9PSBFVkFMX1NLSVApCisgICAgICAgIGdvdG8gbm9zaWRlcmV0OworICAgICAgCisgICAgICB0ZW0yID0gdmFsdWVfYXNfbG9uZyAoYXJnMik7CisgICAgICB0ZW0zID0gdmFsdWVfYXNfbG9uZyAoYXJnMyk7CisgICAgICAKKyAgICAgIHJldHVybiB2YWx1ZV9zbGljZSAoYXJnMSwgdGVtMiwgdGVtMyAtIHRlbTIgKyAxKTsKKworICAgIGNhc2UgT1BfQ09NUExFWDoKKyAgICAgIC8qIFdlIGhhdmUgYSBjb21wbGV4IG51bWJlciwgVGhlcmUgc2hvdWxkIGJlIDIgZmxvYXRpbmcgCisJIHBvaW50IG51bWJlcnMgdGhhdCBjb21wb3NlIGl0ICovIAorICAgICAgYXJnMSA9IGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgbm9zaWRlKTsKKyAgICAgIGFyZzIgPSBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIG5vc2lkZSk7IAorCisgICAgICByZXR1cm4gdmFsdWVfbGl0ZXJhbF9jb21wbGV4IChhcmcxLCBhcmcyLCBidWlsdGluX3R5cGVfZl9jb21wbGV4X3MxNik7CisKKyAgICBjYXNlIFNUUlVDVE9QX1NUUlVDVDoKKyAgICAgIHRlbSA9IGxvbmdlc3RfdG9faW50IChleHAtPmVsdHNbcGMgKyAxXS5sb25nY29uc3QpOworICAgICAgKCpwb3MpICs9IDMgKyBCWVRFU19UT19FWFBfRUxFTSAodGVtICsgMSk7CisgICAgICBhcmcxID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgaWYgKG5vc2lkZSA9PSBFVkFMX1NLSVApCisJZ290byBub3NpZGVyZXQ7CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfQVZPSURfU0lERV9FRkZFQ1RTKQorCXJldHVybiB2YWx1ZV96ZXJvIChsb29rdXBfc3RydWN0X2VsdF90eXBlIChWQUxVRV9UWVBFIChhcmcxKSwKKwkJCQkJCSAgICZleHAtPmVsdHNbcGMgKyAyXS5zdHJpbmcsCisJCQkJCQkgICAwKSwKKwkJCSAgIGx2YWxfbWVtb3J5KTsKKyAgICAgIGVsc2UKKwl7CisJICB2YWx1ZV9wdHIgdGVtcCA9IGFyZzE7CisJICByZXR1cm4gdmFsdWVfc3RydWN0X2VsdCAoJnRlbXAsIE5VTEwsICZleHAtPmVsdHNbcGMgKyAyXS5zdHJpbmcsCisJCQkJICAgTlVMTCwgInN0cnVjdHVyZSIpOworCX0KKworICAgIGNhc2UgU1RSVUNUT1BfUFRSOgorICAgICAgdGVtID0gbG9uZ2VzdF90b19pbnQgKGV4cC0+ZWx0c1twYyArIDFdLmxvbmdjb25zdCk7CisgICAgICAoKnBvcykgKz0gMyArIEJZVEVTX1RPX0VYUF9FTEVNICh0ZW0gKyAxKTsKKyAgICAgIGFyZzEgPSBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfU0tJUCkKKwlnb3RvIG5vc2lkZXJldDsKKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9BVk9JRF9TSURFX0VGRkVDVFMpCisJcmV0dXJuIHZhbHVlX3plcm8gKGxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGUgKFZBTFVFX1RZUEUgKGFyZzEpLAorCQkJCQkJICAgJmV4cC0+ZWx0c1twYyArIDJdLnN0cmluZywKKwkJCQkJCSAgIDApLAorCQkJICAgbHZhbF9tZW1vcnkpOworICAgICAgZWxzZQorCXsKKwkgIHZhbHVlX3B0ciB0ZW1wID0gYXJnMTsKKwkgIHJldHVybiB2YWx1ZV9zdHJ1Y3RfZWx0ICgmdGVtcCwgTlVMTCwgJmV4cC0+ZWx0c1twYyArIDJdLnN0cmluZywKKwkJCQkgICBOVUxMLCAic3RydWN0dXJlIHBvaW50ZXIiKTsKKwl9CisKKyAgICBjYXNlIFNUUlVDVE9QX01FTUJFUjoKKyAgICAgIGFyZzEgPSBldmFsdWF0ZV9zdWJleHBfZm9yX2FkZHJlc3MgKGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgYXJnMiA9IGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgbm9zaWRlKTsKKworICAgICAgLyogV2l0aCBIUCBhQ0MsIHBvaW50ZXJzIHRvIG1ldGhvZHMgZG8gbm90IHBvaW50IHRvIHRoZSBmdW5jdGlvbiBjb2RlICovIAorICAgICAgaWYgKGhwX3NvbV9zb21fb2JqZWN0X3ByZXNlbnQgJiYKKyAgICAgICAgICAoVFlQRV9DT0RFIChWQUxVRV9UWVBFIChhcmcyKSkgPT0gVFlQRV9DT0RFX1BUUikgJiYKKyAgICAgICAgICAoVFlQRV9DT0RFIChUWVBFX1RBUkdFVF9UWVBFIChWQUxVRV9UWVBFIChhcmcyKSkpID09IFRZUEVfQ09ERV9NRVRIT0QpKQorICAgICAgICBlcnJvciAoIlBvaW50ZXJzIHRvIG1ldGhvZHMgbm90IHN1cHBvcnRlZCB3aXRoIEhQIGFDQyIpOyAvKiAxOTk3LTA4LTE5ICovCisgICAgICAgIAorICAgICAgbWVtX29mZnNldCA9IHZhbHVlX2FzX2xvbmcgKGFyZzIpOworICAgICAgZ290byBoYW5kbGVfcG9pbnRlcl90b19tZW1iZXI7CisKKyAgICBjYXNlIFNUUlVDVE9QX01QVFI6CisgICAgICBhcmcxID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgYXJnMiA9IGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgbm9zaWRlKTsKKworICAgICAgLyogV2l0aCBIUCBhQ0MsIHBvaW50ZXJzIHRvIG1ldGhvZHMgZG8gbm90IHBvaW50IHRvIHRoZSBmdW5jdGlvbiBjb2RlICovIAorICAgICAgaWYgKGhwX3NvbV9zb21fb2JqZWN0X3ByZXNlbnQgJiYKKyAgICAgICAgICAoVFlQRV9DT0RFIChWQUxVRV9UWVBFIChhcmcyKSkgPT0gVFlQRV9DT0RFX1BUUikgJiYKKyAgICAgICAgICAoVFlQRV9DT0RFIChUWVBFX1RBUkdFVF9UWVBFIChWQUxVRV9UWVBFIChhcmcyKSkpID09IFRZUEVfQ09ERV9NRVRIT0QpKQorICAgICAgICBlcnJvciAoIlBvaW50ZXJzIHRvIG1ldGhvZHMgbm90IHN1cHBvcnRlZCB3aXRoIEhQIGFDQyIpOyAvKiAxOTk3LTA4LTE5ICovCisKKyAgICAgIG1lbV9vZmZzZXQgPSB2YWx1ZV9hc19sb25nIChhcmcyKTsKKworaGFuZGxlX3BvaW50ZXJfdG9fbWVtYmVyOgorICAgICAgLyogSFAgYUNDIGdlbmVyYXRlcyBvZmZzZXRzIHRoYXQgaGF2ZSBiaXQgIzI5IHNldDsgdHVybiBpdCBvZmYgdG8gZ2V0CisgICAgICAgICBhIHJlYWwgb2Zmc2V0IHRvIHRoZSBtZW1iZXIuICovCisgICAgICBpZiAoaHBfc29tX3NvbV9vYmplY3RfcHJlc2VudCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghbWVtX29mZnNldCkgLyogbm8gYmlhcyAtPiByZWFsbHkgbnVsbCAqLyAKKyAgICAgICAgICAgIGVycm9yICgiQXR0ZW1wdGVkIGRlcmVmZXJlbmNlIG9mIG51bGwgcG9pbnRlci10by1tZW1iZXIiKTsKKyAgICAgICAgICBtZW1fb2Zmc2V0ICY9IH4weDIwMDAwMDAwOworICAgICAgICB9CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfU0tJUCkKKwlnb3RvIG5vc2lkZXJldDsKKyAgICAgIHR5cGUgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFIChhcmcyKSk7CisgICAgICBpZiAoVFlQRV9DT0RFICh0eXBlKSAhPSBUWVBFX0NPREVfUFRSKQorCWdvdG8gYmFkX3BvaW50ZXJfdG9fbWVtYmVyOworICAgICAgdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKKyAgICAgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9NRVRIT0QpCisJZXJyb3IgKCJub3QgaW1wbGVtZW50ZWQ6IHBvaW50ZXItdG8tbWV0aG9kIGluIHBvaW50ZXItdG8tbWVtYmVyIGNvbnN0cnVjdCIpOworICAgICAgaWYgKFRZUEVfQ09ERSAodHlwZSkgIT0gVFlQRV9DT0RFX01FTUJFUikKKwlnb3RvIGJhZF9wb2ludGVyX3RvX21lbWJlcjsKKyAgICAgIC8qIE5vdywgY29udmVydCB0aGVzZSB2YWx1ZXMgdG8gYW4gYWRkcmVzcy4gICovCisgICAgICBhcmcxID0gdmFsdWVfY2FzdCAobG9va3VwX3BvaW50ZXJfdHlwZSAoVFlQRV9ET01BSU5fVFlQRSAodHlwZSkpLAorCQkJIGFyZzEpOworICAgICAgYXJnMyA9IHZhbHVlX2Zyb21fbG9uZ2VzdCAobG9va3VwX3BvaW50ZXJfdHlwZSAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpLAorCQkJCSB2YWx1ZV9hc19sb25nIChhcmcxKSArIG1lbV9vZmZzZXQpOworICAgICAgcmV0dXJuIHZhbHVlX2luZCAoYXJnMyk7CitiYWRfcG9pbnRlcl90b19tZW1iZXI6CisgICAgICBlcnJvcigibm9uLXBvaW50ZXItdG8tbWVtYmVyIHZhbHVlIHVzZWQgaW4gcG9pbnRlci10by1tZW1iZXIgY29uc3RydWN0Iik7CisKKyAgICBjYXNlIEJJTk9QX0NPTkNBVDoKKyAgICAgIGFyZzEgPSBldmFsdWF0ZV9zdWJleHBfd2l0aF9jb2VyY2lvbiAoZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICBhcmcyID0gZXZhbHVhdGVfc3ViZXhwX3dpdGhfY29lcmNpb24gKGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgaWYgKG5vc2lkZSA9PSBFVkFMX1NLSVApCisJZ290byBub3NpZGVyZXQ7CisgICAgICBpZiAoYmlub3BfdXNlcl9kZWZpbmVkX3AgKG9wLCBhcmcxLCBhcmcyKSkKKwlyZXR1cm4gdmFsdWVfeF9iaW5vcCAoYXJnMSwgYXJnMiwgb3AsIE9QX05VTEwsIG5vc2lkZSk7CisgICAgICBlbHNlCisJcmV0dXJuIHZhbHVlX2NvbmNhdCAoYXJnMSwgYXJnMik7CisKKyAgICBjYXNlIEJJTk9QX0FTU0lHTjoKKyAgICAgIGFyZzEgPSBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICBhcmcyID0gZXZhbHVhdGVfc3ViZXhwIChWQUxVRV9UWVBFIChhcmcxKSwgZXhwLCBwb3MsIG5vc2lkZSk7CisKKyAgICAgIC8qIERvIHNwZWNpYWwgc3R1ZmYgZm9yIEhQIGFDQyBwb2ludGVycyB0byBtZW1iZXJzICovIAorICAgICAgaWYgKGhwX3NvbV9zb21fb2JqZWN0X3ByZXNlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAvKiAxOTk3LTA4LTE5IENhbid0IGFzc2lnbiBIUCBhQ0MgcG9pbnRlcnMgdG8gbWV0aG9kcy4gTm8gZGV0YWlscyBvZgorICAgICAgICAgICAgIHRoZSBpbXBsZW1lbnRhdGlvbiB5ZXQ7IGJ1dCB0aGUgcG9pbnRlciBhcHBlYXJzIHRvIHBvaW50IHRvIGEgY29kZQorICAgICAgICAgICAgIHNlcXVlbmNlICh0aHVuaykgaW4gbWVtb3J5IC0tIGluIGFueSBjYXNlIGl0IGlzICpub3QqIHRoZSBhZGRyZXNzCisgICAgICAgICAgICAgb2YgdGhlIGZ1bmN0aW9uIGFzIGl0IHdvdWxkIGJlIGluIGEgbmFpdmUgaW1wbGVtZW50YXRpb24uICovIAorICAgICAgICAgIGlmICgoVFlQRV9DT0RFIChWQUxVRV9UWVBFIChhcmcxKSkgPT0gVFlQRV9DT0RFX1BUUikgJiYKKyAgICAgICAgICAgICAgKFRZUEVfQ09ERSAoVFlQRV9UQVJHRVRfVFlQRSAoVkFMVUVfVFlQRSAoYXJnMSkpKSA9PSBUWVBFX0NPREVfTUVUSE9EKSkKKyAgICAgICAgICAgIGVycm9yICgiQXNzaWdubWVudCB0byBwb2ludGVycyB0byBtZXRob2RzIG5vdCBpbXBsZW1lbnRlZCB3aXRoIEhQIGFDQyIpOworCisgICAgICAgICAgLyogSFAgYUNDIHBvaW50ZXJzIHRvIGRhdGEgbWVtYmVycyByZXF1aXJlIGEgY29uc3RhbnQgYmlhcyAqLyAKKyAgICAgICAgICBpZiAoKFRZUEVfQ09ERSAoVkFMVUVfVFlQRSAoYXJnMSkpID09IFRZUEVfQ09ERV9QVFIpICYmCisgICAgICAgICAgICAgIChUWVBFX0NPREUgKFRZUEVfVEFSR0VUX1RZUEUgKFZBTFVFX1RZUEUgKGFyZzEpKSkgPT0gVFlQRV9DT0RFX01FTUJFUikpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKiBwdHIgPSAodW5zaWduZWQgaW50ICopIFZBTFVFX0NPTlRFTlRTIChhcmcyKTsgLyogZm9yY2VzIGV2YWx1YXRpb24gKi8gCisgICAgICAgICAgICAgICAgKnB0ciB8PSAweDIwMDAwMDAwOyAvKiBzZXQgMjl0aCBiaXQgKi8KKyAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBpZiAobm9zaWRlID09IEVWQUxfU0tJUCB8fCBub3NpZGUgPT0gRVZBTF9BVk9JRF9TSURFX0VGRkVDVFMpCisJcmV0dXJuIGFyZzE7CisgICAgICBpZiAoYmlub3BfdXNlcl9kZWZpbmVkX3AgKG9wLCBhcmcxLCBhcmcyKSkKKwlyZXR1cm4gdmFsdWVfeF9iaW5vcCAoYXJnMSwgYXJnMiwgb3AsIE9QX05VTEwsIG5vc2lkZSk7CisgICAgICBlbHNlCisJcmV0dXJuIHZhbHVlX2Fzc2lnbiAoYXJnMSwgYXJnMik7CisKKyAgICBjYXNlIEJJTk9QX0FTU0lHTl9NT0RJRlk6CisgICAgICAoKnBvcykgKz0gMjsKKyAgICAgIGFyZzEgPSBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICBhcmcyID0gZXZhbHVhdGVfc3ViZXhwIChWQUxVRV9UWVBFIChhcmcxKSwgZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfU0tJUCB8fCBub3NpZGUgPT0gRVZBTF9BVk9JRF9TSURFX0VGRkVDVFMpCisJcmV0dXJuIGFyZzE7CisgICAgICBvcCA9IGV4cC0+ZWx0c1twYyArIDFdLm9wY29kZTsKKyAgICAgIGlmIChiaW5vcF91c2VyX2RlZmluZWRfcCAob3AsIGFyZzEsIGFyZzIpKQorCXJldHVybiB2YWx1ZV94X2Jpbm9wIChhcmcxLCBhcmcyLCBCSU5PUF9BU1NJR05fTU9ESUZZLCBvcCwgbm9zaWRlKTsKKyAgICAgIGVsc2UgaWYgKG9wID09IEJJTk9QX0FERCkKKwlhcmcyID0gdmFsdWVfYWRkIChhcmcxLCBhcmcyKTsKKyAgICAgIGVsc2UgaWYgKG9wID09IEJJTk9QX1NVQikKKwlhcmcyID0gdmFsdWVfc3ViIChhcmcxLCBhcmcyKTsKKyAgICAgIGVsc2UKKwlhcmcyID0gdmFsdWVfYmlub3AgKGFyZzEsIGFyZzIsIG9wKTsKKyAgICAgIHJldHVybiB2YWx1ZV9hc3NpZ24gKGFyZzEsIGFyZzIpOworCisgICAgY2FzZSBCSU5PUF9BREQ6CisgICAgICBhcmcxID0gZXZhbHVhdGVfc3ViZXhwX3dpdGhfY29lcmNpb24gKGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgYXJnMiA9IGV2YWx1YXRlX3N1YmV4cF93aXRoX2NvZXJjaW9uIChleHAsIHBvcywgbm9zaWRlKTsKKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQKQorCWdvdG8gbm9zaWRlcmV0OworICAgICAgaWYgKGJpbm9wX3VzZXJfZGVmaW5lZF9wIChvcCwgYXJnMSwgYXJnMikpCisJcmV0dXJuIHZhbHVlX3hfYmlub3AgKGFyZzEsIGFyZzIsIG9wLCBPUF9OVUxMLCBub3NpZGUpOworICAgICAgZWxzZQorCXJldHVybiB2YWx1ZV9hZGQgKGFyZzEsIGFyZzIpOworCisgICAgY2FzZSBCSU5PUF9TVUI6CisgICAgICBhcmcxID0gZXZhbHVhdGVfc3ViZXhwX3dpdGhfY29lcmNpb24gKGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgYXJnMiA9IGV2YWx1YXRlX3N1YmV4cF93aXRoX2NvZXJjaW9uIChleHAsIHBvcywgbm9zaWRlKTsKKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQKQorCWdvdG8gbm9zaWRlcmV0OworICAgICAgaWYgKGJpbm9wX3VzZXJfZGVmaW5lZF9wIChvcCwgYXJnMSwgYXJnMikpCisJcmV0dXJuIHZhbHVlX3hfYmlub3AgKGFyZzEsIGFyZzIsIG9wLCBPUF9OVUxMLCBub3NpZGUpOworICAgICAgZWxzZQorCXJldHVybiB2YWx1ZV9zdWIgKGFyZzEsIGFyZzIpOworCisgICAgY2FzZSBCSU5PUF9NVUw6CisgICAgY2FzZSBCSU5PUF9ESVY6CisgICAgY2FzZSBCSU5PUF9SRU06CisgICAgY2FzZSBCSU5PUF9NT0Q6CisgICAgY2FzZSBCSU5PUF9MU0g6CisgICAgY2FzZSBCSU5PUF9SU0g6CisgICAgY2FzZSBCSU5PUF9CSVRXSVNFX0FORDoKKyAgICBjYXNlIEJJTk9QX0JJVFdJU0VfSU9SOgorICAgIGNhc2UgQklOT1BfQklUV0lTRV9YT1I6CisgICAgICBhcmcxID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgYXJnMiA9IGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgbm9zaWRlKTsKKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQKQorCWdvdG8gbm9zaWRlcmV0OworICAgICAgaWYgKGJpbm9wX3VzZXJfZGVmaW5lZF9wIChvcCwgYXJnMSwgYXJnMikpCisJcmV0dXJuIHZhbHVlX3hfYmlub3AgKGFyZzEsIGFyZzIsIG9wLCBPUF9OVUxMLCBub3NpZGUpOworICAgICAgZWxzZQorCWlmIChub3NpZGUgPT0gRVZBTF9BVk9JRF9TSURFX0VGRkVDVFMKKwkgICAgJiYgKG9wID09IEJJTk9QX0RJViB8fCBvcCA9PSBCSU5PUF9SRU0gfHwgb3AgPT0gQklOT1BfTU9EKSkKKwkgIHJldHVybiB2YWx1ZV96ZXJvIChWQUxVRV9UWVBFIChhcmcxKSwgbm90X2x2YWwpOworICAgICAgZWxzZQorCXJldHVybiB2YWx1ZV9iaW5vcCAoYXJnMSwgYXJnMiwgb3ApOworCisgICAgY2FzZSBCSU5PUF9SQU5HRToKKyAgICAgIGFyZzEgPSBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICBhcmcyID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgaWYgKG5vc2lkZSA9PSBFVkFMX1NLSVApCisJZ290byBub3NpZGVyZXQ7CisgICAgICBlcnJvciAoIic6JyBvcGVyYXRvciB1c2VkIGluIGludmFsaWQgY29udGV4dCIpOworCisgICAgY2FzZSBCSU5PUF9TVUJTQ1JJUFQ6CisgICAgICBhcmcxID0gZXZhbHVhdGVfc3ViZXhwX3dpdGhfY29lcmNpb24gKGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgYXJnMiA9IGV2YWx1YXRlX3N1YmV4cF93aXRoX2NvZXJjaW9uIChleHAsIHBvcywgbm9zaWRlKTsKKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQKQorCWdvdG8gbm9zaWRlcmV0OworICAgICAgaWYgKGJpbm9wX3VzZXJfZGVmaW5lZF9wIChvcCwgYXJnMSwgYXJnMikpCisJcmV0dXJuIHZhbHVlX3hfYmlub3AgKGFyZzEsIGFyZzIsIG9wLCBPUF9OVUxMLCBub3NpZGUpOworICAgICAgZWxzZQorICAgICAgICB7CisJICAvKiBJZiB0aGUgdXNlciBhdHRlbXB0cyB0byBzdWJzY3JpcHQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGFuCisJICAgICBhcnJheSBvciBwb2ludGVyIHR5cGUgKGxpa2UgYSBwbGFpbiBpbnQgdmFyaWFibGUgZm9yIGV4YW1wbGUpLAorCSAgICAgdGhlbiByZXBvcnQgdGhpcyBhcyBhbiBlcnJvci4gKi8KKworCSAgQ09FUkNFX1JFRiAoYXJnMSk7CisJICB0eXBlID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnMSkpOworCSAgaWYgKFRZUEVfQ09ERSAodHlwZSkgIT0gVFlQRV9DT0RFX0FSUkFZCisJICAgICAgJiYgVFlQRV9DT0RFICh0eXBlKSAhPSBUWVBFX0NPREVfUFRSKQorCSAgICB7CisJICAgICAgaWYgKFRZUEVfTkFNRSAodHlwZSkpCisJCWVycm9yICgiY2Fubm90IHN1YnNjcmlwdCBzb21ldGhpbmcgb2YgdHlwZSBgJXMnIiwKKwkJICAgICAgIFRZUEVfTkFNRSAodHlwZSkpOworCSAgICAgIGVsc2UKKwkJZXJyb3IgKCJjYW5ub3Qgc3Vic2NyaXB0IHJlcXVlc3RlZCB0eXBlIik7CisJICAgIH0KKworCSAgaWYgKG5vc2lkZSA9PSBFVkFMX0FWT0lEX1NJREVfRUZGRUNUUykKKwkgICAgcmV0dXJuIHZhbHVlX3plcm8gKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpLCBWQUxVRV9MVkFMIChhcmcxKSk7CisJICBlbHNlCisJICAgIHJldHVybiB2YWx1ZV9zdWJzY3JpcHQgKGFyZzEsIGFyZzIpOworICAgICAgICB9CisKKyAgICBjYXNlIEJJTk9QX0lOOgorICAgICAgYXJnMSA9IGV2YWx1YXRlX3N1YmV4cF93aXRoX2NvZXJjaW9uIChleHAsIHBvcywgbm9zaWRlKTsKKyAgICAgIGFyZzIgPSBldmFsdWF0ZV9zdWJleHBfd2l0aF9jb2VyY2lvbiAoZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfU0tJUCkKKwlnb3RvIG5vc2lkZXJldDsKKyAgICAgIHJldHVybiB2YWx1ZV9pbiAoYXJnMSwgYXJnMik7CisgICAgICAKKyAgICBjYXNlIE1VTFRJX1NVQlNDUklQVDoKKyAgICAgICgqcG9zKSArPSAyOworICAgICAgbmFyZ3MgPSBsb25nZXN0X3RvX2ludCAoZXhwLT5lbHRzW3BjICsgMV0ubG9uZ2NvbnN0KTsKKyAgICAgIGFyZzEgPSBldmFsdWF0ZV9zdWJleHBfd2l0aF9jb2VyY2lvbiAoZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICB3aGlsZSAobmFyZ3MtLSA+IDApCisJeworCSAgYXJnMiA9IGV2YWx1YXRlX3N1YmV4cF93aXRoX2NvZXJjaW9uIChleHAsIHBvcywgbm9zaWRlKTsKKwkgIC8qIEZJWE1FOiAgRVZBTF9TS0lQIGhhbmRsaW5nIG1heSBub3QgYmUgY29ycmVjdC4gKi8KKwkgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQKQorCSAgICB7CisJICAgICAgaWYgKG5hcmdzID4gMCkKKwkJeworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgZ290byBub3NpZGVyZXQ7CisJCX0KKwkgICAgfQorCSAgLyogRklYTUU6ICBFVkFMX0FWT0lEX1NJREVfRUZGRUNUUyBoYW5kbGluZyBtYXkgbm90IGJlIGNvcnJlY3QuICovCisJICBpZiAobm9zaWRlID09IEVWQUxfQVZPSURfU0lERV9FRkZFQ1RTKQorCSAgICB7CisJICAgICAgLyogSWYgdGhlIHVzZXIgYXR0ZW1wdHMgdG8gc3Vic2NyaXB0IHNvbWV0aGluZyB0aGF0IGhhcyBubyB0YXJnZXQKKwkJIHR5cGUgKGxpa2UgYSBwbGFpbiBpbnQgdmFyaWFibGUgZm9yIGV4YW1wbGUpLCB0aGVuIHJlcG9ydCB0aGlzCisJCSBhcyBhbiBlcnJvci4gKi8KKwkgICAgICAKKwkgICAgICB0eXBlID0gVFlQRV9UQVJHRVRfVFlQRSAoY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnMSkpKTsKKwkgICAgICBpZiAodHlwZSAhPSBOVUxMKQorCQl7CisJCSAgYXJnMSA9IHZhbHVlX3plcm8gKHR5cGUsIFZBTFVFX0xWQUwgKGFyZzEpKTsKKwkJICBub3NpZGUgPSBFVkFMX1NLSVA7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBlcnJvciAoImNhbm5vdCBzdWJzY3JpcHQgc29tZXRoaW5nIG9mIHR5cGUgYCVzJyIsCisJCQkgVFlQRV9OQU1FIChWQUxVRV9UWVBFIChhcmcxKSkpOworCQl9CisJICAgIH0KKwkgIAorCSAgaWYgKGJpbm9wX3VzZXJfZGVmaW5lZF9wIChvcCwgYXJnMSwgYXJnMikpCisJICAgIHsKKwkgICAgICBhcmcxID0gdmFsdWVfeF9iaW5vcCAoYXJnMSwgYXJnMiwgb3AsIE9QX05VTEwsIG5vc2lkZSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGFyZzEgPSB2YWx1ZV9zdWJzY3JpcHQgKGFyZzEsIGFyZzIpOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIChhcmcxKTsKKworICAgIG11bHRpX2Y3N19zdWJzY3JpcHQ6CisgICAgICB7IAorCWludCBzdWJzY3JpcHRfYXJyYXlbTUFYX0ZPUlRSQU5fRElNUysxXTsgLyogMS1iYXNlZCBhcnJheSBvZiAKKwkJCQkJCSAgICBzdWJzY3JpcHRzLCBtYXggPT0gNyAqLworCWludCBhcnJheV9zaXplX2FycmF5W01BWF9GT1JUUkFOX0RJTVMrMV07CisJaW50IG5kaW1lbnNpb25zPTEsaTsKKwlzdHJ1Y3QgdHlwZSAqdG1wX3R5cGU7IAorCWludCBvZmZzZXRfaXRlbTsgICAvKiBUaGUgYXJyYXkgb2Zmc2V0IHdoZXJlIHRoZSBpdGVtIGxpdmVzICovIAorCisJaWYgKG5hcmdzID4gTUFYX0ZPUlRSQU5fRElNUykKKwkgIGVycm9yICgiVG9vIG1hbnkgc3Vic2NyaXB0cyBmb3IgRjc3ICglZCBNYXgpIiwgTUFYX0ZPUlRSQU5fRElNUyk7CisKKwl0bXBfdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZzEpKTsKKwluZGltZW5zaW9ucyA9IGNhbGNfZjc3X2FycmF5X2RpbXMgKHR5cGUpOworCisJaWYgKG5hcmdzICE9IG5kaW1lbnNpb25zKQorCSAgZXJyb3IgKCJXcm9uZyBudW1iZXIgb2Ygc3Vic2NyaXB0cyIpOworCisJLyogTm93IHRoYXQgd2Uga25vdyB3ZSBoYXZlIGEgbGVnYWwgYXJyYXkgc3Vic2NyaXB0IGV4cHJlc3Npb24gCisJICAgbGV0IHVzIGFjdHVhbGx5IGZpbmQgb3V0IHdoZXJlIHRoaXMgZWxlbWVudCBleGlzdHMgaW4gdGhlIGFycmF5LiAqLyAKKworCW9mZnNldF9pdGVtID0gMDsgCisJZm9yIChpID0gMTsgaSA8PSBuYXJnczsgaSsrKQorCSAgeworCSAgICAvKiBFdmFsdWF0ZSBlYWNoIHN1YnNjcmlwdCwgSXQgbXVzdCBiZSBhIGxlZ2FsIGludGVnZXIgaW4gRjc3ICovIAorCSAgICBhcmcyID0gZXZhbHVhdGVfc3ViZXhwX3dpdGhfY29lcmNpb24gKGV4cCwgcG9zLCBub3NpZGUpOworCisJICAgIC8qIEZpbGwgaW4gdGhlIHN1YnNjcmlwdCBhbmQgYXJyYXkgc2l6ZSBhcnJheXMgKi8gCisKKwkgICAgc3Vic2NyaXB0X2FycmF5W2ldID0gdmFsdWVfYXNfbG9uZyAoYXJnMik7CisgICAgICAgICAgICAgICAKKwkgICAgcmV0Y29kZSA9IGY3N19nZXRfZHluYW1pY191cHBlcmJvdW5kICh0bXBfdHlwZSwgJnVwcGVyKTsKKwkgICAgaWYgKHJldGNvZGUgPT0gQk9VTkRfRkVUQ0hfRVJST1IpCisJICAgICAgZXJyb3IgKCJDYW5ub3Qgb2J0YWluIGR5bmFtaWMgdXBwZXIgYm91bmQiKTsgCisKKwkgICAgcmV0Y29kZSA9IGY3N19nZXRfZHluYW1pY19sb3dlcmJvdW5kICh0bXBfdHlwZSwgJmxvd2VyKTsgCisJICAgIGlmIChyZXRjb2RlID09IEJPVU5EX0ZFVENIX0VSUk9SKQorCSAgICAgIGVycm9yKCJDYW5ub3Qgb2J0YWluIGR5bmFtaWMgbG93ZXIgYm91bmQiKTsgCisKKwkgICAgYXJyYXlfc2l6ZV9hcnJheVtpXSA9IHVwcGVyIC0gbG93ZXIgKyAxOworICAgICAgICAgICAgICAgCisJICAgIC8qIFplcm8tbm9ybWFsaXplIHN1YnNjcmlwdHMgc28gdGhhdCBvZmZzZXR0aW5nIHdpbGwgd29yay4gKi8gCisgICAgICAgICAgICAgICAKKwkgICAgc3Vic2NyaXB0X2FycmF5W2ldIC09IGxvd2VyOworCisJICAgIC8qIElmIHdlIGFyZSBhdCB0aGUgYm90dG9tIG9mIGEgbXVsdGlkaW1lbnNpb25hbCAKKwkgICAgICAgYXJyYXkgdHlwZSB0aGVuIGtlZXAgYSBwdHIgdG8gdGhlIGxhc3QgQVJSQVkKKwkgICAgICAgdHlwZSBhcm91bmQgZm9yIHVzZSB3aGVuIGNhbGxpbmcgdmFsdWVfc3Vic2NyaXB0KCkKKwkgICAgICAgYmVsb3cuIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHdlIHByZXRlbmQgdG8gdmFsdWVfc3Vic2NyaXB0CisJICAgICAgIHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBhIG9uZS1kaW1lbnNpb25hbCBhcnJheSAKKwkgICAgICAgb2YgYmFzZSBlbGVtZW50IHR5cGUgdGhhdCB3ZSBhcHBseSBhIHNpbXBsZSAKKwkgICAgICAgb2Zmc2V0IHRvLiAqLyAKKworCSAgICBpZiAoaSA8IG5hcmdzKSAKKwkgICAgICB0bXBfdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFRZUEVfVEFSR0VUX1RZUEUgKHRtcF90eXBlKSk7IAorCSAgfQorCisJLyogTm93IGxldCB1cyBjYWxjdWxhdGUgdGhlIG9mZnNldCBmb3IgdGhpcyBpdGVtICovCisKKwlvZmZzZXRfaXRlbSA9IHN1YnNjcmlwdF9hcnJheVtuZGltZW5zaW9uc107IAorICAgICAgICAgCisJZm9yIChpID0gbmRpbWVuc2lvbnMgLSAxOyBpID49IDE7IGktLSkKKwkgIG9mZnNldF9pdGVtID0gCisJICAgIGFycmF5X3NpemVfYXJyYXlbaV0gKiBvZmZzZXRfaXRlbSArIHN1YnNjcmlwdF9hcnJheVtpXTsKKworCS8qIENvbnN0cnVjdCBhIHZhbHVlIG5vZGUgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIG9mZnNldCAqLworCisJYXJnMiA9IHZhbHVlX2Zyb21fbG9uZ2VzdCAoYnVpbHRpbl90eXBlX2ZfaW50ZWdlciwgb2Zmc2V0X2l0ZW0pOyAKKworCS8qIExldCB1cyBub3cgcGxheSBhIGRpcnR5IHRyaWNrOiB3ZSB3aWxsIHRha2UgYXJnMSAKKwkgICB3aGljaCBpcyBhIHZhbHVlIG5vZGUgcG9pbnRpbmcgdG8gdGhlIHRvcG1vc3QgbGV2ZWwKKwkgICBvZiB0aGUgbXVsdGlkaW1lbnNpb25hbCBhcnJheS1zZXQgYW5kIHByZXRlbmQKKwkgICB0aGF0IGl0IGlzIGFjdHVhbGx5IGEgYXJyYXkgb2YgdGhlIGZpbmFsIGVsZW1lbnQgCisJICAgdHlwZSwgdGhpcyB3aWxsIGVuc3VyZSB0aGF0IHZhbHVlX3N1YnNjcmlwdCgpCisJICAgcmV0dXJucyB0aGUgY29ycmVjdCB0eXBlIHZhbHVlICovCisKKwlWQUxVRV9UWVBFIChhcmcxKSA9IHRtcF90eXBlOyAKKwlyZXR1cm4gdmFsdWVfaW5kICh2YWx1ZV9hZGQgKHZhbHVlX2NvZXJjZV9hcnJheSAoYXJnMSksIGFyZzIpKTsKKyAgICAgIH0KKworICAgIGNhc2UgQklOT1BfTE9HSUNBTF9BTkQ6CisgICAgICBhcmcxID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgaWYgKG5vc2lkZSA9PSBFVkFMX1NLSVApCisJeworCSAgYXJnMiA9IGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgbm9zaWRlKTsKKwkgIGdvdG8gbm9zaWRlcmV0OworCX0KKyAgICAgIAorICAgICAgb2xkcG9zID0gKnBvczsKKyAgICAgIGFyZzIgPSBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIEVWQUxfQVZPSURfU0lERV9FRkZFQ1RTKTsKKyAgICAgICpwb3MgPSBvbGRwb3M7CisgICAgICAKKyAgICAgIGlmIChiaW5vcF91c2VyX2RlZmluZWRfcCAob3AsIGFyZzEsIGFyZzIpKSAKKwl7CisJICBhcmcyID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworCSAgcmV0dXJuIHZhbHVlX3hfYmlub3AgKGFyZzEsIGFyZzIsIG9wLCBPUF9OVUxMLCBub3NpZGUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB0ZW0gPSB2YWx1ZV9sb2dpY2FsX25vdCAoYXJnMSk7CisJICBhcmcyID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLAorCQkJCSAgKHRlbSA/IEVWQUxfU0tJUCA6IG5vc2lkZSkpOworCSAgcmV0dXJuIHZhbHVlX2Zyb21fbG9uZ2VzdCAoTEFfQk9PTF9UWVBFLAorCQkJCSAgKExPTkdFU1QpICghdGVtICYmICF2YWx1ZV9sb2dpY2FsX25vdCAoYXJnMikpKTsKKwl9CisKKyAgICBjYXNlIEJJTk9QX0xPR0lDQUxfT1I6CisgICAgICBhcmcxID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgaWYgKG5vc2lkZSA9PSBFVkFMX1NLSVApCisJeworCSAgYXJnMiA9IGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgbm9zaWRlKTsKKwkgIGdvdG8gbm9zaWRlcmV0OworCX0KKyAgICAgIAorICAgICAgb2xkcG9zID0gKnBvczsKKyAgICAgIGFyZzIgPSBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIEVWQUxfQVZPSURfU0lERV9FRkZFQ1RTKTsKKyAgICAgICpwb3MgPSBvbGRwb3M7CisgICAgICAKKyAgICAgIGlmIChiaW5vcF91c2VyX2RlZmluZWRfcCAob3AsIGFyZzEsIGFyZzIpKSAKKwl7CisJICBhcmcyID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworCSAgcmV0dXJuIHZhbHVlX3hfYmlub3AgKGFyZzEsIGFyZzIsIG9wLCBPUF9OVUxMLCBub3NpZGUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB0ZW0gPSB2YWx1ZV9sb2dpY2FsX25vdCAoYXJnMSk7CisJICBhcmcyID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLAorCQkJCSAgKCF0ZW0gPyBFVkFMX1NLSVAgOiBub3NpZGUpKTsKKwkgIHJldHVybiB2YWx1ZV9mcm9tX2xvbmdlc3QgKExBX0JPT0xfVFlQRSwKKwkJCQkgIChMT05HRVNUKSAoIXRlbSB8fCAhdmFsdWVfbG9naWNhbF9ub3QgKGFyZzIpKSk7CisJfQorCisgICAgY2FzZSBCSU5PUF9FUVVBTDoKKyAgICAgIGFyZzEgPSBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICBhcmcyID0gZXZhbHVhdGVfc3ViZXhwIChWQUxVRV9UWVBFIChhcmcxKSwgZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfU0tJUCkKKwlnb3RvIG5vc2lkZXJldDsKKyAgICAgIGlmIChiaW5vcF91c2VyX2RlZmluZWRfcCAob3AsIGFyZzEsIGFyZzIpKQorCXsKKwkgIHJldHVybiB2YWx1ZV94X2Jpbm9wIChhcmcxLCBhcmcyLCBvcCwgT1BfTlVMTCwgbm9zaWRlKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdGVtID0gdmFsdWVfZXF1YWwgKGFyZzEsIGFyZzIpOworCSAgcmV0dXJuIHZhbHVlX2Zyb21fbG9uZ2VzdCAoTEFfQk9PTF9UWVBFLCAoTE9OR0VTVCkgdGVtKTsKKwl9CisKKyAgICBjYXNlIEJJTk9QX05PVEVRVUFMOgorICAgICAgYXJnMSA9IGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgbm9zaWRlKTsKKyAgICAgIGFyZzIgPSBldmFsdWF0ZV9zdWJleHAgKFZBTFVFX1RZUEUgKGFyZzEpLCBleHAsIHBvcywgbm9zaWRlKTsKKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQKQorCWdvdG8gbm9zaWRlcmV0OworICAgICAgaWYgKGJpbm9wX3VzZXJfZGVmaW5lZF9wIChvcCwgYXJnMSwgYXJnMikpCisJeworCSAgcmV0dXJuIHZhbHVlX3hfYmlub3AgKGFyZzEsIGFyZzIsIG9wLCBPUF9OVUxMLCBub3NpZGUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB0ZW0gPSB2YWx1ZV9lcXVhbCAoYXJnMSwgYXJnMik7CisJICByZXR1cm4gdmFsdWVfZnJvbV9sb25nZXN0IChMQV9CT09MX1RZUEUsIChMT05HRVNUKSAhIHRlbSk7CisJfQorCisgICAgY2FzZSBCSU5PUF9MRVNTOgorICAgICAgYXJnMSA9IGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgbm9zaWRlKTsKKyAgICAgIGFyZzIgPSBldmFsdWF0ZV9zdWJleHAgKFZBTFVFX1RZUEUgKGFyZzEpLCBleHAsIHBvcywgbm9zaWRlKTsKKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQKQorCWdvdG8gbm9zaWRlcmV0OworICAgICAgaWYgKGJpbm9wX3VzZXJfZGVmaW5lZF9wIChvcCwgYXJnMSwgYXJnMikpCisJeworCSAgcmV0dXJuIHZhbHVlX3hfYmlub3AgKGFyZzEsIGFyZzIsIG9wLCBPUF9OVUxMLCBub3NpZGUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB0ZW0gPSB2YWx1ZV9sZXNzIChhcmcxLCBhcmcyKTsKKwkgIHJldHVybiB2YWx1ZV9mcm9tX2xvbmdlc3QgKExBX0JPT0xfVFlQRSwgKExPTkdFU1QpIHRlbSk7CisJfQorCisgICAgY2FzZSBCSU5PUF9HVFI6CisgICAgICBhcmcxID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgYXJnMiA9IGV2YWx1YXRlX3N1YmV4cCAoVkFMVUVfVFlQRSAoYXJnMSksIGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgaWYgKG5vc2lkZSA9PSBFVkFMX1NLSVApCisJZ290byBub3NpZGVyZXQ7CisgICAgICBpZiAoYmlub3BfdXNlcl9kZWZpbmVkX3AgKG9wLCBhcmcxLCBhcmcyKSkKKwl7CisJICByZXR1cm4gdmFsdWVfeF9iaW5vcCAoYXJnMSwgYXJnMiwgb3AsIE9QX05VTEwsIG5vc2lkZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHRlbSA9IHZhbHVlX2xlc3MgKGFyZzIsIGFyZzEpOworCSAgcmV0dXJuIHZhbHVlX2Zyb21fbG9uZ2VzdCAoTEFfQk9PTF9UWVBFLCAoTE9OR0VTVCkgdGVtKTsKKwl9CisKKyAgICBjYXNlIEJJTk9QX0dFUToKKyAgICAgIGFyZzEgPSBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICBhcmcyID0gZXZhbHVhdGVfc3ViZXhwIChWQUxVRV9UWVBFIChhcmcxKSwgZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfU0tJUCkKKwlnb3RvIG5vc2lkZXJldDsKKyAgICAgIGlmIChiaW5vcF91c2VyX2RlZmluZWRfcCAob3AsIGFyZzEsIGFyZzIpKQorCXsKKwkgIHJldHVybiB2YWx1ZV94X2Jpbm9wIChhcmcxLCBhcmcyLCBvcCwgT1BfTlVMTCwgbm9zaWRlKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdGVtID0gdmFsdWVfbGVzcyAoYXJnMiwgYXJnMSkgfHwgdmFsdWVfZXF1YWwgKGFyZzEsIGFyZzIpOworCSAgcmV0dXJuIHZhbHVlX2Zyb21fbG9uZ2VzdCAoTEFfQk9PTF9UWVBFLCAoTE9OR0VTVCkgdGVtKTsKKwl9CisKKyAgICBjYXNlIEJJTk9QX0xFUToKKyAgICAgIGFyZzEgPSBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICBhcmcyID0gZXZhbHVhdGVfc3ViZXhwIChWQUxVRV9UWVBFIChhcmcxKSwgZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfU0tJUCkKKwlnb3RvIG5vc2lkZXJldDsKKyAgICAgIGlmIChiaW5vcF91c2VyX2RlZmluZWRfcCAob3AsIGFyZzEsIGFyZzIpKQorCXsKKwkgIHJldHVybiB2YWx1ZV94X2Jpbm9wIChhcmcxLCBhcmcyLCBvcCwgT1BfTlVMTCwgbm9zaWRlKTsKKwl9CisgICAgICBlbHNlIAorCXsKKwkgIHRlbSA9IHZhbHVlX2xlc3MgKGFyZzEsIGFyZzIpIHx8IHZhbHVlX2VxdWFsIChhcmcxLCBhcmcyKTsKKwkgIHJldHVybiB2YWx1ZV9mcm9tX2xvbmdlc3QgKExBX0JPT0xfVFlQRSwgKExPTkdFU1QpIHRlbSk7CisJfQorCisgICAgY2FzZSBCSU5PUF9SRVBFQVQ6CisgICAgICBhcmcxID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgYXJnMiA9IGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgbm9zaWRlKTsKKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQKQorCWdvdG8gbm9zaWRlcmV0OworICAgICAgdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZzIpKTsKKyAgICAgIGlmIChUWVBFX0NPREUgKHR5cGUpICE9IFRZUEVfQ09ERV9JTlQpCisJZXJyb3IgKCJOb24taW50ZWdyYWwgcmlnaHQgb3BlcmFuZCBmb3IgXCJAXCIgb3BlcmF0b3IuIik7CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfQVZPSURfU0lERV9FRkZFQ1RTKQorCXsKKwkgIHJldHVybiBhbGxvY2F0ZV9yZXBlYXRfdmFsdWUgKFZBTFVFX1RZUEUgKGFyZzEpLAorCQkJCQlsb25nZXN0X3RvX2ludCAodmFsdWVfYXNfbG9uZyAoYXJnMikpKTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIHZhbHVlX3JlcGVhdCAoYXJnMSwgbG9uZ2VzdF90b19pbnQgKHZhbHVlX2FzX2xvbmcgKGFyZzIpKSk7CisKKyAgICBjYXNlIEJJTk9QX0NPTU1BOgorICAgICAgZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgcmV0dXJuIGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgbm9zaWRlKTsKKworICAgIGNhc2UgVU5PUF9ORUc6CisgICAgICBhcmcxID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgaWYgKG5vc2lkZSA9PSBFVkFMX1NLSVApCisJZ290byBub3NpZGVyZXQ7CisgICAgICBpZiAodW5vcF91c2VyX2RlZmluZWRfcCAob3AsIGFyZzEpKQorCXJldHVybiB2YWx1ZV94X3Vub3AgKGFyZzEsIG9wLCBub3NpZGUpOworICAgICAgZWxzZQorCXJldHVybiB2YWx1ZV9uZWcgKGFyZzEpOworCisgICAgY2FzZSBVTk9QX0NPTVBMRU1FTlQ6CisgICAgICAvKiBDKys6IGNoZWNrIGZvciBhbmQgaGFuZGxlIGRlc3RydWN0b3IgbmFtZXMuICAqLworICAgICAgb3AgPSBleHAtPmVsdHNbKnBvc10ub3Bjb2RlOworCisgICAgICBhcmcxID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgaWYgKG5vc2lkZSA9PSBFVkFMX1NLSVApCisJZ290byBub3NpZGVyZXQ7CisgICAgICBpZiAodW5vcF91c2VyX2RlZmluZWRfcCAoVU5PUF9DT01QTEVNRU5ULCBhcmcxKSkKKwlyZXR1cm4gdmFsdWVfeF91bm9wIChhcmcxLCBVTk9QX0NPTVBMRU1FTlQsIG5vc2lkZSk7CisgICAgICBlbHNlCisJcmV0dXJuIHZhbHVlX2NvbXBsZW1lbnQgKGFyZzEpOworCisgICAgY2FzZSBVTk9QX0xPR0lDQUxfTk9UOgorICAgICAgYXJnMSA9IGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgbm9zaWRlKTsKKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQKQorCWdvdG8gbm9zaWRlcmV0OworICAgICAgaWYgKHVub3BfdXNlcl9kZWZpbmVkX3AgKG9wLCBhcmcxKSkKKwlyZXR1cm4gdmFsdWVfeF91bm9wIChhcmcxLCBvcCwgbm9zaWRlKTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gdmFsdWVfZnJvbV9sb25nZXN0IChMQV9CT09MX1RZUEUsCisJCQkJICAgKExPTkdFU1QpIHZhbHVlX2xvZ2ljYWxfbm90IChhcmcxKSk7CisKKyAgICBjYXNlIFVOT1BfSU5EOgorICAgICAgaWYgKGV4cGVjdF90eXBlICYmIFRZUEVfQ09ERSAoZXhwZWN0X3R5cGUpID09IFRZUEVfQ09ERV9QVFIpCisgICAgICAgIGV4cGVjdF90eXBlID0gVFlQRV9UQVJHRVRfVFlQRSAoY2hlY2tfdHlwZWRlZiAoZXhwZWN0X3R5cGUpKTsKKyAgICAgIGFyZzEgPSBldmFsdWF0ZV9zdWJleHAgKGV4cGVjdF90eXBlLCBleHAsIHBvcywgbm9zaWRlKTsKKyAgICAgIGlmICgoVFlQRV9UQVJHRVRfVFlQRSAoVkFMVUVfVFlQRSAoYXJnMSkpKSAmJgorCSAgKChUWVBFX0NPREUgKFRZUEVfVEFSR0VUX1RZUEUgKFZBTFVFX1RZUEUgKGFyZzEpKSkgPT0gVFlQRV9DT0RFX01FVEhPRCkgfHwKKwkgICAoVFlQRV9DT0RFIChUWVBFX1RBUkdFVF9UWVBFIChWQUxVRV9UWVBFIChhcmcxKSkpID09IFRZUEVfQ09ERV9NRU1CRVIpKSkKKyAgICAgICAgZXJyb3IgKCJBdHRlbXB0IHRvIGRlcmVmZXJlbmNlIHBvaW50ZXIgdG8gbWVtYmVyIHdpdGhvdXQgYW4gb2JqZWN0Iik7CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfU0tJUCkKKwlnb3RvIG5vc2lkZXJldDsKKyAgICAgIGlmICh1bm9wX3VzZXJfZGVmaW5lZF9wIChvcCwgYXJnMSkpCisJcmV0dXJuIHZhbHVlX3hfdW5vcCAoYXJnMSwgb3AsIG5vc2lkZSk7CisgICAgICBlbHNlIGlmIChub3NpZGUgPT0gRVZBTF9BVk9JRF9TSURFX0VGRkVDVFMpCisJeworCSAgdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZzEpKTsKKwkgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9QVFIKKwkgICAgICB8fCBUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9SRUYKKwkgICAgICAvKiBJbiBDIHlvdSBjYW4gZGVyZWZlcmVuY2UgYW4gYXJyYXkgdG8gZ2V0IHRoZSAxc3QgZWx0LiAgKi8KKwkgICAgICB8fCBUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9BUlJBWQorCSAgICAgICkKKwkgICAgcmV0dXJuIHZhbHVlX3plcm8gKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpLAorCQkJICAgICAgIGx2YWxfbWVtb3J5KTsKKwkgIGVsc2UgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX0lOVCkKKwkgICAgLyogR0RCIGFsbG93cyBkZXJlZmVyZW5jaW5nIGFuIGludC4gICovCisJICAgIHJldHVybiB2YWx1ZV96ZXJvIChidWlsdGluX3R5cGVfaW50LCBsdmFsX21lbW9yeSk7CisJICBlbHNlCisJICAgIGVycm9yICgiQXR0ZW1wdCB0byB0YWtlIGNvbnRlbnRzIG9mIGEgbm9uLXBvaW50ZXIgdmFsdWUuIik7CisJfQorICAgICAgcmV0dXJuIHZhbHVlX2luZCAoYXJnMSk7CisKKyAgICBjYXNlIFVOT1BfQUREUjoKKyAgICAgIC8qIEMrKzogY2hlY2sgZm9yIGFuZCBoYW5kbGUgcG9pbnRlciB0byBtZW1iZXJzLiAgKi8KKyAgICAgIAorICAgICAgb3AgPSBleHAtPmVsdHNbKnBvc10ub3Bjb2RlOworCisgICAgICBpZiAobm9zaWRlID09IEVWQUxfU0tJUCkKKwl7CisJICBpZiAob3AgPT0gT1BfU0NPUEUpCisJICAgIHsKKwkgICAgICBpbnQgdGVtbSA9IGxvbmdlc3RfdG9faW50IChleHAtPmVsdHNbcGMrM10ubG9uZ2NvbnN0KTsKKwkgICAgICAoKnBvcykgKz0gMyArIEJZVEVTX1RPX0VYUF9FTEVNICh0ZW1tICsgMSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgZXZhbHVhdGVfc3ViZXhwIChleHBlY3RfdHlwZSwgZXhwLCBwb3MsIEVWQUxfU0tJUCk7CisJICBnb3RvIG5vc2lkZXJldDsKKwl9CisgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgdmFsdWVfcHRyIHJldHZhbHAgPSBldmFsdWF0ZV9zdWJleHBfZm9yX2FkZHJlc3MgKGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgICAgIC8qIElmIEhQIGFDQyBvYmplY3QsIHVzZSBiaWFzIGZvciBwb2ludGVycyB0byBtZW1iZXJzICovIAorICAgICAgICAgIGlmIChocF9zb21fc29tX29iamVjdF9wcmVzZW50ICYmCisgICAgICAgICAgICAgIChUWVBFX0NPREUgKFZBTFVFX1RZUEUgKHJldHZhbHApKSA9PSBUWVBFX0NPREVfUFRSKSAmJgorICAgICAgICAgICAgICAoVFlQRV9DT0RFIChUWVBFX1RBUkdFVF9UWVBFIChWQUxVRV9UWVBFIChyZXR2YWxwKSkpID09IFRZUEVfQ09ERV9NRU1CRVIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKiBwdHIgPSAodW5zaWduZWQgaW50ICopIFZBTFVFX0NPTlRFTlRTIChyZXR2YWxwKTsgLyogZm9yY2VzIGV2YWx1YXRpb24gKi8KKyAgICAgICAgICAgICAgKnB0ciB8PSAweDIwMDAwMDAwOyAvKiBzZXQgMjl0aCBiaXQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gcmV0dmFscDsKKyAgICAgICAgfQorICAgICAgCisgICAgY2FzZSBVTk9QX1NJWkVPRjoKKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQKQorCXsKKwkgIGV2YWx1YXRlX3N1YmV4cCAoTlVMTF9UWVBFLCBleHAsIHBvcywgRVZBTF9TS0lQKTsKKwkgIGdvdG8gbm9zaWRlcmV0OworCX0KKyAgICAgIHJldHVybiBldmFsdWF0ZV9zdWJleHBfZm9yX3NpemVvZiAoZXhwLCBwb3MpOworCisgICAgY2FzZSBVTk9QX0NBU1Q6CisgICAgICAoKnBvcykgKz0gMjsKKyAgICAgIHR5cGUgPSBleHAtPmVsdHNbcGMgKyAxXS50eXBlOworICAgICAgYXJnMSA9IGV2YWx1YXRlX3N1YmV4cCAodHlwZSwgZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfU0tJUCkKKwlnb3RvIG5vc2lkZXJldDsKKyAgICAgIGlmICh0eXBlICE9IFZBTFVFX1RZUEUgKGFyZzEpKQorCWFyZzEgPSB2YWx1ZV9jYXN0ICh0eXBlLCBhcmcxKTsKKyAgICAgIHJldHVybiBhcmcxOworCisgICAgY2FzZSBVTk9QX01FTVZBTDoKKyAgICAgICgqcG9zKSArPSAyOworICAgICAgYXJnMSA9IGV2YWx1YXRlX3N1YmV4cCAoZXhwZWN0X3R5cGUsIGV4cCwgcG9zLCBub3NpZGUpOworICAgICAgaWYgKG5vc2lkZSA9PSBFVkFMX1NLSVApCisJZ290byBub3NpZGVyZXQ7CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfQVZPSURfU0lERV9FRkZFQ1RTKQorCXJldHVybiB2YWx1ZV96ZXJvIChleHAtPmVsdHNbcGMgKyAxXS50eXBlLCBsdmFsX21lbW9yeSk7CisgICAgICBlbHNlCisJcmV0dXJuIHZhbHVlX2F0X2xhenkgKGV4cC0+ZWx0c1twYyArIDFdLnR5cGUsCisJCQkgICAgICB2YWx1ZV9hc19wb2ludGVyIChhcmcxKSwKKwkJCSAgICAgIE5VTEwpOworCisgICAgY2FzZSBVTk9QX1BSRUlOQ1JFTUVOVDoKKyAgICAgIGFyZzEgPSBldmFsdWF0ZV9zdWJleHAgKGV4cGVjdF90eXBlLCBleHAsIHBvcywgbm9zaWRlKTsKKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQIHx8IG5vc2lkZSA9PSBFVkFMX0FWT0lEX1NJREVfRUZGRUNUUykKKwlyZXR1cm4gYXJnMTsKKyAgICAgIGVsc2UgaWYgKHVub3BfdXNlcl9kZWZpbmVkX3AgKG9wLCBhcmcxKSkKKwl7CisJICByZXR1cm4gdmFsdWVfeF91bm9wIChhcmcxLCBvcCwgbm9zaWRlKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgYXJnMiA9IHZhbHVlX2FkZCAoYXJnMSwgdmFsdWVfZnJvbV9sb25nZXN0IChidWlsdGluX3R5cGVfY2hhciwgCisJCQkJCQkgICAoTE9OR0VTVCkgMSkpOworCSAgcmV0dXJuIHZhbHVlX2Fzc2lnbiAoYXJnMSwgYXJnMik7CisJfQorCisgICAgY2FzZSBVTk9QX1BSRURFQ1JFTUVOVDoKKyAgICAgIGFyZzEgPSBldmFsdWF0ZV9zdWJleHAgKGV4cGVjdF90eXBlLCBleHAsIHBvcywgbm9zaWRlKTsKKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQIHx8IG5vc2lkZSA9PSBFVkFMX0FWT0lEX1NJREVfRUZGRUNUUykKKwlyZXR1cm4gYXJnMTsKKyAgICAgIGVsc2UgaWYgKHVub3BfdXNlcl9kZWZpbmVkX3AgKG9wLCBhcmcxKSkKKwl7CisJICByZXR1cm4gdmFsdWVfeF91bm9wIChhcmcxLCBvcCwgbm9zaWRlKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgYXJnMiA9IHZhbHVlX3N1YiAoYXJnMSwgdmFsdWVfZnJvbV9sb25nZXN0IChidWlsdGluX3R5cGVfY2hhciwgCisJCQkJCQkgICAoTE9OR0VTVCkgMSkpOworCSAgcmV0dXJuIHZhbHVlX2Fzc2lnbiAoYXJnMSwgYXJnMik7CisJfQorCisgICAgY2FzZSBVTk9QX1BPU1RJTkNSRU1FTlQ6CisgICAgICBhcmcxID0gZXZhbHVhdGVfc3ViZXhwIChleHBlY3RfdHlwZSwgZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfU0tJUCB8fCBub3NpZGUgPT0gRVZBTF9BVk9JRF9TSURFX0VGRkVDVFMpCisJcmV0dXJuIGFyZzE7CisgICAgICBlbHNlIGlmICh1bm9wX3VzZXJfZGVmaW5lZF9wIChvcCwgYXJnMSkpCisJeworCSAgcmV0dXJuIHZhbHVlX3hfdW5vcCAoYXJnMSwgb3AsIG5vc2lkZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGFyZzIgPSB2YWx1ZV9hZGQgKGFyZzEsIHZhbHVlX2Zyb21fbG9uZ2VzdCAoYnVpbHRpbl90eXBlX2NoYXIsIAorCQkJCQkJICAgKExPTkdFU1QpIDEpKTsKKwkgIHZhbHVlX2Fzc2lnbiAoYXJnMSwgYXJnMik7CisJICByZXR1cm4gYXJnMTsKKwl9CisKKyAgICBjYXNlIFVOT1BfUE9TVERFQ1JFTUVOVDoKKyAgICAgIGFyZzEgPSBldmFsdWF0ZV9zdWJleHAgKGV4cGVjdF90eXBlLCBleHAsIHBvcywgbm9zaWRlKTsKKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQIHx8IG5vc2lkZSA9PSBFVkFMX0FWT0lEX1NJREVfRUZGRUNUUykKKwlyZXR1cm4gYXJnMTsKKyAgICAgIGVsc2UgaWYgKHVub3BfdXNlcl9kZWZpbmVkX3AgKG9wLCBhcmcxKSkKKwl7CisJICByZXR1cm4gdmFsdWVfeF91bm9wIChhcmcxLCBvcCwgbm9zaWRlKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgYXJnMiA9IHZhbHVlX3N1YiAoYXJnMSwgdmFsdWVfZnJvbV9sb25nZXN0IChidWlsdGluX3R5cGVfY2hhciwgCisJCQkJCQkgICAoTE9OR0VTVCkgMSkpOworCSAgdmFsdWVfYXNzaWduIChhcmcxLCBhcmcyKTsKKwkgIHJldHVybiBhcmcxOworCX0KKwkKKyAgICBjYXNlIE9QX1RISVM6CisgICAgICAoKnBvcykgKz0gMTsKKyAgICAgIHJldHVybiB2YWx1ZV9vZl90aGlzICgxKTsKKworICAgIGNhc2UgT1BfVFlQRToKKyAgICAgIGVycm9yICgiQXR0ZW1wdCB0byB1c2UgYSB0eXBlIG5hbWUgYXMgYW4gZXhwcmVzc2lvbiIpOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIFJlbW92aW5nIHRoaXMgY2FzZSBhbmQgY29tcGlsaW5nIHdpdGggZ2NjIC1XYWxsIHJldmVhbHMgdGhhdAorCSBhIGxvdCBvZiBjYXNlcyBhcmUgaGl0dGluZyB0aGlzIGNhc2UuICBTb21lIG9mIHRoZXNlIHNob3VsZAorCSBwcm9iYWJseSBiZSByZW1vdmVkIGZyb20gZXhwcmVzc2lvbi5oIChlLmcuIGRvIHdlIG5lZWQgYSBCSU5PUF9TQ09QRQorCSBhbmQgYW4gT1BfU0NPUEU/KTsgb3RoZXJzIGFyZSBsZWdpdGltYXRlIGV4cHJlc3Npb25zIHdoaWNoIGFyZQorCSAoYXBwYXJlbnRseSkgbm90IGZ1bGx5IGltcGxlbWVudGVkLgorCisJIElmIHRoZXJlIGFyZSBhbnkgY2FzZXMgbGFuZGluZyBoZXJlIHdoaWNoIG1lYW4gYSB1c2VyIGVycm9yLAorCSB0aGVuIHRoZXkgc2hvdWxkIGJlIHNlcGFyYXRlIGNhc2VzLCB3aXRoIG1vcmUgZGVzY3JpcHRpdmUKKwkgZXJyb3IgbWVzc2FnZXMuICAqLworCisgICAgICBlcnJvciAoIlwKK0dEQiBkb2VzIG5vdCAoeWV0KSBrbm93IGhvdyB0byBldmFsdWF0ZSB0aGF0IGtpbmQgb2YgZXhwcmVzc2lvbiIpOworICAgIH0KKworIG5vc2lkZXJldDoKKyAgcmV0dXJuIHZhbHVlX2Zyb21fbG9uZ2VzdCAoYnVpbHRpbl90eXBlX2xvbmcsIChMT05HRVNUKSAxKTsKK30KKwwKKy8qIEV2YWx1YXRlIGEgc3ViZXhwcmVzc2lvbiBvZiBFWFAsIGF0IGluZGV4ICpQT1MsCisgICBhbmQgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoYXQgc3ViZXhwcmVzc2lvbi4KKyAgIEFkdmFuY2UgKlBPUyBvdmVyIHRoZSBzdWJleHByZXNzaW9uLgorICAgSWYgdGhlIHN1YmV4cHJlc3Npb24gaXNuJ3QgYW4gbHZhbHVlLCBnZXQgYW4gZXJyb3IuCisgICBOT1NJREUgbWF5IGJlIEVWQUxfQVZPSURfU0lERV9FRkZFQ1RTOworICAgdGhlbiBvbmx5IHRoZSB0eXBlIG9mIHRoZSByZXN1bHQgbmVlZCBiZSBjb3JyZWN0LiAgKi8KKworc3RhdGljIHZhbHVlX3B0cgorZXZhbHVhdGVfc3ViZXhwX2Zvcl9hZGRyZXNzIChleHAsIHBvcywgbm9zaWRlKQorICAgICByZWdpc3RlciBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwOworICAgICByZWdpc3RlciBpbnQgKnBvczsKKyAgICAgZW51bSBub3NpZGUgbm9zaWRlOworeworICBlbnVtIGV4cF9vcGNvZGUgb3A7CisgIHJlZ2lzdGVyIGludCBwYzsKKyAgc3RydWN0IHN5bWJvbCAqdmFyOworCisgIHBjID0gKCpwb3MpOworICBvcCA9IGV4cC0+ZWx0c1twY10ub3Bjb2RlOworCisgIHN3aXRjaCAob3ApCisgICAgeworICAgIGNhc2UgVU5PUF9JTkQ6CisgICAgICAoKnBvcykrKzsKKyAgICAgIHJldHVybiBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIG5vc2lkZSk7CisKKyAgICBjYXNlIFVOT1BfTUVNVkFMOgorICAgICAgKCpwb3MpICs9IDM7CisgICAgICByZXR1cm4gdmFsdWVfY2FzdCAobG9va3VwX3BvaW50ZXJfdHlwZSAoZXhwLT5lbHRzW3BjICsgMV0udHlwZSksCisJCQkgZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpKTsKKworICAgIGNhc2UgT1BfVkFSX1ZBTFVFOgorICAgICAgdmFyID0gZXhwLT5lbHRzW3BjICsgMl0uc3ltYm9sOworCisgICAgICAvKiBDKys6IFRoZSAiYWRkcmVzcyIgb2YgYSByZWZlcmVuY2Ugc2hvdWxkIHlpZWxkIHRoZSBhZGRyZXNzCisgICAgICAgKiBvZiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8uIExldCB2YWx1ZV9hZGRyKCkgZGVhbCB3aXRoIGl0LiAqLworICAgICAgaWYgKFRZUEVfQ09ERSAoU1lNQk9MX1RZUEUgKHZhcikpID09IFRZUEVfQ09ERV9SRUYpCisgICAgICAgIGdvdG8gZGVmYXVsdF9jYXNlOworCisgICAgICAoKnBvcykgKz0gNDsKKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9BVk9JRF9TSURFX0VGRkVDVFMpCisJeworCSAgc3RydWN0IHR5cGUgKnR5cGUgPQorCSAgICBsb29rdXBfcG9pbnRlcl90eXBlIChTWU1CT0xfVFlQRSAodmFyKSk7CisJICBlbnVtIGFkZHJlc3NfY2xhc3Mgc3ltX2NsYXNzID0gU1lNQk9MX0NMQVNTICh2YXIpOworCisJICBpZiAoc3ltX2NsYXNzID09IExPQ19DT05TVAorCSAgICAgIHx8IHN5bV9jbGFzcyA9PSBMT0NfQ09OU1RfQllURVMKKwkgICAgICB8fCBzeW1fY2xhc3MgPT0gTE9DX1JFR0lTVEVSCisJICAgICAgfHwgc3ltX2NsYXNzID09IExPQ19SRUdQQVJNKQorCSAgICBlcnJvciAoIkF0dGVtcHQgdG8gdGFrZSBhZGRyZXNzIG9mIHJlZ2lzdGVyIG9yIGNvbnN0YW50LiIpOworCisJcmV0dXJuCisJICB2YWx1ZV96ZXJvICh0eXBlLCBub3RfbHZhbCk7CisJfQorICAgICAgZWxzZQorCXJldHVybgorCSAgbG9jYXRlX3Zhcl92YWx1ZQorCSAgICAodmFyLAorCSAgICAgYmxvY2tfaW5uZXJtb3N0X2ZyYW1lIChleHAtPmVsdHNbcGMgKyAxXS5ibG9jaykpOworCisgICAgZGVmYXVsdDoKKyAgICBkZWZhdWx0X2Nhc2U6CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfQVZPSURfU0lERV9FRkZFQ1RTKQorCXsKKwkgIHZhbHVlX3B0ciB4ID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBub3NpZGUpOworCSAgaWYgKFZBTFVFX0xWQUwgKHgpID09IGx2YWxfbWVtb3J5KQorCSAgICByZXR1cm4gdmFsdWVfemVybyAobG9va3VwX3BvaW50ZXJfdHlwZSAoVkFMVUVfVFlQRSAoeCkpLAorCQkJICAgICAgIG5vdF9sdmFsKTsKKwkgIGVsc2UKKwkgICAgZXJyb3IgKCJBdHRlbXB0IHRvIHRha2UgYWRkcmVzcyBvZiBub24tbHZhbCIpOworCX0KKyAgICAgIHJldHVybiB2YWx1ZV9hZGRyIChldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIG5vc2lkZSkpOworICAgIH0KK30KKworLyogRXZhbHVhdGUgbGlrZSBgZXZhbHVhdGVfc3ViZXhwJyBleGNlcHQgY29lcmNpbmcgYXJyYXlzIHRvIHBvaW50ZXJzLgorICAgV2hlbiB1c2VkIGluIGNvbnRleHRzIHdoZXJlIGFycmF5cyB3aWxsIGJlIGNvZXJjZWQgYW55d2F5LCB0aGlzIGlzCisgICBlcXVpdmFsZW50IHRvIGBldmFsdWF0ZV9zdWJleHAnIGJ1dCBtdWNoIGZhc3RlciBiZWNhdXNlIGl0IGF2b2lkcworICAgYWN0dWFsbHkgZmV0Y2hpbmcgYXJyYXkgY29udGVudHMgKHBlcmhhcHMgb2Jzb2xldGUgbm93IHRoYXQgd2UgaGF2ZQorICAgVkFMVUVfTEFaWSkuCisKKyAgIE5vdGUgdGhhdCB3ZSBjdXJyZW50bHkgb25seSBkbyB0aGUgY29lcmNpb24gZm9yIEMgZXhwcmVzc2lvbnMsIHdoZXJlCisgICBhcnJheXMgYXJlIHplcm8gYmFzZWQgYW5kIHRoZSBjb2VyY2lvbiBpcyBjb3JyZWN0LiAgRm9yIG90aGVyIGxhbmd1YWdlcywKKyAgIHdpdGggbm9uemVybyBiYXNlZCBhcnJheXMsIGNvZXJjaW9uIGxvc2VzLiAgVXNlIENBU1RfSVNfQ09OVkVSU0lPTgorICAgdG8gZGVjaWRlIGlmIGNvZXJjaW9uIGlzIGFwcHJvcHJpYXRlLgorCisgICAqLworCit2YWx1ZV9wdHIKK2V2YWx1YXRlX3N1YmV4cF93aXRoX2NvZXJjaW9uIChleHAsIHBvcywgbm9zaWRlKQorICAgICByZWdpc3RlciBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwOworICAgICByZWdpc3RlciBpbnQgKnBvczsKKyAgICAgZW51bSBub3NpZGUgbm9zaWRlOworeworICByZWdpc3RlciBlbnVtIGV4cF9vcGNvZGUgb3A7CisgIHJlZ2lzdGVyIGludCBwYzsKKyAgcmVnaXN0ZXIgdmFsdWVfcHRyIHZhbDsKKyAgc3RydWN0IHN5bWJvbCAqdmFyOworCisgIHBjID0gKCpwb3MpOworICBvcCA9IGV4cC0+ZWx0c1twY10ub3Bjb2RlOworCisgIHN3aXRjaCAob3ApCisgICAgeworICAgIGNhc2UgT1BfVkFSX1ZBTFVFOgorICAgICAgdmFyID0gZXhwLT5lbHRzW3BjICsgMl0uc3ltYm9sOworICAgICAgaWYgKFRZUEVfQ09ERSAoY2hlY2tfdHlwZWRlZiAoU1lNQk9MX1RZUEUgKHZhcikpKSA9PSBUWVBFX0NPREVfQVJSQVkKKwkgICYmIENBU1RfSVNfQ09OVkVSU0lPTikKKwl7CisJICAoKnBvcykgKz0gNDsKKwkgIHZhbCA9CisJICAgIGxvY2F0ZV92YXJfdmFsdWUKKwkgICAgICAodmFyLCBibG9ja19pbm5lcm1vc3RfZnJhbWUgKGV4cC0+ZWx0c1twYyArIDFdLmJsb2NrKSk7CisJICByZXR1cm4gdmFsdWVfY2FzdCAobG9va3VwX3BvaW50ZXJfdHlwZSAoVFlQRV9UQVJHRVRfVFlQRSAoU1lNQk9MX1RZUEUgKHZhcikpKSwKKwkJCSAgICAgdmFsKTsKKwl9CisgICAgICAvKiBGQUxMVEhST1VHSCAqLworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgfQorfQorCisvKiBFdmFsdWF0ZSBhIHN1YmV4cHJlc3Npb24gb2YgRVhQLCBhdCBpbmRleCAqUE9TLAorICAgYW5kIHJldHVybiBhIHZhbHVlIGZvciB0aGUgc2l6ZSBvZiB0aGF0IHN1YmV4cHJlc3Npb24uCisgICBBZHZhbmNlICpQT1Mgb3ZlciB0aGUgc3ViZXhwcmVzc2lvbi4gICovCisKK3N0YXRpYyB2YWx1ZV9wdHIKK2V2YWx1YXRlX3N1YmV4cF9mb3Jfc2l6ZW9mIChleHAsIHBvcykKKyAgICAgcmVnaXN0ZXIgc3RydWN0IGV4cHJlc3Npb24gKmV4cDsKKyAgICAgcmVnaXN0ZXIgaW50ICpwb3M7Cit7CisgIGVudW0gZXhwX29wY29kZSBvcDsKKyAgcmVnaXN0ZXIgaW50IHBjOworICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgdmFsdWVfcHRyIHZhbDsKKworICBwYyA9ICgqcG9zKTsKKyAgb3AgPSBleHAtPmVsdHNbcGNdLm9wY29kZTsKKworICBzd2l0Y2ggKG9wKQorICAgIHsKKyAgICAgIC8qIFRoaXMgY2FzZSBpcyBoYW5kbGVkIHNwZWNpYWxseQorCSBzbyB0aGF0IHdlIGF2b2lkIGNyZWF0aW5nIGEgdmFsdWUgZm9yIHRoZSByZXN1bHQgdHlwZS4KKwkgSWYgdGhlIHJlc3VsdCB0eXBlIGlzIHZlcnkgYmlnLCBpdCdzIGRlc2lyYWJsZSBub3QgdG8KKwkgY3JlYXRlIGEgdmFsdWUgdW5uZWNlc3NhcmlseS4gICovCisgICAgY2FzZSBVTk9QX0lORDoKKyAgICAgICgqcG9zKSsrOworICAgICAgdmFsID0gZXZhbHVhdGVfc3ViZXhwIChOVUxMX1RZUEUsIGV4cCwgcG9zLCBFVkFMX0FWT0lEX1NJREVfRUZGRUNUUyk7CisgICAgICB0eXBlID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAodmFsKSk7CisgICAgICBpZiAoVFlQRV9DT0RFICh0eXBlKSAhPSBUWVBFX0NPREVfUFRSCisJICAmJiBUWVBFX0NPREUgKHR5cGUpICE9IFRZUEVfQ09ERV9SRUYKKwkgICYmIFRZUEVfQ09ERSAodHlwZSkgIT0gVFlQRV9DT0RFX0FSUkFZKQorCWVycm9yICgiQXR0ZW1wdCB0byB0YWtlIGNvbnRlbnRzIG9mIGEgbm9uLXBvaW50ZXIgdmFsdWUuIik7CisgICAgICB0eXBlID0gY2hlY2tfdHlwZWRlZiAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpOworICAgICAgcmV0dXJuIHZhbHVlX2Zyb21fbG9uZ2VzdCAoYnVpbHRpbl90eXBlX2ludCwgKExPTkdFU1QpCisJCSAgICAgIFRZUEVfTEVOR1RIICh0eXBlKSk7CisKKyAgICBjYXNlIFVOT1BfTUVNVkFMOgorICAgICAgKCpwb3MpICs9IDM7CisgICAgICB0eXBlID0gY2hlY2tfdHlwZWRlZiAoZXhwLT5lbHRzW3BjICsgMV0udHlwZSk7CisgICAgICByZXR1cm4gdmFsdWVfZnJvbV9sb25nZXN0IChidWlsdGluX3R5cGVfaW50LAorCQkJCSAoTE9OR0VTVCkgVFlQRV9MRU5HVEggKHR5cGUpKTsKKworICAgIGNhc2UgT1BfVkFSX1ZBTFVFOgorICAgICAgKCpwb3MpICs9IDQ7CisgICAgICB0eXBlID0gY2hlY2tfdHlwZWRlZiAoU1lNQk9MX1RZUEUgKGV4cC0+ZWx0c1twYyArIDJdLnN5bWJvbCkpOworICAgICAgcmV0dXJuCisJdmFsdWVfZnJvbV9sb25nZXN0IChidWlsdGluX3R5cGVfaW50LCAoTE9OR0VTVCkgVFlQRV9MRU5HVEggKHR5cGUpKTsKKworICAgIGRlZmF1bHQ6CisgICAgICB2YWwgPSBldmFsdWF0ZV9zdWJleHAgKE5VTExfVFlQRSwgZXhwLCBwb3MsIEVWQUxfQVZPSURfU0lERV9FRkZFQ1RTKTsKKyAgICAgIHJldHVybiB2YWx1ZV9mcm9tX2xvbmdlc3QgKGJ1aWx0aW5fdHlwZV9pbnQsCisJCQkgICAgICAoTE9OR0VTVCkgVFlQRV9MRU5HVEggKFZBTFVFX1RZUEUgKHZhbCkpKTsKKyAgICB9Cit9CisKKy8qIFBhcnNlIGEgdHlwZSBleHByZXNzaW9uIGluIHRoZSBzdHJpbmcgW1AuLlArTEVOR1RIKS4gKi8KKworc3RydWN0IHR5cGUgKgorcGFyc2VfYW5kX2V2YWxfdHlwZSAocCwgbGVuZ3RoKQorICAgICBjaGFyICpwOworICAgICBpbnQgbGVuZ3RoOworeworICAgIGNoYXIgKnRtcCA9IChjaGFyICopYWxsb2NhIChsZW5ndGggKyA0KTsKKyAgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwcjsKKyAgICB0bXBbMF0gPSAnKCc7CisgICAgbWVtY3B5ICh0bXArMSwgcCwgbGVuZ3RoKTsKKyAgICB0bXBbbGVuZ3RoKzFdID0gJyknOworICAgIHRtcFtsZW5ndGgrMl0gPSAnMCc7CisgICAgdG1wW2xlbmd0aCszXSA9ICdcMCc7CisgICAgZXhwciA9IHBhcnNlX2V4cHJlc3Npb24gKHRtcCk7CisgICAgaWYgKGV4cHItPmVsdHNbMF0ub3Bjb2RlICE9IFVOT1BfQ0FTVCkKKwllcnJvciAoIkludGVybmFsIGVycm9yIGluIGV2YWxfdHlwZS4iKTsKKyAgICByZXR1cm4gZXhwci0+ZWx0c1sxXS50eXBlOworfQorCitpbnQKK2NhbGNfZjc3X2FycmF5X2RpbXMgKGFycmF5X3R5cGUpCisgICAgIHN0cnVjdCB0eXBlICphcnJheV90eXBlOworeworICBpbnQgbmRpbWVuID0gMTsKKyAgc3RydWN0IHR5cGUgKnRtcF90eXBlOworCisgIGlmICgoVFlQRV9DT0RFKGFycmF5X3R5cGUpICE9IFRZUEVfQ09ERV9BUlJBWSkpCisgICAgZXJyb3IgKCJDYW4ndCBnZXQgZGltZW5zaW9ucyBmb3IgYSBub24tYXJyYXkgdHlwZSIpOworICAgCisgIHRtcF90eXBlID0gYXJyYXlfdHlwZTsgCisKKyAgd2hpbGUgKCh0bXBfdHlwZSA9IFRZUEVfVEFSR0VUX1RZUEUgKHRtcF90eXBlKSkpCisgICAgeworICAgICAgaWYgKFRZUEVfQ09ERSAodG1wX3R5cGUpID09IFRZUEVfQ09ERV9BUlJBWSkKKwkrK25kaW1lbjsKKyAgICB9CisgIHJldHVybiBuZGltZW47IAorfQpkaWZmIC0tZ2l0IGEvZ2RiL2V4Y19yZXF1ZXN0LmRlZnMgYi9nZGIvZXhjX3JlcXVlc3QuZGVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjVlZDJlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2V4Y19yZXF1ZXN0LmRlZnMKQEAgLTAsMCArMSw1MSBAQAorLyogCisgKiBNYWNoIE9wZXJhdGluZyBTeXN0ZW0KKyAqIENvcHlyaWdodCAoYykgMTk5MywxOTkxLDE5OTAsMTk4OSwxOTg4LDE5ODcgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IGJvdGggdGhlIGNvcHlyaWdodAorICogbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIG9mIHRoZQorICogc29mdHdhcmUsIGRlcml2YXRpdmUgd29ya3Mgb3IgbW9kaWZpZWQgdmVyc2lvbnMsIGFuZCBhbnkgcG9ydGlvbnMKKyAqIHRoZXJlb2YsIGFuZCB0aGF0IGJvdGggbm90aWNlcyBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgorICogCisgKiBDQVJORUdJRSBNRUxMT04gQUxMT1dTIEZSRUUgVVNFIE9GIFRISVMgU09GVFdBUkUgSU4gSVRTICJBUyBJUyIKKyAqIENPTkRJVElPTi4gIENBUk5FR0lFIE1FTExPTiBESVNDTEFJTVMgQU5ZIExJQUJJTElUWSBPRiBBTlkgS0lORCBGT1IKKyAqIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLgorICogCisgKiBDYXJuZWdpZSBNZWxsb24gcmVxdWVzdHMgdXNlcnMgb2YgdGhpcyBzb2Z0d2FyZSB0byByZXR1cm4gdG8KKyAqIAorICogIFNvZnR3YXJlIERpc3RyaWJ1dGlvbiBDb29yZGluYXRvciAgb3IgIFNvZnR3YXJlLkRpc3RyaWJ1dGlvbkBDUy5DTVUuRURVCisgKiAgU2Nob29sIG9mIENvbXB1dGVyIFNjaWVuY2UKKyAqICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQorICogIFBpdHRzYnVyZ2ggUEEgMTUyMTMtMzg5MAorICogCisgKiBhbnkgaW1wcm92ZW1lbnRzIG9yIGV4dGVuc2lvbnMgdGhhdCB0aGV5IG1ha2UgYW5kIGdyYW50IENhcm5lZ2llIE1lbGxvbgorICogdGhlIHJpZ2h0cyB0byByZWRpc3RyaWJ1dGUgdGhlc2UgY2hhbmdlcy4KKyAqLworCisvKgorICogQWJzdHJhY3Q6CisgKglNaUcgZGVmaW5pdGlvbnMgZmlsZSBmb3IgTWFjaCBleGNlcHRpb24gaW50ZXJmYWNlIChyZXF1ZXN0IGhhbGYpLgorICovCisKK3N1YnN5c3RlbSBleGMgMjQwMDsKKworI2luY2x1ZGUgPG1hY2gvc3RkX3R5cGVzLmRlZnM+CisKKyNpZmRlZiBVU0VSUFJFRklYCit1c2VycHJlZml4IFVTRVJQUkVGSVg7CisjZW5kaWYKKworI2lmZGVmIFNFUlZFUlBSRUZJWAorc2VydmVycHJlZml4IFNFUlZFUlBSRUZJWDsKKyNlbmRpZgorCitzaW1wbGVyb3V0aW5lIGV4Y2VwdGlvbl9yYWlzZV9yZXF1ZXN0ICgKKwlleGNlcHRpb25fcG9ydAk6IG1hY2hfcG9ydF90OworCXJlcGx5cG9ydCByZXBseSA6IG1hY2hfcG9ydF9zZW5kX29uY2VfdDsKKwl0aHJlYWQJCTogbWFjaF9wb3J0X3Q7CisJdGFzawkJOiBtYWNoX3BvcnRfdDsKKwlleGNlcHRpb24JOiBpbnRlZ2VyX3Q7CisJY29kZQkJOiBpbnRlZ2VyX3Q7CisJc3ViY29kZQkJOiBpbnRlZ2VyX3QpOwpkaWZmIC0tZ2l0IGEvZ2RiL2V4ZWMuYyBiL2dkYi9leGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdhZWQwMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9leGVjLmMKQEAgLTAsMCArMSw3NjIgQEAKKy8qIFdvcmsgd2l0aCBleGVjdXRhYmxlIGZpbGVzLCBmb3IgR0RCLiAKKyAgIENvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk3LCAxOTk4CisgICAgICAgICAgICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKworI2lmZGVmIFVTRworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKworI2luY2x1ZGUgImdkYmNvcmUuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiZ2RiX3N0YXQuaCIKKyNpZm5kZWYgT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkgMAorI2VuZGlmCisKKyNpbmNsdWRlICJ4Y29mZnNvbGliLmgiCisKK3N0cnVjdCB2bWFwICptYXBfdm1hcCBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKKwordm9pZCAoKmZpbGVfY2hhbmdlZF9ob29rKSBQQVJBTVMgKChjaGFyICopKTsKKworLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zICovCisKK3N0YXRpYyB2b2lkIGFkZF90b19zZWN0aW9uX3RhYmxlIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIpKTsKKworc3RhdGljIHZvaWQgZXhlY19jbG9zZSBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIHZvaWQgZmlsZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHNldF9zZWN0aW9uX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgZXhlY19maWxlc19pbmZvIFBBUkFNUyAoKHN0cnVjdCB0YXJnZXRfb3BzICopKTsKKworc3RhdGljIHZvaWQgYmZkc2VjX3RvX3ZtYXAgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUikpOworCitzdGF0aWMgaW50IGlnbm9yZSBQQVJBTVMgKChDT1JFX0FERFIsIGNoYXIgKikpOworCitzdGF0aWMgdm9pZCBpbml0X2V4ZWNfb3BzIFBBUkFNUyAoKHZvaWQpKTsKKwordm9pZCBfaW5pdGlhbGl6ZV9leGVjIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIGludCBpbmZvX3ZlcmJvc2U7CisKKy8qIFRoZSB0YXJnZXQgdmVjdG9yIGZvciBleGVjdXRhYmxlIGZpbGVzLiAgKi8KKworc3RydWN0IHRhcmdldF9vcHMgZXhlY19vcHM7CisKKy8qIFRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGhhbmRsZSBmb3IgdGhlIGV4ZWN1dGFibGUgZmlsZS4gICovCisKK2JmZCAqZXhlY19iZmQgPSBOVUxMOworCisvKiBXaGV0aGVyIHRvIG9wZW4gZXhlYyBhbmQgY29yZSBmaWxlcyByZWFkLW9ubHkgb3IgcmVhZC13cml0ZS4gICovCisKK2ludCB3cml0ZV9maWxlcyA9IDA7CisKKy8qIFRleHQgc3RhcnQgYW5kIGVuZCBhZGRyZXNzZXMgKEtMVURHRSkgaWYgbmVlZGVkICovCisKKyNpZm5kZWYgTkVFRF9URVhUX1NUQVJUX0VORAorI2RlZmluZSBORUVEX1RFWFRfU1RBUlRfRU5EICgwKQorI2VuZGlmCitDT1JFX0FERFIgdGV4dF9zdGFydCA9IDA7CitDT1JFX0FERFIgdGV4dF9lbmQgICA9IDA7CisKK3N0cnVjdCB2bWFwICp2bWFwOworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2V4ZWNfY2xvc2UgKHF1aXR0aW5nKQorICAgICBpbnQgcXVpdHRpbmc7Cit7CisgIGludCBuZWVkX3N5bXRhYl9jbGVhbnVwID0gMDsKKyAgc3RydWN0IHZtYXAgKnZwLCAqbnh0OworICAKKyAgZm9yIChueHQgPSB2bWFwOyBueHQgIT0gTlVMTDsgKQorICAgIHsKKyAgICAgIHZwID0gbnh0OworICAgICAgbnh0ID0gdnAtPm54dDsKKworICAgICAgLyogaWYgdGhlcmUgaXMgYW4gb2JqZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBiZmQsCisJIGZyZWVfb2JqZmlsZSgpIHdpbGwgZG8gcHJvcGVyIGNsZWFudXAgb2Ygb2JqZmlsZSAqYW5kKiBiZmQuICovCisJCSAgIAorICAgICAgaWYgKHZwLT5vYmpmaWxlKQorCXsKKwkgIGZyZWVfb2JqZmlsZSAodnAtPm9iamZpbGUpOworCSAgbmVlZF9zeW10YWJfY2xlYW51cCA9IDE7CisJfQorICAgICAgZWxzZSBpZiAodnAtPmJmZCAhPSBleGVjX2JmZCkKKwkvKiBGSVhNRS1sZWFrOiBXZSBzaG91bGQgYmUgZnJlZWluZyB2cC0+bmFtZSB0b28sIEkgdGhpbmsuICAqLworCWlmICghYmZkX2Nsb3NlICh2cC0+YmZkKSkKKwkgIHdhcm5pbmcgKCJjYW5ub3QgY2xvc2UgXCIlc1wiOiAlcyIsCisJCSAgIHZwLT5uYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisKKyAgICAgIC8qIEZJWE1FOiBUaGlzIHJvdXRpbmUgaXMgI2lmIDAnZCBpbiBzeW1maWxlLmMuICBXaGF0IHNob3VsZCB3ZQorCSBiZSBkb2luZyBoZXJlPyAgU2hvdWxkIHdlIGp1c3QgZnJlZSBldmVyeXRoaW5nIGluCisJIHZwLT5vYmpmaWxlLT5zeW10YWJzPyAgU2hvdWxkIGZyZWVfb2JqZmlsZSBkbyB0aGF0PworCSBGSVhNRS1hcy13ZWxsOiBmcmVlX29iamZpbGUgYWxyZWFkeSBmcmVlJ2QgdnAtPm5hbWUsIHNvIGl0IGlzbid0CisJIHZhbGlkIGhlcmUuICAqLworICAgICAgZnJlZV9uYW1lZF9zeW10YWJzICh2cC0+bmFtZSk7CisgICAgICBmcmVlICh2cCk7CisgICAgfQorCisgIHZtYXAgPSBOVUxMOworCisgIGlmIChleGVjX2JmZCkKKyAgICB7CisgICAgICBjaGFyICpuYW1lID0gYmZkX2dldF9maWxlbmFtZSAoZXhlY19iZmQpOworCisgICAgICBpZiAoIWJmZF9jbG9zZSAoZXhlY19iZmQpKQorCXdhcm5pbmcgKCJjYW5ub3QgY2xvc2UgXCIlc1wiOiAlcyIsCisJCSBuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgICBmcmVlIChuYW1lKTsKKyAgICAgIGV4ZWNfYmZkID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKGV4ZWNfb3BzLnRvX3NlY3Rpb25zKQorICAgIHsKKyAgICAgIGZyZWUgKChQVFIpZXhlY19vcHMudG9fc2VjdGlvbnMpOworICAgICAgZXhlY19vcHMudG9fc2VjdGlvbnMgPSBOVUxMOworICAgICAgZXhlY19vcHMudG9fc2VjdGlvbnNfZW5kID0gTlVMTDsKKyAgICB9Cit9CisKKy8qICBQcm9jZXNzIHRoZSBmaXJzdCBhcmcgaW4gQVJHUyBhcyB0aGUgbmV3IGV4ZWMgZmlsZS4KKworICAgIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgYmVoYXZlIGVzc2VudGlhbGx5IHRoZSBzYW1lCisgICAgYXMgZXhlY19maWxlX2NvbW1hbmQsIGV4Y2VwdCB0aGF0IHRoZSBsYXR0ZXIgd2lsbCBkZXRlY3Qgd2hlbgorICAgIGEgdGFyZ2V0IGlzIGJlaW5nIGRlYnVnZ2VkLCBhbmQgd2lsbCBhc2sgdGhlIHVzZXIgd2hldGhlciBpdAorICAgIHNob3VsZCBiZSBzaHV0IGRvd24gZmlyc3QuICAoSWYgdGhlIGFuc3dlciBpcyAibm8iLCB0aGVuIHRoZQorICAgIG5ldyBmaWxlIGlzIGlnbm9yZWQuKQorCisgICAgVGhpcyBmaWxlIGlzIHVzZWQgYnkgZXhlY19maWxlX2NvbW1hbmQsIHRvIGRvIHRoZSB3b3JrIG9mIG9wZW5pbmcKKyAgICBhbmQgcHJvY2Vzc2luZyB0aGUgZXhlYyBmaWxlIGFmdGVyIGFueSBwcm9tcHRpbmcgaGFzIGhhcHBlbmVkLgorCisgICAgQW5kLCBpdCBpcyB1c2VkIGJ5IGNoaWxkX2F0dGFjaCwgd2hlbiB0aGUgYXR0YWNoIGNvbW1hbmQgd2FzCisgICAgZ2l2ZW4gYSBwaWQgYnV0IG5vdCBhIGV4ZWMgcGF0aG5hbWUsIGFuZCB0aGUgYXR0YWNoIGNvbW1hbmQgY291bGQKKyAgICBmaWd1cmUgb3V0IHRoZSBwYXRobmFtZSBmcm9tIHRoZSBwaWQuICAoSW4gdGhpcyBjYXNlLCB3ZSBzaG91bGRuJ3QKKyAgICBhc2sgdGhlIHVzZXIgd2hldGhlciB0aGUgY3VycmVudCB0YXJnZXQgc2hvdWxkIGJlIHNodXQgZG93biAtLQorICAgIHdlJ3JlIHN1cHBseWluZyB0aGUgZXhlYyBwYXRobmFtZSBsYXRlIGZvciBnb29kIHJlYXNvbi4pICovCisKK3ZvaWQKK2V4ZWNfZmlsZV9hdHRhY2ggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoYXIgKiphcmd2OworICBjaGFyICpmaWxlbmFtZTsKKworICAvKiBSZW1vdmUgYW55IHByZXZpb3VzIGV4ZWMgZmlsZS4gICovCisgIHVucHVzaF90YXJnZXQgKCZleGVjX29wcyk7CisKKyAgLyogTm93IG9wZW4gYW5kIGRpZ2VzdCB0aGUgZmlsZSB0aGUgdXNlciByZXF1ZXN0ZWQsIGlmIGFueS4gICovCisKKyAgaWYgKGFyZ3MpCisgICAgeworICAgICAgY2hhciAqc2NyYXRjaF9wYXRobmFtZTsKKyAgICAgIGludCBzY3JhdGNoX2NoYW47CisgICAgICAKKyAgICAgIC8qIFNjYW4gdGhyb3VnaCB0aGUgYXJncyBhbmQgcGljayB1cCB0aGUgZmlyc3Qgbm9uIG9wdGlvbiBhcmcKKwkgYXMgdGhlIGZpbGVuYW1lLiAgKi8KKworICAgICAgYXJndiA9IGJ1aWxkYXJndiAoYXJncyk7CisgICAgICBpZiAoYXJndiA9PSBOVUxMKQorCW5vbWVtICgwKTsKKworICAgICAgbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVhcmd2LCAoY2hhciAqKSBhcmd2KTsKKworICAgICAgZm9yICg7ICgqYXJndiAhPSBOVUxMKSAmJiAoKiphcmd2ID09ICctJyk7IGFyZ3YrKykgezt9CisgICAgICBpZiAoKmFyZ3YgPT0gTlVMTCkKKwllcnJvciAoIm5vIGV4ZWMgZmlsZSBuYW1lIHdhcyBzcGVjaWZpZWQiKTsKKworICAgICAgZmlsZW5hbWUgPSB0aWxkZV9leHBhbmQgKCphcmd2KTsKKyAgICAgIG1ha2VfY2xlYW51cCAoZnJlZSwgZmlsZW5hbWUpOworICAgICAgCisgICAgICBzY3JhdGNoX2NoYW4gPSBvcGVucCAoZ2V0ZW52ICgiUEFUSCIpLCAxLCBmaWxlbmFtZSwgCisJCQkgICAgd3JpdGVfZmlsZXM/IE9fUkRXUnxPX0JJTkFSWTogT19SRE9OTFl8T19CSU5BUlksIDAsCisJCQkgICAgJnNjcmF0Y2hfcGF0aG5hbWUpOworI2lmIGRlZmluZWQoX19HTzMyX18pIHx8IGRlZmluZWQoX1dJTjMyKQorICAgICAgaWYgKHNjcmF0Y2hfY2hhbiA8IDApCisgICAgICB7CisJY2hhciAqZXhlbmFtZSA9IGFsbG9jYSAoc3RybGVuIChmaWxlbmFtZSkgKyA1KTsKKwlzdHJjYXQgKHN0cmNweSAoZXhlbmFtZSwgZmlsZW5hbWUpLCAiLmV4ZSIpOworCXNjcmF0Y2hfY2hhbiA9IG9wZW5wIChnZXRlbnYgKCJQQVRIIiksIDEsIGV4ZW5hbWUsIHdyaXRlX2ZpbGVzID8KKwkJT19SRFdSfE9fQklOQVJZIDogT19SRE9OTFl8T19CSU5BUlksIDAsICZzY3JhdGNoX3BhdGhuYW1lKTsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgaWYgKHNjcmF0Y2hfY2hhbiA8IDApCisJcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworICAgICAgZXhlY19iZmQgPSBiZmRfZmRvcGVuciAoc2NyYXRjaF9wYXRobmFtZSwgZ251dGFyZ2V0LCBzY3JhdGNoX2NoYW4pOworCisgICAgICBpZiAoIWV4ZWNfYmZkKQorCWVycm9yICgiXCIlc1wiOiBjb3VsZCBub3Qgb3BlbiBhcyBhbiBleGVjdXRhYmxlIGZpbGU6ICVzIiwKKwkgICAgICAgc2NyYXRjaF9wYXRobmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCisgICAgICAvKiBBdCB0aGlzIHBvaW50LCBzY3JhdGNoX3BhdGhuYW1lIGFuZCBleGVjX2JmZC0+bmFtZSBib3RoIHBvaW50IHRvIHRoZQorCSBzYW1lIG1hbGxvYydkIHN0cmluZy4gIEhvd2V2ZXIgZXhlY19jbG9zZSgpIHdpbGwgYXR0ZW1wdCB0byBmcmVlIGl0CisJIHZpYSB0aGUgZXhlY19iZmQtPm5hbWUgcG9pbnRlciwgc28gd2UgbmVlZCB0byBtYWtlIGFub3RoZXIgY29weSBhbmQKKwkgbGVhdmUgZXhlY19iZmQgYXMgdGhlIG5ldyBvd25lciBvZiB0aGUgb3JpZ2luYWwgY29weS4gKi8KKyAgICAgIHNjcmF0Y2hfcGF0aG5hbWUgPSBzdHJkdXAgKHNjcmF0Y2hfcGF0aG5hbWUpOworICAgICAgbWFrZV9jbGVhbnVwIChmcmVlLCBzY3JhdGNoX3BhdGhuYW1lKTsKKyAgICAgIAorICAgICAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0IChleGVjX2JmZCwgYmZkX29iamVjdCkpCisJeworCSAgLyogTWFrZSBzdXJlIHRvIGNsb3NlIGV4ZWNfYmZkLCBvciBlbHNlICJydW4iIG1pZ2h0IHRyeSB0byB1c2UKKwkgICAgIGl0LiAgKi8KKwkgIGV4ZWNfY2xvc2UgKDApOworCSAgZXJyb3IgKCJcIiVzXCI6IG5vdCBpbiBleGVjdXRhYmxlIGZvcm1hdDogJXMiLAorCQkgc2NyYXRjaF9wYXRobmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCX0KKworICAgICAgLyogRklYTUUgLSBUaGlzIHNob3VsZCBvbmx5IGJlIHJ1biBmb3IgUlM2MDAwLCBidXQgdGhlIGlmZGVmIGlzIGEgcG9vcgorCSB3YXkgdG8gYWNjb21wbGlzaC4gICovCisjaWZkZWYgSUJNNjAwMF9UQVJHRVQKKyAgICAgIC8qIFNldHVwIGluaXRpYWwgdm1hcC4gKi8KKworICAgICAgbWFwX3ZtYXAgKGV4ZWNfYmZkLCAwKTsKKyAgICAgIGlmICh2bWFwID09IE5VTEwpCisJeworCSAgLyogTWFrZSBzdXJlIHRvIGNsb3NlIGV4ZWNfYmZkLCBvciBlbHNlICJydW4iIG1pZ2h0IHRyeSB0byB1c2UKKwkgICAgIGl0LiAgKi8KKwkgIGV4ZWNfY2xvc2UgKDApOworCSAgZXJyb3IgKCJcIiVzXCI6IGNhbid0IGZpbmQgdGhlIGZpbGUgc2VjdGlvbnM6ICVzIiwKKwkJIHNjcmF0Y2hfcGF0aG5hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKwl9CisjZW5kaWYgLyogSUJNNjAwMF9UQVJHRVQgKi8KKworICAgICAgaWYgKGJ1aWxkX3NlY3Rpb25fdGFibGUgKGV4ZWNfYmZkLCAmZXhlY19vcHMudG9fc2VjdGlvbnMsCisJCQkJJmV4ZWNfb3BzLnRvX3NlY3Rpb25zX2VuZCkpCisJeworCSAgLyogTWFrZSBzdXJlIHRvIGNsb3NlIGV4ZWNfYmZkLCBvciBlbHNlICJydW4iIG1pZ2h0IHRyeSB0byB1c2UKKwkgICAgIGl0LiAgKi8KKwkgIGV4ZWNfY2xvc2UgKDApOworCSAgZXJyb3IgKCJcIiVzXCI6IGNhbid0IGZpbmQgdGhlIGZpbGUgc2VjdGlvbnM6ICVzIiwgCisJCSBzY3JhdGNoX3BhdGhuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisJfQorCisgICAgICAvKiB0ZXh0X2VuZCBpcyBzb21ldGltZXMgdXNlZCBmb3Igd2hlcmUgdG8gcHV0IGNhbGwgZHVtbWllcy4gIEEKKwkgZmV3IHBvcnRzIHVzZSB0aGVzZSBmb3Igb3RoZXIgcHVycG9zZXMgdG9vLiAgKi8KKyAgICAgIGlmIChORUVEX1RFWFRfU1RBUlRfRU5EKQorCXsKKwkgIHN0cnVjdCBzZWN0aW9uX3RhYmxlICpwOworCSAgCisJICAvKiBTZXQgdGV4dF9zdGFydCB0byB0aGUgbG93ZXN0IGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIGFueQorCSAgICAgcmVhZG9ubHkgY29kZSBzZWN0aW9uIGFuZCBzZXQgdGV4dF9lbmQgdG8gdGhlIGhpZ2hlc3QKKwkgICAgIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiBhbnkgcmVhZG9ubHkgY29kZSBzZWN0aW9uLiAgKi8KKwkgIC8qIEZJWE1FOiBUaGUgY29tbWVudCBhYm92ZSBkb2VzIG5vdCBtYXRjaCB0aGUgY29kZS4gIFRoZQorCSAgICAgY29kZSBjaGVja3MgZm9yIHNlY3Rpb25zIHdpdGggYXJlIGVpdGhlciBjb2RlICpvcioKKwkgICAgIHJlYWRvbmx5LiAgKi8KKwkgIHRleHRfc3RhcnQgPSB+KENPUkVfQUREUikwOworCSAgdGV4dF9lbmQgPSAoQ09SRV9BRERSKTA7CisJICBmb3IgKHAgPSBleGVjX29wcy50b19zZWN0aW9uczsgcCA8IGV4ZWNfb3BzLnRvX3NlY3Rpb25zX2VuZDsgcCsrKQorCSAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChwLT5iZmQsIHAtPnRoZV9iZmRfc2VjdGlvbikKKwkJJiAoU0VDX0NPREUgfCBTRUNfUkVBRE9OTFkpKQorCSAgICAgIHsKKwkJaWYgKHRleHRfc3RhcnQgPiBwLT5hZGRyKSAKKwkJICB0ZXh0X3N0YXJ0ID0gcC0+YWRkcjsKKwkJaWYgKHRleHRfZW5kIDwgcC0+ZW5kYWRkcikKKwkJICB0ZXh0X2VuZCA9IHAtPmVuZGFkZHI7CisJICAgICAgfQorCX0KKworICAgICAgdmFsaWRhdGVfZmlsZXMgKCk7CisKKyAgICAgIHNldF9nZGJhcmNoX2Zyb21fZmlsZSAoZXhlY19iZmQpOworCisgICAgICBwdXNoX3RhcmdldCAoJmV4ZWNfb3BzKTsKKworICAgICAgLyogVGVsbCBkaXNwbGF5IGNvZGUgKGlmIGFueSkgYWJvdXQgdGhlIGNoYW5nZWQgZmlsZSBuYW1lLiAgKi8KKyAgICAgIGlmIChleGVjX2ZpbGVfZGlzcGxheV9ob29rKQorCSgqZXhlY19maWxlX2Rpc3BsYXlfaG9vaykgKGZpbGVuYW1lKTsKKyAgICB9CisgIGVsc2UgaWYgKGZyb21fdHR5KQorICAgIHByaW50Zl91bmZpbHRlcmVkICgiTm8gZXhlY3V0YWJsZSBmaWxlIG5vdy5cbiIpOworfQorCisvKiAgUHJvY2VzcyB0aGUgZmlyc3QgYXJnIGluIEFSR1MgYXMgdGhlIG5ldyBleGVjIGZpbGUuCisKKyAgICBOb3RlIHRoYXQgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGlnbm9yZSBhZGRpdGlvbmFsIGFyZ3MsIHNpbmNlIHdlIGNhbgorICAgIGJlIGNhbGxlZCBmcm9tIGZpbGVfY29tbWFuZCgpLCB3aGljaCBhbHNvIGNhbGxzIHN5bWJvbF9maWxlX2NvbW1hbmQoKQorICAgIHdoaWNoIGNhbiB0YWtlIG11bHRpcGxlIGFyZ3MuICovCisKK3ZvaWQKK2V4ZWNfZmlsZV9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjaGFyICoqYXJndjsKKyAgY2hhciAqZmlsZW5hbWU7CisKKyAgdGFyZ2V0X3ByZW9wZW4gKGZyb21fdHR5KTsKKworICBleGVjX2ZpbGVfYXR0YWNoIChhcmdzLCBmcm9tX3R0eSk7Cit9CisKKy8qIFNldCBib3RoIHRoZSBleGVjIGZpbGUgYW5kIHRoZSBzeW1ib2wgZmlsZSwgaW4gb25lIGNvbW1hbmQuICAKKyAgIFdoYXQgYSBub3ZlbHR5LiAgV2h5IGRpZCBHREIgZ28gdGhyb3VnaCBmb3VyIG1ham9yIHJlbGVhc2VzIGJlZm9yZSB0aGlzCisgICBjb21tYW5kIHdhcyBhZGRlZD8gICovCisKK3N0YXRpYyB2b2lkCitmaWxlX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICAvKiBGSVhNRSwgaWYgd2UgbG9zZSBvbiByZWFkaW5nIHRoZSBzeW1ib2wgZmlsZSwgd2Ugc2hvdWxkIHJldmVydAorICAgICB0aGUgZXhlYyBmaWxlLCBidXQgdGhhdCdzIHJvdWdoLiAgKi8KKyAgZXhlY19maWxlX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpOworICBzeW1ib2xfZmlsZV9jb21tYW5kIChhcmcsIGZyb21fdHR5KTsKKyAgaWYgKGZpbGVfY2hhbmdlZF9ob29rKQorICAgIGZpbGVfY2hhbmdlZF9ob29rIChhcmcpOworfQorCisMCisvKiBMb2NhdGUgYWxsIG1hcHBhYmxlIHNlY3Rpb25zIG9mIGEgQkZEIGZpbGUuIAorICAgdGFibGVfcHBfY2hhciBpcyBhIGNoYXIgKiB0byBnZXQgaXQgdGhyb3VnaCBiZmRfbWFwX292ZXJfc2VjdGlvbnM7CisgICB3ZSBjYXN0IGl0IGJhY2sgdG8gaXRzIHByb3BlciB0eXBlLiAgKi8KKworc3RhdGljIHZvaWQKK2FkZF90b19zZWN0aW9uX3RhYmxlIChhYmZkLCBhc2VjdCwgdGFibGVfcHBfY2hhcikKKyAgICAgYmZkICphYmZkOworICAgICBzZWNfcHRyIGFzZWN0OworICAgICBQVFIgdGFibGVfcHBfY2hhcjsKK3sKKyAgc3RydWN0IHNlY3Rpb25fdGFibGUgKip0YWJsZV9wcCA9IChzdHJ1Y3Qgc2VjdGlvbl90YWJsZSAqKil0YWJsZV9wcF9jaGFyOworICBmbGFnd29yZCBhZmxhZzsKKworICBhZmxhZyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgYXNlY3QpOworICBpZiAoIShhZmxhZyAmIFNFQ19BTExPQykpCisgICAgcmV0dXJuOworICBpZiAoMCA9PSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBhc2VjdCkpCisgICAgcmV0dXJuOworICAoKnRhYmxlX3BwKS0+YmZkID0gYWJmZDsKKyAgKCp0YWJsZV9wcCktPnRoZV9iZmRfc2VjdGlvbiA9IGFzZWN0OworICAoKnRhYmxlX3BwKS0+YWRkciA9IGJmZF9zZWN0aW9uX3ZtYSAoYWJmZCwgYXNlY3QpOworICAoKnRhYmxlX3BwKS0+ZW5kYWRkciA9ICgqdGFibGVfcHApLT5hZGRyICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgYXNlY3QpOworICAoKnRhYmxlX3BwKSsrOworfQorCisvKiBCdWlsZHMgYSBzZWN0aW9uIHRhYmxlLCBnaXZlbiBhcmdzIEJGRCwgU0VDVEFCTEVfUFRSLCBTRUNFTkRfUFRSLgorICAgUmV0dXJucyAwIGlmIE9LLCAxIG9uIGVycm9yLiAgKi8KKworaW50CitidWlsZF9zZWN0aW9uX3RhYmxlIChzb21lX2JmZCwgc3RhcnQsIGVuZCkKKyAgICAgYmZkICpzb21lX2JmZDsKKyAgICAgc3RydWN0IHNlY3Rpb25fdGFibGUgKipzdGFydCwgKiplbmQ7Cit7CisgIHVuc2lnbmVkIGNvdW50OworCisgIGNvdW50ID0gYmZkX2NvdW50X3NlY3Rpb25zIChzb21lX2JmZCk7CisgIGlmICgqc3RhcnQpCisgICAgZnJlZSAoKFBUUikqc3RhcnQpOworICAqc3RhcnQgPSAoc3RydWN0IHNlY3Rpb25fdGFibGUgKikgeG1hbGxvYyAoY291bnQgKiBzaXplb2YgKCoqc3RhcnQpKTsKKyAgKmVuZCA9ICpzdGFydDsKKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzb21lX2JmZCwgYWRkX3RvX3NlY3Rpb25fdGFibGUsIChjaGFyICopZW5kKTsKKyAgaWYgKCplbmQgPiAqc3RhcnQgKyBjb3VudCkKKyAgICBhYm9ydCgpOworICAvKiBXZSBjb3VsZCByZWFsbG9jIHRoZSB0YWJsZSwgYnV0IGl0IHByb2JhYmx5IGxvc2VzIGZvciBtb3N0IGZpbGVzLiAgKi8KKyAgcmV0dXJuIDA7Cit9CisMCitzdGF0aWMgdm9pZAorYmZkc2VjX3RvX3ZtYXAoYWJmZCwgc2VjdCwgYXJnMykgCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VjX3B0ciBzZWN0OworICAgICBQVFIgYXJnMzsKK3sKKyAgc3RydWN0IHZtYXBfYW5kX2JmZCAqdm1hcF9iZmQgPSAoc3RydWN0IHZtYXBfYW5kX2JmZCAqKSBhcmczOworICBzdHJ1Y3Qgdm1hcCAqdnA7CisKKyAgdnAgPSB2bWFwX2JmZC0+cHZtYXA7CisKKyAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3QpICYgU0VDX0xPQUQpID09IDApCisgICAgcmV0dXJuOworCisgIGlmIChTVFJFUSAoYmZkX3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjdCksICIudGV4dCIpKQorICAgIHsKKyAgICAgIHZwLT50c3RhcnQgPSBiZmRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3QpOworICAgICAgdnAtPnRlbmQgPSB2cC0+dHN0YXJ0ICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdCk7CisgICAgICB2cC0+dHZtYSA9IGJmZF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdCk7CisgICAgICB2cC0+dG9mZnMgPSBzZWN0LT5maWxlcG9zOworICAgIH0KKyAgZWxzZSBpZiAoU1RSRVEgKGJmZF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlY3QpLCAiLmRhdGEiKSkKKyAgICB7CisgICAgICB2cC0+ZHN0YXJ0ID0gYmZkX3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0KTsKKyAgICAgIHZwLT5kZW5kID0gdnAtPmRzdGFydCArIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3QpOworICAgICAgdnAtPmR2bWEgPSBiZmRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3QpOworICAgIH0KKyAgLyogU2lsZW50bHkgaWdub3JlIG90aGVyIHR5cGVzIG9mIHNlY3Rpb25zLiAoRklYTUU/KSAgKi8KK30KKworLyogTWFrZSBhIHZtYXAgZm9yIEFCRkQgd2hpY2ggbWlnaHQgYmUgYSBtZW1iZXIgb2YgdGhlIGFyY2hpdmUgQVJDSC4KKyAgIFJldHVybiB0aGUgbmV3IHZtYXAuICAqLworCitzdHJ1Y3Qgdm1hcCAqCittYXBfdm1hcCAoYWJmZCwgYXJjaCkKKyAgICAgYmZkICphYmZkOworICAgICBiZmQgKmFyY2g7Cit7CisgIHN0cnVjdCB2bWFwX2FuZF9iZmQgdm1hcF9iZmQ7CisgIHN0cnVjdCB2bWFwICp2cCwgKip2cHA7CisKKyAgdnAgPSAoc3RydWN0IHZtYXAgKikgeG1hbGxvYyAoc2l6ZW9mICgqdnApKTsKKyAgbWVtc2V0ICgoY2hhciAqKSB2cCwgJ1wwJywgc2l6ZW9mICgqdnApKTsKKyAgdnAtPm54dCA9IDA7CisgIHZwLT5iZmQgPSBhYmZkOworICB2cC0+bmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFyY2ggPyBhcmNoIDogYWJmZCk7CisgIHZwLT5tZW1iZXIgPSBhcmNoID8gYmZkX2dldF9maWxlbmFtZSAoYWJmZCkgOiAiIjsKKyAgCisgIHZtYXBfYmZkLnBiZmQgPSBhcmNoOworICB2bWFwX2JmZC5wdm1hcCA9IHZwOworICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIGJmZHNlY190b192bWFwLCAmdm1hcF9iZmQpOworCisgIC8qIEZpbmQgdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQgYXBwZW5kLiAqLworICBmb3IgKHZwcCA9ICZ2bWFwOyAqdnBwOyB2cHAgPSAmKCp2cHApLT5ueHQpCisgICAgOworICAqdnBwID0gdnA7CisKKyAgcmV0dXJuIHZwOworfQorDAorLyogUmVhZCBvciB3cml0ZSB0aGUgZXhlYyBmaWxlLgorCisgICBBcmdzIGFyZSBhZGRyZXNzIHdpdGhpbiBhIEJGRCBmaWxlLCBhZGRyZXNzIHdpdGhpbiBnZGIgYWRkcmVzcy1zcGFjZSwKKyAgIGxlbmd0aCwgYW5kIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gcmVhZCBvciB3cml0ZS4KKworICAgUmVzdWx0IGlzIGEgbGVuZ3RoOgorCisJMDogICAgV2UgY2Fubm90IGhhbmRsZSB0aGlzIGFkZHJlc3MgYW5kIGxlbmd0aC4KKwk+IDA6ICBXZSBoYXZlIGhhbmRsZWQgTiBieXRlcyBzdGFydGluZyBhdCB0aGlzIGFkZHJlc3MuCisJICAgICAgKElmIE4gPT0gbGVuZ3RoLCB3ZSBkaWQgaXQgYWxsLikgIFdlIG1pZ2h0IGJlIGFibGUKKwkgICAgICB0byBoYW5kbGUgbW9yZSBieXRlcyBiZXlvbmQgdGhpcyBsZW5ndGgsIGJ1dCBubworCSAgICAgIHByb21pc2VzLgorCTwgMDogIFdlIGNhbm5vdCBoYW5kbGUgdGhpcyBhZGRyZXNzLCBidXQgaWYgc29tZWJvZHkKKwkgICAgICBlbHNlIGhhbmRsZXMgKC1OKSBieXRlcywgd2UgY2FuIHN0YXJ0IGZyb20gdGhlcmUuCisKKyAgICBUaGUgc2FtZSByb3V0aW5lIGlzIHVzZWQgdG8gaGFuZGxlIGJvdGggY29yZSBhbmQgZXhlYyBmaWxlczsKKyAgICB3ZSBqdXN0IHRhaWwtY2FsbCBpdCB3aXRoIG1vcmUgYXJndW1lbnRzIHRvIHNlbGVjdCBiZXR3ZWVuIHRoZW0uICAqLworCitpbnQKK3hmZXJfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbiwgd3JpdGUsIHRhcmdldCkKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IHdyaXRlOworICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0OworeworICBib29sZWFuIHJlczsKKyAgc3RydWN0IHNlY3Rpb25fdGFibGUgKnA7CisgIENPUkVfQUREUiBuZXh0c2VjdGFkZHIsIG1lbWVuZDsKKyAgYm9vbGVhbiAoKnhmZXJfZm4pIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7CisgIGFzZWN0aW9uICpzZWN0aW9uOworCisgIGlmIChsZW4gPD0gMCkKKyAgICBhYm9ydCgpOworCisgIGlmIChvdmVybGF5X2RlYnVnZ2luZykKKyAgICB7CisgICAgICBzZWN0aW9uID0gZmluZF9wY19vdmVybGF5IChtZW1hZGRyKTsKKyAgICAgIGlmIChwY19pbl91bm1hcHBlZF9yYW5nZSAobWVtYWRkciwgc2VjdGlvbikpCisJbWVtYWRkciA9IG92ZXJsYXlfbWFwcGVkX2FkZHJlc3MgKG1lbWFkZHIsIHNlY3Rpb24pOworICAgIH0KKworICBtZW1lbmQgPSBtZW1hZGRyICsgbGVuOworICB4ZmVyX2ZuID0gd3JpdGUgPyBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgOiBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHM7CisgIG5leHRzZWN0YWRkciA9IG1lbWVuZDsKKworI2lmIDAgLyogU3R1J3MgaW1wbGVtZW50YXRpb24gKi8KKy8qIElmIGEgc2VjdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQsIHRyeSB0byB1c2UgaXQuICBOb3RlIHRoYXQgd2UgY2Fubm90IHVzZSB0aGUKKyAgIHNwZWNpZmllZCBzZWN0aW9uIGRpcmVjdGx5LiAgVGhpcyBpcyBiZWNhdXNlIGl0IHVzdWFsbHkgY29tZXMgZnJvbSB0aGUKKyAgIHN5bWJvbCBmaWxlLCB3aGljaCBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGV4ZWMgb3IgY29yZSBmaWxlLiAgSW5zdGVhZCwgd2UKKyAgIGhhdmUgdG8gbG9va3VwIHRoZSBzcGVjaWZpZWQgc2VjdGlvbiBieSBuYW1lIGluIHRoZSBiZmQgYXNzb2NpYXRlZCB3aXRoCisgICB0b19zZWN0aW9ucy4gICovCisKKyAgaWYgKHRhcmdldF9tZW1vcnlfYmZkX3NlY3Rpb24pCisgICAgeworICAgICAgYXNlY3Rpb24gKnM7CisgICAgICBiZmQgKmFiZmQ7CisgICAgICBhc2VjdGlvbiAqdGFyZ2V0X3NlY3Rpb247CisgICAgICBiZmQgKnRhcmdldF9iZmQ7CisKKyAgICAgIHMgPSB0YXJnZXRfbWVtb3J5X2JmZF9zZWN0aW9uOworICAgICAgYWJmZCA9IHMtPm93bmVyOworCisgICAgICB0YXJnZXRfYmZkID0gdGFyZ2V0LT50b19zZWN0aW9ucy0+YmZkOworICAgICAgdGFyZ2V0X3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAodGFyZ2V0X2JmZCwgYmZkX3NlY3Rpb25fbmFtZSAoYWJmZCwgcykpOworCisgICAgICBpZiAodGFyZ2V0X3NlY3Rpb24pCisJeworCSAgYmZkX3ZtYSBzZWNfYWRkcjsKKwkgIGJmZF9zaXplX3R5cGUgc2VjX3NpemU7CisKKwkgIHNlY19hZGRyID0gYmZkX3NlY3Rpb25fdm1hICh0YXJnZXRfYmZkLCB0YXJnZXRfc2VjdGlvbik7CisJICBzZWNfc2l6ZSA9IHRhcmdldF9zZWN0aW9uLT5fcmF3X3NpemU7CisKKwkgIC8qIE1ha2Ugc3VyZSB0aGUgcmVxdWVzdGVkIG1lbW9yeSBzdGFydHMgaW5zaWRlIHRoZSBzZWN0aW9uLiAgKi8KKworCSAgaWYgKG1lbWFkZHIgPj0gc2VjX2FkZHIKKwkgICAgICAmJiBtZW1hZGRyIDwgc2VjX2FkZHIgKyBzZWNfc2l6ZSkKKwkgICAgeworCSAgICAgIC8qIEN1dCBiYWNrIGxlbmd0aCBpbiBjYXNlIHJlcXVlc3Qgb3ZlcmZsb3dzIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24uICovCisJICAgICAgbGVuID0gbWluIChsZW4sIHNlY19hZGRyICsgc2VjX3NpemUgLSBtZW1hZGRyKTsKKworCSAgICAgIHJlcyA9IHhmZXJfZm4gKHRhcmdldF9iZmQsIHRhcmdldF9zZWN0aW9uLCBteWFkZHIsIG1lbWFkZHIgLSBzZWNfYWRkciwgbGVuKTsKKworCSAgICAgIHJldHVybiByZXMgPyBsZW4gOiAwOworCSAgICB9CisJfQorICAgIH0KKyNlbmRpZiAvKiAwLCBTdHUncyBpbXBsZW1lbnRhdGlvbiAqLworICBmb3IgKHAgPSB0YXJnZXQtPnRvX3NlY3Rpb25zOyBwIDwgdGFyZ2V0LT50b19zZWN0aW9uc19lbmQ7IHArKykKKyAgICB7CisgICAgICBpZiAob3ZlcmxheV9kZWJ1Z2dpbmcgJiYgc2VjdGlvbiAmJiBwLT50aGVfYmZkX3NlY3Rpb24gJiYKKwkgIHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgcC0+dGhlX2JmZF9zZWN0aW9uLT5uYW1lKSAhPSAwKQorCWNvbnRpbnVlOwkvKiBub3QgdGhlIHNlY3Rpb24gd2UgbmVlZCAqLworICAgICAgaWYgKG1lbWFkZHIgPj0gcC0+YWRkcikKKyAJaWYgKG1lbWVuZCA8PSBwLT5lbmRhZGRyKQorCSAgeworCSAgICAvKiBFbnRpcmUgdHJhbnNmZXIgaXMgd2l0aGluIHRoaXMgc2VjdGlvbi4gICovCisJICAgIHJlcyA9IHhmZXJfZm4gKHAtPmJmZCwgcC0+dGhlX2JmZF9zZWN0aW9uLCBteWFkZHIsCisJCQkgICBtZW1hZGRyIC0gcC0+YWRkciwgbGVuKTsKKwkgICAgcmV0dXJuIChyZXMgIT0gMCkgPyBsZW4gOiAwOworCSAgfQorCWVsc2UgaWYgKG1lbWFkZHIgPj0gcC0+ZW5kYWRkcikKKwkgIHsKKwkgICAgLyogVGhpcyBzZWN0aW9uIGVuZHMgYmVmb3JlIHRoZSB0cmFuc2ZlciBzdGFydHMuICAqLworCSAgICBjb250aW51ZTsKKwkgIH0KKwllbHNlIAorCSAgeworCSAgICAvKiBUaGlzIHNlY3Rpb24gb3ZlcmxhcHMgdGhlIHRyYW5zZmVyLiAgSnVzdCBkbyBoYWxmLiAgKi8KKwkgICAgbGVuID0gcC0+ZW5kYWRkciAtIG1lbWFkZHI7CisJICAgIHJlcyA9IHhmZXJfZm4gKHAtPmJmZCwgcC0+dGhlX2JmZF9zZWN0aW9uLCBteWFkZHIsCisJCQkgICBtZW1hZGRyIC0gcC0+YWRkciwgbGVuKTsKKwkgICAgcmV0dXJuIChyZXMgIT0gMCkgPyBsZW4gOiAwOworCSAgfQorICAgICAgZWxzZQorCW5leHRzZWN0YWRkciA9IG1pbiAobmV4dHNlY3RhZGRyLCBwLT5hZGRyKTsKKyAgICB9CisKKyAgaWYgKG5leHRzZWN0YWRkciA+PSBtZW1lbmQpCisgICAgcmV0dXJuIDA7CQkJCS8qIFdlIGNhbid0IGhlbHAgKi8KKyAgZWxzZQorICAgIHJldHVybiAtIChuZXh0c2VjdGFkZHIgLSBtZW1hZGRyKTsJLyogTmV4dCBib3VuZGFyeSB3aGVyZSB3ZSBjYW4gaGVscCAqLworfQorCisjaWZkZWYgRklYTUUKKyNpZmRlZiBSRUdfU1RBQ0tfU0VHTUVOVAorLyogTU9WRSBUTyBCRkQuLi4gKi8KKyAgICAvKiBQeXJhbWlkcyBhbmQgQU0yOTAwMHMgaGF2ZSBhbiBleHRyYSBzZWdtZW50IGluIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UKKyAgICAgICBmb3IgdGhlIChjb250cm9sKSBzdGFjayBvZiByZWdpc3Rlci13aW5kb3cgZnJhbWVzLiAgVGhlIEFNMjkwMDAgZm9saworICAgICAgIGNhbGwgaXQgdGhlICJyZWdpc3RlciBzdGFjayIgcmF0aGVyIHRoYW4gdGhlICJtZW1vcnkgc3RhY2siLiAgKi8KKyAgICBlbHNlIGlmIChtZW1hZGRyID49IHJlZ19zdGFja19zdGFydCAmJiBtZW1hZGRyIDwgcmVnX3N0YWNrX2VuZCkKKyAgICAgIHsKKwlpID0gbWluIChsZW4sIHJlZ19zdGFja19lbmQgLSBtZW1hZGRyKTsKKwlmaWxlcHRyID0gbWVtYWRkciAtIHJlZ19zdGFja19zdGFydCArIHJlZ19zdGFja19vZmZzZXQ7CisJd2FubmFfeGZlciA9IGNvcmVkYXRhOworICAgICAgfQorI2VuZGlmCQkJCS8qIFJFR19TVEFDS19TRUdNRU5UICovCisjZW5kaWYgLyogRklYTUUgKi8KKwwKK3ZvaWQKK3ByaW50X3NlY3Rpb25faW5mbyAodCwgYWJmZCkKKyAgc3RydWN0IHRhcmdldF9vcHMgKnQ7CisgIGJmZCAqYWJmZDsKK3sKKyAgc3RydWN0IHNlY3Rpb25fdGFibGUgKnA7CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXHRgJXMnLCAiLCBiZmRfZ2V0X2ZpbGVuYW1lKGFiZmQpKTsKKyAgd3JhcF9oZXJlICgiICAgICAgICAiKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiZmlsZSB0eXBlICVzLlxuIiwgYmZkX2dldF90YXJnZXQoYWJmZCkpOworICBpZiAoYWJmZCA9PSBleGVjX2JmZCkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJcdEVudHJ5IHBvaW50OiAiKTsKKyAgICAgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSwgMSwgZ2RiX3N0ZG91dCk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICAgIH0KKyAgZm9yIChwID0gdC0+dG9fc2VjdGlvbnM7IHAgPCB0LT50b19zZWN0aW9uc19lbmQ7IHArKykKKyAgICB7CisgICAgICAvKiBGSVhNRS0zMng2NCBuZWVkIGEgcHJpbnRfYWRkcmVzc19udW1lcmljIHdpdGggZmllbGQgd2lkdGggKi8KKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlx0JXMiLCBsb2NhbF9oZXhfc3RyaW5nX2N1c3RvbSAoKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHIsICIwOGwiKSk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIgLSAlcyIsIGxvY2FsX2hleF9zdHJpbmdfY3VzdG9tICgodW5zaWduZWQgbG9uZykgcC0+ZW5kYWRkciwgIjA4bCIpKTsKKyAgICAgIGlmIChpbmZvX3ZlcmJvc2UpCisJcHJpbnRmX2ZpbHRlcmVkICgiIEAgJXMiLAorCQkJIGxvY2FsX2hleF9zdHJpbmdfY3VzdG9tICgodW5zaWduZWQgbG9uZykgcC0+dGhlX2JmZF9zZWN0aW9uLT5maWxlcG9zLCAiMDhsIikpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiIGlzICVzIiwgYmZkX3NlY3Rpb25fbmFtZSAocC0+YmZkLCBwLT50aGVfYmZkX3NlY3Rpb24pKTsKKyAgICAgIGlmIChwLT5iZmQgIT0gYWJmZCkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCIgaW4gJXMiLCBiZmRfZ2V0X2ZpbGVuYW1lIChwLT5iZmQpKTsKKwl9CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2V4ZWNfZmlsZXNfaW5mbyAodCkKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKnQ7Cit7CisgIHByaW50X3NlY3Rpb25faW5mbyAodCwgZXhlY19iZmQpOworCisgIGlmICh2bWFwKQorICAgIHsKKyAgICAgIHN0cnVjdCB2bWFwICp2cDsKKworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcdE1hcHBpbmcgaW5mbyBmb3IgZmlsZSBgJXMnLlxuIiwgdm1hcC0+bmFtZSk7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIlx0ICAlOC44cyAgICU4LjhzICAgJTguOHMgICAlOC44cyAlOC44cyAlc1xuIiwKKwkJICAgICAgICJ0c3RhcnQiLCAidGVuZCIsICJkc3RhcnQiLCAiZGVuZCIsICJzZWN0aW9uIiwKKwkJICAgICAgICJmaWxlKG1lbWJlcikiKTsKKworICAgIGZvciAodnAgPSB2bWFwOyB2cDsgdnAgPSB2cC0+bnh0KQorICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcdDB4JTguOHggMHglOC44eCAweCU4Ljh4IDB4JTguOHggJXMlcyVzJXNcbiIsCisJCQkgdnAtPnRzdGFydCwgdnAtPnRlbmQsIHZwLT5kc3RhcnQsIHZwLT5kZW5kLCB2cC0+bmFtZSwKKwkJCSAqdnAtPm1lbWJlciA/ICIoIiA6ICIiLCB2cC0+bWVtYmVyLAorCQkJICp2cC0+bWVtYmVyID8gIikiIDogIiIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3NldF9zZWN0aW9uX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCBzZWN0aW9uX3RhYmxlICpwOworICBjaGFyICpzZWNuYW1lOworICB1bnNpZ25lZCBzZWNsZW47CisgIHVuc2lnbmVkIGxvbmcgc2VjYWRkcjsKKyAgY2hhciBzZWNwcmludFsxMDBdOworICBsb25nIG9mZnNldDsKKworICBpZiAoYXJncyA9PSAwKQorICAgIGVycm9yICgiTXVzdCBzcGVjaWZ5IHNlY3Rpb24gbmFtZSBhbmQgaXRzIHZpcnR1YWwgYWRkcmVzcyIpOworCisgIC8qIFBhcnNlIG91dCBzZWN0aW9uIG5hbWUgKi8KKyAgZm9yIChzZWNuYW1lID0gYXJnczsgIWlzc3BhY2UoKmFyZ3MpOyBhcmdzKyspIDsKKyAgc2VjbGVuID0gYXJncyAtIHNlY25hbWU7CisKKyAgLyogUGFyc2Ugb3V0IG5ldyB2aXJ0dWFsIGFkZHJlc3MgKi8KKyAgc2VjYWRkciA9IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgKGFyZ3MpOworCisgIGZvciAocCA9IGV4ZWNfb3BzLnRvX3NlY3Rpb25zOyBwIDwgZXhlY19vcHMudG9fc2VjdGlvbnNfZW5kOyBwKyspIHsKKyAgICBpZiAoIXN0cm5jbXAgKHNlY25hbWUsIGJmZF9zZWN0aW9uX25hbWUgKGV4ZWNfYmZkLCBwLT50aGVfYmZkX3NlY3Rpb24pLCBzZWNsZW4pCisJJiYgYmZkX3NlY3Rpb25fbmFtZSAoZXhlY19iZmQsIHAtPnRoZV9iZmRfc2VjdGlvbilbc2VjbGVuXSA9PSAnXDAnKSB7CisgICAgICBvZmZzZXQgPSBzZWNhZGRyIC0gcC0+YWRkcjsKKyAgICAgIHAtPmFkZHIgKz0gb2Zmc2V0OworICAgICAgcC0+ZW5kYWRkciArPSBvZmZzZXQ7CisgICAgICBpZiAoZnJvbV90dHkpCisJZXhlY19maWxlc19pbmZvKCZleGVjX29wcyk7CisgICAgICByZXR1cm47CisgICAgfQorICB9IAorICBpZiAoc2VjbGVuID49IHNpemVvZiAoc2VjcHJpbnQpKQorICAgIHNlY2xlbiA9IHNpemVvZiAoc2VjcHJpbnQpIC0gMTsKKyAgc3RybmNweSAoc2VjcHJpbnQsIHNlY25hbWUsIHNlY2xlbik7CisgIHNlY3ByaW50W3NlY2xlbl0gPSAnXDAnOworICBlcnJvciAoIlNlY3Rpb24gJXMgbm90IGZvdW5kIiwgc2VjcHJpbnQpOworfQorCisvKiBJZiBtb3VybiBpcyBiZWluZyBjYWxsZWQgaW4gYWxsIHRoZSByaWdodCBwbGFjZXMsIHRoaXMgY291bGQgYmUgc2F5CisgICBgZ2RiIGludGVybmFsIGVycm9yJyAoc2luY2UgZ2VuZXJpY19tb3VybiBjYWxscworICAgYnJlYWtwb2ludF9pbml0X2luZmVyaW9yKS4gICovCisKK3N0YXRpYyBpbnQKK2lnbm9yZSAoYWRkciwgY29udGVudHMpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpjb250ZW50czsKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEZpbGwgaW4gdGhlIGV4ZWMgZmlsZSB0YXJnZXQgdmVjdG9yLiAgVmVyeSBmZXcgZW50cmllcyBuZWVkIHRvIGJlCisgICBkZWZpbmVkLiAgKi8KKwordm9pZAoraW5pdF9leGVjX29wcyAoKQoreworICBleGVjX29wcy50b19zaG9ydG5hbWUgPSAiZXhlYyI7CisgIGV4ZWNfb3BzLnRvX2xvbmduYW1lID0gIkxvY2FsIGV4ZWMgZmlsZSI7CisgIGV4ZWNfb3BzLnRvX2RvYyA9ICJVc2UgYW4gZXhlY3V0YWJsZSBmaWxlIGFzIGEgdGFyZ2V0LlxuXAorU3BlY2lmeSB0aGUgZmlsZW5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgZmlsZS4iOworICBleGVjX29wcy50b19vcGVuID0gZXhlY19maWxlX2NvbW1hbmQ7CisgIGV4ZWNfb3BzLnRvX2Nsb3NlID0gZXhlY19jbG9zZTsKKyAgZXhlY19vcHMudG9fYXR0YWNoID0gZmluZF9kZWZhdWx0X2F0dGFjaDsKKyAgZXhlY19vcHMudG9fcmVxdWlyZV9hdHRhY2ggPSBmaW5kX2RlZmF1bHRfcmVxdWlyZV9hdHRhY2g7CisgIGV4ZWNfb3BzLnRvX3JlcXVpcmVfZGV0YWNoID0gZmluZF9kZWZhdWx0X3JlcXVpcmVfZGV0YWNoOworICBleGVjX29wcy50b194ZmVyX21lbW9yeSA9IHhmZXJfbWVtb3J5OworICBleGVjX29wcy50b19maWxlc19pbmZvID0gZXhlY19maWxlc19pbmZvOworICBleGVjX29wcy50b19pbnNlcnRfYnJlYWtwb2ludCA9IGlnbm9yZTsKKyAgZXhlY19vcHMudG9fcmVtb3ZlX2JyZWFrcG9pbnQgPSBpZ25vcmU7CisgIGV4ZWNfb3BzLnRvX2NyZWF0ZV9pbmZlcmlvciA9IGZpbmRfZGVmYXVsdF9jcmVhdGVfaW5mZXJpb3I7CisgIGV4ZWNfb3BzLnRvX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IgPSBmaW5kX2RlZmF1bHRfY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvcjsKKyAgZXhlY19vcHMudG9fc3RyYXR1bSA9IGZpbGVfc3RyYXR1bTsKKyAgZXhlY19vcHMudG9faGFzX21lbW9yeSA9IDE7CisgIGV4ZWNfb3BzLnRvX21hZ2ljID0gT1BTX01BR0lDOwkKK30KKwordm9pZAorX2luaXRpYWxpemVfZXhlYyAoKQoreworICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqYzsKKworICBpbml0X2V4ZWNfb3BzICgpOworCisgIGlmICghZGJ4X2NvbW1hbmRzKQorICAgIHsKKyAgICAgIGMgPSBhZGRfY21kICgiZmlsZSIsIGNsYXNzX2ZpbGVzLCBmaWxlX2NvbW1hbmQsCisJCSAgICJVc2UgRklMRSBhcyBwcm9ncmFtIHRvIGJlIGRlYnVnZ2VkLlxuXAorSXQgaXMgcmVhZCBmb3IgaXRzIHN5bWJvbHMsIGZvciBnZXR0aW5nIHRoZSBjb250ZW50cyBvZiBwdXJlIG1lbW9yeSxcblwKK2FuZCBpdCBpcyB0aGUgcHJvZ3JhbSBleGVjdXRlZCB3aGVuIHlvdSB1c2UgdGhlIGBydW4nIGNvbW1hbmQuXG5cCitJZiBGSUxFIGNhbm5vdCBiZSBmb3VuZCBhcyBzcGVjaWZpZWQsIHlvdXIgZXhlY3V0aW9uIGRpcmVjdG9yeSBwYXRoXG5cCisoJFBBVEgpIGlzIHNlYXJjaGVkIGZvciBhIGNvbW1hbmQgb2YgdGhhdCBuYW1lLlxuXAorTm8gYXJnIG1lYW5zIHRvIGhhdmUgbm8gZXhlY3V0YWJsZSBmaWxlIGFuZCBubyBzeW1ib2xzLiIsICZjbWRsaXN0KTsKKyAgICAgIGMtPmNvbXBsZXRlciA9IGZpbGVuYW1lX2NvbXBsZXRlcjsKKyAgICB9CisKKyAgYyA9IGFkZF9jbWQgKCJleGVjLWZpbGUiLCBjbGFzc19maWxlcywgZXhlY19maWxlX2NvbW1hbmQsCisJICAgIlVzZSBGSUxFIGFzIHByb2dyYW0gZm9yIGdldHRpbmcgY29udGVudHMgb2YgcHVyZSBtZW1vcnkuXG5cCitJZiBGSUxFIGNhbm5vdCBiZSBmb3VuZCBhcyBzcGVjaWZpZWQsIHlvdXIgZXhlY3V0aW9uIGRpcmVjdG9yeSBwYXRoXG5cCitpcyBzZWFyY2hlZCBmb3IgYSBjb21tYW5kIG9mIHRoYXQgbmFtZS5cblwKK05vIGFyZyBtZWFucyBoYXZlIG5vIGV4ZWN1dGFibGUgZmlsZS4iLCAmY21kbGlzdCk7CisgIGMtPmNvbXBsZXRlciA9IGZpbGVuYW1lX2NvbXBsZXRlcjsKKworICBhZGRfY29tICgic2VjdGlvbiIsIGNsYXNzX2ZpbGVzLCBzZXRfc2VjdGlvbl9jb21tYW5kLAorICAgIkNoYW5nZSB0aGUgYmFzZSBhZGRyZXNzIG9mIHNlY3Rpb24gU0VDVElPTiBvZiB0aGUgZXhlYyBmaWxlIHRvIEFERFIuXG5cCitUaGlzIGNhbiBiZSB1c2VkIGlmIHRoZSBleGVjIGZpbGUgZG9lcyBub3QgY29udGFpbiBzZWN0aW9uIGFkZHJlc3NlcyxcblwKKyhzdWNoIGFzIGluIHRoZSBhLm91dCBmb3JtYXQpLCBvciB3aGVuIHRoZSBhZGRyZXNzZXMgc3BlY2lmaWVkIGluIHRoZVxuXAorZmlsZSBpdHNlbGYgYXJlIHdyb25nLiAgRWFjaCBzZWN0aW9uIG11c3QgYmUgY2hhbmdlZCBzZXBhcmF0ZWx5LiAgVGhlXG5cCitgYGluZm8gZmlsZXMnJyBjb21tYW5kIGxpc3RzIGFsbCB0aGUgc2VjdGlvbnMgYW5kIHRoZWlyIGFkZHJlc3Nlcy4iKTsKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoIndyaXRlIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sIChjaGFyICopJndyaXRlX2ZpbGVzLAorCQkgICJTZXQgd3JpdGluZyBpbnRvIGV4ZWN1dGFibGUgYW5kIGNvcmUgZmlsZXMuIiwKKwkJICAmc2V0bGlzdCksCisgICAgICZzaG93bGlzdCk7CisgIAorICBhZGRfdGFyZ2V0ICgmZXhlY19vcHMpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2V4cHByaW50LmMgYi9nZGIvZXhwcHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzk5MTlhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2V4cHByaW50LmMKQEAgLTAsMCArMSw5MDMgQEAKKy8qIFByaW50IGluIGluZml4IGZvcm0gYSBzdHJ1Y3QgZXhwcmVzc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJwYXJzZXItZGVmcy5oIgorCisjaWZkZWYgSEFWRV9DVFlQRV9ICisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNlbmRpZgorCisvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMgKi8KKworc3RhdGljIHZvaWQKK3ByaW50X3N1YmV4cCBQQVJBTVMgKChzdHJ1Y3QgZXhwcmVzc2lvbiAqLCBpbnQgKiwgR0RCX0ZJTEUgKiwgZW51bSBwcmVjZWRlbmNlKSk7CisKK3ZvaWQKK3ByaW50X2V4cHJlc3Npb24gKGV4cCwgc3RyZWFtKQorICAgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwOworICAgICBHREJfRklMRSAqc3RyZWFtOworeworICBpbnQgcGMgPSAwOworICBwcmludF9zdWJleHAgKGV4cCwgJnBjLCBzdHJlYW0sIFBSRUNfTlVMTCk7Cit9CisKKy8qIFByaW50IHRoZSBzdWJleHByZXNzaW9uIG9mIEVYUCB0aGF0IHN0YXJ0cyBpbiBwb3NpdGlvbiBQT1MsIG9uIFNUUkVBTS4KKyAgIFBSRUMgaXMgdGhlIHByZWNlZGVuY2Ugb2YgdGhlIHN1cnJvdW5kaW5nIG9wZXJhdG9yOworICAgaWYgdGhlIHByZWNlZGVuY2Ugb2YgdGhlIG1haW4gb3BlcmF0b3Igb2YgdGhpcyBzdWJleHByZXNzaW9uIGlzIGxlc3MsCisgICBwYXJlbnRoZXNlcyBhcmUgbmVlZGVkIGhlcmUuICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfc3ViZXhwIChleHAsIHBvcywgc3RyZWFtLCBwcmVjKQorICAgICByZWdpc3RlciBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwOworICAgICByZWdpc3RlciBpbnQgKnBvczsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgZW51bSBwcmVjZWRlbmNlIHByZWM7Cit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIHRlbTsKKyAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG9wX3ByaW50ICpvcF9wcmludF90YWI7CisgIHJlZ2lzdGVyIGludCBwYzsKKyAgdW5zaWduZWQgbmFyZ3M7CisgIHJlZ2lzdGVyIGNoYXIgKm9wX3N0cjsKKyAgaW50IGFzc2lnbl9tb2RpZnkgPSAwOworICBlbnVtIGV4cF9vcGNvZGUgb3Bjb2RlOworICBlbnVtIHByZWNlZGVuY2UgbXlwcmVjID0gUFJFQ19OVUxMOworICAvKiBTZXQgdG8gMSBmb3IgYSByaWdodC1hc3NvY2lhdGl2ZSBvcGVyYXRvci4gICovCisgIGludCBhc3NvYyA9IDA7CisgIHZhbHVlX3B0ciB2YWw7CisgIGNoYXIgKnRlbXBzdHIgPSBOVUxMOworCisgIG9wX3ByaW50X3RhYiA9IGV4cC0+bGFuZ3VhZ2VfZGVmbi0+bGFfb3BfcHJpbnRfdGFiOworICBwYyA9ICgqcG9zKSsrOworICBvcGNvZGUgPSBleHAtPmVsdHNbcGNdLm9wY29kZTsKKyAgc3dpdGNoIChvcGNvZGUpCisgICAgeworICAgIC8qIENvbW1vbiBvcHMgKi8KKworICAgIGNhc2UgT1BfU0NPUEU6CisgICAgICBteXByZWMgPSBQUkVDX1BSRUZJWDsKKyAgICAgIGFzc29jID0gMDsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICh0eXBlX25hbWVfbm9fdGFnIChleHAtPmVsdHNbcGMgKyAxXS50eXBlKSwgc3RyZWFtKTsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiOjoiLCBzdHJlYW0pOworICAgICAgbmFyZ3MgPSBsb25nZXN0X3RvX2ludCAoZXhwLT5lbHRzW3BjICsgMl0ubG9uZ2NvbnN0KTsKKyAgICAgICgqcG9zKSArPSA0ICsgQllURVNfVE9fRVhQX0VMRU0gKG5hcmdzICsgMSk7CisgICAgICBmcHV0c19maWx0ZXJlZCAoJmV4cC0+ZWx0c1twYyArIDNdLnN0cmluZywgc3RyZWFtKTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgT1BfTE9ORzoKKyAgICAgICgqcG9zKSArPSAzOworICAgICAgdmFsdWVfcHJpbnQgKHZhbHVlX2Zyb21fbG9uZ2VzdCAoZXhwLT5lbHRzW3BjICsgMV0udHlwZSwKKwkJCQkgICAgICAgZXhwLT5lbHRzW3BjICsgMl0ubG9uZ2NvbnN0KSwKKwkJICAgc3RyZWFtLCAwLCBWYWxfbm9fcHJldHR5cHJpbnQpOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBPUF9ET1VCTEU6CisgICAgICAoKnBvcykgKz0gMzsKKyAgICAgIHZhbHVlX3ByaW50ICh2YWx1ZV9mcm9tX2RvdWJsZSAoZXhwLT5lbHRzW3BjICsgMV0udHlwZSwKKwkJCQkgICAgICBleHAtPmVsdHNbcGMgKyAyXS5kb3VibGVjb25zdCksCisJCSAgIHN0cmVhbSwgMCwgVmFsX25vX3ByZXR0eXByaW50KTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgT1BfVkFSX1ZBTFVFOgorICAgICAgeworCXN0cnVjdCBibG9jayAqYjsKKwkoKnBvcykgKz0gMzsKKwliID0gZXhwLT5lbHRzW3BjICsgMV0uYmxvY2s7CisJaWYgKGIgIT0gTlVMTAorCSAgICAmJiBCTE9DS19GVU5DVElPTiAoYikgIT0gTlVMTAorCSAgICAmJiBTWU1CT0xfU09VUkNFX05BTUUgKEJMT0NLX0ZVTkNUSU9OIChiKSkgIT0gTlVMTCkKKwkgIHsKKwkgICAgZnB1dHNfZmlsdGVyZWQgKFNZTUJPTF9TT1VSQ0VfTkFNRSAoQkxPQ0tfRlVOQ1RJT04gKGIpKSwgc3RyZWFtKTsKKwkgICAgZnB1dHNfZmlsdGVyZWQgKCI6OiIsIHN0cmVhbSk7CisJICB9CisJZnB1dHNfZmlsdGVyZWQgKFNZTUJPTF9TT1VSQ0VfTkFNRSAoZXhwLT5lbHRzW3BjICsgMl0uc3ltYm9sKSwgc3RyZWFtKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgT1BfTEFTVDoKKyAgICAgICgqcG9zKSArPSAyOworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJCVkIiwKKwkJCWxvbmdlc3RfdG9faW50IChleHAtPmVsdHNbcGMgKyAxXS5sb25nY29uc3QpKTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgT1BfUkVHSVNURVI6CisgICAgICAoKnBvcykgKz0gMjsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiQlcyIsCisJICAgICAgIFJFR0lTVEVSX05BTUUgKGxvbmdlc3RfdG9faW50IChleHAtPmVsdHNbcGMgKyAxXS5sb25nY29uc3QpKSk7CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIE9QX0JPT0w6CisgICAgICAoKnBvcykgKz0gMjsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiVzIiwKKwkJCWxvbmdlc3RfdG9faW50IChleHAtPmVsdHNbcGMgKyAxXS5sb25nY29uc3QpCisJCQk/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBPUF9JTlRFUk5BTFZBUjoKKyAgICAgICgqcG9zKSArPSAyOworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJCVzIiwKKwkgICAgICAgaW50ZXJuYWx2YXJfbmFtZSAoZXhwLT5lbHRzW3BjICsgMV0uaW50ZXJuYWx2YXIpKTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgT1BfRlVOQ0FMTDoKKyAgICAgICgqcG9zKSArPSAyOworICAgICAgbmFyZ3MgPSBsb25nZXN0X3RvX2ludCAoZXhwLT5lbHRzW3BjICsgMV0ubG9uZ2NvbnN0KTsKKyAgICAgIHByaW50X3N1YmV4cCAoZXhwLCBwb3MsIHN0cmVhbSwgUFJFQ19TVUZGSVgpOworICAgICAgZnB1dHNfZmlsdGVyZWQgKCIgKCIsIHN0cmVhbSk7CisgICAgICBmb3IgKHRlbSA9IDA7IHRlbSA8IG5hcmdzOyB0ZW0rKykKKwl7CisJICBpZiAodGVtICE9IDApCisJICAgIGZwdXRzX2ZpbHRlcmVkICgiLCAiLCBzdHJlYW0pOworCSAgcHJpbnRfc3ViZXhwIChleHAsIHBvcywgc3RyZWFtLCBQUkVDX0FCT1ZFX0NPTU1BKTsKKwl9CisgICAgICBmcHV0c19maWx0ZXJlZCAoIikiLCBzdHJlYW0pOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBPUF9OQU1FOgorICAgIGNhc2UgT1BfRVhQUlNUUklORzoKKyAgICAgIG5hcmdzID0gbG9uZ2VzdF90b19pbnQgKGV4cCAtPiBlbHRzW3BjICsgMV0ubG9uZ2NvbnN0KTsKKyAgICAgICgqcG9zKSArPSAzICsgQllURVNfVE9fRVhQX0VMRU0gKG5hcmdzICsgMSk7CisgICAgICBmcHV0c19maWx0ZXJlZCAoJmV4cC0+ZWx0c1twYyArIDJdLnN0cmluZywgc3RyZWFtKTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgT1BfU1RSSU5HOgorICAgICAgbmFyZ3MgPSBsb25nZXN0X3RvX2ludCAoZXhwIC0+IGVsdHNbcGMgKyAxXS5sb25nY29uc3QpOworICAgICAgKCpwb3MpICs9IDMgKyBCWVRFU19UT19FWFBfRUxFTSAobmFyZ3MgKyAxKTsKKyAgICAgIC8qIExBX1BSSU5UX1NUUklORyB3aWxsIHByaW50IHVzaW5nIHRoZSBjdXJyZW50IHJlcGVhdCBjb3VudCB0aHJlc2hvbGQuCisJIElmIG5lY2Vzc2FyeSwgd2UgY2FuIHRlbXBvcmFyaWx5IHNldCBpdCB0byB6ZXJvLCBvciBwYXNzIGl0IGFzIGFuCisJIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHRvIExBX1BSSU5UX1NUUklORy4gIC1mbmYgKi8KKyAgICAgIExBX1BSSU5UX1NUUklORyAoc3RyZWFtLCAmZXhwLT5lbHRzW3BjICsgMl0uc3RyaW5nLCBuYXJncywgMSwgMCk7CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIE9QX0JJVFNUUklORzoKKyAgICAgIG5hcmdzID0gbG9uZ2VzdF90b19pbnQgKGV4cCAtPiBlbHRzW3BjICsgMV0ubG9uZ2NvbnN0KTsKKyAgICAgICgqcG9zKQorCSs9IDMgKyBCWVRFU19UT19FWFBfRUxFTSAoKG5hcmdzICsgSE9TVF9DSEFSX0JJVCAtIDEpIC8gSE9TVF9DSEFSX0JJVCk7CisgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwgIkInPHVuaW1wbGVtZW50ZWQ+JyIpOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBPUF9BUlJBWToKKyAgICAgICgqcG9zKSArPSAzOworICAgICAgbmFyZ3MgPSBsb25nZXN0X3RvX2ludCAoZXhwLT5lbHRzW3BjICsgMl0ubG9uZ2NvbnN0KTsKKyAgICAgIG5hcmdzIC09IGxvbmdlc3RfdG9faW50IChleHAtPmVsdHNbcGMgKyAxXS5sb25nY29uc3QpOworICAgICAgbmFyZ3MrKzsKKyAgICAgIHRlbSA9IDA7CisgICAgICBpZiAoZXhwLT5lbHRzW3BjICsgNF0ub3Bjb2RlID09IE9QX0xPTkcKKwkgICYmIGV4cC0+ZWx0c1twYyArIDVdLnR5cGUgPT0gYnVpbHRpbl90eXBlX2NoYXIKKwkgICYmIGV4cC0+bGFuZ3VhZ2VfZGVmbi0+bGFfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfYykKKwl7CisJICAvKiBBdHRlbXB0IHRvIHByaW50IEMgY2hhcmFjdGVyIGFycmF5cyB1c2luZyBzdHJpbmcgc3ludGF4LgorCSAgICAgV2FsayB0aHJvdWdoIHRoZSBhcmdzLCBwaWNraW5nIHVwIG9uZSBjaGFyYWN0ZXIgZnJvbSBlYWNoCisJICAgICBvZiB0aGUgT1BfTE9ORyBleHByZXNzaW9uIGVsZW1lbnRzLiAgSWYgYW55IGFycmF5IGVsZW1lbnQKKwkgICAgIGRvZXMgbm90IG1hdGNoIG91ciBleHBlY3Rpb24gb2Ygd2hhdCB3ZSBzaG91bGQgZmluZCBmb3IKKwkgICAgIGEgc2ltcGxlIHN0cmluZywgcmV2ZXJ0IGJhY2sgdG8gYXJyYXkgcHJpbnRpbmcuICBOb3RlIHRoYXQKKwkgICAgIHRoZSBsYXN0IGV4cHJlc3Npb24gZWxlbWVudCBpcyBhbiBleHBsaWNpdCBudWxsIHRlcm1pbmF0b3IKKwkgICAgIGJ5dGUsIHdoaWNoIGRvZXNuJ3QgZ2V0IHByaW50ZWQuICovCisJICB0ZW1wc3RyID0gYWxsb2NhIChuYXJncyk7CisJICBwYyArPSA0OworCSAgd2hpbGUgKHRlbSA8IG5hcmdzKQorCSAgICB7CisJICAgICAgaWYgKGV4cC0+ZWx0c1twY10ub3Bjb2RlICE9IE9QX0xPTkcKKwkJICB8fCBleHAtPmVsdHNbcGMgKyAxXS50eXBlICE9IGJ1aWx0aW5fdHlwZV9jaGFyKQorCQl7CisJCSAgLyogTm90IGEgc2ltcGxlIGFycmF5IG9mIGNoYXIsIHVzZSByZWd1bGFyIGFycmF5IHByaW50aW5nLiAqLworCQkgIHRlbSA9IDA7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICB0ZW1wc3RyW3RlbSsrXSA9CisJCSAgICBsb25nZXN0X3RvX2ludCAoZXhwLT5lbHRzW3BjICsgMl0ubG9uZ2NvbnN0KTsKKwkJICBwYyArPSA0OworCQl9CisJICAgIH0KKwl9CisgICAgICBpZiAodGVtID4gMCkKKwl7CisJICBMQV9QUklOVF9TVFJJTkcgKHN0cmVhbSwgdGVtcHN0ciwgbmFyZ3MgLSAxLCAxLCAwKTsKKwkgICgqcG9zKSA9IHBjOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpbnQgaXNfY2hpbGwgPSBleHAtPmxhbmd1YWdlX2RlZm4tPmxhX2xhbmd1YWdlID09IGxhbmd1YWdlX2NoaWxsOworCSAgZnB1dHNfZmlsdGVyZWQgKGlzX2NoaWxsID8gIiBbIiA6ICIgeyIsIHN0cmVhbSk7CisJICBmb3IgKHRlbSA9IDA7IHRlbSA8IG5hcmdzOyB0ZW0rKykKKwkgICAgeworCSAgICAgIGlmICh0ZW0gIT0gMCkKKwkJeworCQkgIGZwdXRzX2ZpbHRlcmVkICgiLCAiLCBzdHJlYW0pOworCQl9CisJICAgICAgcHJpbnRfc3ViZXhwIChleHAsIHBvcywgc3RyZWFtLCBQUkVDX0FCT1ZFX0NPTU1BKTsKKwkgICAgfQorCSAgZnB1dHNfZmlsdGVyZWQgKGlzX2NoaWxsID8gIl0iIDogIn0iLCBzdHJlYW0pOworCX0KKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgT1BfTEFCRUxFRDoKKyAgICAgIHRlbSA9IGxvbmdlc3RfdG9faW50IChleHAtPmVsdHNbcGMgKyAxXS5sb25nY29uc3QpOworICAgICAgKCpwb3MpICs9IDMgKyBCWVRFU19UT19FWFBfRUxFTSAodGVtICsgMSk7CisKKyAgICAgIGlmIChleHAtPmxhbmd1YWdlX2RlZm4tPmxhX2xhbmd1YWdlID09IGxhbmd1YWdlX2NoaWxsKQorCXsKKwkgIGZwdXRzX2ZpbHRlcmVkICgiLiIsIHN0cmVhbSk7CisJICBmcHV0c19maWx0ZXJlZCAoJmV4cC0+ZWx0c1twYyArIDJdLnN0cmluZywgc3RyZWFtKTsKKwkgIGZwdXRzX2ZpbHRlcmVkIChleHAtPmVsdHNbKnBvc10ub3Bjb2RlID09IE9QX0xBQkVMRUQgPyAiLCAiCisJCQkgIDogIjogIiwKKwkJCSAgc3RyZWFtKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogR2NjIHN1cHBvcnQgYm90aCB0aGVzZSBzeW50YXhlcy4gIFVuc3VyZSB3aGljaCBpcyBwcmVmZXJyZWQuICAqLworI2lmIDEKKwkgIGZwdXRzX2ZpbHRlcmVkICgmZXhwLT5lbHRzW3BjICsgMl0uc3RyaW5nLCBzdHJlYW0pOworCSAgZnB1dHNfZmlsdGVyZWQgKCI6ICIsIHN0cmVhbSk7CisjZWxzZQorCSAgZnB1dHNfZmlsdGVyZWQgKCIuIiwgc3RyZWFtKTsKKwkgIGZwdXRzX2ZpbHRlcmVkICgmZXhwLT5lbHRzW3BjICsgMl0uc3RyaW5nLCBzdHJlYW0pOworCSAgZnB1dHNfZmlsdGVyZWQgKCI9Iiwgc3RyZWFtKTsKKyNlbmRpZgorCX0KKyAgICAgIHByaW50X3N1YmV4cCAoZXhwLCBwb3MsIHN0cmVhbSwgUFJFQ19TVUZGSVgpOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBURVJOT1BfQ09ORDoKKyAgICAgIGlmICgoaW50KSBwcmVjID4gKGludCkgUFJFQ19DT01NQSkKKwlmcHV0c19maWx0ZXJlZCAoIigiLCBzdHJlYW0pOworICAgICAgLyogUHJpbnQgdGhlIHN1YmV4cHJlc3Npb25zLCBmb3JjaW5nIHBhcmVudGhlc2VzCisJIGFyb3VuZCBhbnkgYmluYXJ5IG9wZXJhdGlvbnMgd2l0aGluIHRoZW0uCisJIFRoaXMgaXMgbW9yZSBwYXJlbnRoZXNlcyB0aGFuIGFyZSBzdHJpY3RseSBuZWNlc3NhcnksCisJIGJ1dCBpdCBsb29rcyBjbGVhcmVyLiAgKi8KKyAgICAgIHByaW50X3N1YmV4cCAoZXhwLCBwb3MsIHN0cmVhbSwgUFJFQ19IWVBFUik7CisgICAgICBmcHV0c19maWx0ZXJlZCAoIiA/ICIsIHN0cmVhbSk7CisgICAgICBwcmludF9zdWJleHAgKGV4cCwgcG9zLCBzdHJlYW0sIFBSRUNfSFlQRVIpOworICAgICAgZnB1dHNfZmlsdGVyZWQgKCIgOiAiLCBzdHJlYW0pOworICAgICAgcHJpbnRfc3ViZXhwIChleHAsIHBvcywgc3RyZWFtLCBQUkVDX0hZUEVSKTsKKyAgICAgIGlmICgoaW50KSBwcmVjID4gKGludCkgUFJFQ19DT01NQSkKKwlmcHV0c19maWx0ZXJlZCAoIikiLCBzdHJlYW0pOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBURVJOT1BfU0xJQ0U6CisgICAgY2FzZSBURVJOT1BfU0xJQ0VfQ09VTlQ6CisgICAgICBwcmludF9zdWJleHAgKGV4cCwgcG9zLCBzdHJlYW0sIFBSRUNfU1VGRklYKTsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiKCIsIHN0cmVhbSk7CisgICAgICBwcmludF9zdWJleHAgKGV4cCwgcG9zLCBzdHJlYW0sIFBSRUNfQUJPVkVfQ09NTUEpOworICAgICAgZnB1dHNfZmlsdGVyZWQgKG9wY29kZSA9PSBURVJOT1BfU0xJQ0UgPyAiIDogIiA6ICIgVVAgIiwgc3RyZWFtKTsKKyAgICAgIHByaW50X3N1YmV4cCAoZXhwLCBwb3MsIHN0cmVhbSwgUFJFQ19BQk9WRV9DT01NQSk7CisgICAgICBmcHV0c19maWx0ZXJlZCAoIikiLCBzdHJlYW0pOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBTVFJVQ1RPUF9TVFJVQ1Q6CisgICAgICB0ZW0gPSBsb25nZXN0X3RvX2ludCAoZXhwLT5lbHRzW3BjICsgMV0ubG9uZ2NvbnN0KTsKKyAgICAgICgqcG9zKSArPSAzICsgQllURVNfVE9fRVhQX0VMRU0gKHRlbSArIDEpOworICAgICAgcHJpbnRfc3ViZXhwIChleHAsIHBvcywgc3RyZWFtLCBQUkVDX1NVRkZJWCk7CisgICAgICBmcHV0c19maWx0ZXJlZCAoIi4iLCBzdHJlYW0pOworICAgICAgZnB1dHNfZmlsdGVyZWQgKCZleHAtPmVsdHNbcGMgKyAyXS5zdHJpbmcsIHN0cmVhbSk7CisgICAgICByZXR1cm47CisKKyAgICAvKiBXaWxsIG5vdCBvY2N1ciBmb3IgTW9kdWxhLTIgKi8KKyAgICBjYXNlIFNUUlVDVE9QX1BUUjoKKyAgICAgIHRlbSA9IGxvbmdlc3RfdG9faW50IChleHAtPmVsdHNbcGMgKyAxXS5sb25nY29uc3QpOworICAgICAgKCpwb3MpICs9IDMgKyBCWVRFU19UT19FWFBfRUxFTSAodGVtICsgMSk7CisgICAgICBwcmludF9zdWJleHAgKGV4cCwgcG9zLCBzdHJlYW0sIFBSRUNfU1VGRklYKTsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiLT4iLCBzdHJlYW0pOworICAgICAgZnB1dHNfZmlsdGVyZWQgKCZleHAtPmVsdHNbcGMgKyAyXS5zdHJpbmcsIHN0cmVhbSk7CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIEJJTk9QX1NVQlNDUklQVDoKKyAgICAgIHByaW50X3N1YmV4cCAoZXhwLCBwb3MsIHN0cmVhbSwgUFJFQ19TVUZGSVgpOworICAgICAgZnB1dHNfZmlsdGVyZWQgKCJbIiwgc3RyZWFtKTsKKyAgICAgIHByaW50X3N1YmV4cCAoZXhwLCBwb3MsIHN0cmVhbSwgUFJFQ19BQk9WRV9DT01NQSk7CisgICAgICBmcHV0c19maWx0ZXJlZCAoIl0iLCBzdHJlYW0pOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBVTk9QX1BPU1RJTkNSRU1FTlQ6CisgICAgICBwcmludF9zdWJleHAgKGV4cCwgcG9zLCBzdHJlYW0sIFBSRUNfU1VGRklYKTsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiKysiLCBzdHJlYW0pOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBVTk9QX1BPU1RERUNSRU1FTlQ6CisgICAgICBwcmludF9zdWJleHAgKGV4cCwgcG9zLCBzdHJlYW0sIFBSRUNfU1VGRklYKTsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiLS0iLCBzdHJlYW0pOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBVTk9QX0NBU1Q6CisgICAgICAoKnBvcykgKz0gMjsKKyAgICAgIGlmICgoaW50KSBwcmVjID4gKGludCkgUFJFQ19QUkVGSVgpCisgICAgICAgIGZwdXRzX2ZpbHRlcmVkICgiKCIsIHN0cmVhbSk7CisgICAgICBmcHV0c19maWx0ZXJlZCAoIigiLCBzdHJlYW0pOworICAgICAgdHlwZV9wcmludCAoZXhwLT5lbHRzW3BjICsgMV0udHlwZSwgIiIsIHN0cmVhbSwgMCk7CisgICAgICBmcHV0c19maWx0ZXJlZCAoIikgIiwgc3RyZWFtKTsKKyAgICAgIHByaW50X3N1YmV4cCAoZXhwLCBwb3MsIHN0cmVhbSwgUFJFQ19QUkVGSVgpOworICAgICAgaWYgKChpbnQpIHByZWMgPiAoaW50KSBQUkVDX1BSRUZJWCkKKyAgICAgICAgZnB1dHNfZmlsdGVyZWQgKCIpIiwgc3RyZWFtKTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgVU5PUF9NRU1WQUw6CisgICAgICAoKnBvcykgKz0gMjsKKyAgICAgIGlmICgoaW50KSBwcmVjID4gKGludCkgUFJFQ19QUkVGSVgpCisgICAgICAgIGZwdXRzX2ZpbHRlcmVkICgiKCIsIHN0cmVhbSk7CisgICAgICBpZiAoZXhwLT5lbHRzW3BjICsgMV0udHlwZS0+Y29kZSA9PSBUWVBFX0NPREVfRlVOQyAmJgorCSAgZXhwLT5lbHRzW3BjICsgM10ub3Bjb2RlID09IE9QX0xPTkcpIHsKKwkvKiBXZSBoYXZlIGEgbWluaW1hbCBzeW1ib2wgZm4sIHByb2JhYmx5LiAgSXQncyBlbmNvZGVkCisJICAgYXMgYSBVTk9QX01FTVZBTCAoZnVuY3Rpb24tdHlwZSkgb2YgYW4gT1BfTE9ORyAoaW50LCBhZGRyZXNzKS4KKwkgICBTd2FsbG93IHRoZSBPUF9MT05HIChpbmNsdWRpbmcgYm90aCBpdHMgb3Bjb2Rlcyk7IGlnbm9yZQorCSAgIGl0cyB0eXBlOyBwcmludCB0aGUgdmFsdWUgaW4gdGhlIHR5cGUgb2YgdGhlIE1FTVZBTC4gICovCisJKCpwb3MpICs9IDQ7CisJdmFsID0gdmFsdWVfYXRfbGF6eSAoZXhwLT5lbHRzW3BjICsgMV0udHlwZSwKKwkJCSAgICAgKENPUkVfQUREUikgZXhwLT5lbHRzW3BjICsgNV0ubG9uZ2NvbnN0LAorCQkJICAgICBOVUxMKTsKKwl2YWx1ZV9wcmludCAodmFsLCBzdHJlYW0sIDAsIFZhbF9ub19wcmV0dHlwcmludCk7CisgICAgICB9IGVsc2UgeworCWZwdXRzX2ZpbHRlcmVkICgieyIsIHN0cmVhbSk7CisJdHlwZV9wcmludCAoZXhwLT5lbHRzW3BjICsgMV0udHlwZSwgIiIsIHN0cmVhbSwgMCk7CisJZnB1dHNfZmlsdGVyZWQgKCJ9ICIsIHN0cmVhbSk7CisgICAgICAgIHByaW50X3N1YmV4cCAoZXhwLCBwb3MsIHN0cmVhbSwgUFJFQ19QUkVGSVgpOworICAgICAgfQorICAgICAgaWYgKChpbnQpIHByZWMgPiAoaW50KSBQUkVDX1BSRUZJWCkKKyAgICAgICAgZnB1dHNfZmlsdGVyZWQgKCIpIiwgc3RyZWFtKTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgQklOT1BfQVNTSUdOX01PRElGWToKKyAgICAgIG9wY29kZSA9IGV4cC0+ZWx0c1twYyArIDFdLm9wY29kZTsKKyAgICAgICgqcG9zKSArPSAyOworICAgICAgbXlwcmVjID0gUFJFQ19BU1NJR047CisgICAgICBhc3NvYyA9IDE7CisgICAgICBhc3NpZ25fbW9kaWZ5ID0gMTsKKyAgICAgIG9wX3N0ciA9ICI/Pz8iOworICAgICAgZm9yICh0ZW0gPSAwOyBvcF9wcmludF90YWJbdGVtXS5vcGNvZGUgIT0gT1BfTlVMTDsgdGVtKyspCisJaWYgKG9wX3ByaW50X3RhYlt0ZW1dLm9wY29kZSA9PSBvcGNvZGUpCisJICB7CisJICAgIG9wX3N0ciA9IG9wX3ByaW50X3RhYlt0ZW1dLnN0cmluZzsKKwkgICAgYnJlYWs7CisJICB9CisgICAgICBpZiAob3BfcHJpbnRfdGFiW3RlbV0ub3Bjb2RlICE9IG9wY29kZSkKKwkvKiBOb3QgZm91bmQ7IGRvbid0IHRyeSB0byBrZWVwIGdvaW5nIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cKKwkgICB0byBpbnRlcnByZXQgZnVydGhlciBlbGVtZW50cy4gICovCisJZXJyb3IgKCJJbnZhbGlkIGV4cHJlc3Npb24iKTsKKyAgICAgIGJyZWFrOworCisgICAgLyogQysrIG9wcyAqLworCisgICAgY2FzZSBPUF9USElTOgorICAgICAgKysoKnBvcyk7CisgICAgICBmcHV0c19maWx0ZXJlZCAoInRoaXMiLCBzdHJlYW0pOworICAgICAgcmV0dXJuOworCisgICAgLyogTW9kdWxhLTIgb3BzICovCisKKyAgICBjYXNlIE1VTFRJX1NVQlNDUklQVDoKKyAgICAgICgqcG9zKSArPSAyOworICAgICAgbmFyZ3MgPSBsb25nZXN0X3RvX2ludCAoZXhwLT5lbHRzW3BjICsgMV0ubG9uZ2NvbnN0KTsKKyAgICAgIHByaW50X3N1YmV4cCAoZXhwLCBwb3MsIHN0cmVhbSwgUFJFQ19TVUZGSVgpOworICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChzdHJlYW0sICIgWyIpOworICAgICAgZm9yICh0ZW0gPSAwOyB0ZW0gPCBuYXJnczsgdGVtKyspCisJeworCSAgaWYgKHRlbSAhPSAwKQorCSAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwgIiwgIik7CisJICBwcmludF9zdWJleHAgKGV4cCwgcG9zLCBzdHJlYW0sIFBSRUNfQUJPVkVfQ09NTUEpOworCX0KKyAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoc3RyZWFtLCAiXSIpOworICAgICAgcmV0dXJuOworCisgICAgY2FzZSBCSU5PUF9WQUw6CisgICAgICAoKnBvcykrPTI7CisgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQoc3RyZWFtLCJWQUwoIik7CisgICAgICB0eXBlX3ByaW50KGV4cC0+ZWx0c1twYysxXS50eXBlLCIiLHN0cmVhbSwwKTsKKyAgICAgIGZwcmludGZfdW5maWx0ZXJlZChzdHJlYW0sIiwiKTsKKyAgICAgIHByaW50X3N1YmV4cChleHAscG9zLHN0cmVhbSxQUkVDX1BSRUZJWCk7CisgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQoc3RyZWFtLCIpIik7CisgICAgICByZXR1cm47CisgICAgICAKKyAgICBjYXNlIEJJTk9QX0lOQ0w6CisgICAgY2FzZSBCSU5PUF9FWENMOgorICAgICAgZXJyb3IoInByaW50X3N1YmV4cDogIE5vdCBpbXBsZW1lbnRlZC4iKTsKKworICAgIC8qIERlZmF1bHQgb3BzICovCisKKyAgICBkZWZhdWx0OgorICAgICAgb3Bfc3RyID0gIj8/PyI7CisgICAgICBmb3IgKHRlbSA9IDA7IG9wX3ByaW50X3RhYlt0ZW1dLm9wY29kZSAhPSBPUF9OVUxMOyB0ZW0rKykKKwlpZiAob3BfcHJpbnRfdGFiW3RlbV0ub3Bjb2RlID09IG9wY29kZSkKKwkgIHsKKwkgICAgb3Bfc3RyID0gb3BfcHJpbnRfdGFiW3RlbV0uc3RyaW5nOworCSAgICBteXByZWMgPSBvcF9wcmludF90YWJbdGVtXS5wcmVjZWRlbmNlOworCSAgICBhc3NvYyA9IG9wX3ByaW50X3RhYlt0ZW1dLnJpZ2h0X2Fzc29jOworCSAgICBicmVhazsKKwkgIH0KKyAgICAgIGlmIChvcF9wcmludF90YWJbdGVtXS5vcGNvZGUgIT0gb3Bjb2RlKQorCS8qIE5vdCBmb3VuZDsgZG9uJ3QgdHJ5IHRvIGtlZXAgZ29pbmcgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGhvdworCSAgIHRvIGludGVycHJldCBmdXJ0aGVyIGVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIHRoaXMgaGFwcGVucworCSAgIGlmIG9wY29kZSBpcyBPUF9UWVBFLiAgKi8KKwllcnJvciAoIkludmFsaWQgZXhwcmVzc2lvbiIpOworICAgfQorCisgIC8qIE5vdGUgdGhhdCBQUkVDX0JVSUxUSU4gd2lsbCBhbHdheXMgZW1pdCBwYXJlbnRoZXNlcy4gKi8KKyAgaWYgKChpbnQpIG15cHJlYyA8IChpbnQpIHByZWMpCisgICAgZnB1dHNfZmlsdGVyZWQgKCIoIiwgc3RyZWFtKTsKKyAgaWYgKChpbnQpIG9wY29kZSA+IChpbnQpIEJJTk9QX0VORCkKKyAgICB7CisgICAgICBpZiAoYXNzb2MpCisJeworCSAgLyogVW5hcnkgcG9zdGZpeCBvcGVyYXRvci4gICovCisJICBwcmludF9zdWJleHAgKGV4cCwgcG9zLCBzdHJlYW0sIFBSRUNfU1VGRklYKTsKKwkgIGZwdXRzX2ZpbHRlcmVkIChvcF9zdHIsIHN0cmVhbSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFVuYXJ5IHByZWZpeCBvcGVyYXRvci4gICovCisJICBmcHV0c19maWx0ZXJlZCAob3Bfc3RyLCBzdHJlYW0pOworCSAgaWYgKG15cHJlYyA9PSBQUkVDX0JVSUxUSU5fRlVOQ1RJT04pCisJICAgIGZwdXRzX2ZpbHRlcmVkICgiKCIsIHN0cmVhbSk7CisJICBwcmludF9zdWJleHAgKGV4cCwgcG9zLCBzdHJlYW0sIFBSRUNfUFJFRklYKTsKKwkgIGlmIChteXByZWMgPT0gUFJFQ19CVUlMVElOX0ZVTkNUSU9OKQorCSAgICBmcHV0c19maWx0ZXJlZCAoIikiLCBzdHJlYW0pOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBCaW5hcnkgb3BlcmF0b3IuICAqLworICAgICAgLyogUHJpbnQgbGVmdCBvcGVyYW5kLgorCSBJZiBvcGVyYXRvciBpcyByaWdodC1hc3NvY2lhdGl2ZSwKKwkgaW5jcmVtZW50IHByZWNlZGVuY2UgZm9yIHRoaXMgb3BlcmFuZC4gICovCisgICAgICBwcmludF9zdWJleHAgKGV4cCwgcG9zLCBzdHJlYW0sCisJCSAgICAoZW51bSBwcmVjZWRlbmNlKSAoKGludCkgbXlwcmVjICsgYXNzb2MpKTsKKyAgICAgIC8qIFByaW50IHRoZSBvcGVyYXRvciBpdHNlbGYuICAqLworICAgICAgaWYgKGFzc2lnbl9tb2RpZnkpCisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiICVzPSAiLCBvcF9zdHIpOworICAgICAgZWxzZSBpZiAob3Bfc3RyWzBdID09ICcsJykKKwlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlcyAiLCBvcF9zdHIpOworICAgICAgZWxzZQorCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiAlcyAiLCBvcF9zdHIpOworICAgICAgLyogUHJpbnQgcmlnaHQgb3BlcmFuZC4KKwkgSWYgb3BlcmF0b3IgaXMgbGVmdC1hc3NvY2lhdGl2ZSwKKwkgaW5jcmVtZW50IHByZWNlZGVuY2UgZm9yIHRoaXMgb3BlcmFuZC4gICovCisgICAgICBwcmludF9zdWJleHAgKGV4cCwgcG9zLCBzdHJlYW0sCisJCSAgICAoZW51bSBwcmVjZWRlbmNlKSAoKGludCkgbXlwcmVjICsgIWFzc29jKSk7CisgICAgfQorCisgIGlmICgoaW50KSBteXByZWMgPCAoaW50KSBwcmVjKQorICAgIGZwdXRzX2ZpbHRlcmVkICgiKSIsIHN0cmVhbSk7Cit9CisKKy8qIFJldHVybiB0aGUgb3BlcmF0b3IgY29ycmVzcG9uZGluZyB0byBvcGNvZGUgT1AgYXMKKyAgIGEgc3RyaW5nLiAgIE5VTEwgaW5kaWNhdGVzIHRoYXQgdGhlIG9wY29kZSB3YXMgbm90IGZvdW5kIGluIHRoZQorICAgY3VycmVudCBsYW5ndWFnZSB0YWJsZS4gICovCitjaGFyICoKK29wX3N0cmluZyhvcCkKKyAgIGVudW0gZXhwX29wY29kZSBvcDsKK3sKKyAgaW50IHRlbTsKKyAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG9wX3ByaW50ICpvcF9wcmludF90YWI7CisKKyAgb3BfcHJpbnRfdGFiID0gY3VycmVudF9sYW5ndWFnZS0+bGFfb3BfcHJpbnRfdGFiOworICBmb3IgKHRlbSA9IDA7IG9wX3ByaW50X3RhYlt0ZW1dLm9wY29kZSAhPSBPUF9OVUxMOyB0ZW0rKykKKyAgICBpZiAob3BfcHJpbnRfdGFiW3RlbV0ub3Bjb2RlID09IG9wKQorICAgICAgcmV0dXJuIG9wX3ByaW50X3RhYlt0ZW1dLnN0cmluZzsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKyNpZmRlZiBNQUlOVEVOQU5DRV9DTURTCisKKy8qIFN1cHBvcnQgZm9yIGR1bXBpbmcgdGhlIHJhdyBkYXRhIGZyb20gZXhwcmVzc2lvbnMgaW4gYSBodW1hbiByZWFkYWJsZQorICAgZm9ybS4gICovCisKK3N0YXRpYyBjaGFyICogb3BfbmFtZSBQQVJBTVMgKChpbnQgb3Bjb2RlKSk7CisKK3N0YXRpYyBjaGFyICoKK29wX25hbWUgKG9wY29kZSkKKwlpbnQgb3Bjb2RlOworeworICBzd2l0Y2ggKG9wY29kZSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIHsKKwlzdGF0aWMgY2hhciBidWZbMzBdOworCisJc3ByaW50ZiAoYnVmLCAiPHVua25vd24gJWQ+Iiwgb3Bjb2RlKTsKKwlyZXR1cm4gYnVmOworICAgICAgfQorICAgIGNhc2UgT1BfTlVMTDogcmV0dXJuICJPUF9OVUxMIjsKKyAgICBjYXNlIEJJTk9QX0FERDogcmV0dXJuICJCSU5PUF9BREQiOworICAgIGNhc2UgQklOT1BfU1VCOiByZXR1cm4gIkJJTk9QX1NVQiI7CisgICAgY2FzZSBCSU5PUF9NVUw6IHJldHVybiAiQklOT1BfTVVMIjsKKyAgICBjYXNlIEJJTk9QX0RJVjogcmV0dXJuICJCSU5PUF9ESVYiOworICAgIGNhc2UgQklOT1BfUkVNOiByZXR1cm4gIkJJTk9QX1JFTSI7CisgICAgY2FzZSBCSU5PUF9NT0Q6IHJldHVybiAiQklOT1BfTU9EIjsKKyAgICBjYXNlIEJJTk9QX0xTSDogcmV0dXJuICJCSU5PUF9MU0giOworICAgIGNhc2UgQklOT1BfUlNIOiByZXR1cm4gIkJJTk9QX1JTSCI7CisgICAgY2FzZSBCSU5PUF9MT0dJQ0FMX0FORDogcmV0dXJuICJCSU5PUF9MT0dJQ0FMX0FORCI7CisgICAgY2FzZSBCSU5PUF9MT0dJQ0FMX09SOiByZXR1cm4gIkJJTk9QX0xPR0lDQUxfT1IiOworICAgIGNhc2UgQklOT1BfQklUV0lTRV9BTkQ6IHJldHVybiAiQklOT1BfQklUV0lTRV9BTkQiOworICAgIGNhc2UgQklOT1BfQklUV0lTRV9JT1I6IHJldHVybiAiQklOT1BfQklUV0lTRV9JT1IiOworICAgIGNhc2UgQklOT1BfQklUV0lTRV9YT1I6IHJldHVybiAiQklOT1BfQklUV0lTRV9YT1IiOworICAgIGNhc2UgQklOT1BfRVFVQUw6IHJldHVybiAiQklOT1BfRVFVQUwiOworICAgIGNhc2UgQklOT1BfTk9URVFVQUw6IHJldHVybiAiQklOT1BfTk9URVFVQUwiOworICAgIGNhc2UgQklOT1BfTEVTUzogcmV0dXJuICJCSU5PUF9MRVNTIjsKKyAgICBjYXNlIEJJTk9QX0dUUjogcmV0dXJuICJCSU5PUF9HVFIiOworICAgIGNhc2UgQklOT1BfTEVROiByZXR1cm4gIkJJTk9QX0xFUSI7CisgICAgY2FzZSBCSU5PUF9HRVE6IHJldHVybiAiQklOT1BfR0VRIjsKKyAgICBjYXNlIEJJTk9QX1JFUEVBVDogcmV0dXJuICJCSU5PUF9SRVBFQVQiOworICAgIGNhc2UgQklOT1BfQVNTSUdOOiByZXR1cm4gIkJJTk9QX0FTU0lHTiI7CisgICAgY2FzZSBCSU5PUF9DT01NQTogcmV0dXJuICJCSU5PUF9DT01NQSI7CisgICAgY2FzZSBCSU5PUF9TVUJTQ1JJUFQ6IHJldHVybiAiQklOT1BfU1VCU0NSSVBUIjsKKyAgICBjYXNlIE1VTFRJX1NVQlNDUklQVDogcmV0dXJuICJNVUxUSV9TVUJTQ1JJUFQiOworICAgIGNhc2UgQklOT1BfRVhQOiByZXR1cm4gIkJJTk9QX0VYUCI7CisgICAgY2FzZSBCSU5PUF9NSU46IHJldHVybiAiQklOT1BfTUlOIjsKKyAgICBjYXNlIEJJTk9QX01BWDogcmV0dXJuICJCSU5PUF9NQVgiOworICAgIGNhc2UgQklOT1BfU0NPUEU6IHJldHVybiAiQklOT1BfU0NPUEUiOworICAgIGNhc2UgU1RSVUNUT1BfTUVNQkVSOiByZXR1cm4gIlNUUlVDVE9QX01FTUJFUiI7CisgICAgY2FzZSBTVFJVQ1RPUF9NUFRSOiByZXR1cm4gIlNUUlVDVE9QX01QVFIiOworICAgIGNhc2UgQklOT1BfSU5URElWOiByZXR1cm4gIkJJTk9QX0lOVERJViI7CisgICAgY2FzZSBCSU5PUF9BU1NJR05fTU9ESUZZOiByZXR1cm4gIkJJTk9QX0FTU0lHTl9NT0RJRlkiOworICAgIGNhc2UgQklOT1BfVkFMOiByZXR1cm4gIkJJTk9QX1ZBTCI7CisgICAgY2FzZSBCSU5PUF9JTkNMOiByZXR1cm4gIkJJTk9QX0lOQ0wiOworICAgIGNhc2UgQklOT1BfRVhDTDogcmV0dXJuICJCSU5PUF9FWENMIjsKKyAgICBjYXNlIEJJTk9QX0NPTkNBVDogcmV0dXJuICJCSU5PUF9DT05DQVQiOworICAgIGNhc2UgQklOT1BfUkFOR0U6IHJldHVybiAiQklOT1BfUkFOR0UiOworICAgIGNhc2UgQklOT1BfRU5EOiByZXR1cm4gIkJJTk9QX0VORCI7CisgICAgY2FzZSBURVJOT1BfQ09ORDogcmV0dXJuICJURVJOT1BfQ09ORCI7CisgICAgY2FzZSBURVJOT1BfU0xJQ0U6IHJldHVybiAiVEVSTk9QX1NMSUNFIjsKKyAgICBjYXNlIFRFUk5PUF9TTElDRV9DT1VOVDogcmV0dXJuICJURVJOT1BfU0xJQ0VfQ09VTlQiOworICAgIGNhc2UgT1BfTE9ORzogcmV0dXJuICJPUF9MT05HIjsKKyAgICBjYXNlIE9QX0RPVUJMRTogcmV0dXJuICJPUF9ET1VCTEUiOworICAgIGNhc2UgT1BfVkFSX1ZBTFVFOiByZXR1cm4gIk9QX1ZBUl9WQUxVRSI7CisgICAgY2FzZSBPUF9MQVNUOiByZXR1cm4gIk9QX0xBU1QiOworICAgIGNhc2UgT1BfUkVHSVNURVI6IHJldHVybiAiT1BfUkVHSVNURVIiOworICAgIGNhc2UgT1BfSU5URVJOQUxWQVI6IHJldHVybiAiT1BfSU5URVJOQUxWQVIiOworICAgIGNhc2UgT1BfRlVOQ0FMTDogcmV0dXJuICJPUF9GVU5DQUxMIjsKKyAgICBjYXNlIE9QX1NUUklORzogcmV0dXJuICJPUF9TVFJJTkciOworICAgIGNhc2UgT1BfQklUU1RSSU5HOiByZXR1cm4gIk9QX0JJVFNUUklORyI7CisgICAgY2FzZSBPUF9BUlJBWTogcmV0dXJuICJPUF9BUlJBWSI7CisgICAgY2FzZSBVTk9QX0NBU1Q6IHJldHVybiAiVU5PUF9DQVNUIjsKKyAgICBjYXNlIFVOT1BfTUVNVkFMOiByZXR1cm4gIlVOT1BfTUVNVkFMIjsKKyAgICBjYXNlIFVOT1BfTkVHOiByZXR1cm4gIlVOT1BfTkVHIjsKKyAgICBjYXNlIFVOT1BfTE9HSUNBTF9OT1Q6IHJldHVybiAiVU5PUF9MT0dJQ0FMX05PVCI7CisgICAgY2FzZSBVTk9QX0NPTVBMRU1FTlQ6IHJldHVybiAiVU5PUF9DT01QTEVNRU5UIjsKKyAgICBjYXNlIFVOT1BfSU5EOiByZXR1cm4gIlVOT1BfSU5EIjsKKyAgICBjYXNlIFVOT1BfQUREUjogcmV0dXJuICJVTk9QX0FERFIiOworICAgIGNhc2UgVU5PUF9QUkVJTkNSRU1FTlQ6IHJldHVybiAiVU5PUF9QUkVJTkNSRU1FTlQiOworICAgIGNhc2UgVU5PUF9QT1NUSU5DUkVNRU5UOiByZXR1cm4gIlVOT1BfUE9TVElOQ1JFTUVOVCI7CisgICAgY2FzZSBVTk9QX1BSRURFQ1JFTUVOVDogcmV0dXJuICJVTk9QX1BSRURFQ1JFTUVOVCI7CisgICAgY2FzZSBVTk9QX1BPU1RERUNSRU1FTlQ6IHJldHVybiAiVU5PUF9QT1NUREVDUkVNRU5UIjsKKyAgICBjYXNlIFVOT1BfU0laRU9GOiByZXR1cm4gIlVOT1BfU0laRU9GIjsKKyAgICBjYXNlIFVOT1BfTE9XRVI6IHJldHVybiAiVU5PUF9MT1dFUiI7CisgICAgY2FzZSBVTk9QX1VQUEVSOiByZXR1cm4gIlVOT1BfVVBQRVIiOworICAgIGNhc2UgVU5PUF9MRU5HVEg6IHJldHVybiAiVU5PUF9MRU5HVEgiOworICAgIGNhc2UgVU5PUF9QTFVTOiByZXR1cm4gIlVOT1BfUExVUyI7CisgICAgY2FzZSBVTk9QX0NBUDogcmV0dXJuICJVTk9QX0NBUCI7CisgICAgY2FzZSBVTk9QX0NIUjogcmV0dXJuICJVTk9QX0NIUiI7CisgICAgY2FzZSBVTk9QX09SRDogcmV0dXJuICJVTk9QX09SRCI7CisgICAgY2FzZSBVTk9QX0FCUzogcmV0dXJuICJVTk9QX0FCUyI7CisgICAgY2FzZSBVTk9QX0ZMT0FUOiByZXR1cm4gIlVOT1BfRkxPQVQiOworICAgIGNhc2UgVU5PUF9ISUdIOiByZXR1cm4gIlVOT1BfSElHSCI7CisgICAgY2FzZSBVTk9QX01BWDogcmV0dXJuICJVTk9QX01BWCI7CisgICAgY2FzZSBVTk9QX01JTjogcmV0dXJuICJVTk9QX01JTiI7CisgICAgY2FzZSBVTk9QX09ERDogcmV0dXJuICJVTk9QX09ERCI7CisgICAgY2FzZSBVTk9QX1RSVU5DOiByZXR1cm4gIlVOT1BfVFJVTkMiOworICAgIGNhc2UgT1BfQk9PTDogcmV0dXJuICJPUF9CT09MIjsKKyAgICBjYXNlIE9QX00yX1NUUklORzogcmV0dXJuICJPUF9NMl9TVFJJTkciOworICAgIGNhc2UgU1RSVUNUT1BfU1RSVUNUOiByZXR1cm4gIlNUUlVDVE9QX1NUUlVDVCI7CisgICAgY2FzZSBTVFJVQ1RPUF9QVFI6IHJldHVybiAiU1RSVUNUT1BfUFRSIjsKKyAgICBjYXNlIE9QX1RISVM6IHJldHVybiAiT1BfVEhJUyI7CisgICAgY2FzZSBPUF9TQ09QRTogcmV0dXJuICJPUF9TQ09QRSI7CisgICAgY2FzZSBPUF9UWVBFOiByZXR1cm4gIk9QX1RZUEUiOworICAgIGNhc2UgT1BfTEFCRUxFRDogcmV0dXJuICJPUF9MQUJFTEVEIjsKKyAgICB9Cit9CisKK3ZvaWQKK2R1bXBfcHJlZml4X2V4cHJlc3Npb24gKGV4cCwgc3RyZWFtLCBub3RlKQorICAgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBjaGFyICpub3RlOworeworICBpbnQgZWx0OworICBjaGFyICpvcGNvZGVfbmFtZTsKKyAgY2hhciAqZWx0c2NhbjsKKyAgaW50IGVsdHNpemU7CisKKyAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiRHVtcCBvZiBleHByZXNzaW9uIEAgIik7CisgIGdkYl9wcmludF9hZGRyZXNzIChleHAsIHN0cmVhbSk7CisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiwgJXM6XG5FeHByZXNzaW9uOiBgIiwgbm90ZSk7CisgIGlmIChleHAtPmVsdHNbMF0ub3Bjb2RlICE9IE9QX1RZUEUpCisgICAgcHJpbnRfZXhwcmVzc2lvbiAoZXhwLCBzdHJlYW0pOworICBlbHNlCisgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiVHlwZSBwcmludGluZyBub3QgeWV0IHN1cHBvcnRlZC4uLi4iKTsKKyAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJ1xuXHRMYW5ndWFnZSAlcywgJWQgZWxlbWVudHMsICVkIGJ5dGVzIGVhY2guXG4iLAorCQkgICAgZXhwLT5sYW5ndWFnZV9kZWZuLT5sYV9uYW1lLCBleHAgLT4gbmVsdHMsCisJCSAgICBzaXplb2YgKHVuaW9uIGV4cF9lbGVtZW50KSk7CisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlx0JTVzICAlMjBzICAlMTZzICAlc1xuIiwgIkluZGV4IiwgIk9wY29kZSIsCisJCSAgICAiSGV4IFZhbHVlIiwgIlN0cmluZyBWYWx1ZSIpOworICBmb3IgKGVsdCA9IDA7IGVsdCA8IGV4cCAtPiBuZWx0czsgZWx0KyspCisgICAgeworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiXHQlNWQgICIsIGVsdCk7CisgICAgICBvcGNvZGVfbmFtZSA9IG9wX25hbWUgKGV4cCAtPiBlbHRzW2VsdF0ub3Bjb2RlKTsKKworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJTIwcyAgIiwgb3Bjb2RlX25hbWUpOworICAgICAgcHJpbnRfbG9uZ2VzdCAoc3RyZWFtLCAnZCcsIDAsIGV4cCAtPiBlbHRzW2VsdF0ubG9uZ2NvbnN0KTsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiAgIik7CisKKyAgICAgIGZvciAoZWx0c2NhbiA9IChjaGFyICopICZleHAtPmVsdHNbZWx0XSwKKwkgICAgIGVsdHNpemUgPSBzaXplb2YgKHVuaW9uIGV4cF9lbGVtZW50KSA7CisJICAgZWx0c2l6ZS0tID4gMDsKKwkgICBlbHRzY2FuKyspCisJeworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJWMiLAorCQkJICAgIGlzcHJpbnQgKCplbHRzY2FuKSA/ICgqZWx0c2NhbiAmIDB4RkYpIDogJy4nKTsKKwl9CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJcbiIpOworICAgIH0KK30KKworc3RhdGljIGludCBkdW1wX3N1YmV4cCBQQVJBTVMgKChzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwLCBHREJfRklMRSAqc3RyZWFtLCBpbnQgZWx0KSk7CisKK3N0YXRpYyBpbnQKK2R1bXBfc3ViZXhwIChleHAsIHN0cmVhbSwgZWx0KQorICAgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgZWx0OworeworICBzdGF0aWMgaW50IGluZGVudCA9IDA7CisgIGludCBpOworCisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlxuIik7CisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlx0JTVkICAiLCBlbHQpOworCisgIGZvciAoaSA9IDE7IGkgPD0gaW5kZW50OyBpKyspCisgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiICIpOworICBpbmRlbnQgKz0gMjsKKworICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlLTIwcyAgIiwgb3BfbmFtZSAoZXhwLT5lbHRzW2VsdF0ub3Bjb2RlKSk7CisKKyAgc3dpdGNoIChleHAgLT4gZWx0c1tlbHQrK10ub3Bjb2RlKQorICAgIHsKKyAgICBjYXNlIFRFUk5PUF9DT05EOgorICAgIGNhc2UgVEVSTk9QX1NMSUNFOgorICAgIGNhc2UgVEVSTk9QX1NMSUNFX0NPVU5UOgorICAgICAgZWx0ID0gZHVtcF9zdWJleHAgKGV4cCwgc3RyZWFtLCBlbHQpOworICAgIGNhc2UgQklOT1BfQUREOgorICAgIGNhc2UgQklOT1BfU1VCOgorICAgIGNhc2UgQklOT1BfTVVMOgorICAgIGNhc2UgQklOT1BfRElWOgorICAgIGNhc2UgQklOT1BfUkVNOgorICAgIGNhc2UgQklOT1BfTU9EOgorICAgIGNhc2UgQklOT1BfTFNIOgorICAgIGNhc2UgQklOT1BfUlNIOgorICAgIGNhc2UgQklOT1BfTE9HSUNBTF9BTkQ6CisgICAgY2FzZSBCSU5PUF9MT0dJQ0FMX09SOgorICAgIGNhc2UgQklOT1BfQklUV0lTRV9BTkQ6CisgICAgY2FzZSBCSU5PUF9CSVRXSVNFX0lPUjoKKyAgICBjYXNlIEJJTk9QX0JJVFdJU0VfWE9SOgorICAgIGNhc2UgQklOT1BfRVFVQUw6CisgICAgY2FzZSBCSU5PUF9OT1RFUVVBTDoKKyAgICBjYXNlIEJJTk9QX0xFU1M6CisgICAgY2FzZSBCSU5PUF9HVFI6CisgICAgY2FzZSBCSU5PUF9MRVE6CisgICAgY2FzZSBCSU5PUF9HRVE6CisgICAgY2FzZSBCSU5PUF9SRVBFQVQ6CisgICAgY2FzZSBCSU5PUF9BU1NJR046CisgICAgY2FzZSBCSU5PUF9DT01NQToKKyAgICBjYXNlIEJJTk9QX1NVQlNDUklQVDoKKyAgICBjYXNlIEJJTk9QX0VYUDoKKyAgICBjYXNlIEJJTk9QX01JTjoKKyAgICBjYXNlIEJJTk9QX01BWDoKKyAgICBjYXNlIEJJTk9QX1NDT1BFOgorICAgIGNhc2UgQklOT1BfSU5URElWOgorICAgIGNhc2UgQklOT1BfQVNTSUdOX01PRElGWToKKyAgICBjYXNlIEJJTk9QX1ZBTDoKKyAgICBjYXNlIEJJTk9QX0lOQ0w6CisgICAgY2FzZSBCSU5PUF9FWENMOgorICAgIGNhc2UgQklOT1BfQ09OQ0FUOgorICAgIGNhc2UgQklOT1BfSU46CisgICAgY2FzZSBCSU5PUF9SQU5HRToKKyAgICBjYXNlIEJJTk9QX0VORDoKKyAgICAgIGVsdCA9IGR1bXBfc3ViZXhwIChleHAsIHN0cmVhbSwgZWx0KTsKKyAgICBjYXNlIFVOT1BfTkVHOgorICAgIGNhc2UgVU5PUF9MT0dJQ0FMX05PVDoKKyAgICBjYXNlIFVOT1BfQ09NUExFTUVOVDoKKyAgICBjYXNlIFVOT1BfSU5EOgorICAgIGNhc2UgVU5PUF9BRERSOgorICAgIGNhc2UgVU5PUF9QUkVJTkNSRU1FTlQ6CisgICAgY2FzZSBVTk9QX1BPU1RJTkNSRU1FTlQ6CisgICAgY2FzZSBVTk9QX1BSRURFQ1JFTUVOVDoKKyAgICBjYXNlIFVOT1BfUE9TVERFQ1JFTUVOVDoKKyAgICBjYXNlIFVOT1BfU0laRU9GOgorICAgIGNhc2UgVU5PUF9QTFVTOgorICAgIGNhc2UgVU5PUF9DQVA6CisgICAgY2FzZSBVTk9QX0NIUjoKKyAgICBjYXNlIFVOT1BfT1JEOgorICAgIGNhc2UgVU5PUF9BQlM6CisgICAgY2FzZSBVTk9QX0ZMT0FUOgorICAgIGNhc2UgVU5PUF9ISUdIOgorICAgIGNhc2UgVU5PUF9NQVg6CisgICAgY2FzZSBVTk9QX01JTjoKKyAgICBjYXNlIFVOT1BfT0REOgorICAgIGNhc2UgVU5PUF9UUlVOQzoKKyAgICBjYXNlIFVOT1BfTE9XRVI6CisgICAgY2FzZSBVTk9QX1VQUEVSOgorICAgIGNhc2UgVU5PUF9MRU5HVEg6CisgICAgY2FzZSBVTk9QX0NBUkQ6CisgICAgY2FzZSBVTk9QX0NITUFYOgorICAgIGNhc2UgVU5PUF9DSE1JTjoKKyAgICAgIGVsdCA9IGR1bXBfc3ViZXhwIChleHAsIHN0cmVhbSwgZWx0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BfTE9ORzoKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlR5cGUgQDB4JXggKCIsIGV4cC0+ZWx0c1tlbHRdLnR5cGUpOworICAgICAgdHlwZV9wcmludCAoZXhwLT5lbHRzW2VsdF0udHlwZSwgTlVMTCwgc3RyZWFtLCAwKTsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiksIHZhbHVlICVsZCAoMHglbHgpIiwKKwkJCShsb25nKWV4cC0+ZWx0c1tlbHQrMV0ubG9uZ2NvbnN0LAorCQkJKGxvbmcpZXhwLT5lbHRzW2VsdCsxXS5sb25nY29uc3QpOworICAgICAgZWx0ICs9IDM7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QX0RPVUJMRToKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlR5cGUgQDB4JXggKCIsIGV4cC0+ZWx0c1tlbHRdLnR5cGUpOworICAgICAgdHlwZV9wcmludCAoZXhwLT5lbHRzW2VsdF0udHlwZSwgTlVMTCwgc3RyZWFtLCAwKTsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiksIHZhbHVlICVnIiwKKwkJCShkb3VibGUpZXhwLT5lbHRzW2VsdCsxXS5kb3VibGVjb25zdCk7CisgICAgICBlbHQgKz0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BfVkFSX1ZBTFVFOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiQmxvY2sgQDB4JXgsIHN5bWJvbCBAMHgleCAoJXMpIiwKKwkJCWV4cC0+ZWx0c1tlbHRdLmJsb2NrLAorCQkJZXhwLT5lbHRzW2VsdCsxXS5zeW1ib2wsCisJCQlTWU1CT0xfTkFNRSAoZXhwLT5lbHRzW2VsdCsxXS5zeW1ib2wpKTsKKyAgICAgIGVsdCArPSAzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUF9MQVNUOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiSGlzdG9yeSBlbGVtZW50ICVsZCIsCisJCQkobG9uZylleHAtPmVsdHNbZWx0XS5sb25nY29uc3QpOworICAgICAgZWx0ICs9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QX1JFR0lTVEVSOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiUmVnaXN0ZXIgJWxkIiwKKwkJCShsb25nKWV4cC0+ZWx0c1tlbHRdLmxvbmdjb25zdCk7CisgICAgICBlbHQgKz0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BfSU5URVJOQUxWQVI6CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJJbnRlcm5hbCB2YXIgQDB4JXggKCVzKSIsCisJCQlleHAtPmVsdHNbZWx0XS5pbnRlcm5hbHZhciwKKwkJCWV4cC0+ZWx0c1tlbHRdLmludGVybmFsdmFyLT5uYW1lKTsKKyAgICAgIGVsdCArPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUF9GVU5DQUxMOgorICAgICAgeworCWludCBuYXJnczsKKworCW5hcmdzID0gbG9uZ2VzdF90b19pbnQgKGV4cC0+ZWx0c1tlbHRdLmxvbmdjb25zdCk7CisKKwlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJOdW1iZXIgb2YgYXJnczogJWQiLCBuYXJncyk7CisJZWx0ICs9IDI7CisKKwlmb3IgKGkgPSAxOyBpIDw9IG5hcmdzICsgMTsgaSsrKQorCSAgZWx0ID0gZHVtcF9zdWJleHAgKGV4cCwgc3RyZWFtLCBlbHQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBPUF9BUlJBWToKKyAgICAgIHsKKwlpbnQgbG93ZXIsIHVwcGVyOworCWludCBpOworCisJbG93ZXIgPSBsb25nZXN0X3RvX2ludCAoZXhwLT5lbHRzW2VsdF0ubG9uZ2NvbnN0KTsKKwl1cHBlciA9IGxvbmdlc3RfdG9faW50IChleHAtPmVsdHNbZWx0ICsgMV0ubG9uZ2NvbnN0KTsKKworCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIkJvdW5kcyBbJWQ6JWRdIiwgbG93ZXIsIHVwcGVyKTsKKwllbHQgKz0gMzsKKworCWZvciAoaSA9IDE7IGkgPD0gdXBwZXIgLSBsb3dlciArIDE7IGkrKykKKwkgIGVsdCA9IGR1bXBfc3ViZXhwIChleHAsIHN0cmVhbSwgZWx0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgVU5PUF9NRU1WQUw6CisgICAgY2FzZSBVTk9QX0NBU1Q6CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJUeXBlIEAweCV4ICgiLAorCQkJICBleHAtPmVsdHNbZWx0XS50eXBlKTsKKyAgICAgIHR5cGVfcHJpbnQgKGV4cC0+ZWx0c1tlbHRdLnR5cGUsIE5VTEwsIHN0cmVhbSwgMCk7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIpIik7CisgICAgICBlbHQgPSBkdW1wX3N1YmV4cCAoZXhwLCBzdHJlYW0sIGVsdCArIDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUF9UWVBFOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiVHlwZSBAMHgleCAoIiwKKwkJCSAgZXhwLT5lbHRzW2VsdF0udHlwZSk7CisgICAgICB0eXBlX3ByaW50IChleHAtPmVsdHNbZWx0XS50eXBlLCBOVUxMLCBzdHJlYW0sIDApOworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKSIpOworICAgICAgZWx0ICs9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNUUlVDVE9QX1NUUlVDVDoKKyAgICBjYXNlIFNUUlVDVE9QX1BUUjoKKyAgICAgIHsKKwljaGFyICplbGVtX25hbWU7CisJaW50IGxlbjsKKworCWxlbiA9IGxvbmdlc3RfdG9faW50IChleHAtPmVsdHNbZWx0XS5sb25nY29uc3QpOworCWVsZW1fbmFtZSA9ICZleHAtPmVsdHNbZWx0ICsgMV0uc3RyaW5nOworCisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiRWxlbWVudCBuYW1lOiBgJS4qcyciLCBsZW4sIGVsZW1fbmFtZSk7CisJZWx0ID0gZHVtcF9zdWJleHAgKGV4cCwgc3RyZWFtLCBlbHQgKyAzICsgQllURVNfVE9fRVhQX0VMRU0gKGxlbiArIDEpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BfU0NPUEU6CisgICAgICB7CisJY2hhciAqZWxlbV9uYW1lOworCWludCBsZW47CisKKwlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJUeXBlIEAweCV4ICgiLCBleHAtPmVsdHNbZWx0XS50eXBlKTsKKwl0eXBlX3ByaW50IChleHAtPmVsdHNbZWx0XS50eXBlLCBOVUxMLCBzdHJlYW0sIDApOworCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIikgIik7CisKKwlsZW4gPSBsb25nZXN0X3RvX2ludCAoZXhwLT5lbHRzW2VsdCArIDFdLmxvbmdjb25zdCk7CisJZWxlbV9uYW1lID0gJmV4cC0+ZWx0c1tlbHQgKyAyXS5zdHJpbmc7CisKKwlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJGaWVsZCBuYW1lOiBgJS4qcyciLCBsZW4sIGVsZW1fbmFtZSk7CisJZWx0ICs9IDQgKyBCWVRFU19UT19FWFBfRUxFTSAobGVuICsgMSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgT1BfTlVMTDoKKyAgICBjYXNlIFNUUlVDVE9QX01FTUJFUjoKKyAgICBjYXNlIFNUUlVDVE9QX01QVFI6CisgICAgY2FzZSBNVUxUSV9TVUJTQ1JJUFQ6CisgICAgY2FzZSBPUF9GNzdfVU5ERVRFUk1JTkVEX0FSR0xJU1Q6CisgICAgY2FzZSBPUF9DT01QTEVYOgorICAgIGNhc2UgT1BfU1RSSU5HOgorICAgIGNhc2UgT1BfQklUU1RSSU5HOgorICAgIGNhc2UgT1BfQk9PTDoKKyAgICBjYXNlIE9QX00yX1NUUklORzoKKyAgICBjYXNlIE9QX1RISVM6CisgICAgY2FzZSBPUF9MQUJFTEVEOgorICAgIGNhc2UgT1BfTkFNRToKKyAgICBjYXNlIE9QX0VYUFJTVFJJTkc6CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJVbmtub3duIGZvcm1hdCIpOworICAgIH0KKworICBpbmRlbnQgLT0gMjsKKworICByZXR1cm4gZWx0OworfQorCit2b2lkCitkdW1wX3Bvc3RmaXhfZXhwcmVzc2lvbiAoZXhwLCBzdHJlYW0sIG5vdGUpCisgICAgIHN0cnVjdCBleHByZXNzaW9uICpleHA7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGNoYXIgKm5vdGU7Cit7CisgIGludCBlbHQ7CisKKyAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiRHVtcCBvZiBleHByZXNzaW9uIEAgIik7CisgIGdkYl9wcmludF9hZGRyZXNzIChleHAsIHN0cmVhbSk7CisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiwgJXM6XG5FeHByZXNzaW9uOiBgIiwgbm90ZSk7CisgIGlmIChleHAtPmVsdHNbMF0ub3Bjb2RlICE9IE9QX1RZUEUpCisgICAgcHJpbnRfZXhwcmVzc2lvbiAoZXhwLCBzdHJlYW0pOworICBlbHNlCisgICAgZnB1dHNfZmlsdGVyZWQgKCJUeXBlIHByaW50aW5nIG5vdCB5ZXQgc3VwcG9ydGVkLi4uLiIsIHN0cmVhbSk7CisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIidcblx0TGFuZ3VhZ2UgJXMsICVkIGVsZW1lbnRzLCAlZCBieXRlcyBlYWNoLlxuIiwKKwkJICAgIGV4cC0+bGFuZ3VhZ2VfZGVmbi0+bGFfbmFtZSwgZXhwIC0+IG5lbHRzLAorCQkgICAgc2l6ZW9mICh1bmlvbiBleHBfZWxlbWVudCkpOworICBmcHV0c19maWx0ZXJlZCAoIlxuIiwgc3RyZWFtKTsKKworICBmb3IgKGVsdCA9IDA7IGVsdCA8IGV4cCAtPiBuZWx0czspCisgICAgZWx0ID0gZHVtcF9zdWJleHAgKGV4cCwgc3RyZWFtLCBlbHQpOworICBmcHV0c19maWx0ZXJlZCAoIlxuIiwgc3RyZWFtKTsKK30KKworI2VuZGlmCS8qIE1BSU5URU5BTkNFX0NNRFMgKi8KZGlmZiAtLWdpdCBhL2dkYi9leHByZXNzaW9uLmggYi9nZGIvZXhwcmVzc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMGIyZTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZXhwcmVzc2lvbi5oCkBAIC0wLDAgKzEsMzgyIEBACisvKiBEZWZpbml0aW9ucyBmb3IgZXhwcmVzc2lvbnMgc3RvcmVkIGluIHJldmVyc2VkIHByZWZpeCBmb3JtLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODksIDE5OTIsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIChFWFBSRVNTSU9OX0gpCisjZGVmaW5lIEVYUFJFU1NJT05fSCAxCisKKworI2luY2x1ZGUgInN5bXRhYi5oIiAgLyogTmVlZGVkIGZvciAic3RydWN0IGJsb2NrIiB0eXBlLiAqLworCisKKy8qIERlZmluaXRpb25zIGZvciBzYXZlZCBDIGV4cHJlc3Npb25zLiAgKi8KKworLyogQW4gZXhwcmVzc2lvbiBpcyByZXByZXNlbnRlZCBhcyBhIHZlY3RvciBvZiB1bmlvbiBleHBfZWxlbWVudCdzLgorICAgRWFjaCBleHBfZWxlbWVudCBpcyBhbiBvcGNvZGUsIGV4Y2VwdCB0aGF0IHNvbWUgb3Bjb2RlcyBjYXVzZQorICAgdGhlIGZvbGxvd2luZyBleHBfZWxlbWVudCB0byBiZSB0cmVhdGVkIGFzIGEgbG9uZyBvciBkb3VibGUgY29uc3RhbnQKKyAgIG9yIGFzIGEgdmFyaWFibGUuICBUaGUgb3Bjb2RlcyBhcmUgb2JleWVkLCB1c2luZyBhIHN0YWNrIGZvciB0ZW1wb3Jhcmllcy4KKyAgIFRoZSB2YWx1ZSBpcyBsZWZ0IG9uIHRoZSB0ZW1wb3Jhcnkgc3RhY2sgYXQgdGhlIGVuZC4gICovCisKKy8qIFdoZW4gaXQgaXMgbmVjZXNzYXJ5IHRvIGluY2x1ZGUgYSBzdHJpbmcsCisgICBpdCBjYW4gb2NjdXB5IGFzIG1hbnkgZXhwX2VsZW1lbnRzIGFzIGl0IG5lZWRzLgorICAgV2UgZmluZCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdXNpbmcgc3RybGVuLAorICAgZGl2aWRlIHRvIGZpbmQgb3V0IGhvdyBtYW55IGV4cF9lbGVtZW50cyBhcmUgdXNlZCB1cCwKKyAgIGFuZCBza2lwIHRoYXQgbWFueS4gIFN0cmluZ3MsIGxpa2UgbnVtYmVycywgYXJlIGluZGljYXRlZAorICAgYnkgdGhlIHByZWNlZGluZyBvcGNvZGUuICAqLworCitlbnVtIGV4cF9vcGNvZGUKK3sKKyAgLyogVXNlZCB3aGVuIGl0J3MgbmVjZXNzYXJ5IHRvIHBhc3MgYW4gb3Bjb2RlIHdoaWNoIHdpbGwgYmUgaWdub3JlZCwKKyAgICAgb3IgdG8gY2F0Y2ggdW5pbml0aWFsaXplZCB2YWx1ZXMuICAqLworICBPUF9OVUxMLAorCisvKiBCSU5PUF8uLi4gb3BlcmF0ZSBvbiB0d28gdmFsdWVzIGNvbXB1dGVkIGJ5IGZvbGxvd2luZyBzdWJleHByZXNzaW9ucywKKyAgIHJlcGxhY2luZyB0aGVtIGJ5IG9uZSByZXN1bHQgdmFsdWUuICBUaGV5IHRha2Ugbm8gaW1tZWRpYXRlIGFyZ3VtZW50cy4gICovCisKKyAgQklOT1BfQURELAkJLyogKyAqLworICBCSU5PUF9TVUIsCQkvKiAtICovCisgIEJJTk9QX01VTCwJCS8qICogKi8KKyAgQklOT1BfRElWLAkJLyogLyAqLworICBCSU5PUF9SRU0sCQkvKiAlICovCisgIEJJTk9QX01PRCwJCS8qIG1vZCAoS251dGggMS4yLjQpICovCisgIEJJTk9QX0xTSCwJCS8qIDw8ICovCisgIEJJTk9QX1JTSCwJCS8qID4+ICovCisgIEJJTk9QX0xPR0lDQUxfQU5ELAkvKiAmJiAqLworICBCSU5PUF9MT0dJQ0FMX09SLAkvKiB8fCAqLworICBCSU5PUF9CSVRXSVNFX0FORCwJLyogJiAqLworICBCSU5PUF9CSVRXSVNFX0lPUiwJLyogfCAqLworICBCSU5PUF9CSVRXSVNFX1hPUiwJLyogXiAqLworICBCSU5PUF9FUVVBTCwJCS8qID09ICovCisgIEJJTk9QX05PVEVRVUFMLAkvKiAhPSAqLworICBCSU5PUF9MRVNTLAkJLyogPCAqLworICBCSU5PUF9HVFIsCQkvKiA+ICovCisgIEJJTk9QX0xFUSwJCS8qIDw9ICovCisgIEJJTk9QX0dFUSwJCS8qID49ICovCisgIEJJTk9QX1JFUEVBVCwJCS8qIEAgKi8KKyAgQklOT1BfQVNTSUdOLAkJLyogPSAqLworICBCSU5PUF9DT01NQSwJCS8qICwgKi8KKyAgQklOT1BfU1VCU0NSSVBULAkvKiB4W3ldICovCisgIEJJTk9QX0VYUCwJCS8qIEV4cG9uZW50aWF0aW9uICovCisKKyAgLyogQysrLiAgKi8KKworICBCSU5PUF9NSU4sCQkvKiA8PyAqLworICBCSU5PUF9NQVgsCQkvKiA+PyAqLworICBCSU5PUF9TQ09QRSwJCS8qIDo6ICovCisKKyAgLyogU1RSVUNUT1BfTUVNQkVSIGlzIHVzZWQgZm9yIHBvaW50ZXItdG8tbWVtYmVyIGNvbnN0cnVjdHMuCisgICAgIFggLiAqIFkgdHJhbnNsYXRlcyBpbnRvIFggU1RSVUNUT1BfTUVNQkVSIFkuICAqLworICBTVFJVQ1RPUF9NRU1CRVIsCisKKyAgLyogU1RSVUNUT1BfTVBUUiBpcyB1c2VkIGZvciBwb2ludGVyLXRvLW1lbWJlciBjb25zdHJ1Y3RzCisgICAgIHdoZW4gWCBpcyBhIHBvaW50ZXIgaW5zdGVhZCBvZiBhbiBhZ2dyZWdhdGUuICAqLworICBTVFJVQ1RPUF9NUFRSLAorCisgIC8qIGVuZCBvZiBDKysuICAqLworCisgIC8qIEZvciBNb2R1bGEtMiBpbnRlZ2VyIGRpdmlzaW9uIERJViAqLworICBCSU5PUF9JTlRESVYsCisKKyAgQklOT1BfQVNTSUdOX01PRElGWSwJLyogKz0sIC09LCAqPSwgYW5kIHNvIG9uLgorCQkJICAgVGhlIGZvbGxvd2luZyBleHBfZWxlbWVudCBpcyBhbm90aGVyIG9wY29kZSwKKwkJCSAgIGEgQklOT1BfLCBzYXlpbmcgaG93IHRvIG1vZGlmeS4KKwkJCSAgIFRoZW4gY29tZXMgYW5vdGhlciBCSU5PUF9BU1NJR05fTU9ESUZZLAorCQkJICAgbWFraW5nIHRocmVlIGV4cF9lbGVtZW50cyBpbiB0b3RhbC4gICovCisKKyAgLyogTW9kdWxhLTIgc3RhbmRhcmQgKGJpbmFyeSkgcHJvY2VkdXJlcyAqLworICBCSU5PUF9WQUwsCisgIEJJTk9QX0lOQ0wsCisgIEJJTk9QX0VYQ0wsCisKKyAgLyogQ29uY2F0ZW5hdGUgdHdvIG9wZXJhbmRzLCBzdWNoIGFzIGNoYXJhY3RlciBzdHJpbmdzIG9yIGJpdHN0cmluZ3MuCisgICAgIElmIHRoZSBmaXJzdCBvcGVyYW5kIGlzIGEgaW50ZWdlciBleHByZXNzaW9uLCB0aGVuIGl0IG1lYW5zIGNvbmNhdGVuYXRlCisgICAgIHRoZSBzZWNvbmQgb3BlcmFuZCB3aXRoIGl0c2VsZiB0aGF0IG1hbnkgdGltZXMuICovCisgIEJJTk9QX0NPTkNBVCwKKworICAvKiBGb3IgQ2hpbGwgYW5kIFBhc2NhbC4gKi8KKyAgQklOT1BfSU4sIC8qIFJldHVybnMgMSBpZmYgQVJHMSBJTiBBUkcyLiAqLworCisgIC8qIFRoaXMgaXMgdGhlICJjb2xvbiBvcGVyYXRvciIgdXNlZCB2YXJpb3VzIHBsYWNlcyBpbiBDaGlsbC4gKi8KKyAgQklOT1BfUkFOR0UsCisKKyAgLyogVGhpcyBtdXN0IGJlIHRoZSBoaWdoZXN0IEJJTk9QXyB2YWx1ZSwgZm9yIGV4cHByaW50LmMuICAqLworICBCSU5PUF9FTkQsCisKKyAgLyogT3BlcmF0ZXMgb24gdGhyZWUgdmFsdWVzIGNvbXB1dGVkIGJ5IGZvbGxvd2luZyBzdWJleHByZXNzaW9ucy4gICovCisgIFRFUk5PUF9DT05ELAkJLyogPzogKi8KKworICAvKiBBIHN1Yi1zdHJpbmcvc3ViLWFycmF5LiAgQ2hpbGwgc3ludGF4OiAgT1AxKE9QMjpPUDMpLgorICAgICBSZXR1cm4gZWxlbWVudHMgT1AyIHRocm91Z2ggT1AzIG9mIE9QMS4gICovCisgIFRFUk5PUF9TTElDRSwKKworICAvKiBBIHN1Yi1zdHJpbmcvc3ViLWFycmF5LiAgQ2hpbGwgc3ludGF4OiAgT1AxKE9QMiBVUCBPUDMpLgorICAgICBSZXR1cm4gT1AzIGVsZW1lbnRzIG9mIE9QMSwgc3RhcnRpbmcgd2l0aCBlbGVtZW50IE9QMi4gKi8KKyAgVEVSTk9QX1NMSUNFX0NPVU5ULAorCisgIC8qIE11bHRpZGltZW5zaW9uYWwgc3Vic2NyaXB0IG9wZXJhdG9yLCBzdWNoIGFzIE1vZHVsYS0yIHhbYSxiLC4uLl0uCisgICAgIFRoZSBkaW1lbnNpb25hbGl0eSBpcyBlbmNvZGVkIGluIHRoZSBvcGVyYXRvciwgbGlrZSB0aGUgbnVtYmVyIG9mCisgICAgIGZ1bmN0aW9uIGFyZ3VtZW50cyBpbiBPUF9GVU5DQUxMLCBJLkUuIDxPUD48ZGltZW5zaW9uPjxPUD4uCisgICAgIFRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZm9sbG93aW5nIHN1YmV4cHJlc3Npb24gaXMgc3Vic2NyaXB0ZWQKKyAgICAgYnkgZWFjaCBvZiB0aGUgbmV4dCBmb2xsb3dpbmcgc3ViZXhwcmVzc2lvbnMsIG9uZSBwZXIgZGltZW5zaW9uLiAqLworICAgTVVMVElfU1VCU0NSSVBULAorCisgIC8qIFRoZSBPUF8uLi4gc2VyaWVzIHRha2UgaW1tZWRpYXRlIGZvbGxvd2luZyBhcmd1bWVudHMuCisgICAgIEFmdGVyIHRoZSBhcmd1bWVudHMgY29tZSBhbm90aGVyIE9QXy4uLiAodGhlIHNhbWUgb25lKQorICAgICBzbyB0aGF0IHRoZSBncm91cGluZyBjYW4gYmUgcmVjb2duaXplZCBmcm9tIHRoZSBlbmQuICAqLworCisgIC8qIE9QX0xPTkcgaXMgZm9sbG93ZWQgYnkgYSB0eXBlIHBvaW50ZXIgaW4gdGhlIG5leHQgZXhwX2VsZW1lbnQKKyAgICAgYW5kIHRoZSBsb25nIGNvbnN0YW50IHZhbHVlIGluIHRoZSBmb2xsb3dpbmcgZXhwX2VsZW1lbnQuCisgICAgIFRoZW4gY29tZXMgYW5vdGhlciBPUF9MT05HLgorICAgICBUaHVzLCB0aGUgb3BlcmF0aW9uIG9jY3VwaWVzIGZvdXIgZXhwX2VsZW1lbnRzLiAgKi8KKyAgT1BfTE9ORywKKworICAvKiBPUF9ET1VCTEUgaXMgc2ltaWxhciBidXQgdGFrZXMgYSBET1VCTEVTVCBjb25zdGFudCBpbnN0ZWFkIG9mIGEgbG9uZy4gICovCisgIE9QX0RPVUJMRSwKKworICAvKiBPUF9WQVJfVkFMVUUgdGFrZXMgb25lIHN0cnVjdCBibG9jayAqIGluIHRoZSBmb2xsb3dpbmcgZWxlbWVudCwKKyAgICAgYW5kIG9uZSBzdHJ1Y3Qgc3ltYm9sICogaW4gdGhlIGZvbGxvd2luZyBleHBfZWxlbWVudCwgZm9sbG93ZWQgYnkKKyAgICAgYW5vdGhlciBPUF9WQVJfVkFMVUUsIG1ha2luZyBmb3VyIGV4cF9lbGVtZW50cy4gIElmIHRoZSBibG9jayBpcworICAgICBub24tTlVMTCwgZXZhbHVhdGUgdGhlIHN5bWJvbCByZWxhdGl2ZSB0byB0aGUgaW5uZXJtb3N0IGZyYW1lCisgICAgIGV4ZWN1dGluZyBpbiB0aGF0IGJsb2NrOyBpZiB0aGUgYmxvY2sgaXMgTlVMTCB1c2UgdGhlIHNlbGVjdGVkIGZyYW1lLiAgKi8KKyAgT1BfVkFSX1ZBTFVFLAorCisgIC8qIE9QX0xBU1QgaXMgZm9sbG93ZWQgYnkgYW4gaW50ZWdlciBpbiB0aGUgbmV4dCBleHBfZWxlbWVudC4KKyAgICAgVGhlIGludGVnZXIgaXMgemVybyBmb3IgdGhlIGxhc3QgdmFsdWUgcHJpbnRlZCwKKyAgICAgb3IgaXQgaXMgdGhlIGFic29sdXRlIG51bWJlciBvZiBhIGhpc3RvcnkgZWxlbWVudC4KKyAgICAgV2l0aCBhbm90aGVyIE9QX0xBU1QgYXQgdGhlIGVuZCwgdGhpcyBtYWtlcyB0aHJlZSBleHBfZWxlbWVudHMuICAqLworICBPUF9MQVNULAorCisgIC8qIE9QX1JFR0lTVEVSIGlzIGZvbGxvd2VkIGJ5IGFuIGludGVnZXIgaW4gdGhlIG5leHQgZXhwX2VsZW1lbnQuCisgICAgIFRoaXMgaXMgdGhlIG51bWJlciBvZiBhIHJlZ2lzdGVyIHRvIGZldGNoIChhcyBhbiBpbnQpLgorICAgICBXaXRoIGFub3RoZXIgT1BfUkVHSVNURVIgYXQgdGhlIGVuZCwgdGhpcyBtYWtlcyB0aHJlZSBleHBfZWxlbWVudHMuICAqLworICBPUF9SRUdJU1RFUiwKKworICAvKiBPUF9JTlRFUk5BTFZBUiBpcyBmb2xsb3dlZCBieSBhbiBpbnRlcm5hbHZhciBwdHIgaW4gdGhlIG5leHQgZXhwX2VsZW1lbnQuCisgICAgIFdpdGggYW5vdGhlciBPUF9JTlRFUk5BTFZBUiBhdCB0aGUgZW5kLCB0aGlzIG1ha2VzIHRocmVlIGV4cF9lbGVtZW50cy4gICovCisgIE9QX0lOVEVSTkFMVkFSLAorCisgIC8qIE9QX0ZVTkNBTEwgaXMgZm9sbG93ZWQgYnkgYW4gaW50ZWdlciBpbiB0aGUgbmV4dCBleHBfZWxlbWVudC4KKyAgICAgVGhlIGludGVnZXIgaXMgdGhlIG51bWJlciBvZiBhcmdzIHRvIHRoZSBmdW5jdGlvbiBjYWxsLgorICAgICBUaGF0IG1hbnkgcGx1cyBvbmUgdmFsdWVzIGZyb20gZm9sbG93aW5nIHN1YmV4cHJlc3Npb25zCisgICAgIGFyZSB1c2VkLCB0aGUgZmlyc3Qgb25lIGJlaW5nIHRoZSBmdW5jdGlvbi4KKyAgICAgVGhlIGludGVnZXIgaXMgZm9sbG93ZWQgYnkgYSByZXBlYXQgb2YgT1BfRlVOQ0FMTCwKKyAgICAgbWFraW5nIHRocmVlIGV4cF9lbGVtZW50cy4gICovCisgIE9QX0ZVTkNBTEwsCisKKyAgLyogVGhpcyBpcyBFWEFDVExZIGxpa2UgT1BfRlVOQ0FMTCBidXQgaXMgc2VtYW50aWNhbGx5IGRpZmZlcmVudC4gIAorICAgICBJbiBGNzcsIGFycmF5IHN1YnNjcmlwdCBleHByZXNzaW9ucywgc3Vic3RyaW5nIGV4cHJlc3Npb25zCisgICAgIGFuZCBmdW5jdGlvbiBjYWxscyBhcmUgIGFsbCBleGFjdGx5IHRoZSBzYW1lIHN5bnRhY3RpY2FsbHkuIFRoZXkgbWF5IAorICAgICBvbmx5IGJlIGRpc21hYmlndWF0ZWQgYXQgcnVudGltZS4gIFRodXMgdGhpcyBvcGVyYXRvciwgd2hpY2ggCisgICAgIGluZGljYXRlcyB0aGF0IHdlIGhhdmUgZm91bmQgc29tZXRoaW5nIG9mIHRoZSBmb3JtIDxuYW1lPiAoIDxzdHVmZj4gKSAqLyAKKyAgT1BfRjc3X1VOREVURVJNSU5FRF9BUkdMSVNULAorICAKKyAgLyogVGhlIGZvbGxvd2luZyBPUCBpcyBhIHNwZWNpYWwgb25lLCBpdCBpbnRyb2R1Y2VzIGEgRjc3IGNvbXBsZXgKKyAgICAgbGl0ZXJhbC4gSXQgaXMgZm9sbG93ZWQgYnkgZXhhY3RseSB0d28gYXJncyB0aGF0IGFyZSBkb3VibGVzLiAgKi8gCisgIE9QX0NPTVBMRVgsCisKKyAgLyogT1BfU1RSSU5HIHJlcHJlc2VudHMgYSBzdHJpbmcgY29uc3RhbnQuCisgICAgIEl0cyBmb3JtYXQgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiBhIFNUUlVDVE9QLCBidXQgdGhlIHN0cmluZworICAgICBkYXRhIGlzIGp1c3QgbWFkZSBpbnRvIGEgc3RyaW5nIGNvbnN0YW50IHdoZW4gdGhlIG9wZXJhdGlvbgorICAgICBpcyBleGVjdXRlZC4gICovCisgIE9QX1NUUklORywKKworICAvKiBPUF9CSVRTVFJJTkcgcmVwcmVzZW50cyBhIHBhY2tlZCBiaXRzdHJpbmcgY29uc3RhbnQuCisgICAgIEl0cyBmb3JtYXQgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiBhIFNUUlVDVE9QLCBidXQgdGhlIGJpdHN0cmluZworICAgICBkYXRhIGlzIGp1c3QgbWFkZSBpbnRvIGEgYml0c3RyaW5nIGNvbnN0YW50IHdoZW4gdGhlIG9wZXJhdGlvbgorICAgICBpcyBleGVjdXRlZC4gICovCisgIE9QX0JJVFNUUklORywKKworICAvKiBPUF9BUlJBWSBjcmVhdGVzIGFuIGFycmF5IGNvbnN0YW50IG91dCBvZiB0aGUgZm9sbG93aW5nIHN1YmV4cHJlc3Npb25zLgorICAgICBJdCBpcyBmb2xsb3dlZCBieSB0d28gZXhwX2VsZW1lbnRzLCB0aGUgZmlyc3QgY29udGFpbmluZyBhbiBpbnRlZ2VyCisgICAgIHRoYXQgaXMgdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBhcnJheSBhbmQgdGhlIHNlY29uZCBjb250YWluaW5nIGFub3RoZXIKKyAgICAgaW50ZWdlciB0aGF0IGlzIHRoZSB1cHBlciBib3VuZCBvZiB0aGUgYXJyYXkuICBUaGUgc2Vjb25kIGludGVnZXIgaXMKKyAgICAgZm9sbG93ZWQgYnkgYSByZXBlYXQgb2YgT1BfQVJSQVksIG1ha2luZyBmb3VyIGV4cF9lbGVtZW50cyB0b3RhbC4KKyAgICAgVGhlIGJvdW5kcyBhcmUgdXNlZCB0byBjb21wdXRlIHRoZSBudW1iZXIgb2YgZm9sbG93aW5nIHN1YmV4cHJlc3Npb25zCisgICAgIHRvIGNvbnN1bWUsIGFzIHdlbGwgYXMgc2V0dGluZyB0aGUgYm91bmRzIGluIHRoZSBjcmVhdGVkIGFycmF5IGNvbnN0YW50LgorICAgICBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgaXMgdGFrZW4gZnJvbSB0aGUgdHlwZSBvZiB0aGUgZmlyc3Qgc3ViZXhwLAorICAgICBhbmQgdGhleSBtdXN0IGFsbCBtYXRjaC4gKi8KKyAgT1BfQVJSQVksCisKKyAgLyogVU5PUF9DQVNUIGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBwb2ludGVyIGluIHRoZSBuZXh0IGV4cF9lbGVtZW50LgorICAgICBXaXRoIGFub3RoZXIgVU5PUF9DQVNUIGF0IHRoZSBlbmQsIHRoaXMgbWFrZXMgdGhyZWUgZXhwX2VsZW1lbnRzLgorICAgICBJdCBjYXN0cyB0aGUgdmFsdWUgb2YgdGhlIGZvbGxvd2luZyBzdWJleHByZXNzaW9uLiAgKi8KKyAgVU5PUF9DQVNULAorCisgIC8qIFVOT1BfTUVNVkFMIGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBwb2ludGVyIGluIHRoZSBuZXh0IGV4cF9lbGVtZW50CisgICAgIFdpdGggYW5vdGhlciBVTk9QX01FTVZBTCBhdCB0aGUgZW5kLCB0aGlzIG1ha2VzIHRocmVlIGV4cF9lbGVtZW50cy4KKyAgICAgSXQgY2FzdHMgdGhlIGNvbnRlbnRzIG9mIHRoZSB3b3JkIGFkZHJlc3NlZCBieSB0aGUgdmFsdWUgb2YgdGhlCisgICAgIGZvbGxvd2luZyBzdWJleHByZXNzaW9uLiAgKi8KKyAgVU5PUF9NRU1WQUwsCisKKyAgLyogVU5PUF8uLi4gb3BlcmF0ZSBvbiBvbmUgdmFsdWUgZnJvbSBhIGZvbGxvd2luZyBzdWJleHByZXNzaW9uCisgICAgIGFuZCByZXBsYWNlIGl0IHdpdGggYSByZXN1bHQuICBUaGV5IHRha2Ugbm8gaW1tZWRpYXRlIGFyZ3VtZW50cy4gICovCisKKyAgVU5PUF9ORUcsCQkvKiBVbmFyeSAtICovCisgIFVOT1BfTE9HSUNBTF9OT1QsCS8qIFVuYXJ5ICEgKi8KKyAgVU5PUF9DT01QTEVNRU5ULAkvKiBVbmFyeSB+ICovCisgIFVOT1BfSU5ELAkJLyogVW5hcnkgKiAqLworICBVTk9QX0FERFIsCQkvKiBVbmFyeSAmICovCisgIFVOT1BfUFJFSU5DUkVNRU5ULAkvKiArKyBiZWZvcmUgYW4gZXhwcmVzc2lvbiAqLworICBVTk9QX1BPU1RJTkNSRU1FTlQsCS8qICsrIGFmdGVyIGFuIGV4cHJlc3Npb24gKi8KKyAgVU5PUF9QUkVERUNSRU1FTlQsCS8qIC0tIGJlZm9yZSBhbiBleHByZXNzaW9uICovCisgIFVOT1BfUE9TVERFQ1JFTUVOVCwJLyogLS0gYWZ0ZXIgYW4gZXhwcmVzc2lvbiAqLworICBVTk9QX1NJWkVPRiwJCS8qIFVuYXJ5IHNpemVvZiAoZm9sbG93ZWQgYnkgZXhwcmVzc2lvbikgKi8KKworICBVTk9QX1BMVVMsCQkvKiBVbmFyeSBwbHVzICovCisKKyAgVU5PUF9DQVAsCQkvKiBNb2R1bGEtMiBzdGFuZGFyZCAodW5hcnkpIHByb2NlZHVyZXMgKi8KKyAgVU5PUF9DSFIsCisgIFVOT1BfT1JELAorICBVTk9QX0FCUywKKyAgVU5PUF9GTE9BVCwKKyAgVU5PUF9ISUdILAorICBVTk9QX01BWCwKKyAgVU5PUF9NSU4sCisgIFVOT1BfT0RELAorICBVTk9QX1RSVU5DLAorCisgIC8qIENoaWxsIGJ1aWx0aW4gZnVuY3Rpb25zLiAqLworICBVTk9QX0xPV0VSLCBVTk9QX1VQUEVSLCBVTk9QX0xFTkdUSCwgVU5PUF9DQVJELCBVTk9QX0NITUFYLCBVTk9QX0NITUlOLAorCisgIE9QX0JPT0wsCQkvKiBNb2R1bGEtMiBidWlsdGluIEJPT0xFQU4gdHlwZSAqLworICBPUF9NMl9TVFJJTkcsCQkvKiBNb2R1bGEtMiBzdHJpbmcgY29uc3RhbnRzICovCisKKyAgLyogU1RSVUNUT1BfLi4uIG9wZXJhdGUgb24gYSB2YWx1ZSBmcm9tIGEgZm9sbG93aW5nIHN1YmV4cHJlc3Npb24KKyAgICAgYnkgZXh0cmFjdGluZyBhIHN0cnVjdHVyZSBjb21wb25lbnQgc3BlY2lmaWVkIGJ5IGEgc3RyaW5nCisgICAgIHRoYXQgYXBwZWFycyBpbiB0aGUgZm9sbG93aW5nIGV4cF9lbGVtZW50cyAoYXMgbWFueSBhcyBuZWVkZWQpLgorICAgICBTVFJVQ1RPUF9TVFJVQ1QgaXMgdXNlZCBmb3IgIi4iIGFuZCBTVFJVQ1RPUF9QVFIgZm9yICItPiIuCisgICAgIFRoZXkgZGlmZmVyIG9ubHkgaW4gdGhlIGVycm9yIG1lc3NhZ2UgZ2l2ZW4gaW4gY2FzZSB0aGUgdmFsdWUgaXMKKyAgICAgbm90IHN1aXRhYmxlIG9yIHRoZSBzdHJ1Y3R1cmUgY29tcG9uZW50IHNwZWNpZmllZCBpcyBub3QgZm91bmQuCisKKyAgICAgVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGZvbGxvd3MgdGhlIG9wY29kZSwgZm9sbG93ZWQgYnkKKyAgICAgQllURVNfVE9fRVhQX0VMRU0obGVuZ3RoKSBlbGVtZW50cyBjb250YWluaW5nIHRoZSBkYXRhIG9mIHRoZQorICAgICBzdHJpbmcsIGZvbGxvd2VkIGJ5IHRoZSBsZW5ndGggYWdhaW4gYW5kIHRoZSBvcGNvZGUgYWdhaW4uICAqLworCisgIFNUUlVDVE9QX1NUUlVDVCwKKyAgU1RSVUNUT1BfUFRSLAorCisgIC8qIEMrKyAqLworICAvKiBPUF9USElTIGlzIGp1c3QgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGNsYXNzIGluc3RhbmNlIHZhcmlhYmxlLgorICAgICBJdCBqdXN0IGNvbWVzIGluIGEgdGlnaHQgKE9QX1RISVMsIE9QX1RISVMpIHBhaXIuICAqLworICBPUF9USElTLAorCisgIC8qIE9QX1NDT1BFIHN1cnJvdW5kcyBhIHR5cGUgbmFtZSBhbmQgYSBmaWVsZCBuYW1lLiAgVGhlIHR5cGUKKyAgICAgbmFtZSBpcyBlbmNvZGVkIGFzIG9uZSBlbGVtZW50LCBidXQgdGhlIGZpZWxkIG5hbWUgc3RheXMgYXMKKyAgICAgYSBzdHJpbmcsIHdoaWNoLCBvZiBjb3Vyc2UsIGlzIHZhcmlhYmxlIGxlbmd0aC4gICovCisgIE9QX1NDT1BFLAorCisgIC8qIFVzZWQgdG8gcmVwcmVzZW50IG5hbWVkIHN0cnVjdHVyZSBmaWVsZCB2YWx1ZXMgaW4gYnJhY2UgaW5pdGlhbGl6ZXJzCisgICAgIChvciB0dXBsZXMgYXMgdGhleSBhcmUgY2FsbGVkIGluIENoaWxsKS4KKyAgICAgVGhlIGdjYyBDIHN5bnRheCBpcyBOQU1FOlZBTFVFIG9yIC5OQU1FPVZBTFVFLCB0aGUgQ2hpbGwgc3ludGF4IGlzCisgICAgIC5OQU1FOlZBTFVFLiAgTXVsdGlwbGUgbGFiZWxzIChhcyBpbiB0aGUgQ2hpbGwgc3ludGF4CisgICAgIC5OQU1FMSwuTkFNRTI6VkFMVUUpIGlzIHJlcHJlc2VudGVkIGFzIGlmIGl0IHdlcmUKKyAgICAgLk5BTUUxOiguTkFNRTI6VkFMVUUpICh0aG91Z2ggdGhhdCBpcyBub3QgdmFsaWQgQ2hpbGwgc3ludGF4KS4KKworICAgICBUaGUgTkFNRSBpcyByZXByZXNlbnRlZCBhcyBmb3IgU1RSVUNUT1BfU1RSVUNUOyAgVkFMVUUgZm9sbG93cy4gKi8KKyAgT1BfTEFCRUxFRCwKKworICAvKiBPUF9UWVBFIGlzIGZvciBwYXJzaW5nIHR5cGVzLCBhbmQgdXNlZCB3aXRoIHRoZSAicHR5cGUiIGNvbW1hbmQKKyAgICAgc28gd2UgY2FuIGxvb2sgdXAgdHlwZXMgdGhhdCBhcmUgcXVhbGlmaWVkIGJ5IHNjb3BlLCBlaXRoZXIgd2l0aAorICAgICB0aGUgR0RCICI6OiIgb3BlcmF0b3IsIG9yIHRoZSBNb2R1bGEtMiAnLicgb3BlcmF0b3IuICovCisgIE9QX1RZUEUsCisKKyAgLyogQW4gdW4tbG9va2VkLXVwIGlkZW50aWZpZXIuICovCisgIE9QX05BTUUsCisKKyAgLyogQW4gdW5wYXJzZWQgZXhwcmVzc2lvbi4gIFVzZWQgZm9yIFNjaGVtZSAoZm9yIG5vdyBhdCBsZWFzdCkgKi8KKyAgT1BfRVhQUlNUUklORworfTsKKwordW5pb24gZXhwX2VsZW1lbnQKK3sKKyAgZW51bSBleHBfb3Bjb2RlIG9wY29kZTsKKyAgc3RydWN0IHN5bWJvbCAqc3ltYm9sOworICBMT05HRVNUIGxvbmdjb25zdDsKKyAgRE9VQkxFU1QgZG91YmxlY29uc3Q7CisgIC8qIFJlYWxseSBzaXplb2YgKHVuaW9uIGV4cF9lbGVtZW50KSBjaGFyYWN0ZXJzIChvciBsZXNzIGZvciB0aGUgbGFzdAorICAgICBlbGVtZW50IG9mIGEgc3RyaW5nKS4gICovCisgIGNoYXIgc3RyaW5nOworICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgc3RydWN0IGludGVybmFsdmFyICppbnRlcm5hbHZhcjsKKyAgc3RydWN0IGJsb2NrICpibG9jazsKK307CisKK3N0cnVjdCBleHByZXNzaW9uCit7CisgIGNvbnN0IHN0cnVjdCBsYW5ndWFnZV9kZWZuICpsYW5ndWFnZV9kZWZuOyAgLyogbGFuZ3VhZ2UgaXQgd2FzIGVudGVyZWQgaW4gKi8KKyAgaW50IG5lbHRzOworICB1bmlvbiBleHBfZWxlbWVudCBlbHRzWzFdOworfTsKKworLyogTWFjcm9zIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gbnVtYmVyIG9mIGV4cHJlc3Npb24gZWxlbWVudHMgYW5kIGJ5dGVzCisgICB0byBzdG9yZSB0aGF0IG1hbnkgZXhwcmVzc2lvbiBlbGVtZW50cy4gKi8KKworI2RlZmluZSBFWFBfRUxFTV9UT19CWVRFUyhlbGVtZW50cykgXAorICAgICgoZWxlbWVudHMpICogc2l6ZW9mICh1bmlvbiBleHBfZWxlbWVudCkpCisjZGVmaW5lIEJZVEVTX1RPX0VYUF9FTEVNKGJ5dGVzKSBcCisgICAgKCgoYnl0ZXMpICsgc2l6ZW9mICh1bmlvbiBleHBfZWxlbWVudCkgLSAxKSAvIHNpemVvZiAodW5pb24gZXhwX2VsZW1lbnQpKQorCisvKiBGcm9tIHBhcnNlLmMgKi8KKworZXh0ZXJuIHN0cnVjdCBleHByZXNzaW9uICpwYXJzZV9leHByZXNzaW9uIFBBUkFNUyAoKGNoYXIgKikpOworCitleHRlcm4gc3RydWN0IGV4cHJlc3Npb24gKnBhcnNlX2V4cF8xIFBBUkFNUyAoKGNoYXIgKiosIHN0cnVjdCBibG9jayAqLCBpbnQpKTsKKworLyogVGhlIGlubmVybW9zdCBjb250ZXh0IHJlcXVpcmVkIGJ5IHRoZSBzdGFjayBhbmQgcmVnaXN0ZXIgdmFyaWFibGVzCisgICB3ZSd2ZSBlbmNvdW50ZXJlZCBzbyBmYXIuICBUbyB1c2UgdGhpcywgc2V0IGl0IHRvIE5VTEwsIHRoZW4gY2FsbAorICAgcGFyc2VfPHdoYXRldmVyPiwgdGhlbiBsb29rIGF0IGl0LiAgKi8KK2V4dGVybiBzdHJ1Y3QgYmxvY2sgKmlubmVybW9zdF9ibG9jazsKKworLyogRnJvbSBldmFsLmMgKi8KKworLyogVmFsdWVzIG9mIE5PU0lERSBhcmd1bWVudCB0byBldmFsX3N1YmV4cC4gICovCisKK2VudW0gbm9zaWRlCit7CisgIEVWQUxfTk9STUFMLAorICBFVkFMX1NLSVAsCQkJLyogT25seSBlZmZlY3QgaXMgdG8gaW5jcmVtZW50IHBvcy4gICovCisgIEVWQUxfQVZPSURfU0lERV9FRkZFQ1RTCS8qIERvbid0IG1vZGlmeSBhbnkgdmFyaWFibGVzIG9yCisJCQkJICAgY2FsbCBhbnkgZnVuY3Rpb25zLiAgVGhlIHZhbHVlCisJCQkJICAgcmV0dXJuZWQgd2lsbCBoYXZlIHRoZSBjb3JyZWN0CisJCQkJICAgdHlwZSwgYW5kIHdpbGwgaGF2ZSBhbgorCQkJCSAgIGFwcHJveGltYXRlbHkgY29ycmVjdCBsdmFsdWUKKwkJCQkgICB0eXBlIChpbmFjY3VyYWN5OiBhbnl0aGluZyB0aGF0IGlzCisJCQkJICAgbGlzdGVkIGFzIGJlaW5nIGluIGEgcmVnaXN0ZXIgaW4KKwkJCQkgICB0aGUgZnVuY3Rpb24gaW4gd2hpY2ggaXQgd2FzCisJCQkJICAgZGVjbGFyZWQgd2lsbCBiZSBsdmFsX3JlZ2lzdGVyKS4gICovCit9OworCitleHRlcm4gc3RydWN0IHZhbHVlKiBldmFsdWF0ZV9zdWJleHBfc3RhbmRhcmQKK1BBUkFNUyAoKHN0cnVjdCB0eXBlICosIHN0cnVjdCBleHByZXNzaW9uICosIGludCosIGVudW0gbm9zaWRlKSk7CisKKy8qIEZyb20gZXhwcHJpbnQuYyAqLworCitleHRlcm4gdm9pZCBwcmludF9leHByZXNzaW9uIFBBUkFNUyAoKHN0cnVjdCBleHByZXNzaW9uICosIEdEQl9GSUxFICopKTsKKworZXh0ZXJuIGNoYXIgKm9wX3N0cmluZyBQQVJBTVMgKChlbnVtIGV4cF9vcGNvZGUpKTsKKworI2lmZGVmIE1BSU5URU5BTkNFX0NNRFMKK2V4dGVybiB2b2lkIGR1bXBfcHJlZml4X2V4cHJlc3Npb24gUEFSQU1TICgoc3RydWN0IGV4cHJlc3Npb24gKiwKKwkJCQkJICAgIEdEQl9GSUxFICosCisJCQkJCSAgICBjaGFyICopKTsKK2V4dGVybiB2b2lkIGR1bXBfcG9zdGZpeF9leHByZXNzaW9uIFBBUkFNUyAoKHN0cnVjdCBleHByZXNzaW9uICosCisJCQkJCSAgICAgR0RCX0ZJTEUgKiwKKwkJCQkJICAgICBjaGFyICopKTsKKyNlbmRpZiAvKiBNQUlOVEVOQU5DRV9DTURTICovCisKKyNlbmRpZgkvKiAhZGVmaW5lZCAoRVhQUkVTU0lPTl9IKSAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2YtZXhwLnkgYi9nZGIvZi1leHAueQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTFmNzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2YtZXhwLnkKQEAgLTAsMCArMSwxMTc0IEBACisvKiBZQUNDIHBhcnNlciBmb3IgRm9ydHJhbiBleHByZXNzaW9ucywgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0CisgICAgICAgICAgICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBNb3Rvcm9sYS4gIEFkYXB0ZWQgZnJvbSB0aGUgQyBwYXJzZXIgYnkgRmFyb29xIEJ1dHQKKyAgIChmbWJ1dHRAZW5nYWdlLnNwcy5tb3QuY29tKS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIHdhcyBibGFudGFudGx5IHJpcHBlZCBvZmYgdGhlIEMgZXhwcmVzc2lvbiBwYXJzZXIsIHBsZWFzZSAKKyAgIGJlIGF3YXJlIG9mIHRoYXQgYXMgeW91IGxvb2sgYXQgaXRzIGJhc2ljIHN0cnVjdHVyZSAtRk1CICovIAorCisvKiBQYXJzZSBhIEY3NyBleHByZXNzaW9uIGZyb20gdGV4dCBpbiBhIHN0cmluZywKKyAgIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhICBzdHJ1Y3QgZXhwcmVzc2lvbiAgcG9pbnRlci4KKyAgIFRoYXQgc3RydWN0dXJlIGNvbnRhaW5zIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBpbiByZXZlcnNlIHBvbGlzaCwKKyAgIHdpdGggY29uc3RhbnRzIHJlcHJlc2VudGVkIGJ5IG9wZXJhdGlvbnMgdGhhdCBhcmUgZm9sbG93ZWQgYnkgc3BlY2lhbCBkYXRhLgorICAgU2VlIGV4cHJlc3Npb24uaCBmb3IgdGhlIGRldGFpbHMgb2YgdGhlIGZvcm1hdC4KKyAgIFdoYXQgaXMgaW1wb3J0YW50IGhlcmUgaXMgdGhhdCBpdCBjYW4gYmUgYnVpbHQgdXAgc2VxdWVudGlhbGx5CisgICBkdXJpbmcgdGhlIHByb2Nlc3Mgb2YgcGFyc2luZzsgdGhlIGxvd2VyIGxldmVscyBvZiB0aGUgdHJlZSBhbHdheXMKKyAgIGNvbWUgZmlyc3QgaW4gdGhlIHJlc3VsdC4KKworICAgTm90ZSB0aGF0IG1hbGxvYydzIGFuZCByZWFsbG9jJ3MgaW4gdGhpcyBmaWxlIGFyZSB0cmFuc2Zvcm1lZCB0bworICAgeG1hbGxvYyBhbmQgeHJlYWxsb2MgcmVzcGVjdGl2ZWx5IGJ5IHRoZSBzYW1lIHNlZCBjb21tYW5kIGluIHRoZQorICAgbWFrZWZpbGUgdGhhdCByZW1hcHMgYW55IG90aGVyIG1hbGxvYy9yZWFsbG9jIGluc2VydGVkIGJ5IHRoZSBwYXJzZXIKKyAgIGdlbmVyYXRvci4gIERvaW5nIHRoaXMgd2l0aCAjZGVmaW5lcyBhbmQgdHJ5aW5nIHRvIGNvbnRyb2wgdGhlIGludGVyYWN0aW9uCisgICB3aXRoIGluY2x1ZGUgZmlsZXMgKDxtYWxsb2MuaD4gYW5kIDxzdGRsaWIuaD4gZm9yIGV4YW1wbGUpIGp1c3QgYmVjYW1lCisgICB0b28gbWVzc3ksIHBhcnRpY3VsYXJseSB3aGVuIHN1Y2ggaW5jbHVkZXMgY2FuIGJlIGluc2VydGVkIGF0IHJhbmRvbQorICAgdGltZXMgYnkgdGhlIHBhcnNlciBnZW5lcmF0b3IuICAqLworICAgCisleworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJwYXJzZXItZGVmcy5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAiZi1sYW5nLmgiCisjaW5jbHVkZSAiYmZkLmgiIC8qIFJlcXVpcmVkIGJ5IG9iamZpbGVzLmguICAqLworI2luY2x1ZGUgInN5bWZpbGUuaCIgLyogUmVxdWlyZWQgYnkgb2JqZmlsZXMuaC4gICovCisjaW5jbHVkZSAib2JqZmlsZXMuaCIgLyogRm9yIGhhdmVfZnVsbF9zeW1ib2xzIGFuZCBoYXZlX3BhcnRpYWxfc3ltYm9scyAqLworCisvKiBSZW1hcCBub3JtYWwgeWFjYyBwYXJzZXIgaW50ZXJmYWNlIG5hbWVzICh5eXBhcnNlLCB5eWxleCwgeXllcnJvciwgZXRjKSwKKyAgIGFzIHdlbGwgYXMgZ3JhdHVpdGlvdXNseSBnbG9iYWwgc3ltYm9sIG5hbWVzLCBzbyB3ZSBjYW4gaGF2ZSBtdWx0aXBsZQorICAgeWFjYyBnZW5lcmF0ZWQgcGFyc2VycyBpbiBnZGIuICBOb3RlIHRoYXQgdGhlc2UgYXJlIG9ubHkgdGhlIHZhcmlhYmxlcworICAgcHJvZHVjZWQgYnkgeWFjYy4gIElmIG90aGVyIHBhcnNlciBnZW5lcmF0b3JzIChiaXNvbiwgYnlhY2MsIGV0YykgcHJvZHVjZQorICAgYWRkaXRpb25hbCBnbG9iYWwgbmFtZXMgdGhhdCBjb25mbGljdCBhdCBsaW5rIHRpbWUsIHRoZW4gdGhvc2UgcGFyc2VyCisgICBnZW5lcmF0b3JzIG5lZWQgdG8gYmUgZml4ZWQgaW5zdGVhZCBvZiBhZGRpbmcgdGhvc2UgbmFtZXMgdG8gdGhpcyBsaXN0LiAqLworCisjZGVmaW5lCXl5bWF4ZGVwdGggZl9tYXhkZXB0aAorI2RlZmluZQl5eXBhcnNlCWZfcGFyc2UKKyNkZWZpbmUJeXlsZXgJZl9sZXgKKyNkZWZpbmUJeXllcnJvcglmX2Vycm9yCisjZGVmaW5lCXl5bHZhbAlmX2x2YWwKKyNkZWZpbmUJeXljaGFyCWZfY2hhcgorI2RlZmluZQl5eWRlYnVnCWZfZGVidWcKKyNkZWZpbmUJeXlwYWN0CWZfcGFjdAkKKyNkZWZpbmUJeXlyMQlmX3IxCQkJCisjZGVmaW5lCXl5cjIJZl9yMgkJCQorI2RlZmluZQl5eWRlZglmX2RlZgkJCisjZGVmaW5lCXl5Y2hrCWZfY2hrCQkKKyNkZWZpbmUJeXlwZ28JZl9wZ28JCQorI2RlZmluZQl5eWFjdAlmX2FjdAkJCisjZGVmaW5lCXl5ZXhjYQlmX2V4Y2EKKyNkZWZpbmUgeXllcnJmbGFnIGZfZXJyZmxhZworI2RlZmluZSB5eW5lcnJzCWZfbmVycnMKKyNkZWZpbmUJeXlwcwlmX3BzCisjZGVmaW5lCXl5cHYJZl9wdgorI2RlZmluZQl5eXMJZl9zCisjZGVmaW5lCXl5X3l5cwlmX3l5cworI2RlZmluZQl5eXN0YXRlCWZfc3RhdGUKKyNkZWZpbmUJeXl0bXAJZl90bXAKKyNkZWZpbmUJeXl2CWZfdgorI2RlZmluZQl5eV95eXYJZl95eXYKKyNkZWZpbmUJeXl2YWwJZl92YWwKKyNkZWZpbmUJeXlsbG9jCWZfbGxvYworI2RlZmluZSB5eXJlZHMJZl9yZWRzCQkvKiBXaXRoIFlZREVCVUcgZGVmaW5lZCAqLworI2RlZmluZSB5eXRva3MJZl90b2tzCQkvKiBXaXRoIFlZREVCVUcgZGVmaW5lZCAqLworI2RlZmluZSB5eWxocwlmX3l5bGhzCisjZGVmaW5lIHl5bGVuCWZfeXlsZW4KKyNkZWZpbmUgeXlkZWZyZWQgZl95eWRlZnJlZAorI2RlZmluZSB5eWRnb3RvCWZfeXlkZ290bworI2RlZmluZSB5eXNpbmRleCBmX3l5c2luZGV4CisjZGVmaW5lIHl5cmluZGV4IGZfeXlyaW5kZXgKKyNkZWZpbmUgeXlnaW5kZXggZl95eWdpbmRleAorI2RlZmluZSB5eXRhYmxlCSBmX3l5dGFibGUKKyNkZWZpbmUgeXljaGVjawkgZl95eWNoZWNrCisKKyNpZm5kZWYgWVlERUJVRworI2RlZmluZQlZWURFQlVHCTEJCS8qIERlZmF1bHQgdG8gbm8geXlkZWJ1ZyBzdXBwb3J0ICovCisjZW5kaWYKKworaW50IHl5cGFyc2UgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgaW50IHl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKKwordm9pZCB5eWVycm9yIFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgdm9pZCBncm93YnVmX2J5X3NpemUgUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyBpbnQgbWF0Y2hfc3RyaW5nX2xpdGVyYWwgUEFSQU1TICgodm9pZCkpOworCislfQorCisvKiBBbHRob3VnaCB0aGUgeWFjYyAidmFsdWUiIG9mIGFuIGV4cHJlc3Npb24gaXMgbm90IHVzZWQsCisgICBzaW5jZSB0aGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB0aGUgc3RydWN0dXJlIGJlaW5nIGNyZWF0ZWQsCisgICBvdGhlciBub2RlIHR5cGVzIGRvIGhhdmUgdmFsdWVzLiAgKi8KKworJXVuaW9uCisgIHsKKyAgICBMT05HRVNUIGx2YWw7CisgICAgc3RydWN0IHsKKyAgICAgIExPTkdFU1QgdmFsOworICAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgfSB0eXBlZF92YWw7CisgICAgRE9VQkxFU1QgZHZhbDsKKyAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgICAgc3RydWN0IHR5cGUgKnR2YWw7CisgICAgc3RydWN0IHN0b2tlbiBzdmFsOworICAgIHN0cnVjdCB0dHlwZSB0c3ltOworICAgIHN0cnVjdCBzeW10b2tlbiBzc3ltOworICAgIGludCB2b2lkdmFsOworICAgIHN0cnVjdCBibG9jayAqYnZhbDsKKyAgICBlbnVtIGV4cF9vcGNvZGUgb3Bjb2RlOworICAgIHN0cnVjdCBpbnRlcm5hbHZhciAqaXZhcjsKKworICAgIHN0cnVjdCB0eXBlICoqdHZlYzsKKyAgICBpbnQgKml2ZWM7CisgIH0KKworJXsKKy8qIFlZU1RZUEUgZ2V0cyBkZWZpbmVkIGJ5ICV1bmlvbiAqLworc3RhdGljIGludCBwYXJzZV9udW1iZXIgUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCwgWVlTVFlQRSAqKSk7CislfQorCisldHlwZSA8dm9pZHZhbD4gZXhwICB0eXBlX2V4cCBzdGFydCB2YXJpYWJsZSAKKyV0eXBlIDx0dmFsPiB0eXBlIHR5cGViYXNlCisldHlwZSA8dHZlYz4gbm9uZW1wdHlfdHlwZWxpc3QKKy8qICV0eXBlIDxidmFsPiBibG9jayAqLworCisvKiBGYW5jeSB0eXBlIHBhcnNpbmcuICAqLworJXR5cGUgPHZvaWR2YWw+IGZ1bmNfbW9kIGRpcmVjdF9hYnNfZGVjbCBhYnNfZGVjbAorJXR5cGUgPHR2YWw+IHB0eXBlCisKKyV0b2tlbiA8dHlwZWRfdmFsPiBJTlQKKyV0b2tlbiA8ZHZhbD4gRkxPQVQKKworLyogQm90aCBOQU1FIGFuZCBUWVBFTkFNRSB0b2tlbnMgcmVwcmVzZW50IHN5bWJvbHMgaW4gdGhlIGlucHV0LAorICAgYW5kIGJvdGggY29udmV5IHRoZWlyIGRhdGEgYXMgc3RyaW5ncy4KKyAgIEJ1dCBhIFRZUEVOQU1FIGlzIGEgc3RyaW5nIHRoYXQgaGFwcGVucyB0byBiZSBkZWZpbmVkIGFzIGEgdHlwZWRlZgorICAgb3IgYnVpbHRpbiB0eXBlIG5hbWUgKHN1Y2ggYXMgaW50IG9yIGNoYXIpCisgICBhbmQgYSBOQU1FIGlzIGFueSBvdGhlciBzeW1ib2wuCisgICBDb250ZXh0cyB3aGVyZSB0aGlzIGRpc3RpbmN0aW9uIGlzIG5vdCBpbXBvcnRhbnQgY2FuIHVzZSB0aGUKKyAgIG5vbnRlcm1pbmFsICJuYW1lIiwgd2hpY2ggbWF0Y2hlcyBlaXRoZXIgTkFNRSBvciBUWVBFTkFNRS4gICovCisKKyV0b2tlbiA8c3ZhbD4gU1RSSU5HX0xJVEVSQUwKKyV0b2tlbiA8bHZhbD4gQk9PTEVBTl9MSVRFUkFMCisldG9rZW4gPHNzeW0+IE5BTUUgCisldG9rZW4gPHRzeW0+IFRZUEVOQU1FCisldHlwZSA8c3ZhbD4gbmFtZQorJXR5cGUgPHNzeW0+IG5hbWVfbm90X3R5cGVuYW1lCisldHlwZSA8dHN5bT4gdHlwZW5hbWUKKworLyogQSBOQU1FX09SX0lOVCBpcyBhIHN5bWJvbCB3aGljaCBpcyBub3Qga25vd24gaW4gdGhlIHN5bWJvbCB0YWJsZSwKKyAgIGJ1dCB3aGljaCB3b3VsZCBwYXJzZSBhcyBhIHZhbGlkIG51bWJlciBpbiB0aGUgY3VycmVudCBpbnB1dCByYWRpeC4KKyAgIEUuZy4gImMiIHdoZW4gaW5wdXRfcmFkaXg9PTE2LiAgRGVwZW5kaW5nIG9uIHRoZSBwYXJzZSwgaXQgd2lsbCBiZQorICAgdHVybmVkIGludG8gYSBuYW1lIG9yIGludG8gYSBudW1iZXIuICAqLworCisldG9rZW4gPHNzeW0+IE5BTUVfT1JfSU5UIAorCisldG9rZW4gIFNJWkVPRiAKKyV0b2tlbiBFUlJPUgorCisvKiBTcGVjaWFsIHR5cGUgY2FzZXMsIHB1dCBpbiB0byBhbGxvdyB0aGUgcGFyc2VyIHRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudAorICAgbGVnYWwgYmFzZXR5cGVzLiAgKi8KKyV0b2tlbiBJTlRfS0VZV09SRCBJTlRfUzJfS0VZV09SRCBMT0dJQ0FMX1MxX0tFWVdPUkQgTE9HSUNBTF9TMl9LRVlXT1JEIAorJXRva2VuIExPR0lDQUxfS0VZV09SRCBSRUFMX0tFWVdPUkQgUkVBTF9TOF9LRVlXT1JEIFJFQUxfUzE2X0tFWVdPUkQgCisldG9rZW4gQ09NUExFWF9TOF9LRVlXT1JEIENPTVBMRVhfUzE2X0tFWVdPUkQgQ09NUExFWF9TMzJfS0VZV09SRCAKKyV0b2tlbiBCT09MX0FORCBCT09MX09SIEJPT0xfTk9UICAgCisldG9rZW4gPGx2YWw+IENIQVJBQ1RFUiAKKworJXRva2VuIDx2b2lkdmFsPiBWQVJJQUJMRQorCisldG9rZW4gPG9wY29kZT4gQVNTSUdOX01PRElGWQorCislbGVmdCAnLCcKKyVsZWZ0IEFCT1ZFX0NPTU1BCislcmlnaHQgJz0nIEFTU0lHTl9NT0RJRlkKKyVyaWdodCAnPycKKyVsZWZ0IEJPT0xfT1IKKyVyaWdodCBCT09MX05PVAorJWxlZnQgQk9PTF9BTkQKKyVsZWZ0ICd8JworJWxlZnQgJ14nCislbGVmdCAnJicKKyVsZWZ0IEVRVUFMIE5PVEVRVUFMCislbGVmdCBMRVNTVEhBTiBHUkVBVEVSVEhBTiBMRVEgR0VRCislbGVmdCBMU0ggUlNICislbGVmdCAnQCcKKyVsZWZ0ICcrJyAnLScKKyVsZWZ0ICcqJyAnLycgJyUnCislcmlnaHQgVU5BUlkgCislcmlnaHQgJygnCisKKwwKKyUlCisKK3N0YXJ0ICAgOglleHAKKwl8CXR5cGVfZXhwCisJOworCit0eXBlX2V4cDoJdHlwZQorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZShPUF9UWVBFKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF90eXBlKCQxKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7IH0KKwk7CisKK2V4cCAgICAgOiAgICAgICAnKCcgZXhwICcpJworICAgICAgICAJCXsgfQorICAgICAgICA7CisKKy8qIEV4cHJlc3Npb25zLCBub3QgaW5jbHVkaW5nIHRoZSBjb21tYSBvcGVyYXRvci4gICovCitleHAJOgknKicgZXhwICAgICVwcmVjIFVOQVJZCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0lORCk7IH0KKworZXhwCToJJyYnIGV4cCAgICAlcHJlYyBVTkFSWQorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9BRERSKTsgfQorCitleHAJOgknLScgZXhwICAgICVwcmVjIFVOQVJZCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX05FRyk7IH0KKwk7CisKK2V4cAk6CUJPT0xfTk9UIGV4cCAgICAlcHJlYyBVTkFSWQorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9MT0dJQ0FMX05PVCk7IH0KKwk7CisKK2V4cAk6CSd+JyBleHAgICAgJXByZWMgVU5BUlkKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ09NUExFTUVOVCk7IH0KKwk7CisKK2V4cAk6CVNJWkVPRiBleHAgICAgICAgJXByZWMgVU5BUlkKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfU0laRU9GKTsgfQorCTsKKworLyogTm8gbW9yZSBleHBsaWNpdCBhcnJheSBvcGVyYXRvcnMsIHdlIHRyZWF0IGV2ZXJ5dGhpbmcgaW4gRjc3IGFzIAorICAgYSBmdW5jdGlvbiBjYWxsLiAgVGhlIGRpc2FtYmlndWF0aW9uIGFzIHRvIHdoZXRoZXIgd2UgYXJlIAorICAgZG9pbmcgYSBzdWJzY3JpcHQgb3BlcmF0aW9uIG9yIGEgZnVuY3Rpb24gY2FsbCBpcyBkb25lIAorICAgbGF0ZXIgaW4gZXZhbC5jLiAgKi8KKworZXhwCToJZXhwICcoJyAKKwkJCXsgc3RhcnRfYXJnbGlzdCAoKTsgfQorCQlhcmdsaXN0ICcpJwkKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0Y3N19VTkRFVEVSTUlORURfQVJHTElTVCk7CisJCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIGVuZF9hcmdsaXN0ICgpKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0Y3N19VTkRFVEVSTUlORURfQVJHTElTVCk7IH0KKwk7CisKK2FyZ2xpc3QJOgorCTsKKworYXJnbGlzdAk6CWV4cAorCQkJeyBhcmdsaXN0X2xlbiA9IDE7IH0KKwk7CisKK2FyZ2xpc3QgOiAgICAgIHN1YnN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgeyBhcmdsaXN0X2xlbiA9IDI7fQorICAgCithcmdsaXN0CToJYXJnbGlzdCAnLCcgZXhwICAgJXByZWMgQUJPVkVfQ09NTUEKKwkJCXsgYXJnbGlzdF9sZW4rKzsgfQorCTsKKworc3Vic3RyaW5nOglleHAgJzonIGV4cCAgICVwcmVjIEFCT1ZFX0NPTU1BCisJCQl7IH0gCisJOworCisKK2NvbXBsZXhudW06ICAgICBleHAgJywnIGV4cCAKKyAgICAgICAgICAgICAgICAJeyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOworCitleHAJOgknKCcgY29tcGxleG51bSAnKScKKyAgICAgICAgICAgICAgICAJeyB3cml0ZV9leHBfZWx0X29wY29kZShPUF9DT01QTEVYKTsgfQorCTsKKworZXhwCToJJygnIHR5cGUgJyknIGV4cCAgJXByZWMgVU5BUlkKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7CisJCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoJDIpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsgfQorCTsKKworLyogQmluYXJ5IG9wZXJhdG9ycyBpbiBvcmRlciBvZiBkZWNyZWFzaW5nIHByZWNlZGVuY2UuICAqLworCitleHAJOglleHAgJ0AnIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfUkVQRUFUKTsgfQorCTsKKworZXhwCToJZXhwICcqJyBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX01VTCk7IH0KKwk7CisKK2V4cAk6CWV4cCAnLycgZXhwCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9ESVYpOyB9CisJOworCitleHAJOglleHAgJyUnIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfUkVNKTsgfQorCTsKKworZXhwCToJZXhwICcrJyBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FERCk7IH0KKwk7CisKK2V4cAk6CWV4cCAnLScgZXhwCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9TVUIpOyB9CisJOworCitleHAJOglleHAgTFNIIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTFNIKTsgfQorCTsKKworZXhwCToJZXhwIFJTSCBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1JTSCk7IH0KKwk7CisKK2V4cAk6CWV4cCBFUVVBTCBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0VRVUFMKTsgfQorCTsKKworZXhwCToJZXhwIE5PVEVRVUFMIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTk9URVFVQUwpOyB9CisJOworCitleHAJOglleHAgTEVRIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTEVRKTsgfQorCTsKKworZXhwCToJZXhwIEdFUSBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0dFUSk7IH0KKwk7CisKK2V4cAk6CWV4cCBMRVNTVEhBTiBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xFU1MpOyB9CisJOworCitleHAJOglleHAgR1JFQVRFUlRIQU4gZXhwCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9HVFIpOyB9CisJOworCitleHAJOglleHAgJyYnIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQklUV0lTRV9BTkQpOyB9CisJOworCitleHAJOglleHAgJ14nIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQklUV0lTRV9YT1IpOyB9CisJOworCitleHAJOglleHAgJ3wnIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQklUV0lTRV9JT1IpOyB9CisJOworCitleHAgICAgIDogICAgICAgZXhwIEJPT0xfQU5EIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTE9HSUNBTF9BTkQpOyB9CisJOworCisKK2V4cAk6CWV4cCBCT09MX09SIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTE9HSUNBTF9PUik7IH0KKwk7CisKK2V4cAk6CWV4cCAnPScgZXhwCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BU1NJR04pOyB9CisJOworCitleHAJOglleHAgQVNTSUdOX01PRElGWSBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FTU0lHTl9NT0RJRlkpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoJDIpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQVNTSUdOX01PRElGWSk7IH0KKwk7CisKK2V4cAk6CUlOVAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7CisJCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoJDEudHlwZSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpKCQxLnZhbCkpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IH0KKwk7CisKK2V4cAk6CU5BTUVfT1JfSU5UCisJCQl7IFlZU1RZUEUgdmFsOworCQkJICBwYXJzZV9udW1iZXIgKCQxLnN0b2tlbi5wdHIsICQxLnN0b2tlbi5sZW5ndGgsIDAsICZ2YWwpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7CisJCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAodmFsLnR5cGVkX3ZhbC50eXBlKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCl2YWwudHlwZWRfdmFsLnZhbCk7CisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsgfQorCTsKKworZXhwCToJRkxPQVQKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0RPVUJMRSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX2ZfcmVhbF9zOCk7CisJCQkgIHdyaXRlX2V4cF9lbHRfZGJsY3N0ICgkMSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9ET1VCTEUpOyB9CisJOworCitleHAJOgl2YXJpYWJsZQorCTsKKworZXhwCToJVkFSSUFCTEUKKwk7CisKK2V4cAk6CVNJWkVPRiAnKCcgdHlwZSAnKScJJXByZWMgVU5BUlkKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOworCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9mX2ludGVnZXIpOworCQkJICBDSEVDS19UWVBFREVGICgkMyk7CisJCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIFRZUEVfTEVOR1RIICgkMykpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IH0KKwk7CisKK2V4cCAgICAgOiAgICAgICBCT09MRUFOX0xJVEVSQUwKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0JPT0wpOworCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSAkMSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9CT09MKTsKKwkJCX0KKyAgICAgICAgOworCitleHAJOglTVFJJTkdfTElURVJBTAorCQkJeworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfU1RSSU5HKTsKKwkJCSAgd3JpdGVfZXhwX3N0cmluZyAoJDEpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfU1RSSU5HKTsKKwkJCX0KKwk7CisKK3ZhcmlhYmxlOgluYW1lX25vdF90eXBlbmFtZQorCQkJeyBzdHJ1Y3Qgc3ltYm9sICpzeW0gPSAkMS5zeW07CisKKwkJCSAgaWYgKHN5bSkKKwkJCSAgICB7CisJCQkgICAgICBpZiAoc3ltYm9sX3JlYWRfbmVlZHNfZnJhbWUgKHN5bSkpCisJCQkJeworCQkJCSAgaWYgKGlubmVybW9zdF9ibG9jayA9PSAwIHx8CisJCQkJICAgICAgY29udGFpbmVkX2luIChibG9ja19mb3VuZCwgCisJCQkJCQkgICAgaW5uZXJtb3N0X2Jsb2NrKSkKKwkJCQkgICAgaW5uZXJtb3N0X2Jsb2NrID0gYmxvY2tfZm91bmQ7CisJCQkJfQorCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7CisJCQkgICAgICAvKiBXZSB3YW50IHRvIHVzZSB0aGUgc2VsZWN0ZWQgZnJhbWUsIG5vdAorCQkJCSBhbm90aGVyIG1vcmUgaW5uZXIgZnJhbWUgd2hpY2ggaGFwcGVucyB0bworCQkJCSBiZSBpbiB0aGUgc2FtZSBibG9jay4gICovCisJCQkgICAgICB3cml0ZV9leHBfZWx0X2Jsb2NrIChOVUxMKTsKKwkJCSAgICAgIHdyaXRlX2V4cF9lbHRfc3ltIChzeW0pOworCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7CisJCQkgICAgICBicmVhazsKKwkJCSAgICB9CisJCQkgIGVsc2UKKwkJCSAgICB7CisJCQkgICAgICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisJCQkgICAgICByZWdpc3RlciBjaGFyICphcmcgPSBjb3B5X25hbWUgKCQxLnN0b2tlbik7CisKKwkJCSAgICAgIG1zeW1ib2wgPQorCQkJCWxvb2t1cF9taW5pbWFsX3N5bWJvbCAoYXJnLCBOVUxMLCBOVUxMKTsKKwkJCSAgICAgIGlmIChtc3ltYm9sICE9IE5VTEwpCisJCQkJeworCQkJCSAgd3JpdGVfZXhwX21zeW1ib2wgKG1zeW1ib2wsCisJCQkJCQkgICAgIGxvb2t1cF9mdW5jdGlvbl90eXBlIChidWlsdGluX3R5cGVfaW50KSwKKwkJCQkJCSAgICAgYnVpbHRpbl90eXBlX2ludCk7CisJCQkJfQorCQkJICAgICAgZWxzZSBpZiAoIWhhdmVfZnVsbF9zeW1ib2xzICgpICYmICFoYXZlX3BhcnRpYWxfc3ltYm9scyAoKSkKKwkJCQllcnJvciAoIk5vIHN5bWJvbCB0YWJsZSBpcyBsb2FkZWQuICBVc2UgdGhlIFwiZmlsZVwiIGNvbW1hbmQuIik7CisJCQkgICAgICBlbHNlCisJCQkJZXJyb3IgKCJObyBzeW1ib2wgXCIlc1wiIGluIGN1cnJlbnQgY29udGV4dC4iLAorCQkJCSAgICAgICBjb3B5X25hbWUgKCQxLnN0b2tlbikpOworCQkJICAgIH0KKwkJCX0KKwk7CisKKwordHlwZSAgICA6ICAgICAgIHB0eXBlCisgICAgICAgIDsKKworcHR5cGUJOgl0eXBlYmFzZQorCXwJdHlwZWJhc2UgYWJzX2RlY2wKKwkJeworCQkgIC8qIFRoaXMgaXMgd2hlcmUgdGhlIGludGVyZXN0aW5nIHN0dWZmIGhhcHBlbnMuICAqLworCQkgIGludCBkb25lID0gMDsKKwkJICBpbnQgYXJyYXlfc2l6ZTsKKwkJICBzdHJ1Y3QgdHlwZSAqZm9sbG93X3R5cGUgPSAkMTsKKwkJICBzdHJ1Y3QgdHlwZSAqcmFuZ2VfdHlwZTsKKwkJICAKKwkJICB3aGlsZSAoIWRvbmUpCisJCSAgICBzd2l0Y2ggKHBvcF90eXBlICgpKQorCQkgICAgICB7CisJCSAgICAgIGNhc2UgdHBfZW5kOgorCQkJZG9uZSA9IDE7CisJCQlicmVhazsKKwkJICAgICAgY2FzZSB0cF9wb2ludGVyOgorCQkJZm9sbG93X3R5cGUgPSBsb29rdXBfcG9pbnRlcl90eXBlIChmb2xsb3dfdHlwZSk7CisJCQlicmVhazsKKwkJICAgICAgY2FzZSB0cF9yZWZlcmVuY2U6CisJCQlmb2xsb3dfdHlwZSA9IGxvb2t1cF9yZWZlcmVuY2VfdHlwZSAoZm9sbG93X3R5cGUpOworCQkJYnJlYWs7CisJCSAgICAgIGNhc2UgdHBfYXJyYXk6CisJCQlhcnJheV9zaXplID0gcG9wX3R5cGVfaW50ICgpOworCQkJaWYgKGFycmF5X3NpemUgIT0gLTEpCisJCQkgIHsKKwkJCSAgICByYW5nZV90eXBlID0KKwkJCSAgICAgIGNyZWF0ZV9yYW5nZV90eXBlICgoc3RydWN0IHR5cGUgKikgTlVMTCwKKwkJCQkJCSBidWlsdGluX3R5cGVfZl9pbnRlZ2VyLCAwLAorCQkJCQkJIGFycmF5X3NpemUgLSAxKTsKKwkJCSAgICBmb2xsb3dfdHlwZSA9CisJCQkgICAgICBjcmVhdGVfYXJyYXlfdHlwZSAoKHN0cnVjdCB0eXBlICopIE5VTEwsCisJCQkJCQkgZm9sbG93X3R5cGUsIHJhbmdlX3R5cGUpOworCQkJICB9CisJCQllbHNlCisJCQkgIGZvbGxvd190eXBlID0gbG9va3VwX3BvaW50ZXJfdHlwZSAoZm9sbG93X3R5cGUpOworCQkJYnJlYWs7CisJCSAgICAgIGNhc2UgdHBfZnVuY3Rpb246CisJCQlmb2xsb3dfdHlwZSA9IGxvb2t1cF9mdW5jdGlvbl90eXBlIChmb2xsb3dfdHlwZSk7CisJCQlicmVhazsKKwkJICAgICAgfQorCQkgICQkID0gZm9sbG93X3R5cGU7CisJCX0KKwk7CisKK2Fic19kZWNsOgknKicKKwkJCXsgcHVzaF90eXBlICh0cF9wb2ludGVyKTsgJCQgPSAwOyB9CisJfAknKicgYWJzX2RlY2wKKwkJCXsgcHVzaF90eXBlICh0cF9wb2ludGVyKTsgJCQgPSAkMjsgfQorCXwJJyYnCisJCQl7IHB1c2hfdHlwZSAodHBfcmVmZXJlbmNlKTsgJCQgPSAwOyB9CisJfAknJicgYWJzX2RlY2wKKwkJCXsgcHVzaF90eXBlICh0cF9yZWZlcmVuY2UpOyAkJCA9ICQyOyB9CisJfAlkaXJlY3RfYWJzX2RlY2wKKwk7CisKK2RpcmVjdF9hYnNfZGVjbDogJygnIGFic19kZWNsICcpJworCQkJeyAkJCA9ICQyOyB9CisJfCAJZGlyZWN0X2Fic19kZWNsIGZ1bmNfbW9kCisJCQl7IHB1c2hfdHlwZSAodHBfZnVuY3Rpb24pOyB9CisJfAlmdW5jX21vZAorCQkJeyBwdXNoX3R5cGUgKHRwX2Z1bmN0aW9uKTsgfQorCTsKKworZnVuY19tb2Q6CScoJyAnKScKKwkJCXsgJCQgPSAwOyB9CisJfAknKCcgbm9uZW1wdHlfdHlwZWxpc3QgJyknCisJCQl7IGZyZWUgKChQVFIpJDIpOyAkJCA9IDA7IH0KKwk7CisKK3R5cGViYXNlICAvKiBJbXBsZW1lbnRzIChhcHByb3hpbWF0ZWx5KTogKHR5cGUtcXVhbGlmaWVyKSogdHlwZS1zcGVjaWZpZXIgKi8KKwk6CVRZUEVOQU1FCisJCQl7ICQkID0gJDEudHlwZTsgfQorCXwJSU5UX0tFWVdPUkQKKwkJCXsgJCQgPSBidWlsdGluX3R5cGVfZl9pbnRlZ2VyOyB9CisJfAlJTlRfUzJfS0VZV09SRCAKKwkJCXsgJCQgPSBidWlsdGluX3R5cGVfZl9pbnRlZ2VyX3MyOyB9CisJfAlDSEFSQUNURVIgCisJCQl7ICQkID0gYnVpbHRpbl90eXBlX2ZfY2hhcmFjdGVyOyB9CisJfAlMT0dJQ0FMX0tFWVdPUkQgCisJCQl7ICQkID0gYnVpbHRpbl90eXBlX2ZfbG9naWNhbDt9IAorCXwJTE9HSUNBTF9TMl9LRVlXT1JECisJCQl7ICQkID0gYnVpbHRpbl90eXBlX2ZfbG9naWNhbF9zMjt9CisJfAlMT0dJQ0FMX1MxX0tFWVdPUkQgCisJCQl7ICQkID0gYnVpbHRpbl90eXBlX2ZfbG9naWNhbF9zMTt9CisJfAlSRUFMX0tFWVdPUkQgCisJCQl7ICQkID0gYnVpbHRpbl90eXBlX2ZfcmVhbDt9CisJfCAgICAgICBSRUFMX1M4X0tFWVdPUkQKKwkJCXsgJCQgPSBidWlsdGluX3R5cGVfZl9yZWFsX3M4O30KKwl8CVJFQUxfUzE2X0tFWVdPUkQKKwkJCXsgJCQgPSBidWlsdGluX3R5cGVfZl9yZWFsX3MxNjt9CisJfAlDT01QTEVYX1M4X0tFWVdPUkQKKwkJCXsgJCQgPSBidWlsdGluX3R5cGVfZl9jb21wbGV4X3M4O30KKwl8CUNPTVBMRVhfUzE2X0tFWVdPUkQgCisJCQl7ICQkID0gYnVpbHRpbl90eXBlX2ZfY29tcGxleF9zMTY7fQorCXwJQ09NUExFWF9TMzJfS0VZV09SRCAKKwkJCXsgJCQgPSBidWlsdGluX3R5cGVfZl9jb21wbGV4X3MzMjt9CisJOworCit0eXBlbmFtZToJVFlQRU5BTUUKKwk7CisKK25vbmVtcHR5X3R5cGVsaXN0CisJOgl0eXBlCisJCXsgJCQgPSAoc3RydWN0IHR5cGUgKiopIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSAqIDIpOworCQkgICQ8aXZlYz4kWzBdID0gMTsJLyogTnVtYmVyIG9mIHR5cGVzIGluIHZlY3RvciAqLworCQkgICQkWzFdID0gJDE7CisJCX0KKwl8CW5vbmVtcHR5X3R5cGVsaXN0ICcsJyB0eXBlCisJCXsgaW50IGxlbiA9IHNpemVvZiAoc3RydWN0IHR5cGUgKikgKiAoKysoJDxpdmVjPjFbMF0pICsgMSk7CisJCSAgJCQgPSAoc3RydWN0IHR5cGUgKiopIHJlYWxsb2MgKChjaGFyICopICQxLCBsZW4pOworCQkgICQkWyQ8aXZlYz4kWzBdXSA9ICQzOworCQl9CisJOworCituYW1lCToJTkFNRQorCQkJeyAkJCA9ICQxLnN0b2tlbjsgfQorCXwJVFlQRU5BTUUKKwkJCXsgJCQgPSAkMS5zdG9rZW47IH0KKwl8CU5BTUVfT1JfSU5UCisJCQl7ICQkID0gJDEuc3Rva2VuOyB9CisJOworCituYW1lX25vdF90eXBlbmFtZSA6CU5BTUUKKy8qIFRoZXNlIHdvdWxkIGJlIHVzZWZ1bCBpZiBuYW1lX25vdF90eXBlbmFtZSB3YXMgdXNlZnVsLCBidXQgaXQgaXMganVzdAorICAgYSBmYWtlIGZvciAidmFyaWFibGUiLCBzbyB0aGVzZSBjYXVzZSByZWR1Y2UvcmVkdWNlIGNvbmZsaWN0cyBiZWNhdXNlCisgICB0aGUgcGFyc2VyIGNhbid0IHRlbGwgd2hldGhlciBOQU1FX09SX0lOVCBpcyBhIG5hbWVfbm90X3R5cGVuYW1lICg9dmFyaWFibGUsCisgICA9ZXhwKSBvciBqdXN0IGFuIGV4cC4gIElmIG5hbWVfbm90X3R5cGVuYW1lIHdhcyBldmVyIHVzZWQgaW4gYW4gbHZhbHVlCisgICBjb250ZXh0IHdoZXJlIG9ubHkgYSBuYW1lIGNvdWxkIG9jY3VyLCB0aGlzIG1pZ2h0IGJlIHVzZWZ1bC4KKyAgCXwJTkFNRV9PUl9JTlQKKyAgICovCisJOworCislJQorCisvKiBUYWtlIGNhcmUgb2YgcGFyc2luZyBhIG51bWJlciAoYW55dGhpbmcgdGhhdCBzdGFydHMgd2l0aCBhIGRpZ2l0KS4KKyAgIFNldCB5eWx2YWwgYW5kIHJldHVybiB0aGUgdG9rZW4gdHlwZTsgdXBkYXRlIGxleHB0ci4KKyAgIExFTiBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gaXQuICAqLworCisvKioqIE5lZWRzIHNvbWUgZXJyb3IgY2hlY2tpbmcgZm9yIHRoZSBmbG9hdCBjYXNlICoqKi8KKworc3RhdGljIGludAorcGFyc2VfbnVtYmVyIChwLCBsZW4sIHBhcnNlZF9mbG9hdCwgcHV0aXRoZXJlKQorICAgICByZWdpc3RlciBjaGFyICpwOworICAgICByZWdpc3RlciBpbnQgbGVuOworICAgICBpbnQgcGFyc2VkX2Zsb2F0OworICAgICBZWVNUWVBFICpwdXRpdGhlcmU7Cit7CisgIHJlZ2lzdGVyIExPTkdFU1QgbiA9IDA7CisgIHJlZ2lzdGVyIExPTkdFU1QgcHJldm4gPSAwOworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgaW50IGM7CisgIHJlZ2lzdGVyIGludCBiYXNlID0gaW5wdXRfcmFkaXg7CisgIGludCB1bnNpZ25lZF9wID0gMDsKKyAgaW50IGxvbmdfcCA9IDA7CisgIFVMT05HRVNUIGhpZ2hfYml0OworICBzdHJ1Y3QgdHlwZSAqc2lnbmVkX3R5cGU7CisgIHN0cnVjdCB0eXBlICp1bnNpZ25lZF90eXBlOworCisgIGlmIChwYXJzZWRfZmxvYXQpCisgICAgeworICAgICAgLyogSXQncyBhIGZsb2F0IHNpbmNlIGl0IGNvbnRhaW5zIGEgcG9pbnQgb3IgYW4gZXhwb25lbnQuICAqLworICAgICAgLyogW2REXSBpcyBub3QgdW5kZXJzdG9vZCBhcyBhbiBleHBvbmVudCBieSBhdG9mLCBjaGFuZ2UgaXQgdG8gJ2UnLiAgKi8KKyAgICAgIGNoYXIgKnRtcCwgKnRtcDI7CisKKyAgICAgIHRtcCA9IHN0cnNhdmUgKHApOworICAgICAgZm9yICh0bXAyID0gdG1wOyAqdG1wMjsgKyt0bXAyKQorCWlmICgqdG1wMiA9PSAnZCcgfHwgKnRtcDIgPT0gJ0QnKQorCSAgKnRtcDIgPSAnZSc7CisgICAgICBwdXRpdGhlcmUtPmR2YWwgPSBhdG9mICh0bXApOworICAgICAgZnJlZSAodG1wKTsKKyAgICAgIHJldHVybiBGTE9BVDsKKyAgICB9CisKKyAgLyogSGFuZGxlIGJhc2Utc3dpdGNoaW5nIHByZWZpeGVzIDB4LCAwdCwgMGQsIDAgKi8KKyAgaWYgKHBbMF0gPT0gJzAnKQorICAgIHN3aXRjaCAocFsxXSkKKyAgICAgIHsKKyAgICAgIGNhc2UgJ3gnOgorICAgICAgY2FzZSAnWCc6CisJaWYgKGxlbiA+PSAzKQorCSAgeworCSAgICBwICs9IDI7CisJICAgIGJhc2UgPSAxNjsKKwkgICAgbGVuIC09IDI7CisJICB9CisJYnJlYWs7CisJCisgICAgICBjYXNlICd0JzoKKyAgICAgIGNhc2UgJ1QnOgorICAgICAgY2FzZSAnZCc6CisgICAgICBjYXNlICdEJzoKKwlpZiAobGVuID49IDMpCisJICB7CisJICAgIHAgKz0gMjsKKwkgICAgYmFzZSA9IDEwOworCSAgICBsZW4gLT0gMjsKKwkgIH0KKwlicmVhazsKKwkKKyAgICAgIGRlZmF1bHQ6CisJYmFzZSA9IDg7CisJYnJlYWs7CisgICAgICB9CisgIAorICB3aGlsZSAobGVuLS0gPiAwKQorICAgIHsKKyAgICAgIGMgPSAqcCsrOworICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQorCWMgKz0gJ2EnIC0gJ0EnOworICAgICAgaWYgKGMgIT0gJ2wnICYmIGMgIT0gJ3UnKQorCW4gKj0gYmFzZTsKKyAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKwluICs9IGkgPSBjIC0gJzAnOworICAgICAgZWxzZQorCXsKKwkgIGlmIChiYXNlID4gMTAgJiYgYyA+PSAnYScgJiYgYyA8PSAnZicpCisJICAgIG4gKz0gaSA9IGMgLSAnYScgKyAxMDsKKwkgIGVsc2UgaWYgKGxlbiA9PSAwICYmIGMgPT0gJ2wnKSAKKyAgICAgICAgICAgIGxvbmdfcCA9IDE7CisJICBlbHNlIGlmIChsZW4gPT0gMCAmJiBjID09ICd1JykKKwkgICAgdW5zaWduZWRfcCA9IDE7CisJICBlbHNlCisJICAgIHJldHVybiBFUlJPUjsJLyogQ2hhciBub3QgYSBkaWdpdCAqLworCX0KKyAgICAgIGlmIChpID49IGJhc2UpCisJcmV0dXJuIEVSUk9SOwkJLyogSW52YWxpZCBkaWdpdCBpbiB0aGlzIGJhc2UgKi8KKyAgICAgIAorICAgICAgLyogUG9ydGFibHkgdGVzdCBmb3Igb3ZlcmZsb3cgKG9ubHkgd29ya3MgZm9yIG5vbnplcm8gdmFsdWVzLCBzbyBtYWtlCisJIGEgc2Vjb25kIGNoZWNrIGZvciB6ZXJvKS4gICovCisgICAgICBpZiAoKHByZXZuID49IG4pICYmIG4gIT0gMCkKKwl1bnNpZ25lZF9wPTE7CQkvKiBUcnkgc29tZXRoaW5nIHVuc2lnbmVkICovCisgICAgICAvKiBJZiByYW5nZSBjaGVja2luZyBlbmFibGVkLCBwb3J0YWJseSB0ZXN0IGZvciB1bnNpZ25lZCBvdmVyZmxvdy4gICovCisgICAgICBpZiAoUkFOR0VfQ0hFQ0sgJiYgbiAhPSAwKQorCXsKKwkgIGlmICgodW5zaWduZWRfcCAmJiAodW5zaWduZWQpcHJldm4gPj0gKHVuc2lnbmVkKW4pKQorCSAgICByYW5nZV9lcnJvcigiT3ZlcmZsb3cgb24gbnVtZXJpYyBjb25zdGFudC4iKTsJIAorCX0KKyAgICAgIHByZXZuID0gbjsKKyAgICB9CisgIAorICAvKiBJZiB0aGUgbnVtYmVyIGlzIHRvbyBiaWcgdG8gYmUgYW4gaW50LCBvciBpdCdzIGdvdCBhbiBsIHN1ZmZpeAorICAgICB0aGVuIGl0J3MgYSBsb25nLiAgV29yayBvdXQgaWYgdGhpcyBoYXMgdG8gYmUgYSBsb25nIGJ5CisgICAgIHNoaWZ0aW5nIHJpZ2h0IGFuZCBhbmQgc2VlaW5nIGlmIGFueXRoaW5nIHJlbWFpbnMsIGFuZCB0aGUKKyAgICAgdGFyZ2V0IGludCBzaXplIGlzIGRpZmZlcmVudCB0byB0aGUgdGFyZ2V0IGxvbmcgc2l6ZS4KKyAgICAgCisgICAgIEluIHRoZSBleHByZXNzaW9uIGJlbG93LCB3ZSBjb3VsZCBoYXZlIHRlc3RlZAorICAgICAobiA+PiBUQVJHRVRfSU5UX0JJVCkKKyAgICAgdG8gc2VlIGlmIGl0IHdhcyB6ZXJvLAorICAgICBidXQgdG9vIG1hbnkgY29tcGlsZXJzIHdhcm4gYWJvdXQgdGhhdCwgd2hlbiBpbnRzIGFuZCBsb25ncworICAgICBhcmUgdGhlIHNhbWUgc2l6ZS4gIFNvIHdlIHNoaWZ0IGl0IHR3aWNlLCB3aXRoIGZld2VyIGJpdHMKKyAgICAgZWFjaCB0aW1lLCBmb3IgdGhlIHNhbWUgcmVzdWx0LiAgKi8KKyAgCisgIGlmICgoVEFSR0VUX0lOVF9CSVQgIT0gVEFSR0VUX0xPTkdfQklUIAorICAgICAgICYmICgobiA+PiAyKSA+PiAoVEFSR0VUX0lOVF9CSVQtMikpKSAgIC8qIEF2b2lkIHNoaWZ0IHdhcm5pbmcgKi8KKyAgICAgIHx8IGxvbmdfcCkKKyAgICB7CisgICAgICBoaWdoX2JpdCA9ICgoVUxPTkdFU1QpMSkgPDwgKFRBUkdFVF9MT05HX0JJVC0xKTsKKyAgICAgIHVuc2lnbmVkX3R5cGUgPSBidWlsdGluX3R5cGVfdW5zaWduZWRfbG9uZzsKKyAgICAgIHNpZ25lZF90eXBlID0gYnVpbHRpbl90eXBlX2xvbmc7CisgICAgfQorICBlbHNlIAorICAgIHsKKyAgICAgIGhpZ2hfYml0ID0gKChVTE9OR0VTVCkxKSA8PCAoVEFSR0VUX0lOVF9CSVQtMSk7CisgICAgICB1bnNpZ25lZF90eXBlID0gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2ludDsKKyAgICAgIHNpZ25lZF90eXBlID0gYnVpbHRpbl90eXBlX2ludDsKKyAgICB9ICAgIAorICAKKyAgcHV0aXRoZXJlLT50eXBlZF92YWwudmFsID0gbjsKKyAgCisgIC8qIElmIHRoZSBoaWdoIGJpdCBvZiB0aGUgd29ya2VkIG91dCB0eXBlIGlzIHNldCB0aGVuIHRoaXMgbnVtYmVyCisgICAgIGhhcyB0byBiZSB1bnNpZ25lZC4gKi8KKyAgCisgIGlmICh1bnNpZ25lZF9wIHx8IChuICYgaGlnaF9iaXQpKSAKKyAgICBwdXRpdGhlcmUtPnR5cGVkX3ZhbC50eXBlID0gdW5zaWduZWRfdHlwZTsKKyAgZWxzZSAKKyAgICBwdXRpdGhlcmUtPnR5cGVkX3ZhbC50eXBlID0gc2lnbmVkX3R5cGU7CisgIAorICByZXR1cm4gSU5UOworfQorCitzdHJ1Y3QgdG9rZW4KK3sKKyAgY2hhciAqb3BlcmF0b3I7CisgIGludCB0b2tlbjsKKyAgZW51bSBleHBfb3Bjb2RlIG9wY29kZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rZW4gZG90X29wc1tdID0KK3sKKyAgeyAiLmFuZC4iLCBCT09MX0FORCwgQklOT1BfRU5EIH0sCisgIHsgIi5BTkQuIiwgQk9PTF9BTkQsIEJJTk9QX0VORCB9LAorICB7ICIub3IuIiwgQk9PTF9PUiwgQklOT1BfRU5EIH0sCisgIHsgIi5PUi4iLCBCT09MX09SLCBCSU5PUF9FTkQgfSwKKyAgeyAiLm5vdC4iLCBCT09MX05PVCwgQklOT1BfRU5EIH0sCisgIHsgIi5OT1QuIiwgQk9PTF9OT1QsIEJJTk9QX0VORCB9LAorICB7ICIuZXEuIiwgRVFVQUwsIEJJTk9QX0VORCB9LAorICB7ICIuRVEuIiwgRVFVQUwsIEJJTk9QX0VORCB9LAorICB7ICIuZXF2LiIsIEVRVUFMLCBCSU5PUF9FTkQgfSwKKyAgeyAiLk5FUVYuIiwgTk9URVFVQUwsIEJJTk9QX0VORCB9LAorICB7ICIubmVxdi4iLCBOT1RFUVVBTCwgQklOT1BfRU5EIH0sCisgIHsgIi5FUVYuIiwgRVFVQUwsIEJJTk9QX0VORCB9LAorICB7ICIubmUuIiwgTk9URVFVQUwsIEJJTk9QX0VORCB9LAorICB7ICIuTkUuIiwgTk9URVFVQUwsIEJJTk9QX0VORCB9LAorICB7ICIubGUuIiwgTEVRLCBCSU5PUF9FTkQgfSwKKyAgeyAiLkxFLiIsIExFUSwgQklOT1BfRU5EIH0sCisgIHsgIi5nZS4iLCBHRVEsIEJJTk9QX0VORCB9LAorICB7ICIuR0UuIiwgR0VRLCBCSU5PUF9FTkQgfSwKKyAgeyAiLmd0LiIsIEdSRUFURVJUSEFOLCBCSU5PUF9FTkQgfSwKKyAgeyAiLkdULiIsIEdSRUFURVJUSEFOLCBCSU5PUF9FTkQgfSwKKyAgeyAiLmx0LiIsIExFU1NUSEFOLCBCSU5PUF9FTkQgfSwKKyAgeyAiLkxULiIsIExFU1NUSEFOLCBCSU5PUF9FTkQgfSwKKyAgeyBOVUxMLCAwLCAwIH0KK307CisKK3N0cnVjdCBmNzdfYm9vbGVhbl92YWwgCit7CisgIGNoYXIgKm5hbWU7CisgIGludCB2YWx1ZTsKK307IAorCitzdGF0aWMgY29uc3Qgc3RydWN0IGY3N19ib29sZWFuX3ZhbCBib29sZWFuX3ZhbHVlc1tdICA9IAoreworICB7ICIudHJ1ZS4iLCAxIH0sCisgIHsgIi5UUlVFLiIsIDEgfSwKKyAgeyAiLmZhbHNlLiIsIDAgfSwKKyAgeyAiLkZBTFNFLiIsIDAgfSwKKyAgeyBOVUxMLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rZW4gZjc3X2tleXdvcmRzW10gPSAKK3sKKyAgeyAiY29tcGxleF8xNiIsIENPTVBMRVhfUzE2X0tFWVdPUkQsIEJJTk9QX0VORCB9LAorICB7ICJjb21wbGV4XzMyIiwgQ09NUExFWF9TMzJfS0VZV09SRCwgQklOT1BfRU5EIH0sCisgIHsgImNoYXJhY3RlciIsIENIQVJBQ1RFUiwgQklOT1BfRU5EIH0sCisgIHsgImludGVnZXJfMiIsIElOVF9TMl9LRVlXT1JELCBCSU5PUF9FTkQgfSwKKyAgeyAibG9naWNhbF8xIiwgTE9HSUNBTF9TMV9LRVlXT1JELCBCSU5PUF9FTkQgfSwKKyAgeyAibG9naWNhbF8yIiwgTE9HSUNBTF9TMl9LRVlXT1JELCBCSU5PUF9FTkQgfSwKKyAgeyAiY29tcGxleF84IiwgQ09NUExFWF9TOF9LRVlXT1JELCBCSU5PUF9FTkQgfSwKKyAgeyAiaW50ZWdlciIsIElOVF9LRVlXT1JELCBCSU5PUF9FTkQgfSwKKyAgeyAibG9naWNhbCIsIExPR0lDQUxfS0VZV09SRCwgQklOT1BfRU5EIH0sCisgIHsgInJlYWxfMTYiLCBSRUFMX1MxNl9LRVlXT1JELCBCSU5PUF9FTkQgfSwKKyAgeyAiY29tcGxleCIsIENPTVBMRVhfUzhfS0VZV09SRCwgQklOT1BfRU5EIH0sCisgIHsgInNpemVvZiIsIFNJWkVPRiwgQklOT1BfRU5EIH0sCisgIHsgInJlYWxfOCIsIFJFQUxfUzhfS0VZV09SRCwgQklOT1BfRU5EIH0sCisgIHsgInJlYWwiLCBSRUFMX0tFWVdPUkQsIEJJTk9QX0VORCB9LAorICB7IE5VTEwsIDAsIDAgfQorfTsgCisKKy8qIEltcGxlbWVudGF0aW9uIG9mIGEgZHluYW1pY2FsbHkgZXhwYW5kYWJsZSBidWZmZXIgZm9yIHByb2Nlc3NpbmcgaW5wdXQKKyAgIGNoYXJhY3RlcnMgYWNxdWlyZWQgdGhyb3VnaCBsZXhwdHIgYW5kIGJ1aWxkaW5nIGEgdmFsdWUgdG8gcmV0dXJuIGluCisgICB5eWx2YWwuIFJpcHBlZCBvZmYgZnJvbSBjaC1leHAueSAqLyAKKworc3RhdGljIGNoYXIgKnRlbXBidWY7CQkvKiBDdXJyZW50IGJ1ZmZlciBjb250ZW50cyAqLworc3RhdGljIGludCB0ZW1wYnVmc2l6ZTsJCS8qIFNpemUgb2YgYWxsb2NhdGVkIGJ1ZmZlciAqLworc3RhdGljIGludCB0ZW1wYnVmaW5kZXg7CS8qIEN1cnJlbnQgaW5kZXggaW50byBidWZmZXIgKi8KKworI2RlZmluZSBHUk9XQllfTUlOX1NJWkUgNjQJLyogTWluaW11bSBhbW91bnQgdG8gZ3JvdyBidWZmZXIgYnkgKi8KKworI2RlZmluZSBDSEVDS0JVRihzaXplKSBcCisgIGRvIHsgXAorICAgIGlmICh0ZW1wYnVmaW5kZXggKyAoc2l6ZSkgPj0gdGVtcGJ1ZnNpemUpIFwKKyAgICAgIHsgXAorCWdyb3didWZfYnlfc2l6ZSAoc2l6ZSk7IFwKKyAgICAgIH0gXAorICB9IHdoaWxlICgwKTsKKworCisvKiBHcm93IHRoZSBzdGF0aWMgdGVtcCBidWZmZXIgaWYgbmVjZXNzYXJ5LCBpbmNsdWRpbmcgYWxsb2NhdGluZyB0aGUgZmlyc3Qgb25lCisgICBvbiBkZW1hbmQuICovCisKK3N0YXRpYyB2b2lkCitncm93YnVmX2J5X3NpemUgKGNvdW50KQorICAgICBpbnQgY291bnQ7Cit7CisgIGludCBncm93Ynk7CisKKyAgZ3Jvd2J5ID0gbWF4IChjb3VudCwgR1JPV0JZX01JTl9TSVpFKTsKKyAgdGVtcGJ1ZnNpemUgKz0gZ3Jvd2J5OworICBpZiAodGVtcGJ1ZiA9PSBOVUxMKQorICAgIHRlbXBidWYgPSAoY2hhciAqKSBtYWxsb2MgKHRlbXBidWZzaXplKTsKKyAgZWxzZQorICAgIHRlbXBidWYgPSAoY2hhciAqKSByZWFsbG9jICh0ZW1wYnVmLCB0ZW1wYnVmc2l6ZSk7Cit9CisKKy8qIEJsYXRhbnRseSByaXBwZWQgb2ZmIGZyb20gY2gtZXhwLnkuIFRoaXMgcm91dGluZSByZWNvZ25pemVzIEY3NyAKKyAgIHN0cmluZy1saXRlcmFscy4gCisgICAKKyAgIFJlY29nbml6ZSBhIHN0cmluZyBsaXRlcmFsLiAgQSBzdHJpbmcgbGl0ZXJhbCBpcyBhIG5vbnplcm8gc2VxdWVuY2UKKyAgIG9mIGNoYXJhY3RlcnMgZW5jbG9zZWQgaW4gbWF0Y2hpbmcgc2luZ2xlIHF1b3RlcywgZXhjZXB0IHRoYXQKKyAgIGEgc2luZ2xlIGNoYXJhY3RlciBpbnNpZGUgc2luZ2xlIHF1b3RlcyBpcyBhIGNoYXJhY3RlciBsaXRlcmFsLCB3aGljaAorICAgd2UgcmVqZWN0IGFzIGEgc3RyaW5nIGxpdGVyYWwuICBUbyBlbWJlZCB0aGUgdGVybWluYXRvciBjaGFyYWN0ZXIgaW5zaWRlCisgICBhIHN0cmluZywgaXQgaXMgc2ltcGx5IGRvdWJsZWQgKEkuRS4gJ3RoaXMnJ2lzJydvbmUnJ3N0cmluZycpICovCisKK3N0YXRpYyBpbnQKK21hdGNoX3N0cmluZ19saXRlcmFsICgpCit7CisgIGNoYXIgKnRva3B0ciA9IGxleHB0cjsKKworICBmb3IgKHRlbXBidWZpbmRleCA9IDAsIHRva3B0cisrOyAqdG9rcHRyICE9ICdcMCc7IHRva3B0cisrKQorICAgIHsKKyAgICAgIENIRUNLQlVGICgxKTsKKyAgICAgIGlmICgqdG9rcHRyID09ICpsZXhwdHIpCisJeworCSAgaWYgKCoodG9rcHRyICsgMSkgPT0gKmxleHB0cikKKwkgICAgdG9rcHRyKys7CisJICBlbHNlCisJICAgIGJyZWFrOworCX0KKyAgICAgIHRlbXBidWZbdGVtcGJ1ZmluZGV4KytdID0gKnRva3B0cjsKKyAgICB9CisgIGlmICgqdG9rcHRyID09ICdcMCcJCQkJCS8qIG5vIHRlcm1pbmF0b3IgKi8KKyAgICAgIHx8IHRlbXBidWZpbmRleCA9PSAwKQkJCQkvKiBubyBzdHJpbmcgKi8KKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHsKKyAgICAgIHRlbXBidWZbdGVtcGJ1ZmluZGV4XSA9ICdcMCc7CisgICAgICB5eWx2YWwuc3ZhbC5wdHIgPSB0ZW1wYnVmOworICAgICAgeXlsdmFsLnN2YWwubGVuZ3RoID0gdGVtcGJ1ZmluZGV4OworICAgICAgbGV4cHRyID0gKyt0b2twdHI7CisgICAgICByZXR1cm4gU1RSSU5HX0xJVEVSQUw7CisgICAgfQorfQorCisvKiBSZWFkIG9uZSB0b2tlbiwgZ2V0dGluZyBjaGFyYWN0ZXJzIHRocm91Z2ggbGV4cHRyLiAgKi8KKworc3RhdGljIGludAoreXlsZXggKCkKK3sKKyAgaW50IGM7CisgIGludCBuYW1lbGVuOworICB1bnNpZ25lZCBpbnQgaSx0b2tlbjsKKyAgY2hhciAqdG9rc3RhcnQ7CisgIAorIHJldHJ5OgorICAKKyAgdG9rc3RhcnQgPSBsZXhwdHI7CisgIAorICAvKiBGaXJzdCBvZiBhbGwsIGxldCB1cyBtYWtlIHN1cmUgd2UgYXJlIG5vdCBkZWFsaW5nIHdpdGggdGhlIAorICAgICBzcGVjaWFsIHRva2VucyAudHJ1ZS4gYW5kIC5mYWxzZS4gd2hpY2ggZXZhbHVhdGUgdG8gMSBhbmQgMC4gICovCisgIAorICBpZiAoKmxleHB0ciA9PSAnLicpCisgICAgeyAKKyAgICAgIGZvciAoaSA9IDA7IGJvb2xlYW5fdmFsdWVzW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCXsKKwkgIGlmIFNUUkVRTiAodG9rc3RhcnQsIGJvb2xlYW5fdmFsdWVzW2ldLm5hbWUsCisJCSAgICBzdHJsZW4gKGJvb2xlYW5fdmFsdWVzW2ldLm5hbWUpKQorCSAgICB7CisJICAgICAgbGV4cHRyICs9IHN0cmxlbiAoYm9vbGVhbl92YWx1ZXNbaV0ubmFtZSk7IAorCSAgICAgIHl5bHZhbC5sdmFsID0gYm9vbGVhbl92YWx1ZXNbaV0udmFsdWU7IAorCSAgICAgIHJldHVybiBCT09MRUFOX0xJVEVSQUw7CisJICAgIH0KKwl9CisgICAgfQorICAKKyAgLyogU2VlIGlmIGl0IGlzIGEgc3BlY2lhbCAuZm9vLiBvcGVyYXRvciAqLworICAKKyAgZm9yIChpID0gMDsgZG90X29wc1tpXS5vcGVyYXRvciAhPSBOVUxMOyBpKyspCisgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsIGRvdF9vcHNbaV0ub3BlcmF0b3IsIHN0cmxlbiAoZG90X29wc1tpXS5vcGVyYXRvcikpKQorICAgICAgeworCWxleHB0ciArPSBzdHJsZW4gKGRvdF9vcHNbaV0ub3BlcmF0b3IpOworCXl5bHZhbC5vcGNvZGUgPSBkb3Rfb3BzW2ldLm9wY29kZTsKKwlyZXR1cm4gZG90X29wc1tpXS50b2tlbjsKKyAgICAgIH0KKyAgCisgIHN3aXRjaCAoYyA9ICp0b2tzdGFydCkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuIDA7CisgICAgICAKKyAgICBjYXNlICcgJzoKKyAgICBjYXNlICdcdCc6CisgICAgY2FzZSAnXG4nOgorICAgICAgbGV4cHRyKys7CisgICAgICBnb3RvIHJldHJ5OworICAgICAgCisgICAgY2FzZSAnXCcnOgorICAgICAgdG9rZW4gPSBtYXRjaF9zdHJpbmdfbGl0ZXJhbCAoKTsKKyAgICAgIGlmICh0b2tlbiAhPSAwKQorCXJldHVybiAodG9rZW4pOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlICcoJzoKKyAgICAgIHBhcmVuX2RlcHRoKys7CisgICAgICBsZXhwdHIrKzsKKyAgICAgIHJldHVybiBjOworICAgICAgCisgICAgY2FzZSAnKSc6CisgICAgICBpZiAocGFyZW5fZGVwdGggPT0gMCkKKwlyZXR1cm4gMDsKKyAgICAgIHBhcmVuX2RlcHRoLS07CisgICAgICBsZXhwdHIrKzsKKyAgICAgIHJldHVybiBjOworICAgICAgCisgICAgY2FzZSAnLCc6CisgICAgICBpZiAoY29tbWFfdGVybWluYXRlcyAmJiBwYXJlbl9kZXB0aCA9PSAwKQorCXJldHVybiAwOworICAgICAgbGV4cHRyKys7CisgICAgICByZXR1cm4gYzsKKyAgICAgIAorICAgIGNhc2UgJy4nOgorICAgICAgLyogTWlnaHQgYmUgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuICAqLworICAgICAgaWYgKGxleHB0clsxXSA8ICcwJyB8fCBsZXhwdHJbMV0gPiAnOScpCisJZ290byBzeW1ib2w7CQkvKiBOb3BlLCBtdXN0IGJlIGEgc3ltYm9sLiAqLworICAgICAgLyogRkFMTCBUSFJVIGludG8gbnVtYmVyIGNhc2UuICAqLworICAgICAgCisgICAgY2FzZSAnMCc6CisgICAgY2FzZSAnMSc6CisgICAgY2FzZSAnMic6CisgICAgY2FzZSAnMyc6CisgICAgY2FzZSAnNCc6CisgICAgY2FzZSAnNSc6CisgICAgY2FzZSAnNic6CisgICAgY2FzZSAnNyc6CisgICAgY2FzZSAnOCc6CisgICAgY2FzZSAnOSc6CisgICAgICB7CisgICAgICAgIC8qIEl0J3MgYSBudW1iZXIuICAqLworCWludCBnb3RfZG90ID0gMCwgZ290X2UgPSAwLCBnb3RfZCA9IDAsIHRva3R5cGU7CisJcmVnaXN0ZXIgY2hhciAqcCA9IHRva3N0YXJ0OworCWludCBoZXggPSBpbnB1dF9yYWRpeCA+IDEwOworCQorCWlmIChjID09ICcwJyAmJiAocFsxXSA9PSAneCcgfHwgcFsxXSA9PSAnWCcpKQorCSAgeworCSAgICBwICs9IDI7CisJICAgIGhleCA9IDE7CisJICB9CisJZWxzZSBpZiAoYyA9PSAnMCcgJiYgKHBbMV09PSd0JyB8fCBwWzFdPT0nVCcgfHwgcFsxXT09J2QnIHx8IHBbMV09PSdEJykpCisJICB7CisJICAgIHAgKz0gMjsKKwkgICAgaGV4ID0gMDsKKwkgIH0KKwkKKwlmb3IgKDs7ICsrcCkKKwkgIHsKKwkgICAgaWYgKCFoZXggJiYgIWdvdF9lICYmICgqcCA9PSAnZScgfHwgKnAgPT0gJ0UnKSkKKwkgICAgICBnb3RfZG90ID0gZ290X2UgPSAxOworCSAgICBlbHNlIGlmICghaGV4ICYmICFnb3RfZCAmJiAoKnAgPT0gJ2QnIHx8ICpwID09ICdEJykpCisJICAgICAgZ290X2RvdCA9IGdvdF9kID0gMTsKKwkgICAgZWxzZSBpZiAoIWhleCAmJiAhZ290X2RvdCAmJiAqcCA9PSAnLicpCisJICAgICAgZ290X2RvdCA9IDE7CisJICAgIGVsc2UgaWYgKCgoZ290X2UgJiYgKHBbLTFdID09ICdlJyB8fCBwWy0xXSA9PSAnRScpKQorCQkgICAgIHx8IChnb3RfZCAmJiAocFstMV0gPT0gJ2QnIHx8IHBbLTFdID09ICdEJykpKQorCQkgICAgICYmICgqcCA9PSAnLScgfHwgKnAgPT0gJysnKSkKKwkgICAgICAvKiBUaGlzIGlzIHRoZSBzaWduIG9mIHRoZSBleHBvbmVudCwgbm90IHRoZSBlbmQgb2YgdGhlCisJCSBudW1iZXIuICAqLworCSAgICAgIGNvbnRpbnVlOworCSAgICAvKiBXZSB3aWxsIHRha2UgYW55IGxldHRlcnMgb3IgZGlnaXRzLiAgcGFyc2VfbnVtYmVyIHdpbGwKKwkgICAgICAgY29tcGxhaW4gaWYgcGFzdCB0aGUgcmFkaXgsIG9yIGlmIEwgb3IgVSBhcmUgbm90IGZpbmFsLiAgKi8KKwkgICAgZWxzZSBpZiAoKCpwIDwgJzAnIHx8ICpwID4gJzknKQorCQkgICAgICYmICgoKnAgPCAnYScgfHwgKnAgPiAneicpCisJCQkgJiYgKCpwIDwgJ0EnIHx8ICpwID4gJ1onKSkpCisJICAgICAgYnJlYWs7CisJICB9CisJdG9rdHlwZSA9IHBhcnNlX251bWJlciAodG9rc3RhcnQsIHAgLSB0b2tzdGFydCwgZ290X2RvdHxnb3RfZXxnb3RfZCwKKwkJCQkmeXlsdmFsKTsKKyAgICAgICAgaWYgKHRva3R5cGUgPT0gRVJST1IpCisgICAgICAgICAgeworCSAgICBjaGFyICplcnJfY29weSA9IChjaGFyICopIGFsbG9jYSAocCAtIHRva3N0YXJ0ICsgMSk7CisJICAgIAorCSAgICBtZW1jcHkgKGVycl9jb3B5LCB0b2tzdGFydCwgcCAtIHRva3N0YXJ0KTsKKwkgICAgZXJyX2NvcHlbcCAtIHRva3N0YXJ0XSA9IDA7CisJICAgIGVycm9yICgiSW52YWxpZCBudW1iZXIgXCIlc1wiLiIsIGVycl9jb3B5KTsKKwkgIH0KKwlsZXhwdHIgPSBwOworCXJldHVybiB0b2t0eXBlOworICAgICAgfQorICAgICAgCisgICAgY2FzZSAnKyc6CisgICAgY2FzZSAnLSc6CisgICAgY2FzZSAnKic6CisgICAgY2FzZSAnLyc6CisgICAgY2FzZSAnJSc6CisgICAgY2FzZSAnfCc6CisgICAgY2FzZSAnJic6CisgICAgY2FzZSAnXic6CisgICAgY2FzZSAnfic6CisgICAgY2FzZSAnISc6CisgICAgY2FzZSAnQCc6CisgICAgY2FzZSAnPCc6CisgICAgY2FzZSAnPic6CisgICAgY2FzZSAnWyc6CisgICAgY2FzZSAnXSc6CisgICAgY2FzZSAnPyc6CisgICAgY2FzZSAnOic6CisgICAgY2FzZSAnPSc6CisgICAgY2FzZSAneyc6CisgICAgY2FzZSAnfSc6CisgICAgc3ltYm9sOgorICAgICAgbGV4cHRyKys7CisgICAgICByZXR1cm4gYzsKKyAgICB9CisgIAorICBpZiAoIShjID09ICdfJyB8fCBjID09ICckJworCXx8IChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSkpCisgICAgLyogV2UgbXVzdCBoYXZlIGNvbWUgYWNyb3NzIGEgYmFkIGNoYXJhY3RlciAoZS5nLiAnOycpLiAgKi8KKyAgICBlcnJvciAoIkludmFsaWQgY2hhcmFjdGVyICclYycgaW4gZXhwcmVzc2lvbi4iLCBjKTsKKyAgCisgIG5hbWVsZW4gPSAwOworICBmb3IgKGMgPSB0b2tzdGFydFtuYW1lbGVuXTsKKyAgICAgICAoYyA9PSAnXycgfHwgYyA9PSAnJCcgfHwgKGMgPj0gJzAnICYmIGMgPD0gJzknKSAKKwl8fCAoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJykpOyAKKyAgICAgICBjID0gdG9rc3RhcnRbKytuYW1lbGVuXSk7CisgIAorICAvKiBUaGUgdG9rZW4gImlmIiB0ZXJtaW5hdGVzIHRoZSBleHByZXNzaW9uIGFuZCBpcyBOT1QgCisgICAgIHJlbW92ZWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAgKi8KKyAgCisgIGlmIChuYW1lbGVuID09IDIgJiYgdG9rc3RhcnRbMF0gPT0gJ2knICYmIHRva3N0YXJ0WzFdID09ICdmJykKKyAgICByZXR1cm4gMDsKKyAgCisgIGxleHB0ciArPSBuYW1lbGVuOworICAKKyAgLyogQ2F0Y2ggc3BlY2lmaWMga2V5d29yZHMuICAqLworICAKKyAgZm9yIChpID0gMDsgZjc3X2tleXdvcmRzW2ldLm9wZXJhdG9yICE9IE5VTEw7IGkrKykKKyAgICBpZiAoU1RSRVFOKHRva3N0YXJ0LCBmNzdfa2V5d29yZHNbaV0ub3BlcmF0b3IsCisgICAgICAgICAgICAgICBzdHJsZW4oZjc3X2tleXdvcmRzW2ldLm9wZXJhdG9yKSkpCisgICAgICB7CisJLyogCWxleHB0ciArPSBzdHJsZW4oZjc3X2tleXdvcmRzW2ldLm9wZXJhdG9yKTsgKi8gCisJeXlsdmFsLm9wY29kZSA9IGY3N19rZXl3b3Jkc1tpXS5vcGNvZGU7CisJcmV0dXJuIGY3N19rZXl3b3Jkc1tpXS50b2tlbjsKKyAgICAgIH0KKyAgCisgIHl5bHZhbC5zdmFsLnB0ciA9IHRva3N0YXJ0OworICB5eWx2YWwuc3ZhbC5sZW5ndGggPSBuYW1lbGVuOworICAKKyAgaWYgKCp0b2tzdGFydCA9PSAnJCcpCisgICAgeworICAgICAgd3JpdGVfZG9sbGFyX3ZhcmlhYmxlICh5eWx2YWwuc3ZhbCk7CisgICAgICByZXR1cm4gVkFSSUFCTEU7CisgICAgfQorICAKKyAgLyogVXNlIHRva2VuLXR5cGUgVFlQRU5BTUUgZm9yIHN5bWJvbHMgdGhhdCBoYXBwZW4gdG8gYmUgZGVmaW5lZAorICAgICBjdXJyZW50bHkgYXMgbmFtZXMgb2YgdHlwZXM7IE5BTUUgZm9yIG90aGVyIHN5bWJvbHMuCisgICAgIFRoZSBjYWxsZXIgaXMgbm90IGNvbnN0cmFpbmVkIHRvIGNhcmUgYWJvdXQgdGhlIGRpc3RpbmN0aW9uLiAgKi8KKyAgeworICAgIGNoYXIgKnRtcCA9IGNvcHlfbmFtZSAoeXlsdmFsLnN2YWwpOworICAgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgICBpbnQgaXNfYV9maWVsZF9vZl90aGlzID0gMDsKKyAgICBpbnQgaGV4dHlwZTsKKyAgICAKKyAgICBzeW0gPSBsb29rdXBfc3ltYm9sICh0bXAsIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywKKwkJCSBWQVJfTkFNRVNQQUNFLAorCQkJIGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2xhbmd1YWdlID09IGxhbmd1YWdlX2NwbHVzCisJCQkgPyAmaXNfYV9maWVsZF9vZl90aGlzIDogTlVMTCwKKwkJCSBOVUxMKTsKKyAgICBpZiAoc3ltICYmIFNZTUJPTF9DTEFTUyAoc3ltKSA9PSBMT0NfVFlQRURFRikKKyAgICAgIHsKKwl5eWx2YWwudHN5bS50eXBlID0gU1lNQk9MX1RZUEUgKHN5bSk7CisJcmV0dXJuIFRZUEVOQU1FOworICAgICAgfQorICAgIGlmICgoeXlsdmFsLnRzeW0udHlwZSA9IGxvb2t1cF9wcmltaXRpdmVfdHlwZW5hbWUgKHRtcCkpICE9IDApCisgICAgICByZXR1cm4gVFlQRU5BTUU7CisgICAgCisgICAgLyogSW5wdXQgbmFtZXMgdGhhdCBhcmVuJ3Qgc3ltYm9scyBidXQgQVJFIHZhbGlkIGhleCBudW1iZXJzLAorICAgICAgIHdoZW4gdGhlIGlucHV0IHJhZGl4IHBlcm1pdHMgdGhlbSwgY2FuIGJlIG5hbWVzIG9yIG51bWJlcnMKKyAgICAgICBkZXBlbmRpbmcgb24gdGhlIHBhcnNlLiAgTm90ZSB3ZSBzdXBwb3J0IHJhZGl4ZXMgPiAxNiBoZXJlLiAgKi8KKyAgICBpZiAoIXN5bQorCSYmICgodG9rc3RhcnRbMF0gPj0gJ2EnICYmIHRva3N0YXJ0WzBdIDwgJ2EnICsgaW5wdXRfcmFkaXggLSAxMCkKKwkgICAgfHwgKHRva3N0YXJ0WzBdID49ICdBJyAmJiB0b2tzdGFydFswXSA8ICdBJyArIGlucHV0X3JhZGl4IC0gMTApKSkKKyAgICAgIHsKKyAJWVlTVFlQRSBuZXdsdmFsOwkvKiBJdHMgdmFsdWUgaXMgaWdub3JlZC4gICovCisJaGV4dHlwZSA9IHBhcnNlX251bWJlciAodG9rc3RhcnQsIG5hbWVsZW4sIDAsICZuZXdsdmFsKTsKKwlpZiAoaGV4dHlwZSA9PSBJTlQpCisJICB7CisJICAgIHl5bHZhbC5zc3ltLnN5bSA9IHN5bTsKKwkgICAgeXlsdmFsLnNzeW0uaXNfYV9maWVsZF9vZl90aGlzID0gaXNfYV9maWVsZF9vZl90aGlzOworCSAgICByZXR1cm4gTkFNRV9PUl9JTlQ7CisJICB9CisgICAgICB9CisgICAgCisgICAgLyogQW55IG90aGVyIGtpbmQgb2Ygc3ltYm9sICovCisgICAgeXlsdmFsLnNzeW0uc3ltID0gc3ltOworICAgIHl5bHZhbC5zc3ltLmlzX2FfZmllbGRfb2ZfdGhpcyA9IGlzX2FfZmllbGRfb2ZfdGhpczsKKyAgICByZXR1cm4gTkFNRTsKKyAgfQorfQorCit2b2lkCit5eWVycm9yIChtc2cpCisgICAgIGNoYXIgKm1zZzsKK3sKKyAgZXJyb3IgKCJBICVzIGluIGV4cHJlc3Npb24sIG5lYXIgYCVzJy4iLCAobXNnID8gbXNnIDogImVycm9yIiksIGxleHB0cik7Cit9CmRpZmYgLS1naXQgYS9nZGIvZi1sYW5nLmMgYi9nZGIvZi1sYW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlNjZkNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9mLWxhbmcuYwpAQCAtMCwwICsxLDk3MyBAQAorLyogRm9ydHJhbiBsYW5ndWFnZSBzdXBwb3J0IHJvdXRpbmVzIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IE1vdG9yb2xhLiAgQWRhcHRlZCBmcm9tIHRoZSBDIHBhcnNlciBieSBGYXJvb3EgQnV0dAorICAgKGZtYnV0dEBlbmdhZ2Uuc3BzLm1vdC5jb20pLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgInBhcnNlci1kZWZzLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJmLWxhbmcuaCIKKworLyogVGhlIGJ1aWx0LWluIHR5cGVzIG9mIEY3Ny4gIEZJWE1FOiBpbnRlZ2VyKjQgaXMgbWlzc2luZywgcGxhaW4KKyAgIGxvZ2ljYWwgaXMgbWlzc2luZyAoYnVpbHRpbl90eXBlX2xvZ2ljYWwgaXMgbG9naWNhbCo0KS4gICovCisKK3N0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfZl9jaGFyYWN0ZXI7CitzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2ZfbG9naWNhbDsKK3N0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfZl9sb2dpY2FsX3MxOworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9mX2xvZ2ljYWxfczI7CitzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2ZfaW50ZWdlcjsgCitzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2ZfaW50ZWdlcl9zMjsKK3N0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfZl9yZWFsOworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9mX3JlYWxfczg7CitzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2ZfcmVhbF9zMTY7CitzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2ZfY29tcGxleF9zODsKK3N0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfZl9jb21wbGV4X3MxNjsKK3N0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfZl9jb21wbGV4X3MzMjsKK3N0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfZl92b2lkOworCisvKiBGb2xsb3dpbmcgaXMgZHViaW91cyBzdHVmZiB0aGF0IGhhZCBiZWVuIGluIHRoZSB4Y29mZiByZWFkZXIuICovCisKK3N0cnVjdCBzYXZlZF9mY24KK3sKKyAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX29mZnNldDsgIC8qIExpbmUgb2Zmc2V0IGZvciBmdW5jdGlvbiAqLyAKKyAgc3RydWN0IHNhdmVkX2ZjbiAgICAgICAgICAgICAqbmV4dDsgICAgICAKK307IAorCisKK3N0cnVjdCBzYXZlZF9iZl9zeW1udW0gCit7CisgIGxvbmcgICAgICAgc3ltbnVtX2ZjbjsgIC8qIFN5bW51bSBvZiBmdW5jdGlvbiAoaS5lLiAuZnVuY3Rpb24gZGlyZWN0aXZlKSAqLworICBsb25nICAgICAgIHN5bW51bV9iZjsgICAvKiBTeW1udW0gb2YgLmJmIGZvciB0aGlzIGZ1bmN0aW9uICovIAorICBzdHJ1Y3Qgc2F2ZWRfYmZfc3ltbnVtICpuZXh0OyAgCit9OyAKKwordHlwZWRlZiBzdHJ1Y3Qgc2F2ZWRfZmNuICAgICAgICAgICBTQVZFRF9GVU5DVElPTiwgKlNBVkVEX0ZVTkNUSU9OX1BUUjsgCit0eXBlZGVmIHN0cnVjdCBzYXZlZF9iZl9zeW1udW0gICAgIFNBVkVEX0JGLCAqU0FWRURfQkZfUFRSOyAKKworLyogTG9jYWwgZnVuY3Rpb25zICovCisKKyNpZiAwCitzdGF0aWMgdm9pZCBjbGVhcl9mdW5jdGlvbl9saXN0IFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBsb25nIGdldF9iZl9mb3JfZmNuIFBBUkFNUyAoKGxvbmcpKTsKK3N0YXRpYyB2b2lkIGNsZWFyX2JmX2xpc3QgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgcGF0Y2hfYWxsX2NvbW1vbnNfYnlfbmFtZSBQQVJBTVMgKChjaGFyICosIENPUkVfQUREUiwgaW50KSk7CitzdGF0aWMgU0FWRURfRjc3X0NPTU1PTl9QVFIgZmluZF9maXJzdF9jb21tb25fbmFtZWQgUEFSQU1TICgoY2hhciAqKSk7CitzdGF0aWMgdm9pZCBhZGRfY29tbW9uX2VudHJ5IFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOworc3RhdGljIHZvaWQgYWRkX2NvbW1vbl9ibG9jayBQQVJBTVMgKChjaGFyICosIENPUkVfQUREUiwgaW50LCBjaGFyICopKTsKK3N0YXRpYyBTQVZFRF9GVU5DVElPTiAqYWxsb2NhdGVfc2F2ZWRfZnVuY3Rpb25fbm9kZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgU0FWRURfQkZfUFRSIGFsbG9jYXRlX3NhdmVkX2JmX25vZGUgUEFSQU1TICgodm9pZCkpOworc3RhdGljIENPTU1PTl9FTlRSWV9QVFIgYWxsb2NhdGVfY29tbW9uX2VudHJ5X25vZGUgUEFSQU1TICgodm9pZCkpOworc3RhdGljIFNBVkVEX0Y3N19DT01NT05fUFRSIGFsbG9jYXRlX3NhdmVkX2Y3N19jb21tb25fbm9kZSBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBwYXRjaF9jb21tb25fZW50cmllcyBQQVJBTVMgKChTQVZFRF9GNzdfQ09NTU9OX1BUUiwgQ09SRV9BRERSLCBpbnQpKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHR5cGUgKmZfY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGUgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBmX3ByaW50c3RyIFBBUkFNUyAoKEdEQl9GSUxFICpzdHJlYW0sIGNoYXIgKnN0cmluZywgdW5zaWduZWQgaW50IGxlbmd0aCwgaW50IHdpZHRoLCBpbnQgZm9yY2VfZWxsaXBzZXMpKTsKK3N0YXRpYyB2b2lkIGZfcHJpbnRjaGFyIFBBUkFNUyAoKGludCBjLCBHREJfRklMRSAqc3RyZWFtKSk7CitzdGF0aWMgdm9pZCBmX2VtaXRfY2hhciBQQVJBTVMgKChpbnQgYywgR0RCX0ZJTEUgKnN0cmVhbSwgaW50IHF1b3RlcikpOworCisvKiBQcmludCB0aGUgY2hhcmFjdGVyIEMgb24gU1RSRUFNIGFzIHBhcnQgb2YgdGhlIGNvbnRlbnRzIG9mIGEgbGl0ZXJhbAorICAgc3RyaW5nIHdob3NlIGRlbGltaXRlciBpcyBRVU9URVIuICBOb3RlIHRoYXQgdGhhdCBmb3JtYXQgZm9yIHByaW50aW5nCisgICBjaGFyYWN0ZXJzIGFuZCBzdHJpbmdzIGlzIGxhbmd1YWdlIHNwZWNpZmljLgorICAgRklYTUU6ICBUaGlzIGlzIGEgY29weSBvZiB0aGUgc2FtZSBmdW5jdGlvbiBmcm9tIGMtZXhwLnkuICBJdCBzaG91bGQKKyAgIGJlIHJlcGxhY2VkIHdpdGggYSB0cnVlIEY3NyB2ZXJzaW9uLiAgKi8KKworc3RhdGljIHZvaWQKK2ZfZW1pdF9jaGFyIChjLCBzdHJlYW0sIHF1b3RlcikKKyAgICAgcmVnaXN0ZXIgaW50IGM7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGludCBxdW90ZXI7Cit7CisgIGMgJj0gMHhGRjsJCQkvKiBBdm9pZCBzaWduIGJpdCBmb2xsaWVzICovCisgIAorICBpZiAoUFJJTlRfTElURVJBTF9GT1JNIChjKSkKKyAgICB7CisgICAgICBpZiAoYyA9PSAnXFwnIHx8IGMgPT0gcXVvdGVyKQorCWZwdXRzX2ZpbHRlcmVkICgiXFwiLCBzdHJlYW0pOworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJWMiLCBjKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzd2l0Y2ggKGMpCisJeworCWNhc2UgJ1xuJzoKKwkgIGZwdXRzX2ZpbHRlcmVkICgiXFxuIiwgc3RyZWFtKTsKKwkgIGJyZWFrOworCWNhc2UgJ1xiJzoKKwkgIGZwdXRzX2ZpbHRlcmVkICgiXFxiIiwgc3RyZWFtKTsKKwkgIGJyZWFrOworCWNhc2UgJ1x0JzoKKwkgIGZwdXRzX2ZpbHRlcmVkICgiXFx0Iiwgc3RyZWFtKTsKKwkgIGJyZWFrOworCWNhc2UgJ1xmJzoKKwkgIGZwdXRzX2ZpbHRlcmVkICgiXFxmIiwgc3RyZWFtKTsKKwkgIGJyZWFrOworCWNhc2UgJ1xyJzoKKwkgIGZwdXRzX2ZpbHRlcmVkICgiXFxyIiwgc3RyZWFtKTsKKwkgIGJyZWFrOworCWNhc2UgJ1wwMzMnOgorCSAgZnB1dHNfZmlsdGVyZWQgKCJcXGUiLCBzdHJlYW0pOworCSAgYnJlYWs7CisJY2FzZSAnXDAwNyc6CisJICBmcHV0c19maWx0ZXJlZCAoIlxcYSIsIHN0cmVhbSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiXFwlLjNvIiwgKHVuc2lnbmVkIGludCkgYyk7CisJICBicmVhazsKKwl9CisgICAgfQorfQorCisvKiBGSVhNRTogIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBzYW1lIGZ1bmN0aW9uIGZyb20gYy1leHAueS4gIEl0IHNob3VsZAorICAgYmUgcmVwbGFjZWQgd2l0aCBhIHRydWUgRjc3dmVyc2lvbi4gKi8KKworc3RhdGljIHZvaWQKK2ZfcHJpbnRjaGFyIChjLCBzdHJlYW0pCisgICAgIGludCBjOworICAgICBHREJfRklMRSAqc3RyZWFtOworeworICBmcHV0c19maWx0ZXJlZCAoIiciLCBzdHJlYW0pOworICBMQV9FTUlUX0NIQVIgKGMsIHN0cmVhbSwgJ1wnJyk7CisgIGZwdXRzX2ZpbHRlcmVkICgiJyIsIHN0cmVhbSk7Cit9CisKKy8qIFByaW50IHRoZSBjaGFyYWN0ZXIgc3RyaW5nIFNUUklORywgcHJpbnRpbmcgYXQgbW9zdCBMRU5HVEggY2hhcmFjdGVycy4KKyAgIFByaW50aW5nIHN0b3BzIGVhcmx5IGlmIHRoZSBudW1iZXIgaGl0cyBwcmludF9tYXg7IHJlcGVhdCBjb3VudHMKKyAgIGFyZSBwcmludGVkIGFzIGFwcHJvcHJpYXRlLiAgUHJpbnQgZWxsaXBzZXMgYXQgdGhlIGVuZCBpZiB3ZQorICAgaGFkIHRvIHN0b3AgYmVmb3JlIHByaW50aW5nIExFTkdUSCBjaGFyYWN0ZXJzLCBvciBpZiBGT1JDRV9FTExJUFNFUy4KKyAgIEZJWE1FOiAgVGhpcyBpcyBhIGNvcHkgb2YgdGhlIHNhbWUgZnVuY3Rpb24gZnJvbSBjLWV4cC55LiAgSXQgc2hvdWxkCisgICBiZSByZXBsYWNlZCB3aXRoIGEgdHJ1ZSBGNzcgdmVyc2lvbi4gKi8KKworc3RhdGljIHZvaWQKK2ZfcHJpbnRzdHIgKHN0cmVhbSwgc3RyaW5nLCBsZW5ndGgsIHdpZHRoLCBmb3JjZV9lbGxpcHNlcykKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgY2hhciAqc3RyaW5nOworICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworICAgICBpbnQgd2lkdGg7CisgICAgIGludCBmb3JjZV9lbGxpcHNlczsKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVkIGludCB0aGluZ3NfcHJpbnRlZCA9IDA7CisgIGludCBpbl9xdW90ZXMgPSAwOworICBpbnQgbmVlZF9jb21tYSA9IDA7CisgIGV4dGVybiBpbnQgaW5zcGVjdF9pdDsKKyAgZXh0ZXJuIGludCByZXBlYXRfY291bnRfdGhyZXNob2xkOworICBleHRlcm4gaW50IHByaW50X21heDsKKyAgCisgIGlmIChsZW5ndGggPT0gMCkKKyAgICB7CisgICAgICBmcHV0c19maWx0ZXJlZCAoIicnIiwgZ2RiX3N0ZG91dCk7CisgICAgICByZXR1cm47CisgICAgfQorICAKKyAgZm9yIChpID0gMDsgaSA8IGxlbmd0aCAmJiB0aGluZ3NfcHJpbnRlZCA8IHByaW50X21heDsgKytpKQorICAgIHsKKyAgICAgIC8qIFBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgd2UgYXJlIGV4YW1pbmluZworCSB0byBzZWUgd2hldGhlciBpdCBpcyByZXBlYXRlZC4gICovCisgICAgICB1bnNpZ25lZCBpbnQgcmVwMTsKKyAgICAgIC8qIE51bWJlciBvZiByZXBldGl0aW9ucyB3ZSBoYXZlIGRldGVjdGVkIHNvIGZhci4gICovCisgICAgICB1bnNpZ25lZCBpbnQgcmVwczsKKyAgICAgIAorICAgICAgUVVJVDsKKyAgICAgIAorICAgICAgaWYgKG5lZWRfY29tbWEpCisJeworCSAgZnB1dHNfZmlsdGVyZWQgKCIsICIsIHN0cmVhbSk7CisJICBuZWVkX2NvbW1hID0gMDsKKwl9CisgICAgICAKKyAgICAgIHJlcDEgPSBpICsgMTsKKyAgICAgIHJlcHMgPSAxOworICAgICAgd2hpbGUgKHJlcDEgPCBsZW5ndGggJiYgc3RyaW5nW3JlcDFdID09IHN0cmluZ1tpXSkKKwl7CisJICArK3JlcDE7CisJICArK3JlcHM7CisJfQorICAgICAgCisgICAgICBpZiAocmVwcyA+IHJlcGVhdF9jb3VudF90aHJlc2hvbGQpCisJeworCSAgaWYgKGluX3F1b3RlcykKKwkgICAgeworCSAgICAgIGlmIChpbnNwZWN0X2l0KQorCQlmcHV0c19maWx0ZXJlZCAoIlxcJywgIiwgc3RyZWFtKTsKKwkgICAgICBlbHNlCisJCWZwdXRzX2ZpbHRlcmVkICgiJywgIiwgc3RyZWFtKTsKKwkgICAgICBpbl9xdW90ZXMgPSAwOworCSAgICB9CisJICBmX3ByaW50Y2hhciAoc3RyaW5nW2ldLCBzdHJlYW0pOworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiIDxyZXBlYXRzICV1IHRpbWVzPiIsIHJlcHMpOworCSAgaSA9IHJlcDEgLSAxOworCSAgdGhpbmdzX3ByaW50ZWQgKz0gcmVwZWF0X2NvdW50X3RocmVzaG9sZDsKKwkgIG5lZWRfY29tbWEgPSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoIWluX3F1b3RlcykKKwkgICAgeworCSAgICAgIGlmIChpbnNwZWN0X2l0KQorCQlmcHV0c19maWx0ZXJlZCAoIlxcJyIsIHN0cmVhbSk7CisJICAgICAgZWxzZQorCQlmcHV0c19maWx0ZXJlZCAoIiciLCBzdHJlYW0pOworCSAgICAgIGluX3F1b3RlcyA9IDE7CisJICAgIH0KKwkgIExBX0VNSVRfQ0hBUiAoc3RyaW5nW2ldLCBzdHJlYW0sICciJyk7CisJICArK3RoaW5nc19wcmludGVkOworCX0KKyAgICB9CisgIAorICAvKiBUZXJtaW5hdGUgdGhlIHF1b3RlcyBpZiBuZWNlc3NhcnkuICAqLworICBpZiAoaW5fcXVvdGVzKQorICAgIHsKKyAgICAgIGlmIChpbnNwZWN0X2l0KQorCWZwdXRzX2ZpbHRlcmVkICgiXFwnIiwgc3RyZWFtKTsKKyAgICAgIGVsc2UKKwlmcHV0c19maWx0ZXJlZCAoIiciLCBzdHJlYW0pOworICAgIH0KKyAgCisgIGlmIChmb3JjZV9lbGxpcHNlcyB8fCBpIDwgbGVuZ3RoKQorICAgIGZwdXRzX2ZpbHRlcmVkICgiLi4uIiwgc3RyZWFtKTsKK30KKworLyogRklYTUU6ICBUaGlzIGlzIGEgY29weSBvZiBjX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlKCksIGJlZm9yZQorICAgYWxsIHRoZSBub24tQyB0eXBlcyB3ZXJlIHN0cmlwcGVkIGZyb20gaXQuICBOZWVkcyB0byBiZSBmaXhlZAorICAgYnkgYW4gZXhwZXJpZW5jZWQgRjc3IHByb2dyYW1tZXIuICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitmX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCB0eXBlaWQpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBpbnQgdHlwZWlkOworeworICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdHlwZSA9IE5VTEw7CisgIAorICBzd2l0Y2ggKHR5cGVpZCkKKyAgICB7CisgICAgY2FzZSBGVF9WT0lEOgorICAgICAgdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX1ZPSUQsCisJCQlUQVJHRVRfQ0hBUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkwLCAiVk9JRCIsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGVF9CT09MRUFOOgorICAgICAgdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0JPT0wsCisJCQlUQVJHRVRfQ0hBUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQlUWVBFX0ZMQUdfVU5TSUdORUQsICJib29sZWFuIiwgb2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZUX1NUUklORzoKKyAgICAgIHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9TVFJJTkcsCisJCQlUQVJHRVRfQ0hBUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkwLCAic3RyaW5nIiwgb2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZUX0NIQVI6CisgICAgICB0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJVEFSR0VUX0NIQVJfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJMCwgImNoYXJhY3RlciIsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGVF9TSUdORURfQ0hBUjoKKyAgICAgIHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsCisJCQlUQVJHRVRfQ0hBUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkwLCAiaW50ZWdlcioxIiwgb2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZUX1VOU0lHTkVEX0NIQVI6CisgICAgICB0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfQk9PTCwKKwkJCVRBUkdFVF9DSEFSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCVRZUEVfRkxBR19VTlNJR05FRCwgImxvZ2ljYWwqMSIsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGVF9TSE9SVDoKKyAgICAgIHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsCisJCQlUQVJHRVRfU0hPUlRfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJMCwgImludGVnZXIqMiIsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGVF9TSUdORURfU0hPUlQ6CisgICAgICB0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJVEFSR0VUX1NIT1JUX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCTAsICJzaG9ydCIsIG9iamZpbGUpOwkvKiBGSVhNRS1mbmYgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlRfVU5TSUdORURfU0hPUlQ6CisgICAgICB0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfQk9PTCwKKwkJCVRBUkdFVF9TSE9SVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQlUWVBFX0ZMQUdfVU5TSUdORUQsICJsb2dpY2FsKjIiLCBvYmpmaWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlRfSU5URUdFUjoKKyAgICAgIHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsCisJCQlUQVJHRVRfSU5UX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCTAsICJpbnRlZ2VyKjQiLCBvYmpmaWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlRfU0lHTkVEX0lOVEVHRVI6CisgICAgICB0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJVEFSR0VUX0lOVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkwLCAiaW50ZWdlciIsIG9iamZpbGUpOyAvKiBGSVhNRSAtZm5mICovCisgICAgICBicmVhazsKKyAgICBjYXNlIEZUX1VOU0lHTkVEX0lOVEVHRVI6CisgICAgICB0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfQk9PTCwgCisJCQlUQVJHRVRfSU5UX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCVRZUEVfRkxBR19VTlNJR05FRCwgImxvZ2ljYWwqNCIsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGVF9GSVhFRF9ERUNJTUFMOgorICAgICAgdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwKKwkJCVRBUkdFVF9JTlRfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJMCwgImZpeGVkIGRlY2ltYWwiLCBvYmpmaWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlRfTE9ORzoKKyAgICAgIHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsCisJCQlUQVJHRVRfTE9OR19CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkwLCAibG9uZyIsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGVF9TSUdORURfTE9ORzoKKyAgICAgIHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsCisJCQlUQVJHRVRfTE9OR19CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkwLCAibG9uZyIsIG9iamZpbGUpOyAvKiBGSVhNRSAtZm5mICovCisgICAgICBicmVhazsKKyAgICBjYXNlIEZUX1VOU0lHTkVEX0xPTkc6CisgICAgICB0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJVEFSR0VUX0xPTkdfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJVFlQRV9GTEFHX1VOU0lHTkVELCAidW5zaWduZWQgbG9uZyIsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGVF9MT05HX0xPTkc6CisgICAgICB0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJVEFSR0VUX0xPTkdfTE9OR19CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkwLCAibG9uZyBsb25nIiwgb2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZUX1NJR05FRF9MT05HX0xPTkc6CisgICAgICB0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJVEFSR0VUX0xPTkdfTE9OR19CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkwLCAic2lnbmVkIGxvbmcgbG9uZyIsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGVF9VTlNJR05FRF9MT05HX0xPTkc6CisgICAgICB0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJVEFSR0VUX0xPTkdfTE9OR19CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQlUWVBFX0ZMQUdfVU5TSUdORUQsICJ1bnNpZ25lZCBsb25nIGxvbmciLCBvYmpmaWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlRfRkxPQVQ6CisgICAgICB0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfRkxULAorCQkJVEFSR0VUX0ZMT0FUX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCTAsICJyZWFsIiwgb2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZUX0RCTF9QUkVDX0ZMT0FUOgorICAgICAgdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0ZMVCwKKwkJCVRBUkdFVF9ET1VCTEVfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJMCwgInJlYWwqOCIsIG9iamZpbGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGVF9GTE9BVF9ERUNJTUFMOgorICAgICAgdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0ZMVCwKKwkJCVRBUkdFVF9ET1VCTEVfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJMCwgImZsb2F0aW5nIGRlY2ltYWwiLCBvYmpmaWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlRfRVhUX1BSRUNfRkxPQVQ6CisgICAgICB0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfRkxULAorCQkJVEFSR0VUX0xPTkdfRE9VQkxFX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCTAsICJyZWFsKjE2Iiwgb2JqZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZUX0NPTVBMRVg6CisgICAgICB0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfQ09NUExFWCwKKwkJCTIgKiBUQVJHRVRfRkxPQVRfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJMCwgImNvbXBsZXgqOCIsIG9iamZpbGUpOworICAgICAgVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkgPSBidWlsdGluX3R5cGVfZl9yZWFsOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGVF9EQkxfUFJFQ19DT01QTEVYOgorICAgICAgdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0NPTVBMRVgsCisJCQkyICogVEFSR0VUX0RPVUJMRV9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkwLCAiY29tcGxleCoxNiIsIG9iamZpbGUpOworICAgICAgVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkgPSBidWlsdGluX3R5cGVfZl9yZWFsX3M4OworICAgICAgYnJlYWs7CisgICAgY2FzZSBGVF9FWFRfUFJFQ19DT01QTEVYOgorICAgICAgdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0NPTVBMRVgsCisJCQkyICogVEFSR0VUX0xPTkdfRE9VQkxFX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCTAsICJjb21wbGV4KjMyIiwgb2JqZmlsZSk7CisgICAgICBUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSA9IGJ1aWx0aW5fdHlwZV9mX3JlYWxfczE2OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIEZJWE1FOiAgRm9yIG5vdywgaWYgd2UgYXJlIGFza2VkIHRvIHByb2R1Y2UgYSB0eXBlIG5vdCBpbiB0aGlzCisJIGxhbmd1YWdlLCBjcmVhdGUgdGhlIGVxdWl2YWxlbnQgb2YgYSBDIGludGVnZXIgdHlwZSB3aXRoIHRoZQorCSBuYW1lICI8P3R5cGU/PiIuICBXaGVuIGFsbCB0aGUgZHVzdCBzZXR0bGVzIGZyb20gdGhlIHR5cGUKKwkgcmVjb25zdHJ1Y3Rpb24gd29yaywgdGhpcyBzaG91bGQgcHJvYmFibHkgYmVjb21lIGFuIGVycm9yLiAqLworICAgICAgdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwKKwkJCVRBUkdFVF9JTlRfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJMCwgIjw/dHlwZT8+Iiwgb2JqZmlsZSk7CisgICAgICB3YXJuaW5nICgiaW50ZXJuYWwgZXJyb3I6IG5vIEY3NyBmdW5kYW1lbnRhbCB0eXBlICVkIiwgdHlwZWlkKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuICh0eXBlKTsKK30KKworDAorLyogVGFibGUgb2Ygb3BlcmF0b3JzIGFuZCB0aGVpciBwcmVjZWRlbmNlcyBmb3IgcHJpbnRpbmcgZXhwcmVzc2lvbnMuICAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wX3ByaW50IGZfb3BfcHJpbnRfdGFiW10gPSB7CisgIHsgIisiLCAgICAgQklOT1BfQURELCBQUkVDX0FERCwgMCB9LAorICB7ICIrIiwgICAgIFVOT1BfUExVUywgUFJFQ19QUkVGSVgsIDAgfSwKKyAgeyAiLSIsICAgICBCSU5PUF9TVUIsIFBSRUNfQURELCAwIH0sCisgIHsgIi0iLCAgICAgVU5PUF9ORUcsIFBSRUNfUFJFRklYLCAwIH0sCisgIHsgIioiLCAgICAgQklOT1BfTVVMLCBQUkVDX01VTCwgMCB9LAorICB7ICIvIiwgICAgIEJJTk9QX0RJViwgUFJFQ19NVUwsIDAgfSwKKyAgeyAiRElWIiwgICBCSU5PUF9JTlRESVYsIFBSRUNfTVVMLCAwIH0sCisgIHsgIk1PRCIsICAgQklOT1BfUkVNLCBQUkVDX01VTCwgMCB9LAorICB7ICI9IiwgICAgIEJJTk9QX0FTU0lHTiwgUFJFQ19BU1NJR04sIDEgfSwKKyAgeyAiLk9SLiIsICBCSU5PUF9MT0dJQ0FMX09SLCBQUkVDX0xPR0lDQUxfT1IsIDAgfSwKKyAgeyAiLkFORC4iLCBCSU5PUF9MT0dJQ0FMX0FORCwgUFJFQ19MT0dJQ0FMX0FORCwgMCB9LAorICB7ICIuTk9ULiIsIFVOT1BfTE9HSUNBTF9OT1QsIFBSRUNfUFJFRklYLCAwIH0sCisgIHsgIi5FUS4iLCAgQklOT1BfRVFVQUwsIFBSRUNfRVFVQUwsIDAgfSwKKyAgeyAiLk5FLiIsICBCSU5PUF9OT1RFUVVBTCwgUFJFQ19FUVVBTCwgMCB9LAorICB7ICIuTEUuIiwgIEJJTk9QX0xFUSwgUFJFQ19PUkRFUiwgMCB9LAorICB7ICIuR0UuIiwgIEJJTk9QX0dFUSwgUFJFQ19PUkRFUiwgMCB9LAorICB7ICIuR1QuIiwgIEJJTk9QX0dUUiwgUFJFQ19PUkRFUiwgMCB9LAorICB7ICIuTFQuIiwgIEJJTk9QX0xFU1MsIFBSRUNfT1JERVIsIDAgfSwKKyAgeyAiKioiLCAgICBVTk9QX0lORCwgUFJFQ19QUkVGSVgsIDAgfSwKKyAgeyAiQCIsICAgICBCSU5PUF9SRVBFQVQsIFBSRUNfUkVQRUFULCAwIH0sCisgIHsgTlVMTCwgICAgMCwgMCwgMCB9Cit9OworDAorc3RydWN0IHR5cGUgKiogQ09OU1RfUFRSIChmX2J1aWx0aW5fdHlwZXNbXSkgPSAKK3sKKyAgJmJ1aWx0aW5fdHlwZV9mX2NoYXJhY3RlciwKKyAgJmJ1aWx0aW5fdHlwZV9mX2xvZ2ljYWwsCisgICZidWlsdGluX3R5cGVfZl9sb2dpY2FsX3MxLAorICAmYnVpbHRpbl90eXBlX2ZfbG9naWNhbF9zMiwKKyAgJmJ1aWx0aW5fdHlwZV9mX2ludGVnZXIsCisgICZidWlsdGluX3R5cGVfZl9pbnRlZ2VyX3MyLAorICAmYnVpbHRpbl90eXBlX2ZfcmVhbCwKKyAgJmJ1aWx0aW5fdHlwZV9mX3JlYWxfczgsCisgICZidWlsdGluX3R5cGVfZl9yZWFsX3MxNiwKKyAgJmJ1aWx0aW5fdHlwZV9mX2NvbXBsZXhfczgsCisgICZidWlsdGluX3R5cGVfZl9jb21wbGV4X3MxNiwKKyNpZiAwCisgICZidWlsdGluX3R5cGVfZl9jb21wbGV4X3MzMiwKKyNlbmRpZgorICAmYnVpbHRpbl90eXBlX2Zfdm9pZCwKKyAgMAorfTsKKworLyogVGhpcyBpcyBkZWNsYXJlZCBpbiBjLWxhbmcuaCBidXQgaXQgaXMgc2lsbHkgdG8gaW1wb3J0IHRoYXQgZmlsZSBmb3Igd2hhdAorICAgaXMgYWxyZWFkeSBqdXN0IGEgaGFjay4gKi8KK2V4dGVybiBpbnQKK2NfdmFsdWVfcHJpbnQgUEFSQU1TICgoc3RydWN0IHZhbHVlICosIEdEQl9GSUxFICosIGludCwgZW51bSB2YWxfcHJldHR5cHJpbnQpKTsKKworY29uc3Qgc3RydWN0IGxhbmd1YWdlX2RlZm4gZl9sYW5ndWFnZV9kZWZuID0geworICAiZm9ydHJhbiIsCisgIGxhbmd1YWdlX2ZvcnRyYW4sCisgIGZfYnVpbHRpbl90eXBlcywKKyAgcmFuZ2VfY2hlY2tfb24sCisgIHR5cGVfY2hlY2tfb24sCisgIGZfcGFyc2UsCQkJLyogcGFyc2VyICovCisgIGZfZXJyb3IsCQkJLyogcGFyc2VyIGVycm9yIGZ1bmN0aW9uICovCisgIGV2YWx1YXRlX3N1YmV4cF9zdGFuZGFyZCwKKyAgZl9wcmludGNoYXIsCQkJLyogUHJpbnQgY2hhcmFjdGVyIGNvbnN0YW50ICovCisgIGZfcHJpbnRzdHIsCQkJLyogZnVuY3Rpb24gdG8gcHJpbnQgc3RyaW5nIGNvbnN0YW50ICovCisgIGZfZW1pdF9jaGFyLAkJCS8qIEZ1bmN0aW9uIHRvIHByaW50IGEgc2luZ2xlIGNoYXJhY3RlciAqLworICBmX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlLAkvKiBDcmVhdGUgZnVuZGFtZW50YWwgdHlwZSBpbiB0aGlzIGxhbmd1YWdlICovCisgIGZfcHJpbnRfdHlwZSwJCSAgICAgICAgLyogUHJpbnQgYSB0eXBlIHVzaW5nIGFwcHJvcHJpYXRlIHN5bnRheCAqLworICBmX3ZhbF9wcmludCwJCQkvKiBQcmludCBhIHZhbHVlIHVzaW5nIGFwcHJvcHJpYXRlIHN5bnRheCAqLworICBjX3ZhbHVlX3ByaW50LCAgLyogRklYTUUgKi8KKyAgeyIiLCAgICAgICIiLCAgICIiLCAgICIifSwJLyogQmluYXJ5IGZvcm1hdCBpbmZvICovCisgIHsiMCVvIiwgICIwIiwgICAibyIsICIifSwJLyogT2N0YWwgZm9ybWF0IGluZm8gKi8KKyAgeyIlZCIsICAgIiIsICAgICJkIiwgIiJ9LAkvKiBEZWNpbWFsIGZvcm1hdCBpbmZvICovCisgIHsiMHgleCIsICIweCIsICAieCIsICIifSwJLyogSGV4IGZvcm1hdCBpbmZvICovCisgIGZfb3BfcHJpbnRfdGFiLAkJLyogZXhwcmVzc2lvbiBvcGVyYXRvcnMgZm9yIHByaW50aW5nICovCisgIDAsCQkJCS8qIGFycmF5cyBhcmUgZmlyc3QtY2xhc3MgKG5vdCBjLXN0eWxlKSAqLworICAxLAkJCQkvKiBTdHJpbmcgbG93ZXIgYm91bmQgKi8KKyAgJmJ1aWx0aW5fdHlwZV9mX2NoYXJhY3RlciwJLyogVHlwZSBvZiBzdHJpbmcgZWxlbWVudHMgKi8gCisgIExBTkdfTUFHSUMKKyAgfTsKKwordm9pZAorX2luaXRpYWxpemVfZl9sYW5ndWFnZSAoKQoreworICBidWlsdGluX3R5cGVfZl92b2lkID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9WT0lELCAxLAorCSAgICAgICAwLAorCSAgICAgICAiVk9JRCIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgCisgIGJ1aWx0aW5fdHlwZV9mX2NoYXJhY3RlciA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCBUQVJHRVRfQ0hBUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJICAgICAgIDAsCisJICAgICAgICJjaGFyYWN0ZXIiLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIAorICBidWlsdGluX3R5cGVfZl9sb2dpY2FsX3MxID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9CT09MLCBUQVJHRVRfQ0hBUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJICAgICAgIFRZUEVfRkxBR19VTlNJR05FRCwKKwkgICAgICAgImxvZ2ljYWwqMSIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgCisgIGJ1aWx0aW5fdHlwZV9mX2ludGVnZXJfczIgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgVEFSR0VUX1NIT1JUX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgMCwKKwkgICAgICAgImludGVnZXIqMiIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgCisgIGJ1aWx0aW5fdHlwZV9mX2xvZ2ljYWxfczIgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0JPT0wsIFRBUkdFVF9TSE9SVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJICAgICAgIFRZUEVfRkxBR19VTlNJR05FRCwKKwkgICAgICAgImxvZ2ljYWwqMiIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgCisgIGJ1aWx0aW5fdHlwZV9mX2ludGVnZXIgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgVEFSR0VUX0lOVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJICAgICAgIDAsCisJICAgICAgICJpbnRlZ2VyIiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICAKKyAgYnVpbHRpbl90eXBlX2ZfbG9naWNhbCA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfQk9PTCwgVEFSR0VUX0lOVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJICAgICAgIFRZUEVfRkxBR19VTlNJR05FRCwKKwkgICAgICAgImxvZ2ljYWwqNCIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgCisgIGJ1aWx0aW5fdHlwZV9mX3JlYWwgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0ZMVCwgVEFSR0VUX0ZMT0FUX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgMCwKKwkgICAgICAgInJlYWwiLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIAorICBidWlsdGluX3R5cGVfZl9yZWFsX3M4ID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9GTFQsIFRBUkdFVF9ET1VCTEVfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCSAgICAgICAwLAorCSAgICAgICAicmVhbCo4IiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICAKKyAgYnVpbHRpbl90eXBlX2ZfcmVhbF9zMTYgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0ZMVCwgVEFSR0VUX0xPTkdfRE9VQkxFX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgMCwKKwkgICAgICAgInJlYWwqMTYiLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIAorICBidWlsdGluX3R5cGVfZl9jb21wbGV4X3M4ID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9DT01QTEVYLCAyICogVEFSR0VUX0ZMT0FUX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgMCwKKwkgICAgICAgImNvbXBsZXgqOCIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgVFlQRV9UQVJHRVRfVFlQRSAoYnVpbHRpbl90eXBlX2ZfY29tcGxleF9zOCkgPSBidWlsdGluX3R5cGVfZl9yZWFsOworICAKKyAgYnVpbHRpbl90eXBlX2ZfY29tcGxleF9zMTYgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0NPTVBMRVgsIDIgKiBUQVJHRVRfRE9VQkxFX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgMCwKKwkgICAgICAgImNvbXBsZXgqMTYiLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIFRZUEVfVEFSR0VUX1RZUEUgKGJ1aWx0aW5fdHlwZV9mX2NvbXBsZXhfczE2KSA9IGJ1aWx0aW5fdHlwZV9mX3JlYWxfczg7CisgIAorICAvKiBXZSBoYXZlIGEgbmV3IHNpemUgPT0gNCBkb3VibGUgZmxvYXRzIGZvciB0aGUKKyAgICAgY29tcGxleCozMiBkYXRhIHR5cGUgKi8KKyAgCisgIGJ1aWx0aW5fdHlwZV9mX2NvbXBsZXhfczMyID0gCisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfQ09NUExFWCwgMiAqIFRBUkdFVF9MT05HX0RPVUJMRV9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJICAgICAgIDAsCisJICAgICAgICJjb21wbGV4KjMyIiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICBUWVBFX1RBUkdFVF9UWVBFIChidWlsdGluX3R5cGVfZl9jb21wbGV4X3MzMikgPSBidWlsdGluX3R5cGVfZl9yZWFsX3MxNjsKKworICBidWlsdGluX3R5cGVfc3RyaW5nID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9TVFJJTkcsIFRBUkdFVF9DSEFSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgMCwKKwkgICAgICAgImNoYXJhY3RlciBzdHJpbmciLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7IAorICAKKyAgYWRkX2xhbmd1YWdlICgmZl9sYW5ndWFnZV9kZWZuKTsKK30KKworI2lmIDAKK3N0YXRpYyBTQVZFRF9CRl9QVFIKK2FsbG9jYXRlX3NhdmVkX2JmX25vZGUoKQoreworICBTQVZFRF9CRl9QVFIgbmV3OworICAKKyAgbmV3ID0gKFNBVkVEX0JGX1BUUikgeG1hbGxvYyAoc2l6ZW9mIChTQVZFRF9CRikpOworICByZXR1cm4obmV3KTsKK30KKworc3RhdGljIFNBVkVEX0ZVTkNUSU9OICoKK2FsbG9jYXRlX3NhdmVkX2Z1bmN0aW9uX25vZGUoKQoreworICBTQVZFRF9GVU5DVElPTiAqbmV3OworICAKKyAgbmV3ID0gKFNBVkVEX0ZVTkNUSU9OICopIHhtYWxsb2MgKHNpemVvZiAoU0FWRURfRlVOQ1RJT04pKTsKKyAgcmV0dXJuKG5ldyk7Cit9CisKK3N0YXRpYyBTQVZFRF9GNzdfQ09NTU9OX1BUUiBhbGxvY2F0ZV9zYXZlZF9mNzdfY29tbW9uX25vZGUoKQoreworICBTQVZFRF9GNzdfQ09NTU9OX1BUUiBuZXc7CisgIAorICBuZXcgPSAoU0FWRURfRjc3X0NPTU1PTl9QVFIpIHhtYWxsb2MgKHNpemVvZiAoU0FWRURfRjc3X0NPTU1PTikpOworICByZXR1cm4obmV3KTsKK30KKworc3RhdGljIENPTU1PTl9FTlRSWV9QVFIgYWxsb2NhdGVfY29tbW9uX2VudHJ5X25vZGUoKQoreworICBDT01NT05fRU5UUllfUFRSIG5ldzsKKyAgCisgIG5ldyA9IChDT01NT05fRU5UUllfUFRSKSB4bWFsbG9jIChzaXplb2YgKENPTU1PTl9FTlRSWSkpOworICByZXR1cm4obmV3KTsKK30KKyNlbmRpZgorCitTQVZFRF9GNzdfQ09NTU9OX1BUUiBoZWFkX2NvbW1vbl9saXN0PU5VTEw7ICAgICAvKiBQdHIgdG8gMXN0IHNhdmVkIENPTU1PTiAgKi8KK1NBVkVEX0Y3N19DT01NT05fUFRSIHRhaWxfY29tbW9uX2xpc3Q9TlVMTDsgICAgIC8qIFB0ciB0byBsYXN0IHNhdmVkIENPTU1PTiAgKi8KK1NBVkVEX0Y3N19DT01NT05fUFRSIGN1cnJlbnRfY29tbW9uPU5VTEw7ICAgICAgIC8qIFB0ciB0byBjdXJyZW50IENPTU1PTiAqLworCisjaWYgMAorc3RhdGljIFNBVkVEX0JGX1BUUiBzYXZlZF9iZl9saXN0PU5VTEw7ICAgICAgICAgIC8qIFB0ciB0byAoLmJmLGZ1bmN0aW9uKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0Ki8KK3N0YXRpYyBTQVZFRF9CRl9QVFIgc2F2ZWRfYmZfbGlzdF9lbmQ9TlVMTDsgICAgICAvKiBQdHIgdG8gYWJvdmUgbGlzdCdzIGVuZCAqLworc3RhdGljIFNBVkVEX0JGX1BUUiBjdXJyZW50X2hlYWRfYmZfbGlzdD1OVUxMOyAgIC8qIEN1cnJlbnQgaGVhZCBvZiBhYm92ZSBsaXN0CisJCQkJCQkgICovCisKK3N0YXRpYyBTQVZFRF9CRl9QVFIgdG1wX2JmX3B0cjsgICAgICAgICAgICAgICAgICAvKiBHZW5lcmljIHRlbXBvcmFyeSBmb3IgdXNlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1hY3JvcyAqLyAKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBzaW1wbHkgZW50ZXJzIGEgZ2l2ZW4gY29tbW9uIGJsb2NrIG9udG8gCisgICB0aGUgZ2xvYmFsIGNvbW1vbiBibG9jayBjaGFpbiAqLworCitzdGF0aWMgdm9pZAorYWRkX2NvbW1vbl9ibG9jayhuYW1lLG9mZnNldCxzZWNudW0sZnVuY19zdGFiKQorICAgICBjaGFyICpuYW1lOworICAgICBDT1JFX0FERFIgb2Zmc2V0OworICAgICBpbnQgc2VjbnVtOworICAgICBjaGFyICpmdW5jX3N0YWI7Cit7CisgIFNBVkVEX0Y3N19DT01NT05fUFRSIHRtcDsKKyAgY2hhciAqYywqbG9jYWxfY29weV9mdW5jX3N0YWI7IAorICAKKyAgLyogSWYgdGhlIENPTU1PTiBibG9jayB3ZSBhcmUgdHJ5aW5nIHRvIGFkZCBoYXMgYSBibGFuayAKKyAgICAgbmFtZSAoaS5lLiAiI0JMTktfQ09NIikgdGhlbiB3ZSBzZXQgaXQgdG8gX19CTEFOSworICAgICBiZWNhdXNlIHRoZSBkYXJuICIjIiBjaGFyYWN0ZXIgbWFrZXMgR0RCJ3MgaW5wdXQgCisgICAgIHBhcnNlciBoYXZlIGZpdHMuICovIAorICAKKyAgCisgIGlmIChTVFJFUShuYW1lLEJMQU5LX0NPTU1PTl9OQU1FX09SSUdJTkFMKSB8fAorICAgICAgU1RSRVEobmFtZSxCTEFOS19DT01NT05fTkFNRV9NRjc3KSkKKyAgICB7CisgICAgICAKKyAgICAgIGZyZWUobmFtZSk7CisgICAgICBuYW1lID0gYWxsb2NhKHN0cmxlbihCTEFOS19DT01NT05fTkFNRV9MT0NBTCkgKyAxKTsgCisgICAgICBzdHJjcHkobmFtZSxCTEFOS19DT01NT05fTkFNRV9MT0NBTCk7IAorICAgIH0KKyAgCisgIHRtcCA9IGFsbG9jYXRlX3NhdmVkX2Y3N19jb21tb25fbm9kZSgpOworICAKKyAgbG9jYWxfY29weV9mdW5jX3N0YWIgPSB4bWFsbG9jIChzdHJsZW4oZnVuY19zdGFiKSArIDEpOworICBzdHJjcHkobG9jYWxfY29weV9mdW5jX3N0YWIsZnVuY19zdGFiKTsgCisgIAorICB0bXAtPm5hbWUgPSB4bWFsbG9jKHN0cmxlbihuYW1lKSArIDEpOworICAKKyAgLyogbG9jYWxfY29weV9mdW5jX3N0YWIgaXMgYSBzdGFic3RyaW5nLCBsZXQgdXMgZmlyc3QgZXh0cmFjdCB0aGUgCisgICAgIGZ1bmN0aW9uIG5hbWUgZnJvbSB0aGUgc3RhYiBieSBOVUxMaW5nIG91dCB0aGUgJzonIGNoYXJhY3Rlci4gKi8gCisgIAorICAKKyAgYyA9IE5VTEw7IAorICBjID0gc3RyY2hyKGxvY2FsX2NvcHlfZnVuY19zdGFiLCc6Jyk7CisgIAorICBpZiAoYykKKyAgICAqYyA9ICdcMCc7CisgIGVsc2UKKyAgICBlcnJvcigiTWFsZm9ybWVkIGZ1bmN0aW9uIFNUQUIgZm91bmQgaW4gYWRkX2NvbW1vbl9ibG9jaygpIik7CisgIAorICAKKyAgdG1wLT5vd25pbmdfZnVuY3Rpb24gPSB4bWFsbG9jIChzdHJsZW4obG9jYWxfY29weV9mdW5jX3N0YWIpICsgMSk7IAorICAKKyAgc3RyY3B5KHRtcC0+b3duaW5nX2Z1bmN0aW9uLGxvY2FsX2NvcHlfZnVuY19zdGFiKTsgCisgIAorICBzdHJjcHkodG1wLT5uYW1lLG5hbWUpOworICB0bXAtPm9mZnNldCA9IG9mZnNldDsgCisgIHRtcC0+bmV4dCA9IE5VTEw7CisgIHRtcC0+ZW50cmllcyA9IE5VTEw7CisgIHRtcC0+c2VjbnVtID0gc2VjbnVtOyAKKyAgCisgIGN1cnJlbnRfY29tbW9uID0gdG1wOworICAKKyAgaWYgKGhlYWRfY29tbW9uX2xpc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICBoZWFkX2NvbW1vbl9saXN0ID0gdGFpbF9jb21tb25fbGlzdCA9IHRtcDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB0YWlsX2NvbW1vbl9saXN0LT5uZXh0ID0gdG1wOyAKKyAgICAgIHRhaWxfY29tbW9uX2xpc3QgPSB0bXA7CisgICAgfQorfQorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gc2ltcGx5IGVudGVycyBhIGdpdmVuIGNvbW1vbiBlbnRyeSBvbnRvIAorICAgdGhlICJjdXJyZW50X2NvbW1vbiIgYmxvY2sgdGhhdCBoYXMgYmVlbiBzYXZlZCBhd2F5LiAqLyAKKworI2lmIDAKK3N0YXRpYyB2b2lkCithZGRfY29tbW9uX2VudHJ5KGVudHJ5X3N5bV9wdHIpCisgICAgIHN0cnVjdCBzeW1ib2wgKmVudHJ5X3N5bV9wdHI7IAoreworICBDT01NT05fRU5UUllfUFRSIHRtcDsKKyAgCisgIAorICAKKyAgLyogVGhlIG9yZGVyIG9mIHRoaXMgbGlzdCBpcyBpbXBvcnRhbnQsIHNpbmNlIAorICAgICB3ZSBleHBlY3QgdGhlIGVudHJpZXMgdG8gYXBwZWFyIGluIGRlY2wuCisgICAgIG9yZGVyIHdoZW4gd2UgbGF0ZXIgaXNzdWUgImluZm8gY29tbW9uIiBjYWxscyAqLyAKKyAgCisgIHRtcCA9IGFsbG9jYXRlX2NvbW1vbl9lbnRyeV9ub2RlKCk7CisgIAorICB0bXAtPm5leHQgPSBOVUxMOworICB0bXAtPnN5bWJvbCA9IGVudHJ5X3N5bV9wdHI7CisgIAorICBpZiAoY3VycmVudF9jb21tb24gPT0gTlVMTCkKKyAgICBlcnJvcigiQXR0ZW1wdCB0byBhZGQgQ09NTU9OIGVudHJ5IHdpdGggbm8gYmxvY2sgb3BlbiEiKTsKKyAgZWxzZSAgICAgICAgIAorICAgIHsKKyAgICAgIGlmIChjdXJyZW50X2NvbW1vbi0+ZW50cmllcyA9PSBOVUxMKQorCXsKKwkgIGN1cnJlbnRfY29tbW9uLT5lbnRyaWVzID0gdG1wOworCSAgY3VycmVudF9jb21tb24tPmVuZF9vZl9lbnRyaWVzID0gdG1wOyAKKwl9CisgICAgICBlbHNlCisJeworCSAgY3VycmVudF9jb21tb24tPmVuZF9vZl9lbnRyaWVzLT5uZXh0ID0gdG1wOyAKKwkgIGN1cnJlbnRfY29tbW9uLT5lbmRfb2ZfZW50cmllcyA9IHRtcDsgCisJfQorICAgIH0KK30KKyNlbmRpZgorCisvKiBUaGlzIHJvdXRpbmUgZmluZHMgdGhlIGZpcnN0IGVuY291bnRyZWQgQ09NTU9OIGJsb2NrIG5hbWVkICJuYW1lIiAqLyAKKworI2lmIDAKK3N0YXRpYyBTQVZFRF9GNzdfQ09NTU9OX1BUUgorZmluZF9maXJzdF9jb21tb25fbmFtZWQobmFtZSkKKyAgICAgY2hhciAqbmFtZTsgCit7CisgIAorICBTQVZFRF9GNzdfQ09NTU9OX1BUUiB0bXA7CisgIAorICB0bXAgPSBoZWFkX2NvbW1vbl9saXN0OworICAKKyAgd2hpbGUgKHRtcCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChTVFJFUSh0bXAtPm5hbWUsbmFtZSkpCisJcmV0dXJuKHRtcCk7CisgICAgICBlbHNlCisJdG1wID0gdG1wLT5uZXh0OworICAgIH0KKyAgcmV0dXJuKE5VTEwpOyAKK30KKyNlbmRpZgorCisvKiBUaGlzIHJvdXRpbmUgZmluZHMgdGhlIGZpcnN0IGVuY291bnRyZWQgQ09NTU9OIGJsb2NrIG5hbWVkICJuYW1lIiAKKyAgIHRoYXQgYmVsb25ncyB0byBmdW5jdGlvbiBmdW5jbmFtZSAqLyAKKworU0FWRURfRjc3X0NPTU1PTl9QVFIgZmluZF9jb21tb25fZm9yX2Z1bmN0aW9uKG5hbWUsIGZ1bmNuYW1lKQorICAgICBjaGFyICpuYW1lOworICAgICBjaGFyICpmdW5jbmFtZTsgCit7CisgIAorICBTQVZFRF9GNzdfQ09NTU9OX1BUUiB0bXA7CisgIAorICB0bXAgPSBoZWFkX2NvbW1vbl9saXN0OworICAKKyAgd2hpbGUgKHRtcCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChTVFJFUSh0bXAtPm5hbWUsbmFtZSkgJiYgU1RSRVEodG1wLT5vd25pbmdfZnVuY3Rpb24sZnVuY25hbWUpKQorCXJldHVybih0bXApOworICAgICAgZWxzZQorCXRtcCA9IHRtcC0+bmV4dDsKKyAgICB9CisgIHJldHVybihOVUxMKTsgCit9CisKKworI2lmIDAKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcGF0Y2ggdXAgdGhlIG9mZnNldHMgCisgICBmb3IgdGhlIHN0YXRpY3MgY29udGFpbmVkIGluIHRoZSBDT01NT04gYmxvY2sgbmFtZWQKKyAgICJuYW1lLiIgICovIAorCitzdGF0aWMgdm9pZAorcGF0Y2hfY29tbW9uX2VudHJpZXMgKGJsaywgb2Zmc2V0LCBzZWNudW0pCisgICAgIFNBVkVEX0Y3N19DT01NT05fUFRSIGJsazsKKyAgICAgQ09SRV9BRERSIG9mZnNldDsKKyAgICAgaW50IHNlY251bTsKK3sKKyAgQ09NTU9OX0VOVFJZX1BUUiBlbnRyeTsKKyAgCisgIGJsay0+b2Zmc2V0ID0gb2Zmc2V0OyAgLyogS2VlcCB0aGlzIGFyb3VuZCBmb3IgZnV0dXJlIHVzZS4gKi8gCisgIAorICBlbnRyeSA9IGJsay0+ZW50cmllczsKKyAgCisgIHdoaWxlIChlbnRyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgIFNZTUJPTF9WQUxVRSAoZW50cnktPnN5bWJvbCkgKz0gb2Zmc2V0OyAKKyAgICAgIFNZTUJPTF9TRUNUSU9OIChlbnRyeS0+c3ltYm9sKSA9IHNlY251bTsKKyAgICAgIAorICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKKyAgICB9CisgIGJsay0+c2VjbnVtID0gc2VjbnVtOyAKK30KKworLyogUGF0Y2ggYWxsIGNvbW1vbnMgbmFtZWQgIm5hbWUiIHRoYXQgbmVlZCBwYXRjaGluZy5TaW5jZSBDT01NT04KKyAgIGJsb2NrcyBvY2N1ciB3aXRoIHJlbGF0aXZlIGluZnJlcXVlbmN5LCB3ZSBzaW1wbHkgZG8gYSBsaW5lYXIgc2NhbiBvbgorICAgdGhlIG5hbWUuICBFdmVudHVhbGx5LCB0aGUgYmVzdCB3YXkgdG8gZG8gdGhpcyB3aWxsIGJlIGEKKyAgIGhhc2hlZC1sb29rdXAuICBTZWNudW0gaXMgdGhlIHNlY3Rpb24gbnVtYmVyIGZvciB0aGUgLmJzcyBzZWN0aW9uCisgICAod2hpY2ggaXMgd2hlcmUgY29tbW9uIGRhdGEgbGl2ZXMpLiAqLworCitzdGF0aWMgdm9pZAorcGF0Y2hfYWxsX2NvbW1vbnNfYnlfbmFtZSAobmFtZSwgb2Zmc2V0LCBzZWNudW0pCisgICAgIGNoYXIgKm5hbWU7CisgICAgIENPUkVfQUREUiBvZmZzZXQ7CisgICAgIGludCBzZWNudW07Cit7CisgIAorICBTQVZFRF9GNzdfQ09NTU9OX1BUUiB0bXA7CisgIAorICAvKiBGb3IgYmxhbmsgY29tbW9uIGJsb2NrcywgY2hhbmdlIHRoZSBjYW5vbmljYWwgcmVwcnNlbnRhdGlvbiAKKyAgICAgb2YgYSBibGFuayBuYW1lICovCisgIAorICBpZiAoKFNUUkVRKG5hbWUsQkxBTktfQ09NTU9OX05BTUVfT1JJR0lOQUwpKSB8fAorICAgICAgKFNUUkVRKG5hbWUsQkxBTktfQ09NTU9OX05BTUVfTUY3NykpKQorICAgIHsKKyAgICAgIGZyZWUobmFtZSk7CisgICAgICBuYW1lID0gYWxsb2NhKHN0cmxlbihCTEFOS19DT01NT05fTkFNRV9MT0NBTCkgKyAxKTsgCisgICAgICBzdHJjcHkobmFtZSxCTEFOS19DT01NT05fTkFNRV9MT0NBTCk7IAorICAgIH0KKyAgCisgIHRtcCA9IGhlYWRfY29tbW9uX2xpc3Q7CisgIAorICB3aGlsZSAodG1wICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKENPTU1PTl9ORUVEU19QQVRDSElORyh0bXApKQorCWlmIChTVFJFUSh0bXAtPm5hbWUsbmFtZSkpCisJICBwYXRjaF9jb21tb25fZW50cmllcyh0bXAsb2Zmc2V0LHNlY251bSk7IAorICAgICAgCisgICAgICB0bXAgPSB0bXAtPm5leHQ7CisgICAgfSAgIAorfQorI2VuZGlmCisKKy8qIFRoaXMgbWFjcm8gYWRkcyB0aGUgc3ltYm9sLW51bWJlciBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiAKKyAgICh0aGUgc3ltYm9sIG51bWJlciBvZiB0aGUgLmJmKSByZWZlcmVuY2VkIGJ5IHN5bW51bV9mY24gdG8gYSAKKyAgIGxpc3QuICBUaGlzIGxpc3QsIGluIHJlYWxpdHkgc2hvdWxkIGJlIGEgRklGTyBxdWV1ZSBidXQgc2luY2UgCisgICAjbGluZSBwcmFnbWFzIHNvbWV0aW1lcyBjYXVzZSBsaW5lIHJhbmdlcyB0byBnZXQgbWVzc2VkIHVwIAorICAgd2Ugc2ltcGx5IGNyZWF0ZSBhIGxpbmVhciBsaXN0LiAgVGhpcyBsaXN0IGNhbiB0aGVuIGJlIHNlYXJjaGVkIAorICAgZmlyc3QgYnkgYSBxdWV1ZWluZyBhbGdvcml0aG0gYW5kIHVwb24gZmFpbHVyZSBmYWxsIGJhY2sgdG8gCisgICBhIGxpbmVhciBzY2FuLiAqLyAKKworI2lmIDAKKyNkZWZpbmUgQUREX0JGX1NZTU5VTShiZl9zeW0sZmNuX3N5bSkgXAorICBcCisgIGlmIChzYXZlZF9iZl9saXN0ID09IE5VTEwpIFwKK3sgXAorICAgIHRtcF9iZl9wdHIgPSBhbGxvY2F0ZV9zYXZlZF9iZl9ub2RlKCk7IFwKKyAgICAgIFwKKwl0bXBfYmZfcHRyLT5zeW1udW1fYmYgPSAoYmZfc3ltKTsgXAorCSAgdG1wX2JmX3B0ci0+c3ltbnVtX2ZjbiA9IChmY25fc3ltKTsgIFwKKwkgICAgdG1wX2JmX3B0ci0+bmV4dCA9IE5VTEw7IFwKKwkgICAgICBcCisJCWN1cnJlbnRfaGVhZF9iZl9saXN0ID0gc2F2ZWRfYmZfbGlzdCA9IHRtcF9iZl9wdHI7IFwKKwkJICBzYXZlZF9iZl9saXN0X2VuZCA9IHRtcF9iZl9wdHI7IFwKKwkJICB9IFwKK2Vsc2UgXAoreyAgXAorICAgICB0bXBfYmZfcHRyID0gYWxsb2NhdGVfc2F2ZWRfYmZfbm9kZSgpOyBcCisgICAgICAgXAorICAgICAgICAgdG1wX2JmX3B0ci0+c3ltbnVtX2JmID0gKGJmX3N5bSk7ICBcCisJICAgdG1wX2JmX3B0ci0+c3ltbnVtX2ZjbiA9IChmY25fc3ltKTsgIFwKKwkgICAgIHRtcF9iZl9wdHItPm5leHQgPSBOVUxMOyAgXAorCSAgICAgICBcCisJCSBzYXZlZF9iZl9saXN0X2VuZC0+bmV4dCA9IHRtcF9iZl9wdHI7ICBcCisJCSAgIHNhdmVkX2JmX2xpc3RfZW5kID0gdG1wX2JmX3B0cjsgXAorCQkgICB9IAorI2VuZGlmCisKKy8qIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIGVudGlyZSAoLmJmLGZ1bmN0aW9uKSBsaXN0ICovIAorCisjaWYgMAorc3RhdGljIHZvaWQgCisgIGNsZWFyX2JmX2xpc3QoKQoreworICAKKyAgU0FWRURfQkZfUFRSIHRtcCA9IHNhdmVkX2JmX2xpc3Q7CisgIFNBVkVEX0JGX1BUUiBuZXh0ID0gTlVMTDsgCisgIAorICB3aGlsZSAodG1wICE9IE5VTEwpCisgICAgeworICAgICAgbmV4dCA9IHRtcC0+bmV4dDsKKyAgICAgIGZyZWUodG1wKTsKKyAgICAgIHRtcD1uZXh0OworICAgIH0KKyAgc2F2ZWRfYmZfbGlzdCA9IE5VTEw7Cit9CisjZW5kaWYKKworaW50IGdsb2JhbF9yZW1vdGVfZGVidWc7CisKKyNpZiAwCisKK3N0YXRpYyBsb25nCitnZXRfYmZfZm9yX2ZjbiAodGhlX2Z1bmN0aW9uKQorICAgICBsb25nIHRoZV9mdW5jdGlvbjsKK3sKKyAgU0FWRURfQkZfUFRSIHRtcDsKKyAgaW50IG5wcm9iZXMgPSAwOworICAKKyAgLyogRmlyc3QgdXNlIGEgc2ltcGxlIHF1ZXVpbmcgYWxnb3JpdGhtIChpLmUuIGxvb2sgYW5kIHNlZSBpZiB0aGUgCisgICAgIGl0ZW0gYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGlzIHRoZSBvbmUgeW91IHdhbnQpICAqLworICAKKyAgaWYgKHNhdmVkX2JmX2xpc3QgPT0gTlVMTCkKKyAgICBmYXRhbCAoImNhbm5vdCBnZXQgLmJmIG5vZGUgb2ZmIGVtcHR5IGxpc3QiKTsgCisgIAorICBpZiAoY3VycmVudF9oZWFkX2JmX2xpc3QgIT0gTlVMTCkgCisgICAgaWYgKGN1cnJlbnRfaGVhZF9iZl9saXN0LT5zeW1udW1fZmNuID09IHRoZV9mdW5jdGlvbikKKyAgICAgIHsKKwlpZiAoZ2xvYmFsX3JlbW90ZV9kZWJ1ZykgCisJICBmcHJpbnRmKHN0ZGVyciwiKiIpOyAKKworCXRtcCA9IGN1cnJlbnRfaGVhZF9iZl9saXN0OyAKKwljdXJyZW50X2hlYWRfYmZfbGlzdCA9IGN1cnJlbnRfaGVhZF9iZl9saXN0LT5uZXh0OworCXJldHVybih0bXAtPnN5bW51bV9iZik7IAorICAgICAgfQorICAKKyAgLyogSWYgdGhlIGFib3ZlIGRpZCBub3Qgd29yayAocHJvYmFibHkgYmVjYXVzZSAjbGluZSBkaXJlY3RpdmVzIHdlcmUgCisgICAgIHVzZWQgaW4gdGhlIHNvdXJjZWZpbGUgYW5kIHRoZXkgbWVzc2VkIHVwIG91ciBpbnRlcm5hbCB0YWJsZXMpIHdlIG5vdyBkbworICAgICB0aGUgdWdseSBsaW5lYXIgc2NhbiAqLworICAKKyAgaWYgKGdsb2JhbF9yZW1vdGVfZGVidWcpIAorICAgIGZwcmludGYoc3RkZXJyLCJcbmRlZmF1bHRpbmcgdG8gbGluZWFyIHNjYW5cbiIpOyAKKyAgCisgIG5wcm9iZXMgPSAwOyAKKyAgdG1wID0gc2F2ZWRfYmZfbGlzdDsKKyAgd2hpbGUgKHRtcCAhPSBOVUxMKQorICAgIHsKKyAgICAgIG5wcm9iZXMrKzsgCisgICAgICBpZiAodG1wLT5zeW1udW1fZmNuID09IHRoZV9mdW5jdGlvbikKKwl7IAorCSAgaWYgKGdsb2JhbF9yZW1vdGVfZGVidWcpCisJICAgIGZwcmludGYoc3RkZXJyLCJGb3VuZCBpbiAlZCBwcm9iZXNcbiIsbnByb2Jlcyk7CisJICBjdXJyZW50X2hlYWRfYmZfbGlzdCA9IHRtcC0+bmV4dDsKKwkgIHJldHVybih0bXAtPnN5bW51bV9iZik7CisJfSAKKyAgICAgIHRtcD0gdG1wLT5uZXh0OyAKKyAgICB9CisgIAorICByZXR1cm4oLTEpOyAKK30KKworc3RhdGljIFNBVkVEX0ZVTkNUSU9OX1BUUiBzYXZlZF9mdW5jdGlvbl9saXN0PU5VTEw7IAorc3RhdGljIFNBVkVEX0ZVTkNUSU9OX1BUUiBzYXZlZF9mdW5jdGlvbl9saXN0X2VuZD1OVUxMOyAKKworc3RhdGljIHZvaWQKK2NsZWFyX2Z1bmN0aW9uX2xpc3QoKQoreworICBTQVZFRF9GVU5DVElPTl9QVFIgdG1wID0gc2F2ZWRfZnVuY3Rpb25fbGlzdDsKKyAgU0FWRURfRlVOQ1RJT05fUFRSIG5leHQgPSBOVUxMOyAKKyAgCisgIHdoaWxlICh0bXAgIT0gTlVMTCkKKyAgICB7CisgICAgICBuZXh0ID0gdG1wLT5uZXh0OworICAgICAgZnJlZSh0bXApOworICAgICAgdG1wID0gbmV4dDsKKyAgICB9CisgIAorICBzYXZlZF9mdW5jdGlvbl9saXN0ID0gTlVMTDsKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9nZGIvZi1sYW5nLmggYi9nZGIvZi1sYW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZiOGYwMgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9mLWxhbmcuaApAQCAtMCwwICsxLDk2IEBACisvKiBGb3J0cmFuIGxhbmd1YWdlIHN1cHBvcnQgZGVmaW5pdGlvbnMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTkyLCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgTW90b3JvbGEuICBBZGFwdGVkIGZyb20gdGhlIEMgZGVmaW5pdGlvbnMgYnkgRmFyb29xIEJ1dHQKKyAgIChmbWJ1dHRAZW5nYWdlLnNwcy5tb3QuY29tKS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCitleHRlcm4gaW50IGZfcGFyc2UgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCBmX2Vycm9yIFBBUkFNUyAoKGNoYXIgKikpOwkvKiBEZWZpbmVkIGluIGYtZXhwLnkgKi8KKworZXh0ZXJuIHZvaWQgZl9wcmludF90eXBlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIGNoYXIgKiwKKwkJCQkgIEdEQl9GSUxFICosIGludCwgaW50KSk7CisKK2V4dGVybiBpbnQgZl92YWxfcHJpbnQgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqLCBpbnQsIAorCQkJCUNPUkVfQUREUiwgR0RCX0ZJTEUgKiwKKwkJCQlpbnQsIGludCwgaW50LCBlbnVtIHZhbF9wcmV0dHlwcmludCkpOworCisvKiBMYW5ndWFnZS1zcGVjaWZpYyBkYXRhIHN0cnVjdHVyZXMgKi8gCisKK3N0cnVjdCBjb21tb25fZW50cnkKK3sKKyAgc3RydWN0IHN5bWJvbCAqc3ltYm9sOyAgICAgICAgICAgICAgICAgICAgLyogVGhlIHN5bWJvbCBub2RlIGNvcnJlc3BvbmRpbmcKKwkJCQkJICAgICAgIHRvIHRoaXMgY29tcG9uZW50ICovIAorICBzdHJ1Y3QgY29tbW9uX2VudHJ5ICpuZXh0OyAgICAgICAgICAgICAgICAvKiBUaGUgbmV4dCBjb21wb25lbnQgKi8gCit9OworCitzdHJ1Y3Qgc2F2ZWRfZjc3X2NvbW1vbgoreworICBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmFtZSBvZiBDT01NT04gKi8KKyAgY2hhciAqb3duaW5nX2Z1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgb2YgcGFyZW50IGZ1bmN0aW9uICovIAorICBpbnQgc2VjbnVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VjdGlvbiAjIG9mIC5ic3MgKi8gCisgIENPUkVfQUREUiBvZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPZmZzZXQgZnJvbSAuYnNzIGZvciAKKwkJCQkJCXRoaXMgYmxvY2sgKi8KKyAgc3RydWN0IGNvbW1vbl9lbnRyeSAqZW50cmllczsgICAgICAgICAgICAgIC8qIExpc3Qgb2YgYmxvY2sncyBjb21wb25lbnRzICovCisgIHN0cnVjdCBjb21tb25fZW50cnkgKmVuZF9vZl9lbnRyaWVzOyAgICAgICAvKiBwdHIuIHRvIGVuZCBvZiBjb21wb25lbnRzICovIAorICBzdHJ1Y3Qgc2F2ZWRfZjc3X2NvbW1vbiAqbmV4dDsgICAgICAgICAgICAgIC8qIE5leHQgc2F2ZWQgQ09NTU9OIGJsb2NrICovIAorfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc2F2ZWRfZjc3X2NvbW1vbiAgICBTQVZFRF9GNzdfQ09NTU9OLCAqU0FWRURfRjc3X0NPTU1PTl9QVFI7CisKK3R5cGVkZWYgc3RydWN0IGNvbW1vbl9lbnRyeSAgICAgICAgQ09NTU9OX0VOVFJZLCAqQ09NTU9OX0VOVFJZX1BUUjsKKworZXh0ZXJuIFNBVkVEX0Y3N19DT01NT05fUFRSIGhlYWRfY29tbW9uX2xpc3Q7ICAgLyogUHRyIHRvIDFzdCBzYXZlZCBDT01NT04gICovCitleHRlcm4gU0FWRURfRjc3X0NPTU1PTl9QVFIgdGFpbF9jb21tb25fbGlzdDsgICAvKiBQdHIgdG8gbGFzdCBzYXZlZCBDT01NT04gICovCitleHRlcm4gU0FWRURfRjc3X0NPTU1PTl9QVFIgY3VycmVudF9jb21tb247ICAgICAvKiBQdHIgdG8gY3VycmVudCBDT01NT04gKi8KKworZXh0ZXJuIFNBVkVEX0Y3N19DT01NT05fUFRSIGZpbmRfY29tbW9uX2Zvcl9mdW5jdGlvbiBQQVJBTVMgKChjaGFyICosIGNoYXIgKikpOworCisjZGVmaW5lIFVOSU5JVElBTElaRURfU0VDTlVNIC0xIAorI2RlZmluZSBDT01NT05fTkVFRFNfUEFUQ0hJTkcoYmxrKSAoKGJsayktPnNlY251bSA9PSBVTklOSVRJQUxJWkVEX1NFQ05VTSkKKworI2RlZmluZSBCTEFOS19DT01NT05fTkFNRV9PUklHSU5BTCAiI0JMTktfQ09NIiAgLyogWExGIGFzc2lnbmVkICAqLworI2RlZmluZSBCTEFOS19DT01NT05fTkFNRV9NRjc3ICAgICAiX19CTE5LX18iICAgLyogTUY3NyBhc3NpZ25lZCAgKi8KKyNkZWZpbmUgQkxBTktfQ09NTU9OX05BTUVfTE9DQUwgICAgIl9fQkxBTksiICAgIC8qIExvY2FsIEdEQiAqLworCisjZGVmaW5lIEJPVU5EX0ZFVENIX09LIDEKKyNkZWZpbmUgQk9VTkRfRkVUQ0hfRVJST1IgLTk5OQorCisvKiBXaGVuIHJlYXNvbmFibGUgYXJyYXkgYm91bmRzIGNhbm5vdCBiZSBmZXRjaGVkLCBzdWNoIGFzIHdoZW4gCit5b3UgYXNrIHRvICdtdCBwcmludCBzeW1ib2xzJyBhbmQgdGhlcmUgaXMgbm8gc3RhY2sgZnJhbWUgYW5kIAordGhlcmVmb3JlIG5vIHdheSBvZiBrbm93aW5nIHRoZSBib3VuZHMgb2Ygc3RhY2stYmFzZWQgYXJyYXlzLCAKK3dlIGhhdmUgdG8gYXNzaWduIGRlZmF1bHQgYm91bmRzLCB0aGVzZSBhcmUgYXMgZ29vZCBhcyBhbnkuLi4gKi8gCisKKyNkZWZpbmUgREVGQVVMVF9VUFBFUl9CT1VORCA5OTk5OTkKKyNkZWZpbmUgREVGQVVMVF9MT1dFUl9CT1VORCAtOTk5OTk5CisKK2V4dGVybiBjaGFyICpyZWFsX21haW5fbmFtZTsgICAvKiBOYW1lIG9mIG1haW4gZnVuY3Rpb24gKi8gCitleHRlcm4gaW50ICByZWFsX21haW5fY192YWx1ZTsgICAvKiBDX3ZhbHVlIGZpZWxkIG9mIG1haW4gZnVuY3Rpb24gKi8gCisKK2V4dGVybiBpbnQgZjc3X2dldF9keW5hbWljX3VwcGVyYm91bmQgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgaW50ICopKTsKKworZXh0ZXJuIGludCBmNzdfZ2V0X2R5bmFtaWNfbG93ZXJib3VuZCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBpbnQgKikpOworCitleHRlcm4gdm9pZCBmNzdfZ2V0X2R5bmFtaWNfYXJyYXlfbGVuZ3RoIFBBUkFNUyAoKHN0cnVjdCB0eXBlICopKTsgCisKK2V4dGVybiBpbnQgY2FsY19mNzdfYXJyYXlfZGltcyBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKSk7CisKKyNkZWZpbmUgREVGQVVMVF9ET1RNQUlOX05BTUVfSU5fTUY3NyAgICAgICAgICAgICIuTUFJTl8iCisjZGVmaW5lIERFRkFVTFRfTUFJTl9OQU1FX0lOX01GNzcgICAgICAgICAgICAgICAiTUFJTl8iCisjZGVmaW5lIERFRkFVTFRfRE9UTUFJTl9OQU1FX0lOX1hMRl9CVUdHWSAgICAgICAiLm1haW4gIgorI2RlZmluZSBERUZBVUxUX0RPVE1BSU5fTkFNRV9JTl9YTEYgICAgICAgICAgICAgIi5tYWluIgpkaWZmIC0tZ2l0IGEvZ2RiL2YtdHlwZXByaW50LmMgYi9nZGIvZi10eXBlcHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWJiM2ViCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2YtdHlwZXByaW50LmMKQEAgLTAsMCArMSw0NTggQEAKKy8qIFN1cHBvcnQgZm9yIHByaW50aW5nIEZvcnRyYW4gdHlwZXMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg4LCAxOTg5LCAxOTkxLCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgTW90b3JvbGEuICBBZGFwdGVkIGZyb20gdGhlIEMgdmVyc2lvbiBieSBGYXJvb3EgQnV0dAorICAgKGZtYnV0dEBlbmdhZ2Uuc3BzLm1vdC5jb20pLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAib2JzdGFjay5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1ZGUgImRlbWFuZ2xlLmgiCisjaW5jbHVkZSAiZi1sYW5nLmgiCisjaW5jbHVkZSAidHlwZXByaW50LmgiCisjaW5jbHVkZSAiZnJhbWUuaCIgIC8qID8/PyAqLworCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpZiAwCS8qIEN1cnJlbnRseSB1bnVzZWQgKi8KK3N0YXRpYyB2b2lkIGZfdHlwZV9wcmludF9hcmdzIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIEdEQl9GSUxFICopKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBwcmludF9lcXVpdmFsZW50X2Y3N19mbG9hdF90eXBlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosCisJCQkJCQkgICAgIEdEQl9GSUxFICopKTsKKworc3RhdGljIHZvaWQgZl90eXBlX3ByaW50X3ZhcnNwZWNfc3VmZml4IFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIEdEQl9GSUxFICosCisJCQkJCQkgaW50LCBpbnQsIGludCkpOworCit2b2lkIGZfdHlwZV9wcmludF92YXJzcGVjX3ByZWZpeCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBHREJfRklMRSAqLAorCQkJCQkgIGludCwgaW50KSk7CisKK3ZvaWQgZl90eXBlX3ByaW50X2Jhc2UgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgR0RCX0ZJTEUgKiwgaW50LCBpbnQpKTsKKworDAorLyogTEVWRUwgaXMgdGhlIGRlcHRoIHRvIGluZGVudCBsaW5lcyBieS4gICovCisKK3ZvaWQKK2ZfcHJpbnRfdHlwZSAodHlwZSwgdmFyc3RyaW5nLCBzdHJlYW0sIHNob3csIGxldmVsKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgY2hhciAqdmFyc3RyaW5nOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgc2hvdzsKKyAgICAgaW50IGxldmVsOworeworICByZWdpc3RlciBlbnVtIHR5cGVfY29kZSBjb2RlOworICBpbnQgZGVtYW5nbGVkX2FyZ3M7CisKKyAgZl90eXBlX3ByaW50X2Jhc2UgKHR5cGUsIHN0cmVhbSwgc2hvdywgbGV2ZWwpOworICBjb2RlID0gVFlQRV9DT0RFICh0eXBlKTsKKyAgaWYgKCh2YXJzdHJpbmcgIT0gTlVMTCAmJiAqdmFyc3RyaW5nICE9ICdcMCcpCisgICAgICB8fAorICAgICAgLyogTmVlZCBhIHNwYWNlIGlmIGdvaW5nIHRvIHByaW50IHN0YXJzIG9yIGJyYWNrZXRzOworCSBidXQgbm90IGlmIHdlIHdpbGwgcHJpbnQganVzdCBhIHR5cGUgbmFtZS4gICovCisgICAgICAoKHNob3cgPiAwIHx8IFRZUEVfTkFNRSAodHlwZSkgPT0gMCkKKyAgICAgICAmJgorICAgICAgIChjb2RlID09IFRZUEVfQ09ERV9QVFIgfHwgY29kZSA9PSBUWVBFX0NPREVfRlVOQworCXx8IGNvZGUgPT0gVFlQRV9DT0RFX01FVEhPRAorCXx8IGNvZGUgPT0gVFlQRV9DT0RFX0FSUkFZCisJfHwgY29kZSA9PSBUWVBFX0NPREVfTUVNQkVSCisJfHwgY29kZSA9PSBUWVBFX0NPREVfUkVGKSkpCisgICAgZnB1dHNfZmlsdGVyZWQgKCIgIiwgc3RyZWFtKTsKKyAgZl90eXBlX3ByaW50X3ZhcnNwZWNfcHJlZml4ICh0eXBlLCBzdHJlYW0sIHNob3csIDApOworCisgIGZwdXRzX2ZpbHRlcmVkICh2YXJzdHJpbmcsIHN0cmVhbSk7CisKKyAgLyogRm9yIGRlbWFuZ2xlZCBmdW5jdGlvbiBuYW1lcywgd2UgaGF2ZSB0aGUgYXJnbGlzdCBhcyBwYXJ0IG9mIHRoZSBuYW1lLAorICAgICBzbyBkb24ndCBwcmludCBhbiBhZGRpdGlvbmFsIHBhaXIgb2YgKCkncyAqLworCisgIGRlbWFuZ2xlZF9hcmdzID0gdmFyc3RyaW5nW3N0cmxlbih2YXJzdHJpbmcpIC0gMV0gPT0gJyknOworICBmX3R5cGVfcHJpbnRfdmFyc3BlY19zdWZmaXggKHR5cGUsIHN0cmVhbSwgc2hvdywgMCwgZGVtYW5nbGVkX2FyZ3MpOworfQorCisvKiBQcmludCBhbnkgYXN0ZXJpc2tzIG9yIG9wZW4tcGFyZW50aGVzZXMgbmVlZGVkIGJlZm9yZSB0aGUKKyAgIHZhcmlhYmxlIG5hbWUgKHRvIGRlc2NyaWJlIGl0cyB0eXBlKS4KKworICAgT24gb3V0ZXJtb3N0IGNhbGwsIHBhc3MgMCBmb3IgUEFTU0VEX0FfUFRSLgorICAgT24gb3V0ZXJtb3N0IGNhbGwsIFNIT1cgPiAwIG1lYW5zIHNob3VsZCBpZ25vcmUKKyAgIGFueSB0eXBlbmFtZSBmb3IgVFlQRSBhbmQgc2hvdyBpdHMgZGV0YWlscy4KKyAgIFNIT1cgaXMgYWx3YXlzIHplcm8gb24gcmVjdXJzaXZlIGNhbGxzLiAgKi8KKwordm9pZAorZl90eXBlX3ByaW50X3ZhcnNwZWNfcHJlZml4ICh0eXBlLCBzdHJlYW0sIHNob3csIHBhc3NlZF9hX3B0cikKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGludCBzaG93OworICAgICBpbnQgcGFzc2VkX2FfcHRyOworeworICBpZiAodHlwZSA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAoVFlQRV9OQU1FICh0eXBlKSAmJiBzaG93IDw9IDApCisgICAgcmV0dXJuOworCisgIFFVSVQ7CisKKyAgc3dpdGNoIChUWVBFX0NPREUgKHR5cGUpKQorICAgIHsKKyAgICBjYXNlIFRZUEVfQ09ERV9QVFI6CisgICAgICBmX3R5cGVfcHJpbnRfdmFyc3BlY19wcmVmaXggKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpLCBzdHJlYW0sIDAsIDEpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9GVU5DOgorICAgICAgZl90eXBlX3ByaW50X3ZhcnNwZWNfcHJlZml4IChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSwgc3RyZWFtLCAwLCAwKTsKKyAgICAgIGlmIChwYXNzZWRfYV9wdHIpCisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKCIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9BUlJBWToKKyAgICAgIGZfdHlwZV9wcmludF92YXJzcGVjX3ByZWZpeCAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSksIHN0cmVhbSwgMCwgMCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX1VOREVGOgorICAgIGNhc2UgVFlQRV9DT0RFX1NUUlVDVDoKKyAgICBjYXNlIFRZUEVfQ09ERV9VTklPTjoKKyAgICBjYXNlIFRZUEVfQ09ERV9FTlVNOgorICAgIGNhc2UgVFlQRV9DT0RFX0lOVDoKKyAgICBjYXNlIFRZUEVfQ09ERV9GTFQ6CisgICAgY2FzZSBUWVBFX0NPREVfVk9JRDoKKyAgICBjYXNlIFRZUEVfQ09ERV9FUlJPUjoKKyAgICBjYXNlIFRZUEVfQ09ERV9DSEFSOgorICAgIGNhc2UgVFlQRV9DT0RFX0JPT0w6CisgICAgY2FzZSBUWVBFX0NPREVfU0VUOgorICAgIGNhc2UgVFlQRV9DT0RFX1JBTkdFOgorICAgIGNhc2UgVFlQRV9DT0RFX1NUUklORzoKKyAgICBjYXNlIFRZUEVfQ09ERV9CSVRTVFJJTkc6CisgICAgY2FzZSBUWVBFX0NPREVfTUVUSE9EOgorICAgIGNhc2UgVFlQRV9DT0RFX01FTUJFUjoKKyAgICBjYXNlIFRZUEVfQ09ERV9SRUY6CisgICAgY2FzZSBUWVBFX0NPREVfQ09NUExFWDoKKyAgICBjYXNlIFRZUEVfQ09ERV9UWVBFREVGOgorICAgICAgLyogVGhlc2UgdHlwZXMgbmVlZCBubyBwcmVmaXguICBUaGV5IGFyZSBsaXN0ZWQgaGVyZSBzbyB0aGF0CisJIGdjYyAtV2FsbCB3aWxsIHJldmVhbCBhbnkgdHlwZXMgdGhhdCBoYXZlbid0IGJlZW4gaGFuZGxlZC4gICovCisgICAgICBicmVhazsKKyAgICB9Cit9CisKKyNpZiAwCS8qIEN1cnJlbnRseSB1bnVzZWQgKi8KKworc3RhdGljIHZvaWQKK2ZfdHlwZV9wcmludF9hcmdzICh0eXBlLCBzdHJlYW0pCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBHREJfRklMRSAqc3RyZWFtOworeworICBpbnQgaTsKKyAgc3RydWN0IHR5cGUgKiphcmdzOworCisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIigiKTsKKyAgYXJncyA9IFRZUEVfQVJHX1RZUEVTICh0eXBlKTsKKyAgaWYgKGFyZ3MgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoYXJnc1sxXSA9PSBOVUxMKQorCXsKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIi4uLiIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBmb3IgKGkgPSAxOyBhcmdzW2ldICE9IE5VTEwgJiYgYXJnc1tpXS0+Y29kZSAhPSBUWVBFX0NPREVfVk9JRDsgaSsrKQorCSAgICB7CisJICAgICAgZl9wcmludF90eXBlIChhcmdzW2ldLCAiIiwgc3RyZWFtLCAtMSwgMCk7CisJICAgICAgaWYgKGFyZ3NbaSsxXSA9PSBOVUxMKQorCQlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIuLi4iKTsKKwkgICAgICBlbHNlIGlmIChhcmdzW2krMV0tPmNvZGUgIT0gVFlQRV9DT0RFX1ZPSUQpCisJCXsKKwkJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIsIik7CisJCSAgd3JhcF9oZXJlICgiICAgICIpOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIpIik7Cit9CisKKyNlbmRpZgkvKiAwICovCisKKy8qIFByaW50IGFueSBhcnJheSBzaXplcywgZnVuY3Rpb24gYXJndW1lbnRzIG9yIGNsb3NlIHBhcmVudGhlc2VzCisgICBuZWVkZWQgYWZ0ZXIgdGhlIHZhcmlhYmxlIG5hbWUgKHRvIGRlc2NyaWJlIGl0cyB0eXBlKS4KKyAgIEFyZ3Mgd29yayBsaWtlIGNfdHlwZV9wcmludF92YXJzcGVjX3ByZWZpeC4gICovCisKK3N0YXRpYyB2b2lkCitmX3R5cGVfcHJpbnRfdmFyc3BlY19zdWZmaXggKHR5cGUsIHN0cmVhbSwgc2hvdywgcGFzc2VkX2FfcHRyLCBkZW1hbmdsZWRfYXJncykKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGludCBzaG93OworICAgICBpbnQgcGFzc2VkX2FfcHRyOworICAgICBpbnQgZGVtYW5nbGVkX2FyZ3M7Cit7CisgIGludCB1cHBlcl9ib3VuZCwgbG93ZXJfYm91bmQ7CisgIGludCBsb3dlcl9ib3VuZF93YXNfZGVmYXVsdCA9IDA7CisgIHN0YXRpYyBpbnQgYXJyYXlwcmludF9yZWN1cnNlX2xldmVsID0gMDsKKyAgaW50IHJldGNvZGU7CisKKyAgaWYgKHR5cGUgPT0gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKFRZUEVfTkFNRSAodHlwZSkgJiYgc2hvdyA8PSAwKQorICAgIHJldHVybjsKKworICBRVUlUOworCisgIHN3aXRjaCAoVFlQRV9DT0RFICh0eXBlKSkKKyAgICB7CisgICAgY2FzZSBUWVBFX0NPREVfQVJSQVk6CisgICAgICBhcnJheXByaW50X3JlY3Vyc2VfbGV2ZWwrKzsKKworICAgICAgaWYgKGFycmF5cHJpbnRfcmVjdXJzZV9sZXZlbCA9PSAxKQorCWZwcmludGZfZmlsdGVyZWQoc3RyZWFtLCIoIik7CisKKyAgICAgIGlmIChUWVBFX0NPREUgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKSA9PSBUWVBFX0NPREVfQVJSQVkpCisJZl90eXBlX3ByaW50X3ZhcnNwZWNfc3VmZml4IChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSwgc3RyZWFtLCAwLCAwLCAwKTsKKworICAgICAgcmV0Y29kZSA9IGY3N19nZXRfZHluYW1pY19sb3dlcmJvdW5kICh0eXBlLCZsb3dlcl9ib3VuZCk7CisKKyAgICAgIGxvd2VyX2JvdW5kX3dhc19kZWZhdWx0ID0gMDsKKworICAgICAgaWYgKHJldGNvZGUgPT0gQk9VTkRfRkVUQ0hfRVJST1IpCisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCI/Pz8iKTsKKyAgICAgIGVsc2UKKwlpZiAobG93ZXJfYm91bmQgPT0gMSkgLyogVGhlIGRlZmF1bHQgKi8KKwkgIGxvd2VyX2JvdW5kX3dhc19kZWZhdWx0ID0gMTsKKwllbHNlCisJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sIiVkIixsb3dlcl9ib3VuZCk7CisKKyAgICAgIGlmIChsb3dlcl9ib3VuZF93YXNfZGVmYXVsdCkKKwlsb3dlcl9ib3VuZF93YXNfZGVmYXVsdCA9IDA7CisgICAgICBlbHNlCisJZnByaW50Zl9maWx0ZXJlZChzdHJlYW0sIjoiKTsKKworICAgICAgLyogTWFrZSBzdXJlIHRoYXQsIGlmIHdlIGhhdmUgYW4gYXNzdW1lZCBzaXplIGFycmF5LCB3ZQorCSBwcmludCBvdXQgYSB3YXJuaW5nIGFuZCBwcmludCB0aGUgdXBwZXJib3VuZCBhcyAnKicgKi8KKworICAgICAgaWYgKFRZUEVfQVJSQVlfVVBQRVJfQk9VTkRfVFlQRSh0eXBlKSA9PSBCT1VORF9DQU5OT1RfQkVfREVURVJNSU5FRCkKKwlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIqIik7CisgICAgICAgZWxzZQorCSB7CisJICAgcmV0Y29kZSA9IGY3N19nZXRfZHluYW1pY191cHBlcmJvdW5kKHR5cGUsJnVwcGVyX2JvdW5kKTsKKworCSAgIGlmIChyZXRjb2RlID09IEJPVU5EX0ZFVENIX0VSUk9SKQorCSAgICAgZnByaW50Zl9maWx0ZXJlZChzdHJlYW0sIj8/PyIpOworCSAgIGVsc2UKKwkgICAgIGZwcmludGZfZmlsdGVyZWQoc3RyZWFtLCIlZCIsdXBwZXJfYm91bmQpOworCSB9CisKKyAgICAgIGlmIChUWVBFX0NPREUgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKSAhPSBUWVBFX0NPREVfQVJSQVkpCisJZl90eXBlX3ByaW50X3ZhcnNwZWNfc3VmZml4IChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSwgc3RyZWFtLCAwLCAwLCAwKTsKKyAgICAgIGlmIChhcnJheXByaW50X3JlY3Vyc2VfbGV2ZWwgPT0gMSkKKwlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIpIik7CisgICAgICBlbHNlCisJZnByaW50Zl9maWx0ZXJlZChzdHJlYW0sIiwiKTsKKyAgICAgIGFycmF5cHJpbnRfcmVjdXJzZV9sZXZlbC0tOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9QVFI6CisgICAgY2FzZSBUWVBFX0NPREVfUkVGOgorICAgICAgZl90eXBlX3ByaW50X3ZhcnNwZWNfc3VmZml4IChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSwgc3RyZWFtLCAwLCAxLCAwKTsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQoc3RyZWFtLCIpIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX0ZVTkM6CisgICAgICBmX3R5cGVfcHJpbnRfdmFyc3BlY19zdWZmaXggKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpLCBzdHJlYW0sIDAsCisJCQkJIHBhc3NlZF9hX3B0ciwgMCk7CisgICAgICBpZiAocGFzc2VkX2FfcHRyKQorCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIikiKTsKKworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiKCkiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfVU5ERUY6CisgICAgY2FzZSBUWVBFX0NPREVfU1RSVUNUOgorICAgIGNhc2UgVFlQRV9DT0RFX1VOSU9OOgorICAgIGNhc2UgVFlQRV9DT0RFX0VOVU06CisgICAgY2FzZSBUWVBFX0NPREVfSU5UOgorICAgIGNhc2UgVFlQRV9DT0RFX0ZMVDoKKyAgICBjYXNlIFRZUEVfQ09ERV9WT0lEOgorICAgIGNhc2UgVFlQRV9DT0RFX0VSUk9SOgorICAgIGNhc2UgVFlQRV9DT0RFX0NIQVI6CisgICAgY2FzZSBUWVBFX0NPREVfQk9PTDoKKyAgICBjYXNlIFRZUEVfQ09ERV9TRVQ6CisgICAgY2FzZSBUWVBFX0NPREVfUkFOR0U6CisgICAgY2FzZSBUWVBFX0NPREVfU1RSSU5HOgorICAgIGNhc2UgVFlQRV9DT0RFX0JJVFNUUklORzoKKyAgICBjYXNlIFRZUEVfQ09ERV9NRVRIT0Q6CisgICAgY2FzZSBUWVBFX0NPREVfTUVNQkVSOgorICAgIGNhc2UgVFlQRV9DT0RFX0NPTVBMRVg6CisgICAgY2FzZSBUWVBFX0NPREVfVFlQRURFRjoKKyAgICAgIC8qIFRoZXNlIHR5cGVzIGRvIG5vdCBuZWVkIGEgc3VmZml4LiAgVGhleSBhcmUgbGlzdGVkIHNvIHRoYXQKKwkgZ2NjIC1XYWxsIHdpbGwgcmVwb3J0IHR5cGVzIHRoYXQgbWF5IG5vdCBoYXZlIGJlZW4gY29uc2lkZXJlZC4gICovCisgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9lcXVpdmFsZW50X2Y3N19mbG9hdF90eXBlICh0eXBlLCBzdHJlYW0pCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBHREJfRklMRSAqc3RyZWFtOworeworICAvKiBPdmVycmlkZSB0eXBlIG5hbWUgImZsb2F0IiBhbmQgbWFrZSBpdCB0aGUKKyAgICAgYXBwcm9wcmlhdGUgcmVhbC4gWExDIHN0dXBpZGx5IG91dHB1dHMgLTEyIGFzIGEgdHlwZQorICAgICBmb3IgcmVhbCB3aGVuIGl0IHJlYWxseSBzaG91bGQgYmUgb3V0cHV0dGluZyAtMTggKi8KKworICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJyZWFsKiVkIiwgVFlQRV9MRU5HVEggKHR5cGUpKTsKK30KKworLyogUHJpbnQgdGhlIG5hbWUgb2YgdGhlIHR5cGUgKG9yIHRoZSB1bHRpbWF0ZSBwb2ludGVyIHRhcmdldCwKKyAgIGZ1bmN0aW9uIHZhbHVlIG9yIGFycmF5IGVsZW1lbnQpLCBvciB0aGUgZGVzY3JpcHRpb24gb2YgYQorICAgc3RydWN0dXJlIG9yIHVuaW9uLgorCisgICBTSE9XIG5vbnplcm8gbWVhbnMgZG9uJ3QgcHJpbnQgdGhpcyB0eXBlIGFzIGp1c3QgaXRzIG5hbWU7CisgICBzaG93IGl0cyByZWFsIGRlZmluaXRpb24gZXZlbiBpZiBpdCBoYXMgYSBuYW1lLgorICAgU0hPVyB6ZXJvIG1lYW5zIHByaW50IGp1c3QgdHlwZW5hbWUgb3Igc3RydWN0IHRhZyBpZiB0aGVyZSBpcyBvbmUKKyAgIFNIT1cgbmVnYXRpdmUgbWVhbnMgYWJicmV2aWF0ZSBzdHJ1Y3R1cmUgZWxlbWVudHMuCisgICBTSE9XIGlzIGRlY3JlbWVudGVkIGZvciBwcmludGluZyBvZiBzdHJ1Y3R1cmUgZWxlbWVudHMuCisKKyAgIExFVkVMIGlzIHRoZSBkZXB0aCB0byBpbmRlbnQgYnkuCisgICBXZSBpbmNyZWFzZSBpdCBmb3Igc29tZSByZWN1cnNpdmUgY2FsbHMuICAqLworCit2b2lkCitmX3R5cGVfcHJpbnRfYmFzZSAodHlwZSwgc3RyZWFtLCBzaG93LCBsZXZlbCkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGludCBzaG93OworICAgICBpbnQgbGV2ZWw7Cit7CisgIGludCByZXRjb2RlOworICBpbnQgdXBwZXJfYm91bmQ7CisKKyAgUVVJVDsKKworICB3cmFwX2hlcmUgKCIgICAgIik7CisgIGlmICh0eXBlID09IE5VTEwpCisgICAgeworICAgICAgZnB1dHNfZmlsdGVyZWQgKCI8dHlwZSB1bmtub3duPiIsIHN0cmVhbSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFdoZW4gU0hPVyBpcyB6ZXJvIG9yIGxlc3MsIGFuZCB0aGVyZSBpcyBhIHZhbGlkIHR5cGUgbmFtZSwgdGhlbiBhbHdheXMKKyAgICAganVzdCBwcmludCB0aGUgdHlwZSBuYW1lIGRpcmVjdGx5IGZyb20gdGhlIHR5cGUuICovCisKKyAgaWYgKChzaG93IDw9IDApICYmIChUWVBFX05BTUUgKHR5cGUpICE9IE5VTEwpKQorICAgIHsKKyAgICAgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9GTFQpCisJcHJpbnRfZXF1aXZhbGVudF9mNzdfZmxvYXRfdHlwZSAodHlwZSwgc3RyZWFtKTsKKyAgICAgIGVsc2UKKwlmcHV0c19maWx0ZXJlZCAoVFlQRV9OQU1FICh0eXBlKSwgc3RyZWFtKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKFRZUEVfQ09ERSAodHlwZSkgIT0gVFlQRV9DT0RFX1RZUEVERUYpCisgICAgQ0hFQ0tfVFlQRURFRiAodHlwZSk7CisKKyAgc3dpdGNoIChUWVBFX0NPREUgKHR5cGUpKQorICAgIHsKKyAgICBjYXNlIFRZUEVfQ09ERV9UWVBFREVGOgorICAgICAgZl90eXBlX3ByaW50X2Jhc2UgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpLCBzdHJlYW0sIDAsIGxldmVsKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfQVJSQVk6CisgICAgY2FzZSBUWVBFX0NPREVfRlVOQzoKKyAgICAgIGZfdHlwZV9wcmludF9iYXNlIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSwgc3RyZWFtLCBzaG93LCBsZXZlbCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBUWVBFX0NPREVfUFRSOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiUFRSIFRPIC0+ICggIik7CisgICAgICBmX3R5cGVfcHJpbnRfYmFzZSAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSksIHN0cmVhbSwgMCwgbGV2ZWwpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9WT0lEOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiVk9JRCIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9VTkRFRjoKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInN0cnVjdCA8dW5rbm93bj4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfRVJST1I6CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICI8dW5rbm93biB0eXBlPiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9SQU5HRToKKyAgICAgIC8qIFRoaXMgc2hvdWxkIG5vdCBvY2N1ciAqLworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiPHJhbmdlIHR5cGU+Iik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX0NIQVI6CisgICAgICAvKiBPdmVycmlkZSBuYW1lICJjaGFyIiBhbmQgbWFrZSBpdCAiY2hhcmFjdGVyIiAqLworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiY2hhcmFjdGVyIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX0lOVDoKKyAgICAgIC8qIFRoZXJlIG1heSBiZSBzb21lIGNoYXJhY3RlciB0eXBlcyB0aGF0IGF0dGVtcHQgdG8gY29tZQorICAgICAgICAgdGhyb3VnaCBhcyBUWVBFX0NPREVfSU5UIHNpbmNlIGRieHN0Y2xhc3MuaCBpcyBzbworICAgICAgICAgQy1vcmllbnRlZCwgd2UgbXVzdCBjaGFuZ2UgdGhlc2UgdG8gImNoYXJhY3RlciIgZnJvbSAiY2hhciIuICAqLworCisgICAgICBpZiAoU1RSRVEgKFRZUEVfTkFNRSAodHlwZSksICJjaGFyIikpCisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiY2hhcmFjdGVyIik7CisgICAgICBlbHNlCisJZ290byBkZWZhdWx0X2Nhc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX0NPTVBMRVg6CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJjb21wbGV4KiVkIiwgVFlQRV9MRU5HVEggKHR5cGUpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfRkxUOgorICAgICAgcHJpbnRfZXF1aXZhbGVudF9mNzdfZmxvYXRfdHlwZSAodHlwZSwgc3RyZWFtKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfU1RSSU5HOgorICAgICAgLyogU3RyaW5ncyBtYXkgaGF2ZSBkeW5hbWljIHVwcGVyYm91bmRzIChsZW5ndGhzKSBsaWtlIGFycmF5cy4gKi8KKworICAgICAgaWYgKFRZUEVfQVJSQVlfVVBQRVJfQk9VTkRfVFlQRSAodHlwZSkgPT0gQk9VTkRfQ0FOTk9UX0JFX0RFVEVSTUlORUQpCisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiY2hhcmFjdGVyKigqKSIpOworICAgICAgZWxzZQorCXsKKwkgIHJldGNvZGUgPSBmNzdfZ2V0X2R5bmFtaWNfdXBwZXJib3VuZCAodHlwZSwgJnVwcGVyX2JvdW5kKTsKKworCSAgaWYgKHJldGNvZGUgPT0gQk9VTkRfRkVUQ0hfRVJST1IpCisJICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgImNoYXJhY3Rlcio/Pz8iKTsKKwkgIGVsc2UKKwkgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiY2hhcmFjdGVyKiVkIiwgdXBwZXJfYm91bmQpOworCX0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdF9jYXNlOgorICAgIGRlZmF1bHQ6CisgICAgICAvKiBIYW5kbGUgdHlwZXMgbm90IGV4cGxpY2l0bHkgaGFuZGxlZCBieSB0aGUgb3RoZXIgY2FzZXMsCisJIHN1Y2ggYXMgZnVuZGFtZW50YWwgdHlwZXMuICBGb3IgdGhlc2UsIGp1c3QgcHJpbnQgd2hhdGV2ZXIKKwkgdGhlIHR5cGUgbmFtZSBpcywgYXMgcmVjb3JkZWQgaW4gdGhlIHR5cGUgaXRzZWxmLiAgSWYgdGhlcmUKKwkgaXMgbm8gdHlwZSBuYW1lLCB0aGVuIGNvbXBsYWluLiAqLworICAgICAgaWYgKFRZUEVfTkFNRSAodHlwZSkgIT0gTlVMTCkKKwlmcHV0c19maWx0ZXJlZCAoVFlQRV9OQU1FICh0eXBlKSwgc3RyZWFtKTsKKyAgICAgIGVsc2UKKwllcnJvciAoIkludmFsaWQgdHlwZSBjb2RlICglZCkgaW4gc3ltYm9sIHRhYmxlLiIsIFRZUEVfQ09ERSAodHlwZSkpOworICAgICAgYnJlYWs7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ2RiL2YtdmFscHJpbnQuYyBiL2dkYi9mLXZhbHByaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwYjFkMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9mLXZhbHByaW50LmMKQEAgLTAsMCArMSw3NjcgQEAKKy8qIFN1cHBvcnQgZm9yIHByaW50aW5nIEZvcnRyYW4gdmFsdWVzIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IE1vdG9yb2xhLiAgQWRhcHRlZCBmcm9tIHRoZSBDIGRlZmluaXRpb25zIGJ5IEZhcm9vcSBCdXR0CisgICAoZm1idXR0QGVuZ2FnZS5zcHMubW90LmNvbSksIGFkZGl0aW9uYWxseSB3b3JrZWQgb3ZlciBieSBTdGFuIFNoZWJzLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAiZGVtYW5nbGUuaCIKKyNpbmNsdWRlICJ2YWxwcmludC5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAiZi1sYW5nLmgiIAorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKworI2lmIDAKK3N0YXRpYyBpbnQgdGhlcmVfaXNfYV92aXNpYmxlX2NvbW1vbl9uYW1lZCBQQVJBTVMgKChjaGFyICopKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpbmZvX2NvbW1vbl9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBsaXN0X2FsbF92aXNpYmxlX2NvbW1vbnMgUEFSQU1TICgoY2hhciAqKSk7CitzdGF0aWMgdm9pZCBmNzdfcHJpbnRfYXJyYXkgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqLCBDT1JFX0FERFIsCisJCQkJICAgICBHREJfRklMRSAqLCBpbnQsIGludCwgaW50LAorCQkJCSAgICAgZW51bSB2YWxfcHJldHR5cHJpbnQpKTsKK3N0YXRpYyB2b2lkIGY3N19wcmludF9hcnJheV8xIFBBUkFNUyAoKGludCwgaW50LCBzdHJ1Y3QgdHlwZSAqLCBjaGFyICosCisJCQkJICAgICAgIENPUkVfQUREUiwgR0RCX0ZJTEUgKiwgaW50LCBpbnQsIGludCwKKwkJCQkgICAgICAgZW51bSB2YWxfcHJldHR5cHJpbnQpKTsKK3N0YXRpYyB2b2lkIGY3N19jcmVhdGVfYXJyYXlwcmludF9vZmZzZXRfdGJsIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosCisJCQkJCQkgICAgICBHREJfRklMRSAqKSk7CitzdGF0aWMgdm9pZCBmNzdfZ2V0X2R5bmFtaWNfbGVuZ3RoX29mX2FnZ3JlZ2F0ZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKSk7CisKK2ludCBmNzdfYXJyYXlfb2Zmc2V0X3RibFtNQVhfRk9SVFJBTl9ESU1TKzFdWzJdOworCisvKiBBcnJheSB3aGljaCBob2xkcyBvZmZzZXRzIHRvIGJlIGFwcGxpZWQgdG8gZ2V0IGEgcm93J3MgZWxlbWVudHMKKyAgIGZvciBhIGdpdmVuIGFycmF5LiBBcnJheSBhbHNvIGhvbGRzIHRoZSBzaXplIG9mIGVhY2ggc3ViYXJyYXkuICAqLworCisvKiBUaGUgZm9sbG93aW5nIG1hY3JvIGdpdmVzIHVzIHRoZSBzaXplIG9mIHRoZSBudGggZGltZW5zaW9uLCBXaGVyZSAKKyAgIG4gaXMgMSBiYXNlZC4gKi8gCisKKyNkZWZpbmUgRjc3X0RJTV9TSVpFKG4pIChmNzdfYXJyYXlfb2Zmc2V0X3RibFtuXVsxXSkKKworLyogVGhlIGZvbGxvd2luZyBnaXZlcyB1cyB0aGUgb2Zmc2V0IGZvciByb3cgbiB3aGVyZSBuIGlzIDEtYmFzZWQuICovIAorCisjZGVmaW5lIEY3N19ESU1fT0ZGU0VUKG4pIChmNzdfYXJyYXlfb2Zmc2V0X3RibFtuXVswXSkKKworaW50IAorZjc3X2dldF9keW5hbWljX2xvd2VyYm91bmQgKHR5cGUsIGxvd2VyX2JvdW5kKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgaW50ICpsb3dlcl9ib3VuZDsgCit7CisgIENPUkVfQUREUiBjdXJyZW50X2ZyYW1lX2FkZHI7ICAgCisgIENPUkVfQUREUiBwdHJfdG9fbG93ZXJfYm91bmQ7IAorICAKKyAgc3dpdGNoIChUWVBFX0FSUkFZX0xPV0VSX0JPVU5EX1RZUEUgKHR5cGUpKQorICAgIHsKKyAgICBjYXNlIEJPVU5EX0JZX1ZBTFVFX09OX1NUQUNLOgorICAgICAgY3VycmVudF9mcmFtZV9hZGRyID0gc2VsZWN0ZWRfZnJhbWUtPmZyYW1lOworICAgICAgaWYgKGN1cnJlbnRfZnJhbWVfYWRkciA+IDApIAorCXsKKwkgICpsb3dlcl9ib3VuZCA9IAorCSAgICByZWFkX21lbW9yeV9pbnRlZ2VyIChjdXJyZW50X2ZyYW1lX2FkZHIgKyAKKwkJCQkgVFlQRV9BUlJBWV9MT1dFUl9CT1VORF9WQUxVRSAodHlwZSksCisJCQkJIDQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAqbG93ZXJfYm91bmQgPSBERUZBVUxUX0xPV0VSX0JPVU5EOyAKKwkgIHJldHVybiBCT1VORF9GRVRDSF9FUlJPUjsgCisJfQorICAgICAgYnJlYWs7IAorICAgICAgCisgICAgY2FzZSBCT1VORF9TSU1QTEU6CisgICAgICAqbG93ZXJfYm91bmQgPSBUWVBFX0FSUkFZX0xPV0VSX0JPVU5EX1ZBTFVFICh0eXBlKTsKKyAgICAgIGJyZWFrOyAKKyAgICAgIAorICAgIGNhc2UgQk9VTkRfQ0FOTk9UX0JFX0RFVEVSTUlORUQ6IAorICAgICAgZXJyb3IgKCJMb3dlciBib3VuZCBtYXkgbm90IGJlICcqJyBpbiBGNzciKTsgCisgICAgICBicmVhazsgCisgICAgICAKKyAgICBjYXNlIEJPVU5EX0JZX1JFRl9PTl9TVEFDSzoKKyAgICAgIGN1cnJlbnRfZnJhbWVfYWRkciA9IHNlbGVjdGVkX2ZyYW1lLT5mcmFtZTsKKyAgICAgIGlmIChjdXJyZW50X2ZyYW1lX2FkZHIgPiAwKSAKKwl7CisJICBwdHJfdG9fbG93ZXJfYm91bmQgPSAKKwkgICAgcmVhZF9tZW1vcnlfaW50ZWdlciAoY3VycmVudF9mcmFtZV9hZGRyICsgCisJCQkJIFRZUEVfQVJSQVlfTE9XRVJfQk9VTkRfVkFMVUUgKHR5cGUpLAorCQkJCSA0KTsKKwkgICpsb3dlcl9ib3VuZCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHB0cl90b19sb3dlcl9ib3VuZCwgNCk7IAorCX0KKyAgICAgIGVsc2UKKwl7CisJICAqbG93ZXJfYm91bmQgPSBERUZBVUxUX0xPV0VSX0JPVU5EOyAKKwkgIHJldHVybiBCT1VORF9GRVRDSF9FUlJPUjsgCisJfQorICAgICAgYnJlYWs7IAorICAgICAgCisgICAgY2FzZSBCT1VORF9CWV9SRUZfSU5fUkVHOiAKKyAgICBjYXNlIEJPVU5EX0JZX1ZBTFVFX0lOX1JFRzogCisgICAgZGVmYXVsdDogCisgICAgICBlcnJvciAoIj8/PyB1bmhhbmRsZWQgZHluYW1pYyBhcnJheSBib3VuZCB0eXBlID8/PyIpOworICAgICAgYnJlYWs7IAorICAgIH0KKyAgcmV0dXJuIEJPVU5EX0ZFVENIX09LOworfQorCitpbnQgCitmNzdfZ2V0X2R5bmFtaWNfdXBwZXJib3VuZCAodHlwZSwgdXBwZXJfYm91bmQpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBpbnQgKnVwcGVyX2JvdW5kOworeworICBDT1JFX0FERFIgY3VycmVudF9mcmFtZV9hZGRyID0gMDsKKyAgQ09SRV9BRERSIHB0cl90b191cHBlcl9ib3VuZDsgCisgIAorICBzd2l0Y2ggKFRZUEVfQVJSQVlfVVBQRVJfQk9VTkRfVFlQRSAodHlwZSkpCisgICAgeworICAgIGNhc2UgQk9VTkRfQllfVkFMVUVfT05fU1RBQ0s6CisgICAgICBjdXJyZW50X2ZyYW1lX2FkZHIgPSBzZWxlY3RlZF9mcmFtZS0+ZnJhbWU7CisgICAgICBpZiAoY3VycmVudF9mcmFtZV9hZGRyID4gMCkgCisJeworCSAgKnVwcGVyX2JvdW5kID0gCisJICAgIHJlYWRfbWVtb3J5X2ludGVnZXIgKGN1cnJlbnRfZnJhbWVfYWRkciArIAorCQkJCSBUWVBFX0FSUkFZX1VQUEVSX0JPVU5EX1ZBTFVFICh0eXBlKSwKKwkJCQkgNCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgICp1cHBlcl9ib3VuZCA9IERFRkFVTFRfVVBQRVJfQk9VTkQ7IAorCSAgcmV0dXJuIEJPVU5EX0ZFVENIX0VSUk9SOyAKKwl9CisgICAgICBicmVhazsgCisgICAgICAKKyAgICBjYXNlIEJPVU5EX1NJTVBMRToKKyAgICAgICp1cHBlcl9ib3VuZCA9IFRZUEVfQVJSQVlfVVBQRVJfQk9VTkRfVkFMVUUgKHR5cGUpOworICAgICAgYnJlYWs7IAorICAgICAgCisgICAgY2FzZSBCT1VORF9DQU5OT1RfQkVfREVURVJNSU5FRDogCisgICAgICAvKiB3ZSBoYXZlIGFuIGFzc3VtZWQgc2l6ZSBhcnJheSBvbiBvdXIgaGFuZHMuIEFzc3VtZSB0aGF0IAorCSB1cHBlcl9ib3VuZCA9PSBsb3dlcl9ib3VuZCBzbyB0aGF0IHdlIHNob3cgYXQgbGVhc3QgCisJIDEgZWxlbWVudC5JZiB0aGUgdXNlciB3YW50cyB0byBzZWUgbW9yZSBlbGVtZW50cywgbGV0IAorCSBoaW0gbWFudWFsbHkgYXNrIGZvciAnZW0gYW5kIHdlJ2xsIHN1YnNjcmlwdCB0aGUgCisJIGFycmF5IGFuZCBzaG93IGhpbSAqLworICAgICAgZjc3X2dldF9keW5hbWljX2xvd2VyYm91bmQgKHR5cGUsIHVwcGVyX2JvdW5kKTsKKyAgICAgIGJyZWFrOyAKKyAgICAgIAorICAgIGNhc2UgQk9VTkRfQllfUkVGX09OX1NUQUNLOgorICAgICAgY3VycmVudF9mcmFtZV9hZGRyID0gc2VsZWN0ZWRfZnJhbWUtPmZyYW1lOworICAgICAgaWYgKGN1cnJlbnRfZnJhbWVfYWRkciA+IDApIAorCXsKKwkgIHB0cl90b191cHBlcl9ib3VuZCA9IAorCSAgICByZWFkX21lbW9yeV9pbnRlZ2VyIChjdXJyZW50X2ZyYW1lX2FkZHIgKyAKKwkJCQkgVFlQRV9BUlJBWV9VUFBFUl9CT1VORF9WQUxVRSAodHlwZSksCisJCQkJIDQpOworCSAgKnVwcGVyX2JvdW5kID0gcmVhZF9tZW1vcnlfaW50ZWdlcihwdHJfdG9fdXBwZXJfYm91bmQsIDQpOyAKKwl9CisgICAgICBlbHNlCisJeworCSAgKnVwcGVyX2JvdW5kID0gREVGQVVMVF9VUFBFUl9CT1VORDsgCisJICByZXR1cm4gQk9VTkRfRkVUQ0hfRVJST1I7CisJfQorICAgICAgYnJlYWs7IAorICAgICAgCisgICAgY2FzZSBCT1VORF9CWV9SRUZfSU5fUkVHOiAKKyAgICBjYXNlIEJPVU5EX0JZX1ZBTFVFX0lOX1JFRzogCisgICAgZGVmYXVsdDogCisgICAgICBlcnJvciAoIj8/PyB1bmhhbmRsZWQgZHluYW1pYyBhcnJheSBib3VuZCB0eXBlID8/PyIpOworICAgICAgYnJlYWs7IAorICAgIH0KKyAgcmV0dXJuIEJPVU5EX0ZFVENIX09LOworfQorCisvKiBPYnRhaW4gRjc3IGFkanVzdGFibGUgYXJyYXkgZGltZW5zaW9ucyAqLyAKKworc3RhdGljIHZvaWQKK2Y3N19nZXRfZHluYW1pY19sZW5ndGhfb2ZfYWdncmVnYXRlICh0eXBlKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgaW50IHVwcGVyX2JvdW5kID0gLTE7CisgIGludCBsb3dlcl9ib3VuZCA9IDE7IAorICBpbnQgcmV0Y29kZTsgCisgIAorICAvKiBSZWN1cnNpdmVseSBnbyBhbGwgdGhlIHdheSBkb3duIGludG8gYSBwb3NzaWJseSBtdWx0aS1kaW1lbnNpb25hbAorICAgICBGNzcgYXJyYXkgYW5kIGdldCB0aGUgYm91bmRzLiAgRm9yIHNpbXBsZSBhcnJheXMsIHRoaXMgaXMgcHJldHR5CisgICAgIGVhc3kgYnV0IHdoZW4gdGhlIGJvdW5kcyBhcmUgZHluYW1pYywgd2UgbXVzdCBiZSB2ZXJ5IGNhcmVmdWwgCisgICAgIHRvIGFkZCB1cCBhbGwgdGhlIGxlbmd0aHMgY29ycmVjdGx5LiAgTm90IGRvaW5nIHRoaXMgcmlnaHQgCisgICAgIHdpbGwgbGVhZCB0byBob3JyZW5kb3VzLWxvb2tpbmcgYXJyYXlzIGluIHBhcmFtZXRlciBsaXN0cy4KKyAgICAgCisgICAgIFRoaXMgZnVuY3Rpb24gYWxzbyB3b3JrcyBmb3Igc3RyaW5ncyB3aGljaCBiZWhhdmUgdmVyeSAKKyAgICAgc2ltaWxhcmx5IHRvIGFycmF5cy4gICovIAorICAKKyAgaWYgKFRZUEVfQ09ERShUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSkgPT0gVFlQRV9DT0RFX0FSUkFZCisgICAgICB8fCBUWVBFX0NPREUoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpID09IFRZUEVfQ09ERV9TVFJJTkcpCisgICAgZjc3X2dldF9keW5hbWljX2xlbmd0aF9vZl9hZ2dyZWdhdGUgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKKyAgCisgIC8qIFJlY3Vyc2lvbiBlbmRzIGhlcmUsIHN0YXJ0IHNldHRpbmcgdXAgbGVuZ3Rocy4gICovIAorICByZXRjb2RlID0gZjc3X2dldF9keW5hbWljX2xvd2VyYm91bmQgKHR5cGUsICZsb3dlcl9ib3VuZCk7IAorICBpZiAocmV0Y29kZSA9PSBCT1VORF9GRVRDSF9FUlJPUikKKyAgICBlcnJvciAoIkNhbm5vdCBvYnRhaW4gdmFsaWQgYXJyYXkgbG93ZXIgYm91bmQiKTsgCisgIAorICByZXRjb2RlID0gZjc3X2dldF9keW5hbWljX3VwcGVyYm91bmQgKHR5cGUsICZ1cHBlcl9ib3VuZCk7IAorICBpZiAocmV0Y29kZSA9PSBCT1VORF9GRVRDSF9FUlJPUikKKyAgICBlcnJvciAoIkNhbm5vdCBvYnRhaW4gdmFsaWQgYXJyYXkgdXBwZXIgYm91bmQiKTsgCisgIAorICAvKiBQYXRjaCBpbiBhIHZhbGlkIGxlbmd0aCB2YWx1ZS4gKi8gCisgIAorICBUWVBFX0xFTkdUSCAodHlwZSkgPQorICAgICh1cHBlcl9ib3VuZCAtIGxvd2VyX2JvdW5kICsgMSkgKiBUWVBFX0xFTkdUSCAoY2hlY2tfdHlwZWRlZiAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpKTsKK30gICAgICAgCisKKy8qIEZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgYXJyYXkgb2Zmc2V0LHNpemUgdGFibGUgZm9yIHRoZSBhcnJheSAKKyAgIHR5cGUgInR5cGUiLiAgKi8gCisKK3N0YXRpYyB2b2lkIAorZjc3X2NyZWF0ZV9hcnJheXByaW50X29mZnNldF90YmwgKHR5cGUsIHN0cmVhbSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIEdEQl9GSUxFICpzdHJlYW07Cit7CisgIHN0cnVjdCB0eXBlICp0bXBfdHlwZTsKKyAgaW50IGVsdGxlbjsKKyAgaW50IG5kaW1lbiA9IDE7CisgIGludCB1cHBlciwgbG93ZXIsIHJldGNvZGU7IAorICAKKyAgdG1wX3R5cGUgPSB0eXBlOyAKKyAgCisgIHdoaWxlICgoVFlQRV9DT0RFICh0bXBfdHlwZSkgPT0gVFlQRV9DT0RFX0FSUkFZKSkgCisgICAgeworICAgICAgaWYgKFRZUEVfQVJSQVlfVVBQRVJfQk9VTkRfVFlQRSAodG1wX3R5cGUpID09IEJPVU5EX0NBTk5PVF9CRV9ERVRFUk1JTkVEKQorCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjxhc3N1bWVkIHNpemUgYXJyYXk+ICIpOyAKKyAgICAgIAorICAgICAgcmV0Y29kZSA9IGY3N19nZXRfZHluYW1pY191cHBlcmJvdW5kICh0bXBfdHlwZSwgJnVwcGVyKTsKKyAgICAgIGlmIChyZXRjb2RlID09IEJPVU5EX0ZFVENIX0VSUk9SKQorCWVycm9yICgiQ2Fubm90IG9idGFpbiBkeW5hbWljIHVwcGVyIGJvdW5kIik7IAorICAgICAgCisgICAgICByZXRjb2RlID0gZjc3X2dldF9keW5hbWljX2xvd2VyYm91bmQodG1wX3R5cGUsJmxvd2VyKTsgCisgICAgICBpZiAocmV0Y29kZSA9PSBCT1VORF9GRVRDSF9FUlJPUikKKwllcnJvcigiQ2Fubm90IG9idGFpbiBkeW5hbWljIGxvd2VyIGJvdW5kIik7IAorICAgICAgCisgICAgICBGNzdfRElNX1NJWkUgKG5kaW1lbikgPSB1cHBlciAtIGxvd2VyICsgMTsKKyAgICAgIAorICAgICAgdG1wX3R5cGUgPSBUWVBFX1RBUkdFVF9UWVBFICh0bXBfdHlwZSk7CisgICAgICBuZGltZW4rKzsgCisgICAgfQorICAKKyAgLyogTm93IHdlIG11bHRpcGx5IGVsdGxlbiBieSBhbGwgdGhlIG9mZnNldHMsIHNvIHRoYXQgbGF0ZXIgd2UgCisgICAgIGNhbiBwcmludCBvdXQgYXJyYXkgZWxlbWVudHMgY29ycmVjdGx5LiAgVXAgdGlsbCBub3cgd2UgCisgICAgIGtub3cgYW4gb2Zmc2V0IHRvIGFwcGx5IHRvIGdldCB0aGUgaXRlbSBidXQgd2UgYWxzbyAKKyAgICAgaGF2ZSB0byBrbm93IGhvdyBtdWNoIHRvIGFkZCB0byBnZXQgdG8gdGhlIG5leHQgaXRlbSAqLworICAKKyAgbmRpbWVuLS07CisgIGVsdGxlbiA9IFRZUEVfTEVOR1RIICh0bXBfdHlwZSk7IAorICBGNzdfRElNX09GRlNFVCAobmRpbWVuKSA9IGVsdGxlbjsKKyAgd2hpbGUgKC0tbmRpbWVuID4gMCkKKyAgICB7CisgICAgICBlbHRsZW4gKj0gRjc3X0RJTV9TSVpFIChuZGltZW4gKyAxKTsKKyAgICAgIEY3N19ESU1fT0ZGU0VUIChuZGltZW4pID0gZWx0bGVuOworICAgIH0KK30KKworLyogQWN0dWFsIGZ1bmN0aW9uIHdoaWNoIHByaW50cyBvdXQgRjc3IGFycmF5cywgVmFsYWRkciA9PSBhZGRyZXNzIGluIAorICAgdGhlIHN1cGVyaW9yLiAgQWRkcmVzcyA9PSB0aGUgYWRkcmVzcyBpbiB0aGUgaW5mZXJpb3IuICAqLworCitzdGF0aWMgdm9pZCAKK2Y3N19wcmludF9hcnJheV8xIChuc3MsIG5kaW1lbnNpb25zLCB0eXBlLCB2YWxhZGRyLCBhZGRyZXNzLCAKKwkJICAgc3RyZWFtLCBmb3JtYXQsIGRlcmVmX3JlZiwgcmVjdXJzZSwgcHJldHR5KQorICAgICBpbnQgbnNzOworICAgICBpbnQgbmRpbWVuc2lvbnM7IAorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgY2hhciAqdmFsYWRkcjsKKyAgICAgQ09SRV9BRERSIGFkZHJlc3M7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGludCBmb3JtYXQ7CisgICAgIGludCBkZXJlZl9yZWY7CisgICAgIGludCByZWN1cnNlOworICAgICBlbnVtIHZhbF9wcmV0dHlwcmludCBwcmV0dHk7Cit7CisgIGludCBpOworICAKKyAgaWYgKG5zcyAhPSBuZGltZW5zaW9ucykKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpPCBGNzdfRElNX1NJWkUobnNzKTsgaSsrKQorCXsKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiggIik7CisJICBmNzdfcHJpbnRfYXJyYXlfMSAobnNzICsgMSwgbmRpbWVuc2lvbnMsIFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpLAorCQkJICAgIHZhbGFkZHIgKyBpICogRjc3X0RJTV9PRkZTRVQgKG5zcyksCisJCQkgICAgYWRkcmVzcyArIGkgKiBGNzdfRElNX09GRlNFVCAobnNzKSwgCisJCQkgICAgc3RyZWFtLCBmb3JtYXQsIGRlcmVmX3JlZiwgcmVjdXJzZSwgcHJldHR5KTsKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIikgIik7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IChpIDwgRjc3X0RJTV9TSVpFIChuc3MpICYmIGkgPCBwcmludF9tYXgpOyBpKyspCisJeworCSAgdmFsX3ByaW50IChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSwKKwkJICAgICB2YWxhZGRyICsgaSAqIEY3N19ESU1fT0ZGU0VUIChuZGltZW5zaW9ucyksCisgICAgICAgICAgICAgICAgICAgICAwLAorCQkgICAgIGFkZHJlc3MgKyBpICogRjc3X0RJTV9PRkZTRVQgKG5kaW1lbnNpb25zKSwKKwkJICAgICBzdHJlYW0sIGZvcm1hdCwgZGVyZWZfcmVmLCByZWN1cnNlLCBwcmV0dHkpOyAKKworCSAgaWYgKGkgIT0gKEY3N19ESU1fU0laRSAobnNzKSAtIDEpKQorCSAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIsICIpOyAKKwkgIAorCSAgaWYgKGkgPT0gcHJpbnRfbWF4IC0gMSkKKwkgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiLi4uIik7CisJfQorICAgIH0KK30KKworLyogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCB0byBwcmludCBhbiBGNzcgYXJyYXksIHdlIHNldCB1cCBzb21lIAorICAgc3R1ZmYgYW5kIHRoZW4gaW1tZWRpYXRlbHkgY2FsbCBmNzdfcHJpbnRfYXJyYXlfMSgpICovCisKK3N0YXRpYyB2b2lkIAorZjc3X3ByaW50X2FycmF5ICh0eXBlLCB2YWxhZGRyLCBhZGRyZXNzLCBzdHJlYW0sIGZvcm1hdCwgZGVyZWZfcmVmLCByZWN1cnNlLCAKKwkJIHByZXR0eSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGNoYXIgKnZhbGFkZHI7CisgICAgIENPUkVfQUREUiBhZGRyZXNzOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgZm9ybWF0OworICAgICBpbnQgZGVyZWZfcmVmOworICAgICBpbnQgcmVjdXJzZTsKKyAgICAgZW51bSB2YWxfcHJldHR5cHJpbnQgcHJldHR5OworeworICBpbnQgbmRpbWVuc2lvbnM7IAorICAKKyAgbmRpbWVuc2lvbnMgPSBjYWxjX2Y3N19hcnJheV9kaW1zICh0eXBlKTsgCisgIAorICBpZiAobmRpbWVuc2lvbnMgPiBNQVhfRk9SVFJBTl9ESU1TIHx8IG5kaW1lbnNpb25zIDwgMCkKKyAgICBlcnJvciAoIlR5cGUgbm9kZSBjb3JydXB0ISBGNzcgYXJyYXlzIGNhbm5vdCBoYXZlICVkIHN1YnNjcmlwdHMgKCVkIE1heCkiLAorCSAgIG5kaW1lbnNpb25zLCBNQVhfRk9SVFJBTl9ESU1TKTsKKyAgCisgIC8qIFNpbmNlIEY3NyBhcnJheXMgYXJlIHN0b3JlZCBjb2x1bW4tbWFqb3IsIHdlIHNldCB1cCBhbiAKKyAgICAgb2Zmc2V0IHRhYmxlIHRvIGdldCBhdCB0aGUgdmFyaW91cyByb3cncyBlbGVtZW50cy4gVGhlIAorICAgICBvZmZzZXQgdGFibGUgY29udGFpbnMgZW50cmllcyBmb3IgYm90aCBvZmZzZXQgYW5kIHN1YmFycmF5IHNpemUuICovIAorICAKKyAgZjc3X2NyZWF0ZV9hcnJheXByaW50X29mZnNldF90YmwgKHR5cGUsIHN0cmVhbSk7IAorICAKKyAgZjc3X3ByaW50X2FycmF5XzEgKDEsIG5kaW1lbnNpb25zLCB0eXBlLCB2YWxhZGRyLCBhZGRyZXNzLCBzdHJlYW0sIGZvcm1hdCwgCisgICAgICAgICAgICAgICAgICAgICBkZXJlZl9yZWYsIHJlY3Vyc2UsIHByZXR0eSk7Cit9CisKKwwKKy8qIFByaW50IGRhdGEgb2YgdHlwZSBUWVBFIGxvY2F0ZWQgYXQgVkFMQUREUiAod2l0aGluIEdEQiksIHdoaWNoIGNhbWUgZnJvbQorICAgdGhlIGluZmVyaW9yIGF0IGFkZHJlc3MgQUREUkVTUywgb250byBzdGRpbyBzdHJlYW0gU1RSRUFNIGFjY29yZGluZyB0bworICAgRk9STUFUIChhIGxldHRlciBvciAwIGZvciBuYXR1cmFsIGZvcm1hdCkuICBUaGUgZGF0YSBhdCBWQUxBRERSIGlzIGluCisgICB0YXJnZXQgYnl0ZSBvcmRlci4KKyAgIAorICAgSWYgdGhlIGRhdGEgYXJlIGEgc3RyaW5nIHBvaW50ZXIsIHJldHVybnMgdGhlIG51bWJlciBvZiBzdHJpbmcgY2hhcmFjdGVycworICAgcHJpbnRlZC4KKyAgIAorICAgSWYgREVSRUZfUkVGIGlzIG5vbnplcm8sIHRoZW4gZGVyZWZlcmVuY2UgcmVmZXJlbmNlcywgb3RoZXJ3aXNlIGp1c3QgcHJpbnQKKyAgIHRoZW0gbGlrZSBwb2ludGVycy4KKyAgIAorICAgVGhlIFBSRVRUWSBwYXJhbWV0ZXIgY29udHJvbHMgcHJldHR5cHJpbnRpbmcuICAqLworCitpbnQKK2ZfdmFsX3ByaW50ICh0eXBlLCB2YWxhZGRyLCBlbWJlZGRlZF9vZmZzZXQsIGFkZHJlc3MsIHN0cmVhbSwgZm9ybWF0LCBkZXJlZl9yZWYsIHJlY3Vyc2UsCisJICAgICBwcmV0dHkpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBjaGFyICp2YWxhZGRyOworICAgICBpbnQgZW1iZWRkZWRfb2Zmc2V0OworICAgICBDT1JFX0FERFIgYWRkcmVzczsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgaW50IGZvcm1hdDsKKyAgICAgaW50IGRlcmVmX3JlZjsKKyAgICAgaW50IHJlY3Vyc2U7CisgICAgIGVudW0gdmFsX3ByZXR0eXByaW50IHByZXR0eTsKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGkgPSAwOwkJLyogTnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZCAqLworICBzdHJ1Y3QgdHlwZSAqZWx0dHlwZTsKKyAgTE9OR0VTVCB2YWw7CisgIENPUkVfQUREUiBhZGRyOworICAKKyAgQ0hFQ0tfVFlQRURFRiAodHlwZSk7CisgIHN3aXRjaCAoVFlQRV9DT0RFICh0eXBlKSkKKyAgICB7CisgICAgY2FzZSBUWVBFX0NPREVfU1RSSU5HOiAKKyAgICAgIGY3N19nZXRfZHluYW1pY19sZW5ndGhfb2ZfYWdncmVnYXRlICh0eXBlKTsKKyAgICAgIExBX1BSSU5UX1NUUklORyAoc3RyZWFtLCB2YWxhZGRyLCBUWVBFX0xFTkdUSCAodHlwZSksIDEsIDApOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIFRZUEVfQ09ERV9BUlJBWToKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIigiKTsgCisgICAgICBmNzdfcHJpbnRfYXJyYXkgKHR5cGUsIHZhbGFkZHIsIGFkZHJlc3MsIHN0cmVhbSwgZm9ybWF0LCAKKwkJICAgICAgIGRlcmVmX3JlZiwgcmVjdXJzZSwgcHJldHR5KTsgCisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIpIik7CisgICAgICBicmVhazsKKyNpZiAwCisgICAgICAvKiBBcnJheSBvZiB1bnNwZWNpZmllZCBsZW5ndGg6IHRyZWF0IGxpa2UgcG9pbnRlciB0byBmaXJzdCBlbHQuICAqLworICAgICAgdmFsYWRkciA9IChjaGFyICopICZhZGRyZXNzOworICAgICAgLyogRkFMTCBUSFJPVUdIICovCisjZW5kaWYgCisgICAgY2FzZSBUWVBFX0NPREVfUFRSOgorICAgICAgaWYgKGZvcm1hdCAmJiBmb3JtYXQgIT0gJ3MnKQorCXsKKwkgIHByaW50X3NjYWxhcl9mb3JtYXR0ZWQgKHZhbGFkZHIsIHR5cGUsIGZvcm1hdCwgMCwgc3RyZWFtKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBhZGRyID0gdW5wYWNrX3BvaW50ZXIgKHR5cGUsIHZhbGFkZHIpOworCSAgZWx0dHlwZSA9IGNoZWNrX3R5cGVkZWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKKwkgIAorCSAgaWYgKFRZUEVfQ09ERSAoZWx0dHlwZSkgPT0gVFlQRV9DT0RFX0ZVTkMpCisJICAgIHsKKwkgICAgICAvKiBUcnkgdG8gcHJpbnQgd2hhdCBmdW5jdGlvbiBpdCBwb2ludHMgdG8uICAqLworCSAgICAgIHByaW50X2FkZHJlc3NfZGVtYW5nbGUgKGFkZHIsIHN0cmVhbSwgZGVtYW5nbGUpOworCSAgICAgIC8qIFJldHVybiB2YWx1ZSBpcyBpcnJlbGV2YW50IGV4Y2VwdCBmb3Igc3RyaW5nIHBvaW50ZXJzLiAgKi8KKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCSAgCisJICBpZiAoYWRkcmVzc3ByaW50ICYmIGZvcm1hdCAhPSAncycpCisJICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjB4JXgiLCBhZGRyKTsKKwkgIAorCSAgLyogRm9yIGEgcG9pbnRlciB0byBjaGFyIG9yIHVuc2lnbmVkIGNoYXIsIGFsc28gcHJpbnQgdGhlIHN0cmluZworCSAgICAgcG9pbnRlZCB0bywgdW5sZXNzIHBvaW50ZXIgaXMgbnVsbC4gICovCisJICBpZiAoVFlQRV9MRU5HVEggKGVsdHR5cGUpID09IDEKKwkgICAgICAmJiBUWVBFX0NPREUgKGVsdHR5cGUpID09IFRZUEVfQ09ERV9JTlQKKwkgICAgICAmJiAoZm9ybWF0ID09IDAgfHwgZm9ybWF0ID09ICdzJykKKwkgICAgICAmJiBhZGRyICE9IDApCisJICAgIGkgPSB2YWxfcHJpbnRfc3RyaW5nIChhZGRyLCAtMSwgVFlQRV9MRU5HVEggKGVsdHR5cGUpLCBzdHJlYW0pOworCSAgCisJICAvKiBSZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZCwgcGx1cyBvbmUgZm9yIHRoZQorCSAgICAgdGVybWluYXRpbmcgbnVsbCBpZiB3ZSBoYXZlICJyZWFjaGVkIHRoZSBlbmQiLiAgKi8KKwkgIHJldHVybiAoaSArIChwcmludF9tYXggJiYgaSAhPSBwcmludF9tYXgpKTsKKwl9CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgVFlQRV9DT0RFX0ZVTkM6CisgICAgICBpZiAoZm9ybWF0KQorCXsKKwkgIHByaW50X3NjYWxhcl9mb3JtYXR0ZWQgKHZhbGFkZHIsIHR5cGUsIGZvcm1hdCwgMCwgc3RyZWFtKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIC8qIEZJWE1FLCB3ZSBzaG91bGQgY29uc2lkZXIsIGF0IGxlYXN0IGZvciBBTlNJIEMgbGFuZ3VhZ2UsIGVsaW1pbmF0aW5nCisJIHRoZSBkaXN0aW5jdGlvbiBtYWRlIGJldHdlZW4gRlVOQ3MgYW5kIFBPSU5URVJzIHRvIEZVTkNzLiAgKi8KKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInsiKTsKKyAgICAgIHR5cGVfcHJpbnQgKHR5cGUsICIiLCBzdHJlYW0sIC0xKTsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIn0gIik7CisgICAgICAvKiBUcnkgdG8gcHJpbnQgd2hhdCBmdW5jdGlvbiBpdCBwb2ludHMgdG8sIGFuZCBpdHMgYWRkcmVzcy4gICovCisgICAgICBwcmludF9hZGRyZXNzX2RlbWFuZ2xlIChhZGRyZXNzLCBzdHJlYW0sIGRlbWFuZ2xlKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBUWVBFX0NPREVfSU5UOgorICAgICAgZm9ybWF0ID0gZm9ybWF0ID8gZm9ybWF0IDogb3V0cHV0X2Zvcm1hdDsKKyAgICAgIGlmIChmb3JtYXQpCisJcHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCAodmFsYWRkciwgdHlwZSwgZm9ybWF0LCAwLCBzdHJlYW0pOworICAgICAgZWxzZQorCXsKKwkgIHZhbF9wcmludF90eXBlX2NvZGVfaW50ICh0eXBlLCB2YWxhZGRyLCBzdHJlYW0pOworCSAgLyogQyBhbmQgQysrIGhhcyBubyBzaW5nbGUgYnl0ZSBpbnQgdHlwZSwgY2hhciBpcyB1c2VkIGluc3RlYWQuCisJICAgICBTaW5jZSB3ZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIHZhbHVlIGlzIHJlYWxseSBpbnRlbmRlZCB0bworCSAgICAgYmUgdXNlZCBhcyBhbiBpbnRlZ2VyIG9yIGEgY2hhcmFjdGVyLCBwcmludCB0aGUgY2hhcmFjdGVyCisJICAgICBlcXVpdmFsZW50IGFzIHdlbGwuICovCisJICBpZiAoVFlQRV9MRU5HVEggKHR5cGUpID09IDEpCisJICAgIHsKKwkgICAgICBmcHV0c19maWx0ZXJlZCAoIiAiLCBzdHJlYW0pOworCSAgICAgIExBX1BSSU5UX0NIQVIgKCh1bnNpZ25lZCBjaGFyKSB1bnBhY2tfbG9uZyAodHlwZSwgdmFsYWRkciksCisJCQkgICAgIHN0cmVhbSk7CisJICAgIH0KKwl9CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgVFlQRV9DT0RFX0ZMVDoKKyAgICAgIGlmIChmb3JtYXQpCisJcHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCAodmFsYWRkciwgdHlwZSwgZm9ybWF0LCAwLCBzdHJlYW0pOworICAgICAgZWxzZQorCXByaW50X2Zsb2F0aW5nICh2YWxhZGRyLCB0eXBlLCBzdHJlYW0pOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIFRZUEVfQ09ERV9WT0lEOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiVk9JRCIpOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIFRZUEVfQ09ERV9FUlJPUjoKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjxlcnJvciB0eXBlPiIpOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIFRZUEVfQ09ERV9SQU5HRToKKyAgICAgIC8qIEZJWE1FLCB3ZSBzaG91bGQgbm90IGV2ZXIgaGF2ZSB0byBwcmludCBvbmUgb2YgdGhlc2UgeWV0LiAgKi8KKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjxyYW5nZSB0eXBlPiIpOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIFRZUEVfQ09ERV9CT09MOgorICAgICAgZm9ybWF0ID0gZm9ybWF0ID8gZm9ybWF0IDogb3V0cHV0X2Zvcm1hdDsKKyAgICAgIGlmIChmb3JtYXQpCisJcHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCAodmFsYWRkciwgdHlwZSwgZm9ybWF0LCAwLCBzdHJlYW0pOworICAgICAgZWxzZQorCXsKKyAgICAgICAgICB2YWwgPSAwOyAKKyAgICAgICAgICBzd2l0Y2ggKFRZUEVfTEVOR1RIKHR5cGUpKQorCSAgICB7CisJICAgIGNhc2UgMToKKwkgICAgICB2YWwgPSB1bnBhY2tfbG9uZyAoYnVpbHRpbl90eXBlX2ZfbG9naWNhbF9zMSwgdmFsYWRkcik7CisJICAgICAgYnJlYWsgOyAKKwkgICAgICAKKwkgICAgY2FzZSAyOiAKKwkgICAgICB2YWwgPSB1bnBhY2tfbG9uZyAoYnVpbHRpbl90eXBlX2ZfbG9naWNhbF9zMiwgdmFsYWRkcik7CisJICAgICAgYnJlYWsgOyAKKwkgICAgICAKKwkgICAgY2FzZSA0OiAKKwkgICAgICB2YWwgPSB1bnBhY2tfbG9uZyAoYnVpbHRpbl90eXBlX2ZfbG9naWNhbCwgdmFsYWRkcik7CisJICAgICAgYnJlYWsgOyAKKwkgICAgICAKKwkgICAgZGVmYXVsdDoKKwkgICAgICBlcnJvciAoIkxvZ2ljYWxzIG9mIGxlbmd0aCAlZCBieXRlcyBub3Qgc3VwcG9ydGVkIiwKKwkJICAgICBUWVBFX0xFTkdUSCAodHlwZSkpOworCSAgICAgIAorCSAgICB9CisJICAKKyAgICAgICAgICBpZiAodmFsID09IDApIAorCSAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIuRkFMU0UuIik7CisgICAgICAgICAgZWxzZSAKKwkgICAgaWYgKHZhbCA9PSAxKSAKKwkgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIuVFJVRS4iKTsKKwkgICAgZWxzZQorCSAgICAgIC8qIE5vdCBhIGxlZ2l0aW1hdGUgbG9naWNhbCB0eXBlLCBwcmludCBhcyBhbiBpbnRlZ2VyLiAgKi8KKwkgICAgICB7CisJCS8qIEJhc2ggdGhlIHR5cGUgY29kZSB0ZW1wb3JhcmlseS4gICovCisJCVRZUEVfQ09ERSAodHlwZSkgPSBUWVBFX0NPREVfSU5UOworCQlmX3ZhbF9wcmludCAodHlwZSwgdmFsYWRkciwgMCwgYWRkcmVzcywgc3RyZWFtLCBmb3JtYXQsIAorCQkJICAgICBkZXJlZl9yZWYsIHJlY3Vyc2UsIHByZXR0eSk7IAorCQkvKiBSZXN0b3JlIHRoZSB0eXBlIGNvZGUgc28gbGF0ZXIgdXNlcyB3b3JrIGFzIGludGVuZGVkLiAqLworCQlUWVBFX0NPREUgKHR5cGUpID0gVFlQRV9DT0RFX0JPT0w7IAorCSAgICAgIH0KKwl9CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgVFlQRV9DT0RFX0NPTVBMRVg6CisgICAgICBzd2l0Y2ggKFRZUEVfTEVOR1RIICh0eXBlKSkKKwl7CisJY2FzZSA4OiAgdHlwZSA9IGJ1aWx0aW5fdHlwZV9mX3JlYWw7ICBicmVhazsKKwljYXNlIDE2OiAgdHlwZSA9IGJ1aWx0aW5fdHlwZV9mX3JlYWxfczg7ICBicmVhazsKKwljYXNlIDMyOiAgdHlwZSA9IGJ1aWx0aW5fdHlwZV9mX3JlYWxfczE2OyAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGVycm9yICgiQ2Fubm90IHByaW50IG91dCBjb21wbGV4KiVkIHZhcmlhYmxlcyIsIFRZUEVfTEVOR1RIKHR5cGUpKTsgCisJfQorICAgICAgZnB1dHNfZmlsdGVyZWQgKCIoIiwgc3RyZWFtKTsKKyAgICAgIHByaW50X2Zsb2F0aW5nICh2YWxhZGRyLCB0eXBlLCBzdHJlYW0pOworICAgICAgZnB1dHNfZmlsdGVyZWQgKCIsIiwgc3RyZWFtKTsKKyAgICAgIHByaW50X2Zsb2F0aW5nICh2YWxhZGRyLCB0eXBlLCBzdHJlYW0pOworICAgICAgZnB1dHNfZmlsdGVyZWQgKCIpIiwgc3RyZWFtKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBUWVBFX0NPREVfVU5ERUY6CisgICAgICAvKiBUaGlzIGhhcHBlbnMgKHdpdGhvdXQgVFlQRV9GTEFHX1NUVUIgc2V0KSBvbiBzeXN0ZW1zIHdoaWNoIGRvbid0IHVzZQorCSBkYnggeHJlZnMgKE5PX0RCWF9YUkVGUyBpbiBnY2MpIGlmIGEgZmlsZSBoYXMgYSAic3RydWN0IGZvbyAqYmFyIgorCSBhbmQgbm8gY29tcGxldGUgdHlwZSBmb3Igc3RydWN0IGZvbyBpbiB0aGF0IGZpbGUuICAqLworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiPGluY29tcGxldGUgdHlwZT4iKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yICgiSW52YWxpZCBGNzcgdHlwZSBjb2RlICVkIGluIHN5bWJvbCB0YWJsZS4iLCBUWVBFX0NPREUgKHR5cGUpKTsKKyAgICB9CisgIGdkYl9mbHVzaCAoc3RyZWFtKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitsaXN0X2FsbF92aXNpYmxlX2NvbW1vbnMgKGZ1bm5hbWUpCisgICAgIGNoYXIgKmZ1bm5hbWU7Cit7CisgIFNBVkVEX0Y3N19DT01NT05fUFRSICB0bXA7CisgIAorICB0bXAgPSBoZWFkX2NvbW1vbl9saXN0OworICAKKyAgcHJpbnRmX2ZpbHRlcmVkICgiQWxsIENPTU1PTiBibG9ja3MgdmlzaWJsZSBhdCB0aGlzIGxldmVsOlxuXG4iKTsKKyAgCisgIHdoaWxlICh0bXAgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoU1RSRVEodG1wLT5vd25pbmdfZnVuY3Rpb24sZnVubmFtZSkpCisJcHJpbnRmX2ZpbHRlcmVkICgiJXNcbiIsIHRtcC0+bmFtZSk7IAorICAgICAgCisgICAgICB0bXAgPSB0bXAtPm5leHQ7CisgICAgfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcHJpbnQgb3V0IHRoZSB2YWx1ZXMgaW4gYSBnaXZlbiBDT01NT04gCisgICBibG9jay4gSXQgd2lsbCBhbHdheXMgdXNlIHRoZSBtb3N0IGxvY2FsIGNvbW1vbiBibG9jayBvZiB0aGUgCisgICBnaXZlbiBuYW1lICovIAorCitzdGF0aWMgdm9pZCAKK2luZm9fY29tbW9uX2NvbW1hbmQgKGNvbW5hbWUsIGZyb21fdHR5KQorICAgICBjaGFyICpjb21uYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIFNBVkVEX0Y3N19DT01NT05fUFRSICB0aGVfY29tbW9uOyAKKyAgQ09NTU9OX0VOVFJZX1BUUiBlbnRyeTsgCisgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKKyAgcmVnaXN0ZXIgY2hhciAqZnVubmFtZSA9IDA7CisgIHN0cnVjdCBzeW1ib2wgKmZ1bmM7CisgIAorICAvKiBXZSBoYXZlIGJlZW4gdG9sZCB0byBkaXNwbGF5IHRoZSBjb250ZW50cyBvZiBGNzcgQ09NTU9OIAorICAgICBibG9jayBzdXBwb3NlZGx5IHZpc2libGUgaW4gdGhpcyBmdW5jdGlvbi4gIExldCB1cyAKKyAgICAgZmlyc3QgbWFrZSBzdXJlIHRoYXQgaXQgaXMgdmlzaWJsZSBhbmQgaWYgc28sIGxldCAKKyAgICAgdXMgZGlzcGxheSBpdHMgY29udGVudHMgKi8gCisgIAorICBmaSA9IHNlbGVjdGVkX2ZyYW1lOyAKKyAgCisgIGlmIChmaSA9PSBOVUxMKQorICAgIGVycm9yICgiTm8gZnJhbWUgc2VsZWN0ZWQiKTsgCisgIAorICAvKiBUaGUgZm9sbG93aW5nIGlzIGdlbmVyYWxseSByaXBwZWQgb2ZmIGZyb20gc3RhY2suYydzIHJvdXRpbmUgCisgICAgIHByaW50X2ZyYW1lX2luZm8oKSAqLyAKKyAgCisgIGZ1bmMgPSBmaW5kX3BjX2Z1bmN0aW9uIChmaS0+cGMpOworICBpZiAoZnVuYykKKyAgICB7CisgICAgICAvKiBJbiBjZXJ0YWluIHBhdGhvbG9naWNhbCBjYXNlcywgdGhlIHN5bXRhYnMgZ2l2ZSB0aGUgd3JvbmcKKwkgZnVuY3Rpb24gKHdoZW4gd2UgYXJlIGluIHRoZSBmaXJzdCBmdW5jdGlvbiBpbiBhIGZpbGUgd2hpY2gKKwkgaXMgY29tcGlsZWQgd2l0aG91dCBkZWJ1Z2dpbmcgc3ltYm9scywgdGhlIHByZXZpb3VzIGZ1bmN0aW9uCisJIGlzIGNvbXBpbGVkIHdpdGggZGVidWdnaW5nIHN5bWJvbHMsIGFuZCB0aGUgImZvby5vIiBzeW1ib2wKKwkgdGhhdCBpcyBzdXBwb3NlZCB0byB0ZWxsIHVzIHdoZXJlIHRoZSBmaWxlIHdpdGggZGVidWdnaW5nIHN5bWJvbHMKKwkgZW5kcyBoYXMgYmVlbiB0cnVuY2F0ZWQgYnkgYXIgYmVjYXVzZSBpdCBpcyBsb25nZXIgdGhhbiAxNQorCSBjaGFyYWN0ZXJzKS4KKwkgCisJIFNvIGxvb2sgaW4gdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlcyBhcyB3ZWxsLCBhbmQgaWYgaXQgY29tZXMKKwkgdXAgd2l0aCBhIGxhcmdlciBhZGRyZXNzIGZvciB0aGUgZnVuY3Rpb24gdXNlIHRoYXQgaW5zdGVhZC4KKwkgSSBkb24ndCB0aGluayB0aGlzIGNhbiBldmVyIGNhdXNlIGFueSBwcm9ibGVtczsgdGhlcmUgc2hvdWxkbid0CisJIGJlIGFueSBtaW5pbWFsIHN5bWJvbHMgaW4gdGhlIG1pZGRsZSBvZiBhIGZ1bmN0aW9uLgorCSBGSVhNRTogIChOb3QgbmVjZXNzYXJpbHkgdHJ1ZS4gIFdoYXQgYWJvdXQgdGV4dCBsYWJlbHMpICovCisgICAgICAKKyAgICAgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbF9ieV9wYyAoZmktPnBjKTsKKyAgICAgIAorICAgICAgaWYgKG1zeW1ib2wgIT0gTlVMTAorCSAgJiYgKFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKSAKKwkgICAgICA+IEJMT0NLX1NUQVJUIChTWU1CT0xfQkxPQ0tfVkFMVUUgKGZ1bmMpKSkpCisJZnVubmFtZSA9IFNZTUJPTF9OQU1FIChtc3ltYm9sKTsKKyAgICAgIGVsc2UKKwlmdW5uYW1lID0gU1lNQk9MX05BTUUgKGZ1bmMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbCA9CisJbG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjIChmaS0+cGMpOworICAgICAgCisgICAgICBpZiAobXN5bWJvbCAhPSBOVUxMKQorCWZ1bm5hbWUgPSBTWU1CT0xfTkFNRSAobXN5bWJvbCk7CisgICAgfQorICAKKyAgLyogSWYgY29tbmFtZSBpcyBOVUxMLCB3ZSBhc3N1bWUgdGhlIHVzZXIgd2lzaGVzIHRvIHNlZSB0aGUgCisgICAgIHdoaWNoIENPTU1PTiBibG9ja3MgYXJlIHZpc2libGUgaGVyZSBhbmQgdGhlbiByZXR1cm4gKi8gCisgIAorICBpZiAoY29tbmFtZSA9PSAwKQorICAgIHsKKyAgICAgIGxpc3RfYWxsX3Zpc2libGVfY29tbW9ucyAoZnVubmFtZSk7CisgICAgICByZXR1cm47IAorICAgIH0KKyAgCisgIHRoZV9jb21tb24gPSBmaW5kX2NvbW1vbl9mb3JfZnVuY3Rpb24gKGNvbW5hbWUsZnVubmFtZSk7IAorICAKKyAgaWYgKHRoZV9jb21tb24pCisgICAgeworICAgICAgaWYgKFNUUkVRKGNvbW5hbWUsQkxBTktfQ09NTU9OX05BTUVfTE9DQUwpKQorCXByaW50Zl9maWx0ZXJlZCAoIkNvbnRlbnRzIG9mIGJsYW5rIENPTU1PTiBibG9jazpcbiIpOworICAgICAgZWxzZSAKKwlwcmludGZfZmlsdGVyZWQgKCJDb250ZW50cyBvZiBGNzcgQ09NTU9OIGJsb2NrICclcyc6XG4iLGNvbW5hbWUpOyAKKyAgICAgIAorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsgCisgICAgICBlbnRyeSA9IHRoZV9jb21tb24tPmVudHJpZXM7IAorICAgICAgCisgICAgICB3aGlsZSAoZW50cnkgIT0gTlVMTCkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCIlcyA9ICIsU1lNQk9MX05BTUUoZW50cnktPnN5bWJvbCkpOyAKKwkgIHByaW50X3ZhcmlhYmxlX3ZhbHVlIChlbnRyeS0+c3ltYm9sLCBmaSwgZ2RiX3N0ZG91dCk7IAorCSAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsgCisJICBlbnRyeSA9IGVudHJ5LT5uZXh0OyAKKwl9CisgICAgfQorICBlbHNlIAorICAgIHByaW50Zl9maWx0ZXJlZCAoIkNhbm5vdCBsb2NhdGUgdGhlIGNvbW1vbiBibG9jayAlcyBpbiBmdW5jdGlvbiAnJXMnXG4iLAorCQkgICAgY29tbmFtZSwgZnVubmFtZSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcyBhCisgICBGNzcgY29tbW9uIGJsb2NrIHZpc2libGUgYXQgdGhlIGN1cnJlbnQgc2NvcGUgY2FsbGVkICdjb21uYW1lJy4gKi8gCisKKyNpZiAwCitzdGF0aWMgaW50Cit0aGVyZV9pc19hX3Zpc2libGVfY29tbW9uX25hbWVkIChjb21uYW1lKQorICAgICBjaGFyICpjb21uYW1lOworeworICBTQVZFRF9GNzdfQ09NTU9OX1BUUiAgdGhlX2NvbW1vbjsgCisgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKKyAgcmVnaXN0ZXIgY2hhciAqZnVubmFtZSA9IDA7CisgIHN0cnVjdCBzeW1ib2wgKmZ1bmM7CisgIAorICBpZiAoY29tbmFtZSA9PSBOVUxMKQorICAgIGVycm9yICgiQ2Fubm90IGRlYWwgd2l0aCBOVUxMIGNvbW1vbiBuYW1lISIpOyAKKyAgCisgIGZpID0gc2VsZWN0ZWRfZnJhbWU7IAorICAKKyAgaWYgKGZpID09IE5VTEwpCisgICAgZXJyb3IgKCJObyBmcmFtZSBzZWxlY3RlZCIpOyAKKyAgCisgIC8qIFRoZSBmb2xsb3dpbmcgaXMgZ2VuZXJhbGx5IHJpcHBlZCBvZmYgZnJvbSBzdGFjay5jJ3Mgcm91dGluZSAKKyAgICAgcHJpbnRfZnJhbWVfaW5mbygpICovIAorICAKKyAgZnVuYyA9IGZpbmRfcGNfZnVuY3Rpb24gKGZpLT5wYyk7CisgIGlmIChmdW5jKQorICAgIHsKKyAgICAgIC8qIEluIGNlcnRhaW4gcGF0aG9sb2dpY2FsIGNhc2VzLCB0aGUgc3ltdGFicyBnaXZlIHRoZSB3cm9uZworCSBmdW5jdGlvbiAod2hlbiB3ZSBhcmUgaW4gdGhlIGZpcnN0IGZ1bmN0aW9uIGluIGEgZmlsZSB3aGljaAorCSBpcyBjb21waWxlZCB3aXRob3V0IGRlYnVnZ2luZyBzeW1ib2xzLCB0aGUgcHJldmlvdXMgZnVuY3Rpb24KKwkgaXMgY29tcGlsZWQgd2l0aCBkZWJ1Z2dpbmcgc3ltYm9scywgYW5kIHRoZSAiZm9vLm8iIHN5bWJvbAorCSB0aGF0IGlzIHN1cHBvc2VkIHRvIHRlbGwgdXMgd2hlcmUgdGhlIGZpbGUgd2l0aCBkZWJ1Z2dpbmcgc3ltYm9scworCSBlbmRzIGhhcyBiZWVuIHRydW5jYXRlZCBieSBhciBiZWNhdXNlIGl0IGlzIGxvbmdlciB0aGFuIDE1CisJIGNoYXJhY3RlcnMpLgorCSAKKwkgU28gbG9vayBpbiB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGVzIGFzIHdlbGwsIGFuZCBpZiBpdCBjb21lcworCSB1cCB3aXRoIGEgbGFyZ2VyIGFkZHJlc3MgZm9yIHRoZSBmdW5jdGlvbiB1c2UgdGhhdCBpbnN0ZWFkLgorCSBJIGRvbid0IHRoaW5rIHRoaXMgY2FuIGV2ZXIgY2F1c2UgYW55IHByb2JsZW1zOyB0aGVyZSBzaG91bGRuJ3QKKwkgYmUgYW55IG1pbmltYWwgc3ltYm9scyBpbiB0aGUgbWlkZGxlIG9mIGEgZnVuY3Rpb24uCisJIEZJWE1FOiAgKE5vdCBuZWNlc3NhcmlseSB0cnVlLiAgV2hhdCBhYm91dCB0ZXh0IGxhYmVscykgKi8KKyAgICAgIAorICAgICAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sID0gbG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjIChmaS0+cGMpOworICAgICAgCisgICAgICBpZiAobXN5bWJvbCAhPSBOVUxMCisJICAmJiAoU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpIAorCSAgICAgID4gQkxPQ0tfU1RBUlQgKFNZTUJPTF9CTE9DS19WQUxVRSAoZnVuYykpKSkKKwlmdW5uYW1lID0gU1lNQk9MX05BTUUgKG1zeW1ib2wpOworICAgICAgZWxzZQorCWZ1bm5hbWUgPSBTWU1CT0xfTkFNRSAoZnVuYyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVnaXN0ZXIgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sID0gCisJbG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjIChmaS0+cGMpOworICAgICAgCisgICAgICBpZiAobXN5bWJvbCAhPSBOVUxMKQorCWZ1bm5hbWUgPSBTWU1CT0xfTkFNRSAobXN5bWJvbCk7CisgICAgfQorICAKKyAgdGhlX2NvbW1vbiA9IGZpbmRfY29tbW9uX2Zvcl9mdW5jdGlvbiAoY29tbmFtZSwgZnVubmFtZSk7IAorICAKKyAgcmV0dXJuICh0aGVfY29tbW9uID8gMSA6IDApOworfQorI2VuZGlmCisKK3ZvaWQKK19pbml0aWFsaXplX2ZfdmFscHJpbnQgKCkKK3sKKyAgYWRkX2luZm8gKCJjb21tb24iLCBpbmZvX2NvbW1vbl9jb21tYW5kLAorCSAgICAiUHJpbnQgb3V0IHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIGEgRm9ydHJhbiBDT01NT04gYmxvY2suIik7CisgIGlmICh4ZGJfY29tbWFuZHMpCisgICAgYWRkX2NvbSgibGMiLCBjbGFzc19pbmZvLCBpbmZvX2NvbW1vbl9jb21tYW5kLAorCSAgICAiUHJpbnQgb3V0IHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIGEgRm9ydHJhbiBDT01NT04gYmxvY2suIik7Cit9CmRpZmYgLS1naXQgYS9nZGIvZmluZHZhci5jIGIvZ2RiL2ZpbmR2YXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmZlY2MyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2ZpbmR2YXIuYwpAQCAtMCwwICsxLDE2MzAgQEAKKy8qIEZpbmQgYSB2YXJpYWJsZSdzIHZhbHVlIGluIG1lbW9yeSwgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTg2LCA4NywgODksIDkxLCA5NCwgOTUsIDk2LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJmbG9hdGZvcm1hdC5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIJLyogZm9yIG92ZXJsYXkgZnVuY3Rpb25zICovCisKKy8qIFRoaXMgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHdlIGRvbid0IGtub3cgdGhlIGZvcm1hdCBvZiB0aGUgZmxvYXRpbmcgcG9pbnQKKyAgIG51bWJlci4gIFR5cGljYWxseSwgdGhpcyBpcyB1c2VmdWwgZm9yIG5hdGl2ZSBwb3J0cywgd2hlcmUgdGhlIGFjdHVhbCBmb3JtYXQKKyAgIGlzIGlycmVsZXZhbnQsIHNpbmNlIG5vIGNvbnZlcnNpb25zIHdpbGwgYmUgdGFraW5nIHBsYWNlLiAgKi8KKworY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X3Vua25vd247CisKKy8qIFJlZ2lzdGVycyB3ZSBzaG91bGRuJ3QgdHJ5IHRvIHN0b3JlLiAgKi8KKyNpZiAhZGVmaW5lZCAoQ0FOTk9UX1NUT1JFX1JFR0lTVEVSKQorI2RlZmluZSBDQU5OT1RfU1RPUkVfUkVHSVNURVIocmVnbm8pIDAKKyNlbmRpZgorCitzdGF0aWMgdm9pZCB3cml0ZV9yZWdpc3Rlcl9nZW4gUEFSQU1TICgoaW50LCBjaGFyICopKTsKKworLyogQmFzaWMgYnl0ZS1zd2FwcGluZyByb3V0aW5lcy4gIEdEQiBoYXMgbmVlZGVkIHRoZXNlIGZvciBhIGxvbmcgdGltZS4uLgorICAgQWxsIGV4dHJhY3QgYSB0YXJnZXQtZm9ybWF0IGludGVnZXIgYXQgQUREUiB3aGljaCBpcyBMRU4gYnl0ZXMgbG9uZy4gICovCisKKyNpZiBUQVJHRVRfQ0hBUl9CSVQgIT0gOCB8fCBIT1NUX0NIQVJfQklUICE9IDgKKyAgLyogOCBiaXQgY2hhcmFjdGVycyBhcmUgYSBwcmV0dHkgc2FmZSBhc3N1bXB0aW9uIHRoZXNlIGRheXMsIHNvIHdlCisgICAgIGFzc3VtZSBpdCB0aHJvdWdob3V0IGFsbCB0aGVzZSBzd2FwcGluZyByb3V0aW5lcy4gIElmIHdlIGhhZCB0byBkZWFsIHdpdGgKKyAgICAgOSBiaXQgY2hhcmFjdGVycywgd2Ugd291bGQgbmVlZCB0byBtYWtlIGxlbiBiZSBpbiBiaXRzIGFuZCB3b3VsZCBoYXZlCisgICAgIHRvIHJlLXdyaXRlIHRoZXNlIHJvdXRpbmVzLi4uICAqLworICB5b3UgbG9zZQorI2VuZGlmCisKK0xPTkdFU1QKK2V4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKGFkZHIsIGxlbikKKyAgICAgUFRSIGFkZHI7CisgICAgIGludCBsZW47Cit7CisgIExPTkdFU1QgcmV0dmFsOworICB1bnNpZ25lZCBjaGFyICpwOworICB1bnNpZ25lZCBjaGFyICpzdGFydGFkZHIgPSAodW5zaWduZWQgY2hhciAqKWFkZHI7CisgIHVuc2lnbmVkIGNoYXIgKmVuZGFkZHIgPSBzdGFydGFkZHIgKyBsZW47CisKKyAgaWYgKGxlbiA+IChpbnQpIHNpemVvZiAoTE9OR0VTVCkpCisgICAgZXJyb3IgKCJcCitUaGF0IG9wZXJhdGlvbiBpcyBub3QgYXZhaWxhYmxlIG9uIGludGVnZXJzIG9mIG1vcmUgdGhhbiAlZCBieXRlcy4iLAorCSAgIHNpemVvZiAoTE9OR0VTVCkpOworCisgIC8qIFN0YXJ0IGF0IHRoZSBtb3N0IHNpZ25pZmljYW50IGVuZCBvZiB0aGUgaW50ZWdlciwgYW5kIHdvcmsgdG93YXJkcworICAgICB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQuICAqLworICBpZiAoVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKKyAgICB7CisgICAgICBwID0gc3RhcnRhZGRyOworICAgICAgLyogRG8gdGhlIHNpZ24gZXh0ZW5zaW9uIG9uY2UgYXQgdGhlIHN0YXJ0LiAgKi8KKyAgICAgIHJldHZhbCA9ICgoTE9OR0VTVCkqcCBeIDB4ODApIC0gMHg4MDsKKyAgICAgIGZvciAoKytwOyBwIDwgZW5kYWRkcjsgKytwKQorCXJldHZhbCA9IChyZXR2YWwgPDwgOCkgfCAqcDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwID0gZW5kYWRkciAtIDE7CisgICAgICAvKiBEbyB0aGUgc2lnbiBleHRlbnNpb24gb25jZSBhdCB0aGUgc3RhcnQuICAqLworICAgICAgcmV0dmFsID0gKChMT05HRVNUKSpwIF4gMHg4MCkgLSAweDgwOworICAgICAgZm9yICgtLXA7IHAgPj0gc3RhcnRhZGRyOyAtLXApCisJcmV0dmFsID0gKHJldHZhbCA8PCA4KSB8ICpwOworICAgIH0KKyAgcmV0dXJuIHJldHZhbDsKK30KKworVUxPTkdFU1QKK2V4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYWRkciwgbGVuKQorICAgICBQVFIgYWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgVUxPTkdFU1QgcmV0dmFsOworICB1bnNpZ25lZCBjaGFyICpwOworICB1bnNpZ25lZCBjaGFyICpzdGFydGFkZHIgPSAodW5zaWduZWQgY2hhciAqKWFkZHI7CisgIHVuc2lnbmVkIGNoYXIgKmVuZGFkZHIgPSBzdGFydGFkZHIgKyBsZW47CisKKyAgaWYgKGxlbiA+IChpbnQpIHNpemVvZiAoVUxPTkdFU1QpKQorICAgIGVycm9yICgiXAorVGhhdCBvcGVyYXRpb24gaXMgbm90IGF2YWlsYWJsZSBvbiBpbnRlZ2VycyBvZiBtb3JlIHRoYW4gJWQgYnl0ZXMuIiwKKwkgICBzaXplb2YgKFVMT05HRVNUKSk7CisKKyAgLyogU3RhcnQgYXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgZW5kIG9mIHRoZSBpbnRlZ2VyLCBhbmQgd29yayB0b3dhcmRzCisgICAgIHRoZSBsZWFzdCBzaWduaWZpY2FudC4gICovCisgIHJldHZhbCA9IDA7CisgIGlmIChUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQorICAgIHsKKyAgICAgIGZvciAocCA9IHN0YXJ0YWRkcjsgcCA8IGVuZGFkZHI7ICsrcCkKKwlyZXR2YWwgPSAocmV0dmFsIDw8IDgpIHwgKnA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZm9yIChwID0gZW5kYWRkciAtIDE7IHAgPj0gc3RhcnRhZGRyOyAtLXApCisJcmV0dmFsID0gKHJldHZhbCA8PCA4KSB8ICpwOworICAgIH0KKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogU29tZXRpbWVzIGEgbG9uZyBsb25nIHVuc2lnbmVkIGludGVnZXIgY2FuIGJlIGV4dHJhY3RlZCBhcyBhCisgICBMT05HRVNUIHZhbHVlLiAgVGhpcyBpcyBkb25lIHNvIHRoYXQgd2UgY2FuIHByaW50IHRoZXNlIHZhbHVlcworICAgYmV0dGVyLiAgSWYgdGhpcyBpbnRlZ2VyIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBMT05HRVNULCB0aGlzCisgICBmdW5jdGlvbiByZXR1cm5zIDEgYW5kIHNldHMgKlBWQUwuICBPdGhlcndpc2UgaXQgcmV0dXJucyAwLiAgKi8KKworaW50CitleHRyYWN0X2xvbmdfdW5zaWduZWRfaW50ZWdlciAoYWRkciwgb3JpZ19sZW4sIHB2YWwpCisgICAgIFBUUiBhZGRyOworICAgICBpbnQgb3JpZ19sZW47CisgICAgIExPTkdFU1QgKnB2YWw7Cit7CisgIGNoYXIgKnAsICpmaXJzdF9hZGRyOworICBpbnQgbGVuOworCisgIGxlbiA9IG9yaWdfbGVuOworICBpZiAoVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKKyAgICB7CisgICAgICBmb3IgKHAgPSAoY2hhciAqKSBhZGRyOworCSAgIGxlbiA+IChpbnQpIHNpemVvZiAoTE9OR0VTVCkgJiYgcCA8IChjaGFyICopIGFkZHIgKyBvcmlnX2xlbjsKKwkgICBwKyspCisJeworCSAgaWYgKCpwID09IDApCisJICAgIGxlbi0tOworCSAgZWxzZQorCSAgICBicmVhazsKKwl9CisgICAgICBmaXJzdF9hZGRyID0gcDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmaXJzdF9hZGRyID0gKGNoYXIgKikgYWRkcjsKKyAgICAgIGZvciAocCA9IChjaGFyICopIGFkZHIgKyBvcmlnX2xlbiAtIDE7CisJICAgbGVuID4gKGludCkgc2l6ZW9mIChMT05HRVNUKSAmJiBwID49IChjaGFyICopIGFkZHI7CisJICAgcC0tKQorCXsKKwkgIGlmICgqcCA9PSAwKQorCSAgICBsZW4tLTsKKwkgIGVsc2UKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICBpZiAobGVuIDw9IChpbnQpIHNpemVvZiAoTE9OR0VTVCkpCisgICAgeworICAgICAgKnB2YWwgPSAoTE9OR0VTVCkgZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChmaXJzdF9hZGRyLAorCQkJCQkJICBzaXplb2YgKExPTkdFU1QpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworQ09SRV9BRERSCitleHRyYWN0X2FkZHJlc3MgKGFkZHIsIGxlbikKKyAgICAgUFRSIGFkZHI7CisgICAgIGludCBsZW47Cit7CisgIC8qIEFzc3VtZSBhIENPUkVfQUREUiBjYW4gZml0IGluIGEgTE9OR0VTVCAoZm9yIG5vdykuICBOb3Qgc3VyZQorICAgICB3aGV0aGVyIHdlIHdhbnQgdGhpcyB0byBiZSB0cnVlIGV2ZW50dWFsbHkuICAqLworICByZXR1cm4gKENPUkVfQUREUilleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGFkZHIsIGxlbik7Cit9CisKK3ZvaWQKK3N0b3JlX3NpZ25lZF9pbnRlZ2VyIChhZGRyLCBsZW4sIHZhbCkKKyAgICAgUFRSIGFkZHI7CisgICAgIGludCBsZW47CisgICAgIExPTkdFU1QgdmFsOworeworICB1bnNpZ25lZCBjaGFyICpwOworICB1bnNpZ25lZCBjaGFyICpzdGFydGFkZHIgPSAodW5zaWduZWQgY2hhciAqKWFkZHI7CisgIHVuc2lnbmVkIGNoYXIgKmVuZGFkZHIgPSBzdGFydGFkZHIgKyBsZW47CisKKyAgLyogU3RhcnQgYXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IGVuZCBvZiB0aGUgaW50ZWdlciwgYW5kIHdvcmsgdG93YXJkcworICAgICB0aGUgbW9zdCBzaWduaWZpY2FudC4gICovCisgIGlmIChUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQorICAgIHsKKyAgICAgIGZvciAocCA9IGVuZGFkZHIgLSAxOyBwID49IHN0YXJ0YWRkcjsgLS1wKQorCXsKKwkgICpwID0gdmFsICYgMHhmZjsKKwkgIHZhbCA+Pj0gODsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZm9yIChwID0gc3RhcnRhZGRyOyBwIDwgZW5kYWRkcjsgKytwKQorCXsKKwkgICpwID0gdmFsICYgMHhmZjsKKwkgIHZhbCA+Pj0gODsKKwl9CisgICAgfQorfQorCit2b2lkCitzdG9yZV91bnNpZ25lZF9pbnRlZ2VyIChhZGRyLCBsZW4sIHZhbCkKKyAgICAgUFRSIGFkZHI7CisgICAgIGludCBsZW47CisgICAgIFVMT05HRVNUIHZhbDsKK3sKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgdW5zaWduZWQgY2hhciAqc3RhcnRhZGRyID0gKHVuc2lnbmVkIGNoYXIgKilhZGRyOworICB1bnNpZ25lZCBjaGFyICplbmRhZGRyID0gc3RhcnRhZGRyICsgbGVuOworCisgIC8qIFN0YXJ0IGF0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBlbmQgb2YgdGhlIGludGVnZXIsIGFuZCB3b3JrIHRvd2FyZHMKKyAgICAgdGhlIG1vc3Qgc2lnbmlmaWNhbnQuICAqLworICBpZiAoVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKKyAgICB7CisgICAgICBmb3IgKHAgPSBlbmRhZGRyIC0gMTsgcCA+PSBzdGFydGFkZHI7IC0tcCkKKwl7CisJICAqcCA9IHZhbCAmIDB4ZmY7CisJICB2YWwgPj49IDg7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAocCA9IHN0YXJ0YWRkcjsgcCA8IGVuZGFkZHI7ICsrcCkKKwl7CisJICAqcCA9IHZhbCAmIDB4ZmY7CisJICB2YWwgPj49IDg7CisJfQorICAgIH0KK30KKworLyogU3RvcmUgdGhlIGxpdGVyYWwgYWRkcmVzcyAidmFsIiBpbnRvCisgICBnZGItbG9jYWwgbWVtb3J5IHBvaW50ZWQgdG8gYnkgImFkZHIiCisgICBmb3IgImxlbiIgYnl0ZXMuICovCit2b2lkCitzdG9yZV9hZGRyZXNzIChhZGRyLCBsZW4sIHZhbCkKKyAgICAgUFRSIGFkZHI7CisgICAgIGludCBsZW47CisgICAgIExPTkdFU1QgdmFsOworeworICBpZiggVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTgorICAgICAgJiYgIGxlbiAhPSBzaXplb2YoIExPTkdFU1QgKSkgeworICAgIC8qIE9uIGJpZy1lbmRpYW4gbWFjaGluZXMgKGUuZy4sIEhQUEEgMi4wLCBuYXJyb3cgbW9kZSkKKyAgICAgKiBqdXN0IGxldHRpbmcgdGhpcyBmYWxsIHRocm91Z2ggdG8gdGhlIGNhbGwgYmVsb3cgd2lsbAorICAgICAqIGxlYWQgdG8gdGhlIHdyb25nIGJpdHMgYmVpbmcgc3RvcmVkLgorICAgICAqCisgICAgICogT25seSB0aGUgc2ltcGxlc3QgY2FzZSBpcyBmaXhlZCBoZXJlLCB0aGUgb3RoZXJzIGp1c3QKKyAgICAgKiBnZXQgdGhlIG9sZCBiZWhhdmlvci4KKyAgICAgKi8KKyAgICBpZiggKGxlbiA9PSBzaXplb2YoIENPUkVfQUREUiApKQorCSYmICAoc2l6ZW9mKCBMT05HRVNUICkgPT0gMiAqIHNpemVvZiggQ09SRV9BRERSICkpKSB7CisgICAgICAvKiBXYXRjaCBvdXQhICBUaGUgaGlnaCBiaXRzIGFyZSBnYXJiYWdlISAqLworICAgICAgQ09SRV9BRERSIGNvZXJjZVsyXTsKKyAgICAgICooTE9OR0VTVCopJmNvZXJjZSA9IHZhbDsKKworICAgICAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoYWRkciwgbGVuLCBjb2VyY2VbMV0gKTsgLyogQklHX0VORElBTiBjb2RlISAqLworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBzdG9yZV91bnNpZ25lZF9pbnRlZ2VyIChhZGRyLCBsZW4sIHZhbCk7Cit9CisMCisvKiBTd2FwIExFTiBieXRlcyBhdCBCVUZGRVIgYmV0d2VlbiB0YXJnZXQgYW5kIGhvc3QgYnl0ZS1vcmRlci4gICovCisjZGVmaW5lIFNXQVBfRkxPQVRJTkcoYnVmZmVyLGxlbikgXAorICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKFRBUkdFVF9CWVRFX09SREVSICE9IEhPU1RfQllURV9PUkRFUikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNoYXIgdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNoYXIgKnAgPSAoY2hhciAqKShidWZmZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNoYXIgKnEgPSAoKGNoYXIgKikoYnVmZmVyKSkgKyBsZW4gLSAxOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGZvciAoOyBwIDwgcTsgcCsrLCBxLS0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICB0bXAgPSAqcTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAqcSA9ICpwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAqcCA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB3aGlsZSAoMCkKKworLyogRXh0cmFjdCBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBmcm9tIGEgdGFyZ2V0LW9yZGVyIGJ5dGUtc3RyZWFtIGF0IEFERFIuCisgICBSZXR1cm5zIHRoZSB2YWx1ZSBhcyB0eXBlIERPVUJMRVNULgorCisgICBJZiB0aGUgaG9zdCBhbmQgdGFyZ2V0IGZvcm1hdHMgYWdyZWUsIHdlIGp1c3QgY29weSB0aGUgcmF3IGRhdGEgaW50byB0aGUKKyAgIGFwcHJvcHJpYXRlIHR5cGUgb2YgdmFyaWFibGUgYW5kIHJldHVybiwgbGV0dGluZyB0aGUgaG9zdCBpbmNyZWFzZSBwcmVjaXNpb24KKyAgIGFzIG5lY2Vzc2FyeS4gIE90aGVyd2lzZSwgd2UgY2FsbCB0aGUgY29udmVyc2lvbiByb3V0aW5lIGFuZCBsZXQgaXQgZG8gdGhlCisgICBkaXJ0eSB3b3JrLiAgKi8KKworRE9VQkxFU1QKK2V4dHJhY3RfZmxvYXRpbmcgKGFkZHIsIGxlbikKKyAgICAgUFRSIGFkZHI7CisgICAgIGludCBsZW47Cit7CisgIERPVUJMRVNUIGRyZXR2YWw7CisKKyAgaWYgKGxlbiA9PSBzaXplb2YgKGZsb2F0KSkKKyAgICB7CisgICAgICBpZiAoSE9TVF9GTE9BVF9GT1JNQVQgPT0gVEFSR0VUX0ZMT0FUX0ZPUk1BVCkKKwl7CisJICBmbG9hdCByZXR2YWw7CisKKwkgIG1lbWNweSAoJnJldHZhbCwgYWRkciwgc2l6ZW9mIChyZXR2YWwpKTsKKwkgIHJldHVybiByZXR2YWw7CisJfQorICAgICAgZWxzZQorCWZsb2F0Zm9ybWF0X3RvX2RvdWJsZXN0IChUQVJHRVRfRkxPQVRfRk9STUFULCBhZGRyLCAmZHJldHZhbCk7CisgICAgfQorICBlbHNlIGlmIChsZW4gPT0gc2l6ZW9mIChkb3VibGUpKQorICAgIHsKKyAgICAgIGlmIChIT1NUX0RPVUJMRV9GT1JNQVQgPT0gVEFSR0VUX0RPVUJMRV9GT1JNQVQpCisJeworCSAgZG91YmxlIHJldHZhbDsKKworCSAgbWVtY3B5ICgmcmV0dmFsLCBhZGRyLCBzaXplb2YgKHJldHZhbCkpOworCSAgcmV0dXJuIHJldHZhbDsKKwl9CisgICAgICBlbHNlCisJZmxvYXRmb3JtYXRfdG9fZG91Ymxlc3QgKFRBUkdFVF9ET1VCTEVfRk9STUFULCBhZGRyLCAmZHJldHZhbCk7CisgICAgfQorICBlbHNlIGlmIChsZW4gPT0gc2l6ZW9mIChET1VCTEVTVCkpCisgICAgeworICAgICAgaWYgKEhPU1RfTE9OR19ET1VCTEVfRk9STUFUID09IFRBUkdFVF9MT05HX0RPVUJMRV9GT1JNQVQpCisJeworCSAgRE9VQkxFU1QgcmV0dmFsOworCisJICBtZW1jcHkgKCZyZXR2YWwsIGFkZHIsIHNpemVvZiAocmV0dmFsKSk7CisJICByZXR1cm4gcmV0dmFsOworCX0KKyAgICAgIGVsc2UKKwlmbG9hdGZvcm1hdF90b19kb3VibGVzdCAoVEFSR0VUX0xPTkdfRE9VQkxFX0ZPUk1BVCwgYWRkciwgJmRyZXR2YWwpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGVycm9yICgiQ2FuJ3QgZGVhbCB3aXRoIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIG9mICVkIGJ5dGVzLiIsIGxlbik7CisgICAgfQorCisgIHJldHVybiBkcmV0dmFsOworfQorCit2b2lkCitzdG9yZV9mbG9hdGluZyAoYWRkciwgbGVuLCB2YWwpCisgICAgIFBUUiBhZGRyOworICAgICBpbnQgbGVuOworICAgICBET1VCTEVTVCB2YWw7Cit7CisgIGlmIChsZW4gPT0gc2l6ZW9mIChmbG9hdCkpCisgICAgeworICAgICAgaWYgKEhPU1RfRkxPQVRfRk9STUFUID09IFRBUkdFVF9GTE9BVF9GT1JNQVQpCisJeworCSAgZmxvYXQgZmxvYXR2YWwgPSB2YWw7CisKKwkgIG1lbWNweSAoYWRkciwgJmZsb2F0dmFsLCBzaXplb2YgKGZsb2F0dmFsKSk7CisJfQorICAgICAgZWxzZQorCWZsb2F0Zm9ybWF0X2Zyb21fZG91Ymxlc3QgKFRBUkdFVF9GTE9BVF9GT1JNQVQsICZ2YWwsIGFkZHIpOworICAgIH0KKyAgZWxzZSBpZiAobGVuID09IHNpemVvZiAoZG91YmxlKSkKKyAgICB7CisgICAgICBpZiAoSE9TVF9ET1VCTEVfRk9STUFUID09IFRBUkdFVF9ET1VCTEVfRk9STUFUKQorCXsKKwkgIGRvdWJsZSBkb3VibGV2YWwgPSB2YWw7CisKKwkgIG1lbWNweSAoYWRkciwgJmRvdWJsZXZhbCwgc2l6ZW9mIChkb3VibGV2YWwpKTsKKwl9CisgICAgICBlbHNlCisJZmxvYXRmb3JtYXRfZnJvbV9kb3VibGVzdCAoVEFSR0VUX0RPVUJMRV9GT1JNQVQsICZ2YWwsIGFkZHIpOworICAgIH0KKyAgZWxzZSBpZiAobGVuID09IHNpemVvZiAoRE9VQkxFU1QpKQorICAgIHsKKyAgICAgIGlmIChIT1NUX0xPTkdfRE9VQkxFX0ZPUk1BVCA9PSBUQVJHRVRfTE9OR19ET1VCTEVfRk9STUFUKQorCW1lbWNweSAoYWRkciwgJnZhbCwgc2l6ZW9mICh2YWwpKTsKKyAgICAgIGVsc2UKKwlmbG9hdGZvcm1hdF9mcm9tX2RvdWJsZXN0IChUQVJHRVRfTE9OR19ET1VCTEVfRk9STUFULCAmdmFsLCBhZGRyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBlcnJvciAoIkNhbid0IGRlYWwgd2l0aCBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBvZiAlZCBieXRlcy4iLCBsZW4pOworICAgIH0KK30KKwwKKyNpZiAhZGVmaW5lZCAoR0VUX1NBVkVEX1JFR0lTVEVSKQorCisvKiBSZXR1cm4gdGhlIGFkZHJlc3MgaW4gd2hpY2ggZnJhbWUgRlJBTUUncyB2YWx1ZSBvZiByZWdpc3RlciBSRUdOVU0KKyAgIGhhcyBiZWVuIHNhdmVkIGluIG1lbW9yeS4gIE9yIHJldHVybiB6ZXJvIGlmIGl0IGhhcyBub3QgYmVlbiBzYXZlZC4KKyAgIElmIFJFR05VTSBzcGVjaWZpZXMgdGhlIFNQLCB0aGUgdmFsdWUgd2UgcmV0dXJuIGlzIGFjdHVhbGx5CisgICB0aGUgU1AgdmFsdWUsIG5vdCBhbiBhZGRyZXNzIHdoZXJlIGl0IHdhcyBzYXZlZC4gICovCisKK0NPUkVfQUREUgorZmluZF9zYXZlZF9yZWdpc3RlciAoZnJhbWUsIHJlZ251bSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworICAgICBpbnQgcmVnbnVtOworeworICByZWdpc3RlciBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWUxID0gTlVMTDsKKyAgcmVnaXN0ZXIgQ09SRV9BRERSIGFkZHIgPSAwOworCisgIGlmIChmcmFtZSA9PSBOVUxMKQkJLyogTm8gcmVncyBzYXZlZCBpZiB3YW50IGN1cnJlbnQgZnJhbWUgKi8KKyAgICByZXR1cm4gMDsKKworI2lmZGVmIEhBVkVfUkVHSVNURVJfV0lORE9XUworICAvKiBXZSBhc3N1bWUgdGhhdCBhIHJlZ2lzdGVyIGluIGEgcmVnaXN0ZXIgd2luZG93IHdpbGwgb25seSBiZSBzYXZlZAorICAgICBpbiBvbmUgcGxhY2UgKHNpbmNlIHRoZSBuYW1lIGNoYW5nZXMgYW5kL29yIGRpc2FwcGVhcnMgYXMgeW91IGdvCisgICAgIHRvd2FyZHMgaW5uZXIgZnJhbWVzKSwgc28gd2Ugb25seSBjYWxsIGdldF9mcmFtZV9zYXZlZF9yZWdzIG9uCisgICAgIHRoZSBjdXJyZW50IGZyYW1lLiAgVGhpcyBpcyBkaXJlY3RseSBpbiBjb250cmFkaWN0aW9uIHRvIHRoZQorICAgICB1c2FnZSBiZWxvdywgd2hpY2ggYXNzdW1lcyB0aGF0IHJlZ2lzdGVycyB1c2VkIGluIGEgZnJhbWUgbXVzdCBiZQorICAgICBzYXZlZCBpbiBhIGxvd2VyIChtb3JlIGludGVyaW9yKSBmcmFtZS4gIFRoaXMgY2hhbmdlIGlzIGEgcmVzdWx0CisgICAgIG9mIHdvcmtpbmcgb24gYSByZWdpc3RlciB3aW5kb3cgbWFjaGluZTsgZ2V0X2ZyYW1lX3NhdmVkX3JlZ3MKKyAgICAgYWx3YXlzIHJldHVybnMgdGhlIHJlZ2lzdGVycyBzYXZlZCB3aXRoaW4gYSBmcmFtZSwgd2l0aGluIHRoZQorICAgICBjb250ZXh0IChyZWdpc3RlciBuYW1lc3BhY2UpIG9mIHRoYXQgZnJhbWUuICovCisKKyAgLyogSG93ZXZlciwgbm90ZSB0aGF0IHdlIGRvbid0IHdhbnQgdGhpcyB0byByZXR1cm4gYW55dGhpbmcgaWYKKyAgICAgbm90aGluZyBpcyBzYXZlZCAoaWYgdGhlcmUncyBhIGZyYW1lIGluc2lkZSBvZiB0aGlzIG9uZSkuICBBbHNvLAorICAgICBjYWxsZXJzIHRvIHRoaXMgcm91dGluZSBhc2tpbmcgZm9yIHRoZSBzdGFjayBwb2ludGVyIHdhbnQgdGhlCisgICAgIHN0YWNrIHBvaW50ZXIgc2F2ZWQgZm9yICp0aGlzKiBmcmFtZTsgdGhpcyBpcyByZXR1cm5lZCBmcm9tIHRoZQorICAgICBuZXh0IGZyYW1lLiAgKi8KKyAgICAgCisgIGlmIChSRUdJU1RFUl9JTl9XSU5ET1dfUChyZWdudW0pKQorICAgIHsKKyAgICAgIGZyYW1lMSA9IGdldF9uZXh0X2ZyYW1lIChmcmFtZSk7CisgICAgICBpZiAoIWZyYW1lMSkgcmV0dXJuIDA7CS8qIFJlZ2lzdGVycyBvZiB0aGlzIGZyYW1lIGFyZSBhY3RpdmUuICAqLworICAgICAgCisgICAgICAvKiBHZXQgdGhlIFNQIGZyb20gdGhlIG5leHQgZnJhbWUgaW47IGl0IHdpbGwgYmUgdGhpcworCSBjdXJyZW50IGZyYW1lLiAgKi8KKyAgICAgIGlmIChyZWdudW0gIT0gU1BfUkVHTlVNKQorCWZyYW1lMSA9IGZyYW1lOwkKKwkgIAorICAgICAgRlJBTUVfSU5JVF9TQVZFRF9SRUdTIChmcmFtZTEpOworICAgICAgcmV0dXJuIGZyYW1lMS0+c2F2ZWRfcmVnc1tyZWdudW1dOwkvKiAuLi4gd2hpY2ggbWlnaHQgYmUgemVybyAqLworICAgIH0KKyNlbmRpZiAvKiBIQVZFX1JFR0lTVEVSX1dJTkRPV1MgKi8KKworICAvKiBOb3RlIHRoYXQgdGhpcyBuZXh0IHJvdXRpbmUgYXNzdW1lcyB0aGF0IHJlZ2lzdGVycyB1c2VkIGluCisgICAgIGZyYW1lIHggd2lsbCBiZSBzYXZlZCBvbmx5IGluIHRoZSBmcmFtZSB0aGF0IHggY2FsbHMgYW5kCisgICAgIGZyYW1lcyBpbnRlcmlvciB0byBpdC4gIFRoaXMgaXMgbm90IHRydWUgb24gdGhlIHNwYXJjLCBidXQgdGhlCisgICAgIGFib3ZlIG1hY3JvIHRha2VzIGNhcmUgb2YgaXQsIHNvIHdlIHNob3VsZCBiZSBhbGwgcmlnaHQuICovCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIFFVSVQ7CisgICAgICBmcmFtZTEgPSBnZXRfcHJldl9mcmFtZSAoZnJhbWUxKTsKKyAgICAgIGlmIChmcmFtZTEgPT0gMCB8fCBmcmFtZTEgPT0gZnJhbWUpCisJYnJlYWs7CisgICAgICBGUkFNRV9JTklUX1NBVkVEX1JFR1MgKGZyYW1lMSk7CisgICAgICBpZiAoZnJhbWUxLT5zYXZlZF9yZWdzW3JlZ251bV0pCisJYWRkciA9IGZyYW1lMS0+c2F2ZWRfcmVnc1tyZWdudW1dOworICAgIH0KKworICByZXR1cm4gYWRkcjsKK30KKworLyogRmluZCByZWdpc3RlciBudW1iZXIgUkVHTlVNIHJlbGF0aXZlIHRvIEZSQU1FIGFuZCBwdXQgaXRzIChyYXcsCisgICB0YXJnZXQgZm9ybWF0KSBjb250ZW50cyBpbiAqUkFXX0JVRkZFUi4gIFNldCAqT1BUSU1JWkVEIGlmIHRoZQorICAgdmFyaWFibGUgd2FzIG9wdGltaXplZCBvdXQgKGFuZCB0aHVzIGNhbid0IGJlIGZldGNoZWQpLiAgU2V0ICpMVkFMCisgICB0byBsdmFsX21lbW9yeSwgbHZhbF9yZWdpc3Rlciwgb3Igbm90X2x2YWwsIGRlcGVuZGluZyBvbiB3aGV0aGVyCisgICB0aGUgdmFsdWUgd2FzIGZldGNoZWQgZnJvbSBtZW1vcnksIGZyb20gYSByZWdpc3Rlciwgb3IgaW4gYSBzdHJhbmdlCisgICBhbmQgbm9uLW1vZGlmaWFibGUgd2F5IChlLmcuIGEgZnJhbWUgcG9pbnRlciB3aGljaCB3YXMgY2FsY3VsYXRlZAorICAgcmF0aGVyIHRoYW4gZmV0Y2hlZCkuICBTZXQgKkFERFJQIHRvIHRoZSBhZGRyZXNzLCBlaXRoZXIgaW4gbWVtb3J5CisgICBvbiBhcyBhIFJFR0lTVEVSX0JZVEUgb2Zmc2V0IGludG8gdGhlIHJlZ2lzdGVycyBhcnJheS4KKworICAgTm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gbmV2ZXIgc2V0cyAqTFZBTCB0byBub3RfbHZhbC4gIEJ1dAorICAgaXQgY2FuIGJlIHJlcGxhY2VkIGJ5IGRlZmluaW5nIEdFVF9TQVZFRF9SRUdJU1RFUiBhbmQgc3VwcGx5aW5nCisgICB5b3VyIG93bi4KKworICAgVGhlIGFyZ3VtZW50IFJBV19CVUZGRVIgbXVzdCBwb2ludCB0byBhbGlnbmVkIG1lbW9yeS4gICovCisKK3ZvaWQKK2dldF9zYXZlZF9yZWdpc3RlciAocmF3X2J1ZmZlciwgb3B0aW1pemVkLCBhZGRycCwgZnJhbWUsIHJlZ251bSwgbHZhbCkKKyAgICAgY2hhciAqcmF3X2J1ZmZlcjsKKyAgICAgaW50ICpvcHRpbWl6ZWQ7CisgICAgIENPUkVfQUREUiAqYWRkcnA7CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKKyAgICAgaW50IHJlZ251bTsKKyAgICAgZW51bSBsdmFsX3R5cGUgKmx2YWw7Cit7CisgIENPUkVfQUREUiBhZGRyOworCisgIGlmICghdGFyZ2V0X2hhc19yZWdpc3RlcnMpCisgICAgZXJyb3IgKCJObyByZWdpc3RlcnMuIik7CisKKyAgLyogTm9ybWFsIHN5c3RlbXMgZG9uJ3Qgb3B0aW1pemUgb3V0IHRoaW5ncyB3aXRoIHJlZ2lzdGVyIG51bWJlcnMuICAqLworICBpZiAob3B0aW1pemVkICE9IE5VTEwpCisgICAgKm9wdGltaXplZCA9IDA7CisgIGFkZHIgPSBmaW5kX3NhdmVkX3JlZ2lzdGVyIChmcmFtZSwgcmVnbnVtKTsKKyAgaWYgKGFkZHIgIT0gMCkKKyAgICB7CisgICAgICBpZiAobHZhbCAhPSBOVUxMKQorCSpsdmFsID0gbHZhbF9tZW1vcnk7CisgICAgICBpZiAocmVnbnVtID09IFNQX1JFR05VTSkKKwl7CisJICBpZiAocmF3X2J1ZmZlciAhPSBOVUxMKQorCSAgICB7CisJICAgICAgLyogUHV0IGl0IGJhY2sgaW4gdGFyZ2V0IGZvcm1hdC4gICovCisJICAgICAgc3RvcmVfYWRkcmVzcyAocmF3X2J1ZmZlciwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSksIChMT05HRVNUKWFkZHIpOworCSAgICB9CisJICBpZiAoYWRkcnAgIT0gTlVMTCkKKwkgICAgKmFkZHJwID0gMDsKKwkgIHJldHVybjsKKwl9CisgICAgICBpZiAocmF3X2J1ZmZlciAhPSBOVUxMKQorCXJlYWRfbWVtb3J5IChhZGRyLCByYXdfYnVmZmVyLCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbnVtKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKGx2YWwgIT0gTlVMTCkKKwkqbHZhbCA9IGx2YWxfcmVnaXN0ZXI7CisgICAgICBhZGRyID0gUkVHSVNURVJfQllURSAocmVnbnVtKTsKKyAgICAgIGlmIChyYXdfYnVmZmVyICE9IE5VTEwpCisJcmVhZF9yZWdpc3Rlcl9nZW4gKHJlZ251bSwgcmF3X2J1ZmZlcik7CisgICAgfQorICBpZiAoYWRkcnAgIT0gTlVMTCkKKyAgICAqYWRkcnAgPSBhZGRyOworfQorI2VuZGlmIC8qIEdFVF9TQVZFRF9SRUdJU1RFUi4gICovCisKKy8qIENvcHkgdGhlIGJ5dGVzIG9mIHJlZ2lzdGVyIFJFR05VTSwgcmVsYXRpdmUgdG8gdGhlIGlucHV0IHN0YWNrIGZyYW1lLAorICAgaW50byBvdXIgbWVtb3J5IGF0IE1ZQUREUiwgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuCisgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpcyBSRUdJU1RFUl9SQVdfU0laRSAoUkVHTlVNKS4KKworICAgUmV0dXJucyAxIGlmIGNvdWxkIG5vdCBiZSByZWFkLCAwIGlmIGNvdWxkLiAgKi8KKworaW50CityZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlc19mb3JfZnJhbWUgKHJlZ251bSwgbXlhZGRyLCBmcmFtZSkKKyAgICAgaW50IHJlZ251bTsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIGludCBvcHRpbTsKKyAgaWYgKHJlZ251bSA9PSBGUF9SRUdOVU0gJiYgZnJhbWUpCisgICAgeworICAgICAgLyogUHV0IGl0IGJhY2sgaW4gdGFyZ2V0IGZvcm1hdC4gKi8KKyAgICAgIHN0b3JlX2FkZHJlc3MgKG15YWRkciwgUkVHSVNURVJfUkFXX1NJWkUoRlBfUkVHTlVNKSwKKwkJICAgICAoTE9OR0VTVClGUkFNRV9GUChmcmFtZSkpOworCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgZ2V0X3NhdmVkX3JlZ2lzdGVyIChteWFkZHIsICZvcHRpbSwgKENPUkVfQUREUiAqKSBOVUxMLCBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICByZWdudW0sIChlbnVtIGx2YWxfdHlwZSAqKU5VTEwpOworCisgIGlmIChyZWdpc3Rlcl92YWxpZCBbcmVnbnVtXSA8IDApCisgICAgcmV0dXJuIDE7CS8qIHJlZ2lzdGVyIHZhbHVlIG5vdCBhdmFpbGFibGUgKi8KKworICByZXR1cm4gb3B0aW07Cit9CisKKy8qIENvcHkgdGhlIGJ5dGVzIG9mIHJlZ2lzdGVyIFJFR05VTSwgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgc3RhY2sgZnJhbWUsCisgICBpbnRvIG91ciBtZW1vcnkgYXQgTVlBRERSLCBpbiB0YXJnZXQgYnl0ZSBvcmRlci4KKyAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGlzIFJFR0lTVEVSX1JBV19TSVpFIChSRUdOVU0pLgorCisgICBSZXR1cm5zIDEgaWYgY291bGQgbm90IGJlIHJlYWQsIDAgaWYgY291bGQuICAqLworCitpbnQKK3JlYWRfcmVsYXRpdmVfcmVnaXN0ZXJfcmF3X2J5dGVzIChyZWdudW0sIG15YWRkcikKKyAgICAgaW50IHJlZ251bTsKKyAgICAgY2hhciAqbXlhZGRyOworeworICByZXR1cm4gcmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXNfZm9yX2ZyYW1lIChyZWdudW0sIG15YWRkciwgCisJCQkJCQkgICAgIHNlbGVjdGVkX2ZyYW1lKTsKK30KKworLyogUmV0dXJuIGEgYHZhbHVlJyB3aXRoIHRoZSBjb250ZW50cyBvZiByZWdpc3RlciBSRUdOVU0KKyAgIGluIGl0cyB2aXJ0dWFsIGZvcm1hdCwgd2l0aCB0aGUgdHlwZSBzcGVjaWZpZWQgYnkKKyAgIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRS4gIAorCisgICBOT1RFOiByZXR1cm5zIE5VTEwgaWYgcmVnaXN0ZXIgdmFsdWUgaXMgbm90IGF2YWlsYWJsZS4KKyAgIENhbGxlciB3aWxsIGNoZWNrIHJldHVybiB2YWx1ZSBvciBkaWUhICAqLworCit2YWx1ZV9wdHIKK3ZhbHVlX29mX3JlZ2lzdGVyIChyZWdudW0pCisgICAgIGludCByZWdudW07Cit7CisgIENPUkVfQUREUiBhZGRyOworICBpbnQgb3B0aW07CisgIHJlZ2lzdGVyIHZhbHVlX3B0ciByZWdfdmFsOworICBjaGFyIHJhd19idWZmZXJbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKyAgZW51bSBsdmFsX3R5cGUgbHZhbDsKKworICBnZXRfc2F2ZWRfcmVnaXN0ZXIgKHJhd19idWZmZXIsICZvcHRpbSwgJmFkZHIsCisJCSAgICAgIHNlbGVjdGVkX2ZyYW1lLCByZWdudW0sICZsdmFsKTsKKworICBpZiAocmVnaXN0ZXJfdmFsaWRbcmVnbnVtXSA8IDApCisgICAgcmV0dXJuIE5VTEw7CS8qIHJlZ2lzdGVyIHZhbHVlIG5vdCBhdmFpbGFibGUgKi8KKworICByZWdfdmFsID0gYWxsb2NhdGVfdmFsdWUgKFJFR0lTVEVSX1ZJUlRVQUxfVFlQRSAocmVnbnVtKSk7CisKKyAgLyogQ29udmVydCByYXcgZGF0YSB0byB2aXJ0dWFsIGZvcm1hdCBpZiBuZWNlc3NhcnkuICAqLworCisjaWZkZWYgUkVHSVNURVJfQ09OVkVSVElCTEUKKyAgaWYgKFJFR0lTVEVSX0NPTlZFUlRJQkxFIChyZWdudW0pKQorICAgIHsKKyAgICAgIFJFR0lTVEVSX0NPTlZFUlRfVE9fVklSVFVBTCAocmVnbnVtLCBSRUdJU1RFUl9WSVJUVUFMX1RZUEUgKHJlZ251bSksCisJCQkJICAgcmF3X2J1ZmZlciwgVkFMVUVfQ09OVEVOVFNfUkFXIChyZWdfdmFsKSk7CisgICAgfQorICBlbHNlCisjZW5kaWYKKyAgICBpZiAoUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSkgPT0gUkVHSVNURVJfVklSVFVBTF9TSVpFIChyZWdudW0pKQorICAgICAgbWVtY3B5IChWQUxVRV9DT05URU5UU19SQVcgKHJlZ192YWwpLCByYXdfYnVmZmVyLAorCSAgICAgIFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pKTsKKyAgICBlbHNlCisgICAgICBmYXRhbCAoIlJlZ2lzdGVyIFwiJXNcIiAoJWQpIGhhcyBjb25mbGljdGluZyByYXcgKCVkKSBhbmQgdmlydHVhbCAoJWQpIHNpemUiLAorCSAgICAgUkVHSVNURVJfTkFNRSAocmVnbnVtKSwgcmVnbnVtLAorCSAgICAgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSksIFJFR0lTVEVSX1ZJUlRVQUxfU0laRSAocmVnbnVtKSk7CisgIFZBTFVFX0xWQUwgKHJlZ192YWwpID0gbHZhbDsKKyAgVkFMVUVfQUREUkVTUyAocmVnX3ZhbCkgPSBhZGRyOworICBWQUxVRV9SRUdOTyAocmVnX3ZhbCkgPSByZWdudW07CisgIFZBTFVFX09QVElNSVpFRF9PVVQgKHJlZ192YWwpID0gb3B0aW07CisgIHJldHVybiByZWdfdmFsOworfQorDAorLyogTG93IGxldmVsIGV4YW1pbmluZyBhbmQgZGVwb3NpdGluZyBvZiByZWdpc3RlcnMuCisKKyAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZworICAgc3VyZSB0aGF0IHRoZSBpbmZlcmlvciBpcyBzdG9wcGVkIGJlZm9yZSBjYWxsaW5nIHRoZSBmZXRjaGluZyByb3V0aW5lcywKKyAgIG9yIGl0IHdpbGwgZ2V0IGdhcmJhZ2UuICAoYSBjaGFuZ2UgZnJvbSBHREIgdmVyc2lvbiAzLCBpbiB3aGljaAorICAgdGhlIGNhbGxlciBnb3QgdGhlIHZhbHVlIGZyb20gdGhlIGxhc3Qgc3RvcCkuICAqLworCisvKiBDb250ZW50cyBvZiB0aGUgcmVnaXN0ZXJzIGluIHRhcmdldCBieXRlIG9yZGVyLgorICAgV2UgYWxsb2NhdGUgc29tZSBleHRyYSBzbG9wIHNpbmNlIHdlIGRvIGEgbG90IG9mIG1lbWNweSdzIGFyb3VuZCAKKyAgIGByZWdpc3RlcnMnLCBhbmQgZmFpbGluZy1zb2Z0IGlzIGJldHRlciB0aGFuIGZhaWxpbmcgaGFyZC4gICovCisKK2NoYXIgcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEVTICsgLyogU0xPUCAqLyAyNTZdOworCisvKiBOb256ZXJvIGlmIHRoYXQgcmVnaXN0ZXIgaGFzIGJlZW4gZmV0Y2hlZCwKKyAgIC0xIGlmIHJlZ2lzdGVyIHZhbHVlIG5vdCBhdmFpbGFibGUuICovCitTSUdORUQgY2hhciByZWdpc3Rlcl92YWxpZFtOVU1fUkVHU107CisKKy8qIFRoZSB0aHJlYWQvcHJvY2VzcyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mIHJlZ2lzdGVycy4gIEZvciBub3csCisgICAtMSBpcyBzcGVjaWFsLCBhbmQgbWVhbnMgYG5vIGN1cnJlbnQgcHJvY2VzcycuICAqLworaW50IHJlZ2lzdGVyc19waWQgPSAtMTsKKworLyogSW5kaWNhdGUgdGhhdCByZWdpc3RlcnMgbWF5IGhhdmUgY2hhbmdlZCwgc28gaW52YWxpZGF0ZSB0aGUgY2FjaGUuICAqLworCit2b2lkCityZWdpc3RlcnNfY2hhbmdlZCAoKQoreworICBpbnQgaTsKKyAgaW50IG51bXJlZ3MgPSBBUkNIX05VTV9SRUdTOworCisgIHJlZ2lzdGVyc19waWQgPSAtMTsKKworICAvKiBGb3JjZSBjbGVhbnVwIG9mIGFueSBhbGxvY2EgYXJlYXMgaWYgdXNpbmcgQyBhbGxvY2EgaW5zdGVhZCBvZgorICAgICBhIGJ1aWx0aW4gYWxsb2NhLiAgVGhpcyBwYXJ0aWN1bGFyIGNhbGwgaXMgdXNlZCB0byBjbGVhbiB1cAorICAgICBhcmVhcyBhbGxvY2F0ZWQgYnkgbG93IGxldmVsIHRhcmdldCBjb2RlIHdoaWNoIG1heSBidWlsZCB1cAorICAgICBkdXJpbmcgbGVuZ3RoeSBpbnRlcmFjdGlvbnMgYmV0d2VlbiBnZGIgYW5kIHRoZSB0YXJnZXQgYmVmb3JlCisgICAgIGdkYiBnaXZlcyBjb250cm9sIHRvIHRoZSB1c2VyIChpZSB3YXRjaHBvaW50cykuICAqLworICBhbGxvY2EgKDApOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1yZWdzOyBpKyspCisgICAgcmVnaXN0ZXJfdmFsaWRbaV0gPSAwOworCisgIGlmIChyZWdpc3RlcnNfY2hhbmdlZF9ob29rKQorICAgIHJlZ2lzdGVyc19jaGFuZ2VkX2hvb2sgKCk7Cit9CisKKy8qIEluZGljYXRlIHRoYXQgYWxsIHJlZ2lzdGVycyBoYXZlIGJlZW4gZmV0Y2hlZCwgc28gbWFyayB0aGVtIGFsbCB2YWxpZC4gICovCit2b2lkCityZWdpc3RlcnNfZmV0Y2hlZCAoKQoreworICBpbnQgaTsKKyAgaW50IG51bXJlZ3MgPSBBUkNIX05VTV9SRUdTOworICBmb3IgKGkgPSAwOyBpIDwgbnVtcmVnczsgaSsrKQorICAgIHJlZ2lzdGVyX3ZhbGlkW2ldID0gMTsKK30KKworLyogcmVhZF9yZWdpc3Rlcl9ieXRlcyBhbmQgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgYXJlIGdlbmVyYWxseSBhICpCQUQqIGlkZWEuCisgICBUaGV5IGFyZSBpbmVmZmljaWVudCBiZWNhdXNlIHRoZXkgbmVlZCB0byBjaGVjayBmb3IgcGFydGlhbCB1cGRhdGVzLCB3aGljaAorICAgY2FuIG9ubHkgYmUgZG9uZSBieSBzY2FubmluZyB0aHJvdWdoIGFsbCBvZiB0aGUgcmVnaXN0ZXJzIGFuZCBzZWVpbmcgaWYgdGhlCisgICBieXRlcyB0aGF0IGFyZSBiZWluZyByZWFkL3dyaXR0ZW4gZmFsbCBpbnNpZGUgb2YgYW4gaW52YWxpZCByZWdpc3Rlci4gIFtUaGUKKyAgICBtYWluIHJlYXNvbiB0aGlzIGlzIG5lY2Vzc2FyeSBpcyB0aGF0IHJlZ2lzdGVyIHNpemVzIGNhbiB2YXJ5LCBzbyBhIHNpbXBsZQorICAgIGluZGV4IHdvbid0IHN1ZmZpY2UuXSAgSXQgaXMgZmFyIGJldHRlciB0byBjYWxsIHJlYWRfcmVnaXN0ZXJfZ2VuIGlmIHlvdQorICAgd2FudCB0byBnZXQgYXQgdGhlIHJhdyByZWdpc3RlciBjb250ZW50cywgYXMgaXQgb25seSB0YWtlcyBhIHJlZ25vIGFzIGFuCisgICBhcmd1bWVudCwgYW5kIHRoZXJlZm9yZSBjYW4ndCBkbyBhIHBhcnRpYWwgcmVnaXN0ZXIgdXBkYXRlLiAgSXQgd291bGQgYWxzbworICAgYmUgZ29vZCB0byBoYXZlIGEgd3JpdGVfcmVnaXN0ZXJfZ2VuIGZvciBzaW1pbGFyIHJlYXNvbnMuCisKKyAgIFByaW9yIHRvIHRoZSByZWNlbnQgZml4ZXMgdG8gY2hlY2sgZm9yIHBhcnRpYWwgdXBkYXRlcywgYm90aCByZWFkIGFuZAorICAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgYWx3YXlzIGNoZWNrZWQgdG8gc2VlIGlmIGFueSByZWdpc3RlcnMgd2VyZSBzdGFsZSwgYW5kCisgICB0aGVuIGNhbGxlZCB0YXJnZXRfZmV0Y2hfcmVnaXN0ZXJzICgtMSkgdG8gdXBkYXRlIHRoZSB3aG9sZSBzZXQuICBUaGlzCisgICBjYXVzZWQgcmVhbGx5IHNsb3dlZCB0aGluZ3MgZG93biBmb3IgcmVtb3RlIHRhcmdldHMuICAqLworCisvKiBDb3B5IElOTEVOIGJ5dGVzIG9mIGNvbnNlY3V0aXZlIGRhdGEgZnJvbSByZWdpc3RlcnMKKyAgIHN0YXJ0aW5nIHdpdGggdGhlIElOUkVHQllURSd0aCBieXRlIG9mIHJlZ2lzdGVyIGRhdGEKKyAgIGludG8gbWVtb3J5IGF0IE1ZQUREUi4gICovCisKK3ZvaWQKK3JlYWRfcmVnaXN0ZXJfYnl0ZXMgKGlucmVnYnl0ZSwgbXlhZGRyLCBpbmxlbikKKyAgICAgaW50IGlucmVnYnl0ZTsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgaW5sZW47Cit7CisgIGludCBpbnJlZ2VuZCA9IGlucmVnYnl0ZSArIGlubGVuOworICBpbnQgcmVnbm87CisKKyAgaWYgKHJlZ2lzdGVyc19waWQgIT0gaW5mZXJpb3JfcGlkKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyc19jaGFuZ2VkICgpOworICAgICAgcmVnaXN0ZXJzX3BpZCA9IGluZmVyaW9yX3BpZDsKKyAgICB9CisKKyAgLyogU2VlIGlmIHdlIGFyZSB0cnlpbmcgdG8gcmVhZCBieXRlcyBmcm9tIG91dC1vZi1kYXRlIHJlZ2lzdGVycy4gIElmIHNvLAorICAgICB1cGRhdGUganVzdCB0aG9zZSByZWdpc3RlcnMuICAqLworCisgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IE5VTV9SRUdTOyByZWdubysrKQorICAgIHsKKyAgICAgIGludCByZWdzdGFydCwgcmVnZW5kOworICAgICAgaW50IHN0YXJ0aW4sIGVuZGluOworCisgICAgICBpZiAocmVnaXN0ZXJfdmFsaWRbcmVnbm9dKQorCWNvbnRpbnVlOworCisgICAgICBpZiAoUkVHSVNURVJfTkFNRSAocmVnbm8pID09IE5VTEwgfHwgKlJFR0lTVEVSX05BTUUgKHJlZ25vKSA9PSAnXDAnKQorCWNvbnRpbnVlOworCisgICAgICByZWdzdGFydCA9IFJFR0lTVEVSX0JZVEUgKHJlZ25vKTsKKyAgICAgIHJlZ2VuZCA9IHJlZ3N0YXJ0ICsgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ25vKTsKKworICAgICAgc3RhcnRpbiA9IHJlZ3N0YXJ0ID49IGlucmVnYnl0ZSAmJiByZWdzdGFydCA8IGlucmVnZW5kOworICAgICAgZW5kaW4gPSByZWdlbmQgPiBpbnJlZ2J5dGUgJiYgcmVnZW5kIDw9IGlucmVnZW5kOworCisgICAgICBpZiAoIXN0YXJ0aW4gJiYgIWVuZGluKQorCWNvbnRpbnVlOworCisgICAgICAvKiBXZSd2ZSBmb3VuZCBhbiBpbnZhbGlkIHJlZ2lzdGVyIHdoZXJlIGF0IGxlYXN0IG9uZSBieXRlIHdpbGwgYmUgcmVhZC4KKwkgVXBkYXRlIGl0IGZyb20gdGhlIHRhcmdldC4gICovCisKKyAgICAgIHRhcmdldF9mZXRjaF9yZWdpc3RlcnMgKHJlZ25vKTsKKworICAgICAgaWYgKCFyZWdpc3Rlcl92YWxpZFtyZWdub10pCisJZXJyb3IgKCJyZWFkX3JlZ2lzdGVyX2J5dGVzOiAgQ291bGRuJ3QgdXBkYXRlIHJlZ2lzdGVyICVkLiIsIHJlZ25vKTsKKyAgICB9CisKKyAgaWYgKG15YWRkciAhPSBOVUxMKQorICAgIG1lbWNweSAobXlhZGRyLCAmcmVnaXN0ZXJzW2lucmVnYnl0ZV0sIGlubGVuKTsKK30KKworLyogUmVhZCByZWdpc3RlciBSRUdOTyBpbnRvIG1lbW9yeSBhdCBNWUFERFIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoCisgICBmb3IgUkVHSVNURVJfUkFXX0JZVEVTIChSRUdOTykuICBUYXJnZXQgYnl0ZS1vcmRlci4KKyAgIElmIHRoZSByZWdpc3RlciBpcyBrbm93biB0byBiZSB0aGUgc2l6ZSBvZiBhIENPUkVfQUREUiBvciBzbWFsbGVyLAorICAgcmVhZF9yZWdpc3RlciBjYW4gYmUgdXNlZCBpbnN0ZWFkLiAgKi8KK3ZvaWQKK3JlYWRfcmVnaXN0ZXJfZ2VuIChyZWdubywgbXlhZGRyKQorICAgICBpbnQgcmVnbm87CisgICAgIGNoYXIgKm15YWRkcjsKK3sKKyAgaWYgKHJlZ2lzdGVyc19waWQgIT0gaW5mZXJpb3JfcGlkKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyc19jaGFuZ2VkICgpOworICAgICAgcmVnaXN0ZXJzX3BpZCA9IGluZmVyaW9yX3BpZDsKKyAgICB9CisKKyAgaWYgKCFyZWdpc3Rlcl92YWxpZFtyZWdub10pCisgICAgdGFyZ2V0X2ZldGNoX3JlZ2lzdGVycyAocmVnbm8pOworICBtZW1jcHkgKG15YWRkciwgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdubyldLAorCSAgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ25vKSk7Cit9CisKKy8qIFdyaXRlIHJlZ2lzdGVyIFJFR05PIGF0IE1ZQUREUiB0byB0aGUgdGFyZ2V0LiAgTVlBRERSIHBvaW50cyBhdAorICAgUkVHSVNURVJfUkFXX0JZVEVTKFJFR05PKSwgd2hpY2ggbXVzdCBiZSBpbiB0YXJnZXQgYnl0ZS1vcmRlci4gICovCisKK3N0YXRpYyB2b2lkCit3cml0ZV9yZWdpc3Rlcl9nZW4gKHJlZ25vLCBteWFkZHIpCisgICAgIGludCByZWdubzsKKyAgICAgY2hhciAqbXlhZGRyOworeworICBpbnQgc2l6ZTsKKworICAvKiBPbiB0aGUgc3BhcmMsIHdyaXRpbmcgJWcwIGlzIGEgbm8tb3AsIHNvIHdlIGRvbid0IGV2ZW4gd2FudCB0byBjaGFuZ2UKKyAgICAgdGhlIHJlZ2lzdGVycyBhcnJheSBpZiBzb21ldGhpbmcgd3JpdGVzIHRvIHRoaXMgcmVnaXN0ZXIuICAqLworICBpZiAoQ0FOTk9UX1NUT1JFX1JFR0lTVEVSIChyZWdubykpCisgICAgcmV0dXJuOworCisgIGlmIChyZWdpc3RlcnNfcGlkICE9IGluZmVyaW9yX3BpZCkKKyAgICB7CisgICAgICByZWdpc3RlcnNfY2hhbmdlZCAoKTsKKyAgICAgIHJlZ2lzdGVyc19waWQgPSBpbmZlcmlvcl9waWQ7CisgICAgfQorCisgIHNpemUgPSBSRUdJU1RFUl9SQVdfU0laRShyZWdubyk7CisKKyAgLyogSWYgd2UgaGF2ZSBhIHZhbGlkIGNvcHkgb2YgdGhlIHJlZ2lzdGVyLCBhbmQgbmV3IHZhbHVlID09IG9sZCB2YWx1ZSwKKyAgICAgdGhlbiBkb24ndCBib3RoZXIgZG9pbmcgdGhlIGFjdHVhbCBzdG9yZS4gKi8KKworICBpZiAocmVnaXN0ZXJfdmFsaWQgW3JlZ25vXQorICAgICAgJiYgbWVtY21wICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ25vKV0sIG15YWRkciwgc2l6ZSkgPT0gMCkKKyAgICByZXR1cm47CisgIAorICB0YXJnZXRfcHJlcGFyZV90b19zdG9yZSAoKTsKKworICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnbm8pXSwgbXlhZGRyLCBzaXplKTsKKworICByZWdpc3Rlcl92YWxpZCBbcmVnbm9dID0gMTsKKworICB0YXJnZXRfc3RvcmVfcmVnaXN0ZXJzIChyZWdubyk7Cit9CisKKy8qIENvcHkgSU5MRU4gYnl0ZXMgb2YgY29uc2VjdXRpdmUgZGF0YSBmcm9tIG1lbW9yeSBhdCBNWUFERFIKKyAgIGludG8gcmVnaXN0ZXJzIHN0YXJ0aW5nIHdpdGggdGhlIE1ZUkVHU1RBUlQndGggYnl0ZSBvZiByZWdpc3RlciBkYXRhLiAgKi8KKwordm9pZAord3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKG15cmVnc3RhcnQsIG15YWRkciwgaW5sZW4pCisgICAgIGludCBteXJlZ3N0YXJ0OworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBpbmxlbjsKK3sKKyAgaW50IG15cmVnZW5kID0gbXlyZWdzdGFydCArIGlubGVuOworICBpbnQgcmVnbm87CisKKyAgdGFyZ2V0X3ByZXBhcmVfdG9fc3RvcmUgKCk7CisKKyAgLyogU2NhbiB0aHJvdWdoIHRoZSByZWdpc3RlcnMgdXBkYXRpbmcgYW55IHRoYXQgYXJlIGNvdmVyZWQgYnkgdGhlIHJhbmdlCisgICAgIG15cmVnc3RhcnQ8PT5teXJlZ2VuZCB1c2luZyB3cml0ZV9yZWdpc3Rlcl9nZW4sIHdoaWNoIGRvZXMgbmljZSB0aGluZ3MKKyAgICAgbGlrZSBoYW5kbGluZyB0aHJlYWRzLCBhbmQgYXZvaWRpbmcgdXBkYXRlcyB3aGVuIHRoZSBuZXcgYW5kIG9sZCBjb250ZW50cworICAgICBhcmUgdGhlIHNhbWUuICAqLworCisgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IE5VTV9SRUdTOyByZWdubysrKQorICAgIHsKKyAgICAgIGludCByZWdzdGFydCwgcmVnZW5kOworICAgICAgaW50IHN0YXJ0aW4sIGVuZGluOworICAgICAgY2hhciByZWdidWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKworICAgICAgcmVnc3RhcnQgPSBSRUdJU1RFUl9CWVRFIChyZWdubyk7CisgICAgICByZWdlbmQgPSByZWdzdGFydCArIFJFR0lTVEVSX1JBV19TSVpFIChyZWdubyk7CisKKyAgICAgIHN0YXJ0aW4gPSByZWdzdGFydCA+PSBteXJlZ3N0YXJ0ICYmIHJlZ3N0YXJ0IDwgbXlyZWdlbmQ7CisgICAgICBlbmRpbiA9IHJlZ2VuZCA+IG15cmVnc3RhcnQgJiYgcmVnZW5kIDw9IG15cmVnZW5kOworCisgICAgICBpZiAoIXN0YXJ0aW4gJiYgIWVuZGluKQorCWNvbnRpbnVlOwkJLyogUmVnaXN0ZXIgaXMgY29tcGxldGVseSBvdXQgb2YgcmFuZ2UgKi8KKworICAgICAgaWYgKHN0YXJ0aW4gJiYgZW5kaW4pCS8qIHJlZ2lzdGVyIGlzIGNvbXBsZXRlbHkgaW4gcmFuZ2UgKi8KKwl7CisJICB3cml0ZV9yZWdpc3Rlcl9nZW4gKHJlZ25vLCBteWFkZHIgKyAocmVnc3RhcnQgLSBteXJlZ3N0YXJ0KSk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIFdlIG1heSBiZSBkb2luZyBhIHBhcnRpYWwgdXBkYXRlIG9mIGFuIGludmFsaWQgcmVnaXN0ZXIuICBVcGRhdGUgaXQKKwkgZnJvbSB0aGUgdGFyZ2V0IGJlZm9yZSBzY3JpYmJsaW5nIG9uIGl0LiAgKi8KKyAgICAgIHJlYWRfcmVnaXN0ZXJfZ2VuIChyZWdubywgcmVnYnVmKTsKKworICAgICAgaWYgKHN0YXJ0aW4pCisJbWVtY3B5IChyZWdpc3RlcnMgKyByZWdzdGFydCwKKwkJbXlhZGRyICsgcmVnc3RhcnQgLSBteXJlZ3N0YXJ0LAorCQlteXJlZ2VuZCAtIHJlZ3N0YXJ0KTsKKyAgICAgIGVsc2UJCQkvKiBlbmRpbiAqLworCW1lbWNweSAocmVnaXN0ZXJzICsgbXlyZWdzdGFydCwKKwkJbXlhZGRyLAorCQlyZWdlbmQgLSBteXJlZ3N0YXJ0KTsKKyAgICAgIHRhcmdldF9zdG9yZV9yZWdpc3RlcnMgKHJlZ25vKTsKKyAgICB9Cit9CisKKy8qIFJldHVybiB0aGUgcmF3IGNvbnRlbnRzIG9mIHJlZ2lzdGVyIFJFR05PLCByZWdhcmRpbmcgaXQgYXMgYW4gaW50ZWdlci4gICovCisvKiBUaGlzIHByb2JhYmx5IHNob3VsZCBiZSByZXR1cm5pbmcgTE9OR0VTVCByYXRoZXIgdGhhbiBDT1JFX0FERFIuICAqLworCitDT1JFX0FERFIKK3JlYWRfcmVnaXN0ZXIgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGlmIChyZWdpc3RlcnNfcGlkICE9IGluZmVyaW9yX3BpZCkKKyAgICB7CisgICAgICByZWdpc3RlcnNfY2hhbmdlZCAoKTsKKyAgICAgIHJlZ2lzdGVyc19waWQgPSBpbmZlcmlvcl9waWQ7CisgICAgfQorCisgIGlmICghcmVnaXN0ZXJfdmFsaWRbcmVnbm9dKQorICAgIHRhcmdldF9mZXRjaF9yZWdpc3RlcnMgKHJlZ25vKTsKKworICByZXR1cm4gKENPUkVfQUREUilleHRyYWN0X2FkZHJlc3MgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnbm8pXSwKKwkJCQkgICAgIFJFR0lTVEVSX1JBV19TSVpFKHJlZ25vKSk7Cit9CisKK0NPUkVfQUREUgorcmVhZF9yZWdpc3Rlcl9waWQgKHJlZ25vLCBwaWQpCisgICAgIGludCByZWdubywgcGlkOworeworICBpbnQgc2F2ZV9waWQ7CisgIENPUkVfQUREUiByZXR2YWw7CisKKyAgaWYgKHBpZCA9PSBpbmZlcmlvcl9waWQpCisgICAgcmV0dXJuIHJlYWRfcmVnaXN0ZXIgKHJlZ25vKTsKKworICBzYXZlX3BpZCA9IGluZmVyaW9yX3BpZDsKKworICBpbmZlcmlvcl9waWQgPSBwaWQ7CisKKyAgcmV0dmFsID0gcmVhZF9yZWdpc3RlciAocmVnbm8pOworCisgIGluZmVyaW9yX3BpZCA9IHNhdmVfcGlkOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIFN0b3JlIFZBTFVFLCBpbnRvIHRoZSByYXcgY29udGVudHMgb2YgcmVnaXN0ZXIgbnVtYmVyIFJFR05PLgorICAgVGhpcyBzaG91bGQgcHJvYmFibHkgd3JpdGUgYSBMT05HRVNUIHJhdGhlciB0aGFuIGEgQ09SRV9BRERSICovCisKK3ZvaWQKK3dyaXRlX3JlZ2lzdGVyIChyZWdubywgdmFsKQorICAgICBpbnQgcmVnbm87CisgICAgIExPTkdFU1QgdmFsOworeworICBQVFIgYnVmOworICBpbnQgc2l6ZTsKKworICAvKiBPbiB0aGUgc3BhcmMsIHdyaXRpbmcgJWcwIGlzIGEgbm8tb3AsIHNvIHdlIGRvbid0IGV2ZW4gd2FudCB0byBjaGFuZ2UKKyAgICAgdGhlIHJlZ2lzdGVycyBhcnJheSBpZiBzb21ldGhpbmcgd3JpdGVzIHRvIHRoaXMgcmVnaXN0ZXIuICAqLworICBpZiAoQ0FOTk9UX1NUT1JFX1JFR0lTVEVSIChyZWdubykpCisgICAgcmV0dXJuOworCisgIGlmIChyZWdpc3RlcnNfcGlkICE9IGluZmVyaW9yX3BpZCkKKyAgICB7CisgICAgICByZWdpc3RlcnNfY2hhbmdlZCAoKTsKKyAgICAgIHJlZ2lzdGVyc19waWQgPSBpbmZlcmlvcl9waWQ7CisgICAgfQorCisgIHNpemUgPSBSRUdJU1RFUl9SQVdfU0laRShyZWdubyk7CisgIGJ1ZiA9IGFsbG9jYSAoc2l6ZSk7CisgIHN0b3JlX3NpZ25lZF9pbnRlZ2VyIChidWYsIHNpemUsIChMT05HRVNUKXZhbCk7CisKKyAgLyogSWYgd2UgaGF2ZSBhIHZhbGlkIGNvcHkgb2YgdGhlIHJlZ2lzdGVyLCBhbmQgbmV3IHZhbHVlID09IG9sZCB2YWx1ZSwKKyAgICAgdGhlbiBkb24ndCBib3RoZXIgZG9pbmcgdGhlIGFjdHVhbCBzdG9yZS4gKi8KKworICBpZiAocmVnaXN0ZXJfdmFsaWQgW3JlZ25vXQorICAgICAgJiYgbWVtY21wICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ25vKV0sIGJ1Ziwgc2l6ZSkgPT0gMCkKKyAgICByZXR1cm47CisgIAorICB0YXJnZXRfcHJlcGFyZV90b19zdG9yZSAoKTsKKworICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnbm8pXSwgYnVmLCBzaXplKTsKKworICByZWdpc3Rlcl92YWxpZCBbcmVnbm9dID0gMTsKKworICB0YXJnZXRfc3RvcmVfcmVnaXN0ZXJzIChyZWdubyk7Cit9CisKK3ZvaWQKK3dyaXRlX3JlZ2lzdGVyX3BpZCAocmVnbm8sIHZhbCwgcGlkKQorICAgICBpbnQgcmVnbm87CisgICAgIENPUkVfQUREUiB2YWw7CisgICAgIGludCBwaWQ7Cit7CisgIGludCBzYXZlX3BpZDsKKworICBpZiAocGlkID09IGluZmVyaW9yX3BpZCkKKyAgICB7CisgICAgICB3cml0ZV9yZWdpc3RlciAocmVnbm8sIHZhbCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHNhdmVfcGlkID0gaW5mZXJpb3JfcGlkOworCisgIGluZmVyaW9yX3BpZCA9IHBpZDsKKworICB3cml0ZV9yZWdpc3RlciAocmVnbm8sIHZhbCk7CisKKyAgaW5mZXJpb3JfcGlkID0gc2F2ZV9waWQ7Cit9CisKKy8qIFJlY29yZCB0aGF0IHJlZ2lzdGVyIFJFR05PIGNvbnRhaW5zIFZBTC4KKyAgIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSB2YWx1ZSBpcyBvYnRhaW5lZCBmcm9tIHRoZSBpbmZlcmlvciBvciBjb3JlIGR1bXAsCisgICBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHN0b3JlIHRoZSB2YWx1ZSB0aGVyZS4KKworICAgSWYgVkFMIGlzIGEgTlVMTCBwb2ludGVyLCB0aGVuIGl0J3MgcHJvYmFibHkgYW4gdW5zdXBwb3J0ZWQgcmVnaXN0ZXIuICBXZQorICAganVzdCBzZXQgaXQncyB2YWx1ZSB0byBhbGwgemVyb3MuICBXZSBtaWdodCB3YW50IHRvIHJlY29yZCB0aGlzIGZhY3QsIGFuZAorICAgcmVwb3J0IGl0IHRvIHRoZSB1c2VycyBvZiByZWFkX3JlZ2lzdGVyIGFuZCBmcmllbmRzLgorKi8KKwordm9pZAorc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgdmFsKQorICAgICBpbnQgcmVnbm87CisgICAgIGNoYXIgKnZhbDsKK3sKKyNpZiAxCisgIGlmIChyZWdpc3RlcnNfcGlkICE9IGluZmVyaW9yX3BpZCkKKyAgICB7CisgICAgICByZWdpc3RlcnNfY2hhbmdlZCAoKTsKKyAgICAgIHJlZ2lzdGVyc19waWQgPSBpbmZlcmlvcl9waWQ7CisgICAgfQorI2VuZGlmCisKKyAgcmVnaXN0ZXJfdmFsaWRbcmVnbm9dID0gMTsKKyAgaWYgKHZhbCkKKyAgICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnbm8pXSwgdmFsLCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pKTsKKyAgZWxzZQorICAgIG1lbXNldCAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdubyldLCAnXDAwMCcsIFJFR0lTVEVSX1JBV19TSVpFIChyZWdubykpOworCisgIC8qIE9uIHNvbWUgYXJjaGl0ZWN0dXJlcywgZS5nLiBIUFBBLCB0aGVyZSBhcmUgYSBmZXcgc3RyYXkgYml0cyBpbiBzb21lCisgICAgIHJlZ2lzdGVycywgdGhhdCB0aGUgcmVzdCBvZiB0aGUgY29kZSB3b3VsZCBsaWtlIHRvIGlnbm9yZS4gICovCisjaWZkZWYgQ0xFQU5fVVBfUkVHSVNURVJfVkFMVUUKKyAgQ0xFQU5fVVBfUkVHSVNURVJfVkFMVUUocmVnbm8sICZyZWdpc3RlcnNbUkVHSVNURVJfQllURShyZWdubyldKTsKKyNlbmRpZgorfQorCisKKy8qIFRoaXMgcm91dGluZSBpcyBnZXR0aW5nIGF3ZnVsbHkgY2x1dHRlcmVkIHdpdGggI2lmJ3MuICBJdCdzIHByb2JhYmx5CisgICB0aW1lIHRvIHR1cm4gdGhpcyBpbnRvIFJFQURfUEMgYW5kIGRlZmluZSBpdCBpbiB0aGUgdG0uaCBmaWxlLgorICAgRGl0dG8gZm9yIHdyaXRlX3BjLiAgKi8KKworQ09SRV9BRERSCityZWFkX3BjX3BpZCAocGlkKQorICAgICBpbnQgcGlkOworeworICBpbnQgIHNhdmVkX2luZmVyaW9yX3BpZDsKKyAgQ09SRV9BRERSICBwY192YWw7CisKKyAgLyogSW4gY2FzZSBwaWQgIT0gaW5mZXJpb3JfcGlkLiAqLworICBzYXZlZF9pbmZlcmlvcl9waWQgPSBpbmZlcmlvcl9waWQ7CisgIGluZmVyaW9yX3BpZCA9IHBpZDsKKyAgCisjaWZkZWYgVEFSR0VUX1JFQURfUEMKKyAgcGNfdmFsID0gVEFSR0VUX1JFQURfUEMgKHBpZCk7CisjZWxzZQorICBwY192YWwgPSBBRERSX0JJVFNfUkVNT1ZFICgoQ09SRV9BRERSKSByZWFkX3JlZ2lzdGVyX3BpZCAoUENfUkVHTlVNLCBwaWQpKTsKKyNlbmRpZgorCisgIGluZmVyaW9yX3BpZCA9IHNhdmVkX2luZmVyaW9yX3BpZDsKKyAgcmV0dXJuIHBjX3ZhbDsKK30KKworQ09SRV9BRERSCityZWFkX3BjICgpCit7CisgIHJldHVybiByZWFkX3BjX3BpZCAoaW5mZXJpb3JfcGlkKTsKK30KKwordm9pZAord3JpdGVfcGNfcGlkIChwYywgcGlkKQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIGludCBwaWQ7Cit7CisgIGludCAgc2F2ZWRfaW5mZXJpb3JfcGlkOworCisgIC8qIEluIGNhc2UgcGlkICE9IGluZmVyaW9yX3BpZC4gKi8KKyAgc2F2ZWRfaW5mZXJpb3JfcGlkID0gaW5mZXJpb3JfcGlkOworICBpbmZlcmlvcl9waWQgPSBwaWQ7CisgIAorI2lmZGVmIFRBUkdFVF9XUklURV9QQworICBUQVJHRVRfV1JJVEVfUEMgKHBjLCBwaWQpOworI2Vsc2UKKyAgd3JpdGVfcmVnaXN0ZXJfcGlkIChQQ19SRUdOVU0sIHBjLCBwaWQpOworI2lmZGVmIE5QQ19SRUdOVU0KKyAgd3JpdGVfcmVnaXN0ZXJfcGlkIChOUENfUkVHTlVNLCBwYyArIDQsIHBpZCk7CisjaWZkZWYgTk5QQ19SRUdOVU0KKyAgd3JpdGVfcmVnaXN0ZXJfcGlkIChOTlBDX1JFR05VTSwgcGMgKyA4LCBwaWQpOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisgIGluZmVyaW9yX3BpZCA9IHNhdmVkX2luZmVyaW9yX3BpZDsKK30KKwordm9pZAord3JpdGVfcGMgKHBjKQorICAgICBDT1JFX0FERFIgcGM7Cit7CisgIHdyaXRlX3BjX3BpZCAocGMsIGluZmVyaW9yX3BpZCk7Cit9CisKKy8qIENvcGUgd2l0aCBzdHJhZ2Ugd2F5cyBvZiBnZXR0aW5nIHRvIHRoZSBzdGFjayBhbmQgZnJhbWUgcG9pbnRlcnMgKi8KKworQ09SRV9BRERSCityZWFkX3NwICgpCit7CisjaWZkZWYgVEFSR0VUX1JFQURfU1AKKyAgcmV0dXJuIFRBUkdFVF9SRUFEX1NQICgpOworI2Vsc2UKKyAgcmV0dXJuIHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSk7CisjZW5kaWYKK30KKwordm9pZAord3JpdGVfc3AgKHZhbCkKKyAgICAgQ09SRV9BRERSIHZhbDsKK3sKKyNpZmRlZiBUQVJHRVRfV1JJVEVfU1AKKyAgVEFSR0VUX1dSSVRFX1NQICh2YWwpOworI2Vsc2UKKyAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgdmFsKTsKKyNlbmRpZgorfQorCitDT1JFX0FERFIKK3JlYWRfZnAgKCkKK3sKKyNpZmRlZiBUQVJHRVRfUkVBRF9GUAorICByZXR1cm4gVEFSR0VUX1JFQURfRlAgKCk7CisjZWxzZQorICByZXR1cm4gcmVhZF9yZWdpc3RlciAoRlBfUkVHTlVNKTsKKyNlbmRpZgorfQorCit2b2lkCit3cml0ZV9mcCAodmFsKQorICAgICBDT1JFX0FERFIgdmFsOworeworI2lmZGVmIFRBUkdFVF9XUklURV9GUAorICBUQVJHRVRfV1JJVEVfRlAgKHZhbCk7CisjZWxzZQorICB3cml0ZV9yZWdpc3RlciAoRlBfUkVHTlVNLCB2YWwpOworI2VuZGlmCit9CisMCisvKiBXaWxsIGNhbGxpbmcgcmVhZF92YXJfdmFsdWUgb3IgbG9jYXRlX3Zhcl92YWx1ZSBvbiBTWU0gZW5kCisgICB1cCBjYXJpbmcgd2hhdCBmcmFtZSBpdCBpcyBiZWluZyBldmFsdWF0ZWQgcmVsYXRpdmUgdG8/ICBTWU0gbXVzdAorICAgYmUgbm9uLU5VTEwuICAqLworaW50CitzeW1ib2xfcmVhZF9uZWVkc19mcmFtZSAoc3ltKQorICAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07Cit7CisgIHN3aXRjaCAoU1lNQk9MX0NMQVNTIChzeW0pKQorICAgIHsKKyAgICAgIC8qIEFsbCBjYXNlcyBsaXN0ZWQgZXhwbGljaXRseSBzbyB0aGF0IGdjYyAtV2FsbCB3aWxsIGRldGVjdCBpdCBpZgorCSB3ZSBmYWlsZWQgdG8gY29uc2lkZXIgb25lLiAgKi8KKyAgICBjYXNlIExPQ19SRUdJU1RFUjoKKyAgICBjYXNlIExPQ19BUkc6CisgICAgY2FzZSBMT0NfUkVGX0FSRzoKKyAgICBjYXNlIExPQ19SRUdQQVJNOgorICAgIGNhc2UgTE9DX1JFR1BBUk1fQUREUjoKKyAgICBjYXNlIExPQ19MT0NBTDoKKyAgICBjYXNlIExPQ19MT0NBTF9BUkc6CisgICAgY2FzZSBMT0NfQkFTRVJFRzoKKyAgICBjYXNlIExPQ19CQVNFUkVHX0FSRzoKKyAgICBjYXNlIExPQ19USFJFQURfTE9DQUxfU1RBVElDOgorICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIExPQ19VTkRFRjoKKyAgICBjYXNlIExPQ19DT05TVDoKKyAgICBjYXNlIExPQ19TVEFUSUM6CisgICAgY2FzZSBMT0NfSU5ESVJFQ1Q6CisgICAgY2FzZSBMT0NfVFlQRURFRjoKKworICAgIGNhc2UgTE9DX0xBQkVMOgorICAgICAgLyogR2V0dGluZyB0aGUgYWRkcmVzcyBvZiBhIGxhYmVsIGNhbiBiZSBkb25lIGluZGVwZW5kZW50bHkgb2YgdGhlIGJsb2NrLAorCSBldmVuIGlmIHNvbWUgKnVzZXMqIG9mIHRoYXQgYWRkcmVzcyB3b3VsZG4ndCB3b3JrIHNvIHdlbGwgd2l0aG91dAorCSB0aGUgcmlnaHQgZnJhbWUuICAqLworCisgICAgY2FzZSBMT0NfQkxPQ0s6CisgICAgY2FzZSBMT0NfQ09OU1RfQllURVM6CisgICAgY2FzZSBMT0NfVU5SRVNPTFZFRDoKKyAgICBjYXNlIExPQ19PUFRJTUlaRURfT1VUOgorICAgICAgcmV0dXJuIDA7CisgICAgfQorICByZXR1cm4gMTsKK30KKworLyogR2l2ZW4gYSBzdHJ1Y3Qgc3ltYm9sIGZvciBhIHZhcmlhYmxlLAorICAgYW5kIGEgc3RhY2sgZnJhbWUgaWQsIHJlYWQgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZQorICAgYW5kIHJldHVybiBhIChwb2ludGVyIHRvIGEpIHN0cnVjdCB2YWx1ZSBjb250YWluaW5nIHRoZSB2YWx1ZS4gCisgICBJZiB0aGUgdmFyaWFibGUgY2Fubm90IGJlIGZvdW5kLCByZXR1cm4gYSB6ZXJvIHBvaW50ZXIuCisgICBJZiBGUkFNRSBpcyBOVUxMLCB1c2UgdGhlIHNlbGVjdGVkX2ZyYW1lLiAgKi8KKwordmFsdWVfcHRyCityZWFkX3Zhcl92YWx1ZSAodmFyLCBmcmFtZSkKKyAgICAgcmVnaXN0ZXIgc3RydWN0IHN5bWJvbCAqdmFyOworICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIHJlZ2lzdGVyIHZhbHVlX3B0ciB2OworICBzdHJ1Y3QgdHlwZSAqdHlwZSA9IFNZTUJPTF9UWVBFICh2YXIpOworICBDT1JFX0FERFIgYWRkcjsKKyAgcmVnaXN0ZXIgaW50IGxlbjsKKworICB2ID0gYWxsb2NhdGVfdmFsdWUgKHR5cGUpOworICBWQUxVRV9MVkFMICh2KSA9IGx2YWxfbWVtb3J5OwkvKiBUaGUgbW9zdCBsaWtlbHkgcG9zc2liaWxpdHkuICAqLworICBWQUxVRV9CRkRfU0VDVElPTiAodikgPSBTWU1CT0xfQkZEX1NFQ1RJT04gKHZhcik7CisKKyAgbGVuID0gVFlQRV9MRU5HVEggKHR5cGUpOworCisgIGlmIChmcmFtZSA9PSBOVUxMKSBmcmFtZSA9IHNlbGVjdGVkX2ZyYW1lOworCisgIHN3aXRjaCAoU1lNQk9MX0NMQVNTICh2YXIpKQorICAgIHsKKyAgICBjYXNlIExPQ19DT05TVDoKKyAgICAgIC8qIFB1dCB0aGUgY29uc3RhbnQgYmFjayBpbiB0YXJnZXQgZm9ybWF0LiAgKi8KKyAgICAgIHN0b3JlX3NpZ25lZF9pbnRlZ2VyIChWQUxVRV9DT05URU5UU19SQVcgKHYpLCBsZW4sCisJCQkgICAgKExPTkdFU1QpIFNZTUJPTF9WQUxVRSAodmFyKSk7CisgICAgICBWQUxVRV9MVkFMICh2KSA9IG5vdF9sdmFsOworICAgICAgcmV0dXJuIHY7CisKKyAgICBjYXNlIExPQ19MQUJFTDoKKyAgICAgIC8qIFB1dCB0aGUgY29uc3RhbnQgYmFjayBpbiB0YXJnZXQgZm9ybWF0LiAgKi8KKyAgICAgIGlmIChvdmVybGF5X2RlYnVnZ2luZykKKwlzdG9yZV9hZGRyZXNzIChWQUxVRV9DT05URU5UU19SQVcgKHYpLCBsZW4sIAorCQkgICAgICAgKExPTkdFU1Qpc3ltYm9sX292ZXJsYXllZF9hZGRyZXNzIChTWU1CT0xfVkFMVUVfQUREUkVTUyAodmFyKSwKKwkJCQkJCQkgICBTWU1CT0xfQkZEX1NFQ1RJT04gKHZhcikpKTsKKyAgICAgIGVsc2UKKwlzdG9yZV9hZGRyZXNzIChWQUxVRV9DT05URU5UU19SQVcgKHYpLCBsZW4sCisJCSAgICAgICAoTE9OR0VTVClTWU1CT0xfVkFMVUVfQUREUkVTUyAodmFyKSk7CisgICAgICBWQUxVRV9MVkFMICh2KSA9IG5vdF9sdmFsOworICAgICAgcmV0dXJuIHY7CisKKyAgICBjYXNlIExPQ19DT05TVF9CWVRFUzoKKyAgICAgIHsKKwljaGFyICpieXRlc19hZGRyOworCWJ5dGVzX2FkZHIgPSBTWU1CT0xfVkFMVUVfQllURVMgKHZhcik7CisJbWVtY3B5IChWQUxVRV9DT05URU5UU19SQVcgKHYpLCBieXRlc19hZGRyLCBsZW4pOworCVZBTFVFX0xWQUwgKHYpID0gbm90X2x2YWw7CisJcmV0dXJuIHY7CisgICAgICB9CisKKyAgICBjYXNlIExPQ19TVEFUSUM6CisgICAgICBpZiAob3ZlcmxheV9kZWJ1Z2dpbmcpCisJYWRkciA9IHN5bWJvbF9vdmVybGF5ZWRfYWRkcmVzcyAoU1lNQk9MX1ZBTFVFX0FERFJFU1MgKHZhciksCisJCQkJCSBTWU1CT0xfQkZEX1NFQ1RJT04gKHZhcikpOworICAgICAgZWxzZQorCWFkZHIgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAodmFyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMT0NfSU5ESVJFQ1Q6CisgICAgICAvKiBUaGUgaW1wb3J0IHNsb3QgZG9lcyBub3QgaGF2ZSBhIHJlYWwgYWRkcmVzcyBpbiBpdCBmcm9tIHRoZQorICAgICAgICAgZHluYW1pYyBsb2FkZXIgKGRsZC5zbCBvbiBIUC1VWCksIGlmIHRoZSB0YXJnZXQgaGFzbid0IGJlZ3VuCisgICAgICAgICBleGVjdXRpb24geWV0LCBzbyBjaGVjayBmb3IgdGhhdC4gKi8gCisgICAgICBpZiAoIXRhcmdldF9oYXNfZXhlY3V0aW9uKQorICAgICAgICBlcnJvciAoIlwKK0F0dGVtcHQgdG8gYWNjZXNzIHZhcmlhYmxlIGRlZmluZWQgaW4gZGlmZmVyZW50IHNoYXJlZCBvYmplY3Qgb3IgbG9hZCBtb2R1bGUgd2hlblxuXAorYWRkcmVzc2VzIGhhdmUgbm90IGJlZW4gYm91bmQgYnkgdGhlIGR5bmFtaWMgbG9hZGVyLiBUcnkgYWdhaW4gd2hlbiBleGVjdXRhYmxlIGlzIHJ1bm5pbmcuIik7CisgICAgICAKKyAgICAgIGFkZHIgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAodmFyKTsKKyAgICAgIGFkZHIgPSByZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyCisJKGFkZHIsIFRBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMT0NfQVJHOgorICAgICAgaWYgKGZyYW1lID09IE5VTEwpCisJcmV0dXJuIDA7CisgICAgICBhZGRyID0gRlJBTUVfQVJHU19BRERSRVNTIChmcmFtZSk7CisgICAgICBpZiAoIWFkZHIpCisJcmV0dXJuIDA7CisgICAgICBhZGRyICs9IFNZTUJPTF9WQUxVRSAodmFyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMT0NfUkVGX0FSRzoKKyAgICAgIGlmIChmcmFtZSA9PSBOVUxMKQorCXJldHVybiAwOworICAgICAgYWRkciA9IEZSQU1FX0FSR1NfQUREUkVTUyAoZnJhbWUpOworICAgICAgaWYgKCFhZGRyKQorCXJldHVybiAwOworICAgICAgYWRkciArPSBTWU1CT0xfVkFMVUUgKHZhcik7CisgICAgICBhZGRyID0gcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlcgorCShhZGRyLCBUQVJHRVRfUFRSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTE9DX0xPQ0FMOgorICAgIGNhc2UgTE9DX0xPQ0FMX0FSRzoKKyAgICAgIGlmIChmcmFtZSA9PSBOVUxMKQorCXJldHVybiAwOworICAgICAgYWRkciA9IEZSQU1FX0xPQ0FMU19BRERSRVNTIChmcmFtZSk7CisgICAgICBhZGRyICs9IFNZTUJPTF9WQUxVRSAodmFyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMT0NfQkFTRVJFRzoKKyAgICBjYXNlIExPQ19CQVNFUkVHX0FSRzoKKyAgICAgIHsKKwljaGFyIGJ1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworCWdldF9zYXZlZF9yZWdpc3RlciAoYnVmLCBOVUxMLCBOVUxMLCBmcmFtZSwgU1lNQk9MX0JBU0VSRUcgKHZhciksCisJCQkgICAgTlVMTCk7CisJYWRkciA9IGV4dHJhY3RfYWRkcmVzcyAoYnVmLCBSRUdJU1RFUl9SQVdfU0laRSAoU1lNQk9MX0JBU0VSRUcgKHZhcikpKTsKKwlhZGRyICs9IFNZTUJPTF9WQUxVRSAodmFyKTsKKwlicmVhazsKKyAgICAgIH0KKwkJCSAgICAKKyAgICBjYXNlIExPQ19USFJFQURfTE9DQUxfU1RBVElDOgorICAgICAgeworICAgICAgICBjaGFyIGJ1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworICAgICAgICAKKyAgICAgICAgZ2V0X3NhdmVkX3JlZ2lzdGVyKGJ1ZiwgTlVMTCwgTlVMTCwgZnJhbWUsIFNZTUJPTF9CQVNFUkVHICh2YXIpLAorCQkJICAgIE5VTEwpOworICAgICAgICBhZGRyID0gZXh0cmFjdF9hZGRyZXNzIChidWYsIFJFR0lTVEVSX1JBV19TSVpFIChTWU1CT0xfQkFTRVJFRyAodmFyKSkpOworICAgICAgICBhZGRyICs9IFNZTUJPTF9WQUxVRSAodmFyICk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgCisgICAgY2FzZSBMT0NfVFlQRURFRjoKKyAgICAgIGVycm9yICgiQ2Fubm90IGxvb2sgdXAgdmFsdWUgb2YgYSB0eXBlZGVmIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTE9DX0JMT0NLOgorICAgICAgaWYgKG92ZXJsYXlfZGVidWdnaW5nKQorCVZBTFVFX0FERFJFU1MgKHYpID0gc3ltYm9sX292ZXJsYXllZF9hZGRyZXNzIAorCSAgKEJMT0NLX1NUQVJUIChTWU1CT0xfQkxPQ0tfVkFMVUUgKHZhcikpLCBTWU1CT0xfQkZEX1NFQ1RJT04gKHZhcikpOworICAgICAgZWxzZQorCVZBTFVFX0FERFJFU1MgKHYpID0gQkxPQ0tfU1RBUlQgKFNZTUJPTF9CTE9DS19WQUxVRSAodmFyKSk7CisgICAgICByZXR1cm4gdjsKKworICAgIGNhc2UgTE9DX1JFR0lTVEVSOgorICAgIGNhc2UgTE9DX1JFR1BBUk06CisgICAgY2FzZSBMT0NfUkVHUEFSTV9BRERSOgorICAgICAgeworCXN0cnVjdCBibG9jayAqYjsKKwlpbnQgcmVnbm8gPSBTWU1CT0xfVkFMVUUgKHZhcik7CisJdmFsdWVfcHRyIHJlZ3ZhbDsKKworCWlmIChmcmFtZSA9PSBOVUxMKQorCSAgcmV0dXJuIDA7CisJYiA9IGdldF9mcmFtZV9ibG9jayAoZnJhbWUpOworCisJaWYgKFNZTUJPTF9DTEFTUyAodmFyKSA9PSBMT0NfUkVHUEFSTV9BRERSKQorCSAgeworCSAgICByZWd2YWwgPSB2YWx1ZV9mcm9tX3JlZ2lzdGVyIChsb29rdXBfcG9pbnRlcl90eXBlICh0eXBlKSwKKwkJCQkJICByZWdubywgCisJCQkJCSAgZnJhbWUpOworCisJICAgIGlmIChyZWd2YWwgPT0gTlVMTCkKKwkgICAgICBlcnJvciAoIlZhbHVlIG9mIHJlZ2lzdGVyIHZhcmlhYmxlIG5vdCBhdmFpbGFibGUuIik7CisKKwkgICAgYWRkciAgID0gdmFsdWVfYXNfcG9pbnRlciAocmVndmFsKTsKKwkgICAgVkFMVUVfTFZBTCAodikgPSBsdmFsX21lbW9yeTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIHJlZ3ZhbCA9IHZhbHVlX2Zyb21fcmVnaXN0ZXIgKHR5cGUsIHJlZ25vLCBmcmFtZSk7CisKKwkgICAgaWYgKHJlZ3ZhbCA9PSBOVUxMKQorCSAgICAgIGVycm9yICgiVmFsdWUgb2YgcmVnaXN0ZXIgdmFyaWFibGUgbm90IGF2YWlsYWJsZS4iKTsKKwkgICAgcmV0dXJuIHJlZ3ZhbDsKKwkgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMT0NfVU5SRVNPTFZFRDoKKyAgICAgIHsKKwlzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW07CisKKwltc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sIChTWU1CT0xfTkFNRSAodmFyKSwgTlVMTCwgTlVMTCk7CisJaWYgKG1zeW0gPT0gTlVMTCkKKwkgIHJldHVybiAwOworCWlmIChvdmVybGF5X2RlYnVnZ2luZykKKwkgIGFkZHIgPSBzeW1ib2xfb3ZlcmxheWVkX2FkZHJlc3MgKFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltKSwKKwkJCQkJICAgU1lNQk9MX0JGRF9TRUNUSU9OIChtc3ltKSk7CisJZWxzZQorCSAgYWRkciA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMT0NfT1BUSU1JWkVEX09VVDoKKyAgICAgIFZBTFVFX0xWQUwgKHYpID0gbm90X2x2YWw7CisgICAgICBWQUxVRV9PUFRJTUlaRURfT1VUICh2KSA9IDE7CisgICAgICByZXR1cm4gdjsKKworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciAoIkNhbm5vdCBsb29rIHVwIHZhbHVlIG9mIGEgYm90Y2hlZCBzeW1ib2wuIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgVkFMVUVfQUREUkVTUyAodikgPSBhZGRyOworICBWQUxVRV9MQVpZICh2KSA9IDE7CisgIHJldHVybiB2OworfQorCisvKiBSZXR1cm4gYSB2YWx1ZSBvZiB0eXBlIFRZUEUsIHN0b3JlZCBpbiByZWdpc3RlciBSRUdOVU0sIGluIGZyYW1lCisgICBGUkFNRS4gCisKKyAgIE5PVEU6IHJldHVybnMgTlVMTCBpZiByZWdpc3RlciB2YWx1ZSBpcyBub3QgYXZhaWxhYmxlLgorICAgQ2FsbGVyIHdpbGwgY2hlY2sgcmV0dXJuIHZhbHVlIG9yIGRpZSEgICovCisKK3ZhbHVlX3B0cgordmFsdWVfZnJvbV9yZWdpc3RlciAodHlwZSwgcmVnbnVtLCBmcmFtZSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGludCByZWdudW07CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgY2hhciByYXdfYnVmZmVyIFtNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworICBDT1JFX0FERFIgYWRkcjsKKyAgaW50IG9wdGltOworICB2YWx1ZV9wdHIgdiA9IGFsbG9jYXRlX3ZhbHVlICh0eXBlKTsKKyAgY2hhciAqdmFsdWVfYnl0ZXMgPSAwOworICBpbnQgdmFsdWVfYnl0ZXNfY29waWVkID0gMDsKKyAgaW50IG51bV9zdG9yYWdlX2xvY3M7CisgIGVudW0gbHZhbF90eXBlIGx2YWw7CisgIGludCBsZW47CisKKyAgQ0hFQ0tfVFlQRURFRiAodHlwZSk7CisgIGxlbiA9IFRZUEVfTEVOR1RIICh0eXBlKTsKKworICBWQUxVRV9SRUdOTyAodikgPSByZWdudW07CisKKyAgbnVtX3N0b3JhZ2VfbG9jcyA9IChsZW4gPiBSRUdJU1RFUl9WSVJUVUFMX1NJWkUgKHJlZ251bSkgPworCQkgICAgICAoKGxlbiAtIDEpIC8gUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSkpICsgMSA6CisJCSAgICAgIDEpOworCisgIGlmIChudW1fc3RvcmFnZV9sb2NzID4gMQorI2lmZGVmIEdEQl9UQVJHRVRfSVNfSDg1MDAKKyAgICAgIHx8IFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1BUUgorI2VuZGlmCisgICAgICApCisgICAgeworICAgICAgLyogVmFsdWUgc3ByZWFkIGFjcm9zcyBtdWx0aXBsZSBzdG9yYWdlIGxvY2F0aW9ucy4gICovCisgICAgICAKKyAgICAgIGludCBsb2NhbF9yZWdudW07CisgICAgICBpbnQgbWVtX3N0b3IgPSAwLCByZWdfc3RvciA9IDA7CisgICAgICBpbnQgbWVtX3RyYWNraW5nID0gMTsKKyAgICAgIENPUkVfQUREUiBsYXN0X2FkZHIgPSAwOworICAgICAgQ09SRV9BRERSIGZpcnN0X2FkZHIgPSAwOworCisgICAgICB2YWx1ZV9ieXRlcyA9IChjaGFyICopIGFsbG9jYSAobGVuICsgTUFYX1JFR0lTVEVSX1JBV19TSVpFKTsKKworICAgICAgLyogQ29weSBhbGwgb2YgdGhlIGRhdGEgb3V0LCB3aGVyZWV2ZXIgaXQgbWF5IGJlLiAgKi8KKworI2lmZGVmIEdEQl9UQVJHRVRfSVNfSDg1MDAKKy8qIFRoaXMgcGllY2Ugb2YgaGlkZW9zaXR5IGlzIHJlcXVpcmVkIGJlY2F1c2UgdGhlIEg4NTAwIHRyZWF0cyByZWdpc3RlcnMKKyAgIGRpZmZlcmVudGx5IGRlcGVuZGluZyB1cG9uIHdoZXRoZXIgdGhleSBhcmUgdXNlZCBhcyBwb2ludGVycyBvciBub3QuICBBcyBhCisgICBwb2ludGVyLCBhIHJlZ2lzdGVyIG5lZWRzIHRvIGhhdmUgYSBwYWdlIHJlZ2lzdGVyIHRhY2tlZCBvbnRvIHRoZSBmcm9udC4KKyAgIEFuIGFsdGVybmF0ZSB3YXkgdG8gZG8gdGhpcyB3b3VsZCBiZSB0byBoYXZlIGdjYyBvdXRwdXQgZGlmZmVyZW50IHJlZ2lzdGVyCisgICBudW1iZXJzIGZvciB0aGUgcG9pbnRlciAmIG5vbi1wb2ludGVyIGZvcm0gb2YgdGhlIHJlZ2lzdGVyLiAgQnV0LCBpdAorICAgZG9lc24ndCwgc28gd2UncmUgc3R1Y2sgd2l0aCB0aGlzLiAgKi8KKworICAgICAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1BUUgorCSAgJiYgbGVuID4gMikKKwl7CisJICBpbnQgcGFnZV9yZWdudW07CisKKwkgIHN3aXRjaCAocmVnbnVtKQorCSAgICB7CisJICAgIGNhc2UgUjBfUkVHTlVNOiBjYXNlIFIxX1JFR05VTTogY2FzZSBSMl9SRUdOVU06IGNhc2UgUjNfUkVHTlVNOgorCSAgICAgIHBhZ2VfcmVnbnVtID0gU0VHX0RfUkVHTlVNOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFI0X1JFR05VTTogY2FzZSBSNV9SRUdOVU06CisJICAgICAgcGFnZV9yZWdudW0gPSBTRUdfRV9SRUdOVU07CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUjZfUkVHTlVNOiBjYXNlIFI3X1JFR05VTToKKwkgICAgICBwYWdlX3JlZ251bSA9IFNFR19UX1JFR05VTTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICB2YWx1ZV9ieXRlc1swXSA9IDA7CisJICBnZXRfc2F2ZWRfcmVnaXN0ZXIgKHZhbHVlX2J5dGVzICsgMSwKKwkJCSAgICAgICZvcHRpbSwKKwkJCSAgICAgICZhZGRyLAorCQkJICAgICAgZnJhbWUsCisJCQkgICAgICBwYWdlX3JlZ251bSwKKwkJCSAgICAgICZsdmFsKTsKKworCSAgaWYgKHJlZ2lzdGVyX3ZhbGlkW3BhZ2VfcmVnbnVtXSA9PSAtMSkKKwkgICAgcmV0dXJuIE5VTEw7CS8qIHJlZ2lzdGVyIHZhbHVlIG5vdCBhdmFpbGFibGUgKi8KKworCSAgaWYgKGx2YWwgPT0gbHZhbF9yZWdpc3RlcikKKwkgICAgcmVnX3N0b3IrKzsKKwkgIGVsc2UKKwkgICAgbWVtX3N0b3IrKzsKKwkgIGZpcnN0X2FkZHIgPSBhZGRyOworCSAgbGFzdF9hZGRyID0gYWRkcjsKKworCSAgZ2V0X3NhdmVkX3JlZ2lzdGVyICh2YWx1ZV9ieXRlcyArIDIsCisJCQkgICAgICAmb3B0aW0sCisJCQkgICAgICAmYWRkciwKKwkJCSAgICAgIGZyYW1lLAorCQkJICAgICAgcmVnbnVtLAorCQkJICAgICAgJmx2YWwpOworCisJICBpZiAocmVnaXN0ZXJfdmFsaWRbcmVnbnVtXSA9PSAtMSkKKwkgICAgcmV0dXJuIE5VTEw7CS8qIHJlZ2lzdGVyIHZhbHVlIG5vdCBhdmFpbGFibGUgKi8KKworCSAgaWYgKGx2YWwgPT0gbHZhbF9yZWdpc3RlcikKKwkgICAgcmVnX3N0b3IrKzsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG1lbV9zdG9yKys7CisJICAgICAgbWVtX3RyYWNraW5nID0gbWVtX3RyYWNraW5nICYmIChhZGRyID09IGxhc3RfYWRkcik7CisJICAgIH0KKwkgIGxhc3RfYWRkciA9IGFkZHI7CisJfQorICAgICAgZWxzZQorI2VuZGlmCQkJCS8qIEdEQl9UQVJHRVRfSVNfSDg1MDAgKi8KKwlmb3IgKGxvY2FsX3JlZ251bSA9IHJlZ251bTsKKwkgICAgIHZhbHVlX2J5dGVzX2NvcGllZCA8IGxlbjsKKwkgICAgICh2YWx1ZV9ieXRlc19jb3BpZWQgKz0gUkVHSVNURVJfUkFXX1NJWkUgKGxvY2FsX3JlZ251bSksCisJICAgICAgKytsb2NhbF9yZWdudW0pKQorCSAgeworCSAgICBnZXRfc2F2ZWRfcmVnaXN0ZXIgKHZhbHVlX2J5dGVzICsgdmFsdWVfYnl0ZXNfY29waWVkLAorCQkJCSZvcHRpbSwKKwkJCQkmYWRkciwKKwkJCQlmcmFtZSwKKwkJCQlsb2NhbF9yZWdudW0sCisJCQkJJmx2YWwpOworCisJICBpZiAocmVnaXN0ZXJfdmFsaWRbbG9jYWxfcmVnbnVtXSA9PSAtMSkKKwkgICAgcmV0dXJuIE5VTEw7CS8qIHJlZ2lzdGVyIHZhbHVlIG5vdCBhdmFpbGFibGUgKi8KKworCSAgICBpZiAocmVnbnVtID09IGxvY2FsX3JlZ251bSkKKwkgICAgICBmaXJzdF9hZGRyID0gYWRkcjsKKwkgICAgaWYgKGx2YWwgPT0gbHZhbF9yZWdpc3RlcikKKwkgICAgICByZWdfc3RvcisrOworCSAgICBlbHNlCisJICAgICAgeworCQltZW1fc3RvcisrOworCSAgICAgIAorCQltZW1fdHJhY2tpbmcgPQorCQkgIChtZW1fdHJhY2tpbmcKKwkJICAgJiYgKHJlZ251bSA9PSBsb2NhbF9yZWdudW0KKwkJICAgICAgIHx8IGFkZHIgPT0gbGFzdF9hZGRyKSk7CisJICAgICAgfQorCSAgICBsYXN0X2FkZHIgPSBhZGRyOworCSAgfQorCisgICAgICBpZiAoKHJlZ19zdG9yICYmIG1lbV9zdG9yKQorCSAgfHwgKG1lbV9zdG9yICYmICFtZW1fdHJhY2tpbmcpKQorCS8qIE1peGVkIHN0b3JhZ2U7IGFsbCBvZiB0aGUgaGFzc2xlIHdlIGp1c3Qgd2VudCB0aHJvdWdoIHdhcworCSAgIGZvciBzb21lIGdvb2QgcHVycG9zZS4gICovCisJeworCSAgVkFMVUVfTFZBTCAodikgPSBsdmFsX3JlZ19mcmFtZV9yZWxhdGl2ZTsKKwkgIFZBTFVFX0ZSQU1FICh2KSA9IEZSQU1FX0ZQIChmcmFtZSk7CisJICBWQUxVRV9GUkFNRV9SRUdOVU0gKHYpID0gcmVnbnVtOworCX0KKyAgICAgIGVsc2UgaWYgKG1lbV9zdG9yKQorCXsKKwkgIFZBTFVFX0xWQUwgKHYpID0gbHZhbF9tZW1vcnk7CisJICBWQUxVRV9BRERSRVNTICh2KSA9IGZpcnN0X2FkZHI7CisJfQorICAgICAgZWxzZSBpZiAocmVnX3N0b3IpCisJeworCSAgVkFMVUVfTFZBTCAodikgPSBsdmFsX3JlZ2lzdGVyOworCSAgVkFMVUVfQUREUkVTUyAodikgPSBmaXJzdF9hZGRyOworCX0KKyAgICAgIGVsc2UKKwlmYXRhbCAoInZhbHVlX2Zyb21fcmVnaXN0ZXI6IFZhbHVlIG5vdCBzdG9yZWQgYW55d2hlcmUhIik7CisKKyAgICAgIFZBTFVFX09QVElNSVpFRF9PVVQgKHYpID0gb3B0aW07CisKKyAgICAgIC8qIEFueSBzdHJ1Y3R1cmUgc3RvcmVkIGluIG1vcmUgdGhhbiBvbmUgcmVnaXN0ZXIgd2lsbCBhbHdheXMgYmUKKwkgYW4gaW50ZWdyYWwgbnVtYmVyIG9mIHJlZ2lzdGVycy4gIE90aGVyd2lzZSwgeW91J2QgbmVlZCB0byBkbworCSBzb21lIGZpZGRsaW5nIHdpdGggdGhlIGxhc3QgcmVnaXN0ZXIgY29waWVkIGhlcmUgZm9yIGxpdHRsZQorCSBlbmRpYW4gbWFjaGluZXMuICAqLworCisgICAgICAvKiBDb3B5IGludG8gdGhlIGNvbnRlbnRzIHNlY3Rpb24gb2YgdGhlIHZhbHVlLiAgKi8KKyAgICAgIG1lbWNweSAoVkFMVUVfQ09OVEVOVFNfUkFXICh2KSwgdmFsdWVfYnl0ZXMsIGxlbik7CisKKyAgICAgIC8qIEZpbmFsbHkgZG8gYW55IGNvbnZlcnNpb24gbmVjZXNzYXJ5IHdoZW4gZXh0cmFjdGluZyB0aGlzCisgICAgICAgICB0eXBlIGZyb20gbW9yZSB0aGFuIG9uZSByZWdpc3Rlci4gICovCisjaWZkZWYgUkVHSVNURVJfQ09OVkVSVF9UT19UWVBFCisgICAgICBSRUdJU1RFUl9DT05WRVJUX1RPX1RZUEUocmVnbnVtLCB0eXBlLCBWQUxVRV9DT05URU5UU19SQVcodikpOworI2VuZGlmCisgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgLyogRGF0YSBpcyBjb21wbGV0ZWx5IGNvbnRhaW5lZCB3aXRoaW4gYSBzaW5nbGUgcmVnaXN0ZXIuICBMb2NhdGUgdGhlCisgICAgIHJlZ2lzdGVyJ3MgY29udGVudHMgaW4gYSByZWFsIHJlZ2lzdGVyIG9yIGluIGNvcmU7CisgICAgIHJlYWQgdGhlIGRhdGEgaW4gcmF3IGZvcm1hdC4gICovCisKKyAgZ2V0X3NhdmVkX3JlZ2lzdGVyIChyYXdfYnVmZmVyLCAmb3B0aW0sICZhZGRyLCBmcmFtZSwgcmVnbnVtLCAmbHZhbCk7CisKKyAgaWYgKHJlZ2lzdGVyX3ZhbGlkW3JlZ251bV0gPT0gLTEpCisgICAgcmV0dXJuIE5VTEw7CS8qIHJlZ2lzdGVyIHZhbHVlIG5vdCBhdmFpbGFibGUgKi8KKworICBWQUxVRV9PUFRJTUlaRURfT1VUICh2KSA9IG9wdGltOworICBWQUxVRV9MVkFMICh2KSA9IGx2YWw7CisgIFZBTFVFX0FERFJFU1MgKHYpID0gYWRkcjsKKworICAvKiBDb252ZXJ0IHJhdyBkYXRhIHRvIHZpcnR1YWwgZm9ybWF0IGlmIG5lY2Vzc2FyeS4gICovCisgIAorI2lmZGVmIFJFR0lTVEVSX0NPTlZFUlRJQkxFCisgIGlmIChSRUdJU1RFUl9DT05WRVJUSUJMRSAocmVnbnVtKSkKKyAgICB7CisgICAgICBSRUdJU1RFUl9DT05WRVJUX1RPX1ZJUlRVQUwgKHJlZ251bSwgdHlwZSwKKwkJCQkgICByYXdfYnVmZmVyLCBWQUxVRV9DT05URU5UU19SQVcgKHYpKTsKKyAgICB9CisgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIC8qIFJhdyBhbmQgdmlydHVhbCBmb3JtYXRzIGFyZSB0aGUgc2FtZSBmb3IgdGhpcyByZWdpc3Rlci4gICovCisKKyAgICAgIGlmIChUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOICYmIGxlbiA8IFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pKQorCXsKKyAgCSAgLyogQmlnLWVuZGlhbiwgYW5kIHdlIHdhbnQgbGVzcyB0aGFuIGZ1bGwgc2l6ZS4gICovCisJICBWQUxVRV9PRkZTRVQgKHYpID0gUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSkgLSBsZW47CisJfQorCisgICAgICBtZW1jcHkgKFZBTFVFX0NPTlRFTlRTX1JBVyAodiksIHJhd19idWZmZXIgKyBWQUxVRV9PRkZTRVQgKHYpLCBsZW4pOworICAgIH0KKyAgCisgIHJldHVybiB2OworfQorDAorLyogR2l2ZW4gYSBzdHJ1Y3Qgc3ltYm9sIGZvciBhIHZhcmlhYmxlIG9yIGZ1bmN0aW9uLAorICAgYW5kIGEgc3RhY2sgZnJhbWUgaWQsIAorICAgcmV0dXJuIGEgKHBvaW50ZXIgdG8gYSkgc3RydWN0IHZhbHVlIGNvbnRhaW5pbmcgdGhlIHByb3Blcmx5IHR5cGVkCisgICBhZGRyZXNzLiAgKi8KKwordmFsdWVfcHRyCitsb2NhdGVfdmFyX3ZhbHVlICh2YXIsIGZyYW1lKQorICAgICByZWdpc3RlciBzdHJ1Y3Qgc3ltYm9sICp2YXI7CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgQ09SRV9BRERSIGFkZHIgPSAwOworICBzdHJ1Y3QgdHlwZSAqdHlwZSA9IFNZTUJPTF9UWVBFICh2YXIpOworICB2YWx1ZV9wdHIgbGF6eV92YWx1ZTsKKworICAvKiBFdmFsdWF0ZSBpdCBmaXJzdDsgaWYgdGhlIHJlc3VsdCBpcyBhIG1lbW9yeSBhZGRyZXNzLCB3ZSdyZSBmaW5lLgorICAgICBMYXp5IGV2YWx1YXRpb24gcGF5cyBvZmYgaGVyZS4gKi8KKworICBsYXp5X3ZhbHVlID0gcmVhZF92YXJfdmFsdWUgKHZhciwgZnJhbWUpOworICBpZiAobGF6eV92YWx1ZSA9PSAwKQorICAgIGVycm9yICgiQWRkcmVzcyBvZiBcIiVzXCIgaXMgdW5rbm93bi4iLCBTWU1CT0xfU09VUkNFX05BTUUgKHZhcikpOworCisgIGlmIChWQUxVRV9MQVpZIChsYXp5X3ZhbHVlKQorICAgICAgfHwgVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfRlVOQykKKyAgICB7CisgICAgICB2YWx1ZV9wdHIgdmFsOworCisgICAgICBhZGRyID0gVkFMVUVfQUREUkVTUyAobGF6eV92YWx1ZSk7CisgICAgICB2YWwgPSAgdmFsdWVfZnJvbV9sb25nZXN0IChsb29rdXBfcG9pbnRlcl90eXBlICh0eXBlKSwgKExPTkdFU1QpIGFkZHIpOworICAgICAgVkFMVUVfQkZEX1NFQ1RJT04gKHZhbCkgPSBWQUxVRV9CRkRfU0VDVElPTiAobGF6eV92YWx1ZSk7CisgICAgICByZXR1cm4gdmFsOworICAgIH0KKworICAvKiBOb3QgYSBtZW1vcnkgYWRkcmVzczsgY2hlY2sgd2hhdCB0aGUgcHJvYmxlbSB3YXMuICAqLworICBzd2l0Y2ggKFZBTFVFX0xWQUwgKGxhenlfdmFsdWUpKSAKKyAgICB7CisgICAgY2FzZSBsdmFsX3JlZ2lzdGVyOgorICAgIGNhc2UgbHZhbF9yZWdfZnJhbWVfcmVsYXRpdmU6CisgICAgICBlcnJvciAoIkFkZHJlc3MgcmVxdWVzdGVkIGZvciBpZGVudGlmaWVyIFwiJXNcIiB3aGljaCBpcyBpbiBhIHJlZ2lzdGVyLiIsCisJICAgICBTWU1CT0xfU09VUkNFX05BTUUgKHZhcikpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IgKCJDYW4ndCB0YWtlIGFkZHJlc3Mgb2YgXCIlc1wiIHdoaWNoIGlzbid0IGFuIGx2YWx1ZS4iLAorCSAgICAgU1lNQk9MX1NPVVJDRV9OQU1FICh2YXIpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIDA7ICAvKiBGb3IgbGludCAtLSBuZXZlciByZWFjaGVkICovCit9CmRpZmYgLS1naXQgYS9nZGIvZm9yay1jaGlsZC5jIGIvZ2RiL2ZvcmstY2hpbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzUwNGJjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2ZvcmstY2hpbGQuYwpAQCAtMCwwICsxLDYxNiBAQAorLyogRm9yayBhIFVuaXggY2hpbGQgcHJvY2VzcywgYW5kIHNldCB1cCB0byBkZWJ1ZyBpdCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIJCS8qIHJlcXVpcmVkIGJ5IGluZmVyaW9yLmggKi8KKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgIndhaXQuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAidGVybWluYWwuaCIKKyNpbmNsdWRlICJnZGJ0aHJlYWQuaCIKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjZGVmaW5lIERFQlVHR0lORyAwCisKKy8qIFRoaXMganVzdCBnZXRzIHVzZWQgYXMgYSBkZWZhdWx0IGlmIHdlIGNhbid0IGZpbmQgU0hFTEwgKi8KKyNpZm5kZWYgU0hFTExfRklMRQorI2RlZmluZSBTSEVMTF9GSUxFICIvYmluL3NoIgorI2VuZGlmCisKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKworLyogVGhpcyBmdW5jdGlvbiBicmVha3MgdXAgYW4gYXJndW1lbnQgc3RyaW5nIGludG8gYW4gYXJndW1lbnQKKyAqIHZlY3RvciBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBleGVjdnAoKS4KKyAqIEUuZy4sIG9uICJydW4gYSBiIGMgZCIgdGhpcyByb3V0aW5lIHdvdWxkIGdldCBhcyBpbnB1dAorICogdGhlIHN0cmluZyAiYSBiIGMgZCIsIGFuZCBhcyBvdXRwdXQgaXQgd291bGQgZmlsbCBpbiBhcmd2IHdpdGgKKyAqIHRoZSBmb3VyIGFyZ3VtZW50cyAiYSIsICJiIiwgImMiLCAiZCIuCisgKi8KK3N0YXRpYyB2b2lkCiticmVha3VwX2FyZ3MgKAorCSAgICAgICBzY3JhdGNoLAorCSAgICAgICBhcmd2KQorICAgICBjaGFyICpzY3JhdGNoOworICAgICBjaGFyICoqYXJndjsKK3sKKyAgY2hhciAqY3AgPSBzY3JhdGNoOworCisjaWYgREVCVUdHSU5HCisgIHByaW50ZiAoImJyZWFrdXBfYXJnczogaW5wdXQgPSAlc1xuIiwgc2NyYXRjaCk7CisjZW5kaWYKKyAgZm9yICg7OykKKyAgICB7CisKKyAgICAgIC8qIFNjYW4gcGFzdCBsZWFkaW5nIHNlcGFyYXRvcnMgKi8KKyAgICAgIHdoaWxlICgqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnIHx8ICpjcCA9PSAnXG4nKQorCXsKKwkgIGNwKys7CisJfQorCisgICAgICAvKiBCcmVhayBpZiBhdCBlbmQgb2Ygc3RyaW5nICovCisgICAgICBpZiAoKmNwID09ICdcMCcpCisJYnJlYWs7CisKKyAgICAgIC8qIFRha2UgYW4gYXJnICovCisgICAgICAqYXJndisrID0gY3A7CisKKyAgICAgIC8qIFNjYW4gZm9yIG5leHQgYXJnIHNlcGFyYXRvciAqLworICAgICAgY3AgPSBzdHJjaHIgKGNwLCAnICcpOworICAgICAgaWYgKGNwID09IE5VTEwpCisJY3AgPSBzdHJjaHIgKGNwLCAnXHQnKTsKKyAgICAgIGlmIChjcCA9PSBOVUxMKQorCWNwID0gc3RyY2hyIChjcCwgJ1xuJyk7CisKKyAgICAgIC8qIE5vIHNlcGFyYXRvcnMgPT4gZW5kIG9mIHN0cmluZyA9PiBicmVhayAqLworICAgICAgaWYgKGNwID09IE5VTEwpCisJYnJlYWs7CisKKyAgICAgIC8qIFJlcGxhY2UgdGhlIHNlcGFyYXRvciB3aXRoIGEgdGVybWluYXRvciAqLworICAgICAgKmNwKysgPSAnXDAnOworICAgIH0KKworICAvKiBleGVjdiByZXF1aXJlcyBhIG51bGwtdGVybWluYXRlZCBhcmcgdmVjdG9yICovCisgICphcmd2ID0gTlVMTDsKKworfQorCisKKy8qIFN0YXJ0IGFuIGluZmVyaW9yIFVuaXggY2hpbGQgcHJvY2VzcyBhbmQgc2V0cyBpbmZlcmlvcl9waWQgdG8gaXRzIHBpZC4KKyAgIEVYRUNfRklMRSBpcyB0aGUgZmlsZSB0byBydW4uCisgICBBTExBUkdTIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cyB0byB0aGUgcHJvZ3JhbS4KKyAgIEVOViBpcyB0aGUgZW52aXJvbm1lbnQgdmVjdG9yIHRvIHBhc3MuICBTSEVMTF9GSUxFIGlzIHRoZSBzaGVsbCBmaWxlLAorICAgb3IgTlVMTCBpZiB3ZSBzaG91bGQgcGljayBvbmUuICBFcnJvcnMgcmVwb3J0ZWQgd2l0aCBlcnJvcigpLiAgKi8KKwordm9pZAorZm9ya19pbmZlcmlvciAoZXhlY19maWxlLCBhbGxhcmdzLCBlbnYsIHRyYWNlbWVfZnVuLCBpbml0X3RyYWNlX2Z1biwKKwkgICAgICAgcHJlX3RyYWNlX2Z1biwgc2hlbGxfZmlsZSkKKyAgICAgY2hhciAqZXhlY19maWxlOworICAgICBjaGFyICphbGxhcmdzOworICAgICBjaGFyICoqZW52OworICAgICB2b2lkICgqdHJhY2VtZV9mdW4pIFBBUkFNUyAoKHZvaWQpKTsKKyAgICAgdm9pZCAoKmluaXRfdHJhY2VfZnVuKSBQQVJBTVMgKChpbnQpKTsKKyAgICAgdm9pZCAoKnByZV90cmFjZV9mdW4pIFBBUkFNUyAoKHZvaWQpKTsKKyAgICAgY2hhciAqc2hlbGxfZmlsZTsKK3sKKyAgaW50IHBpZDsKKyAgY2hhciAqc2hlbGxfY29tbWFuZDsKKyAgc3RhdGljIGNoYXIgZGVmYXVsdF9zaGVsbF9maWxlW10gPSBTSEVMTF9GSUxFOworICBpbnQgbGVuOworICAvKiBTZXQgZGVidWdfZm9yayB0aGVuIGF0dGFjaCB0byB0aGUgY2hpbGQgd2hpbGUgaXQgc2xlZXBzLCB0byBkZWJ1Zy4gKi8KKyAgc3RhdGljIGludCBkZWJ1Z19mb3JrID0gMDsKKyAgLyogVGhpcyBpcyBzZXQgdG8gdGhlIHJlc3VsdCBvZiBzZXRwZ3JwLCB3aGljaCBpZiB2Zm9ya2VkLCB3aWxsIGJlIHZpc2libGUKKyAgICAgdG8geW91IGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4gIEl0J3Mgb25seSB1c2VkIGJ5IGh1bWFucyBmb3IgZGVidWdnaW5nLiAgKi8KKyAgc3RhdGljIGludCBkZWJ1Z19zZXRwZ3JwID0gNjU3NDczOworICBjaGFyICoqc2F2ZV9vdXJfZW52OworICBpbnQgc2hlbGwgPSAwOworICBjaGFyICoqYXJndjsKKyAgY2hhciAqdHJ5bmFtZTsKKworICAvKiBJZiBubyBleGVjIGZpbGUgaGFuZGVkIHRvIHVzLCBnZXQgaXQgZnJvbSB0aGUgZXhlYy1maWxlIGNvbW1hbmQgLS0gd2l0aAorICAgICBhIGdvb2QsIGNvbW1vbiBlcnJvciBtZXNzYWdlIGlmIG5vbmUgaXMgc3BlY2lmaWVkLiAgKi8KKyAgaWYgKGV4ZWNfZmlsZSA9PSAwKQorICAgIGV4ZWNfZmlsZSA9IGdldF9leGVjX2ZpbGUgKDEpOworCisgIC8qIFNUQVJUVVBfV0lUSF9TSEVMTCBpcyBkZWZpbmVkIGluIGluZmVyaW9yLmguCisgICAqIElmIDAsIHdlJ2xsIGp1c3QgZG8gYSBmb3JrL2V4ZWMsIG5vIHNoZWxsLCBzbyBkb24ndAorICAgKiBib3RoZXIgZmlndXJpbmcgb3V0IHdoYXQgc2hlbGwuCisgICAqLworICBpZiAoU1RBUlRVUF9XSVRIX1NIRUxMKQorICAgIHsKKyAgICAgIC8qIEZpZ3VyZSBvdXQgd2hhdCBzaGVsbCB0byBzdGFydCB1cCB0aGUgdXNlciBwcm9ncmFtIHVuZGVyLiAqLworICAgICAgaWYgKHNoZWxsX2ZpbGUgPT0gTlVMTCkKKwlzaGVsbF9maWxlID0gZ2V0ZW52ICgiU0hFTEwiKTsKKyAgICAgIGlmIChzaGVsbF9maWxlID09IE5VTEwpCisJc2hlbGxfZmlsZSA9IGRlZmF1bHRfc2hlbGxfZmlsZTsKKyAgICAgIHNoZWxsID0gMTsKKyAgICB9CisKKyNpZiBERUJVR0dJTkcKKyAgcHJpbnRmICgic2hlbGwgaXMgJXNcbiIsIHNoZWxsX2ZpbGUpOworI2VuZGlmCisKKyAgLyogTXVsdGlwbHlpbmcgdGhlIGxlbmd0aCBvZiBleGVjX2ZpbGUgYnkgNCBpcyB0byBhY2NvdW50IGZvciB0aGUgZmFjdAorICAgICB0aGF0IGl0IG1heSBleHBhbmQgd2hlbiBxdW90ZWQ7IGl0IGlzIGEgd29yc3QtY2FzZSBudW1iZXIgYmFzZWQgb24KKyAgICAgZXZlcnkgY2hhcmFjdGVyIGJlaW5nICcuICAqLworICBsZW4gPSA1ICsgNCAqIHN0cmxlbiAoZXhlY19maWxlKSArIDEgKyBzdHJsZW4gKGFsbGFyZ3MpICsgMSArIC8qc2xvcCovIDEyOworICAvKiBJZiBkZXNpcmVkLCBjb25jYXQgc29tZXRoaW5nIG9udG8gdGhlIGZyb250IG9mIEFMTEFSR1MuCisgICAgIFNIRUxMX0NPTU1BTkQgaXMgdGhlIHJlc3VsdC4gICovCisjaWZkZWYgU0hFTExfQ09NTUFORF9DT05DQVQKKyAgc2hlbGxfY29tbWFuZCA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChTSEVMTF9DT01NQU5EX0NPTkNBVCkgKyBsZW4pOworICBzdHJjcHkgKHNoZWxsX2NvbW1hbmQsIFNIRUxMX0NPTU1BTkRfQ09OQ0FUKTsKKyNlbHNlCisgIHNoZWxsX2NvbW1hbmQgPSAoY2hhciAqKSBhbGxvY2EgKGxlbik7CisgIHNoZWxsX2NvbW1hbmRbMF0gPSAnXDAnOworI2VuZGlmCisKKyAgaWYgKCFzaGVsbCkKKyAgICB7CisgICAgICAvKiBXZSdyZSBnb2luZyB0byBjYWxsIGV4ZWN2cC4gQ3JlYXRlIGFyZ3YgKi8KKyAgICAgIC8qIExhcmdlc3QgY2FzZTogZXZlcnkgb3RoZXIgY2hhcmFjdGVyIGlzIGEgc2VwYXJhdGUgYXJnICovCisjaWYgREVCVUdHSU5HCisgICAgICBwcmludGYgKCJhbGxvY2F0aW5nIGFyZ3YsIGxlbmd0aCA9ICVkXG4iLAorCSAgICAgICgKKwkJKHN0cmxlbiAoYWxsYXJncykgKyAxKSAvICh1bnNpZ25lZCkgMgorCQkrIDIKKwkgICAgICApICogc2l6ZW9mICgqYXJndikKKwkpOworI2VuZGlmCisgICAgICBhcmd2ID0gKGNoYXIgKiopIHhtYWxsb2MgKCgoc3RybGVuIChhbGxhcmdzKSArIDEpIC8gKHVuc2lnbmVkKSAyICsgMikgKiBzaXplb2YgKCphcmd2KSk7CisgICAgICBhcmd2WzBdID0gZXhlY19maWxlOworICAgICAgYnJlYWt1cF9hcmdzIChhbGxhcmdzLCAmYXJndlsxXSk7CisKKyAgICB9CisgIGVsc2UKKyAgICB7CisKKyAgICAgIC8qIFdlJ3JlIGdvaW5nIHRvIGNhbGwgYSBzaGVsbCAqLworCisgICAgICAvKiBOb3cgYWRkIGV4ZWNfZmlsZSwgcXVvdGluZyBhcyBuZWNlc3NhcnkuICAqLworCisgICAgICBjaGFyICpwOworICAgICAgaW50IG5lZWRfdG9fcXVvdGU7CisKKyAgICAgIHN0cmNhdCAoc2hlbGxfY29tbWFuZCwgImV4ZWMgIik7CisKKyAgICAgIC8qIFF1b3RpbmcgaW4gdGhpcyBzdHlsZSBpcyBzYWlkIHRvIHdvcmsgd2l0aCBhbGwgc2hlbGxzLiAgQnV0IGNzaAorICAgICAgIG9uIElSSVggNC4wLjEgY2FuJ3QgZGVhbCB3aXRoIGl0LiAgU28gd2Ugb25seSBxdW90ZSBpdCBpZiB3ZSBuZWVkCisgICAgICAgdG8uICAqLworICAgICAgcCA9IGV4ZWNfZmlsZTsKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIHN3aXRjaCAoKnApCisJICAgIHsKKwkgICAgY2FzZSAnXCcnOgorCSAgICBjYXNlICciJzoKKwkgICAgY2FzZSAnKCc6CisJICAgIGNhc2UgJyknOgorCSAgICBjYXNlICckJzoKKwkgICAgY2FzZSAnJic6CisJICAgIGNhc2UgJzsnOgorCSAgICBjYXNlICc8JzoKKwkgICAgY2FzZSAnPic6CisJICAgIGNhc2UgJyAnOgorCSAgICBjYXNlICdcbic6CisJICAgIGNhc2UgJ1x0JzoKKwkgICAgICBuZWVkX3RvX3F1b3RlID0gMTsKKwkgICAgICBnb3RvIGVuZF9zY2FuOworCisJICAgIGNhc2UgJ1wwJzoKKwkgICAgICBuZWVkX3RvX3F1b3RlID0gMDsKKwkgICAgICBnb3RvIGVuZF9zY2FuOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICsrcDsKKwl9CisgICAgZW5kX3NjYW46CisgICAgICBpZiAobmVlZF90b19xdW90ZSkKKwl7CisJICBzdHJjYXQgKHNoZWxsX2NvbW1hbmQsICInIik7CisJICBmb3IgKHAgPSBleGVjX2ZpbGU7ICpwICE9ICdcMCc7ICsrcCkKKwkgICAgeworCSAgICAgIGlmICgqcCA9PSAnXCcnKQorCQlzdHJjYXQgKHNoZWxsX2NvbW1hbmQsICInXFwnJyIpOworCSAgICAgIGVsc2UKKwkJc3RybmNhdCAoc2hlbGxfY29tbWFuZCwgcCwgMSk7CisJICAgIH0KKwkgIHN0cmNhdCAoc2hlbGxfY29tbWFuZCwgIiciKTsKKwl9CisgICAgICBlbHNlCisJc3RyY2F0IChzaGVsbF9jb21tYW5kLCBleGVjX2ZpbGUpOworCisgICAgICBzdHJjYXQgKHNoZWxsX2NvbW1hbmQsICIgIik7CisgICAgICBzdHJjYXQgKHNoZWxsX2NvbW1hbmQsIGFsbGFyZ3MpOworCisgICAgfQorCisgIC8qIGV4ZWMgaXMgc2FpZCB0byBmYWlsIGlmIHRoZSBleGVjdXRhYmxlIGlzIG9wZW4uICAqLworICBjbG9zZV9leGVjX2ZpbGUgKCk7CisKKyAgLyogUmV0YWluIGEgY29weSBvZiBvdXIgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBzaW5jZSB0aGUgY2hpbGQgd2lsbAorICAgICByZXBsYWNlIHRoZSB2YWx1ZSBvZiAgZW52aXJvbiAgYW5kIGlmIHdlJ3JlIHZmb3JrZWQsIHdlIGhhdmUgdG8KKyAgICAgcmVzdG9yZSBpdC4gICovCisgIHNhdmVfb3VyX2VudiA9IGVudmlyb247CisKKyAgLyogVGVsbCB0aGUgdGVybWluYWwgaGFuZGxpbmcgc3Vic3lzdGVtIHdoYXQgdHR5IHdlIHBsYW4gdG8gcnVuIG9uOworICAgICBpdCB3aWxsIGp1c3QgcmVjb3JkIHRoZSBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIuICAqLworCisgIG5ld190dHlfcHJlZm9yayAoaW5mZXJpb3JfaW9fdGVybWluYWwpOworCisgIC8qIEl0IGlzIGdlbmVyYWxseSBnb29kIHByYWN0aWNlIHRvIGZsdXNoIGFueSBwb3NzaWJsZSBwZW5kaW5nIHN0ZGlvCisgICAgIG91dHB1dCBwcmlvciB0byBkb2luZyBhIGZvcmssIHRvIGF2b2lkIHRoZSBwb3NzaWJpbGl0eSBvZiBib3RoIHRoZQorICAgICBwYXJlbnQgYW5kIGNoaWxkIGZsdXNoaW5nIHRoZSBzYW1lIGRhdGEgYWZ0ZXIgdGhlIGZvcmsuICovCisKKyAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgZ2RiX2ZsdXNoIChnZGJfc3RkZXJyKTsKKworICAvKiBJZiB0aGVyZSdzIGFueSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdGFyZ2V0IGxheWVycyB0aGF0IG11c3QgaGFwcGVuCisgICB0byBwcmVwYXJlIHRvIGhhbmRsZSB0aGUgY2hpbGQgd2UncmUgYWJvdXQgZm9yaywgZG8gaXQgbm93Li4uCisgICAqLworICBpZiAocHJlX3RyYWNlX2Z1biAhPSBOVUxMKQorICAgICgqcHJlX3RyYWNlX2Z1bikgKCk7CisKKyNpZiBkZWZpbmVkKFVTRykgJiYgIWRlZmluZWQoSEFWRV9WRk9SSykKKyAgcGlkID0gZm9yayAoKTsKKyNlbHNlCisgIGlmIChkZWJ1Z19mb3JrKQorICAgIHBpZCA9IGZvcmsgKCk7CisgIGVsc2UKKyAgICBwaWQgPSB2Zm9yayAoKTsKKyNlbmRpZgorCisgIGlmIChwaWQgPCAwKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJ2Zm9yayIpOworCisgIGlmIChwaWQgPT0gMCkKKyAgICB7CisgICAgICBpZiAoZGVidWdfZm9yaykKKwlzbGVlcCAoZGVidWdfZm9yayk7CisKKyAgICAgIC8qIFJ1biBpbmZlcmlvciBpbiBhIHNlcGFyYXRlIHByb2Nlc3MgZ3JvdXAuICAqLworICAgICAgZGVidWdfc2V0cGdycCA9IGdkYl9zZXRwZ2lkICgpOworICAgICAgaWYgKGRlYnVnX3NldHBncnAgPT0gLTEpCisJcGVycm9yICgic2V0cGdycCBmYWlsZWQgaW4gY2hpbGQiKTsKKworICAgICAgLyogQXNrIHRoZSB0dHkgc3Vic3lzdGVtIHRvIHN3aXRjaCB0byB0aGUgb25lIHdlIHNwZWNpZmllZCBlYXJsaWVyCisJIChvciB0byBzaGFyZSB0aGUgY3VycmVudCB0ZXJtaW5hbCwgaWYgbm9uZSB3YXMgc3BlY2lmaWVkKS4gICovCisKKyAgICAgIG5ld190dHkgKCk7CisKKyAgICAgIC8qIENoYW5naW5nIHRoZSBzaWduYWwgaGFuZGxlcnMgZm9yIHRoZSBpbmZlcmlvciBhZnRlcgorCSBhIHZmb3JrIGNhbiBhbHNvIGNoYW5nZSB0aGVtIGZvciB0aGUgc3VwZXJpb3IsIHNvIHdlIGRvbid0IG1lc3MKKwkgd2l0aCBzaWduYWxzIGhlcmUuICBTZWUgY29tbWVudHMgaW4KKwkgaW5pdGlhbGl6ZV9zaWduYWxzIGZvciBob3cgd2UgZ2V0IHRoZSByaWdodCBzaWduYWwgaGFuZGxlcnMKKwkgZm9yIHRoZSBpbmZlcmlvci4gICovCisKKyAgICAgIC8qICJUcmFjZSBtZSwgRHIuIE1lbW9yeSEiICovCisgICAgICAoKnRyYWNlbWVfZnVuKSAoKTsKKyAgICAgIC8qIFRoZSBjYWxsIGFib3ZlIHNldCB0aGlzIHByb2Nlc3MgKHRoZSAiY2hpbGQiKSBhcyBkZWJ1Z2dhYmxlCisgICAgICAgKiBieSB0aGUgb3JpZ2luYWwgZ2RiIHByb2Nlc3MgKHRoZSAicGFyZW50IikuICBTaW5jZSBwcm9jZXNzZXMKKyAgICAgICAqICh1bmxpa2UgcGVvcGxlKSBjYW4gaGF2ZSBvbmx5IG9uZSBwYXJlbnQsIGlmIHlvdSBhcmUKKyAgICAgICAqIGRlYnVnZ2luZyBnZGIgaXRzZWxmIChhbmQgeW91ciBkZWJ1Z2dlciBpcyB0aHVzIF9hbHJlYWR5XyB0aGUKKyAgICAgICAqIGNvbnRyb2xsZXIvcGFyZW50IGZvciB0aGlzIGNoaWxkKSwgIGNvZGUgZnJvbSBoZXJlIG9uIG91dAorICAgICAgICogaXMgdW5kZWJ1Z2dhYmxlLiAgSW5kZWVkLCB5b3UgcHJvYmFibHkgZ290IGFuIGVycm9yIG1lc3NhZ2UKKyAgICAgICAqIHNheWluZyAibm90IHBhcmVudCIuICBTb3JyeS0teW91J2xsIGhhdmUgdG8gdXNlIHByaW50IHN0YXRlbWVudHMhCisgICAgICAgKi8KKworICAgICAgLyogVGhlcmUgaXMgbm8gZXhlY2xwZSBjYWxsLCBzbyB3ZSBoYXZlIHRvIHNldCB0aGUgZW52aXJvbm1lbnQKKwkgZm9yIG91ciBjaGlsZCBpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlLiAgSWYgd2UndmUgdmZvcmtlZCwgdGhpcworCSBjbG9iYmVycyB0aGUgcGFyZW50LCBidXQgZW52aXJvbiBpcyByZXN0b3JlZCBhIGZldyBsaW5lcyBkb3duCisJIGluIHRoZSBwYXJlbnQuICBCeSB0aGUgd2F5LCB5ZXMgd2UgZG8gbmVlZCB0byBsb29rIGRvd24gdGhlCisJIHBhdGggdG8gZmluZCAkU0hFTEwuICBSaWNoIFBpeGxleSBzYXlzIHNvLCBhbmQgSSBhZ3JlZS4gICovCisgICAgICBlbnZpcm9uID0gZW52OworCisgICAgICAvKiBJZiB3ZSBkZWNpZGVkIGFib3ZlIHRvIHN0YXJ0IHVwIHdpdGggYSBzaGVsbCwKKyAgICAgICAqIHdlIGV4ZWMgdGhlIHNoZWxsLAorICAgICAgICogIi1jIiBzYXlzIHRvIGludGVycHJldCB0aGUgbmV4dCBhcmcgYXMgYSBzaGVsbCBjb21tYW5kCisgICAgICAgKiB0byBleGVjdXRlLCBhbmQgdGhpcyBjb21tYW5kIGlzICJleGVjIDx0YXJnZXQtcHJvZ3JhbT4gPGFyZ3M+Ii4KKyAgICAgICAqICItZiIgbWVhbnMgImZhc3Qgc3RhcnR1cCIgdG8gdGhlIGMtc2hlbGwsIHdoaWNoIG1lYW5zCisgICAgICAgKiBkb24ndCBkbyAuY3NocmMgZmlsZS4gRG9pbmcgLmNzaHJjIG1heSBjYXVzZSBmb3JrL2V4ZWMKKyAgICAgICAqIGV2ZW50cyB3aGljaCB3aWxsIGNvbmZ1c2UgZGVidWdnZXIgc3RhcnQtdXAgY29kZS4KKyAgICAgICAqLworICAgICAgaWYgKHNoZWxsKQorCXsKKyNpZiAwCisKKwkgIC8qIEhQIGNoYW5nZSBpcyBwcm9ibGVtYXRpYy4gVGhlIC1mIG9wdGlvbiBoYXMgZGlmZmVyZW50IG1lYW5pbmdzCisJICAgZm9yIGRpZmZlcmVudCBzaGVsbHMuIEl0IGlzIHBhcnRpY3VsYXJseSBpbmFwcHJvcHJpYXRlIGZvcgorCSAgIGJvdXJuZSBzaGVsbHMuICovCisJICBleGVjbHAgKHNoZWxsX2ZpbGUsIHNoZWxsX2ZpbGUsICItZiIsICItYyIsIHNoZWxsX2NvbW1hbmQsIChjaGFyICopIDApOworI2Vsc2UKKwkgIGV4ZWNscCAoc2hlbGxfZmlsZSwgc2hlbGxfZmlsZSwgIi1jIiwgc2hlbGxfY29tbWFuZCwgKGNoYXIgKikgMCk7CisjZW5kaWYKKworCisJICAvKiBJZiB3ZSBnZXQgaGVyZSwgaXQncyBhbiBlcnJvciAqLworCSAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiQ2Fubm90IGV4ZWMgJXM6ICVzLlxuIiwgc2hlbGxfZmlsZSwKKwkJCSAgICAgIHNhZmVfc3RyZXJyb3IgKGVycm5vKSk7CisJICBnZGJfZmx1c2ggKGdkYl9zdGRlcnIpOworCSAgX2V4aXQgKDAxNzcpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBPdGhlcndpc2UsIHdlIGRpcmVjdGx5IGV4ZWMgdGhlIHRhcmdldCBwcm9ncmFtIHdpdGggZXhlY3ZwLiAqLworCSAgaW50IGk7CisJICBjaGFyICplcnJzdHJpbmc7CisjaWYgREVCVUdHSU5HCisJICBwcmludGYgKCJhYm91dCB0byBleGVjIHRhcmdldCwgZXhlY19maWxlID0gJXNcbiIsIGV4ZWNfZmlsZSk7CisJICBpID0gMDsKKwkgIHdoaWxlIChhcmd2W2ldICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJzdHJsZW4oYXJndlslZF0pIGlzICVkXG4iLCBpLCBzdHJsZW4gKGFyZ3ZbaV0pKTsKKwkgICAgICBwcmludGYgKCJhcmd2WyVkXSBpcyAlc1xuIiwgaSwgYXJndltpXSk7CisJICAgICAgaSsrOworCSAgICB9CisjZW5kaWYKKwkgIGV4ZWN2cCAoZXhlY19maWxlLCBhcmd2KTsKKworCSAgLyogSWYgd2UgZ2V0IGhlcmUsIGl0J3MgYW4gZXJyb3IgKi8KKwkgIGVycnN0cmluZyA9IHNhZmVfc3RyZXJyb3IgKGVycm5vKTsKKwkgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIkNhbm5vdCBleGVjICVzICIsIGV4ZWNfZmlsZSk7CisKKwkgIGkgPSAxOworCSAgd2hpbGUgKGFyZ3ZbaV0gIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmIChpICE9IDEpCisJCWZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIiAiKTsKKwkgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICIlcyIsIGFyZ3ZbaV0pOworCSAgICAgIGkrKzsKKwkgICAgfQorCSAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiLlxuIik7CisJICAvKiBUaGlzIGV4dHJhIGluZm8gc2VlbXMgdG8gYmUgdXNlbGVzcworICAgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJHb3QgZXJyb3IgJXMuXG4iLCBlcnJzdHJpbmcpOworICAgICAgICAgKi8KKwkgIGdkYl9mbHVzaCAoZ2RiX3N0ZGVycik7CisJICBfZXhpdCAoMDE3Nyk7CisJfQorICAgIH0KKworICAvKiBSZXN0b3JlIG91ciBlbnZpcm9ubWVudCBpbiBjYXNlIGEgdmZvcmtlZCBjaGlsZCBjbG9iJ2QgaXQuICAqLworICBlbnZpcm9uID0gc2F2ZV9vdXJfZW52OworCisgIGluaXRfdGhyZWFkX2xpc3QgKCk7CisKKyAgaW5mZXJpb3JfcGlkID0gcGlkOwkJLyogTmVlZGVkIGZvciB3YWl0X2Zvcl9pbmZlcmlvciBzdHVmZiBiZWxvdyAqLworCisgIC8qIE5vdyB0aGF0IHdlIGhhdmUgYSBjaGlsZCBwcm9jZXNzLCBtYWtlIGl0IG91ciB0YXJnZXQsIGFuZAorICAgICBpbml0aWFsaXplIGFueXRoaW5nIHRhcmdldC12ZWN0b3Itc3BlY2lmaWMgdGhhdCBuZWVkcyBpbml0aWFsaXppbmcuICAqLworCisgICgqaW5pdF90cmFjZV9mdW4pIChwaWQpOworCisgIC8qIFdlIGFyZSBub3cgaW4gdGhlIGNoaWxkIHByb2Nlc3Mgb2YgaW50ZXJlc3QsIGhhdmluZyBleGVjJ2QgdGhlCisgICAgIGNvcnJlY3QgcHJvZ3JhbSwgYW5kIGFyZSBwb2lzZWQgYXQgdGhlIGZpcnN0IGluc3RydWN0aW9uIG9mIHRoZQorICAgICBuZXcgcHJvZ3JhbS4gICovCisKKyAgLyogQWxsb3cgdGFyZ2V0IGRlcGVuZGFudCBjb2RlIHRvIHBsYXkgd2l0aCB0aGUgbmV3IHByb2Nlc3MuICBUaGlzIG1pZ2h0IGJlCisgICAgIHVzZWQgdG8gaGF2ZSB0YXJnZXQtc3BlY2lmaWMgY29kZSBpbml0aWFsaXplIGEgdmFyaWFibGUgaW4gdGhlIG5ldyBwcm9jZXNzCisgICAgIHByaW9yIHRvIGV4ZWN1dGluZyB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24uICAqLworICBUQVJHRVRfQ1JFQVRFX0lORkVSSU9SX0hPT0sgKHBpZCk7CisKKyNpZmRlZiBTT0xJQl9DUkVBVEVfSU5GRVJJT1JfSE9PSworICBTT0xJQl9DUkVBVEVfSU5GRVJJT1JfSE9PSyAocGlkKTsKKyNlbmRpZgorfQorCisvKiBBbiBpbmZlcmlvciBVbml4IHByb2Nlc3MgQ0hJTERfUElEIGhhcyBiZWVuIGNyZWF0ZWQgYnkgYSBjYWxsIHRvCisgICBmb3JrKCkgKG9yIHZhcmlhbnRzIGxpa2UgdmZvcmspLiAgSXQgaXMgcHJlc2VudGx5IHN0b3BwZWQsIGFuZCB3YWl0aW5nCisgICB0byBiZSByZXN1bWVkLiAgY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciB3aWxsIGZvcmsgdGhlIGRlYnVnZ2VyLAorICAgYW5kIHRoYXQgY2xvbmUgd2lsbCAiZm9sbG93IiAoYXR0YWNoIHRvKSBDSElMRF9QSUQuICBUaGUgb3JpZ2luYWwgY29weQorICAgb2YgdGhlIGRlYnVnZ2VyIHdpbGwgbm90IHRvdWNoIENISUxEX1BJRCBhZ2Fpbi4KKworICAgQWxzbywgdGhlIG9yaWdpbmFsIGRlYnVnZ2VyIHdpbGwgc2V0IEZPTExPV0VEX0NISUxEIEZBTFNFLCB3aGlsZSB0aGUKKyAgIGNsb25lIHdpbGwgc2V0IGl0IFRSVUUuCisgICAqLwordm9pZAorY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciAoY2hpbGRfcGlkLCBmb2xsb3dlZF9jaGlsZCkKKyAgICAgaW50IGNoaWxkX3BpZDsKKyAgICAgaW50ICpmb2xsb3dlZF9jaGlsZDsKK3sKKyAgZXh0ZXJuIGludCBhdXRvX3NvbGliX2FkZDsKKworICBpbnQgZGVidWdnZXJfcGlkOworICBpbnQgc3RhdHVzOworICBjaGFyIHBpZF9zcGVsbGluZ1sxMDBdOwkvKiBBcmJpdHJhcnkgYnV0IHN1ZmZpY2llbnQgbGVuZ3RoLiAqLworCisgIC8qIFRoaXMgc2VtYXBob3JlIGlzIHVzZWQgdG8gY29vcmRpbmF0ZSB0aGUgdHdvIGRlYnVnZ2VycycgaGFuZG9mZgorICAgICBvZiBDSElMRF9QSUQuICBUaGUgb3JpZ2luYWwgZGVidWdnZXIgd2lsbCBkZXRhY2ggZnJvbSBDSElMRF9QSUQsCisgICAgIGFuZCB0aGVuIHRoZSBjbG9uZSBkZWJ1Z2dlciB3aWxsIGF0dGFjaCB0byBpdC4gIChJdCBtdXN0IGJlIGRvbmUKKyAgICAgdGhpcyB3YXkgYmVjYXVzZSBvbiBzb21lIHRhcmdldHMsIG9ubHkgb25lIHByb2Nlc3MgYXQgYSB0aW1lIGNhbgorICAgICB0cmFjZSBhbm90aGVyLiAgVGh1cywgdGhlIG9yaWdpbmFsIGRlYnVnZ2VyIG11c3QgcmVsaW5xdWlzaCBpdHMKKyAgICAgdHJhY2luZyByaWdodHMgYmVmb3JlIHRoZSBjbG9uZSBjYW4gcGljayB0aGVtIHVwLikKKyAgICAgKi8KKyNkZWZpbmUgU0VNX1RBTEsgKDEpCisjZGVmaW5lIFNFTV9MSVNURU4gKDApCisgIGludCBoYW5kb2ZmX3NlbWFwaG9yZVsyXTsJLyogT3JpZ2luYWwgInRhbGtzIiB0byBbMV0sIGNsb25lICJsaXN0ZW5zIiB0byBbMF0gKi8KKyAgaW50IHRhbGtfdmFsdWUgPSA5OTsKKyAgaW50IGxpc3Rlbl92YWx1ZTsKKworICAvKiBTZXQgZGVidWdfZm9yayB0aGVuIGF0dGFjaCB0byB0aGUgY2hpbGQgd2hpbGUgaXQgc2xlZXBzLCB0byBkZWJ1Zy4gKi8KKyAgc3RhdGljIGludCBkZWJ1Z19mb3JrID0gMDsKKworICAvKiBJdCBpcyBnZW5lcmFsbHkgZ29vZCBwcmFjdGljZSB0byBmbHVzaCBhbnkgcG9zc2libGUgcGVuZGluZyBzdGRpbworICAgICBvdXRwdXQgcHJpb3IgdG8gZG9pbmcgYSBmb3JrLCB0byBhdm9pZCB0aGUgcG9zc2liaWxpdHkgb2YgYm90aCB0aGUKKyAgICAgcGFyZW50IGFuZCBjaGlsZCBmbHVzaGluZyB0aGUgc2FtZSBkYXRhIGFmdGVyIHRoZSBmb3JrLiAqLworCisgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisgIGdkYl9mbHVzaCAoZ2RiX3N0ZGVycik7CisKKyAgLyogT3BlbiB0aGUgc2VtYXBob3JlIHBpcGVzLgorICAgICAqLworICBzdGF0dXMgPSBwaXBlIChoYW5kb2ZmX3NlbWFwaG9yZSk7CisgIGlmIChzdGF0dXMgPCAwKQorICAgIGVycm9yICgiZXJyb3IgZ2V0dGluZyBwaXBlIGZvciBoYW5kb2ZmIHNlbWFwaG9yZSIpOworCisgIC8qIENsb25lIHRoZSBkZWJ1Z2dlci4gKi8KKyNpZiBkZWZpbmVkKFVTRykgJiYgIWRlZmluZWQoSEFWRV9WRk9SSykKKyAgZGVidWdnZXJfcGlkID0gZm9yayAoKTsKKyNlbHNlCisgIGlmIChkZWJ1Z19mb3JrKQorICAgIGRlYnVnZ2VyX3BpZCA9IGZvcmsgKCk7CisgIGVsc2UKKyAgICBkZWJ1Z2dlcl9waWQgPSB2Zm9yayAoKTsKKyNlbmRpZgorCisgIGlmIChkZWJ1Z2dlcl9waWQgPCAwKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJmb3JrIik7CisKKyAgLyogQXJlIHdlIHRoZSBvcmlnaW5hbCBkZWJ1Z2dlcj8gIElmIHNvLCB3ZSBtdXN0IHJlbGlucXVpc2ggYWxsIGNsYWltcworICAgdG8gQ0hJTERfUElELiAqLworICBpZiAoZGVidWdnZXJfcGlkICE9IDApCisgICAgeworICAgICAgY2hhciBzaWduYWxfc3BlbGxpbmdbMTAwXTsvKiBBcmJpdHJhcnkgYnV0IHN1ZmZpY2llbnQgbGVuZ3RoICovCisKKyAgICAgIC8qIERldGFjaCBmcm9tIENISUxEX1BJRC4gIERlbGl2ZXIgYSAic3RvcCIgc2lnbmFsIHdoZW4gd2UgZG8sIHRob3VnaCwKKyAgICAgICBzbyB0aGF0IGl0IHJlbWFpbnMgc3RvcHBlZCB1bnRpbCB0aGUgY2xvbmUgZGVidWdnZXIgY2FuIGF0dGFjaAorICAgICAgIHRvIGl0LgorICAgICAgICovCisgICAgICBkZXRhY2hfYnJlYWtwb2ludHMgKGNoaWxkX3BpZCk7CisKKyAgICAgIHNwcmludGYgKHNpZ25hbF9zcGVsbGluZywgIiVkIiwgdGFyZ2V0X3NpZ25hbF90b19ob3N0IChUQVJHRVRfU0lHTkFMX1NUT1ApKTsKKyAgICAgIHRhcmdldF9yZXF1aXJlX2RldGFjaCAoY2hpbGRfcGlkLCBzaWduYWxfc3BlbGxpbmcsIDEpOworCisgICAgICAvKiBOb3RpZnkgdGhlIGNsb25lIGRlYnVnZ2VyIHRoYXQgaXQgc2hvdWxkIGF0dGFjaCB0byBDSElMRF9QSUQuICovCisgICAgICB3cml0ZSAoaGFuZG9mZl9zZW1hcGhvcmVbU0VNX1RBTEtdLCAmdGFsa192YWx1ZSwgc2l6ZW9mICh0YWxrX3ZhbHVlKSk7CisKKyAgICAgICpmb2xsb3dlZF9jaGlsZCA9IDA7CisgICAgfQorCisgIC8qIFdlJ3JlIHRoZSBjaGlsZC4gKi8KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChkZWJ1Z19mb3JrKQorCXNsZWVwIChkZWJ1Z19mb3JrKTsKKworICAgICAgLyogVGhlIGNoaWxkIChpLmUuLCB0aGUgY2xvbmVkIGRlYnVnZ2VyKSBtdXN0IG5vdyBhdHRhY2ggdG8KKyAgICAgICAgIENISUxEX1BJRC4gIGluZmVyaW9yX3BpZCBpcyBwcmVzZW50bHkgc2V0IHRvIHRoZSBwYXJlbnQgcHJvY2VzcworICAgICAgICAgb2YgdGhlIGZvcmssIHdoaWxlIENISUxEX1BJRCBzaG91bGQgYmUgdGhlIGNoaWxkIHByb2Nlc3Mgb2YgdGhlCisgICAgICAgICBmb3JrLgorCisgICAgICAgICBXYWl0IHVudGlsIHRoZSBvcmlnaW5hbCBkZWJ1Z2dlciByZWxpbnF1aXNoZXMgY29udHJvbCBvZiBDSElMRF9QSUQsCisgICAgICAgICB0aG91Z2guCisgICAgICAgICAqLworICAgICAgcmVhZCAoaGFuZG9mZl9zZW1hcGhvcmVbU0VNX0xJU1RFTl0sICZsaXN0ZW5fdmFsdWUsIHNpemVvZiAobGlzdGVuX3ZhbHVlKSk7CisKKyAgICAgIC8qIE5vdGUgdGhhdCB3ZSBET04nVCB3YW50IHRvIGFjdHVhbGx5IGRldGFjaCBmcm9tIGluZmVyaW9yX3BpZCwKKyAgICAgICAgIGJlY2F1c2UgdGhhdCB3b3VsZCBhbGxvdyBpdCB0byBydW4gZnJlZS4gIFRoZSBvcmlnaW5hbAorICAgICAgICAgZGVidWdnZXIgd2FudHMgdG8gcmV0YWluIGNvbnRyb2wgb2YgdGhlIHByb2Nlc3MuICBTbywgd2UKKyAgICAgICAgIGp1c3QgcmVzZXQgaW5mZXJpb3JfcGlkIHRvIENISUxEX1BJRCwgYW5kIHRoZW4gZW5zdXJlIHRoYXQgYWxsCisgICAgICAgICBicmVha3BvaW50cyBhcmUgcmVhbGx5IHNldCBpbiBDSElMRF9QSUQuCisgICAgICAgICAqLworICAgICAgdGFyZ2V0X21vdXJuX2luZmVyaW9yICgpOworCisgICAgICAvKiBBc2sgdGhlIHR0eSBzdWJzeXN0ZW0gdG8gc3dpdGNoIHRvIHRoZSBvbmUgd2Ugc3BlY2lmaWVkIGVhcmxpZXIKKyAgICAgICAgIChvciB0byBzaGFyZSB0aGUgY3VycmVudCB0ZXJtaW5hbCwgaWYgbm9uZSB3YXMgc3BlY2lmaWVkKS4gICovCisKKyAgICAgIG5ld190dHkgKCk7CisKKyAgICAgIGRvbnRfcmVwZWF0ICgpOworICAgICAgc3ByaW50ZiAocGlkX3NwZWxsaW5nLCAiJWQiLCBjaGlsZF9waWQpOworICAgICAgdGFyZ2V0X3JlcXVpcmVfYXR0YWNoIChwaWRfc3BlbGxpbmcsIDEpOworCisgICAgICAvKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgY2xlYW51cCwgYWZ0ZXIgYXR0YWNobWVudC4gIChUaGlzIGZvcm0KKyAgICAgICAgIG9mIGF0dGFjaGluZyBjYW4gYmVoYXZlIGRpZmZlcmVudGx5IG9uIHNvbWUgdGFyZ2V0cyB0aGFuIHRoZQorICAgICAgICAgc3RhbmRhcmQgbWV0aG9kLCB3aGVyZSBhIHByb2Nlc3MgZm9ybWVybHkgbm90IHVuZGVyIGRlYnVnZ2VyCisgICAgICAgICBjb250cm9sIHdhcyBzdWRkZW5seSBhdHRhY2hlZCB0by4uKQorICAgICAgICAgKi8KKyAgICAgIHRhcmdldF9wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSAoKTsKKworICAgICAgKmZvbGxvd2VkX2NoaWxkID0gMTsKKyAgICB9CisKKyAgLyogRGlzY2FyZCB0aGUgaGFuZG9mZiBzZW1wYWhvcmUuICovCisgICh2b2lkKSBjbG9zZSAoaGFuZG9mZl9zZW1hcGhvcmVbU0VNX0xJU1RFTl0pOworICAodm9pZCkgY2xvc2UgKGhhbmRvZmZfc2VtYXBob3JlW1NFTV9UQUxLXSk7Cit9CisKKy8qIEFjY2VwdCBOVFJBUFMgdHJhcHMgZnJvbSB0aGUgaW5mZXJpb3IuICAqLworCit2b2lkCitzdGFydHVwX2luZmVyaW9yIChudHJhcHMpCisgICAgIGludCBudHJhcHM7Cit7CisgIGludCBwZW5kaW5nX2V4ZWNzID0gbnRyYXBzOworICBpbnQgdGVybWluYWxfaW5pdHRlZDsKKworICAvKiBUaGUgcHJvY2VzcyB3YXMgc3RhcnRlZCBieSB0aGUgZm9yayB0aGF0IGNyZWF0ZWQgaXQsCisgICAgIGJ1dCBpdCB3aWxsIGhhdmUgc3RvcHBlZCBvbmUgaW5zdHJ1Y3Rpb24gYWZ0ZXIgZXhlY2luZyB0aGUgc2hlbGwuCisgICAgIEhlcmUgd2UgbXVzdCBnZXQgaXQgdXAgdG8gYWN0dWFsIGV4ZWN1dGlvbiBvZiB0aGUgcmVhbCBwcm9ncmFtLiAgKi8KKworICBjbGVhcl9wcm9jZWVkX3N0YXR1cyAoKTsKKworICBpbml0X3dhaXRfZm9yX2luZmVyaW9yICgpOworCisgIHRlcm1pbmFsX2luaXR0ZWQgPSAwOworCisgIGlmIChTVEFSVFVQX1dJVEhfU0hFTEwpCisgICAgaW5mZXJpb3JfaWdub3Jpbmdfc3RhcnR1cF9leGVjX2V2ZW50cyA9IG50cmFwczsKKyAgZWxzZQorICAgIGluZmVyaW9yX2lnbm9yaW5nX3N0YXJ0dXBfZXhlY19ldmVudHMgPSAwOworICBpbmZlcmlvcl9pZ25vcmluZ19sZWFkaW5nX2V4ZWNfZXZlbnRzID0KKyAgICB0YXJnZXRfcmVwb3J0ZWRfZXhlY19ldmVudHNfcGVyX2V4ZWNfY2FsbCAoKSAtIDE7CisKKyNpZmRlZiBTVEFSVFVQX0lORkVSSU9SCisgIFNUQVJUVVBfSU5GRVJJT1IgKHBlbmRpbmdfZXhlY3MpOworI2Vsc2UKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgc3RvcF9zb29uX3F1aWV0bHkgPSAxOwkvKiBNYWtlIHdhaXRfZm9yX2luZmVyaW9yIGJlIHF1aWV0ICovCisgICAgICB3YWl0X2Zvcl9pbmZlcmlvciAoKTsKKyAgICAgIGlmIChzdG9wX3NpZ25hbCAhPSBUQVJHRVRfU0lHTkFMX1RSQVApCisJeworCSAgLyogTGV0IHNoZWxsIGNoaWxkIGhhbmRsZSBpdHMgb3duIHNpZ25hbHMgaW4gaXRzIG93biB3YXkgKi8KKwkgIC8qIEZJWE1FLCB3aGF0IGlmIGNoaWxkIGhhcyBleGl0KCllZD8gIE11c3QgZXhpdCBsb29wIHNvbWVob3cgKi8KKwkgIHJlc3VtZSAoMCwgc3RvcF9zaWduYWwpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBXZSBoYW5kbGUgU0lHVFJBUCwgaG93ZXZlcjsgaXQgbWVhbnMgY2hpbGQgZGlkIGFuIGV4ZWMuICAqLworCSAgaWYgKCF0ZXJtaW5hbF9pbml0dGVkKQorCSAgICB7CisJICAgICAgLyogTm93IHRoYXQgdGhlIGNoaWxkIGhhcyBleGVjJ2Qgd2Uga25vdyBpdCBoYXMgYWxyZWFkeSBzZXQgaXRzCisJCSBwcm9jZXNzIGdyb3VwLiAgT24gUE9TSVggc3lzdGVtcywgdGNzZXRwZ3JwIHdpbGwgZmFpbCB3aXRoCisJCSBFUEVSTSBpZiB3ZSB0cnkgaXQgYmVmb3JlIHRoZSBjaGlsZCdzIHNldHBnaWQuICAqLworCisJICAgICAgLyogU2V0IHVwIHRoZSAic2F2ZWQgdGVybWluYWwgbW9kZXMiIG9mIHRoZSBpbmZlcmlvcgorCQkgYmFzZWQgb24gd2hhdCBtb2RlcyB3ZSBhcmUgc3RhcnRpbmcgaXQgd2l0aC4gICovCisJICAgICAgdGFyZ2V0X3Rlcm1pbmFsX2luaXQgKCk7CisKKwkgICAgICAvKiBJbnN0YWxsIGluZmVyaW9yJ3MgdGVybWluYWwgbW9kZXMuICAqLworCSAgICAgIHRhcmdldF90ZXJtaW5hbF9pbmZlcmlvciAoKTsKKworCSAgICAgIHRlcm1pbmFsX2luaXR0ZWQgPSAxOworCSAgICB9CisKKwkgIHBlbmRpbmdfZXhlY3MgPSBwZW5kaW5nX2V4ZWNzIC0gMTsKKwkgIGlmICgwID09IHBlbmRpbmdfZXhlY3MpCisJICAgIGJyZWFrOworCisJICByZXN1bWUgKDAsIFRBUkdFVF9TSUdOQUxfMCk7CS8qIEp1c3QgbWFrZSBpdCBnbyBvbiAqLworCX0KKyAgICB9CisjZW5kaWYgLyogU1RBUlRVUF9JTkZFUklPUiAqLworICBzdG9wX3Nvb25fcXVpZXRseSA9IDA7Cit9CmRpZmYgLS1naXQgYS9nZGIvZnIzMC10ZGVwLmMgYi9nZGIvZnIzMC10ZGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0NDJkYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9mcjMwLXRkZXAuYwpAQCAtMCwwICsxLDU1MiBAQAorLyogVGFyZ2V0LWRlcGVuZGVudCBjb2RlIGZvciB0aGUgRnVqaXRzdSBGUjMwLgorICAgQ29weXJpZ2h0IDE5OTksIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorCisvKiBGdW5jdGlvbjogcG9wX2ZyYW1lCisgICBUaGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgd2hlbiBlaXRoZXIgdGhlIHVzZXIgdXNlcyB0aGUgYHJldHVybicKKyAgIGNvbW1hbmQsIG9yIHRoZSBjYWxsIGR1bW15IGJyZWFrcG9pbnQgZ2V0cyBoaXQuICAqLworCit2b2lkCitmcjMwX3BvcF9mcmFtZSAoKQoreworICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWUgPSBnZXRfY3VycmVudF9mcmFtZSgpOworICBpbnQgcmVnbnVtOworICBDT1JFX0FERFIgc3AgPSByZWFkX3JlZ2lzdGVyKFNQX1JFR05VTSk7CisKKyAgaWYgKFBDX0lOX0NBTExfRFVNTVkoZnJhbWUtPnBjLCBmcmFtZS0+ZnJhbWUsIGZyYW1lLT5mcmFtZSkpCisgICAgZ2VuZXJpY19wb3BfZHVtbXlfZnJhbWUgKCk7CisgIGVsc2UKKyAgICB7CisgICAgICB3cml0ZV9yZWdpc3RlciAoUENfUkVHTlVNLCBGUkFNRV9TQVZFRF9QQyAoZnJhbWUpKTsKKworICAgICAgZm9yIChyZWdudW0gPSAwOyByZWdudW0gPCBOVU1fUkVHUzsgcmVnbnVtKyspCisJaWYgKGZyYW1lLT5mc3IucmVnc1tyZWdudW1dICE9IDApIHsKKwkgIHdyaXRlX3JlZ2lzdGVyIChyZWdudW0sCisJCSAgcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoZnJhbWUtPmZzci5yZWdzW3JlZ251bV0sCisJCQlSRUdJU1RFUl9SQVdfU0laRShyZWdudW0pKSk7CisJfQorICAgICAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgc3AgKyBmcmFtZS0+ZnJhbWVzaXplKTsKKyAgICB9CisgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7Cit9CisKKy8qIEZ1bmN0aW9uOiBza2lwX3Byb2xvZ3VlCisgICBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGNvZGUgcGFzdCB0aGUgcHJvbG9ndWUgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KKworQ09SRV9BRERSCitmcjMwX3NraXBfcHJvbG9ndWUoQ09SRV9BRERSIHBjKQoreworICBDT1JFX0FERFIgZnVuY19hZGRyLCBmdW5jX2VuZDsKKworICAvKiBTZWUgd2hhdCB0aGUgc3ltYm9sIHRhYmxlIHNheXMgKi8KKworICBpZiAoZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIChwYywgTlVMTCwgJmZ1bmNfYWRkciwgJmZ1bmNfZW5kKSkKKyAgICB7CisgICAgICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKworICAgICAgc2FsID0gZmluZF9wY19saW5lIChmdW5jX2FkZHIsIDApOworCisgICAgICBpZiAoc2FsLmxpbmUgIT0gMCAmJiBzYWwuZW5kIDwgZnVuY19lbmQpIHsKKwlyZXR1cm4gc2FsLmVuZDsKKwl9CisgICAgfQorCisvKiBFaXRoZXIgd2UgZGlkbid0IGZpbmQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb24gKG5vdGhpbmcgd2UgY2FuIGRvKSwKKyAgIG9yIHRoZXJlJ3Mgbm8gbGluZSBpbmZvLCBvciB0aGUgbGluZSBhZnRlciB0aGUgcHJvbG9ndWUgaXMgYWZ0ZXIKKyAgIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uICh0aGVyZSBwcm9iYWJseSBpc24ndCBhIHByb2xvZ3VlKS4gKi8KKworICByZXR1cm4gcGM7Cit9CisKKworLyogRnVuY3Rpb246IHB1c2hfYXJndW1lbnRzCisgICBTZXR1cCBhcmd1bWVudHMgYW5kIFJQIGZvciBhIGNhbGwgdG8gdGhlIHRhcmdldC4gIEZpcnN0IGZvdXIgYXJncworICAgZ28gaW4gRklSU1RfQVJHUkVHIC0+IExBU1RfQVJHUkVHLCBzdWJzZXF1ZW50IGFyZ3MgZ28gb24gc3RhY2suLi4KKyAgIFN0cnVjdHMgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuICBYWFggbm90IHJpZ2h0IG5vdyBaLlIuCisgICA2NCBiaXQgcXVhbnRpdGllcyAoZG91YmxlcyBhbmQgbG9uZyBsb25ncykgbWF5IGJlIHNwbGl0IGJldHdlZW4KKyAgIHRoZSByZWdzIGFuZCB0aGUgc3RhY2suCisgICBXaGVuIGNhbGxpbmcgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBzdHJ1Y3QsIGEgcG9pbnRlciB0byB0aGUgc3RydWN0CisgICBpcyBwYXNzZWQgaW4gYXMgYSBzZWNyZXQgZmlyc3QgYXJndW1lbnQgKGFsd2F5cyBpbiBGSVJTVF9BUkdSRUcpLgorCisgICBTdGFjayBzcGFjZSBmb3IgdGhlIGFyZ3MgaGFzIE5PVCBiZWVuIGFsbG9jYXRlZDogdGhhdCBqb2IgaXMgdXAgdG8gdXMuCisqLworCitDT1JFX0FERFIKK2ZyMzBfcHVzaF9hcmd1bWVudHMobmFyZ3MsIGFyZ3MsIHNwLCBzdHJ1Y3RfcmV0dXJuLCBzdHJ1Y3RfYWRkcikKKyAgICAgaW50ICAgICAgICAgbmFyZ3M7CisgICAgIHZhbHVlX3B0ciAqIGFyZ3M7CisgICAgIENPUkVfQUREUiAgIHNwOworICAgICBpbnQgICAgICAgICBzdHJ1Y3RfcmV0dXJuOworICAgICBDT1JFX0FERFIgICBzdHJ1Y3RfYWRkcjsKK3sKKyAgaW50IGFyZ3JlZzsKKyAgaW50IGFyZ251bTsKKyAgaW50IHN0YWNrX29mZnNldDsKKyAgc3RydWN0IHN0YWNrX2FyZyB7CisgICAgICBjaGFyICp2YWw7CisgICAgICBpbnQgbGVuOworICAgICAgaW50IG9mZnNldDsKKyAgICB9OworICBzdHJ1Y3Qgc3RhY2tfYXJnICpzdGFja19hcmdzID0KKyAgICAgIChzdHJ1Y3Qgc3RhY2tfYXJnKilhbGxvY2EgKG5hcmdzICogc2l6ZW9mIChzdHJ1Y3Qgc3RhY2tfYXJnKSk7CisgIGludCBuc3RhY2tfYXJncyA9IDA7CisKKyAgYXJncmVnID0gRklSU1RfQVJHUkVHOworCisgIC8qIHRoZSBzdHJ1Y3RfcmV0dXJuIHBvaW50ZXIgb2NjdXBpZXMgdGhlIGZpcnN0IHBhcmFtZXRlci1wYXNzaW5nIHJlZyAqLworICBpZiAoc3RydWN0X3JldHVybikKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChhcmdyZWcrKywgc3RydWN0X2FkZHIpOworCisgIHN0YWNrX29mZnNldCA9IDA7CisKKyAgLyogUHJvY2VzcyBhcmdzIGZyb20gbGVmdCB0byByaWdodC4gIFN0b3JlIGFzIG1hbnkgYXMgYWxsb3dlZCBpbgorCXJlZ2lzdGVycywgc2F2ZSB0aGUgcmVzdCB0byBiZSBwdXNoZWQgb24gdGhlIHN0YWNrICovCisgIGZvcihhcmdudW0gPSAwOyBhcmdudW0gPCBuYXJnczsgYXJnbnVtKyspCisgICAgeworICAgICAgY2hhciAqICAgICAgICAgdmFsOworICAgICAgdmFsdWVfcHRyICAgICAgYXJnID0gYXJnc1thcmdudW1dOworICAgICAgc3RydWN0IHR5cGUgKiAgYXJnX3R5cGUgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFIChhcmcpKTsKKyAgICAgIHN0cnVjdCB0eXBlICogIHRhcmdldF90eXBlID0gVFlQRV9UQVJHRVRfVFlQRSAoYXJnX3R5cGUpOworICAgICAgaW50ICAgICAgICAgICAgbGVuID0gVFlQRV9MRU5HVEggKGFyZ190eXBlKTsKKyAgICAgIGVudW0gdHlwZV9jb2RlIHR5cGVjb2RlID0gVFlQRV9DT0RFIChhcmdfdHlwZSk7CisgICAgICBDT1JFX0FERFIgICAgICByZWd2YWw7CisgICAgICBpbnQgbmV3YXJnOworCisgICAgICB2YWwgPSAoY2hhciAqKSBWQUxVRV9DT05URU5UUyAoYXJnKTsKKworCXsKKwkgIC8qIENvcHkgdGhlIGFyZ3VtZW50IHRvIGdlbmVyYWwgcmVnaXN0ZXJzIG9yIHRoZSBzdGFjayBpbgorCSAgICAgcmVnaXN0ZXItc2l6ZWQgcGllY2VzLiAgTGFyZ2UgYXJndW1lbnRzIGFyZSBzcGxpdCBiZXR3ZWVuCisJICAgICByZWdpc3RlcnMgYW5kIHN0YWNrLiAgKi8KKwkgIHdoaWxlIChsZW4gPiAwKQorCSAgICB7CisJICAgICAgaWYgKGFyZ3JlZyA8PSBMQVNUX0FSR1JFRykKKwkJeworCSAgICAgICAgICBpbnQgcGFydGlhbF9sZW4gPSBsZW4gPCBSRUdJU1RFUl9TSVpFID8gbGVuIDogUkVHSVNURVJfU0laRTsKKwkJICByZWd2YWwgPSBleHRyYWN0X2FkZHJlc3MgKHZhbCwgcGFydGlhbF9sZW4pOworCisJCSAgLyogSXQncyBhIHNpbXBsZSBhcmd1bWVudCBiZWluZyBwYXNzZWQgaW4gYSBnZW5lcmFsCisJCSAgICAgcmVnaXN0ZXIuICAqLworCQkgIHdyaXRlX3JlZ2lzdGVyIChhcmdyZWcsIHJlZ3ZhbCk7CisJCSAgYXJncmVnKys7CisJICAgICAgICAgIGxlbiAtPSBwYXJ0aWFsX2xlbjsKKwkgICAgICAgICAgdmFsICs9IHBhcnRpYWxfbGVuOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyoga2VlcCBmb3IgbGF0ZXIgcHVzaGluZyAqLworCQkgIHN0YWNrX2FyZ3NbbnN0YWNrX2FyZ3NdLnZhbCA9IHZhbDsKKwkJICBzdGFja19hcmdzW25zdGFja19hcmdzKytdLmxlbiA9IGxlbjsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgICAvKiBub3cgZG8gdGhlIHJlYWwgc3RhY2sgcHVzaGluZywgcHJvY2VzcyBhcmdzIHJpZ2h0IHRvIGxlZnQgKi8KKyAgICB3aGlsZShuc3RhY2tfYXJncy0tKQorICAgICAgeworCXNwIC09IHN0YWNrX2FyZ3NbbnN0YWNrX2FyZ3NdLmxlbjsKKwl3cml0ZV9tZW1vcnkoc3AsIHN0YWNrX2FyZ3NbbnN0YWNrX2FyZ3NdLnZhbCwKKwkJc3RhY2tfYXJnc1tuc3RhY2tfYXJnc10ubGVuKTsKKyAgICAgIH0KKworICAvKiBSZXR1cm4gYWRqdXN0ZWQgc3RhY2sgcG9pbnRlci4gICovCisgIHJldHVybiBzcDsKK30KKworX2luaXRpYWxpemVfZnIzMF90ZGVwKCkKK3sKKwlleHRlcm4gaW50IHByaW50X2luc25fZnIzMChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopOworCisJdG1fcHJpbnRfaW5zbiA9IHByaW50X2luc25fZnIzMDsKK30KKworLyogRnVuY3Rpb246IGNoZWNrX3Byb2xvZ3VlX2NhY2hlCisgICBDaGVjayBpZiBwcm9sb2d1ZSBmb3IgdGhpcyBmcmFtZSdzIFBDIGhhcyBhbHJlYWR5IGJlZW4gc2Nhbm5lZC4KKyAgIElmIGl0IGhhcywgY29weSB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhhdCBwcm9sb2d1ZSBhbmQKKyAgIHJldHVybiBub24temVyby4gIE90aGVyd2lzZSBkbyBub3QgY29weSBhbnl0aGluZyBhbmQgcmV0dXJuIHplcm8uCisKKyAgIFRoZSBpbmZvcm1hdGlvbiBzYXZlZCBpbiB0aGUgY2FjaGUgaW5jbHVkZXM6CisgICAgICogdGhlIGZyYW1lIHJlZ2lzdGVyIG51bWJlcjsKKyAgICAgKiB0aGUgc2l6ZSBvZiB0aGUgc3RhY2sgZnJhbWU7CisgICAgICogdGhlIG9mZnNldHMgb2Ygc2F2ZWQgcmVncyAocmVsYXRpdmUgdG8gdGhlIG9sZCBTUCk7IGFuZAorICAgICAqIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhY2sgcG9pbnRlciB0byB0aGUgZnJhbWUgcG9pbnRlcgorCisgICBUaGUgY2FjaGUgY29udGFpbnMgb25seSBvbmUgZW50cnksIHNpbmNlIHRoaXMgaXMgYWRlcXVhdGUKKyAgIGZvciB0aGUgdHlwaWNhbCBzZXF1ZW5jZSBvZiBwcm9sb2d1ZSBzY2FuIHJlcXVlc3RzIHdlIGdldC4KKyAgIFdoZW4gcGVyZm9ybWluZyBhIGJhY2t0cmFjZSwgR0RCIHdpbGwgdXN1YWxseSBhc2sgdG8gc2NhbgorICAgdGhlIHNhbWUgZnVuY3Rpb24gdHdpY2UgaW4gYSByb3cgKG9uY2UgdG8gZ2V0IHRoZSBmcmFtZSBjaGFpbiwKKyAgIGFuZCBvbmNlIHRvIGZpbGwgaW4gdGhlIGV4dHJhIGZyYW1lIGluZm9ybWF0aW9uKS4KKyovCisKK3N0YXRpYyBzdHJ1Y3QgZnJhbWVfaW5mbyBwcm9sb2d1ZV9jYWNoZTsKKworc3RhdGljIGludAorY2hlY2tfcHJvbG9ndWVfY2FjaGUgKGZpKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqIGZpOworeworICBpbnQgaTsKKworICBpZiAoZmktPnBjID09IHByb2xvZ3VlX2NhY2hlLnBjKQorICAgIHsKKyAgICAgIGZpLT5mcmFtZXJlZyA9IHByb2xvZ3VlX2NhY2hlLmZyYW1lcmVnOworICAgICAgZmktPmZyYW1lc2l6ZSA9IHByb2xvZ3VlX2NhY2hlLmZyYW1lc2l6ZTsKKyAgICAgIGZpLT5mcmFtZW9mZnNldCA9IHByb2xvZ3VlX2NhY2hlLmZyYW1lb2Zmc2V0OworICAgICAgZm9yIChpID0gMDsgaSA8PSBOVU1fUkVHUzsgaSsrKQorCWZpLT5mc3IucmVnc1tpXSA9IHByb2xvZ3VlX2NhY2hlLmZzci5yZWdzW2ldOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKworLyogRnVuY3Rpb246IHNhdmVfcHJvbG9ndWVfY2FjaGUKKyAgIENvcHkgdGhlIHByb2xvZ3VlIGluZm9ybWF0aW9uIGZyb20gZmkgdG8gdGhlIHByb2xvZ3VlIGNhY2hlLgorKi8KKworc3RhdGljIHZvaWQKK3NhdmVfcHJvbG9ndWVfY2FjaGUgKGZpKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqIGZpOworeworICBpbnQgaTsKKworICBwcm9sb2d1ZV9jYWNoZS5wYyAgICAgICAgICA9IGZpLT5wYzsKKyAgcHJvbG9ndWVfY2FjaGUuZnJhbWVyZWcgICAgPSBmaS0+ZnJhbWVyZWc7CisgIHByb2xvZ3VlX2NhY2hlLmZyYW1lc2l6ZSAgID0gZmktPmZyYW1lc2l6ZTsKKyAgcHJvbG9ndWVfY2FjaGUuZnJhbWVvZmZzZXQgPSBmaS0+ZnJhbWVvZmZzZXQ7CisgIAorICBmb3IgKGkgPSAwOyBpIDw9IE5VTV9SRUdTOyBpKyspIHsKKyAgICBwcm9sb2d1ZV9jYWNoZS5mc3IucmVnc1tpXSA9IGZpLT5mc3IucmVnc1tpXTsKKyAgfQorfQorCisKKy8qIEZ1bmN0aW9uOiBzY2FuX3Byb2xvZ3VlCisgICBTY2FuIHRoZSBwcm9sb2d1ZSBvZiB0aGUgZnVuY3Rpb24gdGhhdCBjb250YWlucyBQQywgYW5kIHJlY29yZCB3aGF0CisgICB3ZSBmaW5kIGluIFBJLiAgUEktPmZzciBtdXN0IGJlIHplcm9lZCBieSB0aGUgY2FsbGVkLiAgUmV0dXJucyB0aGUKKyAgIHBjIGFmdGVyIHRoZSBwcm9sb2d1ZS4gIE5vdGUgdGhhdCB0aGUgYWRkcmVzc2VzIHNhdmVkIGluIHBpLT5mc3IKKyAgIGFyZSBhY3R1YWxseSBqdXN0IGZyYW1lIHJlbGF0aXZlIChuZWdhdGl2ZSBvZmZzZXRzIGZyb20gdGhlIGZyYW1lCisgICBwb2ludGVyKS4gIFRoaXMgaXMgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlCisgICBmcmFtZSBwb2ludGVyIHlldC4gIEluIHNvbWUgY2lyY3Vtc3RhbmNlcywgdGhlIGZyYW1lIHBvaW50ZXIgY2FuJ3QKKyAgIGJlIGRldGVybWluZWQgdGlsbCBhZnRlciB3ZSBoYXZlIHNjYW5uZWQgdGhlIHByb2xvZ3VlLiAgKi8KKworc3RhdGljIHZvaWQKK2ZyMzBfc2Nhbl9wcm9sb2d1ZSAoZmkpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICogZmk7Cit7CisgIGludCBzcF9vZmZzZXQsIGZwX29mZnNldDsKKyAgQ09SRV9BRERSIHByb2xvZ3VlX3N0YXJ0LCBwcm9sb2d1ZV9lbmQsIGN1cnJlbnRfcGM7CisKKyAgLyogQ2hlY2sgaWYgdGhpcyBmdW5jdGlvbiBpcyBhbHJlYWR5IGluIHRoZSBjYWNoZSBvZiBmcmFtZSBpbmZvcm1hdGlvbi4gKi8KKyAgaWYgKGNoZWNrX3Byb2xvZ3VlX2NhY2hlIChmaSkpCisgICAgcmV0dXJuOworCisgIC8qIEFzc3VtZSB0aGVyZSBpcyBubyBmcmFtZSB1bnRpbCBwcm92ZW4gb3RoZXJ3aXNlLiAgKi8KKyAgZmktPmZyYW1lcmVnICAgID0gU1BfUkVHTlVNOworICBmaS0+ZnJhbWVzaXplICAgPSAwOworICBmaS0+ZnJhbWVvZmZzZXQgPSAwOworCisgIC8qIEZpbmQgdGhlIGZ1bmN0aW9uIHByb2xvZ3VlLiAgSWYgd2UgY2FuJ3QgZmluZCB0aGUgZnVuY3Rpb24gaW4KKyAgICAgdGhlIHN5bWJvbCB0YWJsZSwgcGVlayBpbiB0aGUgc3RhY2sgZnJhbWUgdG8gZmluZCB0aGUgUEMuICAqLworICBpZiAoZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIChmaS0+cGMsIE5VTEwsICZwcm9sb2d1ZV9zdGFydCwgJnByb2xvZ3VlX2VuZCkpCisgICAgeworICAgICAgLyogQXNzdW1lIHRoZSBwcm9sb2d1ZSBpcyBldmVyeXRoaW5nIGJldHdlZW4gdGhlIGZpcnN0IGluc3RydWN0aW9uCisgICAgICAgICBpbiB0aGUgZnVuY3Rpb24gYW5kIHRoZSBmaXJzdCBzb3VyY2UgbGluZS4gICovCisgICAgICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbCA9IGZpbmRfcGNfbGluZSAocHJvbG9ndWVfc3RhcnQsIDApOworCisgICAgICBpZiAoc2FsLmxpbmUgPT0gMCkJCS8qIG5vIGxpbmUgaW5mbywgdXNlIGN1cnJlbnQgUEMgKi8KKwlwcm9sb2d1ZV9lbmQgPSBmaS0+cGM7CisgICAgICBlbHNlIGlmIChzYWwuZW5kIDwgcHJvbG9ndWVfZW5kKQkvKiBuZXh0IGxpbmUgYmVnaW5zIGFmdGVyIGZuIGVuZCAqLworCXByb2xvZ3VlX2VuZCA9IHNhbC5lbmQ7CQkvKiAocHJvYmFibHkgbWVhbnMgbm8gcHJvbG9ndWUpICAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFhYWCBaLlIuIFdoYXQgbm93Pz8/IFRoZSBmb2xsb3dpbmcgaXMgZW50aXJlbHkgYm9ndXMgKi8KKyAgICAgIHByb2xvZ3VlX3N0YXJ0ID0gKHJlYWRfbWVtb3J5X2ludGVnZXIgKGZpLT5mcmFtZSwgNCkgJiAweDAzZmZmZmZjKSAtIDEyOworICAgICAgcHJvbG9ndWVfZW5kID0gcHJvbG9ndWVfc3RhcnQgKyA0MDsKKyAgICB9CisKKyAgLyogTm93IHNlYXJjaCB0aGUgcHJvbG9ndWUgbG9va2luZyBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgc2V0IHVwIHRoZQorICAgICBmcmFtZSBwb2ludGVyLCBhZGp1c3QgdGhlIHN0YWNrIHBvaW50ZXIsIGFuZCBzYXZlIHJlZ2lzdGVycy4gICovCisKKyAgc3Bfb2Zmc2V0ID0gZnBfb2Zmc2V0ID0gMDsKKyAgZm9yIChjdXJyZW50X3BjID0gcHJvbG9ndWVfc3RhcnQ7IGN1cnJlbnRfcGMgPCBwcm9sb2d1ZV9lbmQ7IGN1cnJlbnRfcGMgKz0gMikKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKKworICAgICAgaW5zbiA9IHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKGN1cnJlbnRfcGMsIDIpOworCisgICAgICBpZiAoKGluc24gJiAweGZlMDApID09IDB4OGUwMCkJCQkvKiBzdG0wIG9yIHN0bTEgKi8KKwl7CisJICBpbnQgcmVnLCBtYXNrID0gaW5zbiAmIDB4ZmY7CisKKwkgIC8qIHNjYW4gaW4gb25lIHN3ZWVwIC0gY3JlYXRlIHZpcnR1YWwgMTYtYml0IG1hc2sgZnJvbSBlaXRoZXIgaW5zbidzIG1hc2sgKi8KKyAgICAgICAgICBpZigoaW5zbiAmIDB4MDEwMCkgPT0gMCkKKwkgICAgeworCSAgICAgIG1hc2sgPDw9IDg7ICAvKiBzdG0wIC0gbW92ZSB0byB1cHBlciBieXRlIGluIHZpcnR1YWwgbWFzayAqLworCSAgICB9CisKKwkgIC8qIENhbGN1bGF0ZSBvZmZzZXRzIG9mIHNhdmVkIHJlZ2lzdGVycyAodG8gYmUgdHVybmVkIGxhdGVyIGludG8gYWRkcmVzc2VzKS4gKi8KKwkgIGZvciAocmVnID0gUjRfUkVHTlVNOyByZWcgPD0gUjExX1JFR05VTTsgcmVnKyspCisJICAgIGlmIChtYXNrICYgKDEgPDwgKDE1IC0gcmVnKSkpCisJICAgICAgeworCQlzcF9vZmZzZXQgLT0gNDsKKwkJZmktPmZzci5yZWdzW3JlZ10gPSBzcF9vZmZzZXQ7CisJICAgICAgfQorCX0KKyAgICAgIGVsc2UgaWYoKGluc24gJiAweGZmZjApID09IDB4MTcwMCkJCS8qIHN0IHJ4LEAtcjE1ICovCisgICAgICAgIHsKKwkgIGludCByZWcgPSBpbnNuICYgMHhmOworCisJICBzcF9vZmZzZXQgLT0gNDsKKwkgIGZpLT5mc3IucmVnc1tyZWddID0gc3Bfb2Zmc2V0OworCX0KKyAgICAgIGVsc2UgaWYoKGluc24gJiAweGZmMDApID09IDB4MGYwMCkJCS8qIGVudGVyICovCisgICAgICAgIHsKKwkgIGZwX29mZnNldCA9IGZpLT5mc3IucmVnc1tGUF9SRUdOVU1dID0gc3Bfb2Zmc2V0IC0gNDsKKwkgIHNwX29mZnNldCAtPSA0ICogKGluc24gJiAweGZmKTsKKwkgIGZpLT5mcmFtZXJlZyA9IEZQX1JFR05VTTsKKwl9CisgICAgICBlbHNlIGlmKGluc24gPT0gMHgxNzgxKQkJCQkvKiBzdCBycCxALXNwICovCisJeworCQlzcF9vZmZzZXQgLT0gNDsKKwkJZmktPmZzci5yZWdzW1JQX1JFR05VTV0gPSBzcF9vZmZzZXQ7CisJfQorICAgICAgZWxzZSBpZihpbnNuID09IDB4MTcwZSkJCQkJLyogc3QgZnAsQC1zcCAqLworCXsKKwkJc3Bfb2Zmc2V0IC09IDQ7CisJCWZpLT5mc3IucmVnc1tGUF9SRUdOVU1dID0gc3Bfb2Zmc2V0OworCX0KKyAgICAgIGVsc2UgaWYoaW5zbiA9PSAweDhiZmUpCQkJCS8qIG1vdiBzcCxmcCAqLworCXsKKwkgIGZpLT5mcmFtZXJlZyA9IEZQX1JFR05VTTsKKwl9CisgICAgICBlbHNlIGlmKChpbnNuICYgMHhmZjAwKSA9PSAweGEzMDApCQkvKiBhZGRzcCB4eCAqLworCXsKKwkgIHNwX29mZnNldCArPSA0ICogKHNpZ25lZCBjaGFyKShpbnNuICYgMHhmZik7CisJfQorICAgICAgZWxzZSBpZigoaW5zbiAmIDB4ZmYwZikgPT0gMHg5YjAwICYmCQkvKiBsZGk6MjAgeHgscjAgKi8KKwlyZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyKGN1cnJlbnRfcGMrNCwgMikKKwkgID09IDB4YWMwZikJCQkJCS8qIHN1YiByMCxzcCAqLworCXsKKwkgIC8qIGxhcmdlIHN0YWNrIGFkanVzdG1lbnQgKi8KKwkgIHNwX29mZnNldCAtPSAoKChpbnNuICYgMHhmMCkgPDwgMTIpIHwgcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlcihjdXJyZW50X3BjKzIsIDIpKTsKKwkgIGN1cnJlbnRfcGMgKz0gNDsKKwl9CisgICAgICBlbHNlIGlmKGluc24gPT0gMHg5ZjgwICYmCQkJCS8qIGxkaTozMiB4eCxyMCAqLworCXJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIoY3VycmVudF9wYys2LCAyKQorCSAgPT0gMHhhYzBmKQkJCQkJLyogc3ViIHIwLHNwICovCisJeworCSAgLyogbGFyZ2Ugc3RhY2sgYWRqdXN0bWVudCAqLworCSAgc3Bfb2Zmc2V0IC09CisJCShyZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyKGN1cnJlbnRfcGMrMiwgMikgPDwgMTYgfAorCQkJcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlcihjdXJyZW50X3BjKzQsIDIpKTsKKwkgIGN1cnJlbnRfcGMgKz0gNjsKKwl9CisgICAgfQorCisgIC8qIFRoZSBmcmFtZSBzaXplIGlzIGp1c3QgdGhlIG5lZ2F0aXZlIG9mIHRoZSBvZmZzZXQgKGZyb20gdGhlIG9yaWdpbmFsIFNQKQorICAgICBvZiB0aGUgbGFzdCB0aGluZyB0aGluZyB3ZSBwdXNoZWQgb24gdGhlIHN0YWNrLiAgVGhlIGZyYW1lIG9mZnNldCBpcworICAgICBbbmV3IEZQXSAtIFtuZXcgU1BdLiAgKi8KKyAgZmktPmZyYW1lc2l6ZSA9IC1zcF9vZmZzZXQ7CisgIGZpLT5mcmFtZW9mZnNldCA9IGZwX29mZnNldCAtIHNwX29mZnNldDsKKyAgCisgIHNhdmVfcHJvbG9ndWVfY2FjaGUgKGZpKTsKK30KKworLyogRnVuY3Rpb246IGluaXRfZXh0cmFfZnJhbWVfaW5mbworICAgU2V0dXAgdGhlIGZyYW1lJ3MgZnJhbWUgcG9pbnRlciwgcGMsIGFuZCBmcmFtZSBhZGRyZXNzZXMgZm9yIHNhdmVkCisgICByZWdpc3RlcnMuICBNb3N0IG9mIHRoZSB3b3JrIGlzIGRvbmUgaW4gc2Nhbl9wcm9sb2d1ZSgpLgorCisgICBOb3RlIHRoYXQgd2hlbiB3ZSBhcmUgY2FsbGVkIGZvciB0aGUgbGFzdCBmcmFtZSAoY3VycmVudGx5IGFjdGl2ZSBmcmFtZSksCisgICB0aGF0IGZpLT5wYyBhbmQgZmktPmZyYW1lIHdpbGwgYWxyZWFkeSBiZSBzZXR1cC4gIEhvd2V2ZXIsIGZpLT5mcmFtZSB3aWxsCisgICBiZSB2YWxpZCBvbmx5IGlmIHRoaXMgcm91dGluZSB1c2VzIEZQLiAgRm9yIHByZXZpb3VzIGZyYW1lcywgZmktZnJhbWUgd2lsbAorICAgYWx3YXlzIGJlIGNvcnJlY3QgKHNpbmNlIHRoYXQgaXMgZGVyaXZlZCBmcm9tIGZyMzBfZnJhbWVfY2hhaW4gKCkpLgorCisgICBXZSBjYW4gYmUgY2FsbGVkIHdpdGggdGhlIFBDIGluIHRoZSBjYWxsIGR1bW15IHVuZGVyIHR3byBjaXJjdW1zdGFuY2VzLgorICAgRmlyc3QsIGR1cmluZyBub3JtYWwgYmFja3RyYWNpbmcsIHNlY29uZCwgd2hpbGUgZmlndXJpbmcgb3V0IHRoZSBmcmFtZQorICAgcG9pbnRlciBqdXN0IHByaW9yIHRvIGNhbGxpbmcgdGhlIHRhcmdldCBmdW5jdGlvbiAoc2VlIHJ1bl9zdGFja19kdW1teSkuICAqLworCit2b2lkCitmcjMwX2luaXRfZXh0cmFfZnJhbWVfaW5mbyAoZmkpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICogZmk7Cit7CisgIGludCByZWc7CisKKyAgaWYgKGZpLT5uZXh0KQorICAgIGZpLT5wYyA9IEZSQU1FX1NBVkVEX1BDIChmaS0+bmV4dCk7CisKKyAgbWVtc2V0IChmaS0+ZnNyLnJlZ3MsICdcMDAwJywgc2l6ZW9mIGZpLT5mc3IucmVncyk7CisKKyAgaWYgKFBDX0lOX0NBTExfRFVNTVkgKGZpLT5wYywgZmktPmZyYW1lLCBmaS0+ZnJhbWUpKQorICAgIHsKKyAgICAgIC8qIFdlIG5lZWQgdG8gc2V0dXAgZmktPmZyYW1lIGhlcmUgYmVjYXVzZSBydW5fc3RhY2tfZHVtbXkgZ2V0cyBpdCB3cm9uZworCSBieSBhc3N1bWluZyBpdCdzIGFsd2F5cyBGUC4gICovCisgICAgICBmaS0+ZnJhbWUgICAgICAgPSBnZW5lcmljX3JlYWRfcmVnaXN0ZXJfZHVtbXkgKGZpLT5wYywgZmktPmZyYW1lLCBTUF9SRUdOVU0pOworICAgICAgZmktPmZyYW1lc2l6ZSAgID0gMDsKKyAgICAgIGZpLT5mcmFtZW9mZnNldCA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorICAgICAgZnIzMF9zY2FuX3Byb2xvZ3VlIChmaSk7CisKKyAgICAgIGlmICghZmktPm5leHQpCQkJLyogdGhpcyBpcyB0aGUgaW5uZXJtb3N0IGZyYW1lPyAqLworCWZpLT5mcmFtZSA9IHJlYWRfcmVnaXN0ZXIgKGZpLT5mcmFtZXJlZyk7CisgICAgICBlbHNlCQkJIAkvKiBub3QgdGhlIGlubmVybW9zdCBmcmFtZSAqLworCS8qIElmIHdlIGhhdmUgYW4gRlAsICB0aGUgY2FsbGVlIHNhdmVkIGl0LiAqLworCWlmIChmaS0+ZnJhbWVyZWcgPT0gRlBfUkVHTlVNKQorCSAgaWYgKGZpLT5uZXh0LT5mc3IucmVnc1tmaS0+ZnJhbWVyZWddICE9IDApCisJICAgIGZpLT5mcmFtZSA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKGZpLT5uZXh0LT5mc3IucmVnc1tmaS0+ZnJhbWVyZWddLAorCQkJCQkgICAgIDQpOworICAgICAgLyogQ2FsY3VsYXRlIGFjdHVhbCBhZGRyZXNzZXMgb2Ygc2F2ZWQgcmVnaXN0ZXJzIHVzaW5nIG9mZnNldHMgZGV0ZXJtaW5lZAorICAgICAgICAgYnkgZnIzMF9zY2FuX3Byb2xvZ3VlLiAgKi8KKyAgICAgIGZvciAocmVnID0gMDsgcmVnIDwgTlVNX1JFR1M7IHJlZysrKQorCWlmIChmaS0+ZnNyLnJlZ3NbcmVnXSAhPSAwKSB7CisJICBmaS0+ZnNyLnJlZ3NbcmVnXSArPSBmaS0+ZnJhbWUgKyBmaS0+ZnJhbWVzaXplIC0gZmktPmZyYW1lb2Zmc2V0OworCX0KK30KKworLyogRnVuY3Rpb246IGZpbmRfY2FsbGVyc19yZWcKKyAgIEZpbmQgUkVHTlVNIG9uIHRoZSBzdGFjay4gIE90aGVyd2lzZSwgaXQncyBpbiBhbiBhY3RpdmUgcmVnaXN0ZXIuCisgICBPbmUgdGhpbmcgd2UgbWlnaHQgd2FudCB0byBkbyBoZXJlIGlzIHRvIGNoZWNrIFJFR05VTSBhZ2FpbnN0IHRoZQorICAgY2xvYmJlciBtYXNrLCBhbmQgc29tZWhvdyBmbGFnIGl0IGFzIGludmFsaWQgaWYgaXQgaXNuJ3Qgc2F2ZWQgb24KKyAgIHRoZSBzdGFjayBzb21ld2hlcmUuICBUaGlzIHdvdWxkIHByb3ZpZGUgYSBncmFjZWZ1bCBmYWlsdXJlIG1vZGUKKyAgIHdoZW4gdHJ5aW5nIHRvIGdldCB0aGUgdmFsdWUgb2YgY2FsbGVyLXNhdmVzIHJlZ2lzdGVycyBmb3IgYW4gaW5uZXIKKyAgIGZyYW1lLiAgKi8KKworQ09SRV9BRERSCitmcjMwX2ZpbmRfY2FsbGVyc19yZWcgKGZpLCByZWdudW0pCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKKyAgICAgaW50IHJlZ251bTsKK3sKKyAgZm9yICg7IGZpOyBmaSA9IGZpLT5uZXh0KQorICAgIGlmIChQQ19JTl9DQUxMX0RVTU1ZIChmaS0+cGMsIGZpLT5mcmFtZSwgZmktPmZyYW1lKSkKKyAgICAgIHJldHVybiBnZW5lcmljX3JlYWRfcmVnaXN0ZXJfZHVtbXkgKGZpLT5wYywgZmktPmZyYW1lLCByZWdudW0pOworICAgIGVsc2UgaWYgKGZpLT5mc3IucmVnc1tyZWdudW1dICE9IDApCisgICAgICByZXR1cm4gcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoZmktPmZzci5yZWdzW3JlZ251bV0sIAorCQkJCQkgICBSRUdJU1RFUl9SQVdfU0laRShyZWdudW0pKTsKKworICByZXR1cm4gcmVhZF9yZWdpc3RlciAocmVnbnVtKTsKK30KKworCisvKiBGdW5jdGlvbjogZnJhbWVfY2hhaW4KKyAgIEZpZ3VyZSBvdXQgdGhlIGZyYW1lIHByaW9yIHRvIEZJLiAgVW5mb3J0dW5hdGVseSwgdGhpcyBpbnZvbHZlcworICAgc2Nhbm5pbmcgdGhlIHByb2xvZ3VlIG9mIHRoZSBjYWxsZXIsIHdoaWNoIHdpbGwgYWxzbyBiZSBkb25lCisgICBzaG9ydGx5IGJ5IGZyMzBfaW5pdF9leHRyYV9mcmFtZV9pbmZvLiAgRm9yIHRoZSBkdW1teSBmcmFtZSwgd2UKKyAgIGp1c3QgcmV0dXJuIHRoZSBzdGFjayBwb2ludGVyIHRoYXQgd2FzIGluIHVzZSBhdCB0aGUgdGltZSB0aGUKKyAgIGZ1bmN0aW9uIGNhbGwgd2FzIG1hZGUuICAqLworCisKK0NPUkVfQUREUgorZnIzMF9mcmFtZV9jaGFpbiAoZmkpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICogZmk7Cit7CisgIENPUkVfQUREUiBmbl9zdGFydCwgY2FsbGVyc19wYywgZnA7CisgIHN0cnVjdCBmcmFtZV9pbmZvIGNhbGxlcl9maTsKKyAgaW50IGZyYW1lcmVnOworCisgIC8qIGlzIHRoaXMgYSBkdW1teSBmcmFtZT8gKi8KKyAgaWYgKFBDX0lOX0NBTExfRFVNTVkgKGZpLT5wYywgZmktPmZyYW1lLCBmaS0+ZnJhbWUpKQorICAgIHJldHVybiBmaS0+ZnJhbWU7CS8qIGR1bW15IGZyYW1lIHNhbWUgYXMgY2FsbGVyJ3MgZnJhbWUgKi8KKworICAvKiBpcyBjYWxsZXItb2YtdGhpcyBhIGR1bW15IGZyYW1lPyAqLworICBjYWxsZXJzX3BjID0gRlJBTUVfU0FWRURfUEMoZmkpOyAgLyogZmluZCBvdXQgd2hvIGNhbGxlZCB1czogKi8KKyAgZnAgPSBmcjMwX2ZpbmRfY2FsbGVyc19yZWcgKGZpLCBGUF9SRUdOVU0pOworICBpZiAoUENfSU5fQ0FMTF9EVU1NWSAoY2FsbGVyc19wYywgZnAsIGZwKSkJCisgICAgcmV0dXJuIGZwOwkJLyogZHVtbXkgZnJhbWUncyBmcmFtZSBtYXkgYmVhciBubyByZWxhdGlvbiB0byBvdXJzICovCisKKyAgaWYgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAoZmktPnBjLCAwLCAmZm5fc3RhcnQsIDApKQorICAgIGlmIChmbl9zdGFydCA9PSBlbnRyeV9wb2ludF9hZGRyZXNzICgpKQorICAgICAgcmV0dXJuIDA7CQkvKiBpbiBfc3RhcnQgZm4sIGRvbid0IGNoYWluIGZ1cnRoZXIgKi8KKworICBmcmFtZXJlZyA9IGZpLT5mcmFtZXJlZzsKKworICAvKiBJZiB0aGUgY2FsbGVyIGlzIHRoZSBzdGFydHVwIGNvZGUsIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGNoYWluLiAgKi8KKyAgaWYgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAoY2FsbGVyc19wYywgMCwgJmZuX3N0YXJ0LCAwKSkKKyAgICBpZiAoZm5fc3RhcnQgPT0gZW50cnlfcG9pbnRfYWRkcmVzcyAoKSkKKyAgICAgIHJldHVybiAwOworCisgIG1lbXNldCAoJiBjYWxsZXJfZmksIDAsIHNpemVvZiAoY2FsbGVyX2ZpKSk7CisgIGNhbGxlcl9maS5wYyA9IGNhbGxlcnNfcGM7CisgIGZyMzBfc2Nhbl9wcm9sb2d1ZSAoJiBjYWxsZXJfZmkpOworICBmcmFtZXJlZyA9IGNhbGxlcl9maS5mcmFtZXJlZzsKKworICAvKiBJZiB0aGUgY2FsbGVyIHVzZWQgYSBmcmFtZSByZWdpc3RlciwgcmV0dXJuIGl0cyB2YWx1ZS4KKyAgICAgT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGNhbGxlcidzIHN0YWNrIHBvaW50ZXIuICAqLworICBpZiAoZnJhbWVyZWcgPT0gRlBfUkVHTlVNKQorICAgIHJldHVybiBmcjMwX2ZpbmRfY2FsbGVyc19yZWcgKGZpLCBmcmFtZXJlZyk7CisgIGVsc2UKKyAgICByZXR1cm4gZmktPmZyYW1lICsgZmktPmZyYW1lc2l6ZTsKK30KKworLyogRnVuY3Rpb246IGZyYW1lX3NhdmVkX3BjIAorICAgRmluZCB0aGUgY2FsbGVyIG9mIHRoaXMgZnJhbWUuICBXZSBkbyB0aGlzIGJ5IHNlZWluZyBpZiBSUF9SRUdOVU0KKyAgIGlzIHNhdmVkIGluIHRoZSBzdGFjayBhbnl3aGVyZSwgb3RoZXJ3aXNlIHdlIGdldCBpdCBmcm9tIHRoZQorICAgcmVnaXN0ZXJzLiAgSWYgdGhlIGlubmVyIGZyYW1lIGlzIGEgZHVtbXkgZnJhbWUsIHJldHVybiBpdHMgUEMKKyAgIGluc3RlYWQgb2YgUlAsIGJlY2F1c2UgdGhhdCdzIHdoZXJlICJjYWxsZXIiIG9mIHRoZSBkdW1teS1mcmFtZQorICAgd2lsbCBiZSBmb3VuZC4gICovCisKK0NPUkVfQUREUgorZnIzMF9mcmFtZV9zYXZlZF9wYyAoZmkpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKK3sKKyAgaWYgKFBDX0lOX0NBTExfRFVNTVkoZmktPnBjLCBmaS0+ZnJhbWUsIGZpLT5mcmFtZSkpCisgICAgcmV0dXJuIGdlbmVyaWNfcmVhZF9yZWdpc3Rlcl9kdW1teShmaS0+cGMsIGZpLT5mcmFtZSwgUENfUkVHTlVNKTsKKyAgZWxzZQorICAgIHJldHVybiBmcjMwX2ZpbmRfY2FsbGVyc19yZWcgKGZpLCBSUF9SRUdOVU0pOworfQorCisvKiBGdW5jdGlvbjogZml4X2NhbGxfZHVtbXkKKyAgIFBva2VzIHRoZSBjYWxsZWUgZnVuY3Rpb24ncyBhZGRyZXNzIGludG8gdGhlIENBTExfRFVNTVkgYXNzZW1ibHkgc3R1Yi4KKyAgIEFzc3VtZXMgdGhhdCB0aGUgQ0FMTF9EVU1NWSBsb29rcyBsaWtlIHRoaXM6CisJamFybCA8b2Zmc2V0MjQ+LCByMzEKKwl0cmFwCisgICAqLworCitpbnQKK2ZyMzBfZml4X2NhbGxfZHVtbXkgKGR1bW15LCBzcCwgZnVuLCBuYXJncywgYXJncywgdHlwZSwgZ2NjX3ApCisgICAgIGNoYXIgKmR1bW15OworICAgICBDT1JFX0FERFIgc3A7CisgICAgIENPUkVfQUREUiBmdW47CisgICAgIGludCBuYXJnczsKKyAgICAgdmFsdWVfcHRyICphcmdzOworICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgaW50IGdjY19wOworeworICBsb25nIG9mZnNldDI0OworCisgIG9mZnNldDI0ID0gKGxvbmcpIGZ1biAtIChsb25nKSBlbnRyeV9wb2ludF9hZGRyZXNzICgpOworICBvZmZzZXQyNCAmPSAweDNmZmZmZjsKKyAgb2Zmc2V0MjQgfD0gMHhmZjgwMDAwMDsJLyogamFybCA8b2Zmc2V0MjQ+LCByMzEgKi8KKworICBzdG9yZV91bnNpZ25lZF9pbnRlZ2VyICgodW5zaWduZWQgaW50ICopJmR1bW15WzJdLCAyLCBvZmZzZXQyNCAmIDB4ZmZmZik7CisgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKCh1bnNpZ25lZCBpbnQgKikmZHVtbXlbMF0sIDIsIG9mZnNldDI0ID4+IDE2KTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9nZGIvZnJhbWUuaCBiL2dkYi9mcmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MzZjNmMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZnJhbWUuaApAQCAtMCwwICsxLDI2NCBAQAorLyogRGVmaW5pdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBzdGFjayBmcmFtZXMsIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4OSwgMTk5MSwgMTk5MiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWYgIWRlZmluZWQgKEZSQU1FX0gpCisjZGVmaW5lIEZSQU1FX0ggMQorCisvKiBEZXNjcmliZSB0aGUgc2F2ZWQgcmVnaXN0ZXJzIG9mIGEgZnJhbWUuICAqLworCisjaWYgZGVmaW5lZCAoRVhUUkFfRlJBTUVfSU5GTykgfHwgZGVmaW5lZCAoRlJBTUVfRklORF9TQVZFRF9SRUdTKQorLyogWFhYWCAtIGRlcHJlY2F0ZWQgKi8KK3N0cnVjdCBmcmFtZV9zYXZlZF9yZWdzCisgIHsKKworICAgIC8qIEZvciBlYWNoIHJlZ2lzdGVyLCBhZGRyZXNzIG9mIHdoZXJlIGl0IHdhcyBzYXZlZCBvbiBlbnRyeSB0bworICAgICAgIHRoZSBmcmFtZSwgb3IgemVybyBpZiBpdCB3YXMgbm90IHNhdmVkIG9uIGVudHJ5IHRvIHRoaXMgZnJhbWUuCisgICAgICAgVGhpcyBpbmNsdWRlcyBzcGVjaWFsIHJlZ2lzdGVycyBzdWNoIGFzIHBjIGFuZCBmcCBzYXZlZCBpbgorICAgICAgIHNwZWNpYWwgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBUaGUgU1BfUkVHTlVNIGlzIGV2ZW4gbW9yZQorICAgICAgIHNwZWNpYWwsIHRoZSBhZGRyZXNzIGhlcmUgaXMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZSwgbm90IHRoZQorICAgICAgIGFkZHJlc3Mgd2hlcmUgdGhlIHNwIHdhcyBzYXZlZC4gICovCisKKyAgICBDT1JFX0FERFIgcmVnc1tOVU1fUkVHU107CisgIH07CisjZW5kaWYKKworLyogV2Uga2VlcCBhIGNhY2hlIG9mIHN0YWNrIGZyYW1lcywgZWFjaCBvZiB3aGljaCBpcyBhICJzdHJ1Y3QKKyAgIGZyYW1lX2luZm8iLiAgVGhlIGlubmVybW9zdCBvbmUgZ2V0cyBhbGxvY2F0ZWQgKGluCisgICB3YWl0X2Zvcl9pbmZlcmlvcikgZWFjaCB0aW1lIHRoZSBpbmZlcmlvciBzdG9wczsgY3VycmVudF9mcmFtZQorICAgcG9pbnRzIHRvIGl0LiAgQWRkaXRpb25hbCBmcmFtZXMgZ2V0IGFsbG9jYXRlZCAoaW4KKyAgIGdldF9wcmV2X2ZyYW1lX2luZm8pIGFzIG5lZWRlZCwgYW5kIGFyZSBjaGFpbmVkIHRocm91Z2ggdGhlIG5leHQKKyAgIGFuZCBwcmV2IGZpZWxkcy4gIEFueSB0aW1lIHRoYXQgdGhlIGZyYW1lIGNhY2hlIGJlY29tZXMgaW52YWxpZAorICAgKG1vc3Qgbm90YWJseSB3aGVuIHdlIGV4ZWN1dGUgc29tZXRoaW5nLCBidXQgYWxzbyBpZiB3ZSBjaGFuZ2UgaG93CisgICB3ZSBpbnRlcnByZXQgdGhlIGZyYW1lcyAoZS5nLiAic2V0IGhldXJpc3RpYy1mZW5jZS1wb3N0IiBpbgorICAgbWlwcy10ZGVwLmMsIG9yIGFueXRoaW5nIHdoaWNoIHJlYWRzIG5ldyBzeW1ib2xzKSksIHdlIHNob3VsZCBjYWxsCisgICByZWluaXRfZnJhbWVfY2FjaGUuICAqLworCitzdHJ1Y3QgZnJhbWVfaW5mbworICB7CisgICAgLyogTm9taW5hbCBhZGRyZXNzIG9mIHRoZSBmcmFtZSBkZXNjcmliZWQuICBTZWUgY29tbWVudHMgYXQgRlJBTUVfRlAKKyAgICAgICBhYm91dCB3aGF0IHRoaXMgbWVhbnMgb3V0c2lkZSB0aGUgKkZSQU1FKiBtYWNyb3M7IGluIHRoZSAqRlJBTUUqCisgICAgICAgbWFjcm9zLCBpdCBjYW4gbWVhbiB3aGF0ZXZlciBtYWtlcyBtb3N0IHNlbnNlIGZvciB0aGlzIG1hY2hpbmUuICAqLworICAgIENPUkVfQUREUiBmcmFtZTsKKworICAgIC8qIEFkZHJlc3MgYXQgd2hpY2ggZXhlY3V0aW9uIGlzIG9jY3VycmluZyBpbiB0aGlzIGZyYW1lLgorICAgICAgIEZvciB0aGUgaW5uZXJtb3N0IGZyYW1lLCBpdCdzIHRoZSBjdXJyZW50IHBjLgorICAgICAgIEZvciBvdGhlciBmcmFtZXMsIGl0IGlzIGEgcGMgc2F2ZWQgaW4gdGhlIG5leHQgZnJhbWUuICAqLworICAgIENPUkVfQUREUiBwYzsKKworICAgIC8qIE5vbnplcm8gaWYgdGhpcyBpcyBhIGZyYW1lIGFzc29jaWF0ZWQgd2l0aCBjYWxsaW5nIGEgc2lnbmFsIGhhbmRsZXIuCisKKyAgICAgICBTZXQgYnkgbWFjaGluZS1kZXBlbmRlbnQgY29kZS4gIE9uIHNvbWUgbWFjaGluZXMsIGlmCisgICAgICAgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGNvZGUgZmFpbHMgdG8gY2hlY2sgZm9yIHRoaXMsIHRoZSBiYWNrdHJhY2UKKyAgICAgICB3aWxsIGxvb2sgcmVsYXRpdmVseSBub3JtYWwuICBGb3IgZXhhbXBsZSwgb24gdGhlIGkzODYKKyAgICAgICAgICMzICAweDE1ODcyOCBpbiBzaWdob2xkICgpCisgICAgICAgT24gb3RoZXIgbWFjaGluZXMgKGUuZy4gcnM2MDAwKSwgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGNvZGUgYmV0dGVyCisgICAgICAgc2V0IHRoaXMgdG8gcHJldmVudCB1cyBmcm9tIHRyeWluZyB0byBwcmludCBpdCBsaWtlIGEgbm9ybWFsIGZyYW1lLiAgKi8KKyAgICBpbnQgc2lnbmFsX2hhbmRsZXJfY2FsbGVyOworCisgICAgLyogRm9yIGVhY2ggcmVnaXN0ZXIsIGFkZHJlc3Mgb2Ygd2hlcmUgaXQgd2FzIHNhdmVkIG9uIGVudHJ5IHRvCisgICAgICAgdGhlIGZyYW1lLCBvciB6ZXJvIGlmIGl0IHdhcyBub3Qgc2F2ZWQgb24gZW50cnkgdG8gdGhpcyBmcmFtZS4KKyAgICAgICBUaGlzIGluY2x1ZGVzIHNwZWNpYWwgcmVnaXN0ZXJzIHN1Y2ggYXMgcGMgYW5kIGZwIHNhdmVkIGluCisgICAgICAgc3BlY2lhbCB3YXlzIGluIHRoZSBzdGFjayBmcmFtZS4gIFRoZSBTUF9SRUdOVU0gaXMgZXZlbiBtb3JlCisgICAgICAgc3BlY2lhbCwgdGhlIGFkZHJlc3MgaGVyZSBpcyB0aGUgc3AgZm9yIHRoZSBuZXh0IGZyYW1lLCBub3QgdGhlCisgICAgICAgYWRkcmVzcyB3aGVyZSB0aGUgc3Agd2FzIHNhdmVkLiAgKi8KKyAgICAvKiBBbGxvY2F0ZWQgYnkgZnJhbWVfc2F2ZWRfcmVnc196YWxsb2MgKCkgd2hpY2ggaXMgY2FsbGVkIC8KKyAgICAgICBpbml0aWFsaXplZCBieSBGUkFNRV9JTklUX1NBVkVEX1JFR1MoKS4gKi8KKyAgICBDT1JFX0FERFIgKnNhdmVkX3JlZ3M7IC8qTlVNX1JFR1MqLworCisjaWZkZWYgRVhUUkFfRlJBTUVfSU5GTworICAgIC8qIFhYWFggLSBkZXByZWNhdGVkICovCisgICAgLyogQW55dGhpbmcgZXh0cmEgZm9yIHRoaXMgc3RydWN0dXJlIHRoYXQgbWF5IGhhdmUgYmVlbiBkZWZpbmVkCisgICAgICAgaW4gdGhlIG1hY2hpbmUgZGVwZW5kZW50IGZpbGVzLiAqLworICAgIEVYVFJBX0ZSQU1FX0lORk8KKyNlbmRpZgorCisgICAgLyogQW55dGhpbmcgZXh0cmEgZm9yIHRoaXMgc3RydWN0dXJlIHRoYXQgbWF5IGhhdmUgYmVlbiBkZWZpbmVkCisgICAgICAgaW4gdGhlIG1hY2hpbmUgZGVwZW5kZW50IGZpbGVzLiAqLworICAgIC8qIEFsbG9jYXRlZCBieSBmcmFtZV9vYnN0YWNrX2FsbG9jICgpIHdoaWNoIGlzIGNhbGxlZCAvCisgICAgICAgaW5pdGlhbGl6ZWQgYnkgSU5JVF9FWFRSQV9GUkFNRV9JTkZPICovCisgICAgc3RydWN0IGZyYW1lX2V4dHJhX2luZm8gKmV4dHJhX2luZm87CisKKyAgICAvKiBQb2ludGVycyB0byB0aGUgbmV4dCBhbmQgcHJldmlvdXMgZnJhbWVfaW5mbydzIGluIHRoZSBmcmFtZSBjYWNoZS4gICovCisgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqbmV4dCwgKnByZXY7CisgIH07CisKKy8qIEFsbG9jYXRlIGFkZGl0aW9uYWwgc3BhY2UgZm9yIGFwcGVuZGljZXMgdG8gYSBzdHJ1Y3QgZnJhbWVfaW5mby4gKi8KKworI2lmbmRlZiBTSVpFT0ZfRlJBTUVfU0FWRURfUkVHUworI2RlZmluZSBTSVpFT0ZfRlJBTUVfU0FWRURfUkVHUyAoc2l6ZW9mIChDT1JFX0FERFIpICogKE5VTV9SRUdTKSkKKyNlbmRpZgorZXh0ZXJuIHZvaWQgKmZyYW1lX29ic3RhY2tfYWxsb2MgUEFSQU1TICgodW5zaWduZWQgbG9uZyBzaXplKSk7CitleHRlcm4gdm9pZCBmcmFtZV9zYXZlZF9yZWdzX3phbGxvYyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisKKy8qIER1bW15IGZyYW1lLiAgVGhpcyBzYXZlcyB0aGUgcHJvY2Vzc29yIHN0YXRlIGp1c3QgcHJpb3IgdG8gc2V0dGluZyB1cCB0aGUKKyAgIGluZmVyaW9yIGZ1bmN0aW9uIGNhbGwuICBPbiBtb3N0IHRhcmdldHMsIHRoZSByZWdpc3RlcnMgYXJlIHNhdmVkIG9uIHRoZQorICAgdGFyZ2V0IHN0YWNrLCBidXQgdGhhdCByZWFsbHkgc2xvd3MgZG93biBmdW5jdGlvbiBjYWxscy4gICovCisKK3N0cnVjdCBkdW1teV9mcmFtZQoreworICBzdHJ1Y3QgZHVtbXlfZnJhbWUgKm5leHQ7CisKKyAgQ09SRV9BRERSIHBjOworICBDT1JFX0FERFIgZnA7CisgIENPUkVfQUREUiBzcDsKKyAgY2hhciByZWdzW1JFR0lTVEVSX0JZVEVTXTsKK307CisKKy8qIFJldHVybiB0aGUgZnJhbWUgYWRkcmVzcyBmcm9tIEZSLiAgRXhjZXB0IGluIHRoZSBtYWNoaW5lLWRlcGVuZGVudAorICAgKkZSQU1FKiBtYWNyb3MsIGEgZnJhbWUgYWRkcmVzcyBoYXMgbm8gZGVmaW5lZCBtZWFuaW5nIG90aGVyIHRoYW4KKyAgIGFzIGEgbWFnaWMgY29va2llIHdoaWNoIGlkZW50aWZpZXMgYSBmcmFtZSBvdmVyIGNhbGxzIHRvIHRoZQorICAgaW5mZXJpb3IuICBUaGUgb25seSBrbm93biBleGNlcHRpb24gaXMgaW5mZXJpb3IuaAorICAgKFBDX0lOX0NBTExfRFVNTVkpIFtPTl9TVEFDS107IHNlZSBjb21tZW50cyB0aGVyZS4gIFlvdSBjYW5ub3QKKyAgIGFzc3VtZSB0aGF0IGEgZnJhbWUgYWRkcmVzcyBjb250YWlucyBlbm91Z2ggaW5mb3JtYXRpb24gdG8KKyAgIHJlY29uc3RydWN0IHRoZSBmcmFtZTsgaWYgeW91IHdhbnQgbW9yZSB0aGFuIGp1c3QgdG8gaWRlbnRpZnkgdGhlCisgICBmcmFtZSAoZS5nLiBiZSBhYmxlIHRvIGZldGNoIHZhcmlhYmxlcyByZWxhdGl2ZSB0byB0aGF0IGZyYW1lKSwKKyAgIHRoZW4gc2F2ZSB0aGUgd2hvbGUgc3RydWN0IGZyYW1lX2luZm8gKGFuZCB0aGUgbmV4dCBzdHJ1Y3QKKyAgIGZyYW1lX2luZm8sIHNpbmNlIHRoZSBsYXR0ZXIgaXMgdXNlZCBmb3IgZmV0Y2hpbmcgdmFyaWFibGVzIG9uIHNvbWUKKyAgIG1hY2hpbmVzKS4gICovCisKKyNkZWZpbmUgRlJBTUVfRlAoZmkpICgoZmkpLT5mcmFtZSkKKworLyogRGVmaW5lIGEgZGVmYXVsdCBGUkFNRV9DSEFJTl9WQUxJRCwgaW4gdGhlIGZvcm0gdGhhdCBpcyBzdWl0YWJsZSBmb3IgbW9zdAorICAgdGFyZ2V0cy4gIElmIEZSQU1FX0NIQUlOX1ZBTElEIHJldHVybnMgemVybyBpdCBtZWFucyB0aGF0IHRoZSBnaXZlbiBmcmFtZQorICAgaXMgdGhlIG91dGVybW9zdCBvbmUgYW5kIGhhcyBubyBjYWxsZXIuCisKKyAgIElmIGEgcGFydGljdWxhciB0YXJnZXQgbmVlZHMgYSBkaWZmZXJlbnQgZGVmaW5pdGlvbiwgdGhlbiBpdCBjYW4gb3ZlcnJpZGUKKyAgIHRoZSBkZWZpbml0aW9uIGhlcmUgYnkgcHJvdmlkaW5nIG9uZSBpbiB0aGUgdG0gZmlsZS4KKworICAgWFhYWCAtIGJvdGggZGVmYXVsdCBhbmQgYWx0ZXJuYXRlIGZyYW1lX2NoYWluX3ZhbGlkIGZ1bmN0aW9ucyBhcmUKKyAgIGRlcHJlY2F0ZWQuICBOZXcgY29kZSBzaG91bGQgdXNlIGdlbmVyaWMgZHVtbXkgZnJhbWVzLiAqLworCitleHRlcm4gaW50IGRlZmF1bHRfZnJhbWVfY2hhaW5fdmFsaWQgUEFSQU1TICgoQ09SRV9BRERSLCBzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CitleHRlcm4gaW50IGFsdGVybmF0ZV9mcmFtZV9jaGFpbl92YWxpZCBQQVJBTVMgKChDT1JFX0FERFIsIHN0cnVjdCBmcmFtZV9pbmZvICopKTsKK2V4dGVybiBpbnQgbm9ubnVsbF9mcmFtZV9jaGFpbl92YWxpZCBQQVJBTVMgKChDT1JFX0FERFIsIHN0cnVjdCBmcmFtZV9pbmZvICopKTsKK2V4dGVybiBpbnQgZ2VuZXJpY19mcmFtZV9jaGFpbl92YWxpZCBQQVJBTVMgKChDT1JFX0FERFIsIHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworI2lmICFkZWZpbmVkIChGUkFNRV9DSEFJTl9WQUxJRCkKKyNpZiAhZGVmaW5lZCAoRlJBTUVfQ0hBSU5fVkFMSURfQUxURVJOQVRFKQorI2RlZmluZSBGUkFNRV9DSEFJTl9WQUxJRChjaGFpbiwgdGhpc2ZyYW1lKSBkZWZhdWx0X2ZyYW1lX2NoYWluX3ZhbGlkIChjaGFpbiwgdGhpc2ZyYW1lKQorI2Vsc2UKKy8qIFVzZSB0aGUgYWx0ZXJuYXRlIG1ldGhvZCBvZiBhdm9pZGluZyBydW5uaW5nIHVwIG9mZiB0aGUgZW5kIG9mIHRoZSBmcmFtZQorICAgY2hhaW4gb3IgZm9sbG93aW5nIGZyYW1lcyBiYWNrIGludG8gdGhlIHN0YXJ0dXAgY29kZS4gIFNlZSB0aGUgY29tbWVudHMKKyAgIGluIG9iamZpbGVzLmguICovCisjZGVmaW5lIEZSQU1FX0NIQUlOX1ZBTElEKGNoYWluLCB0aGlzZnJhbWUpIGFsdGVybmF0ZV9mcmFtZV9jaGFpbl92YWxpZCAoY2hhaW4sdGhpc2ZyYW1lKQorI2VuZGlmCS8qIEZSQU1FX0NIQUlOX1ZBTElEX0FMVEVSTkFURSAqLworI2VuZGlmCS8qIEZSQU1FX0NIQUlOX1ZBTElEICovCisKKy8qIFRoZSBzdGFjayBmcmFtZSB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgZm9yIGNvbW1hbmRzIHRvIGFjdCBvbi4KKyAgIE5vdGUgdGhhdCBvbmUgY2Fubm90IGFzc3VtZSB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIHZhbGlkIGRhdGEuICAqLworCitleHRlcm4gc3RydWN0IGZyYW1lX2luZm8gKnNlbGVjdGVkX2ZyYW1lOworCisvKiBMZXZlbCBvZiB0aGUgc2VsZWN0ZWQgZnJhbWU6CisgICAwIGZvciBpbm5lcm1vc3QsIDEgZm9yIGl0cyBjYWxsZXIsIC4uLgorICAgb3IgLTEgZm9yIGZyYW1lIHNwZWNpZmllZCBieSBhZGRyZXNzIHdpdGggbm8gZGVmaW5lZCBsZXZlbC4gICovCisKK2V4dGVybiBpbnQgc2VsZWN0ZWRfZnJhbWVfbGV2ZWw7CisKK2V4dGVybiBzdHJ1Y3QgZnJhbWVfaW5mbyAqZ2V0X3ByZXZfZnJhbWVfaW5mbyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgZnJhbWVfaW5mbyAqY3JlYXRlX25ld19mcmFtZSBQQVJBTVMgKChDT1JFX0FERFIsIENPUkVfQUREUikpOworCitleHRlcm4gdm9pZCBmbHVzaF9jYWNoZWRfZnJhbWVzIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgcmVpbml0X2ZyYW1lX2NhY2hlIFBBUkFNUyAoKHZvaWQpKTsKKworCisjaWZkZWYgRlJBTUVfRklORF9TQVZFRF9SRUdTCisvKiBYWFggLSBkZXByZWNhdGVkICovCisjZGVmaW5lIEZSQU1FX0lOSVRfU0FWRURfUkVHUyhGSSkgZ2V0X2ZyYW1lX3NhdmVkX3JlZ3MgKEZJLCBOVUxMKQorZXh0ZXJuIHZvaWQgZ2V0X2ZyYW1lX3NhdmVkX3JlZ3MgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKiwKKwkJCQkJICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqKSk7CisjZW5kaWYKKyAgCitleHRlcm4gdm9pZCBzZXRfY3VycmVudF9mcmFtZSBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgZnJhbWVfaW5mbyAqZ2V0X3ByZXZfZnJhbWUgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworCitleHRlcm4gc3RydWN0IGZyYW1lX2luZm8gKmdldF9jdXJyZW50X2ZyYW1lIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHN0cnVjdCBmcmFtZV9pbmZvICpnZXRfbmV4dF9mcmFtZSBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgYmxvY2sgKmdldF9mcmFtZV9ibG9jayBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgYmxvY2sgKmdldF9jdXJyZW50X2Jsb2NrIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHN0cnVjdCBibG9jayAqZ2V0X3NlbGVjdGVkX2Jsb2NrIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKmdldF9mcmFtZV9mdW5jdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CisKK2V4dGVybiBDT1JFX0FERFIgZ2V0X2ZyYW1lX3BjIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworZXh0ZXJuIENPUkVfQUREUiBnZXRfcGNfZnVuY3Rpb25fc3RhcnQgUEFSQU1TICgoQ09SRV9BRERSKSk7CisKK2V4dGVybiBzdHJ1Y3QgYmxvY2sgKiBibG9ja19mb3JfcGMgUEFSQU1TICgoQ09SRV9BRERSKSk7CisKK2V4dGVybiBzdHJ1Y3QgYmxvY2sgKiBibG9ja19mb3JfcGNfc2VjdCBQQVJBTVMgKChDT1JFX0FERFIsIGFzZWN0aW9uICopKTsKKworZXh0ZXJuIGludCBmcmFtZWxlc3NfbG9va19mb3JfcHJvbG9ndWUgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworCitleHRlcm4gdm9pZCBwcmludF9mcmFtZV9hcmdzIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKiwgc3RydWN0IGZyYW1lX2luZm8gKiwKKwkJCQkgICAgICBpbnQsIEdEQl9GSUxFICopKTsKKworZXh0ZXJuIHN0cnVjdCBmcmFtZV9pbmZvICpmaW5kX3JlbGF0aXZlX2ZyYW1lIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICosIGludCopKTsKKworZXh0ZXJuIHZvaWQgcHJpbnRfc3RhY2tfZnJhbWUgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKiwgaW50LCBpbnQpKTsKKworZXh0ZXJuIHZvaWQgcHJpbnRfb25seV9zdGFja19mcmFtZSBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqLCBpbnQsIGludCkpOworCitleHRlcm4gdm9pZCBzaG93X3N0YWNrX2ZyYW1lIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworZXh0ZXJuIHZvaWQgc2VsZWN0X2ZyYW1lIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICosIGludCkpOworCitleHRlcm4gdm9pZCByZWNvcmRfc2VsZWN0ZWRfZnJhbWUgUEFSQU1TICgoQ09SRV9BRERSICosIGludCAqKSk7CisKK2V4dGVybiB2b2lkIHNlbGVjdF9hbmRfcHJpbnRfZnJhbWUgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKiwgaW50KSk7CisKK2V4dGVybiB2b2lkIHByaW50X2ZyYW1lX2luZm8gUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKiwgaW50LCBpbnQsIGludCkpOworCitleHRlcm4gdm9pZCBzaG93X2ZyYW1lX2luZm8gUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKiwgaW50LCBpbnQsIGludCkpOworCitleHRlcm4gQ09SRV9BRERSIGZpbmRfc2F2ZWRfcmVnaXN0ZXIgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKiwgaW50KSk7CisKK2V4dGVybiBzdHJ1Y3QgZnJhbWVfaW5mbyAqYmxvY2tfaW5uZXJtb3N0X2ZyYW1lIFBBUkFNUyAoKHN0cnVjdCBibG9jayAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmluZF9mcmFtZV9hZGRyX2luX2ZyYW1lX2NoYWluIFBBUkFNUyAoKENPUkVfQUREUikpOworCitleHRlcm4gQ09SRV9BRERSIHNpZ3RyYW1wX3NhdmVkX3BjIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKKworZXh0ZXJuIENPUkVfQUREUiBnZW5lcmljX3JlYWRfcmVnaXN0ZXJfZHVtbXkgUEFSQU1TICgoQ09SRV9BRERSIHBjLCAKKwkJCQkJCSAgICAgIENPUkVfQUREUiBmcCwgCisJCQkJCQkgICAgICBpbnQpKTsKK2V4dGVybiB2b2lkICAgICAgZ2VuZXJpY19wdXNoX2R1bW15X2ZyYW1lICAgIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICAgICAgZ2VuZXJpY19wb3BfY3VycmVudF9mcmFtZSAgIFBBUkFNUyAoKHZvaWQgKCopIChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSkpOworZXh0ZXJuIHZvaWQgICAgICBnZW5lcmljX3BvcF9kdW1teV9mcmFtZSAgICAgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gaW50ICAgICAgIGdlbmVyaWNfcGNfaW5fY2FsbF9kdW1teSAgICBQQVJBTVMgKChDT1JFX0FERFIgcGMsIAorCQkJCQkJICAgICAgQ09SRV9BRERSIGZwKSk7CitleHRlcm4gY2hhciAqICAgIGdlbmVyaWNfZmluZF9kdW1teV9mcmFtZSAgICBQQVJBTVMgKChDT1JFX0FERFIgcGMsIAorCQkJCQkJICAgICAgQ09SRV9BRERSIGZwKSk7CisKKyNpZmRlZiBfX0dOVUNfXworLyogU29tZSBuYXRpdmUgY29tcGlsZXJzLCBldmVuIG9uZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgQU5TSSBhbmQgZm9yIHdoaWNoIF9fU1REQ19fCisgICBpcyB0cnVlLCBjb21wbGFpbiBhYm91dCBmb3J3YXJkIGRlY2xzIG9mIGVudW1zLiAqLworZW51bSBsdmFsX3R5cGU7CitleHRlcm4gdm9pZAkgZ2VuZXJpY19nZXRfc2F2ZWRfcmVnaXN0ZXIgIFBBUkFNUyAoKGNoYXIgKiwgaW50ICosIENPUkVfQUREUiAqLCBzdHJ1Y3QgZnJhbWVfaW5mbyAqLCBpbnQsIGVudW0gbHZhbF90eXBlICopKTsKKyNlbmRpZgorCisjZW5kaWYgLyogIWRlZmluZWQgKEZSQU1FX0gpICAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2dkYi1zdGFicy5oIGIvZ2RiL2dkYi1zdGFicy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZDc4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZ2RiLXN0YWJzLmgKQEAgLTAsMCArMSw5MiBAQAorLyogRGVmaW5pdGlvbnMgZm9yIHN5bWJvbC1yZWFkaW5nIGNvbnRhaW5pbmcgInN0YWJzIiwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuICBXcml0dGVuIGJ5IEpvaG4gR2lsbW9yZS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGZpbGUgZXhpc3RzIHRvIGhvbGQgdGhlIGNvbW1vbiBkZWZpbml0aW9ucyByZXF1aXJlZCBvZiBtb3N0IG9mCisgICB0aGUgc3ltYm9sLXJlYWRlcnMgdGhhdCBlbmQgdXAgdXNpbmcgc3RhYnMuICBUaGUgY29tbW9uIHVzZSBvZgorICAgdGhlc2UgYHN5bWJvbC10eXBlLXNwZWNpZmljJyBjdXN0b21pemF0aW9ucyBvZiB0aGUgZ2VuZXJpYyBkYXRhCisgICBzdHJ1Y3R1cmVzIG1ha2VzIHRoZSBzdGFicy1vcmllbnRlZCBzeW1ib2wgcmVhZGVycyBhYmxlIHRvIGNhbGwKKyAgIGVhY2ggb3RoZXJzJyBmdW5jdGlvbnMgYXMgcmVxdWlyZWQuICAqLworCisjaWYgIWRlZmluZWQgKEdEQlNUQUJTX0gpCisjZGVmaW5lIEdEQlNUQUJTX0gKKworLyogT2Zmc2V0cyBpbiB0aGUgcHN5bXRhYidzIHNlY3Rpb25fb2Zmc2V0cyBhcnJheSBmb3IgdmFyaW91cyBraW5kcyBvZgorICAgc3RhYnMgc3ltYm9scy4gIEV2ZXJ5IHBzeW10YWIgYnVpbHQgZnJvbSBzdGFicyB3aWxsIGhhdmUgdGhlc2Ugb2Zmc2V0cworICAgZmlsbGVkIGluIGJ5IHRoZXNlIGd1aWRlbGluZXMsIHNvIHRoYXQgd2hlbiBhY3R1YWxseSByZWFkaW5nIHN5bWJvbHMsIHRoZQorICAgcHJvcGVyIG9mZnNldCBjYW4gc2ltcGx5IGJlIHNlbGVjdGVkIGFuZCBhZGRlZCB0byB0aGUgc3ltYm9sIHZhbHVlLiAgKi8KKworI2RlZmluZQlTRUNUX09GRl9URVhUCTAKKyNkZWZpbmUJU0VDVF9PRkZfREFUQQkxCisjZGVmaW5lCVNFQ1RfT0ZGX0JTUwkyCisjZGVmaW5lCVNFQ1RfT0ZGX1JPREFUQQkzCisjZGVmaW5lCVNFQ1RfT0ZGX01BWAk0CQkvKiBDb3VudCBvZiBwb3NzaWJsZSB2YWx1ZXMgKi8KKworLyogVGhlIHN0YWJfc2VjdGlvbl9pbmZvIGNoYWluIHJlbWVtYmVycyBpbmZvIGZyb20gdGhlIEVMRiBzeW1ib2wgdGFibGUsCisgICB3aGlsZSBwc3ltdGFicyBhcmUgYmVpbmcgYnVpbHQgZm9yIHRoZSBvdGhlciBzeW1ib2wgdGFibGVzIGluIHRoZSAKKyAgIG9iamZpbGUuICBJdCBpcyBkZXN0cm95ZWQgYXQgdGhlIGNvbXBsYXRpb24gb2YgcHN5bXRhYi1yZWFkaW5nLgorICAgQW55IGluZm8gdGhhdCB3YXMgdXNlZCBmcm9tIGl0IGhhcyBiZWVuIGNvcGllZCBpbnRvIHBzeW10YWJzLiAgKi8KKworc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvIHsKKyAgY2hhciAqZmlsZW5hbWU7CisgIENPUkVfQUREUiBzZWN0aW9uc1tTRUNUX09GRl9NQVhdOworICBzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKm5leHQ7CisgIGludCBmb3VuZDsJCS8qIENvdW50IG9mIHRpbWVzIGl0J3MgZm91bmQgaW4gc2VhcmNoaW5nICovCit9OworCisvKiBJbmZvcm1hdGlvbiBpcyBwYXNzZWQgYW1vbmcgdmFyaW91cyBkYnhyZWFkIHJvdXRpbmVzIGZvciBhY2Nlc3NpbmcKKyAgIHN5bWJvbCBmaWxlcy4gIEEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSBpcyBrZXB0IGluIHRoZSBzeW1fc3RhYl9pbmZvCisgICBmaWVsZCBvZiB0aGUgb2JqZmlsZSBzdHJ1Y3QuICAqLworIAorc3RydWN0IGRieF9zeW1maWxlX2luZm8geworICBDT1JFX0FERFIgdGV4dF9hZGRyOwkJLyogU3RhcnQgb2YgdGV4dCBzZWN0aW9uICovCisgIGludCB0ZXh0X3NpemU7CQkvKiBTaXplIG9mIHRleHQgc2VjdGlvbiAqLworICBpbnQgc3ltY291bnQ7CQkJLyogSG93IG1hbnkgc3ltYm9scyBhcmUgdGhlcmUgaW4gdGhlIGZpbGUgKi8KKyAgY2hhciAqc3RyaW5ndGFiOwkJLyogVGhlIGFjdHVhbCBzdHJpbmcgdGFibGUgKi8KKyAgaW50IHN0cmluZ3RhYl9zaXplOwkJLyogSXRzIHNpemUgKi8KKyAgZmlsZV9wdHIgc3ltdGFiX29mZnNldDsJLyogT2Zmc2V0IGluIGZpbGUgdG8gc3ltYm9sIHRhYmxlICovCisgIGludCBzeW1ib2xfc2l6ZTsJCS8qIEJ5dGVzIGluIGEgc2luZ2xlIHN5bWJvbCAqLworICBzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKnN0YWJfc2VjdGlvbl9pbmZvOyAJLyogc2VjdGlvbiBzdGFydGluZyBwb2ludHMKKwkJCQkgICBvZiB0aGUgb3JpZ2luYWwgLm8gZmlsZXMgYmVmb3JlIGxpbmtpbmcuICovCisKKyAgLyogU2VlIHN0YWJzcmVhZC5oIGZvciB0aGUgdXNlIG9mIHRoZSBmb2xsb3dpbmcuICovCisgIHN0cnVjdCBoZWFkZXJfZmlsZSAqaGVhZGVyX2ZpbGVzOworICBpbnQgbl9oZWFkZXJfZmlsZXM7CisgIGludCBuX2FsbG9jYXRlZF9oZWFkZXJfZmlsZXM7CisKKyAgLyogUG9pbnRlcnMgdG8gQkZEIHNlY3Rpb25zLiAgVGhlc2UgYXJlIHVzZWQgdG8gc3BlZWQgdXAgdGhlIGJ1aWxkaW5nIG9mCisgICAgIG1pbmltYWwgc3ltYm9scy4gICovCisgIGFzZWN0aW9uICp0ZXh0X3NlY3Rpb247CisgIGFzZWN0aW9uICpkYXRhX3NlY3Rpb247CisgIGFzZWN0aW9uICpic3Nfc2VjdGlvbjsKK307CisKKyNkZWZpbmUgREJYX1NZTUZJTEVfSU5GTyhvKQkoKG8pLT5zeW1fc3RhYl9pbmZvKQorI2RlZmluZSBEQlhfVEVYVF9BRERSKG8pCShEQlhfU1lNRklMRV9JTkZPKG8pLT50ZXh0X2FkZHIpCisjZGVmaW5lIERCWF9URVhUX1NJWkUobykJKERCWF9TWU1GSUxFX0lORk8obyktPnRleHRfc2l6ZSkKKyNkZWZpbmUgREJYX1NZTUNPVU5UKG8pCQkoREJYX1NZTUZJTEVfSU5GTyhvKS0+c3ltY291bnQpCisjZGVmaW5lIERCWF9TVFJJTkdUQUIobykJKERCWF9TWU1GSUxFX0lORk8obyktPnN0cmluZ3RhYikKKyNkZWZpbmUgREJYX1NUUklOR1RBQl9TSVpFKG8pCShEQlhfU1lNRklMRV9JTkZPKG8pLT5zdHJpbmd0YWJfc2l6ZSkKKyNkZWZpbmUgREJYX1NZTVRBQl9PRkZTRVQobykJKERCWF9TWU1GSUxFX0lORk8obyktPnN5bXRhYl9vZmZzZXQpCisjZGVmaW5lIERCWF9TWU1CT0xfU0laRShvKQkoREJYX1NZTUZJTEVfSU5GTyhvKS0+c3ltYm9sX3NpemUpCisjZGVmaW5lIERCWF9URVhUX1NFQ1RJT04obykJKERCWF9TWU1GSUxFX0lORk8obyktPnRleHRfc2VjdGlvbikKKyNkZWZpbmUgREJYX0RBVEFfU0VDVElPTihvKQkoREJYX1NZTUZJTEVfSU5GTyhvKS0+ZGF0YV9zZWN0aW9uKQorI2RlZmluZSBEQlhfQlNTX1NFQ1RJT04obykJKERCWF9TWU1GSUxFX0lORk8obyktPmJzc19zZWN0aW9uKQorCisjZW5kaWYgLyogR0RCU1RBQlNfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2dkYi4xIGIvZ2RiL2dkYi4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MzBiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZ2RiLjEKQEAgLTAsMCArMSwzNzUgQEAKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisuXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KKy5cIiAkSWQkCisuVEggZ2RiIDEgIjRub3YxOTkxIiAiR05VIFRvb2xzIiAiR05VIFRvb2xzIgorLlNIIE5BTUUKK2dkYiBcLSBUaGUgR05VIERlYnVnZ2VyCisuU0ggU1lOT1BTSVMKKy5uYQorLlRQCisuQiBnZGIKKy5SQiAiW1x8IiBcLWhlbHAgIlx8XSIKKy5SQiAiW1x8IiBcLW54ICJcfF0iCisuUkIgIltcfCIgXC1xICJcfF0iCisuUkIgIltcfCIgXC1iYXRjaCAiXHxdIgorLlJCICJbXHwiIFwtY2Q9XGMKKy5JIGRpclxjCitcfF0KKy5SQiAiW1x8IiBcLWYgIlx8XSIKKy5SQiAiW1x8IiAiXC1iXCAiXGMKKy5JUiBicHMgIlx8XSIKKy5SQiAiW1x8IiAiXC10dHk9IlxjCisuSVIgZGV2ICJcfF0iCisuUkIgIltcfCIgIlwtcyAiXGMKKy5JIHN5bWZpbGVcYworXCZcfF0KKy5SQiAiW1x8IiAiXC1lICJcYworLkkgcHJvZ1xjCitcJlx8XSAgCisuUkIgIltcfCIgIlwtc2UgIlxjCisuSSBwcm9nXGMKK1wmXHxdCisuUkIgIltcfCIgIlwtYyAiXGMKKy5JIGNvcmVcYworXCZcfF0KKy5SQiAiW1x8IiAiXC14ICJcYworLkkgY21kc1xjCitcJlx8XQorLlJCICJbXHwiICJcLWQgIlxjCisuSSBkaXJcYworXCZcfF0KKy5SQiAiW1x8IiBcYworLkkgcHJvZ1xjCisuUkIgIltcfCIgXGMKKy5JUiBjb3JlIFx8fFx8IHByb2NJRFxjCitcJlx8XVwmXHxdCisuYWQgYgorLlNIIERFU0NSSVBUSU9OCitUaGUgcHVycG9zZSBvZiBhIGRlYnVnZ2VyIHN1Y2ggYXMgR0RCIGlzIHRvIGFsbG93IHlvdSB0byBzZWUgd2hhdCBpcworZ29pbmcgb24gYGBpbnNpZGUnJyBhbm90aGVyIHByb2dyYW0gd2hpbGUgaXQgZXhlY3V0ZXNcKGVtXCZvciB3aGF0IGFub3RoZXIKK3Byb2dyYW0gd2FzIGRvaW5nIGF0IHRoZSBtb21lbnQgaXQgY3Jhc2hlZC4KKworR0RCIGNhbiBkbyBmb3VyIG1haW4ga2luZHMgb2YgdGhpbmdzIChwbHVzIG90aGVyIHRoaW5ncyBpbiBzdXBwb3J0IG9mCit0aGVzZSkgdG8gaGVscCB5b3UgY2F0Y2ggYnVncyBpbiB0aGUgYWN0OgorCisuVFAKK1wgXCBcIFwoYnUKK1N0YXJ0IHlvdXIgcHJvZ3JhbSwgc3BlY2lmeWluZyBhbnl0aGluZyB0aGF0IG1pZ2h0IGFmZmVjdCBpdHMgYmVoYXZpb3IuCisKKy5UUAorXCBcIFwgXChidQorTWFrZSB5b3VyIHByb2dyYW0gc3RvcCBvbiBzcGVjaWZpZWQgY29uZGl0aW9ucy4KKworLlRQCitcIFwgXCBcKGJ1CitFeGFtaW5lIHdoYXQgaGFzIGhhcHBlbmVkLCB3aGVuIHlvdXIgcHJvZ3JhbSBoYXMgc3RvcHBlZC4KKworLlRQCitcIFwgXCBcKGJ1CitDaGFuZ2UgdGhpbmdzIGluIHlvdXIgcHJvZ3JhbSwgc28geW91IGNhbiBleHBlcmltZW50IHdpdGggY29ycmVjdGluZyB0aGUKK2VmZmVjdHMgb2Ygb25lIGJ1ZyBhbmQgZ28gb24gdG8gbGVhcm4gYWJvdXQgYW5vdGhlci4KKy5QUAorCitZb3UgY2FuIHVzZSBHREIgdG8gZGVidWcgcHJvZ3JhbXMgd3JpdHRlbiBpbiBDLCBDKyssIGFuZCBNb2R1bGEtMi4KK0ZvcnRyYW4gc3VwcG9ydCB3aWxsIGJlIGFkZGVkIHdoZW4gYSBHTlUgRm9ydHJhbiBjb21waWxlciBpcyByZWFkeS4KKworR0RCIGlzIGludm9rZWQgd2l0aCB0aGUgc2hlbGwgY29tbWFuZCBcYworLkIgZ2RiXGMKK1wmLiAgT25jZSBzdGFydGVkLCBpdCByZWFkcworY29tbWFuZHMgZnJvbSB0aGUgdGVybWluYWwgdW50aWwgeW91IHRlbGwgaXQgdG8gZXhpdCB3aXRoIHRoZSBHREIKK2NvbW1hbmQgXGMKKy5CIHF1aXRcYworXCYuICBZb3UgY2FuIGdldCBvbmxpbmUgaGVscCBmcm9tIFxjCisuQiBnZGJcYworXCYgaXRzZWxmCitieSB1c2luZyB0aGUgY29tbWFuZCBcYworLkIgaGVscFxjCitcJi4KKworWW91IGNhbiBydW4gXGMKKy5CIGdkYlxjCitcJiB3aXRoIG5vIGFyZ3VtZW50cyBvciBvcHRpb25zOyBidXQgdGhlIG1vc3QKK3VzdWFsIHdheSB0byBzdGFydCBHREIgaXMgd2l0aCBvbmUgYXJndW1lbnQgb3IgdHdvLCBzcGVjaWZ5aW5nIGFuCitleGVjdXRhYmxlIHByb2dyYW0gYXMgdGhlIGFyZ3VtZW50OgorLnNwCisuYnIKK2dkYlwgcHJvZ3JhbQorLmJyCisuc3AKKworWW91IGNhbiBhbHNvIHN0YXJ0IHdpdGggYm90aCBhbiBleGVjdXRhYmxlIHByb2dyYW0gYW5kIGEgY29yZSBmaWxlIHNwZWNpZmllZDoKKy5zcAorLmJyCitnZGJcIHByb2dyYW1cIGNvcmUKKy5icgorLnNwCisKK1lvdSBjYW4sIGluc3RlYWQsIHNwZWNpZnkgYSBwcm9jZXNzIElEIGFzIGEgc2Vjb25kIGFyZ3VtZW50LCBpZiB5b3Ugd2FudAordG8gZGVidWcgYSBydW5uaW5nIHByb2Nlc3M6Cisuc3AKKy5icgorZ2RiXCBwcm9ncmFtXCAxMjM0CisuYnIKKy5zcAorCit3b3VsZCBhdHRhY2ggR0RCIHRvIHByb2Nlc3MgXGMKKy5CIDEyMzRcYworXCYgKHVubGVzcyB5b3UgYWxzbyBoYXZlIGEgZmlsZQorbmFtZWQgYFx8XGMKKy5CIDEyMzRcYworXCZcfCc7IEdEQiBkb2VzIGNoZWNrIGZvciBhIGNvcmUgZmlsZSBmaXJzdCkuCisKK0hlcmUgYXJlIHNvbWUgb2YgdGhlIG1vc3QgZnJlcXVlbnRseSBuZWVkZWQgR0RCIGNvbW1hbmRzOgorLlRQCisuQiBicmVhayBcZlJbXHxcZklmaWxlXGZCOlxmUlx8XVxmSWZ1bmN0aW9uCitcJgorU2V0IGEgYnJlYWtwb2ludCBhdCBcYworLkkgZnVuY3Rpb25cYworXCYgKGluIFxjCisuSSBmaWxlXGMKK1wmKS4KKy5UUAorLkIgcnVuIFxmUltcfFxmSWFyZ2xpc3RcZlJcfF0KK1N0YXJ0IHlvdXIgcHJvZ3JhbSAod2l0aCBcYworLkkgYXJnbGlzdFxjCitcJiwgaWYgc3BlY2lmaWVkKS4KKy5UUAorLkIgYnQKK0JhY2t0cmFjZTogZGlzcGxheSB0aGUgcHJvZ3JhbSBzdGFjay4KKy5UUAorLkJJIHByaW50ICIgZXhwciJcYworXCYKK0Rpc3BsYXkgdGhlIHZhbHVlIG9mIGFuIGV4cHJlc3Npb24uCisuVFAKKy5CIGMKK0NvbnRpbnVlIHJ1bm5pbmcgeW91ciBwcm9ncmFtIChhZnRlciBzdG9wcGluZywgZS5nLiBhdCBhIGJyZWFrcG9pbnQpLgorLlRQCisuQiBuZXh0CitFeGVjdXRlIG5leHQgcHJvZ3JhbSBsaW5lIChhZnRlciBzdG9wcGluZyk7IHN0ZXAgXGMKKy5JIG92ZXJcYworXCYgYW55CitmdW5jdGlvbiBjYWxscyBpbiB0aGUgbGluZS4KKy5UUAorLkIgc3RlcAorRXhlY3V0ZSBuZXh0IHByb2dyYW0gbGluZSAoYWZ0ZXIgc3RvcHBpbmcpOyBzdGVwIFxjCisuSSBpbnRvXGMKK1wmIGFueQorZnVuY3Rpb24gY2FsbHMgaW4gdGhlIGxpbmUuCisuVFAKKy5CIGhlbHAgXGZSW1x8XGZJbmFtZVxmUlx8XQorU2hvdyBpbmZvcm1hdGlvbiBhYm91dCBHREIgY29tbWFuZCBcYworLkkgbmFtZVxjCitcJiwgb3IgZ2VuZXJhbCBpbmZvcm1hdGlvbgorYWJvdXQgdXNpbmcgR0RCLgorLlRQCisuQiBxdWl0CitFeGl0IGZyb20gR0RCLgorLlBQCitGb3IgZnVsbCBkZXRhaWxzIG9uIEdEQiwgc2VlIFxjCisuSSAKK1VzaW5nIEdEQjogQSBHdWlkZSB0byB0aGUgR05VIFNvdXJjZS1MZXZlbCBEZWJ1Z2dlclxjCitcJiwgYnkgUmljaGFyZCBNLiBTdGFsbG1hbiBhbmQgUm9sYW5kIEguIFBlc2NoLiAgVGhlIHNhbWUgdGV4dCBpcyBhdmFpbGFibGUgb25saW5lCithcyB0aGUgXGMKKy5CIGdkYlxjCitcJiBlbnRyeSBpbiB0aGUgXGMKKy5CIGluZm9cYworXCYgcHJvZ3JhbS4KKy5TSCBPUFRJT05TCitBbnkgYXJndW1lbnRzIG90aGVyIHRoYW4gb3B0aW9ucyBzcGVjaWZ5IGFuIGV4ZWN1dGFibGUKK2ZpbGUgYW5kIGNvcmUgZmlsZSAob3IgcHJvY2VzcyBJRCk7IHRoYXQgaXMsIHRoZSBmaXJzdCBhcmd1bWVudAorZW5jb3VudGVyZWQgd2l0aCBubyAKK2Fzc29jaWF0ZWQgb3B0aW9uIGZsYWcgaXMgZXF1aXZhbGVudCB0byBhIGBcfFxjCisuQiBcLXNlXGMKK1wmXHwnIG9wdGlvbiwgYW5kIHRoZQorc2Vjb25kLCBpZiBhbnksIGlzIGVxdWl2YWxlbnQgdG8gYSBgXHxcYworLkIgXC1jXGMKK1wmXHwnIG9wdGlvbiBpZiBpdCdzIHRoZSBuYW1lIG9mIGEgZmlsZS4gIE1hbnkgb3B0aW9ucyBoYXZlCitib3RoIGxvbmcgYW5kIHNob3J0IGZvcm1zOyBib3RoIGFyZSBzaG93biBoZXJlLiAgVGhlIGxvbmcgZm9ybXMgYXJlIGFsc28KK3JlY29nbml6ZWQgaWYgeW91IHRydW5jYXRlIHRoZW0sIHNvIGxvbmcgYXMgZW5vdWdoIG9mIHRoZSBvcHRpb24gaXMKK3ByZXNlbnQgdG8gYmUgdW5hbWJpZ3VvdXMuICAoSWYgeW91IHByZWZlciwgeW91IGNhbiBmbGFnIG9wdGlvbgorYXJndW1lbnRzIHdpdGggYFx8XGMKKy5CICtcYworXCZcfCcgcmF0aGVyIHRoYW4gYFx8XGMKKy5CIFwtXGMKK1wmXHwnLCB0aG91Z2ggd2UgaWxsdXN0cmF0ZSB0aGUKK21vcmUgdXN1YWwgY29udmVudGlvbi4pCisKK0FsbCB0aGUgb3B0aW9ucyBhbmQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB5b3UgZ2l2ZSBhcmUgcHJvY2Vzc2VkCitpbiBzZXF1ZW50aWFsIG9yZGVyLiAgVGhlIG9yZGVyIG1ha2VzIGEgZGlmZmVyZW5jZSB3aGVuIHRoZQorYFx8XGMKKy5CIFwteFxjCitcJlx8JyBvcHRpb24gaXMgdXNlZC4KKworLlRQCisuQiBcLWhlbHAKKy5UUAorLkIgXC1oCitMaXN0IGFsbCBvcHRpb25zLCB3aXRoIGJyaWVmIGV4cGxhbmF0aW9ucy4KKworLlRQCisuQkkgIlwtc3ltYm9scz0iICJmaWxlIlxjCisuVFAKKy5CSSAiXC1zICIgImZpbGUiXGMKK1wmCitSZWFkIHN5bWJvbCB0YWJsZSBmcm9tIGZpbGUgXGMKKy5JIGZpbGVcYworXCYuCisKKy5UUAorLkIgXC13cml0ZQorRW5hYmxlIHdyaXRpbmcgaW50byBleGVjdXRhYmxlIGFuZCBjb3JlIGZpbGVzLgorCisuVFAKKy5CSSAiXC1leGVjPSIgImZpbGUiXGMKKy5UUAorLkJJICJcLWUgIiAiZmlsZSJcYworXCYKK1VzZSBmaWxlIFxjCisuSSBmaWxlXGMKK1wmIGFzIHRoZSBleGVjdXRhYmxlIGZpbGUgdG8gZXhlY3V0ZSB3aGVuCithcHByb3ByaWF0ZSwgYW5kIGZvciBleGFtaW5pbmcgcHVyZSBkYXRhIGluIGNvbmp1bmN0aW9uIHdpdGggYSBjb3JlCitkdW1wLgorCisuVFAKKy5CSSAiXC1zZT0iICJmaWxlIlxjCitcJgorUmVhZCBzeW1ib2wgdGFibGUgZnJvbSBmaWxlIFxjCisuSSBmaWxlXGMKK1wmIGFuZCB1c2UgaXQgYXMgdGhlIGV4ZWN1dGFibGUKK2ZpbGUuCisKKy5UUAorLkJJICJcLWNvcmU9IiAiZmlsZSJcYworLlRQCisuQkkgIlwtYyAiICJmaWxlIlxjCitcJgorVXNlIGZpbGUgXGMKKy5JIGZpbGVcYworXCYgYXMgYSBjb3JlIGR1bXAgdG8gZXhhbWluZS4KKworLlRQCisuQkkgIlwtY29tbWFuZD0iICJmaWxlIlxjCisuVFAKKy5CSSAiXC14ICIgImZpbGUiXGMKK1wmCitFeGVjdXRlIEdEQiBjb21tYW5kcyBmcm9tIGZpbGUgXGMKKy5JIGZpbGVcYworXCYuICAKKworLlRQCisuQkkgIlwtZGlyZWN0b3J5PSIgImRpcmVjdG9yeSJcYworLlRQCisuQkkgIlwtZCAiICJkaXJlY3RvcnkiXGMKK1wmCitBZGQgXGMKKy5JIGRpcmVjdG9yeVxjCitcJiB0byB0aGUgcGF0aCB0byBzZWFyY2ggZm9yIHNvdXJjZSBmaWxlcy4KKy5QUAorCisuVFAKKy5CIFwtbngKKy5UUAorLkIgXC1uCitEbyBub3QgZXhlY3V0ZSBjb21tYW5kcyBmcm9tIGFueSBgXHxcYworLkIgLmdkYmluaXRcYworXCZcfCcgaW5pdGlhbGl6YXRpb24gZmlsZXMuCitOb3JtYWxseSwgdGhlIGNvbW1hbmRzIGluIHRoZXNlIGZpbGVzIGFyZSBleGVjdXRlZCBhZnRlciBhbGwgdGhlCitjb21tYW5kIG9wdGlvbnMgYW5kIGFyZ3VtZW50cyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgorCisKKy5UUAorLkIgXC1xdWlldAorLlRQCisuQiBcLXEKK2BgUXVpZXQnJy4gIERvIG5vdCBwcmludCB0aGUgaW50cm9kdWN0b3J5IGFuZCBjb3B5cmlnaHQgbWVzc2FnZXMuICBUaGVzZQorbWVzc2FnZXMgYXJlIGFsc28gc3VwcHJlc3NlZCBpbiBiYXRjaCBtb2RlLgorCisuVFAKKy5CIFwtYmF0Y2gKK1J1biBpbiBiYXRjaCBtb2RlLiAgRXhpdCB3aXRoIHN0YXR1cyBcYworLkIgMFxjCitcJiBhZnRlciBwcm9jZXNzaW5nIGFsbCB0aGUgY29tbWFuZAorZmlsZXMgc3BlY2lmaWVkIHdpdGggYFx8XGMKKy5CIFwteFxjCitcJlx8JyAoYW5kIGBcfFxjCisuQiAuZ2RiaW5pdFxjCitcJlx8JywgaWYgbm90IGluaGliaXRlZCkuCitFeGl0IHdpdGggbm9uemVybyBzdGF0dXMgaWYgYW4gZXJyb3Igb2NjdXJzIGluIGV4ZWN1dGluZyB0aGUgR0RCCitjb21tYW5kcyBpbiB0aGUgY29tbWFuZCBmaWxlcy4KKworQmF0Y2ggbW9kZSBtYXkgYmUgdXNlZnVsIGZvciBydW5uaW5nIEdEQiBhcyBhIGZpbHRlciwgZm9yIGV4YW1wbGUgdG8KK2Rvd25sb2FkIGFuZCBydW4gYSBwcm9ncmFtIG9uIGFub3RoZXIgY29tcHV0ZXI7IGluIG9yZGVyIHRvIG1ha2UgdGhpcworbW9yZSB1c2VmdWwsIHRoZSBtZXNzYWdlCisuc3AKKy5icgorUHJvZ3JhbVwgZXhpdGVkXCBub3JtYWxseS4KKy5icgorLnNwCisKKyh3aGljaCBpcyBvcmRpbmFyaWx5IGlzc3VlZCB3aGVuZXZlciBhIHByb2dyYW0gcnVubmluZyB1bmRlciBHREIgY29udHJvbAordGVybWluYXRlcykgaXMgbm90IGlzc3VlZCB3aGVuIHJ1bm5pbmcgaW4gYmF0Y2ggbW9kZS4KKworLlRQCisuQkkgIlwtY2Q9IiAiZGlyZWN0b3J5IlxjCitcJgorUnVuIEdEQiB1c2luZyBcYworLkkgZGlyZWN0b3J5XGMKK1wmIGFzIGl0cyB3b3JraW5nIGRpcmVjdG9yeSwKK2luc3RlYWQgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorCisuVFAKKy5CIFwtZnVsbG5hbWUKKy5UUAorLkIgXC1mCitFbWFjcyBzZXRzIHRoaXMgb3B0aW9uIHdoZW4gaXQgcnVucyBHREIgYXMgYSBzdWJwcm9jZXNzLiAgSXQgdGVsbHMgR0RCCit0byBvdXRwdXQgdGhlIGZ1bGwgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBpbiBhIHN0YW5kYXJkLAorcmVjb2duaXphYmxlIGZhc2hpb24gZWFjaCB0aW1lIGEgc3RhY2sgZnJhbWUgaXMgZGlzcGxheWVkICh3aGljaAoraW5jbHVkZXMgZWFjaCB0aW1lIHRoZSBwcm9ncmFtIHN0b3BzKS4gIFRoaXMgcmVjb2duaXphYmxlIGZvcm1hdCBsb29rcworbGlrZSB0d28gYFx8XGMKKy5CIFwwMzJcYworXCZcfCcgY2hhcmFjdGVycywgZm9sbG93ZWQgYnkgdGhlIGZpbGUgbmFtZSwgbGluZSBudW1iZXIKK2FuZCBjaGFyYWN0ZXIgcG9zaXRpb24gc2VwYXJhdGVkIGJ5IGNvbG9ucywgYW5kIGEgbmV3bGluZS4gIFRoZQorRW1hY3MtdG8tR0RCIGludGVyZmFjZSBwcm9ncmFtIHVzZXMgdGhlIHR3byBgXHxcYworLkIgXDAzMlxjCitcJlx8JyBjaGFyYWN0ZXJzIGFzCithIHNpZ25hbCB0byBkaXNwbGF5IHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIGZyYW1lLgorCisuVFAKKy5CSSAiXC1iICIgImJwcyJcYworXCYKK1NldCB0aGUgbGluZSBzcGVlZCAoYmF1ZCByYXRlIG9yIGJpdHMgcGVyIHNlY29uZCkgb2YgYW55IHNlcmlhbAoraW50ZXJmYWNlIHVzZWQgYnkgR0RCIGZvciByZW1vdGUgZGVidWdnaW5nLgorCisuVFAKKy5CSSAiXC10dHk9IiAiZGV2aWNlIlxjCitcJgorUnVuIHVzaW5nIFxjCisuSSBkZXZpY2VcYworXCYgZm9yIHlvdXIgcHJvZ3JhbSdzIHN0YW5kYXJkIGlucHV0IGFuZCBvdXRwdXQuCisuUFAKKworLlNIICJTRUUgQUxTTyIKKy5SQiAiYFx8IiBnZGIgIlx8JyIKK2VudHJ5IGluCisuQiBpbmZvXGMKK1wmOworLkkgCitVc2luZyBHREI6IEEgR3VpZGUgdG8gdGhlIEdOVSBTb3VyY2UtTGV2ZWwgRGVidWdnZXJcYworLCBSaWNoYXJkIE0uIFN0YWxsbWFuIGFuZCBSb2xhbmQgSC4gUGVzY2gsIEp1bHkgMTk5MS4KKy5TSCBDT1BZSU5HCitDb3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgordGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKK2FyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKy5QUAorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcworbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQorZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKK3Blcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKy5QUAorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKK21hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAordmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCit0cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCit0aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2dkYi9nZGIuZ2RiIGIvZ2RiL2dkYi5nZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3Nzg0MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9nZGIuZ2RiCkBAIC0wLDAgKzEsMzUgQEAKKyMgRXhhbXBsZXMgb2YgdXNpbmcgZ2RiJ3MgY29tbWFuZCBsYW5ndWFnZSB0byBwcmludCBvdXQgdmFyaW91cyBnZGIgZGF0YQorIyBzdHJ1Y3R1cmVzLgorCitkZWZpbmUgbGlzdC1vYmpmaWxlcworICBzZXQgJG9iaiA9IG9iamVjdF9maWxlcworICBwcmludGYgIm9iamZpbGUgICAgYmZkICAgICAgICBtc3ltcyAgbmFtZVxuIgorICB3aGlsZSAkb2JqICE9IDAKKyAgICBwcmludGYgIjB4JS04eCAweCUtOHggJTZkICVzXG4iLCAkb2JqLCAkb2JqLT5vYmZkLCBcCisgICAgICAkb2JqLT5taW5pbWFsX3N5bWJvbF9jb3VudCwgJG9iai0+bmFtZQorICAgIHNldCB2YXIgJG9iaiA9ICRvYmotPm5leHQKKyAgZW5kCitlbmQKK2RvY3VtZW50IGxpc3Qtb2JqZmlsZXMKK1ByaW50IGEgdGFibGUgb2YgdGhlIGN1cnJlbnQgb2JqZmlsZXMuCitlbmQKKworZGVmaW5lIHByaW50LXZhbHVlcworICBwcmludGYgIkxvY2F0aW9uICBPZmZzZXQgICAgICAgIFNpemUgIExhenkgICBDb250ZW50czAtMyAgTHZhbFxuIgorICBzZXQgJHZhbCA9ICRhcmcwCisgIHdoaWxlICR2YWwgIT0gMAorICAgIHByaW50ZiAiJTh4ICAlNmQgICUxMGQgICU0ZCAgJTEyeCAgIiwgJHZhbC0+bG9jYXRpb24uYWRkcmVzcywgXAorICAgICAgJHZhbC0+b2Zmc2V0LCBcCisgICAgICAkdmFsLT50eXBlLT5sZW5ndGgsICR2YWwtPmxhenksICR2YWwtPmFsaWduZXIuY29udGVudHNbMF0KKyAgICBvdXRwdXQgJHZhbC0+bHZhbAorICAgIHByaW50ZiAiXG4iCisgICAgc2V0ICR2YWwgPSAkdmFsLT5uZXh0CisgIGVuZAorZW5kCitkb2N1bWVudCBwcmludC12YWx1ZXMKK1ByaW50IGEgbGlzdCBvZiB2YWx1ZXMuCitUYWtlcyBvbmUgYXJndW1lbnQsIHRoZSB2YWx1ZSB0byBwcmludCwgYW5kIHByaW50cyBhbGwgdGhlIHZhbHVlcyB3aGljaAorYXJlIGNoYWluZWQgdGhyb3VnaCB0aGUgbmV4dCBmaWVsZC4gIFRodXMgdGhlIG1vc3QgcmVjZW50bHkgY3JlYXRlZCB2YWx1ZXMKK3dpbGwgYmUgbGlzdGVkIGZpcnN0LiAgVGhlICJDb250ZW50czAtMyIgZmllbGQgZ2l2ZXMgdGhlIGZpcnN0ICJpbnQiCitvZiB0aGUgVkFMVUVfQ09OVEVOVFM7IG5vdCB0aGUgZW50aXJlIGNvbnRlbnRzLgorZW5kCmRpZmYgLS1naXQgYS9nZGIvZ2RiX3N0YXQuaCBiL2dkYi9nZGJfc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NzFiMjkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZ2RiX3N0YXQuaApAQCAtMCwwICsxLDY4IEBACisvKiBQb3J0YWJsZSA8c3lzL3N0YXQuaD4KKyAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZiAhZGVmaW5lZChHREJfU1RBVF9IKQorI2RlZmluZSBHREJfU1RBVF9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaWZkZWYgU1RBVF9NQUNST1NfQlJPS0VOCisjdW5kZWYgU19JU0JMSworI3VuZGVmIFNfSVNDSFIKKyN1bmRlZiBTX0lTRElSCisjdW5kZWYgU19JU1JFRworI3VuZGVmIFNfSVNGSUZPCisjdW5kZWYgU19JU0xOSworI3VuZGVmIFNfSVNTT0NLCisjdW5kZWYgU19JU01QQgorI3VuZGVmIFNfSVNNUEMKKyN1bmRlZiBTX0lTTldLCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFNfSVNCTEspICYmIGRlZmluZWQoU19JRkJMSykKKyNkZWZpbmUgU19JU0JMSyhtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRkJMSykKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNfSVNDSFIpICYmIGRlZmluZWQoU19JRkNIUikKKyNkZWZpbmUgU19JU0NIUihtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRkNIUikKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNfSVNESVIpICYmIGRlZmluZWQoU19JRkRJUikKKyNkZWZpbmUgU19JU0RJUihtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRkRJUikKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNfSVNSRUcpICYmIGRlZmluZWQoU19JRlJFRykKKyNkZWZpbmUgU19JU1JFRyhtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRlJFRykKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNfSVNGSUZPKSAmJiBkZWZpbmVkKFNfSUZJRk8pCisjZGVmaW5lIFNfSVNGSUZPKG0pICgoKG0pICYgU19JRk1UKSA9PSBTX0lGSUZPKQorI2VuZGlmCisjaWYgIWRlZmluZWQoU19JU0xOSykgJiYgZGVmaW5lZChTX0lGTE5LKQorI2RlZmluZSBTX0lTTE5LKG0pICgoKG0pICYgU19JRk1UKSA9PSBTX0lGTE5LKQorI2VuZGlmCisjaWYgIWRlZmluZWQoU19JU1NPQ0spICYmIGRlZmluZWQoU19JRlNPQ0spCisjZGVmaW5lIFNfSVNTT0NLKG0pICgoKG0pICYgU19JRk1UKSA9PSBTX0lGU09DSykKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNfSVNNUEIpICYmIGRlZmluZWQoU19JRk1QQikgLyogVjcgKi8KKyNkZWZpbmUgU19JU01QQihtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRk1QQikKKyNkZWZpbmUgU19JU01QQyhtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRk1QQykKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNfSVNOV0spICYmIGRlZmluZWQoU19JRk5XSykgLyogSFAvVVggKi8KKyNkZWZpbmUgU19JU05XSyhtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRk5XSykKKyNlbmRpZgorCisjZW5kaWYJLyogIWRlZmluZWQoR0RCX1NUQVRfSCkgKi8KZGlmZiAtLWdpdCBhL2dkYi9nZGJfc3RyaW5nLmggYi9nZGIvZ2RiX3N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NGVlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZ2RiX3N0cmluZy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qIFBvcnRhYmxlIDxzdHJpbmcuaD4KKyAgIENvcHlyaWdodCAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZiAhZGVmaW5lZChHREJfU1RSSU5HX0gpCisjZGVmaW5lIEdEQl9TVFJJTkdfSAorCisjaWZkZWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX1NUUklOR19ICisjICAgaW5jbHVkZSA8c3RyaW5nLmg+CisjIGVsc2UKKyMgICBpbmNsdWRlIDxzdHJpbmdzLmg+CisjIGVuZGlmCisKKyNpZm5kZWYgc3RyY2hyCitleHRlcm4gY2hhciAqc3RyY2hyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7CS8qIFgzLjE1OS0xOTg5ICA0LjExLjUuMiAqLworI2VuZGlmCisKKyNpZm5kZWYgc3RycmNocgorZXh0ZXJuIGNoYXIgKnN0cnJjaHIgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsJLyogWDMuMTU5LTE5ODkgIDQuMTEuNS41ICovCisjZW5kaWYKKworI2lmbmRlZiBzdHJzdHIKK2V4dGVybiBjaGFyICpzdHJzdHIgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsJLyogWDMuMTU5LTE5ODkgIDQuMTEuNS43ICovCisjZW5kaWYKKworI2lmbmRlZiBzdHJ0b2sKK2V4dGVybiBjaGFyICpzdHJ0b2sgUEFSQU1TICgoY2hhciAqLCBjb25zdCBjaGFyICopKTsJLyogWDMuMTU5LTE5ODkgIDQuMTEuNS44ICovCisjZW5kaWYKKworIyBpZmRlZiBIQVZFX01FTU9SWV9ICisjICAgaW5jbHVkZSA8bWVtb3J5Lmg+CisjIGVsc2UKK2V4dGVybiB2b2lkICptZW1zZXQoKTsKK2V4dGVybiB2b2lkICptZW1jcHkoKTsKK2V4dGVybiB2b2lkICptZW1tb3ZlKCk7CitleHRlcm4gaW50ICAgbWVtY21wKCk7CisjIGVuZGlmCisjZW5kaWYgLyogU1REQ19IRUFERVJTICovCisKKyNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUkVSUk9SCisjaWZuZGVmIHN0cmVycm9yCitleHRlcm4gY2hhciAqc3RyZXJyb3IgUEFSQU1TICgoaW50KSk7CS8qIFgzLjE1OS0xOTg5ICA0LjExLjYuMiAqLworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU1RSRFVQCitleHRlcm4gY2hhciAqc3RyZHVwICgpOyAvKiBmdWxsIHByb3RvdHlwZSBjb2xsaWRlcyB3LyBzb21lIE9TZXMgKEFJWCAzLjIuNSkgKi8KKyNlbmRpZgorCisjZW5kaWYJLyogIWRlZmluZWQoR0RCX1NUUklOR19IKSAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2dkYmEuZWwgYi9nZGIvZ2RiYS5lbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjcxNTg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2dkYmEuZWwKQEAgLTAsMCArMSwyNjA3IEBACisoZGVmbWFjcm8gZ3VkIChmb3JtKQorICAoYCAoc2F2ZS1leGN1cnNpb24gKHNldC1idWZmZXIgIipndWQtYS5vdXQqIikgKCwgZm9ybSkpKSkKKworKGRlZnVuIGRidWcgKGZvbyAmb3B0aW9uYWwgZnVuKQorICAoc2F2ZS1leGN1cnNpb24KKyAgICAoc2V0LWJ1ZmZlciAoZ2V0LWJ1ZmZlci1jcmVhdGUgIip0cmFjZSoiKSkKKyAgICAoZ290by1jaGFyIChwb2ludC1tYXgpKQorICAgIChpbnNlcnQgIioqKiIgKHN5bWJvbC1uYW1lIGZvbykgIlxuIikKKyAgICAoaWYgZnVuCisJKGZ1bmNhbGwgZnVuKSkpKQorCisKKzs7OyBndWQuZWwgLS0tIEdyYW5kIFVuaWZpZWQgRGVidWdnZXIgbW9kZSBmb3IgZ2RiLCBzZGIsIGRieCwgb3IgeGRiCis7OzsgICAgICAgICAgICB1bmRlciBFbWFjcworCis7OyBBdXRob3I6IEVyaWMgUy4gUmF5bW9uZCA8ZXNyQHNuYXJrLnRoeXJzdXMuY29tPgorOzsgTWFpbnRhaW5lcjogRlNGCis7OyBWZXJzaW9uOiAxLjMKKzs7IEtleXdvcmRzOiB1bml4LCB0b29scworCis7OyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKzs7IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBFbWFjcy4KKworOzsgR05VIEVtYWNzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKzs7IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cis7OyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCis7OyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworOzsgR05VIEVtYWNzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7OyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorOzsgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworOzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKzs7IGFsb25nIHdpdGggR05VIEVtYWNzOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7OyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCis7OzsgQ29tbWVudGFyeToKKworOzsgVGhlIGFuY2VzdHJhbCBnZGIuZWwgd2FzIGJ5IFcuIFNjaGVsdGVyIDx3ZnNAcmFzY2FsLmljcy51dGV4YXMuZWR1PgorOzsgSXQgd2FzIGxhdGVyIHJld3JpdHRlbiBieSBybXMuICBTb21lIGlkZWFzIHdlcmUgZHVlIHRvIE1hc2Fub2J1LiAKKzs7IEdyYW5kIFVuaWZpY2F0aW9uIChzZGIvZGJ4IHN1cHBvcnQpIGJ5IEVyaWMgUy4gUmF5bW9uZCA8ZXNyQHRoeXJzdXMuY29tPgorOzsgVGhlIG92ZXJsb2FkaW5nIGNvZGUgd2FzIHRoZW4gcmV3cml0dGVuIGJ5IEJhcnJ5IFdhcnNhdyA8YndhcnNhd0BjZW4uY29tPiwKKzs7IHdobyBhbHNvIGhhY2tlZCB0aGUgbW9kZSB0byB1c2UgY29taW50LmVsLiAgU2hhbmUgSGFydG1hbiA8c2hhbmVAc3ByLmNvbT4KKzs7IGFkZGVkIHN1cHBvcnQgZm9yIHhkYiAoSFBVWCBkZWJ1Z2dlcikuCisKKzs7IEN5Z251cyBTdXBwb3J0IGFkZGVkIHN1cHBvcnQgZm9yIGdkYidzIC0tYW5ub3RhdGU9Mi4KKworOzs7IENvZGU6CisKKyhyZXF1aXJlICdjb21pbnQpCisocmVxdWlyZSAnZXRhZ3MpCisKKzs7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IEdVRCBjb21tYW5kcyBtdXN0IGJlIHZpc2libGUgaW4gQyBidWZmZXJzIHZpc2l0ZWQgYnkgR1VECisKKyhkZWZ2YXIgZ3VkLWtleS1wcmVmaXggIlxDLXhcQy1hIgorICAiUHJlZml4IG9mIGFsbCBHVUQgY29tbWFuZHMgdmFsaWQgaW4gQyBidWZmZXJzLiIpCisKKyhnbG9iYWwtc2V0LWtleSAoY29uY2F0IGd1ZC1rZXktcHJlZml4ICJcQy1sIikgJ2d1ZC1yZWZyZXNoKQorKGdsb2JhbC1zZXQta2V5ICJcQy14ICIgJ2d1ZC1icmVhaykJOzsgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBoYWNrCisKKzs7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IHRoZSBvdmVybG9hZGluZyBtZWNoYW5pc20KKworKGRlZnVuIGd1ZC1vdmVybG9hZC1mdW5jdGlvbnMgKGd1ZC1vdmVybG9hZC1hbGlzdCkKKyAgIk92ZXJsb2FkIGZ1bmN0aW9ucyBkZWZpbmVkIGluIEdVRC1PVkVSTE9BRC1BTElTVC4KK1RoaXMgYXNzb2NpYXRpb24gbGlzdCBoYXMgZWxlbWVudHMgb2YgdGhlIGZvcm0KKyAgICAgKE9SSUdJTkFMLUZVTkNUSU9OLU5BTUUgIE9WRVJMT0FELUZVTkNUSU9OKSIKKyAgKG1hcGNhcgorICAgKGZ1bmN0aW9uIChsYW1iZGEgKHApIChmc2V0IChjYXIgcCkgKHN5bWJvbC1mdW5jdGlvbiAoY2RyIHApKSkpKQorICAgZ3VkLW92ZXJsb2FkLWFsaXN0KSkKKworKGRlZnVuIGd1ZC1tYXNzYWdlLWFyZ3MgKGZpbGUgYXJncykKKyAgKGVycm9yICJHVUQgbm90IHByb3Blcmx5IGVudGVyZWQuIikpCisKKyhkZWZ1biBndWQtbWFya2VyLWZpbHRlciAoc3RyKQorICAoZXJyb3IgIkdVRCBub3QgcHJvcGVybHkgZW50ZXJlZC4iKSkKKworKGRlZnVuIGd1ZC1maW5kLWZpbGUgKGYpCisgIChlcnJvciAiR1VEIG5vdCBwcm9wZXJseSBlbnRlcmVkLiIpKQorDAorOzsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgY29tbWFuZCBkZWZpbml0aW9uCisKKzs7IFRoaXMgbWFjcm8gaXMgdXNlZCBiZWxvdyB0byBkZWZpbmUgc29tZSBiYXNpYyBkZWJ1Z2dlciBpbnRlcmZhY2UgY29tbWFuZHMuCis7OyBPZiBjb3Vyc2UgeW91IG1heSB1c2UgYGd1ZC1kZWYnIHdpdGggYW55IG90aGVyIGRlYnVnZ2VyIGNvbW1hbmQsIGluY2x1ZGluZworOzsgdXNlciBkZWZpbmVkIG9uZXMuCisKKzs7IEEgbWFjcm8gY2FsbCBsaWtlIChndWQtZGVmIEZVTkMgTkFNRSBLRVkgRE9DKSBleHBhbmRzIHRvIGEgZm9ybQorOzsgd2hpY2ggZGVmaW5lcyBGVU5DIHRvIHNlbmQgdGhlIGNvbW1hbmQgTkFNRSB0byB0aGUgZGVidWdnZXIsIGdpdmVzCis7OyBpdCB0aGUgZG9jc3RyaW5nIERPQywgYW5kIGJpbmRzIHRoYXQgZnVuY3Rpb24gdG8gS0VZIGluIHRoZSBHVUQKKzs7IG1ham9yIG1vZGUuICBUaGUgZnVuY3Rpb24gaXMgYWxzbyBib3VuZCBpbiB0aGUgZ2xvYmFsIGtleW1hcCB3aXRoIHRoZQorOzsgR1VEIHByZWZpeC4KKworKGRlZm1hY3JvIGd1ZC1kZWYgKGZ1bmMgY21kIGtleSAmb3B0aW9uYWwgZG9jKQorICAiRGVmaW5lIEZVTkMgdG8gYmUgYSBjb21tYW5kIHNlbmRpbmcgU1RSIGFuZCBib3VuZCB0byBLRVksIHdpdGgKK29wdGlvbmFsIGRvYyBzdHJpbmcgRE9DLiAgQ2VydGFpbiAlLWVzY2FwZXMgaW4gdGhlIHN0cmluZyBhcmd1bWVudHMKK2FyZSBpbnRlcnByZXRlZCBzcGVjaWFsbHkgaWYgcHJlc2VudC4gIFRoZXNlIGFyZToKKworICAlZgluYW1lICh3aXRob3V0IGRpcmVjdG9yeSkgb2YgY3VycmVudCBzb3VyY2UgZmlsZS4gCisgICVkCWRpcmVjdG9yeSBvZiBjdXJyZW50IHNvdXJjZSBmaWxlLiAKKyAgJWwJbnVtYmVyIG9mIGN1cnJlbnQgc291cmNlIGxpbmUKKyAgJWUJdGV4dCBvZiB0aGUgQyBsdmFsdWUgb3IgZnVuY3Rpb24tY2FsbCBleHByZXNzaW9uIHN1cnJvdW5kaW5nIHBvaW50LgorICAlYQl0ZXh0IG9mIHRoZSBoZXhhZGVjaW1hbCBhZGRyZXNzIHN1cnJvdW5kaW5nIHBvaW50CisgICVwCXByZWZpeCBhcmd1bWVudCB0byB0aGUgY29tbWFuZCAoaWYgYW55KSBhcyBhIG51bWJlcgorCisgIFRoZSBgY3VycmVudCcgc291cmNlIGZpbGUgaXMgdGhlIGZpbGUgb2YgdGhlIGN1cnJlbnQgYnVmZmVyIChpZgord2UncmUgaW4gYSBDIGZpbGUpIG9yIHRoZSBzb3VyY2UgZmlsZSBjdXJyZW50IGF0IHRoZSBsYXN0IGJyZWFrIG9yCitzdGVwIChpZiB3ZSdyZSBpbiB0aGUgR1VEIGJ1ZmZlcikuCisgIFRoZSBgY3VycmVudCcgbGluZSBpcyB0aGF0IG9mIHRoZSBjdXJyZW50IGJ1ZmZlciAoaWYgd2UncmUgaW4gYQorc291cmNlIGZpbGUpIG9yIHRoZSBzb3VyY2UgbGluZSBudW1iZXIgYXQgdGhlIGxhc3QgYnJlYWsgb3Igc3RlcCAoaWYKK3dlJ3JlIGluIHRoZSBHVUQgYnVmZmVyKS4iCisgIChsaXN0ICdwcm9nbgorCShsaXN0ICdkZWZ1biBmdW5jICcoYXJnKQorCSAgICAgIChvciBkb2MgIiIpCisJICAgICAgJyhpbnRlcmFjdGl2ZSAicCIpCisJICAgICAgKGxpc3QgJ2d1ZC1jYWxsIGNtZCAnYXJnKSkKKwkoaWYga2V5CisJICAgIChsaXN0ICdkZWZpbmUta2V5CisJCSAgJyhjdXJyZW50LWxvY2FsLW1hcCkKKwkJICAoY29uY2F0ICJcQy1jIiBrZXkpCisJCSAgKGxpc3QgJ3F1b3RlIGZ1bmMpKSkKKwkoaWYga2V5CisJICAgIChsaXN0ICdnbG9iYWwtc2V0LWtleQorCQkgIChsaXN0ICdjb25jYXQgJ2d1ZC1rZXktcHJlZml4IGtleSkKKwkJICAobGlzdCAncXVvdGUgZnVuYykpKSkpCisKKzs7IFdoZXJlIGd1ZC1kaXNwbGF5LWZyYW1lIHNob3VsZCBwdXQgdGhlIGRlYnVnZ2luZyBhcnJvdy4gIFRoaXMgaXMKKzs7IHNldCBieSB0aGUgbWFya2VyLWZpbHRlciwgd2hpY2ggc2NhbnMgdGhlIGRlYnVnZ2VyJ3Mgb3V0cHV0IGZvcgorOzsgaW5kaWNhdGlvbnMgb2YgdGhlIGN1cnJlbnQgcHJvZ3JhbSBjb3VudGVyLgorKGRlZnZhciBndWQtbGFzdC1mcmFtZSBuaWwpCisKKzs7IFVzZWQgYnkgZ3VkLXJlZnJlc2gsIHdoaWNoIHNob3VsZCBjYXVzZSBndWQtZGlzcGxheS1mcmFtZSB0byByZWRpc3BsYXkKKzs7IHRoZSBsYXN0IGZyYW1lLCBldmVuIGlmIGl0J3MgYmVlbiBjYWxsZWQgYmVmb3JlIGFuZCBndWQtbGFzdC1mcmFtZSBoYXMKKzs7IGJlZW4gc2V0IHRvIG5pbC4KKyhkZWZ2YXIgZ3VkLWxhc3QtbGFzdC1mcmFtZSBuaWwpCisKKzs7IEFsbCBkZWJ1Z2dlci1zcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyBjb2xsZWN0ZWQgaGVyZS4KKzs7IEhlcmUncyBob3cgaXQgd29ya3MsIGluIGNhc2UgeW91IGV2ZXIgbmVlZCB0byBhZGQgYSBkZWJ1Z2dlciB0byB0aGUgbW9kZS4KKzs7Cis7OyBFYWNoIGVudHJ5IG11c3QgZGVmaW5lIHRoZSBmb2xsb3dpbmcgYXQgc3RhcnR1cDoKKzs7Cis7OzxuYW1lPgorOzsgY29taW50LXByb21wdC1yZWdleHAKKzs7IGd1ZC08bmFtZT4tbWFzc2FnZS1hcmdzCis7OyBndWQtPG5hbWU+LW1hcmtlci1maWx0ZXIKKzs7IGd1ZC08bmFtZT4tZmluZC1maWxlCis7OworOzsgVGhlIGpvYiBvZiB0aGUgbWFzc2FnZS1hcmdzIG1ldGhvZCBpcyB0byBtb2RpZnkgdGhlIGdpdmVuIGxpc3Qgb2YKKzs7IGRlYnVnZ2VyIGFyZ3VtZW50cyBiZWZvcmUgcnVubmluZyB0aGUgZGVidWdnZXIuCis7OworOzsgVGhlIGpvYiBvZiB0aGUgbWFya2VyLWZpbHRlciBtZXRob2QgaXMgdG8gZGV0ZWN0IGZpbGUvbGluZSBtYXJrZXJzIGluCis7OyBzdHJpbmdzIGFuZCBzZXQgdGhlIGdsb2JhbCBndWQtbGFzdC1mcmFtZSB0byBpbmRpY2F0ZSB3aGF0IGRpc3BsYXkKKzs7IGFjdGlvbiAoaWYgYW55KSBzaG91bGQgYmUgdHJpZ2dlcmVkIGJ5IHRoZSBtYXJrZXIuICBOb3RlIHRoYXQgb25seQorOzsgd2hhdGV2ZXIgdGhlIG1ldGhvZCAqcmV0dXJucyogaXMgZGlzcGxheWVkIGluIHRoZSBidWZmZXI7IHRodXMsIHlvdQorOzsgY2FuIGZpbHRlciB0aGUgZGVidWdnZXIncyBvdXRwdXQsIGludGVycHJldGluZyBzb21lIGFuZCBwYXNzaW5nIG9uCis7OyB0aGUgcmVzdC4KKzs7Cis7OyBUaGUgam9iIG9mIHRoZSBmaW5kLWZpbGUgbWV0aG9kIGlzIHRvIHZpc2l0IGFuZCByZXR1cm4gdGhlIGJ1ZmZlciBpbmRpY2F0ZWQKKzs7IGJ5IHRoZSBjYXIgb2YgZ3VkLXRhZy1mcmFtZS4gIFRoaXMgbWF5IGJlIGEgZmlsZSBuYW1lLCBhIHRhZyBuYW1lLCBvcgorOzsgc29tZXRoaW5nIGVsc2UuCisMCis7OyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis7OyBnZGIgZnVuY3Rpb25zCisKKzs7OyBIaXN0b3J5IG9mIGFyZ3VtZW50IGxpc3RzIHBhc3NlZCB0byBnZGIuCisoZGVmdmFyIGd1ZC1nZGItaGlzdG9yeSBuaWwpCisKKyhkZWZ1biBndWQtZ2RiLW1hc3NhZ2UtYXJncyAoZmlsZSBhcmdzKQorICAoY29ucyAiLS1hbm5vdGF0ZT0yIiAoY29ucyBmaWxlIGFyZ3MpKSkKKworDAorOzsKKzs7IEluIHRoaXMgd29ybGQsIHRoZXJlIGFyZSBnZGIgaW5zdGFuY2Ugb2JqZWN0cyAob2YgdW5zcGVjaWZpZWQgCis7OyByZXByZXNlbnRhdGlvbikgYW5kIGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoIHRob3NlIG9iamVjdHMuCis7OworCis7OyAKKzs7IGdkYi1pbnN0YW5jZSBvYmplY3RzCis7OyAKKworKGRlZnVuIG1ha2UtZ2RiLWluc3RhbmNlIChwcm9jKQorICAiQ3JlYXRlIGEgZ2RiIGluc3RhbmNlIG9iamVjdCBmcm9tIGEgZ2RiIHByb2Nlc3MuIgorICAoc2V0cSBsYXN0LXByb2MgcHJvYykKKyAgKGxldCAoKGluc3RhbmNlIChjb25zICdnZGItaW5zdGFuY2UgcHJvYykpKQorICAgIChzYXZlLWV4Y3Vyc2lvbgorICAgICAgKHNldC1idWZmZXIgKHByb2Nlc3MtYnVmZmVyIHByb2MpKQorICAgICAgKHNldHEgZ2RiLWJ1ZmZlci1pbnN0YW5jZSBpbnN0YW5jZSkKKyAgICAgIChwcm9nbgorCShtYXBjYXIgJ21ha2UtdmFyaWFibGUtYnVmZmVyLWxvY2FsIGdkYi1pbnN0YW5jZS12YXJpYWJsZXMpCisJKHNldHEgZ2RiLWJ1ZmZlci10eXBlICdndWQpCisJOzsgSWYgd2UncmUgdGFraW5nIG92ZXIgdGhlIGJ1ZmZlciBvZiBhbm90aGVyIHByb2Nlc3MsCisJOzsgdGFrZSBvdmVyIGl0J3MgYW5jaWxsZXJ5IGJ1ZmZlcnMgYXMgd2VsbC4KKwk7OworCShsZXQgKChkZWFkIChvciBvbGQtZ2RiLWJ1ZmZlci1pbnN0YW5jZSkpKQorCSAgKG1hcGNhcgorCSAgIChmdW5jdGlvbgorCSAgICAobGFtYmRhIChiKQorCSAgICAgIChwcm9nbgorCQkoc2V0LWJ1ZmZlciBiKQorCQkoaWYgKGVxIGRlYWQgZ2RiLWJ1ZmZlci1pbnN0YW5jZSkKKwkJICAgIChzZXRxIGdkYi1idWZmZXItaW5zdGFuY2UgaW5zdGFuY2UpKSkpKQorCSAgICAgKGJ1ZmZlci1saXN0KSkpKSkKKyAgICBpbnN0YW5jZSkpCisKKyhkZWZ1biBnZGItaW5zdGFuY2UtcHJvY2VzcyAoaW5zdCkgKGNkciBpbnN0KSkKKworOzs7IFRoZSBsaXN0IG9mIGluc3RhbmNlIHZhcmlhYmxlcyBpcyBidWlsdCB1cCBieSB0aGUgZXhwYW5zaW9ucyBvZgorOzs7IERFRi1HREItVkFSSUFCTEUKKzs7OworKGRlZnZhciBnZGItaW5zdGFuY2UtdmFyaWFibGVzICcoKQorICAiQSBsaXN0IG9mIHZhcmlhYmxlcyB0aGF0IGFyZSBsb2NhbCB0byB0aGUgZ3VkIGJ1ZmZlciBhc3NvY2lhdGVkCit3aXRoIGEgZ2RiIGluc3RhbmNlLiIpIAorCisoZGVmbWFjcm8gZGVmLWdkYi12YXJpYWJsZQorICAobmFtZSBhY2Nlc3NvciBzZXR0ZXIgJm9wdGlvbmFsIGRlZmF1bHQgZG9jKQorICAoYAorICAgKHByb2duCisgICAgIChkZWZ2YXIgKCwgbmFtZSkgKCwgZGVmYXVsdCkgKCwgKG9yIGRvYyAidW5kb2N1bWVudGVkIikpKQorICAgICAoaWYgKG5vdCAobWVtcSAnKCwgbmFtZSkgZ2RiLWluc3RhbmNlLXZhcmlhYmxlcykpCisJIChzZXRxIGdkYi1pbnN0YW5jZS12YXJpYWJsZXMKKwkgICAgICAgKGNvbnMgJygsIG5hbWUpIGdkYi1pbnN0YW5jZS12YXJpYWJsZXMpKSkKKyAgICAgKCwgKGFuZCBhY2Nlc3NvcgorCSAgICAgKGAKKwkgICAgICAoZGVmdW4gKCwgYWNjZXNzb3IpIChpbnN0YW5jZSkKKwkJKGxldAorCQkgICAgKChidWZmZXIgKGdkYi1nZXQtaW5zdGFuY2UtYnVmZmVyIGluc3RhbmNlICdndWQpKSkKKwkJICAoYW5kIGJ1ZmZlcgorCQkgICAgICAgKHNhdmUtZXhjdXJzaW9uCisJCQkgKHNldC1idWZmZXIgYnVmZmVyKQorCQkJICgsIG5hbWUpKSkpKSkpKQorICAgICAoLCAoYW5kIHNldHRlcgorCSAgICAgKGAKKwkgICAgICAoZGVmdW4gKCwgc2V0dGVyKSAoaW5zdGFuY2UgdmFsKQorCQkobGV0CisJCSAgICAoKGJ1ZmZlciAoZ2RiLWdldC1pbnN0YW5jZS1idWZmZXIgaW5zdGFuY2UgJ2d1ZCkpKQorCQkgIChhbmQgYnVmZmVyCisJCSAgICAgICAoc2F2ZS1leGN1cnNpb24KKwkJCSAoc2V0LWJ1ZmZlciBidWZmZXIpCisJCQkgKHNldHEgKCwgbmFtZSkgdmFsKSkpKSkpKSkpKSkKKworKGRlZm1hY3JvIGRlZi1nZGItdmFyIChyb290LXN5bWJvbCAmb3B0aW9uYWwgZGVmYXVsdCBkb2MpCisgIChsZXQqICgocm9vdCAoc3ltYm9sLW5hbWUgcm9vdC1zeW1ib2wpKQorCSAoYWNjZXNzb3IgKGludGVybiAoY29uY2F0ICJnZGItaW5zdGFuY2UtIiByb290KSkpCisJIChzZXR0ZXIgKGludGVybiAoY29uY2F0ICJzZXQtZ2RiLWluc3RhbmNlLSIgcm9vdCkpKQorCSAodmFyLW5hbWUgKGludGVybiAoY29uY2F0ICJnZGItIiByb290KSkpKQorICAgIChgIChkZWYtZ2RiLXZhcmlhYmxlCisJICgsIHZhci1uYW1lKSAoLCBhY2Nlc3NvcikgKCwgc2V0dGVyKQorCSAoLCBkZWZhdWx0KSAoLCBkb2MpKSkpKQorCisoZGVmLWdkYi12YXIgYnVmZmVyLWluc3RhbmNlIG5pbAorICAiSW4gYW4gaW5zdGFuY2UgYnVmZmVyLCB0aGUgYnVmZmVyJ3MgaW5zdGFuY2UuIikKKworKGRlZi1nZGItdmFyIGJ1ZmZlci10eXBlIG5pbAorICAiT25lIG9mIHRoZSBzeW1ib2xzIGJvdW5kIGluIGdkYi1pbnN0YW5jZS1idWZmZXItcnVsZXMiKQorCisoZGVmLWdkYi12YXIgYnVyc3QgIiIKKyAgIkEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgZnJvbSBnZGIgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBwcm9jZXNzZWQuIikKKworKGRlZi1nZGItdmFyIGlucHV0LXF1ZXVlICgpCisgICJBIGxpc3Qgb2YgaGlnaCBwcmlvcml0eSBnZGIgY29tbWFuZCBvYmplY3RzLiIpCisKKyhkZWYtZ2RiLXZhciBpZGxlLWlucHV0LXF1ZXVlICgpCisgICJBIGxpc3Qgb2YgbG93IHByaW9yaXR5IGdkYiBjb21tYW5kIG9iamVjdHMuIikKKworKGRlZi1nZGItdmFyIHByb21wdGluZyBuaWwKKyAgIlRydWUgd2hlbiBnZGIgaXMgaWRsZSB3aXRoIG5vIHBlbmRpbmcgaW5wdXQuIikKKworKGRlZi1nZGItdmFyIG91dHB1dC1zaW5rICd1c2VyCisgICJUaGUgZGlzcG9zaXRpb24gb2YgdGhlIG91dHB1dCBvZiB0aGUgY3VycmVudCBnZGIgY29tbWFuZC4KK1Bvc3NpYmxlIHZhbHVlcyBhcmUgdGhlc2Ugc3ltYm9sczoKKworICAgIHVzZXIgLS0gZ2RiIG91dHB1dCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBndWQgYnVmZmVyIAorICAgICAgICAgICAgZm9yIHRoZSB1c2VyIHRvIHNlZS4KKworICAgIGluZmVyaW9yIC0tIGdkYiBvdXRwdXQgc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgaW5mZXJpb3ItaW8gYnVmZmVyCisKKyAgICBwcmUtZW1hY3MgLS0gb3V0cHV0IHNob3VsZCBiZSBpZ25vcmVkIHV0aWwgdGhlIHBvc3QtcHJvbXB0CisgICAgICAgICAgICAgICAgIGFubm90YXRpb24gaXMgcmVjZWl2ZWQuICBUaGVuIHRoZSBvdXRwdXQtc2luaworCQkgYmVjb21lczouLi4KKyAgICBlbWFjcyAtLSBvdXRwdXQgc2hvdWxkIGJlIGNvbGxlY3RlZCBpbiB0aGUgcGFydGlhbC1vdXRwdXQtYnVmZmVyCisJICAgICBmb3Igc3Vic2VxdWVudCBwcm9jZXNzaW5nIGJ5IGEgY29tbWFuZC4gIFRoaXMgaXMgdGhlCisJICAgICBkaXNwb3NpdGlvbiBvZiBvdXRwdXQgZ2VuZXJhdGVkIGJ5IGNvbW1hbmRzIHRoYXQKKwkgICAgIGd1ZCBtb2RlIHNlbmRzIHRvIGdkYiBvbiBpdHMgb3duIGJlaGFsZi4KKyAgICBwb3N0LWVtYWNzIC0tIGlnbm9yZSBpbnB1dCB1bnRpbCB0aGUgcHJvbXB0IGFubm90YXRpb24gaXMgCisJCSAgcmVjZWl2ZWQsIHRoZW4gZ28gdG8gVVNFUiBkaXNwb3NpdGlvbi4KKyIpCisKKyhkZWYtZ2RiLXZhciBjdXJyZW50LWl0ZW0gbmlsCisgICJUaGUgbW9zdCByZWNlbnQgY29tbWFuZCBpdGVtIHNlbnQgdG8gZ2RiLiIpCisKKyhkZWYtZ2RiLXZhciBwZW5kaW5nLXRyaWdnZXJzICcoKQorICAiQSBsaXN0IG9mIHRyaWdnZXIgZnVuY3Rpb25zIHRoYXQgaGF2ZSBydW4gbGF0ZXIgdGhhbiB0aGVpciBvdXRwdXQKK2hhbmRsZXJzLiIpCisKKyhkZWZ1biBpbi1nZGItaW5zdGFuY2UtY29udGV4dCAoaW5zdGFuY2UgZm9ybSkKKyAgIkZ1bmNhbGwgYGZvcm0nIGluIHRoZSBndWQgYnVmZmVyIG9mIGBpbnN0YW5jZSciCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIChzZXQtYnVmZmVyIChnZGItZ2V0LWluc3RhbmNlLWJ1ZmZlciBpbnN0YW5jZSAnZ3VkKSkKKyAgICAoZnVuY2FsbCBmb3JtKSkpCisKKzs7IGVuZCBvZiBpbnN0YW5jZSB2YXJzCisKKzs7Cis7OyBmaW5kaW5nIGluc3RhbmNlcworOzsKKworKGRlZnVuIGdkYi1wcm9jLT5pbnN0YW5jZSAocHJvYykKKyAgKHNhdmUtZXhjdXJzaW9uCisgICAgKHNldC1idWZmZXIgKHByb2Nlc3MtYnVmZmVyIHByb2MpKQorICAgIGdkYi1idWZmZXItaW5zdGFuY2UpKQorCisoZGVmdW4gZ2RiLW1ydS1pbnN0YW5jZS1idWZmZXIgKCkKKyAgIlJldHVybiB0aGUgbW9zdCByZWNlbnRseSB1c2VkIChub24tYXV4aWxpYXJ5KSBnZGIgZ3VkIGJ1ZmZlci4iCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIChnZGItZ290by1maXJzdC1nZGItaW5zdGFuY2UgKGJ1ZmZlci1saXN0KSkpKQorCisoZGVmdW4gZ2RiLWdvdG8tZmlyc3QtZ2RiLWluc3RhbmNlIChibGlzdCkKKyAgIlVzZSBnZGItbXJ1LWluc3RhbmNlLWJ1ZmZlciAtLSBub3QgdGhpcy4iCisgIChhbmQgYmxpc3QKKyAgICAgICAocHJvZ24KKwkgKHNldC1idWZmZXIgKGNhciBibGlzdCkpCisJIChvciAoYW5kIGdkYi1idWZmZXItaW5zdGFuY2UKKwkJICAoZXEgZ2RiLWJ1ZmZlci10eXBlICdndWQpCisJCSAgKGNhciBibGlzdCkpCisJICAgICAoZ2RiLWdvdG8tZmlyc3QtZ2RiLWluc3RhbmNlIChjZHIgYmxpc3QpKSkpKSkKKworKGRlZnVuIGJ1ZmZlci1nZGItaW5zdGFuY2UgKGJ1ZikKKyAgKHNhdmUtZXhjdXJzaW9uCisgICAgKHNldC1idWZmZXIgYnVmKQorICAgIGdkYi1idWZmZXItaW5zdGFuY2UpKQorCisoZGVmdW4gZ2RiLW5lZWRlZC1kZWZhdWx0LWluc3RhbmNlICgpCisgICJSZXR1cm4gdGhlIG1vc3QgcmVjZW50bHkgdXNlZCBnZGIgaW5zdGFuY2Ugb3Igc2lnbmFsIGFuIGVycm9yLiIKKyAgKGxldCAoKGJ1ZmZlciAoZ2RiLW1ydS1pbnN0YW5jZS1idWZmZXIpKSkKKyAgICAob3IgKGFuZCBidWZmZXIgKGJ1ZmZlci1nZGItaW5zdGFuY2UgYnVmZmVyKSkKKwkoZXJyb3IgIk5vIGluc3RhbmNlIG9mIGdkYiBmb3VuZC4iKSkpKQorCisoZGVmdW4gZ2RiLWluc3RhbmNlLXRhcmdldC1zdHJpbmcgKGluc3RhbmNlKQorICAiVGhlIGFwcGFyZW50IG5hbWUgb2YgdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgYnkgYSBnZGIgaW5zdGFuY2UuCitGb3Igc3VyZSB0aGlzIHRoZSByb290IHN0cmluZyB1c2VkIGluIHNtYXNoaW5nIHRvZ2V0aGVyIHRoZSBndWQgCitidWZmZXIncyBuYW1lLCBldmVuIGlmIHRoYXQgZG9lc24ndCBoYXBwZW4gdG8gYmUgdGhlIG5hbWUgb2YgYSAKK3Byb2dyYW0uIgorICAoaW4tZ2RiLWluc3RhbmNlLWNvbnRleHQKKyAgIGluc3RhbmNlCisgICAoZnVuY3Rpb24gKGxhbWJkYSAoKSBndWQtdGFyZ2V0LW5hbWUpKSkpCisKKwwKKworOzsKKzs7IEluc3RhbmNlIEJ1ZmZlcnMuCis7OworCis7OyBNb3JlIHRoYW4gb25lIGJ1ZmZlciBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGEgZ2RiIGluc3RhbmNlLgorOzsKKzs7IEVhY2ggYnVmZmVyIGhhcyBhIFRZUEUgLS0gYSBzeW1ib2wgdGhhdCBpZGVudGlmaWVzIHRoZSBmdW5jdGlvbgorOzsgb2YgdGhhdCBwYXJ0aWN1bGFyIGJ1ZmZlci4KKzs7Cis7OyBUaGUgdXN1YWwgZ3VkIGludGVyYWN0aW9uIGJ1ZmZlciBpcyBnaXZlbiB0aGUgdHlwZSBgZ3VkJyBhbmQKKzs7IGlzIGNvbnN0cnVjdGVkIHNwZWNpYWxseS4gIAorOzsKKzs7IE90aGVycyBhcmUgY29uc3RydWN0ZWQgYnkgZ2RiLWdldC1jcmVhdGUtaW5zdGFuY2UtYnVmZmVyIGFuZCAKKzs7IG5hbWVkIGFjY29yZGluZyB0byB0aGUgcnVsZXMgc2V0IGZvcnRoIGluIHRoZSBnZGItaW5zdGFuY2UtYnVmZmVyLXJ1bGVzLWFzc29jCisKKyhkZWZ1biBnZGItZ2V0LWluc3RhbmNlLWJ1ZmZlciAoaW5zdGFuY2Uga2V5KQorICAiUmV0dXJuIHRoZSBpbnN0YW5jZSBidWZmZXIgZm9yIGBpbnN0YW5jZScgdGFnZ2VkIHdpdGggdHlwZSBga2V5Jy4KK1RoZSBrZXkgc2hvdWxkIGJlIG9uZSBvZiB0aGUgY2FycyBpbiBgZ2RiLWluc3RhbmNlLWJ1ZmZlci1ydWxlcy1hc3NvYycuIgorICAoc2F2ZS1leGN1cnNpb24KKyAgICAoZ2RiLWxvb2stZm9yLXRhZ2dlZC1idWZmZXIgaW5zdGFuY2Uga2V5IChidWZmZXItbGlzdCkpKSkKKworKGRlZnVuIGdkYi1nZXQtY3JlYXRlLWluc3RhbmNlLWJ1ZmZlciAoaW5zdGFuY2Uga2V5KQorICAiQ3JlYXRlIGEgbmV3IGdkYiBpbnN0YW5jZSBidWZmZXIgb2YgdGhlIHR5cGUgc3BlY2lmaWVkIGJ5IGBrZXknLgorVGhlIGtleSBzaG91bGQgYmUgb25lIG9mIHRoZSBjYXJzIGluIGBnZGItaW5zdGFuY2UtYnVmZmVyLXJ1bGVzLWFzc29jJy4iCisgIChvciAoZ2RiLWdldC1pbnN0YW5jZS1idWZmZXIgaW5zdGFuY2Uga2V5KQorICAgICAgKGxldCogKChydWxlcyAoYXNzb2Mga2V5IGdkYi1pbnN0YW5jZS1idWZmZXItcnVsZXMtYXNzb2MpKQorCSAgICAgKG5hbWUgKGZ1bmNhbGwgKGdkYi1ydWxlcy1uYW1lLW1ha2VyIHJ1bGVzKSBpbnN0YW5jZSkpCisJICAgICAobmV3IChnZXQtYnVmZmVyLWNyZWF0ZSBuYW1lKSkpCisJKHNhdmUtZXhjdXJzaW9uCisJICAoc2V0LWJ1ZmZlciBuZXcpCisJICAobWFrZS12YXJpYWJsZS1idWZmZXItbG9jYWwgJ2dkYi1idWZmZXItdHlwZSkKKwkgIChzZXRxIGdkYi1idWZmZXItdHlwZSBrZXkpCisJICAobWFrZS12YXJpYWJsZS1idWZmZXItbG9jYWwgJ2dkYi1idWZmZXItaW5zdGFuY2UpCisJICAoc2V0cSBnZGItYnVmZmVyLWluc3RhbmNlIGluc3RhbmNlKQorCSAgKGlmIChjZHIgKGNkciBydWxlcykpCisJICAgICAgKGZ1bmNhbGwgKGNhciAoY2RyIChjZHIgcnVsZXMpKSkpKQorCSAgbmV3KSkpKQorCisoZGVmdW4gZ2RiLXJ1bGVzLW5hbWUtbWFrZXIgKHJ1bGVzKSAoY2FyIChjZHIgcnVsZXMpKSkKKworKGRlZnVuIGdkYi1sb29rLWZvci10YWdnZWQtYnVmZmVyIChpbnN0YW5jZSBrZXkgYnVmcykKKyAgKGxldCAoKHJldHZhbCBuaWwpKQorICAgICh3aGlsZSAoYW5kIChub3QgcmV0dmFsKSBidWZzKQorICAgICAgKHNldC1idWZmZXIgKGNhciBidWZzKSkKKyAgICAgIChpZiAoYW5kIChlcSBnZGItYnVmZmVyLWluc3RhbmNlIGluc3RhbmNlKQorCSAgICAgICAoZXEgZ2RiLWJ1ZmZlci10eXBlIGtleSkpCisJICAoc2V0cSByZXR2YWwgKGNhciBidWZzKSkpCisgICAgICAoc2V0cSBidWZzIChjZHIgYnVmcykpCisgICAgICApCisgICAgcmV0dmFsKSkKKworKGRlZnVuIGdkYi1pbnN0YW5jZS1idWZmZXItcCAoYnVmKQorICAoc2F2ZS1leGN1cnNpb24KKyAgICAoc2V0LWJ1ZmZlciBidWYpCisgICAgKGFuZCBnZGItYnVmZmVyLXR5cGUKKwkgKG5vdCAoZXEgZ2RiLWJ1ZmZlci10eXBlICdndWQpKSkpKQorCis7OworOzsgVGhpcyBhc3NvYyBtYXBzIGJ1ZmZlciB0eXBlIHN5bWJvbHMgdG8gcnVsZXMuICBFYWNoIHJ1bGUgaXMgYSBsaXN0IG9mCis7OyBhdCBsZWFzdCBvbmUgYW5kIHBvc3NpYmxlIG1vcmUgZnVuY3Rpb25zLiAgVGhlIGZ1bmN0aW9ucyBoYXZlIHRoZXNlCis7OyByb2xlcyBpbiBkZWZpbmluZyBhIGJ1ZmZlciB0eXBlOgorOzsKKzs7ICAgICBOQU1FIC0gdGFrZSBhbiBpbnN0YW5jZSwgcmV0dXJuIGEgbmFtZSBmb3IgdGhpcyB0eXBlIGJ1ZmZlciBmb3IgdGhhdCAKKzs7CSAgICAgIGluc3RhbmNlLgorOzsgVGhlIHJlbWFpbmluZyBmdW5jdGlvbihzKSBhcmUgb3B0aW9uYWw6Cis7OworOzsgICAgIE1PREUgLSBjYWxsZWQgaW4gbmV3IG5ldyBidWZmZXIgd2l0aCBubyBhcmd1bWVudHMsIHNob3VsZCBlc3RhYmxpc2gKKzs7CSAgICAgIHRoZSBwcm9wZXIgbW9kZSBmb3IgdGhlIGJ1ZmZlci4KKzs7CisKKyhkZWZ2YXIgZ2RiLWluc3RhbmNlLWJ1ZmZlci1ydWxlcy1hc3NvYyAnKCkpCisKKyhkZWZ1biBnZGItc2V0LWluc3RhbmNlLWJ1ZmZlci1ydWxlcyAoYnVmZmVyLXR5cGUgJnJlc3QgcnVsZXMpCisgIChsZXQgKChiaW5kaW5nIChhc3NvYyBidWZmZXItdHlwZSBnZGItaW5zdGFuY2UtYnVmZmVyLXJ1bGVzLWFzc29jKSkpCisgICAgKGlmIGJpbmRpbmcKKwkoc2V0Y2RyIGJpbmRpbmcgcnVsZXMpCisgICAgICAoc2V0cSBnZGItaW5zdGFuY2UtYnVmZmVyLXJ1bGVzLWFzc29jCisJICAgIChjb25zIChjb25zIGJ1ZmZlci10eXBlIHJ1bGVzKQorCQkgIGdkYi1pbnN0YW5jZS1idWZmZXItcnVsZXMtYXNzb2MpKSkpKQorCisoZ2RiLXNldC1pbnN0YW5jZS1idWZmZXItcnVsZXMgJ2d1ZCAnZXJyb3IpIDsgZ3VkIGJ1ZmZlcnMgYXJlIGFuIGV4Y2VwdGlvbiB0byB0aGUgcnVsZXMKKworOzsKKzs7IHBhcnRpYWwtb3V0cHV0IGJ1ZmZlcnMKKzs7Cis7OyBUaGVzZSBhY2N1bXVsYXRlIG91dHB1dCBmcm9tIGEgY29tbWFuZCBleGVjdXRlZCBvbgorOzsgYmVoYWxmIG9mIGVtYWNzIChyYXRoZXIgdGhhbiB0aGUgdXNlcikuICAKKzs7CisKKyhnZGItc2V0LWluc3RhbmNlLWJ1ZmZlci1ydWxlcyAnZ2RiLXBhcnRpYWwtb3V0cHV0LWJ1ZmZlcgorCQkJICAgICAgICdnZGItcGFydGlhbC1vdXRwdXQtbmFtZSkKKworKGRlZnVuIGdkYi1wYXJ0aWFsLW91dHB1dC1uYW1lIChpbnN0YW5jZSkKKyAgKGNvbmNhdCAiKnBhcnRpYWwtb3V0cHV0LSIKKwkgIChnZGItaW5zdGFuY2UtdGFyZ2V0LXN0cmluZyBpbnN0YW5jZSkKKwkgICIqIikpCisKKwwKKyhnZGItc2V0LWluc3RhbmNlLWJ1ZmZlci1ydWxlcyAnZ2RiLWluZmVyaW9yLWlvCisJCQkgICAgICAgJ2dkYi1pbmZlcmlvci1pby1uYW1lCisJCQkgICAgICAgJ2d1ZC1pbmZlcmlvci1pby1tb2RlKQorCisoZGVmdW4gZ2RiLWluZmVyaW9yLWlvLW5hbWUgKGluc3RhbmNlKQorICAoY29uY2F0ICIqaW5wdXQvb3V0cHV0IG9mICIKKwkgIChnZGItaW5zdGFuY2UtdGFyZ2V0LXN0cmluZyBpbnN0YW5jZSkKKwkgICIqIikpCisKKyhkZWZ2YXIgZ2RiLWluZmVyaW9yLWlvLW1vZGUtbWFwIChjb3B5LWtleW1hcCBjb21pbnQtbW9kZS1tYXApKQorKGRlZmluZS1rZXkgY29taW50LW1vZGUtbWFwICJcQy1jXEMtYyIgJ2dkYi1pbmZlcmlvci1pby1pbnRlcnJ1cHQpCisoZGVmaW5lLWtleSBjb21pbnQtbW9kZS1tYXAgIlxDLWNcQy16IiAnZ2RiLWluZmVyaW9yLWlvLXN0b3ApCisoZGVmaW5lLWtleSBjb21pbnQtbW9kZS1tYXAgIlxDLWNcQy1cXCIgJ2dkYi1pbmZlcmlvci1pby1xdWl0KQorKGRlZmluZS1rZXkgY29taW50LW1vZGUtbWFwICJcQy1jXEMtZCIgJ2dkYi1pbmZlcmlvci1pby1lb2YpCisKKyhkZWZ1biBndWQtaW5mZXJpb3ItaW8tbW9kZSAoKQorICAiTWFqb3IgbW9kZSBmb3IgZ3VkIGluZmVyaW9yLWlvLgorCitcXHtjb21pbnQtbW9kZS1tYXB9IgorICA7OyBXZSB3YW50IHRvIHVzZSBjb21pbnQgYmVjYXVzZSBpdCBoYXMgdmFyaW91cyBuaWZ0eSBhbmQgZmFtaWxpYXIKKyAgOzsgZmVhdHVyZXMuICBXZSBkb24ndCBuZWVkIGEgcHJvY2VzcywgYnV0IGNvbWludCB3YW50cyBvbmUsIHNvIGNyZWF0ZQorICA7OyBhIGR1bW15IG9uZS4KKyAgKG1ha2UtY29taW50IChzdWJzdHJpbmcgKGJ1ZmZlci1uYW1lKSAxICgtIChsZW5ndGggKGJ1ZmZlci1uYW1lKSkgMSkpCisJICAgICAgICIvYmluL2NhdCIpCisgIChzZXRxIG1ham9yLW1vZGUgJ2d1ZC1pbmZlcmlvci1pby1tb2RlKQorICAoc2V0cSBtb2RlLW5hbWUgIkRlYnVnZ2VlIEkvTyIpCisgIChzZXRxIGNvbWludC1pbnB1dC1zZW5kZXIgJ2d1ZC1pbmZlcmlvci1pby1zZW5kZXIpCispCisKKyhkZWZ1biBndWQtaW5mZXJpb3ItaW8tc2VuZGVyIChwcm9jIHN0cmluZykKKyAgKHNhdmUtZXhjdXJzaW9uCisgICAgKHNldC1idWZmZXIgKHByb2Nlc3MtYnVmZmVyIHByb2MpKQorICAgIChsZXQgKChpbnN0YW5jZSBnZGItYnVmZmVyLWluc3RhbmNlKSkKKyAgICAgIChzZXQtYnVmZmVyIChnZGItZ2V0LWluc3RhbmNlLWJ1ZmZlciBpbnN0YW5jZSAnZ3VkKSkKKyAgICAgIChsZXQgKChndWQtcHJvYyAoZ2V0LWJ1ZmZlci1wcm9jZXNzIChjdXJyZW50LWJ1ZmZlcikpKSkKKwkocHJvY2Vzcy1zZW5kLXN0cmluZyBndWQtcHJvYyBzdHJpbmcpCisJKHByb2Nlc3Mtc2VuZC1zdHJpbmcgZ3VkLXByb2MgIlxuIikKKyAgICApKQorICAgICkpCisKKyhkZWZ1biBnZGItaW5mZXJpb3ItaW8taW50ZXJydXB0IChpbnN0YW5jZSkKKyAgIkludGVycnVwdCB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZC4iCisgIChpbnRlcmFjdGl2ZSAobGlzdCAoZ2RiLW5lZWRlZC1kZWZhdWx0LWluc3RhbmNlKSkpCisgIChpbnRlcnJ1cHQtcHJvY2VzcworICAgKGdldC1idWZmZXItcHJvY2VzcyAoZ2RiLWdldC1pbnN0YW5jZS1idWZmZXIgaW5zdGFuY2UgJ2d1ZCkpIGNvbWludC1wdHlwKSkKKworKGRlZnVuIGdkYi1pbmZlcmlvci1pby1xdWl0IChpbnN0YW5jZSkKKyAgIlNlbmQgcXVpdCBzaWduYWwgdG8gdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQuIgorICAoaW50ZXJhY3RpdmUgKGxpc3QgKGdkYi1uZWVkZWQtZGVmYXVsdC1pbnN0YW5jZSkpKQorICAocXVpdC1wcm9jZXNzCisgICAoZ2V0LWJ1ZmZlci1wcm9jZXNzIChnZGItZ2V0LWluc3RhbmNlLWJ1ZmZlciBpbnN0YW5jZSAnZ3VkKSkgY29taW50LXB0eXApKQorCisoZGVmdW4gZ2RiLWluZmVyaW9yLWlvLXN0b3AgKGluc3RhbmNlKQorICAiU3RvcCB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZC4iCisgIChpbnRlcmFjdGl2ZSAobGlzdCAoZ2RiLW5lZWRlZC1kZWZhdWx0LWluc3RhbmNlKSkpCisgIChzdG9wLXByb2Nlc3MKKyAgIChnZXQtYnVmZmVyLXByb2Nlc3MgKGdkYi1nZXQtaW5zdGFuY2UtYnVmZmVyIGluc3RhbmNlICdndWQpKSBjb21pbnQtcHR5cCkpCisKKyhkZWZ1biBnZGItaW5mZXJpb3ItaW8tZW9mIChpbnN0YW5jZSkKKyAgIlNlbmQgZW5kLW9mLWZpbGUgdG8gdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQuIgorICAoaW50ZXJhY3RpdmUgKGxpc3QgKGdkYi1uZWVkZWQtZGVmYXVsdC1pbnN0YW5jZSkpKQorICAocHJvY2Vzcy1zZW5kLWVvZgorICAgKGdldC1idWZmZXItcHJvY2VzcyAoZ2RiLWdldC1pbnN0YW5jZS1idWZmZXIgaW5zdGFuY2UgJ2d1ZCkpKSkKKwwKKworOzsKKzs7IGdkYiBjb21tdW5pY2F0aW9ucworOzsKKworOzsgSU5QVVQ6IHRoaW5ncyBzZW50IHRvIGdkYgorOzsKKzs7IEVhY2ggaW5zdGFuY2UgaGFzIGEgaGlnaCBhbmQgbG93IHByaW9yaXR5IAorOzsgaW5wdXQgcXVldWUuICBMb3cgcHJpb3JpdHkgaW5wdXQgaXMgc2VudCBvbmx5IAorOzsgd2hlbiB0aGUgaGlnaCBwcmlvcml0eSBxdWV1ZSBpcyBpZGxlLgorOzsKKzs7IFRoZSBxdWV1ZXMgYXJlIGxpc3RzLiAgRWFjaCBlbGVtZW50IGlzIGVpdGhlciAKKzs7IGEgc3RyaW5nIChpbmRpY2F0aW5nIHVzZXIgb3IgdXNlci1saWtlIGlucHV0KQorOzsgb3IgYSBsaXN0IG9mIHRoZSBmb3JtOgorOzsKKzs7ICAgIChJTlBVVC1TVFJJTkcgIEhBTkRMRVItRk4pCis7OworOzsKKzs7IFRoZSBoYW5kbGVyIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGZyb20gdGhlIAorOzsgcGFydGlhbC1vdXRwdXQgYnVmZmVyIHdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGVzLgorOzsgVGhpcyBpcyB0aGUgd2F5IHRvIHdyaXRlIGNvbW1hbmRzIHdoaWNoIAorOzsgaW52b2tlIGdkYiBjb21tYW5kcyBhdXRvbm9tb3VzbHkuCis7OworOzsgVGhlc2UgbGlzdHMgYXJlIGNvbnN1bWVkIHRhaWwgZmlyc3QuCis7OworCisoZGVmdW4gZ2RiLXNlbmQgKHByb2Mgc3RyaW5nKQorICAiQSBjb21pbnQgc2VuZCBmaWx0ZXIgZm9yIGdkYi4KK1RoaXMgZmlsdGVyIG1heSBzaW1wbHkgcXVldWUgb3V0cHV0IGZvciBhIGxhdGVyIHRpbWUuIgorICAobGV0ICgoaW5zdGFuY2UgKGdkYi1wcm9jLT5pbnN0YW5jZSBwcm9jKSkpCisgICAgKGdkYi1pbnN0YW5jZS1lbnF1ZXVlLWlucHV0IGluc3RhbmNlIChjb25jYXQgc3RyaW5nICJcbiIpKSkpCisKKzs7IE5vdGU6IFN0dWZmIGVucXVldWVkIGhlcmUgd2lsbCBiZSBzZW50IHRvIHRoZSBuZXh0IHByb21wdCwgZXZlbiBpZiBpdAorOzsgaXMgYSBxdWVyeSwgb3Igb3RoZXIgbm9uLXRvcC1sZXZlbCBwcm9tcHQuICBUbyBndWFyYW50ZWUgc3R1ZmYgd2lsbCBnZXQKKzs7IHNlbnQgdG8gdGhlIHRvcC1sZXZlbCBwcm9tcHQsIGN1cnJlbnRseSBpdCBtdXN0IGJlIHB1dCBpbiB0aGUgaWRsZSBxdWV1ZS4KKzs7CQkJCSBeXl5eXl5eXl4KKzs7IFtUaGlzIHNob3VsZCBlbmNvdXJhZ2UgZ3VkIGV4dGVudGlvbnMgdGhhdCBpbnZva2UgZ2RiIGNvbW1hbmRzIHRvIGxldAorOzsgIHRoZSB1c2VyIGdvIGZpcnN0OyBpdCBpcyBub3QgYSBidWcuICAgICAtdF0KKzs7CisKKyhkZWZ1biBnZGItaW5zdGFuY2UtZW5xdWV1ZS1pbnB1dCAoaW5zdGFuY2UgaXRlbSkKKyAgKGlmIChnZGItaW5zdGFuY2UtcHJvbXB0aW5nIGluc3RhbmNlKQorICAgICAgKHByb2duCisJKGdkYi1zZW5kLWl0ZW0gaW5zdGFuY2UgaXRlbSkKKwkoc2V0LWdkYi1pbnN0YW5jZS1wcm9tcHRpbmcgaW5zdGFuY2UgbmlsKSkKKyAgICAoc2V0LWdkYi1pbnN0YW5jZS1pbnB1dC1xdWV1ZQorICAgICBpbnN0YW5jZQorICAgICAoY29ucyBpdGVtIChnZGItaW5zdGFuY2UtaW5wdXQtcXVldWUgaW5zdGFuY2UpKSkpKQorCisoZGVmdW4gZ2RiLWluc3RhbmNlLWRlcXVldWUtaW5wdXQgKGluc3RhbmNlKQorICAobGV0ICgocXVldWUgKGdkYi1pbnN0YW5jZS1pbnB1dC1xdWV1ZSBpbnN0YW5jZSkpKQorICAgIChhbmQgcXVldWUKKyAgICAgICAoaWYgKG5vdCAoY2RyIHF1ZXVlKSkKKwkgICAobGV0ICgoYW5zd2VyIChjYXIgcXVldWUpKSkKKwkgICAgIChzZXQtZ2RiLWluc3RhbmNlLWlucHV0LXF1ZXVlIGluc3RhbmNlICcoKSkKKwkgICAgIGFuc3dlcikKKwkgKGdkYi10YWtlLWxhc3QtZWx0IHF1ZXVlKSkpKSkKKworKGRlZnVuIGdkYi1pbnN0YW5jZS1lbnF1ZXVlLWlkbGUtaW5wdXQgKGluc3RhbmNlIGl0ZW0pCisgIChpZiAoYW5kIChnZGItaW5zdGFuY2UtcHJvbXB0aW5nIGluc3RhbmNlKQorCSAgIChub3QgKGdkYi1pbnN0YW5jZS1pbnB1dC1xdWV1ZSBpbnN0YW5jZSkpKQorICAgICAgKHByb2duCisJKGdkYi1zZW5kLWl0ZW0gaW5zdGFuY2UgaXRlbSkKKwkoc2V0LWdkYi1pbnN0YW5jZS1wcm9tcHRpbmcgaW5zdGFuY2UgbmlsKSkKKyAgICAoc2V0LWdkYi1pbnN0YW5jZS1pZGxlLWlucHV0LXF1ZXVlCisgICAgIGluc3RhbmNlCisgICAgIChjb25zIGl0ZW0gKGdkYi1pbnN0YW5jZS1pZGxlLWlucHV0LXF1ZXVlIGluc3RhbmNlKSkpKSkKKworKGRlZnVuIGdkYi1pbnN0YW5jZS1kZXF1ZXVlLWlkbGUtaW5wdXQgKGluc3RhbmNlKQorICAobGV0ICgocXVldWUgKGdkYi1pbnN0YW5jZS1pZGxlLWlucHV0LXF1ZXVlIGluc3RhbmNlKSkpCisgICAgKGFuZCBxdWV1ZQorICAgICAgIChpZiAobm90IChjZHIgcXVldWUpKQorCSAgIChsZXQgKChhbnN3ZXIgKGNhciBxdWV1ZSkpKQorCSAgICAgKHNldC1nZGItaW5zdGFuY2UtaWRsZS1pbnB1dC1xdWV1ZSBpbnN0YW5jZSAnKCkpCisJICAgICBhbnN3ZXIpCisJIChnZGItdGFrZS1sYXN0LWVsdCBxdWV1ZSkpKSkpCisKKzsgRG9uJ3QgdXNlIHRoaXMgaW4gZ2VuZXJhbC4KKyhkZWZ1biBnZGItdGFrZS1sYXN0LWVsdCAobCkKKyAgKGlmIChjZHIgKGNkciBsKSkKKyAgICAgIChnZGItdGFrZS1sYXN0LWVsdCAoY2RyIGwpKQorICAgIChsZXQgKChhbnN3ZXIgKGNhciAoY2RyIGwpKSkpCisgICAgICAoc2V0Y2RyIGwgJygpKQorICAgICAgYW5zd2VyKSkpCisKKwwKKzs7Cis7OyBvdXRwdXQgLS0gdGhpbmdzIGdkYiBwcmludHMgdG8gZW1hY3MKKzs7Cis7OyBHREIgb3V0cHV0IGlzIGEgc3RyZWFtIGludGVycnVwdGVkIGJ5IGFubm90YXRpb25zLgorOzsgQW5ub3RhdGlvbnMgY2FuIGJlIHJlY29nbml6ZWQgYnkgdGhlaXIgYmVnaW5uaW5nCis7OyB3aXRoIFxDLWpcQy16XEMtejx0YWc+PG9wdD5cQy1qCis7OworOzsgVGhlIHRhZyBpcyBhIHN0cmluZyBvYmV5aW5nIHN5bWJvbCBzeW50YXguCis7OworOzsgVGhlIG9wdGlvbmFsIHBhcnQgYDxvcHQ+JyBjYW4gYmUgZWl0aGVyIHRoZSBlbXB0eSBzdHJpbmcKKzs7IG9yIGEgc3BhY2UgZm9sbG93ZWQgYnkgbW9yZSBkYXRhIHJlbGF0aW5nIHRvIHRoZSBhbm5vdGF0aW9uLgorOzsgRm9yIGV4YW1wbGUsIHRoZSBTT1VSQ0UgYW5ub3RhdGlvbiBpcyBmb2xsb3dlZCBieSBhIGZpbGVuYW1lLAorOzsgbGluZSBudW1iZXIgYW5kIHZhcmlvdXMgdXNlbGVzcyBnb28uICBUaGlzIGRhdGEgbXVzdCBub3QgaW5jbHVkZQorOzsgYW55IG5ld2xpbmVzLgorOzsKKworCisoZGVmdW4gZ3VkLWdkYi1tYXJrZXItZmlsdGVyIChzdHJpbmcpCisgICJBIGd1ZCBtYXJrZXIgZmlsdGVyIGZvciBnZGIuIgorICA7OyBCb2dvbnMgZG9uJ3QgdGVsbCB1cyB0aGUgcHJvY2VzcyBleGNlcHQgdGhyb3VnaCBzY29waW5nIGNydWQuCisgIChsZXQgKChpbnN0YW5jZSAoZ2RiLXByb2MtPmluc3RhbmNlIHByb2MpKSkKKyAgICAoZ2RiLW91dHB1dC1idXJzdCBpbnN0YW5jZSBzdHJpbmcpKSkKKworKGRlZnZhciBnZGItYW5ub3RhdGlvbi1ydWxlcworICAnKCgiZnJhbWVzLWludmFsaWQiIGdkYi1pbnZhbGlkYXRlLWZyYW1lcykKKyAgICAoImJyZWFrcG9pbnRzLWludmFsaWQiIGdkYi1pbnZhbGlkYXRlLWJyZWFrcG9pbnRzKQorICAgICgicHJlLXByb21wdCIgZ2RiLXByZS1wcm9tcHQpCisgICAgKCJwcm9tcHQiIGdkYi1wcm9tcHQpCisgICAgKCJjb21tYW5kcyIgZ2RiLXN1YnByb21wdCkKKyAgICAoIm92ZXJsb2FkLWNob2ljZSIgZ2RiLXN1YnByb21wdCkKKyAgICAoInF1ZXJ5IiBnZGItc3VicHJvbXB0KQorICAgICgicHJvbXB0LWZvci1jb250aW51ZSIgZ2RiLXN1YnByb21wdCkKKyAgICAoInBvc3QtcHJvbXB0IiBnZGItcG9zdC1wcm9tcHQpCisgICAgKCJzb3VyY2UiIGdkYi1zb3VyY2UpCisgICAgKCJzdGFydGluZyIgZ2RiLXN0YXJ0aW5nKQorICAgICgiZXhpdGVkIiBnZGItc3RvcHBpbmcpCisgICAgKCJzaWduYWxsZWQiIGdkYi1zdG9wcGluZykKKyAgICAoInNpZ25hbCIgZ2RiLXN0b3BwaW5nKQorICAgICgiYnJlYWtwb2ludCIgZ2RiLXN0b3BwaW5nKQorICAgICgid2F0Y2hwb2ludCIgZ2RiLXN0b3BwaW5nKQorICAgICgic3RvcHBlZCIgZ2RiLXN0b3BwZWQpCisgICAgKQorICAiQW4gYXNzb2MgbWFwcGluZyBhbm5vdGF0aW9uIHRhZ3MgdG8gZnVuY3Rpb25zIHdoaWNoIHByb2Nlc3MgdGhlbS4iKQorCisKKyhkZWZ1biBnZGItaWdub3JlLWFubm90YXRpb24gKGluc3RhbmNlIGFyZ3MpCisgIG5pbCkKKworKGRlZmNvbnN0IGdkYi1zb3VyY2Utc3BlYy1yZWdleHAKKyAgIlxcKC4qXFwpOlxcKFswLTldKlxcKTpbMC05XSo6W2Etel0qOjB4W2EtZjAtOV0qIikKKworOzsgRG8gbm90IHVzZSB0aGlzIGV4Y2VwdCBhcyBhbiBhbm5vdGF0aW9uIGhhbmRsZXIuIgorKGRlZnVuIGdkYi1zb3VyY2UgKGluc3RhbmNlIGFyZ3MpCisgIChzdHJpbmctbWF0Y2ggZ2RiLXNvdXJjZS1zcGVjLXJlZ2V4cCBhcmdzKQorICA7OyBFeHRyYWN0IHRoZSBmcmFtZSBwb3NpdGlvbiBmcm9tIHRoZSBtYXJrZXIuCisgIChzZXRxIGd1ZC1sYXN0LWZyYW1lCisJKGNvbnMKKwkgKHN1YnN0cmluZyBhcmdzIChtYXRjaC1iZWdpbm5pbmcgMSkgKG1hdGNoLWVuZCAxKSkKKwkgKHN0cmluZy10by1pbnQgKHN1YnN0cmluZyBhcmdzCisJCQkJICAgKG1hdGNoLWJlZ2lubmluZyAyKQorCQkJCSAgIChtYXRjaC1lbmQgMikpKSkpKQorCis7OyBBbiBhbm5vdGF0aW9uIGhhbmRsZXIgZm9yIGBwcm9tcHQnLgorOzsgVGhpcyBzZW5kcyB0aGUgbmV4dCBjb21tYW5kIChpZiBhbnkpIHRvIGdkYi4KKyhkZWZ1biBnZGItcHJvbXB0IChpbnN0YW5jZSBpZ25vcmVkKQorICAobGV0ICgoc2luayAoZ2RiLWluc3RhbmNlLW91dHB1dC1zaW5rIGluc3RhbmNlKSkpCisgICAgKGNvbmQKKyAgICAgKChlcSBzaW5rICd1c2VyKSB0KQorICAgICAoKGVxIHNpbmsgJ3Bvc3QtZW1hY3MpCisgICAgICAoc2V0LWdkYi1pbnN0YW5jZS1vdXRwdXQtc2luayBpbnN0YW5jZSAndXNlcikpCisgICAgICh0CisgICAgICAoc2V0LWdkYi1pbnN0YW5jZS1vdXRwdXQtc2luayBpbnN0YW5jZSAndXNlcikKKyAgICAgIChlcnJvciAiUGhhc2UgZXJyb3IgaW4gZ2RiLXByb21wdCAoZ290ICVzKSIgc2luaykpKSkKKyAgKGxldCAoKGhpZ2hlc3QgKGdkYi1pbnN0YW5jZS1kZXF1ZXVlLWlucHV0IGluc3RhbmNlKSkpCisgICAgKGlmIGhpZ2hlc3QKKwkoZ2RiLXNlbmQtaXRlbSBpbnN0YW5jZSBoaWdoZXN0KQorICAgICAgKGxldCAoKGxvd2VzdCAoZ2RiLWluc3RhbmNlLWRlcXVldWUtaWRsZS1pbnB1dCBpbnN0YW5jZSkpKQorCShpZiBsb3dlc3QKKwkgICAgKGdkYi1zZW5kLWl0ZW0gaW5zdGFuY2UgbG93ZXN0KQorCSAgKHByb2duCisJICAgIChzZXQtZ2RiLWluc3RhbmNlLXByb21wdGluZyBpbnN0YW5jZSB0KQorCSAgICAoZ3VkLWRpc3BsYXktZnJhbWUpKSkpKSkpCisKKzs7IEFuIGFubm90YXRpb24gaGFuZGxlciBmb3Igbm9uLXRvcC1sZXZlbCBwcm9tcHRzLgorKGRlZnVuIGdkYi1zdWJwcm9tcHQgKGluc3RhbmNlIGlnbm9yZWQpCisgIChsZXQgKChoaWdoZXN0IChnZGItaW5zdGFuY2UtZGVxdWV1ZS1pbnB1dCBpbnN0YW5jZSkpKQorICAgIChpZiBoaWdoZXN0CisJKGdkYi1zZW5kLWl0ZW0gaW5zdGFuY2UgaGlnaGVzdCkKKyAgICAgIChzZXQtZ2RiLWluc3RhbmNlLXByb21wdGluZyBpbnN0YW5jZSB0KSkpKQorCisoZGVmdW4gZ2RiLXNlbmQtaXRlbSAoaW5zdGFuY2UgaXRlbSkKKyAgKHNldC1nZGItaW5zdGFuY2UtY3VycmVudC1pdGVtIGluc3RhbmNlIGl0ZW0pCisgIChpZiAoc3RyaW5ncCBpdGVtKQorICAgICAgKHByb2duCisJKHNldC1nZGItaW5zdGFuY2Utb3V0cHV0LXNpbmsgaW5zdGFuY2UgJ3VzZXIpCisJKHByb2Nlc3Mtc2VuZC1zdHJpbmcgKGdkYi1pbnN0YW5jZS1wcm9jZXNzIGluc3RhbmNlKQorCQkJICAgICBpdGVtKSkKKyAgICAocHJvZ24KKyAgICAgIChnZGItY2xlYXItcGFydGlhbC1vdXRwdXQgaW5zdGFuY2UpCisgICAgICAoc2V0LWdkYi1pbnN0YW5jZS1vdXRwdXQtc2luayBpbnN0YW5jZSAncHJlLWVtYWNzKQorICAgICAgKHByb2Nlc3Mtc2VuZC1zdHJpbmcgKGdkYi1pbnN0YW5jZS1wcm9jZXNzIGluc3RhbmNlKQorCQkJICAgKGNhciBpdGVtKSkpKSkKKworOzsgQW4gYW5ub3RhdGlvbiBoYW5kbGVyIGZvciBgcHJlLXByb21wdCcuCis7OyBUaGlzIHRlcm1pbmF0ZXMgdGhlIGNvbGxlY3Rpb24gb2Ygb3V0cHV0IGZyb20gYSBwcmV2aW91cworOzsgY29tbWFuZCBpZiB0aGF0IGhhcHBlbnMgdG8gYmUgaW4gZWZmZWN0LgorKGRlZnVuIGdkYi1wcmUtcHJvbXB0IChpbnN0YW5jZSBpZ25vcmVkKQorICAobGV0ICgoc2luayAoZ2RiLWluc3RhbmNlLW91dHB1dC1zaW5rIGluc3RhbmNlKSkpCisgICAgKGNvbmQKKyAgICAgKChlcSBzaW5rICd1c2VyKSB0KQorICAgICAoKGVxIHNpbmsgJ2VtYWNzKQorICAgICAgKHNldC1nZGItaW5zdGFuY2Utb3V0cHV0LXNpbmsgaW5zdGFuY2UgJ3Bvc3QtZW1hY3MpCisgICAgICAobGV0ICgoaGFuZGxlcgorCSAgICAgKGNhciAoY2RyIChnZGItaW5zdGFuY2UtY3VycmVudC1pdGVtIGluc3RhbmNlKSkpKSkKKwkoc2F2ZS1leGN1cnNpb24KKwkgIChzZXQtYnVmZmVyIChnZGItZ2V0LWNyZWF0ZS1pbnN0YW5jZS1idWZmZXIKKwkJICAgICAgIGluc3RhbmNlICdnZGItcGFydGlhbC1vdXRwdXQtYnVmZmVyKSkKKwkgIChmdW5jYWxsIGhhbmRsZXIpKSkpCisgICAgICh0CisgICAgICAoc2V0LWdkYi1pbnN0YW5jZS1vdXRwdXQtc2luayBpbnN0YW5jZSAndXNlcikKKyAgICAgIChlcnJvciAiT3V0cHV0IHNpbmsgcGhhc2UgZXJyb3IgMS4iKSkpKSkKKworOzsgQW4gYW5ub3RhdGlvbiBoYW5kbGVyIGZvciBgc3RhcnRpbmcnLiAgVGhpcyBzYXlzIHRoYXQgSS9PIGZvciB0aGUgc3VicHJvY2VzcworOzsgaXMgbm93IHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkLCBub3QgR0RCLgorKGRlZnVuIGdkYi1zdGFydGluZyAoaW5zdGFuY2UgaWdub3JlZCkKKyAgKGxldCAoKHNpbmsgKGdkYi1pbnN0YW5jZS1vdXRwdXQtc2luayBpbnN0YW5jZSkpKQorICAgIChjb25kCisgICAgICgoZXEgc2luayAndXNlcikKKyAgICAgIChzZXQtZ2RiLWluc3RhbmNlLW91dHB1dC1zaW5rIGluc3RhbmNlICdpbmZlcmlvcikKKyAgICAgIDs7IEZJWE1FOiBuZWVkIHRvIHNlbmQgcXVldWVkIGlucHV0CisgICAgICApCisgICAgICh0IChlcnJvciAiVW5leHBlY3RlZCBgc3RhcnRpbmcnIGFubm90YXRpb24iKSkpKSkKKworOzsgQW4gYW5ub3RhdGlvbiBoYW5kbGVyIGZvciBgZXhpdGVkJyBhbmQgb3RoZXIgYW5ub3RhdGlvbnMgd2hpY2ggc2F5IHRoYXQKKzs7IEkvTyBmb3IgdGhlIHN1YnByb2Nlc3MgaXMgbm93IEdEQiwgbm90IHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkLgorKGRlZnVuIGdkYi1zdG9wcGluZyAoaW5zdGFuY2UgaWdub3JlZCkKKyAgKGxldCAoKHNpbmsgKGdkYi1pbnN0YW5jZS1vdXRwdXQtc2luayBpbnN0YW5jZSkpKQorICAgIChjb25kCisgICAgICgoZXEgc2luayAnaW5mZXJpb3IpCisgICAgICAoc2V0LWdkYi1pbnN0YW5jZS1vdXRwdXQtc2luayBpbnN0YW5jZSAndXNlcikKKyAgICAgICkKKyAgICAgKHQgKGVycm9yICJVbmV4cGVjdGVkIHN0b3BwaW5nIGFubm90YXRpb24iKSkpKSkKKworOzsgQW4gYW5ub3RhdGlvbiBoYW5kbGVyIGZvciBgc3RvcHBlZCcuICBJdCBpcyBqdXN0IGxpa2UgZ2RiLXN0b3BwaW5nLCBleGNlcHQKKzs7IHRoYXQgaWYgd2UgYWxyZWFkeSBzZXQgdGhlIG91dHB1dCBzaW5rIHRvICd1c2VyIGluIGdkYi1zdG9wcGluZywgdGhhdCBpcyAKKzs7IGZpbmUuCisoZGVmdW4gZ2RiLXN0b3BwZWQgKGluc3RhbmNlIGlnbm9yZWQpCisgIChsZXQgKChzaW5rIChnZGItaW5zdGFuY2Utb3V0cHV0LXNpbmsgaW5zdGFuY2UpKSkKKyAgICAoY29uZAorICAgICAoKGVxIHNpbmsgJ2luZmVyaW9yKQorICAgICAgKHNldC1nZGItaW5zdGFuY2Utb3V0cHV0LXNpbmsgaW5zdGFuY2UgJ3VzZXIpCisgICAgICApCisgICAgICgoZXEgc2luayAndXNlcikKKyAgICAgIHQpCisgICAgICh0IChlcnJvciAiVW5leHBlY3RlZCBzdG9wcGluZyBhbm5vdGF0aW9uIikpKSkpCisKKzs7IEFuIGFubm90YXRpb24gaGFuZGxlciBmb3IgYHBvc3QtcHJvbXB0Jy4KKzs7IFRoaXMgYmVnaW5zIHRoZSBjb2xsZWN0aW9uIG9mIG91dHB1dCBmcm9tIHRoZSBjdXJyZW50Cis7OyBjb21tYW5kIGlmIHRoYXQgaGFwcGVucyB0byBiZSBhcHByb3ByaWF0ZS4iCisoZGVmdW4gZ2RiLXBvc3QtcHJvbXB0IChpbnN0YW5jZSBpZ25vcmVkKQorICAoZ2RiLWludmFsaWRhdGUtcmVnaXN0ZXJzIGluc3RhbmNlIGlnbm9yZWQpCisgIChsZXQgKChzaW5rIChnZGItaW5zdGFuY2Utb3V0cHV0LXNpbmsgaW5zdGFuY2UpKSkKKyAgICAoY29uZAorICAgICAoKGVxIHNpbmsgJ3VzZXIpIHQpCisgICAgICgoZXEgc2luayAncHJlLWVtYWNzKQorICAgICAgKHNldC1nZGItaW5zdGFuY2Utb3V0cHV0LXNpbmsgaW5zdGFuY2UgJ2VtYWNzKSkKKworICAgICAodAorICAgICAgKHNldC1nZGItaW5zdGFuY2Utb3V0cHV0LXNpbmsgaW5zdGFuY2UgJ3VzZXIpCisgICAgICAoZXJyb3IgIk91dHB1dCBzaW5rIHBoYXNlIGVycm9yIDMuIikpKSkpCisKKzs7IEhhbmRsZSBhIGJ1cnN0IG9mIG91dHB1dCBmcm9tIGEgZ2RiIGluc3RhbmNlLgorOzsgVGhpcyBmdW5jdGlvbiBpcyAoaW5kaXJlY3RseSkgdXNlZCBhcyBhIGd1ZC1tYXJrZXItZmlsdGVyLgorOzsgSXQgbXVzdCByZXR1cm4gb3V0cHV0IChpZiBhbnkpIHRvIGJlIGluc3RlcnRlZCBpbiB0aGUgZ3VkIAorOzsgYnVmZmVyLgorCisoZGVmdW4gZ2RiLW91dHB1dC1idXJzdCAoaW5zdGFuY2Ugc3RyaW5nKQorICAiSGFuZGxlIGEgYnVyc3Qgb2Ygb3V0cHV0IGZyb20gYSBnZGIgaW5zdGFuY2UuCitUaGlzIGZ1bmN0aW9uIGlzIChpbmRpcmVjdGx5KSB1c2VkIGFzIGEgZ3VkLW1hcmtlci1maWx0ZXIuCitJdCBtdXN0IHJldHVybiBvdXRwdXQgKGlmIGFueSkgdG8gYmUgaW5zdGVydGVkIGluIHRoZSBndWQgCitidWZmZXIuIgorCisgIChzYXZlLW1hdGNoLWRhdGEKKyAgICAobGV0ICgKKwkgIDs7IFJlY2FsbCB0aGUgbGVmdCBvdmVyIGJ1cnN0IGZyb20gbGFzdCB0aW1lCisJICAoYnVyc3QgKGNvbmNhdCAoZ2RiLWluc3RhbmNlLWJ1cnN0IGluc3RhbmNlKSBzdHJpbmcpKQorCSAgOzsgU3RhcnQgYWNjdW11bGF0aW5nIG91dHB1dCBmb3IgdGhlIGd1ZCBidWZmZXIKKwkgIChvdXRwdXQgIiIpKQorCisgICAgICA7OyBQcm9jZXNzIGFsbCB0aGUgY29tcGxldGUgbWFya2VycyBpbiB0aGlzIGNodW5rLgorCisgICAgICAod2hpbGUgKHN0cmluZy1tYXRjaCAiXG5cMDMyXDAzMlxcKC4qXFwpXG4iIGJ1cnN0KQorCShsZXQgKChhbm5vdGF0aW9uIChzdWJzdHJpbmcgYnVyc3QKKwkJCQkgICAgIChtYXRjaC1iZWdpbm5pbmcgMSkKKwkJCQkgICAgIChtYXRjaC1lbmQgMSkpKSkKKwkgICAgCisJICA7OyBTdHVmZiBwcmlvciB0byB0aGUgbWF0Y2ggaXMganVzdCBvcmRpbmFyeSBvdXRwdXQuCisJICA7OyBJdCBpcyBlaXRoZXIgY29uY2F0ZW5hdGVkIHRvIE9VVFBVVCBvciBkaXJlY3RlZAorCSAgOzsgZWxzZXdoZXJlLgorCSAgKHNldHEgb3V0cHV0CisJCShnZGItY29uY2F0LW91dHB1dAorCQkgaW5zdGFuY2UKKwkJIG91dHB1dAorCQkgKHN1YnN0cmluZyBidXJzdCAwIChtYXRjaC1iZWdpbm5pbmcgMCkpKSkKKworCSAgOzsgVGFrZSB0aGF0IHN0dWZmIG9mZiB0aGUgYnVyc3QuCisJICAoc2V0cSBidXJzdCAoc3Vic3RyaW5nIGJ1cnN0IChtYXRjaC1lbmQgMCkpKQorCSAgICAKKwkgIDs7IFBhcnNlIHRoZSB0YWcgZnJvbSB0aGUgYW5ub3RhdGlvbiwgYW5kIG1heWJlIGl0cyBhcmd1bWVudHMuCisJICAoc3RyaW5nLW1hdGNoICJcXChcXFMtKlxcKSA/XFwoLipcXCkiIGFubm90YXRpb24pCisJICAobGV0KiAoKGFubm90YXRpb24tdHlwZSAoc3Vic3RyaW5nIGFubm90YXRpb24KKwkJCQkJICAgICAobWF0Y2gtYmVnaW5uaW5nIDEpCisJCQkJCSAgICAgKG1hdGNoLWVuZCAxKSkpCisJCSAoYW5ub3RhdGlvbi1hcmd1bWVudHMgKHN1YnN0cmluZyBhbm5vdGF0aW9uCisJCQkJCQkgIChtYXRjaC1iZWdpbm5pbmcgMikKKwkJCQkJCSAgKG1hdGNoLWVuZCAyKSkpCisJCSAoYW5ub3RhdGlvbi1ydWxlIChhc3NvYyBhbm5vdGF0aW9uLXR5cGUKKwkJCQkJIGdkYi1hbm5vdGF0aW9uLXJ1bGVzKSkpCisJICAgIDs7IENhbGwgdGhlIGhhbmRsZXIgZm9yIHRoaXMgYW5ub3RhdGlvbi4KKwkgICAgKGlmIGFubm90YXRpb24tcnVsZQorCQkoZnVuY2FsbCAoY2FyIChjZHIgYW5ub3RhdGlvbi1ydWxlKSkKKwkJCSBpbnN0YW5jZQorCQkJIGFubm90YXRpb24tYXJndW1lbnRzKQorCSAgICAgIDs7IEVsc2UgdGhlIGFubm90YXRpb24gaXMgbm90IHJlY29nbml6ZWQuICBJZ25vcmUgaXQgc2lsZW50bHksCisJICAgICAgOzsgc28gdGhhdCBHREIgY2FuIGFkZCBuZXcgYW5ub3RhdGlvbnMgd2l0aG91dCBjYXVzaW5nCisJICAgICAgOzsgdXMgdG8gYmxvdyB1cC4KKwkgICAgICApKSkpCisKKworICAgICAgOzsgRG9lcyB0aGUgcmVtYWluaW5nIHRleHQgZW5kIGluIGEgcGFydGlhbCBsaW5lPworICAgICAgOzsgSWYgaXQgZG9lcywgdGhlbiBrZWVwIHBhcnQgb2YgdGhlIGJ1cnN0IHVudGlsIHdlIGdldCBtb3JlLgorICAgICAgKGlmIChzdHJpbmctbWF0Y2ggIlxuXFwnXFx8XG5cMDMyXFwnXFx8XG5cMDMyXDAzMi4qXFwnIgorCQkJYnVyc3QpCisJICAocHJvZ24KKwkgICAgOzsgRXZlcnl0aGluZyBiZWZvcmUgdGhlIHBvdGVudGlhbCBtYXJrZXIgc3RhcnQgY2FuIGJlIG91dHB1dC4KKwkgICAgKHNldHEgb3V0cHV0CisJCSAgKGdkYi1jb25jYXQtb3V0cHV0CisJCSAgIGluc3RhbmNlCisJCSAgIG91dHB1dAorCQkgICAoc3Vic3RyaW5nIGJ1cnN0IDAgKG1hdGNoLWJlZ2lubmluZyAwKSkpKQorCisJICAgIDs7IEV2ZXJ5dGhpbmcgYWZ0ZXIsIHdlIHNhdmUsIHRvIGNvbWJpbmUgd2l0aCBsYXRlciBpbnB1dC4KKwkgICAgKHNldHEgYnVyc3QgKHN1YnN0cmluZyBidXJzdCAobWF0Y2gtYmVnaW5uaW5nIDApKSkpCisKKwk7OyBJbiBjYXNlIHdlIGtub3cgdGhlIGJ1cnN0IGNvbnRhaW5zIG5vIHBhcnRpYWwgYW5ub3RhdGlvbnM6CisJKHByb2duCisJICAoc2V0cSBvdXRwdXQgKGdkYi1jb25jYXQtb3V0cHV0IGluc3RhbmNlIG91dHB1dCBidXJzdCkpCisJICAoc2V0cSBidXJzdCAiIikpKQorCisgICAgICA7OyBTYXZlIHRoZSByZW1haW5pbmcgYnVyc3QgZm9yIHRoZSBuZXh0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICAgIChzZXQtZ2RiLWluc3RhbmNlLWJ1cnN0IGluc3RhbmNlIGJ1cnN0KQorICAgICAgb3V0cHV0KSkpCisKKyhkZWZ1biBnZGItY29uY2F0LW91dHB1dCAoaW5zdGFuY2Ugc28tZmFyIG5ldykKKyAgKGxldCAoKHNpbmsgKGdkYi1pbnN0YW5jZS1vdXRwdXQtc2luayBpbnN0YW5jZSkpKQorICAgIChjb25kCisgICAgICgoZXEgc2luayAndXNlcikgKGNvbmNhdCBzby1mYXIgbmV3KSkKKyAgICAgKChvciAoZXEgc2luayAncHJlLWVtYWNzKSAoZXEgc2luayAncG9zdC1lbWFjcykpIHNvLWZhcikKKyAgICAgKChlcSBzaW5rICdlbWFjcykKKyAgICAgIChnZGItYXBwZW5kLXRvLXBhcnRpYWwtb3V0cHV0IGluc3RhbmNlIG5ldykKKyAgICAgIHNvLWZhcikKKyAgICAgKChlcSBzaW5rICdpbmZlcmlvcikKKyAgICAgIChnZGItYXBwZW5kLXRvLWluZmVyaW9yLWlvIGluc3RhbmNlIG5ldykKKyAgICAgIHNvLWZhcikKKyAgICAgKHQgKGVycm9yICJCb2dvbiBvdXRwdXQgc2luayAlUyIgc2luaykpKSkpCisKKyhkZWZ1biBnZGItYXBwZW5kLXRvLXBhcnRpYWwtb3V0cHV0IChpbnN0YW5jZSBzdHJpbmcpCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIChzZXQtYnVmZmVyCisgICAgIChnZGItZ2V0LWNyZWF0ZS1pbnN0YW5jZS1idWZmZXIKKyAgICAgIGluc3RhbmNlICdnZGItcGFydGlhbC1vdXRwdXQtYnVmZmVyKSkKKyAgICAoZ290by1jaGFyIChwb2ludC1tYXgpKQorICAgIChpbnNlcnQgc3RyaW5nKSkpCisKKyhkZWZ1biBnZGItY2xlYXItcGFydGlhbC1vdXRwdXQgKGluc3RhbmNlKQorICAoc2F2ZS1leGN1cnNpb24KKyAgICAoc2V0LWJ1ZmZlcgorICAgICAoZ2RiLWdldC1jcmVhdGUtaW5zdGFuY2UtYnVmZmVyCisgICAgICBpbnN0YW5jZSAnZ2RiLXBhcnRpYWwtb3V0cHV0LWJ1ZmZlcikpCisgICAgKGRlbGV0ZS1yZWdpb24gKHBvaW50LW1pbikgKHBvaW50LW1heCkpKSkKKworKGRlZnVuIGdkYi1hcHBlbmQtdG8taW5mZXJpb3ItaW8gKGluc3RhbmNlIHN0cmluZykKKyAgKHNhdmUtZXhjdXJzaW9uCisgICAgKHNldC1idWZmZXIKKyAgICAgKGdkYi1nZXQtY3JlYXRlLWluc3RhbmNlLWJ1ZmZlcgorICAgICAgaW5zdGFuY2UgJ2dkYi1pbmZlcmlvci1pbykpCisgICAgKGdvdG8tY2hhciAocG9pbnQtbWF4KSkKKyAgICAoaW5zZXJ0LWJlZm9yZS1tYXJrZXJzIHN0cmluZykpCisgIChndWQtZGlzcGxheS1idWZmZXIKKyAgIChnZGItZ2V0LWNyZWF0ZS1pbnN0YW5jZS1idWZmZXIgaW5zdGFuY2UKKwkJCQkgICAnZ2RiLWluZmVyaW9yLWlvKSkpCisKKyhkZWZ1biBnZGItY2xlYXItaW5mZXJpb3ItaW8gKGluc3RhbmNlKQorICAoc2F2ZS1leGN1cnNpb24KKyAgICAoc2V0LWJ1ZmZlcgorICAgICAoZ2RiLWdldC1jcmVhdGUtaW5zdGFuY2UtYnVmZmVyCisgICAgICBpbnN0YW5jZSAnZ2RiLWluZmVyaW9yLWlvKSkKKyAgICAoZGVsZXRlLXJlZ2lvbiAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkpKQorDAorCisKKzs7IE9uZSB0cmljayBpcyB0byBoYXZlIGEgY29tbWFuZCB3aG8ncyBvdXRwdXQgaXMgYWx3YXlzIGF2YWlsYWJsZSBpbgorOzsgYSBidWZmZXIgb2YgaXQncyBvd24sIGFuZCBpcyBhbHdheXMgdXAgdG8gZGF0ZS4gIFdlIGJ1aWxkIHNldmVyYWwgCis7OyBidWZmZXJzIG9mIHRoaXMgdHlwZS4KKzs7Cis7OyBUaGVyZSBhcmUgdHdvIGFzcGVjdHMgdG8gdGhpczogZ2RiIGhhcyB0byB0ZWxsIHVzIHdoZW4gdGhlIG91dHB1dAorOzsgZm9yIHRoYXQgY29tbWFuZCBtaWdodCBoYXZlIGNoYW5nZWQsIGFuZCB3ZSBoYXZlIHRvIGJlIGFibGUgdG8gcnVuCis7OyB0aGUgY29tbWFuZCBiZWhpbmQgdGhlIHVzZXIncyBiYWNrLgorOzsKKzs7IFRoZSBpZGxlIGlucHV0IHF1ZXVlIGFuZCB0aGUgb3V0cHV0IHBoYXNpbmcgYXNzb2NpYXRlZCB3aXRoIAorOzsgdGhlIGluc3RhbmNlIHZhcmlhYmxlIGAoZ2RiLWluc3RhbmNlLW91dHB1dC1zaW5rIGluc3RhbmNlKScgaGVscAorOzsgdXMgdG8gcnVuIGNvbW1hbmRzIGJlaGluZCB0aGUgdXNlcidzIGJhY2suCis7OyAKKzs7IEJlbG93IGlzIHRoZSBjb2RlIGZvciBzcGVjaWZpY2x5IG1hbmFnaW5nIGJ1ZmZlcnMgb2Ygb3V0cHV0IGZyb20gb25lIAorOzsgY29tbWFuZC4KKzs7CisKKworOzsgVGhlIHRyaWdnZXIgZnVuY3Rpb24gaXMgc3VpdGFibGUgZm9yIHVzZSBpbiB0aGUgYXNzb2MgR0RCLUFOTk9UQVRJT04tUlVMRVMKKzs7IEl0IGFkZHMgYW4gaWRsZSBpbnB1dCBmb3IgdGhlIGNvbW1hbmQgd2UgYXJlIHRyYWNraW5nLiAgSXQgc2hvdWxkIGJlIHRoZQorOzsgYW5ub3RhdGlvbiBydWxlIGJpbmRpbmcgb2Ygd2hhdGV2ZXIgZ2RiIHNlbmRzIHRvIHRlbGwgdXMgdGhpcyBjb21tYW5kCis7OyBtaWdodCBoYXZlIGNoYW5nZWQgaXQncyBvdXRwdXQuCis7OworOzsgTkFNRSBpcyB0aGUgZnVjbnRpb24gbmFtZS4gIERFTUFORC1QUkVESUNBVEUgdGVzdHMgaWYgb3V0cHV0IGlzIHJlYWxseSBuZWVkZWQuCis7OyBHREItQ09NTUFORCBpcyBhIHN0cmluZyBvZiBzdWNoLiAgT1VUUFVULUhBTkRMRVIgaXMgdGhlIGZ1bmN0aW9uIGJvdW5kIHRvIHRoZQorOzsgaW5wdXQgaW4gdGhlIGlucHV0IHF1ZXVlIChzZWUgY29tbWVudCBhYm91dCBgYGdkYiBjb21tdW5pY2F0aW9ucycnIGFib3ZlKS4KKyhkZWZtYWNybyBkZWYtZ2RiLWF1dG8tdXBkYXRlLXRyaWdnZXIgKG5hbWUgZGVtYW5kLXByZWRpY2F0ZSBnZGItY29tbWFuZCBvdXRwdXQtaGFuZGxlcikKKyAgKGAKKyAgIChkZWZ1biAoLCBuYW1lKSAoaW5zdGFuY2UgJm9wdGlvbmFsIGlnbm9yZWQpCisgICAgIChpZiAoYW5kICgoLCBkZW1hbmQtcHJlZGljYXRlKSBpbnN0YW5jZSkKKwkgICAgICAobm90IChtZW1iZXIgJygsIG5hbWUpCisJCQkgICAoZ2RiLWluc3RhbmNlLXBlbmRpbmctdHJpZ2dlcnMgaW5zdGFuY2UpKSkpCisJIChwcm9nbgorCSAgIChnZGItaW5zdGFuY2UtZW5xdWV1ZS1pZGxlLWlucHV0CisJICAgIGluc3RhbmNlCisJICAgIChsaXN0ICgsIGdkYi1jb21tYW5kKSAnKCwgb3V0cHV0LWhhbmRsZXIpKSkKKwkgICAoc2V0LWdkYi1pbnN0YW5jZS1wZW5kaW5nLXRyaWdnZXJzCisJICAgIGluc3RhbmNlCisJICAgIChjb25zICcoLCBuYW1lKQorCQkgIChnZGItaW5zdGFuY2UtcGVuZGluZy10cmlnZ2VycyBpbnN0YW5jZSkpKSkpKSkpCisJCQorKGRlZm1hY3JvIGRlZi1nZGItYXV0by11cGRhdGUtaGFuZGxlciAobmFtZSB0cmlnZ2VyIGJ1Zi1rZXkpCisgIChgCisgICAoZGVmdW4gKCwgbmFtZSkgKCkKKyAgICAgKHNldC1nZGItaW5zdGFuY2UtcGVuZGluZy10cmlnZ2VycworICAgICAgaW5zdGFuY2UKKyAgICAgIChkZWxxICcoLCB0cmlnZ2VyKQorCSAgICAoZ2RiLWluc3RhbmNlLXBlbmRpbmctdHJpZ2dlcnMgaW5zdGFuY2UpKSkKKyAgICAgKGxldCAoKGJ1ZiAoZ2RiLWdldC1pbnN0YW5jZS1idWZmZXIgaW5zdGFuY2UKKwkJCQkJICAnKCwgYnVmLWtleSkpKSkKKyAgICAgICAoYW5kIGJ1ZgorCSAgICAoc2F2ZS1leGN1cnNpb24KKwkgICAgICAoc2V0LWJ1ZmZlciBidWYpCisJICAgICAgKGxldCAoKHAgKHBvaW50KSkKKwkJICAgIChidWZmZXItcmVhZC1vbmx5IG5pbCkpCisJCShkZWxldGUtcmVnaW9uIChwb2ludC1taW4pIChwb2ludC1tYXgpKQorCQkoaW5zZXJ0LWJ1ZmZlciAoZ2RiLWdldC1jcmVhdGUtaW5zdGFuY2UtYnVmZmVyCisJCQkJaW5zdGFuY2UKKwkJCQknZ2RiLXBhcnRpYWwtb3V0cHV0LWJ1ZmZlcikpCisJCShnb3RvLWNoYXIgcCkpKSkpKSkpCisKKyhkZWZtYWNybyBkZWYtZ2RiLWF1dG8tdXBkYXRlZC1idWZmZXIKKyAgKGJ1ZmZlci1rZXkgdHJpZ2dlci1uYW1lIGdkYi1jb21tYW5kIG91dHB1dC1oYW5kbGVyLW5hbWUpCisgIChgCisgICAocHJvZ24KKyAgICAgKGRlZi1nZGItYXV0by11cGRhdGUtdHJpZ2dlciAoLCB0cmlnZ2VyLW5hbWUpCisgICAgICAgOzsgVGhlIGRlbWFuZCBwcmVkaWNhdGU6CisgICAgICAgKGxhbWJkYSAoaW5zdGFuY2UpCisJIChnZGItZ2V0LWluc3RhbmNlLWJ1ZmZlciBpbnN0YW5jZSAnKCwgYnVmZmVyLWtleSkpKQorICAgICAgICgsIGdkYi1jb21tYW5kKQorICAgICAgICgsIG91dHB1dC1oYW5kbGVyLW5hbWUpKQorICAgICAoZGVmLWdkYi1hdXRvLXVwZGF0ZS1oYW5kbGVyICgsIG91dHB1dC1oYW5kbGVyLW5hbWUpCisgICAgICAgKCwgdHJpZ2dlci1uYW1lKSAoLCBidWZmZXIta2V5KSkpKSkKKworCisMCis7OworOzsgQnJlYWtwb2ludCBidWZmZXJzCis7OyAKKzs7IFRoZXNlIGRpc3BsYXkgdGhlIG91dHB1dCBvZiBgaW5mbyBicmVha3BvaW50cycuCis7OworCisgICAgICAgCisoZ2RiLXNldC1pbnN0YW5jZS1idWZmZXItcnVsZXMgJ2dkYi1icmVha3BvaW50cy1idWZmZXIKKwkJCSAgICAgICAnZ2RiLWJyZWFrcG9pbnRzLWJ1ZmZlci1uYW1lCisJCQkgICAgICAgJ2d1ZC1icmVha3BvaW50cy1tb2RlKQorCisoZGVmLWdkYi1hdXRvLXVwZGF0ZWQtYnVmZmVyIGdkYi1icmVha3BvaW50cy1idWZmZXIKKyAgOzsgVGhpcyBkZWZpbmVzIHRoZSBhdXRvIHVwZGF0ZSBydWxlIGZvciBidWZmZXJzIG9mIHR5cGUKKyAgOzsgYGdkYi1icmVha3BvaW50cy1idWZmZXInLgorICA7OworICA7OyBJdCBkZWZpbmVzIGEgZnVuY3Rpb24gdG8gc2VydmUgYXMgdGhlIGFubm90YXRpb24gaGFuZGxlciB0aGF0CisgIDs7IGhhbmRsZXMgdGhlIGBmb28taW52YWxpZGF0ZWQnIG1lc3NhZ2UuICBUaGF0IGZ1bmN0aW9uIGlzIGNhbGxlZDoKKyAgZ2RiLWludmFsaWRhdGUtYnJlYWtwb2ludHMKKworICA7OyBUbyB1cGRhdGUgdGhlIGJ1ZmZlciwgdGhpcyBjb21tYW5kIGlzIHNlbnQgdG8gZ2RiLgorICAic2VydmVyIGluZm8gYnJlYWtwb2ludHNcbiIKKworICA7OyBUaGlzIGFsc28gZGVmaW5lcyBhIGZ1bmN0aW9uIHRvIGJlIHRoZSBoYW5kbGVyIGZvciB0aGUgb3V0cHV0CisgIDs7IGZyb20gdGhlIGNvbW1hbmQgYWJvdmUuICBUaGF0IGZ1bmN0aW9uIHdpbGwgY29weSB0aGUgb3V0cHV0IGludG8KKyAgOzsgdGhlIGFwcHJvcHJpYXRlbHkgdHlwZWQgYnVmZmVyLiAgVGhhdCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZDoKKyAgZ2RiLWluZm8tYnJlYWtwb2ludHMtaGFuZGxlcikKKworKGRlZnVuIGdkYi1icmVha3BvaW50cy1idWZmZXItbmFtZSAoaW5zdGFuY2UpCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIChzZXQtYnVmZmVyIChwcm9jZXNzLWJ1ZmZlciAoZ2RiLWluc3RhbmNlLXByb2Nlc3MgaW5zdGFuY2UpKSkKKyAgICAoY29uY2F0ICIqYnJlYWtwb2ludHMgb2YgIiAoZ2RiLWluc3RhbmNlLXRhcmdldC1zdHJpbmcgaW5zdGFuY2UpICIqIikpKQorCisoZGVmdW4gZ3VkLWRpc3BsYXktYnJlYWtwb2ludHMtYnVmZmVyIChpbnN0YW5jZSkKKyAgKGludGVyYWN0aXZlIChsaXN0IChnZGItbmVlZGVkLWRlZmF1bHQtaW5zdGFuY2UpKSkKKyAgKGd1ZC1kaXNwbGF5LWJ1ZmZlcgorICAgKGdkYi1nZXQtY3JlYXRlLWluc3RhbmNlLWJ1ZmZlciBpbnN0YW5jZQorCQkJCSAgICAnZ2RiLWJyZWFrcG9pbnRzLWJ1ZmZlcikpKQorCisoZGVmdW4gZ3VkLWZyYW1lLWJyZWFrcG9pbnRzLWJ1ZmZlciAoaW5zdGFuY2UpCisgIChpbnRlcmFjdGl2ZSAobGlzdCAoZ2RiLW5lZWRlZC1kZWZhdWx0LWluc3RhbmNlKSkpCisgIChndWQtZnJhbWUtYnVmZmVyCisgICAoZ2RiLWdldC1jcmVhdGUtaW5zdGFuY2UtYnVmZmVyIGluc3RhbmNlCisJCQkJICAgICdnZGItYnJlYWtwb2ludHMtYnVmZmVyKSkpCisKKyhkZWZ2YXIgZ3VkLWJyZWFrcG9pbnRzLW1vZGUtbWFwIG5pbCkKKyhzZXRxIGd1ZC1icmVha3BvaW50cy1tb2RlLW1hcCAobWFrZS1rZXltYXApKQorKHN1cHByZXNzLWtleW1hcCBndWQtYnJlYWtwb2ludHMtbW9kZS1tYXApCisoZGVmaW5lLWtleSBndWQtYnJlYWtwb2ludHMtbW9kZS1tYXAgIiAiICdndWQtdG9nZ2xlLWJwLXRoaXMtbGluZSkKKyhkZWZpbmUta2V5IGd1ZC1icmVha3BvaW50cy1tb2RlLW1hcCAiZCIgJ2d1ZC1kZWxldGUtYnAtdGhpcy1saW5lKQorCisoZGVmdW4gZ3VkLWJyZWFrcG9pbnRzLW1vZGUgKCkKKyAgIk1ham9yIG1vZGUgZm9yIGd1ZCBicmVha3BvaW50cy4KKworXFx7Z3VkLWJyZWFrcG9pbnRzLW1vZGUtbWFwfSIKKyAgKHNldHEgbWFqb3ItbW9kZSAnZ3VkLWJyZWFrcG9pbnRzLW1vZGUpCisgIChzZXRxIG1vZGUtbmFtZSAiQnJlYWtwb2ludHMiKQorICAodXNlLWxvY2FsLW1hcCBndWQtYnJlYWtwb2ludHMtbW9kZS1tYXApCisgIChzZXRxIGJ1ZmZlci1yZWFkLW9ubHkgdCkKKyAgKGdkYi1pbnZhbGlkYXRlLWJyZWFrcG9pbnRzIGdkYi1idWZmZXItaW5zdGFuY2UpKQorCisoZGVmdW4gZ3VkLXRvZ2dsZS1icC10aGlzLWxpbmUgKCkKKyAgKGludGVyYWN0aXZlKQorICAoc2F2ZS1leGN1cnNpb24KKyAgICAoYmVnaW5uaW5nLW9mLWxpbmUgMSkKKyAgICAoaWYgKG5vdCAobG9va2luZy1hdCAiXFwoWzAtOV0qXFwpXFxzLSpcXFMtKlxccy0qXFxTLSpcXHMtKlxcKC5cXCkiKSkKKwkoZXJyb3IgIk5vdCByZWNvZ25pemVkIGFzIGJyZWFrcG9pbnQgbGluZSAoZGVtbyBmb28pLiIpCisgICAgICAoZ2RiLWluc3RhbmNlLWVucXVldWUtaWRsZS1pbnB1dAorICAgICAgIGdkYi1idWZmZXItaW5zdGFuY2UKKyAgICAgICAobGlzdAorCShjb25jYXQKKwkgKGlmIChlcSA/eSAoY2hhci1hZnRlciAobWF0Y2gtYmVnaW5uaW5nIDIpKSkKKwkgICAgICJzZXJ2ZXIgZGlzYWJsZSAiCisJICAgInNlcnZlciBlbmFibGUgIikKKwkgKGJ1ZmZlci1zdWJzdHJpbmcgKG1hdGNoLWJlZ2lubmluZyAwKQorCQkJICAgKG1hdGNoLWVuZCAxKSkKKwkgIlxuIikKKwknKGxhbWJkYSAoKSBuaWwpKSkKKyAgICAgICkpKQorCisoZGVmdW4gZ3VkLWRlbGV0ZS1icC10aGlzLWxpbmUgKCkKKyAgKGludGVyYWN0aXZlKQorICAoc2F2ZS1leGN1cnNpb24KKyAgICAoYmVnaW5uaW5nLW9mLWxpbmUgMSkKKyAgICAoaWYgKG5vdCAobG9va2luZy1hdCAiXFwoWzAtOV0qXFwpXFxzLSpcXFMtKlxccy0qXFxTLSpcXHMtKlxcKC5cXCkiKSkKKwkoZXJyb3IgIk5vdCByZWNvZ25pemVkIGFzIGJyZWFrcG9pbnQgbGluZSAoZGVtbyBmb28pLiIpCisgICAgICAoZ2RiLWluc3RhbmNlLWVucXVldWUtaWRsZS1pbnB1dAorICAgICAgIGdkYi1idWZmZXItaW5zdGFuY2UKKyAgICAgICAobGlzdAorCShjb25jYXQKKwkgInNlcnZlciBkZWxldGUgIgorCSAoYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDApCisJCQkgICAobWF0Y2gtZW5kIDEpKQorCSAiXG4iKQorCScobGFtYmRhICgpIG5pbCkpKQorICAgICAgKSkpCisKKworCisMCis7OworOzsgRnJhbWVzIGJ1ZmZlcnMuICBUaGVzZSBkaXNwbGF5IGEgcGVycGV0dWFsbHkgY29ycmVjdCBiYWN0cmFja3RyYWNlCis7OyAoZnJvbSB0aGUgY29tbWFuZCBgd2hlcmUnKS4KKzs7Cis7OyBBbGFzLCBpZiB5b3VyIHN0YWNrIGlzIGRlZXAsIHRoZXkgYXJlIGNvc3RseS4KKzs7CisKKyhnZGItc2V0LWluc3RhbmNlLWJ1ZmZlci1ydWxlcyAnZ2RiLXN0YWNrLWJ1ZmZlcgorCQkJICAgICAgICdnZGItc3RhY2stYnVmZmVyLW5hbWUKKwkJCSAgICAgICAnZ3VkLWZyYW1lcy1tb2RlKQorCisoZGVmLWdkYi1hdXRvLXVwZGF0ZWQtYnVmZmVyIGdkYi1zdGFjay1idWZmZXIKKyAgZ2RiLWludmFsaWRhdGUtZnJhbWVzCisgICJzZXJ2ZXIgd2hlcmVcbiIKKyAgZ2RiLWluZm8tZnJhbWVzLWhhbmRsZXIpCisKKyhkZWZ1biBnZGItc3RhY2stYnVmZmVyLW5hbWUgKGluc3RhbmNlKQorICAoc2F2ZS1leGN1cnNpb24KKyAgICAoc2V0LWJ1ZmZlciAocHJvY2Vzcy1idWZmZXIgKGdkYi1pbnN0YW5jZS1wcm9jZXNzIGluc3RhbmNlKSkpCisgICAgKGNvbmNhdCAiKnN0YWNrIGZyYW1lcyBvZiAiCisJICAgIChnZGItaW5zdGFuY2UtdGFyZ2V0LXN0cmluZyBpbnN0YW5jZSkgIioiKSkpCisKKyhkZWZ1biBndWQtZGlzcGxheS1zdGFjay1idWZmZXIgKGluc3RhbmNlKQorICAoaW50ZXJhY3RpdmUgKGxpc3QgKGdkYi1uZWVkZWQtZGVmYXVsdC1pbnN0YW5jZSkpKQorICAoZ3VkLWRpc3BsYXktYnVmZmVyCisgICAoZ2RiLWdldC1jcmVhdGUtaW5zdGFuY2UtYnVmZmVyIGluc3RhbmNlCisJCQkJICAgICdnZGItc3RhY2stYnVmZmVyKSkpCisKKyhkZWZ1biBndWQtZnJhbWUtc3RhY2stYnVmZmVyIChpbnN0YW5jZSkKKyAgKGludGVyYWN0aXZlIChsaXN0IChnZGItbmVlZGVkLWRlZmF1bHQtaW5zdGFuY2UpKSkKKyAgKGd1ZC1mcmFtZS1idWZmZXIKKyAgIChnZGItZ2V0LWNyZWF0ZS1pbnN0YW5jZS1idWZmZXIgaW5zdGFuY2UKKwkJCQkgICAgJ2dkYi1zdGFjay1idWZmZXIpKSkKKworKGRlZnZhciBndWQtZnJhbWVzLW1vZGUtbWFwIG5pbCkKKyhzZXRxIGd1ZC1mcmFtZXMtbW9kZS1tYXAgKG1ha2Uta2V5bWFwKSkKKyhzdXBwcmVzcy1rZXltYXAgZ3VkLWZyYW1lcy1tb2RlLW1hcCkKKyhkZWZpbmUta2V5IGd1ZC1mcmFtZXMtbW9kZS1tYXAgW21vdXNlLTJdCisgICdndWQtZnJhbWVzLXNlbGVjdC1ieS1tb3VzZSkKKworKGRlZnVuIGd1ZC1mcmFtZXMtbW9kZSAoKQorICAiTWFqb3IgbW9kZSBmb3IgZ3VkIGZyYW1lcy4KKworXFx7Z3VkLWZyYW1lcy1tb2RlLW1hcH0iCisgIChzZXRxIG1ham9yLW1vZGUgJ2d1ZC1mcmFtZXMtbW9kZSkKKyAgKHNldHEgbW9kZS1uYW1lICJGcmFtZXMiKQorICAoc2V0cSBidWZmZXItcmVhZC1vbmx5IHQpCisgICh1c2UtbG9jYWwtbWFwIGd1ZC1mcmFtZXMtbW9kZS1tYXApCisgIChnZGItaW52YWxpZGF0ZS1mcmFtZXMgZ2RiLWJ1ZmZlci1pbnN0YW5jZSkpCisKKyhkZWZ1biBndWQtZ2V0LWZyYW1lLW51bWJlciAoKQorICAoc2F2ZS1leGN1cnNpb24KKyAgICAobGV0KiAoKHBvcyAocmUtc2VhcmNoLWJhY2t3YXJkICJeI1xcKFswLTldKlxcKSIgbmlsIHQpKQorCSAgIChuIChvciAoYW5kIHBvcworCQkgICAgICAgKHN0cmluZy10by1pbnQKKwkJCShidWZmZXItc3Vic3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMSkKKwkJCQkJICAobWF0Y2gtZW5kIDEpKSkpCisJCSAgMCkpKQorICAgICAgbikpKQorCisoZGVmdW4gZ3VkLWZyYW1lcy1zZWxlY3QtYnktbW91c2UgKGUpCisgIChpbnRlcmFjdGl2ZSAiZSIpCisgIChsZXQgKHNlbGVjdGlvbikKKyAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgIChzZXQtYnVmZmVyICh3aW5kb3ctYnVmZmVyIChwb3NuLXdpbmRvdyAoZXZlbnQtZW5kIGUpKSkpCisgICAgICAoc2F2ZS1leGN1cnNpb24KKwkoZ290by1jaGFyIChwb3NuLXBvaW50IChldmVudC1lbmQgZSkpKQorCShzZXRxIHNlbGVjdGlvbiAoZ3VkLWdldC1mcmFtZS1udW1iZXIpKSkpCisgICAgKHNlbGVjdC13aW5kb3cgKHBvc24td2luZG93IChldmVudC1lbmQgZSkpKQorICAgIChzYXZlLWV4Y3Vyc2lvbgorICAgICAgKHNldC1idWZmZXIgKGdkYi1nZXQtaW5zdGFuY2UtYnVmZmVyIChnZGItbmVlZGVkLWRlZmF1bHQtaW5zdGFuY2UpICdndWQpKQorICAgICAgKGd1ZC1jYWxsICJmciAlcCIgc2VsZWN0aW9uKQorICAgICAgKGd1ZC1kaXNwbGF5LWZyYW1lKSkpKQorCisMCis7OworOzsgUmVnaXN0ZXJzIGJ1ZmZlcnMKKzs7CisKKyhkZWYtZ2RiLWF1dG8tdXBkYXRlZC1idWZmZXIgZ2RiLXJlZ2lzdGVycy1idWZmZXIKKyAgZ2RiLWludmFsaWRhdGUtcmVnaXN0ZXJzCisgICJzZXJ2ZXIgaW5mbyByZWdpc3RlcnNcbiIKKyAgZ2RiLWluZm8tcmVnaXN0ZXJzLWhhbmRsZXIpCisKKyhnZGItc2V0LWluc3RhbmNlLWJ1ZmZlci1ydWxlcyAnZ2RiLXJlZ2lzdGVycy1idWZmZXIKKwkJCSAgICAgICAnZ2RiLXJlZ2lzdGVycy1idWZmZXItbmFtZQorCQkJICAgICAgICdndWQtcmVnaXN0ZXJzLW1vZGUpCisKKyhkZWZ2YXIgZ3VkLXJlZ2lzdGVycy1tb2RlLW1hcCBuaWwpCisoc2V0cSBndWQtcmVnaXN0ZXJzLW1vZGUtbWFwIChtYWtlLWtleW1hcCkpCisoc3VwcHJlc3Mta2V5bWFwIGd1ZC1yZWdpc3RlcnMtbW9kZS1tYXApCisKKyhkZWZ1biBndWQtcmVnaXN0ZXJzLW1vZGUgKCkKKyAgIk1ham9yIG1vZGUgZm9yIGd1ZCByZWdpc3RlcnMuCisKK1xce2d1ZC1yZWdpc3RlcnMtbW9kZS1tYXB9IgorICAoc2V0cSBtYWpvci1tb2RlICdndWQtcmVnaXN0ZXJzLW1vZGUpCisgIChzZXRxIG1vZGUtbmFtZSAiUmVnaXN0ZXJzIikKKyAgKHNldHEgYnVmZmVyLXJlYWQtb25seSB0KQorICAodXNlLWxvY2FsLW1hcCBndWQtcmVnaXN0ZXJzLW1vZGUtbWFwKQorICAoZ2RiLWludmFsaWRhdGUtcmVnaXN0ZXJzIGdkYi1idWZmZXItaW5zdGFuY2UpKQorCisoZGVmdW4gZ2RiLXJlZ2lzdGVycy1idWZmZXItbmFtZSAoaW5zdGFuY2UpCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIChzZXQtYnVmZmVyIChwcm9jZXNzLWJ1ZmZlciAoZ2RiLWluc3RhbmNlLXByb2Nlc3MgaW5zdGFuY2UpKSkKKyAgICAoY29uY2F0ICIqcmVnaXN0ZXJzIG9mICIgKGdkYi1pbnN0YW5jZS10YXJnZXQtc3RyaW5nIGluc3RhbmNlKSAiKiIpKSkKKworKGRlZnVuIGd1ZC1kaXNwbGF5LXJlZ2lzdGVycy1idWZmZXIgKGluc3RhbmNlKQorICAoaW50ZXJhY3RpdmUgKGxpc3QgKGdkYi1uZWVkZWQtZGVmYXVsdC1pbnN0YW5jZSkpKQorICAoZ3VkLWRpc3BsYXktYnVmZmVyCisgICAoZ2RiLWdldC1jcmVhdGUtaW5zdGFuY2UtYnVmZmVyIGluc3RhbmNlCisJCQkJICAgICdnZGItcmVnaXN0ZXJzLWJ1ZmZlcikpKQorCisoZGVmdW4gZ3VkLWZyYW1lLXJlZ2lzdGVycy1idWZmZXIgKGluc3RhbmNlKQorICAoaW50ZXJhY3RpdmUgKGxpc3QgKGdkYi1uZWVkZWQtZGVmYXVsdC1pbnN0YW5jZSkpKQorICAoZ3VkLWZyYW1lLWJ1ZmZlcgorICAgKGdkYi1nZXQtY3JlYXRlLWluc3RhbmNlLWJ1ZmZlciBpbnN0YW5jZQorCQkJCSAgICAnZ2RiLXJlZ2lzdGVycy1idWZmZXIpKSkKKworDAorCis7Ozs7IE1lbnUgd2luZG93czoKKworCis7OyBNRU5VLUxJU1QgaXMgKChvcHRpb24gb3B0aW9uIG9wdGlvbi4uLikgKG9wdGlvbiBvcHRpb24gLi4uKS4uLikKKzs7IAorKGRlZnVuIGd1ZC1kaXNwbGF5LW1lbnUgKG1lbnUtbGlzdCkKKyAgKHNldHEgZmlsbC1jb2x1bW4gKG1pbiAxMjAgKC0gKHdpbmRvdy13aWR0aCkKKwkJCQkobWluIDggKHdpbmRvdy13aWR0aCkpKSkpCisgICh3aGlsZSBtZW51LWxpc3QKKyAgICAobWFwY2FyIChmdW5jdGlvbiAobGFtYmRhICh4KSAoaW5zZXJ0IChzeW1ib2wtbmFtZSB4KSAiICIpKSkgKGNhciBtZW51LWxpc3QpKQorICAgIChmaWxsLXBhcmFncmFwaCBuaWwpCisgICAgKGluc2VydCAiXG5cbiIpCisgICAgKHNldHEgbWVudS1saXN0IChjZHIgbWVudS1saXN0KSkpCisgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICh3aGlsZSAocmUtc2VhcmNoLWZvcndhcmQgIlxcKFteIFxuXStcXClcXChcblxcfCBcXCkiIG5pbCB0KQorICAgIChwdXQtdGV4dC1wcm9wZXJ0eSAobWF0Y2gtYmVnaW5uaW5nIDEpIChtYXRjaC1lbmQgMSkKKwkJICAgICAgICdtb3VzZS1mYWNlICdoaWdobGlnaHQpKQorICAoZ290by1jaGFyIChwb2ludC1taW4pKSkKKworKGRlZnVuIGd1ZC1nb3RvLW1lbnUgKG1lbnUpCisgIChzZXRxIGd1ZC1tZW51LXBvc2l0aW9uIG1lbnUpCisgIChsZXQgKChidWZmZXItcmVhZC1vbmx5IG5pbCkpCisgICAgKGRlbGV0ZS1yZWdpb24gKHBvaW50LW1pbikgKHBvaW50LW1heCkpCisgICAgKGd1ZC1kaXNwbGF5LW1lbnUgbWVudSkpKQorCisoZGVmdW4gZ3VkLW1lbnUtcGljayAoZXZlbnQpCisgICJDaG9vc2UgYW4gaXRlbSBmcm9tIGEgZ2RiIGNvbW1hbmQgbWVudS4iCisgIChpbnRlcmFjdGl2ZSAiZSIpCisgIChsZXQgKGNob2ljZSkKKyAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgIChzZXQtYnVmZmVyICh3aW5kb3ctYnVmZmVyIChwb3NuLXdpbmRvdyAoZXZlbnQtc3RhcnQgZXZlbnQpKSkpCisgICAgICAoZ290by1jaGFyIChwb3NuLXBvaW50IChldmVudC1zdGFydCBldmVudCkpKQorICAgICAgKGxldCAoYmVnIGVuZCkKKwkoc2tpcC1jaGFycy1mb3J3YXJkICJeIFx0XG4iKQorCShzZXRxIGVuZCAocG9pbnQpKQorCShza2lwLWNoYXJzLWJhY2t3YXJkICJeIFx0XG4iKQorCShzZXRxIGJlZyAocG9pbnQpKQorCShzZXRxIGNob2ljZSAoYnVmZmVyLXN1YnN0cmluZyBiZWcgZW5kKSkKKwkobWVzc2FnZSBjaG9pY2UpCisJKGd1ZC1pbnZva2UtbWVudSAoaW50ZXJuIGNob2ljZSkpKSkpKQorCisoZGVmdW4gZ3VkLWludm9rZS1tZW51IChzeW1ib2wpCisgIChsZXQgKChtZWFuaW5nIChhc3NvYyBzeW1ib2wgZ3VkLW1lbnUtcnVsZXMpKSkKKyAgICAoY29uZAorICAgICAoKGFuZCAoY29uc3AgbWVhbmluZykKKwkgICAoY29uc3AgKGNhciAoY2RyIG1lYW5pbmcpKSkpCisgICAgICAoZ3VkLWdvdG8tbWVudSAoY2FyIChjZHIgbWVhbmluZykpKSkKKyAgICAgKG1lYW5pbmcgKGNhbGwtaW50ZXJhY3RpdmVseSAoY2FyIChjZHIgbWVhbmluZykpKSkpKSkKKworDAorCisoZ2RiLXNldC1pbnN0YW5jZS1idWZmZXItcnVsZXMgJ2dkYi1jb21tYW5kLWJ1ZmZlcgorCQkJICAgICAgICdnZGItY29tbWFuZC1idWZmZXItbmFtZQorCQkJICAgICAgICdndWQtY29tbWFuZC1tb2RlKQorCisoZGVmdmFyIGd1ZC1jb21tYW5kLW1vZGUtbWFwIG5pbCkKKyhzZXRxIGd1ZC1jb21tYW5kLW1vZGUtbWFwIChtYWtlLWtleW1hcCkpCisoc3VwcHJlc3Mta2V5bWFwIGd1ZC1jb21tYW5kLW1vZGUtbWFwKQorKGRlZmluZS1rZXkgZ3VkLWNvbW1hbmQtbW9kZS1tYXAgW21vdXNlLTJdICdndWQtbWVudS1waWNrKQorCisoZGVmdW4gZ3VkLWNvbW1hbmQtbW9kZSAoKQorICAiTWFqb3IgbW9kZSBmb3IgZ3VkIG1lbnUuCisKK1xce2d1ZC1jb21tYW5kLW1vZGUtbWFwfSIgKGludGVyYWN0aXZlKSAoc2V0cSBtYWpvci1tb2RlICdndWQtY29tbWFuZC1tb2RlKQorICAoc2V0cSBtb2RlLW5hbWUgIk1lbnUiKSAoc2V0cSBidWZmZXItcmVhZC1vbmx5IHQpICh1c2UtbG9jYWwtbWFwCisgIGd1ZC1jb21tYW5kLW1vZGUtbWFwKSAobWFrZS12YXJpYWJsZS1idWZmZXItbG9jYWwgJ2d1ZC1tZW51LXBvc2l0aW9uKQorICAoaWYgKG5vdCBndWQtbWVudS1wb3NpdGlvbikgKGd1ZC1nb3RvLW1lbnUgZ3VkLXJ1bm5pbmctbWVudSkpKQorCisoZGVmdW4gZ2RiLWNvbW1hbmQtYnVmZmVyLW5hbWUgKGluc3RhbmNlKQorICAoc2F2ZS1leGN1cnNpb24KKyAgICAoc2V0LWJ1ZmZlciAocHJvY2Vzcy1idWZmZXIgKGdkYi1pbnN0YW5jZS1wcm9jZXNzIGluc3RhbmNlKSkpCisgICAgKGNvbmNhdCAiKm1lbnUgb2YgIiAoZ2RiLWluc3RhbmNlLXRhcmdldC1zdHJpbmcgaW5zdGFuY2UpICIqIikpKQorCisoZGVmdW4gZ3VkLWRpc3BsYXktY29tbWFuZC1idWZmZXIgKGluc3RhbmNlKQorICAoaW50ZXJhY3RpdmUgKGxpc3QgKGdkYi1uZWVkZWQtZGVmYXVsdC1pbnN0YW5jZSkpKQorICAoZ3VkLWRpc3BsYXktYnVmZmVyCisgICAoZ2RiLWdldC1jcmVhdGUtaW5zdGFuY2UtYnVmZmVyIGluc3RhbmNlCisJCQkJICAgJ2dkYi1jb21tYW5kLWJ1ZmZlcikKKyAgIDYpKQorCisoZGVmdW4gZ3VkLWZyYW1lLWNvbW1hbmQtYnVmZmVyIChpbnN0YW5jZSkKKyAgKGludGVyYWN0aXZlIChsaXN0IChnZGItbmVlZGVkLWRlZmF1bHQtaW5zdGFuY2UpKSkKKyAgKGd1ZC1mcmFtZS1idWZmZXIKKyAgIChnZGItZ2V0LWNyZWF0ZS1pbnN0YW5jZS1idWZmZXIgaW5zdGFuY2UKKwkJCQkgICAgJ2dkYi1jb21tYW5kLWJ1ZmZlcikpKQorCisoZGVmdmFyIGd1ZC1zZWxlY3RlZC1tZW51LXRpdGxlcyAoKSkKKyhzZXRxIGd1ZC1zZWxlY3RlZC1tZW51LXRpdGxlcyAKKyAgICAgICcoUlVOTklORyBTVEFDSyBEQVRBIEJSRUFLUE9JTlRTIEZJTEVTKSkgIAorCisoc2V0cSBndWQtcnVubmluZy1tZW51CisgIChsaXN0CisgICAnKFJVTk5JTkcgc3RhY2sgYnJlYWtwb2ludHMgZmlsZXMpCisgICAnKHRhcmdldCBydW4gbmV4dCBzdGVwIGNvbnRpbnVlIGZpbmlzaCBzdGVwaSBraWxsIGhlbHAtcnVubmluZykpKQorICAKKyhzZXRxIGd1ZC1zdGFjay1tZW51CisgIChsaXN0CisgICAnKHJ1bm5pbmcgU1RBQ0sgYnJlYWtwb2ludHMgZmlsZXMpCisgICAnKHVwIGRvd24gZnJhbWUgYmFja3RyYWNlIHJldHVybiBoZWxwLXN0YWNrKSkpCisgIAorKHNldHEgZ3VkLWRhdGEtbWVudQorICAobGlzdAorICAgJyhydW5uaW5nIHN0YWNrIERBVEEgYnJlYWtwb2ludHMgZmlsZXMpCisgICAnKHdoYXRpcyBwdHlwZSBwcmludCBzZXQgZGlzcGxheSB1bmRpc3BsYXkgZGlzYXNzZW1ibGUgaGVscC1kYXRhKSkpCisKKyhzZXRxIGd1ZC1icmVha3BvaW50cy1tZW51CisgIChsaXN0CisgICAnKHJ1bm5pbmcgc3RhY2sgQlJFQUtQT0lOVFMgZmlsZXMpCisgICAnKGF3YXRjaCByd2F0Y2ggd2F0Y2ggYnJlYWsgZGVsZXRlIGVuYWJsZSBkaXNhYmxlIGNvbmRpdGlvbiBpZ25vcmUgaGVscC1icmVha3BvaW50cykpKQorICAKKyhzZXRxIGd1ZC1maWxlcy1tZW51CisgIChsaXN0CisgICAnKHJ1bm5pbmcgc3RhY2sgYnJlYWtwb2ludHMgRklMRVMpCisgICAnKGZpbGUgY29yZS1maWxlIGhlbHAtZmlsZXMpCisgICAnKGV4ZWMtZmlsZSBsb2FkIHN5bWJvbC1maWxlIGFkZC1zeW1ib2wtZmlsZSBzaGFyZWRsaWJyYXJ5KSkpCisKKyhzZXRxIGd1ZC1tZW51LXJ1bGVzCisgICAgICAobGlzdAorICAgICAgIChsaXN0ICdydW5uaW5nIGd1ZC1ydW5uaW5nLW1lbnUpCisgICAgICAgKGxpc3QgJ1JVTk5JTkcgZ3VkLXJ1bm5pbmctbWVudSkKKyAgICAgICAobGlzdCAnc3RhY2sgZ3VkLXN0YWNrLW1lbnUpCisgICAgICAgKGxpc3QgJ1NUQUNLIGd1ZC1zdGFjay1tZW51KQorICAgICAgIChsaXN0ICdkYXRhIGd1ZC1kYXRhLW1lbnUpCisgICAgICAgKGxpc3QgJ0RBVEEgZ3VkLWRhdGEtbWVudSkKKyAgICAgICAobGlzdCAnYnJlYWtwb2ludHMgZ3VkLWJyZWFrcG9pbnRzLW1lbnUpCisgICAgICAgKGxpc3QgJ0JSRUFLUE9JTlRTIGd1ZC1icmVha3BvaW50cy1tZW51KQorICAgICAgIChsaXN0ICdmaWxlcyBndWQtZmlsZXMtbWVudSkKKyAgICAgICAobGlzdCAnRklMRVMgZ3VkLWZpbGVzLW1lbnUpCisKKyAgICAgICAobGlzdCAndGFyZ2V0ICdndWQtdGFyZ2V0KQorICAgICAgIChsaXN0ICdraWxsICdndWQta2lsbCkKKyAgICAgICAobGlzdCAnc3RlcGkgJ2d1ZC1zdGVwaSkKKyAgICAgICAobGlzdCAnc3RlcCAnZ3VkLXN0ZXApCisgICAgICAgKGxpc3QgJ25leHQgJ2d1ZC1uZXh0KQorICAgICAgIChsaXN0ICdmaW5pc2ggJ2d1ZC1maW5pc2gpCisgICAgICAgKGxpc3QgJ2NvbnRpbnVlICdndWQtY29udCkKKyAgICAgICAobGlzdCAncnVuICdndWQtcnVuKQorCisgICAgICAgKGxpc3QgJ2JhY2t0cmFjZSAnZ3VkLWJhY2t0cmFjZSkKKyAgICAgICAobGlzdCAnZnJhbWUgJ2d1ZC1mcmFtZSkKKyAgICAgICAobGlzdCAnZG93biAnZ3VkLWRvd24pCisgICAgICAgKGxpc3QgJ3VwICdndWQtdXApCisgICAgICAgKGxpc3QgJ3JldHVybiAnZ3VkLXJldHVybikKKworICAgICAgIChsaXN0ICdmaWxlICdndWQtZmlsZSkKKyAgICAgICAobGlzdCAnY29yZS1maWxlICdndWQtY29yZS1maWxlKQorICAgICAgIChsaXN0ICdjZCAnZ3VkLWNkKQorCisgICAgICAgKGxpc3QgJ2V4ZWMtZmlsZSAnZ3VkLWV4ZWMtZmlsZSkKKyAgICAgICAobGlzdCAnbG9hZCAnZ3VkLWxvYWQpCisgICAgICAgKGxpc3QgJ3N5bWJvbC1maWxlICdndWQtc3ltYm9sLWZpbGUpCisgICAgICAgKGxpc3QgJ2FkZC1zeW1ib2wtZmlsZSAnZ3VkLWFkZC1zeW1ib2wtZmlsZSkKKyAgICAgICAobGlzdCAnc2hhcmVkbGlicmFyeSAnZ3VkLXNoYXJlZGxpYnJhcnkpCisgICAgICAgKSkKKyAgICAgICAKKworDAorCisoZGVmdW4gZ2RiLWNhbGwtc2hvd2luZy1ndWQgKGluc3RhbmNlIGNvbW1hbmQpCisgIChndWQtZGlzcGxheS1ndWQtYnVmZmVyIGluc3RhbmNlKQorICAoY29taW50LWlucHV0LXNlbmRlciAoZ2RiLWluc3RhbmNlLXByb2Nlc3MgaW5zdGFuY2UpIGNvbW1hbmQpKQorCisoZGVmdmFyIGd1ZC10YXJnZXQtaGlzdG9yeSAoKSkKKworKGRlZnVuIGd1ZC10ZW1wLWJ1ZmZlci1zaG93IChidWYpCisgIChsZXQgKChvdyAoc2VsZWN0ZWQtd2luZG93KSkpCisgICAgKHVud2luZC1wcm90ZWN0CisJKHByb2duCisJICAocG9wLXRvLWJ1ZmZlciBidWYpCisKKwkgIDs7IFRoaXMgaW5zZXJ0aW9uIHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiBlbWFjcy4KKwkgIDs7IFRoZSBidWcgaXMgdGhhdCBhbGwgdGhlIGVtcHR5IHNwYWNlIGFmdGVyIGEKKwkgIDs7IGhpZ2hsaWdodGVkIHdvcmQgdGhhdCB0ZXJtaW5hdGVzIGEgYnVmZmVyCisJICA7OyBnZXRzIGhpZ2hsaWdodGVkLiAgVGhhdCdzIHJlYWxseSB1Z2x5LCBzbworCSAgOzsgbWFrZSBzdXJlIGEgaGlnaGxpZ2h0ZWQgd29yZCBjYW4ndCBldmVyCisJICA7OyB0ZXJtaW5hdGUgdGhlIGJ1ZmZlci4KKwkgIChnb3RvLWNoYXIgKHBvaW50LW1heCkpCisJICAoaW5zZXJ0ICJcbiIpCisJICAoZ290by1jaGFyIChwb2ludC1taW4pKQorCisJICAoaWYgKDwgKHdpbmRvdy1oZWlnaHQpIDEwKQorCSAgICAgIChlbmxhcmdlLXdpbmRvdyAoLSAxMCAod2luZG93LWhlaWdodCkpKSkpCisgICAgICAoc2VsZWN0LXdpbmRvdyBvdykpKSkKKworKGRlZnVuIGd1ZC10YXJnZXQgKGluc3RhbmNlIGNvbW1hbmQpCisgIChpbnRlcmFjdGl2ZSAKKyAgIChsZXQqICgoaW5zdGFuY2UgKGdkYi1uZWVkZWQtZGVmYXVsdC1pbnN0YW5jZSkpCisJICAodGVtcC1idWZmZXItc2hvdy1mdW5jdGlvbiAoZnVuY3Rpb24gZ3VkLXRlbXAtYnVmZmVyLXNob3cpKQorCSAgKHRhcmdldC1uYW1lIChjb21wbGV0aW5nLXJlYWQgKGZvcm1hdCAiVGFyZ2V0IHR5cGU6ICIpCisJCQkJCScoKCJyZW1vdGUiKQorCQkJCQkgICgiY29yZSIpCisJCQkJCSAgKCJjaGlsZCIpCisJCQkJCSAgKCJleGVjIikpCisJCQkJCW5pbAorCQkJCQl0CisJCQkJCW5pbAorCQkJCQknZ3VkLXRhcmdldC1oaXN0b3J5KSkpCisgICAgIChsaXN0IGluc3RhbmNlCisJICAgKGNvbmQKKwkgICAgKChlcXVhbCB0YXJnZXQtbmFtZSAiY2hpbGQiKSAicnVuIikKKworCSAgICAoKGVxdWFsIHRhcmdldC1uYW1lICJjb3JlIikKKwkgICAgIChjb25jYXQgInRhcmdldCBjb3JlICIKKwkJICAgICAocmVhZC1maWxlLW5hbWUgImNvcmUgZmlsZTogIgorCQkJCSAgICAgbmlsCisJCQkJICAgICAiY29yZSIKKwkJCQkgICAgIHQpKSkKKworCSAgICAoKGVxdWFsIHRhcmdldC1uYW1lICJleGVjIikKKwkgICAgIChjb25jYXQgInRhcmdldCBleGVjICIKKwkJICAgICAocmVhZC1maWxlLW5hbWUgImV4ZWMgZmlsZTogIgorCQkJCSAgICAgbmlsCisJCQkJICAgICAiYS5vdXQiCisJCQkJICAgICB0KSkpCisKKwkgICAgKChlcXVhbCB0YXJnZXQtbmFtZSAicmVtb3RlIikKKwkgICAgIChjb25jYXQgInRhcmdldCByZW1vdGUgIgorCQkgICAgIChyZWFkLWZpbGUtbmFtZSAic2VyaWFsIGxpbmUgZm9yIHJlbW90ZTogIgorCQkJCSAgICAgIi9kZXYvIgorCQkJCSAgICAgInR0eWEiCisJCQkJICAgICB0KSkpCisKKwkgICAgKHQgImVjaG8gTm8gc3VjaCB0YXJnZXQgY29tbWFuZCEiKSkpKSkKKworICAoZ3VkLWRpc3BsYXktZ3VkLWJ1ZmZlciBpbnN0YW5jZSkKKyAgKGFwcGx5IGNvbWludC1pbnB1dC1zZW5kZXIKKwkgKGxpc3QgKGdkYi1pbnN0YW5jZS1wcm9jZXNzIGluc3RhbmNlKSBjb21tYW5kKSkpCisKKyhkZWZ1biBndWQtYmFja3RyYWNlICgpCisgIChpbnRlcmFjdGl2ZSkKKyAgKGxldCAoKGluc3RhbmNlICAoZ2RiLW5lZWRlZC1kZWZhdWx0LWluc3RhbmNlKSkpCisgICAgKGd1ZC1kaXNwbGF5LWd1ZC1idWZmZXIgaW5zdGFuY2UpCisgICAgKGFwcGx5IGNvbWludC1pbnB1dC1zZW5kZXIKKwkgICAobGlzdCAoZ2RiLWluc3RhbmNlLXByb2Nlc3MgaW5zdGFuY2UpCisJCSAiYmFja3RyYWNlIikpKSkKKworKGRlZnVuIGd1ZC1mcmFtZSAoKQorICAoaW50ZXJhY3RpdmUpCisgIChsZXQgKChpbnN0YW5jZSAgKGdkYi1uZWVkZWQtZGVmYXVsdC1pbnN0YW5jZSkpKQorICAgIChhcHBseSBjb21pbnQtaW5wdXQtc2VuZGVyCisJICAgKGxpc3QgKGdkYi1pbnN0YW5jZS1wcm9jZXNzIGluc3RhbmNlKQorCQkgImZyYW1lIikpKSkKKworKGRlZnVuIGd1ZC1yZXR1cm4gKGluc3RhbmNlIGNvbW1hbmQpCisgICAoaW50ZXJhY3RpdmUKKyAgICAobGV0ICgodGVtcC1idWZmZXItc2hvdy1mdW5jdGlvbiAoZnVuY3Rpb24gZ3VkLXRlbXAtYnVmZmVyLXNob3cpKSkKKyAgICAgIChsaXN0IChnZGItbmVlZGVkLWRlZmF1bHQtaW5zdGFuY2UpCisJICAgIChjb25jYXQgInJldHVybiAiIChyZWFkLXN0cmluZyAiRXhwcmVzc2lvbiB0byByZXR1cm46ICIpKSkpKQorICAgKGd1ZC1kaXNwbGF5LWd1ZC1idWZmZXIgaW5zdGFuY2UpCisgICAoYXBwbHkgY29taW50LWlucHV0LXNlbmRlcgorCSAgKGxpc3QgKGdkYi1pbnN0YW5jZS1wcm9jZXNzIGluc3RhbmNlKSBjb21tYW5kKSkpCisKKworKGRlZnVuIGd1ZC1maWxlIChpbnN0YW5jZSBjb21tYW5kKQorICAoaW50ZXJhY3RpdmUKKyAgIChsZXQgKCh0ZW1wLWJ1ZmZlci1zaG93LWZ1bmN0aW9uIChmdW5jdGlvbiBndWQtdGVtcC1idWZmZXItc2hvdykpKQorICAgICAobGlzdCAoZ2RiLW5lZWRlZC1kZWZhdWx0LWluc3RhbmNlKQorCSAgIChjb25jYXQgImZpbGUgIiAocmVhZC1maWxlLW5hbWUgIkV4ZWN1dGFibGUgdG8gZGVidWc6ICIKKwkJCQkJICAgbmlsCisJCQkJCSAgICJhLm91dCIKKwkJCQkJICAgdCkpKSkpCisgIChndWQtZGlzcGxheS1ndWQtYnVmZmVyIGluc3RhbmNlKQorICAoYXBwbHkgY29taW50LWlucHV0LXNlbmRlcgorCSAobGlzdCAoZ2RiLWluc3RhbmNlLXByb2Nlc3MgaW5zdGFuY2UpIGNvbW1hbmQpKSkKKworKGRlZnVuIGd1ZC1jb3JlLWZpbGUgKGluc3RhbmNlIGNvbW1hbmQpCisgIChpbnRlcmFjdGl2ZQorICAgKGxldCAoKHRlbXAtYnVmZmVyLXNob3ctZnVuY3Rpb24gKGZ1bmN0aW9uIGd1ZC10ZW1wLWJ1ZmZlci1zaG93KSkpCisgICAgIChsaXN0IChnZGItbmVlZGVkLWRlZmF1bHQtaW5zdGFuY2UpCisJICAgKGNvbmNhdCAiY29yZSAiIChyZWFkLWZpbGUtbmFtZSAiQ29yZSBmaWxlIHRvIGRlYnVnOiAiCisJCQkJCSAgIG5pbAorCQkJCQkgICAiY29yZS1maWxlIgorCQkJCQkgICB0KSkpKSkKKyAgKGd1ZC1kaXNwbGF5LWd1ZC1idWZmZXIgaW5zdGFuY2UpCisgIChhcHBseSBjb21pbnQtaW5wdXQtc2VuZGVyCisJIChsaXN0IChnZGItaW5zdGFuY2UtcHJvY2VzcyBpbnN0YW5jZSkgY29tbWFuZCkpKQorCisoZGVmdW4gZ3VkLWNkIChkaXIpCisgIChpbnRlcmFjdGl2ZSAiRkNoYW5nZSBHREIncyBkZWZhdWx0IGRpcmVjdG9yeTogIikKKyAgKGxldCAoKGluc3RhbmNlIChnZGItbmVlZGVkLWRlZmF1bHQtaW5zdGFuY2UpKSkKKyAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgIChzZXQtYnVmZmVyIChnZGItZ2V0LWluc3RhbmNlLWJ1ZmZlciBpbnN0YW5jZSAnZ3VkKSkKKyAgICAgIChjZCBkaXIpKQorICAgIChndWQtZGlzcGxheS1ndWQtYnVmZmVyIGluc3RhbmNlKQorICAgIChhcHBseSBjb21pbnQtaW5wdXQtc2VuZGVyCisJICAgKGxpc3QgKGdkYi1pbnN0YW5jZS1wcm9jZXNzIGluc3RhbmNlKQorCQkgKGNvbmNhdCAiY2QgIiBkaXIpKSkpKQorCisKKyhkZWZ1biBndWQtZXhlYy1maWxlIChpbnN0YW5jZSBjb21tYW5kKQorICAoaW50ZXJhY3RpdmUKKyAgIChsZXQgKCh0ZW1wLWJ1ZmZlci1zaG93LWZ1bmN0aW9uIChmdW5jdGlvbiBndWQtdGVtcC1idWZmZXItc2hvdykpKQorICAgICAobGlzdCAoZ2RiLW5lZWRlZC1kZWZhdWx0LWluc3RhbmNlKQorCSAgIChjb25jYXQgImV4ZWMtZmlsZSAiIChyZWFkLWZpbGUtbmFtZSAiSW5pdCBtZW1vcnkgZnJvbSBleGVjdXRhYmxlOiAiCisJCQkJCQluaWwKKwkJCQkJCSJhLm91dCIKKwkJCQkJCXQpKSkpKQorICAoZ3VkLWRpc3BsYXktZ3VkLWJ1ZmZlciBpbnN0YW5jZSkKKyAgKGFwcGx5IGNvbWludC1pbnB1dC1zZW5kZXIKKwkgKGxpc3QgKGdkYi1pbnN0YW5jZS1wcm9jZXNzIGluc3RhbmNlKSBjb21tYW5kKSkpCisKKyhkZWZ1biBndWQtbG9hZCAoaW5zdGFuY2UgY29tbWFuZCkKKyAgKGludGVyYWN0aXZlCisgICAobGV0ICgodGVtcC1idWZmZXItc2hvdy1mdW5jdGlvbiAoZnVuY3Rpb24gZ3VkLXRlbXAtYnVmZmVyLXNob3cpKSkKKyAgICAgKGxpc3QgKGdkYi1uZWVkZWQtZGVmYXVsdC1pbnN0YW5jZSkKKwkgICAoY29uY2F0ICJsb2FkICIgKHJlYWQtZmlsZS1uYW1lICJEeW5hbWljbHkgbG9hZCBmcm9tIGZpbGU6ICIKKwkJCQkJICAgbmlsCisJCQkJCSAgICJhLm91dCIKKwkJCQkJICAgdCkpKSkpCisgIChndWQtZGlzcGxheS1ndWQtYnVmZmVyIGluc3RhbmNlKQorICAoYXBwbHkgY29taW50LWlucHV0LXNlbmRlcgorCSAobGlzdCAoZ2RiLWluc3RhbmNlLXByb2Nlc3MgaW5zdGFuY2UpIGNvbW1hbmQpKSkKKworKGRlZnVuIGd1ZC1zeW1ib2wtZmlsZSAoaW5zdGFuY2UgY29tbWFuZCkKKyAgKGludGVyYWN0aXZlCisgICAobGV0ICgodGVtcC1idWZmZXItc2hvdy1mdW5jdGlvbiAoZnVuY3Rpb24gZ3VkLXRlbXAtYnVmZmVyLXNob3cpKSkKKyAgICAgKGxpc3QgKGdkYi1uZWVkZWQtZGVmYXVsdC1pbnN0YW5jZSkKKwkgICAoY29uY2F0ICJzeW1ib2wtZmlsZSAiIChyZWFkLWZpbGUtbmFtZSAiUmVhZCBzeW1ib2wgdGFibGUgZnJvbSBmaWxlOiAiCisJCQkJCQkgIG5pbAorCQkJCQkJICAiYS5vdXQiCisJCQkJCQkgIHQpKSkpKQorICAoZ3VkLWRpc3BsYXktZ3VkLWJ1ZmZlciBpbnN0YW5jZSkKKyAgKGFwcGx5IGNvbWludC1pbnB1dC1zZW5kZXIKKwkgKGxpc3QgKGdkYi1pbnN0YW5jZS1wcm9jZXNzIGluc3RhbmNlKSBjb21tYW5kKSkpCisKKworKGRlZnVuIGd1ZC1hZGQtc3ltYm9sLWZpbGUgKGluc3RhbmNlIGNvbW1hbmQpCisgIChpbnRlcmFjdGl2ZQorICAgKGxldCAoKHRlbXAtYnVmZmVyLXNob3ctZnVuY3Rpb24gKGZ1bmN0aW9uIGd1ZC10ZW1wLWJ1ZmZlci1zaG93KSkpCisgICAgIChsaXN0IChnZGItbmVlZGVkLWRlZmF1bHQtaW5zdGFuY2UpCisJICAgKGNvbmNhdCAiYWRkLXN5bWJvbC1maWxlICIKKwkJICAgKHJlYWQtZmlsZS1uYW1lICJBZGQgc3ltYm9scyBmcm9tIGZpbGU6ICIKKwkJCQkgICBuaWwKKwkJCQkgICAiYS5vdXQiCisJCQkJICAgdCkpKSkpCisgIChndWQtZGlzcGxheS1ndWQtYnVmZmVyIGluc3RhbmNlKQorICAoYXBwbHkgY29taW50LWlucHV0LXNlbmRlcgorCSAobGlzdCAoZ2RiLWluc3RhbmNlLXByb2Nlc3MgaW5zdGFuY2UpIGNvbW1hbmQpKSkKKworCisoZGVmdW4gZ3VkLXNoYXJlZGxpYnJhcnkgKGluc3RhbmNlIGNvbW1hbmQpCisgIChpbnRlcmFjdGl2ZQorICAgKGxldCAoKHRlbXAtYnVmZmVyLXNob3ctZnVuY3Rpb24gKGZ1bmN0aW9uIGd1ZC10ZW1wLWJ1ZmZlci1zaG93KSkpCisgICAgIChsaXN0IChnZGItbmVlZGVkLWRlZmF1bHQtaW5zdGFuY2UpCisJICAgKGNvbmNhdCAic2hhcmVkbGlicmFyeSAiCisJCSAgIChyZWFkLXN0cmluZyAiTG9hZCBzeW1ib2xzIGZvciBmaWxlcyBtYXRjaGluZyByZWdleHA6ICIpKSkpKQorICAoZ3VkLWRpc3BsYXktZ3VkLWJ1ZmZlciBpbnN0YW5jZSkKKyAgKGFwcGx5IGNvbWludC1pbnB1dC1zZW5kZXIKKwkgKGxpc3QgKGdkYi1pbnN0YW5jZS1wcm9jZXNzIGluc3RhbmNlKSBjb21tYW5kKSkpCisKKworCisMCisKKzs7OzsgV2luZG93IG1hbmFnZW1lbnQKKworCis7OzsgRklYTUU6IFRoaXMgc2hvdWxkIG9ubHkgcmV0dXJuIHRydWUgZm9yIGJ1ZmZlcnMgaW4gdGhlIGN1cnJlbnQgaW5zdGFuY2UKKyhkZWZ1biBndWQtcHJvdGVjdGVkLWJ1ZmZlci1wIChidWZmZXIpCisgICJJcyBCVUZGRVIgYSBidWZmZXIgd2hpY2ggd2Ugd2FudCB0byBsZWF2ZSBkaXNwbGF5ZWQ/IgorICAoc2F2ZS1leGN1cnNpb24KKyAgICAoc2V0LWJ1ZmZlciBidWZmZXIpCisgICAgKG9yIGdkYi1idWZmZXItdHlwZQorCW92ZXJsYXktYXJyb3ctcG9zaXRpb24pKSkKKworOzs7IFRoZSB3YXkgd2UgYWJ1c2UgdGhlIGRlZGljYXRlZC1wIGZsYWcgaXMgcHJldHR5IGdyb3NzLCBidXQgc2VlbXMKKzs7OyB0byBkbyB0aGUgcmlnaHQgdGhpbmcuICBTZWVpbmcgYXMgdGhlcmUgaXMgbm8gd2F5IGZvciBMaXNwIGNvZGUgdG8KKzs7OyBnZXQgYXQgdGhlIHVzZV90aW1lIGZpZWxkIG9mIGEgd2luZG93LCBJJ20gbm90IHN1cmUgdGhlcmUgZXhpc3RzIGEKKzs7OyBtb3JlIGVsZWdhbnQgc29sdXRpb24gd2l0aG91dCB3cml0aW5nIEMgY29kZS4KKworKGRlZnVuIGd1ZC1kaXNwbGF5LWJ1ZmZlciAoYnVmICZvcHRpb25hbCBzaXplKQorICAobGV0ICgobXVzdC1zcGxpdCBuaWwpCisJKGFuc3dlciBuaWwpKQorICAgICh1bndpbmQtcHJvdGVjdAorCShwcm9nbgorCSAgKHdhbGstd2luZG93cworCSAgICcobGFtYmRhICh3aW4pCisJICAgICAgKGlmIChndWQtcHJvdGVjdGVkLWJ1ZmZlci1wICh3aW5kb3ctYnVmZmVyIHdpbikpCisJCSAgKHNldC13aW5kb3ctZGVkaWNhdGVkLXAgd2luIHQpKSkpCisJICAoc2V0cSBhbnN3ZXIgKGdldC1idWZmZXItd2luZG93IGJ1ZikpCisJICAoaWYgKG5vdCBhbnN3ZXIpCisJICAgICAgKGxldCAoKHdpbmRvdyAoZ2V0LWxydS13aW5kb3cpKSkKKwkJKGlmIHdpbmRvdworCQkgICAgKHByb2duCisJCSAgICAgIChzZXQtd2luZG93LWJ1ZmZlciB3aW5kb3cgYnVmKQorCQkgICAgICAoc2V0cSBhbnN3ZXIgd2luZG93KSkKKwkJICAoc2V0cSBtdXN0LXNwbGl0IHQpKSkpKQorICAgICAgKHdhbGstd2luZG93cworICAgICAgICcobGFtYmRhICh3aW4pCisJICAoaWYgKGd1ZC1wcm90ZWN0ZWQtYnVmZmVyLXAgKHdpbmRvdy1idWZmZXIgd2luKSkKKwkgICAgICAoc2V0LXdpbmRvdy1kZWRpY2F0ZWQtcCB3aW4gbmlsKSkpKSkKKyAgICAoaWYgbXVzdC1zcGxpdAorCShsZXQqICgobGFyZ2VzdCAoZ2V0LWxhcmdlc3Qtd2luZG93KSkKKwkgICAgICAgKGN1ci1zaXplICh3aW5kb3ctaGVpZ2h0IGxhcmdlc3QpKQorCSAgICAgICAobmV3LXNpemUgKGFuZCBzaXplICg8IHNpemUgY3VyLXNpemUpICgtIGN1ci1zaXplIHNpemUpKSkpCisJICAoc2V0cSBhbnN3ZXIgKHNwbGl0LXdpbmRvdyBsYXJnZXN0IG5ldy1zaXplKSkKKwkgIChzZXQtd2luZG93LWJ1ZmZlciBhbnN3ZXIgYnVmKSkpCisgICAgYW5zd2VyKSkKKworKGRlZnVuIGV4aXN0aW5nLXNvdXJjZS13aW5kb3cgKGJ1ZmZlcikKKyAgKGNhdGNoICdmb3VuZAorICAgIChzYXZlLWV4Y3Vyc2lvbgorICAgICAgKHdhbGstd2luZG93cworICAgICAgIChmdW5jdGlvbgorCShsYW1iZGEgKHdpbikKKwkgIChpZiAoYW5kIG92ZXJsYXktYXJyb3ctcG9zaXRpb24KKwkJICAgKGVxICh3aW5kb3ctYnVmZmVyIHdpbikKKwkJICAgICAgIChtYXJrZXItYnVmZmVyIG92ZXJsYXktYXJyb3ctcG9zaXRpb24pKSkKKwkgICAgICAocHJvZ24KKwkJKHNldC13aW5kb3ctYnVmZmVyIHdpbiBidWZmZXIpCisJCSh0aHJvdyAnZm91bmQgd2luKSkpKSkpCisgICAgICBuaWwpKSkKKyAgICAgIAorKGRlZnVuIGd1ZC1kaXNwbGF5LXNvdXJjZS1idWZmZXIgKGJ1ZmZlcikKKyAgKG9yIChleGlzdGluZy1zb3VyY2Utd2luZG93IGJ1ZmZlcikKKyAgICAgIChndWQtZGlzcGxheS1idWZmZXIgYnVmZmVyKSkpCisKKyhkZWZ1biBndWQtZnJhbWUtYnVmZmVyIChidWYpCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIChzZXQtYnVmZmVyIGJ1ZikKKyAgICAobWFrZS1mcmFtZSkpKQorCisMCisKKzs7OyBTaGFyZWQga2V5bWFwIGluaXRpYWxpemF0aW9uOgorCisoZGVmdW4gbWFrZS13aW5kb3dzLW1lbnUgKG1hcCkKKyAgKGRlZmluZS1rZXkgbWFwIFttZW51LWJhciBkaXNwbGF5c10KKyAgICAoY29ucyAiR0RCLVdpbmRvd3MiIChtYWtlLXNwYXJzZS1rZXltYXAgIkdEQi1XaW5kb3dzIikpKQorICAoZGVmaW5lLWtleSBtYXAgW21lbnUtYmFyIGRpc3BsYXlzIGdkYl0KKyAgICAnKCJHZGIiIC4gZ3VkLWRpc3BsYXktZ3VkLWJ1ZmZlcikpCisgIChkZWZpbmUta2V5IG1hcCBbbWVudS1iYXIgZGlzcGxheXMgcmVnaXN0ZXJzXQorICAgICcoIlJlZ2lzdGVycyIgLiBndWQtZGlzcGxheS1yZWdpc3RlcnMtYnVmZmVyKSkKKyAgKGRlZmluZS1rZXkgbWFwIFttZW51LWJhciBkaXNwbGF5cyBmcmFtZXNdCisgICAgJygiU3RhY2siIC4gZ3VkLWRpc3BsYXktc3RhY2stYnVmZmVyKSkKKyAgKGRlZmluZS1rZXkgbWFwIFttZW51LWJhciBkaXNwbGF5cyBicmVha3BvaW50c10KKyAgICAnKCJCcmVha3BvaW50cyIgLiBndWQtZGlzcGxheS1icmVha3BvaW50cy1idWZmZXIpKQorICAoZGVmaW5lLWtleSBtYXAgW21lbnUtYmFyIGRpc3BsYXlzIGNvbW1hbmRzXQorICAgICcoIkNvbW1hbmRzIiAuIGd1ZC1kaXNwbGF5LWNvbW1hbmQtYnVmZmVyKSkpCisKKyhkZWZ1biBndWQtZGlzcGxheS1ndWQtYnVmZmVyIChpbnN0YW5jZSkKKyAgKGludGVyYWN0aXZlIChsaXN0IChnZGItbmVlZGVkLWRlZmF1bHQtaW5zdGFuY2UpKSkKKyAgKGd1ZC1kaXNwbGF5LWJ1ZmZlcgorICAgKGdkYi1nZXQtY3JlYXRlLWluc3RhbmNlLWJ1ZmZlciBpbnN0YW5jZSAnZ3VkKSkpCisKKyhtYWtlLXdpbmRvd3MtbWVudSBndWQtYnJlYWtwb2ludHMtbW9kZS1tYXApCisobWFrZS13aW5kb3dzLW1lbnUgZ3VkLWZyYW1lcy1tb2RlLW1hcCkKKyhtYWtlLXdpbmRvd3MtbWVudSBndWQtcmVnaXN0ZXJzLW1vZGUtbWFwKQorCisKKworKGRlZnVuIG1ha2UtZnJhbWVzLW1lbnUgKG1hcCkKKyAgKGRlZmluZS1rZXkgbWFwIFttZW51LWJhciBmcmFtZXNdCisgICAgKGNvbnMgIkdEQi1GcmFtZXMiIChtYWtlLXNwYXJzZS1rZXltYXAgIkdEQi1GcmFtZXMiKSkpCisgIChkZWZpbmUta2V5IG1hcCBbbWVudS1iYXIgZnJhbWVzIGdkYl0KKyAgICAnKCJHZGIiIC4gZ3VkLWZyYW1lLWd1ZC1idWZmZXIpKQorICAoZGVmaW5lLWtleSBtYXAgW21lbnUtYmFyIGZyYW1lcyByZWdpc3RlcnNdCisgICAgJygiUmVnaXN0ZXJzIiAuIGd1ZC1mcmFtZS1yZWdpc3RlcnMtYnVmZmVyKSkKKyAgKGRlZmluZS1rZXkgbWFwIFttZW51LWJhciBmcmFtZXMgZnJhbWVzXQorICAgICcoIlN0YWNrIiAuIGd1ZC1mcmFtZS1zdGFjay1idWZmZXIpKQorICAoZGVmaW5lLWtleSBtYXAgW21lbnUtYmFyIGZyYW1lcyBicmVha3BvaW50c10KKyAgICAnKCJCcmVha3BvaW50cyIgLiBndWQtZnJhbWUtYnJlYWtwb2ludHMtYnVmZmVyKSkKKyAgKGRlZmluZS1rZXkgbWFwIFttZW51LWJhciBkaXNwbGF5cyBjb21tYW5kc10KKyAgICAnKCJDb21tYW5kcyIgLiBndWQtZGlzcGxheS1jb21tYW5kLWJ1ZmZlcikpKQorCisoZGVmdW4gZ3VkLWZyYW1lLWd1ZC1idWZmZXIgKGluc3RhbmNlKQorICAoaW50ZXJhY3RpdmUgKGxpc3QgKGdkYi1uZWVkZWQtZGVmYXVsdC1pbnN0YW5jZSkpKQorICAoZ3VkLWZyYW1lLWJ1ZmZlcgorICAgKGdkYi1nZXQtY3JlYXRlLWluc3RhbmNlLWJ1ZmZlciBpbnN0YW5jZSAnZ3VkKSkpCisKKyhtYWtlLWZyYW1lcy1tZW51IGd1ZC1icmVha3BvaW50cy1tb2RlLW1hcCkKKyhtYWtlLWZyYW1lcy1tZW51IGd1ZC1mcmFtZXMtbW9kZS1tYXApCisobWFrZS1mcmFtZXMtbWVudSBndWQtcmVnaXN0ZXJzLW1vZGUtbWFwKQorCisMCisoZGVmdW4gZ3VkLWdkYi1maW5kLWZpbGUgKGYpCisgIChmaW5kLWZpbGUtbm9zZWxlY3QgZikpCisKKzs7OyMjI2F1dG9sb2FkCisoZGVmdW4gZ2RiIChjb21tYW5kLWxpbmUpCisgICJSdW4gZ2RiIG9uIHByb2dyYW0gRklMRSBpbiBidWZmZXIgKmd1ZC1GSUxFKi4KK1RoZSBkaXJlY3RvcnkgY29udGFpbmluZyBGSUxFIGJlY29tZXMgdGhlIGluaXRpYWwgd29ya2luZyBkaXJlY3RvcnkKK2FuZCBzb3VyY2UtZmlsZSBkaXJlY3RvcnkgZm9yIHlvdXIgZGVidWdnZXIuIgorICAoaW50ZXJhY3RpdmUKKyAgIChsaXN0IChyZWFkLWZyb20tbWluaWJ1ZmZlciAiUnVuIGdkYiAobGlrZSB0aGlzKTogIgorCQkJICAgICAgIChpZiAoY29uc3AgZ3VkLWdkYi1oaXN0b3J5KQorCQkJCSAgIChjYXIgZ3VkLWdkYi1oaXN0b3J5KQorCQkJCSAiZ2RiICIpCisJCQkgICAgICAgbmlsIG5pbAorCQkJICAgICAgICcoZ3VkLWdkYi1oaXN0b3J5IC4gMSkpKSkKKyAgKGd1ZC1vdmVybG9hZC1mdW5jdGlvbnMKKyAgICcoKGd1ZC1tYXNzYWdlLWFyZ3MgLiBndWQtZ2RiLW1hc3NhZ2UtYXJncykKKyAgICAgKGd1ZC1tYXJrZXItZmlsdGVyIC4gZ3VkLWdkYi1tYXJrZXItZmlsdGVyKQorICAgICAoZ3VkLWZpbmQtZmlsZSAuIGd1ZC1nZGItZmluZC1maWxlKQorICAgICApKQorCisgIChsZXQqICgod29yZHMgKGd1ZC1jaG9wLXdvcmRzIGNvbW1hbmQtbGluZSkpCisJIChwcm9ncmFtIChjYXIgd29yZHMpKQorCSAoZmlsZS13b3JkIChsZXQgKCh3IChjZHIgd29yZHMpKSkKKwkJICAgICAgKHdoaWxlIChhbmQgdyAoPSA/LSAoYXJlZiAoY2FyIHcpIDApKSkKKwkJCShzZXRxIHcgKGNkciB3KSkpCisJCSAgICAgIChjYXIgdykpKQorCSAoYXJncyAoZGVscSBmaWxlLXdvcmQgKGNkciB3b3JkcykpKQorCSAoZmlsZSAoZXhwYW5kLWZpbGUtbmFtZSBmaWxlLXdvcmQpKQorCSAoZmlsZXBhcnQgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgZmlsZSkpCisJIChidWZmZXItbmFtZSAoY29uY2F0ICIqZ3VkLSIgZmlsZXBhcnQgIioiKSkpCisgICAgKHNldHEgZ2RiLWZpcnN0LXRpbWUgKG5vdCAoZ2V0LWJ1ZmZlci1wcm9jZXNzIGJ1ZmZlci1uYW1lKSkpKQorCisgIChndWQtY29tbW9uLWluaXQgY29tbWFuZC1saW5lKQorCisgIChndWQtZGVmIGd1ZC1icmVhayAgImJyZWFrICVmOiVsIiAgIlxDLWIiICJTZXQgYnJlYWtwb2ludCBhdCBjdXJyZW50IGxpbmUuIikKKyAgKGd1ZC1kZWYgZ3VkLXRicmVhayAidGJyZWFrICVmOiVsIiAiXEMtdCIgIlNldCBicmVha3BvaW50IGF0IGN1cnJlbnQgbGluZS4iKQorICAoZ3VkLWRlZiBndWQtcmVtb3ZlICJjbGVhciAlbCIgICAgICJcQy1kIiAiUmVtb3ZlIGJyZWFrcG9pbnQgYXQgY3VycmVudCBsaW5lIikKKyAgKGd1ZC1kZWYgZ3VkLWtpbGwgICAia2lsbCIJICAgICBuaWwgICAgIktpbGwgdGhlIHByb2dyYW0uIikKKyAgKGd1ZC1kZWYgZ3VkLXJ1biAgICAicnVuIgkgICAgIG5pbCAgICAiUnVuIHRoZSBwcm9ncmFtLiIpCisgIChndWQtZGVmIGd1ZC1zdGVwaSAgInN0ZXBpICVwIiAgICAgIlxDLWkiICJTdGVwIG9uZSBpbnN0cnVjdGlvbiB3aXRoIGRpc3BsYXkuIikKKyAgKGd1ZC1kZWYgZ3VkLXN0ZXAgICAic3RlcCAlcCIgICAgICAiXEMtcyIgIlN0ZXAgb25lIHNvdXJjZSBsaW5lIHdpdGggZGlzcGxheS4iKQorICAoZ3VkLWRlZiBndWQtbmV4dCAgICJuZXh0ICVwIiAgICAgICJcQy1uIiAiU3RlcCBvbmUgbGluZSAoc2tpcCBmdW5jdGlvbnMpLiIpCisgIChndWQtZGVmIGd1ZC1maW5pc2ggImZpbmlzaCIgICAgICAgIlxDLWYiICJGaW5pc2ggZXhlY3V0aW5nIGN1cnJlbnQgZnVuY3Rpb24uIikKKyAgKGd1ZC1kZWYgZ3VkLWNvbnQgICAiY29udCIgICAgICAgICAiXEMtciIgIkNvbnRpbnVlIHdpdGggZGlzcGxheS4iKQorICAoZ3VkLWRlZiBndWQtdXAgICAgICJ1cCAlcCIgICAgICAgICI8IiAiVXAgTiBzdGFjayBmcmFtZXMgKG51bWVyaWMgYXJnKS4iKQorICAoZ3VkLWRlZiBndWQtZG93biAgICJkb3duICVwIiAgICAgICI+IiAiRG93biBOIHN0YWNrIGZyYW1lcyAobnVtZXJpYyBhcmcpLiIpCisgIChndWQtZGVmIGd1ZC1wcmludCAgInByaW50ICVlIiAgICAgIlxDLXAiICJFdmFsdWF0ZSBDIGV4cHJlc3Npb24gYXQgcG9pbnQuIikKKworICAoc2V0cSBjb21pbnQtcHJvbXB0LXJlZ2V4cCAiXiguKmdkYlsrXT8pICoiKQorICAoc2V0cSBjb21pbnQtaW5wdXQtc2VuZGVyICdnZGItc2VuZCkKKyAgKHJ1bi1ob29rcyAnZ2RiLW1vZGUtaG9vaykKKyAgKGxldCAoKGluc3RhbmNlCisJIChtYWtlLWdkYi1pbnN0YW5jZSAoZ2V0LWJ1ZmZlci1wcm9jZXNzIChjdXJyZW50LWJ1ZmZlcikpKQorCSApKQorICAgIChpZiBnZGItZmlyc3QtdGltZSAoZ2RiLWNsZWFyLWluZmVyaW9yLWlvIGluc3RhbmNlKSkpCisgICkKKworDAorOzsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgc2RiIGZ1bmN0aW9ucworCis7OzsgSGlzdG9yeSBvZiBhcmd1bWVudCBsaXN0cyBwYXNzZWQgdG8gc2RiLgorKGRlZnZhciBndWQtc2RiLWhpc3RvcnkgbmlsKQorCisoZGVmdmFyIGd1ZC1zZGItbmVlZHMtdGFncyAobm90IChmaWxlLWV4aXN0cy1wICIvdmFyIikpCisgICJJZiBuaWwsIHdlJ3JlIG9uIGEgU3lzdGVtIFYgUmVsZWFzZSA0IGFuZCBkb24ndCBuZWVkIHRoZSB0YWdzIGhhY2suIikKKworKGRlZnZhciBndWQtc2RiLWxhc3RmaWxlIG5pbCkKKworKGRlZnVuIGd1ZC1zZGItbWFzc2FnZS1hcmdzIChmaWxlIGFyZ3MpCisgIChjb25zIGZpbGUgYXJncykpCisKKyhkZWZ1biBndWQtc2RiLW1hcmtlci1maWx0ZXIgKHN0cmluZykKKyAgKGNvbmQgCisgICA7OyBTeXN0ZW0gViBSZWxlYXNlIDMuMiB1c2VzIHRoaXMgZm9ybWF0CisgICAoKHN0cmluZy1tYXRjaCAiXFwoXjB4XFx3KiBpbiBcXHxeXFx8XG5cXClcXChbXjpcbl0qXFwpOlxcKFswLTldKlxcKTouKlxuIgorCQkgICAgc3RyaW5nKQorICAgIChzZXRxIGd1ZC1sYXN0LWZyYW1lCisJICAoY29ucworCSAgIChzdWJzdHJpbmcgc3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMikgKG1hdGNoLWVuZCAyKSkKKwkgICAoc3RyaW5nLXRvLWludCAKKwkgICAgKHN1YnN0cmluZyBzdHJpbmcgKG1hdGNoLWJlZ2lubmluZyAzKSAobWF0Y2gtZW5kIDMpKSkpKSkKKyAgIDs7IFN5c3RlbSBWIFJlbGVhc2UgNC4wIAorICAgKChzdHJpbmctbWF0Y2ggIl5cXChCUkVBS1BPSU5UXFx8U1RFUFBFRFxcKSBwcm9jZXNzIFswLTldKyBmdW5jdGlvbiBbXiBdKyBpbiBcXCguK1xcKVxuIgorCQkgICAgICAgc3RyaW5nKQorICAgIChzZXRxIGd1ZC1zZGItbGFzdGZpbGUKKwkgIChzdWJzdHJpbmcgc3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMikgKG1hdGNoLWVuZCAyKSkpKQorICAgKChhbmQgZ3VkLXNkYi1sYXN0ZmlsZSAoc3RyaW5nLW1hdGNoICJeXFwoWzAtOV0rXFwpOiIgc3RyaW5nKSkKKwkgKHNldHEgZ3VkLWxhc3QtZnJhbWUKKwkgICAgICAgKGNvbnMKKwkJZ3VkLXNkYi1sYXN0ZmlsZQorCQkoc3RyaW5nLXRvLWludCAKKwkJIChzdWJzdHJpbmcgc3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMSkgKG1hdGNoLWVuZCAxKSkpKSkpCisgICAodCAKKyAgICAoc2V0cSBndWQtc2RiLWxhc3RmaWxlIG5pbCkpKQorICBzdHJpbmcpCisKKyhkZWZ1biBndWQtc2RiLWZpbmQtZmlsZSAoZikKKyAgKGlmIGd1ZC1zZGItbmVlZHMtdGFncworICAgICAgKGZpbmQtdGFnLW5vc2VsZWN0IGYpCisgICAgKGZpbmQtZmlsZS1ub3NlbGVjdCBmKSkpCisKKzs7OyMjI2F1dG9sb2FkCisoZGVmdW4gc2RiIChjb21tYW5kLWxpbmUpCisgICJSdW4gc2RiIG9uIHByb2dyYW0gRklMRSBpbiBidWZmZXIgKmd1ZC1GSUxFKi4KK1RoZSBkaXJlY3RvcnkgY29udGFpbmluZyBGSUxFIGJlY29tZXMgdGhlIGluaXRpYWwgd29ya2luZyBkaXJlY3RvcnkKK2FuZCBzb3VyY2UtZmlsZSBkaXJlY3RvcnkgZm9yIHlvdXIgZGVidWdnZXIuIgorICAoaW50ZXJhY3RpdmUKKyAgIChsaXN0IChyZWFkLWZyb20tbWluaWJ1ZmZlciAiUnVuIHNkYiAobGlrZSB0aGlzKTogIgorCQkJICAgICAgIChpZiAoY29uc3AgZ3VkLXNkYi1oaXN0b3J5KQorCQkJCSAgIChjYXIgZ3VkLXNkYi1oaXN0b3J5KQorCQkJCSAic2RiICIpCisJCQkgICAgICAgbmlsIG5pbAorCQkJICAgICAgICcoZ3VkLXNkYi1oaXN0b3J5IC4gMSkpKSkKKyAgKGlmIChhbmQgZ3VkLXNkYi1uZWVkcy10YWdzCisJICAgKG5vdCAoYW5kIChib3VuZHAgJ3RhZ3MtZmlsZS1uYW1lKSAoZmlsZS1leGlzdHMtcCB0YWdzLWZpbGUtbmFtZSkpKSkKKyAgICAgIChlcnJvciAiVGhlIHNkYiBzdXBwb3J0IHJlcXVpcmVzIGEgdmFsaWQgdGFncyB0YWJsZSB0byB3b3JrLiIpKQorICAoZ3VkLW92ZXJsb2FkLWZ1bmN0aW9ucyAnKChndWQtbWFzc2FnZS1hcmdzIC4gZ3VkLXNkYi1tYXNzYWdlLWFyZ3MpCisJCQkgICAgKGd1ZC1tYXJrZXItZmlsdGVyIC4gZ3VkLXNkYi1tYXJrZXItZmlsdGVyKQorCQkJICAgIChndWQtZmluZC1maWxlIC4gZ3VkLXNkYi1maW5kLWZpbGUpCisJCQkgICAgKSkKKworICAoZ3VkLWNvbW1vbi1pbml0IGNvbW1hbmQtbGluZSkKKworICAoZ3VkLWRlZiBndWQtYnJlYWsgICIlbCBiIiAiXEMtYiIgICAiU2V0IGJyZWFrcG9pbnQgYXQgY3VycmVudCBsaW5lLiIpCisgIChndWQtZGVmIGd1ZC10YnJlYWsgIiVsIGMiICJcQy10IiAgICJTZXQgdGVtcG9yYXJ5IGJyZWFrcG9pbnQgYXQgY3VycmVudCBsaW5lLiIpCisgIChndWQtZGVmIGd1ZC1yZW1vdmUgIiVsIGQiICJcQy1kIiAgICJSZW1vdmUgYnJlYWtwb2ludCBhdCBjdXJyZW50IGxpbmUiKQorICAoZ3VkLWRlZiBndWQtc3RlcCAgICJzICVwIiAiXEMtcyIgICAiU3RlcCBvbmUgc291cmNlIGxpbmUgd2l0aCBkaXNwbGF5LiIpCisgIChndWQtZGVmIGd1ZC1zdGVwaSAgImkgJXAiICJcQy1pIiAgICJTdGVwIG9uZSBpbnN0cnVjdGlvbiB3aXRoIGRpc3BsYXkuIikKKyAgKGd1ZC1kZWYgZ3VkLW5leHQgICAiUyAlcCIgIlxDLW4iICAgIlN0ZXAgb25lIGxpbmUgKHNraXAgZnVuY3Rpb25zKS4iKQorICAoZ3VkLWRlZiBndWQtY29udCAgICJjIiAgICAiXEMtciIgICAiQ29udGludWUgd2l0aCBkaXNwbGF5LiIpCisgIChndWQtZGVmIGd1ZC1wcmludCAgIiVlLyIgICJcQy1wIiAgICJFdmFsdWF0ZSBDIGV4cHJlc3Npb24gYXQgcG9pbnQuIikKKworICAoc2V0cSBjb21pbnQtcHJvbXB0LXJlZ2V4cCAgIlxcKF5cXHxcblxcKVxcKiIpCisgIChydW4taG9va3MgJ3NkYi1tb2RlLWhvb2spCisgICkKKwwKKzs7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IGRieCBmdW5jdGlvbnMKKworOzs7IEhpc3Rvcnkgb2YgYXJndW1lbnQgbGlzdHMgcGFzc2VkIHRvIGRieC4KKyhkZWZ2YXIgZ3VkLWRieC1oaXN0b3J5IG5pbCkKKworKGRlZnVuIGd1ZC1kYngtbWFzc2FnZS1hcmdzIChmaWxlIGFyZ3MpCisgIChjb25zIGZpbGUgYXJncykpCisKKyhkZWZ1biBndWQtZGJ4LW1hcmtlci1maWx0ZXIgKHN0cmluZykKKyAgKGlmIChvciAoc3RyaW5nLW1hdGNoCisgICAgICAgICAic3RvcHBlZCBpbiAuKiBhdCBsaW5lIFxcKFswLTldKlxcKSBpbiBmaWxlIFwiXFwoW15cIl0qXFwpXCIiCisgICAgICAgICBzdHJpbmcpCisgICAgICAgIChzdHJpbmctbWF0Y2gKKyAgICAgICAgICJzaWduYWwgLiogaW4gLiogYXQgbGluZSBcXChbMC05XSpcXCkgaW4gZmlsZSBcIlxcKFteXCJdKlxcKVwiIgorICAgICAgICAgc3RyaW5nKSkKKyAgICAgIChzZXRxIGd1ZC1sYXN0LWZyYW1lCisJICAgIChjb25zCisJICAgICAoc3Vic3RyaW5nIHN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDIpIChtYXRjaC1lbmQgMikpCisJICAgICAoc3RyaW5nLXRvLWludCAKKwkgICAgICAoc3Vic3RyaW5nIHN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDEpIChtYXRjaC1lbmQgMSkpKSkpKQorICBzdHJpbmcpCisKKyhkZWZ1biBndWQtZGJ4LWZpbmQtZmlsZSAoZikKKyAgKGZpbmQtZmlsZS1ub3NlbGVjdCBmKSkKKworOzs7IyMjYXV0b2xvYWQKKyhkZWZ1biBkYnggKGNvbW1hbmQtbGluZSkKKyAgIlJ1biBkYnggb24gcHJvZ3JhbSBGSUxFIGluIGJ1ZmZlciAqZ3VkLUZJTEUqLgorVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIEZJTEUgYmVjb21lcyB0aGUgaW5pdGlhbCB3b3JraW5nIGRpcmVjdG9yeQorYW5kIHNvdXJjZS1maWxlIGRpcmVjdG9yeSBmb3IgeW91ciBkZWJ1Z2dlci4iCisgIChpbnRlcmFjdGl2ZQorICAgKGxpc3QgKHJlYWQtZnJvbS1taW5pYnVmZmVyICJSdW4gZGJ4IChsaWtlIHRoaXMpOiAiCisJCQkgICAgICAgKGlmIChjb25zcCBndWQtZGJ4LWhpc3RvcnkpCisJCQkJICAgKGNhciBndWQtZGJ4LWhpc3RvcnkpCisJCQkJICJkYnggIikKKwkJCSAgICAgICBuaWwgbmlsCisJCQkgICAgICAgJyhndWQtZGJ4LWhpc3RvcnkgLiAxKSkpKQorICAoZ3VkLW92ZXJsb2FkLWZ1bmN0aW9ucyAnKChndWQtbWFzc2FnZS1hcmdzIC4gZ3VkLWRieC1tYXNzYWdlLWFyZ3MpCisJCQkgICAgKGd1ZC1tYXJrZXItZmlsdGVyIC4gZ3VkLWRieC1tYXJrZXItZmlsdGVyKQorCQkJICAgIChndWQtZmluZC1maWxlIC4gZ3VkLWRieC1maW5kLWZpbGUpCisJCQkgICAgKSkKKworICAoZ3VkLWNvbW1vbi1pbml0IGNvbW1hbmQtbGluZSkKKworICAoZ3VkLWRlZiBndWQtYnJlYWsgICJmaWxlIFwiJWQlZlwiXG5zdG9wIGF0ICVsIgorCSAgIAkJCSAgIlxDLWIiICJTZXQgYnJlYWtwb2ludCBhdCBjdXJyZW50IGxpbmUuIikKKzs7ICAoZ3VkLWRlZiBndWQtYnJlYWsgICJzdG9wIGF0IFwiJWZcIjolbCIKKzs7CSAgIAkJCSAgIlxDLWIiICJTZXQgYnJlYWtwb2ludCBhdCBjdXJyZW50IGxpbmUuIikKKyAgKGd1ZC1kZWYgZ3VkLXJlbW92ZSAiY2xlYXIgJWwiICAiXEMtZCIgIlJlbW92ZSBicmVha3BvaW50IGF0IGN1cnJlbnQgbGluZSIpCisgIChndWQtZGVmIGd1ZC1zdGVwICAgInN0ZXAgJXAiCSAgIlxDLXMiICJTdGVwIG9uZSBsaW5lIHdpdGggZGlzcGxheS4iKQorICAoZ3VkLWRlZiBndWQtc3RlcGkgICJzdGVwaSAlcCIgICJcQy1pIiAiU3RlcCBvbmUgaW5zdHJ1Y3Rpb24gd2l0aCBkaXNwbGF5LiIpCisgIChndWQtZGVmIGd1ZC1uZXh0ICAgIm5leHQgJXAiCSAgIlxDLW4iICJTdGVwIG9uZSBsaW5lIChza2lwIGZ1bmN0aW9ucykuIikKKyAgKGd1ZC1kZWYgZ3VkLWNvbnQgICAiY29udCIJICAiXEMtciIgIkNvbnRpbnVlIHdpdGggZGlzcGxheS4iKQorICAoZ3VkLWRlZiBndWQtdXAgICAgICJ1cCAlcCIJICAiPCIgIlVwIChudW1lcmljIGFyZykgc3RhY2sgZnJhbWVzLiIpCisgIChndWQtZGVmIGd1ZC1kb3duICAgImRvd24gJXAiCSAgIj4iICJEb3duIChudW1lcmljIGFyZykgc3RhY2sgZnJhbWVzLiIpCisgIChndWQtZGVmIGd1ZC1wcmludCAgInByaW50ICVlIiAgIlxDLXAiICJFdmFsdWF0ZSBDIGV4cHJlc3Npb24gYXQgcG9pbnQuIikKKworICAoc2V0cSBjb21pbnQtcHJvbXB0LXJlZ2V4cCAgIl5bXildKmRieCkgKiIpCisgIChydW4taG9va3MgJ2RieC1tb2RlLWhvb2spCisgICkKKwwKKzs7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzs7IHhkYiAoSFAgUEFSSVNDIGRlYnVnZ2VyKSBmdW5jdGlvbnMKKworOzs7IEhpc3Rvcnkgb2YgYXJndW1lbnQgbGlzdHMgcGFzc2VkIHRvIHhkYi4KKyhkZWZ2YXIgZ3VkLXhkYi1oaXN0b3J5IG5pbCkKKworKGRlZnZhciBndWQteGRiLWRpcmVjdG9yaWVzIG5pbAorICAiKkEgbGlzdCBvZiBkaXJlY3RvcmllcyB0aGF0IHhkYiBzaG91bGQgc2VhcmNoIGZvciBzb3VyY2UgY29kZS4KK0lmIG5pbCwgb25seSBzb3VyY2UgZmlsZXMgaW4gdGhlIHByb2dyYW0gZGlyZWN0b3J5Cit3aWxsIGJlIGtub3duIHRvIHhkYi4KKworVGhlIGZpbGUgbmFtZXMgc2hvdWxkIGJlIGFic29sdXRlLCBvciByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5Citjb250YWluaW5nIHRoZSBleGVjdXRhYmxlIGJlaW5nIGRlYnVnZ2VkLiIpCisKKyhkZWZ1biBndWQteGRiLW1hc3NhZ2UtYXJncyAoZmlsZSBhcmdzKQorICAobmNvbmMgKGxldCAoKGRpcmVjdG9yaWVzIGd1ZC14ZGItZGlyZWN0b3JpZXMpCisJICAgICAgIChyZXN1bHQgbmlsKSkKKwkgICAod2hpbGUgZGlyZWN0b3JpZXMKKwkgICAgIChzZXRxIHJlc3VsdCAoY29ucyAoY2FyIGRpcmVjdG9yaWVzKSAoY29ucyAiLWQiIHJlc3VsdCkpKQorCSAgICAgKHNldHEgZGlyZWN0b3JpZXMgKGNkciBkaXJlY3RvcmllcykpKQorCSAgIChucmV2ZXJzZSAoY29ucyBmaWxlIHJlc3VsdCkpKQorCSBhcmdzKSkKKworKGRlZnVuIGd1ZC14ZGItZmlsZS1uYW1lIChmKQorICAiVHJhbnNmb3JtIGEgcmVsYXRpdmUgcGF0aG5hbWUgdG8gYSBmdWxsIHBhdGhuYW1lIGluIHhkYiBtb2RlIgorICAobGV0ICgocmVzdWx0IG5pbCkpCisgICAgKGlmIChmaWxlLWV4aXN0cy1wIGYpCisgICAgICAgIChzZXRxIHJlc3VsdCAoZXhwYW5kLWZpbGUtbmFtZSBmKSkKKyAgICAgIChsZXQgKChkaXJlY3RvcmllcyBndWQteGRiLWRpcmVjdG9yaWVzKSkKKyAgICAgICAgKHdoaWxlIGRpcmVjdG9yaWVzCisgICAgICAgICAgKGxldCAoKHBhdGggKGNvbmNhdCAoY2FyIGRpcmVjdG9yaWVzKSAiLyIgZikpKQorICAgICAgICAgICAgKGlmIChmaWxlLWV4aXN0cy1wIHBhdGgpCisgICAgICAgICAgICAgICAgKHNldHEgcmVzdWx0IChleHBhbmQtZmlsZS1uYW1lIHBhdGgpCisgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMgbmlsKSkpCisgICAgICAgICAgKHNldHEgZGlyZWN0b3JpZXMgKGNkciBkaXJlY3RvcmllcykpKSkpCisgICAgcmVzdWx0KSkKKworOzsgeGRiIGRvZXMgbm90IHByaW50IHRoZSBsaW5lcyBhbGwgYXQgb25jZSwgc28gd2UgaGF2ZSB0byBhY2N1bXVsYXRlIHRoZW0KKyhkZWZ2YXIgZ3VkLXhkYi1hY2N1bXVsYXRpb24gIiIpCisKKyhkZWZ1biBndWQteGRiLW1hcmtlci1maWx0ZXIgKHN0cmluZykKKyAgKGxldCAocmVzdWx0KQorICAgIChpZiAob3IgKHN0cmluZy1tYXRjaCBjb21pbnQtcHJvbXB0LXJlZ2V4cCBzdHJpbmcpCisgICAgICAgICAgICAoc3RyaW5nLW1hdGNoICIuKlwwMTIiIHN0cmluZykpCisgICAgICAgIChzZXRxIHJlc3VsdCAoY29uY2F0IGd1ZC14ZGItYWNjdW11bGF0aW9uIHN0cmluZykKKyAgICAgICAgICAgICAgZ3VkLXhkYi1hY2N1bXVsYXRpb24gIiIpCisgICAgICAoc2V0cSBndWQteGRiLWFjY3VtdWxhdGlvbiAoY29uY2F0IGd1ZC14ZGItYWNjdW11bGF0aW9uIHN0cmluZykpKQorICAgIChpZiByZXN1bHQKKyAgICAgICAgKGlmIChvciAoc3RyaW5nLW1hdGNoICJcXChbXlxuIFx0Ol0rXFwpOiBbXjpdKzogXFwoWzAtOV0rXFwpOiIgcmVzdWx0KQorICAgICAgICAgICAgICAgIChzdHJpbmctbWF0Y2ggIlteOiBcdF0rOlsgXHRdK1xcKFteOl0rXFwpOiBbXjpdKzogXFwoWzAtOV0rXFwpOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkpCisgICAgICAgICAgICAobGV0ICgobGluZSAoc3RyaW5nLXRvLWludCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc3Vic3RyaW5nIHJlc3VsdCAobWF0Y2gtYmVnaW5uaW5nIDIpIChtYXRjaC1lbmQgMikpKSkKKyAgICAgICAgICAgICAgICAgIChmaWxlIChndWQteGRiLWZpbGUtbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgIChzdWJzdHJpbmcgcmVzdWx0IChtYXRjaC1iZWdpbm5pbmcgMSkgKG1hdGNoLWVuZCAxKSkpKSkKKyAgICAgICAgICAgICAgKGlmIGZpbGUKKyAgICAgICAgICAgICAgICAgIChzZXRxIGd1ZC1sYXN0LWZyYW1lIChjb25zIGZpbGUgbGluZSkpKSkpKQorICAgIChvciByZXN1bHQgIiIpKSkgICAgCisgICAgICAgICAgICAgICAKKyhkZWZ1biBndWQteGRiLWZpbmQtZmlsZSAoZikKKyAgKGxldCAoKHJlYWxmIChndWQteGRiLWZpbGUtbmFtZSBmKSkpCisgICAgKGlmIHJlYWxmIChmaW5kLWZpbGUtbm9zZWxlY3QgcmVhbGYpKSkpCisKKzs7OyMjI2F1dG9sb2FkCisoZGVmdW4geGRiIChjb21tYW5kLWxpbmUpCisgICJSdW4geGRiIG9uIHByb2dyYW0gRklMRSBpbiBidWZmZXIgKmd1ZC1GSUxFKi4KK1RoZSBkaXJlY3RvcnkgY29udGFpbmluZyBGSUxFIGJlY29tZXMgdGhlIGluaXRpYWwgd29ya2luZyBkaXJlY3RvcnkKK2FuZCBzb3VyY2UtZmlsZSBkaXJlY3RvcnkgZm9yIHlvdXIgZGVidWdnZXIuCisKK1lvdSBjYW4gc2V0IHRoZSB2YXJpYWJsZSAnZ3VkLXhkYi1kaXJlY3RvcmllcycgdG8gYSBsaXN0IG9mIHByb2dyYW0gc291cmNlCitkaXJlY3RvcmllcyBpZiB5b3VyIHByb2dyYW0gY29udGFpbnMgc291cmNlcyBmcm9tIG1vcmUgdGhhbiBvbmUgZGlyZWN0b3J5LiIKKyAgKGludGVyYWN0aXZlCisgICAobGlzdCAocmVhZC1mcm9tLW1pbmlidWZmZXIgIlJ1biB4ZGIgKGxpa2UgdGhpcyk6ICIKKwkJCSAgICAgICAoaWYgKGNvbnNwIGd1ZC14ZGItaGlzdG9yeSkKKwkJCQkgICAoY2FyIGd1ZC14ZGItaGlzdG9yeSkKKwkJCQkgInhkYiAiKQorCQkJICAgICAgIG5pbCBuaWwKKwkJCSAgICAgICAnKGd1ZC14ZGItaGlzdG9yeSAuIDEpKSkpCisgIChndWQtb3ZlcmxvYWQtZnVuY3Rpb25zICcoKGd1ZC1tYXNzYWdlLWFyZ3MgLiBndWQteGRiLW1hc3NhZ2UtYXJncykKKwkJCSAgICAoZ3VkLW1hcmtlci1maWx0ZXIgLiBndWQteGRiLW1hcmtlci1maWx0ZXIpCisJCQkgICAgKGd1ZC1maW5kLWZpbGUgLiBndWQteGRiLWZpbmQtZmlsZSkpKQorCisgIChndWQtY29tbW9uLWluaXQgY29tbWFuZC1saW5lKQorCisgIChndWQtZGVmIGd1ZC1icmVhayAgImIgJWY6JWwiICAgICJcQy1iIiAiU2V0IGJyZWFrcG9pbnQgYXQgY3VycmVudCBsaW5lLiIpCisgIChndWQtZGVmIGd1ZC10YnJlYWsgImIgJWY6JWxcXHQiICJcQy10IgorICAgICAgICAgICAiU2V0IHRlbXBvcmFyeSBicmVha3BvaW50IGF0IGN1cnJlbnQgbGluZS4iKQorICAoZ3VkLWRlZiBndWQtcmVtb3ZlICJkYiIgICAgICAgICAiXEMtZCIgIlJlbW92ZSBicmVha3BvaW50IGF0IGN1cnJlbnQgbGluZSIpCisgIChndWQtZGVmIGd1ZC1zdGVwICAgInMgJXAiCSAgICJcQy1zIiAiU3RlcCBvbmUgbGluZSB3aXRoIGRpc3BsYXkuIikKKyAgKGd1ZC1kZWYgZ3VkLW5leHQgICAiUyAlcCIJICAgIlxDLW4iICJTdGVwIG9uZSBsaW5lIChza2lwIGZ1bmN0aW9ucykuIikKKyAgKGd1ZC1kZWYgZ3VkLWNvbnQgICAiYyIJICAgIlxDLXIiICJDb250aW51ZSB3aXRoIGRpc3BsYXkuIikKKyAgKGd1ZC1kZWYgZ3VkLXVwICAgICAidXAgJXAiCSAgICI8IiAgICAiVXAgKG51bWVyaWMgYXJnKSBzdGFjayBmcmFtZXMuIikKKyAgKGd1ZC1kZWYgZ3VkLWRvd24gICAiZG93biAlcCIJICAgIj4iICAgICJEb3duIChudW1lcmljIGFyZykgc3RhY2sgZnJhbWVzLiIpCisgIChndWQtZGVmIGd1ZC1maW5pc2ggImJ1XFx0IiAgICAgICJcQy1mIiAiRmluaXNoIGV4ZWN1dGluZyBjdXJyZW50IGZ1bmN0aW9uLiIpCisgIChndWQtZGVmIGd1ZC1wcmludCAgInAgJWUiICAgICAgICJcQy1wIiAiRXZhbHVhdGUgQyBleHByZXNzaW9uIGF0IHBvaW50LiIpCisKKyAgKHNldHEgY29taW50LXByb21wdC1yZWdleHAgICJePiIpCisgIChtYWtlLWxvY2FsLXZhcmlhYmxlICdndWQteGRiLWFjY3VtdWxhdGlvbikKKyAgKHNldHEgZ3VkLXhkYi1hY2N1bXVsYXRpb24gIiIpCisgIChydW4taG9va3MgJ3hkYi1tb2RlLWhvb2spKQorDAorOzsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOzsgcGVybGRiIGZ1bmN0aW9ucworCis7OzsgSGlzdG9yeSBvZiBhcmd1bWVudCBsaXN0cyBwYXNzZWQgdG8gcGVybGRiLgorKGRlZnZhciBndWQtcGVybGRiLWhpc3RvcnkgbmlsKQorCisoZGVmdW4gZ3VkLXBlcmxkYi1tYXNzYWdlLWFyZ3MgKGZpbGUgYXJncykKKyAgKGNvbnMgIi1kIiAoY29ucyBmaWxlIChjb25zICItZW1hY3MiIGFyZ3MpKSkpCisKKzs7IFRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgRW1hY3Mgd2lsbCBoYW5kIHRoZSBmaWx0ZXIgdGhlIGVudGlyZQorOzsgbWFya2VyIGF0IG9uY2U7IGl0IGNvdWxkIGJlIGJyb2tlbiB1cCBhY3Jvc3Mgc2V2ZXJhbCBzdHJpbmdzLiAgV2UKKzs7IG1pZ2h0IGV2ZW4gcmVjZWl2ZSBhIGJpZyBjaHVuayB3aXRoIHNldmVyYWwgbWFya2VycyBpbiBpdC4gIElmIHdlCis7OyByZWNlaXZlIGEgY2h1bmsgb2YgdGV4dCB3aGljaCBsb29rcyBsaWtlIGl0IG1pZ2h0IGNvbnRhaW4gdGhlCis7OyBiZWdpbm5pbmcgb2YgYSBtYXJrZXIsIHdlIHNhdmUgaXQgaGVyZSBiZXR3ZWVuIGNhbGxzIHRvIHRoZQorOzsgZmlsdGVyLgorKGRlZnZhciBndWQtcGVybGRiLW1hcmtlci1hY2MgIiIpCisKKyhkZWZ1biBndWQtcGVybGRiLW1hcmtlci1maWx0ZXIgKHN0cmluZykKKyAgKHNhdmUtbWF0Y2gtZGF0YQorICAgIChzZXRxIGd1ZC1wZXJsZGItbWFya2VyLWFjYyAoY29uY2F0IGd1ZC1wZXJsZGItbWFya2VyLWFjYyBzdHJpbmcpKQorICAgIChsZXQgKChvdXRwdXQgIiIpKQorCisgICAgICA7OyBQcm9jZXNzIGFsbCB0aGUgY29tcGxldGUgbWFya2VycyBpbiB0aGlzIGNodW5rLgorICAgICAgKHdoaWxlIChzdHJpbmctbWF0Y2ggIl5cMDMyXDAzMlxcKFteOlxuXSpcXCk6XFwoWzAtOV0qXFwpOi4qXG4iCisJCQkgICBndWQtcGVybGRiLW1hcmtlci1hY2MpCisJKHNldHEKKworCSA7OyBFeHRyYWN0IHRoZSBmcmFtZSBwb3NpdGlvbiBmcm9tIHRoZSBtYXJrZXIuCisJIGd1ZC1sYXN0LWZyYW1lCisJIChjb25zIChzdWJzdHJpbmcgZ3VkLXBlcmxkYi1tYXJrZXItYWNjIChtYXRjaC1iZWdpbm5pbmcgMSkgKG1hdGNoLWVuZCAxKSkKKwkgICAgICAgKHN0cmluZy10by1pbnQgKHN1YnN0cmluZyBndWQtcGVybGRiLW1hcmtlci1hY2MKKwkJCQkJIChtYXRjaC1iZWdpbm5pbmcgMikKKwkJCQkJIChtYXRjaC1lbmQgMikpKSkKKworCSA7OyBBcHBlbmQgYW55IHRleHQgYmVmb3JlIHRoZSBtYXJrZXIgdG8gdGhlIG91dHB1dCB3ZSdyZSBnb2luZworCSA7OyB0byByZXR1cm4gLSB3ZSBkb24ndCBpbmNsdWRlIHRoZSBtYXJrZXIgaW4gdGhpcyB0ZXh0LgorCSBvdXRwdXQgKGNvbmNhdCBvdXRwdXQKKwkJCShzdWJzdHJpbmcgZ3VkLXBlcmxkYi1tYXJrZXItYWNjIDAgKG1hdGNoLWJlZ2lubmluZyAwKSkpCisKKwkgOzsgU2V0IHRoZSBhY2N1bXVsYXRvciB0byB0aGUgcmVtYWluaW5nIHRleHQuCisJIGd1ZC1wZXJsZGItbWFya2VyLWFjYyAoc3Vic3RyaW5nIGd1ZC1wZXJsZGItbWFya2VyLWFjYyAobWF0Y2gtZW5kIDApKSkpCisKKyAgICAgIDs7IERvZXMgdGhlIHJlbWFpbmluZyB0ZXh0IGxvb2sgbGlrZSBpdCBtaWdodCBlbmQgd2l0aCB0aGUKKyAgICAgIDs7IGJlZ2lubmluZyBvZiBhbm90aGVyIG1hcmtlcj8gIElmIGl0IGRvZXMsIHRoZW4ga2VlcCBpdCBpbgorICAgICAgOzsgZ3VkLXBlcmxkYi1tYXJrZXItYWNjIHVudGlsIHdlIHJlY2VpdmUgdGhlIHJlc3Qgb2YgaXQuICBTaW5jZSB3ZQorICAgICAgOzsga25vdyB0aGUgZnVsbCBtYXJrZXIgcmVnZXhwIGFib3ZlIGZhaWxlZCwgaXQncyBwcmV0dHkgc2ltcGxlIHRvCisgICAgICA7OyB0ZXN0IGZvciBtYXJrZXIgc3RhcnRzLgorICAgICAgKGlmIChzdHJpbmctbWF0Y2ggIl5cMDMyLipcXCciIGd1ZC1wZXJsZGItbWFya2VyLWFjYykKKwkgIChwcm9nbgorCSAgICA7OyBFdmVyeXRoaW5nIGJlZm9yZSB0aGUgcG90ZW50aWFsIG1hcmtlciBzdGFydCBjYW4gYmUgb3V0cHV0LgorCSAgICAoc2V0cSBvdXRwdXQgKGNvbmNhdCBvdXRwdXQgKHN1YnN0cmluZyBndWQtcGVybGRiLW1hcmtlci1hY2MKKwkJCQkJCSAgIDAgKG1hdGNoLWJlZ2lubmluZyAwKSkpKQorCisJICAgIDs7IEV2ZXJ5dGhpbmcgYWZ0ZXIsIHdlIHNhdmUsIHRvIGNvbWJpbmUgd2l0aCBsYXRlciBpbnB1dC4KKwkgICAgKHNldHEgZ3VkLXBlcmxkYi1tYXJrZXItYWNjCisJCSAgKHN1YnN0cmluZyBndWQtcGVybGRiLW1hcmtlci1hY2MgKG1hdGNoLWJlZ2lubmluZyAwKSkpKQorCisJKHNldHEgb3V0cHV0IChjb25jYXQgb3V0cHV0IGd1ZC1wZXJsZGItbWFya2VyLWFjYykKKwkgICAgICBndWQtcGVybGRiLW1hcmtlci1hY2MgIiIpKQorCisgICAgICBvdXRwdXQpKSkKKworKGRlZnVuIGd1ZC1wZXJsZGItZmluZC1maWxlIChmKQorICAoZmluZC1maWxlLW5vc2VsZWN0IGYpKQorCis7OzsjIyNhdXRvbG9hZAorKGRlZnVuIHBlcmxkYiAoY29tbWFuZC1saW5lKQorICAiUnVuIHBlcmxkYiBvbiBwcm9ncmFtIEZJTEUgaW4gYnVmZmVyICpndWQtRklMRSouCitUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgRklMRSBiZWNvbWVzIHRoZSBpbml0aWFsIHdvcmtpbmcgZGlyZWN0b3J5CithbmQgc291cmNlLWZpbGUgZGlyZWN0b3J5IGZvciB5b3VyIGRlYnVnZ2VyLiIKKyAgKGludGVyYWN0aXZlCisgICAobGlzdCAocmVhZC1mcm9tLW1pbmlidWZmZXIgIlJ1biBwZXJsZGIgKGxpa2UgdGhpcyk6ICIKKwkJCSAgICAgICAoaWYgKGNvbnNwIGd1ZC1wZXJsZGItaGlzdG9yeSkKKwkJCQkgICAoY2FyIGd1ZC1wZXJsZGItaGlzdG9yeSkKKwkJCQkgInBlcmwgIikKKwkJCSAgICAgICBuaWwgbmlsCisJCQkgICAgICAgJyhndWQtcGVybGRiLWhpc3RvcnkgLiAxKSkpKQorICAoZ3VkLW92ZXJsb2FkLWZ1bmN0aW9ucyAnKChndWQtbWFzc2FnZS1hcmdzIC4gZ3VkLXBlcmxkYi1tYXNzYWdlLWFyZ3MpCisJCQkgICAgKGd1ZC1tYXJrZXItZmlsdGVyIC4gZ3VkLXBlcmxkYi1tYXJrZXItZmlsdGVyKQorCQkJICAgIChndWQtZmluZC1maWxlIC4gZ3VkLXBlcmxkYi1maW5kLWZpbGUpCisJCQkgICAgKSkKKworICAoZ3VkLWNvbW1vbi1pbml0IGNvbW1hbmQtbGluZSkKKworICAoZ3VkLWRlZiBndWQtYnJlYWsgICJiICVsIiAgICAgICAgICJcQy1iIiAiU2V0IGJyZWFrcG9pbnQgYXQgY3VycmVudCBsaW5lLiIpCisgIChndWQtZGVmIGd1ZC1yZW1vdmUgImQgJWwiICAgICAgICAgIlxDLWQiICJSZW1vdmUgYnJlYWtwb2ludCBhdCBjdXJyZW50IGxpbmUiKQorICAoZ3VkLWRlZiBndWQtc3RlcCAgICJzIiAgICAgICAgICAgICJcQy1zIiAiU3RlcCBvbmUgc291cmNlIGxpbmUgd2l0aCBkaXNwbGF5LiIpCisgIChndWQtZGVmIGd1ZC1uZXh0ICAgIm4iICAgICAgICAgICAgIlxDLW4iICJTdGVwIG9uZSBsaW5lIChza2lwIGZ1bmN0aW9ucykuIikKKyAgKGd1ZC1kZWYgZ3VkLWNvbnQgICAiYyIgICAgICAgICAgICAiXEMtciIgIkNvbnRpbnVlIHdpdGggZGlzcGxheS4iKQorOyAgKGd1ZC1kZWYgZ3VkLWZpbmlzaCAiZmluaXNoIiAgICAgICAiXEMtZiIgIkZpbmlzaCBleGVjdXRpbmcgY3VycmVudCBmdW5jdGlvbi4iKQorOyAgKGd1ZC1kZWYgZ3VkLXVwICAgICAidXAgJXAiICAgICAgICAiPCIgIlVwIE4gc3RhY2sgZnJhbWVzIChudW1lcmljIGFyZykuIikKKzsgIChndWQtZGVmIGd1ZC1kb3duICAgImRvd24gJXAiICAgICAgIj4iICJEb3duIE4gc3RhY2sgZnJhbWVzIChudW1lcmljIGFyZykuIikKKyAgKGd1ZC1kZWYgZ3VkLXByaW50ICAiJWUiICAgICAgICAgICAiXEMtcCIgIkV2YWx1YXRlIHBlcmwgZXhwcmVzc2lvbiBhdCBwb2ludC4iKQorCisgIChzZXRxIGNvbWludC1wcm9tcHQtcmVnZXhwICJeICBEQjxbMC05XSs+ICIpCisgIChydW4taG9va3MgJ3BlcmxkYi1tb2RlLWhvb2spCisgICkKKworOzsKKzs7IEVuZCBvZiBkZWJ1Z2dlci1zcGVjaWZpYyBpbmZvcm1hdGlvbgorOzsKKworDAorOzs7IFdoZW4gd2Ugc2VuZCBhIGNvbW1hbmQgdG8gdGhlIGRlYnVnZ2VyIHZpYSBndWQtY2FsbCwgaXQncyBhbm5veWluZworOzs7IHRvIHNlZSB0aGUgY29tbWFuZCBhbmQgdGhlIG5ldyBwcm9tcHQgaW5zZXJ0ZWQgaW50byB0aGUgZGVidWdnZXIncworOzs7IGJ1ZmZlcjsgd2UgaGF2ZSBvdGhlciB3YXlzIG9mIGtub3dpbmcgdGhlIGNvbW1hbmQgaGFzIGNvbXBsZXRlZC4KKzs7OworOzs7IElmIHRoZSBidWZmZXIgbG9va3MgbGlrZSB0aGlzOgorOzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OzsgKGdkYikgc2V0IGFyZ3MgZm9vIGJhcgorOzs7IChnZGIpIC0hLQorOzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OzsgKHRoZSAtIS0gbWFya3MgdGhlIGxvY2F0aW9uIG9mIHBvaW50KSwgYW5kIHdlIHR5cGUgYEMteCBTUEMnIGluIGEKKzs7OyBzb3VyY2UgZmlsZSB0byBzZXQgYSBicmVha3BvaW50LCB3ZSB3YW50IHRoZSBidWZmZXIgdG8gZW5kIHVwIGxpa2UKKzs7OyB0aGlzOgorOzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OzsgKGdkYikgc2V0IGFyZ3MgZm9vIGJhcgorOzs7IEJyZWFrcG9pbnQgMSBhdCAweDkyOiBmaWxlIG1ha2UtZG9jZmlsZS5jLCBsaW5lIDQ5LgorOzs7IChnZGIpIC0hLQorOzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tCis7OzsgRXNzZW50aWFsbHksIHRoZSBvbGQgcHJvbXB0IGlzIGRlbGV0ZWQsIGFuZCB0aGUgY29tbWFuZCdzIG91dHB1dAorOzs7IGFuZCB0aGUgbmV3IHByb21wdCB0YWtlIGl0cyBwbGFjZS4KKzs7OworOzs7IE5vdCBlY2hvaW5nIHRoZSBjb21tYW5kIGlzIGVhc3kgZW5vdWdoOyB5b3Ugc2VuZCBpdCBkaXJlY3RseSB1c2luZworOzs7IGNvbWludC1pbnB1dC1zZW5kZXIsIGFuZCBpdCBuZXZlciBlbnRlcnMgdGhlIGJ1ZmZlci4gIEhvd2V2ZXIsCis7OzsgZ2V0dGluZyByaWQgb2YgdGhlIG9sZCBwcm9tcHQgaXMgdHJpY2tpZXI7IHlvdSBkb24ndCB3YW50IHRvIGRvIGl0Cis7Ozsgd2hlbiB5b3Ugc2VuZCB0aGUgY29tbWFuZCwgc2luY2UgdGhhdCB3aWxsIHJlc3VsdCBpbiBhbiBhbm5veWluZworOzs7IGZsaWNrZXIgYXMgdGhlIHByb21wdCBpcyBkZWxldGVkLCByZWRpc3BsYXkgb2NjdXJzIHdoaWxlIEVtYWNzCis7Ozsgd2FpdHMgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgZGVidWdnZXIsIGFuZCB0aGUgbmV3IHByb21wdCBpcworOzs7IGluc2VydGVkLiAgSW5zdGVhZCwgd2UnbGwgd2FpdCB1bnRpbCB3ZSBhY3R1YWxseSBnZXQgc29tZSBvdXRwdXQKKzs7OyBmcm9tIHRoZSBzdWJwcm9jZXNzIGJlZm9yZSB3ZSBkZWxldGUgdGhlIHByb21wdC4gIElmIHRoZSBjb21tYW5kCis7OzsgcHJvZHVjZWQgbm8gb3V0cHV0IG90aGVyIHRoYW4gYSBuZXcgcHJvbXB0LCB0aGF0IHByb21wdCB3aWxsIG1vc3QKKzs7OyBsaWtlbHkgYmUgaW4gdGhlIGZpcnN0IGNodW5rIG9mIG91dHB1dCByZWNlaXZlZCwgc28gd2Ugd2lsbCBkZWxldGUKKzs7OyB0aGUgcHJvbXB0IGFuZCB0aGVuIHJlcGxhY2UgaXQgd2l0aCBhbiBpZGVudGljYWwgb25lLiAgSWYgdGhlCis7OzsgY29tbWFuZCBwcm9kdWNlcyBvdXRwdXQsIHRoZSBwcm9tcHQgaXMgbW92aW5nIGFueXdheSwgc28gdGhlCis7OzsgZmxpY2tlciB3b24ndCBiZSBhbm5veWluZy4KKzs7OworOzs7IFNvIC0gd2hlbiB3ZSB3YW50IHRvIGRlbGV0ZSB0aGUgcHJvbXB0IHVwb24gcmVjZWlwdCBvZiB0aGUgbmV4dAorOzs7IGNodW5rIG9mIGRlYnVnZ2VyIG91dHB1dCwgd2UgcG9zaXRpb24gZ3VkLWRlbGV0ZS1wcm9tcHQtbWFya2VyIGF0Cis7OzsgdGhlIHN0YXJ0IG9mIHRoZSBwcm9tcHQ7IHRoZSBwcm9jZXNzIGZpbHRlciB3aWxsIG5vdGljZSB0aGlzLCBhbmQKKzs7OyBkZWxldGUgYWxsIHRleHQgYmV0d2VlbiBpdCBhbmQgdGhlIHByb2Nlc3Mgb3V0cHV0IG1hcmtlci4gIElmCis7OzsgZ3VkLWRlbGV0ZS1wcm9tcHQtbWFya2VyIHBvaW50cyBub3doZXJlLCB3ZSBsZWF2ZSB0aGUgY3VycmVudAorOzs7IHByb21wdCBhbG9uZS4KKyhkZWZ2YXIgZ3VkLWRlbGV0ZS1wcm9tcHQtbWFya2VyIG5pbCkKKworDAorKGRlZnZhciBnZGJpc2gtY29taW50LW1vZGUtbWFwIChjb3B5LWtleW1hcCBjb21pbnQtbW9kZS1tYXApKQorKGRlZmluZS1rZXkgZ2RiaXNoLWNvbWludC1tb2RlLW1hcCAiXEMtY1xNLVxDLXIiICdndWQtZGlzcGxheS1yZWdpc3RlcnMtYnVmZmVyKQorKGRlZmluZS1rZXkgZ2RiaXNoLWNvbWludC1tb2RlLW1hcCAiXEMtY1xNLVxDLWYiICdndWQtZGlzcGxheS1zdGFjay1idWZmZXIpCisoZGVmaW5lLWtleSBnZGJpc2gtY29taW50LW1vZGUtbWFwICJcQy1jXE0tXEMtYiIgJ2d1ZC1kaXNwbGF5LWJyZWFrcG9pbnRzLWJ1ZmZlcikKKworKG1ha2Utd2luZG93cy1tZW51IGdkYmlzaC1jb21pbnQtbW9kZS1tYXApCisobWFrZS1mcmFtZXMtbWVudSBnZGJpc2gtY29taW50LW1vZGUtbWFwKQorCisoZGVmdW4gZ3VkLW1vZGUgKCkKKyAgIk1ham9yIG1vZGUgZm9yIGludGVyYWN0aW5nIHdpdGggYW4gaW5mZXJpb3IgZGVidWdnZXIgcHJvY2Vzcy4KKworICAgWW91IHN0YXJ0IGl0IHVwIHdpdGggb25lIG9mIHRoZSBjb21tYW5kcyBNLXggZ2RiLCBNLXggc2RiLCBNLXggZGJ4LAorb3IgTS14IHhkYi4gIEVhY2ggZW50cnkgcG9pbnQgZmluaXNoZXMgYnkgZXhlY3V0aW5nIGEgaG9vazsgYGdkYi1tb2RlLWhvb2snLAorYHNkYi1tb2RlLWhvb2snLCBgZGJ4LW1vZGUtaG9vaycgb3IgYHhkYi1tb2RlLWhvb2snIHJlc3BlY3RpdmVseS4KKworQWZ0ZXIgc3RhcnR1cCwgdGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgYXZhaWxhYmxlIGluIGJvdGggdGhlIEdVRAoraW50ZXJhY3Rpb24gYnVmZmVyIGFuZCBhbnkgc291cmNlIGJ1ZmZlciBHVUQgdmlzaXRzIGR1ZSB0byBhIGJyZWFrcG9pbnQgc3RvcAorb3Igc3RlcCBvcGVyYXRpb246CisKK1xcW2d1ZC1icmVha10gc2V0cyBhIGJyZWFrcG9pbnQgYXQgdGhlIGN1cnJlbnQgZmlsZSBhbmQgbGluZS4gIEluIHRoZQorR1VEIGJ1ZmZlciwgdGhlIGN1cnJlbnQgZmlsZSBhbmQgbGluZSBhcmUgdGhvc2Ugb2YgdGhlIGxhc3QgYnJlYWtwb2ludCBvcgorc3RlcC4gIEluIGEgc291cmNlIGJ1ZmZlciwgdGhleSBhcmUgdGhlIGJ1ZmZlcidzIGZpbGUgYW5kIGN1cnJlbnQgbGluZS4KKworXFxbZ3VkLXJlbW92ZV0gcmVtb3ZlcyBicmVha3BvaW50cyBvbiB0aGUgY3VycmVudCBmaWxlIGFuZCBsaW5lLgorCitcXFtndWQtcmVmcmVzaF0gZGlzcGxheXMgaW4gdGhlIHNvdXJjZSB3aW5kb3cgdGhlIGxhc3QgbGluZSByZWZlcnJlZCB0bworaW4gdGhlIGd1ZCBidWZmZXIuCisKK1xcW2d1ZC1zdGVwXSwgXFxbZ3VkLW5leHRdLCBhbmQgXFxbZ3VkLXN0ZXBpXSBkbyBhIHN0ZXAtb25lLWxpbmUsCitzdGVwLW9uZS1saW5lIChub3QgZW50ZXJpbmcgZnVuY3Rpb24gY2FsbHMpLCBhbmQgc3RlcC1vbmUtaW5zdHJ1Y3Rpb24KK2FuZCB0aGVuIHVwZGF0ZSB0aGUgc291cmNlIHdpbmRvdyB3aXRoIHRoZSBjdXJyZW50IGZpbGUgYW5kIHBvc2l0aW9uLgorXFxbZ3VkLWNvbnRdIGNvbnRpbnVlcyBleGVjdXRpb24uCisKK1xcW2d1ZC1wcmludF0gdHJpZXMgdG8gZmluZCB0aGUgbGFyZ2VzdCBDIGx2YWx1ZSBvciBmdW5jdGlvbi1jYWxsIGV4cHJlc3Npb24KK2Fyb3VuZCBwb2ludCwgYW5kIHNlbmRzIGl0IHRvIHRoZSBkZWJ1Z2dlciBmb3IgdmFsdWUgZGlzcGxheS4KKworVGhlIGFib3ZlIGNvbW1hbmRzIGFyZSBjb21tb24gdG8gYWxsIHN1cHBvcnRlZCBkZWJ1Z2dlcnMgZXhjZXB0IHhkYiB3aGljaAorZG9lcyBub3Qgc3VwcG9ydCBzdGVwcGluZyBpbnN0cnVjdGlvbnMuCisKK1VuZGVyIGdkYiwgc2RiIGFuZCB4ZGIsIFxcW2d1ZC10YnJlYWtdIGJlaGF2ZXMgZXhhY3RseSBsaWtlIFxcW2d1ZC1icmVha10sCitleGNlcHQgdGhhdCB0aGUgYnJlYWtwb2ludCBpcyB0ZW1wb3Jhcnk7IHRoYXQgaXMsIGl0IGlzIHJlbW92ZWQgd2hlbgorZXhlY3V0aW9uIHN0b3BzIG9uIGl0LgorCitVbmRlciBnZGIsIGRieCwgYW5kIHhkYiwgXFxbZ3VkLXVwXSBwb3BzIHVwIHRocm91Z2ggYW4gZW5jbG9zaW5nIHN0YWNrCitmcmFtZS4gIFxcW2d1ZC1kb3duXSBkcm9wcyBiYWNrIGRvd24gdGhyb3VnaCBvbmUuCisKK0lmIHlvdSBhcmUgdXNpbmcgZ2RiIG9yIHhkYiwgXFxbZ3VkLWZpbmlzaF0gcnVucyBleGVjdXRpb24gdG8gdGhlIHJldHVybiBmcm9tCit0aGUgY3VycmVudCBmdW5jdGlvbiBhbmQgc3RvcHMuCisKK0FsbCB0aGUga2V5c3Ryb2tlcyBhYm92ZSBhcmUgYWNjZXNzaWJsZSBpbiB0aGUgR1VEIGJ1ZmZlcgord2l0aCB0aGUgcHJlZml4IEMtYywgYW5kIGluIGFsbCBidWZmZXJzIHRocm91Z2ggdGhlIHByZWZpeCBDLXggQy1hLgorCitBbGwgcHJlLWRlZmluZWQgZnVuY3Rpb25zIGZvciB3aGljaCB0aGUgY29uY2VwdCBtYWtlIHNlbnNlIHJlcGVhdAordGhlbXNlbHZlcyB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIHRpbWVzIGlmIHlvdSBnaXZlIGEgcHJlZml4Cithcmd1bWVudC4KKworWW91IG1heSB1c2UgdGhlIGBndWQtZGVmJyBtYWNybyBpbiB0aGUgaW5pdGlhbGl6YXRpb24gaG9vayB0byBkZWZpbmUgb3RoZXIKK2NvbW1hbmRzLgorCitPdGhlciBjb21tYW5kcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgZGVidWdnZXIgcHJvY2VzcyBhcmUgaW5oZXJpdGVkIGZyb20KK2NvbWludCBtb2RlLCB3aGljaCBzZWUuIgorICAoaW50ZXJhY3RpdmUpCisgIChjb21pbnQtbW9kZSkKKyAgKHNldHEgbWFqb3ItbW9kZSAnZ3VkLW1vZGUpCisgIChzZXRxIG1vZGUtbmFtZSAiRGVidWdnZXIiKQorICAoc2V0cSBtb2RlLWxpbmUtcHJvY2VzcyAnKCI6ICVzIikpCisgICh1c2UtbG9jYWwtbWFwIChjb3B5LWtleW1hcCBnZGJpc2gtY29taW50LW1vZGUtbWFwKSkKKyAgKHNldHEgZ3VkLWxhc3QtZnJhbWUgbmlsKQorICAobWFrZS1sb2NhbC12YXJpYWJsZSAnY29taW50LXByb21wdC1yZWdleHApCisgIChtYWtlLWxvY2FsLXZhcmlhYmxlICdndWQtZGVsZXRlLXByb21wdC1tYXJrZXIpCisgIChzZXRxIGd1ZC1kZWxldGUtcHJvbXB0LW1hcmtlciAobWFrZS1tYXJrZXIpKQorICAocnVuLWhvb2tzICdndWQtbW9kZS1ob29rKQorKQorCisoZGVmdmFyIGd1ZC1jb21pbnQtYnVmZmVyIG5pbCkKKworOzsgQ2hvcCBTVFJJTkcgaW50byB3b3JkcyBzZXBhcmF0ZWQgYnkgU1BDIG9yIFRBQiBhbmQgcmV0dXJuIGEgbGlzdCBvZiB0aGVtLgorKGRlZnVuIGd1ZC1jaG9wLXdvcmRzIChzdHJpbmcpCisgIChsZXQgKChpIDApIChiZWcgMCkKKwkobGVuIChsZW5ndGggc3RyaW5nKSkKKwkod29yZHMgbmlsKSkKKyAgICAod2hpbGUgKDwgaSBsZW4pCisgICAgICAoaWYgKG1lbXEgKGFyZWYgc3RyaW5nIGkpICcoP1x0ID8gKSkKKwkgIChwcm9nbgorCSAgICAoc2V0cSB3b3JkcyAoY29ucyAoc3Vic3RyaW5nIHN0cmluZyBiZWcgaSkgd29yZHMpCisJCSAgYmVnICgxKyBpKSkKKwkgICAgKHdoaWxlIChhbmQgKDwgYmVnIGxlbikgKG1lbXEgKGFyZWYgc3RyaW5nIGJlZykgJyg/XHQgPyApKSkKKwkgICAgICAoc2V0cSBiZWcgKDErIGJlZykpKQorCSAgICAoc2V0cSBpICgxKyBiZWcpKSkKKwkoc2V0cSBpICgxKyBpKSkpKQorICAgIChpZiAoPCBiZWcgbGVuKQorCShzZXRxIHdvcmRzIChjb25zIChzdWJzdHJpbmcgc3RyaW5nIGJlZykgd29yZHMpKSkKKyAgICAobnJldmVyc2Ugd29yZHMpKSkKKworKGRlZnZhciBndWQtdGFyZ2V0LW5hbWUgIi0tdW5rbm93bi0tIgorICAiVGhlIGFwcGFyZW50IG5hbWUgb2YgdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgaW4gYSBndWQgYnVmZmVyLgorRm9yIHN1cmUgdGhpcyB0aGUgcm9vdCBzdHJpbmcgdXNlZCBpbiBzbWFzaGluZyB0b2dldGhlciB0aGUgZ3VkIAorYnVmZmVyJ3MgbmFtZSwgZXZlbiBpZiB0aGF0IGRvZXNuJ3QgaGFwcGVuIHRvIGJlIHRoZSBuYW1lIG9mIGEgCitwcm9ncmFtLiIpCisKKzs7IFBlcmZvcm0gaW5pdGlhbGl6YXRpb25zIGNvbW1vbiB0byBhbGwgZGVidWdnZXJzLgorKGRlZnVuIGd1ZC1jb21tb24taW5pdCAoY29tbWFuZC1saW5lKQorICAobGV0KiAoKHdvcmRzIChndWQtY2hvcC13b3JkcyBjb21tYW5kLWxpbmUpKQorCSAocHJvZ3JhbSAoY2FyIHdvcmRzKSkKKwkgKGZpbGUtd29yZCAobGV0ICgodyAoY2RyIHdvcmRzKSkpCisJCSAgICAgICh3aGlsZSAoYW5kIHcgKD0gPy0gKGFyZWYgKGNhciB3KSAwKSkpCisJCQkoc2V0cSB3IChjZHIgdykpKQorCQkgICAgICAoY2FyIHcpKSkKKwkgKGFyZ3MgKGRlbHEgZmlsZS13b3JkIChjZHIgd29yZHMpKSkKKwkgKGZpbGUgKGV4cGFuZC1maWxlLW5hbWUgZmlsZS13b3JkKSkKKwkgKGZpbGVwYXJ0IChmaWxlLW5hbWUtbm9uZGlyZWN0b3J5IGZpbGUpKQorCSAoYnVmZmVyLW5hbWUgKGNvbmNhdCAiKmd1ZC0iIGZpbGVwYXJ0ICIqIikpKQorICAgIChzd2l0Y2gtdG8tYnVmZmVyIGJ1ZmZlci1uYW1lKQorICAgIChzZXRxIGRlZmF1bHQtZGlyZWN0b3J5IChmaWxlLW5hbWUtZGlyZWN0b3J5IGZpbGUpKQorICAgIChvciAoYm9scCkgKG5ld2xpbmUpKQorICAgIChpbnNlcnQgIkN1cnJlbnQgZGlyZWN0b3J5IGlzICIgZGVmYXVsdC1kaXJlY3RvcnkgIlxuIikKKyAgICAobGV0ICgob2xkLWluc3RhbmNlIGdkYi1idWZmZXItaW5zdGFuY2UpKQorICAgICAgKGFwcGx5ICdtYWtlLWNvbWludCAoY29uY2F0ICJndWQtIiBmaWxlcGFydCkgcHJvZ3JhbSBuaWwKKwkgICAgIChndWQtbWFzc2FnZS1hcmdzIGZpbGUgYXJncykpCisgICAgICAoZ3VkLW1vZGUpCisgICAgICAobWFrZS12YXJpYWJsZS1idWZmZXItbG9jYWwgJ29sZC1nZGItYnVmZmVyLWluc3RhbmNlKQorICAgICAgKHNldHEgb2xkLWdkYi1idWZmZXItaW5zdGFuY2Ugb2xkLWluc3RhbmNlKSkKKyAgICAobWFrZS12YXJpYWJsZS1idWZmZXItbG9jYWwgJ2d1ZC10YXJnZXQtbmFtZSkKKyAgICAoc2V0cSBndWQtdGFyZ2V0LW5hbWUgZmlsZXBhcnQpKQorICAoc2V0LXByb2Nlc3MtZmlsdGVyIChnZXQtYnVmZmVyLXByb2Nlc3MgKGN1cnJlbnQtYnVmZmVyKSkgJ2d1ZC1maWx0ZXIpCisgIChzZXQtcHJvY2Vzcy1zZW50aW5lbCAoZ2V0LWJ1ZmZlci1wcm9jZXNzIChjdXJyZW50LWJ1ZmZlcikpICdndWQtc2VudGluZWwpCisgIChndWQtc2V0LWJ1ZmZlcikKKyAgKQorCisoZGVmdW4gZ3VkLXNldC1idWZmZXIgKCkKKyAgKGNvbmQgKChlcSBtYWpvci1tb2RlICdndWQtbW9kZSkKKwkoc2V0cSBndWQtY29taW50LWJ1ZmZlciAoY3VycmVudC1idWZmZXIpKSkpKQorCis7OyBUaGVzZSBmdW5jdGlvbnMgYXJlIHJlc3BvbnNpYmxlIGZvciBpbnNlcnRpbmcgb3V0cHV0IGZyb20geW91ciBkZWJ1Z2dlcgorOzsgaW50byB0aGUgYnVmZmVyLiAgVGhlIGhhcmQgd29yayBpcyBkb25lIGJ5IHRoZSBtZXRob2QgdGhhdCBpcworOzsgdGhlIHZhbHVlIG9mIGd1ZC1tYXJrZXItZmlsdGVyLgorCisoZGVmdW4gZ3VkLWZpbHRlciAocHJvYyBzdHJpbmcpCisgIDs7IEhlcmUncyB3aGVyZSB0aGUgYWN0dWFsIGJ1ZmZlciBpbnNlcnRpb24gaXMgZG9uZQorICAobGV0ICgoaW5oaWJpdC1xdWl0IHQpKQorICAgIChzYXZlLWV4Y3Vyc2lvbgorICAgICAgKHNldC1idWZmZXIgKHByb2Nlc3MtYnVmZmVyIHByb2MpKQorICAgICAgKGxldCAobW92aW5nIG91dHB1dC1hZnRlci1wb2ludCkKKwkoc2F2ZS1leGN1cnNpb24KKwkgIChnb3RvLWNoYXIgKHByb2Nlc3MtbWFyayBwcm9jKSkKKwkgIDs7IElmIHdlIGhhdmUgYmVlbiBzbyByZXF1ZXN0ZWQsIGRlbGV0ZSB0aGUgZGVidWdnZXIgcHJvbXB0LgorCSAgKGlmIChtYXJrZXItYnVmZmVyIGd1ZC1kZWxldGUtcHJvbXB0LW1hcmtlcikKKwkgICAgICAocHJvZ24KKwkJKGRlbGV0ZS1yZWdpb24gKHBvaW50KSBndWQtZGVsZXRlLXByb21wdC1tYXJrZXIpCisJCShzZXQtbWFya2VyIGd1ZC1kZWxldGUtcHJvbXB0LW1hcmtlciBuaWwpKSkKKwkgIChpbnNlcnQtYmVmb3JlLW1hcmtlcnMgKGd1ZC1tYXJrZXItZmlsdGVyIHN0cmluZykpCisJICAoc2V0cSBtb3ZpbmcgKD0gKHBvaW50KSAocHJvY2Vzcy1tYXJrIHByb2MpKSkKKwkgIChzZXRxIG91dHB1dC1hZnRlci1wb2ludCAoPCAocG9pbnQpIChwcm9jZXNzLW1hcmsgcHJvYykpKQorCSAgOzsgQ2hlY2sgZm9yIGEgZmlsZW5hbWUtYW5kLWxpbmUgbnVtYmVyLgorCSAgOzsgRG9uJ3QgZGlzcGxheSB0aGUgc3BlY2lmaWVkIGZpbGUKKwkgIDs7IHVubGVzcyAoMSkgcG9pbnQgaXMgYXQgb3IgYWZ0ZXIgdGhlIHBvc2l0aW9uIHdoZXJlIG91dHB1dCBhcHBlYXJzCisJICA7OyBhbmQgKDIpIHRoaXMgYnVmZmVyIGlzIG9uIHRoZSBzY3JlZW4uCisJICAoaWYgKGFuZCBndWQtbGFzdC1mcmFtZQorCQkgICAobm90IG91dHB1dC1hZnRlci1wb2ludCkKKwkJICAgKGdldC1idWZmZXItd2luZG93IChjdXJyZW50LWJ1ZmZlcikpKQorCSAgICAgIChndWQtZGlzcGxheS1mcmFtZSkpKQorCShpZiBtb3ZpbmcgKGdvdG8tY2hhciAocHJvY2Vzcy1tYXJrIHByb2MpKSkpKSkpCisKKyhkZWZ1biBndWQtcHJvYy1kaWVkIChwcm9jKQorICA7OyBTdG9wIGRpc3BsYXlpbmcgYW4gYXJyb3cgaW4gYSBzb3VyY2UgZmlsZS4KKyAgKHNldHEgb3ZlcmxheS1hcnJvdy1wb3NpdGlvbiBuaWwpCisKKyAgOzsgS2lsbCB0aGUgZHVtbXkgcHJvY2Vzcywgc28gdGhhdCBDLXggQy1jIHdvbid0IHdvcnJ5IGFib3V0IGl0LgorICAoc2F2ZS1leGN1cnNpb24KKyAgICAoc2V0LWJ1ZmZlciAocHJvY2Vzcy1idWZmZXIgcHJvYykpCisgICAgKGtpbGwtcHJvY2VzcworICAgICAoZ2V0LWJ1ZmZlci1wcm9jZXNzCisgICAgICAoZ2RiLWdldC1pbnN0YW5jZS1idWZmZXIgZ2RiLWJ1ZmZlci1pbnN0YW5jZSAnZ2RiLWluZmVyaW9yLWlvKSkpKQorICApCisKKyhkZWZ1biBndWQtc2VudGluZWwgKHByb2MgbXNnKQorICAoY29uZCAoKG51bGwgKGJ1ZmZlci1uYW1lIChwcm9jZXNzLWJ1ZmZlciBwcm9jKSkpCisJIDs7IGJ1ZmZlciBraWxsZWQKKwkgKGd1ZC1wcm9jLWRpZWQgcHJvYykKKwkgKHNldC1wcm9jZXNzLWJ1ZmZlciBwcm9jIG5pbCkpCisJKChtZW1xIChwcm9jZXNzLXN0YXR1cyBwcm9jKSAnKHNpZ25hbCBleGl0KSkKKwkgKGd1ZC1wcm9jLWRpZWQgcHJvYykKKworCSA7OyBGaXggdGhlIG1vZGUgbGluZS4KKwkgKHNldHEgbW9kZS1saW5lLXByb2Nlc3MKKwkgICAgICAgKGNvbmNhdCAiOiAiCisJCSAgICAgICAoc3ltYm9sLW5hbWUgKHByb2Nlc3Mtc3RhdHVzIHByb2MpKSkpCisJIChsZXQqICgob2J1ZiAoY3VycmVudC1idWZmZXIpKSkKKwkgICA7OyBzYXZlLWV4Y3Vyc2lvbiBpc24ndCB0aGUgcmlnaHQgdGhpbmcgaWYKKwkgICA7OyAgcHJvY2Vzcy1idWZmZXIgaXMgY3VycmVudC1idWZmZXIKKwkgICAodW53aW5kLXByb3RlY3QKKwkgICAgICAgKHByb2duCisJCSA7OyBXcml0ZSBzb21ldGhpbmcgaW4gKmNvbXBpbGF0aW9uKiBhbmQgaGFjayBpdHMgbW9kZSBsaW5lLAorCQkgKHNldC1idWZmZXIgKHByb2Nlc3MtYnVmZmVyIHByb2MpKQorCQkgOzsgRm9yY2UgbW9kZSBsaW5lIHJlZGlzcGxheSBzb29uCisJCSAoc2V0LWJ1ZmZlci1tb2RpZmllZC1wIChidWZmZXItbW9kaWZpZWQtcCkpCisJCSAoaWYgKGVvYnApCisJCSAgICAgKGluc2VydCA/XG4gbW9kZS1uYW1lICIgIiBtc2cpCisJCSAgIChzYXZlLWV4Y3Vyc2lvbgorCQkgICAgIChnb3RvLWNoYXIgKHBvaW50LW1heCkpCisJCSAgICAgKGluc2VydCA/XG4gbW9kZS1uYW1lICIgIiBtc2cpKSkKKwkJIDs7IElmIGJ1ZmZlciBhbmQgbW9kZSBsaW5lIHdpbGwgc2hvdyB0aGF0IHRoZSBwcm9jZXNzCisJCSA7OyBpcyBkZWFkLCB3ZSBjYW4gZGVsZXRlIGl0IG5vdy4gIE90aGVyd2lzZSBpdAorCQkgOzsgd2lsbCBzdGF5IGFyb3VuZCB1bnRpbCBNLXggbGlzdC1wcm9jZXNzZXMuCisJCSAoZGVsZXRlLXByb2Nlc3MgcHJvYykpCisJICAgICA7OyBSZXN0b3JlIG9sZCBidWZmZXIsIGJ1dCBkb24ndCByZXN0b3JlIG9sZCBwb2ludAorCSAgICAgOzsgaWYgb2J1ZiBpcyB0aGUgZ3VkIGJ1ZmZlci4KKwkgICAgIChzZXQtYnVmZmVyIG9idWYpKSkpKSkKKworKGRlZnVuIGd1ZC1kaXNwbGF5LWZyYW1lICgpCisgICJGaW5kIGFuZCBvYmV5IHRoZSBsYXN0IGZpbGVuYW1lLWFuZC1saW5lIG1hcmtlciBmcm9tIHRoZSBkZWJ1Z2dlci4KK09iZXlpbmcgaXQgbWVhbnMgZGlzcGxheWluZyBpbiBhbm90aGVyIHdpbmRvdyB0aGUgc3BlY2lmaWVkIGZpbGUgYW5kIGxpbmUuIgorICAoaW50ZXJhY3RpdmUpCisgIChpZiBndWQtbGFzdC1mcmFtZQorICAgKHByb2duCis7ICAgICAoZ3VkLXNldC1idWZmZXIpCisgICAgIChndWQtZGlzcGxheS1saW5lIChjYXIgZ3VkLWxhc3QtZnJhbWUpIChjZHIgZ3VkLWxhc3QtZnJhbWUpKQorICAgICAoc2V0cSBndWQtbGFzdC1sYXN0LWZyYW1lIGd1ZC1sYXN0LWZyYW1lCisJICAgZ3VkLWxhc3QtZnJhbWUgbmlsKSkpKQorCis7OyBNYWtlIHN1cmUgdGhlIGZpbGUgbmFtZWQgVFJVRS1GSUxFIGlzIGluIGEgYnVmZmVyIHRoYXQgYXBwZWFycyBvbiB0aGUgc2NyZWVuCis7OyBhbmQgdGhhdCBpdHMgbGluZSBMSU5FIGlzIHZpc2libGUuCis7OyBQdXQgdGhlIG92ZXJsYXktYXJyb3cgb24gdGhlIGxpbmUgTElORSBpbiB0aGF0IGJ1ZmZlci4KKzs7IE1vc3Qgb2YgdGhlIHRyaWNraW5lc3MgaW4gaGVyZSBjb21lcyBmcm9tIHdhbnRpbmcgdG8gcHJlc2VydmUgdGhlIGN1cnJlbnQKKzs7IHJlZ2lvbi1yZXN0cmljdGlvbiBpZiB0aGF0J3MgcG9zc2libGUuICBXZSB1c2UgYW4gZXhwbGljaXQgZGlzcGxheS1idWZmZXIKKzs7IHRvIGdldCBhcm91bmQgdGhlIGZhY3QgdGhhdCB0aGlzIGlzIGNhbGxlZCBpbnNpZGUgYSBzYXZlLWV4Y3Vyc2lvbi4KKworKGRlZnVuIGd1ZC1kaXNwbGF5LWxpbmUgKHRydWUtZmlsZSBsaW5lKQorICAobGV0KiAoKGJ1ZmZlciAoZ3VkLWZpbmQtZmlsZSB0cnVlLWZpbGUpKQorCSAod2luZG93IChndWQtZGlzcGxheS1zb3VyY2UtYnVmZmVyIGJ1ZmZlcikpCisJIChwb3MpKQorICAgIChpZiAobm90IHdpbmRvdykKKwkoZXJyb3IgImZvbyBiYXIgYmF6IikpCis7OzsgICAgKGlmIChlcXVhbCBidWZmZXIgKGN1cnJlbnQtYnVmZmVyKSkKKzs7OwluaWwKKzs7OyAgICAgIChzZXRxIGJ1ZmZlci1yZWFkLW9ubHkgbmlsKSkKKyAgICAoc2F2ZS1leGN1cnNpb24KKzs7OyAgICAgIChzZXRxIGJ1ZmZlci1yZWFkLW9ubHkgdCkKKyAgICAgIChzZXQtYnVmZmVyIGJ1ZmZlcikKKyAgICAgIChzYXZlLXJlc3RyaWN0aW9uCisJKHdpZGVuKQorCShnb3RvLWxpbmUgbGluZSkKKwkoc2V0cSBwb3MgKHBvaW50KSkKKwkoc2V0cSBvdmVybGF5LWFycm93LXN0cmluZyAiPT4iKQorCShvciBvdmVybGF5LWFycm93LXBvc2l0aW9uCisJICAgIChzZXRxIG92ZXJsYXktYXJyb3ctcG9zaXRpb24gKG1ha2UtbWFya2VyKSkpCisJKHNldC1tYXJrZXIgb3ZlcmxheS1hcnJvdy1wb3NpdGlvbiAocG9pbnQpIChjdXJyZW50LWJ1ZmZlcikpKQorICAgICAgKGNvbmQgKChvciAoPCBwb3MgKHBvaW50LW1pbikpICg+IHBvcyAocG9pbnQtbWF4KSkpCisJICAgICAod2lkZW4pCisJICAgICAoZ290by1jaGFyIHBvcykpKSkKKyAgICAoc2V0LXdpbmRvdy1wb2ludCB3aW5kb3cgb3ZlcmxheS1hcnJvdy1wb3NpdGlvbikpKQorCis7OzsgVGhlIGd1ZC1jYWxsIGZ1bmN0aW9uIG11c3QgZG8gdGhlIHJpZ2h0IHRoaW5nIHdoZXRoZXIgaXRzIGludm9raW5nCis7Ozsga2V5c3Ryb2tlIGlzIGZyb20gdGhlIEdVRCBidWZmZXIgaXRzZWxmICh2aWEgbWFqb3ItbW9kZSBiaW5kaW5nKQorOzs7IG9yIGEgQyBidWZmZXIuICBJbiB0aGUgZm9ybWVyIGNhc2UsIHdlIHdhbnQgdG8gc3VwcGx5IGRhdGEgZnJvbQorOzs7IGd1ZC1sYXN0LWZyYW1lLiAgSGVyZSdzIGhvdyB3ZSBkbyBpdDoKKworKGRlZnVuIGd1ZC1mb3JtYXQtY29tbWFuZCAoc3RyIGFyZykKKyAgKGxldCAoKGluc291cmNlIChub3QgKGVxIChjdXJyZW50LWJ1ZmZlcikgZ3VkLWNvbWludC1idWZmZXIpKSkpCisgICAgKGlmIChzdHJpbmctbWF0Y2ggIlxcKC4qXFwpJWZcXCguKlxcKSIgc3RyKQorCShzZXRxIHN0ciAoY29uY2F0CisJCSAgIChzdWJzdHJpbmcgc3RyIChtYXRjaC1iZWdpbm5pbmcgMSkgKG1hdGNoLWVuZCAxKSkKKwkJICAgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgKGlmIGluc291cmNlCisJCQkJCSAgICAgICAoYnVmZmVyLWZpbGUtbmFtZSkKKwkJCQkJICAgICAoY2FyIGd1ZC1sYXN0LWZyYW1lKSkpCisJCSAgIChzdWJzdHJpbmcgc3RyIChtYXRjaC1iZWdpbm5pbmcgMikgKG1hdGNoLWVuZCAyKSkpKSkKKyAgICAoaWYgKHN0cmluZy1tYXRjaCAiXFwoLipcXCklZFxcKC4qXFwpIiBzdHIpCisJKHNldHEgc3RyIChjb25jYXQKKwkJICAgKHN1YnN0cmluZyBzdHIgKG1hdGNoLWJlZ2lubmluZyAxKSAobWF0Y2gtZW5kIDEpKQorCQkgICAoZmlsZS1uYW1lLWRpcmVjdG9yeSAoaWYgaW5zb3VyY2UKKwkJCQkJICAgIChidWZmZXItZmlsZS1uYW1lKQorCQkJCQkgIChjYXIgZ3VkLWxhc3QtZnJhbWUpKSkKKwkJICAgKHN1YnN0cmluZyBzdHIgKG1hdGNoLWJlZ2lubmluZyAyKSAobWF0Y2gtZW5kIDIpKSkpKQorICAgIChpZiAoc3RyaW5nLW1hdGNoICJcXCguKlxcKSVsXFwoLipcXCkiIHN0cikKKwkoc2V0cSBzdHIgKGNvbmNhdAorCQkgICAoc3Vic3RyaW5nIHN0ciAobWF0Y2gtYmVnaW5uaW5nIDEpIChtYXRjaC1lbmQgMSkpCisJCSAgIChpZiBpbnNvdXJjZQorCQkgICAgICAgKHNhdmUtZXhjdXJzaW9uCisJCQkgKGJlZ2lubmluZy1vZi1saW5lKQorCQkJIChzYXZlLXJlc3RyaWN0aW9uICh3aWRlbikgCisJCQkJCSAgICgxKyAoY291bnQtbGluZXMgMSAocG9pbnQpKSkpKQorCQkgICAgIChjZHIgZ3VkLWxhc3QtZnJhbWUpKQorCQkgICAoc3Vic3RyaW5nIHN0ciAobWF0Y2gtYmVnaW5uaW5nIDIpIChtYXRjaC1lbmQgMikpKSkpCisgICAgKGlmIChzdHJpbmctbWF0Y2ggIlxcKC4qXFwpJWVcXCguKlxcKSIgc3RyKQorCShzZXRxIHN0ciAoY29uY2F0CisJCSAgIChzdWJzdHJpbmcgc3RyIChtYXRjaC1iZWdpbm5pbmcgMSkgKG1hdGNoLWVuZCAxKSkKKwkJICAgKGZpbmQtYy1leHByKQorCQkgICAoc3Vic3RyaW5nIHN0ciAobWF0Y2gtYmVnaW5uaW5nIDIpIChtYXRjaC1lbmQgMikpKSkpCisgICAgKGlmIChzdHJpbmctbWF0Y2ggIlxcKC4qXFwpJWFcXCguKlxcKSIgc3RyKQorCShzZXRxIHN0ciAoY29uY2F0CisJCSAgIChzdWJzdHJpbmcgc3RyIChtYXRjaC1iZWdpbm5pbmcgMSkgKG1hdGNoLWVuZCAxKSkKKwkJICAgKGd1ZC1yZWFkLWFkZHJlc3MpCisJCSAgIChzdWJzdHJpbmcgc3RyIChtYXRjaC1iZWdpbm5pbmcgMikgKG1hdGNoLWVuZCAyKSkpKSkKKyAgICAoaWYgKHN0cmluZy1tYXRjaCAiXFwoLipcXCklcFxcKC4qXFwpIiBzdHIpCisJKHNldHEgc3RyIChjb25jYXQKKwkJICAgKHN1YnN0cmluZyBzdHIgKG1hdGNoLWJlZ2lubmluZyAxKSAobWF0Y2gtZW5kIDEpKQorCQkgICAoaWYgYXJnIChpbnQtdG8tc3RyaW5nIGFyZykgIiIpCisJCSAgIChzdWJzdHJpbmcgc3RyIChtYXRjaC1iZWdpbm5pbmcgMikgKG1hdGNoLWVuZCAyKSkpKSkKKyAgICApCisgIHN0cgorICApCisKKyhkZWZ1biBndWQtcmVhZC1hZGRyZXNzICgpCisgICJSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29yZS1hZGRyZXNzIGZvdW5kIGluIHRoZSBidWZmZXIgYXQgcG9pbnQuIgorICAoc2F2ZS1leGN1cnNpb24KKyAgICAobGV0ICgocHQgKHBvaW50KSkgZm91bmQgYmVnaW4pCisgICAgICAoc2V0cSBmb3VuZCAoaWYgKHNlYXJjaC1iYWNrd2FyZCAiMHgiICgtIHB0IDcpIHQpIChwb2ludCkpKQorICAgICAgKGNvbmQKKyAgICAgICAoZm91bmQgKGZvcndhcmQtY2hhciAyKQorCSAgICAgIChidWZmZXItc3Vic3RyaW5nIGZvdW5kCisJCQkJKHByb2duIChyZS1zZWFyY2gtZm9yd2FyZCAiW14wLTlhLWZdIikKKwkJCQkgICAgICAgKGZvcndhcmQtY2hhciAtMSkKKwkJCQkgICAgICAgKHBvaW50KSkpKQorICAgICAgICh0IChzZXRxIGJlZ2luIChwcm9nbiAocmUtc2VhcmNoLWJhY2t3YXJkICJbXjAtOV0iKSAKKwkJCSAgICAgKGZvcndhcmQtY2hhciAxKQorCQkJICAgICAocG9pbnQpKSkKKwkgIChmb3J3YXJkLWNoYXIgMSkKKwkgIChyZS1zZWFyY2gtZm9yd2FyZCAiW14wLTldIikKKwkgIChmb3J3YXJkLWNoYXIgLTEpCisJICAoYnVmZmVyLXN1YnN0cmluZyBiZWdpbiAocG9pbnQpKSkpKSkpCisKKyhkZWZ1biBndWQtY2FsbCAoZm10ICZvcHRpb25hbCBhcmcpCisgIChsZXQgKChtc2cgKGd1ZC1mb3JtYXQtY29tbWFuZCBmbXQgYXJnKSkpCisgICAgKG1lc3NhZ2UgIkNvbW1hbmQ6ICVzIiBtc2cpCisgICAgKHNpdC1mb3IgMCkKKyAgICAoZ3VkLWJhc2ljLWNhbGwgbXNnKSkpCisKKyhkZWZ1biBndWQtYmFzaWMtY2FsbCAoY29tbWFuZCkKKyAgIkludm9rZSB0aGUgZGVidWdnZXIgQ09NTUFORCBkaXNwbGF5aW5nIHNvdXJjZSBpbiBvdGhlciB3aW5kb3cuIgorICAoaW50ZXJhY3RpdmUpCisgIChndWQtc2V0LWJ1ZmZlcikKKyAgKGxldCAoKHByb2MgKGdldC1idWZmZXItcHJvY2VzcyBndWQtY29taW50LWJ1ZmZlcikpKQorCisgICAgOzsgQXJyYW5nZSBmb3IgdGhlIGN1cnJlbnQgcHJvbXB0IHRvIGdldCBkZWxldGVkLgorICAgIChzYXZlLWV4Y3Vyc2lvbgorICAgICAgKHNldC1idWZmZXIgZ3VkLWNvbWludC1idWZmZXIpCisgICAgICAoZ290by1jaGFyIChwcm9jZXNzLW1hcmsgcHJvYykpCisgICAgICAoYmVnaW5uaW5nLW9mLWxpbmUpCisgICAgICAoaWYgKGxvb2tpbmctYXQgY29taW50LXByb21wdC1yZWdleHApCisJICAoc2V0LW1hcmtlciBndWQtZGVsZXRlLXByb21wdC1tYXJrZXIgKHBvaW50KSkpCisgICAgICAoYXBwbHkgY29taW50LWlucHV0LXNlbmRlciAobGlzdCBwcm9jIGNvbW1hbmQpKSkpKQorCisoZGVmdW4gZ3VkLXJlZnJlc2ggKCZvcHRpb25hbCBhcmcpCisgICJGaXggdXAgYSBwb3NzaWJseSBnYXJibGVkIGRpc3BsYXksIGFuZCByZWRyYXcgdGhlIGFycm93LiIKKyAgKGludGVyYWN0aXZlICJQIikKKyAgKHJlY2VudGVyIGFyZykKKyAgKG9yIGd1ZC1sYXN0LWZyYW1lIChzZXRxIGd1ZC1sYXN0LWZyYW1lIGd1ZC1sYXN0LWxhc3QtZnJhbWUpKQorICAoZ3VkLWRpc3BsYXktZnJhbWUpKQorDAorOzs7IENvZGUgZm9yIHBhcnNpbmcgZXhwcmVzc2lvbnMgb3V0IG9mIEMgY29kZS4gIFRoZSBzaW5nbGUgZW50cnkgcG9pbnQgaXMKKzs7OyBmaW5kLWMtZXhwciwgd2hpY2ggdHJpZXMgdG8gcmV0dXJuIGFuIGx2YWx1ZSBleHByZXNzaW9uIGZyb20gYXJvdW5kIHBvaW50LgorOzs7Cis7OzsgVGhlIHJlc3Qgb2YgdGhpcyBmaWxlIGlzIGEgaGFja2VkIHZlcnNpb24gb2YgZ2Ric3JjLmVsIGJ5Cis7OzsgRGViYnkgQXllcnMgPGF5ZXJzQGFzYy5zbGIuY29tPiwKKzs7OyBSaWNoIFNjaGFlZmVyIDxzY2hhZWZlckBhc2Muc2xiLmNvbT4gU2NobHVtYmVyZ2VyLCBBdXN0aW4sIFR4LgorCisoZGVmdW4gZmluZC1jLWV4cHIgKCkKKyAgIlJldHVybnMgdGhlIEMgZXhwciB0aGF0IHN1cnJvdW5kcyBwb2ludC4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHNhdmUtZXhjdXJzaW9uCisgICAgKGxldCAoKHApIChleHByKSAodGVzdC1leHByKSkKKyAgICAgIChzZXRxIHAgKHBvaW50KSkKKyAgICAgIChzZXRxIGV4cHIgKGV4cHItY3VyKSkKKyAgICAgIChzZXRxIHRlc3QtZXhwciAoZXhwci1wcmV2KSkKKyAgICAgICh3aGlsZSAoZXhwci1jb21wb3VuZCB0ZXN0LWV4cHIgZXhwcikKKwkoc2V0cSBleHByIChjb25zIChjYXIgdGVzdC1leHByKSAoY2RyIGV4cHIpKSkKKwkoZ290by1jaGFyIChjYXIgZXhwcikpCisJKHNldHEgdGVzdC1leHByIChleHByLXByZXYpKSkKKyAgICAgIChnb3RvLWNoYXIgcCkKKyAgICAgIChzZXRxIHRlc3QtZXhwciAoZXhwci1uZXh0KSkKKyAgICAgICh3aGlsZSAoZXhwci1jb21wb3VuZCBleHByIHRlc3QtZXhwcikKKwkoc2V0cSBleHByIChjb25zIChjYXIgZXhwcikgKGNkciB0ZXN0LWV4cHIpKSkKKwkoc2V0cSB0ZXN0LWV4cHIgKGV4cHItbmV4dCkpCisJKQorICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKGNhciBleHByKSAoY2RyIGV4cHIpKSkpKQorCisoZGVmdW4gZXhwci1jdXIgKCkKKyAgIlJldHVybnMgdGhlIGV4cHIgdGhhdCBwb2ludCBpcyBpbjsgcG9pbnQgaXMgc2V0IHRvIGJlZ2lubmluZyBvZiBleHByLgorVGhlIGV4cHIgaXMgcmVwcmVzZW50ZWQgYXMgYSBjb25zIGNlbGwsIHdoZXJlIHRoZSBjYXIgc3BlY2lmaWVzIHRoZSBwb2ludCBpbgordGhlIGN1cnJlbnQgYnVmZmVyIHRoYXQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgZXhwciBhbmQgdGhlIGNkciBzcGVjaWZpZXMgCit0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGV4cHIuIgorICAobGV0ICgocCAocG9pbnQpKSAoYmVnaW4pIChlbmQpKQorICAgIChleHByLWJhY2t3YXJkLXNleHApCisgICAgKHNldHEgYmVnaW4gKHBvaW50KSkKKyAgICAoZXhwci1mb3J3YXJkLXNleHApCisgICAgKHNldHEgZW5kIChwb2ludCkpCisgICAgKGlmICg+PSBwIGVuZCkgCisJKHByb2duCisJIChzZXRxIGJlZ2luIHApCisJIChnb3RvLWNoYXIgcCkKKwkgKGV4cHItZm9yd2FyZC1zZXhwKQorCSAoc2V0cSBlbmQgKHBvaW50KSkKKwkgKQorICAgICAgKQorICAgIChnb3RvLWNoYXIgYmVnaW4pCisgICAgKGNvbnMgYmVnaW4gZW5kKSkpCisKKyhkZWZ1biBleHByLWJhY2t3YXJkLXNleHAgKCkKKyAgIlZlcnNpb24gb2YgYGJhY2t3YXJkLXNleHAnIHRoYXQgY2F0Y2hlcyBlcnJvcnMuIgorICAoY29uZGl0aW9uLWNhc2UgbmlsCisgICAgICAoYmFja3dhcmQtc2V4cCkKKyAgICAoZXJyb3IgdCkpKQorCisoZGVmdW4gZXhwci1mb3J3YXJkLXNleHAgKCkKKyAgIlZlcnNpb24gb2YgYGZvcndhcmQtc2V4cCcgdGhhdCBjYXRjaGVzIGVycm9ycy4iCisgIChjb25kaXRpb24tY2FzZSBuaWwKKyAgICAgKGZvcndhcmQtc2V4cCkKKyAgICAoZXJyb3IgdCkpKQorCisoZGVmdW4gZXhwci1wcmV2ICgpCisgICJSZXR1cm5zIHRoZSBwcmV2aW91cyBleHByLCBwb2ludCBpcyBzZXQgdG8gYmVnaW5uaW5nIG9mIHRoYXQgZXhwci4KK1RoZSBleHByIGlzIHJlcHJlc2VudGVkIGFzIGEgY29ucyBjZWxsLCB3aGVyZSB0aGUgY2FyIHNwZWNpZmllcyB0aGUgcG9pbnQgaW4KK3RoZSBjdXJyZW50IGJ1ZmZlciB0aGF0IG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGV4cHIgYW5kIHRoZSBjZHIgc3BlY2lmaWVzIAordGhlIGNoYXJhY3RlciBhZnRlciB0aGUgZW5kIG9mIHRoZSBleHByIgorICAobGV0ICgoYmVnaW4pIChlbmQpKQorICAgIChleHByLWJhY2t3YXJkLXNleHApCisgICAgKHNldHEgYmVnaW4gKHBvaW50KSkKKyAgICAoZXhwci1mb3J3YXJkLXNleHApCisgICAgKHNldHEgZW5kIChwb2ludCkpCisgICAgKGdvdG8tY2hhciBiZWdpbikKKyAgICAoY29ucyBiZWdpbiBlbmQpKSkKKworKGRlZnVuIGV4cHItbmV4dCAoKQorICAiUmV0dXJucyB0aGUgZm9sbG93aW5nIGV4cHIsIHBvaW50IGlzIHNldCB0byBiZWdpbm5pbmcgb2YgdGhhdCBleHByLgorVGhlIGV4cHIgaXMgcmVwcmVzZW50ZWQgYXMgYSBjb25zIGNlbGwsIHdoZXJlIHRoZSBjYXIgc3BlY2lmaWVzIHRoZSBwb2ludCBpbgordGhlIGN1cnJlbnQgYnVmZmVyIHRoYXQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgZXhwciBhbmQgdGhlIGNkciBzcGVjaWZpZXMgCit0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGV4cHIuIgorICAobGV0ICgoYmVnaW4pIChlbmQpKQorICAgIChleHByLWZvcndhcmQtc2V4cCkKKyAgICAoZXhwci1mb3J3YXJkLXNleHApCisgICAgKHNldHEgZW5kIChwb2ludCkpCisgICAgKGV4cHItYmFja3dhcmQtc2V4cCkKKyAgICAoc2V0cSBiZWdpbiAocG9pbnQpKQorICAgIChjb25zIGJlZ2luIGVuZCkpKQorCisoZGVmdW4gZXhwci1jb21wb3VuZC1zZXAgKHNwYW4tc3RhcnQgc3Bhbi1lbmQpCisgICJSZXR1cm5zICcuJyBmb3IgJy0+JyAmICcuJywgcmV0dXJucyAnICcgZm9yIHdoaXRlIHNwYWNlLAorcmV0dXJucyAnPycgZm9yIG90aGVyIHB1bmN0dWF0aW9uLiIKKyAgKGxldCAoKHJlc3VsdCA/ICkKKwkoc3ludGF4KSkKKyAgICAod2hpbGUgKDwgc3Bhbi1zdGFydCBzcGFuLWVuZCkKKyAgICAgIChzZXRxIHN5bnRheCAoY2hhci1zeW50YXggKGNoYXItYWZ0ZXIgc3Bhbi1zdGFydCkpKQorICAgICAgKGNvbmQKKyAgICAgICAoKD0gc3ludGF4ID8gKSB0KQorICAgICAgICgoPSBzeW50YXggPy4pIChzZXRxIHN5bnRheCAoY2hhci1hZnRlciBzcGFuLXN0YXJ0KSkKKwkoY29uZCAKKwkgKCg9IHN5bnRheCA/LikgKHNldHEgcmVzdWx0ID8uKSkKKwkgKChhbmQgKD0gc3ludGF4ID8tKSAoPSAoY2hhci1hZnRlciAoKyBzcGFuLXN0YXJ0IDEpKSA/PikpCisJICAoc2V0cSByZXN1bHQgPy4pCisJICAoc2V0cSBzcGFuLXN0YXJ0ICgrIHNwYW4tc3RhcnQgMSkpKQorCSAodCAoc2V0cSBzcGFuLXN0YXJ0IHNwYW4tZW5kKQorCSAgICAoc2V0cSByZXN1bHQgPz8pKSkpKQorICAgICAgKHNldHEgc3Bhbi1zdGFydCAoKyBzcGFuLXN0YXJ0IDEpKSkKKyAgICByZXN1bHQpKQorCisoZGVmdW4gZXhwci1jb21wb3VuZCAoZmlyc3Qgc2Vjb25kKQorICAiTm9uLW5pbCBpZiBjb25jYXRlbmF0aW5nIEZJUlNUIGFuZCBTRUNPTkQgbWFrZXMgYSBzaW5nbGUgQyB0b2tlbi4KK1RoZSB0d28gZXhwcnMgYXJlIHJlcHJlc2VudGVkIGFzIGEgY29ucyBjZWxscywgd2hlcmUgdGhlIGNhciAKK3NwZWNpZmllcyB0aGUgcG9pbnQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyIHRoYXQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgCitleHByIGFuZCB0aGUgY2RyIHNwZWNpZmllcyB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGV4cHIuCitMaW5rIGV4cHJzIG9mIHRoZSBmb3JtOgorICAgICAgRXhwciAtPiBFeHByCisgICAgICBFeHByIC4gRXhwcgorICAgICAgRXhwciAoRXhwcikKKyAgICAgIEV4cHIgW0V4cHJdCisgICAgICAoRXhwcikgRXhwcgorICAgICAgW0V4cHJdIEV4cHIiCisgIChsZXQgKChzcGFuLXN0YXJ0IChjZHIgZmlyc3QpKQorCShzcGFuLWVuZCAoY2FyIHNlY29uZCkpCisJKHN5bnRheCkpCisgICAgKHNldHEgc3ludGF4IChleHByLWNvbXBvdW5kLXNlcCBzcGFuLXN0YXJ0IHNwYW4tZW5kKSkKKyAgICAoY29uZAorICAgICAoKD0gKGNhciBmaXJzdCkgKGNhciBzZWNvbmQpKSBuaWwpCisgICAgICgoPSAoY2RyIGZpcnN0KSAoY2RyIHNlY29uZCkpIG5pbCkKKyAgICAgKCg9IHN5bnRheCA/LikgdCkKKyAgICAgKCg9IHN5bnRheCA/ICkKKwkgKHNldHEgc3Bhbi1zdGFydCAoY2hhci1hZnRlciAoLSBzcGFuLXN0YXJ0IDEpKSkKKwkgKHNldHEgc3Bhbi1lbmQgKGNoYXItYWZ0ZXIgc3Bhbi1lbmQpKQorCSAoY29uZAorCSAgKCg9IHNwYW4tc3RhcnQgPykgKSB0ICkKKwkgICgoPSBzcGFuLXN0YXJ0ID9dICkgdCApCisgICAgICAgICAgKCg9IHNwYW4tZW5kID8oICkgdCApCisJICAoKD0gc3Bhbi1lbmQgP1sgKSB0ICkKKwkgICh0IG5pbCkpCisJICkKKyAgICAgKHQgbmlsKSkpKQorCisocHJvdmlkZSAnZ3VkKQorCis7OzsgZ3VkLmVsIGVuZHMgaGVyZQpkaWZmIC0tZ2l0IGEvZ2RiL2dkYmFyY2guYyBiL2dkYi9nZGJhcmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0ZmE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9nZGJhcmNoLmMKQEAgLTAsMCArMSwzNjAgQEAKKy8qIFNlbWktZHluYW1pYyBhcmNoaXRlY3R1cmUgc3VwcG9ydCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTgsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisKKworCisvKiBOb24temVybyBpZiB3ZSB3YW50IHRvIHRyYWNlIGFyY2hpdGVjdHVyZSBjb2RlLiAgKi8KKworI2lmbmRlZiBHREJBUkNIX0RFQlVHCisjZGVmaW5lIEdEQkFSQ0hfREVCVUcgMAorI2VuZGlmCitpbnQgZ2RiYXJjaF9kZWJ1ZyA9IEdEQkFSQ0hfREVCVUc7CisKKworLyogRnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHRhcmdldC4gICovCisKKyNpZmRlZiBUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFCisvKiBjb21wYXQgLSBDYXRjaCBvbGQgdGFyZ2V0cyB0aGF0IGV4cGVjdCBhIHNlbGVjdGFibGUgYnl0ZS1vcmRlciB0bworICAgZGVmYXVsdCB0byBCSUdfRU5ESUFOICovCisjaWZuZGVmIFRBUkdFVF9CWVRFX09SREVSX0RFRkFVTFQKKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVJfREVGQVVMVCBCSUdfRU5ESUFOCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBUQVJHRVRfQllURV9PUkRFUl9ERUZBVUxUCisvKiBjb21wYXQgLSBDYXRjaCBvbGQgbm9uIGJ5dGUtb3JkZXIgc2VsZWN0YWJsZSB0YXJnZXRzIHRoYXQgZG8gbm90CisgICBkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVJfREVGQVVMVCBhbmQgaW5zdGVhZCBleHBlY3QKKyAgIFRBUkdFVF9CWVRFX09SREVSIHRvIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQuICBGb3IgdGFyZ2V0cyB0aGF0CisgICBkZWZpbmVkIG5laXRoZXIgVEFSR0VUX0JZVEVfT1JERVIgbm9yIFRBUkdFVF9CWVRFX09SREVSX0RFRkFVTFQgdGhlCisgICBiZWxvdyB3aWxsIGdldCBhIHN0cmFuZ2UgY29tcGlsZXIgd2FybmluZy4gKi8KKyNkZWZpbmUgVEFSR0VUX0JZVEVfT1JERVJfREVGQVVMVCBUQVJHRVRfQllURV9PUkRFUgorI2VuZGlmCitpbnQgdGFyZ2V0X2J5dGVfb3JkZXIgPSBUQVJHRVRfQllURV9PUkRFUl9ERUZBVUxUOworaW50IHRhcmdldF9ieXRlX29yZGVyX2F1dG8gPSAxOworCisvKiBDaGFpbiBjb250YWluaW5nIHRoZSBcInNldCBlbmRpYW5cIiBjb21tYW5kcy4gICovCitzdGF0aWMgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmVuZGlhbmxpc3QgPSBOVUxMOworCisvKiBDYWxsZWQgYnkgYGBzaG93IGVuZGlhbicnLiAgKi8KK3N0YXRpYyB2b2lkIHNob3dfZW5kaWFuIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZAorc2hvd19lbmRpYW4gKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoYXIgKm1zZyA9CisgICAgKFRBUkdFVF9CWVRFX09SREVSX0FVVE8KKyAgICAgPyAiVGhlIHRhcmdldCBlbmRpYW5uZXNzIGlzIHNldCBhdXRvbWF0aWNhbGx5IChjdXJyZW50bHkgJXMgZW5kaWFuKVxuIgorICAgICA6ICJUaGUgdGFyZ2V0IGlzIGFzc3VtZWQgdG8gYmUgJXMgZW5kaWFuXG4iKTsKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKG1zZywgKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4gPyAiYmlnIiA6ICJsaXR0bGUiKSk7Cit9CisKKy8qIENhbGxlZCBpZiB0aGUgdXNlciBlbnRlcnMgYGBzZXQgZW5kaWFuJycgd2l0aG91dCBhbiBhcmd1bWVudC4gICovCitzdGF0aWMgdm9pZCBzZXRfZW5kaWFuIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZAorc2V0X2VuZGlhbiAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcInNldCBlbmRpYW5cIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IFwiYXV0b1wiLCBcImJpZ1wiIG9yIFwibGl0dGxlXCIuXG4iKTsKKyAgc2hvd19lbmRpYW4gKGFyZ3MsIGZyb21fdHR5KTsKK30KKworLyogQ2FsbGVkIGJ5IGBgc2V0IGVuZGlhbiBiaWcnJy4gICovCitzdGF0aWMgdm9pZCBzZXRfZW5kaWFuX2JpZyBQQVJBTVMgKChjaGFyICosIGludCkpOworc3RhdGljIHZvaWQKK3NldF9lbmRpYW5fYmlnIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAoVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRV9QKQorICAgIHsKKyAgICAgIHRhcmdldF9ieXRlX29yZGVyID0gQklHX0VORElBTjsKKyAgICAgIHRhcmdldF9ieXRlX29yZGVyX2F1dG8gPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiQnl0ZSBvcmRlciBpcyBub3Qgc2VsZWN0YWJsZS4iKTsKKyAgICAgIHNob3dfZW5kaWFuIChhcmdzLCBmcm9tX3R0eSk7CisgICAgfQorfQorCisvKiBDYWxsZWQgYnkgYGBzZXQgZW5kaWFuIGxpdHRsZScnLiAgKi8KK3N0YXRpYyB2b2lkIHNldF9lbmRpYW5fbGl0dGxlIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZAorc2V0X2VuZGlhbl9saXR0bGUgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGlmIChUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFX1ApCisgICAgeworICAgICAgdGFyZ2V0X2J5dGVfb3JkZXIgPSBMSVRUTEVfRU5ESUFOOworICAgICAgdGFyZ2V0X2J5dGVfb3JkZXJfYXV0byA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJCeXRlIG9yZGVyIGlzIG5vdCBzZWxlY3RhYmxlLiIpOworICAgICAgc2hvd19lbmRpYW4gKGFyZ3MsIGZyb21fdHR5KTsKKyAgICB9Cit9CisKKy8qIENhbGxlZCBieSBgYHNldCBlbmRpYW4gYXV0bycnLiAgKi8KK3N0YXRpYyB2b2lkIHNldF9lbmRpYW5fYXV0byBQQVJBTVMgKChjaGFyICosIGludCkpOworc3RhdGljIHZvaWQKK3NldF9lbmRpYW5fYXV0byAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaWYgKFRBUkdFVF9CWVRFX09SREVSX1NFTEVDVEFCTEVfUCkKKyAgICB7CisgICAgICB0YXJnZXRfYnl0ZV9vcmRlcl9hdXRvID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIkJ5dGUgb3JkZXIgaXMgbm90IHNlbGVjdGFibGUuIik7CisgICAgICBzaG93X2VuZGlhbiAoYXJncywgZnJvbV90dHkpOworICAgIH0KK30KKworLyogU2V0IHRoZSBlbmRpYW5uZXNzIGZyb20gYSBCRkQuICAqLworc3RhdGljIHZvaWQgc2V0X2VuZGlhbl9mcm9tX2ZpbGUgUEFSQU1TICgoYmZkICopKTsKK3N0YXRpYyB2b2lkCitzZXRfZW5kaWFuX2Zyb21fZmlsZSAoYWJmZCkKKyAgICAgYmZkICphYmZkOworeworICBpZiAoVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRV9QKQorICAgIHsKKyAgICAgIGludCB3YW50OworICAgICAgCisgICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQorCXdhbnQgPSBCSUdfRU5ESUFOOworICAgICAgZWxzZQorCXdhbnQgPSBMSVRUTEVfRU5ESUFOOworICAgICAgaWYgKFRBUkdFVF9CWVRFX09SREVSX0FVVE8pCisJdGFyZ2V0X2J5dGVfb3JkZXIgPSB3YW50OworICAgICAgZWxzZSBpZiAoVEFSR0VUX0JZVEVfT1JERVIgIT0gd2FudCkKKwl3YXJuaW5nICgiJXMgZW5kaWFuIGZpbGUgZG9lcyBub3QgbWF0Y2ggJXMgZW5kaWFuIHRhcmdldC4iLAorCQkgd2FudCA9PSBCSUdfRU5ESUFOID8gImJpZyIgOiAibGl0dGxlIiwKKwkJIFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4gPyAiYmlnIiA6ICJsaXR0bGUiKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpCisJICA/IFRBUkdFVF9CWVRFX09SREVSICE9IEJJR19FTkRJQU4KKwkgIDogVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKKwl3YXJuaW5nICgiJXMgZW5kaWFuIGZpbGUgZG9lcyBub3QgbWF0Y2ggJXMgZW5kaWFuIHRhcmdldC4iLAorCQkgYmZkX2JpZ19lbmRpYW4gKGFiZmQpID8gImJpZyIgOiAibGl0dGxlIiwKKwkJIFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4gPyAiYmlnIiA6ICJsaXR0bGUiKTsKKyAgICB9Cit9CisKKworCisvKiBGdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSB0YXJnZXQgKi8KKworaW50IHRhcmdldF9hcmNoaXRlY3R1cmVfYXV0byA9IDE7CitleHRlcm4gY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q7Citjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqdGFyZ2V0X2FyY2hpdGVjdHVyZSA9ICZiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKK2ludCAoKnRhcmdldF9hcmNoaXRlY3R1cmVfaG9vaykgUEFSQU1TICgoY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmFwKSk7CisKKy8qIERvIHRoZSByZWFsIHdvcmsgb2YgY2hhbmdpbmcgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlICovCitzdGF0aWMgdm9pZAorc2V0X2FyY2ggKGFyY2gpCisgICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICphcmNoOworeworICAvKiBGSVhNRTogSXMgaXQgY29tcGF0aWJsZSB3aXRoIGdkYj8gKi8KKyAgLyogQ2hlY2sgd2l0aCB0aGUgdGFyZ2V0IG9uIHRoZSBzZXR0aW5nICovCisgIGlmICh0YXJnZXRfYXJjaGl0ZWN0dXJlX2hvb2sgIT0gTlVMTAorICAgICAgJiYgIXRhcmdldF9hcmNoaXRlY3R1cmVfaG9vayAoYXJjaCkpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJUYXJnZXQgZG9lcyBub3Qgc3VwcG9ydCBgJXMnIGFyY2hpdGVjdHVyZS5cbiIsCisJCSAgICAgICBhcmNoLT5wcmludGFibGVfbmFtZSk7CisgIGVsc2UKKyAgICB7CisgICAgICB0YXJnZXRfYXJjaGl0ZWN0dXJlX2F1dG8gPSAwOworICAgICAgdGFyZ2V0X2FyY2hpdGVjdHVyZSA9IGFyY2g7CisgICAgfQorfQorCisvKiBDYWxsZWQgaWYgdGhlIHVzZXIgZW50ZXJzIGBgc2hvdyBhcmNoaXRlY3R1cmUnJyB3aXRob3V0IGFuIGFyZ3VtZW50LiAqLworc3RhdGljIHZvaWQgc2hvd19hcmNoaXRlY3R1cmUgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkCitzaG93X2FyY2hpdGVjdHVyZSAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgY29uc3QgY2hhciAqYXJjaDsKKyAgYXJjaCA9IFRBUkdFVF9BUkNISVRFQ1RVUkUtPnByaW50YWJsZV9uYW1lOworICBpZiAodGFyZ2V0X2FyY2hpdGVjdHVyZV9hdXRvKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIHNldCBhdXRvbWF0aWNhbGx5IChjdXJyZW50bHkgJXMpXG4iLCBhcmNoKTsKKyAgZWxzZQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIGFzc3VtZWQgdG8gYmUgJXNcbiIsIGFyY2gpOworfQorCisvKiBDYWxsZWQgaWYgdGhlIHVzZXIgZW50ZXJzIGBgc2V0IGFyY2hpdGVjdHVyZScnIHdpdGggb3Igd2l0aG91dCBhbgorICAgYXJndW1lbnQuICovCitzdGF0aWMgdm9pZCBzZXRfYXJjaGl0ZWN0dXJlIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZAorc2V0X2FyY2hpdGVjdHVyZSAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIlwic2V0IGFyY2hpdGVjdHVyZVwiIG11c3QgYmUgZm9sbG93ZWQgYnkgXCJhdXRvXCIgb3IgYW4gYXJjaGl0ZWN0dXJlIG5hbWUuXG4iKTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAoYXJncywgImF1dG8iKSA9PSAwKQorICAgIHsKKyAgICAgIHRhcmdldF9hcmNoaXRlY3R1cmVfYXV0byA9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmFyY2ggPSBiZmRfc2Nhbl9hcmNoIChhcmdzKTsKKyAgICAgIGlmIChhcmNoICE9IE5VTEwpCisJc2V0X2FyY2ggKGFyY2gpOworICAgICAgZWxzZQorCXByaW50Zl91bmZpbHRlcmVkICgiQXJjaGl0ZWN0dXJlIGAlcycgbm90IHJlY29uaXplZC5cbiIsIGFyZ3MpOworICAgIH0KK30KKworLyogQ2FsbGVkIGlmIHRoZSB1c2VyIGVudGVycyBgYGluZm8gYXJjaGl0ZWN0dXJlJycgd2l0aG91dCBhbiBhcmd1bWVudC4gKi8KK3N0YXRpYyB2b2lkIGluZm9fYXJjaGl0ZWN0dXJlIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZAoraW5mb19hcmNoaXRlY3R1cmUgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhOworICBwcmludGZfZmlsdGVyZWQgKCJBdmFpbGFibGUgYXJjaGl0ZWN0dXJlcyBhcmU6XG4iKTsKKyAgZm9yIChhID0gYmZkX2FyY2hfb2JzY3VyZSArIDE7IGEgPCBiZmRfYXJjaF9sYXN0OyBhKyspCisgICAgeworICAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmFwID0gYmZkX2xvb2t1cF9hcmNoIChhLCAwKTsKKyAgICAgIGlmIChhcCAhPSBOVUxMKQorCXsKKwkgIGRvCisJICAgIHsKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCIgJXMiLCBhcC0+cHJpbnRhYmxlX25hbWUpOworCSAgICAgIGFwID0gYXAtPm5leHQ7CisJICAgIH0KKwkgIHdoaWxlIChhcCAhPSBOVUxMKTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisJfQorICAgIH0KK30KKworLyogU2V0IHRoZSBhcmNoaXRlY3R1cmUgZnJvbSBhcmNoL21hY2hpbmUgKi8KK3ZvaWQKK3NldF9hcmNoaXRlY3R1cmVfZnJvbV9hcmNoX21hY2ggKGFyY2gsIG1hY2gpCisgICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOworICAgICB1bnNpZ25lZCBsb25nIG1hY2g7Cit7CisgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICp3YW50ZWQgPSBiZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2gpOworICBpZiAod2FudGVkICE9IE5VTEwpCisgICAgc2V0X2FyY2ggKHdhbnRlZCk7CisgIGVsc2UKKyAgICBmYXRhbCAoImhhcmR3aXJlZCBhcmNoaXRlY3R1cmUvbWFjaGluZSBub3QgcmVjb25pemVkIik7Cit9CisKKy8qIFNldCB0aGUgYXJjaGl0ZWN0dXJlIGZyb20gYSBCRkQgKi8KK3N0YXRpYyB2b2lkIHNldF9hcmNoaXRlY3R1cmVfZnJvbV9maWxlIFBBUkFNUyAoKGJmZCAqKSk7CitzdGF0aWMgdm9pZAorc2V0X2FyY2hpdGVjdHVyZV9mcm9tX2ZpbGUgKGFiZmQpCisgICAgIGJmZCAqYWJmZDsKK3sKKyAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKndhbnRlZCA9IGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKTsKKyAgaWYgKHRhcmdldF9hcmNoaXRlY3R1cmVfYXV0bykKKyAgICB7CisgICAgICBpZiAodGFyZ2V0X2FyY2hpdGVjdHVyZV9ob29rICE9IE5VTEwKKwkgICYmICF0YXJnZXRfYXJjaGl0ZWN0dXJlX2hvb2sgKHdhbnRlZCkpCisJd2FybmluZyAoIlRhcmdldCBtYXkgbm90IHN1cHBvcnQgJXMgYXJjaGl0ZWN0dXJlIiwKKwkJIHdhbnRlZC0+cHJpbnRhYmxlX25hbWUpOworICAgICAgdGFyZ2V0X2FyY2hpdGVjdHVyZSA9IHdhbnRlZDsKKyAgICB9CisgIGVsc2UgaWYgKHdhbnRlZCAhPSB0YXJnZXRfYXJjaGl0ZWN0dXJlKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCIlcyBhcmNoaXRlY3R1cmUgZmlsZSBtYXkgYmUgaW5jb21wYXRpYmxlIHdpdGggJXMgdGFyZ2V0LiIsCisJICAgICAgIHdhbnRlZC0+cHJpbnRhYmxlX25hbWUsCisJICAgICAgIHRhcmdldF9hcmNoaXRlY3R1cmUtPnByaW50YWJsZV9uYW1lKTsKKyAgICB9Cit9CisKKworCisvKiBEaXNhc3NlbWJsZXIgKi8KKworLyogUG9pbnRlciB0byB0aGUgdGFyZ2V0LWRlcGVuZGVudCBkaXNhc3NlbWJseSBmdW5jdGlvbi4gICovCitpbnQgKCp0bV9wcmludF9pbnNuKSBQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKK2Rpc2Fzc2VtYmxlX2luZm8gdG1fcHJpbnRfaW5zbl9pbmZvOworCisKKworLyogU2V0IHRoZSBkeW5hbWljIHRhcmdldC1zeXN0ZW0tZGVwZW5kYW50IHBhcmFtZXRlcnMgKGFyY2hpdGVjdHVyZSwKKyAgIGJ5dGUtb3JkZXIpIHVzaW5nIGluZm9ybWF0aW9uIGZvdW5kIGluIHRoZSBCRkQgKi8KKwordm9pZAorc2V0X2dkYmFyY2hfZnJvbV9maWxlIChhYmZkKQorICAgICBiZmQgKmFiZmQ7Cit7CisgIHNldF9hcmNoaXRlY3R1cmVfZnJvbV9maWxlIChhYmZkKTsKKyAgc2V0X2VuZGlhbl9mcm9tX2ZpbGUgKGFiZmQpOworfQorCisKK2V4dGVybiB2b2lkIF9pbml0aWFsaXplX2dkYmFyY2ggUEFSQU1TICgodm9pZCkpOwordm9pZAorX2luaXRpYWxpemVfZ2RiYXJjaCAoKQoreworICBhZGRfcHJlZml4X2NtZCAoImVuZGlhbiIsIGNsYXNzX3N1cHBvcnQsIHNldF9lbmRpYW4sCisJCSAgIlNldCBlbmRpYW5uZXNzIG9mIHRhcmdldC4iLAorCQkgICZlbmRpYW5saXN0LCAic2V0IGVuZGlhbiAiLCAwLCAmc2V0bGlzdCk7CisgIGFkZF9jbWQgKCJiaWciLCBjbGFzc19zdXBwb3J0LCBzZXRfZW5kaWFuX2JpZywKKwkgICAiU2V0IHRhcmdldCBhcyBiZWluZyBiaWcgZW5kaWFuLiIsICZlbmRpYW5saXN0KTsKKyAgYWRkX2NtZCAoImxpdHRsZSIsIGNsYXNzX3N1cHBvcnQsIHNldF9lbmRpYW5fbGl0dGxlLAorCSAgICJTZXQgdGFyZ2V0IGFzIGJlaW5nIGxpdHRsZSBlbmRpYW4uIiwgJmVuZGlhbmxpc3QpOworICBhZGRfY21kICgiYXV0byIsIGNsYXNzX3N1cHBvcnQsIHNldF9lbmRpYW5fYXV0bywKKwkgICAiU2VsZWN0IHRhcmdldCBlbmRpYW5uZXNzIGF1dG9tYXRpY2FsbHkuIiwgJmVuZGlhbmxpc3QpOworICBhZGRfY21kICgiZW5kaWFuIiwgY2xhc3Nfc3VwcG9ydCwgc2hvd19lbmRpYW4sCisJICAgIlNob3cgZW5kaWFubmVzcyBvZiB0YXJnZXQuIiwgJnNob3dsaXN0KTsKKworICBhZGRfY21kICgiYXJjaGl0ZWN0dXJlIiwgY2xhc3Nfc3VwcG9ydCwgc2V0X2FyY2hpdGVjdHVyZSwKKwkgICAiU2V0IGFyY2hpdGVjdHVyZSBvZiB0YXJnZXQuIiwgJnNldGxpc3QpOworICBhZGRfYWxpYXNfY21kICgicHJvY2Vzc29yIiwgImFyY2hpdGVjdHVyZSIsIGNsYXNzX3N1cHBvcnQsIDEsICZzZXRsaXN0KTsKKyAgYWRkX2NtZCAoImFyY2hpdGVjdHVyZSIsIGNsYXNzX3N1cHBvcnQsIHNob3dfYXJjaGl0ZWN0dXJlLAorCSAgICJTaG93IGFyY2hpdGVjdHVyZSBvZiB0YXJnZXQuIiwgJnNob3dsaXN0KTsKKyAgYWRkX2NtZCAoImFyY2hpdGVjdHVyZSIsIGNsYXNzX3N1cHBvcnQsIGluZm9fYXJjaGl0ZWN0dXJlLAorCSAgICJMaXN0IHN1cHBvcnRlZCB0YXJnZXQgYXJjaGl0ZWN0dXJlcyIsICZpbmZvbGlzdCk7CisKKyAgSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0ggKHRtX3ByaW50X2luc25faW5mbywgZ2RiX3N0ZG91dCwgKGZwcmludGZfZnR5cGUpZnByaW50Zl9maWx0ZXJlZCk7CisgIHRtX3ByaW50X2luc25faW5mby5mbGF2b3VyID0gYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXI7CisgIHRtX3ByaW50X2luc25faW5mby5yZWFkX21lbW9yeV9mdW5jID0gZGlzX2FzbV9yZWFkX21lbW9yeTsKKyAgdG1fcHJpbnRfaW5zbl9pbmZvLm1lbW9yeV9lcnJvcl9mdW5jID0gZGlzX2FzbV9tZW1vcnlfZXJyb3I7CisgIHRtX3ByaW50X2luc25faW5mby5wcmludF9hZGRyZXNzX2Z1bmMgPSBkaXNfYXNtX3ByaW50X2FkZHJlc3M7CisKKyNpZmRlZiBNQUlOVEVOQU5DRV9DTURTCisgIGFkZF9zaG93X2Zyb21fc2V0IChhZGRfc2V0X2NtZCAoImFyY2hkZWJ1ZyIsCisJCQkJICBjbGFzc19tYWludGVuYW5jZSwKKwkJCQkgIHZhcl96aW50ZWdlciwKKwkJCQkgIChjaGFyICopJmdkYmFyY2hfZGVidWcsCisJCQkJICAiU2V0IGFyY2hpdGVjdHVyZSBkZWJ1Z2dpbmcuXG5cCitXaGVuIG5vbi16ZXJvLCBhcmNoaXRlY3R1cmUgZGVidWdnaW5nIGlzIGVuYWJsZWQuIiwgJnNldGxpc3QpLAorCQkgICAgICZzaG93bGlzdCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2dkYi9nZGJhcmNoLmggYi9nZGIvZ2RiYXJjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OGRiNGMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZ2RiYXJjaC5oCkBAIC0wLDAgKzEsMTE4IEBACisvKiBBcmNoaXRlY3R1cmUgY29tbWFuZHMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTk4LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIEdEQkFSQ0hfSAorI2RlZmluZSBHREJBUkNIX0gKKworCisvKiBUaGUgdGFyZ2V0LXN5c3RlbS1kZXBlbmRhbnQgYnl0ZSBvcmRlciBpcyBkeW5hbWljICovCisKKy8qIFRBUkdFVF9CWVRFX09SREVSX1NFTEVDVEFCTEVfUCBkZXRlcm1pbmVzIGlmIHRoZSB0YXJnZXQgZW5kaWFubmVzcworICAgaXMgc2VsZWN0YWJsZSBhdCBydW50aW1lLiAgVGhlIHVzZXIgY2FuIHVzZSB0aGUgYHNldCBlbmRpYW4nCisgICBjb21tYW5kIHRvIGNoYW5nZSBpdC4gIFRBUkdFVF9CWVRFX09SREVSX0FVVE8gaXMgbm9uemVybyB3aGVuCisgICB0YXJnZXRfYnl0ZV9vcmRlciBzaG91bGQgYmUgYXV0by1kZXRlY3RlZCAoZnJvbSB0aGUgcHJvZ3JhbSBpbWFnZQorICAgc2F5KS4gKi8KKworI2lmbmRlZiBUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFX1AKKy8qIGNvbXBhdCAtIENhdGNoIG9sZCB0YXJnZXRzIHRoYXQgZGVmaW5lIFRBUkdFVF9CWVRFX09SREVSX1NMRUNUQUJMRQorICAgd2hlbiB0aGV5IHNob3VsZCBoYXZlIGRlZmluZWQgVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRV9QIDEgKi8KKyNpZmRlZiBUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFCisjZGVmaW5lIFRBUkdFVF9CWVRFX09SREVSX1NFTEVDVEFCTEVfUCAxCisjZWxzZQorI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFX1AgMAorI2VuZGlmCisjZW5kaWYKKworZXh0ZXJuIGludCB0YXJnZXRfYnl0ZV9vcmRlcjsKKyNpZmRlZiBUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFCisvKiBjb21wYXQgLSBDYXRjaCBvbGQgdGFyZ2V0cyB0aGF0IGRlZmluZSBUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFCisgICBhbmQgZXhwZWN0IGRlZnMuaCB0byByZS1kZWZpbmUgVEFSR0VUX0JZVEVfT1JERVIuICovCisjdW5kZWYgVEFSR0VUX0JZVEVfT1JERVIKKyNlbmRpZgorI2lmbmRlZiBUQVJHRVRfQllURV9PUkRFUgorI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUiAodGFyZ2V0X2J5dGVfb3JkZXIgKyAwKQorI2VuZGlmCisKK2V4dGVybiBpbnQgdGFyZ2V0X2J5dGVfb3JkZXJfYXV0bzsKKyNpZm5kZWYgVEFSR0VUX0JZVEVfT1JERVJfQVVUTworI2RlZmluZSBUQVJHRVRfQllURV9PUkRFUl9BVVRPICh0YXJnZXRfYnl0ZV9vcmRlcl9hdXRvICsgMCkKKyNlbmRpZgorCisKKworLyogVGhlIHRhcmdldC1zeXN0ZW0tZGVwZW5kYW50IEJGRCBhcmNoaXRlY3R1cmUgaXMgZHluYW1pYyAqLworCitleHRlcm4gaW50IHRhcmdldF9hcmNoaXRlY3R1cmVfYXV0bzsKKyNpZm5kZWYgVEFSR0VUX0FSQ0hJVEVDVFVSRV9BVVRPCisjZGVmaW5lIFRBUkdFVF9BUkNISVRFQ1RVUkVfQVVUTyAodGFyZ2V0X2FyY2hpdGVjdHVyZV9hdXRvICsgMCkKKyNlbmRpZgorCitleHRlcm4gY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKnRhcmdldF9hcmNoaXRlY3R1cmU7CisjaWZuZGVmIFRBUkdFVF9BUkNISVRFQ1RVUkUKKyNkZWZpbmUgVEFSR0VUX0FSQ0hJVEVDVFVSRSAodGFyZ2V0X2FyY2hpdGVjdHVyZSArIDApCisjZW5kaWYKKworLyogTm90aWZ5IHRoZSB0YXJnZXQgZGVwZW5kYW50IGJhY2tlbmQgb2YgYSBjaGFuZ2UgdG8gdGhlIHNlbGVjdGVkCisgICBhcmNoaXRlY3R1cmUuIEEgemVybyByZXR1cm4gc3RhdHVzIGluZGljYXRlcyB0aGF0IHRoZSB0YXJnZXQgZGlkCisgICBub3QgbGlrZSB0aGUgY2hhbmdlLiAqLworCitleHRlcm4gaW50ICgqdGFyZ2V0X2FyY2hpdGVjdHVyZV9ob29rKSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqKSk7IAorCisKKworLyogVGhlIHRhcmdldC1zeXN0ZW0tZGVwZW5kYW50IGRpc2Fzc2VtYmxlciBpcyBzZW1pLWR5bmFtaWMgKi8KKworI2luY2x1ZGUgImRpcy1hc20uaCIJCS8qIEdldCBkZWZzIGZvciBkaXNhc3NlbWJsZV9pbmZvICovCisKK2V4dGVybiBpbnQgZGlzX2FzbV9yZWFkX21lbW9yeSBQQVJBTVMgKChiZmRfdm1hIG1lbWFkZHIsIGJmZF9ieXRlICpteWFkZHIsCisJCQkJCWludCBsZW4sIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pKTsKKworZXh0ZXJuIHZvaWQgZGlzX2FzbV9tZW1vcnlfZXJyb3IgUEFSQU1TICgoaW50IHN0YXR1cywgYmZkX3ZtYSBtZW1hZGRyLAorCQkJCQkgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pKTsKKworZXh0ZXJuIHZvaWQgZGlzX2FzbV9wcmludF9hZGRyZXNzIFBBUkFNUyAoKGJmZF92bWEgYWRkciwKKwkJCQkJICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykpOworCitleHRlcm4gaW50ICgqdG1fcHJpbnRfaW5zbikgUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKK2V4dGVybiBkaXNhc3NlbWJsZV9pbmZvIHRtX3ByaW50X2luc25faW5mbzsKKyNpZm5kZWYgVEFSR0VUX1BSSU5UX0lOU04KKyNkZWZpbmUgVEFSR0VUX1BSSU5UX0lOU04odm1hLCBpbmZvKSAoKnRtX3ByaW50X2luc24pICh2bWEsIGluZm8pCisjZW5kaWYKKyNpZm5kZWYgVEFSR0VUX1BSSU5UX0lOU05fSU5GTworI2RlZmluZSBUQVJHRVRfUFJJTlRfSU5TTl9JTkZPICgmdG1fcHJpbnRfaW5zbl9pbmZvKQorI2VuZGlmCisKKworCisvKiBTZXQgdGhlIGR5bmFtaWMgdGFyZ2V0LXN5c3RlbS1kZXBlbmRhbnQgcGFyYW1ldGVycyAoYXJjaGl0ZWN0dXJlLAorICAgYnl0ZS1vcmRlciwgLi4uKSB1c2luZyBpbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGUgQkZEICovCisKK2V4dGVybiB2b2lkIHNldF9nZGJhcmNoX2Zyb21fZmlsZSBQQVJBTVMgKChiZmQgKikpOworCisKKy8qIEV4cGxpY2l0bHkgc2V0IHRoZSBkeW5hbWljIHRhcmdldC1zeXN0ZW0tZGVwZW5kYW50IHBhcmFtZXRlcnMgYmFzZWQKKyAgIG9uIGJmZF9hcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUuICovCisKK2V4dGVybiB2b2lkIHNldF9hcmNoaXRlY3R1cmVfZnJvbV9hcmNoX21hY2ggUEFSQU1TICgoZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSk7CisKKworLyogZ2RiYXJjaCB0cmFjZSB2YXJpYWJsZSAqLworZXh0ZXJuIGludCBnZGJhcmNoX2RlYnVnOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dkYi9nZGJjbWQuaCBiL2dkYi9nZGJjbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWIzYjdhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2dkYmNtZC5oCkBAIC0wLDAgKzEsMTE0IEBACisvKiBIZWFkZXIgZmlsZSBmb3IgR0RCLXNwZWNpZmljIGNvbW1hbmQtbGluZSBzdHVmZi4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg5LCAxOTkwLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWYgIWRlZmluZWQgKEdEQkNNRF9IKQorI2RlZmluZSBHREJDTURfSCAxCisKKyNpbmNsdWRlICJjb21tYW5kLmgiCisKKy8qIENoYWluIGNvbnRhaW5pbmcgYWxsIGRlZmluZWQgY29tbWFuZHMuICAqLworCitleHRlcm4gc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmNtZGxpc3Q7CisKKy8qIENoYWluIGNvbnRhaW5pbmcgYWxsIGRlZmluZWQgaW5mbyBzdWJjb21tYW5kcy4gICovCisKK2V4dGVybiBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqaW5mb2xpc3Q7CisKKy8qIENoYWluIGNvbnRhaW5pbmcgYWxsIGRlZmluZWQgZW5hYmxlIHN1YmNvbW1hbmRzLiAqLworCitleHRlcm4gc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmVuYWJsZWxpc3Q7CisKKy8qIENoYWluIGNvbnRhaW5pbmcgYWxsIGRlZmluZWQgZGlzYWJsZSBzdWJjb21tYW5kcy4gKi8KKworZXh0ZXJuIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpkaXNhYmxlbGlzdDsKKworLyogQ2hhaW4gY29udGFpbmluZyBhbGwgZGVmaW5lZCBkZWxldGUgc3ViY29tbWFuZHMuICovCisKK2V4dGVybiBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqZGVsZXRlbGlzdDsKKworLyogQ2hhaW4gY29udGFpbmluZyBhbGwgZGVmaW5lZCB0b2dnbGUgc3ViY29tbWFuZHMuICovCisKK2V4dGVybiBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqdG9nZ2xlbGlzdDsKKworLyogQ2hhaW4gY29udGFpbmluZyBhbGwgZGVmaW5lZCBzdG9wIHN1YmNvbW1hbmRzLiAqLworCitleHRlcm4gc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKnN0b3BsaXN0OworCisvKiBDaGFpbiBjb250YWluaW5nIGFsbCBkZWZpbmVkICJlbmFibGUgYnJlYWtwb2ludCIgc3ViY29tbWFuZHMuICovCisKK2V4dGVybiBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqZW5hYmxlYnJlYWtsaXN0OworCisvKiBDaGFpbiBjb250YWluaW5nIGFsbCBkZWZpbmVkIHNldCBzdWJjb21tYW5kcyAqLworCitleHRlcm4gc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKnNldGxpc3Q7CisKKy8qIENoYWluIGNvbnRhaW5pbmcgYWxsIGRlZmluZWQgdW5zZXQgc3ViY29tbWFuZHMgKi8KKworZXh0ZXJuIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICp1bnNldGxpc3Q7CisKKy8qIENoYWluIGNvbnRhaW5pbmcgYWxsIGRlZmluZWQgc2hvdyBzdWJjb21tYW5kcy4gICovCisKK2V4dGVybiBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqc2hvd2xpc3Q7CisKKy8qIENoYWluIGNvbnRhaW5pbmcgYWxsIGRlZmluZWQgXCJzZXQgaGlzdG9yeVwiLiAgKi8KKworZXh0ZXJuIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpzZXRoaXN0bGlzdDsKKworLyogQ2hhaW4gY29udGFpbmluZyBhbGwgZGVmaW5lZCBcInNob3cgaGlzdG9yeVwiLiAgKi8KKworZXh0ZXJuIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpzaG93aGlzdGxpc3Q7CisKKy8qIENoYWluIGNvbnRhaW5pbmcgYWxsIGRlZmluZWQgXCJ1bnNldCBoaXN0b3J5XCIuICAqLworCitleHRlcm4gc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKnVuc2V0aGlzdGxpc3Q7CisKKy8qIENoYWluIGNvbnRhaW5pbmcgYWxsIGRlZmluZWQgbWFpbnRlbmFuY2Ugc3ViY29tbWFuZHMuICovCisKK2V4dGVybiBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqbWFpbnRlbmFuY2VsaXN0OworCisvKiBDaGFpbiBjb250YWluaW5nIGFsbCBkZWZpbmVkICJtYWludGVuYW5jZSBpbmZvIiBzdWJjb21tYW5kcy4gKi8KKworZXh0ZXJuIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICptYWludGVuYW5jZWluZm9saXN0OworCisvKiBDaGFpbiBjb250YWluaW5nIGFsbCBkZWZpbmVkICJtYWludGVuYW5jZSBwcmludCIgc3ViY29tbWFuZHMuICovCisKK2V4dGVybiBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqbWFpbnRlbmFuY2VwcmludGxpc3Q7CisKK2V4dGVybiBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqc2V0cHJpbnRsaXN0OworCitleHRlcm4gc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKnNob3dwcmludGxpc3Q7CisKK2V4dGVybiBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqc2V0Y2hlY2tsaXN0OworCitleHRlcm4gc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKnNob3djaGVja2xpc3Q7CisKK2V4dGVybiB2b2lkCitleGVjdXRlX3VzZXJfY29tbWFuZCBQQVJBTVMgKChzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqLCBjaGFyICopKTsKKworZXh0ZXJuIHZvaWQKK2V4ZWN1dGVfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitlbnVtIGNvbW1hbmRfY29udHJvbF90eXBlCitleGVjdXRlX2NvbnRyb2xfY29tbWFuZCBQQVJBTVMgKChzdHJ1Y3QgY29tbWFuZF9saW5lICopKTsKKwordm9pZCBwcmludF9jb21tYW5kX2xpbmUgUEFSQU1TICgoc3RydWN0IGNvbW1hbmRfbGluZSAqLCB1bnNpZ25lZCBpbnQpKTsKKworZXh0ZXJuIGNoYXIgKipub29wX2NvbXBsZXRlciBQQVJBTVMgKChjaGFyICosIGNoYXIgKikpOworCitleHRlcm4gY2hhciAqKmZpbGVuYW1lX2NvbXBsZXRlciBQQVJBTVMgKChjaGFyICosIGNoYXIgKikpOworCisjZW5kaWYJLyogIWRlZmluZWQgKEdEQkNNRF9IKSAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2dkYmNvcmUuaCBiL2dkYi9nZGJjb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwMWUzMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9nZGJjb3JlLmgKQEAgLTAsMCArMSwxNjkgQEAKKy8qIE1hY2hpbmUgaW5kZXBlbmRlbnQgdmFyaWFibGVzIHRoYXQgZGVzY3JpYmUgdGhlIGNvcmUgZmlsZSB1bmRlciBHREIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MCwgMTk5MiwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBJbnRlcmZhY2Ugcm91dGluZXMgZm9yIGNvcmUsIGV4ZWN1dGFibGUsIGV0Yy4gICovCisKKyNpZiAhZGVmaW5lZCAoR0RCQ09SRV9IKQorI2RlZmluZSBHREJDT1JFX0ggMQorCisjaW5jbHVkZSAiYmZkLmgiCisKKy8qIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSBmaWxlIGFzIGEgc3RyaW5nLgorICAgRVJSIG5vbnplcm8gbWVhbnMgZ2V0IGVycm9yIGlmIHRoZXJlIGlzIG5vbmUgc3BlY2lmaWVkOworICAgb3RoZXJ3aXNlIHJldHVybiAwIGluIHRoYXQgY2FzZS4gICovCisKK2V4dGVybiBjaGFyICpnZXRfZXhlY19maWxlIFBBUkFNUyAoKGludCBlcnIpKTsKKworLyogTm9uemVybyBpZiB0aGVyZSBpcyBhIGNvcmUgZmlsZS4gICovCisKK2V4dGVybiBpbnQgaGF2ZV9jb3JlX2ZpbGVfcCBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIFJlYWQgIm1lbW9yeSBkYXRhIiBmcm9tIHdoYXRldmVyIHRhcmdldCBvciBpbmZlcmlvciB3ZSBoYXZlLgorICAgUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwsIGVycm5vIHZhbHVlIGlmIG5vdC4gIEVJTyBpcyB1c2VkIGZvcgorICAgYWRkcmVzcyBvdXQgb2YgYm91bmRzLiAgSWYgYnJlYWtwb2ludHMgYXJlIGluc2VydGVkLCByZXR1cm5zIHNoYWRvdworICAgY29udGVudHMsIG5vdCB0aGUgYnJlYWtwb2ludHMgdGhlbXNlbHZlcy4gIEZyb20gYnJlYWtwb2ludC5jLiAgKi8KKworZXh0ZXJuIGludCByZWFkX21lbW9yeV9ub2JwdCBQQVJBTVMgKChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLAorCQkJCSAgICAgIHVuc2lnbmVkIGxlbikpOworCisvKiBSZXBvcnQgYSBtZW1vcnkgZXJyb3Igd2l0aCBlcnJvcigpLiAgKi8KKworZXh0ZXJuIHZvaWQgbWVtb3J5X2Vycm9yIFBBUkFNUyAoKGludCBzdGF0dXMsIENPUkVfQUREUiBtZW1hZGRyKSk7CisKKy8qIExpa2UgdGFyZ2V0X3JlYWRfbWVtb3J5LCBidXQgcmVwb3J0IGFuIGVycm9yIGlmIGNhbid0IHJlYWQuICAqLworCitleHRlcm4gdm9pZCByZWFkX21lbW9yeSBQQVJBTVMgKChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLCBpbnQgbGVuKSk7CisKK2V4dGVybiB2b2lkIHJlYWRfbWVtb3J5X3NlY3Rpb24gUEFSQU1TICgoQ09SRV9BRERSIG1lbWFkZHIsIGNoYXIgKm15YWRkciwKKwkJCQkJIGludCBsZW4sIGFzZWN0aW9uICpiZmRfc2VjdGlvbikpOworCisvKiBSZWFkIGFuIGludGVnZXIgZnJvbSBkZWJ1Z2dlZCBtZW1vcnksIGdpdmVuIGFkZHJlc3MgYW5kIG51bWJlciBvZgorICAgYnl0ZXMuICAqLworCitleHRlcm4gTE9OR0VTVCByZWFkX21lbW9yeV9pbnRlZ2VyIFBBUkFNUyAoKENPUkVfQUREUiBtZW1hZGRyLCBpbnQgbGVuKSk7CisKKy8qIFJlYWQgYW4gdW5zaWduZWQgaW50ZWdlciBmcm9tIGRlYnVnZ2VkIG1lbW9yeSwgZ2l2ZW4gYWRkcmVzcyBhbmQKKyAgIG51bWJlciBvZiBieXRlcy4gICovCisKK2V4dGVybiBVTE9OR0VTVCByZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyIFBBUkFNUyAoKENPUkVfQUREUiBtZW1hZGRyLCBpbnQgbGVuKSk7CisKKy8qIFJlYWQgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gdGhlIGRlYnVnZ2VlJ3MgbWVtb3J5LCBnaXZlbiBhZGRyZXNzLAorICogYSBidWZmZXIgaW50byB3aGljaCB0byBwbGFjZSB0aGUgc3RyaW5nLCBhbmQgdGhlIG1heGltdW0gYXZhaWxhYmxlIHNwYWNlICovIAorZXh0ZXJuIHZvaWQgcmVhZF9tZW1vcnlfc3RyaW5nIFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqLCBpbnQpKTsKKworLyogVGhpcyB0YWtlcyBhIGNoYXIgKiwgbm90IHZvaWQgKi4gIFRoaXMgaXMgcHJvYmFibHkgcmlnaHQsIGJlY2F1c2UKKyAgIHBhc3NpbmcgaW4gYW4gaW50ICogb3Igd2hhdGV2ZXIgaXMgd3Jvbmcgd2l0aCByZXNwZWN0IHRvCisgICBieXRlc3dhcHBpbmcsIGFsaWdubWVudCwgZGlmZmVyZW50IHNpemVzIGZvciBob3N0IHZzLiB0YXJnZXQgdHlwZXMsCisgICBldGMuICAqLworCitleHRlcm4gdm9pZCB3cml0ZV9tZW1vcnkgUEFSQU1TICgoQ09SRV9BRERSIG1lbWFkZHIsIGNoYXIgKm15YWRkciwgaW50IGxlbikpOworCitleHRlcm4gdm9pZCBnZW5lcmljX3NlYXJjaCBQQVJBTVMgKChpbnQgbGVuLCBjaGFyICpkYXRhLCBjaGFyICptYXNrLAorCQkJCSAgICBDT1JFX0FERFIgc3RhcnRhZGRyLCBpbnQgaW5jcmVtZW50LAorCQkJCSAgICBDT1JFX0FERFIgbG9yYW5nZSwgQ09SRV9BRERSIGhpcmFuZ2UsCisJCQkJICAgIENPUkVfQUREUiAqYWRkcl9mb3VuZCwgY2hhciAqZGF0YV9mb3VuZCkpOworDAorLyogSG9vayBmb3IgYGV4ZWNfZmlsZV9jb21tYW5kJyBjb21tYW5kIHRvIGNhbGwuICAqLworCitleHRlcm4gdm9pZCAoKmV4ZWNfZmlsZV9kaXNwbGF5X2hvb2spIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7CisKKy8qIEhvb2sgZm9yICJmaWxlX2NvbW1hbmQiLCB3aGljaCBpcyBtb3JlIHVzZWZ1bCB0aGFuIGFib3ZlCisgICAoYmVjYXVzZSBpdCBpcyBpbnZva2VkIEFGVEVSIHN5bWJvbHMgYXJlIHJlYWQsIG5vdCBiZWZvcmUpICovCisKK2V4dGVybiB2b2lkICgqZmlsZV9jaGFuZ2VkX2hvb2spIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7CisKK2V4dGVybiB2b2lkIHNwZWNpZnlfZXhlY19maWxlX2hvb2sgUEFSQU1TICgodm9pZCAoKmhvb2spIChjaGFyICpmaWxlbmFtZSkpKTsKKworLyogQmluYXJ5IEZpbGUgRGlkZGxlcnMgZm9yIHRoZSBleGVjIGFuZCBjb3JlIGZpbGVzICovCisKK2V4dGVybiBiZmQgKmNvcmVfYmZkOworZXh0ZXJuIGJmZCAqZXhlY19iZmQ7CisKKy8qIFdoZXRoZXIgdG8gb3BlbiBleGVjIGFuZCBjb3JlIGZpbGVzIHJlYWQtb25seSBvciByZWFkLXdyaXRlLiAgKi8KKworZXh0ZXJuIGludCB3cml0ZV9maWxlczsKKworZXh0ZXJuIHZvaWQgY29yZV9maWxlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUsIGludCBmcm9tX3R0eSkpOworCitleHRlcm4gdm9pZCBleGVjX2ZpbGVfYXR0YWNoIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lLCBpbnQgZnJvbV90dHkpKTsKKworZXh0ZXJuIHZvaWQgZXhlY19maWxlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUsIGludCBmcm9tX3R0eSkpOworCitleHRlcm4gdm9pZCB2YWxpZGF0ZV9maWxlcyBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBDT1JFX0FERFIgcmVnaXN0ZXJfYWRkciBQQVJBTVMgKChpbnQgcmVnbm8sIENPUkVfQUREUiBibG9ja2VuZCkpOworCitleHRlcm4gdm9pZCByZWdpc3RlcnNfZmV0Y2hlZCBQQVJBTVMgKCh2b2lkKSk7CisKKyNpZiAhZGVmaW5lZCAoS0VSTkVMX1VfQUREUikKK2V4dGVybiBDT1JFX0FERFIga2VybmVsX3VfYWRkcjsKKyNkZWZpbmUgS0VSTkVMX1VfQUREUiBrZXJuZWxfdV9hZGRyCisjZW5kaWYKKworLyogVGhlIHRhcmdldCB2ZWN0b3IgZm9yIGNvcmUgZmlsZXMuICovCisKK2V4dGVybiBzdHJ1Y3QgdGFyZ2V0X29wcyBjb3JlX29wczsKKworLyogVGhlIGN1cnJlbnQgZGVmYXVsdCBiZmQgdGFyZ2V0LiAgKi8KKworZXh0ZXJuIGNoYXIgKmdudXRhcmdldDsKKworZXh0ZXJuIHZvaWQgc2V0X2dudXRhcmdldCBQQVJBTVMgKChjaGFyICopKTsKKworLyogU3RydWN0dXJlIHRvIGtlZXAgdHJhY2sgb2YgY29yZSByZWdpc3RlciByZWFkaW5nIGZ1bmN0aW9ucyBmb3IKKyAgIHZhcmlvdXMgY29yZSBmaWxlIHR5cGVzLiAgKi8KKworc3RydWN0IGNvcmVfZm5zIHsKKworICAvKiBCRkQgZmxhdm91ciB0aGF0IHdlIGhhbmRsZS4gIE5vdGUgdGhhdCBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciBtYXRjaGVzCisgICAgIGFueXRoaW5nLCBhbmQgaWYgdGhlcmUgaXMgbm8gYmV0dGVyIG1hdGNoLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCisgICAgIGFzIHRoZSBkZWZhdWx0LiAqLworCisgIGVudW0gYmZkX2ZsYXZvdXIgY29yZV9mbGF2b3VyOworCisgIC8qIEV4dHJhY3QgdGhlIHJlZ2lzdGVyIHZhbHVlcyBvdXQgb2YgdGhlIGNvcmUgZmlsZSBhbmQgc3RvcmUgdGhlbSB3aGVyZQorICAgICBgcmVhZF9yZWdpc3Rlcicgd2lsbCBmaW5kIHRoZW0uCisKKyAgICAgQ09SRV9SRUdfU0VDVCBwb2ludHMgdG8gdGhlIHJlZ2lzdGVyIHZhbHVlcyB0aGVtc2VsdmVzLCByZWFkIGludG8KKyAgICAgbWVtb3J5LgorCisgICAgIENPUkVfUkVHX1NJWkUgaXMgdGhlIHNpemUgb2YgdGhhdCBhcmVhLgorCisgICAgIFdISUNIIHNheXMgd2hpY2ggc2V0IG9mIHJlZ2lzdGVycyB3ZSBhcmUgaGFuZGxpbmcgKDAgPSBpbnQsIDIgPSBmbG9hdCBvbgorICAgICBtYWNoaW5lcyB3aGVyZSB0aGV5IGFyZSBkaXNjb250aWd1b3VzKS4KKworICAgICBSRUdfQUREUiBpcyB0aGUgb2Zmc2V0IGZyb20gdS51X2FyMCB0byB0aGUgcmVnaXN0ZXIgdmFsdWVzIHJlbGF0aXZlIHRvCisgICAgIGNvcmVfcmVnX3NlY3QuICBUaGlzIGlzIHVzZWQgd2l0aCBvbGQtZmFzaGlvbmVkIGNvcmUgZmlsZXMgdG8gbG9jYXRlIHRoZQorICAgICByZWdpc3RlcnMgaW4gYSBsYXJnZSB1cGFnZS1wbHVzLXN0YWNrICIucmVnIiBzZWN0aW9uLiAgT3JpZ2luYWwgdXBhZ2UKKyAgICAgYWRkcmVzcyBYIGlzIGF0IGxvY2F0aW9uIGNvcmVfcmVnX3NlY3QreCtyZWdfYWRkci4gKi8KKworICB2b2lkICgqY29yZV9yZWFkX3JlZ2lzdGVycykgUEFSQU1TICgoY2hhciAqY29yZV9yZWdfc2VjdCwgdW5zaWduZWQgY29yZV9yZWdfc2l6ZSwKKwkJCQkgIGludCB3aGljaCwgQ09SRV9BRERSIHJlZ19hZGRyKSk7CisKKyAgLyogRmluZHMgdGhlIG5leHQgc3RydWN0IGNvcmVfZm5zLiAgVGhleSBhcmUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZAorICAgICBpbiB3aGF0ZXZlciBtb2R1bGUgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb25zIHBvaW50ZWQgdG87IGFuIAorICAgICBpbml0aWFsaXplciBjYWxscyBhZGRfY29yZV9mbnMgdG8gYWRkIHRoZW0gdG8gdGhlIGdsb2JhbCBjaGFpbi4gICovCisKKyAgc3RydWN0IGNvcmVfZm5zICpuZXh0OworCit9OworCitleHRlcm4gdm9pZCBhZGRfY29yZV9mbnMgUEFSQU1TICgoc3RydWN0IGNvcmVfZm5zICpjZikpOworCisjZW5kaWYJLyogIWRlZmluZWQgKEdEQkNPUkVfSCkgKi8KZGlmZiAtLWdpdCBhL2dkYi9nZGJpbml0LmluIGIvZ2RiL2dkYmluaXQuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY5N2QyYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9nZGJpbml0LmluCkBAIC0wLDAgKzEsMTggQEAKK2VjaG8gU2V0dGluZyB1cCB0aGUgZW52aXJvbm1lbnQgZm9yIGRlYnVnZ2luZyBnZGIuXG4KKworc2V0IGNvbXBsYWludHMgMQorCitiIGZhdGFsCisKK2IgaW5mb19jb21tYW5kCitjb21tYW5kcworCXNpbGVudAorCXJldHVybgorZW5kCisKK2RpciBAc3JjZGlyQAorZGlyIC4KK2RpciBAc3JjZGlyQC8uLi9tbWFsbG9jCitkaXIgQHNyY2RpckAvLi4vbGliaWJlcnR5CitkaXIgQHNyY2RpckAvLi4vYmZkCitzZXQgcHJvbXB0ICh0b3AtZ2RiKSAKZGlmZiAtLWdpdCBhL2dkYi9nZGJzZXJ2ZXIvTWFrZWZpbGUuaW4gYi9nZGIvZ2Ric2VydmVyL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMTZlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZ2Ric2VydmVyL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMjQxIEBACisjQ29weXJpZ2h0IDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3CisjRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworcHJlZml4ID0gL3Vzci9sb2NhbAorCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0KK2V4ZWNfcHJlZml4ID0gJChwcmVmaXgpCitiaW5kaXIgPSAkKGV4ZWNfcHJlZml4KS9iaW4KK2xpYmRpciA9ICQoZXhlY19wcmVmaXgpL2xpYgordG9vbGRpciA9ICQobGliZGlyKS8kKHRhcmdldF9hbGlhcykKKworZGF0YWRpciA9ICQocHJlZml4KS9zaGFyZQorbWFuZGlyID0gJChwcmVmaXgpL21hbgorbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCittYW4yZGlyID0gJChtYW5kaXIpL21hbjIKK21hbjNkaXIgPSAkKG1hbmRpcikvbWFuMworbWFuNGRpciA9ICQobWFuZGlyKS9tYW40CittYW41ZGlyID0gJChtYW5kaXIpL21hbjUKK21hbjZkaXIgPSAkKG1hbmRpcikvbWFuNgorbWFuN2RpciA9ICQobWFuZGlyKS9tYW43CittYW44ZGlyID0gJChtYW5kaXIpL21hbjgKK21hbjlkaXIgPSAkKG1hbmRpcikvbWFuOQoraW5mb2RpciA9ICQocHJlZml4KS9pbmZvCitpbmNsdWRlZGlyID0gJChwcmVmaXgpL2luY2x1ZGUKKworU0hFTEwgPSAvYmluL3NoCisKK0lOU1RBTEwgPSBgY2QgJChzcmNkaXIpLy4uLy4uO3B3ZGAvaW5zdGFsbC1zaCAtYworSU5TVEFMTF9QUk9HUkFNID0gJChJTlNUQUxMKQorSU5TVEFMTF9EQVRBID0gJChJTlNUQUxMKQorCitBUiA9IGFyCitBUl9GTEFHUyA9IHF2CitSQU5MSUIgPSByYW5saWIKKworIyBJZiB5b3UgYXJlIGNvbXBpbGluZyB3aXRoIEdDQywgbWFrZSBzdXJlIHRoYXQgZWl0aGVyIDEpIFlvdSB1c2UgdGhlCisjIC10cmFkaXRpb25hbCBmbGFnLCBvciAyKSBZb3UgaGF2ZSB0aGUgZml4ZWQgaW5jbHVkZSBmaWxlcyB3aGVyZSBHQ0MKKyMgY2FuIHJlYWNoIHRoZW0uICBPdGhlcndpc2UgdGhlIGlvY3RsIGNhbGxzIGluIGluZmxvdy5jCisjIHdpbGwgYmUgaW5jb3JyZWN0bHkgY29tcGlsZWQuICBUaGUgImZpeGluY2x1ZGVzIiBzY3JpcHQgaW4gdGhlIGdjYworIyBkaXN0cmlidXRpb24gd2lsbCBmaXggeW91ciBpbmNsdWRlIGZpbGVzIHVwLgorI0NDPWNjCisjQ0M9Z2NjIC10cmFkaXRpb25hbAorR0NDPWdjYworCisjIERpcmVjdG9yeSBjb250YWluaW5nIHNvdXJjZSBmaWxlcy4gIERvbid0IGNsZWFuIHVwIHRoZSBzcGFjaW5nLAorIyB0aGlzIGV4YWN0IHN0cmluZyBpcyBtYXRjaGVkIGZvciBieSB0aGUgImNvbmZpZ3VyZSIgc2NyaXB0Lgorc3JjZGlyID0gLgorCisjIEl0IGlzIGFsc28gcG9zc2libGUgdGhhdCB5b3Ugd2lsbCBuZWVkIHRvIGFkZCAtSS91c3IvaW5jbHVkZS9zeXMgdG8gdGhlCisjIENGTEFHUyBzZWN0aW9uIGlmIHlvdXIgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBmY250bC5oIGluIC91c3IvaW5jbHVkZSAod2hpY2ggCisjIGlzIHdoZXJlIGl0IHNob3VsZCBiZSBhY2NvcmRpbmcgdG8gUG9zaXgpLgorCisjIFNldCB0aGlzIHVwIHdpdGggZ2NjIGlmIHlvdSBoYXZlIGdudSBsZCBhbmQgdGhlIGxvYWRlciB3aWxsIHByaW50IG91dAorIyBsaW5lIG51bWJlcnMgZm9yIHVuZGVmaW5kZWQgcmVmcy4KKyNDQy1MRD1nY2MgLXN0YXRpYworQ0MtTEQ9JHtDQ30KKworIyBXaGVyZSBpcyB0aGUgImluY2x1ZGUiIGRpcmVjdG9yeT8gIFRyYWRpdGlvbmFsbHkgLi4vaW5jbHVkZSBvciAuL2luY2x1ZGUKK0lOQ0xVREVfRElSID0gICR7c3JjZGlyfS8uLi8uLi9pbmNsdWRlCitJTkNMVURFX0RFUCA9ICQkKElOQ0xVREVfRElSKQorCisjIFdoZXJlIGFyZSB0aGUgQkZEIGxpYnJhcnk/CitCRkRfRElSID0gLi4vLi4vYmZkCitCRkQgPSAkKEJGRF9ESVIpL2xpYmJmZC5hCitCRkRfU1JDID0gJChzcmNkaXIpLyQoQkZEX0RJUikKK0JGRF9DRkxBR1MgPSAtSSQoQkZEX0RJUikgLUkkKEJGRF9TUkMpCisKKyMgV2hlcmUgaXMgdGhlIHNvdXJjZSBkaXIgZm9yIHRoZSBSRUFETElORSBsaWJyYXJ5PyAgVHJhZGl0aW9uYWxseSBpbiAuLiBvciAuCisjIChGb3IgdGhlIGJpbmFyeSBsaWJyYXJ5IGJ1aWx0IGZyb20gaXQsIHdlIHVzZSAke1JFQURMSU5FX0RJUn0ke3N1YmRpcn0uKQorUkVBRExJTkVfRElSID0gJHtzcmNkaXJ9Ly4uL3JlYWRsaW5lCitSRUFETElORV9ERVAgPSAkJChSRUFETElORV9ESVIpCisKKyMgQWxsIHRoZSBpbmNsdWRlcyB1c2VkIGZvciBDRkxBR1MgYW5kIGZvciBsaW50LgorIyAtSS4gZm9yIGNvbmZpZyBmaWxlcy4KKyMgLUkke3NyY2Rpcn0gcG9zc2libHkgZm9yIHJlZ2V4LmggYWxzby4KKyMgLUkke3NyY2Rpcn0vY29uZmlnIGZvciBtb3JlIGdlbmVyaWMgY29uZmlnIGZpbGVzLgorSU5DTFVERV9DRkxBR1MgPSAtSS4gLUkke3NyY2Rpcn0gLUkke3NyY2Rpcn0vLi4gLUkke3NyY2Rpcn0vLi4vY29uZmlnIC1JJChJTkNMVURFX0RJUikKKworIyBNe0gsVH1fQ0ZMQUdTLCBpZiBkZWZpbmVkLCBoYXMgaG9zdC0gYW5kIHRhcmdldC1kZXBlbmRlbnQgQ0ZMQUdTCisjIGZyb20gdGhlIGNvbmZpZy8gZGlyZWN0b3J5LgorR0xPQkFMX0NGTEFHUyA9ICR7TVRfQ0ZMQUdTfSAke01IX0NGTEFHU30KKyNQUk9GSUxFX0NGTEFHUyA9IC1wZworCisjIENGTEFHUyBpcyBzcGVjaWZpY2FsbHkgcmVzZXJ2ZWQgZm9yIHNldHRpbmcgZnJvbSB0aGUgY29tbWFuZCBsaW5lCisjIHdoZW4gcnVubmluZyBtYWtlLiAgSS5FLiAgIm1ha2UgQ0ZMQUdTPS1XbWlzc2luZy1wcm90b3R5cGVzIi4KK0NGTEFHUyA9IC1nCisjIElOVEVSTkFMX0NGTEFHUyBpcyB0aGUgYWdncmVnYXRlIG9mIGFsbCBvdGhlciAqQ0ZMQUdTIG1hY3Jvcy4KK0lOVEVSTkFMX0NGTEFHUyA9ICR7Q0ZMQUdTfSAke0dMT0JBTF9DRkxBR1N9ICR7UFJPRklMRV9DRkxBR1N9IFwKKwkke0JGRF9DRkxBR1N9ICR7SU5DTFVERV9DRkxBR1N9CisKKyMgTERGTEFHUyBpcyBzcGVjaWZpY2FsbHkgcmVzZXJ2ZWQgZm9yIHNldHRpbmcgZnJvbSB0aGUgY29tbWFuZCBsaW5lCisjIHdoZW4gcnVubmluZyBtYWtlLgorCisjIFBlcmhhcHMgc2hvdWxkIGNvbWUgZnJvbSBwYXJlbnQgTWFrZWZpbGUKK1ZFUlNJT04gPSBnZGJzZXJ2ZXItNC4xMi4zCitESVNUPWdkYgorCitMSU5UPS91c3IvNWJpbi9saW50CitMSU5URkxBR1M9ICQoQkZEX0NGTEFHUykKKworIyBIb3N0IGFuZCB0YXJnZXQtZGVwZW5kZW50IG1ha2VmaWxlIGZyYWdtZW50cyBjb21lIGluIGhlcmUuCisjIyMjCisjIEVuZCBvZiBob3N0IGFuZCB0YXJnZXQtZGVwZW5kZW50IG1ha2VmaWxlIGZyYWdtZW50cworCisjIEFsbCBzb3VyY2UgZmlsZXMgdGhhdCBnbyBpbnRvIGxpbmtpbmcgR0RCIHJlbW90ZSBzZXJ2ZXIuCisKK1NGSUxFUyA9ICQoc3JjZGlyKS9sb3ctbHlueC5jICQoc3JjZGlyKS9sb3ctc3BhcmMuYyAkKHNyY2RpcikvbG93LXN1bjMuYyBcCisJICQoc3JjZGlyKS9sb3ctaHBwYWJzZC5jIFwKKwkgJChzcmNkaXIpL3V0aWxzLmMgJChzcmNkaXIpL3NlcnZlci5jICQoc3JjZGlyKS9yZW1vdGUtdXRpbHMuYworCitERVBGSUxFUyA9ICQoR0RCU0VSVkVSX0RFUEZJTEVTKQorCitTT1VSQ0VTID0gJChTRklMRVMpICQoQUxMREVQRklMRVMpCitUQUdGSUxFUyA9ICQoU09VUkNFUykgJHtIRklMRVN9ICR7QUxMUEFSQU19ICR7UE9TU0xJQlN9IAorCitPQlMgPSB1dGlscy5vICQoR0RCU0VSVkVSX0RFUEZJTEVTKSBzZXJ2ZXIubyByZW1vdGUtdXRpbHMubworCisjIFByZXZlbnQgU3VuIG1ha2UgZnJvbSBwdXR0aW5nIGluIHRoZSBtYWNoaW5lIHR5cGUuICBTZXR0aW5nCisjIFRBUkdFVF9BUkNIIHRvIG5vdGhpbmcgd29ya3MgZm9yIFN1bk9TIDMsIDQuMCwgYnV0IG5vdCBmb3IgNC4xLgorLmMubzoKKwkke0NDfSAtYyAke0lOVEVSTkFMX0NGTEFHU30gJDwKKworYWxsOiBnZGJzZXJ2ZXIgZ2RicmVwbGF5CisKKyMgVHJhZGl0aW9uYWxseSAiaW5zdGFsbCIgZGVwZW5kcyBvbiAiYWxsIi4gIEJ1dCBpdCBtYXkgYmUgdXNlZnVsCisjIG5vdCB0bzsgZm9yIGV4YW1wbGUsIGlmIHRoZSB1c2VyIGhhcyBtYWRlIHNvbWUgdHJpdmlhbCBjaGFuZ2UgdG8gYSAKKyMgc291cmNlIGZpbGUgYW5kIGRvZXNuJ3QgY2FyZSBhYm91dCByZWJ1aWxkaW5nIG9yIGp1c3Qgd2FudHMgdG8gc2F2ZSB0aGUKKyMgdGltZSBpdCB0YWtlcyBmb3IgbWFrZSB0byBjaGVjayB0aGF0IGFsbCBpcyB1cCB0byBkYXRlLgorIyBpbnN0YWxsLW9ubHkgaXMgaW50ZW5kZWQgdG8gYWRkcmVzcyB0aGF0IG5lZWQuCitpbnN0YWxsOiBhbGwgaW5zdGFsbC1vbmx5CitpbnN0YWxsLW9ubHk6IAorCW49YGVjaG8gZ2Ric2VydmVyIHwgc2VkICckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJ2A7IFwKKwlpZiBbIHgkJG4gPSB4IF07IHRoZW4gbj1nZGJzZXJ2ZXI7IGVsc2UgdHJ1ZTsgZmk7IFwKKwkkKElOU1RBTExfUFJPR1JBTSkgZ2Ric2VydmVyICQoYmluZGlyKS8kJG47IFwKKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2dkYnNlcnZlci4xICQobWFuMWRpcikvJCRuLjEKKwordW5pbnN0YWxsOiBmb3JjZQorCW49YGVjaG8gZ2Ric2VydmVyIHwgc2VkICckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJ2A7IFwKKwlpZiBbIHgkJG4gPSB4IF07IHRoZW4gbj1nZGJzZXJ2ZXI7IGVsc2UgdHJ1ZTsgZmk7IFwKKwlybSAtZiAkKGJpbmRpcikvJCRuICQobWFuMWRpcikvJCRuLjEKKworaW5zdGFsbGNoZWNrOgorY2hlY2s6CitpbmZvIGR2aToKK2luc3RhbGwtaW5mbzoKK2NsZWFuLWluZm86CisKK2dkYnNlcnZlcjogJChPQlMpICR7QUREX0RFUFN9ICR7Q0RFUFN9CisJcm0gLWYgZ2Ric2VydmVyCisJJHtDQy1MRH0gJChHTE9CQUxfQ0ZMQUdTKSAkKExERkxBR1MpIC1vIGdkYnNlcnZlciAkKE9CUykgXAorCSAgJChHREJTRVJWRVJfTElCUykgJChYTV9DTElCUykKKworZ2RicmVwbGF5OiBnZGJyZXBsYXkubworCXJtIC1mIGdkYnJlcGxheQorCSR7Q0MtTER9ICQoR0xPQkFMX0NGTEFHUykgJChMREZMQUdTKSAtbyBnZGJyZXBsYXkgZ2RicmVwbGF5Lm8gXAorCSAgJChYTV9DTElCUykKKworY29uZmlnLnN0YXR1czoKKwlAZWNobyAiWW91IG11c3QgY29uZmlndXJlIGdkYnNlcnZlci4gIExvb2sgYXQgdGhlIFJFQURNRSBmaWxlIGZvciBkZXRhaWxzLiIKKwlAZmFsc2UKKworIyBQdXQgdGhlIHByb3BlciBtYWNoaW5lLXNwZWNpZmljIGZpbGVzIGZpcnN0LCBzbyBNLS4gb24gYSBtYWNoaW5lCisjIHNwZWNpZmljIHJvdXRpbmUgZ2V0cyB0aGUgb25lIGZvciB0aGUgY29ycmVjdCBtYWNoaW5lLgorIyBUaGUgeHl6enkgc3R1ZmYgYmVsb3cgZGVhbHMgd2l0aCBlbXB0eSBERVBGSUxFUworVEFHUzoJJHtUQUdGSUxFU30KKwlldGFncyBgZmluZCAke3NyY2Rpcn0vLi4vY29uZmlnIC1uYW1lICQoVE1fRklMRSkgLXByaW50YCBcCisJICBgZmluZCAke3NyY2Rpcn0vLi4vY29uZmlnIC1uYW1lICR7WE1fRklMRX0gLXByaW50YCBcCisJICBgZmluZCAke3NyY2Rpcn0vLi4vY29uZmlnIC1uYW1lICR7TkFUX0ZJTEV9IC1wcmludGAgXAorCSAgYGZvciBpIGluIHl6enkgJHtERVBGSUxFU307IGRvIFwKKwkgICAgIGlmIFsgeCQkaSAhPSB4eXp6eSBdOyB0aGVuIFwKKwkgICAgICAgZWNobyAke3NyY2Rpcn0vJCRpIHwgc2VkIC1lICdzL1wubyQkL1wuYy8nIDsgXAorCSAgICAgZmk7IFwKKwkgICBkb25lYCBcCisJICAke1RBR0ZJTEVTfQordGFnczogVEFHUworCitjbGVhbjoKKwlybSAtZiAqLm8gJHtBRERfRklMRVN9ICp+CisJcm0gLWYgZ2Ric2VydmVyIGNvcmUgbWFrZS5sb2cKKworZGlzdGNsZWFuOiBjbGVhbgorCXJtIC1mIG5tLmggdG0uaCB4bS5oIGNvbmZpZy5zdGF0dXMKKwlybSAtZiBNYWtlZmlsZQorCittYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogY2xlYW4KKwlybSAtZiBubS5oIHRtLmggeG0uaCBjb25maWcuc3RhdHVzCisJcm0gLWYgTWFrZWZpbGUKKworU1RBR0VTVFVGRj0ke09CU30gJHtUU09CU30gJHtOVFNPQlN9ICR7QUREX0ZJTEVTfSBpbml0LmMgaW5pdC5vIHZlcnNpb24uYyBnZGIKKworTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKGhvc3RfbWFrZWZpbGVfZnJhZykgJCh0YXJnZXRfbWFrZWZpbGVfZnJhZykKKwkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworZm9yY2U6CisKK3ZlcnNpb24uYzogTWFrZWZpbGUKKwllY2hvICdjaGFyICp2ZXJzaW9uID0gIiQoVkVSU0lPTikiOycgPnZlcnNpb24uYworCisjIEdOVSBNYWtlIGhhcyBhbiBhbm5veWluZyBoYWJpdCBvZiBwdXR0aW5nICphbGwqIHRoZSBNYWtlZmlsZSB2YXJpYWJsZXMKKyMgaW50byB0aGUgZW52aXJvbm1lbnQsIHVubGVzcyB5b3UgaW5jbHVkZSB0aGlzIHRhcmdldCBhcyBhIGNpcmN1bXZlbnRpb24uCisjIFJ1bW9yIGlzIHRoYXQgdGhpcyB3aWxsIGJlIGZpeGVkIChhbmQgdGhpcyB0YXJnZXQgY2FuIGJlIHJlbW92ZWQpCisjIGluIEdOVSBNYWtlIDQuMC4KKy5OT0VYUE9SVDoKKworIyBHTlUgTWFrZSAzLjYzIGhhcyBhIGRpZmZlcmVudCBwcm9ibGVtOiBpdCBrZWVwcyB0YWNraW5nIGNvbW1hbmQgbGluZQorIyBvdmVycmlkZXMgb250byB0aGUgZGVmaW5pdGlvbiBvZiAkKE1BS0UpLiAgVGhpcyB2YXJpYWJsZSBzZXR0aW5nCisjIHdpbGwgcmVtb3ZlIHRoZW0uCitNQUtFT1ZFUlJJREVTPQorCisjIyBUaGlzIGlzIHVnbHksIGJ1dCBJIGRvbid0IHdhbnQgR05VIG1ha2UgdG8gcHV0IHRoZXNlIHZhcmlhYmxlcyBpbgorIyMgdGhlIGVudmlyb25tZW50LiAgT2xkZXIgbWFrZXMgd2lsbCBzZWUgdGhpcyBhcyBhIHNldCBvZiB0YXJnZXRzCisjIyB3aXRoIG5vIGRlcGVuZGVuY2llcyBhbmQgbm8gYWN0aW9ucy4KK3VuZXhwb3J0IENISUxMRkxBR1MgQ0hJTExfTElCIENISUxMX0ZPUl9UQVJHRVQgOgorCitzZXJ2ZXIubyA6ICR7c3JjZGlyfS9zZXJ2ZXIuYyAke3NyY2Rpcn0vc2VydmVyLmgKK3JlbW90ZS11dGlscy5vIDogJHtzcmNkaXJ9L3JlbW90ZS11dGlscy5jICR7c3JjZGlyfS9zZXJ2ZXIuaAorbG93LWxpbnV4Lm8gOiAke3NyY2Rpcn0vbG93LWxpbnV4LmMgJHtzcmNkaXJ9L3NlcnZlci5oCitsb3ctbHlueC5vIDogJHtzcmNkaXJ9L2xvdy1seW54LmMgJHtzcmNkaXJ9L3NlcnZlci5oCitsb3ctc2ltLm8gOiAke3NyY2Rpcn0vbG93LXNpbS5jICR7c3JjZGlyfS9zZXJ2ZXIuaAorbG93LXNwYXJjLm8gOiAkKHNyY2RpcikvbG93LXNwYXJjLmMgJChzcmNkaXIpL3NlcnZlci5oCitsb3ctc3VuMy5vIDogJChzcmNkaXIpL2xvdy1zdW4zLmMgJChzcmNkaXIpL3NlcnZlci5oCitsb3ctaHBwYWJzZC5vIDogJChzcmNkaXIpL2xvdy1ocHBhYnNkLmMgJChzcmNkaXIpL3NlcnZlci5oCit1dGlscy5vIDogJHtzcmNkaXJ9L3V0aWxzLmMgJHtzcmNkaXJ9L3NlcnZlci5oCisKKyMgVGhpcyBpcyB0aGUgZW5kIG9mICJNYWtlZmlsZS5pbiIuCmRpZmYgLS1naXQgYS9nZGIvZ2Ric2VydmVyL1JFQURNRSBiL2dkYi9nZGJzZXJ2ZXIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyODFiZjYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZ2Ric2VydmVyL1JFQURNRQpAQCAtMCwwICsxLDEyNyBAQAorCQkgICBSRUFETUUgZm9yIEdEQnNlcnZlciAmIEdEQnJlcGxheQorCQkgICAgYnkgU3R1IEdyb3NzbWFuIGFuZCBGcmVkIEZpc2gKKworSW50cm9kdWN0aW9uOgorCitUaGlzIGlzIEdEQnNlcnZlciwgYSByZW1vdGUgc2VydmVyIGZvciBVbip4LWxpa2Ugc3lzdGVtcy4gIEl0IGNhbiBiZSB1c2VkIHRvCitjb250cm9sIHRoZSBleGVjdXRpb24gb2YgYSBwcm9ncmFtIG9uIGEgdGFyZ2V0IHN5c3RlbSBmcm9tIGEgR0RCIG9uIGEgZGlmZmVyZW50Citob3N0LiAgR0RCIGFuZCBHREJzZXJ2ZXIgY29tbXVuaWNhdGUgdXNpbmcgdGhlIHN0YW5kYXJkIHJlbW90ZSBzZXJpYWwgcHJvdG9jb2wKK2ltcGxlbWVudGVkIGluIHJlbW90ZS5jLCBhbmQgdmFyaW91cyAqLXN0dWIuYyBmaWxlcy4gIFRoZXkgY29tbXVuaWNhdGUgdmlhCitlaXRoZXIgYSBzZXJpYWwgbGluZSBvciBhIFRDUCBjb25uZWN0aW9uLgorCitVc2FnZSAoc2VydmVyICh0YXJnZXQpIHNpZGUpOgorCitGaXJzdCwgeW91IG5lZWQgdG8gaGF2ZSBhIGNvcHkgb2YgdGhlIHByb2dyYW0geW91IHdhbnQgdG8gZGVidWcgcHV0IG9udG8KK3RoZSB0YXJnZXQgc3lzdGVtLiAgVGhlIHByb2dyYW0gY2FuIGJlIHN0cmlwcGVkIHRvIHNhdmUgc3BhY2UgaWYgbmVlZGVkLCBhcworR0RCc2VydmVyIGRvZXNuJ3QgY2FyZSBhYm91dCBzeW1ib2xzLiAgQWxsIHN5bWJvbCBoYW5kbGluZyBpcyB0YWtlbiBjYXJlIG9mIGJ5Cit0aGUgR0RCIHJ1bm5pbmcgb24gdGhlIGhvc3Qgc3lzdGVtLgorCitUbyB1c2UgdGhlIHNlcnZlciwgeW91IGxvZyBvbiB0byB0aGUgdGFyZ2V0IHN5c3RlbSwgYW5kIHJ1biB0aGUgYGdkYnNlcnZlcicKK3Byb2dyYW0uICBZb3UgbXVzdCB0ZWxsIGl0IChhKSBob3cgdG8gY29tbXVuaWNhdGUgd2l0aCBHREIsIChiKSB0aGUgbmFtZSBvZgoreW91ciBwcm9ncmFtLCBhbmQgKGMpIGl0cyBhcmd1bWVudHMuICBUaGUgZ2VuZXJhbCBzeW50YXggaXM6CisKKwl0YXJnZXQ+IGdkYnNlcnZlciBDT01NIFBST0dSQU0gW0FSR1MgLi4uXQorCitGb3IgZXhhbXBsZSwgdXNpbmcgYSBzZXJpYWwgcG9ydCwgeW91IG1pZ2h0IHNheToKKworCXRhcmdldD4gZ2Ric2VydmVyIC9kZXYvY29tMSBlbWFjcyBmb28udHh0CisKK1RoaXMgdGVsbHMgZ2Ric2VydmVyIHRvIGRlYnVnIGVtYWNzIHdpdGggYW4gYXJndW1lbnQgb2YgZm9vLnR4dCwgYW5kIHRvCitjb21tdW5pY2F0ZSB3aXRoIEdEQiB2aWEgL2Rldi9jb20xLiAgR2Ric2VydmVyIG5vdyB3YWl0cyBwYXRpZW50bHkgZm9yIHRoZQoraG9zdCBHREIgdG8gY29tbXVuaWNhdGUgd2l0aCBpdC4KKworVG8gdXNlIGEgVENQIGNvbm5lY3Rpb24sIHlvdSBjb3VsZCBzYXk6CisKKwl0YXJnZXQ+IGdkYnNlcnZlciBob3N0OjIzNDUgZW1hY3MgZm9vLnR4dAorCitUaGlzIHNheXMgcHJldHR5IG11Y2ggdGhlIHNhbWUgdGhpbmcgYXMgdGhlIGxhc3QgZXhhbXBsZSwgZXhjZXB0IHRoYXQgd2UgYXJlCitnb2luZyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBob3N0IEdEQiB2aWEgVENQLiAgVGhlIGBob3N0OjIzNDUnIGFyZ3VtZW50IG1lYW5zCit0aGF0IHdlIGFyZSBleHBlY3RpbmcgdG8gc2VlIGEgVENQIGNvbm5lY3Rpb24gZnJvbSBgaG9zdCcgdG8gbG9jYWwgVENQIHBvcnQKKzIzNDUuICAoQ3VycmVudGx5LCB0aGUgYGhvc3QnIHBhcnQgaXMgaWdub3JlZC4pICBZb3UgY2FuIGNob29zZSBhbnkgbnVtYmVyIHlvdQord2FudCBmb3IgdGhlIHBvcnQgbnVtYmVyIGFzIGxvbmcgYXMgaXQgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBhbnkgZXhpc3RpbmcgVENQCitwb3J0cyBvbiB0aGUgdGFyZ2V0IHN5c3RlbS4gIFRoaXMgc2FtZSBwb3J0IG51bWJlciBtdXN0IGJlIHVzZWQgaW4gdGhlIGhvc3QKK0dEQnMgYHRhcmdldCByZW1vdGUnIGNvbW1hbmQsIHdoaWNoIHdpbGwgYmUgZGVzY3JpYmVkIHNob3J0bHkuICBOb3RlIHRoYXQgaWYKK3lvdSBjaG9zZSBhIHBvcnQgbnVtYmVyIHRoYXQgY29uZmxpY3RzIHdpdGggYW5vdGhlciBzZXJ2aWNlLCBnZGJzZXJ2ZXIgd2lsbAorcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgZXhpdC4KKworVXNhZ2UgKGhvc3Qgc2lkZSk6CisKK1lvdSBuZWVkIGFuIHVuc3RyaXBwZWQgY29weSBvZiB0aGUgdGFyZ2V0IHByb2dyYW0gb24geW91ciBob3N0IHN5c3RlbSwgc2luY2UKK0dEQiBuZWVkcyB0byBleGFtaW5lIGl0J3Mgc3ltYm9sIHRhYmxlcyBhbmQgc3VjaC4gIFN0YXJ0IHVwIEdEQiBhcyB5b3Ugbm9ybWFsbHkKK3dvdWxkLCB3aXRoIHRoZSB0YXJnZXQgcHJvZ3JhbSBhcyB0aGUgZmlyc3QgYXJndW1lbnQuICAoWW91IG1heSBuZWVkIHRvIHVzZSB0aGUKKy0tYmF1ZCBvcHRpb24gaWYgdGhlIHNlcmlhbCBsaW5lIGlzIHJ1bm5pbmcgYXQgYW55dGhpbmcgZXhjZXB0IDk2MDAgYmF1ZC4pCitJZTogYGdkYiBUQVJHRVQtUFJPRycsIG9yIGBnZGIgLS1iYXVkIEJBVUQgVEFSR0VULVBST0cnLiAgQWZ0ZXIgdGhhdCwgdGhlIG9ubHkKK25ldyBjb21tYW5kIHlvdSBuZWVkIHRvIGtub3cgYWJvdXQgaXMgYHRhcmdldCByZW1vdGUnLiAgSXQncyBhcmd1bWVudCBpcyBlaXRoZXIKK2EgZGV2aWNlIG5hbWUgKHVzdWFsbHkgYSBzZXJpYWwgZGV2aWNlLCBsaWtlIGAvZGV2L3R0eWInKSwgb3IgYSBIT1NUOlBPUlQKK2Rlc2NyaXB0b3IuICBGb3IgZXhhbXBsZToKKworCShnZGIpIHRhcmdldCByZW1vdGUgL2Rldi90dHliCisKK2NvbW11bmljYXRlcyB3aXRoIHRoZSBzZXJ2ZXIgdmlhIHNlcmlhbCBsaW5lIC9kZXYvdHR5YiwgYW5kOgorCisJKGdkYikgdGFyZ2V0IHJlbW90ZSB0aGUtdGFyZ2V0OjIzNDUKKworY29tbXVuaWNhdGVzIHZpYSBhIFRDUCBjb25uZWN0aW9uIHRvIHBvcnQgMjM0NSBvbiBob3N0IGB0aGUtdGFyZ2V0Jywgd2hlcmUKK3lvdSBwcmV2aW91c2x5IHN0YXJ0ZWQgdXAgZ2Ric2VydmVyIHdpdGggdGhlIHNhbWUgcG9ydCBudW1iZXIuICBOb3RlIHRoYXQgZm9yCitUQ1AgY29ubmVjdGlvbnMsIHlvdSBtdXN0IHN0YXJ0IHVwIGdkYnNlcnZlciBwcmlvciB0byB1c2luZyB0aGUgYHRhcmdldCByZW1vdGUnCitjb21tYW5kLCBvdGhlcndpc2UgeW91IG1heSBnZXQgYW4gZXJyb3IgdGhhdCBsb29rcyBzb21ldGhpbmcgbGlrZQorYENvbm5lY3Rpb24gcmVmdXNlZCcuCisKK0J1aWxkaW5nOgorCitDb25maWd1cmluZyBnZGJzZXJ2ZXIgeW91IHNob3VsZCBzcGVjaWZ5IHRoZSBzYW1lIG1hY2hpbmUgZm9yIGhvc3QgYW5kCit0YXJnZXQgKHdoaWNoIGFyZSB0aGUgbWFjaGluZSB0aGF0IGdkYnNlcnZlciBpcyBnb2luZyB0byBydW4gb24uICBUaGlzCitpcyBub3QgdGhlIHNhbWUgYXMgdGhlIG1hY2hpbmUgdGhhdCBnZGIgaXMgZ29pbmcgdG8gcnVuIG9uOyBidWlsZGluZworZ2Ric2VydmVyIGF1dG9tYXRpY2FsbHkgYXMgcGFydCBvZiBidWlsZGluZyBhIHdob2xlIHRyZWUgb2YgdG9vbHMgZG9lcworbm90IGN1cnJlbnRseSB3b3JrIGlmIGNyb3NzLWNvbXBpbGF0aW9uIGlzIGludm9sdmVkICh3ZSBkb24ndCBnZXQgdGhlCityaWdodCBDQyBpbiB0aGUgTWFrZWZpbGUsIHRvIHN0YXJ0IHdpdGgpKS4KKworZ2Ric2VydmVyIHNob3VsZCB3b3JrIG9uIHNwYXJjLXN1bi1zdW5vczQqIG9yIEx5bnguICBUaGUgZm9sbG93aW5nCitpbnN0cnVjdGlvbnMgcGVydGFpbiB0byBMeW54LiAgVG8gYnVpbGQgdGhlIHNlcnZlciBmb3IgTHlueCwgbWFrZSBhCituZXcgY29weSBvZiB0aGUgZGlzdHJpYnV0aW9uIG9udG8gYSBkaXNrIHRoYXQgaXMgTkZTIHNoYXJlZCB3aXRoIHRoZQorTHlueCBzeXN0ZW0uICBMZXRzIHNheSB0aGF0J3MgaW4gYSBkaXJlY3RvcnkgY2FsbGVkIHh5enp5LiAgVGhlbiwKK2ZvbGxvdyB0aGVzZSBzdGVwcyB1bmRlciB0aGUgaG9zdCBzeXN0ZW06CisKKwkxKSBjZCB4eXp6eS9nZGIvZ2Ric2VydmVyCisJMikgLi4vLi4vY29uZmlndXJlIGkzODYtbm9uZS1seW54CisKK1doZW4gdGhhdCBjb21wbGV0ZXMsIGRvIHRoZSBmb2xsb3dpbmcgb24gdGhlIEx5bnggc3lzdGVtOgorCisJMykgY2QgeHl6enkvZ2RiL2dkYnNlcnZlcgorCTQpIG1ha2UgQ0M9Z2NjCisKK0l0IHNob3VsZCBidWlsZCB3aXRoIG9ubHkgYSBtaW5vciBjb21wbGFpbnQgYWJvdXQgTlVMTCBiZWluZyByZWRlZmluZWQuICBUaGF0J3MKK2EgTHlueE9TIHByb2JsZW0sIGFuZCBjYW4gYmUgaWdub3JlZC4KKworSXQncyBhbHNvIHBvc3NpYmxlIHRoYXQgeW91IG1heSBoYXZlIGEgY3Jvc3MtY29tcGlsZXIgdG8gTHlueC4gIEluIHRoYXQgY2FzZSwKK3lvdSBjYW4gc2tpcCB0aGUgc3R1ZmYgYWJvdXQgTkZTLiAgWW91IHdvdWxkIHJlcGxhY2Ugc3RlcHMgMyAmIDQgd2l0aDoKKworCW1ha2UgQ0M9bHlueC10YXJnZXQtY29tcGlsZXIuLi4KKworVXNpbmcgR0RCcmVwbGF5OgorCitBIHNwZWNpYWwgaGFja2VkIGRvd24gdmVyc2lvbiBvZiBnZGJzZXJ2ZXIgY2FuIGJlIHVzZWQgdG8gcmVwbGF5IHJlbW90ZQorZGVidWcgbG9nIGZpbGVzIGNyZWF0ZWQgYnkgZ2RiLiAgQmVmb3JlIHVzaW5nIHRoZSBnZGIgInRhcmdldCIgY29tbWFuZCB0bworaW5pdGlhdGUgYSByZW1vdGUgZGVidWcgc2Vzc2lvbiwgdXNlICJzZXQgcmVtb3RlbG9nZmlsZSA8ZmlsZW5hbWU+IiB0byB0ZWxsCitnZGIgdGhhdCB5b3Ugd2FudCB0byBtYWtlIGEgcmVjb3JkaW5nIG9mIHRoZSBzZXJpYWwgb3IgdGNwIHNlc3Npb24uICBOb3RlCit0aGF0IHdoZW4gcmVwbGF5aW5nIHRoZSBzZXNzaW9uLCBnZGIgY29tbXVuaWNhdGVzIHdpdGggZ2RicmVwbGF5IHZpYSB0Y3AsCityZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIG9yaWdpbmFsIHNlc3Npb24gd2FzIHZpYSBhIHNlcmlhbCBsaW5rIG9yIHRjcC4KKworT25jZSB5b3UgYXJlIGRvbmUgd2l0aCB0aGUgcmVtb3RlIGRlYnVnIHNlc3Npb24sIHN0YXJ0IGdkYnJlcGxheSBhbmQKK3RlbGwgaXQgdGhlIG5hbWUgb2YgdGhlIGxvZyBmaWxlIGFuZCB0aGUgaG9zdCBhbmQgcG9ydCBudW1iZXIgdGhhdCBnZGIKK3Nob3VsZCBjb25uZWN0IHRvICh0eXBpY2FsbHkgdGhlIHNhbWUgYXMgdGhlIGhvc3QgcnVubmluZyBnZGIpOgorCisJJCBnZGJyZXBsYXkgbG9nZmlsZSBob3N0OnBvcnQKKworVGhlbiBzdGFydCBnZGIgKHByZWZlcmFibHkgaW4gYSBkaWZmZXJlbnQgc2NyZWVuIG9yIHdpbmRvdykgYW5kIHVzZSB0aGUKKyJ0YXJnZXQiIGNvbW1hbmQgdG8gY29ubmVjdCB0byBnZGJyZXBsYXk6CisKKwkoZ2RiKSB0YXJnZXQgcmVtb3RlIGhvc3Q6cG9ydAorCitSZXBlYXQgdGhlIHNhbWUgc2VxdWVuY2Ugb2YgdXNlciBjb21tYW5kcyB0byBnZGIgdGhhdCB5b3UgZ2F2ZSBpbiB0aGUKK29yaWdpbmFsIGRlYnVnIHNlc3Npb24uICBHZGIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHRlbGwgdGhhdCBpdCBpcyB0YWxraW5nCit0byBnZGJyZXBsYXkgcmF0aGVyIHRoYW4gYSByZWFsIHRhcmdldCwgYWxsIG90aGVyIHRoaW5ncyBiZWluZyBlcXVhbC4gIE5vdGUKK3RoYXQgZ2RicmVwbGF5IGVjaG9zIHRoZSBjb21tYW5kIGxpbmVzIHRvIHN0ZGVyciwgYXMgd2VsbCBhcyB0aGUgY29udGVudHMgb2YKK3RoZSBwYWNrZXRzIGl0IHNlbmRzIGFuZCByZWNlaXZlcy4gIFRoZSBsYXN0IGNvbW1hbmQgZWNob2VkIGJ5IGdkYnJlcGxheSBpcwordGhlIG5leHQgY29tbWFuZCB0aGF0IG5lZWRzIHRvIGJlIHR5cGVkIHRvIGdkYiB0byBjb250aW51ZSB0aGUgc2Vzc2lvbiBpbgorc3luYyB3aXRoIHRoZSBvcmlnaW5hbCBzZXNzaW9uLgpkaWZmIC0tZ2l0IGEvZ2RiL2dkYnNlcnZlci9jb25maWd1cmUuaW4gYi9nZGIvZ2Ric2VydmVyL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmJiNzNjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2dkYnNlcnZlci9jb25maWd1cmUuaW4KQEAgLTAsMCArMSwxMDAgQEAKK3NyY25hbWU9IlJlbW90ZSBHREIgc2VydmVyIgorc3JjdHJpZ2dlcj1zZXJ2ZXIuYworZ2RiX3NlcmlhbF9kcml2ZXI9Li4vc2VyLXVuaXguYworCisjIHBlci1ob3N0OgorCisuICR7c3JjZGlyfS8uLi9jb25maWd1cmUuaG9zdAorCitlY2hvICJnZGJzZXJ2ZXIvY29uZmlndXJlLmluOiBob3N0IGlzICRob3N0LCB0YXJnZXQgaXMgJHRhcmdldCIKKworaWYgWyAhIC1mICR7c3JjZGlyfS8uLi9jb25maWcvJHtnZGJfaG9zdF9jcHV9LyR7Z2RiX2hvc3R9Lm1oIF07IHRoZW4KKwllY2hvICcqKionICJHREIgcmVtb3RlIGRvZXMgbm90IHN1cHBvcnQgaG9zdCAke2hvc3R9IiAxPiYyCisJZXhpdCAxCitmaQorCisjICBXZSByZWFsbHkgc2hvdWxkbid0IGRlcGVuZCBvbiB0aGVyZSBiZWluZyBhIHNwYWNlIGFmdGVyIFhNX0ZJTEU9IC4uLgoraG9zdGZpbGU9YGF3ayAnJDEgPT0gIlhNX0ZJTEU9IiB7IHByaW50ICQyIH0nIDwke3NyY2Rpcn0vLi4vY29uZmlnLyR7Z2RiX2hvc3RfY3B1fS8ke2dkYl9ob3N0fS5taGAKKworIyBwZXItdGFyZ2V0OgorCisuICR7c3JjZGlyfS8uLi9jb25maWd1cmUudGd0CisKK2VjaG8gImdkYnNlcnZlci9jb25maWd1cmUuaW46IGhvc3RfY3B1IGlzICRob3N0X2NwdSwgdGFyZ2V0X2NwdSBpcyAkdGFyZ2V0X2NwdSIKKworaWYgWyAhIC1mICR7c3JjZGlyfS8uLi9jb25maWcvJHtnZGJfdGFyZ2V0X2NwdX0vJHtnZGJfdGFyZ2V0fS5tdCBdOyB0aGVuCisJZWNobyAnKioqJyAiR0RCIHJlbW90ZSBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldCAke3RhcmdldH0iIDE+JjIKKwlleGl0IDEKK2ZpCisKK2lmIFsgLXogIiR7cmVtb3Zpbmd9IiBdIDsgdGhlbgorCWNhdCAke3NyY2Rpcn0vLi4vY29uZmlnLyR7Z2RiX2hvc3RfY3B1fS8ke2dkYl9ob3N0fS5taCAke3NyY2Rpcn0vLi4vY29uZmlnLyR7Z2RiX3RhcmdldF9jcHV9LyR7Z2RiX3RhcmdldH0ubXQgfCBhd2sgJyQxID09ICIjbXNnIiB7CisJCXByaW50IHN1YnN0cigkMCw2KX0nCitmaQorCisjICBXZSByZWFsbHkgc2hvdWxkbid0IGRlcGVuZCBvbiB0aGVyZSBiZWluZyBhIHNwYWNlIGFmdGVyIFRNX0ZJTEU9IC4uLgordGFyZ2V0ZmlsZT1gYXdrICckMSA9PSAiVE1fRklMRT0iIHsgcHJpbnQgJDIgfScgPCR7c3JjZGlyfS8uLi9jb25maWcvJHtnZGJfdGFyZ2V0X2NwdX0vJHtnZGJfdGFyZ2V0fS5tdGAKKworaWYgWyAiJHt0YXJnZXR9IiA9ICIke2hvc3R9IiBdIDsgdGhlbgorCW5hdGl2ZWZpbGU9YGF3ayAnJDEgPT0gIk5BVF9GSUxFPSIgeyBwcmludCAkMiB9JyA8JHtzcmNkaXJ9Ly4uL2NvbmZpZy8ke2dkYl9ob3N0X2NwdX0vJHtnZGJfaG9zdH0ubWhgCitmaQorCitob3N0X21ha2VmaWxlX2ZyYWc9Li4vY29uZmlnLyR7Z2RiX2hvc3RfY3B1fS8ke2dkYl9ob3N0fS5taAordGFyZ2V0X21ha2VmaWxlX2ZyYWc9Li4vY29uZmlnLyR7Z2RiX3RhcmdldF9jcHV9LyR7Z2RiX3RhcmdldH0ubXQKKworIyBJZiBob3N0ZmlsZSAoWE1fRklMRSkgYW5kL29yIHRhcmdldGZpbGUgKFRNX0ZJTEUpIGFuZC9vciBuYXRpdmVmaWxlCisjIChOQVRfRklMRSkgaXMgbm90IHNldCBpbiB0aGUgP2NvbmZpZy8qIGZpbGUsIHdlIGRvbid0IG1ha2UgdGhlCisjIGNvcnJlc3BvbmRpbmcgbGlua3MuICBCdXQgd2UgaGF2ZSB0byByZW1vdmUgdGhlIHhtLmggZmlsZXMgYW5kIHRtLmgKKyMgZmlsZXMgYW55d2F5LCBlLmcuIHdoZW4gc3dpdGNoaW5nIGZyb20gImNvbmZpZ3VyZSBob3N0IiB0bworIyAiY29uZmlndXJlIG5vbmUiLgorCitmaWxlcz0KK2xpbmtzPQorcm0gLWYgeG0uaAorcm0gLWYgc2VyLWhhcmR3aXJlLmMKK2lmIFsgIiR7aG9zdGZpbGV9IiAhPSAiIiBdOyB0aGVuCisJaWYgWyAtZiAke3NyY2Rpcn0vLi4vY29uZmlnLyR7aG9zdGZpbGV9IF07IHRoZW4KKwkJZmlsZXM9IiR7ZmlsZXN9IC4uL2NvbmZpZy8ke2hvc3RmaWxlfSIKKwllbHNlCisJCWZpbGVzPSIke2ZpbGVzfSAuLi9jb25maWcvJHtnZGJfaG9zdF9jcHV9LyR7aG9zdGZpbGV9IgorCWZpCisJbGlua3M9IiR7bGlua3N9IHhtLmgiCisKKyMJZmlsZXM9IiR7ZmlsZXN9ICR7Z2RiX3NlcmlhbF9kcml2ZXJ9IgorIwlsaW5rcz0iJHtsaW5rc30gc2VyLWhhcmR3aXJlLmMiCitmaQorcm0gLWYgdG0uaAoraWYgWyAiJHt0YXJnZXRmaWxlfSIgIT0gIiIgXTsgdGhlbgorCWlmIFsgLWYgJHtzcmNkaXJ9Ly4uL2NvbmZpZy8ke3RhcmdldGZpbGV9IF07IHRoZW4KKwkJZmlsZXM9IiR7ZmlsZXN9IC4uL2NvbmZpZy8ke3RhcmdldGZpbGV9IgorCWVsc2UKKwkJZmlsZXM9IiR7ZmlsZXN9IC4uL2NvbmZpZy8ke2dkYl90YXJnZXRfY3B1fS8ke3RhcmdldGZpbGV9IgorCWZpCisJbGlua3M9IiR7bGlua3N9IHRtLmgiCitmaQorcm0gLWYgbm0uaAoraWYgWyAiJHtuYXRpdmVmaWxlfSIgIT0gIiIgXTsgdGhlbgorCWlmIFsgLWYgJHtzcmNkaXJ9Ly4uL2NvbmZpZy8ke25hdGl2ZWZpbGV9IF07IHRoZW4KKwkJZmlsZXM9IiR7ZmlsZXN9IC4uL2NvbmZpZy8ke25hdGl2ZWZpbGV9IgorCWVsc2UKKwkJZmlsZXM9IiR7ZmlsZXN9IC4uL2NvbmZpZy8ke2dkYl9ob3N0X2NwdX0vJHtuYXRpdmVmaWxlfSIKKwlmaQorCWxpbmtzPSIke2xpbmtzfSBubS5oIgorIyB0ZW1wb3Jhcnkgc2NhZmZvbGRpbmcgdW50aWwgYWxsIGhvc3RzIGhhdmUgdGhlIGhvc3QvdGFyZ2V0L25hdGl2ZQorIyBzcGxpdCBpbiBwbGFjZS4KK2Vsc2UKKwlmaWxlcz0iJHtmaWxlc30gLi4vY29uZmlnL25tLWVtcHR5LmgiCisJbGlua3M9IiR7bGlua3N9IG5tLmgiCitmaQorCitpZiBbICR7dGFyZ2V0X2NwdX0gPSAic3BhcmNsaXRlIiBdOyB0aGVuCisJY29uZmlnZGlycz0iJHtjb25maWdkaXJzfSBzcGFyY2xpdGUiCitmaQorCisjIHBvc3QtdGFyZ2V0OgorCitpZiBbICIke25hdGl2ZWZpbGV9IiA9ICIiIF0gOyB0aGVuCisJc2VkIC1lICcvXk5BVERFUEZJTEVTPSAvcy8vIyBOQVRERVBGSUxFUz0gLycgXAorCQk8IE1ha2VmaWxlID4gTWFrZWZpbGUudGVtCisJbXYgLWYgTWFrZWZpbGUudGVtIE1ha2VmaWxlCitmaQpkaWZmIC0tZ2l0IGEvZ2RiL2dkYnNlcnZlci9nZGJyZXBsYXkuYyBiL2dkYi9nZGJzZXJ2ZXIvZ2RicmVwbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlMDZiYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9nZGJzZXJ2ZXIvZ2RicmVwbGF5LmMKQEAgLTAsMCArMSwzMTggQEAKKy8qIFJlcGxheSBhIHJlbW90ZSBkZWJ1ZyBzZXNzaW9uIGxvZ2ZpbGUgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIChmbmZAY3lnbnVzLmNvbSkgZnJvbSBwaWVjZXMgb2YgZ2Ric2VydmVyLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisvKiBTb3J0IG9mIGEgaGFjay4uLiAqLworI2RlZmluZSBFT0wgKEVPRiAtIDEpCisKK3N0YXRpYyBpbnQgcmVtb3RlX2Rlc2M7CisKKy8qIFByaW50IHRoZSBzeXN0ZW0gZXJyb3IgbWVzc2FnZSBmb3IgZXJybm8sIGFuZCBhbHNvIG1lbnRpb24gU1RSSU5HCisgICBhcyB0aGUgZmlsZSBuYW1lIGZvciB3aGljaCB0aGUgZXJyb3Igd2FzIGVuY291bnRlcmVkLgorICAgVGhlbiByZXR1cm4gdG8gY29tbWFuZCBsZXZlbC4gICovCisKK3ZvaWQKK3BlcnJvcl93aXRoX25hbWUgKHN0cmluZykKKyAgICAgY2hhciAqc3RyaW5nOworeworICBleHRlcm4gaW50IHN5c19uZXJyOworICBleHRlcm4gY2hhciAqc3lzX2Vycmxpc3RbXTsKKyAgZXh0ZXJuIGludCBlcnJubzsKKyAgY2hhciAqZXJyOworICBjaGFyICpjb21iaW5lZDsKKworICBlcnIgPSAoZXJybm8gPCBzeXNfbmVycikgPyBzeXNfZXJybGlzdFtlcnJub10gOiAidW5rbm93biBlcnJvciI7CisgIGNvbWJpbmVkID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGVycikgKyBzdHJsZW4gKHN0cmluZykgKyAzKTsKKyAgc3RyY3B5IChjb21iaW5lZCwgc3RyaW5nKTsKKyAgc3RyY2F0IChjb21iaW5lZCwgIjogIik7CisgIHN0cmNhdCAoY29tYmluZWQsIGVycik7CisgIGZwcmludGYgKHN0ZGVyciwgIlxuJXMuXG4iLCBjb21iaW5lZCk7CisgIGZmbHVzaCAoc3RkZXJyKTsKKyAgZXhpdCAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitzeW5jX2Vycm9yIChmcCwgZGVzYywgZXhwZWN0LCBnb3QpCisgICAgIEZJTEUgKmZwOworICAgICBjaGFyICpkZXNjOworICAgICBpbnQgZXhwZWN0OworICAgICBpbnQgZ290OworeworICBmcHJpbnRmIChzdGRlcnIsICJcbiVzXG4iLCBkZXNjKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiQXQgbG9nZmlsZSBvZmZzZXQgJWxkLCBleHBlY3RlZCAnMHgleCcgZ290ICcweCV4J1xuIiwKKwkgICBmdGVsbCAoZnApLCBleHBlY3QsIGdvdCk7CisgIGZmbHVzaCAoc3RkZXJyKTsKKyAgZXhpdCAoMSk7Cit9CisKK3ZvaWQKK3JlbW90ZV9jbG9zZSgpCit7CisgIGNsb3NlIChyZW1vdGVfZGVzYyk7Cit9CisKKy8qIE9wZW4gYSBjb25uZWN0aW9uIHRvIGEgcmVtb3RlIGRlYnVnZ2VyLgorICAgTkFNRSBpcyB0aGUgZmlsZW5hbWUgdXNlZCBmb3IgY29tbXVuaWNhdGlvbi4gICovCisKK3ZvaWQKK3JlbW90ZV9vcGVuIChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICBleHRlcm4gY2hhciAqc3RyY2hyICgpOworCisgIGlmICghc3RyY2hyIChuYW1lLCAnOicpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBNdXN0IHNwZWNpZnkgdGNwIGNvbm5lY3Rpb24gYXMgaG9zdDphZGRyXG4iLCBuYW1lKTsKKyAgICAgIGZmbHVzaCAoc3RkZXJyKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgKnBvcnRfc3RyOworICAgICAgaW50IHBvcnQ7CisgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja2FkZHI7CisgICAgICBpbnQgdG1wOworICAgICAgc3RydWN0IHByb3RvZW50ICpwcm90b2VudDsKKyAgICAgIGludCB0bXBfZGVzYzsKKworICAgICAgcG9ydF9zdHIgPSBzdHJjaHIgKG5hbWUsICc6Jyk7CisKKyAgICAgIHBvcnQgPSBhdG9pIChwb3J0X3N0ciArIDEpOworCisgICAgICB0bXBfZGVzYyA9IHNvY2tldCAoUEZfSU5FVCwgU09DS19TVFJFQU0sIDApOworICAgICAgaWYgKHRtcF9kZXNjIDwgMCkKKwlwZXJyb3Jfd2l0aF9uYW1lICgiQ2FuJ3Qgb3BlbiBzb2NrZXQiKTsKKworICAgICAgLyogQWxsb3cgcmFwaWQgcmV1c2Ugb2YgdGhpcyBwb3J0LiAqLworICAgICAgdG1wID0gMTsKKyAgICAgIHNldHNvY2tvcHQgKHRtcF9kZXNjLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChjaGFyICopJnRtcCwKKwkJICBzaXplb2YodG1wKSk7CisKKyAgICAgIHNvY2thZGRyLnNpbl9mYW1pbHkgPSBQRl9JTkVUOworICAgICAgc29ja2FkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKyAgICAgIHNvY2thZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisKKyAgICAgIGlmIChiaW5kICh0bXBfZGVzYywgKHN0cnVjdCBzb2NrYWRkciAqKSZzb2NrYWRkciwgc2l6ZW9mIChzb2NrYWRkcikpCisJICB8fCBsaXN0ZW4gKHRtcF9kZXNjLCAxKSkKKwlwZXJyb3Jfd2l0aF9uYW1lICgiQ2FuJ3QgYmluZCBhZGRyZXNzIik7CisKKyAgICAgIHRtcCA9IHNpemVvZiAoc29ja2FkZHIpOworICAgICAgcmVtb3RlX2Rlc2MgPSBhY2NlcHQgKHRtcF9kZXNjLCAoc3RydWN0IHNvY2thZGRyICopJnNvY2thZGRyLCAmdG1wKTsKKyAgICAgIGlmIChyZW1vdGVfZGVzYyA9PSAtMSkKKwlwZXJyb3Jfd2l0aF9uYW1lICgiQWNjZXB0IGZhaWxlZCIpOworCisgICAgICBwcm90b2VudCA9IGdldHByb3RvYnluYW1lICgidGNwIik7CisgICAgICBpZiAoIXByb3RvZW50KQorCXBlcnJvcl93aXRoX25hbWUgKCJnZXRwcm90b2J5bmFtZSIpOworCisgICAgICAvKiBFbmFibGUgVENQIGtlZXAgYWxpdmUgcHJvY2Vzcy4gKi8KKyAgICAgIHRtcCA9IDE7CisgICAgICBzZXRzb2Nrb3B0ICh0bXBfZGVzYywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAoY2hhciAqKSZ0bXAsIHNpemVvZih0bXApKTsKKworICAgICAgLyogVGVsbCBUQ1Agbm90IHRvIGRlbGF5IHNtYWxsIHBhY2tldHMuICBUaGlzIGdyZWF0bHkgc3BlZWRzIHVwCisJIGludGVyYWN0aXZlIHJlc3BvbnNlLiAqLworICAgICAgdG1wID0gMTsKKyAgICAgIHNldHNvY2tvcHQgKHJlbW90ZV9kZXNjLCBwcm90b2VudC0+cF9wcm90bywgVENQX05PREVMQVksCisJCSAgKGNoYXIgKikmdG1wLCBzaXplb2YodG1wKSk7CisKKyAgICAgIGNsb3NlICh0bXBfZGVzYyk7CQkvKiBObyBsb25nZXIgbmVlZCB0aGlzICovCisKKyAgICAgIHNpZ25hbCAoU0lHUElQRSwgU0lHX0lHTik7IC8qIElmIHdlIGRvbid0IGRvIHRoaXMsIHRoZW4gZ2RicmVwbGF5IHNpbXBseQorCQkJCSAgICBleGl0cyB3aGVuIHRoZSByZW1vdGUgc2lkZSBkaWVzLiAgKi8KKyAgICB9CisKKyAgZmNudGwgKHJlbW90ZV9kZXNjLCBGX1NFVEZMLCBGQVNZTkMpOworCisgIGZwcmludGYgKHN0ZGVyciwgIlJlcGxheSBsb2dmaWxlIHVzaW5nICVzXG4iLCBuYW1lKTsKKyAgZmZsdXNoIChzdGRlcnIpOworfQorCitzdGF0aWMgaW50IHRvaGV4IChjaCkKKyAgICAgaW50IGNoOworeworICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKKyAgICB7CisgICAgICByZXR1cm4gKGNoIC0gJzAnKTsKKyAgICB9CisgIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKQorICAgIHsKKyAgICAgIHJldHVybiAoY2ggLSAnQScgKyAxMCk7CisgICAgfQorICBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykKKyAgICB7CisgICAgICByZXR1cm4gKGNoIC0gJ2EnICsgMTApOworICAgIH0KKyAgZnByaW50ZiAoc3RkZXJyLCAiXG5JbnZhbGlkIGhleCBkaWdpdCAnJWMnXG4iLCBjaCk7CisgIGZmbHVzaCAoc3RkZXJyKTsKKyAgZXhpdCAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK2xvZ2NoYXIgKGZwKQorICAgICBGSUxFICpmcDsKK3sKKyAgaW50IGNoOworICBpbnQgY2gyOworCisgIGNoID0gZmdldGMgKGZwKTsKKyAgZnB1dGMgKGNoLCBzdGRvdXQpOworICBmZmx1c2ggKHN0ZG91dCk7CisgIHN3aXRjaCAoY2gpCisgICAgeworICAgIGNhc2UgJ1xuJzoKKyAgICAgIGNoID0gRU9MOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXFwnOgorICAgICAgY2ggPSBmZ2V0YyAoZnApOworICAgICAgZnB1dGMgKGNoLCBzdGRvdXQpOworICAgICAgZmZsdXNoIChzdGRvdXQpOworICAgICAgc3dpdGNoIChjaCkKKwl7CisJY2FzZSAnXFwnOiBicmVhazsKKwljYXNlICdiJzogY2ggPSAnXGInOyBicmVhazsKKwljYXNlICdmJzogY2ggPSAnXGYnOyBicmVhazsKKwljYXNlICduJzogY2ggPSAnXG4nOyBicmVhazsKKwljYXNlICdyJzogY2ggPSAnXHInOyBicmVhazsKKwljYXNlICd0JzogY2ggPSAnXHQnOyBicmVhazsKKwljYXNlICd2JzogY2ggPSAnXHYnOyBicmVhazsKKwljYXNlICd4JzoKKwkgIGNoMiA9IGZnZXRjIChmcCk7CisJICBmcHV0YyAoY2gyLCBzdGRvdXQpOworCSAgZmZsdXNoIChzdGRvdXQpOworCSAgY2ggPSB0b2hleCAoY2gyKSA8PCA0OworCSAgY2gyID0gZmdldGMgKGZwKTsKKwkgIGZwdXRjIChjaDIsIHN0ZG91dCk7CisJICBmZmx1c2ggKHN0ZG91dCk7CisJICBjaCB8PSB0b2hleCAoY2gyKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICAvKiBUcmVhdCBhbnkgb3RoZXIgY2hhciBhcyBqdXN0IGl0c2VsZiAqLworCSAgYnJlYWs7CisJfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAoY2gpOworfQorCisvKiBBY2NlcHQgaW5wdXQgZnJvbSBnZGIgYW5kIG1hdGNoIHdpdGggY2hhcnMgZnJvbSBmcCAoYWZ0ZXIgc2tpcHBpbmcgb25lCisgICBibGFuaykgdXAgdW50aWwgYSBcbiBpcyByZWFkIGZyb20gZnAgKHdoaWNoIGlzIG5vdCBtYXRjaGVkKSAqLworCit2b2lkCitleHBlY3QgKGZwKQorICAgICBGSUxFICpmcDsKK3sKKyAgaW50IGZyb21sb2c7CisgIHVuc2lnbmVkIGNoYXIgZnJvbWdkYjsKKworICBpZiAoKGZyb21sb2cgPSBsb2djaGFyIChmcCkpICE9ICcgJykKKyAgICB7CisgICAgICBzeW5jX2Vycm9yIChmcCwgIlN5bmMgZXJyb3IgZHVyaW5nIGdkYiByZWFkIG9mIGxlYWRpbmcgYmxhbmsiLCAnICcsCisJCSAgZnJvbWxvZyk7CisgICAgfQorICBkbworICAgIHsKKyAgICAgIGZyb21sb2cgPSBsb2djaGFyIChmcCk7CisgICAgICBpZiAoZnJvbWxvZyA9PSBFT0wpCisJeworCSAgYnJlYWs7CisJfQorICAgICAgcmVhZCAocmVtb3RlX2Rlc2MsICZmcm9tZ2RiLCAxKTsKKyAgICB9IHdoaWxlIChmcm9tbG9nID09IGZyb21nZGIpOworICBpZiAoZnJvbWxvZyAhPSBFT0wpCisgICAgeworICAgICAgc3luY19lcnJvciAoZnAsICJTeW5jIGVycm9yIGR1cmluZyByZWFkIG9mIGdkYiBwYWNrZXQiLCBmcm9tbG9nLAorCQkgIGZyb21nZGIpOworICAgIH0KK30KKworLyogUGxheSBkYXRhIGJhY2sgdG8gZ2RiIGZyb20gZnAgKGFmdGVyIHNraXBwaW5nIGxlYWRpbmcgYmxhbmspIHVwIHVudGlsIGEKKyAgIFxuIGlzIHJlYWQgZnJvbSBmcCAod2hpY2ggaXMgZGlzY2FyZGVkIGFuZCBub3Qgc2VudCB0byBnZGIpLiAqLworCit2b2lkCitwbGF5IChmcCkKKyAgICAgRklMRSAqZnA7Cit7CisgIGludCBmcm9tbG9nOworICBjaGFyIGNoOworCisgIGlmICgoZnJvbWxvZyA9IGxvZ2NoYXIgKGZwKSkgIT0gJyAnKQorICAgIHsKKyAgICAgIHN5bmNfZXJyb3IgKGZwLCAiU3luYyBlcnJvciBza2lwcGluZyBibGFuayBkdXJpbmcgd3JpdGUgdG8gZ2RiIiwgJyAnLAorCQkgIGZyb21sb2cpOworICAgIH0KKyAgd2hpbGUgKChmcm9tbG9nID0gbG9nY2hhciAoZnApKSAhPSBFT0wpCisgICAgeworICAgICAgY2ggPSBmcm9tbG9nOworICAgICAgd3JpdGUgKHJlbW90ZV9kZXNjLCAmY2gsIDEpOworICAgIH0KK30KKworaW50CittYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqYXJndltdOworeworICBGSUxFICpmcDsKKyAgaW50IGNoOworCisgIGlmIChhcmdjIDwgMykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogZ2RicmVwbGF5IDxsb2dmaWxlPiA8aG9zdDpwb3J0PlxuIik7CisgICAgICBmZmx1c2ggKHN0ZGVycik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIGZwID0gZm9wZW4gKGFyZ3ZbMV0sICJyIik7CisgIGlmIChmcCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHBlcnJvcl93aXRoX25hbWUgKGFyZ3ZbMV0pOworICAgIH0gICAgICAKKyAgcmVtb3RlX29wZW4gKGFyZ3ZbMl0pOworICB3aGlsZSAoKGNoID0gbG9nY2hhciAoZnApKSAhPSBFT0YpCisgICAgeworICAgICAgc3dpdGNoIChjaCkKKwl7CisJY2FzZSAndyc6CisJICAvKiBkYXRhIHNlbnQgZnJvbSBnZGIgdG8gZ2RicmVwbGF5LCBhY2NlcHQgYW5kIG1hdGNoIGl0ICovCisJICBleHBlY3QgKGZwKTsKKwkgIGJyZWFrOworCWNhc2UgJ3InOgorCSAgLyogZGF0YSBzZW50IGZyb20gZ2RicmVwbGF5IHRvIGdkYiwgcGxheSBpdCAqLworCSAgcGxheSAoZnApOworCSAgYnJlYWs7CisJY2FzZSAnYyc6CisJICAvKiBDb21tYW5kIGV4ZWN1dGVkIGJ5IGdkYiAqLworCSAgd2hpbGUgKChjaCA9IGxvZ2NoYXIgKGZwKSkgIT0gRU9MKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIHJlbW90ZV9jbG9zZSAoKTsKKyAgZXhpdCAoMCk7Cit9CisKZGlmZiAtLWdpdCBhL2dkYi9nZGJzZXJ2ZXIvZ2Ric2VydmVyLjEgYi9nZGIvZ2Ric2VydmVyL2dkYnNlcnZlci4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkM2ZkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZ2Ric2VydmVyL2dkYnNlcnZlci4xCkBAIC0wLDAgKzEsMTAzIEBACisuXCIgQ29weXJpZ2h0IChjKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCisuVEggZ2Ric2VydmVyIDEgIjIgTm92ZW1iZXIgMTk5MyIgIkN5Z251cyBTdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgorLlNIIE5BTUUKK2dkYnNlcnZlciBcLSBSZW1vdGUgU2VydmVyIGZvciB0aGUgR05VIERlYnVnZ2VyCisuU0ggU1lOT1BTSVMKKy5uYQorLlRQCisuQiBnZGJzZXJ2ZXIKKy5SQiB0dHkKKy5SQiBwcm9nCisuUkIgIltcfCIgYXJncy4uLiAiXHxdIgorLmFkIGIKKy5TSCBERVNDUklQVElPTgorR0RCU0VSVkVSIGlzIGEgcHJvZ3JhbSB0aGF0IGFsbG93cyB5b3UgdG8gcnVuIEdEQiBvbiBhIGRpZmZlcmVudCBtYWNoaW5lCit0aGFuIHRoZSBvbmUgd2hpY2ggaXMgcnVubmluZyB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZC4KKworVXNhZ2UgKHNlcnZlciAodGFyZ2V0KSBzaWRlKToKKworRmlyc3QsIHlvdSBuZWVkIHRvIGhhdmUgYSBjb3B5IG9mIHRoZSBwcm9ncmFtIHlvdSB3YW50IHRvIGRlYnVnIHB1dCBvbnRvCit0aGUgdGFyZ2V0IHN5c3RlbS4gIFRoZSBwcm9ncmFtIGNhbiBiZSBzdHJpcHBlZCB0byBzYXZlIHNwYWNlIGlmIG5lZWRlZCwgYXMKK0dEQnNlcnZlciBkb2Vzbid0IGNhcmUgYWJvdXQgc3ltYm9scy4gIEFsbCBzeW1ib2wgaGFuZGxpbmcgaXMgdGFrZW4gY2FyZSBvZiBieQordGhlIEdEQiBydW5uaW5nIG9uIHRoZSBob3N0IHN5c3RlbS4KKworVG8gdXNlIHRoZSBzZXJ2ZXIsIHlvdSBsb2cgb24gdG8gdGhlIHRhcmdldCBzeXN0ZW0sIGFuZCBydW4gdGhlIGBnZGJzZXJ2ZXInCitwcm9ncmFtLiAgWW91IG11c3QgdGVsbCBpdCAoYSkgaG93IHRvIGNvbW11bmljYXRlIHdpdGggR0RCLCAoYikgdGhlIG5hbWUgb2YKK3lvdXIgcHJvZ3JhbSwgYW5kIChjKSBpdHMgYXJndW1lbnRzLiAgVGhlIGdlbmVyYWwgc3ludGF4IGlzOgorCisJdGFyZ2V0PiBnZGJzZXJ2ZXIgQ09NTSBQUk9HUkFNIFtBUkdTIC4uLl0KKworRm9yIGV4YW1wbGUsIHVzaW5nIGEgc2VyaWFsIHBvcnQsIHlvdSBtaWdodCBzYXk6CisKKwl0YXJnZXQ+IGdkYnNlcnZlciAvZGV2L2NvbTEgZW1hY3MgZm9vLnR4dAorCitUaGlzIHRlbGxzIGdkYnNlcnZlciB0byBkZWJ1ZyBlbWFjcyB3aXRoIGFuIGFyZ3VtZW50IG9mIGZvby50eHQsIGFuZCB0bworY29tbXVuaWNhdGUgd2l0aCBHREIgdmlhIC9kZXYvY29tMS4gIEdkYnNlcnZlciBub3cgd2FpdHMgcGF0aWVudGx5IGZvciB0aGUKK2hvc3QgR0RCIHRvIGNvbW11bmljYXRlIHdpdGggaXQuCisKK1RvIHVzZSBhIFRDUCBjb25uZWN0aW9uLCB5b3UgY291bGQgc2F5OgorCisJdGFyZ2V0PiBnZGJzZXJ2ZXIgaG9zdDoyMzQ1IGVtYWNzIGZvby50eHQKKworVGhpcyBzYXlzIHByZXR0eSBtdWNoIHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBsYXN0IGV4YW1wbGUsIGV4Y2VwdCB0aGF0IHdlIGFyZQorZ29pbmcgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgaG9zdCBHREIgdmlhIFRDUC4gIFRoZSBgaG9zdDoyMzQ1JyBhcmd1bWVudCBtZWFucwordGhhdCB3ZSBhcmUgZXhwZWN0aW5nIHRvIHNlZSBhIFRDUCBjb25uZWN0aW9uIGZyb20gYGhvc3QnIHRvIGxvY2FsIFRDUCBwb3J0CisyMzQ1LiAgKEN1cnJlbnRseSwgdGhlIGBob3N0JyBwYXJ0IGlzIGlnbm9yZWQuKSAgWW91IGNhbiBjaG9vc2UgYW55IG51bWJlciB5b3UKK3dhbnQgZm9yIHRoZSBwb3J0IG51bWJlciBhcyBsb25nIGFzIGl0IGRvZXMgbm90IGNvbmZsaWN0IHdpdGggYW55IGV4aXN0aW5nIFRDUAorcG9ydHMgb24gdGhlIHRhcmdldCBzeXN0ZW0uICBUaGlzIHNhbWUgcG9ydCBudW1iZXIgbXVzdCBiZSB1c2VkIGluIHRoZSBob3N0CitHREJzIGB0YXJnZXQgcmVtb3RlJyBjb21tYW5kLCB3aGljaCB3aWxsIGJlIGRlc2NyaWJlZCBzaG9ydGx5LiAgTm90ZSB0aGF0IGlmCit5b3UgY2hvc2UgYSBwb3J0IG51bWJlciB0aGF0IGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgc2VydmljZSwgZ2Ric2VydmVyIHdpbGwKK3ByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQuCisKK1VzYWdlIChob3N0IHNpZGUpOgorCitZb3UgbmVlZCBhbiB1bnN0cmlwcGVkIGNvcHkgb2YgdGhlIHRhcmdldCBwcm9ncmFtIG9uIHlvdXIgaG9zdCBzeXN0ZW0sIHNpbmNlCitHREIgbmVlZHMgdG8gZXhhbWluZSBpdCdzIHN5bWJvbCB0YWJsZXMgYW5kIHN1Y2guICBTdGFydCB1cCBHREIgYXMgeW91IG5vcm1hbGx5Cit3b3VsZCwgd2l0aCB0aGUgdGFyZ2V0IHByb2dyYW0gYXMgdGhlIGZpcnN0IGFyZ3VtZW50LiAgKFlvdSBtYXkgbmVlZCB0byB1c2UgdGhlCistLWJhdWQgb3B0aW9uIGlmIHRoZSBzZXJpYWwgbGluZSBpcyBydW5uaW5nIGF0IGFueXRoaW5nIGV4Y2VwdCA5NjAwIGJhdWQuKQorSWU6IGBnZGIgVEFSR0VULVBST0cnLCBvciBgZ2RiIC0tYmF1ZCBCQVVEIFRBUkdFVC1QUk9HJy4gIEFmdGVyIHRoYXQsIHRoZSBvbmx5CituZXcgY29tbWFuZCB5b3UgbmVlZCB0byBrbm93IGFib3V0IGlzIGB0YXJnZXQgcmVtb3RlJy4gIEl0J3MgYXJndW1lbnQgaXMgZWl0aGVyCithIGRldmljZSBuYW1lICh1c3VhbGx5IGEgc2VyaWFsIGRldmljZSwgbGlrZSBgL2Rldi90dHliJyksIG9yIGEgSE9TVDpQT1JUCitkZXNjcmlwdG9yLiAgRm9yIGV4YW1wbGU6CisKKwkoZ2RiKSB0YXJnZXQgcmVtb3RlIC9kZXYvdHR5YgorCitjb21tdW5pY2F0ZXMgd2l0aCB0aGUgc2VydmVyIHZpYSBzZXJpYWwgbGluZSAvZGV2L3R0eWIsIGFuZDoKKworCShnZGIpIHRhcmdldCByZW1vdGUgdGhlLXRhcmdldDoyMzQ1CisKK2NvbW11bmljYXRlcyB2aWEgYSBUQ1AgY29ubmVjdGlvbiB0byBwb3J0IDIzNDUgb24gaG9zdCBgdGhlLXRhcmdldCcsIHdoZXJlCit5b3UgcHJldmlvdXNseSBzdGFydGVkIHVwIGdkYnNlcnZlciB3aXRoIHRoZSBzYW1lIHBvcnQgbnVtYmVyLiAgTm90ZSB0aGF0IGZvcgorVENQIGNvbm5lY3Rpb25zLCB5b3UgbXVzdCBzdGFydCB1cCBnZGJzZXJ2ZXIgcHJpb3IgdG8gdXNpbmcgdGhlIGB0YXJnZXQgcmVtb3RlJworY29tbWFuZCwgb3RoZXJ3aXNlIHlvdSBtYXkgZ2V0IGFuIGVycm9yIHRoYXQgbG9va3Mgc29tZXRoaW5nIGxpa2UKK2BDb25uZWN0aW9uIHJlZnVzZWQnLgorLlNIIE9QVElPTlMKK1lvdSBoYXZlIHRvIHN1cHBseSB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byBkZWJ1ZworYW5kIHRoZSB0dHkgdG8gY29tbXVuaWNhdGUgb247IHRoZSByZW1vdGUgR0RCIHdpbGwgZG8gZXZlcnl0aGluZyBlbHNlLgorQW55IHJlbWFpbmluZyBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHByb2dyYW0gdmVyYmF0aW0uCisuU0ggIlNFRSBBTFNPIgorLlJCICJgXHwiIGdkYiAiXHwnIgorZW50cnkgaW4KKy5CIGluZm9cYworXCY7CisuSSAKK1VzaW5nIEdEQjogQSBHdWlkZSB0byB0aGUgR05VIFNvdXJjZS1MZXZlbCBEZWJ1Z2dlclxjCissIFJpY2hhcmQgTS4gU3RhbGxtYW4gYW5kIFJvbGFuZCBILiBQZXNjaCwgSnVseSAxOTkxLgorLlNIIENPUFlJTkcKK0NvcHlyaWdodCAoYykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy5QUAorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCit0aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQorYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorLlBQCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCitlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQorcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgorLlBQCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcworbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCit2ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KK3RyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KK3RoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvZ2RiL2dkYnNlcnZlci9sb3ctaHBwYWJzZC5jIGIvZ2RiL2dkYnNlcnZlci9sb3ctaHBwYWJzZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ODRkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZ2Ric2VydmVyL2xvdy1ocHBhYnNkLmMKQEAgLTAsMCArMSwzNzkgQEAKKy8qIExvdyBsZXZlbCBpbnRlcmZhY2UgdG8gcHRyYWNlLCBmb3IgdGhlIHJlbW90ZSBzZXJ2ZXIgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSA8c3lzL3VzZXIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzZ3R0eS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKy8qKioqKioqKioqKioqKipCZWdpbiBNWSBkZWZzKioqKioqKioqKioqKioqKioqKioqLworaW50IHF1aXRfZmxhZyA9IDA7CitjaGFyIHJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFU107CisKKy8qIEluZGV4IHdpdGhpbiBgcmVnaXN0ZXJzJyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3BhY2UgZm9yCisgICByZWdpc3RlciBOLiAgKi8KKworCitjaGFyIGJ1ZjJbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKy8qKioqKioqKioqKioqKipFbmQgTVkgZGVmcyoqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgorCitleHRlcm4gY2hhciAqKmVudmlyb247CitleHRlcm4gaW50IGVycm5vOworZXh0ZXJuIGludCBpbmZlcmlvcl9waWQ7Cit2b2lkIHF1aXQgKCksIHBlcnJvcl93aXRoX25hbWUgKCk7CitpbnQgcXVlcnkgKCk7CisKKy8qIFN0YXJ0IGFuIGluZmVyaW9yIHByb2Nlc3MgYW5kIHJldHVybnMgaXRzIHBpZC4KKyAgIEFMTEFSR1MgaXMgYSB2ZWN0b3Igb2YgcHJvZ3JhbS1uYW1lIGFuZCBhcmdzLgorICAgRU5WIGlzIHRoZSBlbnZpcm9ubWVudCB2ZWN0b3IgdG8gcGFzcy4gICovCisKK2ludAorY3JlYXRlX2luZmVyaW9yIChwcm9ncmFtLCBhbGxhcmdzKQorICAgICBjaGFyICpwcm9ncmFtOworICAgICBjaGFyICoqYWxsYXJnczsKK3sKKyAgaW50IHBpZDsKKworICBwaWQgPSBmb3JrICgpOworICBpZiAocGlkIDwgMCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgiZm9yayIpOworCisgIGlmIChwaWQgPT0gMCkKKyAgICB7CisgICAgICBwdHJhY2UgKFBUX1RSQUNFX01FLCAwLCAwLCAwLCAwKTsKKworICAgICAgZXhlY3YgKHByb2dyYW0sIGFsbGFyZ3MpOworCisgICAgICBmcHJpbnRmIChzdGRlcnIsICJDYW5ub3QgZXhlYyAlczogJXMuXG4iLCBwcm9ncmFtLAorCSAgICAgICBlcnJubyA8IHN5c19uZXJyID8gc3lzX2Vycmxpc3RbZXJybm9dIDogInVua25vd24gZXJyb3IiKTsKKyAgICAgIGZmbHVzaCAoc3RkZXJyKTsKKyAgICAgIF9leGl0ICgwMTc3KTsKKyAgICB9CisKKyAgcmV0dXJuIHBpZDsKK30KKworLyogS2lsbCB0aGUgaW5mZXJpb3IgcHJvY2Vzcy4gIE1ha2UgdXMgaGF2ZSBubyBpbmZlcmlvci4gICovCisKK3ZvaWQKK2tpbGxfaW5mZXJpb3IgKCkKK3sKKyAgaWYgKGluZmVyaW9yX3BpZCA9PSAwKQorICAgIHJldHVybjsKKyAgcHRyYWNlICg4LCBpbmZlcmlvcl9waWQsIDAsIDAsIDApOworICB3YWl0ICgwKTsKKyAgLyoqKioqKioqKioqKippbmZlcmlvcl9kaWVkICgpOyoqKipWSyoqKioqKioqKioqKioqLworfQorCisvKiBSZXR1cm4gbm9uemVybyBpZiB0aGUgZ2l2ZW4gdGhyZWFkIGlzIHN0aWxsIGFsaXZlLiAgKi8KK2ludAorbXl0aHJlYWRfYWxpdmUgKHBpZCkKKyAgICAgaW50IHBpZDsKK3sKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFdhaXQgZm9yIHByb2Nlc3MsIHJldHVybnMgc3RhdHVzICovCisKK3Vuc2lnbmVkIGNoYXIKK215d2FpdCAoc3RhdHVzKQorICAgICBjaGFyICpzdGF0dXM7Cit7CisgIGludCBwaWQ7CisgIHVuaW9uIHdhaXQgdzsKKworICBwaWQgPSB3YWl0ICgmdyk7CisgIGlmIChwaWQgIT0gaW5mZXJpb3JfcGlkKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJ3YWl0Iik7CisKKyAgaWYgKFdJRkVYSVRFRCAodykpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG5DaGlsZCBleGl0ZWQgd2l0aCByZXRjb2RlID0gJXggXG4iLCBXRVhJVFNUQVRVUyAodykpOworICAgICAgKnN0YXR1cyA9ICdXJzsKKyAgICAgIHJldHVybiAoKHVuc2lnbmVkIGNoYXIpIFdFWElUU1RBVFVTICh3KSk7CisgICAgfQorICBlbHNlIGlmICghV0lGU1RPUFBFRCAodykpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG5DaGlsZCB0ZXJtaW5hdGVkIHdpdGggc2lnbmFsID0gJXggXG4iLCBXVEVSTVNJRyAodykpOworICAgICAgKnN0YXR1cyA9ICdYJzsKKyAgICAgIHJldHVybiAoKHVuc2lnbmVkIGNoYXIpIFdURVJNU0lHICh3KSk7CisgICAgfQorCisgIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoMCk7CisKKyAgKnN0YXR1cyA9ICdUJzsKKyAgcmV0dXJuICgodW5zaWduZWQgY2hhcikgV1NUT1BTSUcgKHcpKTsKK30KKworLyogUmVzdW1lIGV4ZWN1dGlvbiBvZiB0aGUgaW5mZXJpb3IgcHJvY2Vzcy4KKyAgIElmIFNURVAgaXMgbm9uemVybywgc2luZ2xlLXN0ZXAgaXQuCisgICBJZiBTSUdOQUwgaXMgbm9uemVybywgZ2l2ZSBpdCB0aGF0IHNpZ25hbC4gICovCisKK3ZvaWQKK215cmVzdW1lIChzdGVwLCBzaWduYWwpCisgICAgIGludCBzdGVwOworICAgICBpbnQgc2lnbmFsOworeworICBlcnJubyA9IDA7CisgIHB0cmFjZSAoc3RlcCA/IFBUX1NURVAgOiBQVF9DT05USU5VRSwgaW5mZXJpb3JfcGlkLCAxLCBzaWduYWwsIDApOworICBpZiAoZXJybm8pCisgICAgcGVycm9yX3dpdGhfbmFtZSAoInB0cmFjZSIpOworfQorCisKKyNpZiAhZGVmaW5lZCAob2Zmc2V0b2YpCisjZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgKCh1bnNpZ25lZCBsb25nKSAmKChUWVBFICopMCktPk1FTUJFUikKKyNlbmRpZgorCisvKiBVX1JFR1NfT0ZGU0VUIGlzIHRoZSBvZmZzZXQgb2YgdGhlIHJlZ2lzdGVycyB3aXRoaW4gdGhlIHUgYXJlYS4gICovCisjaWYgIWRlZmluZWQgKFVfUkVHU19PRkZTRVQpCisjZGVmaW5lIFVfUkVHU19PRkZTRVQgXAorICBwdHJhY2UgKFBUX1JFQURfVSwgaW5mZXJpb3JfcGlkLCBcCisgICAgICAgICAgKFBUUkFDRV9BUkczX1RZUEUpIChvZmZzZXRvZiAoc3RydWN0IHVzZXIsIHVfYXIwKSksIDApIFwKKyAgICAtIEtFUk5FTF9VX0FERFIKKyNlbmRpZgorCitDT1JFX0FERFIKK3JlZ2lzdGVyX2FkZHIgKHJlZ25vLCBibG9ja2VuZCkKKyAgICAgaW50IHJlZ25vOworICAgICBDT1JFX0FERFIgYmxvY2tlbmQ7Cit7CisgIENPUkVfQUREUiBhZGRyOworCisgIGlmIChyZWdubyA8IDAgfHwgcmVnbm8gPj0gQVJDSF9OVU1fUkVHUykKKyAgICBlcnJvciAoIkludmFsaWQgcmVnaXN0ZXIgbnVtYmVyICVkLiIsIHJlZ25vKTsKKworICBSRUdJU1RFUl9VX0FERFIgKGFkZHIsIGJsb2NrZW5kLCByZWdubyk7CisKKyAgcmV0dXJuIGFkZHI7Cit9CisKKy8qIEZldGNoIG9uZSByZWdpc3Rlci4gICovCisKK3N0YXRpYyB2b2lkCitmZXRjaF9yZWdpc3RlciAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHJlZ2FkZHI7CisgIGNoYXIgYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisgIHJlZ2lzdGVyIGludCBpOworCisgIC8qIE9mZnNldCBvZiByZWdpc3RlcnMgd2l0aGluIHRoZSB1IGFyZWEuICAqLworICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworCisgIG9mZnNldCA9IFVfUkVHU19PRkZTRVQ7CisKKyAgcmVnYWRkciA9IHJlZ2lzdGVyX2FkZHIgKHJlZ25vLCBvZmZzZXQpOworICBmb3IgKGkgPSAwOyBpIDwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ25vKTsgaSArPSBzaXplb2YgKGludCkpCisgICAgeworICAgICAgZXJybm8gPSAwOworICAgICAgKihpbnQgKikgJnJlZ2lzdGVyc1sgcmVnbm8gKiA0ICsgaV0gPSBwdHJhY2UgKFBUX1JVUkVHUywgaW5mZXJpb3JfcGlkLAorCQkJCSAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnYWRkciwgMCwgMCk7CisgICAgICByZWdhZGRyICs9IHNpemVvZiAoaW50KTsKKyAgICAgIGlmIChlcnJubyAhPSAwKQorCXsKKwkgIC8qIFdhcm5pbmcsIG5vdCBlcnJvciwgaW4gY2FzZSB3ZSBhcmUgYXR0YWNoZWQ7IHNvbWV0aW1lcyB0aGUKKwkgICAgIGtlcm5lbCBkb2Vzbid0IGxldCB1cyBhdCB0aGUgcmVnaXN0ZXJzLiAgKi8KKwkgIGNoYXIgKmVyciA9IHN0cmVycm9yIChlcnJubyk7CisJICBjaGFyICptc2cgPSBhbGxvY2EgKHN0cmxlbiAoZXJyKSArIDEyOCk7CisJICBzcHJpbnRmIChtc2csICJyZWFkaW5nIHJlZ2lzdGVyICVkOiAlcyIsIHJlZ25vLCBlcnIpOworCSAgZXJyb3IgKG1zZyk7CisJICBnb3RvIGVycm9yX2V4aXQ7CisJfQorICAgIH0KKyBlcnJvcl9leGl0OjsKK30KKworLyogRmV0Y2ggYWxsIHJlZ2lzdGVycywgb3IganVzdCBvbmUsIGZyb20gdGhlIGNoaWxkIHByb2Nlc3MuICAqLworCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGlmIChyZWdubyA9PSAtMSB8fCByZWdubyA9PSAwKQorICAgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IE5VTV9SRUdTOyByZWdubysrKQorICAgICAgZmV0Y2hfcmVnaXN0ZXIgKHJlZ25vKTsKKyAgZWxzZQorICAgIGZldGNoX3JlZ2lzdGVyIChyZWdubyk7Cit9CisKKy8qIFN0b3JlIG91ciByZWdpc3RlciB2YWx1ZXMgYmFjayBpbnRvIHRoZSBpbmZlcmlvci4KKyAgIElmIFJFR05PIGlzIC0xLCBkbyB0aGlzIGZvciBhbGwgcmVnaXN0ZXJzLgorICAgT3RoZXJ3aXNlLCBSRUdOTyBzcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXIgKHNvIHdlIGNhbiBzYXZlIHRpbWUpLiAgKi8KKwordm9pZAorc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgcmVnYWRkcjsKKyAgY2hhciBidWZbODBdOworICBleHRlcm4gY2hhciByZWdpc3RlcnNbXTsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHVuc2lnbmVkIGludCBvZmZzZXQgPSBVX1JFR1NfT0ZGU0VUOworICBpbnQgc2NyYXRjaDsKKworICBpZiAocmVnbm8gPj0gMCkKKyAgICB7CisgICAgICBpZiAoQ0FOTk9UX1NUT1JFX1JFR0lTVEVSIChyZWdubykpCisJcmV0dXJuOworICAgICAgcmVnYWRkciA9IHJlZ2lzdGVyX2FkZHIgKHJlZ25vLCBvZmZzZXQpOworICAgICAgZXJybm8gPSAwOworICAgICAgaWYgKHJlZ25vID09IFBDT1FfSEVBRF9SRUdOVU0gfHwgcmVnbm8gPT0gUENPUV9UQUlMX1JFR05VTSkKKyAgICAgICAgeworICAgICAgICAgIHNjcmF0Y2ggPSAqKGludCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ25vKV0gfCAweDM7CisgICAgICAgICAgcHRyYWNlIChQVF9XVVJFR1MsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIHJlZ2FkZHIsCisgICAgICAgICAgICAgICAgICBzY3JhdGNoLCAwKTsKKyAgICAgICAgICBpZiAoZXJybm8gIT0gMCkKKyAgICAgICAgICAgIHsKKwkgICAgICAvKiBFcnJvciwgZXZlbiBpZiBhdHRhY2hlZC4gIEZhaWxpbmcgdG8gd3JpdGUgdGhlc2UgdHdvCisJCSByZWdpc3RlcnMgaXMgcHJldHR5IHNlcmlvdXMuICAqLworICAgICAgICAgICAgICBzcHJpbnRmIChidWYsICJ3cml0aW5nIHJlZ2lzdGVyIG51bWJlciAlZCIsIHJlZ25vKTsKKyAgICAgICAgICAgICAgcGVycm9yX3dpdGhfbmFtZSAoYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorCWZvciAoaSA9IDA7IGkgPCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pOyBpICs9IHNpemVvZihpbnQpKQorCSAgeworCSAgICBlcnJubyA9IDA7CisJICAgIHB0cmFjZSAoUFRfV1VSRUdTLCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSByZWdhZGRyLAorCQkgICAgKihpbnQgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdubykgKyBpXSwgMCk7CisJICAgIGlmIChlcnJubyAhPSAwKQorCSAgICAgIHsKKwkJLyogV2FybmluZywgbm90IGVycm9yLCBpbiBjYXNlIHdlIGFyZSBhdHRhY2hlZDsgc29tZXRpbWVzIHRoZQorCQkgICBrZXJuZWwgZG9lc24ndCBsZXQgdXMgYXQgdGhlIHJlZ2lzdGVycy4gICovCisJCWNoYXIgKmVyciA9IHN0cmVycm9yIChlcnJubyk7CisJCWNoYXIgKm1zZyA9IGFsbG9jYSAoc3RybGVuIChlcnIpICsgMTI4KTsKKwkJc3ByaW50ZiAobXNnLCAid3JpdGluZyByZWdpc3RlciAlZDogJXMiLAorCQkJIHJlZ25vLCBlcnIpOworCQllcnJvciAobXNnKTsKKwkJcmV0dXJuOworCSAgICAgIH0KKwkgICAgcmVnYWRkciArPSBzaXplb2YoaW50KTsKKwkgIH0KKyAgICB9CisgIGVsc2UKKyAgICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCBOVU1fUkVHUzsgcmVnbm8rKykKKyAgICAgIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pOworfQorCisvKiBOT1RFISBJIHRyaWVkIHVzaW5nIFBUUkFDRV9SRUFEREFUQSwgZXRjLiwgdG8gcmVhZCBhbmQgd3JpdGUgbWVtb3J5CisgICBpbiB0aGUgTkVXX1NVTl9QVFJBQ0UgY2FzZS4KKyAgIEl0IG91Z2h0IHRvIGJlIHN0cmFpZ2h0Zm9yd2FyZC4gIEJ1dCBpdCBhcHBlYXJzIHRoYXQgd3JpdGluZyBkaWQKKyAgIG5vdCB3cml0ZSB0aGUgZGF0YSB0aGF0IEkgc3BlY2lmaWVkLiAgSSBjYW5ub3QgdW5kZXJzdGFuZCB3aGVyZQorICAgaXQgZ290IHRoZSBkYXRhIHRoYXQgaXQgYWN0dWFsbHkgZGlkIHdyaXRlLiAgKi8KKworLyogQ29weSBMRU4gYnl0ZXMgZnJvbSBpbmZlcmlvcidzIG1lbW9yeSBzdGFydGluZyBhdCBNRU1BRERSCisgICB0byBkZWJ1Z2dlciBtZW1vcnkgc3RhcnRpbmcgYXQgTVlBRERSLiAgKi8KKworcmVhZF9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICByZWdpc3RlciBpbnQgaTsKKyAgLyogUm91bmQgc3RhcnRpbmcgYWRkcmVzcyBkb3duIHRvIGxvbmd3b3JkIGJvdW5kYXJ5LiAgKi8KKyAgcmVnaXN0ZXIgQ09SRV9BRERSIGFkZHIgPSBtZW1hZGRyICYgLXNpemVvZiAoaW50KTsKKyAgLyogUm91bmQgZW5kaW5nIGFkZHJlc3MgdXA7IGdldCBudW1iZXIgb2YgbG9uZ3dvcmRzIHRoYXQgbWFrZXMuICAqLworICByZWdpc3RlciBpbnQgY291bnQKKyAgPSAoKChtZW1hZGRyICsgbGVuKSAtIGFkZHIpICsgc2l6ZW9mIChpbnQpIC0gMSkgLyBzaXplb2YgKGludCk7CisgIC8qIEFsbG9jYXRlIGJ1ZmZlciBvZiB0aGF0IG1hbnkgbG9uZ3dvcmRzLiAgKi8KKyAgcmVnaXN0ZXIgaW50ICpidWZmZXIgPSAoaW50ICopIGFsbG9jYSAoY291bnQgKiBzaXplb2YgKGludCkpOworCisgIC8qIFJlYWQgYWxsIHRoZSBsb25nd29yZHMgKi8KKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIGFkZHIgKz0gc2l6ZW9mIChpbnQpKQorICAgIHsKKyAgICAgIGJ1ZmZlcltpXSA9IHB0cmFjZSAoMSwgaW5mZXJpb3JfcGlkLCBhZGRyLCAwLCAwKTsKKyAgICB9CisKKyAgLyogQ29weSBhcHByb3ByaWF0ZSBieXRlcyBvdXQgb2YgdGhlIGJ1ZmZlci4gICovCisgIG1lbWNweSAobXlhZGRyLCAoY2hhciAqKSBidWZmZXIgKyAobWVtYWRkciAmIChzaXplb2YgKGludCkgLSAxKSksIGxlbik7Cit9CisKKy8qIENvcHkgTEVOIGJ5dGVzIG9mIGRhdGEgZnJvbSBkZWJ1Z2dlciBtZW1vcnkgYXQgTVlBRERSCisgICB0byBpbmZlcmlvcidzIG1lbW9yeSBhdCBNRU1BRERSLgorICAgT24gZmFpbHVyZSAoY2Fubm90IHdyaXRlIHRoZSBpbmZlcmlvcikKKyAgIHJldHVybnMgdGhlIHZhbHVlIG9mIGVycm5vLiAgKi8KKworaW50Cit3cml0ZV9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICByZWdpc3RlciBpbnQgaTsKKyAgLyogUm91bmQgc3RhcnRpbmcgYWRkcmVzcyBkb3duIHRvIGxvbmd3b3JkIGJvdW5kYXJ5LiAgKi8KKyAgcmVnaXN0ZXIgQ09SRV9BRERSIGFkZHIgPSBtZW1hZGRyICYgLXNpemVvZiAoaW50KTsKKyAgLyogUm91bmQgZW5kaW5nIGFkZHJlc3MgdXA7IGdldCBudW1iZXIgb2YgbG9uZ3dvcmRzIHRoYXQgbWFrZXMuICAqLworICByZWdpc3RlciBpbnQgY291bnQKKyAgPSAoKChtZW1hZGRyICsgbGVuKSAtIGFkZHIpICsgc2l6ZW9mIChpbnQpIC0gMSkgLyBzaXplb2YgKGludCk7CisgIC8qIEFsbG9jYXRlIGJ1ZmZlciBvZiB0aGF0IG1hbnkgbG9uZ3dvcmRzLiAgKi8KKyAgcmVnaXN0ZXIgaW50ICpidWZmZXIgPSAoaW50ICopIGFsbG9jYSAoY291bnQgKiBzaXplb2YgKGludCkpOworICBleHRlcm4gaW50IGVycm5vOworCisgIC8qIEZpbGwgc3RhcnQgYW5kIGVuZCBleHRyYSBieXRlcyBvZiBidWZmZXIgd2l0aCBleGlzdGluZyBtZW1vcnkgZGF0YS4gICovCisKKyAgYnVmZmVyWzBdID0gcHRyYWNlICgxLCBpbmZlcmlvcl9waWQsIGFkZHIsIDAsIDApOworCisgIGlmIChjb3VudCA+IDEpCisgICAgeworICAgICAgYnVmZmVyW2NvdW50IC0gMV0KKwk9IHB0cmFjZSAoMSwgaW5mZXJpb3JfcGlkLAorCQkgIGFkZHIgKyAoY291bnQgLSAxKSAqIHNpemVvZiAoaW50KSwgMCwgMCk7CisgICAgfQorCisgIC8qIENvcHkgZGF0YSB0byBiZSB3cml0dGVuIG92ZXIgY29ycmVzcG9uZGluZyBwYXJ0IG9mIGJ1ZmZlciAqLworCisgIG1lbWNweSAoKGNoYXIgKikgYnVmZmVyICsgKG1lbWFkZHIgJiAoc2l6ZW9mIChpbnQpIC0gMSkpLCBteWFkZHIsIGxlbik7CisKKyAgLyogV3JpdGUgdGhlIGVudGlyZSBidWZmZXIuICAqLworCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBhZGRyICs9IHNpemVvZiAoaW50KSkKKyAgICB7CisgICAgICBlcnJubyA9IDA7CisgICAgICBwdHJhY2UgKDQsIGluZmVyaW9yX3BpZCwgYWRkciwgYnVmZmVyW2ldLCAwKTsKKyAgICAgIGlmIChlcnJubykKKwlyZXR1cm4gZXJybm87CisgICAgfQorCisgIHJldHVybiAwOworfQorDAordm9pZAoraW5pdGlhbGl6ZSAoKQoreworICBpbmZlcmlvcl9waWQgPSAwOworfQorCitpbnQKK2hhdmVfaW5mZXJpb3JfcCAoKQoreworICByZXR1cm4gaW5mZXJpb3JfcGlkICE9IDA7Cit9CmRpZmYgLS1naXQgYS9nZGIvZ2Ric2VydmVyL2xvdy1saW51eC5jIGIvZ2RiL2dkYnNlcnZlci9sb3ctbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDYwMjEwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2dkYnNlcnZlci9sb3ctbGludXguYwpAQCAtMCwwICsxLDQ1MSBAQAorLyogTG93IGxldmVsIGludGVyZmFjZSB0byBwdHJhY2UsIGZvciB0aGUgcmVtb3RlIHNlcnZlciBmb3IgR0RCLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9kaXIuaD4KKyNpbmNsdWRlIDxzeXMvdXNlci5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2lmIDAKKyNpbmNsdWRlIDxzZ3R0eS5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKworLyoqKioqKioqKioqKioqKkJlZ2luIE1ZIGRlZnMqKioqKioqKioqKioqKioqKioqKiovCitpbnQgcXVpdF9mbGFnID0gMDsKK2NoYXIgcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEVTXTsKKworLyogSW5kZXggd2l0aGluIGByZWdpc3RlcnMnIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzcGFjZSBmb3IKKyAgIHJlZ2lzdGVyIE4uICAqLworCisKK2NoYXIgYnVmMltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworLyoqKioqKioqKioqKioqKkVuZCBNWSBkZWZzKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorCisjaWYgX19HTElCQ19fID4gMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDEpCisjaW5jbHVkZSA8c3lzL3JlZy5oPgorI2VuZGlmCisKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKK2V4dGVybiBpbnQgZXJybm87CitleHRlcm4gaW50IGluZmVyaW9yX3BpZDsKK3ZvaWQgcXVpdCAoKSwgcGVycm9yX3dpdGhfbmFtZSAoKTsKK2ludCBxdWVyeSAoKTsKKworLyogU3RhcnQgYW4gaW5mZXJpb3IgcHJvY2VzcyBhbmQgcmV0dXJucyBpdHMgcGlkLgorICAgQUxMQVJHUyBpcyBhIHZlY3RvciBvZiBwcm9ncmFtLW5hbWUgYW5kIGFyZ3MuCisgICBFTlYgaXMgdGhlIGVudmlyb25tZW50IHZlY3RvciB0byBwYXNzLiAgKi8KKworaW50CitjcmVhdGVfaW5mZXJpb3IgKHByb2dyYW0sIGFsbGFyZ3MpCisgICAgIGNoYXIgKnByb2dyYW07CisgICAgIGNoYXIgKiphbGxhcmdzOworeworICBpbnQgcGlkOworCisgIHBpZCA9IGZvcmsgKCk7CisgIGlmIChwaWQgPCAwKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJmb3JrIik7CisKKyAgaWYgKHBpZCA9PSAwKQorICAgIHsKKyAgICAgIHB0cmFjZSAoUFRSQUNFX1RSQUNFTUUsIDAsIDAsIDApOworCisgICAgICBleGVjdiAocHJvZ3JhbSwgYWxsYXJncyk7CisKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNhbm5vdCBleGVjICVzOiAlcy5cbiIsIHByb2dyYW0sCisJICAgICAgIGVycm5vIDwgc3lzX25lcnIgPyBzeXNfZXJybGlzdFtlcnJub10gOiAidW5rbm93biBlcnJvciIpOworICAgICAgZmZsdXNoIChzdGRlcnIpOworICAgICAgX2V4aXQgKDAxNzcpOworICAgIH0KKworICByZXR1cm4gcGlkOworfQorCisvKiBLaWxsIHRoZSBpbmZlcmlvciBwcm9jZXNzLiAgTWFrZSB1cyBoYXZlIG5vIGluZmVyaW9yLiAgKi8KKwordm9pZAora2lsbF9pbmZlcmlvciAoKQoreworICBpZiAoaW5mZXJpb3JfcGlkID09IDApCisgICAgcmV0dXJuOworICBwdHJhY2UgKFBUUkFDRV9LSUxMLCBpbmZlcmlvcl9waWQsIDAsIDApOworICB3YWl0ICgwKTsKKyAgLyoqKioqKioqKioqKippbmZlcmlvcl9kaWVkICgpOyoqKipWSyoqKioqKioqKioqKioqLworfQorCisvKiBSZXR1cm4gbm9uemVybyBpZiB0aGUgZ2l2ZW4gdGhyZWFkIGlzIHN0aWxsIGFsaXZlLiAgKi8KK2ludAorbXl0aHJlYWRfYWxpdmUgKHBpZCkKKyAgICAgaW50IHBpZDsKK3sKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFdhaXQgZm9yIHByb2Nlc3MsIHJldHVybnMgc3RhdHVzICovCisKK3Vuc2lnbmVkIGNoYXIKK215d2FpdCAoc3RhdHVzKQorICAgICBjaGFyICpzdGF0dXM7Cit7CisgIGludCBwaWQ7CisgIHVuaW9uIHdhaXQgdzsKKworICBwaWQgPSB3YWl0ICgmdyk7CisgIGlmIChwaWQgIT0gaW5mZXJpb3JfcGlkKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJ3YWl0Iik7CisKKyAgaWYgKFdJRkVYSVRFRCAodykpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG5DaGlsZCBleGl0ZWQgd2l0aCByZXRjb2RlID0gJXggXG4iLCBXRVhJVFNUQVRVUyAodykpOworICAgICAgKnN0YXR1cyA9ICdXJzsKKyAgICAgIHJldHVybiAoKHVuc2lnbmVkIGNoYXIpIFdFWElUU1RBVFVTICh3KSk7CisgICAgfQorICBlbHNlIGlmICghV0lGU1RPUFBFRCAodykpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG5DaGlsZCB0ZXJtaW5hdGVkIHdpdGggc2lnbmFsID0gJXggXG4iLCBXVEVSTVNJRyAodykpOworICAgICAgKnN0YXR1cyA9ICdYJzsKKyAgICAgIHJldHVybiAoKHVuc2lnbmVkIGNoYXIpIFdURVJNU0lHICh3KSk7CisgICAgfQorCisgIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoMCk7CisKKyAgKnN0YXR1cyA9ICdUJzsKKyAgcmV0dXJuICgodW5zaWduZWQgY2hhcikgV1NUT1BTSUcgKHcpKTsKK30KKworLyogUmVzdW1lIGV4ZWN1dGlvbiBvZiB0aGUgaW5mZXJpb3IgcHJvY2Vzcy4KKyAgIElmIFNURVAgaXMgbm9uemVybywgc2luZ2xlLXN0ZXAgaXQuCisgICBJZiBTSUdOQUwgaXMgbm9uemVybywgZ2l2ZSBpdCB0aGF0IHNpZ25hbC4gICovCisKK3ZvaWQKK215cmVzdW1lIChzdGVwLCBzaWduYWwpCisgICAgIGludCBzdGVwOworICAgICBpbnQgc2lnbmFsOworeworICBlcnJubyA9IDA7CisgIHB0cmFjZSAoc3RlcCA/IFBUUkFDRV9TSU5HTEVTVEVQIDogUFRSQUNFX0NPTlQsIGluZmVyaW9yX3BpZCwgMSwgc2lnbmFsKTsKKyAgaWYgKGVycm5vKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJwdHJhY2UiKTsKK30KKworCisjaWYgIWRlZmluZWQgKG9mZnNldG9mKQorI2RlZmluZSBvZmZzZXRvZihUWVBFLCBNRU1CRVIpICgodW5zaWduZWQgbG9uZykgJigoVFlQRSAqKTApLT5NRU1CRVIpCisjZW5kaWYKKworLyogVV9SRUdTX09GRlNFVCBpcyB0aGUgb2Zmc2V0IG9mIHRoZSByZWdpc3RlcnMgd2l0aGluIHRoZSB1IGFyZWEuICAqLworI2lmICFkZWZpbmVkIChVX1JFR1NfT0ZGU0VUKQorI2RlZmluZSBVX1JFR1NfT0ZGU0VUIFwKKyAgcHRyYWNlIChQVF9SRUFEX1UsIGluZmVyaW9yX3BpZCwgXAorICAgICAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSAob2Zmc2V0b2YgKHN0cnVjdCB1c2VyLCB1X2FyMCkpLCAwKSBcCisgICAgLSBLRVJORUxfVV9BRERSCisjZW5kaWYKKworI2lmbmRlZiBUQVJHRVRfTTY4SworLyogdGhpcyB0YWJsZSBtdXN0IGxpbmUgdXAgd2l0aCBSRUdJU1RFUl9OQU1FUyBpbiB0bS1pMzg2di5oICovCisvKiBzeW1ib2xzIGxpa2UgJ0VBWCcgY29tZSBmcm9tIDxzeXMvcmVnLmg+ICovCitzdGF0aWMgaW50IHJlZ21hcFtdID0gCit7CisgIEVBWCwgRUNYLCBFRFgsIEVCWCwKKyAgVUVTUCwgRUJQLCBFU0ksIEVESSwKKyAgRUlQLCBFRkwsIENTLCBTUywKKyAgRFMsIEVTLCBGUywgR1MsCit9OworCitpbnQKK2kzODZfcmVnaXN0ZXJfdV9hZGRyIChibG9ja2VuZCwgcmVnbnVtKQorICAgICBpbnQgYmxvY2tlbmQ7CisgICAgIGludCByZWdudW07Cit7CisjaWYgMAorICAvKiB0aGlzIHdpbGwgYmUgbmVlZGVkIGlmIGZwIHJlZ2lzdGVycyBhcmUgcmVpbnN0YXRlZCAqLworICAvKiBmb3Igbm93LCB5b3UgY2FuIGxvb2sgYXQgdGhlbSB3aXRoICdpbmZvIGZsb2F0JworICAgKiBzeXM1IHdvbnQgbGV0IHlvdSBjaGFuZ2UgdGhlbSB3aXRoIHB0cmFjZSBhbnl3YXkKKyAgICovCisgIGlmIChyZWdudW0gPj0gRlAwX1JFR05VTSAmJiByZWdudW0gPD0gRlA3X1JFR05VTSkgCisgICAgeworICAgICAgaW50IHViYXNlLCBmcHN0YXRlOworICAgICAgc3RydWN0IHVzZXIgdTsKKyAgICAgIHViYXNlID0gYmxvY2tlbmQgKyA0ICogKFNTICsgMSkgLSBLU1RLU1o7CisgICAgICBmcHN0YXRlID0gdWJhc2UgKyAoKGNoYXIgKikmdS51X2Zwc3RhdGUgLSAoY2hhciAqKSZ1KTsKKyAgICAgIHJldHVybiAoZnBzdGF0ZSArIDB4MWMgKyAxMCAqIChyZWdudW0gLSBGUDBfUkVHTlVNKSk7CisgICAgfSAKKyAgZWxzZQorI2VuZGlmCisgICAgcmV0dXJuIChibG9ja2VuZCArIDQgKiByZWdtYXBbcmVnbnVtXSk7CisgIAorfQorI2Vsc2UgLyogVEFSR0VUX002OEsgKi8KKy8qIFRoaXMgdGFibGUgbXVzdCBsaW5lIHVwIHdpdGggUkVHSVNURVJfTkFNRVMgaW4gdG0tbTY4ay5oICovCitzdGF0aWMgaW50IHJlZ21hcFtdID0gCit7CisjaWZkZWYgUFRfRDAKKyAgUFRfRDAsIFBUX0QxLCBQVF9EMiwgUFRfRDMsIFBUX0Q0LCBQVF9ENSwgUFRfRDYsIFBUX0Q3LAorICBQVF9BMCwgUFRfQTEsIFBUX0EyLCBQVF9BMywgUFRfQTQsIFBUX0E1LCBQVF9BNiwgUFRfVVNQLAorICBQVF9TUiwgUFRfUEMsCisjZWxzZQorICAxNCwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE1LAorICAxNywgMTgsCisjZW5kaWYKKyNpZmRlZiBQVF9GUDAKKyAgUFRfRlAwLCBQVF9GUDEsIFBUX0ZQMiwgUFRfRlAzLCBQVF9GUDQsIFBUX0ZQNSwgUFRfRlA2LCBQVF9GUDcsCisgIFBUX0ZQQ1IsIFBUX0ZQU1IsIFBUX0ZQSUFSCisjZWxzZQorICAyMSwgMjQsIDI3LCAzMCwgMzMsIDM2LCAzOSwgNDIsIDQ1LCA0NiwgNDcKKyNlbmRpZgorfTsKKworLyogQkxPQ0tFTkQgaXMgdGhlIHZhbHVlIG9mIHUudV9hcjAsIGFuZCBwb2ludHMgdG8gdGhlIHBsYWNlIHdoZXJlIEdTCisgICBpcyBzdG9yZWQuICAqLworCitpbnQKK202OGtfbGludXhfcmVnaXN0ZXJfdV9hZGRyIChibG9ja2VuZCwgcmVnbnVtKQorICAgICBpbnQgYmxvY2tlbmQ7CisgICAgIGludCByZWdudW07Cit7CisgICAgcmV0dXJuIChibG9ja2VuZCArIDQgKiByZWdtYXBbcmVnbnVtXSk7Cit9CisjZW5kaWYKKworQ09SRV9BRERSCityZWdpc3Rlcl9hZGRyIChyZWdubywgYmxvY2tlbmQpCisgICAgIGludCByZWdubzsKKyAgICAgQ09SRV9BRERSIGJsb2NrZW5kOworeworICBDT1JFX0FERFIgYWRkcjsKKworICBpZiAocmVnbm8gPCAwIHx8IHJlZ25vID49IEFSQ0hfTlVNX1JFR1MpCisgICAgZXJyb3IgKCJJbnZhbGlkIHJlZ2lzdGVyIG51bWJlciAlZC4iLCByZWdubyk7CisKKyAgUkVHSVNURVJfVV9BRERSIChhZGRyLCBibG9ja2VuZCwgcmVnbm8pOworCisgIHJldHVybiBhZGRyOworfQorCisvKiBGZXRjaCBvbmUgcmVnaXN0ZXIuICAqLworCitzdGF0aWMgdm9pZAorZmV0Y2hfcmVnaXN0ZXIgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZWdhZGRyOworICByZWdpc3RlciBpbnQgaTsKKworICAvKiBPZmZzZXQgb2YgcmVnaXN0ZXJzIHdpdGhpbiB0aGUgdSBhcmVhLiAgKi8KKyAgdW5zaWduZWQgaW50IG9mZnNldDsKKworICBvZmZzZXQgPSBVX1JFR1NfT0ZGU0VUOworCisgIHJlZ2FkZHIgPSByZWdpc3Rlcl9hZGRyIChyZWdubywgb2Zmc2V0KTsKKyAgZm9yIChpID0gMDsgaSA8IFJFR0lTVEVSX1JBV19TSVpFIChyZWdubyk7IGkgKz0gc2l6ZW9mIChpbnQpKQorICAgIHsKKyAgICAgIGVycm5vID0gMDsKKyAgICAgICooaW50ICopICZyZWdpc3RlcnNbIHJlZ25vICogNCArIGldID0gcHRyYWNlIChQVFJBQ0VfUEVFS1VTUiwgaW5mZXJpb3JfcGlkLAorCQkJCSAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnYWRkciwgMCk7CisgICAgICByZWdhZGRyICs9IHNpemVvZiAoaW50KTsKKyAgICAgIGlmIChlcnJubyAhPSAwKQorCXsKKwkgIC8qIFdhcm5pbmcsIG5vdCBlcnJvciwgaW4gY2FzZSB3ZSBhcmUgYXR0YWNoZWQ7IHNvbWV0aW1lcyB0aGUKKwkgICAgIGtlcm5lbCBkb2Vzbid0IGxldCB1cyBhdCB0aGUgcmVnaXN0ZXJzLiAgKi8KKwkgIGNoYXIgKmVyciA9IHN0cmVycm9yIChlcnJubyk7CisJICBjaGFyICptc2cgPSBhbGxvY2EgKHN0cmxlbiAoZXJyKSArIDEyOCk7CisJICBzcHJpbnRmIChtc2csICJyZWFkaW5nIHJlZ2lzdGVyICVkOiAlcyIsIHJlZ25vLCBlcnIpOworCSAgZXJyb3IgKG1zZyk7CisJICBnb3RvIGVycm9yX2V4aXQ7CisJfQorICAgIH0KKyBlcnJvcl9leGl0OjsKK30KKworLyogRmV0Y2ggYWxsIHJlZ2lzdGVycywgb3IganVzdCBvbmUsIGZyb20gdGhlIGNoaWxkIHByb2Nlc3MuICAqLworCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGlmIChyZWdubyA9PSAtMSB8fCByZWdubyA9PSAwKQorICAgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IE5VTV9SRUdTLU5VTV9GUkVHUzsgcmVnbm8rKykKKyAgICAgIGZldGNoX3JlZ2lzdGVyIChyZWdubyk7CisgIGVsc2UKKyAgICBmZXRjaF9yZWdpc3RlciAocmVnbm8pOworfQorCisvKiBTdG9yZSBvdXIgcmVnaXN0ZXIgdmFsdWVzIGJhY2sgaW50byB0aGUgaW5mZXJpb3IuCisgICBJZiBSRUdOTyBpcyAtMSwgZG8gdGhpcyBmb3IgYWxsIHJlZ2lzdGVycy4KKyAgIE90aGVyd2lzZSwgUkVHTk8gc3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVyIChzbyB3ZSBjYW4gc2F2ZSB0aW1lKS4gICovCisKK3ZvaWQKK3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHJlZ2FkZHI7CisgIHJlZ2lzdGVyIGludCBpOworICB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gVV9SRUdTX09GRlNFVDsKKworICBpZiAocmVnbm8gPj0gMCkKKyAgICB7CisjaWYgMAorICAgICAgaWYgKENBTk5PVF9TVE9SRV9SRUdJU1RFUiAocmVnbm8pKQorCXJldHVybjsKKyNlbmRpZgorICAgICAgcmVnYWRkciA9IHJlZ2lzdGVyX2FkZHIgKHJlZ25vLCBvZmZzZXQpOworICAgICAgZXJybm8gPSAwOworI2lmIDAKKyAgICAgIGlmIChyZWdubyA9PSBQQ09RX0hFQURfUkVHTlVNIHx8IHJlZ25vID09IFBDT1FfVEFJTF9SRUdOVU0pCisgICAgICAgIHsKKyAgICAgICAgICBzY3JhdGNoID0gKihpbnQgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdubyldIHwgMHgzOworICAgICAgICAgIHB0cmFjZSAoUFRfV1VSRUdTLCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSByZWdhZGRyLAorICAgICAgICAgICAgICAgICAgc2NyYXRjaCwgMCk7CisgICAgICAgICAgaWYgKGVycm5vICE9IDApCisgICAgICAgICAgICB7CisJICAgICAgLyogRXJyb3IsIGV2ZW4gaWYgYXR0YWNoZWQuICBGYWlsaW5nIHRvIHdyaXRlIHRoZXNlIHR3bworCQkgcmVnaXN0ZXJzIGlzIHByZXR0eSBzZXJpb3VzLiAgKi8KKyAgICAgICAgICAgICAgc3ByaW50ZiAoYnVmLCAid3JpdGluZyByZWdpc3RlciBudW1iZXIgJWQiLCByZWdubyk7CisgICAgICAgICAgICAgIHBlcnJvcl93aXRoX25hbWUgKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pOyBpICs9IHNpemVvZihpbnQpKQorCSAgeworCSAgICBlcnJubyA9IDA7CisJICAgIHB0cmFjZSAoUFRSQUNFX1BPS0VVU1IsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIHJlZ2FkZHIsCisJCSAgICAqKGludCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ25vKSArIGldKTsKKwkgICAgaWYgKGVycm5vICE9IDApCisJICAgICAgeworCQkvKiBXYXJuaW5nLCBub3QgZXJyb3IsIGluIGNhc2Ugd2UgYXJlIGF0dGFjaGVkOyBzb21ldGltZXMgdGhlCisJCSAgIGtlcm5lbCBkb2Vzbid0IGxldCB1cyBhdCB0aGUgcmVnaXN0ZXJzLiAgKi8KKwkJY2hhciAqZXJyID0gc3RyZXJyb3IgKGVycm5vKTsKKwkJY2hhciAqbXNnID0gYWxsb2NhIChzdHJsZW4gKGVycikgKyAxMjgpOworCQlzcHJpbnRmIChtc2csICJ3cml0aW5nIHJlZ2lzdGVyICVkOiAlcyIsCisJCQkgcmVnbm8sIGVycik7CisJCWVycm9yIChtc2cpOworCQlyZXR1cm47CisJICAgICAgfQorCSAgICByZWdhZGRyICs9IHNpemVvZihpbnQpOworCSAgfQorICAgIH0KKyAgZWxzZQorICAgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IE5VTV9SRUdTLU5VTV9GUkVHUzsgcmVnbm8rKykKKyAgICAgIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pOworfQorCisvKiBOT1RFISBJIHRyaWVkIHVzaW5nIFBUUkFDRV9SRUFEREFUQSwgZXRjLiwgdG8gcmVhZCBhbmQgd3JpdGUgbWVtb3J5CisgICBpbiB0aGUgTkVXX1NVTl9QVFJBQ0UgY2FzZS4KKyAgIEl0IG91Z2h0IHRvIGJlIHN0cmFpZ2h0Zm9yd2FyZC4gIEJ1dCBpdCBhcHBlYXJzIHRoYXQgd3JpdGluZyBkaWQKKyAgIG5vdCB3cml0ZSB0aGUgZGF0YSB0aGF0IEkgc3BlY2lmaWVkLiAgSSBjYW5ub3QgdW5kZXJzdGFuZCB3aGVyZQorICAgaXQgZ290IHRoZSBkYXRhIHRoYXQgaXQgYWN0dWFsbHkgZGlkIHdyaXRlLiAgKi8KKworLyogQ29weSBMRU4gYnl0ZXMgZnJvbSBpbmZlcmlvcidzIG1lbW9yeSBzdGFydGluZyBhdCBNRU1BRERSCisgICB0byBkZWJ1Z2dlciBtZW1vcnkgc3RhcnRpbmcgYXQgTVlBRERSLiAgKi8KKwordm9pZAorcmVhZF9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICByZWdpc3RlciBpbnQgaTsKKyAgLyogUm91bmQgc3RhcnRpbmcgYWRkcmVzcyBkb3duIHRvIGxvbmd3b3JkIGJvdW5kYXJ5LiAgKi8KKyAgcmVnaXN0ZXIgQ09SRV9BRERSIGFkZHIgPSBtZW1hZGRyICYgLXNpemVvZiAoaW50KTsKKyAgLyogUm91bmQgZW5kaW5nIGFkZHJlc3MgdXA7IGdldCBudW1iZXIgb2YgbG9uZ3dvcmRzIHRoYXQgbWFrZXMuICAqLworICByZWdpc3RlciBpbnQgY291bnQKKyAgPSAoKChtZW1hZGRyICsgbGVuKSAtIGFkZHIpICsgc2l6ZW9mIChpbnQpIC0gMSkgLyBzaXplb2YgKGludCk7CisgIC8qIEFsbG9jYXRlIGJ1ZmZlciBvZiB0aGF0IG1hbnkgbG9uZ3dvcmRzLiAgKi8KKyAgcmVnaXN0ZXIgaW50ICpidWZmZXIgPSAoaW50ICopIGFsbG9jYSAoY291bnQgKiBzaXplb2YgKGludCkpOworCisgIC8qIFJlYWQgYWxsIHRoZSBsb25nd29yZHMgKi8KKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIGFkZHIgKz0gc2l6ZW9mIChpbnQpKQorICAgIHsKKyAgICAgIGJ1ZmZlcltpXSA9IHB0cmFjZSAoUFRSQUNFX1BFRUtURVhULCBpbmZlcmlvcl9waWQsIGFkZHIsIDApOworICAgIH0KKworICAvKiBDb3B5IGFwcHJvcHJpYXRlIGJ5dGVzIG91dCBvZiB0aGUgYnVmZmVyLiAgKi8KKyAgbWVtY3B5IChteWFkZHIsIChjaGFyICopIGJ1ZmZlciArIChtZW1hZGRyICYgKHNpemVvZiAoaW50KSAtIDEpKSwgbGVuKTsKK30KKworLyogQ29weSBMRU4gYnl0ZXMgb2YgZGF0YSBmcm9tIGRlYnVnZ2VyIG1lbW9yeSBhdCBNWUFERFIKKyAgIHRvIGluZmVyaW9yJ3MgbWVtb3J5IGF0IE1FTUFERFIuCisgICBPbiBmYWlsdXJlIChjYW5ub3Qgd3JpdGUgdGhlIGluZmVyaW9yKQorICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgZXJybm8uICAqLworCitpbnQKK3dyaXRlX2luZmVyaW9yX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47Cit7CisgIHJlZ2lzdGVyIGludCBpOworICAvKiBSb3VuZCBzdGFydGluZyBhZGRyZXNzIGRvd24gdG8gbG9uZ3dvcmQgYm91bmRhcnkuICAqLworICByZWdpc3RlciBDT1JFX0FERFIgYWRkciA9IG1lbWFkZHIgJiAtc2l6ZW9mIChpbnQpOworICAvKiBSb3VuZCBlbmRpbmcgYWRkcmVzcyB1cDsgZ2V0IG51bWJlciBvZiBsb25nd29yZHMgdGhhdCBtYWtlcy4gICovCisgIHJlZ2lzdGVyIGludCBjb3VudAorICA9ICgoKG1lbWFkZHIgKyBsZW4pIC0gYWRkcikgKyBzaXplb2YgKGludCkgLSAxKSAvIHNpemVvZiAoaW50KTsKKyAgLyogQWxsb2NhdGUgYnVmZmVyIG9mIHRoYXQgbWFueSBsb25nd29yZHMuICAqLworICByZWdpc3RlciBpbnQgKmJ1ZmZlciA9IChpbnQgKikgYWxsb2NhIChjb3VudCAqIHNpemVvZiAoaW50KSk7CisgIGV4dGVybiBpbnQgZXJybm87CisKKyAgLyogRmlsbCBzdGFydCBhbmQgZW5kIGV4dHJhIGJ5dGVzIG9mIGJ1ZmZlciB3aXRoIGV4aXN0aW5nIG1lbW9yeSBkYXRhLiAgKi8KKworICBidWZmZXJbMF0gPSBwdHJhY2UgKFBUUkFDRV9QRUVLVEVYVCwgaW5mZXJpb3JfcGlkLCBhZGRyLCAwKTsKKworICBpZiAoY291bnQgPiAxKQorICAgIHsKKyAgICAgIGJ1ZmZlcltjb3VudCAtIDFdCisJPSBwdHJhY2UgKFBUUkFDRV9QRUVLVEVYVCwgaW5mZXJpb3JfcGlkLAorCQkgIGFkZHIgKyAoY291bnQgLSAxKSAqIHNpemVvZiAoaW50KSwgMCk7CisgICAgfQorCisgIC8qIENvcHkgZGF0YSB0byBiZSB3cml0dGVuIG92ZXIgY29ycmVzcG9uZGluZyBwYXJ0IG9mIGJ1ZmZlciAqLworCisgIG1lbWNweSAoKGNoYXIgKikgYnVmZmVyICsgKG1lbWFkZHIgJiAoc2l6ZW9mIChpbnQpIC0gMSkpLCBteWFkZHIsIGxlbik7CisKKyAgLyogV3JpdGUgdGhlIGVudGlyZSBidWZmZXIuICAqLworCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBhZGRyICs9IHNpemVvZiAoaW50KSkKKyAgICB7CisgICAgICBlcnJubyA9IDA7CisgICAgICBwdHJhY2UgKFBUUkFDRV9QT0tFVEVYVCwgaW5mZXJpb3JfcGlkLCBhZGRyLCBidWZmZXJbaV0pOworICAgICAgaWYgKGVycm5vKQorCXJldHVybiBlcnJubzsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisMCit2b2lkCitpbml0aWFsaXplICgpCit7CisgIGluZmVyaW9yX3BpZCA9IDA7Cit9CisKK2ludAoraGF2ZV9pbmZlcmlvcl9wICgpCit7CisgIHJldHVybiBpbmZlcmlvcl9waWQgIT0gMDsKK30KZGlmZiAtLWdpdCBhL2dkYi9nZGJzZXJ2ZXIvbG93LWx5bnguYyBiL2dkYi9nZGJzZXJ2ZXIvbG93LWx5bnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDQ0ZjdhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2dkYnNlcnZlci9sb3ctbHlueC5jCkBAIC0wLDAgKzEsNzQ2IEBACisvKiBMb3cgbGV2ZWwgaW50ZXJmYWNlIHRvIHB0cmFjZSwgZm9yIHRoZSByZW1vdGUgc2VydmVyIGZvciBHREIuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgInNlcnZlci5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL2Rpci5oPgorI2RlZmluZSBMWU5YT1MKKyNpbmNsdWRlIDxzeXMvbWVtLmg+CisjaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSA8c3lzL2tlcm5lbC5oPgorI2lmbmRlZiBfX0xZTlhPUworI2RlZmluZSBfX0xZTlhPUworI2VuZGlmCisjaW5jbHVkZSA8c3lzL2l0aW1lci5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c3lzL3Byb2MuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzZ3R0eS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvZnBwLmg+CisKK2NoYXIgcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEVTXTsKKworI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KKworLyogU3RhcnQgYW4gaW5mZXJpb3IgcHJvY2VzcyBhbmQgcmV0dXJucyBpdHMgcGlkLgorICAgQUxMQVJHUyBpcyBhIHZlY3RvciBvZiBwcm9ncmFtLW5hbWUgYW5kIGFyZ3MuICovCisKK2ludAorY3JlYXRlX2luZmVyaW9yIChwcm9ncmFtLCBhbGxhcmdzKQorICAgICBjaGFyICpwcm9ncmFtOworICAgICBjaGFyICoqYWxsYXJnczsKK3sKKyAgaW50IHBpZDsKKworICBwaWQgPSBmb3JrICgpOworICBpZiAocGlkIDwgMCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgiZm9yayIpOworCisgIGlmIChwaWQgPT0gMCkKKyAgICB7CisgICAgICBpbnQgcGdycDsKKworICAgICAgLyogU3dpdGNoIGNoaWxkIHRvIGl0J3Mgb3duIHByb2Nlc3MgZ3JvdXAgc28gdGhhdCBzaWduYWxzIHdvbid0CisJIGRpcmVjdGx5IGFmZmVjdCBnZGJzZXJ2ZXIuICovCisKKyAgICAgIHBncnAgPSBnZXRwaWQoKTsKKyAgICAgIHNldHBncnAoMCwgcGdycCk7CisgICAgICBpb2N0bCAoMCwgVElPQ1NQR1JQLCAmcGdycCk7CisKKyAgICAgIHB0cmFjZSAoUFRSQUNFX1RSQUNFTUUsIDAsIChQVFJBQ0VfQVJHM19UWVBFKTAsIDApOworCisgICAgICBleGVjdiAocHJvZ3JhbSwgYWxsYXJncyk7CisKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkdEQnNlcnZlciAocHJvY2VzcyAlZCk6ICBDYW5ub3QgZXhlYyAlczogJXMuXG4iLAorCSAgICAgICBnZXRwaWQoKSwgcHJvZ3JhbSwKKwkgICAgICAgZXJybm8gPCBzeXNfbmVyciA/IHN5c19lcnJsaXN0W2Vycm5vXSA6ICJ1bmtub3duIGVycm9yIik7CisgICAgICBmZmx1c2ggKHN0ZGVycik7CisgICAgICBfZXhpdCAoMDE3Nyk7CisgICAgfQorCisgIHJldHVybiBwaWQ7Cit9CisKKy8qIEtpbGwgdGhlIGluZmVyaW9yIHByb2Nlc3MuICBNYWtlIHVzIGhhdmUgbm8gaW5mZXJpb3IuICAqLworCit2b2lkCitraWxsX2luZmVyaW9yICgpCit7CisgIGlmIChpbmZlcmlvcl9waWQgPT0gMCkKKyAgICByZXR1cm47CisgIHB0cmFjZSAoUFRSQUNFX0tJTEwsIGluZmVyaW9yX3BpZCwgMCwgMCk7CisgIHdhaXQgKDApOworCisgIGluZmVyaW9yX3BpZCA9IDA7Cit9CisKKy8qIFJldHVybiBub256ZXJvIGlmIHRoZSBnaXZlbiB0aHJlYWQgaXMgc3RpbGwgYWxpdmUuICAqLworaW50CitteXRocmVhZF9hbGl2ZSAocGlkKQorICAgICBpbnQgcGlkOworeworICAvKiBBcmdnaC4gIEFwcGFyZW50bHkgcHRocmVhZF9raWxsIG9ubHkgd29ya3MgZm9yIHRocmVhZHMgd2l0aGluCisgICAgIHRoZSBwcm9jZXNzIHRoYXQgY2FsbHMgcHRocmVhZF9raWxsLgorCisgICAgIFdlIHdhbnQgdG8gYXZvaWQgdGhlIGx5bnggc2lnbmFsIGV4dGVuc2lvbnMgYXMgdGhleSBzaW1wbHkgZG9uJ3QKKyAgICAgbWFwIHdlbGwgdG8gdGhlIGdlbmVyaWMgZ2RiIGludGVyZmFjZSB3ZSB3YW50IHRvIGtlZXAuCisKKyAgICAgQWxsIHdlIHdhbnQgdG8gZG8gaXMgZGV0ZXJtaW5lIGlmIGEgcGFydGljdWxhciB0aHJlYWQgaXMgYWxpdmU7CisgICAgIGl0IGFwcGVhcnMgYXMgaWYgd2UgY2FuIGp1c3QgbWFrZSBhIGhhcm1sZXNzIHRocmVhZCBzcGVjaWZpYworICAgICBwdHJhY2UgY2FsbCB0byBkbyB0aGF0LiAgKi8KKyAgcmV0dXJuIChwdHJhY2UgKFBUUkFDRV9USFJFQURVU0VSLAorCQkgIEJVSUxEUElEIChQSURHRVQgKGluZmVyaW9yX3BpZCksIHBpZCksIDAsIDApICE9IC0xKTsKK30KKworLyogV2FpdCBmb3IgcHJvY2VzcywgcmV0dXJucyBzdGF0dXMgKi8KKwordW5zaWduZWQgY2hhcgorbXl3YWl0IChzdGF0dXMpCisgICAgIGNoYXIgKnN0YXR1czsKK3sKKyAgaW50IHBpZDsKKyAgdW5pb24gd2FpdCB3OworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGVuYWJsZV9hc3luY19pbygpOworCisgICAgICBwaWQgPSB3YWl0ICgmdyk7CisKKyAgICAgIGRpc2FibGVfYXN5bmNfaW8oKTsKKworICAgICAgaWYgKHBpZCAhPSBQSURHRVQoaW5mZXJpb3JfcGlkKSkKKwlwZXJyb3Jfd2l0aF9uYW1lICgid2FpdCIpOworCisgICAgICB0aHJlYWRfZnJvbV93YWl0ID0gdy53X3RpZDsKKyAgICAgIGluZmVyaW9yX3BpZCA9IEJVSUxEUElEIChpbmZlcmlvcl9waWQsIHcud190aWQpOworCisgICAgICBpZiAoV0lGU1RPUFBFRCh3KQorCSAgJiYgV1NUT1BTSUcodykgPT0gU0lHVFJBUCkKKwl7CisJICBpbnQgcmVhbHNpZzsKKworCSAgcmVhbHNpZyA9IHB0cmFjZSAoUFRSQUNFX0dFVFRSQUNFU0lHLCBpbmZlcmlvcl9waWQsCisJCQkgICAgKFBUUkFDRV9BUkczX1RZUEUpMCwgMCk7CisKKwkgIGlmIChyZWFsc2lnID09IFNJR05FV1RIUkVBRCkKKwkgICAgeworCSAgICAgIC8qIEl0J3MgYSBuZXcgdGhyZWFkIG5vdGlmaWNhdGlvbi4gIE5vdGhpbmcgdG8gZG8gaGVyZSBzaW5jZQorCQkgdGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQgY29kZSBpbiB3YWl0X2Zvcl9pbmZlcmlvciB3aWxsCisJCSBhZGQgdGhlIHRocmVhZCB0byB0aGUgdGhyZWFkIGxpc3QgYW5kIHJlc3RhcnQgdGhlIHRocmVhZAorCQkgd2hlbiBwaWQgIT0gaW5mZXJpb3JfcGlkIGFuZCBwaWQgaXMgbm90IGluIHRoZSB0aHJlYWQgbGlzdC4KKwkJIFdlIGRvbid0IGV2ZW4gd2FudCB0byBtdWNrIHdpdGggcmVhbHNpZyAtLSB0aGUgY29kZSBpbgorCQkgd2FpdF9mb3JfaW5mZXJpb3IgZXhwZWN0cyBTSUdUUkFQLiAgKi8KKwkgICAgICA7CisJICAgIH0KKwl9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgaWYgKFdJRkVYSVRFRCAodykpCisgICAgeworICAgICAgKnN0YXR1cyA9ICdXJzsKKyAgICAgIHJldHVybiAoKHVuc2lnbmVkIGNoYXIpIFdFWElUU1RBVFVTICh3KSk7CisgICAgfQorICBlbHNlIGlmICghV0lGU1RPUFBFRCAodykpCisgICAgeworICAgICAgKnN0YXR1cyA9ICdYJzsKKyAgICAgIHJldHVybiAoKHVuc2lnbmVkIGNoYXIpIFdURVJNU0lHICh3KSk7CisgICAgfQorCisgIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoMCk7CisKKyAgKnN0YXR1cyA9ICdUJzsKKyAgcmV0dXJuICgodW5zaWduZWQgY2hhcikgV1NUT1BTSUcgKHcpKTsKK30KKworLyogUmVzdW1lIGV4ZWN1dGlvbiBvZiB0aGUgaW5mZXJpb3IgcHJvY2Vzcy4KKyAgIElmIFNURVAgaXMgbm9uemVybywgc2luZ2xlLXN0ZXAgaXQuCisgICBJZiBTSUdOQUwgaXMgbm9uemVybywgZ2l2ZSBpdCB0aGF0IHNpZ25hbC4gICovCisKK3ZvaWQKK215cmVzdW1lIChzdGVwLCBzaWduYWwpCisgICAgIGludCBzdGVwOworICAgICBpbnQgc2lnbmFsOworeworICBlcnJubyA9IDA7CisgIHB0cmFjZSAoc3RlcCA/IFBUUkFDRV9TSU5HTEVTVEVQX09ORSA6IFBUUkFDRV9DT05ULAorCSAgQlVJTERQSUQgKGluZmVyaW9yX3BpZCwgY29udF90aHJlYWQgPT0gLTEgPyAwIDogY29udF90aHJlYWQpLAorCSAgMSwgc2lnbmFsKTsKKyAgaWYgKGVycm5vKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJwdHJhY2UiKTsKK30KKworI3VuZGVmIG9mZnNldG9mCisjZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgKCh1bnNpZ25lZCBsb25nKSAmKChUWVBFICopMCktPk1FTUJFUikKKworLyogTWFwcGluZyBiZXR3ZWVuIEdEQiByZWdpc3RlciAjcyBhbmQgb2Zmc2V0cyBpbnRvIGVjb250ZXh0LiAgTXVzdCBiZQorICAgY29uc2lzdGVudCB3aXRoIFJFR0lTVEVSX05BTUVTIG1hY3JvIGluIHZhcmlvdXMgdG1YWFguaCBmaWxlcy4gKi8KKworI2RlZmluZSBYKEVOVFJZKShvZmZzZXRvZihzdHJ1Y3QgZWNvbnRleHQsIEVOVFJZKSkKKworI2lmZGVmIEkzODYKKy8qIE1hcHBpbmdzIGZyb20gdG0taTM4NnYuaCAqLworCitzdGF0aWMgaW50IHJlZ21hcFtdID0KK3sKKyAgWChlYXgpLAorICBYKGVjeCksCisgIFgoZWR4KSwKKyAgWChlYngpLAorICBYKGVzcCksCQkJLyogc3AgKi8KKyAgWChlYnApLAkJCS8qIGZwICovCisgIFgoZXNpKSwKKyAgWChlZGkpLAorICBYKGVpcCksCQkJLyogcGMgKi8KKyAgWChmbGFncyksCQkJLyogcHMgKi8KKyAgWChjcyksCisgIFgoc3MpLAorICBYKGRzKSwKKyAgWChlcyksCisgIFgoZWNvZGUpLAkJCS8qIEx5bnggZG9lc24ndCBnaXZlIHVzIGVpdGhlciBmcyBvciBncywgc28gKi8KKyAgWChmYXVsdCksCQkJLyogd2UganVzdCBzdWJzdGl0dXRlIHRoZXNlIHR3byBpbiB0aGUgaG9wZXMKKwkJCQkgICB0aGF0IHRoZXkgYXJlIHVzZWZ1bC4gKi8KK307CisjZW5kaWYKKworI2lmZGVmIE02OEsKKy8qIE1hcHBpbmdzIGZyb20gdG0tbTY4ay5oICovCisKK3N0YXRpYyBpbnQgcmVnbWFwW10gPQoreworICBYKHJlZ3NbMF0pLAkJCS8qIGQwICovCisgIFgocmVnc1sxXSksCQkJLyogZDEgKi8KKyAgWChyZWdzWzJdKSwJCQkvKiBkMiAqLworICBYKHJlZ3NbM10pLAkJCS8qIGQzICovCisgIFgocmVnc1s0XSksCQkJLyogZDQgKi8KKyAgWChyZWdzWzVdKSwJCQkvKiBkNSAqLworICBYKHJlZ3NbNl0pLAkJCS8qIGQ2ICovCisgIFgocmVnc1s3XSksCQkJLyogZDcgKi8KKyAgWChyZWdzWzhdKSwJCQkvKiBhMCAqLworICBYKHJlZ3NbOV0pLAkJCS8qIGExICovCisgIFgocmVnc1sxMF0pLAkJCS8qIGEyICovCisgIFgocmVnc1sxMV0pLAkJCS8qIGEzICovCisgIFgocmVnc1sxMl0pLAkJCS8qIGE0ICovCisgIFgocmVnc1sxM10pLAkJCS8qIGE1ICovCisgIFgocmVnc1sxNF0pLAkJCS8qIGZwICovCisgIDAsCQkJCS8qIHNwICovCisgIFgoc3RhdHVzKSwJCQkvKiBwcyAqLworICBYKHBjKSwKKworICBYKGZyZWdzWzAqM10pLAkJLyogZnAwICovCisgIFgoZnJlZ3NbMSozXSksCQkvKiBmcDEgKi8KKyAgWChmcmVnc1syKjNdKSwJCS8qIGZwMiAqLworICBYKGZyZWdzWzMqM10pLAkJLyogZnAzICovCisgIFgoZnJlZ3NbNCozXSksCQkvKiBmcDQgKi8KKyAgWChmcmVnc1s1KjNdKSwJCS8qIGZwNSAqLworICBYKGZyZWdzWzYqM10pLAkJLyogZnA2ICovCisgIFgoZnJlZ3NbNyozXSksCQkvKiBmcDcgKi8KKworICBYKGZjcmVnc1swXSksCQkJLyogZnBjb250cm9sICovCisgIFgoZmNyZWdzWzFdKSwJCQkvKiBmcHN0YXR1cyAqLworICBYKGZjcmVnc1syXSksCQkJLyogZnBpYWRkciAqLworICBYKHNzdyksCQkJLyogZnBjb2RlICovCisgIFgoZmF1bHQpLAkJCS8qIGZwZmxhZ3MgKi8KK307CisjZW5kaWYKKworI2lmZGVmIFNQQVJDCisvKiBNYXBwaW5ncyBmcm9tIHRtLXNwYXJjLmggKi8KKworI2RlZmluZSBGWChFTlRSWSkob2Zmc2V0b2Yoc3RydWN0IGZjb250ZXh0LCBFTlRSWSkpCisKK3N0YXRpYyBpbnQgcmVnbWFwW10gPQoreworICAtMSwJCQkJLyogZzAgKi8KKyAgWChnMSksCisgIFgoZzIpLAorICBYKGczKSwKKyAgWChnNCksCisgIC0xLAkJCQkvKiBnNS0+ZzcgYXJlbid0IHNhdmVkIGJ5IEx5bnggKi8KKyAgLTEsCisgIC0xLAorCisgIFgob1swXSksCisgIFgob1sxXSksCisgIFgob1syXSksCisgIFgob1szXSksCisgIFgob1s0XSksCisgIFgob1s1XSksCisgIFgob1s2XSksCQkJLyogc3AgKi8KKyAgWChvWzddKSwJCQkvKiByYSAqLworCisgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAkvKiBsMCAtPiBsNyAqLworCisgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAkvKiBpMCAtPiBpNyAqLworCisgIEZYKGYuZnJlZ3NbMF0pLAkJLyogZjAgKi8KKyAgRlgoZi5mcmVnc1sxXSksCisgIEZYKGYuZnJlZ3NbMl0pLAorICBGWChmLmZyZWdzWzNdKSwKKyAgRlgoZi5mcmVnc1s0XSksCisgIEZYKGYuZnJlZ3NbNV0pLAorICBGWChmLmZyZWdzWzZdKSwKKyAgRlgoZi5mcmVnc1s3XSksCisgIEZYKGYuZnJlZ3NbOF0pLAorICBGWChmLmZyZWdzWzldKSwKKyAgRlgoZi5mcmVnc1sxMF0pLAorICBGWChmLmZyZWdzWzExXSksCisgIEZYKGYuZnJlZ3NbMTJdKSwKKyAgRlgoZi5mcmVnc1sxM10pLAorICBGWChmLmZyZWdzWzE0XSksCisgIEZYKGYuZnJlZ3NbMTVdKSwKKyAgRlgoZi5mcmVnc1sxNl0pLAorICBGWChmLmZyZWdzWzE3XSksCisgIEZYKGYuZnJlZ3NbMThdKSwKKyAgRlgoZi5mcmVnc1sxOV0pLAorICBGWChmLmZyZWdzWzIwXSksCisgIEZYKGYuZnJlZ3NbMjFdKSwKKyAgRlgoZi5mcmVnc1syMl0pLAorICBGWChmLmZyZWdzWzIzXSksCisgIEZYKGYuZnJlZ3NbMjRdKSwKKyAgRlgoZi5mcmVnc1syNV0pLAorICBGWChmLmZyZWdzWzI2XSksCisgIEZYKGYuZnJlZ3NbMjddKSwKKyAgRlgoZi5mcmVnc1syOF0pLAorICBGWChmLmZyZWdzWzI5XSksCisgIEZYKGYuZnJlZ3NbMzBdKSwKKyAgRlgoZi5mcmVnc1szMV0pLAorCisgIFgoeSksCisgIFgocHNyKSwKKyAgWCh3aW0pLAorICBYKHRiciksCisgIFgocGMpLAorICBYKG5wYyksCisgIEZYKGZzciksCQkJLyogZnBzciAqLworICAtMSwJCQkJLyogY3BzciAqLworfTsKKyNlbmRpZgorCisjaWZkZWYgU1BBUkMKKworLyogVGhpcyByb3V0aW5lIGhhbmRsZXMgc29tZSBvZGRiYWxsIGNhc2VzIGZvciBTcGFyYyByZWdpc3RlcnMgYW5kIEx5bnhPUy4KKyAgIEluIHBhcnR1Y3VsYXIsIGl0IGNhdXNlcyByZWZzIHRvIEcwLCBnNS0+NywgYW5kIGFsbCBmcCByZWdzIHRvIHJldHVybiB6ZXJvLgorICAgSXQgYWxzbyBoYW5kbGVzIGtub3dzIHdoZXJlIHRvIGZpbmQgdGhlIEkgJiBMIHJlZ3Mgb24gdGhlIHN0YWNrLiAgKi8KKwordm9pZAorZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworI2lmIDAKKyAgaW50IHdoYXRyZWdzID0gMDsKKworI2RlZmluZSBXSEFUUkVHU19GTE9BVCAxCisjZGVmaW5lIFdIQVRSRUdTX0dFTiAyCisjZGVmaW5lIFdIQVRSRUdTX1NUQUNLIDQKKworICBpZiAocmVnbm8gPT0gLTEpCisgICAgd2hhdHJlZ3MgPSBXSEFUUkVHU19GTE9BVCB8IFdIQVRSRUdTX0dFTiB8IFdIQVRSRUdTX1NUQUNLOworICBlbHNlIGlmIChyZWdubyA+PSBMMF9SRUdOVU0gJiYgcmVnbm8gPD0gSTdfUkVHTlVNKQorICAgIHdoYXRyZWdzID0gV0hBVFJFR1NfU1RBQ0s7CisgIGVsc2UgaWYgKHJlZ25vID49IEZQMF9SRUdOVU0gJiYgcmVnbm8gPCBGUDBfUkVHTlVNICsgMzIpCisgICAgd2hhdHJlZ3MgPSBXSEFUUkVHU19GTE9BVDsKKyAgZWxzZQorICAgIHdoYXRyZWdzID0gV0hBVFJFR1NfR0VOOworCisgIGlmICh3aGF0cmVncyAmIFdIQVRSRUdTX0dFTikKKyAgICB7CisgICAgICBzdHJ1Y3QgZWNvbnRleHQgZWM7CQkvKiBnZW5lcmFsIHJlZ3MgKi8KKyAgICAgIGNoYXIgYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisgICAgICBpbnQgcmV0dmFsOworICAgICAgaW50IGk7CisKKyAgICAgIGVycm5vID0gMDsKKyAgICAgIHJldHZhbCA9IHB0cmFjZSAoUFRSQUNFX0dFVFJFR1MsCisJCSAgICAgICBCVUlMRFBJRCAoaW5mZXJpb3JfcGlkLCBnZW5lcmFsX3RocmVhZCksCisJCSAgICAgICAoUFRSQUNFX0FSRzNfVFlQRSkgJmVjLAorCQkgICAgICAgMCk7CisgICAgICBpZiAoZXJybm8pCisJcGVycm9yX3dpdGhfbmFtZSAoIlNwYXJjIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyhwdHJhY2UpIik7CisgIAorICAgICAgbWVtc2V0IChidWYsIDAsIFJFR0lTVEVSX1JBV19TSVpFIChHMF9SRUdOVU0pKTsKKyAgICAgIHN1cHBseV9yZWdpc3RlciAoRzBfUkVHTlVNLCBidWYpOworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChUQlJfUkVHTlVNLCAoY2hhciAqKSZlYy50YnIpOworCisgICAgICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRzFfUkVHTlVNKV0sICZlYy5nMSwKKwkgICAgICA0ICogUkVHSVNURVJfUkFXX1NJWkUgKEcxX1JFR05VTSkpOworICAgICAgZm9yIChpID0gRzFfUkVHTlVNOyBpIDw9IEcxX1JFR05VTSArIDM7IGkrKykKKwlyZWdpc3Rlcl92YWxpZFtpXSA9IDE7CisKKyAgICAgIHN1cHBseV9yZWdpc3RlciAoUFNfUkVHTlVNLCAoY2hhciAqKSZlYy5wc3IpOworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChZX1JFR05VTSwgKGNoYXIgKikmZWMueSk7CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKFBDX1JFR05VTSwgKGNoYXIgKikmZWMucGMpOworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChOUENfUkVHTlVNLCAoY2hhciAqKSZlYy5ucGMpOworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChXSU1fUkVHTlVNLCAoY2hhciAqKSZlYy53aW0pOworCisgICAgICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoTzBfUkVHTlVNKV0sIGVjLm8sCisJICAgICAgOCAqIFJFR0lTVEVSX1JBV19TSVpFIChPMF9SRUdOVU0pKTsKKyAgICAgIGZvciAoaSA9IE8wX1JFR05VTTsgaSA8PSBPMF9SRUdOVU0gKyA3OyBpKyspCisJcmVnaXN0ZXJfdmFsaWRbaV0gPSAxOworICAgIH0KKworICBpZiAod2hhdHJlZ3MgJiBXSEFUUkVHU19TVEFDSykKKyAgICB7CisgICAgICBDT1JFX0FERFIgc3A7CisgICAgICBpbnQgaTsKKworICAgICAgc3AgPSByZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pOworCisgICAgICB0YXJnZXRfeGZlcl9tZW1vcnkgKHNwICsgRlJBTUVfU0FWRURfSTAsCisJCQkgICZyZWdpc3RlcnNbUkVHSVNURVJfQllURShJMF9SRUdOVU0pXSwKKwkJCSAgOCAqIFJFR0lTVEVSX1JBV19TSVpFIChJMF9SRUdOVU0pLCAwKTsKKyAgICAgIGZvciAoaSA9IEkwX1JFR05VTTsgaSA8PSBJN19SRUdOVU07IGkrKykKKwlyZWdpc3Rlcl92YWxpZFtpXSA9IDE7CisKKyAgICAgIHRhcmdldF94ZmVyX21lbW9yeSAoc3AgKyBGUkFNRV9TQVZFRF9MMCwKKwkJCSAgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKEwwX1JFR05VTSldLAorCQkJICA4ICogUkVHSVNURVJfUkFXX1NJWkUgKEwwX1JFR05VTSksIDApOworICAgICAgZm9yIChpID0gTDBfUkVHTlVNOyBpIDw9IEwwX1JFR05VTSArIDc7IGkrKykKKwlyZWdpc3Rlcl92YWxpZFtpXSA9IDE7CisgICAgfQorCisgIGlmICh3aGF0cmVncyAmIFdIQVRSRUdTX0ZMT0FUKQorICAgIHsKKyAgICAgIHN0cnVjdCBmY29udGV4dCBmYzsJCS8qIGZwIHJlZ3MgKi8KKyAgICAgIGludCByZXR2YWw7CisgICAgICBpbnQgaTsKKworICAgICAgZXJybm8gPSAwOworICAgICAgcmV0dmFsID0gcHRyYWNlIChQVFJBQ0VfR0VURlBSRUdTLCBCVUlMRFBJRCAoaW5mZXJpb3JfcGlkLCBnZW5lcmFsX3RocmVhZCksIChQVFJBQ0VfQVJHM19UWVBFKSAmZmMsCisJCSAgICAgICAwKTsKKyAgICAgIGlmIChlcnJubykKKwlwZXJyb3Jfd2l0aF9uYW1lICgiU3BhcmMgZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzKHB0cmFjZSkiKTsKKyAgCisgICAgICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLCBmYy5mLmZyZWdzLAorCSAgICAgIDMyICogUkVHSVNURVJfUkFXX1NJWkUgKEZQMF9SRUdOVU0pKTsKKyAgICAgIGZvciAoaSA9IEZQMF9SRUdOVU07IGkgPD0gRlAwX1JFR05VTSArIDMxOyBpKyspCisJcmVnaXN0ZXJfdmFsaWRbaV0gPSAxOworCisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKEZQU19SRUdOVU0sIChjaGFyICopJmZjLmZzcik7CisgICAgfQorI2VuZGlmCit9CisKKy8qIFRoaXMgcm91dGluZSBoYW5kbGVzIHN0b3Jpbmcgb2YgdGhlIEkgJiBMIHJlZ3MgZm9yIHRoZSBTcGFyYy4gIFRoZSB0cmljaworICAgaGVyZSBpcyB0aGF0IHRoZXkgYWN0dWFsbHkgbGl2ZSBvbiB0aGUgc3RhY2suICBUaGUgcmVhbGx5IHRyaWNreSBwYXJ0IGlzCisgICB0aGF0IHdoZW4gY2hhbmdpbmcgdGhlIHN0YWNrIHBvaW50ZXIsIHRoZSBJICYgTCByZWdzIG11c3QgYmUgd3JpdHRlbiB0bworICAgd2hlcmUgdGhlIG5ldyBTUCBwb2ludHMsIG90aGVyd2lzZSB0aGUgcmVncyB3aWxsIGJlIGluY29ycmVjdCB3aGVuIHRoZQorICAgcHJvY2VzcyBpcyBzdGFydGVkIHVwIGFnYWluLiAgIFdlIGFzc3VtZSB0aGF0IHRoZSBJICYgTCByZWdzIGFyZSB2YWxpZCBhdAorICAgdGhpcyBwb2ludC4gICovCisKK3ZvaWQKK3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyNpZiAwCisgIGludCB3aGF0cmVncyA9IDA7CisKKyAgaWYgKHJlZ25vID09IC0xKQorICAgIHdoYXRyZWdzID0gV0hBVFJFR1NfRkxPQVQgfCBXSEFUUkVHU19HRU4gfCBXSEFUUkVHU19TVEFDSzsKKyAgZWxzZSBpZiAocmVnbm8gPj0gTDBfUkVHTlVNICYmIHJlZ25vIDw9IEk3X1JFR05VTSkKKyAgICB3aGF0cmVncyA9IFdIQVRSRUdTX1NUQUNLOworICBlbHNlIGlmIChyZWdubyA+PSBGUDBfUkVHTlVNICYmIHJlZ25vIDwgRlAwX1JFR05VTSArIDMyKQorICAgIHdoYXRyZWdzID0gV0hBVFJFR1NfRkxPQVQ7CisgIGVsc2UgaWYgKHJlZ25vID09IFNQX1JFR05VTSkKKyAgICB3aGF0cmVncyA9IFdIQVRSRUdTX1NUQUNLIHwgV0hBVFJFR1NfR0VOOworICBlbHNlCisgICAgd2hhdHJlZ3MgPSBXSEFUUkVHU19HRU47CisKKyAgaWYgKHdoYXRyZWdzICYgV0hBVFJFR1NfR0VOKQorICAgIHsKKyAgICAgIHN0cnVjdCBlY29udGV4dCBlYzsJCS8qIGdlbmVyYWwgcmVncyAqLworICAgICAgaW50IHJldHZhbDsKKworICAgICAgZWMudGJyID0gcmVhZF9yZWdpc3RlciAoVEJSX1JFR05VTSk7CisgICAgICBtZW1jcHkgKCZlYy5nMSwgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChHMV9SRUdOVU0pXSwKKwkgICAgICA0ICogUkVHSVNURVJfUkFXX1NJWkUgKEcxX1JFR05VTSkpOworCisgICAgICBlYy5wc3IgPSByZWFkX3JlZ2lzdGVyIChQU19SRUdOVU0pOworICAgICAgZWMueSA9IHJlYWRfcmVnaXN0ZXIgKFlfUkVHTlVNKTsKKyAgICAgIGVjLnBjID0gcmVhZF9yZWdpc3RlciAoUENfUkVHTlVNKTsKKyAgICAgIGVjLm5wYyA9IHJlYWRfcmVnaXN0ZXIgKE5QQ19SRUdOVU0pOworICAgICAgZWMud2ltID0gcmVhZF9yZWdpc3RlciAoV0lNX1JFR05VTSk7CisKKyAgICAgIG1lbWNweSAoZWMubywgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChPMF9SRUdOVU0pXSwKKwkgICAgICA4ICogUkVHSVNURVJfUkFXX1NJWkUgKE8wX1JFR05VTSkpOworCisgICAgICBlcnJubyA9IDA7CisgICAgICByZXR2YWwgPSBwdHJhY2UgKFBUUkFDRV9TRVRSRUdTLCBCVUlMRFBJRCAoaW5mZXJpb3JfcGlkLCBnZW5lcmFsX3RocmVhZCksIChQVFJBQ0VfQVJHM19UWVBFKSAmZWMsCisJCSAgICAgICAwKTsKKyAgICAgIGlmIChlcnJubykKKwlwZXJyb3Jfd2l0aF9uYW1lICgiU3BhcmMgZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzKHB0cmFjZSkiKTsKKyAgICB9CisKKyAgaWYgKHdoYXRyZWdzICYgV0hBVFJFR1NfU1RBQ0spCisgICAgeworICAgICAgaW50IHJlZ29mZnNldDsKKyAgICAgIENPUkVfQUREUiBzcDsKKworICAgICAgc3AgPSByZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pOworCisgICAgICBpZiAocmVnbm8gPT0gLTEgfHwgcmVnbm8gPT0gU1BfUkVHTlVNKQorCXsKKwkgIGlmICghcmVnaXN0ZXJfdmFsaWRbTDBfUkVHTlVNKzVdKQorCSAgICBhYm9ydCgpOworCSAgdGFyZ2V0X3hmZXJfbWVtb3J5IChzcCArIEZSQU1FX1NBVkVEX0kwLAorCQkJICAgICAgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChJMF9SRUdOVU0pXSwKKwkJCSAgICAgIDggKiBSRUdJU1RFUl9SQVdfU0laRSAoSTBfUkVHTlVNKSwgMSk7CisKKwkgIHRhcmdldF94ZmVyX21lbW9yeSAoc3AgKyBGUkFNRV9TQVZFRF9MMCwKKwkJCSAgICAgICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoTDBfUkVHTlVNKV0sCisJCQkgICAgICA4ICogUkVHSVNURVJfUkFXX1NJWkUgKEwwX1JFR05VTSksIDEpOworCX0KKyAgICAgIGVsc2UgaWYgKHJlZ25vID49IEwwX1JFR05VTSAmJiByZWdubyA8PSBJN19SRUdOVU0pCisJeworCSAgaWYgKCFyZWdpc3Rlcl92YWxpZFtyZWdub10pCisJICAgIGFib3J0KCk7CisJICBpZiAocmVnbm8gPj0gTDBfUkVHTlVNICYmIHJlZ25vIDw9IEwwX1JFR05VTSArIDcpCisJICAgIHJlZ29mZnNldCA9IFJFR0lTVEVSX0JZVEUgKHJlZ25vKSAtIFJFR0lTVEVSX0JZVEUgKEwwX1JFR05VTSkKKwkgICAgICArIEZSQU1FX1NBVkVEX0wwOworCSAgZWxzZQorCSAgICByZWdvZmZzZXQgPSBSRUdJU1RFUl9CWVRFIChyZWdubykgLSBSRUdJU1RFUl9CWVRFIChJMF9SRUdOVU0pCisJICAgICAgKyBGUkFNRV9TQVZFRF9JMDsKKwkgIHRhcmdldF94ZmVyX21lbW9yeSAoc3AgKyByZWdvZmZzZXQsICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnbm8pXSwKKwkJCSAgICAgIFJFR0lTVEVSX1JBV19TSVpFIChyZWdubyksIDEpOworCX0KKyAgICB9CisKKyAgaWYgKHdoYXRyZWdzICYgV0hBVFJFR1NfRkxPQVQpCisgICAgeworICAgICAgc3RydWN0IGZjb250ZXh0IGZjOwkJLyogZnAgcmVncyAqLworICAgICAgaW50IHJldHZhbDsKKworLyogV2UgcmVhZCBmY29udGV4dCBmaXJzdCBzbyB0aGF0IHdlIGNhbiBnZXQgZ29vZCB2YWx1ZXMgZm9yIGZxX3QuLi4gKi8KKyAgICAgIGVycm5vID0gMDsKKyAgICAgIHJldHZhbCA9IHB0cmFjZSAoUFRSQUNFX0dFVEZQUkVHUywgQlVJTERQSUQgKGluZmVyaW9yX3BpZCwgZ2VuZXJhbF90aHJlYWQpLCAoUFRSQUNFX0FSRzNfVFlQRSkgJmZjLAorCQkgICAgICAgMCk7CisgICAgICBpZiAoZXJybm8pCisJcGVycm9yX3dpdGhfbmFtZSAoIlNwYXJjIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyhwdHJhY2UpIik7CisgIAorICAgICAgbWVtY3B5IChmYy5mLmZyZWdzLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pXSwKKwkgICAgICAzMiAqIFJFR0lTVEVSX1JBV19TSVpFIChGUDBfUkVHTlVNKSk7CisKKyAgICAgIGZjLmZzciA9IHJlYWRfcmVnaXN0ZXIgKEZQU19SRUdOVU0pOworCisgICAgICBlcnJubyA9IDA7CisgICAgICByZXR2YWwgPSBwdHJhY2UgKFBUUkFDRV9TRVRGUFJFR1MsIEJVSUxEUElEIChpbmZlcmlvcl9waWQsIGdlbmVyYWxfdGhyZWFkKSwgKFBUUkFDRV9BUkczX1RZUEUpICZmYywKKwkJICAgICAgIDApOworICAgICAgaWYgKGVycm5vKQorCXBlcnJvcl93aXRoX25hbWUgKCJTcGFyYyBmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMocHRyYWNlKSIpOworICAgICAgfQorI2VuZGlmCit9CisjZW5kaWYgLyogU1BBUkMgKi8KKworI2lmbmRlZiBTUEFSQworCisvKiBSZXR1cm4gdGhlIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHBlci10aHJlYWQgZGF0YSB0byB0aGUKKyAgIHNhdmVkIGNvbnRleHQgYmxvY2suICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworbHlueF9yZWdpc3RlcnNfYWRkcigpCit7CisgIENPUkVfQUREUiBzdGJsb2NrOworICBpbnQgZWNwb2ZmID0gb2Zmc2V0b2Yoc3RfdCwgZWNwKTsKKyAgQ09SRV9BRERSIGVjcDsKKworICBlcnJubyA9IDA7CisgIHN0YmxvY2sgPSAoQ09SRV9BRERSKSBwdHJhY2UgKFBUUkFDRV9USFJFQURVU0VSLCBCVUlMRFBJRCAoaW5mZXJpb3JfcGlkLCBnZW5lcmFsX3RocmVhZCksCisJCQkJKFBUUkFDRV9BUkczX1RZUEUpMCwgMCk7CisgIGlmIChlcnJubykKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgiUFRSQUNFX1RIUkVBRFVTRVIiKTsKKworICBlY3AgPSAoQ09SRV9BRERSKSBwdHJhY2UgKFBUUkFDRV9QRUVLVEhSRUFELCBCVUlMRFBJRCAoaW5mZXJpb3JfcGlkLCBnZW5lcmFsX3RocmVhZCksCisJCQkgICAgKFBUUkFDRV9BUkczX1RZUEUpZWNwb2ZmLCAwKTsKKyAgaWYgKGVycm5vKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJseW54X3JlZ2lzdGVyc19hZGRyKFBUUkFDRV9QRUVLVEhSRUFEKSIpOworCisgIHJldHVybiBlY3AgLSBzdGJsb2NrOworfQorCisvKiBGZXRjaCBvbmUgb3IgbW9yZSByZWdpc3RlcnMgZnJvbSB0aGUgaW5mZXJpb3IuICBSRUdOTyA9PSAtMSB0byBnZXQKKyAgIHRoZW0gYWxsLiAgV2UgYWN0dWFsbHkgZmV0Y2ggbW9yZSB0aGFuIHJlcXVlc3RlZCwgd2hlbiBjb252ZW5pZW50LAorICAgbWFya2luZyB0aGVtIGFzIHZhbGlkIHNvIHdlIHdvbid0IGZldGNoIHRoZW0gYWdhaW4uICAqLworCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKGlnbm9yZWQpCisgICAgIGludCBpZ25vcmVkOworeworICBpbnQgcmVnbm87CisgIHVuc2lnbmVkIGxvbmcgcmVnOworICB1bnNpZ25lZCBsb25nIGVjcDsKKworICBlY3AgPSBseW54X3JlZ2lzdGVyc19hZGRyKCk7CisKKyAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgTlVNX1JFR1M7IHJlZ25vKyspCisgICAgeworICAgICAgaW50IHB0cmFjZV9mdW4gPSBQVFJBQ0VfUEVFS1RIUkVBRDsKKworI2lmZGVmIFBUUkFDRV9QRUVLVVNQCisgICAgICBwdHJhY2VfZnVuID0gcmVnbm8gPT0gU1BfUkVHTlVNID8gUFRSQUNFX1BFRUtVU1AgOiBQVFJBQ0VfUEVFS1RIUkVBRDsKKyNlbmRpZgorCisgICAgICBlcnJubyA9IDA7CisgICAgICByZWcgPSBwdHJhY2UgKHB0cmFjZV9mdW4sIEJVSUxEUElEIChpbmZlcmlvcl9waWQsIGdlbmVyYWxfdGhyZWFkKSwKKwkJICAgIChQVFJBQ0VfQVJHM19UWVBFKSAoZWNwICsgcmVnbWFwW3JlZ25vXSksIDApOworICAgICAgaWYgKGVycm5vKQorCXBlcnJvcl93aXRoX25hbWUgKCJmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMoUFRSQUNFX1BFRUtUSFJFQUQpIik7CisgIAorICAgICAgKih1bnNpZ25lZCBsb25nICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdubyldID0gcmVnOworICAgIH0KK30KKworLyogU3RvcmUgb3VyIHJlZ2lzdGVyIHZhbHVlcyBiYWNrIGludG8gdGhlIGluZmVyaW9yLgorICAgSWYgUkVHTk8gaXMgLTEsIGRvIHRoaXMgZm9yIGFsbCByZWdpc3RlcnMuCisgICBPdGhlcndpc2UsIFJFR05PIHNwZWNpZmllcyB3aGljaCByZWdpc3RlciAoc28gd2UgY2FuIHNhdmUgdGltZSkuICAqLworCit2b2lkCitzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKGlnbm9yZWQpCisgICAgIGludCBpZ25vcmVkOworeworICBpbnQgcmVnbm87CisgIHVuc2lnbmVkIGxvbmcgcmVnOworICB1bnNpZ25lZCBsb25nIGVjcDsKKworICBlY3AgPSBseW54X3JlZ2lzdGVyc19hZGRyKCk7CisKKyAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgTlVNX1JFR1M7IHJlZ25vKyspCisgICAgeworICAgICAgaW50IHB0cmFjZV9mdW4gPSBQVFJBQ0VfUE9LRVVTRVI7CisKKyNpZmRlZiBQVFJBQ0VfUE9LRVVTUAorICAgICAgcHRyYWNlX2Z1biA9IHJlZ25vID09IFNQX1JFR05VTSA/IFBUUkFDRV9QT0tFVVNQIDogUFRSQUNFX1BPS0VVU0VSOworI2VuZGlmCisKKyAgICAgIHJlZyA9ICoodW5zaWduZWQgbG9uZyAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnbm8pXTsKKworICAgICAgZXJybm8gPSAwOworICAgICAgcHRyYWNlIChwdHJhY2VfZnVuLCBCVUlMRFBJRCAoaW5mZXJpb3JfcGlkLCBnZW5lcmFsX3RocmVhZCksCisJICAgICAgKFBUUkFDRV9BUkczX1RZUEUpIChlY3AgKyByZWdtYXBbcmVnbm9dKSwgcmVnKTsKKyAgICAgIGlmIChlcnJubykKKwlwZXJyb3Jfd2l0aF9uYW1lICgiUFRSQUNFX1BPS0VVU0VSIik7CisgICAgfQorfQorCisjZW5kaWYgLyogISBTUEFSQyAqLworCisvKiBOT1RFISBJIHRyaWVkIHVzaW5nIFBUUkFDRV9SRUFEREFUQSwgZXRjLiwgdG8gcmVhZCBhbmQgd3JpdGUgbWVtb3J5CisgICBpbiB0aGUgTkVXX1NVTl9QVFJBQ0UgY2FzZS4KKyAgIEl0IG91Z2h0IHRvIGJlIHN0cmFpZ2h0Zm9yd2FyZC4gIEJ1dCBpdCBhcHBlYXJzIHRoYXQgd3JpdGluZyBkaWQKKyAgIG5vdCB3cml0ZSB0aGUgZGF0YSB0aGF0IEkgc3BlY2lmaWVkLiAgSSBjYW5ub3QgdW5kZXJzdGFuZCB3aGVyZQorICAgaXQgZ290IHRoZSBkYXRhIHRoYXQgaXQgYWN0dWFsbHkgZGlkIHdyaXRlLiAgKi8KKworLyogQ29weSBMRU4gYnl0ZXMgZnJvbSBpbmZlcmlvcidzIG1lbW9yeSBzdGFydGluZyBhdCBNRU1BRERSCisgICB0byBkZWJ1Z2dlciBtZW1vcnkgc3RhcnRpbmcgYXQgTVlBRERSLiAgKi8KKwordm9pZAorcmVhZF9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICByZWdpc3RlciBpbnQgaTsKKyAgLyogUm91bmQgc3RhcnRpbmcgYWRkcmVzcyBkb3duIHRvIGxvbmd3b3JkIGJvdW5kYXJ5LiAgKi8KKyAgcmVnaXN0ZXIgQ09SRV9BRERSIGFkZHIgPSBtZW1hZGRyICYgLXNpemVvZiAoaW50KTsKKyAgLyogUm91bmQgZW5kaW5nIGFkZHJlc3MgdXA7IGdldCBudW1iZXIgb2YgbG9uZ3dvcmRzIHRoYXQgbWFrZXMuICAqLworICByZWdpc3RlciBpbnQgY291bnQKKyAgPSAoKChtZW1hZGRyICsgbGVuKSAtIGFkZHIpICsgc2l6ZW9mIChpbnQpIC0gMSkgLyBzaXplb2YgKGludCk7CisgIC8qIEFsbG9jYXRlIGJ1ZmZlciBvZiB0aGF0IG1hbnkgbG9uZ3dvcmRzLiAgKi8KKyAgcmVnaXN0ZXIgaW50ICpidWZmZXIgPSAoaW50ICopIGFsbG9jYSAoY291bnQgKiBzaXplb2YgKGludCkpOworCisgIC8qIFJlYWQgYWxsIHRoZSBsb25nd29yZHMgKi8KKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIGFkZHIgKz0gc2l6ZW9mIChpbnQpKQorICAgIHsKKyAgICAgIGJ1ZmZlcltpXSA9IHB0cmFjZSAoUFRSQUNFX1BFRUtURVhULCBCVUlMRFBJRCAoaW5mZXJpb3JfcGlkLCBnZW5lcmFsX3RocmVhZCksIGFkZHIsIDApOworICAgIH0KKworICAvKiBDb3B5IGFwcHJvcHJpYXRlIGJ5dGVzIG91dCBvZiB0aGUgYnVmZmVyLiAgKi8KKyAgbWVtY3B5IChteWFkZHIsIChjaGFyICopIGJ1ZmZlciArIChtZW1hZGRyICYgKHNpemVvZiAoaW50KSAtIDEpKSwgbGVuKTsKK30KKworLyogQ29weSBMRU4gYnl0ZXMgb2YgZGF0YSBmcm9tIGRlYnVnZ2VyIG1lbW9yeSBhdCBNWUFERFIKKyAgIHRvIGluZmVyaW9yJ3MgbWVtb3J5IGF0IE1FTUFERFIuCisgICBPbiBmYWlsdXJlIChjYW5ub3Qgd3JpdGUgdGhlIGluZmVyaW9yKQorICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgZXJybm8uICAqLworCitpbnQKK3dyaXRlX2luZmVyaW9yX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47Cit7CisgIHJlZ2lzdGVyIGludCBpOworICAvKiBSb3VuZCBzdGFydGluZyBhZGRyZXNzIGRvd24gdG8gbG9uZ3dvcmQgYm91bmRhcnkuICAqLworICByZWdpc3RlciBDT1JFX0FERFIgYWRkciA9IG1lbWFkZHIgJiAtc2l6ZW9mIChpbnQpOworICAvKiBSb3VuZCBlbmRpbmcgYWRkcmVzcyB1cDsgZ2V0IG51bWJlciBvZiBsb25nd29yZHMgdGhhdCBtYWtlcy4gICovCisgIHJlZ2lzdGVyIGludCBjb3VudAorICA9ICgoKG1lbWFkZHIgKyBsZW4pIC0gYWRkcikgKyBzaXplb2YgKGludCkgLSAxKSAvIHNpemVvZiAoaW50KTsKKyAgLyogQWxsb2NhdGUgYnVmZmVyIG9mIHRoYXQgbWFueSBsb25nd29yZHMuICAqLworICByZWdpc3RlciBpbnQgKmJ1ZmZlciA9IChpbnQgKikgYWxsb2NhIChjb3VudCAqIHNpemVvZiAoaW50KSk7CisgIGV4dGVybiBpbnQgZXJybm87CisKKyAgLyogRmlsbCBzdGFydCBhbmQgZW5kIGV4dHJhIGJ5dGVzIG9mIGJ1ZmZlciB3aXRoIGV4aXN0aW5nIG1lbW9yeSBkYXRhLiAgKi8KKworICBidWZmZXJbMF0gPSBwdHJhY2UgKFBUUkFDRV9QRUVLVEVYVCwgQlVJTERQSUQgKGluZmVyaW9yX3BpZCwgZ2VuZXJhbF90aHJlYWQpLCBhZGRyLCAwKTsKKworICBpZiAoY291bnQgPiAxKQorICAgIHsKKyAgICAgIGJ1ZmZlcltjb3VudCAtIDFdCisJPSBwdHJhY2UgKFBUUkFDRV9QRUVLVEVYVCwgQlVJTERQSUQgKGluZmVyaW9yX3BpZCwgZ2VuZXJhbF90aHJlYWQpLAorCQkgIGFkZHIgKyAoY291bnQgLSAxKSAqIHNpemVvZiAoaW50KSwgMCk7CisgICAgfQorCisgIC8qIENvcHkgZGF0YSB0byBiZSB3cml0dGVuIG92ZXIgY29ycmVzcG9uZGluZyBwYXJ0IG9mIGJ1ZmZlciAqLworCisgIG1lbWNweSAoKGNoYXIgKikgYnVmZmVyICsgKG1lbWFkZHIgJiAoc2l6ZW9mIChpbnQpIC0gMSkpLCBteWFkZHIsIGxlbik7CisKKyAgLyogV3JpdGUgdGhlIGVudGlyZSBidWZmZXIuICAqLworCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBhZGRyICs9IHNpemVvZiAoaW50KSkKKyAgICB7CisgICAgICB3aGlsZSAoMSkKKwl7CisJICBlcnJubyA9IDA7CisJICBwdHJhY2UgKFBUUkFDRV9QT0tFVEVYVCwgQlVJTERQSUQgKGluZmVyaW9yX3BpZCwgZ2VuZXJhbF90aHJlYWQpLCBhZGRyLCBidWZmZXJbaV0pOworCSAgaWYgKGVycm5vKQorCSAgICB7CisJICAgICAgZnByaW50ZihzdGRlcnIsICJcCitwdHJhY2UgKFBUUkFDRV9QT0tFVEVYVCk6IGVycm5vPSVkLCBwaWQ9MHgleCwgYWRkcj0weCV4LCBidWZmZXJbaV0gPSAweCV4XG4iLAorCQkgICAgICBlcnJubywgQlVJTERQSUQgKGluZmVyaW9yX3BpZCwgZ2VuZXJhbF90aHJlYWQpLAorCQkgICAgICBhZGRyLCBidWZmZXJbaV0pOworCSAgICAgIGZwcmludGYoc3RkZXJyLCAiU2xlZXBpbmcgZm9yIDEgc2Vjb25kXG4iKTsKKwkgICAgICBzbGVlcCgxKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBicmVhazsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2dkYnNlcnZlci9sb3ctc2ltLmMgYi9nZGIvZ2Ric2VydmVyL2xvdy1zaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWQ2ZTkxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2dkYnNlcnZlci9sb3ctc2ltLmMKQEAgLTAsMCArMSwyODkgQEAKKy8qIExvdyBsZXZlbCBpbnRlcmZhY2UgdG8gc2ltdWxhdG9ycywgZm9yIHRoZSByZW1vdGUgc2VydmVyIGZvciBHREIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzZXJ2ZXIuaCIKKyNpbmNsdWRlICJjYWxsYmFjay5oIiAgIC8qIEdEQiBzaW11bGF0b3IgY2FsbGJhY2sgaW50ZXJmYWNlICovCisjaW5jbHVkZSAicmVtb3RlLXNpbS5oIiAvKiBHREIgc2ltdWxhdG9yIGludGVyZmFjZSAqLworCitleHRlcm4gaW50IHJlbW90ZV9kZWJ1ZzsKKworZXh0ZXJuIGhvc3RfY2FsbGJhY2sgZGVmYXVsdF9jYWxsYmFjazsJLyogaW4gc2ltL2NvbW1vbi9jYWxsYmFjay5jICovCisKK2NoYXIgcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEVTXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCkpOworCitpbnQgdGFyZ2V0X2J5dGVfb3JkZXI7CS8qIHVzZWQgYnkgc2ltdWxhdG9yICovCisKKy8qIFdlIHJlY29yZCB0aGUgcmVzdWx0IG9mIHNpbV9vcGVuIHNvIHdlIGNhbiBwYXNzIGl0CisgICBiYWNrIHRvIHRoZSBvdGhlciBzaW1fZm9vIHJvdXRpbmVzLiAgKi8KK3N0YXRpYyBTSU1fREVTQyBnZGJzaW1fZGVzYyA9IDA7CisKKy8qIFRoaXMgdmVyc2lvbiBvZiAibG9hZCIgc2hvdWxkIGJlIHVzYWJsZSBmb3IgYW55IHNpbXVsYXRvciB0aGF0CisgICBkb2VzIG5vdCBzdXBwb3J0IGxvYWRpbmcgaXRzZWxmLiAgKi8KKworc3RhdGljIHZvaWQKK2dlbmVyaWNfbG9hZCAobG9hZGZpbGVfYmZkKQorICAgIGJmZCAqbG9hZGZpbGVfYmZkOworeworICBhc2VjdGlvbiAqczsKKworICBmb3IgKHMgPSBsb2FkZmlsZV9iZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkgCisgICAgeworICAgICAgaWYgKHMtPmZsYWdzICYgU0VDX0xPQUQpIAorCXsKKwkgIGJmZF9zaXplX3R5cGUgc2l6ZTsKKworCSAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAocyk7CisJICBpZiAoc2l6ZSA+IDApCisJICAgIHsKKwkgICAgICBjaGFyICpidWZmZXI7CisJICAgICAgYmZkX3ZtYSBsbWE7CS8qIHVzZSBsb2FkIGFkZHJlc3MsIG5vdCB2aXJ0dWFsIGFkZHJlc3MgKi8KKworCSAgICAgIGJ1ZmZlciA9IHhtYWxsb2MgKHNpemUpOworCSAgICAgIGxtYSA9IHMtPmxtYTsKKworCSAgICAgIC8qIElzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gIEkgZ3Vlc3MgaXQgZ2l2ZXMgdGhlIHVzZXIgc29tZXRoaW5nCisJCSB0byBsb29rIGF0IGR1cmluZyBhIGxvbmcgZG93bmxvYWQuICAqLworCSAgICAgIHByaW50ZiAoIkxvYWRpbmcgc2VjdGlvbiAlcywgc2l6ZSAweCVseCBsbWEgMHglbHhcbiIsCisJCSAgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChsb2FkZmlsZV9iZmQsIHMpLAorCQkgICAgICAodW5zaWduZWQgbG9uZykgc2l6ZSwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGxtYSk7IC8qIGNob3BzIGhpZ2ggMzIgYml0cy4gIEZJWE1FISEgKi8KKworCSAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAobG9hZGZpbGVfYmZkLCBzLCBidWZmZXIsIDAsIHNpemUpOworCisJICAgICAgd3JpdGVfaW5mZXJpb3JfbWVtb3J5IChsbWEsIGJ1ZmZlciwgc2l6ZSk7CisJICAgICAgZnJlZSAoYnVmZmVyKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcHJpbnRmICgiU3RhcnQgYWRkcmVzcyAweCVseFxuIiwKKwkgICh1bnNpZ25lZCBsb25nKWxvYWRmaWxlX2JmZC0+c3RhcnRfYWRkcmVzcyk7CisKKyAgLyogV2Ugd2VyZSBkb2luZyB0aGlzIGluIHJlbW90ZS1taXBzLmMsIEkgc3VzcGVjdCBpdCBpcyByaWdodAorICAgICBmb3Igb3RoZXIgdGFyZ2V0cyB0b28uICAqLworICAvKiB3cml0ZV9wYyAobG9hZGZpbGVfYmZkLT5zdGFydF9hZGRyZXNzKTsgKi8JLyogRklYTUUhISAqLworfQorCitpbnQKK2NyZWF0ZV9pbmZlcmlvciAocHJvZ3JhbSwgYXJndikKKyAgICAgY2hhciAqcHJvZ3JhbTsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIGJmZCAqYWJmZDsKKyAgaW50IHBpZCA9IDA7CisjaWZkZWYgVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRQorICBjaGFyICoqbmV3X2FyZ3Y7CisgIGludCBuYXJnczsKKyNlbmRpZgorCisgIGFiZmQgPSBiZmRfb3BlbnIgKHByb2dyYW0sIDApOworICBpZiAoIWFiZmQpIAorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgImdkYnNlcnZlcjogY2FuJ3Qgb3BlbiAlczogJXNcbiIsIAorCSAgICAgICBwcm9ncmFtLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJnZGJzZXJ2ZXI6IHVua25vd24gbG9hZCBmb3JtYXQgZm9yICVzOiAlc1xuIiwKKwkgICAgICAgcHJvZ3JhbSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisjaWZkZWYgVEFSR0VUX0JZVEVfT1JERVJfU0VMRUNUQUJMRQorICAvKiBBZGQgIi1FIGJpZyIgb3IgIi1FIGxpdHRsZSIgdG8gdGhlIGFyZ3VtZW50IGxpc3QgZGVwZW5kaW5nIG9uIHRoZQorICAgICBlbmRpYW5uZXNzIG9mIHRoZSBwcm9ncmFtIHRvIGJlIGxvYWRlZC4gICovCisgIGZvciAobmFyZ3MgPSAwOyBhcmd2W25hcmdzXSAhPSBOVUxMOyBuYXJncysrKQkJLyogY291bnQgdGhlIGFyZ3MgKi8KKyAgICA7CisgIG5ld19hcmd2ID0gYWxsb2NhIChzaXplb2YgKGNoYXIgKikgKiAobmFyZ3MgKyAzKSk7CS8qIGFsbG9jYXRlIG5ldyBhcmdzICovCisgIGZvciAobmFyZ3MgPSAwOyBhcmd2W25hcmdzXSAhPSBOVUxMOyBuYXJncysrKQkJLyogY29weSBvbGQgdG8gbmV3ICovCisgICAgbmV3X2FyZ3ZbbmFyZ3NdID0gYXJndltuYXJnc107CisgIG5ld19hcmd2W25hcmdzXSA9ICItRSI7CisgIG5ld19hcmd2W25hcmdzICsgMV0gPSBiZmRfYmlnX2VuZGlhbiAoYWJmZCkgPyAiYmlnIiA6ICJsaXR0bGUiOworICBuZXdfYXJndltuYXJncyArIDJdID0gTlVMTDsKKyAgYXJndiA9IG5ld19hcmd2OworI2VuZGlmCisKKyAgLyogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBzaW11bGF0b3IuICAqLworICBkZWZhdWx0X2NhbGxiYWNrLmluaXQgKCZkZWZhdWx0X2NhbGxiYWNrKTsKKyAgZ2Ric2ltX2Rlc2MgPSBzaW1fb3BlbiAoU0lNX09QRU5fU1RBTkRBTE9ORSwgJmRlZmF1bHRfY2FsbGJhY2ssIGFiZmQsIGFyZ3YpOworICBpZiAoZ2Ric2ltX2Rlc2MgPT0gMCkKKyAgICBleGl0ICgxKTsKKworICAvKiBMb2FkIHRoZSBwcm9ncmFtIGludG8gdGhlIHNpbXVsYXRvci4gICovCisgIGlmIChhYmZkKQorICAgIGlmIChzaW1fbG9hZCAoZ2Ric2ltX2Rlc2MsIHByb2dyYW0sIE5VTEwsIDApID09IFNJTV9SQ19GQUlMKQorICAgICAgZ2VuZXJpY19sb2FkIChhYmZkKTsKKworICAvKiBDcmVhdGUgYW4gaW5mZXJpb3IgcHJvY2VzcyBpbiB0aGUgc2ltdWxhdG9yLiAgVGhpcyBpbml0aWFsaXplcyBTUC4gICovCisgIHNpbV9jcmVhdGVfaW5mZXJpb3IgKGdkYnNpbV9kZXNjLCBhYmZkLCBhcmd2LCAvKiBlbnYgKi8gTlVMTCk7CisgIHNpbV9yZXN1bWUgKGdkYnNpbV9kZXNjLCAxLCAwKTsJLyogZXhlY3V0ZSBvbmUgaW5zdHIgKi8KKyAgcmV0dXJuIHBpZDsKK30KKworLyogS2lsbCB0aGUgaW5mZXJpb3IgcHJvY2Vzcy4gIE1ha2UgdXMgaGF2ZSBubyBpbmZlcmlvci4gICovCisKK3ZvaWQKK2tpbGxfaW5mZXJpb3IgKCkKK3sKKyAgc2ltX2Nsb3NlIChnZGJzaW1fZGVzYywgMCk7CisgIGRlZmF1bHRfY2FsbGJhY2suc2h1dGRvd24gKCZkZWZhdWx0X2NhbGxiYWNrKTsKK30KKworLyogRmV0Y2ggb25lIHJlZ2lzdGVyLiAgKi8KKworc3RhdGljIHZvaWQKK2ZldGNoX3JlZ2lzdGVyIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBzaW1fZmV0Y2hfcmVnaXN0ZXIgKGdkYnNpbV9kZXNjLCByZWdubywgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdubyldLAorCQkgICAgICBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pKTsKK30KKworLyogRmV0Y2ggYWxsIHJlZ2lzdGVycywgb3IganVzdCBvbmUsIGZyb20gdGhlIGNoaWxkIHByb2Nlc3MuICAqLworCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGlmIChyZWdubyA9PSAtMSB8fCByZWdubyA9PSAwKQorICAgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IE5VTV9SRUdTLyotTlVNX0ZSRUdTKi87IHJlZ25vKyspCisgICAgICBmZXRjaF9yZWdpc3RlciAocmVnbm8pOworICBlbHNlCisgICAgZmV0Y2hfcmVnaXN0ZXIgKHJlZ25vKTsKK30KKworLyogU3RvcmUgb3VyIHJlZ2lzdGVyIHZhbHVlcyBiYWNrIGludG8gdGhlIGluZmVyaW9yLgorICAgSWYgUkVHTk8gaXMgLTEsIGRvIHRoaXMgZm9yIGFsbCByZWdpc3RlcnMuCisgICBPdGhlcndpc2UsIFJFR05PIHNwZWNpZmllcyB3aGljaCByZWdpc3RlciAoc28gd2UgY2FuIHNhdmUgdGltZSkuICAqLworCit2b2lkCitzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGlmIChyZWdubyAgPT0gLTEpIAorICAgIHsKKyAgICAgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IE5VTV9SRUdTOyByZWdubysrKQorCXN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pOworICAgIH0KKyAgZWxzZQorICAgIHNpbV9zdG9yZV9yZWdpc3RlciAoZ2Ric2ltX2Rlc2MsIHJlZ25vLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ25vKV0sCisJCQlSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pKTsKK30KKworLyogUmV0dXJuIG5vbnplcm8gaWYgdGhlIGdpdmVuIHRocmVhZCBpcyBzdGlsbCBhbGl2ZS4gICovCitpbnQKK215dGhyZWFkX2FsaXZlIChwaWQpCisgICAgIGludCBwaWQ7Cit7CisgIHJldHVybiAxOworfQorCisvKiBXYWl0IGZvciBwcm9jZXNzLCByZXR1cm5zIHN0YXR1cyAqLworCit1bnNpZ25lZCBjaGFyCitteXdhaXQgKHN0YXR1cykKKyAgICAgY2hhciAqc3RhdHVzOworeworICBpbnQgc2lncmM7CisgIGVudW0gc2ltX3N0b3AgcmVhc29uOworCisgIHNpbV9zdG9wX3JlYXNvbiAoZ2Ric2ltX2Rlc2MsICZyZWFzb24sICZzaWdyYyk7CisgIHN3aXRjaCAocmVhc29uKQorICAgIHsKKyAgICBjYXNlIHNpbV9leGl0ZWQ6CisgICAgICBpZiAocmVtb3RlX2RlYnVnKQorCXByaW50ZiAoIlxuQ2hpbGQgZXhpdGVkIHdpdGggcmV0Y29kZSA9ICV4IFxuIiwgc2lncmMpOworICAgICAgKnN0YXR1cyA9ICdXJzsKKyAgICAgIHJldHVybiBzaWdyYzsKKworI2lmIDAKKyAgICBjYXNlIHNpbV9zdG9wcGVkOgorICAgICAgaWYgKHJlbW90ZV9kZWJ1ZykKKwlwcmludGYgKCJcbkNoaWxkIHRlcm1pbmF0ZWQgd2l0aCBzaWduYWwgPSAleCBcbiIsIHNpZ3JjKTsKKyAgICAgICpzdGF0dXMgPSAnWCc7CisgICAgICByZXR1cm4gc2lncmM7CisjZW5kaWYKKworICAgIGRlZmF1bHQ6ICAgLyogc2hvdWxkIHRoaXMgYmUgc2ltX3NpZ25hbGxlZCBvciBzaW1fc3RvcHBlZD8gIEZJWE1FISEgKi8KKyAgICAgIGlmIChyZW1vdGVfZGVidWcpCisJcHJpbnRmICgiXG5DaGlsZCByZWNlaXZlZCBzaWduYWwgPSAleCBcbiIsIHNpZ3JjKTsKKyAgICAgIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoMCk7CisgICAgICAqc3RhdHVzID0gJ1QnOworICAgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKSBzaWdyYzsKKyAgICB9Cit9CisKKy8qIFJlc3VtZSBleGVjdXRpb24gb2YgdGhlIGluZmVyaW9yIHByb2Nlc3MuCisgICBJZiBTVEVQIGlzIG5vbnplcm8sIHNpbmdsZS1zdGVwIGl0LgorICAgSWYgU0lHTkFMIGlzIG5vbnplcm8sIGdpdmUgaXQgdGhhdCBzaWduYWwuICAqLworCit2b2lkCitteXJlc3VtZSAoc3RlcCwgc2lnbm8pCisgICAgIGludCBzdGVwOworICAgICBpbnQgc2lnbm87Cit7CisgIC8qIFNob3VsZCBiZSB1c2luZyB0YXJnZXRfc2lnbmFsX3RvX2hvc3QoKSBvciBzaWduYWwgbnVtYmVycyBpbiB0YXJnZXQuaAorICAgICB0byBjb252ZXJ0IEdEQiBzaWduYWwgbnVtYmVyIHRvIHRhcmdldCBzaWduYWwgbnVtYmVyLiAgKi8KKyAgc2ltX3Jlc3VtZSAoZ2Ric2ltX2Rlc2MsIHN0ZXAsIHNpZ25vKTsKK30KKworLyogQ29weSBMRU4gYnl0ZXMgZnJvbSBpbmZlcmlvcidzIG1lbW9yeSBzdGFydGluZyBhdCBNRU1BRERSCisgICB0byBkZWJ1Z2dlciBtZW1vcnkgc3RhcnRpbmcgYXQgTVlBRERSLiAgKi8KKwordm9pZAorcmVhZF9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICBzaW1fcmVhZCAoZ2Ric2ltX2Rlc2MsIG1lbWFkZHIsIG15YWRkciwgbGVuKTsKK30KKworLyogQ29weSBMRU4gYnl0ZXMgb2YgZGF0YSBmcm9tIGRlYnVnZ2VyIG1lbW9yeSBhdCBNWUFERFIKKyAgIHRvIGluZmVyaW9yJ3MgbWVtb3J5IGF0IE1FTUFERFIuCisgICBPbiBmYWlsdXJlIChjYW5ub3Qgd3JpdGUgdGhlIGluZmVyaW9yKQorICAgcmV0dXJucyB0aGUgdmFsdWUgb2YgZXJybm8uICAqLworCitpbnQKK3dyaXRlX2luZmVyaW9yX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47Cit7CisgIHNpbV93cml0ZSAoZ2Ric2ltX2Rlc2MsIG1lbWFkZHIsIG15YWRkciwgbGVuKTsgIC8qIHNob3VsZCBjaGVjayBmb3IgZXJyb3IuICBGSVhNRSEhICovCisgIHJldHVybiAwOworfQorCisjaWYgMAordm9pZAoraW5pdGlhbGl6ZSAoKQoreworICBpbmZlcmlvcl9waWQgPSAwOworfQorCitpbnQKK2hhdmVfaW5mZXJpb3JfcCAoKQoreworICByZXR1cm4gaW5mZXJpb3JfcGlkICE9IDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2dkYi9nZGJzZXJ2ZXIvbG93LXNwYXJjLmMgYi9nZGIvZ2Ric2VydmVyL2xvdy1zcGFyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZmZhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZ2Ric2VydmVyL2xvdy1zcGFyYy5jCkBAIC0wLDAgKzEsMzM0IEBACisvKiBMb3cgbGV2ZWwgaW50ZXJmYWNlIHRvIHB0cmFjZSwgZm9yIHRoZSByZW1vdGUgc2VydmVyIGZvciBHREIuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNpbmNsdWRlICJpbml0aWFsaXplLmgiCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSA8c3lzL3VzZXIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzZ3R0eS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKy8qKioqKioqKioqKioqKipCZWdpbiBNWSBkZWZzKioqKioqKioqKioqKioqKioqKioqLworaW50IHF1aXRfZmxhZyA9IDA7CitjaGFyIHJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFU107CisKKy8qIEluZGV4IHdpdGhpbiBgcmVnaXN0ZXJzJyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3BhY2UgZm9yCisgICByZWdpc3RlciBOLiAgKi8KKworCitjaGFyIGJ1ZjJbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKy8qKioqKioqKioqKioqKipFbmQgTVkgZGVmcyoqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KKyNpbmNsdWRlIDxzeXMvcmVnLmg+CisKK2V4dGVybiBpbnQgc3lzX25lcnI7CitleHRlcm4gY2hhciAqKnN5c19lcnJsaXN0OworZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworZXh0ZXJuIGludCBlcnJubzsKK2V4dGVybiBpbnQgaW5mZXJpb3JfcGlkOwordm9pZCBxdWl0ICgpLCBwZXJyb3Jfd2l0aF9uYW1lICgpOworaW50IHF1ZXJ5ICgpOworCisvKiBTdGFydCBhbiBpbmZlcmlvciBwcm9jZXNzIGFuZCByZXR1cm5zIGl0cyBwaWQuCisgICBBTExBUkdTIGlzIGEgdmVjdG9yIG9mIHByb2dyYW0tbmFtZSBhbmQgYXJncy4KKyAgIEVOViBpcyB0aGUgZW52aXJvbm1lbnQgdmVjdG9yIHRvIHBhc3MuICAqLworCitpbnQKK2NyZWF0ZV9pbmZlcmlvciAocHJvZ3JhbSwgYWxsYXJncykKKyAgICAgY2hhciAqcHJvZ3JhbTsKKyAgICAgY2hhciAqKmFsbGFyZ3M7Cit7CisgIGludCBwaWQ7CisKKyAgcGlkID0gZm9yayAoKTsKKyAgaWYgKHBpZCA8IDApCisgICAgcGVycm9yX3dpdGhfbmFtZSAoImZvcmsiKTsKKworICBpZiAocGlkID09IDApCisgICAgeworICAgICAgcHRyYWNlIChQVFJBQ0VfVFJBQ0VNRSk7CisKKyAgICAgIGV4ZWN2IChwcm9ncmFtLCBhbGxhcmdzKTsKKworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ2Fubm90IGV4ZWMgJXM6ICVzLlxuIiwgcHJvZ3JhbSwKKwkgICAgICAgZXJybm8gPCBzeXNfbmVyciA/IHN5c19lcnJsaXN0W2Vycm5vXSA6ICJ1bmtub3duIGVycm9yIik7CisgICAgICBmZmx1c2ggKHN0ZGVycik7CisgICAgICBfZXhpdCAoMDE3Nyk7CisgICAgfQorCisgIHJldHVybiBwaWQ7Cit9CisKKy8qIEtpbGwgdGhlIGluZmVyaW9yIHByb2Nlc3MuICBNYWtlIHVzIGhhdmUgbm8gaW5mZXJpb3IuICAqLworCit2b2lkCitraWxsX2luZmVyaW9yICgpCit7CisgIGlmIChpbmZlcmlvcl9waWQgPT0gMCkKKyAgICByZXR1cm47CisgIHB0cmFjZSAoOCwgaW5mZXJpb3JfcGlkLCAwLCAwKTsKKyAgd2FpdCAoMCk7CisgIC8qKioqKioqKioqKioqaW5mZXJpb3JfZGllZCAoKTsqKioqVksqKioqKioqKioqKioqKi8KK30KKworLyogUmV0dXJuIG5vbnplcm8gaWYgdGhlIGdpdmVuIHRocmVhZCBpcyBzdGlsbCBhbGl2ZS4gICovCitpbnQKK215dGhyZWFkX2FsaXZlIChwaWQpCisgICAgIGludCBwaWQ7Cit7CisgIHJldHVybiAxOworfQorCisvKiBXYWl0IGZvciBwcm9jZXNzLCByZXR1cm5zIHN0YXR1cyAqLworCit1bnNpZ25lZCBjaGFyCitteXdhaXQgKHN0YXR1cykKKyAgICAgY2hhciAqc3RhdHVzOworeworICBpbnQgcGlkOworICB1bmlvbiB3YWl0IHc7CisKKyAgcGlkID0gd2FpdCAoJncpOworICBpZiAocGlkICE9IGluZmVyaW9yX3BpZCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgid2FpdCIpOworCisgIGlmIChXSUZFWElURUQgKHcpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuQ2hpbGQgZXhpdGVkIHdpdGggcmV0Y29kZSA9ICV4IFxuIiwgV0VYSVRTVEFUVVMgKHcpKTsKKyAgICAgICpzdGF0dXMgPSAnVyc7CisgICAgICByZXR1cm4gKCh1bnNpZ25lZCBjaGFyKSBXRVhJVFNUQVRVUyAodykpOworICAgIH0KKyAgZWxzZSBpZiAoIVdJRlNUT1BQRUQgKHcpKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuQ2hpbGQgdGVybWluYXRlZCB3aXRoIHNpZ25hbCA9ICV4IFxuIiwgV1RFUk1TSUcgKHcpKTsKKyAgICAgICpzdGF0dXMgPSAnWCc7CisgICAgICByZXR1cm4gKCh1bnNpZ25lZCBjaGFyKSBXVEVSTVNJRyAodykpOworICAgIH0KKworICBmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKDApOworCisgICpzdGF0dXMgPSAnVCc7CisgIHJldHVybiAoKHVuc2lnbmVkIGNoYXIpIFdTVE9QU0lHICh3KSk7Cit9CisKKy8qIFJlc3VtZSBleGVjdXRpb24gb2YgdGhlIGluZmVyaW9yIHByb2Nlc3MuCisgICBJZiBTVEVQIGlzIG5vbnplcm8sIHNpbmdsZS1zdGVwIGl0LgorICAgSWYgU0lHTkFMIGlzIG5vbnplcm8sIGdpdmUgaXQgdGhhdCBzaWduYWwuICAqLworCit2b2lkCitteXJlc3VtZSAoc3RlcCwgc2lnbmFsKQorICAgICBpbnQgc3RlcDsKKyAgICAgaW50IHNpZ25hbDsKK3sKKyAgZXJybm8gPSAwOworICBwdHJhY2UgKHN0ZXAgPyBQVFJBQ0VfU0lOR0xFU1RFUCA6IFBUUkFDRV9DT05ULCBpbmZlcmlvcl9waWQsIDEsIHNpZ25hbCk7CisgIGlmIChlcnJubykKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgicHRyYWNlIik7Cit9CisKKy8qIEZldGNoIG9uZSBvciBtb3JlIHJlZ2lzdGVycyBmcm9tIHRoZSBpbmZlcmlvci4gIFJFR05PID09IC0xIHRvIGdldAorICAgdGhlbSBhbGwuICBXZSBhY3R1YWxseSBmZXRjaCBtb3JlIHRoYW4gcmVxdWVzdGVkLCB3aGVuIGNvbnZlbmllbnQsCisgICBtYXJraW5nIHRoZW0gYXMgdmFsaWQgc28gd2Ugd29uJ3QgZmV0Y2ggdGhlbSBhZ2Fpbi4gICovCisKK3ZvaWQKK2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoaWdub3JlZCkKKyAgICAgaW50IGlnbm9yZWQ7Cit7CisgIHN0cnVjdCByZWdzIGluZmVyaW9yX3JlZ2lzdGVyczsKKyAgc3RydWN0IGZwX3N0YXR1cyBpbmZlcmlvcl9mcF9yZWdpc3RlcnM7CisgIGludCBpOworCisgIC8qIEdsb2JhbCBhbmQgT3V0IHJlZ3MgYXJlIGZldGNoZWQgZGlyZWN0bHksIGFzIHdlbGwgYXMgdGhlIGNvbnRyb2wKKyAgICAgcmVnaXN0ZXJzLiAgSWYgd2UncmUgZ2V0dGluZyBvbmUgb2YgdGhlIGluIG9yIGxvY2FsIHJlZ3MsCisgICAgIGFuZCB0aGUgc3RhY2sgcG9pbnRlciBoYXMgbm90IHlldCBiZWVuIGZldGNoZWQsCisgICAgIHdlIGhhdmUgdG8gZG8gdGhhdCBmaXJzdCwgc2luY2UgdGhleSdyZSBmb3VuZCBpbiBtZW1vcnkgcmVsYXRpdmUKKyAgICAgdG8gdGhlIHN0YWNrIHBvaW50ZXIuICAqLworCisgIGlmIChwdHJhY2UgKFBUUkFDRV9HRVRSRUdTLCBpbmZlcmlvcl9waWQsCisJICAgICAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9yZWdpc3RlcnMsIDApKQorICAgIHBlcnJvcigicHRyYWNlX2dldHJlZ3MiKTsKKyAgICAgIAorICByZWdpc3RlcnNbUkVHSVNURVJfQllURSAoMCldID0gMDsKKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKDEpXSwgJmluZmVyaW9yX3JlZ2lzdGVycy5yX2cxLAorCSAgMTUgKiBSRUdJU1RFUl9SQVdfU0laRSAoRzBfUkVHTlVNKSk7CisgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQU19SRUdOVU0pXSA9IGluZmVyaW9yX3JlZ2lzdGVycy5yX3BzOyAKKyAgKihpbnQgKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKFBDX1JFR05VTSldID0gaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcGM7CisgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChOUENfUkVHTlVNKV0gPSBpbmZlcmlvcl9yZWdpc3RlcnMucl9ucGM7CisgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChZX1JFR05VTSldID0gaW5mZXJpb3JfcmVnaXN0ZXJzLnJfeTsKKworICAvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KKworICBpZiAocHRyYWNlIChQVFJBQ0VfR0VURlBSRUdTLCBpbmZlcmlvcl9waWQsCisJICAgICAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9mcF9yZWdpc3RlcnMsCisJICAgICAgMCkpCisgICAgcGVycm9yKCJwdHJhY2VfZ2V0ZnByZWdzIik7CisgIG1lbWNweSAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNKV0sICZpbmZlcmlvcl9mcF9yZWdpc3RlcnMsCisJICBzaXplb2YgaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLmZwdV9mcik7CisKKyAgLyogVGhlc2UgcmVncyBhcmUgc2F2ZWQgb24gdGhlIHN0YWNrIGJ5IHRoZSBrZXJuZWwuICBPbmx5IHJlYWQgdGhlbQorICAgICBhbGwgKDE2IHB0cmFjZSBjYWxscyEpIGlmIHdlIHJlYWxseSBuZWVkIHRoZW0uICAqLworCisgIHJlYWRfaW5mZXJpb3JfbWVtb3J5ICgqKENPUkVfQUREUiopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChTUF9SRUdOVU0pXSwKKwkJCSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoTDBfUkVHTlVNKV0sCisJCQkxNipSRUdJU1RFUl9SQVdfU0laRSAoTDBfUkVHTlVNKSk7Cit9CisKKy8qIFN0b3JlIG91ciByZWdpc3RlciB2YWx1ZXMgYmFjayBpbnRvIHRoZSBpbmZlcmlvci4KKyAgIElmIFJFR05PIGlzIC0xLCBkbyB0aGlzIGZvciBhbGwgcmVnaXN0ZXJzLgorICAgT3RoZXJ3aXNlLCBSRUdOTyBzcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXIgKHNvIHdlIGNhbiBzYXZlIHRpbWUpLiAgKi8KKwordm9pZAorc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChpZ25vcmVkKQorICAgICBpbnQgaWdub3JlZDsKK3sKKyAgc3RydWN0IHJlZ3MgaW5mZXJpb3JfcmVnaXN0ZXJzOworICBzdHJ1Y3QgZnBfc3RhdHVzIGluZmVyaW9yX2ZwX3JlZ2lzdGVyczsKKyAgQ09SRV9BRERSIHNwID0gKihDT1JFX0FERFIgKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKFNQX1JFR05VTSldOworCisgIHdyaXRlX2luZmVyaW9yX21lbW9yeSAoc3AsICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoTDBfUkVHTlVNKV0sCisJCQkgMTYqUkVHSVNURVJfUkFXX1NJWkUgKEwwX1JFR05VTSkpOworCisgIG1lbWNweSAoJmluZmVyaW9yX3JlZ2lzdGVycy5yX2cxLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEcxX1JFR05VTSldLAorCSAgMTUgKiBSRUdJU1RFUl9SQVdfU0laRSAoRzFfUkVHTlVNKSk7CisKKyAgaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcHMgPQorICAgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQU19SRUdOVU0pXTsKKyAgaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcGMgPQorICAgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQQ19SRUdOVU0pXTsKKyAgaW5mZXJpb3JfcmVnaXN0ZXJzLnJfbnBjID0KKyAgICAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoTlBDX1JFR05VTSldOworICBpbmZlcmlvcl9yZWdpc3RlcnMucl95ID0KKyAgICAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoWV9SRUdOVU0pXTsKKworICBpZiAocHRyYWNlIChQVFJBQ0VfU0VUUkVHUywgaW5mZXJpb3JfcGlkLAorCSAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfcmVnaXN0ZXJzLCAwKSkKKyAgICBwZXJyb3IoInB0cmFjZV9zZXRyZWdzIik7CisKKyAgbWVtY3B5ICgmaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pXSwKKwkgIHNpemVvZiBpbmZlcmlvcl9mcF9yZWdpc3RlcnMuZnB1X2ZyKTsKKworICBpZiAocHRyYWNlIChQVFJBQ0VfU0VURlBSRUdTLCBpbmZlcmlvcl9waWQsCisJICAgICAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9mcF9yZWdpc3RlcnMsIDApKQorICAgIHBlcnJvcigicHRyYWNlX3NldGZwcmVncyIpOworfQorCisvKiBOT1RFISBJIHRyaWVkIHVzaW5nIFBUUkFDRV9SRUFEREFUQSwgZXRjLiwgdG8gcmVhZCBhbmQgd3JpdGUgbWVtb3J5CisgICBpbiB0aGUgTkVXX1NVTl9QVFJBQ0UgY2FzZS4KKyAgIEl0IG91Z2h0IHRvIGJlIHN0cmFpZ2h0Zm9yd2FyZC4gIEJ1dCBpdCBhcHBlYXJzIHRoYXQgd3JpdGluZyBkaWQKKyAgIG5vdCB3cml0ZSB0aGUgZGF0YSB0aGF0IEkgc3BlY2lmaWVkLiAgSSBjYW5ub3QgdW5kZXJzdGFuZCB3aGVyZQorICAgaXQgZ290IHRoZSBkYXRhIHRoYXQgaXQgYWN0dWFsbHkgZGlkIHdyaXRlLiAgKi8KKworLyogQ29weSBMRU4gYnl0ZXMgZnJvbSBpbmZlcmlvcidzIG1lbW9yeSBzdGFydGluZyBhdCBNRU1BRERSCisgICB0byBkZWJ1Z2dlciBtZW1vcnkgc3RhcnRpbmcgYXQgTVlBRERSLiAgKi8KKworcmVhZF9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICByZWdpc3RlciBpbnQgaTsKKyAgLyogUm91bmQgc3RhcnRpbmcgYWRkcmVzcyBkb3duIHRvIGxvbmd3b3JkIGJvdW5kYXJ5LiAgKi8KKyAgcmVnaXN0ZXIgQ09SRV9BRERSIGFkZHIgPSBtZW1hZGRyICYgLXNpemVvZiAoaW50KTsKKyAgLyogUm91bmQgZW5kaW5nIGFkZHJlc3MgdXA7IGdldCBudW1iZXIgb2YgbG9uZ3dvcmRzIHRoYXQgbWFrZXMuICAqLworICByZWdpc3RlciBpbnQgY291bnQKKyAgPSAoKChtZW1hZGRyICsgbGVuKSAtIGFkZHIpICsgc2l6ZW9mIChpbnQpIC0gMSkgLyBzaXplb2YgKGludCk7CisgIC8qIEFsbG9jYXRlIGJ1ZmZlciBvZiB0aGF0IG1hbnkgbG9uZ3dvcmRzLiAgKi8KKyAgcmVnaXN0ZXIgaW50ICpidWZmZXIgPSAoaW50ICopIGFsbG9jYSAoY291bnQgKiBzaXplb2YgKGludCkpOworCisgIC8qIFJlYWQgYWxsIHRoZSBsb25nd29yZHMgKi8KKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIGFkZHIgKz0gc2l6ZW9mIChpbnQpKQorICAgIHsKKyAgICAgIGJ1ZmZlcltpXSA9IHB0cmFjZSAoMSwgaW5mZXJpb3JfcGlkLCBhZGRyLCAwKTsKKyAgICB9CisKKyAgLyogQ29weSBhcHByb3ByaWF0ZSBieXRlcyBvdXQgb2YgdGhlIGJ1ZmZlci4gICovCisgIG1lbWNweSAobXlhZGRyLCAoY2hhciAqKSBidWZmZXIgKyAobWVtYWRkciAmIChzaXplb2YgKGludCkgLSAxKSksIGxlbik7Cit9CisKKy8qIENvcHkgTEVOIGJ5dGVzIG9mIGRhdGEgZnJvbSBkZWJ1Z2dlciBtZW1vcnkgYXQgTVlBRERSCisgICB0byBpbmZlcmlvcidzIG1lbW9yeSBhdCBNRU1BRERSLgorICAgT24gZmFpbHVyZSAoY2Fubm90IHdyaXRlIHRoZSBpbmZlcmlvcikKKyAgIHJldHVybnMgdGhlIHZhbHVlIG9mIGVycm5vLiAgKi8KKworaW50Cit3cml0ZV9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICByZWdpc3RlciBpbnQgaTsKKyAgLyogUm91bmQgc3RhcnRpbmcgYWRkcmVzcyBkb3duIHRvIGxvbmd3b3JkIGJvdW5kYXJ5LiAgKi8KKyAgcmVnaXN0ZXIgQ09SRV9BRERSIGFkZHIgPSBtZW1hZGRyICYgLXNpemVvZiAoaW50KTsKKyAgLyogUm91bmQgZW5kaW5nIGFkZHJlc3MgdXA7IGdldCBudW1iZXIgb2YgbG9uZ3dvcmRzIHRoYXQgbWFrZXMuICAqLworICByZWdpc3RlciBpbnQgY291bnQKKyAgPSAoKChtZW1hZGRyICsgbGVuKSAtIGFkZHIpICsgc2l6ZW9mIChpbnQpIC0gMSkgLyBzaXplb2YgKGludCk7CisgIC8qIEFsbG9jYXRlIGJ1ZmZlciBvZiB0aGF0IG1hbnkgbG9uZ3dvcmRzLiAgKi8KKyAgcmVnaXN0ZXIgaW50ICpidWZmZXIgPSAoaW50ICopIGFsbG9jYSAoY291bnQgKiBzaXplb2YgKGludCkpOworICBleHRlcm4gaW50IGVycm5vOworCisgIC8qIEZpbGwgc3RhcnQgYW5kIGVuZCBleHRyYSBieXRlcyBvZiBidWZmZXIgd2l0aCBleGlzdGluZyBtZW1vcnkgZGF0YS4gICovCisKKyAgYnVmZmVyWzBdID0gcHRyYWNlICgxLCBpbmZlcmlvcl9waWQsIGFkZHIsIDApOworCisgIGlmIChjb3VudCA+IDEpCisgICAgeworICAgICAgYnVmZmVyW2NvdW50IC0gMV0KKwk9IHB0cmFjZSAoMSwgaW5mZXJpb3JfcGlkLAorCQkgIGFkZHIgKyAoY291bnQgLSAxKSAqIHNpemVvZiAoaW50KSwgMCk7CisgICAgfQorCisgIC8qIENvcHkgZGF0YSB0byBiZSB3cml0dGVuIG92ZXIgY29ycmVzcG9uZGluZyBwYXJ0IG9mIGJ1ZmZlciAqLworCisgIGJjb3B5IChteWFkZHIsIChjaGFyICopIGJ1ZmZlciArIChtZW1hZGRyICYgKHNpemVvZiAoaW50KSAtIDEpKSwgbGVuKTsKKworICAvKiBXcml0ZSB0aGUgZW50aXJlIGJ1ZmZlci4gICovCisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIGFkZHIgKz0gc2l6ZW9mIChpbnQpKQorICAgIHsKKyAgICAgIGVycm5vID0gMDsKKyAgICAgIHB0cmFjZSAoNCwgaW5mZXJpb3JfcGlkLCBhZGRyLCBidWZmZXJbaV0pOworICAgICAgaWYgKGVycm5vKQorCXJldHVybiBlcnJubzsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisMCit2b2lkCitpbml0aWFsaXplICgpCit7CisgIGluZmVyaW9yX3BpZCA9IDA7Cit9CisKK2ludAoraGF2ZV9pbmZlcmlvcl9wICgpCit7CisgIHJldHVybiBpbmZlcmlvcl9waWQgIT0gMDsKK30KZGlmZiAtLWdpdCBhL2dkYi9nZGJzZXJ2ZXIvbG93LXN1bjMuYyBiL2dkYi9nZGJzZXJ2ZXIvbG93LXN1bjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODRiNzlmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2dkYnNlcnZlci9sb3ctc3VuMy5jCkBAIC0wLDAgKzEsMzEzIEBACisvKiBMb3cgbGV2ZWwgaW50ZXJmYWNlIHRvIHB0cmFjZSwgZm9yIHRoZSByZW1vdGUgc2VydmVyIGZvciBHREIuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICI8c3lzL3dhaXQuaD4iCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSA8c3lzL3VzZXIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzZ3R0eS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKy8qKioqKioqKioqKioqKipCZWdpbiBNWSBkZWZzKioqKioqKioqKioqKioqKioqKioqLworaW50IHF1aXRfZmxhZyA9IDA7CitjaGFyIHJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFU107CisKKy8qIEluZGV4IHdpdGhpbiBgcmVnaXN0ZXJzJyBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3BhY2UgZm9yCisgICByZWdpc3RlciBOLiAgKi8KKworCitjaGFyIGJ1ZjJbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKy8qKioqKioqKioqKioqKipFbmQgTVkgZGVmcyoqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgorCitleHRlcm4gaW50IHN5c19uZXJyOworZXh0ZXJuIGNoYXIgKipzeXNfZXJybGlzdDsKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKK2V4dGVybiBpbnQgZXJybm87CitleHRlcm4gaW50IGluZmVyaW9yX3BpZDsKK3ZvaWQgcXVpdCAoKSwgcGVycm9yX3dpdGhfbmFtZSAoKTsKK2ludCBxdWVyeSAoKTsKKworLyogU3RhcnQgYW4gaW5mZXJpb3IgcHJvY2VzcyBhbmQgcmV0dXJucyBpdHMgcGlkLgorICAgQUxMQVJHUyBpcyBhIHZlY3RvciBvZiBwcm9ncmFtLW5hbWUgYW5kIGFyZ3MuCisgICBFTlYgaXMgdGhlIGVudmlyb25tZW50IHZlY3RvciB0byBwYXNzLiAgKi8KKworaW50CitjcmVhdGVfaW5mZXJpb3IgKHByb2dyYW0sIGFsbGFyZ3MpCisgICAgIGNoYXIgKnByb2dyYW07CisgICAgIGNoYXIgKiphbGxhcmdzOworeworICBpbnQgcGlkOworCisgIHBpZCA9IGZvcmsgKCk7CisgIGlmIChwaWQgPCAwKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJmb3JrIik7CisKKyAgaWYgKHBpZCA9PSAwKQorICAgIHsKKyAgICAgIHB0cmFjZSAoUFRSQUNFX1RSQUNFTUUpOworCisgICAgICBleGVjdiAocHJvZ3JhbSwgYWxsYXJncyk7CisKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNhbm5vdCBleGVjICVzOiAlcy5cbiIsIHByb2dyYW0sCisJICAgICAgIGVycm5vIDwgc3lzX25lcnIgPyBzeXNfZXJybGlzdFtlcnJub10gOiAidW5rbm93biBlcnJvciIpOworICAgICAgZmZsdXNoIChzdGRlcnIpOworICAgICAgX2V4aXQgKDAxNzcpOworICAgIH0KKworICByZXR1cm4gcGlkOworfQorCisvKiBLaWxsIHRoZSBpbmZlcmlvciBwcm9jZXNzLiAgTWFrZSB1cyBoYXZlIG5vIGluZmVyaW9yLiAgKi8KKwordm9pZAora2lsbF9pbmZlcmlvciAoKQoreworICBpZiAoaW5mZXJpb3JfcGlkID09IDApCisgICAgcmV0dXJuOworICBwdHJhY2UgKDgsIGluZmVyaW9yX3BpZCwgMCwgMCk7CisgIHdhaXQgKDApOworICAvKioqKioqKioqKioqKmluZmVyaW9yX2RpZWQgKCk7KioqKlZLKioqKioqKioqKioqKiovCit9CisKKy8qIFJldHVybiBub256ZXJvIGlmIHRoZSBnaXZlbiB0aHJlYWQgaXMgc3RpbGwgYWxpdmUuICAqLworaW50CitteXRocmVhZF9hbGl2ZSAocGlkKQorICAgICBpbnQgcGlkOworeworICByZXR1cm4gMTsKK30KKworLyogV2FpdCBmb3IgcHJvY2VzcywgcmV0dXJucyBzdGF0dXMgKi8KKwordW5zaWduZWQgY2hhcgorbXl3YWl0IChzdGF0dXMpCisgICAgIGNoYXIgKnN0YXR1czsKK3sKKyAgaW50IHBpZDsKKyAgdW5pb24gd2FpdCB3OworCisgIHBpZCA9IHdhaXQgKCZ3KTsKKyAgaWYgKHBpZCAhPSBpbmZlcmlvcl9waWQpCisgICAgcGVycm9yX3dpdGhfbmFtZSAoIndhaXQiKTsKKworICBpZiAoV0lGRVhJVEVEICh3KSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbkNoaWxkIGV4aXRlZCB3aXRoIHJldGNvZGUgPSAleCBcbiIsIFdFWElUU1RBVFVTICh3KSk7CisgICAgICAqc3RhdHVzID0gJ1cnOworICAgICAgcmV0dXJuICgodW5zaWduZWQgY2hhcikgV0VYSVRTVEFUVVMgKHcpKTsKKyAgICB9CisgIGVsc2UgaWYgKCFXSUZTVE9QUEVEICh3KSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbkNoaWxkIHRlcm1pbmF0ZWQgd2l0aCBzaWduYWwgPSAleCBcbiIsIFdURVJNU0lHICh3KSk7CisgICAgICAqc3RhdHVzID0gJ1gnOworICAgICAgcmV0dXJuICgodW5zaWduZWQgY2hhcikgV1RFUk1TSUcgKHcpKTsKKyAgICB9CisKKyAgZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzICgwKTsKKworICAqc3RhdHVzID0gJ1QnOworICByZXR1cm4gKCh1bnNpZ25lZCBjaGFyKSBXU1RPUFNJRyAodykpOworfQorCisvKiBSZXN1bWUgZXhlY3V0aW9uIG9mIHRoZSBpbmZlcmlvciBwcm9jZXNzLgorICAgSWYgU1RFUCBpcyBub256ZXJvLCBzaW5nbGUtc3RlcCBpdC4KKyAgIElmIFNJR05BTCBpcyBub256ZXJvLCBnaXZlIGl0IHRoYXQgc2lnbmFsLiAgKi8KKwordm9pZAorbXlyZXN1bWUgKHN0ZXAsIHNpZ25hbCkKKyAgICAgaW50IHN0ZXA7CisgICAgIGludCBzaWduYWw7Cit7CisgIGVycm5vID0gMDsKKyAgcHRyYWNlIChzdGVwID8gUFRSQUNFX1NJTkdMRVNURVAgOiBQVFJBQ0VfQ09OVCwgaW5mZXJpb3JfcGlkLCAxLCBzaWduYWwpOworICBpZiAoZXJybm8pCisgICAgcGVycm9yX3dpdGhfbmFtZSAoInB0cmFjZSIpOworfQorCisvKiBGZXRjaCBvbmUgb3IgbW9yZSByZWdpc3RlcnMgZnJvbSB0aGUgaW5mZXJpb3IuICBSRUdOTyA9PSAtMSB0byBnZXQKKyAgIHRoZW0gYWxsLiAgV2UgYWN0dWFsbHkgZmV0Y2ggbW9yZSB0aGFuIHJlcXVlc3RlZCwgd2hlbiBjb252ZW5pZW50LAorICAgbWFya2luZyB0aGVtIGFzIHZhbGlkIHNvIHdlIHdvbid0IGZldGNoIHRoZW0gYWdhaW4uICAqLworCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKGlnbm9yZWQpCisgICAgIGludCBpZ25vcmVkOworeworICBzdHJ1Y3QgcmVncyBpbmZlcmlvcl9yZWdpc3RlcnM7CisgIHN0cnVjdCBmcF9zdGF0dXMgaW5mZXJpb3JfZnBfcmVnaXN0ZXJzOworCisgIHB0cmFjZSAoUFRSQUNFX0dFVFJFR1MsIGluZmVyaW9yX3BpZCwKKwkgIChQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfcmVnaXN0ZXJzKTsKKyNpZmRlZiBGUDBfUkVHTlVNCisgIHB0cmFjZSAoUFRSQUNFX0dFVEZQUkVHUywgaW5mZXJpb3JfcGlkLAorCSAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9mcF9yZWdpc3RlcnMpOworI2VuZGlmIAorICAKKyAgbWVtY3B5IChyZWdpc3RlcnMsICZpbmZlcmlvcl9yZWdpc3RlcnMsIDE2ICogNCk7CisjaWZkZWYgRlAwX1JFR05VTQorICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLCAmaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLAorCSAgc2l6ZW9mIGluZmVyaW9yX2ZwX3JlZ2lzdGVycy5mcHNfcmVncyk7CisjZW5kaWYgCisgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQU19SRUdOVU0pXSA9IGluZmVyaW9yX3JlZ2lzdGVycy5yX3BzOworICAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUENfUkVHTlVNKV0gPSBpbmZlcmlvcl9yZWdpc3RlcnMucl9wYzsKKyNpZmRlZiBGUDBfUkVHTlVNCisgIG1lbWNweQorICAgICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQQ19SRUdOVU0pXSwKKyAgICAgJmluZmVyaW9yX2ZwX3JlZ2lzdGVycy5mcHNfY29udHJvbCwKKyAgICAgc2l6ZW9mIGluZmVyaW9yX2ZwX3JlZ2lzdGVycyAtIHNpemVvZiBpbmZlcmlvcl9mcF9yZWdpc3RlcnMuZnBzX3JlZ3MpOworI2VuZGlmIAorfQorCisvKiBTdG9yZSBvdXIgcmVnaXN0ZXIgdmFsdWVzIGJhY2sgaW50byB0aGUgaW5mZXJpb3IuCisgICBJZiBSRUdOTyBpcyAtMSwgZG8gdGhpcyBmb3IgYWxsIHJlZ2lzdGVycy4KKyAgIE90aGVyd2lzZSwgUkVHTk8gc3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVyIChzbyB3ZSBjYW4gc2F2ZSB0aW1lKS4gICovCisKK3ZvaWQKK3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAoaWdub3JlZCkKKyAgICAgaW50IGlnbm9yZWQ7Cit7CisgIHN0cnVjdCByZWdzIGluZmVyaW9yX3JlZ2lzdGVyczsKKyAgc3RydWN0IGZwX3N0YXR1cyBpbmZlcmlvcl9mcF9yZWdpc3RlcnM7CisKKyAgbWVtY3B5ICgmaW5mZXJpb3JfcmVnaXN0ZXJzLCByZWdpc3RlcnMsIDE2ICogNCk7CisjaWZkZWYgRlAwX1JFR05VTQorICBtZW1jcHkgKCZpbmZlcmlvcl9mcF9yZWdpc3RlcnMsCisJICAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pXSwKKwkgIHNpemVvZiBpbmZlcmlvcl9mcF9yZWdpc3RlcnMuZnBzX3JlZ3MpOworI2VuZGlmCisgIGluZmVyaW9yX3JlZ2lzdGVycy5yX3BzID0gKihpbnQgKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKFBTX1JFR05VTSldOworICBpbmZlcmlvcl9yZWdpc3RlcnMucl9wYyA9ICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQQ19SRUdOVU0pXTsKKworI2lmZGVmIEZQMF9SRUdOVU0KKyAgbWVtY3B5ICgmaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLmZwc19jb250cm9sLAorCSAgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUENfUkVHTlVNKV0sCisJICAoc2l6ZW9mIGluZmVyaW9yX2ZwX3JlZ2lzdGVycworCSAgIC0gc2l6ZW9mIGluZmVyaW9yX2ZwX3JlZ2lzdGVycy5mcHNfcmVncykpOworI2VuZGlmCisKKyAgcHRyYWNlIChQVFJBQ0VfU0VUUkVHUywgaW5mZXJpb3JfcGlkLAorCSAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9yZWdpc3RlcnMpOworI2lmIEZQMF9SRUdOVU0KKyAgcHRyYWNlIChQVFJBQ0VfU0VURlBSRUdTLCBpbmZlcmlvcl9waWQsCisJICAoUFRSQUNFX0FSRzNfVFlQRSkgJmluZmVyaW9yX2ZwX3JlZ2lzdGVycyk7CisjZW5kaWYKK30KKworLyogTk9URSEgSSB0cmllZCB1c2luZyBQVFJBQ0VfUkVBRERBVEEsIGV0Yy4sIHRvIHJlYWQgYW5kIHdyaXRlIG1lbW9yeQorICAgaW4gdGhlIE5FV19TVU5fUFRSQUNFIGNhc2UuCisgICBJdCBvdWdodCB0byBiZSBzdHJhaWdodGZvcndhcmQuICBCdXQgaXQgYXBwZWFycyB0aGF0IHdyaXRpbmcgZGlkCisgICBub3Qgd3JpdGUgdGhlIGRhdGEgdGhhdCBJIHNwZWNpZmllZC4gIEkgY2Fubm90IHVuZGVyc3RhbmQgd2hlcmUKKyAgIGl0IGdvdCB0aGUgZGF0YSB0aGF0IGl0IGFjdHVhbGx5IGRpZCB3cml0ZS4gICovCisKKy8qIENvcHkgTEVOIGJ5dGVzIGZyb20gaW5mZXJpb3IncyBtZW1vcnkgc3RhcnRpbmcgYXQgTUVNQUREUgorICAgdG8gZGVidWdnZXIgbWVtb3J5IHN0YXJ0aW5nIGF0IE1ZQUREUi4gICovCisKK3JlYWRfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgcmVnaXN0ZXIgaW50IGk7CisgIC8qIFJvdW5kIHN0YXJ0aW5nIGFkZHJlc3MgZG93biB0byBsb25nd29yZCBib3VuZGFyeS4gICovCisgIHJlZ2lzdGVyIENPUkVfQUREUiBhZGRyID0gbWVtYWRkciAmIC1zaXplb2YgKGludCk7CisgIC8qIFJvdW5kIGVuZGluZyBhZGRyZXNzIHVwOyBnZXQgbnVtYmVyIG9mIGxvbmd3b3JkcyB0aGF0IG1ha2VzLiAgKi8KKyAgcmVnaXN0ZXIgaW50IGNvdW50CisgID0gKCgobWVtYWRkciArIGxlbikgLSBhZGRyKSArIHNpemVvZiAoaW50KSAtIDEpIC8gc2l6ZW9mIChpbnQpOworICAvKiBBbGxvY2F0ZSBidWZmZXIgb2YgdGhhdCBtYW55IGxvbmd3b3Jkcy4gICovCisgIHJlZ2lzdGVyIGludCAqYnVmZmVyID0gKGludCAqKSBhbGxvY2EgKGNvdW50ICogc2l6ZW9mIChpbnQpKTsKKworICAvKiBSZWFkIGFsbCB0aGUgbG9uZ3dvcmRzICovCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBhZGRyICs9IHNpemVvZiAoaW50KSkKKyAgICB7CisgICAgICBidWZmZXJbaV0gPSBwdHJhY2UgKDEsIGluZmVyaW9yX3BpZCwgYWRkciwgMCk7CisgICAgfQorCisgIC8qIENvcHkgYXBwcm9wcmlhdGUgYnl0ZXMgb3V0IG9mIHRoZSBidWZmZXIuICAqLworICBtZW1jcHkgKG15YWRkciwgKGNoYXIgKikgYnVmZmVyICsgKG1lbWFkZHIgJiAoc2l6ZW9mIChpbnQpIC0gMSkpLCBsZW4pOworfQorCisvKiBDb3B5IExFTiBieXRlcyBvZiBkYXRhIGZyb20gZGVidWdnZXIgbWVtb3J5IGF0IE1ZQUREUgorICAgdG8gaW5mZXJpb3IncyBtZW1vcnkgYXQgTUVNQUREUi4KKyAgIE9uIGZhaWx1cmUgKGNhbm5vdCB3cml0ZSB0aGUgaW5mZXJpb3IpCisgICByZXR1cm5zIHRoZSB2YWx1ZSBvZiBlcnJuby4gICovCisKK2ludAord3JpdGVfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgcmVnaXN0ZXIgaW50IGk7CisgIC8qIFJvdW5kIHN0YXJ0aW5nIGFkZHJlc3MgZG93biB0byBsb25nd29yZCBib3VuZGFyeS4gICovCisgIHJlZ2lzdGVyIENPUkVfQUREUiBhZGRyID0gbWVtYWRkciAmIC1zaXplb2YgKGludCk7CisgIC8qIFJvdW5kIGVuZGluZyBhZGRyZXNzIHVwOyBnZXQgbnVtYmVyIG9mIGxvbmd3b3JkcyB0aGF0IG1ha2VzLiAgKi8KKyAgcmVnaXN0ZXIgaW50IGNvdW50CisgID0gKCgobWVtYWRkciArIGxlbikgLSBhZGRyKSArIHNpemVvZiAoaW50KSAtIDEpIC8gc2l6ZW9mIChpbnQpOworICAvKiBBbGxvY2F0ZSBidWZmZXIgb2YgdGhhdCBtYW55IGxvbmd3b3Jkcy4gICovCisgIHJlZ2lzdGVyIGludCAqYnVmZmVyID0gKGludCAqKSBhbGxvY2EgKGNvdW50ICogc2l6ZW9mIChpbnQpKTsKKyAgZXh0ZXJuIGludCBlcnJubzsKKworICAvKiBGaWxsIHN0YXJ0IGFuZCBlbmQgZXh0cmEgYnl0ZXMgb2YgYnVmZmVyIHdpdGggZXhpc3RpbmcgbWVtb3J5IGRhdGEuICAqLworCisgIGJ1ZmZlclswXSA9IHB0cmFjZSAoMSwgaW5mZXJpb3JfcGlkLCBhZGRyLCAwKTsKKworICBpZiAoY291bnQgPiAxKQorICAgIHsKKyAgICAgIGJ1ZmZlcltjb3VudCAtIDFdCisJPSBwdHJhY2UgKDEsIGluZmVyaW9yX3BpZCwKKwkJICBhZGRyICsgKGNvdW50IC0gMSkgKiBzaXplb2YgKGludCksIDApOworICAgIH0KKworICAvKiBDb3B5IGRhdGEgdG8gYmUgd3JpdHRlbiBvdmVyIGNvcnJlc3BvbmRpbmcgcGFydCBvZiBidWZmZXIgKi8KKworICBtZW1jcHkgKChjaGFyICopIGJ1ZmZlciArIChtZW1hZGRyICYgKHNpemVvZiAoaW50KSAtIDEpKSwgbXlhZGRyLCBsZW4pOworCisgIC8qIFdyaXRlIHRoZSBlbnRpcmUgYnVmZmVyLiAgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgYWRkciArPSBzaXplb2YgKGludCkpCisgICAgeworICAgICAgZXJybm8gPSAwOworICAgICAgcHRyYWNlICg0LCBpbmZlcmlvcl9waWQsIGFkZHIsIGJ1ZmZlcltpXSk7CisgICAgICBpZiAoZXJybm8pCisJcmV0dXJuIGVycm5vOworICAgIH0KKworICByZXR1cm4gMDsKK30KKwwKK3ZvaWQKK2luaXRpYWxpemUgKCkKK3sKKyAgaW5mZXJpb3JfcGlkID0gMDsKK30KKworaW50CitoYXZlX2luZmVyaW9yX3AgKCkKK3sKKyAgcmV0dXJuIGluZmVyaW9yX3BpZCAhPSAwOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2dkYnNlcnZlci9yZW1vdGUtdXRpbHMuYyBiL2dkYi9nZGJzZXJ2ZXIvcmVtb3RlLXV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE3ZTBmYgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9nZGJzZXJ2ZXIvcmVtb3RlLXV0aWxzLmMKQEAgLTAsMCArMSw1NDUgQEAKKy8qIFJlbW90ZSB1dGlsaXR5IHJvdXRpbmVzIGZvciB0aGUgcmVtb3RlIHNlcnZlciBmb3IgR0RCLgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg5LCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJzZXJ2ZXIuaCIKKyNpbmNsdWRlICJ0ZXJtaW5hbC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCitpbnQgcmVtb3RlX2RlYnVnID0gMDsKKworc3RhdGljIGludCByZW1vdGVfZGVzYzsKKworLyogT3BlbiBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgZGVidWdnZXIuCisgICBOQU1FIGlzIHRoZSBmaWxlbmFtZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uLiAgKi8KKwordm9pZAorcmVtb3RlX29wZW4gKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIGludCBzYXZlX2ZjbnRsX2ZsYWdzOworCisgIGlmICghc3RyY2hyIChuYW1lLCAnOicpKQorICAgIHsKKyAgICAgIHJlbW90ZV9kZXNjID0gb3BlbiAobmFtZSwgT19SRFdSKTsKKyAgICAgIGlmIChyZW1vdGVfZGVzYyA8IDApCisJcGVycm9yX3dpdGhfbmFtZSAoIkNvdWxkIG5vdCBvcGVuIHJlbW90ZSBkZXZpY2UiKTsKKworI2lmZGVmIEhBVkVfVEVSTUlPUworICAgICAgeworCXN0cnVjdCB0ZXJtaW9zIHRlcm1pb3M7CisJdGNnZXRhdHRyKHJlbW90ZV9kZXNjLCAmdGVybWlvcyk7CisKKwl0ZXJtaW9zLmNfaWZsYWcgPSAwOworCXRlcm1pb3MuY19vZmxhZyA9IDA7CisJdGVybWlvcy5jX2xmbGFnID0gMDsKKwl0ZXJtaW9zLmNfY2ZsYWcgJj0gfihDU0laRXxQQVJFTkIpOworCXRlcm1pb3MuY19jZmxhZyB8PSBDTE9DQUwgfCBDUzg7CisJdGVybWlvcy5jX2NjW1ZNSU5dID0gMDsKKwl0ZXJtaW9zLmNfY2NbVlRJTUVdID0gMDsKKworCXRjc2V0YXR0cihyZW1vdGVfZGVzYywgVENTQU5PVywgJnRlcm1pb3MpOworICAgICAgfQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1RFUk1JTworICAgICAgeworCXN0cnVjdCB0ZXJtaW8gdGVybWlvOworCWlvY3RsIChyZW1vdGVfZGVzYywgVENHRVRBLCAmdGVybWlvKTsKKworCXRlcm1pby5jX2lmbGFnID0gMDsKKwl0ZXJtaW8uY19vZmxhZyA9IDA7CisJdGVybWlvLmNfbGZsYWcgPSAwOworCXRlcm1pby5jX2NmbGFnICY9IH4oQ1NJWkV8UEFSRU5CKTsKKwl0ZXJtaW8uY19jZmxhZyB8PSBDTE9DQUwgfCBDUzg7CisJdGVybWlvLmNfY2NbVk1JTl0gPSAwOworCXRlcm1pby5jX2NjW1ZUSU1FXSA9IDA7CisKKwlpb2N0bCAocmVtb3RlX2Rlc2MsIFRDU0VUQSwgJnRlcm1pbyk7CisgICAgICB9CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU0dUVFkKKyAgICAgIHsKKwlzdHJ1Y3Qgc2d0dHliIHNnOworCisJaW9jdGwgKHJlbW90ZV9kZXNjLCBUSU9DR0VUUCwgJnNnKTsKKwlzZy5zZ19mbGFncyA9IFJBVzsKKwlpb2N0bCAocmVtb3RlX2Rlc2MsIFRJT0NTRVRQLCAmc2cpOworICAgICAgfQorI2VuZGlmCisKKworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgKnBvcnRfc3RyOworICAgICAgaW50IHBvcnQ7CisgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja2FkZHI7CisgICAgICBpbnQgdG1wOworICAgICAgc3RydWN0IHByb3RvZW50ICpwcm90b2VudDsKKyAgICAgIGludCB0bXBfZGVzYzsKKworICAgICAgcG9ydF9zdHIgPSBzdHJjaHIgKG5hbWUsICc6Jyk7CisKKyAgICAgIHBvcnQgPSBhdG9pIChwb3J0X3N0ciArIDEpOworCisgICAgICB0bXBfZGVzYyA9IHNvY2tldCAoUEZfSU5FVCwgU09DS19TVFJFQU0sIDApOworICAgICAgaWYgKHRtcF9kZXNjIDwgMCkKKwlwZXJyb3Jfd2l0aF9uYW1lICgiQ2FuJ3Qgb3BlbiBzb2NrZXQiKTsKKworICAgICAgLyogQWxsb3cgcmFwaWQgcmV1c2Ugb2YgdGhpcyBwb3J0LiAqLworICAgICAgdG1wID0gMTsKKyAgICAgIHNldHNvY2tvcHQgKHRtcF9kZXNjLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChjaGFyICopJnRtcCwKKwkJICBzaXplb2YodG1wKSk7CisKKyAgICAgIHNvY2thZGRyLnNpbl9mYW1pbHkgPSBQRl9JTkVUOworICAgICAgc29ja2FkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKyAgICAgIHNvY2thZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisKKyAgICAgIGlmIChiaW5kICh0bXBfZGVzYywgKHN0cnVjdCBzb2NrYWRkciAqKSZzb2NrYWRkciwgc2l6ZW9mIChzb2NrYWRkcikpCisJICB8fCBsaXN0ZW4gKHRtcF9kZXNjLCAxKSkKKwlwZXJyb3Jfd2l0aF9uYW1lICgiQ2FuJ3QgYmluZCBhZGRyZXNzIik7CisKKyAgICAgIHRtcCA9IHNpemVvZiAoc29ja2FkZHIpOworICAgICAgcmVtb3RlX2Rlc2MgPSBhY2NlcHQgKHRtcF9kZXNjLCAoc3RydWN0IHNvY2thZGRyICopJnNvY2thZGRyLCAmdG1wKTsKKyAgICAgIGlmIChyZW1vdGVfZGVzYyA9PSAtMSkKKwlwZXJyb3Jfd2l0aF9uYW1lICgiQWNjZXB0IGZhaWxlZCIpOworCisgICAgICBwcm90b2VudCA9IGdldHByb3RvYnluYW1lICgidGNwIik7CisgICAgICBpZiAoIXByb3RvZW50KQorCXBlcnJvcl93aXRoX25hbWUgKCJnZXRwcm90b2J5bmFtZSIpOworCisgICAgICAvKiBFbmFibGUgVENQIGtlZXAgYWxpdmUgcHJvY2Vzcy4gKi8KKyAgICAgIHRtcCA9IDE7CisgICAgICBzZXRzb2Nrb3B0ICh0bXBfZGVzYywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAoY2hhciAqKSZ0bXAsIHNpemVvZih0bXApKTsKKworICAgICAgLyogVGVsbCBUQ1Agbm90IHRvIGRlbGF5IHNtYWxsIHBhY2tldHMuICBUaGlzIGdyZWF0bHkgc3BlZWRzIHVwCisJIGludGVyYWN0aXZlIHJlc3BvbnNlLiAqLworICAgICAgdG1wID0gMTsKKyAgICAgIHNldHNvY2tvcHQgKHJlbW90ZV9kZXNjLCBwcm90b2VudC0+cF9wcm90bywgVENQX05PREVMQVksCisJCSAgKGNoYXIgKikmdG1wLCBzaXplb2YodG1wKSk7CisKKyAgICAgIGNsb3NlICh0bXBfZGVzYyk7CQkvKiBObyBsb25nZXIgbmVlZCB0aGlzICovCisKKyAgICAgIHNpZ25hbCAoU0lHUElQRSwgU0lHX0lHTik7IC8qIElmIHdlIGRvbid0IGRvIHRoaXMsIHRoZW4gZ2Ric2VydmVyIHNpbXBseQorCQkJCSAgICBleGl0cyB3aGVuIHRoZSByZW1vdGUgc2lkZSBkaWVzLiAgKi8KKyAgICB9CisKKyNpZiBkZWZpbmVkKEZfU0VURkwpICYmIGRlZmluZWQgKEZBU1lOQykKKyAgc2F2ZV9mY250bF9mbGFncyA9IGZjbnRsIChyZW1vdGVfZGVzYywgRl9HRVRGTCwgMCk7CisgIGZjbnRsIChyZW1vdGVfZGVzYywgRl9TRVRGTCwgc2F2ZV9mY250bF9mbGFncyB8IEZBU1lOQyk7CisgIGRpc2FibGVfYXN5bmNfaW8gKCk7CisjZW5kaWYgLyogRkFTWU5DICovCisgIGZwcmludGYgKHN0ZGVyciwgIlJlbW90ZSBkZWJ1Z2dpbmcgdXNpbmcgJXNcbiIsIG5hbWUpOworfQorCit2b2lkCityZW1vdGVfY2xvc2UoKQoreworICBjbG9zZSAocmVtb3RlX2Rlc2MpOworfQorCisvKiBDb252ZXJ0IGhleCBkaWdpdCBBIHRvIGEgbnVtYmVyLiAgKi8KKworc3RhdGljIGludAorZnJvbWhleCAoYSkKKyAgICAgaW50IGE7Cit7CisgIGlmIChhID49ICcwJyAmJiBhIDw9ICc5JykKKyAgICByZXR1cm4gYSAtICcwJzsKKyAgZWxzZSBpZiAoYSA+PSAnYScgJiYgYSA8PSAnZicpCisgICAgcmV0dXJuIGEgLSAnYScgKyAxMDsKKyAgZWxzZQorICAgIGVycm9yICgiUmVwbHkgY29udGFpbnMgaW52YWxpZCBoZXggZGlnaXQiKTsKK30KKworLyogQ29udmVydCBudW1iZXIgTklCIHRvIGEgaGV4IGRpZ2l0LiAgKi8KKworc3RhdGljIGludAordG9oZXggKG5pYikKKyAgICAgaW50IG5pYjsKK3sKKyAgaWYgKG5pYiA8IDEwKQorICAgIHJldHVybiAnMCcgKyBuaWI7CisgIGVsc2UKKyAgICByZXR1cm4gJ2EnICsgbmliIC0gMTA7Cit9CisKKy8qIFNlbmQgYSBwYWNrZXQgdG8gdGhlIHJlbW90ZSBtYWNoaW5lLCB3aXRoIGVycm9yIGNoZWNraW5nLgorICAgVGhlIGRhdGEgb2YgdGhlIHBhY2tldCBpcyBpbiBCVUYuICBSZXR1cm5zID49IDAgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlLiAqLworCitpbnQKK3B1dHBrdCAoYnVmKQorICAgICBjaGFyICpidWY7Cit7CisgIGludCBpOworICB1bnNpZ25lZCBjaGFyIGNzdW0gPSAwOworICBjaGFyIGJ1ZjJbMjAwMF07CisgIGNoYXIgYnVmM1sxXTsKKyAgaW50IGNudCA9IHN0cmxlbiAoYnVmKTsKKyAgY2hhciAqcDsKKworICAvKiBDb3B5IHRoZSBwYWNrZXQgaW50byBidWZmZXIgQlVGMiwgZW5jYXBzdWxhdGluZyBpdAorICAgICBhbmQgZ2l2aW5nIGl0IGEgY2hlY2tzdW0uICAqLworCisgIHAgPSBidWYyOworICAqcCsrID0gJyQnOworCisgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykKKyAgICB7CisgICAgICBjc3VtICs9IGJ1ZltpXTsKKyAgICAgICpwKysgPSBidWZbaV07CisgICAgfQorICAqcCsrID0gJyMnOworICAqcCsrID0gdG9oZXggKChjc3VtID4+IDQpICYgMHhmKTsKKyAgKnArKyA9IHRvaGV4IChjc3VtICYgMHhmKTsKKworICAqcCA9ICdcMCc7CisKKyAgLyogU2VuZCBpdCBvdmVyIGFuZCBvdmVyIHVudGlsIHdlIGdldCBhIHBvc2l0aXZlIGFjay4gICovCisKKyAgZG8KKyAgICB7CisgICAgICBpbnQgY2M7CisKKyAgICAgIGlmICh3cml0ZSAocmVtb3RlX2Rlc2MsIGJ1ZjIsIHAgLSBidWYyKSAhPSBwIC0gYnVmMikKKwl7CisJICBwZXJyb3IgKCJwdXRwa3Qod3JpdGUpIik7CisJICByZXR1cm4gLTE7CisJfQorCisgICAgICBpZiAocmVtb3RlX2RlYnVnKQorCXByaW50ZiAoInB1dHBrdCAoXCIlc1wiKTsgW2xvb2tpbmcgZm9yIGFja11cbiIsIGJ1ZjIpOworICAgICAgY2MgPSByZWFkIChyZW1vdGVfZGVzYywgYnVmMywgMSk7CisgICAgICBpZiAocmVtb3RlX2RlYnVnKQorCXByaW50ZiAoIltyZWNlaXZlZCAnJWMnICgweCV4KV1cbiIsIGJ1ZjNbMF0sIGJ1ZjNbMF0pOworICAgICAgaWYgKGNjIDw9IDApCisJeworCSAgaWYgKGNjID09IDApCisJICAgIGZwcmludGYgKHN0ZGVyciwgInB1dHBrdChyZWFkKTogR290IEVPRlxuIik7CisJICBlbHNlCisJICAgIHBlcnJvciAoInB1dHBrdChyZWFkKSIpOworCisJICByZXR1cm4gLTE7CisJfQorICAgIH0KKyAgd2hpbGUgKGJ1ZjNbMF0gIT0gJysnKTsKKworICByZXR1cm4gMTsJCQkvKiBTdWNjZXNzISAqLworfQorCisvKiBDb21lIGhlcmUgd2hlbiB3ZSBnZXQgYW4gaW5wdXQgaW50ZXJydXB0IGZyb20gdGhlIHJlbW90ZSBzaWRlLiAgVGhpcworICAgaW50ZXJydXB0IHNob3VsZCBvbmx5IGJlIGFjdGl2ZSB3aGlsZSB3ZSBhcmUgd2FpdGluZyBmb3IgdGhlIGNoaWxkIHRvIGRvCisgICBzb21ldGhpbmcuICBBYm91dCB0aGUgb25seSB0aGluZyB0aGF0IHNob3VsZCBjb21lIHRocm91Z2ggaXMgYSBeQywgd2hpY2gKKyAgIHdpbGwgY2F1c2UgdXMgdG8gc2VuZCBhIFNJR0lOVCB0byB0aGUgY2hpbGQuICAqLworCitzdGF0aWMgdm9pZAoraW5wdXRfaW50ZXJydXB0KCkKK3sKKyAgaW50IGNjOworICBjaGFyIGM7CisKKyAgY2MgPSByZWFkIChyZW1vdGVfZGVzYywgJmMsIDEpOworCisgIGlmIChjYyAhPSAxIHx8IGMgIT0gJ1wwMDMnKQorICAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5wdXRfaW50ZXJydXB0LCBjYyA9ICVkIGMgPSAlZFxuIiwgY2MsIGMpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBraWxsIChpbmZlcmlvcl9waWQsIFNJR0lOVCk7Cit9CisKK3ZvaWQKK2VuYWJsZV9hc3luY19pbygpCit7CisgIHNpZ25hbCAoU0lHSU8sIGlucHV0X2ludGVycnVwdCk7Cit9CisKK3ZvaWQKK2Rpc2FibGVfYXN5bmNfaW8oKQoreworICBzaWduYWwgKFNJR0lPLCBTSUdfSUdOKTsKK30KKworLyogUmV0dXJucyBuZXh0IGNoYXIgZnJvbSByZW1vdGUgR0RCLiAgLTEgaWYgZXJyb3IuICAqLworCitzdGF0aWMgaW50CityZWFkY2hhciAoKQoreworICBzdGF0aWMgY2hhciBidWZbQlVGU0laXTsKKyAgc3RhdGljIGludCBidWZjbnQgPSAwOworICBzdGF0aWMgY2hhciAqYnVmcDsKKworICBpZiAoYnVmY250LS0gPiAwKQorICAgIHJldHVybiAqYnVmcCsrICYgMHg3ZjsKKworICBidWZjbnQgPSByZWFkIChyZW1vdGVfZGVzYywgYnVmLCBzaXplb2YgKGJ1ZikpOworCisgIGlmIChidWZjbnQgPD0gMCkKKyAgICB7CisgICAgICBpZiAoYnVmY250ID09IDApCisJZnByaW50ZiAoc3RkZXJyLCAicmVhZGNoYXI6IEdvdCBFT0ZcbiIpOworICAgICAgZWxzZQorCXBlcnJvciAoInJlYWRjaGFyIik7CisKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgYnVmcCA9IGJ1ZjsKKyAgYnVmY250LS07CisgIHJldHVybiAqYnVmcCsrICYgMHg3ZjsKK30KKworLyogUmVhZCBhIHBhY2tldCBmcm9tIHRoZSByZW1vdGUgbWFjaGluZSwgd2l0aCBlcnJvciBjaGVja2luZywKKyAgIGFuZCBzdG9yZSBpdCBpbiBCVUYuICBSZXR1cm5zIGxlbmd0aCBvZiBwYWNrZXQsIG9yIG5lZ2F0aXZlIGlmIGVycm9yLiAqLworCitpbnQKK2dldHBrdCAoYnVmKQorICAgICBjaGFyICpidWY7Cit7CisgIGNoYXIgKmJwOworICB1bnNpZ25lZCBjaGFyIGNzdW0sIGMxLCBjMjsKKyAgaW50IGM7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgY3N1bSA9IDA7CisKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIGMgPSByZWFkY2hhciAoKTsKKwkgIGlmIChjID09ICckJykKKwkgICAgYnJlYWs7CisJICBpZiAocmVtb3RlX2RlYnVnKQorCSAgICBwcmludGYgKCJbZ2V0cGt0OiBkaXNjYXJkaW5nIGNoYXIgJyVjJ11cbiIsIGMpOworCSAgaWYgKGMgPCAwKQorCSAgICByZXR1cm4gLTE7CisJfQorCisgICAgICBicCA9IGJ1ZjsKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIGMgPSByZWFkY2hhciAoKTsKKwkgIGlmIChjIDwgMCkKKwkgICAgcmV0dXJuIC0xOworCSAgaWYgKGMgPT0gJyMnKQorCSAgICBicmVhazsKKwkgICpicCsrID0gYzsKKwkgIGNzdW0gKz0gYzsKKwl9CisgICAgICAqYnAgPSAwOworCisgICAgICBjMSA9IGZyb21oZXggKHJlYWRjaGFyICgpKTsKKyAgICAgIGMyID0gZnJvbWhleCAocmVhZGNoYXIgKCkpOworICAgICAgCisgICAgICBpZiAoY3N1bSA9PSAoYzEgPDwgNCkgKyBjMikKKwlicmVhazsKKworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQmFkIGNoZWNrc3VtLCBzZW50c3VtPTB4JXgsIGNzdW09MHgleCwgYnVmPSVzXG4iLAorCSAgICAgICAoYzEgPDwgNCkgKyBjMiwgY3N1bSwgYnVmKTsKKyAgICAgIHdyaXRlIChyZW1vdGVfZGVzYywgIi0iLCAxKTsKKyAgICB9CisKKyAgaWYgKHJlbW90ZV9kZWJ1ZykKKyAgICBwcmludGYgKCJnZXRwa3QgKFwiJXNcIik7ICBbc2VuZGluZyBhY2tdIFxuIiwgYnVmKTsKKworICB3cml0ZSAocmVtb3RlX2Rlc2MsICIrIiwgMSk7CisKKyAgaWYgKHJlbW90ZV9kZWJ1ZykKKyAgICBwcmludGYgKCJbc2VudCBhY2tdXG4iKTsKKyAgcmV0dXJuIGJwIC0gYnVmOworfQorCit2b2lkCit3cml0ZV9vayAoYnVmKQorICAgICBjaGFyICpidWY7Cit7CisgIGJ1ZlswXSA9ICdPJzsKKyAgYnVmWzFdID0gJ0snOworICBidWZbMl0gPSAnXDAnOworfQorCit2b2lkCit3cml0ZV9lbm4gKGJ1ZikKKyAgICAgY2hhciAqYnVmOworeworICBidWZbMF0gPSAnRSc7CisgIGJ1ZlsxXSA9ICdOJzsKKyAgYnVmWzJdID0gJ04nOworICBidWZbM10gPSAnXDAnOworfQorCit2b2lkCitjb252ZXJ0X2ludF90b19hc2NpaSAoZnJvbSwgdG8sIG4pCisgICAgIGNoYXIgKmZyb20sICp0bzsKKyAgICAgaW50IG47Cit7CisgIGludCBuaWI7CisgIGNoYXIgY2g7CisgIHdoaWxlIChuLS0pCisgICAgeworICAgICAgY2ggPSAqZnJvbSsrOworICAgICAgbmliID0gKChjaCAmIDB4ZjApID4+IDQpICYgMHgwZjsKKyAgICAgICp0bysrID0gdG9oZXggKG5pYik7CisgICAgICBuaWIgPSBjaCAmIDB4MGY7CisgICAgICAqdG8rKyA9IHRvaGV4IChuaWIpOworICAgIH0KKyAgKnRvKysgPSAwOworfQorCisKK3ZvaWQKK2NvbnZlcnRfYXNjaWlfdG9faW50IChmcm9tLCB0bywgbikKKyAgICAgY2hhciAqZnJvbSwgKnRvOworICAgICBpbnQgbjsKK3sKKyAgaW50IG5pYjEsIG5pYjI7CisgIHdoaWxlIChuLS0pCisgICAgeworICAgICAgbmliMSA9IGZyb21oZXggKCpmcm9tKyspOworICAgICAgbmliMiA9IGZyb21oZXggKCpmcm9tKyspOworICAgICAgKnRvKysgPSAoKChuaWIxICYgMHgwZikgPDwgNCkgJiAweGYwKSB8IChuaWIyICYgMHgwZik7CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqCitvdXRyZWcocmVnbm8sIGJ1ZikKKyAgICAgaW50IHJlZ25vOworICAgICBjaGFyICpidWY7Cit7CisgIGV4dGVybiBjaGFyIHJlZ2lzdGVyc1tdOworICBpbnQgcmVnc2l6ZSA9IFJFR0lTVEVSX1JBV19TSVpFIChyZWdubyk7CisKKyAgKmJ1ZisrID0gdG9oZXggKHJlZ25vID4+IDQpOworICAqYnVmKysgPSB0b2hleCAocmVnbm8gJiAweGYpOworICAqYnVmKysgPSAnOic7CisgIGNvbnZlcnRfaW50X3RvX2FzY2lpICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ25vKV0sIGJ1ZiwgcmVnc2l6ZSk7CisgIGJ1ZiArPSAyICogcmVnc2l6ZTsKKyAgKmJ1ZisrID0gJzsnOworCisgIHJldHVybiBidWY7Cit9CisKK3ZvaWQKK3ByZXBhcmVfcmVzdW1lX3JlcGx5IChidWYsIHN0YXR1cywgc2lnbm8pCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgY2hhciBzdGF0dXM7CisgICAgIHVuc2lnbmVkIGNoYXIgc2lnbm87Cit7CisgIGludCBuaWI7CisKKyAgKmJ1ZisrID0gc3RhdHVzOworCisgIC8qIEZJWE1FISAgU2hvdWxkIGJlIGNvbnZlcnRpbmcgdGhpcyBzaWduYWwgbnVtYmVyIChudW1iZXJlZAorICAgICBhY2NvcmRpbmcgdG8gdGhlIHNpZ25hbCBudW1iZXJpbmcgb2YgdGhlIHN5c3RlbSB3ZSBhcmUgcnVubmluZyBvbikKKyAgICAgdG8gdGhlIHNpZ25hbCBudW1iZXJzIHVzZWQgYnkgdGhlIGdkYiBwcm90b2NvbCAoc2VlIGVudW0gdGFyZ2V0X3NpZ25hbAorICAgICBpbiBnZGIvdGFyZ2V0LmgpLiAgKi8KKyAgbmliID0gKChzaWdubyAmIDB4ZjApID4+IDQpOworICAqYnVmKysgPSB0b2hleCAobmliKTsKKyAgbmliID0gc2lnbm8gJiAweDBmOworICAqYnVmKysgPSB0b2hleCAobmliKTsKKworICBpZiAoc3RhdHVzID09ICdUJykKKyAgICB7CisgICAgICBidWYgPSBvdXRyZWcgKFBDX1JFR05VTSwgYnVmKTsKKyAgICAgIGJ1ZiA9IG91dHJlZyAoRlBfUkVHTlVNLCBidWYpOworICAgICAgYnVmID0gb3V0cmVnIChTUF9SRUdOVU0sIGJ1Zik7CisjaWZkZWYgTlBDX1JFR05VTQorICAgICAgYnVmID0gb3V0cmVnIChOUENfUkVHTlVNLCBidWYpOworI2VuZGlmCisjaWZkZWYgTzdfUkVHTlVNCisgICAgICBidWYgPSBvdXRyZWcgKE83X1JFR05VTSwgYnVmKTsKKyNlbmRpZgorCisgICAgICAvKiBJZiB0aGUgZGVidWdnZXIgaGFzbid0IHVzZWQgYW55IHRocmVhZCBmZWF0dXJlcywgZG9uJ3QgYnVyZGVuIGl0IHdpdGgKKwkgdGhyZWFkcy4gIElmIHdlIGRpZG4ndCBjaGVjayB0aGlzLCBHREIgNC4xMyBhbmQgb2xkZXIgd291bGQgY2hva2UuICAqLworICAgICAgaWYgKGNvbnRfdGhyZWFkICE9IDApCisJeworCSAgaWYgKG9sZF90aHJlYWRfZnJvbV93YWl0ICE9IHRocmVhZF9mcm9tX3dhaXQpCisJICAgIHsKKwkgICAgICBzcHJpbnRmIChidWYsICJ0aHJlYWQ6JXg7IiwgdGhyZWFkX2Zyb21fd2FpdCk7CisJICAgICAgYnVmICs9IHN0cmxlbiAoYnVmKTsKKwkgICAgICBvbGRfdGhyZWFkX2Zyb21fd2FpdCA9IHRocmVhZF9mcm9tX3dhaXQ7CisJICAgIH0KKwl9CisgICAgfQorICAvKiBGb3IgVyBhbmQgWCwgd2UncmUgZG9uZS4gICovCisgICpidWYrKyA9IDA7Cit9CisKK3ZvaWQKK2RlY29kZV9tX3BhY2tldCAoZnJvbSwgbWVtX2FkZHJfcHRyLCBsZW5fcHRyKQorICAgICBjaGFyICpmcm9tOworICAgICBDT1JFX0FERFIgKm1lbV9hZGRyX3B0cjsKKyAgICAgdW5zaWduZWQgaW50ICpsZW5fcHRyOworeworICBpbnQgaSA9IDAsIGogPSAwOworICBjaGFyIGNoOworICAqbWVtX2FkZHJfcHRyID0gKmxlbl9wdHIgPSAwOworCisgIHdoaWxlICgoY2ggPSBmcm9tW2krK10pICE9ICcsJykKKyAgICB7CisgICAgICAqbWVtX2FkZHJfcHRyID0gKm1lbV9hZGRyX3B0ciA8PCA0OworICAgICAgKm1lbV9hZGRyX3B0ciB8PSBmcm9taGV4IChjaCkgJiAweDBmOworICAgIH0KKworICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgIHsKKyAgICAgIGlmICgoY2ggPSBmcm9tW2krK10pID09IDApCisJYnJlYWs7CisgICAgICAqbGVuX3B0ciA9ICpsZW5fcHRyIDw8IDQ7CisgICAgICAqbGVuX3B0ciB8PSBmcm9taGV4IChjaCkgJiAweDBmOworICAgIH0KK30KKwordm9pZAorZGVjb2RlX01fcGFja2V0IChmcm9tLCBtZW1fYWRkcl9wdHIsIGxlbl9wdHIsIHRvKQorICAgICBjaGFyICpmcm9tLCAqdG87CisgICAgIENPUkVfQUREUiAqbWVtX2FkZHJfcHRyOworICAgICB1bnNpZ25lZCBpbnQgKmxlbl9wdHI7Cit7CisgIGludCBpID0gMDsKKyAgY2hhciBjaDsKKyAgKm1lbV9hZGRyX3B0ciA9ICpsZW5fcHRyID0gMDsKKworICB3aGlsZSAoKGNoID0gZnJvbVtpKytdKSAhPSAnLCcpCisgICAgeworICAgICAgKm1lbV9hZGRyX3B0ciA9ICptZW1fYWRkcl9wdHIgPDwgNDsKKyAgICAgICptZW1fYWRkcl9wdHIgfD0gZnJvbWhleCAoY2gpICYgMHgwZjsKKyAgICB9CisKKyAgd2hpbGUgKChjaCA9IGZyb21baSsrXSkgIT0gJzonKQorICAgIHsKKyAgICAgICpsZW5fcHRyID0gKmxlbl9wdHIgPDwgNDsKKyAgICAgICpsZW5fcHRyIHw9IGZyb21oZXggKGNoKSAmIDB4MGY7CisgICAgfQorCisgIGNvbnZlcnRfYXNjaWlfdG9faW50ICgmZnJvbVtpKytdLCB0bywgKmxlbl9wdHIpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2dkYnNlcnZlci9zZXJ2ZXIuYyBiL2dkYi9nZGJzZXJ2ZXIvc2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RlYzBmOAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9nZGJzZXJ2ZXIvc2VydmVyLmMKQEAgLTAsMCArMSwyNTggQEAKKy8qIE1haW4gY29kZSBmb3IgcmVtb3RlIHNlcnZlciBmb3IgR0RCLgorICAgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJzZXJ2ZXIuaCIKKworaW50IGNvbnRfdGhyZWFkOworaW50IGdlbmVyYWxfdGhyZWFkOworaW50IHRocmVhZF9mcm9tX3dhaXQ7CitpbnQgb2xkX3RocmVhZF9mcm9tX3dhaXQ7CitpbnQgZXh0ZW5kZWRfcHJvdG9jb2w7CitqbXBfYnVmIHRvcGxldmVsOworaW50IGluZmVyaW9yX3BpZDsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIKK3N0YXJ0X2luZmVyaW9yIChhcmd2LCBzdGF0dXNwdHIpCisgICAgIGNoYXIgKmFyZ3ZbXTsKKyAgICAgY2hhciAqc3RhdHVzcHRyOworeworICBpbmZlcmlvcl9waWQgPSBjcmVhdGVfaW5mZXJpb3IgKGFyZ3ZbMF0sIGFyZ3YpOworICBmcHJpbnRmIChzdGRlcnIsICJQcm9jZXNzICVzIGNyZWF0ZWQ7IHBpZCA9ICVkXG4iLCBhcmd2WzBdLCBpbmZlcmlvcl9waWQpOworCisgIC8qIFdhaXQgdGlsbCB3ZSBhcmUgYXQgMXN0IGluc3RydWN0aW9uIGluIHByb2dyYW0sIHJldHVybiBzaWduYWwgbnVtYmVyLiAgKi8KKyAgcmV0dXJuIG15d2FpdCAoc3RhdHVzcHRyKTsKK30KKworZXh0ZXJuIGludCByZW1vdGVfZGVidWc7CisKK2ludAorbWFpbiAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKmFyZ3ZbXTsKK3sKKyAgY2hhciBjaCwgc3RhdHVzLCBvd25fYnVmWzIwMDBdLCBtZW1fYnVmWzIwMDBdOworICBpbnQgaSA9IDA7CisgIHVuc2lnbmVkIGNoYXIgc2lnbmFsOworICB1bnNpZ25lZCBpbnQgbGVuOworICBDT1JFX0FERFIgbWVtX2FkZHI7CisKKyAgaWYgKHNldGptcCh0b3BsZXZlbCkpCisgICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFeGl0aW5nXG4iKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorCisgIGlmIChhcmdjIDwgMykKKyAgICBlcnJvcigiVXNhZ2U6IGdkYnNlcnZlciB0dHkgcHJvZyBbYXJncyAuLi5dIik7CisKKyAgLyogV2FpdCB0aWxsIHdlIGFyZSBhdCBmaXJzdCBpbnN0cnVjdGlvbiBpbiBwcm9ncmFtLiAgKi8KKyAgc2lnbmFsID0gc3RhcnRfaW5mZXJpb3IgKCZhcmd2WzJdLCAmc3RhdHVzKTsKKworICAvKiBXZSBhcmUgbm93IHN0b3BwZWQgYXQgdGhlIGZpcnN0IGluc3RydWN0aW9uIG9mIHRoZSB0YXJnZXQgcHJvY2VzcyAqLworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIHJlbW90ZV9vcGVuIChhcmd2WzFdKTsKKworcmVzdGFydDoKKyAgICAgIHNldGptcCh0b3BsZXZlbCk7CisgICAgICB3aGlsZSAoZ2V0cGt0IChvd25fYnVmKSA+IDApCisJeworCSAgdW5zaWduZWQgY2hhciBzaWc7CisJICBpID0gMDsKKwkgIGNoID0gb3duX2J1ZltpKytdOworCSAgc3dpdGNoIChjaCkKKwkgICAgeworCSAgICBjYXNlICdkJzoKKwkgICAgICByZW1vdGVfZGVidWcgPSAhcmVtb3RlX2RlYnVnOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICchJzoKKwkgICAgICBleHRlbmRlZF9wcm90b2NvbCA9IDE7CisJICAgICAgcHJlcGFyZV9yZXN1bWVfcmVwbHkgKG93bl9idWYsIHN0YXR1cywgc2lnbmFsKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnPyc6CisJICAgICAgcHJlcGFyZV9yZXN1bWVfcmVwbHkgKG93bl9idWYsIHN0YXR1cywgc2lnbmFsKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnSCc6CisJICAgICAgc3dpdGNoIChvd25fYnVmWzFdKQorCQl7CisJCWNhc2UgJ2cnOgorCQkgIGdlbmVyYWxfdGhyZWFkID0gc3RydG9sICgmb3duX2J1ZlsyXSwgTlVMTCwgMTYpOworCQkgIHdyaXRlX29rIChvd25fYnVmKTsKKwkJICBmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKDApOworCQkgIGJyZWFrOworCQljYXNlICdjJzoKKwkJICBjb250X3RocmVhZCA9IHN0cnRvbCAoJm93bl9idWZbMl0sIE5VTEwsIDE2KTsKKwkJICB3cml0ZV9vayAob3duX2J1Zik7CisJCSAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgLyogU2lsZW50bHkgaWdub3JlIGl0IHNvIHRoYXQgZ2RiIGNhbiBleHRlbmQgdGhlIHByb3RvY29sCisJCSAgICAgd2l0aG91dCBjb21wYXRpYmlsaXR5IGhlYWRhY2hlcy4gICovCisJCSAgb3duX2J1ZlswXSA9ICdcMCc7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnZyc6CisJICAgICAgY29udmVydF9pbnRfdG9fYXNjaWkgKHJlZ2lzdGVycywgb3duX2J1ZiwgUkVHSVNURVJfQllURVMpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdHJzoKKwkgICAgICBjb252ZXJ0X2FzY2lpX3RvX2ludCAoJm93bl9idWZbMV0sIHJlZ2lzdGVycywgUkVHSVNURVJfQllURVMpOworCSAgICAgIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAoLTEpOworCSAgICAgIHdyaXRlX29rIChvd25fYnVmKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnbSc6CisJICAgICAgZGVjb2RlX21fcGFja2V0ICgmb3duX2J1ZlsxXSwgJm1lbV9hZGRyLCAmbGVuKTsKKwkgICAgICByZWFkX2luZmVyaW9yX21lbW9yeSAobWVtX2FkZHIsIG1lbV9idWYsIGxlbik7CisJICAgICAgY29udmVydF9pbnRfdG9fYXNjaWkgKG1lbV9idWYsIG93bl9idWYsIGxlbik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ00nOgorCSAgICAgIGRlY29kZV9NX3BhY2tldCAoJm93bl9idWZbMV0sICZtZW1fYWRkciwgJmxlbiwgbWVtX2J1Zik7CisJICAgICAgaWYgKHdyaXRlX2luZmVyaW9yX21lbW9yeSAobWVtX2FkZHIsIG1lbV9idWYsIGxlbikgPT0gMCkKKwkJd3JpdGVfb2sgKG93bl9idWYpOworCSAgICAgIGVsc2UKKwkJd3JpdGVfZW5uIChvd25fYnVmKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnQyc6CisJICAgICAgY29udmVydF9hc2NpaV90b19pbnQgKG93bl9idWYgKyAxLCAmc2lnLCAxKTsKKwkgICAgICBteXJlc3VtZSAoMCwgc2lnKTsKKwkgICAgICBzaWduYWwgPSBteXdhaXQgKCZzdGF0dXMpOworCSAgICAgIHByZXBhcmVfcmVzdW1lX3JlcGx5IChvd25fYnVmLCBzdGF0dXMsIHNpZ25hbCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ1MnOgorCSAgICAgIGNvbnZlcnRfYXNjaWlfdG9faW50IChvd25fYnVmICsgMSwgJnNpZywgMSk7CisJICAgICAgbXlyZXN1bWUgKDEsIHNpZyk7CisJICAgICAgc2lnbmFsID0gbXl3YWl0ICgmc3RhdHVzKTsKKwkgICAgICBwcmVwYXJlX3Jlc3VtZV9yZXBseSAob3duX2J1Ziwgc3RhdHVzLCBzaWduYWwpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdjJzoKKwkgICAgICBteXJlc3VtZSAoMCwgMCk7CisJICAgICAgc2lnbmFsID0gbXl3YWl0ICgmc3RhdHVzKTsKKwkgICAgICBwcmVwYXJlX3Jlc3VtZV9yZXBseSAob3duX2J1Ziwgc3RhdHVzLCBzaWduYWwpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdzJzoKKwkgICAgICBteXJlc3VtZSAoMSwgMCk7CisJICAgICAgc2lnbmFsID0gbXl3YWl0ICgmc3RhdHVzKTsKKwkgICAgICBwcmVwYXJlX3Jlc3VtZV9yZXBseSAob3duX2J1Ziwgc3RhdHVzLCBzaWduYWwpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdrJzoKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsICJLaWxsaW5nIGluZmVyaW9yXG4iKTsKKwkgICAgICBraWxsX2luZmVyaW9yICgpOworCSAgICAgIC8qIFdoZW4gdXNpbmcgdGhlIGV4dGVuZGVkIHByb3RvY29sLCB3ZSBzdGFydCB1cCBhIG5ldworCQkgZGVidWdnaW5nIHNlc3Npb24uICAgVGhlIHRyYWRpdGlvbmFsIHByb3RvY29sIHdpbGwKKwkgICAgICAgICBleGl0IGluc3RlYWQuICAqLworCSAgICAgIGlmIChleHRlbmRlZF9wcm90b2NvbCkKKwkJeworCQkgIHdyaXRlX29rIChvd25fYnVmKTsKKwkJICBmcHJpbnRmIChzdGRlcnIsICJHREJzZXJ2ZXIgcmVzdGFydGluZ1xuIik7CisKKwkJICAvKiBXYWl0IHRpbGwgd2UgYXJlIGF0IDFzdCBpbnN0cnVjdGlvbiBpbiBwcm9nLiAgKi8KKwkJICBzaWduYWwgPSBzdGFydF9pbmZlcmlvciAoJmFyZ3ZbMl0sICZzdGF0dXMpOworCQkgIGdvdG8gcmVzdGFydDsKKwkJICBicmVhazsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGV4aXQgKDApOworCQkgIGJyZWFrOworCQl9CisJICAgIGNhc2UgJ1QnOgorCSAgICAgIGlmIChteXRocmVhZF9hbGl2ZSAoc3RydG9sICgmb3duX2J1ZlsxXSwgTlVMTCwgMTYpKSkKKwkJd3JpdGVfb2sgKG93bl9idWYpOworCSAgICAgIGVsc2UKKwkJd3JpdGVfZW5uIChvd25fYnVmKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnUic6CisJICAgICAgLyogUmVzdGFydGluZyB0aGUgaW5mZXJpb3IgaXMgb25seSBzdXBwb3J0ZWQgaW4gdGhlCisJCSBleHRlbmRlZCBwcm90b2NvbC4gICovCisJICAgICAgaWYgKGV4dGVuZGVkX3Byb3RvY29sKQorCQl7CisJCSAga2lsbF9pbmZlcmlvciAoKTsKKwkJICB3cml0ZV9vayAob3duX2J1Zik7CisJCSAgZnByaW50ZiAoc3RkZXJyLCAiR0RCc2VydmVyIHJlc3RhcnRpbmdcbiIpOworCisJCSAgLyogV2FpdCB0aWxsIHdlIGFyZSBhdCAxc3QgaW5zdHJ1Y3Rpb24gaW4gcHJvZy4gICovCisJCSAgc2lnbmFsID0gc3RhcnRfaW5mZXJpb3IgKCZhcmd2WzJdLCAmc3RhdHVzKTsKKwkJICBnb3RvIHJlc3RhcnQ7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiBJdCBpcyBhIHJlcXVlc3Qgd2UgZG9uJ3QgdW5kZXJzdGFuZC4gIFJlc3BvbmQgd2l0aCBhbgorCQkgICAgIGVtcHR5IHBhY2tldCBzbyB0aGF0IGdkYiBrbm93cyB0aGF0IHdlIGRvbid0IHN1cHBvcnQgdGhpcworCQkgICAgIHJlcXVlc3QuICAqLworCQkgIG93bl9idWZbMF0gPSAnXDAnOworCQkgIGJyZWFrOworCQl9CisJICAgIGRlZmF1bHQ6CisJICAgICAgLyogSXQgaXMgYSByZXF1ZXN0IHdlIGRvbid0IHVuZGVyc3RhbmQuICBSZXNwb25kIHdpdGggYW4KKwkJIGVtcHR5IHBhY2tldCBzbyB0aGF0IGdkYiBrbm93cyB0aGF0IHdlIGRvbid0IHN1cHBvcnQgdGhpcworCQkgcmVxdWVzdC4gICovCisJICAgICAgb3duX2J1ZlswXSA9ICdcMCc7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgcHV0cGt0IChvd25fYnVmKTsKKworCSAgaWYgKHN0YXR1cyA9PSAnVycpCisJICAgIGZwcmludGYgKHN0ZGVyciwKKwkJICAgICAiXG5DaGlsZCBleGl0ZWQgd2l0aCBzdGF0dXMgJWRcbiIsIHNpZyk7CisJICBpZiAoc3RhdHVzID09ICdYJykKKwkgICAgZnByaW50ZiAoc3RkZXJyLCAiXG5DaGlsZCB0ZXJtaW5hdGVkIHdpdGggc2lnbmFsID0gMHgleFxuIiwgc2lnKTsKKwkgIGlmIChzdGF0dXMgPT0gJ1cnIHx8IHN0YXR1cyA9PSAnWCcpCisJICAgIHsKKwkgICAgICBpZiAoZXh0ZW5kZWRfcHJvdG9jb2wpCisJCXsKKwkJICBmcHJpbnRmIChzdGRlcnIsICJLaWxsaW5nIGluZmVyaW9yXG4iKTsKKwkJICBraWxsX2luZmVyaW9yICgpOworCQkgIHdyaXRlX29rIChvd25fYnVmKTsKKwkJICBmcHJpbnRmIChzdGRlcnIsICJHREJzZXJ2ZXIgcmVzdGFydGluZ1xuIik7CisKKwkJICAvKiBXYWl0IHRpbGwgd2UgYXJlIGF0IDFzdCBpbnN0cnVjdGlvbiBpbiBwcm9nLiAgKi8KKwkJICBzaWduYWwgPSBzdGFydF9pbmZlcmlvciAoJmFyZ3ZbMl0sICZzdGF0dXMpOworCQkgIGdvdG8gcmVzdGFydDsKKwkJICBicmVhazsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGZwcmludGYgKHN0ZGVyciwgIkdEQnNlcnZlciBleGl0aW5nXG4iKTsKKwkJICBleGl0ICgwKTsKKwkJfQorCSAgICB9CisJfQorCisgICAgICAvKiBXZSBjb21lIGhlcmUgd2hlbiBnZXRwa3QgZmFpbHMuCisKKwkgRm9yIHRoZSBleHRlbmRlZCByZW1vdGUgcHJvdG9jb2wgd2UgZXhpdCAoYW5kIHRoaXMgaXMgdGhlIG9ubHkKKwkgd2F5IHdlIGdyYWNlZnVsbHkgZXhpdCEpLgorCisJIEZvciB0aGUgdHJhZGl0aW9uYWwgcmVtb3RlIHByb3RvY29sIGNsb3NlIHRoZSBjb25uZWN0aW9uLAorCSBhbmQgcmUtb3BlbiBpdCBhdCB0aGUgdG9wIG9mIHRoZSBsb29wLiAgKi8KKyAgICAgIGlmIChleHRlbmRlZF9wcm90b2NvbCkKKwl7CisJICByZW1vdGVfY2xvc2UgKCk7CisJICBleGl0ICgwKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiUmVtb3RlIHNpZGUgaGFzIHRlcm1pbmF0ZWQgY29ubmVjdGlvbi4gIEdEQnNlcnZlciB3aWxsIHJlb3BlbiB0aGUgY29ubmVjdGlvbi5cbiIpOworCisJICByZW1vdGVfY2xvc2UgKCk7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dkYi9nZGJzZXJ2ZXIvc2VydmVyLmggYi9nZGIvZ2Ric2VydmVyL3NlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyM2M3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZ2Ric2VydmVyL3NlcnZlci5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIENvbW1vbiBkZWZpbml0aW9ucyBmb3IgcmVtb3RlIHNlcnZlciBmb3IgR0RCLgorICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSA8c2V0am1wLmg+CisKKy8qIFRhcmdldC1zcGVjaWZpYyBmdW5jdGlvbnMgKi8KKworaW50IGNyZWF0ZV9pbmZlcmlvciBQQVJBTVMgKChjaGFyICpwcm9ncmFtLCBjaGFyICoqYWxsYXJncykpOwordm9pZCBraWxsX2luZmVyaW9yIFBBUkFNUyAoKHZvaWQpKTsKK3ZvaWQgZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIFBBUkFNUyAoKGludCByZWdubykpOwordm9pZCBzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgUEFSQU1TICgoaW50IHJlZ25vKSk7CitpbnQgbXl0aHJlYWRfYWxpdmUgUEFSQU1TICgoaW50IHBpZCkpOwordm9pZCBteXJlc3VtZSBQQVJBTVMgKChpbnQgc3RlcCwgaW50IHNpZ25vKSk7Cit1bnNpZ25lZCBjaGFyIG15d2FpdCBQQVJBTVMgKChjaGFyICpzdGF0dXMpKTsKK3ZvaWQgcmVhZF9pbmZlcmlvcl9tZW1vcnkgUEFSQU1TICgoQ09SRV9BRERSIG1lbWFkZHIsIGNoYXIgKm15YWRkciwgaW50IGxlbikpOworaW50IHdyaXRlX2luZmVyaW9yX21lbW9yeSBQQVJBTVMgKChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLCBpbnQgbGVuKSk7CitpbnQgY3JlYXRlX2luZmVyaW9yICgpOworCisvKiBUYXJnZXQtc3BlY2lmaWMgdmFyaWFibGVzICovCisKK2V4dGVybiBjaGFyIHJlZ2lzdGVyc1tdOworCisvKiBQdWJsaWMgdmFyaWFibGVzIGluIHNlcnZlci5jICovCisKK2V4dGVybiBpbnQgY29udF90aHJlYWQ7CitleHRlcm4gaW50IGdlbmVyYWxfdGhyZWFkOworZXh0ZXJuIGludCB0aHJlYWRfZnJvbV93YWl0OworZXh0ZXJuIGludCBvbGRfdGhyZWFkX2Zyb21fd2FpdDsKKworZXh0ZXJuIGptcF9idWYgdG9wbGV2ZWw7CitleHRlcm4gaW50IGluZmVyaW9yX3BpZDsKKworLyogRnVuY3Rpb25zIGZyb20gcmVtb3RlLXV0aWxzLmMgKi8KKworaW50IHB1dHBrdCBQQVJBTVMgKChjaGFyICpidWYpKTsKK2ludCBnZXRwa3QgUEFSQU1TICgoY2hhciAqYnVmKSk7Cit2b2lkIHJlbW90ZV9vcGVuIFBBUkFNUyAoKGNoYXIgKm5hbWUpKTsKK3ZvaWQgcmVtb3RlX2Nsb3NlIFBBUkFNUyAoKHZvaWQpKTsKK3ZvaWQgd3JpdGVfb2sgUEFSQU1TICgoY2hhciAqYnVmKSk7Cit2b2lkIHdyaXRlX2VubiBQQVJBTVMgKChjaGFyICpidWYpKTsKK3ZvaWQgZW5hYmxlX2FzeW5jX2lvIFBBUkFNUyAoKHZvaWQpKTsKK3ZvaWQgZGlzYWJsZV9hc3luY19pbyBQQVJBTVMgKCh2b2lkKSk7Cit2b2lkIGNvbnZlcnRfYXNjaWlfdG9faW50IFBBUkFNUyAoKGNoYXIgKmZyb20sIGNoYXIgKnRvLCBpbnQgbikpOwordm9pZCBjb252ZXJ0X2ludF90b19hc2NpaSBQQVJBTVMgKChjaGFyICpmcm9tLCBjaGFyICp0bywgaW50IG4pKTsKK3ZvaWQgcHJlcGFyZV9yZXN1bWVfcmVwbHkgUEFSQU1TICgoY2hhciAqYnVmLCBjaGFyIHN0YXR1cywgdW5zaWduZWQgY2hhciBzaWcpKTsKKwordm9pZCBkZWNvZGVfbV9wYWNrZXQgUEFSQU1TICgoY2hhciAqZnJvbSwgQ09SRV9BRERSICptZW1fYWRkcl9wdHIsCisJCQkgICAgIHVuc2lnbmVkIGludCAqbGVuX3B0cikpOwordm9pZCBkZWNvZGVfTV9wYWNrZXQgUEFSQU1TICgoY2hhciAqZnJvbSwgQ09SRV9BRERSICptZW1fYWRkcl9wdHIsCisJCQkgICAgIHVuc2lnbmVkIGludCAqbGVuX3B0ciwgY2hhciAqdG8pKTsKKworCisvKiBGdW5jdGlvbnMgZnJvbSB1dGlscy5jICovCisKK3ZvaWQgcGVycm9yX3dpdGhfbmFtZSBQQVJBTVMgKChjaGFyICpzdHJpbmcpKTsKZGlmZiAtLWdpdCBhL2dkYi9nZGJzZXJ2ZXIvdXRpbHMuYyBiL2dkYi9nZGJzZXJ2ZXIvdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2Q1MjJjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2dkYnNlcnZlci91dGlscy5jCkBAIC0wLDAgKzEsMTE0IEBACisvKiBHZW5lcmFsIHV0aWxpdHkgcm91dGluZXMgZm9yIHRoZSByZW1vdGUgc2VydmVyIGZvciBHREIuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODksIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgInNlcnZlci5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIEdlbmVyYWxseSB1c2VmdWwgc3Vicm91dGluZXMgdXNlZCB0aHJvdWdob3V0IHRoZSBwcm9ncmFtLiAgKi8KKworLyogUHJpbnQgdGhlIHN5c3RlbSBlcnJvciBtZXNzYWdlIGZvciBlcnJubywgYW5kIGFsc28gbWVudGlvbiBTVFJJTkcKKyAgIGFzIHRoZSBmaWxlIG5hbWUgZm9yIHdoaWNoIHRoZSBlcnJvciB3YXMgZW5jb3VudGVyZWQuCisgICBUaGVuIHJldHVybiB0byBjb21tYW5kIGxldmVsLiAgKi8KKwordm9pZAorcGVycm9yX3dpdGhfbmFtZSAoc3RyaW5nKQorICAgICBjaGFyICpzdHJpbmc7Cit7CisgIGV4dGVybiBpbnQgc3lzX25lcnI7CisgIGV4dGVybiBjaGFyICpzeXNfZXJybGlzdFtdOworICBleHRlcm4gaW50IGVycm5vOworICBjaGFyICplcnI7CisgIGNoYXIgKmNvbWJpbmVkOworCisgIGlmIChlcnJubyA8IHN5c19uZXJyKQorICAgIGVyciA9IHN5c19lcnJsaXN0W2Vycm5vXTsKKyAgZWxzZQorICAgIGVyciA9ICJ1bmtub3duIGVycm9yIjsKKworICBjb21iaW5lZCA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChlcnIpICsgc3RybGVuIChzdHJpbmcpICsgMyk7CisgIHN0cmNweSAoY29tYmluZWQsIHN0cmluZyk7CisgIHN0cmNhdCAoY29tYmluZWQsICI6ICIpOworICBzdHJjYXQgKGNvbWJpbmVkLCBlcnIpOworCisgIGVycm9yICgiJXMuIiwgY29tYmluZWQpOworfQorCisvKiBQcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm4gdG8gY29tbWFuZCBsZXZlbC4KKyAgIFNUUklORyBpcyB0aGUgZXJyb3IgbWVzc2FnZSwgdXNlZCBhcyBhIGZwcmludGYgc3RyaW5nLAorICAgYW5kIEFSRyBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gaXQuICAqLworCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCitOT1JFVFVSTiB2b2lkCitlcnJvciAoY29uc3QgY2hhciAqc3RyaW5nLCAuLi4pCisjZWxzZQordm9pZAorZXJyb3IgKHZhX2FsaXN0KQorICAgICB2YV9kY2wKKyNlbmRpZgoreworICBleHRlcm4gam1wX2J1ZiB0b3BsZXZlbDsKKyAgdmFfbGlzdCBhcmdzOworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworICB2YV9zdGFydCAoYXJncywgc3RyaW5nKTsKKyNlbHNlCisgIHZhX3N0YXJ0IChhcmdzKTsKKyNlbmRpZgorICBmZmx1c2ggKHN0ZG91dCk7CisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisgIHZmcHJpbnRmIChzdGRlcnIsIHN0cmluZywgYXJncyk7CisjZWxzZQorICB7CisgICAgY2hhciAqc3RyaW5nMTsKKworICAgIHN0cmluZzEgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7CisgICAgdmZwcmludGYgKHN0ZGVyciwgc3RyaW5nMSwgYXJncyk7CisgIH0KKyNlbmRpZgorICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworICBsb25nam1wKHRvcGxldmVsLCAxKTsKK30KKworLyogUHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgZXhpdCByZXBvcnRpbmcgZmFpbHVyZS4KKyAgIFRoaXMgaXMgZm9yIGEgZXJyb3IgdGhhdCB3ZSBjYW5ub3QgY29udGludWUgZnJvbS4KKyAgIFNUUklORyBhbmQgQVJHIGFyZSBwYXNzZWQgdG8gZnByaW50Zi4gICovCisKKy8qIFZBUkFSR1MgKi8KK05PUkVUVVJOIHZvaWQKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKK2ZhdGFsIChjaGFyICpzdHJpbmcsIC4uLikKKyNlbHNlCitmYXRhbCAodmFfYWxpc3QpCisgICAgIHZhX2RjbAorI2VuZGlmCit7CisgIHZhX2xpc3QgYXJnczsKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyAgdmFfc3RhcnQgKGFyZ3MsIHN0cmluZyk7CisjZWxzZQorICBjaGFyICpzdHJpbmc7CisgIHZhX3N0YXJ0IChhcmdzKTsKKyAgc3RyaW5nID0gdmFfYXJnIChhcmdzLCBjaGFyICopOworI2VuZGlmCisgIGZwcmludGYgKHN0ZGVyciwgImdkYjogIik7CisgIHZmcHJpbnRmIChzdGRlcnIsIHN0cmluZywgYXJncyk7CisgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7CisgIHZhX2VuZCAoYXJncyk7CisgIGV4aXQgKDEpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2dkYnRocmVhZC5oIGIvZ2RiL2dkYnRocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1M2RkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZ2RidGhyZWFkLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qIE11bHRpLXByb2Nlc3MvdGhyZWFkIGNvbnRyb2wgZGVmcyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5ODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgMTk5MywgMTk5OAorCisgICBDb250cmlidXRlZCBieSBMeW54IFJlYWwtVGltZSBTeXN0ZW1zLCBJbmMuICBMb3MgR2F0b3MsIENBLgorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBHREJUSFJFQURfSAorI2RlZmluZSBHREJUSFJFQURfSAorCisvKiBGb3IgYnBzdGF0ICovCisjaW5jbHVkZSAiYnJlYWtwb2ludC5oIgorCitleHRlcm4gdm9pZCBpbml0X3RocmVhZF9saXN0IFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgYWRkX3RocmVhZCBQQVJBTVMgKChpbnQgcGlkKSk7CisKK2V4dGVybiB2b2lkIGRlbGV0ZV90aHJlYWQgUEFSQU1TICgoaW50KSk7CisgIAorZXh0ZXJuIGludCB0aHJlYWRfaWRfdG9fcGlkIFBBUkFNUyAoKGludCkpOworCitleHRlcm4gaW50IGluX3RocmVhZF9saXN0IFBBUkFNUyAoKGludCBwaWQpKTsKKworZXh0ZXJuIGludCBwaWRfdG9fdGhyZWFkX2lkIFBBUkFNUyAoKGludCBwaWQpKTsKKworZXh0ZXJuIGludCB2YWxpZF90aHJlYWRfaWQgUEFSQU1TICgoaW50IHRocmVhZCkpOworCitleHRlcm4gdm9pZCBsb2FkX2luZnJ1bl9zdGF0ZSBQQVJBTVMgKChpbnQsIENPUkVfQUREUiAqLCBDT1JFX0FERFIgKiwgY2hhciAqKiwKKwkJCQkgICAgICAgaW50ICosIHN0cnVjdCBicmVha3BvaW50ICoqLAorCQkJCSAgICAgICBzdHJ1Y3QgYnJlYWtwb2ludCAqKiwgQ09SRV9BRERSICosCisJCQkJICAgICAgIENPUkVfQUREUiAqLCBDT1JFX0FERFIgKiwgaW50ICosIGludCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICosIGJwc3RhdCAqLCBpbnQgKikpOworCitleHRlcm4gdm9pZCBzYXZlX2luZnJ1bl9zdGF0ZSBQQVJBTVMgKChpbnQsIENPUkVfQUREUiwgQ09SRV9BRERSLCBjaGFyICosCisJCQkJICAgICAgIGludCwgc3RydWN0IGJyZWFrcG9pbnQgKiwKKwkJCQkgICAgICAgc3RydWN0IGJyZWFrcG9pbnQgKiwgQ09SRV9BRERSLAorCQkJCSAgICAgICBDT1JFX0FERFIsIENPUkVfQUREUiwgaW50LCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIGJwc3RhdCwgaW50KSk7CisKKy8qIENvbW1hbmRzIHdpdGggYSBwcmVmaXggb2YgYHRocmVhZCcuICAqLworZXh0ZXJuIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICp0aHJlYWRfY21kX2xpc3Q7CisKKy8qIFN1cHBvcnQgZm9yIGV4dGVybmFsIChyZW1vdGUpIHN5c3RlbXMgd2l0aCB0aHJlYWRzIChwcm9jZXNzZXMpICovCisvKiBGb3IgZXhhbXBsZSByZWFsIHRpbWUgb3BlcmF0aW5nIHN5c3RlbXMgKi8KKyAKKyNkZWZpbmUgT1BBUVVFVEhSRUFEQllURVMgOAorLyogYSA2NCBiaXQgb3BhcXVlIGlkZW50aWZpZXIgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciB0aHJlYWRyZWZbT1BBUVVFVEhSRUFEQllURVNdIDsKKy8qIFdBUk5JTkc6IFRoaXMgdGhyZWFkcmVmIGRhdGEgc3RydWN0dXJlIGNvbWVzIGZyb20gdGhlIHJlbW90ZSBPLlMuLCBsaWJzdHViCisgICBwcm90b2NvbCBlbmNvZGluZywgYW5kIHJlbW90ZS5jLiBpdCBpcyBub3QgcGFydGljdWxhcmx5IGNoYW5nYWJsZSAqLworCisvKiBSaWdodCBub3csIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgaW50LiBXZSB3YW50IGl0IHRvIGJlIGJpZ2dlci4KKyAgIFBsYW4gdG8gZml4IHRoaXMuCisgICAqLwordHlwZWRlZiBpbnQgZ2RiX3RocmVhZHJlZiA7IC8qIGludGVybmFsIEdEQiB0aHJlYWQgcmVmZXJlbmNlICovCisKKy8qICBnZGJfZXh0X3RocmVhZF9pbmZvIGlzIGFuIGludGVybmFsIEdEQiBkYXRhIHN0cnVjdHVyZSB3aGljaCBpcworICAgZXF1aXZhbGludCB0byB0aGUgcmVwbHkgb2YgdGhlIHJlbW90ZSB0aHJlYWRpbmZvIHBhY2tldCAqLworCitzdHJ1Y3QgZ2RiX2V4dF90aHJlYWRfaW5mbworeworICB0aHJlYWRyZWYgdGhyZWFkaWQgOyAvKiBFeHRlcm5hbCBmb3JtIG9mIHRocmVhZCByZWZlcmVuY2UgKi8KKyAgaW50IGFjdGl2ZSA7ICAgICAgICAgLyogSGFzIHN0YXRlIGludGVyZXN0aW5nIHRvIEdEQj8gLCByZWdzLCBzdGFjayAqLworICBjaGFyIGRpc3BsYXlbMjU2XSA7ICAvKiBCcmllZiBzdGF0ZSBkaXNwbGF5LCBuYW1lLCBibG9ja2VkL3N5c3BlbmRlZCAqLworICBjaGFyIHNob3J0bmFtZVszMl0gOyAvKiBUbyBiZSB1c2VkIHRvIG5hbWUgdGhyZWFkcyAqLworICBjaGFyIG1vcmVfZGlzcGxheVsyNTZdIDsgLyogTG9uZyBpbmZvLCBzdGF0aXN0aWNzLCBxdWV1ZSBkZXB0aCwgd2hhdGV2ZXIgKi8KK30gOworCisvKiBUaGUgdm9sdW1lIG9mIHJlbW90ZSB0cmFuc2ZlcnMgY2FuIGJlIGxpbWl0ZWQgYnkgc3VibWl0dGluZworICAgYSBtYXNrIGNvbnRhaW5pbmcgYml0cyBzcGVjaWZ5aW5nIHRoZSBkZXNpcmVkIGluZm9ybWF0aW9uLgorICAgVXNlIGEgdW5pb24gb2YgdGhlc2UgdmFsdWVzIGFzIHRoZSAnc2VsZWN0aW9uJyBwYXJhbWV0ZXIgdG8KKyAgIGdldF90aHJlYWRfaW5mby4gRklYTUU6IE1ha2UgdGhlc2UgVEFHIG5hbWVzIG1vcmUgdGhyZWFkIHNwZWNpZmljLgorICAgKi8KKyNkZWZpbmUgVEFHX1RIUkVBRElEIDEKKyNkZWZpbmUgVEFHX0VYSVNUUyAyCisjZGVmaW5lIFRBR19ESVNQTEFZIDQKKyNkZWZpbmUgVEFHX1RIUkVBRE5BTUUgOAorI2RlZmluZSBUQUdfTU9SRURJU1BMQVkgMTYgCisKKy8qIEFsd2F5cyBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlIHVzaW5nIHJ1biB0aW1lIGFzc2lnbm1lbnRzICovCisvKiBCZWNhdXNlIHdlIGFyZSBsaWtlbHkgdG8gYWRkIGVudHJ0cmllcyB0byBpdC4gKi8KKy8qIEFsdGVybmF0bHksIFdFIENPVUxEIEFERCBUSEVTRSBUTyBUSEUgVEFSR0VUIFZFQ1RPUiAqLworICAKK3N0cnVjdCB0YXJnZXRfdGhyZWFkX3ZlY3RvcgoreworICBpbnQgKCpmaW5kX25ld190aHJlYWRzKVBBUkFNUygodm9pZCkpIDsKKyAgaW50ICgqZ2V0X3RocmVhZF9pbmZvKSBQQVJBTVMoKAorCQkJIGdkYl90aHJlYWRyZWYgKiByZWYsCisJCQkgaW50IHNlbGVjdGlvbiwKKwkJCSBzdHJ1Y3QgZ2RiX2V4dF90aHJlYWRfaW5mbyAqIGluZm8KKwkJCSApKSA7CisgIC8qIHRvX3RocmVhZF9hbGl2ZSAtIEFscmVhZHkgaW4gdGhlIHRhcmdldCB2ZWN0b3IgKi8KKyAgLyogdG9fc3dpdGNoX3RocmVhZCAtIERvbmUgdmlhIHNlbGVjdCBmcmFtZSAqLworfSA7CisKK2V4dGVybiB2b2lkIGJpbmRfdGFyZ2V0X3RocmVhZF92ZWN0b3IgUEFSQU1TKChzdHJ1Y3QgdGFyZ2V0X3RocmVhZF92ZWN0b3IgKiB2ZWMpKSA7CisKK2V4dGVybiBzdHJ1Y3QgdGFyZ2V0X3RocmVhZF92ZWN0b3IgKiB1bmJpbmRfdGFyZ2V0X3RocmVhZF92ZWN0b3IgUEFSQU1TICgodm9pZCkpIDsKKworZXh0ZXJuIGludCB0YXJnZXRfZ2V0X3RocmVhZF9pbmZvIFBBUkFNUygoCisJCQkJICBnZGJfdGhyZWFkcmVmICogcmVmLAorCQkJCSAgaW50IHNlbGVjdGlvbiwKKwkJCQkgIHN0cnVjdCBnZGJfZXh0X3RocmVhZF9pbmZvICogaW5mbykpIDsKKworCisjZW5kaWYJLyogR0RCVEhSRUFEX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9nZGJ0eXBlcy5jIGIvZ2RiL2dkYnR5cGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5MzQ2MgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9nZGJ0eXBlcy5jCkBAIC0wLDAgKzEsMjkwNSBAQAorLyogU3VwcG9ydCByb3V0aW5lcyBmb3IgbWFuaXB1bGF0aW5nIGludGVybmFsIHR5cGVzIGZvciBHREIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQsIHVzaW5nIHBpZWNlcyBmcm9tIG90aGVyIEdEQiBtb2R1bGVzLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIKKyNpbmNsdWRlICJvYmpmaWxlcy5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJkZW1hbmdsZS5oIgorI2luY2x1ZGUgImNvbXBsYWludHMuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKworLyogVGhlc2UgdmFyaWFibGVzIHBvaW50IHRvIHRoZSBvYmplY3RzCisgICByZXByZXNlbnRpbmcgdGhlIHByZWRlZmluZWQgQyBkYXRhIHR5cGVzLiAgKi8KKworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV92b2lkOworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9jaGFyOworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9zaG9ydDsKK3N0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfaW50Oworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9sb25nOworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9sb25nX2xvbmc7CitzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX3NpZ25lZF9jaGFyOworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV91bnNpZ25lZF9jaGFyOworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV91bnNpZ25lZF9zaG9ydDsKK3N0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfdW5zaWduZWRfaW50Oworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV91bnNpZ25lZF9sb25nOworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV91bnNpZ25lZF9sb25nX2xvbmc7CitzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2Zsb2F0Oworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9kb3VibGU7CitzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2xvbmdfZG91YmxlOworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9jb21wbGV4Oworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9kb3VibGVfY29tcGxleDsKK3N0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfc3RyaW5nOworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9pbnQ4Oworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV91aW50ODsKK3N0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfaW50MTY7CitzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX3VpbnQxNjsKK3N0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfaW50MzI7CitzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX3VpbnQzMjsKK3N0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfaW50NjQ7CitzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX3VpbnQ2NDsKK3N0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfYm9vbDsKKworaW50IG9wYXF1ZV90eXBlX3Jlc29sdXRpb24gPSAxOworCisKK3N0cnVjdCBleHRyYSB7IGNoYXIgc3RyWzEyOF07IGludCBsZW47IH07IC8qIG1heGltdW0gZXh0ZW50aW9uIGlzIDEyOCEgRklYTUUgKi8KKworc3RhdGljIHZvaWQgYWRkX25hbWUgUEFSQU1TICgoc3RydWN0IGV4dHJhICosIGNoYXIgKikpOworc3RhdGljIHZvaWQgYWRkX21hbmdsZWRfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgZXh0cmEgKiwgc3RydWN0IHR5cGUgKikpOworI2lmIDAKK3N0YXRpYyB2b2lkIGNmcm9udF9tYW5nbGVfbmFtZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBpbnQsIGludCkpOworI2VuZGlmCitzdGF0aWMgdm9pZCBwcmludF9iaXRfdmVjdG9yIFBBUkFNUyAoKEJfVFlQRSAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIHByaW50X2FyZ190eXBlcyBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKiwgaW50KSk7CitzdGF0aWMgdm9pZCBkdW1wX2ZuX2ZpZWxkbGlzdHMgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBwcmludF9jcGx1c19zdHVmZiBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBpbnQpKTsKKworLyogQWxsb2MgYSBuZXcgdHlwZSBzdHJ1Y3R1cmUgYW5kIGZpbGwgaXQgd2l0aCBzb21lIGRlZmF1bHRzLiAgSWYKKyAgIE9CSkZJTEUgaXMgbm9uLU5VTEwsIHRoZW4gYWxsb2NhdGUgdGhlIHNwYWNlIGZvciB0aGUgdHlwZSBzdHJ1Y3R1cmUKKyAgIGluIHRoYXQgb2JqZmlsZSdzIHR5cGVfb2JzdGFjay4gKi8KKworc3RydWN0IHR5cGUgKgorYWxsb2NfdHlwZSAob2JqZmlsZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCB0eXBlICp0eXBlOworCisgIC8qIEFsbG9jIHRoZSBzdHJ1Y3R1cmUgYW5kIHN0YXJ0IG9mZiB3aXRoIGFsbCBmaWVsZHMgemVyb2VkLiAqLworCisgIGlmIChvYmpmaWxlID09IE5VTEwpCisgICAgeworICAgICAgdHlwZSAgPSAoc3RydWN0IHR5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgdHlwZSkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHR5cGUgID0gKHN0cnVjdCB0eXBlICopIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlIC0+IHR5cGVfb2JzdGFjaywKKwkJCQkJICAgICBzaXplb2YgKHN0cnVjdCB0eXBlKSk7CisgICAgICBPQkpTVEFUIChvYmpmaWxlLCBuX3R5cGVzKyspOworICAgIH0KKyAgbWVtc2V0ICgoY2hhciAqKSB0eXBlLCAwLCBzaXplb2YgKHN0cnVjdCB0eXBlKSk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgZmllbGRzIHRoYXQgbWlnaHQgbm90IGJlIHplcm8uICovCisKKyAgVFlQRV9DT0RFICh0eXBlKSA9IFRZUEVfQ09ERV9VTkRFRjsKKyAgVFlQRV9PQkpGSUxFICh0eXBlKSA9IG9iamZpbGU7CisgIFRZUEVfVlBUUl9GSUVMRE5PICh0eXBlKSA9IC0xOworICBUWVBFX0NWX1RZUEUgKHR5cGUpID0gdHlwZTsgIC8qIGNoYWluIGJhY2sgdG8gaXRzZWxmICovIAorCisgIHJldHVybiAodHlwZSk7Cit9CisKKy8qIExvb2t1cCBhIHBvaW50ZXIgdG8gYSB0eXBlIFRZUEUuICBUWVBFUFRSLCBpZiBub256ZXJvLCBwb2ludHMKKyAgIHRvIGEgcG9pbnRlciB0byBtZW1vcnkgd2hlcmUgdGhlIHBvaW50ZXIgdHlwZSBzaG91bGQgYmUgc3RvcmVkLgorICAgSWYgKlRZUEVQVFIgaXMgemVybywgdXBkYXRlIGl0IHRvIHBvaW50IHRvIHRoZSBwb2ludGVyIHR5cGUgd2UgcmV0dXJuLgorICAgV2UgYWxsb2NhdGUgbmV3IG1lbW9yeSBpZiBuZWVkZWQuICAqLworCitzdHJ1Y3QgdHlwZSAqCittYWtlX3BvaW50ZXJfdHlwZSAodHlwZSwgdHlwZXB0cikKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIHN0cnVjdCB0eXBlICoqdHlwZXB0cjsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKm50eXBlOwkJLyogTmV3IHR5cGUgKi8KKyAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisKKyAgbnR5cGUgPSBUWVBFX1BPSU5URVJfVFlQRSAodHlwZSk7CisKKyAgaWYgKG50eXBlKSAKKyAgICB7CisgICAgICBpZiAodHlwZXB0ciA9PSAwKQkJCisgICAgICAgIHJldHVybiBudHlwZTsJLyogRG9uJ3QgY2FyZSBhYm91dCBhbGxvYywgYW5kIGhhdmUgbmV3IHR5cGUuICAqLworICAgICAgZWxzZSBpZiAoKnR5cGVwdHIgPT0gMCkKKyAgICAgICAgeworCSAgKnR5cGVwdHIgPSBudHlwZTsJLyogVHJhY2tpbmcgYWxsb2MsIGFuZCB3ZSBoYXZlIG5ldyB0eXBlLiAgKi8KKwkgIHJldHVybiBudHlwZTsKKyAgICAgICAgfQorICAgIH0KKworICBpZiAodHlwZXB0ciA9PSAwIHx8ICp0eXBlcHRyID09IDApCS8qIFdlJ2xsIG5lZWQgdG8gYWxsb2NhdGUgb25lLiAgKi8KKyAgICB7CisgICAgICBudHlwZSA9IGFsbG9jX3R5cGUgKFRZUEVfT0JKRklMRSAodHlwZSkpOworICAgICAgaWYgKHR5cGVwdHIpCisJKnR5cGVwdHIgPSBudHlwZTsKKyAgICB9CisgIGVsc2UJCQkJLyogV2UgaGF2ZSBzdG9yYWdlLCBidXQgbmVlZCB0byByZXNldCBpdC4gICovCisgICAgeworICAgICAgbnR5cGUgPSAqdHlwZXB0cjsKKyAgICAgIG9iamZpbGUgPSBUWVBFX09CSkZJTEUgKG50eXBlKTsKKyAgICAgIG1lbXNldCAoKGNoYXIgKikgbnR5cGUsIDAsIHNpemVvZiAoc3RydWN0IHR5cGUpKTsKKyAgICAgIFRZUEVfT0JKRklMRSAobnR5cGUpID0gb2JqZmlsZTsKKyAgICB9CisKKyAgVFlQRV9UQVJHRVRfVFlQRSAobnR5cGUpID0gdHlwZTsKKyAgVFlQRV9QT0lOVEVSX1RZUEUgKHR5cGUpID0gbnR5cGU7CisKKyAgLyogRklYTUUhICBBc3N1bWUgdGhlIG1hY2hpbmUgaGFzIG9ubHkgb25lIHJlcHJlc2VudGF0aW9uIGZvciBwb2ludGVycyEgICovCisKKyAgVFlQRV9MRU5HVEggKG50eXBlKSA9IFRBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUOworICBUWVBFX0NPREUgKG50eXBlKSA9IFRZUEVfQ09ERV9QVFI7CisKKyAgLyogcG9pbnRlcnMgYXJlIHVuc2lnbmVkICovCisgIFRZUEVfRkxBR1MgKG50eXBlKSB8PSBUWVBFX0ZMQUdfVU5TSUdORUQ7CisgIAorICBpZiAoIVRZUEVfUE9JTlRFUl9UWVBFICh0eXBlKSkJLyogUmVtZW1iZXIgaXQsIGlmIGRvbid0IGhhdmUgb25lLiAgKi8KKyAgICBUWVBFX1BPSU5URVJfVFlQRSAodHlwZSkgPSBudHlwZTsKKworICByZXR1cm4gbnR5cGU7Cit9CisKKy8qIEdpdmVuIGEgdHlwZSBUWVBFLCByZXR1cm4gYSB0eXBlIG9mIHBvaW50ZXJzIHRvIHRoYXQgdHlwZS4KKyAgIE1heSBuZWVkIHRvIGNvbnN0cnVjdCBzdWNoIGEgdHlwZSBpZiB0aGlzIGlzIHRoZSBmaXJzdCB1c2UuICAqLworCitzdHJ1Y3QgdHlwZSAqCitsb29rdXBfcG9pbnRlcl90eXBlICh0eXBlKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgcmV0dXJuIG1ha2VfcG9pbnRlcl90eXBlICh0eXBlLCAoc3RydWN0IHR5cGUgKiopMCk7Cit9CisKKy8qIExvb2t1cCBhIEMrKyBgcmVmZXJlbmNlJyB0byBhIHR5cGUgVFlQRS4gIFRZUEVQVFIsIGlmIG5vbnplcm8sIHBvaW50cworICAgdG8gYSBwb2ludGVyIHRvIG1lbW9yeSB3aGVyZSB0aGUgcmVmZXJlbmNlIHR5cGUgc2hvdWxkIGJlIHN0b3JlZC4KKyAgIElmICpUWVBFUFRSIGlzIHplcm8sIHVwZGF0ZSBpdCB0byBwb2ludCB0byB0aGUgcmVmZXJlbmNlIHR5cGUgd2UgcmV0dXJuLgorICAgV2UgYWxsb2NhdGUgbmV3IG1lbW9yeSBpZiBuZWVkZWQuICAqLworCitzdHJ1Y3QgdHlwZSAqCittYWtlX3JlZmVyZW5jZV90eXBlICh0eXBlLCB0eXBlcHRyKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgc3RydWN0IHR5cGUgKip0eXBlcHRyOworeworICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqbnR5cGU7CQkvKiBOZXcgdHlwZSAqLworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKworICBudHlwZSA9IFRZUEVfUkVGRVJFTkNFX1RZUEUgKHR5cGUpOworCisgIGlmIChudHlwZSkgCisgICAgeworICAgICAgaWYgKHR5cGVwdHIgPT0gMCkJCQorICAgICAgICByZXR1cm4gbnR5cGU7CS8qIERvbid0IGNhcmUgYWJvdXQgYWxsb2MsIGFuZCBoYXZlIG5ldyB0eXBlLiAgKi8KKyAgICAgIGVsc2UgaWYgKCp0eXBlcHRyID09IDApCisgICAgICAgIHsKKwkgICp0eXBlcHRyID0gbnR5cGU7CS8qIFRyYWNraW5nIGFsbG9jLCBhbmQgd2UgaGF2ZSBuZXcgdHlwZS4gICovCisJICByZXR1cm4gbnR5cGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKHR5cGVwdHIgPT0gMCB8fCAqdHlwZXB0ciA9PSAwKQkvKiBXZSdsbCBuZWVkIHRvIGFsbG9jYXRlIG9uZS4gICovCisgICAgeworICAgICAgbnR5cGUgPSBhbGxvY190eXBlIChUWVBFX09CSkZJTEUgKHR5cGUpKTsKKyAgICAgIGlmICh0eXBlcHRyKQorCSp0eXBlcHRyID0gbnR5cGU7CisgICAgfQorICBlbHNlCQkJCS8qIFdlIGhhdmUgc3RvcmFnZSwgYnV0IG5lZWQgdG8gcmVzZXQgaXQuICAqLworICAgIHsKKyAgICAgIG50eXBlID0gKnR5cGVwdHI7CisgICAgICBvYmpmaWxlID0gVFlQRV9PQkpGSUxFIChudHlwZSk7CisgICAgICBtZW1zZXQgKChjaGFyICopIG50eXBlLCAwLCBzaXplb2YgKHN0cnVjdCB0eXBlKSk7CisgICAgICBUWVBFX09CSkZJTEUgKG50eXBlKSA9IG9iamZpbGU7CisgICAgfQorCisgIFRZUEVfVEFSR0VUX1RZUEUgKG50eXBlKSA9IHR5cGU7CisgIFRZUEVfUkVGRVJFTkNFX1RZUEUgKHR5cGUpID0gbnR5cGU7CisKKyAgLyogRklYTUUhICBBc3N1bWUgdGhlIG1hY2hpbmUgaGFzIG9ubHkgb25lIHJlcHJlc2VudGF0aW9uIGZvciByZWZlcmVuY2VzLAorICAgICBhbmQgdGhhdCBpdCBtYXRjaGVzIHRoZSAob25seSkgcmVwcmVzZW50YXRpb24gZm9yIHBvaW50ZXJzISAgKi8KKworICBUWVBFX0xFTkdUSCAobnR5cGUpID0gVEFSR0VUX1BUUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQ7CisgIFRZUEVfQ09ERSAobnR5cGUpID0gVFlQRV9DT0RFX1JFRjsKKyAgCisgIGlmICghVFlQRV9SRUZFUkVOQ0VfVFlQRSAodHlwZSkpCS8qIFJlbWVtYmVyIGl0LCBpZiBkb24ndCBoYXZlIG9uZS4gICovCisgICAgVFlQRV9SRUZFUkVOQ0VfVFlQRSAodHlwZSkgPSBudHlwZTsKKworICByZXR1cm4gbnR5cGU7Cit9CisKKy8qIFNhbWUgYXMgYWJvdmUsIGJ1dCBjYWxsZXIgZG9lc24ndCBjYXJlIGFib3V0IG1lbW9yeSBhbGxvY2F0aW9uIGRldGFpbHMuICAqLworCitzdHJ1Y3QgdHlwZSAqCitsb29rdXBfcmVmZXJlbmNlX3R5cGUgKHR5cGUpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworeworICByZXR1cm4gbWFrZV9yZWZlcmVuY2VfdHlwZSAodHlwZSwgKHN0cnVjdCB0eXBlICoqKTApOworfQorCisvKiBMb29rdXAgYSBmdW5jdGlvbiB0eXBlIHRoYXQgcmV0dXJucyB0eXBlIFRZUEUuICBUWVBFUFRSLCBpZiBub256ZXJvLCBwb2ludHMKKyAgIHRvIGEgcG9pbnRlciB0byBtZW1vcnkgd2hlcmUgdGhlIGZ1bmN0aW9uIHR5cGUgc2hvdWxkIGJlIHN0b3JlZC4KKyAgIElmICpUWVBFUFRSIGlzIHplcm8sIHVwZGF0ZSBpdCB0byBwb2ludCB0byB0aGUgZnVuY3Rpb24gdHlwZSB3ZSByZXR1cm4uCisgICBXZSBhbGxvY2F0ZSBuZXcgbWVtb3J5IGlmIG5lZWRlZC4gICovCisKK3N0cnVjdCB0eXBlICoKK21ha2VfZnVuY3Rpb25fdHlwZSAodHlwZSwgdHlwZXB0cikKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIHN0cnVjdCB0eXBlICoqdHlwZXB0cjsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKm50eXBlOwkJLyogTmV3IHR5cGUgKi8KKyAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisKKyAgaWYgKHR5cGVwdHIgPT0gMCB8fCAqdHlwZXB0ciA9PSAwKQkvKiBXZSdsbCBuZWVkIHRvIGFsbG9jYXRlIG9uZS4gICovCisgICAgeworICAgICAgbnR5cGUgPSBhbGxvY190eXBlIChUWVBFX09CSkZJTEUgKHR5cGUpKTsKKyAgICAgIGlmICh0eXBlcHRyKQorCSp0eXBlcHRyID0gbnR5cGU7CisgICAgfQorICBlbHNlCQkJCS8qIFdlIGhhdmUgc3RvcmFnZSwgYnV0IG5lZWQgdG8gcmVzZXQgaXQuICAqLworICAgIHsKKyAgICAgIG50eXBlID0gKnR5cGVwdHI7CisgICAgICBvYmpmaWxlID0gVFlQRV9PQkpGSUxFIChudHlwZSk7CisgICAgICBtZW1zZXQgKChjaGFyICopIG50eXBlLCAwLCBzaXplb2YgKHN0cnVjdCB0eXBlKSk7CisgICAgICBUWVBFX09CSkZJTEUgKG50eXBlKSA9IG9iamZpbGU7CisgICAgfQorCisgIFRZUEVfVEFSR0VUX1RZUEUgKG50eXBlKSA9IHR5cGU7CisKKyAgVFlQRV9MRU5HVEggKG50eXBlKSA9IDE7CisgIFRZUEVfQ09ERSAobnR5cGUpID0gVFlQRV9DT0RFX0ZVTkM7CisgIAorICByZXR1cm4gbnR5cGU7Cit9CisKKworLyogR2l2ZW4gYSB0eXBlIFRZUEUsIHJldHVybiBhIHR5cGUgb2YgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIHRoYXQgdHlwZS4KKyAgIE1heSBuZWVkIHRvIGNvbnN0cnVjdCBzdWNoIGEgdHlwZSBpZiB0aGlzIGlzIHRoZSBmaXJzdCB1c2UuICAqLworCitzdHJ1Y3QgdHlwZSAqCitsb29rdXBfZnVuY3Rpb25fdHlwZSAodHlwZSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIHJldHVybiBtYWtlX2Z1bmN0aW9uX3R5cGUgKHR5cGUsIChzdHJ1Y3QgdHlwZSAqKikwKTsKK30KKworCisvKiBNYWtlIGEgImMtdiIgdmFyaWFudCBvZiBhIHR5cGUgLS0gYSB0eXBlIHRoYXQgaXMgaWRlbnRpY2FsIHRvIHRoZQorICAgb25lIHN1cHBsaWVkIGV4Y2VwdCB0aGF0IGl0IG1heSBoYXZlIGNvbnN0IG9yIHZvbGF0aWxlIGF0dHJpYnV0ZXMKKyAgIENOU1QgaXMgYSBmbGFnIGZvciBzZXR0aW5nIHRoZSBjb25zdCBhdHRyaWJ1dGUKKyAgIFZPTFRMIGlzIGEgZmxhZyBmb3Igc2V0dGluZyB0aGUgdm9sYXRpbGUgYXR0cmlidXRlCisgICBUWVBFIGlzIHRoZSBiYXNlIHR5cGUgd2hvc2UgdmFyaWFudCB3ZSBhcmUgY3JlYXRpbmcuCisgICBUWVBFUFRSLCBpZiBub256ZXJvLCBwb2ludHMKKyAgIHRvIGEgcG9pbnRlciB0byBtZW1vcnkgd2hlcmUgdGhlIHJlZmVyZW5jZSB0eXBlIHNob3VsZCBiZSBzdG9yZWQuCisgICBJZiAqVFlQRVBUUiBpcyB6ZXJvLCB1cGRhdGUgaXQgdG8gcG9pbnQgdG8gdGhlIHJlZmVyZW5jZSB0eXBlIHdlIHJldHVybi4KKyAgIFdlIGFsbG9jYXRlIG5ldyBtZW1vcnkgaWYgbmVlZGVkLiAgKi8KKworc3RydWN0IHR5cGUgKgorbWFrZV9jdl90eXBlIChjbnN0LCB2b2x0bCwgdHlwZSwgdHlwZXB0cikKKyAgICAgaW50IGNuc3Q7CisgICAgIGludCB2b2x0bDsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIHN0cnVjdCB0eXBlICoqdHlwZXB0cjsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKm50eXBlOwkJIC8qIE5ldyB0eXBlICovCisgIHJlZ2lzdGVyIHN0cnVjdCB0eXBlICp0bXBfdHlwZSA9IHR5cGU7IC8qIHRtcCB0eXBlICovCisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworCisgIG50eXBlID0gVFlQRV9DVl9UWVBFICh0eXBlKTsKKworICB3aGlsZSAobnR5cGUgIT0gdHlwZSkKKyAgICB7CisgICAgICBpZiAoKFRZUEVfQ09OU1QgKG50eXBlKSA9PSBjbnN0KSAmJgorICAgICAgICAgIChUWVBFX1ZPTEFUSUxFIChudHlwZSkgPT0gdm9sdGwpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0eXBlcHRyID09IDApCisgICAgICAgICAgICAgIHJldHVybiBudHlwZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCp0eXBlcHRyID09IDApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqdHlwZXB0ciA9IG50eXBlOwkvKiBUcmFja2luZyBhbGxvYywgYW5kIHdlIGhhdmUgbmV3IHR5cGUuICAqLworICAgICAgICAgICAgICAgIHJldHVybiBudHlwZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIHRtcF90eXBlID0gbnR5cGU7CisgICAgICBudHlwZSA9IFRZUEVfQ1ZfVFlQRSAobnR5cGUpOworICAgIH0KKworICBpZiAodHlwZXB0ciA9PSAwIHx8ICp0eXBlcHRyID09IDApCS8qIFdlJ2xsIG5lZWQgdG8gYWxsb2NhdGUgb25lLiAgKi8KKyAgICB7CisgICAgICBudHlwZSA9IGFsbG9jX3R5cGUgKFRZUEVfT0JKRklMRSAodHlwZSkpOworICAgICAgaWYgKHR5cGVwdHIpCisJKnR5cGVwdHIgPSBudHlwZTsKKyAgICB9CisgIGVsc2UJCQkJLyogV2UgaGF2ZSBzdG9yYWdlLCBidXQgbmVlZCB0byByZXNldCBpdC4gICovCisgICAgeworICAgICAgbnR5cGUgPSAqdHlwZXB0cjsKKyAgICAgIG9iamZpbGUgPSBUWVBFX09CSkZJTEUgKG50eXBlKTsKKyAgICAgIC8qIG1lbXNldCAoKGNoYXIgKikgbnR5cGUsIDAsIHNpemVvZiAoc3RydWN0IHR5cGUpKTsgKi8KKyAgICAgIFRZUEVfT0JKRklMRSAobnR5cGUpID0gb2JqZmlsZTsKKyAgICB9CisKKyAgLyogQ29weSBvcmlnaW5hbCB0eXBlICovIAorICBtZW1jcHkgKChjaGFyICopIG50eXBlLCAoY2hhciAqKSB0eXBlLCBzaXplb2YgKHN0cnVjdCB0eXBlKSk7CisgIC8qIEJ1dCB6ZXJvIG91dCBmaWVsZHMgdGhhdCBzaG91bGRuJ3QgYmUgY29waWVkICovCisgIFRZUEVfUE9JTlRFUl9UWVBFIChudHlwZSkgPSAoc3RydWN0IHR5cGUgKikgMDsgICAgLyogTmVlZCBuZXcgcG9pbnRlciBraW5kICovCisgIFRZUEVfUkVGRVJFTkNFX1RZUEUgKG50eXBlKSA9IChzdHJ1Y3QgdHlwZSAqKSAwOyAgLyogTmVlZCBuZXcgcmVmZXJlbmUga2luZCAqLworICAvKiBOb3RlOiBUWVBFX1RBUkdFVF9UWVBFIGNhbiBiZSBsZWZ0IGFzIGlzICovCisKKyAgLyogU2V0IGZsYWdzIGFwcHJvcHJpYXRlbHkgKi8KKyAgaWYgKGNuc3QpCisgICAgVFlQRV9GTEFHUyAobnR5cGUpIHw9ICBUWVBFX0ZMQUdfQ09OU1Q7CisgIGVsc2UKKyAgICBUWVBFX0ZMQUdTIChudHlwZSkgJj0gIH5UWVBFX0ZMQUdfQ09OU1Q7CisKKyAgaWYgKHZvbHRsKQorICAgIFRZUEVfRkxBR1MgKG50eXBlKSB8PSAgVFlQRV9GTEFHX1ZPTEFUSUxFOworICBlbHNlCisgICAgVFlQRV9GTEFHUyAobnR5cGUpICY9ICB+VFlQRV9GTEFHX1ZPTEFUSUxFOworCisgIC8qIEZpeCB0aGUgY2hhaW4gb2YgY3YgdmFyaWFudHMgKi8KKyAgVFlQRV9DVl9UWVBFIChudHlwZSkgPSB0eXBlOworICBUWVBFX0NWX1RZUEUgKHRtcF90eXBlKSA9IG50eXBlOworCisgIHJldHVybiBudHlwZTsKK30KKworCisKKworLyogSW1wbGVtZW50IGRpcmVjdCBzdXBwb3J0IGZvciBNRU1CRVJfVFlQRSBpbiBHTlUgQysrLgorICAgTWF5IG5lZWQgdG8gY29uc3RydWN0IHN1Y2ggYSB0eXBlIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHVzZS4KKyAgIFRoZSBUWVBFIGlzIHRoZSB0eXBlIG9mIHRoZSBtZW1iZXIuICBUaGUgRE9NQUlOIGlzIHRoZSB0eXBlCisgICBvZiB0aGUgYWdncmVnYXRlIHRoYXQgdGhlIG1lbWJlciBiZWxvbmdzIHRvLiAgKi8KKworc3RydWN0IHR5cGUgKgorbG9va3VwX21lbWJlcl90eXBlICh0eXBlLCBkb21haW4pCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBzdHJ1Y3QgdHlwZSAqZG9tYWluOworeworICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqbXR5cGU7CisKKyAgbXR5cGUgPSBhbGxvY190eXBlIChUWVBFX09CSkZJTEUgKHR5cGUpKTsKKyAgc21hc2hfdG9fbWVtYmVyX3R5cGUgKG10eXBlLCBkb21haW4sIHR5cGUpOworICByZXR1cm4gKG10eXBlKTsKK30KKworLyogQWxsb2NhdGUgYSBzdHViIG1ldGhvZCB3aG9zZSByZXR1cm4gdHlwZSBpcyBUWVBFLiAgCisgICBUaGlzIGFwcGFyZW50bHkgaGFwcGVucyBmb3Igc3BlZWQgb2Ygc3ltYm9sIHJlYWRpbmcsIHNpbmNlIHBhcnNpbmcKKyAgIG91dCB0aGUgYXJndW1lbnRzIHRvIHRoZSBtZXRob2QgaXMgY3B1LWludGVuc2l2ZSwgdGhlIHdheSB3ZSBhcmUgZG9pbmcKKyAgIGl0LiAgU28sIHdlIHdpbGwgZmlsbCBpbiBhcmd1bWVudHMgbGF0ZXIuCisgICBUaGlzIGFsd2F5cyByZXR1cm5zIGEgZnJlc2ggdHlwZS4gICAqLworCitzdHJ1Y3QgdHlwZSAqCithbGxvY2F0ZV9zdHViX21ldGhvZCAodHlwZSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIHN0cnVjdCB0eXBlICptdHlwZTsKKworICBtdHlwZSA9IGFsbG9jX3R5cGUgKFRZUEVfT0JKRklMRSAodHlwZSkpOworICBUWVBFX1RBUkdFVF9UWVBFIChtdHlwZSkgPSB0eXBlOworICAvKiAgX0RPTUFJTl9UWVBFIChtdHlwZSkgPSB1bmtub3duIHlldCAqLworICAvKiAgX0FSR19UWVBFUyAobXR5cGUpID0gdW5rbm93biB5ZXQgKi8KKyAgVFlQRV9GTEFHUyAobXR5cGUpID0gVFlQRV9GTEFHX1NUVUI7CisgIFRZUEVfQ09ERSAobXR5cGUpID0gVFlQRV9DT0RFX01FVEhPRDsKKyAgVFlQRV9MRU5HVEggKG10eXBlKSA9IDE7CisgIHJldHVybiAobXR5cGUpOworfQorCisvKiBDcmVhdGUgYSByYW5nZSB0eXBlIHVzaW5nIGVpdGhlciBhIGJsYW5rIHR5cGUgc3VwcGxpZWQgaW4gUkVTVUxUX1RZUEUsCisgICBvciBjcmVhdGluZyBhIG5ldyB0eXBlLCBpbmhlcml0aW5nIHRoZSBvYmpmaWxlIGZyb20gSU5ERVhfVFlQRS4KKworICAgSW5kaWNlcyB3aWxsIGJlIG9mIHR5cGUgSU5ERVhfVFlQRSwgYW5kIHdpbGwgcmFuZ2UgZnJvbSBMT1dfQk9VTkQgdG8KKyAgIEhJR0hfQk9VTkQsIGluY2x1c2l2ZS4KKworICAgRklYTUU6ICBNYXliZSB3ZSBzaG91bGQgY2hlY2sgdGhlIFRZUEVfQ09ERSBvZiBSRVNVTFRfVFlQRSB0byBtYWtlCisgICBzdXJlIGl0IGlzIFRZUEVfQ09ERV9VTkRFRiBiZWZvcmUgd2UgYmFzaCBpdCBpbnRvIGEgcmFuZ2UgdHlwZT8gKi8KKworc3RydWN0IHR5cGUgKgorY3JlYXRlX3JhbmdlX3R5cGUgKHJlc3VsdF90eXBlLCBpbmRleF90eXBlLCBsb3dfYm91bmQsIGhpZ2hfYm91bmQpCisgICAgIHN0cnVjdCB0eXBlICpyZXN1bHRfdHlwZTsKKyAgICAgc3RydWN0IHR5cGUgKmluZGV4X3R5cGU7CisgICAgIGludCBsb3dfYm91bmQ7CisgICAgIGludCBoaWdoX2JvdW5kOworeworICBpZiAocmVzdWx0X3R5cGUgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXN1bHRfdHlwZSA9IGFsbG9jX3R5cGUgKFRZUEVfT0JKRklMRSAoaW5kZXhfdHlwZSkpOworICAgIH0KKyAgVFlQRV9DT0RFIChyZXN1bHRfdHlwZSkgPSBUWVBFX0NPREVfUkFOR0U7CisgIFRZUEVfVEFSR0VUX1RZUEUgKHJlc3VsdF90eXBlKSA9IGluZGV4X3R5cGU7CisgIGlmIChUWVBFX0ZMQUdTIChpbmRleF90eXBlKSAmIFRZUEVfRkxBR19TVFVCKQorICAgIFRZUEVfRkxBR1MgKHJlc3VsdF90eXBlKSB8PSBUWVBFX0ZMQUdfVEFSR0VUX1NUVUI7CisgIGVsc2UKKyAgICBUWVBFX0xFTkdUSCAocmVzdWx0X3R5cGUpID0gVFlQRV9MRU5HVEggKGNoZWNrX3R5cGVkZWYgKGluZGV4X3R5cGUpKTsKKyAgVFlQRV9ORklFTERTIChyZXN1bHRfdHlwZSkgPSAyOworICBUWVBFX0ZJRUxEUyAocmVzdWx0X3R5cGUpID0gKHN0cnVjdCBmaWVsZCAqKQorICAgIFRZUEVfQUxMT0MgKHJlc3VsdF90eXBlLCAyICogc2l6ZW9mIChzdHJ1Y3QgZmllbGQpKTsKKyAgbWVtc2V0IChUWVBFX0ZJRUxEUyAocmVzdWx0X3R5cGUpLCAwLCAyICogc2l6ZW9mIChzdHJ1Y3QgZmllbGQpKTsKKyAgVFlQRV9GSUVMRF9CSVRQT1MgKHJlc3VsdF90eXBlLCAwKSA9IGxvd19ib3VuZDsKKyAgVFlQRV9GSUVMRF9CSVRQT1MgKHJlc3VsdF90eXBlLCAxKSA9IGhpZ2hfYm91bmQ7CisgIFRZUEVfRklFTERfVFlQRSAocmVzdWx0X3R5cGUsIDApID0gYnVpbHRpbl90eXBlX2ludDsJCS8qIEZJWE1FICovCisgIFRZUEVfRklFTERfVFlQRSAocmVzdWx0X3R5cGUsIDEpID0gYnVpbHRpbl90eXBlX2ludDsJCS8qIEZJWE1FICovCisKKyAgaWYobG93X2JvdW5kID49IDApCisgICAgVFlQRV9GTEFHUyAocmVzdWx0X3R5cGUpIHw9IFRZUEVfRkxBR19VTlNJR05FRDsKKworICByZXR1cm4gKHJlc3VsdF90eXBlKTsKK30KKworLyogU2V0ICpMT1dQIGFuZCAqSElHSFAgdG8gdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZHMgb2YgZGlzY3JldGUgdHlwZSBUWVBFLgorICAgUmV0dXJuIDEgb2YgdHlwZSBpcyBhIHJhbmdlIHR5cGUsIDAgaWYgaXQgaXMgZGlzY3JldGUgKGFuZCBib3VuZHMKKyAgIHdpbGwgZml0IGluIExPTkdFU1QpLCBvciAtMSBvdGhlcndpc2UuICovCisKK2ludAorZ2V0X2Rpc2NyZXRlX2JvdW5kcyAodHlwZSwgbG93cCwgaGlnaHApCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBMT05HRVNUICpsb3dwLCAqaGlnaHA7Cit7CisgIENIRUNLX1RZUEVERUYgKHR5cGUpOworICBzd2l0Y2ggKFRZUEVfQ09ERSAodHlwZSkpCisgICAgeworICAgIGNhc2UgVFlQRV9DT0RFX1JBTkdFOgorICAgICAgKmxvd3AgPSBUWVBFX0xPV19CT1VORCAodHlwZSk7CisgICAgICAqaGlnaHAgPSBUWVBFX0hJR0hfQk9VTkQgKHR5cGUpOworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBUWVBFX0NPREVfRU5VTToKKyAgICAgIGlmIChUWVBFX05GSUVMRFMgKHR5cGUpID4gMCkKKwl7CisJICAvKiBUaGUgZW51bXMgbWF5IG5vdCBiZSBzb3J0ZWQgYnkgdmFsdWUsIHNvIHNlYXJjaCBhbGwKKwkgICAgIGVudHJpZXMgKi8KKwkgIGludCBpOworCisJICAqbG93cCA9ICpoaWdocCA9IFRZUEVfRklFTERfQklUUE9TICh0eXBlLCAwKTsKKwkgIGZvciAoaSA9IDA7IGkgPCBUWVBFX05GSUVMRFMgKHR5cGUpOyBpKyspCisJICAgIHsKKwkgICAgICBpZiAoVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIGkpIDwgKmxvd3ApCisJCSpsb3dwID0gVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIGkpOworCSAgICAgIGlmIChUWVBFX0ZJRUxEX0JJVFBPUyAodHlwZSwgaSkgPiAqaGlnaHApCisJCSpoaWdocCA9IFRZUEVfRklFTERfQklUUE9TICh0eXBlLCBpKTsKKwkgICAgfQorCisJICAvKiBTZXQgdW5zaWduZWQgaW5kaWNhdG9yIGlmIHdhcnJhbnRlZC4gKi8KKwkgIGlmKCpsb3dwID49IDApCisJICAgIHsKKwkgICAgICBUWVBFX0ZMQUdTICh0eXBlKSB8PSBUWVBFX0ZMQUdfVU5TSUdORUQ7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgKmxvd3AgPSAwOworCSAgKmhpZ2hwID0gLTE7CisJfQorICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBUWVBFX0NPREVfQk9PTDoKKyAgICAgICpsb3dwID0gMDsKKyAgICAgICpoaWdocCA9IDE7CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIFRZUEVfQ09ERV9JTlQ6CisgICAgICBpZiAoVFlQRV9MRU5HVEggKHR5cGUpID4gc2l6ZW9mIChMT05HRVNUKSkgIC8qIFRvbyBiaWcgKi8KKwlyZXR1cm4gLTE7CisgICAgICBpZiAoIVRZUEVfVU5TSUdORUQgKHR5cGUpKQorCXsKKwkgICpsb3dwID0gLSAoMSA8PCAoVFlQRV9MRU5HVEggKHR5cGUpICogVEFSR0VUX0NIQVJfQklUIC0gMSkpOworCSAgKmhpZ2hwID0gLSpsb3dwIC0gMTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIC8qIC4uLiBmYWxsIHRocm91Z2ggZm9yIHVuc2lnbmVkIGludHMgLi4uICovCisgICAgY2FzZSBUWVBFX0NPREVfQ0hBUjoKKyAgICAgICpsb3dwID0gMDsKKyAgICAgIC8qIFRoaXMgcm91bmQtYWJvdXQgY2FsY3VsYXRpb24gaXMgdG8gYXZvaWQgc2hpZnRpbmcgYnkKKwkgVFlQRV9MRU5HVEggKHR5cGUpICogVEFSR0VUX0NIQVJfQklULCB3aGljaCB3aWxsIG5vdCB3b3JrCisJIGlmIFRZUEVfTEVOR1RIICh0eXBlKSA9PSBzaXplb2YgKExPTkdFU1QpLiAqLworICAgICAgKmhpZ2hwID0gMSA8PCAoVFlQRV9MRU5HVEggKHR5cGUpICogVEFSR0VUX0NIQVJfQklUIC0gMSk7CisgICAgICAqaGlnaHAgPSAoKmhpZ2hwIC0gMSkgfCAqaGlnaHA7CisgICAgICByZXR1cm4gMDsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworLyogQ3JlYXRlIGFuIGFycmF5IHR5cGUgdXNpbmcgZWl0aGVyIGEgYmxhbmsgdHlwZSBzdXBwbGllZCBpbiBSRVNVTFRfVFlQRSwKKyAgIG9yIGNyZWF0aW5nIGEgbmV3IHR5cGUsIGluaGVyaXRpbmcgdGhlIG9iamZpbGUgZnJvbSBSQU5HRV9UWVBFLgorCisgICBFbGVtZW50cyB3aWxsIGJlIG9mIHR5cGUgRUxFTUVOVF9UWVBFLCB0aGUgaW5kaWNlcyB3aWxsIGJlIG9mIHR5cGUKKyAgIFJBTkdFX1RZUEUuCisKKyAgIEZJWE1FOiAgTWF5YmUgd2Ugc2hvdWxkIGNoZWNrIHRoZSBUWVBFX0NPREUgb2YgUkVTVUxUX1RZUEUgdG8gbWFrZQorICAgc3VyZSBpdCBpcyBUWVBFX0NPREVfVU5ERUYgYmVmb3JlIHdlIGJhc2ggaXQgaW50byBhbiBhcnJheSB0eXBlPyAqLworCitzdHJ1Y3QgdHlwZSAqCitjcmVhdGVfYXJyYXlfdHlwZSAocmVzdWx0X3R5cGUsIGVsZW1lbnRfdHlwZSwgcmFuZ2VfdHlwZSkKKyAgICAgc3RydWN0IHR5cGUgKnJlc3VsdF90eXBlOworICAgICBzdHJ1Y3QgdHlwZSAqZWxlbWVudF90eXBlOworICAgICBzdHJ1Y3QgdHlwZSAqcmFuZ2VfdHlwZTsKK3sKKyAgTE9OR0VTVCBsb3dfYm91bmQsIGhpZ2hfYm91bmQ7CisKKyAgaWYgKHJlc3VsdF90eXBlID09IE5VTEwpCisgICAgeworICAgICAgcmVzdWx0X3R5cGUgPSBhbGxvY190eXBlIChUWVBFX09CSkZJTEUgKHJhbmdlX3R5cGUpKTsKKyAgICB9CisgIFRZUEVfQ09ERSAocmVzdWx0X3R5cGUpID0gVFlQRV9DT0RFX0FSUkFZOworICBUWVBFX1RBUkdFVF9UWVBFIChyZXN1bHRfdHlwZSkgPSBlbGVtZW50X3R5cGU7CisgIGlmIChnZXRfZGlzY3JldGVfYm91bmRzIChyYW5nZV90eXBlLCAmbG93X2JvdW5kLCAmaGlnaF9ib3VuZCkgPCAwKQorICAgIGxvd19ib3VuZCA9IGhpZ2hfYm91bmQgPSAwOworICBDSEVDS19UWVBFREVGIChlbGVtZW50X3R5cGUpOworICBUWVBFX0xFTkdUSCAocmVzdWx0X3R5cGUpID0KKyAgICBUWVBFX0xFTkdUSCAoZWxlbWVudF90eXBlKSAqIChoaWdoX2JvdW5kIC0gbG93X2JvdW5kICsgMSk7CisgIFRZUEVfTkZJRUxEUyAocmVzdWx0X3R5cGUpID0gMTsKKyAgVFlQRV9GSUVMRFMgKHJlc3VsdF90eXBlKSA9CisgICAgKHN0cnVjdCBmaWVsZCAqKSBUWVBFX0FMTE9DIChyZXN1bHRfdHlwZSwgc2l6ZW9mIChzdHJ1Y3QgZmllbGQpKTsKKyAgbWVtc2V0IChUWVBFX0ZJRUxEUyAocmVzdWx0X3R5cGUpLCAwLCBzaXplb2YgKHN0cnVjdCBmaWVsZCkpOworICBUWVBFX0ZJRUxEX1RZUEUgKHJlc3VsdF90eXBlLCAwKSA9IHJhbmdlX3R5cGU7CisgIFRZUEVfVlBUUl9GSUVMRE5PIChyZXN1bHRfdHlwZSkgPSAtMTsKKworICAvKiBUWVBFX0ZMQUdfVEFSR0VUX1NUVUIgd2lsbCB0YWtlIGNhcmUgb2YgemVybyBsZW5ndGggYXJyYXlzICovCisgIGlmIChUWVBFX0xFTkdUSCAocmVzdWx0X3R5cGUpID09IDApCisgICAgVFlQRV9GTEFHUyAocmVzdWx0X3R5cGUpIHw9IFRZUEVfRkxBR19UQVJHRVRfU1RVQjsKKworICByZXR1cm4gKHJlc3VsdF90eXBlKTsKK30KKworLyogQ3JlYXRlIGEgc3RyaW5nIHR5cGUgdXNpbmcgZWl0aGVyIGEgYmxhbmsgdHlwZSBzdXBwbGllZCBpbiBSRVNVTFRfVFlQRSwKKyAgIG9yIGNyZWF0aW5nIGEgbmV3IHR5cGUuICBTdHJpbmcgdHlwZXMgYXJlIHNpbWlsYXIgZW5vdWdoIHRvIGFycmF5IG9mCisgICBjaGFyIHR5cGVzIHRoYXQgd2UgY2FuIHVzZSBjcmVhdGVfYXJyYXlfdHlwZSB0byBidWlsZCB0aGUgYmFzaWMgdHlwZQorICAgYW5kIHRoZW4gYmFzaCBpdCBpbnRvIGEgc3RyaW5nIHR5cGUuCisKKyAgIEZvciBmaXhlZCBsZW5ndGggc3RyaW5ncywgdGhlIHJhbmdlIHR5cGUgY29udGFpbnMgMCBhcyB0aGUgbG93ZXIKKyAgIGJvdW5kIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgbWludXMgb25lIGFzIHRoZSB1cHBlciBib3VuZC4KKworICAgRklYTUU6ICBNYXliZSB3ZSBzaG91bGQgY2hlY2sgdGhlIFRZUEVfQ09ERSBvZiBSRVNVTFRfVFlQRSB0byBtYWtlCisgICBzdXJlIGl0IGlzIFRZUEVfQ09ERV9VTkRFRiBiZWZvcmUgd2UgYmFzaCBpdCBpbnRvIGEgc3RyaW5nIHR5cGU/ICovCisKK3N0cnVjdCB0eXBlICoKK2NyZWF0ZV9zdHJpbmdfdHlwZSAocmVzdWx0X3R5cGUsIHJhbmdlX3R5cGUpCisgICAgIHN0cnVjdCB0eXBlICpyZXN1bHRfdHlwZTsKKyAgICAgc3RydWN0IHR5cGUgKnJhbmdlX3R5cGU7Cit7CisgIHJlc3VsdF90eXBlID0gY3JlYXRlX2FycmF5X3R5cGUgKHJlc3VsdF90eXBlLAorCQkJCSAgICpjdXJyZW50X2xhbmd1YWdlLT5zdHJpbmdfY2hhcl90eXBlLAorCQkJCSAgIHJhbmdlX3R5cGUpOworICBUWVBFX0NPREUgKHJlc3VsdF90eXBlKSA9IFRZUEVfQ09ERV9TVFJJTkc7CisgIHJldHVybiAocmVzdWx0X3R5cGUpOworfQorCitzdHJ1Y3QgdHlwZSAqCitjcmVhdGVfc2V0X3R5cGUgKHJlc3VsdF90eXBlLCBkb21haW5fdHlwZSkKKyAgICAgc3RydWN0IHR5cGUgKnJlc3VsdF90eXBlOworICAgICBzdHJ1Y3QgdHlwZSAqZG9tYWluX3R5cGU7Cit7CisgIExPTkdFU1QgbG93X2JvdW5kLCBoaWdoX2JvdW5kLCBiaXRfbGVuZ3RoOworICBpZiAocmVzdWx0X3R5cGUgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXN1bHRfdHlwZSA9IGFsbG9jX3R5cGUgKFRZUEVfT0JKRklMRSAoZG9tYWluX3R5cGUpKTsKKyAgICB9CisgIFRZUEVfQ09ERSAocmVzdWx0X3R5cGUpID0gVFlQRV9DT0RFX1NFVDsKKyAgVFlQRV9ORklFTERTIChyZXN1bHRfdHlwZSkgPSAxOworICBUWVBFX0ZJRUxEUyAocmVzdWx0X3R5cGUpID0gKHN0cnVjdCBmaWVsZCAqKQorICAgIFRZUEVfQUxMT0MgKHJlc3VsdF90eXBlLCAxICogc2l6ZW9mIChzdHJ1Y3QgZmllbGQpKTsKKyAgbWVtc2V0IChUWVBFX0ZJRUxEUyAocmVzdWx0X3R5cGUpLCAwLCBzaXplb2YgKHN0cnVjdCBmaWVsZCkpOworCisgIGlmICghIChUWVBFX0ZMQUdTIChkb21haW5fdHlwZSkgJiBUWVBFX0ZMQUdfU1RVQikpCisgICAgeworICAgICAgaWYgKGdldF9kaXNjcmV0ZV9ib3VuZHMgKGRvbWFpbl90eXBlLCAmbG93X2JvdW5kLCAmaGlnaF9ib3VuZCkgPCAwKQorCWxvd19ib3VuZCA9IGhpZ2hfYm91bmQgPSAwOworICAgICAgYml0X2xlbmd0aCA9IGhpZ2hfYm91bmQgLSBsb3dfYm91bmQgKyAxOworICAgICAgVFlQRV9MRU5HVEggKHJlc3VsdF90eXBlKQorCT0gKGJpdF9sZW5ndGggKyBUQVJHRVRfQ0hBUl9CSVQgLSAxKSAvIFRBUkdFVF9DSEFSX0JJVDsKKyAgICB9CisgIFRZUEVfRklFTERfVFlQRSAocmVzdWx0X3R5cGUsIDApID0gZG9tYWluX3R5cGU7CisKKyAgaWYobG93X2JvdW5kID49IDApCisgICAgVFlQRV9GTEFHUyAocmVzdWx0X3R5cGUpIHw9IFRZUEVfRkxBR19VTlNJR05FRDsKKworICByZXR1cm4gKHJlc3VsdF90eXBlKTsKK30KKworLyogU21hc2ggVFlQRSB0byBiZSBhIHR5cGUgb2YgbWVtYmVycyBvZiBET01BSU4gd2l0aCB0eXBlIFRPX1RZUEUuIAorICAgQSBNRU1CRVIgaXMgYSB3aWVyZCB0aGluZyAtLSBpdCBhbW91bnRzIHRvIGEgdHlwZWQgb2Zmc2V0IGludG8KKyAgIGEgc3RydWN0LCBlLmcuICJhbiBpbnQgYXQgb2Zmc2V0IDgiLiAgQSBNRU1CRVIgVFlQRSBkb2Vzbid0CisgICBpbmNsdWRlIHRoZSBvZmZzZXQgKHRoYXQncyB0aGUgdmFsdWUgb2YgdGhlIE1FTUJFUiBpdHNlbGYpLCBidXQgZG9lcworICAgaW5jbHVkZSB0aGUgc3RydWN0dXJlIHR5cGUgaW50byB3aGljaCBpdCBwb2ludHMgKGZvciBzb21lIHJlYXNvbikuCisKKyAgIFdoZW4gInNtYXNoaW5nIiB0aGUgdHlwZSwgd2UgcHJlc2VydmUgdGhlIG9iamZpbGUgdGhhdCB0aGUKKyAgIG9sZCB0eXBlIHBvaW50ZWQgdG8sIHNpbmNlIHdlIGFyZW4ndCBjaGFuZ2luZyB3aGVyZSB0aGUgdHlwZSBpcyBhY3R1YWxseQorICAgYWxsb2NhdGVkLiAgKi8KKwordm9pZAorc21hc2hfdG9fbWVtYmVyX3R5cGUgKHR5cGUsIGRvbWFpbiwgdG9fdHlwZSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIHN0cnVjdCB0eXBlICpkb21haW47CisgICAgIHN0cnVjdCB0eXBlICp0b190eXBlOworeworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKworICBvYmpmaWxlID0gVFlQRV9PQkpGSUxFICh0eXBlKTsKKworICBtZW1zZXQgKChjaGFyICopIHR5cGUsIDAsIHNpemVvZiAoc3RydWN0IHR5cGUpKTsKKyAgVFlQRV9PQkpGSUxFICh0eXBlKSA9IG9iamZpbGU7CisgIFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpID0gdG9fdHlwZTsKKyAgVFlQRV9ET01BSU5fVFlQRSAodHlwZSkgPSBkb21haW47CisgIFRZUEVfTEVOR1RIICh0eXBlKSA9IDE7CS8qIEluIHByYWN0aWNlLCB0aGlzIGlzIG5ldmVyIG5lZWRlZC4gICovCisgIFRZUEVfQ09ERSAodHlwZSkgPSBUWVBFX0NPREVfTUVNQkVSOworfQorCisvKiBTbWFzaCBUWVBFIHRvIGJlIGEgdHlwZSBvZiBtZXRob2Qgb2YgRE9NQUlOIHdpdGggdHlwZSBUT19UWVBFLgorICAgTUVUSE9EIGp1c3QgbWVhbnMgYGZ1bmN0aW9uIHRoYXQgZ2V0cyBhbiBleHRyYSAidGhpcyIgYXJndW1lbnQnLgorCisgICBXaGVuICJzbWFzaGluZyIgdGhlIHR5cGUsIHdlIHByZXNlcnZlIHRoZSBvYmpmaWxlIHRoYXQgdGhlCisgICBvbGQgdHlwZSBwb2ludGVkIHRvLCBzaW5jZSB3ZSBhcmVuJ3QgY2hhbmdpbmcgd2hlcmUgdGhlIHR5cGUgaXMgYWN0dWFsbHkKKyAgIGFsbG9jYXRlZC4gICovCisKK3ZvaWQKK3NtYXNoX3RvX21ldGhvZF90eXBlICh0eXBlLCBkb21haW4sIHRvX3R5cGUsIGFyZ3MpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBzdHJ1Y3QgdHlwZSAqZG9tYWluOworICAgICBzdHJ1Y3QgdHlwZSAqdG9fdHlwZTsKKyAgICAgc3RydWN0IHR5cGUgKiphcmdzOworeworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKworICBvYmpmaWxlID0gVFlQRV9PQkpGSUxFICh0eXBlKTsKKworICBtZW1zZXQgKChjaGFyICopIHR5cGUsIDAsIHNpemVvZiAoc3RydWN0IHR5cGUpKTsKKyAgVFlQRV9PQkpGSUxFICh0eXBlKSA9IG9iamZpbGU7CisgIFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpID0gdG9fdHlwZTsKKyAgVFlQRV9ET01BSU5fVFlQRSAodHlwZSkgPSBkb21haW47CisgIFRZUEVfQVJHX1RZUEVTICh0eXBlKSA9IGFyZ3M7CisgIFRZUEVfTEVOR1RIICh0eXBlKSA9IDE7CS8qIEluIHByYWN0aWNlLCB0aGlzIGlzIG5ldmVyIG5lZWRlZC4gICovCisgIFRZUEVfQ09ERSAodHlwZSkgPSBUWVBFX0NPREVfTUVUSE9EOworfQorCisvKiBSZXR1cm4gYSB0eXBlbmFtZSBmb3IgYSBzdHJ1Y3QvdW5pb24vZW51bSB0eXBlIHdpdGhvdXQgInN0cnVjdCAiLAorICAgInVuaW9uICIsIG9yICJlbnVtICIuICBJZiB0aGUgdHlwZSBoYXMgYSBOVUxMIG5hbWUsIHJldHVybiBOVUxMLiAgKi8KKworY2hhciAqCit0eXBlX25hbWVfbm9fdGFnICh0eXBlKQorICAgICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgaWYgKFRZUEVfVEFHX05BTUUgKHR5cGUpICE9IE5VTEwpCisgICAgcmV0dXJuIFRZUEVfVEFHX05BTUUgKHR5cGUpOworCisgIC8qIElzIHRoZXJlIGNvZGUgd2hpY2ggZXhwZWN0cyB0aGlzIHRvIHJldHVybiB0aGUgbmFtZSBpZiB0aGVyZSBpcyBubworICAgICB0YWcgbmFtZT8gIE15IGd1ZXNzIGlzIHRoYXQgdGhpcyBpcyBtYWlubHkgdXNlZCBmb3IgQysrIGluIGNhc2VzIHdoZXJlCisgICAgIHRoZSB0d28gd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUuICAqLworICByZXR1cm4gVFlQRV9OQU1FICh0eXBlKTsKK30KKworLyogTG9va3VwIGEgcHJpbWl0aXZlIHR5cGUgbmFtZWQgTkFNRS4gCisgICBSZXR1cm4gemVybyBpZiBOQU1FIGlzIG5vdCBhIHByaW1pdGl2ZSB0eXBlLiovCisKK3N0cnVjdCB0eXBlICoKK2xvb2t1cF9wcmltaXRpdmVfdHlwZW5hbWUgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgICBzdHJ1Y3QgdHlwZSAqKiBjb25zdCAqcDsKKworICAgZm9yIChwID0gY3VycmVudF9sYW5ndWFnZSAtPiBsYV9idWlsdGluX3R5cGVfdmVjdG9yOyAqcCAhPSBOVUxMOyBwKyspCisgICAgIHsKKyAgICAgICBpZiAoU1RSRVEgKCgqKnApIC0+IG5hbWUsIG5hbWUpKQorCSB7CisJICAgcmV0dXJuICgqKnApOworCSB9CisgICAgIH0KKyAgIHJldHVybiAoTlVMTCk7IAorfQorCisvKiBMb29rdXAgYSB0eXBlZGVmIG9yIHByaW1pdGl2ZSB0eXBlIG5hbWVkIE5BTUUsCisgICB2aXNpYmxlIGluIGxleGljYWwgYmxvY2sgQkxPQ0suCisgICBJZiBOT0VSUiBpcyBub256ZXJvLCByZXR1cm4gemVybyBpZiBOQU1FIGlzIG5vdCBzdWl0YWJseSBkZWZpbmVkLiAgKi8KKworc3RydWN0IHR5cGUgKgorbG9va3VwX3R5cGVuYW1lIChuYW1lLCBibG9jaywgbm9lcnIpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIHN0cnVjdCBibG9jayAqYmxvY2s7CisgICAgIGludCBub2VycjsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bWJvbCAqc3ltOworICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdG1wOworCisgIHN5bSA9IGxvb2t1cF9zeW1ib2wgKG5hbWUsIGJsb2NrLCBWQVJfTkFNRVNQQUNFLCAwLCAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCk7CisgIGlmIChzeW0gPT0gTlVMTCB8fCBTWU1CT0xfQ0xBU1MgKHN5bSkgIT0gTE9DX1RZUEVERUYpCisgICAgeworICAgICAgdG1wID0gbG9va3VwX3ByaW1pdGl2ZV90eXBlbmFtZSAobmFtZSk7CisgICAgICBpZiAodG1wKQorCXsKKwkgIHJldHVybiAodG1wKTsKKwl9CisgICAgICBlbHNlIGlmICghdG1wICYmIG5vZXJyKQorCXsKKwkgIHJldHVybiAoTlVMTCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGVycm9yICgiTm8gdHlwZSBuYW1lZCAlcy4iLCBuYW1lKTsKKwl9CisgICAgfQorICByZXR1cm4gKFNZTUJPTF9UWVBFIChzeW0pKTsKK30KKworc3RydWN0IHR5cGUgKgorbG9va3VwX3Vuc2lnbmVkX3R5cGVuYW1lIChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICBjaGFyICp1bnMgPSBhbGxvY2EgKHN0cmxlbiAobmFtZSkgKyAxMCk7CisKKyAgc3RyY3B5ICh1bnMsICJ1bnNpZ25lZCAiKTsKKyAgc3RyY3B5ICh1bnMgKyA5LCBuYW1lKTsKKyAgcmV0dXJuIChsb29rdXBfdHlwZW5hbWUgKHVucywgKHN0cnVjdCBibG9jayAqKSBOVUxMLCAwKSk7Cit9CisKK3N0cnVjdCB0eXBlICoKK2xvb2t1cF9zaWduZWRfdHlwZW5hbWUgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIHN0cnVjdCB0eXBlICp0OworICBjaGFyICp1bnMgPSBhbGxvY2EgKHN0cmxlbiAobmFtZSkgKyA4KTsKKworICBzdHJjcHkgKHVucywgInNpZ25lZCAiKTsKKyAgc3RyY3B5ICh1bnMgKyA3LCBuYW1lKTsKKyAgdCA9IGxvb2t1cF90eXBlbmFtZSAodW5zLCAoc3RydWN0IGJsb2NrICopIE5VTEwsIDEpOworICAvKiBJZiB3ZSBkb24ndCBmaW5kICJzaWduZWQgRk9PIiBqdXN0IHRyeSBhZ2FpbiB3aXRoIHBsYWluICJGT08iLiAqLworICBpZiAodCAhPSBOVUxMKQorICAgIHJldHVybiB0OworICByZXR1cm4gbG9va3VwX3R5cGVuYW1lIChuYW1lLCAoc3RydWN0IGJsb2NrICopIE5VTEwsIDApOworfQorCisvKiBMb29rdXAgYSBzdHJ1Y3R1cmUgdHlwZSBuYW1lZCAic3RydWN0IE5BTUUiLAorICAgdmlzaWJsZSBpbiBsZXhpY2FsIGJsb2NrIEJMT0NLLiAgKi8KKworc3RydWN0IHR5cGUgKgorbG9va3VwX3N0cnVjdCAobmFtZSwgYmxvY2spCisgICAgIGNoYXIgKm5hbWU7CisgICAgIHN0cnVjdCBibG9jayAqYmxvY2s7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBzeW1ib2wgKnN5bTsKKworICBzeW0gPSBsb29rdXBfc3ltYm9sIChuYW1lLCBibG9jaywgU1RSVUNUX05BTUVTUEFDRSwgMCwKKwkJICAgICAgIChzdHJ1Y3Qgc3ltdGFiICoqKSBOVUxMKTsKKworICBpZiAoc3ltID09IE5VTEwpCisgICAgeworICAgICAgZXJyb3IgKCJObyBzdHJ1Y3QgdHlwZSBuYW1lZCAlcy4iLCBuYW1lKTsKKyAgICB9CisgIGlmIChUWVBFX0NPREUgKFNZTUJPTF9UWVBFIChzeW0pKSAhPSBUWVBFX0NPREVfU1RSVUNUKQorICAgIHsKKyAgICAgIGVycm9yICgiVGhpcyBjb250ZXh0IGhhcyBjbGFzcywgdW5pb24gb3IgZW51bSAlcywgbm90IGEgc3RydWN0LiIsIG5hbWUpOworICAgIH0KKyAgcmV0dXJuIChTWU1CT0xfVFlQRSAoc3ltKSk7Cit9CisKKy8qIExvb2t1cCBhIHVuaW9uIHR5cGUgbmFtZWQgInVuaW9uIE5BTUUiLAorICAgdmlzaWJsZSBpbiBsZXhpY2FsIGJsb2NrIEJMT0NLLiAgKi8KKworc3RydWN0IHR5cGUgKgorbG9va3VwX3VuaW9uIChuYW1lLCBibG9jaykKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgc3RydWN0IGJsb2NrICpibG9jazsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bWJvbCAqc3ltOworICBzdHJ1Y3QgdHlwZSAqIHQ7CisKKyAgc3ltID0gbG9va3VwX3N5bWJvbCAobmFtZSwgYmxvY2ssIFNUUlVDVF9OQU1FU1BBQ0UsIDAsCisJCSAgICAgICAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCk7CisKKyAgaWYgKHN5bSA9PSBOVUxMKQorICAgIGVycm9yICgiTm8gdW5pb24gdHlwZSBuYW1lZCAlcy4iLCBuYW1lKTsKKworICB0ID0gU1lNQk9MX1RZUEUoc3ltKTsKKworICBpZiAoVFlQRV9DT0RFICh0KSA9PSBUWVBFX0NPREVfVU5JT04pCisgICAgcmV0dXJuICh0KTsKKworICAvKiBDKysgdW5pb25zIG1heSBjb21lIG91dCB3aXRoIFRZUEVfQ09ERV9DTEFTUywgYnV0IHdlIGxvb2sgYXQKKyAgICogYSBmdXJ0aGVyICJkZWNsYXJlZF90eXBlIiBmaWVsZCB0byBkaXNjb3ZlciBpdCBpcyByZWFsbHkgYSB1bmlvbi4KKyAgICovCisgIGlmIChIQVZFX0NQTFVTX1NUUlVDVCAodCkpIAorICAgIGlmIChUWVBFX0RFQ0xBUkVEX1RZUEUodCkgPT0gREVDTEFSRURfVFlQRV9VTklPTikgCisgICAgICByZXR1cm4gKHQpOworCisgIC8qIElmIHdlIGdldCBoZXJlLCBpdCdzIG5vdCBhIHVuaW9uICovCisgIGVycm9yICgiVGhpcyBjb250ZXh0IGhhcyBjbGFzcywgc3RydWN0IG9yIGVudW0gJXMsIG5vdCBhIHVuaW9uLiIsIG5hbWUpOworfQorCisKKy8qIExvb2t1cCBhbiBlbnVtIHR5cGUgbmFtZWQgImVudW0gTkFNRSIsCisgICB2aXNpYmxlIGluIGxleGljYWwgYmxvY2sgQkxPQ0suICAqLworCitzdHJ1Y3QgdHlwZSAqCitsb29rdXBfZW51bSAobmFtZSwgYmxvY2spCisgICAgIGNoYXIgKm5hbWU7CisgICAgIHN0cnVjdCBibG9jayAqYmxvY2s7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBzeW1ib2wgKnN5bTsKKworICBzeW0gPSBsb29rdXBfc3ltYm9sIChuYW1lLCBibG9jaywgU1RSVUNUX05BTUVTUEFDRSwgMCwgCisJCSAgICAgICAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCk7CisgIGlmIChzeW0gPT0gTlVMTCkKKyAgICB7CisgICAgICBlcnJvciAoIk5vIGVudW0gdHlwZSBuYW1lZCAlcy4iLCBuYW1lKTsKKyAgICB9CisgIGlmIChUWVBFX0NPREUgKFNZTUJPTF9UWVBFIChzeW0pKSAhPSBUWVBFX0NPREVfRU5VTSkKKyAgICB7CisgICAgICBlcnJvciAoIlRoaXMgY29udGV4dCBoYXMgY2xhc3MsIHN0cnVjdCBvciB1bmlvbiAlcywgbm90IGFuIGVudW0uIiwgbmFtZSk7CisgICAgfQorICByZXR1cm4gKFNZTUJPTF9UWVBFIChzeW0pKTsKK30KKworLyogTG9va3VwIGEgdGVtcGxhdGUgdHlwZSBuYW1lZCAidGVtcGxhdGUgTkFNRTxUWVBFPiIsCisgICB2aXNpYmxlIGluIGxleGljYWwgYmxvY2sgQkxPQ0suICAqLworCitzdHJ1Y3QgdHlwZSAqCitsb29rdXBfdGVtcGxhdGVfdHlwZSAobmFtZSwgdHlwZSwgYmxvY2spCisgICAgIGNoYXIgKm5hbWU7CisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBzdHJ1Y3QgYmxvY2sgKmJsb2NrOworeworICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIGNoYXIgKm5hbSA9IChjaGFyKikgYWxsb2NhKHN0cmxlbihuYW1lKSArIHN0cmxlbih0eXBlLT5uYW1lKSArIDQpOworICBzdHJjcHkgKG5hbSwgbmFtZSk7CisgIHN0cmNhdCAobmFtLCAiPCIpOworICBzdHJjYXQgKG5hbSwgdHlwZS0+bmFtZSk7CisgIHN0cmNhdCAobmFtLCAiID4iKTsJLyogRklYTUUsIGV4dHJhIHNwYWNlIHN0aWxsIGludHJvZHVjZWQgaW4gZ2NjPyAqLworCisgIHN5bSA9IGxvb2t1cF9zeW1ib2wgKG5hbSwgYmxvY2ssIFZBUl9OQU1FU1BBQ0UsIDAsIChzdHJ1Y3Qgc3ltdGFiICoqKU5VTEwpOworCisgIGlmIChzeW0gPT0gTlVMTCkKKyAgICB7CisgICAgICBlcnJvciAoIk5vIHRlbXBsYXRlIHR5cGUgbmFtZWQgJXMuIiwgbmFtZSk7CisgICAgfQorICBpZiAoVFlQRV9DT0RFIChTWU1CT0xfVFlQRSAoc3ltKSkgIT0gVFlQRV9DT0RFX1NUUlVDVCkKKyAgICB7CisgICAgICBlcnJvciAoIlRoaXMgY29udGV4dCBoYXMgY2xhc3MsIHVuaW9uIG9yIGVudW0gJXMsIG5vdCBhIHN0cnVjdC4iLCBuYW1lKTsKKyAgICB9CisgIHJldHVybiAoU1lNQk9MX1RZUEUgKHN5bSkpOworfQorCisvKiBHaXZlbiBhIHR5cGUgVFlQRSwgbG9va3VwIHRoZSB0eXBlIG9mIHRoZSBjb21wb25lbnQgb2YgdHlwZSBuYW1lZCBOQU1FLiAgCisKKyAgIFRZUEUgY2FuIGJlIGVpdGhlciBhIHN0cnVjdCBvciB1bmlvbiwgb3IgYSBwb2ludGVyIG9yIHJlZmVyZW5jZSB0byBhIHN0cnVjdCBvcgorICAgdW5pb24uICBJZiBpdCBpcyBhIHBvaW50ZXIgb3IgcmVmZXJlbmNlLCBpdHMgdGFyZ2V0IHR5cGUgaXMgYXV0b21hdGljYWxseSB1c2VkLgorICAgVGh1cyAnLicgYW5kICctPicgYXJlIGludGVyY2hhbmdhYmxlLCBhcyBzcGVjaWZpZWQgZm9yIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUKKyAgIGV4cHJlc3Npb24gZWxlbWVudCB0eXBlcyBTVFJVQ1RPUF9TVFJVQ1QgYW5kIFNUUlVDVE9QX1BUUi4KKworICAgSWYgTk9FUlIgaXMgbm9uemVybywgcmV0dXJuIHplcm8gaWYgTkFNRSBpcyBub3Qgc3VpdGFibHkgZGVmaW5lZC4KKyAgIElmIE5BTUUgaXMgdGhlIG5hbWUgb2YgYSBiYXNlY2xhc3MgdHlwZSwgcmV0dXJuIHRoYXQgdHlwZS4gICovCisKK3N0cnVjdCB0eXBlICoKK2xvb2t1cF9zdHJ1Y3RfZWx0X3R5cGUgKHR5cGUsIG5hbWUsIG5vZXJyKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgbm9lcnI7Cit7CisgIGludCBpOworCisgIGZvciAoOzspCisgICAgeworICAgICAgQ0hFQ0tfVFlQRURFRiAodHlwZSk7CisgICAgICBpZiAoVFlQRV9DT0RFICh0eXBlKSAhPSBUWVBFX0NPREVfUFRSCisJICAmJiBUWVBFX0NPREUgKHR5cGUpICE9IFRZUEVfQ09ERV9SRUYpCisJYnJlYWs7CisgICAgICB0eXBlID0gVFlQRV9UQVJHRVRfVFlQRSAodHlwZSk7CisgICAgfQorCisgIGlmIChUWVBFX0NPREUgKHR5cGUpICE9IFRZUEVfQ09ERV9TVFJVQ1QgJiYKKyAgICAgIFRZUEVfQ09ERSAodHlwZSkgIT0gVFlQRV9DT0RFX1VOSU9OKQorICAgIHsKKyAgICAgIHRhcmdldF90ZXJtaW5hbF9vdXJzICgpOworICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlR5cGUgIik7CisgICAgICB0eXBlX3ByaW50ICh0eXBlLCAiIiwgZ2RiX3N0ZGVyciwgLTEpOworICAgICAgZXJyb3IgKCIgaXMgbm90IGEgc3RydWN0dXJlIG9yIHVuaW9uIHR5cGUuIik7CisgICAgfQorCisjaWYgMAorICAvKiBGSVhNRTogIFRoaXMgY2hhbmdlIHB1dCBpbiBieSBNaWNoYWVsIHNlZW1zIGluY29ycmVjdCBmb3IgdGhlIGNhc2Ugd2hlcmUKKyAgICAgdGhlIHN0cnVjdHVyZSB0YWcgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgbWVtYmVyIG5hbWUuICBJLkUuIHdoZW4gZG9pbmcKKyAgICAgInB0eXBlIGJlbGwtPmJhciIgZm9yICJzdHJ1Y3QgZm9vIHsgaW50IGJhcjsgaW50IGZvbzsgfSBiZWxsOyIKKyAgICAgRGlzYWJsZWQgYnkgZm5mLiAqLworICB7CisgICAgY2hhciAqdHlwZW5hbWU7CisKKyAgICB0eXBlbmFtZSA9IHR5cGVfbmFtZV9ub190YWcgKHR5cGUpOworICAgIGlmICh0eXBlbmFtZSAhPSBOVUxMICYmIFNUUkVRICh0eXBlbmFtZSwgbmFtZSkpCisgICAgICByZXR1cm4gdHlwZTsKKyAgfQorI2VuZGlmCisKKyAgZm9yIChpID0gVFlQRV9ORklFTERTICh0eXBlKSAtIDE7IGkgPj0gVFlQRV9OX0JBU0VDTEFTU0VTICh0eXBlKTsgaS0tKQorICAgIHsKKyAgICAgIGNoYXIgKnRfZmllbGRfbmFtZSA9IFRZUEVfRklFTERfTkFNRSAodHlwZSwgaSk7CisKKyAgICAgIGlmICh0X2ZpZWxkX25hbWUgJiYgU1RSRVEgKHRfZmllbGRfbmFtZSwgbmFtZSkpCisJeworCSAgcmV0dXJuIFRZUEVfRklFTERfVFlQRSAodHlwZSwgaSk7CisJfQorICAgIH0KKworICAvKiBPSywgaXQncyBub3QgaW4gdGhpcyBjbGFzcy4gIFJlY3Vyc2l2ZWx5IGNoZWNrIHRoZSBiYXNlY2xhc3Nlcy4gICovCisgIGZvciAoaSA9IFRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSkgLSAxOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBzdHJ1Y3QgdHlwZSAqdDsKKworICAgICAgdCA9IGxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGUgKFRZUEVfQkFTRUNMQVNTICh0eXBlLCBpKSwgbmFtZSwgbm9lcnIpOworICAgICAgaWYgKHQgIT0gTlVMTCkKKwl7CisJICByZXR1cm4gdDsKKwl9CisgICAgfQorCisgIGlmIChub2VycikKKyAgICB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICB0YXJnZXRfdGVybWluYWxfb3VycyAoKTsKKyAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiVHlwZSAiKTsKKyAgdHlwZV9wcmludCAodHlwZSwgIiIsIGdkYl9zdGRlcnIsIC0xKTsKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiIGhhcyBubyBjb21wb25lbnQgbmFtZWQgIik7CisgIGZwdXRzX2ZpbHRlcmVkIChuYW1lLCBnZGJfc3RkZXJyKTsKKyAgZXJyb3IgKCIuIik7CisgIHJldHVybiAoc3RydWN0IHR5cGUgKiktMTsJLyogRm9yIGxpbnQgKi8KK30KKworLyogSWYgcG9zc2libGUsIG1ha2UgdGhlIHZwdHJfZmllbGRubyBhbmQgdnB0cl9iYXNldHlwZSBmaWVsZHMgb2YgVFlQRQorICAgdmFsaWQuICBDYWxsZXJzIHNob3VsZCBiZSBhd2FyZSB0aGF0IGluIHNvbWUgY2FzZXMgKGZvciBleGFtcGxlLAorICAgdGhlIHR5cGUgb3Igb25lIG9mIGl0cyBiYXNlY2xhc3NlcyBpcyBhIHN0dWIgdHlwZSBhbmQgd2UgYXJlCisgICBkZWJ1Z2dpbmcgYSAubyBmaWxlKSwgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBiZSBhYmxlIHRvIGZpbmQgdGhlIHZpcnR1YWwKKyAgIGZ1bmN0aW9uIHRhYmxlIHBvaW50ZXIsIGFuZCB2cHRyX2ZpZWxkbm8gd2lsbCByZW1haW4gLTEgYW5kIHZwdHJfYmFzZXR5cGUKKyAgIHdpbGwgcmVtYWluIE5VTEwuICAqLworCit2b2lkCitmaWxsX2luX3ZwdHJfZmllbGRubyAodHlwZSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIENIRUNLX1RZUEVERUYgKHR5cGUpOworCisgIGlmIChUWVBFX1ZQVFJfRklFTEROTyAodHlwZSkgPCAwKQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICAvKiBXZSBtdXN0IHN0YXJ0IGF0IHplcm8gaW4gY2FzZSB0aGUgZmlyc3QgKGFuZCBvbmx5KSBiYXNlY2xhc3MgaXMKKwkgdmlydHVhbCAoYW5kIGhlbmNlIHdlIGNhbm5vdCBzaGFyZSB0aGUgdGFibGUgcG9pbnRlcikuICAqLworICAgICAgZm9yIChpID0gMDsgaSA8IFRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSk7IGkrKykKKwl7CisJICBmaWxsX2luX3ZwdHJfZmllbGRubyAoVFlQRV9CQVNFQ0xBU1MgKHR5cGUsIGkpKTsKKwkgIGlmIChUWVBFX1ZQVFJfRklFTEROTyAoVFlQRV9CQVNFQ0xBU1MgKHR5cGUsIGkpKSA+PSAwKQorCSAgICB7CisJICAgICAgVFlQRV9WUFRSX0ZJRUxETk8gKHR5cGUpCisJCT0gVFlQRV9WUFRSX0ZJRUxETk8gKFRZUEVfQkFTRUNMQVNTICh0eXBlLCBpKSk7CisJICAgICAgVFlQRV9WUFRSX0JBU0VUWVBFICh0eXBlKQorCQk9IFRZUEVfVlBUUl9CQVNFVFlQRSAoVFlQRV9CQVNFQ0xBU1MgKHR5cGUsIGkpKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qIEZpbmQgdGhlIG1ldGhvZCBhbmQgZmllbGQgaW5kaWNlcyBmb3IgdGhlIGRlc3RydWN0b3IgaW4gY2xhc3MgdHlwZSBULgorICAgUmV0dXJuIDEgaWYgdGhlIGRlc3RydWN0b3Igd2FzIGZvdW5kLCBvdGhlcndpc2UsIHJldHVybiAwLiAgKi8KKworaW50CitnZXRfZGVzdHJ1Y3Rvcl9mbl9maWVsZCAodCwgbWV0aG9kX2luZGV4cCwgZmllbGRfaW5kZXhwKQorICAgICBzdHJ1Y3QgdHlwZSAqdDsKKyAgICAgaW50ICptZXRob2RfaW5kZXhwOworICAgICBpbnQgKmZpZWxkX2luZGV4cDsKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IFRZUEVfTkZOX0ZJRUxEUyAodCk7IGkrKykKKyAgICB7CisgICAgICBpbnQgajsKKyAgICAgIHN0cnVjdCBmbl9maWVsZCAqZiA9IFRZUEVfRk5fRklFTERMSVNUMSAodCwgaSk7CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBUWVBFX0ZOX0ZJRUxETElTVF9MRU5HVEggKHQsIGkpOyBqKyspCisJeworCSAgaWYgKERFU1RSVUNUT1JfUFJFRklYX1AgKFRZUEVfRk5fRklFTERfUEhZU05BTUUgKGYsIGopKSkKKwkgICAgeworCSAgICAgICptZXRob2RfaW5kZXhwID0gaTsKKwkgICAgICAqZmllbGRfaW5kZXhwID0gajsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBBZGRlZCBieSBCcnlhbiBCb3JlaGFtLCBLZXdpbGwsIFN1biBTZXAgMTcgMTg6MDc6MTcgMTk4OS4KKworICAgSWYgdGhpcyBpcyBhIHN0dWJiZWQgc3RydWN0IChpLmUuIGRlY2xhcmVkIGFzIHN0cnVjdCBmb28gKiksIHNlZSBpZgorICAgd2UgY2FuIGZpbmQgYSBmdWxsIGRlZmluaXRpb24gaW4gc29tZSBvdGhlciBmaWxlLiBJZiBzbywgY29weSB0aGlzCisgICBkZWZpbml0aW9uLCBzbyB3ZSBjYW4gdXNlIGl0IGluIGZ1dHVyZS4gIFRoZXJlIHVzZWQgdG8gYmUgYSBjb21tZW50IChidXQKKyAgIG5vdCBhbnkgY29kZSkgdGhhdCBpZiB3ZSBkb24ndCBmaW5kIGEgZnVsbCBkZWZpbml0aW9uLCB3ZSdkIHNldCBhIGZsYWcKKyAgIHNvIHdlIGRvbid0IHNwZW5kIHRpbWUgaW4gdGhlIGZ1dHVyZSBjaGVja2luZyB0aGUgc2FtZSB0eXBlLiAgVGhhdCB3b3VsZAorICAgYmUgYSBtaXN0YWtlLCB0aG91Z2gtLXdlIG1pZ2h0IGxvYWQgaW4gbW9yZSBzeW1ib2xzIHdoaWNoIGNvbnRhaW4gYQorICAgZnVsbCBkZWZpbml0aW9uIGZvciB0aGUgdHlwZS4KKworICAgVGhpcyB1c2VkIHRvIGJlIGNvZGVkIGFzIGEgbWFjcm8sIGJ1dCBJIGRvbid0IHRoaW5rIGl0IGlzIGNhbGxlZCAKKyAgIG9mdGVuIGVub3VnaCB0byBtZXJpdCBzdWNoIHRyZWF0bWVudC4gICovCisKK3N0cnVjdCBjb21wbGFpbnQgc3R1Yl9ub25hbWVfY29tcGxhaW50ID0KKyAgeyJzdHViIHR5cGUgaGFzIE5VTEwgbmFtZSIsIDAsIDB9OworCitzdHJ1Y3QgdHlwZSAqCitjaGVja190eXBlZGVmICh0eXBlKQorICAgICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgc3RydWN0IHR5cGUgKm9yaWdfdHlwZSA9IHR5cGU7CisgIHdoaWxlIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9UWVBFREVGKQorICAgIHsKKyAgICAgIGlmICghVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpCisJeworCSAgY2hhciogbmFtZTsKKwkgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKworCSAgLyogSXQgaXMgZGFuZ2Vyb3VzIHRvIGNhbGwgbG9va3VwX3N5bWJvbCBpZiB3ZSBhcmUgY3VycmVudGx5CisJICAgICByZWFkaW5nIGEgc3ltdGFiLiAgSW5maW5pdGUgcmVjdXJzaW9uIGlzIG9uZSBkYW5nZXIuICovCisJICBpZiAoY3VycmVudGx5X3JlYWRpbmdfc3ltdGFiKQorCSAgICByZXR1cm4gdHlwZTsKKworCSAgbmFtZSA9IHR5cGVfbmFtZV9ub190YWcgKHR5cGUpOworCSAgLyogRklYTUU6IHNob3VsZG4ndCB3ZSBzZXBhcmF0ZWx5IGNoZWNrIHRoZSBUWVBFX05BTUUgYW5kIHRoZQorCSAgICAgVFlQRV9UQUdfTkFNRSwgYW5kIGxvb2sgaW4gU1RSVUNUX05BTUVTUEFDRSBhbmQvb3IgVkFSX05BTUVTUEFDRQorCSAgICAgYXMgYXBwcm9wcmlhdGU/ICAodGhpcyBjb2RlIHdhcyB3cml0dGVuIGJlZm9yZSBUWVBFX05BTUUgYW5kCisJICAgICBUWVBFX1RBR19OQU1FIHdlcmUgc2VwYXJhdGUpLiAgKi8KKwkgIGlmIChuYW1lID09IE5VTEwpCisJICAgIHsKKwkgICAgICBjb21wbGFpbiAoJnN0dWJfbm9uYW1lX2NvbXBsYWludCk7CisJICAgICAgcmV0dXJuIHR5cGU7CisJICAgIH0KKwkgIHN5bSA9IGxvb2t1cF9zeW1ib2wgKG5hbWUsIDAsIFNUUlVDVF9OQU1FU1BBQ0UsIDAsIAorCQkJICAgICAgIChzdHJ1Y3Qgc3ltdGFiICoqKSBOVUxMKTsKKwkgIGlmIChzeW0pCisJICAgIFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpID0gU1lNQk9MX1RZUEUgKHN5bSk7CisJICBlbHNlCisJICAgIFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpID0gYWxsb2NfdHlwZSAoTlVMTCk7ICAvKiBUWVBFX0NPREVfVU5ERUYgKi8KKwl9CisgICAgICB0eXBlID0gVFlQRV9UQVJHRVRfVFlQRSAodHlwZSk7CisgICAgfQorCisgIC8qIElmIHRoaXMgaXMgYSBzdHJ1Y3QvY2xhc3MvdW5pb24gd2l0aCBubyBmaWVsZHMsIHRoZW4gY2hlY2sgd2hldGhlciBhCisgICAgIGZ1bGwgZGVmaW5pdGlvbiBleGlzdHMgc29tZXdoZXJlIGVsc2UuICBUaGlzIGlzIGZvciBzeXN0ZW1zIHdoZXJlIGEKKyAgICAgdHlwZSBkZWZpbml0aW9uIHdpdGggbm8gZmllbGRzIGlzIGlzc3VlZCBmb3Igc3VjaCB0eXBlcywgaW5zdGVhZCBvZgorICAgICBpZGVudGlmeWluZyB0aGVtIGFzIHN0dWIgdHlwZXMgaW4gdGhlIGZpcnN0IHBsYWNlICovIAorICAgICAKKyAgaWYgKFRZUEVfSVNfT1BBUVVFICh0eXBlKSAmJiBvcGFxdWVfdHlwZV9yZXNvbHV0aW9uICYmICFjdXJyZW50bHlfcmVhZGluZ19zeW10YWIpCisgICAgeworICAgICAgY2hhciAqIG5hbWUgPSB0eXBlX25hbWVfbm9fdGFnICh0eXBlKTsKKyAgICAgIHN0cnVjdCB0eXBlICogbmV3dHlwZTsKKyAgICAgIGlmIChuYW1lID09IE5VTEwpCisJeworCSAgY29tcGxhaW4gKCZzdHViX25vbmFtZV9jb21wbGFpbnQpOworCSAgcmV0dXJuIHR5cGU7CisJfQorICAgICAgbmV3dHlwZSA9IGxvb2t1cF90cmFuc3BhcmVudF90eXBlIChuYW1lKTsKKyAgICAgIGlmIChuZXd0eXBlKQorCXsKKwkgIG1lbWNweSAoKGNoYXIgKikgdHlwZSwgKGNoYXIgKikgbmV3dHlwZSwgc2l6ZW9mIChzdHJ1Y3QgdHlwZSkpOworCX0KKyAgICB9CisgIC8qIE90aGVyd2lzZSwgcmVseSBvbiB0aGUgc3R1YiBmbGFnIGJlaW5nIHNldCBmb3Igb3BhcXVlL3N0dWJiZWQgdHlwZXMgKi8KKyAgZWxzZSBpZiAoKFRZUEVfRkxBR1ModHlwZSkgJiBUWVBFX0ZMQUdfU1RVQikgJiYgISBjdXJyZW50bHlfcmVhZGluZ19zeW10YWIpCisgICAgeworICAgICAgY2hhciogbmFtZSA9IHR5cGVfbmFtZV9ub190YWcgKHR5cGUpOworICAgICAgLyogRklYTUU6IHNob3VsZG4ndCB3ZSBzZXBhcmF0ZWx5IGNoZWNrIHRoZSBUWVBFX05BTUUgYW5kIHRoZQorCSBUWVBFX1RBR19OQU1FLCBhbmQgbG9vayBpbiBTVFJVQ1RfTkFNRVNQQUNFIGFuZC9vciBWQVJfTkFNRVNQQUNFCisJIGFzIGFwcHJvcHJpYXRlPyAgKHRoaXMgY29kZSB3YXMgd3JpdHRlbiBiZWZvcmUgVFlQRV9OQU1FIGFuZAorCSBUWVBFX1RBR19OQU1FIHdlcmUgc2VwYXJhdGUpLiAgKi8KKyAgICAgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgICAgIGlmIChuYW1lID09IE5VTEwpCisJeworCSAgY29tcGxhaW4gKCZzdHViX25vbmFtZV9jb21wbGFpbnQpOworCSAgcmV0dXJuIHR5cGU7CisJfQorICAgICAgc3ltID0gbG9va3VwX3N5bWJvbCAobmFtZSwgMCwgU1RSVUNUX05BTUVTUEFDRSwgMCwgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpOworICAgICAgaWYgKHN5bSkKKwl7CisJICBtZW1jcHkgKChjaGFyICopdHlwZSwgKGNoYXIgKilTWU1CT0xfVFlQRShzeW0pLCBzaXplb2YgKHN0cnVjdCB0eXBlKSk7CisJfQorICAgIH0KKworICBpZiAoVFlQRV9GTEFHUyAodHlwZSkgJiBUWVBFX0ZMQUdfVEFSR0VUX1NUVUIpCisgICAgeworICAgICAgc3RydWN0IHR5cGUgKnJhbmdlX3R5cGU7CisgICAgICBzdHJ1Y3QgdHlwZSAqdGFyZ2V0X3R5cGUgPSBjaGVja190eXBlZGVmIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSk7CisKKyAgICAgIGlmIChUWVBFX0ZMQUdTICh0YXJnZXRfdHlwZSkgJiAoVFlQRV9GTEFHX1NUVUIgfCBUWVBFX0ZMQUdfVEFSR0VUX1NUVUIpKQorCXsgfQorICAgICAgZWxzZSBpZiAoVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfQVJSQVkKKwkgICAgICAgJiYgVFlQRV9ORklFTERTICh0eXBlKSA9PSAxCisJICAgICAgICYmIChUWVBFX0NPREUgKHJhbmdlX3R5cGUgPSBUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIDApKQorCQkgICA9PSBUWVBFX0NPREVfUkFOR0UpKQorCXsKKwkgIC8qIE5vdyByZWNvbXB1dGUgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgdHlwZSwgYmFzZWQgb24gaXRzCisJICAgICBudW1iZXIgb2YgZWxlbWVudHMgYW5kIHRoZSB0YXJnZXQgdHlwZSdzIGxlbmd0aC4gICovCisJICBUWVBFX0xFTkdUSCAodHlwZSkgPQorCSAgICAoKFRZUEVfRklFTERfQklUUE9TIChyYW5nZV90eXBlLCAxKQorCSAgICAgIC0gVFlQRV9GSUVMRF9CSVRQT1MgKHJhbmdlX3R5cGUsIDApCisJICAgICAgKyAxKQorCSAgICAgKiBUWVBFX0xFTkdUSCAodGFyZ2V0X3R5cGUpKTsKKwkgIFRZUEVfRkxBR1MgKHR5cGUpICY9IH5UWVBFX0ZMQUdfVEFSR0VUX1NUVUI7CisJfQorICAgICAgZWxzZSBpZiAoVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfUkFOR0UpCisJeworCSAgVFlQRV9MRU5HVEggKHR5cGUpID0gVFlQRV9MRU5HVEggKHRhcmdldF90eXBlKTsKKwkgIFRZUEVfRkxBR1MgKHR5cGUpICY9IH5UWVBFX0ZMQUdfVEFSR0VUX1NUVUI7CisJfQorICAgIH0KKyAgLyogQ2FjaGUgVFlQRV9MRU5HVEggZm9yIGZ1dHVyZSB1c2UuICovCisgIFRZUEVfTEVOR1RIIChvcmlnX3R5cGUpID0gVFlQRV9MRU5HVEggKHR5cGUpOworICByZXR1cm4gdHlwZTsKK30KKworLyogTmV3IGNvZGUgYWRkZWQgdG8gc3VwcG9ydCBwYXJzaW5nIG9mIENmcm9udCBzdGFicyBzdHJpbmdzICovCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNkZWZpbmUgSU5JVF9FWFRSQSB7IHBleHRyYXMtPmxlbj0wOyBwZXh0cmFzLT5zdHJbMF09J1wwJzsgfQorI2RlZmluZSBBRERfRVhUUkEoYykgeyBwZXh0cmFzLT5zdHJbcGV4dHJhcy0+bGVuKytdPWM7IH0KKworc3RhdGljIHZvaWQgCithZGRfbmFtZShwZXh0cmFzLG4pIAorICBzdHJ1Y3QgZXh0cmEgKiBwZXh0cmFzOworICBjaGFyICogbjsgCit7CisgIGludCBubGVuOworCisgIGlmICgobmxlbiA9IChuID8gc3RybGVuKG4pIDogMCkpPT0wKSAKKyAgICByZXR1cm47CisgIHNwcmludGYocGV4dHJhcy0+c3RyK3BleHRyYXMtPmxlbiwiJWQlcyIsbmxlbixuKTsKKyAgcGV4dHJhcy0+bGVuPXN0cmxlbihwZXh0cmFzLT5zdHIpOworfQorCitzdGF0aWMgdm9pZCAKK2FkZF9tYW5nbGVkX3R5cGUocGV4dHJhcyx0KSAKKyAgc3RydWN0IGV4dHJhICogcGV4dHJhczsKKyAgc3RydWN0IHR5cGUgKiB0OworeworICBlbnVtIHR5cGVfY29kZSB0Y29kZTsKKyAgaW50IHRsZW4sIHRmbGFnczsKKyAgY2hhciAqIHRuYW1lOworCisgIHRjb2RlID0gVFlQRV9DT0RFKHQpOworICB0bGVuID0gVFlQRV9MRU5HVEgodCk7CisgIHRmbGFncyA9IFRZUEVfRkxBR1ModCk7CisgIHRuYW1lID0gVFlQRV9OQU1FKHQpOworICAvKiBhcmdzIG9mICIuLi4iIHNlZW0gdG8gZ2V0IG1hbmdsZWQgYXMgImUiICovCisKKyAgc3dpdGNoICh0Y29kZSkgCisgICAgeworICAgICAgY2FzZSBUWVBFX0NPREVfSU5UOiAKKyAgICAgICAgaWYgKHRmbGFncz09MSkKKyAgICAgICAgICBBRERfRVhUUkEoJ1UnKTsKKyAgICAgICAgc3dpdGNoICh0bGVuKSAKKyAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgIEFERF9FWFRSQSgnYycpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgQUREX0VYVFJBKCdzJyk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OiAKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICBjaGFyKiBwbmFtZTsKKyAgICAgICAgICAgICAgaWYgKChwbmFtZT1zdHJyY2hyKHRuYW1lLCdsJykscG5hbWUpICYmICFzdHJjbXAocG5hbWUsImxvbmciKSkKKyAgICAgICAgICAgICAgICBBRERfRVhUUkEoJ2wnKQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUREX0VYVFJBKCdpJykKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IAorICAgICAgICAgICAgICB7CisgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgbXNnID0geyJCYWQgaW50IHR5cGUgY29kZSBsZW5ndGggeCV4XG4iLDAsMH07CisgICAgICAgICAgCisgICAgICAgICAgICAgICAgY29tcGxhaW4gKCZtc2csIHRsZW4pOworICAgICAgICAgIAorICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT0RFX0ZMVDogCisgICAgICAgICAgc3dpdGNoICh0bGVuKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIEFERF9FWFRSQSgnZicpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgQUREX0VYVFJBKCdkJyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgQUREX0VYVFJBKCdyJyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6IAorCSAJeworICAgICAgICAgICAgICAgICAgc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgbXNnID0geyJCYWQgZmxvYXQgdHlwZSBjb2RlIGxlbmd0aCB4JXhcbiIsMCwwfTsKKyAgICAgICAgICAJICBjb21wbGFpbiAoJm1zZywgdGxlbik7CisgICAgICAgICAgICAJfQorICAgICAgCSAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPREVfUkVGOgorICAgICAgICBBRERfRVhUUkEoJ1InKTsKKyAgICAgICAgLyogZm9sbG93ZWQgYnkgd2hhdCBpdCdzIGEgcmVmIHRvICovCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPREVfUFRSOgorICAgICAgICBBRERfRVhUUkEoJ1AnKTsKKyAgICAgICAgLyogZm9sbG93ZWQgYnkgd2hhdCBpdCdzIGEgcHRyIHRvICovCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPREVfVFlQRURFRjogCisgICAgICAgIHsKKyAgICAgICAgICBzdGF0aWMgc3RydWN0IGNvbXBsYWludCBtc2cgPSB7IlR5cGVkZWZzIGluIG92ZXJsb2FkZWQgZnVuY3Rpb25zIG5vdCB5ZXQgc3VwcG9ydGVkXG4iLDAsMH07CisgICAgICAgICAgY29tcGxhaW4gKCZtc2cpOworICAgICAgICB9CisgICAgICAvKiBmb2xsb3dlZCBieSB0eXBlIGJ5dGVzICYgbmFtZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0NPREVfRlVOQzoKKyAgICAgIEFERF9FWFRSQSgnRicpOworICAgICAgLyogZm9sbG93ZWQgYnkgZnVuYydzIGFyZyAnXycgJiByZXQgdHlwZXMgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9DT0RFX1ZPSUQ6CisgICAgICBBRERfRVhUUkEoJ3YnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9DT0RFX01FVEhPRDoKKyAgICAgIEFERF9FWFRSQSgnTScpOworICAgICAgLyogZm9sbG93ZWQgYnkgbmFtZSBvZiBjbGFzcyBhbmQgZnVuYydzIGFyZyAnXycgJiByZXQgdHlwZXMgKi8KKyAgICAgIGFkZF9uYW1lKHBleHRyYXMsdG5hbWUpOworICAgICAgQUREX0VYVFJBKCdGJyk7ICAvKiB0aGVuIG1hbmdsZSBmdW5jdGlvbiAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0NPREVfU1RSVUNUOiAvKiBDIHN0cnVjdCAqLworICAgIGNhc2UgVFlQRV9DT0RFX1VOSU9OOiAgLyogQyB1bmlvbiAqLworICAgIGNhc2UgVFlQRV9DT0RFX0VOVU06ICAgLyogRW51bWVyYXRpb24gdHlwZSAqLworICAgICAgLyogZm9sbG93ZWQgYnkgbmFtZSBvZiB0eXBlICovCisgICAgICBhZGRfbmFtZShwZXh0cmFzLHRuYW1lKTsKKyAgICAgIGJyZWFrOworCisgICAgLyogZXJyb3JzIHBvc3NpYmxlIHR5cGVzL25vdCBzdXBwb3J0ZWQgKi8KKyAgICBjYXNlIFRZUEVfQ09ERV9DSEFSOiAgICAgICAgICAgICAgCisgICAgY2FzZSBUWVBFX0NPREVfQVJSQVk6ICAvKiBBcnJheSB0eXBlICovCisgICAgY2FzZSBUWVBFX0NPREVfTUVNQkVSOiAvKiBNZW1iZXIgdHlwZSAqLworICAgIGNhc2UgVFlQRV9DT0RFX0JPT0w6CisgICAgY2FzZSBUWVBFX0NPREVfQ09NUExFWDogICAgICAgICAgICAvKiBDb21wbGV4IGZsb2F0ICovCisgICAgY2FzZSBUWVBFX0NPREVfVU5ERUY6CisgICAgY2FzZSBUWVBFX0NPREVfU0VUOiAgICAgICAgICAgICAgICAvKiBQYXNjYWwgc2V0cyAqLworICAgIGNhc2UgVFlQRV9DT0RFX1JBTkdFOiAgCisgICAgY2FzZSBUWVBFX0NPREVfU1RSSU5HOgorICAgIGNhc2UgVFlQRV9DT0RFX0JJVFNUUklORzoKKyAgICBjYXNlIFRZUEVfQ09ERV9FUlJPUjoKKyAgICBkZWZhdWx0OiAKKyAgICAgIHsKKyAgICAgICAgc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgbXNnID0geyJVbmtub3duIHR5cGUgY29kZSB4JXhcbiIsMCwwfTsKKyAgICAgICAgY29tcGxhaW4gKCZtc2csIHRjb2RlKTsKKyAgICAgIH0KKyAgICB9CisgIGlmICh0LT50YXJnZXRfdHlwZSkKKyAgICBhZGRfbWFuZ2xlZF90eXBlKHBleHRyYXMsdC0+dGFyZ2V0X3R5cGUpOworfQorCisjaWYgMAordm9pZAorY2Zyb250X21hbmdsZV9uYW1lKHR5cGUsIGksIGopCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBpbnQgaTsKKyAgICAgaW50IGo7Cit7CisgICBzdHJ1Y3QgZm5fZmllbGQgKmY7CisgICBjaGFyICptYW5nbGVkX25hbWUgPSBnZGJfbWFuZ2xlX25hbWUgKHR5cGUsIGksIGopOworCisgICBmID0gVFlQRV9GTl9GSUVMRExJU1QxICh0eXBlLCBpKTsJLyogbW92ZWQgZnJvbSBiZWxvdyAqLworCisgICAvKiBrbHVkZ2UgdG8gc3VwcG9ydCBjZnJvbnQgbWV0aG9kcyAtIGdkYiBleHBlY3RzIHRvIGZpbmQgIkYiIGZvciAKKyAgICAgIEFSTV9tYW5nbGVkIG5hbWVzLCBzbyB3aGVuIHdlIG1hbmdsZSwgd2UgaGF2ZSB0byBhZGQgaXQgaGVyZSAqLworICAgaWYgKEFSTV9ERU1BTkdMSU5HKSAKKyAgICAgeworCWludCBrOworCWNoYXIgKiBhcm1fbWFuZ2xlZF9uYW1lOworCXN0cnVjdCBmbl9maWVsZCAqbWV0aG9kID0gJmZbal07CisJY2hhciAqZmllbGRfbmFtZSA9IFRZUEVfRk5fRklFTERMSVNUX05BTUUgKHR5cGUsIGkpOworICAgICAgICBjaGFyICpwaHlzbmFtZSA9IFRZUEVfRk5fRklFTERfUEhZU05BTUUgKGYsIGopOworICAgICAgICBjaGFyICpuZXduYW1lID0gdHlwZV9uYW1lX25vX3RhZyAodHlwZSk7CisKKyAgICAgICAgc3RydWN0IHR5cGUgKmZ0eXBlID0gVFlQRV9GTl9GSUVMRF9UWVBFIChmLCBqKTsKKwlpbnQgbmFyZ3MgPSBUWVBFX05GSUVMRFMoZnR5cGUpOwkvKiBudW1iZXIgb2YgYXJncyAqLworCXN0cnVjdCBleHRyYSBleHRyYXMsICogcGV4dHJhcyA9ICZleHRyYXM7CQorCUlOSVRfRVhUUkEKKworCWlmIChUWVBFX0ZOX0ZJRUxEX1NUQVRJQ19QIChmLCBqKSkJLyogaiBmb3Igc3VibGlzdCB3aXRoaW4gdGhpcyBsaXN0ICovCisJICBBRERfRVhUUkEoJ1MnKQorCUFERF9FWFRSQSgnRicpCisJLyogYWRkIGFyZ3MgaGVyZSEgKi8KKwlpZiAobmFyZ3MgPD0gMSkJCQkJLyogbm8gYXJncyBiZXNpZGVzIHRoaXMgKi8KKwkJQUREX0VYVFJBKCd2JykKKwllbHNlIHsKKwkgIGZvciAoaz0xOyBrPG5hcmdzOyBrKyspIAorCSAgICB7CisJICAgICAgc3RydWN0IHR5cGUgKiB0OworCSAgICAgIHQgPSBUWVBFX0ZJRUxEX1RZUEUoZnR5cGUsayk7CisJICAgICAgYWRkX21hbmdsZWRfdHlwZShwZXh0cmFzLHQpOworCSAgICB9CisJfQorCUFERF9FWFRSQSgnXDAnKQorCXByaW50ZigiYWRkX21hbmdsZWRfdHlwZTogJXNcbiIsZXh0cmFzLnN0cik7IC8qIEZJWE1FICovCisJYXJtX21hbmdsZWRfbmFtZSA9IG1hbGxvYyhzdHJsZW4obWFuZ2xlZF9uYW1lKStleHRyYXMubGVuKTsKKyAgICAgICAgc3ByaW50Zihhcm1fbWFuZ2xlZF9uYW1lLCIlcyVzIixtYW5nbGVkX25hbWUsZXh0cmFzLnN0cik7CisJZnJlZShtYW5nbGVkX25hbWUpOworCW1hbmdsZWRfbmFtZSA9IGFybV9tYW5nbGVkX25hbWU7CisgICAgIH0KK30KKyNlbmRpZgkvKiAwICovCisKKyN1bmRlZiBBRERfRVhUUkEKKy8qIEVuZCBvZiBuZXcgY29kZSBhZGRlZCB0byBzdXBwb3J0IHBhcnNpbmcgb2YgQ2Zyb250IHN0YWJzIHN0cmluZ3MgKi8KKworLyogVWdseSBoYWNrIHRvIGNvbnZlcnQgbWV0aG9kIHN0dWJzIGludG8gbWV0aG9kIHR5cGVzLgorCisgICBIZSBhaW4ndCBraWRkaW4nLiAgVGhpcyBkZW1hbmdsZXMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBpbnRvIGEgc3RyaW5nCisgICBpbmNsdWRpbmcgYXJndW1lbnQgdHlwZXMsIHBhcnNlcyBvdXQgZWFjaCBhcmd1bWVudCB0eXBlLCBnZW5lcmF0ZXMKKyAgIGEgc3RyaW5nIGNhc3RpbmcgYSB6ZXJvIHRvIHRoYXQgdHlwZSwgZXZhbHVhdGVzIHRoZSBzdHJpbmcsIGFuZCBzdHVmZnMKKyAgIHRoZSByZXN1bHRpbmcgdHlwZSBpbnRvIGFuIGFyZ3R5cGUgdmVjdG9yISEhICBUaGVuIGl0IGtub3dzIHRoZSB0eXBlCisgICBvZiB0aGUgd2hvbGUgZnVuY3Rpb24gKGluY2x1ZGluZyBhcmd1bWVudCB0eXBlcyBmb3Igb3ZlcmxvYWRpbmcpLAorICAgd2hpY2ggaW5mbyB1c2VkIHRvIGJlIGluIHRoZSBzdGFiJ3MgYnV0IHdhcyByZW1vdmVkIHRvIGhhY2sgYmFjaworICAgdGhlIHNwYWNlIHJlcXVpcmVkIGZvciB0aGVtLiAgKi8KKwordm9pZAorY2hlY2tfc3R1Yl9tZXRob2QgKHR5cGUsIG1ldGhvZF9pZCwgc2lnbmF0dXJlX2lkKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgaW50IG1ldGhvZF9pZDsKKyAgICAgaW50IHNpZ25hdHVyZV9pZDsKK3sKKyAgc3RydWN0IGZuX2ZpZWxkICpmOworICBjaGFyICptYW5nbGVkX25hbWUgPSBnZGJfbWFuZ2xlX25hbWUgKHR5cGUsIG1ldGhvZF9pZCwgc2lnbmF0dXJlX2lkKTsKKyAgY2hhciAqZGVtYW5nbGVkX25hbWUgPSBjcGx1c19kZW1hbmdsZSAobWFuZ2xlZF9uYW1lLAorCQkJCQkgRE1HTF9QQVJBTVMgfCBETUdMX0FOU0kpOworICBjaGFyICphcmd0eXBldGV4dCwgKnA7CisgIGludCBkZXB0aCA9IDAsIGFyZ2NvdW50ID0gMTsKKyAgc3RydWN0IHR5cGUgKiphcmd0eXBlczsKKyAgc3RydWN0IHR5cGUgKm10eXBlOworCisgIC8qIE1ha2Ugc3VyZSB3ZSBnb3QgYmFjayBhIGZ1bmN0aW9uIHN0cmluZyB0aGF0IHdlIGNhbiB1c2UuICAqLworICBpZiAoZGVtYW5nbGVkX25hbWUpCisgICAgcCA9IHN0cmNociAoZGVtYW5nbGVkX25hbWUsICcoJyk7CisKKyAgaWYgKGRlbWFuZ2xlZF9uYW1lID09IE5VTEwgfHwgcCA9PSBOVUxMKQorICAgIGVycm9yICgiSW50ZXJuYWw6IENhbm5vdCBkZW1hbmdsZSBtYW5nbGVkIG5hbWUgYCVzJy4iLCBtYW5nbGVkX25hbWUpOworCisgIC8qIE5vdywgcmVhZCBpbiB0aGUgcGFyYW1ldGVycyB0aGF0IGRlZmluZSB0aGlzIHR5cGUuICAqLworICBwICs9IDE7CisgIGFyZ3R5cGV0ZXh0ID0gcDsKKyAgd2hpbGUgKCpwKQorICAgIHsKKyAgICAgIGlmICgqcCA9PSAnKCcpCisJeworCSAgZGVwdGggKz0gMTsKKwl9CisgICAgICBlbHNlIGlmICgqcCA9PSAnKScpCisJeworCSAgZGVwdGggLT0gMTsKKwl9CisgICAgICBlbHNlIGlmICgqcCA9PSAnLCcgJiYgZGVwdGggPT0gMCkKKwl7CisJICBhcmdjb3VudCArPSAxOworCX0KKworICAgICAgcCArPSAxOworICAgIH0KKworICAvKiBXZSBuZWVkIHR3byBtb3JlIHNsb3RzOiBvbmUgZm9yIHRoZSBUSElTIHBvaW50ZXIsIGFuZCBvbmUgZm9yIHRoZQorICAgICBOVUxMIFsuLi5dIG9yIHZvaWQgW2VuZCBvZiBhcmdsaXN0XS4gICovCisKKyAgYXJndHlwZXMgPSAoc3RydWN0IHR5cGUgKiopCisgICAgVFlQRV9BTExPQyAodHlwZSwgKGFyZ2NvdW50ICsgMikgKiBzaXplb2YgKHN0cnVjdCB0eXBlICopKTsKKyAgcCA9IGFyZ3R5cGV0ZXh0OworICAvKiBGSVhNRTogVGhpcyBpcyB3cm9uZyBmb3Igc3RhdGljIG1lbWJlciBmdW5jdGlvbnMuICAqLworICBhcmd0eXBlc1swXSA9IGxvb2t1cF9wb2ludGVyX3R5cGUgKHR5cGUpOworICBhcmdjb3VudCA9IDE7CisKKyAgaWYgKCpwICE9ICcpJykJCQkvKiAoKSBtZWFucyBubyBhcmdzLCBza2lwIHdoaWxlICovCisgICAgeworICAgICAgZGVwdGggPSAwOworICAgICAgd2hpbGUgKCpwKQorCXsKKwkgIGlmIChkZXB0aCA8PSAwICYmICgqcCA9PSAnLCcgfHwgKnAgPT0gJyknKSkKKwkgICAgeworCSAgICAgIC8qIEF2b2lkIHBhcnNpbmcgb2YgZWxsaXBzaXMsIHRoZXkgd2lsbCBiZSBoYW5kbGVkIGJlbG93LiAgKi8KKwkgICAgICBpZiAoc3RybmNtcCAoYXJndHlwZXRleHQsICIuLi4iLCBwIC0gYXJndHlwZXRleHQpICE9IDApCisJCXsKKwkJICBhcmd0eXBlc1thcmdjb3VudF0gPQorCQkgICAgICBwYXJzZV9hbmRfZXZhbF90eXBlIChhcmd0eXBldGV4dCwgcCAtIGFyZ3R5cGV0ZXh0KTsKKwkJICBhcmdjb3VudCArPSAxOworCQl9CisJICAgICAgYXJndHlwZXRleHQgPSBwICsgMTsKKwkgICAgfQorCisJICBpZiAoKnAgPT0gJygnKQorCSAgICB7CisJICAgICAgZGVwdGggKz0gMTsKKwkgICAgfQorCSAgZWxzZSBpZiAoKnAgPT0gJyknKQorCSAgICB7CisJICAgICAgZGVwdGggLT0gMTsKKwkgICAgfQorCisJICBwICs9IDE7CisJfQorICAgIH0KKworICBpZiAocFstMl0gIT0gJy4nKQkJCS8qIE5vdCAnLi4uJyAqLworICAgIHsKKyAgICAgIGFyZ3R5cGVzW2FyZ2NvdW50XSA9IGJ1aWx0aW5fdHlwZV92b2lkOwkvKiBMaXN0IHRlcm1pbmF0b3IgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBhcmd0eXBlc1thcmdjb3VudF0gPSBOVUxMOwkJLyogRWxsaXN0IHRlcm1pbmF0b3IgKi8KKyAgICB9CisKKyAgZnJlZSAoZGVtYW5nbGVkX25hbWUpOworCisgIGYgPSBUWVBFX0ZOX0ZJRUxETElTVDEgKHR5cGUsIG1ldGhvZF9pZCk7CQorCisgIFRZUEVfRk5fRklFTERfUEhZU05BTUUgKGYsIHNpZ25hdHVyZV9pZCkgPSBtYW5nbGVkX25hbWU7CisKKyAgLyogTm93IHVwZGF0ZSB0aGUgb2xkICJzdHViIiB0eXBlIGludG8gYSByZWFsIHR5cGUuICAqLworICBtdHlwZSA9IFRZUEVfRk5fRklFTERfVFlQRSAoZiwgc2lnbmF0dXJlX2lkKTsKKyAgVFlQRV9ET01BSU5fVFlQRSAobXR5cGUpID0gdHlwZTsKKyAgVFlQRV9BUkdfVFlQRVMgKG10eXBlKSA9IGFyZ3R5cGVzOworICBUWVBFX0ZMQUdTIChtdHlwZSkgJj0gflRZUEVfRkxBR19TVFVCOworICBUWVBFX0ZOX0ZJRUxEX1NUVUIgKGYsIHNpZ25hdHVyZV9pZCkgPSAwOworfQorCitjb25zdCBzdHJ1Y3QgY3BsdXNfc3RydWN0X3R5cGUgY3BsdXNfc3RydWN0X2RlZmF1bHQ7CisKK3ZvaWQKK2FsbG9jYXRlX2NwbHVzX3N0cnVjdF90eXBlICh0eXBlKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgaWYgKCFIQVZFX0NQTFVTX1NUUlVDVCAodHlwZSkpCisgICAgeworICAgICAgVFlQRV9DUExVU19TUEVDSUZJQyAodHlwZSkgPSAoc3RydWN0IGNwbHVzX3N0cnVjdF90eXBlICopCisJVFlQRV9BTExPQyAodHlwZSwgc2l6ZW9mIChzdHJ1Y3QgY3BsdXNfc3RydWN0X3R5cGUpKTsKKyAgICAgICooVFlQRV9DUExVU19TUEVDSUZJQyh0eXBlKSkgPSBjcGx1c19zdHJ1Y3RfZGVmYXVsdDsKKyAgICB9Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZSBzdGFuZGFyZCBzY2FsYXIgdHlwZXMuCisKKyAgIElmIE5BTUUgaXMgbm9uLU5VTEwgYW5kIE9CSkZJTEUgaXMgbm9uLU5VTEwsIHRoZW4gd2UgbWFrZSBhIGNvcHkKKyAgIG9mIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBuYW1lIGluIHRoZSB0eXBlX29ic3RhY2sgZm9yIHRoYXQgb2JqZmlsZSwKKyAgIGFuZCBpbml0aWFsaXplIHRoZSB0eXBlIG5hbWUgdG8gdGhhdCBjb3B5LiAgVGhlcmUgYXJlIHBsYWNlcyAobWlwc3JlYWQuYworICAgaW4gcGFydGljdWxhciwgd2hlcmUgaW5pdF90eXBlIGlzIGNhbGxlZCB3aXRoIGEgTlVMTCB2YWx1ZSBmb3IgTkFNRSkuICovCisKK3N0cnVjdCB0eXBlICoKK2luaXRfdHlwZSAoY29kZSwgbGVuZ3RoLCBmbGFncywgbmFtZSwgb2JqZmlsZSkKKyAgICAgZW51bSB0eXBlX2NvZGUgY29kZTsKKyAgICAgaW50IGxlbmd0aDsKKyAgICAgaW50IGZsYWdzOworICAgICBjaGFyICpuYW1lOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKnR5cGU7CisKKyAgdHlwZSA9IGFsbG9jX3R5cGUgKG9iamZpbGUpOworICBUWVBFX0NPREUgKHR5cGUpID0gY29kZTsKKyAgVFlQRV9MRU5HVEggKHR5cGUpID0gbGVuZ3RoOworICBUWVBFX0ZMQUdTICh0eXBlKSB8PSBmbGFnczsKKyAgaWYgKChuYW1lICE9IE5VTEwpICYmIChvYmpmaWxlICE9IE5VTEwpKQorICAgIHsKKyAgICAgIFRZUEVfTkFNRSAodHlwZSkgPQorCW9ic2F2ZXN0cmluZyAobmFtZSwgc3RybGVuIChuYW1lKSwgJm9iamZpbGUgLT4gdHlwZV9vYnN0YWNrKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBUWVBFX05BTUUgKHR5cGUpID0gbmFtZTsKKyAgICB9CisKKyAgLyogQysrIGZhbmNpZXMuICAqLworCisgIGlmIChjb2RlID09IFRZUEVfQ09ERV9TVFJVQ1QgfHwgY29kZSA9PSBUWVBFX0NPREVfVU5JT04pCisgICAgeworICAgICAgSU5JVF9DUExVU19TUEVDSUZJQyAodHlwZSk7CisgICAgfQorICByZXR1cm4gKHR5cGUpOworfQorCisvKiBMb29rIHVwIGEgZnVuZGFtZW50YWwgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCBvYmpmaWxlLgorICAgTWF5IG5lZWQgdG8gY29uc3RydWN0IHN1Y2ggYSB0eXBlIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHVzZS4KKworICAgU29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIChFTEYsIENPRkYsIGV0YykgZG8gbm90IGRlZmluZSBmdW5kYW1lbnRhbAorICAgdHlwZXMgc3VjaCBhcyAiaW50IiBvciAiZG91YmxlIi4gIE90aGVycyAoc3RhYnMgZm9yIGV4YW1wbGUpLCBkbworICAgZGVmaW5lIGZ1bmRhbWVudGFsIHR5cGVzLgorCisgICBGb3IgdGhlIGZvcm1hdHMgd2hpY2ggZG9uJ3QgcHJvdmlkZSBmdW5kYW1lbnRhbCB0eXBlcywgZ2RiIGNhbiBjcmVhdGUKKyAgIHN1Y2ggdHlwZXMsIHVzaW5nIGRlZmF1bHRzIHJlYXNvbmFibGUgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlIGFuZAorICAgdGhlIGN1cnJlbnQgdGFyZ2V0IG1hY2hpbmUuCisKKyAgIE5PVEU6ICBUaGlzIHJvdXRpbmUgaXMgb2Jzb2xlc2NlbnQuICBFYWNoIGRlYnVnZ2luZyBmb3JtYXQgcmVhZGVyCisgICBzaG91bGQgbWFuYWdlIGl0J3Mgb3duIGZ1bmRhbWVudGFsIHR5cGVzLCBlaXRoZXIgY3JlYXRpbmcgdGhlbSBmcm9tCisgICBzdWl0YWJsZSBkZWZhdWx0cyBvciByZWFkaW5nIHRoZW0gZnJvbSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLAorICAgd2hpY2hldmVyIGlzIGFwcHJvcHJpYXRlLiAgVGhlIERXQVJGIHJlYWRlciBoYXMgYWxyZWFkeSBiZWVuCisgICBmaXhlZCB0byBkbyB0aGlzLiAgT25jZSB0aGUgb3RoZXIgcmVhZGVycyBhcmUgZml4ZWQsIHRoaXMgcm91dGluZQorICAgd2lsbCBnbyBhd2F5LiAgQWxzbyBub3RlIHRoYXQgZnVuZGFtZW50YWwgdHlwZXMgc2hvdWxkIGJlIG1hbmFnZWQKKyAgIG9uIGEgY29tcGlsYXRpb24gdW5pdCBiYXNpcyBpbiBhIG11bHRpLWxhbmd1YWdlIGVudmlyb25tZW50LCBub3QKKyAgIG9uIGEgbGlua2FnZSB1bml0IGJhc2lzIGFzIGlzIGRvbmUgaGVyZS4gKi8KKworCitzdHJ1Y3QgdHlwZSAqCitsb29rdXBfZnVuZGFtZW50YWxfdHlwZSAob2JqZmlsZSwgdHlwZWlkKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgaW50IHR5cGVpZDsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKip0eXBlcDsKKyAgcmVnaXN0ZXIgaW50IG5ieXRlczsKKworICBpZiAodHlwZWlkIDwgMCB8fCB0eXBlaWQgPj0gRlRfTlVNX01FTUJFUlMpCisgICAgeworICAgICAgZXJyb3IgKCJpbnRlcm5hbCBlcnJvciAtIGludmFsaWQgZnVuZGFtZW50YWwgdHlwZSBpZCAlZCIsIHR5cGVpZCk7CisgICAgfQorCisgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgbmVlZCBhIGZ1bmRhbWVudGFsIHR5cGUgZm9yIHRoaXMgb2JqZmlsZQorICAgICB0aGVuIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgdmVjdG9yIG9mIHR5cGUgcG9pbnRlcnMuICovCisgIAorICBpZiAob2JqZmlsZSAtPiBmdW5kYW1lbnRhbF90eXBlcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIG5ieXRlcyA9IEZUX05VTV9NRU1CRVJTICogc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKTsKKyAgICAgIG9iamZpbGUgLT4gZnVuZGFtZW50YWxfdHlwZXMgPSAoc3RydWN0IHR5cGUgKiopCisJb2JzdGFja19hbGxvYyAoJm9iamZpbGUgLT4gdHlwZV9vYnN0YWNrLCBuYnl0ZXMpOworICAgICAgbWVtc2V0ICgoY2hhciAqKSBvYmpmaWxlIC0+IGZ1bmRhbWVudGFsX3R5cGVzLCAwLCBuYnl0ZXMpOworICAgICAgT0JKU1RBVCAob2JqZmlsZSwgbl90eXBlcyArPSBGVF9OVU1fTUVNQkVSUyk7CisgICAgfQorCisgIC8qIExvb2sgZm9yIHRoaXMgcGFydGljdWxhciB0eXBlIGluIHRoZSBmdW5kYW1lbnRhbCB0eXBlIHZlY3Rvci4gIElmIG9uZSBpcworICAgICBub3QgZm91bmQsIGNyZWF0ZSBhbmQgaW5zdGFsbCBvbmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlLiAqLworCisgIHR5cGVwID0gb2JqZmlsZSAtPiBmdW5kYW1lbnRhbF90eXBlcyArIHR5cGVpZDsKKyAgaWYgKCp0eXBlcCA9PSBOVUxMKQorICAgIHsKKyAgICAgICp0eXBlcCA9IGNyZWF0ZV9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCB0eXBlaWQpOworICAgIH0KKworICByZXR1cm4gKCp0eXBlcCk7Cit9CisKK2ludAorY2FuX2RlcmVmZXJlbmNlICh0KQorICAgICBzdHJ1Y3QgdHlwZSAqdDsKK3sKKyAgLyogRklYTUU6IFNob3VsZCB3ZSByZXR1cm4gdHJ1ZSBmb3IgcmVmZXJlbmNlcyBhcyB3ZWxsIGFzIHBvaW50ZXJzPyAgKi8KKyAgQ0hFQ0tfVFlQRURFRiAodCk7CisgIHJldHVybgorICAgICh0ICE9IE5VTEwKKyAgICAgJiYgVFlQRV9DT0RFICh0KSA9PSBUWVBFX0NPREVfUFRSCisgICAgICYmIFRZUEVfQ09ERSAoVFlQRV9UQVJHRVRfVFlQRSAodCkpICE9IFRZUEVfQ09ERV9WT0lEKTsKK30KKworLyogQ2hpbGwgdmFyeWluZyBzdHJpbmcgYW5kIGFycmF5cyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czoKKworICAgc3RydWN0IHsgaW50IF9fdmFyX2xlbmd0aDsgRUxFTUVOVF9UWVBFW01BWF9TSVpFXSBfX3Zhcl9kYXRhfTsKKworICAgUmV0dXJuIHRydWUgaWYgVFlQRSBpcyBzdWNoIGEgQ2hpbGwgdmFyeWluZyB0eXBlLiAqLworCitpbnQKK2NoaWxsX3ZhcnlpbmdfdHlwZSAodHlwZSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIGlmIChUWVBFX0NPREUgKHR5cGUpICE9IFRZUEVfQ09ERV9TVFJVQ1QKKyAgICAgIHx8IFRZUEVfTkZJRUxEUyAodHlwZSkgIT0gMgorICAgICAgfHwgc3RyY21wIChUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIDApLCAiX192YXJfbGVuZ3RoIikgIT0gMCkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIENoZWNrIHdoZXRoZXIgQkFTRSBpcyBhbiBhbmNlc3RvciBvciBiYXNlIGNsYXNzIG9yIERDTEFTUyAKKyAgIFJldHVybiAxIGlmIHNvLCBhbmQgMCBpZiBub3QuCisgICBOb3RlOiBjYWxsZXJzIG1heSB3YW50IHRvIGNoZWNrIGZvciBpZGVudGl0eSBvZiB0aGUgdHlwZXMgYmVmb3JlCisgICBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gLS0gaWRlbnRpY2FsIHR5cGVzIGFyZSBjb25zaWRlcmVkIHRvIHNhdGlzZnkKKyAgIHRoZSBhbmNlc3RvciByZWxhdGlvbnNoaXAgZXZlbiBpZiB0aGV5J3JlIGlkZW50aWNhbCAqLworCitpbnQKK2lzX2FuY2VzdG9yIChiYXNlLCBkY2xhc3MpCisgIHN0cnVjdCB0eXBlICogYmFzZTsKKyAgc3RydWN0IHR5cGUgKiBkY2xhc3M7Cit7CisgIGludCBpOworICAKKyAgQ0hFQ0tfVFlQRURFRiAoYmFzZSk7CisgIENIRUNLX1RZUEVERUYgKGRjbGFzcyk7CisKKyAgaWYgKGJhc2UgPT0gZGNsYXNzKQorICAgIHJldHVybiAxOworCisgIGZvciAoaSA9IDA7IGkgPCBUWVBFX05fQkFTRUNMQVNTRVMgKGRjbGFzcyk7IGkrKykKKyAgICBpZiAoaXNfYW5jZXN0b3IgKGJhc2UsIFRZUEVfQkFTRUNMQVNTIChkY2xhc3MsIGkpKSkKKyAgICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCisKKworLyogU2VlIHdoZXRoZXIgRENMQVNTIGhhcyBhIHZpcnR1YWwgdGFibGUuICBUaGlzIHJvdXRpbmUgaXMgYWltZWQgYXQKKyAgIHRoZSBIUC9UYWxpZ2VudCBBTlNJIEMrKyBydW50aW1lIG1vZGVsLCBhbmQgbWF5IG5vdCB3b3JrIHdpdGggb3RoZXIKKyAgIHJ1bnRpbWUgbW9kZWxzLiAgUmV0dXJuIDEgPT4gWWVzLCAwID0+IE5vLiAgKi8KKworaW50CitoYXNfdnRhYmxlIChkY2xhc3MpCisgIHN0cnVjdCB0eXBlICogZGNsYXNzOworeworICAvKiBJbiB0aGUgSFAgQU5TSSBDKysgcnVudGltZSBtb2RlbCwgYSBjbGFzcyBoYXMgYSB2dGFibGUgb25seSBpZiBpdAorICAgICBoYXMgdmlydHVhbCBmdW5jdGlvbnMgb3IgdmlydHVhbCBiYXNlcy4gICovCisKKyAgcmVnaXN0ZXIgaW50IGk7CisKKyAgaWYgKFRZUEVfQ09ERShkY2xhc3MpICE9IFRZUEVfQ09ERV9DTEFTUykKKyAgICByZXR1cm4gMDsKKyAgCisgIC8qIEZpcnN0IGNoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgdmlydHVhbCBiYXNlcyAqLworICBpZiAoVFlQRV9GSUVMRF9WSVJUVUFMX0JJVFMoZGNsYXNzKSkKKyAgICBmb3IgKGk9MDsgaSA8IFRZUEVfTl9CQVNFQ0xBU1NFUyhkY2xhc3MpOyBpKyspCisgICAgICBpZiAoQl9UU1QoVFlQRV9GSUVMRF9WSVJUVUFMX0JJVFMoZGNsYXNzKSwgaSkpCisgICAgICAgIHJldHVybiAxOworICAKKyAgLyogTmV4dCBjaGVjayBmb3IgdmlydHVhbCBmdW5jdGlvbnMgKi8KKyAgaWYgKFRZUEVfRk5fRklFTERMSVNUUyhkY2xhc3MpKQorICAgIGZvciAoaT0wOyBpIDwgVFlQRV9ORk5fRklFTERTKGRjbGFzcyk7IGkrKykKKyAgICAgIGlmIChUWVBFX0ZOX0ZJRUxEX1ZJUlRVQUxfUChUWVBFX0ZOX0ZJRUxETElTVDEoZGNsYXNzLCBpKSwgMCkpCisgICAgICAgIHJldHVybiAxOworCisgIC8qIFJlY3Vyc2Ugb24gbm9uLXZpcnR1YWwgYmFzZXMgdG8gc2VlIGlmIGFueSBvZiB0aGVtIG5lZWRzIGEgdnRhYmxlICovIAorICBpZiAoVFlQRV9GSUVMRF9WSVJUVUFMX0JJVFMoZGNsYXNzKSkKKyAgICBmb3IgKGk9MDsgaSA8IFRZUEVfTl9CQVNFQ0xBU1NFUyhkY2xhc3MpOyBpKyspCisgICAgICBpZiAoKCFCX1RTVCAoVFlQRV9GSUVMRF9WSVJUVUFMX0JJVFMoZGNsYXNzKSwgaSkpICYmCisJICAoaGFzX3Z0YWJsZSAoVFlQRV9GSUVMRF9UWVBFKGRjbGFzcywgaSkpKSkKKwlyZXR1cm4gMTsKKyAgCisgIC8qIFdlbGwsIG1heWJlIHdlIGRvbid0IG5lZWQgYSB2aXJ0dWFsIHRhYmxlICovIAorICByZXR1cm4gMDsKK30KKworLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgInByaW1hcnkgYmFzZSBjbGFzcyIgb2YgRENMQVNTLgorIAorICAgQSBOVUxMIHJldHVybiBpbmRpY2F0ZXMgdGhhdCBEQ0xBU1MgaGFzIG5vIHByaW1hcnkgYmFzZSwgb3IgdGhhdCBpdAorICAgY291bGRuJ3QgYmUgZm91bmQgKGluc3VmZmljaWVudCBpbmZvcm1hdGlvbikuCisgIAorICAgVGhpcyByb3V0aW5lIGlzIGFpbWVkIGF0IHRoZSBIUC9UYWxpZ2VudCBBTlNJIEMrKyBydW50aW1lIG1vZGVsLAorICAgYW5kIG1heSBub3Qgd29yayB3aXRoIG90aGVyIHJ1bnRpbWUgbW9kZWxzLiAgKi8KKworc3RydWN0IHR5cGUgKgorcHJpbWFyeV9iYXNlX2NsYXNzIChkY2xhc3MpCisgIHN0cnVjdCB0eXBlICogZGNsYXNzOworeworICAvKiBJbiBIUCBBTlNJIEMrKydzIHJ1bnRpbWUgbW9kZWwsIGEgInByaW1hcnkgYmFzZSBjbGFzcyIgb2YgYSBjbGFzcworICAgICBpcyB0aGUgZmlyc3QgZGlyZWN0bHkgaW5oZXJpdGVkLCBub24tdmlydHVhbCBiYXNlIGNsYXNzIHRoYXQKKyAgICAgcmVxdWlyZXMgYSB2aXJ0dWFsIHRhYmxlICovCisKKyAgcmVnaXN0ZXIgaW50IGk7CisKKyAgaWYgKFRZUEVfQ09ERShkY2xhc3MpICE9IFRZUEVfQ09ERV9DTEFTUykKKyAgICByZXR1cm4gTlVMTDsKKworICBmb3IgKGk9MDsgaSA8IFRZUEVfTl9CQVNFQ0xBU1NFUyhkY2xhc3MpOyBpKyspCisgICAgaWYgKCFUWVBFX0ZJRUxEX1ZJUlRVQUwoZGNsYXNzLCBpKSAmJgorICAgICAgICBoYXNfdnRhYmxlKFRZUEVfRklFTERfVFlQRShkY2xhc3MsIGkpKSkKKyAgICAgIHJldHVybiBUWVBFX0ZJRUxEX1RZUEUoZGNsYXNzLCBpKTsKKworICByZXR1cm4gTlVMTDsKK30KKworLyogR2xvYmFsIG1hbmlwdWxhdGVkIGJ5IHZpcnR1YWxfYmFzZV9saXN0W19hdXhdKCkgKi8KKworc3RhdGljIHN0cnVjdCB2YmFzZSAqIGN1cnJlbnRfdmJhc2VfbGlzdCA9IE5VTEw7CisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gYSBudWxsLXRlcm1pbmF0ZWQgbGlzdCBvZiBzdHJ1Y3QgdmJhc2UKKyAgIGl0ZW1zLiBUaGUgdmJhc2V0eXBlIHBvaW50ZXIgb2YgZWFjaCBpdGVtIGluIHRoZSBsaXN0IHBvaW50cyB0byB0aGUKKyAgIHR5cGUgaW5mb3JtYXRpb24gZm9yIGEgdmlydHVhbCBiYXNlIG9mIHRoZSBhcmd1bWVudCBEQ0xBU1MuCisgIAorICAgSGVscGVyIGZ1bmN0aW9uIGZvciB2aXJ0dWFsX2Jhc2VfbGlzdCgpLiAKKyAgIE5vdGU6IHRoZSBsaXN0IGdvZXMgYmFja3dhcmQsIHJpZ2h0LXRvLWxlZnQuIHZpcnR1YWxfYmFzZV9saXN0KCkKKyAgIGNvcGllcyB0aGUgaXRlbXMgb3V0IGluIHJldmVyc2Ugb3JkZXIuICAqLworCitzdHJ1Y3QgdmJhc2UgKgordmlydHVhbF9iYXNlX2xpc3RfYXV4IChkY2xhc3MpCisgIHN0cnVjdCB0eXBlICogZGNsYXNzOworeworICBzdHJ1Y3QgdmJhc2UgKiB0bXBfdmJhc2U7CisgIHJlZ2lzdGVyIGludCBpOworCisgIGlmIChUWVBFX0NPREUoZGNsYXNzKSAhPSBUWVBFX0NPREVfQ0xBU1MpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IFRZUEVfTl9CQVNFQ0xBU1NFUyAoZGNsYXNzKTsgaSsrKQorICAgIHsKKyAgICAgIC8qIFJlY3Vyc2Ugb24gdGhpcyBhbmNlc3RvciwgZmlyc3QgKi8KKyAgICAgIHZpcnR1YWxfYmFzZV9saXN0X2F1eChUWVBFX0ZJRUxEX1RZUEUoZGNsYXNzLCBpKSk7CisKKyAgICAgIC8qIElmIHRoaXMgY3VycmVudCBiYXNlIGlzIGl0c2VsZiB2aXJ0dWFsLCBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KKyAgICAgIGlmIChCQVNFVFlQRV9WSUFfVklSVFVBTChkY2xhc3MsIGkpKQorICAgICAgICB7CisgICAgICAgICAgc3RydWN0IHR5cGUgKiBiYXNldHlwZSA9IFRZUEVfRklFTERfVFlQRSAoZGNsYXNzLCBpKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBDaGVjayBpZiBiYXNlIGFscmVhZHkgcmVjb3JkZWQgKi8KKyAgICAgICAgICB0bXBfdmJhc2UgPSBjdXJyZW50X3ZiYXNlX2xpc3Q7CisgICAgICAgICAgd2hpbGUgKHRtcF92YmFzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKHRtcF92YmFzZS0+dmJhc2V0eXBlID09IGJhc2V0eXBlKQorICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBmb3VuZCBpdCAqLworICAgICAgICAgICAgICB0bXBfdmJhc2UgPSB0bXBfdmJhc2UtPm5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoIXRtcF92YmFzZSkgLyogbm9ybWFsIGV4aXQgZnJvbSBsb29wICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIG5ldyBpdGVtIGZvciB0aGlzIHZpcnR1YWwgYmFzZSAqLworICAgICAgICAgICAgICB0bXBfdmJhc2UgPSAoc3RydWN0IHZiYXNlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHZiYXNlKSk7CisKKyAgICAgICAgICAgICAgLyogU3RpY2sgaXQgb24gYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCAqLworICAgICAgICAgICAgICB0bXBfdmJhc2UtPnZiYXNldHlwZSA9IGJhc2V0eXBlOworICAgICAgICAgICAgICB0bXBfdmJhc2UtPm5leHQgPSBjdXJyZW50X3ZiYXNlX2xpc3Q7CisgICAgICAgICAgICAgIGN1cnJlbnRfdmJhc2VfbGlzdCA9IHRtcF92YmFzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvKiBpZiB2aXJ0dWFsICovCisgICAgfSAvKiBmb3IgbG9vcCBvdmVyIGJhc2VzICovCit9CisKKworLyogQ29tcHV0ZSB0aGUgbGlzdCBvZiB2aXJ0dWFsIGJhc2VzIGluIHRoZSByaWdodCBvcmRlci4gIFZpcnR1YWwKKyAgIGJhc2VzIGFyZSBsYWlkIG91dCBpbiB0aGUgb2JqZWN0J3MgbWVtb3J5IGFyZWEgaW4gb3JkZXIgb2YgdGhlaXIKKyAgIG9jY3VycmVuY2UgaW4gYSBkZXB0aC1maXJzdCwgbGVmdC10by1yaWdodCBzZWFyY2ggdGhyb3VnaCB0aGUKKyAgIGFuY2VzdG9ycy4KKyAgCisgICBBcmd1bWVudCBEQ0xBU1MgaXMgdGhlIHR5cGUgd2hvc2UgdmlydHVhbCBiYXNlcyBhcmUgcmVxdWlyZWQuCisgICBSZXR1cm4gdmFsdWUgaXMgdGhlIGFkZHJlc3Mgb2YgYSBudWxsLXRlcm1pbmF0ZWQgYXJyYXkgb2YgcG9pbnRlcnMKKyAgIHRvIHN0cnVjdCB0eXBlIGl0ZW1zLgorICAgCisgICBUaGlzIHJvdXRpbmUgaXMgYWltZWQgYXQgdGhlIEhQL1RhbGlnZW50IEFOU0kgQysrIHJ1bnRpbWUgbW9kZWwsCisgICBhbmQgbWF5IG5vdCB3b3JrIHdpdGggb3RoZXIgcnVudGltZSBtb2RlbHMuCisgIAorICAgVGhpcyByb3V0aW5lIG1lcmVseSBoYW5kcyBvZmYgdGhlIGFyZ3VtZW50IHRvIHZpcnR1YWxfYmFzZV9saXN0X2F1eCgpCisgICBhbmQgdGhlbiBjb3BpZXMgdGhlIHJlc3VsdCBpbnRvIGFuIGFycmF5IHRvIHNhdmUgc3BhY2UuICAqLworCitzdHJ1Y3QgdHlwZSAqKgordmlydHVhbF9iYXNlX2xpc3QgKGRjbGFzcykKKyAgc3RydWN0IHR5cGUgKiBkY2xhc3M7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCB2YmFzZSAqIHRtcF92YmFzZTsKKyAgcmVnaXN0ZXIgc3RydWN0IHZiYXNlICogdG1wX3ZiYXNlXzI7CisgIHJlZ2lzdGVyIGludCBpOworICBpbnQgY291bnQ7CisgIHN0cnVjdCB0eXBlICoqIHZiYXNlX2FycmF5OworCisgIGN1cnJlbnRfdmJhc2VfbGlzdCA9IE5VTEw7CisgIHZpcnR1YWxfYmFzZV9saXN0X2F1eChkY2xhc3MpOworCisgIGZvciAoaT0wLCB0bXBfdmJhc2UgPSBjdXJyZW50X3ZiYXNlX2xpc3Q7IHRtcF92YmFzZSAhPSBOVUxMOyBpKyssIHRtcF92YmFzZSA9IHRtcF92YmFzZS0+bmV4dCkKKyAgICAvKiBubyBib2R5ICovIDsKKworICBjb3VudCA9IGk7CisKKyAgdmJhc2VfYXJyYXkgPSAoc3RydWN0IHR5cGUgKiopIHhtYWxsb2MoKGNvdW50ICsgMSkgKiBzaXplb2YgKHN0cnVjdCB0eXBlICopKTsKKworICBmb3IgKGk9Y291bnQgLTEsIHRtcF92YmFzZSA9IGN1cnJlbnRfdmJhc2VfbGlzdDsgaSA+PSAwOyBpLS0sIHRtcF92YmFzZSA9IHRtcF92YmFzZS0+bmV4dCkKKyAgICB2YmFzZV9hcnJheVtpXSA9IHRtcF92YmFzZS0+dmJhc2V0eXBlOworCisgIC8qIEdldCByaWQgb2YgY29uc3RydWN0ZWQgY2hhaW4gKi8KKyAgdG1wX3ZiYXNlXzIgPSB0bXBfdmJhc2UgPSBjdXJyZW50X3ZiYXNlX2xpc3Q7CisgIHdoaWxlICh0bXBfdmJhc2UpCisgICAgeworICAgICAgdG1wX3ZiYXNlID0gdG1wX3ZiYXNlLT5uZXh0OworICAgICAgZnJlZSh0bXBfdmJhc2VfMik7CisgICAgICB0bXBfdmJhc2VfMiA9IHRtcF92YmFzZTsKKyAgICB9CisgIAorICB2YmFzZV9hcnJheVtjb3VudF0gPSBOVUxMOworICByZXR1cm4gdmJhc2VfYXJyYXk7Cit9CisKKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSB2aXJ0dWFsIGJhc2UgbGlzdCBvZiB0aGUgdHlwZSBEQ0xBU1MuICAqLworCitpbnQKK3ZpcnR1YWxfYmFzZV9saXN0X2xlbmd0aCAoZGNsYXNzKQorICBzdHJ1Y3QgdHlwZSAqIGRjbGFzczsKK3sKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCB2YmFzZSAqIHRtcF92YmFzZTsKKyAgCisgIGN1cnJlbnRfdmJhc2VfbGlzdCA9IE5VTEw7CisgIHZpcnR1YWxfYmFzZV9saXN0X2F1eChkY2xhc3MpOworCisgIGZvciAoaT0wLCB0bXBfdmJhc2UgPSBjdXJyZW50X3ZiYXNlX2xpc3Q7IHRtcF92YmFzZSAhPSBOVUxMOyBpKyssIHRtcF92YmFzZSA9IHRtcF92YmFzZS0+bmV4dCkKKyAgICAvKiBubyBib2R5ICovIDsKKyAgcmV0dXJuIGk7Cit9CisKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHRoZSB2aXJ0dWFsIGJhc2UgbGlzdCBvZiB0aGUgdHlwZQorICAgRENMQVNTLCBpZ25vcmluZyB0aG9zZSBhcHBlYXJpbmcgaW4gdGhlIHByaW1hcnkgYmFzZSAoYW5kIGl0cworICAgcHJpbWFyeSBiYXNlLCByZWN1cnNpdmVseSkuICAqLworCitpbnQKK3ZpcnR1YWxfYmFzZV9saXN0X2xlbmd0aF9za2lwX3ByaW1hcmllcyAoZGNsYXNzKQorICBzdHJ1Y3QgdHlwZSAqIGRjbGFzczsKK3sKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCB2YmFzZSAqIHRtcF92YmFzZTsKKyAgc3RydWN0IHR5cGUgKiBwcmltYXJ5OworCisgIHByaW1hcnkgPSBUWVBFX1JVTlRJTUVfUFRSIChkY2xhc3MpID8gVFlQRV9QUklNQVJZX0JBU0UgKGRjbGFzcykgOiBOVUxMOworCisgIGlmICghcHJpbWFyeSkKKyAgICByZXR1cm4gdmlydHVhbF9iYXNlX2xpc3RfbGVuZ3RoIChkY2xhc3MpOworCisgIGN1cnJlbnRfdmJhc2VfbGlzdCA9IE5VTEw7CisgIHZpcnR1YWxfYmFzZV9saXN0X2F1eChkY2xhc3MpOworCisgIGZvciAoaT0wLCB0bXBfdmJhc2UgPSBjdXJyZW50X3ZiYXNlX2xpc3Q7IHRtcF92YmFzZSAhPSBOVUxMOyB0bXBfdmJhc2UgPSB0bXBfdmJhc2UtPm5leHQpCisgICAgeworICAgICAgaWYgKHZpcnR1YWxfYmFzZV9pbmRleCAodG1wX3ZiYXNlLT52YmFzZXR5cGUsIHByaW1hcnkpID49IDApCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaSsrOworICAgIH0KKyAgcmV0dXJuIGk7Cit9CisKKworLyogUmV0dXJuIHRoZSBpbmRleCAocG9zaXRpb24pIG9mIHR5cGUgQkFTRSwgd2hpY2ggaXMgYSB2aXJ0dWFsIGJhc2UKKyAgIGNsYXNzIG9mIERDTEFTUywgaW4gdGhlIGxhdHRlcidzIHZpcnR1YWwgYmFzZSBsaXN0LiAgQSByZXR1cm4gb2YgLTEKKyAgIGluZGljYXRlcyAibm90IGZvdW5kIiBvciBhIHByb2JsZW0uICAqLworCitpbnQKK3ZpcnR1YWxfYmFzZV9pbmRleChiYXNlLCBkY2xhc3MpCisgIHN0cnVjdCB0eXBlICogYmFzZTsKKyAgc3RydWN0IHR5cGUgKiBkY2xhc3M7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCB0eXBlICogdmJhc2U7CisgIHJlZ2lzdGVyIGludCBpOworCisgIGlmICgoVFlQRV9DT0RFKGRjbGFzcykgIT0gVFlQRV9DT0RFX0NMQVNTKSB8fAorICAgICAgKFRZUEVfQ09ERShiYXNlKSAhPSBUWVBFX0NPREVfQ0xBU1MpKQorICAgIHJldHVybiAtMTsKKworICBpID0gMDsKKyAgdmJhc2UgPSBUWVBFX1ZJUlRVQUxfQkFTRV9MSVNUKGRjbGFzcylbMF07CisgIHdoaWxlICh2YmFzZSkKKyAgICB7CisgICAgICBpZiAodmJhc2UgPT0gYmFzZSkKKyAgICAgICAgYnJlYWs7CisgICAgICB2YmFzZSA9IFRZUEVfVklSVFVBTF9CQVNFX0xJU1QoZGNsYXNzKVsrK2ldOworICAgIH0KKworICByZXR1cm4gdmJhc2UgPyBpIDogLTE7Cit9CisKKworCisvKiBSZXR1cm4gdGhlIGluZGV4IChwb3NpdGlvbikgb2YgdHlwZSBCQVNFLCB3aGljaCBpcyBhIHZpcnR1YWwgYmFzZQorICAgY2xhc3Mgb2YgRENMQVNTLCBpbiB0aGUgbGF0dGVyJ3MgdmlydHVhbCBiYXNlIGxpc3QuIFNraXAgb3ZlciBhbGwKKyAgIGJhc2VzIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgdmlydHVhbCBiYXNlIGxpc3Qgb2YgdGhlIHByaW1hcnkgYmFzZQorICAgY2xhc3Mgb2YgRENMQVNTIChyZWN1cnNpdmVseSkuICBBIHJldHVybiBvZiAtMSBpbmRpY2F0ZXMgIm5vdAorICAgZm91bmQiIG9yIGEgcHJvYmxlbS4gICovCisKK2ludAordmlydHVhbF9iYXNlX2luZGV4X3NraXBfcHJpbWFyaWVzKGJhc2UsIGRjbGFzcykKKyAgc3RydWN0IHR5cGUgKiBiYXNlOworICBzdHJ1Y3QgdHlwZSAqIGRjbGFzczsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKiB2YmFzZTsKKyAgcmVnaXN0ZXIgaW50IGksIGo7CisgIHN0cnVjdCB0eXBlICogcHJpbWFyeTsKKworICBpZiAoKFRZUEVfQ09ERShkY2xhc3MpICE9IFRZUEVfQ09ERV9DTEFTUykgfHwKKyAgICAgIChUWVBFX0NPREUoYmFzZSkgIT0gVFlQRV9DT0RFX0NMQVNTKSkKKyAgICByZXR1cm4gLTE7CisKKyAgcHJpbWFyeSA9IFRZUEVfUlVOVElNRV9QVFIoZGNsYXNzKSA/IFRZUEVfUFJJTUFSWV9CQVNFKGRjbGFzcykgOiBOVUxMOworCisgIGogPSAtMTsKKyAgaSA9IDA7CisgIHZiYXNlID0gVFlQRV9WSVJUVUFMX0JBU0VfTElTVChkY2xhc3MpWzBdOworICB3aGlsZSAodmJhc2UpCisgICAgeworICAgICAgaWYgKCFwcmltYXJ5IHx8ICh2aXJ0dWFsX2Jhc2VfaW5kZXhfc2tpcF9wcmltYXJpZXModmJhc2UsIHByaW1hcnkpIDwgMCkpCisgICAgICAgIGorKzsKKyAgICAgIGlmICh2YmFzZSA9PSBiYXNlKQorICAgICAgICBicmVhazsKKyAgICAgIHZiYXNlID0gVFlQRV9WSVJUVUFMX0JBU0VfTElTVChkY2xhc3MpWysraV07CisgICAgfQorCisgIHJldHVybiB2YmFzZSA/IGogOiAtMTsKK30KKworLyogUmV0dXJuIHBvc2l0aW9uIG9mIGEgZGVyaXZlZCBjbGFzcyBEQ0xBU1MgaW4gdGhlIGxpc3Qgb2YKKyAqIHByaW1hcnkgYmFzZXMgc3RhcnRpbmcgd2l0aCB0aGUgcmVtb3Rlc3QgYW5jZXN0b3IuCisgKiBQb3NpdGlvbiByZXR1cm5lZCBpcyAwLWJhc2VkLiAqLworCitpbnQKK2NsYXNzX2luZGV4X2luX3ByaW1hcnlfbGlzdCAoZGNsYXNzKQorICBzdHJ1Y3QgdHlwZSAqIGRjbGFzczsKK3sKKyAgc3RydWN0IHR5cGUgKiBwYmM7IC8qIHByaW1hcnkgYmFzZSBjbGFzcyAqLworCisgIC8qIFNpbXBseSByZWN1cnNlIG9uIHByaW1hcnkgYmFzZSAqLyAKKyAgcGJjID0gVFlQRV9QUklNQVJZX0JBU0UgKGRjbGFzcyk7CisgIGlmIChwYmMpCisgICAgcmV0dXJuIDEgKyBjbGFzc19pbmRleF9pbl9wcmltYXJ5X2xpc3QgKHBiYyk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLyogUmV0dXJuIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiB2aXJ0dWFsIGZ1bmN0aW9ucyBhIHR5cGUgaGFzLgorICogVGhpcyBpbmNsdWRlcyBhbGwgdGhlIHZpcnR1YWwgZnVuY3Rpb25zIGl0IGluaGVyaXRzIGZyb20gaXRzCisgKiBiYXNlIGNsYXNzZXMgdG9vLgorICovCisKKy8qIHBhaTogRklYTUUgVGhpcyBkb2Vzbid0IGRvIHRoZSByaWdodCB0aGluZzogY291bnQgcmVkZWZpbmVkIHZpcnR1YWwKKyAqIGZ1bmN0aW9ucyBvbmx5IG9uY2UgKGxhdGVzdCByZWRlZmluaXRpb24pCisgKi8KKworaW50Citjb3VudF92aXJ0dWFsX2ZucyAoZGNsYXNzKQorICBzdHJ1Y3QgdHlwZSAqIGRjbGFzczsKK3sKKyAgaW50IGJhc2U7ICAgICAvKiBpbmRleCBmb3IgYmFzZSBjbGFzc2VzICovCisgIGludCBmbiwgb2k7ICAgLyogZnVuY3Rpb24gYW5kIG92ZXJsb2FkZWQgaW5zdGFuY2UgaW5kaWNlcyAqLworICAKKyAgaW50IHZmdW5jczsgICAvKiBjb3VudCB0byByZXR1cm4gKi8gCisKKyAgLyogcmVjdXJzZSBvbiBiYXNlcyB0aGF0IGNhbiBzaGFyZSB2aXJ0dWFsIHRhYmxlICovIAorICBzdHJ1Y3QgdHlwZSAqIHBiYyA9IHByaW1hcnlfYmFzZV9jbGFzcyAoZGNsYXNzKTsKKyAgaWYgKHBiYykKKyAgICB2ZnVuY3MgPSBjb3VudF92aXJ0dWFsX2ZucyAocGJjKTsKKyAgCisgIGZvciAoZm4gPSAwOyBmbiA8IFRZUEVfTkZOX0ZJRUxEUyAoZGNsYXNzKTsgZm4rKykKKyAgICBmb3IgKG9pID0gMDsgb2kgPCBUWVBFX0ZOX0ZJRUxETElTVF9MRU5HVEggKGRjbGFzcywgZm4pOyBvaSsrKQorICAgICAgaWYgKFRZUEVfRk5fRklFTERfVklSVFVBTF9QIChUWVBFX0ZOX0ZJRUxETElTVDEgKGRjbGFzcywgZm4pLCBvaSkpCisgICAgICAgIHZmdW5jcysrOworCisgIHJldHVybiB2ZnVuY3M7Cit9CisKKwwKKworLyogRnVuY3Rpb25zIGZvciBvdmVybG9hZCByZXNvbHV0aW9uIGJlZ2luIGhlcmUgKi8KKworLyogQ29tcGFyZSB0d28gYmFkbmVzcyB2ZWN0b3JzIEEgYW5kIEIgYW5kIHJldHVybiB0aGUgcmVzdWx0LgorICogMCA9PiBBIGFuZCBCIGFyZSBpZGVudGljYWwKKyAqIDEgPT4gQSBhbmQgQiBhcmUgaW5jb21wYXJhYmxlCisgKiAyID0+IEEgaXMgYmV0dGVyIHRoYW4gQgorICogMyA9PiBBIGlzIHdvcnNlIHRoYW4gQiAqLworCitpbnQKK2NvbXBhcmVfYmFkbmVzcyAoYSwgYikKKyAgc3RydWN0IGJhZG5lc3NfdmVjdG9yICogYTsKKyAgc3RydWN0IGJhZG5lc3NfdmVjdG9yICogYjsKK3sKKyAgaW50IGk7CisgIGludCB0bXA7CisgIHNob3J0IGZvdW5kX3BvcyA9IDA7ICAgICAgLyogYW55IHBvc2l0aXZlcyBpbiBjPyAqLworICBzaG9ydCBmb3VuZF9uZWcgPSAwOyAgICAgIC8qIGFueSBuZWdhdGl2ZXMgaW4gYz8gKi8KKyAgCisgIC8qIGRpZmZlcmluZyBsZW5ndGhzID0+IGluY29tcGFyYWJsZSAqLyAKKyAgaWYgKGEtPmxlbmd0aCAhPSBiLT5sZW5ndGgpCisgICAgcmV0dXJuIDE7CisKKyAgLyogU3VidHJhY3QgYiBmcm9tIGEgKi8gCisgIGZvciAoaT0wOyBpIDwgYS0+bGVuZ3RoOyBpKyspCisgICAgeworICAgICAgdG1wID0gYS0+cmFua1tpXSAtIGItPnJhbmtbaV07CisgICAgICBpZiAodG1wID4gMCkKKyAgICAgICAgZm91bmRfcG9zID0gMTsKKyAgICAgIGVsc2UgaWYgKHRtcCA8IDApCisgICAgICAgIGZvdW5kX25lZyA9IDE7CisgICAgfQorCisgIGlmIChmb3VuZF9wb3MpCisgICAgeworICAgICAgaWYgKGZvdW5kX25lZykKKyAgICAgICAgcmV0dXJuIDE7IC8qIGluY29tcGFyYWJsZSAqLyAKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDM7IC8qIEEgPiBCICovIAorICAgIH0KKyAgZWxzZSAvKiBubyBwb3NpdGl2ZXMgKi8gCisgICAgeworICAgICAgaWYgKGZvdW5kX25lZykKKyAgICAgICAgcmV0dXJuIDI7IC8qIEEgPCBCICovCisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAwOyAvKiBBID09IEIgKi8KKyAgICB9Cit9CisKKy8qIFJhbmsgYSBmdW5jdGlvbiBieSBjb21wYXJpbmcgaXRzIHBhcmFtZXRlciB0eXBlcyAoUEFSTVMsIGxlbmd0aCBOUEFSTVMpLAorICogdG8gdGhlIHR5cGVzIG9mIGFuIGFyZ3VtZW50IGxpc3QgKEFSR1MsIGxlbmd0aCBOQVJHUykuCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgYmFkbmVzcyB2ZWN0b3IuIFRoaXMgaGFzIE5BUkdTICsgMSBlbnRyaWVzLiAqLworCitzdHJ1Y3QgYmFkbmVzc192ZWN0b3IgKgorcmFua19mdW5jdGlvbiAocGFybXMsIG5wYXJtcywgYXJncywgbmFyZ3MpCisgIHN0cnVjdCB0eXBlICoqIHBhcm1zOworICBpbnQgbnBhcm1zOworICBzdHJ1Y3QgdHlwZSAqKiBhcmdzOworICBpbnQgbmFyZ3M7Cit7CisgIGludCBpOworICBzdHJ1Y3QgYmFkbmVzc192ZWN0b3IgKiBidjsKKyAgaW50IG1pbl9sZW4gPSBucGFybXMgPCBuYXJncyA/IG5wYXJtcyA6IG5hcmdzOworCisgIGJ2ID0geG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmFkbmVzc192ZWN0b3IpKTsKKyAgYnYtPmxlbmd0aCA9IG5hcmdzICsgMTsgLyogYWRkIDEgZm9yIHRoZSBsZW5ndGgtbWF0Y2ggcmFuayAqLyAKKyAgYnYtPnJhbmsgPSB4bWFsbG9jICgobmFyZ3MgKyAxKSAqIHNpemVvZiAoaW50KSk7CisKKyAgLyogRmlyc3QgY29tcGFyZSB0aGUgbGVuZ3RocyBvZiB0aGUgc3VwcGxpZWQgbGlzdHMuCisgICAqIElmIHRoZXJlIGlzIGEgbWlzbWF0Y2gsIHNldCBpdCB0byBhIGhpZ2ggdmFsdWUuICovCisgICAKKyAgLyogcGFpLzE5OTctMDYtMDMgRklYTUU6IHdoZW4gd2UgaGF2ZSBkZWJ1ZyBpbmZvIGFib3V0IGRlZmF1bHQKKyAgICogYXJndW1lbnRzIGFuZCBlbGxpcHNpcyBwYXJhbWV0ZXIgbGlzdHMsIHdlIHNob3VsZCBjb25zaWRlciB0aG9zZQorICAgKiBhbmQgcmFuayB0aGUgbGVuZ3RoLW1hdGNoIG1vcmUgZmluZWx5LiAqLworCisgIExFTkdUSF9NQVRDSCAoYnYpID0gKG5hcmdzICE9IG5wYXJtcykgPyBMRU5HVEhfTUlTTUFUQ0hfQkFETkVTUyA6IDA7CisKKyAgLyogTm93IHJhbmsgYWxsIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBjYW5kaWRhdGUgZnVuY3Rpb24gKi8KKyAgZm9yIChpPTE7IGkgPD0gbWluX2xlbjsgaSsrKQorICAgIGJ2LT5yYW5rW2ldID0gcmFua19vbmVfdHlwZSAocGFybXNbaS0xXSwgYXJnc1tpLTFdKTsKKworICAvKiBJZiBtb3JlIGFyZ3VtZW50cyB0aGFuIHBhcmFtZXRlcnMsIGFkZCBkdW1teSBlbnRyaWVzICovIAorICBmb3IgKGkgPSBtaW5fbGVuICsxOyBpIDw9IG5hcmdzOyBpKyspCisgICAgYnYtPnJhbmtbaV0gPSBUT09fRkVXX1BBUkFNU19CQURORVNTOworCisgIHJldHVybiBidjsKK30KKworLyogQ29tcGFyZSBvbmUgdHlwZSAoUEFSTSkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhbm90aGVyIChBUkcpLgorICogUEFSTSBpcyBpbnRlbmRlZCB0byBiZSB0aGUgcGFyYW1ldGVyIHR5cGUgb2YgYSBmdW5jdGlvbjsgYW5kCisgKiBBUkcgaXMgdGhlIHN1cHBsaWVkIGFyZ3VtZW50J3MgdHlwZS4gIFRoaXMgZnVuY3Rpb24gdGVzdHMgaWYKKyAqIHRoZSBsYXR0ZXIgY2FuIGJlIGNvbnZlcnRlZCB0byB0aGUgZm9ybWVyLgorICoKKyAqIFJldHVybiAwIGlmIHRoZXkgYXJlIGlkZW50aWNhbCB0eXBlczsKKyAqIE90aGVyd2lzZSwgcmV0dXJuIGFuIGludGVnZXIgd2hpY2ggY29ycmVzcG9uZHMgdG8gaG93IGNvbXBhdGlibGUKKyAqIFBBUk0gaXMgdG8gQVJHLiBUaGUgaGlnaGVyIHRoZSByZXR1cm4gdmFsdWUsIHRoZSB3b3JzZSB0aGUgbWF0Y2guCisgKiBHZW5lcmFsbHkgdGhlICJiYWQiIGNvbnZlcnNpb25zIGFyZSBhbGwgdW5pZm9ybWx5IGFzc2lnbmVkIGEgMTAwICovCisKK2ludAorcmFua19vbmVfdHlwZSAocGFybSwgYXJnKQorICBzdHJ1Y3QgdHlwZSAqIHBhcm07CisgIHN0cnVjdCB0eXBlICogYXJnOworeworICAvKiBJZGVudGljYWwgdHlwZSBwb2ludGVycyAqLworICAvKiBIb3dldmVyLCB0aGlzIHN0aWxsIGRvZXNuJ3QgY2F0Y2ggYWxsIGNhc2VzIG9mIHNhbWUgdHlwZSBmb3IgYXJnCisgICAqIGFuZCBwYXJhbS4gVGhlIHJlYXNvbiBpcyB0aGF0IGJ1aWx0aW4gdHlwZXMgYXJlIGRpZmZlcmVudCBmcm9tCisgICAqIHRoZSBzYW1lIG9uZXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgb2JqZWN0LiAqLworICBpZiAocGFybSA9PSBhcmcpCisgICAgcmV0dXJuIDA7CisKKyAgLyogUmVzb2x2ZSB0eXBlZGVmcyAqLworICBpZiAoVFlQRV9DT0RFIChwYXJtKSA9PSBUWVBFX0NPREVfVFlQRURFRikKKyAgICBwYXJtID0gY2hlY2tfdHlwZWRlZiAocGFybSk7CisgIGlmIChUWVBFX0NPREUgKGFyZykgPT0gVFlQRV9DT0RFX1RZUEVERUYpCisgICAgYXJnID0gY2hlY2tfdHlwZWRlZiAoYXJnKTsKKworICAvKiBDaGVjayBpZiBpZGVudGljYWwgYWZ0ZXIgcmVzb2x2aW5nIHR5cGVkZWZzICovCisgIGlmIChwYXJtID09IGFyZykKKyAgICByZXR1cm4gMDsKKworI2lmIDAKKyAgLyogRGVidWdnaW5nIG9ubHkgKi8gCisgIHByaW50ZigiLS0tLS0tIEFyZyBpcyAlcyBbJWRdLCBwYXJtIGlzICVzIFslZF1cbiIsCisgICAgICAgICBUWVBFX05BTUUgKGFyZyksIFRZUEVfQ09ERSAoYXJnKSwgVFlQRV9OQU1FIChwYXJtKSwgVFlQRV9DT0RFIChwYXJtKSk7CisjZW5kaWYKKworICAvKiB4IC0+IHkgbWVhbnMgYXJnIG9mIHR5cGUgeCBiZWluZyBzdXBwbGllZCBmb3IgcGFyYW1ldGVyIG9mIHR5cGUgeSAqLworCisgIHN3aXRjaCAoVFlQRV9DT0RFIChwYXJtKSkKKyAgICB7CisgICAgICBjYXNlIFRZUEVfQ09ERV9QVFI6CisgICAgICAgIHN3aXRjaCAoVFlQRV9DT0RFIChhcmcpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX1BUUjogCisgICAgICAgICAgICAgIGlmIChUWVBFX0NPREUgKFRZUEVfVEFSR0VUX1RZUEUgKHBhcm0pKSA9PSBUWVBFX0NPREVfVk9JRCkKKyAgICAgICAgICAgICAgICByZXR1cm4gVk9JRF9QVFJfQ09OVkVSU0lPTl9CQURORVNTOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHJhbmtfb25lX3R5cGUgKFRZUEVfVEFSR0VUX1RZUEUgKHBhcm0pLCBUWVBFX1RBUkdFVF9UWVBFIChhcmcpKTsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0FSUkFZOgorICAgICAgICAgICAgICByZXR1cm4gcmFua19vbmVfdHlwZSAoVFlQRV9UQVJHRVRfVFlQRSAocGFybSksIFRZUEVfVEFSR0VUX1RZUEUgKGFyZykpOworICAgICAgICAgICAgY2FzZSBUWVBFX0NPREVfRlVOQzoKKyAgICAgICAgICAgICAgcmV0dXJuIHJhbmtfb25lX3R5cGUgKFRZUEVfVEFSR0VUX1RZUEUgKHBhcm0pLCBhcmcpOworICAgICAgICAgICAgY2FzZSBUWVBFX0NPREVfSU5UOgorICAgICAgICAgICAgY2FzZSBUWVBFX0NPREVfRU5VTToKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0NIQVI6CisgICAgICAgICAgICBjYXNlIFRZUEVfQ09ERV9SQU5HRToKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0JPT0w6CisgICAgICAgICAgICAgIHJldHVybiBQT0lOVEVSX0NPTlZFUlNJT05fQkFETkVTUzsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldHVybiBJTkNPTVBBVElCTEVfVFlQRV9CQURORVNTOworICAgICAgICAgIH0KKyAgICAgIGNhc2UgVFlQRV9DT0RFX0FSUkFZOgorICAgICAgICBzd2l0Y2ggKFRZUEVfQ09ERSAoYXJnKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFRZUEVfQ09ERV9QVFI6CisgICAgICAgICAgICBjYXNlIFRZUEVfQ09ERV9BUlJBWToKKyAgICAgICAgICAgICAgcmV0dXJuIHJhbmtfb25lX3R5cGUgKFRZUEVfVEFSR0VUX1RZUEUgKHBhcm0pLCBUWVBFX1RBUkdFVF9UWVBFIChhcmcpKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldHVybiBJTkNPTVBBVElCTEVfVFlQRV9CQURORVNTOworICAgICAgICAgIH0KKyAgICAgIGNhc2UgVFlQRV9DT0RFX0ZVTkM6CisgICAgICAgIHN3aXRjaCAoVFlQRV9DT0RFIChhcmcpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX1BUUjogLyogZnVuY3B0ciAtPiBmdW5jICovCisgICAgICAgICAgICAgIHJldHVybiByYW5rX29uZV90eXBlIChwYXJtLCBUWVBFX1RBUkdFVF9UWVBFIChhcmcpKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldHVybiBJTkNPTVBBVElCTEVfVFlQRV9CQURORVNTOworICAgICAgICAgIH0KKyAgICAgIGNhc2UgVFlQRV9DT0RFX0lOVDoKKyAgICAgICAgc3dpdGNoIChUWVBFX0NPREUgKGFyZykpCisgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBUWVBFX0NPREVfSU5UOgorICAgICAgICAgICAgICBpZiAoVFlQRV9MRU5HVEggKGFyZykgPT0gVFlQRV9MRU5HVEggKHBhcm0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIERlYWwgd2l0aCBzaWduZWQsIHVuc2lnbmVkLCBhbmQgcGxhaW4gY2hhcnMgYW5kCisgICAgICAgICAgICAgICAgICAgICBzaWduZWQgYW5kIHVuc2lnbmVkIGludHMgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChUWVBFX05PU0lHTiAocGFybSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGNhc2Ugb25seSBmb3IgY2hhcmFjdGVyIHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgaWYgKFRZUEVfTk9TSUdOIChhcmcpKSAgLyogcGxhaW4gY2hhciAtPiBwbGFpbiBjaGFyICovCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5URUdFUl9DT0VSQ0lPTl9CQURORVNTOyAvKiBzaWduZWQvdW5zaWduZWQgY2hhciAtPiBwbGFpbiBjaGFyICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRZUEVfVU5TSUdORUQgKHBhcm0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKFRZUEVfVU5TSUdORUQgKGFyZykpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wIChUWVBFX05BTUUgKHBhcm0pLCBUWVBFX05BTUUgKGFyZykpKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgIC8qIHVuc2lnbmVkIGludCAtPiB1bnNpZ25lZCBpbnQsIG9yIHVuc2lnbmVkIGxvbmcgLT4gdW5zaWduZWQgbG9uZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wIChUWVBFX05BTUUgKGFyZyksICJpbnQiKSAmJiAhc3RyY21wIChUWVBFX05BTUUgKHBhcm0pLCAibG9uZyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlRFR0VSX1BST01PVElPTl9CQURORVNTOyAvKiB1bnNpZ25lZCBpbnQgLT4gdW5zaWduZWQgbG9uZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVEVHRVJfQ09FUkNJT05fQkFETkVTUzsgLyogdW5zaWduZWQgbG9uZyAtPiB1bnNpZ25lZCBpbnQgKi8gCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCAoVFlQRV9OQU1FIChhcmcpLCAibG9uZyIpICYmICFzdHJjbXAgKFRZUEVfTkFNRSAocGFybSksICJpbnQiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5URUdFUl9DT0VSQ0lPTl9CQURORVNTOyAvKiBzaWduZWQgbG9uZyAtPiB1bnNpZ25lZCBpbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5URUdFUl9DT05WRVJTSU9OX0JBRE5FU1M7IC8qIHNpZ25lZCBpbnQvbG9uZyAtPiB1bnNpZ25lZCBpbnQvbG9uZyAqLyAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIVRZUEVfTk9TSUdOIChhcmcpICYmICFUWVBFX1VOU0lHTkVEIChhcmcpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAgKFRZUEVfTkFNRSAocGFybSksIFRZUEVfTkFNRSAoYXJnKSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wIChUWVBFX05BTUUgKGFyZyksICJpbnQiKSAmJiAhc3RyY21wIChUWVBFX05BTUUgKHBhcm0pLCAibG9uZyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVEVHRVJfUFJPTU9USU9OX0JBRE5FU1M7CisgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVEVHRVJfQ09FUkNJT05fQkFETkVTUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5URUdFUl9DT0VSQ0lPTl9CQURORVNTOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSBpZiAoVFlQRV9MRU5HVEggKGFyZykgPCBUWVBFX0xFTkdUSCAocGFybSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIElOVEVHRVJfUFJPTU9USU9OX0JBRE5FU1M7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5URUdFUl9DT0VSQ0lPTl9CQURORVNTOworICAgICAgICAgICAgY2FzZSBUWVBFX0NPREVfRU5VTToKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0NIQVI6CisgICAgICAgICAgICBjYXNlIFRZUEVfQ09ERV9SQU5HRToKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0JPT0w6CisgICAgICAgICAgICAgIHJldHVybiBJTlRFR0VSX1BST01PVElPTl9CQURORVNTOworICAgICAgICAgICAgY2FzZSBUWVBFX0NPREVfRkxUOgorICAgICAgICAgICAgICByZXR1cm4gSU5UX0ZMT0FUX0NPTlZFUlNJT05fQkFETkVTUzsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX1BUUjoKKyAgICAgICAgICAgICAgcmV0dXJuIE5TX1BPSU5URVJfQ09OVkVSU0lPTl9CQURORVNTOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgcmV0dXJuIElOQ09NUEFUSUJMRV9UWVBFX0JBRE5FU1M7CisgICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT0RFX0VOVU06CisgICAgICAgIHN3aXRjaCAoVFlQRV9DT0RFIChhcmcpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0lOVDoKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0NIQVI6CisgICAgICAgICAgICBjYXNlIFRZUEVfQ09ERV9SQU5HRToKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0JPT0w6CisgICAgICAgICAgICBjYXNlIFRZUEVfQ09ERV9FTlVNOgorICAgICAgICAgICAgICByZXR1cm4gSU5URUdFUl9DT0VSQ0lPTl9CQURORVNTOworICAgICAgICAgICAgY2FzZSBUWVBFX0NPREVfRkxUOgorICAgICAgICAgICAgICByZXR1cm4gSU5UX0ZMT0FUX0NPTlZFUlNJT05fQkFETkVTUzsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldHVybiBJTkNPTVBBVElCTEVfVFlQRV9CQURORVNTOworICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRZUEVfQ09ERV9DSEFSOgorICAgICAgICBzd2l0Y2ggKFRZUEVfQ09ERSAoYXJnKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFRZUEVfQ09ERV9SQU5HRToKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0JPT0w6CisgICAgICAgICAgICBjYXNlIFRZUEVfQ09ERV9FTlVNOgorICAgICAgICAgICAgICByZXR1cm4gSU5URUdFUl9DT0VSQ0lPTl9CQURORVNTOworICAgICAgICAgICAgY2FzZSBUWVBFX0NPREVfRkxUOgorICAgICAgICAgICAgICByZXR1cm4gSU5UX0ZMT0FUX0NPTlZFUlNJT05fQkFETkVTUzsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0lOVDogCisgICAgICAgICAgICAgIGlmIChUWVBFX0xFTkdUSCAoYXJnKSA+IFRZUEVfTEVOR1RIIChwYXJtKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5URUdFUl9DT0VSQ0lPTl9CQURORVNTOworICAgICAgICAgICAgICBlbHNlIGlmIChUWVBFX0xFTkdUSCAoYXJnKSA8IFRZUEVfTEVOR1RIIChwYXJtKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5URUdFUl9QUk9NT1RJT05fQkFETkVTUzsKKyAgICAgICAgICAgICAgLyogPj4+ICEhIGVsc2UgZmFsbCB0aHJvdWdoICEhIDw8PCAqLyAKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0NIQVI6CisgICAgICAgICAgICAgIC8qIERlYWwgd2l0aCBzaWduZWQsIHVuc2lnbmVkLCBhbmQgcGxhaW4gY2hhcnMgZm9yIEMrKworICAgICAgICAgICAgICAgICBhbmQgd2l0aCBpbnQgY2FzZXMgZmFsbGluZyB0aHJvdWdoIGZyb20gcHJldmlvdXMgY2FzZSAqLworICAgICAgICAgICAgICBpZiAoVFlQRV9OT1NJR04gKHBhcm0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChUWVBFX05PU0lHTiAoYXJnKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlRFR0VSX0NPRVJDSU9OX0JBRE5FU1M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIGlmIChUWVBFX1VOU0lHTkVEIChwYXJtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoVFlQRV9VTlNJR05FRCAoYXJnKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlRFR0VSX1BST01PVElPTl9CQURORVNTOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSBpZiAoIVRZUEVfTk9TSUdOIChhcmcpICYmICFUWVBFX1VOU0lHTkVEIChhcmcpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIElOVEVHRVJfQ09FUkNJT05fQkFETkVTUzsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldHVybiBJTkNPTVBBVElCTEVfVFlQRV9CQURORVNTOworICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRZUEVfQ09ERV9SQU5HRToKKyAgICAgICAgc3dpdGNoIChUWVBFX0NPREUgKGFyZykpCisgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBUWVBFX0NPREVfSU5UOgorICAgICAgICAgICAgY2FzZSBUWVBFX0NPREVfQ0hBUjoKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX1JBTkdFOgorICAgICAgICAgICAgY2FzZSBUWVBFX0NPREVfQk9PTDoKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0VOVU06CisgICAgICAgICAgICAgIHJldHVybiBJTlRFR0VSX0NPRVJDSU9OX0JBRE5FU1M7CisgICAgICAgICAgICBjYXNlIFRZUEVfQ09ERV9GTFQ6CisgICAgICAgICAgICAgIHJldHVybiBJTlRfRkxPQVRfQ09OVkVSU0lPTl9CQURORVNTOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgcmV0dXJuIElOQ09NUEFUSUJMRV9UWVBFX0JBRE5FU1M7CisgICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT0RFX0JPT0w6CisgICAgICAgIHN3aXRjaCAoVFlQRV9DT0RFIChhcmcpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0lOVDoKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0NIQVI6CisgICAgICAgICAgICBjYXNlIFRZUEVfQ09ERV9SQU5HRToKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0VOVU06CisgICAgICAgICAgICBjYXNlIFRZUEVfQ09ERV9GTFQ6CisgICAgICAgICAgICBjYXNlIFRZUEVfQ09ERV9QVFI6CisgICAgICAgICAgICAgIHJldHVybiBCT09MRUFOX0NPTlZFUlNJT05fQkFETkVTUzsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0JPT0w6CisgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgcmV0dXJuIElOQ09NUEFUSUJMRV9UWVBFX0JBRE5FU1M7CisgICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT0RFX0ZMVDoKKyAgICAgICAgc3dpdGNoIChUWVBFX0NPREUgKGFyZykpCisgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBUWVBFX0NPREVfRkxUOgorICAgICAgICAgICAgICBpZiAoVFlQRV9MRU5HVEggKGFyZykgPCBUWVBFX0xFTkdUSCAocGFybSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZMT0FUX1BST01PVElPTl9CQURORVNTOworICAgICAgICAgICAgICBlbHNlIGlmIChUWVBFX0xFTkdUSCAoYXJnKSA9PSBUWVBFX0xFTkdUSCAocGFybSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gRkxPQVRfQ09OVkVSU0lPTl9CQURORVNTOworICAgICAgICAgICAgY2FzZSBUWVBFX0NPREVfSU5UOgorICAgICAgICAgICAgY2FzZSBUWVBFX0NPREVfQk9PTDoKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0VOVU06CisgICAgICAgICAgICBjYXNlIFRZUEVfQ09ERV9SQU5HRToKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0NIQVI6CisgICAgICAgICAgICAgIHJldHVybiBJTlRfRkxPQVRfQ09OVkVSU0lPTl9CQURORVNTOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgcmV0dXJuIElOQ09NUEFUSUJMRV9UWVBFX0JBRE5FU1M7CisgICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT0RFX0NPTVBMRVg6CisgICAgICAgIHN3aXRjaCAoVFlQRV9DT0RFIChhcmcpKQorICAgICAgICAgIHsgLyogU3RyaWN0bHkgbm90IG5lZWRlZCBmb3IgQysrLCBidXQuLi4gKi8KKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX0ZMVDoKKyAgICAgICAgICAgICAgcmV0dXJuIEZMT0FUX1BST01PVElPTl9CQURORVNTOworICAgICAgICAgICAgY2FzZSBUWVBFX0NPREVfQ09NUExFWDoKKyAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICByZXR1cm4gSU5DT01QQVRJQkxFX1RZUEVfQkFETkVTUzsKKyAgICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPREVfU1RSVUNUOgorICAgICAgLyogY3VycmVudGx5IHNhbWUgYXMgVFlQRV9DT0RFX0NMQVNTICovCisgICAgICAgIHN3aXRjaCAoVFlQRV9DT0RFIChhcmcpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX1NUUlVDVDoKKyAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGRlcml2YXRpb24gKi8KKyAgICAgICAgICAgICAgaWYgKGlzX2FuY2VzdG9yIChwYXJtLCBhcmcpKQorICAgICAgICAgICAgICAgIHJldHVybiBCQVNFX0NPTlZFUlNJT05fQkFETkVTUzsKKyAgICAgICAgICAgICAgLyogZWxzZSBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldHVybiBJTkNPTVBBVElCTEVfVFlQRV9CQURORVNTOworICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRZUEVfQ09ERV9VTklPTjoKKyAgICAgICAgc3dpdGNoIChUWVBFX0NPREUgKGFyZykpCisgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBUWVBFX0NPREVfVU5JT046CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICByZXR1cm4gSU5DT01QQVRJQkxFX1RZUEVfQkFETkVTUzsKKyAgICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPREVfTUVNQkVSOgorICAgICAgICBzd2l0Y2ggKFRZUEVfQ09ERSAoYXJnKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICByZXR1cm4gSU5DT01QQVRJQkxFX1RZUEVfQkFETkVTUzsKKyAgICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPREVfTUVUSE9EOgorICAgICAgICBzd2l0Y2ggKFRZUEVfQ09ERSAoYXJnKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldHVybiBJTkNPTVBBVElCTEVfVFlQRV9CQURORVNTOworICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRZUEVfQ09ERV9SRUY6CisgICAgICAgIHN3aXRjaCAoVFlQRV9DT0RFIChhcmcpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgcmV0dXJuIElOQ09NUEFUSUJMRV9UWVBFX0JBRE5FU1M7CisgICAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPREVfU0VUOgorICAgICAgICBzd2l0Y2ggKFRZUEVfQ09ERSAoYXJnKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBOb3QgaW4gQysrICovCisgICAgICAgICAgICBjYXNlIFRZUEVfQ09ERV9TRVQ6CisgICAgICAgICAgICAgIHJldHVybiByYW5rX29uZV90eXBlIChUWVBFX0ZJRUxEX1RZUEUgKHBhcm0sIDApLCBUWVBFX0ZJRUxEX1RZUEUgKGFyZywgMCkpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgcmV0dXJuIElOQ09NUEFUSUJMRV9UWVBFX0JBRE5FU1M7CisgICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT0RFX1ZPSUQ6CisgICAgICBkZWZhdWx0OiAgCisgICAgICAgIHJldHVybiBJTkNPTVBBVElCTEVfVFlQRV9CQURORVNTOworICAgIH0gLyogc3dpdGNoIChUWVBFX0NPREUgKGFyZykpICovCit9CisKKyAKKy8qIEVuZCBvZiBmdW5jdGlvbnMgZm9yIG92ZXJsb2FkIHJlc29sdXRpb24gKi8gCisKKworCisjaWYgTUFJTlRFTkFOQ0VfQ01EUworCitzdGF0aWMgdm9pZAorcHJpbnRfYml0X3ZlY3RvciAoYml0cywgbmJpdHMpCisgICAgIEJfVFlQRSAqYml0czsKKyAgICAgaW50IG5iaXRzOworeworICBpbnQgYml0bm87CisKKyAgZm9yIChiaXRubyA9IDA7IGJpdG5vIDwgbmJpdHM7IGJpdG5vKyspCisgICAgeworICAgICAgaWYgKChiaXRubyAlIDgpID09IDApCisJeworCSAgcHV0c19maWx0ZXJlZCAoIiAiKTsKKwl9CisgICAgICBpZiAoQl9UU1QgKGJpdHMsIGJpdG5vKSkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCIxIik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIjAiKTsKKwl9CisgICAgfQorfQorCisvKiBUaGUgYXJncyBsaXN0IGlzIGEgc3RyYW5nZSBiZWFzdC4gIEl0IGlzIGVpdGhlciB0ZXJtaW5hdGVkIGJ5IGEgTlVMTAorICAgcG9pbnRlciBmb3IgdmFyYXJncyBmdW5jdGlvbnMsIG9yIGJ5IGEgcG9pbnRlciB0byBhIFRZUEVfQ09ERV9WT0lECisgICB0eXBlIGZvciBub3JtYWwgZml4ZWQgYXJnY291bnQgZnVuY3Rpb25zLiAgKEZJWE1FIHNvbWVkYXkpCisgICBBbHNvIG5vdGUgdGhlIGZpcnN0IGFyZyBzaG91bGQgYmUgdGhlICJ0aGlzIiBwb2ludGVyLCB3ZSBtYXkgbm90IHdhbnQgdG8KKyAgIGluY2x1ZGUgaXQgc2luY2Ugd2UgbWF5IGdldCBpbnRvIGEgaW5maW5pdGVseSByZWN1cnNpdmUgc2l0dWF0aW9uLiAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfYXJnX3R5cGVzIChhcmdzLCBzcGFjZXMpCisgICAgIHN0cnVjdCB0eXBlICoqYXJnczsKKyAgICAgaW50IHNwYWNlczsKK3sKKyAgaWYgKGFyZ3MgIT0gTlVMTCkKKyAgICB7CisgICAgICB3aGlsZSAoKmFyZ3MgIT0gTlVMTCkKKwl7CisJICByZWN1cnNpdmVfZHVtcF90eXBlICgqYXJncywgc3BhY2VzICsgMik7CisJICBpZiAoKCphcmdzKyspIC0+IGNvZGUgPT0gVFlQRV9DT0RFX1ZPSUQpCisJICAgIHsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX2ZuX2ZpZWxkbGlzdHMgKHR5cGUsIHNwYWNlcykKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGludCBzcGFjZXM7Cit7CisgIGludCBtZXRob2RfaWR4OworICBpbnQgb3ZlcmxvYWRfaWR4OworICBzdHJ1Y3QgZm5fZmllbGQgKmY7CisKKyAgcHJpbnRmaV9maWx0ZXJlZCAoc3BhY2VzLCAiZm5fZmllbGRsaXN0cyAiKTsKKyAgZ2RiX3ByaW50X2FkZHJlc3MgKFRZUEVfRk5fRklFTERMSVNUUyAodHlwZSksIGdkYl9zdGRvdXQpOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICBmb3IgKG1ldGhvZF9pZHggPSAwOyBtZXRob2RfaWR4IDwgVFlQRV9ORk5fRklFTERTICh0eXBlKTsgbWV0aG9kX2lkeCsrKQorICAgIHsKKyAgICAgIGYgPSBUWVBFX0ZOX0ZJRUxETElTVDEgKHR5cGUsIG1ldGhvZF9pZHgpOworICAgICAgcHJpbnRmaV9maWx0ZXJlZCAoc3BhY2VzICsgMiwgIlslZF0gbmFtZSAnJXMnICgiLAorCQkJbWV0aG9kX2lkeCwKKwkJCVRZUEVfRk5fRklFTERMSVNUX05BTUUgKHR5cGUsIG1ldGhvZF9pZHgpKTsKKyAgICAgIGdkYl9wcmludF9hZGRyZXNzIChUWVBFX0ZOX0ZJRUxETElTVF9OQU1FICh0eXBlLCBtZXRob2RfaWR4KSwKKwkJCSBnZGJfc3Rkb3V0KTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIikgbGVuZ3RoICVkXG4iLAorCQkgICAgICAgVFlQRV9GTl9GSUVMRExJU1RfTEVOR1RIICh0eXBlLCBtZXRob2RfaWR4KSk7CisgICAgICBmb3IgKG92ZXJsb2FkX2lkeCA9IDA7CisJICAgb3ZlcmxvYWRfaWR4IDwgVFlQRV9GTl9GSUVMRExJU1RfTEVOR1RIICh0eXBlLCBtZXRob2RfaWR4KTsKKwkgICBvdmVybG9hZF9pZHgrKykKKwl7CisJICBwcmludGZpX2ZpbHRlcmVkIChzcGFjZXMgKyA0LCAiWyVkXSBwaHlzbmFtZSAnJXMnICgiLAorCQkJICAgIG92ZXJsb2FkX2lkeCwKKwkJCSAgICBUWVBFX0ZOX0ZJRUxEX1BIWVNOQU1FIChmLCBvdmVybG9hZF9pZHgpKTsKKwkgIGdkYl9wcmludF9hZGRyZXNzIChUWVBFX0ZOX0ZJRUxEX1BIWVNOQU1FIChmLCBvdmVybG9hZF9pZHgpLAorCQkJICAgICBnZGJfc3Rkb3V0KTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIilcbiIpOworCSAgcHJpbnRmaV9maWx0ZXJlZCAoc3BhY2VzICsgOCwgInR5cGUgIik7CisJICBnZGJfcHJpbnRfYWRkcmVzcyAoVFlQRV9GTl9GSUVMRF9UWVBFIChmLCBvdmVybG9hZF9pZHgpLCBnZGJfc3Rkb3V0KTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisKKwkgIHJlY3Vyc2l2ZV9kdW1wX3R5cGUgKFRZUEVfRk5fRklFTERfVFlQRSAoZiwgb3ZlcmxvYWRfaWR4KSwKKwkJCSAgICAgICBzcGFjZXMgKyA4ICsgMik7CisKKwkgIHByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcyArIDgsICJhcmdzICIpOworCSAgZ2RiX3ByaW50X2FkZHJlc3MgKFRZUEVfRk5fRklFTERfQVJHUyAoZiwgb3ZlcmxvYWRfaWR4KSwgZ2RiX3N0ZG91dCk7CisJICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworCisJICBwcmludF9hcmdfdHlwZXMgKFRZUEVfRk5fRklFTERfQVJHUyAoZiwgb3ZlcmxvYWRfaWR4KSwgc3BhY2VzKTsKKwkgIHByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcyArIDgsICJmY29udGV4dCAiKTsKKwkgIGdkYl9wcmludF9hZGRyZXNzIChUWVBFX0ZOX0ZJRUxEX0ZDT05URVhUIChmLCBvdmVybG9hZF9pZHgpLAorCQkJICAgICBnZGJfc3Rkb3V0KTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisKKwkgIHByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcyArIDgsICJpc19jb25zdCAlZFxuIiwKKwkJCSAgICBUWVBFX0ZOX0ZJRUxEX0NPTlNUIChmLCBvdmVybG9hZF9pZHgpKTsKKwkgIHByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcyArIDgsICJpc192b2xhdGlsZSAlZFxuIiwKKwkJCSAgICBUWVBFX0ZOX0ZJRUxEX1ZPTEFUSUxFIChmLCBvdmVybG9hZF9pZHgpKTsKKwkgIHByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcyArIDgsICJpc19wcml2YXRlICVkXG4iLAorCQkJICAgIFRZUEVfRk5fRklFTERfUFJJVkFURSAoZiwgb3ZlcmxvYWRfaWR4KSk7CisJICBwcmludGZpX2ZpbHRlcmVkIChzcGFjZXMgKyA4LCAiaXNfcHJvdGVjdGVkICVkXG4iLAorCQkJICAgIFRZUEVfRk5fRklFTERfUFJPVEVDVEVEIChmLCBvdmVybG9hZF9pZHgpKTsKKwkgIHByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcyArIDgsICJpc19zdHViICVkXG4iLAorCQkJICAgIFRZUEVfRk5fRklFTERfU1RVQiAoZiwgb3ZlcmxvYWRfaWR4KSk7CisJICBwcmludGZpX2ZpbHRlcmVkIChzcGFjZXMgKyA4LCAidm9mZnNldCAldVxuIiwKKwkJCSAgICBUWVBFX0ZOX0ZJRUxEX1ZPRkZTRVQgKGYsIG92ZXJsb2FkX2lkeCkpOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9jcGx1c19zdHVmZiAodHlwZSwgc3BhY2VzKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgaW50IHNwYWNlczsKK3sKKyAgcHJpbnRmaV9maWx0ZXJlZCAoc3BhY2VzLCAibl9iYXNlY2xhc3NlcyAlZFxuIiwKKwkJICAgIFRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSkpOworICBwcmludGZpX2ZpbHRlcmVkIChzcGFjZXMsICJuZm5fZmllbGRzICVkXG4iLAorCQkgICAgVFlQRV9ORk5fRklFTERTICh0eXBlKSk7CisgIHByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcywgIm5mbl9maWVsZHNfdG90YWwgJWRcbiIsCisJCSAgICBUWVBFX05GTl9GSUVMRFNfVE9UQUwgKHR5cGUpKTsKKyAgaWYgKFRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSkgPiAwKQorICAgIHsKKyAgICAgIHByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcywgInZpcnR1YWxfZmllbGRfYml0cyAoJWQgYml0cyBhdCAqIiwKKwkJCVRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSkpOworICAgICAgZ2RiX3ByaW50X2FkZHJlc3MgKFRZUEVfRklFTERfVklSVFVBTF9CSVRTICh0eXBlKSwgZ2RiX3N0ZG91dCk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIpIik7CisKKyAgICAgIHByaW50X2JpdF92ZWN0b3IgKFRZUEVfRklFTERfVklSVFVBTF9CSVRTICh0eXBlKSwKKwkJCVRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSkpOworICAgICAgcHV0c19maWx0ZXJlZCAoIlxuIik7CisgICAgfQorICBpZiAoVFlQRV9ORklFTERTICh0eXBlKSA+IDApCisgICAgeworICAgICAgaWYgKFRZUEVfRklFTERfUFJJVkFURV9CSVRTICh0eXBlKSAhPSBOVUxMKQorCXsKKwkgIHByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcywgInByaXZhdGVfZmllbGRfYml0cyAoJWQgYml0cyBhdCAqIiwKKwkJCSAgICBUWVBFX05GSUVMRFMgKHR5cGUpKTsKKwkgIGdkYl9wcmludF9hZGRyZXNzIChUWVBFX0ZJRUxEX1BSSVZBVEVfQklUUyAodHlwZSksIGdkYl9zdGRvdXQpOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiKSIpOworCSAgcHJpbnRfYml0X3ZlY3RvciAoVFlQRV9GSUVMRF9QUklWQVRFX0JJVFMgKHR5cGUpLAorCQkJICAgIFRZUEVfTkZJRUxEUyAodHlwZSkpOworCSAgcHV0c19maWx0ZXJlZCAoIlxuIik7CisJfQorICAgICAgaWYgKFRZUEVfRklFTERfUFJPVEVDVEVEX0JJVFMgKHR5cGUpICE9IE5VTEwpCisJeworCSAgcHJpbnRmaV9maWx0ZXJlZCAoc3BhY2VzLCAicHJvdGVjdGVkX2ZpZWxkX2JpdHMgKCVkIGJpdHMgYXQgKiIsCisJCQkgICAgVFlQRV9ORklFTERTICh0eXBlKSk7CisJICBnZGJfcHJpbnRfYWRkcmVzcyAoVFlQRV9GSUVMRF9QUk9URUNURURfQklUUyAodHlwZSksIGdkYl9zdGRvdXQpOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiKSIpOworCSAgcHJpbnRfYml0X3ZlY3RvciAoVFlQRV9GSUVMRF9QUk9URUNURURfQklUUyAodHlwZSksCisJCQkgICAgVFlQRV9ORklFTERTICh0eXBlKSk7CisJICBwdXRzX2ZpbHRlcmVkICgiXG4iKTsKKwl9CisgICAgfQorICBpZiAoVFlQRV9ORk5fRklFTERTICh0eXBlKSA+IDApCisgICAgeworICAgICAgZHVtcF9mbl9maWVsZGxpc3RzICh0eXBlLCBzcGFjZXMpOworICAgIH0KK30KKworc3RhdGljIHN0cnVjdCBvYnN0YWNrIGRvbnRfcHJpbnRfdHlwZV9vYnN0YWNrOworCit2b2lkCityZWN1cnNpdmVfZHVtcF90eXBlICh0eXBlLCBzcGFjZXMpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBpbnQgc3BhY2VzOworeworICBpbnQgaWR4OworCisgIGlmIChzcGFjZXMgPT0gMCkKKyAgICBvYnN0YWNrX2JlZ2luICgmZG9udF9wcmludF90eXBlX29ic3RhY2ssIDApOworCisgIGlmIChUWVBFX05GSUVMRFMgKHR5cGUpID4gMAorICAgICAgfHwgKFRZUEVfQ1BMVVNfU1BFQ0lGSUMgKHR5cGUpICYmIFRZUEVfTkZOX0ZJRUxEUyAodHlwZSkgPiAwKSkKKyAgICB7CisgICAgICBzdHJ1Y3QgdHlwZSAqKmZpcnN0X2RvbnRfcHJpbnQKKwk9IChzdHJ1Y3QgdHlwZSAqKilvYnN0YWNrX2Jhc2UgKCZkb250X3ByaW50X3R5cGVfb2JzdGFjayk7CisKKyAgICAgIGludCBpID0gKHN0cnVjdCB0eXBlICoqKW9ic3RhY2tfbmV4dF9mcmVlICgmZG9udF9wcmludF90eXBlX29ic3RhY2spCisJLSBmaXJzdF9kb250X3ByaW50OworCisgICAgICB3aGlsZSAoLS1pID49IDApCisJeworCSAgaWYgKHR5cGUgPT0gZmlyc3RfZG9udF9wcmludFtpXSkKKwkgICAgeworCSAgICAgIHByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcywgInR5cGUgbm9kZSAiKTsKKwkgICAgICBnZGJfcHJpbnRfYWRkcmVzcyAodHlwZSwgZ2RiX3N0ZG91dCk7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiIDxzYW1lIGFzIGFscmVhZHkgc2VlbiB0eXBlPlxuIik7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJfQorCisgICAgICBvYnN0YWNrX3B0cl9ncm93ICgmZG9udF9wcmludF90eXBlX29ic3RhY2ssIHR5cGUpOworICAgIH0KKworICBwcmludGZpX2ZpbHRlcmVkIChzcGFjZXMsICJ0eXBlIG5vZGUgIik7CisgIGdkYl9wcmludF9hZGRyZXNzICh0eXBlLCBnZGJfc3Rkb3V0KTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgcHJpbnRmaV9maWx0ZXJlZCAoc3BhY2VzLCAibmFtZSAnJXMnICgiLAorCQkgICAgVFlQRV9OQU1FICh0eXBlKSA/IFRZUEVfTkFNRSAodHlwZSkgOiAiPE5VTEw+Iik7CisgIGdkYl9wcmludF9hZGRyZXNzIChUWVBFX05BTUUgKHR5cGUpLCBnZGJfc3Rkb3V0KTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiKVxuIik7CisgIGlmIChUWVBFX1RBR19OQU1FICh0eXBlKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcywgInRhZ25hbWUgJyVzJyAoIiwKKwkJCVRZUEVfVEFHX05BTUUgKHR5cGUpKTsKKyAgICAgIGdkYl9wcmludF9hZGRyZXNzIChUWVBFX1RBR19OQU1FICh0eXBlKSwgZ2RiX3N0ZG91dCk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIpXG4iKTsKKyAgICB9CisgIHByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcywgImNvZGUgMHgleCAiLCBUWVBFX0NPREUgKHR5cGUpKTsKKyAgc3dpdGNoIChUWVBFX0NPREUgKHR5cGUpKQorICAgIHsKKyAgICAgIGNhc2UgVFlQRV9DT0RFX1VOREVGOgorICAgICAgICBwcmludGZfZmlsdGVyZWQgKCIoVFlQRV9DT0RFX1VOREVGKSIpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPREVfUFRSOgorCXByaW50Zl9maWx0ZXJlZCAoIihUWVBFX0NPREVfUFRSKSIpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPREVfQVJSQVk6CisJcHJpbnRmX2ZpbHRlcmVkICgiKFRZUEVfQ09ERV9BUlJBWSkiKTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT0RFX1NUUlVDVDoKKwlwcmludGZfZmlsdGVyZWQgKCIoVFlQRV9DT0RFX1NUUlVDVCkiKTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT0RFX1VOSU9OOgorCXByaW50Zl9maWx0ZXJlZCAoIihUWVBFX0NPREVfVU5JT04pIik7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfQ09ERV9FTlVNOgorCXByaW50Zl9maWx0ZXJlZCAoIihUWVBFX0NPREVfRU5VTSkiKTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT0RFX0ZVTkM6CisJcHJpbnRmX2ZpbHRlcmVkICgiKFRZUEVfQ09ERV9GVU5DKSIpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPREVfSU5UOgorCXByaW50Zl9maWx0ZXJlZCAoIihUWVBFX0NPREVfSU5UKSIpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPREVfRkxUOgorCXByaW50Zl9maWx0ZXJlZCAoIihUWVBFX0NPREVfRkxUKSIpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPREVfVk9JRDoKKwlwcmludGZfZmlsdGVyZWQgKCIoVFlQRV9DT0RFX1ZPSUQpIik7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfQ09ERV9TRVQ6CisJcHJpbnRmX2ZpbHRlcmVkICgiKFRZUEVfQ09ERV9TRVQpIik7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfQ09ERV9SQU5HRToKKwlwcmludGZfZmlsdGVyZWQgKCIoVFlQRV9DT0RFX1JBTkdFKSIpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPREVfU1RSSU5HOgorCXByaW50Zl9maWx0ZXJlZCAoIihUWVBFX0NPREVfU1RSSU5HKSIpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPREVfRVJST1I6CisJcHJpbnRmX2ZpbHRlcmVkICgiKFRZUEVfQ09ERV9FUlJPUikiKTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT0RFX01FTUJFUjoKKwlwcmludGZfZmlsdGVyZWQgKCIoVFlQRV9DT0RFX01FTUJFUikiKTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT0RFX01FVEhPRDoKKwlwcmludGZfZmlsdGVyZWQgKCIoVFlQRV9DT0RFX01FVEhPRCkiKTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT0RFX1JFRjoKKwlwcmludGZfZmlsdGVyZWQgKCIoVFlQRV9DT0RFX1JFRikiKTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT0RFX0NIQVI6CisJcHJpbnRmX2ZpbHRlcmVkICgiKFRZUEVfQ09ERV9DSEFSKSIpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPREVfQk9PTDoKKwlwcmludGZfZmlsdGVyZWQgKCIoVFlQRV9DT0RFX0JPT0wpIik7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfQ09ERV9UWVBFREVGOgorCXByaW50Zl9maWx0ZXJlZCAoIihUWVBFX0NPREVfVFlQRURFRikiKTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJcHJpbnRmX2ZpbHRlcmVkICgiKFVOS05PV04gVFlQRSBDT0RFKSIpOworCWJyZWFrOworICAgIH0KKyAgcHV0c19maWx0ZXJlZCAoIlxuIik7CisgIHByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcywgImxlbmd0aCAlZFxuIiwgVFlQRV9MRU5HVEggKHR5cGUpKTsKKyAgcHJpbnRmaV9maWx0ZXJlZCAoc3BhY2VzLCAib2JqZmlsZSAiKTsKKyAgZ2RiX3ByaW50X2FkZHJlc3MgKFRZUEVfT0JKRklMRSAodHlwZSksIGdkYl9zdGRvdXQpOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICBwcmludGZpX2ZpbHRlcmVkIChzcGFjZXMsICJ0YXJnZXRfdHlwZSAiKTsKKyAgZ2RiX3ByaW50X2FkZHJlc3MgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpLCBnZGJfc3Rkb3V0KTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgaWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpICE9IE5VTEwpCisgICAgeworICAgICAgcmVjdXJzaXZlX2R1bXBfdHlwZSAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSksIHNwYWNlcyArIDIpOworICAgIH0KKyAgcHJpbnRmaV9maWx0ZXJlZCAoc3BhY2VzLCAicG9pbnRlcl90eXBlICIpOworICBnZGJfcHJpbnRfYWRkcmVzcyAoVFlQRV9QT0lOVEVSX1RZUEUgKHR5cGUpLCBnZGJfc3Rkb3V0KTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgcHJpbnRmaV9maWx0ZXJlZCAoc3BhY2VzLCAicmVmZXJlbmNlX3R5cGUgIik7CisgIGdkYl9wcmludF9hZGRyZXNzIChUWVBFX1JFRkVSRU5DRV9UWVBFICh0eXBlKSwgZ2RiX3N0ZG91dCk7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIHByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcywgImZsYWdzIDB4JXgiLCBUWVBFX0ZMQUdTICh0eXBlKSk7CisgIGlmIChUWVBFX0ZMQUdTICh0eXBlKSAmIFRZUEVfRkxBR19VTlNJR05FRCkKKyAgICB7CisgICAgICBwdXRzX2ZpbHRlcmVkICgiIFRZUEVfRkxBR19VTlNJR05FRCIpOworICAgIH0KKyAgaWYgKFRZUEVfRkxBR1MgKHR5cGUpICYgVFlQRV9GTEFHX1NUVUIpCisgICAgeworICAgICAgcHV0c19maWx0ZXJlZCAoIiBUWVBFX0ZMQUdfU1RVQiIpOworICAgIH0KKyAgcHV0c19maWx0ZXJlZCAoIlxuIik7CisgIHByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcywgIm5maWVsZHMgJWQgIiwgVFlQRV9ORklFTERTICh0eXBlKSk7CisgIGdkYl9wcmludF9hZGRyZXNzIChUWVBFX0ZJRUxEUyAodHlwZSksIGdkYl9zdGRvdXQpOworICBwdXRzX2ZpbHRlcmVkICgiXG4iKTsKKyAgZm9yIChpZHggPSAwOyBpZHggPCBUWVBFX05GSUVMRFMgKHR5cGUpOyBpZHgrKykKKyAgICB7CisgICAgICBwcmludGZpX2ZpbHRlcmVkIChzcGFjZXMgKyAyLAorCQkJIlslZF0gYml0cG9zICVkIGJpdHNpemUgJWQgdHlwZSAiLAorCQkJaWR4LCBUWVBFX0ZJRUxEX0JJVFBPUyAodHlwZSwgaWR4KSwKKwkJCVRZUEVfRklFTERfQklUU0laRSAodHlwZSwgaWR4KSk7CisgICAgICBnZGJfcHJpbnRfYWRkcmVzcyAoVFlQRV9GSUVMRF9UWVBFICh0eXBlLCBpZHgpLCBnZGJfc3Rkb3V0KTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiBuYW1lICclcycgKCIsCisJCSAgICAgICBUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIGlkeCkgIT0gTlVMTAorCQkgICAgICAgPyBUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIGlkeCkKKwkJICAgICAgIDogIjxOVUxMPiIpOworICAgICAgZ2RiX3ByaW50X2FkZHJlc3MgKFRZUEVfRklFTERfTkFNRSAodHlwZSwgaWR4KSwgZ2RiX3N0ZG91dCk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIpXG4iKTsKKyAgICAgIGlmIChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGlkeCkgIT0gTlVMTCkKKwl7CisJICByZWN1cnNpdmVfZHVtcF90eXBlIChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGlkeCksIHNwYWNlcyArIDQpOworCX0KKyAgICB9CisgIHByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcywgInZwdHJfYmFzZXR5cGUgIik7CisgIGdkYl9wcmludF9hZGRyZXNzIChUWVBFX1ZQVFJfQkFTRVRZUEUgKHR5cGUpLCBnZGJfc3Rkb3V0KTsKKyAgcHV0c19maWx0ZXJlZCAoIlxuIik7CisgIGlmIChUWVBFX1ZQVFJfQkFTRVRZUEUgKHR5cGUpICE9IE5VTEwpCisgICAgeworICAgICAgcmVjdXJzaXZlX2R1bXBfdHlwZSAoVFlQRV9WUFRSX0JBU0VUWVBFICh0eXBlKSwgc3BhY2VzICsgMik7CisgICAgfQorICBwcmludGZpX2ZpbHRlcmVkIChzcGFjZXMsICJ2cHRyX2ZpZWxkbm8gJWRcbiIsIFRZUEVfVlBUUl9GSUVMRE5PICh0eXBlKSk7CisgIHN3aXRjaCAoVFlQRV9DT0RFICh0eXBlKSkKKyAgICB7CisgICAgICBjYXNlIFRZUEVfQ09ERV9NRVRIT0Q6CisgICAgICBjYXNlIFRZUEVfQ09ERV9GVU5DOgorCXByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcywgImFyZ190eXBlcyAiKTsKKwlnZGJfcHJpbnRfYWRkcmVzcyAoVFlQRV9BUkdfVFlQRVMgKHR5cGUpLCBnZGJfc3Rkb3V0KTsKKwlwdXRzX2ZpbHRlcmVkICgiXG4iKTsKKwlwcmludF9hcmdfdHlwZXMgKFRZUEVfQVJHX1RZUEVTICh0eXBlKSwgc3BhY2VzKTsKKwlicmVhazsKKworICAgICAgY2FzZSBUWVBFX0NPREVfU1RSVUNUOgorCXByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcywgImNwbHVzX3N0dWZmICIpOworCWdkYl9wcmludF9hZGRyZXNzIChUWVBFX0NQTFVTX1NQRUNJRklDICh0eXBlKSwgZ2RiX3N0ZG91dCk7CisJcHV0c19maWx0ZXJlZCAoIlxuIik7CisJcHJpbnRfY3BsdXNfc3R1ZmYgKHR5cGUsIHNwYWNlcyk7CisJYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisJLyogV2UgaGF2ZSB0byBwaWNrIG9uZSBvZiB0aGUgdW5pb24gdHlwZXMgdG8gYmUgYWJsZSBwcmludCBhbmQgdGVzdAorCSAgIHRoZSB2YWx1ZS4gIFBpY2sgY3BsdXNfc3RydWN0X3R5cGUsIGV2ZW4gdGhvdWdoIHdlIGtub3cgaXQgaXNuJ3QKKwkgICBhbnkgcGFydGljdWxhciBvbmUuICovCisJcHJpbnRmaV9maWx0ZXJlZCAoc3BhY2VzLCAidHlwZV9zcGVjaWZpYyAiKTsKKwlnZGJfcHJpbnRfYWRkcmVzcyAoVFlQRV9DUExVU19TUEVDSUZJQyAodHlwZSksIGdkYl9zdGRvdXQpOworCWlmIChUWVBFX0NQTFVTX1NQRUNJRklDICh0eXBlKSAhPSBOVUxMKQorCSAgeworCSAgICBwcmludGZfZmlsdGVyZWQgKCIgKHVua25vd24gZGF0YSBmb3JtKSIpOworCSAgfQorCXByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisJYnJlYWs7CisKKyAgICB9CisgIGlmIChzcGFjZXMgPT0gMCkKKyAgICBvYnN0YWNrX2ZyZWUgKCZkb250X3ByaW50X3R5cGVfb2JzdGFjaywgTlVMTCk7Cit9CisKKyNlbmRpZgkvKiBNQUlOVEVOQU5DRV9DTURTICovCisKKworc3RhdGljIHZvaWQgYnVpbGRfZ2RidHlwZXMgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQKK2J1aWxkX2dkYnR5cGVzICgpCit7CisgIGJ1aWx0aW5fdHlwZV92b2lkID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9WT0lELCAxLAorCSAgICAgICAwLAorCSAgICAgICAidm9pZCIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgYnVpbHRpbl90eXBlX2NoYXIgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgVEFSR0VUX0NIQVJfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCSAgICAgICAwLAorCSAgICAgICAiY2hhciIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgVFlQRV9GTEFHUyAoYnVpbHRpbl90eXBlX2NoYXIpIHw9IFRZUEVfRkxBR19OT1NJR047CisgIAorICBidWlsdGluX3R5cGVfc2lnbmVkX2NoYXIgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgVEFSR0VUX0NIQVJfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCSAgICAgICAwLAorCSAgICAgICAic2lnbmVkIGNoYXIiLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9jaGFyID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIFRBUkdFVF9DSEFSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgVFlQRV9GTEFHX1VOU0lHTkVELAorCSAgICAgICAidW5zaWduZWQgY2hhciIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgYnVpbHRpbl90eXBlX3Nob3J0ID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIFRBUkdFVF9TSE9SVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJICAgICAgIDAsCisJICAgICAgICJzaG9ydCIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgYnVpbHRpbl90eXBlX3Vuc2lnbmVkX3Nob3J0ID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIFRBUkdFVF9TSE9SVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJICAgICAgIFRZUEVfRkxBR19VTlNJR05FRCwKKwkgICAgICAgInVuc2lnbmVkIHNob3J0IiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICBidWlsdGluX3R5cGVfaW50ID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIFRBUkdFVF9JTlRfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCSAgICAgICAwLAorCSAgICAgICAiaW50IiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICBidWlsdGluX3R5cGVfdW5zaWduZWRfaW50ID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIFRBUkdFVF9JTlRfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCSAgICAgICBUWVBFX0ZMQUdfVU5TSUdORUQsCisJICAgICAgICJ1bnNpZ25lZCBpbnQiLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIGJ1aWx0aW5fdHlwZV9sb25nID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIFRBUkdFVF9MT05HX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgMCwKKwkgICAgICAgImxvbmciLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9sb25nID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIFRBUkdFVF9MT05HX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgVFlQRV9GTEFHX1VOU0lHTkVELAorCSAgICAgICAidW5zaWduZWQgbG9uZyIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgYnVpbHRpbl90eXBlX2xvbmdfbG9uZyA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCBUQVJHRVRfTE9OR19MT05HX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgMCwKKwkgICAgICAgImxvbmcgbG9uZyIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZyA9IAorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgVEFSR0VUX0xPTkdfTE9OR19CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJICAgICAgIFRZUEVfRkxBR19VTlNJR05FRCwKKwkgICAgICAgInVuc2lnbmVkIGxvbmcgbG9uZyIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgYnVpbHRpbl90eXBlX2Zsb2F0ID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9GTFQsIFRBUkdFVF9GTE9BVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJICAgICAgIDAsCisJICAgICAgICJmbG9hdCIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgYnVpbHRpbl90eXBlX2RvdWJsZSA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfRkxULCBUQVJHRVRfRE9VQkxFX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgMCwKKwkgICAgICAgImRvdWJsZSIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgYnVpbHRpbl90eXBlX2xvbmdfZG91YmxlID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9GTFQsIFRBUkdFVF9MT05HX0RPVUJMRV9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJICAgICAgIDAsCisJICAgICAgICJsb25nIGRvdWJsZSIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgYnVpbHRpbl90eXBlX2NvbXBsZXggPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0NPTVBMRVgsIDIgKiBUQVJHRVRfRkxPQVRfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCSAgICAgICAwLAorCSAgICAgICAiY29tcGxleCIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgVFlQRV9UQVJHRVRfVFlQRSAoYnVpbHRpbl90eXBlX2NvbXBsZXgpID0gYnVpbHRpbl90eXBlX2Zsb2F0OworICBidWlsdGluX3R5cGVfZG91YmxlX2NvbXBsZXggPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0NPTVBMRVgsIDIgKiBUQVJHRVRfRE9VQkxFX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgMCwKKwkgICAgICAgImRvdWJsZSBjb21wbGV4IiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICBUWVBFX1RBUkdFVF9UWVBFIChidWlsdGluX3R5cGVfZG91YmxlX2NvbXBsZXgpID0gYnVpbHRpbl90eXBlX2RvdWJsZTsKKyAgYnVpbHRpbl90eXBlX3N0cmluZyA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfU1RSSU5HLCBUQVJHRVRfQ0hBUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJICAgICAgIDAsCisJICAgICAgICJzdHJpbmciLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIGJ1aWx0aW5fdHlwZV9pbnQ4ID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDggLyA4LAorCSAgICAgICAwLAorCSAgICAgICAiaW50OF90IiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICBidWlsdGluX3R5cGVfdWludDggPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgOCAvIDgsCisJICAgICAgIFRZUEVfRkxBR19VTlNJR05FRCwKKwkgICAgICAgInVpbnQ4X3QiLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIGJ1aWx0aW5fdHlwZV9pbnQxNiA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCAxNiAvIDgsCisJICAgICAgIDAsCisJICAgICAgICJpbnQxNl90IiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICBidWlsdGluX3R5cGVfdWludDE2ID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDE2IC8gOCwKKwkgICAgICAgVFlQRV9GTEFHX1VOU0lHTkVELAorCSAgICAgICAidWludDE2X3QiLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIGJ1aWx0aW5fdHlwZV9pbnQzMiA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCAzMiAvIDgsCisJICAgICAgIDAsCisJICAgICAgICJpbnQzMl90IiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICBidWlsdGluX3R5cGVfdWludDMyID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDMyIC8gOCwKKwkgICAgICAgVFlQRV9GTEFHX1VOU0lHTkVELAorCSAgICAgICAidWludDMyX3QiLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIGJ1aWx0aW5fdHlwZV9pbnQ2NCA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCA2NCAvIDgsCisJICAgICAgIDAsCisJICAgICAgICJpbnQ2NF90IiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICBidWlsdGluX3R5cGVfdWludDY0ID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDY0IC8gOCwKKwkgICAgICAgVFlQRV9GTEFHX1VOU0lHTkVELAorCSAgICAgICAidWludDY0X3QiLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIGJ1aWx0aW5fdHlwZV9ib29sID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9CT09MLCBUQVJHRVRfQ0hBUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJICAgICAgIDAsCisJICAgICAgICJib29sIiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworCisgIC8qIEFkZCB1c2VyIGtub2IgZm9yIGNvbnRyb2xsaW5nIHJlc29sdXRpb24gb2Ygb3BhcXVlIHR5cGVzICovIAorICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoIm9wYXF1ZS10eXBlLXJlc29sdXRpb24iLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwgKGNoYXIgKikmb3BhcXVlX3R5cGVfcmVzb2x1dGlvbiwKKwkJICAiU2V0IHJlc29sdXRpb24gb2Ygb3BhcXVlIHN0cnVjdC9jbGFzcy91bmlvbiB0eXBlcyAoaWYgc2V0IGJlZm9yZSBsb2FkaW5nIHN5bWJvbHMpLiIsCisJCSAgJnNldGxpc3QpLAorICAgICAmc2hvd2xpc3QpOworICBvcGFxdWVfdHlwZV9yZXNvbHV0aW9uID0gMTsKKworfQorCisKK2V4dGVybiB2b2lkIF9pbml0aWFsaXplX2dkYnR5cGVzIFBBUkFNUyAoKHZvaWQpKTsKK3ZvaWQKK19pbml0aWFsaXplX2dkYnR5cGVzICgpCit7CisgIGJ1aWxkX2dkYnR5cGVzICgpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2dkYnR5cGVzLmggYi9nZGIvZ2RidHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDdlYjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2dkYnR5cGVzLmgKQEAgLTAsMCArMSwxMTM1IEBACisvKiBJbnRlcm5hbCB0eXBlIGRlZmluaXRpb25zIGZvciBHREIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTgsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQsIHVzaW5nIHBpZWNlcyBmcm9tIG90aGVyIEdEQiBtb2R1bGVzLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCAoR0RCVFlQRVNfSCkKKyNkZWZpbmUgR0RCVFlQRVNfSCAxCisKKy8qIENvZGVzIGZvciBgZnVuZGFtZW50YWwgdHlwZXMnLiAgVGhpcyBpcyBhIG1vbnN0cm9zaXR5IGJhc2VkIG9uIHRoZQorICAgYm9ndXMgbm90aW9uIHRoYXQgdGhlcmUgYXJlIGNlcnRhaW4gY29tcGlsZXItaW5kZXBlbmRlbnQKKyAgIGBmdW5kYW1lbnRhbCB0eXBlcycuICBOb25lIG9mIHRoZXNlIGlzIHdlbGwtZGVmaW5lZCAoaG93IGJpZyBpcworICAgRlRfU0hPUlQ/ICBEb2VzIGl0IGRlcGVuZCBvbiB0aGUgbGFuZ3VhZ2U/ICBIb3cgZG9lcyB0aGUKKyAgIGxhbmd1YWdlLXNwZWNpZmljIGNvZGUga25vdyB3aGljaCB0eXBlIHRvIGNvcnJlbGF0ZSB0byBGVF9TSE9SVD8pICAqLworCisjZGVmaW5lIEZUX1ZPSUQJCQkwCisjZGVmaW5lIEZUX0JPT0xFQU4JCTEKKyNkZWZpbmUgRlRfQ0hBUgkJCTIgLyogd2UgdXNlIHRoaXMgZm9yIG5vdC11bnNpZ25lZCBDL0MrKyBjaGFycyAqLworI2RlZmluZSBGVF9TSUdORURfQ0hBUgkJMyAvKiB3ZSB1c2UgdGhpcyBmb3IgQysrIHNpZ25lZCBjaGFycyAqLworI2RlZmluZSBGVF9VTlNJR05FRF9DSEFSCTQgLyogd2UgdXNlIHRoaXMgZm9yIEMvQysrIHVuc2lnbmVkIGNoYXJzICovCisjZGVmaW5lIEZUX1NIT1JUCQk1CisjZGVmaW5lIEZUX1NJR05FRF9TSE9SVAkJNgorI2RlZmluZSBGVF9VTlNJR05FRF9TSE9SVAk3CisjZGVmaW5lIEZUX0lOVEVHRVIJCTgKKyNkZWZpbmUgRlRfU0lHTkVEX0lOVEVHRVIJOQorI2RlZmluZSBGVF9VTlNJR05FRF9JTlRFR0VSCTEwCisjZGVmaW5lIEZUX0xPTkcJCQkxMQorI2RlZmluZSBGVF9TSUdORURfTE9ORwkJMTIKKyNkZWZpbmUgRlRfVU5TSUdORURfTE9ORwkxMworI2RlZmluZSBGVF9MT05HX0xPTkcJCTE0CisjZGVmaW5lIEZUX1NJR05FRF9MT05HX0xPTkcJMTUKKyNkZWZpbmUgRlRfVU5TSUdORURfTE9OR19MT05HCTE2CisjZGVmaW5lIEZUX0ZMT0FUCQkxNworI2RlZmluZSBGVF9EQkxfUFJFQ19GTE9BVAkxOAorI2RlZmluZSBGVF9FWFRfUFJFQ19GTE9BVAkxOQorI2RlZmluZSBGVF9DT01QTEVYCQkyMAorI2RlZmluZSBGVF9EQkxfUFJFQ19DT01QTEVYCTIxCisjZGVmaW5lIEZUX0VYVF9QUkVDX0NPTVBMRVgJMjIKKyNkZWZpbmUgRlRfU1RSSU5HCQkyMworI2RlZmluZSBGVF9GSVhFRF9ERUNJTUFMCTI0CisjZGVmaW5lIEZUX0ZMT0FUX0RFQ0lNQUwJMjUKKyNkZWZpbmUgRlRfQllURQkJCTI2CisjZGVmaW5lIEZUX1VOU0lHTkVEX0JZVEUJMjcKKyNkZWZpbmUgRlRfVEVNUExBVEVfQVJHCQkyOAorCisjZGVmaW5lIEZUX05VTV9NRU1CRVJTCQkyOQkvKiBIaWdoZXN0IEZUXyogYWJvdmUsIHBsdXMgb25lLiAqLworCisvKiBTb21lIG1hY3JvcyBmb3IgY2hhci1iYXNlZCBiaXRmaWVsZHMuICAqLworCisjZGVmaW5lIEJfU0VUKGEseCkJKChhKVsoeCk+PjNdIHw9ICgxIDw8ICgoeCkmNykpKQorI2RlZmluZSBCX0NMUihhLHgpCSgoYSlbKHgpPj4zXSAmPSB+KDEgPDwgKCh4KSY3KSkpCisjZGVmaW5lIEJfVFNUKGEseCkJKChhKVsoeCk+PjNdICYgKDEgPDwgKCh4KSY3KSkpCisjZGVmaW5lIEJfVFlQRQkJdW5zaWduZWQgY2hhcgorI2RlZmluZQlCX0JZVEVTKHgpCSggMSArICgoeCk+PjMpICkKKyNkZWZpbmUJQl9DTFJBTEwoYSx4KQltZW1zZXQgKChhKSwgMCwgQl9CWVRFUyh4KSkKKworLyogRGlmZmVyZW50IGtpbmRzIG9mIGRhdGEgdHlwZXMgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIGBjb2RlJyBmaWVsZC4gICovCisKK2VudW0gdHlwZV9jb2RlCit7CisgIFRZUEVfQ09ERV9VTkRFRiwJCS8qIE5vdCB1c2VkOyBjYXRjaGVzIGVycm9ycyAqLworICBUWVBFX0NPREVfUFRSLAkJLyogUG9pbnRlciB0eXBlICovCisgIFRZUEVfQ09ERV9BUlJBWSwJCS8qIEFycmF5IHR5cGUgd2l0aCBsb3dlciAmIHVwcGVyIGJvdW5kcy4gKi8KKyAgVFlQRV9DT0RFX1NUUlVDVCwJCS8qIEMgc3RydWN0IG9yIFBhc2NhbCByZWNvcmQgKi8KKyAgVFlQRV9DT0RFX1VOSU9OLAkJLyogQyB1bmlvbiBvciBQYXNjYWwgdmFyaWFudCBwYXJ0ICovCisgIFRZUEVfQ09ERV9FTlVNLAkJLyogRW51bWVyYXRpb24gdHlwZSAqLworICBUWVBFX0NPREVfRlVOQywJCS8qIEZ1bmN0aW9uIHR5cGUgKi8KKyAgVFlQRV9DT0RFX0lOVCwJCS8qIEludGVnZXIgdHlwZSAqLworCisgIC8qIEZsb2F0aW5nIHR5cGUuICBUaGlzIGlzICpOT1QqIGEgY29tcGxleCB0eXBlLiAgQmV3YXJlLCB0aGVyZSBhcmUgcGFydHMKKyAgICAgb2YgR0RCIHdoaWNoIGJvZ3VzbHkgYXNzdW1lIHRoYXQgVFlQRV9DT0RFX0ZMVCBjYW4gbWVhbiBjb21wbGV4LiAgKi8KKyAgVFlQRV9DT0RFX0ZMVCwKKworICAvKiBWb2lkIHR5cGUuICBUaGUgbGVuZ3RoIGZpZWxkIHNwZWNpZmllcyB0aGUgbGVuZ3RoIChwcm9iYWJseSBhbHdheXMKKyAgICAgb25lKSB3aGljaCBpcyB1c2VkIGluIHBvaW50ZXIgYXJpdGhtZXRpYyBpbnZvbHZpbmcgcG9pbnRlcnMgdG8KKyAgICAgdGhpcyB0eXBlLCBidXQgYWN0dWFsbHkgZGVyZWZlcmVuY2luZyBzdWNoIGEgcG9pbnRlciBpcyBpbnZhbGlkOworICAgICBhIHZvaWQgdHlwZSBoYXMgbm8gbGVuZ3RoIGFuZCBubyBhY3R1YWwgcmVwcmVzZW50YXRpb24gaW4gbWVtb3J5CisgICAgIG9yIHJlZ2lzdGVycy4gIEEgcG9pbnRlciB0byBhIHZvaWQgdHlwZSBpcyBhIGdlbmVyaWMgcG9pbnRlci4gICovCisgIFRZUEVfQ09ERV9WT0lELAorCisgIFRZUEVfQ09ERV9TRVQsCQkvKiBQYXNjYWwgc2V0cyAqLworICBUWVBFX0NPREVfUkFOR0UsCQkvKiBSYW5nZSAoaW50ZWdlcnMgd2l0aGluIHNwZWMnZCBib3VuZHMpICovCisKKyAgLyogQSBzdHJpbmcgdHlwZSB3aGljaCBpcyBsaWtlIGFuIGFycmF5IG9mIGNoYXJhY3RlciBidXQgcHJpbnRzCisgICAgIGRpZmZlcmVudGx5IChhdCBsZWFzdCBmb3IgQ0hJTEwpLiAgSXQgZG9lcyBub3QgY29udGFpbiBhIGxlbmd0aAorICAgICBmaWVsZCBhcyBQYXNjYWwgc3RyaW5ncyAoZm9yIG1hbnkgUGFzY2FscywgYW55d2F5KSBkbzsgaWYgd2Ugd2FudAorICAgICB0byBkZWFsIHdpdGggc3VjaCBzdHJpbmdzLCB3ZSBzaG91bGQgdXNlIGEgbmV3IHR5cGUgY29kZS4gICovCisgIFRZUEVfQ09ERV9TVFJJTkcsCisKKyAgLyogU3RyaW5nIG9mIGJpdHM7IGxpa2UgVFlQRV9DT0RFX1NFVCBidXQgcHJpbnRzIGRpZmZlcmVudGx5IChhdCBsZWFzdAorICAgICBmb3IgQ0hJTEwpLiAgKi8KKyAgVFlQRV9DT0RFX0JJVFNUUklORywKKworICAvKiBVbmtub3duIHR5cGUuICBUaGUgbGVuZ3RoIGZpZWxkIGlzIHZhbGlkIGlmIHdlIHdlcmUgYWJsZSB0bworICAgICBkZWR1Y2UgdGhhdCBtdWNoIGFib3V0IHRoZSB0eXBlLCBvciAwIGlmIHdlIGRvbid0IGV2ZW4ga25vdyB0aGF0LiAgKi8KKyAgVFlQRV9DT0RFX0VSUk9SLAorCisgIC8qIEMrKyAqLworICBUWVBFX0NPREVfTUVNQkVSLAkJLyogTWVtYmVyIHR5cGUgKi8KKyAgVFlQRV9DT0RFX01FVEhPRCwJCS8qIE1ldGhvZCB0eXBlICovCisgIFRZUEVfQ09ERV9SRUYsCQkvKiBDKysgUmVmZXJlbmNlIHR5cGVzICovCisKKyAgVFlQRV9DT0RFX0NIQVIsCQkvKiAqcmVhbCogY2hhcmFjdGVyIHR5cGUgKi8KKworICAvKiBCb29sZWFuIHR5cGUuICAwIGlzIGZhbHNlLCAxIGlzIHRydWUsIGFuZCBvdGhlciB2YWx1ZXMgYXJlIG5vbi1ib29sZWFuCisgICAgIChlLmcuIEZPUlRSQU4gImxvZ2ljYWwiIHVzZWQgYXMgdW5zaWduZWQgaW50KS4gICovCisgIFRZUEVfQ09ERV9CT09MLAorCisgIC8qIEZvcnRyYW4gKi8KKyAgVFlQRV9DT0RFX0NPTVBMRVgsCQkvKiBDb21wbGV4IGZsb2F0ICovCisKKyAgVFlQRV9DT0RFX1RZUEVERUYsCisgIFRZUEVfQ09ERV9URU1QTEFURSwJCS8qIEMrKyB0ZW1wbGF0ZSAqLworICBUWVBFX0NPREVfVEVNUExBVEVfQVJHCS8qIEMrKyB0ZW1wbGF0ZSBhcmcgKi8KKworfTsKKworLyogRm9yIG5vdyBhbGxvdyBzb3VyY2UgdG8gdXNlIFRZUEVfQ09ERV9DTEFTUyBmb3IgQysrIGNsYXNzZXMsIGFzIGFuCisgICBhbGlhcyBmb3IgVFlQRV9DT0RFX1NUUlVDVC4gIFRoaXMgaXMgZm9yIERXQVJGLCB3aGljaCBoYXMgYSBkaXN0aW5jdAorICAgImNsYXNzIiBhdHRyaWJ1dGUuICBQZXJoYXBzIHdlIHNob3VsZCBhY3R1YWxseSBoYXZlIGEgc2VwYXJhdGUgVFlQRV9DT0RFCisgICBzbyB0aGF0IHdlIGNhbiBwcmludCAiY2xhc3MiIG9yICJzdHJ1Y3QiIGRlcGVuZGluZyBvbiB3aGF0IHRoZSBkZWJ1ZworICAgaW5mbyBzYWlkLiAgSXQncyBub3QgY2xlYXIgd2Ugc2hvdWxkIGJvdGhlci4gICovCisKKyNkZWZpbmUgVFlQRV9DT0RFX0NMQVNTIFRZUEVfQ09ERV9TVFJVQ1QKKworLyogU29tZSBiaXRzIGZvciB0aGUgdHlwZSdzIGZsYWdzIHdvcmQuICovCisKKy8qIFVuc2lnbmVkIGludGVnZXIgdHlwZS4gIElmIHRoaXMgaXMgbm90IHNldCBmb3IgYSBUWVBFX0NPREVfSU5ULCB0aGUKKyAgIHR5cGUgaXMgc2lnbmVkICh1bmxlc3MgVFlQRV9GTEFHX05PU0lHTiAoYmVsb3cpIGlzIHNldCkuICovCisKKyNkZWZpbmUgVFlQRV9GTEFHX1VOU0lHTkVECSgxIDw8IDApCisKKy8qIE5vIHNpZ24gZm9yIHRoaXMgdHlwZS4gIEluIEMrKywgImNoYXIiLCAic2lnbmVkIGNoYXIiLCBhbmQgInVuc2lnbmVkCisgICBjaGFyIiBhcmUgZGlzdGluY3QgdHlwZXM7IHNvIHdlIG5lZWQgYW4gZXh0cmEgZmxhZyB0byBpbmRpY2F0ZSB0aGUKKyAgIGFic2VuY2Ugb2ZhIHNpZ24hICovCisKKyNkZWZpbmUgVFlQRV9GTEFHX05PU0lHTgkoMSA8PCAxKQorCisvKiBUaGlzIGFwcGVhcnMgaW4gYSB0eXBlJ3MgZmxhZ3Mgd29yZCBpZiBpdCBpcyBhIHN0dWIgdHlwZSAoZS5nLiwgaWYKKyAgIHNvbWVvbmUgcmVmZXJlbmNlZCBhIHR5cGUgdGhhdCB3YXNuJ3QgZGVmaW5lZCBpbiBhIHNvdXJjZSBmaWxlCisgICB2aWEgKHN0cnVjdCBzaXJfbm90X2FwcGVhcmluZ19pbl90aGlzX2ZpbG0gKikpLiAgKi8KKworI2RlZmluZSBUWVBFX0ZMQUdfU1RVQgkJKDEgPDwgMikKKworLyogVGhlIHRhcmdldCB0eXBlIG9mIHRoaXMgdHlwZSBpcyBhIHN0dWIgdHlwZSwgYW5kIHRoaXMgdHlwZSBuZWVkcyB0bworICAgYmUgdXBkYXRlZCBpZiBpdCBnZXRzIHVuLXN0dWJiZWQgaW4gY2hlY2tfdHlwZWRlZi4KKyAgIFVzZWQgZm9yIGFycmF5cyBhbmQgcmFuZ2VzLCBpbiB3aGljaCBUWVBFX0xFTkdUSCBvZiB0aGUgYXJyYXkvcmFuZ2UKKyAgIGdldHMgc2V0IGJhc2VkIG9uIHRoZSBUWVBFX0xFTkdUSCBvZiB0aGUgdGFyZ2V0IHR5cGUuCisgICBBbHNvLCBzZXQgZm9yIFRZUEVfQ09ERV9UWVBFREVGLiAqLworCisjZGVmaW5lIFRZUEVfRkxBR19UQVJHRVRfU1RVQiAoMSA8PCAzKQorCisvKiBTdGF0aWMgdHlwZS4gIElmIHRoaXMgaXMgc2V0LCB0aGUgY29ycmVzcG9uZGluZyB0eXBlIGhhZCAKKyAqIGEgc3RhdGljIG1vZGlmaWVyLgorICogTm90ZTogVGhpcyBtYXkgYmUgdW5uZWNlc3NhcnksIHNpbmNlIHN0YXRpYyBkYXRhIG1lbWJlcnMKKyAqIGFyZSBpbmRpY2F0ZWQgYnkgb3RoZXIgbWVhbnMgKGJpdHBvcyA9PSAtMSkKKyAqLworCisjZGVmaW5lIFRZUEVfRkxBR19TVEFUSUMgKDEgPDwgNCkKKworLyogQ29uc3RhbnQgdHlwZS4gIElmIHRoaXMgaXMgc2V0LCB0aGUgY29ycmVzcG9uZGluZyB0eXBlIGhhcyBhCisgKiBjb25zdCBtb2RpZmllci4KKyAqLworCisjZGVmaW5lIFRZUEVfRkxBR19DT05TVCAoMSA8PCA1KQorCisvKiBWb2xhdGlsZSB0eXBlLiAgSWYgdGhpcyBpcyBzZXQsIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUgaGFzIGEKKyAqIHZvbGF0aWxlIG1vZGlmaWVyLgorICovCisKKyNkZWZpbmUgVFlQRV9GTEFHX1ZPTEFUSUxFICgxIDw8IDYpCisKKworLyogVGhpcyBpcyBhIGZ1bmN0aW9uIHR5cGUgd2hpY2ggYXBwZWFycyB0byBoYXZlIGEgcHJvdG90eXBlLiAgV2UgbmVlZCB0aGlzCisgICBmb3IgZnVuY3Rpb24gY2FsbHMgaW4gb3JkZXIgdG8gdGVsbCB1cyBpZiBpdCdzIG5lY2Vzc2FyeSB0byBjb2VyY2UgdGhlIGFyZ3MsCisgICBvciB0byBqdXN0IGRvIHRoZSBzdGFuZGFyZCBjb252ZXJzaW9ucy4gIFRoaXMgaXMgdXNlZCB3aXRoIGEgc2hvcnQgZmllbGQuICovCisKKyNkZWZpbmUgVFlQRV9GTEFHX1BST1RPVFlQRUQgKDEgPDwgNykKKworLyogVGhpcyBmbGFnIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBwcm9jZXNzaW5nIGZvciB0aGlzIHR5cGUKKyAgIGlzIGluY29tcGxldGUuCisgCisgICAoTW9zdGx5IGludGVuZGVkIGZvciBIUCBwbGF0Zm9ybXMsIHdoZXJlIGNsYXNzIG1ldGhvZHMsIGZvcgorICAgaW5zdGFuY2UsIGNhbiBiZSBlbmNvdW50ZXJlZCBiZWZvcmUgdGhlaXIgY2xhc3NlcyBpbiB0aGUgZGVidWcKKyAgIGluZm87IHRoZSBpbmNvbXBsZXRlIHR5cGUgaGFzIHRvIGJlIG1hcmtlZCBzbyB0aGF0IHRoZSBjbGFzcyBhbmQKKyAgIHRoZSBtZXRob2QgY2FuIGJlIGFzc2lnbmVkIGNvcnJlY3QgdHlwZXMuKSAqLworCisjZGVmaW5lIFRZUEVfRkxBR19JTkNPTVBMRVRFICgxIDw8IDgpCisKKworc3RydWN0IHR5cGUKK3sKKworICAvKiBDb2RlIGZvciBraW5kIG9mIHR5cGUgKi8KKworICBlbnVtIHR5cGVfY29kZSBjb2RlOworCisgIC8qIE5hbWUgb2YgdGhpcyB0eXBlLCBvciBOVUxMIGlmIG5vbmUuCisKKyAgICAgVGhpcyBpcyB1c2VkIGZvciBwcmludGluZyBvbmx5LCBleGNlcHQgYnkgcG9vcmx5IGRlc2lnbmVkIEMrKyBjb2RlLgorICAgICBGb3IgbG9va2luZyB1cCBhIG5hbWUsIGxvb2sgZm9yIGEgc3ltYm9sIGluIHRoZSBWQVJfTkFNRVNQQUNFLiAgKi8KKworICBjaGFyICpuYW1lOworCisgIC8qIFRhZyBuYW1lIGZvciB0aGlzIHR5cGUsIG9yIE5VTEwgaWYgbm9uZS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUKKyAgICAgbmFtZSBvZiB0aGUgdHlwZSBjb25zaXN0cyBvZiBhIGtleXdvcmQgZm9sbG93ZWQgYnkgdGhlIHRhZyBuYW1lLgorICAgICBXaGljaCBrZXl3b3JkIGlzIGRldGVybWluZWQgYnkgdGhlIHR5cGUgY29kZSAoInN0cnVjdCIgZm9yCisgICAgIFRZUEVfQ09ERV9TVFJVQ1QsIGV0Yy4pLiAgQXMgZmFyIGFzIEkga25vdyBDL0MrKyBhcmUgdGhlIG9ubHkgbGFuZ3VhZ2VzCisgICAgIHdpdGggdGhpcyBmZWF0dXJlLgorCisgICAgIFRoaXMgaXMgdXNlZCBmb3IgcHJpbnRpbmcgb25seSwgZXhjZXB0IGJ5IHBvb3JseSBkZXNpZ25lZCBDKysgY29kZS4KKyAgICAgRm9yIGxvb2tpbmcgdXAgYSBuYW1lLCBsb29rIGZvciBhIHN5bWJvbCBpbiB0aGUgU1RSVUNUX05BTUVTUEFDRS4KKyAgICAgT25lIG1vcmUgbGVnaXRpbWF0ZSB1c2UgaXMgdGhhdCBpZiBUWVBFX0ZMQUdfU1RVQiBpcyBzZXQsIHRoaXMgaXMKKyAgICAgdGhlIG5hbWUgdG8gdXNlIHRvIGxvb2sgZm9yIGRlZmluaXRpb25zIGluIG90aGVyIGZpbGVzLiAgKi8KKworICBjaGFyICp0YWdfbmFtZTsKKworICAvKiBMZW5ndGggb2Ygc3RvcmFnZSBmb3IgYSB2YWx1ZSBvZiB0aGlzIHR5cGUuICBWYXJpb3VzIHBsYWNlcyBwYXNzCisgICAgIHRoaXMgdG8gbWVtY3B5IGFuZCBzdWNoLCBtZWFuaW5nIGl0IG11c3QgYmUgaW4gdW5pdHMgb2YKKyAgICAgSE9TVF9DSEFSX0JJVC4gIFZhcmlvdXMgb3RoZXIgcGxhY2VzIGV4cGVjdCB0aGV5IGNhbiBjYWxjdWxhdGUKKyAgICAgYWRkcmVzc2VzIGJ5IGFkZGluZyBpdCBhbmQgc3VjaCwgbWVhbmluZyBpdCBtdXN0IGJlIGluIHVuaXRzIG9mCisgICAgIFRBUkdFVF9DSEFSX0JJVC4gIEZvciBzb21lIERTUCB0YXJnZXRzLCBpbiB3aGljaCBIT1NUX0NIQVJfQklUCisgICAgIHdpbGwgKHByZXN1bWFibHkpIGJlIDggYW5kIFRBUkdFVF9DSEFSX0JJVCB3aWxsIGJlIChzYXkpIDMyLCB0aGlzCisgICAgIGlzIGEgcHJvYmxlbS4gIE9uZSBmaXggd291bGQgYmUgdG8gbWFrZSB0aGlzIGZpZWxkIGluIGJpdHMKKyAgICAgKHJlcXVpcmluZyB0aGF0IGl0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIEhPU1RfQ0hBUl9CSVQgYW5kCisgICAgIFRBUkdFVF9DSEFSX0JJVCktLXRoZSBvdGhlciBjaG9pY2Ugd291bGQgYmUgdG8gbWFrZSBpdAorICAgICBjb25zaXN0ZW50bHkgaW4gdW5pdHMgb2YgSE9TVF9DSEFSX0JJVC4gICovCisKKyAgdW5zaWduZWQgbGVuZ3RoOworCisgIC8qIEZJWE1FLCB0aGVzZSBzaG91bGQgcHJvYmFibHkgYmUgcmVzdHJpY3RlZCB0byBhIEZvcnRyYW4tc3BlY2lmaWMKKyAgICAgZmllbGQgaW4gc29tZSBmYXNoaW9uLiAgKi8KKyNkZWZpbmUgQk9VTkRfQ0FOTk9UX0JFX0RFVEVSTUlORUQgICA1CisjZGVmaW5lIEJPVU5EX0JZX1JFRl9PTl9TVEFDSyAgICAgICAgNAorI2RlZmluZSBCT1VORF9CWV9WQUxVRV9PTl9TVEFDSyAgICAgIDMKKyNkZWZpbmUgQk9VTkRfQllfUkVGX0lOX1JFRyAgICAgICAgICAyCisjZGVmaW5lIEJPVU5EX0JZX1ZBTFVFX0lOX1JFRyAgICAgICAgMQorI2RlZmluZSBCT1VORF9TSU1QTEUgICAgICAgICAgICAgICAgIDAKKyAgaW50IHVwcGVyX2JvdW5kX3R5cGU7CisgIGludCBsb3dlcl9ib3VuZF90eXBlOworCisgIC8qIEV2ZXJ5IHR5cGUgaXMgbm93IGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgb2JqZmlsZSwgYW5kIHRoZQorICAgICB0eXBlIGlzIGFsbG9jYXRlZCBvbiB0aGUgdHlwZV9vYnN0YWNrIGZvciB0aGF0IG9iamZpbGUuICBPbmUgcHJvYmxlbQorICAgICBob3dldmVyLCBpcyB0aGF0IHRoZXJlIGFyZSB0aW1lcyB3aGVuIGdkYiBhbGxvY2F0ZXMgbmV3IHR5cGVzIHdoaWxlCisgICAgIGl0IGlzIG5vdCBpbiB0aGUgcHJvY2VzcyBvZiByZWFkaW5nIHN5bWJvbHMgZnJvbSBhIHBhcnRpY3VsYXIgb2JqZmlsZS4KKyAgICAgRm9ydHVuYXRlbHksIHRoZXNlIGhhcHBlbiB3aGVuIHRoZSB0eXBlIGJlaW5nIGNyZWF0ZWQgaXMgYSBkZXJpdmVkCisgICAgIHR5cGUgb2YgYW4gZXhpc3RpbmcgdHlwZSwgc3VjaCBhcyBpbiBsb29rdXBfcG9pbnRlcl90eXBlKCkuICBTbworICAgICB3ZSBjYW4ganVzdCBhbGxvY2F0ZSB0aGUgbmV3IHR5cGUgdXNpbmcgdGhlIHNhbWUgb2JqZmlsZSBhcyB0aGUKKyAgICAgZXhpc3RpbmcgdHlwZSwgYnV0IHRvIGRvIHRoaXMgd2UgbmVlZCBhIGJhY2twb2ludGVyIHRvIHRoZSBvYmpmaWxlCisgICAgIGZyb20gdGhlIGV4aXN0aW5nIHR5cGUuICBZZXMgdGhpcyBpcyBzb21ld2hhdCB1Z2x5LCBidXQgd2l0aG91dAorICAgICBtYWpvciBvdmVyaGF1bCBvZiB0aGUgaW50ZXJuYWwgdHlwZSBzeXN0ZW0sIGl0IGNhbid0IGJlIGF2b2lkZWQKKyAgICAgZm9yIG5vdy4gKi8KKworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKworICAvKiBGb3IgYSBwb2ludGVyIHR5cGUsIGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBvYmplY3QgcG9pbnRlZCB0by4KKyAgICAgRm9yIGFuIGFycmF5IHR5cGUsIGRlc2NyaWJlcyB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudHMuCisgICAgIEZvciBhIGZ1bmN0aW9uIG9yIG1ldGhvZCB0eXBlLCBkZXNjcmliZXMgdGhlIHR5cGUgb2YgdGhlIHJldHVybiB2YWx1ZS4KKyAgICAgRm9yIGEgcmFuZ2UgdHlwZSwgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIHRoZSBmdWxsIHJhbmdlLgorICAgICBGb3IgYSBjb21wbGV4IHR5cGUsIGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBlYWNoIGNvb3JkaW5hdGUuCisgICAgIFVudXNlZCBvdGhlcndpc2UuICAqLworCisgIHN0cnVjdCB0eXBlICp0YXJnZXRfdHlwZTsKKworICAvKiBUeXBlIHRoYXQgaXMgYSBwb2ludGVyIHRvIHRoaXMgdHlwZS4KKyAgICAgTlVMTCBpZiBubyBzdWNoIHBvaW50ZXItdG8gdHlwZSBpcyBrbm93biB5ZXQuCisgICAgIFRoZSBkZWJ1Z2dlciBtYXkgYWRkIHRoZSBhZGRyZXNzIG9mIHN1Y2ggYSB0eXBlCisgICAgIGlmIGl0IGhhcyB0byBjb25zdHJ1Y3Qgb25lIGxhdGVyLiAgKi8gCisKKyAgc3RydWN0IHR5cGUgKnBvaW50ZXJfdHlwZTsKKworICAvKiBDKys6IGFsc28gbmVlZCBhIHJlZmVyZW5jZSB0eXBlLiAgKi8KKworICBzdHJ1Y3QgdHlwZSAqcmVmZXJlbmNlX3R5cGU7CisKKyAgLyogQy12IHZhcmlhbnQgY2hhaW4uIFRoaXMgcG9pbnRzIHRvIGEgdHlwZSB0aGF0CisgICAgIGRpZmZlcnMgZnJvbSB0aGlzIG9uZSBvbmx5IGluIGEgY29uc3Qgb3Igdm9sYXRpbGUKKyAgICAgYXR0cmlidXRlIChvciBib3RoKS4gVGhlIHZhcmlvdXMgYy12IHZhcmlhbnRzCisgICAgIGFyZSBjaGFpbmVkIHRvZ2V0aGVyIGluIGEgcmluZy4gKi8KKyAgc3RydWN0IHR5cGUgKmN2X3R5cGU7CisKKyAgLyogRmxhZ3MgYWJvdXQgdGhpcyB0eXBlLiAgKi8KKworICBpbnQgZmxhZ3M7CisKKyAgLyogTnVtYmVyIG9mIGZpZWxkcyBkZXNjcmliZWQgZm9yIHRoaXMgdHlwZSAqLworCisgIHNob3J0IG5maWVsZHM7CisKKyAgLyogRm9yIHN0cnVjdHVyZSBhbmQgdW5pb24gdHlwZXMsIGEgZGVzY3JpcHRpb24gb2YgZWFjaCBmaWVsZC4KKyAgICAgRm9yIHNldCBhbmQgcGFzY2FsIGFycmF5IHR5cGVzLCB0aGVyZSBpcyBvbmUgImZpZWxkIiwKKyAgICAgd2hvc2UgdHlwZSBpcyB0aGUgZG9tYWluIHR5cGUgb2YgdGhlIHNldCBvciBhcnJheS4KKyAgICAgRm9yIHJhbmdlIHR5cGVzLCB0aGVyZSBhcmUgdHdvICJmaWVsZHMiLAorICAgICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgKGJvdGggaW5jbHVzaXZlKS4KKyAgICAgRm9yIGVudW0gdHlwZXMsIGVhY2ggcG9zc2libGUgdmFsdWUgaXMgZGVzY3JpYmVkIGJ5IG9uZSAiZmllbGQiLgorICAgICBGb3IgYSBmdW5jdGlvbiB0eXBlLCBhICJmaWVsZCIgZm9yIGVhY2ggcGFyYW1ldGVyIHR5cGUuCisgICAgIEZvciBDKysgY2xhc3NlcywgdGhlcmUgaXMgb25lIGZpZWxkIGZvciBlYWNoIGJhc2UgY2xhc3MgKGlmIGl0IGlzCisgICAgIGEgZGVyaXZlZCBjbGFzcykgcGx1cyBvbmUgZmllbGQgZm9yIGVhY2ggY2xhc3MgZGF0YSBtZW1iZXIuICBNZW1iZXIKKyAgICAgZnVuY3Rpb25zIGFyZSByZWNvcmRlZCBlbHNld2hlcmUuCisKKyAgICAgVXNpbmcgYSBwb2ludGVyIHRvIGEgc2VwYXJhdGUgYXJyYXkgb2YgZmllbGRzCisgICAgIGFsbG93cyBhbGwgdHlwZXMgdG8gaGF2ZSB0aGUgc2FtZSBzaXplLCB3aGljaCBpcyB1c2VmdWwKKyAgICAgYmVjYXVzZSB3ZSBjYW4gYWxsb2NhdGUgdGhlIHNwYWNlIGZvciBhIHR5cGUgYmVmb3JlCisgICAgIHdlIGtub3cgd2hhdCB0byBwdXQgaW4gaXQuICAqLworCisgIHN0cnVjdCBmaWVsZAorICAgIHsKKworCisKKyAgICAgIHVuaW9uIGZpZWxkX2xvY2F0aW9uCisgICAgICAgIHsKKwkgIC8qIFBvc2l0aW9uIG9mIHRoaXMgZmllbGQsIGNvdW50aW5nIGluIGJpdHMgZnJvbSBzdGFydCBvZgorCSAgICAgY29udGFpbmluZyBzdHJ1Y3R1cmUuCisJICAgICBGb3IgQklUU19CSUdfRU5ESUFOPTEgdGFyZ2V0cywgaXQgaXMgdGhlIGJpdCBvZmZzZXQgdG8gdGhlIE1TQi4KKwkgICAgIEZvciBCSVRTX0JJR19FTkRJQU49MCB0YXJnZXRzLCBpdCBpcyB0aGUgYml0IG9mZnNldCB0byB0aGUgTFNCLgorCSAgICAgRm9yIGEgZnVuY3Rpb24gdHlwZSwgdGhpcyBpcyB0aGUgcG9zaXRpb24gaW4gdGhlIGFyZ3VtZW50IGxpc3QKKwkgICAgIG9mIHRoaXMgYXJndW1lbnQuCisJICAgICBGb3IgYSByYW5nZSBib3VuZCBvciBlbnVtIHZhbHVlLCB0aGlzIGlzIHRoZSB2YWx1ZSBpdHNlbGYuICovCisKKwkgIGludCBiaXRwb3M7CisKKwkgIC8qIEZvciBhIHN0YXRpYyBmaWVsZCwgaWYgVFlQRV9GSUVMRF9TVEFUSUNfSEFTX0FERFIgdGhlbiBwaHlzYWRkcgorCSAgICAgaXMgdGhlIGxvY2F0aW9uIChpbiB0aGUgdGFyZ2V0KSBvZiB0aGUgc3RhdGljIGZpZWxkLgorCSAgICAgT3RoZXJ3aXNlLCBwaHlzbmFtZSBpcyB0aGUgbWFuZ2xlZCBsYWJlbCBvZiB0aGUgc3RhdGljIGZpZWxkLiAqLworCisJICBDT1JFX0FERFIgcGh5c2FkZHI7CisJICBjaGFyKiBwaHlzbmFtZTsKKyAgICAgIH0gbG9jOworCisgICAgICAvKiBTaXplIG9mIHRoaXMgZmllbGQsIGluIGJpdHMsIG9yIHplcm8gaWYgbm90IHBhY2tlZC4KKwkgRm9yIGFuIHVucGFja2VkIGZpZWxkLCB0aGUgZmllbGQncyB0eXBlJ3MgbGVuZ3RoCisJIHNheXMgaG93IG1hbnkgYnl0ZXMgdGhlIGZpZWxkIG9jY3VwaWVzLgorCSBBIHZhbHVlIG9mIC0xIG9yIC0yIGluZGljYXRlcyBhIHN0YXRpYyBmaWVsZDsgIC0xIG1lYW5zIHRoZSBsb2NhdGlvbgorCSBpcyBzcGVjaWZpZWQgYnkgdGhlIGxhYmVsIGxvYy5waHlzbmFtZTsgIC0yIG1lYW5zIHRoYXQgbG9jLnBoeXNhZGRyCisJIHNwZWNpZmllcyB0aGUgYWN0dWFsIGFkZHJlc3MuICovCisKKyAgICAgIGludCBiaXRzaXplOworCisgICAgICAvKiBJbiBhIHN0cnVjdCBvciB1bmlvbiB0eXBlLCB0eXBlIG9mIHRoaXMgZmllbGQuCisJIEluIGEgZnVuY3Rpb24gdHlwZSwgdHlwZSBvZiB0aGlzIGFyZ3VtZW50LgorCSBJbiBhbiBhcnJheSB0eXBlLCB0aGUgZG9tYWluLXR5cGUgb2YgdGhlIGFycmF5LiAgKi8KKworICAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisKKyAgICAgIC8qIE5hbWUgb2YgZmllbGQsIHZhbHVlIG9yIGFyZ3VtZW50LgorCSBOVUxMIGZvciByYW5nZSBib3VuZHMgYW5kIGFycmF5IGRvbWFpbnMuICAqLworCisgICAgICBjaGFyICpuYW1lOworCisgICAgfSAqZmllbGRzOworCisgIC8qIEZvciB0eXBlcyB3aXRoIHZpcnR1YWwgZnVuY3Rpb25zIChUWVBFX0NPREVfU1RSVUNUKSwgVlBUUl9CQVNFVFlQRQorICAgICBpcyB0aGUgYmFzZSBjbGFzcyB3aGljaCBkZWZpbmVkIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIHBvaW50ZXIuICAKKworICAgICBGb3IgdHlwZXMgdGhhdCBhcmUgcG9pbnRlciB0byBtZW1iZXIgdHlwZXMgKFRZUEVfQ09ERV9NRU1CRVIpLAorICAgICBWUFRSX0JBU0VUWVBFIGlzIHRoZSB0eXBlIHRoYXQgdGhpcyBwb2ludGVyIGlzIGEgbWVtYmVyIG9mLgorCisgICAgIEZvciBtZXRob2QgdHlwZXMgKFRZUEVfQ09ERV9NRVRIT0QpLCBWUFRSX0JBU0VUWVBFIGlzIHRoZSBhZ2dyZWdhdGUKKyAgICAgdHlwZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXRob2QuCisKKyAgICAgVW51c2VkIG90aGVyd2lzZS4gICovCisKKyAgc3RydWN0IHR5cGUgKnZwdHJfYmFzZXR5cGU7CisKKyAgLyogRmllbGQgbnVtYmVyIG9mIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIHBvaW50ZXIgaW4KKyAgICAgVlBUUl9CQVNFVFlQRS4gIElmIC0xLCB3ZSB3ZXJlIHVuYWJsZSB0byBmaW5kIHRoZSB2aXJ0dWFsCisgICAgIGZ1bmN0aW9uIHRhYmxlIHBvaW50ZXIgaW4gaW5pdGlhbCBzeW1ib2wgcmVhZGluZywgYW5kCisgICAgIGZpbGxfaW5fdnB0cl9maWVsZG5vIHNob3VsZCBiZSBjYWxsZWQgdG8gZmluZCBpdCBpZiBwb3NzaWJsZS4KKworICAgICBVbnVzZWQgaWYgdGhpcyB0eXBlIGRvZXMgbm90IGhhdmUgdmlydHVhbCBmdW5jdGlvbnMuICAqLworCisgIGludCB2cHRyX2ZpZWxkbm87CisKKyAgLyogU2xvdCB0byBwb2ludCB0byBhZGRpdGlvbmFsIGxhbmd1YWdlLXNwZWNpZmljIGZpZWxkcyBvZiB0aGlzIHR5cGUuICAqLworCisgIHVuaW9uIHR5cGVfc3BlY2lmaWMKKyAgICB7CisKKyAgICAgIC8qIEFSR19UWVBFUyBpcyBmb3IgVFlQRV9DT0RFX01FVEhPRC4KKwkgQ29udGFpbnMgdGhlIHR5cGUgb2YgZWFjaCBhcmd1bWVudCwgZW5kaW5nIHdpdGggYSB2b2lkIHR5cGUKKwkgYWZ0ZXIgdGhlIGxhc3QgYXJndW1lbnQgZm9yIG5vcm1hbCBtZW1iZXIgZnVuY3Rpb25zIG9yIGEgTlVMTAorCSBwb2ludGVyIGFmdGVyIHRoZSBsYXN0IGFyZ3VtZW50IGZvciBmdW5jdGlvbnMgd2l0aCB2YXJpYWJsZQorCSBhcmd1bWVudHMuICAqLworCisgICAgICBzdHJ1Y3QgdHlwZSAqKmFyZ190eXBlczsKKworICAgICAgLyogQ1BMVVNfU1RVRkYgaXMgZm9yIFRZUEVfQ09ERV9TVFJVQ1QuICBJdCBpcyBpbml0aWFsaXplZCB0byBwb2ludCB0bworCSBjcGx1c19zdHJ1Y3RfZGVmYXVsdCwgYSBkZWZhdWx0IHN0YXRpYyBpbnN0YW5jZSBvZiBhIHN0cnVjdAorCSBjcGx1c19zdHJ1Y3RfdHlwZS4gKi8KKworICAgICAgc3RydWN0IGNwbHVzX3N0cnVjdF90eXBlICpjcGx1c19zdHVmZjsKKworICAgIH0gdHlwZV9zcGVjaWZpYzsKK307CisKKyNkZWZpbmUJTlVMTF9UWVBFICgoc3RydWN0IHR5cGUgKikgMCkKKworLyogQysrIGxhbmd1YWdlLXNwZWNpZmljIGluZm9ybWF0aW9uIGZvciBUWVBFX0NPREVfU1RSVUNUIGFuZCBUWVBFX0NPREVfVU5JT04KKyAgIG5vZGVzLiAgKi8KKworc3RydWN0IGNwbHVzX3N0cnVjdF90eXBlCit7CisgIC8qIE51bWJlciBvZiBiYXNlIGNsYXNzZXMgdGhpcyB0eXBlIGRlcml2ZXMgZnJvbS4gIFRoZSBiYXNlY2xhc3NlcyBhcmUKKyAgICAgc3RvcmVkIGluIHRoZSBmaXJzdCBOX0JBU0VDTEFTU0VTIGZpZWxkcyAoaS5lLiB0aGUgYGZpZWxkcycgZmllbGQgb2YKKyAgICAgdGhlIHN0cnVjdCB0eXBlKS4gIEkgdGhpbmsgb25seSB0aGUgYHR5cGUnIGZpZWxkIG9mIHN1Y2ggYSBmaWVsZCBoYXMKKyAgICAgYW55IG1lYW5pbmcuICAqLworCisgIHNob3J0IG5fYmFzZWNsYXNzZXM7CisKKyAgLyogTnVtYmVyIG9mIG1ldGhvZHMgd2l0aCB1bmlxdWUgbmFtZXMuICBBbGwgb3ZlcmxvYWRlZCBtZXRob2RzIHdpdGgKKyAgICAgdGhlIHNhbWUgbmFtZSBjb3VudCBvbmx5IG9uY2UuICovCisKKyAgc2hvcnQgbmZuX2ZpZWxkczsKKworICAvKiBOdW1iZXIgb2YgbWV0aG9kcyBkZXNjcmliZWQgZm9yIHRoaXMgdHlwZSwgbm90IGluY2x1ZGluZyB0aGUKKyAgICAgbWV0aG9kcyB0aGF0IGl0IGRlcml2ZXMgZnJvbS4gICovCisKKyAgc2hvcnQgbmZuX2ZpZWxkc190b3RhbDsKKworICAvKiBUaGUgImRlY2xhcmVkX3R5cGUiIGZpZWxkIGNvbnRhaW5zIGEgY29kZSBzYXlpbmcgaG93IHRoZQorICAgICB1c2VyIHJlYWxseSBkZWNsYXJlZCB0aGlzIHR5cGUsIGUuZy4sICJjbGFzcyBzIiwgInVuaW9uIHMiLAorICAgICAic3RydWN0IHMiLgorICAgICBUaGUgMyBhYm92ZSB0aGluZ3MgY29tZSBvdXQgZnJvbSB0aGUgQysrIGNvbXBpbGVyIGxvb2tpbmcgbGlrZSBjbGFzc2VzLCAKKyAgICAgYnV0IHdlIGtlZXAgdHJhY2sgb2YgdGhlIHJlYWwgZGVjbGFyYXRpb24gc28gd2UgY2FuIGdpdmUKKyAgICAgdGhlIGNvcnJlY3QgaW5mb3JtYXRpb24gb24gInB0eXBlIi4gKE5vdGU6IFRFTVBMQVRFIG1heSBub3QKKyAgICAgYmVsb25nIGluIHRoaXMgbGlzdC4uLikgICovCisKKyNkZWZpbmUgREVDTEFSRURfVFlQRV9DTEFTUyAwCisjZGVmaW5lIERFQ0xBUkVEX1RZUEVfVU5JT04gMQorI2RlZmluZSBERUNMQVJFRF9UWVBFX1NUUlVDVCAyCisjZGVmaW5lIERFQ0xBUkVEX1RZUEVfVEVNUExBVEUgMworICBzaG9ydCBkZWNsYXJlZF90eXBlOyAvKiBPbmUgb2YgdGhlIGFib3ZlIGNvZGVzICovCisgCisgIC8qIEZvciBkZXJpdmVkIGNsYXNzZXMsIHRoZSBudW1iZXIgb2YgYmFzZSBjbGFzc2VzIGlzIGdpdmVuIGJ5IG5fYmFzZWNsYXNzZXMKKyAgICAgYW5kIHZpcnR1YWxfZmllbGRfYml0cyBpcyBhIGJpdCB2ZWN0b3IgY29udGFpbmluZyBvbmUgYml0IHBlciBiYXNlIGNsYXNzLgorICAgICBJZiB0aGUgYmFzZSBjbGFzcyBpcyB2aXJ0dWFsLCB0aGUgY29ycmVzcG9uZGluZyBiaXQgd2lsbCBiZSBzZXQuCisgICAgIEkuRSwgZ2l2ZW46CisKKwljbGFzcyBBe307CisJY2xhc3MgQnt9OworCWNsYXNzIEMgOiBwdWJsaWMgQiwgcHVibGljIHZpcnR1YWwgQSB7fTsKKworICAgICBCIGlzIGEgYmFzZWNsYXNzIG9mIEM7IEEgaXMgYSB2aXJ0dWFsIGJhc2VjbGFzcyBmb3IgQy4KKyAgICAgVGhpcyBpcyBhIEMrKyAyLjAgbGFuZ3VhZ2UgZmVhdHVyZS4gKi8KKworICBCX1RZUEUgKnZpcnR1YWxfZmllbGRfYml0czsKKworICAvKiBGb3IgY2xhc3NlcyB3aXRoIHByaXZhdGUgZmllbGRzLCB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpcyBnaXZlbiBieQorICAgICBuZmllbGRzIGFuZCBwcml2YXRlX2ZpZWxkX2JpdHMgaXMgYSBiaXQgdmVjdG9yIGNvbnRhaW5pbmcgb25lIGJpdAorICAgICBwZXIgZmllbGQuCisgICAgIElmIHRoZSBmaWVsZCBpcyBwcml2YXRlLCB0aGUgY29ycmVzcG9uZGluZyBiaXQgd2lsbCBiZSBzZXQuICovCisKKyAgQl9UWVBFICpwcml2YXRlX2ZpZWxkX2JpdHM7CisKKyAgLyogRm9yIGNsYXNzZXMgd2l0aCBwcm90ZWN0ZWQgZmllbGRzLCB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpcyBnaXZlbiBieQorICAgICBuZmllbGRzIGFuZCBwcm90ZWN0ZWRfZmllbGRfYml0cyBpcyBhIGJpdCB2ZWN0b3IgY29udGFpbmluZyBvbmUgYml0CisgICAgIHBlciBmaWVsZC4KKyAgICAgSWYgdGhlIGZpZWxkIGlzIHByaXZhdGUsIHRoZSBjb3JyZXNwb25kaW5nIGJpdCB3aWxsIGJlIHNldC4gKi8KKworICBCX1RZUEUgKnByb3RlY3RlZF9maWVsZF9iaXRzOworCisgIC8qIGZvciBjbGFzc2VzIHdpdGggZmllbGRzIHRvIGJlIGlnbm9yZWQsIGVpdGhlciB0aGlzIGlzIG9wdGltaXplZCBvdXQKKyAgICAgb3IgdGhpcyBmaWVsZCBoYXMgbGVuZ3RoIDAgKi8KKworICBCX1RZUEUgKmlnbm9yZV9maWVsZF9iaXRzOworCisgIC8qIEZvciBjbGFzc2VzLCBzdHJ1Y3R1cmVzLCBhbmQgdW5pb25zLCBhIGRlc2NyaXB0aW9uIG9mIGVhY2ggZmllbGQsCisgICAgIHdoaWNoIGNvbnNpc3RzIG9mIGFuIG92ZXJsb2FkZWQgbmFtZSwgZm9sbG93ZWQgYnkgdGhlIHR5cGVzIG9mCisgICAgIGFyZ3VtZW50cyB0aGF0IHRoZSBtZXRob2QgZXhwZWN0cywgYW5kIHRoZW4gdGhlIG5hbWUgYWZ0ZXIgaXQKKyAgICAgaGFzIGJlZW4gcmVuYW1lZCB0byBtYWtlIGl0IGRpc3RpbmN0LgorCisgICAgIGZuX2ZpZWxkbGlzdHMgcG9pbnRzIHRvIGFuIGFycmF5IG9mIG5mbl9maWVsZHMgb2YgdGhlc2UuICovCisKKyAgc3RydWN0IGZuX2ZpZWxkbGlzdAorICAgIHsKKworICAgICAgLyogVGhlIG92ZXJsb2FkZWQgbmFtZS4gICovCisKKyAgICAgIGNoYXIgKm5hbWU7CisKKyAgICAgIC8qIFRoZSBudW1iZXIgb2YgbWV0aG9kcyB3aXRoIHRoaXMgbmFtZS4gICovCisKKyAgICAgIGludCBsZW5ndGg7CisKKyAgICAgIC8qIFRoZSBsaXN0IG9mIG1ldGhvZHMuICAqLworCisgICAgICBzdHJ1Y3QgZm5fZmllbGQKKwl7CisKKwkgIC8qIElmIGlzX3N0dWIgaXMgY2xlYXIsIHRoaXMgaXMgdGhlIG1hbmdsZWQgbmFtZSB3aGljaCB3ZSBjYW4KKwkgICAgIGxvb2sgdXAgdG8gZmluZCB0aGUgYWRkcmVzcyBvZiB0aGUgbWV0aG9kIChGSVhNRTogaXQgd291bGQKKwkgICAgIGJlIGNsZWFuZXIgdG8gaGF2ZSBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBzeW1ib2wgaGVyZQorCSAgICAgaW5zdGVhZCkuICAqLworCisJICAvKiBJZiBpc19zdHViIGlzIHNldCwgdGhpcyBpcyB0aGUgcG9ydGlvbiBvZiB0aGUgbWFuZ2xlZAorCSAgICAgbmFtZSB3aGljaCBzcGVjaWZpZXMgdGhlIGFyZ3VtZW50cy4gIEZvciBleGFtcGxlLCAiaWkiLAorCSAgICAgaWYgdGhlcmUgYXJlIHR3byBpbnQgYXJndW1lbnRzLCBvciAiIiBpZiB0aGVyZSBhcmUgbm8KKwkgICAgIGFyZ3VtZW50cy4gIFNlZSBnZGJfbWFuZ2xlX25hbWUgZm9yIHRoZSBjb252ZXJzaW9uIGZyb20gdGhpcworCSAgICAgZm9ybWF0IHRvIHRoZSBvbmUgdXNlZCBpZiBpc19zdHViIGlzIGNsZWFyLiAgKi8KKworCSAgY2hhciAqcGh5c25hbWU7CisKKyAgICAgICAgICAvKiBUaGUgZnVuY3Rpb24gdHlwZSBmb3IgdGhlIG1ldGhvZC4KKyAgICAgICAgICAgICAoVGhpcyBjb21tZW50IHVzZWQgdG8gc2F5ICJUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBtZXRob2QiLAorICAgICAgICAgICAgIGJ1dCB0aGF0J3Mgd3JvbmcuIFRoZSBmdW5jdGlvbiB0eXBlIAorICAgICAgICAgICAgIGlzIGV4cGVjdGVkIGhlcmUsIGkuZS4gc29tZXRoaW5nIHdpdGggVFlQRV9DT0RFX0ZVTkMsCisgICAgICAgICAgICAgYW5kICpub3QqIHRoZSByZXR1cm4tdmFsdWUgdHlwZSkuICovCisKKwkgIHN0cnVjdCB0eXBlICp0eXBlOworCisJICAvKiBUaGUgYXJndW1lbnQgbGlzdC4gIE9ubHkgdmFsaWQgaWYgaXNfc3R1YiBpcyBjbGVhci4gIENvbnRhaW5zCisJICAgICB0aGUgdHlwZSBvZiBlYWNoIGFyZ3VtZW50LCBpbmNsdWRpbmcgYHRoaXMnLCBhbmQgZW5kaW5nIHdpdGgKKwkgICAgIGEgTlVMTCBwb2ludGVyIGFmdGVyIHRoZSBsYXN0IGFyZ3VtZW50LiAgU2hvdWxkIG5vdCBjb250YWluCisJICAgICBhIGB0aGlzJyBwb2ludGVyIGZvciBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucy4gICovCisKKwkgIHN0cnVjdCB0eXBlICoqYXJnczsKKworCSAgLyogRm9yIHZpcnR1YWwgZnVuY3Rpb25zLgorCSAgICAgRmlyc3QgYmFzZWNsYXNzIHRoYXQgZGVmaW5lcyB0aGlzIHZpcnR1YWwgZnVuY3Rpb24uICAgKi8KKworCSAgc3RydWN0IHR5cGUgKmZjb250ZXh0OworCisJICAvKiBBdHRyaWJ1dGVzLiAqLworCisJICB1bnNpZ25lZCBpbnQgaXNfY29uc3QgOiAxOworCSAgdW5zaWduZWQgaW50IGlzX3ZvbGF0aWxlIDogMTsKKwkgIHVuc2lnbmVkIGludCBpc19wcml2YXRlIDogMTsKKwkgIHVuc2lnbmVkIGludCBpc19wcm90ZWN0ZWQgOiAxOworCSAgdW5zaWduZWQgaW50IGlzX3B1YmxpYyA6IDE7CisJICB1bnNpZ25lZCBpbnQgaXNfYWJzdHJhY3QgOiAxOworCSAgdW5zaWduZWQgaW50IGlzX3N0YXRpYyA6IDE7CisJICB1bnNpZ25lZCBpbnQgaXNfZmluYWwgOiAxOworCSAgdW5zaWduZWQgaW50IGlzX3N5bmNocm9uaXplZCA6IDE7CisJICB1bnNpZ25lZCBpbnQgaXNfbmF0aXZlIDogMTsKKworCSAgLyogQSBzdHViIG1ldGhvZCBvbmx5IGhhcyBzb21lIGZpZWxkcyB2YWxpZCAoYnV0IHRoZXkgYXJlIGVub3VnaAorCSAgICAgdG8gcmVjb25zdHJ1Y3QgdGhlIHJlc3Qgb2YgdGhlIGZpZWxkcykuICAqLworCSAgdW5zaWduZWQgaW50IGlzX3N0dWIgOiAxOworCisgICAgICAgICAgLyogQysrIG1ldGhvZCB0aGF0IGlzIGlubGluZWQgKi8gCisgICAgICAgICAgdW5zaWduZWQgaW50IGlzX2lubGluZWQgOiAxOworCisJICAvKiBVbnVzZWQuICAqLworCSAgdW5zaWduZWQgaW50IGR1bW15IDogNDsKKworCSAgLyogSW5kZXggaW50byB0aGF0IGJhc2VjbGFzcydzIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUsCisJICAgICBtaW51cyAyOyBlbHNlIGlmIHN0YXRpYzogVk9GRlNFVF9TVEFUSUM7IGVsc2U6IDAuICAqLworCisJICB1bnNpZ25lZCBpbnQgdm9mZnNldCA6IDE2OworCisjCSAgZGVmaW5lIFZPRkZTRVRfU1RBVElDIDEKKworCX0gKmZuX2ZpZWxkczsKKworICAgIH0gKmZuX2ZpZWxkbGlzdHM7CisKKyAgICAvKiBJZiB0aGlzICJzdHJ1Y3QgdHlwZSIgZGVzY3JpYmVzIGEgdGVtcGxhdGUsIHRoZW4gaXQgCisgICAgICogaGFzIGFyZ3VtZW50cy4gInRlbXBsYXRlX2FyZ3MiIHBvaW50cyB0byBhbiBhcnJheSBvZgorICAgICAqIHRlbXBsYXRlIGFyZyBkZXNjcmlwdG9ycywgb2YgbGVuZ3RoICJudGVtcGxhdGVfYXJncyIuCisgICAgICogVGhlIG9ubHkgcmVhbCBpbmZvcm1hdGlvbiBpbiBlYWNoIG9mIHRoZXNlIHRlbXBsYXRlIGFyZyBkZXNjcmlwdG9ycworICAgICAqIGlzIGEgbmFtZS4gInR5cGUiIHdpbGwgdHlwaWNhbGx5IGp1c3QgcG9pbnQgdG8gYSAic3RydWN0IHR5cGUiIHdpdGgKKyAgICAgKiB0aGUgcGxhY2Vob2xkZXIgVFlQRV9DT0RFX1RFTVBMQVRFX0FSRyB0eXBlLgorICAgICAqLworICAgIHNob3J0IG50ZW1wbGF0ZV9hcmdzOworICAgIHN0cnVjdCB0ZW1wbGF0ZV9hcmcKKyAgICB7CisgICAgICBjaGFyICpuYW1lOworICAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgfSAqdGVtcGxhdGVfYXJnczsKKworICAgIC8qIElmIHRoaXMgInN0cnVjdCB0eXBlIiBkZXNjcmliZXMgYSB0ZW1wbGF0ZSwgaXQgaGFzIGEgbGlzdAorICAgICAqIG9mIGluc3RhbnRpYXRpb25zLiAiaW5zdGFudGlhdGlvbnMiIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheQorICAgICAqIG9mIHR5cGUncywgb25lIHJlcHJlc2VudGluZyBlYWNoIGluc3RhbnRpYXRpb24uIFRoZXJlCisgICAgICogYXJlICJuaW5zdGFudGlhdGlvbnMiIGVsZW1lbnRzIGluIHRoaXMgYXJyYXkuCisgICAgICovCisgICAgc2hvcnQgbmluc3RhbnRpYXRpb25zOworICAgIHN0cnVjdCB0eXBlICoqaW5zdGFudGlhdGlvbnM7CisKKyAgICAvKiBUaGUgZm9sbG93aW5nIHBvaW50cyB0byBpbmZvcm1hdGlvbiByZWxldmFudCB0byB0aGUgcnVudGltZSBtb2RlbAorICAgICAqIG9mIHRoZSBjb21waWxlci4KKyAgICAgKiBDdXJyZW50bHkgYmVpbmcgdXNlZCBvbmx5IGZvciBIUCdzIEFOU0kgQysrIGNvbXBpbGVyLgorICAgICAqIChUaGlzIHR5cGUgbWF5IGhhdmUgdG8gYmUgY2hhbmdlZC9lbmhhbmNlZCBmb3Igb3RoZXIgY29tcGlsZXJzLikKKyAgICAgKgorICAgICAqIFJVTlRJTUVfUFRSIGlzIE5VTEwgaWYgdGhlcmUgaXMgbm8gcnVudGltZSBpbmZvcm1hdGlvbiAoY3VycmVudGx5CisgICAgICogdGhpcyBtZWFucyB0aGUgdHlwZSB3YXMgbm90IGNvbXBpbGVkIGJ5IEhQIGFDQykuCisgICAgICoKKyAgICAgKiBGaWVsZHMgaW4gc3RydWN0dXJlIHBvaW50ZWQgdG86CisgICAgICogLT5IQVNfVlRBQkxFIDogMCA9PiBubyB2aXJ0dWFsIHRhYmxlLCAxID0+IHZ0YWJsZSBwcmVzZW50CisgICAgICogCisgICAgICogLT5QUklNQVJZX0JBU0UgcG9pbnRzIHRvIHRoZSBmaXJzdCBub24tdmlydHVhbCBiYXNlIGNsYXNzIHRoYXQgaGFzCisgICAgICogYSB2aXJ0dWFsIHRhYmxlLgorICAgICAqCisgICAgICogLT5WSVJUVUFMX0JBU0VfTElTVCBwb2ludHMgdG8gYSBsaXN0IG9mIHN0cnVjdCB0eXBlICogcG9pbnRlcnMgdGhhdAorICAgICAqIHBvaW50IHRvIHRoZSB0eXBlIGluZm9ybWF0aW9uIGZvciBhbGwgdmlydHVhbCBiYXNlcyBhbW9uZyB0aGlzIHR5cGUncworICAgICAqIGFuY2VzdG9ycy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgcnVudGltZV9pbmZvIHsKKyAgICAgIHNob3J0IGhhc192dGFibGU7CisgICAgICBzdHJ1Y3QgdHlwZSAqIHByaW1hcnlfYmFzZTsKKyAgICAgIHN0cnVjdCB0eXBlICoqIHZpcnR1YWxfYmFzZV9saXN0OworICAgIH0gKiBydW50aW1lX3B0cjsKKworICAgIC8qIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gYWJvdXQgZW5jbG9zaW5nIHNjb3BlLCBpZiB0aGlzIGlzIGEKKyAgICAgKiBsb2NhbCB0eXBlLiAgSWYgaXQgaXMgbm90IGEgbG9jYWwgdHlwZSwgdGhpcyBpcyBOVUxMCisgICAgICovCisgICAgc3RydWN0IGxvY2FsX3R5cGVfaW5mbyB7CisgICAgICBjaGFyICogZmlsZTsKKyAgICAgIGludCBsaW5lOworICAgIH0gKiBsb2NhbHR5cGVfcHRyOyAgCit9OworCisvKiBTdHJ1Y3QgdXNlZCBpbiBjb21wdXRpbmcgdmlydHVhbCBiYXNlIGxpc3QgKi8KK3N0cnVjdCB2YmFzZQoreworICAgIHN0cnVjdCB0eXBlICogdmJhc2V0eXBlOyAgLyogcG9pbnRlciB0byB2aXJ0dWFsIGJhc2UgKi8KKyAgICBzdHJ1Y3QgdmJhc2UgKiBuZXh0OyAgICAgIC8qIG5leHQgaW4gY2hhaW4gKi8KK307CisKKy8qIFN0cnVjdCB1c2VkIGZvciByYW5raW5nIGEgZnVuY3Rpb24gZm9yIG92ZXJsb2FkIHJlc29sdXRpb24gKi8KK3N0cnVjdCBiYWRuZXNzX3ZlY3RvciB7CisgIGludCBsZW5ndGg7CisgIGludCAqIHJhbms7Cit9OworCisvKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBUWVBFX0NQTFVTX1NQRUNJRklDKFQpIHBvaW50cyB0byB0aGUKKyAgIHRoaXMgc2hhcmVkIHN0YXRpYyBzdHJ1Y3R1cmUuICovCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgY3BsdXNfc3RydWN0X3R5cGUgY3BsdXNfc3RydWN0X2RlZmF1bHQ7CisKK2V4dGVybiB2b2lkCithbGxvY2F0ZV9jcGx1c19zdHJ1Y3RfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKSk7CisKKyNkZWZpbmUgSU5JVF9DUExVU19TUEVDSUZJQyh0eXBlKSBcCisgIChUWVBFX0NQTFVTX1NQRUNJRklDKHR5cGUpPShzdHJ1Y3QgY3BsdXNfc3RydWN0X3R5cGUqKSZjcGx1c19zdHJ1Y3RfZGVmYXVsdCkKKyNkZWZpbmUgQUxMT0NBVEVfQ1BMVVNfU1RSVUNUX1RZUEUodHlwZSkgYWxsb2NhdGVfY3BsdXNfc3RydWN0X3R5cGUgKHR5cGUpCisjZGVmaW5lIEhBVkVfQ1BMVVNfU1RSVUNUKHR5cGUpIFwKKyAgKFRZUEVfQ1BMVVNfU1BFQ0lGSUModHlwZSkgIT0gJmNwbHVzX3N0cnVjdF9kZWZhdWx0KQorCisjZGVmaW5lIFRZUEVfTkFNRSh0aGlzdHlwZSkgKHRoaXN0eXBlKS0+bmFtZQorI2RlZmluZSBUWVBFX1RBR19OQU1FKHR5cGUpICgodHlwZSktPnRhZ19uYW1lKQorI2RlZmluZSBUWVBFX1RBUkdFVF9UWVBFKHRoaXN0eXBlKSAodGhpc3R5cGUpLT50YXJnZXRfdHlwZQorI2RlZmluZSBUWVBFX1BPSU5URVJfVFlQRSh0aGlzdHlwZSkgKHRoaXN0eXBlKS0+cG9pbnRlcl90eXBlCisjZGVmaW5lIFRZUEVfUkVGRVJFTkNFX1RZUEUodGhpc3R5cGUpICh0aGlzdHlwZSktPnJlZmVyZW5jZV90eXBlCisjZGVmaW5lIFRZUEVfQ1ZfVFlQRSh0aGlzdHlwZSkgKHRoaXN0eXBlKS0+Y3ZfdHlwZQorLyogTm90ZSB0aGF0IGlmIHRoaXN0eXBlIGlzIGEgVFlQRURFRiB0eXBlLCB5b3UgaGF2ZSB0byBjYWxsIGNoZWNrX3R5cGVkZWYuCisgICBCdXQgY2hlY2tfdHlwZWRlZiBkb2VzIHNldCB0aGUgVFlQRV9MRU5HVEggb2YgdGhlIFRZUEVERUYgdHlwZSwKKyAgIHNvIHlvdSBvbmx5IGhhdmUgdG8gY2FsbCBjaGVja190eXBlZGVmIG9uY2UuICBTaW5jZSBhbGxvY2F0ZV92YWx1ZQorICAgY2FsbHMgY2hlY2tfdHlwZWRlZiwgVFlQRV9MRU5HVEggKFZBTFVFX1RZUEUgKFgpKSBpcyBzYWZlLiAgKi8KKyNkZWZpbmUgVFlQRV9MRU5HVEgodGhpc3R5cGUpICh0aGlzdHlwZSktPmxlbmd0aAorI2RlZmluZSBUWVBFX09CSkZJTEUodGhpc3R5cGUpICh0aGlzdHlwZSktPm9iamZpbGUKKyNkZWZpbmUgVFlQRV9GTEFHUyh0aGlzdHlwZSkgKHRoaXN0eXBlKS0+ZmxhZ3MKKyNkZWZpbmUgVFlQRV9VTlNJR05FRCh0aGlzdHlwZSkgKCh0aGlzdHlwZSktPmZsYWdzICYgVFlQRV9GTEFHX1VOU0lHTkVEKQorI2RlZmluZSBUWVBFX05PU0lHTih0aGlzdHlwZSkgKCh0aGlzdHlwZSktPmZsYWdzICYgVFlQRV9GTEFHX05PU0lHTikKKyNkZWZpbmUgVFlQRV9DT05TVCh0aGlzdHlwZSkgKCh0aGlzdHlwZSktPmZsYWdzICYgVFlQRV9GTEFHX0NPTlNUKQorI2RlZmluZSBUWVBFX1ZPTEFUSUxFKHRoaXN0eXBlKSAoKHRoaXN0eXBlKS0+ZmxhZ3MgJiBUWVBFX0ZMQUdfVk9MQVRJTEUpCisjZGVmaW5lIFRZUEVfSU5DT01QTEVURSh0aGlzdHlwZSkgKCh0aGlzdHlwZSktPmZsYWdzICYgVFlQRV9GTEFHX0lOQ09NUExFVEUpCisvKiBOb3RlIHRoYXQgVFlQRV9DT0RFIGNhbiBiZSBUWVBFX0NPREVfVFlQRURFRiwgc28gaWYgeW91IHdhbiB0aGUgcmVhbAorICAgdHlwZSwgeW91IG5lZWQgdG8gZG8gVFlQRV9DT0RFIChjaGVja190eXBlICh0aGlzX3R5cGUpKS4gKi8KKyNkZWZpbmUgVFlQRV9DT0RFKHRoaXN0eXBlKSAodGhpc3R5cGUpLT5jb2RlCisjZGVmaW5lIFRZUEVfTkZJRUxEUyh0aGlzdHlwZSkgKHRoaXN0eXBlKS0+bmZpZWxkcworI2RlZmluZSBUWVBFX0ZJRUxEUyh0aGlzdHlwZSkgKHRoaXN0eXBlKS0+ZmllbGRzCisjZGVmaW5lIFRZUEVfVEVNUExBVEVfQVJHUyh0aGlzdHlwZSkgVFlQRV9DUExVU19TUEVDSUZJQyh0aGlzdHlwZSktPnRlbXBsYXRlX2FyZ3MKKyNkZWZpbmUgVFlQRV9JTlNUQU5USUFUSU9OUyh0aGlzdHlwZSkgVFlQRV9DUExVU19TUEVDSUZJQyh0aGlzdHlwZSktPmluc3RhbnRpYXRpb25zCisKKyNkZWZpbmUgVFlQRV9JTkRFWF9UWVBFKHR5cGUpIFRZUEVfRklFTERfVFlQRSAodHlwZSwgMCkKKyNkZWZpbmUgVFlQRV9MT1dfQk9VTkQocmFuZ2VfdHlwZSkgVFlQRV9GSUVMRF9CSVRQT1MgKHJhbmdlX3R5cGUsIDApCisjZGVmaW5lIFRZUEVfSElHSF9CT1VORChyYW5nZV90eXBlKSBUWVBFX0ZJRUxEX0JJVFBPUyAocmFuZ2VfdHlwZSwgMSkKKworLyogTW90by1zcGVjaWZpYyBzdHVmZiBmb3IgRk9SVFJBTiBhcnJheXMgKi8KKworI2RlZmluZSBUWVBFX0FSUkFZX1VQUEVSX0JPVU5EX1RZUEUodGhpc3R5cGUpICh0aGlzdHlwZSktPnVwcGVyX2JvdW5kX3R5cGUKKyNkZWZpbmUgVFlQRV9BUlJBWV9MT1dFUl9CT1VORF9UWVBFKHRoaXN0eXBlKSAodGhpc3R5cGUpLT5sb3dlcl9ib3VuZF90eXBlCisKKyNkZWZpbmUgVFlQRV9BUlJBWV9VUFBFUl9CT1VORF9WQUxVRShhcnJheXR5cGUpIFwKKyAgIChUWVBFX0ZJRUxEX0JJVFBPUygoVFlQRV9GSUVMRF9UWVBFKChhcnJheXR5cGUpLDApKSwxKSkKKworI2RlZmluZSBUWVBFX0FSUkFZX0xPV0VSX0JPVU5EX1ZBTFVFKGFycmF5dHlwZSkgXAorICAgKFRZUEVfRklFTERfQklUUE9TKChUWVBFX0ZJRUxEX1RZUEUoKGFycmF5dHlwZSksMCkpLDApKQorCisvKiBDKysgKi8KKworI2RlZmluZSBUWVBFX1ZQVFJfQkFTRVRZUEUodGhpc3R5cGUpICh0aGlzdHlwZSktPnZwdHJfYmFzZXR5cGUKKyNkZWZpbmUgVFlQRV9ET01BSU5fVFlQRSh0aGlzdHlwZSkgKHRoaXN0eXBlKS0+dnB0cl9iYXNldHlwZQorI2RlZmluZSBUWVBFX1ZQVFJfRklFTEROTyh0aGlzdHlwZSkgKHRoaXN0eXBlKS0+dnB0cl9maWVsZG5vCisjZGVmaW5lIFRZUEVfRk5fRklFTERTKHRoaXN0eXBlKSBUWVBFX0NQTFVTX1NQRUNJRklDKHRoaXN0eXBlKS0+Zm5fZmllbGRzCisjZGVmaW5lIFRZUEVfTkZOX0ZJRUxEUyh0aGlzdHlwZSkgVFlQRV9DUExVU19TUEVDSUZJQyh0aGlzdHlwZSktPm5mbl9maWVsZHMKKyNkZWZpbmUgVFlQRV9ORk5fRklFTERTX1RPVEFMKHRoaXN0eXBlKSBUWVBFX0NQTFVTX1NQRUNJRklDKHRoaXN0eXBlKS0+bmZuX2ZpZWxkc190b3RhbAorI2RlZmluZSBUWVBFX05URU1QTEFURV9BUkdTKHRoaXN0eXBlKSBUWVBFX0NQTFVTX1NQRUNJRklDKHRoaXN0eXBlKS0+bnRlbXBsYXRlX2FyZ3MKKyNkZWZpbmUgVFlQRV9OSU5TVEFOVElBVElPTlModGhpc3R5cGUpIFRZUEVfQ1BMVVNfU1BFQ0lGSUModGhpc3R5cGUpLT5uaW5zdGFudGlhdGlvbnMKKyNkZWZpbmUgVFlQRV9ERUNMQVJFRF9UWVBFKHRoaXN0eXBlKSBUWVBFX0NQTFVTX1NQRUNJRklDKHRoaXN0eXBlKS0+ZGVjbGFyZWRfdHlwZQorI2RlZmluZQlUWVBFX1RZUEVfU1BFQ0lGSUModGhpc3R5cGUpICh0aGlzdHlwZSktPnR5cGVfc3BlY2lmaWMKKyNkZWZpbmUgVFlQRV9BUkdfVFlQRVModGhpc3R5cGUpICh0aGlzdHlwZSktPnR5cGVfc3BlY2lmaWMuYXJnX3R5cGVzCisjZGVmaW5lIFRZUEVfQ1BMVVNfU1BFQ0lGSUModGhpc3R5cGUpICh0aGlzdHlwZSktPnR5cGVfc3BlY2lmaWMuY3BsdXNfc3R1ZmYKKyNkZWZpbmUgVFlQRV9CQVNFQ0xBU1ModGhpc3R5cGUsaW5kZXgpICh0aGlzdHlwZSktPmZpZWxkc1tpbmRleF0udHlwZQorI2RlZmluZSBUWVBFX05fQkFTRUNMQVNTRVModGhpc3R5cGUpIFRZUEVfQ1BMVVNfU1BFQ0lGSUModGhpc3R5cGUpLT5uX2Jhc2VjbGFzc2VzCisjZGVmaW5lIFRZUEVfQkFTRUNMQVNTX05BTUUodGhpc3R5cGUsaW5kZXgpICh0aGlzdHlwZSktPmZpZWxkc1tpbmRleF0ubmFtZQorI2RlZmluZSBUWVBFX0JBU0VDTEFTU19CSVRQT1ModGhpc3R5cGUsaW5kZXgpIFRZUEVfRklFTERfQklUUE9TKHRoaXN0eXBlLGluZGV4KQorI2RlZmluZSBCQVNFVFlQRV9WSUFfUFVCTElDKHRoaXN0eXBlLCBpbmRleCkgXAorICAoKCFUWVBFX0ZJRUxEX1BSSVZBVEUodGhpc3R5cGUsIGluZGV4KSkgJiYgKCFUWVBFX0ZJRUxEX1BST1RFQ1RFRCh0aGlzdHlwZSwgaW5kZXgpKSkKKworI2RlZmluZSBCQVNFVFlQRV9WSUFfVklSVFVBTCh0aGlzdHlwZSwgaW5kZXgpIFwKKyAgKFRZUEVfQ1BMVVNfU1BFQ0lGSUModGhpc3R5cGUpLT52aXJ0dWFsX2ZpZWxkX2JpdHMgPT0gTlVMTCA/IDAgXAorICAgIDogQl9UU1QoVFlQRV9DUExVU19TUEVDSUZJQyh0aGlzdHlwZSktPnZpcnR1YWxfZmllbGRfYml0cywgKGluZGV4KSkpCisKKyNkZWZpbmUgRklFTERfVFlQRSh0aGlzZmxkKSAoKHRoaXNmbGQpLnR5cGUpCisjZGVmaW5lIEZJRUxEX05BTUUodGhpc2ZsZCkgKCh0aGlzZmxkKS5uYW1lKQorI2RlZmluZSBGSUVMRF9CSVRQT1ModGhpc2ZsZCkgKCh0aGlzZmxkKS5sb2MuYml0cG9zKQorI2RlZmluZSBGSUVMRF9CSVRTSVpFKHRoaXNmbGQpICgodGhpc2ZsZCkuYml0c2l6ZSkKKyNkZWZpbmUgRklFTERfUEhZU05BTUUodGhpc2ZsZCkgKCh0aGlzZmxkKS5sb2MucGh5c25hbWUpCisjZGVmaW5lIEZJRUxEX1BIWVNBRERSKHRoaXNmbGQpICgodGhpc2ZsZCkubG9jLnBoeXNhZGRyKQorI2RlZmluZSBTRVRfRklFTERfUEhZU05BTUUodGhpc2ZsZCwgbmFtZSkgXAorICAoKHRoaXNmbGQpLmJpdHNpemUgPSAtMSwgRklFTERfUEhZU05BTUUodGhpc2ZsZCkgPSAobmFtZSkpCisjZGVmaW5lIFNFVF9GSUVMRF9QSFlTQUREUih0aGlzZmxkLCBuYW1lKSBcCisgICgodGhpc2ZsZCkuYml0c2l6ZSA9IC0yLCBGSUVMRF9QSFlTQUREUih0aGlzZmxkKSA9IChuYW1lKSkKKyNkZWZpbmUgVFlQRV9GSUVMRCh0aGlzdHlwZSwgbikgKHRoaXN0eXBlKS0+ZmllbGRzW25dCisjZGVmaW5lIFRZUEVfRklFTERfVFlQRSh0aGlzdHlwZSwgbikgRklFTERfVFlQRShUWVBFX0ZJRUxEKHRoaXN0eXBlLCBuKSkKKyNkZWZpbmUgVFlQRV9GSUVMRF9OQU1FKHRoaXN0eXBlLCBuKSBGSUVMRF9OQU1FKFRZUEVfRklFTEQodGhpc3R5cGUsIG4pKQorI2RlZmluZSBUWVBFX0ZJRUxEX0JJVFBPUyh0aGlzdHlwZSwgbikgRklFTERfQklUUE9TKFRZUEVfRklFTEQodGhpc3R5cGUsbikpCisjZGVmaW5lIFRZUEVfRklFTERfQklUU0laRSh0aGlzdHlwZSwgbikgRklFTERfQklUU0laRShUWVBFX0ZJRUxEKHRoaXN0eXBlLG4pKQorI2RlZmluZSBUWVBFX0ZJRUxEX1BBQ0tFRCh0aGlzdHlwZSwgbikgKEZJRUxEX0JJVFNJWkUoVFlQRV9GSUVMRCh0aGlzdHlwZSxuKSkhPTApCisjZGVmaW5lIFRZUEVfVEVNUExBVEVfQVJHKHRoaXN0eXBlLCBuKSBUWVBFX0NQTFVTX1NQRUNJRklDKHRoaXN0eXBlKS0+dGVtcGxhdGVfYXJnc1tuXQorI2RlZmluZSBUWVBFX0lOU1RBTlRJQVRJT04odGhpc3R5cGUsIG4pIFRZUEVfQ1BMVVNfU1BFQ0lGSUModGhpc3R5cGUpLT5pbnN0YW50aWF0aW9uc1tuXQorCisjZGVmaW5lIFRZUEVfRklFTERfUFJJVkFURV9CSVRTKHRoaXN0eXBlKSBcCisgIFRZUEVfQ1BMVVNfU1BFQ0lGSUModGhpc3R5cGUpLT5wcml2YXRlX2ZpZWxkX2JpdHMKKyNkZWZpbmUgVFlQRV9GSUVMRF9QUk9URUNURURfQklUUyh0aGlzdHlwZSkgXAorICBUWVBFX0NQTFVTX1NQRUNJRklDKHRoaXN0eXBlKS0+cHJvdGVjdGVkX2ZpZWxkX2JpdHMKKyNkZWZpbmUgVFlQRV9GSUVMRF9JR05PUkVfQklUUyh0aGlzdHlwZSkgXAorICBUWVBFX0NQTFVTX1NQRUNJRklDKHRoaXN0eXBlKS0+aWdub3JlX2ZpZWxkX2JpdHMKKyNkZWZpbmUgVFlQRV9GSUVMRF9WSVJUVUFMX0JJVFModGhpc3R5cGUpIFwKKyAgVFlQRV9DUExVU19TUEVDSUZJQyh0aGlzdHlwZSktPnZpcnR1YWxfZmllbGRfYml0cworI2RlZmluZSBTRVRfVFlQRV9GSUVMRF9QUklWQVRFKHRoaXN0eXBlLCBuKSBcCisgIEJfU0VUIChUWVBFX0NQTFVTX1NQRUNJRklDKHRoaXN0eXBlKS0+cHJpdmF0ZV9maWVsZF9iaXRzLCAobikpCisjZGVmaW5lIFNFVF9UWVBFX0ZJRUxEX1BST1RFQ1RFRCh0aGlzdHlwZSwgbikgXAorICBCX1NFVCAoVFlQRV9DUExVU19TUEVDSUZJQyh0aGlzdHlwZSktPnByb3RlY3RlZF9maWVsZF9iaXRzLCAobikpCisjZGVmaW5lIFNFVF9UWVBFX0ZJRUxEX0lHTk9SRSh0aGlzdHlwZSwgbikgXAorICBCX1NFVCAoVFlQRV9DUExVU19TUEVDSUZJQyh0aGlzdHlwZSktPmlnbm9yZV9maWVsZF9iaXRzLCAobikpCisjZGVmaW5lIFNFVF9UWVBFX0ZJRUxEX1ZJUlRVQUwodGhpc3R5cGUsIG4pIFwKKyAgQl9TRVQgKFRZUEVfQ1BMVVNfU1BFQ0lGSUModGhpc3R5cGUpLT52aXJ0dWFsX2ZpZWxkX2JpdHMsIChuKSkKKyNkZWZpbmUgVFlQRV9GSUVMRF9QUklWQVRFKHRoaXN0eXBlLCBuKSBcCisgIChUWVBFX0NQTFVTX1NQRUNJRklDKHRoaXN0eXBlKS0+cHJpdmF0ZV9maWVsZF9iaXRzID09IE5VTEwgPyAwIFwKKyAgICA6IEJfVFNUKFRZUEVfQ1BMVVNfU1BFQ0lGSUModGhpc3R5cGUpLT5wcml2YXRlX2ZpZWxkX2JpdHMsIChuKSkpCisjZGVmaW5lIFRZUEVfRklFTERfUFJPVEVDVEVEKHRoaXN0eXBlLCBuKSBcCisgIChUWVBFX0NQTFVTX1NQRUNJRklDKHRoaXN0eXBlKS0+cHJvdGVjdGVkX2ZpZWxkX2JpdHMgPT0gTlVMTCA/IDAgXAorICAgIDogQl9UU1QoVFlQRV9DUExVU19TUEVDSUZJQyh0aGlzdHlwZSktPnByb3RlY3RlZF9maWVsZF9iaXRzLCAobikpKQorI2RlZmluZSBUWVBFX0ZJRUxEX0lHTk9SRSh0aGlzdHlwZSwgbikgXAorICAoVFlQRV9DUExVU19TUEVDSUZJQyh0aGlzdHlwZSktPmlnbm9yZV9maWVsZF9iaXRzID09IE5VTEwgPyAwIFwKKyAgICA6IEJfVFNUKFRZUEVfQ1BMVVNfU1BFQ0lGSUModGhpc3R5cGUpLT5pZ25vcmVfZmllbGRfYml0cywgKG4pKSkKKyNkZWZpbmUgVFlQRV9GSUVMRF9WSVJUVUFMKHRoaXN0eXBlLCBuKSBcCisgIChUWVBFX0NQTFVTX1NQRUNJRklDKHRoaXN0eXBlKS0+dmlydHVhbF9maWVsZF9iaXRzID09IE5VTEwgPyAwIFwKKyAgICA6IEJfVFNUKFRZUEVfQ1BMVVNfU1BFQ0lGSUModGhpc3R5cGUpLT52aXJ0dWFsX2ZpZWxkX2JpdHMsIChuKSkpCisKKyNkZWZpbmUgVFlQRV9GSUVMRF9TVEFUSUModGhpc3R5cGUsIG4pICgodGhpc3R5cGUpLT5maWVsZHNbbl0uYml0c2l6ZSA8IDApCisjZGVmaW5lIFRZUEVfRklFTERfU1RBVElDX0hBU19BRERSKHRoaXN0eXBlLCBuKSAoKHRoaXN0eXBlKS0+ZmllbGRzW25dLmJpdHNpemUgPT0gLTIpCisjZGVmaW5lIFRZUEVfRklFTERfU1RBVElDX1BIWVNOQU1FKHRoaXN0eXBlLCBuKSBGSUVMRF9QSFlTTkFNRShUWVBFX0ZJRUxEKHRoaXN0eXBlLCBuKSkKKyNkZWZpbmUgVFlQRV9GSUVMRF9TVEFUSUNfUEhZU0FERFIodGhpc3R5cGUsIG4pIEZJRUxEX1BIWVNBRERSKFRZUEVfRklFTEQodGhpc3R5cGUsIG4pKQorCisjZGVmaW5lIFRZUEVfRk5fRklFTERMSVNUUyh0aGlzdHlwZSkgVFlQRV9DUExVU19TUEVDSUZJQyh0aGlzdHlwZSktPmZuX2ZpZWxkbGlzdHMKKyNkZWZpbmUgVFlQRV9GTl9GSUVMRExJU1QodGhpc3R5cGUsIG4pIFRZUEVfQ1BMVVNfU1BFQ0lGSUModGhpc3R5cGUpLT5mbl9maWVsZGxpc3RzW25dCisjZGVmaW5lIFRZUEVfRk5fRklFTERMSVNUMSh0aGlzdHlwZSwgbikgVFlQRV9DUExVU19TUEVDSUZJQyh0aGlzdHlwZSktPmZuX2ZpZWxkbGlzdHNbbl0uZm5fZmllbGRzCisjZGVmaW5lIFRZUEVfRk5fRklFTERMSVNUX05BTUUodGhpc3R5cGUsIG4pIFRZUEVfQ1BMVVNfU1BFQ0lGSUModGhpc3R5cGUpLT5mbl9maWVsZGxpc3RzW25dLm5hbWUKKyNkZWZpbmUgVFlQRV9GTl9GSUVMRExJU1RfTEVOR1RIKHRoaXN0eXBlLCBuKSBUWVBFX0NQTFVTX1NQRUNJRklDKHRoaXN0eXBlKS0+Zm5fZmllbGRsaXN0c1tuXS5sZW5ndGgKKworI2RlZmluZSBUWVBFX0ZOX0ZJRUxEKHRoaXNmbiwgbikgKHRoaXNmbilbbl0KKyNkZWZpbmUgVFlQRV9GTl9GSUVMRF9QSFlTTkFNRSh0aGlzZm4sIG4pICh0aGlzZm4pW25dLnBoeXNuYW1lCisjZGVmaW5lIFRZUEVfRk5fRklFTERfVFlQRSh0aGlzZm4sIG4pICh0aGlzZm4pW25dLnR5cGUKKyNkZWZpbmUgVFlQRV9GTl9GSUVMRF9BUkdTKHRoaXNmbiwgbikgVFlQRV9BUkdfVFlQRVMgKCh0aGlzZm4pW25dLnR5cGUpCisjZGVmaW5lIFRZUEVfRk5fRklFTERfQ09OU1QodGhpc2ZuLCBuKSAoKHRoaXNmbilbbl0uaXNfY29uc3QpCisjZGVmaW5lIFRZUEVfRk5fRklFTERfVk9MQVRJTEUodGhpc2ZuLCBuKSAoKHRoaXNmbilbbl0uaXNfdm9sYXRpbGUpCisjZGVmaW5lIFRZUEVfRk5fRklFTERfUFJJVkFURSh0aGlzZm4sIG4pICgodGhpc2ZuKVtuXS5pc19wcml2YXRlKQorI2RlZmluZSBUWVBFX0ZOX0ZJRUxEX1BST1RFQ1RFRCh0aGlzZm4sIG4pICgodGhpc2ZuKVtuXS5pc19wcm90ZWN0ZWQpCisjZGVmaW5lIFRZUEVfRk5fRklFTERfUFVCTElDKHRoaXNmbiwgbikgKCh0aGlzZm4pW25dLmlzX3B1YmxpYykKKyNkZWZpbmUgVFlQRV9GTl9GSUVMRF9TVEFUSUModGhpc2ZuLCBuKSAoKHRoaXNmbilbbl0uaXNfc3RhdGljKQorI2RlZmluZSBUWVBFX0ZOX0ZJRUxEX0ZJTkFMKHRoaXNmbiwgbikgKCh0aGlzZm4pW25dLmlzX2ZpbmFsKQorI2RlZmluZSBUWVBFX0ZOX0ZJRUxEX1NZTkNIUk9OSVpFRCh0aGlzZm4sIG4pICgodGhpc2ZuKVtuXS5pc19zeW5jaHJvbml6ZWQpCisjZGVmaW5lIFRZUEVfRk5fRklFTERfTkFUSVZFKHRoaXNmbiwgbikgKCh0aGlzZm4pW25dLmlzX25hdGl2ZSkKKyNkZWZpbmUgVFlQRV9GTl9GSUVMRF9BQlNUUkFDVCh0aGlzZm4sIG4pICgodGhpc2ZuKVtuXS5pc19hYnN0cmFjdCkKKyNkZWZpbmUgVFlQRV9GTl9GSUVMRF9TVFVCKHRoaXNmbiwgbikgKCh0aGlzZm4pW25dLmlzX3N0dWIpCisjZGVmaW5lIFRZUEVfRk5fRklFTERfSU5MSU5FRCh0aGlzZm4sIG4pICgodGhpc2ZuKVtuXS5pc19pbmxpbmVkKQorI2RlZmluZSBUWVBFX0ZOX0ZJRUxEX0ZDT05URVhUKHRoaXNmbiwgbikgKCh0aGlzZm4pW25dLmZjb250ZXh0KQorI2RlZmluZSBUWVBFX0ZOX0ZJRUxEX1ZPRkZTRVQodGhpc2ZuLCBuKSAoKHRoaXNmbilbbl0udm9mZnNldC0yKQorI2RlZmluZSBUWVBFX0ZOX0ZJRUxEX1ZJUlRVQUxfUCh0aGlzZm4sIG4pICgodGhpc2ZuKVtuXS52b2Zmc2V0ID4gMSkKKyNkZWZpbmUgVFlQRV9GTl9GSUVMRF9TVEFUSUNfUCh0aGlzZm4sIG4pICgodGhpc2ZuKVtuXS52b2Zmc2V0ID09IFZPRkZTRVRfU1RBVElDKQorCisjZGVmaW5lIFRZUEVfUlVOVElNRV9QVFIodGhpc3R5cGUpIChUWVBFX0NQTFVTX1NQRUNJRklDKHRoaXN0eXBlKS0+cnVudGltZV9wdHIpCisjZGVmaW5lIFRZUEVfVlRBQkxFKHRoaXN0eXBlKSAoVFlQRV9SVU5USU1FX1BUUih0aGlzdHlwZSktPmhhc192dGFibGUpCisjZGVmaW5lIFRZUEVfSEFTX1ZUQUJMRSh0aGlzdHlwZSkgKFRZUEVfUlVOVElNRV9QVFIodGhpc3R5cGUpICYmIFRZUEVfVlRBQkxFKHRoaXN0eXBlKSkKKyNkZWZpbmUgVFlQRV9QUklNQVJZX0JBU0UodGhpc3R5cGUpIChUWVBFX1JVTlRJTUVfUFRSKHRoaXN0eXBlKS0+cHJpbWFyeV9iYXNlKQorI2RlZmluZSBUWVBFX1ZJUlRVQUxfQkFTRV9MSVNUKHRoaXN0eXBlKSAoVFlQRV9SVU5USU1FX1BUUih0aGlzdHlwZSktPnZpcnR1YWxfYmFzZV9saXN0KQorICAKKyNkZWZpbmUgVFlQRV9MT0NBTFRZUEVfUFRSKHRoaXN0eXBlKSAoVFlQRV9DUExVU19TUEVDSUZJQyh0aGlzdHlwZSktPmxvY2FsdHlwZV9wdHIpCisjZGVmaW5lIFRZUEVfTE9DQUxUWVBFX0ZJTEUodGhpc3R5cGUpIChUWVBFX0NQTFVTX1NQRUNJRklDKHRoaXN0eXBlKS0+bG9jYWx0eXBlX3B0ci0+ZmlsZSkKKyNkZWZpbmUgVFlQRV9MT0NBTFRZUEVfTElORSh0aGlzdHlwZSkgKFRZUEVfQ1BMVVNfU1BFQ0lGSUModGhpc3R5cGUpLT5sb2NhbHR5cGVfcHRyLT5saW5lKQorICAgICAgICAgICAgICAKKyNkZWZpbmUgVFlQRV9JU19PUEFRVUUodGhpc3R5cGUpICgoKFRZUEVfQ09ERSAodGhpc3R5cGUpID09IFRZUEVfQ09ERV9TVFJVQ1QpIHx8ICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUWVBFX0NPREUgKHRoaXN0eXBlKSA9PSBUWVBFX0NPREVfVU5JT04pKSAgICAgICAgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUWVBFX05GSUVMRFMgKHRoaXN0eXBlKSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFlQRV9DUExVU19TUEVDSUZJQyAodGhpc3R5cGUpICYmIChUWVBFX05GTl9GSUVMRFMgKHRoaXN0eXBlKSA9PSAwKSkpCisgICAgICAgCisgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIAorLyogSW1wbGljaXQgc2l6ZXMgKi8KK2V4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX3ZvaWQ7CitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9jaGFyOworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfc2hvcnQ7CitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9pbnQ7CitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9sb25nOworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfc2lnbmVkX2NoYXI7CitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV91bnNpZ25lZF9jaGFyOworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfdW5zaWduZWRfc2hvcnQ7CitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV91bnNpZ25lZF9pbnQ7CitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV91bnNpZ25lZF9sb25nOworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfZmxvYXQ7CitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9kb3VibGU7CitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9sb25nX2RvdWJsZTsKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2NvbXBsZXg7CitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9kb3VibGVfY29tcGxleDsKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX3N0cmluZzsKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2Jvb2w7CisKKy8qIEV4cGxpY2l0IHNpemVzIC0gc2VlIDxpbnR5cGVzLmg+IGZvciBuYW1pbmcgc2NoZW1hICovCitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9pbnQ4OworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfdWludDg7CitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9pbnQxNjsKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX3VpbnQxNjsKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2ludDMyOworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfdWludDMyOworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfaW50NjQ7CitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV91aW50NjQ7CisKKy8qIFRoaXMgdHlwZSByZXByZXNlbnRzIGEgdHlwZSB0aGF0IHdhcyB1bnJlY29nbml6ZWQgaW4gc3ltYm9sCisgICByZWFkLWluLiAgKi8KKworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfZXJyb3I7CisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2xvbmdfbG9uZzsKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZzsKKworLyogTW9kdWxhLTIgdHlwZXMgKi8KKworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfbTJfY2hhcjsKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX20yX2ludDsKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX20yX2NhcmQ7CitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9tMl9yZWFsOworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfbTJfYm9vbDsKKworLyogQ2hpbGwgdHlwZXMgKi8KKworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfY2hpbGxfYm9vbDsKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2NoaWxsX2NoYXI7CitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9jaGlsbF9sb25nOworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfY2hpbGxfdWxvbmc7CitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9jaGlsbF9yZWFsOworCisvKiBGb3J0cmFuIChGNzcpIHR5cGVzICovCisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2ZfY2hhcmFjdGVyOworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfZl9pbnRlZ2VyOworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfZl9sb2dpY2FsOworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfZl9sb2dpY2FsX3MxOworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfZl9sb2dpY2FsX3MyOworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfZl9pbnRlZ2VyOyAKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2ZfaW50ZWdlcl9zMjsKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2ZfcmVhbDsKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2ZfcmVhbF9zODsKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2ZfcmVhbF9zMTY7CitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9mX2NvbXBsZXhfczg7CitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9mX2NvbXBsZXhfczE2OworZXh0ZXJuIHN0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfZl9jb21wbGV4X3MzMjsKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX2Zfdm9pZDsKKworLyogUlRUSSBmb3IgQysrICovCisvKiBleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9jeHhfdHlwZWluZm87ICovIAorCisvKiBNYXhpbXVtIGFuZCBtaW5pbXVtIHZhbHVlcyBvZiBidWlsdC1pbiB0eXBlcyAqLworCisjZGVmaW5lCU1BWF9PRl9UWVBFKHQpCVwKKyAgIFRZUEVfVU5TSUdORUQodCkgPyBVTUFYX09GX1NJWkUoVFlQRV9MRU5HVEgodCkpIFwKKyAgICA6IE1BWF9PRl9TSVpFKFRZUEVfTEVOR1RIKHQpKQorCisjZGVmaW5lIE1JTl9PRl9UWVBFKHQpCVwKKyAgIFRZUEVfVU5TSUdORUQodCkgPyBVTUlOX09GX1NJWkUoVFlQRV9MRU5HVEgodCkpIFwKKyAgICA6IE1JTl9PRl9TSVpFKFRZUEVfTEVOR1RIKHQpKQorCisvKiBBbGxvY2F0ZSBzcGFjZSBmb3Igc3RvcmluZyBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgdHlwZS4KKyAgIFdlIGVuc3VyZSB0aGF0IHRoZSBzcGFjZSBpcyBhbGxvY2F0ZWQgdXNpbmcgdGhlIHNhbWUgbWVjaGFuaXNtIHRoYXQKKyAgIHdhcyB1c2VkIHRvIGFsbG9jYXRlIHRoZSBzcGFjZSBmb3IgdGhlIHR5cGUgc3RydWN0dXJlIGl0c2VsZi4gIEkuRS4KKyAgIGlmIHRoZSB0eXBlIGlzIG9uIGFuIG9iamZpbGUncyB0eXBlX29ic3RhY2ssIHRoZW4gdGhlIHNwYWNlIGZvciBkYXRhCisgICBhc3NvY2lhdGVkIHdpdGggdGhhdCB0eXBlIHdpbGwgYWxzbyBiZSBhbGxvY2F0ZWQgb24gdGhlIHR5cGVfb2JzdGFjay4KKyAgIElmIHRoZSB0eXBlIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHBhcnRpY3VsYXIgb2JqZmlsZSAoc3VjaCBhcworICAgYnVpbHRpbiB0eXBlcyksIHRoZW4gdGhlIGRhdGEgc3BhY2Ugd2lsbCBiZSBhbGxvY2F0ZWQgd2l0aCB4bWFsbG9jLAorICAgdGhlIHNhbWUgYXMgZm9yIHRoZSB0eXBlIHN0cnVjdHVyZS4gKi8KKworI2RlZmluZSBUWVBFX0FMTE9DKHQsc2l6ZSkgIFwKKyAgIChUWVBFX09CSkZJTEUgKHQpICE9IE5VTEwgIFwKKyAgICA/IG9ic3RhY2tfYWxsb2MgKCZUWVBFX09CSkZJTEUgKHQpIC0+IHR5cGVfb2JzdGFjaywgc2l6ZSkgXAorICAgIDogeG1hbGxvYyAoc2l6ZSkpCisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqCithbGxvY190eXBlIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICopKTsKKworZXh0ZXJuIHN0cnVjdCB0eXBlICoKK2luaXRfdHlwZSBQQVJBTVMgKChlbnVtIHR5cGVfY29kZSwgaW50LCBpbnQsIGNoYXIgKiwgc3RydWN0IG9iamZpbGUgKikpOworCitleHRlcm4gc3RydWN0IHR5cGUgKgorbG9va3VwX3JlZmVyZW5jZV90eXBlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICopKTsKKworZXh0ZXJuIHN0cnVjdCB0eXBlICoKK21ha2VfcmVmZXJlbmNlX3R5cGUgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgc3RydWN0IHR5cGUgKiopKTsKKworZXh0ZXJuIHN0cnVjdCB0eXBlICoKK21ha2VfY3ZfdHlwZSBQQVJBTVMgKChpbnQsIGludCwgc3RydWN0IHR5cGUgKiwgc3RydWN0IHR5cGUgKiopKTsKKworZXh0ZXJuIHN0cnVjdCB0eXBlICoKK2xvb2t1cF9tZW1iZXJfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBzdHJ1Y3QgdHlwZSAqKSk7CisKK2V4dGVybiB2b2lkCitzbWFzaF90b19tZXRob2RfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBzdHJ1Y3QgdHlwZSAqLCBzdHJ1Y3QgdHlwZSAqLAorCQkJICAgICAgc3RydWN0IHR5cGUgKiopKTsKKworZXh0ZXJuIHZvaWQKK3NtYXNoX3RvX21lbWJlcl90eXBlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIHN0cnVjdCB0eXBlICosIHN0cnVjdCB0eXBlICopKTsKKworZXh0ZXJuIHN0cnVjdCB0eXBlICoKK2FsbG9jYXRlX3N0dWJfbWV0aG9kIFBBUkFNUyAoKHN0cnVjdCB0eXBlICopKTsKKworZXh0ZXJuIGNoYXIgKgordHlwZV9uYW1lX25vX3RhZyBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgdHlwZSAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqCitsb29rdXBfc3RydWN0X2VsdF90eXBlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIGNoYXIgKiwgaW50KSk7CisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqCittYWtlX3BvaW50ZXJfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBzdHJ1Y3QgdHlwZSAqKikpOworCitleHRlcm4gc3RydWN0IHR5cGUgKgorbG9va3VwX3BvaW50ZXJfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqCittYWtlX2Z1bmN0aW9uX3R5cGUgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgc3RydWN0IHR5cGUgKiopKTsKKworZXh0ZXJuIHN0cnVjdCB0eXBlICoKK2xvb2t1cF9mdW5jdGlvbl90eXBlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICopKTsKKworZXh0ZXJuIHN0cnVjdCB0eXBlICoKK2NyZWF0ZV9yYW5nZV90eXBlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIHN0cnVjdCB0eXBlICosIGludCwgaW50KSk7CisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqCitjcmVhdGVfYXJyYXlfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBzdHJ1Y3QgdHlwZSAqLCBzdHJ1Y3QgdHlwZSAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqCitjcmVhdGVfc3RyaW5nX3R5cGUgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgc3RydWN0IHR5cGUgKikpOworCitleHRlcm4gc3RydWN0IHR5cGUgKmNyZWF0ZV9zZXRfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBzdHJ1Y3QgdHlwZSAqKSk7CisKK2V4dGVybiBpbnQgY2hpbGxfdmFyeWluZ190eXBlIFBBUkFNUyAoKHN0cnVjdCB0eXBlKikpOworCitleHRlcm4gc3RydWN0IHR5cGUgKgorbG9va3VwX3Vuc2lnbmVkX3R5cGVuYW1lIFBBUkFNUyAoKGNoYXIgKikpOworCitleHRlcm4gc3RydWN0IHR5cGUgKgorbG9va3VwX3NpZ25lZF90eXBlbmFtZSBQQVJBTVMgKChjaGFyICopKTsKKworZXh0ZXJuIHN0cnVjdCB0eXBlICoKK2NoZWNrX3R5cGVkZWYgUEFSQU1TICgoc3RydWN0IHR5cGUgKikpOworCisjZGVmaW5lIENIRUNLX1RZUEVERUYoVFlQRSkgKFRZUEUpID0gY2hlY2tfdHlwZWRlZiAoVFlQRSkKKworZXh0ZXJuIHZvaWQKK2NoZWNrX3N0dWJfbWV0aG9kIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIGludCwgaW50KSk7CisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqCitsb29rdXBfcHJpbWl0aXZlX3R5cGVuYW1lIFBBUkFNUyAoKGNoYXIgKikpOworCitleHRlcm4gY2hhciAqCitnZGJfbWFuZ2xlX25hbWUgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgaW50LCBpbnQpKTsKKworZXh0ZXJuIHN0cnVjdCB0eXBlICoKK2J1aWx0aW5fdHlwZSBQQVJBTVMgKChjaGFyICoqKSk7CisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqCitsb29rdXBfdHlwZW5hbWUgUEFSQU1TICgoY2hhciAqLCBzdHJ1Y3QgYmxvY2sgKiwgaW50KSk7CisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqCitsb29rdXBfdGVtcGxhdGVfdHlwZSBQQVJBTVMgKChjaGFyICosIHN0cnVjdCB0eXBlICosIHN0cnVjdCBibG9jayAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqCitsb29rdXBfZnVuZGFtZW50YWxfdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBpbnQpKTsKKworZXh0ZXJuIHZvaWQKK2ZpbGxfaW5fdnB0cl9maWVsZG5vIFBBUkFNUyAoKHN0cnVjdCB0eXBlICopKTsKKworZXh0ZXJuIGludCBnZXRfZGVzdHJ1Y3Rvcl9mbl9maWVsZCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBpbnQgKiwgaW50ICopKTsKKworZXh0ZXJuIGludCBnZXRfZGlzY3JldGVfYm91bmRzIFBBUkFNUyAoKHN0cnVjdCB0eXBlKiwgTE9OR0VTVCosIExPTkdFU1QqKSk7CisKK2V4dGVybiBpbnQKK2lzX2FuY2VzdG9yIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIHN0cnVjdCB0eXBlICopKTsKKworZXh0ZXJuIGludAoraGFzX3Z0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqCitwcmltYXJ5X2Jhc2VfY2xhc3MgUEFSQU1TICgoc3RydWN0IHR5cGUgKikpOworCitleHRlcm4gc3RydWN0IHR5cGUgKioKK3ZpcnR1YWxfYmFzZV9saXN0IFBBUkFNUyAoKHN0cnVjdCB0eXBlICopKTsKKworZXh0ZXJuIGludAordmlydHVhbF9iYXNlX2xpc3RfbGVuZ3RoIFBBUkFNUyAoKHN0cnVjdCB0eXBlICopKTsKK2V4dGVybiBpbnQKK3ZpcnR1YWxfYmFzZV9saXN0X2xlbmd0aF9za2lwX3ByaW1hcmllcyBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKSk7CisKK2V4dGVybiBpbnQKK3ZpcnR1YWxfYmFzZV9pbmRleCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBzdHJ1Y3QgdHlwZSAqKSk7CitleHRlcm4gaW50Cit2aXJ0dWFsX2Jhc2VfaW5kZXhfc2tpcF9wcmltYXJpZXMgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgc3RydWN0IHR5cGUgKikpOworCisKK2V4dGVybiBpbnQKK2NsYXNzX2luZGV4X2luX3ByaW1hcnlfbGlzdCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKSk7CisKK2V4dGVybiBpbnQKK2NvdW50X3ZpcnR1YWxfZm5zIFBBUkFNUyAoKHN0cnVjdCB0eXBlKikpOworCisvKiBDb25zdGFudHMgZm9yIEhQL1RhbGlnZW50IEFOU0kgQysrIHJ1bnRpbWUgbW9kZWwgKi8KKworLyogV2hlcmUgdmlydHVhbCBmdW5jdGlvbiBlbnRyaWVzIGJlZ2luIGluIHRoZQorICogdmlydHVhbCB0YWJsZSwgaW4gdGhlIG5vbi1SUkJDIHZ0YWJsZSBmb3JtYXQuCisgKiBGaXJzdCA0IGFyZSB0aGUgbWV0YXZ0YWJsZSBwb2ludGVyLCB0b3Agb2Zmc2V0LAorICogdHlwZWluZm8gcG9pbnRlciwgYW5kIGR1cCBiYXNlIGluZm8gcG9pbnRlciAqLworI2RlZmluZSBIUF9BQ0NfVkZVTkNfU1RBUlQgICAgICAgIDQKKworLyogKE5lZ2F0aXZlKSBPZmZzZXQgd2hlcmUgdmlydHVhbCBiYXNlIG9mZnNldCBlbnRyaWVzIGJlZ2luIAorICogaW4gdGhlIHZpcnR1YWwgdGFibGUuIFNraXBzIG92ZXIgbWV0YXZ0YWJsZSBwb2ludGVyIGFuZAorICogdGhlIHNlbGYtb2Zmc2V0IGVudHJ5LiAKKyAqIE5PVEU6IE5FR0FURSBUSElTIEJFRk9SRSBVU0lORyEgVGhlIHZpcnR1YWwgYmFzZSBvZmZzZXRzCisgKiBhcHBlYXIgYmVmb3JlIHRoZSBhZGRyZXNzIHBvaW50IG9mIHRoZSB2dGFibGUgKHRoZSBzbG90CisgKiBwb2ludGVkIHRvIGJ5IHRoZSBvYmplY3QncyB2dGFibGUgcG9pbnRlciksIGkuZS4gYXQgbG93ZXIKKyAqIGFkZHJlc3NlcyB0aGFuIHRoZSB2dGFibGUgcG9pbnRlci4gKi8KKyNkZWZpbmUgSFBfQUNDX1ZCQVNFX1NUQVJUICAgICAgICAyCisKKy8qIChQb3NpdGl2ZSkgT2Zmc2V0IHdoZXJlIHRoZSBwb2ludGVyIHRvIHRoZSB0eXBlaW5mbworICogb2JqZWN0IGlzIHByZXNlbnQgaW4gdGhlIHZpcnR1YWwgdGFibGUgKi8KKyNkZWZpbmUgSFBfQUNDX1RZUEVJTkZPX09GRlNFVCAgICAyCisKKy8qIChQb3NpdGl2ZSkgT2Zmc2V0IHdoZXJlIHRoZSBgYHRvcCBvZmZzZXQnJyBlbnRyeSBvZgorICogdGhlIHZpcnR1YWwgdGFibGUgaXMgKi8KKyNkZWZpbmUgSFBfQUNDX1RPUF9PRkZTRVRfT0ZGU0VUICAxCisKKy8qIE92ZXJsb2FkIHJlc29sdXRpb24gKi8KKworI2RlZmluZSBMRU5HVEhfTUFUQ0goYnYpICgoYnYpLT5yYW5rWzBdKQorCisvKiBCYWRuZXNzIGlmIHBhcmFtZXRlciBsaXN0IGxlbmd0aCBkb2Vzbid0IG1hdGNoIGFyZyBsaXN0IGxlbmd0aCAqLyAKKyNkZWZpbmUgTEVOR1RIX01JU01BVENIX0JBRE5FU1MgICAgICAxMDAKKy8qIER1bW15IGJhZG5lc3MgdmFsdWUgZm9yIG5vbmV4aXN0ZW50IHBhcmFtZXRlciBwb3NpdGlvbnMgKi8gCisjZGVmaW5lIFRPT19GRVdfUEFSQU1TX0JBRE5FU1MgICAgICAgMTAwCisvKiBCYWRuZXNzIGlmIG5vIGNvbnZlcnNpb24gYW1vbmcgdHlwZXMgKi8KKyNkZWZpbmUgSU5DT01QQVRJQkxFX1RZUEVfQkFETkVTUyAgICAxMDAKKy8qIEJhZG5lc3Mgb2YgY29lcmNpbmcgbGFyZ2UgaW50ZWdlciB0byBzbWFsbGVyIHNpemUgKi8KKyNkZWZpbmUgSU5URUdFUl9DT0VSQ0lPTl9CQURORVNTICAgICAxMDAKKy8qIEJhZG5lc3Mgb2YgY29lcmNpbmcgbGFyZ2UgZmxvYXRpbmcgdHlwZSB0byBzbWFsbGVyIHNpemUgKi8KKyNkZWZpbmUgRkxPQVRfQ09FUkNJT05fQkFETkVTUyAgICAgICAxMDAKKworLyogQmFkbmVzcyBvZiBpbnRlZ3JhbCBwcm9tb3Rpb24gKi8KKyNkZWZpbmUgSU5URUdFUl9QUk9NT1RJT05fQkFETkVTUyAgICAgIDEKKy8qIEJhZG5lc3Mgb2YgZmxvYXRpbmcgcHJvbW90aW9uICovCisjZGVmaW5lIEZMT0FUX1BST01PVElPTl9CQURORVNTICAgICAgICAxCisvKiBCYWRuZXNzIG9mIGludGVncmFsIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgSU5URUdFUl9DT05WRVJTSU9OX0JBRE5FU1MgICAgIDIKKy8qIEJhZG5lc3Mgb2YgZmxvYXRpbmcgY29udmVyc2lvbiAqLworI2RlZmluZSBGTE9BVF9DT05WRVJTSU9OX0JBRE5FU1MgICAgICAgMgorLyogQmFkbmVzcyBvZiBpbnRlZ2VyPC0+ZmxvYXRpbmcgY29udmVyc2lvbnMgKi8KKyNkZWZpbmUgSU5UX0ZMT0FUX0NPTlZFUlNJT05fQkFETkVTUyAgIDIKKy8qIEJhZG5lc3Mgb2YgY29udmVydGluZyB0byBhIGJvb2xlYW4gKi8KKyNkZWZpbmUgQk9PTEVBTl9DT05WRVJTSU9OX0JBRE5FU1MgICAgIDIKKy8qIEJhZG5lc3Mgb2YgcG9pbnRlciBjb252ZXJzaW9uICovCisjZGVmaW5lIFBPSU5URVJfQ09OVkVSU0lPTl9CQURORVNTICAgICAyCisvKiBCYWRuZXNzIG9mIGNvbnZlcnNpb24gb2YgcG9pbnRlciB0byB2b2lkIHBvaW50ZXIgKi8KKyNkZWZpbmUgVk9JRF9QVFJfQ09OVkVSU0lPTl9CQURORVNTICAgIDIKKy8qIEJhZG5lc3Mgb2YgY29udmVyaW5nIGRlcml2ZWQgdG8gYmFzZSBjbGFzcyAqLworI2RlZmluZSBCQVNFX0NPTlZFUlNJT05fQkFETkVTUyAgICAgICAgMgorCisvKiBOb24tc3RhbmRhcmQgY29udmVyc2lvbnMgYWxsb3dlZCBieSB0aGUgZGVidWdnZXIgKi8KKy8qIENvbnZlcnRpbmcgYSBwb2ludGVyIHRvIGFuIGludCBpcyB1c3VhbGx5IE9LICovCisjZGVmaW5lIE5TX1BPSU5URVJfQ09OVkVSU0lPTl9CQURORVNTIDEwCisKKworZXh0ZXJuIGludAorY29tcGFyZV9iYWRuZXNzIFBBUkFNUyAoKHN0cnVjdCBiYWRuZXNzX3ZlY3RvciAqLCBzdHJ1Y3QgYmFkbmVzc192ZWN0b3IgKikpOworCitleHRlcm4gc3RydWN0IGJhZG5lc3NfdmVjdG9yICoKK3JhbmtfZnVuY3Rpb24gUEFSQU1TICgoc3RydWN0IHR5cGUgKiosIGludCwgc3RydWN0IHR5cGUgKiosIGludCkpOworCitleHRlcm4gaW50CityYW5rX29uZV90eXBlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIHN0cnVjdCB0eXBlICopKTsKKworCisjaWYgTUFJTlRFTkFOQ0VfQ01EUworZXh0ZXJuIHZvaWQgcmVjdXJzaXZlX2R1bXBfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBpbnQpKTsKKyNlbmRpZgorCisvKiBwcmludGNtZC5jICovCisKK2V4dGVybiB2b2lkCitwcmludF9zY2FsYXJfZm9ybWF0dGVkIFBBUkFNUyAoKGNoYXIgKiwgc3RydWN0IHR5cGUgKiwgaW50LCBpbnQsIEdEQl9GSUxFICopKTsKKworZXh0ZXJuIGludCBjYW5fZGVyZWZlcmVuY2UgUEFSQU1TICgoc3RydWN0IHR5cGUgKikpOworCisjaWYgTUFJTlRFTkFOQ0VfQ01EUworZXh0ZXJuIHZvaWQgbWFpbnRlbmFuY2VfcHJpbnRfdHlwZSBQQVJBTVMgKChjaGFyICosIGludCkpOworI2VuZGlmCisKKy8qIHR5cGVwcmludC5jICovCisKK2V4dGVybiB2b2lkIHByaW50X3R5cGVfc2NhbGFyIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIExPTkdFU1QsIEdEQl9GSUxFICopKTsKKworI2VuZGlmCS8qIEdEQlRZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9nbnUtbmF0LmMgYi9nZGIvZ251LW5hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NmQ5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZ251LW5hdC5jCkBAIC0wLDAgKzEsMzIwMSBAQAorLyogSW50ZXJmYWNlIEdEQiB0byB0aGUgR05VIEh1cmQKKyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBXcml0dGVuIGJ5IE1pbGVzIEJhZGVyIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KKworICAgU29tZSBjb2RlIGFuZCBpZGVhcyBmcm9tIG0zLW5hdC5jIGJ5IEp1a2thIFZpcnRhbmVuIDxqdHZAaHV0LmZpPgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KKworLyogV2UgaW5jbHVkZSB0aGlzIGJlY2F1c2Ugd2UgZG9uJ3QgbmVlZCB0aGUgYWNjZXNzIG1hY3JvcyBhbmQgdGhleSBjb25mbGljdAorICAgd2l0aCBnZGIncyBkZWZpbml0aW9ucyAoaWNrKS4gIFRoaXMgaXMgdmVyeSBub24gc3RhbmRhcmQhICAqLworI2luY2x1ZGUgPHdhaXRmbGFncy5oPgorCisjaW5jbHVkZSA8bWFjaC5oPgorI2luY2x1ZGUgPG1hY2gvbWVzc2FnZS5oPgorI2luY2x1ZGUgPG1hY2gvbm90aWZ5Lmg+CisjaW5jbHVkZSA8bWFjaF9lcnJvci5oPgorI2luY2x1ZGUgPG1hY2gvZXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8bWFjaC92bV9hdHRyaWJ1dGVzLmg+CisKKyNpbmNsdWRlIDxodXJkL3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxodXJkL3Byb2Nlc3NfcmVxdWVzdC5oPgorI2luY2x1ZGUgPGh1cmQvbXNnLmg+CisjaW5jbHVkZSA8aHVyZC9tc2dfcmVxdWVzdC5oPgorI2luY2x1ZGUgPGh1cmQvc2lnbmFsLmg+CisjaW5jbHVkZSA8aHVyZC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxodXJkL3NpZ3ByZWVtcHQuaD4KKworI2luY2x1ZGUgPHBvcnRpbmZvLmg+CisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAid2FpdC5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKworI2luY2x1ZGUgImdudS1uYXQuaCIKKworI2luY2x1ZGUgImV4Y19yZXF1ZXN0X1MuaCIKKyNpbmNsdWRlICJub3RpZnlfUy5oIgorI2luY2x1ZGUgInByb2Nlc3NfcmVwbHlfUy5oIgorI2luY2x1ZGUgIm1zZ19yZXBseV9TLmgiCisjaW5jbHVkZSAiZXhjX3JlcXVlc3RfVS5oIgorI2luY2x1ZGUgIm1zZ19VLmgiCisKK3N0YXRpYyBwcm9jZXNzX3QgcHJvY19zZXJ2ZXIgPSBNQUNIX1BPUlRfTlVMTDsKKworLyogSWYgd2UndmUgc2VudCBhIHByb2Nfd2FpdF9yZXF1ZXN0IHRvIHRoZSBwcm9jIHNlcnZlciwgdGhlIHBpZCBvZiB0aGUKKyAgIHByb2Nlc3Mgd2UgYXNrZWQgYWJvdXQuICBXZSBjYW4gb25seSBldmVyIGhhdmUgb25lIG91dHN0YW5kaW5nLiAgKi8KK2ludCBwcm9jX3dhaXRfcGlkID0gMDsKKworLyogVGhlIG51bWJlciBvZiB3YWl0IHJlcXVlc3RzIHdlJ3ZlIHNlbnQsIGFuZCBleHBlY3QgcmVwbGllcyBmcm9tLiAgKi8KK2ludCBwcm9jX3dhaXRzX3BlbmRpbmcgPSAwOworCitpbnQgZ251X2RlYnVnX2ZsYWcgPSAwOworCisvKiBGb3J3YXJkIGRlY2xzICovCisKK2V4dGVybiBzdHJ1Y3QgdGFyZ2V0X29wcyBnbnVfb3BzOworZXh0ZXJuIGNoYXIgKnN0cmVycm9yKCk7CisKK2ludCBpbmZfdXBkYXRlX3Byb2NzIChzdHJ1Y3QgaW5mICppbmYpOworc3RydWN0IGluZiAqbWFrZV9pbmYgKCk7Cit2b2lkIGluZl9jbGVhcl93YWl0IChzdHJ1Y3QgaW5mICppbmYpOwordm9pZCBpbmZfY2xlYW51cCAoc3RydWN0IGluZiAqaW5mKTsKK3ZvaWQgaW5mX3N0YXJ0dXAgKHN0cnVjdCBpbmYgKmluZiwgaW50IHBpZCk7CitpbnQgaW5mX3VwZGF0ZV9zdXNwZW5kcyAoc3RydWN0IGluZiAqaW5mKTsKK3ZvaWQgaW5mX3NldF9waWQgKHN0cnVjdCBpbmYgKmluZiwgcGlkX3QgcGlkKTsKK3ZvaWQgaW5mX3ZhbGlkYXRlX3Byb2NzIChzdHJ1Y3QgaW5mICppbmYpOwordm9pZCBpbmZfc3RlYWxfZXhjX3BvcnRzIChzdHJ1Y3QgaW5mICppbmYpOwordm9pZCBpbmZfcmVzdG9yZV9leGNfcG9ydHMgKHN0cnVjdCBpbmYgKmluZik7CitzdHJ1Y3QgcHJvYyAqaW5mX3RpZF90b19wcm9jIChzdHJ1Y3QgaW5mICppbmYsIGludCB0aWQpOworaW5saW5lIHZvaWQgaW5mX3NldF90aHJlYWRzX3Jlc3VtZV9zYyAoc3RydWN0IGluZiAqaW5mLCAKKwkJCQkgICAgICAgc3RydWN0IHByb2MgKnJ1bl90aHJlYWQsIAorCQkJCSAgICAgICBpbnQgcnVuX290aGVycyk7CitpbmxpbmUgaW50IGluZl9zZXRfdGhyZWFkc19yZXN1bWVfc2NfZm9yX3NpZ25hbF90aHJlYWQgKHN0cnVjdCBpbmYgKmluZik7CitpbmxpbmUgdm9pZCBpbmZfc3VzcGVuZCAoc3RydWN0IGluZiAqaW5mKTsKK2lubGluZSB2b2lkIGluZl9yZXN1bWUgKHN0cnVjdCBpbmYgKmluZik7Cit2b2lkIGluZl9zZXRfc3RlcF90aHJlYWQgKHN0cnVjdCBpbmYgKmluZiwgc3RydWN0IHByb2MgKnByb2MpOwordm9pZCBpbmZfZGV0YWNoIChzdHJ1Y3QgaW5mICppbmYpOwordm9pZCBpbmZfYXR0YWNoIChzdHJ1Y3QgaW5mICppbmYsIGludCBwaWQpOwordm9pZCBpbmZfc2lnbmFsIChzdHJ1Y3QgaW5mICppbmYsIGVudW0gdGFyZ2V0X3NpZ25hbCBzaWcpOworCisjZGVmaW5lIGluZl9kZWJ1ZyhfaW5mLCBtc2csIGFyZ3MuLi4pIFwKKyAgZG8geyBzdHJ1Y3QgaW5mICpfX2luZiA9IChfaW5mKTsgXAorICAgICAgIGRlYnVnICgie2luZiAlZCAlcH06ICIgbXNnLCBfX2luZi0+cGlkLCBfX2luZiAsICMjYXJncyk7IH0gd2hpbGUgKDApCisKK3ZvaWQgcHJvY19hYm9ydCAoc3RydWN0IHByb2MgKnByb2MsIGludCBmb3JjZSk7Cit0aHJlYWRfc3RhdGVfdCBwcm9jX2dldF9zdGF0ZSAoc3RydWN0IHByb2MgKnByb2MsIGludCBmb3JjZSk7CitzdHJ1Y3QgcHJvYyAqbWFrZV9wcm9jIChzdHJ1Y3QgaW5mICppbmYsIG1hY2hfcG9ydF90IHBvcnQsIGludCB0aWQpOworc3RydWN0IHByb2MgKl9wcm9jX2ZyZWUgKHN0cnVjdCBwcm9jICpwcm9jKTsKK2ludCBwcm9jX3VwZGF0ZV9zYyAoc3RydWN0IHByb2MgKnByb2MpOworZXJyb3JfdCBwcm9jX2dldF9leGNlcHRpb25fcG9ydCAoc3RydWN0IHByb2MgKnByb2MsIG1hY2hfcG9ydF90ICpwb3J0KTsKK2Vycm9yX3QgcHJvY19zZXRfZXhjZXB0aW9uX3BvcnQgKHN0cnVjdCBwcm9jICpwcm9jLCBtYWNoX3BvcnRfdCBwb3J0KTsKK3N0YXRpYyBtYWNoX3BvcnRfdCBfcHJvY19nZXRfZXhjX3BvcnQgKHN0cnVjdCBwcm9jICpwcm9jKTsKK3ZvaWQgcHJvY19zdGVhbF9leGNfcG9ydCAoc3RydWN0IHByb2MgKnByb2MsIG1hY2hfcG9ydF90IGV4Y19wb3J0KTsKK3ZvaWQgcHJvY19yZXN0b3JlX2V4Y19wb3J0IChzdHJ1Y3QgcHJvYyAqcHJvYyk7CitpbnQgcHJvY190cmFjZSAoc3RydWN0IHByb2MgKnByb2MsIGludCBzZXQpOworY2hhciAqcHJvY19zdHJpbmcgKHN0cnVjdCBwcm9jICpwcm9jKTsKKworLyogRXZhbHVhdGUgUlBDX0VYUFIgaW4gYSBzY29wZSB3aXRoIHRoZSB2YXJpYWJsZXMgTVNHUE9SVCBhbmQgUkVGUE9SVCBib3VuZAorICAgdG8gSU5GJ3MgbXNnIHBvcnQgYW5kIHRhc2sgcG9ydCByZXNwZWN0aXZlbHkuICBJZiBpdCBoYXMgbm8gbXNnIHBvcnQsCisgICBFSUVJTyBpcyByZXR1cm5lZC4gIElORiBtdXN0IHJlZmVyIHRvIGEgcnVubmluZyBwcm9jZXNzISAgKi8KKyNkZWZpbmUgSU5GX01TR1BPUlRfUlBDKGluZiwgcnBjX2V4cHIpIFwKKyAgSFVSRF9NU0dQT1JUX1JQQyAocHJvY19nZXRtc2dwb3J0IChwcm9jX3NlcnZlciwgaW5mLT5waWQsICZtc2dwb3J0KSwgXAorCQkgICAgKHJlZnBvcnQgPSBpbmYtPnRhc2stPnBvcnQsIDApLCAwLCBcCisJCSAgICBtc2dwb3J0ID8gKHJwY19leHByKSA6IEVJRUlPKQorCisvKiBMaWtlIElORl9NU0dQT1JUX1JQQywgYnV0IHdpbGwgYWxzbyByZXN1bWUgdGhlIHNpZ25hbCB0aHJlYWQgdG8gZW5zdXJlCisgICB0aGVyZSdzIHNvbWVvbmUgYXJvdW5kIHRvIGRlYWwgd2l0aCB0aGUgUlBDIChhbmQgcmVzdXNwZW5kIHRoaW5ncworICAgYWZ0ZXJ3YXJkcykuICBUaGlzIGVmZmVjdHMgSU5GJ3MgdGhyZWFkcycgcmVzdW1lX3NjIGNvdW50LiAgKi8KKyNkZWZpbmUgSU5GX1JFU1VNRV9NU0dQT1JUX1JQQyhpbmYsIHJwY19leHByKSBcCisgIChpbmZfc2V0X3RocmVhZHNfcmVzdW1lX3NjX2Zvcl9zaWduYWxfdGhyZWFkIChpbmYpIFwKKyAgID8gKHsgZXJyb3JfdCBfX2U7IFwKKwlpbmZfcmVzdW1lIChpbmYpOyBcCisJX19lID0gSU5GX01TR1BPUlRfUlBDIChpbmYsIHJwY19leHByKTsgXAorCWluZl9zdXNwZW5kIChpbmYpOyBcCisJX19lOyB9KSBcCisgICA6IEVJRUlPKQorCisjZGVmaW5lIE1JR19TRVJWRVJfRElFRCBFTUlHX1NFUlZFUl9ESUVEIC8qIFhYWCAqLworDAorLyogVGhlIHN0YXRlIHBhc3NlZCBieSBhbiBleGNlcHRpb24gbWVzc2FnZS4gICovCitzdHJ1Y3QgZXhjX3N0YXRlCit7CisgIGludCBleGNlcHRpb247CQkvKiBUaGUgZXhjZXB0aW9uIGNvZGUgKi8KKyAgaW50IGNvZGUsIHN1YmNvZGU7CisgIG1hY2hfcG9ydF90IGhhbmRsZXI7CQkvKiBUaGUgcmVhbCBleGNlcHRpb24gcG9ydCB0byBoYW5kbGUgdGhpcy4gKi8KKyAgbWFjaF9wb3J0X3QgcmVwbHk7CQkvKiBUaGUgcmVwbHkgcG9ydCBmcm9tIHRoZSBleGNlcHRpb24gY2FsbC4gKi8KK307CisKKy8qIFRoZSByZXN1bHRzIG9mIHRoZSBsYXN0IHdhaXQgYW4gaW5mIGRpZC4gKi8KK3N0cnVjdCBpbmZfd2FpdAoreworICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgc3RhdHVzOyAvKiBUaGUgc3RhdHVzIHJldHVybmVkIHRvIGdkYi4gICovCisgIHN0cnVjdCBleGNfc3RhdGUgZXhjOwkJLyogVGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB1cyB0byByZXR1cm4uICovCisgIHN0cnVjdCBwcm9jICp0aHJlYWQ7CQkvKiBUaGUgdGhyZWFkIGluIHF1ZXN0aW9uLiAgKi8KKyAgaW50IHN1cHByZXNzOwkJCS8qIFNvbWV0aGluZyB0cml2aWFsIGhhcHBlbmVkLiAgKi8KK307CisKKy8qIFRoZSBzdGF0ZSBvZiBhbiBpbmZlcmlvci4gICovCitzdHJ1Y3QgaW5mCit7CisgIC8qIEZpZWxkcyBkZXNjcmliaW5nIHRoZSBjdXJyZW50IGluZmVyaW9yLiAgKi8KKworICBzdHJ1Y3QgcHJvYyAqdGFzazsJCS8qIFRoZSBtYWNoIHRhc2suICAgKi8KKyAgc3RydWN0IHByb2MgKnRocmVhZHM7CQkvKiBBIGxpbmtlZCBsaXN0IG9mIGFsbCB0aHJlYWRzIGluIFRBU0suICAqLworCisgIC8qIFRydWUgaWYgVEhSRUFEUyBuZWVkbid0IGJlIHZhbGlkYXRlZCBieSBxdWVyeWluZyB0aGUgdGFzay4gIFdlIGFzc3VtZSB0aGF0CisgICAgIHdlIGFuZCB0aGUgdGFzayBpbiBxdWVzdGlvbiBhcmUgdGhlIG9ubHkgb25lcyBmcm9iYmluZyB0aGUgdGhyZWFkIGxpc3QsCisgICAgIHNvIGFzIGxvbmcgYXMgd2UgZG9uJ3QgbGV0IGFueSBjb2RlIHJ1biwgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dAorICAgICBUSFJFQURTIGNoYW5naW5nLiAgKi8KKyAgaW50IHRocmVhZHNfdXBfdG9fZGF0ZTsKKworICBwaWRfdCBwaWQ7CQkJLyogVGhlIHJlYWwgc3lzdGVtIFBJRC4gKi8KKworICBzdHJ1Y3QgaW5mX3dhaXQgd2FpdDsJCS8qIFdoYXQgdG8gcmV0dXJuIGZyb20gdGFyZ2V0X3dhaXQuICAqLworCisgIC8qIE9uZSB0aHJlYWQgcHJvYyBpbiBJTkYgbWF5IGJlIGluIGBzaW5nbGUtc3RlcHBpbmcgbW9kZScuICBUaGlzIGlzIGl0LiAgKi8KKyAgc3RydWN0IHByb2MgKnN0ZXBfdGhyZWFkOworCisgIC8qIFRoZSB0aHJlYWQgd2UgdGhpbmsgaXMgdGhlIHNpZ25hbCB0aHJlYWQuICAqLworICBzdHJ1Y3QgcHJvYyAqc2lnbmFsX3RocmVhZDsKKworICBtYWNoX3BvcnRfdCBldmVudF9wb3J0OwkvKiBXaGVyZSB3ZSByZWNlaXZlIHZhcmlvdXMgbXNncy4gICovCisKKyAgLyogVHJ1ZSBpZiB3ZSB0aGluayBhdCBsZWFzdCBvbmUgdGhyZWFkIGluIHRoZSBpbmZlcmlvciBjb3VsZCBjdXJyZW50bHkgYmUKKyAgICAgcnVubmluZy4gICovCisgIGludCBydW5uaW5nIDogMTsKKworICAvKiBUcnVlIGlmIHRoZSBwcm9jZXNzIGhhcyBzdG9wcGVkIChpbiB0aGUgcHJvYyBzZXJ2ZXIgc2Vuc2UpLiAgTm90ZSB0aGF0CisgICAgIHNpbmNlIGEgcHJvYyBzZXJ2ZXIgYHN0b3AnIGxlYXZlcyB0aGUgc2lnbmFsIHRocmVhZCBydW5uaW5nLCB0aGUgaW5mIGNhbgorICAgICBiZSBSVU5OSU5HICYmIFNUT1BQRUQuLi4gICovCisgIGludCBzdG9wcGVkIDogMTsKKworICAvKiBUcnVlIGlmIHRoZSBpbmZlcmlvciBpcyB0cmFjZWQuICAqLworICBpbnQgdHJhY2VkIDogMTsKKworICAvKiBUcnVlIGlmIHdlIHNob3VsZG4ndCB0cnkgd2FpdGluZyBmb3IgdGhlIGluZmVyaW9yLCB1c3VhbGx5IGJlY2F1c2Ugd2UKKyAgICAgY2FuJ3QgZm9yIHNvbWUgcmVhc29uLiAgKi8KKyAgaW50IG5vX3dhaXQgOiAxOworCisgIC8qIFdoZW4gc3RhcnRpbmcgYSBuZXcgaW5mZXJpb3IsIHdlIGRvbid0IHRyeSB0byB2YWxpZGF0ZSB0aHJlYWRzIHVudGlsIGFsbAorICAgICB0aGUgcHJvcGVyIGV4ZWNzIGhhdmUgYmVlbiBkb25lLiAgVGhpcyBpcyBhIGNvdW50IG9mIGhvdyBtYW55IGV4ZWNzIHdlCisgICAgIGV4cGVjdCB0byBoYXBwZW4uICAqLworICB1bnNpZ25lZCBwZW5kaW5nX2V4ZWNzOworCisgIC8qIEZpZWxkcyBkZXNjcmliaW5nIGdsb2JhbCBzdGF0ZSAqLworCisgIC8qIFRoZSB0YXNrIHN1c3BlbmQgY291bnQgdXNlZCB3aGVuIGdkYiBoYXMgY29udHJvbC4gIFRoaXMgaXMgbm9ybWFsbHkgMSB0bworICAgICBtYWtlIHRoaW5ncyBlYXNpZXIgZm9yIHVzLCBidXQgc29tZXRpbWVzIChsaWtlIHdoZW4gYXR0YWNoaW5nIHRvIHZpdGFsCisgICAgIHN5c3RlbSBzZXJ2ZXJzKSBpdCBtYXkgYmUgZGVzaXJhYmxlIHRvIGxldCB0aGUgdGFzayBjb250aW51ZSB0byBydW4KKyAgICAgKHBhdXNpbmcgaW5kaXZpZHVhbCB0aHJlYWRzIGFzIG5lY2Vzc2FyeSkuICAqLworICBpbnQgcGF1c2Vfc2M7CisKKyAgLyogVGhlIHRhc2sgc3VzcGVuZCBjb3VudCBsZWZ0IHdoZW4gZGV0YWNoaW5nIGZyb20gYSB0YXNrLiAgKi8KKyAgaW50IGRldGFjaF9zYzsKKworICAvKiBUaGUgaW5pdGlhbCB2YWx1ZXMgdXNlZCBmb3IgdGhlIHJ1bl9zYyBhbmQgcGF1c2Vfc2Mgb2YgbmV3bHkgZGlzY292ZXJlZAorICAgICB0aHJlYWRzIC0tIHNlZSB0aGUgZGVmaW5pdGlvbiBvZiB0aG9zZSBmaWVsZHMgaW4gc3RydWN0IHByb2MuICAqLworICBpbnQgZGVmYXVsdF90aHJlYWRfcnVuX3NjOworICBpbnQgZGVmYXVsdF90aHJlYWRfcGF1c2Vfc2M7CisgIGludCBkZWZhdWx0X3RocmVhZF9kZXRhY2hfc2M7CisKKyAgLyogVHJ1ZSBpZiB0aGUgcHJvY2VzcyBzaG91bGQgYmUgdHJhY2VkIHdoZW4gc3RhcnRlZC9hdHRhY2hlZC4gIE5ld2x5CisgICAgIHN0YXJ0ZWQgcHJvY2Vzc2VzICptdXN0KiBiZSB0cmFjZWQgYXQgZmlyc3QgdG8gZXhlYyB0aGVtIHByb3Blcmx5LCBidXQKKyAgICAgaWYgdGhpcyBpcyBmYWxzZSwgdHJhY2luZyBpcyB0dXJuZWQgb2ZmIGFzIHNvb24gaXQgaGFzIGRvbmUgc28uICAqLworICBpbnQgd2FudF9zaWduYWxzOworCisgIC8qIFRydWUgaWYgZXhjZXB0aW9ucyBmcm9tIHRoZSBpbmZlcmlvciBwcm9jZXNzIHNob3VsZCBiZSB0cmFwcGVkLiAgVGhpcworICAgICBtdXN0IGJlIG9uIHRvIHVzZSBicmVha3BvaW50cy4gICovCisgIGludCB3YW50X2V4Y2VwdGlvbnM7Cit9OworCisKK2ludCBfX3Byb2NfcGlkIChzdHJ1Y3QgcHJvYyAqcHJvYykKK3sKKyAgcmV0dXJuIHByb2MtPmluZi0+cGlkOworfQorDAorLyogVXBkYXRlIFBST0MncyByZWFsIHN1c3BlbmQgY291bnQgdG8gbWF0Y2ggaXQncyBkZXNpcmVkIG9uZS4gIFJldHVybnMgdHJ1ZQorICAgaWYgd2UgdGhpbmsgUFJPQyBpcyBub3cgaW4gYSBydW5uYWJsZSBzdGF0ZS4gICovCitpbnQKK3Byb2NfdXBkYXRlX3NjIChzdHJ1Y3QgcHJvYyAqcHJvYykKK3sKKyAgaW50IHJ1bm5pbmc7CisgIGludCBlcnIgPSAgMDsKKyAgaW50IGRlbHRhID0gcHJvYy0+c2MgLSBwcm9jLT5jdXJfc2M7CisKKyAgaWYgKGRlbHRhKQorICAgIHByb2NfZGVidWcgKHByb2MsICJzYzogJWQgLS0+ICVkIiwgcHJvYy0+Y3VyX3NjLCBwcm9jLT5zYyk7CisKKyAgaWYgKHByb2MtPnNjID09IDAgJiYgcHJvYy0+c3RhdGVfY2hhbmdlZCkKKyAgICAvKiBTaW5jZSBQUk9DIG1heSBzdGFydCBydW5uaW5nLCB3ZSBtdXN0IHdyaXRlIGJhY2sgYW55IHN0YXRlIGNoYW5nZXMuICovCisgICAgeworICAgICAgYXNzZXJ0IChwcm9jX2lzX3RocmVhZCAocHJvYykpOworICAgICAgcHJvY19kZWJ1ZyAocHJvYywgInN0b3JpbmcgYmFjayBjaGFuZ2VkIHRocmVhZCBzdGF0ZSIpOworICAgICAgZXJyID0gdGhyZWFkX3NldF9zdGF0ZSAocHJvYy0+cG9ydCwgVEhSRUFEX1NUQVRFX0ZMQVZPUiwKKwkJCSAgICAgICh0aHJlYWRfc3RhdGVfdCkmcHJvYy0+c3RhdGUsIFRIUkVBRF9TVEFURV9TSVpFKTsKKyAgICAgIGlmICghIGVycikKKwlwcm9jLT5zdGF0ZV9jaGFuZ2VkID0gMDsKKyAgICB9CisKKyAgaWYgKGRlbHRhID4gMCkKKyAgICB3aGlsZSAoZGVsdGEtLSA+IDAgJiYgIWVycikKKyAgICAgIGlmIChwcm9jX2lzX3Rhc2sgKHByb2MpKQorCWVyciA9IHRhc2tfc3VzcGVuZCAocHJvYy0+cG9ydCk7CisgICAgICBlbHNlCisJZXJyID0gdGhyZWFkX3N1c3BlbmQgKHByb2MtPnBvcnQpOworICBlbHNlCisgICAgd2hpbGUgKGRlbHRhKysgPCAwICYmICFlcnIpCisgICAgICBpZiAocHJvY19pc190YXNrIChwcm9jKSkKKwllcnIgPSB0YXNrX3Jlc3VtZSAocHJvYy0+cG9ydCk7CisgICAgICBlbHNlCisJZXJyID0gdGhyZWFkX3Jlc3VtZSAocHJvYy0+cG9ydCk7CisKKyAgaWYgKCEgZXJyKQorICAgIHByb2MtPmN1cl9zYyA9IHByb2MtPnNjOworCisgIC8qIElmIHdlIGdvdCBhbiBlcnJvciwgdGhlbiB0aGUgdGFzay90aHJlYWQgaGFzIGRpc2FwcGVhcmVkLiAgKi8KKyAgcnVubmluZyA9ICFlcnIgJiYgcHJvYy0+c2MgPT0gMDsKKworICBwcm9jX2RlYnVnIChwcm9jLCAiaXMgJXMiLCBlcnIgPyAiZGVhZCIgOiBydW5uaW5nID8gInJ1bm5pbmciIDogInN1c3BlbmRlZCIpOworICBpZiAoZXJyKQorICAgIHByb2NfZGVidWcgKHByb2MsICJlcnIgPSAlcyIsIHN0cmVycm9yIChlcnIpKTsKKworICBpZiAocnVubmluZykKKyAgICB7CisgICAgICBwcm9jLT5hYm9ydGVkID0gMDsKKyAgICAgIHByb2MtPnN0YXRlX3ZhbGlkID0gcHJvYy0+c3RhdGVfY2hhbmdlZCA9IDA7CisgICAgICBwcm9jLT5mZXRjaGVkX3JlZ3MgPSAwOworICAgIH0KKworICByZXR1cm4gcnVubmluZzsKK30KKwwKKy8qIFRocmVhZF9hYm9ydCBpcyBjYWxsZWQgb24gUFJPQyBpZiBuZWVkZWQuICBQUk9DIG11c3QgYmUgYSB0aHJlYWQgcHJvYy4KKyAgIElmIFBST0MgaXMgZGVlbWVkIGBwcmVjaW91cycsIHRoZW4gbm90aGluZyBpcyBkb25lIHVubGVzcyBGT1JDRSBpcyB0cnVlLgorICAgSW4gcGFydGljdWxhciwgYSB0aHJlYWQgaXMgcHJlY2lvdXMgaWYgaXQncyBydW5uaW5nIChpbiB3aGljaCBjYXNlIGZvcmNpbmcKKyAgIGl0IGluY2x1ZGVzIHN1c3BlbmRpbmcgaXQgZmlyc3QpLCBvciBpZiBpdCBoYXMgYW4gZXhjZXB0aW9uIHBlbmRpbmcuICAqLwordm9pZAorcHJvY19hYm9ydCAoc3RydWN0IHByb2MgKnByb2MsIGludCBmb3JjZSkKK3sKKyAgYXNzZXJ0IChwcm9jX2lzX3RocmVhZCAocHJvYykpOworCisgIGlmICghIHByb2MtPmFib3J0ZWQpCisgICAgeworICAgICAgc3RydWN0IGluZiAqaW5mID0gcHJvYy0+aW5mOworICAgICAgaW50IHJ1bm5pbmcgPSAocHJvYy0+Y3VyX3NjID09IDAgJiYgaW5mLT50YXNrLT5jdXJfc2MgPT0gMCk7CisKKyAgICAgIGlmIChydW5uaW5nICYmIGZvcmNlKQorCXsKKwkgIHByb2MtPnNjID0gMTsKKwkgIGluZl91cGRhdGVfc3VzcGVuZHMgKHByb2MtPmluZik7CisJICBydW5uaW5nID0gMDsKKwkgIHdhcm5pbmcgKCJTdG9wcGVkICVzLiIsIHByb2Nfc3RyaW5nIChwcm9jKSk7CisJfQorICAgICAgZWxzZSBpZiAocHJvYyA9PSBpbmYtPndhaXQudGhyZWFkICYmIGluZi0+d2FpdC5leGMucmVwbHkgJiYgIWZvcmNlKQorCS8qIEFuIGV4Y2VwdGlvbiBpcyBwZW5kaW5nIG9uIFBST0MsIHdoaWNoIGRvbid0IG1lc3Mgd2l0aC4gICovCisJcnVubmluZyA9IDE7CisKKyAgICAgIGlmICghIHJ1bm5pbmcpCisJLyogV2Ugb25seSBhYm9ydCB0aGUgdGhyZWFkIGlmIGl0J3Mgbm90IGFjdHVhbGx5IHJ1bm5pbmcuICAqLworCXsKKwkgIHRocmVhZF9hYm9ydCAocHJvYy0+cG9ydCk7CisJICBwcm9jX2RlYnVnIChwcm9jLCAiYWJvcnRlZCIpOworCSAgcHJvYy0+YWJvcnRlZCA9IDE7CisJfQorICAgICAgZWxzZQorCXByb2NfZGVidWcgKHByb2MsICJub3QgYWJvcnRpbmciKTsKKyAgICB9Cit9CisKKy8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzdGF0ZSBmaWVsZCBpbiBQUk9DIGlzIHVwIHRvIGRhdGUsIGFuZCByZXR1cm4gYSBwb2ludGVyCisgICB0byBpdCwgb3IgMCBpZiBzb21ldGhpbmcgaXMgd3JvbmcuICBJZiBXSUxMX01PRElGWSBpcyB0cnVlLCBtYWtlcyBzdXJlCisgICB0aGF0IHRoZSB0aHJlYWQgaXMgc3RvcHBlZCBhbmQgYWJvcnRlZCBmaXJzdCwgYW5kIHNldHMgdGhlIHN0YXRlX2NoYW5nZWQKKyAgIGZpZWxkIGluIFBST0MgdG8gdHJ1ZS4gICovCit0aHJlYWRfc3RhdGVfdAorcHJvY19nZXRfc3RhdGUgKHN0cnVjdCBwcm9jICpwcm9jLCBpbnQgd2lsbF9tb2RpZnkpCit7CisgIGludCB3YXNfYWJvcnRlZCA9IHByb2MtPmFib3J0ZWQ7CisKKyAgcHJvY19kZWJ1ZyAocHJvYywgInVwZGF0aW5nIHN0YXRlIGluZm8lcyIsCisJICAgICAgd2lsbF9tb2RpZnkgPyAiICh3aXRoIGludGVudGlvbiB0byBtb2RpZnkpIiA6ICIiKTsKKworICBwcm9jX2Fib3J0IChwcm9jLCB3aWxsX21vZGlmeSk7CisKKyAgaWYgKCEgd2FzX2Fib3J0ZWQgJiYgcHJvYy0+YWJvcnRlZCkKKyAgICAvKiBQUk9DJ3Mgc3RhdGUgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB3ZSBsYXN0IGZldGNoZWQgaXQuICAqLworICAgIHByb2MtPnN0YXRlX3ZhbGlkID0gMDsKKworICBpZiAoISBwcm9jLT5zdGF0ZV92YWxpZCkKKyAgICB7CisgICAgICBtYWNoX21zZ190eXBlX251bWJlcl90IHN0YXRlX3NpemUgPSBUSFJFQURfU1RBVEVfU0laRTsKKyAgICAgIGVycm9yX3QgZXJyID0KKwl0aHJlYWRfZ2V0X3N0YXRlIChwcm9jLT5wb3J0LCBUSFJFQURfU1RBVEVfRkxBVk9SLAorCQkJICAodGhyZWFkX3N0YXRlX3QpJnByb2MtPnN0YXRlLCAmc3RhdGVfc2l6ZSk7CisgICAgICBwcm9jX2RlYnVnIChwcm9jLCAiZ2V0dGluZyB0aHJlYWQgc3RhdGUiKTsKKyAgICAgIHByb2MtPnN0YXRlX3ZhbGlkID0gIWVycjsKKyAgICB9CisKKyAgaWYgKHByb2MtPnN0YXRlX3ZhbGlkKQorICAgIHsKKyAgICAgIGlmICh3aWxsX21vZGlmeSkKKwlwcm9jLT5zdGF0ZV9jaGFuZ2VkID0gMTsKKyAgICAgIHJldHVybiAodGhyZWFkX3N0YXRlX3QpJnByb2MtPnN0YXRlOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAwOworfQorDAorLyogU2V0IFBPUlQgdG8gUFJPQydzIGV4Y2VwdGlvbiBwb3J0LiAgKi8KK2Vycm9yX3QKK3Byb2NfZ2V0X2V4Y2VwdGlvbl9wb3J0IChzdHJ1Y3QgcHJvYyAqcHJvYywgbWFjaF9wb3J0X3QgKnBvcnQpCit7CisgIGlmIChwcm9jX2lzX3Rhc2sgKHByb2MpKQorICAgIHJldHVybiB0YXNrX2dldF9leGNlcHRpb25fcG9ydCAocHJvYy0+cG9ydCwgcG9ydCk7CisgIGVsc2UKKyAgICByZXR1cm4gdGhyZWFkX2dldF9leGNlcHRpb25fcG9ydCAocHJvYy0+cG9ydCwgcG9ydCk7Cit9CisKKy8qIFNldCBQUk9DJ3MgZXhjZXB0aW9uIHBvcnQgdG8gUE9SVC4gICovCitlcnJvcl90Citwcm9jX3NldF9leGNlcHRpb25fcG9ydCAoc3RydWN0IHByb2MgKnByb2MsIG1hY2hfcG9ydF90IHBvcnQpCit7CisgIHByb2NfZGVidWcgKHByb2MsICJzZXR0aW5nIGV4Y2VwdGlvbiBwb3J0OiAlZCIsIHBvcnQpOworICBpZiAocHJvY19pc190YXNrIChwcm9jKSkKKyAgICByZXR1cm4gdGFza19zZXRfZXhjZXB0aW9uX3BvcnQgKHByb2MtPnBvcnQsIHBvcnQpOworICBlbHNlCisgICAgcmV0dXJuIHRocmVhZF9zZXRfZXhjZXB0aW9uX3BvcnQgKHByb2MtPnBvcnQsIHBvcnQpOworfQorCisvKiBHZXQgUFJPQydzIGV4Y2VwdGlvbiBwb3J0LCBjbGVhbmluZyB1cCBhIGJpdCBpZiBwcm9jIGhhcyBkaWVkLiAgKi8KK3N0YXRpYyBtYWNoX3BvcnRfdAorX3Byb2NfZ2V0X2V4Y19wb3J0IChzdHJ1Y3QgcHJvYyAqcHJvYykKK3sKKyAgbWFjaF9wb3J0X3QgZXhjX3BvcnQ7CisgIGVycm9yX3QgZXJyID0gcHJvY19nZXRfZXhjZXB0aW9uX3BvcnQgKHByb2MsICZleGNfcG9ydCk7CisKKyAgaWYgKGVycikKKyAgICAvKiBQUk9DIG11c3QgYmUgZGVhZC4gICovCisgICAgeworICAgICAgaWYgKHByb2MtPmV4Y19wb3J0KQorCW1hY2hfcG9ydF9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwgcHJvYy0+ZXhjX3BvcnQpOworICAgICAgcHJvYy0+ZXhjX3BvcnQgPSBNQUNIX1BPUlRfTlVMTDsKKyAgICAgIGlmIChwcm9jLT5zYXZlZF9leGNfcG9ydCkKKwltYWNoX3BvcnRfZGVhbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYgKCksIHByb2MtPnNhdmVkX2V4Y19wb3J0KTsKKyAgICAgIHByb2MtPnNhdmVkX2V4Y19wb3J0ID0gTUFDSF9QT1JUX05VTEw7CisgICAgfQorCisgIHJldHVybiBleGNfcG9ydDsKK30KKworLyogUmVwbGFjZSBQUk9DJ3MgZXhjZXB0aW9uIHBvcnQgd2l0aCBFWENfUE9SVCwgdW5sZXNzIGl0J3MgYWxyZWFkeSBiZWVuCisgICBkb25lLiAgU3Rhc2ggYXdheSBhbnkgZXhpc3RpbmcgZXhjZXB0aW9uIHBvcnQgc28gd2UgY2FuIHJlc3RvcmUgaXQgbGF0ZXIuICovCit2b2lkCitwcm9jX3N0ZWFsX2V4Y19wb3J0IChzdHJ1Y3QgcHJvYyAqcHJvYywgbWFjaF9wb3J0X3QgZXhjX3BvcnQpCit7CisgIG1hY2hfcG9ydF90IGN1cl9leGNfcG9ydCA9IF9wcm9jX2dldF9leGNfcG9ydCAocHJvYyk7CisKKyAgaWYgKGN1cl9leGNfcG9ydCkKKyAgICB7CisgICAgICBlcnJvcl90IGVycjsKKworICAgICAgcHJvY19kZWJ1ZyAocHJvYywgImluc2VydGluZyBleGNlcHRpb24gcG9ydDogJWQiLCBleGNfcG9ydCk7CisKKyAgICAgIGlmIChjdXJfZXhjX3BvcnQgIT0gZXhjX3BvcnQpCisJLyogUHV0IGluIG91ciBleGNlcHRpb24gcG9ydC4gICovCisJZXJyID0gcHJvY19zZXRfZXhjZXB0aW9uX3BvcnQgKHByb2MsIGV4Y19wb3J0KTsKKworICAgICAgaWYgKGVyciB8fCBjdXJfZXhjX3BvcnQgPT0gcHJvYy0+ZXhjX3BvcnQpCisJLyogV2UgcHJldmlvdXNseSBzZXQgdGhlIGV4Y2VwdGlvbiBwb3J0LCBhbmQgaXQncyBzdGlsbCBzZXQuICBTbyB3ZQorCSAgIGp1c3Qga2VlcCB0aGUgb2xkIHNhdmVkIHBvcnQgd2hpY2ggaXMgd2hhdCB0aGUgcHJvYyBzZXQuICAqLworCXsKKwkgIGlmIChjdXJfZXhjX3BvcnQpCisJICAgIG1hY2hfcG9ydF9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwgY3VyX2V4Y19wb3J0KTsKKwl9CisgICAgICBlbHNlCisJLyogS2VlcCBhIGNvcHkgb2YgUFJPQydzIG9sZCBleGNlcHRpb24gcG9ydCBzbyBpdCBjYW4gYmUgcmVzdG9yZWQuICovCisJeworCSAgaWYgKHByb2MtPnNhdmVkX2V4Y19wb3J0KQorCSAgICBtYWNoX3BvcnRfZGVhbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYgKCksIHByb2MtPnNhdmVkX2V4Y19wb3J0KTsKKwkgIHByb2MtPnNhdmVkX2V4Y19wb3J0ID0gY3VyX2V4Y19wb3J0OworCX0KKworICAgICAgcHJvY19kZWJ1ZyAocHJvYywgInNhdmVkIGV4Y2VwdGlvbiBwb3J0OiAlZCIsIHByb2MtPnNhdmVkX2V4Y19wb3J0KTsKKworICAgICAgaWYgKCFlcnIpCisJcHJvYy0+ZXhjX3BvcnQgPSBleGNfcG9ydDsKKyAgICAgIGVsc2UKKwl3YXJuaW5nICgiRXJyb3Igc2V0dGluZyBleGNlcHRpb24gcG9ydCBmb3IgJXM6ICVzIiwKKwkJIHByb2Nfc3RyaW5nIChwcm9jKSwgc3RyZXJyb3IgKGVycikpOworICAgIH0KK30KKworLyogSWYgd2UgcHJldmlvdXNseSByZXBsYWNlZCBQUk9DJ3MgZXhjZXB0aW9uIHBvcnQsIHB1dCBiYWNrIHdoYXQgd2UKKyAgIGZvdW5kIHRoZXJlIGF0IHRoZSB0aW1lLCB1bmxlc3MgKm91ciogZXhjZXB0aW9uIHBvcnQgaGFzIHNpbmNlIGJlZW4KKyAgIG92ZXJ3cml0dGVuLCBpbiB3aGljaCBjYXNlIHdobyBrbm93cyB3aGF0J3MgZ29pbmcgb24uICAqLwordm9pZAorcHJvY19yZXN0b3JlX2V4Y19wb3J0IChzdHJ1Y3QgcHJvYyAqcHJvYykKK3sKKyAgbWFjaF9wb3J0X3QgY3VyX2V4Y19wb3J0ID0gX3Byb2NfZ2V0X2V4Y19wb3J0IChwcm9jKTsKKworICBpZiAoY3VyX2V4Y19wb3J0KQorICAgIHsKKyAgICAgIGVycm9yX3QgZXJyID0gMDsKKworICAgICAgcHJvY19kZWJ1ZyAocHJvYywgInJlc3RvcmluZyByZWFsIGV4Y2VwdGlvbiBwb3J0Iik7CisKKyAgICAgIGlmIChwcm9jLT5leGNfcG9ydCA9PSBjdXJfZXhjX3BvcnQpCisJLyogT3VyJ3MgaXMgc3RpbGwgdGhlcmUuICAqLworCWVyciA9IHByb2Nfc2V0X2V4Y2VwdGlvbl9wb3J0IChwcm9jLCBwcm9jLT5zYXZlZF9leGNfcG9ydCk7CisKKyAgICAgIGlmIChwcm9jLT5zYXZlZF9leGNfcG9ydCkKKwltYWNoX3BvcnRfZGVhbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYgKCksIHByb2MtPnNhdmVkX2V4Y19wb3J0KTsKKyAgICAgIHByb2MtPnNhdmVkX2V4Y19wb3J0ID0gTUFDSF9QT1JUX05VTEw7CisKKyAgICAgIGlmICghZXJyKQorCXByb2MtPmV4Y19wb3J0ID0gTUFDSF9QT1JUX05VTEw7CisgICAgICBlbHNlCisJd2FybmluZyAoIkVycm9yIHNldHRpbmcgZXhjZXB0aW9uIHBvcnQgZm9yICVzOiAlcyIsCisJCSBwcm9jX3N0cmluZyAocHJvYyksIHN0cmVycm9yIChlcnIpKTsKKyAgICB9Cit9CisMCisvKiBUdXJucyBoYXJkd2FyZSB0cmFjaW5nIGluIFBST0Mgb24gb3Igb2ZmIHdoZW4gU0VUIGlzIHRydWUgb3IgZmFsc2UsCisgICByZXNwZWN0aXZlbHkuICBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4gICovCitpbnQKK3Byb2NfdHJhY2UgKHN0cnVjdCBwcm9jICpwcm9jLCBpbnQgc2V0KQoreworICB0aHJlYWRfc3RhdGVfdCBzdGF0ZSA9IHByb2NfZ2V0X3N0YXRlIChwcm9jLCAxKTsKKworICBpZiAoISBzdGF0ZSkKKyAgICByZXR1cm4gMDsJCQkvKiB0aGUgdGhyZWFkIG11c3QgYmUgZGVhZC4gICovCisKKyAgcHJvY19kZWJ1ZyAocHJvYywgInRyYWNpbmcgJXMiLCBzZXQgPyAib24iIDogIm9mZiIpOworICAKKyAgaWYgKHNldCkKKyAgICB7CisgICAgICAvKiBYWFggV2UgZG9uJ3QgZ2V0IHRoZSBleGNlcHRpb24gdW5sZXNzIHRoZSB0aHJlYWQgaGFzIGl0cyBvd24KKwkgZXhjZXB0aW9uIHBvcnQ/Pz8/ICovCisgICAgICBpZiAocHJvYy0+ZXhjX3BvcnQgPT0gTUFDSF9QT1JUX05VTEwpCisJcHJvY19zdGVhbF9leGNfcG9ydCAocHJvYywgcHJvYy0+aW5mLT5ldmVudF9wb3J0KTsKKyAgICAgIFRIUkVBRF9TVEFURV9TRVRfVFJBQ0VEIChzdGF0ZSk7CisgICAgfQorICBlbHNlCisgICAgVEhSRUFEX1NUQVRFX0NMRUFSX1RSQUNFRCAoc3RhdGUpOworCisgIHJldHVybiAxOworfQorDAorLyogQSB2YXJpYWJsZSBmcm9tIHdoaWNoIHRvIGFzc2lnbiBuZXcgVElEcy4gICovCitzdGF0aWMgaW50IG5leHRfdGhyZWFkX2lkID0gMTsKKworLyogUmV0dXJucyBhIG5ldyBwcm9jIHN0cnVjdHVyZSB3aXRoIHRoZSBnaXZlbiBmaWVsZHMuICBBbHNvIGFkZHMgYQorICAgbm90aWZpY2F0aW9uIGZvciBQT1JUIGJlY29taW5nIGRlYWQgdG8gYmUgc2VudCB0byBJTkYncyBub3RpZnkgcG9ydC4gICovCitzdHJ1Y3QgcHJvYyAqCittYWtlX3Byb2MgKHN0cnVjdCBpbmYgKmluZiwgbWFjaF9wb3J0X3QgcG9ydCwgaW50IHRpZCkKK3sKKyAgZXJyb3JfdCBlcnI7CisgIG1hY2hfcG9ydF90IHByZXZfcG9ydCA9IE1BQ0hfUE9SVF9OVUxMOworICBzdHJ1Y3QgcHJvYyAqcHJvYyA9IG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcHJvYykpOworCisgIHByb2MtPnBvcnQgPSBwb3J0OworICBwcm9jLT50aWQgPSB0aWQ7CisgIHByb2MtPmluZiA9IGluZjsKKyAgcHJvYy0+bmV4dCA9IDA7CisgIHByb2MtPnNhdmVkX2V4Y19wb3J0ID0gTUFDSF9QT1JUX05VTEw7CisgIHByb2MtPmV4Y19wb3J0ID0gTUFDSF9QT1JUX05VTEw7CisKKyAgcHJvYy0+c2MgPSAwOworICBwcm9jLT5jdXJfc2MgPSAwOworCisgIC8qIE5vdGUgdGhhdCB0aGVzZSBhcmUgYWxsIHRoZSB2YWx1ZXMgZm9yIHRocmVhZHM7IHRoZSB0YXNrIHNpbXBseSB1c2VzIHRoZQorICAgICBjb3JyZXNwb25kaW5nIGZpZWxkIGluIElORiBkaXJlY3RseS4gICovCisgIHByb2MtPnJ1bl9zYyA9IGluZi0+ZGVmYXVsdF90aHJlYWRfcnVuX3NjOworICBwcm9jLT5wYXVzZV9zYyA9IGluZi0+ZGVmYXVsdF90aHJlYWRfcGF1c2Vfc2M7CisgIHByb2MtPmRldGFjaF9zYyA9IGluZi0+ZGVmYXVsdF90aHJlYWRfZGV0YWNoX3NjOworICBwcm9jLT5yZXN1bWVfc2MgPSBwcm9jLT5ydW5fc2M7CisKKyAgcHJvYy0+YWJvcnRlZCA9IDA7CisgIHByb2MtPmRlYWQgPSAwOworICBwcm9jLT5zdGF0ZV92YWxpZCA9IDA7CisgIHByb2MtPnN0YXRlX2NoYW5nZWQgPSAwOworCisgIHByb2NfZGVidWcgKHByb2MsICJpcyBuZXciKTsKKworICAvKiBHZXQgbm90aWZpZWQgd2hlbiB0aGluZ3MgZGllLiAgKi8KKyAgZXJyID0KKyAgICBtYWNoX3BvcnRfcmVxdWVzdF9ub3RpZmljYXRpb24gKG1hY2hfdGFza19zZWxmKCksIHBvcnQsCisJCQkJICAgIE1BQ0hfTk9USUZZX0RFQURfTkFNRSwgMSwKKwkJCQkgICAgaW5mLT5ldmVudF9wb3J0LAorCQkJCSAgICBNQUNIX01TR19UWVBFX01BS0VfU0VORF9PTkNFLAorCQkJCSAgICAmcHJldl9wb3J0KTsKKyAgaWYgKGVycikKKyAgICB3YXJuaW5nICgiQ291bGRuJ3QgcmVxdWVzdCBub3RpZmljYXRpb24gZm9yIHBvcnQgJWQ6ICVzIiwKKwkgICAgIHBvcnQsIHN0cmVycm9yIChlcnIpKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHByb2NfZGVidWcgKHByb2MsICJub3RpZmljYXRpb25zIHRvOiAlZCIsIGluZi0+ZXZlbnRfcG9ydCk7CisgICAgICBpZiAocHJldl9wb3J0ICE9IE1BQ0hfUE9SVF9OVUxMKQorCW1hY2hfcG9ydF9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwgcHJldl9wb3J0KTsKKyAgICB9CisKKyAgaWYgKGluZi0+d2FudF9leGNlcHRpb25zKQorICAgIGlmIChwcm9jX2lzX3Rhc2sgKHByb2MpKQorICAgICAgLyogTWFrZSB0aGUgdGFzayBleGNlcHRpb24gcG9ydCBwb2ludCB0byB1cy4gICovCisgICAgICBwcm9jX3N0ZWFsX2V4Y19wb3J0IChwcm9jLCBpbmYtPmV2ZW50X3BvcnQpOworICAgIGVsc2UKKyAgICAgIC8qIEp1c3QgY2xlYXIgdGhyZWFkIGV4Y2VwdGlvbiBwb3J0cyAtLSB0aGV5IGRlZmF1bHQgdG8gdGhlIHRhc2sgb25lLiAgKi8KKyAgICAgIHByb2Nfc3RlYWxfZXhjX3BvcnQgKHByb2MsIE1BQ0hfUE9SVF9OVUxMKTsKKworICByZXR1cm4gcHJvYzsKK30KKworLyogRnJlZXMgUFJPQyBhbmQgYW55IHJlc291cmNlcyBpdCB1c2VzLCBhbmQgcmV0dXJucyB0aGUgdmFsdWUgb2YgUFJPQydzIAorICAgbmV4dCBmaWVsZC4gICovCitzdHJ1Y3QgcHJvYyAqCitfcHJvY19mcmVlIChzdHJ1Y3QgcHJvYyAqcHJvYykKK3sKKyAgc3RydWN0IGluZiAqaW5mID0gcHJvYy0+aW5mOworICBzdHJ1Y3QgcHJvYyAqbmV4dCA9IHByb2MtPm5leHQ7CisKKyAgcHJvY19kZWJ1ZyAocHJvYywgImZyZWVpbmcuLi4iKTsKKworICBpZiAocHJvYyA9PSBpbmYtPnN0ZXBfdGhyZWFkKQorICAgIC8qIFR1cm4gb2ZmIHNpbmdsZSBzdGVwcGluZy4gICovCisgICAgaW5mX3NldF9zdGVwX3RocmVhZCAoaW5mLCAwKTsKKyAgaWYgKHByb2MgPT0gaW5mLT53YWl0LnRocmVhZCkKKyAgICBpbmZfY2xlYXJfd2FpdCAoaW5mKTsKKyAgaWYgKHByb2MgPT0gaW5mLT5zaWduYWxfdGhyZWFkKQorICAgIGluZi0+c2lnbmFsX3RocmVhZCA9IDA7CisKKyAgaWYgKHByb2MtPnBvcnQgIT0gTUFDSF9QT1JUX05VTEwpCisgICAgeworICAgICAgaWYgKHByb2MtPmV4Y19wb3J0ICE9IE1BQ0hfUE9SVF9OVUxMKQorCS8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbiBwb3J0LiAgKi8KKwlwcm9jX3Jlc3RvcmVfZXhjX3BvcnQgKHByb2MpOworICAgICAgaWYgKHByb2MtPmN1cl9zYyAhPSAwKQorCS8qIFJlc3VtZSB0aGUgdGhyZWFkL3Rhc2suICAqLworCXsKKwkgIHByb2MtPnNjID0gMDsKKwkgIHByb2NfdXBkYXRlX3NjIChwcm9jKTsKKwl9CisgICAgICBtYWNoX3BvcnRfZGVhbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYgKCksIHByb2MtPnBvcnQpOworICAgIH0KKworICBmcmVlIChwcm9jKTsKKyAgcmV0dXJuIG5leHQ7Cit9CisMCitzdHJ1Y3QgaW5mICptYWtlX2luZiAoKQoreworICBzdHJ1Y3QgaW5mICppbmYgPSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGluZikpOworCisgIGlmICghaW5mKQorICAgIHJldHVybiAwOworCisgIGluZi0+dGFzayA9IDA7CisgIGluZi0+dGhyZWFkcyA9IDA7CisgIGluZi0+dGhyZWFkc191cF90b19kYXRlID0gMDsKKyAgaW5mLT5waWQgPSAwOworICBpbmYtPndhaXQuc3RhdHVzLmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1BVUklPVVM7CisgIGluZi0+d2FpdC50aHJlYWQgPSAwOworICBpbmYtPndhaXQuZXhjLmhhbmRsZXIgPSBNQUNIX1BPUlRfTlVMTDsKKyAgaW5mLT53YWl0LmV4Yy5yZXBseSA9IE1BQ0hfUE9SVF9OVUxMOworICBpbmYtPnN0ZXBfdGhyZWFkID0gMDsKKyAgaW5mLT5zaWduYWxfdGhyZWFkID0gMDsKKyAgaW5mLT5ldmVudF9wb3J0ID0gTUFDSF9QT1JUX05VTEw7CisgIGluZi0+c3RvcHBlZCA9IDA7CisgIGluZi0+cnVubmluZyA9IDA7CisgIGluZi0+dHJhY2VkID0gMDsKKyAgaW5mLT5ub193YWl0ID0gMDsKKyAgaW5mLT5wZW5kaW5nX2V4ZWNzID0gMDsKKyAgaW5mLT5wYXVzZV9zYyA9IDE7CisgIGluZi0+ZGV0YWNoX3NjID0gMDsKKyAgaW5mLT5kZWZhdWx0X3RocmVhZF9ydW5fc2MgPSAwOworICBpbmYtPmRlZmF1bHRfdGhyZWFkX3BhdXNlX3NjID0gMDsKKyAgaW5mLT5kZWZhdWx0X3RocmVhZF9kZXRhY2hfc2MgPSAwOworICBpbmYtPndhbnRfc2lnbmFscyA9IDE7CS8qIEJ5IGRlZmF1bHQgKi8KKyAgaW5mLT53YW50X2V4Y2VwdGlvbnMgPSAxOwkvKiBCeSBkZWZhdWx0ICovCisKKyAgcmV0dXJuIGluZjsKK30KKworLyogY2xlYXIgSU5GJ3MgdGFyZ2V0IHdhaXQgc3RhdHVzLiAgKi8KK3ZvaWQKK2luZl9jbGVhcl93YWl0IChzdHJ1Y3QgaW5mICppbmYpCit7CisgIGluZl9kZWJ1ZyAoaW5mLCAiY2xlYXJpbmcgd2FpdCIpOworICBpbmYtPndhaXQuc3RhdHVzLmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1BVUklPVVM7CisgIGluZi0+d2FpdC50aHJlYWQgPSAwOworICBpbmYtPndhaXQuc3VwcHJlc3MgPSAwOworICBpZiAoaW5mLT53YWl0LmV4Yy5oYW5kbGVyICE9IE1BQ0hfUE9SVF9OVUxMKQorICAgIHsKKyAgICAgIG1hY2hfcG9ydF9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwgaW5mLT53YWl0LmV4Yy5oYW5kbGVyKTsKKyAgICAgIGluZi0+d2FpdC5leGMuaGFuZGxlciA9IE1BQ0hfUE9SVF9OVUxMOworICAgIH0KKyAgaWYgKGluZi0+d2FpdC5leGMucmVwbHkgIT0gTUFDSF9QT1JUX05VTEwpCisgICAgeworICAgICAgbWFjaF9wb3J0X2RlYWxsb2NhdGUgKG1hY2hfdGFza19zZWxmICgpLCBpbmYtPndhaXQuZXhjLnJlcGx5KTsKKyAgICAgIGluZi0+d2FpdC5leGMucmVwbHkgPSBNQUNIX1BPUlRfTlVMTDsKKyAgICB9Cit9CisMCit2b2lkCitpbmZfY2xlYW51cCAoc3RydWN0IGluZiAqaW5mKQoreworICBpbmZfZGVidWcgKGluZiwgImNsZWFudXAiKTsKKworICBpbmZfY2xlYXJfd2FpdCAoaW5mKTsKKworICBpbmZfc2V0X3BpZCAoaW5mLCAtMSk7CisgIGluZi0+cGlkID0gMDsKKyAgaW5mLT50cmFjZWQgPSAwOworICBpbmYtPm5vX3dhaXQgPSAwOworICBpbmYtPnN0b3BwZWQgPSAwOworICBpbmYtPnJ1bm5pbmcgPSAwOworICBpbmYtPnBlbmRpbmdfZXhlY3MgPSAwOworCisgIGlmIChpbmYtPmV2ZW50X3BvcnQpCisgICAgeworICAgICAgbWFjaF9wb3J0X2Rlc3Ryb3kgKG1hY2hfdGFza19zZWxmICgpLCBpbmYtPmV2ZW50X3BvcnQpOworICAgICAgaW5mLT5ldmVudF9wb3J0ID0gTUFDSF9QT1JUX05VTEw7CisgICAgfQorfQorCit2b2lkCitpbmZfc3RhcnR1cCAoc3RydWN0IGluZiAqaW5mLCBpbnQgcGlkKQoreworICBlcnJvcl90IGVycjsKKworICBpbmZfZGVidWcgKGluZiwgInN0YXJ0dXA6IHBpZCA9ICVkIiwgcGlkKTsKKworICBpbmZfY2xlYW51cCAoaW5mKTsKKworICAvKiBNYWtlIHRoZSBwb3J0IG9uIHdoaWNoIHdlIHJlY2VpdmUgYWxsIGV2ZW50cy4gICovCisgIGVyciA9IG1hY2hfcG9ydF9hbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYgKCksCisJCQkgICAgTUFDSF9QT1JUX1JJR0hUX1JFQ0VJVkUsICZpbmYtPmV2ZW50X3BvcnQpOworICBpZiAoZXJyKQorICAgIGVycm9yICgiRXJyb3IgYWxsb2NhdGluZyBldmVudCBwb3J0OiAlcyIsIHN0cmVycm9yIChlcnIpKTsKKworICAvKiBNYWtlIGEgc2VuZCByaWdodCBmb3IgaXQsIHNvIHdlIGNhbiBlYXNpbHkgY29weSBpdCBmb3Igb3RoZXIgcGVvcGxlLiAgKi8KKyAgbWFjaF9wb3J0X2luc2VydF9yaWdodCAobWFjaF90YXNrX3NlbGYgKCksIGluZi0+ZXZlbnRfcG9ydCwKKwkJCSAgaW5mLT5ldmVudF9wb3J0LCBNQUNIX01TR19UWVBFX01BS0VfU0VORCk7CisgIGluZl9zZXRfcGlkIChpbmYsIHBpZCk7Cit9CisMCisvKiBjbG9zZSBjdXJyZW50IHByb2Nlc3MsIGlmIGFueSwgYW5kIGF0dGFjaCBJTkYgdG8gcHJvY2VzcyBQT1JUICovCit2b2lkIAoraW5mX3NldF9waWQgKHN0cnVjdCBpbmYgKmluZiwgcGlkX3QgcGlkKQoreworICB0YXNrX3QgdGFza19wb3J0OworICBzdHJ1Y3QgcHJvYyAqdGFzayA9IGluZi0+dGFzazsKKworICBpbmZfZGVidWcgKGluZiwgInNldHRpbmcgcGlkOiAlZCIsIHBpZCk7CisKKyAgaWYgKHBpZCA8IDApCisgICAgdGFza19wb3J0ID0gTUFDSF9QT1JUX05VTEw7CisgIGVsc2UKKyAgICB7CisgICAgICBlcnJvcl90IGVyciA9IHByb2NfcGlkMnRhc2sgKHByb2Nfc2VydmVyLCBwaWQsICZ0YXNrX3BvcnQpOworICAgICAgaWYgKGVycikKKwllcnJvciAoIkVycm9yIGdldHRpbmcgdGFzayBmb3IgcGlkICVkOiAlcyIsIHBpZCwgc3RyZXJyb3IgKGVycikpOworICAgIH0KKworICBpbmZfZGVidWcgKGluZiwgInNldHRpbmcgdGFzazogJWQiLCB0YXNrX3BvcnQpOworCisgIGlmIChpbmYtPnBhdXNlX3NjKQorICAgIHRhc2tfc3VzcGVuZCAodGFza19wb3J0KTsKKworICBpZiAodGFzayAmJiB0YXNrLT5wb3J0ICE9IHRhc2tfcG9ydCkKKyAgICB7CisgICAgICBpbmYtPnRhc2sgPSAwOworICAgICAgaW5mX3ZhbGlkYXRlX3Byb2NzIChpbmYpOwkvKiBUcmFzaCBhbGwgdGhlIHRocmVhZHMuICovCisgICAgICBfcHJvY19mcmVlICh0YXNrKTsJLyogQW5kIHRoZSB0YXNrLiAqLworICAgIH0KKworICBpZiAodGFza19wb3J0ICE9IE1BQ0hfUE9SVF9OVUxMKQorICAgIHsKKyAgICAgIGluZi0+dGFzayA9IG1ha2VfcHJvYyAoaW5mLCB0YXNrX3BvcnQsIFBST0NfVElEX1RBU0spOworICAgICAgaW5mLT50aHJlYWRzX3VwX3RvX2RhdGUgPSAwOworICAgIH0KKworICBpZiAoaW5mLT50YXNrKQorICAgIHsKKyAgICAgIGluZi0+cGlkID0gcGlkOworICAgICAgaWYgKGluZi0+cGF1c2Vfc2MpCisJaW5mLT50YXNrLT5zYyA9IGluZi0+dGFzay0+Y3VyX3NjID0gMTsgLyogUmVmbGVjdCB0YXNrX3N1c3BlbmQgYWJvdmUgKi8KKyAgICB9CisgIGVsc2UKKyAgICBpbmYtPnBpZCA9IC0xOworfQorDAorLyogVmFsaWRhdGVzIElORidzIHN0b3BwZWQgZmllbGQgZnJvbSB0aGUgYWN0dWFsIHByb2Mgc2VydmVyIHN0YXRlLiAgKi8KK3N0YXRpYyB2b2lkCitpbmZfdmFsaWRhdGVfc3RvcHBlZCAoc3RydWN0IGluZiAqaW5mKQoreworICBjaGFyICpub2lzZTsKKyAgbWFjaF9tc2dfdHlwZV9udW1iZXJfdCBub2lzZV9sZW4gPSAwOworICBzdHJ1Y3QgcHJvY2luZm8gKnBpOworICBtYWNoX21zZ190eXBlX251bWJlcl90IHBpX2xlbiA9IDA7CisgIGludCBpbmZvX2ZsYWdzID0gMDsKKyAgZXJyb3JfdCBlcnIgPQorICAgIHByb2NfZ2V0cHJvY2luZm8gKHByb2Nfc2VydmVyLCBpbmYtPnBpZCwgJmluZm9fZmxhZ3MsCisJCSAgICAgIChwcm9jaW5mb190ICopJnBpLCAmcGlfbGVuLCAmbm9pc2UsICZub2lzZV9sZW4pOworCisgIGlmICghIGVycikKKyAgICB7CisgICAgICBpbmYtPnN0b3BwZWQgPSAhIShwaS0+c3RhdGUgJiBQSV9TVE9QUEVEKTsKKyAgICAgIHZtX2RlYWxsb2NhdGUgKG1hY2hfdGFza19zZWxmICgpLCAodm1fYWRkcmVzc190KXBpLCBwaV9sZW4pOworICAgICAgaWYgKG5vaXNlX2xlbiA+IDApCisJdm1fZGVhbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYgKCksICh2bV9hZGRyZXNzX3Qpbm9pc2UsIG5vaXNlX2xlbik7CisgICAgfQorfQorCisvKiBWYWxpZGF0ZXMgSU5GJ3MgdGFzayBzdXNwZW5kIGNvdW50LiAgSWYgaXQncyBoaWdoZXIgdGhhbiB3ZSBleHBlY3QsIHZlcmlmeQorICAgd2l0aCB0aGUgdXNlciBiZWZvcmUgYHN0ZWFsaW5nJyB0aGUgZXh0cmEgY291bnQuICAqLworc3RhdGljIHZvaWQKK2luZl92YWxpZGF0ZV90YXNrX3NjIChzdHJ1Y3QgaW5mICppbmYpCit7CisgIHN0cnVjdCB0YXNrX2Jhc2ljX2luZm8gaW5mbzsKKyAgbWFjaF9tc2dfdHlwZV9udW1iZXJfdCBpbmZvX2xlbiA9IFRBU0tfQkFTSUNfSU5GT19DT1VOVDsKKyAgZXJyb3JfdCBlcnIgPQorICAgIHRhc2tfaW5mbyAoaW5mLT50YXNrLT5wb3J0LCBUQVNLX0JBU0lDX0lORk8sICh0YXNrX2luZm9fdCkmaW5mbywgJmluZm9fbGVuKTsKKworICBpZiAoZXJyKQorICAgIGluZi0+dGFzay0+ZGVhZCA9IDE7CS8qIG9oIHdlbGwgKi8KKyAgZWxzZSBpZiAoaW5mLT50YXNrLT5jdXJfc2MgPCBpbmZvLnN1c3BlbmRfY291bnQpCisgICAgeworICAgICAgaW50IGFib3J0OworCisgICAgICB0YXJnZXRfdGVybWluYWxfb3VycyAoKTsJLyogQWxsb3cgSS9PLiAgKi8KKyAgICAgIGFib3J0ID0KKwkhcXVlcnkgKCJQaWQgJWQgaGFzIGFuIGFkZGl0aW9uYWwgdGFzayBzdXNwZW5kIGNvdW50IG9mICVkOyBjbGVhciBpdD8gIiwKKwkJaW5mLT5waWQsIGluZm8uc3VzcGVuZF9jb3VudCAtIGluZi0+dGFzay0+Y3VyX3NjKTsKKyAgICAgIHRhcmdldF90ZXJtaW5hbF9pbmZlcmlvciAoKTsgLyogR2l2ZSBpdCBiYWNrIHRvIHRoZSBjaGlsZC4gICovCisKKyAgICAgIGlmIChhYm9ydCkKKwllcnJvciAoIkFkZGl0aW9uYWwgdGFzayBzdXNwZW5kIGNvdW50IGxlZnQgdW50b3VjaGVkLiIpOworCisgICAgICBpbmYtPnRhc2stPmN1cl9zYyA9IGluZm8uc3VzcGVuZF9jb3VudDsKKyAgICB9Cit9CisKKy8qIFR1cm5zIHRyYWNpbmcgZm9yIElORiBvbiBvciBvZmYsIGRlcGVuZGluZyBvbiBPTiwgdW5sZXNzIGl0IGFscmVhZHkgaXMuCisgICBJZiBJTkYgaXMgcnVubmluZywgdGhlIHJlc3VtZV9zYyBjb3VudCBvZiBJTkYncyB0aHJlYWRzIHdpbGwgYmUgbW9kaWZpZWQsCisgICBhbmQgdGhlIHNpZ25hbCB0aHJlYWQgd2lsbCBicmllZmx5IGJlIHJ1biB0byBjaGFuZ2UgdGhlIHRyYWNlIHN0YXRlLiAgKi8KK3ZvaWQKK2luZl9zZXRfdHJhY2VkIChzdHJ1Y3QgaW5mICppbmYsIGludCBvbikKK3sKKyAgaWYgKG9uICE9IGluZi0+dHJhY2VkKQorICAgIGlmIChpbmYtPnRhc2sgJiYgIWluZi0+dGFzay0+ZGVhZCkKKyAgICAgIC8qIE1ha2UgaXQgdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkuICAqLworICAgICAgeworCXNpZ3NldF90IG1hc2sgPSBvbiA/IH4oc2lnc2V0X3QpMCA6IDA7CisJZXJyb3JfdCBlcnIgPQorCSAgSU5GX1JFU1VNRV9NU0dQT1JUX1JQQyAoaW5mLCBtc2dfc2V0X2luaXRfaW50IChtc2dwb3J0LCByZWZwb3J0LAorCQkJCQkJCSBJTklUX1RSQUNFTUFTSywgbWFzaykpOworCWlmIChlcnIgPT0gRUlFSU8pCisJICB7CisJICAgIGlmIChvbikKKwkgICAgICB3YXJuaW5nICgiQ2FuJ3QgbW9kaWZ5IHRyYWNpbmcgc3RhdGUgZm9yIHBpZCAlZDogTm8gc2lnbmFsIHRocmVhZCIsCisJCSAgICAgICBpbmYtPnBpZCk7CisJICAgIGluZi0+dHJhY2VkID0gb247CisJICB9CisJZWxzZSBpZiAoZXJyKQorCSAgd2FybmluZyAoIkNhbid0IG1vZGlmeSB0cmFjaW5nIHN0YXRlIGZvciBwaWQgJWQ6ICVzIiwKKwkJICAgaW5mLT5waWQsIHN0cmVycm9yIChlcnIpKTsKKwllbHNlCisJICBpbmYtPnRyYWNlZCA9IG9uOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIGluZi0+dHJhY2VkID0gb247Cit9CisMCisvKiBNYWtlcyBhbGwgdGhlIHJlYWwgc3VzcGVuZCBjb3VudCBkZWx0YXMgb2YgYWxsIHRoZSBwcm9jcyBpbiBJTkYgbWF0Y2ggdGhlCisgICBkZXNpcmVkIHZhbHVlcy4gIENhcmVmdWwgdG8gYWx3YXlzIGRvIHRocmVhZC90YXNrIHN1c3BlbmQgY291bnRzIGluIHRoZQorICAgc2FmZSBvcmRlci4gIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgdGhyZWFkIGlzIHRob3VnaHQgdG8gYmUgcnVubmluZy4qLworaW50CitpbmZfdXBkYXRlX3N1c3BlbmRzIChzdHJ1Y3QgaW5mICppbmYpCit7CisgIHN0cnVjdCBwcm9jICp0YXNrID0gaW5mLT50YXNrOworICAvKiBXZSBkb24ndCBoYXZlIHRvIHVwZGF0ZSBJTkYtPnRocmVhZHMgZXZlbiB0aG91Z2ggd2UncmUgaXRlcmF0aW5nIG92ZXIgaXQKKyAgICAgYmVjYXVzZSB3ZSdsbCBjaGFuZ2UgYSB0aHJlYWQgb25seSBpZiBpdCBhbHJlYWR5IGhhcyBhbiBleGlzdGluZyBwcm9jCisgICAgIGVudHJ5LiAgKi8KKworICBpbmZfZGVidWcgKGluZiwgInVwZGF0aW5nIHN1c3BlbmQgY291bnRzIik7CisKKyAgaWYgKHRhc2spCisgICAgeworICAgICAgc3RydWN0IHByb2MgKnRocmVhZDsKKyAgICAgIGludCB0YXNrX3J1bm5pbmcgPSAodGFzay0+c2MgPT0gMCksIHRocmVhZF9ydW5uaW5nID0gMDsKKworICAgICAgaWYgKHRhc2stPnNjID4gdGFzay0+Y3VyX3NjKQorCS8qIFRoZSB0YXNrIGlzIGJlY29taW5nIF9tb3JlXyBzdXNwZW5kZWQ7IGRvIGJlZm9yZSBhbnkgdGhyZWFkcy4gICovCisJdGFza19ydW5uaW5nID0gcHJvY191cGRhdGVfc2MgKHRhc2spOworCisgICAgICBpZiAoaW5mLT5wZW5kaW5nX2V4ZWNzKQorCS8qIFdoZW4gd2UncmUgd2FpdGluZyBmb3IgYW4gZXhlYywgdGhpbmdzIG1heSBiZSBoYXBwZW5pbmcgYmVoaW5kIG91cgorCSAgIGJhY2ssIHNvIGJlIGNvbnNlcnZhdGl2ZS4gICovCisJdGhyZWFkX3J1bm5pbmcgPSAxOworCisgICAgICAvKiBEbyBhbGwgdGhlIHRocmVhZCBzdXNwZW5kIGNvdW50cy4gICovCisgICAgICBmb3IgKHRocmVhZCA9IGluZi0+dGhyZWFkczsgdGhyZWFkOyB0aHJlYWQgPSB0aHJlYWQtPm5leHQpCisJdGhyZWFkX3J1bm5pbmcgfD0gcHJvY191cGRhdGVfc2MgKHRocmVhZCk7CisKKyAgICAgIGlmICh0YXNrLT5zYyAhPSB0YXNrLT5jdXJfc2MpCisJLyogV2UgZGlkbid0IGRvIHRoZSB0YXNrIGZpcnN0LCBiZWNhdXNlIHdlIHdhbnRlZCB0byB3YWl0IGZvciB0aGUKKwkgICB0aHJlYWRzOyBkbyBpdCBub3cuICAqLworCXRhc2tfcnVubmluZyA9IHByb2NfdXBkYXRlX3NjICh0YXNrKTsKKworICAgICAgaW5mX2RlYnVnIChpbmYsICIlc3J1bm5pbmcuLi4iLAorCQkgKHRocmVhZF9ydW5uaW5nICYmIHRhc2tfcnVubmluZykgPyAiIiA6ICJub3QgIik7CisKKyAgICAgIGluZi0+cnVubmluZyA9IHRocmVhZF9ydW5uaW5nICYmIHRhc2tfcnVubmluZzsKKworICAgICAgLyogT25jZSBhbnkgdGhyZWFkIGhhcyBleGVjdXRlZCBzb21lIGNvZGUsIHdlIGNhbid0IGRlcGVuZCBvbiB0aGUKKwkgdGhyZWFkcyBsaXN0IGFueSBtb3JlLiAgKi8KKyAgICAgIGlmIChpbmYtPnJ1bm5pbmcpCisJaW5mLT50aHJlYWRzX3VwX3RvX2RhdGUgPSAwOworCisgICAgICByZXR1cm4gaW5mLT5ydW5uaW5nOworICAgIH0KKworICByZXR1cm4gMDsKK30KKwwKKy8qIENvbnZlcnRzIGEgR0RCIHBpZCB0byBhIHN0cnVjdCBwcm9jLiAgKi8KK3N0cnVjdCBwcm9jICoKK2luZl90aWRfdG9fdGhyZWFkIChzdHJ1Y3QgaW5mICppbmYsIGludCB0aWQpCit7CisgIHN0cnVjdCBwcm9jICp0aHJlYWQgPSBpbmYtPnRocmVhZHM7CisKKyAgd2hpbGUgKHRocmVhZCkKKyAgICBpZiAodGhyZWFkLT50aWQgPT0gdGlkKQorICAgICAgcmV0dXJuIHRocmVhZDsKKyAgICBlbHNlCisgICAgICB0aHJlYWQgPSB0aHJlYWQtPm5leHQ7CisgIHJldHVybiAwOworfQorCisvKiBDb252ZXJ0cyBhIHRocmVhZCBwb3J0IHRvIGEgc3RydWN0IHByb2MuICAqLworc3RydWN0IHByb2MgKgoraW5mX3BvcnRfdG9fdGhyZWFkIChzdHJ1Y3QgaW5mICppbmYsIG1hY2hfcG9ydF90IHBvcnQpCit7CisgIHN0cnVjdCBwcm9jICp0aHJlYWQgPSBpbmYtPnRocmVhZHM7CisgIHdoaWxlICh0aHJlYWQpCisgICAgaWYgKHRocmVhZC0+cG9ydCA9PSBwb3J0KQorICAgICAgcmV0dXJuIHRocmVhZDsKKyAgICBlbHNlCisgICAgICB0aHJlYWQgPSB0aHJlYWQtPm5leHQ7CisgIHJldHVybiAwOworfQorDAorLyogTWFrZSBJTkYncyBsaXN0IG9mIHRocmVhZHMgYmUgY29uc2lzdGVudCB3aXRoIHJlYWxpdHkgb2YgVEFTSy4gICovCit2b2lkCitpbmZfdmFsaWRhdGVfcHJvY3MgKHN0cnVjdCBpbmYgKmluZikKK3sKKyAgaW50IGk7CisgIHRocmVhZF9hcnJheV90IHRocmVhZHM7CisgIHVuc2lnbmVkIG51bV90aHJlYWRzOworICBzdHJ1Y3QgcHJvYyAqdGFzayA9IGluZi0+dGFzazsKKworICAvKiBJZiBubyB0aHJlYWRzIGFyZSBjdXJyZW50bHkgcnVubmluZywgdGhpcyBmdW5jdGlvbiB3aWxsIGd1YXJhbnRlZSB0aGF0CisgICAgIHRoaW5ncyBhcmUgdXAgdG8gZGF0ZS4gIFRoZSBleGNlcHRpb24gaXMgaWYgdGhlcmUgYXJlIHplcm8gdGhyZWFkcyAtLQorICAgICB0aGVuIGl0IGlzIGFsbW9zdCBjZXJ0YWlubHkgaW4gYW4gb2RkIHN0YXRlLCBhbmQgcHJvYmFibHkgc29tZSBvdXRzaWRlCisgICAgIGFnZW50IHdpbGwgY3JlYXRlIHRocmVhZHMuICAqLworICBpbmYtPnRocmVhZHNfdXBfdG9fZGF0ZSA9IGluZi0+dGhyZWFkcyA/ICFpbmYtPnJ1bm5pbmcgOiAwOworCisgIGlmICh0YXNrKQorICAgIHsKKyAgICAgIGVycm9yX3QgZXJyID0gdGFza190aHJlYWRzICh0YXNrLT5wb3J0LCAmdGhyZWFkcywgJm51bV90aHJlYWRzKTsKKyAgICAgIGluZl9kZWJ1ZyAoaW5mLCAiZmV0Y2hpbmcgdGhyZWFkcyIpOworICAgICAgaWYgKGVycikKKwkvKiBUQVNLIG11c3QgYmUgZGVhZC4gICovCisJeworCSAgdGFzay0+ZGVhZCA9IDE7CisJICB0YXNrID0gMDsKKwl9CisgICAgfQorCisgIGlmICghdGFzaykKKyAgICB7CisgICAgICBudW1fdGhyZWFkcyA9IDA7CisgICAgICBpbmZfZGVidWcgKGluZiwgIm5vIHRhc2siKTsKKyAgICB9CisKKyAgeworICAgIHVuc2lnbmVkIHNlYXJjaF9zdGFydCA9IDA7CS8qIE1ha2UgdGhpbmdzIG5vcm1hbGx5IGxpbmVhci4gICovCisgICAgLyogV2hpY2ggdGhyZWFkIGluIFBST0NTIGNvcnJlc3BvbmRzIHRvIGVhY2ggdGFzayB0aHJlYWQsICYgdGhlIHRhc2suICAqLworICAgIHN0cnVjdCBwcm9jICptYXRjaGVkW251bV90aHJlYWRzICsgMV07CisgICAgLyogVGhlIGxhc3QgdGhyZWFkIGluIElORi0+dGhyZWFkcywgc28gd2UgY2FuIGFkZCB0byB0aGUgZW5kLiAgKi8KKyAgICBzdHJ1Y3QgcHJvYyAqbGFzdCA9IDA7CisgICAgLyogVGhlIGN1cnJlbnQgdGhyZWFkIHdlJ3JlIGNvbnNpZGVyaW5nLiAqLworICAgIHN0cnVjdCBwcm9jICp0aHJlYWQgPSBpbmYtPnRocmVhZHM7CisKKyAgICBiemVybyAobWF0Y2hlZCwgc2l6ZW9mIChtYXRjaGVkKSk7CisKKyAgICB3aGlsZSAodGhyZWFkKQorICAgICAgeworCXVuc2lnbmVkIGxlZnQ7CisKKwlmb3IgKGkgPSBzZWFyY2hfc3RhcnQsIGxlZnQgPSBudW1fdGhyZWFkczsgbGVmdDsgaSsrLCBsZWZ0LS0pCisJICB7CisJICAgIGlmIChpID49IG51bV90aHJlYWRzKQorCSAgICAgIGkgLT0gbnVtX3RocmVhZHM7IC8qIEkgd3JhcHBlZCBhcm91bmQuICAqLworCSAgICBpZiAodGhyZWFkLT5wb3J0ID09IHRocmVhZHNbaV0pCisJICAgICAgLyogV2UgYWxyZWFkeSBrbm93IGFib3V0IHRoaXMgdGhyZWFkLiAgKi8KKwkgICAgICB7CisJCW1hdGNoZWRbaV0gPSB0aHJlYWQ7CisJCWxhc3QgPSB0aHJlYWQ7CisJCXRocmVhZCA9IHRocmVhZC0+bmV4dDsKKwkJc2VhcmNoX3N0YXJ0Kys7CisJCWJyZWFrOworCSAgICAgIH0KKwkgIH0KKworCWlmICghIGxlZnQpCisJICB7CisJICAgIHByb2NfZGVidWcgKHRocmVhZCwgImRpZWQhIik7CisJICAgIHRocmVhZC0+cG9ydCA9IE1BQ0hfUE9SVF9OVUxMOworCSAgICB0aHJlYWQgPSBfcHJvY19mcmVlICh0aHJlYWQpOyAvKiBUSFJFQUQgaXMgZGVhZC4gICovCisJICAgIChsYXN0ID8gbGFzdC0+bmV4dCA6IGluZi0+dGhyZWFkcykgPSB0aHJlYWQ7CisJICB9CisgICAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RocmVhZHM7IGkrKykKKyAgICAgIGlmIChtYXRjaGVkW2ldKQorCS8qIFRocm93IGF3YXkgdGhlIGR1cGxpY2F0ZSBzZW5kIHJpZ2h0LiAgKi8KKwltYWNoX3BvcnRfZGVhbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYgKCksIHRocmVhZHNbaV0pOworICAgICAgZWxzZQorCS8qIFRIUkVBRFNbSV0gaXMgYSB0aHJlYWQgd2UgZG9uJ3Qga25vdyBhYm91dCB5ZXQhICAqLworCXsKKwkgIHRocmVhZCA9IG1ha2VfcHJvYyAoaW5mLCB0aHJlYWRzW2ldLCBuZXh0X3RocmVhZF9pZCsrKTsKKwkgIChsYXN0ID8gbGFzdC0+bmV4dCA6IGluZi0+dGhyZWFkcykgPSB0aHJlYWQ7CisJICBsYXN0ID0gdGhyZWFkOworCSAgcHJvY19kZWJ1ZyAodGhyZWFkLCAibmV3IHRocmVhZDogJWQiLCB0aHJlYWRzW2ldKTsKKwkgIGFkZF90aHJlYWQgKHRocmVhZC0+dGlkKTsgLyogVGVsbCBHREIncyBnZW5lcmljIHRocmVhZCBjb2RlLiAgKi8KKwl9CisKKyAgICB2bV9kZWFsbG9jYXRlKG1hY2hfdGFza19zZWxmKCksCisJCSAgKHZtX2FkZHJlc3NfdCl0aHJlYWRzLCAobnVtX3RocmVhZHMgKiBzaXplb2YodGhyZWFkX3QpKSk7CisgIH0KK30KKwwKKy8qIE1ha2VzIHN1cmUgdGhhdCBJTkYncyB0aHJlYWQgbGlzdCBpcyBzeW5jZWQgd2l0aCB0aGUgYWN0dWFsIHByb2Nlc3MuICAqLworaW5saW5lIGludAoraW5mX3VwZGF0ZV9wcm9jcyAoc3RydWN0IGluZiAqaW5mKQoreworICBpZiAoISBpbmYtPnRhc2spCisgICAgcmV0dXJuIDA7CisgIGlmICghIGluZi0+dGhyZWFkc191cF90b19kYXRlKQorICAgIGluZl92YWxpZGF0ZV9wcm9jcyAoaW5mKTsKKyAgcmV0dXJuICEhaW5mLT50YXNrOworfQorCisvKiBTZXRzIHRoZSByZXN1bWVfc2Mgb2YgZWFjaCB0aHJlYWQgaW4gaW5mLiAgVGhhdCBvZiBSVU5fVEhSRUFEIGlzIHNldCB0byAwLAorICAgYW5kIG90aGVycyBhcmUgc2V0IHRvIHRoZWlyIHJ1bl9zYyBpZiBSVU5fT1RIRVJTIGlzIHRydWUsIGFuZCBvdGhlcndpc2UKKyAgIHRoZWlyIHBhdXNlX3NjLiAgKi8KK2lubGluZSB2b2lkIAoraW5mX3NldF90aHJlYWRzX3Jlc3VtZV9zYyAoc3RydWN0IGluZiAqaW5mLAorCQkJICAgc3RydWN0IHByb2MgKnJ1bl90aHJlYWQsIGludCBydW5fb3RoZXJzKQoreworICBzdHJ1Y3QgcHJvYyAqdGhyZWFkOworICBpbmZfdXBkYXRlX3Byb2NzIChpbmYpOworICBmb3IgKHRocmVhZCA9IGluZi0+dGhyZWFkczsgdGhyZWFkOyB0aHJlYWQgPSB0aHJlYWQtPm5leHQpCisgICAgaWYgKHRocmVhZCA9PSBydW5fdGhyZWFkKQorICAgICAgdGhyZWFkLT5yZXN1bWVfc2MgPSAwOworICAgIGVsc2UgaWYgKHJ1bl9vdGhlcnMpCisgICAgICB0aHJlYWQtPnJlc3VtZV9zYyA9IHRocmVhZC0+cnVuX3NjOworICAgIGVsc2UKKyAgICAgIHRocmVhZC0+cmVzdW1lX3NjID0gdGhyZWFkLT5wYXVzZV9zYzsKK30KKwwKKy8qIENhdXNlIElORiB0byBjb250aW51ZSBleGVjdXRpb24gaW1tZWRpYXRlbHk7IGluZGl2aWR1YWwgdGhyZWFkcyBtYXkgc3RpbGwKKyAgIGJlIHN1c3BlbmRlZCAoYnV0IHRoZWlyIHN1c3BlbmQgY291bnRzIHdpbGwgYmUgdXBkYXRlZCkuICAqLworaW5saW5lIHZvaWQKK2luZl9yZXN1bWUgKHN0cnVjdCBpbmYgKmluZikKK3sKKyAgc3RydWN0IHByb2MgKnRocmVhZDsKKworICBpbmZfdXBkYXRlX3Byb2NzIChpbmYpOworCisgIGZvciAodGhyZWFkID0gaW5mLT50aHJlYWRzOyB0aHJlYWQ7IHRocmVhZCA9IHRocmVhZC0+bmV4dCkKKyAgICB0aHJlYWQtPnNjID0gdGhyZWFkLT5yZXN1bWVfc2M7CisKKyAgaWYgKGluZi0+dGFzaykKKyAgICB7CisgICAgICBpZiAoISBpbmYtPnBlbmRpbmdfZXhlY3MpCisJLyogVHJ5IHRvIG1ha2Ugc3VyZSBvdXIgdGFzayBjb3VudCBpcyBjb3JyZWN0IC0tIGluIHRoZSBjYXNlIHdoZXJlCisJICAgd2UncmUgd2FpdGluZyBmb3IgYW4gZXhlYyB0aG91Z2gsIHRoaW5ncyBhcmUgdG9vIHZvbGF0aWxlLCBzbyBqdXN0CisJICAgYXNzdW1lIHRoaW5ncyB3aWxsIGJlIHJlYXNvbmFibGUgKHdoaWNoIHRoZXkgdXN1YWxseSB3aWxsIGJlKS4gICovCisJaW5mX3ZhbGlkYXRlX3Rhc2tfc2MgKGluZik7CisgICAgICBpbmYtPnRhc2stPnNjID0gMDsKKyAgICB9CisKKyAgaW5mX3VwZGF0ZV9zdXNwZW5kcyAoaW5mKTsKK30KKworLyogQ2F1c2UgSU5GIHRvIHN0b3AgZXhlY3V0aW9uIGltbWVkaWF0ZWx5OyBpbmRpdmlkdWFsIHRocmVhZHMgbWF5IHN0aWxsCisgICBiZSBydW5uaW5nLiAgKi8KK2lubGluZSB2b2lkCitpbmZfc3VzcGVuZCAoc3RydWN0IGluZiAqaW5mKQoreworICBzdHJ1Y3QgcHJvYyAqdGhyZWFkOworCisgIGluZl91cGRhdGVfcHJvY3MgKGluZik7CisKKyAgZm9yICh0aHJlYWQgPSBpbmYtPnRocmVhZHM7IHRocmVhZDsgdGhyZWFkID0gdGhyZWFkLT5uZXh0KQorICAgIHRocmVhZC0+c2MgPSB0aHJlYWQtPnBhdXNlX3NjOworCisgIGlmIChpbmYtPnRhc2spCisgICAgaW5mLT50YXNrLT5zYyA9IGluZi0+cGF1c2Vfc2M7CisKKyAgaW5mX3VwZGF0ZV9zdXNwZW5kcyAoaW5mKTsKK30KKwwKKy8qIElORiBoYXMgb25lIHRocmVhZCBQUk9DIHRoYXQgaXMgaW4gc2luZ2xlLXN0ZXBwaW5nIG1vZGUuICBUaGlzIGZ1bmN0aW9uCisgICBjaGFuZ2VzIGl0IHRvIGJlIFBST0MsIGNoYW5naW5nIGFueSBvbGQgc3RlcF90aHJlYWQgdG8gYmUgYSBub3JtYWwgb25lLiAgQQorICAgUFJPQyBvZiAwIGNsZWFycyBhbnkgZXhpc3RpbmcgdmFsdWUuICAqLwordm9pZAoraW5mX3NldF9zdGVwX3RocmVhZCAoc3RydWN0IGluZiAqaW5mLCBzdHJ1Y3QgcHJvYyAqdGhyZWFkKQoreworICBhc3NlcnQgKCF0aHJlYWQgfHwgcHJvY19pc190aHJlYWQgKHRocmVhZCkpOworCisgIGlmICh0aHJlYWQpCisgICAgaW5mX2RlYnVnIChpbmYsICJzZXR0aW5nIHN0ZXAgdGhyZWFkOiAlZC8lZCIsIGluZi0+cGlkLCB0aHJlYWQtPnRpZCk7CisgIGVsc2UKKyAgICBpbmZfZGVidWcgKGluZiwgImNsZWFyaW5nIHN0ZXAgdGhyZWFkIik7CisKKyAgaWYgKGluZi0+c3RlcF90aHJlYWQgIT0gdGhyZWFkKQorICAgIHsKKyAgICAgIGlmIChpbmYtPnN0ZXBfdGhyZWFkICYmIGluZi0+c3RlcF90aHJlYWQtPnBvcnQgIT0gTUFDSF9QT1JUX05VTEwpCisJaWYgKCEgcHJvY190cmFjZSAoaW5mLT5zdGVwX3RocmVhZCwgMCkpCisJICByZXR1cm47CisgICAgICBpZiAodGhyZWFkICYmIHByb2NfdHJhY2UgKHRocmVhZCwgMSkpCisJaW5mLT5zdGVwX3RocmVhZCA9IHRocmVhZDsKKyAgICAgIGVsc2UKKwlpbmYtPnN0ZXBfdGhyZWFkID0gMDsKKyAgICB9Cit9CisMCisvKiBTZXQgdXAgdGhlIHRocmVhZCByZXN1bWVfc2MncyBzbyB0aGF0IG9ubHkgdGhlIHNpZ25hbCB0aHJlYWQgaXMgcnVubmluZworICAgKHBsdXMgd2hhdGV2ZXIgb3RoZXIgdGhyZWFkIGFyZSBzZXQgdG8gYWx3YXlzIHJ1bikuICBSZXR1cm5zIHRydWUgaWYgd2UKKyAgIGRpZCBzbywgb3IgZmFsc2UgaWYgd2UgY2FuJ3QgZmluZCBhIHNpZ25hbCB0aHJlYWQuICAqLworaW5saW5lIGludAoraW5mX3NldF90aHJlYWRzX3Jlc3VtZV9zY19mb3Jfc2lnbmFsX3RocmVhZCAoc3RydWN0IGluZiAqaW5mKQoreworICBpZiAoaW5mLT5zaWduYWxfdGhyZWFkKQorICAgIHsKKyAgICAgIGluZl9zZXRfdGhyZWFkc19yZXN1bWVfc2MgKGluZiwgaW5mLT5zaWduYWxfdGhyZWFkLCAwKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraW5mX3VwZGF0ZV9zaWduYWxfdGhyZWFkIChzdHJ1Y3QgaW5mICppbmYpCit7CisgIC8qIFhYWCBmb3Igbm93IHdlIGFzc3VtZSB0aGF0IGlmIHRoZXJlJ3MgYSBtc2dwb3J0LCB0aGUgMm5kIHRocmVhZCBpcworICAgICB0aGUgc2lnbmFsIHRocmVhZC4gICovCisgIGluZi0+c2lnbmFsX3RocmVhZCA9IGluZi0+dGhyZWFkcyA/IGluZi0+dGhyZWFkcy0+bmV4dCA6IDA7Cit9CisMCisvKiBEZXRhY2hzIGZyb20gSU5GJ3MgaW5mZXJpb3IgdGFzaywgbGV0dGluZyBpdCBydW4gb25jZSBhZ2Fpbi4uLiAgKi8KK3ZvaWQKK2luZl9kZXRhY2ggKHN0cnVjdCBpbmYgKmluZikKK3sKKyAgc3RydWN0IHByb2MgKnRhc2sgPSBpbmYtPnRhc2s7CisKKyAgaW5mX2RlYnVnIChpbmYsICJkZXRhY2hpbmcuLi4iKTsKKworICBpbmZfY2xlYXJfd2FpdCAoaW5mKTsKKyAgaW5mX3NldF9zdGVwX3RocmVhZCAoaW5mLCAwKTsKKworICBpZiAodGFzaykKKyAgICB7CisgICAgICBzdHJ1Y3QgcHJvYyAqdGhyZWFkOworCisgICAgICBpbmZfc2V0X3RyYWNlZCAoaW5mLCAwKTsKKyAgICAgIGlmIChpbmYtPnN0b3BwZWQpCisJaW5mX3NpZ25hbCAoaW5mLCBUQVJHRVRfU0lHTkFMXzApOworCisgICAgICBwcm9jX3Jlc3RvcmVfZXhjX3BvcnQgKHRhc2spOworICAgICAgdGFzay0+c2MgPSBpbmYtPmRldGFjaF9zYzsKKworICAgICAgZm9yICh0aHJlYWQgPSBpbmYtPnRocmVhZHM7IHRocmVhZDsgdGhyZWFkID0gdGhyZWFkLT5uZXh0KQorCXsKKwkgIHByb2NfcmVzdG9yZV9leGNfcG9ydCAodGhyZWFkKTsKKwkgIHRocmVhZC0+c2MgPSB0aHJlYWQtPmRldGFjaF9zYzsKKwl9CisKKyAgICAgIGluZl91cGRhdGVfc3VzcGVuZHMgKGluZik7CisgICAgfQorCisgIGluZl9jbGVhbnVwIChpbmYpOworfQorCisvKiBBdHRhY2hlcyBJTkYgdG8gdGhlIHByb2Nlc3Mgd2l0aCBwcm9jZXNzIGlkIFBJRCwgcmV0dXJuaW5nIGl0IGluIGEgc3VzcGVuZGVkCisgICBzdGF0ZSBzdWl0YWJsZSBmb3IgZGVidWdnaW5nLiAgKi8KK3ZvaWQKK2luZl9hdHRhY2ggKHN0cnVjdCBpbmYgKmluZiwgaW50IHBpZCkKK3sKKyAgaW5mX2RlYnVnIChpbmYsICJhdHRhY2hpbmc6ICVkIiwgcGlkKTsKKworICBpZiAoaW5mLT5waWQpCisgICAgaW5mX2RldGFjaCAoaW5mKTsKKworICBpbmZfc3RhcnR1cCAoaW5mLCBwaWQpOworfQorDAorLyogTWFrZXMgc3VyZSB0aGF0IHdlJ3ZlIGdvdCBvdXIgZXhjZXB0aW9uIHBvcnRzIGVudHJlbmNoZWQgaW4gdGhlIHByb2Nlc3MuICovCit2b2lkIGluZl9zdGVhbF9leGNfcG9ydHMgKHN0cnVjdCBpbmYgKmluZikKK3sKKyAgc3RydWN0IHByb2MgKnRocmVhZDsKKworICBpbmZfZGVidWcgKGluZiwgInN0ZWFsaW5nIGV4Y2VwdGlvbiBwb3J0cyIpOworCisgIGluZl9zZXRfc3RlcF90aHJlYWQgKGluZiwgMCk7CS8qIFRoZSBzdGVwIHRocmVhZCBpcyBzcGVjaWFsLiAqLworCisgIHByb2Nfc3RlYWxfZXhjX3BvcnQgKGluZi0+dGFzaywgaW5mLT5ldmVudF9wb3J0KTsKKyAgZm9yICh0aHJlYWQgPSBpbmYtPnRocmVhZHM7IHRocmVhZDsgdGhyZWFkID0gdGhyZWFkLT5uZXh0KQorICAgIHByb2Nfc3RlYWxfZXhjX3BvcnQgKHRocmVhZCwgTUFDSF9QT1JUX05VTEwpOworfQorCisvKiBNYWtlcyBzdXJlIHRoZSBwcm9jZXNzIGhhcyBpdHMgb3duIGV4Y2VwdGlvbiBwb3J0cy4gICovCit2b2lkIGluZl9yZXN0b3JlX2V4Y19wb3J0cyAoc3RydWN0IGluZiAqaW5mKQoreworICBzdHJ1Y3QgcHJvYyAqdGhyZWFkOworCisgIGluZl9kZWJ1ZyAoaW5mLCAicmVzdG9yaW5nIGV4Y2VwdGlvbiBwb3J0cyIpOworCisgIGluZl9zZXRfc3RlcF90aHJlYWQgKGluZiwgMCk7CS8qIFRoZSBzdGVwIHRocmVhZCBpcyBzcGVjaWFsLiAqLworCisgIHByb2NfcmVzdG9yZV9leGNfcG9ydCAoaW5mLT50YXNrKTsKKyAgZm9yICh0aHJlYWQgPSBpbmYtPnRocmVhZHM7IHRocmVhZDsgdGhyZWFkID0gdGhyZWFkLT5uZXh0KQorICAgIHByb2NfcmVzdG9yZV9leGNfcG9ydCAodGhyZWFkKTsKK30KKwwKKy8qIERlbGl2ZXIgc2lnbmFsIFNJRyB0byBJTkYuICBJZiBJTkYgaXMgc3RvcHBlZCwgZGVsaXZlcmluZyBhIHNpZ25hbCwgZXZlbgorICAgc2lnbmFsIDAsIHdpbGwgY29udGludWUgaXQuICBJTkYgaXMgYXNzdW1lZCB0byBiZSBpbiBhIHBhdXNlZCBzdGF0ZSwgYW5kCisgICB0aGUgcmVzdW1lX3NjJ3Mgb2YgSU5GJ3MgdGhyZWFkcyBtYXkgYmUgYWZmZWN0ZWQuICAqLwordm9pZAoraW5mX3NpZ25hbCAoc3RydWN0IGluZiAqaW5mLCBlbnVtIHRhcmdldF9zaWduYWwgc2lnKQoreworICBlcnJvcl90IGVyciA9IDA7CisgIGludCBob3N0X3NpZyA9IHRhcmdldF9zaWduYWxfdG9faG9zdCAoc2lnKTsKKworI2RlZmluZSBOQU1FIHRhcmdldF9zaWduYWxfdG9fbmFtZSAoc2lnKQorCisgIGlmIChob3N0X3NpZyA+PSBfTlNJRykKKyAgICAvKiBBIG1hY2ggZXhjZXB0aW9uLiAgRXhjZXB0aW9ucyBhcmUgZW5jb2RlZCBpbiB0aGUgc2lnbmFsIHNwYWNlIGJ5CisgICAgICAgcHV0dGluZyB0aGVtIGFmdGVyIF9OU0lHOyB0aGlzIGFzc3VtZXMgdGhleSdyZSBwb3NpdGl2ZSAoYW5kIG5vdAorICAgICAgIGV4dHJlbWVseSBsYXJnZSkhICAqLworICAgIHsKKyAgICAgIHN0cnVjdCBpbmZfd2FpdCAqdyA9ICZpbmYtPndhaXQ7CisgICAgICBpZiAody0+c3RhdHVzLmtpbmQgPT0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQKKwkgICYmIHctPnN0YXR1cy52YWx1ZS5zaWcgPT0gc2lnCisJICAmJiB3LT50aHJlYWQgJiYgIXctPnRocmVhZC0+YWJvcnRlZCkKKwkvKiBXZSdyZSBwYXNzaW5nIHRocm91Z2ggdGhlIGxhc3QgZXhjZXB0aW9uIHdlIHJlY2VpdmVkLiAgVGhpcyBpcworCSAgIGtpbmQgb2YgYm9ndXMsIGJlY2F1c2UgZXhjZXB0aW9ucyBhcmUgcGVyLXRocmVhZCB3aGVyZWFzIGdkYgorCSAgIHRyZWF0cyBzaWduYWxzIGFzIHBlci1wcm9jZXNzLiAgV2UganVzdCBmb3J3YXJkIHRoZSBleGNlcHRpb24gdG8KKwkgICB0aGUgY29ycmVjdCBoYW5kbGVyLCBldmVuIGl0J3Mgbm90IGZvciB0aGUgc2FtZSB0aHJlYWQgYXMgVElEIC0tCisJICAgaS5lLiwgd2UgcHJldGVuZCBpdCdzIGdsb2JhbC4gICovCisJeworCSAgc3RydWN0IGV4Y19zdGF0ZSAqZSA9ICZ3LT5leGM7CisJICBpbmZfZGVidWcgKGluZiwgInBhc3NpbmcgdGhyb3VnaCBleGNlcHRpb246IgorCQkgICAgICIgdGFzayA9ICVkLCB0aHJlYWQgPSAlZCwgZXhjID0gJWQiCisJCSAgICAgIiwgY29kZSA9ICVkLCBzdWJjb2RlID0gJWQiLAorCQkgICAgIHctPnRocmVhZC0+cG9ydCwgaW5mLT50YXNrLT5wb3J0LAorCQkgICAgIGUtPmV4Y2VwdGlvbiwgZS0+Y29kZSwgZS0+c3ViY29kZSk7CisJICBlcnIgPQorCSAgICBleGNlcHRpb25fcmFpc2VfcmVxdWVzdCAoZS0+aGFuZGxlciwKKwkJCQkgICAgIGUtPnJlcGx5LCBNQUNIX01TR19UWVBFX01PVkVfU0VORF9PTkNFLAorCQkJCSAgICAgdy0+dGhyZWFkLT5wb3J0LCBpbmYtPnRhc2stPnBvcnQsCisJCQkJICAgICBlLT5leGNlcHRpb24sIGUtPmNvZGUsIGUtPnN1YmNvZGUpOworCX0KKyAgICAgIGVsc2UKKwllcnJvciAoIkNhbid0IGZvcndhcmQgc3BvbnRhbmVvdXMgZXhjZXB0aW9uICglcykuIiwgTkFNRSk7CisgICAgfQorICBlbHNlCisgICAgLyogQSBVbml4IHNpZ25hbC4gICovCisgICAgaWYgKGluZi0+c3RvcHBlZCkKKyAgICAgIC8qIFRoZSBwcm9jZXNzIGlzIHN0b3BwZWQgYW5kIGV4cGVjdGluZyBhIHNpZ25hbC4gIEp1c3Qgc2VuZCBvZmYgYQorCSByZXF1ZXN0IGFuZCBsZXQgaXQgZ2V0IGhhbmRsZWQgd2hlbiB3ZSByZXN1bWUgZXZlcnl0aGluZy4gICovCisgICAgICB7CisJaW5mX2RlYnVnIChpbmYsICJzZW5kaW5nICVzIHRvIHN0b3BwZWQgcHJvY2VzcyIsIE5BTUUpOworCWVyciA9CisJICBJTkZfTVNHUE9SVF9SUEMgKGluZiwKKwkJCSAgIG1zZ19zaWdfcG9zdF91bnRyYWNlZF9yZXF1ZXN0IChtc2dwb3J0LAorCQkJCQkJCSAgaW5mLT5ldmVudF9wb3J0LAorCQkJCQkJCSAgTUFDSF9NU0dfVFlQRV9NQUtFX1NFTkRfT05DRSwKKwkJCQkJCQkgIGhvc3Rfc2lnLCAwLAorCQkJCQkJCSAgcmVmcG9ydCkpOworCWlmICghIGVycikKKwkgIC8qIFBvc3RpbmcgYW4gdW50cmFjZWQgc2lnbmFsIGF1dG9tYXRpY2FsbHkgY29udGludWVzIGl0LgorCSAgICAgV2UgY2xlYXIgdGhpcyBoZXJlIHJhdGhlciB0aGFuIHdoZW4gd2UgZ2V0IHRoZSByZXBseQorCSAgICAgYmVjYXVzZSB3ZSdkIHJhdGhlciBhc3N1bWUgaXQncyBub3Qgc3RvcHBlZCB3aGVuIGl0CisJICAgICBhY3R1YWxseSBpcywgdGhhbiB0aGUgcmV2ZXJzZS4gICovCisJICBpbmYtPnN0b3BwZWQgPSAwOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIC8qIEl0J3Mgbm90IGV4cGVjdGluZyBpdC4gIFdlIGhhdmUgdG8gbGV0IGp1c3QgdGhlIHNpZ25hbCB0aHJlYWQKKwkgcnVuLCBhbmQgd2FpdCBmb3IgaXQgdG8gZ2V0IGludG8gYSByZWFzb25hYmxlIHN0YXRlIGJlZm9yZSB3ZQorCSBjYW4gY29udGludWUgdGhlIHJlc3Qgb2YgdGhlIHByb2Nlc3MuICBXaGVuIHdlIGZpbmFsbHkgcmVzdW1lIHRoZQorCSBwcm9jZXNzIHRoZSBzaWduYWwgd2UgcmVxdWVzdCB3aWxsIGJlIHRoZSB2ZXJ5IGZpcnN0IHRoaW5nIHRoYXQKKwkgaGFwcGVucy4gKi8KKyAgICAgIHsKKwlpbmZfZGVidWcgKGluZiwgInNlbmRpbmcgJXMgdG8gdW5zdG9wcGVkIHByb2Nlc3MgKHNvIHJlc3VtaW5nIHNpZ25hbCB0aHJlYWQpIiwgTkFNRSk7CisJZXJyID0gCisJICBJTkZfUkVTVU1FX01TR1BPUlRfUlBDIChpbmYsIG1zZ19zaWdfcG9zdF91bnRyYWNlZCAobXNncG9ydCwKKwkJCQkJCQkgICAgICBob3N0X3NpZywgMCwgcmVmcG9ydCkpOworICAgICAgfQorCisgIGlmIChlcnIgPT0gRUlFSU8pCisgICAgLyogQ2FuJ3QgZG8gdG9vIG11Y2guLi4gKi8KKyAgICB3YXJuaW5nICgiQ2FuJ3QgZGVsaXZlciBzaWduYWwgJXM6IE5vIHNpZ25hbCB0aHJlYWQuIiwgTkFNRSk7CisgIGVsc2UgaWYgKGVycikKKyAgICB3YXJuaW5nICgiRGVsaXZlcmluZyBzaWduYWwgJXM6ICVzIiwgTkFNRSwgc3RyZXJyb3IgKGVycikpOworCisjdW5kZWYgTkFNRQorfQorDAorLyogVGhlIGluZmVyaW9yIHVzZWQgZm9yIGFsbCBnZGIgdGFyZ2V0IG9wcy4gICovCitzdHJ1Y3QgaW5mICpjdXJyZW50X2luZmVyaW9yID0gMDsKKworLyogVGhlIGluZmVyaW9yIGJlaW5nIHdhaXRlZCBmb3IgYnkgZ251X3dhaXQuICBTaW5jZSBHREIgaXMgZGVjaWRlbHkgbm90CisgICBtdWx0aS10aHJlYWRlZCwgd2UgZG9uJ3QgYm90aGVyIHRvIGxvY2sgdGhpcy4gICovCitzdHJ1Y3QgaW5mICp3YWl0aW5nX2luZjsKKworLyogV2FpdCBmb3Igc29tZXRoaW5nIHRvIGhhcHBlbiBpbiB0aGUgaW5mZXJpb3IsIHJldHVybmluZyB3aGF0IGluIFNUQVRVUy4gKi8KK3N0YXRpYyBpbnQKK2dudV93YWl0IChpbnQgdGlkLCBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0YXR1cykKK3sKKyAgc3RydWN0IG1zZyB7CisgICAgbWFjaF9tc2dfaGVhZGVyX3QgaGRyOworICAgIG1hY2hfbXNnX3R5cGVfdCB0eXBlOworICAgIGludCBkYXRhWzgwMDBdOworICB9IG1zZzsKKyAgZXJyb3JfdCBlcnI7CisgIHN0cnVjdCBwcm9jICp0aHJlYWQ7CisgIHN0cnVjdCBpbmYgKmluZiA9IGN1cnJlbnRfaW5mZXJpb3I7CisKKyAgYXNzZXJ0IChpbmYtPnRhc2spOworCisgIGlmICghaW5mLT50aHJlYWRzICYmICFpbmYtPnBlbmRpbmdfZXhlY3MpCisgICAgLyogTm8gdGhyZWFkcyEgIEFzc3VtZSB0aGF0IG1heWJlIHNvbWUgb3V0c2lkZSBhZ2VuY3kgaXMgZnJvYmJpbmcgb3VyCisgICAgICAgdGFzaywgYW5kIHJlYWxseSBsb29rIGZvciBuZXcgdGhyZWFkcy4gIElmIHdlIGNhbid0IGZpbmQgYW55LCBqdXN0IHRlbGwKKyAgICAgICB0aGUgdXNlciB0byB0cnkgYWdhaW4gbGF0ZXIuICAqLworICAgIHsKKyAgICAgIGluZl92YWxpZGF0ZV9wcm9jcyAoaW5mKTsKKyAgICAgIGlmICghaW5mLT50aHJlYWRzICYmICFpbmYtPnRhc2stPmRlYWQpCisJZXJyb3IgKCJUaGVyZSBhcmUgbm8gdGhyZWFkczsgdHJ5IGFnYWluIGxhdGVyLiIpOworICAgIH0KKworICB3YWl0aW5nX2luZiA9IGluZjsKKworICBpbmZfZGVidWcgKGluZiwgIndhaXRpbmcgZm9yOiAlZCIsIHRpZCk7CisKKyByZXdhaXQ6CisgIGlmIChwcm9jX3dhaXRfcGlkICE9IGluZi0+cGlkICYmICFpbmYtPm5vX3dhaXQpCisgICAgLyogQWx3YXlzIGdldCBpbmZvcm1hdGlvbiBvbiBldmVudHMgZnJvbSB0aGUgcHJvYyBzZXJ2ZXIuICAqLworICAgIHsKKyAgICAgIGluZl9kZWJ1ZyAoaW5mLCAicmVxdWVzdGluZyB3YWl0IG9uIHBpZCAlZCIsIGluZi0+cGlkKTsKKworICAgICAgaWYgKHByb2Nfd2FpdF9waWQpCisJLyogVGhlIHByb2Mgc2VydmVyIGlzIHNpbmdsZS10aHJlYWRlZCwgYW5kIG9ubHkgYWxsb3dzIGEgc2luZ2xlCisJICAgb3V0c3RhbmRpbmcgd2FpdCByZXF1ZXN0LCBzbyB3ZSBoYXZlIHRvIGNhbmNlbCB0aGUgcHJldmlvdXMgb25lLiAqLworCXsKKwkgIGluZl9kZWJ1ZyAoaW5mLCAiY2FuY2VsbGluZyBwcmV2aW91cyB3YWl0IG9uIHBpZCAlZCIsIHByb2Nfd2FpdF9waWQpOworCSAgaW50ZXJydXB0X29wZXJhdGlvbiAocHJvY19zZXJ2ZXIsIDApOworCX0KKworICAgICAgZXJyID0KKwlwcm9jX3dhaXRfcmVxdWVzdCAocHJvY19zZXJ2ZXIsIGluZi0+ZXZlbnRfcG9ydCwgaW5mLT5waWQsIFdVTlRSQUNFRCk7CisgICAgICBpZiAoZXJyKQorCXdhcm5pbmcgKCJ3YWl0IHJlcXVlc3QgZmFpbGVkOiAlcyIsIHN0cmVycm9yIChlcnIpKTsKKyAgICAgIGVsc2UKKwl7CisJICBpbmZfZGVidWcgKGluZiwgIndhaXRzIHBlbmRpbmc6ICVkIiwgcHJvY193YWl0c19wZW5kaW5nKTsKKwkgIHByb2Nfd2FpdF9waWQgPSBpbmYtPnBpZDsKKwkgIC8qIEV2ZW4gaWYgcHJvY193YWl0c19wZW5kaW5nIHdhcyA+IDAgYmVmb3JlLCB3ZSBzdGlsbCB3b24ndCBnZXQKKwkgICAgIGFueSBvdGhlciByZXBsaWVzLCBiZWNhdXNlIGl0IHdhcyBlaXRoZXIgZnJvbSBhIGRpZmZlcmVudCBJTkYsCisJICAgICBvciBhIGRpZmZlcmVudCBwcm9jZXNzIGF0dGFjaGVkIHRvIElORiAtLSBhbmQgdGhlIGV2ZW50IHBvcnQsCisJICAgICB3aGljaCBpcyB0aGUgd2FpdCByZXBseSBwb3J0LCBjaGFuZ2VzIHdoZW4geW91IHN3aXRjaCBwcm9jZXNzZXMuKi8KKwkgIHByb2Nfd2FpdHNfcGVuZGluZyA9IDE7CisJfQorICAgIH0KKworICBpbmZfY2xlYXJfd2FpdCAoaW5mKTsKKworICAvKiBXaGF0IGNhbiBoYXBwZW4/ICgxKSBEZWFkIG5hbWUgbm90aWZpY2F0aW9uOyAoMikgRXhjZXB0aW9ucyBhcnJpdmU7CisgICAgICgzKSB3YWl0IHJlcGx5IGZyb20gdGhlIHByb2Mgc2VydmVyLiAgKi8KKworICBpbmZfZGVidWcgKGluZiwgIndhaXRpbmcgZm9yIGFuIGV2ZW50Li4uIik7CisgIGVyciA9IG1hY2hfbXNnICgmbXNnLmhkciwgTUFDSF9SQ1ZfTVNHIHwgTUFDSF9SQ1ZfSU5URVJSVVBULAorCQkgIDAsIHNpemVvZiAoc3RydWN0IG1zZyksIGluZi0+ZXZlbnRfcG9ydCwKKwkJICBNQUNIX01TR19USU1FT1VUX05PTkUsIE1BQ0hfUE9SVF9OVUxMKTsKKworICAvKiBSZS1zdXNwZW5kIHRoZSB0YXNrLiAgKi8KKyAgaW5mX3N1c3BlbmQgKGluZik7CisKKyAgaWYgKCFpbmYtPnRhc2sgJiYgaW5mLT5wZW5kaW5nX2V4ZWNzKQorICAgIC8qIFdoZW4gZG9pbmcgYW4gZXhlYywgaXQncyBwb3NzaWJsZSB0aGF0IHRoZSBvbGQgdGFzayB3YXNuJ3QgcmV1c2VkCisgICAgICAgKGUuZy4sIHNldHVpZCBleGVjcykuICBTbyBpZiB0aGUgdGFzayBzZWVtcyB0byBoYXZlIGRpc2FwcGVhcmVkLAorICAgICAgIGF0dGVtcHQgdG8gcmVmZXRjaCBpdCwgYXMgdGhlIHBpZCBzaG91bGQgc3RpbGwgYmUgdGhlIHNhbWUuICAqLworICAgIGluZl9zZXRfcGlkIChpbmYsIGluZi0+cGlkKTsKKworICBpZiAoZXJyID09IEVNQUNIX1JDVl9JTlRFUlJVUFRFRCkKKyAgICBpbmZfZGVidWcgKGluZiwgImludGVycnVwdGVkIik7CisgIGVsc2UgaWYgKGVycikKKyAgICBlcnJvciAoIkNvdWxkbid0IHdhaXQgZm9yIGFuIGV2ZW50OiAlcyIsIHN0cmVycm9yIChlcnIpKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCB7CisJbWFjaF9tc2dfaGVhZGVyX3QgaGRyOworCW1hY2hfbXNnX3R5cGVfdCBlcnJfdHlwZTsKKwlrZXJuX3JldHVybl90IGVycjsKKwljaGFyIG5vaXNlWzIwMF07CisgICAgICB9IHJlcGx5OworCisgICAgICBpbmZfZGVidWcgKGluZiwgImV2ZW50OiBtc2dpZCA9ICVkIiwgbXNnLmhkci5tc2doX2lkKTsKKworICAgICAgLyogSGFuZGxlIHdoYXQgd2UgZ290LiAgKi8KKyAgICAgIGlmICghIG5vdGlmeV9zZXJ2ZXIgKCZtc2cuaGRyLCAmcmVwbHkuaGRyKQorCSAgJiYgISBleGNfc2VydmVyICgmbXNnLmhkciwgJnJlcGx5LmhkcikKKwkgICYmICEgcHJvY2Vzc19yZXBseV9zZXJ2ZXIgKCZtc2cuaGRyLCAmcmVwbHkuaGRyKQorCSAgJiYgISBtc2dfcmVwbHlfc2VydmVyICgmbXNnLmhkciwgJnJlcGx5LmhkcikpCisJLyogV2hhdGV2ZXIgaXQgaXMsIGl0J3Mgc29tZXRoaW5nIHN0cmFuZ2UuICAqLworCWVycm9yICgiR290IGEgc3RyYW5nZSBldmVudCwgbXNnIGlkID0gJWQuIiwgbXNnLmhkci5tc2doX2lkKTsKKworICAgICAgaWYgKHJlcGx5LmVycikKKwllcnJvciAoIkhhbmRsaW5nIGV2ZW50LCBtc2dpZCA9ICVkOiAlcyIsCisJICAgICAgIG1zZy5oZHIubXNnaF9pZCwgc3RyZXJyb3IgKHJlcGx5LmVycikpOworICAgIH0KKworICBpZiAoaW5mLT5wZW5kaW5nX2V4ZWNzKQorICAgIC8qIFdlJ3JlIHdhaXRpbmcgZm9yIHRoZSBpbmZlcmlvciB0byBmaW5pc2ggZXhlY2luZy4gICovCisgICAgeworICAgICAgc3RydWN0IGluZl93YWl0ICp3ID0gJmluZi0+d2FpdDsKKyAgICAgIGVudW0gdGFyZ2V0X3dhaXRraW5kIGtpbmQgPSB3LT5zdGF0dXMua2luZDsKKworICAgICAgaWYgKGtpbmQgPT0gVEFSR0VUX1dBSVRLSU5EX1NQVVJJT1VTKQorCS8qIFNpbmNlIGdkYiBpcyBhY3R1YWxseSBjb3VudGluZyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBpbmZlcmlvcgorCSAgIHN0b3BzLCBleHBlY3Rpbmcgb25lIHN0b3AgcGVyIGV4ZWMsIHdlIG9ubHkgcmV0dXJuIG1ham9yIGV2ZW50cworCSAgIHdoaWxlIGV4ZWNpbmcuICAqLworCXsKKwkgIHctPnN1cHByZXNzID0gMTsKKwkgIGluZl9kZWJ1ZyAoaW5mLCAicGVuZGluZ19leGVjcyA9ICVkLCBpZ25vcmluZyBtaW5vciBldmVudCIsCisJCSAgICAgaW5mLT5wZW5kaW5nX2V4ZWNzKTsKKwl9CisgICAgICBlbHNlIGlmIChraW5kID09IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVECisJICAgICAgICYmIHctPnN0YXR1cy52YWx1ZS5zaWcgPT0gVEFSR0VUX1NJR05BTF9UUkFQKQorCS8qIEFoIGhhaCEgIEEgU0lHVFJBUCBmcm9tIHRoZSBpbmZlcmlvciB3aGlsZSBzdGFydGluZyB1cCBwcm9iYWJseQorCSAgIG1lYW5zIHdlJ3ZlIHN1Y2Nlc2Z1bGx5IGNvbXBsZXRlZCBhbiBleGVjISAgKi8KKwl7CisJICBpZiAoLS1pbmYtPnBlbmRpbmdfZXhlY3MgPT0gMCkKKwkgICAgLyogV2UncmUgZG9uZSEgICovCisJICAgIHsKKyNpZiAwCS8qIGRvIHdlIG5lZWQgdGhpcz8gKi8KKwkgICAgICBwcnVuZV90aHJlYWRzICgxKTsJLyogR2V0IHJpZCBvZiB0aGUgb2xkIHNoZWxsIHRocmVhZHMgKi8KKwkgICAgICByZW51bWJlcl90aHJlYWRzICgwKTsgLyogR2l2ZSBvdXIgdGhyZWFkcyByZWFzb25hYmxlIG5hbWVzLiAqLworI2VuZGlmCisJICAgIH0KKwkgIGluZl9kZWJ1ZyAoaW5mLCAicGVuZGluZyBleGVjIGNvbXBsZXRlZCwgcGVuZGluZ19leGVjcyA9PiAlZCIsCisJCSAgICAgaW5mLT5wZW5kaW5nX2V4ZWNzKTsKKwl9CisgICAgICBlbHNlIGlmIChraW5kID09IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEKQorCS8qIEl0J3MgcG9zc2libGUgdGhhdCB0aGlzIHNpZ25hbCBpcyBiZWNhdXNlIG9mIGEgY3Jhc2hlZCBwcm9jZXNzCisJICAgYmVpbmcgaGFuZGxlZCBieSB0aGUgaHVyZCBjcmFzaCBzZXJ2ZXI7IGluIHRoaXMgY2FzZSwgdGhlIHByb2Nlc3MKKwkgICB3aWxsIGhhdmUgYW4gZXh0cmEgdGFzayBzdXNwZW5kLCB3aGljaCB3ZSBuZWVkIHRvIGtub3cgYWJvdXQuCisJICAgU2luY2UgdGhlIGNvZGUgaW4gaW5mX3Jlc3VtZSB0aGF0IG5vcm1hbGx5IGNoZWNrcyBmb3IgdGhpcyBpcworCSAgIGRpc2FibGVkIHdoaWxlIElORi0+cGVuZGluZ19leGVjcywgd2UgZG8gdGhlIGNoZWNrIGhlcmUgaW5zdGVhZC4gICovCisJaW5mX3ZhbGlkYXRlX3Rhc2tfc2MgKGluZik7CisgICAgfQorCisgIGlmIChpbmYtPndhaXQuc3VwcHJlc3MpCisgICAgLyogU29tZSB0b3RhbGx5IHNwdXJpb3VzIGV2ZW50IGhhcHBlbmVkIHRoYXQgd2UgZG9uJ3QgY29uc2lkZXIKKyAgICAgICB3b3J0aCByZXR1cm5pbmcgdG8gZ2RiLiAgSnVzdCBrZWVwIHdhaXRpbmcuICAqLworICAgIHsKKyAgICAgIGluZl9kZWJ1ZyAoaW5mLCAic3VwcHJlc3NpbmcgcmV0dXJuLCByZXdhaXRpbmcuLi4iKTsKKyAgICAgIGluZl9yZXN1bWUgKGluZik7CisgICAgICBnb3RvIHJld2FpdDsKKyAgICB9CisKKyAgLyogUGFzcyBiYWNrIG91dCBvdXIgcmVzdWx0cy4gICovCisgIGJjb3B5ICgmaW5mLT53YWl0LnN0YXR1cywgc3RhdHVzLCBzaXplb2YgKCpzdGF0dXMpKTsKKworICB0aHJlYWQgPSBpbmYtPndhaXQudGhyZWFkOworICBpZiAodGhyZWFkKQorICAgIHRpZCA9IHRocmVhZC0+dGlkOworICBlbHNlCisgICAgdGhyZWFkID0gaW5mX3RpZF90b190aHJlYWQgKGluZiwgdGlkKTsKKworICBpZiAoIXRocmVhZCB8fCB0aHJlYWQtPnBvcnQgPT0gTUFDSF9QT1JUX05VTEwpCisgICAgLyogVElEIGlzIGRlYWQ7IHRyeSBhbmQgZmluZCBhIG5ldyB0aHJlYWQuICAqLworICAgIGlmIChpbmZfdXBkYXRlX3Byb2NzIChpbmYpICYmIGluZi0+dGhyZWFkcykKKyAgICAgIHRpZCA9IGluZi0+dGhyZWFkcy0+dGlkOwkvKiBUaGUgZmlyc3QgYXZhaWxhYmxlIHRocmVhZC4gICovCisgICAgZWxzZQorICAgICAgdGlkID0gaW5mZXJpb3JfcGlkOyAvKiBsZXQgd2FpdF9mb3JfaW5mZXJpb3IgaGFuZGxlIGV4aXQgY2FzZSAqLworCisgIGlmICh0aHJlYWQgJiYgdGlkID49IDAgJiYgc3RhdHVzLT5raW5kICE9IFRBUkdFVF9XQUlUS0lORF9TUFVSSU9VUworICAgICAgJiYgaW5mLT5wYXVzZV9zYyA9PSAwICYmIHRocmVhZC0+cGF1c2Vfc2MgPT0gMCkKKyAgICAvKiBJZiBzb21ldGhpbmcgYWN0dWFsbHkgaGFwcGVuZWQgdG8gVEhSRUFELCBtYWtlIHN1cmUgd2Ugc3VzcGVuZCBpdC4gICovCisgICAgeworICAgICAgdGhyZWFkLT5zYyA9IDE7CisgICAgICBpbmZfdXBkYXRlX3N1c3BlbmRzIChpbmYpOworICAgIH0gICAgICAKKworICBpbmZfZGVidWcgKGluZiwgInJldHVybmluZyB0aWQgPSAlZCwgc3RhdHVzID0gJXMgKCVkKSIsIHRpZCwKKwkgICAgIHN0YXR1cy0+a2luZCA9PSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVEID8gIkVYSVRFRCIKKwkgICAgIDogc3RhdHVzLT5raW5kID09IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEID8gIlNUT1BQRUQiCisJICAgICA6IHN0YXR1cy0+a2luZCA9PSBUQVJHRVRfV0FJVEtJTkRfU0lHTkFMTEVEID8gIlNJR05BTExFRCIKKwkgICAgIDogc3RhdHVzLT5raW5kID09IFRBUkdFVF9XQUlUS0lORF9MT0FERUQgPyAiTE9BREVEIgorCSAgICAgOiBzdGF0dXMtPmtpbmQgPT0gVEFSR0VUX1dBSVRLSU5EX1NQVVJJT1VTID8gIlNQVVJJT1VTIgorCSAgICAgOiAiPyIsCisJICAgICBzdGF0dXMtPnZhbHVlLmludGVnZXIpOworCisgIHJldHVybiB0aWQ7Cit9CisMCisvKiBUaGUgcnBjIGhhbmRsZXIgY2FsbGVkIGJ5IGV4Y19zZXJ2ZXIuICAqLworZXJyb3JfdAorU19leGNlcHRpb25fcmFpc2VfcmVxdWVzdCAobWFjaF9wb3J0X3QgcG9ydCwgbWFjaF9wb3J0X3QgcmVwbHlfcG9ydCwKKwkJCSAgIHRocmVhZF90IHRocmVhZF9wb3J0LCB0YXNrX3QgdGFza19wb3J0LAorCQkJICAgaW50IGV4Y2VwdGlvbiwgaW50IGNvZGUsIGludCBzdWJjb2RlKQoreworICBzdHJ1Y3QgaW5mICppbmYgPSB3YWl0aW5nX2luZjsKKyAgc3RydWN0IHByb2MgKnRocmVhZCA9IGluZl9wb3J0X3RvX3RocmVhZCAoaW5mLCB0aHJlYWRfcG9ydCk7CisKKyAgaW5mX2RlYnVnICh3YWl0aW5nX2luZiwKKwkgICAgICJ0aHJlYWQgPSAlZCwgdGFzayA9ICVkLCBleGMgPSAlZCwgY29kZSA9ICVkLCBzdWJjb2RlID0gJWQiLAorCSAgICAgdGhyZWFkX3BvcnQsIHRhc2tfcG9ydCwgZXhjZXB0aW9uLCBjb2RlKTsKKworICBpZiAoIXRocmVhZCkKKyAgICAvKiBXZSBkb24ndCBrbm93IGFib3V0IHRocmVhZD8gICovCisgICAgeworICAgICAgaW5mX3VwZGF0ZV9wcm9jcyAoaW5mKTsKKyAgICAgIHRocmVhZCA9IGluZl9wb3J0X3RvX3RocmVhZCAoaW5mLCB0aHJlYWRfcG9ydCk7CisgICAgICBpZiAoIXRocmVhZCkKKwkvKiBHaXZlIHVwLCB0aGUgZ2VuZXJhdGluZyB0aHJlYWQgaXMgZ29uZS4gICovCisJcmV0dXJuIDA7CisgICAgfQorCisgIG1hY2hfcG9ydF9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwgdGhyZWFkX3BvcnQpOworICBtYWNoX3BvcnRfZGVhbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYgKCksIHRhc2tfcG9ydCk7CisKKyAgaWYgKCEgdGhyZWFkLT5hYm9ydGVkKQorICAgIC8qIFRIUkVBRCBoYXNuJ3QgYmVlbiBhYm9ydGVkIHNpbmNlIHRoaXMgZXhjZXB0aW9uIGhhcHBlbmVkIChhYm9ydGlvbgorICAgICAgIGNsZWFycyBhbnkgZXhjZXB0aW9uIHN0YXRlKSwgc28gaXQgbXVzdCBiZSByZWFsLiAgKi8KKyAgICB7CisgICAgICAvKiBTdG9yZSBhd2F5IHRoZSBkZXRhaWxzOyB0aGlzIHdpbGwgZGVzdHJveSBhbnkgcHJldmlvdXMgaW5mby4gICovCisgICAgICBpbmYtPndhaXQudGhyZWFkID0gdGhyZWFkOworCisgICAgICBpbmYtPndhaXQuc3RhdHVzLmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKworICAgICAgaWYgKGV4Y2VwdGlvbiA9PSBFWENfQlJFQUtQT0lOVCkKKwkvKiBHREIgbGlrZXMgdG8gZ2V0IFNJR1RSQVAgZm9yIGJyZWFrcG9pbnRzLiAgKi8KKwl7CisJICBpbmYtPndhaXQuc3RhdHVzLnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVFJBUDsKKwkgIG1hY2hfcG9ydF9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwgcmVwbHlfcG9ydCk7CisJfQorICAgICAgZWxzZQorCS8qIFJlY29yZCB0aGUgZXhjZXB0aW9uIHNvIHRoYXQgd2UgY2FuIGZvcndhcmQgaXQgbGF0ZXIuICAqLworCXsKKwkgIGlmICh0aHJlYWQtPmV4Y19wb3J0ID09IHBvcnQpCisJICAgIHsKKwkgICAgICBpbmZfZGVidWcgKHdhaXRpbmdfaW5mLCAiSGFuZGxlciBpcyB0aHJlYWQgZXhlcHRpb24gcG9ydCA8JWQ+IiwKKwkJCSB0aHJlYWQtPnNhdmVkX2V4Y19wb3J0KTsKKwkgICAgICBpbmYtPndhaXQuZXhjLmhhbmRsZXIgPSB0aHJlYWQtPnNhdmVkX2V4Y19wb3J0OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpbmZfZGVidWcgKHdhaXRpbmdfaW5mLCAiSGFuZGxlciBpcyB0YXNrIGV4ZXB0aW9uIHBvcnQgPCVkPiIsCisJCQkgaW5mLT50YXNrLT5zYXZlZF9leGNfcG9ydCk7CisJICAgICAgaW5mLT53YWl0LmV4Yy5oYW5kbGVyID0gaW5mLT50YXNrLT5zYXZlZF9leGNfcG9ydDsKKwkgICAgICBhc3NlcnQgKGluZi0+dGFzay0+ZXhjX3BvcnQgPT0gcG9ydCk7CisJICAgIH0KKwkgIGlmIChpbmYtPndhaXQuZXhjLmhhbmRsZXIgIT0gTUFDSF9QT1JUX05VTEwpCisJICAgIC8qIEFkZCBhIHJlZmVyZW5jZSB0byB0aGUgZXhjZXB0aW9uIGhhbmRsZXIuICovCisJICAgIG1hY2hfcG9ydF9tb2RfcmVmcyAobWFjaF90YXNrX3NlbGYgKCksCisJCQkJaW5mLT53YWl0LmV4Yy5oYW5kbGVyLCBNQUNIX1BPUlRfUklHSFRfU0VORCwKKwkJCQkxKTsKKworCSAgaW5mLT53YWl0LmV4Yy5leGNlcHRpb24gPSBleGNlcHRpb247CisJICBpbmYtPndhaXQuZXhjLmNvZGUgPSBjb2RlOworCSAgaW5mLT53YWl0LmV4Yy5zdWJjb2RlID0gc3ViY29kZTsKKwkgIGluZi0+d2FpdC5leGMucmVwbHkgPSByZXBseV9wb3J0OworCisJICAvKiBFeGNlcHRpb25zIGFyZSBlbmNvZGVkIGluIHRoZSBzaWduYWwgc3BhY2UgYnkgcHV0dGluZyB0aGVtIGFmdGVyCisJICAgICBfTlNJRzsgdGhpcyBhc3N1bWVzIHRoZXkncmUgcG9zaXRpdmUgKGFuZCBub3QgZXh0cmVtZWx5IGxhcmdlKSEgKi8KKwkgIGluZi0+d2FpdC5zdGF0dXMudmFsdWUuc2lnID0KKwkgICAgdGFyZ2V0X3NpZ25hbF9mcm9tX2hvc3QgKF9OU0lHICsgZXhjZXB0aW9uKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgLyogQSBzdXBwcHJlc3NlZCBleGNlcHRpb24sIHdoaWNoIGlnbm9yZS4gICovCisgICAgeworICAgICAgaW5mLT53YWl0LnN1cHByZXNzID0gMTsKKyAgICAgIG1hY2hfcG9ydF9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwgcmVwbHlfcG9ydCk7CisgICAgfQorCisgIHJldHVybiAwOworfQorDAorLyogRmlsbCBpbiBJTkYncyB3YWl0IGZpZWxkIGFmdGVyIGEgdGFzayBoYXMgZGllZCB3aXRob3V0IGdpdmluZyB1cyBtb3JlCisgICBkZXRhaWxlZCBpbmZvcm1hdGlvbi4gICovCit2b2lkCitpbmZfdGFza19kaWVkX3N0YXR1cyAoc3RydWN0IGluZiAqaW5mKQoreworICB3YXJuaW5nICgiUGlkICVkIGRpZWQgd2l0aCB1bmtub3duIGV4aXQgc3RhdHVzLCB1c2luZyBTSUdLSUxMLiIsIGluZi0+cGlkKTsKKyAgaW5mLT53YWl0LnN0YXR1cy5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NJR05BTExFRDsKKyAgaW5mLT53YWl0LnN0YXR1cy52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX0tJTEw7Cit9CisKKy8qIE5vdGlmeSBzZXJ2ZXIgcm91dGluZXMuICBUaGUgb25seSByZWFsIG9uZSBpcyBkZWFkIG5hbWUgbm90aWZpY2F0aW9uLiAgKi8KK2Vycm9yX3QKK2RvX21hY2hfbm90aWZ5X2RlYWRfbmFtZSAobWFjaF9wb3J0X3Qgbm90aWZ5LCBtYWNoX3BvcnRfdCBkZWFkX3BvcnQpCit7CisgIHN0cnVjdCBpbmYgKmluZiA9IHdhaXRpbmdfaW5mOworCisgIGluZl9kZWJ1ZyAod2FpdGluZ19pbmYsICJwb3J0ID0gJWQiLCBkZWFkX3BvcnQpOworCisgIGlmIChpbmYtPnRhc2sgJiYgaW5mLT50YXNrLT5wb3J0ID09IGRlYWRfcG9ydCkKKyAgICB7CisgICAgICBwcm9jX2RlYnVnIChpbmYtPnRhc2ssICJpcyBkZWFkIik7CisgICAgICBpbmYtPnRhc2stPnBvcnQgPSBNQUNIX1BPUlRfTlVMTDsKKyAgICAgIGlmIChwcm9jX3dhaXRfcGlkID09IGluZi0+cGlkKQorCS8qIFdlIGhhdmUgYSB3YWl0IG91dHN0YW5kaW5nIG9uIHRoZSBwcm9jZXNzLCB3aGljaCB3aWxsIHJldHVybiBtb3JlCisJICAgZGV0YWlsZWQgaW5mb3JtYXRpb24sIHNvIGRlbGF5IHVudGlsIHdlIGdldCB0aGF0LiAgKi8KKwlpbmYtPndhaXQuc3VwcHJlc3MgPSAxOworICAgICAgZWxzZQorCS8qIFdlIG5ldmVyIHdhaXRlZCBmb3IgdGhlIHByb2Nlc3MgKG1heWJlIGl0IHdhc24ndCBhIGNoaWxkKSwgc28ganVzdAorCSAgIHByZXRlbmQgaXQgZ290IGEgU0lHS0lMTC4gICovCisJaW5mX3Rhc2tfZGllZF9zdGF0dXMgKGluZik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3RydWN0IHByb2MgKnRocmVhZCA9IGluZl9wb3J0X3RvX3RocmVhZCAoaW5mLCBkZWFkX3BvcnQpOworICAgICAgaWYgKHRocmVhZCkKKwl7CisJICBwcm9jX2RlYnVnICh0aHJlYWQsICJpcyBkZWFkIik7CisJICB0aHJlYWQtPnBvcnQgPSBNQUNIX1BPUlRfTlVMTDsKKwl9CisgICAgfQorCisgIG1hY2hfcG9ydF9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwgZGVhZF9wb3J0KTsKKyAgaW5mLT50aHJlYWRzX3VwX3RvX2RhdGUgPSAwOyAvKiBKdXN0IGluIGNhc2UgKi8KKworICByZXR1cm4gMDsKK30KKwwKK3N0YXRpYyBlcnJvcl90CitpbGxfcnBjIChjaGFyICpmdW4pCit7CisgIHdhcm5pbmcgKCJpbGxlZ2FsIHJwYzogJXMiLCBmdW4pOworICByZXR1cm4gMDsKK30KKworZXJyb3JfdAorZG9fbWFjaF9ub3RpZnlfbm9fc2VuZGVycyAobWFjaF9wb3J0X3Qgbm90aWZ5LCBtYWNoX3BvcnRfbXNjb3VudF90IGNvdW50KQoreworICByZXR1cm4gaWxsX3JwYyAoX19GVU5DVElPTl9fKTsKK30KKworZXJyb3JfdAorZG9fbWFjaF9ub3RpZnlfcG9ydF9kZWxldGVkIChtYWNoX3BvcnRfdCBub3RpZnksIG1hY2hfcG9ydF90IG5hbWUpCit7CisgIHJldHVybiBpbGxfcnBjIChfX0ZVTkNUSU9OX18pOworfQorCitlcnJvcl90Citkb19tYWNoX25vdGlmeV9tc2dfYWNjZXB0ZWQgKG1hY2hfcG9ydF90IG5vdGlmeSwgbWFjaF9wb3J0X3QgbmFtZSkKK3sKKyAgcmV0dXJuIGlsbF9ycGMgKF9fRlVOQ1RJT05fXyk7Cit9CisKK2Vycm9yX3QKK2RvX21hY2hfbm90aWZ5X3BvcnRfZGVzdHJveWVkIChtYWNoX3BvcnRfdCBub3RpZnksIG1hY2hfcG9ydF90IG5hbWUpCit7CisgIHJldHVybiBpbGxfcnBjIChfX0ZVTkNUSU9OX18pOworfQorCitlcnJvcl90Citkb19tYWNoX25vdGlmeV9zZW5kX29uY2UgKG1hY2hfcG9ydF90IG5vdGlmeSkKK3sKKyAgcmV0dXJuIGlsbF9ycGMgKF9fRlVOQ1RJT05fXyk7Cit9CisMCisvKiBQcm9jZXNzX3JlcGx5IHNlcnZlciByb3V0aW5lcy4gIFdlIG9ubHkgdXNlIHByb2Nlc3Nfd2FpdF9yZXBseS4gICovCisKK2Vycm9yX3QKK1NfcHJvY193YWl0X3JlcGx5IChtYWNoX3BvcnRfdCByZXBseSwgZXJyb3JfdCBlcnIsCisJCSAgIGludCBzdGF0dXMsIGludCBzaWdjb2RlLCBydXNhZ2VfdCBydXNhZ2UsIHBpZF90IHBpZCkKK3sKKyAgc3RydWN0IGluZiAqaW5mID0gd2FpdGluZ19pbmY7CisKKyAgaW5mX2RlYnVnIChpbmYsICJlcnIgPSAlcywgcGlkID0gJWQsIHN0YXR1cyA9IDB4JXgsIHNpZ2NvZGUgPSAlZCIsCisJICAgICBlcnIgPyBzdHJlcnJvciAoZXJyKSA6ICIwIiwgcGlkLCBzdGF0dXMsIHNpZ2NvZGUpOworCisgIGlmIChlcnIgJiYgcHJvY193YWl0X3BpZCAmJiAoIWluZi0+dGFzayB8fCAhaW5mLT50YXNrLT5wb3J0KSkKKyAgICAvKiBBY2suICBUaGUgdGFzayBoYXMgZGllZCwgYnV0IHRoZSB0YXNrLWRpZWQgbm90aWZpY2F0aW9uIGNvZGUgZGlkbid0CisgICAgICAgdGVsbCBhbnlvbmUgYmVjYXVzZSBpdCB0aG91Z2h0IGEgbW9yZSBkZXRhaWxlZCByZXBseSBmcm9tIHRoZQorICAgICAgIHByb2NzZXJ2ZXIgd2FzIGZvcnRoY29taW5nLiAgSG93ZXZlciwgd2Ugbm93IGxlYXJuIHRoYXQgd29uJ3QKKyAgICAgICBoYXBwZW4uLi4gIFNvIHdlIGhhdmUgdG8gYWN0IGxpa2UgdGhlIHRhc2sganVzdCBkaWVkLCBhbmQgdGhpcyB0aW1lLAorICAgICAgIHRlbGwgdGhlIHdvcmxkLiAgKi8KKyAgICBpbmZfdGFza19kaWVkX3N0YXR1cyAoaW5mKTsKKworICBpZiAoLS1wcm9jX3dhaXRzX3BlbmRpbmcgPT0gMCkKKyAgICAvKiBQUk9DX1dBSVRfUElEIHJlcHJlc2VudHMgdGhlIG1vc3QgcmVjZW50IHdhaXQuICBXZSB3aWxsIGFsd2F5cyBnZXQKKyAgICAgICByZXBsaWVzIGluIG9yZGVyIGJlY2F1c2UgdGhlIHByb2Mgc2VydmVyIGlzIHNpbmdsZSB0aHJlYWRlZC4gICovCisgICAgcHJvY193YWl0X3BpZCA9IDA7CisKKyAgaW5mX2RlYnVnIChpbmYsICJ3YWl0cyBwZW5kaW5nIG5vdzogJWQiLCBwcm9jX3dhaXRzX3BlbmRpbmcpOworCisgIGlmIChlcnIpCisgICAgeworICAgICAgaWYgKGVyciAhPSBFSU5UUikKKwl7CisJICB3YXJuaW5nICgiQ2FuJ3Qgd2FpdCBmb3IgcGlkICVkOiAlcyIsIGluZi0+cGlkLCBzdHJlcnJvciAoZXJyKSk7CisJICBpbmYtPm5vX3dhaXQgPSAxOworCisJICAvKiBTaW5jZSB3ZSBjYW4ndCBzZWUgdGhlIGluZmVyaW9yJ3Mgc2lnbmFscywgZG9uJ3QgdHJhcCB0aGVtLiAgKi8KKwkgIGluZl9zZXRfdHJhY2VkIChpbmYsIDApOworCX0KKyAgICB9CisgIGVsc2UgaWYgKHBpZCA9PSBpbmYtPnBpZCkKKyAgICB7CisgICAgICBzdG9yZV93YWl0c3RhdHVzICgmaW5mLT53YWl0LnN0YXR1cywgc3RhdHVzKTsKKyAgICAgIGlmIChpbmYtPndhaXQuc3RhdHVzLmtpbmQgPT0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQpCisJLyogVGhlIHByb2Nlc3MgaGFzIHNlbnQgdXMgYSBzaWduYWwsIGFuZCBzdG9wcGVkIGl0c2VsZiBpbiBhIHNhbmUKKwkgICBzdGF0ZSBwZW5kaW5nIG91ciBhY3Rpb25zLiAgKi8KKwl7CisJICBpbmZfZGVidWcgKGluZiwgInByb2Nlc3MgaGFzIHN0b3BwZWQgaXRzZWxmIik7CisJICBpbmYtPnN0b3BwZWQgPSAxOworCX0KKyAgICB9CisgIGVsc2UKKyAgICBpbmYtPndhaXQuc3VwcHJlc3MgPSAxOwkvKiBTb21ldGhpbmcgb2RkIGhhcHBlbmVkLiAgSWdub3JlLiAgKi8KKworICByZXR1cm4gMDsKK30KKworZXJyb3JfdAorU19wcm9jX3NldG1zZ3BvcnRfcmVwbHkgKG1hY2hfcG9ydF90IHJlcGx5LCBlcnJvcl90IGVyciwKKwkJCSBtYWNoX3BvcnRfdCBvbGRfbXNnX3BvcnQpCit7CisgIHJldHVybiBpbGxfcnBjIChfX0ZVTkNUSU9OX18pOworfQorCitlcnJvcl90CitTX3Byb2NfZ2V0bXNncG9ydF9yZXBseSAobWFjaF9wb3J0X3QgcmVwbHksIGVycm9yX3QgZXJyLCBtYWNoX3BvcnRfdCBtc2dfcG9ydCkKK3sKKyAgcmV0dXJuIGlsbF9ycGMgKF9fRlVOQ1RJT05fXyk7Cit9CisMCisvKiBNc2dfcmVwbHkgc2VydmVyIHJvdXRpbmVzLiAgV2Ugb25seSB1c2UgbXNnX3NpZ19wb3N0X3VudHJhY2VkX3JlcGx5LiAgKi8KKworZXJyb3JfdAorU19tc2dfc2lnX3Bvc3RfdW50cmFjZWRfcmVwbHkgKG1hY2hfcG9ydF90IHJlcGx5LCBlcnJvcl90IGVycikKK3sKKyAgc3RydWN0IGluZiAqaW5mID0gd2FpdGluZ19pbmY7CisKKyAgaWYgKGVyciA9PSBFQlVTWSkKKyAgICAvKiBFQlVTWSBpcyB3aGF0IHdlIGdldCB3aGVuIHRoZSBjcmFzaCBzZXJ2ZXIgaGFzIGdyYWJiZWQgY29udHJvbCBvZiB0aGUKKyAgICAgICBwcm9jZXNzIGFuZCBkb2Vzbid0IGxpa2Ugd2hhdCBzaWduYWwgd2UgdHJpZWQgdG8gc2VuZCBpdC4gIEp1c3QgYWN0CisgICAgICAgbGlrZSB0aGUgcHJvY2VzcyBzdG9wcGVkICh1c2luZyBhIHNpZ25hbCBvZiAwIHNob3VsZCBtZWFuIHRoYXQgdGhlCisgICAgICAgKm5leHQqIHRpbWUgdGhlIHVzZXIgY29udGludWVzLCBpdCB3aWxsIHBhc3Mgc2lnbmFsIDAsIHdoaWNoIHRoZSBjcmFzaAorICAgICAgIHNlcnZlciBzaG91bGQgbGlrZSkuICAqLworICAgIHsKKyAgICAgIGluZi0+d2FpdC5zdGF0dXMua2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOworICAgICAgaW5mLT53YWl0LnN0YXR1cy52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMXzA7CisgICAgfQorICBlbHNlIGlmIChlcnIpCisgICAgd2FybmluZyAoIlNpZ25hbCBkZWxpdmVyeSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IgKGVycikpOworCisgIGlmIChlcnIpCisgICAgLyogV2Ugb25seSBnZXQgdGhpcyByZXBseSB3aGVuIHdlJ3ZlIHBvc3RlZCBhIHNpZ25hbCB0byBhIHByb2Nlc3Mgd2hpY2ggd2UKKyAgICAgICB0aG91Z2h0IHdhcyBzdG9wcGVkLCBhbmQgd2hpY2ggd2UgZXhwZWN0ZWQgdG8gY29udGludWUgYWZ0ZXIgdGhlIHNpZ25hbC4KKyAgICAgICBHaXZlbiB0aGF0IHRoZSBzaWduYWwgaGFzIGZhaWxlZCBmb3Igc29tZSByZWFzb24sIGl0J3MgcmVhc29uYWJsZSB0bworICAgICAgIGFzc3VtZSBpdCdzIHN0aWxsIHN0b3BwZWQuICAqLworICAgIGluZi0+c3RvcHBlZCA9IDE7CisgIGVsc2UKKyAgICBpbmYtPndhaXQuc3VwcHJlc3MgPSAxOworCisgIHJldHVybiAwOworfQorCitlcnJvcl90CitTX21zZ19zaWdfcG9zdF9yZXBseSAobWFjaF9wb3J0X3QgcmVwbHksIGVycm9yX3QgZXJyKQoreworICByZXR1cm4gaWxsX3JwYyAoX19GVU5DVElPTl9fKTsKK30KKwwKKy8qIFJldHVybnMgdGhlIG51bWJlciBvZiBtZXNzYWdlcyBxdWV1ZWQgZm9yIHRoZSByZWNlaXZlIHJpZ2h0IFBPUlQuICAqLworc3RhdGljIG1hY2hfcG9ydF9tc2djb3VudF90Citwb3J0X21zZ3NfcXVldWVkIChtYWNoX3BvcnRfdCBwb3J0KQoreworICBzdHJ1Y3QgbWFjaF9wb3J0X3N0YXR1cyBzdGF0dXM7CisgIGVycm9yX3QgZXJyID0KKyAgICBtYWNoX3BvcnRfZ2V0X3JlY2VpdmVfc3RhdHVzIChtYWNoX3Rhc2tfc2VsZiAoKSwgcG9ydCwgJnN0YXR1cyk7CisKKyAgaWYgKGVycikKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHJldHVybiBzdGF0dXMubXBzX21zZ2NvdW50OworfQorDAorLyogUmVzdW1lIGV4ZWN1dGlvbiBvZiB0aGUgaW5mZXJpb3IgcHJvY2Vzcy4KKworICAgSWYgU1RFUCBpcyBub256ZXJvLCBzaW5nbGUtc3RlcCBpdC4KKyAgIElmIFNJR05BTCBpcyBub256ZXJvLCBnaXZlIGl0IHRoYXQgc2lnbmFsLgorCisgICBUSUQgIFNURVA6CisgICAtMSAgIHRydWUgICBTaW5nbGUgc3RlcCB0aGUgY3VycmVudCB0aHJlYWQgYWxsb3dpbmcgb3RoZXIgdGhyZWFkcyB0byBydW4uCisgICAtMSAgIGZhbHNlICBDb250aW51ZSB0aGUgY3VycmVudCB0aHJlYWQgYWxsb3dpbmcgb3RoZXIgdGhyZWFkcyB0byBydW4uCisgICBYICAgIHRydWUgICBTaW5nbGUgc3RlcCB0aGUgZ2l2ZW4gdGhyZWFkLCBkb24ndCBhbGxvdyBhbnkgb3RoZXJzIHRvIHJ1bi4KKyAgIFggICAgZmFsc2UgIENvbnRpbnVlIHRoZSBnaXZlbiB0aHJlYWQsIGRvIG5vdCBhbGxvdyBhbnkgb3RoZXJzIHRvIHJ1bi4KKyAgIChXaGVyZSBYLCBvZiBjb3Vyc2UsIGlzIGFueXRoaW5nIGV4Y2VwdCAtMSkKKworICAgTm90ZSB0aGF0IGEgcmVzdW1lIG1heSBub3QgYHRha2UnIGlmIHRoZXJlIGFyZSBwZW5kaW5nIGV4Y2VwdGlvbnMvJmMKKyAgIHN0aWxsIHVucHJvY2Vzc2VkIGZyb20gdGhlIGxhc3QgcmVzdW1lIHdlIGRpZCAoYW55IGdpdmVuIHJlc3VtZSBtYXkgcmVzdWx0CisgICBpbiBtdWx0aXBsZSBldmVudHMgcmV0dXJuZWQgYnkgd2FpdCkuCisqLworc3RhdGljIHZvaWQKK2dudV9yZXN1bWUgKGludCB0aWQsIGludCBzdGVwLCBlbnVtIHRhcmdldF9zaWduYWwgc2lnKQoreworICBzdHJ1Y3QgcHJvYyAqc3RlcF90aHJlYWQgPSAwOworICBzdHJ1Y3QgaW5mICppbmYgPSBjdXJyZW50X2luZmVyaW9yOworCisgIGluZl9kZWJ1ZyAoaW5mLCAidGlkID0gJWQsIHN0ZXAgPSAlZCwgc2lnID0gJWQiLCB0aWQsIHN0ZXAsIHNpZyk7CisKKyAgaWYgKHNpZyAhPSBUQVJHRVRfU0lHTkFMXzAgfHwgaW5mLT5zdG9wcGVkKQorICAgIGluZl9zaWduYWwgKGluZiwgc2lnKTsKKyAgZWxzZSBpZiAoaW5mLT53YWl0LmV4Yy5yZXBseSAhPSBNQUNIX1BPUlRfTlVMTCkKKyAgICAvKiBXZSByZWNlaXZlZCBhbiBleGNlcHRpb24gdG8gd2hpY2ggd2UgaGF2ZSBjaG9zZW4gbm90IHRvIGZvcndhcmQsIHNvCisgICAgICAgYWJvcnQgdGhlIGZhdWx0aW5nIHRocmVhZCwgd2hpY2ggd2lsbCBwZXJoYXBzIHJldGFrZSBpdC4gICovCisgICAgeworICAgICAgcHJvY19hYm9ydCAoaW5mLT53YWl0LnRocmVhZCwgMSk7CisgICAgICB3YXJuaW5nICgiQWJvcnRpbmcgJXMgd2l0aCB1bmZvcndhcmRlZCBleGNlcHRpb24gJXMuIiwKKwkgICAgICAgcHJvY19zdHJpbmcgKGluZi0+d2FpdC50aHJlYWQpLAorCSAgICAgICB0YXJnZXRfc2lnbmFsX3RvX25hbWUgKGluZi0+d2FpdC5zdGF0dXMudmFsdWUuc2lnKSk7CisgICAgfQorCisgIGlmIChwb3J0X21zZ3NfcXVldWVkIChpbmYtPmV2ZW50X3BvcnQpKQorICAgIC8qIElmIHRoZXJlIGFyZSBzdGlsbCBtZXNzYWdlcyBpbiBvdXIgZXZlbnQgcXVldWUsIGRvbid0IGJvdGhlciByZXN1bWluZworICAgICAgIHRoZSBwcm9jZXNzLCBhcyB3ZSdyZSBqdXN0IGdvaW5nIHRvIHN0b3AgaXQgcmlnaHQgYXdheSBhbnl3YXkuICovCisgICAgcmV0dXJuOworCisgIGluZl91cGRhdGVfcHJvY3MgKGluZik7CisKKyAgaWYgKHRpZCA8IDApCisgICAgLyogQWxsb3cgYWxsIHRocmVhZHMgdG8gcnVuLCBleGNlcHQgcGVyaGFwcyBzaW5nbGUtc3RlcHBpbmcgb25lLiAgKi8KKyAgICB7CisgICAgICBpbmZfZGVidWcgKGluZiwgInJ1bm5pbmcgYWxsIHRocmVhZHM7IHRpZCA9ICVkIiwgaW5mZXJpb3JfcGlkKTsKKyAgICAgIHRpZCA9IGluZmVyaW9yX3BpZDsJLyogV2hhdCB0byBzdGVwLiAqLworICAgICAgaW5mX3NldF90aHJlYWRzX3Jlc3VtZV9zYyAoaW5mLCAwLCAxKTsKKyAgICB9CisgIGVsc2UKKyAgICAvKiBKdXN0IGFsbG93IGEgc2luZ2xlIHRocmVhZCB0byBydW4uICAqLworICAgIHsKKyAgICAgIHN0cnVjdCBwcm9jICp0aHJlYWQgPSBpbmZfdGlkX3RvX3RocmVhZCAoaW5mLCB0aWQpOworICAgICAgaWYgKCEgdGhyZWFkKQorCWVycm9yICgiQ2FuJ3QgcnVuIHNpbmdsZSB0aHJlYWQgaWQgJWQ6IG5vIHN1Y2ggdGhyZWFkISIpOworICAgICAgaW5mX2RlYnVnIChpbmYsICJydW5uaW5nIG9uZSB0aHJlYWQ6ICVkLyVkIiwgaW5mLT5waWQsIHRocmVhZC0+dGlkKTsKKyAgICAgIGluZl9zZXRfdGhyZWFkc19yZXN1bWVfc2MgKGluZiwgdGhyZWFkLCAwKTsKKyAgICB9CisKKyAgaWYgKHN0ZXApCisgICAgeworICAgICAgc3RlcF90aHJlYWQgPSBpbmZfdGlkX3RvX3RocmVhZCAoaW5mLCB0aWQpOworICAgICAgaWYgKCEgc3RlcF90aHJlYWQpCisJd2FybmluZyAoIkNhbid0IHN0ZXAgdGhyZWFkIGlkICVkOiBubyBzdWNoIHRocmVhZC4iLCB0aWQpOworICAgICAgZWxzZQorCWluZl9kZWJ1ZyAoaW5mLCAic3RlcHBpbmcgdGhyZWFkOiAlZC8lZCIsIGluZi0+cGlkLCBzdGVwX3RocmVhZC0+dGlkKTsKKyAgICB9CisgIGlmIChzdGVwX3RocmVhZCAhPSBpbmYtPnN0ZXBfdGhyZWFkKQorICAgIGluZl9zZXRfc3RlcF90aHJlYWQgKGluZiwgc3RlcF90aHJlYWQpOworCisgIGluZl9kZWJ1ZyAoaW5mLCAiaGVyZSB3ZSBnby4uLiIpOworICBpbmZfcmVzdW1lIChpbmYpOworfQorDAorc3RhdGljIHZvaWQKK2dudV9raWxsX2luZmVyaW9yICgpCit7CisgIHN0cnVjdCBwcm9jICp0YXNrID0gY3VycmVudF9pbmZlcmlvci0+dGFzazsKKyAgaWYgKHRhc2spCisgICAgeworICAgICAgcHJvY19kZWJ1ZyAodGFzaywgInRlcm1pbmF0aW5nLi4uIik7CisgICAgICB0YXNrX3Rlcm1pbmF0ZSAodGFzay0+cG9ydCk7CisgICAgICBpbmZfc2V0X3BpZCAoY3VycmVudF9pbmZlcmlvciwgLTEpOworICAgIH0KKyAgdGFyZ2V0X21vdXJuX2luZmVyaW9yICgpOworfQorCisvKiBDbGVhbiB1cCBhZnRlciB0aGUgaW5mZXJpb3IgZGllcy4gICovCisKK3N0YXRpYyB2b2lkCitnbnVfbW91cm5faW5mZXJpb3IgKCkKK3sKKyAgaW5mX2RlYnVnIChjdXJyZW50X2luZmVyaW9yLCAicmlwIik7CisgIGluZl9kZXRhY2ggKGN1cnJlbnRfaW5mZXJpb3IpOworICB1bnB1c2hfdGFyZ2V0ICgmZ251X29wcyk7CisgIGdlbmVyaWNfbW91cm5faW5mZXJpb3IgKCk7Cit9CisMCisvKiBGb3JrIGFuIGluZmVyaW9yIHByb2Nlc3MsIGFuZCBzdGFydCBkZWJ1Z2dpbmcgaXQuICAqLworCisvKiBTZXQgSU5GRVJJT1JfUElEIHRvIHRoZSBmaXJzdCB0aHJlYWQgYXZhaWxhYmxlIGluIHRoZSBjaGlsZCwgaWYgYW55LiAgKi8KK3N0YXRpYyBpbnQKK2luZl9waWNrX2ZpcnN0X3RocmVhZCAoKQoreworICBpZiAoY3VycmVudF9pbmZlcmlvci0+dGFzayAmJiBjdXJyZW50X2luZmVyaW9yLT50aHJlYWRzKQorICAgIC8qIFRoZSBmaXJzdCB0aHJlYWQuICAqLworICAgIHJldHVybiBjdXJyZW50X2luZmVyaW9yLT50aHJlYWRzLT50aWQ7CisgIGVsc2UKKyAgICAvKiBXaGF0IG1heSBiZSB0aGUgbmV4dCB0aHJlYWQuICAqLworICAgIHJldHVybiBuZXh0X3RocmVhZF9pZDsKK30KKworc3RhdGljIHN0cnVjdCBpbmYgKgorY3VyX2luZiAoKQoreworICBpZiAoISBjdXJyZW50X2luZmVyaW9yKQorICAgIGN1cnJlbnRfaW5mZXJpb3IgPSBtYWtlX2luZiAoKTsKKyAgcmV0dXJuIGN1cnJlbnRfaW5mZXJpb3I7Cit9CisKK3N0YXRpYyB2b2lkCitnbnVfY3JlYXRlX2luZmVyaW9yIChleGVjX2ZpbGUsIGFsbGFyZ3MsIGVudikKKyAgICAgY2hhciAqZXhlY19maWxlOworICAgICBjaGFyICphbGxhcmdzOworICAgICBjaGFyICoqZW52OworeworICBzdHJ1Y3QgaW5mICppbmYgPSBjdXJfaW5mICgpOworCisgIHZvaWQgdHJhY2VfbWUgKCkKKyAgICB7CisgICAgICAvKiBXZSdyZSBpbiB0aGUgY2hpbGQ7IG1ha2UgdGhpcyBwcm9jZXNzIHN0b3AgYXMgc29vbiBhcyBpdCBleGVjcy4gICovCisgICAgICBpbmZfZGVidWcgKGluZiwgInRyYWNpbmcgc2VsZiIpOworICAgICAgaWYgKHB0cmFjZSAoUFRSQUNFX1RSQUNFTUUpICE9IDApCisJZXJyb3IgKCJwdHJhY2UgKFBUUkFDRV9UUkFDRU1FKSBmYWlsZWQhIik7CisgICAgfQorICBpbnQgYXR0YWNoX3RvX2NoaWxkIChpbnQgcGlkKQorICAgIHsKKyAgICAgIC8qIEF0dGFjaCB0byB0aGUgbm93IHN0b3BwZWQgY2hpbGQsIHdoaWNoIGlzIGFjdHVhbGx5IGEgc2hlbGwuLi4gICovCisgICAgICBpbmZfZGVidWcgKGluZiwgImF0dGFjaGluZyB0byBjaGlsZDogJWQiLCBwaWQpOworCisgICAgICBpbmZfYXR0YWNoIChpbmYsIHBpZCk7CisKKyAgICAgIGF0dGFjaF9mbGFnID0gMDsKKyAgICAgIHB1c2hfdGFyZ2V0ICgmZ251X29wcyk7CisKKyAgICAgIGluZi0+cGVuZGluZ19leGVjcyA9IDI7CisgICAgICBpbmYtPnRyYWNlZCA9IDE7CisKKyAgICAgIC8qIE5vdyBsZXQgdGhlIGNoaWxkIHJ1biBhZ2Fpbiwga25vd2luZyB0aGF0IGl0IHdpbGwgc3RvcCBpbW1lZGlhdGVseQorCSBiZWNhdXNlIG9mIHRoZSBwdHJhY2UuICovCisgICAgICBpbmZfcmVzdW1lIChpbmYpOworICAgICAgaW5mZXJpb3JfcGlkID0gaW5mX3BpY2tfZmlyc3RfdGhyZWFkICgpOworCisgICAgICBzdGFydHVwX2luZmVyaW9yIChpbmYtPnBlbmRpbmdfZXhlY3MpOworCisgICAgICByZXR1cm4gaW5mZXJpb3JfcGlkOworICAgIH0KKworICBpbmZfZGVidWcgKGluZiwgImNyZWF0aW5nIGluZmVyaW9yIik7CisKKyAgICBmb3JrX2luZmVyaW9yIChleGVjX2ZpbGUsIGFsbGFyZ3MsIGVudiwgdHJhY2VfbWUsIGF0dGFjaF90b19jaGlsZCwgTlVMTCwgTlVMTCk7CisKKyAgaW5mX3VwZGF0ZV9zaWduYWxfdGhyZWFkIChpbmYpOworICBpbmZfc2V0X3RyYWNlZCAoaW5mLCBpbmYtPndhbnRfc2lnbmFscyk7CisKKyAgLyogRXhlY2luZyB0aGUgcHJvY2VzcyB3aWxsIGhhdmUgdHJhc2hlZCBvdXIgZXhjZXB0aW9uIHBvcnRzOyBzdGVhbCB0aGVtCisgICAgIGJhY2sgKG9yIG1ha2Ugc3VyZSB0aGV5J3JlIHJlc3RvcmVkIGlmIHRoZSB1c2VyIHdhbnRzIHRoYXQpLiAgKi8KKyAgaWYgKGluZi0+d2FudF9leGNlcHRpb25zKQorICAgIGluZl9zdGVhbF9leGNfcG9ydHMgKGluZik7CisgIGVsc2UKKyAgICBpbmZfcmVzdG9yZV9leGNfcG9ydHMgKGluZik7CisKKyAgLyogSGVyZSB3ZSBnbyEgICovCisgIHByb2NlZWQgKChDT1JFX0FERFIpIC0xLCAwLCAwKTsKK30KKworLyogTWFyayBvdXIgdGFyZ2V0LXN0cnVjdCBhcyBlbGlnaWJsZSBmb3Igc3RyYXkgInJ1biIgYW5kICJhdHRhY2giCisgICBjb21tYW5kcy4gICovCitzdGF0aWMgaW50CitnbnVfY2FuX3J1biAoKQoreworICByZXR1cm4gMTsKK30KKwwKKyNpZmRlZiBBVFRBQ0hfREVUQUNICisKKy8qIEF0dGFjaCB0byBwcm9jZXNzIFBJRCwgdGhlbiBpbml0aWFsaXplIGZvciBkZWJ1Z2dpbmcgaXQKKyAgIGFuZCB3YWl0IGZvciB0aGUgdHJhY2UtdHJhcCB0aGF0IHJlc3VsdHMgZnJvbSBhdHRhY2hpbmcuICAqLworc3RhdGljIHZvaWQKK2dudV9hdHRhY2ggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGludCBwaWQ7CisgIGNoYXIgKmV4ZWNfZmlsZTsKKyAgc3RydWN0IGluZiAqaW5mID0gY3VyX2luZiAoKTsKKworICBpZiAoIWFyZ3MpCisgICAgZXJyb3Jfbm9fYXJnICgiUElEIHRvIGF0dGFjaCIpOworCisgIHBpZCA9IGF0b2kgKGFyZ3MpOworCisgIGlmIChwaWQgPT0gZ2V0cGlkKCkpCQkvKiBUcnlpbmcgdG8gbWFzdHVyYmF0ZT8gKi8KKyAgICBlcnJvciAoIkkgcmVmdXNlIHRvIGRlYnVnIG15c2VsZiEiKTsKKworICBpZiAoZnJvbV90dHkpCisgICAgeworICAgICAgZXhlY19maWxlID0gKGNoYXIgKikgZ2V0X2V4ZWNfZmlsZSAoMCk7CisKKyAgICAgIGlmIChleGVjX2ZpbGUpCisJcHJpbnRmX3VuZmlsdGVyZWQgKCJBdHRhY2hpbmcgdG8gcHJvZ3JhbSBgJXMnLCBwaWQgJWRcbiIsCisJCQkgICBleGVjX2ZpbGUsIHBpZCk7CisgICAgICBlbHNlCisJcHJpbnRmX3VuZmlsdGVyZWQgKCJBdHRhY2hpbmcgdG8gcGlkICVkXG4iLCBwaWQpOworCisgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworICAgIH0KKworICBpbmZfZGVidWcgKGluZiwgImF0dGFjaGluZyB0byBwaWQ6ICVkIiwgcGlkKTsKKworICBpbmZfYXR0YWNoIChpbmYsIHBpZCk7CisgIGluZl91cGRhdGVfcHJvY3MgKGluZik7CisKKyAgaW5mZXJpb3JfcGlkID0gaW5mX3BpY2tfZmlyc3RfdGhyZWFkICgpOworCisgIGF0dGFjaF9mbGFnID0gMTsKKyAgcHVzaF90YXJnZXQgKCZnbnVfb3BzKTsKKworICBpbmZfdXBkYXRlX3NpZ25hbF90aHJlYWQgKGluZik7CisgIGluZl9zZXRfdHJhY2VkIChpbmYsIGluZi0+d2FudF9zaWduYWxzKTsKKworICAvKiBJZiB0aGUgcHJvY2VzcyB3YXMgc3RvcHBlZCBiZWZvcmUgd2UgYXR0YWNoZWQsIG1ha2UgaXQgY29udGludWUgdGhlIG5leHQKKyAgICAgdGltZSB0aGUgdXNlciBkb2VzIGEgY29udGludWUuICAqLworICBpbmZfdmFsaWRhdGVfc3RvcHBlZCAoaW5mKTsKKworI2lmIDAgLyogRG8gd2UgbmVlZCB0aGlzPyAqLworICByZW51bWJlcl90aHJlYWRzICgwKTsJCS8qIEdpdmUgb3VyIHRocmVhZHMgcmVhc29uYWJsZSBuYW1lcy4gKi8KKyNlbmRpZgorfQorDAorLyogVGFrZSBhIHByb2dyYW0gcHJldmlvdXNseSBhdHRhY2hlZCB0byBhbmQgZGV0YWNoZXMgaXQuCisgICBUaGUgcHJvZ3JhbSByZXN1bWVzIGV4ZWN1dGlvbiBhbmQgd2lsbCBubyBsb25nZXIgc3RvcAorICAgb24gc2lnbmFscywgZXRjLiAgV2UnZCBiZXR0ZXIgbm90IGhhdmUgbGVmdCBhbnkgYnJlYWtwb2ludHMKKyAgIGluIHRoZSBwcm9ncmFtIG9yIGl0J2xsIGRpZSB3aGVuIGl0IGhpdHMgb25lLiAgRm9yIHRoaXMKKyAgIHRvIHdvcmssIGl0IG1heSBiZSBuZWNlc3NhcnkgZm9yIHRoZSBwcm9jZXNzIHRvIGhhdmUgYmVlbgorICAgcHJldmlvdXNseSBhdHRhY2hlZC4gIEl0ICptaWdodCogd29yayBpZiB0aGUgcHJvZ3JhbSB3YXMKKyAgIHN0YXJ0ZWQgdmlhIGZvcmsuICAqLworc3RhdGljIHZvaWQKK2dudV9kZXRhY2ggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGlmIChmcm9tX3R0eSkKKyAgICB7CisgICAgICBjaGFyICpleGVjX2ZpbGUgPSBnZXRfZXhlY19maWxlICgwKTsKKyAgICAgIGlmIChleGVjX2ZpbGUpCisJcHJpbnRmX3VuZmlsdGVyZWQgKCJEZXRhY2hpbmcgZnJvbSBwcm9ncmFtIGAlcycgcGlkICVkXG4iLAorCQkJICAgZXhlY19maWxlLCBjdXJyZW50X2luZmVyaW9yLT5waWQpOworICAgICAgZWxzZQorCXByaW50Zl91bmZpbHRlcmVkICgiRGV0YWNoaW5nIGZyb20gcGlkICVkXG4iLCBjdXJyZW50X2luZmVyaW9yLT5waWQpOworICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgICB9CisgIAorICBpbmZfZGV0YWNoIChjdXJyZW50X2luZmVyaW9yKTsKKworICBpbmZlcmlvcl9waWQgPSAwOworCisgIHVucHVzaF90YXJnZXQgKCZnbnVfb3BzKTsJCS8qIFBvcCBvdXQgb2YgaGFuZGxpbmcgYW4gaW5mZXJpb3IgKi8KK30KKyNlbmRpZiAvKiBBVFRBQ0hfREVUQUNIICovCisKK3N0YXRpYyB2b2lkCitnbnVfdGVybWluYWxfaW5pdF9pbmZlcmlvciAoKQoreworICBhc3NlcnQgKGN1cnJlbnRfaW5mZXJpb3IpOworICB0ZXJtaW5hbF9pbml0X2luZmVyaW9yX3dpdGhfcGdycCAoY3VycmVudF9pbmZlcmlvci0+cGlkKTsKK30KKworLyogR2V0IHJlYWR5IHRvIG1vZGlmeSB0aGUgcmVnaXN0ZXJzIGFycmF5LiAgT24gbWFjaGluZXMgd2hpY2ggc3RvcmUKKyAgIGluZGl2aWR1YWwgcmVnaXN0ZXJzLCB0aGlzIGRvZXNuJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gIE9uIG1hY2hpbmVzCisgICB3aGljaCBzdG9yZSBhbGwgdGhlIHJlZ2lzdGVycyBpbiBvbmUgZmVsbCBzd29vcCwgdGhpcyBtYWtlcyBzdXJlCisgICB0aGF0IHJlZ2lzdGVycyBjb250YWlucyBhbGwgdGhlIHJlZ2lzdGVycyBmcm9tIHRoZSBwcm9ncmFtIGJlaW5nCisgICBkZWJ1Z2dlZC4gICovCisKK3N0YXRpYyB2b2lkCitnbnVfcHJlcGFyZV90b19zdG9yZSAoKQoreworI2lmZGVmIENISUxEX1BSRVBBUkVfVE9fU1RPUkUKKyAgQ0hJTERfUFJFUEFSRV9UT19TVE9SRSAoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorZ251X29wZW4gKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBlcnJvciAoIlVzZSB0aGUgXCJydW5cIiBjb21tYW5kIHRvIHN0YXJ0IGEgVW5peCBjaGlsZCBwcm9jZXNzLiIpOworfQorCitzdGF0aWMgdm9pZAorZ251X3N0b3AgKCkKK3sKKyAgZXJyb3IgKCJ0b19zdG9wIHRhcmdldCBmdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsKK30KKworc3RhdGljIHZvaWQKK2dudV9waWRfdG9fZXhlY19maWxlICgpCit7CisgIGVycm9yICgidG9fcGlkX3RvX2V4ZWNfZmlsZSB0YXJnZXQgZnVuY3Rpb24gbm90IGltcGxlbWVudGVkIik7Cit9CisgCisKK3N0YXRpYyBpbnQKK2dudV90aHJlYWRfYWxpdmUgKGludCB0aWQpCit7CisgIGluZl91cGRhdGVfcHJvY3MgKGN1cnJlbnRfaW5mZXJpb3IpOworICByZXR1cm4gISFpbmZfdGlkX3RvX3RocmVhZCAoY3VycmVudF9pbmZlcmlvciwgdGlkKTsKK30KKwwKKy8qCisgKiBSZWFkIGluZmVyaW9yIHRhc2sncyBMRU4gYnl0ZXMgZnJvbSBBRERSIGFuZCBjb3B5IGl0IHRvIE1ZQUREUgorICogaW4gZ2RiJ3MgYWRkcmVzcyBzcGFjZS4KKyAqCisgKiBSZXR1cm4gMCBvbiBmYWlsdXJlOyBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvdGhlcndpc2UuCisgKi8KK2ludAorZ251X3JlYWRfaW5mZXJpb3IgKHRhc2ssIGFkZHIsIG15YWRkciwgbGVuZ3RoKQorICAgICB0YXNrX3QgdGFzazsKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgZXJyb3JfdCBlcnI7CisgIHZtX2FkZHJlc3NfdCBsb3dfYWRkcmVzcyA9ICh2bV9hZGRyZXNzX3QpIHRydW5jX3BhZ2UgKGFkZHIpOworICB2bV9zaXplX3QgYWxpZ25lZF9sZW5ndGggPQorICAgICh2bV9zaXplX3QpIHJvdW5kX3BhZ2UgKGFkZHIrbGVuZ3RoKSAtIGxvd19hZGRyZXNzOworICBwb2ludGVyX3QgICAgY29waWVkOworICBpbnQJICAgICAgIGNvcHlfY291bnQ7CisKKyAgLyogR2V0IG1lbW9yeSBmcm9tIGluZmVyaW9yIHdpdGggcGFnZSBhbGlnbmVkIGFkZHJlc3NlcyAqLworICBlcnIgPSB2bV9yZWFkICh0YXNrLCBsb3dfYWRkcmVzcywgYWxpZ25lZF9sZW5ndGgsICZjb3BpZWQsICZjb3B5X2NvdW50KTsKKyAgaWYgKGVycikKKyAgICByZXR1cm4gMDsKKworICBlcnIgPSBodXJkX3NhZmVfY29weWluIChteWFkZHIsICh2b2lkKilhZGRyIC0gbG93X2FkZHJlc3MgKyBjb3BpZWQsIGxlbmd0aCk7CisgIGlmIChlcnIpCisgICAgeworICAgICAgd2FybmluZyAoIlJlYWQgZnJvbSBpbmZlcmlvciBmYXVsdGVkOiAlcyIsIHN0cmVycm9yIChlcnIpKTsKKyAgICAgIGxlbmd0aCA9IDA7CisgICAgfQorCisgIGVyciA9IHZtX2RlYWxsb2NhdGUgKG1hY2hfdGFza19zZWxmICgpLCBjb3BpZWQsIGNvcHlfY291bnQpOworICBpZiAoZXJyKQorICAgIHdhcm5pbmcgKCJnbnVfcmVhZF9pbmZlcmlvciB2bV9kZWFsbG9jYXRlIGZhaWxlZDogJXMiLCBzdHJlcnJvciAoZXJyKSk7CisKKyAgcmV0dXJuIGxlbmd0aDsKK30KKworI2RlZmluZSBDSEtfR09UT19PVVQoc3RyLHJldCkgXAorICBkbyBpZiAocmV0ICE9IEtFUk5fU1VDQ0VTUykgeyBlcnJzdHIgPSAjc3RyOyBnb3RvIG91dDsgfSB3aGlsZSgwKQorCitzdHJ1Y3Qgdm1fcmVnaW9uX2xpc3QgeworICBzdHJ1Y3Qgdm1fcmVnaW9uX2xpc3QgKm5leHQ7CisgIHZtX3Byb3RfdAlwcm90ZWN0aW9uOworICB2bV9hZGRyZXNzX3QgIHN0YXJ0OworICB2bV9zaXplX3QJbGVuZ3RoOworfTsKKworc3RydWN0IG9ic3RhY2sgIHJlZ2lvbl9vYnN0YWNrOworCisvKgorICogV3JpdGUgZ2RiJ3MgTEVOIGJ5dGVzIGZyb20gTVlBRERSIGFuZCBjb3B5IGl0IHRvIEFERFIKKyAqIGluIGluZmVyaW9yIHRhc2sncyBhZGRyZXNzIHNwYWNlLgorICovCitpbnQKK2dudV93cml0ZV9pbmZlcmlvciAodGFzaywgYWRkciwgbXlhZGRyLCBsZW5ndGgpCisgICAgIHRhc2tfdCB0YXNrOworICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuZ3RoOworeworICBlcnJvcl90IGVyciA9IDA7CisgIHZtX2FkZHJlc3NfdCBsb3dfYWRkcmVzcyAgICAgICA9ICh2bV9hZGRyZXNzX3QpIHRydW5jX3BhZ2UgKGFkZHIpOworICB2bV9zaXplX3QgICAgYWxpZ25lZF9sZW5ndGggPSAKKyAgICAJCQkodm1fc2l6ZV90KSByb3VuZF9wYWdlIChhZGRyK2xlbmd0aCkgLSBsb3dfYWRkcmVzczsKKyAgcG9pbnRlcl90ICAgIGNvcGllZDsKKyAgaW50CSAgICAgICBjb3B5X2NvdW50OworICBpbnQJICAgICAgIGRlYWxsb2NhdGUgPSAwOworCisgIGNoYXIgICAgICAgICAqZXJyc3RyID0gIkJ1ZyBpbiBnbnVfd3JpdGVfaW5mZXJpb3IiOworCisgIHN0cnVjdCB2bV9yZWdpb25fbGlzdCAqcmVnaW9uX2VsZW1lbnQ7CisgIHN0cnVjdCB2bV9yZWdpb25fbGlzdCAqcmVnaW9uX2hlYWQgPSAoc3RydWN0IHZtX3JlZ2lvbl9saXN0ICopTlVMTDsKKworICAvKiBHZXQgbWVtb3J5IGZyb20gaW5mZXJpb3Igd2l0aCBwYWdlIGFsaWduZWQgYWRkcmVzc2VzICovCisgIGVyciA9IHZtX3JlYWQgKHRhc2ssCisJCSBsb3dfYWRkcmVzcywKKwkJIGFsaWduZWRfbGVuZ3RoLAorCQkgJmNvcGllZCwKKwkJICZjb3B5X2NvdW50KTsKKyAgQ0hLX0dPVE9fT1VUICgiZ251X3dyaXRlX2luZmVyaW9yIHZtX3JlYWQgZmFpbGVkIiwgZXJyKTsKKworICBkZWFsbG9jYXRlKys7CisKKyAgZXJyID0gaHVyZF9zYWZlX2NvcHlvdXQgKCh2b2lkKilhZGRyIC0gbG93X2FkZHJlc3MgKyBjb3BpZWQsIG15YWRkciwgbGVuZ3RoKTsKKyAgQ0hLX0dPVE9fT1VUICgiV3JpdGUgdG8gaW5mZXJpb3IgZmF1bHRlZCIsIGVycik7CisKKyAgb2JzdGFja19pbml0ICgmcmVnaW9uX29ic3RhY2spOworCisgIC8qIERvIHdyaXRlcyBhdG9taWNhbGx5LgorICAgKiBGaXJzdCBjaGVjayBmb3IgaG9sZXMgYW5kIHVud3JpdGFibGUgbWVtb3J5LgorICAgKi8KKyAgeworICAgIHZtX3NpemVfdCAgICByZW1haW5pbmdfbGVuZ3RoICA9IGFsaWduZWRfbGVuZ3RoOworICAgIHZtX2FkZHJlc3NfdCByZWdpb25fYWRkcmVzcyAgICA9IGxvd19hZGRyZXNzOworCisgICAgc3RydWN0IHZtX3JlZ2lvbl9saXN0ICpzY2FuOworCisgICAgd2hpbGUocmVnaW9uX2FkZHJlc3MgPCBsb3dfYWRkcmVzcyArIGFsaWduZWRfbGVuZ3RoKQorICAgICAgeworCXZtX3Byb3RfdCBwcm90ZWN0aW9uOworCXZtX3Byb3RfdCBtYXhfcHJvdGVjdGlvbjsKKwl2bV9pbmhlcml0X3QgaW5oZXJpdGFuY2U7CisJYm9vbGVhbl90IHNoYXJlZDsKKwltYWNoX3BvcnRfdCBvYmplY3RfbmFtZTsKKwl2bV9vZmZzZXRfdCBvZmZzZXQ7CisJdm1fc2l6ZV90ICAgcmVnaW9uX2xlbmd0aCA9IHJlbWFpbmluZ19sZW5ndGg7CisJdm1fYWRkcmVzc190IG9sZF9hZGRyZXNzICA9IHJlZ2lvbl9hZGRyZXNzOworICAgIAorCWVyciA9IHZtX3JlZ2lvbiAodGFzaywKKwkJCSAmcmVnaW9uX2FkZHJlc3MsCisJCQkgJnJlZ2lvbl9sZW5ndGgsCisJCQkgJnByb3RlY3Rpb24sCisJCQkgJm1heF9wcm90ZWN0aW9uLAorCQkJICZpbmhlcml0YW5jZSwKKwkJCSAmc2hhcmVkLAorCQkJICZvYmplY3RfbmFtZSwKKwkJCSAmb2Zmc2V0KTsKKwlDSEtfR09UT19PVVQgKCJ2bV9yZWdpb24gZmFpbGVkIiwgZXJyKTsKKworCS8qIENoZWNrIGZvciBob2xlcyBpbiBtZW1vcnkgKi8KKwlpZiAob2xkX2FkZHJlc3MgIT0gcmVnaW9uX2FkZHJlc3MpCisJICB7CisJICAgIHdhcm5pbmcgKCJObyBtZW1vcnkgYXQgMHgleC4gTm90aGluZyB3cml0dGVuIiwKKwkJICAgICBvbGRfYWRkcmVzcyk7CisJICAgIGVyciA9IEtFUk5fU1VDQ0VTUzsKKwkgICAgbGVuZ3RoID0gMDsKKwkgICAgZ290byBvdXQ7CisJICB9CisKKwlpZiAoIShtYXhfcHJvdGVjdGlvbiAmIFZNX1BST1RfV1JJVEUpKQorCSAgeworCSAgICB3YXJuaW5nICgiTWVtb3J5IGF0IGFkZHJlc3MgMHgleCBpcyB1bndyaXRhYmxlLiBOb3RoaW5nIHdyaXR0ZW4iLAorCQkgICAgIG9sZF9hZGRyZXNzKTsKKwkgICAgZXJyID0gS0VSTl9TVUNDRVNTOworCSAgICBsZW5ndGggPSAwOworCSAgICBnb3RvIG91dDsKKwkgIH0KKworCS8qIENoYWluIHRoZSByZWdpb25zIGZvciBsYXRlciB1c2UgKi8KKwlyZWdpb25fZWxlbWVudCA9IAorCSAgKHN0cnVjdCB2bV9yZWdpb25fbGlzdCAqKQorCSAgICBvYnN0YWNrX2FsbG9jICgmcmVnaW9uX29ic3RhY2ssIHNpemVvZiAoc3RydWN0IHZtX3JlZ2lvbl9saXN0KSk7CisgICAgCisJcmVnaW9uX2VsZW1lbnQtPnByb3RlY3Rpb24gPSBwcm90ZWN0aW9uOworCXJlZ2lvbl9lbGVtZW50LT5zdGFydCAgICAgID0gcmVnaW9uX2FkZHJlc3M7CisJcmVnaW9uX2VsZW1lbnQtPmxlbmd0aCAgICAgPSByZWdpb25fbGVuZ3RoOworCisJLyogQ2hhaW4gdGhlIHJlZ2lvbnMgYWxvbmcgd2l0aCBwcm90ZWN0aW9ucyAqLworCXJlZ2lvbl9lbGVtZW50LT5uZXh0ID0gcmVnaW9uX2hlYWQ7CisJcmVnaW9uX2hlYWQgICAgICAgICAgPSByZWdpb25fZWxlbWVudDsKKwkKKwlyZWdpb25fYWRkcmVzcyArPSByZWdpb25fbGVuZ3RoOworCXJlbWFpbmluZ19sZW5ndGggPSByZW1haW5pbmdfbGVuZ3RoIC0gcmVnaW9uX2xlbmd0aDsKKyAgICAgIH0KKworICAgIC8qIElmIHRoaW5ncyBmYWlsIGFmdGVyIHRoaXMsIHdlIGdpdmUgdXAuCisgICAgICogU29tZWJvZHkgaXMgbWVzc2luZyB1cCBpbmZlcmlvcl90YXNrJ3MgbWFwcGluZ3MuCisgICAgICovCisgICAgCisgICAgLyogRW5hYmxlIHdyaXRlcyB0byB0aGUgY2hhaW5lZCB2bSByZWdpb25zICovCisgICAgZm9yIChzY2FuID0gcmVnaW9uX2hlYWQ7IHNjYW47IHNjYW4gPSBzY2FuLT5uZXh0KQorICAgICAgeworCWJvb2xlYW5fdCBwcm90ZWN0aW9uX2NoYW5nZWQgPSBGQUxTRTsKKwkKKwlpZiAoIShzY2FuLT5wcm90ZWN0aW9uICYgVk1fUFJPVF9XUklURSkpCisJICB7CisJICAgIGVyciA9IHZtX3Byb3RlY3QgKHRhc2ssCisJCQkgICAgICBzY2FuLT5zdGFydCwKKwkJCSAgICAgIHNjYW4tPmxlbmd0aCwKKwkJCSAgICAgIEZBTFNFLAorCQkJICAgICAgc2Nhbi0+cHJvdGVjdGlvbiB8IFZNX1BST1RfV1JJVEUpOworCSAgICBDSEtfR09UT19PVVQgKCJ2bV9wcm90ZWN0OiBlbmFibGUgd3JpdGUgZmFpbGVkIiwgZXJyKTsKKwkgIH0KKyAgICAgIH0KKworICAgIGVyciA9IHZtX3dyaXRlICh0YXNrLAorCQkgICAgbG93X2FkZHJlc3MsCisJCSAgICBjb3BpZWQsCisJCSAgICBhbGlnbmVkX2xlbmd0aCk7CisgICAgQ0hLX0dPVE9fT1VUICgidm1fd3JpdGUgZmFpbGVkIiwgZXJyKTsKKwkKKyAgICAvKiBTZXQgdXAgdGhlIG9yaWdpbmFsIHJlZ2lvbiBwcm90ZWN0aW9ucywgaWYgdGhleSB3ZXJlIGNoYW5nZWQgKi8KKyAgICBmb3IgKHNjYW4gPSByZWdpb25faGVhZDsgc2Nhbjsgc2NhbiA9IHNjYW4tPm5leHQpCisgICAgICB7CisJYm9vbGVhbl90IHByb3RlY3Rpb25fY2hhbmdlZCA9IEZBTFNFOworCQorCWlmICghKHNjYW4tPnByb3RlY3Rpb24gJiBWTV9QUk9UX1dSSVRFKSkKKwkgIHsKKwkgICAgZXJyID0gdm1fcHJvdGVjdCAodGFzaywKKwkJCSAgICAgIHNjYW4tPnN0YXJ0LAorCQkJICAgICAgc2Nhbi0+bGVuZ3RoLAorCQkJICAgICAgRkFMU0UsCisJCQkgICAgICBzY2FuLT5wcm90ZWN0aW9uKTsKKwkgICAgQ0hLX0dPVE9fT1VUICgidm1fcHJvdGVjdDogZW5hYmxlIHdyaXRlIGZhaWxlZCIsIGVycik7CisJICB9CisgICAgICB9CisgIH0KKworIG91dDoKKyAgaWYgKGRlYWxsb2NhdGUpCisgICAgeworICAgICAgb2JzdGFja19mcmVlICgmcmVnaW9uX29ic3RhY2ssIDApOworICAgICAgCisgICAgICAodm9pZCkgdm1fZGVhbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYgKCksCisJCQkgICAgY29waWVkLAorCQkJICAgIGNvcHlfY291bnQpOworICAgIH0KKworICBpZiAoZXJyICE9IEtFUk5fU1VDQ0VTUykKKyAgICB7CisgICAgICB3YXJuaW5nICgiJXM6ICVzIiwgZXJyc3RyLCBtYWNoX2Vycm9yX3N0cmluZyAoZXJyKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIGxlbmd0aDsKK30KKwwKKy8qIFJldHVybiAwIG9uIGZhaWx1cmUsIG51bWJlciBvZiBieXRlcyBoYW5kbGVkIG90aGVyd2lzZS4gICovCitzdGF0aWMgaW50CitnbnVfeGZlcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuLCB3cml0ZSwgdGFyZ2V0KQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworICAgICBpbnQgd3JpdGU7CisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQ7CS8qIElHTk9SRUQgKi8KK3sKKyAgaW50IHJlc3VsdDsKKyAgdGFza190IHRhc2sgPQorICAgIGN1cnJlbnRfaW5mZXJpb3IKKyAgICAgID8gKGN1cnJlbnRfaW5mZXJpb3ItPnRhc2sgPyBjdXJyZW50X2luZmVyaW9yLT50YXNrLT5wb3J0IDogMCkKKyAgICAgIDogMDsKKworICBpZiAodGFzayA9PSBNQUNIX1BPUlRfTlVMTCkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGluZl9kZWJ1ZyAoY3VycmVudF9pbmZlcmlvciwgIiVzICVwWyVkXSAlcyAlcCIsCisJCSB3cml0ZSA/ICJ3cml0aW5nIiA6ICJyZWFkaW5nIiwgbWVtYWRkciwgbGVuLAorCQkgd3JpdGUgPyAiPC0tIiA6ICItLT4iLCBteWFkZHIpOworICAgICAgaWYgKHdyaXRlKQorCXJldHVybiBnbnVfd3JpdGVfaW5mZXJpb3IgKHRhc2ssIG1lbWFkZHIsIG15YWRkciwgbGVuKTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gZ251X3JlYWRfaW5mZXJpb3IgICh0YXNrLCBtZW1hZGRyLCBteWFkZHIsIGxlbik7CisgICAgfQorfQorDAorZXh0ZXJuIHZvaWQgZ251X3N0b3JlX3JlZ2lzdGVycyAoaW50IHJlZ25vKTsKK2V4dGVybiB2b2lkIGdudV9mZXRjaF9yZWdpc3RlcnMgKGludCByZWdubyk7CisKK3N0cnVjdCB0YXJnZXRfb3BzIGdudV9vcHMgOworCitzdGF0aWMgdm9pZAoraW5pdF9nbnVfb3BzKHZvaWQpCit7CisgIGdudV9vcHMudG9fc2hvcnRuYW1lID0gICAiR05VIjsJCS8qIHRvX3Nob3J0bmFtZSAqLworICBnbnVfb3BzLnRvX2xvbmduYW1lID0gICAiR05VIEh1cmQgcHJvY2VzcyI7CS8qIHRvX2xvbmduYW1lICovCisgIGdudV9vcHMudG9fZG9jID0gICAiR05VIEh1cmQgcHJvY2VzcyI7CS8qIHRvX2RvYyAqLworICBnbnVfb3BzLnRvX29wZW4gPSAgIGdudV9vcGVuOwkJCS8qIHRvX29wZW4gKi8KKyAgZ251X29wcy50b19jbG9zZSA9ICAgMDsJCQkvKiB0b19jbG9zZSAqLworICBnbnVfb3BzLnRvX2F0dGFjaCA9ICAgZ251X2F0dGFjaDsJCS8qIHRvX2F0dGFjaCAqLworICBnbnVfb3BzLnRvX3Bvc3RfYXR0YWNoID0gTlVMTDsKKyAgZ251X29wcy50b19yZXF1aXJlX2F0dGFjaCA9IE5VTEw7ICAgICAgICAgICAgIC8qIHRvX3JlcXVpcmVfYXR0YWNoICovCisgIGdudV9vcHMudG9fZGV0YWNoID0gICBnbnVfZGV0YWNoOwkgCS8qIHRvX2RldGFjaCAqLworICBnbnVfb3BzLnRvX3JlcXVpcmVfZGV0YWNoID0gTlVMTDsgICAgICAgICAgICAgLyogdG9fcmVxdWlyZV9kZXRhY2ggKi8KKyAgZ251X29wcy50b19yZXN1bWUgPSAgIGdudV9yZXN1bWU7CQkvKiB0b19yZXN1bWUgKi8KKyAgZ251X29wcy50b193YWl0ICA9ICAgZ251X3dhaXQ7CQkvKiB0b193YWl0ICovCisgIGdudV9vcHMudG9fcG9zdF93YWl0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogdG9fcG9zdF93YWl0ICovCisgIGdudV9vcHMudG9fZmV0Y2hfcmVnaXN0ZXJzICA9ICAgZ251X2ZldGNoX3JlZ2lzdGVyczsJLyogdG9fZmV0Y2hfcmVnaXN0ZXJzICovCisgIGdudV9vcHMudG9fc3RvcmVfcmVnaXN0ZXJzICA9ICAgZ251X3N0b3JlX3JlZ2lzdGVyczsJLyogdG9fc3RvcmVfcmVnaXN0ZXJzICovCisgIGdudV9vcHMudG9fcHJlcGFyZV90b19zdG9yZSA9ICAgZ251X3ByZXBhcmVfdG9fc3RvcmU7CS8qIHRvX3ByZXBhcmVfdG9fc3RvcmUgKi8KKyAgZ251X29wcy50b194ZmVyX21lbW9yeSAgPSAgIGdudV94ZmVyX21lbW9yeTsJLyogdG9feGZlcl9tZW1vcnkgKi8KKyAgZ251X29wcy50b19maWxlc19pbmZvICA9ICAgMDsJCQkvKiB0b19maWxlc19pbmZvICovCisgIGdudV9vcHMudG9faW5zZXJ0X2JyZWFrcG9pbnQgPSAgIG1lbW9yeV9pbnNlcnRfYnJlYWtwb2ludDsKKyAgZ251X29wcy50b19yZW1vdmVfYnJlYWtwb2ludCA9ICAgbWVtb3J5X3JlbW92ZV9icmVha3BvaW50OworICBnbnVfb3BzLnRvX3Rlcm1pbmFsX2luaXQgID0gICBnbnVfdGVybWluYWxfaW5pdF9pbmZlcmlvcjsKKyAgZ251X29wcy50b190ZXJtaW5hbF9pbmZlcmlvciA9ICAgdGVybWluYWxfaW5mZXJpb3I7CisgIGdudV9vcHMudG9fdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ID0gICB0ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQ7CisgIGdudV9vcHMudG9fdGVybWluYWxfb3VycyAgPSAgIHRlcm1pbmFsX291cnM7CisgIGdudV9vcHMudG9fdGVybWluYWxfaW5mbyAgPSAgIGNoaWxkX3Rlcm1pbmFsX2luZm87CQorICBnbnVfb3BzLnRvX2tpbGwgID0gICBnbnVfa2lsbF9pbmZlcmlvcjsJLyogdG9fa2lsbCAqLworICBnbnVfb3BzLnRvX2xvYWQgID0gICAwOwkJCS8qIHRvX2xvYWQgKi8KKyAgZ251X29wcy50b19sb29rdXBfc3ltYm9sID0gICAwOwkJLyogdG9fbG9va3VwX3N5bWJvbCAqLworICBnbnVfb3BzLnRvX2NyZWF0ZV9pbmZlcmlvciA9ICAgZ251X2NyZWF0ZV9pbmZlcmlvcjsJLyogdG9fY3JlYXRlX2luZmVyaW9yICovCisgIGdudV9vcHMudG9fcG9zdF9zdGFydHVwX2luZmVyaW9yID0gTlVMTDsgICAgICAvKiB0b19wb3N0X3N0YXJ0dXBfaW5mZXJpb3IgKi8KKyAgZ251X29wcy50b19hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yID0gTlVMTDsgLyogdG9fYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvciAqLworICBnbnVfb3BzLnRvX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IgPSBOVUxMOyAgICAvKiB0b19jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yICovCisgIGdudV9vcHMudG9fcG9zdF9mb2xsb3dfaW5mZXJpb3JfYnlfY2xvbmUgPSBOVUxMOyAvKiB0b19wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSAqLworICBnbnVfb3BzLnRvX2luc2VydF9mb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBnbnVfb3BzLnRvX3JlbW92ZV9mb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBnbnVfb3BzLnRvX2luc2VydF92Zm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgZ251X29wcy50b19yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGdudV9vcHMudG9faGFzX2ZvcmtlZCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAvKiB0b19oYXNfZm9ya2VkICovCisgIGdudV9vcHMudG9faGFzX3Zmb3JrZWQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAvKiB0b19oYXNfdmZvcmtlZCAqLworICBnbnVfb3BzLnRvX2Nhbl9mb2xsb3dfdmZvcmtfcHJpb3JfdG9fZXhlYyA9IE5VTEw7CisgIGdudV9vcHMudG9fcG9zdF9mb2xsb3dfdmZvcmsgPSBOVUxMOyAgICAgICAgICAgICAvKiB0b19wb3N0X2ZvbGxvd192Zm9yayAqLworICBnbnVfb3BzLnRvX2luc2VydF9leGVjX2NhdGNocG9pbnQgPSBOVUxMOworICBnbnVfb3BzLnRvX3JlbW92ZV9leGVjX2NhdGNocG9pbnQgPSBOVUxMOworICBnbnVfb3BzLnRvX2hhc19leGVjZCA9IE5VTEw7CisgIGdudV9vcHMudG9fcmVwb3J0ZWRfZXhlY19ldmVudHNfcGVyX2V4ZWNfY2FsbCA9IE5VTEw7CisgIGdudV9vcHMudG9faGFzX2V4aXRlZCA9IE5VTEw7CisgIGdudV9vcHMudG9fbW91cm5faW5mZXJpb3IgPSAgIGdudV9tb3Vybl9pbmZlcmlvcjsgLyogdG9fbW91cm5faW5mZXJpb3IgKi8KKyAgZ251X29wcy50b19jYW5fcnVuICA9ICAgZ251X2Nhbl9ydW47CQkvKiB0b19jYW5fcnVuICovCisgIGdudV9vcHMudG9fbm90aWNlX3NpZ25hbHMgPSAgIDA7CQkvKiB0b19ub3RpY2Vfc2lnbmFscyAqLworICBnbnVfb3BzLnRvX3RocmVhZF9hbGl2ZSAgPSAgIGdudV90aHJlYWRfYWxpdmU7LyogdG9fdGhyZWFkX2FsaXZlICovCisgIGdudV9vcHMudG9fc3RvcCAgPSAgIGdudV9zdG9wOwkJLyogdG9fc3RvcCAqLworICBnbnVfb3BzLnRvX3BpZF90b19leGVjX2ZpbGUgPSBnbnVfcGlkX3RvX2V4ZWNfZmlsZTsgICAgICAgICAvKiB0b19waWRfdG9fZXhlY19maWxlICovCisgIGdudV9vcHMudG9fY29yZV9maWxlX3RvX3N5bV9maWxlID0gTlVMTDsKKyAgZ251X29wcy50b19zdHJhdHVtID0gICBwcm9jZXNzX3N0cmF0dW07CS8qIHRvX3N0cmF0dW0gKi8KKyAgZ251X29wcy5ET05UX1VTRSA9ICAgMDsJCQkvKiB0b19uZXh0ICovCisgIGdudV9vcHMudG9faGFzX2FsbF9tZW1vcnkgPSAgIDE7CQkvKiB0b19oYXNfYWxsX21lbW9yeSAqLworICBnbnVfb3BzLnRvX2hhc19tZW1vcnkgPSAgIDE7CQkJLyogdG9faGFzX21lbW9yeSAqLworICBnbnVfb3BzLnRvX2hhc19zdGFjayA9ICAgMTsJCQkvKiB0b19oYXNfc3RhY2sgKi8KKyAgZ251X29wcy50b19oYXNfcmVnaXN0ZXJzID0gICAxOwkJLyogdG9faGFzX3JlZ2lzdGVycyAqLworICBnbnVfb3BzLnRvX2hhc19leGVjdXRpb24gPSAgIDE7CQkvKiB0b19oYXNfZXhlY3V0aW9uICovCisgIGdudV9vcHMudG9fc2VjdGlvbnMgPSAgIDA7CQkJLyogc2VjdGlvbnMgKi8KKyAgZ251X29wcy50b19zZWN0aW9uc19lbmQgPSAgIDA7CQkvKiBzZWN0aW9uc19lbmQgKi8KKyAgZ251X29wcy50b19tYWdpYyA9ICAgT1BTX01BR0lDIDsJCS8qIHRvX21hZ2ljICovCit9IC8qIGluaXRfZ251X29wcyAqLworDAorLyogUmV0dXJuIHByaW50YWJsZSBkZXNjcmlwdGlvbiBvZiBwcm9jLiAgKi8KK2NoYXIgKnByb2Nfc3RyaW5nIChzdHJ1Y3QgcHJvYyAqcHJvYykKK3sKKyAgc3RhdGljIGNoYXIgdGlkX3N0cls4MF07CisgIGlmIChwcm9jX2lzX3Rhc2sgKHByb2MpKQorICAgIHNwcmludGYgKHRpZF9zdHIsICJwcm9jZXNzICVkIiwgcHJvYy0+aW5mLT5waWQpOworICBlbHNlCisgICAgc3ByaW50ZiAodGlkX3N0ciwgInRocmVhZCAlZC4lZCIsCisJICAgICBwcm9jLT5pbmYtPnBpZCwgcGlkX3RvX3RocmVhZF9pZCAocHJvYy0+dGlkKSk7CisgIHJldHVybiB0aWRfc3RyOworfQorCitjaGFyICoKK2dudV90YXJnZXRfcGlkX3RvX3N0ciAoaW50IHRpZCkKK3sKKyAgc3RydWN0IGluZiAqaW5mID0gY3VycmVudF9pbmZlcmlvcjsKKyAgc3RydWN0IHByb2MgKnRocmVhZCA9IGluZl90aWRfdG9fdGhyZWFkIChpbmYsIHRpZCk7CisKKyAgaWYgKHRocmVhZCkKKyAgICByZXR1cm4gcHJvY19zdHJpbmcgKHRocmVhZCk7CisgIGVsc2UKKyAgICB7CisgICAgICBzdGF0aWMgY2hhciB0aWRfc3RyWzgwXTsKKyAgICAgIHNwcmludGYgKHRpZF9zdHIsICJib2d1cyB0aHJlYWQgaWQgJWQiLCB0aWQpOworICAgICAgcmV0dXJuIHRpZF9zdHI7CisgICAgfQorfQorDAorLyogVXNlciB0YXNrIGNvbW1hbmRzLiAgKi8KKworc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKnNldF90YXNrX2NtZF9saXN0ID0gMDsKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpzaG93X3Rhc2tfY21kX2xpc3QgPSAwOworLyogVXNlciB0aHJlYWQgY29tbWFuZHMuICAqLworCisvKiBDb21tYW5kcyB3aXRoIGEgcHJlZml4IG9mIGBzZXQvc2hvdyB0aHJlYWQnLiAgKi8KK2V4dGVybiBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqdGhyZWFkX2NtZF9saXN0Oworc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKnNldF90aHJlYWRfY21kX2xpc3QgPSBOVUxMOworc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKnNob3dfdGhyZWFkX2NtZF9saXN0ID0gTlVMTDsKKworLyogQ29tbWFuZHMgd2l0aCBhIHByZWZpeCBvZiBgc2V0L3Nob3cgdGhyZWFkIGRlZmF1bHQnLiAgKi8KK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpzZXRfdGhyZWFkX2RlZmF1bHRfY21kX2xpc3QgPSBOVUxMOworc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKnNob3dfdGhyZWFkX2RlZmF1bHRfY21kX2xpc3QgPSBOVUxMOworCitzdGF0aWMgdm9pZAorc2V0X3RocmVhZF9jbWQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkKK3sKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcInNldCB0aHJlYWRcIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIGEgdGhyZWFkCitwcm9wZXJ0eSwgb3IgXCJkZWZhdWx0XCIuXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3Nob3dfdGhyZWFkX2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBwcmludGZfdW5maWx0ZXJlZCAoIlwic2hvdyB0aHJlYWRcIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIGEgdGhyZWFkIHByb3BlcnR5LCBvciBcImRlZmF1bHRcIi5cbiIpOworfQorCitzdGF0aWMgdm9pZAorc2V0X3RocmVhZF9kZWZhdWx0X2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBwcmludGZfdW5maWx0ZXJlZCAoIlwic2V0IHRocmVhZCBkZWZhdWx0XCIgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiBhIHRocmVhZCBwcm9wZXJ0eS5cbiIpOworfQorCitzdGF0aWMgdm9pZAorc2hvd190aHJlYWRfZGVmYXVsdF9jbWQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkKK3sKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcInNob3cgdGhyZWFkIGRlZmF1bHRcIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIGEgdGhyZWFkIHByb3BlcnR5LlxuIik7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX2ludF9hcmcgKGNoYXIgKmFyZ3MsIGNoYXIgKmNtZF9wcmVmaXgpCit7CisgIGlmIChhcmdzKQorICAgIHsKKyAgICAgIGNoYXIgKmFyZ19lbmQ7CisgICAgICBpbnQgdmFsID0gc3RydG91bCAoYXJncywgJmFyZ19lbmQsIDEwKTsKKyAgICAgIGlmICgqYXJncyAmJiAqYXJnX2VuZCA9PSAnXDAnKQorCXJldHVybiB2YWw7CisgICAgfQorICBlcnJvciAoIklsbGVnYWwgYXJndW1lbnQgZm9yIFwiJXNcIiBjb21tYW5kLCBzaG91bGQgYmUgYW4gaW50ZWdlci4iLCBjbWRfcHJlZml4KTsKK30KKworc3RhdGljIGludAorX3BhcnNlX2Jvb2xfYXJnIChjaGFyICphcmdzLCBjaGFyICp0X3ZhbCwgY2hhciAqZl92YWwsIGNoYXIgKmNtZF9wcmVmaXgpCit7CisgIGlmICghYXJncyB8fCBzdHJjbXAgKGFyZ3MsIHRfdmFsKSA9PSAwKQorICAgIHJldHVybiAxOworICBlbHNlIGlmIChzdHJjbXAgKGFyZ3MsIGZfdmFsKSA9PSAwKQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgZXJyb3IgKCJJbGxlZ2FsIGFyZ3VtZW50IGZvciBcIiVzXCIgY29tbWFuZCwgc2hvdWxkIGJlIFwiJXNcIiBvciBcIiVzXCIuIiwKKwkgICBjbWRfcHJlZml4LCB0X3ZhbCwgZl92YWwpOworfQorCisjZGVmaW5lIHBhcnNlX2Jvb2xfYXJnKGFyZ3MsIGNtZF9wcmVmaXgpIFwKKyAgX3BhcnNlX2Jvb2xfYXJnIChhcmdzLCAib24iLCAib2ZmIiwgY21kX3ByZWZpeCkKKworc3RhdGljIHZvaWQKK2NoZWNrX2VtcHR5IChjaGFyICphcmdzLCBjaGFyICpjbWRfcHJlZml4KQoreworICBpZiAoYXJncykKKyAgICBlcnJvciAoIkdhcmJhZ2UgYWZ0ZXIgXCIlc1wiIGNvbW1hbmQ6IGAlcyciLCBjbWRfcHJlZml4LCBhcmdzKTsKK30KKworLyogUmV0dXJucyB0aGUgYWxpdmUgdGhyZWFkIG5hbWVkIGJ5IElORkVSSU9SX1BJRCwgb3Igc2lnbmFscyBhbiBlcnJvci4gICovCitzdGF0aWMgc3RydWN0IHByb2MgKgorY3VyX3RocmVhZCAoKQoreworICBzdHJ1Y3QgaW5mICppbmYgPSBjdXJfaW5mICgpOworICBzdHJ1Y3QgcHJvYyAqdGhyZWFkID0gaW5mX3RpZF90b190aHJlYWQgKGluZiwgaW5mZXJpb3JfcGlkKTsKKyAgaWYgKCF0aHJlYWQpCisgICAgZXJyb3IgKCJObyBjdXJyZW50IHRocmVhZC4iKTsKKyAgcmV0dXJuIHRocmVhZDsKK30KKworLyogUmV0dXJucyB0aGUgY3VycmVudCBpbmZlcmlvciwgYnV0IHNpZ25hbHMgYW4gZXJyb3IgaWYgaXQgaGFzIG5vIHRhc2suICAqLworc3RhdGljIHN0cnVjdCBpbmYgKgorYWN0aXZlX2luZiAoKQoreworICBzdHJ1Y3QgaW5mICppbmYgPSBjdXJfaW5mICgpOworICBpZiAoISBpbmYtPnRhc2spCisgICAgZXJyb3IgKCJObyBjdXJyZW50IHByb2Nlc3MuIik7CisgIHJldHVybiBpbmY7Cit9CisMCitzdGF0aWMgdm9pZAorc2V0X3Rhc2tfcGF1c2VfY21kIChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpCit7CisgIHN0cnVjdCBpbmYgKmluZiA9IGN1cl9pbmYgKCk7CisgIGludCBvbGRfc2MgPSBpbmYtPnBhdXNlX3NjOworCisgIGluZi0+cGF1c2Vfc2MgPSBwYXJzZV9ib29sX2FyZyAoYXJncywgInNldCB0YXNrIHBhdXNlIik7CisKKyAgaWYgKG9sZF9zYyA9PSAwICYmIGluZi0+cGF1c2Vfc2MgIT0gMCkKKyAgICAvKiBJZiB0aGUgdGFzayBpcyBjdXJyZW50bHkgdW5zdXNwZW5kZWQsIGltbWVkaWF0ZWx5IHN1c3BlbmQgaXQsCisgICAgICAgb3RoZXJ3aXNlIHdhaXQgdW50aWwgdGhlIG5leHQgdGltZSBpdCBnZXRzIGNvbnRyb2wuICAqLworICAgIGluZl9zdXNwZW5kIChpbmYpOworfQorCitzdGF0aWMgdm9pZAorc2hvd190YXNrX3BhdXNlX2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBzdHJ1Y3QgaW5mICppbmYgPSBjdXJfaW5mICgpOworICBjaGVja19lbXB0eSAoYXJncywgInNob3cgdGFzayBwYXVzZSIpOworICBwcmludGZfdW5maWx0ZXJlZCAoIlRoZSBpbmZlcmlvciB0YXNrICVzIHN1c3BlbmRlZCB3aGlsZSBnZGIgaGFzIGNvbnRyb2wuXG4iLAorCQkgICAgIGluZi0+dGFzaworCQkgICAgID8gKGluZi0+cGF1c2Vfc2MgPT0gMCA/ICJpc24ndCIgOiAiaXMiKQorCQkgICAgIDogKGluZi0+cGF1c2Vfc2MgPT0gMCA/ICJ3b24ndCBiZSIgOiAid2lsbCBiZSIpKTsKK30KKworc3RhdGljIHZvaWQKK3NldF90YXNrX2RldGFjaF9zY19jbWQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkKK3sKKyAgY3VyX2luZiAoKS0+ZGV0YWNoX3NjID0gcGFyc2VfaW50X2FyZyAoYXJncywgInNldCB0YXNrIGRldGFjaC1zdXNwZW5kLWNvdW50Iik7Cit9CisKK3N0YXRpYyB2b2lkCitzaG93X3Rhc2tfZGV0YWNoX3NjX2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBjaGVja19lbXB0eSAoYXJncywgInNob3cgdGFzayBkZXRhY2gtc3VzcGVuZC1jb3VudCIpOworICBwcmludGZfdW5maWx0ZXJlZCAoIlRoZSBpbmZlcmlvciB0YXNrIHdpbGwgYmUgbGVmdCB3aXRoIGEgc3VzcGVuZCBjb3VudCBvZiAlZCB3aGVuIGRldGFjaGluZy5cbiIsCisJCSAgICAgY3VyX2luZiAoKS0+ZGV0YWNoX3NjKTsKK30KKwwKK3N0YXRpYyB2b2lkCitzZXRfdGhyZWFkX2RlZmF1bHRfcGF1c2VfY21kIChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpCit7CisgIHN0cnVjdCBpbmYgKmluZiA9IGN1cl9pbmYgKCk7CisgIGluZi0+ZGVmYXVsdF90aHJlYWRfcGF1c2Vfc2MgPQorICAgIHBhcnNlX2Jvb2xfYXJnIChhcmdzLCAic2V0IHRocmVhZCBkZWZhdWx0IHBhdXNlIikgPyAwIDogMTsKK30KKworc3RhdGljIHZvaWQKK3Nob3dfdGhyZWFkX2RlZmF1bHRfcGF1c2VfY21kIChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpCit7CisgIHN0cnVjdCBpbmYgKmluZiA9IGN1cl9pbmYgKCk7CisgIGludCBzYyA9IGluZi0+ZGVmYXVsdF90aHJlYWRfcGF1c2Vfc2M7CisgIGNoZWNrX2VtcHR5IChhcmdzLCAic2hvdyB0aHJlYWQgZGVmYXVsdCBwYXVzZSIpOworICBwcmludGZfdW5maWx0ZXJlZCAoIk5ldyB0aHJlYWRzICVzIHN1c3BlbmRlZCB3aGlsZSBnZGIgaGFzIGNvbnRyb2wlcy5cbiIsCisJCSAgICAgc2MgPyAiYXJlIiA6ICJhcmVuJ3QiLAorCQkgICAgICFzYyAmJiBpbmYtPnBhdXNlX3NjID8gIiAoYnV0IHRoZSB0YXNrIGlzKSIgOiAiIik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfdGhyZWFkX2RlZmF1bHRfcnVuX2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBzdHJ1Y3QgaW5mICppbmYgPSBjdXJfaW5mICgpOworICBpbmYtPmRlZmF1bHRfdGhyZWFkX3J1bl9zYyA9CisgICAgcGFyc2VfYm9vbF9hcmcgKGFyZ3MsICJzZXQgdGhyZWFkIGRlZmF1bHQgcnVuIikgPyAwIDogMTsKK30KKworc3RhdGljIHZvaWQKK3Nob3dfdGhyZWFkX2RlZmF1bHRfcnVuX2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBzdHJ1Y3QgaW5mICppbmYgPSBjdXJfaW5mICgpOworICBjaGVja19lbXB0eSAoYXJncywgInNob3cgdGhyZWFkIGRlZmF1bHQgcnVuIik7CisgIHByaW50Zl91bmZpbHRlcmVkICgiTmV3IHRocmVhZHMgJXMgYWxsb3dlZCB0byBydW4uXG4iLAorCQkgICAgIGluZi0+ZGVmYXVsdF90aHJlYWRfcnVuX3NjID09IDAgPyAiYXJlIiA6ICJhcmVuJ3QiKTsKK30KKworc3RhdGljIHZvaWQKK3NldF90aHJlYWRfZGVmYXVsdF9kZXRhY2hfc2NfY21kIChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpCit7CisgIGN1cl9pbmYgKCktPmRlZmF1bHRfdGhyZWFkX2RldGFjaF9zYyA9CisgICAgcGFyc2VfaW50X2FyZyAoYXJncywgInNldCB0aHJlYWQgZGVmYXVsdCBkZXRhY2gtc3VzcGVuZC1jb3VudCIpOworfQorCitzdGF0aWMgdm9pZAorc2hvd190aHJlYWRfZGVmYXVsdF9kZXRhY2hfc2NfY21kIChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpCit7CisgIGNoZWNrX2VtcHR5IChhcmdzLCAic2hvdyB0aHJlYWQgZGVmYXVsdCBkZXRhY2gtc3VzcGVuZC1jb3VudCIpOworICBwcmludGZfdW5maWx0ZXJlZCAoIk5ldyB0aHJlYWRzIHdpbGwgZ2V0IGEgZGV0YWNoLXN1c3BlbmQtY291bnQgb2YgJWQuXG4iLAorCQkgICAgIGN1cl9pbmYgKCktPmRlZmF1bHRfdGhyZWFkX2RldGFjaF9zYyk7Cit9CisMCisvKiBTdGVhbCBhIHNlbmQgcmlnaHQgY2FsbGVkIE5BTUUgaW4gdGhlIGluZmVyaW9yIHRhc2ssIGFuZCBtYWtlIGl0IFBST0MncworICAgc2F2ZWQgZXhjZXB0aW9uIHBvcnQuICAqLworc3RhdGljIHZvaWQKK3N0ZWFsX2V4Y19wb3J0IChzdHJ1Y3QgcHJvYyAqcHJvYywgbWFjaF9wb3J0X3QgbmFtZSkKK3sKKyAgZXJyb3JfdCBlcnI7CisgIG1hY2hfcG9ydF90IHBvcnQ7CisgIG1hY2hfbXNnX3R5cGVfbmFtZV90IHBvcnRfdHlwZTsKKworICBpZiAoIXByb2MgfHwgIXByb2MtPmluZi0+dGFzaykKKyAgICBlcnJvciAoIk5vIGluZmVyaW9yIHRhc2suIik7CisKKyAgZXJyID0gbWFjaF9wb3J0X2V4dHJhY3RfcmlnaHQgKHByb2MtPmluZi0+dGFzay0+cG9ydCwKKwkJCQkgbmFtZSwgTUFDSF9NU0dfVFlQRV9DT1BZX1NFTkQsCisJCQkJICZwb3J0LCAmcG9ydF90eXBlKTsKKyAgaWYgKGVycikKKyAgICBlcnJvciAoIkNvdWxkbid0IGV4dHJhY3Qgc2VuZCByaWdodCAlZCBmcm9tIGluZmVyaW9yOiAlcyIsCisJICAgbmFtZSwgc3RyZXJyb3IgKGVycikpOworCisgIGlmIChwcm9jLT5zYXZlZF9leGNfcG9ydCkKKyAgICAvKiBHZXQgcmlkIG9mIG91ciByZWZlcmVuY2UgdG8gdGhlIG9sZCBvbmUuICAqLworICAgIG1hY2hfcG9ydF9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwgcHJvYy0+c2F2ZWRfZXhjX3BvcnQpOworCisgIHByb2MtPnNhdmVkX2V4Y19wb3J0ID0gcG9ydDsKKworICBpZiAoISBwcm9jLT5leGNfcG9ydCkKKyAgICAvKiBJZiBQUk9DIGlzIGEgdGhyZWFkLCB3ZSBtYXkgbm90IGhhdmUgc2V0IGl0cyBleGNlcHRpb24gcG9ydCBiZWZvcmUuCisgICAgICAgV2UgY2FuJ3QgdXNlIHByb2Nfc3RlYWxfZXhjX3BvcnQgYmVjYXVzZSBpdCBhbHNvIHNldHMgc2F2ZWRfZXhjX3BvcnQuICovCisgICAgeworICAgICAgIHByb2MtPmV4Y19wb3J0ID0gcHJvYy0+aW5mLT5ldmVudF9wb3J0OworICAgICAgIGVyciA9IHByb2Nfc2V0X2V4Y2VwdGlvbl9wb3J0IChwcm9jLCBwcm9jLT5leGNfcG9ydCk7CisgICAgICAgZXJyb3IgKCJDYW4ndCBzZXQgZXhjZXB0aW9uIHBvcnQgZm9yICVzOiAlcyIsCisJICAgICAgcHJvY19zdHJpbmcgKHByb2MpLCBzdHJlcnJvciAoZXJyKSk7CisgICAgfQorfQorDAorc3RhdGljIHZvaWQKK3NldF90YXNrX2V4Y19wb3J0X2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBzdHJ1Y3QgaW5mICppbmYgPSBjdXJfaW5mICgpOworICBpZiAoIWFyZ3MpCisgICAgZXJyb3IgKCJObyBhcmd1bWVudCB0byBcInNldCB0YXNrIGV4Y2VwdGlvbi1wb3J0XCIgY29tbWFuZC4iKTsKKyAgc3RlYWxfZXhjX3BvcnQgKGluZi0+dGFzaywgcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAoYXJncykpOworfQorCitzdGF0aWMgdm9pZCAKK3NldF9zdG9wcGVkX2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBjdXJfaW5mICgpLT5zdG9wcGVkID0gX3BhcnNlX2Jvb2xfYXJnIChhcmdzLCAieWVzIiwgIm5vIiwgInNldCBzdG9wcGVkIik7Cit9CisKK3N0YXRpYyB2b2lkCitzaG93X3N0b3BwZWRfY21kIChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpCit7CisgIHN0cnVjdCBpbmYgKmluZiA9IGFjdGl2ZV9pbmYgKCk7CisgIGNoZWNrX2VtcHR5IChhcmdzLCAic2hvdyBzdG9wcGVkIik7CisgIHByaW50Zl91bmZpbHRlcmVkICgiVGhlIGluZmVyaW9yIHByb2Nlc3MgJXMgc3RvcHBlZC5cbiIsCisJCSAgICAgaW5mLT5zdG9wcGVkID8gImlzIiA6ICJpc24ndCIpOworfQorCitzdGF0aWMgdm9pZCAKK3NldF9zaWdfdGhyZWFkX2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBpbnQgdGlkOworICBzdHJ1Y3QgaW5mICppbmYgPSBjdXJfaW5mICgpOworCisgIGlmICghYXJncyB8fCAoISBpc2RpZ2l0ICgqYXJncykgJiYgc3RyY21wIChhcmdzLCAibm9uZSIpICE9IDApKQorICAgIGVycm9yICgiSWxsZWdhbCBhcmd1bWVudCB0byBcInNldCBzaWduYWwtdGhyZWFkXCIgY29tbWFuZC5cbiIKKwkgICAiU2hvdWxkIGJlIGFuIGludGVnZXIgdGhyZWFkIElELCBvciBgbm9uZScuIik7CisKKyAgaWYgKHN0cmNtcCAoYXJncywgIm5vbmUiKSA9PSAwKQorICAgIGluZi0+c2lnbmFsX3RocmVhZCA9IDA7CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgdGlkID0gdGhyZWFkX2lkX3RvX3BpZCAoYXRvaSAoYXJncykpOworICAgICAgaWYgKHRpZCA8IDApCisJZXJyb3IgKCJUaHJlYWQgSUQgJXMgbm90IGtub3duLiAgVXNlIHRoZSBcImluZm8gdGhyZWFkc1wiIGNvbW1hbmQgdG9cbiIKKwkgICAgICAgInNlZSB0aGUgSURzIG9mIGN1cnJlbnRseSBrbm93biB0aHJlYWRzLiIsIGFyZ3MpOworICAgICAgaW5mLT5zaWduYWxfdGhyZWFkID0gaW5mX3RpZF90b190aHJlYWQgKGluZiwgdGlkKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzaG93X3NpZ190aHJlYWRfY21kIChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpCit7CisgIHN0cnVjdCBpbmYgKmluZiA9IGFjdGl2ZV9pbmYgKCk7CisgIGNoZWNrX2VtcHR5IChhcmdzLCAic2hvdyBzaWduYWwtdGhyZWFkIik7CisgIGlmIChpbmYtPnNpZ25hbF90aHJlYWQpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJUaGUgc2lnbmFsIHRocmVhZCBpcyAlcy5cbiIsCisJCSAgICAgICBwcm9jX3N0cmluZyAoaW5mLT5zaWduYWxfdGhyZWFkKSk7CisgIGVsc2UKKyAgICBwcmludGZfdW5maWx0ZXJlZCAoIlRoZXJlIGlzIG5vIHNpZ25hbCB0aHJlYWQuXG4iKTsKK30KKwwKK3N0YXRpYyB2b2lkIAorc2V0X3NpZ25hbHNfY21kIChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpCit7CisgIGludCB0cmFjZTsKKyAgc3RydWN0IGluZiAqaW5mID0gY3VyX2luZiAoKTsKKworICBpbmYtPndhbnRfc2lnbmFscyA9IHBhcnNlX2Jvb2xfYXJnIChhcmdzLCAic2V0IHNpZ25hbHMiKTsKKworICBpZiAoaW5mLT50YXNrICYmIGluZi0+d2FudF9zaWduYWxzICE9IGluZi0+dHJhY2VkKQorICAgIC8qIE1ha2UgdGhpcyB0YWtlIGVmZmVjdCBpbW1lZGlhdGVseSBpbiBhIHJ1bm5pbmcgcHJvY2Vzcy4gICovCisgICAgaW5mX3NldF90cmFjZWQgKGluZiwgaW5mLT53YW50X3NpZ25hbHMpOworfQorCitzdGF0aWMgdm9pZAorc2hvd19zaWduYWxzX2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBzdHJ1Y3QgaW5mICppbmYgPSBjdXJfaW5mICgpOworICBjaGVja19lbXB0eSAoYXJncywgInNob3cgc2lnbmFscyIpOworICBwcmludGZfdW5maWx0ZXJlZCAoIlRoZSBpbmZlcmlvciBwcm9jZXNzJ3Mgc2lnbmFscyAlcyBpbnRlcmNlcHRlZC5cbiIsCisJCSAgICAgaW5mLT50YXNrCisJCSAgICAgPyAoaW5mLT50cmFjZWQgPyAiYXJlIiA6ICJhcmVuJ3QiKQorCQkgICAgIDogKGluZi0+d2FudF9zaWduYWxzID8gIndpbGwgYmUiIDogIndvbid0IGJlIikpOworfQorCitzdGF0aWMgdm9pZCAKK3NldF9leGNlcHRpb25zX2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBzdHJ1Y3QgaW5mICppbmYgPSBjdXJfaW5mICgpOworICBpbnQgdmFsID0gcGFyc2VfYm9vbF9hcmcgKGFyZ3MsICJzZXQgZXhjZXB0aW9ucyIpOworCisgIGlmIChpbmYtPnRhc2sgJiYgaW5mLT53YW50X2V4Y2VwdGlvbnMgIT0gdmFsKQorICAgIC8qIE1ha2UgdGhpcyB0YWtlIGVmZmVjdCBpbW1lZGlhdGVseSBpbiBhIHJ1bm5pbmcgcHJvY2Vzcy4gICovCisgICAgLyogWFhYICovOworCisgIGluZi0+d2FudF9leGNlcHRpb25zID0gdmFsOworfQorCitzdGF0aWMgdm9pZAorc2hvd19leGNlcHRpb25zX2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBzdHJ1Y3QgaW5mICppbmYgPSBjdXJfaW5mICgpOworICBjaGVja19lbXB0eSAoYXJncywgInNob3cgZXhjZXB0aW9ucyIpOworICBwcmludGZfdW5maWx0ZXJlZCAoIkV4Y2VwdGlvbnMgaW4gdGhlIGluZmVyaW9yICVzIHRyYXBwZWQuXG4iLAorCQkgICAgIGluZi0+dGFzaworCQkgICAgID8gKGluZi0+d2FudF9leGNlcHRpb25zID8gImFyZSIgOiAiYXJlbid0IikKKwkJICAgICA6IChpbmYtPndhbnRfZXhjZXB0aW9ucyA/ICJ3aWxsIGJlIiA6ICJ3b24ndCBiZSIpKTsKK30KKwwKK3N0YXRpYyB2b2lkCitzZXRfdGFza19jbWQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkKK3sKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcInNldCB0YXNrXCIgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiBhIHRhc2sgcHJvcGVydHkuXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3Nob3dfdGFza19jbWQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkKK3sKKyAgc3RydWN0IGluZiAqaW5mID0gY3VyX2luZiAoKTsKKworICBjaGVja19lbXB0eSAoYXJncywgInNob3cgdGFzayIpOworCisgIHNob3dfc2lnbmFsc19jbWQgKDAsIGZyb21fdHR5KTsKKyAgc2hvd19leGNlcHRpb25zX2NtZCAoMCwgZnJvbV90dHkpOworICBzaG93X3Rhc2tfcGF1c2VfY21kICgwLCBmcm9tX3R0eSk7CisKKyAgaWYgKGluZi0+cGF1c2Vfc2MgPT0gMCkKKyAgICBzaG93X3RocmVhZF9kZWZhdWx0X3BhdXNlX2NtZCAoMCwgZnJvbV90dHkpOworICBzaG93X3RocmVhZF9kZWZhdWx0X3J1bl9jbWQgKDAsIGZyb21fdHR5KTsKKworICBpZiAoaW5mLT50YXNrKQorICAgIHsKKyAgICAgIHNob3dfc3RvcHBlZF9jbWQgKDAsIGZyb21fdHR5KTsKKyAgICAgIHNob3dfc2lnX3RocmVhZF9jbWQgKDAsIGZyb21fdHR5KTsKKyAgICB9CisKKyAgaWYgKGluZi0+ZGV0YWNoX3NjICE9IDApCisgICAgc2hvd190YXNrX2RldGFjaF9zY19jbWQgKDAsIGZyb21fdHR5KTsKKyAgaWYgKGluZi0+ZGVmYXVsdF90aHJlYWRfZGV0YWNoX3NjICE9IDApCisgICAgc2hvd190aHJlYWRfZGVmYXVsdF9kZXRhY2hfc2NfY21kICgwLCBmcm9tX3R0eSk7Cit9CisMCitzdGF0aWMgdm9pZAorc2V0X25vbmludmFzaXZlX2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICAvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHRoZSBhcmcgZm9yIGVhY2ggY29tcG9uZW50LiAgKi8KKyAgY2hhciAqaW52X2FyZ3MgPSBwYXJzZV9ib29sX2FyZyAoYXJncywgInNldCBub25pbnZhc2l2ZSIpID8gIm9mZiIgOiAib24iOworCisgIHNldF90YXNrX3BhdXNlX2NtZCAoaW52X2FyZ3MsIGZyb21fdHR5KTsKKyAgc2V0X3NpZ25hbHNfY21kIChpbnZfYXJncywgZnJvbV90dHkpOworICBzZXRfZXhjZXB0aW9uc19jbWQgKGludl9hcmdzLCBmcm9tX3R0eSk7Cit9CisMCitzdGF0aWMgdm9pZAoraW5mb19wb3J0X3JpZ2h0cyAoY2hhciAqYXJncywgbWFjaF9wb3J0X3R5cGVfdCBvbmx5KQoreworICBzdHJ1Y3QgaW5mICppbmYgPSBhY3RpdmVfaW5mICgpOworICB2YWx1ZV9wdHIgdm1hcmsgPSB2YWx1ZV9tYXJrICgpOworCisgIGlmIChhcmdzKQorICAgIC8qIEV4cGxpY2l0IGxpc3Qgb2YgcG9ydCByaWdodHMuICAqLworICAgIHsKKyAgICAgIHdoaWxlICgqYXJncykKKwl7CisJICB2YWx1ZV9wdHIgdmFsID0gcGFyc2VfdG9fY29tbWFfYW5kX2V2YWwgKCZhcmdzKTsKKwkgIGxvbmcgcmlnaHQgPSB2YWx1ZV9hc19sb25nICh2YWwpOworCSAgZXJyb3JfdCBlcnIgPQorCSAgICBwcmludF9wb3J0X2luZm8gKHJpZ2h0LCAwLCBpbmYtPnRhc2stPnBvcnQsIFBPUlRJTkZPX0RFVEFJTFMsCisJCQkgICAgIHN0ZG91dCk7CisJICBpZiAoZXJyKQorCSAgICBlcnJvciAoIiVsZDogJXMuIiwgcmlnaHQsIHN0cmVycm9yIChlcnIpKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgLyogUHJpbnQgYWxsIG9mIHRoZW0uICAqLworICAgIHsKKyAgICAgIGVycm9yX3QgZXJyID0KKwlwcmludF90YXNrX3BvcnRzX2luZm8gKGluZi0+dGFzay0+cG9ydCwgb25seSwgUE9SVElORk9fREVUQUlMUywKKwkJCSAgICAgICBzdGRvdXQpOworICAgICAgaWYgKGVycikKKwllcnJvciAoIiVzLiIsIHN0cmVycm9yIChlcnIpKTsKKyAgICB9CisKKyAgdmFsdWVfZnJlZV90b19tYXJrICh2bWFyayk7Cit9CisKK3N0YXRpYyB2b2lkCitpbmZvX3NlbmRfcmlnaHRzX2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBpbmZvX3BvcnRfcmlnaHRzIChhcmdzLCBNQUNIX1BPUlRfVFlQRV9TRU5EKTsKK30KK3N0YXRpYyB2b2lkCitpbmZvX3JlY3ZfcmlnaHRzX2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBpbmZvX3BvcnRfcmlnaHRzIChhcmdzLCBNQUNIX1BPUlRfVFlQRV9SRUNFSVZFKTsKK30KK3N0YXRpYyB2b2lkCitpbmZvX3BvcnRfc2V0c19jbWQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkKK3sKKyAgaW5mb19wb3J0X3JpZ2h0cyAoYXJncywgTUFDSF9QT1JUX1RZUEVfUE9SVF9TRVQpOworfQorc3RhdGljIHZvaWQKK2luZm9fZGVhZF9uYW1lc19jbWQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkKK3sKKyAgaW5mb19wb3J0X3JpZ2h0cyAoYXJncywgTUFDSF9QT1JUX1RZUEVfREVBRF9OQU1FKTsKK30KK3N0YXRpYyB2b2lkCitpbmZvX3BvcnRfcmlnaHRzX2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBpbmZvX3BvcnRfcmlnaHRzIChhcmdzLCB+MCk7Cit9CisMCitzdGF0aWMgdm9pZCBhZGRfdGFza19jb21tYW5kcyAoKQoreworICBhZGRfY21kICgicGF1c2UiLCBjbGFzc19ydW4sIHNldF90aHJlYWRfZGVmYXVsdF9wYXVzZV9jbWQsCisJICAgIlNldCB3aGV0aGVyIHRoZSBuZXcgdGhyZWFkcyBhcmUgc3VzcGVuZGVkIHdoaWxlIGdkYiBoYXMgY29udHJvbC5cbiIKKwkgICAiVGhpcyBwcm9wZXJ0eSBub3JtYWxseSBoYXMgbm8gZWZmZWN0IGJlY2F1c2UgdGhlIHdob2xlIHRhc2sgaXNcbiIKKwkgICAic3VzcGVuZGVkLCBob3dldmVyLCB0aGF0IG1heSBiZSBkaXNhYmxlZCB3aXRoIFwic2V0IHRhc2sgcGF1c2Ugb2ZmXCIuXG4iCisJICAgIlRoZSBkZWZhdWx0IHZhbHVlIGlzIFwib2ZmXCIuIiwKKwkgICAmc2V0X3RocmVhZF9kZWZhdWx0X2NtZF9saXN0KTsKKyAgYWRkX2NtZCAoInBhdXNlIiwgbm9fY2xhc3MsIHNob3dfdGhyZWFkX2RlZmF1bHRfcGF1c2VfY21kLAorCSAgICJTaG93IHdoZXRoZXIgbmV3IHRocmVhZHMgYXJlIHN1c3BlbmRlZCB3aGlsZSBnZGIgaGFzIGNvbnRyb2wuIiwKKwkgICAmc2hvd190aHJlYWRfZGVmYXVsdF9jbWRfbGlzdCk7CisgIGFkZF9jbWQgKCJydW4iLCBjbGFzc19ydW4sIHNldF90aHJlYWRfZGVmYXVsdF9ydW5fY21kLAorCSAgICJTZXQgd2hldGhlciBuZXcgdGhyZWFkcyBhcmUgYWxsb3dlZCB0byBydW4gKG9uY2UgZ2RiIGhhcyBub3RpY2VkIHRoZW0pLiIsCisJICAgJnNldF90aHJlYWRfZGVmYXVsdF9jbWRfbGlzdCk7CisgIGFkZF9jbWQgKCJydW4iLCBub19jbGFzcywgc2hvd190aHJlYWRfZGVmYXVsdF9ydW5fY21kLAorCSAgICJTaG93IHdoZXRoZXIgbmV3IHRocmVhZHMgYXJlIGFsbG93ZWQgdG8gcnVuIChvbmNlIGdkYiBoYXMgbm90aWNlZAordGhlbSkuIiwKKwkgICAmc2hvd190aHJlYWRfZGVmYXVsdF9jbWRfbGlzdCk7CisgIGFkZF9jbWQgKCJkZXRhY2gtc3VzcGVuZC1jb3VudCIsIGNsYXNzX3J1biwgc2V0X3RocmVhZF9kZWZhdWx0X2RldGFjaF9zY19jbWQsCisJICAgIlNldCB0aGUgZGVmYXVsdCBkZXRhY2gtc3VzcGVuZC1jb3VudCB2YWx1ZSBmb3IgbmV3IHRocmVhZHMuIiwKKwkgICAmc2V0X3RocmVhZF9kZWZhdWx0X2NtZF9saXN0KTsKKyAgYWRkX2NtZCAoImRldGFjaC1zdXNwZW5kLWNvdW50Iiwgbm9fY2xhc3MsIHNob3dfdGhyZWFkX2RlZmF1bHRfZGV0YWNoX3NjX2NtZCwKKwkgICAiU2hvdyB0aGUgZGVmYXVsdCBkZXRhY2gtc3VzcGVuZC1jb3VudCB2YWx1ZSBmb3IgbmV3IHRocmVhZHMuIiwKKwkgICAmc2hvd190aHJlYWRfZGVmYXVsdF9jbWRfbGlzdCk7CisKKyAgYWRkX2NtZCAoInNpZ25hbHMiLCBjbGFzc19ydW4sIHNldF9zaWduYWxzX2NtZCwKKwkgICAiU2V0IHdoZXRoZXIgdGhlIGluZmVyaW9yIHByb2Nlc3MncyBzaWduYWxzIHdpbGwgYmUgaW50ZXJjZXB0ZWQuXG4iCisJICAgIk1hY2ggZXhjZXB0aW9ucyAoc3VjaCBhcyBicmVha3BvaW50IHRyYXBzKSBhcmUgbm90IGFmZmVjdGVkLiIsCisJICAgJnNldGxpc3QpOworICBhZGRfYWxpYXNfY21kICgic2lncyIsICJzaWduYWxzIiwgY2xhc3NfcnVuLCAxLCAmc2V0bGlzdCk7CisgIGFkZF9jbWQgKCJzaWduYWxzIiwgbm9fY2xhc3MsIHNob3dfc2lnbmFsc19jbWQsCisJICAgIlNob3cgd2hldGhlciB0aGUgaW5mZXJpb3IgcHJvY2VzcydzIHNpZ25hbHMgd2lsbCBiZSBpbnRlcmNlcHRlZC4iLAorCSAgICZzaG93bGlzdCk7CisgIGFkZF9hbGlhc19jbWQgKCJzaWdzIiwgInNpZ25hbHMiLCBub19jbGFzcywgMSwgJnNob3dsaXN0KTsKKworICBhZGRfY21kICgic2lnbmFsLXRocmVhZCIsIGNsYXNzX3J1biwgc2V0X3NpZ190aHJlYWRfY21kLAorCSAgICJTZXQgdGhlIHRocmVhZCB0aGF0IGdkYiB0aGlua3MgaXMgdGhlIGxpYmMgc2lnbmFsIHRocmVhZC5cbiIKKwkgICAiVGhpcyB0aHJlYWQgaXMgcnVuIHdoZW4gZGVsaXZlcmluZyBhIHNpZ25hbCB0byBhIG5vbi1zdG9wcGVkIHByb2Nlc3MuIiwKKwkgICAmc2V0bGlzdCk7CisgIGFkZF9hbGlhc19jbWQgKCJzaWd0aHJlYWQiLCAic2lnbmFsLXRocmVhZCIsIGNsYXNzX3J1biwgMSwgJnNldGxpc3QpOworICBhZGRfY21kICgic2lnbmFsLXRocmVhZCIsIG5vX2NsYXNzLCBzaG93X3NpZ190aHJlYWRfY21kLAorCSAgICJTZXQgdGhlIHRocmVhZCB0aGF0IGdkYiB0aGlua3MgaXMgdGhlIGxpYmMgc2lnbmFsIHRocmVhZC4iLAorCSAgICZzaG93bGlzdCk7CisgIGFkZF9hbGlhc19jbWQgKCJzaWd0aHJlYWQiLCAic2lnbmFsLXRocmVhZCIsIG5vX2NsYXNzLCAxLCAmc2hvd2xpc3QpOworCisgIGFkZF9jbWQgKCJzdG9wcGVkIiwgY2xhc3NfcnVuLCBzZXRfc3RvcHBlZF9jbWQsCisJICAgIlNldCB3aGV0aGVyIGdkYiB0aGlua3MgdGhlIGluZmVyaW9yIHByb2Nlc3MgaXMgc3RvcHBlZCBhcyB3aXRoIFNJR1NUT1AuXG4iCisJICAgIlN0b3BwZWQgcHJvY2VzcyB3aWxsIGJlIGNvbnRpbnVlZCBieSBzZW5kaW5nIHRoZW0gYSBzaWduYWwuIiwKKwkgICAmc2V0bGlzdCk7CisgIGFkZF9jbWQgKCJzdG9wcGVkIiwgbm9fY2xhc3MsIHNob3dfc2lnbmFsc19jbWQsCisJICAgIlNob3cgd2hldGhlciBnZGIgdGhpbmtzIHRoZSBpbmZlcmlvciBwcm9jZXNzIGlzIHN0b3BwZWQgYXMgd2l0aCBTSUdTVE9QLiIsCisJICAgJnNob3dsaXN0KTsKKworICBhZGRfY21kICgiZXhjZXB0aW9ucyIsIGNsYXNzX3J1biwgc2V0X2V4Y2VwdGlvbnNfY21kLAorCSAgICJTZXQgd2hldGhlciBleGNlcHRpb25zIGluIHRoZSBpbmZlcmlvciBwcm9jZXNzIHdpbGwgYmUgdHJhcHBlZC5cbiIKKwkgICAiV2hlbiBleGNlcHRpb25zIGFyZSB0dXJuZWQgb2ZmLCBuZWl0aGVyIGJyZWFrcG9pbnRzIG5vciBzaW5nbGUtc3RlcHBpbmdcbiIKKwkgICAid2lsbCB3b3JrLiIsCisJICAgJnNldGxpc3QpOworICAvKiBBbGxvdyBgc2V0IGV4YycgZGVzcGl0ZSBjb25mbGljdCB3aXRoIGBzZXQgZXhjZXB0aW9uLXBvcnQnLiAgKi8KKyAgYWRkX2FsaWFzX2NtZCAoImV4YyIsICJleGNlcHRpb25zIiwgY2xhc3NfcnVuLCAxLCAmc2V0bGlzdCk7CisgIGFkZF9jbWQgKCJleGNlcHRpb25zIiwgbm9fY2xhc3MsIHNob3dfZXhjZXB0aW9uc19jbWQsCisJICAgIlNob3cgd2hldGhlciBleGNlcHRpb25zIGluIHRoZSBpbmZlcmlvciBwcm9jZXNzIHdpbGwgYmUgdHJhcHBlZC4iLAorCSAgICZzaG93bGlzdCk7CisKKyAgYWRkX3ByZWZpeF9jbWQgKCJ0YXNrIiwgbm9fY2xhc3MsIHNldF90YXNrX2NtZCwKKwkJICAiQ29tbWFuZCBwcmVmaXggZm9yIHNldHRpbmcgdGFzayBhdHRyaWJ1dGVzLiIsCisJCSAgJnNldF90YXNrX2NtZF9saXN0LCAic2V0IHRhc2sgIiwgMCwgJnNldGxpc3QpOworICBhZGRfcHJlZml4X2NtZCAoInRhc2siLCBub19jbGFzcywgc2hvd190YXNrX2NtZCwKKwkJICAiQ29tbWFuZCBwcmVmaXggZm9yIHNob3dpbmcgdGFzayBhdHRyaWJ1dGVzLiIsCisJCSAgJnNob3dfdGFza19jbWRfbGlzdCwgInNob3cgdGFzayAiLCAwLCAmc2hvd2xpc3QpOworCisgIGFkZF9jbWQgKCJwYXVzZSIsIGNsYXNzX3J1biwgc2V0X3Rhc2tfcGF1c2VfY21kLAorCSAgICJTZXQgd2hldGhlciB0aGUgdGFzayBpcyBzdXNwZW5kZWQgd2hpbGUgZ2RiIGhhcyBjb250cm9sLlxuIgorCSAgICJBIHZhbHVlIG9mIFwib25cIiB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHksIG90aGVyd2lzZSBub3RoaW5nXG4iCisJICAgImhhcHBlbnMgdW50aWwgdGhlIG5leHQgdGltZSB0aGUgcHJvZ3JhbSBpcyBjb250aW51ZWQuXG4iCisJICAgIldoZW4gc2V0dGluZyB0aGlzIHRvIFwib2ZmXCIsIFwic2V0IHRocmVhZCBkZWZhdWx0IHBhdXNlIG9uXCJcbiIKKwkgICAiY2FuIGJlIHVzZWQgdG8gcGF1c2UgaW5kaXZpZHVhbCB0aHJlYWRzIGJ5IGRlZmF1bHQgaW5zdGVhZC4iLAorCSAgICZzZXRfdGFza19jbWRfbGlzdCk7CisgIGFkZF9jbWQgKCJwYXVzZSIsIG5vX2NsYXNzLCBzaG93X3Rhc2tfcGF1c2VfY21kLAorCSAgICJTaG93IHdoZXRoZXIgdGhlIHRhc2sgaXMgc3VzcGVuZGVkIHdoaWxlIGdkYiBoYXMgY29udHJvbC4iLAorCSAgICZzaG93X3Rhc2tfY21kX2xpc3QpOworICBhZGRfY21kICgiZGV0YWNoLXN1c3BlbmQtY291bnQiLCBjbGFzc19ydW4sIHNldF90YXNrX2RldGFjaF9zY19jbWQsCisJICAgIlNldCB0aGUgc3VzcGVuZCBjb3VudCB3aWxsIGxlYXZlIG9uIHRoZSB0aHJlYWQgd2hlbiBkZXRhY2hpbmcuIiwKKwkgICAmc2V0X3Rhc2tfY21kX2xpc3QpOworICBhZGRfY21kICgiZGV0YWNoLXN1c3BlbmQtY291bnQiLCBub19jbGFzcywgc2hvd190YXNrX2RldGFjaF9zY19jbWQsCisJICAgIlNob3cgdGhlIHN1c3BlbmQgY291bnQgd2lsbCBsZWF2ZSBvbiB0aGUgdGhyZWFkIHdoZW4gZGV0YWNoaW5nLiIsCisJICAgJnNob3dfdGFza19jbWRfbGlzdCk7CisKKyAgYWRkX2NtZCAoImV4Y2VwdGlvbi1wb3J0Iiwgbm9fY2xhc3MsIHNldF90YXNrX2V4Y19wb3J0X2NtZCwKKwkgICAiU2V0IHRoZSB0YXNrIGV4Y2VwdGlvbiBwb3J0IHRvIHdoaWNoIHdlIGZvcndhcmQgZXhjZXB0aW9ucy5cbiIKKwkgICAiVGhlIGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgdmFsdWUgb2YgdGhlIHNlbmQgcmlnaHQgaW4gdGhlIHRhc2suIiwKKwkgICAmc2V0X3Rhc2tfY21kX2xpc3QpOworICBhZGRfYWxpYXNfY21kICgiZXhjcCIsICJleGNlcHRpb24tcG9ydCIsIG5vX2NsYXNzLCAxLCAmc2V0X3Rhc2tfY21kX2xpc3QpOworICBhZGRfYWxpYXNfY21kICgiZXhjLXBvcnQiLCAiZXhjZXB0aW9uLXBvcnQiLCBub19jbGFzcywgMSwgJnNldF90YXNrX2NtZF9saXN0KTsKKworICAvKiBBIGNvbnZlbmllbnQgd2F5IG9mIHR1cm5pbmcgb24gYWxsIG9wdGlvbnMgcmVxdWlyZSB0byBub25pbnZhc2l2ZWx5CisgICAgIGRlYnVnIHJ1bm5pbmcgdGFza3MuICAqLworICBhZGRfY21kICgibm9uaW52YXNpdmUiLCBub19jbGFzcywgc2V0X25vbmludmFzaXZlX2NtZCwKKwkgICAiU2V0IHRhc2sgb3B0aW9ucyBzbyB0aGF0IHdlIGludGVyZmVyZSBhcyBsaXR0bGUgYXMgcG9zc2libGUuXG4iCisJICAgIlRoaXMgaXMgdGhlIHNhbWUgYXMgc2V0dGluZyBgdGFzayBwYXVzZScsIGBleGNlcHRpb25zJywgYW5kIgorCSAgICJgc2lnbmFscycgdG8gdGhlIG9wcG9zaXRlIHZhbHVlLiIsCisJICAgJnNldGxpc3QpOworCisgIC8qIENvbW1hbmRzIHRvIHNob3cgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhc2sncyBwb3J0cy4gICovCisgIGFkZF9jbWQgKCJzZW5kLXJpZ2h0cyIsIGNsYXNzX2luZm8sIGluZm9fc2VuZF9yaWdodHNfY21kLAorCSAgICJTaG93IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXNrJ3Mgc2VuZCByaWdodHMiLAorCSAgICZpbmZvbGlzdCk7CisgIGFkZF9jbWQgKCJyZWNlaXZlLXJpZ2h0cyIsIGNsYXNzX2luZm8sIGluZm9fcmVjdl9yaWdodHNfY21kLAorCSAgICJTaG93IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXNrJ3MgcmVjZWl2ZSByaWdodHMiLAorCSAgICZpbmZvbGlzdCk7CisgIGFkZF9jbWQgKCJwb3J0LXJpZ2h0cyIsIGNsYXNzX2luZm8sIGluZm9fc2VuZF9yaWdodHNfY21kLAorCSAgICJTaG93IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXNrJ3MgcG9ydCByaWdodHMiLAorCSAgICZpbmZvbGlzdCk7CisgIGFkZF9jbWQgKCJwb3J0LXNldHMiLCBjbGFzc19pbmZvLCBpbmZvX3BvcnRfc2V0c19jbWQsCisJICAgIlNob3cgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhc2sncyBwb3J0IHNldHMiLAorCSAgICZpbmZvbGlzdCk7CisgIGFkZF9jbWQgKCJkZWFkLW5hbWVzIiwgY2xhc3NfaW5mbywgaW5mb19kZWFkX25hbWVzX2NtZCwKKwkgICAiU2hvdyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFzaydzIGRlYWQgbmFtZXMiLAorCSAgICZpbmZvbGlzdCk7CisgIGFkZF9pbmZvX2FsaWFzICgicG9ydHMiLCAicG9ydC1yaWdodHMiLCAxKTsKKyAgYWRkX2luZm9fYWxpYXMgKCJwb3J0IiwgInBvcnQtcmlnaHRzIiwgMSk7CisgIGFkZF9pbmZvX2FsaWFzICgicHNldHMiLCAicG9ydC1zZXRzIiwgMSk7Cit9CisMCisKK3N0YXRpYyB2b2lkCitzZXRfdGhyZWFkX3BhdXNlX2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBzdHJ1Y3QgcHJvYyAqdGhyZWFkID0gY3VyX3RocmVhZCAoKTsKKyAgaW50IG9sZF9zYyA9IHRocmVhZC0+cGF1c2Vfc2M7CisgIHRocmVhZC0+cGF1c2Vfc2MgPSBwYXJzZV9ib29sX2FyZyAoYXJncywgInNldCB0aHJlYWQgcGF1c2UiKTsKKyAgaWYgKG9sZF9zYyA9PSAwICYmIHRocmVhZC0+cGF1c2Vfc2MgIT0gMCAmJiB0aHJlYWQtPmluZi0+cGF1c2Vfc2MgPT0gMCkKKyAgICAvKiBJZiB0aGUgdGFzayBpcyBjdXJyZW50bHkgdW5zdXNwZW5kZWQsIGltbWVkaWF0ZWx5IHN1c3BlbmQgaXQsCisgICAgICAgb3RoZXJ3aXNlIHdhaXQgdW50aWwgdGhlIG5leHQgdGltZSBpdCBnZXRzIGNvbnRyb2wuICAqLworICAgIGluZl9zdXNwZW5kICh0aHJlYWQtPmluZik7Cit9CisKK3N0YXRpYyB2b2lkCitzaG93X3RocmVhZF9wYXVzZV9jbWQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkKK3sKKyAgc3RydWN0IHByb2MgKnRocmVhZCA9IGN1cl90aHJlYWQgKCk7CisgIGludCBzYyA9IHRocmVhZC0+cGF1c2Vfc2M7CisgIGNoZWNrX2VtcHR5IChhcmdzLCAic2hvdyB0YXNrIHBhdXNlIik7CisgIHByaW50Zl91bmZpbHRlcmVkICgiVGhyZWFkICVzICVzIHN1c3BlbmRlZCB3aGlsZSBnZGIgaGFzIGNvbnRyb2wlcy5cbiIsCisJCSAgICAgcHJvY19zdHJpbmcgKHRocmVhZCksCisJCSAgICAgc2MgPyAiaXMiIDogImlzbid0IiwKKwkJICAgICAhc2MgJiYgdGhyZWFkLT5pbmYtPnBhdXNlX3NjID8gIiAoYnV0IHRoZSB0YXNrIGlzKSIgOiAiIik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfdGhyZWFkX3J1bl9jbWQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkKK3sKKyAgc3RydWN0IHByb2MgKnRocmVhZCA9IGN1cl90aHJlYWQgKCk7CisgIHRocmVhZC0+cnVuX3NjID0gcGFyc2VfYm9vbF9hcmcgKGFyZ3MsICJzZXQgdGhyZWFkIHJ1biIpID8gMCA6IDE7Cit9CisKK3N0YXRpYyB2b2lkCitzaG93X3RocmVhZF9ydW5fY21kIChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpCit7CisgIHN0cnVjdCBwcm9jICp0aHJlYWQgPSBjdXJfdGhyZWFkICgpOworICBjaGVja19lbXB0eSAoYXJncywgInNob3cgdGhyZWFkIHJ1biIpOworICBwcmludGZfdW5maWx0ZXJlZCAoIlRocmVhZCAlcyAlcyBhbGxvd2VkIHRvIHJ1bi4iLAorCQkgICAgIHByb2Nfc3RyaW5nICh0aHJlYWQpLAorCQkgICAgIHRocmVhZC0+cnVuX3NjID09IDAgPyAiaXMiIDogImlzbid0Iik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfdGhyZWFkX2RldGFjaF9zY19jbWQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkKK3sKKyAgY3VyX3RocmVhZCAoKS0+ZGV0YWNoX3NjID0gcGFyc2VfaW50X2FyZyAoYXJncywgInNldCB0aHJlYWQgZGV0YWNoLXN1c3BlbmQtY291bnQiKTsKK30KKworc3RhdGljIHZvaWQKK3Nob3dfdGhyZWFkX2RldGFjaF9zY19jbWQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkKK3sKKyAgc3RydWN0IHByb2MgKnRocmVhZCA9IGN1cl90aHJlYWQgKCk7CisgIGNoZWNrX2VtcHR5IChhcmdzLCAic2hvdyB0aHJlYWQgZGV0YWNoLXN1c3BlbmQtY291bnQiKTsKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJUaHJlYWQgJXMgd2lsbCBiZSBsZWZ0IHdpdGggYSBzdXNwZW5kIGNvdW50IG9mICVkIHdoZW4gZGV0YWNoaW5nLlxuIiwKKwkJICAgICBwcm9jX3N0cmluZyAodGhyZWFkKSwKKwkJICAgICB0aHJlYWQtPmRldGFjaF9zYyk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfdGhyZWFkX2V4Y19wb3J0X2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBzdHJ1Y3QgcHJvYyAqdGhyZWFkID0gY3VyX3RocmVhZCAoKTsKKyAgaWYgKCFhcmdzKQorICAgIGVycm9yICgiTm8gYXJndW1lbnQgdG8gXCJzZXQgdGhyZWFkIGV4Y2VwdGlvbi1wb3J0XCIgY29tbWFuZC4iKTsKKyAgc3RlYWxfZXhjX3BvcnQgKHRocmVhZCwgcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAoYXJncykpOworfQorCisjaWYgMAorc3RhdGljIHZvaWQKK3Nob3dfdGhyZWFkX2NtZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQoreworICBzdHJ1Y3QgcHJvYyAqdGhyZWFkID0gY3VyX3RocmVhZCAoKTsKKyAgY2hlY2tfZW1wdHkgKGFyZ3MsICJzaG93IHRocmVhZCIpOworICBzaG93X3RocmVhZF9ydW5fY21kICgwLCBmcm9tX3R0eSk7CisgIHNob3dfdGhyZWFkX3BhdXNlX2NtZCAoMCwgZnJvbV90dHkpOworICBpZiAodGhyZWFkLT5kZXRhY2hfc2MgIT0gMCkKKyAgICBzaG93X3RocmVhZF9kZXRhY2hfc2NfY21kICgwLCBmcm9tX3R0eSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK3RocmVhZF90YWtlb3Zlcl9zY19jbWQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkKK3sKKyAgc3RydWN0IHByb2MgKnRocmVhZCA9IGN1cl90aHJlYWQgKCk7CisgIHRocmVhZF9iYXNpY19pbmZvX2RhdGFfdCBfaW5mbzsKKyAgdGhyZWFkX2Jhc2ljX2luZm9fdCBpbmZvID0gJl9pbmZvOworICBtYWNoX21zZ190eXBlX251bWJlcl90IGluZm9fbGVuID0gVEhSRUFEX0JBU0lDX0lORk9fQ09VTlQ7CisgIGVycm9yX3QgZXJyID0KKyAgICB0aHJlYWRfaW5mbyAodGhyZWFkLT5wb3J0LCBUSFJFQURfQkFTSUNfSU5GTywgKGludCAqKSZpbmZvLCAmaW5mb19sZW4pOworICBpZiAoZXJyKQorICAgIGVycm9yICgiJXMuIiwgc3RyZXJyb3IgKGVycikpOworICB0aHJlYWQtPnNjID0gaW5mby0+c3VzcGVuZF9jb3VudDsKKyAgaWYgKGZyb21fdHR5KQorICAgIHByaW50Zl91bmZpbHRlcmVkICgiU3VzcGVuZCBjb3VudCB3YXMgJWQuXG4iLCB0aHJlYWQtPnNjKTsKKyAgaWYgKGluZm8gIT0gJl9pbmZvKQorICAgIHZtX2RlYWxsb2NhdGUgKG1hY2hfdGFza19zZWxmICgpLCAodm1fYWRkcmVzc190KWluZm8sIGluZm9fbGVuICogc2l6ZW9mIChpbnQpKTsKK30KKworYWRkX3RocmVhZF9jb21tYW5kcyAoKQoreworICBhZGRfcHJlZml4X2NtZCAoInRocmVhZCIsIG5vX2NsYXNzLCBzZXRfdGhyZWFkX2NtZCwKKwkJICAiQ29tbWFuZCBwcmVmaXggZm9yIHNldHRpbmcgdGhyZWFkIHByb3BlcnRpZXMuIiwKKwkJICAmc2V0X3RocmVhZF9jbWRfbGlzdCwgInNldCB0aHJlYWQgIiwgMCwgJnNldGxpc3QpOworICBhZGRfcHJlZml4X2NtZCAoImRlZmF1bHQiLCBub19jbGFzcywgc2hvd190aHJlYWRfY21kLAorCQkgICJDb21tYW5kIHByZWZpeCBmb3Igc2V0dGluZyBkZWZhdWx0IHRocmVhZCBwcm9wZXJ0aWVzLiIsCisJCSAgJnNldF90aHJlYWRfZGVmYXVsdF9jbWRfbGlzdCwgInNldCB0aHJlYWQgZGVmYXVsdCAiLCAwLAorCQkgICZzZXRfdGhyZWFkX2NtZF9saXN0KTsKKyAgYWRkX3ByZWZpeF9jbWQgKCJ0aHJlYWQiLCBub19jbGFzcywgc2V0X3RocmVhZF9kZWZhdWx0X2NtZCwKKwkJICAiQ29tbWFuZCBwcmVmaXggZm9yIHNob3dpbmcgdGhyZWFkIHByb3BlcnRpZXMuIiwKKwkJICAmc2hvd190aHJlYWRfY21kX2xpc3QsICJzaG93IHRocmVhZCAiLCAwLCAmc2hvd2xpc3QpOworICBhZGRfcHJlZml4X2NtZCAoImRlZmF1bHQiLCBub19jbGFzcywgc2hvd190aHJlYWRfZGVmYXVsdF9jbWQsCisJCSAgIkNvbW1hbmQgcHJlZml4IGZvciBzaG93aW5nIGRlZmF1bHQgdGhyZWFkIHByb3BlcnRpZXMuIiwKKwkJICAmc2hvd190aHJlYWRfZGVmYXVsdF9jbWRfbGlzdCwgInNob3cgdGhyZWFkIGRlZmF1bHQgIiwgMCwKKwkJICAmc2hvd190aHJlYWRfY21kX2xpc3QpOworCisgIGFkZF9jbWQgKCJwYXVzZSIsIGNsYXNzX3J1biwgc2V0X3RocmVhZF9wYXVzZV9jbWQsCisJICAgIlNldCB3aGV0aGVyIHRoZSBjdXJyZW50IHRocmVhZCBpcyBzdXNwZW5kZWQgd2hpbGUgZ2RiIGhhcyBjb250cm9sLlxuIgorCSAgICJBIHZhbHVlIG9mIFwib25cIiB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHksIG90aGVyd2lzZSBub3RoaW5nXG4iCisJICAgImhhcHBlbnMgdW50aWwgdGhlIG5leHQgdGltZSB0aGUgcHJvZ3JhbSBpcyBjb250aW51ZWQuICBUaGlzXG4iCisJICAgInByb3BlcnR5IG5vcm1hbGx5IGhhcyBubyBlZmZlY3QgYmVjYXVzZSB0aGUgd2hvbGUgdGFzayBpcyBzdXNwZW5kZWQsXG4iCisJICAgImhvd2V2ZXIsIHRoYXQgbWF5IGJlIGRpc2FibGVkIHdpdGggXCJzZXQgdGFzayBwYXVzZSBvZmZcIi5cbiIKKwkgICAiVGhlIGRlZmF1bHQgdmFsdWUgaXMgXCJvZmZcIi4iLAorCSAgICZzZXRfdGhyZWFkX2NtZF9saXN0KTsKKyAgYWRkX2NtZCAoInBhdXNlIiwgbm9fY2xhc3MsIHNob3dfdGhyZWFkX3BhdXNlX2NtZCwKKwkgICAiU2hvdyB3aGV0aGVyIHRoZSBjdXJyZW50IHRocmVhZCBpcyBzdXNwZW5kZWQgd2hpbGUgZ2RiIGhhcyBjb250cm9sLiIsCisJICAgJnNob3dfdGhyZWFkX2NtZF9saXN0KTsKKworICBhZGRfY21kICgicnVuIiwgY2xhc3NfcnVuLCBzZXRfdGhyZWFkX3J1bl9jbWQsCisJICAgIlNldCB3aGV0aGVyIHRoZSBjdXJyZW50IHRocmVhZCBpcyBhbGxvd2VkIHRvIHJ1bi4iLAorCSAgICZzZXRfdGhyZWFkX2NtZF9saXN0KTsKKyAgYWRkX2NtZCAoInJ1biIsIG5vX2NsYXNzLCBzaG93X3RocmVhZF9ydW5fY21kLAorCSAgICJTaG93IHdoZXRoZXIgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIGFsbG93ZWQgdG8gcnVuLiIsCisJICAgJnNob3dfdGhyZWFkX2NtZF9saXN0KTsKKworICBhZGRfY21kICgiZGV0YWNoLXN1c3BlbmQtY291bnQiLCBjbGFzc19ydW4sIHNldF90aHJlYWRfZGV0YWNoX3NjX2NtZCwKKwkgICAiU2V0IHRoZSBzdXNwZW5kIGNvdW50IHdpbGwgbGVhdmUgb24gdGhlIHRocmVhZCB3aGVuIGRldGFjaGluZy5cbiIKKwkgICAiTm90ZSB0aGF0IHRoaXMgaXMgcmVsYXRpdmUgdG8gc3VzcGVuZCBjb3VudCB3aGVuIGdkYiBub3RpY2VkIHRoZSB0aHJlYWQ7XG4iCisJICAgInVzZSB0aGUgYHRocmVhZCB0YWtlb3Zlci1zdXNwZW5kLWNvdW50JyB0byBmb3JjZSBpdCB0byBhbiBhYnNvbHV0ZSB2YWx1ZS4iLAorCSAgICZzZXRfdGhyZWFkX2NtZF9saXN0KTsKKyAgYWRkX2NtZCAoImRldGFjaC1zdXNwZW5kLWNvdW50Iiwgbm9fY2xhc3MsIHNob3dfdGhyZWFkX2RldGFjaF9zY19jbWQsCisJICAgIlNob3cgdGhlIHN1c3BlbmQgY291bnQgd2lsbCBsZWF2ZSBvbiB0aGUgdGhyZWFkIHdoZW4gZGV0YWNoaW5nLiIKKwkgICAiTm90ZSB0aGF0IHRoaXMgaXMgcmVsYXRpdmUgdG8gc3VzcGVuZCBjb3VudCB3aGVuIGdkYiBub3RpY2VkIHRoZSB0aHJlYWQ7XG4iCisJICAgInVzZSB0aGUgYHRocmVhZCB0YWtlb3Zlci1zdXNwZW5kLWNvdW50JyB0byBmb3JjZSBpdCB0byBhbiBhYnNvbHV0ZSB2YWx1ZS4iLAorCSAgICZzaG93X3RocmVhZF9jbWRfbGlzdCk7CisKKyAgYWRkX2NtZCAoImV4Y2VwdGlvbi1wb3J0Iiwgbm9fY2xhc3MsIHNldF90aHJlYWRfZXhjX3BvcnRfY21kLAorCSAgICJTZXQgdGhlIGV4Y2VwdGlvbiBwb3J0IHRvIHdoaWNoIHdlIGZvcndhcmQgZXhjZXB0aW9ucyBmb3IgdGhlXG4iCisJICAgImN1cnJlbnQgdGhyZWFkLCBvdmVycmlkaW5nIHRoZSB0YXNrIGV4Y2VwdGlvbiBwb3J0LlxuIgorCSAgICJUaGUgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSB2YWx1ZSBvZiB0aGUgc2VuZCByaWdodCBpbiB0aGUgdGFzay4iLAorCSAgICZzZXRfdGhyZWFkX2NtZF9saXN0KTsKKyAgYWRkX2FsaWFzX2NtZCAoImV4Y3AiLCAiZXhjZXB0aW9uLXBvcnQiLCBub19jbGFzcywgMSwgJnNldF90aHJlYWRfY21kX2xpc3QpOworICBhZGRfYWxpYXNfY21kICgiZXhjLXBvcnQiLCAiZXhjZXB0aW9uLXBvcnQiLCBub19jbGFzcywgMSwgJnNldF90aHJlYWRfY21kX2xpc3QpOworCisgIGFkZF9jbWQgKCJ0YWtlb3Zlci1zdXNwZW5kLWNvdW50Iiwgbm9fY2xhc3MsIHRocmVhZF90YWtlb3Zlcl9zY19jbWQsCisJICAgIkZvcmNlIHRoZSB0aHJlYWRzIGFic29sdXRlIHN1c3BlbmQtY291bnQgdG8gYmUgZ2RiJ3MuXG4iCisJICAgIlByaW9yIHRvIGdpdmluZyB0aGlzIGNvbW1hbmQsIGdkYidzIHRocmVhZCBzdXNwZW5kLWNvdW50cyBhcmUgcmVsYXRpdmUgdG9cbiIKKwkgICAidGhlIHRocmVhZCdzIGluaXRpYWwgc3VzcGVuZC1jb3VudCB3aGVuIGdkYiBub3RpY2VzIHRoZSB0aHJlYWRzLiIsCisJICAgJnRocmVhZF9jbWRfbGlzdCk7Cit9CisMCit2b2lkCitfaW5pdGlhbGl6ZV9nbnVfbmF0ICgpCit7CisgIHByb2Nfc2VydmVyID0gZ2V0cHJvYyAoKTsKKyAgaW5pdF9nbnVfb3BzKCkgOworICBhZGRfdGFyZ2V0ICgmZ251X29wcyk7CisgIGFkZF90YXNrX2NvbW1hbmRzICgpOworICBhZGRfdGhyZWFkX2NvbW1hbmRzICgpOworCisjaWYgTUFJTlRFTkFOQ0VfQ01EUworICBhZGRfc2V0X2NtZCAoImdudS1kZWJ1ZyIsIGNsYXNzX21haW50ZW5hbmNlLAorCSAgICAgICB2YXJfYm9vbGVhbiwgKGNoYXIgKikmZ251X2RlYnVnX2ZsYWcsCisJICAgICAgICJTZXQgZGVidWdnaW5nIG91dHB1dCBmb3IgdGhlIGdudSBiYWNrZW5kLiIsICZtYWludGVuYW5jZWxpc3QpOworI2VuZGlmCit9CisMCisjaWZkZWYJRkxVU0hfSU5GRVJJT1JfQ0FDSEUKKworLyogV2hlbiBvdmVyLXdyaXRpbmcgY29kZSBvbiBzb21lIG1hY2hpbmVzIHRoZSBJLUNhY2hlIG11c3QgYmUgZmx1c2hlZAorICAgZXhwbGljaXRseSwgYmVjYXVzZSBpdCBpcyBub3Qga2VwdCBjb2hlcmVudCBieSB0aGUgbGF6eSBoYXJkd2FyZS4KKyAgIFRoaXMgZGVmaW5pdGVseSBpbmNsdWRlcyBicmVha3BvaW50cywgZm9yIGluc3RhbmNlLCBvciBlbHNlIHdlCisgICBlbmQgdXAgbG9vcGluZyBpbiBteXN0ZXJpb3VzIEJwdCB0cmFwcyAqLworCit2b2lkCitmbHVzaF9pbmZlcmlvcl9pY2FjaGUocGMsIGFtb3VudCkKKyAgICAgQ09SRV9BRERSIHBjOworeworICB2bV9tYWNoaW5lX2F0dHJpYnV0ZV92YWxfdCBmbHVzaCA9IE1BVFRSX1ZBTF9JQ0FDSEVfRkxVU0g7CisgIGVycm9yX3QgICByZXQ7CisgIAorICByZXQgPSB2bV9tYWNoaW5lX2F0dHJpYnV0ZSAoY3VycmVudF9pbmZlcmlvci0+dGFzay0+cG9ydCwKKwkJCSAgICAgIHBjLAorCQkJICAgICAgYW1vdW50LAorCQkJICAgICAgTUFUVFJfQ0FDSEUsCisJCQkgICAgICAmZmx1c2gpOworICBpZiAocmV0ICE9IEtFUk5fU1VDQ0VTUykKKyAgICB3YXJuaW5nICgiRXJyb3IgZmx1c2hpbmcgaW5mZXJpb3IncyBjYWNoZSA6ICVzIiwgc3RyZXJyb3IgKHJldCkpOworfQorI2VuZGlmCUZMVVNIX0lORkVSSU9SX0NBQ0hFCmRpZmYgLS1naXQgYS9nZGIvZ251LW5hdC5oIGIvZ2RiL2dudS1uYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjM4ZGMwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2dudS1uYXQuaApAQCAtMCwwICsxLDkzIEBACisvKiBDb21tb24gdGhpbmdzIHVzZWQgYnkgdGhlIHZhcmlvdXMgKmdudS1uYXQuYyBmaWxlcworICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitXcml0dGVuIGJ5IE1pbGVzIEJhZGVyIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KKworVGhlIEdOVSBIdXJkIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKK3lvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBIdXJkIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBfX0dOVV9OQVRfSF9fCisjZGVmaW5lIF9fR05VX05BVF9IX18KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG1hY2guaD4KKworc3RydWN0IGluZjsKKworZXh0ZXJuIHN0cnVjdCBpbmYgKmN1cnJlbnRfaW5mZXJpb3I7CisKKy8qIENvbnZlcnRzIGEgR0RCIHBpZCB0byBhIHN0cnVjdCBwcm9jLiAgKi8KK3N0cnVjdCBwcm9jICppbmZfdGlkX3RvX3RocmVhZCAoc3RydWN0IGluZiAqaW5mLCBpbnQgdGlkKTsKKworLyogQSBwcm9jIGlzIGVpdGhlciBhIHRocmVhZCwgb3IgdGhlIHRhc2sgKHRoZXJlIGNhbiBvbmx5IGJlIG9uZSB0YXNrIHByb2MKKyAgIGJlY2F1c2UgaXQgYWx3YXlzIGhhcyB0aGUgc2FtZSBUSUQsIFBST0NfVElEX1RBU0spLiAgKi8KK3N0cnVjdCBwcm9jCit7CisgIHRocmVhZF90IHBvcnQ7CQkvKiBUaGUgdGFzayBvciB0aHJlYWQgcG9ydC4gICovCisgIGludCB0aWQ7CQkJLyogVGhlIEdEQiBwaWQgKGFjdHVhbGx5IGEgdGhyZWFkIGlkKS4gICovCisgIGludCBudW07CQkJLyogQW4gaWQgbnVtYmVyIGZvciB0aHJlYWRzLCB0byBwcmludC4gICovCisKKyAgbWFjaF9wb3J0X3Qgc2F2ZWRfZXhjX3BvcnQ7CS8qIFRoZSB0YXNrL3RocmVhZCdzIHJlYWwgZXhjZXB0aW9uIHBvcnQuICAqLworICBtYWNoX3BvcnRfdCBleGNfcG9ydDsJCS8qIE91ciByZXBsYWNlbWVudCwgd2hpY2ggZm9yLiAgKi8KKworICBpbnQgc2M7CQkJLyogRGVzaXJlZCBzdXNwZW5kIGNvdW50LiAgICovCisgIGludCBjdXJfc2M7CQkJLyogSW1wbGVtZW50ZWQgc3VzcGVuZCBjb3VudC4gICovCisgIGludCBydW5fc2M7CQkJLyogRGVmYXVsdCBzYyB3aGVuIHRoZSBwcm9ncmFtIGlzIHJ1bm5pbmcuICovCisgIGludCBwYXVzZV9zYzsJCQkvKiBEZWZhdWx0IHNjIHdoZW4gZ2RiIGhhcyBjb250cm9sLiAqLworICBpbnQgcmVzdW1lX3NjOwkJLyogU2MgcmVzdWx0aW5nIGZyb20gdGhlIGxhc3QgcmVzdW1lLiAqLworICBpbnQgZGV0YWNoX3NjOwkJLyogU0MgdG8gbGVhdmUgYXJvdW5kIHdoZW4gZGV0YWNoaW5nCisJCQkJICAgZnJvbSBwcm9ncmFtLiAqLworCisgIHRocmVhZF9zdGF0ZV9kYXRhX3Qgc3RhdGU7CS8qIFJlZ2lzdGVycywgJmMuICovCisgIGludCBzdGF0ZV92YWxpZCA6IDE7CQkvKiBUcnVlIGlmIFNUQVRFIGlzIHVwIHRvIGRhdGUuICovCisgIGludCBzdGF0ZV9jaGFuZ2VkIDogMTsKKworICBpbnQgYWJvcnRlZCA6IDE7CQkvKiBUcnVlIGlmIHRocmVhZF9hYm9ydCBoYXMgYmVlbiBjYWxsZWQuICAqLworICBpbnQgZGVhZCA6IDE7CQkJLyogV2UgaGFwcGVuIHRvIGtub3cgaXQncyBhY3R1YWxseSBkZWFkLiAqLworCisgIC8qIEJpdCBtYXNrIG9mIHJlZ2lzdGVycyBmZXRjaGVkIGJ5IGdkYi4gIFRoaXMgaXMgdXNlZCB3aGVuIHdlIHJlLWZldGNoCisgICAgIFNUQVRFIGFmdGVyIGFib3J0aW5nIHRoZSB0aHJlYWQsIHRvIGRldGVjdCB0aGF0IGdkYiBtYXkgaGF2ZSBvdXQtb2YtZGF0ZQorICAgICBpbmZvcm1hdGlvbi4gICovCisgIHVuc2lnbmVkIGxvbmcgZmV0Y2hlZF9yZWdzOworCisgIHN0cnVjdCBpbmYgKmluZjsJCS8qIFdoZXJlIHdlIGNvbWUgZnJvbS4gICovCisKKyAgc3RydWN0IHByb2MgKm5leHQ7Cit9OworCisvKiBUaGUgdGFzayBoYXMgYSB0aHJlYWQgZW50cnkgd2l0aCB0aGlzIFRJRC4gICovCisjZGVmaW5lIFBST0NfVElEX1RBU0sgCSgtMSkKKworI2RlZmluZSBwcm9jX2lzX3Rhc2socHJvYykgKChwcm9jKS0+dGlkID09IFBST0NfVElEX1RBU0spCisjZGVmaW5lIHByb2NfaXNfdGhyZWFkKHByb2MpICgocHJvYyktPnRpZCAhPSBQUk9DX1RJRF9UQVNLKQorCitleHRlcm4gaW50IF9fcHJvY19waWQgKHN0cnVjdCBwcm9jICpwcm9jKTsKKworZXh0ZXJuIHRocmVhZF9zdGF0ZV90IHByb2NfZ2V0X3N0YXRlIChzdHJ1Y3QgcHJvYyAqcHJvYywgaW50IHdpbGxfbW9kaWZ5KTsKKworI2RlZmluZSBwcm9jX2RlYnVnKF9wcm9jLCBtc2csIGFyZ3MuLi4pIFwKKyAgZG8geyBzdHJ1Y3QgcHJvYyAqX19wcm9jID0gKF9wcm9jKTsgXAorICAgICAgIGRlYnVnICgie3Byb2MgJWQvJWQgJXB9OiAiIG1zZywgXAorCSAgICAgIF9fcHJvY19waWQgKF9fcHJvYyksIF9fcHJvYy0+dGlkLCBfX3Byb2MgLCAjI2FyZ3MpOyB9IHdoaWxlICgwKQorCisjaWYgTUFJTlRFTkFOQ0VfQ01EUworZXh0ZXJuIGludCBnbnVfZGVidWdfZmxhZzsKKyNkZWZpbmUgZGVidWcobXNnLCBhcmdzLi4uKSBcCisgZG8geyBpZiAoZ251X2RlYnVnX2ZsYWcpIFwKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIgbXNnICJcclxuIiwgX19GVU5DVElPTl9fICwgIyNhcmdzKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIGRlYnVnKG1zZywgYXJncy4uLikgKHZvaWQpMAorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0dOVV9OQVRfSF9fICovCmRpZmYgLS1naXQgYS9nZGIvZ251LXJlZ2V4LmMgYi9nZGIvZ251LXJlZ2V4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkYjcwZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9nbnUtcmVnZXguYwpAQCAtMCwwICsxLDU3OTcgQEAKKy8qIEV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyBhbmQgc2VhcmNoIGxpYnJhcnksCisgICB2ZXJzaW9uIDAuMTIuCisgICAoSW1wbGVtZW50cyBQT1NJWCBkcmFmdCBQMTAwMy4yL0QxMS4yLCBleGNlcHQgZm9yIHNvbWUgb2YgdGhlCisgICBpbnRlcm5hdGlvbmFsaXphdGlvbiBmZWF0dXJlcy4pCisgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgCisgICBHTlUgQyBMaWJyYXJ5LiAgQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQHByZXAuYWkubWl0LmVkdS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEFJWCByZXF1aXJlcyB0aGlzIHRvIGJlIHRoZSBmaXJzdCB0aGluZyBpbiB0aGUgZmlsZS4gKi8KKyNpZiBkZWZpbmVkIF9BSVggJiYgIWRlZmluZWQgUkVHRVhfTUFMTE9DCisgICNwcmFnbWEgYWxsb2NhCisjZW5kaWYKKworI3VuZGVmCV9HTlVfU09VUkNFCisjZGVmaW5lIF9HTlVfU09VUkNFCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpZm5kZWYgUEFSQU1TCisjIGlmIGRlZmluZWQgX19HTlVDX18gfHwgKGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18pCisjICBkZWZpbmUgUEFSQU1TKGFyZ3MpIGFyZ3MKKyMgZWxzZQorIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSAoKQorIyBlbmRpZiAgLyogR0NDLiAgKi8KKyNlbmRpZiAgLyogTm90IFBBUkFNUy4gICovCisKKyNpZiBkZWZpbmVkIFNURENfSEVBREVSUyAmJiAhZGVmaW5lZCBlbWFjcworIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisvKiBXZSBuZWVkIHRoaXMgZm9yIGBnbnUtcmVnZXguaCcsIGFuZCBwZXJoYXBzIGZvciB0aGUgRW1hY3MgaW5jbHVkZSBmaWxlcy4gICovCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKy8qIEZvciBwbGF0Zm9ybSB3aGljaCBzdXBwb3J0IHRoZSBJU08gQyBhbWVuZGVtZW50IDEgZnVuY3Rpb25hbGl0eSB3ZQorICAgc3VwcG9ydCB1c2VyIGRlZmluZWQgY2hhcmFjdGVyIGNsYXNzZXMuICAqLworI2lmIGRlZmluZWQgX0xJQkMgfHwgKGRlZmluZWQgSEFWRV9XQ1RZUEVfSCAmJiBkZWZpbmVkIEhBVkVfV0NIQVJfSCkKKyAvKiBTb2xhcmlzIDIuNSBoYXMgYSBidWc6IDx3Y2hhci5oPiBtdXN0IGJlIGluY2x1ZGVkIGJlZm9yZSA8d2N0eXBlLmg+LiAgKi8KKyMgaW5jbHVkZSA8d2NoYXIuaD4KKyMgaW5jbHVkZSA8d2N0eXBlLmg+CisjZW5kaWYKKworLyogVGhpcyBpcyBmb3Igb3RoZXIgR05VIGRpc3RyaWJ1dGlvbnMgd2l0aCBpbnRlcm5hdGlvbmFsaXplZCBtZXNzYWdlcy4gICovCisvKiBDWUdOVVMgTE9DQUw6IC4uL2ludGwgd2lsbCBoYW5kbGUgdGhpcyBmb3IgdXMgKi8KKyNpZmRlZiBFTkFCTEVfTkxTCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKyNlbHNlCisjIGRlZmluZSBnZXR0ZXh0KG1zZ2lkKSAobXNnaWQpCisjZW5kaWYKKworI2lmbmRlZiBnZXR0ZXh0X25vb3AKKy8qIFRoaXMgZGVmaW5lIGlzIHNvIHhnZXR0ZXh0IGNhbiBmaW5kIHRoZSBpbnRlcm5hdGlvbmFsaXphYmxlCisgICBzdHJpbmdzLiAgKi8KKyMgZGVmaW5lIGdldHRleHRfbm9vcChTdHJpbmcpIFN0cmluZworI2VuZGlmCisKKy8qIFRoZSBgZW1hY3MnIHN3aXRjaCB0dXJucyBvbiBjZXJ0YWluIG1hdGNoaW5nIGNvbW1hbmRzCisgICB0aGF0IG1ha2Ugc2Vuc2Ugb25seSBpbiBFbWFjcy4gKi8KKyNpZmRlZiBlbWFjcworCisjIGluY2x1ZGUgImxpc3AuaCIKKyMgaW5jbHVkZSAiYnVmZmVyLmgiCisjIGluY2x1ZGUgInN5bnRheC5oIgorCisjZWxzZSAgLyogbm90IGVtYWNzICovCisKKy8qIElmIHdlIGFyZSBub3QgbGlua2luZyB3aXRoIEVtYWNzIHByb3BlciwKKyAgIHdlIGNhbid0IHVzZSB0aGUgcmVsb2NhdGluZyBhbGxvY2F0b3IKKyAgIGV2ZW4gaWYgY29uZmlnLmggc2F5cyB0aGF0IHdlIGNhbi4gICovCisjIHVuZGVmIFJFTF9BTExPQworCisjIGlmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBlbHNlCitjaGFyICptYWxsb2MgKCk7CitjaGFyICpyZWFsbG9jICgpOworIyBlbmRpZgorCisvKiBXaGVuIHVzZWQgaW4gRW1hY3MncyBsaWItc3JjLCB3ZSBuZWVkIHRvIGdldCBiemVybyBhbmQgYmNvcHkgc29tZWhvdy4KKyAgIElmIG5vdGhpbmcgZWxzZSBoYXMgYmVlbiBkb25lLCB1c2UgdGhlIG1ldGhvZCBiZWxvdy4gICovCisjIGlmZGVmIElOSElCSVRfU1RSSU5HX0hFQURFUgorIyAgaWYgIShkZWZpbmVkIEhBVkVfQlpFUk8gJiYgZGVmaW5lZCBIQVZFX0JDT1BZKQorIyAgIGlmICFkZWZpbmVkIGJ6ZXJvICYmICFkZWZpbmVkIGJjb3B5CisjICAgIHVuZGVmIElOSElCSVRfU1RSSU5HX0hFQURFUgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorCisvKiBUaGlzIGlzIHRoZSBub3JtYWwgd2F5IG9mIG1ha2luZyBzdXJlIHdlIGhhdmUgYSBiY29weSBhbmQgYSBiemVyby4KKyAgIFRoaXMgaXMgdXNlZCBpbiBtb3N0IHByb2dyYW1zLS1hIGZldyBvdGhlciBwcm9ncmFtcyBhdm9pZCB0aGlzCisgICBieSBkZWZpbmluZyBJTkhJQklUX1NUUklOR19IRUFERVIuICAqLworIyBpZm5kZWYgSU5ISUJJVF9TVFJJTkdfSEVBREVSCisjICBpZiBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQworIyAgIGluY2x1ZGUgPHN0cmluZy5oPgorIyAgIGlmbmRlZiBiemVybworIyAgICBpZm5kZWYgX0xJQkMKKyMgICAgIGRlZmluZSBiemVybyhzLCBuKQkobWVtc2V0IChzLCAnXDAnLCBuKSwgKHMpKQorIyAgICBlbHNlCisjICAgICBkZWZpbmUgYnplcm8ocywgbikJX19iemVybyAocywgbikKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZWxzZQorIyAgIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyMgICBpZm5kZWYgbWVtY21wCisjICAgIGRlZmluZSBtZW1jbXAoczEsIHMyLCBuKQliY21wIChzMSwgczIsIG4pCisjICAgZW5kaWYKKyMgICBpZm5kZWYgbWVtY3B5CisjICAgIGRlZmluZSBtZW1jcHkoZCwgcywgbikJKGJjb3B5IChzLCBkLCBuKSwgKGQpKQorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorCisvKiBEZWZpbmUgdGhlIHN5bnRheCBzdHVmZiBmb3IgXDwsIFw+LCBldGMuICAqLworCisvKiBUaGlzIG11c3QgYmUgbm9uemVybyBmb3IgdGhlIHdvcmRjaGFyIGFuZCBub3R3b3JkY2hhciBwYXR0ZXJuCisgICBjb21tYW5kcyBpbiByZV9tYXRjaF8yLiAgKi8KKyMgaWZuZGVmIFN3b3JkCisjICBkZWZpbmUgU3dvcmQgMQorIyBlbmRpZgorCisjIGlmZGVmIFNXSVRDSF9FTlVNX0JVRworIyAgZGVmaW5lIFNXSVRDSF9FTlVNX0NBU1QoeCkgKChpbnQpKHgpKQorIyBlbHNlCisjICBkZWZpbmUgU1dJVENIX0VOVU1fQ0FTVCh4KSAoeCkKKyMgZW5kaWYKKworLyogSG93IG1hbnkgY2hhcmFjdGVycyBpbiB0aGUgY2hhcmFjdGVyIHNldC4gICovCisjIGRlZmluZSBDSEFSX1NFVF9TSVpFIDI1NgorCisvKiBHREIgTE9DQUw6IGRlZmluZSBfUkVHRVhfUkVfQ09NUCB0byBnZXQgQlNEIHN0eWxlIHJlX2NvbXAgYW5kIHJlX2V4ZWMgKi8KKyNpZm5kZWYgX1JFR0VYX1JFX0NPTVAKKyNkZWZpbmUgX1JFR0VYX1JFX0NPTVAKKyNlbmRpZgorCisjIGlmZGVmIFNZTlRBWF9UQUJMRQorCitleHRlcm4gY2hhciAqcmVfc3ludGF4X3RhYmxlOworCisjIGVsc2UgLyogbm90IFNZTlRBWF9UQUJMRSAqLworCitzdGF0aWMgY2hhciByZV9zeW50YXhfdGFibGVbQ0hBUl9TRVRfU0laRV07CisKK3N0YXRpYyB2b2lkCitpbml0X3N5bnRheF9vbmNlICgpCit7CisgICByZWdpc3RlciBpbnQgYzsKKyAgIHN0YXRpYyBpbnQgZG9uZSA9IDA7CisKKyAgIGlmIChkb25lKQorICAgICByZXR1cm47CisKKyAgIGJ6ZXJvIChyZV9zeW50YXhfdGFibGUsIHNpemVvZiByZV9zeW50YXhfdGFibGUpOworCisgICBmb3IgKGMgPSAnYSc7IGMgPD0gJ3onOyBjKyspCisgICAgIHJlX3N5bnRheF90YWJsZVtjXSA9IFN3b3JkOworCisgICBmb3IgKGMgPSAnQSc7IGMgPD0gJ1onOyBjKyspCisgICAgIHJlX3N5bnRheF90YWJsZVtjXSA9IFN3b3JkOworCisgICBmb3IgKGMgPSAnMCc7IGMgPD0gJzknOyBjKyspCisgICAgIHJlX3N5bnRheF90YWJsZVtjXSA9IFN3b3JkOworCisgICByZV9zeW50YXhfdGFibGVbJ18nXSA9IFN3b3JkOworCisgICBkb25lID0gMTsKK30KKworIyBlbmRpZiAvKiBub3QgU1lOVEFYX1RBQkxFICovCisKKyMgZGVmaW5lIFNZTlRBWChjKSByZV9zeW50YXhfdGFibGVbY10KKworI2VuZGlmIC8qIG5vdCBlbWFjcyAqLworDAorLyogR2V0IHRoZSBpbnRlcmZhY2UsIGluY2x1ZGluZyB0aGUgc3ludGF4IGJpdHMuICAqLworLyogQ1lHTlVTIExPQ0FMOiBjYWxsIGl0IGdudS1yZWdleC5oLCBub3QgcmVnZXguaCwgdG8gYXZvaWQgbmFtZSBjb25mbGljdHMgKi8KKyNpbmNsdWRlICJnbnUtcmVnZXguaCIKKworLyogaXNhbHBoYSBldGMuIGFyZSB1c2VkIGZvciB0aGUgY2hhcmFjdGVyIGNsYXNzZXMuICAqLworI2luY2x1ZGUgPGN0eXBlLmg+CisKKy8qIEppbSBNZXllcmluZyB3cml0ZXM6CisKKyAgICIuLi4gU29tZSBjdHlwZSBtYWNyb3MgYXJlIHZhbGlkIG9ubHkgZm9yIGNoYXJhY3RlciBjb2RlcyB0aGF0CisgICBpc2FzY2lpIHNheXMgYXJlIEFTQ0lJIChTR0kncyBJUklYLTQuMC41IGlzIG9uZSBzdWNoIHN5c3RlbSAtLXdoZW4KKyAgIHVzaW5nIC9iaW4vY2Mgb3IgZ2NjIGJ1dCB3aXRob3V0IGdpdmluZyBhbiBhbnNpIG9wdGlvbikuICBTbywgYWxsCisgICBjdHlwZSB1c2VzIHNob3VsZCBiZSB0aHJvdWdoIG1hY3JvcyBsaWtlIElTUFJJTlQuLi4gIElmCisgICBTVERDX0hFQURFUlMgaXMgZGVmaW5lZCwgdGhlbiBhdXRvY29uZiBoYXMgdmVyaWZpZWQgdGhhdCB0aGUgY3R5cGUKKyAgIG1hY3JvcyBkb24ndCBuZWVkIHRvIGJlIGd1YXJkZWQgd2l0aCByZWZlcmVuY2VzIHRvIGlzYXNjaWkuIC4uLgorICAgRGVmaW5pbmcgaXNhc2NpaSB0byAxIHNob3VsZCBsZXQgYW55IGNvbXBpbGVyIHdvcnRoIGl0cyBzYWx0CisgICBlbGltaW5hdGUgdGhlICYmIHRocm91Z2ggY29uc3RhbnQgZm9sZGluZy4iCisgICBTb2xhcmlzIGRlZmluZXMgc29tZSBvZiB0aGVzZSBzeW1ib2xzIHNvIHdlIG11c3QgdW5kZWZpbmUgdGhlbSBmaXJzdC4gICovCisKKyN1bmRlZiBJU0FTQ0lJCisjaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgKCFkZWZpbmVkIGlzYXNjaWkgJiYgIWRlZmluZWQgSEFWRV9JU0FTQ0lJKQorIyBkZWZpbmUgSVNBU0NJSShjKSAxCisjZWxzZQorIyBkZWZpbmUgSVNBU0NJSShjKSBpc2FzY2lpKGMpCisjZW5kaWYKKworI2lmZGVmIGlzYmxhbmsKKyMgZGVmaW5lIElTQkxBTksoYykgKElTQVNDSUkgKGMpICYmIGlzYmxhbmsgKGMpKQorI2Vsc2UKKyMgZGVmaW5lIElTQkxBTksoYykgKChjKSA9PSAnICcgfHwgKGMpID09ICdcdCcpCisjZW5kaWYKKyNpZmRlZiBpc2dyYXBoCisjIGRlZmluZSBJU0dSQVBIKGMpIChJU0FTQ0lJIChjKSAmJiBpc2dyYXBoIChjKSkKKyNlbHNlCisjIGRlZmluZSBJU0dSQVBIKGMpIChJU0FTQ0lJIChjKSAmJiBpc3ByaW50IChjKSAmJiAhaXNzcGFjZSAoYykpCisjZW5kaWYKKworI3VuZGVmIElTUFJJTlQKKyNkZWZpbmUgSVNQUklOVChjKSAoSVNBU0NJSSAoYykgJiYgaXNwcmludCAoYykpCisjZGVmaW5lIElTRElHSVQoYykgKElTQVNDSUkgKGMpICYmIGlzZGlnaXQgKGMpKQorI2RlZmluZSBJU0FMTlVNKGMpIChJU0FTQ0lJIChjKSAmJiBpc2FsbnVtIChjKSkKKyNkZWZpbmUgSVNBTFBIQShjKSAoSVNBU0NJSSAoYykgJiYgaXNhbHBoYSAoYykpCisjZGVmaW5lIElTQ05UUkwoYykgKElTQVNDSUkgKGMpICYmIGlzY250cmwgKGMpKQorI2RlZmluZSBJU0xPV0VSKGMpIChJU0FTQ0lJIChjKSAmJiBpc2xvd2VyIChjKSkKKyNkZWZpbmUgSVNQVU5DVChjKSAoSVNBU0NJSSAoYykgJiYgaXNwdW5jdCAoYykpCisjZGVmaW5lIElTU1BBQ0UoYykgKElTQVNDSUkgKGMpICYmIGlzc3BhY2UgKGMpKQorI2RlZmluZSBJU1VQUEVSKGMpIChJU0FTQ0lJIChjKSAmJiBpc3VwcGVyIChjKSkKKyNkZWZpbmUgSVNYRElHSVQoYykgKElTQVNDSUkgKGMpICYmIGlzeGRpZ2l0IChjKSkKKworI2lmbmRlZiBOVUxMCisjIGRlZmluZSBOVUxMICh2b2lkICopMAorI2VuZGlmCisKKy8qIFdlIHJlbW92ZSBhbnkgcHJldmlvdXMgZGVmaW5pdGlvbiBvZiBgU0lHTl9FWFRFTkRfQ0hBUicsCisgICBzaW5jZSBvdXJzICh3ZSBob3BlKSB3b3JrcyBwcm9wZXJseSB3aXRoIGFsbCBjb21iaW5hdGlvbnMgb2YKKyAgIG1hY2hpbmVzLCBjb21waWxlcnMsIGBjaGFyJyBhbmQgYHVuc2lnbmVkIGNoYXInIGFyZ3VtZW50IHR5cGVzLgorICAgKFBlciBCb3RobmVyIHN1Z2dlc3RlZCB0aGUgYmFzaWMgYXBwcm9hY2guKSAgKi8KKyN1bmRlZiBTSUdOX0VYVEVORF9DSEFSCisjaWYgX19TVERDX18KKyMgZGVmaW5lIFNJR05fRVhURU5EX0NIQVIoYykgKChzaWduZWQgY2hhcikgKGMpKQorI2Vsc2UgIC8qIG5vdCBfX1NURENfXyAqLworLyogQXMgaW4gSGFyYmlzb24gYW5kIFN0ZWVsZS4gICovCisjIGRlZmluZSBTSUdOX0VYVEVORF9DSEFSKGMpICgoKCh1bnNpZ25lZCBjaGFyKSAoYykpIF4gMTI4KSAtIDEyOCkKKyNlbmRpZgorDAorLyogU2hvdWxkIHdlIHVzZSBtYWxsb2Mgb3IgYWxsb2NhPyAgSWYgUkVHRVhfTUFMTE9DIGlzIG5vdCBkZWZpbmVkLCB3ZQorICAgdXNlIGBhbGxvY2EnIGluc3RlYWQgb2YgYG1hbGxvYycuICBUaGlzIGlzIGJlY2F1c2UgdXNpbmcgbWFsbG9jIGluCisgICByZV9zZWFyY2gqIG9yIHJlX21hdGNoKiBjb3VsZCBjYXVzZSBtZW1vcnkgbGVha3Mgd2hlbiBDLWcgaXMgdXNlZCBpbgorICAgRW1hY3M7IGFsc28sIG1hbGxvYyBpcyBzbG93ZXIgYW5kIGNhdXNlcyBzdG9yYWdlIGZyYWdtZW50YXRpb24uICBPbgorICAgdGhlIG90aGVyIGhhbmQsIG1hbGxvYyBpcyBtb3JlIHBvcnRhYmxlLCBhbmQgZWFzaWVyIHRvIGRlYnVnLgorCisgICBCZWNhdXNlIHdlIHNvbWV0aW1lcyB1c2UgYWxsb2NhLCBzb21lIHJvdXRpbmVzIGhhdmUgdG8gYmUgbWFjcm9zLAorICAgbm90IGZ1bmN0aW9ucyAtLSBgYWxsb2NhJy1hbGxvY2F0ZWQgc3BhY2UgZGlzYXBwZWFycyBhdCB0aGUgZW5kIG9mIHRoZQorICAgZnVuY3Rpb24gaXQgaXMgY2FsbGVkIGluLiAgKi8KKworI2lmZGVmIFJFR0VYX01BTExPQworCisjIGRlZmluZSBSRUdFWF9BTExPQ0FURSBtYWxsb2MKKyMgZGVmaW5lIFJFR0VYX1JFQUxMT0NBVEUoc291cmNlLCBvc2l6ZSwgbnNpemUpIHJlYWxsb2MgKHNvdXJjZSwgbnNpemUpCisjIGRlZmluZSBSRUdFWF9GUkVFIGZyZWUKKworI2Vsc2UgLyogbm90IFJFR0VYX01BTExPQyAgKi8KKworLyogRW1hY3MgYWxyZWFkeSBkZWZpbmVzIGFsbG9jYSwgc29tZXRpbWVzLiAgKi8KKyMgaWZuZGVmIGFsbG9jYQorCisvKiBNYWtlIGFsbG9jYSB3b3JrIHRoZSBiZXN0IHBvc3NpYmxlIHdheS4gICovCisjICBpZmRlZiBfX0dOVUNfXworIyAgIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorIyAgZWxzZSAvKiBub3QgX19HTlVDX18gKi8KKyMgICBpZiBIQVZFX0FMTE9DQV9ICisjICAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgIGVuZGlmIC8qIEhBVkVfQUxMT0NBX0ggKi8KKyMgIGVuZGlmIC8qIG5vdCBfX0dOVUNfXyAqLworCisjIGVuZGlmIC8qIG5vdCBhbGxvY2EgKi8KKworIyBkZWZpbmUgUkVHRVhfQUxMT0NBVEUgYWxsb2NhCisKKy8qIEFzc3VtZXMgYSBgY2hhciAqZGVzdGluYXRpb24nIHZhcmlhYmxlLiAgKi8KKyMgZGVmaW5lIFJFR0VYX1JFQUxMT0NBVEUoc291cmNlLCBvc2l6ZSwgbnNpemUpCQkJCVwKKyAgKGRlc3RpbmF0aW9uID0gKGNoYXIgKikgYWxsb2NhIChuc2l6ZSksCQkJCVwKKyAgIG1lbWNweSAoZGVzdGluYXRpb24sIHNvdXJjZSwgb3NpemUpKQorCisvKiBObyBuZWVkIHRvIGRvIGFueXRoaW5nIHRvIGZyZWUsIGFmdGVyIGFsbG9jYS4gICovCisjIGRlZmluZSBSRUdFWF9GUkVFKGFyZykgKCh2b2lkKTApIC8qIERvIG5vdGhpbmchICBCdXQgaW5oaWJpdCBnY2Mgd2FybmluZy4gICovCisKKyNlbmRpZiAvKiBub3QgUkVHRVhfTUFMTE9DICovCisKKy8qIERlZmluZSBob3cgdG8gYWxsb2NhdGUgdGhlIGZhaWx1cmUgc3RhY2suICAqLworCisjaWYgZGVmaW5lZCBSRUxfQUxMT0MgJiYgZGVmaW5lZCBSRUdFWF9NQUxMT0MKKworIyBkZWZpbmUgUkVHRVhfQUxMT0NBVEVfU1RBQ0soc2l6ZSkJCQkJXAorICByX2FsbG9jICgmZmFpbHVyZV9zdGFja19wdHIsIChzaXplKSkKKyMgZGVmaW5lIFJFR0VYX1JFQUxMT0NBVEVfU1RBQ0soc291cmNlLCBvc2l6ZSwgbnNpemUpCQlcCisgIHJfcmVfYWxsb2MgKCZmYWlsdXJlX3N0YWNrX3B0ciwgKG5zaXplKSkKKyMgZGVmaW5lIFJFR0VYX0ZSRUVfU1RBQ0socHRyKQkJCQkJXAorICByX2FsbG9jX2ZyZWUgKCZmYWlsdXJlX3N0YWNrX3B0cikKKworI2Vsc2UgLyogbm90IHVzaW5nIHJlbG9jYXRpbmcgYWxsb2NhdG9yICovCisKKyMgaWZkZWYgUkVHRVhfTUFMTE9DCisKKyMgIGRlZmluZSBSRUdFWF9BTExPQ0FURV9TVEFDSyBtYWxsb2MKKyMgIGRlZmluZSBSRUdFWF9SRUFMTE9DQVRFX1NUQUNLKHNvdXJjZSwgb3NpemUsIG5zaXplKSByZWFsbG9jIChzb3VyY2UsIG5zaXplKQorIyAgZGVmaW5lIFJFR0VYX0ZSRUVfU1RBQ0sgZnJlZQorCisjIGVsc2UgLyogbm90IFJFR0VYX01BTExPQyAqLworCisjICBkZWZpbmUgUkVHRVhfQUxMT0NBVEVfU1RBQ0sgYWxsb2NhCisKKyMgIGRlZmluZSBSRUdFWF9SRUFMTE9DQVRFX1NUQUNLKHNvdXJjZSwgb3NpemUsIG5zaXplKQkJCVwKKyAgIFJFR0VYX1JFQUxMT0NBVEUgKHNvdXJjZSwgb3NpemUsIG5zaXplKQorLyogTm8gbmVlZCB0byBleHBsaWNpdGx5IGZyZWUgYW55dGhpbmcuICAqLworIyAgZGVmaW5lIFJFR0VYX0ZSRUVfU1RBQ0soYXJnKQorCisjIGVuZGlmIC8qIG5vdCBSRUdFWF9NQUxMT0MgKi8KKyNlbmRpZiAvKiBub3QgdXNpbmcgcmVsb2NhdGluZyBhbGxvY2F0b3IgKi8KKworCisvKiBUcnVlIGlmIGBzaXplMScgaXMgbm9uLU5VTEwgYW5kIFBUUiBpcyBwb2ludGluZyBhbnl3aGVyZSBpbnNpZGUKKyAgIGBzdHJpbmcxJyBvciBqdXN0IHBhc3QgaXRzIGVuZC4gIFRoaXMgd29ya3MgaWYgUFRSIGlzIE5VTEwsIHdoaWNoIGlzCisgICBhIGdvb2QgdGhpbmcuICAqLworI2RlZmluZSBGSVJTVF9TVFJJTkdfUChwdHIpIAkJCQkJXAorICAoc2l6ZTEgJiYgc3RyaW5nMSA8PSAocHRyKSAmJiAocHRyKSA8PSBzdHJpbmcxICsgc2l6ZTEpCisKKy8qIChSZSlBbGxvY2F0ZSBOIGl0ZW1zIG9mIHR5cGUgVCB1c2luZyBtYWxsb2MsIG9yIGZhaWwuICAqLworI2RlZmluZSBUQUxMT0MobiwgdCkgKCh0ICopIG1hbGxvYyAoKG4pICogc2l6ZW9mICh0KSkpCisjZGVmaW5lIFJFVEFMTE9DKGFkZHIsIG4sIHQpICgoYWRkcikgPSAodCAqKSByZWFsbG9jIChhZGRyLCAobikgKiBzaXplb2YgKHQpKSkKKyNkZWZpbmUgUkVUQUxMT0NfSUYoYWRkciwgbiwgdCkgXAorICBpZiAoYWRkcikgUkVUQUxMT0MoKGFkZHIpLCAobiksIHQpOyBlbHNlIChhZGRyKSA9IFRBTExPQyAoKG4pLCB0KQorI2RlZmluZSBSRUdFWF9UQUxMT0MobiwgdCkgKCh0ICopIFJFR0VYX0FMTE9DQVRFICgobikgKiBzaXplb2YgKHQpKSkKKworI2RlZmluZSBCWVRFV0lEVEggOCAvKiBJbiBiaXRzLiAgKi8KKworI2RlZmluZSBTVFJFUShzMSwgczIpICgoc3RyY21wIChzMSwgczIpID09IDApKQorCisjdW5kZWYgTUFYCisjdW5kZWYgTUlOCisjZGVmaW5lIE1BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKKwordHlwZWRlZiBjaGFyIGJvb2xlYW47CisjZGVmaW5lIGZhbHNlIDAKKyNkZWZpbmUgdHJ1ZSAxCisKK3N0YXRpYyBpbnQgcmVfbWF0Y2hfMl9pbnRlcm5hbCBQQVJBTVMgKChzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgKmJ1ZnAsCisJCQkJCWNvbnN0IGNoYXIgKnN0cmluZzEsIGludCBzaXplMSwKKwkJCQkJY29uc3QgY2hhciAqc3RyaW5nMiwgaW50IHNpemUyLAorCQkJCQlpbnQgcG9zLAorCQkJCQlzdHJ1Y3QgcmVfcmVnaXN0ZXJzICpyZWdzLAorCQkJCQlpbnQgc3RvcCkpOworDAorLyogVGhlc2UgYXJlIHRoZSBjb21tYW5kIGNvZGVzIHRoYXQgYXBwZWFyIGluIGNvbXBpbGVkIHJlZ3VsYXIKKyAgIGV4cHJlc3Npb25zLiAgU29tZSBvcGNvZGVzIGFyZSBmb2xsb3dlZCBieSBhcmd1bWVudCBieXRlcy4gIEEKKyAgIGNvbW1hbmQgY29kZSBjYW4gc3BlY2lmeSBhbnkgaW50ZXJwcmV0YXRpb24gd2hhdHNvZXZlciBmb3IgaXRzCisgICBhcmd1bWVudHMuICBaZXJvIGJ5dGVzIG1heSBhcHBlYXIgaW4gdGhlIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4gICovCisKK3R5cGVkZWYgZW51bQoreworICBub19vcCA9IDAsCisKKyAgLyogU3VjY2VlZCByaWdodCBhd2F5LS1ubyBtb3JlIGJhY2t0cmFja2luZy4gICovCisgIHN1Y2NlZWQsCisKKyAgICAgICAgLyogRm9sbG93ZWQgYnkgb25lIGJ5dGUgZ2l2aW5nIG4sIHRoZW4gYnkgbiBsaXRlcmFsIGJ5dGVzLiAgKi8KKyAgZXhhY3RuLAorCisgICAgICAgIC8qIE1hdGNoZXMgYW55IChtb3JlIG9yIGxlc3MpIGNoYXJhY3Rlci4gICovCisgIGFueWNoYXIsCisKKyAgICAgICAgLyogTWF0Y2hlcyBhbnkgb25lIGNoYXIgYmVsb25naW5nIHRvIHNwZWNpZmllZCBzZXQuICBGaXJzdAorICAgICAgICAgICBmb2xsb3dpbmcgYnl0ZSBpcyBudW1iZXIgb2YgYml0bWFwIGJ5dGVzLiAgVGhlbiBjb21lIGJ5dGVzCisgICAgICAgICAgIGZvciBhIGJpdG1hcCBzYXlpbmcgd2hpY2ggY2hhcnMgYXJlIGluLiAgQml0cyBpbiBlYWNoIGJ5dGUKKyAgICAgICAgICAgYXJlIG9yZGVyZWQgbG93LWJpdC1maXJzdC4gIEEgY2hhcmFjdGVyIGlzIGluIHRoZSBzZXQgaWYgaXRzCisgICAgICAgICAgIGJpdCBpcyAxLiAgQSBjaGFyYWN0ZXIgdG9vIGxhcmdlIHRvIGhhdmUgYSBiaXQgaW4gdGhlIG1hcCBpcworICAgICAgICAgICBhdXRvbWF0aWNhbGx5IG5vdCBpbiB0aGUgc2V0LiAgKi8KKyAgY2hhcnNldCwKKworICAgICAgICAvKiBTYW1lIHBhcmFtZXRlcnMgYXMgY2hhcnNldCwgYnV0IG1hdGNoIGFueSBjaGFyYWN0ZXIgdGhhdCBpcworICAgICAgICAgICBub3Qgb25lIG9mIHRob3NlIHNwZWNpZmllZC4gICovCisgIGNoYXJzZXRfbm90LAorCisgICAgICAgIC8qIFN0YXJ0IHJlbWVtYmVyaW5nIHRoZSB0ZXh0IHRoYXQgaXMgbWF0Y2hlZCwgZm9yIHN0b3JpbmcgaW4gYQorICAgICAgICAgICByZWdpc3Rlci4gIEZvbGxvd2VkIGJ5IG9uZSBieXRlIHdpdGggdGhlIHJlZ2lzdGVyIG51bWJlciwgaW4KKyAgICAgICAgICAgdGhlIHJhbmdlIDAgdG8gb25lIGxlc3MgdGhhbiB0aGUgcGF0dGVybiBidWZmZXIncyByZV9uc3ViCisgICAgICAgICAgIGZpZWxkLiAgVGhlbiBmb2xsb3dlZCBieSBvbmUgYnl0ZSB3aXRoIHRoZSBudW1iZXIgb2YgZ3JvdXBzCisgICAgICAgICAgIGlubmVyIHRvIHRoaXMgb25lLiAgKFRoaXMgbGFzdCBoYXMgdG8gYmUgcGFydCBvZiB0aGUKKyAgICAgICAgICAgc3RhcnRfbWVtb3J5IG9ubHkgYmVjYXVzZSB3ZSBuZWVkIGl0IGluIHRoZSBvbl9mYWlsdXJlX2p1bXAKKyAgICAgICAgICAgb2YgcmVfbWF0Y2hfMi4pICAqLworICBzdGFydF9tZW1vcnksCisKKyAgICAgICAgLyogU3RvcCByZW1lbWJlcmluZyB0aGUgdGV4dCB0aGF0IGlzIG1hdGNoZWQgYW5kIHN0b3JlIGl0IGluIGEKKyAgICAgICAgICAgbWVtb3J5IHJlZ2lzdGVyLiAgRm9sbG93ZWQgYnkgb25lIGJ5dGUgd2l0aCB0aGUgcmVnaXN0ZXIKKyAgICAgICAgICAgbnVtYmVyLCBpbiB0aGUgcmFuZ2UgMCB0byBvbmUgbGVzcyB0aGFuIGByZV9uc3ViJyBpbiB0aGUKKyAgICAgICAgICAgcGF0dGVybiBidWZmZXIsIGFuZCBvbmUgYnl0ZSB3aXRoIHRoZSBudW1iZXIgb2YgaW5uZXIgZ3JvdXBzLAorICAgICAgICAgICBqdXN0IGxpa2UgYHN0YXJ0X21lbW9yeScuICAoV2UgbmVlZCB0aGUgbnVtYmVyIG9mIGlubmVyCisgICAgICAgICAgIGdyb3VwcyBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgZWFzeSB3YXkgb2YgZmluZGluZyB0aGUKKyAgICAgICAgICAgY29ycmVzcG9uZGluZyBzdGFydF9tZW1vcnkgd2hlbiB3ZSdyZSBhdCBhIHN0b3BfbWVtb3J5LikgICovCisgIHN0b3BfbWVtb3J5LAorCisgICAgICAgIC8qIE1hdGNoIGEgZHVwbGljYXRlIG9mIHNvbWV0aGluZyByZW1lbWJlcmVkLiBGb2xsb3dlZCBieSBvbmUKKyAgICAgICAgICAgYnl0ZSBjb250YWluaW5nIHRoZSByZWdpc3RlciBudW1iZXIuICAqLworICBkdXBsaWNhdGUsCisKKyAgICAgICAgLyogRmFpbCB1bmxlc3MgYXQgYmVnaW5uaW5nIG9mIGxpbmUuICAqLworICBiZWdsaW5lLAorCisgICAgICAgIC8qIEZhaWwgdW5sZXNzIGF0IGVuZCBvZiBsaW5lLiAgKi8KKyAgZW5kbGluZSwKKworICAgICAgICAvKiBTdWNjZWVkcyBpZiBhdCBiZWdpbm5pbmcgb2YgYnVmZmVyIChpZiBlbWFjcykgb3IgYXQgYmVnaW5uaW5nCisgICAgICAgICAgIG9mIHN0cmluZyB0byBiZSBtYXRjaGVkIChpZiBub3QpLiAgKi8KKyAgYmVnYnVmLAorCisgICAgICAgIC8qIEFuYWxvZ291c2x5LCBmb3IgZW5kIG9mIGJ1ZmZlci9zdHJpbmcuICAqLworICBlbmRidWYsCisKKyAgICAgICAgLyogRm9sbG93ZWQgYnkgdHdvIGJ5dGUgcmVsYXRpdmUgYWRkcmVzcyB0byB3aGljaCB0byBqdW1wLiAgKi8KKyAganVtcCwKKworCS8qIFNhbWUgYXMganVtcCwgYnV0IG1hcmtzIHRoZSBlbmQgb2YgYW4gYWx0ZXJuYXRpdmUuICAqLworICBqdW1wX3Bhc3RfYWx0LAorCisgICAgICAgIC8qIEZvbGxvd2VkIGJ5IHR3by1ieXRlIHJlbGF0aXZlIGFkZHJlc3Mgb2YgcGxhY2UgdG8gcmVzdW1lIGF0CisgICAgICAgICAgIGluIGNhc2Ugb2YgZmFpbHVyZS4gICovCisgIG9uX2ZhaWx1cmVfanVtcCwKKworICAgICAgICAvKiBMaWtlIG9uX2ZhaWx1cmVfanVtcCwgYnV0IHB1c2hlcyBhIHBsYWNlaG9sZGVyIGluc3RlYWQgb2YgdGhlCisgICAgICAgICAgIGN1cnJlbnQgc3RyaW5nIHBvc2l0aW9uIHdoZW4gZXhlY3V0ZWQuICAqLworICBvbl9mYWlsdXJlX2tlZXBfc3RyaW5nX2p1bXAsCisKKyAgICAgICAgLyogVGhyb3cgYXdheSBsYXRlc3QgZmFpbHVyZSBwb2ludCBhbmQgdGhlbiBqdW1wIHRvIGZvbGxvd2luZworICAgICAgICAgICB0d28tYnl0ZSByZWxhdGl2ZSBhZGRyZXNzLiAgKi8KKyAgcG9wX2ZhaWx1cmVfanVtcCwKKworICAgICAgICAvKiBDaGFuZ2UgdG8gcG9wX2ZhaWx1cmVfanVtcCBpZiBrbm93IHdvbid0IGhhdmUgdG8gYmFja3RyYWNrIHRvCisgICAgICAgICAgIG1hdGNoOyBvdGhlcndpc2UgY2hhbmdlIHRvIGp1bXAuICBUaGlzIGlzIHVzZWQgdG8ganVtcAorICAgICAgICAgICBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSByZXBlYXQuICBJZiB3aGF0IGZvbGxvd3MgdGhpcyBqdW1wCisgICAgICAgICAgIGNsZWFybHkgd29uJ3QgbWF0Y2ggd2hhdCB0aGUgcmVwZWF0IGRvZXMsIHN1Y2ggdGhhdCB3ZSBjYW4gYmUKKyAgICAgICAgICAgc3VyZSB0aGF0IHRoZXJlIGlzIG5vIHVzZSBiYWNrdHJhY2tpbmcgb3V0IG9mIHJlcGV0aXRpb25zCisgICAgICAgICAgIGFscmVhZHkgbWF0Y2hlZCwgdGhlbiB3ZSBjaGFuZ2UgaXQgdG8gYSBwb3BfZmFpbHVyZV9qdW1wLgorICAgICAgICAgICBGb2xsb3dlZCBieSB0d28tYnl0ZSBhZGRyZXNzLiAgKi8KKyAgbWF5YmVfcG9wX2p1bXAsCisKKyAgICAgICAgLyogSnVtcCB0byBmb2xsb3dpbmcgdHdvLWJ5dGUgYWRkcmVzcywgYW5kIHB1c2ggYSBkdW1teSBmYWlsdXJlCisgICAgICAgICAgIHBvaW50LiBUaGlzIGZhaWx1cmUgcG9pbnQgd2lsbCBiZSB0aHJvd24gYXdheSBpZiBhbiBhdHRlbXB0CisgICAgICAgICAgIGlzIG1hZGUgdG8gdXNlIGl0IGZvciBhIGZhaWx1cmUuICBBIGArJyBjb25zdHJ1Y3QgbWFrZXMgdGhpcworICAgICAgICAgICBiZWZvcmUgdGhlIGZpcnN0IHJlcGVhdC4gIEFsc28gdXNlZCBhcyBhbiBpbnRlcm1lZGlhcnkga2luZAorICAgICAgICAgICBvZiBqdW1wIHdoZW4gY29tcGlsaW5nIGFuIGFsdGVybmF0aXZlLiAgKi8KKyAgZHVtbXlfZmFpbHVyZV9qdW1wLAorCisJLyogUHVzaCBhIGR1bW15IGZhaWx1cmUgcG9pbnQgYW5kIGNvbnRpbnVlLiAgVXNlZCBhdCB0aGUgZW5kIG9mCisJICAgYWx0ZXJuYXRpdmVzLiAgKi8KKyAgcHVzaF9kdW1teV9mYWlsdXJlLAorCisgICAgICAgIC8qIEZvbGxvd2VkIGJ5IHR3by1ieXRlIHJlbGF0aXZlIGFkZHJlc3MgYW5kIHR3by1ieXRlIG51bWJlciBuLgorICAgICAgICAgICBBZnRlciBtYXRjaGluZyBOIHRpbWVzLCBqdW1wIHRvIHRoZSBhZGRyZXNzIHVwb24gZmFpbHVyZS4gICovCisgIHN1Y2NlZWRfbiwKKworICAgICAgICAvKiBGb2xsb3dlZCBieSB0d28tYnl0ZSByZWxhdGl2ZSBhZGRyZXNzLCBhbmQgdHdvLWJ5dGUgbnVtYmVyIG4uCisgICAgICAgICAgIEp1bXAgdG8gdGhlIGFkZHJlc3MgTiB0aW1lcywgdGhlbiBmYWlsLiAgKi8KKyAganVtcF9uLAorCisgICAgICAgIC8qIFNldCB0aGUgZm9sbG93aW5nIHR3by1ieXRlIHJlbGF0aXZlIGFkZHJlc3MgdG8gdGhlCisgICAgICAgICAgIHN1YnNlcXVlbnQgdHdvLWJ5dGUgbnVtYmVyLiAgVGhlIGFkZHJlc3MgKmluY2x1ZGVzKiB0aGUgdHdvCisgICAgICAgICAgIGJ5dGVzIG9mIG51bWJlci4gICovCisgIHNldF9udW1iZXJfYXQsCisKKyAgd29yZGNoYXIsCS8qIE1hdGNoZXMgYW55IHdvcmQtY29uc3RpdHVlbnQgY2hhcmFjdGVyLiAgKi8KKyAgbm90d29yZGNoYXIsCS8qIE1hdGNoZXMgYW55IGNoYXIgdGhhdCBpcyBub3QgYSB3b3JkLWNvbnN0aXR1ZW50LiAgKi8KKworICB3b3JkYmVnLAkvKiBTdWNjZWVkcyBpZiBhdCB3b3JkIGJlZ2lubmluZy4gICovCisgIHdvcmRlbmQsCS8qIFN1Y2NlZWRzIGlmIGF0IHdvcmQgZW5kLiAgKi8KKworICB3b3JkYm91bmQsCS8qIFN1Y2NlZWRzIGlmIGF0IGEgd29yZCBib3VuZGFyeS4gICovCisgIG5vdHdvcmRib3VuZAkvKiBTdWNjZWVkcyBpZiBub3QgYXQgYSB3b3JkIGJvdW5kYXJ5LiAgKi8KKworI2lmZGVmIGVtYWNzCisgICxiZWZvcmVfZG90LAkvKiBTdWNjZWVkcyBpZiBiZWZvcmUgcG9pbnQuICAqLworICBhdF9kb3QsCS8qIFN1Y2NlZWRzIGlmIGF0IHBvaW50LiAgKi8KKyAgYWZ0ZXJfZG90LAkvKiBTdWNjZWVkcyBpZiBhZnRlciBwb2ludC4gICovCisKKwkvKiBNYXRjaGVzIGFueSBjaGFyYWN0ZXIgd2hvc2Ugc3ludGF4IGlzIHNwZWNpZmllZC4gIEZvbGxvd2VkIGJ5CisgICAgICAgICAgIGEgYnl0ZSB3aGljaCBjb250YWlucyBhIHN5bnRheCBjb2RlLCBlLmcuLCBTd29yZC4gICovCisgIHN5bnRheHNwZWMsCisKKwkvKiBNYXRjaGVzIGFueSBjaGFyYWN0ZXIgd2hvc2Ugc3ludGF4IGlzIG5vdCB0aGF0IHNwZWNpZmllZC4gICovCisgIG5vdHN5bnRheHNwZWMKKyNlbmRpZiAvKiBlbWFjcyAqLworfSByZV9vcGNvZGVfdDsKKwwKKy8qIENvbW1vbiBvcGVyYXRpb25zIG9uIHRoZSBjb21waWxlZCBwYXR0ZXJuLiAgKi8KKworLyogU3RvcmUgTlVNQkVSIGluIHR3byBjb250aWd1b3VzIGJ5dGVzIHN0YXJ0aW5nIGF0IERFU1RJTkFUSU9OLiAgKi8KKworI2RlZmluZSBTVE9SRV9OVU1CRVIoZGVzdGluYXRpb24sIG51bWJlcikJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIChkZXN0aW5hdGlvbilbMF0gPSAobnVtYmVyKSAmIDAzNzc7CQkJCQlcCisgICAgKGRlc3RpbmF0aW9uKVsxXSA9IChudW1iZXIpID4+IDg7CQkJCQlcCisgIH0gd2hpbGUgKDApCisKKy8qIFNhbWUgYXMgU1RPUkVfTlVNQkVSLCBleGNlcHQgaW5jcmVtZW50IERFU1RJTkFUSU9OIHRvCisgICB0aGUgYnl0ZSBhZnRlciB3aGVyZSB0aGUgbnVtYmVyIGlzIHN0b3JlZC4gIFRoZXJlZm9yZSwgREVTVElOQVRJT04KKyAgIG11c3QgYmUgYW4gbHZhbHVlLiAgKi8KKworI2RlZmluZSBTVE9SRV9OVU1CRVJfQU5EX0lOQ1IoZGVzdGluYXRpb24sIG51bWJlcikJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgU1RPUkVfTlVNQkVSIChkZXN0aW5hdGlvbiwgbnVtYmVyKTsJCQkJCVwKKyAgICAoZGVzdGluYXRpb24pICs9IDI7CQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworLyogUHV0IGludG8gREVTVElOQVRJT04gYSBudW1iZXIgc3RvcmVkIGluIHR3byBjb250aWd1b3VzIGJ5dGVzIHN0YXJ0aW5nCisgICBhdCBTT1VSQ0UuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfTlVNQkVSKGRlc3RpbmF0aW9uLCBzb3VyY2UpCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICAoZGVzdGluYXRpb24pID0gKihzb3VyY2UpICYgMDM3NzsJCQkJCVwKKyAgICAoZGVzdGluYXRpb24pICs9IFNJR05fRVhURU5EX0NIQVIgKCooKHNvdXJjZSkgKyAxKSkgPDwgODsJCVwKKyAgfSB3aGlsZSAoMCkKKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBleHRyYWN0X251bWJlciBfUkVfQVJHUyAoKGludCAqZGVzdCwgdW5zaWduZWQgY2hhciAqc291cmNlKSk7CitzdGF0aWMgdm9pZAorZXh0cmFjdF9udW1iZXIgKGRlc3QsIHNvdXJjZSkKKyAgICBpbnQgKmRlc3Q7CisgICAgdW5zaWduZWQgY2hhciAqc291cmNlOworeworICBpbnQgdGVtcCA9IFNJR05fRVhURU5EX0NIQVIgKCooc291cmNlICsgMSkpOworICAqZGVzdCA9ICpzb3VyY2UgJiAwMzc3OworICAqZGVzdCArPSB0ZW1wIDw8IDg7Cit9CisKKyMgaWZuZGVmIEVYVFJBQ1RfTUFDUk9TIC8qIFRvIGRlYnVnIHRoZSBtYWNyb3MuICAqLworIyAgdW5kZWYgRVhUUkFDVF9OVU1CRVIKKyMgIGRlZmluZSBFWFRSQUNUX05VTUJFUihkZXN0LCBzcmMpIGV4dHJhY3RfbnVtYmVyICgmZGVzdCwgc3JjKQorIyBlbmRpZiAvKiBub3QgRVhUUkFDVF9NQUNST1MgKi8KKworI2VuZGlmIC8qIERFQlVHICovCisKKy8qIFNhbWUgYXMgRVhUUkFDVF9OVU1CRVIsIGV4Y2VwdCBpbmNyZW1lbnQgU09VUkNFIHRvIGFmdGVyIHRoZSBudW1iZXIuCisgICBTT1VSQ0UgbXVzdCBiZSBhbiBsdmFsdWUuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfTlVNQkVSX0FORF9JTkNSKGRlc3RpbmF0aW9uLCBzb3VyY2UpCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIEVYVFJBQ1RfTlVNQkVSIChkZXN0aW5hdGlvbiwgc291cmNlKTsJCQkJXAorICAgIChzb3VyY2UpICs9IDI7IAkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgZXh0cmFjdF9udW1iZXJfYW5kX2luY3IgX1JFX0FSR1MgKChpbnQgKmRlc3RpbmF0aW9uLAorCQkJCQkgICAgICAgdW5zaWduZWQgY2hhciAqKnNvdXJjZSkpOworc3RhdGljIHZvaWQKK2V4dHJhY3RfbnVtYmVyX2FuZF9pbmNyIChkZXN0aW5hdGlvbiwgc291cmNlKQorICAgIGludCAqZGVzdGluYXRpb247CisgICAgdW5zaWduZWQgY2hhciAqKnNvdXJjZTsKK3sKKyAgZXh0cmFjdF9udW1iZXIgKGRlc3RpbmF0aW9uLCAqc291cmNlKTsKKyAgKnNvdXJjZSArPSAyOworfQorCisjIGlmbmRlZiBFWFRSQUNUX01BQ1JPUworIyAgdW5kZWYgRVhUUkFDVF9OVU1CRVJfQU5EX0lOQ1IKKyMgIGRlZmluZSBFWFRSQUNUX05VTUJFUl9BTkRfSU5DUihkZXN0LCBzcmMpIFwKKyAgZXh0cmFjdF9udW1iZXJfYW5kX2luY3IgKCZkZXN0LCAmc3JjKQorIyBlbmRpZiAvKiBub3QgRVhUUkFDVF9NQUNST1MgKi8KKworI2VuZGlmIC8qIERFQlVHICovCisMCisvKiBJZiBERUJVRyBpcyBkZWZpbmVkLCBSZWdleCBwcmludHMgbWFueSB2b2x1bWlub3VzIG1lc3NhZ2VzIGFib3V0IHdoYXQKKyAgIGl0IGlzIGRvaW5nIChpZiB0aGUgdmFyaWFibGUgYGRlYnVnJyBpcyBub256ZXJvKS4gIElmIGxpbmtlZCB3aXRoIHRoZQorICAgbWFpbiBwcm9ncmFtIGluIGBpcmVnZXguYycsIHlvdSBjYW4gZW50ZXIgcGF0dGVybnMgYW5kIHN0cmluZ3MKKyAgIGludGVyYWN0aXZlbHkuICBBbmQgaWYgbGlua2VkIHdpdGggdGhlIG1haW4gcHJvZ3JhbSBpbiBgbWFpbi5jJyBhbmQKKyAgIHRoZSBvdGhlciB0ZXN0IGZpbGVzLCB5b3UgY2FuIHJ1biB0aGUgYWxyZWFkeS13cml0dGVuIHRlc3RzLiAgKi8KKworI2lmZGVmIERFQlVHCisKKy8qIFdlIHVzZSBzdGFuZGFyZCBJL08gZm9yIGRlYnVnZ2luZy4gICovCisjIGluY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIEl0IGlzIHVzZWZ1bCB0byB0ZXN0IHRoaW5ncyB0aGF0IGBgbXVzdCcnIGJlIHRydWUgd2hlbiBkZWJ1Z2dpbmcuICAqLworIyBpbmNsdWRlIDxhc3NlcnQuaD4KKworc3RhdGljIGludCBkZWJ1ZyA9IDA7CisKKyMgZGVmaW5lIERFQlVHX1NUQVRFTUVOVChlKSBlCisjIGRlZmluZSBERUJVR19QUklOVDEoeCkgaWYgKGRlYnVnKSBwcmludGYgKHgpCisjIGRlZmluZSBERUJVR19QUklOVDIoeDEsIHgyKSBpZiAoZGVidWcpIHByaW50ZiAoeDEsIHgyKQorIyBkZWZpbmUgREVCVUdfUFJJTlQzKHgxLCB4MiwgeDMpIGlmIChkZWJ1ZykgcHJpbnRmICh4MSwgeDIsIHgzKQorIyBkZWZpbmUgREVCVUdfUFJJTlQ0KHgxLCB4MiwgeDMsIHg0KSBpZiAoZGVidWcpIHByaW50ZiAoeDEsIHgyLCB4MywgeDQpCisjIGRlZmluZSBERUJVR19QUklOVF9DT01QSUxFRF9QQVRURVJOKHAsIHMsIGUpIAkJCQlcCisgIGlmIChkZWJ1ZykgcHJpbnRfcGFydGlhbF9jb21waWxlZF9wYXR0ZXJuIChzLCBlKQorIyBkZWZpbmUgREVCVUdfUFJJTlRfRE9VQkxFX1NUUklORyh3LCBzMSwgc3oxLCBzMiwgc3oyKQkJCVwKKyAgaWYgKGRlYnVnKSBwcmludF9kb3VibGVfc3RyaW5nICh3LCBzMSwgc3oxLCBzMiwgc3oyKQorCisKKy8qIFByaW50IHRoZSBmYXN0bWFwIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0uICAqLworCit2b2lkCitwcmludF9mYXN0bWFwIChmYXN0bWFwKQorICAgIGNoYXIgKmZhc3RtYXA7Cit7CisgIHVuc2lnbmVkIHdhc19hX3JhbmdlID0gMDsKKyAgdW5zaWduZWQgaSA9IDA7CisKKyAgd2hpbGUgKGkgPCAoMSA8PCBCWVRFV0lEVEgpKQorICAgIHsKKyAgICAgIGlmIChmYXN0bWFwW2krK10pCisJeworCSAgd2FzX2FfcmFuZ2UgPSAwOworICAgICAgICAgIHB1dGNoYXIgKGkgLSAxKTsKKyAgICAgICAgICB3aGlsZSAoaSA8ICgxIDw8IEJZVEVXSURUSCkgICYmICBmYXN0bWFwW2ldKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB3YXNfYV9yYW5nZSA9IDE7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKwkgIGlmICh3YXNfYV9yYW5nZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRmICgiLSIpOworICAgICAgICAgICAgICBwdXRjaGFyIChpIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIHB1dGNoYXIgKCdcbicpOworfQorCisKKy8qIFByaW50IGEgY29tcGlsZWQgcGF0dGVybiBzdHJpbmcgaW4gaHVtYW4tcmVhZGFibGUgZm9ybSwgc3RhcnRpbmcgYXQKKyAgIHRoZSBTVEFSVCBwb2ludGVyIGludG8gaXQgYW5kIGVuZGluZyBqdXN0IGJlZm9yZSB0aGUgcG9pbnRlciBFTkQuICAqLworCit2b2lkCitwcmludF9wYXJ0aWFsX2NvbXBpbGVkX3BhdHRlcm4gKHN0YXJ0LCBlbmQpCisgICAgdW5zaWduZWQgY2hhciAqc3RhcnQ7CisgICAgdW5zaWduZWQgY2hhciAqZW5kOworeworICBpbnQgbWNudCwgbWNudDI7CisgIHVuc2lnbmVkIGNoYXIgKnAxOworICB1bnNpZ25lZCBjaGFyICpwID0gc3RhcnQ7CisgIHVuc2lnbmVkIGNoYXIgKnBlbmQgPSBlbmQ7CisKKyAgaWYgKHN0YXJ0ID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiKG51bGwpXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogTG9vcCBvdmVyIHBhdHRlcm4gY29tbWFuZHMuICAqLworICB3aGlsZSAocCA8IHBlbmQpCisgICAgeworICAgICAgcHJpbnRmICgiJWQ6XHQiLCBwIC0gc3RhcnQpOworCisgICAgICBzd2l0Y2ggKChyZV9vcGNvZGVfdCkgKnArKykKKwl7CisgICAgICAgIGNhc2Ugbm9fb3A6CisgICAgICAgICAgcHJpbnRmICgiL25vX29wIik7CisgICAgICAgICAgYnJlYWs7CisKKwljYXNlIGV4YWN0bjoKKwkgIG1jbnQgPSAqcCsrOworICAgICAgICAgIHByaW50ZiAoIi9leGFjdG4vJWQiLCBtY250KTsKKyAgICAgICAgICBkbworCSAgICB7CisgICAgICAgICAgICAgIHB1dGNoYXIgKCcvJyk7CisJICAgICAgcHV0Y2hhciAoKnArKyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgd2hpbGUgKC0tbWNudCk7CisgICAgICAgICAgYnJlYWs7CisKKwljYXNlIHN0YXJ0X21lbW9yeToKKyAgICAgICAgICBtY250ID0gKnArKzsKKyAgICAgICAgICBwcmludGYgKCIvc3RhcnRfbWVtb3J5LyVkLyVkIiwgbWNudCwgKnArKyk7CisgICAgICAgICAgYnJlYWs7CisKKwljYXNlIHN0b3BfbWVtb3J5OgorICAgICAgICAgIG1jbnQgPSAqcCsrOworCSAgcHJpbnRmICgiL3N0b3BfbWVtb3J5LyVkLyVkIiwgbWNudCwgKnArKyk7CisgICAgICAgICAgYnJlYWs7CisKKwljYXNlIGR1cGxpY2F0ZToKKwkgIHByaW50ZiAoIi9kdXBsaWNhdGUvJWQiLCAqcCsrKTsKKwkgIGJyZWFrOworCisJY2FzZSBhbnljaGFyOgorCSAgcHJpbnRmICgiL2FueWNoYXIiKTsKKwkgIGJyZWFrOworCisJY2FzZSBjaGFyc2V0OgorICAgICAgICBjYXNlIGNoYXJzZXRfbm90OgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGludCBjLCBsYXN0ID0gLTEwMDsKKwkgICAgcmVnaXN0ZXIgaW50IGluX3JhbmdlID0gMDsKKworCSAgICBwcmludGYgKCIvY2hhcnNldCBbJXMiLAorCSAgICAgICAgICAgIChyZV9vcGNvZGVfdCkgKihwIC0gMSkgPT0gY2hhcnNldF9ub3QgPyAiXiIgOiAiIik7CisKKyAgICAgICAgICAgIGFzc2VydCAocCArICpwIDwgcGVuZCk7CisKKyAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCAyNTY7IGMrKykKKwkgICAgICBpZiAoYyAvIDggPCAqcAorCQkgICYmIChwWzEgKyAoYy84KV0gJiAoMSA8PCAoYyAlIDgpKSkpCisJCXsKKwkJICAvKiBBcmUgd2Ugc3RhcnRpbmcgYSByYW5nZT8gICovCisJCSAgaWYgKGxhc3QgKyAxID09IGMgJiYgISBpbl9yYW5nZSkKKwkJICAgIHsKKwkJICAgICAgcHV0Y2hhciAoJy0nKTsKKwkJICAgICAgaW5fcmFuZ2UgPSAxOworCQkgICAgfQorCQkgIC8qIEhhdmUgd2UgYnJva2VuIGEgcmFuZ2U/ICAqLworCQkgIGVsc2UgaWYgKGxhc3QgKyAxICE9IGMgJiYgaW5fcmFuZ2UpCisgICAgICAgICAgICAgIHsKKwkJICAgICAgcHV0Y2hhciAobGFzdCk7CisJCSAgICAgIGluX3JhbmdlID0gMDsKKwkJICAgIH0KKworCQkgIGlmICghIGluX3JhbmdlKQorCQkgICAgcHV0Y2hhciAoYyk7CisKKwkJICBsYXN0ID0gYzsKKyAgICAgICAgICAgICAgfQorCisJICAgIGlmIChpbl9yYW5nZSkKKwkgICAgICBwdXRjaGFyIChsYXN0KTsKKworCSAgICBwdXRjaGFyICgnXScpOworCisJICAgIHAgKz0gMSArICpwOworCSAgfQorCSAgYnJlYWs7CisKKwljYXNlIGJlZ2xpbmU6CisJICBwcmludGYgKCIvYmVnbGluZSIpOworICAgICAgICAgIGJyZWFrOworCisJY2FzZSBlbmRsaW5lOgorICAgICAgICAgIHByaW50ZiAoIi9lbmRsaW5lIik7CisgICAgICAgICAgYnJlYWs7CisKKwljYXNlIG9uX2ZhaWx1cmVfanVtcDoKKyAgICAgICAgICBleHRyYWN0X251bWJlcl9hbmRfaW5jciAoJm1jbnQsICZwKTsKKyAgCSAgcHJpbnRmICgiL29uX2ZhaWx1cmVfanVtcCB0byAlZCIsIHAgKyBtY250IC0gc3RhcnQpOworICAgICAgICAgIGJyZWFrOworCisJY2FzZSBvbl9mYWlsdXJlX2tlZXBfc3RyaW5nX2p1bXA6CisgICAgICAgICAgZXh0cmFjdF9udW1iZXJfYW5kX2luY3IgKCZtY250LCAmcCk7CisgIAkgIHByaW50ZiAoIi9vbl9mYWlsdXJlX2tlZXBfc3RyaW5nX2p1bXAgdG8gJWQiLCBwICsgbWNudCAtIHN0YXJ0KTsKKyAgICAgICAgICBicmVhazsKKworCWNhc2UgZHVtbXlfZmFpbHVyZV9qdW1wOgorICAgICAgICAgIGV4dHJhY3RfbnVtYmVyX2FuZF9pbmNyICgmbWNudCwgJnApOworICAJICBwcmludGYgKCIvZHVtbXlfZmFpbHVyZV9qdW1wIHRvICVkIiwgcCArIG1jbnQgLSBzdGFydCk7CisgICAgICAgICAgYnJlYWs7CisKKwljYXNlIHB1c2hfZHVtbXlfZmFpbHVyZToKKyAgICAgICAgICBwcmludGYgKCIvcHVzaF9kdW1teV9mYWlsdXJlIik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBtYXliZV9wb3BfanVtcDoKKyAgICAgICAgICBleHRyYWN0X251bWJlcl9hbmRfaW5jciAoJm1jbnQsICZwKTsKKyAgCSAgcHJpbnRmICgiL21heWJlX3BvcF9qdW1wIHRvICVkIiwgcCArIG1jbnQgLSBzdGFydCk7CisJICBicmVhazsKKworICAgICAgICBjYXNlIHBvcF9mYWlsdXJlX2p1bXA6CisJICBleHRyYWN0X251bWJlcl9hbmRfaW5jciAoJm1jbnQsICZwKTsKKyAgCSAgcHJpbnRmICgiL3BvcF9mYWlsdXJlX2p1bXAgdG8gJWQiLCBwICsgbWNudCAtIHN0YXJ0KTsKKwkgIGJyZWFrOworCisgICAgICAgIGNhc2UganVtcF9wYXN0X2FsdDoKKwkgIGV4dHJhY3RfbnVtYmVyX2FuZF9pbmNyICgmbWNudCwgJnApOworICAJICBwcmludGYgKCIvanVtcF9wYXN0X2FsdCB0byAlZCIsIHAgKyBtY250IC0gc3RhcnQpOworCSAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBqdW1wOgorCSAgZXh0cmFjdF9udW1iZXJfYW5kX2luY3IgKCZtY250LCAmcCk7CisgIAkgIHByaW50ZiAoIi9qdW1wIHRvICVkIiwgcCArIG1jbnQgLSBzdGFydCk7CisJICBicmVhazsKKworICAgICAgICBjYXNlIHN1Y2NlZWRfbjoKKyAgICAgICAgICBleHRyYWN0X251bWJlcl9hbmRfaW5jciAoJm1jbnQsICZwKTsKKwkgIHAxID0gcCArIG1jbnQ7CisgICAgICAgICAgZXh0cmFjdF9udW1iZXJfYW5kX2luY3IgKCZtY250MiwgJnApOworCSAgcHJpbnRmICgiL3N1Y2NlZWRfbiB0byAlZCwgJWQgdGltZXMiLCBwMSAtIHN0YXJ0LCBtY250Mik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBqdW1wX246CisgICAgICAgICAgZXh0cmFjdF9udW1iZXJfYW5kX2luY3IgKCZtY250LCAmcCk7CisJICBwMSA9IHAgKyBtY250OworICAgICAgICAgIGV4dHJhY3RfbnVtYmVyX2FuZF9pbmNyICgmbWNudDIsICZwKTsKKwkgIHByaW50ZiAoIi9qdW1wX24gdG8gJWQsICVkIHRpbWVzIiwgcDEgLSBzdGFydCwgbWNudDIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Ugc2V0X251bWJlcl9hdDoKKyAgICAgICAgICBleHRyYWN0X251bWJlcl9hbmRfaW5jciAoJm1jbnQsICZwKTsKKwkgIHAxID0gcCArIG1jbnQ7CisgICAgICAgICAgZXh0cmFjdF9udW1iZXJfYW5kX2luY3IgKCZtY250MiwgJnApOworCSAgcHJpbnRmICgiL3NldF9udW1iZXJfYXQgbG9jYXRpb24gJWQgdG8gJWQiLCBwMSAtIHN0YXJ0LCBtY250Mik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB3b3JkYm91bmQ6CisJICBwcmludGYgKCIvd29yZGJvdW5kIik7CisJICBicmVhazsKKworCWNhc2Ugbm90d29yZGJvdW5kOgorCSAgcHJpbnRmICgiL25vdHdvcmRib3VuZCIpOworICAgICAgICAgIGJyZWFrOworCisJY2FzZSB3b3JkYmVnOgorCSAgcHJpbnRmICgiL3dvcmRiZWciKTsKKwkgIGJyZWFrOworCisJY2FzZSB3b3JkZW5kOgorCSAgcHJpbnRmICgiL3dvcmRlbmQiKTsKKworIyBpZmRlZiBlbWFjcworCWNhc2UgYmVmb3JlX2RvdDoKKwkgIHByaW50ZiAoIi9iZWZvcmVfZG90Iik7CisgICAgICAgICAgYnJlYWs7CisKKwljYXNlIGF0X2RvdDoKKwkgIHByaW50ZiAoIi9hdF9kb3QiKTsKKyAgICAgICAgICBicmVhazsKKworCWNhc2UgYWZ0ZXJfZG90OgorCSAgcHJpbnRmICgiL2FmdGVyX2RvdCIpOworICAgICAgICAgIGJyZWFrOworCisJY2FzZSBzeW50YXhzcGVjOgorICAgICAgICAgIHByaW50ZiAoIi9zeW50YXhzcGVjIik7CisJICBtY250ID0gKnArKzsKKwkgIHByaW50ZiAoIi8lZCIsIG1jbnQpOworICAgICAgICAgIGJyZWFrOworCisJY2FzZSBub3RzeW50YXhzcGVjOgorICAgICAgICAgIHByaW50ZiAoIi9ub3RzeW50YXhzcGVjIik7CisJICBtY250ID0gKnArKzsKKwkgIHByaW50ZiAoIi8lZCIsIG1jbnQpOworCSAgYnJlYWs7CisjIGVuZGlmIC8qIGVtYWNzICovCisKKwljYXNlIHdvcmRjaGFyOgorCSAgcHJpbnRmICgiL3dvcmRjaGFyIik7CisgICAgICAgICAgYnJlYWs7CisKKwljYXNlIG5vdHdvcmRjaGFyOgorCSAgcHJpbnRmICgiL25vdHdvcmRjaGFyIik7CisgICAgICAgICAgYnJlYWs7CisKKwljYXNlIGJlZ2J1ZjoKKwkgIHByaW50ZiAoIi9iZWdidWYiKTsKKyAgICAgICAgICBicmVhazsKKworCWNhc2UgZW5kYnVmOgorCSAgcHJpbnRmICgiL2VuZGJ1ZiIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcHJpbnRmICgiPyVkIiwgKihwLTEpKTsKKwl9CisKKyAgICAgIHB1dGNoYXIgKCdcbicpOworICAgIH0KKworICBwcmludGYgKCIlZDpcdGVuZCBvZiBwYXR0ZXJuLlxuIiwgcCAtIHN0YXJ0KTsKK30KKworCit2b2lkCitwcmludF9jb21waWxlZF9wYXR0ZXJuIChidWZwKQorICAgIHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqYnVmcDsKK3sKKyAgdW5zaWduZWQgY2hhciAqYnVmZmVyID0gYnVmcC0+YnVmZmVyOworCisgIHByaW50X3BhcnRpYWxfY29tcGlsZWRfcGF0dGVybiAoYnVmZmVyLCBidWZmZXIgKyBidWZwLT51c2VkKTsKKyAgcHJpbnRmICgiJWxkIGJ5dGVzIHVzZWQvJWxkIGJ5dGVzIGFsbG9jYXRlZC5cbiIsCisJICBidWZwLT51c2VkLCBidWZwLT5hbGxvY2F0ZWQpOworCisgIGlmIChidWZwLT5mYXN0bWFwX2FjY3VyYXRlICYmIGJ1ZnAtPmZhc3RtYXApCisgICAgeworICAgICAgcHJpbnRmICgiZmFzdG1hcDogIik7CisgICAgICBwcmludF9mYXN0bWFwIChidWZwLT5mYXN0bWFwKTsKKyAgICB9CisKKyAgcHJpbnRmICgicmVfbnN1YjogJWRcdCIsIGJ1ZnAtPnJlX25zdWIpOworICBwcmludGYgKCJyZWdzX2FsbG9jOiAlZFx0IiwgYnVmcC0+cmVnc19hbGxvY2F0ZWQpOworICBwcmludGYgKCJjYW5fYmVfbnVsbDogJWRcdCIsIGJ1ZnAtPmNhbl9iZV9udWxsKTsKKyAgcHJpbnRmICgibmV3bGluZV9hbmNob3I6ICVkXG4iLCBidWZwLT5uZXdsaW5lX2FuY2hvcik7CisgIHByaW50ZiAoIm5vX3N1YjogJWRcdCIsIGJ1ZnAtPm5vX3N1Yik7CisgIHByaW50ZiAoIm5vdF9ib2w6ICVkXHQiLCBidWZwLT5ub3RfYm9sKTsKKyAgcHJpbnRmICgibm90X2VvbDogJWRcdCIsIGJ1ZnAtPm5vdF9lb2wpOworICBwcmludGYgKCJzeW50YXg6ICVseFxuIiwgYnVmcC0+c3ludGF4KTsKKyAgLyogUGVyaGFwcyB3ZSBzaG91bGQgcHJpbnQgdGhlIHRyYW5zbGF0ZSB0YWJsZT8gICovCit9CisKKwordm9pZAorcHJpbnRfZG91YmxlX3N0cmluZyAod2hlcmUsIHN0cmluZzEsIHNpemUxLCBzdHJpbmcyLCBzaXplMikKKyAgICBjb25zdCBjaGFyICp3aGVyZTsKKyAgICBjb25zdCBjaGFyICpzdHJpbmcxOworICAgIGNvbnN0IGNoYXIgKnN0cmluZzI7CisgICAgaW50IHNpemUxOworICAgIGludCBzaXplMjsKK3sKKyAgaW50IHRoaXNfY2hhcjsKKworICBpZiAod2hlcmUgPT0gTlVMTCkKKyAgICBwcmludGYgKCIobnVsbCkiKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChGSVJTVF9TVFJJTkdfUCAod2hlcmUpKQorICAgICAgICB7CisgICAgICAgICAgZm9yICh0aGlzX2NoYXIgPSB3aGVyZSAtIHN0cmluZzE7IHRoaXNfY2hhciA8IHNpemUxOyB0aGlzX2NoYXIrKykKKyAgICAgICAgICAgIHB1dGNoYXIgKHN0cmluZzFbdGhpc19jaGFyXSk7CisKKyAgICAgICAgICB3aGVyZSA9IHN0cmluZzI7CisgICAgICAgIH0KKworICAgICAgZm9yICh0aGlzX2NoYXIgPSB3aGVyZSAtIHN0cmluZzI7IHRoaXNfY2hhciA8IHNpemUyOyB0aGlzX2NoYXIrKykKKyAgICAgICAgcHV0Y2hhciAoc3RyaW5nMlt0aGlzX2NoYXJdKTsKKyAgICB9Cit9CisKK3ZvaWQKK3ByaW50Y2hhciAoYykKKyAgICAgaW50IGM7Cit7CisgIHB1dGMgKGMsIHN0ZGVycik7Cit9CisKKyNlbHNlIC8qIG5vdCBERUJVRyAqLworCisjIHVuZGVmIGFzc2VydAorIyBkZWZpbmUgYXNzZXJ0KGUpCisKKyMgZGVmaW5lIERFQlVHX1NUQVRFTUVOVChlKQorIyBkZWZpbmUgREVCVUdfUFJJTlQxKHgpCisjIGRlZmluZSBERUJVR19QUklOVDIoeDEsIHgyKQorIyBkZWZpbmUgREVCVUdfUFJJTlQzKHgxLCB4MiwgeDMpCisjIGRlZmluZSBERUJVR19QUklOVDQoeDEsIHgyLCB4MywgeDQpCisjIGRlZmluZSBERUJVR19QUklOVF9DT01QSUxFRF9QQVRURVJOKHAsIHMsIGUpCisjIGRlZmluZSBERUJVR19QUklOVF9ET1VCTEVfU1RSSU5HKHcsIHMxLCBzejEsIHMyLCBzejIpCisKKyNlbmRpZiAvKiBub3QgREVCVUcgKi8KKwwKKy8qIFNldCBieSBgcmVfc2V0X3N5bnRheCcgdG8gdGhlIGN1cnJlbnQgcmVnZXhwIHN5bnRheCB0byByZWNvZ25pemUuICBDYW4KKyAgIGFsc28gYmUgYXNzaWduZWQgdG8gYXJiaXRyYXJpbHk6IGVhY2ggcGF0dGVybiBidWZmZXIgc3RvcmVzIGl0cyBvd24KKyAgIHN5bnRheCwgc28gaXQgY2FuIGJlIGNoYW5nZWQgYmV0d2VlbiByZWdleCBjb21waWxhdGlvbnMuICAqLworLyogVGhpcyBoYXMgbm8gaW5pdGlhbGl6ZXIgYmVjYXVzZSBpbml0aWFsaXplZCB2YXJpYWJsZXMgaW4gRW1hY3MKKyAgIGJlY29tZSByZWFkLW9ubHkgYWZ0ZXIgZHVtcGluZy4gICovCityZWdfc3ludGF4X3QgcmVfc3ludGF4X29wdGlvbnM7CisKKworLyogU3BlY2lmeSB0aGUgcHJlY2lzZSBzeW50YXggb2YgcmVnZXhwcyBmb3IgY29tcGlsYXRpb24uICBUaGlzIHByb3ZpZGVzCisgICBmb3IgY29tcGF0aWJpbGl0eSBmb3IgdmFyaW91cyB1dGlsaXRpZXMgd2hpY2ggaGlzdG9yaWNhbGx5IGhhdmUKKyAgIGRpZmZlcmVudCwgaW5jb21wYXRpYmxlIHN5bnRheGVzLgorCisgICBUaGUgYXJndW1lbnQgU1lOVEFYIGlzIGEgYml0IG1hc2sgY29tcHJpc2VkIG9mIHRoZSB2YXJpb3VzIGJpdHMKKyAgIGRlZmluZWQgaW4gZ251LXJlZ2V4LmguICBXZSByZXR1cm4gdGhlIG9sZCBzeW50YXguICAqLworCityZWdfc3ludGF4X3QKK3JlX3NldF9zeW50YXggKHN5bnRheCkKKyAgICByZWdfc3ludGF4X3Qgc3ludGF4OworeworICByZWdfc3ludGF4X3QgcmV0ID0gcmVfc3ludGF4X29wdGlvbnM7CisKKyAgcmVfc3ludGF4X29wdGlvbnMgPSBzeW50YXg7CisjaWZkZWYgREVCVUcKKyAgaWYgKHN5bnRheCAmIFJFX0RFQlVHKQorICAgIGRlYnVnID0gMTsKKyAgZWxzZSBpZiAoZGVidWcpIC8qIHdhcyBvbiBidXQgbm93IGlzIG5vdCAqLworICAgIGRlYnVnID0gMDsKKyNlbmRpZiAvKiBERUJVRyAqLworICByZXR1cm4gcmV0OworfQorI2lmZGVmIF9MSUJDCit3ZWFrX2FsaWFzIChfX3JlX3NldF9zeW50YXgsIHJlX3NldF9zeW50YXgpCisjZW5kaWYKKwwKKy8qIFRoaXMgdGFibGUgZ2l2ZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgZWFjaCBvZiB0aGUgZXJyb3IgY29kZXMgbGlzdGVkCisgICBpbiBnbnUtcmVnZXguaC4gIE9idmlvdXNseSB0aGUgb3JkZXIgaGVyZSBoYXMgdG8gYmUgc2FtZSBhcyB0aGVyZS4KKyAgIFBPU0lYIGRvZXNuJ3QgcmVxdWlyZSB0aGF0IHdlIGRvIGFueXRoaW5nIGZvciBSRUdfTk9FUlJPUiwKKyAgIGJ1dCB3aHkgbm90IGJlIG5pY2U/ICAqLworCitzdGF0aWMgY29uc3QgY2hhciAqcmVfZXJyb3JfbXNnaWRbXSA9CisgIHsKKyAgICBnZXR0ZXh0X25vb3AgKCJTdWNjZXNzIiksCS8qIFJFR19OT0VSUk9SICovCisgICAgZ2V0dGV4dF9ub29wICgiTm8gbWF0Y2giKSwJLyogUkVHX05PTUFUQ0ggKi8KKyAgICBnZXR0ZXh0X25vb3AgKCJJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiIpLCAvKiBSRUdfQkFEUEFUICovCisgICAgZ2V0dGV4dF9ub29wICgiSW52YWxpZCBjb2xsYXRpb24gY2hhcmFjdGVyIiksIC8qIFJFR19FQ09MTEFURSAqLworICAgIGdldHRleHRfbm9vcCAoIkludmFsaWQgY2hhcmFjdGVyIGNsYXNzIG5hbWUiKSwgLyogUkVHX0VDVFlQRSAqLworICAgIGdldHRleHRfbm9vcCAoIlRyYWlsaW5nIGJhY2tzbGFzaCIpLCAvKiBSRUdfRUVTQ0FQRSAqLworICAgIGdldHRleHRfbm9vcCAoIkludmFsaWQgYmFjayByZWZlcmVuY2UiKSwgLyogUkVHX0VTVUJSRUcgKi8KKyAgICBnZXR0ZXh0X25vb3AgKCJVbm1hdGNoZWQgWyBvciBbXiIpLAkvKiBSRUdfRUJSQUNLICovCisgICAgZ2V0dGV4dF9ub29wICgiVW5tYXRjaGVkICggb3IgXFwoIiksIC8qIFJFR19FUEFSRU4gKi8KKyAgICBnZXR0ZXh0X25vb3AgKCJVbm1hdGNoZWQgXFx7IiksIC8qIFJFR19FQlJBQ0UgKi8KKyAgICBnZXR0ZXh0X25vb3AgKCJJbnZhbGlkIGNvbnRlbnQgb2YgXFx7XFx9IiksIC8qIFJFR19CQURCUiAqLworICAgIGdldHRleHRfbm9vcCAoIkludmFsaWQgcmFuZ2UgZW5kIiksCS8qIFJFR19FUkFOR0UgKi8KKyAgICBnZXR0ZXh0X25vb3AgKCJNZW1vcnkgZXhoYXVzdGVkIiksIC8qIFJFR19FU1BBQ0UgKi8KKyAgICBnZXR0ZXh0X25vb3AgKCJJbnZhbGlkIHByZWNlZGluZyByZWd1bGFyIGV4cHJlc3Npb24iKSwgLyogUkVHX0JBRFJQVCAqLworICAgIGdldHRleHRfbm9vcCAoIlByZW1hdHVyZSBlbmQgb2YgcmVndWxhciBleHByZXNzaW9uIiksIC8qIFJFR19FRU5EICovCisgICAgZ2V0dGV4dF9ub29wICgiUmVndWxhciBleHByZXNzaW9uIHRvbyBiaWciKSwgLyogUkVHX0VTSVpFICovCisgICAgZ2V0dGV4dF9ub29wICgiVW5tYXRjaGVkICkgb3IgXFwpIiksIC8qIFJFR19FUlBBUkVOICovCisgIH07CisMCisvKiBBdm9pZGluZyBhbGxvY2EgZHVyaW5nIG1hdGNoaW5nLCB0byBwbGFjYXRlIHJfYWxsb2MuICAqLworCisvKiBEZWZpbmUgTUFUQ0hfTUFZX0FMTE9DQVRFIHVubGVzcyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQorICAgc2VhcmNoaW5nIGFuZCBtYXRjaGluZyBmdW5jdGlvbnMgc2hvdWxkIG5vdCBjYWxsIGFsbG9jYS4gIE9uIHNvbWUKKyAgIHN5c3RlbXMsIGFsbG9jYSBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBtYWxsb2MsIGFuZCBpZiB3ZSdyZQorICAgdXNpbmcgdGhlIHJlbG9jYXRpbmcgYWxsb2NhdG9yIHJvdXRpbmVzLCB0aGVuIG1hbGxvYyBjb3VsZCBjYXVzZSBhCisgICByZWxvY2F0aW9uLCB3aGljaCBtaWdodCAoaWYgdGhlIHN0cmluZ3MgYmVpbmcgc2VhcmNoZWQgYXJlIGluIHRoZQorICAgcmFsbG9jIGhlYXApIHNoaWZ0IHRoZSBkYXRhIG91dCBmcm9tIHVuZGVybmVhdGggdGhlIHJlZ2V4cAorICAgcm91dGluZXMuCisKKyAgIEhlcmUncyBhbm90aGVyIHJlYXNvbiB0byBhdm9pZCBhbGxvY2F0aW9uOiBFbWFjcworICAgcHJvY2Vzc2VzIGlucHV0IGZyb20gWCBpbiBhIHNpZ25hbCBoYW5kbGVyOyBwcm9jZXNzaW5nIFggaW5wdXQgbWF5CisgICBjYWxsIG1hbGxvYzsgaWYgaW5wdXQgYXJyaXZlcyB3aGlsZSBhIG1hdGNoaW5nIHJvdXRpbmUgaXMgY2FsbGluZworICAgbWFsbG9jLCB0aGVuIHdlJ3JlIHNjcm9kLiAgQnV0IEVtYWNzIGNhbid0IGp1c3QgYmxvY2sgaW5wdXQgd2hpbGUKKyAgIGNhbGxpbmcgbWF0Y2hpbmcgcm91dGluZXM7IHRoZW4gd2UgZG9uJ3Qgbm90aWNlIGludGVycnVwdHMgd2hlbgorICAgdGhleSBjb21lIGluLiAgU28sIEVtYWNzIGJsb2NrcyBpbnB1dCBhcm91bmQgYWxsIHJlZ2V4cCBjYWxscworICAgZXhjZXB0IHRoZSBtYXRjaGluZyBjYWxscywgd2hpY2ggaXQgbGVhdmVzIHVucHJvdGVjdGVkLCBpbiB0aGUKKyAgIGZhaXRoIHRoYXQgdGhleSB3aWxsIG5vdCBtYWxsb2MuICAqLworCisvKiBOb3JtYWxseSwgdGhpcyBpcyBmaW5lLiAgKi8KKyNkZWZpbmUgTUFUQ0hfTUFZX0FMTE9DQVRFCisKKy8qIFdoZW4gdXNpbmcgR05VIEMsIHdlIGFyZSBub3QgUkVBTExZIHVzaW5nIHRoZSBDIGFsbG9jYSwgbm8gbWF0dGVyCisgICB3aGF0IGNvbmZpZy5oIG1heSBzYXkuICBTbyBkb24ndCB0YWtlIHByZWNhdXRpb25zIGZvciBpdC4gICovCisjaWZkZWYgX19HTlVDX18KKyMgdW5kZWYgQ19BTExPQ0EKKyNlbmRpZgorCisvKiBUaGUgbWF0Y2ggcm91dGluZXMgbWF5IG5vdCBhbGxvY2F0ZSBpZiAoMSkgdGhleSB3b3VsZCBkbyBpdCB3aXRoIG1hbGxvYworICAgYW5kICgyKSBpdCdzIG5vdCBzYWZlIGZvciB0aGVtIHRvIHVzZSBtYWxsb2MuCisgICBOb3RlIHRoYXQgaWYgUkVMX0FMTE9DIGlzIGRlZmluZWQsIG1hdGNoaW5nIHdvdWxkIG5vdCB1c2UgbWFsbG9jIGZvciB0aGUKKyAgIGZhaWx1cmUgc3RhY2ssIGJ1dCB3ZSB3b3VsZCBzdGlsbCB1c2UgaXQgZm9yIHRoZSByZWdpc3RlciB2ZWN0b3JzOworICAgc28gUkVMX0FMTE9DIHNob3VsZCBub3QgYWZmZWN0IHRoaXMuICAqLworI2lmIChkZWZpbmVkIENfQUxMT0NBIHx8IGRlZmluZWQgUkVHRVhfTUFMTE9DKSAmJiBkZWZpbmVkIGVtYWNzCisjIHVuZGVmIE1BVENIX01BWV9BTExPQ0FURQorI2VuZGlmCisKKwwKKy8qIEZhaWx1cmUgc3RhY2sgZGVjbGFyYXRpb25zIGFuZCBtYWNyb3M7IGJvdGggcmVfY29tcGlsZV9mYXN0bWFwIGFuZAorICAgcmVfbWF0Y2hfMiB1c2UgYSBmYWlsdXJlIHN0YWNrLiAgVGhlc2UgaGF2ZSB0byBiZSBtYWNyb3MgYmVjYXVzZSBvZgorICAgUkVHRVhfQUxMT0NBVEVfU1RBQ0suICAqLworCisKKy8qIE51bWJlciBvZiBmYWlsdXJlIHBvaW50cyBmb3Igd2hpY2ggdG8gaW5pdGlhbGx5IGFsbG9jYXRlIHNwYWNlCisgICB3aGVuIG1hdGNoaW5nLiAgSWYgdGhpcyBudW1iZXIgaXMgZXhjZWVkZWQsIHdlIGFsbG9jYXRlIG1vcmUKKyAgIHNwYWNlLCBzbyBpdCBpcyBub3QgYSBoYXJkIGxpbWl0LiAgKi8KKyNpZm5kZWYgSU5JVF9GQUlMVVJFX0FMTE9DCisjIGRlZmluZSBJTklUX0ZBSUxVUkVfQUxMT0MgNQorI2VuZGlmCisKKy8qIFJvdWdobHkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZhaWx1cmUgcG9pbnRzIG9uIHRoZSBzdGFjay4gIFdvdWxkIGJlCisgICBleGFjdGx5IHRoYXQgaWYgYWx3YXlzIHVzZWQgTUFYX0ZBSUxVUkVfSVRFTVMgaXRlbXMgZWFjaCB0aW1lIHdlIGZhaWxlZC4KKyAgIFRoaXMgaXMgYSB2YXJpYWJsZSBvbmx5IHNvIHVzZXJzIG9mIHJlZ2V4IGNhbiBhc3NpZ24gdG8gaXQ7IHdlIG5ldmVyCisgICBjaGFuZ2UgaXQgb3Vyc2VsdmVzLiAgKi8KKworI2lmZGVmIElOVF9JU18xNkJJVAorCisjIGlmIGRlZmluZWQgTUFUQ0hfTUFZX0FMTE9DQVRFCisvKiA0NDAwIHdhcyBlbm91Z2ggdG8gY2F1c2UgYSBjcmFzaCBvbiBBbHBoYSBPU0YvMSwKKyAgIHdob3NlIGRlZmF1bHQgc3RhY2sgbGltaXQgaXMgMm1iLiAgKi8KK2xvbmcgaW50IHJlX21heF9mYWlsdXJlcyA9IDQwMDA7CisjIGVsc2UKK2xvbmcgaW50IHJlX21heF9mYWlsdXJlcyA9IDIwMDA7CisjIGVuZGlmCisKK3VuaW9uIGZhaWxfc3RhY2tfZWx0Cit7CisgIHVuc2lnbmVkIGNoYXIgKnBvaW50ZXI7CisgIGxvbmcgaW50IGludGVnZXI7Cit9OworCit0eXBlZGVmIHVuaW9uIGZhaWxfc3RhY2tfZWx0IGZhaWxfc3RhY2tfZWx0X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGZhaWxfc3RhY2tfZWx0X3QgKnN0YWNrOworICB1bnNpZ25lZCBsb25nIGludCBzaXplOworICB1bnNpZ25lZCBsb25nIGludCBhdmFpbDsJCS8qIE9mZnNldCBvZiBuZXh0IG9wZW4gcG9zaXRpb24uICAqLworfSBmYWlsX3N0YWNrX3R5cGU7CisKKyNlbHNlIC8qIG5vdCBJTlRfSVNfMTZCSVQgKi8KKworIyBpZiBkZWZpbmVkIE1BVENIX01BWV9BTExPQ0FURQorLyogNDQwMCB3YXMgZW5vdWdoIHRvIGNhdXNlIGEgY3Jhc2ggb24gQWxwaGEgT1NGLzEsCisgICB3aG9zZSBkZWZhdWx0IHN0YWNrIGxpbWl0IGlzIDJtYi4gICovCitpbnQgcmVfbWF4X2ZhaWx1cmVzID0gMjAwMDA7CisjIGVsc2UKK2ludCByZV9tYXhfZmFpbHVyZXMgPSAyMDAwOworIyBlbmRpZgorCit1bmlvbiBmYWlsX3N0YWNrX2VsdAoreworICB1bnNpZ25lZCBjaGFyICpwb2ludGVyOworICBpbnQgaW50ZWdlcjsKK307CisKK3R5cGVkZWYgdW5pb24gZmFpbF9zdGFja19lbHQgZmFpbF9zdGFja19lbHRfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZmFpbF9zdGFja19lbHRfdCAqc3RhY2s7CisgIHVuc2lnbmVkIHNpemU7CisgIHVuc2lnbmVkIGF2YWlsOwkJCS8qIE9mZnNldCBvZiBuZXh0IG9wZW4gcG9zaXRpb24uICAqLworfSBmYWlsX3N0YWNrX3R5cGU7CisKKyNlbmRpZiAvKiBJTlRfSVNfMTZCSVQgKi8KKworI2RlZmluZSBGQUlMX1NUQUNLX0VNUFRZKCkgICAgIChmYWlsX3N0YWNrLmF2YWlsID09IDApCisjZGVmaW5lIEZBSUxfU1RBQ0tfUFRSX0VNUFRZKCkgKGZhaWxfc3RhY2tfcHRyLT5hdmFpbCA9PSAwKQorI2RlZmluZSBGQUlMX1NUQUNLX0ZVTEwoKSAgICAgIChmYWlsX3N0YWNrLmF2YWlsID09IGZhaWxfc3RhY2suc2l6ZSkKKworCisvKiBEZWZpbmUgbWFjcm9zIHRvIGluaXRpYWxpemUgYW5kIGZyZWUgdGhlIGZhaWx1cmUgc3RhY2suCisgICBEbyBgcmV0dXJuIC0yJyBpZiB0aGUgYWxsb2MgZmFpbHMuICAqLworCisjaWZkZWYgTUFUQ0hfTUFZX0FMTE9DQVRFCisjIGRlZmluZSBJTklUX0ZBSUxfU1RBQ0soKQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBmYWlsX3N0YWNrLnN0YWNrID0gKGZhaWxfc3RhY2tfZWx0X3QgKikJCQkJXAorICAgICAgUkVHRVhfQUxMT0NBVEVfU1RBQ0sgKElOSVRfRkFJTFVSRV9BTExPQyAqIHNpemVvZiAoZmFpbF9zdGFja19lbHRfdCkpOyBcCisJCQkJCQkJCQlcCisgICAgaWYgKGZhaWxfc3RhY2suc3RhY2sgPT0gTlVMTCkJCQkJCVwKKyAgICAgIHJldHVybiAtMjsJCQkJCQkJXAorCQkJCQkJCQkJXAorICAgIGZhaWxfc3RhY2suc2l6ZSA9IElOSVRfRkFJTFVSRV9BTExPQzsJCQkJXAorICAgIGZhaWxfc3RhY2suYXZhaWwgPSAwOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworIyBkZWZpbmUgUkVTRVRfRkFJTF9TVEFDSygpICBSRUdFWF9GUkVFX1NUQUNLIChmYWlsX3N0YWNrLnN0YWNrKQorI2Vsc2UKKyMgZGVmaW5lIElOSVRfRkFJTF9TVEFDSygpCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGZhaWxfc3RhY2suYXZhaWwgPSAwOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworIyBkZWZpbmUgUkVTRVRfRkFJTF9TVEFDSygpCisjZW5kaWYKKworCisvKiBEb3VibGUgdGhlIHNpemUgb2YgRkFJTF9TVEFDSywgdXAgdG8gYXBwcm94aW1hdGVseSBgcmVfbWF4X2ZhaWx1cmVzJyBpdGVtcy4KKworICAgUmV0dXJuIDEgaWYgc3VjY2VlZHMsIGFuZCAwIGlmIGVpdGhlciByYW4gb3V0IG9mIG1lbW9yeQorICAgYWxsb2NhdGluZyBzcGFjZSBmb3IgaXQgb3IgaXQgd2FzIGFscmVhZHkgdG9vIGxhcmdlLgorCisgICBSRUdFWF9SRUFMTE9DQVRFX1NUQUNLIHJlcXVpcmVzIGBkZXN0aW5hdGlvbicgYmUgZGVjbGFyZWQuICAgKi8KKworI2RlZmluZSBET1VCTEVfRkFJTF9TVEFDSyhmYWlsX3N0YWNrKQkJCQkJXAorICAoKGZhaWxfc3RhY2spLnNpemUgPiAodW5zaWduZWQpIChyZV9tYXhfZmFpbHVyZXMgKiBNQVhfRkFJTFVSRV9JVEVNUykJXAorICAgPyAwCQkJCQkJCQkJXAorICAgOiAoKGZhaWxfc3RhY2spLnN0YWNrID0gKGZhaWxfc3RhY2tfZWx0X3QgKikJCQkJXAorICAgICAgICBSRUdFWF9SRUFMTE9DQVRFX1NUQUNLICgoZmFpbF9zdGFjaykuc3RhY2ssIAkJCVwKKyAgICAgICAgICAoZmFpbF9zdGFjaykuc2l6ZSAqIHNpemVvZiAoZmFpbF9zdGFja19lbHRfdCksCQlcCisgICAgICAgICAgKChmYWlsX3N0YWNrKS5zaXplIDw8IDEpICogc2l6ZW9mIChmYWlsX3N0YWNrX2VsdF90KSksCVwKKwkJCQkJCQkJCVwKKyAgICAgIChmYWlsX3N0YWNrKS5zdGFjayA9PSBOVUxMCQkJCQlcCisgICAgICA/IDAJCQkJCQkJCVwKKyAgICAgIDogKChmYWlsX3N0YWNrKS5zaXplIDw8PSAxLCAJCQkJCVwKKyAgICAgICAgIDEpKSkKKworCisvKiBQdXNoIHBvaW50ZXIgUE9JTlRFUiBvbiBGQUlMX1NUQUNLLgorICAgUmV0dXJuIDEgaWYgd2FzIGFibGUgdG8gZG8gc28gYW5kIDAgaWYgcmFuIG91dCBvZiBtZW1vcnkgYWxsb2NhdGluZworICAgc3BhY2UgdG8gZG8gc28uICAqLworI2RlZmluZSBQVVNIX1BBVFRFUk5fT1AoUE9JTlRFUiwgRkFJTF9TVEFDSykJCQkJXAorICAoKEZBSUxfU1RBQ0tfRlVMTCAoKQkJCQkJCQlcCisgICAgJiYgIURPVUJMRV9GQUlMX1NUQUNLIChGQUlMX1NUQUNLKSkJCQkJCVwKKyAgID8gMAkJCQkJCQkJCVwKKyAgIDogKChGQUlMX1NUQUNLKS5zdGFja1soRkFJTF9TVEFDSykuYXZhaWwrK10ucG9pbnRlciA9IFBPSU5URVIsCVwKKyAgICAgIDEpKQorCisvKiBQdXNoIGEgcG9pbnRlciB2YWx1ZSBvbnRvIHRoZSBmYWlsdXJlIHN0YWNrLgorICAgQXNzdW1lcyB0aGUgdmFyaWFibGUgYGZhaWxfc3RhY2snLiAgUHJvYmFibHkgc2hvdWxkIG9ubHkKKyAgIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBgUFVTSF9GQUlMVVJFX1BPSU5UJy4gICovCisjZGVmaW5lIFBVU0hfRkFJTFVSRV9QT0lOVEVSKGl0ZW0pCQkJCQlcCisgIGZhaWxfc3RhY2suc3RhY2tbZmFpbF9zdGFjay5hdmFpbCsrXS5wb2ludGVyID0gKHVuc2lnbmVkIGNoYXIgKikgKGl0ZW0pCisKKy8qIFRoaXMgcHVzaGVzIGFuIGludGVnZXItdmFsdWVkIGl0ZW0gb250byB0aGUgZmFpbHVyZSBzdGFjay4KKyAgIEFzc3VtZXMgdGhlIHZhcmlhYmxlIGBmYWlsX3N0YWNrJy4gIFByb2JhYmx5IHNob3VsZCBvbmx5CisgICBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYFBVU0hfRkFJTFVSRV9QT0lOVCcuICAqLworI2RlZmluZSBQVVNIX0ZBSUxVUkVfSU5UKGl0ZW0pCQkJCQlcCisgIGZhaWxfc3RhY2suc3RhY2tbZmFpbF9zdGFjay5hdmFpbCsrXS5pbnRlZ2VyID0gKGl0ZW0pCisKKy8qIFB1c2ggYSBmYWlsX3N0YWNrX2VsdF90IHZhbHVlIG9udG8gdGhlIGZhaWx1cmUgc3RhY2suCisgICBBc3N1bWVzIHRoZSB2YXJpYWJsZSBgZmFpbF9zdGFjaycuICBQcm9iYWJseSBzaG91bGQgb25seQorICAgYmUgY2FsbGVkIGZyb20gd2l0aGluIGBQVVNIX0ZBSUxVUkVfUE9JTlQnLiAgKi8KKyNkZWZpbmUgUFVTSF9GQUlMVVJFX0VMVChpdGVtKQkJCQkJXAorICBmYWlsX3N0YWNrLnN0YWNrW2ZhaWxfc3RhY2suYXZhaWwrK10gPSAgKGl0ZW0pCisKKy8qIFRoZXNlIHRocmVlIFBPUC4uLiBvcGVyYXRpb25zIGNvbXBsZW1lbnQgdGhlIHRocmVlIFBVU0guLi4gb3BlcmF0aW9ucy4KKyAgIEFsbCBhc3N1bWUgdGhhdCBgZmFpbF9zdGFjaycgaXMgbm9uZW1wdHkuICAqLworI2RlZmluZSBQT1BfRkFJTFVSRV9QT0lOVEVSKCkgZmFpbF9zdGFjay5zdGFja1stLWZhaWxfc3RhY2suYXZhaWxdLnBvaW50ZXIKKyNkZWZpbmUgUE9QX0ZBSUxVUkVfSU5UKCkgZmFpbF9zdGFjay5zdGFja1stLWZhaWxfc3RhY2suYXZhaWxdLmludGVnZXIKKyNkZWZpbmUgUE9QX0ZBSUxVUkVfRUxUKCkgZmFpbF9zdGFjay5zdGFja1stLWZhaWxfc3RhY2suYXZhaWxdCisKKy8qIFVzZWQgdG8gb21pdCBwdXNoaW5nIGZhaWx1cmUgcG9pbnQgaWQncyB3aGVuIHdlJ3JlIG5vdCBkZWJ1Z2dpbmcuICAqLworI2lmZGVmIERFQlVHCisjIGRlZmluZSBERUJVR19QVVNIIFBVU0hfRkFJTFVSRV9JTlQKKyMgZGVmaW5lIERFQlVHX1BPUChpdGVtX2FkZHIpICooaXRlbV9hZGRyKSA9IFBPUF9GQUlMVVJFX0lOVCAoKQorI2Vsc2UKKyMgZGVmaW5lIERFQlVHX1BVU0goaXRlbSkKKyMgZGVmaW5lIERFQlVHX1BPUChpdGVtX2FkZHIpCisjZW5kaWYKKworCisvKiBQdXNoIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGUgd2Ugd2lsbCBuZWVkCisgICBpZiB3ZSBldmVyIGZhaWwgYmFjayB0byBpdC4KKworICAgUmVxdWlyZXMgdmFyaWFibGVzIGZhaWxfc3RhY2ssIHJlZ3N0YXJ0LCByZWdlbmQsIHJlZ19pbmZvLCBhbmQKKyAgIG51bV9yZWdzX3B1c2hlZCBiZSBkZWNsYXJlZC4gIERPVUJMRV9GQUlMX1NUQUNLIHJlcXVpcmVzIGBkZXN0aW5hdGlvbicKKyAgIGJlIGRlY2xhcmVkLgorCisgICBEb2VzIGByZXR1cm4gRkFJTFVSRV9DT0RFJyBpZiBydW5zIG91dCBvZiBtZW1vcnkuICAqLworCisjZGVmaW5lIFBVU0hfRkFJTFVSRV9QT0lOVChwYXR0ZXJuX3BsYWNlLCBzdHJpbmdfcGxhY2UsIGZhaWx1cmVfY29kZSkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIGNoYXIgKmRlc3RpbmF0aW9uOwkJCQkJCQlcCisgICAgLyogTXVzdCBiZSBpbnQsIHNvIHdoZW4gd2UgZG9uJ3Qgc2F2ZSBhbnkgcmVnaXN0ZXJzLCB0aGUgYXJpdGhtZXRpYwlcCisgICAgICAgb2YgMCArIC0xIGlzbid0IGRvbmUgYXMgdW5zaWduZWQuICAqLwkJCQlcCisgICAgLyogQ2FuJ3QgYmUgaW50LCBzaW5jZSB0aGVyZSBpcyBub3QgYSBzaHJlZCBvZiBhIGd1YXJhbnRlZSB0aGF0IGludAlcCisgICAgICAgaXMgd2lkZSBlbm91Z2ggdG8gaG9sZCBhIHZhbHVlIG9mIHNvbWV0aGluZyB0byB3aGljaCBwb2ludGVyIGNhbglcCisgICAgICAgYmUgYXNzaWduZWQgKi8JCQkJCQkJXAorICAgIGFjdGl2ZV9yZWdfdCB0aGlzX3JlZzsJCQkJCQlcCisgICAgCQkJCQkJCQkJXAorICAgIERFQlVHX1NUQVRFTUVOVCAoZmFpbHVyZV9pZCsrKTsJCQkJCVwKKyAgICBERUJVR19TVEFURU1FTlQgKG5mYWlsdXJlX3BvaW50c19wdXNoZWQrKyk7CQkJCVwKKyAgICBERUJVR19QUklOVDIgKCJcblBVU0hfRkFJTFVSRV9QT0lOVCAjJXU6XG4iLCBmYWlsdXJlX2lkKTsJCVwKKyAgICBERUJVR19QUklOVDIgKCIgIEJlZm9yZSBwdXNoLCBuZXh0IGF2YWlsOiAlZFxuIiwgKGZhaWxfc3RhY2spLmF2YWlsKTtcCisgICAgREVCVUdfUFJJTlQyICgiICAgICAgICAgICAgICAgICAgICAgc2l6ZTogJWRcbiIsIChmYWlsX3N0YWNrKS5zaXplKTtcCisJCQkJCQkJCQlcCisgICAgREVCVUdfUFJJTlQyICgiICBzbG90cyBuZWVkZWQ6ICVsZFxuIiwgTlVNX0ZBSUxVUkVfSVRFTVMpOwkJXAorICAgIERFQlVHX1BSSU5UMiAoIiAgICAgYXZhaWxhYmxlOiAlZFxuIiwgUkVNQUlOSU5HX0FWQUlMX1NMT1RTKTsJXAorCQkJCQkJCQkJXAorICAgIC8qIEVuc3VyZSB3ZSBoYXZlIGVub3VnaCBzcGFjZSBhbGxvY2F0ZWQgZm9yIHdoYXQgd2Ugd2lsbCBwdXNoLiAgKi8JXAorICAgIHdoaWxlIChSRU1BSU5JTkdfQVZBSUxfU0xPVFMgPCBOVU1fRkFJTFVSRV9JVEVNUykJCQlcCisgICAgICB7CQkJCQkJCQkJXAorICAgICAgICBpZiAoIURPVUJMRV9GQUlMX1NUQUNLIChmYWlsX3N0YWNrKSkJCQkJXAorICAgICAgICAgIHJldHVybiBmYWlsdXJlX2NvZGU7CQkJCQkJXAorCQkJCQkJCQkJXAorICAgICAgICBERUJVR19QUklOVDIgKCJcbiAgRG91YmxlZCBzdGFjazsgc2l6ZSBub3c6ICVkXG4iLAkJXAorCQkgICAgICAgKGZhaWxfc3RhY2spLnNpemUpOwkJCQlcCisgICAgICAgIERFQlVHX1BSSU5UMiAoIiAgc2xvdHMgYXZhaWxhYmxlOiAlZFxuIiwgUkVNQUlOSU5HX0FWQUlMX1NMT1RTKTtcCisgICAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICAgIC8qIFB1c2ggdGhlIGluZm8sIHN0YXJ0aW5nIHdpdGggdGhlIHJlZ2lzdGVycy4gICovCQkJXAorICAgIERFQlVHX1BSSU5UMSAoIlxuIik7CQkJCQkJXAorCQkJCQkJCQkJXAorICAgIGlmICgxKQkJCQkJCQkJXAorICAgICAgZm9yICh0aGlzX3JlZyA9IGxvd2VzdF9hY3RpdmVfcmVnOyB0aGlzX3JlZyA8PSBoaWdoZXN0X2FjdGl2ZV9yZWc7IFwKKwkgICB0aGlzX3JlZysrKQkJCQkJCQlcCisJewkJCQkJCQkJXAorCSAgREVCVUdfUFJJTlQyICgiICBQdXNoaW5nIHJlZzogJWx1XG4iLCB0aGlzX3JlZyk7CQlcCisJICBERUJVR19TVEFURU1FTlQgKG51bV9yZWdzX3B1c2hlZCsrKTsJCQkJXAorCQkJCQkJCQkJXAorCSAgREVCVUdfUFJJTlQyICgiICAgIHN0YXJ0OiAlcFxuIiwgcmVnc3RhcnRbdGhpc19yZWddKTsJCVwKKwkgIFBVU0hfRkFJTFVSRV9QT0lOVEVSIChyZWdzdGFydFt0aGlzX3JlZ10pOwkJCVwKKwkJCQkJCQkJCVwKKwkgIERFQlVHX1BSSU5UMiAoIiAgICBlbmQ6ICVwXG4iLCByZWdlbmRbdGhpc19yZWddKTsJCVwKKwkgIFBVU0hfRkFJTFVSRV9QT0lOVEVSIChyZWdlbmRbdGhpc19yZWddKTsJCQlcCisJCQkJCQkJCQlcCisJICBERUJVR19QUklOVDIgKCIgICAgaW5mbzogJXBcbiAgICAgICIsCQkJCVwKKwkJCXJlZ19pbmZvW3RoaXNfcmVnXS53b3JkLnBvaW50ZXIpOwkJXAorCSAgREVCVUdfUFJJTlQyICgiIG1hdGNoX251bGw9JWQiLAkJCQlcCisJCQlSRUdfTUFUQ0hfTlVMTF9TVFJJTkdfUCAocmVnX2luZm9bdGhpc19yZWddKSk7CVwKKwkgIERFQlVHX1BSSU5UMiAoIiBhY3RpdmU9JWQiLCBJU19BQ1RJVkUgKHJlZ19pbmZvW3RoaXNfcmVnXSkpOwlcCisJICBERUJVR19QUklOVDIgKCIgbWF0Y2hlZF9zb21ldGhpbmc9JWQiLAkJCVwKKwkJCU1BVENIRURfU09NRVRISU5HIChyZWdfaW5mb1t0aGlzX3JlZ10pKTsJXAorCSAgREVCVUdfUFJJTlQyICgiIGV2ZXJfbWF0Y2hlZD0lZCIsCQkJCVwKKwkJCUVWRVJfTUFUQ0hFRF9TT01FVEhJTkcgKHJlZ19pbmZvW3RoaXNfcmVnXSkpOwlcCisJICBERUJVR19QUklOVDEgKCJcbiIpOwkJCQkJCVwKKwkgIFBVU0hfRkFJTFVSRV9FTFQgKHJlZ19pbmZvW3RoaXNfcmVnXS53b3JkKTsJCQlcCisJfQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICAgIERFQlVHX1BSSU5UMiAoIiAgUHVzaGluZyAgbG93IGFjdGl2ZSByZWc6ICVsZFxuIiwgbG93ZXN0X2FjdGl2ZV9yZWcpO1wKKyAgICBQVVNIX0ZBSUxVUkVfSU5UIChsb3dlc3RfYWN0aXZlX3JlZyk7CQkJCVwKKwkJCQkJCQkJCVwKKyAgICBERUJVR19QUklOVDIgKCIgIFB1c2hpbmcgaGlnaCBhY3RpdmUgcmVnOiAlbGRcbiIsIGhpZ2hlc3RfYWN0aXZlX3JlZyk7XAorICAgIFBVU0hfRkFJTFVSRV9JTlQgKGhpZ2hlc3RfYWN0aXZlX3JlZyk7CQkJCVwKKwkJCQkJCQkJCVwKKyAgICBERUJVR19QUklOVDIgKCIgIFB1c2hpbmcgcGF0dGVybiAlcDpcbiIsIHBhdHRlcm5fcGxhY2UpOwkJXAorICAgIERFQlVHX1BSSU5UX0NPTVBJTEVEX1BBVFRFUk4gKGJ1ZnAsIHBhdHRlcm5fcGxhY2UsIHBlbmQpOwkJXAorICAgIFBVU0hfRkFJTFVSRV9QT0lOVEVSIChwYXR0ZXJuX3BsYWNlKTsJCQkJXAorCQkJCQkJCQkJXAorICAgIERFQlVHX1BSSU5UMiAoIiAgUHVzaGluZyBzdHJpbmcgJXA6IGAiLCBzdHJpbmdfcGxhY2UpOwkJXAorICAgIERFQlVHX1BSSU5UX0RPVUJMRV9TVFJJTkcgKHN0cmluZ19wbGFjZSwgc3RyaW5nMSwgc2l6ZTEsIHN0cmluZzIsICAgXAorCQkJCSBzaXplMik7CQkJCVwKKyAgICBERUJVR19QUklOVDEgKCInXG4iKTsJCQkJCQlcCisgICAgUFVTSF9GQUlMVVJFX1BPSU5URVIgKHN0cmluZ19wbGFjZSk7CQkJCVwKKwkJCQkJCQkJCVwKKyAgICBERUJVR19QUklOVDIgKCIgIFB1c2hpbmcgZmFpbHVyZSBpZDogJXVcbiIsIGZhaWx1cmVfaWQpOwkJXAorICAgIERFQlVHX1BVU0ggKGZhaWx1cmVfaWQpOwkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworLyogVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgYXJlIHB1c2hlZCBhbmQgcG9wcGVkIG9uIHRoZSBzdGFjaworICAgZm9yIGVhY2ggcmVnaXN0ZXIuICAqLworI2RlZmluZSBOVU1fUkVHX0lURU1TICAzCisKKy8qIEluZGl2aWR1YWwgaXRlbXMgYXNpZGUgZnJvbSB0aGUgcmVnaXN0ZXJzLiAgKi8KKyNpZmRlZiBERUJVRworIyBkZWZpbmUgTlVNX05PTlJFR19JVEVNUyA1IC8qIEluY2x1ZGVzIGZhaWx1cmUgcG9pbnQgaWQuICAqLworI2Vsc2UKKyMgZGVmaW5lIE5VTV9OT05SRUdfSVRFTVMgNAorI2VuZGlmCisKKy8qIFdlIHB1c2ggYXQgbW9zdCB0aGlzIG1hbnkgaXRlbXMgb24gdGhlIHN0YWNrLiAgKi8KKy8qIFdlIHVzZWQgdG8gdXNlIChudW1fcmVncyAtIDEpLCB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVycworICAgdGhpcyByZWdleHAgd2lsbCBzYXZlOyBidXQgdGhhdCB3YXMgY2hhbmdlZCB0byA1CisgICB0byBhdm9pZCBzdGFjayBvdmVyZmxvdyBmb3IgYSByZWdleHAgd2l0aCBsb3RzIG9mIHBhcmVucy4gICovCisjZGVmaW5lIE1BWF9GQUlMVVJFX0lURU1TICg1ICogTlVNX1JFR19JVEVNUyArIE5VTV9OT05SRUdfSVRFTVMpCisKKy8qIFdlIGFjdHVhbGx5IHB1c2ggdGhpcyBtYW55IGl0ZW1zLiAgKi8KKyNkZWZpbmUgTlVNX0ZBSUxVUkVfSVRFTVMJCQkJXAorICAoKCgwCQkJCQkJCVwKKyAgICAgPyAwIDogaGlnaGVzdF9hY3RpdmVfcmVnIC0gbG93ZXN0X2FjdGl2ZV9yZWcgKyAxKQlcCisgICAgKiBOVU1fUkVHX0lURU1TKQkJCQkJXAorICAgKyBOVU1fTk9OUkVHX0lURU1TKQorCisvKiBIb3cgbWFueSBpdGVtcyBjYW4gc3RpbGwgYmUgYWRkZWQgdG8gdGhlIHN0YWNrIHdpdGhvdXQgb3ZlcmZsb3dpbmcgaXQuICAqLworI2RlZmluZSBSRU1BSU5JTkdfQVZBSUxfU0xPVFMgKChmYWlsX3N0YWNrKS5zaXplIC0gKGZhaWxfc3RhY2spLmF2YWlsKQorCisKKy8qIFBvcHMgd2hhdCBQVVNIX0ZBSUxfU1RBQ0sgcHVzaGVzLgorCisgICBXZSByZXN0b3JlIGludG8gdGhlIHBhcmFtZXRlcnMsIGFsbCBvZiB3aGljaCBzaG91bGQgYmUgbHZhbHVlczoKKyAgICAgU1RSIC0tIHRoZSBzYXZlZCBkYXRhIHBvc2l0aW9uLgorICAgICBQQVQgLS0gdGhlIHNhdmVkIHBhdHRlcm4gcG9zaXRpb24uCisgICAgIExPV19SRUcsIEhJR0hfUkVHIC0tIHRoZSBoaWdoZXN0IGFuZCBsb3dlc3QgYWN0aXZlIHJlZ2lzdGVycy4KKyAgICAgUkVHU1RBUlQsIFJFR0VORCAtLSBhcnJheXMgb2Ygc3RyaW5nIHBvc2l0aW9ucy4KKyAgICAgUkVHX0lORk8gLS0gYXJyYXkgb2YgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBzdWJleHByZXNzaW9uLgorCisgICBBbHNvIGFzc3VtZXMgdGhlIHZhcmlhYmxlcyBgZmFpbF9zdGFjaycgYW5kIChpZiBkZWJ1Z2dpbmcpLCBgYnVmcCcsCisgICBgcGVuZCcsIGBzdHJpbmcxJywgYHNpemUxJywgYHN0cmluZzInLCBhbmQgYHNpemUyJy4gICovCisKKyNkZWZpbmUgUE9QX0ZBSUxVUkVfUE9JTlQoc3RyLCBwYXQsIGxvd19yZWcsIGhpZ2hfcmVnLCByZWdzdGFydCwgcmVnZW5kLCByZWdfaW5mbylcCit7CQkJCQkJCQkJXAorICBERUJVR19TVEFURU1FTlQgKHVuc2lnbmVkIGZhaWx1cmVfaWQ7KQkJCQlcCisgIGFjdGl2ZV9yZWdfdCB0aGlzX3JlZzsJCQkJCQlcCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0cmluZ190ZW1wOwkJCQkJXAorCQkJCQkJCQkJXAorICBhc3NlcnQgKCFGQUlMX1NUQUNLX0VNUFRZICgpKTsJCQkJCVwKKwkJCQkJCQkJCVwKKyAgLyogUmVtb3ZlIGZhaWx1cmUgcG9pbnRzIGFuZCBwb2ludCB0byBob3cgbWFueSByZWdzIHB1c2hlZC4gICovCVwKKyAgREVCVUdfUFJJTlQxICgiUE9QX0ZBSUxVUkVfUE9JTlQ6XG4iKTsJCQkJXAorICBERUJVR19QUklOVDIgKCIgIEJlZm9yZSBwb3AsIG5leHQgYXZhaWw6ICVkXG4iLCBmYWlsX3N0YWNrLmF2YWlsKTsJXAorICBERUJVR19QUklOVDIgKCIgICAgICAgICAgICAgICAgICAgIHNpemU6ICVkXG4iLCBmYWlsX3N0YWNrLnNpemUpOwlcCisJCQkJCQkJCQlcCisgIGFzc2VydCAoZmFpbF9zdGFjay5hdmFpbCA+PSBOVU1fTk9OUkVHX0lURU1TKTsJCQlcCisJCQkJCQkJCQlcCisgIERFQlVHX1BPUCAoJmZhaWx1cmVfaWQpOwkJCQkJCVwKKyAgREVCVUdfUFJJTlQyICgiICBQb3BwaW5nIGZhaWx1cmUgaWQ6ICV1XG4iLCBmYWlsdXJlX2lkKTsJCVwKKwkJCQkJCQkJCVwKKyAgLyogSWYgdGhlIHNhdmVkIHN0cmluZyBsb2NhdGlvbiBpcyBOVUxMLCBpdCBjYW1lIGZyb20gYW4JCVwKKyAgICAgb25fZmFpbHVyZV9rZWVwX3N0cmluZ19qdW1wIG9wY29kZSwgYW5kIHdlIHdhbnQgdG8gdGhyb3cgYXdheSB0aGUJXAorICAgICBzYXZlZCBOVUxMLCB0aHVzIHJldGFpbmluZyBvdXIgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nLiAgKi8JXAorICBzdHJpbmdfdGVtcCA9IFBPUF9GQUlMVVJFX1BPSU5URVIgKCk7CQkJCQlcCisgIGlmIChzdHJpbmdfdGVtcCAhPSBOVUxMKQkJCQkJCVwKKyAgICBzdHIgPSAoY29uc3QgY2hhciAqKSBzdHJpbmdfdGVtcDsJCQkJCVwKKwkJCQkJCQkJCVwKKyAgREVCVUdfUFJJTlQyICgiICBQb3BwaW5nIHN0cmluZyAlcDogYCIsIHN0cik7CQkJCVwKKyAgREVCVUdfUFJJTlRfRE9VQkxFX1NUUklORyAoc3RyLCBzdHJpbmcxLCBzaXplMSwgc3RyaW5nMiwgc2l6ZTIpOwlcCisgIERFQlVHX1BSSU5UMSAoIidcbiIpOwkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHBhdCA9ICh1bnNpZ25lZCBjaGFyICopIFBPUF9GQUlMVVJFX1BPSU5URVIgKCk7CQkJXAorICBERUJVR19QUklOVDIgKCIgIFBvcHBpbmcgcGF0dGVybiAlcDpcbiIsIHBhdCk7CQkJXAorICBERUJVR19QUklOVF9DT01QSUxFRF9QQVRURVJOIChidWZwLCBwYXQsIHBlbmQpOwkJCVwKKwkJCQkJCQkJCVwKKyAgLyogUmVzdG9yZSByZWdpc3RlciBpbmZvLiAgKi8JCQkJCQlcCisgIGhpZ2hfcmVnID0gKGFjdGl2ZV9yZWdfdCkgUE9QX0ZBSUxVUkVfSU5UICgpOwkJCQlcCisgIERFQlVHX1BSSU5UMiAoIiAgUG9wcGluZyBoaWdoIGFjdGl2ZSByZWc6ICVsZFxuIiwgaGlnaF9yZWcpOwkJXAorCQkJCQkJCQkJXAorICBsb3dfcmVnID0gKGFjdGl2ZV9yZWdfdCkgUE9QX0ZBSUxVUkVfSU5UICgpOwkJCQlcCisgIERFQlVHX1BSSU5UMiAoIiAgUG9wcGluZyAgbG93IGFjdGl2ZSByZWc6ICVsZFxuIiwgbG93X3JlZyk7CQlcCisJCQkJCQkJCQlcCisgIGlmICgxKQkJCQkJCQkJXAorICAgIGZvciAodGhpc19yZWcgPSBoaWdoX3JlZzsgdGhpc19yZWcgPj0gbG93X3JlZzsgdGhpc19yZWctLSkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJREVCVUdfUFJJTlQyICgiICAgIFBvcHBpbmcgcmVnOiAlbGRcbiIsIHRoaXNfcmVnKTsJCVwKKwkJCQkJCQkJCVwKKwlyZWdfaW5mb1t0aGlzX3JlZ10ud29yZCA9IFBPUF9GQUlMVVJFX0VMVCAoKTsJCQlcCisJREVCVUdfUFJJTlQyICgiICAgICAgaW5mbzogJXBcbiIsCQkJCVwKKwkJICAgICAgcmVnX2luZm9bdGhpc19yZWddLndvcmQucG9pbnRlcik7CQkJXAorCQkJCQkJCQkJXAorCXJlZ2VuZFt0aGlzX3JlZ10gPSAoY29uc3QgY2hhciAqKSBQT1BfRkFJTFVSRV9QT0lOVEVSICgpOwlcCisJREVCVUdfUFJJTlQyICgiICAgICAgZW5kOiAlcFxuIiwgcmVnZW5kW3RoaXNfcmVnXSk7CQlcCisJCQkJCQkJCQlcCisJcmVnc3RhcnRbdGhpc19yZWddID0gKGNvbnN0IGNoYXIgKikgUE9QX0ZBSUxVUkVfUE9JTlRFUiAoKTsJXAorCURFQlVHX1BSSU5UMiAoIiAgICAgIHN0YXJ0OiAlcFxuIiwgcmVnc3RhcnRbdGhpc19yZWddKTsJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIGVsc2UJCQkJCQkJCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIGZvciAodGhpc19yZWcgPSBoaWdoZXN0X2FjdGl2ZV9yZWc7IHRoaXNfcmVnID4gaGlnaF9yZWc7IHRoaXNfcmVnLS0pIFwKKwl7CQkJCQkJCQlcCisJICByZWdfaW5mb1t0aGlzX3JlZ10ud29yZC5pbnRlZ2VyID0gMDsJCQkJXAorCSAgcmVnZW5kW3RoaXNfcmVnXSA9IDA7CQkJCQkJXAorCSAgcmVnc3RhcnRbdGhpc19yZWddID0gMDsJCQkJCVwKKwl9CQkJCQkJCQlcCisgICAgICBoaWdoZXN0X2FjdGl2ZV9yZWcgPSBoaWdoX3JlZzsJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICBzZXRfcmVnc19tYXRjaGVkX2RvbmUgPSAwOwkJCQkJCVwKKyAgREVCVUdfU1RBVEVNRU5UIChuZmFpbHVyZV9wb2ludHNfcG9wcGVkKyspOwkJCQlcCit9IC8qIFBPUF9GQUlMVVJFX1BPSU5UICovCisKKworDAorLyogU3RydWN0dXJlIGZvciBwZXItcmVnaXN0ZXIgKGEuay5hLiBwZXItZ3JvdXApIGluZm9ybWF0aW9uLgorICAgT3RoZXIgcmVnaXN0ZXIgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlCisgICBzdGFydGluZyBhbmQgZW5kaW5nIHBvc2l0aW9ucyAod2hpY2ggYXJlIGFkZHJlc3NlcyksIGFuZCB0aGUgbGlzdCBvZgorICAgaW5uZXIgZ3JvdXBzICh3aGljaCBpcyBhIGJpdHMgbGlzdCkgYXJlIG1haW50YWluZWQgaW4gc2VwYXJhdGUKKyAgIHZhcmlhYmxlcy4KKworICAgV2UgYXJlIG1ha2luZyBhIChzdHJpY3RseSBzcGVha2luZykgbm9ucG9ydGFibGUgYXNzdW1wdGlvbiBoZXJlOiB0aGF0CisgICB0aGUgY29tcGlsZXIgd2lsbCBwYWNrIG91ciBiaXQgZmllbGRzIGludG8gc29tZXRoaW5nIHRoYXQgZml0cyBpbnRvCisgICB0aGUgdHlwZSBvZiBgd29yZCcsIGkuZS4sIGlzIHNvbWV0aGluZyB0aGF0IGZpdHMgaW50byBvbmUgaXRlbSBvbiB0aGUKKyAgIGZhaWx1cmUgc3RhY2suICAqLworCisKKy8qIERlY2xhcmF0aW9ucyBhbmQgbWFjcm9zIGZvciByZV9tYXRjaF8yLiAgKi8KKwordHlwZWRlZiB1bmlvbgoreworICBmYWlsX3N0YWNrX2VsdF90IHdvcmQ7CisgIHN0cnVjdAorICB7CisgICAgICAvKiBUaGlzIGZpZWxkIGlzIG9uZSBpZiB0aGlzIGdyb3VwIGNhbiBtYXRjaCB0aGUgZW1wdHkgc3RyaW5nLAorICAgICAgICAgemVybyBpZiBub3QuICBJZiBub3QgeWV0IGRldGVybWluZWQsICBgTUFUQ0hfTlVMTF9VTlNFVF9WQUxVRScuICAqLworI2RlZmluZSBNQVRDSF9OVUxMX1VOU0VUX1ZBTFVFIDMKKyAgICB1bnNpZ25lZCBtYXRjaF9udWxsX3N0cmluZ19wIDogMjsKKyAgICB1bnNpZ25lZCBpc19hY3RpdmUgOiAxOworICAgIHVuc2lnbmVkIG1hdGNoZWRfc29tZXRoaW5nIDogMTsKKyAgICB1bnNpZ25lZCBldmVyX21hdGNoZWRfc29tZXRoaW5nIDogMTsKKyAgfSBiaXRzOworfSByZWdpc3Rlcl9pbmZvX3R5cGU7CisKKyNkZWZpbmUgUkVHX01BVENIX05VTExfU1RSSU5HX1AoUikgICgoUikuYml0cy5tYXRjaF9udWxsX3N0cmluZ19wKQorI2RlZmluZSBJU19BQ1RJVkUoUikgICgoUikuYml0cy5pc19hY3RpdmUpCisjZGVmaW5lIE1BVENIRURfU09NRVRISU5HKFIpICAoKFIpLmJpdHMubWF0Y2hlZF9zb21ldGhpbmcpCisjZGVmaW5lIEVWRVJfTUFUQ0hFRF9TT01FVEhJTkcoUikgICgoUikuYml0cy5ldmVyX21hdGNoZWRfc29tZXRoaW5nKQorCisKKy8qIENhbGwgdGhpcyB3aGVuIGhhdmUgbWF0Y2hlZCBhIHJlYWwgY2hhcmFjdGVyOyBpdCBzZXRzIGBtYXRjaGVkJyBmbGFncworICAgZm9yIHRoZSBzdWJleHByZXNzaW9ucyB3aGljaCB3ZSBhcmUgY3VycmVudGx5IGluc2lkZS4gIEFsc28gcmVjb3JkcworICAgdGhhdCB0aG9zZSBzdWJleHBycyBoYXZlIG1hdGNoZWQuICAqLworI2RlZmluZSBTRVRfUkVHU19NQVRDSEVEKCkJCQkJCQlcCisgIGRvCQkJCQkJCQkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBpZiAoIXNldF9yZWdzX21hdGNoZWRfZG9uZSkJCQkJCVwKKwl7CQkJCQkJCQlcCisJICBhY3RpdmVfcmVnX3QgcjsJCQkJCQlcCisJICBzZXRfcmVnc19tYXRjaGVkX2RvbmUgPSAxOwkJCQkJXAorCSAgZm9yIChyID0gbG93ZXN0X2FjdGl2ZV9yZWc7IHIgPD0gaGlnaGVzdF9hY3RpdmVfcmVnOyByKyspCVwKKwkgICAgewkJCQkJCQkJXAorCSAgICAgIE1BVENIRURfU09NRVRISU5HIChyZWdfaW5mb1tyXSkJCQkJXAorCQk9IEVWRVJfTUFUQ0hFRF9TT01FVEhJTkcgKHJlZ19pbmZvW3JdKQkJCVwKKwkJPSAxOwkJCQkJCQlcCisJICAgIH0JCQkJCQkJCVwKKwl9CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKyAgd2hpbGUgKDApCisKKy8qIFJlZ2lzdGVycyBhcmUgc2V0IHRvIGEgc2VudGluZWwgd2hlbiB0aGV5IGhhdmVuJ3QgeWV0IG1hdGNoZWQuICAqLworc3RhdGljIGNoYXIgcmVnX3Vuc2V0X2R1bW15OworI2RlZmluZSBSRUdfVU5TRVRfVkFMVUUgKCZyZWdfdW5zZXRfZHVtbXkpCisjZGVmaW5lIFJFR19VTlNFVChlKSAoKGUpID09IFJFR19VTlNFVF9WQUxVRSkKKwwKKy8qIFN1YnJvdXRpbmUgZGVjbGFyYXRpb25zIGFuZCBtYWNyb3MgZm9yIHJlZ2V4X2NvbXBpbGUuICAqLworCitzdGF0aWMgcmVnX2VycmNvZGVfdCByZWdleF9jb21waWxlIF9SRV9BUkdTICgoY29uc3QgY2hhciAqcGF0dGVybiwgc2l6ZV90IHNpemUsCisJCQkJCSAgICAgIHJlZ19zeW50YXhfdCBzeW50YXgsCisJCQkJCSAgICAgIHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqYnVmcCkpOworc3RhdGljIHZvaWQgc3RvcmVfb3AxIF9SRV9BUkdTICgocmVfb3Bjb2RlX3Qgb3AsIHVuc2lnbmVkIGNoYXIgKmxvYywgaW50IGFyZykpOworc3RhdGljIHZvaWQgc3RvcmVfb3AyIF9SRV9BUkdTICgocmVfb3Bjb2RlX3Qgb3AsIHVuc2lnbmVkIGNoYXIgKmxvYywKKwkJCQkgaW50IGFyZzEsIGludCBhcmcyKSk7CitzdGF0aWMgdm9pZCBpbnNlcnRfb3AxIF9SRV9BUkdTICgocmVfb3Bjb2RlX3Qgb3AsIHVuc2lnbmVkIGNoYXIgKmxvYywKKwkJCQkgIGludCBhcmcsIHVuc2lnbmVkIGNoYXIgKmVuZCkpOworc3RhdGljIHZvaWQgaW5zZXJ0X29wMiBfUkVfQVJHUyAoKHJlX29wY29kZV90IG9wLCB1bnNpZ25lZCBjaGFyICpsb2MsCisJCQkJICBpbnQgYXJnMSwgaW50IGFyZzIsIHVuc2lnbmVkIGNoYXIgKmVuZCkpOworc3RhdGljIGJvb2xlYW4gYXRfYmVnbGluZV9sb2NfcCBfUkVfQVJHUyAoKGNvbnN0IGNoYXIgKnBhdHRlcm4sIGNvbnN0IGNoYXIgKnAsCisJCQkJCSAgIHJlZ19zeW50YXhfdCBzeW50YXgpKTsKK3N0YXRpYyBib29sZWFuIGF0X2VuZGxpbmVfbG9jX3AgX1JFX0FSR1MgKChjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICpwZW5kLAorCQkJCQkgICByZWdfc3ludGF4X3Qgc3ludGF4KSk7CitzdGF0aWMgcmVnX2VycmNvZGVfdCBjb21waWxlX3JhbmdlIF9SRV9BUkdTICgoY29uc3QgY2hhciAqKnBfcHRyLAorCQkJCQkgICAgICBjb25zdCBjaGFyICpwZW5kLAorCQkJCQkgICAgICBjaGFyICp0cmFuc2xhdGUsCisJCQkJCSAgICAgIHJlZ19zeW50YXhfdCBzeW50YXgsCisJCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmIpKTsKKworLyogRmV0Y2ggdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSB1bmNvbXBpbGVkIHBhdHRlcm4tLS10cmFuc2xhdGluZyBpdAorICAgaWYgbmVjZXNzYXJ5LiAgQWxzbyBjYXN0IGZyb20gYSBzaWduZWQgY2hhcmFjdGVyIGluIHRoZSBjb25zdGFudAorICAgc3RyaW5nIHBhc3NlZCB0byB1cyBieSB0aGUgdXNlciB0byBhbiB1bnNpZ25lZCBjaGFyIHRoYXQgd2UgY2FuIHVzZQorICAgYXMgYW4gYXJyYXkgaW5kZXggKGluLCBlLmcuLCBgdHJhbnNsYXRlJykuICAqLworI2lmbmRlZiBQQVRGRVRDSAorIyBkZWZpbmUgUEFURkVUQ0goYykJCQkJCQkJXAorICBkbyB7aWYgKHAgPT0gcGVuZCkgcmV0dXJuIFJFR19FRU5EOwkJCQkJXAorICAgIGMgPSAodW5zaWduZWQgY2hhcikgKnArKzsJCQkJCQlcCisgICAgaWYgKHRyYW5zbGF0ZSkgYyA9ICh1bnNpZ25lZCBjaGFyKSB0cmFuc2xhdGVbY107CQkJXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIEZldGNoIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgdW5jb21waWxlZCBwYXR0ZXJuLCB3aXRoIG5vCisgICB0cmFuc2xhdGlvbi4gICovCisjZGVmaW5lIFBBVEZFVENIX1JBVyhjKQkJCQkJCQlcCisgIGRvIHtpZiAocCA9PSBwZW5kKSByZXR1cm4gUkVHX0VFTkQ7CQkJCQlcCisgICAgYyA9ICh1bnNpZ25lZCBjaGFyKSAqcCsrOyAJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKy8qIEdvIGJhY2t3YXJkcyBvbmUgY2hhcmFjdGVyIGluIHRoZSBwYXR0ZXJuLiAgKi8KKyNkZWZpbmUgUEFUVU5GRVRDSCBwLS0KKworCisvKiBJZiBgdHJhbnNsYXRlJyBpcyBub24tbnVsbCwgcmV0dXJuIHRyYW5zbGF0ZVtEXSwgZWxzZSBqdXN0IEQuICBXZQorICAgY2FzdCB0aGUgc3Vic2NyaXB0IHRvIHRyYW5zbGF0ZSBiZWNhdXNlIHNvbWUgZGF0YSBpcyBkZWNsYXJlZCBhcworICAgYGNoYXIgKicsIHRvIGF2b2lkIHdhcm5pbmdzIHdoZW4gYSBzdHJpbmcgY29uc3RhbnQgaXMgcGFzc2VkLiAgQnV0CisgICB3aGVuIHdlIHVzZSBhIGNoYXJhY3RlciBhcyBhIHN1YnNjcmlwdCB3ZSBtdXN0IG1ha2UgaXQgdW5zaWduZWQuICAqLworI2lmbmRlZiBUUkFOU0xBVEUKKyMgZGVmaW5lIFRSQU5TTEFURShkKSBcCisgICh0cmFuc2xhdGUgPyAoY2hhcikgdHJhbnNsYXRlWyh1bnNpZ25lZCBjaGFyKSAoZCldIDogKGQpKQorI2VuZGlmCisKKworLyogTWFjcm9zIGZvciBvdXRwdXR0aW5nIHRoZSBjb21waWxlZCBwYXR0ZXJuIGludG8gYGJ1ZmZlcicuICAqLworCisvKiBJZiB0aGUgYnVmZmVyIGlzbid0IGFsbG9jYXRlZCB3aGVuIGl0IGNvbWVzIGluLCB1c2UgdGhpcy4gICovCisjZGVmaW5lIElOSVRfQlVGX1NJWkUgIDMyCisKKy8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IE4gbW9yZSBieXRlcyBvZiBzcGFjZSBpbiBidWZmZXIuICAqLworI2RlZmluZSBHRVRfQlVGRkVSX1NQQUNFKG4pCQkJCQkJXAorICAgIHdoaWxlICgodW5zaWduZWQgbG9uZykgKGIgLSBidWZwLT5idWZmZXIgKyAobikpID4gYnVmcC0+YWxsb2NhdGVkKQlcCisgICAgICBFWFRFTkRfQlVGRkVSICgpCisKKy8qIE1ha2Ugc3VyZSB3ZSBoYXZlIG9uZSBtb3JlIGJ5dGUgb2YgYnVmZmVyIHNwYWNlIGFuZCB0aGVuIGFkZCBDIHRvIGl0LiAgKi8KKyNkZWZpbmUgQlVGX1BVU0goYykJCQkJCQkJXAorICBkbyB7CQkJCQkJCQkJXAorICAgIEdFVF9CVUZGRVJfU1BBQ0UgKDEpOwkJCQkJCVwKKyAgICAqYisrID0gKHVuc2lnbmVkIGNoYXIpIChjKTsJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKworLyogRW5zdXJlIHdlIGhhdmUgdHdvIG1vcmUgYnl0ZXMgb2YgYnVmZmVyIHNwYWNlIGFuZCB0aGVuIGFwcGVuZCBDMSBhbmQgQzIuICAqLworI2RlZmluZSBCVUZfUFVTSF8yKGMxLCBjMikJCQkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgR0VUX0JVRkZFUl9TUEFDRSAoMik7CQkJCQkJXAorICAgICpiKysgPSAodW5zaWduZWQgY2hhcikgKGMxKTsJCQkJCVwKKyAgICAqYisrID0gKHVuc2lnbmVkIGNoYXIpIChjMik7CQkJCQlcCisgIH0gd2hpbGUgKDApCisKKworLyogQXMgd2l0aCBCVUZfUFVTSF8yLCBleGNlcHQgZm9yIHRocmVlIGJ5dGVzLiAgKi8KKyNkZWZpbmUgQlVGX1BVU0hfMyhjMSwgYzIsIGMzKQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBHRVRfQlVGRkVSX1NQQUNFICgzKTsJCQkJCQlcCisgICAgKmIrKyA9ICh1bnNpZ25lZCBjaGFyKSAoYzEpOwkJCQkJXAorICAgICpiKysgPSAodW5zaWduZWQgY2hhcikgKGMyKTsJCQkJCVwKKyAgICAqYisrID0gKHVuc2lnbmVkIGNoYXIpIChjMyk7CQkJCQlcCisgIH0gd2hpbGUgKDApCisKKworLyogU3RvcmUgYSBqdW1wIHdpdGggb3Bjb2RlIE9QIGF0IExPQyB0byBsb2NhdGlvbiBUTy4gIFdlIHN0b3JlIGEKKyAgIHJlbGF0aXZlIGFkZHJlc3Mgb2Zmc2V0IGJ5IHRoZSB0aHJlZSBieXRlcyB0aGUganVtcCBpdHNlbGYgb2NjdXBpZXMuICAqLworI2RlZmluZSBTVE9SRV9KVU1QKG9wLCBsb2MsIHRvKSBcCisgIHN0b3JlX29wMSAob3AsIGxvYywgKGludCkgKCh0bykgLSAobG9jKSAtIDMpKQorCisvKiBMaWtld2lzZSwgZm9yIGEgdHdvLWFyZ3VtZW50IGp1bXAuICAqLworI2RlZmluZSBTVE9SRV9KVU1QMihvcCwgbG9jLCB0bywgYXJnKSBcCisgIHN0b3JlX29wMiAob3AsIGxvYywgKGludCkgKCh0bykgLSAobG9jKSAtIDMpLCBhcmcpCisKKy8qIExpa2UgYFNUT1JFX0pVTVAnLCBidXQgZm9yIGluc2VydGluZy4gIEFzc3VtZSBgYicgaXMgdGhlIGJ1ZmZlciBlbmQuICAqLworI2RlZmluZSBJTlNFUlRfSlVNUChvcCwgbG9jLCB0bykgXAorICBpbnNlcnRfb3AxIChvcCwgbG9jLCAoaW50KSAoKHRvKSAtIChsb2MpIC0gMyksIGIpCisKKy8qIExpa2UgYFNUT1JFX0pVTVAyJywgYnV0IGZvciBpbnNlcnRpbmcuICBBc3N1bWUgYGInIGlzIHRoZSBidWZmZXIgZW5kLiAgKi8KKyNkZWZpbmUgSU5TRVJUX0pVTVAyKG9wLCBsb2MsIHRvLCBhcmcpIFwKKyAgaW5zZXJ0X29wMiAob3AsIGxvYywgKGludCkgKCh0bykgLSAobG9jKSAtIDMpLCBhcmcsIGIpCisKKworLyogVGhpcyBpcyBub3QgYW4gYXJiaXRyYXJ5IGxpbWl0OiB0aGUgYXJndW1lbnRzIHdoaWNoIHJlcHJlc2VudCBvZmZzZXRzCisgICBpbnRvIHRoZSBwYXR0ZXJuIGFyZSB0d28gYnl0ZXMgbG9uZy4gIFNvIGlmIDJeMTYgYnl0ZXMgdHVybnMgb3V0IHRvCisgICBiZSB0b28gc21hbGwsIG1hbnkgdGhpbmdzIHdvdWxkIGhhdmUgdG8gY2hhbmdlLiAgKi8KKy8qIEFueSBvdGhlciBjb21waWxlciB3aGljaCwgbGlrZSBNU0MsIGhhcyBhbGxvY2F0aW9uIGxpbWl0IGJlbG93IDJeMTYKKyAgIGJ5dGVzIHdpbGwgaGF2ZSB0byB1c2UgYXBwcm9hY2ggc2ltaWxhciB0byB3aGF0IHdhcyBkb25lIGJlbG93IGZvcgorICAgTVNDIGFuZCBkcm9wIE1BWF9CVUZfU0laRSBhIGJpdC4gIE90aGVyd2lzZSB5b3UgbWF5IGVuZCB1cAorICAgcmVhbGxvY2F0aW5nIHRvIDAgYnl0ZXMuICBTdWNoIHRoaW5nIGlzIG5vdCBnb2luZyB0byB3b3JrIHRvbyB3ZWxsLgorICAgWW91IGhhdmUgYmVlbiB3YXJuZWQhISAgKi8KKyNpZiBkZWZpbmVkIF9NU0NfVkVSICAmJiAhZGVmaW5lZCBXSU4zMgorLyogTWljcm9zb2Z0IEMgMTYtYml0IHZlcnNpb25zIGxpbWl0IG1hbGxvYyB0byBhcHByb3ggNjU1MTIgYnl0ZXMuCisgICBUaGUgUkVBTExPQyBkZWZpbmUgZWxpbWluYXRlcyBhIGZsdXJyeSBvZiBjb252ZXJzaW9uIHdhcm5pbmdzLAorICAgYnV0IGlzIG5vdCByZXF1aXJlZC4gKi8KKyMgZGVmaW5lIE1BWF9CVUZfU0laRSAgNjU1MDBMCisjIGRlZmluZSBSRUFMTE9DKHAscykgcmVhbGxvYyAoKHApLCAoc2l6ZV90KSAocykpCisjZWxzZQorIyBkZWZpbmUgTUFYX0JVRl9TSVpFICgxTCA8PCAxNikKKyMgZGVmaW5lIFJFQUxMT0MocCxzKSByZWFsbG9jICgocCksIChzKSkKKyNlbmRpZgorCisvKiBFeHRlbmQgdGhlIGJ1ZmZlciBieSB0d2ljZSBpdHMgY3VycmVudCBzaXplIHZpYSByZWFsbG9jIGFuZAorICAgcmVzZXQgdGhlIHBvaW50ZXJzIHRoYXQgcG9pbnRlZCBpbnRvIHRoZSBvbGQgYmxvY2sgdG8gcG9pbnQgdG8gdGhlCisgICBjb3JyZWN0IHBsYWNlcyBpbiB0aGUgbmV3IG9uZS4gIElmIGV4dGVuZGluZyB0aGUgYnVmZmVyIHJlc3VsdHMgaW4gaXQKKyAgIGJlaW5nIGxhcmdlciB0aGFuIE1BWF9CVUZfU0laRSwgdGhlbiBmbGFnIG1lbW9yeSBleGhhdXN0ZWQuICAqLworI2RlZmluZSBFWFRFTkRfQlVGRkVSKCkJCQkJCQkJXAorICBkbyB7IAkJCQkJCQkJCVwKKyAgICB1bnNpZ25lZCBjaGFyICpvbGRfYnVmZmVyID0gYnVmcC0+YnVmZmVyOwkJCQlcCisgICAgaWYgKGJ1ZnAtPmFsbG9jYXRlZCA9PSBNQVhfQlVGX1NJWkUpIAkJCQlcCisgICAgICByZXR1cm4gUkVHX0VTSVpFOwkJCQkJCQlcCisgICAgYnVmcC0+YWxsb2NhdGVkIDw8PSAxOwkJCQkJCVwKKyAgICBpZiAoYnVmcC0+YWxsb2NhdGVkID4gTUFYX0JVRl9TSVpFKQkJCQkJXAorICAgICAgYnVmcC0+YWxsb2NhdGVkID0gTUFYX0JVRl9TSVpFOyAJCQkJCVwKKyAgICBidWZwLT5idWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSBSRUFMTE9DIChidWZwLT5idWZmZXIsIGJ1ZnAtPmFsbG9jYXRlZCk7XAorICAgIGlmIChidWZwLT5idWZmZXIgPT0gTlVMTCkJCQkJCQlcCisgICAgICByZXR1cm4gUkVHX0VTUEFDRTsJCQkJCQlcCisgICAgLyogSWYgdGhlIGJ1ZmZlciBtb3ZlZCwgbW92ZSBhbGwgdGhlIHBvaW50ZXJzIGludG8gaXQuICAqLwkJXAorICAgIGlmIChvbGRfYnVmZmVyICE9IGJ1ZnAtPmJ1ZmZlcikJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisgICAgICAgIGIgPSAoYiAtIG9sZF9idWZmZXIpICsgYnVmcC0+YnVmZmVyOwkJCQlcCisgICAgICAgIGJlZ2FsdCA9IChiZWdhbHQgLSBvbGRfYnVmZmVyKSArIGJ1ZnAtPmJ1ZmZlcjsJCQlcCisgICAgICAgIGlmIChmaXh1cF9hbHRfanVtcCkJCQkJCQlcCisgICAgICAgICAgZml4dXBfYWx0X2p1bXAgPSAoZml4dXBfYWx0X2p1bXAgLSBvbGRfYnVmZmVyKSArIGJ1ZnAtPmJ1ZmZlcjtcCisgICAgICAgIGlmIChsYXN0c3RhcnQpCQkJCQkJCVwKKyAgICAgICAgICBsYXN0c3RhcnQgPSAobGFzdHN0YXJ0IC0gb2xkX2J1ZmZlcikgKyBidWZwLT5idWZmZXI7CQlcCisgICAgICAgIGlmIChwZW5kaW5nX2V4YWN0KQkJCQkJCVwKKyAgICAgICAgICBwZW5kaW5nX2V4YWN0ID0gKHBlbmRpbmdfZXhhY3QgLSBvbGRfYnVmZmVyKSArIGJ1ZnAtPmJ1ZmZlcjsJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworCisvKiBTaW5jZSB3ZSBoYXZlIG9uZSBieXRlIHJlc2VydmVkIGZvciB0aGUgcmVnaXN0ZXIgbnVtYmVyIGFyZ3VtZW50IHRvCisgICB7c3RhcnQsc3RvcH1fbWVtb3J5LCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZ3JvdXBzIHdlIGNhbiByZXBvcnQKKyAgIHRoaW5ncyBhYm91dCBpcyB3aGF0IGZpdHMgaW4gdGhhdCBieXRlLiAgKi8KKyNkZWZpbmUgTUFYX1JFR05VTSAyNTUKKworLyogQnV0IHBhdHRlcm5zIGNhbiBoYXZlIG1vcmUgdGhhbiBgTUFYX1JFR05VTScgcmVnaXN0ZXJzLiAgV2UganVzdAorICAgaWdub3JlIHRoZSBleGNlc3MuICAqLwordHlwZWRlZiB1bnNpZ25lZCByZWdudW1fdDsKKworCisvKiBNYWNyb3MgZm9yIHRoZSBjb21waWxlIHN0YWNrLiAgKi8KKworLyogU2luY2Ugb2Zmc2V0cyBjYW4gZ28gZWl0aGVyIGZvcndhcmRzIG9yIGJhY2t3YXJkcywgdGhpcyB0eXBlIG5lZWRzIHRvCisgICBiZSBhYmxlIHRvIGhvbGQgdmFsdWVzIGZyb20gLShNQVhfQlVGX1NJWkUgLSAxKSB0byBNQVhfQlVGX1NJWkUgLSAxLiAgKi8KKy8qIGludCBtYXkgYmUgbm90IGVub3VnaCB3aGVuIHNpemVvZihpbnQpID09IDIuICAqLwordHlwZWRlZiBsb25nIHBhdHRlcm5fb2Zmc2V0X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHBhdHRlcm5fb2Zmc2V0X3QgYmVnYWx0X29mZnNldDsKKyAgcGF0dGVybl9vZmZzZXRfdCBmaXh1cF9hbHRfanVtcDsKKyAgcGF0dGVybl9vZmZzZXRfdCBpbm5lcl9ncm91cF9vZmZzZXQ7CisgIHBhdHRlcm5fb2Zmc2V0X3QgbGFzdHN0YXJ0X29mZnNldDsKKyAgcmVnbnVtX3QgcmVnbnVtOworfSBjb21waWxlX3N0YWNrX2VsdF90OworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbXBpbGVfc3RhY2tfZWx0X3QgKnN0YWNrOworICB1bnNpZ25lZCBzaXplOworICB1bnNpZ25lZCBhdmFpbDsJCQkvKiBPZmZzZXQgb2YgbmV4dCBvcGVuIHBvc2l0aW9uLiAgKi8KK30gY29tcGlsZV9zdGFja190eXBlOworCisKKyNkZWZpbmUgSU5JVF9DT01QSUxFX1NUQUNLX1NJWkUgMzIKKworI2RlZmluZSBDT01QSUxFX1NUQUNLX0VNUFRZICAoY29tcGlsZV9zdGFjay5hdmFpbCA9PSAwKQorI2RlZmluZSBDT01QSUxFX1NUQUNLX0ZVTEwgIChjb21waWxlX3N0YWNrLmF2YWlsID09IGNvbXBpbGVfc3RhY2suc2l6ZSkKKworLyogVGhlIG5leHQgYXZhaWxhYmxlIGVsZW1lbnQuICAqLworI2RlZmluZSBDT01QSUxFX1NUQUNLX1RPUCAoY29tcGlsZV9zdGFjay5zdGFja1tjb21waWxlX3N0YWNrLmF2YWlsXSkKKworCisvKiBTZXQgdGhlIGJpdCBmb3IgY2hhcmFjdGVyIEMgaW4gYSBsaXN0LiAgKi8KKyNkZWZpbmUgU0VUX0xJU1RfQklUKGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGJbKCh1bnNpZ25lZCBjaGFyKSAoYykpIC8gQllURVdJRFRIXSAgICAgICAgICAgICAgIFwKKyAgIHw9IDEgPDwgKCgodW5zaWduZWQgY2hhcikgYykgJSBCWVRFV0lEVEgpKQorCisKKy8qIEdldCB0aGUgbmV4dCB1bnNpZ25lZCBudW1iZXIgaW4gdGhlIHVuY29tcGlsZWQgcGF0dGVybi4gICovCisjZGVmaW5lIEdFVF9VTlNJR05FRF9OVU1CRVIobnVtKSAJCQkJCVwKKyAgeyBpZiAocCAhPSBwZW5kKQkJCQkJCQlcCisgICAgIHsJCQkJCQkJCQlcCisgICAgICAgUEFURkVUQ0ggKGMpOyAJCQkJCQkJXAorICAgICAgIHdoaWxlIChJU0RJR0lUIChjKSkgCQkJCQkJXAorICAgICAgICAgeyAJCQkJCQkJCVwKKyAgICAgICAgICAgaWYgKG51bSA8IDApCQkJCQkJCVwKKyAgICAgICAgICAgICAgbnVtID0gMDsJCQkJCQkJXAorICAgICAgICAgICBudW0gPSBudW0gKiAxMCArIGMgLSAnMCc7IAkJCQkJXAorICAgICAgICAgICBpZiAocCA9PSBwZW5kKSAJCQkJCQlcCisgICAgICAgICAgICAgIGJyZWFrOyAJCQkJCQkJXAorICAgICAgICAgICBQQVRGRVRDSCAoYyk7CQkJCQkJXAorICAgICAgICAgfSAJCQkJCQkJCVwKKyAgICAgICB9IAkJCQkJCQkJXAorICAgIH0KKworI2lmIGRlZmluZWQgX0xJQkMgfHwgKGRlZmluZWQgSEFWRV9XQ1RZUEVfSCAmJiBkZWZpbmVkIEhBVkVfV0NIQVJfSCkKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IHByb3ZpZGVzIHN1cHBvcnQgZm9yIHVzZXItZGVmaW5lZCBjaGFyYWN0ZXIgY2xhc3NlcworICAgYW5kIHRoZSBmdW5jdGlvbnMgZnJvbSBJU08gQyBhbWVuZGVtZW50IDEuICAqLworIyBpZmRlZiBDSEFSQ0xBU1NfTkFNRV9NQVgKKyMgIGRlZmluZSBDSEFSX0NMQVNTX01BWF9MRU5HVEggQ0hBUkNMQVNTX05BTUVfTUFYCisjIGVsc2UKKy8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBidXQgc29tZSBpbXBsZW1lbnRhdGlvbiBtaWdodCBzdGlsbCBoYXZlIHRoaXMKKyAgIHByb2JsZW0uICBVc2UgYSByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWUuICAqLworIyAgZGVmaW5lIENIQVJfQ0xBU1NfTUFYX0xFTkdUSCAyNTYKKyMgZW5kaWYKKworIyBpZmRlZiBfTElCQworIyAgZGVmaW5lIElTX0NIQVJfQ0xBU1Moc3RyaW5nKSBfX3djdHlwZSAoc3RyaW5nKQorIyBlbHNlCisjICBkZWZpbmUgSVNfQ0hBUl9DTEFTUyhzdHJpbmcpIHdjdHlwZSAoc3RyaW5nKQorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIENIQVJfQ0xBU1NfTUFYX0xFTkdUSCAgNiAvKiBOYW1lbHksIGB4ZGlnaXQnLiAgKi8KKworIyBkZWZpbmUgSVNfQ0hBUl9DTEFTUyhzdHJpbmcpCQkJCQkJXAorICAgKFNUUkVRIChzdHJpbmcsICJhbHBoYSIpIHx8IFNUUkVRIChzdHJpbmcsICJ1cHBlciIpCQkJXAorICAgIHx8IFNUUkVRIChzdHJpbmcsICJsb3dlciIpIHx8IFNUUkVRIChzdHJpbmcsICJkaWdpdCIpCQlcCisgICAgfHwgU1RSRVEgKHN0cmluZywgImFsbnVtIikgfHwgU1RSRVEgKHN0cmluZywgInhkaWdpdCIpCQlcCisgICAgfHwgU1RSRVEgKHN0cmluZywgInNwYWNlIikgfHwgU1RSRVEgKHN0cmluZywgInByaW50IikJCVwKKyAgICB8fCBTVFJFUSAoc3RyaW5nLCAicHVuY3QiKSB8fCBTVFJFUSAoc3RyaW5nLCAiZ3JhcGgiKQkJXAorICAgIHx8IFNUUkVRIChzdHJpbmcsICJjbnRybCIpIHx8IFNUUkVRIChzdHJpbmcsICJibGFuayIpKQorI2VuZGlmCisMCisjaWZuZGVmIE1BVENIX01BWV9BTExPQ0FURQorCisvKiBJZiB3ZSBjYW5ub3QgYWxsb2NhdGUgbGFyZ2Ugb2JqZWN0cyB3aXRoaW4gcmVfbWF0Y2hfMl9pbnRlcm5hbCwKKyAgIHdlIG1ha2UgdGhlIGZhaWwgc3RhY2sgYW5kIHJlZ2lzdGVyIHZlY3RvcnMgZ2xvYmFsLgorICAgVGhlIGZhaWwgc3RhY2ssIHdlIGdyb3cgdG8gdGhlIG1heGltdW0gc2l6ZSB3aGVuIGEgcmVnZXhwCisgICBpcyBjb21waWxlZC4KKyAgIFRoZSByZWdpc3RlciB2ZWN0b3JzLCB3ZSBhZGp1c3QgaW4gc2l6ZSBlYWNoIHRpbWUgd2UKKyAgIGNvbXBpbGUgYSByZWdleHAsIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBpdCBuZWVkcy4gICovCisKK3N0YXRpYyBmYWlsX3N0YWNrX3R5cGUgZmFpbF9zdGFjazsKKworLyogU2l6ZSB3aXRoIHdoaWNoIHRoZSBmb2xsb3dpbmcgdmVjdG9ycyBhcmUgY3VycmVudGx5IGFsbG9jYXRlZC4KKyAgIFRoYXQgaXMgc28gd2UgY2FuIG1ha2UgdGhlbSBiaWdnZXIgYXMgbmVlZGVkLAorICAgYnV0IG5ldmVyIG1ha2UgdGhlbSBzbWFsbGVyLiAgKi8KK3N0YXRpYyBpbnQgcmVnc19hbGxvY2F0ZWRfc2l6ZTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiogICAgIHJlZ3N0YXJ0LCAqKiAgICAgcmVnZW5kOworc3RhdGljIGNvbnN0IGNoYXIgKiogb2xkX3JlZ3N0YXJ0LCAqKiBvbGRfcmVnZW5kOworc3RhdGljIGNvbnN0IGNoYXIgKipiZXN0X3JlZ3N0YXJ0LCAqKmJlc3RfcmVnZW5kOworc3RhdGljIHJlZ2lzdGVyX2luZm9fdHlwZSAqcmVnX2luZm87CitzdGF0aWMgY29uc3QgY2hhciAqKnJlZ19kdW1teTsKK3N0YXRpYyByZWdpc3Rlcl9pbmZvX3R5cGUgKnJlZ19pbmZvX2R1bW15OworCisvKiBNYWtlIHRoZSByZWdpc3RlciB2ZWN0b3JzIGJpZyBlbm91Z2ggZm9yIE5VTV9SRUdTIHJlZ2lzdGVycywKKyAgIGJ1dCBkb24ndCBtYWtlIHRoZW0gc21hbGxlci4gICovCisKK3N0YXRpYworcmVnZXhfZ3Jvd19yZWdpc3RlcnMgKG51bV9yZWdzKQorICAgICBpbnQgbnVtX3JlZ3M7Cit7CisgIGlmIChudW1fcmVncyA+IHJlZ3NfYWxsb2NhdGVkX3NpemUpCisgICAgeworICAgICAgUkVUQUxMT0NfSUYgKHJlZ3N0YXJ0LAkgbnVtX3JlZ3MsIGNvbnN0IGNoYXIgKik7CisgICAgICBSRVRBTExPQ19JRiAocmVnZW5kLAkgbnVtX3JlZ3MsIGNvbnN0IGNoYXIgKik7CisgICAgICBSRVRBTExPQ19JRiAob2xkX3JlZ3N0YXJ0LCBudW1fcmVncywgY29uc3QgY2hhciAqKTsKKyAgICAgIFJFVEFMTE9DX0lGIChvbGRfcmVnZW5kLAkgbnVtX3JlZ3MsIGNvbnN0IGNoYXIgKik7CisgICAgICBSRVRBTExPQ19JRiAoYmVzdF9yZWdzdGFydCwgbnVtX3JlZ3MsIGNvbnN0IGNoYXIgKik7CisgICAgICBSRVRBTExPQ19JRiAoYmVzdF9yZWdlbmQsCSBudW1fcmVncywgY29uc3QgY2hhciAqKTsKKyAgICAgIFJFVEFMTE9DX0lGIChyZWdfaW5mbywJIG51bV9yZWdzLCByZWdpc3Rlcl9pbmZvX3R5cGUpOworICAgICAgUkVUQUxMT0NfSUYgKHJlZ19kdW1teSwJIG51bV9yZWdzLCBjb25zdCBjaGFyICopOworICAgICAgUkVUQUxMT0NfSUYgKHJlZ19pbmZvX2R1bW15LCBudW1fcmVncywgcmVnaXN0ZXJfaW5mb190eXBlKTsKKworICAgICAgcmVnc19hbGxvY2F0ZWRfc2l6ZSA9IG51bV9yZWdzOworICAgIH0KK30KKworI2VuZGlmIC8qIG5vdCBNQVRDSF9NQVlfQUxMT0NBVEUgKi8KKwwKK3N0YXRpYyBib29sZWFuIGdyb3VwX2luX2NvbXBpbGVfc3RhY2sgX1JFX0FSR1MgKChjb21waWxlX3N0YWNrX3R5cGUKKwkJCQkJCSBjb21waWxlX3N0YWNrLAorCQkJCQkJIHJlZ251bV90IHJlZ251bSkpOworCisvKiBgcmVnZXhfY29tcGlsZScgY29tcGlsZXMgUEFUVEVSTiAob2YgbGVuZ3RoIFNJWkUpIGFjY29yZGluZyB0byBTWU5UQVguCisgICBSZXR1cm5zIG9uZSBvZiBlcnJvciBjb2RlcyBkZWZpbmVkIGluIGBnbnUtcmVnZXguaCcsIG9yIHplcm8gZm9yIHN1Y2Nlc3MuCisKKyAgIEFzc3VtZXMgdGhlIGBhbGxvY2F0ZWQnIChhbmQgcGVyaGFwcyBgYnVmZmVyJykgYW5kIGB0cmFuc2xhdGUnCisgICBmaWVsZHMgYXJlIHNldCBpbiBCVUZQIG9uIGVudHJ5LgorCisgICBJZiBpdCBzdWNjZWVkcywgcmVzdWx0cyBhcmUgcHV0IGluIEJVRlAgKGlmIGl0IHJldHVybnMgYW4gZXJyb3IsIHRoZQorICAgY29udGVudHMgb2YgQlVGUCBhcmUgdW5kZWZpbmVkKToKKyAgICAgYGJ1ZmZlcicgaXMgdGhlIGNvbXBpbGVkIHBhdHRlcm47CisgICAgIGBzeW50YXgnIGlzIHNldCB0byBTWU5UQVg7CisgICAgIGB1c2VkJyBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgY29tcGlsZWQgcGF0dGVybjsKKyAgICAgYGZhc3RtYXBfYWNjdXJhdGUnIGlzIHplcm87CisgICAgIGByZV9uc3ViJyBpcyB0aGUgbnVtYmVyIG9mIHN1YmV4cHJlc3Npb25zIGluIFBBVFRFUk47CisgICAgIGBub3RfYm9sJyBhbmQgYG5vdF9lb2wnIGFyZSB6ZXJvOworCisgICBUaGUgYGZhc3RtYXAnIGFuZCBgbmV3bGluZV9hbmNob3InIGZpZWxkcyBhcmUgbmVpdGhlcgorICAgZXhhbWluZWQgbm9yIHNldC4gICovCisKKy8qIFJldHVybiwgZnJlZWluZyBzdG9yYWdlIHdlIGFsbG9jYXRlZC4gICovCisjZGVmaW5lIEZSRUVfU1RBQ0tfUkVUVVJOKHZhbHVlKQkJXAorICByZXR1cm4gKGZyZWUgKGNvbXBpbGVfc3RhY2suc3RhY2spLCB2YWx1ZSkKKworc3RhdGljIHJlZ19lcnJjb2RlX3QKK3JlZ2V4X2NvbXBpbGUgKHBhdHRlcm4sIHNpemUsIHN5bnRheCwgYnVmcCkKKyAgICAgY29uc3QgY2hhciAqcGF0dGVybjsKKyAgICAgc2l6ZV90IHNpemU7CisgICAgIHJlZ19zeW50YXhfdCBzeW50YXg7CisgICAgIHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqYnVmcDsKK3sKKyAgLyogV2UgZmV0Y2ggY2hhcmFjdGVycyBmcm9tIFBBVFRFUk4gaGVyZS4gIEV2ZW4gdGhvdWdoIFBBVFRFUk4gaXMKKyAgICAgYGNoYXIgKicgKGkuZS4sIHNpZ25lZCksIHdlIGRlY2xhcmUgdGhlc2UgdmFyaWFibGVzIGFzIHVuc2lnbmVkLCBzbworICAgICB0aGV5IGNhbiBiZSByZWxpYWJseSB1c2VkIGFzIGFycmF5IGluZGljZXMuICAqLworICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIGMsIGMxOworCisgIC8qIEEgcmFuZG9tIHRlbXBvcmFyeSBzcG90IGluIFBBVFRFUk4uICAqLworICBjb25zdCBjaGFyICpwMTsKKworICAvKiBQb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCB3aGVyZSB3ZSBzaG91bGQgYXBwZW5kLiAgKi8KKyAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqYjsKKworICAvKiBLZWVwcyB0cmFjayBvZiB1bmNsb3NlZCBncm91cHMuICAqLworICBjb21waWxlX3N0YWNrX3R5cGUgY29tcGlsZV9zdGFjazsKKworICAvKiBQb2ludHMgdG8gdGhlIGN1cnJlbnQgKGVuZGluZykgcG9zaXRpb24gaW4gdGhlIHBhdHRlcm4uICAqLworICBjb25zdCBjaGFyICpwID0gcGF0dGVybjsKKyAgY29uc3QgY2hhciAqcGVuZCA9IHBhdHRlcm4gKyBzaXplOworCisgIC8qIEhvdyB0byB0cmFuc2xhdGUgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHBhdHRlcm4uICAqLworICBSRV9UUkFOU0xBVEVfVFlQRSB0cmFuc2xhdGUgPSBidWZwLT50cmFuc2xhdGU7CisKKyAgLyogQWRkcmVzcyBvZiB0aGUgY291bnQtYnl0ZSBvZiB0aGUgbW9zdCByZWNlbnRseSBpbnNlcnRlZCBgZXhhY3RuJworICAgICBjb21tYW5kLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byB0ZWxsIGlmIGEgbmV3IGV4YWN0LW1hdGNoCisgICAgIGNoYXJhY3RlciBjYW4gYmUgYWRkZWQgdG8gdGhhdCBjb21tYW5kIG9yIGlmIHRoZSBjaGFyYWN0ZXIgcmVxdWlyZXMKKyAgICAgYSBuZXcgYGV4YWN0bicgY29tbWFuZC4gICovCisgIHVuc2lnbmVkIGNoYXIgKnBlbmRpbmdfZXhhY3QgPSAwOworCisgIC8qIEFkZHJlc3Mgb2Ygc3RhcnQgb2YgdGhlIG1vc3QgcmVjZW50bHkgZmluaXNoZWQgZXhwcmVzc2lvbi4KKyAgICAgVGhpcyB0ZWxscywgZS5nLiwgcG9zdGZpeCAqIHdoZXJlIHRvIGZpbmQgdGhlIHN0YXJ0IG9mIGl0cworICAgICBvcGVyYW5kLiAgUmVzZXQgYXQgdGhlIGJlZ2lubmluZyBvZiBncm91cHMgYW5kIGFsdGVybmF0aXZlcy4gICovCisgIHVuc2lnbmVkIGNoYXIgKmxhc3RzdGFydCA9IDA7CisKKyAgLyogQWRkcmVzcyBvZiBiZWdpbm5pbmcgb2YgcmVnZXhwLCBvciBpbnNpZGUgb2YgbGFzdCBncm91cC4gICovCisgIHVuc2lnbmVkIGNoYXIgKmJlZ2FsdDsKKworICAvKiBQbGFjZSBpbiB0aGUgdW5jb21waWxlZCBwYXR0ZXJuIChpLmUuLCB0aGUgeykgdG8KKyAgICAgd2hpY2ggdG8gZ28gYmFjayBpZiB0aGUgaW50ZXJ2YWwgaXMgaW52YWxpZC4gICovCisgIGNvbnN0IGNoYXIgKmJlZ19pbnRlcnZhbDsKKworICAvKiBBZGRyZXNzIG9mIHRoZSBwbGFjZSB3aGVyZSBhIGZvcndhcmQganVtcCBzaG91bGQgZ28gdG8gdGhlIGVuZCBvZgorICAgICB0aGUgY29udGFpbmluZyBleHByZXNzaW9uLiAgRWFjaCBhbHRlcm5hdGl2ZSBvZiBhbiBgb3InIC0tIGV4Y2VwdCB0aGUKKyAgICAgbGFzdCAtLSBlbmRzIHdpdGggYSBmb3J3YXJkIGp1bXAgb2YgdGhpcyBzb3J0LiAgKi8KKyAgdW5zaWduZWQgY2hhciAqZml4dXBfYWx0X2p1bXAgPSAwOworCisgIC8qIENvdW50cyBvcGVuLWdyb3VwcyBhcyB0aGV5IGFyZSBlbmNvdW50ZXJlZC4gIFJlbWVtYmVyZWQgZm9yIHRoZQorICAgICBtYXRjaGluZyBjbG9zZS1ncm91cCBvbiB0aGUgY29tcGlsZSBzdGFjaywgc28gdGhlIHNhbWUgcmVnaXN0ZXIKKyAgICAgbnVtYmVyIGlzIHB1dCBpbiB0aGUgc3RvcF9tZW1vcnkgYXMgdGhlIHN0YXJ0X21lbW9yeS4gICovCisgIHJlZ251bV90IHJlZ251bSA9IDA7CisKKyNpZmRlZiBERUJVRworICBERUJVR19QUklOVDEgKCJcbkNvbXBpbGluZyBwYXR0ZXJuOiAiKTsKKyAgaWYgKGRlYnVnKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGRlYnVnX2NvdW50OworCisgICAgICBmb3IgKGRlYnVnX2NvdW50ID0gMDsgZGVidWdfY291bnQgPCBzaXplOyBkZWJ1Z19jb3VudCsrKQorICAgICAgICBwdXRjaGFyIChwYXR0ZXJuW2RlYnVnX2NvdW50XSk7CisgICAgICBwdXRjaGFyICgnXG4nKTsKKyAgICB9CisjZW5kaWYgLyogREVCVUcgKi8KKworICAvKiBJbml0aWFsaXplIHRoZSBjb21waWxlIHN0YWNrLiAgKi8KKyAgY29tcGlsZV9zdGFjay5zdGFjayA9IFRBTExPQyAoSU5JVF9DT01QSUxFX1NUQUNLX1NJWkUsIGNvbXBpbGVfc3RhY2tfZWx0X3QpOworICBpZiAoY29tcGlsZV9zdGFjay5zdGFjayA9PSBOVUxMKQorICAgIHJldHVybiBSRUdfRVNQQUNFOworCisgIGNvbXBpbGVfc3RhY2suc2l6ZSA9IElOSVRfQ09NUElMRV9TVEFDS19TSVpFOworICBjb21waWxlX3N0YWNrLmF2YWlsID0gMDsKKworICAvKiBJbml0aWFsaXplIHRoZSBwYXR0ZXJuIGJ1ZmZlci4gICovCisgIGJ1ZnAtPnN5bnRheCA9IHN5bnRheDsKKyAgYnVmcC0+ZmFzdG1hcF9hY2N1cmF0ZSA9IDA7CisgIGJ1ZnAtPm5vdF9ib2wgPSBidWZwLT5ub3RfZW9sID0gMDsKKworICAvKiBTZXQgYHVzZWQnIHRvIHplcm8sIHNvIHRoYXQgaWYgd2UgcmV0dXJuIGFuIGVycm9yLCB0aGUgcGF0dGVybgorICAgICBwcmludGVyIChmb3IgZGVidWdnaW5nKSB3aWxsIHRoaW5rIHRoZXJlJ3Mgbm8gcGF0dGVybi4gIFdlIHJlc2V0IGl0CisgICAgIGF0IHRoZSBlbmQuICAqLworICBidWZwLT51c2VkID0gMDsKKworICAvKiBBbHdheXMgY291bnQgZ3JvdXBzLCB3aGV0aGVyIG9yIG5vdCBidWZwLT5ub19zdWIgaXMgc2V0LiAgKi8KKyAgYnVmcC0+cmVfbnN1YiA9IDA7CisKKyNpZiAhZGVmaW5lZCBlbWFjcyAmJiAhZGVmaW5lZCBTWU5UQVhfVEFCTEUKKyAgLyogSW5pdGlhbGl6ZSB0aGUgc3ludGF4IHRhYmxlLiAgKi8KKyAgIGluaXRfc3ludGF4X29uY2UgKCk7CisjZW5kaWYKKworICBpZiAoYnVmcC0+YWxsb2NhdGVkID09IDApCisgICAgeworICAgICAgaWYgKGJ1ZnAtPmJ1ZmZlcikKKwl7IC8qIElmIHplcm8gYWxsb2NhdGVkLCBidXQgYnVmZmVyIGlzIG5vbi1udWxsLCB0cnkgdG8gcmVhbGxvYworICAgICAgICAgICAgIGVub3VnaCBzcGFjZS4gIFRoaXMgbG9zZXMgaWYgYnVmZmVyJ3MgYWRkcmVzcyBpcyBib2d1cywgYnV0CisgICAgICAgICAgICAgdGhhdCBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LiAgKi8KKyAgICAgICAgICBSRVRBTExPQyAoYnVmcC0+YnVmZmVyLCBJTklUX0JVRl9TSVpFLCB1bnNpZ25lZCBjaGFyKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7IC8qIENhbGxlciBkaWQgbm90IGFsbG9jYXRlIGEgYnVmZmVyLiAgRG8gaXQgZm9yIHRoZW0uICAqLworICAgICAgICAgIGJ1ZnAtPmJ1ZmZlciA9IFRBTExPQyAoSU5JVF9CVUZfU0laRSwgdW5zaWduZWQgY2hhcik7CisgICAgICAgIH0KKyAgICAgIGlmICghYnVmcC0+YnVmZmVyKSBGUkVFX1NUQUNLX1JFVFVSTiAoUkVHX0VTUEFDRSk7CisKKyAgICAgIGJ1ZnAtPmFsbG9jYXRlZCA9IElOSVRfQlVGX1NJWkU7CisgICAgfQorCisgIGJlZ2FsdCA9IGIgPSBidWZwLT5idWZmZXI7CisKKyAgLyogTG9vcCB0aHJvdWdoIHRoZSB1bmNvbXBpbGVkIHBhdHRlcm4gdW50aWwgd2UncmUgYXQgdGhlIGVuZC4gICovCisgIHdoaWxlIChwICE9IHBlbmQpCisgICAgeworICAgICAgUEFURkVUQ0ggKGMpOworCisgICAgICBzd2l0Y2ggKGMpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAnXic6CisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCAgIC8qIElmIGF0IHN0YXJ0IG9mIHBhdHRlcm4sIGl0J3MgYW4gb3BlcmF0b3IuICAqLworICAgICAgICAgICAgICAgICAgIHAgPT0gcGF0dGVybiArIDEKKyAgICAgICAgICAgICAgICAgICAvKiBJZiBjb250ZXh0IGluZGVwZW5kZW50LCBpdCdzIGFuIG9wZXJhdG9yLiAgKi8KKyAgICAgICAgICAgICAgICB8fCBzeW50YXggJiBSRV9DT05URVhUX0lOREVQX0FOQ0hPUlMKKyAgICAgICAgICAgICAgICAgICAvKiBPdGhlcndpc2UsIGRlcGVuZHMgb24gd2hhdCdzIGNvbWUgYmVmb3JlLiAgKi8KKyAgICAgICAgICAgICAgICB8fCBhdF9iZWdsaW5lX2xvY19wIChwYXR0ZXJuLCBwLCBzeW50YXgpKQorICAgICAgICAgICAgICBCVUZfUFVTSCAoYmVnbGluZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSAnJCc6CisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCAgIC8qIElmIGF0IGVuZCBvZiBwYXR0ZXJuLCBpdCdzIGFuIG9wZXJhdG9yLiAgKi8KKyAgICAgICAgICAgICAgICAgICBwID09IHBlbmQKKyAgICAgICAgICAgICAgICAgICAvKiBJZiBjb250ZXh0IGluZGVwZW5kZW50LCBpdCdzIGFuIG9wZXJhdG9yLiAgKi8KKyAgICAgICAgICAgICAgICB8fCBzeW50YXggJiBSRV9DT05URVhUX0lOREVQX0FOQ0hPUlMKKyAgICAgICAgICAgICAgICAgICAvKiBPdGhlcndpc2UsIGRlcGVuZHMgb24gd2hhdCdzIG5leHQuICAqLworICAgICAgICAgICAgICAgIHx8IGF0X2VuZGxpbmVfbG9jX3AgKHAsIHBlbmQsIHN5bnRheCkpCisgICAgICAgICAgICAgICBCVUZfUFVTSCAoZW5kbGluZSk7CisgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKKyAgICAgICAgICAgfQorICAgICAgICAgICBicmVhazsKKworCisJY2FzZSAnKyc6CisgICAgICAgIGNhc2UgJz8nOgorICAgICAgICAgIGlmICgoc3ludGF4ICYgUkVfQktfUExVU19RTSkKKyAgICAgICAgICAgICAgfHwgKHN5bnRheCAmIFJFX0xJTUlURURfT1BTKSkKKyAgICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CisgICAgICAgIGhhbmRsZV9wbHVzOgorICAgICAgICBjYXNlICcqJzoKKyAgICAgICAgICAvKiBJZiB0aGVyZSBpcyBubyBwcmV2aW91cyBwYXR0ZXJuLi4uICovCisgICAgICAgICAgaWYgKCFsYXN0c3RhcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChzeW50YXggJiBSRV9DT05URVhUX0lOVkFMSURfT1BTKQorICAgICAgICAgICAgICAgIEZSRUVfU1RBQ0tfUkVUVVJOIChSRUdfQkFEUlBUKTsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoIShzeW50YXggJiBSRV9DT05URVhUX0lOREVQX09QUykpCisgICAgICAgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEFyZSB3ZSBvcHRpbWl6aW5nIHRoaXMganVtcD8gICovCisgICAgICAgICAgICBib29sZWFuIGtlZXBfc3RyaW5nX3AgPSBmYWxzZTsKKworICAgICAgICAgICAgLyogMSBtZWFucyB6ZXJvIChtYW55KSBtYXRjaGVzIGlzIGFsbG93ZWQuICAqLworICAgICAgICAgICAgY2hhciB6ZXJvX3RpbWVzX29rID0gMCwgbWFueV90aW1lc19vayA9IDA7CisKKyAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIGEgc2VxdWVuY2Ugb2YgcmVwZXRpdGlvbiBjaGFycywgY29sbGFwc2UgaXQKKyAgICAgICAgICAgICAgIGRvd24gdG8ganVzdCBvbmUgKHRoZSByaWdodCBvbmUpLiAgV2UgY2FuJ3QgY29tYmluZQorICAgICAgICAgICAgICAgaW50ZXJ2YWwgb3BlcmF0b3JzIHdpdGggdGhlc2UgYmVjYXVzZSBvZiwgZS5nLiwgYGF7Mn0qJywKKyAgICAgICAgICAgICAgIHdoaWNoIHNob3VsZCBvbmx5IG1hdGNoIGFuIGV2ZW4gbnVtYmVyIG9mIGBhJ3MuICAqLworCisgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemVyb190aW1lc19vayB8PSBjICE9ICcrJzsKKyAgICAgICAgICAgICAgICBtYW55X3RpbWVzX29rIHw9IGMgIT0gJz8nOworCisgICAgICAgICAgICAgICAgaWYgKHAgPT0gcGVuZCkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgUEFURkVUQ0ggKGMpOworCisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyonCisgICAgICAgICAgICAgICAgICAgIHx8ICghKHN5bnRheCAmIFJFX0JLX1BMVVNfUU0pICYmIChjID09ICcrJyB8fCBjID09ICc/JykpKQorICAgICAgICAgICAgICAgICAgOworCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3ludGF4ICYgUkVfQktfUExVU19RTSAgJiYgIGMgPT0gJ1xcJykKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gcGVuZCkgRlJFRV9TVEFDS19SRVRVUk4gKFJFR19FRVNDQVBFKTsKKworICAgICAgICAgICAgICAgICAgICBQQVRGRVRDSCAoYzEpOworICAgICAgICAgICAgICAgICAgICBpZiAoIShjMSA9PSAnKycgfHwgYzEgPT0gJz8nKSkKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQQVRVTkZFVENIOworICAgICAgICAgICAgICAgICAgICAgICAgUEFUVU5GRVRDSDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjID0gYzE7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQQVRVTkZFVENIOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIElmIHdlIGdldCBoZXJlLCB3ZSBmb3VuZCBhbm90aGVyIHJlcGVhdCBjaGFyYWN0ZXIuICAqLworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTdGFyLCBldGMuIGFwcGxpZWQgdG8gYW4gZW1wdHkgcGF0dGVybiBpcyBlcXVpdmFsZW50CisgICAgICAgICAgICAgICB0byBhbiBlbXB0eSBwYXR0ZXJuLiAgKi8KKyAgICAgICAgICAgIGlmICghbGFzdHN0YXJ0KQorICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLyogTm93IHdlIGtub3cgd2hldGhlciBvciBub3QgemVybyBtYXRjaGVzIGlzIGFsbG93ZWQKKyAgICAgICAgICAgICAgIGFuZCBhbHNvIHdoZXRoZXIgb3Igbm90IHR3byBvciBtb3JlIG1hdGNoZXMgaXMgYWxsb3dlZC4gICovCisgICAgICAgICAgICBpZiAobWFueV90aW1lc19vaykKKyAgICAgICAgICAgICAgeyAvKiBNb3JlIHRoYW4gb25lIHJlcGV0aXRpb24gaXMgYWxsb3dlZCwgc28gcHV0IGluIGF0IHRoZQorICAgICAgICAgICAgICAgICAgIGVuZCBhIGJhY2t3YXJkIHJlbGF0aXZlIGp1bXAgZnJvbSBgYicgdG8gYmVmb3JlIHRoZSBuZXh0CisgICAgICAgICAgICAgICAgICAganVtcCB3ZSdyZSBnb2luZyB0byBwdXQgaW4gYmVsb3cgKHdoaWNoIGp1bXBzIGZyb20KKyAgICAgICAgICAgICAgICAgICBsYXN0c3RhcnQgdG8gYWZ0ZXIgdGhpcyBqdW1wKS4KKworICAgICAgICAgICAgICAgICAgIEJ1dCBpZiB3ZSBhcmUgYXQgdGhlIGAqJyBpbiB0aGUgZXhhY3Qgc2VxdWVuY2UgYC4qXG4nLAorICAgICAgICAgICAgICAgICAgIGluc2VydCBhbiB1bmNvbmRpdGlvbmFsIGp1bXAgYmFja3dhcmRzIHRvIHRoZSAuLAorICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9vcC4gIFRoaXMgd2F5IHdlIG9ubHkKKyAgICAgICAgICAgICAgICAgICBwdXNoIGEgZmFpbHVyZSBwb2ludCBvbmNlLCBpbnN0ZWFkIG9mIGV2ZXJ5IHRpbWUKKyAgICAgICAgICAgICAgICAgICB0aHJvdWdoIHRoZSBsb29wLiAgKi8KKyAgICAgICAgICAgICAgICBhc3NlcnQgKHAgLSAxID4gcGF0dGVybik7CisKKyAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgc3BhY2UgZm9yIHRoZSBqdW1wLiAgKi8KKyAgICAgICAgICAgICAgICBHRVRfQlVGRkVSX1NQQUNFICgzKTsKKworICAgICAgICAgICAgICAgIC8qIFdlIGtub3cgd2UgYXJlIG5vdCBhdCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBwYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgIGJlY2F1c2UgbGFzdHN0YXJ0IHdhcyBub256ZXJvLiAgQW5kIHdlJ3ZlIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRlZCBgcCcsIGJ5IHRoZSB3YXksIHRvIGJlIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICB0aGUgYConLiAgRG8gd2UgaGF2ZSB0byBkbyBzb21ldGhpbmcgYW5hbG9nb3VzIGhlcmUKKyAgICAgICAgICAgICAgICAgICBmb3IgbnVsbCBieXRlcywgYmVjYXVzZSBvZiBSRV9ET1RfTk9UX05VTEw/ICAqLworICAgICAgICAgICAgICAgIGlmIChUUkFOU0xBVEUgKCoocCAtIDIpKSA9PSBUUkFOU0xBVEUgKCcuJykKKwkJICAgICYmIHplcm9fdGltZXNfb2sKKyAgICAgICAgICAgICAgICAgICAgJiYgcCA8IHBlbmQgJiYgVFJBTlNMQVRFICgqcCkgPT0gVFJBTlNMQVRFICgnXG4nKQorICAgICAgICAgICAgICAgICAgICAmJiAhKHN5bnRheCAmIFJFX0RPVF9ORVdMSU5FKSkKKyAgICAgICAgICAgICAgICAgIHsgLyogV2UgaGF2ZSAuKlxuLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgU1RPUkVfSlVNUCAoanVtcCwgYiwgbGFzdHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAga2VlcF9zdHJpbmdfcCA9IHRydWU7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgLyogQW55dGhpbmcgZWxzZS4gICovCisgICAgICAgICAgICAgICAgICBTVE9SRV9KVU1QIChtYXliZV9wb3BfanVtcCwgYiwgbGFzdHN0YXJ0IC0gMyk7CisKKyAgICAgICAgICAgICAgICAvKiBXZSd2ZSBhZGRlZCBtb3JlIHN0dWZmIHRvIHRoZSBidWZmZXIuICAqLworICAgICAgICAgICAgICAgIGIgKz0gMzsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBPbiBmYWlsdXJlLCBqdW1wIGZyb20gbGFzdHN0YXJ0IHRvIGIgKyAzLCB3aGljaCB3aWxsIGJlIHRoZQorICAgICAgICAgICAgICAgZW5kIG9mIHRoZSBidWZmZXIgYWZ0ZXIgdGhpcyBqdW1wIGlzIGluc2VydGVkLiAgKi8KKyAgICAgICAgICAgIEdFVF9CVUZGRVJfU1BBQ0UgKDMpOworICAgICAgICAgICAgSU5TRVJUX0pVTVAgKGtlZXBfc3RyaW5nX3AgPyBvbl9mYWlsdXJlX2tlZXBfc3RyaW5nX2p1bXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb25fZmFpbHVyZV9qdW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RzdGFydCwgYiArIDMpOworICAgICAgICAgICAgcGVuZGluZ19leGFjdCA9IDA7CisgICAgICAgICAgICBiICs9IDM7CisKKyAgICAgICAgICAgIGlmICghemVyb190aW1lc19vaykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEF0IGxlYXN0IG9uZSByZXBldGl0aW9uIGlzIHJlcXVpcmVkLCBzbyBpbnNlcnQgYQorICAgICAgICAgICAgICAgICAgIGBkdW1teV9mYWlsdXJlX2p1bXAnIGJlZm9yZSB0aGUgaW5pdGlhbAorICAgICAgICAgICAgICAgICAgIGBvbl9mYWlsdXJlX2p1bXAnIGluc3RydWN0aW9uIG9mIHRoZSBsb29wLiBUaGlzCisgICAgICAgICAgICAgICAgICAgZWZmZWN0cyBhIHNraXAgb3ZlciB0aGF0IGluc3RydWN0aW9uIHRoZSBmaXJzdCB0aW1lCisgICAgICAgICAgICAgICAgICAgd2UgaGl0IHRoYXQgbG9vcC4gICovCisgICAgICAgICAgICAgICAgR0VUX0JVRkZFUl9TUEFDRSAoMyk7CisgICAgICAgICAgICAgICAgSU5TRVJUX0pVTVAgKGR1bW15X2ZhaWx1cmVfanVtcCwgbGFzdHN0YXJ0LCBsYXN0c3RhcnQgKyA2KTsKKyAgICAgICAgICAgICAgICBiICs9IDM7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwkgIGJyZWFrOworCisKKwljYXNlICcuJzoKKyAgICAgICAgICBsYXN0c3RhcnQgPSBiOworICAgICAgICAgIEJVRl9QVVNIIChhbnljaGFyKTsKKyAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgJ1snOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFkX2NoYXJfY2xhc3MgPSBmYWxzZTsKKworICAgICAgICAgICAgaWYgKHAgPT0gcGVuZCkgRlJFRV9TVEFDS19SRVRVUk4gKFJFR19FQlJBQ0spOworCisgICAgICAgICAgICAvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGVub3VnaCBzcGFjZSB0byBwdXNoIGEgY2hhcnNldDogdGhlCisgICAgICAgICAgICAgICBvcGNvZGUsIHRoZSBsZW5ndGggY291bnQsIGFuZCB0aGUgYml0c2V0OyAzNCBieXRlcyBpbiBhbGwuICAqLworCSAgICBHRVRfQlVGRkVSX1NQQUNFICgzNCk7CisKKyAgICAgICAgICAgIGxhc3RzdGFydCA9IGI7CisKKyAgICAgICAgICAgIC8qIFdlIHRlc3QgYCpwID09ICdeJyB0d2ljZSwgaW5zdGVhZCBvZiB1c2luZyBhbiBpZgorICAgICAgICAgICAgICAgc3RhdGVtZW50LCBzbyB3ZSBvbmx5IG5lZWQgb25lIEJVRl9QVVNILiAgKi8KKyAgICAgICAgICAgIEJVRl9QVVNIICgqcCA9PSAnXicgPyBjaGFyc2V0X25vdCA6IGNoYXJzZXQpOworICAgICAgICAgICAgaWYgKCpwID09ICdeJykKKyAgICAgICAgICAgICAgcCsrOworCisgICAgICAgICAgICAvKiBSZW1lbWJlciB0aGUgZmlyc3QgcG9zaXRpb24gaW4gdGhlIGJyYWNrZXQgZXhwcmVzc2lvbi4gICovCisgICAgICAgICAgICBwMSA9IHA7CisKKyAgICAgICAgICAgIC8qIFB1c2ggdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYml0bWFwLiAgKi8KKyAgICAgICAgICAgIEJVRl9QVVNIICgoMSA8PCBCWVRFV0lEVEgpIC8gQllURVdJRFRIKTsKKworICAgICAgICAgICAgLyogQ2xlYXIgdGhlIHdob2xlIG1hcC4gICovCisgICAgICAgICAgICBiemVybyAoYiwgKDEgPDwgQllURVdJRFRIKSAvIEJZVEVXSURUSCk7CisKKyAgICAgICAgICAgIC8qIGNoYXJzZXRfbm90IG1hdGNoZXMgbmV3bGluZSBhY2NvcmRpbmcgdG8gYSBzeW50YXggYml0LiAgKi8KKyAgICAgICAgICAgIGlmICgocmVfb3Bjb2RlX3QpIGJbLTJdID09IGNoYXJzZXRfbm90CisgICAgICAgICAgICAgICAgJiYgKHN5bnRheCAmIFJFX0hBVF9MSVNUU19OT1RfTkVXTElORSkpCisgICAgICAgICAgICAgIFNFVF9MSVNUX0JJVCAoJ1xuJyk7CisKKyAgICAgICAgICAgIC8qIFJlYWQgaW4gY2hhcmFjdGVycyBhbmQgcmFuZ2VzLCBzZXR0aW5nIG1hcCBiaXRzLiAgKi8KKyAgICAgICAgICAgIGZvciAoOzspCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBwZW5kKSBGUkVFX1NUQUNLX1JFVFVSTiAoUkVHX0VCUkFDSyk7CisKKyAgICAgICAgICAgICAgICBQQVRGRVRDSCAoYyk7CisKKyAgICAgICAgICAgICAgICAvKiBcIG1pZ2h0IGVzY2FwZSBjaGFyYWN0ZXJzIGluc2lkZSBbLi4uXSBhbmQgW14uLi5dLiAgKi8KKyAgICAgICAgICAgICAgICBpZiAoKHN5bnRheCAmIFJFX0JBQ0tTTEFTSF9FU0NBUEVfSU5fTElTVFMpICYmIGMgPT0gJ1xcJykKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gcGVuZCkgRlJFRV9TVEFDS19SRVRVUk4gKFJFR19FRVNDQVBFKTsKKworICAgICAgICAgICAgICAgICAgICBQQVRGRVRDSCAoYzEpOworICAgICAgICAgICAgICAgICAgICBTRVRfTElTVF9CSVQgKGMxKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBDb3VsZCBiZSB0aGUgZW5kIG9mIHRoZSBicmFja2V0IGV4cHJlc3Npb24uICBJZiBpdCdzCisgICAgICAgICAgICAgICAgICAgbm90IChpLmUuLCB3aGVuIHRoZSBicmFja2V0IGV4cHJlc3Npb24gaXMgYFtdJyBzbworICAgICAgICAgICAgICAgICAgIGZhciksIHRoZSAnXScgY2hhcmFjdGVyIGJpdCBnZXRzIHNldCB3YXkgYmVsb3cuICAqLworICAgICAgICAgICAgICAgIGlmIChjID09ICddJyAmJiBwICE9IHAxICsgMSkKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLyogTG9vayBhaGVhZCB0byBzZWUgaWYgaXQncyBhIHJhbmdlIHdoZW4gdGhlIGxhc3QgdGhpbmcKKyAgICAgICAgICAgICAgICAgICB3YXMgYSBjaGFyYWN0ZXIgY2xhc3MuICAqLworICAgICAgICAgICAgICAgIGlmIChoYWRfY2hhcl9jbGFzcyAmJiBjID09ICctJyAmJiAqcCAhPSAnXScpCisgICAgICAgICAgICAgICAgICBGUkVFX1NUQUNLX1JFVFVSTiAoUkVHX0VSQU5HRSk7CisKKyAgICAgICAgICAgICAgICAvKiBMb29rIGFoZWFkIHRvIHNlZSBpZiBpdCdzIGEgcmFuZ2Ugd2hlbiB0aGUgbGFzdCB0aGluZworICAgICAgICAgICAgICAgICAgIHdhcyBhIGNoYXJhY3RlcjogaWYgdGhpcyBpcyBhIGh5cGhlbiBub3QgYXQgdGhlCisgICAgICAgICAgICAgICAgICAgYmVnaW5uaW5nIG9yIHRoZSBlbmQgb2YgYSBsaXN0LCB0aGVuIGl0J3MgdGhlIHJhbmdlCisgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IuICAqLworICAgICAgICAgICAgICAgIGlmIChjID09ICctJworICAgICAgICAgICAgICAgICAgICAmJiAhKHAgLSAyID49IHBhdHRlcm4gJiYgcFstMl0gPT0gJ1snKQorICAgICAgICAgICAgICAgICAgICAmJiAhKHAgLSAzID49IHBhdHRlcm4gJiYgcFstM10gPT0gJ1snICYmIHBbLTJdID09ICdeJykKKyAgICAgICAgICAgICAgICAgICAgJiYgKnAgIT0gJ10nKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZWdfZXJyY29kZV90IHJldAorICAgICAgICAgICAgICAgICAgICAgID0gY29tcGlsZV9yYW5nZSAoJnAsIHBlbmQsIHRyYW5zbGF0ZSwgc3ludGF4LCBiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBSRUdfTk9FUlJPUikgRlJFRV9TVEFDS19SRVRVUk4gKHJldCk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwWzBdID09ICctJyAmJiBwWzFdICE9ICddJykKKyAgICAgICAgICAgICAgICAgIHsgLyogVGhpcyBoYW5kbGVzIHJhbmdlcyBtYWRlIHVwIG9mIGNoYXJhY3RlcnMgb25seS4gICovCisgICAgICAgICAgICAgICAgICAgIHJlZ19lcnJjb2RlX3QgcmV0OworCisJCSAgICAvKiBNb3ZlIHBhc3QgdGhlIGAtJy4gICovCisgICAgICAgICAgICAgICAgICAgIFBBVEZFVENIIChjMSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gY29tcGlsZV9yYW5nZSAoJnAsIHBlbmQsIHRyYW5zbGF0ZSwgc3ludGF4LCBiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBSRUdfTk9FUlJPUikgRlJFRV9TVEFDS19SRVRVUk4gKHJldCk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBTZWUgaWYgd2UncmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHBvc3NpYmxlIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgICAgIGNsYXNzLiAgKi8KKworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN5bnRheCAmIFJFX0NIQVJfQ0xBU1NFUyAmJiBjID09ICdbJyAmJiAqcCA9PSAnOicpCisgICAgICAgICAgICAgICAgICB7IC8qIExlYXZlIHJvb20gZm9yIHRoZSBudWxsLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgY2hhciBzdHJbQ0hBUl9DTEFTU19NQVhfTEVOR1RIICsgMV07CisKKyAgICAgICAgICAgICAgICAgICAgUEFURkVUQ0ggKGMpOworICAgICAgICAgICAgICAgICAgICBjMSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgLyogSWYgcGF0dGVybiBpcyBgW1s6Jy4gICovCisgICAgICAgICAgICAgICAgICAgIGlmIChwID09IHBlbmQpIEZSRUVfU1RBQ0tfUkVUVVJOIChSRUdfRUJSQUNLKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBBVEZFVENIIChjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYyA9PSAnOicgJiYgKnAgPT0gJ10nKSB8fCBwID09IHBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjMSA9PSBDSEFSX0NMQVNTX01BWF9MRU5HVEgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyW2MxKytdID0gYzsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0cltjMV0gPSAnXDAnOworCisgICAgICAgICAgICAgICAgICAgIC8qIElmIGlzbid0IGEgd29yZCBicmFja2V0ZWQgYnkgYFs6JyBhbmQgYDpdJzoKKyAgICAgICAgICAgICAgICAgICAgICAgdW5kbyB0aGUgZW5kaW5nIGNoYXJhY3RlciwgdGhlIGxldHRlcnMsIGFuZCBsZWF2ZQorICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGVhZGluZyBgOicgYW5kIGBbJyAoYnV0IHNldCBiaXRzIGZvciB0aGVtKS4gICovCisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICc6JyAmJiAqcCA9PSAnXScpCisgICAgICAgICAgICAgICAgICAgICAgeworLyogQ1lHTlVTIExPQ0FMOiBTa2lwIHRoaXMgY29kZSBpZiB3ZSBkb24ndCBoYXZlIGJ0b3djKCkuICBidG93YygpIGlzICovCisvKiBkZWZpbmVkIGluIHRoZSAxOTk0IEFtZW5kbWVudCAxIHRvIElTTyBDIGFuZCBtYXkgbm90IGJlIHByZXNlbnQgb24gKi8KKy8qIHN5c3RlbXMgd2hlcmUgd2UgaGF2ZSB3Y2hhci5oIGFuZCB3Y3R5cGUuaC4gICAqLworI2lmIGRlZmluZWQgX0xJQkMgfHwgKGRlZmluZWQgSEFWRV9XQ1RZUEVfSCAmJiBkZWZpbmVkIEhBVkVfV0NIQVJfSCAmJiBkZWZpbmVkIEhBVkVfQlRPV0MpCisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzX2xvd2VyID0gU1RSRVEgKHN0ciwgImxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzX3VwcGVyID0gU1RSRVEgKHN0ciwgInVwcGVyIik7CisJCQl3Y3R5cGVfdCB3dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaDsKKworCQkJd3QgPSBJU19DSEFSX0NMQVNTIChzdHIpOworCQkJaWYgKHd0ID09IDApCisJCQkgIEZSRUVfU1RBQ0tfUkVUVVJOIChSRUdfRUNUWVBFKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhyb3cgYXdheSB0aGUgXSBhdCB0aGUgZW5kIG9mIHRoZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFBBVEZFVENIIChjKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT0gcGVuZCkgRlJFRV9TVEFDS19SRVRVUk4gKFJFR19FQlJBQ0spOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCAxIDw8IEJZVEVXSURUSDsgKytjaCkKKwkJCSAgeworIyBpZmRlZiBfTElCQworCQkJICAgIGlmIChfX2lzd2N0eXBlIChfX2J0b3djIChjaCksIHd0KSkKKwkJCSAgICAgIFNFVF9MSVNUX0JJVCAoY2gpOworI2Vsc2UKKwkJCSAgICBpZiAoaXN3Y3R5cGUgKGJ0b3djIChjaCksIHd0KSkKKwkJCSAgICAgIFNFVF9MSVNUX0JJVCAoY2gpOworI2VuZGlmCisKKwkJCSAgICBpZiAodHJhbnNsYXRlICYmIChpc191cHBlciB8fCBpc19sb3dlcikKKwkJCQkmJiAoSVNVUFBFUiAoY2gpIHx8IElTTE9XRVIgKGNoKSkpCisJCQkgICAgICBTRVRfTElTVF9CSVQgKGNoKTsKKwkJCSAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBoYWRfY2hhcl9jbGFzcyA9IHRydWU7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc19hbG51bSA9IFNUUkVRIChzdHIsICJhbG51bSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc19hbHBoYSA9IFNUUkVRIChzdHIsICJhbHBoYSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc19ibGFuayA9IFNUUkVRIChzdHIsICJibGFuayIpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc19jbnRybCA9IFNUUkVRIChzdHIsICJjbnRybCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc19kaWdpdCA9IFNUUkVRIChzdHIsICJkaWdpdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc19ncmFwaCA9IFNUUkVRIChzdHIsICJncmFwaCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc19sb3dlciA9IFNUUkVRIChzdHIsICJsb3dlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc19wcmludCA9IFNUUkVRIChzdHIsICJwcmludCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc19wdW5jdCA9IFNUUkVRIChzdHIsICJwdW5jdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc19zcGFjZSA9IFNUUkVRIChzdHIsICJzcGFjZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc191cHBlciA9IFNUUkVRIChzdHIsICJ1cHBlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc194ZGlnaXQgPSBTVFJFUSAoc3RyLCAieGRpZ2l0Iik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSVNfQ0hBUl9DTEFTUyAoc3RyKSkKKwkJCSAgRlJFRV9TVEFDS19SRVRVUk4gKFJFR19FQ1RZUEUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaHJvdyBhd2F5IHRoZSBdIGF0IHRoZSBlbmQgb2YgdGhlIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgUEFURkVUQ0ggKGMpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCA9PSBwZW5kKSBGUkVFX1NUQUNLX1JFVFVSTiAoUkVHX0VCUkFDSyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IDEgPDwgQllURVdJRFRIOyBjaCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICB7CisJCQkgICAgLyogVGhpcyB3YXMgc3BsaXQgaW50byAzIGlmJ3MgdG8KKwkJCSAgICAgICBhdm9pZCBhbiBhcmJpdHJhcnkgbGltaXQgaW4gc29tZSBjb21waWxlci4gICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAgIChpc19hbG51bSAgJiYgSVNBTE5VTSAoY2gpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaXNfYWxwaGEgICYmIElTQUxQSEEgKGNoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGlzX2JsYW5rICAmJiBJU0JMQU5LIChjaCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChpc19jbnRybCAgJiYgSVNDTlRSTCAoY2gpKSkKKwkJCSAgICAgIFNFVF9MSVNUX0JJVCAoY2gpOworCQkJICAgIGlmICggICAoaXNfZGlnaXQgICYmIElTRElHSVQgKGNoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGlzX2dyYXBoICAmJiBJU0dSQVBIIChjaCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChpc19sb3dlciAgJiYgSVNMT1dFUiAoY2gpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaXNfcHJpbnQgICYmIElTUFJJTlQgKGNoKSkpCisJCQkgICAgICBTRVRfTElTVF9CSVQgKGNoKTsKKwkJCSAgICBpZiAoICAgKGlzX3B1bmN0ICAmJiBJU1BVTkNUIChjaCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChpc19zcGFjZSAgJiYgSVNTUEFDRSAoY2gpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaXNfdXBwZXIgICYmIElTVVBQRVIgKGNoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGlzX3hkaWdpdCAmJiBJU1hESUdJVCAoY2gpKSkKKwkJCSAgICAgIFNFVF9MSVNUX0JJVCAoY2gpOworCQkJICAgIGlmICggICB0cmFuc2xhdGUgJiYgKGlzX3VwcGVyIHx8IGlzX2xvd2VyKQorCQkJCSYmIChJU1VQUEVSIChjaCkgfHwgSVNMT1dFUiAoY2gpKSkKKwkJCSAgICAgIFNFVF9MSVNUX0JJVCAoY2gpOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBoYWRfY2hhcl9jbGFzcyA9IHRydWU7CisjZW5kaWYJLyogbGliYyB8fCB3Y3R5cGUuaCAqLworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMxKys7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYzEtLSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUEFUVU5GRVRDSDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9MSVNUX0JJVCAoJ1snKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9MSVNUX0JJVCAoJzonKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhZF9jaGFyX2NsYXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGFkX2NoYXJfY2xhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgU0VUX0xJU1RfQklUIChjKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBEaXNjYXJkIGFueSAobm9uKW1hdGNoaW5nIGxpc3QgYnl0ZXMgdGhhdCBhcmUgYWxsIDAgYXQgdGhlCisgICAgICAgICAgICAgICBlbmQgb2YgdGhlIG1hcC4gIERlY3JlYXNlIHRoZSBtYXAtbGVuZ3RoIGJ5dGUgdG9vLiAgKi8KKyAgICAgICAgICAgIHdoaWxlICgoaW50KSBiWy0xXSA+IDAgJiYgYltiWy0xXSAtIDFdID09IDApCisgICAgICAgICAgICAgIGJbLTFdLS07CisgICAgICAgICAgICBiICs9IGJbLTFdOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworCisJY2FzZSAnKCc6CisgICAgICAgICAgaWYgKHN5bnRheCAmIFJFX05PX0JLX1BBUkVOUykKKyAgICAgICAgICAgIGdvdG8gaGFuZGxlX29wZW47CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKKworCisgICAgICAgIGNhc2UgJyknOgorICAgICAgICAgIGlmIChzeW50YXggJiBSRV9OT19CS19QQVJFTlMpCisgICAgICAgICAgICBnb3RvIGhhbmRsZV9jbG9zZTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOworCisKKyAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgIGlmIChzeW50YXggJiBSRV9ORVdMSU5FX0FMVCkKKyAgICAgICAgICAgIGdvdG8gaGFuZGxlX2FsdDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOworCisKKwljYXNlICd8JzoKKyAgICAgICAgICBpZiAoc3ludGF4ICYgUkVfTk9fQktfVkJBUikKKyAgICAgICAgICAgIGdvdG8gaGFuZGxlX2FsdDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOworCisKKyAgICAgICAgY2FzZSAneyc6CisgICAgICAgICAgIGlmIChzeW50YXggJiBSRV9JTlRFUlZBTFMgJiYgc3ludGF4ICYgUkVfTk9fQktfQlJBQ0VTKQorICAgICAgICAgICAgIGdvdG8gaGFuZGxlX2ludGVydmFsOworICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKKworCisgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICBpZiAocCA9PSBwZW5kKSBGUkVFX1NUQUNLX1JFVFVSTiAoUkVHX0VFU0NBUEUpOworCisgICAgICAgICAgLyogRG8gbm90IHRyYW5zbGF0ZSB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBcLCBzbyB0aGF0IHdlIGNhbgorICAgICAgICAgICAgIGRpc3Rpbmd1aXNoLCBlLmcuLCBcQiBmcm9tIFxiLCBldmVuIGlmIHdlIG5vcm1hbGx5IHdvdWxkCisgICAgICAgICAgICAgdHJhbnNsYXRlLCBlLmcuLCBCIHRvIGIuICAqLworICAgICAgICAgIFBBVEZFVENIX1JBVyAoYyk7CisKKyAgICAgICAgICBzd2l0Y2ggKGMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICcoJzoKKyAgICAgICAgICAgICAgaWYgKHN5bnRheCAmIFJFX05PX0JLX1BBUkVOUykKKyAgICAgICAgICAgICAgICBnb3RvIG5vcm1hbF9iYWNrc2xhc2g7CisKKyAgICAgICAgICAgIGhhbmRsZV9vcGVuOgorICAgICAgICAgICAgICBidWZwLT5yZV9uc3ViKys7CisgICAgICAgICAgICAgIHJlZ251bSsrOworCisgICAgICAgICAgICAgIGlmIChDT01QSUxFX1NUQUNLX0ZVTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgUkVUQUxMT0MgKGNvbXBpbGVfc3RhY2suc3RhY2ssIGNvbXBpbGVfc3RhY2suc2l6ZSA8PCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVfc3RhY2tfZWx0X3QpOworICAgICAgICAgICAgICAgICAgaWYgKGNvbXBpbGVfc3RhY2suc3RhY2sgPT0gTlVMTCkgcmV0dXJuIFJFR19FU1BBQ0U7CisKKyAgICAgICAgICAgICAgICAgIGNvbXBpbGVfc3RhY2suc2l6ZSA8PD0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogVGhlc2UgYXJlIHRoZSB2YWx1ZXMgdG8gcmVzdG9yZSB3aGVuIHdlIGhpdCBlbmQgb2YgdGhpcworICAgICAgICAgICAgICAgICBncm91cC4gIFRoZXkgYXJlIGFsbCByZWxhdGl2ZSBvZmZzZXRzLCBzbyB0aGF0IGlmIHRoZQorICAgICAgICAgICAgICAgICB3aG9sZSBwYXR0ZXJuIG1vdmVzIGJlY2F1c2Ugb2YgcmVhbGxvYywgdGhleSB3aWxsIHN0aWxsCisgICAgICAgICAgICAgICAgIGJlIHZhbGlkLiAgKi8KKyAgICAgICAgICAgICAgQ09NUElMRV9TVEFDS19UT1AuYmVnYWx0X29mZnNldCA9IGJlZ2FsdCAtIGJ1ZnAtPmJ1ZmZlcjsKKyAgICAgICAgICAgICAgQ09NUElMRV9TVEFDS19UT1AuZml4dXBfYWx0X2p1bXAKKyAgICAgICAgICAgICAgICA9IGZpeHVwX2FsdF9qdW1wID8gZml4dXBfYWx0X2p1bXAgLSBidWZwLT5idWZmZXIgKyAxIDogMDsKKyAgICAgICAgICAgICAgQ09NUElMRV9TVEFDS19UT1AubGFzdHN0YXJ0X29mZnNldCA9IGIgLSBidWZwLT5idWZmZXI7CisgICAgICAgICAgICAgIENPTVBJTEVfU1RBQ0tfVE9QLnJlZ251bSA9IHJlZ251bTsKKworICAgICAgICAgICAgICAvKiBXZSB3aWxsIGV2ZW50dWFsbHkgcmVwbGFjZSB0aGUgMCB3aXRoIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICAgZ3JvdXBzIGlubmVyIHRvIHRoaXMgb25lLiAgQnV0IGRvIG5vdCBwdXNoIGEKKyAgICAgICAgICAgICAgICAgc3RhcnRfbWVtb3J5IGZvciBncm91cHMgYmV5b25kIHRoZSBsYXN0IG9uZSB3ZSBjYW4KKyAgICAgICAgICAgICAgICAgcmVwcmVzZW50IGluIHRoZSBjb21waWxlZCBwYXR0ZXJuLiAgKi8KKyAgICAgICAgICAgICAgaWYgKHJlZ251bSA8PSBNQVhfUkVHTlVNKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIENPTVBJTEVfU1RBQ0tfVE9QLmlubmVyX2dyb3VwX29mZnNldCA9IGIgLSBidWZwLT5idWZmZXIgKyAyOworICAgICAgICAgICAgICAgICAgQlVGX1BVU0hfMyAoc3RhcnRfbWVtb3J5LCByZWdudW0sIDApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjb21waWxlX3N0YWNrLmF2YWlsKys7CisKKyAgICAgICAgICAgICAgZml4dXBfYWx0X2p1bXAgPSAwOworICAgICAgICAgICAgICBsYXN0c3RhcnQgPSAwOworICAgICAgICAgICAgICBiZWdhbHQgPSBiOworCSAgICAgIC8qIElmIHdlJ3ZlIHJlYWNoZWQgTUFYX1JFR05VTSBncm91cHMsIHRoZW4gdGhpcyBvcGVuCisJCSB3b24ndCBhY3R1YWxseSBnZW5lcmF0ZSBhbnkgY29kZSwgc28gd2UnbGwgaGF2ZSB0bworCQkgY2xlYXIgcGVuZGluZ19leGFjdCBleHBsaWNpdGx5LiAgKi8KKwkgICAgICBwZW5kaW5nX2V4YWN0ID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgY2FzZSAnKSc6CisgICAgICAgICAgICAgIGlmIChzeW50YXggJiBSRV9OT19CS19QQVJFTlMpIGdvdG8gbm9ybWFsX2JhY2tzbGFzaDsKKworICAgICAgICAgICAgICBpZiAoQ09NUElMRV9TVEFDS19FTVBUWSkKKwkJeworCQkgIGlmIChzeW50YXggJiBSRV9VTk1BVENIRURfUklHSFRfUEFSRU5fT1JEKQorCQkgICAgZ290byBub3JtYWxfYmFja3NsYXNoOworCQkgIGVsc2UKKwkJICAgIEZSRUVfU1RBQ0tfUkVUVVJOIChSRUdfRVJQQVJFTik7CisJCX0KKworICAgICAgICAgICAgaGFuZGxlX2Nsb3NlOgorICAgICAgICAgICAgICBpZiAoZml4dXBfYWx0X2p1bXApCisgICAgICAgICAgICAgICAgeyAvKiBQdXNoIGEgZHVtbXkgZmFpbHVyZSBwb2ludCBhdCB0aGUgZW5kIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmUgZm9yIGEgcG9zc2libGUgZnV0dXJlCisgICAgICAgICAgICAgICAgICAgICBgcG9wX2ZhaWx1cmVfanVtcCcgdG8gcG9wLiAgU2VlIGNvbW1lbnRzIGF0CisgICAgICAgICAgICAgICAgICAgICBgcHVzaF9kdW1teV9mYWlsdXJlJyBpbiBgcmVfbWF0Y2hfMicuICAqLworICAgICAgICAgICAgICAgICAgQlVGX1BVU0ggKHB1c2hfZHVtbXlfZmFpbHVyZSk7CisKKyAgICAgICAgICAgICAgICAgIC8qIFdlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhpcyBqdW1wIHdoZW4gd2UgYXNzaWduZWQKKyAgICAgICAgICAgICAgICAgICAgIHRvIGBmaXh1cF9hbHRfanVtcCcsIGluIHRoZSBgaGFuZGxlX2FsdCcgY2FzZSBiZWxvdy4gICovCisgICAgICAgICAgICAgICAgICBTVE9SRV9KVU1QIChqdW1wX3Bhc3RfYWx0LCBmaXh1cF9hbHRfanVtcCwgYiAtIDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiBTZWUgc2ltaWxhciBjb2RlIGZvciBiYWNrc2xhc2hlZCBsZWZ0IHBhcmVuIGFib3ZlLiAgKi8KKyAgICAgICAgICAgICAgaWYgKENPTVBJTEVfU1RBQ0tfRU1QVFkpCisJCXsKKwkJICBpZiAoc3ludGF4ICYgUkVfVU5NQVRDSEVEX1JJR0hUX1BBUkVOX09SRCkKKwkJICAgIGdvdG8gbm9ybWFsX2NoYXI7CisJCSAgZWxzZQorCQkgICAgRlJFRV9TVEFDS19SRVRVUk4gKFJFR19FUlBBUkVOKTsKKwkJfQorCisgICAgICAgICAgICAgIC8qIFNpbmNlIHdlIGp1c3QgY2hlY2tlZCBmb3IgYW4gZW1wdHkgc3RhY2sgYWJvdmUsIHRoaXMKKyAgICAgICAgICAgICAgICAgYGBjYW4ndCBoYXBwZW4nJy4gICovCisgICAgICAgICAgICAgIGFzc2VydCAoY29tcGlsZV9zdGFjay5hdmFpbCAhPSAwKTsKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFdlIGRvbid0IGp1c3Qgd2FudCB0byByZXN0b3JlIGludG8gYHJlZ251bScsIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICBsYXRlciBncm91cHMgc2hvdWxkIGNvbnRpbnVlIHRvIGJlIG51bWJlcmVkIGhpZ2hlciwKKyAgICAgICAgICAgICAgICAgICBhcyBpbiBgKGFiKWMoZGUpJyAtLSB0aGUgc2Vjb25kIGdyb3VwIGlzICMyLiAgKi8KKyAgICAgICAgICAgICAgICByZWdudW1fdCB0aGlzX2dyb3VwX3JlZ251bTsKKworICAgICAgICAgICAgICAgIGNvbXBpbGVfc3RhY2suYXZhaWwtLTsKKyAgICAgICAgICAgICAgICBiZWdhbHQgPSBidWZwLT5idWZmZXIgKyBDT01QSUxFX1NUQUNLX1RPUC5iZWdhbHRfb2Zmc2V0OworICAgICAgICAgICAgICAgIGZpeHVwX2FsdF9qdW1wCisgICAgICAgICAgICAgICAgICA9IENPTVBJTEVfU1RBQ0tfVE9QLmZpeHVwX2FsdF9qdW1wCisgICAgICAgICAgICAgICAgICAgID8gYnVmcC0+YnVmZmVyICsgQ09NUElMRV9TVEFDS19UT1AuZml4dXBfYWx0X2p1bXAgLSAxCisgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICAgICAgICAgICAgICBsYXN0c3RhcnQgPSBidWZwLT5idWZmZXIgKyBDT01QSUxFX1NUQUNLX1RPUC5sYXN0c3RhcnRfb2Zmc2V0OworICAgICAgICAgICAgICAgIHRoaXNfZ3JvdXBfcmVnbnVtID0gQ09NUElMRV9TVEFDS19UT1AucmVnbnVtOworCQkvKiBJZiB3ZSd2ZSByZWFjaGVkIE1BWF9SRUdOVU0gZ3JvdXBzLCB0aGVuIHRoaXMgb3BlbgorCQkgICB3b24ndCBhY3R1YWxseSBnZW5lcmF0ZSBhbnkgY29kZSwgc28gd2UnbGwgaGF2ZSB0bworCQkgICBjbGVhciBwZW5kaW5nX2V4YWN0IGV4cGxpY2l0bHkuICAqLworCQlwZW5kaW5nX2V4YWN0ID0gMDsKKworICAgICAgICAgICAgICAgIC8qIFdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGdyb3VwLCBzbyBub3cgd2Uga25vdyBob3cgbWFueQorICAgICAgICAgICAgICAgICAgIGdyb3VwcyB3ZXJlIGluc2lkZSB0aGlzIG9uZS4gICovCisgICAgICAgICAgICAgICAgaWYgKHRoaXNfZ3JvdXBfcmVnbnVtIDw9IE1BWF9SRUdOVU0pCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmlubmVyX2dyb3VwX2xvYworICAgICAgICAgICAgICAgICAgICAgID0gYnVmcC0+YnVmZmVyICsgQ09NUElMRV9TVEFDS19UT1AuaW5uZXJfZ3JvdXBfb2Zmc2V0OworCisgICAgICAgICAgICAgICAgICAgICppbm5lcl9ncm91cF9sb2MgPSByZWdudW0gLSB0aGlzX2dyb3VwX3JlZ251bTsKKyAgICAgICAgICAgICAgICAgICAgQlVGX1BVU0hfMyAoc3RvcF9tZW1vcnksIHRoaXNfZ3JvdXBfcmVnbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdudW0gLSB0aGlzX2dyb3VwX3JlZ251bSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgY2FzZSAnfCc6CQkJCQkvKiBgXHwnLiAgKi8KKyAgICAgICAgICAgICAgaWYgKHN5bnRheCAmIFJFX0xJTUlURURfT1BTIHx8IHN5bnRheCAmIFJFX05PX0JLX1ZCQVIpCisgICAgICAgICAgICAgICAgZ290byBub3JtYWxfYmFja3NsYXNoOworICAgICAgICAgICAgaGFuZGxlX2FsdDoKKyAgICAgICAgICAgICAgaWYgKHN5bnRheCAmIFJFX0xJTUlURURfT1BTKQorICAgICAgICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CisKKyAgICAgICAgICAgICAgLyogSW5zZXJ0IGJlZm9yZSB0aGUgcHJldmlvdXMgYWx0ZXJuYXRpdmUgYSBqdW1wIHdoaWNoCisgICAgICAgICAgICAgICAgIGp1bXBzIHRvIHRoaXMgYWx0ZXJuYXRpdmUgaWYgdGhlIGZvcm1lciBmYWlscy4gICovCisgICAgICAgICAgICAgIEdFVF9CVUZGRVJfU1BBQ0UgKDMpOworICAgICAgICAgICAgICBJTlNFUlRfSlVNUCAob25fZmFpbHVyZV9qdW1wLCBiZWdhbHQsIGIgKyA2KTsKKyAgICAgICAgICAgICAgcGVuZGluZ19leGFjdCA9IDA7CisgICAgICAgICAgICAgIGIgKz0gMzsKKworICAgICAgICAgICAgICAvKiBUaGUgYWx0ZXJuYXRpdmUgYmVmb3JlIHRoaXMgb25lIGhhcyBhIGp1bXAgYWZ0ZXIgaXQKKyAgICAgICAgICAgICAgICAgd2hpY2ggZ2V0cyBleGVjdXRlZCBpZiBpdCBnZXRzIG1hdGNoZWQuICBBZGp1c3QgdGhhdAorICAgICAgICAgICAgICAgICBqdW1wIHNvIGl0IHdpbGwganVtcCB0byB0aGlzIGFsdGVybmF0aXZlJ3MgYW5hbG9nb3VzCisgICAgICAgICAgICAgICAgIGp1bXAgKHB1dCBpbiBiZWxvdywgd2hpY2ggaW4gdHVybiB3aWxsIGp1bXAgdG8gdGhlIG5leHQKKyAgICAgICAgICAgICAgICAgKGlmIGFueSkgYWx0ZXJuYXRpdmUncyBzdWNoIGp1bXAsIGV0Yy4pLiAgVGhlIGxhc3Qgc3VjaAorICAgICAgICAgICAgICAgICBqdW1wIGp1bXBzIHRvIHRoZSBjb3JyZWN0IGZpbmFsIGRlc3RpbmF0aW9uLiAgQSBwaWN0dXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fXyBfX19fXworICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfCB8ICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgdiB8ICAgdgorICAgICAgICAgICAgICAgICAgICAgICAgIGEgfCBiICAgfCBjCisKKyAgICAgICAgICAgICAgICAgSWYgd2UgYXJlIGF0IGBiJywgdGhlbiBmaXh1cF9hbHRfanVtcCByaWdodCBub3cgcG9pbnRzIHRvIGEKKyAgICAgICAgICAgICAgICAgdGhyZWUtYnl0ZSBzcGFjZSBhZnRlciBgYScuICBXZSdsbCBwdXQgaW4gdGhlIGp1bXAsIHNldAorICAgICAgICAgICAgICAgICBmaXh1cF9hbHRfanVtcCB0byByaWdodCBhZnRlciBgYicsIGFuZCBsZWF2ZSBiZWhpbmQgdGhyZWUKKyAgICAgICAgICAgICAgICAgYnl0ZXMgd2hpY2ggd2UnbGwgZmlsbCBpbiB3aGVuIHdlIGdldCB0byBhZnRlciBgYycuICAqLworCisgICAgICAgICAgICAgIGlmIChmaXh1cF9hbHRfanVtcCkKKyAgICAgICAgICAgICAgICBTVE9SRV9KVU1QIChqdW1wX3Bhc3RfYWx0LCBmaXh1cF9hbHRfanVtcCwgYik7CisKKyAgICAgICAgICAgICAgLyogTWFyayBhbmQgbGVhdmUgc3BhY2UgZm9yIGEganVtcCBhZnRlciB0aGlzIGFsdGVybmF0aXZlLAorICAgICAgICAgICAgICAgICB0byBiZSBmaWxsZWQgaW4gbGF0ZXIgZWl0aGVyIGJ5IG5leHQgYWx0ZXJuYXRpdmUgb3IKKyAgICAgICAgICAgICAgICAgd2hlbiBrbm93IHdlJ3JlIGF0IHRoZSBlbmQgb2YgYSBzZXJpZXMgb2YgYWx0ZXJuYXRpdmVzLiAgKi8KKyAgICAgICAgICAgICAgZml4dXBfYWx0X2p1bXAgPSBiOworICAgICAgICAgICAgICBHRVRfQlVGRkVSX1NQQUNFICgzKTsKKyAgICAgICAgICAgICAgYiArPSAzOworCisgICAgICAgICAgICAgIGxhc3RzdGFydCA9IDA7CisgICAgICAgICAgICAgIGJlZ2FsdCA9IGI7CisgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgIGNhc2UgJ3snOgorICAgICAgICAgICAgICAvKiBJZiBceyBpcyBhIGxpdGVyYWwuICAqLworICAgICAgICAgICAgICBpZiAoIShzeW50YXggJiBSRV9JTlRFUlZBTFMpCisgICAgICAgICAgICAgICAgICAgICAvKiBJZiB3ZSdyZSBhdCBgXHsnIGFuZCBpdCdzIG5vdCB0aGUgb3Blbi1pbnRlcnZhbAorICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IuICAqLworICAgICAgICAgICAgICAgICAgfHwgKChzeW50YXggJiBSRV9JTlRFUlZBTFMpICYmIChzeW50YXggJiBSRV9OT19CS19CUkFDRVMpKQorICAgICAgICAgICAgICAgICAgfHwgKHAgLSAyID09IHBhdHRlcm4gICYmICBwID09IHBlbmQpKQorICAgICAgICAgICAgICAgIGdvdG8gbm9ybWFsX2JhY2tzbGFzaDsKKworICAgICAgICAgICAgaGFuZGxlX2ludGVydmFsOgorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSWYgZ290IGhlcmUsIHRoZW4gdGhlIHN5bnRheCBhbGxvd3MgaW50ZXJ2YWxzLiAgKi8KKworICAgICAgICAgICAgICAgIC8qIEF0IGxlYXN0IChtb3N0KSB0aGlzIG1hbnkgbWF0Y2hlcyBtdXN0IGJlIG1hZGUuICAqLworICAgICAgICAgICAgICAgIGludCBsb3dlcl9ib3VuZCA9IC0xLCB1cHBlcl9ib3VuZCA9IC0xOworCisgICAgICAgICAgICAgICAgYmVnX2ludGVydmFsID0gcCAtIDE7CisKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBwZW5kKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3ludGF4ICYgUkVfTk9fQktfQlJBQ0VTKQorICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdW5mZXRjaF9pbnRlcnZhbDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIEZSRUVfU1RBQ0tfUkVUVVJOIChSRUdfRUJSQUNFKTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEdFVF9VTlNJR05FRF9OVU1CRVIgKGxvd2VyX2JvdW5kKTsKKworICAgICAgICAgICAgICAgIGlmIChjID09ICcsJykKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR0VUX1VOU0lHTkVEX05VTUJFUiAodXBwZXJfYm91bmQpOworICAgICAgICAgICAgICAgICAgICBpZiAodXBwZXJfYm91bmQgPCAwKSB1cHBlcl9ib3VuZCA9IFJFX0RVUF9NQVg7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgLyogSW50ZXJ2YWwgc3VjaCBhcyBgezF9JyA9PiBtYXRjaCBleGFjdGx5IG9uY2UuICovCisgICAgICAgICAgICAgICAgICB1cHBlcl9ib3VuZCA9IGxvd2VyX2JvdW5kOworCisgICAgICAgICAgICAgICAgaWYgKGxvd2VyX2JvdW5kIDwgMCB8fCB1cHBlcl9ib3VuZCA+IFJFX0RVUF9NQVgKKyAgICAgICAgICAgICAgICAgICAgfHwgbG93ZXJfYm91bmQgPiB1cHBlcl9ib3VuZCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN5bnRheCAmIFJFX05PX0JLX0JSQUNFUykKKyAgICAgICAgICAgICAgICAgICAgICBnb3RvIHVuZmV0Y2hfaW50ZXJ2YWw7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICBGUkVFX1NUQUNLX1JFVFVSTiAoUkVHX0JBREJSKTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghKHN5bnRheCAmIFJFX05PX0JLX0JSQUNFUykpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjICE9ICdcXCcpIEZSRUVfU1RBQ0tfUkVUVVJOIChSRUdfRUJSQUNFKTsKKworICAgICAgICAgICAgICAgICAgICBQQVRGRVRDSCAoYyk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSAnfScpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzeW50YXggJiBSRV9OT19CS19CUkFDRVMpCisgICAgICAgICAgICAgICAgICAgICAgZ290byB1bmZldGNoX2ludGVydmFsOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgRlJFRV9TVEFDS19SRVRVUk4gKFJFR19CQURCUik7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBXZSBqdXN0IHBhcnNlZCBhIHZhbGlkIGludGVydmFsLiAgKi8KKworICAgICAgICAgICAgICAgIC8qIElmIGl0J3MgaW52YWxpZCB0byBoYXZlIG5vIHByZWNlZGluZyByZS4gICovCisgICAgICAgICAgICAgICAgaWYgKCFsYXN0c3RhcnQpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzeW50YXggJiBSRV9DT05URVhUX0lOVkFMSURfT1BTKQorICAgICAgICAgICAgICAgICAgICAgIEZSRUVfU1RBQ0tfUkVUVVJOIChSRUdfQkFEUlBUKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3ludGF4ICYgUkVfQ09OVEVYVF9JTkRFUF9PUFMpCisgICAgICAgICAgICAgICAgICAgICAgbGFzdHN0YXJ0ID0gYjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdW5mZXRjaF9pbnRlcnZhbDsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIElmIHRoZSB1cHBlciBib3VuZCBpcyB6ZXJvLCBkb24ndCB3YW50IHRvIHN1Y2NlZWQgYXQKKyAgICAgICAgICAgICAgICAgICBhbGw7IGp1bXAgZnJvbSBgbGFzdHN0YXJ0JyB0byBgYiArIDMnLCB3aGljaCB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGFmdGVyIHdlIGluc2VydCB0aGUganVtcC4gICovCisgICAgICAgICAgICAgICAgIGlmICh1cHBlcl9ib3VuZCA9PSAwKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIEdFVF9CVUZGRVJfU1BBQ0UgKDMpOworICAgICAgICAgICAgICAgICAgICAgSU5TRVJUX0pVTVAgKGp1bXAsIGxhc3RzdGFydCwgYiArIDMpOworICAgICAgICAgICAgICAgICAgICAgYiArPSAzOworICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAvKiBPdGhlcndpc2UsIHdlIGhhdmUgYSBub250cml2aWFsIGludGVydmFsLiAgV2hlbgorICAgICAgICAgICAgICAgICAgICB3ZSdyZSBhbGwgZG9uZSwgdGhlIHBhdHRlcm4gd2lsbCBsb29rIGxpa2U6CisgICAgICAgICAgICAgICAgICAgICAgc2V0X251bWJlcl9hdCA8anVtcCBjb3VudD4gPHVwcGVyIGJvdW5kPgorICAgICAgICAgICAgICAgICAgICAgIHNldF9udW1iZXJfYXQgPHN1Y2NlZWRfbiBjb3VudD4gPGxvd2VyIGJvdW5kPgorICAgICAgICAgICAgICAgICAgICAgIHN1Y2NlZWRfbiA8YWZ0ZXIganVtcCBhZGRyPiA8c3VjY2VlZF9uIGNvdW50PgorICAgICAgICAgICAgICAgICAgICAgIDxib2R5IG9mIGxvb3A+CisgICAgICAgICAgICAgICAgICAgICAganVtcF9uIDxzdWNjZWVkX24gYWRkcj4gPGp1bXAgY291bnQ+CisgICAgICAgICAgICAgICAgICAgIChUaGUgdXBwZXIgYm91bmQgYW5kIGBqdW1wX24nIGFyZSBvbWl0dGVkIGlmCisgICAgICAgICAgICAgICAgICAgIGB1cHBlcl9ib3VuZCcgaXMgMSwgdGhvdWdoLikgICovCisgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICB7IC8qIElmIHRoZSB1cHBlciBib3VuZCBpcyA+IDEsIHdlIG5lZWQgdG8gaW5zZXJ0CisgICAgICAgICAgICAgICAgICAgICAgICBtb3JlIGF0IHRoZSBlbmQgb2YgdGhlIGxvb3AuICAqLworICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbmJ5dGVzID0gMTAgKyAodXBwZXJfYm91bmQgPiAxKSAqIDEwOworCisgICAgICAgICAgICAgICAgICAgICBHRVRfQlVGRkVSX1NQQUNFIChuYnl0ZXMpOworCisgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIGxvd2VyIGJvdW5kIG9mIHRoZSBgc3VjY2VlZF9uJywgZXZlbgorICAgICAgICAgICAgICAgICAgICAgICAgdGhvdWdoIGl0IHdpbGwgYmUgc2V0IGR1cmluZyBtYXRjaGluZyBieSBpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVuZGFudCBgc2V0X251bWJlcl9hdCcgKGluc2VydGVkIG5leHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSBgcmVfY29tcGlsZV9mYXN0bWFwJyBuZWVkcyB0byBrbm93LgorICAgICAgICAgICAgICAgICAgICAgICAgSnVtcCB0byB0aGUgYGp1bXBfbicgd2UgbWlnaHQgaW5zZXJ0IGJlbG93LiAgKi8KKyAgICAgICAgICAgICAgICAgICAgIElOU0VSVF9KVU1QMiAoc3VjY2VlZF9uLCBsYXN0c3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgKyA1ICsgKHVwcGVyX2JvdW5kID4gMSkgKiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcl9ib3VuZCk7CisgICAgICAgICAgICAgICAgICAgICBiICs9IDU7CisKKyAgICAgICAgICAgICAgICAgICAgIC8qIENvZGUgdG8gaW5pdGlhbGl6ZSB0aGUgbG93ZXIgYm91bmQuICBJbnNlcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSB0aGUgYHN1Y2NlZWRfbicuICBUaGUgYDUnIGlzIHRoZSBsYXN0IHR3bworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgb2YgdGhpcyBgc2V0X251bWJlcl9hdCcsIHBsdXMgMyBieXRlcyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBgc3VjY2VlZF9uJy4gICovCisgICAgICAgICAgICAgICAgICAgICBpbnNlcnRfb3AyIChzZXRfbnVtYmVyX2F0LCBsYXN0c3RhcnQsIDUsIGxvd2VyX2JvdW5kLCBiKTsKKyAgICAgICAgICAgICAgICAgICAgIGIgKz0gNTsKKworICAgICAgICAgICAgICAgICAgICAgaWYgKHVwcGVyX2JvdW5kID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgeyAvKiBNb3JlIHRoYW4gb25lIHJlcGV0aXRpb24gaXMgYWxsb3dlZCwgc28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgYSBiYWNrd2FyZCBqdW1wIHRvIHRoZSBgc3VjY2VlZF9uJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgc3RhcnRzIHRoaXMgaW50ZXJ2YWwuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGVuIHdlJ3ZlIHJlYWNoZWQgdGhpcyBkdXJpbmcgbWF0Y2hpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2UnbGwgaGF2ZSBtYXRjaGVkIHRoZSBpbnRlcnZhbCBvbmNlLCBzbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bXAgYmFjayBvbmx5IGB1cHBlcl9ib3VuZCAtIDEnIHRpbWVzLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBTVE9SRV9KVU1QMiAoanVtcF9uLCBiLCBsYXN0c3RhcnQgKyA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcl9ib3VuZCAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgIGIgKz0gNTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBsb2NhdGlvbiB3ZSB3YW50IHRvIHNldCBpcyB0aGUgc2Vjb25kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIG9mIHRoZSBganVtcF9uJzsgdGhhdCBpcyBgYi0yJyBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGFic29sdXRlIGFkZHJlc3MuICBgbGFzdHN0YXJ0JyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGBzZXRfbnVtYmVyX2F0JyB3ZSdyZSBhYm91dCB0byBpbnNlcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGxhc3RzdGFydCszJyB0aGUgbnVtYmVyIHRvIHNldCwgdGhlIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcmVsYXRpdmUgYWRkcmVzcy4gIEJ1dCB3ZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpbmcgaW50byB0aGUgbWlkZGxlIG9mIHRoZSBwYXR0ZXJuIC0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXZlcnl0aGluZyBpcyBnZXR0aW5nIG1vdmVkIHVwIGJ5IDUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uY2x1c2lvbjogKGIgLSAyKSAtIChsYXN0c3RhcnQgKyAzKSArIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5lLiwgYiAtIGxhc3RzdGFydC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlIGluc2VydCB0aGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGlmIHdlIGZhaWwgZHVyaW5nIG1hdGNoaW5nLCB3ZSdsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW5pdGlhbGl6ZSB0aGUgYm91bmRzLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRfb3AyIChzZXRfbnVtYmVyX2F0LCBsYXN0c3RhcnQsIGIgLSBsYXN0c3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfYm91bmQgLSAxLCBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBiICs9IDU7CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGVuZGluZ19leGFjdCA9IDA7CisgICAgICAgICAgICAgICAgYmVnX2ludGVydmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgdW5mZXRjaF9pbnRlcnZhbDoKKyAgICAgICAgICAgICAgLyogSWYgYW4gaW52YWxpZCBpbnRlcnZhbCwgbWF0Y2ggdGhlIGNoYXJhY3RlcnMgYXMgbGl0ZXJhbHMuICAqLworICAgICAgICAgICAgICAgYXNzZXJ0IChiZWdfaW50ZXJ2YWwpOworICAgICAgICAgICAgICAgcCA9IGJlZ19pbnRlcnZhbDsKKyAgICAgICAgICAgICAgIGJlZ19pbnRlcnZhbCA9IE5VTEw7CisKKyAgICAgICAgICAgICAgIC8qIG5vcm1hbF9jaGFyIGFuZCBub3JtYWxfYmFja3NsYXNoIG5lZWQgYGMnLiAgKi8KKyAgICAgICAgICAgICAgIFBBVEZFVENIIChjKTsKKworICAgICAgICAgICAgICAgaWYgKCEoc3ludGF4ICYgUkVfTk9fQktfQlJBQ0VTKSkKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGlmIChwID4gcGF0dGVybiAgJiYgIHBbLTFdID09ICdcXCcpCisgICAgICAgICAgICAgICAgICAgICBnb3RvIG5vcm1hbF9iYWNrc2xhc2g7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGdvdG8gbm9ybWFsX2NoYXI7CisKKyNpZmRlZiBlbWFjcworICAgICAgICAgICAgLyogVGhlcmUgaXMgbm8gd2F5IHRvIHNwZWNpZnkgdGhlIGJlZm9yZV9kb3QgYW5kIGFmdGVyX2RvdAorICAgICAgICAgICAgICAgb3BlcmF0b3JzLiAgcm1zIHNheXMgdGhpcyBpcyBvay4gIC0ta2FybCAgKi8KKyAgICAgICAgICAgIGNhc2UgJz0nOgorICAgICAgICAgICAgICBCVUZfUFVTSCAoYXRfZG90KTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICBsYXN0c3RhcnQgPSBiOworICAgICAgICAgICAgICBQQVRGRVRDSCAoYyk7CisgICAgICAgICAgICAgIEJVRl9QVVNIXzIgKHN5bnRheHNwZWMsIHN5bnRheF9zcGVjX2NvZGVbY10pOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnUyc6CisgICAgICAgICAgICAgIGxhc3RzdGFydCA9IGI7CisgICAgICAgICAgICAgIFBBVEZFVENIIChjKTsKKyAgICAgICAgICAgICAgQlVGX1BVU0hfMiAobm90c3ludGF4c3BlYywgc3ludGF4X3NwZWNfY29kZVtjXSk7CisgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIGVtYWNzICovCisKKworICAgICAgICAgICAgY2FzZSAndyc6CisJICAgICAgaWYgKHN5bnRheCAmIFJFX05PX0dOVV9PUFMpCisJCWdvdG8gbm9ybWFsX2NoYXI7CisgICAgICAgICAgICAgIGxhc3RzdGFydCA9IGI7CisgICAgICAgICAgICAgIEJVRl9QVVNIICh3b3JkY2hhcik7CisgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgIGNhc2UgJ1cnOgorCSAgICAgIGlmIChzeW50YXggJiBSRV9OT19HTlVfT1BTKQorCQlnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAgICAgICBsYXN0c3RhcnQgPSBiOworICAgICAgICAgICAgICBCVUZfUFVTSCAobm90d29yZGNoYXIpOworICAgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgICBjYXNlICc8JzoKKwkgICAgICBpZiAoc3ludGF4ICYgUkVfTk9fR05VX09QUykKKwkJZ290byBub3JtYWxfY2hhcjsKKyAgICAgICAgICAgICAgQlVGX1BVU0ggKHdvcmRiZWcpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnPic6CisJICAgICAgaWYgKHN5bnRheCAmIFJFX05PX0dOVV9PUFMpCisJCWdvdG8gbm9ybWFsX2NoYXI7CisgICAgICAgICAgICAgIEJVRl9QVVNIICh3b3JkZW5kKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ2InOgorCSAgICAgIGlmIChzeW50YXggJiBSRV9OT19HTlVfT1BTKQorCQlnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAgICAgICBCVUZfUFVTSCAod29yZGJvdW5kKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ0InOgorCSAgICAgIGlmIChzeW50YXggJiBSRV9OT19HTlVfT1BTKQorCQlnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAgICAgICBCVUZfUFVTSCAobm90d29yZGJvdW5kKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ2AnOgorCSAgICAgIGlmIChzeW50YXggJiBSRV9OT19HTlVfT1BTKQorCQlnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAgICAgICBCVUZfUFVTSCAoYmVnYnVmKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKwkgICAgICBpZiAoc3ludGF4ICYgUkVfTk9fR05VX09QUykKKwkJZ290byBub3JtYWxfY2hhcjsKKyAgICAgICAgICAgICAgQlVGX1BVU0ggKGVuZGJ1Zik7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzogY2FzZSAnNSc6CisgICAgICAgICAgICBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKKyAgICAgICAgICAgICAgaWYgKHN5bnRheCAmIFJFX05PX0JLX1JFRlMpCisgICAgICAgICAgICAgICAgZ290byBub3JtYWxfY2hhcjsKKworICAgICAgICAgICAgICBjMSA9IGMgLSAnMCc7CisKKyAgICAgICAgICAgICAgaWYgKGMxID4gcmVnbnVtKQorICAgICAgICAgICAgICAgIEZSRUVfU1RBQ0tfUkVUVVJOIChSRUdfRVNVQlJFRyk7CisKKyAgICAgICAgICAgICAgLyogQ2FuJ3QgYmFjayByZWZlcmVuY2UgdG8gYSBzdWJleHByZXNzaW9uIGlmIGluc2lkZSBvZiBpdC4gICovCisgICAgICAgICAgICAgIGlmIChncm91cF9pbl9jb21waWxlX3N0YWNrIChjb21waWxlX3N0YWNrLCAocmVnbnVtX3QpIGMxKSkKKyAgICAgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOworCisgICAgICAgICAgICAgIGxhc3RzdGFydCA9IGI7CisgICAgICAgICAgICAgIEJVRl9QVVNIXzIgKGR1cGxpY2F0ZSwgYzEpOworICAgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgICBjYXNlICcrJzoKKyAgICAgICAgICAgIGNhc2UgJz8nOgorICAgICAgICAgICAgICBpZiAoc3ludGF4ICYgUkVfQktfUExVU19RTSkKKyAgICAgICAgICAgICAgICBnb3RvIGhhbmRsZV9wbHVzOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ290byBub3JtYWxfYmFja3NsYXNoOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbm9ybWFsX2JhY2tzbGFzaDoKKyAgICAgICAgICAgICAgLyogWW91IG1pZ2h0IHRoaW5rIGl0IHdvdWxkIGJlIHVzZWZ1bCBmb3IgXCB0byBtZWFuCisgICAgICAgICAgICAgICAgIG5vdCB0byB0cmFuc2xhdGU7IGJ1dCBpZiB3ZSBkb24ndCB0cmFuc2xhdGUgaXQKKyAgICAgICAgICAgICAgICAgaXQgd2lsbCBuZXZlciBtYXRjaCBhbnl0aGluZy4gICovCisgICAgICAgICAgICAgIGMgPSBUUkFOU0xBVEUgKGMpOworICAgICAgICAgICAgICBnb3RvIG5vcm1hbF9jaGFyOworICAgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisKKwlkZWZhdWx0OgorICAgICAgICAvKiBFeHBlY3RzIHRoZSBjaGFyYWN0ZXIgaW4gYGMnLiAgKi8KKwlub3JtYWxfY2hhcjoKKwkgICAgICAvKiBJZiBubyBleGFjdG4gY3VycmVudGx5IGJlaW5nIGJ1aWx0LiAgKi8KKyAgICAgICAgICBpZiAoIXBlbmRpbmdfZXhhY3QKKworICAgICAgICAgICAgICAvKiBJZiBsYXN0IGV4YWN0biBub3QgYXQgY3VycmVudCBwb3NpdGlvbi4gICovCisgICAgICAgICAgICAgIHx8IHBlbmRpbmdfZXhhY3QgKyAqcGVuZGluZ19leGFjdCArIDEgIT0gYgorCisgICAgICAgICAgICAgIC8qIFdlIGhhdmUgb25seSBvbmUgYnl0ZSBmb2xsb3dpbmcgdGhlIGV4YWN0biBmb3IgdGhlIGNvdW50LiAgKi8KKwkgICAgICB8fCAqcGVuZGluZ19leGFjdCA9PSAoMSA8PCBCWVRFV0lEVEgpIC0gMQorCisgICAgICAgICAgICAgIC8qIElmIGZvbGxvd2VkIGJ5IGEgcmVwZXRpdGlvbiBvcGVyYXRvci4gICovCisgICAgICAgICAgICAgIHx8ICpwID09ICcqJyB8fCAqcCA9PSAnXicKKwkgICAgICB8fCAoKHN5bnRheCAmIFJFX0JLX1BMVVNfUU0pCisJCSAgPyAqcCA9PSAnXFwnICYmIChwWzFdID09ICcrJyB8fCBwWzFdID09ICc/JykKKwkJICA6ICgqcCA9PSAnKycgfHwgKnAgPT0gJz8nKSkKKwkgICAgICB8fCAoKHN5bnRheCAmIFJFX0lOVEVSVkFMUykKKyAgICAgICAgICAgICAgICAgICYmICgoc3ludGF4ICYgUkVfTk9fQktfQlJBQ0VTKQorCQkgICAgICA/ICpwID09ICd7JworICAgICAgICAgICAgICAgICAgICAgIDogKHBbMF0gPT0gJ1xcJyAmJiBwWzFdID09ICd7JykpKSkKKwkgICAgeworCSAgICAgIC8qIFN0YXJ0IGJ1aWxkaW5nIGEgbmV3IGV4YWN0bi4gICovCisKKyAgICAgICAgICAgICAgbGFzdHN0YXJ0ID0gYjsKKworCSAgICAgIEJVRl9QVVNIXzIgKGV4YWN0biwgMCk7CisJICAgICAgcGVuZGluZ19leGFjdCA9IGIgLSAxOworICAgICAgICAgICAgfQorCisJICBCVUZfUFVTSCAoYyk7CisgICAgICAgICAgKCpwZW5kaW5nX2V4YWN0KSsrOworCSAgYnJlYWs7CisgICAgICAgIH0gLyogc3dpdGNoIChjKSAqLworICAgIH0gLyogd2hpbGUgcCAhPSBwZW5kICovCisKKworICAvKiBUaHJvdWdoIHRoZSBwYXR0ZXJuIG5vdy4gICovCisKKyAgaWYgKGZpeHVwX2FsdF9qdW1wKQorICAgIFNUT1JFX0pVTVAgKGp1bXBfcGFzdF9hbHQsIGZpeHVwX2FsdF9qdW1wLCBiKTsKKworICBpZiAoIUNPTVBJTEVfU1RBQ0tfRU1QVFkpCisgICAgRlJFRV9TVEFDS19SRVRVUk4gKFJFR19FUEFSRU4pOworCisgIC8qIElmIHdlIGRvbid0IHdhbnQgYmFja3RyYWNraW5nLCBmb3JjZSBzdWNjZXNzCisgICAgIHRoZSBmaXJzdCB0aW1lIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGNvbXBpbGVkIHBhdHRlcm4uICAqLworICBpZiAoc3ludGF4ICYgUkVfTk9fUE9TSVhfQkFDS1RSQUNLSU5HKQorICAgIEJVRl9QVVNIIChzdWNjZWVkKTsKKworICBmcmVlIChjb21waWxlX3N0YWNrLnN0YWNrKTsKKworICAvKiBXZSBoYXZlIHN1Y2NlZWRlZDsgc2V0IHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlci4gICovCisgIGJ1ZnAtPnVzZWQgPSBiIC0gYnVmcC0+YnVmZmVyOworCisjaWZkZWYgREVCVUcKKyAgaWYgKGRlYnVnKQorICAgIHsKKyAgICAgIERFQlVHX1BSSU5UMSAoIlxuQ29tcGlsZWQgcGF0dGVybjogXG4iKTsKKyAgICAgIHByaW50X2NvbXBpbGVkX3BhdHRlcm4gKGJ1ZnApOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZuZGVmIE1BVENIX01BWV9BTExPQ0FURQorICAvKiBJbml0aWFsaXplIHRoZSBmYWlsdXJlIHN0YWNrIHRvIHRoZSBsYXJnZXN0IHBvc3NpYmxlIHN0YWNrLiAgVGhpcworICAgICBpc24ndCBuZWNlc3NhcnkgdW5sZXNzIHdlJ3JlIHRyeWluZyB0byBhdm9pZCBjYWxsaW5nIGFsbG9jYSBpbgorICAgICB0aGUgc2VhcmNoIGFuZCBtYXRjaCByb3V0aW5lcy4gICovCisgIHsKKyAgICBpbnQgbnVtX3JlZ3MgPSBidWZwLT5yZV9uc3ViICsgMTsKKworICAgIC8qIFNpbmNlIERPVUJMRV9GQUlMX1NUQUNLIHJlZnVzZXMgdG8gZG91YmxlIG9ubHkgaWYgdGhlIGN1cnJlbnQgc2l6ZQorICAgICAgIGlzIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiByZV9tYXhfZmFpbHVyZXMsIHRoZSBsYXJnZXN0IHBvc3NpYmxlIHN0YWNrCisgICAgICAgaXMgMiAqIHJlX21heF9mYWlsdXJlcyBmYWlsdXJlIHBvaW50cy4gICovCisgICAgaWYgKGZhaWxfc3RhY2suc2l6ZSA8ICgyICogcmVfbWF4X2ZhaWx1cmVzICogTUFYX0ZBSUxVUkVfSVRFTVMpKQorICAgICAgeworCWZhaWxfc3RhY2suc2l6ZSA9ICgyICogcmVfbWF4X2ZhaWx1cmVzICogTUFYX0ZBSUxVUkVfSVRFTVMpOworCisjIGlmZGVmIGVtYWNzCisJaWYgKCEgZmFpbF9zdGFjay5zdGFjaykKKwkgIGZhaWxfc3RhY2suc3RhY2sKKwkgICAgPSAoZmFpbF9zdGFja19lbHRfdCAqKSB4bWFsbG9jIChmYWlsX3N0YWNrLnNpemUKKwkJCQkJICAgICogc2l6ZW9mIChmYWlsX3N0YWNrX2VsdF90KSk7CisJZWxzZQorCSAgZmFpbF9zdGFjay5zdGFjaworCSAgICA9IChmYWlsX3N0YWNrX2VsdF90ICopIHhyZWFsbG9jIChmYWlsX3N0YWNrLnN0YWNrLAorCQkJCQkgICAgIChmYWlsX3N0YWNrLnNpemUKKwkJCQkJICAgICAgKiBzaXplb2YgKGZhaWxfc3RhY2tfZWx0X3QpKSk7CisjIGVsc2UgLyogbm90IGVtYWNzICovCisJaWYgKCEgZmFpbF9zdGFjay5zdGFjaykKKwkgIGZhaWxfc3RhY2suc3RhY2sKKwkgICAgPSAoZmFpbF9zdGFja19lbHRfdCAqKSBtYWxsb2MgKGZhaWxfc3RhY2suc2l6ZQorCQkJCQkgICAqIHNpemVvZiAoZmFpbF9zdGFja19lbHRfdCkpOworCWVsc2UKKwkgIGZhaWxfc3RhY2suc3RhY2sKKwkgICAgPSAoZmFpbF9zdGFja19lbHRfdCAqKSByZWFsbG9jIChmYWlsX3N0YWNrLnN0YWNrLAorCQkJCQkgICAgKGZhaWxfc3RhY2suc2l6ZQorCQkJCQkgICAgICogc2l6ZW9mIChmYWlsX3N0YWNrX2VsdF90KSkpOworIyBlbmRpZiAvKiBub3QgZW1hY3MgKi8KKyAgICAgIH0KKworICAgIHJlZ2V4X2dyb3dfcmVnaXN0ZXJzIChudW1fcmVncyk7CisgIH0KKyNlbmRpZiAvKiBub3QgTUFUQ0hfTUFZX0FMTE9DQVRFICovCisKKyAgcmV0dXJuIFJFR19OT0VSUk9SOworfSAvKiByZWdleF9jb21waWxlICovCisMCisvKiBTdWJyb3V0aW5lcyBmb3IgYHJlZ2V4X2NvbXBpbGUnLiAgKi8KKworLyogU3RvcmUgT1AgYXQgTE9DIGZvbGxvd2VkIGJ5IHR3by1ieXRlIGludGVnZXIgcGFyYW1ldGVyIEFSRy4gICovCisKK3N0YXRpYyB2b2lkCitzdG9yZV9vcDEgKG9wLCBsb2MsIGFyZykKKyAgICByZV9vcGNvZGVfdCBvcDsKKyAgICB1bnNpZ25lZCBjaGFyICpsb2M7CisgICAgaW50IGFyZzsKK3sKKyAgKmxvYyA9ICh1bnNpZ25lZCBjaGFyKSBvcDsKKyAgU1RPUkVfTlVNQkVSIChsb2MgKyAxLCBhcmcpOworfQorCisKKy8qIExpa2UgYHN0b3JlX29wMScsIGJ1dCBmb3IgdHdvIHR3by1ieXRlIHBhcmFtZXRlcnMgQVJHMSBhbmQgQVJHMi4gICovCisKK3N0YXRpYyB2b2lkCitzdG9yZV9vcDIgKG9wLCBsb2MsIGFyZzEsIGFyZzIpCisgICAgcmVfb3Bjb2RlX3Qgb3A7CisgICAgdW5zaWduZWQgY2hhciAqbG9jOworICAgIGludCBhcmcxLCBhcmcyOworeworICAqbG9jID0gKHVuc2lnbmVkIGNoYXIpIG9wOworICBTVE9SRV9OVU1CRVIgKGxvYyArIDEsIGFyZzEpOworICBTVE9SRV9OVU1CRVIgKGxvYyArIDMsIGFyZzIpOworfQorCisKKy8qIENvcHkgdGhlIGJ5dGVzIGZyb20gTE9DIHRvIEVORCB0byBvcGVuIHVwIHRocmVlIGJ5dGVzIG9mIHNwYWNlIGF0IExPQworICAgZm9yIE9QIGZvbGxvd2VkIGJ5IHR3by1ieXRlIGludGVnZXIgcGFyYW1ldGVyIEFSRy4gICovCisKK3N0YXRpYyB2b2lkCitpbnNlcnRfb3AxIChvcCwgbG9jLCBhcmcsIGVuZCkKKyAgICByZV9vcGNvZGVfdCBvcDsKKyAgICB1bnNpZ25lZCBjaGFyICpsb2M7CisgICAgaW50IGFyZzsKKyAgICB1bnNpZ25lZCBjaGFyICplbmQ7Cit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnBmcm9tID0gZW5kOworICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwdG8gPSBlbmQgKyAzOworCisgIHdoaWxlIChwZnJvbSAhPSBsb2MpCisgICAgKi0tcHRvID0gKi0tcGZyb207CisKKyAgc3RvcmVfb3AxIChvcCwgbG9jLCBhcmcpOworfQorCisKKy8qIExpa2UgYGluc2VydF9vcDEnLCBidXQgZm9yIHR3byB0d28tYnl0ZSBwYXJhbWV0ZXJzIEFSRzEgYW5kIEFSRzIuICAqLworCitzdGF0aWMgdm9pZAoraW5zZXJ0X29wMiAob3AsIGxvYywgYXJnMSwgYXJnMiwgZW5kKQorICAgIHJlX29wY29kZV90IG9wOworICAgIHVuc2lnbmVkIGNoYXIgKmxvYzsKKyAgICBpbnQgYXJnMSwgYXJnMjsKKyAgICB1bnNpZ25lZCBjaGFyICplbmQ7Cit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnBmcm9tID0gZW5kOworICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwdG8gPSBlbmQgKyA1OworCisgIHdoaWxlIChwZnJvbSAhPSBsb2MpCisgICAgKi0tcHRvID0gKi0tcGZyb207CisKKyAgc3RvcmVfb3AyIChvcCwgbG9jLCBhcmcxLCBhcmcyKTsKK30KKworCisvKiBQIHBvaW50cyB0byBqdXN0IGFmdGVyIGEgXiBpbiBQQVRURVJOLiAgUmV0dXJuIHRydWUgaWYgdGhhdCBeIGNvbWVzCisgICBhZnRlciBhbiBhbHRlcm5hdGl2ZSBvciBhIGJlZ2luLXN1YmV4cHJlc3Npb24uICBXZSBhc3N1bWUgdGhlcmUgaXMgYXQKKyAgIGxlYXN0IG9uZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBeLiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2F0X2JlZ2xpbmVfbG9jX3AgKHBhdHRlcm4sIHAsIHN5bnRheCkKKyAgICBjb25zdCBjaGFyICpwYXR0ZXJuLCAqcDsKKyAgICByZWdfc3ludGF4X3Qgc3ludGF4OworeworICBjb25zdCBjaGFyICpwcmV2ID0gcCAtIDI7CisgIGJvb2xlYW4gcHJldl9wcmV2X2JhY2tzbGFzaCA9IHByZXYgPiBwYXR0ZXJuICYmIHByZXZbLTFdID09ICdcXCc7CisKKyAgcmV0dXJuCisgICAgICAgLyogQWZ0ZXIgYSBzdWJleHByZXNzaW9uPyAgKi8KKyAgICAgICAoKnByZXYgPT0gJygnICYmIChzeW50YXggJiBSRV9OT19CS19QQVJFTlMgfHwgcHJldl9wcmV2X2JhY2tzbGFzaCkpCisgICAgICAgLyogQWZ0ZXIgYW4gYWx0ZXJuYXRpdmU/ICAqLworICAgIHx8ICgqcHJldiA9PSAnfCcgJiYgKHN5bnRheCAmIFJFX05PX0JLX1ZCQVIgfHwgcHJldl9wcmV2X2JhY2tzbGFzaCkpOworfQorCisKKy8qIFRoZSBkdWFsIG9mIGF0X2JlZ2xpbmVfbG9jX3AuICBUaGlzIG9uZSBpcyBmb3IgJC4gIFdlIGFzc3VtZSB0aGVyZSBpcworICAgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBhZnRlciB0aGUgJCwgaS5lLiwgYFAgPCBQRU5EJy4gICovCisKK3N0YXRpYyBib29sZWFuCithdF9lbmRsaW5lX2xvY19wIChwLCBwZW5kLCBzeW50YXgpCisgICAgY29uc3QgY2hhciAqcCwgKnBlbmQ7CisgICAgcmVnX3N5bnRheF90IHN5bnRheDsKK3sKKyAgY29uc3QgY2hhciAqbmV4dCA9IHA7CisgIGJvb2xlYW4gbmV4dF9iYWNrc2xhc2ggPSAqbmV4dCA9PSAnXFwnOworICBjb25zdCBjaGFyICpuZXh0X25leHQgPSBwICsgMSA8IHBlbmQgPyBwICsgMSA6IDA7CisKKyAgcmV0dXJuCisgICAgICAgLyogQmVmb3JlIGEgc3ViZXhwcmVzc2lvbj8gICovCisgICAgICAgKHN5bnRheCAmIFJFX05PX0JLX1BBUkVOUyA/ICpuZXh0ID09ICcpJworICAgICAgICA6IG5leHRfYmFja3NsYXNoICYmIG5leHRfbmV4dCAmJiAqbmV4dF9uZXh0ID09ICcpJykKKyAgICAgICAvKiBCZWZvcmUgYW4gYWx0ZXJuYXRpdmU/ICAqLworICAgIHx8IChzeW50YXggJiBSRV9OT19CS19WQkFSID8gKm5leHQgPT0gJ3wnCisgICAgICAgIDogbmV4dF9iYWNrc2xhc2ggJiYgbmV4dF9uZXh0ICYmICpuZXh0X25leHQgPT0gJ3wnKTsKK30KKworCisvKiBSZXR1cm5zIHRydWUgaWYgUkVHTlVNIGlzIGluIG9uZSBvZiBDT01QSUxFX1NUQUNLJ3MgZWxlbWVudHMgYW5kCisgICBmYWxzZSBpZiBpdCdzIG5vdC4gICovCisKK3N0YXRpYyBib29sZWFuCitncm91cF9pbl9jb21waWxlX3N0YWNrIChjb21waWxlX3N0YWNrLCByZWdudW0pCisgICAgY29tcGlsZV9zdGFja190eXBlIGNvbXBpbGVfc3RhY2s7CisgICAgcmVnbnVtX3QgcmVnbnVtOworeworICBpbnQgdGhpc19lbGVtZW50OworCisgIGZvciAodGhpc19lbGVtZW50ID0gY29tcGlsZV9zdGFjay5hdmFpbCAtIDE7CisgICAgICAgdGhpc19lbGVtZW50ID49IDA7CisgICAgICAgdGhpc19lbGVtZW50LS0pCisgICAgaWYgKGNvbXBpbGVfc3RhY2suc3RhY2tbdGhpc19lbGVtZW50XS5yZWdudW0gPT0gcmVnbnVtKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisKKy8qIFJlYWQgdGhlIGVuZGluZyBjaGFyYWN0ZXIgb2YgYSByYW5nZSAoaW4gYSBicmFja2V0IGV4cHJlc3Npb24pIGZyb20gdGhlCisgICB1bmNvbXBpbGVkIHBhdHRlcm4gKlBfUFRSICh3aGljaCBlbmRzIGF0IFBFTkQpLiAgV2UgYXNzdW1lIHRoZQorICAgc3RhcnRpbmcgY2hhcmFjdGVyIGlzIGluIGBQWy0yXScuICAoYFBbLTFdJyBpcyB0aGUgY2hhcmFjdGVyIGAtJy4pCisgICBUaGVuIHdlIHNldCB0aGUgdHJhbnNsYXRpb24gb2YgYWxsIGJpdHMgYmV0d2VlbiB0aGUgc3RhcnRpbmcgYW5kCisgICBlbmRpbmcgY2hhcmFjdGVycyAoaW5jbHVzaXZlKSBpbiB0aGUgY29tcGlsZWQgcGF0dGVybiBCLgorCisgICBSZXR1cm4gYW4gZXJyb3IgY29kZS4KKworICAgV2UgdXNlIHRoZXNlIHNob3J0IHZhcmlhYmxlIG5hbWVzIHNvIHdlIGNhbiB1c2UgdGhlIHNhbWUgbWFjcm9zIGFzCisgICBgcmVnZXhfY29tcGlsZScgaXRzZWxmLiAgKi8KKworc3RhdGljIHJlZ19lcnJjb2RlX3QKK2NvbXBpbGVfcmFuZ2UgKHBfcHRyLCBwZW5kLCB0cmFuc2xhdGUsIHN5bnRheCwgYikKKyAgICBjb25zdCBjaGFyICoqcF9wdHIsICpwZW5kOworICAgIFJFX1RSQU5TTEFURV9UWVBFIHRyYW5zbGF0ZTsKKyAgICByZWdfc3ludGF4X3Qgc3ludGF4OworICAgIHVuc2lnbmVkIGNoYXIgKmI7Cit7CisgIHVuc2lnbmVkIHRoaXNfY2hhcjsKKworICBjb25zdCBjaGFyICpwID0gKnBfcHRyOworICB1bnNpZ25lZCBpbnQgcmFuZ2Vfc3RhcnQsIHJhbmdlX2VuZDsKKworICBpZiAocCA9PSBwZW5kKQorICAgIHJldHVybiBSRUdfRVJBTkdFOworCisgIC8qIEV2ZW4gdGhvdWdoIHRoZSBwYXR0ZXJuIGlzIGEgc2lnbmVkIGBjaGFyIConLCB3ZSBuZWVkIHRvIGZldGNoCisgICAgIHdpdGggdW5zaWduZWQgY2hhciAqJ3M7IGlmIHRoZSBoaWdoIGJpdCBvZiB0aGUgcGF0dGVybiBjaGFyYWN0ZXIKKyAgICAgaXMgc2V0LCB0aGUgcmFuZ2UgZW5kcG9pbnRzIHdpbGwgYmUgbmVnYXRpdmUgaWYgd2UgZmV0Y2ggdXNpbmcgYQorICAgICBzaWduZWQgY2hhciAqLgorCisgICAgIFdlIGFsc28gd2FudCB0byBmZXRjaCB0aGUgZW5kcG9pbnRzIHdpdGhvdXQgdHJhbnNsYXRpbmcgdGhlbTsgdGhlCisgICAgIGFwcHJvcHJpYXRlIHRyYW5zbGF0aW9uIGlzIGRvbmUgaW4gdGhlIGJpdC1zZXR0aW5nIGxvb3AgYmVsb3cuICAqLworICAvKiBUaGUgU1ZSNCBjb21waWxlciBvbiB0aGUgM0IyIGhhZCB0cm91YmxlIHdpdGggdW5zaWduZWQgY29uc3QgY2hhciAqLiAgKi8KKyAgcmFuZ2Vfc3RhcnQgPSAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcClbLTJdOworICByYW5nZV9lbmQgICA9ICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSBwKVswXTsKKworICAvKiBIYXZlIHRvIGluY3JlbWVudCB0aGUgcG9pbnRlciBpbnRvIHRoZSBwYXR0ZXJuIHN0cmluZywgc28gdGhlCisgICAgIGNhbGxlciBpc24ndCBzdGlsbCBhdCB0aGUgZW5kaW5nIGNoYXJhY3Rlci4gICovCisgICgqcF9wdHIpKys7CisKKyAgLyogSWYgdGhlIHN0YXJ0IGlzIGFmdGVyIHRoZSBlbmQsIHRoZSByYW5nZSBpcyBlbXB0eS4gICovCisgIGlmIChyYW5nZV9zdGFydCA+IHJhbmdlX2VuZCkKKyAgICByZXR1cm4gc3ludGF4ICYgUkVfTk9fRU1QVFlfUkFOR0VTID8gUkVHX0VSQU5HRSA6IFJFR19OT0VSUk9SOworCisgIC8qIEhlcmUgd2Ugc2VlIHdoeSBgdGhpc19jaGFyJyBoYXMgdG8gYmUgbGFyZ2VyIHRoYW4gYW4gYHVuc2lnbmVkCisgICAgIGNoYXInIC0tIHRoZSByYW5nZSBpcyBpbmNsdXNpdmUsIHNvIGlmIGByYW5nZV9lbmQnID09IDB4ZmYKKyAgICAgKGFzc3VtaW5nIDgtYml0IGNoYXJhY3RlcnMpLCB3ZSB3b3VsZCBvdGhlcndpc2UgZ28gaW50byBhbiBpbmZpbml0ZQorICAgICBsb29wLCBzaW5jZSBhbGwgY2hhcmFjdGVycyA8PSAweGZmLiAgKi8KKyAgZm9yICh0aGlzX2NoYXIgPSByYW5nZV9zdGFydDsgdGhpc19jaGFyIDw9IHJhbmdlX2VuZDsgdGhpc19jaGFyKyspCisgICAgeworICAgICAgU0VUX0xJU1RfQklUIChUUkFOU0xBVEUgKHRoaXNfY2hhcikpOworICAgIH0KKworICByZXR1cm4gUkVHX05PRVJST1I7Cit9CisMCisvKiByZV9jb21waWxlX2Zhc3RtYXAgY29tcHV0ZXMgYSBgYGZhc3RtYXAnJyBmb3IgdGhlIGNvbXBpbGVkIHBhdHRlcm4gaW4KKyAgIEJVRlAuICBBIGZhc3RtYXAgcmVjb3JkcyB3aGljaCBvZiB0aGUgKDEgPDwgQllURVdJRFRIKSBwb3NzaWJsZQorICAgY2hhcmFjdGVycyBjYW4gc3RhcnQgYSBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSBwYXR0ZXJuLiAgVGhpcyBmYXN0bWFwCisgICBpcyB1c2VkIGJ5IHJlX3NlYXJjaCB0byBza2lwIHF1aWNrbHkgb3ZlciBpbXBvc3NpYmxlIHN0YXJ0aW5nIHBvaW50cy4KKworICAgVGhlIGNhbGxlciBtdXN0IHN1cHBseSB0aGUgYWRkcmVzcyBvZiBhICgxIDw8IEJZVEVXSURUSCktYnl0ZSBkYXRhCisgICBhcmVhIGFzIEJVRlAtPmZhc3RtYXAuCisKKyAgIFdlIHNldCB0aGUgYGZhc3RtYXAnLCBgZmFzdG1hcF9hY2N1cmF0ZScsIGFuZCBgY2FuX2JlX251bGwnIGZpZWxkcyBpbgorICAgdGhlIHBhdHRlcm4gYnVmZmVyLgorCisgICBSZXR1cm5zIDAgaWYgd2Ugc3VjY2VlZCwgLTIgaWYgYW4gaW50ZXJuYWwgZXJyb3IuICAgKi8KKworaW50CityZV9jb21waWxlX2Zhc3RtYXAgKGJ1ZnApCisgICAgIHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqYnVmcDsKK3sKKyAgaW50IGosIGs7CisjaWZkZWYgTUFUQ0hfTUFZX0FMTE9DQVRFCisgIGZhaWxfc3RhY2tfdHlwZSBmYWlsX3N0YWNrOworI2VuZGlmCisjaWZuZGVmIFJFR0VYX01BTExPQworICBjaGFyICpkZXN0aW5hdGlvbjsKKyNlbmRpZgorCisgIHJlZ2lzdGVyIGNoYXIgKmZhc3RtYXAgPSBidWZwLT5mYXN0bWFwOworICB1bnNpZ25lZCBjaGFyICpwYXR0ZXJuID0gYnVmcC0+YnVmZmVyOworICB1bnNpZ25lZCBjaGFyICpwID0gcGF0dGVybjsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcGVuZCA9IHBhdHRlcm4gKyBidWZwLT51c2VkOworCisjaWZkZWYgUkVMX0FMTE9DCisgIC8qIFRoaXMgaG9sZHMgdGhlIHBvaW50ZXIgdG8gdGhlIGZhaWx1cmUgc3RhY2ssIHdoZW4KKyAgICAgaXQgaXMgYWxsb2NhdGVkIHJlbG9jYXRhYmx5LiAgKi8KKyAgZmFpbF9zdGFja19lbHRfdCAqZmFpbHVyZV9zdGFja19wdHI7CisjZW5kaWYKKworICAvKiBBc3N1bWUgdGhhdCBlYWNoIHBhdGggdGhyb3VnaCB0aGUgcGF0dGVybiBjYW4gYmUgbnVsbCB1bnRpbAorICAgICBwcm92ZW4gb3RoZXJ3aXNlLiAgV2Ugc2V0IHRoaXMgZmFsc2UgYXQgdGhlIGJvdHRvbSBvZiBzd2l0Y2gKKyAgICAgc3RhdGVtZW50LCB0byB3aGljaCB3ZSBnZXQgb25seSBpZiBhIHBhcnRpY3VsYXIgcGF0aCBkb2Vzbid0CisgICAgIG1hdGNoIHRoZSBlbXB0eSBzdHJpbmcuICAqLworICBib29sZWFuIHBhdGhfY2FuX2JlX251bGwgPSB0cnVlOworCisgIC8qIFdlIGFyZW4ndCBkb2luZyBhIGBzdWNjZWVkX24nIHRvIGJlZ2luIHdpdGguICAqLworICBib29sZWFuIHN1Y2NlZWRfbl9wID0gZmFsc2U7CisKKyAgYXNzZXJ0IChmYXN0bWFwICE9IE5VTEwgJiYgcCAhPSBOVUxMKTsKKworICBJTklUX0ZBSUxfU1RBQ0sgKCk7CisgIGJ6ZXJvIChmYXN0bWFwLCAxIDw8IEJZVEVXSURUSCk7ICAvKiBBc3N1bWUgbm90aGluZydzIHZhbGlkLiAgKi8KKyAgYnVmcC0+ZmFzdG1hcF9hY2N1cmF0ZSA9IDE7CSAgICAvKiBJdCB3aWxsIGJlIHdoZW4gd2UncmUgZG9uZS4gICovCisgIGJ1ZnAtPmNhbl9iZV9udWxsID0gMDsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAocCA9PSBwZW5kIHx8ICpwID09IHN1Y2NlZWQpCisJeworCSAgLyogV2UgaGF2ZSByZWFjaGVkIHRoZSAoZWZmZWN0aXZlKSBlbmQgb2YgcGF0dGVybi4gICovCisJICBpZiAoIUZBSUxfU1RBQ0tfRU1QVFkgKCkpCisJICAgIHsKKwkgICAgICBidWZwLT5jYW5fYmVfbnVsbCB8PSBwYXRoX2Nhbl9iZV9udWxsOworCisJICAgICAgLyogUmVzZXQgZm9yIG5leHQgcGF0aC4gICovCisJICAgICAgcGF0aF9jYW5fYmVfbnVsbCA9IHRydWU7CisKKwkgICAgICBwID0gZmFpbF9zdGFjay5zdGFja1stLWZhaWxfc3RhY2suYXZhaWxdLnBvaW50ZXI7CisKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBicmVhazsKKwl9CisKKyAgICAgIC8qIFdlIHNob3VsZCBuZXZlciBiZSBhYm91dCB0byBnbyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybi4gICovCisgICAgICBhc3NlcnQgKHAgPCBwZW5kKTsKKworICAgICAgc3dpdGNoIChTV0lUQ0hfRU5VTV9DQVNUICgocmVfb3Bjb2RlX3QpICpwKyspKQorCXsKKworICAgICAgICAvKiBJIGd1ZXNzIHRoZSBpZGVhIGhlcmUgaXMgdG8gc2ltcGx5IG5vdCBib3RoZXIgd2l0aCBhIGZhc3RtYXAKKyAgICAgICAgICAgaWYgYSBiYWNrcmVmZXJlbmNlIGlzIHVzZWQsIHNpbmNlIGl0J3MgdG9vIGhhcmQgdG8gZmlndXJlIG91dAorICAgICAgICAgICB0aGUgZmFzdG1hcCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZ3JvdXAuICBTZXR0aW5nCisgICAgICAgICAgIGBjYW5fYmVfbnVsbCcgc3RvcHMgYHJlX3NlYXJjaF8yJyBmcm9tIHVzaW5nIHRoZSBmYXN0bWFwLCBzbworICAgICAgICAgICB0aGF0IGlzIGFsbCB3ZSBkby4gICovCisJY2FzZSBkdXBsaWNhdGU6CisJICBidWZwLT5jYW5fYmVfbnVsbCA9IDE7CisgICAgICAgICAgZ290byBkb25lOworCisKKyAgICAgIC8qIEZvbGxvd2luZyBhcmUgdGhlIGNhc2VzIHdoaWNoIG1hdGNoIGEgY2hhcmFjdGVyLiAgVGhlc2UgZW5kCisgICAgICAgICB3aXRoIGBicmVhaycuICAqLworCisJY2FzZSBleGFjdG46CisgICAgICAgICAgZmFzdG1hcFtwWzFdXSA9IDE7CisJICBicmVhazsKKworCisgICAgICAgIGNhc2UgY2hhcnNldDoKKyAgICAgICAgICBmb3IgKGogPSAqcCsrICogQllURVdJRFRIIC0gMTsgaiA+PSAwOyBqLS0pCisJICAgIGlmIChwW2ogLyBCWVRFV0lEVEhdICYgKDEgPDwgKGogJSBCWVRFV0lEVEgpKSkKKyAgICAgICAgICAgICAgZmFzdG1hcFtqXSA9IDE7CisJICBicmVhazsKKworCisJY2FzZSBjaGFyc2V0X25vdDoKKwkgIC8qIENoYXJzIGJleW9uZCBlbmQgb2YgbWFwIG11c3QgYmUgYWxsb3dlZC4gICovCisJICBmb3IgKGogPSAqcCAqIEJZVEVXSURUSDsgaiA8ICgxIDw8IEJZVEVXSURUSCk7IGorKykKKyAgICAgICAgICAgIGZhc3RtYXBbal0gPSAxOworCisJICBmb3IgKGogPSAqcCsrICogQllURVdJRFRIIC0gMTsgaiA+PSAwOyBqLS0pCisJICAgIGlmICghKHBbaiAvIEJZVEVXSURUSF0gJiAoMSA8PCAoaiAlIEJZVEVXSURUSCkpKSkKKyAgICAgICAgICAgICAgZmFzdG1hcFtqXSA9IDE7CisgICAgICAgICAgYnJlYWs7CisKKworCWNhc2Ugd29yZGNoYXI6CisJICBmb3IgKGogPSAwOyBqIDwgKDEgPDwgQllURVdJRFRIKTsgaisrKQorCSAgICBpZiAoU1lOVEFYIChqKSA9PSBTd29yZCkKKwkgICAgICBmYXN0bWFwW2pdID0gMTsKKwkgIGJyZWFrOworCisKKwljYXNlIG5vdHdvcmRjaGFyOgorCSAgZm9yIChqID0gMDsgaiA8ICgxIDw8IEJZVEVXSURUSCk7IGorKykKKwkgICAgaWYgKFNZTlRBWCAoaikgIT0gU3dvcmQpCisJICAgICAgZmFzdG1hcFtqXSA9IDE7CisJICBicmVhazsKKworCisgICAgICAgIGNhc2UgYW55Y2hhcjoKKwkgIHsKKwkgICAgaW50IGZhc3RtYXBfbmV3bGluZSA9IGZhc3RtYXBbJ1xuJ107CisKKwkgICAgLyogYC4nIG1hdGNoZXMgYW55dGhpbmcgLi4uICAqLworCSAgICBmb3IgKGogPSAwOyBqIDwgKDEgPDwgQllURVdJRFRIKTsgaisrKQorCSAgICAgIGZhc3RtYXBbal0gPSAxOworCisJICAgIC8qIC4uLiBleGNlcHQgcGVyaGFwcyBuZXdsaW5lLiAgKi8KKwkgICAgaWYgKCEoYnVmcC0+c3ludGF4ICYgUkVfRE9UX05FV0xJTkUpKQorCSAgICAgIGZhc3RtYXBbJ1xuJ10gPSBmYXN0bWFwX25ld2xpbmU7CisKKwkgICAgLyogUmV0dXJuIGlmIHdlIGhhdmUgYWxyZWFkeSBzZXQgYGNhbl9iZV9udWxsJzsgaWYgd2UgaGF2ZSwKKwkgICAgICAgdGhlbiB0aGUgZmFzdG1hcCBpcyBpcnJlbGV2YW50LiAgU29tZXRoaW5nJ3Mgd3JvbmcgaGVyZS4gICovCisJICAgIGVsc2UgaWYgKGJ1ZnAtPmNhbl9iZV9udWxsKQorCSAgICAgIGdvdG8gZG9uZTsKKworCSAgICAvKiBPdGhlcndpc2UsIGhhdmUgdG8gY2hlY2sgYWx0ZXJuYXRpdmUgcGF0aHMuICAqLworCSAgICBicmVhazsKKwkgIH0KKworI2lmZGVmIGVtYWNzCisgICAgICAgIGNhc2Ugc3ludGF4c3BlYzoKKwkgIGsgPSAqcCsrOworCSAgZm9yIChqID0gMDsgaiA8ICgxIDw8IEJZVEVXSURUSCk7IGorKykKKwkgICAgaWYgKFNZTlRBWCAoaikgPT0gKGVudW0gc3ludGF4Y29kZSkgaykKKwkgICAgICBmYXN0bWFwW2pdID0gMTsKKwkgIGJyZWFrOworCisKKwljYXNlIG5vdHN5bnRheHNwZWM6CisJICBrID0gKnArKzsKKwkgIGZvciAoaiA9IDA7IGogPCAoMSA8PCBCWVRFV0lEVEgpOyBqKyspCisJICAgIGlmIChTWU5UQVggKGopICE9IChlbnVtIHN5bnRheGNvZGUpIGspCisJICAgICAgZmFzdG1hcFtqXSA9IDE7CisJICBicmVhazsKKworCisgICAgICAvKiBBbGwgY2FzZXMgYWZ0ZXIgdGhpcyBtYXRjaCB0aGUgZW1wdHkgc3RyaW5nLiAgVGhlc2UgZW5kIHdpdGgKKyAgICAgICAgIGBjb250aW51ZScuICAqLworCisKKwljYXNlIGJlZm9yZV9kb3Q6CisJY2FzZSBhdF9kb3Q6CisJY2FzZSBhZnRlcl9kb3Q6CisgICAgICAgICAgY29udGludWU7CisjZW5kaWYgLyogZW1hY3MgKi8KKworCisgICAgICAgIGNhc2Ugbm9fb3A6CisgICAgICAgIGNhc2UgYmVnbGluZToKKyAgICAgICAgY2FzZSBlbmRsaW5lOgorCWNhc2UgYmVnYnVmOgorCWNhc2UgZW5kYnVmOgorCWNhc2Ugd29yZGJvdW5kOgorCWNhc2Ugbm90d29yZGJvdW5kOgorCWNhc2Ugd29yZGJlZzoKKwljYXNlIHdvcmRlbmQ6CisgICAgICAgIGNhc2UgcHVzaF9kdW1teV9mYWlsdXJlOgorICAgICAgICAgIGNvbnRpbnVlOworCisKKwljYXNlIGp1bXBfbjoKKyAgICAgICAgY2FzZSBwb3BfZmFpbHVyZV9qdW1wOgorCWNhc2UgbWF5YmVfcG9wX2p1bXA6CisJY2FzZSBqdW1wOgorICAgICAgICBjYXNlIGp1bXBfcGFzdF9hbHQ6CisJY2FzZSBkdW1teV9mYWlsdXJlX2p1bXA6CisgICAgICAgICAgRVhUUkFDVF9OVU1CRVJfQU5EX0lOQ1IgKGosIHApOworCSAgcCArPSBqOworCSAgaWYgKGogPiAwKQorCSAgICBjb250aW51ZTsKKworICAgICAgICAgIC8qIEp1bXAgYmFja3dhcmQgaW1wbGllcyB3ZSBqdXN0IHdlbnQgdGhyb3VnaCB0aGUgYm9keSBvZiBhCisgICAgICAgICAgICAgbG9vcCBhbmQgbWF0Y2hlZCBub3RoaW5nLiAgT3Bjb2RlIGp1bXBlZCB0byBzaG91bGQgYmUKKyAgICAgICAgICAgICBgb25fZmFpbHVyZV9qdW1wJyBvciBgc3VjY2VlZF9uJy4gIEp1c3QgdHJlYXQgaXQgbGlrZSBhbgorICAgICAgICAgICAgIG9yZGluYXJ5IGp1bXAuICBGb3IgYSAqIGxvb3AsIGl0IGhhcyBwdXNoZWQgaXRzIGZhaWx1cmUKKyAgICAgICAgICAgICBwb2ludCBhbHJlYWR5OyBpZiBzbywgZGlzY2FyZCB0aGF0IGFzIHJlZHVuZGFudC4gICovCisgICAgICAgICAgaWYgKChyZV9vcGNvZGVfdCkgKnAgIT0gb25fZmFpbHVyZV9qdW1wCisJICAgICAgJiYgKHJlX29wY29kZV90KSAqcCAhPSBzdWNjZWVkX24pCisJICAgIGNvbnRpbnVlOworCisgICAgICAgICAgcCsrOworICAgICAgICAgIEVYVFJBQ1RfTlVNQkVSX0FORF9JTkNSIChqLCBwKTsKKyAgICAgICAgICBwICs9IGo7CisKKyAgICAgICAgICAvKiBJZiB3aGF0J3Mgb24gdGhlIHN0YWNrIGlzIHdoZXJlIHdlIGFyZSBub3csIHBvcCBpdC4gICovCisgICAgICAgICAgaWYgKCFGQUlMX1NUQUNLX0VNUFRZICgpCisJICAgICAgJiYgZmFpbF9zdGFjay5zdGFja1tmYWlsX3N0YWNrLmF2YWlsIC0gMV0ucG9pbnRlciA9PSBwKQorICAgICAgICAgICAgZmFpbF9zdGFjay5hdmFpbC0tOworCisgICAgICAgICAgY29udGludWU7CisKKworICAgICAgICBjYXNlIG9uX2ZhaWx1cmVfanVtcDoKKyAgICAgICAgY2FzZSBvbl9mYWlsdXJlX2tlZXBfc3RyaW5nX2p1bXA6CisJaGFuZGxlX29uX2ZhaWx1cmVfanVtcDoKKyAgICAgICAgICBFWFRSQUNUX05VTUJFUl9BTkRfSU5DUiAoaiwgcCk7CisKKyAgICAgICAgICAvKiBGb3Igc29tZSBwYXR0ZXJucywgZS5nLiwgYChhPyk/JywgYHAraicgaGVyZSBwb2ludHMgdG8gdGhlCisgICAgICAgICAgICAgZW5kIG9mIHRoZSBwYXR0ZXJuLiAgV2UgZG9uJ3Qgd2FudCB0byBwdXNoIHN1Y2ggYSBwb2ludCwKKyAgICAgICAgICAgICBzaW5jZSB3aGVuIHdlIHJlc3RvcmUgaXQgYWJvdmUsIGVudGVyaW5nIHRoZSBzd2l0Y2ggd2lsbAorICAgICAgICAgICAgIGluY3JlbWVudCBgcCcgcGFzdCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLiAgV2UgZG9uJ3QgbmVlZAorICAgICAgICAgICAgIHRvIHB1c2ggc3VjaCBhIHBvaW50IHNpbmNlIHdlIG9idmlvdXNseSB3b24ndCBmaW5kIGFueSBtb3JlCisgICAgICAgICAgICAgZmFzdG1hcCBlbnRyaWVzIGJleW9uZCBgcGVuZCcuICBTdWNoIGEgcGF0dGVybiBjYW4gbWF0Y2gKKyAgICAgICAgICAgICB0aGUgbnVsbCBzdHJpbmcsIHRob3VnaC4gICovCisgICAgICAgICAgaWYgKHAgKyBqIDwgcGVuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFQVVNIX1BBVFRFUk5fT1AgKHAgKyBqLCBmYWlsX3N0YWNrKSkKKwkJeworCQkgIFJFU0VUX0ZBSUxfU1RBQ0sgKCk7CisJCSAgcmV0dXJuIC0yOworCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYnVmcC0+Y2FuX2JlX251bGwgPSAxOworCisgICAgICAgICAgaWYgKHN1Y2NlZWRfbl9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBFWFRSQUNUX05VTUJFUl9BTkRfSU5DUiAoaywgcCk7CS8qIFNraXAgdGhlIG4uICAqLworICAgICAgICAgICAgICBzdWNjZWVkX25fcCA9IGZhbHNlOworCSAgICB9CisKKyAgICAgICAgICBjb250aW51ZTsKKworCisJY2FzZSBzdWNjZWVkX246CisgICAgICAgICAgLyogR2V0IHRvIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gc3VjY2VlZC4gICovCisgICAgICAgICAgcCArPSAyOworCisgICAgICAgICAgLyogSW5jcmVtZW50IHAgcGFzdCB0aGUgbiBmb3Igd2hlbiBrICE9IDAuICAqLworICAgICAgICAgIEVYVFJBQ1RfTlVNQkVSX0FORF9JTkNSIChrLCBwKTsKKyAgICAgICAgICBpZiAoayA9PSAwKQorCSAgICB7CisgICAgICAgICAgICAgIHAgLT0gNDsKKyAgCSAgICAgIHN1Y2NlZWRfbl9wID0gdHJ1ZTsgIC8qIFNwYWdoZXR0aSBjb2RlIGFsZXJ0LiAgKi8KKyAgICAgICAgICAgICAgZ290byBoYW5kbGVfb25fZmFpbHVyZV9qdW1wOworICAgICAgICAgICAgfQorICAgICAgICAgIGNvbnRpbnVlOworCisKKwljYXNlIHNldF9udW1iZXJfYXQ6CisgICAgICAgICAgcCArPSA0OworICAgICAgICAgIGNvbnRpbnVlOworCisKKwljYXNlIHN0YXJ0X21lbW9yeToKKyAgICAgICAgY2FzZSBzdG9wX21lbW9yeToKKwkgIHAgKz0gMjsKKwkgIGNvbnRpbnVlOworCisKKwlkZWZhdWx0OgorICAgICAgICAgIGFib3J0ICgpOyAvKiBXZSBoYXZlIGxpc3RlZCBhbGwgdGhlIGNhc2VzLiAgKi8KKyAgICAgICAgfSAvKiBzd2l0Y2ggKnArKyAqLworCisgICAgICAvKiBHZXR0aW5nIGhlcmUgbWVhbnMgd2UgaGF2ZSBmb3VuZCB0aGUgcG9zc2libGUgc3RhcnRpbmcKKyAgICAgICAgIGNoYXJhY3RlcnMgZm9yIG9uZSBwYXRoIG9mIHRoZSBwYXR0ZXJuIC0tIGFuZCB0aGF0IHRoZSBlbXB0eQorICAgICAgICAgc3RyaW5nIGRvZXMgbm90IG1hdGNoLiAgV2UgbmVlZCBub3QgZm9sbG93IHRoaXMgcGF0aCBmdXJ0aGVyLgorICAgICAgICAgSW5zdGVhZCwgbG9vayBhdCB0aGUgbmV4dCBhbHRlcm5hdGl2ZSAocmVtZW1iZXJlZCBvbiB0aGUKKyAgICAgICAgIHN0YWNrKSwgb3IgcXVpdCBpZiBubyBtb3JlLiAgVGhlIHRlc3QgYXQgdGhlIHRvcCBvZiB0aGUgbG9vcAorICAgICAgICAgZG9lcyB0aGVzZSB0aGluZ3MuICAqLworICAgICAgcGF0aF9jYW5fYmVfbnVsbCA9IGZhbHNlOworICAgICAgcCA9IHBlbmQ7CisgICAgfSAvKiB3aGlsZSBwICovCisKKyAgLyogU2V0IGBjYW5fYmVfbnVsbCcgZm9yIHRoZSBsYXN0IHBhdGggKGFsc28gdGhlIGZpcnN0IHBhdGgsIGlmIHRoZQorICAgICBwYXR0ZXJuIGlzIGVtcHR5KS4gICovCisgIGJ1ZnAtPmNhbl9iZV9udWxsIHw9IHBhdGhfY2FuX2JlX251bGw7CisKKyBkb25lOgorICBSRVNFVF9GQUlMX1NUQUNLICgpOworICByZXR1cm4gMDsKK30gLyogcmVfY29tcGlsZV9mYXN0bWFwICovCisjaWZkZWYgX0xJQkMKK3dlYWtfYWxpYXMgKF9fcmVfY29tcGlsZV9mYXN0bWFwLCByZV9jb21waWxlX2Zhc3RtYXApCisjZW5kaWYKKwwKKy8qIFNldCBSRUdTIHRvIGhvbGQgTlVNX1JFR1MgcmVnaXN0ZXJzLCBzdG9yaW5nIHRoZW0gaW4gU1RBUlRTIGFuZAorICAgRU5EUy4gIFN1YnNlcXVlbnQgbWF0Y2hlcyB1c2luZyBQQVRURVJOX0JVRkZFUiBhbmQgUkVHUyB3aWxsIHVzZQorICAgdGhpcyBtZW1vcnkgZm9yIHJlY29yZGluZyByZWdpc3RlciBpbmZvcm1hdGlvbi4gIFNUQVJUUyBhbmQgRU5EUworICAgbXVzdCBiZSBhbGxvY2F0ZWQgdXNpbmcgdGhlIG1hbGxvYyBsaWJyYXJ5IHJvdXRpbmUsIGFuZCBtdXN0IGVhY2gKKyAgIGJlIGF0IGxlYXN0IE5VTV9SRUdTICogc2l6ZW9mIChyZWdvZmZfdCkgYnl0ZXMgbG9uZy4KKworICAgSWYgTlVNX1JFR1MgPT0gMCwgdGhlbiBzdWJzZXF1ZW50IG1hdGNoZXMgc2hvdWxkIGFsbG9jYXRlIHRoZWlyIG93bgorICAgcmVnaXN0ZXIgZGF0YS4KKworICAgVW5sZXNzIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgZmlyc3Qgc2VhcmNoIG9yIG1hdGNoIHVzaW5nCisgICBQQVRURVJOX0JVRkZFUiB3aWxsIGFsbG9jYXRlIGl0cyBvd24gcmVnaXN0ZXIgZGF0YSwgd2l0aG91dAorICAgZnJlZWluZyB0aGUgb2xkIGRhdGEuICAqLworCit2b2lkCityZV9zZXRfcmVnaXN0ZXJzIChidWZwLCByZWdzLCBudW1fcmVncywgc3RhcnRzLCBlbmRzKQorICAgIHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqYnVmcDsKKyAgICBzdHJ1Y3QgcmVfcmVnaXN0ZXJzICpyZWdzOworICAgIHVuc2lnbmVkIG51bV9yZWdzOworICAgIHJlZ29mZl90ICpzdGFydHMsICplbmRzOworeworICBpZiAobnVtX3JlZ3MpCisgICAgeworICAgICAgYnVmcC0+cmVnc19hbGxvY2F0ZWQgPSBSRUdTX1JFQUxMT0NBVEU7CisgICAgICByZWdzLT5udW1fcmVncyA9IG51bV9yZWdzOworICAgICAgcmVncy0+c3RhcnQgPSBzdGFydHM7CisgICAgICByZWdzLT5lbmQgPSBlbmRzOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJ1ZnAtPnJlZ3NfYWxsb2NhdGVkID0gUkVHU19VTkFMTE9DQVRFRDsKKyAgICAgIHJlZ3MtPm51bV9yZWdzID0gMDsKKyAgICAgIHJlZ3MtPnN0YXJ0ID0gcmVncy0+ZW5kID0gKHJlZ29mZl90ICopIDA7CisgICAgfQorfQorI2lmZGVmIF9MSUJDCit3ZWFrX2FsaWFzIChfX3JlX3NldF9yZWdpc3RlcnMsIHJlX3NldF9yZWdpc3RlcnMpCisjZW5kaWYKKwwKKy8qIFNlYXJjaGluZyByb3V0aW5lcy4gICovCisKKy8qIExpa2UgcmVfc2VhcmNoXzIsIGJlbG93LCBidXQgb25seSBvbmUgc3RyaW5nIGlzIHNwZWNpZmllZCwgYW5kCisgICBkb2Vzbid0IGxldCB5b3Ugc2F5IHdoZXJlIHRvIHN0b3AgbWF0Y2hpbmcuICovCisKK2ludAorcmVfc2VhcmNoIChidWZwLCBzdHJpbmcsIHNpemUsIHN0YXJ0cG9zLCByYW5nZSwgcmVncykKKyAgICAgc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyICpidWZwOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7CisgICAgIGludCBzaXplLCBzdGFydHBvcywgcmFuZ2U7CisgICAgIHN0cnVjdCByZV9yZWdpc3RlcnMgKnJlZ3M7Cit7CisgIHJldHVybiByZV9zZWFyY2hfMiAoYnVmcCwgTlVMTCwgMCwgc3RyaW5nLCBzaXplLCBzdGFydHBvcywgcmFuZ2UsCisJCSAgICAgIHJlZ3MsIHNpemUpOworfQorI2lmZGVmIF9MSUJDCit3ZWFrX2FsaWFzIChfX3JlX3NlYXJjaCwgcmVfc2VhcmNoKQorI2VuZGlmCisKKworLyogVXNpbmcgdGhlIGNvbXBpbGVkIHBhdHRlcm4gaW4gQlVGUC0+YnVmZmVyLCBmaXJzdCB0cmllcyB0byBtYXRjaCB0aGUKKyAgIHZpcnR1YWwgY29uY2F0ZW5hdGlvbiBvZiBTVFJJTkcxIGFuZCBTVFJJTkcyLCBzdGFydGluZyBmaXJzdCBhdCBpbmRleAorICAgU1RBUlRQT1MsIHRoZW4gYXQgU1RBUlRQT1MgKyAxLCBhbmQgc28gb24uCisKKyAgIFNUUklORzEgYW5kIFNUUklORzIgaGF2ZSBsZW5ndGggU0laRTEgYW5kIFNJWkUyLCByZXNwZWN0aXZlbHkuCisKKyAgIFJBTkdFIGlzIGhvdyBmYXIgdG8gc2NhbiB3aGlsZSB0cnlpbmcgdG8gbWF0Y2guICBSQU5HRSA9IDAgbWVhbnMgdHJ5CisgICBvbmx5IGF0IFNUQVJUUE9TOyBpbiBnZW5lcmFsLCB0aGUgbGFzdCBzdGFydCB0cmllZCBpcyBTVEFSVFBPUyArCisgICBSQU5HRS4KKworICAgSW4gUkVHUywgcmV0dXJuIHRoZSBpbmRpY2VzIG9mIHRoZSB2aXJ0dWFsIGNvbmNhdGVuYXRpb24gb2YgU1RSSU5HMQorICAgYW5kIFNUUklORzIgdGhhdCBtYXRjaGVkIHRoZSBlbnRpcmUgQlVGUC0+YnVmZmVyIGFuZCBpdHMgY29udGFpbmVkCisgICBzdWJleHByZXNzaW9ucy4KKworICAgRG8gbm90IGNvbnNpZGVyIG1hdGNoaW5nIG9uZSBwYXN0IHRoZSBpbmRleCBTVE9QIGluIHRoZSB2aXJ0dWFsCisgICBjb25jYXRlbmF0aW9uIG9mIFNUUklORzEgYW5kIFNUUklORzIuCisKKyAgIFdlIHJldHVybiBlaXRoZXIgdGhlIHBvc2l0aW9uIGluIHRoZSBzdHJpbmdzIGF0IHdoaWNoIHRoZSBtYXRjaCB3YXMKKyAgIGZvdW5kLCAtMSBpZiBubyBtYXRjaCwgb3IgLTIgaWYgZXJyb3IgKHN1Y2ggYXMgZmFpbHVyZQorICAgc3RhY2sgb3ZlcmZsb3cpLiAgKi8KKworaW50CityZV9zZWFyY2hfMiAoYnVmcCwgc3RyaW5nMSwgc2l6ZTEsIHN0cmluZzIsIHNpemUyLCBzdGFydHBvcywgcmFuZ2UsIHJlZ3MsIHN0b3ApCisgICAgIHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqYnVmcDsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nMSwgKnN0cmluZzI7CisgICAgIGludCBzaXplMSwgc2l6ZTI7CisgICAgIGludCBzdGFydHBvczsKKyAgICAgaW50IHJhbmdlOworICAgICBzdHJ1Y3QgcmVfcmVnaXN0ZXJzICpyZWdzOworICAgICBpbnQgc3RvcDsKK3sKKyAgaW50IHZhbDsKKyAgcmVnaXN0ZXIgY2hhciAqZmFzdG1hcCA9IGJ1ZnAtPmZhc3RtYXA7CisgIHJlZ2lzdGVyIFJFX1RSQU5TTEFURV9UWVBFIHRyYW5zbGF0ZSA9IGJ1ZnAtPnRyYW5zbGF0ZTsKKyAgaW50IHRvdGFsX3NpemUgPSBzaXplMSArIHNpemUyOworICBpbnQgZW5kcG9zID0gc3RhcnRwb3MgKyByYW5nZTsKKworICAvKiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIFNUQVJUUE9TLiAgKi8KKyAgaWYgKHN0YXJ0cG9zIDwgMCB8fCBzdGFydHBvcyA+IHRvdGFsX3NpemUpCisgICAgcmV0dXJuIC0xOworCisgIC8qIEZpeCB1cCBSQU5HRSBpZiBpdCBtaWdodCBldmVudHVhbGx5IHRha2UgdXMgb3V0c2lkZQorICAgICB0aGUgdmlydHVhbCBjb25jYXRlbmF0aW9uIG9mIFNUUklORzEgYW5kIFNUUklORzIuCisgICAgIE1ha2Ugc3VyZSB3ZSB3b24ndCBtb3ZlIFNUQVJUUE9TIGJlbG93IDAgb3IgYWJvdmUgVE9UQUxfU0laRS4gICovCisgIGlmIChlbmRwb3MgPCAwKQorICAgIHJhbmdlID0gMCAtIHN0YXJ0cG9zOworICBlbHNlIGlmIChlbmRwb3MgPiB0b3RhbF9zaXplKQorICAgIHJhbmdlID0gdG90YWxfc2l6ZSAtIHN0YXJ0cG9zOworCisgIC8qIElmIHRoZSBzZWFyY2ggaXNuJ3QgdG8gYmUgYSBiYWNrd2FyZHMgb25lLCBkb24ndCB3YXN0ZSB0aW1lIGluIGEKKyAgICAgc2VhcmNoIGZvciBhIHBhdHRlcm4gdGhhdCBtdXN0IGJlIGFuY2hvcmVkLiAgKi8KKyAgaWYgKGJ1ZnAtPnVzZWQgPiAwICYmIChyZV9vcGNvZGVfdCkgYnVmcC0+YnVmZmVyWzBdID09IGJlZ2J1ZiAmJiByYW5nZSA+IDApCisgICAgeworICAgICAgaWYgKHN0YXJ0cG9zID4gMCkKKwlyZXR1cm4gLTE7CisgICAgICBlbHNlCisJcmFuZ2UgPSAxOworICAgIH0KKworI2lmZGVmIGVtYWNzCisgIC8qIEluIGEgZm9yd2FyZCBzZWFyY2ggZm9yIHNvbWV0aGluZyB0aGF0IHN0YXJ0cyB3aXRoIFw9LgorICAgICBkb24ndCBrZWVwIHNlYXJjaGluZyBwYXN0IHBvaW50LiAgKi8KKyAgaWYgKGJ1ZnAtPnVzZWQgPiAwICYmIChyZV9vcGNvZGVfdCkgYnVmcC0+YnVmZmVyWzBdID09IGF0X2RvdCAmJiByYW5nZSA+IDApCisgICAgeworICAgICAgcmFuZ2UgPSBQVCAtIHN0YXJ0cG9zOworICAgICAgaWYgKHJhbmdlIDw9IDApCisJcmV0dXJuIC0xOworICAgIH0KKyNlbmRpZiAvKiBlbWFjcyAqLworCisgIC8qIFVwZGF0ZSB0aGUgZmFzdG1hcCBub3cgaWYgbm90IGNvcnJlY3QgYWxyZWFkeS4gICovCisgIGlmIChmYXN0bWFwICYmICFidWZwLT5mYXN0bWFwX2FjY3VyYXRlKQorICAgIGlmIChyZV9jb21waWxlX2Zhc3RtYXAgKGJ1ZnApID09IC0yKQorICAgICAgcmV0dXJuIC0yOworCisgIC8qIExvb3AgdGhyb3VnaCB0aGUgc3RyaW5nLCBsb29raW5nIGZvciBhIHBsYWNlIHRvIHN0YXJ0IG1hdGNoaW5nLiAgKi8KKyAgZm9yICg7OykKKyAgICB7CisgICAgICAvKiBJZiBhIGZhc3RtYXAgaXMgc3VwcGxpZWQsIHNraXAgcXVpY2tseSBvdmVyIGNoYXJhY3RlcnMgdGhhdAorICAgICAgICAgY2Fubm90IGJlIHRoZSBzdGFydCBvZiBhIG1hdGNoLiAgSWYgdGhlIHBhdHRlcm4gY2FuIG1hdGNoIHRoZQorICAgICAgICAgbnVsbCBzdHJpbmcsIGhvd2V2ZXIsIHdlIGRvbid0IG5lZWQgdG8gc2tpcCBjaGFyYWN0ZXJzOyB3ZSB3YW50CisgICAgICAgICB0aGUgZmlyc3QgbnVsbCBzdHJpbmcuICAqLworICAgICAgaWYgKGZhc3RtYXAgJiYgc3RhcnRwb3MgPCB0b3RhbF9zaXplICYmICFidWZwLT5jYW5fYmVfbnVsbCkKKwl7CisJICBpZiAocmFuZ2UgPiAwKQkvKiBTZWFyY2hpbmcgZm9yd2FyZHMuICAqLworCSAgICB7CisJICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqZDsKKwkgICAgICByZWdpc3RlciBpbnQgbGltID0gMDsKKwkgICAgICBpbnQgaXJhbmdlID0gcmFuZ2U7CisKKyAgICAgICAgICAgICAgaWYgKHN0YXJ0cG9zIDwgc2l6ZTEgJiYgc3RhcnRwb3MgKyByYW5nZSA+PSBzaXplMSkKKyAgICAgICAgICAgICAgICBsaW0gPSByYW5nZSAtIChzaXplMSAtIHN0YXJ0cG9zKTsKKworCSAgICAgIGQgPSAoc3RhcnRwb3MgPj0gc2l6ZTEgPyBzdHJpbmcyIC0gc2l6ZTEgOiBzdHJpbmcxKSArIHN0YXJ0cG9zOworCisgICAgICAgICAgICAgIC8qIFdyaXR0ZW4gb3V0IGFzIGFuIGlmLWVsc2UgdG8gYXZvaWQgdGVzdGluZyBgdHJhbnNsYXRlJworICAgICAgICAgICAgICAgICBpbnNpZGUgdGhlIGxvb3AuICAqLworCSAgICAgIGlmICh0cmFuc2xhdGUpCisgICAgICAgICAgICAgICAgd2hpbGUgKHJhbmdlID4gbGltCisgICAgICAgICAgICAgICAgICAgICAgICYmICFmYXN0bWFwWyh1bnNpZ25lZCBjaGFyKQorCQkJCSAgIHRyYW5zbGF0ZVsodW5zaWduZWQgY2hhcikgKmQrK11dKQorICAgICAgICAgICAgICAgICAgcmFuZ2UtLTsKKwkgICAgICBlbHNlCisgICAgICAgICAgICAgICAgd2hpbGUgKHJhbmdlID4gbGltICYmICFmYXN0bWFwWyh1bnNpZ25lZCBjaGFyKSAqZCsrXSkKKyAgICAgICAgICAgICAgICAgIHJhbmdlLS07CisKKwkgICAgICBzdGFydHBvcyArPSBpcmFuZ2UgLSByYW5nZTsKKwkgICAgfQorCSAgZWxzZQkJCQkvKiBTZWFyY2hpbmcgYmFja3dhcmRzLiAgKi8KKwkgICAgeworCSAgICAgIHJlZ2lzdGVyIGNoYXIgYyA9IChzaXplMSA9PSAwIHx8IHN0YXJ0cG9zID49IHNpemUxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN0cmluZzJbc3RhcnRwb3MgLSBzaXplMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RyaW5nMVtzdGFydHBvc10pOworCisJICAgICAgaWYgKCFmYXN0bWFwWyh1bnNpZ25lZCBjaGFyKSBUUkFOU0xBVEUgKGMpXSkKKwkJZ290byBhZHZhbmNlOworCSAgICB9CisJfQorCisgICAgICAvKiBJZiBjYW4ndCBtYXRjaCB0aGUgbnVsbCBzdHJpbmcsIGFuZCB0aGF0J3MgYWxsIHdlIGhhdmUgbGVmdCwgZmFpbC4gICovCisgICAgICBpZiAocmFuZ2UgPj0gMCAmJiBzdGFydHBvcyA9PSB0b3RhbF9zaXplICYmIGZhc3RtYXAKKyAgICAgICAgICAmJiAhYnVmcC0+Y2FuX2JlX251bGwpCisJcmV0dXJuIC0xOworCisgICAgICB2YWwgPSByZV9tYXRjaF8yX2ludGVybmFsIChidWZwLCBzdHJpbmcxLCBzaXplMSwgc3RyaW5nMiwgc2l6ZTIsCisJCQkJIHN0YXJ0cG9zLCByZWdzLCBzdG9wKTsKKyNpZm5kZWYgUkVHRVhfTUFMTE9DCisjIGlmZGVmIENfQUxMT0NBCisgICAgICBhbGxvY2EgKDApOworIyBlbmRpZgorI2VuZGlmCisKKyAgICAgIGlmICh2YWwgPj0gMCkKKwlyZXR1cm4gc3RhcnRwb3M7CisKKyAgICAgIGlmICh2YWwgPT0gLTIpCisJcmV0dXJuIC0yOworCisgICAgYWR2YW5jZToKKyAgICAgIGlmICghcmFuZ2UpCisgICAgICAgIGJyZWFrOworICAgICAgZWxzZSBpZiAocmFuZ2UgPiAwKQorICAgICAgICB7CisgICAgICAgICAgcmFuZ2UtLTsKKyAgICAgICAgICBzdGFydHBvcysrOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICByYW5nZSsrOworICAgICAgICAgIHN0YXJ0cG9zLS07CisgICAgICAgIH0KKyAgICB9CisgIHJldHVybiAtMTsKK30gLyogcmVfc2VhcmNoXzIgKi8KKyNpZmRlZiBfTElCQword2Vha19hbGlhcyAoX19yZV9zZWFyY2hfMiwgcmVfc2VhcmNoXzIpCisjZW5kaWYKKwwKKy8qIFRoaXMgY29udmVydHMgUFRSLCBhIHBvaW50ZXIgaW50byBvbmUgb2YgdGhlIHNlYXJjaCBzdHJpbmdzIGBzdHJpbmcxJworICAgYW5kIGBzdHJpbmcyJyBpbnRvIGFuIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhhdCBzdHJpbmcuICAqLworI2RlZmluZSBQT0lOVEVSX1RPX09GRlNFVChwdHIpCQkJXAorICAoRklSU1RfU1RSSU5HX1AgKHB0cikJCQkJXAorICAgPyAoKHJlZ29mZl90KSAoKHB0cikgLSBzdHJpbmcxKSkJCVwKKyAgIDogKChyZWdvZmZfdCkgKChwdHIpIC0gc3RyaW5nMiArIHNpemUxKSkpCisKKy8qIE1hY3JvcyBmb3IgZGVhbGluZyB3aXRoIHRoZSBzcGxpdCBzdHJpbmdzIGluIHJlX21hdGNoXzIuICAqLworCisjZGVmaW5lIE1BVENISU5HX0lOX0ZJUlNUX1NUUklORyAgKGRlbmQgPT0gZW5kX21hdGNoXzEpCisKKy8qIENhbGwgYmVmb3JlIGZldGNoaW5nIGEgY2hhcmFjdGVyIHdpdGggKmQuICBUaGlzIHN3aXRjaGVzIG92ZXIgdG8KKyAgIHN0cmluZzIgaWYgbmVjZXNzYXJ5LiAgKi8KKyNkZWZpbmUgUFJFRkVUQ0goKQkJCQkJCQlcCisgIHdoaWxlIChkID09IGRlbmQpCQkJCQkJICAgIAlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIC8qIEVuZCBvZiBzdHJpbmcyID0+IGZhaWwuICAqLwkJCQkJXAorICAgICAgaWYgKGRlbmQgPT0gZW5kX21hdGNoXzIpIAkJCQkJCVwKKyAgICAgICAgZ290byBmYWlsOwkJCQkJCQlcCisgICAgICAvKiBFbmQgb2Ygc3RyaW5nMSA9PiBhZHZhbmNlIHRvIHN0cmluZzIuICAqLyAJCQlcCisgICAgICBkID0gc3RyaW5nMjsJCQkJCQkgICAgICAgIFwKKyAgICAgIGRlbmQgPSBlbmRfbWF0Y2hfMjsJCQkJCQlcCisgICAgfQorCisKKy8qIFRlc3QgaWYgYXQgdmVyeSBiZWdpbm5pbmcgb3IgYXQgdmVyeSBlbmQgb2YgdGhlIHZpcnR1YWwgY29uY2F0ZW5hdGlvbgorICAgb2YgYHN0cmluZzEnIGFuZCBgc3RyaW5nMicuICBJZiBvbmx5IG9uZSBzdHJpbmcsIGl0J3MgYHN0cmluZzInLiAgKi8KKyNkZWZpbmUgQVRfU1RSSU5HU19CRUcoZCkgKChkKSA9PSAoc2l6ZTEgPyBzdHJpbmcxIDogc3RyaW5nMikgfHwgIXNpemUyKQorI2RlZmluZSBBVF9TVFJJTkdTX0VORChkKSAoKGQpID09IGVuZDIpCisKKworLyogVGVzdCBpZiBEIHBvaW50cyB0byBhIGNoYXJhY3RlciB3aGljaCBpcyB3b3JkLWNvbnN0aXR1ZW50LiAgV2UgaGF2ZQorICAgdHdvIHNwZWNpYWwgY2FzZXMgdG8gY2hlY2sgZm9yOiBpZiBwYXN0IHRoZSBlbmQgb2Ygc3RyaW5nMSwgbG9vayBhdAorICAgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiBzdHJpbmcyOyBhbmQgaWYgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YKKyAgIHN0cmluZzIsIGxvb2sgYXQgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHN0cmluZzEuICAqLworI2RlZmluZSBXT1JEQ0hBUl9QKGQpCQkJCQkJCVwKKyAgKFNZTlRBWCAoKGQpID09IGVuZDEgPyAqc3RyaW5nMgkJCQkJXAorICAgICAgICAgICA6IChkKSA9PSBzdHJpbmcyIC0gMSA/ICooZW5kMSAtIDEpIDogKihkKSkJCQlcCisgICA9PSBTd29yZCkKKworLyogRGlzYWJsZWQgZHVlIHRvIGEgY29tcGlsZXIgYnVnIC0tIHNlZSBjb21tZW50IGF0IGNhc2Ugd29yZGJvdW5kICovCisjaWYgMAorLyogVGVzdCBpZiB0aGUgY2hhcmFjdGVyIGJlZm9yZSBEIGFuZCB0aGUgb25lIGF0IEQgZGlmZmVyIHdpdGggcmVzcGVjdAorICAgdG8gYmVpbmcgd29yZC1jb25zdGl0dWVudC4gICovCisjZGVmaW5lIEFUX1dPUkRfQk9VTkRBUlkoZCkJCQkJCQlcCisgIChBVF9TVFJJTkdTX0JFRyAoZCkgfHwgQVRfU1RSSU5HU19FTkQgKGQpCQkJCVwKKyAgIHx8IFdPUkRDSEFSX1AgKGQgLSAxKSAhPSBXT1JEQ0hBUl9QIChkKSkKKyNlbmRpZgorCisvKiBGcmVlIGV2ZXJ5dGhpbmcgd2UgbWFsbG9jLiAgKi8KKyNpZmRlZiBNQVRDSF9NQVlfQUxMT0NBVEUKKyMgZGVmaW5lIEZSRUVfVkFSKHZhcikgaWYgKHZhcikgUkVHRVhfRlJFRSAodmFyKTsgdmFyID0gTlVMTAorIyBkZWZpbmUgRlJFRV9WQVJJQUJMRVMoKQkJCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBSRUdFWF9GUkVFX1NUQUNLIChmYWlsX3N0YWNrLnN0YWNrKTsJCQkJXAorICAgIEZSRUVfVkFSIChyZWdzdGFydCk7CQkJCQkJXAorICAgIEZSRUVfVkFSIChyZWdlbmQpOwkJCQkJCQlcCisgICAgRlJFRV9WQVIgKG9sZF9yZWdzdGFydCk7CQkJCQkJXAorICAgIEZSRUVfVkFSIChvbGRfcmVnZW5kKTsJCQkJCQlcCisgICAgRlJFRV9WQVIgKGJlc3RfcmVnc3RhcnQpOwkJCQkJCVwKKyAgICBGUkVFX1ZBUiAoYmVzdF9yZWdlbmQpOwkJCQkJCVwKKyAgICBGUkVFX1ZBUiAocmVnX2luZm8pOwkJCQkJCVwKKyAgICBGUkVFX1ZBUiAocmVnX2R1bW15KTsJCQkJCQlcCisgICAgRlJFRV9WQVIgKHJlZ19pbmZvX2R1bW15KTsJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZWxzZQorIyBkZWZpbmUgRlJFRV9WQVJJQUJMRVMoKSAoKHZvaWQpMCkgLyogRG8gbm90aGluZyEgIEJ1dCBpbmhpYml0IGdjYyB3YXJuaW5nLiAqLworI2VuZGlmIC8qIG5vdCBNQVRDSF9NQVlfQUxMT0NBVEUgKi8KKworLyogVGhlc2UgdmFsdWVzIG11c3QgbWVldCBzZXZlcmFsIGNvbnN0cmFpbnRzLiAgVGhleSBtdXN0IG5vdCBiZSB2YWxpZAorICAgcmVnaXN0ZXIgdmFsdWVzOyBzaW5jZSB3ZSBoYXZlIGEgbGltaXQgb2YgMjU1IHJlZ2lzdGVycyAoYmVjYXVzZQorICAgd2UgdXNlIG9ubHkgb25lIGJ5dGUgaW4gdGhlIHBhdHRlcm4gZm9yIHRoZSByZWdpc3RlciBudW1iZXIpLCB3ZSBjYW4KKyAgIHVzZSBudW1iZXJzIGxhcmdlciB0aGFuIDI1NS4gIFRoZXkgbXVzdCBkaWZmZXIgYnkgMSwgYmVjYXVzZSBvZgorICAgTlVNX0ZBSUxVUkVfSVRFTVMgYWJvdmUuICBBbmQgdGhlIHZhbHVlIGZvciB0aGUgbG93ZXN0IHJlZ2lzdGVyIG11c3QKKyAgIGJlIGxhcmdlciB0aGFuIHRoZSB2YWx1ZSBmb3IgdGhlIGhpZ2hlc3QgcmVnaXN0ZXIsIHNvIHdlIGRvIG5vdCB0cnkKKyAgIHRvIGFjdHVhbGx5IHNhdmUgYW55IHJlZ2lzdGVycyB3aGVuIG5vbmUgYXJlIGFjdGl2ZS4gICovCisjZGVmaW5lIE5PX0hJR0hFU1RfQUNUSVZFX1JFRyAoMSA8PCBCWVRFV0lEVEgpCisjZGVmaW5lIE5PX0xPV0VTVF9BQ1RJVkVfUkVHIChOT19ISUdIRVNUX0FDVElWRV9SRUcgKyAxKQorDAorLyogTWF0Y2hpbmcgcm91dGluZXMuICAqLworCisjaWZuZGVmIGVtYWNzICAgLyogRW1hY3MgbmV2ZXIgdXNlcyB0aGlzLiAgKi8KKy8qIHJlX21hdGNoIGlzIGxpa2UgcmVfbWF0Y2hfMiBleGNlcHQgaXQgdGFrZXMgb25seSBhIHNpbmdsZSBzdHJpbmcuICAqLworCitpbnQKK3JlX21hdGNoIChidWZwLCBzdHJpbmcsIHNpemUsIHBvcywgcmVncykKKyAgICAgc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyICpidWZwOworICAgICBjb25zdCBjaGFyICpzdHJpbmc7CisgICAgIGludCBzaXplLCBwb3M7CisgICAgIHN0cnVjdCByZV9yZWdpc3RlcnMgKnJlZ3M7Cit7CisgIGludCByZXN1bHQgPSByZV9tYXRjaF8yX2ludGVybmFsIChidWZwLCBOVUxMLCAwLCBzdHJpbmcsIHNpemUsCisJCQkJICAgIHBvcywgcmVncywgc2l6ZSk7CisjIGlmbmRlZiBSRUdFWF9NQUxMT0MKKyMgIGlmZGVmIENfQUxMT0NBCisgIGFsbG9jYSAoMCk7CisjICBlbmRpZgorIyBlbmRpZgorICByZXR1cm4gcmVzdWx0OworfQorIyBpZmRlZiBfTElCQword2Vha19hbGlhcyAoX19yZV9tYXRjaCwgcmVfbWF0Y2gpCisjIGVuZGlmCisjZW5kaWYgLyogbm90IGVtYWNzICovCisKK3N0YXRpYyBib29sZWFuIGdyb3VwX21hdGNoX251bGxfc3RyaW5nX3AgX1JFX0FSR1MgKCh1bnNpZ25lZCBjaGFyICoqcCwKKwkJCQkJCSAgICB1bnNpZ25lZCBjaGFyICplbmQsCisJCQkJCQlyZWdpc3Rlcl9pbmZvX3R5cGUgKnJlZ19pbmZvKSk7CitzdGF0aWMgYm9vbGVhbiBhbHRfbWF0Y2hfbnVsbF9zdHJpbmdfcCBfUkVfQVJHUyAoKHVuc2lnbmVkIGNoYXIgKnAsCisJCQkJCQkgIHVuc2lnbmVkIGNoYXIgKmVuZCwKKwkJCQkJCXJlZ2lzdGVyX2luZm9fdHlwZSAqcmVnX2luZm8pKTsKK3N0YXRpYyBib29sZWFuIGNvbW1vbl9vcF9tYXRjaF9udWxsX3N0cmluZ19wIF9SRV9BUkdTICgodW5zaWduZWQgY2hhciAqKnAsCisJCQkJCQkJdW5zaWduZWQgY2hhciAqZW5kLAorCQkJCQkJcmVnaXN0ZXJfaW5mb190eXBlICpyZWdfaW5mbykpOworc3RhdGljIGludCBiY21wX3RyYW5zbGF0ZSBfUkVfQVJHUyAoKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwKKwkJCQkgICAgIGludCBsZW4sIGNoYXIgKnRyYW5zbGF0ZSkpOworCisvKiByZV9tYXRjaF8yIG1hdGNoZXMgdGhlIGNvbXBpbGVkIHBhdHRlcm4gaW4gQlVGUCBhZ2FpbnN0IHRoZQorICAgdGhlICh2aXJ0dWFsKSBjb25jYXRlbmF0aW9uIG9mIFNUUklORzEgYW5kIFNUUklORzIgKG9mIGxlbmd0aCBTSVpFMQorICAgYW5kIFNJWkUyLCByZXNwZWN0aXZlbHkpLiAgV2Ugc3RhcnQgbWF0Y2hpbmcgYXQgUE9TLCBhbmQgc3RvcAorICAgbWF0Y2hpbmcgYXQgU1RPUC4KKworICAgSWYgUkVHUyBpcyBub24tbnVsbCBhbmQgdGhlIGBub19zdWInIGZpZWxkIG9mIEJVRlAgaXMgbm9uemVybywgd2UKKyAgIHN0b3JlIG9mZnNldHMgZm9yIHRoZSBzdWJzdHJpbmcgZWFjaCBncm91cCBtYXRjaGVkIGluIFJFR1MuICBTZWUgdGhlCisgICBkb2N1bWVudGF0aW9uIGZvciBleGFjdGx5IGhvdyBtYW55IGdyb3VwcyB3ZSBmaWxsLgorCisgICBXZSByZXR1cm4gLTEgaWYgbm8gbWF0Y2gsIC0yIGlmIGFuIGludGVybmFsIGVycm9yIChzdWNoIGFzIHRoZQorICAgZmFpbHVyZSBzdGFjayBvdmVyZmxvd2luZykuICBPdGhlcndpc2UsIHdlIHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZQorICAgbWF0Y2hlZCBzdWJzdHJpbmcuICAqLworCitpbnQKK3JlX21hdGNoXzIgKGJ1ZnAsIHN0cmluZzEsIHNpemUxLCBzdHJpbmcyLCBzaXplMiwgcG9zLCByZWdzLCBzdG9wKQorICAgICBzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgKmJ1ZnA7CisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzEsICpzdHJpbmcyOworICAgICBpbnQgc2l6ZTEsIHNpemUyOworICAgICBpbnQgcG9zOworICAgICBzdHJ1Y3QgcmVfcmVnaXN0ZXJzICpyZWdzOworICAgICBpbnQgc3RvcDsKK3sKKyAgaW50IHJlc3VsdCA9IHJlX21hdGNoXzJfaW50ZXJuYWwgKGJ1ZnAsIHN0cmluZzEsIHNpemUxLCBzdHJpbmcyLCBzaXplMiwKKwkJCQkgICAgcG9zLCByZWdzLCBzdG9wKTsKKyNpZm5kZWYgUkVHRVhfTUFMTE9DCisjIGlmZGVmIENfQUxMT0NBCisgIGFsbG9jYSAoMCk7CisjIGVuZGlmCisjZW5kaWYKKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNpZmRlZiBfTElCQword2Vha19hbGlhcyAoX19yZV9tYXRjaF8yLCByZV9tYXRjaF8yKQorI2VuZGlmCisKKy8qIFRoaXMgaXMgYSBzZXBhcmF0ZSBmdW5jdGlvbiBzbyB0aGF0IHdlIGNhbiBmb3JjZSBhbiBhbGxvY2EgY2xlYW51cAorICAgYWZ0ZXJ3YXJkcy4gICovCitzdGF0aWMgaW50CityZV9tYXRjaF8yX2ludGVybmFsIChidWZwLCBzdHJpbmcxLCBzaXplMSwgc3RyaW5nMiwgc2l6ZTIsIHBvcywgcmVncywgc3RvcCkKKyAgICAgc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyICpidWZwOworICAgICBjb25zdCBjaGFyICpzdHJpbmcxLCAqc3RyaW5nMjsKKyAgICAgaW50IHNpemUxLCBzaXplMjsKKyAgICAgaW50IHBvczsKKyAgICAgc3RydWN0IHJlX3JlZ2lzdGVycyAqcmVnczsKKyAgICAgaW50IHN0b3A7Cit7CisgIC8qIEdlbmVyYWwgdGVtcG9yYXJpZXMuICAqLworICBpbnQgbWNudDsKKyAgdW5zaWduZWQgY2hhciAqcDE7CisKKyAgLyogSnVzdCBwYXN0IHRoZSBlbmQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc3RyaW5nLiAgKi8KKyAgY29uc3QgY2hhciAqZW5kMSwgKmVuZDI7CisKKyAgLyogUG9pbnRlcnMgaW50byBzdHJpbmcxIGFuZCBzdHJpbmcyLCBqdXN0IHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVycyBpbgorICAgICBlYWNoIHRvIGNvbnNpZGVyIG1hdGNoaW5nLiAgKi8KKyAgY29uc3QgY2hhciAqZW5kX21hdGNoXzEsICplbmRfbWF0Y2hfMjsKKworICAvKiBXaGVyZSB3ZSBhcmUgaW4gdGhlIGRhdGEsIGFuZCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHN0cmluZy4gICovCisgIGNvbnN0IGNoYXIgKmQsICpkZW5kOworCisgIC8qIFdoZXJlIHdlIGFyZSBpbiB0aGUgcGF0dGVybiwgYW5kIHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4uICAqLworICB1bnNpZ25lZCBjaGFyICpwID0gYnVmcC0+YnVmZmVyOworICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwZW5kID0gcCArIGJ1ZnAtPnVzZWQ7CisKKyAgLyogTWFyayB0aGUgb3Bjb2RlIGp1c3QgYWZ0ZXIgYSBzdGFydF9tZW1vcnksIHNvIHdlIGNhbiB0ZXN0IGZvciBhbgorICAgICBlbXB0eSBzdWJwYXR0ZXJuIHdoZW4gd2UgZ2V0IHRvIHRoZSBzdG9wX21lbW9yeS4gICovCisgIHVuc2lnbmVkIGNoYXIgKmp1c3RfcGFzdF9zdGFydF9tZW0gPSAwOworCisgIC8qIFdlIHVzZSB0aGlzIHRvIG1hcCBldmVyeSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gICovCisgIFJFX1RSQU5TTEFURV9UWVBFIHRyYW5zbGF0ZSA9IGJ1ZnAtPnRyYW5zbGF0ZTsKKworICAvKiBGYWlsdXJlIHBvaW50IHN0YWNrLiAgRWFjaCBwbGFjZSB0aGF0IGNhbiBoYW5kbGUgYSBmYWlsdXJlIGZ1cnRoZXIKKyAgICAgZG93biB0aGUgbGluZSBwdXNoZXMgYSBmYWlsdXJlIHBvaW50IG9uIHRoaXMgc3RhY2suICBJdCBjb25zaXN0cyBvZgorICAgICByZXN0YXJ0LCByZWdlbmQsIGFuZCByZWdfaW5mbyBmb3IgYWxsIHJlZ2lzdGVycyBjb3JyZXNwb25kaW5nIHRvCisgICAgIHRoZSBzdWJleHByZXNzaW9ucyB3ZSdyZSBjdXJyZW50bHkgaW5zaWRlLCBwbHVzIHRoZSBudW1iZXIgb2Ygc3VjaAorICAgICByZWdpc3RlcnMsIGFuZCwgZmluYWxseSwgdHdvIGNoYXIgKidzLiAgVGhlIGZpcnN0IGNoYXIgKiBpcyB3aGVyZQorICAgICB0byByZXN1bWUgc2Nhbm5pbmcgdGhlIHBhdHRlcm47IHRoZSBzZWNvbmQgb25lIGlzIHdoZXJlIHRvIHJlc3VtZQorICAgICBzY2FubmluZyB0aGUgc3RyaW5ncy4gIElmIHRoZSBsYXR0ZXIgaXMgemVybywgdGhlIGZhaWx1cmUgcG9pbnQgaXMKKyAgICAgYSBgYGR1bW15Jyc7IGlmIGEgZmFpbHVyZSBoYXBwZW5zIGFuZCB0aGUgZmFpbHVyZSBwb2ludCBpcyBhIGR1bW15LAorICAgICBpdCBnZXRzIGRpc2NhcmRlZCBhbmQgdGhlIG5leHQgbmV4dCBvbmUgaXMgdHJpZWQuICAqLworI2lmZGVmIE1BVENIX01BWV9BTExPQ0FURSAvKiBvdGhlcndpc2UsIHRoaXMgaXMgZ2xvYmFsLiAgKi8KKyAgZmFpbF9zdGFja190eXBlIGZhaWxfc3RhY2s7CisjZW5kaWYKKyNpZmRlZiBERUJVRworICBzdGF0aWMgdW5zaWduZWQgZmFpbHVyZV9pZCA9IDA7CisgIHVuc2lnbmVkIG5mYWlsdXJlX3BvaW50c19wdXNoZWQgPSAwLCBuZmFpbHVyZV9wb2ludHNfcG9wcGVkID0gMDsKKyNlbmRpZgorCisjaWZkZWYgUkVMX0FMTE9DCisgIC8qIFRoaXMgaG9sZHMgdGhlIHBvaW50ZXIgdG8gdGhlIGZhaWx1cmUgc3RhY2ssIHdoZW4KKyAgICAgaXQgaXMgYWxsb2NhdGVkIHJlbG9jYXRhYmx5LiAgKi8KKyAgZmFpbF9zdGFja19lbHRfdCAqZmFpbHVyZV9zdGFja19wdHI7CisjZW5kaWYKKworICAvKiBXZSBmaWxsIGFsbCB0aGUgcmVnaXN0ZXJzIGludGVybmFsbHksIGluZGVwZW5kZW50IG9mIHdoYXQgd2UKKyAgICAgcmV0dXJuLCBmb3IgdXNlIGluIGJhY2tyZWZlcmVuY2VzLiAgVGhlIG51bWJlciBoZXJlIGluY2x1ZGVzCisgICAgIGFuIGVsZW1lbnQgZm9yIHJlZ2lzdGVyIHplcm8uICAqLworICBzaXplX3QgbnVtX3JlZ3MgPSBidWZwLT5yZV9uc3ViICsgMTsKKworICAvKiBUaGUgY3VycmVudGx5IGFjdGl2ZSByZWdpc3RlcnMuICAqLworICBhY3RpdmVfcmVnX3QgbG93ZXN0X2FjdGl2ZV9yZWcgPSBOT19MT1dFU1RfQUNUSVZFX1JFRzsKKyAgYWN0aXZlX3JlZ190IGhpZ2hlc3RfYWN0aXZlX3JlZyA9IE5PX0hJR0hFU1RfQUNUSVZFX1JFRzsKKworICAvKiBJbmZvcm1hdGlvbiBvbiB0aGUgY29udGVudHMgb2YgcmVnaXN0ZXJzLiBUaGVzZSBhcmUgcG9pbnRlcnMgaW50bworICAgICB0aGUgaW5wdXQgc3RyaW5nczsgdGhleSByZWNvcmQganVzdCB3aGF0IHdhcyBtYXRjaGVkIChvbiB0aGlzCisgICAgIGF0dGVtcHQpIGJ5IGEgc3ViZXhwcmVzc2lvbiBwYXJ0IG9mIHRoZSBwYXR0ZXJuLCB0aGF0IGlzLCB0aGUKKyAgICAgcmVnbnVtLXRoIHJlZ3N0YXJ0IHBvaW50ZXIgcG9pbnRzIHRvIHdoZXJlIGluIHRoZSBwYXR0ZXJuIHdlIGJlZ2FuCisgICAgIG1hdGNoaW5nIGFuZCB0aGUgcmVnbnVtLXRoIHJlZ2VuZCBwb2ludHMgdG8gcmlnaHQgYWZ0ZXIgd2hlcmUgd2UKKyAgICAgc3RvcHBlZCBtYXRjaGluZyB0aGUgcmVnbnVtLXRoIHN1YmV4cHJlc3Npb24uICAoVGhlIHplcm90aCByZWdpc3RlcgorICAgICBrZWVwcyB0cmFjayBvZiB3aGF0IHRoZSB3aG9sZSBwYXR0ZXJuIG1hdGNoZXMuKSAgKi8KKyNpZmRlZiBNQVRDSF9NQVlfQUxMT0NBVEUgLyogb3RoZXJ3aXNlLCB0aGVzZSBhcmUgZ2xvYmFsLiAgKi8KKyAgY29uc3QgY2hhciAqKnJlZ3N0YXJ0LCAqKnJlZ2VuZDsKKyNlbmRpZgorCisgIC8qIElmIGEgZ3JvdXAgdGhhdCdzIG9wZXJhdGVkIHVwb24gYnkgYSByZXBldGl0aW9uIG9wZXJhdG9yIGZhaWxzIHRvCisgICAgIG1hdGNoIGFueXRoaW5nLCB0aGVuIHRoZSByZWdpc3RlciBmb3IgaXRzIHN0YXJ0IHdpbGwgbmVlZCB0byBiZQorICAgICByZXN0b3JlZCBiZWNhdXNlIGl0IHdpbGwgaGF2ZSBiZWVuIHNldCB0byB3aGVyZXZlciBpbiB0aGUgc3RyaW5nIHdlCisgICAgIGFyZSB3aGVuIHdlIGxhc3Qgc2VlIGl0cyBvcGVuLWdyb3VwIG9wZXJhdG9yLiAgU2ltaWxhcmx5IGZvciBhCisgICAgIHJlZ2lzdGVyJ3MgZW5kLiAgKi8KKyNpZmRlZiBNQVRDSF9NQVlfQUxMT0NBVEUgLyogb3RoZXJ3aXNlLCB0aGVzZSBhcmUgZ2xvYmFsLiAgKi8KKyAgY29uc3QgY2hhciAqKm9sZF9yZWdzdGFydCwgKipvbGRfcmVnZW5kOworI2VuZGlmCisKKyAgLyogVGhlIGlzX2FjdGl2ZSBmaWVsZCBvZiByZWdfaW5mbyBoZWxwcyB1cyBrZWVwIHRyYWNrIG9mIHdoaWNoIChwb3NzaWJseQorICAgICBuZXN0ZWQpIHN1YmV4cHJlc3Npb25zIHdlIGFyZSBjdXJyZW50bHkgaW4uIFRoZSBtYXRjaGVkX3NvbWV0aGluZworICAgICBmaWVsZCBvZiByZWdfaW5mb1tyZWdfbnVtXSBoZWxwcyB1cyB0ZWxsIHdoZXRoZXIgb3Igbm90IHdlIGhhdmUKKyAgICAgbWF0Y2hlZCBhbnkgb2YgdGhlIHBhdHRlcm4gc28gZmFyIHRoaXMgdGltZSB0aHJvdWdoIHRoZSByZWdfbnVtLXRoCisgICAgIHN1YmV4cHJlc3Npb24uICBUaGVzZSB0d28gZmllbGRzIGdldCByZXNldCBlYWNoIHRpbWUgdGhyb3VnaCBhbnkKKyAgICAgbG9vcCB0aGVpciByZWdpc3RlciBpcyBpbi4gICovCisjaWZkZWYgTUFUQ0hfTUFZX0FMTE9DQVRFIC8qIG90aGVyd2lzZSwgdGhpcyBpcyBnbG9iYWwuICAqLworICByZWdpc3Rlcl9pbmZvX3R5cGUgKnJlZ19pbmZvOworI2VuZGlmCisKKyAgLyogVGhlIGZvbGxvd2luZyByZWNvcmQgdGhlIHJlZ2lzdGVyIGluZm8gYXMgZm91bmQgaW4gdGhlIGFib3ZlCisgICAgIHZhcmlhYmxlcyB3aGVuIHdlIGZpbmQgYSBtYXRjaCBiZXR0ZXIgdGhhbiBhbnkgd2UndmUgc2VlbiBiZWZvcmUuCisgICAgIFRoaXMgaGFwcGVucyBhcyB3ZSBiYWNrdHJhY2sgdGhyb3VnaCB0aGUgZmFpbHVyZSBwb2ludHMsIHdoaWNoIGluCisgICAgIHR1cm4gaGFwcGVucyBvbmx5IGlmIHdlIGhhdmUgbm90IHlldCBtYXRjaGVkIHRoZSBlbnRpcmUgc3RyaW5nLiAqLworICB1bnNpZ25lZCBiZXN0X3JlZ3Nfc2V0ID0gZmFsc2U7CisjaWZkZWYgTUFUQ0hfTUFZX0FMTE9DQVRFIC8qIG90aGVyd2lzZSwgdGhlc2UgYXJlIGdsb2JhbC4gICovCisgIGNvbnN0IGNoYXIgKipiZXN0X3JlZ3N0YXJ0LCAqKmJlc3RfcmVnZW5kOworI2VuZGlmCisKKyAgLyogTG9naWNhbGx5LCB0aGlzIGlzIGBiZXN0X3JlZ2VuZFswXScuICBCdXQgd2UgZG9uJ3Qgd2FudCB0byBoYXZlIHRvCisgICAgIGFsbG9jYXRlIHNwYWNlIGZvciB0aGF0IGlmIHdlJ3JlIG5vdCBhbGxvY2F0aW5nIHNwYWNlIGZvciBhbnl0aGluZworICAgICBlbHNlIChzZWUgYmVsb3cpLiAgQWxzbywgd2UgbmV2ZXIgbmVlZCBpbmZvIGFib3V0IHJlZ2lzdGVyIDAgZm9yCisgICAgIGFueSBvZiB0aGUgb3RoZXIgcmVnaXN0ZXIgdmVjdG9ycywgYW5kIGl0IHNlZW1zIHJhdGhlciBhIGtsdWRnZSB0bworICAgICB0cmVhdCBgYmVzdF9yZWdlbmQnIGRpZmZlcmVudGx5IHRoYW4gdGhlIHJlc3QuICBTbyB3ZSBrZWVwIHRyYWNrIG9mCisgICAgIHRoZSBlbmQgb2YgdGhlIGJlc3QgbWF0Y2ggc28gZmFyIGluIGEgc2VwYXJhdGUgdmFyaWFibGUuICBXZQorICAgICBpbml0aWFsaXplIHRoaXMgdG8gTlVMTCBzbyB0aGF0IHdoZW4gd2UgYmFja3RyYWNrIHRoZSBmaXJzdCB0aW1lCisgICAgIGFuZCBuZWVkIHRvIHRlc3QgaXQsIGl0J3Mgbm90IGdhcmJhZ2UuICAqLworICBjb25zdCBjaGFyICptYXRjaF9lbmQgPSBOVUxMOworCisgIC8qIFRoaXMgaGVscHMgU0VUX1JFR1NfTUFUQ0hFRCBhdm9pZCBkb2luZyByZWR1bmRhbnQgd29yay4gICovCisgIGludCBzZXRfcmVnc19tYXRjaGVkX2RvbmUgPSAwOworCisgIC8qIFVzZWQgd2hlbiB3ZSBwb3AgdmFsdWVzIHdlIGRvbid0IGNhcmUgYWJvdXQuICAqLworI2lmZGVmIE1BVENIX01BWV9BTExPQ0FURSAvKiBvdGhlcndpc2UsIHRoZXNlIGFyZSBnbG9iYWwuICAqLworICBjb25zdCBjaGFyICoqcmVnX2R1bW15OworICByZWdpc3Rlcl9pbmZvX3R5cGUgKnJlZ19pbmZvX2R1bW15OworI2VuZGlmCisKKyNpZmRlZiBERUJVRworICAvKiBDb3VudHMgdGhlIHRvdGFsIG51bWJlciBvZiByZWdpc3RlcnMgcHVzaGVkLiAgKi8KKyAgdW5zaWduZWQgbnVtX3JlZ3NfcHVzaGVkID0gMDsKKyNlbmRpZgorCisgIERFQlVHX1BSSU5UMSAoIlxuXG5FbnRlcmluZyByZV9tYXRjaF8yLlxuIik7CisKKyAgSU5JVF9GQUlMX1NUQUNLICgpOworCisjaWZkZWYgTUFUQ0hfTUFZX0FMTE9DQVRFCisgIC8qIERvIG5vdCBib3RoZXIgdG8gaW5pdGlhbGl6ZSBhbGwgdGhlIHJlZ2lzdGVyIHZhcmlhYmxlcyBpZiB0aGVyZSBhcmUKKyAgICAgbm8gZ3JvdXBzIGluIHRoZSBwYXR0ZXJuLCBhcyBpdCB0YWtlcyBhIGZhaXIgYW1vdW50IG9mIHRpbWUuICBJZgorICAgICB0aGVyZSBhcmUgZ3JvdXBzLCB3ZSBpbmNsdWRlIHNwYWNlIGZvciByZWdpc3RlciAwICh0aGUgd2hvbGUKKyAgICAgcGF0dGVybiksIGV2ZW4gdGhvdWdoIHdlIG5ldmVyIHVzZSBpdCwgc2luY2UgaXQgc2ltcGxpZmllcyB0aGUKKyAgICAgYXJyYXkgaW5kZXhpbmcuICBXZSBzaG91bGQgZml4IHRoaXMuICAqLworICBpZiAoYnVmcC0+cmVfbnN1YikKKyAgICB7CisgICAgICByZWdzdGFydCA9IFJFR0VYX1RBTExPQyAobnVtX3JlZ3MsIGNvbnN0IGNoYXIgKik7CisgICAgICByZWdlbmQgPSBSRUdFWF9UQUxMT0MgKG51bV9yZWdzLCBjb25zdCBjaGFyICopOworICAgICAgb2xkX3JlZ3N0YXJ0ID0gUkVHRVhfVEFMTE9DIChudW1fcmVncywgY29uc3QgY2hhciAqKTsKKyAgICAgIG9sZF9yZWdlbmQgPSBSRUdFWF9UQUxMT0MgKG51bV9yZWdzLCBjb25zdCBjaGFyICopOworICAgICAgYmVzdF9yZWdzdGFydCA9IFJFR0VYX1RBTExPQyAobnVtX3JlZ3MsIGNvbnN0IGNoYXIgKik7CisgICAgICBiZXN0X3JlZ2VuZCA9IFJFR0VYX1RBTExPQyAobnVtX3JlZ3MsIGNvbnN0IGNoYXIgKik7CisgICAgICByZWdfaW5mbyA9IFJFR0VYX1RBTExPQyAobnVtX3JlZ3MsIHJlZ2lzdGVyX2luZm9fdHlwZSk7CisgICAgICByZWdfZHVtbXkgPSBSRUdFWF9UQUxMT0MgKG51bV9yZWdzLCBjb25zdCBjaGFyICopOworICAgICAgcmVnX2luZm9fZHVtbXkgPSBSRUdFWF9UQUxMT0MgKG51bV9yZWdzLCByZWdpc3Rlcl9pbmZvX3R5cGUpOworCisgICAgICBpZiAoIShyZWdzdGFydCAmJiByZWdlbmQgJiYgb2xkX3JlZ3N0YXJ0ICYmIG9sZF9yZWdlbmQgJiYgcmVnX2luZm8KKyAgICAgICAgICAgICYmIGJlc3RfcmVnc3RhcnQgJiYgYmVzdF9yZWdlbmQgJiYgcmVnX2R1bW15ICYmIHJlZ19pbmZvX2R1bW15KSkKKyAgICAgICAgeworICAgICAgICAgIEZSRUVfVkFSSUFCTEVTICgpOworICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIG11c3QgaW5pdGlhbGl6ZSBhbGwgb3VyIHZhcmlhYmxlcyB0byBOVUxMLCBzbyB0aGF0CisgICAgICAgICBgRlJFRV9WQVJJQUJMRVMnIGRvZXNuJ3QgdHJ5IHRvIGZyZWUgdGhlbS4gICovCisgICAgICByZWdzdGFydCA9IHJlZ2VuZCA9IG9sZF9yZWdzdGFydCA9IG9sZF9yZWdlbmQgPSBiZXN0X3JlZ3N0YXJ0CisgICAgICAgID0gYmVzdF9yZWdlbmQgPSByZWdfZHVtbXkgPSBOVUxMOworICAgICAgcmVnX2luZm8gPSByZWdfaW5mb19kdW1teSA9IChyZWdpc3Rlcl9pbmZvX3R5cGUgKikgTlVMTDsKKyAgICB9CisjZW5kaWYgLyogTUFUQ0hfTUFZX0FMTE9DQVRFICovCisKKyAgLyogVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGlzIGJvZ3VzLiAgKi8KKyAgaWYgKHBvcyA8IDAgfHwgcG9zID4gc2l6ZTEgKyBzaXplMikKKyAgICB7CisgICAgICBGUkVFX1ZBUklBQkxFUyAoKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgLyogSW5pdGlhbGl6ZSBzdWJleHByZXNzaW9uIHRleHQgcG9zaXRpb25zIHRvIC0xIHRvIG1hcmsgb25lcyB0aGF0IG5vCisgICAgIHN0YXJ0X21lbW9yeS9zdG9wX21lbW9yeSBoYXMgYmVlbiBzZWVuIGZvci4gQWxzbyBpbml0aWFsaXplIHRoZQorICAgICByZWdpc3RlciBpbmZvcm1hdGlvbiBzdHJ1Y3QuICAqLworICBmb3IgKG1jbnQgPSAxOyAodW5zaWduZWQpIG1jbnQgPCBudW1fcmVnczsgbWNudCsrKQorICAgIHsKKyAgICAgIHJlZ3N0YXJ0W21jbnRdID0gcmVnZW5kW21jbnRdCisgICAgICAgID0gb2xkX3JlZ3N0YXJ0W21jbnRdID0gb2xkX3JlZ2VuZFttY250XSA9IFJFR19VTlNFVF9WQUxVRTsKKworICAgICAgUkVHX01BVENIX05VTExfU1RSSU5HX1AgKHJlZ19pbmZvW21jbnRdKSA9IE1BVENIX05VTExfVU5TRVRfVkFMVUU7CisgICAgICBJU19BQ1RJVkUgKHJlZ19pbmZvW21jbnRdKSA9IDA7CisgICAgICBNQVRDSEVEX1NPTUVUSElORyAocmVnX2luZm9bbWNudF0pID0gMDsKKyAgICAgIEVWRVJfTUFUQ0hFRF9TT01FVEhJTkcgKHJlZ19pbmZvW21jbnRdKSA9IDA7CisgICAgfQorCisgIC8qIFdlIG1vdmUgYHN0cmluZzEnIGludG8gYHN0cmluZzInIGlmIHRoZSBsYXR0ZXIncyBlbXB0eSAtLSBidXQgbm90IGlmCisgICAgIGBzdHJpbmcxJyBpcyBudWxsLiAgKi8KKyAgaWYgKHNpemUyID09IDAgJiYgc3RyaW5nMSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN0cmluZzIgPSBzdHJpbmcxOworICAgICAgc2l6ZTIgPSBzaXplMTsKKyAgICAgIHN0cmluZzEgPSAwOworICAgICAgc2l6ZTEgPSAwOworICAgIH0KKyAgZW5kMSA9IHN0cmluZzEgKyBzaXplMTsKKyAgZW5kMiA9IHN0cmluZzIgKyBzaXplMjsKKworICAvKiBDb21wdXRlIHdoZXJlIHRvIHN0b3AgbWF0Y2hpbmcsIHdpdGhpbiB0aGUgdHdvIHN0cmluZ3MuICAqLworICBpZiAoc3RvcCA8PSBzaXplMSkKKyAgICB7CisgICAgICBlbmRfbWF0Y2hfMSA9IHN0cmluZzEgKyBzdG9wOworICAgICAgZW5kX21hdGNoXzIgPSBzdHJpbmcyOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGVuZF9tYXRjaF8xID0gZW5kMTsKKyAgICAgIGVuZF9tYXRjaF8yID0gc3RyaW5nMiArIHN0b3AgLSBzaXplMTsKKyAgICB9CisKKyAgLyogYHAnIHNjYW5zIHRocm91Z2ggdGhlIHBhdHRlcm4gYXMgYGQnIHNjYW5zIHRocm91Z2ggdGhlIGRhdGEuCisgICAgIGBkZW5kJyBpcyB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJpbmcgdGhhdCBgZCcgcG9pbnRzIHdpdGhpbi4gIGBkJworICAgICBpcyBhZHZhbmNlZCBpbnRvIHRoZSBmb2xsb3dpbmcgaW5wdXQgc3RyaW5nIHdoZW5ldmVyIG5lY2Vzc2FyeSwgYnV0CisgICAgIHRoaXMgaGFwcGVucyBiZWZvcmUgZmV0Y2hpbmc7IHRoZXJlZm9yZSwgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAgbG9vcCwgYGQnIGNhbiBiZSBwb2ludGluZyBhdCB0aGUgZW5kIG9mIGEgc3RyaW5nLCBidXQgaXQgY2Fubm90CisgICAgIGVxdWFsIGBzdHJpbmcyJy4gICovCisgIGlmIChzaXplMSA+IDAgJiYgcG9zIDw9IHNpemUxKQorICAgIHsKKyAgICAgIGQgPSBzdHJpbmcxICsgcG9zOworICAgICAgZGVuZCA9IGVuZF9tYXRjaF8xOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGQgPSBzdHJpbmcyICsgcG9zIC0gc2l6ZTE7CisgICAgICBkZW5kID0gZW5kX21hdGNoXzI7CisgICAgfQorCisgIERFQlVHX1BSSU5UMSAoIlRoZSBjb21waWxlZCBwYXR0ZXJuIGlzOlxuIik7CisgIERFQlVHX1BSSU5UX0NPTVBJTEVEX1BBVFRFUk4gKGJ1ZnAsIHAsIHBlbmQpOworICBERUJVR19QUklOVDEgKCJUaGUgc3RyaW5nIHRvIG1hdGNoIGlzOiBgIik7CisgIERFQlVHX1BSSU5UX0RPVUJMRV9TVFJJTkcgKGQsIHN0cmluZzEsIHNpemUxLCBzdHJpbmcyLCBzaXplMik7CisgIERFQlVHX1BSSU5UMSAoIidcbiIpOworCisgIC8qIFRoaXMgbG9vcHMgb3ZlciBwYXR0ZXJuIGNvbW1hbmRzLiAgSXQgZXhpdHMgYnkgcmV0dXJuaW5nIGZyb20gdGhlCisgICAgIGZ1bmN0aW9uIGlmIHRoZSBtYXRjaCBpcyBjb21wbGV0ZSwgb3IgaXQgZHJvcHMgdGhyb3VnaCBpZiB0aGUgbWF0Y2gKKyAgICAgZmFpbHMgYXQgdGhpcyBzdGFydGluZyBwb2ludCBpbiB0aGUgaW5wdXQgZGF0YS4gICovCisgIGZvciAoOzspCisgICAgeworI2lmZGVmIF9MSUJDCisgICAgICBERUJVR19QUklOVDIgKCJcbiVwOiAiLCBwKTsKKyNlbHNlCisgICAgICBERUJVR19QUklOVDIgKCJcbjB4JXg6ICIsIHApOworI2VuZGlmCisKKyAgICAgIGlmIChwID09IHBlbmQpCisJeyAvKiBFbmQgb2YgcGF0dGVybiBtZWFucyB3ZSBtaWdodCBoYXZlIHN1Y2NlZWRlZC4gICovCisgICAgICAgICAgREVCVUdfUFJJTlQxICgiZW5kIG9mIHBhdHRlcm4gLi4uICIpOworCisJICAvKiBJZiB3ZSBoYXZlbid0IG1hdGNoZWQgdGhlIGVudGlyZSBzdHJpbmcsIGFuZCB3ZSB3YW50IHRoZQorICAgICAgICAgICAgIGxvbmdlc3QgbWF0Y2gsIHRyeSBiYWNrdHJhY2tpbmcuICAqLworICAgICAgICAgIGlmIChkICE9IGVuZF9tYXRjaF8yKQorCSAgICB7CisJICAgICAgLyogMSBpZiB0aGlzIG1hdGNoIGVuZHMgaW4gdGhlIHNhbWUgc3RyaW5nIChzdHJpbmcxIG9yIHN0cmluZzIpCisJCSBhcyB0aGUgYmVzdCBwcmV2aW91cyBtYXRjaC4gICovCisJICAgICAgYm9vbGVhbiBzYW1lX3N0cl9wID0gKEZJUlNUX1NUUklOR19QIChtYXRjaF9lbmQpCisJCQkJICAgID09IE1BVENISU5HX0lOX0ZJUlNUX1NUUklORyk7CisJICAgICAgLyogMSBpZiB0aGlzIG1hdGNoIGlzIHRoZSBiZXN0IHNlZW4gc28gZmFyLiAgKi8KKwkgICAgICBib29sZWFuIGJlc3RfbWF0Y2hfcDsKKworCSAgICAgIC8qIEFJWCBjb21waWxlciBnb3QgY29uZnVzZWQgd2hlbiB0aGlzIHdhcyBjb21iaW5lZAorCQkgd2l0aCB0aGUgcHJldmlvdXMgZGVjbGFyYXRpb24uICAqLworCSAgICAgIGlmIChzYW1lX3N0cl9wKQorCQliZXN0X21hdGNoX3AgPSBkID4gbWF0Y2hfZW5kOworCSAgICAgIGVsc2UKKwkJYmVzdF9tYXRjaF9wID0gIU1BVENISU5HX0lOX0ZJUlNUX1NUUklORzsKKworICAgICAgICAgICAgICBERUJVR19QUklOVDEgKCJiYWNrdHJhY2tpbmcuXG4iKTsKKworICAgICAgICAgICAgICBpZiAoIUZBSUxfU1RBQ0tfRU1QVFkgKCkpCisgICAgICAgICAgICAgICAgeyAvKiBNb3JlIGZhaWx1cmUgcG9pbnRzIHRvIHRyeS4gICovCisKKyAgICAgICAgICAgICAgICAgIC8qIElmIGV4Y2VlZHMgYmVzdCBtYXRjaCBzbyBmYXIsIHNhdmUgaXQuICAqLworICAgICAgICAgICAgICAgICAgaWYgKCFiZXN0X3JlZ3Nfc2V0IHx8IGJlc3RfbWF0Y2hfcCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGJlc3RfcmVnc19zZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX2VuZCA9IGQ7CisKKyAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVDEgKCJcblNBVklORyBtYXRjaCBhcyBiZXN0IHNvIGZhci5cbiIpOworCisgICAgICAgICAgICAgICAgICAgICAgZm9yIChtY250ID0gMTsgKHVuc2lnbmVkKSBtY250IDwgbnVtX3JlZ3M7IG1jbnQrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9yZWdzdGFydFttY250XSA9IHJlZ3N0YXJ0W21jbnRdOworICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3JlZ2VuZFttY250XSA9IHJlZ2VuZFttY250XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAvKiBJZiBubyBmYWlsdXJlIHBvaW50cywgZG9uJ3QgcmVzdG9yZSBnYXJiYWdlLiAgQW5kIGlmCisgICAgICAgICAgICAgICAgIGxhc3QgbWF0Y2ggaXMgcmVhbCBiZXN0IG1hdGNoLCBkb24ndCByZXN0b3JlIHNlY29uZAorICAgICAgICAgICAgICAgICBiZXN0IG9uZS4gKi8KKyAgICAgICAgICAgICAgZWxzZSBpZiAoYmVzdF9yZWdzX3NldCAmJiAhYmVzdF9tYXRjaF9wKQorICAgICAgICAgICAgICAgIHsKKyAgCSAgICAgICAgcmVzdG9yZV9iZXN0X3JlZ3M6CisgICAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIGJlc3QgbWF0Y2guICBJdCBtYXkgaGFwcGVuIHRoYXQgYGRlbmQgPT0KKyAgICAgICAgICAgICAgICAgICAgIGVuZF9tYXRjaF8xJyB3aGlsZSB0aGUgcmVzdG9yZWQgZCBpcyBpbiBzdHJpbmcyLgorICAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBwYXR0ZXJuIGB4Lip5Lip6JyBhZ2FpbnN0IHRoZQorICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncyBgeC0nIGFuZCBgeS16LScsIGlmIHRoZSB0d28gc3RyaW5ncyBhcmUKKyAgICAgICAgICAgICAgICAgICAgIG5vdCBjb25zZWN1dGl2ZSBpbiBtZW1vcnkuICAqLworICAgICAgICAgICAgICAgICAgREVCVUdfUFJJTlQxICgiUmVzdG9yaW5nIGJlc3QgcmVnaXN0ZXJzLlxuIik7CisKKyAgICAgICAgICAgICAgICAgIGQgPSBtYXRjaF9lbmQ7CisgICAgICAgICAgICAgICAgICBkZW5kID0gKChkID49IHN0cmluZzEgJiYgZCA8PSBlbmQxKQorCQkgICAgICAgICAgID8gZW5kX21hdGNoXzEgOiBlbmRfbWF0Y2hfMik7CisKKwkJICBmb3IgKG1jbnQgPSAxOyAodW5zaWduZWQpIG1jbnQgPCBudW1fcmVnczsgbWNudCsrKQorCQkgICAgeworCQkgICAgICByZWdzdGFydFttY250XSA9IGJlc3RfcmVnc3RhcnRbbWNudF07CisJCSAgICAgIHJlZ2VuZFttY250XSA9IGJlc3RfcmVnZW5kW21jbnRdOworCQkgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLyogZCAhPSBlbmRfbWF0Y2hfMiAqLworCisJc3VjY2VlZF9sYWJlbDoKKyAgICAgICAgICBERUJVR19QUklOVDEgKCJBY2NlcHRpbmcgbWF0Y2guXG4iKTsKKworICAgICAgICAgIC8qIElmIGNhbGxlciB3YW50cyByZWdpc3RlciBjb250ZW50cyBkYXRhIGJhY2ssIGRvIGl0LiAgKi8KKyAgICAgICAgICBpZiAocmVncyAmJiAhYnVmcC0+bm9fc3ViKQorCSAgICB7CisgICAgICAgICAgICAgIC8qIEhhdmUgdGhlIHJlZ2lzdGVyIGRhdGEgYXJyYXlzIGJlZW4gYWxsb2NhdGVkPyAgKi8KKyAgICAgICAgICAgICAgaWYgKGJ1ZnAtPnJlZ3NfYWxsb2NhdGVkID09IFJFR1NfVU5BTExPQ0FURUQpCisgICAgICAgICAgICAgICAgeyAvKiBOby4gIFNvIGFsbG9jYXRlIHRoZW0gd2l0aCBtYWxsb2MuICBXZSBuZWVkIG9uZQorICAgICAgICAgICAgICAgICAgICAgZXh0cmEgZWxlbWVudCBiZXlvbmQgYG51bV9yZWdzJyBmb3IgdGhlIGAtMScgbWFya2VyCisgICAgICAgICAgICAgICAgICAgICBHTlUgY29kZSB1c2VzLiAgKi8KKyAgICAgICAgICAgICAgICAgIHJlZ3MtPm51bV9yZWdzID0gTUFYIChSRV9OUkVHUywgbnVtX3JlZ3MgKyAxKTsKKyAgICAgICAgICAgICAgICAgIHJlZ3MtPnN0YXJ0ID0gVEFMTE9DIChyZWdzLT5udW1fcmVncywgcmVnb2ZmX3QpOworICAgICAgICAgICAgICAgICAgcmVncy0+ZW5kID0gVEFMTE9DIChyZWdzLT5udW1fcmVncywgcmVnb2ZmX3QpOworICAgICAgICAgICAgICAgICAgaWYgKHJlZ3MtPnN0YXJ0ID09IE5VTEwgfHwgcmVncy0+ZW5kID09IE5VTEwpCisJCSAgICB7CisJCSAgICAgIEZSRUVfVkFSSUFCTEVTICgpOworCQkgICAgICByZXR1cm4gLTI7CisJCSAgICB9CisgICAgICAgICAgICAgICAgICBidWZwLT5yZWdzX2FsbG9jYXRlZCA9IFJFR1NfUkVBTExPQ0FURTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1ZnAtPnJlZ3NfYWxsb2NhdGVkID09IFJFR1NfUkVBTExPQ0FURSkKKyAgICAgICAgICAgICAgICB7IC8qIFllcy4gIElmIHdlIG5lZWQgbW9yZSBlbGVtZW50cyB0aGFuIHdlcmUgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkLCByZWFsbG9jYXRlIHRoZW0uICBJZiB3ZSBuZWVkIGZld2VyLCBqdXN0CisgICAgICAgICAgICAgICAgICAgICBsZWF2ZSBpdCBhbG9uZS4gICovCisgICAgICAgICAgICAgICAgICBpZiAocmVncy0+bnVtX3JlZ3MgPCBudW1fcmVncyArIDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICByZWdzLT5udW1fcmVncyA9IG51bV9yZWdzICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICBSRVRBTExPQyAocmVncy0+c3RhcnQsIHJlZ3MtPm51bV9yZWdzLCByZWdvZmZfdCk7CisgICAgICAgICAgICAgICAgICAgICAgUkVUQUxMT0MgKHJlZ3MtPmVuZCwgcmVncy0+bnVtX3JlZ3MsIHJlZ29mZl90KTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAocmVncy0+c3RhcnQgPT0gTlVMTCB8fCByZWdzLT5lbmQgPT0gTlVMTCkKKwkJCXsKKwkJCSAgRlJFRV9WQVJJQUJMRVMgKCk7CisJCQkgIHJldHVybiAtMjsKKwkJCX0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorCQl7CisJCSAgLyogVGhlc2UgYnJhY2VzIGZlbmQgb2ZmIGEgImVtcHR5IGJvZHkgaW4gYW4gZWxzZS1zdGF0ZW1lbnQiCisJCSAgICAgd2FybmluZyB1bmRlciBHQ0Mgd2hlbiBhc3NlcnQgZXhwYW5kcyB0byBub3RoaW5nLiAgKi8KKwkJICBhc3NlcnQgKGJ1ZnAtPnJlZ3NfYWxsb2NhdGVkID09IFJFR1NfRklYRUQpOworCQl9CisKKyAgICAgICAgICAgICAgLyogQ29udmVydCB0aGUgcG9pbnRlciBkYXRhIGluIGByZWdzdGFydCcgYW5kIGByZWdlbmQnIHRvCisgICAgICAgICAgICAgICAgIGluZGljZXMuICBSZWdpc3RlciB6ZXJvIGhhcyB0byBiZSBzZXQgZGlmZmVyZW50bHksCisgICAgICAgICAgICAgICAgIHNpbmNlIHdlIGhhdmVuJ3Qga2VwdCB0cmFjayBvZiBhbnkgaW5mbyBmb3IgaXQuICAqLworICAgICAgICAgICAgICBpZiAocmVncy0+bnVtX3JlZ3MgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHJlZ3MtPnN0YXJ0WzBdID0gcG9zOworICAgICAgICAgICAgICAgICAgcmVncy0+ZW5kWzBdID0gKE1BVENISU5HX0lOX0ZJUlNUX1NUUklORworCQkJCSAgPyAoKHJlZ29mZl90KSAoZCAtIHN0cmluZzEpKQorCQkJICAgICAgICAgIDogKChyZWdvZmZfdCkgKGQgLSBzdHJpbmcyICsgc2l6ZTEpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIC8qIEdvIHRocm91Z2ggdGhlIGZpcnN0IGBtaW4gKG51bV9yZWdzLCByZWdzLT5udW1fcmVncyknCisgICAgICAgICAgICAgICAgIHJlZ2lzdGVycywgc2luY2UgdGhhdCBpcyBhbGwgd2UgaW5pdGlhbGl6ZWQuICAqLworCSAgICAgIGZvciAobWNudCA9IDE7ICh1bnNpZ25lZCkgbWNudCA8IE1JTiAobnVtX3JlZ3MsIHJlZ3MtPm51bV9yZWdzKTsKKwkJICAgbWNudCsrKQorCQl7CisgICAgICAgICAgICAgICAgICBpZiAoUkVHX1VOU0VUIChyZWdzdGFydFttY250XSkgfHwgUkVHX1VOU0VUIChyZWdlbmRbbWNudF0pKQorICAgICAgICAgICAgICAgICAgICByZWdzLT5zdGFydFttY250XSA9IHJlZ3MtPmVuZFttY250XSA9IC0xOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisJCSAgICAgIHJlZ3MtPnN0YXJ0W21jbnRdCisJCQk9IChyZWdvZmZfdCkgUE9JTlRFUl9UT19PRkZTRVQgKHJlZ3N0YXJ0W21jbnRdKTsKKyAgICAgICAgICAgICAgICAgICAgICByZWdzLT5lbmRbbWNudF0KKwkJCT0gKHJlZ29mZl90KSBQT0lOVEVSX1RPX09GRlNFVCAocmVnZW5kW21jbnRdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCQl9CisKKyAgICAgICAgICAgICAgLyogSWYgdGhlIHJlZ3Mgc3RydWN0dXJlIHdlIHJldHVybiBoYXMgbW9yZSBlbGVtZW50cyB0aGFuCisgICAgICAgICAgICAgICAgIHdlcmUgaW4gdGhlIHBhdHRlcm4sIHNldCB0aGUgZXh0cmEgZWxlbWVudHMgdG8gLTEuICBJZgorICAgICAgICAgICAgICAgICB3ZSAocmUpYWxsb2NhdGVkIHRoZSByZWdpc3RlcnMsIHRoaXMgaXMgdGhlIGNhc2UsCisgICAgICAgICAgICAgICAgIGJlY2F1c2Ugd2UgYWx3YXlzIGFsbG9jYXRlIGVub3VnaCB0byBoYXZlIGF0IGxlYXN0IG9uZQorICAgICAgICAgICAgICAgICAtMSBhdCB0aGUgZW5kLiAgKi8KKyAgICAgICAgICAgICAgZm9yIChtY250ID0gbnVtX3JlZ3M7ICh1bnNpZ25lZCkgbWNudCA8IHJlZ3MtPm51bV9yZWdzOyBtY250KyspCisgICAgICAgICAgICAgICAgcmVncy0+c3RhcnRbbWNudF0gPSByZWdzLT5lbmRbbWNudF0gPSAtMTsKKwkgICAgfSAvKiByZWdzICYmICFidWZwLT5ub19zdWIgKi8KKworICAgICAgICAgIERFQlVHX1BSSU5UNCAoIiV1IGZhaWx1cmUgcG9pbnRzIHB1c2hlZCwgJXUgcG9wcGVkICgldSByZW1haW4pLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5mYWlsdXJlX3BvaW50c19wdXNoZWQsIG5mYWlsdXJlX3BvaW50c19wb3BwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZmFpbHVyZV9wb2ludHNfcHVzaGVkIC0gbmZhaWx1cmVfcG9pbnRzX3BvcHBlZCk7CisgICAgICAgICAgREVCVUdfUFJJTlQyICgiJXUgcmVnaXN0ZXJzIHB1c2hlZC5cbiIsIG51bV9yZWdzX3B1c2hlZCk7CisKKyAgICAgICAgICBtY250ID0gZCAtIHBvcyAtIChNQVRDSElOR19JTl9GSVJTVF9TVFJJTkcKKwkJCSAgICA/IHN0cmluZzEKKwkJCSAgICA6IHN0cmluZzIgLSBzaXplMSk7CisKKyAgICAgICAgICBERUJVR19QUklOVDIgKCJSZXR1cm5pbmcgJWQgZnJvbSByZV9tYXRjaF8yLlxuIiwgbWNudCk7CisKKyAgICAgICAgICBGUkVFX1ZBUklBQkxFUyAoKTsKKyAgICAgICAgICByZXR1cm4gbWNudDsKKyAgICAgICAgfQorCisgICAgICAvKiBPdGhlcndpc2UgbWF0Y2ggbmV4dCBwYXR0ZXJuIGNvbW1hbmQuICAqLworICAgICAgc3dpdGNoIChTV0lUQ0hfRU5VTV9DQVNUICgocmVfb3Bjb2RlX3QpICpwKyspKQorCXsKKyAgICAgICAgLyogSWdub3JlIHRoZXNlLiAgVXNlZCB0byBpZ25vcmUgdGhlIG4gb2Ygc3VjY2VlZF9uJ3Mgd2hpY2gKKyAgICAgICAgICAgY3VycmVudGx5IGhhdmUgbiA9PSAwLiAgKi8KKyAgICAgICAgY2FzZSBub19vcDoKKyAgICAgICAgICBERUJVR19QUklOVDEgKCJFWEVDVVRJTkcgbm9fb3AuXG4iKTsKKyAgICAgICAgICBicmVhazsKKworCWNhc2Ugc3VjY2VlZDoKKyAgICAgICAgICBERUJVR19QUklOVDEgKCJFWEVDVVRJTkcgc3VjY2VlZC5cbiIpOworCSAgZ290byBzdWNjZWVkX2xhYmVsOworCisgICAgICAgIC8qIE1hdGNoIHRoZSBuZXh0IG4gcGF0dGVybiBjaGFyYWN0ZXJzIGV4YWN0bHkuICBUaGUgZm9sbG93aW5nCisgICAgICAgICAgIGJ5dGUgaW4gdGhlIHBhdHRlcm4gZGVmaW5lcyBuLCBhbmQgdGhlIG4gYnl0ZXMgYWZ0ZXIgdGhhdAorICAgICAgICAgICBhcmUgdGhlIGNoYXJhY3RlcnMgdG8gbWF0Y2guICAqLworCWNhc2UgZXhhY3RuOgorCSAgbWNudCA9ICpwKys7CisgICAgICAgICAgREVCVUdfUFJJTlQyICgiRVhFQ1VUSU5HIGV4YWN0biAlZC5cbiIsIG1jbnQpOworCisgICAgICAgICAgLyogVGhpcyBpcyB3cml0dGVuIG91dCBhcyBhbiBpZi1lbHNlIHNvIHdlIGRvbid0IHdhc3RlIHRpbWUKKyAgICAgICAgICAgICB0ZXN0aW5nIGB0cmFuc2xhdGUnIGluc2lkZSB0aGUgbG9vcC4gICovCisgICAgICAgICAgaWYgKHRyYW5zbGF0ZSkKKwkgICAgeworCSAgICAgIGRvCisJCXsKKwkJICBQUkVGRVRDSCAoKTsKKwkJICBpZiAoKHVuc2lnbmVkIGNoYXIpIHRyYW5zbGF0ZVsodW5zaWduZWQgY2hhcikgKmQrK10KKwkJICAgICAgIT0gKHVuc2lnbmVkIGNoYXIpICpwKyspCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKwkJfQorCSAgICAgIHdoaWxlICgtLW1jbnQpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBkbworCQl7CisJCSAgUFJFRkVUQ0ggKCk7CisJCSAgaWYgKCpkKysgIT0gKGNoYXIpICpwKyspIGdvdG8gZmFpbDsKKwkJfQorCSAgICAgIHdoaWxlICgtLW1jbnQpOworCSAgICB9CisJICBTRVRfUkVHU19NQVRDSEVEICgpOworICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgLyogTWF0Y2ggYW55IGNoYXJhY3RlciBleGNlcHQgcG9zc2libHkgYSBuZXdsaW5lIG9yIGEgbnVsbC4gICovCisJY2FzZSBhbnljaGFyOgorICAgICAgICAgIERFQlVHX1BSSU5UMSAoIkVYRUNVVElORyBhbnljaGFyLlxuIik7CisKKyAgICAgICAgICBQUkVGRVRDSCAoKTsKKworICAgICAgICAgIGlmICgoIShidWZwLT5zeW50YXggJiBSRV9ET1RfTkVXTElORSkgJiYgVFJBTlNMQVRFICgqZCkgPT0gJ1xuJykKKyAgICAgICAgICAgICAgfHwgKGJ1ZnAtPnN5bnRheCAmIFJFX0RPVF9OT1RfTlVMTCAmJiBUUkFOU0xBVEUgKCpkKSA9PSAnXDAwMCcpKQorCSAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgICBTRVRfUkVHU19NQVRDSEVEICgpOworICAgICAgICAgIERFQlVHX1BSSU5UMiAoIiAgTWF0Y2hlZCBgJWQnLlxuIiwgKmQpOworICAgICAgICAgIGQrKzsKKwkgIGJyZWFrOworCisKKwljYXNlIGNoYXJzZXQ6CisJY2FzZSBjaGFyc2V0X25vdDoKKwkgIHsKKwkgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBjOworCSAgICBib29sZWFuIG5vdCA9IChyZV9vcGNvZGVfdCkgKihwIC0gMSkgPT0gY2hhcnNldF9ub3Q7CisKKyAgICAgICAgICAgIERFQlVHX1BSSU5UMiAoIkVYRUNVVElORyBjaGFyc2V0JXMuXG4iLCBub3QgPyAiX25vdCIgOiAiIik7CisKKwkgICAgUFJFRkVUQ0ggKCk7CisJICAgIGMgPSBUUkFOU0xBVEUgKCpkKTsgLyogVGhlIGNoYXJhY3RlciB0byBtYXRjaC4gICovCisKKyAgICAgICAgICAgIC8qIENhc3QgdG8gYHVuc2lnbmVkJyBpbnN0ZWFkIG9mIGB1bnNpZ25lZCBjaGFyJyBpbiBjYXNlIHRoZQorICAgICAgICAgICAgICAgYml0IGxpc3QgaXMgYSBmdWxsIDMyIGJ5dGVzIGxvbmcuICAqLworCSAgICBpZiAoYyA8ICh1bnNpZ25lZCkgKCpwICogQllURVdJRFRIKQorCQkmJiBwWzEgKyBjIC8gQllURVdJRFRIXSAmICgxIDw8IChjICUgQllURVdJRFRIKSkpCisJICAgICAgbm90ID0gIW5vdDsKKworCSAgICBwICs9IDEgKyAqcDsKKworCSAgICBpZiAoIW5vdCkgZ290byBmYWlsOworCisJICAgIFNFVF9SRUdTX01BVENIRUQgKCk7CisgICAgICAgICAgICBkKys7CisJICAgIGJyZWFrOworCSAgfQorCisKKyAgICAgICAgLyogVGhlIGJlZ2lubmluZyBvZiBhIGdyb3VwIGlzIHJlcHJlc2VudGVkIGJ5IHN0YXJ0X21lbW9yeS4KKyAgICAgICAgICAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHJlZ2lzdGVyIG51bWJlciBpbiB0aGUgbmV4dCBieXRlLCBhbmQgdGhlCisgICAgICAgICAgIG51bWJlciBvZiBncm91cHMgaW5uZXIgdG8gdGhpcyBvbmUgaW4gdGhlIG5leHQuICBUaGUgdGV4dAorICAgICAgICAgICBtYXRjaGVkIHdpdGhpbiB0aGUgZ3JvdXAgaXMgcmVjb3JkZWQgKGluIHRoZSBpbnRlcm5hbAorICAgICAgICAgICByZWdpc3RlcnMgZGF0YSBzdHJ1Y3R1cmUpIHVuZGVyIHRoZSByZWdpc3RlciBudW1iZXIuICAqLworICAgICAgICBjYXNlIHN0YXJ0X21lbW9yeToKKwkgIERFQlVHX1BSSU5UMyAoIkVYRUNVVElORyBzdGFydF9tZW1vcnkgJWQgKCVkKTpcbiIsICpwLCBwWzFdKTsKKworICAgICAgICAgIC8qIEZpbmQgb3V0IGlmIHRoaXMgZ3JvdXAgY2FuIG1hdGNoIHRoZSBlbXB0eSBzdHJpbmcuICAqLworCSAgcDEgPSBwOwkJLyogVG8gc2VuZCB0byBncm91cF9tYXRjaF9udWxsX3N0cmluZ19wLiAgKi8KKworICAgICAgICAgIGlmIChSRUdfTUFUQ0hfTlVMTF9TVFJJTkdfUCAocmVnX2luZm9bKnBdKSA9PSBNQVRDSF9OVUxMX1VOU0VUX1ZBTFVFKQorICAgICAgICAgICAgUkVHX01BVENIX05VTExfU1RSSU5HX1AgKHJlZ19pbmZvWypwXSkKKyAgICAgICAgICAgICAgPSBncm91cF9tYXRjaF9udWxsX3N0cmluZ19wICgmcDEsIHBlbmQsIHJlZ19pbmZvKTsKKworICAgICAgICAgIC8qIFNhdmUgdGhlIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcgd2hlcmUgd2Ugd2VyZSB0aGUgbGFzdCB0aW1lCisgICAgICAgICAgICAgd2Ugd2VyZSBhdCB0aGlzIG9wZW4tZ3JvdXAgb3BlcmF0b3IgaW4gY2FzZSB0aGUgZ3JvdXAgaXMKKyAgICAgICAgICAgICBvcGVyYXRlZCB1cG9uIGJ5IGEgcmVwZXRpdGlvbiBvcGVyYXRvciwgZS5nLiwgd2l0aCBgKGEqKSpiJworICAgICAgICAgICAgIGFnYWluc3QgYGFiJzsgdGhlbiB3ZSB3YW50IHRvIGlnbm9yZSB3aGVyZSB3ZSBhcmUgbm93IGluCisgICAgICAgICAgICAgdGhlIHN0cmluZyBpbiBjYXNlIHRoaXMgYXR0ZW1wdCB0byBtYXRjaCBmYWlscy4gICovCisgICAgICAgICAgb2xkX3JlZ3N0YXJ0WypwXSA9IFJFR19NQVRDSF9OVUxMX1NUUklOR19QIChyZWdfaW5mb1sqcF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUkVHX1VOU0VUIChyZWdzdGFydFsqcF0pID8gZCA6IHJlZ3N0YXJ0WypwXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlZ3N0YXJ0WypwXTsKKwkgIERFQlVHX1BSSU5UMiAoIiAgb2xkX3JlZ3N0YXJ0OiAlZFxuIiwKKwkJCSBQT0lOVEVSX1RPX09GRlNFVCAob2xkX3JlZ3N0YXJ0WypwXSkpOworCisgICAgICAgICAgcmVnc3RhcnRbKnBdID0gZDsKKwkgIERFQlVHX1BSSU5UMiAoIiAgcmVnc3RhcnQ6ICVkXG4iLCBQT0lOVEVSX1RPX09GRlNFVCAocmVnc3RhcnRbKnBdKSk7CisKKyAgICAgICAgICBJU19BQ1RJVkUgKHJlZ19pbmZvWypwXSkgPSAxOworICAgICAgICAgIE1BVENIRURfU09NRVRISU5HIChyZWdfaW5mb1sqcF0pID0gMDsKKworCSAgLyogQ2xlYXIgdGhpcyB3aGVuZXZlciB3ZSBjaGFuZ2UgdGhlIHJlZ2lzdGVyIGFjdGl2aXR5IHN0YXR1cy4gICovCisJICBzZXRfcmVnc19tYXRjaGVkX2RvbmUgPSAwOworCisgICAgICAgICAgLyogVGhpcyBpcyB0aGUgbmV3IGhpZ2hlc3QgYWN0aXZlIHJlZ2lzdGVyLiAgKi8KKyAgICAgICAgICBoaWdoZXN0X2FjdGl2ZV9yZWcgPSAqcDsKKworICAgICAgICAgIC8qIElmIG5vdGhpbmcgd2FzIGFjdGl2ZSBiZWZvcmUsIHRoaXMgaXMgdGhlIG5ldyBsb3dlc3QgYWN0aXZlCisgICAgICAgICAgICAgcmVnaXN0ZXIuICAqLworICAgICAgICAgIGlmIChsb3dlc3RfYWN0aXZlX3JlZyA9PSBOT19MT1dFU1RfQUNUSVZFX1JFRykKKyAgICAgICAgICAgIGxvd2VzdF9hY3RpdmVfcmVnID0gKnA7CisKKyAgICAgICAgICAvKiBNb3ZlIHBhc3QgdGhlIHJlZ2lzdGVyIG51bWJlciBhbmQgaW5uZXIgZ3JvdXAgY291bnQuICAqLworICAgICAgICAgIHAgKz0gMjsKKwkgIGp1c3RfcGFzdF9zdGFydF9tZW0gPSBwOworCisgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAvKiBUaGUgc3RvcF9tZW1vcnkgb3Bjb2RlIHJlcHJlc2VudHMgdGhlIGVuZCBvZiBhIGdyb3VwLiAgSXRzCisgICAgICAgICAgIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgc3RhcnRfbWVtb3J5J3M6IHRoZSByZWdpc3RlcgorICAgICAgICAgICBudW1iZXIsIGFuZCB0aGUgbnVtYmVyIG9mIGlubmVyIGdyb3Vwcy4gICovCisJY2FzZSBzdG9wX21lbW9yeToKKwkgIERFQlVHX1BSSU5UMyAoIkVYRUNVVElORyBzdG9wX21lbW9yeSAlZCAoJWQpOlxuIiwgKnAsIHBbMV0pOworCisgICAgICAgICAgLyogV2UgbmVlZCB0byBzYXZlIHRoZSBzdHJpbmcgcG9zaXRpb24gdGhlIGxhc3QgdGltZSB3ZSB3ZXJlIGF0CisgICAgICAgICAgICAgdGhpcyBjbG9zZS1ncm91cCBvcGVyYXRvciBpbiBjYXNlIHRoZSBncm91cCBpcyBvcGVyYXRlZAorICAgICAgICAgICAgIHVwb24gYnkgYSByZXBldGl0aW9uIG9wZXJhdG9yLCBlLmcuLCB3aXRoIGAoKGEqKSooYiopKikqJworICAgICAgICAgICAgIGFnYWluc3QgYGFiYSc7IHRoZW4gd2Ugd2FudCB0byBpZ25vcmUgd2hlcmUgd2UgYXJlIG5vdyBpbgorICAgICAgICAgICAgIHRoZSBzdHJpbmcgaW4gY2FzZSB0aGlzIGF0dGVtcHQgdG8gbWF0Y2ggZmFpbHMuICAqLworICAgICAgICAgIG9sZF9yZWdlbmRbKnBdID0gUkVHX01BVENIX05VTExfU1RSSU5HX1AgKHJlZ19pbmZvWypwXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUkVHX1VOU0VUIChyZWdlbmRbKnBdKSA/IGQgOiByZWdlbmRbKnBdCisJCQkgICA6IHJlZ2VuZFsqcF07CisJICBERUJVR19QUklOVDIgKCIgICAgICBvbGRfcmVnZW5kOiAlZFxuIiwKKwkJCSBQT0lOVEVSX1RPX09GRlNFVCAob2xkX3JlZ2VuZFsqcF0pKTsKKworICAgICAgICAgIHJlZ2VuZFsqcF0gPSBkOworCSAgREVCVUdfUFJJTlQyICgiICAgICAgcmVnZW5kOiAlZFxuIiwgUE9JTlRFUl9UT19PRkZTRVQgKHJlZ2VuZFsqcF0pKTsKKworICAgICAgICAgIC8qIFRoaXMgcmVnaXN0ZXIgaXNuJ3QgYWN0aXZlIGFueW1vcmUuICAqLworICAgICAgICAgIElTX0FDVElWRSAocmVnX2luZm9bKnBdKSA9IDA7CisKKwkgIC8qIENsZWFyIHRoaXMgd2hlbmV2ZXIgd2UgY2hhbmdlIHRoZSByZWdpc3RlciBhY3Rpdml0eSBzdGF0dXMuICAqLworCSAgc2V0X3JlZ3NfbWF0Y2hlZF9kb25lID0gMDsKKworICAgICAgICAgIC8qIElmIHRoaXMgd2FzIHRoZSBvbmx5IHJlZ2lzdGVyIGFjdGl2ZSwgbm90aGluZyBpcyBhY3RpdmUKKyAgICAgICAgICAgICBhbnltb3JlLiAgKi8KKyAgICAgICAgICBpZiAobG93ZXN0X2FjdGl2ZV9yZWcgPT0gaGlnaGVzdF9hY3RpdmVfcmVnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBsb3dlc3RfYWN0aXZlX3JlZyA9IE5PX0xPV0VTVF9BQ1RJVkVfUkVHOworICAgICAgICAgICAgICBoaWdoZXN0X2FjdGl2ZV9yZWcgPSBOT19ISUdIRVNUX0FDVElWRV9SRUc7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAvKiBXZSBtdXN0IHNjYW4gZm9yIHRoZSBuZXcgaGlnaGVzdCBhY3RpdmUgcmVnaXN0ZXIsIHNpbmNlCisgICAgICAgICAgICAgICAgIGl0IGlzbid0IG5lY2Vzc2FyaWx5IG9uZSBsZXNzIHRoYW4gbm93OiBjb25zaWRlcgorICAgICAgICAgICAgICAgICAoYShiKWMoZChlKWYpZykuICBXaGVuIGdyb3VwIDMgZW5kcywgYWZ0ZXIgdGhlIGYpLCB0aGUKKyAgICAgICAgICAgICAgICAgbmV3IGhpZ2hlc3QgYWN0aXZlIHJlZ2lzdGVyIGlzIDEuICAqLworICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHIgPSAqcCAtIDE7CisgICAgICAgICAgICAgIHdoaWxlIChyID4gMCAmJiAhSVNfQUNUSVZFIChyZWdfaW5mb1tyXSkpCisgICAgICAgICAgICAgICAgci0tOworCisgICAgICAgICAgICAgIC8qIElmIHdlIGVuZCB1cCBhdCByZWdpc3RlciB6ZXJvLCB0aGF0IG1lYW5zIHRoYXQgd2Ugc2F2ZWQKKyAgICAgICAgICAgICAgICAgdGhlIHJlZ2lzdGVycyBhcyB0aGUgcmVzdWx0IG9mIGFuIGBvbl9mYWlsdXJlX2p1bXAnLCBub3QKKyAgICAgICAgICAgICAgICAgYSBgc3RhcnRfbWVtb3J5JywgYW5kIHdlIGp1bXBlZCB0byBwYXN0IHRoZSBpbm5lcm1vc3QKKyAgICAgICAgICAgICAgICAgYHN0b3BfbWVtb3J5Jy4gIEZvciBleGFtcGxlLCBpbiAoKC4pKikgd2Ugc2F2ZQorICAgICAgICAgICAgICAgICByZWdpc3RlcnMgMSBhbmQgMiBhcyBhIHJlc3VsdCBvZiB0aGUgKiwgYnV0IHdoZW4gd2UgcG9wCisgICAgICAgICAgICAgICAgIGJhY2sgdG8gdGhlIHNlY29uZCApLCB3ZSBhcmUgYXQgdGhlIHN0b3BfbWVtb3J5IDEuCisgICAgICAgICAgICAgICAgIFRodXMsIG5vdGhpbmcgaXMgYWN0aXZlLiAgKi8KKwkgICAgICBpZiAociA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGxvd2VzdF9hY3RpdmVfcmVnID0gTk9fTE9XRVNUX0FDVElWRV9SRUc7CisgICAgICAgICAgICAgICAgICBoaWdoZXN0X2FjdGl2ZV9yZWcgPSBOT19ISUdIRVNUX0FDVElWRV9SRUc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaGlnaGVzdF9hY3RpdmVfcmVnID0gcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIElmIGp1c3QgZmFpbGVkIHRvIG1hdGNoIHNvbWV0aGluZyB0aGlzIHRpbWUgYXJvdW5kIHdpdGggYQorICAgICAgICAgICAgIGdyb3VwIHRoYXQncyBvcGVyYXRlZCBvbiBieSBhIHJlcGV0aXRpb24gb3BlcmF0b3IsIHRyeSB0bworICAgICAgICAgICAgIGZvcmNlIGV4aXQgZnJvbSB0aGUgYGBsb29wJycsIGFuZCByZXN0b3JlIHRoZSByZWdpc3RlcgorICAgICAgICAgICAgIGluZm9ybWF0aW9uIGZvciB0aGlzIGdyb3VwIHRoYXQgd2UgaGFkIGJlZm9yZSB0cnlpbmcgdGhpcworICAgICAgICAgICAgIGxhc3QgbWF0Y2guICAqLworICAgICAgICAgIGlmICgoIU1BVENIRURfU09NRVRISU5HIChyZWdfaW5mb1sqcF0pCisgICAgICAgICAgICAgICB8fCBqdXN0X3Bhc3Rfc3RhcnRfbWVtID09IHAgLSAxKQorCSAgICAgICYmIChwICsgMikgPCBwZW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBib29sZWFuIGlzX2FfanVtcF9uID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgcDEgPSBwICsgMjsKKyAgICAgICAgICAgICAgbWNudCA9IDA7CisgICAgICAgICAgICAgIHN3aXRjaCAoKHJlX29wY29kZV90KSAqcDErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBjYXNlIGp1bXBfbjoKKwkJICAgIGlzX2FfanVtcF9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGNhc2UgcG9wX2ZhaWx1cmVfanVtcDoKKwkJICBjYXNlIG1heWJlX3BvcF9qdW1wOgorCQkgIGNhc2UganVtcDoKKwkJICBjYXNlIGR1bW15X2ZhaWx1cmVfanVtcDoKKyAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF9OVU1CRVJfQU5EX0lOQ1IgKG1jbnQsIHAxKTsKKwkJICAgIGlmIChpc19hX2p1bXBfbikKKwkJICAgICAgcDEgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8gOworICAgICAgICAgICAgICAgIH0KKwkgICAgICBwMSArPSBtY250OworCisgICAgICAgICAgICAgIC8qIElmIHRoZSBuZXh0IG9wZXJhdGlvbiBpcyBhIGp1bXAgYmFja3dhcmRzIGluIHRoZSBwYXR0ZXJuCisJICAgICAgICAgdG8gYW4gb25fZmFpbHVyZV9qdW1wIHJpZ2h0IGJlZm9yZSB0aGUgc3RhcnRfbWVtb3J5CisgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzdG9wX21lbW9yeSwgZXhpdCBmcm9tIHRoZSBsb29wCisgICAgICAgICAgICAgICAgIGJ5IGZvcmNpbmcgYSBmYWlsdXJlIGFmdGVyIHB1c2hpbmcgb24gdGhlIHN0YWNrIHRoZQorICAgICAgICAgICAgICAgICBvbl9mYWlsdXJlX2p1bXAncyBqdW1wIGluIHRoZSBwYXR0ZXJuLCBhbmQgZC4gICovCisgICAgICAgICAgICAgIGlmIChtY250IDwgMCAmJiAocmVfb3Bjb2RlX3QpICpwMSA9PSBvbl9mYWlsdXJlX2p1bXAKKyAgICAgICAgICAgICAgICAgICYmIChyZV9vcGNvZGVfdCkgcDFbM10gPT0gc3RhcnRfbWVtb3J5ICYmIHAxWzRdID09ICpwKQorCQl7CisgICAgICAgICAgICAgICAgICAvKiBJZiB0aGlzIGdyb3VwIGV2ZXIgbWF0Y2hlZCBhbnl0aGluZywgdGhlbiByZXN0b3JlCisgICAgICAgICAgICAgICAgICAgICB3aGF0IGl0cyByZWdpc3RlcnMgd2VyZSBiZWZvcmUgdHJ5aW5nIHRoaXMgbGFzdAorICAgICAgICAgICAgICAgICAgICAgZmFpbGVkIG1hdGNoLCBlLmcuLCB3aXRoIGAoYSopKmInIGFnYWluc3QgYGFiJyBmb3IKKyAgICAgICAgICAgICAgICAgICAgIHJlZ3N0YXJ0WzFdLCBhbmQsIGUuZy4sIHdpdGggYCgoYSopKihiKikqKSonCisgICAgICAgICAgICAgICAgICAgICBhZ2FpbnN0IGBhYmEnIGZvciByZWdlbmRbM10uCisKKyAgICAgICAgICAgICAgICAgICAgIEFsc28gcmVzdG9yZSB0aGUgcmVnaXN0ZXJzIGZvciBpbm5lciBncm91cHMgZm9yLAorICAgICAgICAgICAgICAgICAgICAgZS5nLiwgYCgoYSopKGIqKSkqJyBhZ2FpbnN0IGBhYmEnIChyZWdpc3RlciAzIHdvdWxkCisgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgZ2V0IHRyYXNoZWQpLiAgKi8KKworICAgICAgICAgICAgICAgICAgaWYgKEVWRVJfTUFUQ0hFRF9TT01FVEhJTkcgKHJlZ19pbmZvWypwXSkpCisJCSAgICB7CisJCSAgICAgIHVuc2lnbmVkIHI7CisKKyAgICAgICAgICAgICAgICAgICAgICBFVkVSX01BVENIRURfU09NRVRISU5HIChyZWdfaW5mb1sqcF0pID0gMDsKKworCQkgICAgICAvKiBSZXN0b3JlIHRoaXMgYW5kIGlubmVyIGdyb3VwcycgKGlmIGFueSkgcmVnaXN0ZXJzLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICBmb3IgKHIgPSAqcDsgciA8ICh1bnNpZ25lZCkgKnAgKyAodW5zaWduZWQpICoocCArIDEpOworCQkJICAgcisrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICByZWdzdGFydFtyXSA9IG9sZF9yZWdzdGFydFtyXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB4eCB3aHkgdGhpcyB0ZXN0PyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZF9yZWdlbmRbcl0gPj0gcmVnc3RhcnRbcl0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZW5kW3JdID0gb2xkX3JlZ2VuZFtyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCQkgIHAxKys7CisgICAgICAgICAgICAgICAgICBFWFRSQUNUX05VTUJFUl9BTkRfSU5DUiAobWNudCwgcDEpOworICAgICAgICAgICAgICAgICAgUFVTSF9GQUlMVVJFX1BPSU5UIChwMSArIG1jbnQsIGQsIC0yKTsKKworICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIE1vdmUgcGFzdCB0aGUgcmVnaXN0ZXIgbnVtYmVyIGFuZCB0aGUgaW5uZXIgZ3JvdXAgY291bnQuICAqLworICAgICAgICAgIHAgKz0gMjsKKyAgICAgICAgICBicmVhazsKKworCisJLyogXDxkaWdpdD4gaGFzIGJlZW4gdHVybmVkIGludG8gYSBgZHVwbGljYXRlJyBjb21tYW5kIHdoaWNoIGlzCisgICAgICAgICAgIGZvbGxvd2VkIGJ5IHRoZSBudW1lcmljIHZhbHVlIG9mIDxkaWdpdD4gYXMgdGhlIHJlZ2lzdGVyIG51bWJlci4gICovCisgICAgICAgIGNhc2UgZHVwbGljYXRlOgorCSAgeworCSAgICByZWdpc3RlciBjb25zdCBjaGFyICpkMiwgKmRlbmQyOworCSAgICBpbnQgcmVnbm8gPSAqcCsrOyAgIC8qIEdldCB3aGljaCByZWdpc3RlciB0byBtYXRjaCBhZ2FpbnN0LiAgKi8KKwkgICAgREVCVUdfUFJJTlQyICgiRVhFQ1VUSU5HIGR1cGxpY2F0ZSAlZC5cbiIsIHJlZ25vKTsKKworCSAgICAvKiBDYW4ndCBiYWNrIHJlZmVyZW5jZSBhIGdyb3VwIHdoaWNoIHdlJ3ZlIG5ldmVyIG1hdGNoZWQuICAqLworICAgICAgICAgICAgaWYgKFJFR19VTlNFVCAocmVnc3RhcnRbcmVnbm9dKSB8fCBSRUdfVU5TRVQgKHJlZ2VuZFtyZWdub10pKQorICAgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgICAgIC8qIFdoZXJlIGluIGlucHV0IHRvIHRyeSB0byBzdGFydCBtYXRjaGluZy4gICovCisgICAgICAgICAgICBkMiA9IHJlZ3N0YXJ0W3JlZ25vXTsKKworICAgICAgICAgICAgLyogV2hlcmUgdG8gc3RvcCBtYXRjaGluZzsgaWYgYm90aCB0aGUgcGxhY2UgdG8gc3RhcnQgYW5kCisgICAgICAgICAgICAgICB0aGUgcGxhY2UgdG8gc3RvcCBtYXRjaGluZyBhcmUgaW4gdGhlIHNhbWUgc3RyaW5nLCB0aGVuCisgICAgICAgICAgICAgICBzZXQgdG8gdGhlIHBsYWNlIHRvIHN0b3AsIG90aGVyd2lzZSwgZm9yIG5vdyBoYXZlIHRvIHVzZQorICAgICAgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgZmlyc3Qgc3RyaW5nLiAgKi8KKworICAgICAgICAgICAgZGVuZDIgPSAoKEZJUlNUX1NUUklOR19QIChyZWdzdGFydFtyZWdub10pCisJCSAgICAgID09IEZJUlNUX1NUUklOR19QIChyZWdlbmRbcmVnbm9dKSkKKwkJICAgICA/IHJlZ2VuZFtyZWdub10gOiBlbmRfbWF0Y2hfMSk7CisJICAgIGZvciAoOzspCisJICAgICAgeworCQkvKiBJZiBuZWNlc3NhcnksIGFkdmFuY2UgdG8gbmV4dCBzZWdtZW50IGluIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgICAgY29udGVudHMuICAqLworCQl3aGlsZSAoZDIgPT0gZGVuZDIpCisJCSAgeworCQkgICAgaWYgKGRlbmQyID09IGVuZF9tYXRjaF8yKSBicmVhazsKKwkJICAgIGlmIChkZW5kMiA9PSByZWdlbmRbcmVnbm9dKSBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2Ygc3RyaW5nMSA9PiBhZHZhbmNlIHRvIHN0cmluZzIuICovCisgICAgICAgICAgICAgICAgICAgIGQyID0gc3RyaW5nMjsKKyAgICAgICAgICAgICAgICAgICAgZGVuZDIgPSByZWdlbmRbcmVnbm9dOworCQkgIH0KKwkJLyogQXQgZW5kIG9mIHJlZ2lzdGVyIGNvbnRlbnRzID0+IHN1Y2Nlc3MgKi8KKwkJaWYgKGQyID09IGRlbmQyKSBicmVhazsKKworCQkvKiBJZiBuZWNlc3NhcnksIGFkdmFuY2UgdG8gbmV4dCBzZWdtZW50IGluIGRhdGEuICAqLworCQlQUkVGRVRDSCAoKTsKKworCQkvKiBIb3cgbWFueSBjaGFyYWN0ZXJzIGxlZnQgaW4gdGhpcyBzZWdtZW50IHRvIG1hdGNoLiAgKi8KKwkJbWNudCA9IGRlbmQgLSBkOworCisJCS8qIFdhbnQgaG93IG1hbnkgY29uc2VjdXRpdmUgY2hhcmFjdGVycyB3ZSBjYW4gbWF0Y2ggaW4KKyAgICAgICAgICAgICAgICAgICBvbmUgc2hvdCwgc28sIGlmIG5lY2Vzc2FyeSwgYWRqdXN0IHRoZSBjb3VudC4gICovCisgICAgICAgICAgICAgICAgaWYgKG1jbnQgPiBkZW5kMiAtIGQyKQorCQkgIG1jbnQgPSBkZW5kMiAtIGQyOworCisJCS8qIENvbXBhcmUgdGhhdCBtYW55OyBmYWlsdXJlIGlmIG1pc21hdGNoLCBlbHNlIG1vdmUKKyAgICAgICAgICAgICAgICAgICBwYXN0IHRoZW0uICAqLworCQlpZiAodHJhbnNsYXRlCisgICAgICAgICAgICAgICAgICAgID8gYmNtcF90cmFuc2xhdGUgKGQsIGQyLCBtY250LCB0cmFuc2xhdGUpCisgICAgICAgICAgICAgICAgICAgIDogbWVtY21wIChkLCBkMiwgbWNudCkpCisJCSAgZ290byBmYWlsOworCQlkICs9IG1jbnQsIGQyICs9IG1jbnQ7CisKKwkJLyogRG8gdGhpcyBiZWNhdXNlIHdlJ3ZlIG1hdGNoIHNvbWUgY2hhcmFjdGVycy4gICovCisJCVNFVF9SRUdTX01BVENIRUQgKCk7CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisKKworICAgICAgICAvKiBiZWdsaW5lIG1hdGNoZXMgdGhlIGVtcHR5IHN0cmluZyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcKKyAgICAgICAgICAgKHVubGVzcyBgbm90X2JvbCcgaXMgc2V0IGluIGBidWZwJyksIGFuZCwgaWYKKyAgICAgICAgICAgYG5ld2xpbmVfYW5jaG9yJyBpcyBzZXQsIGFmdGVyIG5ld2xpbmVzLiAgKi8KKwljYXNlIGJlZ2xpbmU6CisgICAgICAgICAgREVCVUdfUFJJTlQxICgiRVhFQ1VUSU5HIGJlZ2xpbmUuXG4iKTsKKworICAgICAgICAgIGlmIChBVF9TVFJJTkdTX0JFRyAoZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICghYnVmcC0+bm90X2JvbCkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoZFstMV0gPT0gJ1xuJyAmJiBidWZwLT5uZXdsaW5lX2FuY2hvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgLyogSW4gYWxsIG90aGVyIGNhc2VzLCB3ZSBmYWlsLiAgKi8KKyAgICAgICAgICBnb3RvIGZhaWw7CisKKworICAgICAgICAvKiBlbmRsaW5lIGlzIHRoZSBkdWFsIG9mIGJlZ2xpbmUuICAqLworCWNhc2UgZW5kbGluZToKKyAgICAgICAgICBERUJVR19QUklOVDEgKCJFWEVDVVRJTkcgZW5kbGluZS5cbiIpOworCisgICAgICAgICAgaWYgKEFUX1NUUklOR1NfRU5EIChkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCFidWZwLT5ub3RfZW9sKSBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFdlIGhhdmUgdG8gYGBwcmVmZXRjaCcnIHRoZSBuZXh0IGNoYXJhY3Rlci4gICovCisgICAgICAgICAgZWxzZSBpZiAoKGQgPT0gZW5kMSA/ICpzdHJpbmcyIDogKmQpID09ICdcbicKKyAgICAgICAgICAgICAgICAgICAmJiBidWZwLT5uZXdsaW5lX2FuY2hvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgZ290byBmYWlsOworCisKKwkvKiBNYXRjaCBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEuICAqLworICAgICAgICBjYXNlIGJlZ2J1ZjoKKyAgICAgICAgICBERUJVR19QUklOVDEgKCJFWEVDVVRJTkcgYmVnYnVmLlxuIik7CisgICAgICAgICAgaWYgKEFUX1NUUklOR1NfQkVHIChkKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGdvdG8gZmFpbDsKKworCisJLyogTWF0Y2ggYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBkYXRhLiAgKi8KKyAgICAgICAgY2FzZSBlbmRidWY6CisgICAgICAgICAgREVCVUdfUFJJTlQxICgiRVhFQ1VUSU5HIGVuZGJ1Zi5cbiIpOworCSAgaWYgKEFUX1NUUklOR1NfRU5EIChkKSkKKwkgICAgYnJlYWs7CisgICAgICAgICAgZ290byBmYWlsOworCisKKyAgICAgICAgLyogb25fZmFpbHVyZV9rZWVwX3N0cmluZ19qdW1wIGlzIHVzZWQgdG8gb3B0aW1pemUgYC4qXG4nLiAgSXQKKyAgICAgICAgICAgcHVzaGVzIE5VTEwgYXMgdGhlIHZhbHVlIGZvciB0aGUgc3RyaW5nIG9uIHRoZSBzdGFjay4gIFRoZW4KKyAgICAgICAgICAgYHBvcF9mYWlsdXJlX3BvaW50JyB3aWxsIGtlZXAgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZQorICAgICAgICAgICBzdHJpbmcsIGluc3RlYWQgb2YgcmVzdG9yaW5nIGl0LiAgVG8gc2VlIHdoeSwgY29uc2lkZXIKKyAgICAgICAgICAgbWF0Y2hpbmcgYGZvb1xuYmFyJyBhZ2FpbnN0IGAuKlxuJy4gIFRoZSAuKiBtYXRjaGVzIHRoZSBmb287CisgICAgICAgICAgIHRoZW4gdGhlIC4gZmFpbHMgYWdhaW5zdCB0aGUgXG4uICBCdXQgdGhlIG5leHQgdGhpbmcgd2Ugd2FudAorICAgICAgICAgICB0byBkbyBpcyBtYXRjaCB0aGUgXG4gYWdhaW5zdCB0aGUgXG47IGlmIHdlIHJlc3RvcmVkIHRoZQorICAgICAgICAgICBzdHJpbmcgdmFsdWUsIHdlIHdvdWxkIGJlIGJhY2sgYXQgdGhlIGZvby4KKworICAgICAgICAgICBCZWNhdXNlIHRoaXMgaXMgdXNlZCBvbmx5IGluIHNwZWNpZmljIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRvCisgICAgICAgICAgIGNoZWNrIGFsbCB0aGUgdGhpbmdzIHRoYXQgYG9uX2ZhaWx1cmVfanVtcCcgZG9lcywgdG8gbWFrZQorICAgICAgICAgICBzdXJlIHRoZSByaWdodCB0aGluZ3MgZ2V0IHNhdmVkIG9uIHRoZSBzdGFjay4gIEhlbmNlIHdlIGRvbid0CisgICAgICAgICAgIHNoYXJlIGl0cyBjb2RlLiAgVGhlIG9ubHkgcmVhc29uIHRvIHB1c2ggYW55dGhpbmcgb24gdGhlCisgICAgICAgICAgIHN0YWNrIGF0IGFsbCBpcyB0aGF0IG90aGVyd2lzZSB3ZSB3b3VsZCBoYXZlIHRvIGNoYW5nZQorICAgICAgICAgICBgYW55Y2hhcidzIGNvZGUgdG8gZG8gc29tZXRoaW5nIGJlc2lkZXMgZ290byBmYWlsIGluIHRoaXMKKyAgICAgICAgICAgY2FzZTsgdGhhdCBzZWVtcyB3b3JzZSB0aGFuIHRoaXMuICAqLworICAgICAgICBjYXNlIG9uX2ZhaWx1cmVfa2VlcF9zdHJpbmdfanVtcDoKKyAgICAgICAgICBERUJVR19QUklOVDEgKCJFWEVDVVRJTkcgb25fZmFpbHVyZV9rZWVwX3N0cmluZ19qdW1wIik7CisKKyAgICAgICAgICBFWFRSQUNUX05VTUJFUl9BTkRfSU5DUiAobWNudCwgcCk7CisjaWZkZWYgX0xJQkMKKyAgICAgICAgICBERUJVR19QUklOVDMgKCIgJWQgKHRvICVwKTpcbiIsIG1jbnQsIHAgKyBtY250KTsKKyNlbHNlCisgICAgICAgICAgREVCVUdfUFJJTlQzICgiICVkICh0byAweCV4KTpcbiIsIG1jbnQsIHAgKyBtY250KTsKKyNlbmRpZgorCisgICAgICAgICAgUFVTSF9GQUlMVVJFX1BPSU5UIChwICsgbWNudCwgTlVMTCwgLTIpOworICAgICAgICAgIGJyZWFrOworCisKKwkvKiBVc2VzIG9mIG9uX2ZhaWx1cmVfanVtcDoKKworICAgICAgICAgICBFYWNoIGFsdGVybmF0aXZlIHN0YXJ0cyB3aXRoIGFuIG9uX2ZhaWx1cmVfanVtcCB0aGF0IHBvaW50cworICAgICAgICAgICB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGFsdGVybmF0aXZlLiAgRWFjaCBhbHRlcm5hdGl2ZQorICAgICAgICAgICBleGNlcHQgdGhlIGxhc3QgZW5kcyB3aXRoIGEganVtcCB0aGF0IGluIGVmZmVjdCBqdW1wcyBwYXN0CisgICAgICAgICAgIHRoZSByZXN0IG9mIHRoZSBhbHRlcm5hdGl2ZXMuICAoVGhleSByZWFsbHkganVtcCB0byB0aGUKKyAgICAgICAgICAgZW5kaW5nIGp1bXAgb2YgdGhlIGZvbGxvd2luZyBhbHRlcm5hdGl2ZSwgYmVjYXVzZSB0ZW5zaW9uaW5nCisgICAgICAgICAgIHRoZXNlIGp1bXBzIGlzIGEgaGFzc2xlLikKKworICAgICAgICAgICBSZXBlYXRzIHN0YXJ0IHdpdGggYW4gb25fZmFpbHVyZV9qdW1wIHRoYXQgcG9pbnRzIHBhc3QgYm90aAorICAgICAgICAgICB0aGUgcmVwZXRpdGlvbiB0ZXh0IGFuZCBlaXRoZXIgdGhlIGZvbGxvd2luZyBqdW1wIG9yCisgICAgICAgICAgIHBvcF9mYWlsdXJlX2p1bXAgYmFjayB0byB0aGlzIG9uX2ZhaWx1cmVfanVtcC4gICovCisJY2FzZSBvbl9mYWlsdXJlX2p1bXA6CisgICAgICAgIG9uX2ZhaWx1cmU6CisgICAgICAgICAgREVCVUdfUFJJTlQxICgiRVhFQ1VUSU5HIG9uX2ZhaWx1cmVfanVtcCIpOworCisgICAgICAgICAgRVhUUkFDVF9OVU1CRVJfQU5EX0lOQ1IgKG1jbnQsIHApOworI2lmZGVmIF9MSUJDCisgICAgICAgICAgREVCVUdfUFJJTlQzICgiICVkICh0byAlcCkiLCBtY250LCBwICsgbWNudCk7CisjZWxzZQorICAgICAgICAgIERFQlVHX1BSSU5UMyAoIiAlZCAodG8gMHgleCkiLCBtY250LCBwICsgbWNudCk7CisjZW5kaWYKKworICAgICAgICAgIC8qIElmIHRoaXMgb25fZmFpbHVyZV9qdW1wIGNvbWVzIHJpZ2h0IGJlZm9yZSBhIGdyb3VwIChpLmUuLAorICAgICAgICAgICAgIHRoZSBvcmlnaW5hbCAqIGFwcGxpZWQgdG8gYSBncm91cCksIHNhdmUgdGhlIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgZm9yIHRoYXQgZ3JvdXAgYW5kIGFsbCBpbm5lciBvbmVzLCBzbyB0aGF0IGlmIHdlIGZhaWwgYmFjaworICAgICAgICAgICAgIHRvIHRoaXMgcG9pbnQsIHRoZSBncm91cCdzIGluZm9ybWF0aW9uIHdpbGwgYmUgY29ycmVjdC4KKyAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgaW4gXChhKlwpKlwxLCB3ZSBuZWVkIHRoZSBwcmVjZWRpbmcgZ3JvdXAsCisgICAgICAgICAgICAgYW5kIGluIFwoenpcKGEqXCliKlwpXDIsIHdlIG5lZWQgdGhlIGlubmVyIGdyb3VwLiAgKi8KKworICAgICAgICAgIC8qIFdlIGNhbid0IHVzZSBgcCcgdG8gY2hlY2sgYWhlYWQgYmVjYXVzZSB3ZSBwdXNoCisgICAgICAgICAgICAgYSBmYWlsdXJlIHBvaW50IHRvIGBwICsgbWNudCcgYWZ0ZXIgd2UgZG8gdGhpcy4gICovCisgICAgICAgICAgcDEgPSBwOworCisgICAgICAgICAgLyogV2UgbmVlZCB0byBza2lwIG5vX29wJ3MgYmVmb3JlIHdlIGxvb2sgZm9yIHRoZQorICAgICAgICAgICAgIHN0YXJ0X21lbW9yeSBpbiBjYXNlIHRoaXMgb25fZmFpbHVyZV9qdW1wIGlzIGhhcHBlbmluZyBhcworICAgICAgICAgICAgIHRoZSByZXN1bHQgb2YgYSBjb21wbGV0ZWQgc3VjY2VlZF9uLCBhcyBpbiBcKGFcKVx7MSwzXH1iXDEKKyAgICAgICAgICAgICBhZ2FpbnN0IGFiYS4gICovCisgICAgICAgICAgd2hpbGUgKHAxIDwgcGVuZCAmJiAocmVfb3Bjb2RlX3QpICpwMSA9PSBub19vcCkKKyAgICAgICAgICAgIHAxKys7CisKKyAgICAgICAgICBpZiAocDEgPCBwZW5kICYmIChyZV9vcGNvZGVfdCkgKnAxID09IHN0YXJ0X21lbW9yeSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogV2UgaGF2ZSBhIG5ldyBoaWdoZXN0IGFjdGl2ZSByZWdpc3RlciBub3cuICBUaGlzIHdpbGwKKyAgICAgICAgICAgICAgICAgZ2V0IHJlc2V0IGF0IHRoZSBzdGFydF9tZW1vcnkgd2UgYXJlIGFib3V0IHRvIGdldCB0bywKKyAgICAgICAgICAgICAgICAgYnV0IHdlIHdpbGwgaGF2ZSBzYXZlZCBhbGwgdGhlIHJlZ2lzdGVycyByZWxldmFudCB0bworICAgICAgICAgICAgICAgICB0aGlzIHJlcGV0aXRpb24gb3AsIGFzIGRlc2NyaWJlZCBhYm92ZS4gICovCisgICAgICAgICAgICAgIGhpZ2hlc3RfYWN0aXZlX3JlZyA9ICoocDEgKyAxKSArICoocDEgKyAyKTsKKyAgICAgICAgICAgICAgaWYgKGxvd2VzdF9hY3RpdmVfcmVnID09IE5PX0xPV0VTVF9BQ1RJVkVfUkVHKQorICAgICAgICAgICAgICAgIGxvd2VzdF9hY3RpdmVfcmVnID0gKihwMSArIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgREVCVUdfUFJJTlQxICgiOlxuIik7CisgICAgICAgICAgUFVTSF9GQUlMVVJFX1BPSU5UIChwICsgbWNudCwgZCwgLTIpOworICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgLyogQSBzbWFydCByZXBlYXQgZW5kcyB3aXRoIGBtYXliZV9wb3BfanVtcCcuCisJICAgV2UgY2hhbmdlIGl0IHRvIGVpdGhlciBgcG9wX2ZhaWx1cmVfanVtcCcgb3IgYGp1bXAnLiAgKi8KKyAgICAgICAgY2FzZSBtYXliZV9wb3BfanVtcDoKKyAgICAgICAgICBFWFRSQUNUX05VTUJFUl9BTkRfSU5DUiAobWNudCwgcCk7CisgICAgICAgICAgREVCVUdfUFJJTlQyICgiRVhFQ1VUSU5HIG1heWJlX3BvcF9qdW1wICVkLlxuIiwgbWNudCk7CisgICAgICAgICAgeworCSAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwMiA9IHA7CisKKyAgICAgICAgICAgIC8qIENvbXBhcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVwZWF0IHdpdGggd2hhdCBpbiB0aGUKKyAgICAgICAgICAgICAgIHBhdHRlcm4gZm9sbG93cyBpdHMgZW5kLiBJZiB3ZSBjYW4gZXN0YWJsaXNoIHRoYXQgdGhlcmUKKyAgICAgICAgICAgICAgIGlzIG5vdGhpbmcgdGhhdCB0aGV5IHdvdWxkIGJvdGggbWF0Y2gsIGkuZS4sIHRoYXQgd2UKKyAgICAgICAgICAgICAgIHdvdWxkIGhhdmUgdG8gYmFja3RyYWNrIGJlY2F1c2Ugb2YgKGFzIGluLCBlLmcuLCBgYSphJykKKyAgICAgICAgICAgICAgIHRoZW4gd2UgY2FuIGNoYW5nZSB0byBwb3BfZmFpbHVyZV9qdW1wLCBiZWNhdXNlIHdlJ2xsCisgICAgICAgICAgICAgICBuZXZlciBoYXZlIHRvIGJhY2t0cmFjay4KKworICAgICAgICAgICAgICAgVGhpcyBpcyBub3QgdHJ1ZSBpbiB0aGUgY2FzZSBvZiBhbHRlcm5hdGl2ZXM6IGluCisgICAgICAgICAgICAgICBgKGF8YWIpKicgd2UgZG8gbmVlZCB0byBiYWNrdHJhY2sgdG8gdGhlIGBhYicgYWx0ZXJuYXRpdmUKKyAgICAgICAgICAgICAgIChlLmcuLCBpZiB0aGUgc3RyaW5nIHdhcyBgYWInKS4gIEJ1dCBpbnN0ZWFkIG9mIHRyeWluZyB0bworICAgICAgICAgICAgICAgZGV0ZWN0IHRoYXQgaGVyZSwgdGhlIGFsdGVybmF0aXZlIGhhcyBwdXQgb24gYSBkdW1teQorICAgICAgICAgICAgICAgZmFpbHVyZSBwb2ludCB3aGljaCBpcyB3aGF0IHdlIHdpbGwgZW5kIHVwIHBvcHBpbmcuICAqLworCisJICAgIC8qIFNraXAgb3ZlciBvcGVuL2Nsb3NlLWdyb3VwIGNvbW1hbmRzLgorCSAgICAgICBJZiB3aGF0IGZvbGxvd3MgdGhpcyBsb29wIGlzIGEgLi4uKyBjb25zdHJ1Y3QsCisJICAgICAgIGxvb2sgYXQgd2hhdCBiZWdpbnMgaXRzIGJvZHksIHNpbmNlIHdlIHdpbGwgaGF2ZSB0bworCSAgICAgICBtYXRjaCBhdCBsZWFzdCBvbmUgb2YgdGhhdC4gICovCisJICAgIHdoaWxlICgxKQorCSAgICAgIHsKKwkJaWYgKHAyICsgMiA8IHBlbmQKKwkJICAgICYmICgocmVfb3Bjb2RlX3QpICpwMiA9PSBzdG9wX21lbW9yeQorCQkJfHwgKHJlX29wY29kZV90KSAqcDIgPT0gc3RhcnRfbWVtb3J5KSkKKwkJICBwMiArPSAzOworCQllbHNlIGlmIChwMiArIDYgPCBwZW5kCisJCQkgJiYgKHJlX29wY29kZV90KSAqcDIgPT0gZHVtbXlfZmFpbHVyZV9qdW1wKQorCQkgIHAyICs9IDY7CisJCWVsc2UKKwkJICBicmVhazsKKwkgICAgICB9CisKKwkgICAgcDEgPSBwICsgbWNudDsKKwkgICAgLyogcDFbMF0gLi4uIHAxWzJdIGFyZSB0aGUgYG9uX2ZhaWx1cmVfanVtcCcgY29ycmVzcG9uZGluZworCSAgICAgICB0byB0aGUgYG1heWJlX2ZpbmFsaXplX2p1bXAnIG9mIHRoaXMgY2FzZS4gIEV4YW1pbmUgd2hhdAorCSAgICAgICBmb2xsb3dzLiAgKi8KKworICAgICAgICAgICAgLyogSWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybiwgd2UgY2FuIGNoYW5nZS4gICovCisgICAgICAgICAgICBpZiAocDIgPT0gcGVuZCkKKwkgICAgICB7CisJCS8qIENvbnNpZGVyIHdoYXQgaGFwcGVucyB3aGVuIG1hdGNoaW5nICI6XCguKlwpIgorCQkgICBhZ2FpbnN0ICI6LyIuICBJIGRvbid0IHJlYWxseSB1bmRlcnN0YW5kIHRoaXMgY29kZQorCQkgICB5ZXQuICAqLworICAJICAgICAgICBwWy0zXSA9ICh1bnNpZ25lZCBjaGFyKSBwb3BfZmFpbHVyZV9qdW1wOworICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UMQorICAgICAgICAgICAgICAgICAgKCIgIEVuZCBvZiBwYXR0ZXJuOiBjaGFuZ2UgdG8gYHBvcF9mYWlsdXJlX2p1bXAnLlxuIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzZSBpZiAoKHJlX29wY29kZV90KSAqcDIgPT0gZXhhY3RuCisJCSAgICAgfHwgKGJ1ZnAtPm5ld2xpbmVfYW5jaG9yICYmIChyZV9vcGNvZGVfdCkgKnAyID09IGVuZGxpbmUpKQorCSAgICAgIHsKKwkJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBjCisgICAgICAgICAgICAgICAgICA9ICpwMiA9PSAodW5zaWduZWQgY2hhcikgZW5kbGluZSA/ICdcbicgOiBwMlsyXTsKKworICAgICAgICAgICAgICAgIGlmICgocmVfb3Bjb2RlX3QpIHAxWzNdID09IGV4YWN0biAmJiBwMVs1XSAhPSBjKQorICAgICAgICAgICAgICAgICAgeworICAJCSAgICBwWy0zXSA9ICh1bnNpZ25lZCBjaGFyKSBwb3BfZmFpbHVyZV9qdW1wOworICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVDMgKCIgICVjICE9ICVjID0+IHBvcF9mYWlsdXJlX2p1bXAuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsIHAxWzVdKTsKKyAgICAgICAgICAgICAgICAgIH0KKworCQllbHNlIGlmICgocmVfb3Bjb2RlX3QpIHAxWzNdID09IGNoYXJzZXQKKwkJCSB8fCAocmVfb3Bjb2RlX3QpIHAxWzNdID09IGNoYXJzZXRfbm90KQorCQkgIHsKKwkJICAgIGludCBub3QgPSAocmVfb3Bjb2RlX3QpIHAxWzNdID09IGNoYXJzZXRfbm90OworCisJCSAgICBpZiAoYyA8ICh1bnNpZ25lZCBjaGFyKSAocDFbNF0gKiBCWVRFV0lEVEgpCisJCQkmJiBwMVs1ICsgYyAvIEJZVEVXSURUSF0gJiAoMSA8PCAoYyAlIEJZVEVXSURUSCkpKQorCQkgICAgICBub3QgPSAhbm90OworCisgICAgICAgICAgICAgICAgICAgIC8qIGBub3QnIGlzIGVxdWFsIHRvIDEgaWYgYyB3b3VsZCBtYXRjaCwgd2hpY2ggbWVhbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2UgY2FuJ3QgY2hhbmdlIHRvIHBvcF9mYWlsdXJlX2p1bXAuICAqLworCQkgICAgaWYgKCFub3QpCisgICAgICAgICAgICAgICAgICAgICAgeworICAJCSAgICAgICAgcFstM10gPSAodW5zaWduZWQgY2hhcikgcG9wX2ZhaWx1cmVfanVtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UMSAoIiAgTm8gbWF0Y2ggPT4gcG9wX2ZhaWx1cmVfanVtcC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgIH0KKwkJICB9CisJICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKHJlX29wY29kZV90KSAqcDIgPT0gY2hhcnNldCkKKwkgICAgICB7CisjaWZkZWYgREVCVUcKKwkJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBjCisgICAgICAgICAgICAgICAgICA9ICpwMiA9PSAodW5zaWduZWQgY2hhcikgZW5kbGluZSA/ICdcbicgOiBwMlsyXTsKKyNlbmRpZgorCisjaWYgMAorICAgICAgICAgICAgICAgIGlmICgocmVfb3Bjb2RlX3QpIHAxWzNdID09IGV4YWN0bgorCQkgICAgJiYgISAoKGludCkgcDJbMV0gKiBCWVRFV0lEVEggPiAoaW50KSBwMVs1XQorCQkJICAmJiAocDJbMiArIHAxWzVdIC8gQllURVdJRFRIXQorCQkJICAgICAgJiAoMSA8PCAocDFbNV0gJSBCWVRFV0lEVEgpKSkpKQorI2Vsc2UKKyAgICAgICAgICAgICAgICBpZiAoKHJlX29wY29kZV90KSBwMVszXSA9PSBleGFjdG4KKwkJICAgICYmICEgKChpbnQpIHAyWzFdICogQllURVdJRFRIID4gKGludCkgcDFbNF0KKwkJCSAgJiYgKHAyWzIgKyBwMVs0XSAvIEJZVEVXSURUSF0KKwkJCSAgICAgICYgKDEgPDwgKHAxWzRdICUgQllURVdJRFRIKSkpKSkKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgeworICAJCSAgICBwWy0zXSA9ICh1bnNpZ25lZCBjaGFyKSBwb3BfZmFpbHVyZV9qdW1wOworICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVDMgKCIgICVjICE9ICVjID0+IHBvcF9mYWlsdXJlX2p1bXAuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsIHAxWzVdKTsKKyAgICAgICAgICAgICAgICAgIH0KKworCQllbHNlIGlmICgocmVfb3Bjb2RlX3QpIHAxWzNdID09IGNoYXJzZXRfbm90KQorCQkgIHsKKwkJICAgIGludCBpZHg7CisJCSAgICAvKiBXZSB3aW4gaWYgdGhlIGNoYXJzZXRfbm90IGluc2lkZSB0aGUgbG9vcAorCQkgICAgICAgbGlzdHMgZXZlcnkgY2hhcmFjdGVyIGxpc3RlZCBpbiB0aGUgY2hhcnNldCBhZnRlci4gICovCisJCSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IChpbnQpIHAyWzFdOyBpZHgrKykKKwkJICAgICAgaWYgKCEgKHAyWzIgKyBpZHhdID09IDAKKwkJCSAgICAgfHwgKGlkeCA8IChpbnQpIHAxWzRdCisJCQkJICYmICgocDJbMiArIGlkeF0gJiB+IHAxWzUgKyBpZHhdKSA9PSAwKSkpKQorCQkJYnJlYWs7CisKKwkJICAgIGlmIChpZHggPT0gcDJbMV0pCisgICAgICAgICAgICAgICAgICAgICAgeworICAJCSAgICAgICAgcFstM10gPSAodW5zaWduZWQgY2hhcikgcG9wX2ZhaWx1cmVfanVtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UMSAoIiAgTm8gbWF0Y2ggPT4gcG9wX2ZhaWx1cmVfanVtcC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgIH0KKwkJICB9CisJCWVsc2UgaWYgKChyZV9vcGNvZGVfdCkgcDFbM10gPT0gY2hhcnNldCkKKwkJICB7CisJCSAgICBpbnQgaWR4OworCQkgICAgLyogV2Ugd2luIGlmIHRoZSBjaGFyc2V0IGluc2lkZSB0aGUgbG9vcAorCQkgICAgICAgaGFzIG5vIG92ZXJsYXAgd2l0aCB0aGUgb25lIGFmdGVyIHRoZSBsb29wLiAgKi8KKwkJICAgIGZvciAoaWR4ID0gMDsKKwkJCSBpZHggPCAoaW50KSBwMlsxXSAmJiBpZHggPCAoaW50KSBwMVs0XTsKKwkJCSBpZHgrKykKKwkJICAgICAgaWYgKChwMlsyICsgaWR4XSAmIHAxWzUgKyBpZHhdKSAhPSAwKQorCQkJYnJlYWs7CisKKwkJICAgIGlmIChpZHggPT0gcDJbMV0gfHwgaWR4ID09IHAxWzRdKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgCQkgICAgICAgIHBbLTNdID0gKHVuc2lnbmVkIGNoYXIpIHBvcF9mYWlsdXJlX2p1bXA7CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19QUklOVDEgKCIgIE5vIG1hdGNoID0+IHBvcF9mYWlsdXJlX2p1bXAuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKwkgIHAgLT0gMjsJCS8qIFBvaW50IGF0IHJlbGF0aXZlIGFkZHJlc3MgYWdhaW4uICAqLworCSAgaWYgKChyZV9vcGNvZGVfdCkgcFstMV0gIT0gcG9wX2ZhaWx1cmVfanVtcCkKKwkgICAgeworCSAgICAgIHBbLTFdID0gKHVuc2lnbmVkIGNoYXIpIGp1bXA7CisgICAgICAgICAgICAgIERFQlVHX1BSSU5UMSAoIiAgTWF0Y2ggPT4ganVtcC5cbiIpOworCSAgICAgIGdvdG8gdW5jb25kaXRpb25hbF9qdW1wOworCSAgICB9CisgICAgICAgIC8qIE5vdGUgZmFsbCB0aHJvdWdoLiAgKi8KKworCisJLyogVGhlIGVuZCBvZiBhIHNpbXBsZSByZXBlYXQgaGFzIGEgcG9wX2ZhaWx1cmVfanVtcCBiYWNrIHRvCisgICAgICAgICAgIGl0cyBtYXRjaGluZyBvbl9mYWlsdXJlX2p1bXAsIHdoZXJlIHRoZSBsYXR0ZXIgd2lsbCBwdXNoIGEKKyAgICAgICAgICAgZmFpbHVyZSBwb2ludC4gIFRoZSBwb3BfZmFpbHVyZV9qdW1wIHRha2VzIG9mZiBmYWlsdXJlCisgICAgICAgICAgIHBvaW50cyBwdXQgb24gYnkgdGhpcyBwb3BfZmFpbHVyZV9qdW1wJ3MgbWF0Y2hpbmcKKyAgICAgICAgICAgb25fZmFpbHVyZV9qdW1wOyB3ZSBnb3QgdGhyb3VnaCB0aGUgcGF0dGVybiB0byBoZXJlIGZyb20gdGhlCisgICAgICAgICAgIG1hdGNoaW5nIG9uX2ZhaWx1cmVfanVtcCwgc28gZGlkbid0IGZhaWwuICAqLworICAgICAgICBjYXNlIHBvcF9mYWlsdXJlX2p1bXA6CisgICAgICAgICAgeworICAgICAgICAgICAgLyogV2UgbmVlZCB0byBwYXNzIHNlcGFyYXRlIHN0b3JhZ2UgZm9yIHRoZSBsb3dlc3QgYW5kCisgICAgICAgICAgICAgICBoaWdoZXN0IHJlZ2lzdGVycywgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUKKyAgICAgICAgICAgICAgIGFjdHVhbCB2YWx1ZXMuICBPdGhlcndpc2UsIHdlIHdpbGwgcmVzdG9yZSBvbmx5IG9uZQorICAgICAgICAgICAgICAgcmVnaXN0ZXIgZnJvbSB0aGUgc3RhY2ssIHNpbmNlIGxvd2VzdCB3aWxsID09IGhpZ2hlc3QgaW4KKyAgICAgICAgICAgICAgIGBwb3BfZmFpbHVyZV9wb2ludCcuICAqLworICAgICAgICAgICAgYWN0aXZlX3JlZ190IGR1bW15X2xvd19yZWcsIGR1bW15X2hpZ2hfcmVnOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcGR1bW15OworICAgICAgICAgICAgY29uc3QgY2hhciAqc2R1bW15OworCisgICAgICAgICAgICBERUJVR19QUklOVDEgKCJFWEVDVVRJTkcgcG9wX2ZhaWx1cmVfanVtcC5cbiIpOworICAgICAgICAgICAgUE9QX0ZBSUxVUkVfUE9JTlQgKHNkdW1teSwgcGR1bW15LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bW15X2xvd19yZWcsIGR1bW15X2hpZ2hfcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ19kdW1teSwgcmVnX2R1bW15LCByZWdfaW5mb19kdW1teSk7CisgICAgICAgICAgfQorCSAgLyogTm90ZSBmYWxsIHRocm91Z2guICAqLworCisJdW5jb25kaXRpb25hbF9qdW1wOgorI2lmZGVmIF9MSUJDCisJICBERUJVR19QUklOVDIgKCJcbiVwOiAiLCBwKTsKKyNlbHNlCisJICBERUJVR19QUklOVDIgKCJcbjB4JXg6ICIsIHApOworI2VuZGlmCisgICAgICAgICAgLyogTm90ZSBmYWxsIHRocm91Z2guICAqLworCisgICAgICAgIC8qIFVuY29uZGl0aW9uYWxseSBqdW1wICh3aXRob3V0IHBvcHBpbmcgYW55IGZhaWx1cmUgcG9pbnRzKS4gICovCisgICAgICAgIGNhc2UganVtcDoKKwkgIEVYVFJBQ1RfTlVNQkVSX0FORF9JTkNSIChtY250LCBwKTsJLyogR2V0IHRoZSBhbW91bnQgdG8ganVtcC4gICovCisgICAgICAgICAgREVCVUdfUFJJTlQyICgiRVhFQ1VUSU5HIGp1bXAgJWQgIiwgbWNudCk7CisJICBwICs9IG1jbnQ7CQkJCS8qIERvIHRoZSBqdW1wLiAgKi8KKyNpZmRlZiBfTElCQworICAgICAgICAgIERFQlVHX1BSSU5UMiAoIih0byAlcCkuXG4iLCBwKTsKKyNlbHNlCisgICAgICAgICAgREVCVUdfUFJJTlQyICgiKHRvIDB4JXgpLlxuIiwgcCk7CisjZW5kaWYKKwkgIGJyZWFrOworCisKKyAgICAgICAgLyogV2UgbmVlZCB0aGlzIG9wY29kZSBzbyB3ZSBjYW4gZGV0ZWN0IHdoZXJlIGFsdGVybmF0aXZlcyBlbmQKKyAgICAgICAgICAgaW4gYGdyb3VwX21hdGNoX251bGxfc3RyaW5nX3AnIGV0IGFsLiAgKi8KKyAgICAgICAgY2FzZSBqdW1wX3Bhc3RfYWx0OgorICAgICAgICAgIERFQlVHX1BSSU5UMSAoIkVYRUNVVElORyBqdW1wX3Bhc3RfYWx0LlxuIik7CisgICAgICAgICAgZ290byB1bmNvbmRpdGlvbmFsX2p1bXA7CisKKworICAgICAgICAvKiBOb3JtYWxseSwgdGhlIG9uX2ZhaWx1cmVfanVtcCBwdXNoZXMgYSBmYWlsdXJlIHBvaW50LCB3aGljaAorICAgICAgICAgICB0aGVuIGdldHMgcG9wcGVkIGF0IHBvcF9mYWlsdXJlX2p1bXAuICBXZSB3aWxsIGVuZCB1cCBhdAorICAgICAgICAgICBwb3BfZmFpbHVyZV9qdW1wLCBhbHNvLCBhbmQgd2l0aCBhIHBhdHRlcm4gb2YsIHNheSwgYGErJywgd2UKKyAgICAgICAgICAgYXJlIHNraXBwaW5nIG92ZXIgdGhlIG9uX2ZhaWx1cmVfanVtcCwgc28gd2UgaGF2ZSB0byBwdXNoCisgICAgICAgICAgIHNvbWV0aGluZyBtZWFuaW5nbGVzcyBmb3IgcG9wX2ZhaWx1cmVfanVtcCB0byBwb3AuICAqLworICAgICAgICBjYXNlIGR1bW15X2ZhaWx1cmVfanVtcDoKKyAgICAgICAgICBERUJVR19QUklOVDEgKCJFWEVDVVRJTkcgZHVtbXlfZmFpbHVyZV9qdW1wLlxuIik7CisgICAgICAgICAgLyogSXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB3ZSBwdXNoIGZvciB0aGUgc3RyaW5nIGhlcmUuICBXaGF0CisgICAgICAgICAgICAgdGhlIGNvZGUgYXQgYGZhaWwnIHRlc3RzIGlzIHRoZSB2YWx1ZSBmb3IgdGhlIHBhdHRlcm4uICAqLworICAgICAgICAgIFBVU0hfRkFJTFVSRV9QT0lOVCAoTlVMTCwgTlVMTCwgLTIpOworICAgICAgICAgIGdvdG8gdW5jb25kaXRpb25hbF9qdW1wOworCisKKyAgICAgICAgLyogQXQgdGhlIGVuZCBvZiBhbiBhbHRlcm5hdGl2ZSwgd2UgbmVlZCB0byBwdXNoIGEgZHVtbXkgZmFpbHVyZQorICAgICAgICAgICBwb2ludCBpbiBjYXNlIHdlIGFyZSBmb2xsb3dlZCBieSBhIGBwb3BfZmFpbHVyZV9qdW1wJywgYmVjYXVzZQorICAgICAgICAgICB3ZSBkb24ndCB3YW50IHRoZSBmYWlsdXJlIHBvaW50IGZvciB0aGUgYWx0ZXJuYXRpdmUgdG8gYmUKKyAgICAgICAgICAgcG9wcGVkLiAgRm9yIGV4YW1wbGUsIG1hdGNoaW5nIGAoYXxhYikqJyBhZ2FpbnN0IGBhYWInCisgICAgICAgICAgIHJlcXVpcmVzIHRoYXQgd2UgbWF0Y2ggdGhlIGBhYicgYWx0ZXJuYXRpdmUuICAqLworICAgICAgICBjYXNlIHB1c2hfZHVtbXlfZmFpbHVyZToKKyAgICAgICAgICBERUJVR19QUklOVDEgKCJFWEVDVVRJTkcgcHVzaF9kdW1teV9mYWlsdXJlLlxuIik7CisgICAgICAgICAgLyogU2VlIGNvbW1lbnRzIGp1c3QgYWJvdmUgYXQgYGR1bW15X2ZhaWx1cmVfanVtcCcgYWJvdXQgdGhlCisgICAgICAgICAgICAgdHdvIHplcm9lcy4gICovCisgICAgICAgICAgUFVTSF9GQUlMVVJFX1BPSU5UIChOVUxMLCBOVUxMLCAtMik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogSGF2ZSB0byBzdWNjZWVkIG1hdGNoaW5nIHdoYXQgZm9sbG93cyBhdCBsZWFzdCBuIHRpbWVzLgorICAgICAgICAgICBBZnRlciB0aGF0LCBoYW5kbGUgbGlrZSBgb25fZmFpbHVyZV9qdW1wJy4gICovCisgICAgICAgIGNhc2Ugc3VjY2VlZF9uOgorICAgICAgICAgIEVYVFJBQ1RfTlVNQkVSIChtY250LCBwICsgMik7CisgICAgICAgICAgREVCVUdfUFJJTlQyICgiRVhFQ1VUSU5HIHN1Y2NlZWRfbiAlZC5cbiIsIG1jbnQpOworCisgICAgICAgICAgYXNzZXJ0IChtY250ID49IDApOworICAgICAgICAgIC8qIE9yaWdpbmFsbHksIHRoaXMgaXMgaG93IG1hbnkgdGltZXMgd2UgSEFWRSB0byBzdWNjZWVkLiAgKi8KKyAgICAgICAgICBpZiAobWNudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBtY250LS07CisJICAgICAgIHAgKz0gMjsKKyAgICAgICAgICAgICAgIFNUT1JFX05VTUJFUl9BTkRfSU5DUiAocCwgbWNudCk7CisjaWZkZWYgX0xJQkMKKyAgICAgICAgICAgICAgIERFQlVHX1BSSU5UMyAoIiAgU2V0dGluZyAlcCB0byAlZC5cbiIsIHAgLSAyLCBtY250KTsKKyNlbHNlCisgICAgICAgICAgICAgICBERUJVR19QUklOVDMgKCIgIFNldHRpbmcgMHgleCB0byAlZC5cbiIsIHAgLSAyLCBtY250KTsKKyNlbmRpZgorICAgICAgICAgICAgfQorCSAgZWxzZSBpZiAobWNudCA9PSAwKQorICAgICAgICAgICAgeworI2lmZGVmIF9MSUJDCisgICAgICAgICAgICAgIERFQlVHX1BSSU5UMiAoIiAgU2V0dGluZyB0d28gYnl0ZXMgZnJvbSAlcCB0byBub19vcC5cbiIsIHArMik7CisjZWxzZQorICAgICAgICAgICAgICBERUJVR19QUklOVDIgKCIgIFNldHRpbmcgdHdvIGJ5dGVzIGZyb20gMHgleCB0byBub19vcC5cbiIsIHArMik7CisjZW5kaWYKKwkgICAgICBwWzJdID0gKHVuc2lnbmVkIGNoYXIpIG5vX29wOworICAgICAgICAgICAgICBwWzNdID0gKHVuc2lnbmVkIGNoYXIpIG5vX29wOworICAgICAgICAgICAgICBnb3RvIG9uX2ZhaWx1cmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBqdW1wX246CisgICAgICAgICAgRVhUUkFDVF9OVU1CRVIgKG1jbnQsIHAgKyAyKTsKKyAgICAgICAgICBERUJVR19QUklOVDIgKCJFWEVDVVRJTkcganVtcF9uICVkLlxuIiwgbWNudCk7CisKKyAgICAgICAgICAvKiBPcmlnaW5hbGx5LCB0aGlzIGlzIGhvdyBtYW55IHRpbWVzIHdlIENBTiBqdW1wLiAgKi8KKyAgICAgICAgICBpZiAobWNudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIG1jbnQtLTsKKyAgICAgICAgICAgICAgIFNUT1JFX05VTUJFUiAocCArIDIsIG1jbnQpOworI2lmZGVmIF9MSUJDCisgICAgICAgICAgICAgICBERUJVR19QUklOVDMgKCIgIFNldHRpbmcgJXAgdG8gJWQuXG4iLCBwICsgMiwgbWNudCk7CisjZWxzZQorICAgICAgICAgICAgICAgREVCVUdfUFJJTlQzICgiICBTZXR0aW5nIDB4JXggdG8gJWQuXG4iLCBwICsgMiwgbWNudCk7CisjZW5kaWYKKwkgICAgICAgZ290byB1bmNvbmRpdGlvbmFsX2p1bXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgLyogSWYgZG9uJ3QgaGF2ZSB0byBqdW1wIGFueSBtb3JlLCBza2lwIG92ZXIgdGhlIHJlc3Qgb2YgY29tbWFuZC4gICovCisJICBlbHNlCisJICAgIHAgKz0gNDsKKyAgICAgICAgICBicmVhazsKKworCWNhc2Ugc2V0X251bWJlcl9hdDoKKwkgIHsKKyAgICAgICAgICAgIERFQlVHX1BSSU5UMSAoIkVYRUNVVElORyBzZXRfbnVtYmVyX2F0LlxuIik7CisKKyAgICAgICAgICAgIEVYVFJBQ1RfTlVNQkVSX0FORF9JTkNSIChtY250LCBwKTsKKyAgICAgICAgICAgIHAxID0gcCArIG1jbnQ7CisgICAgICAgICAgICBFWFRSQUNUX05VTUJFUl9BTkRfSU5DUiAobWNudCwgcCk7CisjaWZkZWYgX0xJQkMKKyAgICAgICAgICAgIERFQlVHX1BSSU5UMyAoIiAgU2V0dGluZyAlcCB0byAlZC5cbiIsIHAxLCBtY250KTsKKyNlbHNlCisgICAgICAgICAgICBERUJVR19QUklOVDMgKCIgIFNldHRpbmcgMHgleCB0byAlZC5cbiIsIHAxLCBtY250KTsKKyNlbmRpZgorCSAgICBTVE9SRV9OVU1CRVIgKHAxLCBtY250KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworI2lmIDAKKwkvKiBUaGUgREVDIEFscGhhIEMgY29tcGlsZXIgMy54IGdlbmVyYXRlcyBpbmNvcnJlY3QgY29kZSBmb3IgdGhlCisJICAgdGVzdCAgV09SRENIQVJfUCAoZCAtIDEpICE9IFdPUkRDSEFSX1AgKGQpICBpbiB0aGUgZXhwYW5zaW9uIG9mCisJICAgQVRfV09SRF9CT1VOREFSWSwgc28gdGhpcyBjb2RlIGlzIGRpc2FibGVkLiAgRXhwYW5kaW5nIHRoZQorCSAgIG1hY3JvIGFuZCBpbnRyb2R1Y2luZyB0ZW1wb3JhcnkgdmFyaWFibGVzIHdvcmtzIGFyb3VuZCB0aGUgYnVnLiAgKi8KKworCWNhc2Ugd29yZGJvdW5kOgorCSAgREVCVUdfUFJJTlQxICgiRVhFQ1VUSU5HIHdvcmRib3VuZC5cbiIpOworCSAgaWYgKEFUX1dPUkRfQk9VTkRBUlkgKGQpKQorCSAgICBicmVhazsKKwkgIGdvdG8gZmFpbDsKKworCWNhc2Ugbm90d29yZGJvdW5kOgorCSAgREVCVUdfUFJJTlQxICgiRVhFQ1VUSU5HIG5vdHdvcmRib3VuZC5cbiIpOworCSAgaWYgKEFUX1dPUkRfQk9VTkRBUlkgKGQpKQorCSAgICBnb3RvIGZhaWw7CisJICBicmVhazsKKyNlbHNlCisJY2FzZSB3b3JkYm91bmQ6CisJeworCSAgYm9vbGVhbiBwcmV2Y2hhciwgdGhpc2NoYXI7CisKKwkgIERFQlVHX1BSSU5UMSAoIkVYRUNVVElORyB3b3JkYm91bmQuXG4iKTsKKwkgIGlmIChBVF9TVFJJTkdTX0JFRyAoZCkgfHwgQVRfU1RSSU5HU19FTkQgKGQpKQorCSAgICBicmVhazsKKworCSAgcHJldmNoYXIgPSBXT1JEQ0hBUl9QIChkIC0gMSk7CisJICB0aGlzY2hhciA9IFdPUkRDSEFSX1AgKGQpOworCSAgaWYgKHByZXZjaGFyICE9IHRoaXNjaGFyKQorCSAgICBicmVhazsKKwkgIGdvdG8gZmFpbDsKKwl9CisKKyAgICAgIGNhc2Ugbm90d29yZGJvdW5kOgorCXsKKwkgIGJvb2xlYW4gcHJldmNoYXIsIHRoaXNjaGFyOworCisJICBERUJVR19QUklOVDEgKCJFWEVDVVRJTkcgbm90d29yZGJvdW5kLlxuIik7CisJICBpZiAoQVRfU1RSSU5HU19CRUcgKGQpIHx8IEFUX1NUUklOR1NfRU5EIChkKSkKKwkgICAgZ290byBmYWlsOworCisJICBwcmV2Y2hhciA9IFdPUkRDSEFSX1AgKGQgLSAxKTsKKwkgIHRoaXNjaGFyID0gV09SRENIQVJfUCAoZCk7CisJICBpZiAocHJldmNoYXIgIT0gdGhpc2NoYXIpCisJICAgIGdvdG8gZmFpbDsKKwkgIGJyZWFrOworCX0KKyNlbmRpZgorCisJY2FzZSB3b3JkYmVnOgorICAgICAgICAgIERFQlVHX1BSSU5UMSAoIkVYRUNVVElORyB3b3JkYmVnLlxuIik7CisJICBpZiAoV09SRENIQVJfUCAoZCkgJiYgKEFUX1NUUklOR1NfQkVHIChkKSB8fCAhV09SRENIQVJfUCAoZCAtIDEpKSkKKwkgICAgYnJlYWs7CisgICAgICAgICAgZ290byBmYWlsOworCisJY2FzZSB3b3JkZW5kOgorICAgICAgICAgIERFQlVHX1BSSU5UMSAoIkVYRUNVVElORyB3b3JkZW5kLlxuIik7CisJICBpZiAoIUFUX1NUUklOR1NfQkVHIChkKSAmJiBXT1JEQ0hBUl9QIChkIC0gMSkKKyAgICAgICAgICAgICAgJiYgKCFXT1JEQ0hBUl9QIChkKSB8fCBBVF9TVFJJTkdTX0VORCAoZCkpKQorCSAgICBicmVhazsKKyAgICAgICAgICBnb3RvIGZhaWw7CisKKyNpZmRlZiBlbWFjcworICAJY2FzZSBiZWZvcmVfZG90OgorICAgICAgICAgIERFQlVHX1BSSU5UMSAoIkVYRUNVVElORyBiZWZvcmVfZG90LlxuIik7CisgCSAgaWYgKFBUUl9DSEFSX1BPUyAoKHVuc2lnbmVkIGNoYXIgKikgZCkgPj0gcG9pbnQpCisgIAkgICAgZ290byBmYWlsOworICAJICBicmVhazsKKworICAJY2FzZSBhdF9kb3Q6CisgICAgICAgICAgREVCVUdfUFJJTlQxICgiRVhFQ1VUSU5HIGF0X2RvdC5cbiIpOworIAkgIGlmIChQVFJfQ0hBUl9QT1MgKCh1bnNpZ25lZCBjaGFyICopIGQpICE9IHBvaW50KQorICAJICAgIGdvdG8gZmFpbDsKKyAgCSAgYnJlYWs7CisKKyAgCWNhc2UgYWZ0ZXJfZG90OgorICAgICAgICAgIERFQlVHX1BSSU5UMSAoIkVYRUNVVElORyBhZnRlcl9kb3QuXG4iKTsKKyAgICAgICAgICBpZiAoUFRSX0NIQVJfUE9TICgodW5zaWduZWQgY2hhciAqKSBkKSA8PSBwb2ludCkKKyAgCSAgICBnb3RvIGZhaWw7CisgIAkgIGJyZWFrOworCisJY2FzZSBzeW50YXhzcGVjOgorICAgICAgICAgIERFQlVHX1BSSU5UMiAoIkVYRUNVVElORyBzeW50YXhzcGVjICVkLlxuIiwgbWNudCk7CisJICBtY250ID0gKnArKzsKKwkgIGdvdG8gbWF0Y2hzeW50YXg7CisKKyAgICAgICAgY2FzZSB3b3JkY2hhcjoKKyAgICAgICAgICBERUJVR19QUklOVDEgKCJFWEVDVVRJTkcgRW1hY3Mgd29yZGNoYXIuXG4iKTsKKwkgIG1jbnQgPSAoaW50KSBTd29yZDsKKyAgICAgICAgbWF0Y2hzeW50YXg6CisJICBQUkVGRVRDSCAoKTsKKwkgIC8qIENhbid0IHVzZSAqZCsrIGhlcmU7IFNZTlRBWCBtYXkgYmUgYW4gdW5zYWZlIG1hY3JvLiAgKi8KKwkgIGQrKzsKKwkgIGlmIChTWU5UQVggKGRbLTFdKSAhPSAoZW51bSBzeW50YXhjb2RlKSBtY250KQorCSAgICBnb3RvIGZhaWw7CisgICAgICAgICAgU0VUX1JFR1NfTUFUQ0hFRCAoKTsKKwkgIGJyZWFrOworCisJY2FzZSBub3RzeW50YXhzcGVjOgorICAgICAgICAgIERFQlVHX1BSSU5UMiAoIkVYRUNVVElORyBub3RzeW50YXhzcGVjICVkLlxuIiwgbWNudCk7CisJICBtY250ID0gKnArKzsKKwkgIGdvdG8gbWF0Y2hub3RzeW50YXg7CisKKyAgICAgICAgY2FzZSBub3R3b3JkY2hhcjoKKyAgICAgICAgICBERUJVR19QUklOVDEgKCJFWEVDVVRJTkcgRW1hY3Mgbm90d29yZGNoYXIuXG4iKTsKKwkgIG1jbnQgPSAoaW50KSBTd29yZDsKKyAgICAgICAgbWF0Y2hub3RzeW50YXg6CisJICBQUkVGRVRDSCAoKTsKKwkgIC8qIENhbid0IHVzZSAqZCsrIGhlcmU7IFNZTlRBWCBtYXkgYmUgYW4gdW5zYWZlIG1hY3JvLiAgKi8KKwkgIGQrKzsKKwkgIGlmIChTWU5UQVggKGRbLTFdKSA9PSAoZW51bSBzeW50YXhjb2RlKSBtY250KQorCSAgICBnb3RvIGZhaWw7CisJICBTRVRfUkVHU19NQVRDSEVEICgpOworICAgICAgICAgIGJyZWFrOworCisjZWxzZSAvKiBub3QgZW1hY3MgKi8KKwljYXNlIHdvcmRjaGFyOgorICAgICAgICAgIERFQlVHX1BSSU5UMSAoIkVYRUNVVElORyBub24tRW1hY3Mgd29yZGNoYXIuXG4iKTsKKwkgIFBSRUZFVENIICgpOworICAgICAgICAgIGlmICghV09SRENIQVJfUCAoZCkpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisJICBTRVRfUkVHU19NQVRDSEVEICgpOworICAgICAgICAgIGQrKzsKKwkgIGJyZWFrOworCisJY2FzZSBub3R3b3JkY2hhcjoKKyAgICAgICAgICBERUJVR19QUklOVDEgKCJFWEVDVVRJTkcgbm9uLUVtYWNzIG5vdHdvcmRjaGFyLlxuIik7CisJICBQUkVGRVRDSCAoKTsKKwkgIGlmIChXT1JEQ0hBUl9QIChkKSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICBTRVRfUkVHU19NQVRDSEVEICgpOworICAgICAgICAgIGQrKzsKKwkgIGJyZWFrOworI2VuZGlmIC8qIG5vdCBlbWFjcyAqLworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYWJvcnQgKCk7CisJfQorICAgICAgY29udGludWU7ICAvKiBTdWNjZXNzZnVsbHkgZXhlY3V0ZWQgb25lIHBhdHRlcm4gY29tbWFuZDsga2VlcCBnb2luZy4gICovCisKKworICAgIC8qIFdlIGdvdG8gaGVyZSBpZiBhIG1hdGNoaW5nIG9wZXJhdGlvbiBmYWlscy4gKi8KKyAgICBmYWlsOgorICAgICAgaWYgKCFGQUlMX1NUQUNLX0VNUFRZICgpKQorCXsgLyogQSByZXN0YXJ0IHBvaW50IGlzIGtub3duLiAgUmVzdG9yZSB0byB0aGF0IHN0YXRlLiAgKi8KKyAgICAgICAgICBERUJVR19QUklOVDEgKCJcbkZBSUw6XG4iKTsKKyAgICAgICAgICBQT1BfRkFJTFVSRV9QT0lOVCAoZCwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXN0X2FjdGl2ZV9yZWcsIGhpZ2hlc3RfYWN0aXZlX3JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnc3RhcnQsIHJlZ2VuZCwgcmVnX2luZm8pOworCisgICAgICAgICAgLyogSWYgdGhpcyBmYWlsdXJlIHBvaW50IGlzIGEgZHVtbXksIHRyeSB0aGUgbmV4dCBvbmUuICAqLworICAgICAgICAgIGlmICghcCkKKwkgICAgZ290byBmYWlsOworCisgICAgICAgICAgLyogSWYgd2UgZmFpbGVkIHRvIHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4sIGRvbid0IGV4YW1pbmUgKnAuICAqLworCSAgYXNzZXJ0IChwIDw9IHBlbmQpOworICAgICAgICAgIGlmIChwIDwgcGVuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYm9vbGVhbiBpc19hX2p1bXBfbiA9IGZhbHNlOworCisgICAgICAgICAgICAgIC8qIElmIGZhaWxlZCB0byBhIGJhY2t3YXJkcyBqdW1wIHRoYXQncyBwYXJ0IG9mIGEgcmVwZXRpdGlvbgorICAgICAgICAgICAgICAgICBsb29wLCBuZWVkIHRvIHBvcCB0aGlzIGZhaWx1cmUgcG9pbnQgYW5kIHVzZSB0aGUgbmV4dCBvbmUuICAqLworICAgICAgICAgICAgICBzd2l0Y2ggKChyZV9vcGNvZGVfdCkgKnApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UganVtcF9uOgorICAgICAgICAgICAgICAgICAgaXNfYV9qdW1wX24gPSB0cnVlOworICAgICAgICAgICAgICAgIGNhc2UgbWF5YmVfcG9wX2p1bXA6CisgICAgICAgICAgICAgICAgY2FzZSBwb3BfZmFpbHVyZV9qdW1wOgorICAgICAgICAgICAgICAgIGNhc2UganVtcDoKKyAgICAgICAgICAgICAgICAgIHAxID0gcCArIDE7CisgICAgICAgICAgICAgICAgICBFWFRSQUNUX05VTUJFUl9BTkRfSU5DUiAobWNudCwgcDEpOworICAgICAgICAgICAgICAgICAgcDEgKz0gbWNudDsKKworICAgICAgICAgICAgICAgICAgaWYgKChpc19hX2p1bXBfbiAmJiAocmVfb3Bjb2RlX3QpICpwMSA9PSBzdWNjZWVkX24pCisgICAgICAgICAgICAgICAgICAgICAgfHwgKCFpc19hX2p1bXBfbgorICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocmVfb3Bjb2RlX3QpICpwMSA9PSBvbl9mYWlsdXJlX2p1bXApKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgLyogZG8gbm90aGluZyAqLyA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGQgPj0gc3RyaW5nMSAmJiBkIDw9IGVuZDEpCisJICAgIGRlbmQgPSBlbmRfbWF0Y2hfMTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBicmVhazsgICAvKiBNYXRjaGluZyBhdCB0aGlzIHN0YXJ0aW5nIHBvaW50IHJlYWxseSBmYWlscy4gICovCisgICAgfSAvKiBmb3IgKDs7KSAqLworCisgIGlmIChiZXN0X3JlZ3Nfc2V0KQorICAgIGdvdG8gcmVzdG9yZV9iZXN0X3JlZ3M7CisKKyAgRlJFRV9WQVJJQUJMRVMgKCk7CisKKyAgcmV0dXJuIC0xOyAgICAgICAgIAkJCS8qIEZhaWx1cmUgdG8gbWF0Y2guICAqLworfSAvKiByZV9tYXRjaF8yICovCisMCisvKiBTdWJyb3V0aW5lIGRlZmluaXRpb25zIGZvciByZV9tYXRjaF8yLiAgKi8KKworCisvKiBXZSBhcmUgcGFzc2VkIFAgcG9pbnRpbmcgdG8gYSByZWdpc3RlciBudW1iZXIgYWZ0ZXIgYSBzdGFydF9tZW1vcnkuCisKKyAgIFJldHVybiB0cnVlIGlmIHRoZSBwYXR0ZXJuIHVwIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0b3BfbWVtb3J5IGNhbgorICAgbWF0Y2ggdGhlIGVtcHR5IHN0cmluZywgYW5kIGZhbHNlIG90aGVyd2lzZS4KKworICAgSWYgd2UgZmluZCB0aGUgbWF0Y2hpbmcgc3RvcF9tZW1vcnksIHNldHMgUCB0byBwb2ludCB0byBvbmUgcGFzdCBpdHMgbnVtYmVyLgorICAgT3RoZXJ3aXNlLCBzZXRzIFAgdG8gYW4gdW5kZWZpbmVkIGJ5dGUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIEVORC4KKworICAgV2UgZG9uJ3QgaGFuZGxlIGR1cGxpY2F0ZXMgcHJvcGVybHkgKHlldCkuICAqLworCitzdGF0aWMgYm9vbGVhbgorZ3JvdXBfbWF0Y2hfbnVsbF9zdHJpbmdfcCAocCwgZW5kLCByZWdfaW5mbykKKyAgICB1bnNpZ25lZCBjaGFyICoqcCwgKmVuZDsKKyAgICByZWdpc3Rlcl9pbmZvX3R5cGUgKnJlZ19pbmZvOworeworICBpbnQgbWNudDsKKyAgLyogUG9pbnQgdG8gYWZ0ZXIgdGhlIGFyZ3MgdG8gdGhlIHN0YXJ0X21lbW9yeS4gICovCisgIHVuc2lnbmVkIGNoYXIgKnAxID0gKnAgKyAyOworCisgIHdoaWxlIChwMSA8IGVuZCkKKyAgICB7CisgICAgICAvKiBTa2lwIG92ZXIgb3Bjb2RlcyB0aGF0IGNhbiBtYXRjaCBub3RoaW5nLCBhbmQgcmV0dXJuIHRydWUgb3IKKwkgZmFsc2UsIGFzIGFwcHJvcHJpYXRlLCB3aGVuIHdlIGdldCB0byBvbmUgdGhhdCBjYW4ndCwgb3IgdG8gdGhlCisgICAgICAgICBtYXRjaGluZyBzdG9wX21lbW9yeS4gICovCisKKyAgICAgIHN3aXRjaCAoKHJlX29wY29kZV90KSAqcDEpCisgICAgICAgIHsKKyAgICAgICAgLyogQ291bGQgYmUgZWl0aGVyIGEgbG9vcCBvciBhIHNlcmllcyBvZiBhbHRlcm5hdGl2ZXMuICAqLworICAgICAgICBjYXNlIG9uX2ZhaWx1cmVfanVtcDoKKyAgICAgICAgICBwMSsrOworICAgICAgICAgIEVYVFJBQ1RfTlVNQkVSX0FORF9JTkNSIChtY250LCBwMSk7CisKKyAgICAgICAgICAvKiBJZiB0aGUgbmV4dCBvcGVyYXRpb24gaXMgbm90IGEganVtcCBiYWNrd2FyZHMgaW4gdGhlCisJICAgICBwYXR0ZXJuLiAgKi8KKworCSAgaWYgKG1jbnQgPj0gMCkKKwkgICAgeworICAgICAgICAgICAgICAvKiBHbyB0aHJvdWdoIHRoZSBvbl9mYWlsdXJlX2p1bXBzIG9mIHRoZSBhbHRlcm5hdGl2ZXMsCisgICAgICAgICAgICAgICAgIHNlZWluZyBpZiBhbnkgb2YgdGhlIGFsdGVybmF0aXZlcyBjYW5ub3QgbWF0Y2ggbm90aGluZy4KKyAgICAgICAgICAgICAgICAgVGhlIGxhc3QgYWx0ZXJuYXRpdmUgc3RhcnRzIHdpdGggb25seSBhIGp1bXAsCisgICAgICAgICAgICAgICAgIHdoZXJlYXMgdGhlIHJlc3Qgc3RhcnQgd2l0aCBvbl9mYWlsdXJlX2p1bXAgYW5kIGVuZAorICAgICAgICAgICAgICAgICB3aXRoIGEganVtcCwgZS5nLiwgaGVyZSBpcyB0aGUgcGF0dGVybiBmb3IgYGF8YnxjJzoKKworICAgICAgICAgICAgICAgICAvb25fZmFpbHVyZV9qdW1wLzAvNi9leGFjdG4vMS9hL2p1bXBfcGFzdF9hbHQvMC82CisgICAgICAgICAgICAgICAgIC9vbl9mYWlsdXJlX2p1bXAvMC82L2V4YWN0bi8xL2IvanVtcF9wYXN0X2FsdC8wLzMKKyAgICAgICAgICAgICAgICAgL2V4YWN0bi8xL2MKKworICAgICAgICAgICAgICAgICBTbywgd2UgaGF2ZSB0byBmaXJzdCBnbyB0aHJvdWdoIHRoZSBmaXJzdCAobi0xKQorICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZXMgYW5kIHRoZW4gZGVhbCB3aXRoIHRoZSBsYXN0IG9uZSBzZXBhcmF0ZWx5LiAgKi8KKworCisgICAgICAgICAgICAgIC8qIERlYWwgd2l0aCB0aGUgZmlyc3QgKG4tMSkgYWx0ZXJuYXRpdmVzLCB3aGljaCBzdGFydAorICAgICAgICAgICAgICAgICB3aXRoIGFuIG9uX2ZhaWx1cmVfanVtcCAoc2VlIGFib3ZlKSB0aGF0IGp1bXBzIHRvIHJpZ2h0CisgICAgICAgICAgICAgICAgIHBhc3QgYSBqdW1wX3Bhc3RfYWx0LiAgKi8KKworICAgICAgICAgICAgICB3aGlsZSAoKHJlX29wY29kZV90KSBwMVttY250LTNdID09IGp1bXBfcGFzdF9hbHQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogYG1jbnQnIGhvbGRzIGhvdyBtYW55IGJ5dGVzIGxvbmcgdGhlIGFsdGVybmF0aXZlCisgICAgICAgICAgICAgICAgICAgICBpcywgaW5jbHVkaW5nIHRoZSBlbmRpbmcgYGp1bXBfcGFzdF9hbHQnIGFuZAorICAgICAgICAgICAgICAgICAgICAgaXRzIG51bWJlci4gICovCisKKyAgICAgICAgICAgICAgICAgIGlmICghYWx0X21hdGNoX251bGxfc3RyaW5nX3AgKHAxLCBwMSArIG1jbnQgLSAzLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICByZWdfaW5mbykpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgLyogTW92ZSB0byByaWdodCBhZnRlciB0aGlzIGFsdGVybmF0aXZlLCBpbmNsdWRpbmcgdGhlCisJCSAgICAganVtcF9wYXN0X2FsdC4gICovCisgICAgICAgICAgICAgICAgICBwMSArPSBtY250OworCisgICAgICAgICAgICAgICAgICAvKiBCcmVhayBpZiBpdCdzIHRoZSBiZWdpbm5pbmcgb2YgYW4gbi10aCBhbHRlcm5hdGl2ZQorICAgICAgICAgICAgICAgICAgICAgdGhhdCBkb2Vzbid0IGJlZ2luIHdpdGggYW4gb25fZmFpbHVyZV9qdW1wLiAgKi8KKyAgICAgICAgICAgICAgICAgIGlmICgocmVfb3Bjb2RlX3QpICpwMSAhPSBvbl9mYWlsdXJlX2p1bXApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCSAgLyogU3RpbGwgaGF2ZSB0byBjaGVjayB0aGF0IGl0J3Mgbm90IGFuIG4tdGgKKwkJICAgICBhbHRlcm5hdGl2ZSB0aGF0IHN0YXJ0cyB3aXRoIGFuIG9uX2ZhaWx1cmVfanVtcC4gICovCisJCSAgcDErKzsKKyAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfTlVNQkVSX0FORF9JTkNSIChtY250LCBwMSk7CisgICAgICAgICAgICAgICAgICBpZiAoKHJlX29wY29kZV90KSBwMVttY250LTNdICE9IGp1bXBfcGFzdF9hbHQpCisgICAgICAgICAgICAgICAgICAgIHsKKwkJICAgICAgLyogR2V0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG4tdGggYWx0ZXJuYXRpdmUuICAqLworICAgICAgICAgICAgICAgICAgICAgIHAxIC09IDM7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLyogRGVhbCB3aXRoIHRoZSBsYXN0IGFsdGVybmF0aXZlOiBnbyBiYWNrIGFuZCBnZXQgbnVtYmVyCisgICAgICAgICAgICAgICAgIG9mIHRoZSBganVtcF9wYXN0X2FsdCcganVzdCBiZWZvcmUgaXQuICBgbWNudCcgY29udGFpbnMKKyAgICAgICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgYWx0ZXJuYXRpdmUuICAqLworICAgICAgICAgICAgICBFWFRSQUNUX05VTUJFUiAobWNudCwgcDEgLSAyKTsKKworICAgICAgICAgICAgICBpZiAoIWFsdF9tYXRjaF9udWxsX3N0cmluZ19wIChwMSwgcDEgKyBtY250LCByZWdfaW5mbykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICAgIHAxICs9IG1jbnQ7CS8qIEdldCBwYXN0IHRoZSBuLXRoIGFsdGVybmF0aXZlLiAgKi8KKyAgICAgICAgICAgIH0gLyogaWYgbWNudCA+IDAgKi8KKyAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2Ugc3RvcF9tZW1vcnk6CisJICBhc3NlcnQgKHAxWzFdID09ICoqcCk7CisgICAgICAgICAgKnAgPSBwMSArIDI7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGlmICghY29tbW9uX29wX21hdGNoX251bGxfc3RyaW5nX3AgKCZwMSwgZW5kLCByZWdfaW5mbykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IC8qIHdoaWxlIHAxIDwgZW5kICovCisKKyAgcmV0dXJuIGZhbHNlOworfSAvKiBncm91cF9tYXRjaF9udWxsX3N0cmluZ19wICovCisKKworLyogU2ltaWxhciB0byBncm91cF9tYXRjaF9udWxsX3N0cmluZ19wLCBidXQgZG9lc24ndCBkZWFsIHdpdGggYWx0ZXJuYXRpdmVzOgorICAgSXQgZXhwZWN0cyBQIHRvIGJlIHRoZSBmaXJzdCBieXRlIG9mIGEgc2luZ2xlIGFsdGVybmF0aXZlIGFuZCBFTkQgb25lCisgICBieXRlIHBhc3QgdGhlIGxhc3QuIFRoZSBhbHRlcm5hdGl2ZSBjYW4gY29udGFpbiBncm91cHMuICAqLworCitzdGF0aWMgYm9vbGVhbgorYWx0X21hdGNoX251bGxfc3RyaW5nX3AgKHAsIGVuZCwgcmVnX2luZm8pCisgICAgdW5zaWduZWQgY2hhciAqcCwgKmVuZDsKKyAgICByZWdpc3Rlcl9pbmZvX3R5cGUgKnJlZ19pbmZvOworeworICBpbnQgbWNudDsKKyAgdW5zaWduZWQgY2hhciAqcDEgPSBwOworCisgIHdoaWxlIChwMSA8IGVuZCkKKyAgICB7CisgICAgICAvKiBTa2lwIG92ZXIgb3Bjb2RlcyB0aGF0IGNhbiBtYXRjaCBub3RoaW5nLCBhbmQgYnJlYWsgd2hlbiB3ZSBnZXQKKyAgICAgICAgIHRvIG9uZSB0aGF0IGNhbid0LiAgKi8KKworICAgICAgc3dpdGNoICgocmVfb3Bjb2RlX3QpICpwMSkKKyAgICAgICAgeworCS8qIEl0J3MgYSBsb29wLiAgKi8KKyAgICAgICAgY2FzZSBvbl9mYWlsdXJlX2p1bXA6CisgICAgICAgICAgcDErKzsKKyAgICAgICAgICBFWFRSQUNUX05VTUJFUl9BTkRfSU5DUiAobWNudCwgcDEpOworICAgICAgICAgIHAxICs9IG1jbnQ7CisgICAgICAgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorICAgICAgICAgIGlmICghY29tbW9uX29wX21hdGNoX251bGxfc3RyaW5nX3AgKCZwMSwgZW5kLCByZWdfaW5mbykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9ICAvKiB3aGlsZSBwMSA8IGVuZCAqLworCisgIHJldHVybiB0cnVlOworfSAvKiBhbHRfbWF0Y2hfbnVsbF9zdHJpbmdfcCAqLworCisKKy8qIERlYWxzIHdpdGggdGhlIG9wcyBjb21tb24gdG8gZ3JvdXBfbWF0Y2hfbnVsbF9zdHJpbmdfcCBhbmQKKyAgIGFsdF9tYXRjaF9udWxsX3N0cmluZ19wLgorCisgICBTZXRzIFAgdG8gb25lIGFmdGVyIHRoZSBvcCBhbmQgaXRzIGFyZ3VtZW50cywgaWYgYW55LiAgKi8KKworc3RhdGljIGJvb2xlYW4KK2NvbW1vbl9vcF9tYXRjaF9udWxsX3N0cmluZ19wIChwLCBlbmQsIHJlZ19pbmZvKQorICAgIHVuc2lnbmVkIGNoYXIgKipwLCAqZW5kOworICAgIHJlZ2lzdGVyX2luZm9fdHlwZSAqcmVnX2luZm87Cit7CisgIGludCBtY250OworICBib29sZWFuIHJldDsKKyAgaW50IHJlZ19ubzsKKyAgdW5zaWduZWQgY2hhciAqcDEgPSAqcDsKKworICBzd2l0Y2ggKChyZV9vcGNvZGVfdCkgKnAxKyspCisgICAgeworICAgIGNhc2Ugbm9fb3A6CisgICAgY2FzZSBiZWdsaW5lOgorICAgIGNhc2UgZW5kbGluZToKKyAgICBjYXNlIGJlZ2J1ZjoKKyAgICBjYXNlIGVuZGJ1ZjoKKyAgICBjYXNlIHdvcmRiZWc6CisgICAgY2FzZSB3b3JkZW5kOgorICAgIGNhc2Ugd29yZGJvdW5kOgorICAgIGNhc2Ugbm90d29yZGJvdW5kOgorI2lmZGVmIGVtYWNzCisgICAgY2FzZSBiZWZvcmVfZG90OgorICAgIGNhc2UgYXRfZG90OgorICAgIGNhc2UgYWZ0ZXJfZG90OgorI2VuZGlmCisgICAgICBicmVhazsKKworICAgIGNhc2Ugc3RhcnRfbWVtb3J5OgorICAgICAgcmVnX25vID0gKnAxOworICAgICAgYXNzZXJ0IChyZWdfbm8gPiAwICYmIHJlZ19ubyA8PSBNQVhfUkVHTlVNKTsKKyAgICAgIHJldCA9IGdyb3VwX21hdGNoX251bGxfc3RyaW5nX3AgKCZwMSwgZW5kLCByZWdfaW5mbyk7CisKKyAgICAgIC8qIEhhdmUgdG8gc2V0IHRoaXMgaGVyZSBpbiBjYXNlIHdlJ3JlIGNoZWNraW5nIGEgZ3JvdXAgd2hpY2gKKyAgICAgICAgIGNvbnRhaW5zIGEgZ3JvdXAgYW5kIGEgYmFjayByZWZlcmVuY2UgdG8gaXQuICAqLworCisgICAgICBpZiAoUkVHX01BVENIX05VTExfU1RSSU5HX1AgKHJlZ19pbmZvW3JlZ19ub10pID09IE1BVENIX05VTExfVU5TRVRfVkFMVUUpCisgICAgICAgIFJFR19NQVRDSF9OVUxMX1NUUklOR19QIChyZWdfaW5mb1tyZWdfbm9dKSA9IHJldDsKKworICAgICAgaWYgKCFyZXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworCisgICAgLyogSWYgdGhpcyBpcyBhbiBvcHRpbWl6ZWQgc3VjY2VlZF9uIGZvciB6ZXJvIHRpbWVzLCBtYWtlIHRoZSBqdW1wLiAgKi8KKyAgICBjYXNlIGp1bXA6CisgICAgICBFWFRSQUNUX05VTUJFUl9BTkRfSU5DUiAobWNudCwgcDEpOworICAgICAgaWYgKG1jbnQgPj0gMCkKKyAgICAgICAgcDEgKz0gbWNudDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHN1Y2NlZWRfbjoKKyAgICAgIC8qIEdldCB0byB0aGUgbnVtYmVyIG9mIHRpbWVzIHRvIHN1Y2NlZWQuICAqLworICAgICAgcDEgKz0gMjsKKyAgICAgIEVYVFJBQ1RfTlVNQkVSX0FORF9JTkNSIChtY250LCBwMSk7CisKKyAgICAgIGlmIChtY250ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBwMSAtPSA0OworICAgICAgICAgIEVYVFJBQ1RfTlVNQkVSX0FORF9JTkNSIChtY250LCBwMSk7CisgICAgICAgICAgcDEgKz0gbWNudDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgZHVwbGljYXRlOgorICAgICAgaWYgKCFSRUdfTUFUQ0hfTlVMTF9TVFJJTkdfUCAocmVnX2luZm9bKnAxXSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBzZXRfbnVtYmVyX2F0OgorICAgICAgcDEgKz0gNDsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBBbGwgb3RoZXIgb3Bjb2RlcyBtZWFuIHdlIGNhbm5vdCBtYXRjaCB0aGUgZW1wdHkgc3RyaW5nLiAgKi8KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpwID0gcDE7CisgIHJldHVybiB0cnVlOworfSAvKiBjb21tb25fb3BfbWF0Y2hfbnVsbF9zdHJpbmdfcCAqLworCisKKy8qIFJldHVybiB6ZXJvIGlmIFRSQU5TTEFURVtTMV0gYW5kIFRSQU5TTEFURVtTMl0gYXJlIGlkZW50aWNhbCBmb3IgTEVOCisgICBieXRlczsgbm9uemVybyBvdGhlcndpc2UuICAqLworCitzdGF0aWMgaW50CitiY21wX3RyYW5zbGF0ZSAoczEsIHMyLCBsZW4sIHRyYW5zbGF0ZSkKKyAgICAgY29uc3QgY2hhciAqczEsICpzMjsKKyAgICAgcmVnaXN0ZXIgaW50IGxlbjsKKyAgICAgUkVfVFJBTlNMQVRFX1RZUEUgdHJhbnNsYXRlOworeworICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpwMSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHMxOworICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpwMiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHMyOworICB3aGlsZSAobGVuKQorICAgIHsKKyAgICAgIGlmICh0cmFuc2xhdGVbKnAxKytdICE9IHRyYW5zbGF0ZVsqcDIrK10pIHJldHVybiAxOworICAgICAgbGVuLS07CisgICAgfQorICByZXR1cm4gMDsKK30KKwwKKy8qIEVudHJ5IHBvaW50cyBmb3IgR05VIGNvZGUuICAqLworCisvKiByZV9jb21waWxlX3BhdHRlcm4gaXMgdGhlIEdOVSByZWd1bGFyIGV4cHJlc3Npb24gY29tcGlsZXI6IGl0CisgICBjb21waWxlcyBQQVRURVJOIChvZiBsZW5ndGggU0laRSkgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbiBCVUZQLgorICAgUmV0dXJucyAwIGlmIHRoZSBwYXR0ZXJuIHdhcyB2YWxpZCwgb3RoZXJ3aXNlIGFuIGVycm9yIHN0cmluZy4KKworICAgQXNzdW1lcyB0aGUgYGFsbG9jYXRlZCcgKGFuZCBwZXJoYXBzIGBidWZmZXInKSBhbmQgYHRyYW5zbGF0ZScgZmllbGRzCisgICBhcmUgc2V0IGluIEJVRlAgb24gZW50cnkuCisKKyAgIFdlIGNhbGwgcmVnZXhfY29tcGlsZSB0byBkbyB0aGUgYWN0dWFsIGNvbXBpbGF0aW9uLiAgKi8KKworY29uc3QgY2hhciAqCityZV9jb21waWxlX3BhdHRlcm4gKHBhdHRlcm4sIGxlbmd0aCwgYnVmcCkKKyAgICAgY29uc3QgY2hhciAqcGF0dGVybjsKKyAgICAgc2l6ZV90IGxlbmd0aDsKKyAgICAgc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyICpidWZwOworeworICByZWdfZXJyY29kZV90IHJldDsKKworICAvKiBHTlUgY29kZSBpcyB3cml0dGVuIHRvIGFzc3VtZSBhdCBsZWFzdCBSRV9OUkVHUyByZWdpc3RlcnMgd2lsbCBiZSBzZXQKKyAgICAgKGFuZCBhdCBsZWFzdCBvbmUgZXh0cmEgd2lsbCBiZSAtMSkuICAqLworICBidWZwLT5yZWdzX2FsbG9jYXRlZCA9IFJFR1NfVU5BTExPQ0FURUQ7CisKKyAgLyogQW5kIEdOVSBjb2RlIGRldGVybWluZXMgd2hldGhlciBvciBub3QgdG8gZ2V0IHJlZ2lzdGVyIGluZm9ybWF0aW9uCisgICAgIGJ5IHBhc3NpbmcgbnVsbCBmb3IgdGhlIFJFR1MgYXJndW1lbnQgdG8gcmVfbWF0Y2gsIGV0Yy4sIG5vdCBieQorICAgICBzZXR0aW5nIG5vX3N1Yi4gICovCisgIGJ1ZnAtPm5vX3N1YiA9IDA7CisKKyAgLyogTWF0Y2ggYW5jaG9ycyBhdCBuZXdsaW5lLiAgKi8KKyAgYnVmcC0+bmV3bGluZV9hbmNob3IgPSAxOworCisgIHJldCA9IHJlZ2V4X2NvbXBpbGUgKHBhdHRlcm4sIGxlbmd0aCwgcmVfc3ludGF4X29wdGlvbnMsIGJ1ZnApOworCisgIGlmICghcmV0KQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gZ2V0dGV4dCAocmVfZXJyb3JfbXNnaWRbKGludCkgcmV0XSk7Cit9CisjaWZkZWYgX0xJQkMKK3dlYWtfYWxpYXMgKF9fcmVfY29tcGlsZV9wYXR0ZXJuLCByZV9jb21waWxlX3BhdHRlcm4pCisjZW5kaWYKKwwKKy8qIEVudHJ5IHBvaW50cyBjb21wYXRpYmxlIHdpdGggNC4yIEJTRCByZWdleCBsaWJyYXJ5LiAgV2UgZG9uJ3QgZGVmaW5lCisgICB0aGVtIHVubGVzcyBzcGVjaWZpY2FsbHkgcmVxdWVzdGVkLiAgKi8KKworI2lmIGRlZmluZWQgX1JFR0VYX1JFX0NPTVAgfHwgZGVmaW5lZCBfTElCQworCisvKiBCU0QgaGFzIG9uZSBhbmQgb25seSBvbmUgcGF0dGVybiBidWZmZXIuICAqLworc3RhdGljIHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciByZV9jb21wX2J1ZjsKKworY2hhciAqCisjaWZkZWYgX0xJQkMKKy8qIE1ha2UgdGhlc2UgZGVmaW5pdGlvbnMgd2VhayBpbiBsaWJjLCBzbyBQT1NJWCBwcm9ncmFtcyBjYW4gcmVkZWZpbmUKKyAgIHRoZXNlIG5hbWVzIGlmIHRoZXkgZG9uJ3QgdXNlIG91ciBmdW5jdGlvbnMsIGFuZCBzdGlsbCB1c2UKKyAgIHJlZ2NvbXAvcmVnZXhlYyBiZWxvdyB3aXRob3V0IGxpbmsgZXJyb3JzLiAgKi8KK3dlYWtfZnVuY3Rpb24KKyNlbmRpZgorcmVfY29tcCAocykKKyAgICBjb25zdCBjaGFyICpzOworeworICByZWdfZXJyY29kZV90IHJldDsKKworICBpZiAoIXMpCisgICAgeworICAgICAgaWYgKCFyZV9jb21wX2J1Zi5idWZmZXIpCisJcmV0dXJuIGdldHRleHQgKCJObyBwcmV2aW91cyByZWd1bGFyIGV4cHJlc3Npb24iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoIXJlX2NvbXBfYnVmLmJ1ZmZlcikKKyAgICB7CisgICAgICByZV9jb21wX2J1Zi5idWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MgKDIwMCk7CisgICAgICBpZiAocmVfY29tcF9idWYuYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiAoY2hhciAqKSBnZXR0ZXh0IChyZV9lcnJvcl9tc2dpZFsoaW50KSBSRUdfRVNQQUNFXSk7CisgICAgICByZV9jb21wX2J1Zi5hbGxvY2F0ZWQgPSAyMDA7CisKKyAgICAgIHJlX2NvbXBfYnVmLmZhc3RtYXAgPSAoY2hhciAqKSBtYWxsb2MgKDEgPDwgQllURVdJRFRIKTsKKyAgICAgIGlmIChyZV9jb21wX2J1Zi5mYXN0bWFwID09IE5VTEwpCisJcmV0dXJuIChjaGFyICopIGdldHRleHQgKHJlX2Vycm9yX21zZ2lkWyhpbnQpIFJFR19FU1BBQ0VdKTsKKyAgICB9CisKKyAgLyogU2luY2UgYHJlX2V4ZWMnIGFsd2F5cyBwYXNzZXMgTlVMTCBmb3IgdGhlIGByZWdzJyBhcmd1bWVudCwgd2UKKyAgICAgZG9uJ3QgbmVlZCB0byBpbml0aWFsaXplIHRoZSBwYXR0ZXJuIGJ1ZmZlciBmaWVsZHMgd2hpY2ggYWZmZWN0IGl0LiAgKi8KKworICAvKiBNYXRjaCBhbmNob3JzIGF0IG5ld2xpbmVzLiAgKi8KKyAgcmVfY29tcF9idWYubmV3bGluZV9hbmNob3IgPSAxOworCisgIHJldCA9IHJlZ2V4X2NvbXBpbGUgKHMsIHN0cmxlbiAocyksIHJlX3N5bnRheF9vcHRpb25zLCAmcmVfY29tcF9idWYpOworCisgIGlmICghcmV0KQorICAgIHJldHVybiBOVUxMOworCisgIC8qIFllcywgd2UncmUgZGlzY2FyZGluZyBgY29uc3QnIGhlcmUgaWYgIUhBVkVfTElCSU5UTC4gICovCisgIHJldHVybiAoY2hhciAqKSBnZXR0ZXh0IChyZV9lcnJvcl9tc2dpZFsoaW50KSByZXRdKTsKK30KKworCitpbnQKKyNpZmRlZiBfTElCQword2Vha19mdW5jdGlvbgorI2VuZGlmCityZV9leGVjIChzKQorICAgIGNvbnN0IGNoYXIgKnM7Cit7CisgIGNvbnN0IGludCBsZW4gPSBzdHJsZW4gKHMpOworICByZXR1cm4KKyAgICAwIDw9IHJlX3NlYXJjaCAoJnJlX2NvbXBfYnVmLCBzLCBsZW4sIDAsIGxlbiwgKHN0cnVjdCByZV9yZWdpc3RlcnMgKikgMCk7Cit9CisKKyNlbmRpZiAvKiBfUkVHRVhfUkVfQ09NUCAqLworDAorLyogUE9TSVguMiBmdW5jdGlvbnMuICBEb24ndCBkZWZpbmUgdGhlc2UgZm9yIEVtYWNzLiAgKi8KKworI2lmbmRlZiBlbWFjcworCisvKiByZWdjb21wIHRha2VzIGEgcmVndWxhciBleHByZXNzaW9uIGFzIGEgc3RyaW5nIGFuZCBjb21waWxlcyBpdC4KKworICAgUFJFRyBpcyBhIHJlZ2V4X3QgKi4gIFdlIGRvIG5vdCBleHBlY3QgYW55IGZpZWxkcyB0byBiZSBpbml0aWFsaXplZCwKKyAgIHNpbmNlIFBPU0lYIHNheXMgd2Ugc2hvdWxkbid0LiAgVGh1cywgd2Ugc2V0CisKKyAgICAgYGJ1ZmZlcicgdG8gdGhlIGNvbXBpbGVkIHBhdHRlcm47CisgICAgIGB1c2VkJyB0byB0aGUgbGVuZ3RoIG9mIHRoZSBjb21waWxlZCBwYXR0ZXJuOworICAgICBgc3ludGF4JyB0byBSRV9TWU5UQVhfUE9TSVhfRVhURU5ERUQgaWYgdGhlCisgICAgICAgUkVHX0VYVEVOREVEIGJpdCBpbiBDRkxBR1MgaXMgc2V0OyBvdGhlcndpc2UsIHRvCisgICAgICAgUkVfU1lOVEFYX1BPU0lYX0JBU0lDOworICAgICBgbmV3bGluZV9hbmNob3InIHRvIFJFR19ORVdMSU5FIGJlaW5nIHNldCBpbiBDRkxBR1M7CisgICAgIGBmYXN0bWFwJyBhbmQgYGZhc3RtYXBfYWNjdXJhdGUnIHRvIHplcm87CisgICAgIGByZV9uc3ViJyB0byB0aGUgbnVtYmVyIG9mIHN1YmV4cHJlc3Npb25zIGluIFBBVFRFUk4uCisKKyAgIFBBVFRFUk4gaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHBhdHRlcm4gc3RyaW5nLgorCisgICBDRkxBR1MgaXMgYSBzZXJpZXMgb2YgYml0cyB3aGljaCBhZmZlY3QgY29tcGlsYXRpb24uCisKKyAgICAgSWYgUkVHX0VYVEVOREVEIGlzIHNldCwgd2UgdXNlIFBPU0lYIGV4dGVuZGVkIHN5bnRheDsgb3RoZXJ3aXNlLCB3ZQorICAgICB1c2UgUE9TSVggYmFzaWMgc3ludGF4LgorCisgICAgIElmIFJFR19ORVdMSU5FIGlzIHNldCwgdGhlbiAuIGFuZCBbXi4uLl0gZG9uJ3QgbWF0Y2ggbmV3bGluZS4KKyAgICAgQWxzbywgcmVnZXhlYyB3aWxsIHRyeSBhIG1hdGNoIGJlZ2lubmluZyBhZnRlciBldmVyeSBuZXdsaW5lLgorCisgICAgIElmIFJFR19JQ0FTRSBpcyBzZXQsIHRoZW4gd2UgY29uc2lkZXJzIHVwcGVyLSBhbmQgbG93ZXJjYXNlCisgICAgIHZlcnNpb25zIG9mIGxldHRlcnMgdG8gYmUgZXF1aXZhbGVudCB3aGVuIG1hdGNoaW5nLgorCisgICAgIElmIFJFR19OT1NVQiBpcyBzZXQsIHRoZW4gd2hlbiBQUkVHIGlzIHBhc3NlZCB0byByZWdleGVjLCB0aGF0CisgICAgIHJvdXRpbmUgd2lsbCByZXBvcnQgb25seSBzdWNjZXNzIG9yIGZhaWx1cmUsIGFuZCBub3RoaW5nIGFib3V0IHRoZQorICAgICByZWdpc3RlcnMuCisKKyAgIEl0IHJldHVybnMgMCBpZiBpdCBzdWNjZWVkcywgbm9uemVybyBpZiBpdCBkb2Vzbid0LiAgKFNlZSBnbnUtcmVnZXguaCBmb3IKKyAgIHRoZSByZXR1cm4gY29kZXMgYW5kIHRoZWlyIG1lYW5pbmdzLikgICovCisKK2ludAorcmVnY29tcCAocHJlZywgcGF0dGVybiwgY2ZsYWdzKQorICAgIHJlZ2V4X3QgKnByZWc7CisgICAgY29uc3QgY2hhciAqcGF0dGVybjsKKyAgICBpbnQgY2ZsYWdzOworeworICByZWdfZXJyY29kZV90IHJldDsKKyAgcmVnX3N5bnRheF90IHN5bnRheAorICAgID0gKGNmbGFncyAmIFJFR19FWFRFTkRFRCkgPworICAgICAgUkVfU1lOVEFYX1BPU0lYX0VYVEVOREVEIDogUkVfU1lOVEFYX1BPU0lYX0JBU0lDOworCisgIC8qIHJlZ2V4X2NvbXBpbGUgd2lsbCBhbGxvY2F0ZSB0aGUgc3BhY2UgZm9yIHRoZSBjb21waWxlZCBwYXR0ZXJuLiAgKi8KKyAgcHJlZy0+YnVmZmVyID0gMDsKKyAgcHJlZy0+YWxsb2NhdGVkID0gMDsKKyAgcHJlZy0+dXNlZCA9IDA7CisKKyAgLyogRG9uJ3QgYm90aGVyIHRvIHVzZSBhIGZhc3RtYXAgd2hlbiBzZWFyY2hpbmcuICBUaGlzIHNpbXBsaWZpZXMgdGhlCisgICAgIFJFR19ORVdMSU5FIGNhc2U6IGlmIHdlIHVzZWQgYSBmYXN0bWFwLCB3ZSdkIGhhdmUgdG8gcHV0IGFsbCB0aGUKKyAgICAgY2hhcmFjdGVycyBhZnRlciBuZXdsaW5lcyBpbnRvIHRoZSBmYXN0bWFwLiAgVGhpcyB3YXksIHdlIGp1c3QgdHJ5CisgICAgIGV2ZXJ5IGNoYXJhY3Rlci4gICovCisgIHByZWctPmZhc3RtYXAgPSAwOworCisgIGlmIChjZmxhZ3MgJiBSRUdfSUNBU0UpCisgICAgeworICAgICAgdW5zaWduZWQgaTsKKworICAgICAgcHJlZy0+dHJhbnNsYXRlCisJPSAoUkVfVFJBTlNMQVRFX1RZUEUpIG1hbGxvYyAoQ0hBUl9TRVRfU0laRQorCQkJCSAgICAgICogc2l6ZW9mICgqKFJFX1RSQU5TTEFURV9UWVBFKTApKTsKKyAgICAgIGlmIChwcmVnLT50cmFuc2xhdGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChpbnQpIFJFR19FU1BBQ0U7CisKKyAgICAgIC8qIE1hcCB1cHBlcmNhc2UgY2hhcmFjdGVycyB0byBjb3JyZXNwb25kaW5nIGxvd2VyY2FzZSBvbmVzLiAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBDSEFSX1NFVF9TSVpFOyBpKyspCisgICAgICAgIHByZWctPnRyYW5zbGF0ZVtpXSA9IElTVVBQRVIgKGkpID8gdG9sb3dlciAoaSkgOiBpOworICAgIH0KKyAgZWxzZQorICAgIHByZWctPnRyYW5zbGF0ZSA9IE5VTEw7CisKKyAgLyogSWYgUkVHX05FV0xJTkUgaXMgc2V0LCBuZXdsaW5lcyBhcmUgdHJlYXRlZCBkaWZmZXJlbnRseS4gICovCisgIGlmIChjZmxhZ3MgJiBSRUdfTkVXTElORSkKKyAgICB7IC8qIFJFR19ORVdMSU5FIGltcGxpZXMgbmVpdGhlciAuIG5vciBbXi4uLl0gbWF0Y2ggbmV3bGluZS4gICovCisgICAgICBzeW50YXggJj0gflJFX0RPVF9ORVdMSU5FOworICAgICAgc3ludGF4IHw9IFJFX0hBVF9MSVNUU19OT1RfTkVXTElORTsKKyAgICAgIC8qIEl0IGFsc28gY2hhbmdlcyB0aGUgbWF0Y2hpbmcgYmVoYXZpb3IuICAqLworICAgICAgcHJlZy0+bmV3bGluZV9hbmNob3IgPSAxOworICAgIH0KKyAgZWxzZQorICAgIHByZWctPm5ld2xpbmVfYW5jaG9yID0gMDsKKworICBwcmVnLT5ub19zdWIgPSAhIShjZmxhZ3MgJiBSRUdfTk9TVUIpOworCisgIC8qIFBPU0lYIHNheXMgYSBudWxsIGNoYXJhY3RlciBpbiB0aGUgcGF0dGVybiB0ZXJtaW5hdGVzIGl0LCBzbyB3ZQorICAgICBjYW4gdXNlIHN0cmxlbiBoZXJlIGluIGNvbXBpbGluZyB0aGUgcGF0dGVybi4gICovCisgIHJldCA9IHJlZ2V4X2NvbXBpbGUgKHBhdHRlcm4sIHN0cmxlbiAocGF0dGVybiksIHN5bnRheCwgcHJlZyk7CisKKyAgLyogUE9TSVggZG9lc24ndCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGFuIHVubWF0Y2hlZCBvcGVuLWdyb3VwIGFuZCBhbgorICAgICB1bm1hdGNoZWQgY2xvc2UtZ3JvdXA6IGJvdGggYXJlIFJFR19FUEFSRU4uICAqLworICBpZiAocmV0ID09IFJFR19FUlBBUkVOKSByZXQgPSBSRUdfRVBBUkVOOworCisgIHJldHVybiAoaW50KSByZXQ7Cit9CisjaWZkZWYgX0xJQkMKK3dlYWtfYWxpYXMgKF9fcmVnY29tcCwgcmVnY29tcCkKKyNlbmRpZgorCisKKy8qIHJlZ2V4ZWMgc2VhcmNoZXMgZm9yIGEgZ2l2ZW4gcGF0dGVybiwgc3BlY2lmaWVkIGJ5IFBSRUcsIGluIHRoZQorICAgc3RyaW5nIFNUUklORy4KKworICAgSWYgTk1BVENIIGlzIHplcm8gb3IgUkVHX05PU1VCIHdhcyBzZXQgaW4gdGhlIGNmbGFncyBhcmd1bWVudCB0bworICAgYHJlZ2NvbXAnLCB3ZSBpZ25vcmUgUE1BVENILiAgT3RoZXJ3aXNlLCB3ZSBhc3N1bWUgUE1BVENIIGhhcyBhdAorICAgbGVhc3QgTk1BVENIIGVsZW1lbnRzLCBhbmQgd2Ugc2V0IHRoZW0gdG8gdGhlIG9mZnNldHMgb2YgdGhlCisgICBjb3JyZXNwb25kaW5nIG1hdGNoZWQgc3Vic3RyaW5ncy4KKworICAgRUZMQUdTIHNwZWNpZmllcyBgZXhlY3V0aW9uIGZsYWdzJyB3aGljaCBhZmZlY3QgbWF0Y2hpbmc6IGlmCisgICBSRUdfTk9UQk9MIGlzIHNldCwgdGhlbiBeIGRvZXMgbm90IG1hdGNoIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICBzdHJpbmc7IGlmIFJFR19OT1RFT0wgaXMgc2V0LCB0aGVuICQgZG9lcyBub3QgbWF0Y2ggYXQgdGhlIGVuZC4KKworICAgV2UgcmV0dXJuIDAgaWYgd2UgZmluZCBhIG1hdGNoIGFuZCBSRUdfTk9NQVRDSCBpZiBub3QuICAqLworCitpbnQKK3JlZ2V4ZWMgKHByZWcsIHN0cmluZywgbm1hdGNoLCBwbWF0Y2gsIGVmbGFncykKKyAgICBjb25zdCByZWdleF90ICpwcmVnOworICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKKyAgICBzaXplX3Qgbm1hdGNoOworICAgIHJlZ21hdGNoX3QgcG1hdGNoW107CisgICAgaW50IGVmbGFnczsKK3sKKyAgaW50IHJldDsKKyAgc3RydWN0IHJlX3JlZ2lzdGVycyByZWdzOworICByZWdleF90IHByaXZhdGVfcHJlZzsKKyAgaW50IGxlbiA9IHN0cmxlbiAoc3RyaW5nKTsKKyAgYm9vbGVhbiB3YW50X3JlZ19pbmZvID0gIXByZWctPm5vX3N1YiAmJiBubWF0Y2ggPiAwOworCisgIHByaXZhdGVfcHJlZyA9ICpwcmVnOworCisgIHByaXZhdGVfcHJlZy5ub3RfYm9sID0gISEoZWZsYWdzICYgUkVHX05PVEJPTCk7CisgIHByaXZhdGVfcHJlZy5ub3RfZW9sID0gISEoZWZsYWdzICYgUkVHX05PVEVPTCk7CisKKyAgLyogVGhlIHVzZXIgaGFzIHRvbGQgdXMgZXhhY3RseSBob3cgbWFueSByZWdpc3RlcnMgdG8gcmV0dXJuCisgICAgIGluZm9ybWF0aW9uIGFib3V0LCB2aWEgYG5tYXRjaCcuICBXZSBoYXZlIHRvIHBhc3MgdGhhdCBvbiB0byB0aGUKKyAgICAgbWF0Y2hpbmcgcm91dGluZXMuICAqLworICBwcml2YXRlX3ByZWcucmVnc19hbGxvY2F0ZWQgPSBSRUdTX0ZJWEVEOworCisgIGlmICh3YW50X3JlZ19pbmZvKQorICAgIHsKKyAgICAgIHJlZ3MubnVtX3JlZ3MgPSBubWF0Y2g7CisgICAgICByZWdzLnN0YXJ0ID0gVEFMTE9DIChubWF0Y2gsIHJlZ29mZl90KTsKKyAgICAgIHJlZ3MuZW5kID0gVEFMTE9DIChubWF0Y2gsIHJlZ29mZl90KTsKKyAgICAgIGlmIChyZWdzLnN0YXJ0ID09IE5VTEwgfHwgcmVncy5lbmQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChpbnQpIFJFR19OT01BVENIOworICAgIH0KKworICAvKiBQZXJmb3JtIHRoZSBzZWFyY2hpbmcgb3BlcmF0aW9uLiAgKi8KKyAgcmV0ID0gcmVfc2VhcmNoICgmcHJpdmF0ZV9wcmVnLCBzdHJpbmcsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAvKiBzdGFydDogKi8gMCwgLyogcmFuZ2U6ICovIGxlbiwKKyAgICAgICAgICAgICAgICAgICB3YW50X3JlZ19pbmZvID8gJnJlZ3MgOiAoc3RydWN0IHJlX3JlZ2lzdGVycyAqKSAwKTsKKworICAvKiBDb3B5IHRoZSByZWdpc3RlciBpbmZvcm1hdGlvbiB0byB0aGUgUE9TSVggc3RydWN0dXJlLiAgKi8KKyAgaWYgKHdhbnRfcmVnX2luZm8pCisgICAgeworICAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgdW5zaWduZWQgcjsKKworICAgICAgICAgIGZvciAociA9IDA7IHIgPCBubWF0Y2g7IHIrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcG1hdGNoW3JdLnJtX3NvID0gcmVncy5zdGFydFtyXTsKKyAgICAgICAgICAgICAgcG1hdGNoW3JdLnJtX2VvID0gcmVncy5lbmRbcl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogSWYgd2UgbmVlZGVkIHRoZSB0ZW1wb3JhcnkgcmVnaXN0ZXIgaW5mbywgZnJlZSB0aGUgc3BhY2Ugbm93LiAgKi8KKyAgICAgIGZyZWUgKHJlZ3Muc3RhcnQpOworICAgICAgZnJlZSAocmVncy5lbmQpOworICAgIH0KKworICAvKiBXZSB3YW50IHplcm8gcmV0dXJuIHRvIG1lYW4gc3VjY2VzcywgdW5saWtlIGByZV9zZWFyY2gnLiAgKi8KKyAgcmV0dXJuIHJldCA+PSAwID8gKGludCkgUkVHX05PRVJST1IgOiAoaW50KSBSRUdfTk9NQVRDSDsKK30KKyNpZmRlZiBfTElCQword2Vha19hbGlhcyAoX19yZWdleGVjLCByZWdleGVjKQorI2VuZGlmCisKKworLyogUmV0dXJucyBhIG1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byBhbiBlcnJvciBjb2RlLCBFUlJDT0RFLCByZXR1cm5lZAorICAgZnJvbSBlaXRoZXIgcmVnY29tcCBvciByZWdleGVjLiAgIFdlIGRvbid0IHVzZSBQUkVHIGhlcmUuICAqLworCitzaXplX3QKK19fcmVnZXJyb3IgKGVycmNvZGUsIHByZWcsIGVycmJ1ZiwgZXJyYnVmX3NpemUpCisgICAgaW50IGVycmNvZGU7CisgICAgY29uc3QgcmVnZXhfdCAqcHJlZzsKKyAgICBjaGFyICplcnJidWY7CisgICAgc2l6ZV90IGVycmJ1Zl9zaXplOworeworICBjb25zdCBjaGFyICptc2c7CisgIHNpemVfdCBtc2dfc2l6ZTsKKworICBpZiAoZXJyY29kZSA8IDAKKyAgICAgIHx8IGVycmNvZGUgPj0gKGludCkgKHNpemVvZiAocmVfZXJyb3JfbXNnaWQpCisJCQkgICAvIHNpemVvZiAocmVfZXJyb3JfbXNnaWRbMF0pKSkKKyAgICAvKiBPbmx5IGVycm9yIGNvZGVzIHJldHVybmVkIGJ5IHRoZSByZXN0IG9mIHRoZSBjb2RlIHNob3VsZCBiZSBwYXNzZWQKKyAgICAgICB0byB0aGlzIHJvdXRpbmUuICBJZiB3ZSBhcmUgZ2l2ZW4gYW55dGhpbmcgZWxzZSwgb3IgaWYgb3RoZXIgcmVnZXgKKyAgICAgICBjb2RlIGdlbmVyYXRlcyBhbiBpbnZhbGlkIGVycm9yIGNvZGUsIHRoZW4gdGhlIHByb2dyYW0gaGFzIGEgYnVnLgorICAgICAgIER1bXAgY29yZSBzbyB3ZSBjYW4gZml4IGl0LiAgKi8KKyAgICBhYm9ydCAoKTsKKworICBtc2cgPSBnZXR0ZXh0IChyZV9lcnJvcl9tc2dpZFtlcnJjb2RlXSk7CisKKyAgbXNnX3NpemUgPSBzdHJsZW4gKG1zZykgKyAxOyAvKiBJbmNsdWRlcyB0aGUgbnVsbC4gICovCisKKyAgaWYgKGVycmJ1Zl9zaXplICE9IDApCisgICAgeworICAgICAgaWYgKG1zZ19zaXplID4gZXJyYnVmX3NpemUpCisgICAgICAgIHsKKyNpZiBkZWZpbmVkIEhBVkVfTUVNUENQWSB8fCBkZWZpbmVkIF9MSUJDCisJICAqKChjaGFyICopIF9fbWVtcGNweSAoZXJyYnVmLCBtc2csIGVycmJ1Zl9zaXplIC0gMSkpID0gJ1wwJzsKKyNlbHNlCisgICAgICAgICAgbWVtY3B5IChlcnJidWYsIG1zZywgZXJyYnVmX3NpemUgLSAxKTsKKyAgICAgICAgICBlcnJidWZbZXJyYnVmX3NpemUgLSAxXSA9IDA7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBtZW1jcHkgKGVycmJ1ZiwgbXNnLCBtc2dfc2l6ZSk7CisgICAgfQorCisgIHJldHVybiBtc2dfc2l6ZTsKK30KKyNpZmRlZiBfTElCQword2Vha19hbGlhcyAoX19yZWdlcnJvciwgcmVnZXJyb3IpCisjZW5kaWYKKworCisvKiBGcmVlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzcGFjZSB1c2VkIGJ5IFBSRUcuICAqLworCit2b2lkCityZWdmcmVlIChwcmVnKQorICAgIHJlZ2V4X3QgKnByZWc7Cit7CisgIGlmIChwcmVnLT5idWZmZXIgIT0gTlVMTCkKKyAgICBmcmVlIChwcmVnLT5idWZmZXIpOworICBwcmVnLT5idWZmZXIgPSBOVUxMOworCisgIHByZWctPmFsbG9jYXRlZCA9IDA7CisgIHByZWctPnVzZWQgPSAwOworCisgIGlmIChwcmVnLT5mYXN0bWFwICE9IE5VTEwpCisgICAgZnJlZSAocHJlZy0+ZmFzdG1hcCk7CisgIHByZWctPmZhc3RtYXAgPSBOVUxMOworICBwcmVnLT5mYXN0bWFwX2FjY3VyYXRlID0gMDsKKworICBpZiAocHJlZy0+dHJhbnNsYXRlICE9IE5VTEwpCisgICAgZnJlZSAocHJlZy0+dHJhbnNsYXRlKTsKKyAgcHJlZy0+dHJhbnNsYXRlID0gTlVMTDsKK30KKyNpZmRlZiBfTElCQword2Vha19hbGlhcyAoX19yZWdmcmVlLCByZWdmcmVlKQorI2VuZGlmCisKKyNlbmRpZiAvKiBub3QgZW1hY3MgICovCmRpZmYgLS1naXQgYS9nZGIvZ251LXJlZ2V4LmggYi9nZGIvZ251LXJlZ2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE1M2VhMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9nbnUtcmVnZXguaApAQCAtMCwwICsxLDU3NiBAQAorLyogRGVmaW5pdGlvbnMgZm9yIGRhdGEgc3RydWN0dXJlcyBhbmQgcm91dGluZXMgZm9yIHRoZSByZWd1bGFyCisgICBleHByZXNzaW9uIGxpYnJhcnksIHZlcnNpb24gMC4xMi4KKyAgIENvcHlyaWdodCAoQykgMTk4NSw4OSw5MCw5MSw5Miw5Myw5NSw5Niw5Nyw5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgCisgICBHTlUgQyBMaWJyYXJ5LiAgQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQHByZXAuYWkubWl0LmVkdS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICAgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgX1JFR0VYX0gKKyNkZWZpbmUgX1JFR0VYX0ggMQorCisvKiBBbGxvdyB0aGUgdXNlIGluIEMrKyBjb2RlLiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogUE9TSVggc2F5cyB0aGF0IDxzeXMvdHlwZXMuaD4gbXVzdCBiZSBpbmNsdWRlZCAoYnkgdGhlIGNhbGxlcikgYmVmb3JlCisgICA8cmVnZXguaD4uICAqLworCisjaWYgIWRlZmluZWQgX1BPU0lYX0NfU09VUkNFICYmICFkZWZpbmVkIF9QT1NJWF9TT1VSQ0UgJiYgZGVmaW5lZCBWTVMKKy8qIFZNUyBkb2Vzbid0IGhhdmUgYHNpemVfdCcgaW4gPHN5cy90eXBlcy5oPiwgZXZlbiB0aG91Z2ggUE9TSVggc2F5cyBpdAorICAgc2hvdWxkIGJlIHRoZXJlLiAgKi8KKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKKworLyogR0RCIExPQ0FMOiBkZWZpbmUgX1JFR0VYX1JFX0NPTVAgdG8gZ2V0IEJTRCBzdHlsZSByZV9jb21wIGFuZCByZV9leGVjICovCisjaWZuZGVmIF9SRUdFWF9SRV9DT01QCisjZGVmaW5lIF9SRUdFWF9SRV9DT01QCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyB0d28gdHlwZXMgaGF2ZSB0byBiZSBzaWduZWQgYW5kIHVuc2lnbmVkIGludGVnZXIgdHlwZQorICAgd2lkZSBlbm91Z2ggdG8gaG9sZCBhIHZhbHVlIG9mIGEgcG9pbnRlci4gIEZvciBtb3N0IEFOU0kgY29tcGlsZXJzCisgICBwdHJkaWZmX3QgYW5kIHNpemVfdCBzaG91bGQgYmUgbGlrZWx5IE9LLiAgU3RpbGwgc2l6ZSBvZiB0aGVzZSB0d28KKyAgIHR5cGVzIGlzIDIgZm9yIE1pY3Jvc29mdCBDLiAgVWdoLi4uICovCit0eXBlZGVmIGxvbmcgaW50IHNfcmVnX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IGFjdGl2ZV9yZWdfdDsKKworLyogVGhlIGZvbGxvd2luZyBiaXRzIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcmVnZXhwIHN5bnRheCB3ZQorICAgcmVjb2duaXplLiAgVGhlIHNldC9ub3Qtc2V0IG1lYW5pbmdzIGFyZSBjaG9zZW4gc28gdGhhdCBFbWFjcyBzeW50YXgKKyAgIHJlbWFpbnMgdGhlIHZhbHVlIDAuICBUaGUgYml0cyBhcmUgZ2l2ZW4gaW4gYWxwaGFiZXRpY2FsIG9yZGVyLCBhbmQKKyAgIHRoZSBkZWZpbml0aW9ucyBzaGlmdGVkIGJ5IG9uZSBmcm9tIHRoZSBwcmV2aW91cyBiaXQ7IHRodXMsIHdoZW4gd2UKKyAgIGFkZCBvciByZW1vdmUgYSBiaXQsIG9ubHkgb25lIG90aGVyIGRlZmluaXRpb24gbmVlZCBjaGFuZ2UuICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCByZWdfc3ludGF4X3Q7CisKKy8qIElmIHRoaXMgYml0IGlzIG5vdCBzZXQsIHRoZW4gXCBpbnNpZGUgYSBicmFja2V0IGV4cHJlc3Npb24gaXMgbGl0ZXJhbC4KKyAgIElmIHNldCwgdGhlbiBzdWNoIGEgXCBxdW90ZXMgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIuICAqLworI2RlZmluZSBSRV9CQUNLU0xBU0hfRVNDQVBFX0lOX0xJU1RTICgodW5zaWduZWQgbG9uZyBpbnQpIDEpCisKKy8qIElmIHRoaXMgYml0IGlzIG5vdCBzZXQsIHRoZW4gKyBhbmQgPyBhcmUgb3BlcmF0b3JzLCBhbmQgXCsgYW5kIFw/IGFyZQorICAgICBsaXRlcmFscy4KKyAgIElmIHNldCwgdGhlbiBcKyBhbmQgXD8gYXJlIG9wZXJhdG9ycyBhbmQgKyBhbmQgPyBhcmUgbGl0ZXJhbHMuICAqLworI2RlZmluZSBSRV9CS19QTFVTX1FNIChSRV9CQUNLU0xBU0hfRVNDQVBFX0lOX0xJU1RTIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiBjaGFyYWN0ZXIgY2xhc3NlcyBhcmUgc3VwcG9ydGVkLiAgVGhleSBhcmU6CisgICAgIFs6YWxwaGE6XSwgWzp1cHBlcjpdLCBbOmxvd2VyOl0sICBbOmRpZ2l0Ol0sIFs6YWxudW06XSwgWzp4ZGlnaXQ6XSwKKyAgICAgWzpzcGFjZTpdLCBbOnByaW50Ol0sIFs6cHVuY3Q6XSwgWzpncmFwaDpdLCBhbmQgWzpjbnRybDpdLgorICAgSWYgbm90IHNldCwgdGhlbiBjaGFyYWN0ZXIgY2xhc3NlcyBhcmUgbm90IHN1cHBvcnRlZC4gICovCisjZGVmaW5lIFJFX0NIQVJfQ0xBU1NFUyAoUkVfQktfUExVU19RTSA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gXiBhbmQgJCBhcmUgYWx3YXlzIGFuY2hvcnMgKG91dHNpZGUgYnJhY2tldAorICAgICBleHByZXNzaW9ucywgb2YgY291cnNlKS4KKyAgIElmIHRoaXMgYml0IGlzIG5vdCBzZXQsIHRoZW4gaXQgZGVwZW5kczoKKyAgICAgICAgXiAgaXMgYW4gYW5jaG9yIGlmIGl0IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSByZWd1bGFyCisgICAgICAgICAgIGV4cHJlc3Npb24gb3IgYWZ0ZXIgYW4gb3Blbi1ncm91cCBvciBhbiBhbHRlcm5hdGlvbiBvcGVyYXRvcjsKKyAgICAgICAgJCAgaXMgYW4gYW5jaG9yIGlmIGl0IGlzIGF0IHRoZSBlbmQgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24sIG9yCisgICAgICAgICAgIGJlZm9yZSBhIGNsb3NlLWdyb3VwIG9yIGFuIGFsdGVybmF0aW9uIG9wZXJhdG9yLgorCisgICBUaGlzIGJpdCBjb3VsZCBiZSAocmUpY29tYmluZWQgd2l0aCBSRV9DT05URVhUX0lOREVQX09QUywgYmVjYXVzZQorICAgUE9TSVggZHJhZnQgMTEuMiBzYXlzIHRoYXQgKiBldGMuIGluIGxlYWRpbmcgcG9zaXRpb25zIGlzIHVuZGVmaW5lZC4KKyAgIFdlIGFscmVhZHkgaW1wbGVtZW50ZWQgYSBwcmV2aW91cyBkcmFmdCB3aGljaCBtYWRlIHRob3NlIGNvbnN0cnVjdHMKKyAgIGludmFsaWQsIHRob3VnaCwgc28gd2UgaGF2ZW4ndCBjaGFuZ2VkIHRoZSBjb2RlIGJhY2suICAqLworI2RlZmluZSBSRV9DT05URVhUX0lOREVQX0FOQ0hPUlMgKFJFX0NIQVJfQ0xBU1NFUyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSBhbHdheXMgc3BlY2lhbAorICAgICByZWdhcmRsZXNzIG9mIHdoZXJlIHRoZXkgYXJlIGluIHRoZSBwYXR0ZXJuLgorICAgSWYgdGhpcyBiaXQgaXMgbm90IHNldCwgdGhlbiBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlIHNwZWNpYWwgb25seSBpbgorICAgICBzb21lIGNvbnRleHRzOyBvdGhlcndpc2UgdGhleSBhcmUgb3JkaW5hcnkuICBTcGVjaWZpY2FsbHksCisgICAgICogKyA/IGFuZCBpbnRlcnZhbHMgYXJlIG9ubHkgc3BlY2lhbCB3aGVuIG5vdCBhZnRlciB0aGUgYmVnaW5uaW5nLAorICAgICBvcGVuLWdyb3VwLCBvciBhbHRlcm5hdGlvbiBvcGVyYXRvci4gICovCisjZGVmaW5lIFJFX0NPTlRFWFRfSU5ERVBfT1BTIChSRV9DT05URVhUX0lOREVQX0FOQ0hPUlMgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuICosICssID8sIGFuZCB7IGNhbm5vdCBiZSBmaXJzdCBpbiBhbiByZSBvcgorICAgICBpbW1lZGlhdGVseSBhZnRlciBhbiBhbHRlcm5hdGlvbiBvciBiZWdpbi1ncm91cCBvcGVyYXRvci4gICovCisjZGVmaW5lIFJFX0NPTlRFWFRfSU5WQUxJRF9PUFMgKFJFX0NPTlRFWFRfSU5ERVBfT1BTIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiAuIG1hdGNoZXMgbmV3bGluZS4KKyAgIElmIG5vdCBzZXQsIHRoZW4gaXQgZG9lc24ndC4gICovCisjZGVmaW5lIFJFX0RPVF9ORVdMSU5FIChSRV9DT05URVhUX0lOVkFMSURfT1BTIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiAuIGRvZXNuJ3QgbWF0Y2ggTlVMLgorICAgSWYgbm90IHNldCwgdGhlbiBpdCBkb2VzLiAgKi8KKyNkZWZpbmUgUkVfRE9UX05PVF9OVUxMIChSRV9ET1RfTkVXTElORSA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIG5vbm1hdGNoaW5nIGxpc3RzIFteLi4uXSBkbyBub3QgbWF0Y2ggbmV3bGluZS4KKyAgIElmIG5vdCBzZXQsIHRoZXkgZG8uICAqLworI2RlZmluZSBSRV9IQVRfTElTVFNfTk9UX05FV0xJTkUgKFJFX0RPVF9OT1RfTlVMTCA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIGVpdGhlciBcey4uLlx9IG9yIHsuLi59IGRlZmluZXMgYW4KKyAgICAgaW50ZXJ2YWwsIGRlcGVuZGluZyBvbiBSRV9OT19CS19CUkFDRVMuCisgICBJZiBub3Qgc2V0LCBceywgXH0sIHssIGFuZCB9IGFyZSBsaXRlcmFscy4gICovCisjZGVmaW5lIFJFX0lOVEVSVkFMUyAoUkVfSEFUX0xJU1RTX05PVF9ORVdMSU5FIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgKywgPyBhbmQgfCBhcmVuJ3QgcmVjb2duaXplZCBhcyBvcGVyYXRvcnMuCisgICBJZiBub3Qgc2V0LCB0aGV5IGFyZS4gICovCisjZGVmaW5lIFJFX0xJTUlURURfT1BTIChSRV9JTlRFUlZBTFMgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCBuZXdsaW5lIGlzIGFuIGFsdGVybmF0aW9uIG9wZXJhdG9yLgorICAgSWYgbm90IHNldCwgbmV3bGluZSBpcyBsaXRlcmFsLiAgKi8KKyNkZWZpbmUgUkVfTkVXTElORV9BTFQgKFJFX0xJTUlURURfT1BTIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiBgey4uLn0nIGRlZmluZXMgYW4gaW50ZXJ2YWwsIGFuZCBceyBhbmQgXH0KKyAgICAgYXJlIGxpdGVyYWxzLgorICBJZiBub3Qgc2V0LCB0aGVuIGBcey4uLlx9JyBkZWZpbmVzIGFuIGludGVydmFsLiAgKi8KKyNkZWZpbmUgUkVfTk9fQktfQlJBQ0VTIChSRV9ORVdMSU5FX0FMVCA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsICguLi4pIGRlZmluZXMgYSBncm91cCwgYW5kIFwoIGFuZCBcKSBhcmUgbGl0ZXJhbHMuCisgICBJZiBub3Qgc2V0LCBcKC4uLlwpIGRlZmluZXMgYSBncm91cCwgYW5kICggYW5kICkgYXJlIGxpdGVyYWxzLiAgKi8KKyNkZWZpbmUgUkVfTk9fQktfUEFSRU5TIChSRV9OT19CS19CUkFDRVMgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIFw8ZGlnaXQ+IG1hdGNoZXMgPGRpZ2l0Pi4KKyAgIElmIG5vdCBzZXQsIHRoZW4gXDxkaWdpdD4gaXMgYSBiYWNrLXJlZmVyZW5jZS4gICovCisjZGVmaW5lIFJFX05PX0JLX1JFRlMgKFJFX05PX0JLX1BBUkVOUyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gfCBpcyBhbiBhbHRlcm5hdGlvbiBvcGVyYXRvciwgYW5kIFx8IGlzIGxpdGVyYWwuCisgICBJZiBub3Qgc2V0LCB0aGVuIFx8IGlzIGFuIGFsdGVybmF0aW9uIG9wZXJhdG9yLCBhbmQgfCBpcyBsaXRlcmFsLiAgKi8KKyNkZWZpbmUgUkVfTk9fQktfVkJBUiAoUkVfTk9fQktfUkVGUyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gYW4gZW5kaW5nIHJhbmdlIHBvaW50IGNvbGxhdGluZyBoaWdoZXIKKyAgICAgdGhhbiB0aGUgc3RhcnRpbmcgcmFuZ2UgcG9pbnQsIGFzIGluIFt6LWFdLCBpcyBpbnZhbGlkLgorICAgSWYgbm90IHNldCwgdGhlbiB3aGVuIGVuZGluZyByYW5nZSBwb2ludCBjb2xsYXRlcyBoaWdoZXIgdGhhbiB0aGUKKyAgICAgc3RhcnRpbmcgcmFuZ2UgcG9pbnQsIHRoZSByYW5nZSBpcyBpZ25vcmVkLiAgKi8KKyNkZWZpbmUgUkVfTk9fRU1QVFlfUkFOR0VTIChSRV9OT19CS19WQkFSIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiBhbiB1bm1hdGNoZWQgKSBpcyBvcmRpbmFyeS4KKyAgIElmIG5vdCBzZXQsIHRoZW4gYW4gdW5tYXRjaGVkICkgaXMgaW52YWxpZC4gICovCisjZGVmaW5lIFJFX1VOTUFUQ0hFRF9SSUdIVF9QQVJFTl9PUkQgKFJFX05PX0VNUFRZX1JBTkdFUyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHN1Y2NlZWQgYXMgc29vbiBhcyB3ZSBtYXRjaCB0aGUgd2hvbGUgcGF0dGVybiwKKyAgIHdpdGhvdXQgZnVydGhlciBiYWNrdHJhY2tpbmcuICAqLworI2RlZmluZSBSRV9OT19QT1NJWF9CQUNLVFJBQ0tJTkcgKFJFX1VOTUFUQ0hFRF9SSUdIVF9QQVJFTl9PUkQgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCBkbyBub3QgcHJvY2VzcyB0aGUgR05VIHJlZ2V4IG9wZXJhdG9ycy4KKyAgIElmIG5vdCBzZXQsIHRoZW4gdGhlIEdOVSByZWdleCBvcGVyYXRvcnMgYXJlIHJlY29nbml6ZWQuICovCisjZGVmaW5lIFJFX05PX0dOVV9PUFMgKFJFX05PX1BPU0lYX0JBQ0tUUkFDS0lORyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHR1cm4gb24gaW50ZXJuYWwgcmVnZXggZGVidWdnaW5nLgorICAgSWYgbm90IHNldCwgYW5kIGRlYnVnZ2luZyB3YXMgb24sIHR1cm4gaXQgb2ZmLgorICAgVGhpcyBvbmx5IHdvcmtzIGlmIHJlZ2V4LmMgaXMgY29tcGlsZWQgLURERUJVRy4KKyAgIFdlIGRlZmluZSB0aGlzIGJpdCBhbHdheXMsIHNvIHRoYXQgYWxsIHRoYXQncyBuZWVkZWQgdG8gdHVybiBvbgorICAgZGVidWdnaW5nIGlzIHRvIHJlY29tcGlsZSByZWdleC5jOyB0aGUgY2FsbGluZyBjb2RlIGNhbiBhbHdheXMgaGF2ZQorICAgdGhpcyBiaXQgc2V0LCBhbmQgaXQgd29uJ3QgYWZmZWN0IGFueXRoaW5nIGluIHRoZSBub3JtYWwgY2FzZS4gKi8KKyNkZWZpbmUgUkVfREVCVUcgKFJFX05PX0dOVV9PUFMgPDwgMSkKKworLyogVGhpcyBnbG9iYWwgdmFyaWFibGUgZGVmaW5lcyB0aGUgcGFydGljdWxhciByZWdleHAgc3ludGF4IHRvIHVzZSAoZm9yCisgICBzb21lIGludGVyZmFjZXMpLiAgV2hlbiBhIHJlZ2V4cCBpcyBjb21waWxlZCwgdGhlIHN5bnRheCB1c2VkIGlzCisgICBzdG9yZWQgaW4gdGhlIHBhdHRlcm4gYnVmZmVyLCBzbyBjaGFuZ2luZyB0aGlzIGRvZXMgbm90IGFmZmVjdAorICAgYWxyZWFkeS1jb21waWxlZCByZWdleHBzLiAgKi8KK2V4dGVybiByZWdfc3ludGF4X3QgcmVfc3ludGF4X29wdGlvbnM7CisMCisvKiBEZWZpbmUgY29tYmluYXRpb25zIG9mIHRoZSBhYm92ZSBiaXRzIGZvciB0aGUgc3RhbmRhcmQgcG9zc2liaWxpdGllcy4KKyAgIChUaGUgW1tbIGNvbW1lbnRzIGRlbGltaXQgd2hhdCBnZXRzIHB1dCBpbnRvIHRoZSBUZXhpbmZvIGZpbGUsIHNvCisgICBkb24ndCBkZWxldGUgdGhlbSEpICAqLworLyogW1tbYmVnaW4gc3ludGF4ZXNdXV0gKi8KKyNkZWZpbmUgUkVfU1lOVEFYX0VNQUNTIDAKKworI2RlZmluZSBSRV9TWU5UQVhfQVdLCQkJCQkJCVwKKyAgKFJFX0JBQ0tTTEFTSF9FU0NBUEVfSU5fTElTVFMgICB8IFJFX0RPVF9OT1RfTlVMTAkJCVwKKyAgIHwgUkVfTk9fQktfUEFSRU5TICAgICAgICAgICAgICB8IFJFX05PX0JLX1JFRlMJCQlcCisgICB8IFJFX05PX0JLX1ZCQVIgICAgICAgICAgICAgICAgfCBSRV9OT19FTVBUWV9SQU5HRVMJCQlcCisgICB8IFJFX0RPVF9ORVdMSU5FCQkgIHwgUkVfQ09OVEVYVF9JTkRFUF9BTkNIT1JTCQlcCisgICB8IFJFX1VOTUFUQ0hFRF9SSUdIVF9QQVJFTl9PUkQgfCBSRV9OT19HTlVfT1BTKQorCisjZGVmaW5lIFJFX1NZTlRBWF9HTlVfQVdLCQkJCQkJXAorICAoKFJFX1NZTlRBWF9QT1NJWF9FWFRFTkRFRCB8IFJFX0JBQ0tTTEFTSF9FU0NBUEVfSU5fTElTVFMgfCBSRV9ERUJVRykJXAorICAgJiB+KFJFX0RPVF9OT1RfTlVMTCB8IFJFX0lOVEVSVkFMUyB8IFJFX0NPTlRFWFRfSU5ERVBfT1BTKSkKKworI2RlZmluZSBSRV9TWU5UQVhfUE9TSVhfQVdLIAkJCQkJCVwKKyAgKFJFX1NZTlRBWF9QT1NJWF9FWFRFTkRFRCB8IFJFX0JBQ0tTTEFTSF9FU0NBUEVfSU5fTElTVFMJCVwKKyAgIHwgUkVfSU5URVJWQUxTCSAgICB8IFJFX05PX0dOVV9PUFMpCisKKyNkZWZpbmUgUkVfU1lOVEFYX0dSRVAJCQkJCQkJXAorICAoUkVfQktfUExVU19RTSAgICAgICAgICAgICAgfCBSRV9DSEFSX0NMQVNTRVMJCQkJXAorICAgfCBSRV9IQVRfTElTVFNfTk9UX05FV0xJTkUgfCBSRV9JTlRFUlZBTFMJCQkJXAorICAgfCBSRV9ORVdMSU5FX0FMVCkKKworI2RlZmluZSBSRV9TWU5UQVhfRUdSRVAJCQkJCQkJXAorICAoUkVfQ0hBUl9DTEFTU0VTICAgICAgICB8IFJFX0NPTlRFWFRfSU5ERVBfQU5DSE9SUwkJCVwKKyAgIHwgUkVfQ09OVEVYVF9JTkRFUF9PUFMgfCBSRV9IQVRfTElTVFNfTk9UX05FV0xJTkUJCQlcCisgICB8IFJFX05FV0xJTkVfQUxUICAgICAgIHwgUkVfTk9fQktfUEFSRU5TCQkJCVwKKyAgIHwgUkVfTk9fQktfVkJBUikKKworI2RlZmluZSBSRV9TWU5UQVhfUE9TSVhfRUdSRVAJCQkJCQlcCisgIChSRV9TWU5UQVhfRUdSRVAgfCBSRV9JTlRFUlZBTFMgfCBSRV9OT19CS19CUkFDRVMpCisKKy8qIFAxMDAzLjIvRDExLjIsIHNlY3Rpb24gNC4yMC43LjEsIGxpbmVzIDUwNzhmZi4gICovCisjZGVmaW5lIFJFX1NZTlRBWF9FRCBSRV9TWU5UQVhfUE9TSVhfQkFTSUMKKworI2RlZmluZSBSRV9TWU5UQVhfU0VEIFJFX1NZTlRBWF9QT1NJWF9CQVNJQworCisvKiBTeW50YXggYml0cyBjb21tb24gdG8gYm90aCBiYXNpYyBhbmQgZXh0ZW5kZWQgUE9TSVggcmVnZXggc3ludGF4LiAgKi8KKyNkZWZpbmUgX1JFX1NZTlRBWF9QT1NJWF9DT01NT04JCQkJCQlcCisgIChSRV9DSEFSX0NMQVNTRVMgfCBSRV9ET1RfTkVXTElORSAgICAgIHwgUkVfRE9UX05PVF9OVUxMCQlcCisgICB8IFJFX0lOVEVSVkFMUyAgfCBSRV9OT19FTVBUWV9SQU5HRVMpCisKKyNkZWZpbmUgUkVfU1lOVEFYX1BPU0lYX0JBU0lDCQkJCQkJXAorICAoX1JFX1NZTlRBWF9QT1NJWF9DT01NT04gfCBSRV9CS19QTFVTX1FNKQorCisvKiBEaWZmZXJzIGZyb20gLi4uX1BPU0lYX0JBU0lDIG9ubHkgaW4gdGhhdCBSRV9CS19QTFVTX1FNIGJlY29tZXMKKyAgIFJFX0xJTUlURURfT1BTLCBpLmUuLCBcPyBcKyBcfCBhcmUgbm90IHJlY29nbml6ZWQuICBBY3R1YWxseSwgdGhpcworICAgaXNuJ3QgbWluaW1hbCwgc2luY2Ugb3RoZXIgb3BlcmF0b3JzLCBzdWNoIGFzIFxgLCBhcmVuJ3QgZGlzYWJsZWQuICAqLworI2RlZmluZSBSRV9TWU5UQVhfUE9TSVhfTUlOSU1BTF9CQVNJQwkJCQkJXAorICAoX1JFX1NZTlRBWF9QT1NJWF9DT01NT04gfCBSRV9MSU1JVEVEX09QUykKKworI2RlZmluZSBSRV9TWU5UQVhfUE9TSVhfRVhURU5ERUQJCQkJCVwKKyAgKF9SRV9TWU5UQVhfUE9TSVhfQ09NTU9OIHwgUkVfQ09OVEVYVF9JTkRFUF9BTkNIT1JTCQkJXAorICAgfCBSRV9DT05URVhUX0lOREVQX09QUyAgfCBSRV9OT19CS19CUkFDRVMJCQkJXAorICAgfCBSRV9OT19CS19QQVJFTlMgICAgICAgfCBSRV9OT19CS19WQkFSCQkJCVwKKyAgIHwgUkVfVU5NQVRDSEVEX1JJR0hUX1BBUkVOX09SRCkKKworLyogRGlmZmVycyBmcm9tIC4uLl9QT1NJWF9FWFRFTkRFRCBpbiB0aGF0IFJFX0NPTlRFWFRfSU5WQUxJRF9PUFMKKyAgIHJlcGxhY2VzIFJFX0NPTlRFWFRfSU5ERVBfT1BTIGFuZCBSRV9OT19CS19SRUZTIGlzIGFkZGVkLiAgKi8KKyNkZWZpbmUgUkVfU1lOVEFYX1BPU0lYX01JTklNQUxfRVhURU5ERUQJCQkJXAorICAoX1JFX1NZTlRBWF9QT1NJWF9DT01NT04gIHwgUkVfQ09OVEVYVF9JTkRFUF9BTkNIT1JTCQkJXAorICAgfCBSRV9DT05URVhUX0lOVkFMSURfT1BTIHwgUkVfTk9fQktfQlJBQ0VTCQkJCVwKKyAgIHwgUkVfTk9fQktfUEFSRU5TICAgICAgICB8IFJFX05PX0JLX1JFRlMJCQkJXAorICAgfCBSRV9OT19CS19WQkFSCSAgICB8IFJFX1VOTUFUQ0hFRF9SSUdIVF9QQVJFTl9PUkQpCisvKiBbW1tlbmQgc3ludGF4ZXNdXV0gKi8KKwwKKy8qIE1heGltdW0gbnVtYmVyIG9mIGR1cGxpY2F0ZXMgYW4gaW50ZXJ2YWwgY2FuIGFsbG93LiAgU29tZSBzeXN0ZW1zCisgICAoZXJyb25lb3VzbHkpIGRlZmluZSB0aGlzIGluIG90aGVyIGhlYWRlciBmaWxlcywgYnV0IHdlIHdhbnQgb3VyCisgICB2YWx1ZSwgc28gcmVtb3ZlIGFueSBwcmV2aW91cyBkZWZpbmUuICAqLworI2lmZGVmIFJFX0RVUF9NQVgKKyMgdW5kZWYgUkVfRFVQX01BWAorI2VuZGlmCisvKiBJZiBzaXplb2YoaW50KSA9PSAyLCB0aGVuICgoMSA8PCAxNSkgLSAxKSBvdmVyZmxvd3MuICAqLworI2RlZmluZSBSRV9EVVBfTUFYICgweDdmZmYpCisKKworLyogUE9TSVggYGNmbGFncycgYml0cyAoaS5lLiwgaW5mb3JtYXRpb24gZm9yIGByZWdjb21wJykuICAqLworCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gdXNlIGV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBzeW50YXguCisgICBJZiBub3Qgc2V0LCB0aGVuIHVzZSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24gc3ludGF4LiAgKi8KKyNkZWZpbmUgUkVHX0VYVEVOREVEIDEKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIGlnbm9yZSBjYXNlIHdoZW4gbWF0Y2hpbmcuCisgICBJZiBub3Qgc2V0LCB0aGVuIGNhc2UgaXMgc2lnbmlmaWNhbnQuICAqLworI2RlZmluZSBSRUdfSUNBU0UgKFJFR19FWFRFTkRFRCA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gYW5jaG9ycyBkbyBub3QgbWF0Y2ggYXQgbmV3bGluZQorICAgICBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcuCisgICBJZiBub3Qgc2V0LCB0aGVuIGFuY2hvcnMgZG8gbWF0Y2ggYXQgbmV3bGluZXMuICAqLworI2RlZmluZSBSRUdfTkVXTElORSAoUkVHX0lDQVNFIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiByZXBvcnQgb25seSBzdWNjZXNzIG9yIGZhaWwgaW4gcmVnZXhlYy4KKyAgIElmIG5vdCBzZXQsIHRoZW4gcmV0dXJucyBkaWZmZXIgYmV0d2VlbiBub3QgbWF0Y2hpbmcgYW5kIGVycm9ycy4gICovCisjZGVmaW5lIFJFR19OT1NVQiAoUkVHX05FV0xJTkUgPDwgMSkKKworCisvKiBQT1NJWCBgZWZsYWdzJyBiaXRzIChpLmUuLCBpbmZvcm1hdGlvbiBmb3IgcmVnZXhlYykuICAqLworCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gdGhlIGJlZ2lubmluZy1vZi1saW5lIG9wZXJhdG9yIGRvZXNuJ3QgbWF0Y2gKKyAgICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nIChwcmVzdW1hYmx5IGJlY2F1c2UgaXQncyBub3QgdGhlCisgICAgIGJlZ2lubmluZyBvZiBhIGxpbmUpLgorICAgSWYgbm90IHNldCwgdGhlbiB0aGUgYmVnaW5uaW5nLW9mLWxpbmUgb3BlcmF0b3IgZG9lcyBtYXRjaCB0aGUKKyAgICAgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuICAqLworI2RlZmluZSBSRUdfTk9UQk9MIDEKKworLyogTGlrZSBSRUdfTk9UQk9MLCBleGNlcHQgZm9yIHRoZSBlbmQtb2YtbGluZS4gICovCisjZGVmaW5lIFJFR19OT1RFT0wgKDEgPDwgMSkKKworCisvKiBJZiBhbnkgZXJyb3IgY29kZXMgYXJlIHJlbW92ZWQsIGNoYW5nZWQsIG9yIGFkZGVkLCB1cGRhdGUgdGhlCisgICBgcmVfZXJyb3JfbXNnJyB0YWJsZSBpbiByZWdleC5jLiAgKi8KK3R5cGVkZWYgZW51bQoreworI2lmIChfWE9QRU5fU09VUkNFIC0gMCkgPT0gNTAwCisgIFJFR19OT1NZUyA9IC0xLAkvKiBUaGlzIHdpbGwgbmV2ZXIgaGFwcGVuIGZvciB0aGlzIGltcGxlbWVudGF0aW9uLiAgKi8KKyNlbmRpZgorCisgIFJFR19OT0VSUk9SID0gMCwJLyogU3VjY2Vzcy4gICovCisgIFJFR19OT01BVENILAkJLyogRGlkbid0IGZpbmQgYSBtYXRjaCAoZm9yIHJlZ2V4ZWMpLiAgKi8KKworICAvKiBQT1NJWCByZWdjb21wIHJldHVybiBlcnJvciBjb2Rlcy4gIChJbiB0aGUgb3JkZXIgbGlzdGVkIGluIHRoZQorICAgICBzdGFuZGFyZC4pICAqLworICBSRUdfQkFEUEFULAkJLyogSW52YWxpZCBwYXR0ZXJuLiAgKi8KKyAgUkVHX0VDT0xMQVRFLAkJLyogTm90IGltcGxlbWVudGVkLiAgKi8KKyAgUkVHX0VDVFlQRSwJCS8qIEludmFsaWQgY2hhcmFjdGVyIGNsYXNzIG5hbWUuICAqLworICBSRUdfRUVTQ0FQRSwJCS8qIFRyYWlsaW5nIGJhY2tzbGFzaC4gICovCisgIFJFR19FU1VCUkVHLAkJLyogSW52YWxpZCBiYWNrIHJlZmVyZW5jZS4gICovCisgIFJFR19FQlJBQ0ssCQkvKiBVbm1hdGNoZWQgbGVmdCBicmFja2V0LiAgKi8KKyAgUkVHX0VQQVJFTiwJCS8qIFBhcmVudGhlc2lzIGltYmFsYW5jZS4gICovCisgIFJFR19FQlJBQ0UsCQkvKiBVbm1hdGNoZWQgXHsuICAqLworICBSRUdfQkFEQlIsCQkvKiBJbnZhbGlkIGNvbnRlbnRzIG9mIFx7XH0uICAqLworICBSRUdfRVJBTkdFLAkJLyogSW52YWxpZCByYW5nZSBlbmQuICAqLworICBSRUdfRVNQQUNFLAkJLyogUmFuIG91dCBvZiBtZW1vcnkuICAqLworICBSRUdfQkFEUlBULAkJLyogTm8gcHJlY2VkaW5nIHJlIGZvciByZXBldGl0aW9uIG9wLiAgKi8KKworICAvKiBFcnJvciBjb2RlcyB3ZSd2ZSBhZGRlZC4gICovCisgIFJFR19FRU5ELAkJLyogUHJlbWF0dXJlIGVuZC4gICovCisgIFJFR19FU0laRSwJCS8qIENvbXBpbGVkIHBhdHRlcm4gYmlnZ2VyIHRoYW4gMl4xNiBieXRlcy4gICovCisgIFJFR19FUlBBUkVOCQkvKiBVbm1hdGNoZWQgKSBvciBcKTsgbm90IHJldHVybmVkIGZyb20gcmVnY29tcC4gICovCit9IHJlZ19lcnJjb2RlX3Q7CisMCisvKiBUaGlzIGRhdGEgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBjb21waWxlZCBwYXR0ZXJuLiAgQmVmb3JlIGNhbGxpbmcKKyAgIHRoZSBwYXR0ZXJuIGNvbXBpbGVyLCB0aGUgZmllbGRzIGBidWZmZXInLCBgYWxsb2NhdGVkJywgYGZhc3RtYXAnLAorICAgYHRyYW5zbGF0ZScsIGFuZCBgbm9fc3ViJyBjYW4gYmUgc2V0LiAgQWZ0ZXIgdGhlIHBhdHRlcm4gaGFzIGJlZW4KKyAgIGNvbXBpbGVkLCB0aGUgYHJlX25zdWInIGZpZWxkIGlzIGF2YWlsYWJsZS4gIEFsbCBvdGhlciBmaWVsZHMgYXJlCisgICBwcml2YXRlIHRvIHRoZSByZWdleCByb3V0aW5lcy4gICovCisKKyNpZm5kZWYgUkVfVFJBTlNMQVRFX1RZUEUKKyMgZGVmaW5lIFJFX1RSQU5TTEFURV9UWVBFIGNoYXIgKgorI2VuZGlmCisKK3N0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlcgoreworLyogW1tbYmVnaW4gcGF0dGVybl9idWZmZXJdXV0gKi8KKwkvKiBTcGFjZSB0aGF0IGhvbGRzIHRoZSBjb21waWxlZCBwYXR0ZXJuLiAgSXQgaXMgZGVjbGFyZWQgYXMKKyAgICAgICAgICBgdW5zaWduZWQgY2hhciAqJyBiZWNhdXNlIGl0cyBlbGVtZW50cyBhcmUKKyAgICAgICAgICAgc29tZXRpbWVzIHVzZWQgYXMgYXJyYXkgaW5kZXhlcy4gICovCisgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKworCS8qIE51bWJlciBvZiBieXRlcyB0byB3aGljaCBgYnVmZmVyJyBwb2ludHMuICAqLworICB1bnNpZ25lZCBsb25nIGludCBhbGxvY2F0ZWQ7CisKKwkvKiBOdW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgdXNlZCBpbiBgYnVmZmVyJy4gICovCisgIHVuc2lnbmVkIGxvbmcgaW50IHVzZWQ7CisKKyAgICAgICAgLyogU3ludGF4IHNldHRpbmcgd2l0aCB3aGljaCB0aGUgcGF0dGVybiB3YXMgY29tcGlsZWQuICAqLworICByZWdfc3ludGF4X3Qgc3ludGF4OworCisgICAgICAgIC8qIFBvaW50ZXIgdG8gYSBmYXN0bWFwLCBpZiBhbnksIG90aGVyd2lzZSB6ZXJvLiAgcmVfc2VhcmNoIHVzZXMKKyAgICAgICAgICAgdGhlIGZhc3RtYXAsIGlmIHRoZXJlIGlzIG9uZSwgdG8gc2tpcCBvdmVyIGltcG9zc2libGUKKyAgICAgICAgICAgc3RhcnRpbmcgcG9pbnRzIGZvciBtYXRjaGVzLiAgKi8KKyAgY2hhciAqZmFzdG1hcDsKKworICAgICAgICAvKiBFaXRoZXIgYSB0cmFuc2xhdGUgdGFibGUgdG8gYXBwbHkgdG8gYWxsIGNoYXJhY3RlcnMgYmVmb3JlCisgICAgICAgICAgIGNvbXBhcmluZyB0aGVtLCBvciB6ZXJvIGZvciBubyB0cmFuc2xhdGlvbi4gIFRoZSB0cmFuc2xhdGlvbgorICAgICAgICAgICBpcyBhcHBsaWVkIHRvIGEgcGF0dGVybiB3aGVuIGl0IGlzIGNvbXBpbGVkIGFuZCB0byBhIHN0cmluZworICAgICAgICAgICB3aGVuIGl0IGlzIG1hdGNoZWQuICAqLworICBSRV9UUkFOU0xBVEVfVFlQRSB0cmFuc2xhdGU7CisKKwkvKiBOdW1iZXIgb2Ygc3ViZXhwcmVzc2lvbnMgZm91bmQgYnkgdGhlIGNvbXBpbGVyLiAgKi8KKyAgc2l6ZV90IHJlX25zdWI7CisKKyAgICAgICAgLyogWmVybyBpZiB0aGlzIHBhdHRlcm4gY2Fubm90IG1hdGNoIHRoZSBlbXB0eSBzdHJpbmcsIG9uZSBlbHNlLgorICAgICAgICAgICBXZWxsLCBpbiB0cnV0aCBpdCdzIHVzZWQgb25seSBpbiBgcmVfc2VhcmNoXzInLCB0byBzZWUKKyAgICAgICAgICAgd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHVzZSB0aGUgZmFzdG1hcCwgc28gd2UgZG9uJ3Qgc2V0CisgICAgICAgICAgIHRoaXMgYWJzb2x1dGVseSBwZXJmZWN0bHk7IHNlZSBgcmVfY29tcGlsZV9mYXN0bWFwJyAodGhlCisgICAgICAgICAgIGBkdXBsaWNhdGUnIGNhc2UpLiAgKi8KKyAgdW5zaWduZWQgY2FuX2JlX251bGwgOiAxOworCisgICAgICAgIC8qIElmIFJFR1NfVU5BTExPQ0FURUQsIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBgcmVncycgc3RydWN0dXJlCisgICAgICAgICAgICAgZm9yIGBtYXggKFJFX05SRUdTLCByZV9uc3ViICsgMSknIGdyb3Vwcy4KKyAgICAgICAgICAgSWYgUkVHU19SRUFMTE9DQVRFLCByZWFsbG9jYXRlIHNwYWNlIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgSWYgUkVHU19GSVhFRCwgdXNlIHdoYXQncyB0aGVyZS4gICovCisjZGVmaW5lIFJFR1NfVU5BTExPQ0FURUQgMAorI2RlZmluZSBSRUdTX1JFQUxMT0NBVEUgMQorI2RlZmluZSBSRUdTX0ZJWEVEIDIKKyAgdW5zaWduZWQgcmVnc19hbGxvY2F0ZWQgOiAyOworCisgICAgICAgIC8qIFNldCB0byB6ZXJvIHdoZW4gYHJlZ2V4X2NvbXBpbGUnIGNvbXBpbGVzIGEgcGF0dGVybjsgc2V0IHRvIG9uZQorICAgICAgICAgICBieSBgcmVfY29tcGlsZV9mYXN0bWFwJyBpZiBpdCB1cGRhdGVzIHRoZSBmYXN0bWFwLiAgKi8KKyAgdW5zaWduZWQgZmFzdG1hcF9hY2N1cmF0ZSA6IDE7CisKKyAgICAgICAgLyogSWYgc2V0LCBgcmVfbWF0Y2hfMicgZG9lcyBub3QgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0CisgICAgICAgICAgIHN1YmV4cHJlc3Npb25zLiAgKi8KKyAgdW5zaWduZWQgbm9fc3ViIDogMTsKKworICAgICAgICAvKiBJZiBzZXQsIGEgYmVnaW5uaW5nLW9mLWxpbmUgYW5jaG9yIGRvZXNuJ3QgbWF0Y2ggYXQgdGhlCisgICAgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLiAgKi8KKyAgdW5zaWduZWQgbm90X2JvbCA6IDE7CisKKyAgICAgICAgLyogU2ltaWxhcmx5IGZvciBhbiBlbmQtb2YtbGluZSBhbmNob3IuICAqLworICB1bnNpZ25lZCBub3RfZW9sIDogMTsKKworICAgICAgICAvKiBJZiB0cnVlLCBhbiBhbmNob3IgYXQgYSBuZXdsaW5lIG1hdGNoZXMuICAqLworICB1bnNpZ25lZCBuZXdsaW5lX2FuY2hvciA6IDE7CisKKy8qIFtbW2VuZCBwYXR0ZXJuX2J1ZmZlcl1dXSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgcmVnZXhfdDsKKwwKKy8qIFR5cGUgZm9yIGJ5dGUgb2Zmc2V0cyB3aXRoaW4gdGhlIHN0cmluZy4gIFBPU0lYIG1hbmRhdGVzIHRoaXMuICAqLwordHlwZWRlZiBpbnQgcmVnb2ZmX3Q7CisKKworLyogVGhpcyBpcyB0aGUgc3RydWN0dXJlIHdlIHN0b3JlIHJlZ2lzdGVyIG1hdGNoIGRhdGEgaW4uICBTZWUKKyAgIHJlZ2V4LnRleGluZm8gZm9yIGEgZnVsbCBkZXNjcmlwdGlvbiBvZiB3aGF0IHJlZ2lzdGVycyBtYXRjaC4gICovCitzdHJ1Y3QgcmVfcmVnaXN0ZXJzCit7CisgIHVuc2lnbmVkIG51bV9yZWdzOworICByZWdvZmZfdCAqc3RhcnQ7CisgIHJlZ29mZl90ICplbmQ7Cit9OworCisKKy8qIElmIGByZWdzX2FsbG9jYXRlZCcgaXMgUkVHU19VTkFMTE9DQVRFRCBpbiB0aGUgcGF0dGVybiBidWZmZXIsCisgICBgcmVfbWF0Y2hfMicgcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhdCBsZWFzdCB0aGlzIG1hbnkgcmVnaXN0ZXJzCisgICB0aGUgZmlyc3QgdGltZSBhIGByZWdzJyBzdHJ1Y3R1cmUgaXMgcGFzc2VkLiAgKi8KKyNpZm5kZWYgUkVfTlJFR1MKKyMgZGVmaW5lIFJFX05SRUdTIDMwCisjZW5kaWYKKworCisvKiBQT1NJWCBzcGVjaWZpY2F0aW9uIGZvciByZWdpc3RlcnMuICBBc2lkZSBmcm9tIHRoZSBkaWZmZXJlbnQgbmFtZXMgdGhhbgorICAgYHJlX3JlZ2lzdGVycycsIFBPU0lYIHVzZXMgYW4gYXJyYXkgb2Ygc3RydWN0dXJlcywgaW5zdGVhZCBvZiBhCisgICBzdHJ1Y3R1cmUgb2YgYXJyYXlzLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHJlZ29mZl90IHJtX3NvOyAgLyogQnl0ZSBvZmZzZXQgZnJvbSBzdHJpbmcncyBzdGFydCB0byBzdWJzdHJpbmcncyBzdGFydC4gICovCisgIHJlZ29mZl90IHJtX2VvOyAgLyogQnl0ZSBvZmZzZXQgZnJvbSBzdHJpbmcncyBzdGFydCB0byBzdWJzdHJpbmcncyBlbmQuICAqLworfSByZWdtYXRjaF90OworDAorLyogRGVjbGFyYXRpb25zIGZvciByb3V0aW5lcy4gICovCisKKy8qIFRvIGF2b2lkIGR1cGxpY2F0aW5nIGV2ZXJ5IHJvdXRpbmUgZGVjbGFyYXRpb24gLS0gb25jZSB3aXRoIGEKKyAgIHByb3RvdHlwZSAoaWYgd2UgYXJlIEFOU0kpLCBhbmQgb25jZSB3aXRob3V0IChpZiB3ZSBhcmVuJ3QpIC0tIHdlCisgICB1c2UgdGhlIGZvbGxvd2luZyBtYWNybyB0byBkZWNsYXJlIGFyZ3VtZW50IHR5cGVzLiAgVGhpcworICAgdW5mb3J0dW5hdGVseSBjbHV0dGVycyB1cCB0aGUgZGVjbGFyYXRpb25zIGEgYml0LCBidXQgSSB0aGluayBpdCdzCisgICB3b3J0aCBpdC4gICovCisKKyNpZiBfX1NURENfXworCisjIGRlZmluZSBfUkVfQVJHUyhhcmdzKSBhcmdzCisKKyNlbHNlIC8qIG5vdCBfX1NURENfXyAqLworCisjIGRlZmluZSBfUkVfQVJHUyhhcmdzKSAoKQorCisjZW5kaWYgLyogbm90IF9fU1REQ19fICovCisKKy8qIFNldHMgdGhlIGN1cnJlbnQgZGVmYXVsdCBzeW50YXggdG8gU1lOVEFYLCBhbmQgcmV0dXJuIHRoZSBvbGQgc3ludGF4LgorICAgWW91IGNhbiBhbHNvIHNpbXBseSBhc3NpZ24gdG8gdGhlIGByZV9zeW50YXhfb3B0aW9ucycgdmFyaWFibGUuICAqLworZXh0ZXJuIHJlZ19zeW50YXhfdCBfX3JlX3NldF9zeW50YXggX1JFX0FSR1MgKChyZWdfc3ludGF4X3Qgc3ludGF4KSk7CitleHRlcm4gcmVnX3N5bnRheF90IHJlX3NldF9zeW50YXggX1JFX0FSR1MgKChyZWdfc3ludGF4X3Qgc3ludGF4KSk7CisKKy8qIENvbXBpbGUgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBQQVRURVJOLCB3aXRoIGxlbmd0aCBMRU5HVEgKKyAgIGFuZCBzeW50YXggZ2l2ZW4gYnkgdGhlIGdsb2JhbCBgcmVfc3ludGF4X29wdGlvbnMnLCBpbnRvIHRoZSBidWZmZXIKKyAgIEJVRkZFUi4gIFJldHVybiBOVUxMIGlmIHN1Y2Nlc3NmdWwsIGFuZCBhbiBlcnJvciBzdHJpbmcgaWYgbm90LiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICpfX3JlX2NvbXBpbGVfcGF0dGVybgorICBfUkVfQVJHUyAoKGNvbnN0IGNoYXIgKnBhdHRlcm4sIHNpemVfdCBsZW5ndGgsCisgICAgICAgICAgICAgc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyICpidWZmZXIpKTsKK2V4dGVybiBjb25zdCBjaGFyICpyZV9jb21waWxlX3BhdHRlcm4KKyAgX1JFX0FSR1MgKChjb25zdCBjaGFyICpwYXR0ZXJuLCBzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgIHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqYnVmZmVyKSk7CisKKworLyogQ29tcGlsZSBhIGZhc3RtYXAgZm9yIHRoZSBjb21waWxlZCBwYXR0ZXJuIGluIEJVRkZFUjsgdXNlZCB0bworICAgYWNjZWxlcmF0ZSBzZWFyY2hlcy4gIFJldHVybiAwIGlmIHN1Y2Nlc3NmdWwgYW5kIC0yIGlmIHdhcyBhbgorICAgaW50ZXJuYWwgZXJyb3IuICAqLworZXh0ZXJuIGludCBfX3JlX2NvbXBpbGVfZmFzdG1hcCBfUkVfQVJHUyAoKHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqYnVmZmVyKSk7CitleHRlcm4gaW50IHJlX2NvbXBpbGVfZmFzdG1hcCBfUkVfQVJHUyAoKHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqYnVmZmVyKSk7CisKKworLyogU2VhcmNoIGluIHRoZSBzdHJpbmcgU1RSSU5HICh3aXRoIGxlbmd0aCBMRU5HVEgpIGZvciB0aGUgcGF0dGVybgorICAgY29tcGlsZWQgaW50byBCVUZGRVIuICBTdGFydCBzZWFyY2hpbmcgYXQgcG9zaXRpb24gU1RBUlQsIGZvciBSQU5HRQorICAgY2hhcmFjdGVycy4gIFJldHVybiB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIG1hdGNoLCAtMSBmb3Igbm8KKyAgIG1hdGNoLCBvciAtMiBmb3IgYW4gaW50ZXJuYWwgZXJyb3IuICBBbHNvIHJldHVybiByZWdpc3RlcgorICAgaW5mb3JtYXRpb24gaW4gUkVHUyAoaWYgUkVHUyBhbmQgQlVGRkVSLT5ub19zdWIgYXJlIG5vbnplcm8pLiAgKi8KK2V4dGVybiBpbnQgX19yZV9zZWFyY2gKKyAgX1JFX0FSR1MgKChzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgKmJ1ZmZlciwgY29uc3QgY2hhciAqc3RyaW5nLAorICAgICAgICAgICAgaW50IGxlbmd0aCwgaW50IHN0YXJ0LCBpbnQgcmFuZ2UsIHN0cnVjdCByZV9yZWdpc3RlcnMgKnJlZ3MpKTsKK2V4dGVybiBpbnQgcmVfc2VhcmNoCisgIF9SRV9BUkdTICgoc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyICpidWZmZXIsIGNvbnN0IGNoYXIgKnN0cmluZywKKyAgICAgICAgICAgIGludCBsZW5ndGgsIGludCBzdGFydCwgaW50IHJhbmdlLCBzdHJ1Y3QgcmVfcmVnaXN0ZXJzICpyZWdzKSk7CisKKworLyogTGlrZSBgcmVfc2VhcmNoJywgYnV0IHNlYXJjaCBpbiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBTVFJJTkcxIGFuZAorICAgU1RSSU5HMi4gIEFsc28sIHN0b3Agc2VhcmNoaW5nIGF0IGluZGV4IFNUQVJUICsgU1RPUC4gICovCitleHRlcm4gaW50IF9fcmVfc2VhcmNoXzIKKyAgX1JFX0FSR1MgKChzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgKmJ1ZmZlciwgY29uc3QgY2hhciAqc3RyaW5nMSwKKyAgICAgICAgICAgICBpbnQgbGVuZ3RoMSwgY29uc3QgY2hhciAqc3RyaW5nMiwgaW50IGxlbmd0aDIsCisgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgcmFuZ2UsIHN0cnVjdCByZV9yZWdpc3RlcnMgKnJlZ3MsIGludCBzdG9wKSk7CitleHRlcm4gaW50IHJlX3NlYXJjaF8yCisgIF9SRV9BUkdTICgoc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyICpidWZmZXIsIGNvbnN0IGNoYXIgKnN0cmluZzEsCisgICAgICAgICAgICAgaW50IGxlbmd0aDEsIGNvbnN0IGNoYXIgKnN0cmluZzIsIGludCBsZW5ndGgyLAorICAgICAgICAgICAgIGludCBzdGFydCwgaW50IHJhbmdlLCBzdHJ1Y3QgcmVfcmVnaXN0ZXJzICpyZWdzLCBpbnQgc3RvcCkpOworCisKKy8qIExpa2UgYHJlX3NlYXJjaCcsIGJ1dCByZXR1cm4gaG93IG1hbnkgY2hhcmFjdGVycyBpbiBTVFJJTkcgdGhlIHJlZ2V4cAorICAgaW4gQlVGRkVSIG1hdGNoZWQsIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIFNUQVJULiAgKi8KK2V4dGVybiBpbnQgX19yZV9tYXRjaAorICBfUkVfQVJHUyAoKHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqYnVmZmVyLCBjb25zdCBjaGFyICpzdHJpbmcsCisgICAgICAgICAgICAgaW50IGxlbmd0aCwgaW50IHN0YXJ0LCBzdHJ1Y3QgcmVfcmVnaXN0ZXJzICpyZWdzKSk7CitleHRlcm4gaW50IHJlX21hdGNoCisgIF9SRV9BUkdTICgoc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyICpidWZmZXIsIGNvbnN0IGNoYXIgKnN0cmluZywKKyAgICAgICAgICAgICBpbnQgbGVuZ3RoLCBpbnQgc3RhcnQsIHN0cnVjdCByZV9yZWdpc3RlcnMgKnJlZ3MpKTsKKworCisvKiBSZWxhdGVzIHRvIGByZV9tYXRjaCcgYXMgYHJlX3NlYXJjaF8yJyByZWxhdGVzIHRvIGByZV9zZWFyY2gnLiAgKi8KK2V4dGVybiBpbnQgX19yZV9tYXRjaF8yCisgIF9SRV9BUkdTICgoc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyICpidWZmZXIsIGNvbnN0IGNoYXIgKnN0cmluZzEsCisgICAgICAgICAgICAgaW50IGxlbmd0aDEsIGNvbnN0IGNoYXIgKnN0cmluZzIsIGludCBsZW5ndGgyLAorICAgICAgICAgICAgIGludCBzdGFydCwgc3RydWN0IHJlX3JlZ2lzdGVycyAqcmVncywgaW50IHN0b3ApKTsKK2V4dGVybiBpbnQgcmVfbWF0Y2hfMgorICBfUkVfQVJHUyAoKHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqYnVmZmVyLCBjb25zdCBjaGFyICpzdHJpbmcxLAorICAgICAgICAgICAgIGludCBsZW5ndGgxLCBjb25zdCBjaGFyICpzdHJpbmcyLCBpbnQgbGVuZ3RoMiwKKyAgICAgICAgICAgICBpbnQgc3RhcnQsIHN0cnVjdCByZV9yZWdpc3RlcnMgKnJlZ3MsIGludCBzdG9wKSk7CisKKworLyogU2V0IFJFR1MgdG8gaG9sZCBOVU1fUkVHUyByZWdpc3RlcnMsIHN0b3JpbmcgdGhlbSBpbiBTVEFSVFMgYW5kCisgICBFTkRTLiAgU3Vic2VxdWVudCBtYXRjaGVzIHVzaW5nIEJVRkZFUiBhbmQgUkVHUyB3aWxsIHVzZSB0aGlzIG1lbW9yeQorICAgZm9yIHJlY29yZGluZyByZWdpc3RlciBpbmZvcm1hdGlvbi4gIFNUQVJUUyBhbmQgRU5EUyBtdXN0IGJlCisgICBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MsIGFuZCBtdXN0IGVhY2ggYmUgYXQgbGVhc3QgYE5VTV9SRUdTICogc2l6ZW9mCisgICAocmVnb2ZmX3QpJyBieXRlcyBsb25nLgorCisgICBJZiBOVU1fUkVHUyA9PSAwLCB0aGVuIHN1YnNlcXVlbnQgbWF0Y2hlcyBzaG91bGQgYWxsb2NhdGUgdGhlaXIgb3duCisgICByZWdpc3RlciBkYXRhLgorCisgICBVbmxlc3MgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSBmaXJzdCBzZWFyY2ggb3IgbWF0Y2ggdXNpbmcKKyAgIFBBVFRFUk5fQlVGRkVSIHdpbGwgYWxsb2NhdGUgaXRzIG93biByZWdpc3RlciBkYXRhLCB3aXRob3V0CisgICBmcmVlaW5nIHRoZSBvbGQgZGF0YS4gICovCitleHRlcm4gdm9pZCBfX3JlX3NldF9yZWdpc3RlcnMKKyAgX1JFX0FSR1MgKChzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgKmJ1ZmZlciwgc3RydWN0IHJlX3JlZ2lzdGVycyAqcmVncywKKyAgICAgICAgICAgICB1bnNpZ25lZCBudW1fcmVncywgcmVnb2ZmX3QgKnN0YXJ0cywgcmVnb2ZmX3QgKmVuZHMpKTsKK2V4dGVybiB2b2lkIHJlX3NldF9yZWdpc3RlcnMKKyAgX1JFX0FSR1MgKChzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgKmJ1ZmZlciwgc3RydWN0IHJlX3JlZ2lzdGVycyAqcmVncywKKyAgICAgICAgICAgICB1bnNpZ25lZCBudW1fcmVncywgcmVnb2ZmX3QgKnN0YXJ0cywgcmVnb2ZmX3QgKmVuZHMpKTsKKworI2lmZGVmIF9SRUdFWF9SRV9DT01QCisjIGlmbmRlZiBfQ1JBWQorLyogNC4yIGJzZCBjb21wYXRpYmlsaXR5LiAgKi8KK2V4dGVybiBjaGFyICpyZV9jb21wIF9SRV9BUkdTICgoY29uc3QgY2hhciAqKSk7CitleHRlcm4gaW50IHJlX2V4ZWMgX1JFX0FSR1MgKChjb25zdCBjaGFyICopKTsKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBQT1NJWCBjb21wYXRpYmlsaXR5LiAgKi8KK2V4dGVybiBpbnQgX19yZWdjb21wIF9SRV9BUkdTICgocmVnZXhfdCAqX19wcmVnLCBjb25zdCBjaGFyICpfX3BhdHRlcm4sCisJCQkJaW50IF9fY2ZsYWdzKSk7CitleHRlcm4gaW50IHJlZ2NvbXAgX1JFX0FSR1MgKChyZWdleF90ICpfX3ByZWcsIGNvbnN0IGNoYXIgKl9fcGF0dGVybiwKKwkJCSAgICAgIGludCBfX2NmbGFncykpOworCitleHRlcm4gaW50IF9fcmVnZXhlYyBfUkVfQVJHUyAoKGNvbnN0IHJlZ2V4X3QgKl9fcHJlZywKKwkJCQljb25zdCBjaGFyICpfX3N0cmluZywgc2l6ZV90IF9fbm1hdGNoLAorCQkJCXJlZ21hdGNoX3QgX19wbWF0Y2hbXSwgaW50IF9fZWZsYWdzKSk7CitleHRlcm4gaW50IHJlZ2V4ZWMgX1JFX0FSR1MgKChjb25zdCByZWdleF90ICpfX3ByZWcsCisJCQkgICAgICBjb25zdCBjaGFyICpfX3N0cmluZywgc2l6ZV90IF9fbm1hdGNoLAorCQkJICAgICAgcmVnbWF0Y2hfdCBfX3BtYXRjaFtdLCBpbnQgX19lZmxhZ3MpKTsKKworZXh0ZXJuIHNpemVfdCBfX3JlZ2Vycm9yIF9SRV9BUkdTICgoaW50IF9fZXJyY29kZSwgY29uc3QgcmVnZXhfdCAqX19wcmVnLAorCQkJCSAgICBjaGFyICpfX2VycmJ1Ziwgc2l6ZV90IF9fZXJyYnVmX3NpemUpKTsKK2V4dGVybiBzaXplX3QgcmVnZXJyb3IgX1JFX0FSR1MgKChpbnQgX19lcnJjb2RlLCBjb25zdCByZWdleF90ICpfX3ByZWcsCisJCQkJICBjaGFyICpfX2VycmJ1Ziwgc2l6ZV90IF9fZXJyYnVmX3NpemUpKTsKKworZXh0ZXJuIHZvaWQgX19yZWdmcmVlIF9SRV9BUkdTICgocmVnZXhfdCAqX19wcmVnKSk7CitleHRlcm4gdm9pZCByZWdmcmVlIF9SRV9BUkdTICgocmVnZXhfdCAqX19wcmVnKSk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYJLyogQysrICovCisKKyNlbmRpZiAvKiByZWdleC5oICovCisMCisvKgorTG9jYWwgdmFyaWFibGVzOgorbWFrZS1iYWNrdXAtZmlsZXM6IHQKK3ZlcnNpb24tY29udHJvbDogdAordHJpbS12ZXJzaW9ucy13aXRob3V0LWFza2luZzogbmlsCitFbmQ6CisqLwpkaWZmIC0tZ2l0IGEvZ2RiL2dvdWxkLXRkZXAuYyBiL2dkYi9nb3VsZC10ZGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkxNmNjMgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9nb3VsZC10ZGVwLmMKQEAgLTAsMCArMSwzMTAgQEAKKy8qIE9CU09MRVRFIC8qIEdPVUxEIFJJU0MgdGFyZ2V0LWRlcGVuZGVudCBjb2RlIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuICovCisvKiBPQlNPTEVURSAgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAqLworLyogT0JTT0xFVEUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgKi8KKy8qIE9CU09MRVRFIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICovCisvKiBPQlNPTEVURSAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgKi8KKy8qIE9CU09MRVRFIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICovCisvKiBPQlNPTEVURSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICovCisvKiBPQlNPTEVURSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAqLworLyogT0JTT0xFVEUgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgKi8KKy8qIE9CU09MRVRFIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgI2luY2x1ZGUgImRlZnMuaCIgKi8KKy8qIE9CU09MRVRFICNpbmNsdWRlICJzeW10YWIuaCIgKi8KKy8qIE9CU09MRVRFICNpbmNsdWRlICJmcmFtZS5oIiAqLworLyogT0JTT0xFVEUgI2luY2x1ZGUgImdkYmNvcmUuaCIgKi8KKy8qIE9CU09MRVRFICNpZiBkZWZpbmVkIEdPVUxEX1BOICovCisvKiBPQlNPTEVURSAjaW5jbHVkZSAib3Bjb2RlL3BuLmgiICovCisvKiBPQlNPTEVURSAjZWxzZSAqLworLyogT0JTT0xFVEUgI2luY2x1ZGUgIm9wY29kZS9ucDEuaCIgKi8KKy8qIE9CU09MRVRFICNlbmRpZiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAvKiBHT1VMRCBSSVNDIGluc3RydWN0aW9ucyBhcmUgbmV2ZXIgbG9uZ2VyIHRoYW4gdGhpcyBtYW55IGJ5dGVzLiAgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIE1BWExFTiA0ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKngvICovCisvKiBPQlNPTEVURSAjZGVmaW5lIE5PUENPREVTIChzaXplb2YgZ2xkX29wY29kZXMgLyBzaXplb2YgZ2xkX29wY29kZXNbMF0pICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIGludCAqLworLyogT0JTT0xFVEUgZ291bGRfZnJhbWVfY2hhaW5fdmFsaWQgKGNoYWluLCBmaSkgKi8KKy8qIE9CU09MRVRFICAgICAgQ09SRV9BRERSIGNoYWluOyAqLworLyogT0JTT0xFVEUgICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7ICAgICAgLyogbm90IHVzZWQgaGVyZSAqeC8gKi8KKy8qIE9CU09MRVRFIHsgKi8KKy8qIE9CU09MRVRFICAgcmV0dXJuIChjaGFpbiAhPSAwICYmIGNoYWluICE9ICh0aGlzZnJhbWUpLT5mcmFtZSk7ICovCisvKiBPQlNPTEVURSB9ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qIEJvdGggZ2NjIGFuZCBjYyByZXR1cm4gc21hbGwgc3RydWN0cyBpbiByZWdpc3RlcnMgKGkuZS4gaW4gR0RCICovCisvKiBPQlNPTEVURSAgICB0ZXJtaW5vbG9neSwgc21hbGwgc3RydWN0cyBkb24ndCB1c2UgdGhlIHN0cnVjdCByZXR1cm4gY29udmVudGlvbikuICAqeC8gKi8KKy8qIE9CU09MRVRFIGludCAqLworLyogT0JTT0xFVEUgZ291bGRfdXNlX3N0cnVjdF9jb252ZW50aW9uIChnY2NfcCwgdHlwZSkgKi8KKy8qIE9CU09MRVRFICAgICAgaW50IGdjY19wOyAqLworLyogT0JTT0xFVEUgICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsgKi8KKy8qIE9CU09MRVRFIHsgKi8KKy8qIE9CU09MRVRFICAgcmV0dXJuIChUWVBFX0xFTkdUSCh0eXBlKSA+IDgpOyAqLworLyogT0JTT0xFVEUgfSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIAwgKi8KKy8qIE9CU09MRVRFIC8qIFByaW50IHRoZSBHT1VMRCBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzIE1FTUFERFIgaW4gZGVidWdnZWQgbWVtb3J5LCAqLworLyogT0JTT0xFVEUgICAgb24gU1RSRUFNLiAgUmV0dXJucyBsZW5ndGggb2YgdGhlIGluc3RydWN0aW9uLCBpbiBieXRlcy4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSBpbnQgKi8KKy8qIE9CU09MRVRFIGdvdWxkX3ByaW50X2luc24gKG1lbWFkZHIsIHN0cmVhbSkgKi8KKy8qIE9CU09MRVRFICAgICAgQ09SRV9BRERSIG1lbWFkZHI7ICovCisvKiBPQlNPTEVURSAgICAgIEZJTEUgKnN0cmVhbTsgKi8KKy8qIE9CU09MRVRFIHsgKi8KKy8qIE9CU09MRVRFIAl1bnNpZ25lZCBjaGFyIGJ1ZmZlcltNQVhMRU5dOyAqLworLyogT0JTT0xFVEUgCXJlZ2lzdGVyIGludCBpOyAqLworLyogT0JTT0xFVEUgCXJlZ2lzdGVyIGNoYXIgKmQ7ICovCisvKiBPQlNPTEVURSAJcmVnaXN0ZXIgaW50IGJlc3RtYXNrOyAqLworLyogT0JTT0xFVEUgCXVuc2lnbmVkIGJlc3Q7ICovCisvKiBPQlNPTEVURSAJaW50IHRlbXAsIGluZGV4LCBiZXN0bGVuOyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAJcmVhZF9tZW1vcnkgKG1lbWFkZHIsIGJ1ZmZlciwgTUFYTEVOKTsgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgCWJlc3RtYXNrID0gMDsgKi8KKy8qIE9CU09MRVRFIAlpbmRleCA9IC0xOyAqLworLyogT0JTT0xFVEUgCWJlc3QgPSAweGZmZmZmZmZmOyAqLworLyogT0JTT0xFVEUgCWZvciAoaSA9IDA7IGkgPCBOT1BDT0RFUzsgaSsrKSAqLworLyogT0JTT0xFVEUgCXsgKi8KKy8qIE9CU09MRVRFIAkJcmVnaXN0ZXIgdW5zaWduZWQgaW50IG9wY29kZSA9IGdsZF9vcGNvZGVzW2ldLm9wY29kZTsgKi8KKy8qIE9CU09MRVRFIAkJcmVnaXN0ZXIgdW5zaWduZWQgaW50IG1hc2sgPSBnbGRfb3Bjb2Rlc1tpXS5tYXNrOyAqLworLyogT0JTT0xFVEUgCQlyZWdpc3RlciB1bnNpZ25lZCBpbnQgbGVuID0gZ2xkX29wY29kZXNbaV0ubGVuZ3RoOyAqLworLyogT0JTT0xFVEUgCQlyZWdpc3RlciB1bnNpZ25lZCBpbnQgdGVzdDsgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgCQkvKiBHZXQgcG9zc2libGUgb3Bjb2RlIGJ5dGVzIGludG8gaW50ZWdlciAqeC8gKi8KKy8qIE9CU09MRVRFIAkJdGVzdCA9IGJ1ZmZlclswXSA8PCAyNDsgKi8KKy8qIE9CU09MRVRFIAkJdGVzdCB8PSBidWZmZXJbMV0gPDwgMTY7ICovCisvKiBPQlNPTEVURSAJCXRlc3QgfD0gYnVmZmVyWzJdIDw8IDg7ICovCisvKiBPQlNPTEVURSAJCXRlc3QgfD0gYnVmZmVyWzNdOyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAJCS8qIE1hc2sgd2l0aCBvcGNvZGUgYW5kIHNlZSBpZiBtYXRjaCAqeC8gKi8KKy8qIE9CU09MRVRFIAkJaWYgKChvcGNvZGUgJiBtYXNrKSA9PSAodGVzdCAmIG1hc2spKSAqLworLyogT0JTT0xFVEUgCQl7ICovCisvKiBPQlNPTEVURSAJCQkvKiBTZWUgaWYgc2Vjb25kIG9yIHRoaXJkIG1hdGNoICp4LyAqLworLyogT0JTT0xFVEUgCQkJaWYgKGluZGV4ID49IDApICovCisvKiBPQlNPTEVURSAJCQl7ICovCisvKiBPQlNPTEVURSAJCQkJLyogVGFrZSBuZXcgb25lIGlmIGl0IGxvb2tzIGdvb2QgKngvICovCisvKiBPQlNPTEVURSAJCQkJaWYgKGJlc3RsZW4gPT0gTUFYTEVOICYmIGxlbiA9PSBNQVhMRU4pICovCisvKiBPQlNPTEVURSAJCQkJeyAqLworLyogT0JTT0xFVEUgCQkJCQkvKiBTZWUgaWYgbG93ZXIgYml0cyBtYXRjaGVkICp4LyAqLworLyogT0JTT0xFVEUgCQkJCQlpZiAoKChiZXN0bWFzayAmIDMpID09IDApICYmICovCisvKiBPQlNPTEVURSAJCQkJCSAgICAoKG1hc2sgJiAzKSAhPSAwKSkgKi8KKy8qIE9CU09MRVRFIAkJCQkJeyAqLworLyogT0JTT0xFVEUgCQkJCQkJYmVzdG1hc2sgPSBtYXNrOyAqLworLyogT0JTT0xFVEUgCQkJCQkJYmVzdGxlbiA9IGxlbjsgKi8KKy8qIE9CU09MRVRFIAkJCQkJCWJlc3QgPSB0ZXN0OyAqLworLyogT0JTT0xFVEUgCQkJCQkJaW5kZXggPSBpOyAqLworLyogT0JTT0xFVEUgCQkJCQl9ICovCisvKiBPQlNPTEVURSAJCQkJfSAqLworLyogT0JTT0xFVEUgCQkJfSAqLworLyogT0JTT0xFVEUgCQkJZWxzZSAqLworLyogT0JTT0xFVEUgCQkJeyAqLworLyogT0JTT0xFVEUgCQkJCS8qIEZpcnN0IG1hdGNoLCBzYXZlIGl0ICp4LyAqLworLyogT0JTT0xFVEUgCQkJCWJlc3RtYXNrID0gbWFzazsgKi8KKy8qIE9CU09MRVRFIAkJCQliZXN0bGVuID0gbGVuOyAqLworLyogT0JTT0xFVEUgCQkJCWJlc3QgPSB0ZXN0OyAqLworLyogT0JTT0xFVEUgCQkJCWluZGV4ID0gaTsgKi8KKy8qIE9CU09MRVRFIAkJCX0gKi8KKy8qIE9CU09MRVRFIAkJfSAqLworLyogT0JTT0xFVEUgCX0gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgCS8qIEhhbmRsZSB1bmRlZmluZWQgaW5zdHJ1Y3Rpb25zLiAgKngvICovCisvKiBPQlNPTEVURSAJaWYgKGluZGV4IDwgMCkgKi8KKy8qIE9CU09MRVRFIAl7ICovCisvKiBPQlNPTEVURSAJCWZwcmludGYgKHN0cmVhbSwgInVuZGVmaW5lZCAgIDAlbyIsKGJ1ZmZlclswXTw8OCkrYnVmZmVyWzFdKTsgKi8KKy8qIE9CU09MRVRFIAkJcmV0dXJuIDI7ICovCisvKiBPQlNPTEVURSAJfSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAJLyogUHJpbnQgaW5zdHJ1Y3Rpb24gbmFtZSAqeC8gKi8KKy8qIE9CU09MRVRFIAlmcHJpbnRmIChzdHJlYW0sICIlLTEycyIsIGdsZF9vcGNvZGVzW2luZGV4XS5uYW1lKTsgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgCS8qIEFkanVzdCBpZiBzaG9ydCBpbnN0cnVjdGlvbiAqeC8gKi8KKy8qIE9CU09MRVRFIAlpZiAoZ2xkX29wY29kZXNbaW5kZXhdLmxlbmd0aCA8IDQpICovCisvKiBPQlNPTEVURSAJeyAqLworLyogT0JTT0xFVEUgCQliZXN0ID4+PSAxNjsgKi8KKy8qIE9CU09MRVRFIAkJaSA9IDA7ICovCisvKiBPQlNPTEVURSAJfSAqLworLyogT0JTT0xFVEUgCWVsc2UgKi8KKy8qIE9CU09MRVRFIAl7ICovCisvKiBPQlNPTEVURSAJCWkgPSAxNjsgKi8KKy8qIE9CU09MRVRFIAl9ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIAkvKiBEdW1wIG91dCBpbnN0cnVjdGlvbiBhcmd1bWVudHMgKngvICovCisvKiBPQlNPTEVURSAgIAlmb3IgKGQgPSBnbGRfb3Bjb2Rlc1tpbmRleF0uYXJnczsgKmQ7ICsrZCkgKi8KKy8qIE9CU09MRVRFIAl7ICovCisvKiBPQlNPTEVURSAJICAgIHN3aXRjaCAoKmQpICovCisvKiBPQlNPTEVURSAJICAgIHsgKi8KKy8qIE9CU09MRVRFIAkJY2FzZSAnZic6ICovCisvKiBPQlNPTEVURSAJCSAgICBmcHJpbnRmIChzdHJlYW0sICIlZCIsICAoYmVzdCA+PiAoNyArIGkpKSAmIDcpOyAqLworLyogT0JTT0xFVEUgCQkgICAgYnJlYWs7ICovCisvKiBPQlNPTEVURSAJCWNhc2UgJ3InOiAqLworLyogT0JTT0xFVEUgCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiciVkIiwgKGJlc3QgPj4gKDcgKyBpKSkgJiA3KTsgKi8KKy8qIE9CU09MRVRFIAkJICAgIGJyZWFrOyAqLworLyogT0JTT0xFVEUgCQljYXNlICdSJzogKi8KKy8qIE9CU09MRVRFIAkJICAgIGZwcmludGYgKHN0cmVhbSwgInIlZCIsIChiZXN0ID4+ICg0ICsgaSkpICYgNyk7ICovCisvKiBPQlNPTEVURSAJCSAgICBicmVhazsgKi8KKy8qIE9CU09MRVRFIAkJY2FzZSAnYic6ICovCisvKiBPQlNPTEVURSAJCSAgICBmcHJpbnRmIChzdHJlYW0sICJiJWQiLCAoYmVzdCA+PiAoNyArIGkpKSAmIDcpOyAqLworLyogT0JTT0xFVEUgCQkgICAgYnJlYWs7ICovCisvKiBPQlNPTEVURSAJCWNhc2UgJ0InOiAqLworLyogT0JTT0xFVEUgCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiYiVkIiwgKGJlc3QgPj4gKDQgKyBpKSkgJiA3KTsgKi8KKy8qIE9CU09MRVRFIAkJICAgIGJyZWFrOyAqLworLyogT0JTT0xFVEUgCQljYXNlICd2JzogKi8KKy8qIE9CU09MRVRFIAkJICAgIGZwcmludGYgKHN0cmVhbSwgImIlZCIsIChiZXN0ID4+ICg3ICsgaSkpICYgNyk7ICovCisvKiBPQlNPTEVURSAJCSAgICBicmVhazsgKi8KKy8qIE9CU09MRVRFIAkJY2FzZSAnVic6ICovCisvKiBPQlNPTEVURSAJCSAgICBmcHJpbnRmIChzdHJlYW0sICJiJWQiLCAoYmVzdCA+PiAoNCArIGkpKSAmIDcpOyAqLworLyogT0JTT0xFVEUgCQkgICAgYnJlYWs7ICovCisvKiBPQlNPTEVURSAJCWNhc2UgJ1gnOiAqLworLyogT0JTT0xFVEUgCQkgICAgdGVtcCA9IChiZXN0ID4+IDIwKSAmIDc7ICovCisvKiBPQlNPTEVURSAJCSAgICBpZiAodGVtcCkgKi8KKy8qIE9CU09MRVRFIAkJCWZwcmludGYgKHN0cmVhbSwgInIlZCIsIHRlbXApOyAqLworLyogT0JTT0xFVEUgCQkgICAgZWxzZSAqLworLyogT0JTT0xFVEUgCQkJcHV0YyAoJzAnLCBzdHJlYW0pOyAqLworLyogT0JTT0xFVEUgCQkgICAgYnJlYWs7ICovCisvKiBPQlNPTEVURSAJCWNhc2UgJ0EnOiAqLworLyogT0JTT0xFVEUgCQkgICAgdGVtcCA9IChiZXN0ID4+IDE2KSAmIDc7ICovCisvKiBPQlNPTEVURSAJCSAgICBpZiAodGVtcCkgKi8KKy8qIE9CU09MRVRFIAkJCWZwcmludGYgKHN0cmVhbSwgIihiJWQpIiwgdGVtcCk7ICovCisvKiBPQlNPTEVURSAJCSAgICBicmVhazsgKi8KKy8qIE9CU09MRVRFIAkJY2FzZSAnUyc6ICovCisvKiBPQlNPTEVURSAJCSAgICBmcHJpbnRmIChzdHJlYW0sICIjJWQiLCBiZXN0ICYgMHgxZik7ICovCisvKiBPQlNPTEVURSAJCSAgICBicmVhazsgKi8KKy8qIE9CU09MRVRFIAkJY2FzZSAnSSc6ICovCisvKiBPQlNPTEVURSAJCSAgICBmcHJpbnRmIChzdHJlYW0sICIjJXgiLCBiZXN0ICYgMHhmZmZmKTsgKi8KKy8qIE9CU09MRVRFIAkJICAgIGJyZWFrOyAqLworLyogT0JTT0xFVEUgCQljYXNlICdPJzogKi8KKy8qIE9CU09MRVRFIAkJICAgIGZwcmludGYgKHN0cmVhbSwgIiV4IiwgYmVzdCAmIDB4ZmZmZik7ICovCisvKiBPQlNPTEVURSAJCSAgICBicmVhazsgKi8KKy8qIE9CU09MRVRFIAkJY2FzZSAnaCc6ICovCisvKiBPQlNPTEVURSAJCSAgICBmcHJpbnRmIChzdHJlYW0sICIlZCIsIGJlc3QgJiAweGZmZmUpOyAqLworLyogT0JTT0xFVEUgCQkgICAgYnJlYWs7ICovCisvKiBPQlNPTEVURSAJCWNhc2UgJ2QnOiAqLworLyogT0JTT0xFVEUgCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiJWQiLCBiZXN0ICYgMHhmZmZjKTsgKi8KKy8qIE9CU09MRVRFIAkJICAgIGJyZWFrOyAqLworLyogT0JTT0xFVEUgCQljYXNlICdUJzogKi8KKy8qIE9CU09MRVRFIAkJICAgIGZwcmludGYgKHN0cmVhbSwgIiVkIiwgKGJlc3QgPj4gOCkgJiAweGZmKTsgKi8KKy8qIE9CU09MRVRFIAkJICAgIGJyZWFrOyAqLworLyogT0JTT0xFVEUgCQljYXNlICdOJzogKi8KKy8qIE9CU09MRVRFIAkJICAgIGZwcmludGYgKHN0cmVhbSwgIiVkIiwgYmVzdCAmIDB4ZmYpOyAqLworLyogT0JTT0xFVEUgCQkgICAgYnJlYWs7ICovCisvKiBPQlNPTEVURSAJCWRlZmF1bHQ6ICovCisvKiBPQlNPTEVURSAJCSAgICBwdXRjICgqZCwgc3RyZWFtKTsgKi8KKy8qIE9CU09MRVRFIAkJICAgIGJyZWFrOyAqLworLyogT0JTT0xFVEUgCSAgICB9ICovCisvKiBPQlNPTEVURSAJfSAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAJLyogUmV0dXJuIGxlbmd0aCBvZiBpbnN0cnVjdGlvbiAqeC8gKi8KKy8qIE9CU09MRVRFICAgCXJldHVybiAoZ2xkX29wY29kZXNbaW5kZXhdLmxlbmd0aCk7ICovCisvKiBPQlNPTEVURSB9ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qICovCisvKiBPQlNPTEVURSAgKiBGaW5kIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGEgZnVuY3Rpb24uICovCisvKiBPQlNPTEVURSAgKngvICovCisvKiBPQlNPTEVURSBmaW5kYXJnKGZyYW1lKSAqLworLyogT0JTT0xFVEUgCXN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsgKi8KKy8qIE9CU09MRVRFIHsgKi8KKy8qIE9CU09MRVRFIAlyZWdpc3RlciBzdHJ1Y3Qgc3ltYm9sICpmdW5jOyAqLworLyogT0JTT0xFVEUgCXJlZ2lzdGVyIHVuc2lnbmVkIHBjOyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjaWZkZWYgbm90ZGVmICovCisvKiBPQlNPTEVURSAJLyogZmluZCBzdGFydGluZyBhZGRyZXNzIG9mIGZyYW1lIGZ1bmN0aW9uICp4LyAqLworLyogT0JTT0xFVEUgCXBjID0gZ2V0X3BjX2Z1bmN0aW9uX3N0YXJ0IChmcmFtZS0+cGMpOyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAJLyogZmluZCBmdW5jdGlvbiBzeW1ib2wgaW5mbyAqeC8gKi8KKy8qIE9CU09MRVRFIAlmdW5jID0gZmluZF9wY19mdW5jdGlvbiAocGMpOyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAJLyogY2FsbCBibG9ja2ZyYW1lIGNvZGUgdG8gbG9vayBmb3IgbWF0Y2ggKngvICovCisvKiBPQlNPTEVURSAJaWYgKGZ1bmMgIT0gTlVMTCkgKi8KKy8qIE9CU09MRVRFICAgICAgICAgICAgICAgICByZXR1cm4gKGZ1bmMtPnZhbHVlLmJsb2NrLT5uc3ltcyAvIHNpemVvZihpbnQpKTsgKi8KKy8qIE9CU09MRVRFICNlbmRpZiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAgICAgICAgIHJldHVybiAoLTEpOyAqLworLyogT0JTT0xFVEUgfSAgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgLyogKi8KKy8qIE9CU09MRVRFICAqIEluIHRoZSBjYXNlIG9mIHRoZSBOUEwsIHRoZSBmcmFtZSdzIG5vcm1pbmFsIGFkZHJlc3MgaXMgQnIyIGFuZCB0aGUgICovCisvKiBPQlNPTEVURSAgKiBwcmV2aW91cyByb3V0aW5lcyBmcmFtZSBpcyB1cCB0aGUgc3RhY2sgWCBieXRlcy4gIEZpbmRpbmcgb3V0IHdoYXQgKi8KKy8qIE9CU09MRVRFICAqICdYJyBpcyBjYW4gYmUgdHJpY2t5LiAqLworLyogT0JTT0xFVEUgICogKi8KKy8qIE9CU09MRVRFICAqICAgIDEuKSBzdG9yZWQgaW4gdGhlIGNvZGUgZnVuY3Rpb24gaGVhZGVyIHhBKEJyMSkuICovCisvKiBPQlNPTEVURSAgKiAgICAyLikgbXVzdCBiZSBjYXJlZnVsIG9mIHJlY3Vyc3Npb24uICovCisvKiBPQlNPTEVURSAgKngvICovCisvKiBPQlNPTEVURSBDT1JFX0FERFIgKi8KKy8qIE9CU09MRVRFIGZpbmRmcmFtZSh0aGlzZnJhbWUpICovCisvKiBPQlNPTEVURSAgICAgc3RydWN0IGZyYW1lX2luZm8gKnRoaXNmcmFtZTsgKi8KKy8qIE9CU09MRVRFIHsgKi8KKy8qIE9CU09MRVRFICAgICByZWdpc3RlciBDT1JFX0FERFIgcG9pbnRlcjsgKi8KKy8qIE9CU09MRVRFICAgICBDT1JFX0FERFIgZnJhbWVjaGFpbigpOyAqLworLyogT0JTT0xFVEUgI2lmIDAgICAgICovCisvKiBPQlNPTEVURSAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAgICAgLyogU2V0dXAgdG9wbGV2ZWwgZnJhbWUgc3RydWN0dXJlICp4LyAqLworLyogT0JTT0xFVEUgICAgIGZyYW1lLT5wYyA9IHJlYWRfcGMoKTsgKi8KKy8qIE9CU09MRVRFICAgICBmcmFtZS0+bmV4dF9mcmFtZSA9IDA7ICovCisvKiBPQlNPTEVURSAgICAgZnJhbWUtPmZyYW1lID0gcmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKTsJLyogQnIyICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAgICAgLyogU2VhcmNoIGZvciB0aGlzIGZyYW1lIChzdGFydCBhdCBjdXJyZW50IEJyMikgKngvICovCisvKiBPQlNPTEVURSAgICAgZG8gKi8KKy8qIE9CU09MRVRFICAgICB7ICovCisvKiBPQlNPTEVURSAJcG9pbnRlciA9IGZyYW1lY2hhaW4oZnJhbWUpOyAqLworLyogT0JTT0xFVEUgCWZyYW1lLT5uZXh0X2ZyYW1lID0gZnJhbWUtPmZyYW1lOyAqLworLyogT0JTT0xFVEUgCWZyYW1lLT5mcmFtZSA9IHBvaW50ZXI7ICovCisvKiBPQlNPTEVURSAJZnJhbWUtPnBjID0gRlJBTUVfU0FWRURfUEMoZnJhbWUpOyAqLworLyogT0JTT0xFVEUgICAgIH0gKi8KKy8qIE9CU09MRVRFICAgICB3aGlsZSAoZnJhbWUtPm5leHRfZnJhbWUgIT0gdGhpc2ZyYW1lKTsgKi8KKy8qIE9CU09MRVRFICNlbmRpZiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAgICAgcG9pbnRlciA9IGZyYW1lY2hhaW4gKHRoaXNmcmFtZSk7ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICAgICAvKiBzdG9wIGdhcCBmb3Igbm93LCBlbmQgYXQgX19iYXNlMyAqeC8gKi8KKy8qIE9CU09MRVRFICAgICBpZiAodGhpc2ZyYW1lLT5wYyA9PSAwKSAqLworLyogT0JTT0xFVEUgCXJldHVybiAwOyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAgICAgcmV0dXJuIHBvaW50ZXI7ICovCisvKiBPQlNPTEVURSB9ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIC8qICovCisvKiBPQlNPTEVURSAgKiBHZGIgZnJvbnQtZW5kIGFuZCBpbnRlcm5hbCBmcmFtZWNoYWluIHJvdXRpbmUuICovCisvKiBPQlNPTEVURSAgKiBHbyBiYWNrIHVwIHN0YWNrIG9uZSBsZXZlbC4gIFRyaWNreS4uLiAqLworLyogT0JTT0xFVEUgICp4LyAqLworLyogT0JTT0xFVEUgQ09SRV9BRERSICovCisvKiBPQlNPTEVURSBmcmFtZWNoYWluKGZyYW1lKSAqLworLyogT0JTT0xFVEUgICAgIHJlZ2lzdGVyIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsgKi8KKy8qIE9CU09MRVRFIHsgKi8KKy8qIE9CU09MRVRFICAgICByZWdpc3RlciBDT1JFX0FERFIgZnVuYywgcHJldnNwOyAqLworLyogT0JTT0xFVEUgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIHZhbHVlOyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAgICAgLyogR2V0IHJlYWwgZnVuY3Rpb24gc3RhcnQgYWRkcmVzcyBmcm9tIGludGVybmFsIGZyYW1lIGFkZHJlc3MgKngvICovCisvKiBPQlNPTEVURSAgICAgZnVuYyA9IGdldF9wY19mdW5jdGlvbl9zdGFydChmcmFtZS0+cGMpOyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAgICAgLyogSWYgbm8gc3RhY2sgZ2l2ZW4sIHJlYWQgcmVnaXN0ZXIgQnIxICIoc3ApIiAqeC8gKi8KKy8qIE9CU09MRVRFICAgICBpZiAoIWZyYW1lLT5mcmFtZSkgKi8KKy8qIE9CU09MRVRFIAlwcmV2c3AgPSByZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pOyAqLworLyogT0JTT0xFVEUgICAgIGVsc2UgKi8KKy8qIE9CU09MRVRFIAlwcmV2c3AgPSBmcmFtZS0+ZnJhbWU7ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICAgICAvKiBDaGVjayBmdW5jdGlvbiBoZWFkZXIsIGNhc2UgIzIgKngvICovCisvKiBPQlNPTEVURSAgICAgdmFsdWUgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChmdW5jLCA0KTsgKi8KKy8qIE9CU09MRVRFICAgICBpZiAodmFsdWUpICovCisvKiBPQlNPTEVURSAgICAgeyAqLworLyogT0JTT0xFVEUgCS8qIDMyYml0IGNhbGwgcHVzaCB2YWx1ZSBzdG9yZWQgaW4gZnVuY3Rpb24gaGVhZGVyICp4LyAqLworLyogT0JTT0xFVEUgCXByZXZzcCArPSB2YWx1ZTsgKi8KKy8qIE9CU09MRVRFICAgICB9ICovCisvKiBPQlNPTEVURSAgICAgZWxzZSAqLworLyogT0JTT0xFVEUgICAgIHsgKi8KKy8qIE9CU09MRVRFIAkvKiByZWFkIGhhbGYtd29yZCBmcm9tIHN1YWJyIGF0IHN0YXJ0IG9mIGZ1bmN0aW9uICp4LyAqLworLyogT0JTT0xFVEUgCXByZXZzcCArPSByZWFkX21lbW9yeV9pbnRlZ2VyIChmdW5jICsgMTAsIDIpOyAqLworLyogT0JTT0xFVEUgICAgIH0gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgICAgIHJldHVybiAocHJldnNwKTsgKi8KKy8qIE9CU09MRVRFIH0gKi8KZGlmZiAtLWdpdCBhL2dkYi9nb3VsZC14ZGVwLmMgYi9nZGIvZ291bGQteGRlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNDc1OGYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvZ291bGQteGRlcC5jCkBAIC0wLDAgKzEsMTMwIEBACisvKiBPQlNPTEVURSAvKiBMb3cgbGV2ZWwgaW50ZXJmYWNlIHRvIHB0cmFjZSwgZm9yIEdEQiB3aGVuIHJ1bm5pbmcgdW5kZXIgVW5peC4gKi8KKy8qIE9CU09MRVRFICAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAqLworLyogT0JTT0xFVEUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgKi8KKy8qIE9CU09MRVRFIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICovCisvKiBPQlNPTEVURSAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgKi8KKy8qIE9CU09MRVRFIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICovCisvKiBPQlNPTEVURSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICovCisvKiBPQlNPTEVURSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAqLworLyogT0JTT0xFVEUgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgKi8KKy8qIE9CU09MRVRFIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqeC8gKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgI2luY2x1ZGUgImRlZnMuaCIgKi8KKy8qIE9CU09MRVRFICNpbmNsdWRlICJmcmFtZS5oIiAqLworLyogT0JTT0xFVEUgI2luY2x1ZGUgImluZmVyaW9yLmgiICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICNpbmNsdWRlIDxzeXMvcGFyYW0uaD4gKi8KKy8qIE9CU09MRVRFICNpbmNsdWRlIDxzeXMvZGlyLmg+ICovCisvKiBPQlNPTEVURSAjaW5jbHVkZSA8c2lnbmFsLmg+ICovCisvKiBPQlNPTEVURSAjaW5jbHVkZSA8c3lzL3VzZXIuaD4gKi8KKy8qIE9CU09MRVRFICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4gKi8KKy8qIE9CU09MRVRFICNpbmNsdWRlIDxmY250bC5oPiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjaW5jbHVkZSAiZ2RiY29yZS5oIiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAjaW5jbHVkZSA8c3lzL2ZpbGUuaD4gKi8KKy8qIE9CU09MRVRFICNpbmNsdWRlICJnZGJfc3RhdC5oIiAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAMICovCisvKiBPQlNPTEVURSAvKiBXb3JrIHdpdGggY29yZSBkdW1wIGFuZCBleGVjdXRhYmxlIGZpbGVzLCBmb3IgR0RCLiAgKi8KKy8qIE9CU09MRVRFICAgIFRoaXMgY29kZSB3b3VsZCBiZSBpbiBjb3JlZmlsZS5jIGlmIGl0IHdlcmVuJ3QgbWFjaGluZS1kZXBlbmRlbnQuICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSB2b2lkICovCisvKiBPQlNPTEVURSBjb3JlX2ZpbGVfY29tbWFuZCAoZmlsZW5hbWUsIGZyb21fdHR5KSAqLworLyogT0JTT0xFVEUgICAgICBjaGFyICpmaWxlbmFtZTsgKi8KKy8qIE9CU09MRVRFICAgICAgaW50IGZyb21fdHR5OyAqLworLyogT0JTT0xFVEUgeyAqLworLyogT0JTT0xFVEUgICBpbnQgdmFsOyAqLworLyogT0JTT0xFVEUgICBleHRlcm4gY2hhciByZWdpc3RlcnNbXTsgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgICAvKiBEaXNjYXJkIGFsbCB2ZXN0aWdlcyBvZiBhbnkgcHJldmlvdXMgY29yZSBmaWxlICovCisvKiBPQlNPTEVURSAgICAgIGFuZCBtYXJrIGRhdGEgYW5kIHN0YWNrIHNwYWNlcyBhcyBlbXB0eS4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAgIGlmIChjb3JlZmlsZSkgKi8KKy8qIE9CU09MRVRFICAgICBmcmVlIChjb3JlZmlsZSk7ICovCisvKiBPQlNPTEVURSAgIGNvcmVmaWxlID0gMDsgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgICBpZiAoY29yZWNoYW4gPj0gMCkgKi8KKy8qIE9CU09MRVRFICAgICBjbG9zZSAoY29yZWNoYW4pOyAqLworLyogT0JTT0xFVEUgICBjb3JlY2hhbiA9IC0xOyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAgIGRhdGFfc3RhcnQgPSAwOyAqLworLyogT0JTT0xFVEUgICBkYXRhX2VuZCA9IDA7ICovCisvKiBPQlNPTEVURSAgIHN0YWNrX3N0YXJ0ID0gU1RBQ0tfRU5EX0FERFI7ICovCisvKiBPQlNPTEVURSAgIHN0YWNrX2VuZCA9IFNUQUNLX0VORF9BRERSOyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAgIC8qIE5vdywgaWYgYSBuZXcgY29yZSBmaWxlIHdhcyBzcGVjaWZpZWQsIG9wZW4gaXQgYW5kIGRpZ2VzdCBpdC4gICp4LyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAgIGlmIChmaWxlbmFtZSkgKi8KKy8qIE9CU09MRVRFICAgICB7ICovCisvKiBPQlNPTEVURSAgICAgICBmaWxlbmFtZSA9IHRpbGRlX2V4cGFuZCAoZmlsZW5hbWUpOyAqLworLyogT0JTT0xFVEUgICAgICAgbWFrZV9jbGVhbnVwIChmcmVlLCBmaWxlbmFtZSk7ICovCisvKiBPQlNPTEVURSAgICAgICAgKi8KKy8qIE9CU09MRVRFICAgICAgIGlmIChoYXZlX2luZmVyaW9yX3AgKCkpICovCisvKiBPQlNPTEVURSAJZXJyb3IgKCJUbyBsb29rIGF0IGEgY29yZSBmaWxlLCB5b3UgbXVzdCBraWxsIHRoZSBwcm9ncmFtIHdpdGggXCJraWxsXCIuIik7ICovCisvKiBPQlNPTEVURSAgICAgICBjb3JlY2hhbiA9IG9wZW4gKGZpbGVuYW1lLCBPX1JET05MWSwgMCk7ICovCisvKiBPQlNPTEVURSAgICAgICBpZiAoY29yZWNoYW4gPCAwKSAqLworLyogT0JTT0xFVEUgCXBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsgKi8KKy8qIE9CU09MRVRFICAgICAgIC8qIDQuMi1zdHlsZSAoYW5kIHBlcmhhcHMgYWxzbyBzeXNWLXN0eWxlKSBjb3JlIGR1bXAgZmlsZS4gICp4LyAqLworLyogT0JTT0xFVEUgICAgICAgeyAqLworLyogT0JTT0xFVEUgCXN0cnVjdCB1c2VyIHU7ICovCisvKiBPQlNPTEVURSAJaW50IHJlZ19vZmZzZXQ7ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIAl2YWwgPSBteXJlYWQgKGNvcmVjaGFuLCAmdSwgc2l6ZW9mIHUpOyAqLworLyogT0JTT0xFVEUgCWlmICh2YWwgPCAwKSAqLworLyogT0JTT0xFVEUgCSAgcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOyAqLworLyogT0JTT0xFVEUgCWRhdGFfc3RhcnQgPSBleGVjX2RhdGFfc3RhcnQ7ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIAlkYXRhX2VuZCA9IGRhdGFfc3RhcnQgKyBOQlBHICogdS51X2RzaXplOyAqLworLyogT0JTT0xFVEUgCXN0YWNrX3N0YXJ0ID0gc3RhY2tfZW5kIC0gTkJQRyAqIHUudV9zc2l6ZTsgKi8KKy8qIE9CU09MRVRFIAlkYXRhX29mZnNldCA9IE5CUEcgKiBVUEFHRVM7ICovCisvKiBPQlNPTEVURSAJc3RhY2tfb2Zmc2V0ID0gTkJQRyAqIChVUEFHRVMgKyB1LnVfZHNpemUpOyAqLworLyogT0JTT0xFVEUgCXJlZ19vZmZzZXQgPSAoaW50KSB1LnVfYXIwIC0gS0VSTkVMX1VfQUREUjsgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgCS8qIEkgZG9uJ3Qga25vdyB3aGVyZSB0byBmaW5kIHRoaXMgaW5mby4gKi8KKy8qIE9CU09MRVRFIAkgICBTbywgZm9yIG5vdywgbWFyayBpdCBhcyBub3QgYXZhaWxhYmxlLiAgKngvICovCisvKiBPQlNPTEVURSAJY29yZV9hb3V0aGRyLmFfbWFnaWMgPSAwOyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAJLyogUmVhZCB0aGUgcmVnaXN0ZXIgdmFsdWVzIG91dCBvZiB0aGUgY29yZSBmaWxlIGFuZCBzdG9yZSAqLworLyogT0JTT0xFVEUgCSAgIHRoZW0gd2hlcmUgYHJlYWRfcmVnaXN0ZXInIHdpbGwgZmluZCB0aGVtLiAgKngvICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIAl7ICovCisvKiBPQlNPTEVURSAJICByZWdpc3RlciBpbnQgcmVnbm87ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFIAkgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IE5VTV9SRUdTOyByZWdubysrKSAqLworLyogT0JTT0xFVEUgCSAgICB7ICovCisvKiBPQlNPTEVURSAJICAgICAgY2hhciBidWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsgKi8KKy8qIE9CU09MRVRFICAqLworLyogT0JTT0xFVEUgCSAgICAgIHZhbCA9IGxzZWVrIChjb3JlY2hhbiwgcmVnaXN0ZXJfYWRkciAocmVnbm8sIHJlZ19vZmZzZXQpLCAwKTsgKi8KKy8qIE9CU09MRVRFIAkgICAgICBpZiAodmFsIDwgMCkgKi8KKy8qIE9CU09MRVRFIAkJcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOyAqLworLyogT0JTT0xFVEUgICovCisvKiBPQlNPTEVURSAgCSAgICAgIHZhbCA9IG15cmVhZCAoY29yZWNoYW4sIGJ1Ziwgc2l6ZW9mIGJ1Zik7ICovCisvKiBPQlNPTEVURSAJICAgICAgaWYgKHZhbCA8IDApICovCisvKiBPQlNPTEVURSAJCXBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsgKi8KKy8qIE9CU09MRVRFIAkgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCBidWYpOyAqLworLyogT0JTT0xFVEUgCSAgICB9ICovCisvKiBPQlNPTEVURSAJfSAqLworLyogT0JTT0xFVEUgICAgICAgfSAqLworLyogT0JTT0xFVEUgICAgICAgaWYgKGZpbGVuYW1lWzBdID09ICcvJykgKi8KKy8qIE9CU09MRVRFIAljb3JlZmlsZSA9IHNhdmVzdHJpbmcgKGZpbGVuYW1lLCBzdHJsZW4gKGZpbGVuYW1lKSk7ICovCisvKiBPQlNPTEVURSAgICAgICBlbHNlICovCisvKiBPQlNPTEVURSAJeyAqLworLyogT0JTT0xFVEUgCSAgY29yZWZpbGUgPSBjb25jYXQgKGN1cnJlbnRfZGlyZWN0b3J5LCAiLyIsIGZpbGVuYW1lLCBOVUxMKTsgKi8KKy8qIE9CU09MRVRFIAl9ICovCisvKiBPQlNPTEVURSAgKi8KKy8qIE9CU09MRVRFICAgICAgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7ICovCisvKiBPQlNPTEVURSAgICAgICBzZWxlY3RfZnJhbWUgKGdldF9jdXJyZW50X2ZyYW1lICgpLCAwKTsgKi8KKy8qIE9CU09MRVRFICAgICAgIHZhbGlkYXRlX2ZpbGVzICgpOyAqLworLyogT0JTT0xFVEUgICAgIH0gKi8KKy8qIE9CU09MRVRFICAgZWxzZSBpZiAoZnJvbV90dHkpICovCisvKiBPQlNPTEVURSAgICAgcHJpbnRmICgiTm8gY29yZSBmaWxlIG5vdy5cbiIpOyAqLworLyogT0JTT0xFVEUgfSAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2g4MzAwLXRkZXAuYyBiL2dkYi9oODMwMC10ZGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZiZTllMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9oODMwMC10ZGVwLmMKQEAgLTAsMCArMSw5MjEgQEAKKy8qIFRhcmdldC1tYWNoaW5lIGRlcGVuZGVudCBjb2RlIGZvciBIaXRhY2hpIEg4LzMwMCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAoQykgMTk4OCwgMTk5MCwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCisgICAgICAgICAgICAgICAgc2FjQGN5Z251cy5jb20KKyAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAib2JzdGFjay5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImRpcy1hc20uaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKworZXh0ZXJuIGludCBoODMwMGhtb2RlLCBoODMwMHNtb2RlOworCisjdW5kZWYgTlVNX1JFR1MKKyNkZWZpbmUgTlVNX1JFR1MgMTEKKworI2RlZmluZSBVTlNJR05FRF9TSE9SVChYKSAoKFgpICYgMHhmZmZmKQorCisjZGVmaW5lIElTX1BVU0goeCkgKCh4ICYgMHhmZmYwKT09MHg2ZGYwKQorI2RlZmluZSBJU19QVVNIX0ZQKHgpICh4ID09IDB4NmRmNikKKyNkZWZpbmUgSVNfTU9WRV9GUCh4KSAoeCA9PSAweDBkNzYgfHwgeCA9PSAweDBmZjYpCisjZGVmaW5lIElTX01PVl9TUF9GUCh4KSAoeCA9PSAweDBkNzYgfHwgeCA9PSAweDBmZjYpCisjZGVmaW5lIElTX1NVQjJfU1AoeCkgKHg9PTB4MWI4NykKKyNkZWZpbmUgSVNfU1VCNF9TUCh4KSAoeD09MHgxYjk3KQorI2RlZmluZSBJU19TVUJMX1NQKHgpICh4PT0weDdhMzcpCisjZGVmaW5lIElTX01PVktfUjUoeCkgKHg9PTB4NzkwNSkKKyNkZWZpbmUgSVNfU1VCX1I1U1AoeCkgKHg9PTB4MTk1NykKKworCisvKiBUaGUgcmVnaXN0ZXIgbmFtZXMgY2hhbmdlIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBoODMwMGggcHJvY2Vzc29yCisgICB0eXBlIGlzIHNlbGVjdGVkLiAqLworCitzdGF0aWMgY2hhciAqb3JpZ2luYWxfcmVnaXN0ZXJfbmFtZXNbXSA9IFJFR0lTVEVSX05BTUVTOworCitzdGF0aWMgY2hhciAqaDgzMDBoX3JlZ2lzdGVyX25hbWVzW10gPQorICB7ImVyMCIsICJlcjEiLCAiZXIyIiwgImVyMyIsICJlcjQiLCAiZXI1IiwgImVyNiIsCisgICAgInNwIiwgImNjciIsInBjIiwiY3ljbGVzIiwidGljayIsImluc3QiIH07CisKK2NoYXIgKipoODMwMF9yZWdpc3Rlcl9uYW1lcyA9IG9yaWdpbmFsX3JlZ2lzdGVyX25hbWVzOworCisKKy8qIExvY2FsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4gICovCisKK3N0YXRpYyBDT1JFX0FERFIgZXhhbWluZV9wcm9sb2d1ZSAoKTsKK3N0YXRpYyB2b2lkIHNldF9tYWNoaW5lX2hvb2sgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKKwordm9pZCBoODMwMF9mcmFtZV9maW5kX3NhdmVkX3JlZ3MgKCk7CisKK0NPUkVfQUREUiAKK2g4MzAwX3NraXBfcHJvbG9ndWUgKHN0YXJ0X3BjKQorICAgICBDT1JFX0FERFIgc3RhcnRfcGM7Cit7CisgIHNob3J0IGludCB3OworICBpbnQgYWRqdXN0ID0gMDsKKworICAvKiBTa2lwIHBhc3QgYWxsIHB1c2ggYW5kIHN0bSBpbnNucy4gICovCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIHcgPSByZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyIChzdGFydF9wYywgMik7CisgICAgICAvKiBGaXJzdCBsb29rIGZvciBwdXNoIGluc25zLiAgKi8KKyAgICAgIGlmICh3ID09IDB4MDEwMCB8fCB3ID09IDB4MDExMCB8fCB3ID09IDB4MDEyMCB8fCB3ID09IDB4MDEzMCkKKwl7CisJICB3ID0gcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoc3RhcnRfcGMgKyAyLCAyKTsKKwkgIGFkanVzdCA9IDI7CisJfQorCisgICAgICBpZiAoSVNfUFVTSCAodykpCisJeworCSAgc3RhcnRfcGMgKz0gMiArIGFkanVzdDsKKwkgIHcgPSByZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyIChzdGFydF9wYywgMik7CisJICBjb250aW51ZTsKKwl9CisgICAgICBhZGp1c3QgPSAwOworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIFNraXAgcGFzdCBhIG1vdmUgdG8gRlAsIGVpdGhlciB3b3JkIG9yIGxvbmcgc2l6ZWQgKi8KKyAgdyA9IHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKHN0YXJ0X3BjLCAyKTsKKyAgaWYgKHcgPT0gMHgwMTAwKQorICAgIHsKKyAgICAgIHcgPSByZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyIChzdGFydF9wYyArIDIsIDIpOworICAgICAgYWRqdXN0ICs9IDI7CisgICAgfQorCisgIGlmIChJU19NT1ZFX0ZQICh3KSkKKyAgICB7CisgICAgICBzdGFydF9wYyArPSAyICsgYWRqdXN0OworICAgICAgdyA9IHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKHN0YXJ0X3BjLCAyKTsKKyAgICB9CisKKyAgLyogQ2hlY2sgZm9yIGxvYWRpbmcgZWl0aGVyIGEgd29yZCBjb25zdGFudCBpbnRvIHI1OworICAgICBsb25nIHZlcnNpb25zIGFyZSBoYW5kbGVkIGJ5IHRoZSBTVUJMX1NQIGJlbG93LiAgKi8KKyAgaWYgKElTX01PVktfUjUgKHcpKQorICAgIHsKKyAgICAgIHN0YXJ0X3BjICs9IDI7CisgICAgICB3ID0gcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoc3RhcnRfcGMsIDIpOworICAgIH0KKworICAvKiBOb3cgY2hlY2sgZm9yIHN1YnRyYWN0aW5nIHI1IGZyb20gc3AsIHdvcmQgc2l6ZWQgb25seS4gICovCisgIGlmIChJU19TVUJfUjVTUCAodykpCisgICAgeworICAgICAgc3RhcnRfcGMgKz0gMiArIGFkanVzdDsKKyAgICAgIHcgPSByZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyIChzdGFydF9wYywgMik7CisgICAgfQorCisgIC8qIENoZWNrIGZvciBzdWJzICMyIGFuZCBzdWJzICM0LiAqLworICB3aGlsZSAoSVNfU1VCMl9TUCAodykgfHwgSVNfU1VCNF9TUCAodykpCisgICAgeworICAgICAgc3RhcnRfcGMgKz0gMiArIGFkanVzdDsKKyAgICAgIHcgPSByZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyIChzdGFydF9wYywgMik7CisgICAgfQorCisgIC8qIENoZWNrIGZvciBhIDMyYml0IHN1YnRyYWN0LiAgKi8KKyAgaWYgKElTX1NVQkxfU1AgKHcpKQorICAgIHN0YXJ0X3BjICs9IDYgKyBhZGp1c3Q7CisKKyAgcmV0dXJuIHN0YXJ0X3BjOworfQorCitpbnQKK2dkYl9wcmludF9pbnNuX2g4MzAwIChtZW1hZGRyLCBpbmZvKQorICAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIGlmIChoODMwMHNtb2RlKQorICAgIHJldHVybiBwcmludF9pbnNuX2g4MzAwcyAobWVtYWRkciwgaW5mbyk7CisgIGVsc2UgaWYgKGg4MzAwaG1vZGUpCisgICAgcmV0dXJuIHByaW50X2luc25faDgzMDBoIChtZW1hZGRyLCBpbmZvKTsKKyAgZWxzZQorICAgIHJldHVybiBwcmludF9pbnNuX2g4MzAwIChtZW1hZGRyLCBpbmZvKTsKK30KKworLyogR2l2ZW4gYSBHREIgZnJhbWUsIGRldGVybWluZSB0aGUgYWRkcmVzcyBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbidzIGZyYW1lLgorICAgVGhpcyB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgbmV3IEdEQiBmcmFtZSBzdHJ1Y3QsIGFuZCB0aGVuCisgICBJTklUX0VYVFJBX0ZSQU1FX0lORk8gYW5kIElOSVRfRlJBTUVfUEMgd2lsbCBiZSBjYWxsZWQgZm9yIHRoZSBuZXcgZnJhbWUuCisKKyAgIEZvciB1cywgdGhlIGZyYW1lIGFkZHJlc3MgaXMgaXRzIHN0YWNrIHBvaW50ZXIgdmFsdWUsIHNvIHdlIGxvb2sgdXAKKyAgIHRoZSBmdW5jdGlvbiBwcm9sb2d1ZSB0byBkZXRlcm1pbmUgdGhlIGNhbGxlcidzIHNwIHZhbHVlLCBhbmQgcmV0dXJuIGl0LiAgKi8KKworQ09SRV9BRERSCitoODMwMF9mcmFtZV9jaGFpbiAodGhpc2ZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqdGhpc2ZyYW1lOworeworICBpZiAoUENfSU5fQ0FMTF9EVU1NWSh0aGlzZnJhbWUtPnBjLCB0aGlzZnJhbWUtPmZyYW1lLCB0aGlzZnJhbWUtPmZyYW1lKSkKKyAgICB7IC8qIGluaXRpYWxpemUgdGhlIGZyb21fcGMgbm93ICovCisgICAgICB0aGlzZnJhbWUtPmZyb21fcGMgPSBnZW5lcmljX3JlYWRfcmVnaXN0ZXJfZHVtbXkgKHRoaXNmcmFtZS0+cGMsCisJCQkJCQkJdGhpc2ZyYW1lLT5mcmFtZSwgCisJCQkJCQkJUENfUkVHTlVNKTsKKyAgICAgIHJldHVybiB0aGlzZnJhbWUtPmZyYW1lOworICAgIH0KKyAgaDgzMDBfZnJhbWVfZmluZF9zYXZlZF9yZWdzICh0aGlzZnJhbWUsIChzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqKSAwKTsKKyAgcmV0dXJuIHRoaXNmcmFtZS0+ZnNyLT5yZWdzW1NQX1JFR05VTV07Cit9CisKKy8qIFB1dCBoZXJlIHRoZSBjb2RlIHRvIHN0b3JlLCBpbnRvIGEgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MsCisgICB0aGUgYWRkcmVzc2VzIG9mIHRoZSBzYXZlZCByZWdpc3RlcnMgb2YgZnJhbWUgZGVzY3JpYmVkIGJ5IEZSQU1FX0lORk8uCisgICBUaGlzIGluY2x1ZGVzIHNwZWNpYWwgcmVnaXN0ZXJzIHN1Y2ggYXMgcGMgYW5kIGZwIHNhdmVkIGluIHNwZWNpYWwKKyAgIHdheXMgaW4gdGhlIHN0YWNrIGZyYW1lLiAgc3AgaXMgZXZlbiBtb3JlIHNwZWNpYWw6CisgICB0aGUgYWRkcmVzcyB3ZSByZXR1cm4gZm9yIGl0IElTIHRoZSBzcCBmb3IgdGhlIG5leHQgZnJhbWUuCisKKyAgIFdlIGNhY2hlIHRoZSByZXN1bHQgb2YgZG9pbmcgdGhpcyBpbiB0aGUgZnJhbWVfb2JzdGFjaywgc2luY2UgaXQgaXMKKyAgIGZhaXJseSBleHBlbnNpdmUuICAqLworCit2b2lkCitoODMwMF9mcmFtZV9maW5kX3NhdmVkX3JlZ3MgKGZpLCBmc3IpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKKyAgICAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKmZzcjsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKmNhY2hlX2ZzcjsKKyAgQ09SRV9BRERSIGlwOworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKyAgQ09SRV9BRERSIGxpbWl0OworCisgIGlmICghZmktPmZzcikKKyAgICB7CisgICAgICBjYWNoZV9mc3IgPSAoc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKikKKwlmcmFtZV9vYnN0YWNrX2FsbG9jIChzaXplb2YgKHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzKSk7CisgICAgICBtZW1zZXQgKGNhY2hlX2ZzciwgJ1wwJywgc2l6ZW9mIChzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncykpOworCisgICAgICBmaS0+ZnNyID0gY2FjaGVfZnNyOworCisgICAgICBpZiAoUENfSU5fQ0FMTF9EVU1NWShmaS0+cGMsIGZpLT5mcmFtZSwgZmktPmZyYW1lKSkKKwl7CS8qIG5vIG1vcmUgdG8gZG8uICovCisJICBpZiAoZnNyKQorCSAgICAqZnNyID0gKmZpLT5mc3I7CisJICByZXR1cm47CisJfQorICAgICAgLyogRmluZCB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZnVuY3Rpb24gcHJvbG9ndWUuICBJZiB0aGUgUEMKKwkgaXMgaW4gdGhlIGZ1bmN0aW9uIHByb2xvZ3VlLCB3ZSBvbmx5IGNvbnNpZGVyIHRoZSBwYXJ0IHRoYXQKKwkgaGFzIGV4ZWN1dGVkIGFscmVhZHkuICAqLworCisgICAgICBpcCA9IGdldF9wY19mdW5jdGlvbl9zdGFydCAoZmktPnBjKTsKKyAgICAgIHNhbCA9IGZpbmRfcGNfbGluZSAoaXAsIDApOworICAgICAgbGltaXQgPSAoc2FsLmVuZCAmJiBzYWwuZW5kIDwgZmktPnBjKSA/IHNhbC5lbmQgOiBmaS0+cGM7CisKKyAgICAgIC8qIFRoaXMgd2lsbCBmaWxsIGluIGZpZWxkcyBpbiAqZmkgYXMgd2VsbCBhcyBpbiBjYWNoZV9mc3IuICAqLworICAgICAgZXhhbWluZV9wcm9sb2d1ZSAoaXAsIGxpbWl0LCBmaS0+ZnJhbWUsIGNhY2hlX2ZzciwgZmkpOworICAgIH0KKworICBpZiAoZnNyKQorICAgICpmc3IgPSAqZmktPmZzcjsKK30KKworLyogRmV0Y2ggdGhlIGluc3RydWN0aW9uIGF0IEFERFIsIHJldHVybmluZyAwIGlmIEFERFIgaXMgYmV5b25kIExJTSBvcgorICAgaXMgbm90IHRoZSBhZGRyZXNzIG9mIGEgdmFsaWQgaW5zdHJ1Y3Rpb24sIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0CisgICBpbnN0cnVjdGlvbiBiZXlvbmQgQUREUiBvdGhlcndpc2UuICAqUFdPUkQxIHJlY2VpdmVzIHRoZSBmaXJzdCB3b3JkCisgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uKi8KKworQ09SRV9BRERSCitORVhUX1BST0xPR1VFX0lOU04gKGFkZHIsIGxpbSwgcHdvcmQxKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgQ09SRV9BRERSIGxpbTsKKyAgICAgSU5TTl9XT1JEICpwd29yZDE7Cit7CisgIGNoYXIgYnVmWzJdOworICBpZiAoYWRkciA8IGxpbSArIDgpCisgICAgeworICAgICAgcmVhZF9tZW1vcnkgKGFkZHIsIGJ1ZiwgMik7CisgICAgICAqcHdvcmQxID0gZXh0cmFjdF9zaWduZWRfaW50ZWdlciAoYnVmLCAyKTsKKworICAgICAgcmV0dXJuIGFkZHIgKyAyOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIEV4YW1pbmUgdGhlIHByb2xvZ3VlIG9mIGEgZnVuY3Rpb24uICBgaXAnIHBvaW50cyB0byB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24uCisgICBgbGltaXQnIGlzIHRoZSBsaW1pdCBvZiB0aGUgcHJvbG9ndWUgKGUuZy4gdGhlIGFkZHIgb2YgdGhlIGZpcnN0CisgICBsaW5lbnVtYmVyLCBvciBwZXJoYXBzIHRoZSBwcm9ncmFtIGNvdW50ZXIgaWYgd2UncmUgc3RlcHBpbmcgdGhyb3VnaCkuCisgICBgZnJhbWVfc3AnIGlzIHRoZSBzdGFjayBwb2ludGVyIHZhbHVlIGluIHVzZSBpbiB0aGlzIGZyYW1lLgorICAgYGZzcicgaXMgYSBwb2ludGVyIHRvIGEgZnJhbWVfc2F2ZWRfcmVncyBzdHJ1Y3R1cmUgaW50byB3aGljaCB3ZSBwdXQKKyAgIGluZm8gYWJvdXQgdGhlIHJlZ2lzdGVycyBzYXZlZCBieSB0aGlzIGZyYW1lLgorICAgYGZpJyBpcyBhIHN0cnVjdCBmcmFtZV9pbmZvIHBvaW50ZXI7IHdlIGZpbGwgaW4gdmFyaW91cyBmaWVsZHMgaW4gaXQKKyAgIHRvIHJlZmxlY3QgdGhlIG9mZnNldHMgb2YgdGhlIGFyZyBwb2ludGVyIGFuZCB0aGUgbG9jYWxzIHBvaW50ZXIuICAqLworCitzdGF0aWMgQ09SRV9BRERSCitleGFtaW5lX3Byb2xvZ3VlIChpcCwgbGltaXQsIGFmdGVyX3Byb2xvZ19mcCwgZnNyLCBmaSkKKyAgICAgcmVnaXN0ZXIgQ09SRV9BRERSIGlwOworICAgICByZWdpc3RlciBDT1JFX0FERFIgbGltaXQ7CisgICAgIENPUkVfQUREUiBhZnRlcl9wcm9sb2dfZnA7CisgICAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICpmc3I7CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKK3sKKyAgcmVnaXN0ZXIgQ09SRV9BRERSIG5leHRfaXA7CisgIGludCByOworICBpbnQgaGF2ZV9mcCA9IDA7CisgIElOU05fV09SRCBpbnNuX3dvcmQ7CisgIC8qIE51bWJlciBvZiB0aGluZ3MgcHVzaGVkIG9udG8gc3RhY2ssIHN0YXJ0cyBhdCAyLzQsICdjYXVzZSB0aGUKKyAgICAgUEMgaXMgYWxyZWFkeSB0aGVyZSAqLworICB1bnNpZ25lZCBpbnQgcmVnX3NhdmVfZGVwdGggPSBoODMwMGhtb2RlID8gNCA6IDI7CisKKyAgdW5zaWduZWQgaW50IGF1dG9fZGVwdGggPSAwOwkvKiBOdW1iZXIgb2YgYnl0ZXMgb2YgYXV0b3MgKi8KKworICBjaGFyIGluX2ZyYW1lWzExXTsJCS8qIE9uZSBmb3IgZWFjaCByZWcgKi8KKworICBpbnQgYWRqdXN0ID0gMDsKKworICBtZW1zZXQgKGluX2ZyYW1lLCAxLCAxMSk7CisgIGZvciAociA9IDA7IHIgPCA4OyByKyspCisgICAgeworICAgICAgZnNyLT5yZWdzW3JdID0gMDsKKyAgICB9CisgIGlmIChhZnRlcl9wcm9sb2dfZnAgPT0gMCkKKyAgICB7CisgICAgICBhZnRlcl9wcm9sb2dfZnAgPSByZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pOworICAgIH0KKworICAvKiBJZiB0aGUgUEMgaXNuJ3QgdmFsaWQsIHF1aXQgbm93LiAgKi8KKyAgaWYgKGlwID09IDAgfHwgaXAgJiAoaDgzMDBobW9kZSA/IH4weGZmZmZmZiA6IH4weGZmZmYpKQorICAgIHJldHVybiAwOworCisgIG5leHRfaXAgPSBORVhUX1BST0xPR1VFX0lOU04gKGlwLCBsaW1pdCwgJmluc25fd29yZCk7CisKKyAgaWYgKGluc25fd29yZCA9PSAweDAxMDApCisgICAgeworICAgICAgaW5zbl93b3JkID0gcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoaXAgKyAyLCAyKTsKKyAgICAgIGFkanVzdCA9IDI7CisgICAgfQorCisgIC8qIFNraXAgb3ZlciBhbnkgZnAgcHVzaCBpbnN0cnVjdGlvbnMgKi8KKyAgZnNyLT5yZWdzWzZdID0gYWZ0ZXJfcHJvbG9nX2ZwOworICB3aGlsZSAobmV4dF9pcCAmJiBJU19QVVNIX0ZQIChpbnNuX3dvcmQpKQorICAgIHsKKyAgICAgIGlwID0gbmV4dF9pcCArIGFkanVzdDsKKworICAgICAgaW5fZnJhbWVbaW5zbl93b3JkICYgMHg3XSA9IHJlZ19zYXZlX2RlcHRoOworICAgICAgbmV4dF9pcCA9IE5FWFRfUFJPTE9HVUVfSU5TTiAoaXAsIGxpbWl0LCAmaW5zbl93b3JkKTsKKyAgICAgIHJlZ19zYXZlX2RlcHRoICs9IDIgKyBhZGp1c3Q7CisgICAgfQorCisgIC8qIElzIHRoaXMgYSBtb3ZlIGludG8gdGhlIGZwICovCisgIGlmIChuZXh0X2lwICYmIElTX01PVl9TUF9GUCAoaW5zbl93b3JkKSkKKyAgICB7CisgICAgICBpcCA9IG5leHRfaXA7CisgICAgICBuZXh0X2lwID0gTkVYVF9QUk9MT0dVRV9JTlNOIChpcCwgbGltaXQsICZpbnNuX3dvcmQpOworICAgICAgaGF2ZV9mcCA9IDE7CisgICAgfQorCisgIC8qIFNraXAgb3ZlciBhbnkgc3RhY2sgYWRqdXN0bWVudCwgaGFwcGVucyBlaXRoZXIgd2l0aCBhIG51bWJlciBvZgorICAgICBzdWIjMixzcCBvciBhIG1vdiAjeCxyNSBzdWIgcjUsc3AgKi8KKworICBpZiAobmV4dF9pcCAmJiAoSVNfU1VCMl9TUCAoaW5zbl93b3JkKSB8fCBJU19TVUI0X1NQIChpbnNuX3dvcmQpKSkKKyAgICB7CisgICAgICB3aGlsZSAobmV4dF9pcCAmJiAoSVNfU1VCMl9TUCAoaW5zbl93b3JkKSB8fCBJU19TVUI0X1NQIChpbnNuX3dvcmQpKSkKKwl7CisJICBhdXRvX2RlcHRoICs9IElTX1NVQjJfU1AgKGluc25fd29yZCkgPyAyIDogNDsKKwkgIGlwID0gbmV4dF9pcDsKKwkgIG5leHRfaXAgPSBORVhUX1BST0xPR1VFX0lOU04gKGlwLCBsaW1pdCwgJmluc25fd29yZCk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChuZXh0X2lwICYmIElTX01PVktfUjUgKGluc25fd29yZCkpCisJeworCSAgaXAgPSBuZXh0X2lwOworCSAgbmV4dF9pcCA9IE5FWFRfUFJPTE9HVUVfSU5TTiAoaXAsIGxpbWl0LCAmaW5zbl93b3JkKTsKKwkgIGF1dG9fZGVwdGggKz0gaW5zbl93b3JkOworCisJICBuZXh0X2lwID0gTkVYVF9QUk9MT0dVRV9JTlNOIChuZXh0X2lwLCBsaW1pdCwgJmluc25fd29yZCk7CisJICBhdXRvX2RlcHRoICs9IGluc25fd29yZDsKKwl9CisgICAgICBpZiAobmV4dF9pcCAmJiBJU19TVUJMX1NQIChpbnNuX3dvcmQpKQorCXsKKwkgIGlwID0gbmV4dF9pcDsKKwkgIGF1dG9fZGVwdGggKz0gcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoaXAsIDQpOworCSAgaXAgKz0gNDsKKworCSAgbmV4dF9pcCA9IE5FWFRfUFJPTE9HVUVfSU5TTiAoaXAsIGxpbWl0LCAmaW5zbl93b3JkKTsKKwl9CisgICAgfQorCisgIC8qIE5vdyBleGFtaW5lIHRoZSBwdXNoIGluc25zIHRvIGRldGVybWluZSB3aGVyZSBldmVyeXRoaW5nIGxpdmVzCisgICAgIG9uIHRoZSBzdGFjay4gICovCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGFkanVzdCA9IDA7CisgICAgICBpZiAoIW5leHRfaXApCisJYnJlYWs7CisKKyAgICAgIGlmIChpbnNuX3dvcmQgPT0gMHgwMTAwKQorCXsKKwkgIGlwID0gbmV4dF9pcDsKKwkgIG5leHRfaXAgPSBORVhUX1BST0xPR1VFX0lOU04gKGlwLCBsaW1pdCwgJmluc25fd29yZCk7CisJICBhZGp1c3QgPSAyOworCX0KKworICAgICAgaWYgKElTX1BVU0ggKGluc25fd29yZCkpCisJeworCSAgaXAgPSBuZXh0X2lwOworCSAgbmV4dF9pcCA9IE5FWFRfUFJPTE9HVUVfSU5TTiAoaXAsIGxpbWl0LCAmaW5zbl93b3JkKTsKKwkgIGZzci0+cmVnc1tyXSA9IGFmdGVyX3Byb2xvZ19mcCArIGF1dG9fZGVwdGg7CisJICBhdXRvX2RlcHRoICs9IDIgKyBhZGp1c3Q7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIE5vdyBjaGVjayBmb3IgcHVzaCBtdWx0aXBsZSBpbnNucy4gICovCisgICAgICBpZiAoaW5zbl93b3JkID09IDB4MDExMCB8fCBpbnNuX3dvcmQgPT0gMHgwMTIwIHx8IGluc25fd29yZCA9PSAweDAxMzApCisJeworCSAgaW50IGNvdW50ID0gKChpbnNuX3dvcmQgPj4gNCkgJiAweGYpICsgMTsKKwkgIGludCBzdGFydCwgaTsKKworCSAgaXAgPSBuZXh0X2lwOworCSAgbmV4dF9pcCA9IE5FWFRfUFJPTE9HVUVfSU5TTiAoaXAsIGxpbWl0LCAmaW5zbl93b3JkKTsKKwkgIHN0YXJ0ID0gaW5zbl93b3JkICYgMHg3OworCisJICBmb3IgKGkgPSBzdGFydDsgaSA8PSBzdGFydCArIGNvdW50OyBpKyspCisJICAgIHsKKwkgICAgICBmc3ItPnJlZ3NbaV0gPSBhZnRlcl9wcm9sb2dfZnAgKyBhdXRvX2RlcHRoOworCSAgICAgIGF1dG9fZGVwdGggKz0gNDsKKwkgICAgfQorCX0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAvKiBUaGUgYXJncyBhcmUgYWx3YXlzIHJlZmZlZCBiYXNlZCBmcm9tIHRoZSBzdGFjayBwb2ludGVyICovCisgIGZpLT5hcmdzX3BvaW50ZXIgPSBhZnRlcl9wcm9sb2dfZnA7CisgIC8qIExvY2FscyBhcmUgYWx3YXlzIHJlZmZlZCBiYXNlZCBmcm9tIHRoZSBmcCAqLworICBmaS0+bG9jYWxzX3BvaW50ZXIgPSBhZnRlcl9wcm9sb2dfZnA7CisgIC8qIFRoZSBQQyBpcyBhdCBhIGtub3duIHBsYWNlICovCisgIGZpLT5mcm9tX3BjID0gcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoYWZ0ZXJfcHJvbG9nX2ZwICsgQklOV09SRCwgQklOV09SRCk7CisKKyAgLyogUmVtZW1lYmVyIGFueSBvdGhlcnMgdG9vICovCisgIGluX2ZyYW1lW1BDX1JFR05VTV0gPSAwOworICAKKyAgaWYgKGhhdmVfZnApCisgICAgLyogV2Uga2VlcCB0aGUgb2xkIEZQIGluIHRoZSBTUCBzcG90ICovCisgICAgZnNyLT5yZWdzW1NQX1JFR05VTV0gPSByZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyIChmc3ItPnJlZ3NbNl0sIEJJTldPUkQpOworICBlbHNlCisgICAgZnNyLT5yZWdzW1NQX1JFR05VTV0gPSBhZnRlcl9wcm9sb2dfZnAgKyBhdXRvX2RlcHRoOworCisgIHJldHVybiAoaXApOworfQorCit2b2lkCitoODMwMF9pbml0X2V4dHJhX2ZyYW1lX2luZm8gKGZyb21sZWFmLCBmaSkKKyAgICAgaW50IGZyb21sZWFmOworICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7Cit7CisgIGZpLT5mc3IgPSAwOwkJCS8qIE5vdCB5ZXQgYWxsb2NhdGVkICovCisgIGZpLT5hcmdzX3BvaW50ZXIgPSAwOwkJLyogVW5rbm93biAqLworICBmaS0+bG9jYWxzX3BvaW50ZXIgPSAwOwkvKiBVbmtub3duICovCisgIGZpLT5mcm9tX3BjID0gMDsKKyAgaWYgKFBDX0lOX0NBTExfRFVNTVkoZmktPnBjLCBmaS0+ZnJhbWUsIGZpLT5mcmFtZSkpCisgICAgeyAvKiBhbnl0aGluZyBzcGVjaWFsIHRvIGRvPyAqLworICAgICAgcmV0dXJuOworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSBzYXZlZCBQQyBmcm9tIHRoaXMgZnJhbWUuCisKKyAgIElmIHRoZSBmcmFtZSBoYXMgYSBtZW1vcnkgY29weSBvZiBTUlBfUkVHTlVNLCB1c2UgdGhhdC4gIElmIG5vdCwKKyAgIGp1c3QgdXNlIHRoZSByZWdpc3RlciBTUlBfUkVHTlVNIGl0c2VsZi4gICovCisKK0NPUkVfQUREUgoraDgzMDBfZnJhbWVfc2F2ZWRfcGMgKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIGlmIChQQ19JTl9DQUxMX0RVTU1ZKGZyYW1lLT5wYywgZnJhbWUtPmZyYW1lLCBmcmFtZS0+ZnJhbWUpKQorICAgIHJldHVybiBnZW5lcmljX3JlYWRfcmVnaXN0ZXJfZHVtbXkgKGZyYW1lLT5wYywgZnJhbWUtPmZyYW1lLCBQQ19SRUdOVU0pOworICBlbHNlCisgICAgcmV0dXJuIGZyYW1lLT5mcm9tX3BjOworfQorCitDT1JFX0FERFIKK2ZyYW1lX2xvY2Fsc19hZGRyZXNzIChmaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworeworICBpZiAoUENfSU5fQ0FMTF9EVU1NWShmaS0+cGMsIGZpLT5mcmFtZSwgZmktPmZyYW1lKSkKKyAgICByZXR1cm4gKENPUkVfQUREUikgMDsJLyogTm90IHN1cmUgd2hhdCBlbHNlIHRvIGRvLi4uICovCisgIGlmICghZmktPmxvY2Fsc19wb2ludGVyKQorICAgIHsKKyAgICAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzIGlnbm9yZTsKKworICAgICAgZ2V0X2ZyYW1lX3NhdmVkX3JlZ3MgKGZpLCAmaWdub3JlKTsKKworICAgIH0KKyAgcmV0dXJuIGZpLT5sb2NhbHNfcG9pbnRlcjsKK30KKworLyogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBhcmd1bWVudCBibG9jayBmb3IgdGhlIGZyYW1lCisgICBkZXNjcmliZWQgYnkgRkkuICBSZXR1cm5zIDAgaWYgdGhlIGFkZHJlc3MgaXMgdW5rbm93bi4gICovCisKK0NPUkVfQUREUgorZnJhbWVfYXJnc19hZGRyZXNzIChmaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworeworICBpZiAoUENfSU5fQ0FMTF9EVU1NWShmaS0+cGMsIGZpLT5mcmFtZSwgZmktPmZyYW1lKSkKKyAgICByZXR1cm4gKENPUkVfQUREUikgMDsJLyogTm90IHN1cmUgd2hhdCBlbHNlIHRvIGRvLi4uICovCisgIGlmICghZmktPmFyZ3NfcG9pbnRlcikKKyAgICB7CisgICAgICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyBpZ25vcmU7CisKKyAgICAgIGdldF9mcmFtZV9zYXZlZF9yZWdzIChmaSwgJmlnbm9yZSk7CisKKyAgICB9CisKKyAgcmV0dXJuIGZpLT5hcmdzX3BvaW50ZXI7Cit9CisKKy8qIEZ1bmN0aW9uOiBwdXNoX2FyZ3VtZW50cworICAgU2V0dXAgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBmb3IgY2FsbGluZyBhIGZ1bmN0aW9uIGluIHRoZSBpbmZlcmlvci4KKworICAgT24gdGhlIEhpdGFjaGkgSDgvMzAwIGFyY2hpdGVjdHVyZSwgdGhlcmUgYXJlIHRocmVlIHJlZ2lzdGVycyAoUjAgdG8gUjIpCisgICB3aGljaCBhcmUgZGVkaWNhdGVkIGZvciBwYXNzaW5nIGZ1bmN0aW9uIGFyZ3VtZW50cy4gIFVwIHRvIHRoZSBmaXJzdAorICAgdGhyZWUgYXJndW1lbnRzIChkZXBlbmRpbmcgb24gc2l6ZSkgbWF5IGdvIGludG8gdGhlc2UgcmVnaXN0ZXJzLgorICAgVGhlIHJlc3QgZ28gb24gdGhlIHN0YWNrLgorCisgICBBcmd1bWVudHMgdGhhdCBhcmUgc21hbGxlciB0aGFuIFdPUkRTSVpFIGJ5dGVzIHdpbGwgc3RpbGwgdGFrZSB1cCBhCisgICB3aG9sZSByZWdpc3RlciBvciBhIHdob2xlIFdPUkRTSVpFIHdvcmQgb24gdGhlIHN0YWNrLCBhbmQgd2lsbCBiZQorICAgcmlnaHQtanVzdGlmaWVkIGluIHRoZSByZWdpc3RlciBvciB0aGUgc3RhY2sgd29yZC4gIFRoaXMgaW5jbHVkZXMKKyAgIGNoYXJzIGFuZCBzbWFsbCBhZ2dyZWdhdGUgdHlwZXMuICBOb3RlIHRoYXQgV09SRFNJWkUgZGVwZW5kcyBvbiB0aGUgCisgICBjcHUgdHlwZS4KKworICAgQXJndW1lbnRzIHRoYXQgYXJlIGxhcmdlciB0aGFuIFdPUkRTSVpFIGJ5dGVzIHdpbGwgYmUgc3BsaXQgYmV0d2VlbgorICAgdHdvIG9yIG1vcmUgcmVnaXN0ZXJzIGFzIGF2YWlsYWJsZSwgYnV0IHdpbGwgTk9UIGJlIHNwbGl0IGJldHdlZW4gYQorICAgcmVnaXN0ZXIgYW5kIHRoZSBzdGFjay4KKworICAgQW4gZXhjZXB0aW9uYWwgY2FzZSBleGlzdHMgZm9yIHN0cnVjdCBhcmd1bWVudHMgKGFuZCBwb3NzaWJseSBvdGhlcgorICAgYWdncmVnYXRlcyBzdWNoIGFzIGFycmF5cykgLS0gaWYgdGhlIHNpemUgaXMgbGFyZ2VyIHRoYW4gV09SRFNJWkUKKyAgIGJ5dGVzIGJ1dCBub3QgYSBtdWx0aXBsZSBvZiBXT1JEU0laRSBieXRlcy4gIEluIHRoaXMgY2FzZSB0aGUKKyAgIGFyZ3VtZW50IGlzIG5ldmVyIHNwbGl0IGJldHdlZW4gdGhlIHJlZ2lzdGVycyBhbmQgdGhlIHN0YWNrLCBidXQKKyAgIGluc3RlYWQgaXMgY29waWVkIGluIGl0cyBlbnRpcmV0eSBvbnRvIHRoZSBzdGFjaywgQU5EIGFsc28gY29waWVkCisgICBpbnRvIGFzIG1hbnkgcmVnaXN0ZXJzIGFzIHRoZXJlIGlzIHJvb20gZm9yLiAgSW4gb3RoZXIgd29yZHMsIHNwYWNlCisgICBpbiByZWdpc3RlcnMgcGVybWl0dGluZywgdHdvIGNvcGllcyBvZiB0aGUgc2FtZSBhcmd1bWVudCBhcmUgcGFzc2VkCisgICBpbi4gIEFzIGZhciBhcyBJIGNhbiB0ZWxsLCBvbmx5IHRoZSBvbmUgb24gdGhlIHN0YWNrIGlzIHVzZWQsCisgICBhbHRob3VnaCB0aGF0IG1heSBiZSBhIGZ1bmN0aW9uIG9mIHRoZSBsZXZlbCBvZiBjb21waWxlcgorICAgb3B0aW1pemF0aW9uLiAgSSBzdXNwZWN0IHRoaXMgaXMgYSBjb21waWxlciBidWcuICBBcmd1bWVudHMgb2YKKyAgIHRoZXNlIG9kZCBzaXplcyBhcmUgbGVmdC1qdXN0aWZpZWQgd2l0aGluIHRoZSB3b3JkIChhcyBvcHBvc2VkIHRvCisgICBhcmd1bWVudHMgc21hbGxlciB0aGFuIFdPUkRTSVpFIGJ5dGVzLCB3aGljaCBhcmUgcmlnaHQtanVzdGlmaWVkKS4KKyAKKyAgIElmIHRoZSBmdW5jdGlvbiBpcyB0byByZXR1cm4gYW4gYWdncmVnYXRlIHR5cGUgc3VjaCBhcyBhIHN0cnVjdCwKKyAgIHRoZSBjYWxsZXIgbXVzdCBhbGxvY2F0ZSBzcGFjZSBpbnRvIHdoaWNoIHRoZSBjYWxsZWUgd2lsbCBjb3B5IHRoZQorICAgcmV0dXJuIHZhbHVlLiAgSW4gdGhpcyBjYXNlLCBhIHBvaW50ZXIgdG8gdGhlIHJldHVybiB2YWx1ZSBsb2NhdGlvbgorICAgaXMgcGFzc2VkIGludG8gdGhlIGNhbGxlZSBpbiByZWdpc3RlciBSMCwgd2hpY2ggZGlzcGxhY2VzIG9uZSBvZgorICAgdGhlIG90aGVyIGFyZ3VtZW50cyBwYXNzZWQgaW4gdmlhIHJlZ2lzdGVycyBSMCB0byBSMi4gICovCisKK0NPUkVfQUREUgoraDgzMDBfcHVzaF9hcmd1bWVudHMobmFyZ3MsIGFyZ3MsIHNwLCBzdHJ1Y3RfcmV0dXJuLCBzdHJ1Y3RfYWRkcikKKyAgICAgaW50IG5hcmdzOworICAgICBzdHJ1Y3QgdmFsdWUgKiphcmdzOworICAgICBDT1JFX0FERFIgc3A7CisgICAgIHVuc2lnbmVkIGNoYXIgc3RydWN0X3JldHVybjsKKyAgICAgQ09SRV9BRERSIHN0cnVjdF9hZGRyOworeworICBpbnQgc3RhY2tfYWxpZ24sIHN0YWNrX2FsbG9jLCBzdGFja19vZmZzZXQ7CisgIGludCB3b3Jkc2l6ZTsKKyAgaW50IGFyZ3JlZzsKKyAgaW50IGFyZ251bTsKKyAgc3RydWN0IHR5cGUgKnR5cGU7CisgIENPUkVfQUREUiByZWd2YWw7CisgIGNoYXIgKnZhbDsKKyAgY2hhciB2YWxidWZbNF07CisgIGludCBsZW47CisKKyAgaWYgKGg4MzAwaG1vZGUgfHwgaDgzMDBzbW9kZSkKKyAgICB7CisgICAgICBzdGFja19hbGlnbiA9IDM7CisgICAgICB3b3Jkc2l6ZSAgICA9IDQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3RhY2tfYWxpZ24gPSAxOworICAgICAgd29yZHNpemUgICAgPSAyOworICAgIH0KKworICAvKiBmaXJzdCBmb3JjZSBzcCB0byBhIG4tYnl0ZSBhbGlnbm1lbnQgKi8KKyAgc3AgPSBzcCAmIH5zdGFja19hbGlnbjsKKworICAvKiBOb3cgbWFrZSBzdXJlIHRoZXJlJ3Mgc3BhY2Ugb24gdGhlIHN0YWNrICovCisgIGZvciAoYXJnbnVtID0gMCwgc3RhY2tfYWxsb2MgPSAwOyAKKyAgICAgICBhcmdudW0gPCBuYXJnczsgYXJnbnVtKyspCisgICAgc3RhY2tfYWxsb2MgKz0gKChUWVBFX0xFTkdUSChWQUxVRV9UWVBFKGFyZ3NbYXJnbnVtXSkpICsgc3RhY2tfYWxpZ24pIAorCQkgICAgJiB+c3RhY2tfYWxpZ24pOworICBzcCAtPSBzdGFja19hbGxvYzsJLyogbWFrZSByb29tIG9uIHN0YWNrIGZvciBhcmdzICovCisgIC8qIHdlIG1heSBvdmVyLWFsbG9jYXRlIGEgbGl0dGxlIGhlcmUsIGJ1dCB0aGF0IHdvbid0IGh1cnQgYW55dGhpbmcgKi8KKworICBhcmdyZWcgPSBBUkcwX1JFR05VTTsgCisgIGlmIChzdHJ1Y3RfcmV0dXJuKQkvKiAic3RydWN0IHJldHVybiIgcG9pbnRlciB0YWtlcyB1cCBvbmUgYXJncmVnICovCisgICAgeworICAgICAgd3JpdGVfcmVnaXN0ZXIgKGFyZ3JlZysrLCBzdHJ1Y3RfYWRkcik7CisgICAgfQorCisgIC8qIE5vdyBsb2FkIGFzIG1hbnkgYXMgcG9zc2libGUgb2YgdGhlIGZpcnN0IGFyZ3VtZW50cyBpbnRvCisgICAgIHJlZ2lzdGVycywgYW5kIHB1c2ggdGhlIHJlc3Qgb250byB0aGUgc3RhY2suICBUaGVyZSBhcmUgM04gYnl0ZXMKKyAgICAgaW4gdGhyZWUgcmVnaXN0ZXJzIGF2YWlsYWJsZS4gIExvb3AgdGhydSBhcmdzIGZyb20gZmlyc3QgdG8gbGFzdC4gICovCisKKyAgZm9yIChhcmdudW0gPSAwLCBzdGFja19vZmZzZXQgPSAwOyBhcmdudW0gPCBuYXJnczsgYXJnbnVtKyspCisgICAgeworICAgICAgdHlwZSA9IFZBTFVFX1RZUEUgKGFyZ3NbYXJnbnVtXSk7CisgICAgICBsZW4gPSBUWVBFX0xFTkdUSCAodHlwZSk7CisgICAgICBtZW1zZXQodmFsYnVmLCAwLCBzaXplb2YodmFsYnVmKSk7CisgICAgICBpZiAobGVuIDwgd29yZHNpemUpCisJeworCSAgLyogdGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byByaWdodC1qdXN0aWZ5IHRoZSB2YWx1ZSB3aXRoaW4gdGhlIHdvcmQgKi8KKwkgIG1lbWNweSh2YWxidWYgKyAod29yZHNpemUgLSBsZW4pLCAKKwkJIChjaGFyICopIFZBTFVFX0NPTlRFTlRTIChhcmdzW2FyZ251bV0pLCBsZW4pOworCSAgdmFsID0gdmFsYnVmOworCX0KKyAgICAgIGVsc2UKKwl2YWwgPSAoY2hhciAqKSBWQUxVRV9DT05URU5UUyAoYXJnc1thcmdudW1dKTsKKworICAgICAgaWYgKGxlbiA+IChBUkdMQVNUX1JFR05VTSsxIC0gYXJncmVnKSAqIFJFR0lTVEVSX1JBV19TSVpFKEFSRzBfUkVHTlVNKSB8fAorCSAobGVuID4gd29yZHNpemUgJiYgKGxlbiAmIHN0YWNrX2FsaWduKSAhPSAwKSkKKwl7IC8qIHBhc3NlZCBvbiB0aGUgc3RhY2sgKi8KKwkgIHdyaXRlX21lbW9yeSAoc3AgKyBzdGFja19vZmZzZXQsIHZhbCwgCisJCQlsZW4gPCB3b3Jkc2l6ZSA/IHdvcmRzaXplIDogbGVuKTsKKwkgIHN0YWNrX29mZnNldCArPSAobGVuICsgc3RhY2tfYWxpZ24pICYgfnN0YWNrX2FsaWduOworCX0KKyAgICAgIC8qIE5PVEUgV0VMTCEhISEhICBUaGlzIGlzIG5vdCBhbiAiZWxzZSBpZiIgY2xhdXNlISEhCisJIFRoYXQncyBiZWNhdXNlIHNvbWUgKiZeJSQgdGhpbmdzIGdldCBwYXNzZWQgb24gdGhlIHN0YWNrCisJIEFORCBpbiB0aGUgcmVnaXN0ZXJzISAgICovCisgICAgICBpZiAobGVuIDw9IChBUkdMQVNUX1JFR05VTSsxIC0gYXJncmVnKSAqIFJFR0lTVEVSX1JBV19TSVpFKEFSRzBfUkVHTlVNKSkKKwl3aGlsZSAobGVuID4gMCkKKwkgIHsgLyogdGhlcmUncyByb29tIGluIHJlZ2lzdGVycyAqLworCSAgICByZWd2YWwgPSBleHRyYWN0X2FkZHJlc3MgKHZhbCwgd29yZHNpemUpOworCSAgICB3cml0ZV9yZWdpc3RlciAoYXJncmVnLCByZWd2YWwpOworCSAgICBsZW4gLT0gd29yZHNpemU7CisJICAgIHZhbCArPSB3b3Jkc2l6ZTsKKwkgICAgYXJncmVnKys7CisJICB9CisgICAgfQorICByZXR1cm4gc3A7Cit9CisKKy8qIEZ1bmN0aW9uOiBwdXNoX3JldHVybl9hZGRyZXNzCisgICBTZXR1cCB0aGUgcmV0dXJuIGFkZHJlc3MgZm9yIGEgZHVtbXkgZnJhbWUsIGFzIGNhbGxlZCBieQorICAgY2FsbF9mdW5jdGlvbl9ieV9oYW5kLiAgT25seSBuZWNlc3Nhcnkgd2hlbiB5b3UgYXJlIHVzaW5nIGFuCisgICBlbXB0eSBDQUxMX0RVTU1ZLCBpZS4gdGhlIHRhcmdldCB3aWxsIG5vdCBhY3R1YWxseSBiZSBleGVjdXRpbmcKKyAgIGEgSlNSL0JTUiBpbnN0cnVjdGlvbi4gICovCisKK0NPUkVfQUREUgoraDgzMDBfcHVzaF9yZXR1cm5fYWRkcmVzcyAocGMsIHNwKQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIENPUkVfQUREUiBzcDsKK3sKKyAgdW5zaWduZWQgY2hhciBidWZbNF07CisgIGludCB3b3Jkc2l6ZTsKKworICBpZiAoaDgzMDBobW9kZSB8fCBoODMwMHNtb2RlKQorICAgIHdvcmRzaXplID0gNDsKKyAgZWxzZQorICAgIHdvcmRzaXplID0gMjsKKworICBzcCAtPSB3b3Jkc2l6ZTsKKyAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoYnVmLCB3b3Jkc2l6ZSwgQ0FMTF9EVU1NWV9BRERSRVNTICgpKTsKKyAgd3JpdGVfbWVtb3J5IChzcCwgYnVmLCB3b3Jkc2l6ZSk7CisgIHJldHVybiBzcDsKK30KKworLyogRnVuY3Rpb246IHBvcF9mcmFtZQorICAgUmVzdG9yZSB0aGUgbWFjaGluZSB0byB0aGUgc3RhdGUgaXQgaGFkIGJlZm9yZSB0aGUgY3VycmVudCBmcmFtZSAKKyAgIHdhcyBjcmVhdGVkLiAgVXN1YWxseSB1c2VkIGVpdGhlciBieSB0aGUgIlJFVFVSTiIgY29tbWFuZCwgb3IgYnkKKyAgIGNhbGxfZnVuY3Rpb25fYnlfaGFuZCBhZnRlciB0aGUgZHVtbXlfZnJhbWUgaXMgZmluaXNoZWQuICovCisKK3ZvaWQgCitoODMwMF9wb3BfZnJhbWUgKCkKK3sKKyAgdW5zaWduZWQgcmVnbnVtOworICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyBmc3I7CisgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZSA9IGdldF9jdXJyZW50X2ZyYW1lICgpOworCisgIGlmIChQQ19JTl9DQUxMX0RVTU1ZKGZyYW1lLT5wYywgZnJhbWUtPmZyYW1lLCBmcmFtZS0+ZnJhbWUpKQorICAgIHsKKyAgICAgIGdlbmVyaWNfcG9wX2R1bW15X2ZyYW1lKCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZ2V0X2ZyYW1lX3NhdmVkX3JlZ3MgKGZyYW1lLCAmZnNyKTsKKworICAgICAgZm9yIChyZWdudW0gPSAwOyByZWdudW0gPCA4OyByZWdudW0rKykKKwl7CisJICAvKiBEb24ndCBmb3JnZXQgU1BfUkVHTlVNIGlzIGEgZnJhbWVfc2F2ZWRfcmVncyBzdHJ1Y3QgaXMgdGhlCisJICAgICBhY3R1YWwgdmFsdWUgd2Ugd2FudCwgbm90IHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZSB3ZSB3YW50LiAgKi8KKwkgIGlmIChmc3IucmVnc1tyZWdudW1dICYmIHJlZ251bSAhPSBTUF9SRUdOVU0pCisJICAgIHdyaXRlX3JlZ2lzdGVyIChyZWdudW0sIAorCQkJICAgIHJlYWRfbWVtb3J5X2ludGVnZXIoZnNyLnJlZ3NbcmVnbnVtXSwgQklOV09SRCkpOworCSAgZWxzZSBpZiAoZnNyLnJlZ3NbcmVnbnVtXSAmJiByZWdudW0gPT0gU1BfUkVHTlVNKQorCSAgICB3cml0ZV9yZWdpc3RlciAocmVnbnVtLCBmcmFtZS0+ZnJhbWUgKyAyICogQklOV09SRCk7CisJfQorCisgICAgICAvKiBEb24ndCBmb3JnZXQgdGhlIHVwZGF0ZSB0aGUgUEMgdG9vISAgKi8KKyAgICAgIHdyaXRlX3BjIChmcmFtZS0+ZnJvbV9wYyk7CisgICAgfQorICBmbHVzaF9jYWNoZWRfZnJhbWVzICgpOworfQorCisvKiBGdW5jdGlvbjogZXh0cmFjdF9yZXR1cm5fdmFsdWUKKyAgIEZpZ3VyZSBvdXQgd2hlcmUgaW4gUkVHQlVGIHRoZSBjYWxsZWQgZnVuY3Rpb24gaGFzIGxlZnQgaXRzIHJldHVybiB2YWx1ZS4KKyAgIENvcHkgdGhhdCBpbnRvIFZBTEJVRi4gIEJlIHN1cmUgdG8gYWNjb3VudCBmb3IgQ1BVIHR5cGUuICAgKi8KKwordm9pZAoraDgzMDBfZXh0cmFjdF9yZXR1cm5fdmFsdWUgKHR5cGUsIHJlZ2J1ZiwgdmFsYnVmKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgY2hhciAqcmVnYnVmOworICAgICBjaGFyICp2YWxidWY7Cit7CisgIGludCB3b3Jkc2l6ZSwgbGVuOworCisgIGlmIChoODMwMHNtb2RlIHx8IGg4MzAwaG1vZGUpCisgICAgd29yZHNpemUgPSA0OworICBlbHNlCisgICAgd29yZHNpemUgPSAyOworCisgIGxlbiA9IFRZUEVfTEVOR1RIKHR5cGUpOworCisgIHN3aXRjaCAobGVuKSB7CisgIGNhc2UgMToJLyogKGNoYXIpICovCisgIGNhc2UgMjoJLyogKHNob3J0KSwgKGludCkgKi8KKyAgICBtZW1jcHkgKHZhbGJ1ZiwgICByZWdidWYgKyBSRUdJU1RFUl9CWVRFKDApICsgKHdvcmRzaXplIC0gbGVuKSwgbGVuKTsKKyAgICBicmVhazsKKyAgY2FzZSA0OgkvKiAobG9uZyksIChmbG9hdCkgKi8KKyAgICBpZiAoaDgzMDBzbW9kZSB8fCBoODMwMGhtb2RlKQorICAgICAgeworCW1lbWNweSAodmFsYnVmLCAgIHJlZ2J1ZiArIFJFR0lTVEVSX0JZVEUoMCksIDQpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwltZW1jcHkgKHZhbGJ1ZiwgICByZWdidWYgKyBSRUdJU1RFUl9CWVRFKDApLCAyKTsKKwltZW1jcHkgKHZhbGJ1ZisyLCByZWdidWYgKyBSRUdJU1RFUl9CWVRFKDEpLCAyKTsKKyAgICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSA4OgkvKiAoZG91YmxlKSAoZG9lc24ndCBzZWVtIHRvIGhhcHBlbiwgd2hpY2ggaXMgZ29vZCwKKwkJICAgYmVjYXVzZSB0aGlzIGFsbW9zdCBjZXJ0YWlubHkgaXNuJ3QgcmlnaHQuICAqLworICAgIGVycm9yICgiSSBkb24ndCBrbm93IGhvdyBhIGRvdWJsZSBpcyByZXR1cm5lZC4iKTsKKyAgICBicmVhazsKKyAgfQorfQorCisvKiBGdW5jdGlvbjogc3RvcmVfcmV0dXJuX3ZhbHVlCisgICBQbGFjZSB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVycy4KKyAgIFByaW1hcmlseSB1c2VkIGJ5IHRoZSBSRVRVUk4gY29tbWFuZC4gICovCisKK3ZvaWQgCitoODMwMF9zdG9yZV9yZXR1cm5fdmFsdWUgKHR5cGUsIHZhbGJ1ZikKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGNoYXIgKnZhbGJ1ZjsKK3sKKyAgaW50IHdvcmRzaXplLCBsZW4sIHJlZ3ZhbDsKKyAgCisgIGlmIChoODMwMGhtb2RlIHx8IGg4MzAwc21vZGUpCisgICAgd29yZHNpemUgPSA0OworICBlbHNlCisgICAgd29yZHNpemUgPSAyOworCisgIGxlbiA9IFRZUEVfTEVOR1RIKHR5cGUpOworICBzd2l0Y2ggKGxlbikgeworICBjYXNlIDE6CS8qIGNoYXIgKi8KKyAgY2FzZSAyOgkvKiBzaG9ydCwgaW50ICovCisgICAgcmVndmFsID0gZXh0cmFjdF9hZGRyZXNzKHZhbGJ1ZiwgbGVuKTsKKyAgICB3cml0ZV9yZWdpc3RlciAoMCwgcmVndmFsKTsKKyAgICBicmVhazsKKyAgY2FzZSA0OgkvKiBsb25nLCBmbG9hdCAqLworICAgIHJlZ3ZhbCA9IGV4dHJhY3RfYWRkcmVzcyh2YWxidWYsIGxlbik7CisgICAgaWYgKGg4MzAwc21vZGUgfHwgaDgzMDBobW9kZSkKKyAgICAgIHsKKwl3cml0ZV9yZWdpc3RlciAoMCwgcmVndmFsKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJd3JpdGVfcmVnaXN0ZXIgKDAsIHJlZ3ZhbCA+PiAxNik7CisJd3JpdGVfcmVnaXN0ZXIgKDEsIHJlZ3ZhbCAmIDB4ZmZmZik7CisgICAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgODoJLyogcHJlc3VtZWFibHkgZG91YmxlLCBidXQgZG9lc24ndCBzZWVtIHRvIGhhcHBlbiAqLworICAgIGVycm9yICgiSSBkb24ndCBrbm93IGhvdyB0byByZXR1cm4gYSBkb3VibGUuIik7CisgICAgYnJlYWs7CisgIH0KK30KKworLyogRnVuY3Rpb246IGdldF9zYXZlZF9yZWdpc3RlcgorICAgSnVzdCBjYWxsIHRoZSBnZW5lcmljX2dldF9zYXZlZF9yZWdpc3RlciBmdW5jdGlvbi4gICovCisKK3ZvaWQKK2dldF9zYXZlZF9yZWdpc3RlciAocmF3X2J1ZmZlciwgb3B0aW1pemVkLCBhZGRycCwgZnJhbWUsIHJlZ251bSwgbHZhbCkKKyAgICAgY2hhciAqcmF3X2J1ZmZlcjsKKyAgICAgaW50ICpvcHRpbWl6ZWQ7CisgICAgIENPUkVfQUREUiAqYWRkcnA7CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKKyAgICAgaW50IHJlZ251bTsKKyAgICAgZW51bSBsdmFsX3R5cGUgKmx2YWw7Cit7CisgIGdlbmVyaWNfZ2V0X3NhdmVkX3JlZ2lzdGVyIChyYXdfYnVmZmVyLCBvcHRpbWl6ZWQsIGFkZHJwLCAKKwkJCSAgICAgIGZyYW1lLCByZWdudW0sIGx2YWwpOworfQorCitzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqc2V0bWVtb3J5bGlzdDsKKworc3RhdGljIHZvaWQKK3NldF9yZWdpc3Rlcl9uYW1lcyAoKQoreworICBpZiAoaDgzMDBobW9kZSAhPSAwKQorICAgIGg4MzAwX3JlZ2lzdGVyX25hbWVzID0gaDgzMDBoX3JlZ2lzdGVyX25hbWVzOworICBlbHNlCisgICAgaDgzMDBfcmVnaXN0ZXJfbmFtZXMgPSBvcmlnaW5hbF9yZWdpc3Rlcl9uYW1lczsKK30KKworc3RhdGljIHZvaWQKK2g4MzAwX2NvbW1hbmQoYXJncywgZnJvbV90dHkpCit7CisgIGV4dGVybiBpbnQgaDgzMDBobW9kZTsKKyAgaDgzMDBobW9kZSA9IDA7CisgIGg4MzAwc21vZGUgPSAwOworICBzZXRfcmVnaXN0ZXJfbmFtZXMgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitoODMwMGhfY29tbWFuZChhcmdzLCBmcm9tX3R0eSkKK3sKKyAgZXh0ZXJuIGludCBoODMwMGhtb2RlOworICBoODMwMGhtb2RlID0gMTsKKyAgaDgzMDBzbW9kZSA9IDA7CisgIHNldF9yZWdpc3Rlcl9uYW1lcyAoKTsKK30KKworc3RhdGljIHZvaWQKK2g4MzAwc19jb21tYW5kKGFyZ3MsIGZyb21fdHR5KQoreworICBleHRlcm4gaW50IGg4MzAwc21vZGU7CisgIGV4dGVybiBpbnQgaDgzMDBobW9kZTsKKyAgaDgzMDBzbW9kZSA9IDE7CisgIGg4MzAwaG1vZGUgPSAxOworICBzZXRfcmVnaXN0ZXJfbmFtZXMgKCk7Cit9CisKKworc3RhdGljIHZvaWQgCitzZXRfbWFjaGluZSAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcInNldCBtYWNoaW5lXCIgbXVzdCBiZSBmb2xsb3dlZCBieSBoODMwMCwgaDgzMDBoIik7CisgIHByaW50Zl91bmZpbHRlcmVkICgib3IgaDgzMDBzIik7CisgIGhlbHBfbGlzdCAoc2V0bWVtb3J5bGlzdCwgInNldCBtZW1vcnkgIiwgLTEsIGdkYl9zdGRvdXQpOworfQorCisvKiBzZXRfbWFjaGluZV9ob29rIGlzIGNhbGxlZCBhcyB0aGUgZXhlYyBmaWxlIGlzIGJlaW5nIG9wZW5lZCwgYnV0CisgICBiZWZvcmUgdGhlIHN5bWJvbCBmaWxlIGlzIG9wZW5lZC4gIFRoaXMgYWxsb3dzIHVzIHRvIHNldCB0aGUKKyAgIGg4MzAwaG1vZGUgZmxhZyBiYXNlZCBvbiB0aGUgbWFjaGluZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUgZXhlYworICAgZmlsZS4gIFRoaXMgaW4gdHVybiB3aWxsIGNhdXNlIHN1YnNlcXVlbnRseSBkZWZpbmVkIHBvaW50ZXIgdHlwZXMKKyAgIHRvIGJlIDE2IG9yIDMyIGJpdHMgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBtYWNoaW5lLiAgKi8KKworc3RhdGljIHZvaWQKK3NldF9tYWNoaW5lX2hvb2sgKGZpbGVuYW1lKQorICAgICBjaGFyICpmaWxlbmFtZTsKK3sKKyAgaWYgKGJmZF9nZXRfbWFjaCAoZXhlY19iZmQpID09IGJmZF9tYWNoX2g4MzAwcykKKyAgICB7CisgICAgICBoODMwMHNtb2RlID0gMTsKKyAgICAgIGg4MzAwaG1vZGUgPSAxOworICAgIH0KKyAgZWxzZSAKKyAgICBpZiAoYmZkX2dldF9tYWNoIChleGVjX2JmZCkgPT0gYmZkX21hY2hfaDgzMDBoKQorICAgIHsKKyAgICAgIGg4MzAwc21vZGUgPSAwOworICAgICAgaDgzMDBobW9kZSA9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaDgzMDBzbW9kZSA9IDA7CisgICAgICBoODMwMGhtb2RlID0gMDsKKyAgICB9CisgIHNldF9yZWdpc3Rlcl9uYW1lcyAoKTsKK30KKwordm9pZAorX2luaXRpYWxpemVfaDgzMDBtICgpCit7CisgIGFkZF9wcmVmaXhfY21kICgibWFjaGluZSIsIG5vX2NsYXNzLCBzZXRfbWFjaGluZSwKKwkJICAic2V0IHRoZSBtYWNoaW5lIHR5cGUiLCAKKwkJICAmc2V0bWVtb3J5bGlzdCwgInNldCBtYWNoaW5lICIsIDAsCisJCSAgJnNldGxpc3QpOworCisgIGFkZF9jbWQgKCJoODMwMCIsIGNsYXNzX3N1cHBvcnQsIGg4MzAwX2NvbW1hbmQsCisJICAgIlNldCBtYWNoaW5lIHRvIGJlIEg4LzMwMC4iLCAmc2V0bWVtb3J5bGlzdCk7CisKKyAgYWRkX2NtZCAoImg4MzAwaCIsIGNsYXNzX3N1cHBvcnQsIGg4MzAwaF9jb21tYW5kLAorCSAgICJTZXQgbWFjaGluZSB0byBiZSBIOC8zMDBILiIsICZzZXRtZW1vcnlsaXN0KTsKKworICBhZGRfY21kICgiaDgzMDBzIiwgY2xhc3Nfc3VwcG9ydCwgaDgzMDBzX2NvbW1hbmQsCisJICAgIlNldCBtYWNoaW5lIHRvIGJlIEg4LzMwMFMuIiwgJnNldG1lbW9yeWxpc3QpOworCisgIC8qIEFkZCBhIGhvb2sgdG8gc2V0IHRoZSBtYWNoaW5lIHR5cGUgd2hlbiB3ZSdyZSBsb2FkaW5nIGEgZmlsZS4gKi8KKworICBzcGVjaWZ5X2V4ZWNfZmlsZV9ob29rKHNldF9tYWNoaW5lX2hvb2spOworfQorCisKKwordm9pZAorcHJpbnRfcmVnaXN0ZXJfaG9vayAocmVnbm8pCit7CisgIGlmIChyZWdubyA9PSA4KQorICAgIHsKKyAgICAgIC8qIENDUiByZWdpc3RlciAqLworICAgICAgaW50IEMsIFosIE4sIFY7CisgICAgICB1bnNpZ25lZCBjaGFyIGJbNF07CisgICAgICB1bnNpZ25lZCBjaGFyIGw7CisgICAgICByZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyAocmVnbm8sIGIpOworICAgICAgbCA9IGJbUkVHSVNURVJfVklSVFVBTF9TSVpFKDgpIC0xXTsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiXHQiKTsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiSS0lZCAtICIsIChsICYgMHg4MCkgIT0gMCk7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIkgtJWQgLSAiLCAobCAmIDB4MjApICE9IDApOworICAgICAgTiA9IChsICYgMHg4KSAhPSAwOworICAgICAgWiA9IChsICYgMHg0KSAhPSAwOworICAgICAgViA9IChsICYgMHgyKSAhPSAwOworICAgICAgQyA9IChsICYgMHgxKSAhPSAwOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJOLSVkICIsIE4pOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJaLSVkICIsIFopOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJWLSVkICIsIFYpOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJDLSVkICIsIEMpOworICAgICAgaWYgKChDIHwgWikgPT0gMCkKKwlwcmludGZfdW5maWx0ZXJlZCAoInU+ICIpOworICAgICAgaWYgKChDIHwgWikgPT0gMSkKKwlwcmludGZfdW5maWx0ZXJlZCAoInU8PSAiKTsKKyAgICAgIGlmICgoQyA9PSAwKSkKKwlwcmludGZfdW5maWx0ZXJlZCAoInU+PSAiKTsKKyAgICAgIGlmIChDID09IDEpCisJcHJpbnRmX3VuZmlsdGVyZWQgKCJ1PCAiKTsKKyAgICAgIGlmIChaID09IDApCisJcHJpbnRmX3VuZmlsdGVyZWQgKCIhPSAiKTsKKyAgICAgIGlmIChaID09IDEpCisJcHJpbnRmX3VuZmlsdGVyZWQgKCI9PSAiKTsKKyAgICAgIGlmICgoTiBeIFYpID09IDApCisJcHJpbnRmX3VuZmlsdGVyZWQgKCI+PSAiKTsKKyAgICAgIGlmICgoTiBeIFYpID09IDEpCisJcHJpbnRmX3VuZmlsdGVyZWQgKCI8ICIpOworICAgICAgaWYgKChaIHwgKE4gXiBWKSkgPT0gMCkKKwlwcmludGZfdW5maWx0ZXJlZCAoIj4gIik7CisgICAgICBpZiAoKFogfCAoTiBeIFYpKSA9PSAxKQorCXByaW50Zl91bmZpbHRlcmVkICgiPD0gIik7CisgICAgfQorfQorCit2b2lkCitfaW5pdGlhbGl6ZV9oODMwMF90ZGVwICgpCit7CisgIHRtX3ByaW50X2luc24gPSBnZGJfcHJpbnRfaW5zbl9oODMwMDsKK30KZGlmZiAtLWdpdCBhL2dkYi9oODUwMC10ZGVwLmMgYi9nZGIvaDg1MDAtdGRlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZmFiMmQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvaDg1MDAtdGRlcC5jCkBAIC0wLDAgKzEsNjUzIEBACisvKiBUYXJnZXQtZGVwZW5kZW50IGNvZGUgZm9yIEhpdGFjaGkgSDgvNTAwLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKyBDb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbgorICAgICAgICAgICAgICAgIHNhY0BjeWdudXMuY29tCisgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAiZGlzLWFzbS5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKworI2RlZmluZSBVTlNJR05FRF9TSE9SVChYKSAoKFgpICYgMHhmZmZmKQorCitzdGF0aWMgaW50IGNvZGVfc2l6ZSA9IDI7CisKK3N0YXRpYyBpbnQgZGF0YV9zaXplID0gMjsKKworLyogU2hhcGUgb2YgYW4gSDgvNTAwIGZyYW1lIDoKKworICAgYXJnLW4KKyAgIC4uCisgICBhcmctMgorICAgYXJnLTEKKyAgIHJldHVybiBhZGRyZXNzIDwyIG9yIDQgYnl0ZXM+CisgICBvbGQgZnAJICA8MiBieXRlcz4KKyAgIGF1dG8tbgorICAgLi4KKyAgIGF1dG8tMQorICAgc2F2ZWQgcmVnaXN0ZXJzCisKKyovCisKKy8qIGFuIGVhc3kgdG8gZGVidWcgSDggc3RhY2sgZnJhbWUgbG9va3MgbGlrZToKKzB4NmRmNgkJcHVzaAlyNgorMHgwZDc2ICAJbW92LncgICByNyxyNgorMHg2ZGZuICAgICAgICAgIHB1c2ggICAgcmVnCisweDc5MDUgbm5ubiAgCW1vdi53ICAjbixyNSAgICBvciAgIDB4MWI4NyAgc3VicyAjMixzcAorMHgxOTU3ICAgICAgIAlzdWIudyAgcjUsc3AKKworICovCisKKyNkZWZpbmUgSVNfUFVTSCh4KSAoKCh4KSAmIDB4ZmYwMCk9PTB4NmQwMCkKKyNkZWZpbmUgSVNfTElOS184KHgpICgoeCkgPT0gMHgxNykKKyNkZWZpbmUgSVNfTElOS18xNih4KSAoKHgpID09IDB4MWYpCisjZGVmaW5lIElTX01PVkVfRlAoeCkgKCh4KSA9PSAweDBkNzYpCisjZGVmaW5lIElTX01PVl9TUF9GUCh4KSAoKHgpID09IDB4MGQ3NikKKyNkZWZpbmUgSVNfU1VCMl9TUCh4KSAoKHgpID09IDB4MWI4NykKKyNkZWZpbmUgSVNfTU9WS19SNSh4KSAoKHgpID09IDB4NzkwNSkKKyNkZWZpbmUgSVNfU1VCX1I1U1AoeCkgKCh4KSA9PSAweDE5NTcpCisKKyNkZWZpbmUgTElOS184IDB4MTcKKyNkZWZpbmUgTElOS18xNiAweDFmCisKK2ludCBtaW5pbXVtX21vZGUgPSAxOworCitDT1JFX0FERFIKK2g4NTAwX3NraXBfcHJvbG9ndWUgKHN0YXJ0X3BjKQorICAgICBDT1JFX0FERFIgc3RhcnRfcGM7Cit7CisgIHNob3J0IGludCB3OworCisgIHcgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChzdGFydF9wYywgMSk7CisgIGlmICh3ID09IExJTktfOCkKKyAgICB7CisgICAgICBzdGFydF9wYyArPSAyOworICAgICAgdyA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHN0YXJ0X3BjLCAxKTsKKyAgICB9CisKKyAgaWYgKHcgPT0gTElOS18xNikKKyAgICB7CisgICAgICBzdGFydF9wYyArPSAzOworICAgICAgdyA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHN0YXJ0X3BjLCAyKTsKKyAgICB9CisKKyAgcmV0dXJuIHN0YXJ0X3BjOworfQorCitDT1JFX0FERFIKK2g4NTAwX2FkZHJfYml0c19yZW1vdmUgKGFkZHIpCisgICAgIENPUkVfQUREUiBhZGRyOworeworICByZXR1cm4gKChhZGRyKSAmIDB4ZmZmZmZmKTsKK30KKworLyogR2l2ZW4gYSBHREIgZnJhbWUsIGRldGVybWluZSB0aGUgYWRkcmVzcyBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbidzIGZyYW1lLgorICAgVGhpcyB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgbmV3IEdEQiBmcmFtZSBzdHJ1Y3QsIGFuZCB0aGVuCisgICBJTklUX0VYVFJBX0ZSQU1FX0lORk8gYW5kIElOSVRfRlJBTUVfUEMgd2lsbCBiZSBjYWxsZWQgZm9yIHRoZSBuZXcgZnJhbWUuCisKKyAgIEZvciB1cywgdGhlIGZyYW1lIGFkZHJlc3MgaXMgaXRzIHN0YWNrIHBvaW50ZXIgdmFsdWUsIHNvIHdlIGxvb2sgdXAKKyAgIHRoZSBmdW5jdGlvbiBwcm9sb2d1ZSB0byBkZXRlcm1pbmUgdGhlIGNhbGxlcidzIHNwIHZhbHVlLCBhbmQgcmV0dXJuIGl0LiAgKi8KKworQ09SRV9BRERSCitoODUwMF9mcmFtZV9jaGFpbiAodGhpc2ZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqdGhpc2ZyYW1lOworeworICBpZiAoIWluc2lkZV9lbnRyeV9maWxlICh0aGlzZnJhbWUtPnBjKSkKKyAgICByZXR1cm4gKHJlYWRfbWVtb3J5X2ludGVnZXIgKEZSQU1FX0ZQICh0aGlzZnJhbWUpLCBQVFJfU0laRSkpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEZldGNoIHRoZSBpbnN0cnVjdGlvbiBhdCBBRERSLCByZXR1cm5pbmcgMCBpZiBBRERSIGlzIGJleW9uZCBMSU0gb3IKKyAgIGlzIG5vdCB0aGUgYWRkcmVzcyBvZiBhIHZhbGlkIGluc3RydWN0aW9uLCB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dAorICAgaW5zdHJ1Y3Rpb24gYmV5b25kIEFERFIgb3RoZXJ3aXNlLiAgKlBXT1JEMSByZWNlaXZlcyB0aGUgZmlyc3Qgd29yZAorICAgb2YgdGhlIGluc3RydWN0aW9uLiovCisKK0NPUkVfQUREUgorTkVYVF9QUk9MT0dVRV9JTlNOIChhZGRyLCBsaW0sIHB3b3JkMSkKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIENPUkVfQUREUiBsaW07CisgICAgIGNoYXIgKnB3b3JkMTsKK3sKKyAgaWYgKGFkZHIgPCBsaW0gKyA4KQorICAgIHsKKyAgICAgIHJlYWRfbWVtb3J5IChhZGRyLCBwd29yZDEsIDEpOworICAgICAgcmVhZF9tZW1vcnkgKGFkZHIsIHB3b3JkMSArIDEsIDEpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICByZXR1cm4gMDsKK30KKworLyogRXhhbWluZSB0aGUgcHJvbG9ndWUgb2YgYSBmdW5jdGlvbi4gIGBpcCcgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgaW5zdHJ1Y3Rpb24uICBgbGltaXQnIGlzIHRoZSBsaW1pdCBvZiB0aGUgcHJvbG9ndWUgKGUuZy4gdGhlIGFkZHIKKyAgIG9mIHRoZSBmaXJzdCBsaW5lbnVtYmVyLCBvciBwZXJoYXBzIHRoZSBwcm9ncmFtIGNvdW50ZXIgaWYgd2UncmUKKyAgIHN0ZXBwaW5nIHRocm91Z2gpLiAgYGZyYW1lX3NwJyBpcyB0aGUgc3RhY2sgcG9pbnRlciB2YWx1ZSBpbiB1c2UgaW4KKyAgIHRoaXMgZnJhbWUuICBgZnNyJyBpcyBhIHBvaW50ZXIgdG8gYSBmcmFtZV9zYXZlZF9yZWdzIHN0cnVjdHVyZQorICAgaW50byB3aGljaCB3ZSBwdXQgaW5mbyBhYm91dCB0aGUgcmVnaXN0ZXJzIHNhdmVkIGJ5IHRoaXMgZnJhbWUuCisgICBgZmknIGlzIGEgc3RydWN0IGZyYW1lX2luZm8gcG9pbnRlcjsgd2UgZmlsbCBpbiB2YXJpb3VzIGZpZWxkcyBpbgorICAgaXQgdG8gcmVmbGVjdCB0aGUgb2Zmc2V0cyBvZiB0aGUgYXJnIHBvaW50ZXIgYW5kIHRoZSBsb2NhbHMKKyAgIHBvaW50ZXIuICAqLworCisvKiBSZXR1cm4gdGhlIHNhdmVkIFBDIGZyb20gdGhpcyBmcmFtZS4gKi8KKworQ09SRV9BRERSCitmcmFtZV9zYXZlZF9wYyAoZnJhbWUpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgcmV0dXJuIHJlYWRfbWVtb3J5X2ludGVnZXIgKEZSQU1FX0ZQIChmcmFtZSkgKyAyLCBQVFJfU0laRSk7Cit9CisKK3ZvaWQgCitoODUwMF9wb3BfZnJhbWUgKCkKK3sKKyAgdW5zaWduZWQgcmVnbnVtOworICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyBmc3I7CisgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZSA9IGdldF9jdXJyZW50X2ZyYW1lICgpOworCisgIGdldF9mcmFtZV9zYXZlZF9yZWdzIChmcmFtZSwgJmZzcik7CisKKyAgZm9yIChyZWdudW0gPSAwOyByZWdudW0gPCA4OyByZWdudW0rKykKKyAgICB7CisgICAgICBpZiAoZnNyLnJlZ3NbcmVnbnVtXSkKKwl3cml0ZV9yZWdpc3RlciAocmVnbnVtLCByZWFkX21lbW9yeV9zaG9ydCAoZnNyLnJlZ3NbcmVnbnVtXSkpOworCisgICAgICBmbHVzaF9jYWNoZWRfZnJhbWVzICgpOworICAgIH0KK30KKwordm9pZAorcHJpbnRfcmVnaXN0ZXJfaG9vayAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgaWYgKHJlZ25vID09IENDUl9SRUdOVU0pCisgICAgeworICAgICAgLyogQ0NSIHJlZ2lzdGVyICovCisKKyAgICAgIGludCBDLCBaLCBOLCBWOworICAgICAgdW5zaWduZWQgY2hhciBiWzJdOworICAgICAgdW5zaWduZWQgY2hhciBsOworCisgICAgICByZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyAocmVnbm8sIGIpOworICAgICAgbCA9IGJbMV07CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIlx0Iik7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIkktJWQgLSAiLCAobCAmIDB4ODApICE9IDApOworICAgICAgTiA9IChsICYgMHg4KSAhPSAwOworICAgICAgWiA9IChsICYgMHg0KSAhPSAwOworICAgICAgViA9IChsICYgMHgyKSAhPSAwOworICAgICAgQyA9IChsICYgMHgxKSAhPSAwOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJOLSVkICIsIE4pOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJaLSVkICIsIFopOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJWLSVkICIsIFYpOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJDLSVkICIsIEMpOworICAgICAgaWYgKChDIHwgWikgPT0gMCkKKwlwcmludGZfdW5maWx0ZXJlZCAoInU+ICIpOworICAgICAgaWYgKChDIHwgWikgPT0gMSkKKwlwcmludGZfdW5maWx0ZXJlZCAoInU8PSAiKTsKKyAgICAgIGlmICgoQyA9PSAwKSkKKwlwcmludGZfdW5maWx0ZXJlZCAoInU+PSAiKTsKKyAgICAgIGlmIChDID09IDEpCisJcHJpbnRmX3VuZmlsdGVyZWQgKCJ1PCAiKTsKKyAgICAgIGlmIChaID09IDApCisJcHJpbnRmX3VuZmlsdGVyZWQgKCIhPSAiKTsKKyAgICAgIGlmIChaID09IDEpCisJcHJpbnRmX3VuZmlsdGVyZWQgKCI9PSAiKTsKKyAgICAgIGlmICgoTiBeIFYpID09IDApCisJcHJpbnRmX3VuZmlsdGVyZWQgKCI+PSAiKTsKKyAgICAgIGlmICgoTiBeIFYpID09IDEpCisJcHJpbnRmX3VuZmlsdGVyZWQgKCI8ICIpOworICAgICAgaWYgKChaIHwgKE4gXiBWKSkgPT0gMCkKKwlwcmludGZfdW5maWx0ZXJlZCAoIj4gIik7CisgICAgICBpZiAoKFogfCAoTiBeIFYpKSA9PSAxKQorCXByaW50Zl91bmZpbHRlcmVkICgiPD0gIik7CisgICAgfQorfQorCitpbnQKK2g4NTAwX3JlZ2lzdGVyX3NpemUgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHN3aXRjaCAocmVnbm8pCisgICAgeworICAgIGNhc2UgU0VHX0NfUkVHTlVNOgorICAgIGNhc2UgU0VHX0RfUkVHTlVNOgorICAgIGNhc2UgU0VHX0VfUkVHTlVNOgorICAgIGNhc2UgU0VHX1RfUkVHTlVNOgorICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBSMF9SRUdOVU06CisgICAgY2FzZSBSMV9SRUdOVU06CisgICAgY2FzZSBSMl9SRUdOVU06CisgICAgY2FzZSBSM19SRUdOVU06CisgICAgY2FzZSBSNF9SRUdOVU06CisgICAgY2FzZSBSNV9SRUdOVU06CisgICAgY2FzZSBSNl9SRUdOVU06CisgICAgY2FzZSBSN19SRUdOVU06CisgICAgY2FzZSBDQ1JfUkVHTlVNOgorICAgICAgcmV0dXJuIDI7CisKKyAgICBjYXNlIFBSMF9SRUdOVU06CisgICAgY2FzZSBQUjFfUkVHTlVNOgorICAgIGNhc2UgUFIyX1JFR05VTToKKyAgICBjYXNlIFBSM19SRUdOVU06CisgICAgY2FzZSBQUjRfUkVHTlVNOgorICAgIGNhc2UgUFI1X1JFR05VTToKKyAgICBjYXNlIFBSNl9SRUdOVU06CisgICAgY2FzZSBQUjdfUkVHTlVNOgorICAgIGNhc2UgUENfUkVHTlVNOgorICAgICAgcmV0dXJuIDQ7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworc3RydWN0IHR5cGUgKgoraDg1MDBfcmVnaXN0ZXJfdmlydHVhbF90eXBlIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBzd2l0Y2ggKHJlZ25vKQorICAgIHsKKyAgICBjYXNlIFNFR19DX1JFR05VTToKKyAgICBjYXNlIFNFR19FX1JFR05VTToKKyAgICBjYXNlIFNFR19EX1JFR05VTToKKyAgICBjYXNlIFNFR19UX1JFR05VTToKKyAgICAgIHJldHVybiBidWlsdGluX3R5cGVfdW5zaWduZWRfY2hhcjsKKyAgICBjYXNlIFIwX1JFR05VTToKKyAgICBjYXNlIFIxX1JFR05VTToKKyAgICBjYXNlIFIyX1JFR05VTToKKyAgICBjYXNlIFIzX1JFR05VTToKKyAgICBjYXNlIFI0X1JFR05VTToKKyAgICBjYXNlIFI1X1JFR05VTToKKyAgICBjYXNlIFI2X1JFR05VTToKKyAgICBjYXNlIFI3X1JFR05VTToKKyAgICBjYXNlIENDUl9SRUdOVU06CisgICAgICByZXR1cm4gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX3Nob3J0OworICAgIGNhc2UgUFIwX1JFR05VTToKKyAgICBjYXNlIFBSMV9SRUdOVU06CisgICAgY2FzZSBQUjJfUkVHTlVNOgorICAgIGNhc2UgUFIzX1JFR05VTToKKyAgICBjYXNlIFBSNF9SRUdOVU06CisgICAgY2FzZSBQUjVfUkVHTlVNOgorICAgIGNhc2UgUFI2X1JFR05VTToKKyAgICBjYXNlIFBSN19SRUdOVU06CisgICAgY2FzZSBQQ19SRUdOVU06CisgICAgICByZXR1cm4gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmc7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogUHV0IGhlcmUgdGhlIGNvZGUgdG8gc3RvcmUsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywKKyAgIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4KKyAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbAorICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDoKKyAgIHRoZSBhZGRyZXNzIHdlIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4gICovCisKK3ZvaWQKK2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyAoZnJhbWVfaW5mbywgZnJhbWVfc2F2ZWRfcmVncykKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lX2luZm87CisgICAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICpmcmFtZV9zYXZlZF9yZWdzOworeworICByZWdpc3RlciBpbnQgcmVnbnVtOworICByZWdpc3RlciBpbnQgcmVnbWFzazsKKyAgcmVnaXN0ZXIgQ09SRV9BRERSIG5leHRfYWRkcjsKKyAgcmVnaXN0ZXIgQ09SRV9BRERSIHBjOworICB1bnNpZ25lZCBjaGFyIHRoZWJ5dGU7CisKKyAgbWVtc2V0IChmcmFtZV9zYXZlZF9yZWdzLCAnXDAnLCBzaXplb2YgKmZyYW1lX3NhdmVkX3JlZ3MpOworCisgIGlmICgoZnJhbWVfaW5mbyktPnBjID49IChmcmFtZV9pbmZvKS0+ZnJhbWUgLSBDQUxMX0RVTU1ZX0xFTkdUSCAtIEZQX1JFR05VTSAqIDQgLSA0CisgICAgICAmJiAoZnJhbWVfaW5mbyktPnBjIDw9IChmcmFtZV9pbmZvKS0+ZnJhbWUpCisgICAgeworICAgICAgbmV4dF9hZGRyID0gKGZyYW1lX2luZm8pLT5mcmFtZTsKKyAgICAgIHBjID0gKGZyYW1lX2luZm8pLT5mcmFtZSAtIENBTExfRFVNTVlfTEVOR1RIIC0gRlBfUkVHTlVNICogNCAtIDQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcGMgPSBnZXRfcGNfZnVuY3Rpb25fc3RhcnQgKChmcmFtZV9pbmZvKS0+cGMpOworICAgICAgLyogVmVyaWZ5IHdlIGhhdmUgYSBsaW5rIGE2IGluc3RydWN0aW9uIG5leHQ7CisJIGlmIG5vdCB3ZSBsb3NlLiAgSWYgd2Ugd2luLCBmaW5kIHRoZSBhZGRyZXNzIGFib3ZlIHRoZSBzYXZlZAorCSByZWdzIHVzaW5nIHRoZSBhbW91bnQgb2Ygc3RvcmFnZSBmcm9tIHRoZSBsaW5rIGluc3RydWN0aW9uLgorCSAqLworCisgICAgICB0aGVieXRlID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDEpOworICAgICAgaWYgKDB4MWYgPT0gdGhlYnl0ZSkKKwluZXh0X2FkZHIgPSAoZnJhbWVfaW5mbyktPmZyYW1lICsgcmVhZF9tZW1vcnlfaW50ZWdlciAocGMgKz0gMSwgMiksIHBjICs9IDI7CisgICAgICBlbHNlIGlmICgweDE3ID09IHRoZWJ5dGUpCisJbmV4dF9hZGRyID0gKGZyYW1lX2luZm8pLT5mcmFtZSArIHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjICs9IDEsIDEpLCBwYyArPSAxOworICAgICAgZWxzZQorCWdvdG8gbG9zZTsKKyNpZiAwCisgICAgICAvKiBGSVhNRSBzdGV2ZSAqLworICAgICAgLyogSWYgaGF2ZSBhbiBhZGQ6Zy53YWRkYWwgIy1uLCBzcCBuZXh0LCBhZGp1c3QgbmV4dF9hZGRyLiAgKi8KKyAgICAgIGlmICgoMHgwYzAxNzc3NzcgJiByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgMikpID09IDAxNTc3NzQpCisJbmV4dF9hZGRyICs9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjICs9IDIsIDQpLCBwYyArPSA0OworI2VuZGlmCisgICAgfQorCisgIHRoZWJ5dGUgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgMSk7CisgIGlmICh0aGVieXRlID09IDB4MTIpCisgICAgeworICAgICAgLyogR290IHN0bSAqLworICAgICAgcGMrKzsKKyAgICAgIHJlZ21hc2sgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgMSk7CisgICAgICBwYysrOworICAgICAgZm9yIChyZWdudW0gPSAwOyByZWdudW0gPCA4OyByZWdudW0rKywgcmVnbWFzayA+Pj0gMSkKKwl7CisJICBpZiAocmVnbWFzayAmIDEpCisJICAgIHsKKwkgICAgICAoZnJhbWVfc2F2ZWRfcmVncyktPnJlZ3NbcmVnbnVtXSA9IChuZXh0X2FkZHIgKz0gMikgLSAyOworCSAgICB9CisJfQorICAgICAgdGhlYnl0ZSA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAxKTsKKyAgICB9CisgIC8qIE1heWJlIGdvdCBhIGxvYWQgb2YgcHVzaGVzICovCisgIHdoaWxlICh0aGVieXRlID09IDB4YmYpCisgICAgeworICAgICAgcGMrKzsKKyAgICAgIHJlZ251bSA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAxKSAmIDB4NzsKKyAgICAgIHBjKys7CisgICAgICAoZnJhbWVfc2F2ZWRfcmVncyktPnJlZ3NbcmVnbnVtXSA9IChuZXh0X2FkZHIgKz0gMikgLSAyOworICAgICAgdGhlYnl0ZSA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAxKTsKKyAgICB9CisKK2xvc2U6OworCisgIC8qIFJlbWVtYmVyIHRoZSBhZGRyZXNzIG9mIHRoZSBmcmFtZSBwb2ludGVyICovCisgIChmcmFtZV9zYXZlZF9yZWdzKS0+cmVnc1tGUF9SRUdOVU1dID0gKGZyYW1lX2luZm8pLT5mcmFtZTsKKworICAvKiBUaGlzIGlzIHdoZXJlIHRoZSBvbGQgc3AgaXMgaGlkZGVuICovCisgIChmcmFtZV9zYXZlZF9yZWdzKS0+cmVnc1tTUF9SRUdOVU1dID0gKGZyYW1lX2luZm8pLT5mcmFtZTsKKworICAvKiBBbmQgdGhlIFBDIC0gcmVtZW1iZXIgdGhlIHB1c2hlZCBGUCBpcyBhbHdheXMgdHdvIGJ5dGVzIGxvbmcgKi8KKyAgKGZyYW1lX3NhdmVkX3JlZ3MpLT5yZWdzW1BDX1JFR05VTV0gPSAoZnJhbWVfaW5mbyktPmZyYW1lICsgMjsKK30KKworQ09SRV9BRERSCitzYXZlZF9wY19hZnRlcl9jYWxsICgpCit7CisgIGludCB4OworICBpbnQgYSA9IHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSk7CisKKyAgeCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKGEsIGNvZGVfc2l6ZSk7CisgIGlmIChjb2RlX3NpemUgPT0gMikKKyAgICB7CisgICAgICAvKiBTdGljayBjdXJyZW50IGNvZGUgc2VnZW1lbnQgb250byB0b3AgKi8KKyAgICAgIHggJj0gMHhmZmZmOworICAgICAgeCB8PSByZWFkX3JlZ2lzdGVyIChTRUdfQ19SRUdOVU0pIDw8IDE2OworICAgIH0KKyAgeCAmPSAweGZmZmZmZjsKKyAgcmV0dXJuIHg7Cit9CisKK3ZvaWQKK2g4NTAwX3NldF9wb2ludGVyX3NpemUgKG5ld3NpemUpCisgICAgIGludCBuZXdzaXplOworeworICBzdGF0aWMgaW50IG9sZHNpemUgPSAwOworCisgIGlmIChvbGRzaXplICE9IG5ld3NpemUpCisgICAgeworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJwb2ludGVyIHNpemUgc2V0IHRvICVkIGJpdHNcbiIsIG5ld3NpemUpOworICAgICAgb2xkc2l6ZSA9IG5ld3NpemU7CisgICAgICBpZiAobmV3c2l6ZSA9PSAzMikKKwl7CisJICBtaW5pbXVtX21vZGUgPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtaW5pbXVtX21vZGUgPSAxOworCX0KKyAgICAgIF9pbml0aWFsaXplX2dkYnR5cGVzICgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2JpZ19jb21tYW5kICgpCit7CisgIGg4NTAwX3NldF9wb2ludGVyX3NpemUgKDMyKTsKKyAgY29kZV9zaXplID0gNDsKKyAgZGF0YV9zaXplID0gNDsKK30KKworc3RhdGljIHZvaWQKK21lZGl1bV9jb21tYW5kICgpCit7CisgIGg4NTAwX3NldF9wb2ludGVyX3NpemUgKDMyKTsKKyAgY29kZV9zaXplID0gNDsKKyAgZGF0YV9zaXplID0gMjsKK30KKworc3RhdGljIHZvaWQKK2NvbXBhY3RfY29tbWFuZCAoKQoreworICBoODUwMF9zZXRfcG9pbnRlcl9zaXplICgzMik7CisgIGNvZGVfc2l6ZSA9IDI7CisgIGRhdGFfc2l6ZSA9IDQ7Cit9CisKK3N0YXRpYyB2b2lkCitzbWFsbF9jb21tYW5kICgpCit7CisgIGg4NTAwX3NldF9wb2ludGVyX3NpemUgKDE2KTsKKyAgY29kZV9zaXplID0gMjsKKyAgZGF0YV9zaXplID0gMjsKK30KKworc3RhdGljIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpzZXRtZW1vcnlsaXN0OworCitzdGF0aWMgdm9pZAorc2V0X21lbW9yeSAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcInNldCBtZW1vcnlcIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIGEgbWVtb3J5IHN1YmNvbW1hbmQuXG4iKTsKKyAgaGVscF9saXN0IChzZXRtZW1vcnlsaXN0LCAic2V0IG1lbW9yeSAiLCAtMSwgZ2RiX3N0ZG91dCk7Cit9CisKKy8qIFNlZSBpZiB2YXJpYWJsZSBuYW1lIGlzIHBwYyBvciBwclswLTddICovCisKK2ludAoraDg1MDBfaXNfdHJhcHBlZF9pbnRlcm5hbHZhciAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgaWYgKG5hbWVbMF0gIT0gJ3AnKQorICAgIHJldHVybiAwOworCisgIGlmIChzdHJjbXAgKG5hbWUgKyAxLCAicGMiKSA9PSAwKQorICAgIHJldHVybiAxOworCisgIGlmIChuYW1lWzFdID09ICdyJworICAgICAgJiYgbmFtZVsyXSA+PSAnMCcKKyAgICAgICYmIG5hbWVbMl0gPD0gJzcnCisgICAgICAmJiBuYW1lWzNdID09ICdcMDAwJykKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCit2YWx1ZV9wdHIKK2g4NTAwX3ZhbHVlX29mX3RyYXBwZWRfaW50ZXJuYWx2YXIgKHZhcikKKyAgICAgc3RydWN0IGludGVybmFsdmFyICp2YXI7Cit7CisgIExPTkdFU1QgcmVndmFsOworICB1bnNpZ25lZCBjaGFyIHJlZ2J1Zls0XTsKKyAgaW50IHBhZ2VfcmVnbnVtLCByZWdudW07CisKKyAgcmVnbnVtID0gdmFyLT5uYW1lWzJdID09ICdjJyA/IFBDX1JFR05VTSA6IHZhci0+bmFtZVsyXSAtICcwJzsKKworICBzd2l0Y2ggKHZhci0+bmFtZVsyXSkKKyAgICB7CisgICAgY2FzZSAnYyc6CisgICAgICBwYWdlX3JlZ251bSA9IFNFR19DX1JFR05VTTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzAnOgorICAgIGNhc2UgJzEnOgorICAgIGNhc2UgJzInOgorICAgIGNhc2UgJzMnOgorICAgICAgcGFnZV9yZWdudW0gPSBTRUdfRF9SRUdOVU07CisgICAgICBicmVhazsKKyAgICBjYXNlICc0JzoKKyAgICBjYXNlICc1JzoKKyAgICAgIHBhZ2VfcmVnbnVtID0gU0VHX0VfUkVHTlVNOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnNic6CisgICAgY2FzZSAnNyc6CisgICAgICBwYWdlX3JlZ251bSA9IFNFR19UX1JFR05VTTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBnZXRfc2F2ZWRfcmVnaXN0ZXIgKHJlZ2J1ZiwgTlVMTCwgTlVMTCwgc2VsZWN0ZWRfZnJhbWUsIHBhZ2VfcmVnbnVtLCBOVUxMKTsKKyAgcmVndmFsID0gcmVnYnVmWzBdIDw8IDE2OworCisgIGdldF9zYXZlZF9yZWdpc3RlciAocmVnYnVmLCBOVUxMLCBOVUxMLCBzZWxlY3RlZF9mcmFtZSwgcmVnbnVtLCBOVUxMKTsKKyAgcmVndmFsIHw9IHJlZ2J1ZlswXSA8PCA4IHwgcmVnYnVmWzFdOwkvKiBYWFggaG9zdC90YXJnZXQgYnl0ZSBvcmRlciAqLworCisgIGZyZWUgKHZhci0+dmFsdWUpOwkJLyogRnJlZSB1cCBvbGQgdmFsdWUgKi8KKworICB2YXItPnZhbHVlID0gdmFsdWVfZnJvbV9sb25nZXN0IChidWlsdGluX3R5cGVfdW5zaWduZWRfbG9uZywgcmVndmFsKTsKKyAgcmVsZWFzZV92YWx1ZSAodmFyLT52YWx1ZSk7CS8qIFVuY2hhaW4gbmV3IHZhbHVlICovCisKKyAgVkFMVUVfTFZBTCAodmFyLT52YWx1ZSkgPSBsdmFsX2ludGVybmFsdmFyOworICBWQUxVRV9JTlRFUk5BTFZBUiAodmFyLT52YWx1ZSkgPSB2YXI7CisgIHJldHVybiB2YXItPnZhbHVlOworfQorCit2b2lkCitoODUwMF9zZXRfdHJhcHBlZF9pbnRlcm5hbHZhciAodmFyLCBuZXd2YWwsIGJpdHBvcywgYml0c2l6ZSwgb2Zmc2V0KQorICAgICBzdHJ1Y3QgaW50ZXJuYWx2YXIgKnZhcjsKKyAgICAgaW50IG9mZnNldCwgYml0cG9zLCBiaXRzaXplOworICAgICB2YWx1ZV9wdHIgbmV3dmFsOworeworICBjaGFyICpwYWdlX3JlZ251bSwgKnJlZ251bTsKKyAgY2hhciBleHByZXNzaW9uWzEwMF07CisgIHVuc2lnbmVkIG5ld19yZWd2YWw7CisgIHN0cnVjdCB0eXBlICp0eXBlOworICBlbnVtIHR5cGVfY29kZSBuZXd2YWxfdHlwZV9jb2RlOworCisgIHR5cGUgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFIChuZXd2YWwpKTsKKyAgbmV3dmFsX3R5cGVfY29kZSA9IFRZUEVfQ09ERSAodHlwZSk7CisKKyAgaWYgKChuZXd2YWxfdHlwZV9jb2RlICE9IFRZUEVfQ09ERV9JTlQKKyAgICAgICAmJiBuZXd2YWxfdHlwZV9jb2RlICE9IFRZUEVfQ09ERV9QVFIpCisgICAgICB8fCBUWVBFX0xFTkdUSCAodHlwZSkgIT0gc2l6ZW9mIChuZXdfcmVndmFsKSkKKyAgICBlcnJvciAoIklsbGVnYWwgdHlwZSAoJXMpIGZvciBhc3NpZ25tZW50IHRvICQlc1xuIiwKKwkgICBUWVBFX05BTUUgKFZBTFVFX1RZUEUgKG5ld3ZhbCkpLCB2YXItPm5hbWUpOworCisgIG5ld19yZWd2YWwgPSAqKGxvbmcgKikgVkFMVUVfQ09OVEVOVFNfUkFXIChuZXd2YWwpOworCisgIHJlZ251bSA9IHZhci0+bmFtZSArIDE7CisKKyAgc3dpdGNoICh2YXItPm5hbWVbMl0pCisgICAgeworICAgIGNhc2UgJ2MnOgorICAgICAgcGFnZV9yZWdudW0gPSAiY3AiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnMCc6CisgICAgY2FzZSAnMSc6CisgICAgY2FzZSAnMic6CisgICAgY2FzZSAnMyc6CisgICAgICBwYWdlX3JlZ251bSA9ICJkcCI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc0JzoKKyAgICBjYXNlICc1JzoKKyAgICAgIHBhZ2VfcmVnbnVtID0gImVwIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzYnOgorICAgIGNhc2UgJzcnOgorICAgICAgcGFnZV9yZWdudW0gPSAidHAiOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHNwcmludGYgKGV4cHJlc3Npb24sICIkJXM9JWQiLCBwYWdlX3JlZ251bSwgbmV3X3JlZ3ZhbCA+PiAxNik7CisgIHBhcnNlX2FuZF9ldmFsIChleHByZXNzaW9uKTsKKworICBzcHJpbnRmIChleHByZXNzaW9uLCAiJCVzPSVkIiwgcmVnbnVtLCBuZXdfcmVndmFsICYgMHhmZmZmKTsKKyAgcGFyc2VfYW5kX2V2YWwgKGV4cHJlc3Npb24pOworfQorCitDT1JFX0FERFIKK2g4NTAwX3JlYWRfc3AgKCkKK3sKKyAgcmV0dXJuIHJlYWRfcmVnaXN0ZXIgKFBSN19SRUdOVU0pOworfQorCit2b2lkCitoODUwMF93cml0ZV9zcCAodikKKyAgICAgQ09SRV9BRERSIHY7Cit7CisgIHdyaXRlX3JlZ2lzdGVyIChQUjdfUkVHTlVNLCB2KTsKK30KKworQ09SRV9BRERSCitoODUwMF9yZWFkX3BjIChwaWQpCisgICAgIGludCBwaWQ7Cit7CisgIHJldHVybiByZWFkX3JlZ2lzdGVyIChQQ19SRUdOVU0pOworfQorCit2b2lkCitoODUwMF93cml0ZV9wYyAodiwgcGlkKQorICAgICBDT1JFX0FERFIgdjsKKyAgICAgaW50IHBpZDsKK3sKKyAgd3JpdGVfcmVnaXN0ZXIgKFBDX1JFR05VTSwgdik7Cit9CisKK0NPUkVfQUREUgoraDg1MDBfcmVhZF9mcCAoKQoreworICByZXR1cm4gcmVhZF9yZWdpc3RlciAoUFI2X1JFR05VTSk7Cit9CisKK3ZvaWQKK2g4NTAwX3dyaXRlX2ZwICh2KQorICAgICBDT1JFX0FERFIgdjsKK3sKKyAgd3JpdGVfcmVnaXN0ZXIgKFBSNl9SRUdOVU0sIHYpOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9oODUwMF90ZGVwICgpCit7CisgIHRtX3ByaW50X2luc24gPSBwcmludF9pbnNuX2g4NTAwOworCisgIGFkZF9wcmVmaXhfY21kICgibWVtb3J5Iiwgbm9fY2xhc3MsIHNldF9tZW1vcnksCisJCSAgInNldCB0aGUgbWVtb3J5IG1vZGVsIiwgJnNldG1lbW9yeWxpc3QsICJzZXQgbWVtb3J5ICIsIDAsCisJCSAgJnNldGxpc3QpOworCisgIGFkZF9jbWQgKCJzbWFsbCIsIGNsYXNzX3N1cHBvcnQsIHNtYWxsX2NvbW1hbmQsCisJICAgIlNldCBzbWFsbCBtZW1vcnkgbW9kZWwuICgxNiBiaXQgY29kZSwgMTYgYml0IGRhdGEpIiwgJnNldG1lbW9yeWxpc3QpOworCisgIGFkZF9jbWQgKCJiaWciLCBjbGFzc19zdXBwb3J0LCBiaWdfY29tbWFuZCwKKwkgICAiU2V0IGJpZyBtZW1vcnkgbW9kZWwuICgzMiBiaXQgY29kZSwgMzIgYml0IGRhdGEpIiwgJnNldG1lbW9yeWxpc3QpOworCisgIGFkZF9jbWQgKCJtZWRpdW0iLCBjbGFzc19zdXBwb3J0LCBtZWRpdW1fY29tbWFuZCwKKwkgICAiU2V0IG1lZGl1bSBtZW1vcnkgbW9kZWwuICgzMiBiaXQgY29kZSwgMTYgYml0IGRhdGEpIiwgJnNldG1lbW9yeWxpc3QpOworCisgIGFkZF9jbWQgKCJjb21wYWN0IiwgY2xhc3Nfc3VwcG9ydCwgY29tcGFjdF9jb21tYW5kLAorCSAgICJTZXQgY29tcGFjdCBtZW1vcnkgbW9kZWwuICgxNiBiaXQgY29kZSwgMzIgYml0IGRhdGEpIiwgJnNldG1lbW9yeWxpc3QpOworCit9CmRpZmYgLS1naXQgYS9nZGIvaHAtcHN5bXRhYi1yZWFkLmMgYi9nZGIvaHAtcHN5bXRhYi1yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyNmFkYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9ocC1wc3ltdGFiLXJlYWQuYwpAQCAtMCwwICsxLDIzODEgQEAKKy8qIFJlYWQgaHAgZGVidWcgc3ltYm9scyBhbmQgY29udmVydCB0byBpbnRlcm5hbCBmb3JtYXQsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5MywgMTk5NiwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyAgIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoCisgICBhbmQgYnkgQ3lnbnVzIFN1cHBvcnQuICAqLworCisvKiBDb21tb24gaW5jbHVkZSBmaWxlIGZvciBocF9zeW10YWJfcmVhZC5jIGFuZCBocF9wc3ltdGFiX3JlYWQuYy4KKyAgIFRoaXMgaGFzIG5lc3RlZCBpbmNsdWRlcyBvZiBhIGJ1bmNoIG9mIHN0dWZmLiAqLworI2luY2x1ZGUgImhwcmVhZC5oIgorI2luY2x1ZGUgImRlbWFuZ2xlLmgiCisKKy8qIFRvIGdlbmVyYXRlIGR1bXBpbmcgY29kZSwgdW5jb21tZW50IHRoaXMgZGVmaW5lLiAgVGhlIGR1bXBpbmcKKyAgIGl0c2VsZiBpcyBjb250cm9sbGVkIGJ5IHJvdXRpbmUtbG9jYWwgc3RhdGljcyBjYWxsZWQgImR1bXBpbmciLiAqLworLyogI2RlZmluZSBEVU1QSU5HICAgICAgICAgMSAqLworCisvKiBUbyB1c2UgdGhlIHF1aWNrIGxvb2stdXAgdGFibGVzLCB1bmNvbW1lbnQgdGhpcyBkZWZpbmUuICovCisjZGVmaW5lIFFVSUNLX0xPT0tfVVAgICAgICAxCisKKy8qIFRvIGNhbGwgUFhEQiB0byBwcm9jZXNzIHVuLXByb2Nlc3NlZCBmaWxlcywgdW5jb21tZW50IHRoaXMgZGVmaW5lLiAqLworI2RlZmluZSBVU0VfUFhEQiAgICAgICAgICAgMQorCisvKiBGb3J3YXJkIHByb2NlZHVyZSBkZWNsYXJhdGlvbnMgKi8KKwordm9pZCBocHJlYWRfc3ltZmlsZV9pbml0CisgIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICopKTsKKwordm9pZAorZG9fcHhkYiBQQVJBTVMgKChiZmQgKikpOworCit2b2lkIGhwcmVhZF9idWlsZF9wc3ltdGFicworICBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICosIGludCkpOworCit2b2lkIGhwcmVhZF9zeW1maWxlX2ZpbmlzaAorICBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB1bmlvbiBkbnR0ZW50cnkgKmhwcmVhZF9nZXRfZ250dAorICBQQVJBTVMgKChpbnQsIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHByZWFkX2dldF90ZXh0bG93CisgIFBBUkFNUyAoKGludCwgaW50LCBzdHJ1Y3Qgb2JqZmlsZSAqLCBpbnQpKTsKKworc3RhdGljIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqaHByZWFkX3N0YXJ0X3BzeW10YWIKKyAgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqLCBjaGFyICosIENPUkVfQUREUiwgaW50LAorCSAgIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKiwgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKmhwcmVhZF9lbmRfcHN5bXRhYgorICBQQVJBTVMgKChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKiwgY2hhciAqKiwgaW50LCBpbnQsIENPUkVfQUREUiwKKwkgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKiosIGludCkpOworCisvKiBFbmQgb2YgZm9yd2FyZCByb3V0aW5lIGRlY2xhcmF0aW9ucyAqLworCisjaWZkZWYgVVNFX1BYREIKKworLyogTk9URSB1c2Ugb2Ygc3lzdGVtIGZpbGVzISAgTWF5IG5vdCBiZSBwb3J0YWJsZS4gKi8KKworI2RlZmluZSBQWERCX1NWUjQgIi9vcHQvbGFuZ3Rvb2xzL2Jpbi9weGRiIgorI2RlZmluZSBQWERCX0JTRCAgIi91c3IvYmluL3B4ZGIiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLyogY2hlY2sgZm9yIHRoZSBleGlzdGFuY2Ugb2YgYSBmaWxlLCBnaXZlbiBpdHMgZnVsbCBwYXRobmFtZSAqLworaW50CitmaWxlX2V4aXN0cyAoZmlsZW5hbWUpCisgICAgIGNoYXIgKmZpbGVuYW1lOworeworICBpZiAoZmlsZW5hbWUpCisgICAgcmV0dXJuIChhY2Nlc3MgKGZpbGVuYW1lLCBGX09LKSA9PSAwKTsKKyAgcmV0dXJuIDA7Cit9CisKKworLyogVHJhbnNsYXRlIGZyb20gdGhlICJocF9sYW5ndWFnZSIgZW51bWVyYXRpb24gaW4gaHAtc3ltdGFiLmgKKyAgIHVzZWQgaW4gdGhlIGRlYnVnIGluZm8gdG8gZ2RiJ3MgZ2VuZXJpYyBlbnVtZXJhdGlvbiBpbiBkZWZzLmguICovCitzdGF0aWMgZW51bSBsYW5ndWFnZQordHJhbnNfbGFuZyAoaW5fbGFuZykKKyAgICAgZW51bSBocF9sYW5ndWFnZSBpbl9sYW5nOworeworICBpZiAoaW5fbGFuZyA9PSBIUF9MQU5HVUFHRV9DKQorICAgIHJldHVybiBsYW5ndWFnZV9jOworCisgIGVsc2UgaWYgKGluX2xhbmcgPT0gSFBfTEFOR1VBR0VfQ1BMVVNQTFVTKQorICAgIHJldHVybiBsYW5ndWFnZV9jcGx1czsKKworICBlbHNlIGlmIChpbl9sYW5nID09IEhQX0xBTkdVQUdFX0Y3NykKKyAgICByZXR1cm4gbGFuZ3VhZ2VfZm9ydHJhbjsKKworICBlbHNlCisgICAgcmV0dXJuIGxhbmd1YWdlX3Vua25vd247Cit9CisKK3N0YXRpYyBjaGFyIG1haW5fc3RyaW5nW10gPSAibWFpbiI7CisMCisvKiBDYWxsIFBYREIgdG8gcHJvY2VzcyBvdXIgZmlsZS4KKworICAgQXBwcm9hY2ggY29waWVkIGZyb20gRERFJ3MgImRiZ2tfcnVuX3B4ZGIiLiAgTm90ZTogd2UKKyAgIGRvbid0IGNoZWNrIGZvciBCU0QgbG9jYXRpb24gb2YgcHhkYiwgbm9yIGZvciBleGlzdGFuY2UKKyAgIG9mIHB4ZGIgaXRzZWxmLCBldGMuCisKKyAgIE5PVEU6IHVzZXMgc3lzdGVtIGZ1bmN0aW9uIGFuZCBzdHJpbmcgZnVuY3Rpb25zIGRpcmVjdGx5LgorCisgICBSZXR1cm4gdmFsdWU6IDEgaWYgb2ssIDAgaWYgbm90ICovCitpbnQKK2hwcmVhZF9jYWxsX3B4ZGIgKGZpbGVfbmFtZSkKKyAgICAgY2hhciAqZmlsZV9uYW1lOworeworICBjaGFyICpwOworICBpbnQgc3RhdHVzOworICBpbnQgcmV0dmFsOworCisgIGlmIChmaWxlX2V4aXN0cyAoUFhEQl9TVlI0KSkKKyAgICB7CisgICAgICBwID0gbWFsbG9jIChzdHJsZW4gKFBYREJfU1ZSNCkgKyBzdHJsZW4gKGZpbGVfbmFtZSkgKyAyKTsKKyAgICAgIHN0cmNweSAocCwgUFhEQl9TVlI0KTsKKyAgICAgIHN0cmNhdCAocCwgIiAiKTsKKyAgICAgIHN0cmNhdCAocCwgZmlsZV9uYW1lKTsKKworICAgICAgd2FybmluZyAoIkZpbGUgbm90IHByb2Nlc3NlZCBieSBweGRiLS1hYm91dCB0byBwcm9jZXNzIG5vdy5cbiIpOworICAgICAgc3RhdHVzID0gc3lzdGVtIChwKTsKKworICAgICAgcmV0dmFsID0gKHN0YXR1cyA9PSAwKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3YXJuaW5nICgicHhkYiBub3QgZm91bmQgYXQgc3RhbmRhcmQgbG9jYXRpb246IC9vcHQvbGFuZ3Rvb2xzL2JpblxuZ2RiIHdpbGwgbm90IGJlIGFibGUgdG8gZGVidWcgJXMuXG5QbGVhc2UgaW5zdGFsbCBweGRiIGF0IHRoZSBhYm92ZSBsb2NhdGlvbiBhbmQgdGhlbiByZXN0YXJ0IGdkYi5cbllvdSBjYW4gYWxzbyBydW4gcHhkYiBvbiAlcyB3aXRoIHRoZSBjb21tYW5kXG5cInB4ZGIgJXNcIiBhbmQgdGhlbiByZXN0YXJ0IGdkYi4iLCBmaWxlX25hbWUsIGZpbGVfbmFtZSwgZmlsZV9uYW1lKTsKKworICAgICAgcmV0dmFsID0gMDsKKyAgICB9CisgIHJldHVybiByZXR2YWw7Cit9CQkJCS8qIGhwcmVhZF9jYWxsX3B4ZGIgKi8KKwwKKworLyogUmV0dXJuIDEgaWYgdGhlIGZpbGUgdHVybnMgb3V0IHRvIG5lZWQgcHJlLXByb2Nlc3NpbmcKKyAgIGJ5IFBYREIsIGFuZCB3ZSBoYXZlIHRodXMgY2FsbGVkIFBYREIgdG8gZG8gdGhpcyBwcm9jZXNzaW5nCisgICBhbmQgdGhlIGZpbGUgdGhlcmVmb3JlIG5lZWRzIHRvIGJlIHJlLWxvYWRlZC4gIE90aGVyd2lzZQorICAgcmV0dXJuIDAuICovCitpbnQKK2hwcmVhZF9weGRiX25lZWRlZCAoc3ltX2JmZCkKKyAgICAgYmZkICpzeW1fYmZkOworeworICBhc2VjdGlvbiAqcGluZm9fc2VjdGlvbiwgKmRlYnVnX3NlY3Rpb24sICpoZWFkZXJfc2VjdGlvbjsKKyAgdW5zaWduZWQgaW50IGRvX3B4ZGI7CisgIGNoYXIgKmJ1ZjsKKyAgYmZkX3NpemVfdHlwZSBoZWFkZXJfc2VjdGlvbl9zaXplOworCisgIHVuc2lnbmVkIGxvbmcgdG1wOworICB1bnNpZ25lZCBpbnQgcHhkYmVkOworCisgIGhlYWRlcl9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN5bV9iZmQsICIkSEVBREVSJCIpOworICBpZiAoIWhlYWRlcl9zZWN0aW9uKQorICAgIHsKKyAgICAgIHJldHVybiAwOwkJCS8qIE5vIGhlYWRlciBhdCBhbGwsIGNhbid0IHJlY292ZXIuLi4gKi8KKyAgICB9CisKKyAgZGVidWdfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzeW1fYmZkLCAiJERFQlVHJCIpOworICBwaW5mb19zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN5bV9iZmQsICIkUElORk8kIik7CisKKyAgaWYgKHBpbmZvX3NlY3Rpb24gJiYgIWRlYnVnX3NlY3Rpb24pCisgICAgeworICAgICAgLyogRGVidWcgaW5mbyB3aXRoIERPQywgaGFzIGRpZmZlcmVudCBoZWFkZXIgZm9ybWF0LiAKKyAgICAgICAgIHRoaXMgb25seSBoYXBwZW5zIGlmIHRoZSBmaWxlIHdhcyBweGRiZWQgYW5kIGNvbXBpbGVkIG9wdGltaXplZAorICAgICAgICAgb3RoZXJ3aXNlIHRoZSBQSU5GTyBzZWN0aW9uIGlzIG5vdCB0aGVyZS4gKi8KKyAgICAgIGhlYWRlcl9zZWN0aW9uX3NpemUgPSBiZmRfc2VjdGlvbl9zaXplIChvYmpmaWxlLT5vYmZkLCBoZWFkZXJfc2VjdGlvbik7CisKKyAgICAgIGlmIChoZWFkZXJfc2VjdGlvbl9zaXplID09IChiZmRfc2l6ZV90eXBlKSBzaXplb2YgKERPQ19pbmZvX1BYREJfaGVhZGVyKSkKKwl7CisJICBidWYgPSBhbGxvY2EgKHNpemVvZiAoRE9DX2luZm9fUFhEQl9oZWFkZXIpKTsKKworCSAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKHN5bV9iZmQsCisJCQkJCSBoZWFkZXJfc2VjdGlvbiwKKwkJCQkJIGJ1ZiwgMCwKKwkJCQkJIGhlYWRlcl9zZWN0aW9uX3NpemUpKQorCSAgICBlcnJvciAoImJmZF9nZXRfc2VjdGlvbl9jb250ZW50c1xuIik7CisKKwkgIHRtcCA9IGJmZF9nZXRfMzIgKHN5bV9iZmQsIChiZmRfYnl0ZSAqKSAoYnVmICsgc2l6ZW9mIChpbnQpICogNCkpOworCSAgcHhkYmVkID0gKHRtcCA+PiAzMSkgJiAweDE7CisKKwkgIGlmICghcHhkYmVkKQorCSAgICBlcnJvciAoImZpbGUgZGVidWcgaGVhZGVyIGluZm8gaW52YWxpZFxuIik7CisJICBkb19weGRiID0gMDsKKwl9CisKKyAgICAgIGVsc2UKKwllcnJvciAoImludmFsaWQgJEhFQURFUiQgc2l6ZSBpbiBleGVjdXRhYmxlIFxuIik7CisgICAgfQorCisgIGVsc2UKKyAgICB7CisKKyAgICAgIC8qIHRoaXMgY2FuIGJlIHRocmVlIGRpZmZlcmVudCBjYXNlczoKKyAgICAgICAgIDEuIHB4ZGJlZCBhbmQgbm90IGRvYworICAgICAgICAgLSBERUJVRyBhbmQgSEVBREVSIHNlY3Rpb25zIGFyZSB0aGVyZQorICAgICAgICAgLSBoZWFkZXIgaXMgUFhEQl9oZWFkZXIgdHlwZQorICAgICAgICAgLSBweGRiZWQgZmxhZyBpcyBzZXQgdG8gMQorCisgICAgICAgICAyLiBub3QgcHhkYmVkIGFuZCBkb2MKKyAgICAgICAgIC0gREVCVUcgYW5kIEhFQURFUiAgc2VjdGlvbnMgYXJlIHRoZXJlCisgICAgICAgICAtIGhlYWRlciBpcyBET0NfaW5mb19oZWFkZXIgdHlwZQorICAgICAgICAgLSBweGRiZWQgZmxhZyBpcyBzZXQgdG8gMAorCisgICAgICAgICAzLiBub3QgcHhkYmVkIGFuZCBub3QgZG9jCisgICAgICAgICAtIERFQlVHIGFuZCBIRUFERVIgc2VjdGlvbnMgYXJlIHRoZXJlCisgICAgICAgICAtIGhlYWRlciBpcyBYREJfaGVhZGVyIHR5cGUKKyAgICAgICAgIC0gcHhkYmVkIGZsYWcgaXMgc2V0IHRvIDAKKworICAgICAgICAgTk9URTogdGhlIHB4ZGJlZCBmbGFnIGlzIG1lYW5pbmdmdWwgYWxzbyBpbiB0aGUgbm90CisgICAgICAgICBhbHJlYWR5IHB4ZGIgcHJvY2Vzc2VkIHZlcnNpb24gb2YgdGhlIGhlYWRlciwKKyAgICAgICAgIGJlY2F1c2UgaW4gY2FzZSBvbiBub24tYWxyZWFkeSBwcm9jZXNzZWQgYnkgcHhkYiBmaWxlcworICAgICAgICAgdGhhdCBzYW1lIGJpdCBpbiB0aGUgaGVhZGVyIHdvdWxkIGJlIGFsd2F5cyB6ZXJvLgorICAgICAgICAgV2h5PyBCZWNhdXNlIHRoZSBiaXQgaXMgdGhlIGxlZnRtb3N0IGJpdCBvZiBhIHdvcmQKKyAgICAgICAgIHdoaWNoIGNvbnRhaW5zIGEgJ2xlbmd0aCcgd2hpY2ggaXMgYWx3YXlzIGEgcG9zaXRpdmUgdmFsdWUKKyAgICAgICAgIHNvIHRoYXQgYml0IGlzIG5ldmVyIHNldCB0byAxIChvdGhlcndpc2UgaXQgd291bGQgYmUgbmVnYXRpdmUpCisKKyAgICAgICAgIEdpdmVuIHRoZSBhYm92ZSwgd2UgaGF2ZSB0d28gY2hvaWNlcyA6IGVpdGhlciB3ZSBpZ25vcmUgdGhlCisgICAgICAgICBzaXplIG9mIHRoZSBoZWFkZXIgaXRzZWxmIGFuZCBqdXN0IGxvb2sgYXQgdGhlIHB4ZGJlZCBmaWVsZCwKKyAgICAgICAgIG9yIHdlIGNoZWNrIHRoZSBzaXplIGFuZCB0aGVuIHdlIChmb3Igc2FmZXR5IGFuZCBwYXJhbm9pYSByZWxhdGVkCisgICAgICAgICBpc3N1ZXMpIGNoZWNrIHRoZSBiaXQuCisgICAgICAgICBUaGUgZmlyc3Qgc29sdXRpb24gaXMgdXNlZCBieSBEREUsIHRoZSBzZWNvbmQgYnkgUFhEQiBpdHNlbGYuCisgICAgICAgICBJIGFtIHVzaW5nIHRoZSBzZWNvbmQgb25lIGhlcmUsIGJlY2F1c2UgSSBhbHJlYWR5IHdyb3RlIGl0LAorICAgICAgICAgYW5kIGl0IGlzIHRoZSBlbmQgb2YgYSBsb25nIGRheS4KKyAgICAgICAgIEFsc28sIHVzaW5nIHRoZSBmaXJzdCBhcHByb2FjaCB3b3VsZCBzdGlsbCBpbnZvbHZlIHNpemUgaXNzdWVzCisgICAgICAgICBiZWNhdXNlIHdlIG5lZWQgdG8gcmVhZCBpbiB0aGUgY29udGVudHMgb2YgdGhlIGhlYWRlciBzZWN0aW9uLCBhbmQKKyAgICAgICAgIGdpdmUgdGhlIGNvcnJlY3QgYW1vdW50IG9mIHN0dWZmIHdlIHdhbnQgdG8gcmVhZCB0byB0aGUKKyAgICAgICAgIGdldF9iZmRfc2VjdGlvbl9jb250ZW50cyBmdW5jdGlvbi4gICovCisKKyAgICAgIC8qIGRlY2lkZSB3aGljaCBjYXNlIGRlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyIHNlY3Rpb24uCisgICAgICAgICBUaGUgc2l6ZSBpcyBhcyBkZWZpbmVkIGluIGhwLXN5bXRhYi5oICAqLworCisgICAgICBoZWFkZXJfc2VjdGlvbl9zaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAob2JqZmlsZS0+b2JmZCwgaGVhZGVyX3NlY3Rpb24pOworCisgICAgICBpZiAoaGVhZGVyX3NlY3Rpb25fc2l6ZSA9PSAoYmZkX3NpemVfdHlwZSkgc2l6ZW9mIChQWERCX2hlYWRlcikpCS8qIHB4ZGIgYW5kIG5vdCBkb2MgKi8KKwl7CisKKwkgIGJ1ZiA9IGFsbG9jYSAoc2l6ZW9mIChQWERCX2hlYWRlcikpOworCSAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKHN5bV9iZmQsCisJCQkJCSBoZWFkZXJfc2VjdGlvbiwKKwkJCQkJIGJ1ZiwgMCwKKwkJCQkJIGhlYWRlcl9zZWN0aW9uX3NpemUpKQorCSAgICBlcnJvciAoImJmZF9nZXRfc2VjdGlvbl9jb250ZW50c1xuIik7CisKKwkgIHRtcCA9IGJmZF9nZXRfMzIgKHN5bV9iZmQsIChiZmRfYnl0ZSAqKSAoYnVmICsgc2l6ZW9mIChpbnQpICogMykpOworCSAgcHhkYmVkID0gKHRtcCA+PiAzMSkgJiAweDE7CisKKwkgIGlmIChweGRiZWQpCisJICAgIGRvX3B4ZGIgPSAwOworCSAgZWxzZQorCSAgICBlcnJvciAoImZpbGUgZGVidWcgaGVhZGVyIGludmFsaWRcbiIpOworCX0KKyAgICAgIGVsc2UJCQkvKm5vdCBweGRiZWQgYW5kIGRvYyBPUiBub3QgcHhkYmVkIGFuZCBub24gZG9jICovCisJZG9fcHhkYiA9IDE7CisgICAgfQorCisgIGlmIChkb19weGRiKQorICAgIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KK30JCQkJLyogaHByZWFkX3B4ZGJfbmVlZGVkICovCisKKyNlbmRpZgorCisvKiBDaGVjayB3aGV0aGVyIHRoZSBmaWxlIG5lZWRzIHRvIGJlIHByZXByb2Nlc3NlZCBieSBweGRiLiAKKyAgIElmIHNvLCBjYWxsIHB4ZGIuICovCisKK3ZvaWQgCitkb19weGRiIChzeW1fYmZkKQorICAgICBiZmQgKnN5bV9iZmQ7Cit7CisgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBIUC1zcGVjaWZpYy4gIFRoZSAicmlnaHQiIHdheSBvZgorICAgICBkb2luZyB0aGlzIGlzIHVua25vd24sIGJ1dCB3ZSBiZXQgd291bGQgaW52b2x2ZSBhIHRhcmdldC0KKyAgICAgc3BlY2lmaWMgcHJlLWZpbGUtbG9hZCBjaGVjayB1c2luZyBhIGdlbmVyaWMgbWVjaGFuaXNtLiAqLworCisgIC8qIFRoaXMgY29kZSB3aWxsIG5vdCBiZSBleGVjdXRlZCBpZiB0aGUgZmlsZSBpcyBub3QgaW4gU09NCisgICAgIGZvcm1hdCAoaS5lLiBpZiBjb21waWxlZCB3aXRoIGdjYykgKi8KKyAgICBpZiAoaHByZWFkX3B4ZGJfbmVlZGVkIChzeW1fYmZkKSkgCisgICAgICB7CisJLypUaGlzIGZpbGUgaGFzIG5vdCBiZWVuIHByZS1wcm9jZXNzZWQuIFByZXByb2Nlc3Mgbm93ICovCisJICAKKwlpZiAoaHByZWFkX2NhbGxfcHhkYiAoc3ltX2JmZC0+ZmlsZW5hbWUpKQorCSAgeworCSAgICAvKiBUaGUgY2FsbCBhYm92ZSBoYXMgY2hhbmdlZCB0aGUgb24tZGlzayBmaWxlLCAKKyAgICAgICAgICAgICAgIHdlIGNhbiBjbG9zZSB0aGUgZmlsZSBhbnl3YXksIGJlY2F1c2UgdGhlCisJICAgICAgIHN5bWJvbHMgd2lsbCBiZSByZXJlYWQgaW4gd2hlbiB0aGUgdGFyZ2V0IGlzIHJ1biAqLworCSAgICBiZmRfY2xvc2UgKHN5bV9iZmQpOyAKKwkgIH0KKyAgICAgIH0KK30KKworDAorCisjaWZkZWYgUVVJQ0tfTE9PS19VUAorCisvKiBDb2RlIHRvIGhhbmRsZSBxdWljayBsb29rdXAtdGFibGVzIGZvbGxvd3MuICovCisKKworLyogU29tZSB1c2VmdWwgbWFjcm9zICovCisjZGVmaW5lIFZBTElEX0ZJTEUoaSkgICAoKGkpIDwgcHhkYl9oZWFkZXJfcC0+ZmRfZW50cmllcykKKyNkZWZpbmUgVkFMSURfTU9EVUxFKGkpICgoaSkgPCBweGRiX2hlYWRlcl9wLT5tZF9lbnRyaWVzKQorI2RlZmluZSBWQUxJRF9QUk9DKGkpICAgKChpKSA8IHB4ZGJfaGVhZGVyX3AtPnBkX2VudHJpZXMpCisjZGVmaW5lIFZBTElEX0NMQVNTKGkpICAoKGkpIDwgcHhkYl9oZWFkZXJfcC0+Y2RfZW50cmllcykKKworI2RlZmluZSBGSUxFX1NUQVJUKGkpICAgIChxRkRbaV0uYWRyU3RhcnQpCisjZGVmaW5lIE1PRFVMRV9TVEFSVChpKSAocU1EW2ldLmFkclN0YXJ0KQorI2RlZmluZSBQUk9DX1NUQVJUKGkpICAgIChxUERbaV0uYWRyU3RhcnQpCisKKyNkZWZpbmUgRklMRV9FTkQoaSkgICAocUZEW2ldLmFkckVuZCkKKyNkZWZpbmUgTU9EVUxFX0VORChpKSAocU1EW2ldLmFkckVuZCkKKyNkZWZpbmUgUFJPQ19FTkQoaSkgICAocVBEW2ldLmFkckVuZCkKKworI2RlZmluZSBGSUxFX0lTWU0oaSkgICAocUZEW2ldLmlzeW0pCisjZGVmaW5lIE1PRFVMRV9JU1lNKGkpIChxTURbaV0uaXN5bSkKKyNkZWZpbmUgUFJPQ19JU1lNKGkpICAgKHFQRFtpXS5pc3ltKQorCisjZGVmaW5lIFZBTElEX0NVUlJfRklMRSAgICAoY3Vycl9mZCA8IHB4ZGJfaGVhZGVyX3AtPmZkX2VudHJpZXMpCisjZGVmaW5lIFZBTElEX0NVUlJfTU9EVUxFICAoY3Vycl9tZCA8IHB4ZGJfaGVhZGVyX3AtPm1kX2VudHJpZXMpCisjZGVmaW5lIFZBTElEX0NVUlJfUFJPQyAgICAoY3Vycl9wZCA8IHB4ZGJfaGVhZGVyX3AtPnBkX2VudHJpZXMpCisjZGVmaW5lIFZBTElEX0NVUlJfQ0xBU1MgICAoY3Vycl9jZCA8IHB4ZGJfaGVhZGVyX3AtPmNkX2VudHJpZXMpCisKKyNkZWZpbmUgQ1VSUl9GSUxFX1NUQVJUICAgICAocUZEW2N1cnJfZmRdLmFkclN0YXJ0KQorI2RlZmluZSBDVVJSX01PRFVMRV9TVEFSVCAgIChxTURbY3Vycl9tZF0uYWRyU3RhcnQpCisjZGVmaW5lIENVUlJfUFJPQ19TVEFSVCAgICAgKHFQRFtjdXJyX3BkXS5hZHJTdGFydCkKKworI2RlZmluZSBDVVJSX0ZJTEVfRU5EICAgIChxRkRbY3Vycl9mZF0uYWRyRW5kKQorI2RlZmluZSBDVVJSX01PRFVMRV9FTkQgIChxTURbY3Vycl9tZF0uYWRyRW5kKQorI2RlZmluZSBDVVJSX1BST0NfRU5EICAgIChxUERbY3Vycl9wZF0uYWRyRW5kKQorCisjZGVmaW5lIENVUlJfRklMRV9JU1lNICAgIChxRkRbY3Vycl9mZF0uaXN5bSkKKyNkZWZpbmUgQ1VSUl9NT0RVTEVfSVNZTSAgKHFNRFtjdXJyX21kXS5pc3ltKQorI2RlZmluZSBDVVJSX1BST0NfSVNZTSAgICAocVBEW2N1cnJfcGRdLmlzeW0pCisKKyNkZWZpbmUgVEVMTF9PQkpGSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgaWYoICF0b2xkX29iamZpbGUgKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICB0b2xkX29iamZpbGUgPSAxOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgd2FybmluZyAoIlxuSW4gb2JqZWN0IGZpbGUgXCIlc1wiOlxuIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamZpbGUtPm5hbWUpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IHdoaWxlICgwKQorDAorCisKKy8qIEtlZXBpbmcgdHJhY2sgb2YgdGhlIHN0YXJ0L2VuZCBzeW1ib2wgdGFibGUgKExOVFQpIGluZGljZXMgb2YKKyAgIHBzeW10YWJzIGNyZWF0ZWQgc28gZmFyICovCisKK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBpbnQgc3RhcnQ7CisgICAgaW50IGVuZDsKKyAgfQorcHN0X3N5bXNfc3RydWN0OworCitzdGF0aWMgcHN0X3N5bXNfc3RydWN0ICpwc3Rfc3ltc19hcnJheSA9IDA7CisKK3N0YXRpYyBwc3Rfc3ltc19jb3VudCA9IDA7CitzdGF0aWMgcHN0X3N5bXNfc2l6ZSA9IDA7CisKKy8qIHVzZWQgYnkgdGhlIFRFTExfT0JKRklMRSBtYWNybyAqLworc3RhdGljIGJvb2xlYW4gdG9sZF9vYmpmaWxlID0gMDsKKworLyogU2V0IHVwIHBzeW10YWIgc3ltYm9sIGluZGV4IHN0dWZmICovCitzdGF0aWMgdm9pZAoraW5pdF9wc3Rfc3ltcyAoKQoreworICBwc3Rfc3ltc19jb3VudCA9IDA7CisgIHBzdF9zeW1zX3NpemUgPSAyMDsKKyAgcHN0X3N5bXNfYXJyYXkgPSAocHN0X3N5bXNfc3RydWN0ICopIHhtYWxsb2MgKDIwICogc2l6ZW9mIChwc3Rfc3ltc19zdHJ1Y3QpKTsKK30KKworLyogQ2xlYW4gdXAgcHN5bXRhYiBzeW1ib2wgaW5kZXggc3R1ZmYgKi8KK3N0YXRpYyB2b2lkCitjbGVhcl9wc3Rfc3ltcyAoKQoreworICBwc3Rfc3ltc19jb3VudCA9IDA7CisgIHBzdF9zeW1zX3NpemUgPSAwOworICBmcmVlIChwc3Rfc3ltc19hcnJheSk7CisgIHBzdF9zeW1zX2FycmF5ID0gMDsKK30KKworLyogQWRkIGluZm9ybWF0aW9uIGFib3V0IGxhdGVzdCBwc3ltdGFiIHRvIHN5bWJvbCBpbmRleCB0YWJsZSAqLworc3RhdGljIHZvaWQKK3JlY29yZF9wc3Rfc3ltcyAoc3RhcnRfc3ltLCBlbmRfc3ltKQorICAgICBpbnQgc3RhcnRfc3ltOworICAgICBpbnQgZW5kX3N5bTsKK3sKKyAgaWYgKCsrcHN0X3N5bXNfY291bnQgPiBwc3Rfc3ltc19zaXplKQorICAgIHsKKyAgICAgIHBzdF9zeW1zX2FycmF5ID0gKHBzdF9zeW1zX3N0cnVjdCAqKSB4cmVhbGxvYyAocHN0X3N5bXNfYXJyYXksCisJCQkgICAgICAyICogcHN0X3N5bXNfc2l6ZSAqIHNpemVvZiAocHN0X3N5bXNfc3RydWN0KSk7CisgICAgICBwc3Rfc3ltc19zaXplICo9IDI7CisgICAgfQorICBwc3Rfc3ltc19hcnJheVtwc3Rfc3ltc19jb3VudCAtIDFdLnN0YXJ0ID0gc3RhcnRfc3ltOworICBwc3Rfc3ltc19hcnJheVtwc3Rfc3ltc19jb3VudCAtIDFdLmVuZCA9IGVuZF9zeW07Cit9CisKKy8qIEZpbmQgYSBzdWl0YWJsZSBzeW1ib2wgdGFibGUgaW5kZXggd2hpY2ggY2FuIHNlcnZlIGFzIHRoZSB1cHBlcgorICAgYm91bmQgb2YgYSBwc3ltdGFiIHRoYXQgc3RhcnRzIGF0IElOREVYCisKKyAgIFRoaXMgc2NhbnMgYmFja3dhcmRzIGluIHRoZSBwc3ltdGFiIHN5bWJvbCBpbmRleCB0YWJsZSB0byBmaW5kIGEKKyAgICJob2xlIiBpbiB3aGljaCB0aGUgZ2l2ZW4gaW5kZXggY2FuIGZpdC4gIFRoaXMgaXMgYSBoZXVyaXN0aWMhIQorICAgV2UgZG9uJ3Qgc2VhcmNoIHRoZSBlbnRpcmUgdGFibGUgdG8gY2hlY2sgZm9yIG11bHRpcGxlIGhvbGVzLAorICAgd2UgZG9uJ3QgY2FyZSBhYm91dCBvdmVybGFwcywgZXRjLiAKKworICAgUmV0dXJuIDAgPT4gbm90IGZvdW5kICovCitzdGF0aWMgaW50CitmaW5kX25leHRfcHN0X3N0YXJ0IChpbmRleCkKKyAgICAgaW50IGluZGV4OworeworICBpbnQgaTsKKworICBmb3IgKGkgPSBwc3Rfc3ltc19jb3VudCAtIDE7IGkgPj0gMDsgaS0tKQorICAgIGlmIChwc3Rfc3ltc19hcnJheVtpXS5lbmQgPD0gaW5kZXgpCisgICAgICByZXR1cm4gKGkgPT0gcHN0X3N5bXNfY291bnQgLSAxKSA/IDAgOiBwc3Rfc3ltc19hcnJheVtpICsgMV0uc3RhcnQgLSAxOworCisgIGlmIChwc3Rfc3ltc19hcnJheVswXS5zdGFydCA+IGluZGV4KQorICAgIHJldHVybiBwc3Rfc3ltc19hcnJheVswXS5zdGFydCAtIDE7CisKKyAgcmV0dXJuIDA7Cit9CisMCisKKworLyogVXRpbGl0eSBmdW5jdGlvbnMgdG8gZmluZCB0aGUgZW5kaW5nIHN5bWJvbCBpbmRleCBmb3IgYSBwc3ltdGFiICovCisKKy8qIEZpbmQgdGhlIG5leHQgZmlsZSBlbnRyeSB0aGF0IGJlZ2lucyBiZXlvbmQgSU5ERVgsIGFuZCByZXR1cm4KKyAgIGl0cyBzdGFydGluZyBzeW1ib2wgaW5kZXggLSAxLgorICAgUUZEIGlzIHRoZSBmaWxlIHRhYmxlLCBDVVJSX0ZEIGlzIHRoZSBmaWxlIGVudHJ5IGZyb20gd2hlcmUgdG8gc3RhcnQsCisgICBQWERCX0hFQURFUl9QIGFzIGluIGhwcmVhZF9xdWlja190cmF2ZXJzZSAodG8gYWxsb3cgbWFjcm9zIHRvIHdvcmspLgorCisgICBSZXR1cm4gMCA9PiBub3QgZm91bmQgKi8KK3N0YXRpYyBpbnQKK2ZpbmRfbmV4dF9maWxlX2lzeW0gKGluZGV4LCBxRkQsIGN1cnJfZmQsIHB4ZGJfaGVhZGVyX3ApCisgICAgIGludCBpbmRleDsKKyAgICAgcXVpY2tfZmlsZV9lbnRyeSAqcUZEOworICAgICBpbnQgY3Vycl9mZDsKKyAgICAgUFhEQl9oZWFkZXJfcHRyIHB4ZGJfaGVhZGVyX3A7Cit7CisgIHdoaWxlIChWQUxJRF9DVVJSX0ZJTEUpCisgICAgeworICAgICAgaWYgKENVUlJfRklMRV9JU1lNID49IGluZGV4KQorCXJldHVybiBDVVJSX0ZJTEVfSVNZTSAtIDE7CisgICAgICBjdXJyX2ZkKys7CisgICAgfQorICByZXR1cm4gMDsKK30KKworLyogRmluZCB0aGUgbmV4dCBwcm9jZWR1cmUgZW50cnkgdGhhdCBiZWdpbnMgYmV5b25kIElOREVYLCBhbmQgcmV0dXJuCisgICBpdHMgc3RhcnRpbmcgc3ltYm9sIGluZGV4IC0gMS4KKyAgIFFQRCBpcyB0aGUgcHJvY2VkdXJlIHRhYmxlLCBDVVJSX1BEIGlzIHRoZSBwcm9jIGVudHJ5IGZyb20gd2hlcmUgdG8gc3RhcnQsCisgICBQWERCX0hFQURFUl9QIGFzIGluIGhwcmVhZF9xdWlja190cmF2ZXJzZSAodG8gYWxsb3cgbWFjcm9zIHRvIHdvcmspLgorCisgICBSZXR1cm4gMCA9PiBub3QgZm91bmQgKi8KK3N0YXRpYyBpbnQKK2ZpbmRfbmV4dF9wcm9jX2lzeW0gKGluZGV4LCBxUEQsIGN1cnJfcGQsIHB4ZGJfaGVhZGVyX3ApCisgICAgIGludCBpbmRleDsKKyAgICAgcXVpY2tfcHJvY2VkdXJlX2VudHJ5ICpxUEQ7CisgICAgIGludCBjdXJyX3BkOworICAgICBQWERCX2hlYWRlcl9wdHIgcHhkYl9oZWFkZXJfcDsKK3sKKyAgd2hpbGUgKFZBTElEX0NVUlJfUFJPQykKKyAgICB7CisgICAgICBpZiAoQ1VSUl9QUk9DX0lTWU0gPj0gaW5kZXgpCisJcmV0dXJuIENVUlJfUFJPQ19JU1lNIC0gMTsKKyAgICAgIGN1cnJfcGQrKzsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBGaW5kIHRoZSBuZXh0IG1vZHVsZSBlbnRyeSB0aGF0IGJlZ2lucyBiZXlvbmQgSU5ERVgsIGFuZCByZXR1cm4KKyAgIGl0cyBzdGFydGluZyBzeW1ib2wgaW5kZXggLSAxLgorICAgUU1EIGlzIHRoZSBtb2R1bGUgdGFibGUsIENVUlJfTUQgaXMgdGhlIG1vZHVlIGVudHJ5IGZyb20gd2hlcmUgdG8gc3RhcnQsCisgICBQWERCX0hFQURFUl9QIGFzIGluIGhwcmVhZF9xdWlja190cmF2ZXJzZSAodG8gYWxsb3cgbWFjcm9zIHRvIHdvcmspLgorCisgICBSZXR1cm4gMCA9PiBub3QgZm91bmQgKi8KK3N0YXRpYyBpbnQKK2ZpbmRfbmV4dF9tb2R1bGVfaXN5bSAoaW5kZXgsIHFNRCwgY3Vycl9tZCwgcHhkYl9oZWFkZXJfcCkKKyAgICAgaW50IGluZGV4OworICAgICBxdWlja19tb2R1bGVfZW50cnkgKnFNRDsKKyAgICAgaW50IGN1cnJfbWQ7CisgICAgIFBYREJfaGVhZGVyX3B0ciBweGRiX2hlYWRlcl9wOworeworICB3aGlsZSAoVkFMSURfQ1VSUl9NT0RVTEUpCisgICAgeworICAgICAgaWYgKENVUlJfTU9EVUxFX0lTWU0gPj0gaW5kZXgpCisJcmV0dXJuIENVUlJfTU9EVUxFX0lTWU0gLSAxOworICAgICAgY3Vycl9tZCsrOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFNjYW4gYW5kIHJlY29yZCBwYXJ0aWFsIHN5bWJvbHMgZm9yIGFsbCBmdW5jdGlvbnMgc3RhcnRpbmcgZnJvbSBpbmRleAorICAgcG9pbnRlZCB0byBieSBDVVJSX1BEX1AsIGFuZCBiZXR3ZWVuIGNvZGUgYWRkcmVzc2VzIFNUQVJUX0FEUiBhbmQgRU5EX0FEUi4KKyAgIE90aGVyIHBhcmFtZXRlcnMgYXJlIGV4cGxhaW5lZCBpbiBjb21tZW50cyBiZWxvdy4gKi8KKworLyogVGhpcyB1c2VkIHRvIGJlIGlubGluZSBpbiBocHJlYWRfcXVpY2tfdHJhdmVyc2UsIGJ1dCBub3cgdGhhdCB3ZSBkbyBlc3NlbnRpYWxseSB0aGUKKyAgIHNhbWUgdGhpbmcgZm9yIHR3byBkaWZmZXJlbnQgY2FzZXMgKG1vZHVsZXMgYW5kIG1vZHVsZS1sZXNzIGZpbGVzKSwgaXQncyBiZXR0ZXIKKyAgIG9yZ2FuaXplZCBpbiBhIHNlcGFyYXRlIHJvdXRpbmUsIGFsdGhvdWdoIGl0IGRvZXMgdGFrZSBsb3RzIG9mIGFyZ3VtZW50cy4gcGFpLzE5OTctMTAtMDggKi8KKworc3RhdGljIGludAorc2Nhbl9wcm9jcyAoY3Vycl9wZF9wLCBxUEQsIG1heF9wcm9jcywgc3RhcnRfYWRyLCBlbmRfYWRyLCBwc3QsIHZ0X2JpdHMsIG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cykKKyAgICAgaW50ICpjdXJyX3BkX3A7CQkvKiBwb2ludGVyIHRvIGN1cnJlbnQgcHJvYyBpbmRleCAqLworICAgICBxdWlja19wcm9jZWR1cmVfZW50cnkgKnFQRDsJLyogdGhlIHByb2NlZHVyZSBxdWljayBsb29rdXAgdGFibGUgKi8KKyAgICAgaW50IG1heF9wcm9jczsJCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIHByb2MuIHRhYmxlICovCisgICAgIENPUkVfQUREUiBzdGFydF9hZHI7CS8qIGJlZ2lubmluZyBvZiBjb2RlIHJhbmdlIGZvciBjdXJyZW50IHBzeW10YWIgKi8KKyAgICAgQ09SRV9BRERSIGVuZF9hZHI7CQkvKiBlbmQgb2YgY29kZSByYW5nZSBmb3IgY3VycmVudCBwc3ltdGFiICovCisgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN0OwkvKiBjdXJyZW50IHBzeW10YWIgKi8KKyAgICAgY2hhciAqdnRfYml0czsJCS8qIHN0cmluZ3MgdGFibGUgb2YgU09NIGRlYnVnIHNwYWNlICovCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOwkvKiBjdXJyZW50IG9iamVjdCBmaWxlICovCisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsJLyogbm90IHJlYWxseSB1c2VkIGZvciBIUC1VWCBjdXJyZW50bHkgKi8KK3sKKyAgdW5pb24gZG50dGVudHJ5ICpkbl9idWZwOworICBpbnQgc3ltYm9sX2NvdW50ID0gMDsJCS8qIFRvdGFsIG51bWJlciBvZiBzeW1ib2xzIGluIHRoaXMgcHN5bXRhYiAqLworICBpbnQgY3Vycl9wZCA9ICpjdXJyX3BkX3A7CS8qIENvbnZlbmllbmNlIHZhcmlhYmxlIC0tIGF2b2lkIGRlcmVmZXJlbmNpbmcgcG9pbnRlciBhbGwgdGhlIHRpbWUgKi8KKworI2lmZGVmIERVTVBJTkcKKyAgLyogVHVybiB0aGlzIG9uIGZvciBsb3RzIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbiB0aGlzIHJvdXRpbmUgKi8KKyAgc3RhdGljIGludCBkdW1waW5nID0gMDsKKyNlbmRpZgorCisjaWZkZWYgRFVNUElORworICBpZiAoZHVtcGluZykKKyAgICB7CisgICAgICBwcmludGYgKCJTY2FuX3Byb2NzIGNhbGxlZCwgYWRkcmVzc2VzICV4IHRvICV4LCBwcm9jICV4XG4iLCBzdGFydF9hZHIsIGVuZF9hZHIsIGN1cnJfcGQpOworICAgIH0KKyNlbmRpZgorCisgIHdoaWxlICgoQ1VSUl9QUk9DX1NUQVJUIDw9IGVuZF9hZHIpICYmIChjdXJyX3BkIDwgbWF4X3Byb2NzKSkKKyAgICB7CisKKyAgICAgIGNoYXIgKnJ0bl9uYW1lOwkJLyogbWFuZ2xlZCBuYW1lICovCisgICAgICBjaGFyICpydG5fZGVtX25hbWU7CS8qIHF1YWxpZmllZCBkZW1hbmdsZWQgbmFtZSAqLworICAgICAgY2hhciAqY2xhc3NfbmFtZTsKKyAgICAgIGludCBjbGFzczsKKworICAgICAgaWYgKCh0cmFuc19sYW5nICgoZW51bSBocF9sYW5ndWFnZSkgcVBEW2N1cnJfcGRdLmxhbmd1YWdlKSA9PSBsYW5ndWFnZV9jcGx1cykgJiYKKwkgIHZ0X2JpdHNbKGxvbmcpIHFQRFtjdXJyX3BkXS5zYkFsaWFzXSkJCS8qIG5vdCBhIG51bGwgc3RyaW5nICovCisJeworCSAgLyogR2V0IG1hbmdsZWQgbmFtZSBmb3IgdGhlIHByb2NlZHVyZSwgYW5kIGRlbWFuZ2xlIGl0ICovCisJICBydG5fbmFtZSA9ICZ2dF9iaXRzWyhsb25nKSBxUERbY3Vycl9wZF0uc2JBbGlhc107CisJICBydG5fZGVtX25hbWUgPSBjcGx1c19kZW1hbmdsZSAocnRuX25hbWUsIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcnRuX25hbWUgPSAmdnRfYml0c1sobG9uZykgcVBEW2N1cnJfcGRdLnNiUHJvY107CisJICBydG5fZGVtX25hbWUgPSBOVUxMOworCX0KKworICAgICAgLyogSGFjayB0byBnZXQgYXJvdW5kIEhQIEMvQysrIGNvbXBpbGVycycgaW5zaXN0ZW5jZSBvbiBwcm92aWRpbmcKKyAgICAgICAgICJfTUFJTl8iIGFzIGFuIGFsdGVybmF0ZSBuYW1lIGZvciAibWFpbiIgKi8KKyAgICAgIGlmICgoc3RyY21wIChydG5fbmFtZSwgIl9NQUlOXyIpID09IDApICYmCisJICAoc3RyY21wICgmdnRfYml0c1sobG9uZykgcVBEW2N1cnJfcGRdLnNiUHJvY10sICJtYWluIikgPT0gMCkpCisJcnRuX2RlbV9uYW1lID0gcnRuX25hbWUgPSBtYWluX3N0cmluZzsKKworI2lmZGVmIERVTVBJTkcKKyAgICAgIGlmIChkdW1waW5nKQorCXsKKwkgIHByaW50ZiAoIi4uYWRkICVzIChkZW1hbmdsZWQgJXMpLCBpbmRleCAleCB0byB0aGlzIHBzeW10YWJcbiIsIHJ0bl9uYW1lLCBydG5fZGVtX25hbWUsIGN1cnJfcGQpOworCX0KKyNlbmRpZgorCisgICAgICAvKiBDaGVjayBmb3IgbW9kdWxlLXNwYW5uaW5nIHJvdXRpbmVzLiAqLworICAgICAgaWYgKENVUlJfUFJPQ19FTkQgPiBlbmRfYWRyKQorCXsKKwkgIFRFTExfT0JKRklMRTsKKwkgIHdhcm5pbmcgKCJQcm9jZWR1cmUgXCIlc1wiIFsweCV4XSBzcGFucyBmaWxlIG9yIG1vZHVsZSBib3VuZGFyaWVzLiIsIHJ0bl9uYW1lLCBjdXJyX3BkKTsKKwl9CisKKyAgICAgIC8qIEFkZCB0aGlzIHJvdXRpbmUgc3ltYm9sIHRvIHRoZSBsaXN0IGluIHRoZSBvYmpmaWxlLiAKKyAgICAgICAgIFVuZm9ydHVuYXRlbHkgd2UgaGF2ZSB0byBnbyB0byB0aGUgTE5UVCB0byBkZXRlcm1pbmUgdGhlCisgICAgICAgICBjb3JyZWN0IGxpc3QgdG8gcHV0IGl0IG9uLiBBbiBhbHRlcm5hdGl2ZSAod2hpY2ggdGhlCisgICAgICAgICBjb2RlIHVzZWQgdG8gZG8pIHdvdWxkIGJlIHRvIG5vdCBjaGVjayBhbmQgYWx3YXlzIHRocm93CisgICAgICAgICBpdCBvbiB0aGUgInN0YXRpYyIgbGlzdC4gQnV0IGlmIHdlIGdvIHRoYXQgcm91dGUsIHRoZW4KKyAgICAgICAgIHN5bWJvbF9sb29rdXAoKSBuZWVkcyB0byBiZSB0d2Vha2VkIGEgYml0IHRvIGFjY291bnQKKyAgICAgICAgIGZvciB0aGUgZmFjdCB0aGF0IHRoZSBmdW5jdGlvbiBtaWdodCBub3QgYmUgZm91bmQgb24KKyAgICAgICAgIHRoZSBjb3JyZWN0IGxpc3QgaW4gdGhlIHBzeW10YWIuIC0gUlQgKi8KKyAgICAgIGRuX2J1ZnAgPSBocHJlYWRfZ2V0X2xudHQgKHFQRFtjdXJyX3BkXS5pc3ltLCBvYmpmaWxlKTsKKyAgICAgIGlmIChkbl9idWZwLT5kZnVuYy5nbG9iYWwpCisJYWRkX3BzeW1ib2xfd2l0aF9kZW1fbmFtZV90b19saXN0IChydG5fbmFtZSwKKwkJCQkJICAgc3RybGVuIChydG5fbmFtZSksCisJCQkJCSAgIHJ0bl9kZW1fbmFtZSwKKwkJCQkJICAgc3RybGVuIChydG5fZGVtX25hbWUpLAorCQkJCQkgICBWQVJfTkFNRVNQQUNFLAorCQkJCQkgICBMT0NfQkxPQ0ssCS8qICJJIGFtIGEgcm91dGluZSIgICAgICAgICovCisJCQkJCSAgICZvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMsCisJCQkJCSAgIChxUERbY3Vycl9wZF0uYWRyU3RhcnQgKyAvKiBTdGFydGluZyBhZGRyZXNzIG9mIHJ0biAqLworCQkJCQkgICAgQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCkpLAorCQkJCQkgICAwLAkvKiBjb3JlIGFkZHI/PyAqLworCQkJCQkgICB0cmFuc19sYW5nICgoZW51bSBocF9sYW5ndWFnZSkgcVBEW2N1cnJfcGRdLmxhbmd1YWdlKSwKKwkJCQkJICAgb2JqZmlsZSk7CisgICAgICBlbHNlCisJYWRkX3BzeW1ib2xfd2l0aF9kZW1fbmFtZV90b19saXN0IChydG5fbmFtZSwKKwkJCQkJICAgc3RybGVuIChydG5fbmFtZSksCisJCQkJCSAgIHJ0bl9kZW1fbmFtZSwKKwkJCQkJICAgc3RybGVuIChydG5fZGVtX25hbWUpLAorCQkJCQkgICBWQVJfTkFNRVNQQUNFLAorCQkJCQkgICBMT0NfQkxPQ0ssCS8qICJJIGFtIGEgcm91dGluZSIgICAgICAgICovCisJCQkJCSAgICZvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMsCisJCQkJCSAgIChxUERbY3Vycl9wZF0uYWRyU3RhcnQgKyAgLyogU3RhcnRpbmcgYWRkcmVzcyBvZiBydG4gKi8KKwkJCQkJICAgIEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpKSwKKwkJCQkJICAgMCwJLyogY29yZSBhZGRyPz8gKi8KKwkJCQkJICAgdHJhbnNfbGFuZyAoKGVudW0gaHBfbGFuZ3VhZ2UpIHFQRFtjdXJyX3BkXS5sYW5ndWFnZSksCisJCQkJCSAgIG9iamZpbGUpOworCisgICAgICBzeW1ib2xfY291bnQrKzsKKyAgICAgICpjdXJyX3BkX3AgPSArK2N1cnJfcGQ7CS8qIGJ1bXAgdXAgY291bnQgJiByZWZsZWN0IGluIGNhbGxlciAqLworICAgIH0JCQkJLyogbG9vcCBvdmVyIHByb2NlZHVyZXMgKi8KKworI2lmZGVmIERVTVBJTkcKKyAgaWYgKGR1bXBpbmcpCisgICAgeworICAgICAgaWYgKHN5bWJvbF9jb3VudCA9PSAwKQorCXByaW50ZiAoIlNjYW5fcHJvY3M6IG5vIHN5bWJvbHMgZm91bmQhXG4iKTsKKyAgICB9CisjZW5kaWYKKworICByZXR1cm4gc3ltYm9sX2NvdW50OworfQorCisKKy8qIFRyYXZlcnNlIHRoZSBxdWljayBsb29rLXVwIHRhYmxlcywgYnVpbGRpbmcgYSBzZXQgb2YgcHN5bXRhYnMuCisKKyAgIFRoaXMgY29uc3RydWN0cyBhIHBzeW10YWIgZm9yIG1vZHVsZXMgYW5kIGZpbGVzIGluIHRoZSBxdWljayBsb29rdXAKKyAgIHRhYmxlcy4KKworICAgTW9zdGx5LCBtb2R1bGVzIGNvcnJlc3BvbmQgdG8gY29tcGlsYXRpb24gdW5pdHMsIHNvIHdlIHRyeSB0bworICAgY3JlYXRlIHBzeW10YWJzIHRoYXQgY29ycmVzcG9uZCB0byBtb2R1bGVzOyBob3dldmVyLCBpbiBzb21lIGNhc2VzCisgICBhIGZpbGUgY2FuIHJlc3VsdCBpbiBhIGNvbXBpbGVkIG9iamVjdCB3aGljaCBkb2VzIG5vdCBoYXZlIGEgbW9kdWxlCisgICBlbnRyeSBmb3IgaXQsIHNvIGluIHN1Y2ggY2FzZXMgd2UgY3JlYXRlIGEgcHN5bXRhYiBmb3IgdGhlIGZpbGUuICAqLworCitpbnQKK2hwcmVhZF9xdWlja190cmF2ZXJzZSAob2JqZmlsZSwJc2VjdGlvbl9vZmZzZXRzLCBnbnR0X2JpdHMsIHZ0X2JpdHMsIHB4ZGJfaGVhZGVyX3ApCQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsgICAgICAgIC8qIFRoZSBvYmplY3QgZmlsZSBkZXNjcmlwdG9yICovCisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsgLyogPz8gTnVsbCBmb3IgSFAgKi8KKyAgICAgY2hhciAqZ250dF9iaXRzOyAgICAgICAgICAgICAgICAvKiBHTlRUIGVudHJpZXMsIGxvYWRlZCBpbiBmcm9tIHRoZSBmaWxlICovCisgICAgIGNoYXIgKnZ0X2JpdHM7ICAgICAgICAgICAgICAgICAgLyogVlQgKHN0cmluZykgZW50cmllcyBkaXR0by4gKi8KKyAgICAgUFhEQl9oZWFkZXJfcHRyIHB4ZGJfaGVhZGVyX3A7ICAvKiBQb2ludGVyIHRvIHB4ZGIgaGVhZGVyIGRpdHRvICovCit7CisgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN0OworCisgIGNoYXIgKmFkZHI7CisKKyAgcXVpY2tfcHJvY2VkdXJlX2VudHJ5ICpxUEQ7CisgIHF1aWNrX2ZpbGVfZW50cnkgKnFGRDsKKyAgcXVpY2tfbW9kdWxlX2VudHJ5ICpxTUQ7CisgIHF1aWNrX2NsYXNzX2VudHJ5ICpxQ0Q7CisKKyAgaW50IGlkeDsKKyAgaW50IGk7CisgIENPUkVfQUREUiBzdGFydF9hZHI7CQkvKiBjdXJyZW50IHBzeW10YWIncyBzdGFydGluZyBjb2RlIGFkZHIgICAqLworICBDT1JFX0FERFIgZW5kX2FkcjsJCS8qIGN1cnJlbnQgcHN5bXRhYidzIGVuZGluZyBjb2RlIGFkZHIgICAgICovCisgIENPUkVfQUREUiBuZXh0X21vZF9hZHI7CS8qIG5leHQgbW9kdWxlJ3Mgc3RhcnRpbmcgY29kZSBhZGRyICAgICovCisgIGludCBjdXJyX3BkOwkJCS8qIGN1cnJlbnQgcHJvY2VkdXJlICovCisgIGludCBjdXJyX2ZkOwkJCS8qIGN1cnJlbnQgZmlsZSAgICAgICovCisgIGludCBjdXJyX21kOwkJCS8qIGN1cnJlbnQgbW9kdWxlICAgICovCisgIGludCBzdGFydF9zeW07CQkvKiBjdXJyZW50IHBzeW10YWIncyBzdGFydGluZyBzeW1ib2wgaW5kZXggKi8KKyAgaW50IGVuZF9zeW07CQkJLyogY3VycmVudCBwc3ltdGFiJ3MgZW5kaW5nIHN5bWJvbCBpbmRleCAgICovCisgIGludCBtYXhfTE5UVF9zeW1faW5kZXg7CisgIGludCBzeW1zX2luX3BzdDsKKyAgQl9UWVBFICpjbGFzc19lbnRlcmVkOworCisgIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKmdsb2JhbF9zeW1zOwkvKiBXZSdsbCBiZSBmaWxsaW5nIGluIHRoZSAiZ2xvYmFsIiAgICovCisgIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKnN0YXRpY19zeW1zOwkvKiBhbmQgInN0YXRpYyIgdGFibGVzIGluIHRoZSBvYmpmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgd2UgZ28sIHNvIHdlIG5lZWQgYSBwYWlyIG9mICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHBvaW50ZXJzLiAqLworCisjaWZkZWYgRFVNUElORworICAvKiBUdXJuIHRoaXMgb24gZm9yIGxvdHMgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uIGluIHRoaXMgcm91dGluZS4KKyAgICAgWW91IGdldCBhIGJsb3ctYnktYmxvdyBhY2NvdW50IG9mIHF1aWNrIGxvb2t1cCB0YWJsZSByZWFkaW5nICovCisgIHN0YXRpYyBpbnQgZHVtcGluZyA9IDA7CisjZW5kaWYKKworICBwc3QgPSAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopIDA7CisKKyAgLyogQ2xlYXIgb3V0IHNvbWUgZ2xvYmFscyAqLworICBpbml0X3BzdF9zeW1zICgpOworICB0b2xkX29iamZpbGUgPSAwOworCisgIC8qIERlbWFuZ2xpbmcgc3R5bGUgLS0gaWYgRURHIHN0eWxlIGFscmVhZHkgc2V0LCBkb24ndCBjaGFuZ2UgaXQsCisgICAgIGFzIEhQIHN0eWxlIGNhdXNlcyBzb21lIHByb2JsZW1zIHdpdGggdGhlIEtBSSBFREcgY29tcGlsZXIgKi8KKyAgaWYgKGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSAhPSBlZGdfZGVtYW5nbGluZykKKyAgICB7CisgICAgICAvKiBPdGhlcndpc2UsIGVuc3VyZSB0aGF0IHdlIGFyZSB1c2luZyBIUCBzdHlsZSBkZW1hbmdsaW5nICovCisgICAgICBzZXRfZGVtYW5nbGluZ19zdHlsZSAoSFBfREVNQU5HTElOR19TVFlMRV9TVFJJTkcpOworICAgIH0KKworICAvKiBGaXJzdCB3ZSBuZWVkIHRvIGZpbmQgdGhlIHN0YXJ0aW5nIHBvaW50cyBvZiB0aGUgcXVpY2sKKyAgICAgbG9vay11cCB0YWJsZXMgaW4gdGhlIEdOVFQuICovCisKKyAgYWRkciA9IGdudHRfYml0czsKKworICBxUEQgPSAocXVpY2tfcHJvY2VkdXJlX2VudHJ5X3B0cikgYWRkcjsKKyAgYWRkciArPSBweGRiX2hlYWRlcl9wLT5wZF9lbnRyaWVzICogc2l6ZW9mIChxdWlja19wcm9jZWR1cmVfZW50cnkpOworCisjaWZkZWYgRFVNUElORworICBpZiAoZHVtcGluZykKKyAgICB7CisgICAgICBwcmludGYgKCJcbiBQcmludGluZyByb3V0aW5lcyBhcyB3ZSBzZWUgdGhlbVxuIik7CisgICAgICBmb3IgKGkgPSAwOyBWQUxJRF9QUk9DIChpKTsgaSsrKQorCXsKKwkgIGlkeCA9IChsb25nKSBxUERbaV0uc2JQcm9jOworCSAgcHJpbnRmICgiJXMgJXguLiV4XG4iLCAmdnRfYml0c1tpZHhdLAorCQkgIChpbnQpIFBST0NfU1RBUlQgKGkpLAorCQkgIChpbnQpIFBST0NfRU5EIChpKSk7CisJfQorICAgIH0KKyNlbmRpZgorCisgIHFGRCA9IChxdWlja19maWxlX2VudHJ5X3B0cikgYWRkcjsKKyAgYWRkciArPSBweGRiX2hlYWRlcl9wLT5mZF9lbnRyaWVzICogc2l6ZW9mIChxdWlja19maWxlX2VudHJ5KTsKKworI2lmZGVmIERVTVBJTkcKKyAgaWYgKGR1bXBpbmcpCisgICAgeworICAgICAgcHJpbnRmICgiXG4gUHJpbnRpbmcgZmlsZXMgYXMgd2Ugc2VlIHRoZW1cbiIpOworICAgICAgZm9yIChpID0gMDsgVkFMSURfRklMRSAoaSk7IGkrKykKKwl7CisJICBpZHggPSAobG9uZykgcUZEW2ldLnNiRmlsZTsKKwkgIHByaW50ZiAoIiVzICV4Li4leFxuIiwgJnZ0X2JpdHNbaWR4XSwKKwkJICAoaW50KSBGSUxFX1NUQVJUIChpKSwKKwkJICAoaW50KSBGSUxFX0VORCAoaSkpOworCX0KKyAgICB9CisjZW5kaWYKKworICBxTUQgPSAocXVpY2tfbW9kdWxlX2VudHJ5X3B0cikgYWRkcjsKKyAgYWRkciArPSBweGRiX2hlYWRlcl9wLT5tZF9lbnRyaWVzICogc2l6ZW9mIChxdWlja19tb2R1bGVfZW50cnkpOworCisjaWZkZWYgRFVNUElORworICBpZiAoZHVtcGluZykKKyAgICB7CisgICAgICBwcmludGYgKCJcbiBQcmludGluZyBtb2R1bGVzIGFzIHdlIHNlZSB0aGVtXG4iKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBweGRiX2hlYWRlcl9wLT5tZF9lbnRyaWVzOyBpKyspCisJeworCSAgaWR4ID0gKGxvbmcpIHFNRFtpXS5zYk1vZDsKKwkgIHByaW50ZiAoIiVzXG4iLCAmdnRfYml0c1tpZHhdKTsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgcUNEID0gKHF1aWNrX2NsYXNzX2VudHJ5X3B0cikgYWRkcjsKKyAgYWRkciArPSBweGRiX2hlYWRlcl9wLT5jZF9lbnRyaWVzICogc2l6ZW9mIChxdWlja19jbGFzc19lbnRyeSk7CisKKyNpZmRlZiBEVU1QSU5HCisgIGlmIChkdW1waW5nKQorICAgIHsKKyAgICAgIHByaW50ZiAoIlxuIFByaW50aW5nIGNsYXNzZXMgYXMgd2Ugc2VlIHRoZW1cbiIpOworICAgICAgZm9yIChpID0gMDsgVkFMSURfQ0xBU1MgKGkpOyBpKyspCisJeworCSAgaWR4ID0gKGxvbmcpIHFDRFtpXS5zYkNsYXNzOworCSAgcHJpbnRmICgiJXNcbiIsICZ2dF9iaXRzW2lkeF0pOworCX0KKworICAgICAgcHJpbnRmICgiXG4gRG9uZSB3aXRoIGR1bXAsIG9uIHRvIGJ1aWxkIVxuIik7CisgICAgfQorI2VuZGlmCisKKyAgLyogV2UgbmVlZCB0aGlzIGluZGV4IG9ubHkgd2hpbGUgaHAtc3ltdGFiLXJlYWQuYyBleHBlY3RzCisgICAgIGEgYnl0ZSBvZmZzZXQgdG8gdGhlIGVuZCBvZiB0aGUgTE5UVCBlbnRyaWVzIGZvciBhIGdpdmVuCisgICAgIHBzeW10YWIuICBUaHVzIHRoZSBuZWVkIGZvciBpdCBzaG91bGQgZ28gYXdheSBzb21lZGF5LgorCisgICAgIFdoZW4gaXQgZ29lcyBhd2F5LCB0aGVuIHdlIHdvbid0IGhhdmUgYW55IG5lZWQgdG8gbG9hZCB0aGUKKyAgICAgTE5UVCBmcm9tIHRoZSBvYmpmaWxlIGF0IHBzeW10YWItdGltZSwgYW5kIHN0YXJ0LXVwIHdpbGwgYmUKKyAgICAgZmFzdGVyLiAgVG8gbWFrZSB0aGF0IHdvcmssIHdlJ2xsIG5lZWQgc29tZSB3YXkgdG8gY3JlYXRlCisgICAgIGEgbnVsbCBwc3QgZm9yIHRoZSAiZ2xvYmFscyIgcHNldWRvLW1vZHVsZS4gKi8KKyAgbWF4X0xOVFRfc3ltX2luZGV4ID0gTE5UVF9TWU1DT1VOVCAob2JqZmlsZSk7CisKKyAgLyogU2NhbiB0aGUgbW9kdWxlIGRlc2NyaXB0b3JzIGFuZCBtYWtlIGEgcHN5bXRhYiBmb3IgZWFjaC4KKworICAgICBXZSBrbm93IHRoZSBNRHMsIEZEcyBhbmQgdGhlIFBEcyBhcmUgaW4gb3JkZXIgYnkgc3RhcnRpbmcKKyAgICAgYWRkcmVzcy4gIFdlIHVzZSB0aGF0IGZhY3QgdG8gdHJhdmVyc2UgYWxsIHRocmVlIGFycmF5cyBpbgorICAgICBwYXJhbGxlbCwga25vd2luZyB3aGVuIHRoZSBuZXh0IFBEIGlzIGluIGEgbmV3IGZpbGUKKyAgICAgYW5kIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBzeW10YWIuICovCisgIGN1cnJfcGQgPSAwOwkJCS8qIEN1cnJlbnQgcHJvY2VkdXJlIGVudHJ5ICovCisgIGN1cnJfZmQgPSAwOwkJCS8qIEN1cnJlbnQgZmlsZSBlbnRyeSAqLworICBjdXJyX21kID0gMDsJCQkvKiBDdXJyZW50IG1vZHVsZSBlbnRyeSAqLworCisgIHN0YXJ0X2FkciA9IDA7CQkvKiBDdXJyZW50IHBzeW10YWIgY29kZSByYW5nZSAqLworICBlbmRfYWRyID0gMDsKKworICBzdGFydF9zeW0gPSAwOwkJLyogQ3VycmVudCBwc3ltdGFiIHN5bWJvbCByYW5nZSAqLworICBlbmRfc3ltID0gMDsKKworICBzeW1zX2luX3BzdCA9IDA7CQkvKiBTeW1ib2wgY291bnQgZm9yIHBzeW10YWIgKi8KKworICAvKiBQc3RzIGFjdHVhbGx5IGp1c3QgaGF2ZSBwb2ludGVycyBpbnRvIHRoZSBvYmpmaWxlJ3MKKyAgICAgc3ltYm9sIHRhYmxlLCBub3QgdGhlaXIgb3duIHN5bWJvbCB0YWJsZXMuICovCisgIGdsb2JhbF9zeW1zID0gb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLmxpc3Q7CisgIHN0YXRpY19zeW1zID0gb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLmxpc3Q7CisKKworICAvKiBGaXJzdCBza2lwIG92ZXIgcHNldWRvLWVudHJpZXMgd2l0aCBhZGRyZXNzIDAuICBUaGVzZSByZXByZXNlbnQgaW5saW5lZAorICAgICByb3V0aW5lcyBhbmQgYWJzdHJhY3QgKHVuaW5zdGFudGlhdGVkKSB0ZW1wbGF0ZSByb3V0aW5lcy4KKyAgICAgRklYTUU6IFRoZXNlIHNob3VsZCBiZSByZWFkIGluIGFuZCBhdmFpbGFibGUgLS0gZXZlbiBpZiB3ZSBjYW4ndCBzZXQKKyAgICAgYnJlYWtwb2ludHMsIGV0Yy4sIHRoZXJlJ3Mgc29tZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBwcmVzZW50ZWQKKyAgICAgdG8gdGhlIHVzZXIuIHBhaS8xOTk3LTEwLTA4ICAqLworCisgIHdoaWxlIChWQUxJRF9DVVJSX1BST0MgJiYgKENVUlJfUFJPQ19TVEFSVCA9PSAwKSkKKyAgICBjdXJyX3BkKys7CisKKyAgLyogTG9vcCBvdmVyIGZpbGVzLCBtb2R1bGVzLCBhbmQgcHJvY2VkdXJlcyBpbiBjb2RlIGFkZHJlc3Mgb3JkZXIuIEVhY2gKKyAgICAgdGltZSB3ZSBlbnRlciBhbiBpdGVyYXRpb24gb2YgdGhpcyBsb29wLCBjdXJyX3BkIHBvaW50cyB0byB0aGUgZmlyc3QKKyAgICAgdW5wcm9jZXNzZWQgcHJvY2VkdXJlLCBjdXJyX2ZkIHBvaW50cyB0byB0aGUgZmlyc3QgdW5wcm9jZXNzZWQgZmlsZSwgYW5kCisgICAgIGN1cnJfbWQgdG8gdGhlIGZpcnN0IHVucHJvY2Vzc2VkIG1vZHVsZS4gIEVhY2ggaXRlcmF0aW9uIG9mIHRoaXMgbG9vcAorICAgICB1cGRhdGVzIHRoZXNlIGFzIHJlcXVpcmVkIC0tIGFueSBvciBhbGwgb2YgdGhlbSBtYXkgYmUgYnVtcGQgdXAKKyAgICAgZWFjaCB0aW1lIGFyb3VuZC4gIFdoZW4gd2UgZXhpdCB0aGlzIGxvb3AsIHdlIGFyZSBkb25lIHdpdGggYWxsIGZpbGVzCisgICAgIGFuZCBtb2R1bGVzIGluIHRoZSB0YWJsZXMgLS0gdGhlcmUgbWF5IHN0aWxsIGJlIHNvbWUgcHJvY2VkdXJlcywgaG93ZXZlci4KKworICAgICBOb3RlOiBUaGlzIGNvZGUgdXNlZCB0byBsb29wIG9ubHkgb3ZlciBtb2R1bGUgZW50cmllcywgdW5kZXIgdGhlIGFzc3VtcHRpb24KKyAgICAgdGhhdCBmaWxlcyBjYW4gb2NjdXIgdmlhIGluY2x1c2lvbnMgYW5kIGFyZSB0aHVzIHVucmVsaWFibGUsIHdoaWxlIGEKKyAgICAgY29tcGlsZWQgb2JqZWN0IGFsd2F5cyBjb3JyZXNwb25kcyB0byBhIG1vZHVsZS4gIFdpdGggQ1RUSSBpbiB0aGUgSFAgYUNDCisgICAgIGNvbXBpbGVyLCBpdCB0dXJucyBvdXQgdGhhdCBjb21waWxlZCBvYmplY3RzIG1heSBoYXZlIG9ubHkgZmlsZXMgYW5kIG5vCisgICAgIG1vZHVsZXM7IHNvIHdlIGhhdmUgdG8gbG9vcCBvdmVyIGZpbGVzIGFuZCBtb2R1bGVzLCBjcmVhdGluZyBwc3ltdGFicyBmb3IKKyAgICAgZWl0aGVyIGFzIGFwcHJvcHJpYXRlLiAgVW5mb3J0dW5hdGVseSB0aGVyZSBhcmUgc29tZSBwcm9ibGVtcyAobm90YWJseToKKyAgICAgMS4gdGhlIGxhY2sgb2YgIlNSQ19GSUxFX0VORCIgZW50cmllcyBpbiB0aGUgTE5UVCwgMi4gdGhlIGxhY2sgb2YgcG9pbnRlcnMKKyAgICAgdG8gdGhlIGVuZGluZyBzeW1ib2wgaW5kaWNlcyBvZiBhIG1vZHVsZSBvciBhIGZpbGUpIHdoaWNoIG1ha2UgaXQgcXVpdGUgaGFyZAorICAgICB0byBkbyB0aGlzIGNvcnJlY3RseS4gIEN1cnJlbnRseSBpdCB1c2VzIGEgYnVuY2ggb2YgaGV1cmlzdGljcyB0byBzdGFydCBhbmQKKyAgICAgZW5kIHBzeW10YWJzOyB0aGV5IHNlZW0gdG8gd29yayB3ZWxsIHdpdGggbW9zdCBvYmplY3RzIGdlbmVyYXRlZCBieSBhQ0MsIGJ1dAorICAgICB3aG8ga25vd3Mgd2hlbiB0aGF0IHdpbGwgY2hhbmdlLi4uICAgKi8KKworICB3aGlsZSAoVkFMSURfQ1VSUl9GSUxFIHx8IFZBTElEX0NVUlJfTU9EVUxFKQorICAgIHsKKworICAgICAgY2hhciAqbW9kX25hbWVfc3RyaW5nOworICAgICAgY2hhciAqZnVsbF9uYW1lX3N0cmluZzsKKworICAgICAgLyogRmlyc3QgY2hlY2sgZm9yIG1vZHVsZXMgbGlrZSAidmVyc2lvbi5jIiwgd2hpY2ggaGF2ZSBubyBjb2RlCisgICAgICAgICBpbiB0aGVtIGJ1dCBzdGlsbCBoYXZlIHFNRCBlbnRyaWVzLiAgVGhleSBhbHNvIGhhdmUgbm8gcUZEIG9yCisgICAgICAgICBxUEQgZW50cmllcy4gIFRoZWlyIHN0YXJ0IGFkZHJlc3MgaXMgLTEgYW5kIHRoZWlyIGVuZCBhZGRyZXNzCisgICAgICAgICBpcyAwLiAgKi8KKyAgICAgIGlmIChWQUxJRF9DVVJSX01PRFVMRSAmJiAoQ1VSUl9NT0RVTEVfU1RBUlQgPT0gLTEpICYmIChDVVJSX01PRFVMRV9FTkQgPT0gMCkpCisJeworCisJICBtb2RfbmFtZV9zdHJpbmcgPSAmdnRfYml0c1sobG9uZykgcU1EW2N1cnJfbWRdLnNiTW9kXTsKKworI2lmZGVmIERVTVBJTkcKKwkgIGlmIChkdW1waW5nKQorCSAgICBwcmludGYgKCJNb2R1bGUgd2l0aCBkYXRhIG9ubHkgJXNcbiIsIG1vZF9uYW1lX3N0cmluZyk7CisjZW5kaWYKKworCSAgLyogV2UnbGwgc2tpcCB0aGUgcmVzdCAoaXQgbWFrZXMgZXJyb3ItY2hlY2tpbmcgZWFzaWVyKSwgYW5kCisJICAgICBqdXN0IG1ha2UgYW4gZW1wdHkgcHN0LiAgUmlnaHQgbm93IGVtcHR5IHBzdHMgYXJlIG5vdCBwdXQKKwkgICAgIGluIHRoZSBwc3QgY2hhaW4sIHNvIGFsbCB0aGlzIGlzIGZvciBuYXVnaHQsIGJ1dCBsYXRlciBpdAorCSAgICAgbWlnaHQgaGVscC4gICovCisKKwkgIHBzdCA9IGhwcmVhZF9zdGFydF9wc3ltdGFiIChvYmpmaWxlLAorCQkJCSAgICAgIHNlY3Rpb25fb2Zmc2V0cywJICAgICAgICAvKiA/PyAqLworCQkJCSAgICAgIG1vZF9uYW1lX3N0cmluZywKKwkJCQkgICAgICBDVVJSX01PRFVMRV9TVEFSVCwJLyogTG93IHRleHQgYWRkcmVzczogYm9ndXMhICovCisJCQkJICAgICAgKENVUlJfTU9EVUxFX0lTWU0gKiBzaXplb2YgKHN0cnVjdCBkbnR0X3R5cGVfYmxvY2spKSwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxkc3ltb2ZmICovCisJCQkJICAgICAgZ2xvYmFsX3N5bXMsCisJCQkJICAgICAgc3RhdGljX3N5bXMpOworCisJICBwc3QgPSBocHJlYWRfZW5kX3BzeW10YWIgKHBzdCwKKwkJCQkgICAgTlVMTCwJLyogcHN5bXRhYl9pbmNsdWRlX2xpc3QgKi8KKwkJCQkgICAgMCwJCS8qIGluY2x1ZGVzX3VzZWQgICAgICAgICovCisJCQkJICAgIGVuZF9zeW0gKiBzaXplb2YgKHN0cnVjdCBkbnR0X3R5cGVfYmxvY2spLAorCQkJCSAgICAgICAgICAgICAgICAvKiBieXRlIGluZGV4IGluIExOVFQgb2YgZW5kIAorCQkJCSAgICAgICAgICAgICAgICAgICA9IGNhcHBpbmcgc3ltYm9sIG9mZnNldCAgCisJCQkJICAgICAgICAgICAgICAgICAgID0gTERTWU1PRkYgb2YgbmV4dGZpbGUgKi8KKwkJCQkgICAgMCwJICAgICAgICAvKiB0ZXh0IGhpZ2ggICAgICAgICAgICAqLworCQkJCSAgICBOVUxMLAkvKiBkZXBlbmRlbmN5X2xpc3QgICAgICAqLworCQkJCSAgICAwKTsJICAgICAgICAvKiBkZXBlbmRlbmNpZXNfdXNlZCAgICAqLworCisJICBnbG9iYWxfc3ltcyA9IG9iamZpbGUtPmdsb2JhbF9wc3ltYm9scy5uZXh0OworCSAgc3RhdGljX3N5bXMgPSBvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMubmV4dDsKKworCSAgY3Vycl9tZCsrOworCX0KKyAgICAgIGVsc2UgaWYgKFZBTElEX0NVUlJfTU9EVUxFICYmCisJICAgICAgICgoQ1VSUl9NT0RVTEVfU1RBUlQgPT0gMCkgfHwgKENVUlJfTU9EVUxFX1NUQVJUID09IC0xKSB8fAorCQkoQ1VSUl9NT0RVTEVfRU5EID09IDApIHx8IChDVVJSX01PRFVMRV9FTkQgPT0gLTEpKSkKKwl7CisJICBURUxMX09CSkZJTEU7CisJICB3YXJuaW5nICgiTW9kdWxlIFwiJXNcIiBbMHgleF0gaGFzIG5vbi1zdGFuZGFyZCBhZGRyZXNzZXMuICBJdCBzdGFydHMgYXQgMHgleCwgZW5kcyBhdCAweCV4LCBhbmQgd2lsbCBiZSBza2lwcGVkLiIsCisJCSAgIG1vZF9uYW1lX3N0cmluZywgY3Vycl9tZCwgc3RhcnRfYWRyLCBlbmRfYWRyKTsKKwkgIC8qIE9uIHRvIG5leHQgbW9kdWxlICovCisJICBjdXJyX21kKys7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIEZpcnN0IGNoZWNrIGlmIHdlIGFyZSBsb29raW5nIGF0IGEgZmlsZSB3aXRoIGNvZGUgaW4gaXQKKwkgICAgIHRoYXQgZG9lcyBub3Qgb3ZlcmxhcCB0aGUgY3VycmVudCBtb2R1bGUncyBjb2RlIHJhbmdlICovCisKKwkgIGlmIChWQUxJRF9DVVJSX0ZJTEUgPyAoVkFMSURfQ1VSUl9NT0RVTEUgPyAoQ1VSUl9GSUxFX0VORCA8IENVUlJfTU9EVUxFX1NUQVJUKSA6IDEpIDogMCkKKwkgICAgeworCisJICAgICAgLyogTG9va2luZyBhdCBmaWxlIG5vdCBjb3JyZXNwb25kaW5nIHRvIGFueSBtb2R1bGUsCisJICAgICAgICAgY3JlYXRlIGEgcHN5bXRhYiBmb3IgaXQgKi8KKwkgICAgICBmdWxsX25hbWVfc3RyaW5nID0gJnZ0X2JpdHNbKGxvbmcpIHFGRFtjdXJyX2ZkXS5zYkZpbGVdOworCSAgICAgIHN0YXJ0X2FkciA9IENVUlJfRklMRV9TVEFSVDsKKwkgICAgICBlbmRfYWRyID0gQ1VSUl9GSUxFX0VORDsKKwkgICAgICBzdGFydF9zeW0gPSBDVVJSX0ZJTEVfSVNZTTsKKworCSAgICAgIC8qIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgcHJvY2VkdXJlcyBub3QgaGFuZGxlZCB1bnRpbCBub3csIHRoYXQKKwkgICAgICAgICBiZWdpbiBiZWZvcmUgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhpcyBmaWxlLCBhbmQgaWYgc28sIGFkanVzdAorCSAgICAgICAgIHRoaXMgbW9kdWxlJ3Mgc3RhcnQgYWRkcmVzcyB0byBpbmNsdWRlIHRoZW0uICBUaGlzIGhhbmRsZXMgcm91dGluZXMgdGhhdAorCSAgICAgICAgIGFyZSBpbiBiZXR3ZWVuIGZpbGUgb3IgbW9kdWxlIHJhbmdlcyBmb3Igc29tZSByZWFzb24gKHByb2JhYmx5CisJICAgICAgICAgaW5kaWNhdGVzIGEgY29tcGlsZXIgYnVnICovCisKKwkgICAgICBpZiAoQ1VSUl9QUk9DX1NUQVJUIDwgc3RhcnRfYWRyKQorCQl7CisJCSAgVEVMTF9PQkpGSUxFOworCQkgIHdhcm5pbmcgKCJGb3VuZCBwcm9jZWR1cmUgXCIlc1wiIFsweCV4XSB0aGF0IGlzIG5vdCBpbiBhbnkgZmlsZSBvciBtb2R1bGUuIiwKKwkJCSAgICZ2dF9iaXRzWyhsb25nKSBxUERbY3Vycl9wZF0uc2JQcm9jXSwgY3Vycl9wZCk7CisJCSAgc3RhcnRfYWRyID0gQ1VSUl9QUk9DX1NUQVJUOworCQkgIGlmIChDVVJSX1BST0NfSVNZTSA8IHN0YXJ0X3N5bSkKKwkJICAgIHN0YXJ0X3N5bSA9IENVUlJfUFJPQ19JU1lNOworCQl9CisKKwkgICAgICAvKiBTb21ldGltZXMgKGNvbXBpbGVyIGJ1ZyAtLSBDT0JPTCkgdGhlIG1vZHVsZSBlbmQgYWRkcmVzcyBpcyBoaWdoZXIKKwkgICAgICAgICB0aGFuIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBuZXh0IG1vZHVsZSwgc28gY2hlY2sgZm9yIHRoYXQgYW5kCisJICAgICAgICAgYWRqdXN0IGFjY29yZGluZ2x5ICovCisKKwkgICAgICBpZiAoVkFMSURfRklMRSAoY3Vycl9mZCArIDEpICYmIChGSUxFX1NUQVJUIChjdXJyX2ZkICsgMSkgPD0gZW5kX2FkcikpCisJCXsKKwkJICBURUxMX09CSkZJTEU7CisJCSAgd2FybmluZyAoIkZpbGUgXCIlc1wiIFsweCV4XSBoYXMgZW5kaW5nIGFkZHJlc3MgYWZ0ZXIgc3RhcnRpbmcgYWRkcmVzcyBvZiBuZXh0IGZpbGU7IGFkanVzdGluZyBlbmRpbmcgYWRkcmVzcyBkb3duLiIsCisJCQkgICBmdWxsX25hbWVfc3RyaW5nLCBjdXJyX2ZkKTsKKwkJICBlbmRfYWRyID0gRklMRV9TVEFSVCAoY3Vycl9mZCArIDEpIC0gMTsJLyogSXMgLTQgKG9yIC04IGZvciA2NC1iaXQpIGJldHRlcj8gKi8KKwkJfQorCSAgICAgIGlmIChWQUxJRF9NT0RVTEUgKGN1cnJfbWQpICYmIChDVVJSX01PRFVMRV9TVEFSVCA8PSBlbmRfYWRyKSkKKwkJeworCQkgIFRFTExfT0JKRklMRTsKKwkJICB3YXJuaW5nICgiRmlsZSBcIiVzXCIgWzB4JXhdIGhhcyBlbmRpbmcgYWRkcmVzcyBhZnRlciBzdGFydGluZyBhZGRyZXNzIG9mIG5leHQgbW9kdWxlOyBhZGp1c3RpbmcgZW5kaW5nIGFkZHJlc3MgZG93bi4iLAorCQkJICAgZnVsbF9uYW1lX3N0cmluZywgY3Vycl9mZCk7CisJCSAgZW5kX2FkciA9IENVUlJfTU9EVUxFX1NUQVJUIC0gMTsJLyogSXMgLTQgKG9yIC04IGZvciA2NC1iaXQpIGJldHRlcj8gKi8KKwkJfQorCisKKyNpZmRlZiBEVU1QSU5HCisJICAgICAgaWYgKGR1bXBpbmcpCisJCXsKKwkJICBwcmludGYgKCJNYWtlIG5ldyBwc3ltdGFiIGZvciBmaWxlICVzICgleCB0byAleCkuXG4iLAorCQkJICBmdWxsX25hbWVfc3RyaW5nLCBzdGFydF9hZHIsIGVuZF9hZHIpOworCQl9CisjZW5kaWYKKwkgICAgICAvKiBDcmVhdGUgdGhlIGJhc2ljIHBzeW10YWIsIGNvbm5lY3RpbmcgaXQgaW4gdGhlIGxpc3QKKwkgICAgICAgICBmb3IgdGhpcyBvYmpmaWxlIGFuZCBwb2ludGluZyBpdHMgc3ltYm9sIGVudHJpZXMKKwkgICAgICAgICB0byB0aGUgY3VycmVudCBlbmQgb2YgdGhlIHN5bWJvbCBhcmVhcyBpbiB0aGUgb2JqZmlsZS4KKworCSAgICAgICAgIFRoZSAibGRzeW1vZmYiIHBhcmFtZXRlciBpcyB0aGUgYnl0ZSBvZmZzZXQgaW4gdGhlIExOVFQKKwkgICAgICAgICBvZiB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoaXMgZmlsZS4gIFNvbWUgZGF5IHdlIHNob3VsZAorCSAgICAgICAgIHR1cm4gdGhpcyBpbnRvIGFuIGluZGV4IChmaXggaW4gaHAtc3ltdGFiLXJlYWQuYyBhcyB3ZWxsKS4KKwkgICAgICAgICBBbmQgaXQncyBub3QgZXZlbiB0aGUgcmlnaHQgYnl0ZSBvZmZzZXQsIGFzIHdlJ3JlIHVzaW5nCisJICAgICAgICAgdGhlIHNpemUgb2YgYSB1bmlvbiEgRklYTUUhICAqLworCSAgICAgIHBzdCA9IGhwcmVhZF9zdGFydF9wc3ltdGFiIChvYmpmaWxlLAorCQkJCQkgIHNlY3Rpb25fb2Zmc2V0cywJLyogPz8gKi8KKwkJCQkJICBmdWxsX25hbWVfc3RyaW5nLAorCQkJCQkgIHN0YXJ0X2FkciwJICAgICAgICAvKiBMb3cgdGV4dCBhZGRyZXNzICovCisJCQkJCSAgKHN0YXJ0X3N5bSAqIHNpemVvZiAoc3RydWN0IGRudHRfdHlwZV9ibG9jaykpLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZHN5bW9mZiAqLworCQkJCQkgIGdsb2JhbF9zeW1zLAorCQkJCQkgIHN0YXRpY19zeW1zKTsKKworCSAgICAgIC8qIFNldCB1cCB0byBvbmx5IGVudGVyIGVhY2ggY2xhc3MgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZSBvbmNlLiAgKi8KKwkgICAgICBjbGFzc19lbnRlcmVkID0gbWFsbG9jIChCX0JZVEVTIChweGRiX2hlYWRlcl9wLT5jZF9lbnRyaWVzKSk7CisJICAgICAgQl9DTFJBTEwgKGNsYXNzX2VudGVyZWQsIHB4ZGJfaGVhZGVyX3AtPmNkX2VudHJpZXMpOworCisJICAgICAgLyogU2NhbiB0aGUgcHJvY2VkdXJlIGRlc2NyaXB0b3JzIGZvciBwcm9jZWR1cmVzIGluIHRoZSBjdXJyZW50CisJICAgICAgICAgZmlsZSwgYmFzZWQgb24gdGhlIHN0YXJ0aW5nIGFkZHJlc3Nlcy4gKi8KKworCSAgICAgIHN5bXNfaW5fcHN0ID0gc2Nhbl9wcm9jcyAoJmN1cnJfcGQsIHFQRCwgcHhkYl9oZWFkZXJfcC0+cGRfZW50cmllcywKKwkJCQkJc3RhcnRfYWRyLCBlbmRfYWRyLAorCQkJCQlwc3QsIHZ0X2JpdHMsIG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cyk7CisKKwkgICAgICAvKiBHZXQgZW5kaW5nIHN5bWJvbCBvZmZzZXQgKi8KKworCSAgICAgIGVuZF9zeW0gPSAwOworCSAgICAgIC8qIEZpcnN0IGNoZWNrIGZvciBzdGFydGluZyBpbmRleCBiZWZvcmUgcHJldmlvdXMgcHN5bXRhYiAqLworCSAgICAgIGlmIChwc3Rfc3ltc19jb3VudCAmJiBzdGFydF9zeW0gPCBwc3Rfc3ltc19hcnJheVtwc3Rfc3ltc19jb3VudCAtIDFdLmVuZCkKKwkJeworCQkgIGVuZF9zeW0gPSBmaW5kX25leHRfcHN0X3N0YXJ0IChzdGFydF9zeW0pOworCQl9CisJICAgICAgLyogTG9vayBmb3IgbmV4dCBzdGFydCBpbmRleCBvZiBhIGZpbGUgb3IgbW9kdWxlLCBvciBwcm9jZWR1cmUgKi8KKwkgICAgICBpZiAoIWVuZF9zeW0pCisJCXsKKwkJICBpbnQgbmV4dF9maWxlX2lzeW0gPSBmaW5kX25leHRfZmlsZV9pc3ltIChzdGFydF9zeW0sIHFGRCwgY3Vycl9mZCArIDEsIHB4ZGJfaGVhZGVyX3ApOworCQkgIGludCBuZXh0X21vZHVsZV9pc3ltID0gZmluZF9uZXh0X21vZHVsZV9pc3ltIChzdGFydF9zeW0sIHFNRCwgY3Vycl9tZCwgcHhkYl9oZWFkZXJfcCk7CisJCSAgaW50IG5leHRfcHJvY19pc3ltID0gZmluZF9uZXh0X3Byb2NfaXN5bSAoc3RhcnRfc3ltLCBxUEQsIGN1cnJfcGQsIHB4ZGJfaGVhZGVyX3ApOworCisJCSAgaWYgKG5leHRfZmlsZV9pc3ltICYmIG5leHRfbW9kdWxlX2lzeW0pCisJCSAgICB7CisJCSAgICAgIC8qIHBpY2sgbG93ZXIgb2YgbmV4dCBmaWxlIG9yIG1vZHVsZSBzdGFydCBpbmRleCAqLworCQkgICAgICBlbmRfc3ltID0gbWluIChuZXh0X2ZpbGVfaXN5bSwgbmV4dF9tb2R1bGVfaXN5bSk7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvKiBvbmUgb2YgdGhlbSBpcyB6ZXJvLCBwaWNrIHRoZSBvdGhlciAqLworCQkgICAgICBlbmRfc3ltID0gbWF4IChuZXh0X2ZpbGVfaXN5bSwgbmV4dF9tb2R1bGVfaXN5bSk7CisJCSAgICB9CisKKwkJICAvKiBBcyBhIHByZWNhdXRpb24sIGNoZWNrIG5leHQgcHJvY2VkdXJlIGluZGV4IHRvbyAqLworCQkgIGlmICghZW5kX3N5bSkKKwkJICAgIGVuZF9zeW0gPSBuZXh0X3Byb2NfaXN5bTsKKwkJICBlbHNlCisJCSAgICBlbmRfc3ltID0gbWluIChlbmRfc3ltLCBuZXh0X3Byb2NfaXN5bSk7CisJCX0KKworCSAgICAgIC8qIENvdWxkbid0IGZpbmQgcHJvY2VkdXJlLCBmaWxlLCBvciBtb2R1bGUsIHVzZSBnbG9iYWxzIGFzIGRlZmF1bHQgKi8KKwkgICAgICBpZiAoIWVuZF9zeW0pCisJCWVuZF9zeW0gPSBweGRiX2hlYWRlcl9wLT5nbG9iYWxzOworCisjaWZkZWYgRFVNUElORworCSAgICAgIGlmIChkdW1waW5nKQorCQl7CisJCSAgcHJpbnRmICgiRmlsZSBwc3ltdGFiIGluZGljZXM6ICV4IHRvICV4XG4iLCBzdGFydF9zeW0sIGVuZF9zeW0pOworCQl9CisjZW5kaWYKKworCSAgICAgIHBzdCA9IGhwcmVhZF9lbmRfcHN5bXRhYiAocHN0LAorCQkJCQlOVUxMLAkvKiBwc3ltdGFiX2luY2x1ZGVfbGlzdCAqLworCQkJCQkwLAkvKiBpbmNsdWRlc191c2VkICAgICAgICAqLworCQkJCQllbmRfc3ltICogc2l6ZW9mIChzdHJ1Y3QgZG50dF90eXBlX2Jsb2NrKSwKKwkJCQkJICAgICAgICAvKiBieXRlIGluZGV4IGluIExOVFQgb2YgZW5kIAorCQkJCQkJICAgPSBjYXBwaW5nIHN5bWJvbCBvZmZzZXQgICAKKwkJCQkJCSAgID0gTERTWU1PRkYgb2YgbmV4dGZpbGUgKi8KKwkJCQkJZW5kX2FkciwJLyogdGV4dCBoaWdoICovCisJCQkJCU5VTEwsCS8qIGRlcGVuZGVuY3lfbGlzdCAqLworCQkJCQkwKTsJLyogZGVwZW5kZW5jaWVzX3VzZWQgKi8KKworCSAgICAgIHJlY29yZF9wc3Rfc3ltcyAoc3RhcnRfc3ltLCBlbmRfc3ltKTsKKworCSAgICAgIGlmIChOVUxMID09IHBzdCkKKwkJd2FybmluZyAoIk5vIHN5bWJvbHMgaW4gcHN5bXRhYiBmb3IgZmlsZSBcIiVzXCIgWzB4JXhdLiIsIGZ1bGxfbmFtZV9zdHJpbmcsIGN1cnJfZmQpOworCisjaWZkZWYgRFVNUElORworCSAgICAgIGlmIChkdW1waW5nKQorCQl7CisJCSAgcHJpbnRmICgiTWFkZSBuZXcgcHN5bXRhYiBmb3IgZmlsZSAlcyAoJXggdG8gJXgpLCBzeW0gJXggdG8gJXguXG4iLAorCQkJICBmdWxsX25hbWVfc3RyaW5nLCBzdGFydF9hZHIsIGVuZF9hZHIsIENVUlJfRklMRV9JU1lNLCBlbmRfc3ltKTsKKwkJfQorI2VuZGlmCisJICAgICAgLyogUHJlcGFyZSBmb3IgdGhlIG5leHQgcHN5bXRhYi4gKi8KKwkgICAgICBnbG9iYWxfc3ltcyA9IG9iamZpbGUtPmdsb2JhbF9wc3ltYm9scy5uZXh0OworCSAgICAgIHN0YXRpY19zeW1zID0gb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLm5leHQ7CisJICAgICAgZnJlZSAoY2xhc3NfZW50ZXJlZCk7CisKKwkgICAgICBjdXJyX2ZkKys7CisJICAgIH0JCQkvKiBQc3ltdGFiIGZvciBmaWxlICovCisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBXZSBoYXZlIGEgbW9kdWxlIGZvciB3aGljaCB3ZSBjcmVhdGUgYSBwc3ltdGFiICovCisKKwkgICAgICBtb2RfbmFtZV9zdHJpbmcgPSAmdnRfYml0c1sobG9uZykgcU1EW2N1cnJfbWRdLnNiTW9kXTsKKworCSAgICAgIC8qIFdlIHdpbGwgaW5jbHVkZSB0aGUgY29kZSByYW5nZXMgb2YgYW55IGZpbGVzIHRoYXQgaGFwcGVuIHRvCisJICAgICAgICAgb3ZlcmxhcCB3aXRoIHRoaXMgbW9kdWxlICovCisKKwkgICAgICAvKiBTbywgZmlyc3QgcGljayB0aGUgbG93ZXIgb2YgdGhlIGZpbGUncyBhbmQgbW9kdWxlJ3Mgc3RhcnQgYWRkcmVzc2VzICovCisJICAgICAgc3RhcnRfYWRyID0gQ1VSUl9NT0RVTEVfU1RBUlQ7CisJICAgICAgaWYgKFZBTElEX0NVUlJfRklMRSkKKwkJeworCQkgIGlmIChDVVJSX0ZJTEVfU1RBUlQgPCBDVVJSX01PRFVMRV9TVEFSVCkKKwkJICAgIHsKKwkJICAgICAgVEVMTF9PQkpGSUxFOworCQkgICAgICB3YXJuaW5nICgiRmlsZSBcIiVzXCIgWzB4JXhdIGNyb3NzZXMgYmVnaW5uaW5nIG9mIG1vZHVsZSBcIiVzXCIuIiwKKwkJCSAgICAgICAmdnRfYml0c1sobG9uZykgcUZEW2N1cnJfZmRdLnNiRmlsZV0sCisJCQkgICAgICAgY3Vycl9mZCwgbW9kX25hbWVfc3RyaW5nKTsKKworCQkgICAgICBzdGFydF9hZHIgPSBDVVJSX0ZJTEVfU1RBUlQ7CisJCSAgICB9CisJCX0KKworCSAgICAgIC8qIEFsc28gcGljayB0aGUgbG93ZXIgb2YgdGhlIGZpbGUncyBhbmQgdGhlIG1vZHVsZSdzIHN0YXJ0IHN5bWJvbCBpbmRpY2VzICovCisJICAgICAgc3RhcnRfc3ltID0gQ1VSUl9NT0RVTEVfSVNZTTsKKwkgICAgICBpZiAoVkFMSURfQ1VSUl9GSUxFICYmIChDVVJSX0ZJTEVfSVNZTSA8IENVUlJfTU9EVUxFX0lTWU0pKQorCQlzdGFydF9zeW0gPSBDVVJSX0ZJTEVfSVNZTTsKKworCSAgICAgIC8qIEZvciB0aGUgZW5kIGFkZHJlc3MsIHdlIHNjYW4gdGhyb3VnaCB0aGUgZmlsZXMgdGlsbCB3ZSBmaW5kIG9uZQorCSAgICAgICAgIHRoYXQgb3ZlcmxhcHMgdGhlIGN1cnJlbnQgbW9kdWxlIGJ1dCBlbmRzIGJleW9uZCBpdDsgaWYgbm8gc3VjaCBmaWxlIGV4aXN0cyB3ZQorCSAgICAgICAgIHNpbXBseSB1c2UgdGhlIG1vZHVsZSdzIHN0YXJ0IGFkZHJlc3MuICAKKwkgICAgICAgICAoTm90ZSwgaWYgZmlsZSBlbnRyaWVzIHRoZW1zZWx2ZXMgb3ZlcmxhcAorCSAgICAgICAgIHdlIHRha2UgdGhlIGxvbmdlc3Qgb3ZlcmxhcHBpbmcgZXh0ZW5zaW9uIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBtb2R1bGUuLi4pCisJICAgICAgICAgV2UgYXNzdW1lIHRoYXQgbW9kdWxlcyBuZXZlciBvdmVybGFwLiAqLworCisJICAgICAgZW5kX2FkciA9IENVUlJfTU9EVUxFX0VORDsKKworCSAgICAgIGlmIChWQUxJRF9DVVJSX0ZJTEUpCisJCXsKKwkJICB3aGlsZSAoVkFMSURfQ1VSUl9GSUxFICYmIChDVVJSX0ZJTEVfU1RBUlQgPCBlbmRfYWRyKSkKKwkJICAgIHsKKworI2lmZGVmIERVTVBJTkcKKwkJICAgICAgaWYgKGR1bXBpbmcpCisJCQlwcmludGYgKCJNYXliZSBza2lwcGluZyBmaWxlICVzIHdoaWNoIG92ZXJsYXBzIHdpdGggbW9kdWxlICVzXG4iLAorCQkJCSZ2dF9iaXRzWyhsb25nKSBxRkRbY3Vycl9mZF0uc2JGaWxlXSwgbW9kX25hbWVfc3RyaW5nKTsKKyNlbmRpZgorCQkgICAgICBpZiAoQ1VSUl9GSUxFX0VORCA+IGVuZF9hZHIpCisJCQl7CisJCQkgIFRFTExfT0JKRklMRTsKKwkJCSAgd2FybmluZyAoIkZpbGUgXCIlc1wiIFsweCV4XSBjcm9zc2VzIGVuZCBvZiBtb2R1bGUgXCIlc1wiLiIsCisJCQkJICAgJnZ0X2JpdHNbKGxvbmcpIHFGRFtjdXJyX2ZkXS5zYkZpbGVdLAorCQkJCSAgIGN1cnJfZmQsIG1vZF9uYW1lX3N0cmluZyk7CisJCQkgIGVuZF9hZHIgPSBDVVJSX0ZJTEVfRU5EOworCQkJfQorCQkgICAgICBjdXJyX2ZkKys7CisJCSAgICB9CisJCSAgY3Vycl9mZC0tOwkvKiBiYWNrIHVwIGFmdGVyIGdvaW5nIHRvbyBmYXIgKi8KKwkJfQorCisJICAgICAgLyogU29tZXRpbWVzIChjb21waWxlciBidWcgLS0gQ09CT0wpIHRoZSBtb2R1bGUgZW5kIGFkZHJlc3MgaXMgaGlnaGVyCisJICAgICAgICAgdGhhbiB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbmV4dCBtb2R1bGUsIHNvIGNoZWNrIGZvciB0aGF0IGFuZAorCSAgICAgICAgIGFkanVzdCBhY2NvcmRpbmdseSAqLworCisJICAgICAgaWYgKFZBTElEX01PRFVMRSAoY3Vycl9tZCArIDEpICYmIChNT0RVTEVfU1RBUlQgKGN1cnJfbWQgKyAxKSA8PSBlbmRfYWRyKSkKKwkJeworCQkgIFRFTExfT0JKRklMRTsKKwkJICB3YXJuaW5nICgiTW9kdWxlIFwiJXNcIiBbMHgleF0gaGFzIGVuZGluZyBhZGRyZXNzIGFmdGVyIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgbmV4dCBtb2R1bGU7IGFkanVzdGluZyBlbmRpbmcgYWRkcmVzcyBkb3duLiIsCisJCQkgICBtb2RfbmFtZV9zdHJpbmcsIGN1cnJfbWQpOworCQkgIGVuZF9hZHIgPSBNT0RVTEVfU1RBUlQgKGN1cnJfbWQgKyAxKSAtIDE7CS8qIElzIC00IChvciAtOCBmb3IgNjQtYml0KSBiZXR0ZXI/ICovCisJCX0KKwkgICAgICBpZiAoVkFMSURfRklMRSAoY3Vycl9mZCArIDEpICYmIChGSUxFX1NUQVJUIChjdXJyX2ZkICsgMSkgPD0gZW5kX2FkcikpCisJCXsKKwkJICBURUxMX09CSkZJTEU7CisJCSAgd2FybmluZyAoIk1vZHVsZSBcIiVzXCIgWzB4JXhdIGhhcyBlbmRpbmcgYWRkcmVzcyBhZnRlciBzdGFydGluZyBhZGRyZXNzIG9mIG5leHQgZmlsZTsgYWRqdXN0aW5nIGVuZGluZyBhZGRyZXNzIGRvd24uIiwKKwkJCSAgIG1vZF9uYW1lX3N0cmluZywgY3Vycl9tZCk7CisJCSAgZW5kX2FkciA9IEZJTEVfU1RBUlQgKGN1cnJfZmQgKyAxKSAtIDE7CS8qIElzIC00IChvciAtOCBmb3IgNjQtYml0KSBiZXR0ZXI/ICovCisJCX0KKworCSAgICAgIC8qIFVzZSBvbmUgZmlsZSB0byBnZXQgdGhlIGZ1bGwgbmFtZSBmb3IgdGhlIG1vZHVsZS4gIFRoaXMKKwkgICAgICAgICBzaXR1YXRpb24gY2FuIGFyaXNlIGlmIHRoZXJlIGlzIGV4ZWN1dGFibGUgY29kZSBpbiBhICNpbmNsdWRlCisJICAgICAgICAgZmlsZS4gIEVhY2ggZmlsZSB3aXRoIGNvZGUgaW4gaXQgZ2V0cyBhIHFGRC4gIEZpbGVzIHdoaWNoIGRvbid0CisJICAgICAgICAgY29udHJpYnV0ZSBjb2RlIGRvbid0IGdldCBhIHFGRCwgZXZlbiBpZiB0aGV5IGluY2x1ZGUgZmlsZXMKKwkgICAgICAgICB3aGljaCBkbywgZS5nLjogCisKKwkgICAgICAgICBib2R5LmM6ICAgICAgICAgICAgICAgICAgICBydG4uaDoKKwkgICAgICAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICBpbnQgbWFpbigpIHsKKwkgICAgICAgICAjaW5jbHVkZSAicnRuLmgiICAgICAgICAgICAgICAgcmV0dXJuIHg7CisJICAgICAgICAgfQorCisJICAgICAgICAgVGhlcmUgd2lsbCBhIHFGRCBmb3IgInJ0bi5oIixhbmQgYSBxTUQgZm9yICJib2R5LmMiLAorCSAgICAgICAgIGJ1dCBubyBxTUQgZm9yICJydG4uaCIgb3IgcUZEIGZvciAiYm9keS5jIiEKKworCSAgICAgICAgIFdlIHBpY2sgdGhlIG5hbWUgb2YgdGhlIGxhc3QgZmlsZSB0byBvdmVybGFwIHdpdGggdGhpcworCSAgICAgICAgIG1vZHVsZS4gIEMgY29udmVudGlvbiBpcyB0byBwdXQgaW5jbHVkZSBmaWxlcyBmaXJzdC4gIEluIGEKKwkgICAgICAgICBwZXJmZWN0IHdvcmxkLCB3ZSBjb3VsZCBjaGVjayBuYW1lcyBhbmQgdXNlIHRoZSBmaWxlIHdob3NlIGZ1bGwKKwkgICAgICAgICBwYXRoIG5hbWUgZW5kcyB3aXRoIHRoZSBtb2R1bGUgbmFtZS4gKi8KKworCSAgICAgIGlmIChWQUxJRF9DVVJSX0ZJTEUpCisJCWZ1bGxfbmFtZV9zdHJpbmcgPSAmdnRfYml0c1sobG9uZykgcUZEW2N1cnJfZmRdLnNiRmlsZV07CisJICAgICAgZWxzZQorCQlmdWxsX25hbWVfc3RyaW5nID0gbW9kX25hbWVfc3RyaW5nOworCisJICAgICAgLyogQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBwcm9jZWR1cmVzIG5vdCBoYW5kbGVkIHVudGlsIG5vdywgdGhhdAorCSAgICAgICAgIGJlZ2luIGJlZm9yZSB0aGUgc3RhcnQgYWRkcmVzcyB3ZSBoYXZlIG5vdywgYW5kIGlmIHNvLCBhZGp1c3QKKwkgICAgICAgICB0aGlzIHBzeW10YWIncyBzdGFydCBhZGRyZXNzIHRvIGluY2x1ZGUgdGhlbS4gIFRoaXMgaGFuZGxlcyByb3V0aW5lcyB0aGF0CisJICAgICAgICAgYXJlIGluIGJldHdlZW4gZmlsZSBvciBtb2R1bGUgcmFuZ2VzIGZvciBzb21lIHJlYXNvbiAocHJvYmFibHkKKwkgICAgICAgICBpbmRpY2F0ZXMgYSBjb21waWxlciBidWcgKi8KKworCSAgICAgIGlmIChDVVJSX1BST0NfU1RBUlQgPCBzdGFydF9hZHIpCisJCXsKKwkJICBURUxMX09CSkZJTEU7CisJCSAgd2FybmluZyAoIkZvdW5kIHByb2NlZHVyZSBcIiVzXCIgWzB4JXhdIHRoYXQgaXMgbm90IGluIGFueSBmaWxlIG9yIG1vZHVsZS4iLAorCQkJICAgJnZ0X2JpdHNbKGxvbmcpIHFQRFtjdXJyX3BkXS5zYlByb2NdLCBjdXJyX3BkKTsKKwkJICBzdGFydF9hZHIgPSBDVVJSX1BST0NfU1RBUlQ7CisJCSAgaWYgKENVUlJfUFJPQ19JU1lNIDwgc3RhcnRfc3ltKQorCQkgICAgc3RhcnRfc3ltID0gQ1VSUl9QUk9DX0lTWU07CisJCX0KKworI2lmZGVmIERVTVBJTkcKKwkgICAgICBpZiAoZHVtcGluZykKKwkJeworCQkgIHByaW50ZiAoIk1ha2UgbmV3IHBzeW10YWIgZm9yIG1vZHVsZSAlcyAoJXggdG8gJXgpLCB1c2luZyBmaWxlICVzXG4iLAorCQkgICAgIG1vZF9uYW1lX3N0cmluZywgc3RhcnRfYWRyLCBlbmRfYWRyLCBmdWxsX25hbWVfc3RyaW5nKTsKKwkJfQorI2VuZGlmCisJICAgICAgLyogQ3JlYXRlIHRoZSBiYXNpYyBwc3ltdGFiLCBjb25uZWN0aW5nIGl0IGluIHRoZSBsaXN0CisJICAgICAgICAgZm9yIHRoaXMgb2JqZmlsZSBhbmQgcG9pbnRpbmcgaXRzIHN5bWJvbCBlbnRyaWVzCisJICAgICAgICAgdG8gdGhlIGN1cnJlbnQgZW5kIG9mIHRoZSBzeW1ib2wgYXJlYXMgaW4gdGhlIG9iamZpbGUuCisKKwkgICAgICAgICBUaGUgImxkc3ltb2ZmIiBwYXJhbWV0ZXIgaXMgdGhlIGJ5dGUgb2Zmc2V0IGluIHRoZSBMTlRUCisJICAgICAgICAgb2YgdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGlzIGZpbGUuICBTb21lIGRheSB3ZSBzaG91bGQKKwkgICAgICAgICB0dXJuIHRoaXMgaW50byBhbiBpbmRleCAoZml4IGluIGhwLXN5bXRhYi1yZWFkLmMgYXMgd2VsbCkuCisJICAgICAgICAgQW5kIGl0J3Mgbm90IGV2ZW4gdGhlIHJpZ2h0IGJ5dGUgb2Zmc2V0LCBhcyB3ZSdyZSB1c2luZworCSAgICAgICAgIHRoZSBzaXplIG9mIGEgdW5pb24hIEZJWE1FISAgKi8KKwkgICAgICBwc3QgPSBocHJlYWRfc3RhcnRfcHN5bXRhYiAob2JqZmlsZSwKKwkJCQkJICBzZWN0aW9uX29mZnNldHMsCS8qID8/ICovCisJCQkJCSAgZnVsbF9uYW1lX3N0cmluZywKKwkJCQkJICBzdGFydF9hZHIsCS8qIExvdyB0ZXh0IGFkZHJlc3MgKi8KKwkJCQkJICAoc3RhcnRfc3ltICogc2l6ZW9mIChzdHJ1Y3QgZG50dF90eXBlX2Jsb2NrKSksCisJCQkJCSAgICAgICAgICAgICAgICAvKiBsZHN5bW9mZiAqLworCQkJCQkgIGdsb2JhbF9zeW1zLAorCQkJCQkgIHN0YXRpY19zeW1zKTsKKworCSAgICAgIC8qIFNldCB1cCB0byBvbmx5IGVudGVyIGVhY2ggY2xhc3MgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZSBvbmNlLiAgKi8KKwkgICAgICBjbGFzc19lbnRlcmVkID0gbWFsbG9jIChCX0JZVEVTIChweGRiX2hlYWRlcl9wLT5jZF9lbnRyaWVzKSk7CisJICAgICAgQl9DTFJBTEwgKGNsYXNzX2VudGVyZWQsIHB4ZGJfaGVhZGVyX3AtPmNkX2VudHJpZXMpOworCisJICAgICAgLyogU2NhbiB0aGUgcHJvY2VkdXJlIGRlc2NyaXB0b3JzIGZvciBwcm9jZWR1cmVzIGluIHRoZSBjdXJyZW50CisJICAgICAgICAgbW9kdWxlLCBiYXNlZCBvbiB0aGUgc3RhcnRpbmcgYWRkcmVzc2VzLiAqLworCisJICAgICAgc3ltc19pbl9wc3QgPSBzY2FuX3Byb2NzICgmY3Vycl9wZCwgcVBELCBweGRiX2hlYWRlcl9wLT5wZF9lbnRyaWVzLAorCQkJCQlzdGFydF9hZHIsIGVuZF9hZHIsCisJCQkJCXBzdCwgdnRfYml0cywgb2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzKTsKKworCSAgICAgIC8qIEdldCBlbmRpbmcgc3ltYm9sIG9mZnNldCAqLworCisJICAgICAgZW5kX3N5bSA9IDA7CisJICAgICAgLyogRmlyc3QgY2hlY2sgZm9yIHN0YXJ0aW5nIGluZGV4IGJlZm9yZSBwcmV2aW91cyBwc3ltdGFiICovCisJICAgICAgaWYgKHBzdF9zeW1zX2NvdW50ICYmIHN0YXJ0X3N5bSA8IHBzdF9zeW1zX2FycmF5W3BzdF9zeW1zX2NvdW50IC0gMV0uZW5kKQorCQl7CisJCSAgZW5kX3N5bSA9IGZpbmRfbmV4dF9wc3Rfc3RhcnQgKHN0YXJ0X3N5bSk7CisJCX0KKwkgICAgICAvKiBMb29rIGZvciBuZXh0IHN0YXJ0IGluZGV4IG9mIGEgZmlsZSBvciBtb2R1bGUsIG9yIHByb2NlZHVyZSAqLworCSAgICAgIGlmICghZW5kX3N5bSkKKwkJeworCQkgIGludCBuZXh0X2ZpbGVfaXN5bSA9IGZpbmRfbmV4dF9maWxlX2lzeW0gKHN0YXJ0X3N5bSwgcUZELCBjdXJyX2ZkICsgMSwgcHhkYl9oZWFkZXJfcCk7CisJCSAgaW50IG5leHRfbW9kdWxlX2lzeW0gPSBmaW5kX25leHRfbW9kdWxlX2lzeW0gKHN0YXJ0X3N5bSwgcU1ELCBjdXJyX21kICsgMSwgcHhkYl9oZWFkZXJfcCk7CisJCSAgaW50IG5leHRfcHJvY19pc3ltID0gZmluZF9uZXh0X3Byb2NfaXN5bSAoc3RhcnRfc3ltLCBxUEQsIGN1cnJfcGQsIHB4ZGJfaGVhZGVyX3ApOworCisJCSAgaWYgKG5leHRfZmlsZV9pc3ltICYmIG5leHRfbW9kdWxlX2lzeW0pCisJCSAgICB7CisJCSAgICAgIC8qIHBpY2sgbG93ZXIgb2YgbmV4dCBmaWxlIG9yIG1vZHVsZSBzdGFydCBpbmRleCAqLworCQkgICAgICBlbmRfc3ltID0gbWluIChuZXh0X2ZpbGVfaXN5bSwgbmV4dF9tb2R1bGVfaXN5bSk7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvKiBvbmUgb2YgdGhlbSBpcyB6ZXJvLCBwaWNrIHRoZSBvdGhlciAqLworCQkgICAgICBlbmRfc3ltID0gbWF4IChuZXh0X2ZpbGVfaXN5bSwgbmV4dF9tb2R1bGVfaXN5bSk7CisJCSAgICB9CisKKwkJICAvKiBBcyBhIHByZWNhdXRpb24sIGNoZWNrIG5leHQgcHJvY2VkdXJlIGluZGV4IHRvbyAqLworCQkgIGlmICghZW5kX3N5bSkKKwkJICAgIGVuZF9zeW0gPSBuZXh0X3Byb2NfaXN5bTsKKwkJICBlbHNlCisJCSAgICBlbmRfc3ltID0gbWluIChlbmRfc3ltLCBuZXh0X3Byb2NfaXN5bSk7CisJCX0KKworCSAgICAgIC8qIENvdWxkbid0IGZpbmQgcHJvY2VkdXJlLCBmaWxlLCBvciBtb2R1bGUsIHVzZSBnbG9iYWxzIGFzIGRlZmF1bHQgKi8KKwkgICAgICBpZiAoIWVuZF9zeW0pCisJCWVuZF9zeW0gPSBweGRiX2hlYWRlcl9wLT5nbG9iYWxzOworCisjaWZkZWYgRFVNUElORworCSAgICAgIGlmIChkdW1waW5nKQorCQl7CisJCSAgcHJpbnRmICgiTW9kdWxlIHBzeW10YWIgaW5kaWNlczogJXggdG8gJXhcbiIsIHN0YXJ0X3N5bSwgZW5kX3N5bSk7CisJCX0KKyNlbmRpZgorCisJICAgICAgcHN0ID0gaHByZWFkX2VuZF9wc3ltdGFiIChwc3QsCisJCQkJCU5VTEwsCS8qIHBzeW10YWJfaW5jbHVkZV9saXN0ICovCisJCQkJCTAsCS8qIGluY2x1ZGVzX3VzZWQgICAgICAgICovCisJCQkJCWVuZF9zeW0gKiBzaXplb2YgKHN0cnVjdCBkbnR0X3R5cGVfYmxvY2spLAorCQkJCQkgICAgICAgIC8qIGJ5dGUgaW5kZXggaW4gTE5UVCBvZiBlbmQgCisJCQkJCQkgICA9IGNhcHBpbmcgc3ltYm9sIG9mZnNldCAgIAorCQkJCQkJICAgPSBMRFNZTU9GRiBvZiBuZXh0ZmlsZSAqLworCQkJCQllbmRfYWRyLAkvKiB0ZXh0IGhpZ2ggKi8KKwkJCQkJTlVMTCwJLyogZGVwZW5kZW5jeV9saXN0ICAgICAgKi8KKwkJCQkJMCk7CS8qIGRlcGVuZGVuY2llc191c2VkICAgICovCisKKwkgICAgICByZWNvcmRfcHN0X3N5bXMgKHN0YXJ0X3N5bSwgZW5kX3N5bSk7CisKKwkgICAgICBpZiAoTlVMTCA9PSBwc3QpCisJCXdhcm5pbmcgKCJObyBzeW1ib2xzIGluIHBzeW10YWIgZm9yIG1vZHVsZSBcIiVzXCIgWzB4JXhdLiIsIG1vZF9uYW1lX3N0cmluZywgY3Vycl9tZCk7CisKKyNpZmRlZiBEVU1QSU5HCisJICAgICAgaWYgKGR1bXBpbmcpCisJCXsKKwkJICBwcmludGYgKCJNYWRlIG5ldyBwc3ltdGFiIGZvciBtb2R1bGUgJXMgKCV4IHRvICV4KSwgc3ltICV4IHRvICV4LlxuIiwKKwkJCSAgbW9kX25hbWVfc3RyaW5nLCBzdGFydF9hZHIsIGVuZF9hZHIsIENVUlJfTU9EVUxFX0lTWU0sIGVuZF9zeW0pOworCQl9CisjZW5kaWYKKworCSAgICAgIC8qIFByZXBhcmUgZm9yIHRoZSBuZXh0IHBzeW10YWIuICovCisJICAgICAgZ2xvYmFsX3N5bXMgPSBvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMubmV4dDsKKwkgICAgICBzdGF0aWNfc3ltcyA9IG9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5uZXh0OworCSAgICAgIGZyZWUgKGNsYXNzX2VudGVyZWQpOworCisJICAgICAgY3Vycl9tZCsrOworCSAgICAgIGN1cnJfZmQrKzsKKwkgICAgfQkJCS8qIHBzeW10YWIgZm9yIG1vZHVsZSAqLworCX0JCQkvKiBwc3ltdGFiIGZvciBub24tYm9ndXMgZmlsZSBvciBtb2R1bGUgKi8KKyAgICB9CQkJCS8qIEVuZCBvZiB3aGlsZSBsb29wIG92ZXIgYWxsIGZpbGVzICYgbW9kdWxlcyAqLworCisgIC8qIFRoZXJlIG1heSBiZSBzb21lIHJvdXRpbmVzIGFmdGVyIGFsbCBmaWxlcyBhbmQgbW9kdWxlcyAtLSB0aGVzZSB3aWxsIGdldAorICAgICBpbnNlcnRlZCBpbiBhIHNlcGFyYXRlIG5ldyBtb2R1bGUgb2YgdGhlaXIgb3duICovCisgIGlmIChWQUxJRF9DVVJSX1BST0MpCisgICAgeworICAgICAgc3RhcnRfYWRyID0gQ1VSUl9QUk9DX1NUQVJUOworICAgICAgZW5kX2FkciA9IHFQRFtweGRiX2hlYWRlcl9wLT5wZF9lbnRyaWVzIC0gMV0uYWRyRW5kOworICAgICAgVEVMTF9PQkpGSUxFOworICAgICAgd2FybmluZyAoIkZvdW5kIGZ1bmN0aW9ucyBiZXlvbmQgZW5kIG9mIGFsbCBmaWxlcyBhbmQgbW9kdWxlcyBbMHgleF0uIiwgY3Vycl9wZCk7CisjaWZkZWYgRFVNUElORworICAgICAgaWYgKGR1bXBpbmcpCisJeworCSAgcHJpbnRmICgiT3JwaGFuIGZ1bmN0aW9ucyBhdCBlbmQsIFBEICVkIGFuZCBiZXlvbmQgKCV4IHRvICV4KVxuIiwKKwkJICBjdXJyX3BkLCBzdGFydF9hZHIsIGVuZF9hZHIpOworCX0KKyNlbmRpZgorICAgICAgcHN0ID0gaHByZWFkX3N0YXJ0X3BzeW10YWIgKG9iamZpbGUsCisJCQkJICBzZWN0aW9uX29mZnNldHMsCS8qID8/ICovCisJCQkJICAib3JwaGFucyIsCisJCQkJICBzdGFydF9hZHIsCS8qIExvdyB0ZXh0IGFkZHJlc3MgKi8KKwkJCQkgIChDVVJSX1BST0NfSVNZTSAqIHNpemVvZiAoc3RydWN0IGRudHRfdHlwZV9ibG9jaykpLAorCQkJCSAgICAgICAgICAgICAgICAvKiBsZHN5bW9mZiAqLworCQkJCSAgZ2xvYmFsX3N5bXMsCisJCQkJICBzdGF0aWNfc3ltcyk7CisKKyAgICAgIHNjYW5fcHJvY3MgKCZjdXJyX3BkLCBxUEQsIHB4ZGJfaGVhZGVyX3AtPnBkX2VudHJpZXMsCisJCSAgc3RhcnRfYWRyLCBlbmRfYWRyLAorCQkgIHBzdCwgdnRfYml0cywgb2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzKTsKKworICAgICAgcHN0ID0gaHByZWFkX2VuZF9wc3ltdGFiIChwc3QsCisJCQkJTlVMTCwJLyogcHN5bXRhYl9pbmNsdWRlX2xpc3QgKi8KKwkJCQkwLAkvKiBpbmNsdWRlc191c2VkICovCisJCQkJcHhkYl9oZWFkZXJfcC0+Z2xvYmFscyAqIHNpemVvZiAoc3RydWN0IGRudHRfdHlwZV9ibG9jayksCisJCQkJICAgICAgICAvKiBieXRlIGluZGV4IGluIExOVFQgb2YgZW5kIAorCQkJCQkgICA9IGNhcHBpbmcgc3ltYm9sIG9mZnNldCAgIAorCQkJCQkgICA9IExEU1lNT0ZGIG9mIG5leHRmaWxlICovCisJCQkJZW5kX2FkciwJLyogdGV4dCBoaWdoICAqLworCQkJCU5VTEwsCS8qIGRlcGVuZGVuY3lfbGlzdCAqLworCQkJCTApOwkvKiBkZXBlbmRlbmNpZXNfdXNlZCAqLworICAgIH0KKworCisjaWZkZWYgTkVWRVJfTkVWRVIKKyAgLyogTm93IGJ1aWxkIHBzdHMgZm9yIG5vbi1tb2R1bGUgdGhpbmdzIChpbiB0aGUgdGFpbCBvZgorICAgICB0aGUgTE5UVCwgYWZ0ZXIgdGhlIGxhc3QgRU5EIE1PRFVMRSBlbnRyeSkuCisKKyAgICAgSWYgbnVsbCBwc3RzIHdlcmUga2VwdCBvbiB0aGUgY2hhaW4sIHRoaXMgd291bGQgYmUKKyAgICAgYSBzb2x1dGlvbi4gIEZJWE1FICovCisgIHBzdCA9IGhwcmVhZF9zdGFydF9wc3ltdGFiIChvYmpmaWxlLAorCQkJICAgICAgc2VjdGlvbl9vZmZzZXRzLAorCQkJICAgICAgImdsb2JhbHMiLAorCQkJICAgICAgMCwKKwkJCSAgICAgIChweGRiX2hlYWRlcl9wLT5nbG9iYWxzCisJCQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBkbnR0X3R5cGVfYmxvY2spKSwKKwkJCSAgICAgIG9iamZpbGUtPmdsb2JhbF9wc3ltYm9scy5uZXh0LAorCQkJICAgICAgb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLm5leHQpOworICBocHJlYWRfZW5kX3BzeW10YWIgKHBzdCwKKwkJICAgICAgTlVMTCwgMCwKKwkJICAgICAgKG1heF9MTlRUX3N5bV9pbmRleCAqIHNpemVvZiAoc3RydWN0IGRudHRfdHlwZV9ibG9jaykpLAorCQkgICAgICAwLAorCQkgICAgICBOVUxMLCAwKTsKKyNlbmRpZgorCisgIGNsZWFyX3BzdF9zeW1zICgpOworCisgIHJldHVybiAxOworCit9CQkJCS8qIEVuZCBvZiBocHJlYWRfcXVpY2tfdHJhdmVyc2UuICovCisMCisKKy8qIEdldCBhcHByb3ByaWF0ZSBoZWFkZXIsIGJhc2VkIG9uIHB4ZGIgdHlwZS4gCisgICBSZXR1cm4gdmFsdWU6IDEgaWYgb2ssIDAgaWYgbm90ICovCitpbnQKK2hwcmVhZF9nZXRfaGVhZGVyIChvYmpmaWxlLCBweGRiX2hlYWRlcl9wKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgUFhEQl9oZWFkZXJfcHRyIHB4ZGJfaGVhZGVyX3A7Cit7CisgIGFzZWN0aW9uICpwaW5mb19zZWN0aW9uLCAqZGVidWdfc2VjdGlvbiwgKmhlYWRlcl9zZWN0aW9uOworCisjaWZkZWYgRFVNUElORworICAvKiBUdXJuIG9uIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKi8KKyAgc3RhdGljIGludCBkdW1waW5nID0gMDsKKyNlbmRpZgorCisgIGhlYWRlcl9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG9iamZpbGUtPm9iZmQsICIkSEVBREVSJCIpOworICBpZiAoIWhlYWRlcl9zZWN0aW9uKQorICAgIHsKKyAgICAgIC8qIFdlIGRvbid0IGhhdmUgZWl0aGVyIFBJTkZPIG9yIERFQlVHIHNlY3Rpb25zLiAgQnV0CisgICAgICAgICBzdHVmZiBsaWtlICJsaWJjLnNsIiBoYXMgbm8gZGVidWcgaW5mby4gIFRoZXJlJ3Mgbm8KKyAgICAgICAgIG5lZWQgdG8gd2FybiB0aGUgdXNlciBvZiB0aGlzLCBhcyBpdCBtYXkgYmUgb2suIFRoZQorICAgICAgICAgY2FsbGVyIHdpbGwgZmlndXJlIGl0IG91dCBhbmQgaXNzdWUgYW55IG5lZWRlZAorICAgICAgICAgbWVzc2FnZXMuICovCisjaWZkZWYgRFVNUElORworICAgICAgaWYgKGR1bXBpbmcpCisJcHJpbnRmICgiPT1ObyBkZWJ1ZyBpbmZvIGF0IGFsbCBmb3IgJXMuXG4iLCBvYmpmaWxlLT5uYW1lKTsKKyNlbmRpZgorCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogV2Ugd291bGQgbGlrZSBlaXRoZXIgYSAkREVCVUckIG9yICRQSU5GTyQgc2VjdGlvbi4KKyAgICAgT25jZSB3ZSBrbm93IHdoaWNoLCB3ZSBjYW4gdW5kZXJzdGFuZCB0aGUgaGVhZGVyCisgICAgIGRhdGEgKHdoaWNoIHdlIGhhdmUgZGVmaW5lZCB0byBzdWl0IHRoZSBtb3JlIGNvbW1vbgorICAgICAkREVCVUckIGNhc2UpLiAqLworICBkZWJ1Z19zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG9iamZpbGUtPm9iZmQsICIkREVCVUckIik7CisgIHBpbmZvX3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob2JqZmlsZS0+b2JmZCwgIiRQSU5GTyQiKTsKKyAgaWYgKGRlYnVnX3NlY3Rpb24pCisgICAgeworICAgICAgLyogVGhlIGV4cGVjdGVkIGNhc2U6IG5vcm1hbCBweGRiIGhlYWRlci4gKi8KKyAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAob2JqZmlsZS0+b2JmZCwgaGVhZGVyX3NlY3Rpb24sCisJCQkJcHhkYl9oZWFkZXJfcCwgMCwgc2l6ZW9mIChQWERCX2hlYWRlcikpOworCisgICAgICBpZiAoIXB4ZGJfaGVhZGVyX3AtPnB4ZGJlZCkKKwl7CisJICAvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gaWYgd2UgY2hlY2sgaW4gInN5bWZpbGUuYyIuICovCisJICByZXR1cm4gMDsKKwl9CQkJLyogREVCVUcgc2VjdGlvbiAqLworICAgIH0KKworICBlbHNlIGlmIChwaW5mb19zZWN0aW9uKQorICAgIHsKKyAgICAgIC8qIFRoZSBET0MgY2FzZTsgd2UgbmVlZCB0byB0cmFuc2xhdGUgdGhpcyBpbnRvIGEKKyAgICAgICAgIHJlZ3VsYXIgaGVhZGVyLiAqLworICAgICAgRE9DX2luZm9fUFhEQl9oZWFkZXIgZG9jX2hlYWRlcjsKKworI2lmZGVmIERVTVBJTkcKKyAgICAgIGlmIChkdW1waW5nKQorCXsKKwkgIHByaW50ZiAoIj09T09wcywgUElORk8sIGxldCdzIHRyeSB0byBoYW5kbGUgdGhpcywgJXMuXG4iLCBvYmpmaWxlLT5uYW1lKTsKKwl9CisjZW5kaWYKKworICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChvYmpmaWxlLT5vYmZkLAorCQkJCWhlYWRlcl9zZWN0aW9uLAorCQkJCSZkb2NfaGVhZGVyLCAwLAorCQkJCXNpemVvZiAoRE9DX2luZm9fUFhEQl9oZWFkZXIpKTsKKworICAgICAgaWYgKCFkb2NfaGVhZGVyLnB4ZGJlZCkKKwl7CisJICAvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gaWYgd2UgY2hlY2sgaW4gInN5bWZpbGUuYyIuICovCisJICB3YXJuaW5nICgiRmlsZSBcIiVzXCIgbm90IHByb2Nlc3NlZCBieSBweGRiISIsIG9iamZpbGUtPm5hbWUpOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICAvKiBDb3B5IHJlbGV2ZW50IGZpZWxkcyB0byBzdGFuZGFyZCBoZWFkZXIgcGFzc2VkIGluLiAqLworICAgICAgcHhkYl9oZWFkZXJfcC0+cGRfZW50cmllcyA9IGRvY19oZWFkZXIucGRfZW50cmllczsKKyAgICAgIHB4ZGJfaGVhZGVyX3AtPmZkX2VudHJpZXMgPSBkb2NfaGVhZGVyLmZkX2VudHJpZXM7CisgICAgICBweGRiX2hlYWRlcl9wLT5tZF9lbnRyaWVzID0gZG9jX2hlYWRlci5tZF9lbnRyaWVzOworICAgICAgcHhkYl9oZWFkZXJfcC0+cHhkYmVkID0gZG9jX2hlYWRlci5weGRiZWQ7CisgICAgICBweGRiX2hlYWRlcl9wLT5iaWdoZHIgPSBkb2NfaGVhZGVyLmJpZ2hkcjsKKyAgICAgIHB4ZGJfaGVhZGVyX3AtPnNhX2hlYWRlciA9IGRvY19oZWFkZXIuc2FfaGVhZGVyOworICAgICAgcHhkYl9oZWFkZXJfcC0+aW5saW5lZCA9IGRvY19oZWFkZXIuaW5saW5lZDsKKyAgICAgIHB4ZGJfaGVhZGVyX3AtPmdsb2JhbHMgPSBkb2NfaGVhZGVyLmdsb2JhbHM7CisgICAgICBweGRiX2hlYWRlcl9wLT50aW1lID0gZG9jX2hlYWRlci50aW1lOworICAgICAgcHhkYl9oZWFkZXJfcC0+cGdfZW50cmllcyA9IGRvY19oZWFkZXIucGdfZW50cmllczsKKyAgICAgIHB4ZGJfaGVhZGVyX3AtPmZ1bmN0aW9ucyA9IGRvY19oZWFkZXIuZnVuY3Rpb25zOworICAgICAgcHhkYl9oZWFkZXJfcC0+ZmlsZXMgPSBkb2NfaGVhZGVyLmZpbGVzOworICAgICAgcHhkYl9oZWFkZXJfcC0+Y2RfZW50cmllcyA9IGRvY19oZWFkZXIuY2RfZW50cmllczsKKyAgICAgIHB4ZGJfaGVhZGVyX3AtPmFhX2VudHJpZXMgPSBkb2NfaGVhZGVyLmFhX2VudHJpZXM7CisgICAgICBweGRiX2hlYWRlcl9wLT5vaV9lbnRyaWVzID0gZG9jX2hlYWRlci5vaV9lbnRyaWVzOworICAgICAgcHhkYl9oZWFkZXJfcC0+dmVyc2lvbiA9IGRvY19oZWFkZXIudmVyc2lvbjsKKyAgICB9CQkJCS8qIFBJTkZPIHNlY3Rpb24gKi8KKworICBlbHNlCisgICAgeworI2lmZGVmIERVTVBJTkcKKyAgICAgIGlmIChkdW1waW5nKQorCXByaW50ZiAoIj09Tm8gZGVidWcgaW5mbyBhdCBhbGwgZm9yICVzLlxuIiwgb2JqZmlsZS0+bmFtZSk7CisjZW5kaWYKKworICAgICAgcmV0dXJuIDA7CisKKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CQkJCS8qIEVuZCBvZiBocHJlYWRfZ2V0X2hlYWRlciAqLworI2VuZGlmIC8qIFFVSUNLX0xPT0tfVVAgKi8KKwwKKworLyogSW5pdGlhbGl6YXRpb24gZm9yIHJlYWRpbmcgbmF0aXZlIEhQIEMgZGVidWcgc3ltYm9scyBmcm9tIE9CSkZJTEUuCisKKyAgIEl0cyBvbmx5IHB1cnBvc2UgaW4gbGlmZSBpcyB0byBzZXQgdXAgdGhlIHN5bWJvbCByZWFkZXIncyBwcml2YXRlCisgICBwZXItb2JqZmlsZSBkYXRhIHN0cnVjdHVyZXMsIGFuZCByZWFkIGluIHRoZSByYXcgY29udGVudHMgb2YgdGhlIGRlYnVnCisgICBzZWN0aW9ucyAoYXR0YWNoaW5nIHBvaW50ZXJzIHRvIHRoZSBkZWJ1ZyBpbmZvIGludG8gdGhlIHByaXZhdGUgZGF0YQorICAgc3RydWN0dXJlcykuCisKKyAgIFNpbmNlIEJGRCBkb2Vzbid0IGtub3cgaG93IHRvIHJlYWQgZGVidWcgc3ltYm9scyBpbiBhIGZvcm1hdC1pbmRlcGVuZGVudAorICAgd2F5IChhbmQgbWF5IG5ldmVyIGRvIHNvLi4uKSwgd2UgaGF2ZSB0byBkbyBpdCBvdXJzZWx2ZXMuICBOb3RlIHdlIG1heQorICAgYmUgY2FsbGVkIG9uIGEgZmlsZSB3aXRob3V0IG5hdGl2ZSBIUCBDIGRlYnVnZ2luZyBzeW1ib2xzLgorCisgICBGSVhNRSwgdGhlcmUgc2hvdWxkIGJlIGEgY2xlYW5lciBwZWVwaG9sZSBpbnRvIHRoZSBCRkQgZW52aXJvbm1lbnQKKyAgIGhlcmUuICovCit2b2lkCitocHJlYWRfc3ltZmlsZV9pbml0IChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgYXNlY3Rpb24gKnZ0X3NlY3Rpb24sICpzbHRfc2VjdGlvbiwgKmxudHRfc2VjdGlvbiwgKmdudHRfc2VjdGlvbjsKKworICAvKiBBbGxvY2F0ZSBzdHJ1Y3QgdG8ga2VlcCB0cmFjayBvZiB0aGUgc3ltZmlsZSAqLworICBvYmpmaWxlLT5zeW1fcHJpdmF0ZSA9IChQVFIpCisgICAgeG1tYWxsb2MgKG9iamZpbGUtPm1kLCBzaXplb2YgKHN0cnVjdCBocHJlYWRfc3ltZmlsZV9pbmZvKSk7CisgIG1lbXNldCAob2JqZmlsZS0+c3ltX3ByaXZhdGUsIDAsIHNpemVvZiAoc3RydWN0IGhwcmVhZF9zeW1maWxlX2luZm8pKTsKKworICAvKiBXZSBoYXZlbid0IHJlYWQgaW4gYW55IHR5cGVzIHlldC4gICovCisgIFRZUEVfVkVDVE9SIChvYmpmaWxlKSA9IDA7CisKKyAgLyogUmVhZCBpbiBkYXRhIGZyb20gdGhlICRHTlRUJCBzdWJzcGFjZS4gICovCisgIGdudHRfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvYmpmaWxlLT5vYmZkLCAiJEdOVFQkIik7CisgIGlmICghZ250dF9zZWN0aW9uKQorICAgIHJldHVybjsKKworICBHTlRUIChvYmpmaWxlKQorICAgID0gb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrLAorCQkgICAgIGJmZF9zZWN0aW9uX3NpemUgKG9iamZpbGUtPm9iZmQsIGdudHRfc2VjdGlvbikpOworCisgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAob2JqZmlsZS0+b2JmZCwgZ250dF9zZWN0aW9uLCBHTlRUIChvYmpmaWxlKSwKKwkJCSAgICAwLCBiZmRfc2VjdGlvbl9zaXplIChvYmpmaWxlLT5vYmZkLCBnbnR0X3NlY3Rpb24pKTsKKworICBHTlRUX1NZTUNPVU5UIChvYmpmaWxlKQorICAgID0gYmZkX3NlY3Rpb25fc2l6ZSAob2JqZmlsZS0+b2JmZCwgZ250dF9zZWN0aW9uKQorICAgIC8gc2l6ZW9mIChzdHJ1Y3QgZG50dF90eXBlX2Jsb2NrKTsKKworICAvKiBSZWFkIGluIGRhdGEgZnJvbSB0aGUgJExOVFQkIHN1YnNwYWNlLiAgIEFsc28ga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyCisgICAgIG9mIExOVFQgc3ltYm9scy4KKworICAgICBGSVhNRTogdGhpcyBjb3VsZCBiZSBtb3ZlZCBpbnRvIHRoZSBwc3ltdGFiLXRvLXN5bXRhYiBleHBhbnNpb24KKyAgICAgY29kZSwgYW5kIHNhdmUgc3RhcnR1cCB0aW1lLiAgQXQgdGhlIG1vbWVudCB0aGlzIGRhdGEgaXMKKyAgICAgc3RpbGwgdXNlZCwgdGhvdWdoLiAgV2UnZCBuZWVkIGEgd2F5IHRvIHRlbGwgaHAtc3ltdGFiLXJlYWQuYworICAgICB3aGV0aGVyIG9yIG5vdCB0byBsb2FkIHRoZSBMTlRULiAqLworICBsbnR0X3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob2JqZmlsZS0+b2JmZCwgIiRMTlRUJCIpOworICBpZiAoIWxudHRfc2VjdGlvbikKKyAgICByZXR1cm47CisKKyAgTE5UVCAob2JqZmlsZSkKKyAgICA9IG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywKKwkJICAgICBiZmRfc2VjdGlvbl9zaXplIChvYmpmaWxlLT5vYmZkLCBsbnR0X3NlY3Rpb24pKTsKKworICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKG9iamZpbGUtPm9iZmQsIGxudHRfc2VjdGlvbiwgTE5UVCAob2JqZmlsZSksCisJCQkgICAgMCwgYmZkX3NlY3Rpb25fc2l6ZSAob2JqZmlsZS0+b2JmZCwgbG50dF9zZWN0aW9uKSk7CisKKyAgTE5UVF9TWU1DT1VOVCAob2JqZmlsZSkKKyAgICA9IGJmZF9zZWN0aW9uX3NpemUgKG9iamZpbGUtPm9iZmQsIGxudHRfc2VjdGlvbikKKyAgICAvIHNpemVvZiAoc3RydWN0IGRudHRfdHlwZV9ibG9jayk7CisKKyAgLyogUmVhZCBpbiBkYXRhIGZyb20gdGhlICRTTFQkIHN1YnNwYWNlLiAgJFNMVCQgY29udGFpbnMgaW5mb3JtYXRpb24KKyAgICAgb24gc291cmNlIGxpbmUgbnVtYmVycy4gICovCisgIHNsdF9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG9iamZpbGUtPm9iZmQsICIkU0xUJCIpOworICBpZiAoIXNsdF9zZWN0aW9uKQorICAgIHJldHVybjsKKworICBTTFQgKG9iamZpbGUpID0KKyAgICBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssCisJCSAgIGJmZF9zZWN0aW9uX3NpemUgKG9iamZpbGUtPm9iZmQsIHNsdF9zZWN0aW9uKSk7CisKKyAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChvYmpmaWxlLT5vYmZkLCBzbHRfc2VjdGlvbiwgU0xUIChvYmpmaWxlKSwKKwkJCSAgICAwLCBiZmRfc2VjdGlvbl9zaXplIChvYmpmaWxlLT5vYmZkLCBzbHRfc2VjdGlvbikpOworCisgIC8qIFJlYWQgaW4gZGF0YSBmcm9tIHRoZSAkVlQkIHN1YnNwYWNlLiAgJFZUJCBjb250YWlucyB0aGluZ3MgbGlrZQorICAgICBuYW1lcyBhbmQgY29uc3RhbnRzLiAgS2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gdGhlIFZULiAgKi8KKyAgdnRfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvYmpmaWxlLT5vYmZkLCAiJFZUJCIpOworICBpZiAoIXZ0X3NlY3Rpb24pCisgICAgcmV0dXJuOworCisgIFZUX1NJWkUgKG9iamZpbGUpID0gYmZkX3NlY3Rpb25fc2l6ZSAob2JqZmlsZS0+b2JmZCwgdnRfc2VjdGlvbik7CisKKyAgVlQgKG9iamZpbGUpID0KKyAgICAoY2hhciAqKSBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssCisJCQkgICAgVlRfU0laRSAob2JqZmlsZSkpOworCisgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAob2JqZmlsZS0+b2JmZCwgdnRfc2VjdGlvbiwgVlQgKG9iamZpbGUpLAorCQkJICAgIDAsIFZUX1NJWkUgKG9iamZpbGUpKTsKK30KKworLyogU2NhbiBhbmQgYnVpbGQgcGFydGlhbCBzeW1ib2xzIGZvciBhIHN5bWJvbCBmaWxlLgorCisgICBUaGUgbWluaW1hbCBzeW1ib2wgdGFibGUgKGVpdGhlciBTT00gb3IgSFAgYS5vdXQpIGhhcyBhbHJlYWR5IGJlZW4KKyAgIHJlYWQgaW47IGFsbCB3ZSBuZWVkIHRvIGRvIGlzIHNldHVwIHBhcnRpYWwgc3ltYm9scyBiYXNlZCBvbiB0aGUKKyAgIG5hdGl2ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisKKyAgIE5vdGUgdGhhdCB0aGUgbWluaW1hbCB0YWJsZSBpcyBwcm9kdWNlZCBieSB0aGUgbGlua2VyLCBhbmQgaGFzCisgICBvbmx5IGdsb2JhbCByb3V0aW5lcyBpbiBpdDsgdGhlIHBzeW10YWIgaXMgYmFzZWQgb24gY29tcGlsZXItCisgICBnZW5lcmF0ZWQgZGVidWcgaW5mb3JtYXRpb24gYW5kIGhhcyBub24tZ2xvYmFsCisgICByb3V0aW5lcyBpbiBpdCBhcyB3ZWxsIGFzIGZpbGVzIGFuZCBjbGFzcyBpbmZvcm1hdGlvbi4KKworICAgV2UgYXNzdW1lIGhwcmVhZF9zeW1maWxlX2luaXQgaGFzIGJlZW4gY2FsbGVkIHRvIGluaXRpYWxpemUgdGhlCisgICBzeW1ib2wgcmVhZGVyJ3MgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZXMuCisKKyAgIFNFQ1RJT05fT0ZGU0VUUyBjb250YWlucyBvZmZzZXRzIHJlbGF0aXZlIHRvIHdoaWNoIHRoZSBzeW1ib2xzIGluIHRoZQorICAgdmFyaW91cyBzZWN0aW9ucyBhcmUgKGRlcGVuZGluZyB3aGVyZSB0aGUgc2VjdGlvbnMgd2VyZSBhY3R1YWxseSBsb2FkZWQpLgorICAgTUFJTkxJTkUgaXMgdHJ1ZSBpZiB3ZSBhcmUgcmVhZGluZyB0aGUgbWFpbiBzeW1ib2wgdGFibGUgKGFzCisgICBvcHBvc2VkIHRvIGEgc2hhcmVkIGxpYiBvciBkeW5hbWljYWxseSBsb2FkZWQgZmlsZSkuICovCit2b2lkCitocHJlYWRfYnVpbGRfcHN5bXRhYnMgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywgbWFpbmxpbmUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHM7CisgICAgIGludCBtYWlubGluZTsKK3sKKworI2lmZGVmIERVTVBJTkcKKyAgLyogVHVybiB0aGlzIG9uIHRvIGdldCBkZWJ1Z2dpbmcgb3V0cHV0LiAqLworICBzdGF0aWMgaW50IGR1bXBpbmcgPSAwOworI2VuZGlmCisKKyAgY2hhciAqbmFtZXN0cmluZzsKKyAgaW50IHBhc3RfZmlyc3Rfc291cmNlX2ZpbGUgPSAwOworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworCisgIGludCBocF9zeW1udW0sIHN5bWNvdW50LCBpOworICBpbnQgc2Nhbl9zdGFydCA9IDA7CisKKyAgdW5pb24gZG50dGVudHJ5ICpkbl9idWZwOworICB1bnNpZ25lZCBsb25nIHZhbHU7CisgIGNoYXIgKnA7CisgIGludCB0ZXh0aGlnaCA9IDA7CisgIGludCBoYXZlX25hbWUgPSAwOworCisgIC8qIEN1cnJlbnQgcGFydGlhbCBzeW10YWIgKi8KKyAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7CisKKyAgLyogTGlzdCBvZiBjdXJyZW50IHBzeW10YWIncyBpbmNsdWRlIGZpbGVzICovCisgIGNoYXIgKipwc3ltdGFiX2luY2x1ZGVfbGlzdDsKKyAgaW50IGluY2x1ZGVzX2FsbG9jYXRlZDsKKyAgaW50IGluY2x1ZGVzX3VzZWQ7CisKKyAgLyogSW5kZXggd2l0aGluIGN1cnJlbnQgcHN5bXRhYiBkZXBlbmRlbmN5IGxpc3QgKi8KKyAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICoqZGVwZW5kZW5jeV9saXN0OworICBpbnQgZGVwZW5kZW5jaWVzX3VzZWQsIGRlcGVuZGVuY2llc19hbGxvY2F0ZWQ7CisKKyAgLyogSnVzdCBpbiBjYXNlIHRoZSBzdGFicyByZWFkZXIgbGVmdCB0dXJkcyBseWluZyBhcm91bmQuICAqLworICBmcmVlX3BlbmRpbmdfYmxvY2tzICgpOworICBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgcmVhbGx5X2ZyZWVfcGVuZGluZ3MsIDApOworCisgIHBzdCA9IChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikgMDsKKworICAvKiBXZSBzaG91bGRuJ3QgdXNlIGFsbG9jYSwgaW5zdGVhZCB1c2UgbWFsbG9jL2ZyZWUuICBEb2luZyBzbyBhdm9pZHMKKyAgICAgYSBudW1iZXIgb2YgcHJvYmxlbXMgd2l0aCBjcm9zcyBjb21waWxhdGlvbiBhbmQgY3JlYXRpbmcgdXNlbGVzcyBob2xlcworICAgICBpbiB0aGUgc3RhY2sgd2hlbiB3ZSBoYXZlIHRvIGFsbG9jYXRlIG5ldyBlbnRyaWVzLiAgRklYTUUuICAqLworCisgIGluY2x1ZGVzX2FsbG9jYXRlZCA9IDMwOworICBpbmNsdWRlc191c2VkID0gMDsKKyAgcHN5bXRhYl9pbmNsdWRlX2xpc3QgPSAoY2hhciAqKikgYWxsb2NhIChpbmNsdWRlc19hbGxvY2F0ZWQgKgorCQkJCQkgICBzaXplb2YgKGNoYXIgKikpOworCisgIGRlcGVuZGVuY2llc19hbGxvY2F0ZWQgPSAzMDsKKyAgZGVwZW5kZW5jaWVzX3VzZWQgPSAwOworICBkZXBlbmRlbmN5X2xpc3QgPQorICAgIChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKiopIGFsbG9jYSAoZGVwZW5kZW5jaWVzX2FsbG9jYXRlZCAqCisJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKKworICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZnJlZV9vYmpmaWxlLCBvYmpmaWxlKTsKKworICBsYXN0X3NvdXJjZV9maWxlID0gMDsKKworI2lmZGVmIFFVSUNLX0xPT0tfVVAKKyAgeworICAgIC8qIEJlZ2luIGNvZGUgZm9yIG5ldy1zdHlsZSBsb2FkaW5nIG9mIHF1aWNrIGxvb2stdXAgdGFibGVzLiAqLworCisgICAgLyogZWx6OiB0aGlzIGNoZWNrcyB3aGV0aGVyIHRoZSBmaWxlIGhhcyBiZWVlbiBwcm9jZXNzZWQgYnkgcHhkYi4KKyAgICAgICBJZiBub3Qgd2Ugd291bGQgbGlrZSB0byB0cnkgdG8gcmVhZCB0aGUgcHN5bWJvbHMgaW4KKyAgICAgICBhbnl3YXksIGJ1dCBpdCB0dXJucyBvdXQgdG8gYmUgbm90IHNvIGVhc3kuIFNvIHRoaXMgY291bGQgCisgICAgICAgYWN0dWFsbHkgYmUgY29tbWVudGVkIG91dCwgYnV0IEkgbGVhdmUgaXQgaW4sIGp1c3QgaW4gY2FzZQorICAgICAgIHdlIGRlY2lkZSB0byBhZGQgc3VwcG9ydCBmb3Igbm9uLXB4ZGItZWQgc3R1ZmYgaW4gdGhlIGZ1dHVyZS4gKi8KKyAgICBQWERCX2hlYWRlciBweGRiX2hlYWRlcjsKKyAgICBpbnQgZm91bmRfbW9kdWxlc19pbl9wcm9ncmFtOworCisgICAgaWYgKGhwcmVhZF9nZXRfaGVhZGVyIChvYmpmaWxlLCAmcHhkYl9oZWFkZXIpKQorICAgICAgeworCS8qIEJ1aWxkIGEgbWluaW1hbCB0YWJsZS4gIE5vIHR5cGVzLCBubyBnbG9iYWwgdmFyaWFibGVzLAorCSAgIG5vIGluY2x1ZGUgZmlsZXMuLi4uICovCisjaWZkZWYgRFVNUElORworCWlmIChkdW1waW5nKQorCSAgcHJpbnRmICgiXG5OZXcgbWV0aG9kIGZvciAlc1xuIiwgb2JqZmlsZS0+bmFtZSk7CisjZW5kaWYKKworCS8qIGVsejogcXVpY2tfdHJhdmVyc2UgcmV0dXJucyB0cnVlIGlmIGl0IGZvdW5kCisJICAgc29tZSBtb2R1bGVzIGluIHRoZSBtYWluIHNvdXJjZSBmaWxlLCBvdGhlcgorCSAgIHRoYW4gdGhvc2UgaW4gZW5kLmMKKwkgICBJbiBDIGFuZCBDKyssIGFsbCB0aGUgZmlsZXMgaGF2ZSBNT0RVTEVTIGVudHJpZXMKKwkgICBpbiB0aGUgTE5UVCwgYW5kIHRoZSBxdWljayB0YWJsZSB0cmF2ZXJzZSBpcyBhbGwgCisJICAgYmFzZWQgb24gZmluZGluZyB0aGVzZSBNT0RVTEVTIGVudHJpZXMuIFdpdGhvdXQgCisJICAgdGhvc2UgaXQgY2Fubm90IHdvcmsuIAorCSAgIEl0IGhhcHBlbnMgdGhhdCBGNzcgcHJvZ3JhbXMgZG9uJ3QgaGF2ZSBNT0RVTEVTCisJICAgc28gdGhlIHF1aWNrIHRyYXZlcnNlIGdldHMgY29uZnVzZWQuIEY5MCBwcm9ncmFtcworCSAgIGhhdmUgbW9kdWxlcywgYW5kIHRoZSBxdWljayBtZXRob2Qgc3RpbGwgd29ya3MuCisJICAgU28sIGlmIG1vZHVsZXMgKG90aGVyIHRoYW4gdGhvc2UgaW4gZW5kLmMpIGFyZQorCSAgIG5vdCBmb3VuZCB3ZSBnaXZlIHVwIG9uIHRoZSBxdWljayB0YWJsZSBzdHVmZiwgCisJICAgYW5kIGZhbGwgYmFjayBvbiB0aGUgc2xvd2VyIG1ldGhvZCAgKi8KKwlmb3VuZF9tb2R1bGVzX2luX3Byb2dyYW0gPSBocHJlYWRfcXVpY2tfdHJhdmVyc2UgKG9iamZpbGUsCisJCQkJCQkJICBzZWN0aW9uX29mZnNldHMsCisJCQkJCQkJICBHTlRUIChvYmpmaWxlKSwKKwkJCQkJCQkgIFZUIChvYmpmaWxlKSwKKwkJCQkJCQkgICZweGRiX2hlYWRlcik7CisKKwlkaXNjYXJkX2NsZWFudXBzIChvbGRfY2hhaW4pOworCisJCS8qIFNldCB1cCB0byBzY2FuIHRoZSBnbG9iYWwgc2VjdGlvbiBvZiB0aGUgTE5UVC4KKworCQkgICBUaGlzIGZpZWxkIGlzIG5vdCBhbHdheXMgY29ycmVjdDogaWYgdGhlcmUgYXJlCisJCSAgIG5vIGdsb2JhbHMsIGl0IHdpbGwgcG9pbnQgdG8gdGhlIGxhc3QgcmVjb3JkIGluCisJCSAgIHRoZSByZWd1bGFyIExOVFQsIHdoaWNoIGlzIHVzdWFsbHkgYW4gRU5EIE1PRFVMRS4KKworCQkgICBTaW5jZSBpdCBtaWdodCBoYXBwZW4gdGhhdCB0aGVyZSBjb3VsZCBiZSBhIGZpbGUKKwkJICAgd2l0aCBqdXN0IG9uZSBnbG9iYWwgcmVjb3JkLCB0aGVyZSdzIG5vIHdheSB0bworCQkgICB0ZWxsIG90aGVyIHRoYW4gYnkgbG9va2luZyBhdCB0aGUgcmVjb3JkLCBzbyB0aGF0J3MKKwkJICAgZG9uZSBiZWxvdy4gKi8KKwlpZiAoZm91bmRfbW9kdWxlc19pbl9wcm9ncmFtKQorCSAgc2Nhbl9zdGFydCA9IHB4ZGJfaGVhZGVyLmdsb2JhbHM7CisgICAgICB9CisjaWZkZWYgRFVNUElORworICAgIGVsc2UKKyAgICAgIHsKKwlpZiAoZHVtcGluZykKKwkgIHByaW50ZiAoIlxuR29pbmcgb24gdG8gb2xkIG1ldGhvZCBmb3IgJXNcbiIsIG9iamZpbGUtPm5hbWUpOworICAgICAgfQorI2VuZGlmCisgIH0KKyNlbmRpZiAvKiBRVUlDS19MT09LX1VQICovCisKKyAgICAvKiBNYWtlIHR3byBwYXNzZXMsIG9uZSBvdmVyIHRoZSBHTlRUIHN5bWJvbHMsIHRoZSBvdGhlciBmb3IgdGhlCisgICAgICAgTE5UVCBzeW1ib2xzLgorCisgICAgIEpCIGNvbW1lbnQ6IGFib3ZlIGlzbid0IHRydWUtLXRoZXkgb25seSBtYWtlIG9uZSBwYXNzLCBvdmVyCisgICAgIHRoZSBMTlRULiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDE7IGkrKykKKyAgICB7CisgICAgICBpbnQgd2l0aGluX2Z1bmN0aW9uID0gMDsKKworICAgICAgaWYgKGkpCisJc3ltY291bnQgPSBHTlRUX1NZTUNPVU5UIChvYmpmaWxlKTsKKyAgICAgIGVsc2UKKwlzeW1jb3VudCA9IExOVFRfU1lNQ09VTlQgKG9iamZpbGUpOworCisKKyAgICAgIGZvciAoaHBfc3ltbnVtID0gc2Nhbl9zdGFydDsgaHBfc3ltbnVtIDwgc3ltY291bnQ7IGhwX3N5bW51bSsrKQorCXsKKwkgIFFVSVQ7CisJICBpZiAoaSkKKwkgICAgZG5fYnVmcCA9IGhwcmVhZF9nZXRfZ250dCAoaHBfc3ltbnVtLCBvYmpmaWxlKTsKKwkgIGVsc2UKKwkgICAgZG5fYnVmcCA9IGhwcmVhZF9nZXRfbG50dCAoaHBfc3ltbnVtLCBvYmpmaWxlKTsKKworCSAgaWYgKGRuX2J1ZnAtPmRibG9jay5leHRlbnNpb24pCisJICAgIGNvbnRpbnVlOworCisJICAvKiBPbmx5IGhhbmRsZSB0aGluZ3Mgd2hpY2ggYXJlIG5lY2Vzc2FyeSBmb3IgbWluaW1hbCBzeW1ib2xzLgorCSAgICAgZXZlcnl0aGluZyBlbHNlIGlzIGlnbm9yZWQuICAqLworCSAgc3dpdGNoIChkbl9idWZwLT5kYmxvY2sua2luZCkKKwkgICAgeworCSAgICBjYXNlIEROVFRfVFlQRV9TUkNGSUxFOgorCSAgICAgIHsKKyNpZmRlZiBRVUlDS19MT09LX1VQCisJCWlmIChzY2FuX3N0YXJ0ID09IGhwX3N5bW51bQorCQkgICAgJiYgc3ltY291bnQgPT0gaHBfc3ltbnVtICsgMSkKKwkJICB7CisJCSAgICAvKiBJZiB0aGVyZSBhcmUgTk8gZ2xvYmFscyBpbiBhbiBleGVjdXRhYmxlLAorCQkgICAgICAgUFhEQidzIGluZGV4IHRvIHRoZSBnbG9iYWxzIHdpbGwgcG9pbnQgdG8KKwkJICAgICAgIHRoZSBsYXN0IHJlY29yZCBpbiB0aGUgZmlsZSwgd2hpY2ggCisJCSAgICAgICBjb3VsZCBiZSB0aGlzIHJlY29yZC4gKHRoaXMgaGFwcGVuZWQgZm9yIEY3NyBsaWJyYXJpZXMpCisJCSAgICAgICBpZ25vcmUgaXQgYW5kIGJlIGRvbmUhICovCisJCSAgICBjb250aW51ZTsKKwkJICB9CisjZW5kaWYgLyogUVVJQ0tfTE9PS19VUCAqLworCisJCS8qIEEgc291cmNlIGZpbGUgb2Ygc29tZSBraW5kLiAgTm90ZSB0aGlzIG1heSBzaW1wbHkKKwkJICAgYmUgYW4gaW5jbHVkZWQgZmlsZS4gICovCisJCVNFVF9OQU1FU1RSSU5HIChkbl9idWZwLCAmbmFtZXN0cmluZywgb2JqZmlsZSk7CisKKwkJLyogQ2hlY2sgaWYgdGhpcyBpcyB0aGUgc291cmNlIGZpbGUgd2UgYXJlIGFscmVhZHkgd29ya2luZworCQkgICB3aXRoLiAgKi8KKwkJaWYgKHBzdCAmJiAhc3RyY21wIChuYW1lc3RyaW5nLCBwc3QtPmZpbGVuYW1lKSkKKwkJICBjb250aW51ZTsKKworCQkvKiBDaGVjayBpZiB0aGlzIGlzIGFuIGluY2x1ZGUgZmlsZSwgaWYgc28gY2hlY2sgaWYgd2UgaGF2ZQorCQkgICBhbHJlYWR5IHNlZW4gaXQuICBBZGQgaXQgdG8gdGhlIGluY2x1ZGUgbGlzdCAqLworCQlwID0gc3RycmNociAobmFtZXN0cmluZywgJy4nKTsKKwkJaWYgKCFzdHJjbXAgKHAsICIuaCIpKQorCQkgIHsKKwkJICAgIGludCBqLCBmb3VuZDsKKworCQkgICAgZm91bmQgPSAwOworCQkgICAgZm9yIChqID0gMDsgaiA8IGluY2x1ZGVzX3VzZWQ7IGorKykKKwkJICAgICAgaWYgKCFzdHJjbXAgKG5hbWVzdHJpbmcsIHBzeW10YWJfaW5jbHVkZV9saXN0W2pdKSkKKwkJCXsKKwkJCSAgZm91bmQgPSAxOworCQkJICBicmVhazsKKwkJCX0KKwkJICAgIGlmIChmb3VuZCkKKwkJICAgICAgY29udGludWU7CisKKwkJICAgIC8qIEFkZCBpdCB0byB0aGUgbGlzdCBvZiBpbmNsdWRlcyBzZWVuIHNvIGZhciBhbmQKKwkJICAgICAgIGFsbG9jYXRlIG1vcmUgaW5jbHVkZSBzcGFjZSBpZiBuZWNlc3NhcnkuICAqLworCQkgICAgcHN5bXRhYl9pbmNsdWRlX2xpc3RbaW5jbHVkZXNfdXNlZCsrXSA9IG5hbWVzdHJpbmc7CisJCSAgICBpZiAoaW5jbHVkZXNfdXNlZCA+PSBpbmNsdWRlc19hbGxvY2F0ZWQpCisJCSAgICAgIHsKKwkJCWNoYXIgKipvcmlnID0gcHN5bXRhYl9pbmNsdWRlX2xpc3Q7CisKKwkJCXBzeW10YWJfaW5jbHVkZV9saXN0ID0gKGNoYXIgKiopCisJCQkgIGFsbG9jYSAoKGluY2x1ZGVzX2FsbG9jYXRlZCAqPSAyKSAqCisJCQkJICBzaXplb2YgKGNoYXIgKikpOworCQkJbWVtY3B5ICgoUFRSKSBwc3ltdGFiX2luY2x1ZGVfbGlzdCwgKFBUUikgb3JpZywKKwkJCQlpbmNsdWRlc191c2VkICogc2l6ZW9mIChjaGFyICopKTsKKwkJICAgICAgfQorCQkgICAgY29udGludWU7CisJCSAgfQorCisJCWlmIChwc3QpCisJCSAgeworCQkgICAgaWYgKCFoYXZlX25hbWUpCisJCSAgICAgIHsKKwkJCXBzdC0+ZmlsZW5hbWUgPSAoY2hhciAqKQorCQkJICBvYnN0YWNrX2FsbG9jICgmcHN0LT5vYmpmaWxlLT5wc3ltYm9sX29ic3RhY2ssCisJCQkJCSBzdHJsZW4gKG5hbWVzdHJpbmcpICsgMSk7CisJCQlzdHJjcHkgKHBzdC0+ZmlsZW5hbWUsIG5hbWVzdHJpbmcpOworCQkJaGF2ZV9uYW1lID0gMTsKKwkJCWNvbnRpbnVlOworCQkgICAgICB9CisJCSAgICBjb250aW51ZTsKKwkJICB9CisKKwkJLyogVGhpcyBpcyBhIGJvbmFmaWRlIG5ldyBzb3VyY2UgZmlsZS4KKwkJICAgRW5kIHRoZSBjdXJyZW50IHBhcnRpYWwgc3ltdGFiIGFuZCBzdGFydCBhIG5ldyBvbmUuICAqLworCisJCWlmIChwc3QgJiYgcGFzdF9maXJzdF9zb3VyY2VfZmlsZSkKKwkJICB7CisJCSAgICBocHJlYWRfZW5kX3BzeW10YWIgKHBzdCwgcHN5bXRhYl9pbmNsdWRlX2xpc3QsCisJCQkJCWluY2x1ZGVzX3VzZWQsCisJCQkJCShocF9zeW1udW0KKwkJCQkJICogc2l6ZW9mIChzdHJ1Y3QgZG50dF90eXBlX2Jsb2NrKSksCisJCQkJCXRleHRoaWdoLAorCQkJCQlkZXBlbmRlbmN5X2xpc3QsIGRlcGVuZGVuY2llc191c2VkKTsKKwkJICAgIHBzdCA9IChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikgMDsKKwkJICAgIGluY2x1ZGVzX3VzZWQgPSAwOworCQkgICAgZGVwZW5kZW5jaWVzX3VzZWQgPSAwOworCQkgIH0KKwkJZWxzZQorCQkgIHBhc3RfZmlyc3Rfc291cmNlX2ZpbGUgPSAxOworCisJCXZhbHUgPSBocHJlYWRfZ2V0X3RleHRsb3cgKGksIGhwX3N5bW51bSwgb2JqZmlsZSwgc3ltY291bnQpOworCQl2YWx1ICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOworCQlwc3QgPSBocHJlYWRfc3RhcnRfcHN5bXRhYiAob2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzLAorCQkJCQkgICAgbmFtZXN0cmluZywgdmFsdSwKKwkJCQkJICAgIChocF9zeW1udW0KKwkJCQkJICAgICAqIHNpemVvZiAoc3RydWN0IGRudHRfdHlwZV9ibG9jaykpLAorCQkJCQkgICAgb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLm5leHQsCisJCQkJCSAgICBvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMubmV4dCk7CisJCXRleHRoaWdoID0gdmFsdTsKKwkJaGF2ZV9uYW1lID0gMTsKKwkJY29udGludWU7CisJICAgICAgfQorCisJICAgIGNhc2UgRE5UVF9UWVBFX01PRFVMRToKKwkgICAgICAvKiBBIHNvdXJjZSBmaWxlLiAgSXQncyBzdGlsbCB1bmNsZWFyIHRvIG1lIHdoYXQgdGhlCisJICAgICAgICAgcmVhbCBkaWZmZXJlbmNlIGJldHdlZW4gYSBETlRUX1RZUEVfU1JDRklMRSBhbmQgRE5UVF9UWVBFX01PRFVMRQorCSAgICAgICAgIGlzIHN1cHBvc2VkIHRvIGJlLiAgKi8KKworCSAgICAgIC8qIEZpcnN0IGVuZCB0aGUgcHJldmlvdXMgcHN5bXRhYiAqLworCSAgICAgIGlmIChwc3QpCisJCXsKKwkJICBocHJlYWRfZW5kX3BzeW10YWIgKHBzdCwgcHN5bXRhYl9pbmNsdWRlX2xpc3QsIGluY2x1ZGVzX3VzZWQsCisJCQkJICAgICAgKChocF9zeW1udW0gLSAxKQorCQkJCSAgICAgICAqIHNpemVvZiAoc3RydWN0IGRudHRfdHlwZV9ibG9jaykpLAorCQkJCSAgICAgIHRleHRoaWdoLAorCQkJCSAgICAgIGRlcGVuZGVuY3lfbGlzdCwgZGVwZW5kZW5jaWVzX3VzZWQpOworCQkgIHBzdCA9IChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikgMDsKKwkJICBpbmNsdWRlc191c2VkID0gMDsKKwkJICBkZXBlbmRlbmNpZXNfdXNlZCA9IDA7CisJCSAgaGF2ZV9uYW1lID0gMDsKKwkJfQorCisJICAgICAgLyogTm93IGJlZ2luIGEgbmV3IG1vZHVsZSBhbmQgYSBuZXcgcHN5bXRhYiBmb3IgaXQgKi8KKwkgICAgICBTRVRfTkFNRVNUUklORyAoZG5fYnVmcCwgJm5hbWVzdHJpbmcsIG9iamZpbGUpOworCSAgICAgIHZhbHUgPSBocHJlYWRfZ2V0X3RleHRsb3cgKGksIGhwX3N5bW51bSwgb2JqZmlsZSwgc3ltY291bnQpOworCSAgICAgIHZhbHUgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCk7CisJICAgICAgaWYgKCFwc3QpCisJCXsKKwkJICBwc3QgPSBocHJlYWRfc3RhcnRfcHN5bXRhYiAob2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzLAorCQkJCQkgICAgICBuYW1lc3RyaW5nLCB2YWx1LAorCQkJCQkgICAgICAoaHBfc3ltbnVtCisJCQkJCSAgICAgICAqIHNpemVvZiAoc3RydWN0IGRudHRfdHlwZV9ibG9jaykpLAorCQkJCQkgICAgICBvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMubmV4dCwKKwkJCQkJICAgICAgb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLm5leHQpOworCQkgIHRleHRoaWdoID0gdmFsdTsKKwkJICBoYXZlX25hbWUgPSAwOworCQl9CisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSBETlRUX1RZUEVfRlVOQ1RJT046CisJICAgIGNhc2UgRE5UVF9UWVBFX0VOVFJZOgorCSAgICAgIC8qIFRoZSBiZWdpbm5pbmcgb2YgYSBmdW5jdGlvbi4gIEROVFRfVFlQRV9FTlRSWSBtYXkgYWxzbyBkZW5vdGUKKwkgICAgICAgICBhIHNlY29uZGFyeSBlbnRyeSBwb2ludC4gICovCisJICAgICAgdmFsdSA9IGRuX2J1ZnAtPmRmdW5jLmhpYWRkciArIEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsCisJCQkJCQkgICAgICAgU0VDVF9PRkZfVEVYVCk7CisJICAgICAgaWYgKHZhbHUgPiB0ZXh0aGlnaCkKKwkJdGV4dGhpZ2ggPSB2YWx1OworCSAgICAgIHZhbHUgPSBkbl9idWZwLT5kZnVuYy5sb3dhZGRyICsKKwkJQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCk7CisJICAgICAgU0VUX05BTUVTVFJJTkcgKGRuX2J1ZnAsICZuYW1lc3RyaW5nLCBvYmpmaWxlKTsKKwkgICAgICBpZiAoZG5fYnVmcC0+ZGZ1bmMuZ2xvYmFsKQorCQlhZGRfcHN5bWJvbF90b19saXN0IChuYW1lc3RyaW5nLCBzdHJsZW4gKG5hbWVzdHJpbmcpLAorCQkJCSAgICAgVkFSX05BTUVTUEFDRSwgTE9DX0JMT0NLLAorCQkJCSAgICAgJm9iamZpbGUtPmdsb2JhbF9wc3ltYm9scywgdmFsdSwKKwkJCQkgICAgIDAsIGxhbmd1YWdlX3Vua25vd24sIG9iamZpbGUpOworCSAgICAgIGVsc2UKKwkJYWRkX3BzeW1ib2xfdG9fbGlzdCAobmFtZXN0cmluZywgc3RybGVuIChuYW1lc3RyaW5nKSwKKwkJCQkgICAgIFZBUl9OQU1FU1BBQ0UsIExPQ19CTE9DSywKKwkJCQkgICAgICZvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMsIHZhbHUsCisJCQkJICAgICAwLCBsYW5ndWFnZV91bmtub3duLCBvYmpmaWxlKTsKKwkgICAgICB3aXRoaW5fZnVuY3Rpb24gPSAxOworCSAgICAgIGNvbnRpbnVlOworCisJICAgIGNhc2UgRE5UVF9UWVBFX0RPQ19GVU5DVElPTjoKKwkgICAgICB2YWx1ID0gZG5fYnVmcC0+ZGRvY2Z1bmMuaGlhZGRyICsgQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywKKwkJCQkJCQkgIFNFQ1RfT0ZGX1RFWFQpOworCSAgICAgIGlmICh2YWx1ID4gdGV4dGhpZ2gpCisJCXRleHRoaWdoID0gdmFsdTsKKwkgICAgICB2YWx1ID0gZG5fYnVmcC0+ZGRvY2Z1bmMubG93YWRkciArCisJCUFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOworCSAgICAgIFNFVF9OQU1FU1RSSU5HIChkbl9idWZwLCAmbmFtZXN0cmluZywgb2JqZmlsZSk7CisJICAgICAgaWYgKGRuX2J1ZnAtPmRkb2NmdW5jLmdsb2JhbCkKKwkJYWRkX3BzeW1ib2xfdG9fbGlzdCAobmFtZXN0cmluZywgc3RybGVuIChuYW1lc3RyaW5nKSwKKwkJCQkgICAgIFZBUl9OQU1FU1BBQ0UsIExPQ19CTE9DSywKKwkJCQkgICAgICZvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMsIHZhbHUsCisJCQkJICAgICAwLCBsYW5ndWFnZV91bmtub3duLCBvYmpmaWxlKTsKKwkgICAgICBlbHNlCisJCWFkZF9wc3ltYm9sX3RvX2xpc3QgKG5hbWVzdHJpbmcsIHN0cmxlbiAobmFtZXN0cmluZyksCisJCQkJICAgICBWQVJfTkFNRVNQQUNFLCBMT0NfQkxPQ0ssCisJCQkJICAgICAmb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLCB2YWx1LAorCQkJCSAgICAgMCwgbGFuZ3VhZ2VfdW5rbm93biwgb2JqZmlsZSk7CisJICAgICAgd2l0aGluX2Z1bmN0aW9uID0gMTsKKwkgICAgICBjb250aW51ZTsKKworCSAgICBjYXNlIEROVFRfVFlQRV9CRUdJTjoKKwkgICAgY2FzZSBETlRUX1RZUEVfRU5EOgorCSAgICAgIC8qIFdlIGRvbid0IGNoZWNrIE1PRFVMRSBlbmQgaGVyZSwgYmVjYXVzZSB0aGVyZSBjYW4gYmUKKwkgICAgICAgICBzeW1ib2xzIGJleW9uZCB0aGUgbW9kdWxlIGVuZCB3aGljaCBwcm9wZXJseSBiZWxvbmcgdG8gdGhlCisJICAgICAgICAgY3VycmVudCBwc3ltdGFiIC0tIHNvIHdlIHdhaXQgdGlsbCB0aGUgbmV4dCBNT0RVTEUgc3RhcnQgKi8KKworCisjaWZkZWYgUVVJQ0tfTE9PS19VUAorCSAgICAgIGlmIChzY2FuX3N0YXJ0ID09IGhwX3N5bW51bQorCQkgICYmIHN5bWNvdW50ID09IGhwX3N5bW51bSArIDEpCisJCXsKKwkJICAvKiBJZiB0aGVyZSBhcmUgTk8gZ2xvYmFscyBpbiBhbiBleGVjdXRhYmxlLAorCQkgICAgIFBYREIncyBpbmRleCB0byB0aGUgZ2xvYmFscyB3aWxsIHBvaW50IHRvCisJCSAgICAgdGhlIGxhc3QgcmVjb3JkIGluIHRoZSBmaWxlLCB3aGljaCBpcworCQkgICAgIHByb2JhYmx5IGFuIEVORCBNT0RVTEUsIGkuZS4gdGhpcyByZWNvcmQuCisJCSAgICAgaWdub3JlIGl0IGFuZCBiZSBkb25lISAqLworCQkgIGNvbnRpbnVlOworCQl9CisjZW5kaWYgLyogUVVJQ0tfTE9PS19VUCAqLworCisJICAgICAgLyogU2NvcGUgYmxvY2sgYmVnaW4vZW5kLiAgV2Ugb25seSBjYXJlIGFib3V0IGZ1bmN0aW9uCisJICAgICAgICAgYW5kIGZpbGUgYmxvY2tzIHJpZ2h0IG5vdy4gICovCisKKwkgICAgICBpZiAoKGRuX2J1ZnAtPmRlbmQuZW5ka2luZCA9PSBETlRUX1RZUEVfRlVOQ1RJT04pIHx8CisJCSAgKGRuX2J1ZnAtPmRlbmQuZW5ka2luZCA9PSBETlRUX1RZUEVfRE9DX0ZVTkNUSU9OKSkKKwkJd2l0aGluX2Z1bmN0aW9uID0gMDsKKwkgICAgICBjb250aW51ZTsKKworCSAgICBjYXNlIEROVFRfVFlQRV9TVkFSOgorCSAgICBjYXNlIEROVFRfVFlQRV9EVkFSOgorCSAgICBjYXNlIEROVFRfVFlQRV9UWVBFREVGOgorCSAgICBjYXNlIEROVFRfVFlQRV9UQUdERUY6CisJICAgICAgeworCQkvKiBWYXJpYWJsZXMsIHR5cGVkZWZzIGFuIHRoZSBsaWtlLiAgKi8KKwkJZW51bSBhZGRyZXNzX2NsYXNzIHN0b3JhZ2U7CisJCW5hbWVzcGFjZV9lbnVtIG5hbWVzcGFjZTsKKworCQkvKiBEb24ndCBhZGQgbG9jYWxzIHRvIHRoZSBwYXJ0aWFsIHN5bWJvbCB0YWJsZS4gICovCisJCWlmICh3aXRoaW5fZnVuY3Rpb24KKwkJICAgICYmIChkbl9idWZwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfU1ZBUgorCQkJfHwgZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX0RWQVIpKQorCQkgIGNvbnRpbnVlOworCisJCS8qIFRBR0RFRnMgZ28gaW50byB0aGUgc3RydWN0dXJlIG5hbWVzcGFjZS4gICovCisJCWlmIChkbl9idWZwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfVEFHREVGKQorCQkgIG5hbWVzcGFjZSA9IFNUUlVDVF9OQU1FU1BBQ0U7CisJCWVsc2UKKwkJICBuYW1lc3BhY2UgPSBWQVJfTkFNRVNQQUNFOworCisJCS8qIFdoYXQga2luZCBvZiAic3RvcmFnZSIgZG9lcyB0aGlzIHVzZT8gICovCisJCWlmIChkbl9idWZwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfU1ZBUikKKwkJICBzdG9yYWdlID0gTE9DX1NUQVRJQzsKKwkJZWxzZSBpZiAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX0RWQVIKKwkJCSAmJiBkbl9idWZwLT5kZHZhci5yZWd2YXIpCisJCSAgc3RvcmFnZSA9IExPQ19SRUdJU1RFUjsKKwkJZWxzZSBpZiAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX0RWQVIpCisJCSAgc3RvcmFnZSA9IExPQ19MT0NBTDsKKwkJZWxzZQorCQkgIHN0b3JhZ2UgPSBMT0NfVU5ERUY7CisKKwkJU0VUX05BTUVTVFJJTkcgKGRuX2J1ZnAsICZuYW1lc3RyaW5nLCBvYmpmaWxlKTsKKwkJaWYgKCFwc3QpCisJCSAgeworCQkgICAgcHN0ID0gaHByZWFkX3N0YXJ0X3BzeW10YWIgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywKKwkJCQkJCSJnbG9iYWxzIiwgMCwKKwkJCQkJCShocF9zeW1udW0KKwkJCQkJCSAqIHNpemVvZiAoc3RydWN0IGRudHRfdHlwZV9ibG9jaykpLAorCQkJCQkJb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLm5leHQsCisJCQkJCQlvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMubmV4dCk7CisJCSAgfQorCisJCS8qIENvbXB1dGUgYWRkcmVzcyBvZiB0aGUgZGF0YSBzeW1ib2wgKi8KKwkJdmFsdSA9IGRuX2J1ZnAtPmRzdmFyLmxvY2F0aW9uOworCQkvKiBSZWxvY2F0ZSBpbiBjYXNlIGl0J3MgaW4gYSBzaGFyZWQgbGlicmFyeSAqLworCQlpZiAoc3RvcmFnZSA9PSBMT0NfU1RBVElDKQorCQkgIHZhbHUgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfREFUQSk7CisKKwkJLyogTHVja2lseSwgZHZhciwgc3ZhciwgdHlwZWRlZiwgYW5kIHRhZ2RlZiBhbGwKKwkJICAgaGF2ZSB0aGVpciAiZ2xvYmFsIiBiaXQgaW4gdGhlIHNhbWUgcGxhY2UsIHNvIGl0IHdvcmtzCisJCSAgICh0aG91Z2ggaXQncyBiYWQgcHJvZ3JhbW1pbmcgcHJhY3RpY2UpIHRvIHJlZmVyZW5jZQorCQkgICAiZHN2YXIuZ2xvYmFsIiBldmVuIHRob3VnaCB3ZSBtYXkgYmUgbG9va2luZyBhdAorCQkgICBhbnkgb2YgdGhlIGFib3ZlIGZvdXIgdHlwZXMuICovCisJCWlmIChkbl9idWZwLT5kc3Zhci5nbG9iYWwpCisJCSAgeworCQkgICAgYWRkX3BzeW1ib2xfdG9fbGlzdCAobmFtZXN0cmluZywgc3RybGVuIChuYW1lc3RyaW5nKSwKKwkJCQkJIG5hbWVzcGFjZSwgc3RvcmFnZSwKKwkJCQkJICZvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMsCisJCQkJCSB2YWx1LAorCQkJCQkgMCwgbGFuZ3VhZ2VfdW5rbm93biwgb2JqZmlsZSk7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgYWRkX3BzeW1ib2xfdG9fbGlzdCAobmFtZXN0cmluZywgc3RybGVuIChuYW1lc3RyaW5nKSwKKwkJCQkJIG5hbWVzcGFjZSwgc3RvcmFnZSwKKwkJCQkJICZvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMsCisJCQkJCSB2YWx1LAorCQkJCQkgMCwgbGFuZ3VhZ2VfdW5rbm93biwgb2JqZmlsZSk7CisJCSAgfQorCisJCS8qIEZvciBUQUdERUYncywgdGhlIGFib3ZlIGNvZGUgYWRkZWQgdGhlIHRhZ25hbWUgdG8gdGhlCisJCSAgIHN0cnVjdCBuYW1lc3BhY2UuIFRoaXMgd2lsbCBjYXVzZSB0YWcgInQiIHRvIGJlIGZvdW5kCisJCSAgIG9uIGEgcmVmZXJlbmNlIG9mIHRoZSBmb3JtICIoc3RydWN0IHQpIHgiLiBCdXQgZm9yCisJCSAgIEMrKyBjbGFzc2VzLCAidCIgd2lsbCBhbHNvIGJlIGEgdHlwZW5hbWUsIHdoaWNoIHdlCisJCSAgIHdhbnQgdG8gZmluZCBvbiBhIHJlZmVyZW5jZSBvZiB0aGUgZm9ybSAicHR5cGUgdCIuCisJCSAgIFRoZXJlZm9yZSwgd2UgYWxzbyBhZGQgInQiIHRvIHRoZSB2YXIgbmFtZXNwYWNlLgorCQkgICBEbyB0aGUgc2FtZSBmb3IgZW51bSdzIGR1ZSB0byB0aGUgd2F5IGFDQyBnZW5lcmF0ZXMKKwkJICAgZGVidWcgaW5mbyBmb3IgdGhlc2UgKHNlZSBtb3JlIGV4dGVuZGVkIGNvbW1lbnQKKwkJICAgaW4gaHAtc3ltdGFiLXJlYWQuYykuCisJCSAgIFdlIGRvIHRoZSBzYW1lIGZvciB0ZW1wbGF0ZXMsIHNvIHRoYXQgInB0eXBlIHQiCisJCSAgIHdoZXJlICJ0IiBpcyBhIHRlbXBsYXRlIGFsc28gd29ya3MuICovCisJCWlmIChkbl9idWZwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfVEFHREVGICYmCisJCSAgZG5fYnVmcC0+ZHR5cGUudHlwZS5kbnR0cC5pbmRleCA8IExOVFRfU1lNQ09VTlQgKG9iamZpbGUpKQorCQkgIHsKKwkJICAgIGludCBnbG9iYWwgPSBkbl9idWZwLT5kdGFnLmdsb2JhbDsKKwkJICAgIC8qIExvb2sgYWhlYWQgdG8gc2VlIGlmIGl0J3MgYSBDKysgY2xhc3MgKi8KKwkJICAgIGRuX2J1ZnAgPSBocHJlYWRfZ2V0X2xudHQgKGRuX2J1ZnAtPmR0eXBlLnR5cGUuZG50dHAuaW5kZXgsIG9iamZpbGUpOworCQkgICAgaWYgKGRuX2J1ZnAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9DTEFTUyB8fAorCQkJZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX0VOVU0gfHwKKwkJCWRuX2J1ZnAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9URU1QTEFURSkKKwkJICAgICAgeworCQkJaWYgKGdsb2JhbCkKKwkJCSAgeworCQkJICAgIGFkZF9wc3ltYm9sX3RvX2xpc3QgKG5hbWVzdHJpbmcsIHN0cmxlbiAobmFtZXN0cmluZyksCisJCQkJCQkgVkFSX05BTUVTUEFDRSwgc3RvcmFnZSwKKwkJCQkJCSAmb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLAorCQkJCQkJIGRuX2J1ZnAtPmRzdmFyLmxvY2F0aW9uLAorCQkJCQkJIDAsIGxhbmd1YWdlX3Vua25vd24sIG9iamZpbGUpOworCQkJICB9CisJCQllbHNlCisJCQkgIHsKKwkJCSAgICBhZGRfcHN5bWJvbF90b19saXN0IChuYW1lc3RyaW5nLCBzdHJsZW4gKG5hbWVzdHJpbmcpLAorCQkJCQkJIFZBUl9OQU1FU1BBQ0UsIHN0b3JhZ2UsCisJCQkJCQkgJm9iamZpbGUtPnN0YXRpY19wc3ltYm9scywKKwkJCQkJCSBkbl9idWZwLT5kc3Zhci5sb2NhdGlvbiwKKwkJCQkJCSAwLCBsYW5ndWFnZV91bmtub3duLCBvYmpmaWxlKTsKKwkJCSAgfQorCQkgICAgICB9CisJCSAgfQorCSAgICAgIH0KKwkgICAgICBjb250aW51ZTsKKworCSAgICBjYXNlIEROVFRfVFlQRV9NRU1FTlVNOgorCSAgICBjYXNlIEROVFRfVFlQRV9DT05TVDoKKwkgICAgICAvKiBDb25zdGFudHMgYW5kIG1lbWJlcnMgb2YgZW51bWVyYXRlZCB0eXBlcy4gICovCisJICAgICAgU0VUX05BTUVTVFJJTkcgKGRuX2J1ZnAsICZuYW1lc3RyaW5nLCBvYmpmaWxlKTsKKwkgICAgICBpZiAoIXBzdCkKKwkJeworCQkgIHBzdCA9IGhwcmVhZF9zdGFydF9wc3ltdGFiIChvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMsCisJCQkJCSAgICAgICJnbG9iYWxzIiwgMCwKKwkJCQkJICAgICAgKGhwX3N5bW51bQorCQkJCQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBkbnR0X3R5cGVfYmxvY2spKSwKKwkJCQkJICAgICAgb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLm5leHQsCisJCQkJCSAgICAgIG9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5uZXh0KTsKKwkJfQorCSAgICAgIGlmIChkbl9idWZwLT5kY29uc3QuZ2xvYmFsKQorCQlhZGRfcHN5bWJvbF90b19saXN0IChuYW1lc3RyaW5nLCBzdHJsZW4gKG5hbWVzdHJpbmcpLAorCQkJCSAgICAgVkFSX05BTUVTUEFDRSwgTE9DX0NPTlNULAorCQkJCSAgICAgJm9iamZpbGUtPmdsb2JhbF9wc3ltYm9scywgMCwKKwkJCQkgICAgIDAsIGxhbmd1YWdlX3Vua25vd24sIG9iamZpbGUpOworCSAgICAgIGVsc2UKKwkJYWRkX3BzeW1ib2xfdG9fbGlzdCAobmFtZXN0cmluZywgc3RybGVuIChuYW1lc3RyaW5nKSwKKwkJCQkgICAgIFZBUl9OQU1FU1BBQ0UsIExPQ19DT05TVCwKKwkJCQkgICAgICZvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMsIDAsCisJCQkJICAgICAwLCBsYW5ndWFnZV91bmtub3duLCBvYmpmaWxlKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogRW5kIGFueSBwZW5kaW5nIHBhcnRpYWwgc3ltYm9sIHRhYmxlLiAqLworICBpZiAocHN0KQorICAgIHsKKyAgICAgIGhwcmVhZF9lbmRfcHN5bXRhYiAocHN0LCBwc3ltdGFiX2luY2x1ZGVfbGlzdCwgaW5jbHVkZXNfdXNlZCwKKwkJCSAgaHBfc3ltbnVtICogc2l6ZW9mIChzdHJ1Y3QgZG50dF90eXBlX2Jsb2NrKSwKKwkJCSAgMCwgZGVwZW5kZW5jeV9saXN0LCBkZXBlbmRlbmNpZXNfdXNlZCk7CisgICAgfQorCisgIGRpc2NhcmRfY2xlYW51cHMgKG9sZF9jaGFpbik7Cit9CisKKy8qIFBlcmZvcm0gYW55IGxvY2FsIGNsZWFudXBzIHJlcXVpcmVkIHdoZW4gd2UgYXJlIGRvbmUgd2l0aCBhIHBhcnRpY3VsYXIKKyAgIG9iamZpbGUuICBJLkUsIHdlIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBkaXNjYXJkaW5nIGFsbCBzeW1ib2wgaW5mb3JtYXRpb24KKyAgIGZvciBhbiBvYmpmaWxlLCBmcmVlaW5nIHVwIGFsbCBtZW1vcnkgaGVsZCBmb3IgaXQsIGFuZCB1bmxpbmtpbmcgdGhlCisgICBvYmpmaWxlIHN0cnVjdCBmcm9tIHRoZSBnbG9iYWwgbGlzdCBvZiBrbm93biBvYmpmaWxlcy4gKi8KKwordm9pZAoraHByZWFkX3N5bWZpbGVfZmluaXNoIChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaWYgKG9iamZpbGUtPnN5bV9wcml2YXRlICE9IE5VTEwpCisgICAgeworICAgICAgbWZyZWUgKG9iamZpbGUtPm1kLCBvYmpmaWxlLT5zeW1fcHJpdmF0ZSk7CisgICAgfQorfQorDAorCisvKiBUaGUgcmVtYWluaW5nIGZ1bmN0aW9ucyBhcmUgYWxsIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gICovCisKKy8qIFZhcmlvdXMgc21hbGwgZnVuY3Rpb25zIHRvIGdldCBlbnRyaWVzIGluIHRoZSBkZWJ1ZyBzeW1ib2wgc2VjdGlvbnMuICAqLworCit1bmlvbiBkbnR0ZW50cnkgKgoraHByZWFkX2dldF9sbnR0IChpbmRleCwgb2JqZmlsZSkKKyAgICAgaW50IGluZGV4OworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgcmV0dXJuICh1bmlvbiBkbnR0ZW50cnkgKikKKyAgICAmKExOVFQgKG9iamZpbGUpWyhpbmRleCAqIHNpemVvZiAoc3RydWN0IGRudHRfdHlwZV9ibG9jaykpXSk7Cit9CisKK3N0YXRpYyB1bmlvbiBkbnR0ZW50cnkgKgoraHByZWFkX2dldF9nbnR0IChpbmRleCwgb2JqZmlsZSkKKyAgICAgaW50IGluZGV4OworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgcmV0dXJuICh1bmlvbiBkbnR0ZW50cnkgKikKKyAgICAmKEdOVFQgKG9iamZpbGUpWyhpbmRleCAqIHNpemVvZiAoc3RydWN0IGRudHRfdHlwZV9ibG9jaykpXSk7Cit9CisKK3VuaW9uIHNsdGVudHJ5ICoKK2hwcmVhZF9nZXRfc2x0IChpbmRleCwgb2JqZmlsZSkKKyAgICAgaW50IGluZGV4OworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgcmV0dXJuICh1bmlvbiBzbHRlbnRyeSAqKSAmKFNMVCAob2JqZmlsZSlbaW5kZXggKiBzaXplb2YgKHVuaW9uIHNsdGVudHJ5KV0pOworfQorCisvKiBHZXQgdGhlIGxvdyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCBzb21lIHN5bWJvbCAodHlwaWNhbGx5IHRoZSBzdGFydAorICAgb2YgYSBwYXJ0aWN1bGFyIHNvdXJjZSBmaWxlIG9yIG1vZHVsZSkuICBTaW5jZSB0aGF0IGluZm9ybWF0aW9uIGlzIG5vdAorICAgc3RvcmVkIGFzIHBhcnQgb2YgdGhlIEROVFRfVFlQRV9NT0RVTEUgb3IgRE5UVF9UWVBFX1NSQ0ZJTEUgc3ltYm9sIHdlIG11c3QgaW5mZXIgaXQgZnJvbQorICAgdGhlIGV4aXN0YW5jZSBvZiBETlRUX1RZUEVfRlVOQ1RJT04gc3ltYm9scy4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitocHJlYWRfZ2V0X3RleHRsb3cgKGdsb2JhbCwgaW5kZXgsIG9iamZpbGUsIHN5bWNvdW50KQorICAgICBpbnQgZ2xvYmFsOworICAgICBpbnQgaW5kZXg7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBpbnQgc3ltY291bnQ7Cit7CisgIHVuaW9uIGRudHRlbnRyeSAqZG5fYnVmcDsKKyAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sOworCisgIC8qIExvb2sgZm9yIGEgRE5UVF9UWVBFX0ZVTkNUSU9OIHN5bWJvbC4gICovCisgIGlmIChpbmRleCA8IHN5bWNvdW50KQkJLyogc3ltY291bnQgaXMgdGhlIG51bWJlciBvZiBzeW1ib2xzIGluICovCisgICAgewkJCQkvKiAgIHRoZSBkYmluZm8sIExOVFQgdGFibGUgKi8KKyAgICAgIGRvCisJeworCSAgaWYgKGdsb2JhbCkKKwkgICAgZG5fYnVmcCA9IGhwcmVhZF9nZXRfZ250dCAoaW5kZXgrKywgb2JqZmlsZSk7CisJICBlbHNlCisJICAgIGRuX2J1ZnAgPSBocHJlYWRfZ2V0X2xudHQgKGluZGV4KyssIG9iamZpbGUpOworCX0KKyAgICAgIHdoaWxlIChkbl9idWZwLT5kYmxvY2sua2luZCAhPSBETlRUX1RZUEVfRlVOQ1RJT04KKwkgICAgICYmIGRuX2J1ZnAtPmRibG9jay5raW5kICE9IEROVFRfVFlQRV9ET0NfRlVOQ1RJT04KKwkgICAgICYmIGRuX2J1ZnAtPmRibG9jay5raW5kICE9IEROVFRfVFlQRV9FTkQKKwkgICAgICYmIGluZGV4IDwgc3ltY291bnQpOworICAgIH0KKworICAvKiBBdm9pZCBnb2luZyBwYXN0IGEgRE5UVF9UWVBFX0VORCB3aGVuIGxvb2tpbmcgZm9yIGEgRE5UVF9UWVBFX0ZVTkNUSU9OLiAgVGhpcworICAgICBtaWdodCBoYXBwZW4gd2hlbiBhIHNvdXJjZWZpbGUgaGFzIG5vIGZ1bmN0aW9ucy4gICovCisgIGlmIChkbl9idWZwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfRU5EKQorICAgIHJldHVybiAwOworCisgIC8qIEF2b2lkIGdvaW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgTE5UVCBmaWxlICovCisgIGlmIChpbmRleCA9PSBzeW1jb3VudCkKKyAgICByZXR1cm4gMDsKKworICAvKiBUaGUgbWluaW1hbCBzeW1ib2xzIGFyZSB0eXBpY2FsbHkgbW9yZSBhY2N1cmF0ZSBmb3Igc29tZSByZWFzb24uICAqLworICBpZiAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX0ZVTkNUSU9OKQorICAgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKGRuX2J1ZnAtPmRmdW5jLm5hbWUgKyBWVCAob2JqZmlsZSksIE5VTEwsCisJCQkJICAgICBvYmpmaWxlKTsKKyAgZWxzZQkJCQkvKiBtdXN0IGJlIGEgRE5UVF9UWVBFX0RPQ19GVU5DVElPTiAqLworICAgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKGRuX2J1ZnAtPmRkb2NmdW5jLm5hbWUgKyBWVCAob2JqZmlsZSksIE5VTEwsCisJCQkJICAgICBvYmpmaWxlKTsKKworICBpZiAobXN5bWJvbCkKKyAgICByZXR1cm4gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpOworICBlbHNlCisgICAgcmV0dXJuIGRuX2J1ZnAtPmRmdW5jLmxvd2FkZHI7Cit9CisKKy8qIEFsbG9jYXRlIGFuZCBwYXJ0aWFsbHkgZmlsbCBhIHBhcnRpYWwgc3ltdGFiLiAgSXQgd2lsbCBiZQorICAgY29tcGxldGVseSBmaWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIGxpc3QuCisKKyAgIFNZTUZJTEVfTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sLWZpbGUgd2UgYXJlIHJlYWRpbmcgZnJvbSwgYW5kIEFERFIKKyAgIGlzIHRoZSBhZGRyZXNzIHJlbGF0aXZlIHRvIHdoaWNoIGl0cyBzeW1ib2xzIGFyZSAoaW5jcmVtZW50YWwpIG9yIDAKKyAgIChub3JtYWwpLiAqLworCitzdGF0aWMgc3RydWN0IHBhcnRpYWxfc3ltdGFiICoKK2hwcmVhZF9zdGFydF9wc3ltdGFiIChvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMsCisJCSAgICAgIGZpbGVuYW1lLCB0ZXh0bG93LCBsZHN5bW9mZiwgZ2xvYmFsX3N5bXMsIHN0YXRpY19zeW1zKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworICAgICBjaGFyICpmaWxlbmFtZTsKKyAgICAgQ09SRV9BRERSIHRleHRsb3c7CisgICAgIGludCBsZHN5bW9mZjsKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqZ2xvYmFsX3N5bXM7CisgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKnN0YXRpY19zeW1zOworeworICBpbnQgb2Zmc2V0ID0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCk7CisgIGV4dGVybiB2b2lkIGhwcmVhZF9wc3ltdGFiX3RvX3N5bXRhYiAoKTsKKyAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpyZXN1bHQgPQorICBzdGFydF9wc3ltdGFiX2NvbW1vbiAob2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzLAorCQkJZmlsZW5hbWUsIHRleHRsb3csIGdsb2JhbF9zeW1zLCBzdGF0aWNfc3ltcyk7CisKKyAgcmVzdWx0LT50ZXh0bG93ICs9IG9mZnNldDsKKyAgcmVzdWx0LT5yZWFkX3N5bXRhYl9wcml2YXRlID0gKGNoYXIgKikKKyAgICBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+cHN5bWJvbF9vYnN0YWNrLCBzaXplb2YgKHN0cnVjdCBzeW1sb2MpKTsKKyAgTERTWU1PRkYgKHJlc3VsdCkgPSBsZHN5bW9mZjsKKyAgcmVzdWx0LT5yZWFkX3N5bXRhYiA9IGhwcmVhZF9wc3ltdGFiX3RvX3N5bXRhYjsKKworICByZXR1cm4gcmVzdWx0OworfQorDAorCisvKiBDbG9zZSBvZmYgdGhlIGN1cnJlbnQgdXNhZ2Ugb2YgUFNULiAgCisgICBSZXR1cm5zIFBTVCBvciBOVUxMIGlmIHRoZSBwYXJ0aWFsIHN5bXRhYiB3YXMgZW1wdHkgYW5kIHRocm93biBhd2F5LgorCisgICBjYXBwaW5nX3N5bWJvbF9vZmZzZXQgIC0tQnl0ZSBpbmRleCBpbiBMTlRUIG9yIEdOVFQgb2YgdGhlCisgICBsYXN0IHN5bWJvbCBwcm9jZXNzZWQgZHVyaW5nIHRoZSBidWlsZAorICAgb2YgdGhlIHByZXZpb3VzIHBzdC4KKworICAgRklYTUU6ICBMaXN0IHZhcmlhYmxlcyBhbmQgcGVjdWxpYXJpdGllcyBvZiBzYW1lLiAgKi8KKworc3RhdGljIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqCitocHJlYWRfZW5kX3BzeW10YWIgKHBzdCwgaW5jbHVkZV9saXN0LCBudW1faW5jbHVkZXMsIGNhcHBpbmdfc3ltYm9sX29mZnNldCwKKwkJICAgIGNhcHBpbmdfdGV4dCwgZGVwZW5kZW5jeV9saXN0LCBudW1iZXJfZGVwZW5kZW5jaWVzKQorICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdDsKKyAgICAgY2hhciAqKmluY2x1ZGVfbGlzdDsKKyAgICAgaW50IG51bV9pbmNsdWRlczsKKyAgICAgaW50IGNhcHBpbmdfc3ltYm9sX29mZnNldDsKKyAgICAgQ09SRV9BRERSIGNhcHBpbmdfdGV4dDsKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICoqZGVwZW5kZW5jeV9saXN0OworICAgICBpbnQgbnVtYmVyX2RlcGVuZGVuY2llczsKK3sKKyAgaW50IGk7CisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlID0gcHN0LT5vYmpmaWxlOworICBpbnQgb2Zmc2V0ID0gQU5PRkZTRVQgKHBzdC0+c2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKTsKKworI2lmZGVmIERVTVBJTkcKKyAgLyogVHVybiBvbiB0byBzZWUgd2hhdCBraW5kIG9mIGEgcHN5bXRhYiB3ZSd2ZSBidWlsdC4gKi8KKyAgc3RhdGljIGludCBkdW1waW5nID0gMDsKKyNlbmRpZgorCisgIGlmIChjYXBwaW5nX3N5bWJvbF9vZmZzZXQgIT0gLTEpCisgICAgTERTWU1MRU4gKHBzdCkgPSBjYXBwaW5nX3N5bWJvbF9vZmZzZXQgLSBMRFNZTU9GRiAocHN0KTsKKyAgZWxzZQorICAgIExEU1lNTEVOIChwc3QpID0gMDsKKyAgcHN0LT50ZXh0aGlnaCA9IGNhcHBpbmdfdGV4dCArIG9mZnNldDsKKworICBwc3QtPm5fZ2xvYmFsX3N5bXMgPQorICAgIG9iamZpbGUtPmdsb2JhbF9wc3ltYm9scy5uZXh0IC0gKG9iamZpbGUtPmdsb2JhbF9wc3ltYm9scy5saXN0ICsgcHN0LT5nbG9iYWxzX29mZnNldCk7CisgIHBzdC0+bl9zdGF0aWNfc3ltcyA9CisgICAgb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLm5leHQgLSAob2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLmxpc3QgKyBwc3QtPnN0YXRpY3Nfb2Zmc2V0KTsKKworI2lmZGVmIERVTVBJTkcKKyAgaWYgKGR1bXBpbmcpCisgICAgeworICAgICAgcHJpbnRmICgiXG5Qc3QgJXMsIExEU1lNT0ZGICV4ICgleCksIExEU1lNTEVOICV4ICgleCksIGdsb2JhbHMgJWQsIHN0YXRpY3MgJWRcbiIsCisJICAgICAgcHN0LT5maWxlbmFtZSwKKwkgICAgICBMRFNZTU9GRiAocHN0KSwKKwkgICAgICBMRFNZTU9GRiAocHN0KSAvIHNpemVvZiAoc3RydWN0IGRudHRfdHlwZV9ibG9jayksCisJICAgICAgTERTWU1MRU4gKHBzdCksCisJICAgICAgTERTWU1MRU4gKHBzdCkgLyBzaXplb2YgKHN0cnVjdCBkbnR0X3R5cGVfYmxvY2spLAorCSAgICAgIHBzdC0+bl9nbG9iYWxfc3ltcywgcHN0LT5uX3N0YXRpY19zeW1zKTsKKyAgICB9CisjZW5kaWYKKworICBwc3QtPm51bWJlcl9vZl9kZXBlbmRlbmNpZXMgPSBudW1iZXJfZGVwZW5kZW5jaWVzOworICBpZiAobnVtYmVyX2RlcGVuZGVuY2llcykKKyAgICB7CisgICAgICBwc3QtPmRlcGVuZGVuY2llcyA9IChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKiopCisJb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnBzeW1ib2xfb2JzdGFjaywKKwkJICAgICAgIG51bWJlcl9kZXBlbmRlbmNpZXMgKiBzaXplb2YgKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSk7CisgICAgICBtZW1jcHkgKHBzdC0+ZGVwZW5kZW5jaWVzLCBkZXBlbmRlbmN5X2xpc3QsCisJICAgICAgbnVtYmVyX2RlcGVuZGVuY2llcyAqIHNpemVvZiAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKKyAgICB9CisgIGVsc2UKKyAgICBwc3QtPmRlcGVuZGVuY2llcyA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9pbmNsdWRlczsgaSsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqc3VicHN0ID0KKyAgICAgIGFsbG9jYXRlX3BzeW10YWIgKGluY2x1ZGVfbGlzdFtpXSwgb2JqZmlsZSk7CisKKyAgICAgIHN1YnBzdC0+c2VjdGlvbl9vZmZzZXRzID0gcHN0LT5zZWN0aW9uX29mZnNldHM7CisgICAgICBzdWJwc3QtPnJlYWRfc3ltdGFiX3ByaXZhdGUgPQorCShjaGFyICopIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5wc3ltYm9sX29ic3RhY2ssCisJCQkJc2l6ZW9mIChzdHJ1Y3Qgc3ltbG9jKSk7CisgICAgICBMRFNZTU9GRiAoc3VicHN0KSA9CisJTERTWU1MRU4gKHN1YnBzdCkgPQorCXN1YnBzdC0+dGV4dGxvdyA9CisJc3VicHN0LT50ZXh0aGlnaCA9IDA7CisKKyAgICAgIC8qIFdlIGNvdWxkIHNhdmUgc2xpZ2h0IGJpdHMgb2Ygc3BhY2UgYnkgb25seSBtYWtpbmcgb25lIG9mIHRoZXNlLAorICAgICAgICAgc2hhcmVkIGJ5IHRoZSBlbnRpcmUgc2V0IG9mIGluY2x1ZGUgZmlsZXMuICBGSVhNRS1zb21lZGF5LiAgKi8KKyAgICAgIHN1YnBzdC0+ZGVwZW5kZW5jaWVzID0gKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKikKKwlvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+cHN5bWJvbF9vYnN0YWNrLAorCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworICAgICAgc3VicHN0LT5kZXBlbmRlbmNpZXNbMF0gPSBwc3Q7CisgICAgICBzdWJwc3QtPm51bWJlcl9vZl9kZXBlbmRlbmNpZXMgPSAxOworCisgICAgICBzdWJwc3QtPmdsb2JhbHNfb2Zmc2V0ID0KKwlzdWJwc3QtPm5fZ2xvYmFsX3N5bXMgPQorCXN1YnBzdC0+c3RhdGljc19vZmZzZXQgPQorCXN1YnBzdC0+bl9zdGF0aWNfc3ltcyA9IDA7CisKKyAgICAgIHN1YnBzdC0+cmVhZGluID0gMDsKKyAgICAgIHN1YnBzdC0+c3ltdGFiID0gMDsKKyAgICAgIHN1YnBzdC0+cmVhZF9zeW10YWIgPSBwc3QtPnJlYWRfc3ltdGFiOworICAgIH0KKworICBzb3J0X3BzdF9zeW1ib2xzIChwc3QpOworCisgIC8qIElmIHRoZXJlIGlzIGFscmVhZHkgYSBwc3ltdGFiIG9yIHN5bXRhYiBmb3IgYSBmaWxlIG9mIHRoaXMgbmFtZSwgcmVtb3ZlIGl0LgorICAgICAoSWYgdGhlcmUgaXMgYSBzeW10YWIsIG1vcmUgZHJhc3RpYyB0aGluZ3MgYWxzbyBoYXBwZW4uKQorICAgICBUaGlzIGhhcHBlbnMgaW4gVnhXb3Jrcy4gICovCisgIGZyZWVfbmFtZWRfc3ltdGFicyAocHN0LT5maWxlbmFtZSk7CisKKyAgaWYgKG51bV9pbmNsdWRlcyA9PSAwCisgICAgICAmJiBudW1iZXJfZGVwZW5kZW5jaWVzID09IDAKKyAgICAgICYmIHBzdC0+bl9nbG9iYWxfc3ltcyA9PSAwCisgICAgICAmJiBwc3QtPm5fc3RhdGljX3N5bXMgPT0gMCkKKyAgICB7CisgICAgICAvKiBUaHJvdyBhd2F5IHRoaXMgcHN5bXRhYiwgaXQncyBlbXB0eS4gIFdlIGNhbid0IGRlYWxsb2NhdGUgaXQsIHNpbmNlCisgICAgICAgICBpdCBpcyBvbiB0aGUgb2JzdGFjaywgYnV0IHdlIGNhbiBmb3JnZXQgdG8gY2hhaW4gaXQgb24gdGhlIGxpc3QuIAorICAgICAgICAgRW1wdHkgcHN5bXRhYnMgaGFwcGVuIGFzIGEgcmVzdWx0IG9mIGhlYWRlciBmaWxlcyB3aGljaCBkb24ndCBoYXZlCisgICAgICAgICBhbnkgc3ltYm9scyBpbiB0aGVtLiAgVGhlcmUgY2FuIGJlIGEgbG90IG9mIHRoZW0uICBCdXQgdGhpcyBjaGVjaworICAgICAgICAgaXMgd3JvbmcsIGluIHRoYXQgYSBwc3ltdGFiIHdpdGggTl9TTElORSBlbnRyaWVzIGJ1dCBub3RoaW5nIGVsc2UKKyAgICAgICAgIGlzIG5vdCBlbXB0eSwgYnV0IHdlIGRvbid0IHJlYWxpemUgdGhhdC4gIEZpeGluZyB0aGF0IHdpdGhvdXQgc2xvd2luZworICAgICAgICAgdGhpbmdzIGRvd24gbWlnaHQgYmUgdHJpY2t5LgorICAgICAgICAgSXQncyBhbHNvIHdyb25nIGlmIHdlJ3JlIHVzaW5nIHRoZSBxdWljayBsb29rLXVwIHRhYmxlcywgYXMKKyAgICAgICAgIHdlIGNhbiBnZXQgZW1wdHkgcHN5bXRhYnMgZnJvbSBtb2R1bGVzIHdpdGggbm8gcm91dGluZXMgaW4KKyAgICAgICAgIHRoZW0uICovCisKKyAgICAgIGRpc2NhcmRfcHN5bXRhYiAocHN0KTsKKworICAgICAgLyogSW5kaWNhdGUgdGhhdCBwc3ltdGFiIHdhcyB0aHJvd24gYXdheS4gICovCisgICAgICBwc3QgPSAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopIE5VTEw7CisKKyAgICB9CisgIHJldHVybiBwc3Q7Cit9CisKKworLyogRW5kIG9mIGhwLXBzeW10YWItcmVhZC5jICovCisKKy8qIFNldCBpbmRlbnRhdGlvbiB0byA0IHNwYWNlcyBmb3IgRW1hY3M7IHRoaXMgZmlsZSBpcworICAgbW9zdGx5IG5vbi1HTlUtaXNoIGluIGl0cyBzdHlsZSA6LSggKi8KKyNpZiAwCisqKipMb2NhbCBWYXJpYWJsZXM6CisqKipjIC0gYmFzaWMgLSBvZmZzZXQ6NAorKioqIEVuZDoKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2dkYi9ocC1zeW10YWItcmVhZC5jIGIvZ2RiL2hwLXN5bXRhYi1yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBkNGExMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9ocC1zeW10YWItcmVhZC5jCkBAIC0wLDAgKzEsMzk4OCBAQAorLyogUmVhZCBocCBkZWJ1ZyBzeW1ib2xzIGFuZCBjb252ZXJ0IHRvIGludGVybmFsIGZvcm1hdCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTkzLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworICAgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKKyAgIGFuZCBieSBDeWdudXMgU3VwcG9ydC4gICovCisKKy8qIENvbW1vbiBpbmNsdWRlIGZvciBocC1zeW10YWItcmVhZC5jIGFuZCBocC1wc3ltdGFiLXJlYWQuYy4KKyAqIE5vdGUgdGhpcyBoYXMgbmVzdGVkIGluY2x1ZGVzIGZvciBhIGJ1bmNoIG9mIHN0dWZmLgorICovCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAiaHByZWFkLmgiCisjaW5jbHVkZSAiZGVtYW5nbGUuaCIKKyNpbmNsdWRlICJjb21wbGFpbnRzLmgiCisKKwwKKworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCAgaHByZWFkX3VuaGFuZGxlZF9lbmRfY29tbW9uX2NvbXBsYWludCA9Cit7CisgICJ1bmhhbmRsZWQgc3ltYm9sIGluIGhwLXN5bXRhYi1yZWFkLmM6IEROVFRfVFlQRV9DT01NT04vRE5UVF9UWVBFX0VORC5cbiIsIDAsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50ICBocHJlYWRfdW5oYW5kbGVkX3R5cGVfY29tcGxhaW50ID0KK3sKKyAgImhwcmVhZF90eXBlX3RyYW5zbGF0ZTogdW5oYW5kbGVkIHR5cGUgY29kZS4iLCAwLCAwCit9OworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCAgaHByZWFkX3N0cnVjdF9jb21wbGFpbnQgPQoreworICAiaHByZWFkX3JlYWRfc3RydWN0X3R5cGU6IGV4cGVjdGVkIFNWQVIgdHlwZS4uLiIsIDAsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGhwcmVhZF9hcnJheV9jb21wbGFpbnQgPQoreworICAiZXJyb3IgaW4gaHByZWFkX2FycmF5X3R5cGUuIiwgMCwgMAorfTsKKworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgIGhwcmVhZF90eXBlX2xvb2t1cF9jb21wbGFpbnQgPQoreworICAiZXJyb3IgaW4gaHByZWFkX3R5cGVfbG9va3VwKCkuIiwgMCwgMAorfTsKKworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCAgaHByZWFkX3VuZXhwZWN0ZWRfZW5kX2NvbXBsYWludCA9Cit7CisgICJpbnRlcm5hbCBlcnJvciBpbiBocC1zeW10YWItcmVhZC5jOiBVbmV4cGVjdGVkIEROVFRfVFlQRV9FTkQga2luZC4iLCAwLCAwCit9OworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCBocHJlYWRfdGFnZGVmX2NvbXBsYWludCAgPQoreworICAiZXJyb3IgcHJvY2Vzc2luZyBjbGFzcyB0YWdkZWYiLCAwLCAwCit9OworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCAgaHByZWFkX3VuaGFuZGxlZF9jb21tb25fY29tcGxhaW50ID0KK3sKKyAgInVuaGFuZGxlZCBzeW1ib2wgaW4gaHAtc3ltdGFiLXJlYWQuYzogRE5UVF9UWVBFX0NPTU1PTi4iLCAwLCAwCit9OworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCAgaHByZWFkX3VuaGFuZGxlZF9ibG9ja2RhdGFfY29tcGxhaW50ID0KK3sKKyAgInVuaGFuZGxlZCBzeW1ib2wgaW4gaHAtc3ltdGFiLXJlYWQuYzogRE5UVF9UWVBFX0JMT0NLREFUQS4iLCAwLCAwCit9OworCisKKy8qIEZvcndhcmQgcHJvY2VkdXJlIGRlY2xhcmF0aW9ucyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBocHJlYWRfZ2V0X3Njb3BlX3N0YXJ0CisgIFBBUkFNUyAoKHNsdHBvaW50ZXIsIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHByZWFkX2dldF9saW5lCisgIFBBUkFNUyAoKHNsdHBvaW50ZXIsIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIENPUkVfQUREUiBocHJlYWRfZ2V0X2xvY2F0aW9uCisgIFBBUkFNUyAoKHNsdHBvaW50ZXIsIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQgaHByZWFkX3BzeW10YWJfdG9fc3ltdGFiXzEgCisgIFBBUkFNUyAoKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSk7CisKK3ZvaWQgaHByZWFkX3BzeW10YWJfdG9fc3ltdGFiIAorICBQQVJBTVMgKChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworCitzdGF0aWMgc3RydWN0IHN5bXRhYiAqaHByZWFkX2V4cGFuZF9zeW10YWIKKyAgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgaW50LCBpbnQsIENPUkVfQUREUiwgaW50LAorCSAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKiwgY2hhciAqKSk7CisKK3N0YXRpYyBpbnQgaHByZWFkX3R5cGVfdHJhbnNsYXRlIAorICBQQVJBTVMgKChkbnR0cG9pbnRlcikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKipocHJlYWRfbG9va3VwX3R5cGUKKyAgUEFSQU1TICgoZG50dHBvaW50ZXIsIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICpocHJlYWRfYWxsb2NfdHlwZQorICBQQVJBTVMgKChkbnR0cG9pbnRlciwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKmhwcmVhZF9yZWFkX2VudW1fdHlwZQorICBQQVJBTVMgKChkbnR0cG9pbnRlciwgdW5pb24gZG50dGVudHJ5ICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICpocHJlYWRfcmVhZF9mdW5jdGlvbl90eXBlCisgIFBBUkFNUyAoKGRudHRwb2ludGVyLCB1bmlvbiBkbnR0ZW50cnkgKiwgc3RydWN0IG9iamZpbGUgKiwgaW50KSk7CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqaHByZWFkX3JlYWRfZG9jX2Z1bmN0aW9uX3R5cGUKKyAgUEFSQU1TICgoZG50dHBvaW50ZXIsIHVuaW9uIGRudHRlbnRyeSAqLCBzdHJ1Y3Qgb2JqZmlsZSAqLCBpbnQpKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICpocHJlYWRfcmVhZF9zdHJ1Y3RfdHlwZQorICBQQVJBTVMgKChkbnR0cG9pbnRlciwgdW5pb24gZG50dGVudHJ5ICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICpocHJlYWRfZ2V0X250aF90ZW1wbGF0ZV9hcmcKKyAgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgaW50KSk7CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqIGhwcmVhZF9yZWFkX3RlbXBsX2FyZ190eXBlIAorICBQQVJBTVMgKChkbnR0cG9pbnRlciwgdW5pb24gZG50dGVudHJ5ICosIHN0cnVjdCBvYmpmaWxlICosIGNoYXIgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKmhwcmVhZF9yZWFkX3NldF90eXBlCisgIFBBUkFNUyAoKGRudHRwb2ludGVyLCB1bmlvbiBkbnR0ZW50cnkgKiwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKiBocHJlYWRfcmVhZF9hcnJheV90eXBlIAorICBQQVJBTVMgKChkbnR0cG9pbnRlciwgdW5pb24gZG50dGVudHJ5ICpkbl9idWZwLCBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSkpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKmhwcmVhZF9yZWFkX3N1YnJhbmdlX3R5cGUKKyAgUEFSQU1TICgoZG50dHBvaW50ZXIsIHVuaW9uIGRudHRlbnRyeSAqLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqIGhwcmVhZF90eXBlX2xvb2t1cAorICBQQVJBTVMgKChkbnR0cG9pbnRlciwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgc2x0cG9pbnRlciBocHJlYWRfcmVjb3JkX2xpbmVzCisgIFBBUkFNUyAoKHN0cnVjdCBzdWJmaWxlICosIHNsdHBvaW50ZXIsIHNsdHBvaW50ZXIsCisJICAgc3RydWN0IG9iamZpbGUgKiwgQ09SRV9BRERSKSk7CisKK3N0YXRpYyB2b2lkIGhwcmVhZF9wcm9jZXNzX29uZV9kZWJ1Z19zeW1ib2wKKyAgUEFSQU1TICgodW5pb24gZG50dGVudHJ5ICosIGNoYXIgKiwgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqLAorCSAgIHN0cnVjdCBvYmpmaWxlICosIENPUkVfQUREUiwgaW50LCBjaGFyICosIGludCwgaW50ICogKSk7CisKK3N0YXRpYyBpbnQgaHByZWFkX2dldF9zY29wZV9kZXB0aAorICBQQVJBTVMgKCh1bmlvbiBkbnR0ZW50cnkgKiwgc3RydWN0IG9iamZpbGUgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGZpeF9zdGF0aWNfbWVtYmVyX3BoeXNuYW1lcyAKKyAgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkIGZpeHVwX2NsYXNzX21ldGhvZF90eXBlCisgIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIHN0cnVjdCB0eXBlICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQgaHByZWFkX2FkanVzdF9iaXRvZmZzZXRzIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIGludCkpOworCitzdGF0aWMgZG50dHBvaW50ZXIgaHByZWFkX2dldF9uZXh0X3NraXBfb3Zlcl9hbm9uX3VuaW9ucworICBQQVJBTVMgKChpbnQsIGRudHRwb2ludGVyLCB1bmlvbiBkbnR0ZW50cnkgKiosIHN0cnVjdCBvYmpmaWxlICopKTsKKworLyogR2xvYmFsIHRvIGluZGljYXRlIHByZXNlbmNlIG9mIEhQLWNvbXBpbGVkIG9iamVjdHMsCisgICBpbiBwYXJ0aWN1bGFyLCBTT00gZXhlY3V0YWJsZSBmaWxlIHdpdGggU09NIGRlYnVnIGluZm8gCisgICBEZWZpbmVkIGluIHN5bXRhYi5jLCB1c2VkIGluIGhwcGEtdGRlcC5jLiAqLyAKK2V4dGVybiBpbnQgaHBfc29tX3NvbV9vYmplY3RfcHJlc2VudDsKKworLyogU3RhdGljIHVzZWQgdG8gaW5kaWNhdGUgYSBjbGFzcyB0eXBlIHRoYXQgcmVxdWlyZXMgYQorICAgZml4LXVwIG9mIG9uZSBvZiBpdHMgbWV0aG9kIHR5cGVzICovCitzdGF0aWMgc3RydWN0IHR5cGUgKiBmaXh1cF9jbGFzcyA9IE5VTEw7CisKKy8qIFN0YXRpYyB1c2VkIHRvIGluZGljYXRlIHRoZSBtZXRob2QgdHlwZSB0aGF0IGlzIHRvIGJlCisgICB1c2VkIHRvIGZpeC11cCB0aGUgdHlwZSBmb3IgZml4dXBfY2xhc3MgKi8KK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqIGZpeHVwX21ldGhvZCA9IE5VTEw7CisKKwwKKworLyogR2V0IHRoZSBuZXN0aW5nIGRlcHRoIGZvciB0aGUgc291cmNlIGxpbmUgaWRlbnRpZmllZCBieSBJTkRFWC4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitocHJlYWRfZ2V0X3Njb3BlX3N0YXJ0IChpbmRleCwgb2JqZmlsZSkKKyAgICAgc2x0cG9pbnRlciBpbmRleDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHVuaW9uIHNsdGVudHJ5ICpzbF9idWZwOworCisgIHNsX2J1ZnAgPSBocHJlYWRfZ2V0X3NsdCAoaW5kZXgsIG9iamZpbGUpOworICByZXR1cm4gc2xfYnVmcC0+c3NwZWMuYmFja3B0ci5kbnR0cC5pbmRleDsKK30KKworLyogR2V0IHRoZSBzb3VyY2UgbGluZSBudW1iZXIgdGhlIHRoZSBsaW5lIGlkZW50aWZpZWQgYnkgSU5ERVguICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworaHByZWFkX2dldF9saW5lIChpbmRleCwgb2JqZmlsZSkKKyAgICAgc2x0cG9pbnRlciBpbmRleDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHVuaW9uIHNsdGVudHJ5ICpzbF9idWZwOworCisgIHNsX2J1ZnAgPSBocHJlYWRfZ2V0X3NsdCAoaW5kZXgsIG9iamZpbGUpOworICByZXR1cm4gc2xfYnVmcC0+c25vcm0ubGluZTsKK30KKworLyogRmluZCB0aGUgY29kZSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHNsdHBvaW50ZXIgKi8KKworc3RhdGljIENPUkVfQUREUgoraHByZWFkX2dldF9sb2NhdGlvbiAoaW5kZXgsIG9iamZpbGUpCisgICAgIHNsdHBvaW50ZXIgaW5kZXg7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICB1bmlvbiBzbHRlbnRyeSAqc2xfYnVmcDsKKyAgaW50IGk7CisKKyAgLyogY29kZSBsb2NhdGlvbiBvZiBzcGVjaWFsIHNsdGVudHJ5cyBpcyBkZXRlcm1pbmVkIGZyb20gY29udGV4dCAqLworICBzbF9idWZwID0gaHByZWFkX2dldF9zbHQgKGluZGV4LCBvYmpmaWxlKTsKKworICBpZiAoc2xfYnVmcC0+c25vcm0uc2x0ZGVzYyA9PSBTTFRfRU5EKQorICAgIHsKKyAgICAgIC8qIGZpbmQgcHJldmlvdXMgbm9ybWFsIHNsdGVudHJ5IGFuZCBnZXQgYWRkcmVzcyAqLworICAgICAgZm9yIChpID0gMDsgKChzbF9idWZwLT5zbm9ybS5zbHRkZXNjICE9IFNMVF9OT1JNQUwpICYmCisgICAgICAgICAgICAgICAgICAgKHNsX2J1ZnAtPnNub3JtLnNsdGRlc2MgIT0gU0xUX05PUk1BTF9PRkZTRVQpICYmCisJCSAgIChzbF9idWZwLT5zbm9ybS5zbHRkZXNjICE9IFNMVF9FWElUKSk7IGkrKykKKwlzbF9idWZwID0gaHByZWFkX2dldF9zbHQgKGluZGV4IC0gaSwgb2JqZmlsZSk7CisgICAgICBpZiAoc2xfYnVmcC0+c25vcm0uc2x0ZGVzYyA9PSBTTFRfTk9STUFMX09GRlNFVCkKKyAgICAgICAgcmV0dXJuIHNsX2J1ZnAtPnNub3Jtb2ZmLmFkZHJlc3M7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBzbF9idWZwLT5zbm9ybS5hZGRyZXNzOworICAgIH0KKworICAvKiBmaW5kIG5leHQgbm9ybWFsIHNsdGVudHJ5IGFuZCBnZXQgYWRkcmVzcyAqLworICBmb3IgKGkgPSAwOyAoKHNsX2J1ZnAtPnNub3JtLnNsdGRlc2MgIT0gU0xUX05PUk1BTCkgJiYKKwkgICAgICAgKHNsX2J1ZnAtPnNub3JtLnNsdGRlc2MgIT0gU0xUX05PUk1BTF9PRkZTRVQpICYmCisgICAgICAgICAgICAgICAoc2xfYnVmcC0+c25vcm0uc2x0ZGVzYyAhPSBTTFRfRVhJVCkpOyBpKyspCisgICAgc2xfYnVmcCA9IGhwcmVhZF9nZXRfc2x0IChpbmRleCArIGksIG9iamZpbGUpOworICAgICAgaWYgKHNsX2J1ZnAtPnNub3JtLnNsdGRlc2MgPT0gU0xUX05PUk1BTF9PRkZTRVQpCisgICAgICAgIHJldHVybiBzbF9idWZwLT5zbm9ybW9mZi5hZGRyZXNzOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gc2xfYnVmcC0+c25vcm0uYWRkcmVzczsKK30KKwwKKworLyogUmV0dXJuIDEgaWYgYW4gSFAgZGVidWcgc3ltYm9sIG9mIHR5cGUgS0lORCBoYXMgYSBuYW1lIGFzc29jaWF0ZWQgd2l0aAorICogaXQsIGVsc2UgcmV0dXJuIDAuIChUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjdXJyZW50bHkgdXNlZCwgYnV0IEknbGwKKyAqIGxlYXZlIGl0IGhlcmUgaW4gY2FzZSBpdCBwcm92ZXMgdXNlZnVsIGxhdGVyIG9uLiAtIFJUKS4KKyAqLworCitpbnQKK2hwcmVhZF9oYXNfbmFtZSAoa2luZCkKKyAgICAgZW51bSBkbnR0X2VudHJ5X3R5cGUga2luZDsKK3sKKyAgc3dpdGNoIChraW5kKQorICAgIHsKKyAgICBjYXNlIEROVFRfVFlQRV9TUkNGSUxFOgorICAgIGNhc2UgRE5UVF9UWVBFX01PRFVMRToKKyAgICBjYXNlIEROVFRfVFlQRV9GVU5DVElPTjoKKyAgICBjYXNlIEROVFRfVFlQRV9ET0NfRlVOQ1RJT046CisgICAgY2FzZSBETlRUX1RZUEVfRU5UUlk6CisgICAgY2FzZSBETlRUX1RZUEVfSU1QT1JUOgorICAgIGNhc2UgRE5UVF9UWVBFX0xBQkVMOgorICAgIGNhc2UgRE5UVF9UWVBFX0ZQQVJBTToKKyAgICBjYXNlIEROVFRfVFlQRV9TVkFSOgorICAgIGNhc2UgRE5UVF9UWVBFX0RWQVI6CisgICAgY2FzZSBETlRUX1RZUEVfQ09OU1Q6CisgICAgY2FzZSBETlRUX1RZUEVfVFlQRURFRjoKKyAgICBjYXNlIEROVFRfVFlQRV9UQUdERUY6CisgICAgY2FzZSBETlRUX1RZUEVfTUVNRU5VTToKKyAgICBjYXNlIEROVFRfVFlQRV9GSUVMRDoKKyAgICBjYXNlIEROVFRfVFlQRV9TQToKKyAgICBjYXNlIEROVFRfVFlQRV9CTE9DS0RBVEE6CisgICAgY2FzZSBETlRUX1RZUEVfTUVNRlVOQzoKKyAgICBjYXNlIEROVFRfVFlQRV9ET0NfTUVNRlVOQzoKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBETlRUX1RZUEVfQkVHSU46CisgICAgY2FzZSBETlRUX1RZUEVfRU5EOgorICAgIGNhc2UgRE5UVF9UWVBFX1BPSU5URVI6CisgICAgY2FzZSBETlRUX1RZUEVfRU5VTToKKyAgICBjYXNlIEROVFRfVFlQRV9TRVQ6CisgICAgY2FzZSBETlRUX1RZUEVfQVJSQVk6CisgICAgY2FzZSBETlRUX1RZUEVfU1RSVUNUOgorICAgIGNhc2UgRE5UVF9UWVBFX1VOSU9OOgorICAgIGNhc2UgRE5UVF9UWVBFX1ZBUklBTlQ6CisgICAgY2FzZSBETlRUX1RZUEVfRklMRToKKyAgICBjYXNlIEROVFRfVFlQRV9GVU5DVFlQRToKKyAgICBjYXNlIEROVFRfVFlQRV9TVUJSQU5HRToKKyAgICBjYXNlIEROVFRfVFlQRV9XSVRIOgorICAgIGNhc2UgRE5UVF9UWVBFX0NPTU1PTjoKKyAgICBjYXNlIEROVFRfVFlQRV9DT0JTVFJVQ1Q6CisgICAgY2FzZSBETlRUX1RZUEVfWFJFRjoKKyAgICBjYXNlIEROVFRfVFlQRV9NQUNSTzoKKyAgICBjYXNlIEROVFRfVFlQRV9DTEFTU19TQ09QRToKKyAgICBjYXNlIEROVFRfVFlQRV9SRUZFUkVOQ0U6CisgICAgY2FzZSBETlRUX1RZUEVfUFRSTUVNOgorICAgIGNhc2UgRE5UVF9UWVBFX1BUUk1FTUZVTkM6CisgICAgY2FzZSBETlRUX1RZUEVfQ0xBU1M6CisgICAgY2FzZSBETlRUX1RZUEVfR0VORklFTEQ6CisgICAgY2FzZSBETlRUX1RZUEVfVkZVTkM6CisgICAgY2FzZSBETlRUX1RZUEVfTUVNQUNDRVNTOgorICAgIGNhc2UgRE5UVF9UWVBFX0lOSEVSSVRBTkNFOgorICAgIGNhc2UgRE5UVF9UWVBFX0ZSSUVORF9DTEFTUzoKKyAgICBjYXNlIEROVFRfVFlQRV9GUklFTkRfRlVOQzoKKyAgICBjYXNlIEROVFRfVFlQRV9NT0RJRklFUjogCisgICAgY2FzZSBETlRUX1RZUEVfT0JKRUNUX0lEOgorICAgIGNhc2UgRE5UVF9UWVBFX1RFTVBMQVRFOgorICAgIGNhc2UgRE5UVF9UWVBFX1RFTVBMQVRFX0FSRzoKKyAgICBjYXNlIEROVFRfVFlQRV9GVU5DX1RFTVBMQVRFOgorICAgIGNhc2UgRE5UVF9UWVBFX0xJTks6CisgICAgLyogRE5UVF9UWVBFX0RZTl9BUlJBWV9ERVNDID8gKi8KKyAgICAvKiBETlRUX1RZUEVfREVTQ19TVUJSQU5HRSA/ICovCisgICAgLyogRE5UVF9UWVBFX0JFR0lOX0VYVCA/ICovCisgICAgLyogRE5UVF9UWVBFX0lOTE4gPyAqLworICAgIC8qIEROVFRfVFlQRV9JTkxOX0xJU1QgPyAqLworICAgIC8qIEROVFRfVFlQRV9BTElBUyA/ICovCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyogRG8gdGhlIGRpcnR5IHdvcmsgb2YgcmVhZGluZyBpbiB0aGUgZnVsbCBzeW1ib2wgZnJvbSBhIHBhcnRpYWwgc3ltYm9sCisgICB0YWJsZS4gICovCisKK3N0YXRpYyB2b2lkCitocHJlYWRfcHN5bXRhYl90b19zeW10YWJfMSAocHN0KQorICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdDsKK3sKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKyAgaW50IGk7CisKKyAgLyogR2V0IG91dCBxdWljayBpZiBwYXNzZWQganVuay4gICovCisgIGlmICghcHN0KQorICAgIHJldHVybjsKKworICAvKiBDb21wbGFpbiBpZiB3ZSd2ZSBhbHJlYWR5IHJlYWQgaW4gdGhpcyBzeW1ib2wgdGFibGUuICAqLworICBpZiAocHN0LT5yZWFkaW4pCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUHN5bXRhYiBmb3IgJXMgYWxyZWFkeSByZWFkIGluLiAgU2hvdWxkbid0IGhhcHBlbi5cbiIsCisJICAgICAgIHBzdC0+ZmlsZW5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBSZWFkIGluIGFsbCBwYXJ0aWFsIHN5bXRhYnMgb24gd2hpY2ggdGhpcyBvbmUgaXMgZGVwZW5kZW50ICovCisgIGZvciAoaSA9IDA7IGkgPCBwc3QtPm51bWJlcl9vZl9kZXBlbmRlbmNpZXM7IGkrKykKKyAgICBpZiAoIXBzdC0+ZGVwZW5kZW5jaWVzW2ldLT5yZWFkaW4pCisgICAgICB7CisJLyogSW5mb3JtIGFib3V0IGFkZGl0aW9uYWwgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIHJlYWQgaW4uICAqLworCWlmIChpbmZvX3ZlcmJvc2UpCisJICB7CisJICAgIGZwdXRzX2ZpbHRlcmVkICgiICIsIGdkYl9zdGRvdXQpOworCSAgICB3cmFwX2hlcmUgKCIiKTsKKwkgICAgZnB1dHNfZmlsdGVyZWQgKCJhbmQgIiwgZ2RiX3N0ZG91dCk7CisJICAgIHdyYXBfaGVyZSAoIiIpOworCSAgICBwcmludGZfZmlsdGVyZWQgKCIlcy4uLiIsIHBzdC0+ZGVwZW5kZW5jaWVzW2ldLT5maWxlbmFtZSk7CisJICAgIHdyYXBfaGVyZSAoIiIpOwkvKiBGbHVzaCBvdXRwdXQgKi8KKwkgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwkgIH0KKwlocHJlYWRfcHN5bXRhYl90b19zeW10YWJfMSAocHN0LT5kZXBlbmRlbmNpZXNbaV0pOworICAgICAgfQorCisgIC8qIElmIGl0J3MgcmVhbC4uLiAgKi8KKyAgaWYgKExEU1lNTEVOIChwc3QpKQorICAgIHsKKyAgICAgIC8qIEluaXQgc3R1ZmYgbmVjZXNzYXJ5IGZvciByZWFkaW5nIGluIHN5bWJvbHMgKi8KKyAgICAgIGJ1aWxkc3ltX2luaXQgKCk7CisgICAgICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKHJlYWxseV9mcmVlX3BlbmRpbmdzLCAwKTsKKworICAgICAgcHN0LT5zeW10YWIgPQorCWhwcmVhZF9leHBhbmRfc3ltdGFiIChwc3QtPm9iamZpbGUsIExEU1lNT0ZGIChwc3QpLCBMRFNZTUxFTiAocHN0KSwKKwkJCSAgICAgIHBzdC0+dGV4dGxvdywgcHN0LT50ZXh0aGlnaCAtIHBzdC0+dGV4dGxvdywKKwkJCSAgICAgIHBzdC0+c2VjdGlvbl9vZmZzZXRzLCBwc3QtPmZpbGVuYW1lKTsKKyAgICAgIHNvcnRfc3ltdGFiX3N5bXMgKHBzdC0+c3ltdGFiKTsKKworICAgICAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisgICAgfQorCisgIHBzdC0+cmVhZGluID0gMTsKK30KKworLyogUmVhZCBpbiBhbGwgb2YgdGhlIHN5bWJvbHMgZm9yIGEgZ2l2ZW4gcHN5bXRhYiBmb3IgcmVhbC4KKyAgIEJlIHZlcmJvc2UgYWJvdXQgaXQgaWYgdGhlIHVzZXIgd2FudHMgdGhhdC4gICovCisKK3ZvaWQKK2hwcmVhZF9wc3ltdGFiX3RvX3N5bXRhYiAocHN0KQorICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdDsKK3sKKyAgLyogR2V0IG91dCBxdWljayBpZiBnaXZlbiBqdW5rLiAgKi8KKyAgaWYgKCFwc3QpCisgICAgcmV0dXJuOworCisgIC8qIFNhbml0eSBjaGVjay4gICovCisgIGlmIChwc3QtPnJlYWRpbikKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJQc3ltdGFiIGZvciAlcyBhbHJlYWR5IHJlYWQgaW4uICBTaG91bGRuJ3QgaGFwcGVuLlxuIiwKKwkgICAgICAgcHN0LT5maWxlbmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIGVsejogc2V0dGluZyB0aGUgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb2RlIG9mIHRoZSB0YXJnZXQKKyAgICAgd2FzIGNvbXBpbGVkIHVzaW5nIGFuIEhQIGNvbXBpbGVyIChhQ0MsIGNjKSAKKyAgICAgdGhlIHByb2Nlc3NpbmdfYWNjX2NvbXBpbGF0aW9uIHZhcmlhYmxlIGlzIGRlY2xhcmVkIGluIHRoZSAKKyAgICAgZmlsZSBidWlsZHN5bS5oLCB0aGUgSFBfQ09NUElMRURfVEFSR0VUIGlzIGRlZmluZWQgdG8gYmUgZXF1YWwKKyAgICAgdG8gMyBpbiB0aGUgZmlsZSB0bV9ocHBhLmgqLworCisgIHByb2Nlc3NpbmdfZ2NjX2NvbXBpbGF0aW9uID0gMDsKKworICBpZiAoTERTWU1MRU4gKHBzdCkgfHwgcHN0LT5udW1iZXJfb2ZfZGVwZW5kZW5jaWVzKQorICAgIHsKKyAgICAgIC8qIFByaW50IHRoZSBtZXNzYWdlIG5vdywgYmVmb3JlIHJlYWRpbmcgdGhlIHN0cmluZyB0YWJsZSwKKyAgICAgICAgIHRvIGF2b2lkIGRpc2NvbmNlcnRpbmcgcGF1c2VzLiAgKi8KKyAgICAgIGlmIChpbmZvX3ZlcmJvc2UpCisJeworCSAgcHJpbnRmX2ZpbHRlcmVkICgiUmVhZGluZyBpbiBzeW1ib2xzIGZvciAlcy4uLiIsIHBzdC0+ZmlsZW5hbWUpOworCSAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwl9CisKKyAgICAgIGhwcmVhZF9wc3ltdGFiX3RvX3N5bXRhYl8xIChwc3QpOworCisgICAgICAvKiBNYXRjaCB3aXRoIGdsb2JhbCBzeW1ib2xzLiAgVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgb25jZSwKKyAgICAgICAgIGFmdGVyIGFsbCBvZiB0aGUgc3ltdGFicyBhbmQgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiByZWFkIGluLiAgICovCisgICAgICBzY2FuX2ZpbGVfZ2xvYmFscyAocHN0LT5vYmpmaWxlKTsKKworICAgICAgLyogRmluaXNoIHVwIHRoZSBkZWJ1ZyBlcnJvciBtZXNzYWdlLiAgKi8KKyAgICAgIGlmIChpbmZvX3ZlcmJvc2UpCisJcHJpbnRmX2ZpbHRlcmVkICgiZG9uZS5cbiIpOworICAgIH0KK30KKworLyogUmVhZCBpbiBhIGRlZmluZWQgc2VjdGlvbiBvZiBhIHNwZWNpZmljIG9iamVjdCBmaWxlJ3Mgc3ltYm9scy4KKworICAgREVTQyBpcyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZSwgcG9zaXRpb25lZCBhdCB0aGUKKyAgIGJlZ2lubmluZyBvZiB0aGUgc3ltdGFiCisgICBTWU1fT0ZGU0VUIGlzIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBmaWxlIG9mCisgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzeW1ib2xzIHdlIHdhbnQgdG8gcmVhZAorICAgU1lNX1NJWkUgaXMgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCBpbmZvIHRvIHJlYWQgaW4uCisgICBURVhUX09GRlNFVCBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0IHNlZ21lbnQgd2UgYXJlIHJlYWRpbmcgc3ltYm9scyBmb3IKKyAgIFRFWFRfU0laRSBpcyB0aGUgc2l6ZSBvZiB0aGUgdGV4dCBzZWdtZW50IHJlYWQgaW4uCisgICBTRUNUSU9OX09GRlNFVFMgYXJlIHRoZSByZWxvY2F0aW9uIG9mZnNldHMgd2hpY2ggZ2V0IGFkZGVkIHRvIGVhY2ggc3ltYm9sLiAqLworCitzdGF0aWMgc3RydWN0IHN5bXRhYiAqCitocHJlYWRfZXhwYW5kX3N5bXRhYiAob2JqZmlsZSwgc3ltX29mZnNldCwgc3ltX3NpemUsIHRleHRfb2Zmc2V0LCB0ZXh0X3NpemUsCisJCSAgICAgIHNlY3Rpb25fb2Zmc2V0cywgZmlsZW5hbWUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBpbnQgc3ltX29mZnNldDsKKyAgICAgaW50IHN5bV9zaXplOworICAgICBDT1JFX0FERFIgdGV4dF9vZmZzZXQ7CisgICAgIGludCB0ZXh0X3NpemU7CisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKyAgICAgY2hhciAqZmlsZW5hbWU7Cit7CisgIGNoYXIgICAgICAgICAgICAqbmFtZXN0cmluZzsKKyAgdW5pb24gZG50dGVudHJ5ICpkbl9idWZwOworICB1bnNpZ25lZCAgICAgICAgIG1heF9zeW1udW07CisgIGludCAgICAgICAgICAgICAgYXRfbW9kdWxlX2JvdW5kYXJ5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAvKiAxID0+IGF0IGVuZCwgLTEgPT4gYXQgYmVnaW5uaW5nICovIAorCisgIGludCBzeW1faW5kZXggPSBzeW1fb2Zmc2V0IC8gc2l6ZW9mIChzdHJ1Y3QgZG50dF90eXBlX2Jsb2NrKTsKKworICBjdXJyZW50X29iamZpbGUgPSBvYmpmaWxlOworICBzdWJmaWxlX3N0YWNrID0gMDsKKworICBsYXN0X3NvdXJjZV9maWxlID0gMDsKKworICAvKiBEZW1hbmdsaW5nIHN0eWxlIC0tIGlmIEVERyBzdHlsZSBhbHJlYWR5IHNldCwgZG9uJ3QgY2hhbmdlIGl0LAorICAgICBhcyBIUCBzdHlsZSBjYXVzZXMgc29tZSBwcm9ibGVtcyB3aXRoIHRoZSBLQUkgRURHIGNvbXBpbGVyICovIAorICBpZiAoY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlICE9IGVkZ19kZW1hbmdsaW5nKSB7CisgICAgLyogT3RoZXJ3aXNlLCBlbnN1cmUgdGhhdCB3ZSBhcmUgdXNpbmcgSFAgc3R5bGUgZGVtYW5nbGluZyAqLyAKKyAgICBzZXRfZGVtYW5nbGluZ19zdHlsZSAoSFBfREVNQU5HTElOR19TVFlMRV9TVFJJTkcpOworICB9CisKKyAgZG5fYnVmcCA9IGhwcmVhZF9nZXRfbG50dCAoc3ltX2luZGV4LCBvYmpmaWxlKTsKKyAgaWYgKCEoKGRuX2J1ZnAtPmRibG9jay5raW5kID09ICh1bnNpZ25lZCBjaGFyKSBETlRUX1RZUEVfU1JDRklMRSkgfHwKKwkoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gKHVuc2lnbmVkIGNoYXIpIEROVFRfVFlQRV9NT0RVTEUpKSkKKyAgICB7CisgICAgICBzdGFydF9zeW10YWIgKCJnbG9iYWxzIiwgTlVMTCwgMCk7CisgICAgICByZWNvcmRfZGVidWdmb3JtYXQgKCJIUCIpOworICAgIH0KKworICAvKiBUaGUgcHN5bXRhYiBidWlsZGVyIChocC1wc3ltdGFiLXJlYWQuYykgaXMgdGhlIG9uZSB0aGF0CisgICAqIGRldGVybWluZWQgdGhlICJzeW1fc2l6ZSIgYXJndW1lbnQgKGkuZS4gaG93IG1hbnkgRE5UVCBzeW1ib2xzCisgICAqIGFyZSBpbiB0aGlzIHN5bXRhYiksIHdoaWNoIHdlIHVzZSB0byBjb21wdXRlICJtYXhfc3ltbnVtIgorICAgKiAocG9pbnQgaW4gRE5UVCB0byB3aGljaCB3ZSByZWFkKS4gCisgICAqCisgICAqIFBlcmhhcHMgdGhpcyBzaG91bGQgYmUgY2hhbmdlZCBzbyB0aGF0IAorICAgKiBwcm9jZXNzX29uZV9kZWJ1Z19zeW1ib2woKSAia25vd3MiIHdoZW4KKyAgICogdG8gc3RvcCByZWFkaW5nIChiYXNlZCBvbiByZWFkaW5nIGZyb20gdGhlIE1PRFVMRSB0byB0aGUgbWF0Y2hpbmcKKyAgICogRU5EKSwgYW5kIHRha2Ugb3V0IHRoaXMgcmVsaWFuY2Ugb24gYSAjLXN5bXMgYmVpbmcgcGFzc2VkIGluLi4uCisgICAqIChJJ20gd29ycmllZCBhYm91dCB0aGUgcmVsaWFiaWxpdHkgb2YgdGhpcyBudW1iZXIpLiBCdXQgSSdsbAorICAgKiBsZWF2ZSBpdCBhcy1pcywgZm9yIG5vdy4gLSBSVAorICAgKgorICAgKiBUaGUgY2hhbmdlIGFib3ZlIGhhcyBiZWVuIG1hZGUuIEkndmUgbGVmdCB0aGUgImZvciIgbG9vcCBjb250cm9sCisgICAqIGluIHRvIHByZXBhcmUgZm9yIGJhY2tpbmcgdGhpcyBvdXQgYWdhaW4uIC1KQgorICAgKi8KKyAgbWF4X3N5bW51bSA9IHN5bV9zaXplIC8gc2l6ZW9mIChzdHJ1Y3QgZG50dF90eXBlX2Jsb2NrKTsKKyAgICAgICAgICAgLyogTm8gcmVhc29uIHRvIG11bHRpcGx5IG9uIHBzdCBzaWRlIGFuZCBkaXZpZGUgb24gc3ltIHNpZGUuLi4gRklYTUUgKi8KKworICAvKiBSZWFkIGluIGFuZCBwcm9jZXNzIGVhY2ggZGVidWcgc3ltYm9sIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLgorICAgKi8KKyAgZm9yIChzeW1udW0gPSAwOworICAgICAgIHN5bW51bSA8IG1heF9zeW1udW07ICAgICAgIAorICAgICAgIHN5bW51bSsrKQorICAgIHsKKyAgICAgIFFVSVQ7CQkJLyogQWxsb3cgdGhpcyB0byBiZSBpbnRlcnJ1cHRhYmxlICovCisgICAgICBkbl9idWZwID0gaHByZWFkX2dldF9sbnR0IChzeW1faW5kZXggKyBzeW1udW0sIG9iamZpbGUpOworCisgICAgICBpZiAoZG5fYnVmcC0+ZGJsb2NrLmV4dGVuc2lvbikKKwljb250aW51ZTsKKworICAgICAgLyogWW93ISAgV2UgY2FsbCBTRVRfTkFNRVNUUklORyBvbiB0aGluZ3Mgd2l0aG91dCBuYW1lcyEgICovCisgICAgICBTRVRfTkFNRVNUUklORyAoZG5fYnVmcCwgJm5hbWVzdHJpbmcsIG9iamZpbGUpOworCisgICAgICBocHJlYWRfcHJvY2Vzc19vbmVfZGVidWdfc3ltYm9sIChkbl9idWZwLCBuYW1lc3RyaW5nLCBzZWN0aW9uX29mZnNldHMsCisJCQkJICAgICAgIG9iamZpbGUsIHRleHRfb2Zmc2V0LCB0ZXh0X3NpemUsCisJCQkJICAgICAgIGZpbGVuYW1lLCBzeW1udW0gKyBzeW1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdF9tb2R1bGVfYm91bmRhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIC8qIE9MRCBDT01NRU5UUzogVGhpcyByb3V0aW5lIGlzIG9ubHkgY2FsbGVkIGZvciBwc3RzLiAgQWxsIHBzdHMKKyAgICAgICAqIGNvcnJlc3BvbmQgdG8gTU9EVUxFUy4gIElmIHdlIGV2ZXIgZG8gbGF6eS1yZWFkaW5nIG9mIGdsb2JhbHMKKyAgICAgICAqIGZyb20gdGhlIExOVFQsIHRoZW4gdGhlcmUgd2lsbCBiZSBhIHBzdCB3aGljaCBlbmRzIHdoZW4gdGhlCisgICAgICAgKiBMTlRUIGVuZHMsIGFuZCBub3QgYXQgYW4gRU5EIE1PRFVMRSBlbnRyeS4gIFRoZW4gd2UnbGwgaGF2ZQorICAgICAgICogdG8gcmUtdmlzaXQgdGhpcyBicmVhay4gIAorCisgICAgICAgaWYoIGF0X2VuZF9vZl9tb2R1bGUgKQorICAgICAgICAgICBicmVhazsKKworICAgICAgICovCisKKyAgICAgIC8qIFdlIG5vIGxvbmdlciBicmVhayBvdXQgb2YgdGhlIGxvb3Agd2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIGEKKyAgICAgICAgIG1vZHVsZS4gVGhlIHJlYXNvbiBpcyB0aGF0IHdpdGggQ1RUSSwgdGhlIGNvbXBpbGVyIGNhbiBnZW5lcmF0ZQorICAgICAgICAgZnVuY3Rpb24gc3ltYm9scyAoZm9yIHRlbXBsYXRlIGZ1bmN0aW9uIGluc3RhbnRpYXRpb25zKSB3aGljaCBhcmUgbm90CisgICAgICAgICBpbiBhbnkgbW9kdWxlOyB0eXBpY2FsbHkgdGhleSBzaG93IHVwIGJleW9uZCBhIG1vZHVsZSdzIGVuZCwgYW5kCisgICAgICAgICBiZWZvcmUgdGhlIG5leHQgbW9kdWxlJ3Mgc3RhcnQuICBXZSBpbmNsdWRlIHRoZW0gaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgIG1vZHVsZS4gIEhvd2V2ZXIsIHdlIHN0aWxsIGRvbid0IHRydXN0IHRoZSBNQVhfU1lNTlVNIHZhbHVlIGZyb20KKyAgICAgICAgIHRoZSBwc3ltdGFiLCBzbyB3ZSBicmVhayBvdXQgaWYgd2UgZW50ZXIgYSBuZXcgbW9kdWxlLiAqLworCisgICAgICBpZiAoYXRfbW9kdWxlX2JvdW5kYXJ5ID09IC0xKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgY3VycmVudF9vYmpmaWxlID0gTlVMTDsKKyAgaHBfc29tX3NvbV9vYmplY3RfcHJlc2VudCA9IDE7IC8qIEluZGljYXRlIHdlJ3ZlIHByb2Nlc3NlZCBhbiBIUCBTT00gU09NIGZpbGUgKi8KKyAgCisgIHJldHVybiBlbmRfc3ltdGFiICh0ZXh0X29mZnNldCArIHRleHRfc2l6ZSwgb2JqZmlsZSwgMCk7Cit9CisMCisKKworCisvKiBDb252ZXJ0IGJhc2ljIHR5cGVzIGZyb20gSFAgZGVidWcgZm9ybWF0IGludG8gR0RCIGludGVybmFsIGZvcm1hdC4gICovCisKK3N0YXRpYyBpbnQKK2hwcmVhZF90eXBlX3RyYW5zbGF0ZSAodHlwZXApCisgICAgIGRudHRwb2ludGVyIHR5cGVwOworeworICBpZiAoIXR5cGVwLmRudHRpLmltbWVkaWF0ZSkgeworICAgIGVycm9yICgiZXJyb3IgaW4gaHByZWFkX3R5cGVfdHJhbnNsYXRlXG4uIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3dpdGNoICh0eXBlcC5kbnR0aS50eXBlKQorICAgIHsKKyAgICBjYXNlIEhQX1RZUEVfQk9PTEVBTjoKKyAgICBjYXNlIEhQX1RZUEVfQk9PTEVBTl9TMzAwX0NPTVBBVDoKKyAgICBjYXNlIEhQX1RZUEVfQk9PTEVBTl9WQVhfQ09NUEFUOgorICAgICAgcmV0dXJuIEZUX0JPT0xFQU47CisgICAgY2FzZSBIUF9UWVBFX0NIQVI6ICAgICAgICAgICAgICAgIC8qIEMgc2lnbmVkIGNoYXIsIEMrKyBwbGFpbiBjaGFyICovCisgCisgICAgY2FzZSBIUF9UWVBFX1dJREVfQ0hBUjoKKyAgICAgIHJldHVybiBGVF9DSEFSOworICAgIGNhc2UgSFBfVFlQRV9JTlQ6CisgICAgICBpZiAodHlwZXAuZG50dGkuYml0bGVuZ3RoIDw9IDgpCisJcmV0dXJuIEZUX1NJR05FRF9DSEFSOyAgICAgICAgIC8qIEMrKyBzaWduZWQgY2hhciAqLworICAgICAgaWYgKHR5cGVwLmRudHRpLmJpdGxlbmd0aCA8PSAxNikKKwlyZXR1cm4gRlRfU0hPUlQ7CisgICAgICBpZiAodHlwZXAuZG50dGkuYml0bGVuZ3RoIDw9IDMyKQorCXJldHVybiBGVF9JTlRFR0VSOworICAgICAgcmV0dXJuIEZUX0xPTkdfTE9ORzsKKyAgICBjYXNlIEhQX1RZUEVfTE9ORzoKKyAgICAgIGlmICh0eXBlcC5kbnR0aS5iaXRsZW5ndGggPD0gOCkKKwlyZXR1cm4gRlRfU0lHTkVEX0NIQVI7ICAgICAgICAgICAvKiBDKysgc2lnbmVkIGNoYXIuICovIAorICAgICAgcmV0dXJuIEZUX0xPTkc7CisgICAgY2FzZSBIUF9UWVBFX1VOU0lHTkVEX0xPTkc6CisgICAgICBpZiAodHlwZXAuZG50dGkuYml0bGVuZ3RoIDw9IDgpCisJcmV0dXJuIEZUX1VOU0lHTkVEX0NIQVI7ICAgICAgICAvKiBDL0MrKyB1bnNpZ25lZCBjaGFyICovCisgICAgICBpZiAodHlwZXAuZG50dGkuYml0bGVuZ3RoIDw9IDE2KQorCXJldHVybiBGVF9VTlNJR05FRF9TSE9SVDsKKyAgICAgIGlmICh0eXBlcC5kbnR0aS5iaXRsZW5ndGggPD0gMzIpCisJcmV0dXJuIEZUX1VOU0lHTkVEX0xPTkc7CisgICAgICByZXR1cm4gRlRfVU5TSUdORURfTE9OR19MT05HOworICAgIGNhc2UgSFBfVFlQRV9VTlNJR05FRF9JTlQ6CisgICAgICBpZiAodHlwZXAuZG50dGkuYml0bGVuZ3RoIDw9IDgpCisJcmV0dXJuIEZUX1VOU0lHTkVEX0NIQVI7CisgICAgICBpZiAodHlwZXAuZG50dGkuYml0bGVuZ3RoIDw9IDE2KQorCXJldHVybiBGVF9VTlNJR05FRF9TSE9SVDsKKyAgICAgIGlmICh0eXBlcC5kbnR0aS5iaXRsZW5ndGggPD0gMzIpCisJcmV0dXJuIEZUX1VOU0lHTkVEX0lOVEVHRVI7CisgICAgICByZXR1cm4gRlRfVU5TSUdORURfTE9OR19MT05HOworICAgIGNhc2UgSFBfVFlQRV9SRUFMOgorICAgIGNhc2UgSFBfVFlQRV9SRUFMXzMwMDA6CisgICAgY2FzZSBIUF9UWVBFX0RPVUJMRToKKyAgICAgIGlmICh0eXBlcC5kbnR0aS5iaXRsZW5ndGggPT0gNjQpCisJcmV0dXJuIEZUX0RCTF9QUkVDX0ZMT0FUOworICAgICAgaWYgKHR5cGVwLmRudHRpLmJpdGxlbmd0aCA9PSAxMjgpCisJcmV0dXJuIEZUX0VYVF9QUkVDX0ZMT0FUOworICAgICAgcmV0dXJuIEZUX0ZMT0FUOworICAgIGNhc2UgSFBfVFlQRV9DT01QTEVYOgorICAgIGNhc2UgSFBfVFlQRV9DT01QTEVYUzMwMDA6CisgICAgICBpZiAodHlwZXAuZG50dGkuYml0bGVuZ3RoID09IDEyOCkKKwlyZXR1cm4gRlRfREJMX1BSRUNfQ09NUExFWDsKKyAgICAgIGlmICh0eXBlcC5kbnR0aS5iaXRsZW5ndGggPT0gMTkyKQorCXJldHVybiBGVF9FWFRfUFJFQ19DT01QTEVYOworICAgICAgcmV0dXJuIEZUX0NPTVBMRVg7CisgICAgY2FzZSBIUF9UWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gRlRfVk9JRDsKKyAgICBjYXNlIEhQX1RZUEVfU1RSSU5HMjAwOgorICAgIGNhc2UgSFBfVFlQRV9MT05HU1RSSU5HMjAwOgorICAgIGNhc2UgSFBfVFlQRV9GVE5fU1RSSU5HX1NQRUM6CisgICAgY2FzZSBIUF9UWVBFX01PRF9TVFJJTkdfU1BFQzoKKyAgICBjYXNlIEhQX1RZUEVfTU9EX1NUUklOR18zMDAwOgorICAgIGNhc2UgSFBfVFlQRV9GVE5fU1RSSU5HX1MzMDBfQ09NUEFUOgorICAgIGNhc2UgSFBfVFlQRV9GVE5fU1RSSU5HX1ZBWF9DT01QQVQ6CisgICAgICByZXR1cm4gRlRfU1RSSU5HOworICAgIGNhc2UgSFBfVFlQRV9URU1QTEFURV9BUkc6CisgICAgICByZXR1cm4gRlRfVEVNUExBVEVfQVJHOworICAgIGNhc2UgSFBfVFlQRV9URVhUOgorICAgIGNhc2UgSFBfVFlQRV9GTEFCRUw6CisgICAgY2FzZSBIUF9UWVBFX1BBQ0tFRF9ERUNJTUFMOgorICAgIGNhc2UgSFBfVFlQRV9BTllQT0lOVEVSOiAgCisgICAgY2FzZSBIUF9UWVBFX0dMT0JBTF9BTllQT0lOVEVSOgorICAgIGNhc2UgSFBfVFlQRV9MT0NBTF9BTllQT0lOVEVSOiAKKyAgICBkZWZhdWx0OgorICAgICAgd2FybmluZyAoImhwcmVhZF90eXBlX3RyYW5zbGF0ZTogdW5oYW5kbGVkIHR5cGUgY29kZS5cbiIpOworICAgICAgcmV0dXJuIEZUX1ZPSUQ7CisgICAgfQorfQorCisvKiBHaXZlbiBhIHBvc2l0aW9uIGluIHRoZSBETlRULCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSAKKyAqIGFscmVhZHktYnVpbHQgInN0cnVjdCB0eXBlIiAoaWYgYW55KSwgZm9yIHRoZSB0eXBlIGRlZmluZWQgCisgKiBhdCB0aGF0IHBvc2l0aW9uLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqKgoraHByZWFkX2xvb2t1cF90eXBlIChocF90eXBlLCBvYmpmaWxlKQorICAgICBkbnR0cG9pbnRlciBocF90eXBlOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgdW5zaWduZWQgb2xkX2xlbjsKKyAgaW50IGluZGV4ID0gaHBfdHlwZS5kbnR0cC5pbmRleDsKKyAgaW50IHNpemVfY2hhbmdlZCA9IDA7CisKKyAgLyogVGhlIGltbWVkaWF0ZSBmbGFnIGluZGljYXRlcyB0aGlzIGRvZXNuJ3QgYWN0dWFsbHkgcG9pbnQgdG8KKyAgICogYSB0eXBlIEROVFQuCisgICAqLworICBpZiAoaHBfdHlwZS5kbnR0aS5pbW1lZGlhdGUpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogRm9yIGVhY2ggb2JqZmlsZSwgd2UgbWFpbnRhaW4gYSAidHlwZSB2ZWN0b3IiLgorICAgKiBUaGlzIGFuIGFycmF5IG9mICJzdHJ1Y3QgdHlwZSAqIidzIHdpdGggb25lIHBvaW50ZXIgcGVyIEROVFQgaW5kZXguCisgICAqIEdpdmVuIGEgRE5UVCBpbmRleCwgd2UgbG9vayBpbiB0aGlzIGFycmF5IHRvIHNlZSBpZiB3ZSBoYXZlCisgICAqIGFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgRE5UVCBhbmQgaWYgaXQgaXMgYSB0eXBlIGRlZmluaXRpb24uCisgICAqIElmIHNvLCB0aGVuIHdlIGNhbiBsb2NhdGUgYSBwb2ludGVyIHRvIHRoZSBhbHJlYWR5LWJ1aWx0CisgICAqICJzdHJ1Y3QgdHlwZSIsIGFuZCBub3QgYnVpbGQgaXQgYWdhaW4uCisgICAqIAorICAgKiBUaGUgbmVlZCBmb3IgdGhpcyBhcmlzZXMgYmVjYXVzZSBvdXIgRE5UVC13YWxraW5nIGNvZGUgd2FuZGVycworICAgKiBhcm91bmQuIEluIHBhcnRpY3VsYXIsIGl0IHdpbGwgZW5jb3VudGVyIHRoZSBzYW1lIHR5cGUgbXVsdGlwbGUKKyAgICogdGltZXMgKG9uY2UgZm9yIGVhY2ggb2JqZWN0IG9mIHRoYXQgdHlwZSkuIFdlIGRvbid0IHdhbnQgdG8gCisgICAqIGJ1aWx0IG11bHRpcGxlICJzdHJ1Y3QgdHlwZSIncyBmb3IgdGhlIHNhbWUgdGhpbmcuCisgICAqCisgICAqIEhhdmluZyBzYWlkIHRoaXMsIEkgc2hvdWxkIHBvaW50IG91dCB0aGF0IHRoaXMgdHlwZS12ZWN0b3IgaXMKKyAgICogYW4gZXhwZW5zaXZlIHdheSB0byBrZWVwIHRyYWNrIG9mIHRoaXMuIElmIG1vc3QgRE5UVCBlbnRyaWVzIGFyZSAKKyAgICogMyB3b3JkcywgdGhlIHR5cGUtdmVjdG9yIHdpbGwgYmUgMS8zIHRoZSBzaXplIG9mIHRoZSBETlRUIGl0c2VsZi4KKyAgICogQWx0ZXJuYXRpdmUgc29sdXRpb25zOgorICAgKiAtIEtlZXAgYSBjb21wcmVzc2VkIG9yIGhhc2hlZCB0YWJsZS4gTGVzcyBtZW1vcnksIGJ1dCBtb3JlIGV4cGVuc2l2ZQorICAgKiAgIHRvIHNlYXJjaCBhbmQgdXBkYXRlLgorICAgKiAtIChTdWdnZXN0ZWQgYnkgSkIpOiBPdmVyd3JpdGUgdGhlIEROVFQgZW50cnkgaXRzZWxmCisgICAqICAgd2l0aCB0aGUgaW5mby4gQ3JlYXRlIGEgbmV3IHR5cGUgY29kZSAiQUxSRUFEWV9CVUlMVCIsIGFuZCBtb2RpZnkKKyAgICogICB0aGUgRE5UVCB0byBoYXZlIHRoYXQgdHlwZSBjb2RlIGFuZCBwb2ludCB0byB0aGUgYWxyZWFkeS1idWlsdCBlbnRyeS4KKyAgICogLVJUCisgICAqLworCisgIGlmIChpbmRleCA8IExOVFRfU1lNQ09VTlQgKG9iamZpbGUpKQorICAgIHsKKyAgICAgIGlmIChpbmRleCA+PSBUWVBFX1ZFQ1RPUl9MRU5HVEggKG9iamZpbGUpKQorCXsKKwkgIG9sZF9sZW4gPSBUWVBFX1ZFQ1RPUl9MRU5HVEggKG9iamZpbGUpOworCisgICAgICAgICAgLyogU2VlIGlmIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSB0eXBlLXZlY3Rvci4gKi8KKwkgIGlmIChvbGRfbGVuID09IDApCisJICAgIHsKKyAgICAgICAgICAgICAgVFlQRV9WRUNUT1JfTEVOR1RIKG9iamZpbGUpID0gTE5UVF9TWU1DT1VOVCAob2JqZmlsZSkgKyBHTlRUX1NZTUNPVU5UIChvYmpmaWxlKTsKKwkgICAgICBUWVBFX1ZFQ1RPUiAob2JqZmlsZSkgPSAoc3RydWN0IHR5cGUgKiopCisJCXhtbWFsbG9jIChvYmpmaWxlLT5tZCwgVFlQRV9WRUNUT1JfTEVOR1RIIChvYmpmaWxlKSAqIHNpemVvZiAoc3RydWN0IHR5cGUgKikpOworCSAgICAgIG1lbXNldCAoJlRZUEVfVkVDVE9SIChvYmpmaWxlKVtvbGRfbGVuXSwgMCwKKwkJICAgICAgICAoVFlQRV9WRUNUT1JfTEVOR1RIIChvYmpmaWxlKSAtIG9sZF9sZW4pICoKKwkJICAgICAgICBzaXplb2YgKHN0cnVjdCB0eXBlICopKTsKKwkgICAgfQorCisgICAgICAgICAgLyogU2VlIGlmIHdlIG5lZWQgdG8gcmVzaXplIHR5cGUtdmVjdG9yLiBXaXRoIG15IGNoYW5nZSB0bworICAgICAgICAgICAqIGluaXRpYWxseSBhbGxvY2F0ZSBhIGNvcnJlY3Qtc2l6ZSB0eXBlLXZlY3RvciwgdGhpcyBjb2RlCisgICAgICAgICAgICogc2hvdWxkIG5vIGxvbmdlciB0cmlnZ2VyLgorICAgICAgICAgICAqLworCSAgd2hpbGUgKGluZGV4ID49IFRZUEVfVkVDVE9SX0xFTkdUSCAob2JqZmlsZSkpIHsKKwkgICAgVFlQRV9WRUNUT1JfTEVOR1RIIChvYmpmaWxlKSAqPSAyOworICAgICAgICAgICAgc2l6ZV9jaGFuZ2VkID0gMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNpemVfY2hhbmdlZCkgeworCSAgICBUWVBFX1ZFQ1RPUiAob2JqZmlsZSkgPSAoc3RydWN0IHR5cGUgKiopCisJICAgICAgeG1yZWFsbG9jIChvYmpmaWxlIC0+IG1kLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIFRZUEVfVkVDVE9SIChvYmpmaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoVFlQRV9WRUNUT1JfTEVOR1RIIChvYmpmaWxlKSAqIHNpemVvZiAoc3RydWN0IHR5cGUgKikpKTsKKworCSAgICAgIG1lbXNldCAoJlRZUEVfVkVDVE9SIChvYmpmaWxlKVtvbGRfbGVuXSwgMCwKKwkJICAgICAgICAoVFlQRV9WRUNUT1JfTEVOR1RIIChvYmpmaWxlKSAtIG9sZF9sZW4pICoKKwkJICAgICAgICBzaXplb2YgKHN0cnVjdCB0eXBlICopKTsKKyAgICAgICAgICB9IAorCisJfQorICAgICAgcmV0dXJuICZUWVBFX1ZFQ1RPUiAob2JqZmlsZSlbaW5kZXhdOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworfQorCisvKiBQb3NzaWJseSBhbGxvY2F0ZSBhIEdEQiBpbnRlcm5hbCB0eXBlIHNvIHdlIGNhbiBpbnRlcm5hbGl6ZSBIUF9UWVBFLgorICAgTm90ZSB3ZSdsbCBqdXN0IHJldHVybiB0aGUgYWRkcmVzcyBvZiBhIEdEQiBpbnRlcm5hbCB0eXBlIGlmIHdlIGFscmVhZHkKKyAgIGhhdmUgaXQgbHlpbmcgYXJvdW5kLiAgKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2hwcmVhZF9hbGxvY190eXBlIChocF90eXBlLCBvYmpmaWxlKQorICAgICBkbnR0cG9pbnRlciBocF90eXBlOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IHR5cGUgKip0eXBlX2FkZHI7CisKKyAgdHlwZV9hZGRyID0gaHByZWFkX2xvb2t1cF90eXBlIChocF90eXBlLCBvYmpmaWxlKTsKKyAgaWYgKCp0eXBlX2FkZHIgPT0gMCkgeworICAgICp0eXBlX2FkZHIgPSBhbGxvY190eXBlIChvYmpmaWxlKTsKKworICAgIC8qIEEgaGFjayAtIGlmIHdlIHJlYWxseSBhcmUgYSBDKysgY2xhc3Mgc3ltYm9sLCB0aGVuIHRoaXMgZGVmYXVsdAorICAgICAqIHdpbGwgZ2V0IG92ZXJyaWRlbiBsYXRlciBvbi4KKyAgICAgKi8KKyAgICBUWVBFX0NQTFVTX1NQRUNJRklDICgqdHlwZV9hZGRyKQorICAgICAgPSAoc3RydWN0IGNwbHVzX3N0cnVjdF90eXBlICopICZjcGx1c19zdHJ1Y3RfZGVmYXVsdDsKKyAgfQorCisgIHJldHVybiAqdHlwZV9hZGRyOworfQorCisvKiBSZWFkIGEgbmF0aXZlIGVudW1lcmF0ZWQgdHlwZSBhbmQgcmV0dXJuIGl0IGluIEdEQiBpbnRlcm5hbCBmb3JtLiAgKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2hwcmVhZF9yZWFkX2VudW1fdHlwZSAoaHBfdHlwZSwgZG5fYnVmcCwgb2JqZmlsZSkKKyAgICAgZG50dHBvaW50ZXIgaHBfdHlwZTsKKyAgICAgdW5pb24gZG50dGVudHJ5ICpkbl9idWZwOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IHR5cGUgKnR5cGU7CisgIHN0cnVjdCBwZW5kaW5nICoqc3ltbGlzdCwgKm9zeW1zLCAqc3ltczsKKyAgc3RydWN0IHBlbmRpbmcgKmxvY2FsX2xpc3QgPSBOVUxMOworICBpbnQgb19uc3ltcywgbnN5bXMgPSAwOworICBkbnR0cG9pbnRlciBtZW07CisgIHVuaW9uIGRudHRlbnRyeSAqbWVtcDsKKyAgY2hhciAqbmFtZTsKKyAgbG9uZyBuOworICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisKKyAgLyogQWxsb2NhdGUgYSBHREIgdHlwZS4gSWYgd2UndmUgYWxyZWFkeSByZWFkIGluIHRoaXMgZW51bSB0eXBlLAorICAgKiBpdCdsbCByZXR1cm4gdGhlIGFscmVhZHkgYnVpbHQgR0RCIHR5cGUsIHNvIHN0b3AgaGVyZS4KKyAgICogKE5vdGU6IEkgYWRkZWQgdGhpcyBjaGVjaywgdG8gY29uZm9ybSB3aXRoIHdoYXQncyBkb25lIGZvciAKKyAgICogIHN0cnVjdCwgdW5pb24sIGNsYXNzLgorICAgKiAgSSBhc3N1bWUgdGhpcyBpcyBPSy4gLSBSVCkKKyAgICovCisgIHR5cGUgPSBocHJlYWRfYWxsb2NfdHlwZSAoaHBfdHlwZSwgb2JqZmlsZSk7CisgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9FTlVNKQorICAgIHJldHVybiB0eXBlOworCisgIC8qIEhQIEMgc3VwcG9ydHMgInNpemVkIGVudW1zIiwgd2hlcmUgYSBzcGVjaWZpZXIgc3VjaCBhcyAic2hvcnQiIG9yCisgICAgICJjaGFyIiBjYW4gYmUgdXNlZCB0byBnZXQgZW51bXMgb2YgZGlmZmVyZW50IHNpemVzLiBTbyBkb24ndCBhc3N1bWUKKyAgICAgYW4gZW51bSBpcyBhbHdheXMgNCBieXRlcyBsb25nLiBwYWkvMTk5Ny0wOC0yMSAqLworICBUWVBFX0xFTkdUSCAodHlwZSkgPSBkbl9idWZwLT5kZW51bS5iaXRsZW5ndGggLyA4OworCisgIHN5bWxpc3QgPSAmZmlsZV9zeW1ib2xzOworICBvc3ltcyA9ICpzeW1saXN0OworICBvX25zeW1zID0gb3N5bXMgPyBvc3ltcy0+bnN5bXMgOiAwOworCisgIC8qIEdldCBhIG5hbWUgZm9yIGVhY2ggbWVtYmVyIGFuZCBhZGQgaXQgdG8gb3VyIGxpc3Qgb2YgbWVtYmVycy4gIAorICAgKiBUaGUgbGlzdCBvZiAibWVtIiBTT00gcmVjb3JkcyB3ZSBhcmUgd2Fsa2luZyBzaG91bGQgYWxsIGJlCisgICAqIFNPTSB0eXBlIEROVFRfVFlQRV9NRU1FTlVNIChub3QgY2hlY2tlZCkuCisgICAqLworICBtZW0gPSBkbl9idWZwLT5kZW51bS5maXJzdG1lbTsKKyAgd2hpbGUgKG1lbS53b3JkICYmIG1lbS53b3JkICE9IEROVFROSUwpCisgICAgeworICAgICAgbWVtcCA9IGhwcmVhZF9nZXRfbG50dCAobWVtLmRudHRwLmluZGV4LCBvYmpmaWxlKTsKKworICAgICAgbmFtZSA9IFZUIChvYmpmaWxlKSArIG1lbXAtPmRtZW1iZXIubmFtZTsKKyAgICAgIHN5bSA9IChzdHJ1Y3Qgc3ltYm9sICopIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywKKwkJCQkJICAgICBzaXplb2YgKHN0cnVjdCBzeW1ib2wpKTsKKyAgICAgIG1lbXNldCAoc3ltLCAwLCBzaXplb2YgKHN0cnVjdCBzeW1ib2wpKTsKKyAgICAgIFNZTUJPTF9OQU1FIChzeW0pID0gb2JzYXZlc3RyaW5nIChuYW1lLCBzdHJsZW4gKG5hbWUpLCAKKwkJCQkJJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrKTsKKyAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19DT05TVDsKKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworICAgICAgU1lNQk9MX1ZBTFVFIChzeW0pID0gbWVtcC0+ZG1lbWJlci52YWx1ZTsKKyAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCBzeW1saXN0KTsKKyAgICAgIG5zeW1zKys7CisgICAgICBtZW0gPSBtZW1wLT5kbWVtYmVyLm5leHRtZW07CisgICAgfQorCisgIC8qIE5vdyB0aGF0IHdlIGtub3cgbW9yZSBhYm91dCB0aGUgZW51bSwgZmlsbCBpbiBtb3JlIGluZm8uICAqLworICBUWVBFX0NPREUgKHR5cGUpID0gVFlQRV9DT0RFX0VOVU07CisgIFRZUEVfRkxBR1MgKHR5cGUpICY9IH5UWVBFX0ZMQUdfU1RVQjsKKyAgVFlQRV9ORklFTERTICh0eXBlKSA9IG5zeW1zOworICBUWVBFX0ZJRUxEUyAodHlwZSkgPSAoc3RydWN0IGZpZWxkICopCisgICAgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnR5cGVfb2JzdGFjaywgc2l6ZW9mIChzdHJ1Y3QgZmllbGQpICogbnN5bXMpOworCisgIC8qIEZpbmQgdGhlIHN5bWJvbHMgZm9yIHRoZSBtZW1iZXJzIGFuZCBwdXQgdGhlbSBpbnRvIHRoZSB0eXBlLgorICAgICBUaGUgc3ltYm9scyBjYW4gYmUgZm91bmQgaW4gdGhlIHN5bWxpc3QgdGhhdCB3ZSBwdXQgdGhlbSBvbgorICAgICB0byBjYXVzZSB0aGVtIHRvIGJlIGRlZmluZWQuICBvc3ltcyBjb250YWlucyB0aGUgb2xkIHZhbHVlCisgICAgIG9mIHRoYXQgc3ltbGlzdDsgZXZlcnl0aGluZyB1cCB0byB0aGVyZSB3YXMgZGVmaW5lZCBieSB1cy4KKworICAgICBOb3RlIHRoYXQgd2UgcHJlc2VydmUgdGhlIG9yZGVyIG9mIHRoZSBlbnVtIGNvbnN0YW50cywgc28KKyAgICAgdGhhdCBpbiBzb21ldGhpbmcgbGlrZSAiZW51bSB7Rk9PLCBMQVNUX1RISU5HPUZPT30iIHdlIHByaW50CisgICAgIEZPTywgbm90IExBU1RfVEhJTkcuICAqLworICBmb3IgKHN5bXMgPSAqc3ltbGlzdCwgbiA9IDA7IHN5bXM7IHN5bXMgPSBzeW1zLT5uZXh0KQorICAgIHsKKyAgICAgIGludCBqID0gMDsKKyAgICAgIGlmIChzeW1zID09IG9zeW1zKQorCWogPSBvX25zeW1zOworICAgICAgZm9yICg7IGogPCBzeW1zLT5uc3ltczsgaisrLCBuKyspCisJeworCSAgc3RydWN0IHN5bWJvbCAqeHN5bSA9IHN5bXMtPnN5bWJvbFtqXTsKKwkgIFNZTUJPTF9UWVBFICh4c3ltKSA9IHR5cGU7CisJICBUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIG4pID0gU1lNQk9MX05BTUUgKHhzeW0pOworCSAgVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIG4pID0gU1lNQk9MX1ZBTFVFICh4c3ltKTsKKwkgIFRZUEVfRklFTERfQklUU0laRSAodHlwZSwgbikgPSAwOworCX0KKyAgICAgIGlmIChzeW1zID09IG9zeW1zKQorCWJyZWFrOworICAgIH0KKworICByZXR1cm4gdHlwZTsKK30KKworLyogUmVhZCBhbmQgaW50ZXJuYWxpemUgYSBuYXRpdmUgZnVuY3Rpb24gZGVidWcgc3ltYm9sLiAgKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2hwcmVhZF9yZWFkX2Z1bmN0aW9uX3R5cGUgKGhwX3R5cGUsIGRuX2J1ZnAsIG9iamZpbGUsIG5ld2Jsb2NrKQorICAgICBkbnR0cG9pbnRlciBocF90eXBlOworICAgICB1bmlvbiBkbnR0ZW50cnkgKmRuX2J1ZnA7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBpbnQgbmV3YmxvY2s7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlLCAqdHlwZTE7CisgIHN0cnVjdCBwZW5kaW5nICpzeW1zOworICBzdHJ1Y3QgcGVuZGluZyAqbG9jYWxfbGlzdCA9IE5VTEw7CisgIGludCBuc3ltcyA9IDA7CisgIGRudHRwb2ludGVyIHBhcmFtOworICB1bmlvbiBkbnR0ZW50cnkgKnBhcmFtcDsKKyAgY2hhciAqbmFtZTsKKyAgbG9uZyBuOworICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIGludCByZWNvcmRfYXJncyA9IDE7CisKKyAgLyogU2VlIGlmIHdlJ3ZlIGFscmVhZHkgcmVhZCBpbiB0aGlzIHR5cGUuICAqLworICB0eXBlID0gaHByZWFkX2FsbG9jX3R5cGUgKGhwX3R5cGUsIG9iamZpbGUpOworICBpZiAoVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfRlVOQykKKyAgICB7CisgICAgICByZWNvcmRfYXJncyA9IDA7IC8qIGFscmVhZHkgcmVhZCBpbiwgZG9uJ3QgbW9kaWZ5IHR5cGUgKi8gCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogTm9wZSwgc28gcmVhZCBpdCBpbiBhbmQgc3RvcmUgaXQgYXdheS4gICovCisgICAgICBpZiAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX0ZVTkNUSU9OIHx8CisgICAgICAgICAgZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX01FTUZVTkMpCisgICAgICAgIHR5cGUxID0gbG9va3VwX2Z1bmN0aW9uX3R5cGUgKGhwcmVhZF90eXBlX2xvb2t1cCAoZG5fYnVmcC0+ZGZ1bmMucmV0dmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamZpbGUpKTsKKyAgICAgIGVsc2UgaWYgKGRuX2J1ZnAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9GVU5DVFlQRSkKKyAgICAgICAgdHlwZTEgPSBsb29rdXBfZnVuY3Rpb25fdHlwZSAoaHByZWFkX3R5cGVfbG9va3VwIChkbl9idWZwLT5kZnVuY3R5cGUucmV0dmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamZpbGUpKTsKKyAgICAgIGVsc2UgLyogZXhwZWN0IEROVFRfVFlQRV9GVU5DX1RFTVBMQVRFICovCisgICAgICAgIHR5cGUxID0gbG9va3VwX2Z1bmN0aW9uX3R5cGUgKGhwcmVhZF90eXBlX2xvb2t1cCAoZG5fYnVmcC0+ZGZ1bmNfdGVtcGxhdGUucmV0dmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamZpbGUpKTsKKyAgICAgIG1lbWNweSAoKGNoYXIgKikgdHlwZSwgKGNoYXIgKikgdHlwZTEsIHNpemVvZiAoc3RydWN0IHR5cGUpKTsKKyAgICAgIAorICAgICAgLyogTWFyayBpdCAtLSBpbiB0aGUgbWlkZGxlIG9mIHByb2Nlc3NpbmcgKi8gCisgICAgICBUWVBFX0ZMQUdTICh0eXBlKSB8PSBUWVBFX0ZMQUdfSU5DT01QTEVURTsKKyAgICB9CisKKyAgLyogTm93IGV4YW1pbmUgZWFjaCBwYXJhbWV0ZXIgbm90aW5nIGl0cyB0eXBlLCBsb2NhdGlvbiwgYW5kIGEKKyAgICAgd2VhbHRoIG9mIG90aGVyIGluZm9ybWF0aW9uLiAgKi8KKyAgaWYgKGRuX2J1ZnAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9GVU5DVElPTiB8fAorICAgICAgZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX01FTUZVTkMpCisgICAgcGFyYW0gPSBkbl9idWZwLT5kZnVuYy5maXJzdHBhcmFtOworICBlbHNlIGlmIChkbl9idWZwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfRlVOQ1RZUEUpCisgICAgcGFyYW0gPSBkbl9idWZwLT5kZnVuY3R5cGUuZmlyc3RwYXJhbTsKKyAgZWxzZSAvKiBleHBlY3QgRE5UVF9UWVBFX0ZVTkNfVEVNUExBVEUgKi8KKyAgICBwYXJhbSA9IGRuX2J1ZnAtPmRmdW5jX3RlbXBsYXRlLmZpcnN0cGFyYW07CisgIHdoaWxlIChwYXJhbS53b3JkICYmIHBhcmFtLndvcmQgIT0gRE5UVE5JTCkKKyAgICB7CisgICAgICBwYXJhbXAgPSBocHJlYWRfZ2V0X2xudHQgKHBhcmFtLmRudHRwLmluZGV4LCBvYmpmaWxlKTsKKyAgICAgIG5zeW1zKys7CisgICAgICBwYXJhbSA9IHBhcmFtcC0+ZGZwYXJhbS5uZXh0cGFyYW07CisKKyAgICAgIC8qIEdldCB0aGUgbmFtZS4gICovCisgICAgICBuYW1lID0gVlQgKG9iamZpbGUpICsgcGFyYW1wLT5kZnBhcmFtLm5hbWU7CisgICAgICBzeW0gPSAoc3RydWN0IHN5bWJvbCAqKSBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssCisJCQkJCSAgICAgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisgICAgICAodm9pZCkgbWVtc2V0IChzeW0sIDAsIHNpemVvZiAoc3RydWN0IHN5bWJvbCkpOworICAgICAgU1lNQk9MX05BTUUgKHN5bSkgPSBvYnNhdmVzdHJpbmcgKG5hbWUsIHN0cmxlbiAobmFtZSksCisJCQkJCSZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjayk7CisKKyAgICAgIC8qIEZpZ3VyZSBvdXQgd2hlcmUgaXQgbGl2ZXMuICAqLworICAgICAgaWYgKHBhcmFtcC0+ZGZwYXJhbS5yZWdwYXJhbSkKKwlTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfUkVHUEFSTTsKKyAgICAgIGVsc2UgaWYgKHBhcmFtcC0+ZGZwYXJhbS5pbmRpcmVjdCkKKwlTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfUkVGX0FSRzsKKyAgICAgIGVsc2UKKwlTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfQVJHOworICAgICAgU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9IFZBUl9OQU1FU1BBQ0U7CisgICAgICBpZiAocGFyYW1wLT5kZnBhcmFtLmNvcHlwYXJhbSkKKwl7CisJICBTWU1CT0xfVkFMVUUgKHN5bSkgPSBwYXJhbXAtPmRmcGFyYW0ubG9jYXRpb24gOworI2lmZGVmIEhQUkVBRF9BREpVU1RfU1RBQ0tfQUREUkVTUworCSAgU1lNQk9MX1ZBTFVFIChzeW0pCisJICAgICs9IEhQUkVBRF9BREpVU1RfU1RBQ0tfQUREUkVTUyAoQ1VSUkVOVF9GVU5DVElPTl9WQUxVRSAob2JqZmlsZSkpOworI2VuZGlmCisJICAvKiBUaGlzIGlzIGxpa2VseSBhIHBhc3MtYnktaW52aXNpYmxlIHJlZmVyZW5jZSBwYXJhbWV0ZXIsCisJICAgICBIYWNrIG9uIHRoZSBzeW1ib2wgY2xhc3MgdG8gbWFrZSBHREIgaGFwcHkuICAqLworICAgICAgICAgIC8qID8/cmVocmF1ZXI6IFRoaXMgYXBwZWFycyB0byBiZSBicm9rZW4gdy9yL3QgdG8gcGFzc2luZworICAgICAgICAgICAgIEMgdmFsdWVzIG9mIHR5cGUgZmxvYXQgYW5kIHN0cnVjdC4gIFBlcmhhcHMgdGhpcyBvdWdodAorICAgICAgICAgICAgIHRvIGJlIGhpZ2hpZ2h0ZWQgYXMgYSBzcGVjaWFsIGNhc2UsIGJ1dCBmb3Igbm93LCBqdXN0CisgICAgICAgICAgICAgYWxsb3dpbmcgdGhlc2UgdG8gYmUgTE9DX0FSR3Mgc2VlbXMgdG8gd29yayBmaW5lLgorICAgICAgICAgICAgICovCisjaWYgMAorCSAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX1JFR1BBUk1fQUREUjsKKyNlbmRpZgorCX0KKyAgICAgIGVsc2UKKwlTWU1CT0xfVkFMVUUgKHN5bSkgPSBwYXJhbXAtPmRmcGFyYW0ubG9jYXRpb247CisKKyAgICAgIC8qIEdldCBpdHMgdHlwZS4gICovCisgICAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IGhwcmVhZF90eXBlX2xvb2t1cCAocGFyYW1wLT5kZnBhcmFtLnR5cGUsIG9iamZpbGUpOworICAgICAgLyogQWRkIGl0IHRvIHRoZSBzeW1ib2wgbGlzdC4gICovCisgICAgICAvKiBOb3RlIDEgKFJUKSBBdCB0aGUgbW9tZW50LCBhZGRfc3ltYm9sX3RvX2xpc3QoKSBpcyBhbHNvIGJlaW5nCisgICAgICAgKiBjYWxsZWQgb24gRlBBUkFNIHN5bWJvbHMgZnJvbSB0aGUgcHJvY2Vzc19vbmVfZGVidWdfc3ltYm9sKCkKKyAgICAgICAqIGxldmVsLi4uIHNvIHBhcmFtZXRlcnMgYXJlIGdldHRpbmcgYWRkZWQgdHdpY2UhICh0aGlzIHNob3dzCisgICAgICAgKiB1cCBpbiB0aGUgc3ltYm9sIGR1bXAgeW91IGdldCBmcm9tICJtYWludCBwcmludCBzeW1ib2xzIC4uLiIpLgorICAgICAgICogTm90ZSAyIChSVCkgSSB0b29rIG91dCB0aGUgcHJvY2Vzc2luZyBvZiBGUEFSQU0gZnJvbSB0aGUgCisgICAgICAgKiBwcm9jZXNzX29uZV9kZWJ1Z19zeW1ib2woKSBsZXZlbCwgc28gYXQgdGhlIG1vbWVudCBwYXJhbWV0ZXJzIGFyZSBvbmx5CisgICAgICAgKiBiZWluZyBwcm9jZXNzZWQgaGVyZS4gVGhpcyBzZWVtcyB0byBoYXZlIG5vIGlsbCBlZmZlY3QuCisgICAgICAgKi8KKyAgICAgIC8qIE5vdGUgMyAocGFpLzE5OTctMDgtMTEpIEkgcmVtb3ZlZCB0aGUgYWRkX3N5bWJvbF90b19saXN0KCkgd2hpY2ggcHV0CisgICAgICAgICBlYWNoIGZwYXJhbSBvbiB0aGUgbG9jYWxfc3ltYm9scyBsaXN0IGZyb20gaGVyZS4gIE5vdyB3ZSB1c2UgdGhlCisgICAgICAgICBsb2NhbF9saXN0IHRvIHdoaWNoIGZwYXJhbXMgYXJlIGFkZGVkIGJlbG93LCBhbmQgc2V0IHRoZSBwYXJhbV9zeW1ib2xzCisgICAgICAgICBnbG9iYWwgdG8gcG9pbnQgdG8gdGhhdCBhdCB0aGUgZW5kIG9mIHRoaXMgcm91dGluZS4gKi8gCisgICAgICAvKiBlbHo6IEkgYWRkZWQgdGhpcyBuZXcgbGlzdCBvZiBzeW1ib2xzIHdoaWNoIGlzIGxvY2FsIHRvIHRoZSBmdW5jdGlvbi4KKyAgICAgICAgIHRoaXMgbGlzdCBpcyB0aGUgb25lIHdoaWNoIGlzIGFjdHVhbGx5IHVzZWQgdG8gYnVpbGQgdGhlIHR5cGUgZm9yIHRoZQorICAgICAgICAgZnVuY3Rpb24gcmF0aGVyIHRoYW4gdGhlIGdsb2FiYWwgbGlzdCBwb2ludGVkIHRvIGJ5IHN5bWxpc3QuCisgICAgICAgICBVc2luZyBhIGdsb2JhbCBsaXN0IHRvIGtlZXAgdHJhY2sgb2YgdGhlIHBhcmFtZXRlcnMgaXMgd3JvbmcsIGJlY2F1c2UgCisgICAgICAgICB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCByZWN1cnNpdmVseSBpZiBvbmUgcGFyYW1ldGVyIGhhcHBlbmQgdG8gYmUKKyAgICAgICAgIGEgZnVuY3Rpb24gaXRzZWxmIHdpdGggbW9yZSBwYXJhbWV0ZXJzIGluIGl0LiBBZGRpbmcgcGFyYW1ldGVycyB0byB0aGUKKyAgICAgICAgIHNhbWUgZ2xvYmFsIHN5bWJvbCBsaXN0IHdvdWxkIG5vdCB3b3JrISAgICAgIAorICAgICAgICAgQWN0dWFsbHkgaXQgZGlkIHdvcmsgaW4gY2FzZSBvZiBjYyBjb21waWxlZCBwcm9ncmFtcyB3aGVyZSB5b3UgZG8gCisgICAgICAgICBub3QgY2hlY2sgdGhlIHBhcmFtZXRlciBsaXN0cyBvZiB0aGUgYXJndW1lbnRzLiAqLyAKKyAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmbG9jYWxfbGlzdCk7CisKKyAgICB9CisKKyAgLyogSWYgdHlwZSB3YXMgcmVhZCBpbiBlYXJsaWVyLCBkb24ndCBib3RoZXIgd2l0aCBtb2RpZnlpbmcKKyAgICAgdGhlIHR5cGUgc3RydWN0ICovIAorICBpZiAoIXJlY29yZF9hcmdzKQorICAgIGdvdG8gZmluaXNoOworICAKKyAgLyogTm90ZSBob3cgbWFueSBwYXJhbWV0ZXJzIHdlIGZvdW5kLiAgKi8KKyAgVFlQRV9ORklFTERTICh0eXBlKSA9IG5zeW1zOworICBUWVBFX0ZJRUxEUyAodHlwZSkgPSAoc3RydWN0IGZpZWxkICopCisgICAgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnR5cGVfb2JzdGFjaywKKwkJICAgc2l6ZW9mIChzdHJ1Y3QgZmllbGQpICogbnN5bXMpOworCisgIC8qIEZpbmQgdGhlIHN5bWJvbHMgZm9yIHRoZSBwYXJhbWV0ZXJzIGFuZCAKKyAgICAgdXNlIHRoZW0gdG8gZmlsbCBwYXJhbWV0ZXItdHlwZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSBmdW5jdGlvbi10eXBlLgorICAgICBUaGUgcGFyYW1ldGVyIHN5bWJvbHMgY2FuIGJlIGZvdW5kIGluIHRoZSBsb2NhbF9saXN0IHRoYXQgd2UganVzdCBwdXQgdGhlbSBvbi4gKi8KKyAgLyogTm90ZSB0aGF0IHdlIHByZXNlcnZlIHRoZSBvcmRlciBvZiB0aGUgcGFyYW1ldGVycywgc28KKyAgICAgdGhhdCBpbiBzb21ldGhpbmcgbGlrZSAiZW51bSB7Rk9PLCBMQVNUX1RISU5HPUZPT30iIHdlIHByaW50CisgICAgIEZPTywgbm90IExBU1RfVEhJTkcuICAqLworICAKKyAgLyogZ2V0IHRoZSBwYXJhbWV0ZXJzIHR5cGVzIGZyb20gdGhlIGxvY2FsIGxpc3Qgbm90IHRoZSBnbG9iYWwgbGlzdAorICAgICBzbyB0aGF0IHRoZSB0eXBlIGNhbiBiZSBjb3JyZWN0bHkgY29uc3RydWN0ZWQgZm9yIGZ1bmN0aW9ucyB3aGljaAorICAgICBoYXZlIGZ1bmN0aW9uIGFzIHBhcmFtZXRlcnMgKi8KKyAgZm9yIChzeW1zID0gbG9jYWxfbGlzdCwgbiA9IDA7IHN5bXM7IHN5bXMgPSBzeW1zLT5uZXh0KQorICAgIHsKKyAgICAgIGludCBqID0gMDsKKyAgICAgIGZvciAoaj0wOyBqIDwgc3ltcy0+bnN5bXM7IGorKywgbisrKQorCXsKKwkgIHN0cnVjdCBzeW1ib2wgKnhzeW0gPSBzeW1zLT5zeW1ib2xbal07CisJICBUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIG4pID0gU1lNQk9MX05BTUUgKHhzeW0pOworCSAgVFlQRV9GSUVMRF9UWVBFICh0eXBlLCBuKSA9IFNZTUJPTF9UWVBFICh4c3ltKTsKKwkgIFRZUEVfRklFTERfQklUUE9TICh0eXBlLCBuKSA9IG47CisJICBUWVBFX0ZJRUxEX0JJVFNJWkUgKHR5cGUsIG4pID0gMDsKKwl9CisgICAgfQorICAvKiBNYXJrIGl0IGFzIGhhdmluZyBiZWVuIHByb2Nlc3NlZCAqLyAKKyAgVFlQRV9GTEFHUyAodHlwZSkgJj0gfihUWVBFX0ZMQUdfSU5DT01QTEVURSk7CisKKyAgLyogQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGZpeC11cCBhIGNsYXNzIHR5cGUgd2l0aCB0aGlzIGZ1bmN0aW9uJ3MgdHlwZSAqLworICBpZiAoZml4dXBfY2xhc3MgJiYgKGZpeHVwX21ldGhvZCA9PSB0eXBlKSkKKyAgICB7CisgICAgICBmaXh1cF9jbGFzc19tZXRob2RfdHlwZSAoZml4dXBfY2xhc3MsIGZpeHVwX21ldGhvZCwgb2JqZmlsZSk7CisgICAgICBmaXh1cF9jbGFzcyA9IE5VTEw7CisgICAgICBmaXh1cF9tZXRob2QgPSBOVUxMOworICAgIH0KKworICAvKiBTZXQgdGhlIHBhcmFtIGxpc3Qgb2YgdGhpcyBsZXZlbCBvZiB0aGUgY29udGV4dCBzdGFjaworICAgICB0byBvdXIgbG9jYWwgbGlzdC4gIERvIHRoaXMgb25seSBpZiB0aGlzIGZ1bmN0aW9uIHdhcworICAgICBjYWxsZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGJsb2NrLCBhbmQgbm90IGlmIGl0IHdhcyBjYWxsZWQKKyAgICAgc2ltcGx5IHRvIGdldCB0aGUgZnVuY3Rpb24gdHlwZS4gVGhpcyBwcmV2ZW50cyByZWN1cnNpdmUKKyAgICAgaW52b2NhdGlvbnMgZnJvbSB0cmFzaGluZyBwYXJhbV9zeW1ib2xzLiAqLworZmluaXNoOiAgCisgIGlmIChuZXdibG9jaykKKyAgICBwYXJhbV9zeW1ib2xzID0gbG9jYWxfbGlzdDsKKyAgCisgICByZXR1cm4gdHlwZTsKK30KKworCisvKiBSZWFkIGFuZCBpbnRlcm5hbGl6ZSBhIG5hdGl2ZSBET0MgZnVuY3Rpb24gZGVidWcgc3ltYm9sLiAgKi8KKy8qIFRoaXMgaXMgYWxtb3N0IGlkZW50aWNhbCB0byBocHJlYWRfcmVhZF9mdW5jdGlvbl90eXBlKCksIGV4Y2VwdAorICogZm9yIHJlZmVyZW5jZXMgdG8gZG5fYnVmcC0+ZGRvY2Z1bmMgaW5zdGVhZCBvZiBkYl9idWZwLT5kZnVuYy4KKyAqIFNpbmNlIGRlYnVnIGluZm9ybWF0aW9uIGZvciBET0MgZnVuY3Rpb25zIGlzIG1vcmUgbGlrZWx5IHRvIGJlCisgKiB2b2xhdGlsZSwgcGxlYXNlIGxlYXZlIGl0IHRoaXMgd2F5LgorICovCitzdGF0aWMgc3RydWN0IHR5cGUgKgoraHByZWFkX3JlYWRfZG9jX2Z1bmN0aW9uX3R5cGUgKGhwX3R5cGUsIGRuX2J1ZnAsIG9iamZpbGUsIG5ld2Jsb2NrKQorICAgICBkbnR0cG9pbnRlciBocF90eXBlOworICAgICB1bmlvbiBkbnR0ZW50cnkgKmRuX2J1ZnA7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBpbnQgbmV3YmxvY2s7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlLCAqdHlwZTE7CisgIHN0cnVjdCBwZW5kaW5nICpzeW1zOworICBzdHJ1Y3QgcGVuZGluZyAqbG9jYWxfbGlzdCA9IE5VTEw7CisgIGludCBuc3ltcyA9IDA7CisgIGRudHRwb2ludGVyIHBhcmFtOworICB1bmlvbiBkbnR0ZW50cnkgKnBhcmFtcDsKKyAgY2hhciAqbmFtZTsKKyAgbG9uZyBuOworICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIGludCByZWNvcmRfYXJncyA9IDE7CisKKyAgLyogU2VlIGlmIHdlJ3ZlIGFscmVhZHkgcmVhZCBpbiB0aGlzIHR5cGUuICAqLworICB0eXBlID0gaHByZWFkX2FsbG9jX3R5cGUgKGhwX3R5cGUsIG9iamZpbGUpOworICBpZiAoVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfRlVOQykKKyAgICB7CisgICAgICByZWNvcmRfYXJncyA9IDA7IC8qIGFscmVhZHkgcmVhZCBpbiwgZG9uJ3QgbW9kaWZ5IHR5cGUgKi8gCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogTm9wZSwgc28gcmVhZCBpdCBpbiBhbmQgc3RvcmUgaXQgYXdheS4gICovCisgICAgICBpZiAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX0RPQ19GVU5DVElPTiB8fAorICAgICAgICAgIGRuX2J1ZnAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9ET0NfTUVNRlVOQykKKyAgICAgICAgdHlwZTEgPSBsb29rdXBfZnVuY3Rpb25fdHlwZSAoaHByZWFkX3R5cGVfbG9va3VwIChkbl9idWZwLT5kZG9jZnVuYy5yZXR2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZmlsZSkpOworICAgICAgbWVtY3B5ICgoY2hhciAqKSB0eXBlLCAoY2hhciAqKSB0eXBlMSwgc2l6ZW9mIChzdHJ1Y3QgdHlwZSkpOworICAgICAgCisgICAgICAvKiBNYXJrIGl0IC0tIGluIHRoZSBtaWRkbGUgb2YgcHJvY2Vzc2luZyAqLyAKKyAgICAgIFRZUEVfRkxBR1MgKHR5cGUpIHw9IFRZUEVfRkxBR19JTkNPTVBMRVRFOworICAgIH0KKworICAvKiBOb3cgZXhhbWluZSBlYWNoIHBhcmFtZXRlciBub3RpbmcgaXRzIHR5cGUsIGxvY2F0aW9uLCBhbmQgYQorICAgICB3ZWFsdGggb2Ygb3RoZXIgaW5mb3JtYXRpb24uICAqLworICBpZiAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX0RPQ19GVU5DVElPTiB8fAorICAgICAgZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX0RPQ19NRU1GVU5DKQorICAgIHBhcmFtID0gZG5fYnVmcC0+ZGRvY2Z1bmMuZmlyc3RwYXJhbTsKKyAgd2hpbGUgKHBhcmFtLndvcmQgJiYgcGFyYW0ud29yZCAhPSBETlRUTklMKQorICAgIHsKKyAgICAgIHBhcmFtcCA9IGhwcmVhZF9nZXRfbG50dCAocGFyYW0uZG50dHAuaW5kZXgsIG9iamZpbGUpOworICAgICAgbnN5bXMrKzsKKyAgICAgIHBhcmFtID0gcGFyYW1wLT5kZnBhcmFtLm5leHRwYXJhbTsKKworICAgICAgLyogR2V0IHRoZSBuYW1lLiAgKi8KKyAgICAgIG5hbWUgPSBWVCAob2JqZmlsZSkgKyBwYXJhbXAtPmRmcGFyYW0ubmFtZTsKKyAgICAgIHN5bSA9IChzdHJ1Y3Qgc3ltYm9sICopIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywKKwkJCQkJICAgICBzaXplb2YgKHN0cnVjdCBzeW1ib2wpKTsKKyAgICAgICh2b2lkKSBtZW1zZXQgKHN5bSwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisgICAgICBTWU1CT0xfTkFNRSAoc3ltKSA9IG5hbWU7CisKKyAgICAgIC8qIEZpZ3VyZSBvdXQgd2hlcmUgaXQgbGl2ZXMuICAqLworICAgICAgaWYgKHBhcmFtcC0+ZGZwYXJhbS5yZWdwYXJhbSkKKwlTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfUkVHUEFSTTsKKyAgICAgIGVsc2UgaWYgKHBhcmFtcC0+ZGZwYXJhbS5pbmRpcmVjdCkKKwlTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfUkVGX0FSRzsKKyAgICAgIGVsc2UKKwlTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfQVJHOworICAgICAgU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9IFZBUl9OQU1FU1BBQ0U7CisgICAgICBpZiAocGFyYW1wLT5kZnBhcmFtLmNvcHlwYXJhbSkKKwl7CisJICBTWU1CT0xfVkFMVUUgKHN5bSkgPSBwYXJhbXAtPmRmcGFyYW0ubG9jYXRpb24gOworI2lmZGVmIEhQUkVBRF9BREpVU1RfU1RBQ0tfQUREUkVTUworCSAgU1lNQk9MX1ZBTFVFIChzeW0pCisJICAgICs9IEhQUkVBRF9BREpVU1RfU1RBQ0tfQUREUkVTUyAoQ1VSUkVOVF9GVU5DVElPTl9WQUxVRSAob2JqZmlsZSkpOworI2VuZGlmCisJICAvKiBUaGlzIGlzIGxpa2VseSBhIHBhc3MtYnktaW52aXNpYmxlIHJlZmVyZW5jZSBwYXJhbWV0ZXIsCisJICAgICBIYWNrIG9uIHRoZSBzeW1ib2wgY2xhc3MgdG8gbWFrZSBHREIgaGFwcHkuICAqLworICAgICAgICAgIC8qID8/cmVocmF1ZXI6IFRoaXMgYXBwZWFycyB0byBiZSBicm9rZW4gdy9yL3QgdG8gcGFzc2luZworICAgICAgICAgICAgIEMgdmFsdWVzIG9mIHR5cGUgZmxvYXQgYW5kIHN0cnVjdC4gIFBlcmhhcHMgdGhpcyBvdWdodAorICAgICAgICAgICAgIHRvIGJlIGhpZ2hpZ2h0ZWQgYXMgYSBzcGVjaWFsIGNhc2UsIGJ1dCBmb3Igbm93LCBqdXN0CisgICAgICAgICAgICAgYWxsb3dpbmcgdGhlc2UgdG8gYmUgTE9DX0FSR3Mgc2VlbXMgdG8gd29yayBmaW5lLgorICAgICAgICAgICAgICovCisjaWYgMAorCSAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX1JFR1BBUk1fQUREUjsKKyNlbmRpZgorCX0KKyAgICAgIGVsc2UKKwlTWU1CT0xfVkFMVUUgKHN5bSkgPSBwYXJhbXAtPmRmcGFyYW0ubG9jYXRpb247CisKKyAgICAgIC8qIEdldCBpdHMgdHlwZS4gICovCisgICAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IGhwcmVhZF90eXBlX2xvb2t1cCAocGFyYW1wLT5kZnBhcmFtLnR5cGUsIG9iamZpbGUpOworICAgICAgLyogQWRkIGl0IHRvIHRoZSBzeW1ib2wgbGlzdC4gICovCisgICAgICAvKiBOb3RlIDEgKFJUKSBBdCB0aGUgbW9tZW50LCBhZGRfc3ltYm9sX3RvX2xpc3QoKSBpcyBhbHNvIGJlaW5nCisgICAgICAgKiBjYWxsZWQgb24gRlBBUkFNIHN5bWJvbHMgZnJvbSB0aGUgcHJvY2Vzc19vbmVfZGVidWdfc3ltYm9sKCkKKyAgICAgICAqIGxldmVsLi4uIHNvIHBhcmFtZXRlcnMgYXJlIGdldHRpbmcgYWRkZWQgdHdpY2UhICh0aGlzIHNob3dzCisgICAgICAgKiB1cCBpbiB0aGUgc3ltYm9sIGR1bXAgeW91IGdldCBmcm9tICJtYWludCBwcmludCBzeW1ib2xzIC4uLiIpLgorICAgICAgICogTm90ZSAyIChSVCkgSSB0b29rIG91dCB0aGUgcHJvY2Vzc2luZyBvZiBGUEFSQU0gZnJvbSB0aGUgCisgICAgICAgKiBwcm9jZXNzX29uZV9kZWJ1Z19zeW1ib2woKSBsZXZlbCwgc28gYXQgdGhlIG1vbWVudCBwYXJhbWV0ZXJzIGFyZSBvbmx5CisgICAgICAgKiBiZWluZyBwcm9jZXNzZWQgaGVyZS4gVGhpcyBzZWVtcyB0byBoYXZlIG5vIGlsbCBlZmZlY3QuCisgICAgICAgKi8KKyAgICAgIC8qIE5vdGUgMyAocGFpLzE5OTctMDgtMTEpIEkgcmVtb3ZlZCB0aGUgYWRkX3N5bWJvbF90b19saXN0KCkgd2hpY2ggcHV0CisgICAgICAgICBlYWNoIGZwYXJhbSBvbiB0aGUgbG9jYWxfc3ltYm9scyBsaXN0IGZyb20gaGVyZS4gIE5vdyB3ZSB1c2UgdGhlCisgICAgICAgICBsb2NhbF9saXN0IHRvIHdoaWNoIGZwYXJhbXMgYXJlIGFkZGVkIGJlbG93LCBhbmQgc2V0IHRoZSBwYXJhbV9zeW1ib2xzCisgICAgICAgICBnbG9iYWwgdG8gcG9pbnQgdG8gdGhhdCBhdCB0aGUgZW5kIG9mIHRoaXMgcm91dGluZS4gKi8gCisgICAgICAgICAKKyAgICAgIC8qIGVsejogSSBhZGRlZCB0aGlzIG5ldyBsaXN0IG9mIHN5bWJvbHMgd2hpY2ggaXMgbG9jYWwgdG8gdGhlIGZ1bmN0aW9uLgorICAgICAgICAgdGhpcyBsaXN0IGlzIHRoZSBvbmUgd2hpY2ggaXMgYWN0dWFsbHkgdXNlZCB0byBidWlsZCB0aGUgdHlwZSBmb3IgdGhlCisgICAgICAgICBmdW5jdGlvbiByYXRoZXIgdGhhbiB0aGUgZ2xvYWJhbCBsaXN0IHBvaW50ZWQgdG8gYnkgc3ltbGlzdC4KKyAgICAgICAgIFVzaW5nIGEgZ2xvYmFsIGxpc3QgdG8ga2VlcCB0cmFjayBvZiB0aGUgcGFyYW1ldGVycyBpcyB3cm9uZywgYmVjYXVzZSAKKyAgICAgICAgIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHJlY3Vyc2l2ZWx5IGlmIG9uZSBwYXJhbWV0ZXIgaGFwcGVuZCB0byBiZQorICAgICAgICAgYSBmdW5jdGlvbiBpdHNlbGYgd2l0aCBtb3JlIHBhcmFtZXRlcnMgaW4gaXQuIEFkZGluZyBwYXJhbWV0ZXJzIHRvIHRoZQorICAgICAgICAgc2FtZSBnbG9iYWwgc3ltYm9sIGxpc3Qgd291bGQgbm90IHdvcmshICAgICAgCisgICAgICAgICBBY3R1YWxseSBpdCBkaWQgd29yayBpbiBjYXNlIG9mIGNjIGNvbXBpbGVkIHByb2dyYW1zIHdoZXJlIHlvdSBkbyBub3QgY2hlY2sgdGhlCisgICAgICAgICBwYXJhbWV0ZXIgbGlzdHMgb2YgdGhlIGFyZ3VtZW50cy4gICovCisgICAgICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmxvY2FsX2xpc3QpOworICAgIH0KKworICAvKiBJZiB0eXBlIHdhcyByZWFkIGluIGVhcmxpZXIsIGRvbid0IGJvdGhlciB3aXRoIG1vZGlmeWluZworICAgICB0aGUgdHlwZSBzdHJ1Y3QgKi8gCisgIGlmICghcmVjb3JkX2FyZ3MpCisgICAgZ290byBmaW5pc2g7CisgIAorICAvKiBOb3RlIGhvdyBtYW55IHBhcmFtZXRlcnMgd2UgZm91bmQuICAqLworICBUWVBFX05GSUVMRFMgKHR5cGUpID0gbnN5bXM7CisgIFRZUEVfRklFTERTICh0eXBlKSA9IChzdHJ1Y3QgZmllbGQgKikKKyAgICBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+dHlwZV9vYnN0YWNrLAorICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IGZpZWxkKSAqIG5zeW1zKTsKKworICAvKiBGaW5kIHRoZSBzeW1ib2xzIGZvciB0aGUgcGFyYW1ldGVycyBhbmQgCisgICAgIHVzZSB0aGVtIHRvIGZpbGwgcGFyYW1ldGVyLXR5cGUgaW5mb3JtYXRpb24gaW50byB0aGUgZnVuY3Rpb24tdHlwZS4KKyAgICAgVGhlIHBhcmFtZXRlciBzeW1ib2xzIGNhbiBiZSBmb3VuZCBpbiB0aGUgbG9jYWxfbGlzdCB0aGF0IHdlIGp1c3QgcHV0IHRoZW0gb24uICovCisgIC8qIE5vdGUgdGhhdCB3ZSBwcmVzZXJ2ZSB0aGUgb3JkZXIgb2YgdGhlIHBhcmFtZXRlcnMsIHNvCisgICAgIHRoYXQgaW4gc29tZXRoaW5nIGxpa2UgImVudW0ge0ZPTywgTEFTVF9USElORz1GT099IiB3ZSBwcmludAorICAgICBGT08sIG5vdCBMQVNUX1RISU5HLiAgKi8KKyAgCisgIC8qIGdldCB0aGUgcGFyYW1ldGVycyB0eXBlcyBmcm9tIHRoZSBsb2NhbCBsaXN0IG5vdCB0aGUgZ2xvYmFsIGxpc3QKKyAgICAgc28gdGhhdCB0aGUgdHlwZSBjYW4gYmUgY29ycmVjdGx5IGNvbnN0cnVjdGVkIGZvciBmdW5jdGlvbnMgd2hpY2gKKyAgICAgaGF2ZSBmdW5jdGlvbiBhcyBwYXJhbWV0ZXJzCisgICovCisgIGZvciAoc3ltcyA9IGxvY2FsX2xpc3QsIG4gPSAwOyBzeW1zOyBzeW1zID0gc3ltcy0+bmV4dCkKKyAgICB7CisgICAgICBpbnQgaiA9IDA7CisgICAgICBmb3IgKGogPSAwOyBqIDwgc3ltcy0+bnN5bXM7IGorKywgbisrKQorICAgICAgICB7CisgICAgICAgICAgc3RydWN0IHN5bWJvbCAqeHN5bSA9IHN5bXMtPnN5bWJvbFtqXTsKKyAgICAgICAgICBUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIG4pID0gU1lNQk9MX05BTUUgKHhzeW0pOworICAgICAgICAgIFRZUEVfRklFTERfVFlQRSAodHlwZSwgbikgPSBTWU1CT0xfVFlQRSAoeHN5bSk7CisgICAgICAgICAgVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIG4pID0gbjsKKyAgICAgICAgICBUWVBFX0ZJRUxEX0JJVFNJWkUgKHR5cGUsIG4pID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIC8qIE1hcmsgaXQgYXMgaGF2aW5nIGJlZW4gcHJvY2Vzc2VkICovIAorICBUWVBFX0ZMQUdTICh0eXBlKSAmPSB+KFRZUEVfRkxBR19JTkNPTVBMRVRFKTsKKworICAvKiBDaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gZml4LXVwIGEgY2xhc3MgdHlwZSB3aXRoIHRoaXMgZnVuY3Rpb24ncyB0eXBlICovCisgIGlmIChmaXh1cF9jbGFzcyAmJiAoZml4dXBfbWV0aG9kID09IHR5cGUpKQorICAgIHsKKyAgICAgIGZpeHVwX2NsYXNzX21ldGhvZF90eXBlIChmaXh1cF9jbGFzcywgZml4dXBfbWV0aG9kLCBvYmpmaWxlKTsKKyAgICAgIGZpeHVwX2NsYXNzID0gTlVMTDsKKyAgICAgIGZpeHVwX21ldGhvZCA9IE5VTEw7CisgICAgfQorCisgIC8qIFNldCB0aGUgcGFyYW0gbGlzdCBvZiB0aGlzIGxldmVsIG9mIHRoZSBjb250ZXh0IHN0YWNrCisgICAgIHRvIG91ciBsb2NhbCBsaXN0LiAgRG8gdGhpcyBvbmx5IGlmIHRoaXMgZnVuY3Rpb24gd2FzCisgICAgIGNhbGxlZCBmb3IgY3JlYXRpbmcgYSBuZXcgYmxvY2ssIGFuZCBub3QgaWYgaXQgd2FzIGNhbGxlZAorICAgICBzaW1wbHkgdG8gZ2V0IHRoZSBmdW5jdGlvbiB0eXBlLiBUaGlzIHByZXZlbnRzIHJlY3Vyc2l2ZQorICAgICBpbnZvY2F0aW9ucyBmcm9tIHRyYXNoaW5nIHBhcmFtX3N5bWJvbHMuICovCitmaW5pc2g6ICAKKyAgaWYgKG5ld2Jsb2NrKQorICAgIHBhcmFtX3N5bWJvbHMgPSBsb2NhbF9saXN0OworICAKKyAgcmV0dXJuIHR5cGU7Cit9CisKKworCisvKiBBIGZpbGUtbGV2ZWwgdmFyaWFibGUgd2hpY2gga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQtdGVtcGxhdGUKKyAqIGJlaW5nIHByb2Nlc3NlZC4gU2V0IGluIGhwcmVhZF9yZWFkX3N0cnVjdF90eXBlKCkgd2hpbGUgcHJvY2Vzc2luZworICogYSB0ZW1wbGF0ZSB0eXBlLiBSZWZlcnJlZCB0byBpbiBocHJlYWRfZ2V0X250aF90ZW1wbF9hcmcoKS4KKyAqIFllcywgdGhpcyBpcyBhIGtsdWRnZSwgYnV0IGl0IGFyaXNlcyBmcm9tIHRoZSBrbHVkZ2UgdGhhdCBhbHJlYWR5CisgKiBleGlzdHMgaW4gc3ltdGFiLmgsIG5hbWVseSB0aGUgZmFjdCB0aGF0IHRoZXkgZW5jb2RlCisgKiAidGVtcGxhdGUgYXJndW1lbnQgbiIgd2l0aCBmdW5kYW1lbnRhbCB0eXBlIEZUX1RFTVBMQVRFX0FSRyBhbmQKKyAqIGJpdGxlbmd0aCBuLiBUaGlzIG1lYW5zIHRoYXQgZGVlcCBpbiBwcm9jZXNzaW5nIGZ1bmRhbWVudGFsIHR5cGVzCisgKiBJIG5lZWQgdG8gYXNrIHRoZSBxdWVzdGlvbiAid2hhdCB0ZW1wbGF0ZSBhbSBJIGluIHRoZSBtaWRkbGUgb2Y/Ii4KKyAqIFRoZSBhbHRlcm5hdGl2ZSB0byBzdHVmZmluZyBhIGdsb2JhbCB3b3VsZCBiZSB0byBwYXNzIGFuIGFyZ3VtZW50CisgKiBkb3duIHRoZSBjaGFpbiBvZiBjYWxscyBqdXN0IGZvciB0aGlzIHB1cnBvc2UuCisgKiAKKyAqIFRoZXJlIG1heSBiZSBwcm9ibGVtcyBoYW5kbGluZyBuZXN0ZWQgdGVtcGxhdGVzLi4uIHRvdWdoLgorICovCitzdGF0aWMgc3RydWN0IHR5cGUgKiBjdXJyZW50X3RlbXBsYXRlID0gTlVMTDsKKworLyogUmVhZCBpbiBhbmQgaW50ZXJuYWxpemUgYSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4gIAorICogVGhpcyBzYW1lIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBzdHJ1Y3QsIHVuaW9uLCBhbmQgY2xhc3MgdHlwZXMuCisgKiBBbHNvIGNhbGxlZCBmb3IgdGVtcGxhdGVzLCBzaW5jZSB0aGV5IGJ1aWxkIGEgdmVyeSBzaW1pbGFyCisgKiB0eXBlIGVudHJ5IGFzIGZvciBjbGFzcyB0eXBlcy4KKyAqLworCitzdGF0aWMgc3RydWN0IHR5cGUgKgoraHByZWFkX3JlYWRfc3RydWN0X3R5cGUgKGhwX3R5cGUsIGRuX2J1ZnAsIG9iamZpbGUpCisgICAgIGRudHRwb2ludGVyIGhwX3R5cGU7CisgICAgIHVuaW9uIGRudHRlbnRyeSAqZG5fYnVmcDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIC8qIFRoZSBkYXRhIG1lbWJlcnMgZ2V0IGxpbmtlZCB0b2dldGhlciBpbnRvIGEgbGlzdCBvZiBzdHJ1Y3QgbmV4dGZpZWxkJ3MgKi8KKyAgc3RydWN0IG5leHRmaWVsZAorICAgIHsKKyAgICAgIHN0cnVjdCBuZXh0ZmllbGQgKm5leHQ7CisgICAgICBzdHJ1Y3QgZmllbGQgZmllbGQ7CisgICAgICB1bnNpZ25lZCBjaGFyIGF0dHJpYnV0ZXM7IC8qIHN0b3JlIHZpc2liaWxpdHkgYW5kIHZpcnR1YWxpdHkgaW5mbyAqLworIyAgICAgZGVmaW5lIEFUVFJfVklSVFVBTCAxICAgICAgCisjICAgICBkZWZpbmUgQVRUUl9QUklWQVRFIDIgICAgICAKKyMgICAgIGRlZmluZSBBVFRSX1BST1RFQ1QgMyAgICAgIAorICAgIH07CisKKworICAvKiBUaGUgbWV0aG9kcyBnZXQgbGlua2VkIHRvZ2V0aGVyIGludG8gYSBsaXN0IG9mIHN0cnVjdCBuZXh0X2ZuX2ZpZWxkJ3MgKi8KKyAgc3RydWN0IG5leHRfZm5fZmllbGQKKyAgICB7CisgICAgICBzdHJ1Y3QgbmV4dF9mbl9maWVsZCAqbmV4dDsKKyAgICAgIHN0cnVjdCBmbl9maWVsZGxpc3QgZmllbGQ7CisgICAgICBzdHJ1Y3QgZm5fZmllbGQgZm5fZmllbGQ7CisgICAgICBpbnQgbnVtX2ZuX2ZpZWxkczsKKyAgICAgfTsKKworICAvKiBUaGUgdGVtcGxhdGUgYXJncyBnZXQgbGlua2VkIHRvZ2V0aGVyIGludG8gYSBsaXN0IG9mIHN0cnVjdCBuZXh0X3RlbXBsYXRlJ3MgKi8KKyAgc3RydWN0IG5leHRfdGVtcGxhdGUKKyAgICB7CisgICAgICBzdHJ1Y3QgbmV4dF90ZW1wbGF0ZSAqbmV4dDsKKyAgICAgIHN0cnVjdCB0ZW1wbGF0ZV9hcmcgYXJnOworICAgIH07CisKKyAgLyogVGhlIHRlbXBsYXRlIGluc3RhbnRpYXRpb25zIGdldCBsaW5rZWQgdG9nZXRoZXIgaW50byBhIGxpc3Qgb2YgdGhlc2UuLi4gKi8KKyAgc3RydWN0IG5leHRfaW5zdGFudGlhdGlvbiAKKyAgICB7CisgICAgICBzdHJ1Y3QgbmV4dF9pbnN0YW50aWF0aW9uICogbmV4dDsKKyAgICAgIHN0cnVjdCB0eXBlICogdDsKKyAgICB9OworCisgIHN0cnVjdCB0eXBlICp0eXBlOworICBzdHJ1Y3QgdHlwZSAqYmFzZWNsYXNzOworICBzdHJ1Y3QgdHlwZSAqbWVtdHlwZTsKKyAgc3RydWN0IG5leHRmaWVsZCAqbGlzdCA9IDAsICp0bXBfbGlzdCA9IDA7CisgIHN0cnVjdCBuZXh0X2ZuX2ZpZWxkICpmbl9saXN0ID0gMDsKKyAgc3RydWN0IG5leHRfZm5fZmllbGQgKmZuX3A7CisgIHN0cnVjdCBuZXh0X3RlbXBsYXRlICp0X25ldywgKnRfbGlzdCA9IDA7CisgIHN0cnVjdCBuZXh0ZmllbGQgKm5ldzsKKyAgc3RydWN0IG5leHRfZm5fZmllbGQgKmZuX25ldzsKKyAgc3RydWN0IG5leHRfaW5zdGFudGlhdGlvbiAqaV9uZXcsICppX2xpc3QgPSAwOworICBpbnQgbiwgbmZpZWxkcyA9IDAsIG5fZm5fZmllbGRzID0gMCwgbl9mbl9maWVsZHNfdG90YWwgPSAwOworICBpbnQgbl9iYXNlX2NsYXNzZXMgPSAwLCBuX3RlbXBsX2FyZ3MgPSAwOworICBpbnQgbmluc3RhbnRpYXRpb25zID0gMDsKKyAgZG50dHBvaW50ZXIgZmllbGQsIGZuX2ZpZWxkLCBwYXJlbnQ7CisgIHVuaW9uIGRudHRlbnRyeSAqZmllbGRwLCAqZm5fZmllbGRwLCAqcGFyZW50cDsKKyAgaW50IGk7CisgIGludCBzdGF0aWNfbWVtYmVyID0gMDsKKyAgaW50IGNvbnN0X21lbWJlciA9IDA7CisgIGludCB2b2xhdGlsZV9tZW1iZXIgPSAwOworICB1bnNpZ25lZCBsb25nIHZ0Ymxfb2Zmc2V0OworICBpbnQgbmVlZF9iaXR2ZWN0b3JzID0gMDsKKyAgY2hhciAqIG1ldGhvZF9uYW1lID0gTlVMTDsKKyAgY2hhciAqIG1ldGhvZF9hbGlhcyA9IE5VTEw7CisgIAorCisgIC8qIElzIGl0IHNvbWV0aGluZyB3ZSd2ZSBhbHJlYWR5IGRlYWx0IHdpdGg/ICAqLworICB0eXBlID0gaHByZWFkX2FsbG9jX3R5cGUgKGhwX3R5cGUsIG9iamZpbGUpOworICBpZiAoKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1NUUlVDVCkgfHwKKyAgICAgIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9VTklPTikgfHwKKyAgICAgIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9DTEFTUykgfHwKKyAgICAgIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9URU1QTEFURSkpCisgICAgICByZXR1cm4gdHlwZTsKKworICAvKiBHZXQgdGhlIGJhc2ljIHR5cGUgY29ycmVjdC4gICovCisgIGlmIChkbl9idWZwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfU1RSVUNUKQorICAgIHsKKyAgICAgIFRZUEVfQ09ERSAodHlwZSkgPSBUWVBFX0NPREVfU1RSVUNUOworICAgICAgVFlQRV9MRU5HVEggKHR5cGUpID0gZG5fYnVmcC0+ZHN0cnVjdC5iaXRsZW5ndGggLyA4OworICAgIH0KKyAgZWxzZSBpZiAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX1VOSU9OKQorICAgIHsKKyAgICAgIFRZUEVfQ09ERSAodHlwZSkgPSBUWVBFX0NPREVfVU5JT047CisgICAgICBUWVBFX0xFTkdUSCAodHlwZSkgPSBkbl9idWZwLT5kdW5pb24uYml0bGVuZ3RoIC8gODsKKyAgICB9CisgIGVsc2UgaWYgKGRuX2J1ZnAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9DTEFTUykKKyAgICB7CisgICAgICBUWVBFX0NPREUgKHR5cGUpID0gVFlQRV9DT0RFX0NMQVNTOyAKKyAgICAgIFRZUEVfTEVOR1RIICh0eXBlKSA9IGRuX2J1ZnAtPmRjbGFzcy5iaXRsZW5ndGggLyA4OworCisgICAgICAvKiBPdmVycmlkZXMgdGhlIFRZUEVfQ1BMVVNfU1BFQ0lGSUModHlwZSkgd2l0aCBhbGxvY2F0ZWQgbWVtb3J5CisgICAgICAgKiByYXRoZXIgdGhhbiAmY3BsdXNfc3RydWN0X2RlZmF1bHQuCisgICAgICAgKi8KKyAgICAgIGFsbG9jYXRlX2NwbHVzX3N0cnVjdF90eXBlKHR5cGUpOworCisgICAgICAvKiBGaWxsIGluIGRlY2xhcmVkLXR5cGUuCisgICAgICAgKiAoVGhlIEMrKyBjb21waWxlciB3aWxsIGVtaXQgVFlQRV9DT0RFX0NMQVNTIAorICAgICAgICogZm9yIGFsbCAzIG9mICJjbGFzcyIsICJzdHJ1Y3QiCisgICAgICAgKiAidW5pb24iLCBhbmQgd2UgaGF2ZSB0byBsb29rIGF0IHRoZSAiY2xhc3NfZGVjbCIgZmllbGQgaWYgd2UKKyAgICAgICAqIHdhbnQgdG8ga25vdyBob3cgaXQgd2FzIHJlYWxseSBkZWNsYXJlZCkKKyAgICAgICAqLworICAgICAgLyogKDA9PWNsYXNzLCAxPT11bmlvbiwgMj09c3RydWN0KSAqLworICAgICAgVFlQRV9ERUNMQVJFRF9UWVBFKHR5cGUpID0gZG5fYnVmcC0+ZGNsYXNzLmNsYXNzX2RlY2w7CisgICAgfQorICBlbHNlIGlmIChkbl9idWZwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfVEVNUExBVEUpCisgICAgeworICAgICAgLyogR2V0IHRoZSBiYXNpYyB0eXBlIGNvcnJlY3QuICAqLworICAgICAgVFlQRV9DT0RFICh0eXBlKSA9IFRZUEVfQ09ERV9URU1QTEFURTsgCisgICAgICBhbGxvY2F0ZV9jcGx1c19zdHJ1Y3RfdHlwZSh0eXBlKTsKKyAgICAgIFRZUEVfREVDTEFSRURfVFlQRSh0eXBlKSA9IERFQ0xBUkVEX1RZUEVfVEVNUExBVEU7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIHR5cGU7CisKKworICBUWVBFX0ZMQUdTICh0eXBlKSAmPSB+VFlQRV9GTEFHX1NUVUI7CisKKyAgLyogRm9yIGNsYXNzZXMsIHJlYWQgdGhlIHBhcmVudCBsaXN0LgorICAgKiBRdWVzdGlvbiAoUlQpOiBEbyB3ZSBuZWVkIHRvIGRvIHRoaXMgZm9yIHRlbXBsYXRlcyBhbHNvPworICAgKi8KKyAgaWYgKGRuX2J1ZnAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9DTEFTUykgeworCisgICAgLyogRmlyc3QgcmVhZCB0aGUgcGFyZW50LWxpc3QgKGNsYXNzZXMgZnJvbSB3aGljaCB3ZSBkZXJpdmUgZmllbGRzKSAqLworICAgIHBhcmVudCA9IGRuX2J1ZnAtPmRjbGFzcy5wYXJlbnRsaXN0OworICAgIHdoaWxlIChwYXJlbnQud29yZCAmJiBwYXJlbnQud29yZCAhPSBETlRUTklMKSB7CisgICAgICBwYXJlbnRwID0gaHByZWFkX2dldF9sbnR0IChwYXJlbnQuZG50dHAuaW5kZXgsIG9iamZpbGUpOworCisgICAgICAvKiAicGFyZW50cCIgc2hvdWxkIHBvaW50IHRvIGEgRE5UVF9UWVBFX0lOSEVSSVRBTkNFIHJlY29yZCAqLworCisgICAgICAvKiBHZXQgc3BhY2UgdG8gcmVjb3JkIHRoZSBuZXh0IGZpZWxkL2RhdGEtbWVtYmVyLiAqLworICAgICAgbmV3ID0gKHN0cnVjdCBuZXh0ZmllbGQgKikgYWxsb2NhIChzaXplb2YgKHN0cnVjdCBuZXh0ZmllbGQpKTsKKyAgICAgIG5ldy0+bmV4dCA9IGxpc3Q7CisgICAgICBsaXN0ID0gbmV3OworCisgICAgICBGSUVMRF9CSVRTSVpFIChsaXN0LT5maWVsZCkgPSAwOworCisgICAgICAvKiBUaGUgImNsYXNzbmFtZSIgZmllbGQgaXMgYWN0dWFsbHkgYSBETlRUIHBvaW50ZXIgdG8gdGhlIGJhc2UgY2xhc3MgKi8KKyAgICAgIGJhc2VjbGFzcyA9IGhwcmVhZF90eXBlX2xvb2t1cCAocGFyZW50cC0+ZGluaGVyaXRhbmNlLmNsYXNzbmFtZSwgCisgIAkJCQkJICAgICBvYmpmaWxlKTsKKyAgICAgIEZJRUxEX1RZUEUgKGxpc3QtPmZpZWxkKSA9IGJhc2VjbGFzczsKKworICAgICAgbGlzdC0+ZmllbGQubmFtZSA9IHR5cGVfbmFtZV9ub190YWcoRklFTERfVFlQRSAobGlzdC0+ZmllbGQpKTsKKworICAgICAgbGlzdC0+YXR0cmlidXRlcyA9IDA7CisKKyAgICAgIC8qIENoZWNrIGZvciB2aXJ0dWFsaXR5IG9mIGJhc2UsIGFuZCBzZXQgdGhlCisgICAgICAgKiBvZmZzZXQgb2YgdGhlIGJhc2Ugc3Vib2JqZWN0IHdpdGhpbiB0aGUgb2JqZWN0LgorICAgICAgICogKE9mZnNldCBzZXQgdG8gLTEgZm9yIHZpcnR1YWwgYmFzZXMgKGZvciBub3cpLikKKyAgICAgICAqLworICAgICAgaWYgKHBhcmVudHAtPmRpbmhlcml0YW5jZS5WaXJ0dWFsKQorICAgICAgICB7CisJICBCX1NFVCgmKGxpc3QtPmF0dHJpYnV0ZXMpLCBBVFRSX1ZJUlRVQUwpOworICAgICAgICAgIHBhcmVudHAtPmRpbmhlcml0YW5jZS5vZmZzZXQgPSAtMTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBGSUVMRF9CSVRQT1MgKGxpc3QtPmZpZWxkKSA9IHBhcmVudHAtPmRpbmhlcml0YW5jZS5vZmZzZXQ7CisKKyAgICAgIC8qIENoZWNrIHZpc2liaWxpdHkgKi8KKyAgICAgIHN3aXRjaCAocGFyZW50cC0+ZGluaGVyaXRhbmNlLnZpc2liaWxpdHkpCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBCX1NFVCgmKGxpc3QtPmF0dHJpYnV0ZXMpLCBBVFRSX1BST1RFQ1QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgQl9TRVQoJihsaXN0LT5hdHRyaWJ1dGVzKSwgQVRUUl9QUklWQVRFKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAKKyAgICAgIG5fYmFzZV9jbGFzc2VzKys7CisgICAgICBuZmllbGRzKys7CisKKyAgICAgIHBhcmVudCA9IHBhcmVudHAtPmRpbmhlcml0YW5jZS5uZXh0OworICAgIH0KKyAgfQorCisgIC8qIEZvciB0ZW1wbGF0ZXMsIHJlYWQgdGhlIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QuCisgICAqIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBtZW1iZXIgbGlzdCwgYmVjYXVzZQorICAgKiB0aGUgbWVtYmVyIGxpc3QgbWF5IHJlZmVyIGJhY2sgdG8gdGhpcy4gRS5nLjoKKyAgICogICB0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPiBjbGFzcyBxMiB7CisgICAqICAgICBwdWJsaWM6CisgICAqICAgICBUMSBhOworICAgKiAgICAgVDIgYjsKKyAgICogICB9OworICAgKiBXZSBuZWVkIHRvIHJlYWQgdGhlIGFyZ3VtZW50IGxpc3QgIlQxIiwgIlQyIiBmaXJzdC4KKyAgICovCisgIGlmIChkbl9idWZwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfVEVNUExBVEUpIHsKKyAgICAvKiBLbHVkZ2UgYWxlcnQ6IFRoaXMgc3R1ZmZzIGEgZ2xvYmFsICJjdXJyZW50X3RlbXBsYXRlIiB3aGljaAorICAgICAqIGlzIHJlZmVycmVkIHRvIGJ5IGhwcmVhZF9nZXRfbnRoX3RlbXBsX2FyZygpLiBUaGUgZ2xvYmFsCisgICAgICogaXMgY2xlYXJlZCBhdCB0aGUgZW5kIG9mIHRoaXMgcm91dGluZS4KKyAgICAgKi8KKyAgICBjdXJyZW50X3RlbXBsYXRlID0gdHlwZTsKKworICAgIC8qIFJlYWQgaW4gdGhlIGFyZ3VtZW50IGxpc3QgKi8KKyAgICBmaWVsZCA9IGRuX2J1ZnAtPmR0ZW1wbGF0ZS5hcmdsaXN0OworICAgIHdoaWxlIChmaWVsZC53b3JkICYmIGZpZWxkLndvcmQgIT0gRE5UVE5JTCkgeworICAgICAgLyogR2V0IHRoaXMgdGVtcGxhdGUgYXJndW1lbnQqLworICAgICAgZmllbGRwID0gaHByZWFkX2dldF9sbnR0IChmaWVsZC5kbnR0cC5pbmRleCwgb2JqZmlsZSk7CisgICAgICBpZiAoZmllbGRwLT5kYmxvY2sua2luZCAhPSBETlRUX1RZUEVfVEVNUExBVEVfQVJHKQorICAgICAgICB7CisgICAgICAgICAgd2FybmluZyAoIkludmFsaWQgZGVidWcgaW5mbzogVGVtcGxhdGUgYXJndW1lbnQgZW50cnkgaXMgb2Ygd3Jvbmcga2luZCIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAvKiBCdW1wIHRoZSBjb3VudCAqLyAKKyAgICAgIG5fdGVtcGxfYXJncysrOworICAgICAgLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gYSBzdHJ1Y3QgbmV4dF90ZW1wbGF0ZSAqLworICAgICAgdF9uZXcgPSAoc3RydWN0IG5leHRfdGVtcGxhdGUgKikgYWxsb2NhIChzaXplb2YgKHN0cnVjdCBuZXh0X3RlbXBsYXRlKSk7CisgICAgICB0X25ldy0+bmV4dCA9IHRfbGlzdDsKKyAgICAgIHRfbGlzdCA9IHRfbmV3OworICAgICAgdF9saXN0LT5hcmcubmFtZSA9IFZUIChvYmpmaWxlKSArIGZpZWxkcC0+ZHRlbXBsX2FyZy5uYW1lOworICAgICAgdF9saXN0LT5hcmcudHlwZSA9IGhwcmVhZF9yZWFkX3RlbXBsX2FyZ190eXBlKGZpZWxkLCBmaWVsZHAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamZpbGUsIHRfbGlzdC0+YXJnLm5hbWUpOworICAgICAgLyogV2FsayB0byB0aGUgbmV4dCB0ZW1wbGF0ZSBhcmd1bWVudCAqLworICAgICAgZmllbGQgPSBmaWVsZHAtPmR0ZW1wbF9hcmcubmV4dGFyZzsKKyAgICB9CisgIH0KKworICBUWVBFX05URU1QTEFURV9BUkdTKHR5cGUpID0gbl90ZW1wbF9hcmdzOworCisgIGlmIChuX3RlbXBsX2FyZ3MgPiAwKQorICAgIFRZUEVfVEVNUExBVEVfQVJHUyh0eXBlKSA9IChzdHJ1Y3QgdGVtcGxhdGVfYXJnICopCisgICAgICBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+dHlwZV9vYnN0YWNrLCBzaXplb2YgKHN0cnVjdCB0ZW1wbGF0ZV9hcmcpICogbl90ZW1wbF9hcmdzKTsKKyAgZm9yIChuID0gbl90ZW1wbF9hcmdzOyB0X2xpc3Q7IHRfbGlzdCA9IHRfbGlzdC0+bmV4dCkKKyAgICB7CisgICAgICBuIC09IDE7CisgICAgICBUWVBFX1RFTVBMQVRFX0FSRyh0eXBlLCBuKSA9IHRfbGlzdC0+YXJnOworICAgIH0KKworICAvKiBOZXh0IHJlYWQgaW4gYW5kIGludGVybmFsaXplIGFsbCB0aGUgZmllbGRzL21lbWJlcnMuICAqLworICBpZiAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX1NUUlVDVCkKKyAgICBmaWVsZCA9IGRuX2J1ZnAtPmRzdHJ1Y3QuZmlyc3RmaWVsZDsKKyAgZWxzZSBpZiAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX1VOSU9OKQorICAgIGZpZWxkID0gZG5fYnVmcC0+ZHVuaW9uLmZpcnN0ZmllbGQ7CisgIGVsc2UgaWYgKGRuX2J1ZnAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9DTEFTUykKKyAgICBmaWVsZCA9IGRuX2J1ZnAtPmRjbGFzcy5tZW1iZXJsaXN0OworICBlbHNlIGlmIChkbl9idWZwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfVEVNUExBVEUpCisgICAgZmllbGQgPSBkbl9idWZwLT5kdGVtcGxhdGUubWVtYmVybGlzdDsKKyAgZWxzZQorICAgIGZpZWxkLndvcmQgPSBETlRUTklMOworCisgIHdoaWxlIChmaWVsZC53b3JkICYmIGZpZWxkLndvcmQgIT0gRE5UVE5JTCkKKyAgICB7CisgICAgICBmaWVsZHAgPSBocHJlYWRfZ2V0X2xudHQgKGZpZWxkLmRudHRwLmluZGV4LCBvYmpmaWxlKTsKKworICAgICAgLyogQXQgdGhpcyBwb2ludCAiZmllbGRwIiBtYXkgcG9pbnQgdG8gZWl0aGVyIGEgRE5UVF9UWVBFX0ZJRUxECisgICAgICAgKiBvciBhIEROVFRfVFlQRV9HRU5GSUVMRCByZWNvcmQuIAorICAgICAgICovCisgICAgICB2dGJsX29mZnNldCA9IDA7CisgICAgICBzdGF0aWNfbWVtYmVyID0gMDsKKyAgICAgIGNvbnN0X21lbWJlciA9IDA7CisgICAgICB2b2xhdGlsZV9tZW1iZXIgPSAwOworICAgICAgIAorICAgICAgaWYgKGZpZWxkcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX0dFTkZJRUxEKSB7CisKKyAgICAgICAgLyogVGhlIHR5cGUgd2lsbCBiZSBHRU5GSUVMRCBpZiB0aGUgZmllbGQgaXMgYSBtZXRob2Qgb3IKKyAgICAgICAgICogYSBzdGF0aWMgbWVtYmVyIChvciBzb21lIG90aGVyIGNhc2VzIC0tIHNlZSBiZWxvdykKKyAgICAgICAgICovCisKKyAgICAgICAgLyogRm9sbG93IGEgbGluayB0byBnZXQgdG8gdGhlIHJlY29yZCBmb3IgdGhlIGZpZWxkLiAqLworICAgICAgICBmbl9maWVsZCA9IGZpZWxkcC0+ZGdlbmZpZWxkLmZpZWxkOworICAgICAgICBmbl9maWVsZHAgPSBocHJlYWRfZ2V0X2xudHQoZm5fZmllbGQuZG50dHAuaW5kZXgsIG9iamZpbGUpOworCisgICAgICAgIC8qIFZpcnR1YWwgZnVuY3MgYXJlIGluZGljYXRlZCBieSBhIFZGVU5DIHdoaWNoIHBvaW50cyB0byB0aGUKKyAgICAgICAgICogcmVhbCBlbnRyeQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGZuX2ZpZWxkcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX1ZGVU5DKSB7CisgICAgICAgICAgdnRibF9vZmZzZXQgPSBmbl9maWVsZHAtPmR2ZnVuYy52dGJsX29mZnNldDsKKyAgICAgICAgICBmbl9maWVsZCA9IGZuX2ZpZWxkcC0+ZHZmdW5jLmZ1bmNwdHI7CisgICAgICAgICAgZm5fZmllbGRwID0gaHByZWFkX2dldF9sbnR0KGZuX2ZpZWxkLmRudHRwLmluZGV4LCBvYmpmaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEEgZnVuY3Rpb24ncyBlbnRyeSBtYXkgYmUgcHJlY2VkZWQgYnkgYSBtb2RpZmllciB3aGljaAorICAgICAgICAgKiBsYWJlbHMgaXQgc3RhdGljL2NvbnN0YW50L3ZvbGF0aWxlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGZuX2ZpZWxkcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX01PRElGSUVSKSB7CisgICAgICAgICAgc3RhdGljX21lbWJlciA9IGZuX2ZpZWxkcC0+ZG1vZGlmaWVyLm1fc3RhdGljOworICAgICAgICAgIGNvbnN0X21lbWJlciA9IGZuX2ZpZWxkcC0+ZG1vZGlmaWVyLm1fY29uc3Q7CisgICAgICAgICAgdm9sYXRpbGVfbWVtYmVyID0gZm5fZmllbGRwLT5kbW9kaWZpZXIubV92b2xhdGlsZTsKKyAgICAgICAgICBmbl9maWVsZCA9IGZuX2ZpZWxkcC0+ZG1vZGlmaWVyLnR5cGU7CisgICAgICAgICAgZm5fZmllbGRwID0gaHByZWFkX2dldF9sbnR0KGZuX2ZpZWxkLmRudHRwLmluZGV4LCBvYmpmaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIG1ldGhvZCAqLworICAgICAgICBpZiAoKGZuX2ZpZWxkcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX01FTUZVTkMpIHx8CisgICAgICAgICAgICAoZm5fZmllbGRwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfRlVOQ1RJT04pIHx8CisgICAgICAgICAgICAoZm5fZmllbGRwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfRE9DX01FTUZVTkMpIHx8CisgICAgICAgICAgICAoZm5fZmllbGRwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfRE9DX0ZVTkNUSU9OKSkgeworICAgICAgICAgIC8qIE1ldGhvZCBmb3VuZCAqLworCisgICAgICAgICAgc2hvcnQgaXggPSAwOworCisgICAgICAgICAgLyogTG9vayB1cCBmdW5jdGlvbiB0eXBlIG9mIG1ldGhvZCAqLworCSAgbWVtdHlwZSA9IGhwcmVhZF90eXBlX2xvb2t1cCAoZm5fZmllbGQsIG9iamZpbGUpOworCisgICAgICAgICAgLyogTWV0aG9kcyBjYW4gYmUgc2VlbiBiZWZvcmUgY2xhc3NlcyBpbiB0aGUgU09NIHJlY29yZHMuCisgICAgICAgICAgICAgSWYgd2UgYXJlIHByb2Nlc3NpbmcgdGhpcyBjbGFzcyBiZWNhdXNlIGl0J3MgYSBwYXJhbWV0ZXIgb2YgYQorICAgICAgICAgICAgIG1ldGhvZCwgYXQgdGhpcyBwb2ludCB0aGUgbWV0aG9kJ3MgdHlwZSBpcyBhY3R1YWxseSBpbmNvbXBsZXRlOworICAgICAgICAgICAgIHdlJ2xsIGhhdmUgdG8gZml4IGl0IHVwIGxhdGVyOyBtYXJrIHRoZSBjbGFzcyBmb3IgdGhpcy4gKi8gCisgICAgICAgICAgICAgCisgICAgICAgICAgaWYgKFRZUEVfSU5DT01QTEVURSAobWVtdHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFRZUEVfRkxBR1MgKHR5cGUpIHw9IFRZUEVfRkxBR19JTkNPTVBMRVRFOworICAgICAgICAgICAgICBpZiAoZml4dXBfY2xhc3MpCisgICAgICAgICAgICAgICAgd2FybmluZyAoIlR3byBjbGFzc2VzIHRvIGZpeCB1cCBmb3IgbWV0aG9kPz8gIFR5cGUgaW5mb3JtYXRpb24gbWF5IGJlIGluY29ycmVjdCBmb3Igc29tZSBjbGFzc2VzLiIpOworICAgICAgICAgICAgICBpZiAoZml4dXBfbWV0aG9kKQorICAgICAgICAgICAgICAgIHdhcm5pbmcgKCJUd28gbWV0aG9kcyB0byBiZSBmaXhlZCB1cCBhdCBvbmNlPz8gVHlwZSBpbmZvcm1hdGlvbiBtYXkgYmUgaW5jb3JyZWN0IGZvciBzb21lIGNsYXNzZXMuIik7CisgICAgICAgICAgICAgIGZpeHVwX2NsYXNzID0gdHlwZTsgICAgIC8qIHJlbWVtYmVyIHRoaXMgY2xhc3MgaGFzIHRvIGJlIGZpeGVkIHVwICovCisgICAgICAgICAgICAgIGZpeHVwX21ldGhvZCA9IG1lbXR5cGU7IC8qIHJlbWVtYmVyIHRoZSBtZXRob2QgdHlwZSB0byBiZSB1c2VkIGluIGZpeHVwICovIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgLyogSFAgYUNDIGdlbmVyYXRlcyBvcGVyYXRvciBuYW1lcyB3aXRob3V0IHRoZSAib3BlcmF0b3IiIGtleXdvcmQsIGFuZAorICAgICAgICAgICAgIGdlbmVyYXRlcyBudWxsIHN0cmluZ3MgYXMgbmFtZXMgZm9yIG9wZXJhdG9ycyB0aGF0IGFyZSAKKyAgICAgICAgICAgICB1c2VyLWRlZmluZWQgdHlwZSBjb252ZXJzaW9ucyB0byBiYXNpYyB0eXBlcyAoZS5nLiBvcGVyYXRvciBpbnQgKCkpLgorICAgICAgICAgICAgIFNvIHRyeSB0byByZWNvbnN0cnVjdCBuYW1lIGFzIGJlc3QgYXMgcG9zc2libGUuICovCisKKyAgICAgICAgICBtZXRob2RfbmFtZSA9IChjaGFyICopIChWVCAob2JqZmlsZSkgKyBmbl9maWVsZHAtPmRmdW5jLm5hbWUpOworICAgICAgICAgIG1ldGhvZF9hbGlhcyA9IChjaGFyICopIChWVCAob2JqZmlsZSkgKyBmbl9maWVsZHAtPmRmdW5jLmFsaWFzKTsKKworICAgICAgICAgIGlmICghbWV0aG9kX25hbWUgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gbmFtZSAqLyAKKyAgICAgICAgICAgICAgISptZXRob2RfbmFtZSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9yIG51bGwgbmFtZSAqLyAKKyAgICAgICAgICAgICAgY3BsdXNfbWFuZ2xlX29wbmFtZSAobWV0aG9kX25hbWUsIERNR0xfQU5TSSkpIC8qIG9yIG5hbWUgaXMgYW4gb3BlcmF0b3IgbGlrZSAiPCIgKi8gCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNoYXIgKiB0bXBfbmFtZSA9IGNwbHVzX2RlbWFuZ2xlIChtZXRob2RfYWxpYXMsIERNR0xfQU5TSSk7CisgICAgICAgICAgICAgIGNoYXIgKiBvcF9zdHJpbmcgPSBzdHJzdHIgKHRtcF9uYW1lLCAib3BlcmF0b3IiKTsKKyAgICAgICAgICAgICAgbWV0aG9kX25hbWUgPSB4bWFsbG9jIChzdHJsZW4gKG9wX3N0cmluZykgKyAxKTsgLyogZG9uJ3Qgb3ZlcndyaXRlIFZUISAqLyAKKyAgICAgICAgICAgICAgc3RyY3B5IChtZXRob2RfbmFtZSwgb3Bfc3RyaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIC8qIEZpcnN0IGNoZWNrIGlmIGEgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBzZWVuLiAqLworICAgICAgICAgIGZuX3AgPSBmbl9saXN0OworICAgICAgICAgIHdoaWxlIChmbl9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoU1RSRVEgKGZuX3AtPmZpZWxkLm5hbWUsIG1ldGhvZF9uYW1lKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZm5fcCA9IGZuX3AtPm5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBJZiBubyBzdWNoIG1ldGhvZCB3YXMgZm91bmQsIGFsbG9jYXRlIGEgbmV3IGVudHJ5IGluIHRoZSBsaXN0ICovIAorICAgICAgICAgIGlmICghZm5fcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogR2V0IHNwYWNlIHRvIHJlY29yZCB0aGlzIG1lbWJlciBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAvKiBOb3RlOiBhbGxvY2EgdXNlZDsgdGhpcyB3aWxsIGRpc2FwcGVhciBvbiByb3V0aW5lIGV4aXQgKi8KKyAgICAgICAgICAgICAgZm5fbmV3ID0gKHN0cnVjdCBuZXh0X2ZuX2ZpZWxkICopIGFsbG9jYSAoc2l6ZW9mIChzdHJ1Y3QgbmV4dF9mbl9maWVsZCkpOworICAgICAgICAgICAgICBmbl9uZXctPm5leHQgPSBmbl9saXN0OworICAgICAgICAgICAgICBmbl9saXN0ID0gZm5fbmV3OworCisgICAgICAgICAgICAgIC8qIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0IG5leHRmaWVsZCAqLworICAgICAgICAgIAorICAgICAgICAgICAgICAvKiBSZWNvcmQgdGhlICh1bm1hbmdsZWQpIG1ldGhvZCBuYW1lICovCisgICAgICAgICAgICAgIGZuX2xpc3QtPmZpZWxkLm5hbWUgPSBtZXRob2RfbmFtZTsKKyAgICAgICAgICAgICAgLyogSW5pdGlhbCBzcGFjZSBmb3Igb3ZlcmxvYWRlZCBtZXRob2RzICovCisgICAgICAgICAgICAgIC8qIE5vdGU6IHhtYWxsb2MgaXMgdXNlZDsgdGhpcyB3aWxsIHBlcnNpc3QgYWZ0ZXIgdGhpcyByb3V0aW5lIGV4aXRzICovIAorICAgICAgICAgICAgICBmbl9saXN0LT5maWVsZC5mbl9maWVsZHMgPSAoc3RydWN0IGZuX2ZpZWxkICopIHhtYWxsb2MgKDUgKiAoc2l6ZW9mIChzdHJ1Y3QgZm5fZmllbGQpKSk7CisgICAgICAgICAgICAgIGZuX2xpc3QtPmZpZWxkLmxlbmd0aCA9IDE7IC8qIEluaXQgIyBvZiBvdmVybG9hZGVkIGluc3RhbmNlcyAqLyAKKyAgICAgICAgICAgICAgZm5fbGlzdC0+bnVtX2ZuX2ZpZWxkcyA9IDU7IC8qICMgb2YgZW50cmllcyBmb3Igd2hpY2ggc3BhY2UgYWxsb2NhdGVkICovCisgICAgICAgICAgICAgIGZuX3AgPSBmbl9saXN0OworICAgICAgICAgICAgICBpeCA9IDA7IC8qIGFycmF5IGluZGV4IGZvciBmbl9maWVsZCAqLyAKKyAgICAgICAgICAgICAgLyogQnVtcCB0aGUgdG90YWwgY291bnQgb2YgdGhlIGRpc3RpbmN0bHkgbmFtZWQgbWV0aG9kcyAqLworICAgICAgICAgICAgICBuX2ZuX2ZpZWxkcysrOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgLyogQW5vdGhlciBvdmVybG9hZGVkIGluc3RhbmNlIG9mIGFuIGFscmVhZHkgc2VlbiBtZXRob2QgbmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoKysoZm5fcC0+ZmllbGQubGVuZ3RoKSA+IGZuX3AtPm51bV9mbl9maWVsZHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogSW5jcmVhc2Ugc3BhY2UgYWxsb2NhdGVkIGZvciBvdmVybG9hZGVkIGluc3RhbmNlcyAqLyAKKyAgICAgICAgICAgICAgICAgIGZuX3AtPmZpZWxkLmZuX2ZpZWxkcworICAgICAgICAgICAgICAgICAgICA9IChzdHJ1Y3QgZm5fZmllbGQgKikgeHJlYWxsb2MgKGZuX3AtPmZpZWxkLmZuX2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZuX3AtPm51bV9mbl9maWVsZHMgKyA1KSAqIHNpemVvZiAoc3RydWN0IGZuX2ZpZWxkKSk7CisgICAgICAgICAgICAgICAgICBmbl9wLT5udW1fZm5fZmllbGRzICs9IDU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpeCA9IGZuX3AtPmZpZWxkLmxlbmd0aCAtMTsgIC8qIGFycmF5IGluZGV4IGZvciBmbl9maWVsZCAqLworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIC8qICJwaHlzbmFtZSIgaXMgaW50ZW5kZWQgdG8gYmUgdGhlIG5hbWUgb2YgdGhpcyBvdmVybG9hZGVkIGluc3RhbmNlLiAqLworICAgICAgICAgIGlmICgoZm5fZmllbGRwLT5kZnVuYy5sYW5ndWFnZSA9PSBIUF9MQU5HVUFHRV9DUExVU1BMVVMpICYmIAorCSAgICAgIG1ldGhvZF9hbGlhcyAmJiAKKyAgICAgICAgICAgICAgKm1ldGhvZF9hbGlhcykgLyogbm90IGEgbnVsbCBzdHJpbmcgKi8KKyAgICAgICAgICAgIGZuX3AtPmZpZWxkLmZuX2ZpZWxkc1tpeF0ucGh5c25hbWUgPSBtZXRob2RfYWxpYXM7CisJICBlbHNlCisgICAgICAgICAgICBmbl9wLT5maWVsZC5mbl9maWVsZHNbaXhdLnBoeXNuYW1lID0gbWV0aG9kX25hbWU7CisgICAgICAgICAgLyogV2hhdCdzIGV4cGVjdGVkIGhlcmUgaXMgdGhlIGZ1bmN0aW9uIHR5cGUgKi8KKyAgIC8qIEJ1dCBtYXJrIGl0IGFzIE5VTEwgaWYgdGhlIG1ldGhvZCB3YXMgaW5jb21wbGV0ZWx5IHByb2Nlc3NlZAorICAgICAgICAgICAgIFdlJ2xsIGZpeCB0aGlzIHVwIGxhdGVyIHdoZW4gdGhlIG1ldGhvZCBpcyBmdWxseSBwcm9jZXNzZWQgKi8KKyAgICAgICAgICBpZiAoVFlQRV9JTkNPTVBMRVRFIChtZW10eXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZm5fcC0+ZmllbGQuZm5fZmllbGRzW2l4XS50eXBlID0gTlVMTDsKKyAgICAgICAgICAgICAgZm5fcC0+ZmllbGQuZm5fZmllbGRzW2l4XS5hcmdzID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZuX3AtPmZpZWxkLmZuX2ZpZWxkc1tpeF0udHlwZSA9IG1lbXR5cGU7CisKKyAgICAgICAgICAgICAgLyogVGhlIGFyZ3VtZW50IGxpc3QgKi8KKyAgICAgICAgICAgICAgZm5fcC0+ZmllbGQuZm5fZmllbGRzW2l4XS50eXBlLT50eXBlX3NwZWNpZmljLmFyZ190eXBlcyA9CisgICAgICAgICAgICAgICAgKHN0cnVjdCB0eXBlICoqKSBvYnN0YWNrX2FsbG9jKCZvYmpmaWxlLT50eXBlX29ic3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgdHlwZSAqKSAqIChtZW10eXBlLT5uZmllbGRzICsgMSkpOworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWVtdHlwZS0+bmZpZWxkczsgaSsrKSAKKyAgICAgICAgICAgICAgICBmbl9wLT5maWVsZC5mbl9maWVsZHNbaXhdLnR5cGUtPnR5cGVfc3BlY2lmaWMuYXJnX3R5cGVzW2ldID0gbWVtdHlwZS0+ZmllbGRzW2ldLnR5cGU7CisgICAgICAgICAgICAgIC8qIHZvaWQgdGVybWluYXRpb24gKi8gCisgICAgICAgICAgICAgIGZuX3AtPmZpZWxkLmZuX2ZpZWxkc1tpeF0udHlwZS0+dHlwZV9zcGVjaWZpYy5hcmdfdHlwZXNbbWVtdHlwZS0+bmZpZWxkc10gPSBidWlsdGluX3R5cGVfdm9pZDsKKworICAgICAgICAgICAgICAvKiBwYWk6IEl0J3Mgbm90IGNsZWFyIHdoeSB0aGlzIGFyZ3MgZmllbGQgaGFzIHRvIGJlIHNldC4gIFBlcmhhcHMKKyAgICAgICAgICAgICAgICogaXQgc2hvdWxkIGJlIGVsaW1pbmF0ZWQgZW50aXJlbHkuICovCisgICAgICAgICAgICAgIGZuX3AtPmZpZWxkLmZuX2ZpZWxkc1tpeF0uYXJncyA9CisgICAgICAgICAgICAgICAgKHN0cnVjdCB0eXBlICoqKSBvYnN0YWNrX2FsbG9jKCZvYmpmaWxlLT50eXBlX29ic3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgdHlwZSAqKSAqIChtZW10eXBlLT5uZmllbGRzICsgMSkpOworICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWVtdHlwZS0+bmZpZWxkczsgaSsrKQorICAgICAgICAgICAgICAgIGZuX3AtPmZpZWxkLmZuX2ZpZWxkc1tpeF0uYXJnc1tpXSA9IG1lbXR5cGUtPmZpZWxkc1tpXS50eXBlOworICAgICAgICAgICAgICAvKiBudWxsLXRlcm1pbmF0ZWQsIHVubGlrZSBhcmdfdHlwZXMgYWJvdmUgZSovIAorICAgICAgICAgICAgICBmbl9wLT5maWVsZC5mbl9maWVsZHNbaXhdLmFyZ3NbbWVtdHlwZS0+bmZpZWxkc10gPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgIC8qIEZvciB2aXJ0dWFsIGZ1bmN0aW9ucywgZmlsbCBpbiB0aGUgdm9mZnNldCBmaWVsZCB3aXRoIHRoZQorICAgICAgICAgICAqIHZpcnR1YWwgdGFibGUgb2Zmc2V0LiAoVGhpcyBpcyBqdXN0IGNvcGllZCBvdmVyIGZyb20gdGhlCisgICAgICAgICAgICogU09NIHJlY29yZDsgbm90IHN1cmUgaWYgaXQgaXMgd2hhdCBHREIgZXhwZWN0cyBoZXJlLi4uKS4KKyAgICAgICAgICAgKiBCdXQgaWYgdGhlIGZ1bmN0aW9uIGlzIGEgc3RhdGljIG1ldGhvZCwgc2V0IGl0IHRvIDEuCisgICAgICAgICAgICogCisgICAgICAgICAgICogTm90ZSB0aGF0IHdlIGhhdmUgdG8gYWRkIDEgYmVjYXVzZSAxIGluZGljYXRlcyBhIHN0YXRpYworICAgICAgICAgICAqIG1ldGhvZCwgYW5kIDAgaW5kaWNhdGVzIGEgbm9uLXN0YXRpYywgbm9uLXZpcnR1YWwgbWV0aG9kICovCisKKyAgICAgICAgICBpZiAoc3RhdGljX21lbWJlcikKKyAgICAgICAgICAgIGZuX3AtPmZpZWxkLmZuX2ZpZWxkc1tpeF0udm9mZnNldCA9IFZPRkZTRVRfU1RBVElDOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZuX3AtPmZpZWxkLmZuX2ZpZWxkc1tpeF0udm9mZnNldCA9IHZ0Ymxfb2Zmc2V0ID8gdnRibF9vZmZzZXQgKyAxIDogMDsKKworICAgICAgICAgIC8qIEFsc28gZmlsbCBpbiB0aGUgZmNvbnRleHQgZmllbGQgd2l0aCB0aGUgY3VycmVudAorICAgICAgICAgICAqIGNsYXNzLiAoVGhlIGxhdHRlciBpc24ndCBxdWl0ZSByaWdodDogc2hvdWxkIGJlIHRoZSBiYXNlY2xhc3MKKyAgICAgICAgICAgKiB0aGF0IGRlZmluZXMgdGhlIHZpcnR1YWwgZnVuY3Rpb24uLi4gTm90ZSB3ZSBkbyBoYXZlCisgICAgICAgICAgICogYSB2YXJpYWJsZSAiYmFzZWNsYXNzIiB0aGF0IHdlIGNvdWxkIHN0dWZmIGludG8gdGhlIGZjb250ZXh0CisgICAgICAgICAgICogZmllbGQsIGJ1dCAiYmFzZWNsYXNzIiBpc24ndCBuZWNlc3NhcmlseSByaWdodCBlaXRoZXIsCisgICAgICAgICAgICogc2luY2UgdGhlIHZpcnR1YWwgZnVuY3Rpb24gY291bGQgaGF2ZSBiZWVuIGRlZmluZWQgbW9yZQorICAgICAgICAgICAqIHRoYW4gb25lIGxldmVsIHVwKS4KKyAgICAgICAgICAgKi8KKworICAgICAgICAgIGlmICh2dGJsX29mZnNldCAhPSAwKQorICAgICAgICAgICAgZm5fcC0+ZmllbGQuZm5fZmllbGRzW2l4XS5mY29udGV4dCA9IHR5cGU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZm5fcC0+ZmllbGQuZm5fZmllbGRzW2l4XS5mY29udGV4dCA9IE5VTEw7CisKKyAgICAgICAgICAvKiBPdGhlciByYW5kb20gZmllbGRzIHBlcnRhaW5pbmcgdG8gdGhpcyBtZXRob2QgKi8KKyAgICAgICAgICBmbl9wLT5maWVsZC5mbl9maWVsZHNbaXhdLmlzX2NvbnN0ID0gY29uc3RfbWVtYmVyOworICAgICAgICAgIGZuX3AtPmZpZWxkLmZuX2ZpZWxkc1tpeF0uaXNfdm9sYXRpbGUgPSB2b2xhdGlsZV9tZW1iZXI7IC8qID8/ICovIAorICAgICAgICAgIHN3aXRjaCAoZmllbGRwLT5kZ2VuZmllbGQudmlzaWJpbGl0eSkgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICBmbl9wLT5maWVsZC5mbl9maWVsZHNbaXhdLmlzX3Byb3RlY3RlZCA9IDE7CisgICAgICAgICAgICAgIGZuX3AtPmZpZWxkLmZuX2ZpZWxkc1tpeF0uaXNfcHJpdmF0ZSA9IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICBmbl9wLT5maWVsZC5mbl9maWVsZHNbaXhdLmlzX3Byb3RlY3RlZCA9IDA7CisgICAgICAgICAgICAgIGZuX3AtPmZpZWxkLmZuX2ZpZWxkc1tpeF0uaXNfcHJpdmF0ZSA9IDE7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogLyogcHVibGljICovCisgICAgICAgICAgICAgIGZuX3AtPmZpZWxkLmZuX2ZpZWxkc1tpeF0uaXNfcHJvdGVjdGVkID0gMDsKKyAgICAgICAgICAgICAgZm5fcC0+ZmllbGQuZm5fZmllbGRzW2l4XS5pc19wcml2YXRlID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgZm5fcC0+ZmllbGQuZm5fZmllbGRzW2l4XS5pc19zdHViID0gMDsKKworICAgICAgICAgIC8qIEhQIGFDQyBlbWl0cyBib3RoIE1FTUZVTkMgYW5kIEZVTkNUSU9OIGVudHJpZXMgZm9yIGEgbWV0aG9kOworICAgICAgICAgICAgIGlmIHRoZSBjbGFzcyBwb2ludHMgdG8gdGhlIEZVTkNUSU9OLCB0aGVyZSBpcyB1c3VhbGx5IHNlcGFyYXRlCisgICAgICAgICAgICAgY29kZSBmb3IgdGhlIG1ldGhvZDsgYnV0IGlmIHdlIGhhdmUgYSBNRU1GVU5DLCB0aGUgbWV0aG9kIGhhcworICAgICAgICAgICAgIGJlZW4gaW5saW5lZCAoYW5kIHRoZXJlIGlzIHVzdWFsbHkgbm8gRlVOQ1RJT04gZW50cnkpCisgICAgICAgICAgICAgRklYTUUgTm90IHN1cmUgaWYgdGhpcyB0ZXN0IGlzIGFjY3VyYXRlLiBwYWkvMTk5Ny0wOC0yMiAqLyAKKyAgICAgICAgICBpZiAoKGZuX2ZpZWxkcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX01FTUZVTkMpIHx8CisgICAgICAgICAgICAgIChmbl9maWVsZHAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9ET0NfTUVNRlVOQykpCisgICAgICAgICAgICBmbl9wLT5maWVsZC5mbl9maWVsZHNbaXhdLmlzX2lubGluZWQgPSAxOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZuX3AtPmZpZWxkLmZuX2ZpZWxkc1tpeF0uaXNfaW5saW5lZCA9IDA7CisgICAgICAgICAgCisgICAgICAgICAgZm5fcC0+ZmllbGQuZm5fZmllbGRzW2l4XS5kdW1teSA9IDA7CisgICAgICAgICAgCisgICAgICAgICAgLyogQnVtcCB0aGUgdG90YWwgY291bnQgb2YgdGhlIG1lbWJlciBmdW5jdGlvbnMgKi8KKyAgICAgICAgICBuX2ZuX2ZpZWxkc190b3RhbCsrOworCisgICAgICAgIH0gZWxzZSBpZiAoZm5fZmllbGRwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfU1ZBUikgeworICAgICAgICAgIC8qIFRoaXMgY2FzZSBpcyBmb3Igc3RhdGljIGRhdGEgbWVtYmVycyBvZiBjbGFzc2VzICovIAorICAgICAgICAgIAorICAgICAgICAgIC8qIHBhaTo6IEZJWE1FIC0tIGNoZWNrIHRoYXQgInN0YXRpY21lbSIgYml0IGlzIHNldCAqLworCisgICAgICAgICAgLyogR2V0IHNwYWNlIHRvIHJlY29yZCB0aGlzIHN0YXRpYyBtZW1iZXIgKi8KKyAgICAgICAgICBuZXcgPSAoc3RydWN0IG5leHRmaWVsZCAqKSBhbGxvY2EgKHNpemVvZiAoc3RydWN0IG5leHRmaWVsZCkpOworICAgICAgICAgIG5ldy0+bmV4dCA9IGxpc3Q7CisgICAgICAgICAgbGlzdCA9IG5ldzsKKyAgICAgICAgICAKKyAgICAgICAgICBsaXN0LT5maWVsZC5uYW1lID0gVlQgKG9iamZpbGUpICsgZm5fZmllbGRwLT5kc3Zhci5uYW1lOworICAgICAgICAgIEZJRUxEX0JJVFNJWkUgKGxpc3QtPmZpZWxkKSA9IC0xOyAvKiBpbmRpY2F0ZXMgc3RhdGljIG1lbWJlciAqLworICAgICAgICAgIFNFVF9GSUVMRF9QSFlTTkFNRSAobGlzdC0+ZmllbGQsIDApOyAgLyogaW5pdGlhbGl6ZSB0byBlbXB0eSAqLworICAgICAgICAgIG1lbXR5cGUgPSBocHJlYWRfdHlwZV9sb29rdXAgKGZuX2ZpZWxkcC0+ZHN2YXIudHlwZSwgb2JqZmlsZSk7CisgICAgICAgICAgCisgICAgICAgICAgRklFTERfVFlQRSAobGlzdC0+ZmllbGQpID0gbWVtdHlwZTsKKyAgICAgICAgICBsaXN0LT5hdHRyaWJ1dGVzID0gMDsKKyAgICAgICAgICBzd2l0Y2ggKGZpZWxkcC0+ZGdlbmZpZWxkLnZpc2liaWxpdHkpIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgQl9TRVQoJihsaXN0LT5hdHRyaWJ1dGVzKSwgQVRUUl9QUk9URUNUKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgIEJfU0VUKCYobGlzdC0+YXR0cmlidXRlcyksIEFUVFJfUFJJVkFURSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBuZmllbGRzKys7CisgICAgICAgIH0KKworICAgICAgICBlbHNlIGlmIChmbl9maWVsZHAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9GSUVMRCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBGSUVMRHMgZm9sbG93IEdFTkZJRUxEcyBmb3IgZmllbGRzIG9mIGFub255bW91cyB1bmlvbnMuCisgICAgICAgICAgICAgICBDb2RlIGJlbG93IGlzIHJlcGxpY2F0ZWQgZnJvbSB0aGUgY2FzZSBmb3IgRklFTERzIGZ1cnRoZXIKKyAgICAgICAgICAgICAgIGJlbG93LCBleGNlcHQgdGhhdCBmaWVsZHAgaXMgcmVwbGFjZWQgYnkgZm5fZmllbGRwICovIAorICAgICAgICAgICAgaWYgKCFmbl9maWVsZHAtPmRmaWVsZC5hX3VuaW9uKQorICAgICAgICAgICAgICB3YXJuaW5nICgiRGVidWcgaW5mbyBpbmNvbnNpc3RlbnQ6IEZJRUxEIG9mIGFub255bW91cyB1bmlvbiBkb2Vzbid0IGhhdmUgYV91bmlvbiBiaXQgc2V0Iik7CisgICAgICAgICAgICAvKiBHZXQgc3BhY2UgdG8gcmVjb3JkIHRoZSBuZXh0IGZpZWxkL2RhdGEtbWVtYmVyLiAqLworICAgICAgICAgICAgbmV3ID0gKHN0cnVjdCBuZXh0ZmllbGQgKikgYWxsb2NhIChzaXplb2YgKHN0cnVjdCBuZXh0ZmllbGQpKTsKKyAgICAgICAgICAgIG5ldy0+bmV4dCA9IGxpc3Q7CisgICAgICAgICAgICBsaXN0ID0gbmV3OworCisgICAgICAgICAgICBsaXN0LT5maWVsZC5uYW1lID0gVlQgKG9iamZpbGUpICsgZm5fZmllbGRwLT5kZmllbGQubmFtZTsKKyAgICAgICAgICAgIEZJRUxEX0JJVFBPUyAobGlzdC0+ZmllbGQpID0gZm5fZmllbGRwLT5kZmllbGQuYml0b2Zmc2V0OworICAgICAgICAgICAgaWYgKGZuX2ZpZWxkcC0+ZGZpZWxkLmJpdGxlbmd0aCAlIDgpCisgICAgICAgICAgICAgIGxpc3QtPmZpZWxkLmJpdHNpemUgPSBmbl9maWVsZHAtPmRmaWVsZC5iaXRsZW5ndGg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGxpc3QtPmZpZWxkLmJpdHNpemUgPSAwOworCisgICAgICAgICAgICBtZW10eXBlID0gaHByZWFkX3R5cGVfbG9va3VwIChmbl9maWVsZHAtPmRmaWVsZC50eXBlLCBvYmpmaWxlKTsKKyAgICAgICAgICAgIGxpc3QtPmZpZWxkLnR5cGUgPSBtZW10eXBlOworICAgICAgICAgICAgbGlzdC0+YXR0cmlidXRlcyA9IDA7CisgICAgICAgICAgICBzd2l0Y2ggKGZuX2ZpZWxkcC0+ZGZpZWxkLnZpc2liaWxpdHkpIHsKKyAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIEJfU0VUKCYobGlzdC0+YXR0cmlidXRlcyksIEFUVFJfUFJPVEVDVCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBCX1NFVCgmKGxpc3QtPmF0dHJpYnV0ZXMpLCBBVFRSX1BSSVZBVEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmZpZWxkcysrOworICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZm5fZmllbGRwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfU1ZBUikKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBGaWVsZCBvZiBhbm9ueW1vdXMgdW5pb247IHVuaW9uIGlzIG5vdCBpbnNpZGUgYSBjbGFzcyAqLworICAgICAgICAgICAgaWYgKCFmbl9maWVsZHAtPmRzdmFyLmFfdW5pb24pCisgICAgICAgICAgICAgIHdhcm5pbmcgKCJEZWJ1ZyBpbmZvIGluY29uc2lzdGVudDogU1ZBUiBmaWVsZCBpbiBhbm9ueW1vdXMgdW5pb24gZG9lc24ndCBoYXZlIGFfdW5pb24gYml0IHNldCIpOworICAgICAgICAgICAgLyogR2V0IHNwYWNlIHRvIHJlY29yZCB0aGUgbmV4dCBmaWVsZC9kYXRhLW1lbWJlci4gKi8KKyAgICAgICAgICAgIG5ldyA9IChzdHJ1Y3QgbmV4dGZpZWxkICopIGFsbG9jYSAoc2l6ZW9mIChzdHJ1Y3QgbmV4dGZpZWxkKSk7CisgICAgICAgICAgICBuZXctPm5leHQgPSBsaXN0OworICAgICAgICAgICAgbGlzdCA9IG5ldzsKKworICAgICAgICAgICAgbGlzdC0+ZmllbGQubmFtZSA9IFZUIChvYmpmaWxlKSArIGZuX2ZpZWxkcC0+ZHN2YXIubmFtZTsKKyAgICAgICAgICAgIEZJRUxEX0JJVFBPUyAobGlzdC0+ZmllbGQpID0gMDsgIC8qIEZJWE1FIGlzIHRoaXMgYWx3YXlzIHRydWU/ICovCisgICAgICAgICAgICBGSUVMRF9CSVRTSVpFIChsaXN0LT5maWVsZCkgPSAwOyAvKiB1c2UgbGVuZ3RoIGZyb20gdHlwZSAqLworICAgICAgICAgICAgbWVtdHlwZSA9IGhwcmVhZF90eXBlX2xvb2t1cCAoZm5fZmllbGRwLT5kc3Zhci50eXBlLCBvYmpmaWxlKTsKKyAgICAgICAgICAgIGxpc3QtPmZpZWxkLnR5cGUgPSBtZW10eXBlOworICAgICAgICAgICAgbGlzdC0+YXR0cmlidXRlcyA9IDA7CisgICAgICAgICAgICAvKiBObyBpbmZvIHRvIHNldCB2aXNpYmlsaXR5IC0tIGFsd2F5cyBwdWJsaWMgKi8gCisgICAgICAgICAgICBuZmllbGRzKys7CisgICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChmbl9maWVsZHAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9EVkFSKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpZWxkIG9mIGFub255bW91cyB1bmlvbjsgdW5pb24gaXMgbm90IGluc2lkZSBhIGNsYXNzICovCisgICAgICAgICAgICBpZiAoIWZuX2ZpZWxkcC0+ZGR2YXIuYV91bmlvbikKKyAgICAgICAgICAgICAgd2FybmluZyAoIkRlYnVnIGluZm8gaW5jb25zaXN0ZW50OiBEVkFSIGZpZWxkIGluIGFub255bW91cyB1bmlvbiBkb2Vzbid0IGhhdmUgYV91bmlvbiBiaXQgc2V0Iik7CisgICAgICAgICAgICAvKiBHZXQgc3BhY2UgdG8gcmVjb3JkIHRoZSBuZXh0IGZpZWxkL2RhdGEtbWVtYmVyLiAqLworICAgICAgICAgICAgbmV3ID0gKHN0cnVjdCBuZXh0ZmllbGQgKikgYWxsb2NhIChzaXplb2YgKHN0cnVjdCBuZXh0ZmllbGQpKTsKKyAgICAgICAgICAgIG5ldy0+bmV4dCA9IGxpc3Q7CisgICAgICAgICAgICBsaXN0ID0gbmV3OworCisgICAgICAgICAgICBsaXN0LT5maWVsZC5uYW1lID0gVlQgKG9iamZpbGUpICsgZm5fZmllbGRwLT5kZHZhci5uYW1lOworICAgICAgICAgICAgRklFTERfQklUUE9TIChsaXN0LT5maWVsZCkgPSAwOyAgLyogRklYTUUgaXMgdGhpcyBhbHdheXMgdHJ1ZT8gKi8KKyAgICAgICAgICAgIEZJRUxEX0JJVFNJWkUgKGxpc3QtPmZpZWxkKSA9IDA7IC8qIHVzZSBsZW5ndGggZnJvbSB0eXBlICovIAorICAgICAgICAgICAgbWVtdHlwZSA9IGhwcmVhZF90eXBlX2xvb2t1cCAoZm5fZmllbGRwLT5kZHZhci50eXBlLCBvYmpmaWxlKTsKKyAgICAgICAgICAgIGxpc3QtPmZpZWxkLnR5cGUgPSBtZW10eXBlOworICAgICAgICAgICAgbGlzdC0+YXR0cmlidXRlcyA9IDA7CisgICAgICAgICAgICAvKiBObyBpbmZvIHRvIHNldCB2aXNpYmlsaXR5IC0tIGFsd2F5cyBwdWJsaWMgKi8gCisgICAgICAgICAgICBuZmllbGRzKys7CisgICAgICAgICAgfQorICAgICAgICBlbHNlIHsgLyogTm90IGEgbWV0aG9kLCBub3IgYSBzdGF0aWMgZGF0YSBtZW1iZXIsIG5vciBhbiBhbm9uIHVuaW9uIGZpZWxkICovCisKKyAgICAgICAgICAvKiBUaGlzIGNhc2UgaXMgZm9yIG1pc2NlbGxhbmVvdXMgdHlwZSBlbnRyaWVzIChsb2NhbCBlbnVtcywKKyAgICAgICAgICAgICBsb2NhbCBmdW5jdGlvbiB0ZW1wbGF0ZXMsIGV0Yy4pIHRoYXQgY2FuIGJlIHByZXNlbnQKKyAgICAgICAgICAgICBpbnNpZGUgYSBjbGFzcy4gKi8KKworICAgICAgICAgIC8qIEVudW1zIC0tIHdpbGwgYmUgaGFuZGxlZCBieSBvdGhlciBjb2RlIHRoYXQgdGFrZXMgY2FyZQorICAgICAgICAgICAgIG9mIEROVFRfVFlQRV9FTlVNOyBoZXJlIHdlIHNlZSBvbmx5IEROVFRfVFlQRV9NRU1FTlVNIHNvCisgICAgICAgICAgICAgaXQncyBub3QgY2xlYXIgd2UgY291bGQgaGF2ZSBoYW5kbGVkIHRoZW0gaGVyZSBhdCBhbGwuICovCisgICAgICAgICAgLyogRlVOQ19URU1QTEFURTogaXMgaGFuZGxlZCBieSBvdGhlciBjb2RlICg/PykuICovCisgICAgICAgICAgLyogTUVNQUNDRVNTOiBtb2RpZmllZCBhY2Nlc3MgZm9yIGluaGVyaXRlZCBtZW1iZXIuIE5vdAorICAgICAgICAgICAgIHN1cmUgd2hhdCB0byBkbyB3aXRoIHRoaXMsIGlnbm9yaWluZyBpdCBhdCBwcmVzZW50LiAqLyAKKworICAgICAgICAgIC8qIFdoYXQgb3RoZXIgZW50cmllcyBjYW4gYXBwZWFyIGZvbGxvd2luZyBhIEdFTkZJRUxEIHdoaWNoCisgICAgICAgICAgICAgd2UgZG8gbm90IGhhbmRsZSBhYm92ZT8gIChNT0RJRklFUiwgVkZVTkMgaGFuZGxlZCBhYm92ZS4pICovCisKKyAgICAgICAgICBpZiAoKGZuX2ZpZWxkcC0+ZGJsb2NrLmtpbmQgIT0gRE5UVF9UWVBFX01FTUFDQ0VTUykgJiYKKyAgICAgICAgICAgICAgKGZuX2ZpZWxkcC0+ZGJsb2NrLmtpbmQgIT0gRE5UVF9UWVBFX01FTUVOVU0pICYmCisgICAgICAgICAgICAgIChmbl9maWVsZHAtPmRibG9jay5raW5kICE9IEROVFRfVFlQRV9GVU5DX1RFTVBMQVRFKSkKKyAgICAgICAgICAgIHdhcm5pbmcgKCJJbnRlcm5hbCBlcnJvcjogVW5leHBlY3RlZCBkZWJ1ZyByZWNvcmQga2luZCAlZCBmb3VuZCBmb2xsb3dpbmcgRE5UVF9HRU5GSUVMRCIsCisgICAgICAgICAgICAgICAgICAgICBmbl9maWVsZHAtPmRibG9jay5raW5kKTsKKyAgICAgICAgfQorICAgICAgICAvKiB3YWxrIHRvIHRoZSBuZXh0IEZJRUxEIG9yIEdFTkZJRUxEICovCisgICAgICAgIGZpZWxkID0gZmllbGRwLT5kZ2VuZmllbGQubmV4dGZpZWxkOworCisgICAgICB9IAorICAgICAgZWxzZSBpZiAoZmllbGRwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfRklFTEQpIHsKKyAgICAgICAgCisgICAgICAgIC8qIE9yZGluYXJ5IHN0cnVjdHVyZS91bmlvbi9jbGFzcyBmaWVsZCAqLworICAgICAgICBzdHJ1Y3QgdHlwZSAqIGFub25fdW5pb25fdHlwZTsKKworICAgICAgICAvKiBHZXQgc3BhY2UgdG8gcmVjb3JkIHRoZSBuZXh0IGZpZWxkL2RhdGEtbWVtYmVyLiAqLworCW5ldyA9IChzdHJ1Y3QgbmV4dGZpZWxkICopIGFsbG9jYSAoc2l6ZW9mIChzdHJ1Y3QgbmV4dGZpZWxkKSk7CisgICAgICAgIG5ldy0+bmV4dCA9IGxpc3Q7CisgICAgICAgIGxpc3QgPSBuZXc7CisgICAgICAgIAorICAgICAgICBsaXN0LT5maWVsZC5uYW1lID0gVlQgKG9iamZpbGUpICsgZmllbGRwLT5kZmllbGQubmFtZTsKKworCisgICAgICAgIC8qIEEgRklFTEQgYnkgaXRzZWxmICh3aXRob3V0IGEgR0VORklFTEQpIGNhbiBhbHNvIGJlIGEgc3RhdGljIG1lbWJlciAqLworICAgICAgICBpZiAoZmllbGRwLT5kZmllbGQuc3RhdGljbWVtKQorICAgICAgICAgIHsKKwkgICAgRklFTERfQklUUE9TIChsaXN0LT5maWVsZCkgPSAtMTsKKwkgICAgRklFTERfQklUU0laRSAobGlzdC0+ZmllbGQpID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UgLyogTm9uLXN0YXRpYyBkYXRhIG1lbWJlciAqLyAKKyAgICAgICAgICB7CisJICAgIEZJRUxEX0JJVFBPUyAobGlzdC0+ZmllbGQpID0gZmllbGRwLT5kZmllbGQuYml0b2Zmc2V0OworCSAgICBpZiAoZmllbGRwLT5kZmllbGQuYml0bGVuZ3RoICUgOCkKKwkgICAgICBGSUVMRF9CSVRTSVpFIChsaXN0LT5maWVsZCkgPSBmaWVsZHAtPmRmaWVsZC5iaXRsZW5ndGg7CisJICAgIGVsc2UKKwkgICAgICBGSUVMRF9CSVRTSVpFIChsaXN0LT5maWVsZCkgPSAwOworICAgICAgICAgIH0KKworICAgICAgICBtZW10eXBlID0gaHByZWFkX3R5cGVfbG9va3VwIChmaWVsZHAtPmRmaWVsZC50eXBlLCBvYmpmaWxlKTsKKyAgICAgICAgRklFTERfVFlQRSAobGlzdC0+ZmllbGQpID0gbWVtdHlwZTsKKyAgICAgICAgbGlzdC0+YXR0cmlidXRlcyA9IDA7CisgICAgICAgIHN3aXRjaCAoZmllbGRwLT5kZmllbGQudmlzaWJpbGl0eSkgeworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIEJfU0VUKCYobGlzdC0+YXR0cmlidXRlcyksIEFUVFJfUFJPVEVDVCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBCX1NFVCgmKGxpc3QtPmF0dHJpYnV0ZXMpLCBBVFRSX1BSSVZBVEUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbmZpZWxkcysrOworCisKKyAgICAgICAgLyogTm90ZSAxOiBGaXJzdCwgd2UgaGF2ZSB0byBjaGVjayBpZiB0aGUgY3VycmVudCBmaWVsZCBpcyBhbiBhbm9ueW1vdXMKKyAgICAgICAgICAgdW5pb24uIElmIGl0IGlzLCB0aGVuICppdHMqIGZpZWxkcyBhcmUgdGhyZWFkZWQgYWxvbmcgaW4gdGhlCisgICAgICAgICAgIG5leHRmaWVsZCBjaGFpbi4gOi0oIFRoaXMgd2FzIHN1cHBvc2VkIHRvIGhlbHAgZGVidWdnZXJzLCBidXQgaXMKKyAgICAgICAgICAgcmVhbGx5IGp1c3QgYSBudWlzYW5jZSBzaW5jZSB3ZSBkZWFsIHdpdGggYW5vbnltb3VzIHVuaW9ucyBhbnl3YXkgYnkKKyAgICAgICAgICAgY2hlY2tpbmcgdGhhdCB0aGUgbmFtZSBpcyBudWxsLiAgU28gYW55d2F5LCB3ZSBza2lwIG92ZXIgdGhlIGZpZWxkcworICAgICAgICAgICBvZiB0aGUgYW5vbnltb3VzIHVuaW9uLiBwYWkvMTk5Ny0wOC0yMiAqLworICAgICAgICAvKiBOb3RlIDI6IEluIGFkZGl0aW9uLCB0aGUgYml0b2Zmc2V0cyBmb3IgdGhlIGZpZWxkcyBvZiB0aGUgYW5vbiB1bmlvbgorICAgICAgICAgICBhcmUgcmVsYXRpdmUgdG8gdGhlIGVuY2xvc2luZyBzdHJ1Y3QsICpOT1QqIHJlbGF0aXZlIHRvIHRoZSBhbm9uCisgICAgICAgICAgIHVuaW9uISAgVGhpcyBpcyBhbiBldmVuIGJpZ2dlciBudWlzYW5jZSAtLSB3ZSBoYXZlIHRvIGdvIGluIGFuZCBtdW5nZQorICAgICAgICAgICB0aGUgYW5vbiB1bmlvbidzIHR5cGUgaW5mb3JtYXRpb24gYXBwcm9wcmlhdGVseS4gcGFpLzE5OTctMDgtMjIgKi8KKworICAgICAgICAvKiBCb3RoIHRhc2tzIG5vdGVkIGFib3ZlIGFyZSBkb25lIGJ5IGEgc2VwYXJhdGUgZnVuY3Rpb24uICBUaGlzIHRha2VzIHVzCisgICAgICAgICAgIHRvIHRoZSBuZXh0IEZJRUxEIG9yIEdFTkZJRUxELCBza2lwcGluZyBhbm9uIHVuaW9ucywgYW5kIHJlY3Vyc2l2ZWx5CisgICAgICAgICAgIHByb2Nlc3NpbmcgaW50ZXJtZWRpYXRlIHR5cGVzLiAqLyAKKyAgICAgICAgZmllbGQgPSBocHJlYWRfZ2V0X25leHRfc2tpcF9vdmVyX2Fub25fdW5pb25zICgxLCBmaWVsZCwgJmZpZWxkcCwgb2JqZmlsZSk7CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIG5laXRoZXIgZmllbGQgbm9yIGdlbmZpZWxkID8/IGlzIHRoaXMgcG9zc2libGU/PyAqLworICAgICAgICAvKiBwYWk6OiBGSVhNRSB3YWxrIHRvIHRoZSBuZXh0IC0tIGhvdz8gKi8KKyAgICAgICAgd2FybmluZyAoIkludGVybmFsIGVycm9yOiB1bmV4cGVjdGVkIEROVFQga2luZCAlZCBlbmNvdW50ZXJlZCBhcyBmaWVsZCBvZiBzdHJ1Y3QiKTsKKyAgICAgICAgd2FybmluZyAoIlNraXBwaW5nIHJlbWFpbmluZyBmaWVsZHMgb2Ygc3RydWN0Iik7CisgICAgICAgIGJyZWFrOyAvKiBnZXQgb3V0IG9mIGxvb3Agb2YgZmllbGRzICovIAorICAgICAgfQorICAgIH0KKworICAvKiBJZiBpdCdzIGEgdGVtcGxhdGUsIHJlYWQgaW4gdGhlIGluc3RhbnRpYXRpb24gbGlzdCAqLworICBpZiAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX1RFTVBMQVRFKSB7CisgICAgbmluc3RhbnRpYXRpb25zID0gMDsKKyAgICBmaWVsZCA9IGRuX2J1ZnAtPmR0ZW1wbGF0ZS5leHBhbnNpb25zOworICAgIHdoaWxlIChmaWVsZC53b3JkICYmIGZpZWxkLndvcmQgIT0gRE5UVE5JTCkgeworICAgICAgZmllbGRwID0gaHByZWFkX2dldF9sbnR0IChmaWVsZC5kbnR0cC5pbmRleCwgb2JqZmlsZSk7CisgCisgICAgICAvKiBUaGUgZXhwYW5zaW9ucyBvciBuZXh0ZXhwIHNob3VsZCBwb2ludCB0byBhIHRhZ2RlZiAqLworICAgICAgaWYgKGZpZWxkcC0+ZGJsb2NrLmtpbmQgIT0gRE5UVF9UWVBFX1RBR0RFRikgCisgICAgICAgIGJyZWFrOworCisgICAgICBpX25ldyA9IChzdHJ1Y3QgbmV4dF9pbnN0YW50aWF0aW9uICopIGFsbG9jYSAoc2l6ZW9mIChzdHJ1Y3QgbmV4dF9pbnN0YW50aWF0aW9uKSk7IAorICAgICAgaV9uZXctPm5leHQgPSBpX2xpc3Q7CisgICAgICBpX2xpc3QgPSBpX25ldzsKKyAgICAgIGlfbGlzdC0+dCA9IGhwcmVhZF90eXBlX2xvb2t1cCAoZmllbGQsIG9iamZpbGUpOworICAgICAgbmluc3RhbnRpYXRpb25zKys7CisKKyAgICAgIC8qIEFuZCB0aGUgInR5cGUiIGZpZWxkIG9mIHRoYXQgc2hvdWxkIHBvaW50IHRvIGEgY2xhc3MgKi8KKyAgICAgIGZpZWxkID0gZmllbGRwLT5kdGFnLnR5cGU7CisgICAgICBmaWVsZHAgPSBocHJlYWRfZ2V0X2xudHQgKGZpZWxkLmRudHRwLmluZGV4LCBvYmpmaWxlKTsKKyAgICAgIGlmIChmaWVsZHAtPmRibG9jay5raW5kICE9IEROVFRfVFlQRV9DTEFTUykgCisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBHZXQgdGhlIG5leHQgZXhwYW5zaW9uICovCisgICAgICBmaWVsZCA9IGZpZWxkcC0+ZGNsYXNzLm5leHRleHA7CisgICAgfQorICB9CisgIFRZUEVfTklOU1RBTlRJQVRJT05TKHR5cGUpID0gbmluc3RhbnRpYXRpb25zOworICBpZiAobmluc3RhbnRpYXRpb25zID4gMCkgCisgICAgVFlQRV9JTlNUQU5USUFUSU9OUyh0eXBlKSA9IChzdHJ1Y3QgdHlwZSAqKikKKyAgICAgIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT50eXBlX29ic3RhY2ssIHNpemVvZiAoc3RydWN0IHR5cGUgKikgKiBuaW5zdGFudGlhdGlvbnMpOworICBmb3IgKG4gPSBuaW5zdGFudGlhdGlvbnM7IGlfbGlzdDsgaV9saXN0ID0gaV9saXN0LT5uZXh0KQorICAgIHsKKyAgICAgIG4gLT0gMTsKKyAgICAgIFRZUEVfSU5TVEFOVElBVElPTih0eXBlLCBuKSA9IGlfbGlzdC0+dDsKKyAgICB9CisKKworICAvKiBDb3B5IHRoZSBmaWVsZC1saXN0IHRvIEdEQidzIHN5bWJvbCB0YWJsZSAqLworICBUWVBFX05GSUVMRFMgKHR5cGUpID0gbmZpZWxkczsKKyAgVFlQRV9OX0JBU0VDTEFTU0VTICh0eXBlKSA9IG5fYmFzZV9jbGFzc2VzOworICBUWVBFX0ZJRUxEUyAodHlwZSkgPSAoc3RydWN0IGZpZWxkICopCisgICAgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnR5cGVfb2JzdGFjaywgc2l6ZW9mIChzdHJ1Y3QgZmllbGQpICogbmZpZWxkcyk7CisgIC8qIENvcHkgdGhlIHNhdmVkLXVwIGZpZWxkcyBpbnRvIHRoZSBmaWVsZCB2ZWN0b3IuICAqLworICBmb3IgKG4gPSBuZmllbGRzLCB0bXBfbGlzdCA9IGxpc3Q7IHRtcF9saXN0OyB0bXBfbGlzdCA9IHRtcF9saXN0LT5uZXh0KQorICAgIHsKKyAgICAgIG4gLT0gMTsKKyAgICAgIFRZUEVfRklFTEQgKHR5cGUsIG4pID0gdG1wX2xpc3QtPmZpZWxkOworICAgIH0KKworICAvKiBDb3B5IHRoZSAiZnVuY3Rpb24tZmllbGQtbGlzdCIgKGkuZS4sIHRoZSBsaXN0IG9mIG1lbWJlcgorICAgKiBmdW5jdGlvbnMgaW4gdGhlIGNsYXNzKSB0byBHREIncyBzeW1ib2wgdGFibGUgCisgICAqLworICBUWVBFX05GTl9GSUVMRFMgKHR5cGUpID0gbl9mbl9maWVsZHM7CisgIFRZUEVfTkZOX0ZJRUxEU19UT1RBTCAodHlwZSkgPSBuX2ZuX2ZpZWxkc190b3RhbDsKKyAgVFlQRV9GTl9GSUVMRExJU1RTKHR5cGUpID0gKHN0cnVjdCBmbl9maWVsZGxpc3QgKikKKyAgICBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+dHlwZV9vYnN0YWNrLCBzaXplb2YgKHN0cnVjdCBmbl9maWVsZGxpc3QpICogbl9mbl9maWVsZHMpOworICBmb3IgKG4gPSBuX2ZuX2ZpZWxkczsgZm5fbGlzdDsgZm5fbGlzdCA9IGZuX2xpc3QtPm5leHQpCisgICAgeworICAgICAgbiAtPSAxOworICAgICAgVFlQRV9GTl9GSUVMRExJU1QodHlwZSwgbikgPSBmbl9saXN0LT5maWVsZDsKKyAgICB9CisKKyAgLyogcGFpOjogRklYTUUgLS0gcGVyaGFwcyBlYWNoIGJpdHZlY3RvciBzaG91bGQgYmUgY3JlYXRlZCBpbmRpdmlkdWFsbHkgKi8KKyAgZm9yIChuID0gbmZpZWxkcywgdG1wX2xpc3QgPSBsaXN0OyB0bXBfbGlzdDsgdG1wX2xpc3QgPSB0bXBfbGlzdC0+bmV4dCkKKyAgICB7CisgICAgICBuIC09IDE7CisgICAgICBpZiAodG1wX2xpc3QtPmF0dHJpYnV0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICBuZWVkX2JpdHZlY3RvcnMgPSAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgIGlmIChuZWVkX2JpdHZlY3RvcnMpCisgICAgeworICAgICAgLyogcGFpOjogdGhpcyBzdGVwIHByb2JhYmx5IHJlZHVuZGFudCAqLyAKKyAgICAgIEFMTE9DQVRFX0NQTFVTX1NUUlVDVF9UWVBFICh0eXBlKTsKKworICAgICAgVFlQRV9GSUVMRF9WSVJUVUFMX0JJVFMgKHR5cGUpID0KKwkoQl9UWVBFICopIFRZUEVfQUxMT0MgKHR5cGUsIEJfQllURVMgKG5maWVsZHMpKTsKKyAgICAgIEJfQ0xSQUxMIChUWVBFX0ZJRUxEX1ZJUlRVQUxfQklUUyAodHlwZSksIG5maWVsZHMpOworCisgICAgICBUWVBFX0ZJRUxEX1BSSVZBVEVfQklUUyAodHlwZSkgPQorCShCX1RZUEUgKikgVFlQRV9BTExPQyAodHlwZSwgQl9CWVRFUyAobmZpZWxkcykpOworICAgICAgQl9DTFJBTEwgKFRZUEVfRklFTERfUFJJVkFURV9CSVRTICh0eXBlKSwgbmZpZWxkcyk7CisgICAgICAKKyAgICAgIFRZUEVfRklFTERfUFJPVEVDVEVEX0JJVFMgKHR5cGUpID0KKwkoQl9UWVBFICopIFRZUEVfQUxMT0MgKHR5cGUsIEJfQllURVMgKG5maWVsZHMpKTsKKyAgICAgIEJfQ0xSQUxMIChUWVBFX0ZJRUxEX1BST1RFQ1RFRF9CSVRTICh0eXBlKSwgbmZpZWxkcyk7CisKKyAgICAgIC8qIHRoaXMgZmllbGQgdmVjdG9yIGlzbid0IGFjdHVhbGx5IHVzZWQgd2l0aCBIUCBhQ0MgKi8KKyAgICAgIFRZUEVfRklFTERfSUdOT1JFX0JJVFMgKHR5cGUpID0KKwkoQl9UWVBFICopIFRZUEVfQUxMT0MgKHR5cGUsIEJfQllURVMgKG5maWVsZHMpKTsKKyAgICAgIEJfQ0xSQUxMIChUWVBFX0ZJRUxEX0lHTk9SRV9CSVRTICh0eXBlKSwgbmZpZWxkcyk7CisKKyAgICAgIHdoaWxlIChuZmllbGRzLS0gPiAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKEJfVFNUKCYobGlzdC0+YXR0cmlidXRlcyksQVRUUl9WSVJUVUFMKSkKKyAgICAgICAgICAgIFNFVF9UWVBFX0ZJRUxEX1ZJUlRVQUwgKHR5cGUsIG5maWVsZHMpOworICAgICAgICAgIGlmIChCX1RTVCgmKGxpc3QtPmF0dHJpYnV0ZXMpLEFUVFJfUFJJVkFURSkpCisgICAgICAgICAgICBTRVRfVFlQRV9GSUVMRF9QUklWQVRFICh0eXBlLCBuZmllbGRzKTsKKyAgICAgICAgICBpZiAoQl9UU1QoJihsaXN0LT5hdHRyaWJ1dGVzKSxBVFRSX1BST1RFQ1QpKQorICAgICAgICAgICAgU0VUX1RZUEVfRklFTERfUFJPVEVDVEVEICh0eXBlLCBuZmllbGRzKTsKKworICAgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgVFlQRV9GSUVMRF9WSVJUVUFMX0JJVFModHlwZSkgPSBOVUxMOworICAgICAgVFlQRV9GSUVMRF9QUk9URUNURURfQklUUyh0eXBlKSA9IE5VTEw7CisgICAgICBUWVBFX0ZJRUxEX1BSSVZBVEVfQklUUyh0eXBlKSA9IE5VTEw7CisgICAgfQorICAKKyAgaWYgKGhhc192dGFibGUodHlwZSkpCisgICAgeworICAgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIGNsYXNzIHJ1bnRpbWUgaW5mb3JtYXRpb24gKi8KKyAgICAgIFRZUEVfUlVOVElNRV9QVFIodHlwZSkgPSAoc3RydWN0IHJ1bnRpbWVfaW5mbyAqKSB4bWFsbG9jIChzaXplb2Yoc3RydWN0IHJ1bnRpbWVfaW5mbykpOworICAgICAgLyogU2V0IGZsYWcgZm9yIHZ0YWJsZSAqLworICAgICAgVFlQRV9WVEFCTEUodHlwZSkgPSAxOworICAgICAgLyogVGhlIGZpcnN0IG5vbi12aXJ0dWFsIGJhc2UgY2xhc3Mgd2l0aCBhIHZ0YWJsZS4gKi8KKyAgICAgIFRZUEVfUFJJTUFSWV9CQVNFKHR5cGUpID0gcHJpbWFyeV9iYXNlX2NsYXNzKHR5cGUpOworICAgICAgLyogVGhlIHZpcnR1YWwgYmFzZSBsaXN0LiAqLworICAgICAgVFlQRV9WSVJUVUFMX0JBU0VfTElTVCh0eXBlKSA9IHZpcnR1YWxfYmFzZV9saXN0KHR5cGUpOworICAgIH0KKyAgZWxzZQorICAgIFRZUEVfUlVOVElNRV9QVFIodHlwZSkgPSBOVUxMOworCisgIC8qIElmIHRoaXMgaXMgYSBsb2NhbCB0eXBlIChDKysgLSBkZWNsYXJlZCBpbnNpZGUgYSBmdW5jdGlvbiksIHJlY29yZCBmaWxlIG5hbWUgJiBsaW5lICMgKi8KKyAgaWYgKGhwcmVhZF9nZXRfc2NvcGVfZGVwdGggKGRuX2J1ZnAsIG9iamZpbGUsIDEgLyogbm8gbmVlZCBmb3IgcmVhbCBkZXB0aCAqLykpCisgICAgeworICAgICAgVFlQRV9MT0NBTFRZUEVfUFRSICh0eXBlKSA9IChzdHJ1Y3QgbG9jYWxfdHlwZV9pbmZvICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxvY2FsX3R5cGVfaW5mbykpOworICAgICAgVFlQRV9MT0NBTFRZUEVfRklMRSAodHlwZSkgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGN1cnJlbnRfc3ViZmlsZS0+bmFtZSkgKyAxKTsKKyAgICAgIHN0cmNweSAoVFlQRV9MT0NBTFRZUEVfRklMRSAodHlwZSksIGN1cnJlbnRfc3ViZmlsZS0+bmFtZSk7CisgICAgICBpZiAoY3VycmVudF9zdWJmaWxlLT5saW5lX3ZlY3RvciAmJiAoY3VycmVudF9zdWJmaWxlLT5saW5lX3ZlY3Rvci0+bml0ZW1zID4gMCkpCisgICAgICAgIFRZUEVfTE9DQUxUWVBFX0xJTkUgKHR5cGUpID0gY3VycmVudF9zdWJmaWxlLT5saW5lX3ZlY3Rvci0+aXRlbVtjdXJyZW50X3N1YmZpbGUtPmxpbmVfdmVjdG9yLT5uaXRlbXMgLSAxXS5saW5lOworICAgICAgZWxzZQorICAgICAgICBUWVBFX0xPQ0FMVFlQRV9MSU5FICh0eXBlKSA9IDA7CisgICAgfQorICBlbHNlCisgICAgVFlQRV9MT0NBTFRZUEVfUFRSICh0eXBlKSA9IE5VTEw7CisKKyAgLyogQ2xlYXIgdGhlIGdsb2JhbCBzYXlpbmcgd2hhdCB0ZW1wbGF0ZSB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBwcm9jZXNzaW5nICovCisgIGN1cnJlbnRfdGVtcGxhdGUgPSBOVUxMOworCisgIHJldHVybiB0eXBlOworfQorCisvKiBBZGp1c3QgdGhlIHBoeXNuYW1lcyBmb3IgZWFjaCBzdGF0aWMgbWVtYmVyIG9mIGEgc3RydWN0CisgICBvciBjbGFzcyB0eXBlIHRvIGJlIHNvbWV0aGluZyBsaWtlICJBOjp4IjsgdGhlbiB2YXJpb3VzCisgICBvdGhlciBwaWVjZXMgb2YgY29kZSB0aGF0IGRvIGEgbG9va3VwX3N5bWJvbCBvbiB0aGUgcGh5bmFtZQorICAgd29yayBjb3JyZWN0bHkuCisgICBUWVBFIGlzIGEgcG9pbnRlciB0byB0aGUgc3RydWN0L2NsYXNzIHR5cGUKKyAgIE5BTUUgaXMgYSBjaGFyICogKHN0cmluZykgd2hpY2ggaXMgdGhlIGNsYXNzL3N0cnVjdCBuYW1lCisgICBWb2lkIHJldHVybiAqLyAKKworc3RhdGljIHZvaWQKK2ZpeF9zdGF0aWNfbWVtYmVyX3BoeXNuYW1lcyAodHlwZSwgY2xhc3NfbmFtZSwgb2JqZmlsZSkKKyAgc3RydWN0IHR5cGUgKiB0eXBlOworICBjaGFyICogY2xhc3NfbmFtZTsKKyAgc3RydWN0IG9iamZpbGUgKiBvYmpmaWxlOworeworICBpbnQgaTsKKworICAvKiBXZSBmaXggdGhlIG1lbWJlciBuYW1lcyBvbmx5IGZvciBjbGFzc2VzIG9yIHN0cnVjdHMgKi8gCisgIGlmIChUWVBFX0NPREUgKHR5cGUpICE9IFRZUEVfQ09ERV9TVFJVQ1QpCisgICAgcmV0dXJuOworCisgIGZvciAoaT0wOyBpIDwgVFlQRV9ORklFTERTICh0eXBlKTsgaSsrKQorICAgIGlmIChUWVBFX0ZJRUxEX1NUQVRJQyAodHlwZSwgaSkpCisgICAgICB7CisgICAgICAgIGlmIChUWVBFX0ZJRUxEX1NUQVRJQ19QSFlTTkFNRSAodHlwZSwgaSkpCisgICAgICAgICAgcmV0dXJuOyAgLyogcGh5c25hbWVzIGFyZSBhbHJlYWR5IHNldCAqLworCisgICAgICAgIFNFVF9GSUVMRF9QSFlTTkFNRSAodHlwZS0+ZmllbGRzW2ldLCAKKyAgICAgICAgICAgICAgICAgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnR5cGVfb2JzdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4gKGNsYXNzX25hbWUpICsgc3RybGVuIChUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIGkpKSArIDMpKTsKKyAgICAgICAgc3RyY3B5IChUWVBFX0ZJRUxEX1NUQVRJQ19QSFlTTkFNRSAodHlwZSwgaSksIGNsYXNzX25hbWUpOworICAgICAgICBzdHJjYXQgKFRZUEVfRklFTERfU1RBVElDX1BIWVNOQU1FICh0eXBlLCBpKSwgIjo6Iik7CisgICAgICAgIHN0cmNhdCAoVFlQRV9GSUVMRF9TVEFUSUNfUEhZU05BTUUgKHR5cGUsIGkpLCBUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIGkpKTsKKyAgICAgIH0KK30KKworLyogRml4LXVwIHRoZSB0eXBlIHN0cnVjdHVyZSBmb3IgYSBDTEFTUyBzbyB0aGF0IHRoZSB0eXBlIGVudHJ5CisgKiBmb3IgYSBtZXRob2QgKHByZXZpb3VzbHkgbWFya2VkIHdpdGggYSBudWxsIHR5cGUgaW4gaHByZWFkX3JlYWRfc3RydWN0X3R5cGUoKQorICogaXMgc2V0IGNvcnJlY3RseSB0byBNRVRIT0QuCisgKiBPQkpGSUxFIGlzIGFzIGZvciBvdGhlciBzdWNoIGZ1bmN0aW9ucy4gCisgKiBWb2lkIHJldHVybi4gKi8gCisgCitzdGF0aWMgdm9pZAorZml4dXBfY2xhc3NfbWV0aG9kX3R5cGUgKGNsYXNzLCBtZXRob2QsIG9iamZpbGUpCisgIHN0cnVjdCB0eXBlICogY2xhc3M7CisgIHN0cnVjdCB0eXBlICogbWV0aG9kOworICBzdHJ1Y3Qgb2JqZmlsZSAqIG9iamZpbGU7Cit7CisgIGludCBpLCBqLCBrOworCisgIGlmICghY2xhc3MgfHwgIW1ldGhvZCB8fCAhb2JqZmlsZSkKKyAgICByZXR1cm47CisKKyAgLyogT25seSBmb3IgdHlwZXMgdGhhdCBoYXZlIG1ldGhvZHMgKi8KKyAgaWYgKChUWVBFX0NPREUgKGNsYXNzKSAhPSBUWVBFX0NPREVfQ0xBU1MpICYmCisgICAgICAoVFlQRV9DT0RFIChjbGFzcykgIT0gVFlQRV9DT0RFX1VOSU9OKSkKKyAgICByZXR1cm47CisKKyAgLyogTG9vcCBvdmVyIGFsbCBtZXRob2RzIGFuZCBmaW5kIHRoZSBvbmUgbWFya2VkIHdpdGggYSBOVUxMIHR5cGUgKi8gCisgIGZvciAoaSA9IDA7IGkgPCBUWVBFX05GTl9GSUVMRFMgKGNsYXNzKTsgaSsrKQorICAgIGZvciAoaiA9IDA7IGogPCBUWVBFX0ZOX0ZJRUxETElTVF9MRU5HVEggKGNsYXNzLCBpKTsgaisrKQorICAgICAgaWYgKFRZUEVfRk5fRklFTERfVFlQRSAoVFlQRV9GTl9GSUVMRExJU1QxIChjbGFzcywgaSksIGopID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTZXQgdGhlIG1ldGhvZCB0eXBlICovIAorICAgICAgICAgIFRZUEVfRk5fRklFTERfVFlQRSAoVFlQRV9GTl9GSUVMRExJU1QxIChjbGFzcywgaSksIGopID0gbWV0aG9kOworICAgICAgICAgIC8qIFRoZSBhcmd1bWVudCBsaXN0ICovCisgICAgICAgICAgKFRZUEVfRk5fRklFTERfVFlQRSAoVFlQRV9GTl9GSUVMRExJU1QxIChjbGFzcywgaSksIGopKS0+dHlwZV9zcGVjaWZpYy5hcmdfdHlwZXMKKyAgICAgICAgICAgID0gKHN0cnVjdCB0eXBlICoqKSBvYnN0YWNrX2FsbG9jKCZvYmpmaWxlLT50eXBlX29ic3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHR5cGUgKikgKiAobWV0aG9kLT5uZmllbGRzICsgMSkpOworICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBtZXRob2QtPm5maWVsZHM7IGsrKykgCisgICAgICAgICAgKFRZUEVfRk5fRklFTERfVFlQRSAoVFlQRV9GTl9GSUVMRExJU1QxIChjbGFzcywgaSksIGopKS0+dHlwZV9zcGVjaWZpYy5hcmdfdHlwZXNba10gPSBtZXRob2QtPmZpZWxkc1trXS50eXBlOworICAgICAgICAgIC8qIHZvaWQgdGVybWluYXRpb24gKi8gCisgICAgICAgICAgKFRZUEVfRk5fRklFTERfVFlQRSAoVFlQRV9GTl9GSUVMRExJU1QxIChjbGFzcywgaSksIGopKS0+dHlwZV9zcGVjaWZpYy5hcmdfdHlwZXNbbWV0aG9kLT5uZmllbGRzXSA9IGJ1aWx0aW5fdHlwZV92b2lkOworICAgICAgICAgIAorICAgICAgICAgIC8qIHBhaTogSXQncyBub3QgY2xlYXIgd2h5IHRoaXMgYXJncyBmaWVsZCBoYXMgdG8gYmUgc2V0LiAgUGVyaGFwcworICAgICAgICAgICAqIGl0IHNob3VsZCBiZSBlbGltaW5hdGVkIGVudGlyZWx5LiAqLworICAgICAgICAgIChUWVBFX0ZOX0ZJRUxEIChUWVBFX0ZOX0ZJRUxETElTVDEgKGNsYXNzLCBpKSwgaikpLmFyZ3MKKyAgICAgICAgICAgID0gKHN0cnVjdCB0eXBlICoqKSBvYnN0YWNrX2FsbG9jKCZvYmpmaWxlLT50eXBlX29ic3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHR5cGUgKikgKiAobWV0aG9kLT5uZmllbGRzICsgMSkpOworICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBtZXRob2QtPm5maWVsZHM7IGsrKykKKyAgICAgICAgICAgIChUWVBFX0ZOX0ZJRUxEIChUWVBFX0ZOX0ZJRUxETElTVDEgKGNsYXNzLCBpKSwgaikpLmFyZ3Nba10gPSBtZXRob2QtPmZpZWxkc1trXS50eXBlOworICAgICAgICAgIC8qIG51bGwtdGVybWluYXRlZCwgdW5saWtlIGFyZ190eXBlcyBhYm92ZSAqLyAKKyAgICAgICAgICAoVFlQRV9GTl9GSUVMRCAoVFlQRV9GTl9GSUVMRExJU1QxIChjbGFzcywgaSksIGopKS5hcmdzW21ldGhvZC0+bmZpZWxkc10gPSBOVUxMOworCisgICAgICAgICAgLyogQnJlYWsgb3V0IG9mIGJvdGggbG9vcHMgLS0gb25seSBvbmUgbWV0aG9kIHRvIGZpeCB1cCBpbiBhIGNsYXNzICovIAorICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICB9CisKK2ZpbmlzaDoKKyAgVFlQRV9GTEFHUyAoY2xhc3MpICY9IH5UWVBFX0ZMQUdfSU5DT01QTEVURTsgIAorfQorCisKKy8qIElmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgcHJvY2Vzc2luZyBhIHRlbXBsYXRlLCBnZXQgYSBwb2ludGVyCisgKiB0byB0aGUgTnRoIHRlbXBsYXRlIGFyZ3VtZW50LgorICogQW4gZXhhbXBsZSBtYXkgbWFrZSB0aGlzIGNsZWFyZXI6CisgKiAgIHRlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+IGNsYXNzIHEyIHsKKyAqICAgICBwdWJsaWM6CisgKiAgICAgVDEgYTsKKyAqICAgICBUMiBiOworICogICB9OworICogVGhlIHR5cGUgZm9yICJhIiB3aWxsIGJlICJmaXJzdCB0ZW1wbGF0ZSBhcmciIGFuZAorICogdGhlIHR5cGUgZm9yICJiIiB3aWxsIGJlICJzZWNvbmQgdGVtcGxhdGUgYXJnIi4KKyAqIFdlIG5lZWQgdG8gbG9vayB0aGVzZSB1cCBpbiBvcmRlciB0byBmaWxsIGluICJhIiBhbmQgImIiJ3MgdHlwZS4KKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gaHByZWFkX3R5cGVfbG9va3VwKCkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqIAoraHByZWFkX2dldF9udGhfdGVtcGxhdGVfYXJnKG9iamZpbGUsIG4pCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBpbnQgbjsKK3sKKyAgIGlmIChjdXJyZW50X3RlbXBsYXRlICE9IE5VTEwpCisgICAgIHJldHVybiBUWVBFX1RFTVBMQVRFX0FSRyhjdXJyZW50X3RlbXBsYXRlLCBuKS50eXBlOworICAgZWxzZQorICAgICByZXR1cm4gbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUgKG9iamZpbGUsIEZUX1RFTVBMQVRFX0FSRyk7Cit9CisKKy8qIFJlYWQgaW4gYW5kIGludGVybmFsaXplIGEgVEVNUExfQVJHICh0ZW1wbGF0ZSBhcmcpIHN5bWJvbC4gICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitocHJlYWRfcmVhZF90ZW1wbF9hcmdfdHlwZSAoaHBfdHlwZSwgZG5fYnVmcCwgb2JqZmlsZSwgbmFtZSkKKyAgICAgZG50dHBvaW50ZXIgaHBfdHlwZTsKKyAgICAgdW5pb24gZG50dGVudHJ5ICpkbl9idWZwOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgY2hhciAqIG5hbWU7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlOworCisgIC8qIFNlZSBpZiBpdCdzIHNvbWV0aGluZyB3ZSd2ZSBhbHJlYWR5IGRlYWwgd2l0aC4gICovCisgIHR5cGUgPSBocHJlYWRfYWxsb2NfdHlwZSAoaHBfdHlwZSwgb2JqZmlsZSk7CisgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9URU1QTEFURV9BUkcpCisgICAgcmV0dXJuIHR5cGU7CisKKyAgLyogTm9wZS4gIEZpbGwgaW4gdGhlIGFwcHJvcHJpYXRlIGZpZWxkcy4gICovCisgIFRZUEVfQ09ERSAodHlwZSkgPSBUWVBFX0NPREVfVEVNUExBVEVfQVJHOworICBUWVBFX0xFTkdUSCAodHlwZSkgPSAwOworICBUWVBFX05GSUVMRFMgKHR5cGUpID0gMDsKKyAgVFlQRV9OQU1FICh0eXBlKSA9IG5hbWU7CisgIHJldHVybiB0eXBlOworfQorCisvKiBSZWFkIGluIGFuZCBpbnRlcm5hbGl6ZSBhIHNldCBkZWJ1ZyBzeW1ib2wuICAqLworCitzdGF0aWMgc3RydWN0IHR5cGUgKgoraHByZWFkX3JlYWRfc2V0X3R5cGUgKGhwX3R5cGUsIGRuX2J1ZnAsIG9iamZpbGUpCisgICAgIGRudHRwb2ludGVyIGhwX3R5cGU7CisgICAgIHVuaW9uIGRudHRlbnRyeSAqZG5fYnVmcDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlOworCisgIC8qIFNlZSBpZiBpdCdzIHNvbWV0aGluZyB3ZSd2ZSBhbHJlYWR5IGRlYWwgd2l0aC4gICovCisgIHR5cGUgPSBocHJlYWRfYWxsb2NfdHlwZSAoaHBfdHlwZSwgb2JqZmlsZSk7CisgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9TRVQpCisgICAgcmV0dXJuIHR5cGU7CisKKyAgLyogTm9wZS4gIEZpbGwgaW4gdGhlIGFwcHJvcHJpYXRlIGZpZWxkcy4gICovCisgIFRZUEVfQ09ERSAodHlwZSkgPSBUWVBFX0NPREVfU0VUOworICBUWVBFX0xFTkdUSCAodHlwZSkgPSBkbl9idWZwLT5kc2V0LmJpdGxlbmd0aCAvIDg7CisgIFRZUEVfTkZJRUxEUyAodHlwZSkgPSAwOworICBUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSA9IGhwcmVhZF90eXBlX2xvb2t1cCAoZG5fYnVmcC0+ZHNldC5zdWJ0eXBlLAorCQkJCQkJb2JqZmlsZSk7CisgIHJldHVybiB0eXBlOworfQorCisvKiBSZWFkIGluIGFuZCBpbnRlcm5hbGl6ZSBhbiBhcnJheSBkZWJ1ZyBzeW1ib2wuICAqLworCitzdGF0aWMgc3RydWN0IHR5cGUgKgoraHByZWFkX3JlYWRfYXJyYXlfdHlwZSAoaHBfdHlwZSwgZG5fYnVmcCwgb2JqZmlsZSkKKyAgICAgZG50dHBvaW50ZXIgaHBfdHlwZTsKKyAgICAgdW5pb24gZG50dGVudHJ5ICpkbl9idWZwOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IHR5cGUgKnR5cGU7CisgIAorICAvKiBBbGxvY2F0ZSBhbiBhcnJheSB0eXBlIHN5bWJvbC4KKyAgICogV2h5IG5vIGNoZWNrIGZvciBhbHJlYWR5LXJlYWQgaGVyZSwgbGlrZSBpbiB0aGUgb3RoZXIKKyAgICogaHByZWFkX3JlYWRfeHh4X3R5cGUgcm91dGluZXM/ICBCZWNhdXNlIGl0IGtlcHQgdXMgCisgICAqIGZyb20gcHJvcGVybHkgZGV0ZXJtaW5pbmcgdGhlIHNpemUgb2YgdGhlIGFycmF5ISAgCisgICAqLworICB0eXBlID0gaHByZWFkX2FsbG9jX3R5cGUgKGhwX3R5cGUsIG9iamZpbGUpOworCisgIFRZUEVfQ09ERSAodHlwZSkgPSBUWVBFX0NPREVfQVJSQVk7CisKKyAgLyogQWx0aG91Z2ggdGhlIGhwLXN5bXRhYi5oIGRvZXMgbm90ICpyZXF1aXJlKiB0aGlzIHRvIGJlIHRoZSBjYXNlLAorICAgKiBHREIgaXMgYXNzdW1pbmcgdGhhdCAiYXJyYXlpc2J5dGVzIiBhbmQgImVsZW1pc2J5dGVzIiBiZSBjb25zaXN0ZW50LgorICAgKiBJLmUuLCBleHByZXNzIGJvdGggYXJyYXktbGVuZ3RoIGFuZCBlbGVtZW50LWxlbmd0aCBpbiBiaXRzLAorICAgKiBvciBleHByZXNzIGJvdGggYXJyYXktbGVuZ3RoIGFuZCBlbGVtZW50LWxlbmd0aCBpbiBieXRlcy4KKyAgICovCisgIGlmICghKChkbl9idWZwLT5kYXJyYXkuYXJyYXlpc2J5dGVzICYmIGRuX2J1ZnAtPmRhcnJheS5lbGVtaXNieXRlcykgfHwKKwkoIWRuX2J1ZnAtPmRhcnJheS5hcnJheWlzYnl0ZXMgJiYgIWRuX2J1ZnAtPmRhcnJheS5lbGVtaXNieXRlcykpKSB7CisgICAgd2FybmluZyAoImVycm9yIGluIGhwcmVhZF9hcnJheV90eXBlLlxuIik7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKGRuX2J1ZnAtPmRhcnJheS5hcnJheWxlbmd0aCA9PSAweDdmZmZmZmZmKSB7CisgICAgLyogVGhlIEhQIGRlYnVnIGZvcm1hdCByZXByZXNlbnRzIGNoYXIgZm9vW107IGFzIGFuIGFycmF5IHdpdGgKKyAgICAgKiBsZW5ndGggMHg3ZmZmZmZmZi4gIEludGVybmFsbHkgR0RCIHdhbnRzIHRvIHJlcHJlc2VudCB0aGlzCisgICAgICoJYXMgYW4gYXJyYXkgb2YgbGVuZ3RoIHplcm8uICAKKyAgICAgKi8KKyAgICBUWVBFX0xFTkdUSCAodHlwZSkgPSAwOworICB9IGVsc2UgaWYgKGRuX2J1ZnAtPmRhcnJheS5hcnJheWlzYnl0ZXMpCisgICAgVFlQRV9MRU5HVEggKHR5cGUpID0gZG5fYnVmcC0+ZGFycmF5LmFycmF5bGVuZ3RoOworICBlbHNlIC8qIGFycmF5bGVuZ3RoIGlzIGluIGJpdHMgKi8KKyAgICBUWVBFX0xFTkdUSCAodHlwZSkgPSBkbl9idWZwLT5kYXJyYXkuYXJyYXlsZW5ndGggLyA4OworCisgIFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpID0gaHByZWFkX3R5cGVfbG9va3VwIChkbl9idWZwLT5kYXJyYXkuZWxlbXR5cGUsCisJCQkJCQlvYmpmaWxlKTsKKworICAvKiBUaGUgb25lICJmaWVsZCIgaXMgdXNlZCB0byBzdG9yZSB0aGUgc3Vic2NyaXB0IHR5cGUgKi8KKyAgLyogU2luY2UgQyBhbmQgQysrIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBhcmUgc2ltcGx5IHJlcHJlc2VudGVkCisgICAqIGFzOiBhcnJheSBvZiBhcnJheSBvZiAuLi4sIHdlIG9ubHkgbmVlZCBvbmUgc3Vic2NyaXB0LXR5cGUKKyAgICogcGVyIGFycmF5LiBUaGlzIHN1YnNjcmlwdCB0eXBlIGlzIHR5cGljYWxseSBhIHN1YnJhbmdlIG9mIGludGVnZXIuCisgICAqIElmIHRoaXMgZ2V0cyBleHRlbmRlZCB0byBzdXBwb3J0IGxhbmd1YWdlcyBsaWtlIFBhc2NhbCwgdGhlbgorICAgKiB3ZSBuZWVkIHRvIGZpeCB0aGlzIHRvIHJlcHJlc2VudCBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgcHJvcGVybHkuCisgICAqLworICBUWVBFX05GSUVMRFMgKHR5cGUpID0gMTsKKyAgVFlQRV9GSUVMRFMgKHR5cGUpID0gKHN0cnVjdCBmaWVsZCAqKQorICAgIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT50eXBlX29ic3RhY2ssIHNpemVvZiAoc3RydWN0IGZpZWxkKSk7CisgIFRZUEVfRklFTERfVFlQRSAodHlwZSwgMCkgPSBocHJlYWRfdHlwZV9sb29rdXAgKGRuX2J1ZnAtPmRhcnJheS5pbmRleHR5cGUsCisJCQkJCQkgIG9iamZpbGUpOworICByZXR1cm4gdHlwZTsKK30KKworLyogUmVhZCBpbiBhbmQgaW50ZXJuYWxpemUgYSBzdWJyYW5nZSBkZWJ1ZyBzeW1ib2wuICAqLworc3RhdGljIHN0cnVjdCB0eXBlICoKK2hwcmVhZF9yZWFkX3N1YnJhbmdlX3R5cGUgKGhwX3R5cGUsIGRuX2J1ZnAsIG9iamZpbGUpCisgICAgIGRudHRwb2ludGVyIGhwX3R5cGU7CisgICAgIHVuaW9uIGRudHRlbnRyeSAqZG5fYnVmcDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlOworCisgIC8qIElzIGl0IHNvbWV0aGluZyB3ZSd2ZSBhbHJlYWR5IGRlYWx0IHdpdGguICAqLworICB0eXBlID0gaHByZWFkX2FsbG9jX3R5cGUgKGhwX3R5cGUsIG9iamZpbGUpOworICBpZiAoVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfUkFOR0UpCisgICAgcmV0dXJuIHR5cGU7CisKKyAgLyogTm9wZSwgaW50ZXJuYWxpemUgaXQuICAqLworICBUWVBFX0NPREUgKHR5cGUpID0gVFlQRV9DT0RFX1JBTkdFOworICBUWVBFX0xFTkdUSCAodHlwZSkgPSBkbl9idWZwLT5kc3Vici5iaXRsZW5ndGggLyA4OworICBUWVBFX05GSUVMRFMgKHR5cGUpID0gMjsKKyAgVFlQRV9GSUVMRFMgKHR5cGUpCisgICAgPSAoc3RydWN0IGZpZWxkICopIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT50eXBlX29ic3RhY2ssCisJCQkJICAgICAgMiAqIHNpemVvZiAoc3RydWN0IGZpZWxkKSk7CisKKyAgaWYgKGRuX2J1ZnAtPmRzdWJyLmR5bl9sb3cpCisgICAgVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIDApID0gMDsKKyAgZWxzZQorICAgIFRZUEVfRklFTERfQklUUE9TICh0eXBlLCAwKSA9IGRuX2J1ZnAtPmRzdWJyLmxvd2JvdW5kOworCisgIGlmIChkbl9idWZwLT5kc3Vici5keW5faGlnaCkKKyAgICBUWVBFX0ZJRUxEX0JJVFBPUyAodHlwZSwgMSkgPSAtMTsKKyAgZWxzZQorICAgIFRZUEVfRklFTERfQklUUE9TICh0eXBlLCAxKSA9IGRuX2J1ZnAtPmRzdWJyLmhpZ2hib3VuZDsKKyAgVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkgPSBocHJlYWRfdHlwZV9sb29rdXAgKGRuX2J1ZnAtPmRzdWJyLnN1YnR5cGUsCisJCQkJCQlvYmpmaWxlKTsKKyAgcmV0dXJuIHR5cGU7Cit9CisKKy8qIHN0cnVjdCB0eXBlICogaHByZWFkX3R5cGVfbG9va3VwKGhwX3R5cGUsIG9iamZpbGUpCisgKiAgIEFyZ3VtZW50czoKKyAqICAgICBocF90eXBlOiBBIHBvaW50ZXIgaW50byB0aGUgRE5UVCBzcGVjaWZ5aW5nIHdoYXQgdHlwZSB3ZQorICogICAgICAgICAgICAgIGFyZSBhYm91dCB0byAibG9vayB1cCIuLCBvciBlbHNlIFtmb3IgZnVuZGFtZW50YWwgdHlwZXMKKyAqICAgICAgICAgICAgICBsaWtlIGludCwgZmxvYXQsIC4uLl0gYW4gImltbWVkaWF0ZSIgc3RydWN0dXJlIGRlc2NyaWJpbmcKKyAqICAgICAgICAgICAgICB0aGUgdHlwZS4KKyAqICAgICBvYmpmaWxlOiA/CisgKiAgIFJldHVybiB2YWx1ZTogQSBwb2ludGVyIHRvIGEgInN0cnVjdCB0eXBlIiAocmVwcmVzZW50YXRpb24gb2YgYQorICogICAgICAgICAgICAgICAgIHR5cGUgaW4gR0RCJ3MgaW50ZXJuYWwgc3ltYm9sIHRhYmxlIC0gc2VlIGdkYnR5cGVzLmgpCisgKiAgIFJvdXRpbmUgZGVzY3JpcHRpb246CisgKiAgICAgVGhlcmUgYXJlIGEgdmFyaWV0eSBvZiBwbGFjZXMgd2hlbiBzY2FubmluZyB0aGUgRE5UVCB3aGVuIHdlCisgKiAgICAgbmVlZCB0byBpbnRlcnByZXQgYSAidHlwZSIgZmllbGQuIFRoZSBzaW1wbGVzdCBhbmQgbW9zdCBiYXNpYyAKKyAqICAgICBleGFtcGxlIGlzIHdoZW4gd2UncmUgcHJvY2Vzc2luZyB0aGUgc3ltYm9sIHRhYmxlIHJlY29yZAorICogICAgIGZvciBhIGRhdGEgc3ltYm9sIChhIFNWQVIgb3IgRFZBUiByZWNvcmQpLiBUaGF0IGhhcworICogICAgIGEgInR5cGUiIGZpZWxkIHNwZWNpZnlpbmcgdGhlIHR5cGUgb2YgdGhlIGRhdGEgc3ltYm9sLiBUaGF0CisgKiAgICAgInR5cGUiIGZpZWxkIGlzIGVpdGhlciBhbiAiaW1tZWRpYXRlIiB0eXBlIHNwZWNpZmljYXRpb24gKGZvciB0aGUKKyAqICAgICBmdW5kYW1lbnRhbCB0eXBlcykgb3IgYSBETlRUIHBvaW50ZXIgKGZvciBtb3JlIGNvbXBsaWNhdGVkIHR5cGVzKS4gCisgKiAgICAgRm9yIHRoZSBtb3JlIGNvbXBsaWNhdGVkIHR5cGVzLCB3ZSBtYXkgb3IgbWF5IG5vdCBoYXZlIGFscmVhZHkKKyAqICAgICBwcm9jZXNzZWQgdGhlIHBvaW50ZWQtdG8gdHlwZS4gKE11bHRpcGxlIGRhdGEgc3ltYm9scyBjYW4gb2YgY291cnNlCisgKiAgICAgc2hhcmUgdGhlIHNhbWUgdHlwZSkuCisgKiAgICAgVGhlIGpvYiBvZiBocHJlYWRfdHlwZV9sb29rdXAoKSBpcyB0byBwcm9jZXNzIHRoaXMgInR5cGUiIGZpZWxkLgorICogICAgIE1vc3Qgb2YgdGhlIHJlYWwgd29yayBpcyBkb25lIGluIHN1YnJvdXRpbmVzLiBIZXJlIHdlIGludGVycHJldAorICogICAgIHRoZSBpbW1lZGlhdGUgZmxhZy4gSWYgbm90IGltbWVkaWF0ZSwgY2hhc2UgdGhlIEROVFQgcG9pbnRlciB0bworICogICAgIGZpbmQgb3VyIHdheSB0byB0aGUgU09NIHJlY29yZCBkZXNjcmliaW5nIHRoZSB0eXBlLCBzd2l0Y2ggb24KKyAqICAgICB0aGUgU09NIGtpbmQsIGFuZCB0aGVuIGNhbGwgYW4gYXBwcm9wcmlhdGUgc3Vicm91dGluZSBkZXBlbmRpbmcKKyAqICAgICBvbiB3aGF0IGtpbmQgb2YgdHlwZSB3ZSBhcmUgY29uc3RydWN0aW5nLiAoZS5nLiwgYW4gYXJyYXkgdHlwZSwKKyAqICAgICBhIHN0cnVjdC9jbGFzcyB0eXBlLCBldGMpLgorICovCitzdGF0aWMgc3RydWN0IHR5cGUgKgoraHByZWFkX3R5cGVfbG9va3VwIChocF90eXBlLCBvYmpmaWxlKQorICAgICBkbnR0cG9pbnRlciBocF90eXBlOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgdW5pb24gZG50dGVudHJ5ICpkbl9idWZwOworICBzdHJ1Y3QgdHlwZSAqIHRtcF90eXBlOworCisgIC8qIEZpcnN0IHNlZSBpZiBpdCdzIGEgc2ltcGxlIGJ1aWx0aW4gdHlwZS4gICovCisgIGlmIChocF90eXBlLmRudHRpLmltbWVkaWF0ZSkKKyAgICAvKiBJZiB0aGlzIGlzIGEgdGVtcGxhdGUgYXJndW1lbnQsIHRoZSBhcmd1bWVudCBudW1iZXIgaXMKKyAgICAgKiBlbmNvZGVkIGluIHRoZSBiaXRsZW5ndGguIEFsbCBvdGhlciBjYXNlcywganVzdCByZXR1cm4KKyAgICAgKiBHREIncyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGZ1bmRhbWVudGFsIHR5cGUuCisgICAgICovCisgICAgaWYgKGhwX3R5cGUuZG50dGkudHlwZSA9PSBIUF9UWVBFX1RFTVBMQVRFX0FSRykKKyAgICAgIHJldHVybiBocHJlYWRfZ2V0X250aF90ZW1wbGF0ZV9hcmcob2JqZmlsZSwgaHBfdHlwZS5kbnR0aS5iaXRsZW5ndGgpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBsb29rdXBfZnVuZGFtZW50YWxfdHlwZSAob2JqZmlsZSwgaHByZWFkX3R5cGVfdHJhbnNsYXRlIChocF90eXBlKSk7CisKKyAgLyogTm90IGEgYnVpbHRpbiB0eXBlLiAgV2UnbGwgaGF2ZSB0byByZWFkIGl0IGluLiAgKi8KKyAgaWYgKGhwX3R5cGUuZG50dHAuaW5kZXggPCBMTlRUX1NZTUNPVU5UIChvYmpmaWxlKSkKKyAgICBkbl9idWZwID0gaHByZWFkX2dldF9sbnR0IChocF90eXBlLmRudHRwLmluZGV4LCBvYmpmaWxlKTsKKyAgZWxzZQorICAgIC8qIFRoaXMgaXMgYSBmYW5jeSB3YXkgb2YgcmV0dXJuaW5nIE5VTEwgKi8KKyAgICByZXR1cm4gbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUgKG9iamZpbGUsIEZUX1ZPSUQpOworCisgIHN3aXRjaCAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQpCisgICAgeworICAgIGNhc2UgRE5UVF9UWVBFX1NSQ0ZJTEU6CisgICAgY2FzZSBETlRUX1RZUEVfTU9EVUxFOgorICAgIGNhc2UgRE5UVF9UWVBFX0VOVFJZOgorICAgIGNhc2UgRE5UVF9UWVBFX0JFR0lOOgorICAgIGNhc2UgRE5UVF9UWVBFX0VORDoKKyAgICBjYXNlIEROVFRfVFlQRV9JTVBPUlQ6CisgICAgY2FzZSBETlRUX1RZUEVfTEFCRUw6CisgICAgY2FzZSBETlRUX1RZUEVfRlBBUkFNOgorICAgIGNhc2UgRE5UVF9UWVBFX1NWQVI6CisgICAgY2FzZSBETlRUX1RZUEVfRFZBUjoKKyAgICBjYXNlIEROVFRfVFlQRV9DT05TVDoKKyAgICBjYXNlIEROVFRfVFlQRV9NRU1FTlVNOgorICAgIGNhc2UgRE5UVF9UWVBFX1ZBUklBTlQ6CisgICAgY2FzZSBETlRUX1RZUEVfRklMRToKKyAgICBjYXNlIEROVFRfVFlQRV9XSVRIOgorICAgIGNhc2UgRE5UVF9UWVBFX0NPTU1PTjoKKyAgICBjYXNlIEROVFRfVFlQRV9DT0JTVFJVQ1Q6CisgICAgY2FzZSBETlRUX1RZUEVfWFJFRjoKKyAgICBjYXNlIEROVFRfVFlQRV9TQToKKyAgICBjYXNlIEROVFRfVFlQRV9NQUNSTzoKKyAgICBjYXNlIEROVFRfVFlQRV9CTE9DS0RBVEE6CisgICAgY2FzZSBETlRUX1RZUEVfQ0xBU1NfU0NPUEU6CisgICAgY2FzZSBETlRUX1RZUEVfTUVNQUNDRVNTOgorICAgIGNhc2UgRE5UVF9UWVBFX0lOSEVSSVRBTkNFOgorICAgIGNhc2UgRE5UVF9UWVBFX09CSkVDVF9JRDoKKyAgICBjYXNlIEROVFRfVFlQRV9GUklFTkRfQ0xBU1M6CisgICAgY2FzZSBETlRUX1RZUEVfRlJJRU5EX0ZVTkM6CisgICAgICAvKiBUaGVzZSBhcmUgbm90IHR5cGVzIC0gc29tZXRoaW5nIHdlbnQgd3JvbmcuICAqLworICAgICAgLyogVGhpcyBpcyBhIGZhbmN5IHdheSBvZiByZXR1cm5pbmcgTlVMTCAqLworICAgICAgcmV0dXJuIGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCBGVF9WT0lEKTsKKworICAgIGNhc2UgRE5UVF9UWVBFX0ZVTkNUSU9OOgorICAgICAgLyogV2Ugd2luZCB1cCBoZXJlIHdoZW4gZGVhbGluZyB3aXRoIGNsYXNzIG1lbWJlciBmdW5jdGlvbnMgCisgICAgICAgKiAoY2FsbGVkIGZyb20gaHByZWFkX3JlYWRfc3RydWN0X3R5cGUoKSwgaS5lLiB3aGVuIHByb2Nlc3NpbmcKKyAgICAgICAqIHRoZSBjbGFzcyBkZWZpbml0aW9uIGl0c2VsZikuCisgICAgICAgKi8KKyAgICAgIHJldHVybiBocHJlYWRfcmVhZF9mdW5jdGlvbl90eXBlIChocF90eXBlLCBkbl9idWZwLCBvYmpmaWxlLCAwKTsKKworICAgIGNhc2UgRE5UVF9UWVBFX0RPQ19GVU5DVElPTjoKKyAgICAgIHJldHVybiBocHJlYWRfcmVhZF9kb2NfZnVuY3Rpb25fdHlwZSAoaHBfdHlwZSwgZG5fYnVmcCwgb2JqZmlsZSwgMCk7CisKKyAgICBjYXNlIEROVFRfVFlQRV9UWVBFREVGOgorICAgICAgeworICAgICAgICAvKiBBIHR5cGVkZWYgLSBjaGFzZSBpdCBkb3duIGJ5IG1ha2luZyBhIHJlY3Vyc2l2ZSBjYWxsICovCisJc3RydWN0IHR5cGUgKnN0cnVjdHR5cGUgPSBocHJlYWRfdHlwZV9sb29rdXAgKGRuX2J1ZnAtPmR0eXBlLnR5cGUsCisJCQkJCQkgICAgICBvYmpmaWxlKTsKKworICAgICAgICAvKiBUaGUgZm9sbG93aW5nIGNhbWUgZnJvbSB0aGUgYmFzZSBocHJlYWQuYyB0aGF0IHdlIGluaGVyaXRlZC4KKyAgICAgICAgICogSXQgaXMgV1JPTkcgc28gSSBoYXZlIGNvbW1lbnRlZCBpdCBvdXQuIC0gUlQKKyAgICAgICAgICouLi4KKworCWNoYXIgKnN1ZmZpeDsKKwlzdWZmaXggPSBWVCAob2JqZmlsZSkgKyBkbl9idWZwLT5kdHlwZS5uYW1lOworIAlUWVBFX05BTUUgKHN0cnVjdHR5cGUpID0gc3VmZml4OworCisgICAgICAgICAqIC4uLiBmdXJ0aGVyIGV4cGxhbmF0aW9uIC4uLi4KKyAgICAgICAgICoKKyAgICAgICAgICogV2hhdCB3ZSBoYXZlIGhlcmUgaXMgYSB0eXBlZGVmIHBvaW50aW5nIHRvIGEgdHlwZWRlZi4KKyAgICAgICAgICogRS5nLiwKKyAgICAgICAgICogdHlwZWRlZiBpbnQgZm9vOworICAgICAgICAgKiB0eXBlZGVmIGZvbyBmdW07CisgICAgICAgICAqCisgICAgICAgICAqIFdoYXQgd2UgZGVzaXJlIHRvIGJ1aWxkIGlzICh0aGVzZSBhcmUgcGljdHVyZXMKKyAgICAgICAgICogb2YgInN0cnVjdCB0eXBlIidzKTogCisgICAgICAgICAqCisgICAgICAgICAqICArLS0tLS0tLS0tKyAgICAgKy0tLS0tLS0tLS0rICAgICArLS0tLS0tLS0tLS0tKworICAgICAgICAgKiAgfCB0eXBlZGVmIHwgICAgIHwgdHlwZWRlZiAgfCAgICAgfCBmdW5kLiB0eXBlIHwKKyAgICAgICAgICogIHwgICAgIHR5cGV8IC0+ICB8ICAgICAgdHlwZXwgLT4gIHwgICAgICAgICAgICB8CisgICAgICAgICAqICB8ICJmdW0iICAgfCAgICAgfCAiZm9vIiAgICB8ICAgICB8ICJpbnQiICAgICAgfAorICAgICAgICAgKiAgKy0tLS0tLS0tLSsgICAgICstLS0tLS0tLS0tKyAgICAgKy0tLS0tLS0tLS0tLSsKKyAgICAgICAgICoKKyAgICAgICAgICogV2hhdCB0aGlzIGNvbW1lbnRlZC1vdXQgY29kZSBpcyBkb2luZyBpcyBzbWFzaGluZyB0aGUKKyAgICAgICAgICogbmFtZSBvZiBwb2ludGVkLXRvLXR5cGUgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHBvaW50ZWQtZnJvbQorICAgICAgICAgKiB0eXBlLiBTbyB3ZSB3aW5kIHVwIHdpdGggc29tZXRoaW5nIGxpa2U6CisgICAgICAgICAqCisgICAgICAgICAqICArLS0tLS0tLS0tKyAgICAgKy0tLS0tLS0tLS0rICAgICArLS0tLS0tLS0tLS0tKworICAgICAgICAgKiAgfCB0eXBlZGVmIHwgICAgIHwgdHlwZWRlZiAgfCAgICAgfCBmdW5kLiB0eXBlIHwKKyAgICAgICAgICogIHwgICAgIHR5cGV8IC0+ICB8ICAgICAgdHlwZXwgLT4gIHwgICAgICAgICAgICB8CisgICAgICAgICAqICB8ICJmdW0iICAgfCAgICAgfCAiZnVtIiAgICB8ICAgICB8ICJmdW0iICAgICAgfAorICAgICAgICAgKiAgKy0tLS0tLS0tLSsgICAgICstLS0tLS0tLS0tKyAgICAgKy0tLS0tLS0tLS0tLSsKKyAgICAgICAgICogCisgICAgICAgICAqLworCisJcmV0dXJuIHN0cnVjdHR5cGU7CisgICAgICB9CisKKyAgICBjYXNlIEROVFRfVFlQRV9UQUdERUY6CisJeworCS8qIEp1c3QgYSBsaXR0bGUgZGlmZmVyZW50IGZyb20gYWJvdmUuICBXZSBoYXZlIHRvIHRhY2sgb24KKwkgKiBhbiBpZGVudGlmaWVyIG9mIHNvbWUga2luZCAoc3RydWN0LCB1bmlvbiwgZW51bSwgY2xhc3MsIGV0YykuICAKKyAgICAgICAgICovCisJc3RydWN0IHR5cGUgKnN0cnVjdHR5cGUgPSBocHJlYWRfdHlwZV9sb29rdXAgKGRuX2J1ZnAtPmR0eXBlLnR5cGUsCisJCQkJCQkgICAgICBvYmpmaWxlKTsKKwljaGFyICpwcmVmaXgsICpzdWZmaXg7CisJc3VmZml4ID0gVlQgKG9iamZpbGUpICsgZG5fYnVmcC0+ZHR5cGUubmFtZTsKKworCS8qIExvb2t1cCB0aGUgbmV4dCB0eXBlIGluIHRoZSBsaXN0LiAgSXQgc2hvdWxkIGJlIGEgc3RydWN0dXJlLAorCSAqIHVuaW9uLCBjbGFzcywgZW51bSwgb3IgdGVtcGxhdGUgdHlwZS4gIAorICAgICAgICAgKiBXZSB3aWxsIG5lZWQgdG8gYXR0YWNoIHRoYXQgdG8gb3VyIG5hbWUuICAKKyAgICAgICAgICovCisJaWYgKGRuX2J1ZnAtPmR0eXBlLnR5cGUuZG50dHAuaW5kZXggPCBMTlRUX1NZTUNPVU5UIChvYmpmaWxlKSkKKwkgIGRuX2J1ZnAgPSBocHJlYWRfZ2V0X2xudHQgKGRuX2J1ZnAtPmR0eXBlLnR5cGUuZG50dHAuaW5kZXgsIG9iamZpbGUpOworCWVsc2UgeworICAgICAgICAgIGNvbXBsYWluICgmaHByZWFkX3R5cGVfbG9va3VwX2NvbXBsYWludCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKwlpZiAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX1NUUlVDVCkgeworCSAgcHJlZml4ID0gInN0cnVjdCAiOworCX0gZWxzZSBpZiAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX1VOSU9OKSB7CisJICBwcmVmaXggPSAidW5pb24gIjsKKwl9IGVsc2UgaWYgKGRuX2J1ZnAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9DTEFTUykgeyAKKyAgICAgICAgICAvKiBGdXJ0aGVyIGZpZWxkIGZvciBDTEFTUyBzYXlpbmcgaG93IGl0IHdhcyByZWFsbHkgZGVjbGFyZWQgKi8KKyAgICAgICAgICAvKiAwPT1jbGFzcywgMT09dW5pb24sIDI9PXN0cnVjdCAqLworICAgICAgICAgIGlmIChkbl9idWZwLT5kY2xhc3MuY2xhc3NfZGVjbCA9PSAwKSAKKwkgICAgcHJlZml4ID0gImNsYXNzICI7CisgICAgICAgICAgZWxzZSBpZiAoZG5fYnVmcC0+ZGNsYXNzLmNsYXNzX2RlY2wgPT0gMSkgCisJICAgIHByZWZpeCA9ICJ1bmlvbiAiOworICAgICAgICAgIGVsc2UgaWYgKGRuX2J1ZnAtPmRjbGFzcy5jbGFzc19kZWNsID09IDIpIAorCSAgICBwcmVmaXggPSAic3RydWN0ICI7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJlZml4ID0gIiI7CisJfSBlbHNlIGlmIChkbl9idWZwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfRU5VTSkgeworCSAgcHJlZml4ID0gImVudW0gIjsKKwl9IGVsc2UgaWYgKGRuX2J1ZnAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9URU1QTEFURSkgeworCSAgcHJlZml4ID0gInRlbXBsYXRlICI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJlZml4ID0gIiI7CisgICAgICAgIH0KKworCS8qIEJ1aWxkIHRoZSBjb3JyZWN0IG5hbWUuICAqLworCXN0cnVjdHR5cGUtPm5hbWUKKwkgID0gKGNoYXIgKikgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnR5cGVfb2JzdGFjaywKKwkJCQkgICAgc3RybGVuIChwcmVmaXgpICsgc3RybGVuIChzdWZmaXgpICsgMSk7CisJVFlQRV9OQU1FIChzdHJ1Y3R0eXBlKSA9IHN0cmNweSAoVFlQRV9OQU1FIChzdHJ1Y3R0eXBlKSwgcHJlZml4KTsKKwlUWVBFX05BTUUgKHN0cnVjdHR5cGUpID0gc3RyY2F0IChUWVBFX05BTUUgKHN0cnVjdHR5cGUpLCBzdWZmaXgpOworCVRZUEVfVEFHX05BTUUgKHN0cnVjdHR5cGUpID0gc3VmZml4OworCisgICAgICAgIC8qIEZvciBjbGFzc2VzL3N0cnVjdHMsIHdlIGhhdmUgdG8gc2V0IHRoZSBzdGF0aWMgbWVtYmVyICJwaHlzbmFtZXMiCisgICAgICAgICAgIHRvIHBvaW50IHRvIHN0cmluZ3MgbGlrZSAiQ2xhc3M6Ok1lbWJlciIgKi8gCisgICAgICAgIGlmIChUWVBFX0NPREUgKHN0cnVjdHR5cGUpID09IFRZUEVfQ09ERV9TVFJVQ1QpCisgICAgICAgICAgZml4X3N0YXRpY19tZW1iZXJfcGh5c25hbWVzIChzdHJ1Y3R0eXBlLCBzdWZmaXgsIG9iamZpbGUpOworCisJcmV0dXJuIHN0cnVjdHR5cGU7CisgICAgICB9CisKKyAgICBjYXNlIEROVFRfVFlQRV9QT0lOVEVSOgorICAgICAgLyogUG9pbnRlciB0eXBlIC0gY2FsbCBhIHJvdXRpbmUgaW4gZ2RidHlwZXMuYyB0aGF0IGNvbnN0cnVjdHMKKyAgICAgICAqIHRoZSBhcHByb3ByaWF0ZSBHREIgdHlwZS4KKyAgICAgICAqLworICAgICAgcmV0dXJuIG1ha2VfcG9pbnRlcl90eXBlICgKKyAgICAgICAgICBocHJlYWRfdHlwZV9sb29rdXAgKGRuX2J1ZnAtPmRwdHIucG9pbnRzdG8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZmlsZSksIAorICAgICAgICAgIE5VTEwpOworCisgICAgY2FzZSBETlRUX1RZUEVfUkVGRVJFTkNFOgorICAgICAgLyogQysrIHJlZmVyZW5jZSB0eXBlIC0gY2FsbCBhIHJvdXRpbmUgaW4gZ2RidHlwZXMuYyB0aGF0IGNvbnN0cnVjdHMKKyAgICAgICAqIHRoZSBhcHByb3ByaWF0ZSBHREIgdHlwZS4KKyAgICAgICAqLworICAgICAgcmV0dXJuIG1ha2VfcmVmZXJlbmNlX3R5cGUgKAorICAgICAgICAgICAgICAgICBocHJlYWRfdHlwZV9sb29rdXAgKGRuX2J1ZnAtPmRyZWZlcmVuY2UucG9pbnRzdG8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamZpbGUpLCAKKyAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAKKyAgICBjYXNlIEROVFRfVFlQRV9FTlVNOgorICAgICAgcmV0dXJuIGhwcmVhZF9yZWFkX2VudW1fdHlwZSAoaHBfdHlwZSwgZG5fYnVmcCwgb2JqZmlsZSk7CisgICAgY2FzZSBETlRUX1RZUEVfU0VUOgorICAgICAgcmV0dXJuIGhwcmVhZF9yZWFkX3NldF90eXBlIChocF90eXBlLCBkbl9idWZwLCBvYmpmaWxlKTsKKyAgICBjYXNlIEROVFRfVFlQRV9TVUJSQU5HRToKKyAgICAgIHJldHVybiBocHJlYWRfcmVhZF9zdWJyYW5nZV90eXBlIChocF90eXBlLCBkbl9idWZwLCBvYmpmaWxlKTsKKyAgICBjYXNlIEROVFRfVFlQRV9BUlJBWToKKyAgICAgIHJldHVybiBocHJlYWRfcmVhZF9hcnJheV90eXBlIChocF90eXBlLCBkbl9idWZwLCBvYmpmaWxlKTsKKyAgICBjYXNlIEROVFRfVFlQRV9TVFJVQ1Q6CisgICAgY2FzZSBETlRUX1RZUEVfVU5JT046CisgICAgICByZXR1cm4gaHByZWFkX3JlYWRfc3RydWN0X3R5cGUgKGhwX3R5cGUsIGRuX2J1ZnAsIG9iamZpbGUpOworICAgIGNhc2UgRE5UVF9UWVBFX0ZJRUxEOgorICAgICAgcmV0dXJuIGhwcmVhZF90eXBlX2xvb2t1cCAoZG5fYnVmcC0+ZGZpZWxkLnR5cGUsIG9iamZpbGUpOworCisgICAgY2FzZSBETlRUX1RZUEVfRlVOQ1RZUEU6CisgICAgICAvKiBIZXJlIHdlIHdhbnQgdG8gcmVhZCB0aGUgZnVuY3Rpb24gU09NcyBhbmQgcmV0dXJuIGEgCisgICAgICAgKiB0eXBlIGZvciBpdC4gV2UgZ2V0IGhlcmUsIGZvciBpbnN0YW5jZSwgd2hlbiBwcm9jZXNzaW5nCisgICAgICAgKiBwb2ludGVyLXRvLWZ1bmN0aW9uIHR5cGUuCisgICAgICAgKi8KKyAgICAgIHJldHVybiBocHJlYWRfcmVhZF9mdW5jdGlvbl90eXBlIChocF90eXBlLCBkbl9idWZwLCBvYmpmaWxlLCAwKTsKKworICAgIGNhc2UgRE5UVF9UWVBFX1BUUk1FTToKKyAgICAgIC8qIERlY2xhcmVzIGEgQysrIHBvaW50ZXItdG8tZGF0YS1tZW1iZXIgdHlwZS4gCisgICAgICAgKiBUaGUgInBvaW50c3RvIiBmaWVsZCBkZWZpbmVzIHRoZSBjbGFzcywKKyAgICAgICAqIHdoaWxlIHRoZSAibWVtdHlwZSIgZmllbGQgZGVmaW5lcyB0aGUgcG9pbnRlZC10by10eXBlLgorICAgICAgICovCisgICAgICB7CisgICAgICBzdHJ1Y3QgdHlwZSAqIHB0cm1lbXR5cGU7CisgICAgICBzdHJ1Y3QgdHlwZSAqIGNsYXNzX3R5cGU7CisgICAgICBzdHJ1Y3QgdHlwZSAqIG1lbXR5cGU7CisgICAgICBtZW10eXBlID0gaHByZWFkX3R5cGVfbG9va3VwIChkbl9idWZwLT5kcHRybWVtLm1lbXR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZmlsZSksIAorICAgICAgY2xhc3NfdHlwZSA9IGhwcmVhZF90eXBlX2xvb2t1cCAoZG5fYnVmcC0+ZHB0cm1lbS5wb2ludHN0bywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpmaWxlKSwgCisgICAgICBwdHJtZW10eXBlID0gYWxsb2NfdHlwZShvYmpmaWxlKTsKKyAgICAgIHNtYXNoX3RvX21lbWJlcl90eXBlKHB0cm1lbXR5cGUsIGNsYXNzX3R5cGUsIG1lbXR5cGUpOyAKKyAgICAgIHJldHVybiBtYWtlX3BvaW50ZXJfdHlwZShwdHJtZW10eXBlLCBOVUxMKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBETlRUX1RZUEVfUFRSTUVNRlVOQzoKKyAgICAgIC8qIERlZmluZXMgYSBDKysgcG9pbnRlci10by1mdW5jdGlvbi1tZW1iZXIgdHlwZS4gCisgICAgICAgKiBUaGUgInBvaW50c3RvIiBmaWVsZCBkZWZpbmVzIHRoZSBjbGFzcywKKyAgICAgICAqIHdoaWxlIHRoZSAibWVtdHlwZSIgZmllbGQgZGVmaW5lcyB0aGUgcG9pbnRlZC10by10eXBlLgorICAgICAgICovCisgICAgICB7CisgICAgICBzdHJ1Y3QgdHlwZSAqIHB0cm1lbXR5cGU7CisgICAgICBzdHJ1Y3QgdHlwZSAqIGNsYXNzX3R5cGU7CisgICAgICBzdHJ1Y3QgdHlwZSAqIGZ1bmN0eXBlOworICAgICAgc3RydWN0IHR5cGUgKiByZXR2YWx0eXBlOworICAgICAgaW50IG5hcmdzOworICAgICAgaW50IGk7CisgICAgICBzdHJ1Y3QgdHlwZSAqKiBhcmdzX3R5cGU7CisgICAgICBjbGFzc190eXBlID0gaHByZWFkX3R5cGVfbG9va3VwIChkbl9idWZwLT5kcHRybWVtLnBvaW50c3RvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamZpbGUpOyAKKyAgICAgIGZ1bmN0eXBlID0gaHByZWFkX3R5cGVfbG9va3VwIChkbl9idWZwLT5kcHRybWVtLm1lbXR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamZpbGUpOyAKKyAgICAgIHJldHZhbHR5cGUgPSBUWVBFX1RBUkdFVF9UWVBFIChmdW5jdHlwZSk7CisgICAgICBuYXJncyA9ICAgVFlQRV9ORklFTERTIChmdW5jdHlwZSk7CisgICAgICBhcmdzX3R5cGUgPSAoc3RydWN0IHR5cGUgKiopIHhtYWxsb2MgKChuYXJncysxKSAqIHNpemVvZiAoc3RydWN0IHR5cGUgKikpOworICAgICAgZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspIHsKKyAgICAgICAgYXJnc190eXBlW2ldID0gVFlQRV9GSUVMRF9UWVBFIChmdW5jdHlwZSwgaSk7IAorICAgICAgfQorICAgICAgYXJnc190eXBlW25hcmdzXSA9IE5VTEw7CisgICAgICBwdHJtZW10eXBlID0gYWxsb2NfdHlwZShvYmpmaWxlKTsKKyAgICAgIHNtYXNoX3RvX21ldGhvZF90eXBlKHB0cm1lbXR5cGUsIGNsYXNzX3R5cGUsIHJldHZhbHR5cGUsIGFyZ3NfdHlwZSk7IAorICAgICAgcmV0dXJuIG1ha2VfcG9pbnRlcl90eXBlKHB0cm1lbXR5cGUsIE5VTEwpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9DTEFTUzogCisgICAgICByZXR1cm4gaHByZWFkX3JlYWRfc3RydWN0X3R5cGUgKGhwX3R5cGUsIGRuX2J1ZnAsIG9iamZpbGUpOworCisgICAgY2FzZSBETlRUX1RZUEVfR0VORklFTEQ6CisgICAgICAvKiBDaGFzZSBwb2ludGVyIGZyb20gR0VORklFTEQgdG8gRklFTEQsIGFuZCBtYWtlIHJlY3Vyc2l2ZQorICAgICAgICogY2FsbCBvbiB0aGF0LgorICAgICAgICovCisgICAgICByZXR1cm4gaHByZWFkX3R5cGVfbG9va3VwIChkbl9idWZwLT5kZ2VuZmllbGQuZmllbGQsIG9iamZpbGUpOworCisgICAgY2FzZSBETlRUX1RZUEVfVkZVTkM6CisgICAgICAvKiBDKysgdmlydHVhbCBmdW5jdGlvbi4KKyAgICAgICAqIFdlIGdldCBoZXJlIGluIHRoZSBjb3Vyc2Ugb2YgcHJvY2Vzc2luZyBhIGNsYXNzIHR5cGUgd2hpY2gKKyAgICAgICAqIGNvbnRhaW5zIHZpcnR1YWwgZnVuY3Rpb25zLiBKdXN0IGdvIHRocm91Z2ggYW5vdGhlciBsZXZlbAorICAgICAgICogb2YgaW5kaXJlY3Rpb24gdG8gZ2V0IHRvIHRoZSBwb2ludGVkLXRvIGZ1bmN0aW9uIFNPTS4KKyAgICAgICAqLworICAgICAgcmV0dXJuIGhwcmVhZF90eXBlX2xvb2t1cCAoZG5fYnVmcC0+ZHZmdW5jLmZ1bmNwdHIsIG9iamZpbGUpOworCisgICAgY2FzZSBETlRUX1RZUEVfTU9ESUZJRVI6CisgICAgICAvKiBDaGVjayB0aGUgbW9kaWZpZXJzIGFuZCB0aGVuIGp1c3QgbWFrZSBhIHJlY3Vyc2l2ZSBjYWxsIG9uCisgICAgICAgKiB0aGUgInR5cGUiIHBvaW50ZWQgdG8gYnkgdGhlIG1vZGlmaWVyIEROVFQuCisgICAgICAgKiAKKyAgICAgICAqIHBhaTo6IEZJWE1FIC0tIGRvIHdlIGV2ZXIgd2FudCB0byBoYW5kbGUgIm1fZHVwbGljYXRlIiBhbmQKKyAgICAgICAqICJtX3ZvaWQiIG1vZGlmaWVycz8gIElzIHN0YXRpY19mbGFnIHJlYWxseSBuZWVkZWQgaGVyZT8KKyAgICAgICAqIChtX3N0YXRpYyB1c2VkIGZvciBtZXRob2RzIG9mIGNsYXNzZXMsIGVsc2V3aGVyZSkuCisgICAgICAgKi8KKyAgICAgIHRtcF90eXBlID0gbWFrZV9jdl90eXBlIChkbl9idWZwLT5kbW9kaWZpZXIubV9jb25zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5fYnVmcC0+ZG1vZGlmaWVyLm1fdm9sYXRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHByZWFkX3R5cGVfbG9va3VwIChkbl9idWZwLT5kbW9kaWZpZXIudHlwZSwgb2JqZmlsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICByZXR1cm4gdG1wX3R5cGU7CisgICAgICAKKworICAgIGNhc2UgRE5UVF9UWVBFX01FTUZVTkM6CisgICAgICAvKiBNZW1iZXIgZnVuY3Rpb24uIFRyZWF0IGxpa2UgYSBmdW5jdGlvbi4KKyAgICAgICAqIEkgdGhpbmsgd2UgZ2V0IGhlcmUgaW4gdGhlIGNvdXJzZSBvZiBwcm9jZXNzaW5nIGEgCisgICAgICAgKiBwb2ludGVyLXRvLW1lbWJlci1mdW5jdGlvbiB0eXBlLi4uCisgICAgICAgKi8KKyAgICAgIHJldHVybiBocHJlYWRfcmVhZF9mdW5jdGlvbl90eXBlIChocF90eXBlLCBkbl9idWZwLCBvYmpmaWxlLCAwKTsKKworICAgIGNhc2UgRE5UVF9UWVBFX0RPQ19NRU1GVU5DOgorICAgICAgcmV0dXJuIGhwcmVhZF9yZWFkX2RvY19mdW5jdGlvbl90eXBlIChocF90eXBlLCBkbl9idWZwLCBvYmpmaWxlLCAwKTsKKworICAgIGNhc2UgRE5UVF9UWVBFX1RFTVBMQVRFOgorICAgICAgLyogVGVtcGxhdGUgLSBzb3J0IG9mIHRoZSBoZWFkZXIgZm9yIGEgdGVtcGxhdGUgZGVmaW5pdGlvbiwKKyAgICAgICAqIHdoaWNoIGxpa2UgYSBjbGFzcywgcG9pbnRzIHRvIGEgbWVtYmVyIGxpc3QgYW5kIGFsc28gcG9pbnRzCisgICAgICAgKiB0byBhIFRFTVBMQVRFX0FSRyBsaXN0IG9mIHR5cGUtYXJndW1lbnRzLgorICAgICAgICovCisgICAgICByZXR1cm4gaHByZWFkX3JlYWRfc3RydWN0X3R5cGUgKGhwX3R5cGUsIGRuX2J1ZnAsIG9iamZpbGUpOworCisgICAgY2FzZSBETlRUX1RZUEVfVEVNUExBVEVfQVJHOgorICAgICAgeworICAgICAgY2hhciAqIG5hbWU7CisgICAgICAvKiBUaGUgVEVNUExBVEUgcmVjb3JkIHBvaW50cyB0byBhbiBhcmd1bWVudCBsaXN0IG9mCisgICAgICAgKiBURU1QTEFURV9BUkcgcmVjb3JkcywgZWFjaCBvZiB3aGljaCBkZXNjcmliZXMgb25lCisgICAgICAgKiBvZiB0aGUgdHlwZS1hcmd1bWVudHMuIAorICAgICAgICovCisgICAgICBuYW1lID0gIFZUIChvYmpmaWxlKSArIGRuX2J1ZnAtPmR0ZW1wbF9hcmcubmFtZTsKKyAgICAgIHJldHVybiBocHJlYWRfcmVhZF90ZW1wbF9hcmdfdHlwZSAoaHBfdHlwZSwgZG5fYnVmcCwgb2JqZmlsZSwgbmFtZSk7CisgICAgICB9CisKKyAgICBjYXNlIEROVFRfVFlQRV9GVU5DX1RFTVBMQVRFOgorICAgICAgLyogV2Ugd2luZCB1cCBoZXJlIHdoZW4gcHJvY2Vzc2luZyBhIFRFTVBMQVRFIHR5cGUsIAorICAgICAgICogaWYgdGhlIHRlbXBsYXRlIGhhcyBtZW1iZXIgZnVuY3Rpb24ocykuCisgICAgICAgKiBUcmVhdCBpdCBsaWtlIGEgRlVOQ1RJT04uCisgICAgICAgKi8KKyAgICAgIHJldHVybiBocHJlYWRfcmVhZF9mdW5jdGlvbl90eXBlIChocF90eXBlLCBkbl9idWZwLCBvYmpmaWxlLCAwKTsKKworICAgIGNhc2UgRE5UVF9UWVBFX0xJTks6CisgICAgICAvKiBUaGUgTElOSyByZWNvcmQgaXMgdXNlZCB0byBsaW5rIHVwIHRlbXBsYXRlcyB3aXRoIGluc3RhbnRpYXRpb25zLgorICAgICAgICogVGhlcmUgaXMgbm8gdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIExJTksgcmVjb3JkIHBlciBzZS4KKyAgICAgICAqLworICAgICAgcmV0dXJuIGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCBGVF9WT0lEKTsKKworICAgIC8qIEFsc28gbm90IHlldCBoYW5kbGVkLi4uICovCisgICAgLyogY2FzZSBETlRUX1RZUEVfRFlOX0FSUkFZX0RFU0M6ICovCisgICAgLyogY2FzZSBETlRUX1RZUEVfREVTQ19TVUJSQU5HRTogKi8KKyAgICAvKiBjYXNlIEROVFRfVFlQRV9CRUdJTl9FWFQ6ICovCisgICAgLyogY2FzZSBETlRUX1RZUEVfSU5MTjogKi8KKyAgICAvKiBjYXNlIEROVFRfVFlQRV9JTkxOX0xJU1Q6ICovCisgICAgLyogY2FzZSBETlRUX1RZUEVfQUxJQVM6ICovCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIEEgZmFuY3kgd2F5IG9mIHJldHVybmluZyBOVUxMICovCisgICAgICByZXR1cm4gbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUgKG9iamZpbGUsIEZUX1ZPSUQpOworICAgIH0KK30KKworc3RhdGljIHNsdHBvaW50ZXIKK2hwcmVhZF9yZWNvcmRfbGluZXMgKHN1YmZpbGUsIHNfaWR4LCBlX2lkeCwgb2JqZmlsZSwgb2Zmc2V0KQorICAgICBzdHJ1Y3Qgc3ViZmlsZSAqc3ViZmlsZTsKKyAgICAgc2x0cG9pbnRlciBzX2lkeCwgZV9pZHg7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBDT1JFX0FERFIgb2Zmc2V0OworeworICB1bmlvbiBzbHRlbnRyeSAqc2xfYnVmcDsKKworICB3aGlsZSAoc19pZHggPD0gZV9pZHgpCisgICAgeworICAgICAgc2xfYnVmcCA9IGhwcmVhZF9nZXRfc2x0IChzX2lkeCwgb2JqZmlsZSk7CisgICAgICAvKiBPbmx5IHJlY29yZCAibm9ybWFsIiBlbnRyaWVzIGluIHRoZSBTTFQuICAqLworICAgICAgaWYgKHNsX2J1ZnAtPnNub3JtLnNsdGRlc2MgPT0gU0xUX05PUk1BTAorCSAgfHwgc2xfYnVmcC0+c25vcm0uc2x0ZGVzYyA9PSBTTFRfRVhJVCkKKwlyZWNvcmRfbGluZSAoc3ViZmlsZSwgc2xfYnVmcC0+c25vcm0ubGluZSwKKwkJICAgICBzbF9idWZwLT5zbm9ybS5hZGRyZXNzICsgb2Zmc2V0KTsKKyAgICAgIGVsc2UgaWYgKHNsX2J1ZnAtPnNub3JtLnNsdGRlc2MgPT0gU0xUX05PUk1BTF9PRkZTRVQpCisJcmVjb3JkX2xpbmUgKHN1YmZpbGUsIHNsX2J1ZnAtPnNub3Jtb2ZmLmxpbmUsCisJCSAgICAgc2xfYnVmcC0+c25vcm1vZmYuYWRkcmVzcyArIG9mZnNldCk7CisgICAgICBzX2lkeCsrOworICAgIH0KKyAgcmV0dXJuIGVfaWR4OworfQorCisvKiBHaXZlbiBhIGZ1bmN0aW9uICJmIiB3aGljaCBpcyBhIG1lbWJlciBvZiBhIGNsYXNzLCBmaW5kCisgKiB0aGUgY2xhc3NuYW1lIHRoYXQgaXQgaXMgYSBtZW1iZXIgb2YuIFVzZWQgdG8gY29uc3RydWN0CisgKiB0aGUgbmFtZSAoZS5nLiwgImM6OmYiKSB3aGljaCBHREIgd2lsbCBwdXQgaW4gdGhlCisgKiAiZGVtYW5nbGVkIG5hbWUiIGZpZWxkIG9mIHRoZSBmdW5jdGlvbidzIHN5bWJvbC4KKyAqIENhbGxlZCBmcm9tIGhwcmVhZF9wcm9jZXNzX29uZV9kZWJ1Z19zeW1ib2woKQorICogSWYgImYiIGlzIG5vdCBhIG1lbWJlciBmdW5jdGlvbiwgcmV0dXJuIE5VTEwuCisgKi8KK2NoYXIgKiBjbGFzc19vZiAoZnVuY3R5cGUpCitzdHJ1Y3QgdHlwZSAqIGZ1bmN0eXBlOworeworICBzdHJ1Y3QgdHlwZSAqIGZpcnN0X3BhcmFtX3R5cGU7CisgIGNoYXIgKiBmaXJzdF9wYXJhbV9uYW1lOworICBzdHJ1Y3QgdHlwZSAqIHBvaW50ZWRfdG9fdHlwZTsKKyAgY2hhciAqIGNsYXNzX25hbWU7CisKKyAgLyogQ2hlY2sgdGhhdCB0aGUgZnVuY3Rpb24gaGFzIGEgZmlyc3QgYXJndW1lbnQgInRoaXMiLAorICAgKiBhbmQgdGhhdCAidGhpcyIgaXMgYSBwb2ludGVyIHRvIGEgY2xhc3MuIElmIG5vdCwKKyAgICogZnVuY3R5cGUgaXMgbm90IGEgbWVtYmVyIGZ1bmN0aW9uLCBzbyByZXR1cm4gTlVMTC4KKyAgICovCisgIGlmIChUWVBFX05GSUVMRFMoZnVuY3R5cGUpID09IDApCisgICAgcmV0dXJuIE5VTEw7CisgIGZpcnN0X3BhcmFtX25hbWUgPSBUWVBFX0ZJRUxEX05BTUUgKGZ1bmN0eXBlLCAwKTsKKyAgaWYgKGZpcnN0X3BhcmFtX25hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsgLyogcGFyYW5vaWEgKi8KKyAgaWYgKHN0cmNtcChmaXJzdF9wYXJhbV9uYW1lLCAidGhpcyIpKQorICAgIHJldHVybiBOVUxMOworICBmaXJzdF9wYXJhbV90eXBlID0gVFlQRV9GSUVMRF9UWVBFIChmdW5jdHlwZSwgMCk7CisgIGlmIChmaXJzdF9wYXJhbV90eXBlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7IC8qIHBhcmFub2lhICovCisgIGlmIChUWVBFX0NPREUoZmlyc3RfcGFyYW1fdHlwZSkgIT0gVFlQRV9DT0RFX1BUUikKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBHZXQgdGhlIHRoaW5nIHRoYXQgInRoaXMiIHBvaW50cyB0bywgY2hlY2sgdGhhdAorICAgKiBpdCdzIGEgY2xhc3MsIGFuZCBnZXQgaXRzIGNsYXNzIG5hbWUuCisgICAqLworICBwb2ludGVkX3RvX3R5cGUgPSBUWVBFX1RBUkdFVF9UWVBFKGZpcnN0X3BhcmFtX3R5cGUpOworICBpZiAocG9pbnRlZF90b190eXBlID09IE5VTEwpIAorICAgIHJldHVybiBOVUxMOyAvKiBwYXJhbm9pYSAqLworICBpZiAoVFlQRV9DT0RFKHBvaW50ZWRfdG9fdHlwZSkgIT0gVFlQRV9DT0RFX0NMQVNTKQorICAgIHJldHVybiBOVUxMOworICBjbGFzc19uYW1lID0gVFlQRV9OQU1FKHBvaW50ZWRfdG9fdHlwZSk7CisgIGlmIChjbGFzc19uYW1lID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7IC8qIHBhcmFub2lhICovCisKKyAgLyogVGhlIGNsYXNzIG5hbWUgbWF5IGJlIG9mIHRoZSBmb3JtICJjbGFzcyBjIiwgaW4gd2hpY2ggY2FzZQorICAgKiB3ZSB3YW50IHRvIHN0cmlwIG9mZiB0aGUgbGVhZGluZyAiY2xhc3MgIi4KKyAgICovCisgIGlmIChzdHJuY21wKGNsYXNzX25hbWUsICJjbGFzcyAiLCA2KSA9PSAwKQorICAgIGNsYXNzX25hbWUgKz0gNjsKKworICByZXR1cm4gY2xhc3NfbmFtZTsKK30KKworLyogSW50ZXJuYWxpemUgb25lIG5hdGl2ZSBkZWJ1ZyBzeW1ib2wuIAorICogQ2FsbGVkIGluIGEgbG9vcCBmcm9tIGhwcmVhZF9leHBhbmRfc3ltdGFiKCkuIAorICogQXJndW1lbnRzOgorICogICBkbl9idWZwOiAKKyAqICAgbmFtZTogCisgKiAgIHNlY3Rpb25fb2Zmc2V0czoKKyAqICAgb2JqZmlsZToKKyAqICAgdGV4dF9vZmZzZXQ6IAorICogICB0ZXh0X3NpemU6IAorICogICBmaWxlbmFtZTogCisgKiAgIGluZGV4OiAJCUluZGV4IG9mIHRoaXMgc3ltYm9sCisgKiAgIGF0X21vZHVsZV9ib3VuZGFyeV9wIFBvaW50ZXIgdG8gYm9vbGVhbiBmbGFnIHRvIGNvbnRyb2wgY2FsbGVyJ3MgbG9vcC4KKyAqLworCitzdGF0aWMgdm9pZAoraHByZWFkX3Byb2Nlc3Nfb25lX2RlYnVnX3N5bWJvbCAoZG5fYnVmcCwgbmFtZSwgc2VjdGlvbl9vZmZzZXRzLCBvYmpmaWxlLAorCQkJCSB0ZXh0X29mZnNldCwgdGV4dF9zaXplLCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBhdF9tb2R1bGVfYm91bmRhcnlfcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICB1bmlvbiBkbnR0ZW50cnkgKmRuX2J1ZnA7CisgICAgIGNoYXIgKm5hbWU7CisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIENPUkVfQUREUiB0ZXh0X29mZnNldDsKKyAgICAgaW50ICAgICAgIHRleHRfc2l6ZTsKKyAgICAgY2hhciAgICAgKmZpbGVuYW1lOworICAgICBpbnQgICAgICAgaW5kZXg7CisgICAgIGludCAgICAgICphdF9tb2R1bGVfYm91bmRhcnlfcDsKK3sKKyAgdW5zaWduZWQgbG9uZyBkZXNjOworICBpbnQgdHlwZTsKKyAgQ09SRV9BRERSIHZhbHU7CisgIGludCBvZmZzZXQgPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKTsKKyAgaW50IGRhdGFfb2Zmc2V0ID0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfREFUQSk7CisgIHVuaW9uIGRudHRlbnRyeSAqZG5fdGVtcDsKKyAgZG50dHBvaW50ZXIgaHBfdHlwZTsKKyAgc3RydWN0IHN5bWJvbCAqc3ltOworICBzdHJ1Y3QgY29udGV4dF9zdGFjayAqbmV3OworICBjaGFyICogY2xhc3Nfc2NvcGVfbmFtZTsKKyAgZXh0ZXJuIGludCBpc19pbl9pbXBvcnRfbGlzdCAoKTsgLyogaW4gc29tcmVhZC5jICovIAorICAKKyAgLyogQWxsb2NhdGUgb25lIEdEQiBkZWJ1ZyBzeW1ib2wgYW5kIGZpbGwgaW4gc29tZSBkZWZhdWx0IHZhbHVlcy4gKi8KKyAgc3ltID0gKHN0cnVjdCBzeW1ib2wgKikgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrLAorCQkJCQkgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisgIG1lbXNldCAoc3ltLCAwLCBzaXplb2YgKHN0cnVjdCBzeW1ib2wpKTsKKyAgU1lNQk9MX05BTUUgKHN5bSkgPSBvYnNhdmVzdHJpbmcgKG5hbWUsIHN0cmxlbiAobmFtZSksICZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjayk7CisgIFNZTUJPTF9MQU5HVUFHRSAoc3ltKSA9IGxhbmd1YWdlX2F1dG87CisgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworICBTWU1CT0xfTElORSAoc3ltKSA9IDA7CisgIFNZTUJPTF9WQUxVRSAoc3ltKSA9IDA7CisgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19UWVBFREVGOworCisgIC8qIEp1c3QgYSB0cmljayBpbiBjYXNlIHRoZSBTT00gZGVidWcgc3ltYm9sIGlzIGEgdHlwZSBkZWZpbml0aW9uLgorICAgKiBUaGVyZSBhcmUgcm91dGluZXMgdGhhdCBhcmUgc2V0IHVwIHRvIGJ1aWxkIGEgR0RCIHR5cGUgc3ltYm9sLCBnaXZlbgorICAgKiBhIFNPTSBkbnR0cG9pbnRlci4gU28gd2Ugc2V0IHVwIGEgZHVtbXkgU09NIGRudHRwb2ludGVyICJocF90eXBlIi4KKyAgICogVGhpcyBhbGxvd3MgdXMgdG8gY2FsbCB0aG9zZSBzYW1lIHJvdXRpbmVzLgorICAgKi8KKyAgaHBfdHlwZS5kbnR0cC5leHRlbnNpb24gPSAxOworICBocF90eXBlLmRudHRwLmltbWVkaWF0ZSA9IDA7CisgIGhwX3R5cGUuZG50dHAuZ2xvYmFsID0gMDsKKyAgaHBfdHlwZS5kbnR0cC5pbmRleCA9IGluZGV4OworCisgIC8qIFRoaXMgInR5cGUiIGlzIHRoZSB0eXBlIG9mIFNPTSByZWNvcmQuCisgICAqIFN3aXRjaCBvbiBTT00gdHlwZS4KKyAgICovCisgIHR5cGUgPSBkbl9idWZwLT5kYmxvY2sua2luZDsKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIEROVFRfVFlQRV9TUkNGSUxFOgorICAgICAgLyogVGhpcyB0eXBlIG9mIHN5bWJvbCBpbmRpY2F0ZXMgZnJvbSB3aGljaCBzb3VyY2UgZmlsZSBvcgorICAgICAgICogaW5jbHVkZSBmaWxlIGFueSBmb2xsb3dpbmcgZGF0YSBjb21lcy4gSXQgbWF5IGluZGljYXRlOgorICAgICAgICoKKyAgICAgICAqIG8gICBUaGUgc3RhcnQgb2YgYW4gZW50aXJlbHkgbmV3IHNvdXJjZSBmaWxlIChhbmQgdGh1cworICAgICAgICogICAgIGEgbmV3IG1vZHVsZSkKKyAgICAgICAqCisgICAgICAgKiBvICAgVGhlIHN0YXJ0IG9mIGEgZGlmZmVyZW50IHNvdXJjZSBmaWxlIGR1ZSB0byAjaW5jbHVkZQorICAgICAgICoKKyAgICAgICAqIG8gICBUaGUgZW5kIG9mIGFuIGluY2x1ZGUgZmlsZSBhbmQgdGhlIHJldHVybiB0byB0aGUgb3JpZ2luYWwKKyAgICAgICAqICAgICBmaWxlLiBUaHVzIGlmICJmb28uYyIgaW5jbHVkZXMgImJhci5oIiwgd2Ugc2VlIGZpcnN0CisgICAgICAgKiAgICAgYSBTUkNGSUxFIGZvciBmb28uYywgdGhlbiBvbmUgZm9yIGJhci5oLCBhbmQgdGhlbiBvbmUgZm9yCisgICAgICAgKiAgICAgZm9vLmMgYWdhaW4uCisgICAgICAgKgorICAgICAgICogSWYgaXQgaW5kaWNhdGVzIHRoZSBzdGFydCBvZiBhIG5ldyBtb2R1bGUgdGhlbiB3ZSBtdXN0CisgICAgICAgKiBmaW5pc2ggdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUgcHJldmlvdXMgbW9kdWxlIAorICAgICAgICogKGlmIGFueSkgYW5kIHN0YXJ0IGFjY3VtdWxhdGluZyBhIG5ldyBzeW1ib2wgdGFibGUuICAKKyAgICAgICAqLworCisgICAgICB2YWx1ID0gdGV4dF9vZmZzZXQ7CisgICAgICBpZiAoIWxhc3Rfc291cmNlX2ZpbGUgKSB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBBIG5vdGUgb24gImxhc3Rfc291cmNlX2ZpbGUiOiB0aGlzIGlzIGEgY2hhciogcG9pbnRpbmcKKyAgICAgICAgICAgKiB0byB0aGUgYWN0dWFsIGZpbGUgbmFtZS4gICJzdGFydF9zeW10YWIiIHNldHMgaXQsCisgICAgICAgICAgICogImVuZF9zeW10YWIiIGNsZWFycyBpdC4KKyAgICAgICAgICAgKgorICAgICAgICAgICAqIFNvIGlmICJsYXN0X3NvdXJjZV9maWxlIiBpcyBOVUxMLCB0aGVuIGVpdGhlciB0aGlzIGlzCisgICAgICAgICAgICogdGhlIGZpcnN0IHJlY29yZCB3ZSBhcmUgbG9va2luZyBhdCwgb3IgYSBwcmV2aW91cyBjYWxsCisgICAgICAgICAgICogdG8gImVuZF9zeW10YWIoKSIgd2FzIG1hZGUgdG8gY2xvc2Ugb3V0IHRoZSBwcmV2aW91cworICAgICAgICAgICAqIG1vZHVsZS4gIFNpbmNlIHdlJ3JlIG5vdyBxdWl0dGluZyB0aGUgc2NhbiBsb29wIHdoZW4gd2UKKyAgICAgICAgICAgKiBzZWUgYSBNT0RVTEUgRU5EIHJlY29yZCwgd2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLCBleGNlcHQKKyAgICAgICAgICAgKiBpbiB0aGUgY2FzZSB0aGF0IHdlJ3JlIG5vdCB1c2luZyB0aGUgcXVpY2sgbG9vay11cCB0YWJsZXMKKyAgICAgICAgICAgKiBhbmQgaGF2ZSB0byB1c2UgdGhlIG9sZCBzeXN0ZW0gYXMgYSBmYWxsLWJhY2suCisgICAgICAgICAgICovCisJICBzdGFydF9zeW10YWIgKG5hbWUsIE5VTEwsIHZhbHUpOworCSAgcmVjb3JkX2RlYnVnZm9ybWF0ICgiSFAiKTsKKwkgIFNMX0lOREVYIChvYmpmaWxlKSA9IGRuX2J1ZnAtPmRzZmlsZS5hZGRyZXNzOworICAgICAgfQorCisgICAgICBlbHNlIHsKKyAgICAgICAgICAvKiBFaXRoZXIgYSBuZXcgaW5jbHVkZSBmaWxlLCBvciBhIFNSQ0ZJTEUgcmVjb3JkCisgICAgICAgICAgICogc2F5aW5nIHdlIGFyZSBiYWNrIGluIHRoZSBtYWluIHNvdXJjZSAob3Igb3V0IG9mCisgICAgICAgICAgICogYSBuZXN0ZWQgaW5jbHVkZSBmaWxlKSBhZ2Fpbi4KKyAgICAgICAgICAgKi8KKwkgIFNMX0lOREVYIChvYmpmaWxlKSA9IGhwcmVhZF9yZWNvcmRfbGluZXMgKGN1cnJlbnRfc3ViZmlsZSwKKwkJCQkJCSAgICBTTF9JTkRFWCAob2JqZmlsZSksCisJCQkJCQkgICAgZG5fYnVmcC0+ZHNmaWxlLmFkZHJlc3MsCisJCQkJCQkgICAgb2JqZmlsZSwgb2Zmc2V0KTsKKyAgICAgIH0KKworICAgICAgLyogQSBub3RlIG9uICJzdGFydF9zdWJmaWxlIi4gIFRoaXMgcm91dGluZSB3aWxsIGNoZWNrCisgICAgICAgKiB0aGUgbmFtZSB3ZSBwYXNzIGl0IGFuZCBsb29rIGZvciBhbiBleGlzdGluZyBzdWJmaWxlCisgICAgICAgKiBvZiB0aGF0IG5hbWUuICBUaGVyZSdzIHRodXMgb25seSBvbmUgc3ViLWZpbGUgZm9yIHRoZQorICAgICAgICogYWN0dWFsIHNvdXJjZSAoZS5nLiBmb3IgImZvby5jIiBpbiBmb28uYyksIGRlc3BpdGUgdGhlCisgICAgICAgKiBmYWN0IHRoYXQgd2UnbGwgc2VlIGxvdHMgb2YgU1JDRklMRSBlbnRyaWVzIGZvciBmb28uYworICAgICAgICogaW5zaWRlIGZvby5jLgorICAgICAgICovCisgICAgICBzdGFydF9zdWJmaWxlIChuYW1lLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBETlRUX1RZUEVfTU9EVUxFOgorICAgICAgLyoKKyAgICAgICAqIFdlIG5vIGxvbmdlciBpZ25vcmUgRE5UVF9UWVBFX01PRFVMRSBzeW1ib2xzLiAgVGhlIG1vZHVsZSAKKyAgICAgICAqIHJlcHJlc2VudHMgdGhlIG1lYW5pbmdmdWwgc2VtYW50aWMgc3RydWN0dXJlIG9mIGEgY29tcGlsYXRpb24KKyAgICAgICAqIHVuaXQuICBXZSBleHBlY3QgdG8gc3RhcnQgdGhlIHBzeW10YWItdG8tc3ltdGFiIGV4cGFuc2lvbgorICAgICAgICogbG9va2luZyBhdCBhIE1PRFVMRSBlbnRyeSwgYW5kIHRvIGVuZCBpdCBhdCB0aGUgY29ycmVzcG9uZGluZworICAgICAgICogRU5EIE1PRFVMRSBlbnRyeS4KKyAgICAgICAqCisgICAgICAgKi0tQmVnaW4gb3V0ZGF0ZWQgY29tbWVudHMKKyAgICAgICAqIAorICAgICAgICogVGhpcyByZWNvcmQgc2lnbmlmaWVzIHRoZSBzdGFydCBvZiBhIG5ldyBzb3VyY2UgbW9kdWxlCisgICAgICAgKiBJbiBDL0MrKyB0aGVyZSBpcyBubyBleHBsaWNpdCAibW9kdWxlIiBjb25zdHJ1Y3QgaW4gdGhlIGxhbmd1YWdlLAorICAgICAgICogYnV0IGVhY2ggY29tcGlsYXRpb24gdW5pdCBpcyBpbXBsaWNpdGx5IGEgbW9kdWxlIGFuZCB0aGV5CisgICAgICAgKiBkbyBlbWl0IHRoZSBETlRUX1RZUEVfTU9EVUxFIHJlY29yZHMuCisgICAgICAgKiBUaGUgZW5kIG9mIHRoZSBtb2R1bGUgaXMgbWFya2VkIGJ5IGEgbWF0Y2hpbmcgRE5UVF9UWVBFX0VORCByZWNvcmQuCisgICAgICAgKgorICAgICAgICogVGhlIHJlYXNvbiBHREIgZ2V0cyBhd2F5IHdpdGggaWdub3JpbmcgdGhlIEROVFRfVFlQRV9NT0RVTEUgcmVjb3JkIAorICAgICAgICogaXMgaXQgbm90aWNlcyB0aGUgRE5UVF9UWVBFX0VORCByZWNvcmQgZm9yIHRoZSBwcmV2aW91cyAKKyAgICAgICAqIG1vZHVsZSAoc2VlIGNvbW1lbnRzIHVuZGVyIEROVFRfVFlQRV9FTkQgY2FzZSksIGFuZCB0aGVuIHRyZWF0cworICAgICAgICogdGhlIG5leHQgRE5UVF9UWVBFX1NSQ0ZJTEUgcmVjb3JkIGFzIGlmIGl0IHdlcmUgdGhlIG1vZHVsZS1zdGFydCByZWNvcmQuCisgICAgICAgKiAoaS5lLiwgaXQgbWFrZXMgYSBzdGFydF9zeW10YWIoKSBjYWxsKS4KKyAgICAgICAqIFRoaXMgc2NoZW1lIHNlZW1zIGEgbGl0dGxlIGNvbnZvbHV0ZWQsIGJ1dCBJJ2xsIGxlYXZlIGl0IAorICAgICAgICogYWxvbmUgb24gdGhlIHByaW5jaXBsZSAiaWYgaXQgYWluJ3QgYnJva2UgZG9uJ3QgZml4CisgICAgICAgKiBpdCIuIChSVCkuCisgICAgICAgKgorICAgICAgICotLSBFbmQgb3V0ZGF0ZWQgY29tbWVudHMKKyAgICAgICAqLworCisgICAgICB2YWx1ID0gdGV4dF9vZmZzZXQ7CisgICAgICBpZiAoIWxhc3Rfc291cmNlX2ZpbGUgKQorCXsKKyAgICAgICAgICAvKiBTdGFydCBvZiBhIG5ldyBtb2R1bGUuIFdlIGtub3cgdGhpcyBiZWNhdXNlICJsYXN0X3NvdXJjZV9maWxlIgorICAgICAgICAgICAqIGlzIE5VTEwsIHdoaWNoIGNhbiBvbmx5IGhhcHBlbiB0aGUgZmlyc3QgdGltZSBvciBpZiB3ZSBqdXN0IAorICAgICAgICAgICAqIG1hZGUgYSBjYWxsIHRvIGVuZF9zeW10YWIoKSB0byBjbG9zZSBvdXQgdGhlIHByZXZpb3VzIG1vZHVsZS4KKyAgICAgICAgICAgKi8KKwkgIHN0YXJ0X3N5bXRhYiAobmFtZSwgTlVMTCwgdmFsdSk7CisJICBTTF9JTkRFWCAob2JqZmlsZSkgPSBkbl9idWZwLT5kbW9kdWxlLmFkZHJlc3M7CisJfQorICAgICAgZWxzZQorCXsKKyAgICAgICAgICAvKiBUaGlzIHJlYWxseSBzaG91bGRuJ3QgaGFwcGVuIGlmIHdlJ3JlIHVzaW5nIHRoZSBxdWljaworICAgICAgICAgICAqIGxvb2stdXAgdGFibGVzLCBhcyBpdCB3b3VsZCBtZWFuIHdlJ2Qgc2Nhbm5lZCBwYXN0IGFuCisgICAgICAgICAgICogRU5EIE1PRFVMRSBlbnRyeS4gIEJ1dCBpZiB3ZSdyZSBub3QgdXNpbmcgdGhlIHRhYmxlcywKKyAgICAgICAgICAgKiB3ZSBzdGFydGVkIHRoZSBtb2R1bGUgb24gdGhlIFNSQ0ZJTEUgZW50cnksIHNvIGl0J3Mgb2suCisgICAgICAgICAgICogRm9yIG5vdywgYWNjZXB0IHRoaXMuCisgICAgICAgICAgICovCisgICAgIC8qIHdhcm5pbmcoICJFcnJvciBleHBhbmRpbmcgcHN5bXRhYiwgbWlzc2VkIG1vZHVsZSBlbmQsIGZvdW5kIGVudHJ5IGZvciAlcyIsCisgICAgICAqICAgICAgICAgICBuYW1lICk7CisgICAgICAqLworICAgICAgICAgICphdF9tb2R1bGVfYm91bmRhcnlfcCA9IC0xOworCX0KKworICAgICAgc3RhcnRfc3ViZmlsZSAobmFtZSwgTlVMTCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRE5UVF9UWVBFX0ZVTkNUSU9OOgorICAgIGNhc2UgRE5UVF9UWVBFX0VOVFJZOgorICAgICAgLyogQSBmdW5jdGlvbiBvciBzZWNvbmRhcnkgZW50cnkgcG9pbnQuICAqLworICAgICAgdmFsdSA9IGRuX2J1ZnAtPmRmdW5jLmxvd2FkZHIgKyBvZmZzZXQ7CisKKyAgICAgIC8qIFJlY29yZCBsaW5lcyB1cCB0byB0aGlzIHBvaW50LiAqLworICAgICAgU0xfSU5ERVggKG9iamZpbGUpID0gaHByZWFkX3JlY29yZF9saW5lcyAoY3VycmVudF9zdWJmaWxlLAorCQkJCQkJU0xfSU5ERVggKG9iamZpbGUpLAorCQkJCQkJZG5fYnVmcC0+ZGZ1bmMuYWRkcmVzcywKKwkJCQkJCW9iamZpbGUsIG9mZnNldCk7CisgICAgICAKKyAgICAgIFdJVEhJTl9GVU5DVElPTiAob2JqZmlsZSkgPSAxOworICAgICAgQ1VSUkVOVF9GVU5DVElPTl9WQUxVRSAob2JqZmlsZSkgPSB2YWx1OworCisgICAgICAvKiBTdGFjayBtdXN0IGJlIGVtcHR5IG5vdy4gICovCisgICAgICBpZiAoY29udGV4dF9zdGFja19kZXB0aCAhPSAwKQorCWNvbXBsYWluICgmbGJyYWNfdW5tYXRjaGVkX2NvbXBsYWludCwgKGNoYXIgKikgc3ltbnVtKTsKKyAgICAgIG5ldyA9IHB1c2hfY29udGV4dCAoMCwgdmFsdSk7CisKKyAgICAgIC8qIEJ1aWx0IGEgdHlwZSBmb3IgdGhlIGZ1bmN0aW9uLiBUaGlzIGluY2x1ZGVzIHByb2Nlc3NpbmcKKyAgICAgICAqIHRoZSBzeW1ib2wgcmVjb3JkcyBmb3IgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgKi8KKyAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19CTE9DSzsKKyAgICAgIFNZTUJPTF9UWVBFIChzeW0pID0gaHByZWFkX3JlYWRfZnVuY3Rpb25fdHlwZSAoaHBfdHlwZSwgZG5fYnVmcCwgb2JqZmlsZSwgMSk7CisKKyAgICAgIC8qIFRoZSAiU1lNQk9MX05BTUUiIGZpZWxkIGlzIGV4cGVjdGVkIHRvIGJlIHRoZSBtYW5nbGVkIG5hbWUKKyAgICAgICAqIChpZiBhbnkpLCB3aGljaCB3ZSBnZXQgZnJvbSB0aGUgImFsaWFzIiBmaWVsZCBvZiB0aGUgU09NIHJlY29yZAorICAgICAgICogaWYgdGhhdCBleGlzdHMuCisgICAgICAgKi8KKyAgICAgIGlmICgoZG5fYnVmcC0+ZGZ1bmMubGFuZ3VhZ2UgPT0gSFBfTEFOR1VBR0VfQ1BMVVNQTFVTKSAmJiAKKyAgICAgICAgICBkbl9idWZwLT5kZnVuYy5hbGlhcyAmJiAvKiBoYXMgYW4gYWxpYXMgKi8gCisgICAgICAgICAgKihjaGFyICopKFZUIChvYmpmaWxlKSArIGRuX2J1ZnAtPmRmdW5jLmFsaWFzKSkgLyogbm90IGEgbnVsbCBzdHJpbmcgKi8gCisgICAgICAgIFNZTUJPTF9OQU1FIChzeW0pID0gVlQgKG9iamZpbGUpICsgZG5fYnVmcC0+ZGZ1bmMuYWxpYXM7CisgICAgICBlbHNlCisgICAgICAgIFNZTUJPTF9OQU1FIChzeW0pID0gVlQgKG9iamZpbGUpICsgZG5fYnVmcC0+ZGZ1bmMubmFtZTsKKworICAgICAgLyogU3BlY2lhbCBoYWNrIHRvIGdldCBhcm91bmQgSFAgY29tcGlsZXJzJyBpbnNpc3RlbmNlIG9uCisgICAgICAgKiByZXBvcnRpbmcgIm1haW4iIGFzICJfTUFJTl8iIGZvciBDL0MrKyAqLworICAgICAgaWYgKChzdHJjbXAgKFNZTUJPTF9OQU1FIChzeW0pLCAiX01BSU5fIikgPT0gMCkgJiYKKyAgICAgICAgICAoc3RyY21wIChWVCAob2JqZmlsZSkgKyBkbl9idWZwLT5kZnVuYy5uYW1lLCAibWFpbiIpID09IDApKQorICAgICAgICBTWU1CT0xfTkFNRSAoc3ltKSA9IFZUIChvYmpmaWxlKSArIGRuX2J1ZnAtPmRmdW5jLm5hbWU7CisgICAgICAKKyAgICAgIC8qIFRoZSBTWU1CT0xfQ1BMVVNfREVNQU5HTEVEX05BTUUgZmllbGQgaXMgZXhwZWN0ZWQgdG8KKyAgICAgICAqIGJlIHRoZSBkZW1hbmdsZWQgbmFtZS4KKyAgICAgICAqLworICAgICAgaWYgKGRuX2J1ZnAtPmRmdW5jLmxhbmd1YWdlID09IEhQX0xBTkdVQUdFX0NQTFVTUExVUykKKwl7CisgICAgICAgIC8qIFNZTUJPTF9JTklUX0RFTUFOR0xFRF9OQU1FIGlzIGEgbWFjcm8gd2hpY2ggd2luZHMgdXAKKyAgICAgICAgICogY2FsbGluZyB0aGUgZGVtYW5nbGVyIGluIGxpYmliZXJ0eSAoY3BsdXNfZGVtYW5nbGUoKSkgdG8KKyAgICAgICAgICogZG8gdGhlIGpvYi4gVGhpcyBnZW5lcmFsbHkgZG9lcyB0aGUgam9iLCBldmVuIHRob3VnaAorICAgICAgICAgKiBpdCdzIGludGVuZGVkIGZvciB0aGUgR05VIGNvbXBpbGVyIGFuZCBub3QgdGhlIGFDQyBjb21waWxlcgorICAgICAgICAgKiBOb3RlIHRoYXQgU1lNQk9MX0lOSVRfREVNQU5HTEVEX05BTUUgY2FsbHMgdGhlCisgICAgICAgICAqIGRlbWFuZ2xlciB3aXRoIGFyZ3VtZW50cyBETUdMX1BBUkFNUyB8IERNR0xfQU5TSS4KKyAgICAgICAgICogR2VuZXJhbGx5LCB3ZSBkb24ndCB3YW50IHBhcmFtcyB3aGVuIHdlIGRpc3BsYXkKKyAgICAgICAgICogYSBkZW1hbmdsZWQgbmFtZSwgYnV0IHdoZW4gSSB0b29rIG91dCB0aGUgRE1HTF9QQVJBTVMsCisgICAgICAgICAqIHNvbWUgdGhpbmdzIGJyb2tlLCBzbyBJJ20gbGVhdmluZyBpdCBpbiBoZXJlLCBhbmQKKyAgICAgICAgICogd29ya2luZyBhcm91bmQgdGhlIGlzc3VlIGluIHN0YWNrLmMuIC0gUlQKKyAgICAgICAgICovCisgICAgICAgIFNZTUJPTF9JTklUX0RFTUFOR0xFRF9OQU1FIChzeW0sICZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjayk7CisgICAgICAgIGlmICgoU1lNQk9MX05BTUUgKHN5bSkgPT0gVlQgKG9iamZpbGUpICsgZG5fYnVmcC0+ZGZ1bmMuYWxpYXMpICYmCisgICAgICAgICAgICghU1lNQk9MX0NQTFVTX0RFTUFOR0xFRF9OQU1FKHN5bSkpKSB7CisKKyAgICAgICAgICAvKiBXZWxsLCB0aGUgc3ltYm9sIG5hbWUgaXMgbWFuZ2xlZCwgYnV0IHRoZQorICAgICAgICAgICAqIGRlbWFuZ2xlciBpbiBsaWJpYmVydHkgZmFpbGVkIHNvIHRoZSBkZW1hbmdsZWQKKyAgICAgICAgICAgKiBmaWVsZCBpcyBzdGlsbCBOVUxMLiBUcnkgdG8KKyAgICAgICAgICAgKiBkbyB0aGUgam9iIG91cnNlbHZlcyBiYXNlZCBvbiB0aGUgIm5hbWUiIGZpZWxkCisgICAgICAgICAgICogaW4gdGhlIFNPTSByZWNvcmQuIEEgY29tcGxpY2F0aW9uIGhlcmUgaXMgdGhhdAorICAgICAgICAgICAqIHRoZSBuYW1lIGZpZWxkIGNvbnRhaW5zIG9ubHkgdGhlIGZ1bmN0aW9uIG5hbWUKKyAgICAgICAgICAgKiAobGlrZSAiZiIpLCB3aGVyZWFzIHdlIHdhbnQgdGhlIGNsYXNzIHF1YWxpZmljYXRpb24KKyAgICAgICAgICAgKiAoYXMgaW4gImM6OmYiKS4gVHJ5IHRvIHJlY29uc3RydWN0IHRoYXQuCisgICAgICAgICAgICovICAgICAgICAgIAorICAgICAgICAgIGNoYXIgKiBiYXNlbmFtZTsKKyAgICAgICAgICBjaGFyICogY2xhc3NuYW1lOworICAgICAgICAgIGNoYXIgKiBkZW1fbmFtZTsKKyAgICAgICAgICBiYXNlbmFtZSA9IFZUIChvYmpmaWxlKSArIGRuX2J1ZnAtPmRmdW5jLm5hbWU7CisgICAgICAgICAgY2xhc3NuYW1lID0gY2xhc3Nfb2YoU1lNQk9MX1RZUEUoc3ltKSk7CisgICAgICAgICAgaWYgKGNsYXNzbmFtZSkgeworICAgICAgICAgICAgZGVtX25hbWUgPSB4bWFsbG9jKHN0cmxlbihiYXNlbmFtZSkrc3RybGVuKGNsYXNzbmFtZSkrMyk7CisgICAgICAgICAgICBzdHJjcHkoZGVtX25hbWUsIGNsYXNzbmFtZSk7CisgICAgICAgICAgICBzdHJjYXQoZGVtX25hbWUsICI6OiIpOworICAgICAgICAgICAgc3RyY2F0KGRlbV9uYW1lLCBiYXNlbmFtZSk7CisgICAgICAgICAgICBTWU1CT0xfQ1BMVVNfREVNQU5HTEVEX05BTUUoc3ltKSA9IGRlbV9uYW1lOworICAgICAgICAgICAgU1lNQk9MX0xBTkdVQUdFIChzeW0pID0gbGFuZ3VhZ2VfY3BsdXM7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgCisgICAgICAvKiBBZGQgdGhlIGZ1bmN0aW9uIHN5bWJvbCB0byB0aGUgbGlzdCBvZiBzeW1ib2xzIGluIHRoaXMgYmxvY2t2ZWN0b3IgKi8KKyAgICAgIGlmIChkbl9idWZwLT5kZnVuYy5nbG9iYWwpCisJYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZnbG9iYWxfc3ltYm9scyk7CisgICAgICBlbHNlCisJYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZmaWxlX3N5bWJvbHMpOworICAgICAgbmV3LT5uYW1lID0gc3ltOworCisgICAgICAvKiBTZWFyY2ggZm9yd2FyZCB0byB0aGUgbmV4dCBCRUdJTiBhbmQgYWxzbyByZWFkCisgICAgICAgKiBpbiB0aGUgbGluZSBpbmZvIHVwIHRvIHRoYXQgcG9pbnQuIAorICAgICAgICogTm90IHN1cmUgd2h5IHRoaXMgaXMgbmVlZGVkLgorICAgICAgICogSW4gSFAgRk9SVFJBTiB0aGlzIGNvZGUgaXMgaGFybWZ1bCBzaW5jZSB0aGVyZSAgIAorICAgICAgICogbWF5IG5vdCBiZSBhIEJFR0lOIGFmdGVyIHRoZSBGVU5DVElPTi4KKyAgICAgICAqIFNvIEkgbWFkZSBpdCBDL0MrKyBzcGVjaWZpYy4gLSBSVAorICAgICAgICovCisgICAgICBpZiAoZG5fYnVmcC0+ZGZ1bmMubGFuZ3VhZ2UgPT0gSFBfTEFOR1VBR0VfQyB8fAorICAgICAgICAgIGRuX2J1ZnAtPmRmdW5jLmxhbmd1YWdlID09IEhQX0xBTkdVQUdFX0NQTFVTUExVUykgeworICAgICAgICB3aGlsZSAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgIT0gRE5UVF9UWVBFX0JFR0lOKQorCSAgeworCSAgZG5fYnVmcCA9IGhwcmVhZF9nZXRfbG50dCAoKytpbmRleCwgb2JqZmlsZSk7CisJICBpZiAoZG5fYnVmcC0+ZGJsb2NrLmV4dGVuc2lvbikKKwkgICAgY29udGludWU7CisJICB9CisgICAgICAgIFNMX0lOREVYIChvYmpmaWxlKSA9IGhwcmVhZF9yZWNvcmRfbGluZXMgKGN1cnJlbnRfc3ViZmlsZSwKKyAgCQkJCQkJICBTTF9JTkRFWCAob2JqZmlsZSksCisJCQkJCQkgIGRuX2J1ZnAtPmRiZWdpbi5hZGRyZXNzLAorCQkJCQkJICBvYmpmaWxlLCBvZmZzZXQpOworICAgICAgICBTWU1CT0xfTElORSAoc3ltKSA9IGhwcmVhZF9nZXRfbGluZSAoZG5fYnVmcC0+ZGJlZ2luLmFkZHJlc3MsIG9iamZpbGUpOworICAgICAgfQorICAgICAgcmVjb3JkX2xpbmUgKGN1cnJlbnRfc3ViZmlsZSwgU1lNQk9MX0xJTkUgKHN5bSksIHZhbHUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9ET0NfRlVOQ1RJT046CisgICAgICB2YWx1ID0gZG5fYnVmcC0+ZGRvY2Z1bmMubG93YWRkciArIG9mZnNldDsKKworICAgICAgLyogUmVjb3JkIGxpbmVzIHVwIHRvIHRoaXMgcG9pbnQuICovCisgICAgICBTTF9JTkRFWCAob2JqZmlsZSkgPSBocHJlYWRfcmVjb3JkX2xpbmVzIChjdXJyZW50X3N1YmZpbGUsCisJCQkJCQlTTF9JTkRFWCAob2JqZmlsZSksCisJCQkJCQlkbl9idWZwLT5kZG9jZnVuYy5hZGRyZXNzLAorCQkJCQkJb2JqZmlsZSwgb2Zmc2V0KTsKKyAgICAgIAorICAgICAgV0lUSElOX0ZVTkNUSU9OIChvYmpmaWxlKSA9IDE7CisgICAgICBDVVJSRU5UX0ZVTkNUSU9OX1ZBTFVFIChvYmpmaWxlKSA9IHZhbHU7CisgICAgICAvKiBTdGFjayBtdXN0IGJlIGVtcHR5IG5vdy4gICovCisgICAgICBpZiAoY29udGV4dF9zdGFja19kZXB0aCAhPSAwKQorCWNvbXBsYWluICgmbGJyYWNfdW5tYXRjaGVkX2NvbXBsYWludCwgKGNoYXIgKikgc3ltbnVtKTsKKyAgICAgIG5ldyA9IHB1c2hfY29udGV4dCAoMCwgdmFsdSk7CisKKyAgICAgIC8qIEJ1aWx0IGEgdHlwZSBmb3IgdGhlIGZ1bmN0aW9uLiBUaGlzIGluY2x1ZGVzIHByb2Nlc3NpbmcKKyAgICAgICAqIHRoZSBzeW1ib2wgcmVjb3JkcyBmb3IgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgKi8KKyAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19CTE9DSzsKKyAgICAgIFNZTUJPTF9UWVBFIChzeW0pID0gaHByZWFkX3JlYWRfZG9jX2Z1bmN0aW9uX3R5cGUgKGhwX3R5cGUsIGRuX2J1ZnAsIG9iamZpbGUsIDEpOworCisgICAgICAvKiBUaGUgIlNZTUJPTF9OQU1FIiBmaWVsZCBpcyBleHBlY3RlZCB0byBiZSB0aGUgbWFuZ2xlZCBuYW1lCisgICAgICAgKiAoaWYgYW55KSwgd2hpY2ggd2UgZ2V0IGZyb20gdGhlICJhbGlhcyIgZmllbGQgb2YgdGhlIFNPTSByZWNvcmQKKyAgICAgICAqIGlmIHRoYXQgZXhpc3RzLgorICAgICAgICovCisgICAgICBpZiAoKGRuX2J1ZnAtPmRkb2NmdW5jLmxhbmd1YWdlID09IEhQX0xBTkdVQUdFX0NQTFVTUExVUykgJiYgCisgICAgICAgICAgZG5fYnVmcC0+ZGRvY2Z1bmMuYWxpYXMgJiYgLyogaGFzIGFuIGFsaWFzICovIAorICAgICAgICAgICooY2hhciAqKShWVCAob2JqZmlsZSkgKyBkbl9idWZwLT5kZG9jZnVuYy5hbGlhcykpIC8qIG5vdCBhIG51bGwgc3RyaW5nICovIAorICAgICAgICBTWU1CT0xfTkFNRSAoc3ltKSA9IFZUIChvYmpmaWxlKSArIGRuX2J1ZnAtPmRkb2NmdW5jLmFsaWFzOworICAgICAgZWxzZQorICAgICAgICBTWU1CT0xfTkFNRSAoc3ltKSA9IFZUIChvYmpmaWxlKSArIGRuX2J1ZnAtPmRkb2NmdW5jLm5hbWU7CisKKyAgICAgIC8qIFNwZWNpYWwgaGFjayB0byBnZXQgYXJvdW5kIEhQIGNvbXBpbGVycycgaW5zaXN0ZW5jZSBvbgorICAgICAgICogcmVwb3J0aW5nICJtYWluIiBhcyAiX01BSU5fIiBmb3IgQy9DKysgKi8KKyAgICAgIGlmICgoc3RyY21wIChTWU1CT0xfTkFNRSAoc3ltKSwgIl9NQUlOXyIpID09IDApICYmCisgICAgICAgICAgKHN0cmNtcCAoVlQgKG9iamZpbGUpICsgZG5fYnVmcC0+ZGRvY2Z1bmMubmFtZSwgIm1haW4iKSA9PSAwKSkKKyAgICAgICAgU1lNQk9MX05BTUUgKHN5bSkgPSBWVCAob2JqZmlsZSkgKyBkbl9idWZwLT5kZG9jZnVuYy5uYW1lOworICAgICAgCisgICAgICBpZiAoZG5fYnVmcC0+ZGRvY2Z1bmMubGFuZ3VhZ2UgPT0gSFBfTEFOR1VBR0VfQ1BMVVNQTFVTKSB7CisKKyAgICAgICAgLyogU1lNQk9MX0lOSVRfREVNQU5HTEVEX05BTUUgaXMgYSBtYWNybyB3aGljaCB3aW5kcyB1cAorICAgICAgICAgKiBjYWxsaW5nIHRoZSBkZW1hbmdsZXIgaW4gbGliaWJlcnR5IChjcGx1c19kZW1hbmdsZSgpKSB0bworICAgICAgICAgKiBkbyB0aGUgam9iLiBUaGlzIGdlbmVyYWxseSBkb2VzIHRoZSBqb2IsIGV2ZW4gdGhvdWdoCisgICAgICAgICAqIGl0J3MgaW50ZW5kZWQgZm9yIHRoZSBHTlUgY29tcGlsZXIgYW5kIG5vdCB0aGUgYUNDIGNvbXBpbGVyCisgICAgICAgICAqIE5vdGUgdGhhdCBTWU1CT0xfSU5JVF9ERU1BTkdMRURfTkFNRSBjYWxscyB0aGUKKyAgICAgICAgICogZGVtYW5nbGVyIHdpdGggYXJndW1lbnRzIERNR0xfUEFSQU1TIHwgRE1HTF9BTlNJLgorICAgICAgICAgKiBHZW5lcmFsbHksIHdlIGRvbid0IHdhbnQgcGFyYW1zIHdoZW4gd2UgZGlzcGxheQorICAgICAgICAgKiBhIGRlbWFuZ2xlZCBuYW1lLCBidXQgd2hlbiBJIHRvb2sgb3V0IHRoZSBETUdMX1BBUkFNUywKKyAgICAgICAgICogc29tZSB0aGluZ3MgYnJva2UsIHNvIEknbSBsZWF2aW5nIGl0IGluIGhlcmUsIGFuZAorICAgICAgICAgKiB3b3JraW5nIGFyb3VuZCB0aGUgaXNzdWUgaW4gc3RhY2suYy4gLSBSVCAKKyAgICAgICAgICovCisgICAgICAgIFNZTUJPTF9JTklUX0RFTUFOR0xFRF9OQU1FIChzeW0sICZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjayk7CisKKyAgICAgICAgaWYgKChTWU1CT0xfTkFNRSAoc3ltKSA9PSBWVCAob2JqZmlsZSkgKyBkbl9idWZwLT5kZG9jZnVuYy5hbGlhcykgJiYKKyAgICAgICAgICAgKCFTWU1CT0xfQ1BMVVNfREVNQU5HTEVEX05BTUUoc3ltKSkpIHsKKworICAgICAgICAgIC8qIFdlbGwsIHRoZSBzeW1ib2wgbmFtZSBpcyBtYW5nbGVkLCBidXQgdGhlCisgICAgICAgICAgICogZGVtYW5nbGVyIGluIGxpYmliZXJ0eSBmYWlsZWQgc28gdGhlIGRlbWFuZ2xlZAorICAgICAgICAgICAqIGZpZWxkIGlzIHN0aWxsIE5VTEwuIFRyeSB0bworICAgICAgICAgICAqIGRvIHRoZSBqb2Igb3Vyc2VsdmVzIGJhc2VkIG9uIHRoZSAibmFtZSIgZmllbGQKKyAgICAgICAgICAgKiBpbiB0aGUgU09NIHJlY29yZC4gQSBjb21wbGljYXRpb24gaGVyZSBpcyB0aGF0CisgICAgICAgICAgICogdGhlIG5hbWUgZmllbGQgY29udGFpbnMgb25seSB0aGUgZnVuY3Rpb24gbmFtZQorICAgICAgICAgICAqIChsaWtlICJmIiksIHdoZXJlYXMgd2Ugd2FudCB0aGUgY2xhc3MgcXVhbGlmaWNhdGlvbgorICAgICAgICAgICAqIChhcyBpbiAiYzo6ZiIpLiBUcnkgdG8gcmVjb25zdHJ1Y3QgdGhhdC4KKyAgICAgICAgICAgKi8gICAgICAgICAgCisgICAgICAgICAgY2hhciAqIGJhc2VuYW1lOworICAgICAgICAgIGNoYXIgKiBjbGFzc25hbWU7CisgICAgICAgICAgY2hhciAqIGRlbV9uYW1lOworICAgICAgICAgIGJhc2VuYW1lID0gVlQgKG9iamZpbGUpICsgZG5fYnVmcC0+ZGRvY2Z1bmMubmFtZTsKKyAgICAgICAgICBjbGFzc25hbWUgPSBjbGFzc19vZihTWU1CT0xfVFlQRShzeW0pKTsKKyAgICAgICAgICBpZiAoY2xhc3NuYW1lKSB7CisgICAgICAgICAgICBkZW1fbmFtZSA9IHhtYWxsb2Moc3RybGVuKGJhc2VuYW1lKStzdHJsZW4oY2xhc3NuYW1lKSszKTsKKyAgICAgICAgICAgIHN0cmNweShkZW1fbmFtZSwgY2xhc3NuYW1lKTsKKyAgICAgICAgICAgIHN0cmNhdChkZW1fbmFtZSwgIjo6Iik7CisgICAgICAgICAgICBzdHJjYXQoZGVtX25hbWUsIGJhc2VuYW1lKTsKKyAgICAgICAgICAgIFNZTUJPTF9DUExVU19ERU1BTkdMRURfTkFNRShzeW0pID0gZGVtX25hbWU7CisgICAgICAgICAgICBTWU1CT0xfTEFOR1VBR0UgKHN5bSkgPSBsYW5ndWFnZV9jcGx1czsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogQWRkIHRoZSBmdW5jdGlvbiBzeW1ib2wgdG8gdGhlIGxpc3Qgb2Ygc3ltYm9scyBpbiB0aGlzIGJsb2NrdmVjdG9yICovCisgICAgICBpZiAoZG5fYnVmcC0+ZGRvY2Z1bmMuZ2xvYmFsKQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZ2xvYmFsX3N5bWJvbHMpOworICAgICAgZWxzZQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZmlsZV9zeW1ib2xzKTsKKyAgICAgIG5ldy0+bmFtZSA9IHN5bTsKKworICAgICAgLyogU2VhcmNoIGZvcndhcmQgdG8gdGhlIG5leHQgQkVHSU4gYW5kIGFsc28gcmVhZAorICAgICAgICogaW4gdGhlIGxpbmUgaW5mbyB1cCB0byB0aGF0IHBvaW50LiAKKyAgICAgICAqIE5vdCBzdXJlIHdoeSB0aGlzIGlzIG5lZWRlZC4KKyAgICAgICAqIEluIEhQIEZPUlRSQU4gdGhpcyBjb2RlIGlzIGhhcm1mdWwgc2luY2UgdGhlcmUgICAKKyAgICAgICAqIG1heSBub3QgYmUgYSBCRUdJTiBhZnRlciB0aGUgRlVOQ1RJT04uCisgICAgICAgKiBTbyBJIG1hZGUgaXQgQy9DKysgc3BlY2lmaWMuIC0gUlQKKyAgICAgICAqLworICAgICAgaWYgKGRuX2J1ZnAtPmRkb2NmdW5jLmxhbmd1YWdlID09IEhQX0xBTkdVQUdFX0MgfHwKKyAgICAgICAgICBkbl9idWZwLT5kZG9jZnVuYy5sYW5ndWFnZSA9PSBIUF9MQU5HVUFHRV9DUExVU1BMVVMpIHsKKyAgICAgICAgd2hpbGUgKGRuX2J1ZnAtPmRibG9jay5raW5kICE9IEROVFRfVFlQRV9CRUdJTikKKwkgIHsKKwkgIGRuX2J1ZnAgPSBocHJlYWRfZ2V0X2xudHQgKCsraW5kZXgsIG9iamZpbGUpOworCSAgaWYgKGRuX2J1ZnAtPmRibG9jay5leHRlbnNpb24pCisJICAgIGNvbnRpbnVlOworCSAgfQorICAgICAgICBTTF9JTkRFWCAob2JqZmlsZSkgPSBocHJlYWRfcmVjb3JkX2xpbmVzIChjdXJyZW50X3N1YmZpbGUsCisgIAkJCQkJCSAgU0xfSU5ERVggKG9iamZpbGUpLAorCQkJCQkJICBkbl9idWZwLT5kYmVnaW4uYWRkcmVzcywKKwkJCQkJCSAgb2JqZmlsZSwgb2Zmc2V0KTsKKyAgICAgICAgU1lNQk9MX0xJTkUgKHN5bSkgPSBocHJlYWRfZ2V0X2xpbmUgKGRuX2J1ZnAtPmRiZWdpbi5hZGRyZXNzLCBvYmpmaWxlKTsKKyAgICAgIH0KKyAgICAgIHJlY29yZF9saW5lIChjdXJyZW50X3N1YmZpbGUsIFNZTUJPTF9MSU5FIChzeW0pLCB2YWx1KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBETlRUX1RZUEVfQkVHSU46CisgICAgICAvKiBCZWdpbiBhIG5ldyBzY29wZS4gKi8KKyAgICAgIGlmIChjb250ZXh0X3N0YWNrX2RlcHRoID09IDEgLyogdGhpcyBtZWFucyB3ZSdyZSBhdCBmdW5jdGlvbiBsZXZlbCAqLyAmJgorICAgICAgICAgIGNvbnRleHRfc3RhY2tbMF0ubmFtZSAhPSBOVUxMIC8qIHRoaXMgbWVhbnMgaXQncyBhIGZ1bmN0aW9uICovICYmCisgICAgICAgICAgY29udGV4dF9zdGFja1swXS5kZXB0aCA9PSAwIC8qIHRoaXMgbWVhbnMgaXQncyB0aGUgZmlyc3QgQkVHSU4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlJ3ZlIHNlZW4gYWZ0ZXIgdGhlIEZVTkNUSU9OICovIAorICAgICAgICAgKQorICAgICAgeworICAgICAgICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBCRUdJTiBhZnRlciBhIEZVTkNUSU9OLgorICAgICAgICAgKiBXZSBpZ25vcmUgdGhpcyBvbmUsIHNpbmNlIEhQIGNvbXBpbGVycyBhbHdheXMgaW5zZXJ0CisgICAgICAgICAqIGF0IGxlYXN0IG9uZSBCRUdJTiwgaS5lLiBpdCdzOgorICAgICAgICAgKiAKKyAgICAgICAgICogICAgIEZVTkNUSU9OCisgICAgICAgICAqICAgICBhcmd1bWVudCBzeW1ib2xzCisgICAgICAgICAqICAgICBCRUdJTgorICAgICAgICAgKiAgICAgbG9jYWwgc3ltYm9scworICAgICAgICAgKiAgICAgICAgKHBvc3NpYmx5IG5lc3RlZCBCRUdJTiAuLi4gRU5EJ3MgaWYgdGhlcmUgYXJlIGlubmVyIHsgfSBibG9ja3MpCisgICAgICAgICAqICAgICBFTkQKKyAgICAgICAgICogICAgIEVORAorICAgICAgICAgKgorICAgICAgICAgKiBCeSBpZ25vcmluZyB0aGlzIGZpcnN0IEJFR0lOLCB0aGUgbG9jYWwgc3ltYm9scyBnZXQgdHJlYXRlZAorICAgICAgICAgKiBhcyBiZWxvbmdpbmcgdG8gdGhlIGZ1bmN0aW9uIHNjb3BlLCBhbmQgInByaW50IGZ1bmM6OmxvY2FsX3N5bSIKKyAgICAgICAgICogd29ya3MgKHdoaWNoIGlzIHdoYXQgd2Ugd2FudCkuCisgICAgICAgICAqLworCisgICAgICAgIC8qIEFsbCB3ZSBkbyBoZXJlIGlzIGluY3JlYXNlIHRoZSBkZXB0aCBjb3VudCBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgICogdGhlIEZVTkNUSU9OIGVudHJ5IGluIHRoZSBjb250ZXh0IHN0YWNrLiBUaGlzIGVuc3VyZXMgdGhhdAorICAgICAgICAgKiB0aGUgbmV4dCBCRUdJTiB3ZSBzZWUgKGlmIGFueSksIHJlcHJlc2VudGluZyBhIHJlYWwgbmVzdGVkIHsgfQorICAgICAgICAgKiBibG9jaywgd2lsbCBnZXQgcHJvY2Vzc2VkLgorICAgICAgICAgKi8gCisKKyAgICAgICAgIGNvbnRleHRfc3RhY2tbMF0uZGVwdGgrKzsKKworICAgICAgfSBlbHNlIHsgCisKKyAgICAgICAgLyogUmVjb3JkIGxpbmVzIHVwIHRvIHRoaXMgU0xUIHBvaW50ZXIuICovCisgICAgICAgIFNMX0lOREVYIChvYmpmaWxlKSA9IGhwcmVhZF9yZWNvcmRfbGluZXMgKGN1cnJlbnRfc3ViZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAJCQkgCSAgU0xfSU5ERVggKG9iamZpbGUpLAorCQkJCQkJICBkbl9idWZwLT5kYmVnaW4uYWRkcmVzcywKKwkJCQkJCSAgb2JqZmlsZSwgb2Zmc2V0KTsKKyAgICAgICAgLyogQ2FsY3VsYXRlIHN0YXJ0IGFkZHJlc3Mgb2YgbmV3IHNjb3BlICovCisgICAgICAgIHZhbHUgPSBocHJlYWRfZ2V0X2xvY2F0aW9uIChkbl9idWZwLT5kYmVnaW4uYWRkcmVzcywgb2JqZmlsZSk7CisgICAgICAgIHZhbHUgKz0gb2Zmc2V0OwkJLyogUmVsb2NhdGUgZm9yIGR5bmFtaWMgbG9hZGluZyAqLworICAgICAgICAvKiBXZSB1c2UgdGhlIHNjb3BlIHN0YXJ0IEROVFQgaW5kZXggYXMgbmVzdGluZyBkZXB0aCBpZGVudGlmaWVyISAqLworICAgICAgICBkZXNjID0gaHByZWFkX2dldF9zY29wZV9zdGFydCAoZG5fYnVmcC0+ZGJlZ2luLmFkZHJlc3MsIG9iamZpbGUpOworICAgICAgICBuZXcgPSBwdXNoX2NvbnRleHQgKGRlc2MsIHZhbHUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9FTkQ6CisgICAgICAvKiBFbmQgYSBzY29wZS4gICovCisKKyAgICAgIC8qIFZhbGlkIGVuZCBraW5kcyBhcmU6CisgICAgICAgKiAgTU9EVUxFCisgICAgICAgKiAgRlVOQ1RJT04KKyAgICAgICAqICBXSVRICisgICAgICAgKiAgQ09NTU9OCisgICAgICAgKiAgQkVHSU4KKyAgICAgICAqICBDTEFTU19TQ09QRQorICAgICAgICovCisKKyAgICAgIFNMX0lOREVYIChvYmpmaWxlKSA9IGhwcmVhZF9yZWNvcmRfbGluZXMgKGN1cnJlbnRfc3ViZmlsZSwKKwkJCQkJCVNMX0lOREVYIChvYmpmaWxlKSwKKwkJCQkJCWRuX2J1ZnAtPmRlbmQuYWRkcmVzcywKKwkJCQkJCW9iamZpbGUsIG9mZnNldCk7CisgICAgICBzd2l0Y2ggKGRuX2J1ZnAtPmRlbmQuZW5ka2luZCkKKwl7CisJY2FzZSBETlRUX1RZUEVfTU9EVUxFOgorCSAgLyogRW5kaW5nIGEgbW9kdWxlIGVuZHMgdGhlIHN5bWJvbCB0YWJsZSBmb3IgdGhhdCBtb2R1bGUuICAKKyAgICAgICAgICAgKiBDYWxsaW5nIGVuZF9zeW10YWIoKSBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNsZWFyaW5nIHRoZQorICAgICAgICAgICAqIGxhc3Rfc291cmNlX2ZpbGUgcG9pbnRlciwgd2hpY2ggaW4gdHVybiBzaWduYWxzIAorICAgICAgICAgICAqIHByb2Nlc3Nfb25lX2RlYnVnX3N5bWJvbCgpIHRvIHRyZWF0IHRoZSBuZXh0IEROVFRfVFlQRV9TUkNGSUxFCisgICAgICAgICAgICogcmVjb3JkIGFzIGEgbW9kdWxlLWJlZ2luLgorICAgICAgICAgICAqLworCSAgdmFsdSA9IHRleHRfb2Zmc2V0ICsgdGV4dF9zaXplICsgb2Zmc2V0OworCisgICAgICAgICAgLyogVGVsbCBvdXIgY2FsbGVyIHRoYXQgd2UncmUgZG9uZSB3aXRoIGV4cGFuZGluZyB0aGUKKyAgICAgICAgICAgKiBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgYSBtb2R1bGUuCisgICAgICAgICAgICovCisgICAgICAgICAgKmF0X21vZHVsZV9ib3VuZGFyeV9wID0gMTsKKworICAgICAgICAgIC8qIERvbid0IGRvIHRoaXMsIGFzIG91ciBjYWxsZXIgd2lsbCBkbyBpdCEKKyAgICAgICAgICAgKgorICAgICAgICAgICAqCSAgKHZvaWQpIGVuZF9zeW10YWIgKHZhbHUsIG9iamZpbGUsIDApOworICAgICAgICAgICAqLworCSAgYnJlYWs7CisKKwljYXNlIEROVFRfVFlQRV9GVU5DVElPTjoKKwkgIC8qIEVuZGluZyBhIGZ1bmN0aW9uLCB3ZWxsLCBlbmRzIHRoZSBmdW5jdGlvbidzIHNjb3BlLiAgKi8KKwkgIGRuX3RlbXAgPSBocHJlYWRfZ2V0X2xudHQgKGRuX2J1ZnAtPmRlbmQuYmVnaW5zY29wZS5kbnR0cC5pbmRleCwKKwkJCQkgICAgIG9iamZpbGUpOworCSAgdmFsdSA9IGRuX3RlbXAtPmRmdW5jLmhpYWRkciArIG9mZnNldDsKKyAgICAgICAgICAvKiBJbnNlcnQgZnVuYyBwYXJhbXMgaW50byBsb2NhbCBsaXN0ICovIAorICAgICAgICAgIG1lcmdlX3N5bWJvbF9saXN0cyAoJnBhcmFtX3N5bWJvbHMsICZsb2NhbF9zeW1ib2xzKTsKKwkgIG5ldyA9IHBvcF9jb250ZXh0ICgpOworCSAgLyogTWFrZSBhIGJsb2NrIGZvciB0aGUgbG9jYWwgc3ltYm9scyB3aXRoaW4uICAqLworCSAgZmluaXNoX2Jsb2NrIChuZXctPm5hbWUsICZsb2NhbF9zeW1ib2xzLCBuZXctPm9sZF9ibG9ja3MsCisJCQluZXctPnN0YXJ0X2FkZHIsIHZhbHUsIG9iamZpbGUpOworCSAgV0lUSElOX0ZVTkNUSU9OIChvYmpmaWxlKSA9IDA7IC8qIFRoaXMgbWF5IGhhdmUgdG8gY2hhbmdlIGZvciBQYXNjYWwgKi8gCisgICAgICAgICAgbG9jYWxfc3ltYm9scyA9IG5ldy0+bG9jYWxzOworICAgICAgICAgIHBhcmFtX3N5bWJvbHMgPSBuZXctPnBhcmFtczsKKwkgIGJyZWFrOworCisJY2FzZSBETlRUX1RZUEVfQkVHSU46CisgICAgICAgICAgaWYgKGNvbnRleHRfc3RhY2tfZGVwdGggPT0gMSAmJgorICAgICAgICAgICAgICBjb250ZXh0X3N0YWNrWzBdLm5hbWUgIT0gTlVMTCAmJgorICAgICAgICAgICAgICBjb250ZXh0X3N0YWNrWzBdLmRlcHRoID09IDEpICAgICAgICAgCisgICAgICAgICAgeworICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgRU5EIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICAgICAgICAgICAgKiBCRUdJTiB3aGljaCB3ZSBpZ25vcmVkIC0gc2VlIEROVFRfVFlQRV9CRUdJTiBjYXNlIGFib3ZlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjb250ZXh0X3N0YWNrWzBdLmRlcHRoLS07CisgICAgICAgICAgfSBlbHNlIHsKKwkgICAgLyogRW5kaW5nIGEgbG9jYWwgc2NvcGUuICAqLworCSAgICB2YWx1ID0gaHByZWFkX2dldF9sb2NhdGlvbiAoZG5fYnVmcC0+ZGVuZC5hZGRyZXNzLCBvYmpmaWxlKTsKKwkgICAgLyogV2h5IGluIHRoZSBoZWxsIGlzIHRoaXMgbmVlZGVkPyAgKi8KKwkgICAgdmFsdSArPSBvZmZzZXQgKyA5OwkvKiBSZWxvY2F0ZSBmb3IgZHluYW1pYyBsb2FkaW5nICovCisJICAgIG5ldyA9IHBvcF9jb250ZXh0ICgpOworCSAgICBkZXNjID0gZG5fYnVmcC0+ZGVuZC5iZWdpbnNjb3BlLmRudHRwLmluZGV4OworCSAgICBpZiAoZGVzYyAhPSBuZXctPmRlcHRoKQorCSAgICAgIGNvbXBsYWluICgmbGJyYWNfbWlzbWF0Y2hfY29tcGxhaW50LCAoY2hhciAqKSBzeW1udW0pOworCisJICAgIC8qIE1ha2UgYSBibG9jayBmb3IgdGhlIGxvY2FsIHN5bWJvbHMgd2l0aGluLiAgKi8KKwkgICAgZmluaXNoX2Jsb2NrIChuZXctPm5hbWUsICZsb2NhbF9zeW1ib2xzLCBuZXctPm9sZF9ibG9ja3MsCisJICAgICAgICAgICAgICAgICAgbmV3LT5zdGFydF9hZGRyLCB2YWx1LCBvYmpmaWxlKTsKKwkgICAgbG9jYWxfc3ltYm9scyA9IG5ldy0+bG9jYWxzOworCSAgICBwYXJhbV9zeW1ib2xzID0gbmV3LT5wYXJhbXM7CisgICAgICAgICAgfQorCSAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBETlRUX1RZUEVfV0lUSDoKKyAgICAgICAgICAvKiBTaW5jZSB3ZSBpZ25vcmUgdGhlIEROVFRfVFlQRV9XSVRIIHRoYXQgc3RhcnRzIHRoZSBzY29wZSwKKyAgICAgICAgICAgKiB3ZSBjYW4gaWdub3JlIHRoZSBETlRUX1RZUEVfRU5EIHRoYXQgZW5kcyBpdC4KKyAgICAgICAgICAgKi8KKwkgIGJyZWFrOworCisgICAgICAgIGNhc2UgRE5UVF9UWVBFX0NPTU1PTjoKKyAgICAgICAgICAvKiBFbmQgYSBGT1JUUkFOIGNvbW1vbiBibG9jay4gV2UgZG9uJ3QgY3VycmVudGx5IGhhbmRsZSB0aGVzZSAqLworICAgICAgICAgIGNvbXBsYWluICgmaHByZWFkX3VuaGFuZGxlZF9lbmRfY29tbW9uX2NvbXBsYWludCk7CisJICBicmVhazsKKworICAgICAgICBjYXNlIEROVFRfVFlQRV9DTEFTU19TQ09QRTogCisKKyAgICAgICAgIC8qIHBhaTogRklYTUUgTm90IGhhbmRsaW5nIG5lc3RlZCBjbGFzc2VzIGZvciBub3cgLS0gbXVzdAorICAgICAgICAgICAqIG1haW50YWluIGEgc3RhY2sgKi8KKyAgICAgICAgICBjbGFzc19zY29wZV9uYW1lID0gTlVMTDsKKworI2lmIDAKKyAgICAgICAgICAvKiBFbmQgYSBjbGFzcyBzY29wZSAqLworCSAgdmFsdSA9IGhwcmVhZF9nZXRfbG9jYXRpb24gKGRuX2J1ZnAtPmRlbmQuYWRkcmVzcywgb2JqZmlsZSk7CisJICAvKiBXaHkgaW4gdGhlIGhlbGwgaXMgdGhpcyBuZWVkZWQ/ICAqLworCSAgdmFsdSArPSBvZmZzZXQgKyA5OwkvKiBSZWxvY2F0ZSBmb3IgZHluYW1pYyBsb2FkaW5nICovCisJICBuZXcgPSBwb3BfY29udGV4dCAoKTsKKwkgIGRlc2MgPSBkbl9idWZwLT5kZW5kLmJlZ2luc2NvcGUuZG50dHAuaW5kZXg7CisJICBpZiAoZGVzYyAhPSBuZXctPmRlcHRoKQorCSAgICBjb21wbGFpbiAoJmxicmFjX21pc21hdGNoX2NvbXBsYWludCwgKGNoYXIgKikgc3ltbnVtKTsKKwkgIC8qIE1ha2UgYSBibG9jayBmb3IgdGhlIGxvY2FsIHN5bWJvbHMgd2l0aGluLiAgKi8KKwkgIGZpbmlzaF9ibG9jayAobmV3LT5uYW1lLCAmbG9jYWxfc3ltYm9scywgbmV3LT5vbGRfYmxvY2tzLAorCQkJbmV3LT5zdGFydF9hZGRyLCB2YWx1LCBvYmpmaWxlKTsKKwkgIGxvY2FsX3N5bWJvbHMgPSBuZXctPmxvY2FsczsKKwkgIHBhcmFtX3N5bWJvbHMgPSBuZXctPnBhcmFtczsKKyNlbmRpZgorCSAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBjb21wbGFpbiAoJmhwcmVhZF91bmV4cGVjdGVkX2VuZF9jb21wbGFpbnQpOworICAgICAgICAgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworCisgICAgLyogRE5UVF9UWVBFX0lNUE9SVCBpcyBub3QgaGFuZGxlZCAqLworCisgICAgY2FzZSBETlRUX1RZUEVfTEFCRUw6CisgICAgICBTWU1CT0xfTkFNRVNQQUNFIChzeW0pID0gTEFCRUxfTkFNRVNQQUNFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9GUEFSQU06CisgICAgICAvKiBGdW5jdGlvbiBwYXJhbWV0ZXJzLiAgKi8KKyAgICAgIC8qIE5vdGUgMTogVGhpcyBjb2RlIHdhcyBwcmVzZW50IGluIHRoZSA0LjE2IHNvdXJjZXMsIGFuZCB0aGVuCisgICAgICAgICByZW1vdmVkLCBiZWNhdXNlIGZwYXJhbXMgYXJlIGhhbmRsZWQgaW4KKyAgICAgICAgIGhwcmVhZF9yZWFkX2Z1bmN0aW9uX3R5cGUoKS4gIEhvd2V2ZXIsIHdoaWxlIGZwYXJhbSBzeW1ib2xzCisgICAgICAgICBhcmUgaW5kZWVkIGhhbmRsZWQgdHdpY2UsIHRoaXMgY29kZSBoZXJlIGNhbm5vdCBiZSByZW1vdmVkCisgICAgICAgICBiZWNhdXNlIHRoZW4gdGhleSBkb24ndCBnZXQgYWRkZWQgdG8gdGhlIGxvY2FsIHN5bWJvbCBsaXN0IG9mCisgICAgICAgICB0aGUgZnVuY3Rpb24ncyBjb2RlIGJsb2NrLCB3aGljaCBsZWFkcyB0byBhIGZhaWx1cmUgdG8gbG9vaworICAgICAgICAgdXAgbG9jYWxzLCAidGhpcyItcmVsYXRpdmUgbWVtYmVyIG5hbWVzLCBldGMuICBTbyBJJ3ZlIHB1dAorICAgICAgICAgdGhpcyBjb2RlIGJhY2sgaW4uIHBhaS8xOTk3LTA3LTIxICovCisgICAgICAvKiBOb3RlIDI6IFRvIGZpeCBhIGRlZmVjdCwgd2Ugc3RvcHBlZCBhZGRpbmcgRlBBUkFNUyB0byBsb2NhbF9zeW1ib2xzCisgICAgICAgICBpbiBocHJlYWRfcmVhZF9mdW5jdGlvbl90eXBlKCksIHNvIEZQQVJBTVMgaGFkIHRvIGJlIGhhbmRsZWQKKyAgICAgICAgIGhlcmUuICBJIGNoYW5nZWQgdGhlIGxvY2F0aW9uIHRvIGJlIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudAorICAgICAgICAga2luZHMgcmF0aGVyIHRoYW4gTE9DX0xPQ0FMLiBwYWkvMTk5Ny0wOC0wOCAqLworICAgICAgLyogTm90ZSAzOiBXZWxsLCB0aGUgZml4IGluIE5vdGUgMiBhYm92ZSBicm9rZSBhcmd1bWVudCBwcmludGluZworICAgICAgICAgaW4gdHJhY2ViYWNrIGZyYW1lcywgYW5kIGZ1cnRoZXIgaXQgbWFrZXMgYXNzdW1wdGlvbnMgYWJvdXQgdGhlCisgICAgICAgICBvcmRlciBvZiB0aGUgRlBBUkFNIGVudHJpZXMgZnJvbSBIUCBjb21waWxlcnMgKGNjIGFuZCBhQ0MgaW4gcGFydGljdWxhcgorICAgICAgICAgZ2VuZXJhdGUgdGhlbSBpbiByZXZlcnNlIG9yZGVycyAtLSBmaXhpbmcgb25lIGJyZWFrcyBmb3IgdGhlIG90aGVyKS4KKyAgICAgICAgIFNvIEkndmUgYWRkZWQgY29kZSBpbiBocHJlYWRfcmVhZF9mdW5jdGlvbl90eXBlKCkgdG8gYWRkIGZwYXJhbXMKKyAgICAgICAgIHRvIGEgcGFyYW1fc3ltYm9scyBsaXN0IGZvciB0aGUgY3VycmVudCBjb250ZXh0IGxldmVsLiAgVGhlc2UgYXJlCisgICAgICAgICB0aGVuIG1lcmdlZCBpbnRvIGxvY2FsX3N5bWJvbHMgd2hlbiBhIGZ1bmN0aW9uIGVuZCBpcyByZWFjaGVkLgorICAgICAgICAgcGFpLzE5OTctMDgtMTEgKi8gCisgICAgICAgICAKKyAgICAgIGJyZWFrOyAvKiBkbyBub3RoaW5nOyBoYW5kbGVkIGluIGhwcmVhZF9yZWFkX2Z1bmN0aW9uX3R5cGUoKSAqLyAKKyAgICAgIAorI2lmIDAgLyogT2xkIGNvZGUgKi8gCisgICAgICBpZiAoZG5fYnVmcC0+ZGZwYXJhbS5yZWdwYXJhbSkKKyAgICAgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX1JFR0lTVEVSOworICAgICAgZWxzZSBpZiAoZG5fYnVmcC0+ZGZwYXJhbS5pbmRpcmVjdCkKKwlTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfUkVGX0FSRzsKKyAgICAgIGVsc2UKKwlTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfQVJHOworICAgICAgU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9IFZBUl9OQU1FU1BBQ0U7CisgICAgICBpZiAoZG5fYnVmcC0+ZGZwYXJhbS5jb3B5cGFyYW0pCisgICAgICAgIHsKKyAgICAgICAgICBTWU1CT0xfVkFMVUUgKHN5bSkgPSBkbl9idWZwLT5kZnBhcmFtLmxvY2F0aW9uOworI2lmZGVmIEhQUkVBRF9BREpVU1RfU1RBQ0tfQUREUkVTUworICAgICAgICAgIFNZTUJPTF9WQUxVRSAoc3ltKQorICAgICAgICAgICAgKz0gSFBSRUFEX0FESlVTVF9TVEFDS19BRERSRVNTIChDVVJSRU5UX0ZVTkNUSU9OX1ZBTFVFIChvYmpmaWxlKSk7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBTWU1CT0xfVkFMVUUgKHN5bSkgPSBkbl9idWZwLT5kZnBhcmFtLmxvY2F0aW9uOworICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSBocHJlYWRfdHlwZV9sb29rdXAgKGRuX2J1ZnAtPmRmcGFyYW0udHlwZSwgb2JqZmlsZSk7CisgICAgICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmZwYXJhbV9zeW1ib2xzKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICBjYXNlIEROVFRfVFlQRV9TVkFSOgorICAgICAgLyogU3RhdGljIHZhcmlhYmxlcy4gICovCisgICAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfU1RBVElDOyAKKworICAgICAgLyogTm90ZTogVGhlcmUgaXMgYSBjYXNlIHRoYXQgYXJpc2VzIHdpdGggZ2xvYmFscyBpbiBzaGFyZWQKKyAgICAgICAqIGxpYnJhcmllcyB3aGVyZSB3ZSBuZWVkIHRvIHNldCB0aGUgYWRkcmVzcyB0byBMT0NfSU5ESVJFQ1QuCisgICAgICAgKiBUaGlzIGNhc2UgaXMgaWYgeW91IGhhdmUgYSBnbG9iYWwgImciIGluIG9uZSBsaWJyYXJ5LCBhbmQKKyAgICAgICAqIGl0IGlzIHJlZmVyZW5jZWQgImV4dGVybiA8dHlwZT4gZzsiIGluIGFub3RoZXIgbGlicmFyeS4KKyAgICAgICAqIElmIHdlJ3JlIHByb2Nlc3NpbmcgdGhlIHN5bWJvbHMgZm9yIHRoZSByZWZlcmVuY2luZyBsaWJyYXJ5LAorICAgICAgICogd2UnbGwgc2VlIGEgZ2xvYmFsICJnIiwgYnV0IGluIHRoaXMgY2FzZSB0aGUgYWRkcmVzcyBnaXZlbgorICAgICAgICogaW4gdGhlIHN5bWJvbCB0YWJsZSBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIHJlYWwgImciLgorICAgICAgICogV2UgdXNlIHRoZSBzdG9yYWdlIGNsYXNzIExPQ19JTkRJUkVDVCB0byBpbmRpY2F0ZSB0aGlzLiBSVAorICAgICAgICovCisgICAgICBpZiAoaXNfaW5faW1wb3J0X2xpc3QgKFNZTUJPTF9OQU1FKHN5bSksIG9iamZpbGUpKQorICAgICAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfSU5ESVJFQ1Q7CisKKyAgICAgIFNZTUJPTF9WQUxVRV9BRERSRVNTIChzeW0pID0gZG5fYnVmcC0+ZHN2YXIubG9jYXRpb24gKyBkYXRhX29mZnNldDsKKyAgICAgIFNZTUJPTF9UWVBFIChzeW0pID0gaHByZWFkX3R5cGVfbG9va3VwIChkbl9idWZwLT5kc3Zhci50eXBlLCBvYmpmaWxlKTsKKworICAgICAgaWYgKGRuX2J1ZnAtPmRzdmFyLmdsb2JhbCkKKwlhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmdsb2JhbF9zeW1ib2xzKTsKKyAgICAgICAgCisgICAgICBlbHNlIGlmIChXSVRISU5fRlVOQ1RJT04gKG9iamZpbGUpKQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmbG9jYWxfc3ltYm9scyk7CisgICAgICAgIAorICAgICAgZWxzZQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZmlsZV9zeW1ib2xzKTsKKworICAgICAgaWYgKGRuX2J1ZnAtPmRzdmFyLnRocmVhZF9zcGVjaWZpYykKKyAgICAgICAgeworICAgICAgICAgIC8qIFRocmVhZC1sb2NhbCB2YXJpYWJsZS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgICA9IExPQ19USFJFQURfTE9DQUxfU1RBVElDOworICAgICAgICAgIFNZTUJPTF9CQVNFUkVHIChzeW0pID0gQ1IyN19SRUdOVU07CisKKyAgICAgICAgICBpZiggb2JqZmlsZS0+ZmxhZ3MgJiBPQkpGX1NIQVJFRCApIHsKKyAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICogVGhpcyB2YXJpYWJsZSBpcyBub3Qgb25seSB0aHJlYWQgbG9jYWwgYnV0CisgICAgICAgICAgICAgICAqIGluIGEgc2hhcmVkIGxpYnJhcnkuCisgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAqIEFsYXMsIHRoZSBzaGFyZWQgbGliIHN0cnVjdHVyZXMgYXJlIHByaXZhdGUKKyAgICAgICAgICAgICAgICogdG8gInNvbXNvbGliLmMiLiAgQnV0IEMgbGV0cyB1cyBwb2ludCB0byBvbmUuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBzdHJ1Y3Qgc29fbGlzdCAqc287CisKKyAgICAgICAgICAgICAgaWYoIG9iamZpbGUtPm9ial9wcml2YXRlID09IE5VTEwgKQorICAgICAgICAgICAgICAgICAgZXJyb3IoICJJbnRlcm5hbCBlcnJvciBpbiByZWFkaW5nIHNoYXJlZCBsaWJyYXJ5IGluZm9ybWF0aW9uLiIgKTsKKworICAgICAgICAgICAgICBzbyA9ICgob2JqX3ByaXZhdGVfZGF0YV90ICopKG9iamZpbGUtPm9ial9wcml2YXRlKSktPnNvX2luZm87CisgICAgICAgICAgICAgIGlmKCBzbyA9PSBOVUxMICkKKyAgICAgICAgICAgICAgICAgIGVycm9yKCAiSW50ZXJuYWwgZXJyb3IgaW4gcmVhZGluZyBzaGFyZWQgbGlicmFyeSBpbmZvcm1hdGlvbi4iICk7CisKKyAgICAgICAgICAgICAgLyogVGhyZWFkLWxvY2FscyBpbiBzaGFyZWQgbGlicmFyaWVzIGRvIE5PVCBoYXZlIHRoZQorICAgICAgICAgICAgICAgKiBzdGFuZGFyZCBvZmZzZXQgKCJkYXRhX29mZnNldCIpLCBzbyB3ZSByZS1jYWxjdWxhdGUKKyAgICAgICAgICAgICAgICogd2hlcmUgdG8gbG9vayBmb3IgdGhpcyB2YXJpYWJsZSwgdXNpbmcgYSBjYWxsLWJhY2sKKyAgICAgICAgICAgICAgICogdG8gaW50ZXJwcmV0IHRoZSBwcml2YXRlIHNoYXJlZC1saWJyYXJ5IGRhdGEuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBTWU1CT0xfVkFMVUVfQUREUkVTUyhzeW0pID0gZG5fYnVmcC0+ZHN2YXIubG9jYXRpb24gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29fbGliX3RocmVhZF9zdGFydF9hZGRyKCBzbyApOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9EVkFSOgorICAgICAgLyogRHluYW1pYyB2YXJpYWJsZXMuICAqLworICAgICAgaWYgKGRuX2J1ZnAtPmRkdmFyLnJlZ3ZhcikKKwlTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfUkVHSVNURVI7CisgICAgICBlbHNlCisJU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0xPQ0FMOworICAgICAgICAKKyAgICAgIFNZTUJPTF9WQUxVRSAoc3ltKSA9IGRuX2J1ZnAtPmRkdmFyLmxvY2F0aW9uOworI2lmZGVmIEhQUkVBRF9BREpVU1RfU1RBQ0tfQUREUkVTUworICAgICAgU1lNQk9MX1ZBTFVFIChzeW0pCisJKz0gSFBSRUFEX0FESlVTVF9TVEFDS19BRERSRVNTIChDVVJSRU5UX0ZVTkNUSU9OX1ZBTFVFIChvYmpmaWxlKSk7CisjZW5kaWYKKyAgICAgIFNZTUJPTF9UWVBFIChzeW0pID0gaHByZWFkX3R5cGVfbG9va3VwIChkbl9idWZwLT5kZHZhci50eXBlLCBvYmpmaWxlKTsKKyAgICAgIGlmIChkbl9idWZwLT5kZHZhci5nbG9iYWwpCisJYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZnbG9iYWxfc3ltYm9scyk7CisgICAgICBlbHNlIGlmIChXSVRISU5fRlVOQ1RJT04gKG9iamZpbGUpKQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmbG9jYWxfc3ltYm9scyk7CisgICAgICBlbHNlCisJYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZmaWxlX3N5bWJvbHMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9DT05TVDoKKyAgICAgIC8qIEEgY29uc3RhbnQgKHBhc2NhbD8pLiAgKi8KKyAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19DT05TVDsKKyAgICAgIFNZTUJPTF9WQUxVRSAoc3ltKSA9IGRuX2J1ZnAtPmRjb25zdC5sb2NhdGlvbjsKKyAgICAgIFNZTUJPTF9UWVBFIChzeW0pID0gaHByZWFkX3R5cGVfbG9va3VwIChkbl9idWZwLT5kY29uc3QudHlwZSwgb2JqZmlsZSk7CisgICAgICBpZiAoZG5fYnVmcC0+ZGNvbnN0Lmdsb2JhbCkKKwlhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmdsb2JhbF9zeW1ib2xzKTsKKyAgICAgIGVsc2UgaWYgKFdJVEhJTl9GVU5DVElPTiAob2JqZmlsZSkpCisJYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZsb2NhbF9zeW1ib2xzKTsKKyAgICAgIGVsc2UKKwlhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmZpbGVfc3ltYm9scyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRE5UVF9UWVBFX1RZUEVERUY6CisgICAgICAvKiBBIHR5cGVkZWYuIFdlIGRvIHdhbnQgdG8gcHJvY2VzcyB0aGVzZSwgc2luY2UgYSBuYW1lIGlzCisgICAgICAgKiBhZGRlZCB0byB0aGUgbmFtZXNwYWNlIGZvciB0aGUgdHlwZWRlZidlZCBuYW1lLgorICAgICAgICovCisgICAgICBTWU1CT0xfTkFNRVNQQUNFIChzeW0pID0gVkFSX05BTUVTUEFDRTsKKyAgICAgIFNZTUJPTF9UWVBFIChzeW0pID0gaHByZWFkX3R5cGVfbG9va3VwIChkbl9idWZwLT5kdHlwZS50eXBlLCBvYmpmaWxlKTsKKyAgICAgIGlmIChkbl9idWZwLT5kdHlwZS5nbG9iYWwpCisJYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZnbG9iYWxfc3ltYm9scyk7CisgICAgICBlbHNlIGlmIChXSVRISU5fRlVOQ1RJT04gKG9iamZpbGUpKQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmbG9jYWxfc3ltYm9scyk7CisgICAgICBlbHNlCisJYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZmaWxlX3N5bWJvbHMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9UQUdERUY6CisgICAgICB7CisgICAgICBpbnQgZ2xvYmFsID0gZG5fYnVmcC0+ZHRhZy5nbG9iYWw7CisgICAgICAvKiBTdHJ1Y3R1cmUsIHVuaW9uLCBlbnVtLCB0ZW1wbGF0ZSwgb3IgY2xhc3MgdGFnIGRlZmluaXRpb24gKi8KKyAgICAgIC8qIFdlIGRvIHdhbnQgdG8gcHJvY2VzcyB0aGVzZSwgc2luY2UgYSBuYW1lIGlzCisgICAgICAgKiBhZGRlZCB0byB0aGUgbmFtZXNwYWNlIGZvciB0aGUgdGFnIG5hbWUgKGFuZCBpZiBDKysgY2xhc3MsCisgICAgICAgKiBmb3IgdGhlIHR5cGVuYW1lIGFsc28pLgorICAgICAgICovCisgICAgICBTWU1CT0xfTkFNRVNQQUNFIChzeW0pID0gU1RSVUNUX05BTUVTUEFDRTsKKworICAgICAgLyogVGhlIHRhZyBjb250YWlucyBpbiBpdHMgInR5cGUiIGZpZWxkIGEgcG9pbnRlciB0byB0aGUKKyAgICAgICAqIEROVFRfVFlQRV9TVFJVQ1QsIEROVFRfVFlQRV9VTklPTiwgRE5UVF9UWVBFX0VOVU0sIAorICAgICAgICogRE5UVF9UWVBFX0NMQVNTIG9yIEROVFRfVFlQRV9URU1QTEFURQorICAgICAgICogcmVjb3JkIHRoYXQgYWN0dWFsbHkgZGVmaW5lcyB0aGUgdHlwZS4KKyAgICAgICAqLworICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSBocHJlYWRfdHlwZV9sb29rdXAgKGRuX2J1ZnAtPmR0eXBlLnR5cGUsIG9iamZpbGUpOworICAgICAgVFlQRV9OQU1FIChzeW0tPnR5cGUpID0gU1lNQk9MX05BTUUgKHN5bSk7CisgICAgICBUWVBFX1RBR19OQU1FIChzeW0tPnR5cGUpID0gU1lNQk9MX05BTUUgKHN5bSk7CisgICAgICBpZiAoZG5fYnVmcC0+ZHRhZy5nbG9iYWwpCisJYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZnbG9iYWxfc3ltYm9scyk7CisgICAgICBlbHNlIGlmIChXSVRISU5fRlVOQ1RJT04gKG9iamZpbGUpKQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmbG9jYWxfc3ltYm9scyk7CisgICAgICBlbHNlCisJYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZmaWxlX3N5bWJvbHMpOworCisgICAgICAvKiBJZiB0aGlzIGlzIGEgQysrIGNsYXNzLCB0aGVuIHdlIGFkZGl0aW9uYWxseSAKKyAgICAgICAqIG5lZWQgdG8gZGVmaW5lIGEgdHlwZWRlZiBmb3IgdGhlCisgICAgICAgKiBjbGFzcyB0eXBlLiBFLmcuLCBzbyB0aGF0IHRoZSBuYW1lICJjIiBiZWNvbWVzIHZpc2libGUgYXMKKyAgICAgICAqIGEgdHlwZSBuYW1lIHdoZW4gdGhlIHVzZXIgc2F5cyAiY2xhc3MgYyB7IC4uLiB9Ii4KKyAgICAgICAqIEluIG9yZGVyIHRvIGZpZ3VyZSB0aGlzIG91dCwgd2UgbmVlZCB0byBjaGFzZSBkb3duIHRoZSAidHlwZSIKKyAgICAgICAqIGZpZWxkIHRvIGdldCB0byB0aGUgRE5UVF9UWVBFX0NMQVNTIHJlY29yZC4gCisgICAgICAgKgorICAgICAgICogV2UgYWxzbyBhZGQgdGhlIHR5cGVuYW1lIGZvciBFTlVNLiBUaG91Z2ggdGhpcyBpc24ndAorICAgICAgICogc3RyaWN0bHkgY29ycmVjdCwgaXQgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgdGhlIGRlYnVnIGluZm8KKyAgICAgICAqIGdlbmVyYXRlZCBieSB0aGUgYUNDIGNvbXBpbGVyLCBpbiB3aGljaCB3ZSBjYW5ub3QKKyAgICAgICAqIGRpc3Rpbmd1aXNoIGJldHdlZW46CisgICAgICAgKiAgIGVudW0gZSB7IC4uLiB9OworICAgICAgICogYW5kCisgICAgICAgKiAgIHR5cGVkZWYgZW51bSB7IC4uLiB9IGU7CisgICAgICAgKiBJLmUuLCB0aGUgY29tcGlsZXIgZW1pdHMgdGhlIHNhbWUgZGVidWcgaW5mbyBmb3IgdGhlIGFib3ZlCisgICAgICAgKiB0d28gY2FzZXMsIGluIGJvdGggY2FzZXMgImUiIGFwcGVhcmluZyBhcyBhIHRhZ2RlZi4KKyAgICAgICAqIFRoZXJlZm9yZSBnbyBhaGVhZCBhbmQgZ2VuZXJhdGUgdGhlIHR5cGVuYW1lIHNvIHRoYXQKKyAgICAgICAqICJwdHlwZSBlIiB3aWxsIHdvcmsgaW4gdGhlIGFib3ZlIGNhc2VzLgorICAgICAgICoKKyAgICAgICAqIFdlIGFsc28gYWRkIHRoZSB0eXBlbmFtZSBmb3IgVEVNUExBVEUsIHNvIGFzIHRvIGFsbG93ICJwdHlwZSB0IgorICAgICAgICogd2hlbiAidCIgaXMgYSB0ZW1wbGF0ZSBuYW1lLiAKKyAgICAgICAqLworICAgICAgaWYgKGRuX2J1ZnAtPmR0eXBlLnR5cGUuZG50dHAuaW5kZXggPCBMTlRUX1NZTUNPVU5UIChvYmpmaWxlKSkKKyAgICAgICAgZG5fYnVmcCA9IGhwcmVhZF9nZXRfbG50dCAoZG5fYnVmcC0+ZHRhZy50eXBlLmRudHRwLmluZGV4LCBvYmpmaWxlKTsKKyAgICAgIGVsc2UgeworICAgICAgICBjb21wbGFpbiAoJmhwcmVhZF90YWdkZWZfY29tcGxhaW50KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKGRuX2J1ZnAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9DTEFTUyB8fAorICAgICAgICAgIGRuX2J1ZnAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9FTlVNIHx8CisgICAgICAgICAgZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX1RFTVBMQVRFKSB7CisgICAgICAgIHN0cnVjdCBzeW1ib2wgKm5ld3N5bTsKKyAgICAgICAgCisgICAgICAgIG5ld3N5bSA9IChzdHJ1Y3Qgc3ltYm9sICopIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywKKwkgICAgICAgICAgICAgCQkJCSAgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisgICAgICAgIG1lbXNldCAobmV3c3ltLCAwLCBzaXplb2YgKHN0cnVjdCBzeW1ib2wpKTsKKyAgICAgICAgU1lNQk9MX05BTUUgKG5ld3N5bSkgPSBuYW1lOworICAgICAgICBTWU1CT0xfTEFOR1VBR0UgKG5ld3N5bSkgPSBsYW5ndWFnZV9hdXRvOworICAgICAgICBTWU1CT0xfTkFNRVNQQUNFIChuZXdzeW0pID0gVkFSX05BTUVTUEFDRTsKKyAgICAgICAgU1lNQk9MX0xJTkUgKG5ld3N5bSkgPSAwOworICAgICAgICBTWU1CT0xfVkFMVUUgKG5ld3N5bSkgPSAwOworICAgICAgICBTWU1CT0xfQ0xBU1MgKG5ld3N5bSkgPSBMT0NfVFlQRURFRjsKKyAgICAgICAgU1lNQk9MX1RZUEUgKG5ld3N5bSkgPSBzeW0tPnR5cGU7CisgICAgICAgIGlmIChnbG9iYWwpCisgIAkgIGFkZF9zeW1ib2xfdG9fbGlzdCAobmV3c3ltLCAmZ2xvYmFsX3N5bWJvbHMpOworICAgICAgICBlbHNlIGlmIChXSVRISU5fRlVOQ1RJT04gKG9iamZpbGUpKQorICAJICBhZGRfc3ltYm9sX3RvX2xpc3QgKG5ld3N5bSwgJmxvY2FsX3N5bWJvbHMpOworICAgICAgICBlbHNlCisgIAkgIGFkZF9zeW1ib2xfdG9fbGlzdCAobmV3c3ltLCAmZmlsZV9zeW1ib2xzKTsKKyAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBETlRUX1RZUEVfUE9JTlRFUjoKKyAgICAgIC8qIERlY2xhcmVzIGEgcG9pbnRlciB0eXBlLiBTaG91bGQgbm90IGJlIG5lY2Vzc2FyeSB0byBkbyBhbnl0aGluZworICAgICAgICogd2l0aCB0aGUgdHlwZSBhdCB0aGlzIGxldmVsOyB0aGVzZSBhcmUgcHJvY2Vzc2VkCisgICAgICAgKiBhdCB0aGUgaHByZWFkX3R5cGVfbG9va3VwKCkgbGV2ZWwuIAorICAgICAgICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgRE5UVF9UWVBFX0VOVU06CisgICAgICAvKiBEZWNsYXJlcyBhbiBlbnVtIHR5cGUuIFNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIGRvIGFueXRoaW5nCisgICAgICAgKiB3aXRoIHRoZSB0eXBlIGF0IHRoaXMgbGV2ZWw7IHRoZXNlIGFyZSBwcm9jZXNzZWQKKyAgICAgICAqIGF0IHRoZSBocHJlYWRfdHlwZV9sb29rdXAoKSBsZXZlbC4gCisgICAgICAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBETlRUX1RZUEVfTUVNRU5VTToKKyAgICAgIC8qIE1lbWJlciBvZiBlbnVtICovCisgICAgICAvKiBJZ25vcmVkIGF0IHRoaXMgbGV2ZWwsIGJ1dCBocHJlYWRfcmVhZF9lbnVtX3R5cGUoKSB3aWxsIHRha2UKKyAgICAgICAqIGNhcmUgb2Ygd2Fsa2luZyB0aGUgbGlzdCBvZiBlbnVtZXJhdGlvbiBtZW1iZXJzLgorICAgICAgICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgRE5UVF9UWVBFX1NFVDoKKyAgICAgIC8qIERlY2xhcmVzIGEgc2V0IHR5cGUuIFNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIGRvIGFueXRoaW5nCisgICAgICAgKiB3aXRoIHRoZSB0eXBlIGF0IHRoaXMgbGV2ZWw7IHRoZXNlIGFyZSBwcm9jZXNzZWQKKyAgICAgICAqIGF0IHRoZSBocHJlYWRfdHlwZV9sb29rdXAoKSBsZXZlbC4gCisgICAgICAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBETlRUX1RZUEVfU1VCUkFOR0U6CisgICAgICAvKiBEZWNsYXJlcyBhIHN1YnJhbmdlIHR5cGUuIFNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIGRvIGFueXRoaW5nCisgICAgICAgKiB3aXRoIHRoZSB0eXBlIGF0IHRoaXMgbGV2ZWw7IHRoZXNlIGFyZSBwcm9jZXNzZWQKKyAgICAgICAqIGF0IHRoZSBocHJlYWRfdHlwZV9sb29rdXAoKSBsZXZlbC4gCisgICAgICAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBETlRUX1RZUEVfQVJSQVk6CisgICAgICAvKiBEZWNsYXJlcyBhbiBhcnJheSB0eXBlLiBTaG91bGQgbm90IGJlIG5lY2Vzc2FyeSB0byBkbyBhbnl0aGluZworICAgICAgICogd2l0aCB0aGUgdHlwZSBhdCB0aGlzIGxldmVsOyB0aGVzZSBhcmUgcHJvY2Vzc2VkCisgICAgICAgKiBhdCB0aGUgaHByZWFkX3R5cGVfbG9va3VwKCkgbGV2ZWwuIAorICAgICAgICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgRE5UVF9UWVBFX1NUUlVDVDoKKyAgICBjYXNlIEROVFRfVFlQRV9VTklPTjoKKyAgICAgIC8qIERlY2xhcmVzIGFuIHN0cnVjdC91bmlvbiB0eXBlLiAKKyAgICAgICAqIFNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIGRvIGFueXRoaW5nCisgICAgICAgKiB3aXRoIHRoZSB0eXBlIGF0IHRoaXMgbGV2ZWw7IHRoZXNlIGFyZSBwcm9jZXNzZWQKKyAgICAgICAqIGF0IHRoZSBocHJlYWRfdHlwZV9sb29rdXAoKSBsZXZlbC4gCisgICAgICAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBETlRUX1RZUEVfRklFTEQ6CisgICAgICAvKiBTdHJ1Y3R1cmUvdW5pb24vY2xhc3MgZmllbGQgKi8KKyAgICAgIC8qIElnbm9yZWQgYXQgdGhpcyBsZXZlbCwgYnV0IGhwcmVhZF9yZWFkX3N0cnVjdF90eXBlKCkgd2lsbCB0YWtlCisgICAgICAgKiBjYXJlIG9mIHdhbGtpbmcgdGhlIGxpc3Qgb2Ygc3RydWN0dXJlL3VuaW9uL2NsYXNzIG1lbWJlcnMuCisgICAgICAgKi8KKyAgICAgIGJyZWFrOworCisgICAgLyogRE5UVF9UWVBFX1ZBUklBTlQgaXMgbm90IGhhbmRsZWQgYnkgR0RCICovCisKKyAgICAvKiBETlRUX1RZUEVfRklMRSBpcyBub3QgaGFuZGxlZCBieSBHREIgKi8KKworICAgIGNhc2UgRE5UVF9UWVBFX0ZVTkNUWVBFOgorICAgICAgLyogRnVuY3Rpb24gdHlwZSAqLworICAgICAgLyogSWdub3JlZCBhdCB0aGlzIGxldmVsLCBoYW5kbGVkIHdpdGhpbiBocHJlYWRfdHlwZV9sb29rdXAoKSAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9XSVRIOgorICAgICAgLyogVGhpcyBpcyBlbWl0dGVkIHdpdGhpbiBtZXRob2RzIHRvIGluZGljYXRlICJ3aXRoIDxjbGFzcz4iIAorICAgICAgICogc2NvcGluZyBydWxlcyAoaS5lLiwgaW5kaWNhdGUgdGhhdCB0aGUgY2xhc3MgZGF0YSBtZW1iZXJzCisgICAgICAgKiBhcmUgZGlyZWN0bHkgdmlzaWJsZSkuCisgICAgICAgKiBIb3dldmVyLCBzaW5jZSBHREIgYWxyZWFkeSBpbmZlcnMgdGhpcyBieSBsb29raW5nIGF0IHRoZQorICAgICAgICogInRoaXMiIGFyZ3VtZW50LCBpbnRlcnByZXRpbmcgdGhlIEROVFRfVFlQRV9XSVRIIAorICAgICAgICogc3ltYm9sIHJlY29yZCBpcyB1bm5lY2Vzc2FyeS4KKyAgICAgICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9DT01NT046CisgICAgICAvKiBGT1JUUkFOIGNvbW1vbi4gTm90IHlldCBoYW5kbGVkLiAqLworICAgICAgY29tcGxhaW4gKCZocHJlYWRfdW5oYW5kbGVkX2NvbW1vbl9jb21wbGFpbnQpOworICAgICAgYnJlYWs7CisKKyAgICAvKiBETlRUX1RZUEVfQ09CU1RSVUNUIGlzIG5vdCBoYW5kbGVkIGJ5IEdEQi4gICovCisgICAgLyogRE5UVF9UWVBFX1hSRUYgaXMgbm90IGhhbmRsZWQgYnkgR0RCLiAgKi8KKyAgICAvKiBETlRUX1RZUEVfU0EgaXMgbm90IGhhbmRsZWQgYnkgR0RCLiAgKi8KKyAgICAvKiBETlRUX1RZUEVfTUFDUk8gaXMgbm90IGhhbmRsZWQgYnkgR0RCICovCisKKyAgICBjYXNlIEROVFRfVFlQRV9CTE9DS0RBVEE6CisgICAgICAvKiBOb3Qgc3VyZSB3aGF0IHRoaXMgaXMgLSBwYXJ0IG9mIEZPUlRSQU4gc3VwcG9ydCBtYXliZT8gCisgICAgICAgKiBBbnl3YXksIG5vdCB5ZXQgaGFuZGxlZC4KKyAgICAgICAqLworICAgICAgY29tcGxhaW4gKCZocHJlYWRfdW5oYW5kbGVkX2Jsb2NrZGF0YV9jb21wbGFpbnQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9DTEFTU19TQ09QRToKKworCisKKyAgICAgIC8qIFRoZSBjb21waWxlciBicmFja2V0cyBtZW1iZXIgZnVuY3Rpb25zIHdpdGggYSBDTEFTU19TQ09QRS9FTkQKKyAgICAgICAqIHBhaXIgb2YgcmVjb3JkcywgcHJlc3VtYWJseSB0byBwdXQgdGhlbSBpbiBhIGRpZmZlcmVudCBzY29wZQorICAgICAgICogZnJvbSB0aGUgbW9kdWxlIHNjb3BlIHdoZXJlIHRoZXkgYXJlIG5vcm1hbGx5IGRlZmluZWQuCisgICAgICAgKiBFLmcuLCBpbiB0aGUgc2l0dWF0aW9uOgorICAgICAgICogICB2b2lkIGYoKSB7IC4uLiB9CisgICAgICAgKiAgIHZvaWQgYzo6ZigpIHsgLi4ufQorICAgICAgICogVGhlIG1lbWJlciBmdW5jdGlvbiAiYzo6ZiIgd2lsbCBiZSBicmFja2V0ZWQgYnkgYSBDTEFTU19TQ09QRS9FTkQuCisgICAgICAgKiBUaGlzIGNhdXNlcyAiYnJlYWsgZiIgYXQgdGhlIG1vZHVsZSBsZXZlbCB0byBwaWNrIHRoZQorICAgICAgICogdGhlIGZpbGUtbGV2ZWwgZnVuY3Rpb24gZigpLCBub3QgdGhlIG1lbWJlciBmdW5jdGlvbgorICAgICAgICogKHdoaWNoIG5lZWRzIHRvIGJlIHJlZmVyZW5jZWQgdmlhICJicmVhayBjOjpmIikuIAorICAgICAgICogCisgICAgICAgKiBIZXJlIHdlIHJlY29yZCB0aGUgY2xhc3MgbmFtZSB0byBnZW5lcmF0ZSB0aGUgZGVtYW5nbGVkIG5hbWVzIG9mCisgICAgICAgKiBtZW1iZXIgZnVuY3Rpb25zIGxhdGVyLgorICAgICAgICoKKyAgICAgICAqIEZJWE1FIE5vdCBiZWluZyB1c2VkIG5vdyBmb3IgYW55dGhpbmcgLS0gY3BsdXNfZGVtYW5nbGUgc2VlbXMKKyAgICAgICAqIGVub3VnaCBmb3IgZ2V0dGluZyB0aGUgY2xhc3MtcXVhbGlmaWVkIG5hbWVzIG9mIGZ1bmN0aW9ucy4gV2UKKyAgICAgICAqIG1heSBuZWVkIHRoaXMgZm9yIGhhbmRsaW5nIG5lc3RlZCBjbGFzc2VzIGFuZCB0eXBlcy4gICovCisKKyAgICAgIC8qIHBhaTogRklYTUUgTm90IGhhbmRsaW5nIG5lc3RlZCBjbGFzc2VzIGZvciBub3cgLS0gbmVlZCB0bworICAgICAgICogbWFpbnRhaW4gYSBzdGFjayAqLworCisgICAgICBkbl90ZW1wID0gaHByZWFkX2dldF9sbnR0IChkbl9idWZwLT5kY2xhc3Nfc2NvcGUudHlwZS5kbnR0cC5pbmRleCwgb2JqZmlsZSk7CisgICAgICBpZiAoZG5fdGVtcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX1RBR0RFRikKKyAgICAgICAgY2xhc3Nfc2NvcGVfbmFtZSA9IFZUIChvYmpmaWxlKSArIGRuX3RlbXAtPmR0YWcubmFtZTsKKyAgICAgIGVsc2UKKyAgICAgICAgY2xhc3Nfc2NvcGVfbmFtZSA9IE5VTEw7CisKKyNpZiAwCisKKyAgICAgIC8qIEJlZ2luIGEgbmV3IHNjb3BlLiAgKi8KKyAgICAgIFNMX0lOREVYIChvYmpmaWxlKSA9IGhwcmVhZF9yZWNvcmRfbGluZXMgKGN1cnJlbnRfc3ViZmlsZSwKKwkJCQkJCVNMX0lOREVYIChvYmpmaWxlKSwKKwkJCQkJCWRuX2J1ZnAtPmRjbGFzc19zY29wZS5hZGRyZXNzLAorCQkJCQkJb2JqZmlsZSwgb2Zmc2V0KTsKKyAgICAgIHZhbHUgPSBocHJlYWRfZ2V0X2xvY2F0aW9uIChkbl9idWZwLT5kY2xhc3Nfc2NvcGUuYWRkcmVzcywgb2JqZmlsZSk7CisgICAgICB2YWx1ICs9IG9mZnNldDsJCS8qIFJlbG9jYXRlIGZvciBkeW5hbWljIGxvYWRpbmcgKi8KKyAgICAgIGRlc2MgPSBocHJlYWRfZ2V0X3Njb3BlX3N0YXJ0IChkbl9idWZwLT5kY2xhc3Nfc2NvcGUuYWRkcmVzcywgb2JqZmlsZSk7CisgICAgICAvKiBXZSB1c2UgdGhlIHNjb3BlIHN0YXJ0IEROVFQgaW5kZXggYXMgdGhlIG5lc3RpbmcgZGVwdGggaWRlbnRpZmllciEgKi8KKyAgICAgIG5ldyA9IHB1c2hfY29udGV4dCAoZGVzYywgdmFsdSk7CisjZW5kaWYKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBETlRUX1RZUEVfUkVGRVJFTkNFOgorICAgICAgLyogRGVjbGFyZXMgYSBDKysgcmVmZXJlbmNlIHR5cGUuIFNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIGRvIGFueXRoaW5nCisgICAgICAgKiB3aXRoIHRoZSB0eXBlIGF0IHRoaXMgbGV2ZWw7IHRoZXNlIGFyZSBwcm9jZXNzZWQKKyAgICAgICAqIGF0IHRoZSBocHJlYWRfdHlwZV9sb29rdXAoKSBsZXZlbC4KKyAgICAgICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9QVFJNRU06CisgICAgICAvKiBEZWNsYXJlcyBhIEMrKyBwb2ludGVyLXRvLWRhdGEtbWVtYmVyIHR5cGUuIFRoaXMgZG9lcyBub3QKKyAgICAgICAqIG5lZWQgdG8gYmUgaGFuZGxlZCBhdCB0aGlzIGxldmVsOyBiZWluZyBhIHR5cGUgZGVzY3JpcHRpb24gaXQKKyAgICAgICAqIGlzIGluc3RlYWQgaGFuZGxlZCBhdCB0aGUgaHByZWFkX3R5cGVfbG9va3VwKCkgbGV2ZWwuCisgICAgICAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBETlRUX1RZUEVfUFRSTUVNRlVOQzoKKyAgICAgIC8qIERlY2xhcmVzIGEgQysrIHBvaW50ZXItdG8tZnVuY3Rpb24tbWVtYmVyIHR5cGUuIFRoaXMgZG9lcyBub3QKKyAgICAgICAqIG5lZWQgdG8gYmUgaGFuZGxlZCBhdCB0aGlzIGxldmVsOyBiZWluZyBhIHR5cGUgZGVzY3JpcHRpb24gaXQKKyAgICAgICAqIGlzIGluc3RlYWQgaGFuZGxlZCBhdCB0aGUgaHByZWFkX3R5cGVfbG9va3VwKCkgbGV2ZWwuCisgICAgICAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBETlRUX1RZUEVfQ0xBU1M6CisgICAgICAvKiBEZWNsYXJlcyBhIGNsYXNzIHR5cGUuIAorICAgICAgICogU2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgdG8gZG8gYW55dGhpbmcKKyAgICAgICAqIHdpdGggdGhlIHR5cGUgYXQgdGhpcyBsZXZlbDsgdGhlc2UgYXJlIHByb2Nlc3NlZAorICAgICAgICogYXQgdGhlIGhwcmVhZF90eXBlX2xvb2t1cCgpIGxldmVsLiAKKyAgICAgICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9HRU5GSUVMRDoKKyAgICAgIC8qIEkgYmVsaWV2ZSB0aGlzIGlzIHVzZWQgZm9yIGNsYXNzIG1lbWJlciBmdW5jdGlvbnMgKi8KKyAgICAgIC8qIElnbm9yZWQgYXQgdGhpcyBsZXZlbCwgYnV0IGhwcmVhZF9yZWFkX3N0cnVjdF90eXBlKCkgd2lsbCB0YWtlCisgICAgICAgKiBjYXJlIG9mIHdhbGtpbmcgdGhlIGxpc3Qgb2YgY2xhc3MgbWVtYmVycy4KKyAgICAgICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9WRlVOQzoKKyAgICAgIC8qIFZpcnR1YWwgZnVuY3Rpb24gKi8KKyAgICAgIC8qIFRoaXMgZG9lcyBub3QgaGF2ZSB0byBiZSBoYW5kbGVkIGF0IHRoaXMgbGV2ZWw7IGhhbmRsZWQgaW4KKyAgICAgICAqIHRoZSBjb3Vyc2Ugb2YgcHJvY2Vzc2luZyBjbGFzcyBzeW1ib2xzLgorICAgICAgICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgRE5UVF9UWVBFX01FTUFDQ0VTUzoKKyAgICAgIC8qIERERSBpZ25vcmVzIHRoaXMgc3ltYm9sIHRhYmxlIHJlY29yZC4KKyAgICAgICAqIEl0IGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aCAibW9kaWZpZWQgYWNjZXNzIiB0byBjbGFzcyBtZW1iZXJzLgorICAgICAgICogSSdsbCBhc3N1bWUgd2UgY2FuIHNhZmVseSBpZ25vcmUgaXQgdG9vLgorICAgICAgICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgRE5UVF9UWVBFX0lOSEVSSVRBTkNFOgorICAgICAgLyogVGhlc2UgZG9uJ3QgaGF2ZSB0byBiZSBoYW5kbGVkIGhlcmUsIHNpbmNlIHRoZXkgYXJlIGhhbmRsZWQKKyAgICAgICAqIHdpdGhpbiBocHJlYWRfcmVhZF9zdHJ1Y3RfdHlwZSgpIGluIHRoZSBwcm9jZXNzIG9mIGNvbnN0cnVjdGluZworICAgICAgICogYSBjbGFzcyB0eXBlLgorICAgICAgICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgRE5UVF9UWVBFX0ZSSUVORF9DTEFTUzoKKyAgICBjYXNlIEROVFRfVFlQRV9GUklFTkRfRlVOQzoKKyAgICAgIC8qIFRoZXNlIGNhbiBzYWZlbHkgYmUgaWdub3JlZCwgYXMgR0RCIGRvZXNuJ3QgbmVlZCB0aGlzCisgICAgICAgKiBpbmZvLiBEREUgb25seSB1c2VzIGl0IGluICJkZXNjcmliZSIuIFdlIG1heSBsYXRlciB3YW50CisgICAgICAgKiB0byBleHRlbmQgR0RCJ3MgInB0eXBlIiB0byBnaXZlIHRoaXMgaW5mbywgYnV0IGZvciBub3cKKyAgICAgICAqIGl0IHNlZW1zIHNhZmUgZW5vdWdoIHRvIGlnbm9yZSBpdC4KKyAgICAgICAqLyAgCisgICAgICBicmVhazsKKworICAgIGNhc2UgRE5UVF9UWVBFX01PRElGSUVSOgorICAgICAgLyogSW50ZW5kZWQgdG8gc3VwcGx5ICJtb2RpZmllZCBhY2Nlc3MiIHRvIGEgdHlwZSAqLworICAgICAgLyogRnJvbSB0aGUgd2F5IERERSBoYW5kbGVzIHRoaXMsIGl0IGxvb2tzIGxpa2UgaXQgYWx3YXlzCisgICAgICAgKiBtb2RpZmllcyBhIHR5cGUuIFRoZXJlZm9yZSBpdCBpcyBzYWZlIHRvIGlnbm9yZSBpdCBhdCB0aGlzCisgICAgICAgKiBsZXZlbCwgYW5kIGhhbmRsZSBpdCBpbiBocHJlYWRfdHlwZV9sb29rdXAoKS4KKyAgICAgICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9PQkpFQ1RfSUQ6CisgICAgICAvKiBKdXN0IGlnbm9yZSB0aGlzIC0gdGhhdCdzIGFsbCBEREUgZG9lcyAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9NRU1GVU5DOgorICAgICAgLyogTWVtYmVyIGZ1bmN0aW9uICovCisgICAgICAvKiBUaGlzIGRvZXMgbm90IGhhdmUgdG8gYmUgaGFuZGxlZCBhdCB0aGlzIGxldmVsOyBoYW5kbGVkIGluCisgICAgICAgKiB0aGUgY291cnNlIG9mIHByb2Nlc3NpbmcgY2xhc3Mgc3ltYm9scy4KKyAgICAgICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9ET0NfTUVNRlVOQzoKKyAgICAgIC8qIE1lbWJlciBmdW5jdGlvbiAqLworICAgICAgLyogVGhpcyBkb2VzIG5vdCBoYXZlIHRvIGJlIGhhbmRsZWQgYXQgdGhpcyBsZXZlbDsgaGFuZGxlZCBpbgorICAgICAgICogdGhlIGNvdXJzZSBvZiBwcm9jZXNzaW5nIGNsYXNzIHN5bWJvbHMuCisgICAgICAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBETlRUX1RZUEVfVEVNUExBVEU6CisgICAgICAvKiBUZW1wbGF0ZSAtIHNvcnQgb2YgdGhlIGhlYWRlciBmb3IgYSB0ZW1wbGF0ZSBkZWZpbml0aW9uLAorICAgICAgICogd2hpY2ggbGlrZSBhIGNsYXNzLCBwb2ludHMgdG8gYSBtZW1iZXIgbGlzdCBhbmQgYWxzbyBwb2ludHMKKyAgICAgICAqIHRvIGEgVEVNUExBVEVfQVJHIGxpc3Qgb2YgdHlwZS1hcmd1bWVudHMuCisgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBwcm9jZXNzIFRFTVBMQVRFIHJlY29yZHMgYXQgdGhpcyBsZXZlbCB0aG91Z2guCisgICAgICAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBETlRUX1RZUEVfVEVNUExBVEVfQVJHOgorICAgICAgLyogVGhlIFRFTVBMQVRFIHJlY29yZCBwb2ludHMgdG8gYW4gYXJndW1lbnQgbGlzdCBvZgorICAgICAgICogVEVNUExBVEVfQVJHIHJlY29yZHMsIGVhY2ggb2Ygd2hpY2ggZGVzY3JpYmVzIG9uZQorICAgICAgICogb2YgdGhlIHR5cGUtYXJndW1lbnRzLgorICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gcHJvY2VzcyBURU1QTEFURV9BUkcgcmVjb3JkcyBhdCB0aGlzIGxldmVsIHRob3VnaC4KKyAgICAgICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9GVU5DX1RFTVBMQVRFOgorICAgICAgLyogVGhpcyB3aWxsIGdldCBlbWl0dGVkIGZvciBtZW1iZXIgZnVuY3Rpb25zIG9mIHRlbXBsYXRlcy4KKyAgICAgICAqIEJ1dCB3ZSBkb24ndCBuZWVkIHRvIHByb2Nlc3MgdGhpcyByZWNvcmQgYXQgdGhpcyBsZXZlbCB0aG91Z2gsCisgICAgICAgKiB3ZSB3aWxsIHByb2Nlc3MgaXQgaW4gdGhlIGNvdXJzZSBvZiBwcm9jZXNzaW5nIGEgVEVNUExBVEUKKyAgICAgICAqIHJlY29yZC4KKyAgICAgICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEROVFRfVFlQRV9MSU5LOgorICAgICAgLyogVGhlIExJTksgcmVjb3JkIGlzIHVzZWQgdG8gbGluayB1cCB0ZW1wbGF0ZXMgd2l0aCBpbnN0YW50aWF0aW9ucy4gKi8KKyAgICAgIC8qIEl0IGlzIG5vdCBjbGVhciB3aHkgdGhpcyBpcyBuZWVkZWQsIGFuZCBmdXJ0aGVybW9yZSBhQ0MgZG9lcworICAgICAgICogbm90IGFwcGVhciB0byBnZW5lcmF0ZSB0aGlzLCBzbyBJIHRoaW5rIHdlIGNhbiBzYWZlbHkgaWdub3JlIGl0LiAtIFJUCisgICAgICAgKi8KKyAgICAgIGJyZWFrOworCisgICAgLyogRE5UVF9UWVBFX0RZTl9BUlJBWV9ERVNDIGlzIG5vdCBoYW5kbGVkIGJ5IEdEQiAqLworICAgIC8qIEROVFRfVFlQRV9ERVNDX1NVQlJBTkdFIGlzIG5vdCBoYW5kbGVkIGJ5IEdEQiAqLworICAgIC8qIEROVFRfVFlQRV9CRUdJTl9FWFQgaXMgbm90IGhhbmRsZWQgYnkgR0RCICovCisgICAgLyogRE5UVF9UWVBFX0lOTE4gaXMgbm90IGhhbmRsZWQgYnkgR0RCICovCisgICAgLyogRE5UVF9UWVBFX0lOTE5fTElTVCBpcyBub3QgaGFuZGxlZCBieSBHREIgKi8KKyAgICAvKiBETlRUX1RZUEVfQUxJQVMgaXMgbm90IGhhbmRsZWQgYnkgR0RCICovCisKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBHZXQgbmVzdGluZyBkZXB0aCBmb3IgYSBETlRUIGVudHJ5LgorICogRE5fQlVGUCBwb2ludHMgdG8gYSBETlRUIGVudHJ5LgorICogT0JKRklMRSBpcyB0aGUgb2JqZWN0IGZpbGUuCisgKiBSRVBPUlRfTkVTVEVEIGlzIGEgZmxhZzsgaWYgMCwgcmVhbCBuZXN0aW5nIGRlcHRoIGlzCisgKiByZXBvcnRlZCwgaWYgaXQgaXMgMSwgdGhlIGZ1bmN0aW9uIHNpbXBseSByZXR1cm5zIGEgCisgKiBub24temVybyB2YWx1ZSBpZiB0aGUgbmVzdGluZyBkZXB0aCBpcyBhbnl0aGluZyA+IDAuCisgKiAKKyAqIFJldHVybiB2YWx1ZSBpcyBhbiBpbnRlZ2VyLiAgMCA9PiBub3QgYSBsb2NhbCB0eXBlIC8gbmFtZQorICogcG9zaXRpdmUgcmV0dXJuID0+IHR5cGUgb3IgbmFtZSBpcyBsb2NhbCB0byBzb21lIAorICogYmxvY2sgb3IgZnVuY3Rpb24uCisgKi8gCisKKworLyogZWx6OiBBVFRFTlRJT046IEZJWE1FOiBOT1RFOiBXQVJOSU5HISEhIQorICAgdGhpcyBmdW5jdGlvbiBub3cgcmV0dXJucyAwIHJpZ2h0IGF3YXkuIEl0IHdhcyB0YWtpbmcgdG9vIG11Y2ggdGltZQorICAgYXQgc3RhcnQgdXAuIE5vdywgdGhvdWdoLCB0aGUgbG9jYWwgdHlwZXMgYXJlIG5vdCBoYW5kbGVkIGNvcnJlY3RseS4KKyovCisKKworc3RhdGljIGludAoraHByZWFkX2dldF9zY29wZV9kZXB0aCAoZG5fYnVmcCwgb2JqZmlsZSwgcmVwb3J0X25lc3RlZCkKKyAgdW5pb24gZG50dGVudHJ5ICogZG5fYnVmcDsKKyAgc3RydWN0IG9iamZpbGUgKiBvYmpmaWxlOworICBpbnQgIHJlcG9ydF9uZXN0ZWQ7Cit7CisgIHJlZ2lzdGVyIGludCBpbmRleDsKKyAgcmVnaXN0ZXIgdW5pb24gZG50dGVudHJ5ICogZG5fdG1wOworICByZWdpc3RlciBzaG9ydCBkZXB0aCA9IDA7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgcmV0dXJuIDA7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBpbmRleCA9ICgoKGNoYXIgKikgZG5fYnVmcCkgLSBMTlRUIChvYmpmaWxlKSkgLyAoc2l6ZW9mIChzdHJ1Y3QgZG50dF90eXBlX2Jsb2NrKSk7CisgIAorICB3aGlsZSAoLS1pbmRleCA+PSAwKQorICAgIHsKKyAgICAgIGRuX3RtcCA9IGhwcmVhZF9nZXRfbG50dCAoaW5kZXgsIG9iamZpbGUpOworICAgICAgc3dpdGNoIChkbl90bXAtPmRibG9jay5raW5kKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBETlRUX1RZUEVfTU9EVUxFOgorICAgICAgICAgICAgcmV0dXJuIGRlcHRoOworICAgICAgICAgIGNhc2UgRE5UVF9UWVBFX0VORDoKKyAgICAgICAgICAgIC8qIGluZGV4IGlzIHNpZ25lZCBpbnQ7IGRudHRwLmluZGV4IGlzIDI5LWJpdCB1bnNpZ25lZCBpbnQhICovCisgICAgICAgICAgICBpbmRleCA9IChpbnQpIGRuX3RtcC0+ZGVuZC5iZWdpbnNjb3BlLmRudHRwLmluZGV4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBETlRUX1RZUEVfQkVHSU46CisgICAgICAgICAgY2FzZSBETlRUX1RZUEVfRlVOQ1RJT046CisgICAgICAgICAgY2FzZSBETlRUX1RZUEVfRE9DX0ZVTkNUSU9OOgorICAgICAgICAgIGNhc2UgRE5UVF9UWVBFX1dJVEg6ICAgCisgICAgICAgICAgY2FzZSBETlRUX1RZUEVfQ09NTU9OOiAKKyAgICAgICAgICBjYXNlIEROVFRfVFlQRV9DTEFTU19TQ09QRToKKyAgICAgICAgICAgIGRlcHRoKys7CisgICAgICAgICAgICBpZiAocmVwb3J0X25lc3RlZCkKKyAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgIHJldHVybiBkZXB0aDsKK30KKworLyogQWRqdXN0IHRoZSBiaXRvZmZzZXRzIGZvciBhbGwgZmllbGRzIG9mIGFuIGFub255bW91cyB1bmlvbiBvZgorICAgdHlwZSBUWVBFIGJ5IG5lZ2F0aXZlIEJJVFMuICBUaGlzIGhhbmRsZXMgSFAgYUNDJ3MgaGlkZW91cyBoYWJpdAorICAgb2YgZ2l2aW5nIG1lbWJlcnMgb2YgYW5vbnltb3VzIHVuaW9ucyBiaXQgb2Zmc2V0cyByZWxhdGl2ZSB0byB0aGUKKyAgIGVuY2xvc2luZyBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiByZWxhdGl2ZSB0byB0aGUgdW5pb24gaXRzZWxmLiAqLyAgCisKK3N0YXRpYyB2b2lkCitocHJlYWRfYWRqdXN0X2JpdG9mZnNldHMgKHR5cGUsIGJpdHMpCisgIHN0cnVjdCB0eXBlICogdHlwZTsKKyAgaW50IGJpdHM7Cit7CisgIHJlZ2lzdGVyIGludCBpOworCisgIC8qIFRoaXMgaXMgZG9uZSBvbmx5IGZvciB1bmlvbnM7IGNhbGxlciBoYWQgYmV0dGVyIGNoZWNrIHRoYXQKKyAgICAgaXQgaXMgYW4gYW5vbnltb3VzIG9uZS4gKi8gCisgIGlmIChUWVBFX0NPREUgKHR5cGUpICE9IFRZUEVfQ09ERV9VTklPTikKKyAgICByZXR1cm47CisKKyAgLyogQWRqdXN0IGVhY2ggZmllbGQ7IHNpbmNlIHRoaXMgaXMgYSB1bmlvbiwgdGhlcmUgYXJlIG5vIGJhc2UKKyAgICAgY2xhc3Nlcy4gQWxzbyBubyBzdGF0aWMgbWVtYmVzLiAgQWxzbywgbm8gbmVlZCBmb3IgcmVjdXJzaW9uIGFzCisgICAgIHRoZSBtZW1iZXJzIG9mIHRoaXMgdW5pb24gaWYgdGhlbWVzZWx2ZXMgc3RydWN0cyBvciB1bmlvbnMsIGhhdmUKKyAgICAgdGhlIGNvcnJlY3QgYml0b2Zmc2V0czsgaWYgYW4gYW5vbnltb3VzIHVuaW9uIGlzIGEgbWVtYmVyIG9mIHRoaXMKKyAgICAgYW5vbnltb3VzIHVuaW9uLCB0aGUgY29kZSBpbiBocHJlYWRfcmVhZF9zdHJ1Y3RfdHlwZSgpIHdpbGwKKyAgICAgYWRqdXN0IGZvciB0aGF0LiAqLworCisgIGZvciAoaSA9IDA7IGkgPCBUWVBFX05GSUVMRFMgKHR5cGUpOyBpKyspCisgICAgVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIGkpIC09IGJpdHM7Cit9CisKKy8qIEJlY2F1c2Ugb2YgcXVpcmtzIGluIEhQIGNvbXBpbGVycycgdHJlYXRtZW50IG9mIGFub255bW91cyB1bmlvbnMgaW5zaWRlCisgICBjbGFzc2VzLCB3ZSBoYXZlIHRvIGNoYXNlIHRocm91Z2ggYSBjaGFpbiBvZiB0aHJlYWRlZCBGSUVMRCBlbnRyaWVzLgorICAgSWYgd2UgZW5jb3VudGVyIGFuIGFub255bW91cyB1bmlvbiBpbiB0aGUgY2hhaW4sIHdlIG11c3QgcmVjdXJzaXZlbHkgc2tpcCBvdmVyCisgICB0aGF0IHRvby4KKworICAgVGhpcyBmdW5jdGlvbiBkb2VzIGEgIm5leHQiIGluIHRoZSBjaGFpbiBvZiBGSUVMRCBlbnRyaWVzLCBidXQgdHJhbnNwYXJlbnRseQorICAgc2tpcHMgb3ZlciBhbm9ueW1vdXMgdW5pb25zJyBmaWVsZHMgKHJlY3Vyc2l2ZWx5KS4KKyAgIAorICAgSW5wdXRzIGFyZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRvIGRvICJuZXh0IiBhdCB0aGUgdG9wIGxldmVsLCB0aGUgZG50dHBvaW50ZXIKKyAgIChGSUVMRCkgYW5kIGVudHJ5IHBvaW50ZXIgKEZJRUxEUCkgZm9yIHRoZSBkbnR0IHJlY29yZCBjb3JyZXNwb25kaW5nIHRvIGl0LAorICAgYW5kIHRoZSB1YmlxdWl0b3VzIG9iamZpbGUgcGFyYW1ldGVyLiAoTm90ZTogRklFTERQIGlzIGEgKiouKSAgUmV0dXJuIHZhbHVlCisgICBpcyBhIGRudHRwb2ludGVyIGZvciB0aGUgbmV3IGZpZWxkIGFmdGVyIGFsbCB0aGUgc2tpcHBlZCBvbmVzICovCisKK3N0YXRpYyBkbnR0cG9pbnRlcgoraHByZWFkX2dldF9uZXh0X3NraXBfb3Zlcl9hbm9uX3VuaW9ucyAoc2tpcF9maWVsZHMsIGZpZWxkLCBmaWVsZHAsIG9iamZpbGUpCisgIGludCBza2lwX2ZpZWxkczsKKyAgZG50dHBvaW50ZXIgZmllbGQ7CisgIHVuaW9uIGRudHRlbnRyeSAqKiBmaWVsZHA7CisgIHN0cnVjdCBvYmpmaWxlICogb2JqZmlsZTsKK3sKKyAgc3RydWN0IHR5cGUgKiBhbm9uX3R5cGU7CisgIHJlZ2lzdGVyIGludCBpOworICBpbnQgYml0b2Zmc2V0OworICBjaGFyICogbmFtZTsKKworICBmb3IgKGk9MDsgaSA8IHNraXBfZmllbGRzOyBpKyspCisgICAgeworICAgICAgLyogR2V0IHR5cGUgb2YgaXRlbSB3ZSdyZSBsb29raW5nIGF0IG5vdzsgcmVjdXJzaXZlbHkgcHJvY2Vzc2VzIHRoZSB0eXBlcworICAgICAgICAgb2YgdGhlc2UgaW50ZXJtZWRpYXRlIGl0ZW1zIHdlIHNraXAgb3Zlciwgc28gdGhleSBhcmVuJ3QgbG9zdC4gKi8KKyAgICAgIGFub25fdHlwZSA9IGhwcmVhZF90eXBlX2xvb2t1cCAoKCpmaWVsZHApLT5kZmllbGQudHlwZSwgb2JqZmlsZSk7CisgICAgICBhbm9uX3R5cGUgPSBDSEVDS19UWVBFREVGIChhbm9uX3R5cGUpOworICAgICAgYml0b2Zmc2V0ID0gKCpmaWVsZHApLT5kZmllbGQuYml0b2Zmc2V0OworICAgICAgbmFtZSA9IFZUIChvYmpmaWxlKSArICgqZmllbGRwKS0+ZGZpZWxkLm5hbWU7CisgICAgICAvKiBGaXJzdCBza2lwIG92ZXIgb25lIGl0ZW0gdG8gYXZvaWQgc3RhY2sgZGVhdGggb24gcmVjdXJzaW9uICovIAorICAgICAgZmllbGQgPSAoKmZpZWxkcCktPmRmaWVsZC5uZXh0ZmllbGQ7CisgICAgICAqZmllbGRwID0gaHByZWFkX2dldF9sbnR0IChmaWVsZC5kbnR0cC5pbmRleCwgb2JqZmlsZSk7CisgICAgICAvKiBEbyB3ZSBoYXZlIGFub3RoZXIgYW5vbnltb3VzIHVuaW9uPyBJZiBzbywgYWRqdXN0IHRoZSBiaXRvZmZzZXRzCisgICAgICAgICBvZiBpdHMgbWVtYmVycyBhbmQgc2tpcCBvdmVyIGl0cyBtZW1iZXJzLiAqLworICAgICAgaWYgKChUWVBFX0NPREUgKGFub25fdHlwZSkgPT0gVFlQRV9DT0RFX1VOSU9OKSAmJgorICAgICAgICAgICghbmFtZSB8fCBTVFJFUSAobmFtZSwgIiIpKSkKKyAgICAgICAgeworICAgICAgICAgIGhwcmVhZF9hZGp1c3RfYml0b2Zmc2V0cyAoYW5vbl90eXBlLCBiaXRvZmZzZXQpOworICAgICAgICAgIGZpZWxkID0gaHByZWFkX2dldF9uZXh0X3NraXBfb3Zlcl9hbm9uX3VuaW9ucyAoVFlQRV9ORklFTERTIChhbm9uX3R5cGUpLCBmaWVsZCwgZmllbGRwLCBvYmpmaWxlKTsKKyAgICAgICAgfQorICAgIH0KKyAgcmV0dXJuIGZpZWxkOworfQorCisKZGlmZiAtLWdpdCBhL2dkYi9ocDMwMHV4LW5hdC5jIGIvZ2RiL2hwMzAwdXgtbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmNjhlMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9ocDMwMHV4LW5hdC5jCkBAIC0wLDAgKzEsMjIxIEBACisvKiBIUC9VWCBuYXRpdmUgaW50ZXJmYWNlIGZvciBIUCAzMDAncywgZm9yIEdEQiB3aGVuIHJ1bm5pbmcgdW5kZXIgVW5peC4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorCisvKiBEZWZpbmluZyB0aGlzIG1lYW5zIHNvbWUgc3lzdGVtIGluY2x1ZGUgZmlsZXMgZGVmaW5lIHNvbWUgZXh0cmEgc3R1ZmYuICAqLworI2RlZmluZSBXT1BSCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3VzZXIuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorI2luY2x1ZGUgPHN5cy9yZWcuaD4KKyNpbmNsdWRlIDxzeXMvdHJhcC5oPgorCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKworc3RhdGljIHZvaWQKK2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVyIFBBUkFNUyAoKGludCwgdW5zaWduZWQgaW50KSk7CisKK3N0YXRpYyB2b2lkCitzdG9yZV9pbmZlcmlvcl9yZWdpc3Rlcl8xIFBBUkFNUyAoKGludCwgdW5zaWduZWQgaW50LCBpbnQpKTsKKworc3RhdGljIHZvaWQKK3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVyIFBBUkFNUyAoKGludCwgdW5zaWduZWQgaW50KSk7CisKKy8qIEdldCBrZXJuZWxfdV9hZGRyIHVzaW5nIEhQVVgtc3R5bGUgbmxpc3QoKS4gICovCitDT1JFX0FERFIga2VybmVsX3VfYWRkcjsKKworc3RydWN0IGhwbmxpc3QgeworICAgICAgICBjaGFyICogICAgICAgICAgbl9uYW1lOworICAgICAgICBsb25nICAgICAgICAgICAgbl92YWx1ZTsKKyAgICAgICAgdW5zaWduZWQgY2hhciAgIG5fdHlwZTsKKyAgICAgICAgdW5zaWduZWQgY2hhciAgIG5fbGVuZ3RoOworICAgICAgICBzaG9ydCAgICAgICAgICAgbl9hbG1vZDsKKyAgICAgICAgc2hvcnQgICAgICAgICAgIG5fdW51c2VkOworfTsKK3N0YXRpYyBzdHJ1Y3QgaHBubGlzdCBubFtdID0ge3sgIl91IiwgLTEsIH0sIHsgKGNoYXIgKikgMCwgfX07CisKKy8qIHJlYWQgdGhlIHZhbHVlIG9mIHRoZSB1IGFyZWEgZnJvbSB0aGUgaHAtdXgga2VybmVsICovCit2b2lkCitfaW5pdGlhbGl6ZV9ocDMwMHV4X25hdCAoKQoreworI2lmbmRlZiBIUFVYX1ZFUlNJT05fNQorICAgIG5saXN0ICgiL2hwLXV4IiwgbmwpOworICAgIGtlcm5lbF91X2FkZHIgPSBubFswXS5uX3ZhbHVlOworI2Vsc2UgLyogSFBVWCB2ZXJzaW9uIDUuICAqLworICAgIGtlcm5lbF91X2FkZHIgPSAoQ09SRV9BRERSKSAweDAwOTc5MDA7CisjZW5kaWYKK30KKworI2RlZmluZSBJTkZFUklPUl9BUjAodSkJCQkJCQkJXAorICAoKHB0cmFjZQkJCQkJCQkJXAorICAgIChQVF9SVUFSRUEsIGluZmVyaW9yX3BpZCwJCQkJCQlcCisgICAgIChQVFJBQ0VfQVJHM19UWVBFKSAoKGNoYXIgKikgJnUudV9hcjAgLSAoY2hhciAqKSAmdSksIDAsIDApKQkJXAorICAgLSBrZXJuZWxfdV9hZGRyKQorCitzdGF0aWMgdm9pZAorZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXIgKHJlZ25vLCByZWdhZGRyKQorICAgICByZWdpc3RlciBpbnQgcmVnbm87CisgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZWdhZGRyOworeworI2lmbmRlZiBIUFVYX1ZFUlNJT05fNQorICBpZiAocmVnbm8gPT0gUFNfUkVHTlVNKQorICAgIHsKKyAgICAgIHVuaW9uIHsgaW50IGk7IHNob3J0IHNbMl07IH0gcHNfdmFsOworICAgICAgaW50IHJlZ3ZhbDsKKyAgICAgIAorICAgICAgcHNfdmFsLmkgPSAocHRyYWNlIChQVF9SVUFSRUEsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIHJlZ2FkZHIsCisJCQkgIDAsIDApKTsKKyAgICAgIHJlZ3ZhbCA9IHBzX3ZhbC5zWzBdOworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgKGNoYXIgKikmcmVndmFsKTsKKyAgICB9CisgIGVsc2UKKyNlbmRpZiAvKiBub3QgSFBVWF9WRVJTSU9OXzUgKi8KKyAgICB7CisgICAgICBjaGFyIGJ1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICAKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pOyBpICs9IHNpemVvZiAoaW50KSkKKwl7CisJICAqKGludCAqKSAmYnVmW2ldID0gcHRyYWNlIChQVF9SVUFSRUEsIGluZmVyaW9yX3BpZCwKKwkJCQkgICAgIChQVFJBQ0VfQVJHM19UWVBFKSByZWdhZGRyLCAwLCAwKTsKKwkgIHJlZ2FkZHIgKz0gc2l6ZW9mIChpbnQpOworCX0KKyAgICAgIHN1cHBseV9yZWdpc3RlciAocmVnbm8sIGJ1Zik7CisgICAgfQorICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitzdG9yZV9pbmZlcmlvcl9yZWdpc3Rlcl8xIChyZWdubywgcmVnYWRkciwgdmFsKQorICAgICBpbnQgcmVnbm87CisgICAgIHVuc2lnbmVkIGludCByZWdhZGRyOworICAgICBpbnQgdmFsOworeworICBlcnJubyA9IDA7CisgIHB0cmFjZSAoUFRfV1VBUkVBLCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSByZWdhZGRyLCB2YWwsIDApOworI2lmIDAKKyAgLyogSFAtVVggcmFuZG9tbHkgc2V0cyBlcnJubyB0byBub24temVybyBmb3IgcmVnbm8gPT0gMjUuCisgICAgIEhvd2V2ZXIsIHRoZSB2YWx1ZSBpcyBjb3JyZWN0bHkgd3JpdHRlbiwgc28gaWdub3JlIGVycm5vLiAqLworICBpZiAoZXJybm8gIT0gMCkKKyAgICB7CisgICAgICBjaGFyIHN0cmluZ19idWZbNjRdOworICAgICAgCisgICAgICBzcHJpbnRmIChzdHJpbmdfYnVmLCAid3JpdGluZyByZWdpc3RlciBudW1iZXIgJWQiLCByZWdubyk7CisgICAgICBwZXJyb3Jfd2l0aF9uYW1lIChzdHJpbmdfYnVmKTsKKyAgICB9CisjZW5kaWYKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXIgKHJlZ25vLCByZWdhZGRyKQorICAgICByZWdpc3RlciBpbnQgcmVnbm87CisgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZWdhZGRyOworeworI2lmbmRlZiBIUFVYX1ZFUlNJT05fNQorICBpZiAocmVnbm8gPT0gUFNfUkVHTlVNKQorICAgIHsKKyAgICAgIHVuaW9uIHsgaW50IGk7IHNob3J0IHNbMl07IH0gcHNfdmFsOworICAgICAgCisgICAgICBwc192YWwuaSA9IChwdHJhY2UgKFBUX1JVQVJFQSwgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnYWRkciwKKwkJCSAgMCwgMCkpOworICAgICAgcHNfdmFsLnNbMF0gPSAocmVhZF9yZWdpc3RlciAocmVnbm8pKTsKKyAgICAgIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVyXzEgKHJlZ25vLCByZWdhZGRyLCBwc192YWwuaSk7CisgICAgfQorICBlbHNlCisjZW5kaWYgLyogbm90IEhQVVhfVkVSU0lPTl81ICovCisgICAgeworICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICBleHRlcm4gY2hhciByZWdpc3RlcnNbXTsKKyAgICAgIAorICAgICAgZm9yIChpID0gMDsgaSA8IFJFR0lTVEVSX1JBV19TSVpFIChyZWdubyk7IGkgKz0gc2l6ZW9mIChpbnQpKQorCXsKKwkgIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVyXzEKKwkgICAgKHJlZ25vLCByZWdhZGRyLAorCSAgICAgKCooaW50ICopICZyZWdpc3RlcnNbKFJFR0lTVEVSX0JZVEUgKHJlZ25vKSkgKyBpXSkpOworCSAgcmVnYWRkciArPSBzaXplb2YgKGludCk7CisJfQorICAgIH0KKyAgcmV0dXJuOworfQorCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHN0cnVjdCB1c2VyIHU7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBhcjBfb2Zmc2V0OworICAKKyAgYXIwX29mZnNldCA9IChJTkZFUklPUl9BUjAgKHUpKTsKKyAgaWYgKHJlZ25vID09IC0xKQorICAgIHsKKyAgICAgIGZvciAocmVnbm8gPSAwOyAocmVnbm8gPCBGUDBfUkVHTlVNKTsgcmVnbm8rKykKKwlmZXRjaF9pbmZlcmlvcl9yZWdpc3RlciAocmVnbm8sIChSRUdJU1RFUl9BRERSIChhcjBfb2Zmc2V0LCByZWdubykpKTsKKyAgICAgIGZvciAoOyAocmVnbm8gPCBOVU1fUkVHUyk7IHJlZ25vKyspCisJZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXIgKHJlZ25vLCAoRlBfUkVHSVNURVJfQUREUiAodSwgcmVnbm8pKSk7CisgICAgfQorICBlbHNlCisgICAgZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXIgKHJlZ25vLAorCQkJICAgICAocmVnbm8gPCBGUDBfUkVHTlVNCisJCQkgICAgICA/IFJFR0lTVEVSX0FERFIgKGFyMF9vZmZzZXQsIHJlZ25vKQorCQkJICAgICAgOiBGUF9SRUdJU1RFUl9BRERSICh1LCByZWdubykpKTsKK30KKworLyogU3RvcmUgb3VyIHJlZ2lzdGVyIHZhbHVlcyBiYWNrIGludG8gdGhlIGluZmVyaW9yLgorICAgSWYgUkVHTk8gaXMgLTEsIGRvIHRoaXMgZm9yIGFsbCByZWdpc3RlcnMuCisgICBPdGhlcndpc2UsIFJFR05PIHNwZWNpZmllcyB3aGljaCByZWdpc3RlciAoc28gd2UgY2FuIHNhdmUgdGltZSkuICAqLworCit2b2lkCitzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICByZWdpc3RlciBpbnQgcmVnbm87Cit7CisgIHN0cnVjdCB1c2VyIHU7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBhcjBfb2Zmc2V0OworCisgIGlmIChyZWdubyA+PSBGUDBfUkVHTlVNKQorICAgIHsKKyAgICAgIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVyIChyZWdubywgKEZQX1JFR0lTVEVSX0FERFIgKHUsIHJlZ25vKSkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgCisgIGFyMF9vZmZzZXQgPSAoSU5GRVJJT1JfQVIwICh1KSk7CisgIGlmIChyZWdubyA+PSAwKQorICAgIHsKKyAgICAgIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVyIChyZWdubywgKFJFR0lTVEVSX0FERFIgKGFyMF9vZmZzZXQsIHJlZ25vKSkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBmb3IgKHJlZ25vID0gMDsgKHJlZ25vIDwgRlAwX1JFR05VTSk7IHJlZ25vKyspCisgICAgc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXIgKHJlZ25vLCAoUkVHSVNURVJfQUREUiAoYXIwX29mZnNldCwgcmVnbm8pKSk7CisgIGZvciAoOyAocmVnbm8gPCBOVU1fUkVHUyk7IHJlZ25vKyspCisgICAgc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXIgKHJlZ25vLCAoRlBfUkVHSVNURVJfQUREUiAodSwgcmVnbm8pKSk7CisgIHJldHVybjsKK30KKworaW50CitnZXRwYWdlc2l6ZSAoKQoreworICByZXR1cm4gNDA5NjsKK30KZGlmZiAtLWdpdCBhL2dkYi9ocHBhLXRkZXAuYyBiL2dkYi9ocHBhLXRkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTExNzUwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2hwcGEtdGRlcC5jCkBAIC0wLDAgKzEsNDQ0NSBAQAorLyogVGFyZ2V0LWRlcGVuZGVudCBjb2RlIGZvciB0aGUgSFAgUEEgYXJjaGl0ZWN0dXJlLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5ODYsIDg3LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQorICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKworLyogRm9yIGFyZ3VtZW50IHBhc3NpbmcgdG8gdGhlIGluZmVyaW9yICovCisjaW5jbHVkZSAic3ltdGFiLmgiCisKKyNpZmRlZiBVU0cKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZGwuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3NhdmVfc3RhdGUuaD4KKworI2lmZGVmIENPRkZfRU5DQVBTVUxBVEUKKyNpbmNsdWRlICJhLm91dC5lbmNhcC5oIgorI2Vsc2UKKyNlbmRpZgorCisvKiNpbmNsdWRlIDxzeXMvdXNlci5oPgkJQWZ0ZXIgYS5vdXQuaCAgKi8KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgImdkYl9zdGF0LmgiCisjaW5jbHVkZSAid2FpdC5oIgorCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIKKyNpbmNsdWRlICJvYmpmaWxlcy5oIgorCisvKiBUbyBzdXBwb3J0IGFza2luZyAiV2hhdCBDUFUgaXMgdGhpcz8iICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8qIFRvIHN1cHBvcnQgZGV0ZWN0aW9uIG9mIHRoZSBwc2V1ZG8taW5pdGlhbCBmcmFtZQorICAgdGhhdCB0aHJlYWRzIGhhdmUuICovCisjZGVmaW5lIFRIUkVBRF9JTklUSUFMX0ZSQU1FX1NZTUJPTCAgIl9fcHRocmVhZF9leGl0IgorI2RlZmluZSBUSFJFQURfSU5JVElBTF9GUkFNRV9TWU1fTEVOICBzaXplb2YoVEhSRUFEX0lOSVRJQUxfRlJBTUVfU1lNQk9MKQorIAorc3RhdGljIGludCBleHRyYWN0XzVfbG9hZCBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKKworc3RhdGljIHVuc2lnbmVkIGV4dHJhY3RfNVJfc3RvcmUgUEFSQU1TICgodW5zaWduZWQgaW50KSk7CisKK3N0YXRpYyB1bnNpZ25lZCBleHRyYWN0XzVyX3N0b3JlIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOworCitzdGF0aWMgdm9pZCBmaW5kX2R1bW15X2ZyYW1lX3JlZ3MgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKiwKKwkJCQkJICAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKikpOworCitzdGF0aWMgaW50IGZpbmRfcHJvY19mcmFtZXNpemUgUEFSQU1TICgoQ09SRV9BRERSKSk7CisKK3N0YXRpYyBpbnQgZmluZF9yZXR1cm5fcmVnbnVtIFBBUkFNUyAoKENPUkVfQUREUikpOworCitzdHJ1Y3QgdW53aW5kX3RhYmxlX2VudHJ5ICpmaW5kX3Vud2luZF9lbnRyeSBQQVJBTVMgKChDT1JFX0FERFIpKTsKKworc3RhdGljIGludCBleHRyYWN0XzE3IFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOworCitzdGF0aWMgdW5zaWduZWQgZGVwb3NpdF8yMSBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCkpOworCitzdGF0aWMgaW50IGV4dHJhY3RfMjEgUEFSQU1TICgodW5zaWduZWQpKTsKKworc3RhdGljIHVuc2lnbmVkIGRlcG9zaXRfMTQgUEFSQU1TICgoaW50LCB1bnNpZ25lZCBpbnQpKTsKKworc3RhdGljIGludCBleHRyYWN0XzE0IFBBUkFNUyAoKHVuc2lnbmVkKSk7CisKK3N0YXRpYyB2b2lkIHVud2luZF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyBpbnQgbG93X3NpZ25fZXh0ZW5kIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KSk7CisKK3N0YXRpYyBpbnQgc2lnbl9leHRlbmQgUEFSQU1TICgodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpKTsKKworc3RhdGljIGludCByZXN0b3JlX3BjX3F1ZXVlIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICopKTsKKworc3RhdGljIGludCBocHBhX2FsaWdub2YgUEFSQU1TICgoc3RydWN0IHR5cGUgKikpOworCisvKiBUbyBzdXBwb3J0IG11bHRpLXRocmVhZGluZyBhbmQgc3RlcHBpbmcuICovCitpbnQgaHBwYV9wcmVwYXJlX3RvX3Byb2NlZWQgUEFSQU1TICgoKSk7CisKK3N0YXRpYyBpbnQgcHJvbG9ndWVfaW5zdF9hZGp1c3Rfc3AgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOworCitzdGF0aWMgaW50IGlzX2JyYW5jaCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7CisKK3N0YXRpYyBpbnQgaW5zdF9zYXZlc19nciBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7CisKK3N0YXRpYyBpbnQgaW5zdF9zYXZlc19mciBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7CisKK3N0YXRpYyBpbnQgcGNfaW5faW50ZXJydXB0X2hhbmRsZXIgUEFSQU1TICgoQ09SRV9BRERSKSk7CisKK3N0YXRpYyBpbnQgcGNfaW5fbGlua2VyX3N0dWIgUEFSQU1TICgoQ09SRV9BRERSKSk7CisKK3N0YXRpYyBpbnQgY29tcGFyZV91bndpbmRfZW50cmllcyBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOworCitzdGF0aWMgdm9pZCByZWFkX3Vud2luZF9pbmZvIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQgaW50ZXJuYWxpemVfdW53aW5kcyBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLAorCQkJCQkgc3RydWN0IHVud2luZF90YWJsZV9lbnRyeSAqLAorCQkJCQkgYXNlY3Rpb24gKiwgdW5zaWduZWQgaW50LAorCQkJCQkgdW5zaWduZWQgaW50LCBDT1JFX0FERFIpKTsKK3N0YXRpYyB2b2lkIHBhX3ByaW50X3JlZ2lzdGVycyBQQVJBTVMgKChjaGFyICosIGludCwgaW50KSk7CitzdGF0aWMgdm9pZCBwYV9zdHJjYXRfcmVnaXN0ZXJzIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBpbnQsIEdEQl9GSUxFICopKTsKK3N0YXRpYyB2b2lkIHBhX3JlZ2lzdGVyX2xvb2tfYXNpZGUgUEFSQU1TICgoY2hhciAqLCBpbnQsIGxvbmcgKikpOworc3RhdGljIHZvaWQgcGFfcHJpbnRfZnBfcmVnIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgcGFfc3RyY2F0X2ZwX3JlZyBQQVJBTVMgKChpbnQsIEdEQl9GSUxFICosIGVudW0gcHJlY2lzaW9uX3R5cGUpKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKiBtc3ltOworICBDT1JFX0FERFIgc29saWJfaGFuZGxlOworfSBhcmdzX2Zvcl9maW5kX3N0dWI7CisKK3N0YXRpYyBDT1JFX0FERFIgY292ZXJfZmluZF9zdHViX3dpdGhfc2hsX2dldCBQQVJBTVMgKChhcmdzX2Zvcl9maW5kX3N0dWIgKikpOworCitzdGF0aWMgaW50IGlzX3BhXzIgPSAwOyAgLyogRmFsc2UgKi8KKworLyogVGhpcyBpcyBkZWNsYXJlZCBpbiBzeW10YWIuYzsgc2V0IHRvIDEgaW4gaHAtc3ltdGFiLXJlYWQuYyAqLyAKK2V4dGVybiBpbnQgaHBfc29tX3NvbV9vYmplY3RfcHJlc2VudDsKKworLyogSW4gYnJlYWtwb2ludC5jICovCitleHRlcm4gaW50IGV4Y2VwdGlvbl9jYXRjaHBvaW50c19hcmVfZnJhZ2lsZTsKKworLyogVGhpcyBpcyBkZWZpbmVkIGluIHZhbG9wcy5jLiAqLworZXh0ZXJuIHZhbHVlX3B0cgorZmluZF9mdW5jdGlvbl9pbl9pbmZlcmlvciBQQVJBTVMoKGNoYXIgKikpOworCisvKiBTaG91bGQgY2FsbF9mdW5jdGlvbiBhbGxvY2F0ZSBzdGFjayBzcGFjZSBmb3IgYSBzdHJ1Y3QgcmV0dXJuPyAgKi8KK2ludAoraHBwYV91c2Vfc3RydWN0X2NvbnZlbnRpb24gKGdjY19wLCB0eXBlKQorICAgICBpbnQgZ2NjX3A7CisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworeworICByZXR1cm4gKFRZUEVfTEVOR1RIICh0eXBlKSA+IDgpOworfQorCisMCisvKiBSb3V0aW5lcyB0byBleHRyYWN0IHZhcmlvdXMgc2l6ZWQgY29uc3RhbnRzIG91dCBvZiBocHBhIAorICAgaW5zdHJ1Y3Rpb25zLiAqLworCisvKiBUaGlzIGFzc3VtZXMgdGhhdCBubyBnYXJiYWdlIGxpZXMgb3V0c2lkZSBvZiB0aGUgbG93ZXIgYml0cyBvZiAKKyAgIHZhbHVlLiAqLworCitzdGF0aWMgaW50CitzaWduX2V4dGVuZCAodmFsLCBiaXRzKQorICAgICB1bnNpZ25lZCB2YWwsIGJpdHM7Cit7CisgIHJldHVybiAoaW50KSh2YWwgPj4gKGJpdHMgLSAxKSA/ICgtMSA8PCBiaXRzKSB8IHZhbCA6IHZhbCk7Cit9CisKKy8qIEZvciBtYW55IGltbWVkaWF0ZSB2YWx1ZXMgdGhlIHNpZ24gYml0IGlzIHRoZSBsb3cgYml0ISAqLworCitzdGF0aWMgaW50Citsb3dfc2lnbl9leHRlbmQgKHZhbCwgYml0cykKKyAgICAgdW5zaWduZWQgdmFsLCBiaXRzOworeworICByZXR1cm4gKGludCkoKHZhbCAmIDB4MSA/ICgtMSA8PCAoYml0cyAtIDEpKSA6IDApIHwgdmFsID4+IDEpOworfQorCisvKiBleHRyYWN0IHRoZSBpbW1lZGlhdGUgZmllbGQgZnJvbSBhIGxke2Jod31zIGluc3RydWN0aW9uICovCisKKyNpZiAwCisKK3Vuc2lnbmVkCitnZXRfZmllbGQgKHZhbCwgZnJvbSwgdG8pCisgICAgIHVuc2lnbmVkIHZhbCwgZnJvbSwgdG87Cit7CisgIHZhbCA9IHZhbCA+PiAzMSAtIHRvOworICByZXR1cm4gdmFsICYgKCgxIDw8IDMyIC0gZnJvbSkgLSAxKTsKK30KKwordW5zaWduZWQKK3NldF9maWVsZCAodmFsLCBmcm9tLCB0bywgbmV3X3ZhbCkKKyAgICAgdW5zaWduZWQgKnZhbCwgZnJvbSwgdG87Cit7CisgIHVuc2lnbmVkIG1hc2sgPSB+KCgxIDw8ICh0byAtIGZyb20gKyAxKSkgPDwgKDMxIC0gZnJvbSkpOworICByZXR1cm4gKnZhbCA9ICp2YWwgJiBtYXNrIHwgKG5ld192YWwgPDwgKDMxIC0gZnJvbSkpOworfQorCisvKiBleHRyYWN0IGEgMy1iaXQgc3BhY2UgcmVnaXN0ZXIgbnVtYmVyIGZyb20gYSBiZSwgYmxlLCBtdHNwIG9yIG1mc3AgKi8KKworaW50CitleHRyYWN0XzMgKHdvcmQpCisgICAgIHVuc2lnbmVkIHdvcmQ7Cit7CisgIHJldHVybiBHRVRfRklFTEQgKHdvcmQsIDE4LCAxOCkgPDwgMiB8IEdFVF9GSUVMRCAod29yZCwgMTYsIDE3KTsKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbnQKK2V4dHJhY3RfNV9sb2FkICh3b3JkKQorICAgICB1bnNpZ25lZCB3b3JkOworeworICByZXR1cm4gbG93X3NpZ25fZXh0ZW5kICh3b3JkID4+IDE2ICYgTUFTS181LCA1KTsKK30KKworI2lmIDAKKworLyogZXh0cmFjdCB0aGUgaW1tZWRpYXRlIGZpZWxkIGZyb20gYSBzdHtiaHd9cyBpbnN0cnVjdGlvbiAqLworCitpbnQKK2V4dHJhY3RfNV9zdG9yZSAod29yZCkKKyAgICAgdW5zaWduZWQgd29yZDsKK3sKKyAgcmV0dXJuIGxvd19zaWduX2V4dGVuZCAod29yZCAmIE1BU0tfNSwgNSk7Cit9CisKKyNlbmRpZgkvKiAwICovCisgICAgICAgCisvKiBleHRyYWN0IHRoZSBpbW1lZGlhdGUgZmllbGQgZnJvbSBhIGJyZWFrIGluc3RydWN0aW9uICovCisKK3N0YXRpYyB1bnNpZ25lZAorZXh0cmFjdF81cl9zdG9yZSAod29yZCkKKyAgICAgdW5zaWduZWQgd29yZDsKK3sKKyAgcmV0dXJuICh3b3JkICYgTUFTS181KTsKK30KKworLyogZXh0cmFjdCB0aGUgaW1tZWRpYXRlIGZpZWxkIGZyb20gYSB7c3J9c20gaW5zdHJ1Y3Rpb24gKi8KKworc3RhdGljIHVuc2lnbmVkCitleHRyYWN0XzVSX3N0b3JlICh3b3JkKQorICAgICB1bnNpZ25lZCB3b3JkOworeworICByZXR1cm4gKHdvcmQgPj4gMTYgJiBNQVNLXzUpOworfQorCisvKiBleHRyYWN0IGFuIDExIGJpdCBpbW1lZGlhdGUgZmllbGQgKi8KKworI2lmIDAKKworaW50CitleHRyYWN0XzExICh3b3JkKQorICAgICB1bnNpZ25lZCB3b3JkOworeworICByZXR1cm4gbG93X3NpZ25fZXh0ZW5kICh3b3JkICYgTUFTS18xMSwgMTEpOworfQorCisjZW5kaWYKKworLyogZXh0cmFjdCBhIDE0IGJpdCBpbW1lZGlhdGUgZmllbGQgKi8KKworc3RhdGljIGludAorZXh0cmFjdF8xNCAod29yZCkKKyAgICAgdW5zaWduZWQgd29yZDsKK3sKKyAgcmV0dXJuIGxvd19zaWduX2V4dGVuZCAod29yZCAmIE1BU0tfMTQsIDE0KTsKK30KKworLyogZGVwb3NpdCBhIDE0IGJpdCBjb25zdGFudCBpbiBhIHdvcmQgKi8KKworc3RhdGljIHVuc2lnbmVkCitkZXBvc2l0XzE0IChvcG5kLCB3b3JkKQorICAgICBpbnQgb3BuZDsKKyAgICAgdW5zaWduZWQgd29yZDsKK3sKKyAgdW5zaWduZWQgc2lnbiA9IChvcG5kIDwgMCA/IDEgOiAwKTsKKworICByZXR1cm4gd29yZCB8ICgodW5zaWduZWQpb3BuZCA8PCAxICYgTUFTS18xNCkgIHwgc2lnbjsKK30KKworLyogZXh0cmFjdCBhIDIxIGJpdCBjb25zdGFudCAqLworCitzdGF0aWMgaW50CitleHRyYWN0XzIxICh3b3JkKQorICAgICB1bnNpZ25lZCB3b3JkOworeworICBpbnQgdmFsOworCisgIHdvcmQgJj0gTUFTS18yMTsKKyAgd29yZCA8PD0gMTE7CisgIHZhbCA9IEdFVF9GSUVMRCAod29yZCwgMjAsIDIwKTsKKyAgdmFsIDw8PSAxMTsKKyAgdmFsIHw9IEdFVF9GSUVMRCAod29yZCwgOSwgMTkpOworICB2YWwgPDw9IDI7CisgIHZhbCB8PSBHRVRfRklFTEQgKHdvcmQsIDUsIDYpOworICB2YWwgPDw9IDU7CisgIHZhbCB8PSBHRVRfRklFTEQgKHdvcmQsIDAsIDQpOworICB2YWwgPDw9IDI7CisgIHZhbCB8PSBHRVRfRklFTEQgKHdvcmQsIDcsIDgpOworICByZXR1cm4gc2lnbl9leHRlbmQgKHZhbCwgMjEpIDw8IDExOworfQorCisvKiBkZXBvc2l0IGEgMjEgYml0IGNvbnN0YW50IGluIGEgd29yZC4gQWx0aG91Z2ggMjEgYml0IGNvbnN0YW50cyBhcmUKKyAgIHVzdWFsbHkgdGhlIHRvcCAyMSBiaXRzIG9mIGEgMzIgYml0IGNvbnN0YW50LCB3ZSBhc3N1bWUgdGhhdCBvbmx5CisgICB0aGUgbG93IDIxIGJpdHMgb2Ygb3BuZCBhcmUgcmVsZXZhbnQgKi8KKworc3RhdGljIHVuc2lnbmVkCitkZXBvc2l0XzIxIChvcG5kLCB3b3JkKQorICAgICB1bnNpZ25lZCBvcG5kLCB3b3JkOworeworICB1bnNpZ25lZCB2YWwgPSAwOworCisgIHZhbCB8PSBHRVRfRklFTEQgKG9wbmQsIDExICsgMTQsIDExICsgMTgpOworICB2YWwgPDw9IDI7CisgIHZhbCB8PSBHRVRfRklFTEQgKG9wbmQsIDExICsgMTIsIDExICsgMTMpOworICB2YWwgPDw9IDI7CisgIHZhbCB8PSBHRVRfRklFTEQgKG9wbmQsIDExICsgMTksIDExICsgMjApOworICB2YWwgPDw9IDExOworICB2YWwgfD0gR0VUX0ZJRUxEIChvcG5kLCAxMSArIDEsIDExICsgMTEpOworICB2YWwgPDw9IDE7CisgIHZhbCB8PSBHRVRfRklFTEQgKG9wbmQsIDExICsgMCwgMTEgKyAwKTsKKyAgcmV0dXJuIHdvcmQgfCB2YWw7Cit9CisKKy8qIGV4dHJhY3QgYSAxMiBiaXQgY29uc3RhbnQgZnJvbSBicmFuY2ggaW5zdHJ1Y3Rpb25zICovCisKKyNpZiAwCisKK2ludAorZXh0cmFjdF8xMiAod29yZCkKKyAgICAgdW5zaWduZWQgd29yZDsKK3sKKyAgcmV0dXJuIHNpZ25fZXh0ZW5kIChHRVRfRklFTEQgKHdvcmQsIDE5LCAyOCkgfAorCQkgICAgICBHRVRfRklFTEQgKHdvcmQsIDI5LCAyOSkgPDwgMTAgfAorCQkgICAgICAod29yZCAmIDB4MSkgPDwgMTEsIDEyKSA8PCAyOworfQorCisvKiBEZXBvc2l0IGEgMTcgYml0IGNvbnN0YW50IGluIGFuIGluc3RydWN0aW9uIChsaWtlIGJsKS4gKi8KKwordW5zaWduZWQgaW50CitkZXBvc2l0XzE3IChvcG5kLCB3b3JkKQorICAgICB1bnNpZ25lZCBvcG5kLCB3b3JkOworeworICB3b3JkIHw9IEdFVF9GSUVMRCAob3BuZCwgMTUgKyAwLCAxNSArIDApOyAvKiB3ICovCisgIHdvcmQgfD0gR0VUX0ZJRUxEIChvcG5kLCAxNSArIDEsIDE1ICsgNSkgPDwgMTY7IC8qIHcxICovCisgIHdvcmQgfD0gR0VUX0ZJRUxEIChvcG5kLCAxNSArIDYsIDE1ICsgNikgPDwgMjsgLyogdzJbMTBdICovCisgIHdvcmQgfD0gR0VUX0ZJRUxEIChvcG5kLCAxNSArIDcsIDE1ICsgMTYpIDw8IDM7IC8qIHcyWzAuLjldICovCisKKyAgcmV0dXJuIHdvcmQ7Cit9CisKKyNlbmRpZgorCisvKiBleHRyYWN0IGEgMTcgYml0IGNvbnN0YW50IGZyb20gYnJhbmNoIGluc3RydWN0aW9ucywgcmV0dXJuaW5nIHRoZQorICAgMTkgYml0IHNpZ25lZCB2YWx1ZS4gKi8KKworc3RhdGljIGludAorZXh0cmFjdF8xNyAod29yZCkKKyAgICAgdW5zaWduZWQgd29yZDsKK3sKKyAgcmV0dXJuIHNpZ25fZXh0ZW5kIChHRVRfRklFTEQgKHdvcmQsIDE5LCAyOCkgfAorCQkgICAgICBHRVRfRklFTEQgKHdvcmQsIDI5LCAyOSkgPDwgMTAgfAorCQkgICAgICBHRVRfRklFTEQgKHdvcmQsIDExLCAxNSkgPDwgMTEgfAorCQkgICAgICAod29yZCAmIDB4MSkgPDwgMTYsIDE3KSA8PCAyOworfQorDAorCisvKiBDb21wYXJlIHRoZSBzdGFydCBhZGRyZXNzIGZvciB0d28gdW53aW5kIGVudHJpZXMgcmV0dXJuaW5nIDEgaWYgCisgICB0aGUgZmlyc3QgYWRkcmVzcyBpcyBsYXJnZXIgdGhhbiB0aGUgc2Vjb25kLCAtMSBpZiB0aGUgc2Vjb25kIGlzCisgICBsYXJnZXIgdGhhbiB0aGUgZmlyc3QsIGFuZCB6ZXJvIGlmIHRoZXkgYXJlIGVxdWFsLiAgKi8KKworc3RhdGljIGludAorY29tcGFyZV91bndpbmRfZW50cmllcyAoYXJnMSwgYXJnMikKKyAgICAgY29uc3Qgdm9pZCAqYXJnMTsKKyAgICAgY29uc3Qgdm9pZCAqYXJnMjsKK3sKKyAgY29uc3Qgc3RydWN0IHVud2luZF90YWJsZV9lbnRyeSAqYSA9IGFyZzE7CisgIGNvbnN0IHN0cnVjdCB1bndpbmRfdGFibGVfZW50cnkgKmIgPSBhcmcyOworCisgIGlmIChhLT5yZWdpb25fc3RhcnQgPiBiLT5yZWdpb25fc3RhcnQpCisgICAgcmV0dXJuIDE7CisgIGVsc2UgaWYgKGEtPnJlZ2lvbl9zdGFydCA8IGItPnJlZ2lvbl9zdGFydCkKKyAgICByZXR1cm4gLTE7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2ludGVybmFsaXplX3Vud2luZHMgKG9iamZpbGUsIHRhYmxlLCBzZWN0aW9uLCBlbnRyaWVzLCBzaXplLCB0ZXh0X29mZnNldCkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIHN0cnVjdCB1bndpbmRfdGFibGVfZW50cnkgKnRhYmxlOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgICAgdW5zaWduZWQgaW50IGVudHJpZXMsIHNpemU7CisgICAgIENPUkVfQUREUiB0ZXh0X29mZnNldDsKK3sKKyAgLyogV2Ugd2lsbCByZWFkIHRoZSB1bndpbmQgZW50cmllcyBpbnRvIHRlbXBvcmFyeSBtZW1vcnksIHRoZW4KKyAgICAgZmlsbCBpbiB0aGUgYWN0dWFsIHVud2luZCB0YWJsZS4gICovCisgIGlmIChzaXplID4gMCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIHRtcDsKKyAgICAgIHVuc2lnbmVkIGk7CisgICAgICBjaGFyICpidWYgPSBhbGxvY2EgKHNpemUpOworCisgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKG9iamZpbGUtPm9iZmQsIHNlY3Rpb24sIGJ1ZiwgMCwgc2l6ZSk7CisKKyAgICAgIC8qIE5vdyBpbnRlcm5hbGl6ZSB0aGUgaW5mb3JtYXRpb24gYmVpbmcgY2FyZWZ1bCB0byBoYW5kbGUgaG9zdC90YXJnZXQKKwkgZW5kaWFuIGlzc3Vlcy4gICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKQorCXsKKwkgIHRhYmxlW2ldLnJlZ2lvbl9zdGFydCA9IGJmZF9nZXRfMzIgKG9iamZpbGUtPm9iZmQsCisJCQkJCSAgICAgIChiZmRfYnl0ZSAqKWJ1Zik7CisJICB0YWJsZVtpXS5yZWdpb25fc3RhcnQgKz0gdGV4dF9vZmZzZXQ7CisJICBidWYgKz0gNDsKKwkgIHRhYmxlW2ldLnJlZ2lvbl9lbmQgPSBiZmRfZ2V0XzMyIChvYmpmaWxlLT5vYmZkLCAoYmZkX2J5dGUgKilidWYpOworCSAgdGFibGVbaV0ucmVnaW9uX2VuZCArPSB0ZXh0X29mZnNldDsKKwkgIGJ1ZiArPSA0OworCSAgdG1wID0gYmZkX2dldF8zMiAob2JqZmlsZS0+b2JmZCwgKGJmZF9ieXRlICopYnVmKTsKKwkgIGJ1ZiArPSA0OworCSAgdGFibGVbaV0uQ2Fubm90X3Vud2luZCA9ICh0bXAgPj4gMzEpICYgMHgxOworCSAgdGFibGVbaV0uTWlsbGljb2RlID0gKHRtcCA+PiAzMCkgJiAweDE7CisJICB0YWJsZVtpXS5NaWxsaWNvZGVfc2F2ZV9zcjAgPSAodG1wID4+IDI5KSAmIDB4MTsKKwkgIHRhYmxlW2ldLlJlZ2lvbl9kZXNjcmlwdGlvbiA9ICh0bXAgPj4gMjcpICYgMHgzOworCSAgdGFibGVbaV0ucmVzZXJ2ZWQxID0gKHRtcCA+PiAyNikgJiAweDE7CisJICB0YWJsZVtpXS5FbnRyeV9TUiA9ICh0bXAgPj4gMjUpICYgMHgxOworCSAgdGFibGVbaV0uRW50cnlfRlIgPSAodG1wID4+IDIxKSAmIDB4ZjsKKwkgIHRhYmxlW2ldLkVudHJ5X0dSID0gKHRtcCA+PiAxNikgJiAweDFmOworCSAgdGFibGVbaV0uQXJnc19zdG9yZWQgPSAodG1wID4+IDE1KSAmIDB4MTsKKwkgIHRhYmxlW2ldLlZhcmlhYmxlX0ZyYW1lID0gKHRtcCA+PiAxNCkgJiAweDE7CisJICB0YWJsZVtpXS5TZXBhcmF0ZV9QYWNrYWdlX0JvZHkgPSAodG1wID4+IDEzKSAmIDB4MTsKKwkgIHRhYmxlW2ldLkZyYW1lX0V4dGVuc2lvbl9NaWxsaWNvZGUgPSAodG1wID4+IDEyKSAmIDB4MTsKKwkgIHRhYmxlW2ldLlN0YWNrX092ZXJmbG93X0NoZWNrID0gKHRtcCA+PiAxMSkgJiAweDE7CisJICB0YWJsZVtpXS5Ud29fSW5zdHJ1Y3Rpb25fU1BfSW5jcmVtZW50ID0gKHRtcCA+PiAxMCkgJiAweDE7CisJICB0YWJsZVtpXS5BZGFfUmVnaW9uID0gKHRtcCA+PiA5KSAmIDB4MTsKKwkgIHRhYmxlW2ldLmN4eF9pbmZvID0gKHRtcCA+PiA4KSAmIDB4MTsKKwkgIHRhYmxlW2ldLmN4eF90cnlfY2F0Y2ggPSAodG1wID4+IDcpICYgMHgxOworCSAgdGFibGVbaV0uc2NoZWRfZW50cnlfc2VxID0gKHRtcCA+PiA2KSAmIDB4MTsKKwkgIHRhYmxlW2ldLnJlc2VydmVkMiA9ICh0bXAgPj4gNSkgJiAweDE7CisJICB0YWJsZVtpXS5TYXZlX1NQID0gKHRtcCA+PiA0KSAmIDB4MTsKKwkgIHRhYmxlW2ldLlNhdmVfUlAgPSAodG1wID4+IDMpICYgMHgxOworCSAgdGFibGVbaV0uU2F2ZV9NUlBfaW5fZnJhbWUgPSAodG1wID4+IDIpICYgMHgxOworCSAgdGFibGVbaV0uZXh0bl9wdHJfZGVmaW5lZCA9ICh0bXAgPj4gMSkgJiAweDE7CisJICB0YWJsZVtpXS5DbGVhbnVwX2RlZmluZWQgPSB0bXAgJiAweDE7CisJICB0bXAgPSBiZmRfZ2V0XzMyIChvYmpmaWxlLT5vYmZkLCAoYmZkX2J5dGUgKilidWYpOworCSAgYnVmICs9IDQ7CisJICB0YWJsZVtpXS5NUEVfWExfaW50ZXJydXB0X21hcmtlciA9ICh0bXAgPj4gMzEpICYgMHgxOworCSAgdGFibGVbaV0uSFBfVVhfaW50ZXJydXB0X21hcmtlciA9ICh0bXAgPj4gMzApICYgMHgxOworCSAgdGFibGVbaV0uTGFyZ2VfZnJhbWUgPSAodG1wID4+IDI5KSAmIDB4MTsKKwkgIHRhYmxlW2ldLlBzZXVkb19TUF9TZXQgPSAodG1wID4+IDI4KSAmIDB4MTsKKwkgIHRhYmxlW2ldLnJlc2VydmVkNCA9ICh0bXAgPj4gMjcpICYgMHgxOworCSAgdGFibGVbaV0uVG90YWxfZnJhbWVfc2l6ZSA9IHRtcCAmIDB4N2ZmZmZmZjsKKworICAgICAgICAgIC8qIFN0dWIgdW53aW5kcyBhcmUgaGFuZGxlZCBlbHNld2hlcmUuICovCisJICB0YWJsZVtpXS5zdHViX3Vud2luZC5zdHViX3R5cGUgPSAwOworCSAgdGFibGVbaV0uc3R1Yl91bndpbmQucGFkZGluZyA9IDA7CisJfQorICAgIH0KK30KKworLyogUmVhZCBpbiB0aGUgYmFja3RyYWNlIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgYCRVTldJTkRfU1RBUlQkJyBzZWN0aW9uIG9mCisgICB0aGUgb2JqZWN0IGZpbGUuICBUaGlzIGluZm8gaXMgdXNlZCBtYWlubHkgYnkgZmluZF91bndpbmRfZW50cnkoKSB0byBmaW5kCisgICBvdXQgdGhlIHN0YWNrIGZyYW1lIHNpemUgYW5kIGZyYW1lIHBvaW50ZXIgdXNlZCBieSBwcm9jZWR1cmVzLiAgV2UgcHV0CisgICBldmVyeXRoaW5nIG9uIHRoZSBwc3ltYm9sIG9ic3RhY2sgaW4gdGhlIG9iamZpbGUgc28gdGhhdCBpdCBhdXRvbWF0aWNhbGx5CisgICBnZXRzIGZyZWVkIHdoZW4gdGhlIG9iamZpbGUgaXMgZGVzdHJveWVkLiAgKi8KKworc3RhdGljIHZvaWQKK3JlYWRfdW53aW5kX2luZm8gKG9iamZpbGUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBhc2VjdGlvbiAqdW53aW5kX3NlYywgKmVsZl91bndpbmRfc2VjLCAqc3R1Yl91bndpbmRfc2VjOworICB1bnNpZ25lZCB1bndpbmRfc2l6ZSwgZWxmX3Vud2luZF9zaXplLCBzdHViX3Vud2luZF9zaXplLCB0b3RhbF9zaXplOworICB1bnNpZ25lZCBpbmRleCwgdW53aW5kX2VudHJpZXMsIGVsZl91bndpbmRfZW50cmllczsKKyAgdW5zaWduZWQgc3R1Yl9lbnRyaWVzLCB0b3RhbF9lbnRyaWVzOworICBDT1JFX0FERFIgdGV4dF9vZmZzZXQ7CisgIHN0cnVjdCBvYmpfdW53aW5kX2luZm8gKnVpOworICBvYmpfcHJpdmF0ZV9kYXRhX3QgKm9ial9wcml2YXRlOworCisgIHRleHRfb2Zmc2V0ID0gQU5PRkZTRVQgKG9iamZpbGUtPnNlY3Rpb25fb2Zmc2V0cywgMCk7CisgIHVpID0gKHN0cnVjdCBvYmpfdW53aW5kX2luZm8gKilvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+cHN5bWJvbF9vYnN0YWNrLAorCQkJCQkJc2l6ZW9mIChzdHJ1Y3Qgb2JqX3Vud2luZF9pbmZvKSk7CisKKyAgdWktPnRhYmxlID0gTlVMTDsKKyAgdWktPmNhY2hlID0gTlVMTDsKKyAgdWktPmxhc3QgPSAtMTsKKworICAvKiBHZXQgaG9va3MgdG8gYWxsIHVud2luZCBzZWN0aW9ucy4gICBOb3RlIHRoZXJlIGlzIG5vIGxpbmtlci1zdHViIHVud2luZAorICAgICBzZWN0aW9uIGluIEVMRiBhdCB0aGUgbW9tZW50LiAgKi8KKyAgdW53aW5kX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvYmpmaWxlLT5vYmZkLCAiJFVOV0lORF9TVEFSVCQiKTsKKyAgZWxmX3Vud2luZF9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob2JqZmlsZS0+b2JmZCwgIi5QQVJJU0MudW53aW5kIik7CisgIHN0dWJfdW53aW5kX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvYmpmaWxlLT5vYmZkLCAiJFVOV0lORF9FTkQkIik7CisKKyAgLyogR2V0IHNpemVzIGFuZCB1bndpbmQgY291bnRzIGZvciBhbGwgc2VjdGlvbnMuICAqLworICBpZiAodW53aW5kX3NlYykKKyAgICB7CisgICAgICB1bndpbmRfc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKG9iamZpbGUtPm9iZmQsIHVud2luZF9zZWMpOworICAgICAgdW53aW5kX2VudHJpZXMgPSB1bndpbmRfc2l6ZSAvIFVOV0lORF9FTlRSWV9TSVpFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVud2luZF9zaXplID0gMDsKKyAgICAgIHVud2luZF9lbnRyaWVzID0gMDsKKyAgICB9CisKKyAgaWYgKGVsZl91bndpbmRfc2VjKQorICAgIHsKKyAgICAgIGVsZl91bndpbmRfc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKG9iamZpbGUtPm9iZmQsIGVsZl91bndpbmRfc2VjKTsgLyogcHVyZWNvdjogZGVhZGNvZGUgKi8KKyAgICAgIGVsZl91bndpbmRfZW50cmllcyA9IGVsZl91bndpbmRfc2l6ZSAvIFVOV0lORF9FTlRSWV9TSVpFOyAvKiBwdXJlY292OiBkZWFkY29kZSAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGVsZl91bndpbmRfc2l6ZSA9IDA7CisgICAgICBlbGZfdW53aW5kX2VudHJpZXMgPSAwOworICAgIH0KKworICBpZiAoc3R1Yl91bndpbmRfc2VjKQorICAgIHsKKyAgICAgIHN0dWJfdW53aW5kX3NpemUgPSBiZmRfc2VjdGlvbl9zaXplIChvYmpmaWxlLT5vYmZkLCBzdHViX3Vud2luZF9zZWMpOworICAgICAgc3R1Yl9lbnRyaWVzID0gc3R1Yl91bndpbmRfc2l6ZSAvIFNUVUJfVU5XSU5EX0VOVFJZX1NJWkU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3R1Yl91bndpbmRfc2l6ZSA9IDA7CisgICAgICBzdHViX2VudHJpZXMgPSAwOworICAgIH0KKworICAvKiBDb21wdXRlIHRvdGFsIG51bWJlciBvZiB1bndpbmQgZW50cmllcyBhbmQgdGhlaXIgdG90YWwgc2l6ZS4gICovCisgIHRvdGFsX2VudHJpZXMgPSB1bndpbmRfZW50cmllcyArIGVsZl91bndpbmRfZW50cmllcyArIHN0dWJfZW50cmllczsKKyAgdG90YWxfc2l6ZSA9IHRvdGFsX2VudHJpZXMgKiBzaXplb2YgKHN0cnVjdCB1bndpbmRfdGFibGVfZW50cnkpOworCisgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHVud2luZCB0YWJsZS4gICovCisgIHVpLT50YWJsZSA9IChzdHJ1Y3QgdW53aW5kX3RhYmxlX2VudHJ5ICopCisgICAgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnBzeW1ib2xfb2JzdGFjaywgdG90YWxfc2l6ZSk7CisgICB1aS0+bGFzdCA9IHRvdGFsX2VudHJpZXMgLSAxOworCisgIC8qIEludGVybmFsaXplIHRoZSBzdGFuZGFyZCB1bndpbmQgZW50cmllcy4gICovCisgIGluZGV4ID0gMDsKKyAgaW50ZXJuYWxpemVfdW53aW5kcyAob2JqZmlsZSwgJnVpLT50YWJsZVtpbmRleF0sIHVud2luZF9zZWMsCisJCSAgICAgICB1bndpbmRfZW50cmllcywgdW53aW5kX3NpemUsIHRleHRfb2Zmc2V0KTsKKyAgaW5kZXggKz0gdW53aW5kX2VudHJpZXM7CisgIGludGVybmFsaXplX3Vud2luZHMgKG9iamZpbGUsICZ1aS0+dGFibGVbaW5kZXhdLCBlbGZfdW53aW5kX3NlYywKKwkJICAgICAgIGVsZl91bndpbmRfZW50cmllcywgZWxmX3Vud2luZF9zaXplLCB0ZXh0X29mZnNldCk7CisgIGluZGV4ICs9IGVsZl91bndpbmRfZW50cmllczsKKworICAvKiBOb3cgaW50ZXJuYWxpemUgdGhlIHN0dWIgdW53aW5kIGVudHJpZXMuICAqLworICBpZiAoc3R1Yl91bndpbmRfc2l6ZSA+IDApCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICBjaGFyICpidWYgPSBhbGxvY2EgKHN0dWJfdW53aW5kX3NpemUpOworCisgICAgICAvKiBSZWFkIGluIHRoZSBzdHViIHVud2luZCBlbnRyaWVzLiAgKi8KKyAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAob2JqZmlsZS0+b2JmZCwgc3R1Yl91bndpbmRfc2VjLCBidWYsCisJCQkJMCwgc3R1Yl91bndpbmRfc2l6ZSk7CisKKyAgICAgIC8qIE5vdyBjb252ZXJ0IHRoZW0gaW50byByZWd1bGFyIHVud2luZCBlbnRyaWVzLiAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHViX2VudHJpZXM7IGkrKywgaW5kZXgrKykKKwl7CisJICAvKiBDbGVhciBvdXQgdGhlIG5leHQgdW53aW5kIGVudHJ5LiAgKi8KKwkgIG1lbXNldCAoJnVpLT50YWJsZVtpbmRleF0sIDAsIHNpemVvZiAoc3RydWN0IHVud2luZF90YWJsZV9lbnRyeSkpOworCisJICAvKiBDb252ZXJ0IG9mZnNldCAmIHNpemUgaW50byByZWdpb25fc3RhcnQgYW5kIHJlZ2lvbl9lbmQuICAKKwkgICAgIFN0dWZmIGF3YXkgdGhlIHN0dWIgdHlwZSBpbnRvICJyZXNlcnZlZCIgZmllbGRzLiAgKi8KKwkgIHVpLT50YWJsZVtpbmRleF0ucmVnaW9uX3N0YXJ0ID0gYmZkX2dldF8zMiAob2JqZmlsZS0+b2JmZCwKKwkJCQkJCSAgICAgIChiZmRfYnl0ZSAqKSBidWYpOworCSAgdWktPnRhYmxlW2luZGV4XS5yZWdpb25fc3RhcnQgKz0gdGV4dF9vZmZzZXQ7CisJICBidWYgKz0gNDsKKwkgIHVpLT50YWJsZVtpbmRleF0uc3R1Yl91bndpbmQuc3R1Yl90eXBlID0gYmZkX2dldF84IChvYmpmaWxlLT5vYmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmZkX2J5dGUgKikgYnVmKTsKKwkgIGJ1ZiArPSAyOworCSAgdWktPnRhYmxlW2luZGV4XS5yZWdpb25fZW5kCisJICAgID0gdWktPnRhYmxlW2luZGV4XS5yZWdpb25fc3RhcnQgKyA0ICogCisJICAgICAgKGJmZF9nZXRfMTYgKG9iamZpbGUtPm9iZmQsIChiZmRfYnl0ZSAqKSBidWYpIC0gMSk7CisJICBidWYgKz0gMjsKKwl9CisKKyAgICB9CisKKyAgLyogVW53aW5kIHRhYmxlIG5lZWRzIHRvIGJlIGtlcHQgc29ydGVkLiAgKi8KKyAgcXNvcnQgKHVpLT50YWJsZSwgdG90YWxfZW50cmllcywgc2l6ZW9mIChzdHJ1Y3QgdW53aW5kX3RhYmxlX2VudHJ5KSwKKwkgY29tcGFyZV91bndpbmRfZW50cmllcyk7CisKKyAgLyogS2VlcCBhIHBvaW50ZXIgdG8gdGhlIHVud2luZCBpbmZvcm1hdGlvbi4gICovCisgIGlmKG9iamZpbGUtPm9ial9wcml2YXRlID09IE5VTEwpCisgICAgeworICAgICAgb2JqX3ByaXZhdGUgPSAob2JqX3ByaXZhdGVfZGF0YV90ICopCisJb2JzdGFja19hbGxvYygmb2JqZmlsZS0+cHN5bWJvbF9vYnN0YWNrLAorCQkgICAgICBzaXplb2Yob2JqX3ByaXZhdGVfZGF0YV90KSk7CisgICAgICBvYmpfcHJpdmF0ZS0+dW53aW5kX2luZm8gPSBOVUxMOworICAgICAgb2JqX3ByaXZhdGUtPnNvX2luZm8gICAgID0gTlVMTDsKKyAgICAgIAorICAgICAgb2JqZmlsZS0+b2JqX3ByaXZhdGUgPSAoUFRSKSBvYmpfcHJpdmF0ZTsKKyAgICB9CisgIG9ial9wcml2YXRlID0gKG9ial9wcml2YXRlX2RhdGFfdCAqKW9iamZpbGUtPm9ial9wcml2YXRlOyAKKyAgb2JqX3ByaXZhdGUtPnVud2luZF9pbmZvID0gdWk7Cit9CisKKy8qIExvb2t1cCB0aGUgdW53aW5kIChzdGFjayBiYWNrdHJhY2UpIGluZm8gZm9yIHRoZSBnaXZlbiBQQy4gIFdlIHNlYXJjaCBhbGwKKyAgIG9mIHRoZSBvYmpmaWxlcyBzZWVraW5nIHRoZSB1bndpbmQgdGFibGUgZW50cnkgZm9yIHRoaXMgUEMuICBFYWNoIG9iamZpbGUKKyAgIGNvbnRhaW5zIGEgc29ydGVkIGxpc3Qgb2Ygc3RydWN0IHVud2luZF90YWJsZV9lbnRyeS4gIFNpbmNlIHdlIGRvIGEgYmluYXJ5CisgICBzZWFyY2ggb2YgdGhlIHVud2luZCB0YWJsZXMsIHdlIGRlcGVuZCB1cG9uIHRoZW0gdG8gYmUgc29ydGVkLiAgKi8KKworc3RydWN0IHVud2luZF90YWJsZV9lbnRyeSAqCitmaW5kX3Vud2luZF9lbnRyeShwYykKKyAgICAgQ09SRV9BRERSIHBjOworeworICBpbnQgZmlyc3QsIG1pZGRsZSwgbGFzdDsKKyAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisKKyAgLyogQSBmdW5jdGlvbiBhdCBhZGRyZXNzIDA/ICBOb3QgaW4gSFAtVVghICovCisgIGlmIChwYyA9PSAoQ09SRV9BRERSKSAwKQorICAgIHJldHVybiBOVUxMOworCisgIEFMTF9PQkpGSUxFUyAob2JqZmlsZSkKKyAgICB7CisgICAgICBzdHJ1Y3Qgb2JqX3Vud2luZF9pbmZvICp1aTsKKyAgICAgIHVpID0gTlVMTDsKKyAgICAgIGlmIChvYmpmaWxlLT5vYmpfcHJpdmF0ZSkKKwl1aSA9ICgob2JqX3ByaXZhdGVfZGF0YV90ICopKG9iamZpbGUtPm9ial9wcml2YXRlKSktPnVud2luZF9pbmZvOworCisgICAgICBpZiAoIXVpKQorCXsKKwkgIHJlYWRfdW53aW5kX2luZm8gKG9iamZpbGUpOworCSAgaWYgKG9iamZpbGUtPm9ial9wcml2YXRlID09IE5VTEwpCisJICAgIGVycm9yICgiSW50ZXJuYWwgZXJyb3IgcmVhZGluZyB1bndpbmQgaW5mb3JtYXRpb24uIik7IC8qIHB1cmVjb3Y6IGRlYWRjb2RlICovCisJICB1aSA9ICgob2JqX3ByaXZhdGVfZGF0YV90ICopKG9iamZpbGUtPm9ial9wcml2YXRlKSktPnVud2luZF9pbmZvOworCX0KKworICAgICAgLyogRmlyc3QsIGNoZWNrIHRoZSBjYWNoZSAqLworCisgICAgICBpZiAodWktPmNhY2hlCisJICAmJiBwYyA+PSB1aS0+Y2FjaGUtPnJlZ2lvbl9zdGFydAorCSAgJiYgcGMgPD0gdWktPmNhY2hlLT5yZWdpb25fZW5kKQorCXJldHVybiB1aS0+Y2FjaGU7CisKKyAgICAgIC8qIE5vdCBpbiB0aGUgY2FjaGUsIGRvIGEgYmluYXJ5IHNlYXJjaCAqLworCisgICAgICBmaXJzdCA9IDA7CisgICAgICBsYXN0ID0gdWktPmxhc3Q7CisKKyAgICAgIHdoaWxlIChmaXJzdCA8PSBsYXN0KQorCXsKKwkgIG1pZGRsZSA9IChmaXJzdCArIGxhc3QpIC8gMjsKKwkgIGlmIChwYyA+PSB1aS0+dGFibGVbbWlkZGxlXS5yZWdpb25fc3RhcnQKKwkgICAgICAmJiBwYyA8PSB1aS0+dGFibGVbbWlkZGxlXS5yZWdpb25fZW5kKQorCSAgICB7CisJICAgICAgdWktPmNhY2hlID0gJnVpLT50YWJsZVttaWRkbGVdOworCSAgICAgIHJldHVybiAmdWktPnRhYmxlW21pZGRsZV07CisJICAgIH0KKworCSAgaWYgKHBjIDwgdWktPnRhYmxlW21pZGRsZV0ucmVnaW9uX3N0YXJ0KQorCSAgICBsYXN0ID0gbWlkZGxlIC0gMTsKKwkgIGVsc2UKKwkgICAgZmlyc3QgPSBtaWRkbGUgKyAxOworCX0KKyAgICB9CQkJCS8qIEFMTF9PQkpGSUxFUygpICovCisgIHJldHVybiBOVUxMOworfQorCisvKiBSZXR1cm4gdGhlIGFkanVzdG1lbnQgbmVjZXNzYXJ5IHRvIG1ha2UgZm9yIGFkZHJlc3NlcyBvbiB0aGUgc3RhY2sKKyAgIGFzIHByZXNlbnRlZCBieSBocHJlYWQuYy4KKworICAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvZiB0aGUgc3RhY2sgZGlyZWN0aW9uIG9uIHRoZSBQQSBhbmQgdGhlCisgICBiaXphcnJlIHdheSBpbiB3aGljaCBzb21lb25lICg/KSBkZWNpZGVkIHRoZXkgd2FudGVkIHRvIGhhbmRsZQorICAgZnJhbWUgcG9pbnRlcmxlc3MgY29kZSBpbiBHREIuICAqLworaW50CitocHJlYWRfYWRqdXN0X3N0YWNrX2FkZHJlc3MgKGZ1bmNfYWRkcikKKyAgICAgQ09SRV9BRERSIGZ1bmNfYWRkcjsKK3sKKyAgc3RydWN0IHVud2luZF90YWJsZV9lbnRyeSAqdTsKKworICB1ID0gZmluZF91bndpbmRfZW50cnkgKGZ1bmNfYWRkcik7CisgIGlmICghdSkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHJldHVybiB1LT5Ub3RhbF9mcmFtZV9zaXplIDw8IDM7Cit9CisKKy8qIENhbGxlZCB0byBkZXRlcm1pbmUgaWYgUEMgaXMgaW4gYW4gaW50ZXJydXB0IGhhbmRsZXIgb2Ygc29tZQorICAga2luZC4gICovCisKK3N0YXRpYyBpbnQKK3BjX2luX2ludGVycnVwdF9oYW5kbGVyIChwYykKKyAgICAgQ09SRV9BRERSIHBjOworeworICBzdHJ1Y3QgdW53aW5kX3RhYmxlX2VudHJ5ICp1OworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1fdXM7CisKKyAgdSA9IGZpbmRfdW53aW5kX2VudHJ5IChwYyk7CisgIGlmICghdSkKKyAgICByZXR1cm4gMDsKKworICAvKiBPaCBqb3lzLiAgSFBVWCBzZXRzIHRoZSBpbnRlcnJ1cHQgYml0IGZvciBfc2lncmV0dXJuIGV2ZW4gdGhvdWdoCisgICAgIGl0cyBmcmFtZSBpc24ndCBhIHB1cmUgaW50ZXJydXB0IGZyYW1lLiAgRGVhbCB3aXRoIHRoaXMuICAqLworICBtc3ltX3VzID0gbG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjIChwYyk7CisKKyAgcmV0dXJuIHUtPkhQX1VYX2ludGVycnVwdF9tYXJrZXIgJiYgIUlOX1NJR1RSQU1QIChwYywgU1lNQk9MX05BTUUgKG1zeW1fdXMpKTsKK30KKworLyogQ2FsbGVkIHdoZW4gbm8gdW53aW5kIGRlc2NyaXB0b3Igd2FzIGZvdW5kIGZvciBQQy4gIFJldHVybnMgMSBpZiBpdAorICAgYXBwZWFycyB0aGF0IFBDIGlzIGluIGEgbGlua2VyIHN0dWIuICAqLworCitzdGF0aWMgaW50CitwY19pbl9saW5rZXJfc3R1YiAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgaW50IGZvdW5kX21hZ2ljX2luc3RydWN0aW9uID0gMDsKKyAgaW50IGk7CisgIGNoYXIgYnVmWzRdOworCisgIC8qIElmIHVuYWJsZSB0byByZWFkIG1lbW9yeSwgYXNzdW1lIHBjIGlzIG5vdCBpbiBhIGxpbmtlciBzdHViLiAgKi8KKyAgaWYgKHRhcmdldF9yZWFkX21lbW9yeSAocGMsIGJ1ZiwgNCkgIT0gMCkKKyAgICByZXR1cm4gMDsKKworICAvKiBXZSBhcmUgbG9va2luZyBmb3Igc29tZXRoaW5nIGxpa2UKKworICAgICA7ICQkZHluY2FsbCBqYW1zIFJQIGludG8gdGhpcyBzcGVjaWFsIHNwb3QgaW4gdGhlIGZyYW1lIChSUCcpCisgICAgIDsgYmVmb3JlIGNhbGxpbmcgdGhlICJjYWxsIHN0dWIiCisgICAgIGxkdyAgICAgLTE4KHNwKSxycAorCisgICAgIGxkc2lkICAgKHJwKSxyMSAgICAgICAgIDsgR2V0IHNwYWNlIGFzc29jaWF0ZWQgd2l0aCBSUCBpbnRvIHIxCisgICAgIG10c3AgICAgcjEsc3AgICAgICAgICAgIDsgTW92ZSBpdCBpbnRvIHNwYWNlIHJlZ2lzdGVyIDAKKyAgICAgYmUsbiAgICAwKHNyMCkscnApICAgICAgOyBiYWNrIHRvIHlvdXIgcmVndWxhcmx5IHNjaGVkdWxlZCBwcm9ncmFtICovCisKKyAgLyogTWF4aW11bSBrbm93biBsaW5rZXIgc3R1YiBzaXplIGlzIDQgaW5zdHJ1Y3Rpb25zLiAgU2VhcmNoIGZvcndhcmQKKyAgICAgZnJvbSB0aGUgZ2l2ZW4gUEMsIHRoZW4gYmFja3dhcmQuICAqLworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgIC8qIElmIHdlIGhpdCBzb21ldGhpbmcgd2l0aCBhbiB1bndpbmQsIHN0b3Agc2VhcmNoaW5nIHRoaXMgZGlyZWN0aW9uLiAgKi8KKworICAgICAgaWYgKGZpbmRfdW53aW5kX2VudHJ5IChwYyArIGkgKiA0KSAhPSAwKQorCWJyZWFrOworCisgICAgICAvKiBDaGVjayBmb3IgbGRzaWQgKHJwKSxyMSB3aGljaCBpcyB0aGUgbWFnaWMgaW5zdHJ1Y3Rpb24gZm9yIGEgCisJIHJldHVybiBmcm9tIGEgY3Jvc3Mtc3BhY2UgZnVuY3Rpb24gY2FsbC4gICovCisgICAgICBpZiAocmVhZF9tZW1vcnlfaW50ZWdlciAocGMgKyBpICogNCwgNCkgPT0gMHgwMDQwMTBhMSkKKwl7CisJICBmb3VuZF9tYWdpY19pbnN0cnVjdGlvbiA9IDE7CisJICBicmVhazsKKwl9CisgICAgICAvKiBBZGQgY29kZSB0byBoYW5kbGUgbG9uZyBjYWxsL2JyYW5jaCBhbmQgYXJndW1lbnQgcmVsb2NhdGlvbiBzdHVicworCSBoZXJlLiAgKi8KKyAgICB9CisKKyAgaWYgKGZvdW5kX21hZ2ljX2luc3RydWN0aW9uICE9IDApCisgICAgcmV0dXJuIDE7CisKKyAgLyogTm93IGxvb2sgYmFja3dhcmQuICAqLworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgIC8qIElmIHdlIGhpdCBzb21ldGhpbmcgd2l0aCBhbiB1bndpbmQsIHN0b3Agc2VhcmNoaW5nIHRoaXMgZGlyZWN0aW9uLiAgKi8KKworICAgICAgaWYgKGZpbmRfdW53aW5kX2VudHJ5IChwYyAtIGkgKiA0KSAhPSAwKQorCWJyZWFrOworCisgICAgICAvKiBDaGVjayBmb3IgbGRzaWQgKHJwKSxyMSB3aGljaCBpcyB0aGUgbWFnaWMgaW5zdHJ1Y3Rpb24gZm9yIGEgCisJIHJldHVybiBmcm9tIGEgY3Jvc3Mtc3BhY2UgZnVuY3Rpb24gY2FsbC4gICovCisgICAgICBpZiAocmVhZF9tZW1vcnlfaW50ZWdlciAocGMgLSBpICogNCwgNCkgPT0gMHgwMDQwMTBhMSkKKwl7CisJICBmb3VuZF9tYWdpY19pbnN0cnVjdGlvbiA9IDE7CisJICBicmVhazsKKwl9CisgICAgICAvKiBBZGQgY29kZSB0byBoYW5kbGUgbG9uZyBjYWxsL2JyYW5jaCBhbmQgYXJndW1lbnQgcmVsb2NhdGlvbiBzdHVicworCSBoZXJlLiAgKi8KKyAgICB9CisgIHJldHVybiBmb3VuZF9tYWdpY19pbnN0cnVjdGlvbjsKK30KKworc3RhdGljIGludAorZmluZF9yZXR1cm5fcmVnbnVtKHBjKQorICAgICBDT1JFX0FERFIgcGM7Cit7CisgIHN0cnVjdCB1bndpbmRfdGFibGVfZW50cnkgKnU7CisKKyAgdSA9IGZpbmRfdW53aW5kX2VudHJ5IChwYyk7CisKKyAgaWYgKCF1KQorICAgIHJldHVybiBSUF9SRUdOVU07CisKKyAgaWYgKHUtPk1pbGxpY29kZSkKKyAgICByZXR1cm4gMzE7CisKKyAgcmV0dXJuIFJQX1JFR05VTTsKK30KKworLyogUmV0dXJuIHNpemUgb2YgZnJhbWUsIG9yIC0xIGlmIHdlIHNob3VsZCB1c2UgYSBmcmFtZSBwb2ludGVyLiAgKi8KK3N0YXRpYyBpbnQKK2ZpbmRfcHJvY19mcmFtZXNpemUgKHBjKQorICAgICBDT1JFX0FERFIgcGM7Cit7CisgIHN0cnVjdCB1bndpbmRfdGFibGVfZW50cnkgKnU7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bV91czsKKworICAvKiBUaGlzIG1heSBpbmRpY2F0ZSBhIGJ1ZyBpbiBvdXIgY2FsbGVycy4uLiAqLworICBpZiAocGMgPT0gKENPUkVfQUREUikwKQorICAgIHJldHVybiAtMTsKKyAgCisgIHUgPSBmaW5kX3Vud2luZF9lbnRyeSAocGMpOworCisgIGlmICghdSkKKyAgICB7CisgICAgICBpZiAocGNfaW5fbGlua2VyX3N0dWIgKHBjKSkKKwkvKiBMaW5rZXIgc3R1YnMgaGF2ZSBhIHplcm8gc2l6ZSBmcmFtZS4gICovCisJcmV0dXJuIDA7CisgICAgICBlbHNlCisJcmV0dXJuIC0xOworICAgIH0KKworICBtc3ltX3VzID0gbG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjIChwYyk7CisKKyAgLyogSWYgU2F2ZV9TUCBpcyBzZXQsIGFuZCB3ZSdyZSBub3QgaW4gYW4gaW50ZXJydXB0IG9yIHNpZ25hbCBjYWxsZXIsCisgICAgIHRoZW4gd2UgaGF2ZSBhIGZyYW1lIHBvaW50ZXIuICBVc2UgaXQuICAqLworICBpZiAodS0+U2F2ZV9TUCAmJiAhcGNfaW5faW50ZXJydXB0X2hhbmRsZXIgKHBjKQorICAgICAgJiYgIUlOX1NJR1RSQU1QIChwYywgU1lNQk9MX05BTUUgKG1zeW1fdXMpKSkKKyAgICByZXR1cm4gLTE7CisKKyAgcmV0dXJuIHUtPlRvdGFsX2ZyYW1lX3NpemUgPDwgMzsKK30KKworLyogUmV0dXJuIG9mZnNldCBmcm9tIHNwIGF0IHdoaWNoIHJwIGlzIHNhdmVkLCBvciAwIGlmIG5vdCBzYXZlZC4gICovCitzdGF0aWMgaW50IHJwX3NhdmVkIFBBUkFNUyAoKENPUkVfQUREUikpOworCitzdGF0aWMgaW50CitycF9zYXZlZCAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgc3RydWN0IHVud2luZF90YWJsZV9lbnRyeSAqdTsKKworICAvKiBBIGZ1bmN0aW9uIGF0LCBhbmQgdGh1cyBhIHJldHVybiBQQyBmcm9tLCBhZGRyZXNzIDA/ICBOb3QgaW4gSFAtVVghICovCisgIGlmIChwYyA9PSAoQ09SRV9BRERSKSAwKQorICAgIHJldHVybiAwOworCisgIHUgPSBmaW5kX3Vud2luZF9lbnRyeSAocGMpOworCisgIGlmICghdSkKKyAgICB7CisgICAgICBpZiAocGNfaW5fbGlua2VyX3N0dWIgKHBjKSkKKwkvKiBUaGlzIGlzIHRoZSBzby1jYWxsZWQgUlAnLiAgKi8KKwlyZXR1cm4gLTI0OworICAgICAgZWxzZQorCXJldHVybiAwOworICAgIH0KKworICBpZiAodS0+U2F2ZV9SUCkKKyAgICByZXR1cm4gLTIwOworICBlbHNlIGlmICh1LT5zdHViX3Vud2luZC5zdHViX3R5cGUgIT0gMCkKKyAgICB7CisgICAgICBzd2l0Y2ggKHUtPnN0dWJfdW53aW5kLnN0dWJfdHlwZSkKKwl7CisJY2FzZSBFWFBPUlQ6CisJY2FzZSBJTVBPUlQ6CisJICByZXR1cm4gLTI0OworCWNhc2UgUEFSQU1FVEVSX1JFTE9DQVRJT046CisJICByZXR1cm4gLTg7CisJZGVmYXVsdDoKKwkgIHJldHVybiAwOworCX0KKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKwwKK2ludAorZnJhbWVsZXNzX2Z1bmN0aW9uX2ludm9jYXRpb24gKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIHN0cnVjdCB1bndpbmRfdGFibGVfZW50cnkgKnU7CisKKyAgdSA9IGZpbmRfdW53aW5kX2VudHJ5IChmcmFtZS0+cGMpOworCisgIGlmICh1ID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuICh1LT5Ub3RhbF9mcmFtZV9zaXplID09IDAgJiYgdS0+c3R1Yl91bndpbmQuc3R1Yl90eXBlID09IDApOworfQorCitDT1JFX0FERFIKK3NhdmVkX3BjX2FmdGVyX2NhbGwgKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIGludCByZXRfcmVnbnVtOworICBDT1JFX0FERFIgcGM7CisgIHN0cnVjdCB1bndpbmRfdGFibGVfZW50cnkgKnU7CisKKyAgcmV0X3JlZ251bSA9IGZpbmRfcmV0dXJuX3JlZ251bSAoZ2V0X2ZyYW1lX3BjIChmcmFtZSkpOworICBwYyA9IHJlYWRfcmVnaXN0ZXIgKHJldF9yZWdudW0pICYgfjB4MzsKKyAgCisgIC8qIElmIFBDIGlzIGluIGEgbGlua2VyIHN0dWIsIHRoZW4gd2UgbmVlZCB0byBkaWcgdGhlIGFkZHJlc3MKKyAgICAgdGhlIHN0dWIgd2lsbCByZXR1cm4gdG8gb3V0IG9mIHRoZSBzdGFjay4gICovCisgIHUgPSBmaW5kX3Vud2luZF9lbnRyeSAocGMpOworICBpZiAodSAmJiB1LT5zdHViX3Vud2luZC5zdHViX3R5cGUgIT0gMCkKKyAgICByZXR1cm4gRlJBTUVfU0FWRURfUEMgKGZyYW1lKTsKKyAgZWxzZQorICAgIHJldHVybiBwYzsKK30KKwwKK0NPUkVfQUREUgoraHBwYV9mcmFtZV9zYXZlZF9wYyAoZnJhbWUpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgQ09SRV9BRERSIHBjID0gZ2V0X2ZyYW1lX3BjIChmcmFtZSk7CisgIHN0cnVjdCB1bndpbmRfdGFibGVfZW50cnkgKnU7CisgIENPUkVfQUREUiBvbGRfcGM7CisgIGludCAgc3B1bl9hcm91bmRfbG9vcCA9IDA7CisgIGludCAgcnBfb2Zmc2V0ID0gMDsKKworICAvKiBCU0QsIEhQVVggJiBPU0YxIGFsbCBsYXkgb3V0IHRoZSBoYXJkd2FyZSBzdGF0ZSBpbiB0aGUgc2FtZSBtYW5uZXIKKyAgICAgYXQgdGhlIGJhc2Ugb2YgdGhlIGZyYW1lIGluIGFuIGludGVycnVwdCBoYW5kbGVyLiAgUmVnaXN0ZXJzIHdpdGhpbgorICAgICBhcmUgc2F2ZWQgaW4gdGhlIGV4YWN0IHNhbWUgb3JkZXIgYXMgR0RCIG51bWJlcnMgcmVnaXN0ZXJzLiAgSG93CisgICAgIGNvbnZpZW5lbnQuICAqLworICBpZiAocGNfaW5faW50ZXJydXB0X2hhbmRsZXIgKHBjKSkKKyAgICByZXR1cm4gcmVhZF9tZW1vcnlfaW50ZWdlciAoZnJhbWUtPmZyYW1lICsgUENfUkVHTlVNICogNCwgNCkgJiB+MHgzOworCisjaWZkZWYgRlJBTUVfU0FWRURfUENfSU5fU0lHVFJBTVAKKyAgLyogRGVhbCB3aXRoIHNpZ25hbCBoYW5kbGVyIGNhbGxlciBmcmFtZXMgdG9vLiAgKi8KKyAgaWYgKGZyYW1lLT5zaWduYWxfaGFuZGxlcl9jYWxsZXIpCisgICAgeworICAgICAgQ09SRV9BRERSIHJwOworICAgICAgRlJBTUVfU0FWRURfUENfSU5fU0lHVFJBTVAgKGZyYW1lLCAmcnApOworICAgICAgcmV0dXJuIHJwICYgfjB4MzsKKyAgICB9CisjZW5kaWYKKworICBpZiAoZnJhbWVsZXNzX2Z1bmN0aW9uX2ludm9jYXRpb24gKGZyYW1lKSkKKyAgICB7CisgICAgICBpbnQgcmV0X3JlZ251bTsKKworICAgICAgcmV0X3JlZ251bSA9IGZpbmRfcmV0dXJuX3JlZ251bSAocGMpOworCisgICAgICAvKiBJZiB0aGUgbmV4dCBmcmFtZSBpcyBhbiBpbnRlcnJ1cHQgZnJhbWUgb3IgYSBzaWduYWwKKwkgaGFuZGxlciBjYWxsZXIsIHRoZW4gd2UgbmVlZCB0byBsb29rIGluIHRoZSBzYXZlZAorCSByZWdpc3RlciBhcmVhIHRvIGdldCB0aGUgcmV0dXJuIHBvaW50ZXIgKHRoZSB2YWx1ZXMKKwkgaW4gdGhlIHJlZ2lzdGVycyBtYXkgbm90IGNvcnJlc3BvbmQgdG8gYW55dGhpbmcgdXNlZnVsKS4gICovCisgICAgICBpZiAoZnJhbWUtPm5leHQgCisJICAmJiAoZnJhbWUtPm5leHQtPnNpZ25hbF9oYW5kbGVyX2NhbGxlcgorCSAgICAgIHx8IHBjX2luX2ludGVycnVwdF9oYW5kbGVyIChmcmFtZS0+bmV4dC0+cGMpKSkKKwl7CisJICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyBzYXZlZF9yZWdzOworCisJICBnZXRfZnJhbWVfc2F2ZWRfcmVncyAoZnJhbWUtPm5leHQsICZzYXZlZF9yZWdzKTsKKwkgIGlmIChyZWFkX21lbW9yeV9pbnRlZ2VyIChzYXZlZF9yZWdzLnJlZ3NbRkxBR1NfUkVHTlVNXSwgNCkgJiAweDIpCisJICAgIHsKKwkgICAgICBwYyA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHNhdmVkX3JlZ3MucmVnc1szMV0sIDQpICYgfjB4MzsKKworCSAgICAgIC8qIFN5c2NhbGxzIGFyZSByZWFsbHkgdHdvIGZyYW1lcy4gIFRoZSBzeXNjYWxsIHN0dWIgaXRzZWxmCisJCSB3aXRoIGEgcmV0dXJuIHBvaW50ZXIgaW4gJXJwIGFuZCB0aGUga2VybmVsIGNhbGwgd2l0aAorCQkgYSByZXR1cm4gcG9pbnRlciBpbiAlcjMxLiAgV2UgcmV0dXJuIHRoZSAlcnAgdmFyaWFudAorCQkgaWYgJXIzMSBpcyB0aGUgc2FtZSBhcyBmcmFtZS0+cGMuICAqLworCSAgICAgIGlmIChwYyA9PSBmcmFtZS0+cGMpCisJCXBjID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoc2F2ZWRfcmVncy5yZWdzW1JQX1JFR05VTV0sIDQpICYgfjB4MzsKKwkgICAgfQorCSAgZWxzZQorCSAgICBwYyA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHNhdmVkX3JlZ3MucmVnc1tSUF9SRUdOVU1dLCA0KSAmIH4weDM7CisJfQorICAgICAgZWxzZQorCXBjID0gcmVhZF9yZWdpc3RlciAocmV0X3JlZ251bSkgJiB+MHgzOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNwdW5fYXJvdW5kX2xvb3AgPSAwOworICAgICAgb2xkX3BjICAgICAgICAgICA9IHBjOworCityZXN0YXJ0OgorICAgICAgcnBfb2Zmc2V0ID0gcnBfc2F2ZWQgKHBjKTsKKworICAgICAgLyogU2ltaWxhciB0byBjb2RlIGluIGZyYW1lbGVzcyBmdW5jdGlvbiBjYXNlLiAgSWYgdGhlIG5leHQKKwkgZnJhbWUgaXMgYSBzaWduYWwgb3IgaW50ZXJydXB0IGhhbmRsZXIsIHRoZW4gZGlnIHRoZSByaWdodAorCSBpbmZvcm1hdGlvbiBvdXQgb2YgdGhlIHNhdmVkIHJlZ2lzdGVyIGluZm8uICAqLworICAgICAgaWYgKHJwX29mZnNldCA9PSAwCisJICAmJiBmcmFtZS0+bmV4dAorCSAgJiYgKGZyYW1lLT5uZXh0LT5zaWduYWxfaGFuZGxlcl9jYWxsZXIKKwkgICAgICB8fCBwY19pbl9pbnRlcnJ1cHRfaGFuZGxlciAoZnJhbWUtPm5leHQtPnBjKSkpCisJeworCSAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3Mgc2F2ZWRfcmVnczsKKworCSAgZ2V0X2ZyYW1lX3NhdmVkX3JlZ3MgKGZyYW1lLT5uZXh0LCAmc2F2ZWRfcmVncyk7CisJICBpZiAocmVhZF9tZW1vcnlfaW50ZWdlciAoc2F2ZWRfcmVncy5yZWdzW0ZMQUdTX1JFR05VTV0sIDQpICYgMHgyKQorCSAgICB7CisJICAgICAgcGMgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChzYXZlZF9yZWdzLnJlZ3NbMzFdLCA0KSAmIH4weDM7CisKKwkgICAgICAvKiBTeXNjYWxscyBhcmUgcmVhbGx5IHR3byBmcmFtZXMuICBUaGUgc3lzY2FsbCBzdHViIGl0c2VsZgorCQkgd2l0aCBhIHJldHVybiBwb2ludGVyIGluICVycCBhbmQgdGhlIGtlcm5lbCBjYWxsIHdpdGgKKwkJIGEgcmV0dXJuIHBvaW50ZXIgaW4gJXIzMS4gIFdlIHJldHVybiB0aGUgJXJwIHZhcmlhbnQKKwkJIGlmICVyMzEgaXMgdGhlIHNhbWUgYXMgZnJhbWUtPnBjLiAgKi8KKwkgICAgICBpZiAocGMgPT0gZnJhbWUtPnBjKQorCQlwYyA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHNhdmVkX3JlZ3MucmVnc1tSUF9SRUdOVU1dLCA0KSAmIH4weDM7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgcGMgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChzYXZlZF9yZWdzLnJlZ3NbUlBfUkVHTlVNXSwgNCkgJiB+MHgzOworCX0KKyAgICAgIGVsc2UgaWYgKHJwX29mZnNldCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgb2xkX3BjID0gcGM7CisgICAgICAgICAgcGMgPSByZWFkX3JlZ2lzdGVyIChSUF9SRUdOVU0pICYgfjB4MzsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgb2xkX3BjID0gcGM7CisgICAgICAgICAgcGMgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChmcmFtZS0+ZnJhbWUgKyBycF9vZmZzZXQsIDQpICYgfjB4MzsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBJZiBQQyBpcyBpbnNpZGUgYSBsaW5rZXIgc3R1YiwgdGhlbiBkaWcgb3V0IHRoZSBhZGRyZXNzIHRoZSBzdHViCisgICAgIHdpbGwgcmV0dXJuIHRvLiAKKworICAgICBEb24ndCBkbyB0aGlzIGZvciBsb25nIGJyYW5jaCBzdHVicy4gIFdoeT8gIEZvciBzb21lIHVua25vd24gcmVhc29uCisgICAgIF9zdGFydCBpcyBtYXJrZWQgYXMgYSBsb25nIGJyYW5jaCBzdHViIGluIGhwdXgxMC4gICovCisgIHUgPSBmaW5kX3Vud2luZF9lbnRyeSAocGMpOworICBpZiAodSAmJiB1LT5zdHViX3Vud2luZC5zdHViX3R5cGUgIT0gMAorICAgICAgJiYgdS0+c3R1Yl91bndpbmQuc3R1Yl90eXBlICE9IExPTkdfQlJBTkNIKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpbnNuOworCisgICAgICAvKiBJZiB0aGlzIGlzIGEgZHluYW1pYyBleGVjdXRhYmxlLCBhbmQgd2UncmUgaW4gYSBzaWduYWwgaGFuZGxlciwKKwkgdGhlbiB0aGUgY2FsbCBjaGFpbiB3aWxsIGV2ZW50dWFsbHkgcG9pbnQgdXMgaW50byB0aGUgc3R1YiBmb3IKKwkgX3NpZ3JldHVybi4gIFVubGlrZSBtb3N0IGNhc2VzLCB3ZSdsbCBiZSBwb2ludGVkIHRvIHRoZSBicmFuY2gKKwkgdG8gdGhlIHJlYWwgc2lncmV0dXJuIHJhdGhlciB0aGFuIHRoZSBjb2RlIGFmdGVyIHRoZSByZWFsIGJyYW5jaCEuIAorCisJIEVsc2UsIHRyeSB0byBkaWcgdGhlIGFkZHJlc3MgdGhlIHN0dWIgd2lsbCByZXR1cm4gdG8gaW4gdGhlIG5vcm1hbAorCSBmYXNoaW9uLiAgKi8KKyAgICAgIGluc24gPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgNCk7CisgICAgICBpZiAoKGluc24gJiAweGZjMDBlMDAwKSA9PSAweGU4MDAwMDAwKQorCXJldHVybiAocGMgKyBleHRyYWN0XzE3IChpbnNuKSArIDgpICYgfjB4MzsKKyAgICAgIGVsc2UKKwl7CisgICAgICAgIGlmIChvbGRfcGMgPT0gcGMpCisgICAgICAgICAgICBzcHVuX2Fyb3VuZF9sb29wKys7CisgICAgICAgIAorICAgICAgICBpZiAoc3B1bl9hcm91bmRfbG9vcCA+IDEpIAorCSAgeworICAgICAgICAgICAvKiBXZSdyZSBqdXN0IGFib3V0IHRvIGdvIGFyb3VuZCB0aGUgbG9vcCBhZ2FpbiB3aXRoCisgICAgICAgICAgICAgIG5vIG1vcmUgaG9wZSBvZiBzdWNjZXNzLiAgRGllLiAqLworICAgICAgICAgICBlcnJvcigiVW5hYmxlIHRvIGZpbmQgcmV0dXJuIHBjIGZvciB0aGlzIGZyYW1lIik7CisJICB9CisgICAgICAgIGVsc2UKKwkgIGdvdG8gcmVzdGFydDsKKwl9CisgICAgfQorCisgIHJldHVybiBwYzsKK30KKwwKKy8qIFdlIG5lZWQgdG8gY29ycmVjdCB0aGUgUEMgYW5kIHRoZSBGUCBmb3IgdGhlIG91dGVybW9zdCBmcmFtZSB3aGVuIHdlIGFyZQorICAgaW4gYSBzeXN0ZW0gY2FsbC4gICovCisKK3ZvaWQKK2luaXRfZXh0cmFfZnJhbWVfaW5mbyAoZnJvbWxlYWYsIGZyYW1lKQorICAgICBpbnQgZnJvbWxlYWY7CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgaW50IGZsYWdzOworICBpbnQgZnJhbWVzaXplOworCisgIGlmIChmcmFtZS0+bmV4dCAmJiAhZnJvbWxlYWYpCisgICAgcmV0dXJuOworCisgIC8qIElmIHRoZSBuZXh0IGZyYW1lIHJlcHJlc2VudHMgYSBmcmFtZWxlc3MgZnVuY3Rpb24gaW52b2NhdGlvbgorICAgICB0aGVuIHdlIGhhdmUgdG8gZG8gc29tZSBhZGp1c3RtZW50cyB0aGF0IGFyZSBub3JtYWxseSBkb25lIGJ5CisgICAgIEZSQU1FX0NIQUlOLiAgKEZSQU1FX0NIQUlOIGlzIG5vdCBjYWxsZWQgaW4gdGhpcyBjYXNlLikgICovCisgIGlmIChmcm9tbGVhZikKKyAgICB7CisgICAgICAvKiBGaW5kIHRoZSBmcmFtZXNpemUgb2YgKnRoaXMqIGZyYW1lIHdpdGhvdXQgcGVla2luZyBhdCB0aGUgUEMKKwkgaW4gdGhlIGN1cnJlbnQgZnJhbWUgc3RydWN0dXJlIChpdCBpc24ndCBzZXQgeWV0KS4gICovCisgICAgICBmcmFtZXNpemUgPSBmaW5kX3Byb2NfZnJhbWVzaXplIChGUkFNRV9TQVZFRF9QQyAoZ2V0X25leHRfZnJhbWUgKGZyYW1lKSkpOworCisgICAgICAvKiBOb3cgYWRqdXN0IG91ciBiYXNlIGZyYW1lIGFjY29yZGluZ2x5LiAgSWYgd2UgaGF2ZSBhIGZyYW1lIHBvaW50ZXIKKwkgdXNlIGl0LCBlbHNlIHN1YnRyYWN0IHRoZSBzaXplIG9mIHRoaXMgZnJhbWUgZnJvbSB0aGUgY3VycmVudAorCSBmcmFtZS4gICh3ZSBhbHdheXMgd2FudCBmcmFtZS0+ZnJhbWUgdG8gcG9pbnQgYXQgdGhlIGxvd2VzdCBhZGRyZXNzCisJIGluIHRoZSBmcmFtZSkuICAqLworICAgICAgaWYgKGZyYW1lc2l6ZSA9PSAtMSkKKwlmcmFtZS0+ZnJhbWUgPSBUQVJHRVRfUkVBRF9GUCAoKTsKKyAgICAgIGVsc2UKKwlmcmFtZS0+ZnJhbWUgLT0gZnJhbWVzaXplOworICAgICAgcmV0dXJuOworICAgIH0KKworICBmbGFncyA9IHJlYWRfcmVnaXN0ZXIgKEZMQUdTX1JFR05VTSk7CisgIGlmIChmbGFncyAmIDIpCS8qIEluIHN5c3RlbSBjYWxsPyAqLworICAgIGZyYW1lLT5wYyA9IHJlYWRfcmVnaXN0ZXIgKDMxKSAmIH4weDM7CisKKyAgLyogVGhlIG91dGVybW9zdCBmcmFtZSBpcyBhbHdheXMgZGVyaXZlZCBmcm9tIFBDLWZyYW1lc2l6ZQorCisgICAgIE9uZSBtaWdodCB0aGluayBmcmFtZWxlc3MgaW5uZXJtb3N0IGZyYW1lcyBzaG91bGQgaGF2ZQorICAgICBhIGZyYW1lLT5mcmFtZSB0aGF0IGlzIHRoZSBzYW1lIGFzIHRoZSBwYXJlbnQncyBmcmFtZS0+ZnJhbWUuCisgICAgIFRoYXQgaXMgd3Jvbmc7IGZyYW1lLT5mcmFtZSBpbiB0aGF0IGNhc2Ugc2hvdWxkIGJlIHRoZSAqaGlnaCoKKyAgICAgYWRkcmVzcyBvZiB0aGUgcGFyZW50J3MgZnJhbWUuICBJdCdzIGNvbXBsaWNhdGVkIGFzIGhlbGwgdG8KKyAgICAgZXhwbGFpbiwgYnV0IHRoZSBwYXJlbnQgKmFsd2F5cyogY3JlYXRlcyBzb21lIHN0YWNrIHNwYWNlIGZvcgorICAgICB0aGUgY2hpbGQuICBTbyB0aGUgY2hpbGQgYWN0dWFsbHkgZG9lcyBoYXZlIGEgZnJhbWUgb2Ygc29tZQorICAgICBzb3J0cywgYW5kIGl0cyBiYXNlIGlzIHRoZSBoaWdoIGFkZHJlc3MgaW4gaXRzIHBhcmVudCdzIGZyYW1lLiAgKi8KKyAgZnJhbWVzaXplID0gZmluZF9wcm9jX2ZyYW1lc2l6ZShmcmFtZS0+cGMpOworICBpZiAoZnJhbWVzaXplID09IC0xKQorICAgIGZyYW1lLT5mcmFtZSA9IFRBUkdFVF9SRUFEX0ZQICgpOworICBlbHNlCisgICAgZnJhbWUtPmZyYW1lID0gcmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKSAtIGZyYW1lc2l6ZTsKK30KKwwKKy8qIEdpdmVuIGEgR0RCIGZyYW1lLCBkZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24ncyBmcmFtZS4KKyAgIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBHREIgZnJhbWUgc3RydWN0LCBhbmQgdGhlbgorICAgSU5JVF9FWFRSQV9GUkFNRV9JTkZPIGFuZCBJTklUX0ZSQU1FX1BDIHdpbGwgYmUgY2FsbGVkIGZvciB0aGUgbmV3IGZyYW1lLgorCisgICBUaGlzIG1heSBpbnZvbHZlIHNlYXJjaGluZyB0aHJvdWdoIHByb2xvZ3VlcyBmb3Igc2V2ZXJhbCBmdW5jdGlvbnMKKyAgIGF0IGJvdW5kYXJpZXMgd2hlcmUgR0NDIGNhbGxzIEhQIEMgY29kZSwgb3Igd2hlcmUgY29kZSB3aGljaCBoYXMKKyAgIGEgZnJhbWUgcG9pbnRlciBjYWxscyBjb2RlIHdpdGhvdXQgYSBmcmFtZSBwb2ludGVyLiAgKi8KKworQ09SRV9BRERSCitmcmFtZV9jaGFpbiAoZnJhbWUpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgaW50IG15X2ZyYW1lc2l6ZSwgY2FsbGVyX2ZyYW1lc2l6ZTsKKyAgc3RydWN0IHVud2luZF90YWJsZV9lbnRyeSAqdTsKKyAgQ09SRV9BRERSIGZyYW1lX2Jhc2U7CisgIHN0cnVjdCBmcmFtZV9pbmZvICp0bXBfZnJhbWU7CisKKyAgQ09SRV9BRERSICBjYWxsZXJfcGM7CisKKyAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptaW5fZnJhbWVfc3ltYm9sOworICBzdHJ1Y3Qgc3ltYm9sICAgICAgICAgKmZyYW1lX3N5bWJvbDsKKyAgY2hhciAgICAgICAgICAgICAgICAgICpmcmFtZV9zeW1ib2xfbmFtZTsKKworICAvKiBJZiB0aGlzIGlzIGEgdGhyZWFkZWQgYXBwbGljYXRpb24sIGFuZCB3ZSBzZWUgdGhlCisgICAgIHJvdXRpbmUgIl9fcHRocmVhZF9leGl0IiwgdHJlYXQgaXQgYXMgdGhlIHN0YWNrIHJvb3QKKyAgICAgZm9yIHRoaXMgdGhyZWFkLiAqLworICBtaW5fZnJhbWVfc3ltYm9sICA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbF9ieV9wYyAoZnJhbWUtPnBjKTsKKyAgZnJhbWVfc3ltYm9sICAgICAgPSBmaW5kX3BjX2Z1bmN0aW9uKGZyYW1lLT5wYyk7CisKKyAgaWYgKChtaW5fZnJhbWVfc3ltYm9sICE9IDApIC8qICYmIChmcmFtZV9zeW1ib2wgPT0gMCkgKi8pCisgICAgeworICAgIC8qIFRoZSB0ZXN0IGFib3ZlIGZvciAibm8gdXNlciBmdW5jdGlvbiBuYW1lIiB3b3VsZCBkZWZlbmQKKyAgICAgICBhZ2FpbnN0IHRoZSBzbGltIGxpa2VsaWhvb2QgdGhhdCBhIHVzZXIgbWlnaHQgZGVmaW5lIGEKKyAgICAgICByb3V0aW5lIG5hbWVkICJfX3B0aHJlYWRfZXhpdCIgYW5kIHRoZW4gdHJ5IHRvIGRlYnVnIGl0LgorCisgICAgICAgSWYgaXQgd2VyZW4ndCBjb21tZW50ZWQgb3V0LCBhbmQgeW91IHRyaWVkIHRvIGRlYnVnIHRoZQorICAgICAgIHB0aHJlYWQgbGlicmFyeSBpdHNlbGYsIHlvdSdkIGdldCBlcnJvcnMuCisgICAgICAKKyAgICAgICBTbyBmb3IgdG9kYXksIHdlIGRvbid0IG1ha2UgdGhhdCBjaGVjay4gKi8KKyAgICBmcmFtZV9zeW1ib2xfbmFtZSA9IFNZTUJPTF9OQU1FKG1pbl9mcmFtZV9zeW1ib2wpOworICAgIGlmIChmcmFtZV9zeW1ib2xfbmFtZSAhPSAwKSB7CisgICAgICBpZiAoMCA9PSBzdHJuY21wKGZyYW1lX3N5bWJvbF9uYW1lLAorCQkgICAgICAgVEhSRUFEX0lOSVRJQUxfRlJBTUVfU1lNQk9MLAorCQkgICAgICAgVEhSRUFEX0lOSVRJQUxfRlJBTUVfU1lNX0xFTikpIHsKKyAgICAgICAgIC8qIFByZXRlbmQgd2UndmUgcmVhY2hlZCB0aGUgYm90dG9tIG9mIHRoZSBzdGFjay4gKi8KKyAgICAgICAgIHJldHVybiAoQ09SRV9BRERSKSAwOworICAgICAgICAgfQorICAgICAgIH0gIAorICAgIH0gIC8qIEVuZCBvZiBoYWNreSBjb2RlIGZvciB0aHJlYWRzLiAqLworICAgIAorICAvKiBIYW5kbGUgSFBVWCwgQlNELCBhbmQgT1NGMSBzdHlsZSBpbnRlcnJ1cHQgZnJhbWVzIGZpcnN0LiAgVGhlc2UKKyAgICAgYXJlIGVhc3k7IGF0ICpzcCB3ZSBoYXZlIGEgZnVsbCBzYXZlIHN0YXRlIHN0cnVjdXRyZSB3aGljaCB3ZSBjYW4KKyAgICAgcHVsbCB0aGUgb2xkIHN0YWNrIHBvaW50ZXIgZnJvbS4gIEFsc28gc2VlIGZyYW1lX3NhdmVkX3BjIGZvcgorICAgICBjb2RlIHRvIGRpZyBhIHNhdmVkIFBDIG91dCBvZiB0aGUgc2F2ZSBzdGF0ZSBzdHJ1Y3R1cmUuICAqLworICBpZiAocGNfaW5faW50ZXJydXB0X2hhbmRsZXIgKGZyYW1lLT5wYykpCisgICAgZnJhbWVfYmFzZSA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKGZyYW1lLT5mcmFtZSArIFNQX1JFR05VTSAqIDQsIDQpOworI2lmZGVmIEZSQU1FX0JBU0VfQkVGT1JFX1NJR1RSQU1QCisgIGVsc2UgaWYgKGZyYW1lLT5zaWduYWxfaGFuZGxlcl9jYWxsZXIpCisgICAgeworICAgICAgRlJBTUVfQkFTRV9CRUZPUkVfU0lHVFJBTVAgKGZyYW1lLCAmZnJhbWVfYmFzZSk7CisgICAgfQorI2VuZGlmCisgIGVsc2UKKyAgICBmcmFtZV9iYXNlID0gZnJhbWUtPmZyYW1lOworCisgIC8qIEdldCBmcmFtZSBzaXplcyBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgYW5kIHRoZSBmcmFtZSBvZiB0aGUgCisgICAgIGNhbGxlci4gICovCisgIG15X2ZyYW1lc2l6ZSA9IGZpbmRfcHJvY19mcmFtZXNpemUgKGZyYW1lLT5wYyk7CisgIGNhbGxlcl9wYyA9IEZSQU1FX1NBVkVEX1BDKGZyYW1lKTsKKworICAvKiBJZiB3ZSBjYW4ndCBkZXRlcm1pbmUgdGhlIGNhbGxlcidzIFBDLCB0aGVuIGl0J3Mgbm90IGxpa2VseSB3ZSBjYW4KKyAgICAgcmVhbGx5IGRldGVybWluZSBhbnl0aGluZyBtZWFuaW5nZnVsIGFib3V0IGl0cyBmcmFtZS4gIFdlJ2xsIGNvbnNpZGVyCisgICAgIHRoaXMgdG8gYmUgc3RhY2sgYm90dG9tLiAqLworICBpZiAoY2FsbGVyX3BjID09IChDT1JFX0FERFIpIDApCisgICAgcmV0dXJuIChDT1JFX0FERFIpIDA7CisKKyAgY2FsbGVyX2ZyYW1lc2l6ZSA9IGZpbmRfcHJvY19mcmFtZXNpemUgKEZSQU1FX1NBVkVEX1BDKGZyYW1lKSk7CisKKyAgLyogSWYgY2FsbGVyIGRvZXMgbm90IGhhdmUgYSBmcmFtZSBwb2ludGVyLCB0aGVuIGl0cyBmcmFtZQorICAgICBjYW4gYmUgZm91bmQgYXQgY3VycmVudF9mcmFtZSAtIGNhbGxlcl9mcmFtZXNpemUuICAqLworICBpZiAoY2FsbGVyX2ZyYW1lc2l6ZSAhPSAtMSkKKyAgICB7CisgICAgICByZXR1cm4gZnJhbWVfYmFzZSAtIGNhbGxlcl9mcmFtZXNpemU7CisgICAgfQorICAvKiBCb3RoIGNhbGxlciBhbmQgY2FsbGVlIGhhdmUgZnJhbWUgcG9pbnRlcnMgYW5kIGFyZSBHQ0MgY29tcGlsZWQKKyAgICAgKFNBVkVfU1AgYml0IGluIHVud2luZCBkZXNjcmlwdG9yIGlzIG9uIGZvciBib3RoIGZ1bmN0aW9ucy4KKyAgICAgVGhlIHByZXZpb3VzIGZyYW1lIHBvaW50ZXIgaXMgZm91bmQgYXQgdGhlIHRvcCBvZiB0aGUgY3VycmVudCBmcmFtZS4gICovCisgIGlmIChjYWxsZXJfZnJhbWVzaXplID09IC0xICYmIG15X2ZyYW1lc2l6ZSA9PSAtMSkKKyAgICB7CisgICAgICByZXR1cm4gcmVhZF9tZW1vcnlfaW50ZWdlciAoZnJhbWVfYmFzZSwgNCk7CisgICAgfQorICAvKiBDYWxsZXIgaGFzIGEgZnJhbWUgcG9pbnRlciwgYnV0IGNhbGxlZSBkb2VzIG5vdC4gIFRoaXMgaXMgYSBsaXR0bGUKKyAgICAgbW9yZSBkaWZmaWN1bHQgYXMgR0NDIGFuZCBIUCBDIGxheSBvdXQgbG9jYWxzIGFuZCBjYWxsZWUgcmVnaXN0ZXIgc2F2ZQorICAgICBhcmVhcyB2ZXJ5IGRpZmZlcmVudGx5LgorCisgICAgIFRoZSBwcmV2aW91cyBmcmFtZSBwb2ludGVyIGNvdWxkIGJlIGluIGEgcmVnaXN0ZXIsIG9yIGluIG9uZSBvZiAKKyAgICAgc2V2ZXJhbCBhcmVhcyBvbiB0aGUgc3RhY2suCisKKyAgICAgV2FsayBmcm9tIHRoZSBjdXJyZW50IGZyYW1lIHRvIHRoZSBpbm5lcm1vc3QgZnJhbWUgZXhhbWluaW5nIAorICAgICB1bndpbmQgZGVzY3JpcHRvcnMgdG8gZGV0ZXJtaW5lIGlmICVyMyBldmVyIGdldHMgc2F2ZWQgaW50byB0aGUKKyAgICAgc3RhY2suICBJZiBzbyByZXR1cm4gd2hhdGV2ZXIgdmFsdWUgZ290IHNhdmVkIGludG8gdGhlIHN0YWNrLgorICAgICBJZiBpdCB3YXMgbmV2ZXIgc2F2ZWQgaW4gdGhlIHN0YWNrLCB0aGVuIHRoZSB2YWx1ZSBpbiAlcjMgaXMgc3RpbGwKKyAgICAgdmFsaWQsIHNvIHVzZSBpdC4gCisKKyAgICAgV2UgdXNlIGluZm9ybWF0aW9uIGZyb20gdW53aW5kIGRlc2NyaXB0b3JzIHRvIGRldGVybWluZSBpZiAlcjMKKyAgICAgaXMgc2F2ZWQgaW50byB0aGUgc3RhY2sgKEVudHJ5X0dSIGZpZWxkIGhhcyB0aGlzIGluZm9ybWF0aW9uKS4gICovCisKKyAgdG1wX2ZyYW1lID0gZnJhbWU7CisgIHdoaWxlICh0bXBfZnJhbWUpCisgICAgeworICAgICAgdSA9IGZpbmRfdW53aW5kX2VudHJ5ICh0bXBfZnJhbWUtPnBjKTsKKworICAgICAgaWYgKCF1KQorCXsKKwkgIC8qIFdlIGNvdWxkIGZpbmQgdGhpcyBpbmZvcm1hdGlvbiBieSBleGFtaW5pbmcgcHJvbG9ndWVzLiAgSSBkb24ndAorCSAgICAgdGhpbmsgYW55b25lIGhhcyBhY3R1YWxseSB3cml0dGVuIGFueSB0b29scyAobm90IGV2ZW4gInN0cmlwIikKKwkgICAgIHdoaWNoIGxlYXZlIHRoZW0gb3V0IG9mIGFuIGV4ZWN1dGFibGUsIHNvIG1heWJlIHRoaXMgaXMgYSBtb290CisJICAgICBwb2ludC4gICovCisgICAgICAgICAgLyogPz9yZWhyYXVlcjogQWN0dWFsbHksIGl0J3MgcXVpdGUgcG9zc2libGUgdG8gc3RlcGkgeW91ciB3YXkgaW50bworICAgICAgICAgICAgIGNvZGUgdGhhdCBkb2Vzbid0IGhhdmUgdW53aW5kIGVudHJpZXMuICBGb3IgZXhhbXBsZSwgc3RlcHBpbmcgaW50bworICAgICAgICAgICAgIHRoZSBkeW5hbWljIGxpbmtlciB3aWxsIGdpdmUgeW91IGEgUEMgdGhhdCBoYXMgbm9uZS4gIFRodXMsIEkndmUKKyAgICAgICAgICAgICBkaXNhYmxlZCB0aGlzIHdhcm5pbmcuICovCisjaWYgMAorCSAgd2FybmluZyAoIlVuYWJsZSB0byBmaW5kIHVud2luZCBmb3IgUEMgMHgleCAtLSBIZWxwISIsIHRtcF9mcmFtZS0+cGMpOworI2VuZGlmCisJICByZXR1cm4gKENPUkVfQUREUikgMDsKKwl9CisKKyAgICAgIC8qIEVudHJ5X0dSIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNhbGxlZS1zYXZlZCBnZW5lcmFsIHJlZ2lzdGVycworCSBzYXZlZCBpbiB0aGUgc3RhY2suICBJdCBzdGFydHMgYXQgJXIzLCBzbyAlcjMgd291bGQgYmUgMS4gICovCisgICAgICBpZiAodS0+RW50cnlfR1IgPj0gMSB8fCB1LT5TYXZlX1NQCisJICB8fCB0bXBfZnJhbWUtPnNpZ25hbF9oYW5kbGVyX2NhbGxlcgorCSAgfHwgcGNfaW5faW50ZXJydXB0X2hhbmRsZXIgKHRtcF9mcmFtZS0+cGMpKQorCWJyZWFrOworICAgICAgZWxzZQorCXRtcF9mcmFtZSA9IHRtcF9mcmFtZS0+bmV4dDsKKyAgICB9CisKKyAgaWYgKHRtcF9mcmFtZSkKKyAgICB7CisgICAgICAvKiBXZSBtYXkgaGF2ZSB3YWxrZWQgZG93biB0aGUgY2hhaW4gaW50byBhIGZ1bmN0aW9uIHdpdGggYSBmcmFtZQorCSBwb2ludGVyLiAgKi8KKyAgICAgIGlmICh1LT5TYXZlX1NQCisJICAmJiAhdG1wX2ZyYW1lLT5zaWduYWxfaGFuZGxlcl9jYWxsZXIKKwkgICYmICFwY19pbl9pbnRlcnJ1cHRfaGFuZGxlciAodG1wX2ZyYW1lLT5wYykpCisJeworCSAgcmV0dXJuIHJlYWRfbWVtb3J5X2ludGVnZXIgKHRtcF9mcmFtZS0+ZnJhbWUsIDQpOworCX0KKyAgICAgIC8qICVyMyB3YXMgc2F2ZWQgc29tZXdoZXJlIGluIHRoZSBzdGFjay4gIERpZyBpdCBvdXQuICAqLworICAgICAgZWxzZSAKKwl7CisJICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyBzYXZlZF9yZWdzOworCisJICAvKiBTaWNrLgorCisJICAgICBGb3Igb3B0aW1pemF0aW9uIHB1cnBvc2VzIG1hbnkga2VybmVscyBkb24ndCBoYXZlIHRoZQorCSAgICAgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycyBpbnRvIHRoZSBzYXZlX3N0YXRlIHN0cnVjdHVyZSB1cG9uCisJICAgICBlbnRyeSBpbnRvIHRoZSBrZXJuZWwgZm9yIGEgc3lzY2FsbDsgdGhlIG9wdGltaXphdGlvbgorCSAgICAgaXMgdXN1YWxseSB0dXJuZWQgb2ZmIGlmIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHRyYWNlZCBzbworCSAgICAgdGhhdCB0aGUgZGVidWdnZXIgY2FuIGdldCBmdWxsIHJlZ2lzdGVyIHN0YXRlIGZvciB0aGUKKwkgICAgIHByb2Nlc3MuCisJICAgICAgCisJICAgICBUaGlzIHNjaGVtZSB3b3JrcyB3ZWxsIGV4Y2VwdCBmb3IgdHdvIGNhc2VzOgorCisJICAgICAgICogQXR0YWNoaW5nIHRvIGEgcHJvY2VzcyB3aGVuIHRoZSBwcm9jZXNzIGlzIGluIHRoZQorCSAgICAgICBrZXJuZWwgcGVyZm9ybWluZyBhIHN5c3RlbSBjYWxsIChkZWJ1Z2dlciBjYW4ndCBnZXQKKwkgICAgICAgZnVsbCByZWdpc3RlciBzdGF0ZSBmb3IgdGhlIGluZmVyaW9yIHByb2Nlc3Mgc2luY2UKKwkgICAgICAgdGhlIHByb2Nlc3Mgd2Fzbid0IGJlaW5nIHRyYWNlZCB3aGVuIGl0IGVudGVyZWQgdGhlCisJICAgICAgIHN5c3RlbSBjYWxsKS4KKworCSAgICAgICAqIFJlZ2lzdGVyIHN0YXRlIGlzIG5vdCBjb21wbGV0ZSBpZiB0aGUgc3lzdGVtIGNhbGwKKwkgICAgICAgY2F1c2VzIHRoZSBwcm9jZXNzIHRvIGNvcmUgZHVtcC4KKworCisJICAgICBUaGUgZm9sbG93aW5nIGhlaW5vdXMgY29kZSBpcyBhbiBhdHRlbXB0IHRvIGRlYWwgd2l0aAorCSAgICAgdGhlIGxhY2sgb2YgcmVnaXN0ZXIgc3RhdGUgaW4gYSBjb3JlIGR1bXAuICBJdCB3aWxsCisJICAgICBmYWlsIG1pc2VyYWJseSBpZiB0aGUgZnVuY3Rpb24gd2hpY2ggcGVyZm9ybXMgdGhlCisJICAgICBzeXN0ZW0gY2FsbCBoYXMgYSB2YXJpYWJsZSBzaXplZCBzdGFjayBmcmFtZS4gICovCisKKwkgIGdldF9mcmFtZV9zYXZlZF9yZWdzICh0bXBfZnJhbWUsICZzYXZlZF9yZWdzKTsKKworCSAgLyogQWJvbWluYWJsZSBoYWNrLiAgKi8KKwkgIGlmIChjdXJyZW50X3RhcmdldC50b19oYXNfZXhlY3V0aW9uID09IDAKKwkgICAgICAmJiAoKHNhdmVkX3JlZ3MucmVnc1tGTEFHU19SRUdOVU1dCisJICAgICAgICAgICAmJiAocmVhZF9tZW1vcnlfaW50ZWdlciAoc2F2ZWRfcmVncy5yZWdzW0ZMQUdTX1JFR05VTV0sIDQpCisJCSAgICAgICAmIDB4MikpCisJCSAgfHwgKHNhdmVkX3JlZ3MucmVnc1tGTEFHU19SRUdOVU1dID09IDAKKwkJICAgICAgJiYgcmVhZF9yZWdpc3RlciAoRkxBR1NfUkVHTlVNKSAmIDB4MikpKQorCSAgICB7CisJICAgICAgdSA9IGZpbmRfdW53aW5kX2VudHJ5IChGUkFNRV9TQVZFRF9QQyAoZnJhbWUpKTsKKwkgICAgICBpZiAoIXUpCisJCXsKKwkJICByZXR1cm4gcmVhZF9tZW1vcnlfaW50ZWdlciAoc2F2ZWRfcmVncy5yZWdzW0ZQX1JFR05VTV0sIDQpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgcmV0dXJuIGZyYW1lX2Jhc2UgLSAodS0+VG90YWxfZnJhbWVfc2l6ZSA8PCAzKTsKKwkJfQorCSAgICB9CisJCisJICByZXR1cm4gcmVhZF9tZW1vcnlfaW50ZWdlciAoc2F2ZWRfcmVncy5yZWdzW0ZQX1JFR05VTV0sIDQpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyBzYXZlZF9yZWdzOworCisgICAgICAvKiBHZXQgdGhlIGlubmVybW9zdCBmcmFtZS4gICovCisgICAgICB0bXBfZnJhbWUgPSBmcmFtZTsKKyAgICAgIHdoaWxlICh0bXBfZnJhbWUtPm5leHQgIT0gTlVMTCkKKwl0bXBfZnJhbWUgPSB0bXBfZnJhbWUtPm5leHQ7CisKKyAgICAgIGdldF9mcmFtZV9zYXZlZF9yZWdzICh0bXBfZnJhbWUsICZzYXZlZF9yZWdzKTsKKyAgICAgIC8qIEFib21pbmFibGUgaGFjay4gIFNlZSBhYm92ZS4gICovCisgICAgICBpZiAoY3VycmVudF90YXJnZXQudG9faGFzX2V4ZWN1dGlvbiA9PSAwCisJICAmJiAoKHNhdmVkX3JlZ3MucmVnc1tGTEFHU19SRUdOVU1dCisJICAgICAgICYmIChyZWFkX21lbW9yeV9pbnRlZ2VyIChzYXZlZF9yZWdzLnJlZ3NbRkxBR1NfUkVHTlVNXSwgNCkKKwkJICAgJiAweDIpKQorCSAgICAgIHx8IChzYXZlZF9yZWdzLnJlZ3NbRkxBR1NfUkVHTlVNXSA9PSAwCisJCSAgJiYgcmVhZF9yZWdpc3RlciAoRkxBR1NfUkVHTlVNKSAgJiAweDIpKSkKKwl7CisJICB1ID0gZmluZF91bndpbmRfZW50cnkgKEZSQU1FX1NBVkVEX1BDIChmcmFtZSkpOworCSAgaWYgKCF1KQorCSAgICB7CisJICAgICAgcmV0dXJuIHJlYWRfbWVtb3J5X2ludGVnZXIgKHNhdmVkX3JlZ3MucmVnc1tGUF9SRUdOVU1dLCA0KTsKKwkgICAgfQorCSAgIGVsc2UKKwkgICAgIHsKKwkgICAgICAgcmV0dXJuIGZyYW1lX2Jhc2UgLSAodS0+VG90YWxfZnJhbWVfc2l6ZSA8PCAzKTsKKwkgICAgIH0KKwl9CisJCisgICAgICAvKiBUaGUgdmFsdWUgaW4gJXIzIHdhcyBuZXZlciBzYXZlZCBpbnRvIHRoZSBzdGFjayAodGh1cyAlcjMgc3RpbGwKKwkgaG9sZHMgdGhlIHZhbHVlIG9mIHRoZSBwcmV2aW91cyBmcmFtZSBwb2ludGVyKS4gICovCisgICAgICByZXR1cm4gVEFSR0VUX1JFQURfRlAgKCk7CisgICAgfQorfQorCisMCisvKiBUbyBzZWUgaWYgYSBmcmFtZSBjaGFpbiBpcyB2YWxpZCwgc2VlIGlmIHRoZSBjYWxsZXIgbG9va3MgbGlrZSBpdAorICAgd2FzIGNvbXBpbGVkIHdpdGggZ2NjLiAqLworCitpbnQKK2hwcGFfZnJhbWVfY2hhaW5fdmFsaWQgKGNoYWluLCB0aGlzZnJhbWUpCisgICAgIENPUkVfQUREUiBjaGFpbjsKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKnRoaXNmcmFtZTsKK3sKKyAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltX3VzOworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1fc3RhcnQ7CisgIHN0cnVjdCB1bndpbmRfdGFibGVfZW50cnkgKnUsICpuZXh0X3UgPSBOVUxMOworICBzdHJ1Y3QgZnJhbWVfaW5mbyAqbmV4dDsKKworICBpZiAoIWNoYWluKQorICAgIHJldHVybiAwOworCisgIHUgPSBmaW5kX3Vud2luZF9lbnRyeSAodGhpc2ZyYW1lLT5wYyk7CisKKyAgaWYgKHUgPT0gTlVMTCkKKyAgICByZXR1cm4gMTsKKworICAvKiBXZSBjYW4ndCBqdXN0IGNoZWNrIHRoYXQgdGhlIHNhbWUgb2YgbXN5bV91cyBpcyAiX3N0YXJ0IiwgYmVjYXVzZQorICAgICBzb21lb25lIGlkaW90aWNhbGx5IGRlY2lkZWQgdGhhdCB0aGV5IHdlcmUgZ29pbmcgdG8gbWFrZSBhIEx0ZXh0X2VuZAorICAgICBzeW1ib2wgd2l0aCB0aGUgc2FtZSBhZGRyZXNzLiAgVGhpcyBMdGV4dF9lbmQgc3ltYm9sIGlzIHRvdGFsbHkKKyAgICAgaW5kaXN0aW5ndWlzaGFibGUgKGFzIG5lYXJseSBhcyBJIGNhbiB0ZWxsKSBmcm9tIHRoZSBzeW1ib2wgZm9yIGEgZnVuY3Rpb24KKyAgICAgd2hpY2ggaXMgKGxlZ2l0aW1hdGVseSwgc2luY2UgaXQgaXMgaW4gdGhlIHVzZXIncyBuYW1lc3BhY2UpCisgICAgIG5hbWVkIEx0ZXh0X2VuZCwgc28gd2UgY2FuJ3QganVzdCBpZ25vcmUgaXQuICAqLworICBtc3ltX3VzID0gbG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjIChGUkFNRV9TQVZFRF9QQyAodGhpc2ZyYW1lKSk7CisgIG1zeW1fc3RhcnQgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKCJfc3RhcnQiLCBOVUxMLCBOVUxMKTsKKyAgaWYgKG1zeW1fdXMKKyAgICAgICYmIG1zeW1fc3RhcnQKKyAgICAgICYmIFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltX3VzKSA9PSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bV9zdGFydCkpCisgICAgcmV0dXJuIDA7CisKKyAgLyogR3JycnIuICBTb21lIG5ldyBpZGlvdCBkZWNpZGVkIHRoYXQgdGhleSBkb24ndCB3YW50IF9zdGFydCBmb3IgdGhlCisgICAgIFBSTyBjb25maWd1cmF0aW9uczsgJFNUQVJUJCBjYWxscyBtYWluIGRpcmVjdGx5Li4uLiAgRGVhbCB3aXRoIGl0LiAgKi8KKyAgbXN5bV9zdGFydCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoIiRTVEFSVCQiLCBOVUxMLCBOVUxMKTsKKyAgaWYgKG1zeW1fdXMKKyAgICAgICYmIG1zeW1fc3RhcnQKKyAgICAgICYmIFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltX3VzKSA9PSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bV9zdGFydCkpCisgICAgcmV0dXJuIDA7CisKKyAgbmV4dCA9IGdldF9uZXh0X2ZyYW1lICh0aGlzZnJhbWUpOworICBpZiAobmV4dCkKKyAgICBuZXh0X3UgPSBmaW5kX3Vud2luZF9lbnRyeSAobmV4dC0+cGMpOworCisgIC8qIElmIHRoaXMgZnJhbWUgZG9lcyBub3Qgc2F2ZSBTUCwgaGFzIG5vIHN0YWNrLCBpc24ndCBhIHN0dWIsCisgICAgIGFuZCBkb2Vzbid0ICJjYWxsIiBhbiBpbnRlcnJ1cHQgcm91dGluZSBvciBzaWduYWwgaGFuZGxlciBjYWxsZXIsCisgICAgIHRoZW4gaXRzIG5vdCB2YWxpZC4gICovCisgIGlmICh1LT5TYXZlX1NQIHx8IHUtPlRvdGFsX2ZyYW1lX3NpemUgfHwgdS0+c3R1Yl91bndpbmQuc3R1Yl90eXBlICE9IDAKKyAgICAgIHx8ICh0aGlzZnJhbWUtPm5leHQgJiYgdGhpc2ZyYW1lLT5uZXh0LT5zaWduYWxfaGFuZGxlcl9jYWxsZXIpCisgICAgICB8fCAobmV4dF91ICYmIG5leHRfdS0+SFBfVVhfaW50ZXJydXB0X21hcmtlcikpCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKHBjX2luX2xpbmtlcl9zdHViICh0aGlzZnJhbWUtPnBjKSkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworLyoKKyAgIFRoZXNlIGZ1bmN0aW9ucyBkZWFsIHdpdGggc2F2aW5nIGFuZCByZXN0b3JpbmcgcmVnaXN0ZXIgc3RhdGUKKyAgIGFyb3VuZCBhIGZ1bmN0aW9uIGNhbGwgaW4gdGhlIGluZmVyaW9yLiBUaGV5IGtlZXAgdGhlIHN0YWNrCisgICBkb3VibGUtd29yZCBhbGlnbmVkOyBldmVudHVhbGx5LCBvbiBhbiBocDcwMCwgdGhlIHN0YWNrIHdpbGwgaGF2ZQorICAgdG8gYmUgYWxpZ25lZCB0byBhIDY0LWJ5dGUgYm91bmRhcnkuICovCisKK3ZvaWQKK3B1c2hfZHVtbXlfZnJhbWUgKGluZl9zdGF0dXMpCisgICAgIHN0cnVjdCBpbmZlcmlvcl9zdGF0dXMgKmluZl9zdGF0dXM7Cit7CisgIENPUkVfQUREUiBzcCwgcGMsIHBjc3BhY2U7CisgIHJlZ2lzdGVyIGludCByZWdudW07CisgIGludCBpbnRfYnVmZmVyOworICBkb3VibGUgZnJlZ19idWZmZXI7CisKKyAgLyogT2gsIHdoYXQgYSBoYWNrLiAgSWYgd2UncmUgdHJ5aW5nIHRvIHBlcmZvcm0gYW4gaW5mZXJpb3IgY2FsbAorICAgICB3aGlsZSB0aGUgaW5mZXJpb3IgaXMgYXNsZWVwLCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0byBjbGVhcgorICAgICB0aGUgImluIHN5c3RlbSBjYWxsIiBiaXQgaW4gdGhlIGZsYWcgcmVnaXN0ZXIgKHRoZSBjYWxsIHdpbGwKKyAgICAgc3RhcnQgYWZ0ZXIgdGhlIHN5c2NhbGwgcmV0dXJucywgc28gd2UncmUgbm8gbG9uZ2VyIGluIHRoZSBzeXN0ZW0KKyAgICAgY2FsbCEpICBUaGlzIHN0YXRlIGlzIGtlcHQgaW4gImluZl9zdGF0dXMiLCBjaGFuZ2UgaXQgdGhlcmUuCisKKyAgICAgV2UgYWxzbyBuZWVkIGEgbnVtYmVyIG9mIGhvcnJpZCBoYWNrcyB0byBkZWFsIHdpdGggbG9zc2FnZSBpbiB0aGUKKyAgICAgUEMgcXVldWUgcmVnaXN0ZXJzIChhcHBhcmVudGx5IHRoZXkncmUgbm90IHZhbGlkIHdoZW4gdGhlIGluIHN5c2NhbGwKKyAgICAgYml0IGlzIHNldCkuICAqLworICBwYyA9IHRhcmdldF9yZWFkX3BjIChpbmZlcmlvcl9waWQpOworICBpbnRfYnVmZmVyID0gcmVhZF9yZWdpc3RlciAoRkxBR1NfUkVHTlVNKTsKKyAgaWYgKGludF9idWZmZXIgJiAweDIpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IHNpZDsKKyAgICAgIGludF9idWZmZXIgJj0gfjB4MjsKKyAgICAgIG1lbWNweSAoaW5mX3N0YXR1cy0+cmVnaXN0ZXJzLCAmaW50X2J1ZmZlciwgNCk7CisgICAgICBtZW1jcHkgKGluZl9zdGF0dXMtPnJlZ2lzdGVycyArIFJFR0lTVEVSX0JZVEUgKFBDT1FfSEVBRF9SRUdOVU0pLCAmcGMsIDQpOworICAgICAgcGMgKz0gNDsKKyAgICAgIG1lbWNweSAoaW5mX3N0YXR1cy0+cmVnaXN0ZXJzICsgUkVHSVNURVJfQllURSAoUENPUV9UQUlMX1JFR05VTSksICZwYywgNCk7CisgICAgICBwYyAtPSA0OworICAgICAgc2lkID0gKHBjID4+IDMwKSAmIDB4MzsKKyAgICAgIGlmIChzaWQgPT0gMCkKKwlwY3NwYWNlID0gcmVhZF9yZWdpc3RlciAoU1I0X1JFR05VTSk7CisgICAgICBlbHNlCisJcGNzcGFjZSA9IHJlYWRfcmVnaXN0ZXIgKFNSNF9SRUdOVU0gKyA0ICsgc2lkKTsKKyAgICAgIG1lbWNweSAoaW5mX3N0YXR1cy0+cmVnaXN0ZXJzICsgUkVHSVNURVJfQllURSAoUENTUV9IRUFEX1JFR05VTSksCisJICAgICAgJnBjc3BhY2UsIDQpOworICAgICAgbWVtY3B5IChpbmZfc3RhdHVzLT5yZWdpc3RlcnMgKyBSRUdJU1RFUl9CWVRFIChQQ1NRX1RBSUxfUkVHTlVNKSwKKwkgICAgICAmcGNzcGFjZSwgNCk7CisgICAgfQorICBlbHNlCisgICAgcGNzcGFjZSA9IHJlYWRfcmVnaXN0ZXIgKFBDU1FfSEVBRF9SRUdOVU0pOworCisgIC8qIFNwYWNlIGZvciAiYXJndW1lbnRzIjsgdGhlIFJQIGdvZXMgaW4gaGVyZS4gKi8KKyAgc3AgPSByZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pICsgNDg7CisgIGludF9idWZmZXIgPSByZWFkX3JlZ2lzdGVyIChSUF9SRUdOVU0pIHwgMHgzOworICB3cml0ZV9tZW1vcnkgKHNwIC0gMjAsIChjaGFyICopJmludF9idWZmZXIsIDQpOworCisgIGludF9idWZmZXIgPSBUQVJHRVRfUkVBRF9GUCAoKTsKKyAgd3JpdGVfbWVtb3J5IChzcCwgKGNoYXIgKikmaW50X2J1ZmZlciwgNCk7CisKKyAgd3JpdGVfcmVnaXN0ZXIgKEZQX1JFR05VTSwgc3ApOworCisgIHNwICs9IDg7CisKKyAgZm9yIChyZWdudW0gPSAxOyByZWdudW0gPCAzMjsgcmVnbnVtKyspCisgICAgaWYgKHJlZ251bSAhPSBSUF9SRUdOVU0gJiYgcmVnbnVtICE9IEZQX1JFR05VTSkKKyAgICAgIHNwID0gcHVzaF93b3JkIChzcCwgcmVhZF9yZWdpc3RlciAocmVnbnVtKSk7CisKKyAgc3AgKz0gNDsKKworICBmb3IgKHJlZ251bSA9IEZQMF9SRUdOVU07IHJlZ251bSA8IE5VTV9SRUdTOyByZWdudW0rKykKKyAgICB7CisgICAgICByZWFkX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFIChyZWdudW0pLCAoY2hhciAqKSZmcmVnX2J1ZmZlciwgOCk7CisgICAgICBzcCA9IHB1c2hfYnl0ZXMgKHNwLCAoY2hhciAqKSZmcmVnX2J1ZmZlciwgOCk7CisgICAgfQorICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKElQU1dfUkVHTlVNKSk7CisgIHNwID0gcHVzaF93b3JkIChzcCwgcmVhZF9yZWdpc3RlciAoU0FSX1JFR05VTSkpOworICBzcCA9IHB1c2hfd29yZCAoc3AsIHBjKTsKKyAgc3AgPSBwdXNoX3dvcmQgKHNwLCBwY3NwYWNlKTsKKyAgc3AgPSBwdXNoX3dvcmQgKHNwLCBwYyArIDQpOworICBzcCA9IHB1c2hfd29yZCAoc3AsIHBjc3BhY2UpOworICB3cml0ZV9yZWdpc3RlciAoU1BfUkVHTlVNLCBzcCk7Cit9CisKK3N0YXRpYyB2b2lkCitmaW5kX2R1bW15X2ZyYW1lX3JlZ3MgKGZyYW1lLCBmcmFtZV9zYXZlZF9yZWdzKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7CisgICAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICpmcmFtZV9zYXZlZF9yZWdzOworeworICBDT1JFX0FERFIgZnAgPSBmcmFtZS0+ZnJhbWU7CisgIGludCBpOworCisgIGZyYW1lX3NhdmVkX3JlZ3MtPnJlZ3NbUlBfUkVHTlVNXSA9IChmcCAtIDIwKSAmIH4weDM7CisgIGZyYW1lX3NhdmVkX3JlZ3MtPnJlZ3NbRlBfUkVHTlVNXSA9IGZwOworICBmcmFtZV9zYXZlZF9yZWdzLT5yZWdzWzFdID0gZnAgKyA4OworCisgIGZvciAoZnAgKz0gMTIsIGkgPSAzOyBpIDwgMzI7IGkrKykKKyAgICB7CisgICAgICBpZiAoaSAhPSBGUF9SRUdOVU0pCisJeworCSAgZnJhbWVfc2F2ZWRfcmVncy0+cmVnc1tpXSA9IGZwOworCSAgZnAgKz0gNDsKKwl9CisgICAgfQorCisgIGZwICs9IDQ7CisgIGZvciAoaSA9IEZQMF9SRUdOVU07IGkgPCBOVU1fUkVHUzsgaSsrLCBmcCArPSA4KQorICAgIGZyYW1lX3NhdmVkX3JlZ3MtPnJlZ3NbaV0gPSBmcDsKKworICBmcmFtZV9zYXZlZF9yZWdzLT5yZWdzW0lQU1dfUkVHTlVNXSA9IGZwOworICBmcmFtZV9zYXZlZF9yZWdzLT5yZWdzW1NBUl9SRUdOVU1dID0gZnAgKyA0OworICBmcmFtZV9zYXZlZF9yZWdzLT5yZWdzW1BDT1FfSEVBRF9SRUdOVU1dID0gZnAgKyA4OworICBmcmFtZV9zYXZlZF9yZWdzLT5yZWdzW1BDU1FfSEVBRF9SRUdOVU1dID0gZnAgKyAxMjsKKyAgZnJhbWVfc2F2ZWRfcmVncy0+cmVnc1tQQ09RX1RBSUxfUkVHTlVNXSA9IGZwICsgMTY7CisgIGZyYW1lX3NhdmVkX3JlZ3MtPnJlZ3NbUENTUV9UQUlMX1JFR05VTV0gPSBmcCArIDIwOworfQorCit2b2lkCitocHBhX3BvcF9mcmFtZSAoKQoreworICByZWdpc3RlciBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWUgPSBnZXRfY3VycmVudF9mcmFtZSAoKTsKKyAgcmVnaXN0ZXIgQ09SRV9BRERSIGZwLCBucGMsIHRhcmdldF9wYzsKKyAgcmVnaXN0ZXIgaW50IHJlZ251bTsKKyAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgZnNyOworICBkb3VibGUgZnJlZ19idWZmZXI7CisKKyAgZnAgPSBGUkFNRV9GUCAoZnJhbWUpOworICBnZXRfZnJhbWVfc2F2ZWRfcmVncyAoZnJhbWUsICZmc3IpOworCisjaWZuZGVmIE5PX1BDX1NQQUNFX1FVRVVFX1JFU1RPUkUKKyAgaWYgKGZzci5yZWdzW0lQU1dfUkVHTlVNXSkgICAgLyogUmVzdG9yaW5nIGEgY2FsbCBkdW1teSBmcmFtZSAqLworICAgIHJlc3RvcmVfcGNfcXVldWUgKCZmc3IpOworI2VuZGlmCisKKyAgZm9yIChyZWdudW0gPSAzMTsgcmVnbnVtID4gMDsgcmVnbnVtLS0pCisgICAgaWYgKGZzci5yZWdzW3JlZ251bV0pCisgICAgICB3cml0ZV9yZWdpc3RlciAocmVnbnVtLCByZWFkX21lbW9yeV9pbnRlZ2VyIChmc3IucmVnc1tyZWdudW1dLCA0KSk7CisKKyAgZm9yIChyZWdudW0gPSBOVU1fUkVHUyAtIDE7IHJlZ251bSA+PSBGUDBfUkVHTlVNIDsgcmVnbnVtLS0pCisgICAgaWYgKGZzci5yZWdzW3JlZ251bV0pCisgICAgICB7CisJcmVhZF9tZW1vcnkgKGZzci5yZWdzW3JlZ251bV0sIChjaGFyICopJmZyZWdfYnVmZmVyLCA4KTsKKyAgICAgICAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKFJFR0lTVEVSX0JZVEUgKHJlZ251bSksIChjaGFyICopJmZyZWdfYnVmZmVyLCA4KTsKKyAgICAgIH0KKworICBpZiAoZnNyLnJlZ3NbSVBTV19SRUdOVU1dKQorICAgIHdyaXRlX3JlZ2lzdGVyIChJUFNXX1JFR05VTSwKKyAgICAgICAgICAgICAgICAgICAgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnNyLnJlZ3NbSVBTV19SRUdOVU1dLCA0KSk7CisKKyAgaWYgKGZzci5yZWdzW1NBUl9SRUdOVU1dKQorICAgIHdyaXRlX3JlZ2lzdGVyIChTQVJfUkVHTlVNLAorICAgICAgICAgICAgICAgICAgICByZWFkX21lbW9yeV9pbnRlZ2VyIChmc3IucmVnc1tTQVJfUkVHTlVNXSwgNCkpOworCisgIC8qIElmIHRoZSBQQyB3YXMgZXhwbGljaXRseSBzYXZlZCwgdGhlbiBqdXN0IHJlc3RvcmUgaXQuICAqLworICBpZiAoZnNyLnJlZ3NbUENPUV9UQUlMX1JFR05VTV0pCisgICAgeworICAgICAgbnBjID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoZnNyLnJlZ3NbUENPUV9UQUlMX1JFR05VTV0sIDQpOworICAgICAgd3JpdGVfcmVnaXN0ZXIgKFBDT1FfVEFJTF9SRUdOVU0sIG5wYyk7CisgICAgfQorICAvKiBFbHNlIHVzZSB0aGUgdmFsdWUgaW4gJXJwIHRvIHNldCB0aGUgbmV3IFBDLiAgKi8KKyAgZWxzZSAKKyAgICB7CisgICAgICBucGMgPSByZWFkX3JlZ2lzdGVyIChSUF9SRUdOVU0pOworICAgICAgd3JpdGVfcGMgKG5wYyk7CisgICAgfQorCisgIHdyaXRlX3JlZ2lzdGVyIChGUF9SRUdOVU0sIHJlYWRfbWVtb3J5X2ludGVnZXIgKGZwLCA0KSk7CisKKyAgaWYgKGZzci5yZWdzW0lQU1dfUkVHTlVNXSkgICAgLyogY2FsbCBkdW1teSAqLworICAgIHdyaXRlX3JlZ2lzdGVyIChTUF9SRUdOVU0sIGZwIC0gNDgpOworICBlbHNlCisgICAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgZnApOworCisgIC8qIFRoZSBQQyB3ZSBqdXN0IHJlc3RvcmVkIG1heSBiZSBpbnNpZGUgYSByZXR1cm4gdHJhbXBvbGluZS4gIElmIHNvCisgICAgIHdlIHdhbnQgdG8gcmVzdGFydCB0aGUgaW5mZXJpb3IgYW5kIHJ1biBpdCB0aHJvdWdoIHRoZSB0cmFtcG9saW5lLgorCisgICAgIERvIHRoaXMgYnkgc2V0dGluZyBhIG1vbWVudGFyeSBicmVha3BvaW50IGF0IHRoZSBsb2NhdGlvbiB0aGUKKyAgICAgdHJhbXBvbGluZSByZXR1cm5zIHRvLiAKKworICAgICBEb24ndCBza2lwIHRocm91Z2ggdGhlIHRyYW1wb2xpbmUgaWYgd2UncmUgcG9wcGluZyBhIGR1bW15IGZyYW1lLiAgKi8KKyAgdGFyZ2V0X3BjID0gU0tJUF9UUkFNUE9MSU5FX0NPREUgKG5wYyAmIH4weDMpICYgfjB4MzsKKyAgaWYgKHRhcmdldF9wYyAmJiAhZnNyLnJlZ3NbSVBTV19SRUdOVU1dKQorICAgIHsKKyAgICAgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOworICAgICAgc3RydWN0IGJyZWFrcG9pbnQgKmJyZWFrcG9pbnQ7CisgICAgICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworCisgICAgICAvKiBTZXQgdXAgb3VyIGJyZWFrcG9pbnQuICAgU2V0IGl0IHRvIGJlIHNpbGVudCBhcyB0aGUgTUkgY29kZQorCSBmb3IgInJldHVybl9jb21tYW5kIiB3aWxsIHByaW50IHRoZSBmcmFtZSB3ZSByZXR1cm5lZCB0by4gICovCisgICAgICBzYWwgPSBmaW5kX3BjX2xpbmUgKHRhcmdldF9wYywgMCk7CisgICAgICBzYWwucGMgPSB0YXJnZXRfcGM7CisgICAgICBicmVha3BvaW50ID0gc2V0X21vbWVudGFyeV9icmVha3BvaW50IChzYWwsIE5VTEwsIGJwX2ZpbmlzaCk7CisgICAgICBicmVha3BvaW50LT5zaWxlbnQgPSAxOworCisgICAgICAvKiBTbyB3ZSBjYW4gY2xlYW4gdGhpbmdzIHVwLiAgKi8KKyAgICAgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBkZWxldGVfYnJlYWtwb2ludCwgYnJlYWtwb2ludCk7CisKKyAgICAgIC8qIFN0YXJ0IHVwIHRoZSBpbmZlcmlvci4gICovCisgICAgICBjbGVhcl9wcm9jZWVkX3N0YXR1cyAoKTsKKyAgICAgIHByb2NlZWRfdG9fZmluaXNoID0gMTsKKyAgICAgIHByb2NlZWQgKChDT1JFX0FERFIpIC0xLCBUQVJHRVRfU0lHTkFMX0RFRkFVTFQsIDApOworCisgICAgICAvKiBQZXJmb3JtIG91ciBjbGVhbnVwcy4gICovCisgICAgICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKKyAgICB9CisgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7Cit9CisKKy8qIEFmdGVyIHJldHVybmluZyB0byBhIGR1bW15IG9uIHRoZSBzdGFjaywgcmVzdG9yZSB0aGUgaW5zdHJ1Y3Rpb24KKyAgIHF1ZXVlIHNwYWNlIHJlZ2lzdGVycy4gKi8KKworc3RhdGljIGludAorcmVzdG9yZV9wY19xdWV1ZSAoZnNyKQorICAgICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqZnNyOworeworICBDT1JFX0FERFIgcGMgPSByZWFkX3BjICgpOworICBDT1JFX0FERFIgbmV3X3BjID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoZnNyLT5yZWdzW1BDT1FfSEVBRF9SRUdOVU1dLCA0KTsKKyAgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzIHc7CisgIGludCBpbnNuX2NvdW50OworCisgIC8qIEFkdmFuY2UgcGFzdCBicmVhayBpbnN0cnVjdGlvbiBpbiB0aGUgY2FsbCBkdW1teS4gKi8KKyAgd3JpdGVfcmVnaXN0ZXIgKFBDT1FfSEVBRF9SRUdOVU0sIHBjICsgNCk7CisgIHdyaXRlX3JlZ2lzdGVyIChQQ09RX1RBSUxfUkVHTlVNLCBwYyArIDgpOworCisgIC8qIEhQVVggZG9lc24ndCBsZXQgdXMgc2V0IHRoZSBzcGFjZSByZWdpc3RlcnMgb3IgdGhlIHNwYWNlCisgICAgIHJlZ2lzdGVycyBvZiB0aGUgUEMgcXVldWUgdGhyb3VnaCBwdHJhY2UuIEJvbywgaGlzcy4KKyAgICAgQ29udmVuaWVudGx5LCB0aGUgY2FsbCBkdW1teSBoYXMgdGhpcyBzZXF1ZW5jZSBvZiBpbnN0cnVjdGlvbnMKKyAgICAgYWZ0ZXIgdGhlIGJyZWFrOgorICAgICAgICBtdHNwIHIyMSwgc3IwCisgICAgICAgIGJsZSxuIDAoc3IwLCByMjIpCisgICAgCisgICAgIFNvLCBsb2FkIHVwIHRoZSByZWdpc3RlcnMgYW5kIHNpbmdsZSBzdGVwIHVudGlsIHdlIGFyZSBpbiB0aGUKKyAgICAgcmlnaHQgcGxhY2UuICovCisKKyAgd3JpdGVfcmVnaXN0ZXIgKDIxLCByZWFkX21lbW9yeV9pbnRlZ2VyIChmc3ItPnJlZ3NbUENTUV9IRUFEX1JFR05VTV0sIDQpKTsKKyAgd3JpdGVfcmVnaXN0ZXIgKDIyLCBuZXdfcGMpOworCisgIGZvciAoaW5zbl9jb3VudCA9IDA7IGluc25fY291bnQgPCAzOyBpbnNuX2NvdW50KyspCisgICAgeworICAgICAgLyogRklYTUU6IFdoYXQgaWYgdGhlIGluZmVyaW9yIGdldHMgYSBzaWduYWwgcmlnaHQgbm93PyAgV2FudCB0bworCSBtZXJnZSB0aGlzIGludG8gd2FpdF9mb3JfaW5mZXJpb3IgKGFzIGEgc3BlY2lhbCBraW5kIG9mCisJIHdhdGNocG9pbnQ/ICBCeSBzZXR0aW5nIGEgYnJlYWtwb2ludCBhdCB0aGUgZW5kPyAgSXMgdGhlcmUKKwkgYW55IG90aGVyIGNob2ljZT8gIElzIHRoZXJlICphbnkqIHdheSB0byBkbyB0aGlzIHN0dWZmIHdpdGgKKwkgcHRyYWNlKCkgb3Igc29tZSBlcXVpdmFsZW50PykuICAqLworICAgICAgcmVzdW1lICgxLCAwKTsKKyAgICAgIHRhcmdldF93YWl0IChpbmZlcmlvcl9waWQsICZ3KTsKKworICAgICAgaWYgKHcua2luZCA9PSBUQVJHRVRfV0FJVEtJTkRfU0lHTkFMTEVEKQorICAgICAgICB7CisgICAgICAgICAgc3RvcF9zaWduYWwgPSB3LnZhbHVlLnNpZzsKKyAgICAgICAgICB0ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgKCk7CisgICAgICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcblByb2dyYW0gdGVybWluYXRlZCB3aXRoIHNpZ25hbCAlcywgJXMuXG4iLAorCQkJICAgICB0YXJnZXRfc2lnbmFsX3RvX25hbWUgKHN0b3Bfc2lnbmFsKSwKKwkJCSAgICAgdGFyZ2V0X3NpZ25hbF90b19zdHJpbmcgKHN0b3Bfc2lnbmFsKSk7CisgICAgICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgdGFyZ2V0X3Rlcm1pbmFsX291cnMgKCk7CisgIHRhcmdldF9mZXRjaF9yZWdpc3RlcnMgKC0xKTsKKyAgcmV0dXJuIDE7Cit9CisKKyNpZiAwCitDT1JFX0FERFIKK2hwcGFfcHVzaF9hcmd1bWVudHMgKG5hcmdzLCBhcmdzLCBzcCwgc3RydWN0X3JldHVybiwgc3RydWN0X2FkZHIpCisgICAgIGludCBuYXJnczsKKyAgICAgdmFsdWVfcHRyICphcmdzOworICAgICBDT1JFX0FERFIgc3A7CisgICAgIGludCBzdHJ1Y3RfcmV0dXJuOworICAgICBDT1JFX0FERFIgc3RydWN0X2FkZHI7Cit7CisgIC8qIGFycmF5IG9mIGFyZ3VtZW50cycgb2Zmc2V0cyAqLworICBpbnQgKm9mZnNldCA9IChpbnQgKilhbGxvY2EobmFyZ3MgKiBzaXplb2YgKGludCkpOworICBpbnQgY3VtID0gMDsKKyAgaW50IGksIGFsaWdubWVudDsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKQorICAgIHsKKyAgICAgIGludCB4ID0gMDsKKyAgICAgIC8qIGN1bSBpcyB0aGUgc3VtIG9mIHRoZSBsZW5ndGhzIGluIGJ5dGVzIG9mCisJIHRoZSBhcmd1bWVudHMgc2VlbiBzbyBmYXIgKi8KKyAgICAgIGN1bSArPSBUWVBFX0xFTkdUSCAoVkFMVUVfVFlQRSAoYXJnc1tpXSkpOworCisgICAgLyogdmFsdWUgbXVzdCBnbyBhdCBwcm9wZXIgYWxpZ25tZW50LiBBc3N1bWUgYWxpZ25tZW50IGlzIGEKKwkgcG93ZXIgb2YgdHdvLiAqLworICAgICAgYWxpZ25tZW50ID0gaHBwYV9hbGlnbm9mIChWQUxVRV9UWVBFIChhcmdzW2ldKSk7CisKKyAgICAgIGlmIChjdW0gJSBhbGlnbm1lbnQpCisJY3VtID0gKGN1bSArIGFsaWdubWVudCkgJiAtYWxpZ25tZW50OworICAgICAgb2Zmc2V0W2ldID0gLWN1bTsKKworICAgIH0KKyAgc3AgKz0gbWF4ICgoY3VtICsgNykgJiAtOCwgMTYpOworCisgIGZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKQorICAgIHdyaXRlX21lbW9yeSAoc3AgKyBvZmZzZXRbaV0sIFZBTFVFX0NPTlRFTlRTIChhcmdzW2ldKSwKKwkJICBUWVBFX0xFTkdUSCAoVkFMVUVfVFlQRSAoYXJnc1tpXSkpKTsKKworICBpZiAoc3RydWN0X3JldHVybikKKyAgICB3cml0ZV9yZWdpc3RlciAoMjgsIHN0cnVjdF9hZGRyKTsKKyAgcmV0dXJuIHNwICsgMzI7Cit9CisjZW5kaWYKKworLyogZWx6OiBJIGFtIHJld3JpdGluZyB0aGlzIGZ1bmN0aW9uLCBiZWNhdXNlIHRoZSBvbmUgYWJvdmUgaXMgYSB2ZXJ5IAorICAgb2JzY3VyZSBwaWVjZSBvZiBjb2RlLgorICAgVGhpcyBmdW5jdGlvbiBwdXNoZXMgdGhlIGFyZ3VtZW50cyBvbiB0aGUgc3RhY2suIFRoZSBzdGFjayBncm93cyB1cAorICAgb24gdGhlIFBBLiAKKyAgIEVhY2ggYXJndW1lbnQgZ29lcyBpbiBvbmUgKG9yIG1vcmUpIHdvcmQgKDQgYnl0ZXMpIG9uIHRoZSBzdGFjay4KKyAgIFRoZSBmaXJzdCBmb3VyIHdvcmRzIGZvciB0aGUgYXJncyBtdXN0IGJlIGFsbG9jYXRlZCwgZXZlbiBpZiB0aGV5IAorICAgYXJlIG5vdCB1c2VkLiAKKyAgIFRoZSAndG9wbW9zdCcgYXJnIGlzIGFyZzAsIHRoZSAnYm90dG9tLW1vc3QnIGlzIGFyZzMuIChpZiB5b3UgdGhpbmsgb2YgCisgICB0aGVtIGFzIDEgd29yZCBsb25nKS4KKyAgIEJlbG93IHRoZXNlIHRoZXJlIGNhbiBiZSBhbnkgbnVtYmVyIG9mIGFyZ3VtZW50cywgYXMgbmVlZGVkIGJ5IHRoZSBmdW5jdGlvbi4KKyAgIElmIGFuIGFyZyBpcyBiaWdnZXIgdGhhbiBvbmUgd29yZCwgaXQgd2lsbCBiZSB3cml0dGVuIG9uIHRoZSBzdGFjayAKKyAgIG9jY3VweWluZyBhcyBtYW55IHdvcmRzIGFzIG5lZWRlZC4gQXJncyB0aGF0IGFyZSBiaWdnZXIgdGhhbiA2NGJpdHMKKyAgIGFyZSBub3QgY29waWVkIG9uIHRoZSBzdGFjaywgYSBwb2ludGVyIGlzIHBhc3NlZCBpbnN0ZWFkLgorCisgICBPbiB0b3Agb2YgdGhlIGFyZzAgd29yZCB0aGVyZSBhcmUgb3RoZXIgOCB3b3JkcyAoMzJieXRlcykgd2hpY2ggYXJlIHVzZWQKKyAgIGZvciBvdGhlciBwdXJwb3NlcyAqLworCitDT1JFX0FERFIKK2hwcGFfcHVzaF9hcmd1bWVudHMgKG5hcmdzLCBhcmdzLCBzcCwgc3RydWN0X3JldHVybiwgc3RydWN0X2FkZHIpCisgICAgIGludCBuYXJnczsKKyAgICAgdmFsdWVfcHRyICphcmdzOworICAgICBDT1JFX0FERFIgc3A7CisgICAgIGludCBzdHJ1Y3RfcmV0dXJuOworICAgICBDT1JFX0FERFIgc3RydWN0X2FkZHI7Cit7CisgIC8qIGFycmF5IG9mIGFyZ3VtZW50cycgb2Zmc2V0cyAqLworICBpbnQgKm9mZnNldCA9IChpbnQgKilhbGxvY2EobmFyZ3MgKiBzaXplb2YgKGludCkpOworICAvKiBhcnJheSBvZiBhcmd1bWVudHMnIGxlbmd0aHM6IHJlYWwgbGVuZ3RocyBpbiBieXRlcywgbm90IGFsaWduZWQgdG8gd29yZCBzaXplICovCisgIGludCAqbGVuZ3RocyA9IChpbnQgKilhbGxvY2EobmFyZ3MgKiBzaXplb2YgKGludCkpOworCisgIGludCBieXRlc19yZXNlcnZlZDsgLyogdGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9uIHRoZSBzdGFjayBvY2N1cGllZCBieSBhbgorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50LiBUaGlzIHdpbGwgYmUgYWx3YXlzIGEgbXVsdGlwbGUgb2YgNCAqLworCisgIGludCBjdW1fYnl0ZXNfcmVzZXJ2ZWQgPSAwOyAvKiB0aGlzIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVzZXJ2ZWQgYnkgdGhlIGFyZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4gc28gZmFyLiBJdCBpcyBhIG11bHRpcGxlIG9mIDQgYWx3YXlzICovCisgIGludCBjdW1fYnl0ZXNfYWxpZ25lZCA9IDA7IC8qIHNhbWUgYXMgYWJvdmUsIGJ1dCBhbGlnbmVkIG9uIDggYnl0ZXMgKi8KKyAgaW50IGk7IAorCisgIC8qIFdoZW4gYW4gYXJnIGRvZXMgbm90IG9jY3VweSBhIHdob2xlIHdvcmQsIGZvciBpbnN0YW5jZSBpbiBiaXRmaWVsZHM6CisgICAgIGlmIHRoZSBhcmcgaXMgeCBiaXRzICgwPHg8MzIpLCBpdCBtdXN0IGJlIHdyaXR0ZW4KKyAgICAgc3RhcnRpbmcgZnJvbSB0aGUgKHgtMSktdGggcG9zaXRpb24gIGRvd24gdW50aWwgdGhlIDAtdGggcG9zaXRpb24uIAorICAgICBJdCBpcyBlbm91Z2ggdG8gYWxpZ24gaXQgdG8gdGhlIHdvcmQuICovIAorICAvKiBpZiBhbiBhcmcgb2NjdXBpZXMgOCBieXRlcywgaXQgbXVzdCBiZSBhbGlnbmVkIG9uIHRoZSA2NC1iaXRzIAorICAgICBoaWdoIG9yZGVyIHdvcmQgaW4gb2RkIGFyZyB3b3JkLiAqLworICAvKiBpZiBhbiBhcmcgaXMgbGFyZ2VyIHRoYW4gNjQgYml0cywgd2UgbmVlZCB0byBwYXNzIGEgcG9pbnRlciB0byBpdCwgYW5kCisgICAgIGNvcHkgdGhlIGFjdHVhbCB2YWx1ZSBvbiB0aGUgc3RhY2ssIHNvIHRoYXQgdGhlIGNhbGxlZSBjYW4gcGxheSB3aXRoIGl0LgorICAgICBUaGlzIGlzIHRha2VuIGNhcmUgb2YgaW4gdmFsb3BzLmMgaW4gdGhlIGNhbGxfZnVuY3Rpb25fYnlfaGFuZCBmdW5jdGlvbi4KKyAgICAgVGhlIGFyZ3VtZW50IHRoYXQgaXMgcmVjZWl2ZWQgaW4gdGhpcyBmdW5jdGlvbiBoZXJlIGhhcyBhbHJlYWR5IGJlIGNvbnZlcnRlZAorICAgICB0byBhIHBvaW50ZXIgdG8gd2hhdGV2ZXIgaXMgbmVlZGVkLCBzbyB0aGF0IGl0IGp1c3QgY2FuIGJlIHB1c2hlZAorICAgICBhcyBhIHdvcmQgYXJndW1lbnQgKi8KKyAgCisgIGZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKQorICAgIHsKKworICAgICAgbGVuZ3Roc1tpXSA9IFRZUEVfTEVOR1RIIChWQUxVRV9UWVBFIChhcmdzW2ldKSk7CisKKyAgICAgIGlmIChsZW5ndGhzW2ldICUgNCkKKyAgICAgICAgYnl0ZXNfcmVzZXJ2ZWQgPSAobGVuZ3Roc1tpXSAvIDQpICogNCArIDQ7CisgICAgICBlbHNlIAorICAgICAgICBieXRlc19yZXNlcnZlZCA9IGxlbmd0aHNbaV07CisKKyAgICAgIG9mZnNldFtpXSA9IGN1bV9ieXRlc19yZXNlcnZlZCArIGxlbmd0aHNbaV07CisKKyAgICAgIGlmICgoYnl0ZXNfcmVzZXJ2ZWQgPT0gOCkgJiYgKG9mZnNldFtpXSAlIDgpKSAvKiBpZiA2NC1iaXQgYXJnIGlzIG5vdCA2NCBiaXQgYWxpZ25lZCAqLworICAgICAgeworICAgICAgICBpbnQgbmV3X29mZnNldD0wOworICAgICAgICAvKiBieXRlc19yZXNlcnZlZCBpcyBhbHJlYWR5IGFsaWduZWQgdG8gdGhlIHdvcmQsIHNvIHdlIHB1dCBpdCBhdCBvbmUgd29yZAorICAgICAgICAgICBtb3JlIGRvd24gdGhlIHN0YWNrLiBUaGlzIHdpbGwgbGVhdmUgb25lIGVtcHR5IHdvcmQgb24gdGhlCisgICAgICAgICAgIHN0YWNrLCBhbmQgb25lIHVudXNlZCByZWdpc3Rlci4gVGhpcyBpcyBPSywgc2VlIHRoZSBjYWxsaW5nCisgICAgICAgICAgIGNvbnZlbnRpb24gZG9jICovCisgICAgICAgIC8qIHRoZSBvZmZzZXQgbWF5IGhhdmUgdG8gYmUgbW92ZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcG9zaXRpb24KKyAgICAgICAgICAgb25lIHdvcmQgZG93biB0aGUgc3RhY2ssIHRvIG1haW50YWluIAorICAgICAgICAgICBhbGlnbm1lbnQuICovCisgICAgICAgIG5ld19vZmZzZXQgPSAob2Zmc2V0W2ldIC8gOCkgKiA4ICsgODsKKyAgICAgICAgaWYgKChuZXdfb2Zmc2V0IC0gb2Zmc2V0W2ldKSA+PTQpIAorICAgICAgICB7CisgICAgICAgICBieXRlc19yZXNlcnZlZCArPSA0OworICAgICAgICAgb2Zmc2V0W2ldICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY3VtX2J5dGVzX3Jlc2VydmVkICs9IGJ5dGVzX3Jlc2VydmVkOworCisgICAgfQorCisgIC8qIG5vdyBtb3ZlIHVwIHRoZSBzcCB0byByZXNlcnZlIGF0IGxlYXN0IDQgd29yZHMgcmVxdWlyZWQgZm9yIHRoZSBhcmdzLAorICAgICBvciBtb3JlIHRoYW4gdGhpcyBpZiBuZWVkZWQgKi8KKyAgLyogd2VlIGFsc28gbmVlZCB0byBrZWVwIHRoZSBzcCBhbGlnbmVkIHRvIDggYnl0ZXMgKi8KKyAgY3VtX2J5dGVzX2FsaWduZWQgPSBTVEFDS19BTElHTiAoY3VtX2J5dGVzX3Jlc2VydmVkKTsKKyAgc3AgKz0gbWF4IChjdW1fYnl0ZXNfYWxpZ25lZCwgMTYpOworCisgIC8qIG5vdyB3cml0ZSBlYWNoIG9mIHRoZSBhcmdzIGF0IHRoZSBwcm9wZXIgb2Zmc2V0IGRvd24gdGhlIHN0YWNrICovCisgIGZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKQorICAgIHdyaXRlX21lbW9yeSAoc3AgLSBvZmZzZXRbaV0sIFZBTFVFX0NPTlRFTlRTIChhcmdzW2ldKSwgbGVuZ3Roc1tpXSk7CisJCSAgCisKKyAvKiBpZiBhIHN0cnVjdHVyZSBoYXMgdG8gYmUgcmV0dXJuZWQsIHNldCB1cCByZWdpc3RlciAyOCB0byBob2xkIGl0cyBhZGRyZXNzICovCisgIGlmIChzdHJ1Y3RfcmV0dXJuKQorICAgIHdyaXRlX3JlZ2lzdGVyICgyOCwgc3RydWN0X2FkZHIpOworCisgLyogdGhlIHN0YWNrIHdpbGwgaGF2ZSBvdGhlciA4IHdvcmRzIG9uIHRvcCBvZiB0aGUgYXJncyAqLworICByZXR1cm4gc3AgKyAzMjsKK30KKworCisvKiBlbHo6IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHZhbHVlIHdoaWNoIGlzIGJ1aWx0IGxvb2tpbmcgYXQgdGhlIGdpdmVuIGFkZHJlc3MuCisgICBJdCBpcyBjYWxsZWQgZnJvbSBjYWxsX2Z1bmN0aW9uX2J5X2hhbmQsIGluIGNhc2Ugd2UgbmVlZCB0byByZXR1cm4gYSAKKyAgIHZhbHVlIHdoaWNoIGlzIGxhcmdlciB0aGFuIDY0IGJpdHMsIGFuZCBpdCBpcyBzdG9yZWQgaW4gdGhlIHN0YWNrIHJhdGhlciB0aGFuIAorICAgaW4gdGhlIHJlZ2lzdGVycyByMjggYW5kIHIyOSBvciBmcjQuCisgICBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHNhbWUgc3R1ZmYgYXMgdmFsdWVfYmVpbmdfcmV0dXJuZWQgaW4gdmFsdWVzLmMsIGJ1dAorICAgZ2V0cyB0aGUgdmFsdWUgZnJvbSB0aGUgc3RhY2sgcmF0aGVyIHRoYW4gZnJvbSB0aGUgYnVmZmVyIHdoZXJlIGFsbCB0aGUKKyAgIHJlZ2lzdGVycyB3ZXJlIHNhdmVkIHdoZW4gdGhlIGZ1bmN0aW9uIGNhbGxlZCBjb21wbGV0ZWQuICovCit2YWx1ZV9wdHIKK2hwcGFfdmFsdWVfcmV0dXJuZWRfZnJvbV9zdGFjayAodmFsdHlwZSAsIGFkZHIpCisgICAgIHJlZ2lzdGVyIHN0cnVjdCB0eXBlICp2YWx0eXBlOworICAgICBDT1JFX0FERFIgYWRkcjsKK3sKKyAgcmVnaXN0ZXIgdmFsdWVfcHRyIHZhbDsKKworICB2YWwgPSBhbGxvY2F0ZV92YWx1ZSAodmFsdHlwZSk7CisgIENIRUNLX1RZUEVERUYgKHZhbHR5cGUpOworICB0YXJnZXRfcmVhZF9tZW1vcnkoYWRkciwgVkFMVUVfQ09OVEVOVFNfUkFXICh2YWwpLCBUWVBFX0xFTkdUSCAodmFsdHlwZSkpOworCisgIHJldHVybiB2YWw7Cit9CisKKworCisvKiBlbHo6IFVzZWQgdG8gbG9va3VwIGEgc3ltYm9sIGluIHRoZSBzaGFyZWQgbGlicmFyaWVzLgorIFRoaXMgZnVuY3Rpb24gY2FsbHMgc2hsX2ZpbmRzeW0sIGluZGlyZWN0bHkgdGhyb3VnaCBhCisgY2FsbCB0byBfX2Rfc2hsX2dldC4gX19kX3NobF9nZXQgaXMgaW4gZW5kLmMsIHdoaWNoIGlzIGFsd2F5cworIGxpbmtlZCBpbiBieSB0aGUgaHAgY29tcGlsZXJzL2xpbmtlcnMuIAorIFRoZSBjYWxsIHRvIHNobF9maW5kc3ltIGNhbm5vdCBiZSBtYWRlIGRpcmVjdGx5IGJlY2F1c2UgaXQgbmVlZHMKKyB0byBiZSBhY3RpdmUgaW4gdGFyZ2V0IGFkZHJlc3Mgc3BhY2UuIAorIGlucHV0czogLSBtaW5pbWFsIHN5bWJvbCBwb2ludGVyIGZvciB0aGUgZnVuY3Rpb24gd2Ugd2FudCB0byBsb29rIHVwCisgICAgICAgICAtIGFkZHJlc3MgaW4gdGFyZ2V0IHNwYWNlIG9mIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgbGlicmFyeQorICAgICAgICAgICB3aGVyZSB3ZSB3YW50IHRvIGxvb2sgdGhlIHN5bWJvbCB1cC4KKyAgICAgICAgICAgVGhpcyBhZGRyZXNzIGlzIHJldHJpZXZlZCB1c2luZyB0aGUgCisgICAgICAgICAgIHNvbV9zb2xpYl9nZXRfc29saWJfYnlfcGMgZnVuY3Rpb24gKHNvbXNvbGliLmMpLiAKKyBvdXRwdXQ6IC0gcmVhbCBhZGRyZXNzIGluIHRoZSBsaWJyYXJ5IG9mIHRoZSBmdW5jdGlvbi4gICAgICAgICAgCisgbm90ZTogdGhlIGhhbmRsZSBjYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSBzaGxfZmluZHN5bSB3aWxsIGxvb2sgZm9yCisgICAgICAgdGhlIHN5bWJvbCBpbiBhbGwgdGhlIGxvYWRlZCBzaGFyZWQgbGlicmFyaWVzLgorIGZpbGVzIHRvIGxvb2sgYXQgaWYgeW91IG5lZWQgcmVmZXJlbmNlIG9uIHRoaXMgc3R1ZmY6CisgZGxkLmMsIGRsZF9zaGxfZmluZHN5bS5jCisgZW5kLmMKKyBtYW4gZW50cnkgZm9yIHNobF9maW5kc3ltICovICAgICAgICAKKworQ09SRV9BRERSCitmaW5kX3N0dWJfd2l0aF9zaGxfZ2V0KGZ1bmN0aW9uLCBoYW5kbGUpIAorICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKmZ1bmN0aW9uOworICBDT1JFX0FERFIgaGFuZGxlOworeworIHN0cnVjdCBzeW1ib2wgKmdldF9zeW0sICpzeW1ib2wyOworIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqYnVmZl9taW5zeW0sICptc3ltYm9sOworIHN0cnVjdCB0eXBlICpmdHlwZTsKKyB2YWx1ZV9wdHIgKmFyZ3M7CisgdmFsdWVfcHRyIGZ1bmN2YWwsIHZhbDsKKworIGludCB4LCBuYW1lbGVuLCBlcnJfdmFsdWUsIHRtcCA9IC0xOworIENPUkVfQUREUiBlbmRvX2J1ZmZfYWRkciwgdmFsdWVfcmV0dXJuX2FkZHIsIGVycm5vX3JldHVybl9hZGRyOworIENPUkVfQUREUiBzdHViX2FkZHI7CisKKworICAgIGFyZ3MgICAgICAgICAgID0gKHZhbHVlX3B0ciAqKSBhbGxvY2EgKHNpemVvZiAodmFsdWVfcHRyKSAqIDgpOyAgLyogNiBmb3IgdGhlIGFyZ3VtZW50cyBhbmQgb25lIG51bGwgb25lPz8/ICovCisgICAgZnVuY3ZhbCAgICAgICAgPSBmaW5kX2Z1bmN0aW9uX2luX2luZmVyaW9yKCJfX2Rfc2hsX2dldCIpOworICAgIGdldF9zeW0gICAgICAgID0gbG9va3VwX3N5bWJvbCgiX19kX3NobF9nZXQiLCBOVUxMLCBWQVJfTkFNRVNQQUNFLCBOVUxMLCBOVUxMKTsKKyAgICBidWZmX21pbnN5bSAgICA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCgiX19idWZmZXIiLCBOVUxMLCBOVUxMKTsKKyAgICBtc3ltYm9sICAgICAgICA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoIl9fc2hsZHAiLCBOVUxMLCBOVUxMKTsKKyAgICBzeW1ib2wyID0gbG9va3VwX3N5bWJvbCgiX19zaGxkcCIsIE5VTEwsIFZBUl9OQU1FU1BBQ0UsIE5VTEwsIE5VTEwpOworICAgIGVuZG9fYnVmZl9hZGRyID0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKGJ1ZmZfbWluc3ltKTsKKyAgICBuYW1lbGVuICAgICAgICA9IHN0cmxlbihTWU1CT0xfTkFNRShmdW5jdGlvbikpOworICAgIHZhbHVlX3JldHVybl9hZGRyID0gZW5kb19idWZmX2FkZHIgKyBuYW1lbGVuOworICAgIGZ0eXBlICAgICAgICAgID0gY2hlY2tfdHlwZWRlZihTWU1CT0xfVFlQRShnZXRfc3ltKSk7CisKKyAgICAvKiBkbyBhbGlnbm1lbnQgKi8KKyAgICBpZiAoKHg9dmFsdWVfcmV0dXJuX2FkZHIgJSA2NCkgIT0wKQorICAgICAgIHZhbHVlX3JldHVybl9hZGRyID0gdmFsdWVfcmV0dXJuX2FkZHIgKyA2NCAtIHg7CisKKyAgICBlcnJub19yZXR1cm5fYWRkciA9IHZhbHVlX3JldHVybl9hZGRyICsgNjQ7CisKKyAgICAKKyAgICAvKiBzZXQgdXAgc3R1ZmYgbmVlZGVkIGJ5IF9fZF9zaGxfZ2V0IGluIGJ1ZmZlciBpbiBlbmQubyAqLworCisgICAgdGFyZ2V0X3dyaXRlX21lbW9yeShlbmRvX2J1ZmZfYWRkciwgU1lNQk9MX05BTUUoZnVuY3Rpb24pLCBuYW1lbGVuKTsKKyAgICAKKyAgICB0YXJnZXRfd3JpdGVfbWVtb3J5KHZhbHVlX3JldHVybl9hZGRyLCAoY2hhciAqKSAmdG1wLCA0KTsKKyAgICAKKyAgICB0YXJnZXRfd3JpdGVfbWVtb3J5KGVycm5vX3JldHVybl9hZGRyLCAoY2hhciAqKSAmdG1wLCA0KTsKKworICAgIHRhcmdldF93cml0ZV9tZW1vcnkoU1lNQk9MX1ZBTFVFX0FERFJFU1MobXN5bWJvbCksIAorICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmaGFuZGxlLCA0KTsKKyAgICAKKyAgICAvKiBub3cgcHJlcGFyZSB0aGUgYXJndW1lbnRzIGZvciB0aGUgY2FsbCAqLworCisgICAgYXJnc1swXSA9IHZhbHVlX2Zyb21fbG9uZ2VzdCAoVFlQRV9GSUVMRF9UWVBFKGZ0eXBlLCAwKSwgMTIpOworICAgIGFyZ3NbMV0gPSB2YWx1ZV9mcm9tX2xvbmdlc3QgKFRZUEVfRklFTERfVFlQRShmdHlwZSwgMSksIFNZTUJPTF9WQUxVRV9BRERSRVNTKG1zeW1ib2wpKTsKKyAgICBhcmdzWzJdID0gdmFsdWVfZnJvbV9sb25nZXN0IChUWVBFX0ZJRUxEX1RZUEUoZnR5cGUsIDIpLCBlbmRvX2J1ZmZfYWRkcik7CisgICAgYXJnc1szXSA9IHZhbHVlX2Zyb21fbG9uZ2VzdCAoVFlQRV9GSUVMRF9UWVBFKGZ0eXBlLCAzKSwgVFlQRV9QUk9DRURVUkUpOworICAgIGFyZ3NbNF0gPSB2YWx1ZV9mcm9tX2xvbmdlc3QgKFRZUEVfRklFTERfVFlQRShmdHlwZSwgNCksIHZhbHVlX3JldHVybl9hZGRyKTsKKyAgICBhcmdzWzVdID0gdmFsdWVfZnJvbV9sb25nZXN0IChUWVBFX0ZJRUxEX1RZUEUoZnR5cGUsIDUpLCBlcnJub19yZXR1cm5fYWRkcik7CisKKyAgICAvKiBub3cgY2FsbCB0aGUgZnVuY3Rpb24gKi8KKworICAgIHZhbCA9IGNhbGxfZnVuY3Rpb25fYnlfaGFuZChmdW5jdmFsLCA2LCBhcmdzKTsKKworICAgIC8qIG5vdyBnZXQgdGhlIHJlc3VsdHMgKi8KKworICAgIHRhcmdldF9yZWFkX21lbW9yeShlcnJub19yZXR1cm5fYWRkciwgKGNoYXIgKikgJmVycl92YWx1ZSwgc2l6ZW9mKGVycl92YWx1ZSkpOworCisgICAgdGFyZ2V0X3JlYWRfbWVtb3J5KHZhbHVlX3JldHVybl9hZGRyLCAoY2hhciAqKSAmc3R1Yl9hZGRyLCBzaXplb2Yoc3R1Yl9hZGRyKSk7CisgICAgaWYgKHN0dWJfYWRkciA8PSAwKQorICAgICAgICBlcnJvcigiY2FsbCB0byBfX2Rfc2hsX2dldCBmYWlsZWQsIGVycm9yIGNvZGUgaXMgJWQiLCBlcnJfdmFsdWUpOyAvKiBwdXJlY292OiBkZWFkY29kZSAqLworICAgIAorICAgIHJldHVybihzdHViX2FkZHIpOworfQorCisvKiBDb3ZlciByb3V0aW5lIGZvciBmaW5kX3N0dWJfd2l0aF9zaGxfZ2V0IHRvIHBhc3MgdG8gY2F0Y2hfZXJyb3JzICovIAorc3RhdGljIENPUkVfQUREUgorY292ZXJfZmluZF9zdHViX3dpdGhfc2hsX2dldCAoYXJncykKKyAgYXJnc19mb3JfZmluZF9zdHViICogYXJnczsKK3sKKyAgcmV0dXJuIGZpbmRfc3R1Yl93aXRoX3NobF9nZXQgKGFyZ3MtPm1zeW0sIGFyZ3MtPnNvbGliX2hhbmRsZSk7Cit9CisKKworLyogSW5zZXJ0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGFyZ3MgYW5kIGZ1bmN0aW9uIGFkZHJlc3MKKyAgIGludG8gYSBjYWxsIHNlcXVlbmNlIG9mIHRoZSBhYm92ZSBmb3JtIHN0b3JlZCBhdCBEVU1NWU5BTUUuCisKKyAgIE9uIHRoZSBocHBhIHdlIG5lZWQgdG8gY2FsbCB0aGUgc3RhY2sgZHVtbXkgdGhyb3VnaCAkJGR5bmNhbGwuCisgICBUaGVyZWZvcmUgb3VyIHZlcnNpb24gb2YgRklYX0NBTExfRFVNTVkgdGFrZXMgYW4gZXh0cmEgYXJndW1lbnQsCisgICByZWFsX3BjLCB3aGljaCBpcyB0aGUgbG9jYXRpb24gd2hlcmUgZ2RiIHNob3VsZCBzdGFydCB1cCB0aGUKKyAgIGluZmVyaW9yIHRvIGRvIHRoZSBmdW5jdGlvbiBjYWxsLiAqLworCitDT1JFX0FERFIKK2hwcGFfZml4X2NhbGxfZHVtbXkgKGR1bW15LCBwYywgZnVuLCBuYXJncywgYXJncywgdHlwZSwgZ2NjX3ApCisgICAgIGNoYXIgKmR1bW15OworICAgICBDT1JFX0FERFIgcGM7CisgICAgIENPUkVfQUREUiBmdW47CisgICAgIGludCBuYXJnczsKKyAgICAgdmFsdWVfcHRyICphcmdzOworICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgaW50IGdjY19wOworeworICBDT1JFX0FERFIgZHluY2FsbF9hZGRyOworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqdHJhbXBvbGluZTsKKyAgaW50IGZsYWdzID0gcmVhZF9yZWdpc3RlciAoRkxBR1NfUkVHTlVNKTsKKyAgc3RydWN0IHVud2luZF90YWJsZV9lbnRyeSAqdTsKKyAgQ09SRV9BRERSIG5ld19zdHViPTA7CisgIENPUkVfQUREUiBzb2xpYl9oYW5kbGU9MDsKKworICB0cmFtcG9saW5lID0gTlVMTDsKKyAgbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoIiQkZHluY2FsbCIsIE5VTEwsIE5VTEwpOworICBpZiAobXN5bWJvbCA9PSBOVUxMKQorICAgIGVycm9yICgiQ2FuJ3QgZmluZCBhbiBhZGRyZXNzIGZvciAkJGR5bmNhbGwgdHJhbXBvbGluZSIpOyAvKiBwdXJlY292OiBkZWFkY29kZSAqLworCisgIGR5bmNhbGxfYWRkciA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKTsKKworICAvKiBGVU4gY291bGQgYmUgYSBwcm9jZWR1cmUgbGFiZWwsIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBnZXQKKyAgICAgaXRzIHJlYWwgYWRkcmVzcyBhbmQgdGhlIHZhbHVlIG9mIGl0cyBHT1QvRFAuICAqLworICBpZiAoZnVuICYgMHgyKQorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgR09UL0RQIHZhbHVlIGZvciB0aGUgdGFyZ2V0IGZ1bmN0aW9uLiAgSXQncworCSBhdCAqKGZ1bis0KS4gIE5vdGUgdGhlIGNhbGwgZHVtbXkgaXMgKk5PVCogYWxsb3dlZCB0bworCSB0cmFzaCAlcjE5IGJlZm9yZSBjYWxsaW5nIHRoZSB0YXJnZXQgZnVuY3Rpb24uICAqLworICAgICAgd3JpdGVfcmVnaXN0ZXIgKDE5LCByZWFkX21lbW9yeV9pbnRlZ2VyICgoZnVuICYgfjB4MykgKyA0LCA0KSk7CisKKyAgICAgIC8qIE5vdyBnZXQgdGhlIHJlYWwgYWRkcmVzcyBmb3IgdGhlIGZ1bmN0aW9uIHdlIGFyZSBjYWxsaW5nLCBpdCdzCisJIGF0ICpmdW4uICAqLworICAgICAgZnVuID0gKENPUkVfQUREUikgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnVuICYgfjB4MywgNCk7CisgICAgfQorICBlbHNlCisgICAgeworCisjaWZuZGVmIEdEQl9UQVJHRVRfSVNfUEFfRUxGCisgICAgICAvKiBGVU4gY291bGQgYmUgZWl0aGVyIGFuIGV4cG9ydCBzdHViLCBvciB0aGUgcmVhbCBhZGRyZXNzIG9mIGEKKwkgZnVuY3Rpb24gaW4gYSBzaGFyZWQgbGlicmFyeS4gIFdlIG11c3QgY2FsbCBhbiBpbXBvcnQgc3R1YgorCSByYXRoZXIgdGhhbiB0aGUgZXhwb3J0IHN0dWIgb3IgcmVhbCBmdW5jdGlvbiBmb3IgbGF6eSBiaW5kaW5nCisJIHRvIHdvcmsgY29ycmVjdGx5LiAgKi8KKworICAgICAgLyogZWx6OiBsZXQncyBzZWUgaWYgZnVuIGlzIGluIGEgc2hhcmVkIGxpYnJhcnkgKi8KKyAgICAgIHNvbGliX2hhbmRsZSA9IHNvbV9zb2xpYl9nZXRfc29saWJfYnlfcGMoZnVuKTsKKworICAgICAgLyogZWx6OiBmb3IgMTAuMzAgYW5kIDExLjAwIHRoZSBjYWxscyB2aWEgX19kX3BsdF9jYWxsIGNhbm5vdCBiZSBtYWRlCisJIHZpYSBpbXBvcnQgc3R1YnMsIG9ubHkgdmlhIHBsYWJsZXMsIHNvIHRoaXMgY29kZSBoZXJlIGJlY29tZXMgdXNlbGVzcy4KKwkgT24gMTAuMjAsIHRoZSBwbGFibGVzIG1lY2hhbmlzbSB3b3JrcyB0b28sIHNvIHdlIGp1c3QgaWdub3JlIHRoaXMgaW1wb3J0IAorCSBzdHViIHN0dWZmICovCisjaWYgMAorICAgICAgaWYgKHNvbGliX2hhbmRsZSkKKwl7CisJICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKwkgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqZnVuc3ltYm9sLCAqc3R1Yl9zeW1ib2w7CisJICBDT1JFX0FERFIgbmV3ZnVuID0gMDsKKworCSAgZnVuc3ltYm9sID0gbG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjIChmdW4pOworCSAgaWYgKCFmdW5zeW1ib2wpCisJICAgIGVycm9yICgiVW5hYmxlIHRvIGZpbmQgbWluaW1hbCBzeW1ib2wgZm9yIHRhcmdldCBmdWNudGlvbi5cbiIpOworCisJICAvKiBTZWFyY2ggYWxsIHRoZSBvYmplY3QgZmlsZXMgZm9yIGFuIGltcG9ydCBzeW1ib2wgd2l0aCB0aGUKKwkgICAgIHJpZ2h0IG5hbWUuICovCisJICBBTExfT0JKRklMRVMgKG9iamZpbGUpCisJICAgIHsKKwkgICAgICBzdHViX3N5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoU1lNQk9MX05BTUUgKGZ1bnN5bWJvbCksCisJCQkJCQkgICBOVUxMLCBvYmpmaWxlKTsKKwkgICAgICAvKiBGb3VuZCBhIHN5bWJvbCB3aXRoIHRoZSByaWdodCBuYW1lLiAgKi8KKwkgICAgICBpZiAoc3R1Yl9zeW1ib2wpCisJCXsKKwkJICBzdHJ1Y3QgdW53aW5kX3RhYmxlX2VudHJ5ICp1OworCQkgIC8qIEl0IG11c3QgYmUgYSBzaGFyZWQgbGlicmFyeSB0cmFtcG9saW5lLiAgKi8KKwkJICBpZiAoTVNZTUJPTF9UWVBFIChzdHViX3N5bWJvbCkgIT0gbXN0X3NvbGliX3RyYW1wb2xpbmUpCisJCSAgICBjb250aW51ZTsKKworCQkgIC8qIEl0IG11c3QgYWxzbyBiZSBhbiBpbXBvcnQgc3R1Yi4gICovCisJCSAgdSA9IGZpbmRfdW53aW5kX2VudHJ5IChTWU1CT0xfVkFMVUUgKHN0dWJfc3ltYm9sKSk7CisJCSAgaWYgKCF1IHx8IHUtPnN0dWJfdW53aW5kLnN0dWJfdHlwZSAhPSBJTVBPUlQpCisJCSAgICBjb250aW51ZTsKKworCQkgIC8qIE9LLiAgTG9va3MgbGlrZSB0aGUgY29ycmVjdCBpbXBvcnQgc3R1Yi4gICovCisJCSAgbmV3ZnVuID0gU1lNQk9MX1ZBTFVFIChzdHViX3N5bWJvbCk7CisJCSAgZnVuID0gbmV3ZnVuOworCQl9CisJICAgIH0KKwkgIGlmIChuZXdmdW4gPT0gMCkKKwkgICAgd3JpdGVfcmVnaXN0ZXIgKDE5LCBzb21fc29saWJfZ2V0X2dvdF9ieV9wYyAoZnVuKSk7CisJfQorI2VuZGlmIC8qIGVuZCBvZiBpZiAwICovCisjZW5kaWYKKyAgICB9CisKKyAgLyogSWYgd2UgYXJlIGNhbGxpbmcgYW4gaW1wb3J0IHN0dWIgKGVnIGNhbGxpbmcgaW50byBhIGR5bmFtaWMgbGlicmFyeSkKKyAgICAgdGhlbiBoYXZlIHNyNGV4cG9ydCBjYWxsIHRoZSBtYWdpYyBfX2RfcGx0X2NhbGwgcm91dGluZSB3aGljaCBpcyBsaW5rZWQKKyAgICAgaW4gZnJvbSBlbmQuby4gIChZb3UgY2FuJ3QgdXNlIF9zcjRleHBvcnQgdG8gY2FsbCB0aGUgaW1wb3J0IHN0dWIgYXMKKyAgICAgdGhlIHZhbHVlIGluIHNwLTI0IHdpbGwgZ2V0IGZyaWVkIGFuZCB5b3UgZW5kIHVwIHJldHVybmluZyB0byB0aGUKKyAgICAgd3JvbmcgbG9jYXRpb24uICBZb3UgY2FuJ3QgY2FsbCB0aGUgaW1wb3J0IHN0dWIgZGlyZWN0bHkgYXMgdGhlIGNvZGUKKyAgICAgdG8gYmluZCB0aGUgUExUIGVudHJ5IHRvIGEgZnVuY3Rpb24gY2FuJ3QgcmV0dXJuIHRvIGEgc3RhY2sgYWRkcmVzcy4pICAqLworCisgIC8qIGVsejoKKyAgICAgVGhlcmUgZG9lcyBub3QgaGF2ZSB0byBiZSBhbiBpbXBvcnQgc3R1YiB0byBjYWxsIGEgcm91dGluZSBpbiBhCisgICAgIGRpZmZlcmVudCBsb2FkIG1vZHVsZSAobm90ZTogYSAibG9hZCBtb2R1bGUiIGlzIGFuIGEub3V0IG9yIGEgc2hhcmVkCisgICAgIGxpYnJhcnkpLiAgSWYgeW91IGNhbGwgYSByb3V0aW5lIGluZGlyZWN0bHksIGdvaW5nIHRocm91Z2ggJCRkeW5jYWxsIChvcgorICAgICAkJGR5bmNhbGxfZXh0ZXJuYWwpLCB5b3Ugd29uJ3QgZ28gdGhyb3VnaCBhbiBpbXBvcnQgc3R1Yi4gIEltcG9ydCBzdHVicworICAgICBhcmUgb25seSB1c2VkIGZvciBkaXJlY3QgY2FsbHMgdG8gYW4gaW1wb3J0ZWQgcm91dGluZS4KKworICAgICBXaGF0IHlvdSAod2RiKSBuZWVkIGlzIHRvIGdvIHRocm91Z2ggJCRkeW5jYWxsIHdpdGggYSBwcm9wZXIgcGxhYmVsIGZvcgorICAgICB0aGUgaW1wb3J0ZWQgcm91dGluZS4gIHNobF9maW5kc3ltKCkgcmV0dXJucyB5b3UgdGhlIGFkZHJlc3Mgb2YgYSBwbGFiZWwKKyAgICAgc3VpdGFibGUgZm9yIHVzZSBpbiBtYWtpbmcgYW4gaW5kaXJlY3QgY2FsbCB0aHJvdWdoLCBlLmcuLCB0aHJvdWdoCisgICAgICQkZHluY2FsbC4KKyAgICAgVGhpcyBpcyB0YWtlbiBjYXJlIGJlbG93IHdpdGggdGhlIGNhbGwgdG8gZmluZF9zdHViXy4uLi4gKi8KKyNpZiAwCisgIC8qIGVsejogdGhpcyBjaGVjayBoZXJlIGlzIG5vdCBuZWNlc3NhcnkgaWYgd2UgYXJlIGdvaW5nIHRvIGNhbGwgc3R1ZmYgdGhyb3VnaAorICAgICBwbGFiZWxzIG9ubHksIHdlIGp1c3Qgbm93IGNoZWNrIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIHdlIGNhbGwgaXMgaW4gYSBzaGxpYiAqLworICB1ID0gZmluZF91bndpbmRfZW50cnkgKGZ1bik7CisKKyAgaWYgKHUgJiYgdS0+c3R1Yl91bndpbmQuc3R1Yl90eXBlID09IElNUE9SVCB8fCAKKyAgICAgICghKHUgJiYgdS0+c3R1Yl91bndpbmQuc3R1Yl90eXBlID09IElNUE9SVCkgJiYgc29saWJfaGFuZGxlKSkKKyNlbmRpZiAvKiAwICovCisgIGlmIChzb2xpYl9oYW5kbGUpCisgICAgeworICAgICAgQ09SRV9BRERSIG5ld19mdW47CisKKyAgICAgIC8qIFByZWZlciBfX2djY19wbHRfY2FsbCBvdmVyIHRoZSBIUCBzdXBwbGllZCByb3V0aW5lIGJlY2F1c2UKKwkgX19nY2NfcGx0X2NhbGwgd29ya3MgZm9yIGFueSBudW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KKyAgICAgIHRyYW1wb2xpbmUgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKCJfX2djY19wbHRfY2FsbCIsIE5VTEwsIE5VTEwpOworICAgICAgaWYgKHRyYW1wb2xpbmUgPT0gTlVMTCkKKwl0cmFtcG9saW5lID0gbG9va3VwX21pbmltYWxfc3ltYm9sICgiX19kX3BsdF9jYWxsIiwgTlVMTCwgTlVMTCk7CisKKyAgICAgIGlmICh0cmFtcG9saW5lID09IE5VTEwpCisJeworCSAgZXJyb3IgKCJDYW4ndCBmaW5kIGFuIGFkZHJlc3MgZm9yIF9fZF9wbHRfY2FsbCBvciBfX2djY19wbHRfY2FsbCB0cmFtcG9saW5lXG5TdWdnZXN0IGxpbmtpbmcgZXhlY3V0YWJsZSB3aXRoIC1nIChsaW5rcyBpbiAvb3B0L2xhbmd0b29scy9saWIvZW5kLm8pIik7CisJfQorICAgICAgLyogVGhpcyBpcyB3aGVyZSBzcjRleHBvcnQgd2lsbCBqdW1wIHRvLiAgKi8KKyAgICAgIG5ld19mdW4gPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAodHJhbXBvbGluZSk7CisKKyAgICAgIGlmIChzdHJjbXAgKFNZTUJPTF9OQU1FICh0cmFtcG9saW5lKSwgIl9fZF9wbHRfY2FsbCIpID09IDApCisJeworICAgICAgICAgIC8qIGlmIHRoZSBmdW5jdGlvbiBpcyBpbiBhIHNoYXJlZCBsaWJyYXJ5LCBidXQgd2UgaGF2ZSBubyBpbXBvcnQgc3ViIGZvciAKKyAgICAgICAgICAgICBpdCwgd2UgbmVlZCB0byBnZXQgdGhlIHBsYWJlbCBmcm9tIGEgY2FsbCB0byBfX2Rfc2hsX2dldCwgd2hpY2ggaXMgYSAKKyAgICAgICAgICAgICBmdW5jdGlvbiBpbiBlbmQuby4gVG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdlIG5lZWQgdG8gc2V0IHVwIHZhcmlvdXMgdGhpbmdzICovCisJICAKKwkgIC8qIGFjdHVhbGx5IG5vdyB3ZSBqdXN0IHVzZSB0aGUgcGxhYmVsIGFueSB0aW1lIHdlIG1ha2UgdGhlIGNhbGwsCisJICAgICBiZWNhdXNlIG9uIDEwLjMwIGFuZCAxMS4wMCB0aGlzIGlzIHRoZSBvbmx5IGFjY2VwdGFibGUgd2F5LiBUaGlzIGFsc28KKwkgICAgIHdvcmtzIGZpbmUgZm9yIDEwLjIwICovCisJICAvKiBpZiAoISh1ICYmIHUtPnN0dWJfdW53aW5kLnN0dWJfdHlwZSA9PSBJTVBPUlQpICYmIHNvbGliX2hhbmRsZSkgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc3RydWN0IG1pbmltYWxfc3ltYm9sICpmbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbF9ieV9wYyhmdW4pOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgbmV3X3N0dWIgPSBmaW5kX3N0dWJfd2l0aF9zaGxfZ2V0KGZtc3ltYm9sLCBzb2xpYl9oYW5kbGUpOworCisgICAgICAgICAgICAgIGlmIChuZXdfc3R1YiA9PSBOVUxMKSAKKyAgICAgICAgICAgICAgICBlcnJvcigiQ2FuJ3QgZmluZCBhbiBpbXBvcnQgc3R1YiBmb3IgJXMiLCBTWU1CT0xfTkFNRShmbXN5bWJvbCkpOyAvKiBwdXJlY292OiBkZWFkY29kZSAqLworICAgICAgICAgICAgfQorCisJICAvKiBXZSBoYXZlIHRvIHN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBzdHViIGluIF9fc2hsaWJfZnVuY3B0ci4gICovCisJICAgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKCJfX3NobGliX2Z1bmNwdHIiLCBOVUxMLAorCQkJCQkgICAgIChzdHJ1Y3Qgb2JqZmlsZSAqKU5VTEwpOworCSAgICBpZiAobXN5bWJvbCA9PSBOVUxMKQorCSAgICAgIGVycm9yICgiQ2FuJ3QgZmluZCBhbiBhZGRyZXNzIGZvciBfX3NobGliX2Z1bmNwdHIiKTsgLyogcHVyZWNvdjogZGVhZGNvZGUgKi8KKworICAgICAgICAgLyogaWYgKG5ld19zdHViICE9IE5VTEwpICovCisJICAgICB0YXJnZXRfd3JpdGVfbWVtb3J5IChTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCksIChjaGFyICopJm5ld19zdHViLCA0KTsKKyAgICAgICAgIC8qIHRoaXMgaXMgbm8gbG9uZ2VyIHVzZWQgKi8KKyAgICAgICAgIC8qIGVsc2UKKwkgICAgIHRhcmdldF93cml0ZV9tZW1vcnkgKFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKSwgKGNoYXIgKikmZnVuLCA0KTsgKi8KKworCSAgLyogV2Ugd2FudCBzcjRleHBvcnQgdG8gY2FsbCBfX2RfcGx0X2NhbGwsIHNvIHdlIGNsYWltIGl0IGlzCisJICAgICB0aGUgZmluYWwgdGFyZ2V0LiAgQ2xlYXIgdHJhbXBvbGluZS4gICovCisJICAgIGZ1biA9IG5ld19mdW47CisJICAgIHRyYW1wb2xpbmUgPSBOVUxMOworCX0KKyAgICB9CisKKyAgLyogU3RvcmUgdXBwZXIgMjEgYml0cyBvZiBmdW5jdGlvbiBhZGRyZXNzIGludG8gbGRpbC4gIGZ1biB3aWxsIGVpdGhlciBiZQorICAgICB0aGUgZmluYWwgdGFyZ2V0IChtb3N0IGNhc2VzKSBvciBfX2RfcGx0X2NhbGwgd2hlbiBjYWxsaW5nIGludG8gYSBzaGFyZWQKKyAgICAgbGlicmFyeSBhbmQgX19nY2NfcGx0X2NhbGwgaXMgbm90IGF2YWlsYWJsZS4gICovCisgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIKKyAgICAoJmR1bW15W0ZVTkNfTERJTF9PRkZTRVRdLAorICAgICBJTlNUUlVDVElPTl9TSVpFLAorICAgICBkZXBvc2l0XzIxIChmdW4gPj4gMTEsCisJCSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKCZkdW1teVtGVU5DX0xESUxfT0ZGU0VUXSwKKwkJCQkJICAgSU5TVFJVQ1RJT05fU0laRSkpKTsKKworICAvKiBTdG9yZSBsb3dlciAxMSBiaXRzIG9mIGZ1bmN0aW9uIGFkZHJlc3MgaW50byBsZG8gKi8KKyAgc3RvcmVfdW5zaWduZWRfaW50ZWdlcgorICAgICgmZHVtbXlbRlVOQ19MRE9fT0ZGU0VUXSwKKyAgICAgSU5TVFJVQ1RJT05fU0laRSwKKyAgICAgZGVwb3NpdF8xNCAoZnVuICYgTUFTS18xMSwKKwkJIGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoJmR1bW15W0ZVTkNfTERPX09GRlNFVF0sCisJCQkJCSAgIElOU1RSVUNUSU9OX1NJWkUpKSk7CisjaWZkZWYgU1I0RVhQT1JUX0xESUxfT0ZGU0VUCisKKyAgeworICAgIENPUkVfQUREUiB0cmFtcG9saW5lX2FkZHI7CisKKyAgICAvKiBXZSBtYXkgc3RpbGwgbmVlZCBzcjRleHBvcnQncyBhZGRyZXNzIHRvby4gICovCisKKyAgICBpZiAodHJhbXBvbGluZSA9PSBOVUxMKQorICAgICAgeworCW1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKCJfc3I0ZXhwb3J0IiwgTlVMTCwgTlVMTCk7CisJaWYgKG1zeW1ib2wgPT0gTlVMTCkKKwkgIGVycm9yICgiQ2FuJ3QgZmluZCBhbiBhZGRyZXNzIGZvciBfc3I0ZXhwb3J0IHRyYW1wb2xpbmUiKTsgLyogcHVyZWNvdjogZGVhZGNvZGUgKi8KKworCXRyYW1wb2xpbmVfYWRkciA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB0cmFtcG9saW5lX2FkZHIgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAodHJhbXBvbGluZSk7CisKKworICAgIC8qIFN0b3JlIHVwcGVyIDIxIGJpdHMgb2YgdHJhbXBvbGluZSdzIGFkZHJlc3MgaW50byBsZGlsICovCisgICAgc3RvcmVfdW5zaWduZWRfaW50ZWdlcgorICAgICAgKCZkdW1teVtTUjRFWFBPUlRfTERJTF9PRkZTRVRdLAorICAgICAgIElOU1RSVUNUSU9OX1NJWkUsCisgICAgICAgZGVwb3NpdF8yMSAodHJhbXBvbGluZV9hZGRyID4+IDExLAorCQkgICBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKCZkdW1teVtTUjRFWFBPUlRfTERJTF9PRkZTRVRdLAorCQkJCQkgICAgIElOU1RSVUNUSU9OX1NJWkUpKSk7CisKKyAgICAvKiBTdG9yZSBsb3dlciAxMSBiaXRzIG9mIHRyYW1wb2xpbmUncyBhZGRyZXNzIGludG8gbGRvICovCisgICAgc3RvcmVfdW5zaWduZWRfaW50ZWdlcgorICAgICAgKCZkdW1teVtTUjRFWFBPUlRfTERPX09GRlNFVF0sCisgICAgICAgSU5TVFJVQ1RJT05fU0laRSwKKyAgICAgICBkZXBvc2l0XzE0ICh0cmFtcG9saW5lX2FkZHIgJiBNQVNLXzExLAorCQkgICBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKCZkdW1teVtTUjRFWFBPUlRfTERPX09GRlNFVF0sCisJCQkJCSAgICAgSU5TVFJVQ1RJT05fU0laRSkpKTsKKyAgfQorI2VuZGlmCisKKyAgd3JpdGVfcmVnaXN0ZXIgKDIyLCBwYyk7CisKKyAgLyogSWYgd2UgYXJlIGluIGEgc3lzY2FsbCwgdGhlbiB3ZSBzaG91bGQgY2FsbCB0aGUgc3RhY2sgZHVtbXkKKyAgICAgZGlyZWN0bHkuICAkJGR5bmNhbGwgaXMgbm90IG5lZWRlZCBhcyB0aGUga2VybmVsIHNldHMgdXAgdGhlCisgICAgIHNwYWNlIGlkIHJlZ2lzdGVycyBwcm9wZXJseSBiYXNlZCBvbiB0aGUgdmFsdWUgaW4gJXIzMS4gIEluCisgICAgIGZhY3QgY2FsbGluZyAkJGR5bmNhbGwgd2lsbCBub3Qgd29yayBiZWNhdXNlIHRoZSB2YWx1ZSBpbiAlcjIyCisgICAgIHdpbGwgYmUgY2xvYmJlcmVkIG9uIHRoZSBzeXNjYWxsIGV4aXQgcGF0aC4gCisKKyAgICAgU2ltaWxhcmx5IGlmIHRoZSBjdXJyZW50IFBDIGlzIGluIGEgc2hhcmVkIGxpYnJhcnkuICBOb3RlIGhvd2V2ZXIsCisgICAgIHRoaXMgc2NoZW1lIHdvbid0IHdvcmsgaWYgdGhlIHNoYXJlZCBsaWJyYXJ5IGlzbid0IG1hcHBlZCBpbnRvCisgICAgIHRoZSBzYW1lIHNwYWNlIGFzIHRoZSBzdGFjay4gICovCisgIGlmIChmbGFncyAmIDIpCisgICAgcmV0dXJuIHBjOworI2lmbmRlZiBHREJfVEFSR0VUX0lTX1BBX0VMRgorICBlbHNlIGlmIChzb21fc29saWJfZ2V0X2dvdF9ieV9wYyAodGFyZ2V0X3JlYWRfcGMgKGluZmVyaW9yX3BpZCkpKQorICAgIHJldHVybiBwYzsKKyNlbmRpZgorICBlbHNlCisgICAgcmV0dXJuIGR5bmNhbGxfYWRkcjsKKworfQorCisKKworCisvKiBJZiB0aGUgcGlkIGlzIGluIGEgc3lzY2FsbCwgdGhlbiB0aGUgRlAgcmVnaXN0ZXIgaXMgbm90IHJlYWRhYmxlLgorICAgV2UnbGwgcmV0dXJuIHplcm8gaW4gdGhhdCBjYXNlLCByYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIHJlYWQgaXQKKyAgIGFuZCBjYXVzZSBhIHdhcm5pbmcuICovCitDT1JFX0FERFIKK3RhcmdldF9yZWFkX2ZwIChwaWQpCisgIGludCAgcGlkOworeworICBpbnQgZmxhZ3MgPSByZWFkX3JlZ2lzdGVyIChGTEFHU19SRUdOVU0pOworCisgIGlmIChmbGFncyAmIDIpIHsKKyAgICByZXR1cm4gKENPUkVfQUREUikgMDsKKyAgfQorCisgIC8qIFRoaXMgaXMgdGhlIG9ubHkgc2l0ZSB0aGF0IG1heSBkaXJlY3RseSByZWFkX3JlZ2lzdGVyICgpIHRoZSBGUAorICAgICByZWdpc3Rlci4gIEFsbCBvdGhlcnMgbXVzdCB1c2UgVEFSR0VUX1JFQURfRlAgKCkuICovCisgIHJldHVybiByZWFkX3JlZ2lzdGVyIChGUF9SRUdOVU0pOworfQorCisKKy8qIEdldCB0aGUgUEMgZnJvbSAlcjMxIGlmIGN1cnJlbnRseSBpbiBhIHN5c2NhbGwuICBBbHNvIG1hc2sgb3V0IHByaXZpbGVnZQorICAgYml0cy4gICovCisKK0NPUkVfQUREUgordGFyZ2V0X3JlYWRfcGMgKHBpZCkKKyAgICAgaW50IHBpZDsKK3sKKyAgaW50IGZsYWdzID0gcmVhZF9yZWdpc3Rlcl9waWQgKEZMQUdTX1JFR05VTSwgcGlkKTsKKworICAvKiBUaGUgZm9sbG93aW5nIHRlc3QgZG9lcyBub3QgYmVsb25nIGhlcmUuICBJdCBpcyBPUy1zcGVjaWZpYywgYW5kIGJlbG9uZ3MKKyAgICAgaW4gbmF0aXZlIGNvZGUuICAqLworICAvKiBUZXN0IFNTX0lOU1lTQ0FMTCAqLworICBpZiAoZmxhZ3MgJiAyKQorICAgIHJldHVybiByZWFkX3JlZ2lzdGVyX3BpZCAoMzEsIHBpZCkgJiB+MHgzOworCisgIHJldHVybiByZWFkX3JlZ2lzdGVyX3BpZCAoUENfUkVHTlVNLCBwaWQpICYgfjB4MzsKK30KKworLyogV3JpdGUgb3V0IHRoZSBQQy4gIElmIGN1cnJlbnRseSBpbiBhIHN5c2NhbGwsIHRoZW4gYWxzbyB3cml0ZSB0aGUgbmV3CisgICBQQyB2YWx1ZSBpbnRvICVyMzEuICAqLworCit2b2lkCit0YXJnZXRfd3JpdGVfcGMgKHYsIHBpZCkKKyAgICAgQ09SRV9BRERSIHY7CisgICAgIGludCBwaWQ7Cit7CisgIGludCBmbGFncyA9IHJlYWRfcmVnaXN0ZXJfcGlkIChGTEFHU19SRUdOVU0sIHBpZCk7CisKKyAgLyogVGhlIGZvbGxvd2luZyB0ZXN0IGRvZXMgbm90IGJlbG9uZyBoZXJlLiAgSXQgaXMgT1Mtc3BlY2lmaWMsIGFuZCBiZWxvbmdzCisgICAgIGluIG5hdGl2ZSBjb2RlLiAgKi8KKyAgLyogSWYgaW4gYSBzeXNjYWxsLCB0aGVuIHNldCAlcjMxLiAgQWxzbyBtYWtlIHN1cmUgdG8gZ2V0IHRoZSAKKyAgICAgcHJpdmlsZWdlIGJpdHMgc2V0IGNvcnJlY3RseS4gICovCisgIC8qIFRlc3QgU1NfSU5TWVNDQUxMICovCisgIGlmIChmbGFncyAmIDIpCisgICAgd3JpdGVfcmVnaXN0ZXJfcGlkICgzMSwgdiB8IDB4MywgcGlkKTsKKworICB3cml0ZV9yZWdpc3Rlcl9waWQgKFBDX1JFR05VTSwgdiwgcGlkKTsKKyAgd3JpdGVfcmVnaXN0ZXJfcGlkIChOUENfUkVHTlVNLCB2ICsgNCwgcGlkKTsKK30KKworLyogcmV0dXJuIHRoZSBhbGlnbm1lbnQgb2YgYSB0eXBlIGluIGJ5dGVzLiBTdHJ1Y3R1cmVzIGhhdmUgdGhlIG1heGltdW0KKyAgIGFsaWdubWVudCByZXF1aXJlZCBieSB0aGVpciBmaWVsZHMuICovCisKK3N0YXRpYyBpbnQKK2hwcGFfYWxpZ25vZiAodHlwZSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIGludCBtYXhfYWxpZ24sIGFsaWduLCBpOworICBDSEVDS19UWVBFREVGICh0eXBlKTsKKyAgc3dpdGNoIChUWVBFX0NPREUgKHR5cGUpKQorICAgIHsKKyAgICBjYXNlIFRZUEVfQ09ERV9QVFI6CisgICAgY2FzZSBUWVBFX0NPREVfSU5UOgorICAgIGNhc2UgVFlQRV9DT0RFX0ZMVDoKKyAgICAgIHJldHVybiBUWVBFX0xFTkdUSCAodHlwZSk7CisgICAgY2FzZSBUWVBFX0NPREVfQVJSQVk6CisgICAgICByZXR1cm4gaHBwYV9hbGlnbm9mIChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIDApKTsKKyAgICBjYXNlIFRZUEVfQ09ERV9TVFJVQ1Q6CisgICAgY2FzZSBUWVBFX0NPREVfVU5JT046CisgICAgICBtYXhfYWxpZ24gPSAxOworICAgICAgZm9yIChpID0gMDsgaSA8IFRZUEVfTkZJRUxEUyAodHlwZSk7IGkrKykKKwl7CisJICAvKiBCaXQgZmllbGRzIGhhdmUgbm8gcmVhbCBhbGlnbm1lbnQuICovCisJICAvKiBpZiAoIVRZUEVfRklFTERfQklUUE9TICh0eXBlLCBpKSkgKi8KKwkgIGlmICghVFlQRV9GSUVMRF9CSVRTSVpFICh0eXBlLCBpKSkgLyogZWx6OiB0aGlzIHNob3VsZCBiZSBiaXRzaXplICovCisJICAgIHsKKwkgICAgICBhbGlnbiA9IGhwcGFfYWxpZ25vZiAoVFlQRV9GSUVMRF9UWVBFICh0eXBlLCBpKSk7CisJICAgICAgbWF4X2FsaWduID0gbWF4IChtYXhfYWxpZ24sIGFsaWduKTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBtYXhfYWxpZ247CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiA0OworICAgIH0KK30KKworLyogUHJpbnQgdGhlIHJlZ2lzdGVyIHJlZ251bSwgb3IgYWxsIHJlZ2lzdGVycyBpZiByZWdudW0gaXMgLTEgKi8KKwordm9pZAorcGFfZG9fcmVnaXN0ZXJzX2luZm8gKHJlZ251bSwgZnByZWdzKQorICAgICBpbnQgcmVnbnVtOworICAgICBpbnQgZnByZWdzOworeworICBjaGFyIHJhd19yZWdzIFtSRUdJU1RFUl9CWVRFU107CisgIGludCBpOworCisgIC8qIE1ha2UgYSBjb3B5IG9mIGdkYidzIHNhdmUgYXJlYSAobWF5IGNhdXNlIGFjdHVhbAorICAgICByZWFkcyBmcm9tIHRoZSB0YXJnZXQpLiAqLworICBmb3IgKGkgPSAwOyBpIDwgTlVNX1JFR1M7IGkrKykKKyAgICByZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyAoaSwgcmF3X3JlZ3MgKyBSRUdJU1RFUl9CWVRFIChpKSk7CisKKyAgaWYgKHJlZ251bSA9PSAtMSkKKyAgICBwYV9wcmludF9yZWdpc3RlcnMgKHJhd19yZWdzLCByZWdudW0sIGZwcmVncyk7CisgIGVsc2UgaWYgKHJlZ251bSA8IEZQNF9SRUdOVU0pIHsKKyAgICBsb25nIHJlZ192YWxbMl07CisgICAgICAKKyAgICAvKiBXaHkgaXMgdGhlIHZhbHVlIG5vdCBwYXNzZWQgdGhyb3VnaCAiZXh0cmFjdF9zaWduZWRfaW50ZWdlciIKKyAgICAgICBhcyBpbiAicGFfcHJpbnRfcmVnaXN0ZXJzIiBiZWxvdz8gKi8KKyAgICBwYV9yZWdpc3Rlcl9sb29rX2FzaWRlKHJhd19yZWdzLCByZWdudW0sICZyZWdfdmFsWzBdKTsKKworICAgIGlmKCFpc19wYV8yKSB7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIiVzICV4XG4iLCBSRUdJU1RFUl9OQU1FIChyZWdudW0pLCByZWdfdmFsWzFdKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvKiBGYW5jeSAlIGZvcm1hdHMgdG8gcHJldmVudCBsZWFkaW5nIHplcm9zLiAqLworICAgICAgaWYocmVnX3ZhbFswXSA9PSAwKQorCXByaW50Zl91bmZpbHRlcmVkKCIlcyAleFxuIiwgUkVHSVNURVJfTkFNRSAocmVnbnVtKSwgcmVnX3ZhbFsxXSk7CisgICAgICBlbHNlCisJcHJpbnRmX3VuZmlsdGVyZWQoIiVzICV4JTguOHhcbiIsIFJFR0lTVEVSX05BTUUgKHJlZ251bSksCisJCQkgICByZWdfdmFsWzBdLCByZWdfdmFsWzFdKTsgICAgICAgIAorICAgIH0KKyAgfQorICBlbHNlCisgICAgICAvKiBOb3RlIHRoYXQgcmVhbCBmbG9hdGluZyBwb2ludCB2YWx1ZXMgb25seSBzdGFydCBhdAorICAgICAgICAgRlA0X1JFR05VTS4gIEZQMCBhbmQgdXAgYXJlIGp1c3Qgc3RhdHVzIGFuZCBlcnJvcgorICAgICAgICAgcmVnaXN0ZXJzLCB3aGljaCBoYXZlIGludGVncmFsIChiaXQpIHZhbHVlcy4gKi8KKyAgICBwYV9wcmludF9mcF9yZWcgKHJlZ251bSk7Cit9CisKKy8qKioqKioqKioqIG5ldyBmdW5jdGlvbiAqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK3BhX2RvX3N0cmNhdF9yZWdpc3RlcnNfaW5mbyAocmVnbnVtLCBmcHJlZ3MsIHN0cmVhbSwgcHJlY2lzaW9uKQorICAgICBpbnQgcmVnbnVtOworICAgICBpbnQgZnByZWdzOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBlbnVtIHByZWNpc2lvbl90eXBlIHByZWNpc2lvbjsKK3sKKyAgY2hhciByYXdfcmVncyBbUkVHSVNURVJfQllURVNdOworICBpbnQgaTsKKworICAvKiBNYWtlIGEgY29weSBvZiBnZGIncyBzYXZlIGFyZWEgKG1heSBjYXVzZSBhY3R1YWwKKyAgICAgcmVhZHMgZnJvbSB0aGUgdGFyZ2V0KS4gKi8gIAorICBmb3IgKGkgPSAwOyBpIDwgTlVNX1JFR1M7IGkrKykKKyAgICByZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyAoaSwgcmF3X3JlZ3MgKyBSRUdJU1RFUl9CWVRFIChpKSk7CisKKyAgaWYgKHJlZ251bSA9PSAtMSkKKyAgICBwYV9zdHJjYXRfcmVnaXN0ZXJzIChyYXdfcmVncywgcmVnbnVtLCBmcHJlZ3MsIHN0cmVhbSk7CisKKyAgZWxzZSBpZiAocmVnbnVtIDwgRlA0X1JFR05VTSkgeworICAgIGxvbmcgcmVnX3ZhbFsyXTsKKyAgICAgIAorICAgIC8qIFdoeSBpcyB0aGUgdmFsdWUgbm90IHBhc3NlZCB0aHJvdWdoICJleHRyYWN0X3NpZ25lZF9pbnRlZ2VyIgorICAgICAgIGFzIGluICJwYV9wcmludF9yZWdpc3RlcnMiIGJlbG93PyAqLworICAgIHBhX3JlZ2lzdGVyX2xvb2tfYXNpZGUocmF3X3JlZ3MsIHJlZ251bSwgJnJlZ192YWxbMF0pOworCisgICAgaWYoIWlzX3BhXzIpIHsKKyAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoc3RyZWFtLCAiJXMgJXgiLCBSRUdJU1RFUl9OQU1FIChyZWdudW0pLCByZWdfdmFsWzFdKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvKiBGYW5jeSAlIGZvcm1hdHMgdG8gcHJldmVudCBsZWFkaW5nIHplcm9zLiAqLworICAgICAgaWYocmVnX3ZhbFswXSA9PSAwKQorCWZwcmludGZfdW5maWx0ZXJlZChzdHJlYW0sICIlcyAleCIsIFJFR0lTVEVSX05BTUUgKHJlZ251bSksCisJCQkgICByZWdfdmFsWzFdKTsKKyAgICAgIGVsc2UKKwlmcHJpbnRmX3VuZmlsdGVyZWQoc3RyZWFtLCAiJXMgJXglOC44eCIsIFJFR0lTVEVSX05BTUUgKHJlZ251bSksCisJCQkgICByZWdfdmFsWzBdLCByZWdfdmFsWzFdKTsgICAgICAgIAorICAgIH0KKyAgfQorICBlbHNlCisgICAgICAvKiBOb3RlIHRoYXQgcmVhbCBmbG9hdGluZyBwb2ludCB2YWx1ZXMgb25seSBzdGFydCBhdAorICAgICAgICAgRlA0X1JFR05VTS4gIEZQMCBhbmQgdXAgYXJlIGp1c3Qgc3RhdHVzIGFuZCBlcnJvcgorICAgICAgICAgcmVnaXN0ZXJzLCB3aGljaCBoYXZlIGludGVncmFsIChiaXQpIHZhbHVlcy4gKi8KKyAgICBwYV9zdHJjYXRfZnBfcmVnIChyZWdudW0sIHN0cmVhbSwgcHJlY2lzaW9uKTsKK30KKworLyogSWYgdGhpcyBpcyBhIFBBMi4wIG1hY2hpbmUsIGZldGNoIHRoZSByZWFsIDY0LWJpdCByZWdpc3RlcgorICAgdmFsdWUuICBPdGhlcndpc2UgdXNlIHRoZSBpbmZvIGZyb20gZ2RiJ3Mgc2F2ZWQgcmVnaXN0ZXIgYXJlYS4KKworICAgTm90ZSB0aGF0IHJlZ192YWwgaXMgcmVhbGx5IGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5IG9mIGxvbmdzLAorICAgd2l0aCB0d28gZWxlbWVudHMuICovCitzdGF0aWMgdm9pZAorcGFfcmVnaXN0ZXJfbG9va19hc2lkZShyYXdfcmVncywgcmVnbnVtLCByYXdfdmFsKQorICAgICBjaGFyICpyYXdfcmVnczsKKyAgICAgaW50ICAgcmVnbnVtOworICAgICBsb25nICpyYXdfdmFsOworeworICBzdGF0aWMgaW50IGtub3dfd2hpY2ggPSAwOyAgLyogRmFsc2UgKi8KKworICBpbnQgICAgICAgICAgcmVnYWRkcjsKKyAgdW5zaWduZWQgaW50IG9mZnNldDsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIGludCAgICAgICAgICBzdGFydDsKKyAgCisgIAorICBjaGFyIGJ1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworICBsb25nIGxvbmcgcmVnX3ZhbDsKKworICBpZigha25vd193aGljaCkgeworICAgICBpZihDUFVfUEFfUklTQzJfMCA9PSBzeXNjb25mKF9TQ19DUFVfVkVSU0lPTikpIHsKKyAgICAgICAgaXNfcGFfMiA9ICgxPT0xKTsKKyAgICAgfQorICAgICAKKyAgICAga25vd193aGljaCA9IDE7ICAvKiBUcnVlICovCisgIH0KKworICByYXdfdmFsWzBdID0gMDsKKyAgcmF3X3ZhbFsxXSA9IDA7CisKKyAgaWYoIWlzX3BhXzIpIHsKKyAgICAgIHJhd192YWxbMV0gPSAqKGxvbmcgKikocmF3X3JlZ3MgKyBSRUdJU1RFUl9CWVRFKHJlZ251bSkpOworICAgICAgcmV0dXJuOworICB9CisKKyAgLyogQ29kZSBiZWxvdyBjb3BpZWQgZnJvbSBocHBhaC1uYXQuYywgd2l0aCBmaXhlcyBmb3Igd2lkZQorICAgICByZWdpc3RlcnMsIHVzaW5nIGRpZmZlcmVudCBhcmVhIG9mIHNhdmVfc3RhdGUsIGV0Yy4gKi8KKyAgaWYgKHJlZ251bSA9PSBGTEFHU19SRUdOVU0gfHwgcmVnbnVtID49IEZQMF9SRUdOVU0gfHwKKyAgICAgICFIQVZFX1NUUlVDVF9TQVZFX1NUQVRFX1QgfHwgIUhBVkVfU1RSVUNUX01FTUJFUl9TU19XSURFKSB7CisgICAgICAvKiBVc2UgbmFycm93IHJlZ3MgYXJlYSBvZiBzYXZlX3N0YXRlIGFuZCBkZWZhdWx0IG1hY3JvLiAqLworICAgICAgb2Zmc2V0ICA9IFVfUkVHU19PRkZTRVQ7CisgICAgICByZWdhZGRyID0gcmVnaXN0ZXJfYWRkcihyZWdudW0sIG9mZnNldCk7CisgICAgICBzdGFydCAgID0gMTsKKyAgfQorICBlbHNlIHsKKyAgICAgIC8qIFVzZSB3aWRlIHJlZ3MgYXJlYSwgYW5kIGNhbGN1bGF0ZSByZWdpc3RlcnMgYXMgOCBieXRlcyB3aWRlLgorCisgICAgICAgICBXZSdkIGxpa2UgdG8gZG8gdGhpcywgYnV0IGN1cnJlbnQgdmVyc2lvbiBvZiAiQyIgZG9lc24ndAorICAgICAgICAgcGVybWl0ICJvZmZzZXRvZiI6CisKKyAgICAgICAgICAgIG9mZnNldCAgPSBvZmZzZXRvZihzYXZlX3N0YXRlX3QsIHNzX3dpZGUpOworCisgICAgICAgICBOb3RlIHRoYXQgdG8gYXZvaWQgIkMiIGRvaW5nIHR5cGVkIHBvaW50ZXIgYXJpdGhtZXRpYywgd2UKKyAgICAgICAgIGhhdmUgdG8gY2FzdCBhd2F5IHRoZSB0eXBlIGluIG91ciBvZmZzZXQgY2FsY3VsYXRpb246CisgICAgICAgICBvdGhlcndpc2Ugd2UgZ2V0IGFuIG9mZnNldCBvZiAxISAqLworCisgICAgICAvKiAjaWYgdGhlIGZvbGxvd2luZyBjb2RlIG91dCBzbyB0aGF0IHRoaXMgZmlsZSBjYW4gc3RpbGwgYmUKKyAgICAgICAgIGNvbXBpbGVkIG9uIG9sZGVyIEhQVVggYm94ZXMgKDwgMTAuMjApIHdoaWNoIGRvbid0IGhhdmUKKyAgICAgICAgIHRoaXMgc3RydWN0dXJlL3N0cnVjdHVyZSBtZW1iZXIuICAqLworI2lmIEhBVkVfU1RSVUNUX1NBVkVfU1RBVEVfVCA9PSAxICYmIEhBVkVfU1RSVUNUX01FTUJFUl9TU19XSURFID09IDEKKyAgICAgIHNhdmVfc3RhdGVfdCB0ZW1wOworCisgICAgICBvZmZzZXQgPSAoKGludCkgJnRlbXAuc3Nfd2lkZSkgLSAoKGludCkgJnRlbXApOworICAgICAgcmVnYWRkciA9IG9mZnNldCArIHJlZ251bSAqIDg7CisgICAgICBzdGFydCAgID0gMDsKKyNlbmRpZgorICB9CisgICAKKyAgZm9yKGkgPSBzdGFydDsgaSA8IDI7IGkrKykKKyAgICB7CisgICAgICBlcnJubyA9IDA7CisgICAgICByYXdfdmFsW2ldID0gY2FsbF9wdHJhY2UgKFBUX1JVUkVHUywgaW5mZXJpb3JfcGlkLAorICAJIAkgICAgICAgICAgICAgICAgKFBUUkFDRV9BUkczX1RZUEUpIHJlZ2FkZHIsIDApOworICAgICAgaWYgKGVycm5vICE9IDApCisJeworCSAgLyogV2FybmluZywgbm90IGVycm9yLCBpbiBjYXNlIHdlIGFyZSBhdHRhY2hlZDsgc29tZXRpbWVzIHRoZQorCSAgICAga2VybmVsIGRvZXNuJ3QgbGV0IHVzIGF0IHRoZSByZWdpc3RlcnMuICAqLworCSAgY2hhciAqZXJyID0gc2FmZV9zdHJlcnJvciAoZXJybm8pOworCSAgY2hhciAqbXNnID0gYWxsb2NhIChzdHJsZW4gKGVycikgKyAxMjgpOworCSAgc3ByaW50ZiAobXNnLCAicmVhZGluZyByZWdpc3RlciAlczogJXMiLCBSRUdJU1RFUl9OQU1FIChyZWdudW0pLCBlcnIpOworCSAgd2FybmluZyAobXNnKTsKKwkgIGdvdG8gZXJyb3JfZXhpdDsKKwl9CisKKyAgICAgIHJlZ2FkZHIgKz0gc2l6ZW9mIChsb25nKTsKKyAgICB9CisgICAgCisgIGlmIChyZWdudW0gPT0gUENPUV9IRUFEX1JFR05VTSB8fCByZWdudW0gPT0gUENPUV9UQUlMX1JFR05VTSkKKyAgICByYXdfdmFsWzFdICY9IH4weDM7IC8qIEkgdGhpbmsgd2UncmUgbWFza2luZyBvdXQgc3BhY2UgYml0cyAqLworCitlcnJvcl9leGl0OgorICA7Cit9CisKKy8qICJJbmZvIGFsbC1yZWciIGNvbW1hbmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3N0YXRpYyB2b2lkCitwYV9wcmludF9yZWdpc3RlcnMgKHJhd19yZWdzLCByZWdudW0sIGZwcmVncykKKyAgICAgY2hhciAqcmF3X3JlZ3M7CisgICAgIGludCByZWdudW07CisgICAgIGludCBmcHJlZ3M7Cit7CisgIGludCBpLGo7CisgIGxvbmcgcmF3X3ZhbFsyXTsgICAvKiBBbGFzLCB3ZSBhcmUgY29tcGlsZWQgc28gdGhhdCAibG9uZyBsb25nIiBpcyAzMiBiaXRzICovCisgIGxvbmcgbG9uZ192YWw7CisKKyAgZm9yIChpID0gMDsgaSA8IDE4OyBpKyspCisgICAgeworICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKwl7CisgICAgICAgICAgLyogUTogV2h5IGlzIHRoZSB2YWx1ZSBwYXNzZWQgdGhyb3VnaCAiZXh0cmFjdF9zaWduZWRfaW50ZWdlciIsCisJICAgICAgICB3aGlsZSBhYm92ZSwgaW4gInBhX2RvX3JlZ2lzdGVyc19pbmZvIiBpdCBpc24ndD8KKyAgICAgICAgICAgICBBOiA/ICovCisJICBwYV9yZWdpc3Rlcl9sb29rX2FzaWRlKHJhd19yZWdzLCBpKyhqKjE4KSwgJnJhd192YWxbMF0pOworCisgICAgICAgICAgLyogRXZlbiBmYW5jaWVyICUgZm9ybWF0cyB0byBwcmV2ZW50IGxlYWRpbmcgemVyb3MKKyAgICAgICAgICAgICBhbmQgc3RpbGwgbWFpbnRhaW4gdGhlIG91dHB1dCBpbiBjb2x1bW5zLiAqLworICAgICAgICAgIGlmKCFpc19wYV8yKSB7CisgICAgICAgICAgICAgIC8qIEJlaW5nIGJpZy1lbmRpYW4sIG9uIHRoaXMgbWFjaGluZSB0aGUgbG93IGJpdHMKKyAgICAgICAgICAgICAgICAgKHRoZSBvbmVzIHdlIHdhbnQgdG8gbG9vayBhdCkgYXJlIGluIHRoZSBzZWNvbmQgbG9uZ3dvcmQuICovCisgICAJICAgICAgbG9uZ192YWwgPSBleHRyYWN0X3NpZ25lZF9pbnRlZ2VyICgmcmF3X3ZhbFsxXSwgNCk7CisgIAkgICAgICBwcmludGZfZmlsdGVyZWQgKCIlOC44czogJTh4ICAiLAorCQkJICAgICAgIFJFR0lTVEVSX05BTUUgKGkrKGoqMTgpKSwgbG9uZ192YWwpOworCSAgfQorICAgICAgICAgIGVsc2UgeworICAgCSAgICAgIC8qIHJhd192YWwgPSBleHRyYWN0X3NpZ25lZF9pbnRlZ2VyKCZyYXdfdmFsLCA4KTsgKi8KKyAgICAgICAgICAgICAgaWYocmF3X3ZhbFswXSA9PSAwKQorICAJICAgICAgICAgIHByaW50Zl9maWx0ZXJlZCgiJTguOHM6ICAgICAgICAgJTh4ICAiLAorCQkJCSAgUkVHSVNURVJfTkFNRSAoaSsoaioxOCkpLCByYXdfdmFsWzFdKTsKKyAgICAgICAgICAgICAgZWxzZQorICAJICAgICAgICAgIHByaW50Zl9maWx0ZXJlZCgiJTguOHM6ICU4eCU4Ljh4ICAiLCBSRUdJU1RFUl9OQU1FIChpKyhqKjE4KSksCisJCQkJICByYXdfdmFsWzBdLCByYXdfdmFsWzFdKTsKKyAgICAgICAgICB9CisJfQorICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcbiIpOworICAgIH0KKyAgCisgIGlmIChmcHJlZ3MpCisgIGZvciAoaSA9IEZQNF9SRUdOVU07IGkgPCBOVU1fUkVHUzsgaSsrKSAgLyogRlA0X1JFR05VTSA9PSA3MiAqLworICAgICAgcGFfcHJpbnRfZnBfcmVnIChpKTsKK30KKworLyoqKioqKioqKioqKiogbmV3IGZ1bmN0aW9uICoqKioqKioqKioqKioqKioqKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitzdGF0aWMgdm9pZAorcGFfc3RyY2F0X3JlZ2lzdGVycyAocmF3X3JlZ3MsIHJlZ251bSwgZnByZWdzLCBzdHJlYW0pCisgICAgIGNoYXIgKnJhd19yZWdzOworICAgICBpbnQgcmVnbnVtOworICAgICBpbnQgZnByZWdzOworICAgICBHREJfRklMRSAqc3RyZWFtOworeworICBpbnQgaSxqOworICBsb25nIHJhd192YWxbMl07ICAgLyogQWxhcywgd2UgYXJlIGNvbXBpbGVkIHNvIHRoYXQgImxvbmcgbG9uZyIgaXMgMzIgYml0cyAqLworICBsb25nIGxvbmdfdmFsOworICBlbnVtIHByZWNpc2lvbl90eXBlIHByZWNpc2lvbjsKKworICBwcmVjaXNpb24gPSB1bnNwZWNpZmllZF9wcmVjaXNpb247CisKKyAgZm9yIChpID0gMDsgaSA8IDE4OyBpKyspCisgICAgeworICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKwl7CisgICAgICAgICAgLyogUTogV2h5IGlzIHRoZSB2YWx1ZSBwYXNzZWQgdGhyb3VnaCAiZXh0cmFjdF9zaWduZWRfaW50ZWdlciIsCisgICAgICAgICAgICAgICAgd2hpbGUgYWJvdmUsIGluICJwYV9kb19yZWdpc3RlcnNfaW5mbyIgaXQgaXNuJ3Q/CisgICAgICAgICAgICAgQTogPyAqLworCSAgcGFfcmVnaXN0ZXJfbG9va19hc2lkZShyYXdfcmVncywgaSsoaioxOCksICZyYXdfdmFsWzBdKTsKKworICAgICAgICAgIC8qIEV2ZW4gZmFuY2llciAlIGZvcm1hdHMgdG8gcHJldmVudCBsZWFkaW5nIHplcm9zCisgICAgICAgICAgICAgYW5kIHN0aWxsIG1haW50YWluIHRoZSBvdXRwdXQgaW4gY29sdW1ucy4gKi8KKyAgICAgICAgICBpZighaXNfcGFfMikgeworICAgICAgICAgICAgICAvKiBCZWluZyBiaWctZW5kaWFuLCBvbiB0aGlzIG1hY2hpbmUgdGhlIGxvdyBiaXRzCisgICAgICAgICAgICAgICAgICh0aGUgb25lcyB3ZSB3YW50IHRvIGxvb2sgYXQpIGFyZSBpbiB0aGUgc2Vjb25kIGxvbmd3b3JkLiAqLworICAgCSAgICAgIGxvbmdfdmFsID0gZXh0cmFjdF9zaWduZWRfaW50ZWdlcigmcmF3X3ZhbFsxXSwgNCk7CisgIAkgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlOC44czogJTh4ICAiLCBSRUdJU1RFUl9OQU1FIChpKyhqKjE4KSksIGxvbmdfdmFsKTsKKwkgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgIAkgICAgICAvKiByYXdfdmFsID0gZXh0cmFjdF9zaWduZWRfaW50ZWdlcigmcmF3X3ZhbCwgOCk7ICovCisgICAgICAgICAgICAgIGlmKHJhd192YWxbMF0gPT0gMCkKKyAgCSAgICAgICAgICBmcHJpbnRmX2ZpbHRlcmVkKHN0cmVhbSwgIiU4LjhzOiAgICAgICAgICU4eCAgIiwgUkVHSVNURVJfTkFNRSAoaSsoaioxOCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfdmFsWzFdKTsKKyAgICAgICAgICAgICAgZWxzZQorICAJICAgICAgICAgIGZwcmludGZfZmlsdGVyZWQoc3RyZWFtLCAiJTguOHM6ICU4eCU4Ljh4ICAiLCBSRUdJU1RFUl9OQU1FIChpKyhqKjE4KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfdmFsWzBdLCByYXdfdmFsWzFdKTsKKyAgICAgICAgICB9CisJfQorICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChzdHJlYW0sICJcbiIpOworICAgIH0KKyAgCisgIGlmIChmcHJlZ3MpCisgIGZvciAoaSA9IEZQNF9SRUdOVU07IGkgPCBOVU1fUkVHUzsgaSsrKSAgLyogRlA0X1JFR05VTSA9PSA3MiAqLworICAgICAgcGFfc3RyY2F0X2ZwX3JlZyAoaSwgc3RyZWFtLCBwcmVjaXNpb24pOworfQorCitzdGF0aWMgdm9pZAorcGFfcHJpbnRfZnBfcmVnIChpKQorICAgICBpbnQgaTsKK3sKKyAgY2hhciByYXdfYnVmZmVyW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisgIGNoYXIgdmlydHVhbF9idWZmZXJbTUFYX1JFR0lTVEVSX1ZJUlRVQUxfU0laRV07CisKKyAgLyogR2V0IDMyYml0cyBvZiBkYXRhLiAgKi8KKyAgcmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMgKGksIHJhd19idWZmZXIpOworCisgIC8qIFB1dCBpdCBpbiB0aGUgYnVmZmVyLiAgTm8gY29udmVyc2lvbnMgYXJlIGV2ZXIgbmVjZXNzYXJ5LiAgKi8KKyAgbWVtY3B5ICh2aXJ0dWFsX2J1ZmZlciwgcmF3X2J1ZmZlciwgUkVHSVNURVJfUkFXX1NJWkUgKGkpKTsKKworICBmcHV0c19maWx0ZXJlZCAoUkVHSVNURVJfTkFNRSAoaSksIGdkYl9zdGRvdXQpOworICBwcmludF9zcGFjZXNfZmlsdGVyZWQgKDggLSBzdHJsZW4gKFJFR0lTVEVSX05BTUUgKGkpKSwgZ2RiX3N0ZG91dCk7CisgIGZwdXRzX2ZpbHRlcmVkICgiKHNpbmdsZSBwcmVjaXNpb24pICAgICAiLCBnZGJfc3Rkb3V0KTsKKworICB2YWxfcHJpbnQgKFJFR0lTVEVSX1ZJUlRVQUxfVFlQRSAoaSksIHZpcnR1YWxfYnVmZmVyLCAwLCAwLCBnZGJfc3Rkb3V0LCAwLAorCSAgICAgMSwgMCwgVmFsX3ByZXR0eV9kZWZhdWx0KTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKworICAvKiBJZiAiaSIgaXMgZXZlbiwgdGhlbiB0aGlzIHJlZ2lzdGVyIGNhbiBhbHNvIGJlIGEgZG91YmxlLXByZWNpc2lvbgorICAgICBGUCByZWdpc3Rlci4gIER1bXAgaXQgb3V0IGFzIHN1Y2guICAqLworICBpZiAoKGkgJSAyKSA9PSAwKQorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgZGF0YSBpbiByYXcgZm9ybWF0IGZvciB0aGUgMm5kIGhhbGYuICAqLworICAgICAgcmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMgKGkgKyAxLCByYXdfYnVmZmVyKTsKKworICAgICAgLyogQ29weSBpdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBwYXJ0IG9mIHRoZSB2aXJ0dWFsIGJ1ZmZlci4gICovCisgICAgICBtZW1jcHkgKHZpcnR1YWxfYnVmZmVyICsgUkVHSVNURVJfUkFXX1NJWkUgKGkpLCByYXdfYnVmZmVyLAorCSAgICAgIFJFR0lTVEVSX1JBV19TSVpFIChpKSk7CisKKyAgICAgIC8qIER1bXAgaXQgYXMgYSBkb3VibGUuICAqLworICAgICAgZnB1dHNfZmlsdGVyZWQgKFJFR0lTVEVSX05BTUUgKGkpLCBnZGJfc3Rkb3V0KTsKKyAgICAgIHByaW50X3NwYWNlc19maWx0ZXJlZCAoOCAtIHN0cmxlbiAoUkVHSVNURVJfTkFNRSAoaSkpLCBnZGJfc3Rkb3V0KTsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiKGRvdWJsZSBwcmVjaXNpb24pICAgICAiLCBnZGJfc3Rkb3V0KTsKKworICAgICAgdmFsX3ByaW50IChidWlsdGluX3R5cGVfZG91YmxlLCB2aXJ0dWFsX2J1ZmZlciwgMCwgMCwgZ2RiX3N0ZG91dCwgMCwKKwkJIDEsIDAsIFZhbF9wcmV0dHlfZGVmYXVsdCk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKiBuZXcgZnVuY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorcGFfc3RyY2F0X2ZwX3JlZyAoaSwgc3RyZWFtLCBwcmVjaXNpb24pCisgICAgIGludCBpOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBlbnVtIHByZWNpc2lvbl90eXBlIHByZWNpc2lvbjsKK3sKKyAgY2hhciByYXdfYnVmZmVyW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisgIGNoYXIgdmlydHVhbF9idWZmZXJbTUFYX1JFR0lTVEVSX1ZJUlRVQUxfU0laRV07CisKKyAgZnB1dHNfZmlsdGVyZWQgKFJFR0lTVEVSX05BTUUgKGkpLCBzdHJlYW0pOworICBwcmludF9zcGFjZXNfZmlsdGVyZWQgKDggLSBzdHJsZW4gKFJFR0lTVEVSX05BTUUgKGkpKSwgc3RyZWFtKTsKKworICAvKiBHZXQgMzJiaXRzIG9mIGRhdGEuICAqLworICByZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyAoaSwgcmF3X2J1ZmZlcik7CisKKyAgLyogUHV0IGl0IGluIHRoZSBidWZmZXIuICBObyBjb252ZXJzaW9ucyBhcmUgZXZlciBuZWNlc3NhcnkuICAqLworICBtZW1jcHkgKHZpcnR1YWxfYnVmZmVyLCByYXdfYnVmZmVyLCBSRUdJU1RFUl9SQVdfU0laRSAoaSkpOworCisgIGlmIChwcmVjaXNpb24gPT0gZG91YmxlX3ByZWNpc2lvbiAmJiAoaSAlIDIpID09IDApCisgICAgeworCisgICAgY2hhciByYXdfYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisgCisgICAgLyogR2V0IHRoZSBkYXRhIGluIHJhdyBmb3JtYXQgZm9yIHRoZSAybmQgaGFsZi4gICovCisgICAgcmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMgKGkgKyAxLCByYXdfYnVmKTsKKyAKKyAgICAvKiBDb3B5IGl0IGludG8gdGhlIGFwcHJvcHJpYXRlIHBhcnQgb2YgdGhlIHZpcnR1YWwgYnVmZmVyLiAgKi8KKyAgICBtZW1jcHkgKHZpcnR1YWxfYnVmZmVyICsgUkVHSVNURVJfUkFXX1NJWkUoaSksIHJhd19idWYsIFJFR0lTVEVSX1JBV19TSVpFIChpKSk7CisKKyAgICB2YWxfcHJpbnQgKGJ1aWx0aW5fdHlwZV9kb3VibGUsIHZpcnR1YWxfYnVmZmVyLCAwLCAwICwgc3RyZWFtLCAwLCAKKyAgICAgICAgICAgICAgIDEsIDAsIFZhbF9wcmV0dHlfZGVmYXVsdCk7CisKKyAgICB9CisgIGVsc2UgeyAKKyAgICB2YWxfcHJpbnQgKFJFR0lTVEVSX1ZJUlRVQUxfVFlQRSAoaSksIHZpcnR1YWxfYnVmZmVyLCAwLCAwLCBzdHJlYW0sIDAsCisJICAgICAgIDEsIDAsIFZhbF9wcmV0dHlfZGVmYXVsdCk7CisgIH0KKworfQorCisvKiBSZXR1cm4gb25lIGlmIFBDIGlzIGluIHRoZSBjYWxsIHBhdGggb2YgYSB0cmFtcG9saW5lLCBlbHNlIHJldHVybiB6ZXJvLgorCisgICBOb3RlIHdlIHJldHVybiBvbmUgZm9yICphbnkqIGNhbGwgdHJhbXBvbGluZSAobG9uZy1jYWxsLCBhcmctcmVsb2MpLCBub3QKKyAgIGp1c3Qgc2hhcmVkIGxpYnJhcnkgdHJhbXBvbGluZXMgKGltcG9ydCwgZXhwb3J0KS4gICovCisKK2ludAoraW5fc29saWJfY2FsbF90cmFtcG9saW5lIChwYywgbmFtZSkKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBjaGFyICpuYW1lOworeworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1pbnN5bTsKKyAgc3RydWN0IHVud2luZF90YWJsZV9lbnRyeSAqdTsKKyAgc3RhdGljIENPUkVfQUREUiBkeW5jYWxsID0gMDsKKyAgc3RhdGljIENPUkVfQUREUiBzcjRleHBvcnQgPSAwOworCisvKiBGSVhNRSBYWFggLSBkeW5jYWxsIGFuZCBzcjRleHBvcnQgbXVzdCBiZSBpbml0aWFsaXplZCB3aGVuZXZlciB3ZSBnZXQgYQorICAgbmV3IGV4ZWMgZmlsZSAqLworCisgIC8qIEZpcnN0IHNlZSBpZiBQQyBpcyBpbiBvbmUgb2YgdGhlIHR3byBDLWxpYnJhcnkgdHJhbXBvbGluZXMuICAqLworICBpZiAoIWR5bmNhbGwpCisgICAgeworICAgICAgbWluc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sICgiJCRkeW5jYWxsIiwgTlVMTCwgTlVMTCk7CisgICAgICBpZiAobWluc3ltKQorCWR5bmNhbGwgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobWluc3ltKTsKKyAgICAgIGVsc2UKKwlkeW5jYWxsID0gLTE7CisgICAgfQorCisgIGlmICghc3I0ZXhwb3J0KQorICAgIHsKKyAgICAgIG1pbnN5bSA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoIl9zcjRleHBvcnQiLCBOVUxMLCBOVUxMKTsKKyAgICAgIGlmIChtaW5zeW0pCisJc3I0ZXhwb3J0ID0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1pbnN5bSk7CisgICAgICBlbHNlCisJc3I0ZXhwb3J0ID0gLTE7CisgICAgfQorCisgIGlmIChwYyA9PSBkeW5jYWxsIHx8IHBjID09IHNyNGV4cG9ydCkKKyAgICByZXR1cm4gMTsKKworICAvKiBHZXQgdGhlIHVud2luZCBkZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8gUEMsIHJldHVybiB6ZXJvCisgICAgIGlmIG5vIHVud2luZCB3YXMgZm91bmQuICAqLworICB1ID0gZmluZF91bndpbmRfZW50cnkgKHBjKTsKKyAgaWYgKCF1KQorICAgIHJldHVybiAwOworCisgIC8qIElmIHRoaXMgaXNuJ3QgYSBsaW5rZXIgc3R1YiwgdGhlbiByZXR1cm4gbm93LiAgKi8KKyAgaWYgKHUtPnN0dWJfdW53aW5kLnN0dWJfdHlwZSA9PSAwKQorICAgIHJldHVybiAwOworCisgIC8qIEJ5IGRlZmluaXRpb24gYSBsb25nLWJyYW5jaCBzdHViIGlzIGEgY2FsbCBzdHViLiAgKi8KKyAgaWYgKHUtPnN0dWJfdW53aW5kLnN0dWJfdHlwZSA9PSBMT05HX0JSQU5DSCkKKyAgICByZXR1cm4gMTsKKworICAvKiBUaGUgY2FsbCBhbmQgcmV0dXJuIHBhdGggZXhlY3V0ZSB0aGUgc2FtZSBpbnN0cnVjdGlvbnMgd2l0aGluCisgICAgIGFuIElNUE9SVCBzdHViISAgU28gYW4gSU1QT1JUIHN0dWIgaXMgYm90aCBhIGNhbGwgYW5kIHJldHVybgorICAgICB0cmFtcG9saW5lLiAgKi8KKyAgaWYgKHUtPnN0dWJfdW53aW5kLnN0dWJfdHlwZSA9PSBJTVBPUlQpCisgICAgcmV0dXJuIDE7CisKKyAgLyogUGFyYW1ldGVyIHJlbG9jYXRpb24gc3R1YnMgYWx3YXlzIGhhdmUgYSBjYWxsIHBhdGggYW5kIG1heSBoYXZlIGEKKyAgICAgcmV0dXJuIHBhdGguICAqLworICBpZiAodS0+c3R1Yl91bndpbmQuc3R1Yl90eXBlID09IFBBUkFNRVRFUl9SRUxPQ0FUSU9OCisgICAgICB8fCB1LT5zdHViX3Vud2luZC5zdHViX3R5cGUgPT0gRVhQT1JUKQorICAgIHsKKyAgICAgIENPUkVfQUREUiBhZGRyOworCisgICAgICAvKiBTZWFyY2ggZm9yd2FyZCBmcm9tIHRoZSBjdXJyZW50IFBDIHVudGlsIHdlIGhpdCBhIGJyYW5jaAorCSBvciB0aGUgZW5kIG9mIHRoZSBzdHViLiAgKi8KKyAgICAgIGZvciAoYWRkciA9IHBjOyBhZGRyIDw9IHUtPnJlZ2lvbl9lbmQ7IGFkZHIgKz0gNCkKKwl7CisJICB1bnNpZ25lZCBsb25nIGluc247CisKKwkgIGluc24gPSByZWFkX21lbW9yeV9pbnRlZ2VyIChhZGRyLCA0KTsKKworCSAgLyogRG9lcyBpdCBsb29rIGxpa2UgYSBibD8gIElmIHNvIHRoZW4gaXQncyB0aGUgY2FsbCBwYXRoLCBpZgorCSAgICAgd2UgZmluZCBhIGJ2IG9yIGJlIGZpcnN0LCB0aGVuIHdlJ3JlIG9uIHRoZSByZXR1cm4gcGF0aC4gICovCisJICBpZiAoKGluc24gJiAweGZjMDBlMDAwKSA9PSAweGU4MDAwMDAwKQorCSAgICByZXR1cm4gMTsKKwkgIGVsc2UgaWYgKChpbnNuICYgMHhmYzAwZTAwMSkgPT0gMHhlODAwYzAwMAorCQkgICB8fCAoaW5zbiAmIDB4ZmMwMDAwMDApID09IDB4ZTAwMDAwMDApCisJICAgIHJldHVybiAwOworCX0KKworICAgICAgLyogU2hvdWxkIG5ldmVyIGhhcHBlbi4gICovCisgICAgICB3YXJuaW5nICgiVW5hYmxlIHRvIGZpbmQgYnJhbmNoIGluIHBhcmFtZXRlciByZWxvY2F0aW9uIHN0dWIuXG4iKTsgLyogcHVyZWNvdjogZGVhZGNvZGUgKi8KKyAgICAgIHJldHVybiAwOyAvKiBwdXJlY292OiBkZWFkY29kZSAqLworICAgIH0KKworICAvKiBVbmtub3duIHN0dWIgdHlwZS4gIEZvciBub3csIGp1c3QgcmV0dXJuIHplcm8uICAqLworICByZXR1cm4gMDsgLyogcHVyZWNvdjogZGVhZGNvZGUgKi8KK30KKworLyogUmV0dXJuIG9uZSBpZiBQQyBpcyBpbiB0aGUgcmV0dXJuIHBhdGggb2YgYSB0cmFtcG9saW5lLCBlbHNlIHJldHVybiB6ZXJvLgorCisgICBOb3RlIHdlIHJldHVybiBvbmUgZm9yICphbnkqIGNhbGwgdHJhbXBvbGluZSAobG9uZy1jYWxsLCBhcmctcmVsb2MpLCBub3QKKyAgIGp1c3Qgc2hhcmVkIGxpYnJhcnkgdHJhbXBvbGluZXMgKGltcG9ydCwgZXhwb3J0KS4gICovCisKK2ludAoraW5fc29saWJfcmV0dXJuX3RyYW1wb2xpbmUgKHBjLCBuYW1lKQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIGNoYXIgKm5hbWU7Cit7CisgIHN0cnVjdCB1bndpbmRfdGFibGVfZW50cnkgKnU7CisKKyAgLyogR2V0IHRoZSB1bndpbmQgZGVzY3JpcHRvciBjb3JyZXNwb25kaW5nIHRvIFBDLCByZXR1cm4gemVybworICAgICBpZiBubyB1bndpbmQgd2FzIGZvdW5kLiAgKi8KKyAgdSA9IGZpbmRfdW53aW5kX2VudHJ5IChwYyk7CisgIGlmICghdSkKKyAgICByZXR1cm4gMDsKKworICAvKiBJZiB0aGlzIGlzbid0IGEgbGlua2VyIHN0dWIgb3IgaXQncyBqdXN0IGEgbG9uZyBicmFuY2ggc3R1YiwgdGhlbgorICAgICByZXR1cm4gemVyby4gICovCisgIGlmICh1LT5zdHViX3Vud2luZC5zdHViX3R5cGUgPT0gMCB8fCB1LT5zdHViX3Vud2luZC5zdHViX3R5cGUgPT0gTE9OR19CUkFOQ0gpCisgICAgcmV0dXJuIDA7CisKKyAgLyogVGhlIGNhbGwgYW5kIHJldHVybiBwYXRoIGV4ZWN1dGUgdGhlIHNhbWUgaW5zdHJ1Y3Rpb25zIHdpdGhpbgorICAgICBhbiBJTVBPUlQgc3R1YiEgIFNvIGFuIElNUE9SVCBzdHViIGlzIGJvdGggYSBjYWxsIGFuZCByZXR1cm4KKyAgICAgdHJhbXBvbGluZS4gICovCisgIGlmICh1LT5zdHViX3Vud2luZC5zdHViX3R5cGUgPT0gSU1QT1JUKQorICAgIHJldHVybiAxOworCisgIC8qIFBhcmFtZXRlciByZWxvY2F0aW9uIHN0dWJzIGFsd2F5cyBoYXZlIGEgY2FsbCBwYXRoIGFuZCBtYXkgaGF2ZSBhCisgICAgIHJldHVybiBwYXRoLiAgKi8KKyAgaWYgKHUtPnN0dWJfdW53aW5kLnN0dWJfdHlwZSA9PSBQQVJBTUVURVJfUkVMT0NBVElPTgorICAgICAgfHwgdS0+c3R1Yl91bndpbmQuc3R1Yl90eXBlID09IEVYUE9SVCkKKyAgICB7CisgICAgICBDT1JFX0FERFIgYWRkcjsKKworICAgICAgLyogU2VhcmNoIGZvcndhcmQgZnJvbSB0aGUgY3VycmVudCBQQyB1bnRpbCB3ZSBoaXQgYSBicmFuY2gKKwkgb3IgdGhlIGVuZCBvZiB0aGUgc3R1Yi4gICovCisgICAgICBmb3IgKGFkZHIgPSBwYzsgYWRkciA8PSB1LT5yZWdpb25fZW5kOyBhZGRyICs9IDQpCisJeworCSAgdW5zaWduZWQgbG9uZyBpbnNuOworCisJICBpbnNuID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoYWRkciwgNCk7CisKKwkgIC8qIERvZXMgaXQgbG9vayBsaWtlIGEgYmw/ICBJZiBzbyB0aGVuIGl0J3MgdGhlIGNhbGwgcGF0aCwgaWYKKwkgICAgIHdlIGZpbmQgYSBidiBvciBiZSBmaXJzdCwgdGhlbiB3ZSdyZSBvbiB0aGUgcmV0dXJuIHBhdGguICAqLworCSAgaWYgKChpbnNuICYgMHhmYzAwZTAwMCkgPT0gMHhlODAwMDAwMCkKKwkgICAgcmV0dXJuIDA7CisJICBlbHNlIGlmICgoaW5zbiAmIDB4ZmMwMGUwMDEpID09IDB4ZTgwMGMwMDAKKwkJICAgfHwgKGluc24gJiAweGZjMDAwMDAwKSA9PSAweGUwMDAwMDAwKQorCSAgICByZXR1cm4gMTsKKwl9CisKKyAgICAgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4uICAqLworICAgICAgd2FybmluZyAoIlVuYWJsZSB0byBmaW5kIGJyYW5jaCBpbiBwYXJhbWV0ZXIgcmVsb2NhdGlvbiBzdHViLlxuIik7IC8qIHB1cmVjb3Y6IGRlYWRjb2RlICovCisgICAgICByZXR1cm4gMDsgLyogcHVyZWNvdjogZGVhZGNvZGUgKi8KKyAgICB9CisKKyAgLyogVW5rbm93biBzdHViIHR5cGUuICBGb3Igbm93LCBqdXN0IHJldHVybiB6ZXJvLiAgKi8KKyAgcmV0dXJuIDA7IC8qIHB1cmVjb3Y6IGRlYWRjb2RlICovCisKK30KKworLyogRmlndXJlIG91dCBpZiBQQyBpcyBpbiBhIHRyYW1wb2xpbmUsIGFuZCBpZiBzbyBmaW5kIG91dCB3aGVyZQorICAgdGhlIHRyYW1wb2xpbmUgd2lsbCBqdW1wIHRvLiAgSWYgbm90IGluIGEgdHJhbXBvbGluZSwgcmV0dXJuIHplcm8uCisKKyAgIFNpbXBsZSBjb2RlIGV4YW1pbmF0aW9uIHByb2JhYmx5IGlzIG5vdCBhIGdvb2QgaWRlYSBzaW5jZSB0aGUgY29kZQorICAgc2VxdWVuY2VzIGluIHRyYW1wb2xpbmVzIGNhbiBhbHNvIGFwcGVhciBpbiB1c2VyIGNvZGUuCisKKyAgIFdlIHVzZSB1bndpbmRzIGFuZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZSB0bworICAgZGV0ZXJtaW5lIHdoZW4gd2UncmUgaW4gYSB0cmFtcG9saW5lLiAgVGhpcyB3b24ndCB3b3JrIGZvciBFTEYKKyAgICh5ZXQpIHNpbmNlIGl0IGRvZXNuJ3QgY3JlYXRlIHN0dWIgdW53aW5kIGVudHJpZXMuICBXaGV0aGVyIG9yCisgICBub3QgRUxGIHdpbGwgY3JlYXRlIHN0dWIgdW53aW5kcyBvciBub3JtYWwgdW53aW5kcyBmb3IgbGlua2VyCisgICBzdHVicyBpcyBzdGlsbCBiZWluZyBkZWJhdGVkLgorCisgICBUaGlzIHNob3VsZCBoYW5kbGUgc2ltcGxlIGNhbGxzIHRocm91Z2ggZHluY2FsbCBvciBzcjRleHBvcnQsCisgICBsb25nIGNhbGxzLCBhcmd1bWVudCByZWxvY2F0aW9uIHN0dWJzLCBhbmQgZHluY2FsbC9zcjRleHBvcnQKKyAgIGNhbGxpbmcgYW4gYXJndW1lbnQgcmVsb2NhdGlvbiBzdHViLiAgSXQgZXZlbiBoYW5kbGVzIHNvbWUgc3R1YnMKKyAgIHVzZWQgaW4gZHluYW1pYyBleGVjdXRhYmxlcy4gICovCisKKyMgaWYgMAorQ09SRV9BRERSCitza2lwX3RyYW1wb2xpbmVfY29kZSAocGMsIG5hbWUpCisgICAgIENPUkVfQUREUiBwYzsKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgcmV0dXJuIGZpbmRfc29saWJfdHJhbXBvbGluZV90YXJnZXQocGMpOworfQorCisjZW5kaWYKKworQ09SRV9BRERSCitza2lwX3RyYW1wb2xpbmVfY29kZSAocGMsIG5hbWUpCisgICAgIENPUkVfQUREUiBwYzsKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgbG9uZyBvcmlnX3BjID0gcGM7CisgIGxvbmcgcHJldl9pbnN0LCBjdXJyX2luc3QsIGxvYzsKKyAgc3RhdGljIENPUkVfQUREUiBkeW5jYWxsID0gMDsKKyAgc3RhdGljIENPUkVfQUREUiBkeW5jYWxsX2V4dGVybmFsID0gMDsKKyAgc3RhdGljIENPUkVfQUREUiBzcjRleHBvcnQgPSAwOworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW07CisgIHN0cnVjdCB1bndpbmRfdGFibGVfZW50cnkgKnU7CisKKworLyogRklYTUUgWFhYIC0gZHluY2FsbCBhbmQgc3I0ZXhwb3J0IG11c3QgYmUgaW5pdGlhbGl6ZWQgd2hlbmV2ZXIgd2UgZ2V0IGEKKyAgIG5ldyBleGVjIGZpbGUgKi8KKworICBpZiAoIWR5bmNhbGwpCisgICAgeworICAgICAgbXN5bSA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoIiQkZHluY2FsbCIsIE5VTEwsIE5VTEwpOworICAgICAgaWYgKG1zeW0pCisJZHluY2FsbCA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltKTsKKyAgICAgIGVsc2UKKwlkeW5jYWxsID0gLTE7CisgICAgfQorCisgIGlmICghZHluY2FsbF9leHRlcm5hbCkKKyAgICB7CisgICAgICBtc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sICgiJCRkeW5jYWxsX2V4dGVybmFsIiwgTlVMTCwgTlVMTCk7CisgICAgICBpZiAobXN5bSkKKwlkeW5jYWxsX2V4dGVybmFsID0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW0pOworICAgICAgZWxzZQorCWR5bmNhbGxfZXh0ZXJuYWwgPSAtMTsKKyAgICB9CisKKyAgaWYgKCFzcjRleHBvcnQpCisgICAgeworICAgICAgbXN5bSA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoIl9zcjRleHBvcnQiLCBOVUxMLCBOVUxMKTsKKyAgICAgIGlmIChtc3ltKQorCXNyNGV4cG9ydCA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltKTsKKyAgICAgIGVsc2UKKwlzcjRleHBvcnQgPSAtMTsKKyAgICB9CisKKyAgLyogQWRkcmVzc2VzIHBhc3NlZCB0byBkeW5jYWxsIG1heSAqTk9UKiBiZSB0aGUgYWN0dWFsIGFkZHJlc3MKKyAgICAgb2YgdGhlIGZ1bmN0aW9uLiAgU28gd2UgbWF5IGhhdmUgdG8gZG8gc29tZXRoaW5nIHNwZWNpYWwuICAqLworICBpZiAocGMgPT0gZHluY2FsbCkKKyAgICB7CisgICAgICBwYyA9IChDT1JFX0FERFIpIHJlYWRfcmVnaXN0ZXIgKDIyKTsKKworICAgICAgLyogSWYgYml0IDMwIChjb3VudGluZyBmcm9tIHRoZSBsZWZ0KSBpcyBvbiwgdGhlbiBwYyBpcyB0aGUgYWRkcmVzcyBvZgorCSB0aGUgUExUIGVudHJ5IGZvciB0aGlzIGZ1bmN0aW9uLCBub3QgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uCisJIGl0c2VsZi4gIEJpdCAzMSBoYXMgbWVhbmluZyB0b28sIGJ1dCBvbmx5IGZvciBNUEUuICAqLworICAgICAgaWYgKHBjICYgMHgyKQorCXBjID0gKENPUkVfQUREUikgcmVhZF9tZW1vcnlfaW50ZWdlciAocGMgJiB+MHgzLCA0KTsKKyAgICB9CisgIGlmIChwYyA9PSBkeW5jYWxsX2V4dGVybmFsKQorICAgIHsKKyAgICAgIHBjID0gKENPUkVfQUREUikgcmVhZF9yZWdpc3RlciAoMjIpOworICAgICAgcGMgPSAoQ09SRV9BRERSKSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYyAmIH4weDMsIDQpOworICAgIH0KKyAgZWxzZSBpZiAocGMgPT0gc3I0ZXhwb3J0KQorICAgIHBjID0gKENPUkVfQUREUikgKHJlYWRfcmVnaXN0ZXIgKDIyKSk7CisKKyAgLyogR2V0IHRoZSB1bndpbmQgZGVzY3JpcHRvciBjb3JyZXNwb25kaW5nIHRvIFBDLCByZXR1cm4gemVybworICAgICBpZiBubyB1bndpbmQgd2FzIGZvdW5kLiAgKi8KKyAgdSA9IGZpbmRfdW53aW5kX2VudHJ5IChwYyk7CisgIGlmICghdSkKKyAgICByZXR1cm4gMDsKKworICAvKiBJZiB0aGlzIGlzbid0IGEgbGlua2VyIHN0dWIsIHRoZW4gcmV0dXJuIG5vdy4gICovCisgIC8qIGVsejogYXR0ZW50aW9uIGhlcmUhIChGSVhNRSkgYmVjYXVzZSBvZiBhIGNvbXBpbGVyL2xpbmtlciAKKyAgICAgZXJyb3IsIHNvbWUgc3R1YnMgd2hpY2ggc2hvdWxkIGhhdmUgYSBub24gemVybyBzdHViX3Vud2luZC5zdHViX3R5cGUgCisgICAgIGhhdmUgdW5mb3J0dW5hdGVseSBhIHZhbHVlIG9mIHplcm8uIFNvIHRoaXMgZnVuY3Rpb24gd291bGQgcmV0dXJuIGhlcmUKKyAgICAgYXMgaWYgd2Ugd2VyZSBub3QgaW4gYSB0cmFtcG9saW5lLiBUbyBmaXggdGhpcywgd2UgZ28gbG9vayBhdCB0aGUgcGFydGlhbAorICAgICBzeW1ib2wgaW5mb3JtYXRpb24sIHdoaWNoIHJlcG9ydHMgdGhpcyBndXkgYXMgYSBzdHViLgorICAgICAoRklYTUUpOiBVbmZvcnR1bmF0ZWx5LCB3ZSBhcmUgbm90IHRoYXQgbHVja3k6IGl0IHR1cm5zIG91dCB0aGF0IHRoZSAKKyAgICAgcGFydGlhbCBzeW1ib2wgaW5mb3JtYXRpb24gaXMgYWxzbyB3cm9uZyBzb21ldGltZXMuIFRoaXMgaXMgYmVjYXVzZSAKKyAgICAgd2hlbiBpdCBpcyBlbnRlcmVkIChzb21yZWFkLmM6OnNvbV9zeW10YWJfcmVhZCgpKSBpdCBjYW4gaGFwcGVuIHRoYXQKKyAgICAgaWYgdGhlIHR5cGUgb2YgdGhlIHN5bWJvbCAoZnJvbSB0aGUgc29tKSBpcyBFbnRyeSwgYW5kIHRoZSBzeW1ib2wgaXMKKyAgICAgaW4gYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBpdCBjYW4gYWxzbyBiZSBhIHRyYW1wb2xpbmUuICBUaGlzIHdvdWxkCisgICAgIGJlIE9LLCBleGNlcHQgdGhhdCBJIGJlbGlldmUgdGhlIHdheSB0aGV5IGRlY2lkZSBpZiB3ZSBhcmUgaW5hIHNoYXJlZCBsaWJyYXJ5CisgICAgIGRvZXMgbm90IHdvcmsuIFNPT09PLi4uLCBldmVuIGlmIHdlIGhhdmUgYSByZWd1bGFyIGZ1bmN0aW9uIHcvbyB0cmFtcG9saW5lcworICAgICBpdHMgbWluaW1hbCBzeW1ib2wgY2FuIGJlIGFzc2lnbmVkIHR5cGUgbXN0X3NvbGliX3RyYW1wb2xpbmUuCisgICAgIEFsc28sIGlmIHdlIGZpbmQgdGhhdCB0aGUgc3ltYm9sIGlzIGEgcmVhbCBzdHViLCB0aGVuIHdlIGZpeCB0aGUgdW53aW5kCisgICAgIGRlc2NyaXB0b3IsIGFuZCBkZWZpbmUgdGhlIHN0dWIgdHlwZSB0byBiZSBFWFBPUlQuCisgICAgIEhvcGVmdWxseSB0aGlzIGlzIGNvcnJlY3QgbW9zdCBvZiB0aGUgdGltZXMuICovIAorICBpZiAodS0+c3R1Yl91bndpbmQuc3R1Yl90eXBlID09IDApCisgIHsKKworLyogZWx6OiBOT1RFIChGSVhNRSEpIG9uY2UgdGhlIHByb2JsZW0gd2l0aCB0aGUgdW53aW5kIGluZm9ybWF0aW9uIGlzIGZpeGVkCisgICB3ZSBjYW4gZGVsZXRlIGFsbCB0aGUgY29kZSB3aGljaCBhcHBlYXJzIGJldHdlZW4gdGhlIGxpbmVzICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBtc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjIChwYyk7CisKKyAgICBpZiAobXN5bSA9PSBOVUxMIHx8IE1TWU1CT0xfVFlQRSAobXN5bSkgIT0gbXN0X3NvbGliX3RyYW1wb2xpbmUpCisgICAgICByZXR1cm4gb3JpZ19wYyA9PSBwYyA/IDAgOiBwYyAmIH4weDM7CisKKyAgICBlbHNlIGlmIChtc3ltICE9IE5VTEwgJiYgTVNZTUJPTF9UWVBFIChtc3ltKSA9PSBtc3Rfc29saWJfdHJhbXBvbGluZSkKKyAgICAgICAgIHsKKyAgICAgICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgICAgICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisgICAgICAgICAgaW50IGZ1bmN0aW9uX2ZvdW5kID0gMDsKKworICAgICAgICAgICAgIC8qIGdvIGxvb2sgaWYgdGhlcmUgaXMgYW5vdGhlciBtaW5pbWFsIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgCisgICAgICAgICAgICAgICAgdGhpcyBvbmUsIGJ1dCB3aXRoIHR5cGUgbXN0X3RleHQuIFRoaXMgd291bGQgaGFwcGVuIGlmIHRoZSBtc3ltCisgICAgICAgICAgICAgICAgaXMgYW4gYWN0dWFsIHRyYW1wb2xpbmUsIGluIHdoaWNoIGNhc2UgdGhlcmUgd291bGQgYmUgYW5vdGhlcgorICAgICAgICAgICAgICAgIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgcmVhbCBmdW5jdGlvbiAqLworCisgICAgICAgICAgICAgQUxMX01TWU1CT0xTIChvYmpmaWxlLCBtc3ltYm9sKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChNU1lNQk9MX1RZUEUgKG1zeW1ib2wpID09IG1zdF90ZXh0CisgICAgICAgICAgICAgICAgICAgICYmIFNUUkVRIChTWU1CT0xfTkFNRSAobXN5bWJvbCkgLCBTWU1CT0xfTkFNRSAobXN5bSkpKQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9mb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2ZvdW5kKSAgCisgICAgICAgICAgICAgICAgICAgLyogdGhlIHR5cGUgb2YgbXN5bSBpcyBjb3JyZWN0IChtc3Rfc29saWJfdHJhbXBvbGluZSksIGJ1dAorICAgICAgICAgICAgICAgICAgICAgIHRoZSB1bndpbmQgaW5mbyBpcyB3cm9uZywgc28gc2V0IGl0IHRvIHRoZSBjb3JyZWN0IHZhbHVlICovCisgICAgICAgICAgICAgICAgdS0+c3R1Yl91bndpbmQuc3R1Yl90eXBlID0gRVhQT1JUOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgIC8qIHRoZSBzdHViIHR5cGUgaW5mbyBpbiB0aGUgdW53aW5kIGlzIGNvcnJlY3QgKHRoaXMgaXMgbm90IGEKKyAgICAgICAgICAgICAgICAgICAgICB0cmFtcG9saW5lKSwgYnV0IHRoZSBtc3ltIHR5cGUgaW5mb3JtYXRpb24gaXMgd3JvbmcsIGl0CisgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIG1zdF90ZXh0LiBTbyB3ZSBuZWVkIHRvIGZpeCB0aGUgbXN5bSwgYW5kIGFsc28KKyAgICAgICAgICAgICAgICAgICAgICBnZXQgb3V0IG9mIHRoaXMgZnVuY3Rpb24gKi8KKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgTVNZTUJPTF9UWVBFIChtc3ltKSA9IG1zdF90ZXh0OworICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdfcGMgPT0gcGMgPyAwIDogcGMgJiB+MHgzOworICAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICAgICAgICAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB9CisKKyAgLyogSXQncyBhIHN0dWIuICBTZWFyY2ggZm9yIGEgYnJhbmNoIGFuZCBmaWd1cmUgb3V0IHdoZXJlIGl0IGdvZXMuCisgICAgIE5vdGUgd2UgaGF2ZSB0byBoYW5kbGUgbXVsdGkgaW5zbiBicmFuY2ggc2VxdWVuY2VzIGxpa2UgbGRpbDtibGUuCisgICAgIE1vc3QgKGFsbD8pIG90aGVyIGJyYW5jaGVzIGNhbiBiZSBkZXRlcm1pbmVkIGJ5IGV4YW1pbmluZyB0aGUgY29udGVudHMKKyAgICAgb2YgY2VydGFpbiByZWdpc3RlcnMgYW5kIHRoZSBzdGFjay4gICovCisKKyAgbG9jID0gcGM7CisgIGN1cnJfaW5zdCA9IDA7CisgIHByZXZfaW5zdCA9IDA7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlbid0IHdhbGtlZCBvdXRzaWRlIHRoZSByYW5nZSBvZiB0aGlzIHN0dWIuICAqLworICAgICAgaWYgKHUgIT0gZmluZF91bndpbmRfZW50cnkgKGxvYykpCisJeworCSAgd2FybmluZyAoIlVuYWJsZSB0byBmaW5kIGJyYW5jaCBpbiBsaW5rZXIgc3R1YiIpOworCSAgcmV0dXJuIG9yaWdfcGMgPT0gcGMgPyAwIDogcGMgJiB+MHgzOworCX0KKworICAgICAgcHJldl9pbnN0ID0gY3Vycl9pbnN0OworICAgICAgY3Vycl9pbnN0ID0gcmVhZF9tZW1vcnlfaW50ZWdlciAobG9jLCA0KTsKKworICAgICAgLyogRG9lcyBpdCBsb29rIGxpa2UgYSBicmFuY2ggZXh0ZXJuYWwgdXNpbmcgJXIxPyAgVGhlbiBpdCdzIHRoZQorCSBicmFuY2ggZnJvbSB0aGUgc3R1YiB0byB0aGUgYWN0dWFsIGZ1bmN0aW9uLiAgKi8KKyAgICAgIGlmICgoY3Vycl9pbnN0ICYgMHhmZmUwZTAwMCkgPT0gMHhlMDIwMjAwMCkKKwl7CisJICAvKiBZdXAuICBTZWUgaWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGxvYWRlZAorCSAgICAgYSB2YWx1ZSBpbnRvICVyMS4gIElmIHNvIGNvbXB1dGUgYW5kIHJldHVybiB0aGUganVtcCBhZGRyZXNzLiAgKi8KKwkgIGlmICgocHJldl9pbnN0ICYgMHhmZmUwMDAwMCkgPT0gMHgyMDIwMDAwMCkKKwkgICAgcmV0dXJuIChleHRyYWN0XzIxIChwcmV2X2luc3QpICsgZXh0cmFjdF8xNyAoY3Vycl9pbnN0KSkgJiB+MHgzOworCSAgZWxzZQorCSAgICB7CisJICAgICAgd2FybmluZyAoIlVuYWJsZSB0byBmaW5kIGxkaWwgWCwlJXIxIGJlZm9yZSBibGUgWSglJXNyNCwlJXIxKS4iKTsKKwkgICAgICByZXR1cm4gb3JpZ19wYyA9PSBwYyA/IDAgOiBwYyAmIH4weDM7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIERvZXMgaXQgbG9vayBsaWtlIGEgYmUgMChzcjAsJXIyMSk/IE9SIAorICAgICAgICAgRG9lcyBpdCBsb29rIGxpa2UgYSBiZSwgbiAwKHNyMCwlcjIxKT8gT1IgCisgICAgICAgICBEb2VzIGl0IGxvb2sgbGlrZSBhIGJ2ZSAocjIxKT8gKHRoaXMgaXMgb24gUEEyLjApCisgICAgICAgICBEb2VzIGl0IGxvb2sgbGlrZSBhIGJ2ZSwgbihyMjEpPyAodGhpcyBpcyBhbHNvIG9uIFBBMi4wKQorICAgICAgICAgVGhhdCdzIHRoZSBicmFuY2ggZnJvbSBhbgorCSBpbXBvcnQgc3R1YiB0byBhbiBleHBvcnQgc3R1Yi4KKworCSBJdCBpcyBpbXBvc3NpYmxlIHRvIGRldGVybWluZSB0aGUgdGFyZ2V0IG9mIHRoZSBicmFuY2ggdmlhCisJIHNpbXBsZSBleGFtaW5hdGlvbiBvZiBpbnN0cnVjdGlvbnMgYW5kL29yIGRhdGEgKGNvbnNpZGVyCisJIHRoYXQgdGhlIGFkZHJlc3MgaW4gdGhlIHBsYWJlbCBtYXkgYmUgdGhlIGFkZHJlc3Mgb2YgdGhlCisJIGJpbmQtb24tcmVmZXJlbmNlIHJvdXRpbmUgaW4gdGhlIGR5bmFtaWMgbG9hZGVyKS4KKworCSBTbyB3ZSBoYXZlIHRyeSBhbiBhbHRlcm5hdGl2ZSBhcHByb2FjaC4KKworCSBHZXQgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBhdCBvdXIgY3VycmVudCBsb2NhdGlvbjsgaXQgc2hvdWxkCisJIGJlIGEgc3R1YiBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBzeW1ib2wgaW4gdGhlCisJIHNoYXJlZCBsaWJyYXJ5LgorCisJIFRoZW4gbG9va3VwIGEgbWluaW1hbCBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lOyB3ZSBzaG91bGQKKwkgZ2V0IHRoZSBtaW5pbWFsIHN5bWJvbCBmb3IgdGhlIHRhcmdldCByb3V0aW5lIGluIHRoZSBzaGFyZWQKKwkgbGlicmFyeSBhcyB0aG9zZSB0YWtlIHByZWNlZGVuY2Ugb2YgaW1wb3J0L2V4cG9ydCBzdHVicy4gICovCisgICAgICBpZiAoKGN1cnJfaW5zdCA9PSAweGUyYTAwMDAwKSB8fAorICAgICAgICAgIChjdXJyX2luc3QgPT0gMHhlMmEwMDAwMikgfHwKKyAgICAgICAgICAoY3Vycl9pbnN0ID09IDB4ZWFhMGQwMDApIHx8CisgICAgICAgICAgKGN1cnJfaW5zdCA9PSAweGVhYTBkMDAyKSkKKwl7CisJICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKnN0dWJzeW0sICpsaWJzeW07CisKKwkgIHN0dWJzeW0gPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGMgKGxvYyk7CisJICBpZiAoc3R1YnN5bSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgd2FybmluZyAoIlVuYWJsZSB0byBmaW5kIHN5bWJvbCBmb3IgMHgleCIsIGxvYyk7CisJICAgICAgcmV0dXJuIG9yaWdfcGMgPT0gcGMgPyAwIDogcGMgJiB+MHgzOworCSAgICB9CisKKwkgIGxpYnN5bSA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoU1lNQk9MX05BTUUgKHN0dWJzeW0pLCBOVUxMLCBOVUxMKTsKKwkgIGlmIChsaWJzeW0gPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHdhcm5pbmcgKCJVbmFibGUgdG8gZmluZCBsaWJyYXJ5IHN5bWJvbCBmb3IgJXNcbiIsCisJCSAgICAgICBTWU1CT0xfTkFNRSAoc3R1YnN5bSkpOworCSAgICAgIHJldHVybiBvcmlnX3BjID09IHBjID8gMCA6IHBjICYgfjB4MzsKKwkgICAgfQorCisJICByZXR1cm4gU1lNQk9MX1ZBTFVFIChsaWJzeW0pOworCX0KKworICAgICAgLyogRG9lcyBpdCBsb29rIGxpa2UgYmwgWCwlcnAgb3IgYmwgWCwlcjA/ICBBbm90aGVyIHdheSB0byBkbyBhCisJIGJyYW5jaCBmcm9tIHRoZSBzdHViIHRvIHRoZSBhY3R1YWwgZnVuY3Rpb24uICAqLworICAgICAgLyplbHoqLworICAgICAgZWxzZSBpZiAoKGN1cnJfaW5zdCAmIDB4ZmZlMGUwMDApID09IDB4ZTg0MDAwMDAKKwkgICAgICAgfHwgKGN1cnJfaW5zdCAmIDB4ZmZlMGUwMDApID09IDB4ZTgwMDAwMDAKKyAgICAgICAgICAgICAgIHx8IChjdXJyX2luc3QgJiAweGZmZTBlMDAwKSA9PSAweGU4MDBBMDAwKQorCXJldHVybiAobG9jICsgZXh0cmFjdF8xNyAoY3Vycl9pbnN0KSArIDgpICYgfjB4MzsKKworICAgICAgLyogRG9lcyBpdCBsb29rIGxpa2UgYnYgKHJwKT8gICBOb3RlIHRoaXMgZGVwZW5kcyBvbiB0aGUKKwkgY3VycmVudCBzdGFjayBwb2ludGVyIGJlaW5nIHRoZSBzYW1lIGFzIHRoZSBzdGFjaworCSBwb2ludGVyIGluIHRoZSBzdHViIGl0c2VsZiEgIFRoaXMgaXMgYSBicmFuY2ggb24gZnJvbSB0aGUKKwkgc3R1YiBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjYWxsZXIuICAqLworICAgICAgLyplbHNlIGlmICgoY3Vycl9pbnN0ICYgMHhmZmUwZTAwMCkgPT0gMHhlODQwYzAwMCkqLworICAgICAgZWxzZSBpZiAoKGN1cnJfaW5zdCAmIDB4ZmZlMGYwMDApID09IDB4ZTg0MGMwMDApCisJeworCSAgLyogWXVwLiAgU2VlIGlmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBsb2FkZWQKKwkgICAgIHJwIGZyb20gc3AgLSA4LiAgKi8KKwkgIGlmIChwcmV2X2luc3QgPT0gMHg0YmMyM2ZmMSkKKwkgICAgcmV0dXJuIChyZWFkX21lbW9yeV9pbnRlZ2VyCisJCSAgICAocmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKSAtIDgsIDQpKSAmIH4weDM7CisJICBlbHNlCisJICAgIHsKKwkgICAgICB3YXJuaW5nICgiVW5hYmxlIHRvIGZpbmQgcmVzdG9yZSBvZiAlJXJwIGJlZm9yZSBidiAoJSVycCkuIik7CisJICAgICAgcmV0dXJuIG9yaWdfcGMgPT0gcGMgPyAwIDogcGMgJiB+MHgzOworCSAgICB9CisJfQorCisgICAgICAvKiBlbHo6IGFkZGVkIHRoaXMgY2FzZSB0byBjYXB0dXJlIHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgICAgICAgIGF0IHRoZSBlbmQgb2YgdGhlIHJldHVybiBwYXJ0IG9mIGFuIGV4cG9ydCBzdHViIHVzZWQgYnkKKyAgICAgICAgIHRoZSBQQTIuMDogQlZFLCBuIChycCkgKi8KKyAgICAgIGVsc2UgaWYgKChjdXJyX2luc3QgJiAweGZmZTBmMDAwKSA9PSAweGU4NDBkMDAwKQorCXsKKwkgIHJldHVybiAocmVhZF9tZW1vcnlfaW50ZWdlciAKKwkJICAocmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKSAtIDI0LCA0KSkgJiB+MHgzOworCX0KKworICAgICAgLyogV2hhdCBhYm91dCBiZSxuIDAoc3IwLCVycCk/ICBJdCdzIGp1c3QgYW5vdGhlciB3YXkgd2UgcmV0dXJuIHRvCisJIHRoZSBvcmlnaW5hbCBjYWxsZXIgZnJvbSB0aGUgc3R1Yi4gIFVzZWQgaW4gZHluYW1pYyBleGVjdXRhYmxlcy4gICovCisgICAgICBlbHNlIGlmIChjdXJyX2luc3QgPT0gMHhlMDQwMDAwMikKKwl7CisJICAvKiBUaGUgdmFsdWUgd2UganVtcCB0byBpcyBzaXR0aW5nIGluIHNwIC0gMjQuICBCdXQgdGhhdCdzCisJICAgICBsb2FkZWQgc2V2ZXJhbCBpbnN0cnVjdGlvbnMgYmVmb3JlIHRoZSBiZSBpbnN0cnVjdGlvbi4KKwkgICAgIEkgZ3Vlc3Mgd2UgY291bGQgY2hlY2sgZm9yIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBiZWluZworCSAgICAgbXRzcCAlcjEsJXNyMCBpZiB3ZSB3YW50IHRvIGRvIHNhbml0eSBjaGVja2luZy4gICovCisJICByZXR1cm4gKHJlYWRfbWVtb3J5X2ludGVnZXIgCisJCSAgKHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSkgLSAyNCwgNCkpICYgfjB4MzsKKwl9CisKKyAgICAgIC8qIEhhdmVuJ3QgZm91bmQgdGhlIGJyYW5jaCB5ZXQsIGJ1dCB3ZSdyZSBzdGlsbCBpbiB0aGUgc3R1Yi4KKwkgS2VlcCBsb29raW5nLiAgKi8KKyAgICAgIGxvYyArPSA0OworICAgIH0KK30KKworCisvKiBGb3IgdGhlIGdpdmVuIGluc3RydWN0aW9uIChJTlNUKSwgcmV0dXJuIGFueSBhZGp1c3RtZW50IGl0IG1ha2VzCisgICB0byB0aGUgc3RhY2sgcG9pbnRlciBvciB6ZXJvIGZvciBubyBhZGp1c3RtZW50LiAKKworICAgVGhpcyBvbmx5IGhhbmRsZXMgaW5zdHJ1Y3Rpb25zIGNvbW1vbmx5IGZvdW5kIGluIHByb2xvZ3Vlcy4gICovCisKK3N0YXRpYyBpbnQKK3Byb2xvZ3VlX2luc3RfYWRqdXN0X3NwIChpbnN0KQorICAgICB1bnNpZ25lZCBsb25nIGluc3Q7Cit7CisgIC8qIFRoaXMgbXVzdCBwZXJzaXN0IGFjcm9zcyBjYWxscy4gICovCisgIHN0YXRpYyBpbnQgc2F2ZV9oaWdoMjE7CisKKyAgLyogVGhlIG1vc3QgY29tbW9uIHdheSB0byBwZXJmb3JtIGEgc3RhY2sgYWRqdXN0bWVudCBsZG8gWChzcCksc3AgKi8KKyAgaWYgKChpbnN0ICYgMHhmZmZmYzAwMCkgPT0gMHgzN2RlMDAwMCkKKyAgICByZXR1cm4gZXh0cmFjdF8xNCAoaW5zdCk7CisKKyAgLyogc3R3bSBYLEQoc3ApICovCisgIGlmICgoaW5zdCAmIDB4ZmZlMDAwMDApID09IDB4NmZjMDAwMDApCisgICAgcmV0dXJuIGV4dHJhY3RfMTQgKGluc3QpOworCisgIC8qIGFkZGlsIGhpZ2gyMSwlcjE7IGxkbyBsb3cxMSwoJXIxKSwlcjMwKQorICAgICBzYXZlIGhpZ2ggYml0cyBpbiBzYXZlX2hpZ2gyMSBmb3IgbGF0ZXIgdXNlLiAgKi8KKyAgaWYgKChpbnN0ICYgMHhmZmUwMDAwMCkgPT0gMHgyODIwMDAwMCkKKyAgICB7CisgICAgICBzYXZlX2hpZ2gyMSA9IGV4dHJhY3RfMjEgKGluc3QpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmICgoaW5zdCAmIDB4ZmZmZjAwMDApID09IDB4MzQzZTAwMDApCisgICAgcmV0dXJuIHNhdmVfaGlnaDIxICsgZXh0cmFjdF8xNCAoaW5zdCk7CisKKyAgLyogZnN0d3MgYXMgdXNlZCBieSB0aGUgSFAgY29tcGlsZXJzLiAgKi8KKyAgaWYgKChpbnN0ICYgMHhmZmZmZmZlMCkgPT0gMHgyZmQwMTIyMCkKKyAgICByZXR1cm4gZXh0cmFjdF81X2xvYWQgKGluc3QpOworCisgIC8qIE5vIGFkanVzdG1lbnQuICAqLworICByZXR1cm4gMDsKK30KKworLyogUmV0dXJuIG5vbnplcm8gaWYgSU5TVCBpcyBhIGJyYW5jaCBvZiBzb21lIGtpbmQsIGVsc2UgcmV0dXJuIHplcm8uICAqLworCitzdGF0aWMgaW50Citpc19icmFuY2ggKGluc3QpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zdDsKK3sKKyAgc3dpdGNoIChpbnN0ID4+IDI2KQorICAgIHsKKyAgICBjYXNlIDB4MjA6CisgICAgY2FzZSAweDIxOgorICAgIGNhc2UgMHgyMjoKKyAgICBjYXNlIDB4MjM6CisgICAgY2FzZSAweDI4OgorICAgIGNhc2UgMHgyOToKKyAgICBjYXNlIDB4MmE6CisgICAgY2FzZSAweDJiOgorICAgIGNhc2UgMHgzMDoKKyAgICBjYXNlIDB4MzE6CisgICAgY2FzZSAweDMyOgorICAgIGNhc2UgMHgzMzoKKyAgICBjYXNlIDB4Mzg6CisgICAgY2FzZSAweDM5OgorICAgIGNhc2UgMHgzYToKKyAgICAgIHJldHVybiAxOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSByZWdpc3RlciBudW1iZXIgZm9yIGEgR1Igd2hpY2ggaXMgc2F2ZWQgYnkgSU5TVCBvcgorICAgemVybyBpdCBJTlNUIGRvZXMgbm90IHNhdmUgYSBHUi4gICovCisKK3N0YXRpYyBpbnQKK2luc3Rfc2F2ZXNfZ3IgKGluc3QpCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zdDsKK3sKKyAgLyogRG9lcyBpdCBsb29rIGxpa2UgYSBzdHc/ICAqLworICBpZiAoKGluc3QgPj4gMjYpID09IDB4MWEpCisgICAgcmV0dXJuIGV4dHJhY3RfNVJfc3RvcmUgKGluc3QpOworCisgIC8qIERvZXMgaXQgbG9vayBsaWtlIGEgc3R3bT8gIEdDQyAmIEhQQyBtYXkgdXNlIHRoaXMgaW4gcHJvbG9ndWVzLiAqLworICBpZiAoKGluc3QgPj4gMjYpID09IDB4MWIpCisgICAgcmV0dXJuIGV4dHJhY3RfNVJfc3RvcmUgKGluc3QpOworCisgIC8qIERvZXMgaXQgbG9vayBsaWtlIHN0aCBvciBzdGI/ICBIUEMgdmVyc2lvbnMgOS4wIGFuZCBsYXRlciB1c2UgdGhlc2UKKyAgICAgdG9vLiAgKi8KKyAgaWYgKChpbnN0ID4+IDI2KSA9PSAweDE5IHx8IChpbnN0ID4+IDI2KSA9PSAweDE4KQorICAgIHJldHVybiBleHRyYWN0XzVSX3N0b3JlIChpbnN0KTsKKyAgICAgIAorICByZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHRoZSByZWdpc3RlciBudW1iZXIgZm9yIGEgRlIgd2hpY2ggaXMgc2F2ZWQgYnkgSU5TVCBvcgorICAgemVybyBpdCBJTlNUIGRvZXMgbm90IHNhdmUgYSBGUi4KKworICAgTm90ZSB3ZSBvbmx5IGNhcmUgYWJvdXQgZnVsbCA2NGJpdCByZWdpc3RlciBzdG9yZXMgKHRoYXQncyB0aGUgb25seQorICAga2luZCBvZiBzdG9yZXMgdGhlIHByb2xvZ3VlIHdpbGwgdXNlKS4KKworICAgRklYTUU6IFdoYXQgYWJvdXQgYXJndW1lbnQgc3RvcmVzIHdpdGggdGhlIEhQIGNvbXBpbGVyIGluIEFOU0kgbW9kZT8gKi8KKworc3RhdGljIGludAoraW5zdF9zYXZlc19mciAoaW5zdCkKKyAgICAgdW5zaWduZWQgbG9uZyBpbnN0OworeworICAvKiBpcyB0aGlzIGFuIEZTVERTID8qLworICBpZiAoKGluc3QgJiAweGZjMDBkZmMwKSA9PSAweDJjMDAxMjAwKQorICAgIHJldHVybiBleHRyYWN0XzVyX3N0b3JlIChpbnN0KTsKKyAgLyogaXMgdGhpcyBhbiBGU1RXUyA/Ki8KKyAgaWYgKChpbnN0ICYgMHhmYzAwZGY4MCkgPT0gMHgyNDAwMTIwMCkKKyAgICByZXR1cm4gZXh0cmFjdF81cl9zdG9yZSAoaW5zdCk7CisgIHJldHVybiAwOworfQorCisvKiBBZHZhbmNlIFBDIGFjcm9zcyBhbnkgZnVuY3Rpb24gZW50cnkgcHJvbG9ndWUgaW5zdHJ1Y3Rpb25zCisgICB0byByZWFjaCBzb21lICJyZWFsIiBjb2RlLiAKKworICAgVXNlIGluZm9ybWF0aW9uIGluIHRoZSB1bndpbmQgdGFibGUgdG8gZGV0ZXJtaW5lIHdoYXQgZXhhY3RseSBzaG91bGQKKyAgIGJlIGluIHRoZSBwcm9sb2d1ZS4gICovCisKKworQ09SRV9BRERSCitza2lwX3Byb2xvZ3VlX2hhcmRfd2F5IChwYykKKyAgICAgQ09SRV9BRERSIHBjOworeworICBjaGFyIGJ1Zls0XTsKKyAgQ09SRV9BRERSIG9yaWdfcGMgPSBwYzsKKyAgdW5zaWduZWQgbG9uZyBpbnN0LCBzdGFja19yZW1haW5pbmcsIHNhdmVfZ3IsIHNhdmVfZnIsIHNhdmVfcnAsIHNhdmVfc3A7CisgIHVuc2lnbmVkIGxvbmcgYXJnc19zdG9yZWQsIHN0YXR1cywgaSwgcmVzdGFydF9nciwgcmVzdGFydF9mcjsKKyAgc3RydWN0IHVud2luZF90YWJsZV9lbnRyeSAqdTsKKworICByZXN0YXJ0X2dyID0gMDsKKyAgcmVzdGFydF9mciA9IDA7CisKK3Jlc3RhcnQ6CisgIHUgPSBmaW5kX3Vud2luZF9lbnRyeSAocGMpOworICBpZiAoIXUpCisgICAgcmV0dXJuIHBjOworCisgIC8qIElmIHdlIGFyZSBub3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGZ1bmN0aW9uLCB0aGVuIHJldHVybiBub3cuICovIAorICBpZiAoKHBjICYgfjB4MykgIT0gdS0+cmVnaW9uX3N0YXJ0KQorICAgIHJldHVybiBwYzsKKworICAvKiBUaGlzIGlzIGhvdyBtdWNoIG9mIGEgZnJhbWUgYWRqdXN0bWVudCB3ZSBuZWVkIHRvIGFjY291bnQgZm9yLiAgKi8KKyAgc3RhY2tfcmVtYWluaW5nID0gdS0+VG90YWxfZnJhbWVfc2l6ZSA8PCAzOworCisgIC8qIE1hZ2ljIHJlZ2lzdGVyIHNhdmVzIHdlIHdhbnQgdG8ga25vdyBhYm91dC4gICovCisgIHNhdmVfcnAgPSB1LT5TYXZlX1JQOworICBzYXZlX3NwID0gdS0+U2F2ZV9TUDsKKworICAvKiBBbiBpbmRpY2F0aW9uIHRoYXQgYXJncyBtYXkgYmUgc3RvcmVkIGludG8gdGhlIHN0YWNrLiAgVW5mb3J0dW5hdGVseQorICAgICB0aGUgSFBVWCBjb21waWxlcnMgdGVuZCB0byBzZXQgdGhpcyBpbiBjYXNlcyB3aGVyZSBubyBhcmdzIHdlcmUKKyAgICAgc3RvcmVkIHRvbyEuICAqLworICBhcmdzX3N0b3JlZCA9IDE7CisKKyAgLyogVHVybiB0aGUgRW50cnlfR1IgZmllbGQgaW50byBhIGJpdG1hc2suICAqLworICBzYXZlX2dyID0gMDsKKyAgZm9yIChpID0gMzsgaSA8IHUtPkVudHJ5X0dSICsgMzsgaSsrKQorICAgIHsKKyAgICAgIC8qIEZyYW1lIHBvaW50ZXIgZ2V0cyBzYXZlZCBpbnRvIGEgc3BlY2lhbCBsb2NhdGlvbi4gICovCisgICAgICBpZiAodS0+U2F2ZV9TUCAmJiBpID09IEZQX1JFR05VTSkKKwljb250aW51ZTsKKworICAgICAgc2F2ZV9nciB8PSAoMSA8PCBpKTsKKyAgICB9CisgIHNhdmVfZ3IgJj0gfnJlc3RhcnRfZ3I7CisKKyAgLyogVHVybiB0aGUgRW50cnlfRlIgZmllbGQgaW50byBhIGJpdG1hc2sgdG9vLiAgKi8KKyAgc2F2ZV9mciA9IDA7CisgIGZvciAoaSA9IDEyOyBpIDwgdS0+RW50cnlfRlIgKyAxMjsgaSsrKQorICAgIHNhdmVfZnIgfD0gKDEgPDwgaSk7CisgIHNhdmVfZnIgJj0gfnJlc3RhcnRfZnI7CisKKyAgLyogTG9vcCB1bnRpbCB3ZSBmaW5kIGV2ZXJ5dGhpbmcgb2YgaW50ZXJlc3Qgb3IgaGl0IGEgYnJhbmNoLgorCisgICAgIEZvciB1bm9wdGltaXplZCBHQ0MgY29kZSBhbmQgZm9yIGFueSBIUCBDQyBjb2RlIHRoaXMgd2lsbCBuZXZlciBldmVyCisgICAgIGV4YW1pbmUgYW55IHVzZXIgaW5zdHJ1Y3Rpb25zLgorCisgICAgIEZvciBvcHRpbXppZWQgR0NDIGNvZGUgd2UncmUgZmFjZWQgd2l0aCBwcm9ibGVtcy4gIEdDQyB3aWxsIHNjaGVkdWxlCisgICAgIGl0cyBwcm9sb2d1ZSBhbmQgbWFrZSBwcm9sb2d1ZSBpbnN0cnVjdGlvbnMgYXZhaWxhYmxlIGZvciBkZWxheSBzbG90CisgICAgIGZpbGxpbmcuICBUaGUgZW5kIHJlc3VsdCBpcyB1c2VyIGNvZGUgZ2V0cyBtaXhlZCBpbiB3aXRoIHRoZSBwcm9sb2d1ZQorICAgICBhbmQgYSBwcm9sb2d1ZSBpbnN0cnVjdGlvbiBtYXkgYmUgaW4gdGhlIGRlbGF5IHNsb3Qgb2YgdGhlIGZpcnN0IGJyYW5jaAorICAgICBvciBjYWxsLgorCisgICAgIFNvbWUgdW5leHBlY3RlZCB0aGluZ3MgYXJlIGV4cGVjdGVkIHdpdGggZGVidWdnaW5nIG9wdGltaXplZCBjb2RlLCBzbworICAgICB3ZSBhbGxvdyB0aGlzIHJvdXRpbmUgdG8gd2FsayBwYXN0IHVzZXIgaW5zdHJ1Y3Rpb25zIGluIG9wdGltaXplZAorICAgICBHQ0MgY29kZS4gICovCisgIHdoaWxlIChzYXZlX2dyIHx8IHNhdmVfZnIgfHwgc2F2ZV9ycCB8fCBzYXZlX3NwIHx8IHN0YWNrX3JlbWFpbmluZyA+IDAKKwkgfHwgYXJnc19zdG9yZWQpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IHJlZ19udW07CisgICAgICB1bnNpZ25lZCBsb25nIG9sZF9zdGFja19yZW1haW5pbmcsIG9sZF9zYXZlX2dyLCBvbGRfc2F2ZV9mcjsKKyAgICAgIHVuc2lnbmVkIGxvbmcgb2xkX3NhdmVfcnAsIG9sZF9zYXZlX3NwLCBuZXh0X2luc3Q7CisKKyAgICAgIC8qIFNhdmUgY29waWVzIG9mIGFsbCB0aGUgdHJpZ2dlcnMgc28gd2UgY2FuIGNvbXBhcmUgdGhlbSBsYXRlcgorCSAob25seSBmb3IgSFBDKS4gICovCisgICAgICBvbGRfc2F2ZV9nciA9IHNhdmVfZ3I7CisgICAgICBvbGRfc2F2ZV9mciA9IHNhdmVfZnI7CisgICAgICBvbGRfc2F2ZV9ycCA9IHNhdmVfcnA7CisgICAgICBvbGRfc2F2ZV9zcCA9IHNhdmVfc3A7CisgICAgICBvbGRfc3RhY2tfcmVtYWluaW5nID0gc3RhY2tfcmVtYWluaW5nOworCisgICAgICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKHBjLCBidWYsIDQpOworICAgICAgaW5zdCA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0KTsKKyAgICAgICAKKyAgICAgIC8qIFlvdyEgKi8KKyAgICAgIGlmIChzdGF0dXMgIT0gMCkKKwlyZXR1cm4gcGM7CisKKyAgICAgIC8qIE5vdGUgdGhlIGludGVyZXN0aW5nIGVmZmVjdHMgb2YgdGhpcyBpbnN0cnVjdGlvbi4gICovCisgICAgICBzdGFja19yZW1haW5pbmcgLT0gcHJvbG9ndWVfaW5zdF9hZGp1c3Rfc3AgKGluc3QpOworCisgICAgICAvKiBUaGVyZSBpcyBvbmx5IG9uZSBpbnN0cnVjdGlvbiB1c2VkIGZvciBzYXZpbmcgUlAgaW50byB0aGUgc3RhY2suICAqLworICAgICAgaWYgKGluc3QgPT0gMHg2YmMyM2ZkOSkKKwlzYXZlX3JwID0gMDsKKworICAgICAgLyogVGhpcyBpcyB0aGUgb25seSB3YXkgd2Ugc2F2ZSBTUCBpbnRvIHRoZSBzdGFjay4gIEF0IHRoaXMgdGltZQorCSB0aGUgSFAgY29tcGlsZXJzIG5ldmVyIGJvdGhlciB0byBzYXZlIFNQIGludG8gdGhlIHN0YWNrLiAgKi8KKyAgICAgIGlmICgoaW5zdCAmIDB4ZmZmZmMwMDApID09IDB4NmZjMTAwMDApCisJc2F2ZV9zcCA9IDA7CisKKyAgICAgIC8qIEFjY291bnQgZm9yIGdlbmVyYWwgYW5kIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIHNhdmVzLiAgKi8KKyAgICAgIHJlZ19udW0gPSBpbnN0X3NhdmVzX2dyIChpbnN0KTsKKyAgICAgIHNhdmVfZ3IgJj0gfigxIDw8IHJlZ19udW0pOworCisgICAgICAvKiBVZ2guICBBbHNvIGFjY291bnQgZm9yIGFyZ3VtZW50IHN0b3JlcyBpbnRvIHRoZSBzdGFjay4KKwkgVW5mb3J0dW5hdGVseSBhcmdzX3N0b3JlZCBvbmx5IHRlbGxzIHVzIHRoYXQgc29tZSBhcmd1bWVudHMKKwkgd2hlcmUgc3RvcmVkIGludG8gdGhlIHN0YWNrLiAgTm90IGhvdyBtYW55IG9yIHdoYXQga2luZCEKKworCSBUaGlzIGlzIGEga2x1ZGdlIGFzIG9uIHRoZSBIUCBjb21waWxlciBzZXRzIHRoaXMgYml0IGFuZCBpdAorCSBuZXZlciBkb2VzIHByb2xvZ3VlIHNjaGVkdWxpbmcuICBTbyBvbmNlIHdlIHNlZSBvbmUsIHNraXAgcGFzdAorCSBhbGwgb2YgdGhlbS4gICBXZSBoYXZlIHNpbWlsYXIgY29kZSBmb3IgdGhlIGZwIGFyZyBzdG9yZXMgYmVsb3cuCisKKwkgRklYTUUuICBDYW4gc3RpbGwgZGllIGlmIHdlIGhhdmUgYSBtaXggb2YgR1IgYW5kIEZSIGFyZ3VtZW50CisJIHN0b3JlcyEgICovCisgICAgICBpZiAocmVnX251bSA+PSAyMyAmJiByZWdfbnVtIDw9IDI2KQorCXsKKwkgIHdoaWxlIChyZWdfbnVtID49IDIzICYmIHJlZ19udW0gPD0gMjYpCisJICAgIHsKKwkgICAgICBwYyArPSA0OworCSAgICAgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAocGMsIGJ1ZiwgNCk7CisJICAgICAgaW5zdCA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0KTsKKwkgICAgICBpZiAoc3RhdHVzICE9IDApCisJCXJldHVybiBwYzsKKwkgICAgICByZWdfbnVtID0gaW5zdF9zYXZlc19nciAoaW5zdCk7CisJICAgIH0KKwkgIGFyZ3Nfc3RvcmVkID0gMDsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgcmVnX251bSA9IGluc3Rfc2F2ZXNfZnIgKGluc3QpOworICAgICAgc2F2ZV9mciAmPSB+KDEgPDwgcmVnX251bSk7CisKKyAgICAgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAocGMgKyA0LCBidWYsIDQpOworICAgICAgbmV4dF9pbnN0ID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChidWYsIDQpOworICAgICAgIAorICAgICAgLyogWW93ISAqLworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXJldHVybiBwYzsKKworICAgICAgLyogV2UndmUgZ290IHRvIGJlIHJlYWQgdG8gaGFuZGxlIHRoZSBsZG8gYmVmb3JlIHRoZSBmcCByZWdpc3RlcgorCSBzYXZlLiAgKi8KKyAgICAgIGlmICgoaW5zdCAmIDB4ZmMwMDAwMDApID09IDB4MzQwMDAwMDAKKwkgICYmIGluc3Rfc2F2ZXNfZnIgKG5leHRfaW5zdCkgPj0gNAorCSAgJiYgaW5zdF9zYXZlc19mciAobmV4dF9pbnN0KSA8PSA3KQorCXsKKwkgIC8qIFNvIHdlIGRyb3AgaW50byB0aGUgY29kZSBiZWxvdyBpbiBhIHJlYXNvbmFibGUgc3RhdGUuICAqLworCSAgcmVnX251bSA9IGluc3Rfc2F2ZXNfZnIgKG5leHRfaW5zdCk7CisJICBwYyAtPSA0OworCX0KKworICAgICAgLyogVWdoLiAgQWxzbyBhY2NvdW50IGZvciBhcmd1bWVudCBzdG9yZXMgaW50byB0aGUgc3RhY2suCisJIFRoaXMgaXMgYSBrbHVkZ2UgYXMgb24gdGhlIEhQIGNvbXBpbGVyIHNldHMgdGhpcyBiaXQgYW5kIGl0CisJIG5ldmVyIGRvZXMgcHJvbG9ndWUgc2NoZWR1bGluZy4gIFNvIG9uY2Ugd2Ugc2VlIG9uZSwgc2tpcCBwYXN0CisJIGFsbCBvZiB0aGVtLiAgKi8KKyAgICAgIGlmIChyZWdfbnVtID49IDQgJiYgcmVnX251bSA8PSA3KQorCXsKKwkgIHdoaWxlIChyZWdfbnVtID49IDQgJiYgcmVnX251bSA8PSA3KQorCSAgICB7CisJICAgICAgcGMgKz0gODsKKwkgICAgICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKHBjLCBidWYsIDQpOworCSAgICAgIGluc3QgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgNCk7CisJICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gcGM7CisJICAgICAgaWYgKChpbnN0ICYgMHhmYzAwMDAwMCkgIT0gMHgzNDAwMDAwMCkKKwkJYnJlYWs7CisJICAgICAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChwYyArIDQsIGJ1ZiwgNCk7CisJICAgICAgbmV4dF9pbnN0ID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChidWYsIDQpOworCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKKwkJcmV0dXJuIHBjOworCSAgICAgIHJlZ19udW0gPSBpbnN0X3NhdmVzX2ZyIChuZXh0X2luc3QpOworCSAgICB9CisJICBhcmdzX3N0b3JlZCA9IDA7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIFF1aXQgaWYgd2UgaGl0IGFueSBraW5kIG9mIGJyYW5jaC4gIFRoaXMgY2FuIGhhcHBlbiBpZiBhIHByb2xvZ3VlCisJIGluc3RydWN0aW9uIGlzIGluIHRoZSBkZWxheSBzbG90IG9mIHRoZSBmaXJzdCBjYWxsL2JyYW5jaC4gICovCisgICAgICBpZiAoaXNfYnJhbmNoIChpbnN0KSkKKwlicmVhazsKKworICAgICAgLyogV2hhdCBhIGNyb2NrLiAgVGhlIEhQIGNvbXBpbGVycyBzZXQgYXJnc19zdG9yZWQgZXZlbiBpZiBubworCSBhcmd1bWVudHMgd2VyZSBzdG9yZWQgaW50byB0aGUgc3RhY2sgKGJvbyBoaXNzKS4gIFRoaXMgY291bGQKKwkgY2F1c2UgdGhpcyBjb2RlIHRvIHRoZW4gc2tpcCBhIGJ1bmNoIG9mIHVzZXIgaW5zbnMgKHVwIHRvIHRoZQorCSBmaXJzdCBicmFuY2gpLgorCisJIFRvIGNvbWJhdCB0aGlzIHdlIHRyeSB0byBpZGVudGlmeSB3aGVuIGFyZ3Nfc3RvcmVkIHdhcyBib2d1c2x5CisJIHNldCBhbmQgY2xlYXIgaXQuICAgV2Ugb25seSBkbyB0aGlzIHdoZW4gYXJnc19zdG9yZWQgaXMgbm9uemVybywKKwkgYWxsIG90aGVyIHJlc291cmNlcyBhcmUgYWNjb3VudGVkIGZvciwgYW5kIG5vdGhpbmcgY2hhbmdlZCBvbgorCSB0aGlzIHBhc3MuICAqLworICAgICAgaWYgKGFyZ3Nfc3RvcmVkCisJICAmJiAhIChzYXZlX2dyIHx8IHNhdmVfZnIgfHwgc2F2ZV9ycCB8fCBzYXZlX3NwIHx8IHN0YWNrX3JlbWFpbmluZyA+IDApCisJICAmJiBvbGRfc2F2ZV9nciA9PSBzYXZlX2dyICYmIG9sZF9zYXZlX2ZyID09IHNhdmVfZnIKKwkgICYmIG9sZF9zYXZlX3JwID09IHNhdmVfcnAgJiYgb2xkX3NhdmVfc3AgPT0gc2F2ZV9zcAorCSAgJiYgb2xkX3N0YWNrX3JlbWFpbmluZyA9PSBzdGFja19yZW1haW5pbmcpCisJYnJlYWs7CisgICAgICAKKyAgICAgIC8qIEJ1bXAgdGhlIFBDLiAgKi8KKyAgICAgIHBjICs9IDQ7CisgICAgfQorCisgIC8qIFdlJ3ZlIGdvdCBhIHRlbmF0aXZlIGxvY2F0aW9uIGZvciB0aGUgZW5kIG9mIHRoZSBwcm9sb2d1ZS4gIEhvd2V2ZXIKKyAgICAgYmVjYXVzZSBvZiBsaW1pdGF0aW9ucyBpbiB0aGUgdW53aW5kIGRlc2NyaXB0b3IgbWVjaGFuaXNtIHdlIG1heQorICAgICBoYXZlIHdlbnQgdG9vIGZhciBpbnRvIHVzZXIgY29kZSBsb29raW5nIGZvciB0aGUgc2F2ZSBvZiBhIHJlZ2lzdGVyCisgICAgIHRoYXQgZG9lcyBub3QgZXhpc3QuICBTbywgaWYgdGhlcmUgcmVnaXN0ZXJzIHdlIGV4cGVjdGVkIHRvIGJlIHNhdmVkCisgICAgIGJ1dCBuZXZlciB3ZXJlLCBtYXNrIHRoZW0gb3V0IGFuZCByZXN0YXJ0LgorCisgICAgIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGluIG9wdGltaXplZCBjb2RlLCBhbmQgc2hvdWxkIGJlIHZlcnkgcmFyZS4gICovCisgIGlmIChzYXZlX2dyIHx8IChzYXZlX2ZyICYmICEgKHJlc3RhcnRfZnIgfHwgcmVzdGFydF9ncikpKQorICAgIHsKKyAgICAgIHBjID0gb3JpZ19wYzsKKyAgICAgIHJlc3RhcnRfZ3IgPSBzYXZlX2dyOworICAgICAgcmVzdGFydF9mciA9IHNhdmVfZnI7CisgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgfQorCisgIHJldHVybiBwYzsKK30KKworCisKKworCisvKiByZXR1cm4gMCBpZiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBlbmQgb2YgdGhlIHByb2xvZ3VlLAorICAgcmV0dXJuIHRoZSBuZXcgcGMgdmFsdWUgaWYgd2Uga25vdyB3aGVyZSB0aGUgcHJvbG9ndWUgZW5kcyAqLworCitzdGF0aWMgQ09SRV9BRERSCithZnRlcl9wcm9sb2d1ZSAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CisgIENPUkVfQUREUiBmdW5jX2FkZHIsIGZ1bmNfZW5kOworICBzdHJ1Y3Qgc3ltYm9sICpmOworCisgIGlmICghZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIChwYywgTlVMTCwgJmZ1bmNfYWRkciwgJmZ1bmNfZW5kKSkKKyAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgLyogVW5rbm93biAqLworCisgIGYgPSBmaW5kX3BjX2Z1bmN0aW9uIChwYyk7CisgIGlmICghZikKKyAgICByZXR1cm4gMDsJCQkvKiBubyBkZWJ1ZyBpbmZvLCBkbyBpdCB0aGUgaGFyZCB3YXkhICovCisKKyAgc2FsID0gZmluZF9wY19saW5lIChmdW5jX2FkZHIsIDApOworCisgIGlmIChzYWwuZW5kIDwgZnVuY19lbmQpCisgIHsKKyAgLyogdGhpcyBoYXBwZW5zIHdoZW4gdGhlIGZ1bmN0aW9uIGhhcyBubyBwcm9sb2d1ZSwgYmVjYXVzZSB0aGUgd2F5IAorICAgICBmaW5kX3BjX2xpbmUgd29ya3M6IGVsei4gTm90ZTogdGhpcyBtYXkgbm90IGJlIGEgdmVyeSBnb29kCisgICAgIHdheSB0byBkZWNpZGUgd2hldGhlciBhIGZ1bmN0aW9uIGhhcyBhIHByb2xvZ3VlIG9yIG5vdCwgYnV0CisgICAgIGl0IGlzIHRoZSBiZXN0IEkgY2FuIGRvIHdpdGggdGhlIGluZm8gYXZhaWxhYmxlCisgICAgIEFsc28sIHRoaXMgd2lsbCB3b3JrIGZvciBmdW5jdGlvbnMgbGlrZTogaW50IGYoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIEkuZS4gdGhlIGJwIHdpbGwgYmUgaW5zZXJ0ZWQgYXQgdGhlIGZpcnN0IG9wZW4gYnJhY2UuCisgICAgRm9yIGZ1bmN0aW9ucyB3aGVyZSB0aGUgYm9keSBpcyBvbmx5IG9uZSBsaW5lIHdyaXR0ZW4gbGlrZSB0aGlzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGYoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gMjsgfQorICAgdGhpcyB3aWxsIG1ha2UgdGhlIGJyZWFrcG9pbnQgdG8gYmUgYXQgdGhlIGxhc3QgYnJhY2UsIGFmdGVyIHRoZSBib2R5CisgICBoYXMgYmVlbiBleGVjdXRlZCBhbHJlYWR5LiBXaGF0J3MgdGhlIHBvaW50IG9mIHN0ZXBwaW5nIHRocm91Z2ggYSBmdW5jdGlvbgorICAgd2l0aG91dCBhbnkgdmFyaWFibGVzIGFueXdheT8/ICAqLworCisgICAgaWYgKChTWU1CT0xfTElORShmKSA+IDApICYmIChTWU1CT0xfTElORShmKSA8IHNhbC5saW5lKSkKKyAgICAgcmV0dXJuIHBjOyAvKm5vIGFkanVzbWVudCB3aWxsIGJlIG1hZGUqLworICAgIGVsc2UKKyAgICAgcmV0dXJuIHNhbC5lbmQ7IC8qIHRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgcHJvbG9ndWUgKi8KKyAgfQorICAvKiBUaGUgbGluZSBhZnRlciB0aGUgcHJvbG9ndWUgaXMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uICBJbiB0aGlzCisgICAgIGNhc2UsIHB1dCB0aGUgZW5kIG9mIHRoZSBwcm9sb2d1ZSBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmdW5jdGlvbi4gICovCisgIC8qIFRoaXMgc2hvdWxkIGhhcHBlbiBvbmx5IHdoZW4gdGhlIGZ1bmN0aW9uIGlzIHByb2xvZ3VlbGVzcyBhbmQgaGFzIG5vCisgICAgIGNvZGUgaW4gaXQuIEZvciBpbnN0YW5jZSB2b2lkIGR1bWIoKXt9IE5vdGU6IHRoaXMga2luZCBvZiBmdW5jdGlvbgorICAgICBpcyAgdXNlZCBxdWl0ZSBhIGxvdCBpbiB0aGUgdGVzdCBzeXN0ZW0gKi8KKworICBlbHNlIHJldHVybiBwYzsgLyogbm8gYWRqdXN0bWVudCB3aWxsIGJlIG1hZGUgKi8KK30KKworLyogVG8gc2tpcCBwcm9sb2d1ZXMsIEkgdXNlIHRoaXMgcHJlZGljYXRlLiAgUmV0dXJucyBlaXRoZXIgUEMgaXRzZWxmCisgICBpZiB0aGUgY29kZSBhdCBQQyBkb2VzIG5vdCBsb29rIGxpa2UgYSBmdW5jdGlvbiBwcm9sb2d1ZTsgb3RoZXJ3aXNlCisgICByZXR1cm5zIGFuIGFkZHJlc3MgdGhhdCAoaWYgd2UncmUgbHVja3kpIGZvbGxvd3MgdGhlIHByb2xvZ3VlLiAgSWYKKyAgIExFTklFTlQsIHRoZW4gd2UgbXVzdCBza2lwIGV2ZXJ5dGhpbmcgd2hpY2ggaXMgaW52b2x2ZWQgaW4gc2V0dGluZworICAgdXAgdGhlIGZyYW1lIChpdCdzIE9LIHRvIHNraXAgbW9yZSwganVzdCBzbyBsb25nIGFzIHdlIGRvbid0IHNraXAKKyAgIGFueXRoaW5nIHdoaWNoIG1pZ2h0IGNsb2JiZXIgdGhlIHJlZ2lzdGVycyB3aGljaCBhcmUgYmVpbmcgc2F2ZWQuCisgICBDdXJyZW50bHkgd2UgbXVzdCBub3Qgc2tpcCBtb3JlIG9uIHRoZSBhbHBoYSwgYnV0IHdlIG1pZ2h0IHRoZSBsZW5pZW50CisgICBzdHVmZiBzb21lIGRheS4gICovCisKK0NPUkVfQUREUgorc2tpcF9wcm9sb2d1ZSAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgICB1bnNpZ25lZCBsb25nIGluc3Q7CisgICAgaW50IG9mZnNldDsKKyAgICBDT1JFX0FERFIgcG9zdF9wcm9sb2d1ZV9wYzsKKyAgICBjaGFyIGJ1Zls0XTsKKworI2lmZGVmIEdEQl9UQVJHRVRfSEFTX1NIQVJFRF9MSUJTCisgICAgLyogU2lsZW50bHkgcmV0dXJuIHRoZSB1bmFsdGVyZWQgcGMgdXBvbiBtZW1vcnkgZXJyb3JzLgorICAgICAgIFRoaXMgY291bGQgaGFwcGVuIG9uIE9TRi8xIGlmIGRlY29kZV9saW5lXzEgdHJpZXMgdG8gc2tpcCB0aGUKKyAgICAgICBwcm9sb2d1ZSBmb3IgcXVpY2tzdGFydGVkIHNoYXJlZCBsaWJyYXJ5IGZ1bmN0aW9ucyB3aGVuIHRoZQorICAgICAgIHNoYXJlZCBsaWJyYXJ5IGlzIG5vdCB5ZXQgbWFwcGVkIGluLgorICAgICAgIFJlYWRpbmcgdGFyZ2V0IG1lbW9yeSBpcyBzbG93IG92ZXIgc2VyaWFsIGxpbmVzLCBzbyB3ZSBwZXJmb3JtCisgICAgICAgdGhpcyBjaGVjayBvbmx5IGlmIHRoZSB0YXJnZXQgaGFzIHNoYXJlZCBsaWJyYXJpZXMuICAqLworICAgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkgKHBjLCBidWYsIDQpKQorICAgICAgcmV0dXJuIHBjOworI2VuZGlmCisKKyAgICAvKiBTZWUgaWYgd2UgY2FuIGRldGVybWluZSB0aGUgZW5kIG9mIHRoZSBwcm9sb2d1ZSB2aWEgdGhlIHN5bWJvbCB0YWJsZS4KKyAgICAgICBJZiBzbywgdGhlbiByZXR1cm4gZWl0aGVyIFBDLCBvciB0aGUgUEMgYWZ0ZXIgdGhlIHByb2xvZ3VlLCB3aGljaGV2ZXIKKyAgICAgICBpcyBncmVhdGVyLiAgKi8KKworICAgIHBvc3RfcHJvbG9ndWVfcGMgPSBhZnRlcl9wcm9sb2d1ZSAocGMpOworCisgICAgaWYgKHBvc3RfcHJvbG9ndWVfcGMgIT0gMCkKKyAgICAgIHJldHVybiBtYXggKHBjLCBwb3N0X3Byb2xvZ3VlX3BjKTsKKworCisgICAvKiBDYW4ndCBkZXRlcm1pbmUgcHJvbG9ndWUgZnJvbSB0aGUgc3ltYm9sIHRhYmxlLCAodGhpcyBjYW4gaGFwcGVuIGlmIHRoZXJlCisgICAgICBpcyBubyBkZWJ1ZyBpbmZvcm1hdGlvbikgIHNvIHdlIG5lZWQgdG8gZmFsbCBiYWNrIG9uIHRoZSBvbGQgY29kZSwgd2hpY2gKKyAgICAgIGxvb2tzIGF0IHRoZSBpbnN0cnVjdGlvbnMgKi8KKyAgLyogRklYTUUgKGVseikgISEhITogdGhpcyBtYXkgY3JlYXRlIGEgcHJvYmxlbSBpZiwgb25jZSB0aGUgYnAgaXMgaGl0LCB0aGUgdXNlciBzYXlzCisgICAgIHdoZXJlOiB0aGUgYmFja3RyYWNlIGluZm8gaXMgbm90IHJpZ2h0OiB0aGlzIGlzIGJlY2F1c2UgdGhlIHBvaW50IGF0IHdoaWNoIHdlCisgICAgIGJyZWFrIGlzIGF0IHRoZSB2ZXJ5IGZpcnN0IGluc3RydWN0aW9uIG9mIHRoZSBmdW5jdGlvbi4gQXQgdGhpcyB0aW1lIHRoZSBzdHVmZiB0aGF0CisgICAgIG5lZWRzIHRvIGJlIHNhdmVkIG9uIHRoZSBzdGFjaywgaGFzIG5vdCBiZWVuIHNhdmVkIHlldCwgc28gdGhlIGJhY2t0cmFjZQorICAgICBjYW5ub3Qga25vdyBhbGwgaXQgbmVlZHMgdG8ga25vdy4gVGhpcyB3aWxsIG5lZWQgdG8gYmUgZml4ZWQgaW4gdGhlCisgICAgIGFjdHVhbCBiYWNrdHJhY2UgY29kZS4gKE5vdGU6IHRoaXMgaXMgd2hhdCBEREUgZG9lcykgKi8KKworICAgIGVsc2UgCisKKyAgICAgIHJldHVybiAoc2tpcF9wcm9sb2d1ZV9oYXJkX3dheShwYykpOworCisjaWYgMAorLyogZWx6OiBJIGFtIGtlZXBpbmcgdGhpcyBjb2RlIGFyb3VuZCBqdXN0IGluIGNhc2UsIGJ1dCByZW1lbWJlciwgYWxsIHRoZQorICAgaW5zdHJ1Y3Rpb25zIGFyZSBmb3IgYWxwaGE6IHlvdSBzaG91bGQgY2hhbmdlIGFsbCB0byB0aGUgaHBwYSBpbnN0cnVjdGlvbnMgKi8KKworICAgIC8qIENhbid0IGRldGVybWluZSBwcm9sb2d1ZSBmcm9tIHRoZSBzeW1ib2wgdGFibGUsIG5lZWQgdG8gZXhhbWluZQorICAgICAgIGluc3RydWN0aW9ucy4gICovCisKKyAgICAvKiBTa2lwIHRoZSB0eXBpY2FsIHByb2xvZ3VlIGluc3RydWN0aW9ucy4gVGhlc2UgYXJlIHRoZSBzdGFjayBhZGp1c3RtZW50CisgICAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBpbnN0cnVjdGlvbnMgdGhhdCBzYXZlIHJlZ2lzdGVycyBvbiB0aGUgc3RhY2sKKyAgICAgICBvciBpbiB0aGUgZ2NjIGZyYW1lLiAgKi8KKyAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IDEwMDsgb2Zmc2V0ICs9IDQpCisgICAgICB7CisgICAgICAgIGludCBzdGF0dXM7CisKKyAgICAgICAgc3RhdHVzID0gcmVhZF9tZW1vcnlfbm9icHQgKHBjICsgb2Zmc2V0LCBidWYsIDQpOworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgIG1lbW9yeV9lcnJvciAoc3RhdHVzLCBwYyArIG9mZnNldCk7CisgICAgICAgIGluc3QgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgNCk7CisKKyAgICAgICAgLyogVGhlIGFscGhhIGhhcyBubyBkZWxheSBzbG90cy4gQnV0IGxldCdzIGtlZXAgdGhlIGxlbmllbnQgc3R1ZmYsCisgICAgICAgICAgIHdlIG1pZ2h0IG5lZWQgaXQgZm9yIHNvbWV0aGluZyBlbHNlIGluIHRoZSBmdXR1cmUuICAqLworICAgICAgICBpZiAobGVuaWVudCAmJiAwKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICgoaW5zdCAmIDB4ZmZmZjAwMDApID09IDB4MjdiYjAwMDApIC8qIGxkYWggJGdwLG4oJHQxMikgKi8KKwkgIGNvbnRpbnVlOworICAgICAgICBpZiAoKGluc3QgJiAweGZmZmYwMDAwKSA9PSAweDIzYmQwMDAwKSAvKiBsZGEgJGdwLG4oJGdwKSAqLworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICgoaW5zdCAmIDB4ZmZmZjAwMDApID09IDB4MjNkZTAwMDApIC8qIGxkYSAkc3Asbigkc3ApICovCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZWxzZSBpZiAoKGluc3QgJiAweGZjMWYwMDAwKSA9PSAweGI0MWUwMDAwCisgICAgICAgICAgICAgICAgICYmIChpbnN0ICYgMHhmZmZmMDAwMCkgIT0gMHhiN2ZlMDAwMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOwkJCQkvKiBzdHEgcmVnLG4oJHNwKSAqLworCQkJCQkJLyogcmVnICE9ICR6ZXJvICovCisgICAgICAgIGVsc2UgaWYgKChpbnN0ICYgMHhmYzFmMDAwMCkgPT0gMHg5YzFlMDAwMAorICAgICAgICAgICAgICAgICAmJiAoaW5zdCAmIDB4ZmZmZjAwMDApICE9IDB4OWZmZTAwMDApCisgICAgICAgICAgICBjb250aW51ZTsJCQkJLyogc3R0IHJlZyxuKCRzcCkgKi8KKwkJCQkJCS8qIHJlZyAhPSAkemVybyAqLworICAgICAgICBlbHNlIGlmIChpbnN0ID09IDB4NDdkZTA0MGYpICAgICAgICAgICAgLyogYmlzIHNwLHNwLGZwICovCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisJICAgIH0KKyAgICByZXR1cm4gcGMgKyBvZmZzZXQ7CisjZW5kaWYgLyogMCAqLworfQorCisvKiBQdXQgaGVyZSB0aGUgY29kZSB0byBzdG9yZSwgaW50byBhIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzLAorICAgdGhlIGFkZHJlc3NlcyBvZiB0aGUgc2F2ZWQgcmVnaXN0ZXJzIG9mIGZyYW1lIGRlc2NyaWJlZCBieSBGUkFNRV9JTkZPLgorICAgVGhpcyBpbmNsdWRlcyBzcGVjaWFsIHJlZ2lzdGVycyBzdWNoIGFzIHBjIGFuZCBmcCBzYXZlZCBpbiBzcGVjaWFsCisgICB3YXlzIGluIHRoZSBzdGFjayBmcmFtZS4gIHNwIGlzIGV2ZW4gbW9yZSBzcGVjaWFsOgorICAgdGhlIGFkZHJlc3Mgd2UgcmV0dXJuIGZvciBpdCBJUyB0aGUgc3AgZm9yIHRoZSBuZXh0IGZyYW1lLiAgKi8KKwordm9pZAoraHBwYV9mcmFtZV9maW5kX3NhdmVkX3JlZ3MgKGZyYW1lX2luZm8sIGZyYW1lX3NhdmVkX3JlZ3MpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZV9pbmZvOworICAgICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqZnJhbWVfc2F2ZWRfcmVnczsKK3sKKyAgQ09SRV9BRERSIHBjOworICBzdHJ1Y3QgdW53aW5kX3RhYmxlX2VudHJ5ICp1OworICB1bnNpZ25lZCBsb25nIGluc3QsIHN0YWNrX3JlbWFpbmluZywgc2F2ZV9nciwgc2F2ZV9mciwgc2F2ZV9ycCwgc2F2ZV9zcDsKKyAgaW50IHN0YXR1cywgaSwgcmVnOworICBjaGFyIGJ1Zls0XTsKKyAgaW50IGZwX2xvYyA9IC0xOworCisgIC8qIFplcm8gb3V0IGV2ZXJ5dGhpbmcuICAqLworICBtZW1zZXQgKGZyYW1lX3NhdmVkX3JlZ3MsICdcMCcsIHNpemVvZiAoc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MpKTsKKworICAvKiBDYWxsIGR1bW15IGZyYW1lcyBhbHdheXMgbG9vayB0aGUgc2FtZSwgc28gdGhlcmUncyBubyBuZWVkIHRvCisgICAgIGV4YW1pbmUgdGhlIGR1bW15IGNvZGUgdG8gZGV0ZXJtaW5lIGxvY2F0aW9ucyBvZiBzYXZlZCByZWdpc3RlcnM7CisgICAgIGluc3RlYWQsIGxldCBmaW5kX2R1bW15X2ZyYW1lX3JlZ3MgZmlsbCBpbiB0aGUgY29ycmVjdCBvZmZzZXRzCisgICAgIGZvciB0aGUgc2F2ZWQgcmVnaXN0ZXJzLiAgKi8KKyAgaWYgKChmcmFtZV9pbmZvLT5wYyA+PSBmcmFtZV9pbmZvLT5mcmFtZQorICAgICAgICYmIGZyYW1lX2luZm8tPnBjIDw9IChmcmFtZV9pbmZvLT5mcmFtZSArIENBTExfRFVNTVlfTEVOR1RICisJCQkgICAgICsgMzIgKiA0ICsJIChOVU1fUkVHUyAtIEZQMF9SRUdOVU0pICogOAorCQkJICAgICArIDYgKiA0KSkpCQorICAgIGZpbmRfZHVtbXlfZnJhbWVfcmVncyAoZnJhbWVfaW5mbywgZnJhbWVfc2F2ZWRfcmVncyk7CisKKyAgLyogSW50ZXJydXB0IGhhbmRsZXJzIGFyZSBzcGVjaWFsIHRvby4gIFRoZXkgbGF5IG91dCB0aGUgcmVnaXN0ZXIKKyAgICAgc3RhdGUgaW4gdGhlIGV4YWN0IHNhbWUgb3JkZXIgYXMgdGhlIHJlZ2lzdGVyIG51bWJlcnMgaW4gR0RCLiAgKi8KKyAgaWYgKHBjX2luX2ludGVycnVwdF9oYW5kbGVyIChmcmFtZV9pbmZvLT5wYykpCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9SRUdTOyBpKyspCisJeworCSAgLyogU1AgaXMgYSBsaXR0bGUgc3BlY2lhbC4gICovCisJICBpZiAoaSA9PSBTUF9SRUdOVU0pCisJICAgIGZyYW1lX3NhdmVkX3JlZ3MtPnJlZ3NbU1BfUkVHTlVNXQorCSAgICAgID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoZnJhbWVfaW5mby0+ZnJhbWUgKyBTUF9SRUdOVU0gKiA0LCA0KTsKKwkgIGVsc2UKKwkgICAgZnJhbWVfc2F2ZWRfcmVncy0+cmVnc1tpXSA9IGZyYW1lX2luZm8tPmZyYW1lICsgaSAqIDQ7CisJfQorICAgICAgcmV0dXJuOworICAgIH0KKworI2lmZGVmIEZSQU1FX0ZJTkRfU0FWRURfUkVHU19JTl9TSUdUUkFNUAorICAvKiBIYW5kbGUgc2lnbmFsIGhhbmRsZXIgY2FsbGVycy4gICovCisgIGlmIChmcmFtZV9pbmZvLT5zaWduYWxfaGFuZGxlcl9jYWxsZXIpCisgICAgeworICAgICAgRlJBTUVfRklORF9TQVZFRF9SRUdTX0lOX1NJR1RSQU1QIChmcmFtZV9pbmZvLCBmcmFtZV9zYXZlZF9yZWdzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAvKiBHZXQgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIHJlZmVycmVkIHRvIGJ5IHRoZSBQQworICAgICBzYXZlZCBpbiBmcmFtZS4gICovCisgIHBjID0gZ2V0X3BjX2Z1bmN0aW9uX3N0YXJ0IChmcmFtZV9pbmZvLT5wYyk7CisKKyAgLyogWW93ISAqLworICB1ID0gZmluZF91bndpbmRfZW50cnkgKHBjKTsKKyAgaWYgKCF1KQorICAgIHJldHVybjsKKworICAvKiBUaGlzIGlzIGhvdyBtdWNoIG9mIGEgZnJhbWUgYWRqdXN0bWVudCB3ZSBuZWVkIHRvIGFjY291bnQgZm9yLiAgKi8KKyAgc3RhY2tfcmVtYWluaW5nID0gdS0+VG90YWxfZnJhbWVfc2l6ZSA8PCAzOworCisgIC8qIE1hZ2ljIHJlZ2lzdGVyIHNhdmVzIHdlIHdhbnQgdG8ga25vdyBhYm91dC4gICovCisgIHNhdmVfcnAgPSB1LT5TYXZlX1JQOworICBzYXZlX3NwID0gdS0+U2F2ZV9TUDsKKworICAvKiBUdXJuIHRoZSBFbnRyeV9HUiBmaWVsZCBpbnRvIGEgYml0bWFzay4gICovCisgIHNhdmVfZ3IgPSAwOworICBmb3IgKGkgPSAzOyBpIDwgdS0+RW50cnlfR1IgKyAzOyBpKyspCisgICAgeworICAgICAgLyogRnJhbWUgcG9pbnRlciBnZXRzIHNhdmVkIGludG8gYSBzcGVjaWFsIGxvY2F0aW9uLiAgKi8KKyAgICAgIGlmICh1LT5TYXZlX1NQICYmIGkgPT0gRlBfUkVHTlVNKQorCWNvbnRpbnVlOworCisgICAgICBzYXZlX2dyIHw9ICgxIDw8IGkpOworICAgIH0KKworICAvKiBUdXJuIHRoZSBFbnRyeV9GUiBmaWVsZCBpbnRvIGEgYml0bWFzayB0b28uICAqLworICBzYXZlX2ZyID0gMDsKKyAgZm9yIChpID0gMTI7IGkgPCB1LT5FbnRyeV9GUiArIDEyOyBpKyspCisgICAgc2F2ZV9mciB8PSAoMSA8PCBpKTsKKworICAvKiBUaGUgZnJhbWUgYWx3YXlzIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mICVzcCBhdCBlbnRyeSB0byB0aGUKKyAgICAgY3VycmVudCBmdW5jdGlvbiAoYW5kIGlzIHRodXMgZXF1aXZhbGVudCB0byB0aGUgInNhdmVkIiBzdGFjaworICAgICBwb2ludGVyLiAgKi8KKyAgZnJhbWVfc2F2ZWRfcmVncy0+cmVnc1tTUF9SRUdOVU1dID0gZnJhbWVfaW5mby0+ZnJhbWU7CisKKyAgLyogTG9vcCB1bnRpbCB3ZSBmaW5kIGV2ZXJ5dGhpbmcgb2YgaW50ZXJlc3Qgb3IgaGl0IGEgYnJhbmNoLgorCisgICAgIEZvciB1bm9wdGltaXplZCBHQ0MgY29kZSBhbmQgZm9yIGFueSBIUCBDQyBjb2RlIHRoaXMgd2lsbCBuZXZlciBldmVyCisgICAgIGV4YW1pbmUgYW55IHVzZXIgaW5zdHJ1Y3Rpb25zLgorCisgICAgIEZvciBvcHRpbXppZWQgR0NDIGNvZGUgd2UncmUgZmFjZWQgd2l0aCBwcm9ibGVtcy4gIEdDQyB3aWxsIHNjaGVkdWxlCisgICAgIGl0cyBwcm9sb2d1ZSBhbmQgbWFrZSBwcm9sb2d1ZSBpbnN0cnVjdGlvbnMgYXZhaWxhYmxlIGZvciBkZWxheSBzbG90CisgICAgIGZpbGxpbmcuICBUaGUgZW5kIHJlc3VsdCBpcyB1c2VyIGNvZGUgZ2V0cyBtaXhlZCBpbiB3aXRoIHRoZSBwcm9sb2d1ZQorICAgICBhbmQgYSBwcm9sb2d1ZSBpbnN0cnVjdGlvbiBtYXkgYmUgaW4gdGhlIGRlbGF5IHNsb3Qgb2YgdGhlIGZpcnN0IGJyYW5jaAorICAgICBvciBjYWxsLgorCisgICAgIFNvbWUgdW5leHBlY3RlZCB0aGluZ3MgYXJlIGV4cGVjdGVkIHdpdGggZGVidWdnaW5nIG9wdGltaXplZCBjb2RlLCBzbworICAgICB3ZSBhbGxvdyB0aGlzIHJvdXRpbmUgdG8gd2FsayBwYXN0IHVzZXIgaW5zdHJ1Y3Rpb25zIGluIG9wdGltaXplZAorICAgICBHQ0MgY29kZS4gICovCisgIHdoaWxlIChzYXZlX2dyIHx8IHNhdmVfZnIgfHwgc2F2ZV9ycCB8fCBzYXZlX3NwIHx8IHN0YWNrX3JlbWFpbmluZyA+IDApCisgICAgeworICAgICAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChwYywgYnVmLCA0KTsKKyAgICAgIGluc3QgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgNCk7CisKKyAgICAgIC8qIFlvdyEgKi8KKyAgICAgIGlmIChzdGF0dXMgIT0gMCkKKwlyZXR1cm47CisKKyAgICAgIC8qIE5vdGUgdGhlIGludGVyZXN0aW5nIGVmZmVjdHMgb2YgdGhpcyBpbnN0cnVjdGlvbi4gICovCisgICAgICBzdGFja19yZW1haW5pbmcgLT0gcHJvbG9ndWVfaW5zdF9hZGp1c3Rfc3AgKGluc3QpOworCisgICAgICAvKiBUaGVyZSBpcyBvbmx5IG9uZSBpbnN0cnVjdGlvbiB1c2VkIGZvciBzYXZpbmcgUlAgaW50byB0aGUgc3RhY2suICAqLworICAgICAgaWYgKGluc3QgPT0gMHg2YmMyM2ZkOSkKKwl7CisJICBzYXZlX3JwID0gMDsKKwkgIGZyYW1lX3NhdmVkX3JlZ3MtPnJlZ3NbUlBfUkVHTlVNXSA9IGZyYW1lX2luZm8tPmZyYW1lIC0gMjA7CisJfQorCisgICAgICAvKiBKdXN0IG5vdGUgdGhhdCB3ZSBmb3VuZCB0aGUgc2F2ZSBvZiBTUCBpbnRvIHRoZSBzdGFjay4gIFRoZQorCSB2YWx1ZSBmb3IgZnJhbWVfc2F2ZWRfcmVncyB3YXMgY29tcHV0ZWQgYWJvdmUuICAqLworICAgICAgaWYgKChpbnN0ICYgMHhmZmZmYzAwMCkgPT0gMHg2ZmMxMDAwMCkKKwlzYXZlX3NwID0gMDsKKworICAgICAgLyogQWNjb3VudCBmb3IgZ2VuZXJhbCBhbmQgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXIgc2F2ZXMuICAqLworICAgICAgcmVnID0gaW5zdF9zYXZlc19nciAoaW5zdCk7CisgICAgICBpZiAocmVnID49IDMgJiYgcmVnIDw9IDE4CisJICAmJiAoIXUtPlNhdmVfU1AgfHwgcmVnICE9IEZQX1JFR05VTSkpCisJeworCSAgc2F2ZV9nciAmPSB+KDEgPDwgcmVnKTsKKworCSAgLyogc3R3bSB3aXRoIGEgcG9zaXRpdmUgZGlzcGxhY2VtZW50IGlzIGEgKnBvc3QgbW9kaWZ5Ki4gICovCisJICBpZiAoKGluc3QgPj4gMjYpID09IDB4MWIKKwkgICAgICAmJiBleHRyYWN0XzE0IChpbnN0KSA+PSAwKQorCSAgICBmcmFtZV9zYXZlZF9yZWdzLT5yZWdzW3JlZ10gPSBmcmFtZV9pbmZvLT5mcmFtZTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIEhhbmRsZSBjb2RlIHdpdGggYW5kIHdpdGhvdXQgZnJhbWUgcG9pbnRlcnMuICAqLworCSAgICAgIGlmICh1LT5TYXZlX1NQKQorCQlmcmFtZV9zYXZlZF9yZWdzLT5yZWdzW3JlZ10KKwkJICA9IGZyYW1lX2luZm8tPmZyYW1lICsgZXh0cmFjdF8xNCAoaW5zdCk7CisJICAgICAgZWxzZQorCQlmcmFtZV9zYXZlZF9yZWdzLT5yZWdzW3JlZ10KKwkJICA9IGZyYW1lX2luZm8tPmZyYW1lICsgKHUtPlRvdGFsX2ZyYW1lX3NpemUgPDwgMykKKwkJICAgICsgZXh0cmFjdF8xNCAoaW5zdCk7CisJICAgIH0KKwl9CisKKworICAgICAgLyogR0NDIGhhbmRsZXMgY2FsbGVlIHNhdmVkIEZQIHJlZ3MgYSBsaXR0bGUgZGlmZmVyZW50bHkuICAKKworCSBJdCBlbWl0cyBhbiBpbnN0cnVjdGlvbiB0byBwdXQgdGhlIHZhbHVlIG9mIHRoZSBzdGFydCBvZgorCSB0aGUgRlAgc3RvcmUgYXJlYSBpbnRvICVyMS4gIEl0IHRoZW4gdXNlcyBmc3RkcyxtYSB3aXRoCisJIGEgYmFzZXJlZyBvZiAlcjEgZm9yIHRoZSBzdG9yZXMuCisKKwkgSFAgQ0MgZW1pdHMgdGhlbSBhdCB0aGUgY3VycmVudCBzdGFjayBwb2ludGVyIG1vZGlmeWluZworCSB0aGUgc3RhY2sgcG9pbnRlciBhcyBpdCBzdG9yZXMgZWFjaCByZWdpc3Rlci4gICovCisKKyAgICAgIC8qIGxkbyBYKCVyMyksJXIxIG9yIGxkbyBYKCVyMzApLCVyMS4gICovCisgICAgICBpZiAoKGluc3QgJiAweGZmZmZjMDAwKSA9PSAweDM0NjEwMDAwCisJICB8fCAoaW5zdCAmIDB4ZmZmZmMwMDApID09IDB4MzdjMTAwMDApCisJZnBfbG9jID0gZXh0cmFjdF8xNCAoaW5zdCk7CisJCisgICAgICByZWcgPSBpbnN0X3NhdmVzX2ZyIChpbnN0KTsKKyAgICAgIGlmIChyZWcgPj0gMTIgJiYgcmVnIDw9IDIxKQorCXsKKwkgIC8qIE5vdGUgKzQgYnJhaW5kYW1hZ2UgYmVsb3cgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIEZQIHN0YXR1cworCSAgICAgcmVnaXN0ZXJzIGFyZSBpbnRlcm5hbGx5IDggcmVnaXN0ZXJzIHJhdGhlciB0aGFuIHRoZSBleHBlY3RlZAorCSAgICAgNCByZWdpc3RlcnMuICAqLworCSAgc2F2ZV9mciAmPSB+KDEgPDwgcmVnKTsKKwkgIGlmIChmcF9sb2MgPT0gLTEpCisJICAgIHsKKwkgICAgICAvKiAxc3QgSFAgQ0MgRlAgcmVnaXN0ZXIgc3RvcmUuICBBZnRlciB0aGlzIGluc3RydWN0aW9uCisJCSB3ZSd2ZSBzZXQgZW5vdWdoIHN0YXRlIHRoYXQgdGhlIEdDQyBhbmQgSFBDQyBjb2RlIGFyZQorCQkgYm90aCBoYW5kbGVkIGluIHRoZSBzYW1lIG1hbm5lci4gICovCisJICAgICAgZnJhbWVfc2F2ZWRfcmVncy0+cmVnc1tyZWcgKyBGUDRfUkVHTlVNICsgNF0gPSBmcmFtZV9pbmZvLT5mcmFtZTsKKwkgICAgICBmcF9sb2MgPSA4OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBmcmFtZV9zYXZlZF9yZWdzLT5yZWdzW3JlZyArIEZQMF9SRUdOVU0gKyA0XQorCQk9IGZyYW1lX2luZm8tPmZyYW1lICsgZnBfbG9jOworCSAgICAgIGZwX2xvYyArPSA4OworCSAgICB9CisJfQorCisgICAgICAvKiBRdWl0IGlmIHdlIGhpdCBhbnkga2luZCBvZiBicmFuY2guICBUaGlzIGNhbiBoYXBwZW4gaWYgYSBwcm9sb2d1ZQorCSBpbnN0cnVjdGlvbiBpcyBpbiB0aGUgZGVsYXkgc2xvdCBvZiB0aGUgZmlyc3QgY2FsbC9icmFuY2guICAqLworICAgICAgaWYgKGlzX2JyYW5jaCAoaW5zdCkpCisJYnJlYWs7CisKKyAgICAgIC8qIEJ1bXAgdGhlIFBDLiAgKi8KKyAgICAgIHBjICs9IDQ7CisgICAgfQorfQorCisKKy8qIEV4Y2VwdGlvbiBoYW5kbGluZyBzdXBwb3J0IGZvciB0aGUgSFAtVVggQU5TSSBDKysgY29tcGlsZXIuCisgICBUaGUgY29tcGlsZXIgKGFDQykgcHJvdmlkZXMgYSBjYWxsYmFjayBmb3IgZXhjZXB0aW9uIGV2ZW50czsKKyAgIEdEQiBjYW4gc2V0IGEgYnJlYWtwb2ludCBvbiB0aGlzIGNhbGxiYWNrIGFuZCBmaW5kIG91dCB3aGF0CisgICBleGNlcHRpb24gZXZlbnQgaGFzIG9jY3VycmVkLiAqLworCisvKiBUaGUgbmFtZSBvZiB0aGUgaG9vayB0byBiZSBzZXQgdG8gcG9pbnQgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCitzdGF0aWMgY2hhciBIUF9BQ0NfRUhfbm90aWZ5X2hvb2tbXSAgICAgPSAiX19laF9ub3RpZnlfaG9vayI7CisvKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gYmUgdXNlZCB0byBzZXQgdGhlIGhvb2sgdmFsdWUgKi8gCitzdGF0aWMgY2hhciBIUF9BQ0NfRUhfc2V0X2hvb2tfdmFsdWVbXSAgPSAiX19laF9zZXRfaG9va192YWx1ZSI7CisvKiBUaGUgbmFtZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaW4gZW5kLm8gKi8gCitzdGF0aWMgY2hhciBIUF9BQ0NfRUhfbm90aWZ5X2NhbGxiYWNrW10gPSAiX19kX2VoX25vdGlmeV9jYWxsYmFjayI7CisvKiBOYW1lIG9mIGZ1bmN0aW9uIGluIGVuZC5vIG9uIHdoaWNoIGEgYnJlYWsgaXMgc2V0IChjYWxsZWQgYnkgYWJvdmUpICovIAorc3RhdGljIGNoYXIgSFBfQUNDX0VIX2JyZWFrW10gICAgICAgICAgID0gIl9fZF9laF9icmVhayI7CisvKiBOYW1lIG9mIGZsYWcgKGluIGVuZC5vKSB0aGF0IGVuYWJsZXMgY2F0Y2hpbmcgdGhyb3dzICovIAorc3RhdGljIGNoYXIgSFBfQUNDX0VIX2NhdGNoX3Rocm93W10gICAgID0gIl9fZF9laF9jYXRjaF90aHJvdyI7CisvKiBOYW1lIG9mIGZsYWcgKGluIGVuZC5vKSB0aGF0IGVuYWJsZXMgY2F0Y2hpbmcgY2F0Y2hpbmcgKi8gCitzdGF0aWMgY2hhciBIUF9BQ0NfRUhfY2F0Y2hfY2F0Y2hbXSAgICAgPSAiX19kX2VoX2NhdGNoX2NhdGNoIjsKKy8qIFRoZSBlbnVtIHVzZWQgYnkgYUNDICovIAordHlwZWRlZiBlbnVtIHsKKyAgX19FSF9OT1RJRllfVEhST1csCisgIF9fRUhfTk9USUZZX0NBVENICit9IF9fZWhfbm90aWZpY2F0aW9uOworCisvKiBJcyBleGNlcHRpb24taGFuZGxpbmcgc3VwcG9ydCBhdmFpbGFibGUgd2l0aCB0aGlzIGV4ZWN1dGFibGU/ICovCitzdGF0aWMgaW50IGhwX2N4eF9leGNlcHRpb25fc3VwcG9ydCA9IDA7CisvKiBIYXMgdGhlIGluaXRpYWxpemUgZnVuY3Rpb24gYmVlbiBydW4/ICovCitpbnQgaHBfY3h4X2V4Y2VwdGlvbl9zdXBwb3J0X2luaXRpYWxpemVkID0gMDsKKy8qIFNpbWlsYXIgdG8gYWJvdmUsIGJ1dCBpbXBvcnRlZCBmcm9tIGJyZWFrcG9pbnQuYyAtLSBub24tdGFyZ2V0LXNwZWNpZmljICovCitleHRlcm4gaW50IGV4Y2VwdGlvbl9zdXBwb3J0X2luaXRpYWxpemVkOworLyogQWRkcmVzcyBvZiBfX2VoX25vdGlmeV9ob29rICovCitzdGF0aWMgQ09SRV9BRERSIGVoX25vdGlmeV9ob29rX2FkZHIgPSBOVUxMOworLyogQWRkcmVzcyBvZiBfX2RfZWhfbm90aWZ5X2NhbGxiYWNrICovCitzdGF0aWMgQ09SRV9BRERSIGVoX25vdGlmeV9jYWxsYmFja19hZGRyID0gTlVMTDsKKy8qIEFkZHJlc3Mgb2YgX19kX2VoX2JyZWFrICovCitzdGF0aWMgQ09SRV9BRERSIGVoX2JyZWFrX2FkZHIgPSBOVUxMOworLyogQWRkcmVzcyBvZiBfX2RfZWhfY2F0Y2hfY2F0Y2ggKi8KK3N0YXRpYyBDT1JFX0FERFIgZWhfY2F0Y2hfY2F0Y2hfYWRkciA9IE5VTEw7CisvKiBBZGRyZXNzIG9mIF9fZF9laF9jYXRjaF90aHJvdyAqLworc3RhdGljIENPUkVfQUREUiBlaF9jYXRjaF90aHJvd19hZGRyID0gTlVMTDsKKy8qIFNhbCBmb3IgX19kX2VoX2JyZWFrICovCitzdGF0aWMgc3RydWN0IHN5bXRhYl9hbmRfbGluZSAqIGJyZWFrX2NhbGxiYWNrX3NhbCA9IE5VTEw7CisKKy8qIENvZGUgaW4gZW5kLmMgZXhwZWN0cyBfX2RfcGlkIHRvIGJlIHNldCBpbiB0aGUgaW5mZXJpb3IsCisgICBvdGhlcndpc2UgX19kX2VoX25vdGlmeV9jYWxsYmFjayBkb2Vzbid0IGJvdGhlciB0byBjYWxsCisgICBfX2RfZWhfYnJlYWshICBTbyB3ZSBwb2tlIHRoZSBwaWQgaW50byB0aGlzIHN5bWJvbAorICAgb3Vyc2VsdmVzLgorICAgMCA9PiBzdWNjZXNzCisgICAxID0+IGZhaWx1cmUgICovIAoraW50CitzZXR1cF9kX3BpZF9pbl9pbmZlcmlvciAoKQoreworICBDT1JFX0FERFIgYW5hZGRyOworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKiBtc3ltYm9sOworICBjaGFyIGJ1Zls0XTsgLyogRklYTUUgMzJ4NjQ/ICovCisgIAorICAvKiBTbGFtIHRoZSBwaWQgb2YgdGhlIHByb2Nlc3MgaW50byBfX2RfcGlkOyBmYWlsaW5nIGlzIG9ubHkgYSB3YXJuaW5nISAgKi8KKyAgbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoIl9fZF9waWQiLCBOVUxMLCBzeW1maWxlX29iamZpbGUpOworICBpZiAobXN5bWJvbCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJVbmFibGUgdG8gZmluZCBfX2RfcGlkIHN5bWJvbCBpbiBvYmplY3QgZmlsZS4iKTsKKyAgICAgIHdhcm5pbmcgKCJTdWdnZXN0IGxpbmtpbmcgZXhlY3V0YWJsZSB3aXRoIC1nIChsaW5rcyBpbiAvb3B0L2xhbmd0b29scy9saWIvZW5kLm8pLiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIGFuYWRkciA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKTsKKyAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0LCBpbmZlcmlvcl9waWQpOyAvKiBGSVhNRSAzMng2ND8gKi8KKyAgaWYgKHRhcmdldF93cml0ZV9tZW1vcnkgKGFuYWRkciwgYnVmLCA0KSkgLyogRklYTUUgMzJ4NjQ/ICovCisgICAgeworICAgICAgd2FybmluZyAoIlVuYWJsZSB0byB3cml0ZSBfX2RfcGlkIik7CisgICAgICB3YXJuaW5nICgiU3VnZ2VzdCBsaW5raW5nIGV4ZWN1dGFibGUgd2l0aCAtZyAobGlua3MgaW4gL29wdC9sYW5ndG9vbHMvbGliL2VuZC5vKS4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIEluaXRpYWxpemUgZXhjZXB0aW9uIGNhdGNocG9pbnQgc3VwcG9ydCBieSBsb29raW5nIGZvciB0aGUKKyAgIG5lY2Vzc2FyeSBob29rcy9jYWxsYmFja3MgaW4gZW5kLm8sIGV0Yy4sIGFuZCBzZXQgdGhlIGhvb2sgdmFsdWUgdG8KKyAgIHBvaW50IHRvIHRoZSByZXF1aXJlZCBkZWJ1ZyBmdW5jdGlvbgorCisgICBSZXR1cm4gMCA9PiBmYWlsdXJlCisgICAgICAgICAgMSA9PiBzdWNjZXNzICAgICAgICAgICovCisKK3N0YXRpYyBpbnQKK2luaXRpYWxpemVfaHBfY3h4X2V4Y2VwdGlvbl9zdXBwb3J0ICgpCit7CisgIHN0cnVjdCBzeW10YWJzX2FuZF9saW5lcyBzYWxzOworICBzdHJ1Y3QgY2xlYW51cCAqIG9sZF9jaGFpbjsKKyAgc3RydWN0IGNsZWFudXAgKiBjYW5vbmljYWxfc3RyaW5nc19jaGFpbiA9IE5VTEw7CisgIGludCBpOworICBjaGFyICogYWRkcl9zdGFydDsKKyAgY2hhciAqIGFkZHJfZW5kID0gTlVMTDsKKyAgY2hhciAqKiBjYW5vbmljYWwgPSAoY2hhciAqKikgTlVMTDsKKyAgaW50IHRocmVhZCA9IC0xOworICBzdHJ1Y3Qgc3ltYm9sICogc3ltID0gTlVMTDsKKyAgc3RydWN0IG1pbmltYWxfc3ltYm9sICogbXN5bSA9IE5VTEw7CisgIHN0cnVjdCBvYmpmaWxlICogb2JqZmlsZTsKKyAgYXNlY3Rpb24gKnNobGliX2luZm87CisKKyAgLyogRGV0ZWN0IGFuZCBkaXNhbGxvdyByZWN1cnNpb24uICBPbiBIUC1VWCB3aXRoIGFDQywgaW5maW5pdGUKKyAgICAgcmVjdXJzaW9uIGlzIGEgcG9zc2liaWxpdHkgYmVjYXVzZSBmaW5kaW5nIHRoZSBob29rIGZvciBleGNlcHRpb24KKyAgICAgY2FsbGJhY2tzIGludm9sdmVzIG1ha2luZyBhIGNhbGwgaW4gdGhlIGluZmVyaW9yLCB3aGljaCBtZWFucworICAgICByZS1pbnNlcnRpbmcgYnJlYWtwb2ludHMgd2hpY2ggY2FuIHJlLWludm9rZSB0aGlzIGNvZGUgKi8KKworICBzdGF0aWMgaW50IHJlY3Vyc2UgPSAwOyAgCisgIGlmIChyZWN1cnNlID4gMCkgCisgICAgeworICAgICAgaHBfY3h4X2V4Y2VwdGlvbl9zdXBwb3J0X2luaXRpYWxpemVkID0gMDsKKyAgICAgIGV4Y2VwdGlvbl9zdXBwb3J0X2luaXRpYWxpemVkID0gMDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBocF9jeHhfZXhjZXB0aW9uX3N1cHBvcnQgPSAwOworCisgIC8qIEZpcnN0IGNoZWNrIGlmIHdlIGhhdmUgc2VlbiBhbnkgSFAgY29tcGlsZWQgb2JqZWN0czsgaWYgbm90LAorICAgICBpdCBpcyB2ZXJ5IHVubGlrZWx5IHRoYXQgSFAncyBpZGlvc3luY3JhdGljIGNhbGxiYWNrIG1lY2hhbmlzbQorICAgICBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nIGRlYnVnIHN1cHBvcnQgd2lsbCBiZSBhdmFpbGFibGUhCisgICAgIFRoaXMgd2lsbCBwZXJjb2xhdGUgYmFjayB1cCB0byBicmVha3BvaW50LmMsIHdoZXJlIG91ciBjYWxsZXJzCisgICAgIHdpbGwgZGVjaWRlIHRvIHRyeSB0aGUgZysrIGV4Y2VwdGlvbi1oYW5kbGluZyBzdXBwb3J0IGluc3RlYWQuICovCisgIGlmICghaHBfc29tX3NvbV9vYmplY3RfcHJlc2VudCkKKyAgICByZXR1cm4gMDsKKyAgCisgIC8qIFdlIGhhdmUgYSBTT00gZXhlY3V0YWJsZSB3aXRoIFNPTSBkZWJ1ZyBpbmZvOyBmaW5kIHRoZSBob29rcyAqLworCisgIC8qIEZpcnN0IGxvb2sgZm9yIHRoZSBub3RpZnkgaG9vayBwcm92aWRlZCBieSBhQ0MgcnVudGltZSBsaWJzICovCisgIC8qIElmIHdlIGZpbmQgdGhpcyBzeW1ib2wsIHdlIGNvbmNsdWRlIHRoYXQgdGhlIGV4ZWN1dGFibGUgbXVzdAorICAgICBoYXZlIEhQIGFDQyBleGNlcHRpb24gc3VwcG9ydCBidWlsdCBpbi4gIElmIHRoaXMgc3ltYm9sIGlzIG5vdAorICAgICBmb3VuZCwgZXZlbiB0aG91Z2ggd2UncmUgYSBIUCBTT00tU09NIGZpbGUsIHdlIG1heSBoYXZlIGJlZW4KKyAgICAgYnVpbHQgd2l0aCBzb21lIG90aGVyIGNvbXBpbGVyIChub3QgYUNDKS4gIFRoaXMgcmVzdWx0cyBwZXJjb2xhdGVzCisgICAgIGJhY2sgdXAgdG8gb3VyIGNhbGxlcnMgaW4gYnJlYWtwb2ludC5jIHdoaWNoIGNhbiBkZWNpZGUgdG8KKyAgICAgdHJ5IHRoZSBnKysgc3R5bGUgb2YgZXhjZXB0aW9uIHN1cHBvcnQgaW5zdGVhZC4KKyAgICAgSWYgdGhpcyBzeW1ib2wgaXMgZm91bmQgYnV0IHRoZSBvdGhlciBzeW1ib2xzIHdlIHJlcXVpcmUgYXJlCisgICAgIG5vdCBmb3VuZCwgdGhlcmUgaXMgc29tZXRoaW5nIHdlaXJkIGdvaW5nIG9uLCBhbmQgZysrIHN1cHBvcnQKKyAgICAgc2hvdWxkICpub3QqIGJlIHRyaWVkIGFzIGFuIGFsdGVybmF0aXZlLgorICAgICAKKyAgICAgQVNTVU1QVElPTjogT25seSBIUCBhQ0MgY29kZSB3aWxsIGhhdmUgX19laF9ub3RpZnlfaG9vayBkZWZpbmVkLiAgCisgICAgIEFTU1VNUFRJT046IEhQIGFDQyBhbmQgZysrIG1vZHVsZXMgY2Fubm90IGJlIGxpbmtlZCB0b2dldGhlci4gKi8KKyAgCisgIC8qIGxpYkNzdXAgaGFzIHRoaXMgaG9vazsgaXQnbGwgdXN1YWxseSBiZSBub24tZGVidWdnYWJsZSAqLworICBtc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sIChIUF9BQ0NfRUhfbm90aWZ5X2hvb2ssIE5VTEwsIE5VTEwpOworICBpZiAobXN5bSkKKyAgICB7CisgICAgICBlaF9ub3RpZnlfaG9va19hZGRyID0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW0pOworICAgICAgaHBfY3h4X2V4Y2VwdGlvbl9zdXBwb3J0ID0gMTsKKyAgICB9ICAKKyAgZWxzZQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJVbmFibGUgdG8gZmluZCBleGNlcHRpb24gY2FsbGJhY2sgaG9vayAoJXMpLiIsIEhQX0FDQ19FSF9ub3RpZnlfaG9vayk7CisgICAgICB3YXJuaW5nICgiRXhlY3V0YWJsZSBtYXkgbm90IGhhdmUgYmVlbiBjb21waWxlZCBkZWJ1Z2dhYmxlIHdpdGggSFAgYUNDLiIpOworICAgICAgd2FybmluZyAoIkdEQiB3aWxsIGJlIHVuYWJsZSB0byBpbnRlcmNlcHQgZXhjZXB0aW9uIGV2ZW50cy4iKTsKKyAgICAgIGVoX25vdGlmeV9ob29rX2FkZHIgPSAwOworICAgICAgaHBfY3h4X2V4Y2VwdGlvbl9zdXBwb3J0ID0gMDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworI2lmIDAgLyogREVCVUdHSU5HICovCisgIHByaW50ZiAoIkhvb2sgYWRkciBmb3VuZCBpcyAlbHhcbiIsIGVoX25vdGlmeV9ob29rX2FkZHIpOworI2VuZGlmCisKKyAgLyogTmV4dCBsb29rIGZvciB0aGUgbm90aWZ5IGNhbGxiYWNrIHJvdXRpbmUgaW4gZW5kLm8gKi8KKyAgLyogVGhpcyBpcyBhbHdheXMgYXZhaWxhYmxlIGluIHRoZSBTT00gc3ltYm9sIGRpY3Rpb25hcnkgaWYgZW5kLm8gaXMgbGlua2VkIGluICovIAorICBtc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sIChIUF9BQ0NfRUhfbm90aWZ5X2NhbGxiYWNrLCBOVUxMLCBOVUxMKTsKKyAgaWYgKG1zeW0pCisgICAgeworICAgICAgZWhfbm90aWZ5X2NhbGxiYWNrX2FkZHIgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bSk7CisgICAgICBocF9jeHhfZXhjZXB0aW9uX3N1cHBvcnQgPSAxOworICAgIH0gIAorICBlbHNlIAorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJVbmFibGUgdG8gZmluZCBleGNlcHRpb24gY2FsbGJhY2sgcm91dGluZSAoJXMpLiIsIEhQX0FDQ19FSF9ub3RpZnlfY2FsbGJhY2spOworICAgICAgd2FybmluZyAoIlN1Z2dlc3QgbGlua2luZyBleGVjdXRhYmxlIHdpdGggLWcgKGxpbmtzIGluIC9vcHQvbGFuZ3Rvb2xzL2xpYi9lbmQubykuIik7CisgICAgICB3YXJuaW5nICgiR0RCIHdpbGwgYmUgdW5hYmxlIHRvIGludGVyY2VwdCBleGNlcHRpb24gZXZlbnRzLiIpOworICAgICAgZWhfbm90aWZ5X2NhbGxiYWNrX2FkZHIgPSAwOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIENoZWNrIHdoZXRoZXIgdGhlIGV4ZWN1dGFibGUgaXMgZHluYW1pY2FsbHkgbGlua2VkIG9yIGFyY2hpdmUgYm91bmQgKi8KKyAgLyogV2l0aCBhbiBhcmNoaXZlLWJvdW5kIGV4ZWN1dGFibGUgd2UgY2FuIHVzZSB0aGUgcmF3IGFkZHJlc3NlcyB3ZSBmaW5kCisgICAgIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24sIGV0Yy4gd2l0aG91dCBtb2RpZmljYXRpb24uIEZvciBhbiBleGVjdXRhYmxlCisgICAgIHdpdGggc2hhcmVkIGxpYnJhcmllcywgd2UgaGF2ZSB0byBkbyBtb3JlIHdvcmsgdG8gZmluZCB0aGUgcGxhYmVsLCB3aGljaAorICAgICBjYW4gYmUgdGhlIHRhcmdldCBvZiBhIGNhbGwgdGhyb3VnaCAkJGR5bmNhbGwgZnJvbSB0aGUgYUNDIHJ1bnRpbWUgc3VwcG9ydAorICAgICBsaWJyYXJ5IChsaWJDc3VwKSB3aGljaCBpcyBsaW5rZWQgc2hhcmVkIGJ5IGRlZmF1bHQgYnkgYUNDLiAqLworICAvKiBUaGlzIHRlc3QgYmVsb3cgd2FzIGNvcGllZCBmcm9tIHNvbXNvbGliLmMvc29tcmVhZC5jLiAgSXQgbWF5IG5vdCBiZSBhIHZlcnkKKyAgICAgcmVsaWFibGUgb25lIHRvIHRlc3QgdGhhdCBhbiBleGVjdXRhYmxlIGlzIGxpbmtlZCBzaGFyZWQuIHBhaS8xOTk3LTA3LTE4ICovIAorICBzaGxpYl9pbmZvID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN5bWZpbGVfb2JqZmlsZS0+b2JmZCwgIiRTSExJQl9JTkZPJCIpOworICBpZiAoc2hsaWJfaW5mbyAmJiAoYmZkX3NlY3Rpb25fc2l6ZSAoc3ltZmlsZV9vYmpmaWxlLT5vYmZkLCBzaGxpYl9pbmZvKSAhPSAwKSkKKyAgICB7CisgICAgICAvKiBUaGUgbWluc3ltIHdlIGhhdmUgaGFzIHRoZSBsb2NhbCBjb2RlIGFkZHJlc3MsIGJ1dCB0aGF0J3Mgbm90IHRoZQorICAgICAgICAgcGxhYmVsIHRoYXQgY2FuIGJlIHVzZWQgYnkgYW4gaW50ZXItbG9hZC1tb2R1bGUgY2FsbC4gKi8KKyAgICAgIC8qIEZpbmQgc29saWIgaGFuZGxlIGZvciBtYWluIGltYWdlICh3aGljaCBoYXMgZW5kLm8pLCBhbmQgdXNlIHRoYXQKKyAgICAgICAgIGFuZCB0aGUgbWluIHN5bSBhcyBhcmd1bWVudHMgdG8gX19kX3NobF9nZXQoKSAod2hpY2ggZG9lcyB0aGUgZXF1aXZhbGVudAorICAgICAgICAgb2Ygc2hsX2ZpbmRzeW0oKSkgdG8gZmluZCB0aGUgcGxhYmVsLiAqLyAKKworICAgICAgYXJnc19mb3JfZmluZF9zdHViIGFyZ3M7CisgICAgICBzdGF0aWMgY2hhciBtZXNzYWdlW10gPSAiRXJyb3Igd2hpbGUgZmluZGluZyBleGNlcHRpb24gY2FsbGJhY2sgaG9vazpcbiI7CisgICAgICAKKyAgICAgIGFyZ3Muc29saWJfaGFuZGxlID0gc29tX3NvbGliX2dldF9zb2xpYl9ieV9wYyAoZWhfbm90aWZ5X2NhbGxiYWNrX2FkZHIpOworICAgICAgYXJncy5tc3ltID0gbXN5bTsKKyAgICAgIAorICAgICAgcmVjdXJzZSsrOworICAgICAgZWhfbm90aWZ5X2NhbGxiYWNrX2FkZHIgPSBjYXRjaF9lcnJvcnMgKChpbnQgKCopIFBBUkFNUyAoKGNoYXIgKikpKSBjb3Zlcl9maW5kX3N0dWJfd2l0aF9zaGxfZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopICZhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIFJFVFVSTl9NQVNLX0FMTCk7CisgICAgICByZWN1cnNlLS07CisgICAgICAKKyNpZiAwIC8qIERFQlVHR0lORyAgKi8KKyAgICAgIHByaW50ZiAoImZvdW5kIHBsYWJlbCBmb3IgZWggbm90aWZ5IGNhbGxiYWNrOiAleFxuIiwgZWhfbm90aWZ5X2NhbGxiYWNrX2FkZHIpOworI2VuZGlmCisKKyAgICAgIGV4Y2VwdGlvbl9jYXRjaHBvaW50c19hcmVfZnJhZ2lsZSA9IDE7CisgICAgICAKKyAgICAgIGlmICghZWhfbm90aWZ5X2NhbGxiYWNrX2FkZHIpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBXZSBjYW4gZ2V0IGhlcmUgZWl0aGVyIGlmIHRoZXJlIGlzIG5vIHBsYWJlbCBpbiB0aGUgZXhwb3J0IGxpc3QKKyAgICAgICAgICAgICBmb3IgdGhlIG1haW4gaW1hZ2UsIG9yIGlmIHNvbWV0aGluZyBzdHJhbmdlIGhhcHBlbmVkICg/PykgKi8gCisgICAgICAgICAgd2FybmluZyAoIkNvdWxkbid0IGZpbmQgYSBwbGFiZWwgKGluZGlyZWN0IGZ1bmN0aW9uIGxhYmVsKSBmb3IgdGhlIGV4Y2VwdGlvbiBjYWxsYmFjay4iKTsKKyAgICAgICAgICB3YXJuaW5nICgiR0RCIHdpbGwgbm90IGJlIGFibGUgdG8gaW50ZXJjZXB0IGV4Y2VwdGlvbiBldmVudHMuIik7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICBleGNlcHRpb25fY2F0Y2hwb2ludHNfYXJlX2ZyYWdpbGUgPSAwOworCisjaWYgMCAgLyogREVCVUdHSU5HICovCisgIHByaW50ZiAoIkNiIGFkZHIgZm91bmQgaXMgJWx4XG4iLCBlaF9ub3RpZnlfY2FsbGJhY2tfYWRkcik7CisjZW5kaWYKKworICAvKiBOb3csIGxvb2sgZm9yIHRoZSBicmVha3BvaW50YWJsZSByb3V0aW5lIGluIGVuZC5vICovCisgIC8qIFRoaXMgc2hvdWxkIGFsc28gYmUgYXZhaWxhYmxlIGluIHRoZSBTT00gc3ltYm9sIGRpY3QuIGlmIGVuZC5vIGxpbmtlZCBpbiAqLyAKKyAgbXN5bSA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoSFBfQUNDX0VIX2JyZWFrLCBOVUxMLCBOVUxMKTsKKyAgaWYgKG1zeW0pCisgICAgeworICAgICAgZWhfYnJlYWtfYWRkciA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltKTsKKyAgICAgIGhwX2N4eF9leGNlcHRpb25fc3VwcG9ydCA9IDE7CisgICAgfSAgCisgIGVsc2UKKyAgICB7CisgICAgICB3YXJuaW5nICgiVW5hYmxlIHRvIGZpbmQgZXhjZXB0aW9uIGNhbGxiYWNrIHJvdXRpbmUgdG8gc2V0IGJyZWFrcG9pbnQgKCVzKS4iLCBIUF9BQ0NfRUhfYnJlYWspOworICAgICAgd2FybmluZyAoIlN1Z2dlc3QgbGlua2luZyBleGVjdXRhYmxlIHdpdGggLWcgKGxpbmsgaW4gL29wdC9sYW5ndG9vbHMvbGliL2VuZC5vKS4iKTsKKyAgICAgIHdhcm5pbmcgKCJHREIgd2lsbCBiZSB1bmFibGUgdG8gaW50ZXJjZXB0IGV4Y2VwdGlvbiBldmVudHMuIik7CisgICAgICBlaF9icmVha19hZGRyID0gMDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworI2lmIDAgIC8qIERFQlVHR0lORyAqLworICBwcmludGYgKCJicmVhayBhZGRyIGZvdW5kIGlzICVseFxuIiwgZWhfYnJlYWtfYWRkcik7ICAKKyNlbmRpZgorICAKKyAgLyogTmV4dCBsb29rIGZvciB0aGUgY2F0Y2ggZW5hYmxlIGZsYWcgcHJvdmlkZWQgaW4gZW5kLm8gKi8KKyAgc3ltID0gbG9va3VwX3N5bWJvbCAoSFBfQUNDX0VIX2NhdGNoX2NhdGNoLCAoc3RydWN0IGJsb2NrICopIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIFZBUl9OQU1FU1BBQ0UsIDAsIChzdHJ1Y3Qgc3ltdGFiICoqKSBOVUxMKTsKKyAgaWYgKHN5bSkgLyogc29tZXRpbWVzIHByZXNlbnQgaW4gZGVidWcgaW5mbyAqLyAKKyAgICB7CisgICAgICBlaF9jYXRjaF9jYXRjaF9hZGRyID0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKHN5bSk7CisgICAgICBocF9jeHhfZXhjZXB0aW9uX3N1cHBvcnQgPSAxOworICAgIH0KKyAgZWxzZSAgLyogb3RoZXJ3aXNlIGxvb2sgaW4gU09NIHN5bWJvbCBkaWN0LiAqLyAKKyAgICB7CisgICAgICBtc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sIChIUF9BQ0NfRUhfY2F0Y2hfY2F0Y2gsIE5VTEwsIE5VTEwpOworICAgICAgaWYgKG1zeW0pCisgICAgICAgIHsKKyAgICAgICAgICBlaF9jYXRjaF9jYXRjaF9hZGRyID0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW0pOworICAgICAgICAgIGhwX2N4eF9leGNlcHRpb25fc3VwcG9ydCA9IDE7CisgICAgICAgIH0gIAorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd2FybmluZyAoIlVuYWJsZSB0byBlbmFibGUgaW50ZXJjZXB0aW9uIG9mIGV4Y2VwdGlvbiBjYXRjaGVzLiIpOworICAgICAgICAgIHdhcm5pbmcgKCJFeGVjdXRhYmxlIG1heSBub3QgaGF2ZSBiZWVuIGNvbXBpbGVkIGRlYnVnZ2FibGUgd2l0aCBIUCBhQ0MuIik7CisgICAgICAgICAgd2FybmluZyAoIlN1Z2dlc3QgbGlua2luZyBleGVjdXRhYmxlIHdpdGggLWcgKGxpbmsgaW4gL29wdC9sYW5ndG9vbHMvbGliL2VuZC5vKS4iKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworI2lmIDAgIC8qIERFQlVHR0lORyAqLworICBwcmludGYgKCJjYXRjaCBjYXRjaCBhZGRyIGZvdW5kIGlzICVseFxuIiwgZWhfY2F0Y2hfY2F0Y2hfYWRkcik7CisjZW5kaWYKKworICAvKiBOZXh0IGxvb2sgZm9yIHRoZSBjYXRjaCBlbmFibGUgZmxhZyBwcm92aWRlZCBlbmQubyAqLworICBzeW0gPSBsb29rdXBfc3ltYm9sIChIUF9BQ0NfRUhfY2F0Y2hfY2F0Y2gsIChzdHJ1Y3QgYmxvY2sgKikgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgVkFSX05BTUVTUEFDRSwgMCwgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpOworICBpZiAoc3ltKSAvKiBzb21ldGltZXMgcHJlc2VudCBpbiBkZWJ1ZyBpbmZvICovIAorICAgIHsKKyAgICAgIGVoX2NhdGNoX3Rocm93X2FkZHIgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltKTsKKyAgICAgIGhwX2N4eF9leGNlcHRpb25fc3VwcG9ydCA9IDE7CisgICAgfQorICBlbHNlIC8qIG90aGVyd2lzZSBsb29rIGluIFNPTSBzeW1ib2wgZGljdC4gKi8gCisgICAgeworICAgICAgbXN5bSA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoSFBfQUNDX0VIX2NhdGNoX3Rocm93LCBOVUxMLCBOVUxMKTsKKyAgICAgIGlmIChtc3ltKQorICAgICAgICB7CisgICAgICAgICAgZWhfY2F0Y2hfdGhyb3dfYWRkciA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltKTsKKyAgICAgICAgICBocF9jeHhfZXhjZXB0aW9uX3N1cHBvcnQgPSAxOworICAgICAgICB9ICAKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHdhcm5pbmcgKCJVbmFibGUgdG8gZW5hYmxlIGludGVyY2VwdGlvbiBvZiBleGNlcHRpb24gdGhyb3dzLiIpOworICAgICAgICAgIHdhcm5pbmcgKCJFeGVjdXRhYmxlIG1heSBub3QgaGF2ZSBiZWVuIGNvbXBpbGVkIGRlYnVnZ2FibGUgd2l0aCBIUCBhQ0MuIik7CisgICAgICAgICAgd2FybmluZyAoIlN1Z2dlc3QgbGlua2luZyBleGVjdXRhYmxlIHdpdGggLWcgKGxpbmsgaW4gL29wdC9sYW5ndG9vbHMvbGliL2VuZC5vKS4iKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworI2lmIDAgIC8qIERFQlVHR0lORyAqLworICBwcmludGYgKCJjYXRjaCB0aHJvdyBhZGRyIGZvdW5kIGlzICVseFxuIiwgZWhfY2F0Y2hfdGhyb3dfYWRkcik7CisjZW5kaWYKKworICAvKiBTZXQgdGhlIGZsYWdzICovIAorICBocF9jeHhfZXhjZXB0aW9uX3N1cHBvcnQgPSAyOyAvKiBldmVyeXRoaW5nIHdvcmtlZCBzbyBmYXIgKi8gCisgIGhwX2N4eF9leGNlcHRpb25fc3VwcG9ydF9pbml0aWFsaXplZCA9IDE7CisgIGV4Y2VwdGlvbl9zdXBwb3J0X2luaXRpYWxpemVkID0gMTsKKworICByZXR1cm4gMTsKK30KKworLyogVGFyZ2V0IG9wZXJhdGlvbiBmb3IgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGludGVyY2VwdGlvbiBvZgorICAgZXhjZXB0aW9uIGV2ZW50cy4KKyAgIEtJTkQgaXMgZWl0aGVyIEVYX0VWRU5UX1RIUk9XIG9yIEVYX0VWRU5UX0NBVENICisgICBFTkFCTEUgaXMgZWl0aGVyIDAgKGRpc2FibGUpIG9yIDEgKGVuYWJsZSkuCisgICBSZXR1cm4gdmFsdWUgaXMgTlVMTCBpZiBubyBzdXBwb3J0IGZvdW5kOworICAgLTEgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcsCisgICBvciBhIHBvaW50ZXIgdG8gYSBzeW10YWIvbGluZSBzdHJ1Y3QgaWYgdGhlIGJyZWFrcG9pbnRhYmxlCisgICBhZGRyZXNzIHdhcyBmb3VuZC4gKi8gCisKK3N0cnVjdCBzeW10YWJfYW5kX2xpbmUgKiAKK2NoaWxkX2VuYWJsZV9leGNlcHRpb25fY2FsbGJhY2sgKGtpbmQsIGVuYWJsZSkKKyAgZW51bSBleGNlcHRpb25fZXZlbnRfa2luZCBraW5kOworICBpbnQgZW5hYmxlOworeworICBjaGFyIGJ1Zls0XTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdXBwb3J0X2luaXRpYWxpemVkIHx8ICFocF9jeHhfZXhjZXB0aW9uX3N1cHBvcnRfaW5pdGlhbGl6ZWQpCisgICAgaWYgKCFpbml0aWFsaXplX2hwX2N4eF9leGNlcHRpb25fc3VwcG9ydCAoKSkKKyAgICAgIHJldHVybiBOVUxMOworCisgIHN3aXRjaCAoaHBfY3h4X2V4Y2VwdGlvbl9zdXBwb3J0KQorICAgIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgLyogQXNzdW1pbmcgbm8gSFAgc3VwcG9ydCBhdCBhbGwgKi8gCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgY2FzZSAxOgorICAgICAgICAvKiBIUCBzdXBwb3J0IHNob3VsZCBiZSBwcmVzZW50LCBidXQgc29tZXRoaW5nIHdlbnQgd3JvbmcgKi8gCisgICAgICAgIHJldHVybiAoc3RydWN0IHN5bXRhYl9hbmRfbGluZSAqKSAtMTsgLyogeXVjayEgKi8gCisgICAgICAvKiB0aGVyZSBtYXkgYmUgb3RoZXIgY2FzZXMgaW4gdGhlIGZ1dHVyZSAqLyAKKyAgICB9CisgICAgICAgIAorICAvKiBTZXQgdGhlIEVIIGhvb2sgdG8gcG9pbnQgdG8gdGhlIGNhbGxiYWNrIHJvdXRpbmUgKi8KKyAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0LCBlbmFibGUgPyBlaF9ub3RpZnlfY2FsbGJhY2tfYWRkciA6IDApOyAvKiBGSVhNRSAzMng2NCBwcm9ibGVtICovCisgIC8qIHBhaTogKHRlbXApIEZJWE1FIHNob3VsZCB0aGVyZSBiZSBhIHBhY2sgb3BlcmF0aW9uIGZpcnN0PyAqLworICBpZiAodGFyZ2V0X3dyaXRlX21lbW9yeSAoZWhfbm90aWZ5X2hvb2tfYWRkciwgYnVmLCA0KSkgICAgLyogRklYTUUgMzJ4NjQgcHJvYmxlbSAqLworICAgIHsKKyAgICAgIHdhcm5pbmcgKCJDb3VsZCBub3Qgd3JpdGUgdG8gdGFyZ2V0IG1lbW9yeSBmb3IgZXhjZXB0aW9uIGV2ZW50IGNhbGxiYWNrLiIpOworICAgICAgd2FybmluZyAoIkludGVyY2VwdGlvbiBvZiBleGNlcHRpb24gZXZlbnRzIG1heSBub3Qgd29yay4iKTsKKyAgICAgIHJldHVybiAoc3RydWN0IHN5bXRhYl9hbmRfbGluZSAqKSAtMTsgCisgICAgfQorICBpZiAoZW5hYmxlKQorICAgIHsKKyAgICAgIC8qIEVuc3VyZSB0aGF0IF9fZF9waWQgaXMgc2V0IHVwIGNvcnJlY3RseSAtLSBlbmQuYyBjb2RlIGNoZWNrcyB0aGlzLiA6LSgqLworICAgICAgaWYgKGluZmVyaW9yX3BpZCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoc2V0dXBfZF9waWRfaW5faW5mZXJpb3IgKCkpCisgICAgICAgICAgICByZXR1cm4gKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgKikgLTE7IAorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB3YXJuaW5nICgiSW50ZXJuYWwgZXJyb3I6IEludmFsaWQgaW5mZXJpb3IgcGlkPyAgQ2Fubm90IGludGVyY2VwdCBleGNlcHRpb24gZXZlbnRzLiIpOyAvKiBwdXJlY292OiBkZWFkY29kZSAqLworICAgICAgICAgIHJldHVybiAoc3RydWN0IHN5bXRhYl9hbmRfbGluZSAqKSAtMTsgLyogcHVyZWNvdjogZGVhZGNvZGUgKi8KKyAgICAgICAgfQorICAgIH0KKyAgCisgIHN3aXRjaCAoa2luZCkKKyAgICB7CisgICAgICBjYXNlIEVYX0VWRU5UX1RIUk9XOgorICAgICAgICBzdG9yZV91bnNpZ25lZF9pbnRlZ2VyIChidWYsIDQsIGVuYWJsZSA/IDEgOiAwKTsKKyAgICAgICAgaWYgKHRhcmdldF93cml0ZV9tZW1vcnkgKGVoX2NhdGNoX3Rocm93X2FkZHIsIGJ1ZiwgNCkpIC8qIEZJWE1FIDMyeDY0PyAqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIHdhcm5pbmcgKCJDb3VsZG4ndCBlbmFibGUgZXhjZXB0aW9uIHRocm93IGludGVyY2VwdGlvbi4iKTsKKyAgICAgICAgICAgIHJldHVybiAoc3RydWN0IHN5bXRhYl9hbmRfbGluZSAqKSAtMTsKKyAgICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFWF9FVkVOVF9DQVRDSDoKKyAgICAgICAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0LCBlbmFibGUgPyAxIDogMCk7CisgICAgICAgIGlmICh0YXJnZXRfd3JpdGVfbWVtb3J5IChlaF9jYXRjaF9jYXRjaF9hZGRyLCBidWYsIDQpKSAvKiBGSVhNRSAzMng2ND8gKi8KKyAgICAgICAgICB7CisgICAgICAgICAgICB3YXJuaW5nICgiQ291bGRuJ3QgZW5hYmxlIGV4Y2VwdGlvbiBjYXRjaCBpbnRlcmNlcHRpb24uIik7CisgICAgICAgICAgICByZXR1cm4gKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgKikgLTE7CisgICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IC8qIHB1cmVjb3Y6IGRlYWRjb2RlICovCisgICAgICAgIGVycm9yICgiUmVxdWVzdCB0byBlbmFibGUgdW5rbm93biBvciB1bnN1cHBvcnRlZCBleGNlcHRpb24gZXZlbnQuIik7IC8qIHB1cmVjb3Y6IGRlYWRjb2RlICovCisgICAgfQorICAKKyAgLyogQ29weSBicmVhayBhZGRyZXNzIGludG8gbmV3IHNhbCBzdHJ1Y3QsIG1hbGxvYydpbmcgaWYgbmVlZGVkLiAqLworICBpZiAoIWJyZWFrX2NhbGxiYWNrX3NhbCkKKyAgICB7CisgICAgICBicmVha19jYWxsYmFja19zYWwgPSAoc3RydWN0IHN5bXRhYl9hbmRfbGluZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUpKTsKKyAgICB9CisgIElOSVRfU0FMKGJyZWFrX2NhbGxiYWNrX3NhbCk7CisgIGJyZWFrX2NhbGxiYWNrX3NhbC0+c3ltdGFiID0gTlVMTDsKKyAgYnJlYWtfY2FsbGJhY2tfc2FsLT5wYyA9IGVoX2JyZWFrX2FkZHI7CisgIGJyZWFrX2NhbGxiYWNrX3NhbC0+bGluZSA9IDA7CisgIGJyZWFrX2NhbGxiYWNrX3NhbC0+ZW5kID0gZWhfYnJlYWtfYWRkcjsKKyAgCisgIHJldHVybiBicmVha19jYWxsYmFja19zYWw7Cit9CisKKy8qIFJlY29yZCBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGV4Y2VwdGlvbiBldmVudCAqLyAKK3N0YXRpYyBzdHJ1Y3QgZXhjZXB0aW9uX2V2ZW50X3JlY29yZCBjdXJyZW50X2V4X2V2ZW50OworLyogQ29udmVuaWVuY2Ugc3RydWN0ICovIAorc3RhdGljIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgbnVsbF9zeW10YWJfYW5kX2xpbmUgPSB7IE5VTEwsIDAsIDAsIDAgfTsKKworLyogUmVwb3J0IGN1cnJlbnQgZXhjZXB0aW9uIGV2ZW50LiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gYSByZWNvcmQKKyAgIHRoYXQgZGVzY3JpYmVzIHRoZSBraW5kIG9mIHRoZSBldmVudCwgd2hlcmUgaXQgd2FzIHRocm93biBmcm9tLAorICAgYW5kIHdoZXJlIGl0IHdpbGwgYmUgY2F1Z2h0LiAgTW9yZSBpbmZvcm1hdGlvbiBtYXkgYmUgcmVwb3J0ZWQKKyAgIGluIHRoZSBmdXR1cmUgKi8gCitzdHJ1Y3QgZXhjZXB0aW9uX2V2ZW50X3JlY29yZCAqCitjaGlsZF9nZXRfY3VycmVudF9leGNlcHRpb25fZXZlbnQgKCkKK3sKKyAgQ09SRV9BRERSICBldmVudF9raW5kOworICBDT1JFX0FERFIgIHRocm93X2FkZHI7CisgIENPUkVfQUREUiAgY2F0Y2hfYWRkcjsKKyAgc3RydWN0IGZyYW1lX2luZm8gKmZpLCAqY3Vycl9mcmFtZTsKKyAgaW50IGxldmVsID0gMTsKKworICBjdXJyX2ZyYW1lID0gZ2V0X2N1cnJlbnRfZnJhbWUoKTsKKyAgaWYgKCFjdXJyX2ZyYW1lKQorICAgIHJldHVybiAoc3RydWN0IGV4Y2VwdGlvbl9ldmVudF9yZWNvcmQgKikgTlVMTDsKKworICAvKiBHbyB1cCBvbmUgZnJhbWUgdG8gX19kX2VoX25vdGlmeV9jYWxsYmFjaywgYmVjYXVzZSBhdCB0aGUKKyAgICAgcG9pbnQgd2hlbiB0aGlzIGNvZGUgaXMgZXhlY3V0ZWQsIHRoZXJlJ3MgZ2FyYmFnZSBpbiB0aGUKKyAgICAgYXJndW1lbnRzIG9mIF9fZF9laF9icmVhay4gKi8KKyAgZmkgPSBmaW5kX3JlbGF0aXZlX2ZyYW1lIChjdXJyX2ZyYW1lLCAmbGV2ZWwpOworICBpZiAobGV2ZWwgIT0gMCkKKyAgICByZXR1cm4gKHN0cnVjdCBleGNlcHRpb25fZXZlbnRfcmVjb3JkICopIE5VTEw7CisKKyAgc2VsZWN0X2ZyYW1lIChmaSwgLTEpOworCisgIC8qIFJlYWQgaW4gdGhlIGFyZ3VtZW50cyAqLworICAvKiBfX2RfZWhfbm90aWZ5X2NhbGxiYWNrKCkgaXMgY2FsbGVkIHdpdGggMyBhcmd1bWVudHM6CisgICAgICAgICAgMS4gZXZlbnQga2luZCBjYXRjaCBvciB0aHJvdworICAgICAgICAgIDIuIHRoZSB0YXJnZXQgYWRkcmVzcyBpZiBrbm93bgorICAgICAgICAgIDMuIGEgZmxhZyAtLSBub3Qgc3VyZSB3aGF0IHRoaXMgaXMuIHBhaS8xOTk3LTA3LTE3ICovCisgIGV2ZW50X2tpbmQgPSByZWFkX3JlZ2lzdGVyIChBUkcwX1JFR05VTSk7ICAKKyAgY2F0Y2hfYWRkciA9IHJlYWRfcmVnaXN0ZXIgKEFSRzFfUkVHTlVNKTsKKworICAvKiBOb3cgZ28gZG93biB0byBhIHVzZXIgZnJhbWUgKi8KKyAgLyogRm9yIGEgdGhyb3csIF9fZF9laF9icmVhayBpcyBjYWxsZWQgYnkKKyAgICAgICAgICAgICAgICAgIF9fZF9laF9ub3RpZnlfY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIGJ5CisgICAgICAgICAgICAgICAgICBfX25vdGlmeV90aHJvdyB3aGljaCBpcyBjYWxsZWQKKyAgICAgICAgICAgICAgICAgIGZyb20gdXNlciBjb2RlLgorICAgICBGb3IgYSBjYXRjaCwgX19kX2VoX2JyZWFrIGlzIGNhbGxlZCBieQorICAgICAgICAgICAgICAgICAgX19kX2VoX25vdGlmeV9jYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgYnkKKyAgICAgICAgICAgICAgICAgIDxzdGFja3dhbGtpbmcgc3R1ZmY+IHdoaWNoIGlzIGNhbGxlZCBieQorICAgICAgICAgICAgICAgICAgX190aHJvd19fPHN0dWZmPiBvciBfX3JldGhyb3dfPHN0dWZmPiB3aGljaCBpcyBjYWxsZWQKKyAgICAgICAgICAgICAgICAgIGZyb20gdXNlciBjb2RlLiAqLworICAvKiBGSVhNRTogRG9uJ3QgdXNlIHN1Y2ggbWFnaWMgbnVtYmVyczsgc2VhcmNoIGZvciB0aGUgZnJhbWVzICovIAorICBsZXZlbCA9IChldmVudF9raW5kID09IEVYX0VWRU5UX1RIUk9XKSA/IDMgOiA0OworICBmaSA9IGZpbmRfcmVsYXRpdmVfZnJhbWUgKGN1cnJfZnJhbWUsICZsZXZlbCk7CisgIGlmIChsZXZlbCAhPSAwKQorICAgIHJldHVybiAoc3RydWN0IGV4Y2VwdGlvbl9ldmVudF9yZWNvcmQgKikgTlVMTDsKKworICBzZWxlY3RfZnJhbWUgKGZpLCAtMSk7CisgIHRocm93X2FkZHIgPSBmaS0+cGM7CisKKyAgLyogR28gYmFjayB0byBvcmlnaW5hbCAodG9wKSBmcmFtZSAqLworICBzZWxlY3RfZnJhbWUgKGN1cnJfZnJhbWUsIC0xKTsKKworICBjdXJyZW50X2V4X2V2ZW50LmtpbmQgPSAoZW51bSBleGNlcHRpb25fZXZlbnRfa2luZCkgZXZlbnRfa2luZDsKKyAgY3VycmVudF9leF9ldmVudC50aHJvd19zYWwgPSBmaW5kX3BjX2xpbmUgKHRocm93X2FkZHIsIDEpOworICBjdXJyZW50X2V4X2V2ZW50LmNhdGNoX3NhbCA9IGZpbmRfcGNfbGluZSAoY2F0Y2hfYWRkciwgMSk7CisKKyAgcmV0dXJuICZjdXJyZW50X2V4X2V2ZW50OworfQorCisKKyNpZmRlZiBNQUlOVEVOQU5DRV9DTURTCisKK3N0YXRpYyB2b2lkCit1bndpbmRfY29tbWFuZCAoZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIENPUkVfQUREUiBhZGRyZXNzOworICBzdHJ1Y3QgdW53aW5kX3RhYmxlX2VudHJ5ICp1OworCisgIC8qIElmIHdlIGhhdmUgYW4gZXhwcmVzc2lvbiwgZXZhbHVhdGUgaXQgYW5kIHVzZSBpdCBhcyB0aGUgYWRkcmVzcy4gICovCisKKyAgaWYgKGV4cCAhPSAwICYmICpleHAgIT0gMCkKKyAgICBhZGRyZXNzID0gcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAoZXhwKTsKKyAgZWxzZQorICAgIHJldHVybjsKKworICB1ID0gZmluZF91bndpbmRfZW50cnkgKGFkZHJlc3MpOworCisgIGlmICghdSkKKyAgICB7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIkNhbid0IGZpbmQgdW53aW5kIHRhYmxlIGVudHJ5IGZvciAlc1xuIiwgZXhwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJ1bndpbmRfdGFibGVfZW50cnkgKDB4JXgpOlxuIiwgdSk7CisKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcdHJlZ2lvbl9zdGFydCA9ICIpOworICBwcmludF9hZGRyZXNzICh1LT5yZWdpb25fc3RhcnQsIGdkYl9zdGRvdXQpOworCisgIHByaW50Zl91bmZpbHRlcmVkICgiXG5cdHJlZ2lvbl9lbmQgPSAiKTsKKyAgcHJpbnRfYWRkcmVzcyAodS0+cmVnaW9uX2VuZCwgZ2RiX3N0ZG91dCk7CisKKyNpZmRlZiBfX1NURENfXworI2RlZmluZSBwaWYoRkxEKSBpZiAodS0+RkxEKSBwcmludGZfdW5maWx0ZXJlZCAoIiAiI0ZMRCk7CisjZWxzZQorI2RlZmluZSBwaWYoRkxEKSBpZiAodS0+RkxEKSBwcmludGZfdW5maWx0ZXJlZCAoIiBGTEQiKTsKKyNlbmRpZgorCisgIHByaW50Zl91bmZpbHRlcmVkICgiXG5cdGZsYWdzID0iKTsKKyAgcGlmIChDYW5ub3RfdW53aW5kKTsKKyAgcGlmIChNaWxsaWNvZGUpOworICBwaWYgKE1pbGxpY29kZV9zYXZlX3NyMCk7CisgIHBpZiAoRW50cnlfU1IpOworICBwaWYgKEFyZ3Nfc3RvcmVkKTsKKyAgcGlmIChWYXJpYWJsZV9GcmFtZSk7CisgIHBpZiAoU2VwYXJhdGVfUGFja2FnZV9Cb2R5KTsKKyAgcGlmIChGcmFtZV9FeHRlbnNpb25fTWlsbGljb2RlKTsKKyAgcGlmIChTdGFja19PdmVyZmxvd19DaGVjayk7CisgIHBpZiAoVHdvX0luc3RydWN0aW9uX1NQX0luY3JlbWVudCk7CisgIHBpZiAoQWRhX1JlZ2lvbik7CisgIHBpZiAoU2F2ZV9TUCk7CisgIHBpZiAoU2F2ZV9SUCk7CisgIHBpZiAoU2F2ZV9NUlBfaW5fZnJhbWUpOworICBwaWYgKGV4dG5fcHRyX2RlZmluZWQpOworICBwaWYgKENsZWFudXBfZGVmaW5lZCk7CisgIHBpZiAoTVBFX1hMX2ludGVycnVwdF9tYXJrZXIpOworICBwaWYgKEhQX1VYX2ludGVycnVwdF9tYXJrZXIpOworICBwaWYgKExhcmdlX2ZyYW1lKTsKKworICBwdXRjaGFyX3VuZmlsdGVyZWQgKCdcbicpOworCisjaWZkZWYgX19TVERDX18KKyNkZWZpbmUgcGluKEZMRCkgcHJpbnRmX3VuZmlsdGVyZWQgKCJcdCIjRkxEIiA9IDB4JXhcbiIsIHUtPkZMRCk7CisjZWxzZQorI2RlZmluZSBwaW4oRkxEKSBwcmludGZfdW5maWx0ZXJlZCAoIlx0RkxEID0gMHgleFxuIiwgdS0+RkxEKTsKKyNlbmRpZgorCisgIHBpbiAoUmVnaW9uX2Rlc2NyaXB0aW9uKTsKKyAgcGluIChFbnRyeV9GUik7CisgIHBpbiAoRW50cnlfR1IpOworICBwaW4gKFRvdGFsX2ZyYW1lX3NpemUpOworfQorI2VuZGlmIC8qIE1BSU5URU5BTkNFX0NNRFMgKi8KKworI2lmZGVmIFBSRVBBUkVfVE9fUFJPQ0VFRAorCisvKiBJZiB0aGUgdXNlciBoYXMgc3dpdGNoZWQgdGhyZWFkcywgYW5kIHRoZXJlIGlzIGEgYnJlYWtwb2ludAorICAgYXQgdGhlIG9sZCB0aHJlYWQncyBwYyBsb2NhdGlvbiwgdGhlbiBzd2l0Y2ggdG8gdGhhdCB0aHJlYWQKKyAgIGFuZCByZXR1cm4gVFJVRSwgZWxzZSByZXR1cm4gRkFMU0UgYW5kIGRvbid0IGRvIGEgdGhyZWFkCisgICBzd2l0Y2ggKG9yIHJhdGhlciwgZG9uJ3Qgc2VlbSB0byBoYXZlIGRvbmUgYSB0aHJlYWQgc3dpdGNoKS4KKworICAgUHRyYWNlLWJhc2VkIGdkYiB3aWxsIGFsd2F5cyByZXR1cm4gRkFMU0UgdG8gdGhlIHRocmVhZC1zd2l0Y2gKKyAgIHF1ZXJ5LCBhbmQgdGh1cyBhbHNvIHRvIFBSRVBBUkVfVE9fUFJPQ0VFRC4KKworICAgVGhlIGltcG9ydGFudCB0aGluZyBpcyB3aGV0aGVyIHRoZXJlIGlzIGEgQlBUIGluc3RydWN0aW9uLAorICAgbm90IGhvdyBtYW55IHVzZXIgYnJlYWtwb2ludHMgdGhlcmUgYXJlLiAgU28gd2UgaGF2ZSB0byB3b3JyeQorICAgYWJvdXQgdGhpbmdzIGxpa2UgdGhlc2U6CisKKyAgIG8gIE5vbi1icCBzdG9wIC0tIE5PCisKKyAgIG8gIFVzZXIgaGl0cyBicCwgbm8gc3dpdGNoIC0tIE5PCisKKyAgIG8gIFVzZXIgaGl0cyBicCwgc3dpdGNoZXMgdGhyZWFkcyAtLSBZRVMKKworICAgbyAgVXNlciBoaXRzIGJwLCBkZWxldGVzIGJwLCBzd2l0Y2hlcyB0aHJlYWRzIC0tIE5PCisKKyAgIG8gIFVzZXIgaGl0cyBicCwgZGVsZXRlcyBvbmUgb2YgdHdvIG9yIG1vcmUgYnBzCisgICAgICBhdCB0aGF0IFBDLCB1c2VyIHN3aXRjaGVzIHRocmVhZHMgLS0gWUVTCisKKyAgIG8gIFBsdXMsIHNpbmNlIHdlJ3JlIGJ1ZmZlcmluZyBldmVudHMsIHRoZSB1c2VyIG1heSBoYXZlIGhpdCBhCisgICAgICBicmVha3BvaW50LCBkZWxldGVkIHRoZSBicmVha3BvaW50IGFuZCB0aGVuIGdvdHRlbiBhbm90aGVyCisgICAgICBoaXQgb24gdGhhdCBzYW1lIGJyZWFrcG9pbnQgb24gYW5vdGhlciB0aHJlYWQgd2hpY2gKKyAgICAgIGFjdHVhbGx5IGhpdCBiZWZvcmUgdGhlIGRlbGV0ZS4gKEZJWE1FIGluIGJyZWFrcG9pbnQuYworICAgICAgc28gdGhhdCAiZGVhZCIgYnJlYWtwb2ludHMgYXJlIGlnbm9yZWQ/KSAtLSBOTworCisgICBGb3IgdGhlc2UgcmVhc29ucywgd2UgaGF2ZSB0byB2aW9sYXRlIGluZm9ybWF0aW9uIGhpZGluZyBhbmQKKyAgIGNhbGwgImJyZWFrcG9pbnRfaGVyZV9wIi4gIElmIGNvcmUgZ2RiIHRoaW5rcyB0aGVyZSBpcyBhIGJwdAorICAgaGVyZSwgdGhhdCdzIHdoYXQgY291bnRzLCBhcyBjb3JlIGdkYiBpcyB0aGUgb25lIHdoaWNoIGlzCisgICBwdXR0aW5nIHRoZSBCUFQgaW5zdHJ1Y3Rpb24gaW4gYW5kIHRha2luZyBpdCBvdXQuICovCitpbnQKK2hwcGFfcHJlcGFyZV90b19wcm9jZWVkKCkKK3sKKyAgcGlkX3Qgb2xkX3RocmVhZDsKKyAgcGlkX3QgY3VycmVudF90aHJlYWQ7CisKKyAgb2xkX3RocmVhZCA9IGhwcGFfc3dpdGNoZWRfdGhyZWFkcyhpbmZlcmlvcl9waWQpOworICBpZiAob2xkX3RocmVhZCAhPSAwKQorICAgIHsKKyAgICAgIC8qIFN3aXRjaGVkIG92ZXIgZnJvbSAib2xkX3RocmVhZCIuICBUcnkgdG8gZG8KKyAgICAgICAgIGFzIGxpdHRsZSB3b3JrIGFzIHBvc3NpYmxlLCAnY2F1c2UgbW9zdGx5CisgICAgICAgICB3ZSdyZSBnb2luZyB0byBzd2l0Y2ggYmFjay4gKi8KKyAgICAgIENPUkVfQUREUiBuZXdfcGM7CisgICAgICBDT1JFX0FERFIgb2xkX3BjID0gcmVhZF9wYygpOworCisgICAgICAvKiBZdWssIHNob3VsZG4ndCB1c2UgZ2xvYmFsIHRvIHNwZWNpZnkgY3VycmVudAorICAgICAgICAgdGhyZWFkLiAgQnV0IHRoYXQncyBob3cgZ2RiIGRvZXMgaXQuICovCisgICAgICBjdXJyZW50X3RocmVhZCA9IGluZmVyaW9yX3BpZDsKKyAgICAgIGluZmVyaW9yX3BpZCAgID0gb2xkX3RocmVhZDsKKworICAgICAgbmV3X3BjID0gcmVhZF9wYygpOworICAgICAgaWYgKG5ld19wYyAhPSBvbGRfcGMgICAgICAgICAgLyogSWYgYXQgc2FtZSBwYywgbm8gbmVlZCAqLworCSAgJiYgYnJlYWtwb2ludF9oZXJlX3AgKG5ld19wYykpCisgICAgICAgIHsKKwkgIC8qIFVzZXIgaGFzbid0IGRlbGV0ZWQgdGhlIEJQLgorICAgICAgICAgICAgIFJldHVybiBUUlVFLCBmaW5pc2hpbmcgc3dpdGNoIHRvICJvbGRfdGhyZWFkIi4gKi8KKwkgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7CisJICByZWdpc3RlcnNfY2hhbmdlZCAoKTsKKyNpZiAwCisJICBwcmludGYoIi0tLT4gUFJFUEFSRV9UT19QUk9DRUVEICh3YXMgJWQsIG5vdyAlZCkhXG4iLAorCQkgIGN1cnJlbnRfdGhyZWFkLCBpbmZlcmlvcl9waWQpOworI2VuZGlmCisgICAgICAgICAgICAgICAKKwkgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgIC8qIE90aGVyd2lzZSBzd2l0Y2ggYmFjayB0byB0aGUgdXNlci1jaG9zZW4gdGhyZWFkLiAqLworICAgICAgaW5mZXJpb3JfcGlkID0gY3VycmVudF90aHJlYWQ7CisgICAgICBuZXdfcGMgICAgICAgPSByZWFkX3BjKCk7ICAgICAgIC8qIFJlLXByaW1lIHJlZ2lzdGVyIGNhY2hlICovCisgICAgfQorCisgIHJldHVybiAwOworfQorI2VuZGlmIC8qIFBSRVBBUkVfVE9fUFJPQ0VFRCAqLworCit2b2lkCitfaW5pdGlhbGl6ZV9ocHBhX3RkZXAgKCkKK3sKKyAgdG1fcHJpbnRfaW5zbiA9IHByaW50X2luc25faHBwYTsKKworI2lmZGVmIE1BSU5URU5BTkNFX0NNRFMKKyAgYWRkX2NtZCAoInVud2luZCIsIGNsYXNzX21haW50ZW5hbmNlLCB1bndpbmRfY29tbWFuZCwKKwkgICAiUHJpbnQgdW53aW5kIHRhYmxlIGVudHJ5IGF0IGdpdmVuIGFkZHJlc3MuIiwKKwkgICAmbWFpbnRlbmFuY2VwcmludGxpc3QpOworI2VuZGlmIC8qIE1BSU5URU5BTkNFX0NNRFMgKi8KK30KZGlmZiAtLWdpdCBhL2dkYi9ocHBhYi1uYXQuYyBiL2dkYi9ocHBhYi1uYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmNlMWZkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2hwcGFiLW5hdC5jCkBAIC0wLDAgKzEsMjE1IEBACisvKiBNYWNoaW5lLWRlcGVuZGVudCBob29rcyBmb3IgdGhlIHVuaXggY2hpbGQgcHJvY2VzcyBzdHJhdHVtLiAgVGhpcworICAgY29kZSBpcyBmb3IgdGhlIEhQIFBBLVJJU0MgY3B1LgorCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKKyAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisKKy8qIFVzZSBhbiBleHRyYSBsZXZlbCBvZiBpbmRpcmVjdGlvbiBmb3IgcHRyYWNlIGNhbGxzLgorICAgVGhpcyBsZXRzIHVzIGJyZWFrcG9pbnQgdXNlZnVsbHkgb24gY2FsbF9wdHJhY2UuICAgSXQgYWxzbworICAgYWxsb3dzIHVzIHRvIHBhc3MgYW4gZXh0cmEgYXJndW1lbnQgdG8gcHRyYWNlIHdpdGhvdXQKKyAgIHVzaW5nIGFuIEFOU0ktQyBzcGVjaWZpYyBtYWNyby4gICovCisKKyNkZWZpbmUgcHRyYWNlIGNhbGxfcHRyYWNlCisKKyNpZiAhZGVmaW5lZCAob2Zmc2V0b2YpCisjZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgKCh1bnNpZ25lZCBsb25nKSAmKChUWVBFICopMCktPk1FTUJFUikKKyNlbmRpZgorCisvKiBVX1JFR1NfT0ZGU0VUIGlzIHRoZSBvZmZzZXQgb2YgdGhlIHJlZ2lzdGVycyB3aXRoaW4gdGhlIHUgYXJlYS4gICovCisjaWYgIWRlZmluZWQgKFVfUkVHU19PRkZTRVQpCisjZGVmaW5lIFVfUkVHU19PRkZTRVQgXAorICBwdHJhY2UgKFBUX1JFQURfVSwgaW5mZXJpb3JfcGlkLCBcCisgICAgICAgICAgKFBUUkFDRV9BUkczX1RZUEUpIChvZmZzZXRvZiAoc3RydWN0IHVzZXIsIHVfYXIwKSksIDApIFwKKyAgICAtIEtFUk5FTF9VX0FERFIKKyNlbmRpZgorCisvKiBGZXRjaCBvbmUgcmVnaXN0ZXIuICAqLworCitzdGF0aWMgdm9pZAorZmV0Y2hfcmVnaXN0ZXIgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZWdhZGRyOworICBjaGFyIGJ1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworICByZWdpc3RlciBpbnQgaTsKKworICAvKiBPZmZzZXQgb2YgcmVnaXN0ZXJzIHdpdGhpbiB0aGUgdSBhcmVhLiAgKi8KKyAgdW5zaWduZWQgaW50IG9mZnNldDsKKworICBvZmZzZXQgPSBVX1JFR1NfT0ZGU0VUOworCisgIHJlZ2FkZHIgPSByZWdpc3Rlcl9hZGRyIChyZWdubywgb2Zmc2V0KTsKKyAgZm9yIChpID0gMDsgaSA8IFJFR0lTVEVSX1JBV19TSVpFIChyZWdubyk7IGkgKz0gc2l6ZW9mIChpbnQpKQorICAgIHsKKyAgICAgIGVycm5vID0gMDsKKyAgICAgICooaW50ICopICZidWZbaV0gPSBwdHJhY2UgKFBUX1JVUkVHUywgaW5mZXJpb3JfcGlkLAorCQkJCSAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnYWRkciwgMCk7CisgICAgICByZWdhZGRyICs9IHNpemVvZiAoaW50KTsKKyAgICAgIGlmIChlcnJubyAhPSAwKQorCXsKKwkgIC8qIFdhcm5pbmcsIG5vdCBlcnJvciwgaW4gY2FzZSB3ZSBhcmUgYXR0YWNoZWQ7IHNvbWV0aW1lcyB0aGUKKwkgICAgIGtlcm5lbCBkb2Vzbid0IGxldCB1cyBhdCB0aGUgcmVnaXN0ZXJzLiAgKi8KKwkgIGNoYXIgKmVyciA9IHNhZmVfc3RyZXJyb3IgKGVycm5vKTsKKwkgIGNoYXIgKm1zZyA9IGFsbG9jYSAoc3RybGVuIChlcnIpICsgMTI4KTsKKwkgIHNwcmludGYgKG1zZywgInJlYWRpbmcgcmVnaXN0ZXIgJXM6ICVzIiwgUkVHSVNURVJfTkFNRSAocmVnbm8pLCBlcnIpOworCSAgd2FybmluZyAobXNnKTsKKwkgIGdvdG8gZXJyb3JfZXhpdDsKKwl9CisgICAgfQorICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCBidWYpOworIGVycm9yX2V4aXQ6OworfQorCisvKiBGZXRjaCBhbGwgcmVnaXN0ZXJzLCBvciBqdXN0IG9uZSwgZnJvbSB0aGUgY2hpbGQgcHJvY2Vzcy4gICovCisKK3ZvaWQKK2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgaWYgKHJlZ25vID09IC0xKQorICAgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IE5VTV9SRUdTOyByZWdubysrKQorICAgICAgZmV0Y2hfcmVnaXN0ZXIgKHJlZ25vKTsKKyAgZWxzZQorICAgIGZldGNoX3JlZ2lzdGVyIChyZWdubyk7Cit9CisKKy8qIFN0b3JlIG91ciByZWdpc3RlciB2YWx1ZXMgYmFjayBpbnRvIHRoZSBpbmZlcmlvci4KKyAgIElmIFJFR05PIGlzIC0xLCBkbyB0aGlzIGZvciBhbGwgcmVnaXN0ZXJzLgorICAgT3RoZXJ3aXNlLCBSRUdOTyBzcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXIgKHNvIHdlIGNhbiBzYXZlIHRpbWUpLiAgKi8KKwordm9pZAorc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgcmVnYWRkcjsKKyAgY2hhciBidWZbODBdOworICBleHRlcm4gY2hhciByZWdpc3RlcnNbXTsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHVuc2lnbmVkIGludCBvZmZzZXQgPSBVX1JFR1NfT0ZGU0VUOworICBpbnQgc2NyYXRjaDsKKworICBpZiAocmVnbm8gPj0gMCkKKyAgICB7CisgICAgICBpZiAoQ0FOTk9UX1NUT1JFX1JFR0lTVEVSIChyZWdubykpCisJcmV0dXJuOworICAgICAgcmVnYWRkciA9IHJlZ2lzdGVyX2FkZHIgKHJlZ25vLCBvZmZzZXQpOworICAgICAgZXJybm8gPSAwOworICAgICAgaWYgKHJlZ25vID09IFBDT1FfSEVBRF9SRUdOVU0gfHwgcmVnbm8gPT0gUENPUV9UQUlMX1JFR05VTSkKKyAgICAgICAgeworICAgICAgICAgIHNjcmF0Y2ggPSAqKGludCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ25vKV0gfCAweDM7CisgICAgICAgICAgcHRyYWNlIChQVF9XVVJFR1MsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIHJlZ2FkZHIsCisgICAgICAgICAgICAgICAgICBzY3JhdGNoKTsKKyAgICAgICAgICBpZiAoZXJybm8gIT0gMCkKKyAgICAgICAgICAgIHsKKwkgICAgICAvKiBFcnJvciwgZXZlbiBpZiBhdHRhY2hlZC4gIEZhaWxpbmcgdG8gd3JpdGUgdGhlc2UgdHdvCisJCSByZWdpc3RlcnMgaXMgcHJldHR5IHNlcmlvdXMuICAqLworICAgICAgICAgICAgICBzcHJpbnRmIChidWYsICJ3cml0aW5nIHJlZ2lzdGVyIG51bWJlciAlZCIsIHJlZ25vKTsKKyAgICAgICAgICAgICAgcGVycm9yX3dpdGhfbmFtZSAoYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorCWZvciAoaSA9IDA7IGkgPCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pOyBpICs9IHNpemVvZihpbnQpKQorCSAgeworCSAgICBlcnJubyA9IDA7CisJICAgIHB0cmFjZSAoUFRfV1VSRUdTLCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSByZWdhZGRyLAorCQkgICAgKihpbnQgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdubykgKyBpXSk7CisJICAgIGlmIChlcnJubyAhPSAwKQorCSAgICAgIHsKKwkJLyogV2FybmluZywgbm90IGVycm9yLCBpbiBjYXNlIHdlIGFyZSBhdHRhY2hlZDsgc29tZXRpbWVzIHRoZQorCQkgICBrZXJuZWwgZG9lc24ndCBsZXQgdXMgYXQgdGhlIHJlZ2lzdGVycy4gICovCisJCWNoYXIgKmVyciA9IHNhZmVfc3RyZXJyb3IgKGVycm5vKTsKKwkJY2hhciAqbXNnID0gYWxsb2NhIChzdHJsZW4gKGVycikgKyAxMjgpOworCQlzcHJpbnRmIChtc2csICJ3cml0aW5nIHJlZ2lzdGVyICVzOiAlcyIsCisJCQkgUkVHSVNURVJfTkFNRSAocmVnbm8pLCBlcnIpOworCQl3YXJuaW5nIChtc2cpOworCQlyZXR1cm47CisJICAgICAgfQorCSAgICByZWdhZGRyICs9IHNpemVvZihpbnQpOworCSAgfQorICAgIH0KKyAgZWxzZQorICAgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IE5VTV9SRUdTOyByZWdubysrKQorICAgICAgc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChyZWdubyk7Cit9CisKKy8qIFBUX1BST1QgaXMgc3BlY2lmaWMgdG8gdGhlIFBBIEJTRCBrZXJuZWwgYW5kIGlzbid0IGRvY3VtZW50ZWQKKyAgIGFueXdoZXJlIChleGNlcHQgaGVyZSkuICAKKworICAgUFRfUFJPVCBhbGxvd3Mgb25lIHRvIGVuYWJsZS9kaXNhYmxlIHRoZSBkYXRhIG1lbW9yeSBicmVhayBiaXQKKyAgIGZvciBwYWdlcyBvZiBtZW1vcnkgaW4gYW4gaW5mZXJpb3IgcHJvY2Vzcy4gIFRoaXMgYml0IGlzIHVzZWQKKyAgIHRvIGNhdXNlICJEYXRhIG1lbW9yeSBicmVhayB0cmFwcyIgdG8gb2NjdXIgd2hlbiB0aGUgYXBwcm9wcmlhdGUKKyAgIHBhZ2UgaXMgd3JpdHRlbiB0by4KKworICAgVGhlIGFyZ3VtZW50cyBhcmUgYXMgZm9sbG93czoKKworICAgICAgUFRfUFJPVCAtLSBUaGUgcHRyYWNlIGFjdGlvbiB0byBwZXJmb3JtLgorCisgICAgICBJTkZFUklPUl9QSUQgLS0gVGhlIHBpZCBvZiB0aGUgcHJvY2VzcyB3aG8ncyBwYWdlIHRhYmxlIGVudHJpZXMKKyAgICAgIHdpbGwgYmUgbW9kaWZpZWQuCisKKyAgICAgIFBUX0FSR1MgLS0gVGhlICphZGRyZXNzKiBvZiBhIDMgd29yZCBibG9jayBvZiBtZW1vcnkgd2hpY2ggaGFzCisgICAgICBhZGRpdGlvbmFsIGluZm9ybWF0aW9uOgorCisgICAgICAgIHdvcmQgMCAtLSBUaGUgc3RhcnQgYWRkcmVzcyB0byB3YXRjaC4gIFRoaXMgc2hvdWxkIGJlIGEgcGFnZS1hbGlnbmVkCisJYWRkcmVzcy4KKworCXdvcmQgMSAtLSBUaGUgZW5kaW5nIGFkZHJlc3MgdG8gd2F0Y2guICBBZ2FpbiwgdGhpcyBzaG91bGQgYmUgYSAKKwlwYWdlIGFsaWduZWQgYWRkcmVzcy4KKworCXdvcmQgMiAtLSBOb256ZXJvIHRvIGVuYWJsZSB0aGUgZGF0YSBtZW1vcnkgYnJlYWsgYml0IG9uIHRoZQorCWdpdmVuIGFkZHJlc3MgcmFuZ2Ugb3IgemVybyB0byBkaXNhYmxlIHRoZSBkYXRhIG1lbW9yeSBicmVhaworCWJpdCBvbiB0aGUgZ2l2ZW4gYWRkcmVzcyByYW5nZS4KKworICBUaGlzIGNhbGwgbWF5IGZhaWwgaWYgdGhlIGdpdmVuIGFkZHJlc3NlcyBhcmUgbm90IHZhbGlkIGluIHRoZSBpbmZlcmlvcgorICBwcm9jZXNzLiAgVGhpcyBtb3N0IG9mdGVuIGhhcHBlbnMgd2hlbiByZXN0YXJ0aW5nIGEgcHJvZ3JhbSB3aGljaAorICBhcyB3YXRjaHBvaW50cyBpbnNlcnRlZCBvbiBoZWFwIG9yIHN0YWNrIG1lbW9yeS4gICovCisJCisjZGVmaW5lIFBUX1BST1QgMjEKKworaW50CitocHBhX3NldF93YXRjaHBvaW50IChhZGRyLCBsZW4sIGZsYWcpCisgICAgIGludCBhZGRyLCBsZW4sIGZsYWc7Cit7CisgIGludCBwdF9hcmdzWzNdOworICBwdF9hcmdzWzBdID0gYWRkcjsKKyAgcHRfYXJnc1sxXSA9IGFkZHIgKyBsZW47CisgIHB0X2FyZ3NbMl0gPSBmbGFnOworCisgIC8qIE1hc2sgb2ZmIHRoZSBsb3dlciAxMiBiaXRzIHNpbmNlIHdlIHdhbnQgdG8gd29yayBvbiBhIHBhZ2UgYmFzaXMuICAqLworICBwdF9hcmdzWzBdID4+PSAxMjsgCisgIHB0X2FyZ3NbMV0gPj49IDEyOyAKKworICAvKiBSb3VuZGluZyBhZGp1c3RtZW50cy4gICovCisgIHB0X2FyZ3NbMV0gLT0gcHRfYXJnc1swXTsgCisgIHB0X2FyZ3NbMV0rKzsgCisKKyAgLyogUHV0IHRoZSBsb3dlciAxMiBiaXRzIGJhY2sgYXMgemVyby4gICovCisgIHB0X2FyZ3NbMF0gPDw9IDEyOyAKKyAgcHRfYXJnc1sxXSA8PD0gMTI7IAorCisgIC8qIERvIGl0LiAgKi8KKyAgcmV0dXJuIHB0cmFjZSAoUFRfUFJPVCwgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgcHRfYXJncywgMCk7Cit9CmRpZmYgLS1naXQgYS9nZGIvaHBwYWgtbmF0LmMgYi9nZGIvaHBwYWgtbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM3ZjY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9ocHBhaC1uYXQuYwpAQCAtMCwwICsxLDEwNTkgQEAKKy8qIE5hdGl2ZSBzdXBwb3J0IGNvZGUgZm9yIEhQVVggUEEtUklTQy4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKKyAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSA8d2FpdC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCitleHRlcm4gQ09SRV9BRERSIHRleHRfZW5kOworCitzdGF0aWMgdm9pZCBmZXRjaF9yZWdpc3RlciBQQVJBTVMgKChpbnQpKTsKKwordm9pZAorZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBpZiAocmVnbm8gPT0gLTEpCisgICAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgTlVNX1JFR1M7IHJlZ25vKyspCisgICAgICBmZXRjaF9yZWdpc3RlciAocmVnbm8pOworICBlbHNlCisgICAgZmV0Y2hfcmVnaXN0ZXIgKHJlZ25vKTsKK30KKworLyogU3RvcmUgb3VyIHJlZ2lzdGVyIHZhbHVlcyBiYWNrIGludG8gdGhlIGluZmVyaW9yLgorICAgSWYgUkVHTk8gaXMgLTEsIGRvIHRoaXMgZm9yIGFsbCByZWdpc3RlcnMuCisgICBPdGhlcndpc2UsIFJFR05PIHNwZWNpZmllcyB3aGljaCByZWdpc3RlciAoc28gd2UgY2FuIHNhdmUgdGltZSkuICAqLworCit2b2lkCitzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZWdhZGRyOworICBjaGFyIGJ1Zls4MF07CisgIGV4dGVybiBjaGFyIHJlZ2lzdGVyc1tdOworICByZWdpc3RlciBpbnQgaTsKKyAgdW5zaWduZWQgaW50IG9mZnNldCA9IFVfUkVHU19PRkZTRVQ7CisgIGludCBzY3JhdGNoOworCisgIGlmIChyZWdubyA+PSAwKQorICAgIHsKKyAgICAgIGlmIChDQU5OT1RfU1RPUkVfUkVHSVNURVIgKHJlZ25vKSkKKwlyZXR1cm47CisgICAgICByZWdhZGRyID0gcmVnaXN0ZXJfYWRkciAocmVnbm8sIG9mZnNldCk7CisgICAgICBlcnJubyA9IDA7CisgICAgICBpZiAocmVnbm8gPT0gUENPUV9IRUFEX1JFR05VTSB8fCByZWdubyA9PSBQQ09RX1RBSUxfUkVHTlVNKQorICAgICAgICB7CisgICAgICAgICAgc2NyYXRjaCA9ICooaW50ICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnbm8pXSB8IDB4MzsKKyAgICAgICAgICBjYWxsX3B0cmFjZSAoUFRfV1VSRUdTLCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSByZWdhZGRyLAorICAgICAgICAgICAgICAgICAgc2NyYXRjaCk7CisgICAgICAgICAgaWYgKGVycm5vICE9IDApCisgICAgICAgICAgICB7CisJICAgICAgLyogRXJyb3IsIGV2ZW4gaWYgYXR0YWNoZWQuICBGYWlsaW5nIHRvIHdyaXRlIHRoZXNlIHR3bworCQkgcmVnaXN0ZXJzIGlzIHByZXR0eSBzZXJpb3VzLiAgKi8KKyAgICAgICAgICAgICAgc3ByaW50ZiAoYnVmLCAid3JpdGluZyByZWdpc3RlciBudW1iZXIgJWQiLCByZWdubyk7CisgICAgICAgICAgICAgIHBlcnJvcl93aXRoX25hbWUgKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKwlmb3IgKGkgPSAwOyBpIDwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ25vKTsgaSArPSBzaXplb2YoaW50KSkKKwkgIHsKKwkgICAgZXJybm8gPSAwOworCSAgICBjYWxsX3B0cmFjZSAoUFRfV1VSRUdTLCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSByZWdhZGRyLAorCQkgICAgKihpbnQgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdubykgKyBpXSk7CisJICAgIGlmIChlcnJubyAhPSAwKQorCSAgICAgIHsKKwkJLyogV2FybmluZywgbm90IGVycm9yLCBpbiBjYXNlIHdlIGFyZSBhdHRhY2hlZDsgc29tZXRpbWVzIHRoZQorCQkgICBrZXJuZWwgZG9lc24ndCBsZXQgdXMgYXQgdGhlIHJlZ2lzdGVycy4gICovCisJCWNoYXIgKmVyciA9IHNhZmVfc3RyZXJyb3IgKGVycm5vKTsKKwkJY2hhciAqbXNnID0gYWxsb2NhIChzdHJsZW4gKGVycikgKyAxMjgpOworCQlzcHJpbnRmIChtc2csICJ3cml0aW5nIHJlZ2lzdGVyICVzOiAlcyIsCisJCQkgUkVHSVNURVJfTkFNRSAocmVnbm8pLCBlcnIpOworCQl3YXJuaW5nIChtc2cpOworCQlyZXR1cm47CisJICAgICAgfQorCSAgICByZWdhZGRyICs9IHNpemVvZihpbnQpOworCSAgfQorICAgIH0KKyAgZWxzZQorICAgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IE5VTV9SRUdTOyByZWdubysrKQorICAgICAgc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChyZWdubyk7Cit9CisKKy8qIEZldGNoIG9uZSByZWdpc3Rlci4gICovCisKK3N0YXRpYyB2b2lkCitmZXRjaF9yZWdpc3RlciAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHJlZ2FkZHI7CisgIGNoYXIgYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisgIHJlZ2lzdGVyIGludCBpOworCisgIC8qIE9mZnNldCBvZiByZWdpc3RlcnMgd2l0aGluIHRoZSB1IGFyZWEuICAqLworICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworCisgIG9mZnNldCA9IFVfUkVHU19PRkZTRVQ7CisKKyAgcmVnYWRkciA9IHJlZ2lzdGVyX2FkZHIgKHJlZ25vLCBvZmZzZXQpOworICBmb3IgKGkgPSAwOyBpIDwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ25vKTsgaSArPSBzaXplb2YgKGludCkpCisgICAgeworICAgICAgZXJybm8gPSAwOworICAgICAgKihpbnQgKikgJmJ1ZltpXSA9IGNhbGxfcHRyYWNlIChQVF9SVVJFR1MsIGluZmVyaW9yX3BpZCwKKwkJCQkgKFBUUkFDRV9BUkczX1RZUEUpIHJlZ2FkZHIsIDApOworICAgICAgcmVnYWRkciArPSBzaXplb2YgKGludCk7CisgICAgICBpZiAoZXJybm8gIT0gMCkKKwl7CisJICAvKiBXYXJuaW5nLCBub3QgZXJyb3IsIGluIGNhc2Ugd2UgYXJlIGF0dGFjaGVkOyBzb21ldGltZXMgdGhlCisJICAgKiBrZXJuZWwgZG9lc24ndCBsZXQgdXMgYXQgdGhlIHJlZ2lzdGVycy4KKwkgICAqLworCSAgY2hhciAqZXJyID0gc2FmZV9zdHJlcnJvciAoZXJybm8pOworCSAgY2hhciAqbXNnID0gYWxsb2NhIChzdHJsZW4gKGVycikgKyAxMjgpOworCSAgc3ByaW50ZiAobXNnLCAicmVhZGluZyByZWdpc3RlciAlczogJXMiLCBSRUdJU1RFUl9OQU1FIChyZWdubyksIGVycik7CisJICB3YXJuaW5nIChtc2cpOworCSAgZ290byBlcnJvcl9leGl0OworCX0KKyAgICB9CisgIGlmIChyZWdubyA9PSBQQ09RX0hFQURfUkVHTlVNIHx8IHJlZ25vID09IFBDT1FfVEFJTF9SRUdOVU0pCisgICAgYnVmWzNdICY9IH4weDM7CisgIHN1cHBseV9yZWdpc3RlciAocmVnbm8sIGJ1Zik7CisgZXJyb3JfZXhpdDo7Cit9CisKKy8qIENvcHkgTEVOIGJ5dGVzIHRvIG9yIGZyb20gaW5mZXJpb3IncyBtZW1vcnkgc3RhcnRpbmcgYXQgTUVNQUREUgorICAgdG8gZGVidWdnZXIgbWVtb3J5IHN0YXJ0aW5nIGF0IE1ZQUREUi4gICBDb3B5IHRvIGluZmVyaW9yIGlmCisgICBXUklURSBpcyBub256ZXJvLgorICAKKyAgIFJldHVybnMgdGhlIGxlbmd0aCBjb3BpZWQsIHdoaWNoIGlzIGVpdGhlciB0aGUgTEVOIGFyZ3VtZW50IG9yIHplcm8uCisgICBUaGlzIHhmZXIgZnVuY3Rpb24gZG9lcyBub3QgZG8gcGFydGlhbCBtb3Zlcywgc2luY2UgY2hpbGRfb3BzCisgICBkb2Vzbid0IGFsbG93IG1lbW9yeSBvcGVyYXRpb25zIHRvIGNyb3NzIGJlbG93IHVzIGluIHRoZSB0YXJnZXQgc3RhY2sKKyAgIGFueXdheS4gICovCisKK2ludAorY2hpbGRfeGZlcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuLCB3cml0ZSwgdGFyZ2V0KQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworICAgICBpbnQgd3JpdGU7CisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQ7CQkvKiBpZ25vcmVkICovCit7CisgIHJlZ2lzdGVyIGludCBpOworICAvKiBSb3VuZCBzdGFydGluZyBhZGRyZXNzIGRvd24gdG8gbG9uZ3dvcmQgYm91bmRhcnkuICAqLworICByZWdpc3RlciBDT1JFX0FERFIgYWRkciA9IG1lbWFkZHIgJiAtIHNpemVvZiAoaW50KTsKKyAgLyogUm91bmQgZW5kaW5nIGFkZHJlc3MgdXA7IGdldCBudW1iZXIgb2YgbG9uZ3dvcmRzIHRoYXQgbWFrZXMuICAqLworICByZWdpc3RlciBpbnQgY291bnQKKyAgICA9ICgoKG1lbWFkZHIgKyBsZW4pIC0gYWRkcikgKyBzaXplb2YgKGludCkgLSAxKSAvIHNpemVvZiAoaW50KTsKKworICAvKiBBbGxvY2F0ZSBidWZmZXIgb2YgdGhhdCBtYW55IGxvbmd3b3Jkcy4gICovCisgIC8qIE5vdGUgKFJUKSAtIFRoaXMgY29kZSBmb3JtZXJseSB1c2VkIGFsbG9jYSwgd2hpY2ggSSBoYXZlCisgICAqIHJlcGxhY2VkIHdpdGggeG1hbGxvYyBhbmQgYSBtYXRjaGluZyBmcmVlKCkgYXQgdGhlIGVuZC4KKyAgICogVGhlIHByb2JsZW0gd2l0aCBhbGxvY2EoKSBpcyB0aGF0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSBvZgorICAgKiB3aGVuIGl0J2xsIGJlIGZyZWVkLCBhbmQgd2Ugd2VyZSBzZWVpbmcgY2FzZXMgb2YgbWVtb3J5CisgICAqIGxlYWtzIG9uOgorICAgKiAoZ2RiKSB3YXRjaCB4CisgICAqIChnZGIpIGNvbnQKKyAgICogd2hlcmUgdGhlIHBpbGVkLXVwIGFsbG9jYSdzIGZvciB0aGUgY2hpbGRfeGZlcl9tZW1vcnkgYnVmZmVycworICAgKiB3ZXJlIG5vdCBnZXR0aW5nIGZyZWVkLgorICAgKi8KKyAgcmVnaXN0ZXIgaW50ICpidWZmZXIgPSAoaW50ICopIHhtYWxsb2MgKGNvdW50ICogc2l6ZW9mIChpbnQpKTsKKworICBpZiAod3JpdGUpCisgICAgeworICAgICAgLyogRmlsbCBzdGFydCBhbmQgZW5kIGV4dHJhIGJ5dGVzIG9mIGJ1ZmZlciB3aXRoIGV4aXN0aW5nIG1lbW9yeSBkYXRhLiAgKi8KKworICAgICAgaWYgKGFkZHIgIT0gbWVtYWRkciB8fCBsZW4gPCAoaW50KXNpemVvZiAoaW50KSkgeworCS8qIE5lZWQgcGFydCBvZiBpbml0aWFsIHdvcmQgLS0gZmV0Y2ggaXQuICAqLworICAgICAgICBidWZmZXJbMF0gPSBjYWxsX3B0cmFjZSAoYWRkciA8IHRleHRfZW5kID8gUFRfUklVU0VSIDogUFRfUkRVU0VSLCAKKwkJCSAgICBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSBhZGRyLCAwKTsKKyAgICAgIH0KKworICAgICAgaWYgKGNvdW50ID4gMSkJCS8qIEZJWE1FLCBhdm9pZCBpZiBldmVuIGJvdW5kYXJ5ICovCisJeworCSAgYnVmZmVyW2NvdW50IC0gMV0KKwkgICAgPSBjYWxsX3B0cmFjZSAoYWRkciA8IHRleHRfZW5kID8gUFRfUklVU0VSIDogUFRfUkRVU0VSLCBpbmZlcmlvcl9waWQsCisJCSAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSAoYWRkciArIChjb3VudCAtIDEpICogc2l6ZW9mIChpbnQpKSwKKwkJICAgICAgMCk7CisJfQorCisgICAgICAvKiBDb3B5IGRhdGEgdG8gYmUgd3JpdHRlbiBvdmVyIGNvcnJlc3BvbmRpbmcgcGFydCBvZiBidWZmZXIgKi8KKworICAgICAgbWVtY3B5ICgoY2hhciAqKSBidWZmZXIgKyAobWVtYWRkciAmIChzaXplb2YgKGludCkgLSAxKSksIG15YWRkciwgbGVuKTsKKworICAgICAgLyogV3JpdGUgdGhlIGVudGlyZSBidWZmZXIuICAqLworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgYWRkciArPSBzaXplb2YgKGludCkpCisJeworICAgICAgICAgIGludCAgcHRfc3RhdHVzOworICAgICAgICAgIGludCAgcHRfcmVxdWVzdDsKKwkgIC8qIFRoZSBIUC1VWCBrZXJuZWwgY3Jhc2hlcyBpZiB5b3UgdXNlIFBUX1dEVVNFUiB0byB3cml0ZSBpbnRvIHRoZSB0ZXh0CisJICAgICBzZWdtZW50LiAgRklYTUUgLS0gZG9lcyBpdCB3b3JrIHRvIHdyaXRlIGludG8gdGhlIGRhdGEgc2VnbWVudCB1c2luZworCSAgICAgV0lVU0VSLCBvciBkbyB0aGVzZSBpZGlvdHMgcmVhbGx5IGV4cGVjdCB1cyB0byBmaWd1cmUgb3V0IHdoaWNoIHNlZ21lbnQKKwkgICAgIHRoZSBhZGRyZXNzIGlzIGluLCBzbyB3ZSBjYW4gdXNlIGEgc2VwYXJhdGUgc3lzdGVtIGNhbGwgZm9yIGl0Pz8hICAqLworCSAgZXJybm8gPSAwOworICAgICAgICAgIHB0X3JlcXVlc3QgPSAoYWRkciA8IHRleHRfZW5kKSA/IFBUX1dJVVNFUiA6IFBUX1dEVVNFUjsKKwkgIHB0X3N0YXR1cyA9IGNhbGxfcHRyYWNlIChwdF9yZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZlcmlvcl9waWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFRSQUNFX0FSRzNfVFlQRSkgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2ldKTsKKworICAgICAgICAgIC8qIERpZCB3ZSBmYWlsPyAgTWlnaHQgd2UndmUgZ3Vlc3NlZCB3cm9uZyBhYm91dCB3aGljaAorICAgICAgICAgICAgIHNlZ21lbnQgdGhpcyBhZGRyZXNzIHJlc2lkZXMgaW4/ICBUcnkgdGhlIG90aGVyIHJlcXVlc3QsCisgICAgICAgICAgICAgYW5kIHNlZSBpZiB0aGF0IHdvcmtzLi4uCisgICAgICAgICAgICAgKi8KKwkgIGlmICgocHRfc3RhdHVzID09IC0xKSAmJiBlcnJubykgeworICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgcHRfcmVxdWVzdCA9IChwdF9yZXF1ZXN0ID09IFBUX1dJVVNFUikgPyBQVF9XRFVTRVIgOiBQVF9XSVVTRVI7CisgICAgICAgICAgICBwdF9zdGF0dXMgPSBjYWxsX3B0cmFjZSAocHRfcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZlcmlvcl9waWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSk7CisKKyAgICAgICAgICAgIC8qIE5vLCB3ZSBzdGlsbCBmYWlsLiAgT2theSwgdGltZSB0byBwdW50LiAqLworICAgICAgICAgICAgaWYgKChwdF9zdGF0dXMgPT0gLTEpICYmIGVycm5vKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJlZShidWZmZXIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICB9CisJICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlYWQgYWxsIHRoZSBsb25nd29yZHMgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBhZGRyICs9IHNpemVvZiAoaW50KSkKKwl7CisJICBlcnJubyA9IDA7CisJICBidWZmZXJbaV0gPSBjYWxsX3B0cmFjZSAoYWRkciA8IHRleHRfZW5kID8gUFRfUklVU0VSIDogUFRfUkRVU0VSLCAKKwkJCSAgICAgIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIGFkZHIsIDApOworCSAgaWYgKGVycm5vKSB7CisJICAgIGZyZWUoYnVmZmVyKTsKKwkgICAgcmV0dXJuIDA7CisJICB9CisJICBRVUlUOworCX0KKworICAgICAgLyogQ29weSBhcHByb3ByaWF0ZSBieXRlcyBvdXQgb2YgdGhlIGJ1ZmZlci4gICovCisgICAgICBtZW1jcHkgKG15YWRkciwgKGNoYXIgKikgYnVmZmVyICsgKG1lbWFkZHIgJiAoc2l6ZW9mIChpbnQpIC0gMSkpLCBsZW4pOworICAgIH0KKyAgZnJlZShidWZmZXIpOworICByZXR1cm4gbGVuOworfQorCisKK3ZvaWQKK2NoaWxkX3Bvc3RfZm9sbG93X2luZmVyaW9yX2J5X2Nsb25lICgpCit7CisgIGludCAgc3RhdHVzOworCisgIC8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGZvbGxvd2luZyBib3RoIHRoZSBwYXJlbnQgYW5kIGNoaWxkCisgICAgIG9mIGEgZm9yay4gIEluIHRoaXMgY2FzZSwgdGhlIGRlYnVnZ2VyIGNsb25lcyBpdHNlbGYuICBUaGUgb3JpZ2luYWwKKyAgICAgZGVidWdnZXIgZm9sbG93cyB0aGUgcGFyZW50LCB0aGUgY2xvbmUgZm9sbG93cyB0aGUgY2hpbGQuICBUaGUKKyAgICAgb3JpZ2luYWwgZGV0YWNoZXMgZnJvbSB0aGUgY2hpbGQsIGRlbGl2ZXJpbmcgYSBTSUdTVE9QIHRvIGl0IHRvCisgICAgIGtlZXAgaXQgZnJvbSBydW5uaW5nIGF3YXkgdW50aWwgdGhlIGNsb25lIGNhbiBhdHRhY2ggaXRzZWxmLgorCisgICAgIEF0IHRoaXMgcG9pbnQsIHRoZSBjbG9uZSBoYXMgYXR0YWNoZWQgdG8gdGhlIGNoaWxkLiAgQmVjYXVzZSBvZgorICAgICB0aGUgU0lHU1RPUCwgd2UgbXVzdCBub3cgZGVsaXZlciBhIFNJR0NPTlQgdG8gdGhlIGNoaWxkLCBvciBpdAorICAgICB3b24ndCBiZWhhdmUgcHJvcGVybHkuICovCisgIHN0YXR1cyA9IGtpbGwgKGluZmVyaW9yX3BpZCwgU0lHQ09OVCk7Cit9CisKKwordm9pZAorY2hpbGRfcG9zdF9mb2xsb3dfdmZvcmsgKHBhcmVudF9waWQsIGZvbGxvd2VkX3BhcmVudCwgY2hpbGRfcGlkLCBmb2xsb3dlZF9jaGlsZCkKKyAgICAgaW50ICBwYXJlbnRfcGlkOworICAgICBpbnQgIGZvbGxvd2VkX3BhcmVudDsKKyAgICAgaW50ICBjaGlsZF9waWQ7CisgICAgIGludCAgZm9sbG93ZWRfY2hpbGQ7Cit7CisKKyAgLyogQXJlIHdlIGEgZGVidWdnZXIgdGhhdCBmb2xsb3dlZCB0aGUgcGFyZW50IG9mIGEgdmZvcms/ICBJZiBzbywKKyAgICAgdGhlbiByZWNhbGwgdGhhdCB0aGUgY2hpbGQncyB2Zm9yayBldmVudCB3YXMgZGVsaXZlcmVkIHRvIHVzCisgICAgIGZpcnN0LiAgQW5kLCB0aGF0IHRoZSBwYXJlbnQgd2FzIHN1c3BlbmRlZCBieSB0aGUgT1MgdW50aWwgdGhlCisgICAgIGNoaWxkJ3MgZXhlYyBvciBleGl0IGV2ZW50cyB3ZXJlIHJlY2VpdmVkLgorCisgICAgIFVwb24gcmVjZWl2aW5nIHRoYXQgY2hpbGQgdmZvcmssIHRoZW4sIHdlIHdlcmUgZm9yY2VkIHRvIHJlbW92ZQorICAgICBhbGwgYnJlYWtwb2ludHMgaW4gdGhlIGNoaWxkIGFuZCBjb250aW51ZSBpdCBzbyB0aGF0IGl0IGNvdWxkCisgICAgIHJlYWNoIHRoZSBleGVjIG9yIGV4aXQgcG9pbnQuCisKKyAgICAgQnV0IGFsc28gcmVjYWxsIHRoYXQgdGhlIHBhcmVudCBhbmQgY2hpbGQgb2YgYSB2Zm9yayBzaGFyZSB0aGUKKyAgICAgc2FtZSBhZGRyZXNzIHNwYWNlLiAgVGh1cywgcmVtb3ZpbmcgYnAncyBpbiB0aGUgY2hpbGQgYWxzbworICAgICByZW1vdmVkIHRoZW0gZnJvbSB0aGUgcGFyZW50LgorCisgICAgIE5vdyB0aGF0IHRoZSBjaGlsZCBoYXMgc2FmZWx5IGV4ZWMnZCBvciBleGl0ZWQsIHdlIG11c3QgcmVzdG9yZQorICAgICB0aGUgcGFyZW50J3MgYnJlYWtwb2ludHMgYmVmb3JlIHdlIGNvbnRpbnVlIGl0LiAgRWxzZSwgd2UgbWF5CisgICAgIGNhdXNlIGl0IHJ1biBwYXN0IGV4cGVjdGVkIHN0b3BwaW5nIHBvaW50cy4gKi8KKyAgaWYgKGZvbGxvd2VkX3BhcmVudCkKKyAgICB7CisgICAgICByZWF0dGFjaF9icmVha3BvaW50cyAocGFyZW50X3BpZCk7CisgICAgfQorCisgIC8qIEFyZSB3ZSBhIGRlYnVnZ2VyIHRoYXQgZm9sbG93ZWQgdGhlIGNoaWxkIG9mIGEgdmZvcms/ICBJZiBzbywKKyAgICAgdGhlbiByZWNhbGwgdGhhdCB3ZSBkb24ndCBhY3R1YWxseSBhY3F1aXJlIGNvbnRyb2wgb2YgdGhlIGNoaWxkCisgICAgIHVudGlsIGFmdGVyIGl0IGhhcyBleGVjJ2Qgb3IgZXhpdGVkLgorICAgICAqLworICBpZiAoZm9sbG93ZWRfY2hpbGQpCisgICAgeworICAgICAgLyogSWYgdGhlIGNoaWxkIGhhcyBleGl0ZWQsIHRoZW4gdGhlcmUncyBub3RoaW5nIGZvciB1cyB0byBkby4KKyAgICAgICAgIEluIHRoZSBjYXNlIG9mIGFuIGV4ZWMgZXZlbnQsIHdlJ2xsIGxldCB0aGF0IGJlIGhhbmRsZWQgYnkKKyAgICAgICAgIHRoZSBub3JtYWwgbWVjaGFuaXNtIHRoYXQgbm90aWNlcyBhbmQgaGFuZGxlcyBleGVjIGV2ZW50cywgaW4KKyAgICAgICAgIHJlc3VtZSgpLiAqLworCisgICAgfQorfQorCisvKiBGb3JtYXQgYSBwcm9jZXNzIGlkLCBnaXZlbiBhIHBpZC4gIEJlIHN1cmUgdG8gdGVybWluYXRlCisgKiB0aGlzIHdpdGggYSBudWxsLS1pdCdzIGdvaW5nIHRvIGJlIHByaW50ZWQgdmlhIGEgIiVzIi4KKyAqLworY2hhciAqCitocHBhX3BpZF90b19zdHIoIHBpZCApCisgICAgcGlkX3QgcGlkOworeworICAgIHN0YXRpYyBjaGFyIGJ1ZlszMF07IC8qIFN0YXRpYyBiZWNhdXNlIGFkZHJlc3MgcmV0dXJuZWQgKi8KKworICAgIHNwcmludGYoIGJ1ZiwgInByb2Nlc3MgJWRcMFwwXDBcMCIsIHBpZCApOworICAgICAgICAgICAgIC8qIEV4dHJhIE5VTExzIGZvciBwYXJhbm9pYSdzIHNha2UgKi8KKyAgICAgICAgICAgICAKKyAgICByZXR1cm4gYnVmOworfQorCisvKiBGb3JtYXQgYSB0aHJlYWQgaWQsIGdpdmVuIGEgdGlkLiAgQmUgc3VyZSB0byB0ZXJtaW5hdGUKKyAqIHRoaXMgd2l0aCBhIG51bGwtLWl0J3MgZ29pbmcgdG8gYmUgcHJpbnRlZCB2aWEgYSAiJXMiLgorICoKKyAqIE5vdGU6IFRoaXMgaXMgYSBjb3JlLWdkYiB0aWQsIG5vdCB0aGUgYWN0dWFsIHN5c3RlbSB0aWQuCisgKiAgICAgICBTZWUgaW5mdHRyYWNlLmMgZm9yIGRldGFpbHMuCisgKi8KK2NoYXIgKgoraHBwYV90aWRfdG9fc3RyKCB0aWQgKQorICAgIHBpZF90IHRpZDsKK3sKKyAgICBzdGF0aWMgY2hhciBidWZbMzBdOyAvKiBTdGF0aWMgYmVjYXVzZSBhZGRyZXNzIHJldHVybmVkICovCisKKyAgICBzcHJpbnRmKCBidWYsICJzeXN0ZW0gdGhyZWFkICVkXDBcMFwwXDAiLCB0aWQgKTsKKyAgICAgICAgICAgICAvKiBFeHRyYSBOVUxMcyBmb3IgcGFyYW5vaWEncyBzYWtlICovCisgICAgICAgICAgICAgCisgICAgcmV0dXJuIGJ1ZjsKK30KKworI2lmICFkZWZpbmVkIChHREJfTkFUSVZFX0hQVVhfMTEpCisKKy8qIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBhIHN1YnN0aXR1dGUgZm9yIHRoZSBpbmZ0dHJhY2UuYyB2ZXJzaW9ucyB1c2VkCisgICB3aXRoIHR0cmFjZSgpIGluIEhQVVggMTEuICAqLworCisvKiBUaGlzIHZhbHVlIGlzIGFuIGFyYml0cmFyeSBpbnRlZ2VyLiAqLworI2RlZmluZSBQVF9WRVJTSU9OIDEyMzQ1NgorCisvKiBUaGlzIHNlbWFwaG9yZSBpcyB1c2VkIHRvIGNvb3JkaW5hdGUgdGhlIGNoaWxkIGFuZCBwYXJlbnQgcHJvY2Vzc2VzCisgICBhZnRlciBhIGZvcmsoKSwgYW5kIGJlZm9yZSBhbiBleGVjKCkgYnkgdGhlIGNoaWxkLiAgU2VlCisgICBwYXJlbnRfYXR0YWNoX2FsbCBmb3IgZGV0YWlscy4gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgcGFyZW50X2NoYW5uZWxbMl07ICAvKiBQYXJlbnQgInRhbGtzIiB0byBbMV0sIGNoaWxkICJsaXN0ZW5zIiB0byBbMF0gKi8KKyAgICBpbnQgY2hpbGRfY2hhbm5lbFsyXTsgICAvKiBDaGlsZCAidGFsa3MiIHRvIFsxXSwgcGFyZW50ICJsaXN0ZW5zIiB0byBbMF0gKi8KK30gc3RhcnR1cF9zZW1hcGhvcmVfdDsKKworI2RlZmluZSBTRU1fVEFMSyAoMSkKKyNkZWZpbmUgU0VNX0xJU1RFTiAoMCkKKworc3RhdGljIHN0YXJ0dXBfc2VtYXBob3JlX3QgIHN0YXJ0dXBfc2VtYXBob3JlOworCitleHRlcm4gaW50IHBhcmVudF9hdHRhY2hfYWxsIFBBUkFNUyAoKGludCwgUFRSQUNFX0FSRzNfVFlQRSwgaW50KSk7CisKKyNpZmRlZiBQVF9TRVRUUkMKKy8qIFRoaXMgZnVuY3Rpb24gY2F1c2VzIHRoZSBjYWxsZXIncyBwcm9jZXNzIHRvIGJlIHRyYWNlZCBieSBpdHMKKyAgIHBhcmVudC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGFmdGVyIEdEQiBmb3JrcyBpdHNlbGYsCisgICBhbmQgYmVmb3JlIHRoZSBjaGlsZCBleGVjcyB0aGUgdGFyZ2V0LgorCisgICBOb3RlIHRoYXQgSFAtVVggcHRyYWNlIGlzIHJhdGhlciBmdW5reSBpbiBob3cgdGhpcyBpcyBkb25lLgorICAgSWYgdGhlIHBhcmVudCB3YW50cyB0byBnZXQgdGhlIGluaXRpYWwgZXhlYyBldmVudCBvZiBhIGNoaWxkLAorICAgaXQgbXVzdCBzZXQgdGhlIHB0cmFjZSBldmVudCBtYXNrIG9mIHRoZSBjaGlsZCB0byBpbmNsdWRlIGV4ZWNzLgorICAgKFRoZSBjaGlsZCBjYW5ub3QgZG8gdGhpcyBpdHNlbGYuKSAgVGhpcyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlCisgICBjaGlsZCBpcyBmb3JrZWQsIGJ1dCBiZWZvcmUgaXQgZXhlY3MuCisKKyAgIFRvIGNvb3JkaW5hdGUgdGhlIHBhcmVudCBhbmQgY2hpbGQsIHdlIGltcGxlbWVudCBhIHNlbWFwaG9yZSB1c2luZworICAgcGlwZXMuICBBZnRlciBTRVRUUkMnaW5nIGl0c2VsZiwgdGhlIGNoaWxkIHRlbGxzIHRoZSBwYXJlbnQgdGhhdAorICAgaXQgaXMgbm93IHRyYWNlYWJsZSBieSB0aGUgcGFyZW50LCBhbmQgd2FpdHMgZm9yIHRoZSBwYXJlbnQncworICAgYWNrbm93bGVkZ2VtZW50LiAgVGhlIHBhcmVudCBjYW4gdGhlbiBzZXQgdGhlIGNoaWxkJ3MgZXZlbnQgbWFzaywKKyAgIGFuZCBub3RpZnkgdGhlIGNoaWxkIHRoYXQgaXQgY2FuIG5vdyBleGVjLgorCisgICAoVGhlIGFja25vd2xlZGdlbWVudCBieSBwYXJlbnQgaGFwcGVucyBhcyBhIHJlc3VsdCBvZiBhIGNhbGwgdG8KKyAgIGNoaWxkX2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IuKSAgKi8KKworaW50CitwYXJlbnRfYXR0YWNoX2FsbCAocGlkLCBhZGRyLCBkYXRhKQorICAgICBpbnQgcGlkOworICAgICBQVFJBQ0VfQVJHM19UWVBFIGFkZHI7CisgICAgIGludCBkYXRhOworeworICBpbnQgcHRfc3RhdHVzID0gMDsKKworICAvKiBXZSBuZWVkIGEgbWVtb3J5IGhvbWUgZm9yIGEgY29uc3RhbnQuICAqLworICBpbnQgdGNfbWFnaWNfY2hpbGQgPSBQVF9WRVJTSU9OOworICBpbnQgdGNfbWFnaWNfcGFyZW50ID0gMDsKKworICAvKiBUaGUgcmVtYWluZGVyIG9mIHRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VmdWwgZm9yIEhQVVggMTAuMCBhbmQKKyAgICAgbGF0ZXIsIGFzIGl0IGRlcGVuZHMgdXBvbiB0aGUgYWJpbGl0eSB0byByZXF1ZXN0IG5vdGlmaWNhdGlvbgorICAgICBvZiBzcGVjaWZpYyBraW5kcyBvZiBldmVudHMgYnkgdGhlIGtlcm5lbC4gICovCisjaWYgZGVmaW5lZChQVF9TRVRfRVZFTlRfTUFTSykKKworICAvKiBOb3RpZnkgdGhlIHBhcmVudCB0aGF0IHdlJ3JlIHBvdGVudGlhbGx5IHJlYWR5IHRvIGV4ZWMoKS4gKi8KKyAgd3JpdGUgKHN0YXJ0dXBfc2VtYXBob3JlLmNoaWxkX2NoYW5uZWxbU0VNX1RBTEtdLAorICAgICAgICAgJnRjX21hZ2ljX2NoaWxkLAorICAgICAgICAgc2l6ZW9mICh0Y19tYWdpY19jaGlsZCkpOworCisgIC8qIFdhaXQgZm9yIGFja25vd2xlZGdlbWVudCBmcm9tIHRoZSBwYXJlbnQuICovCisgIHJlYWQgKHN0YXJ0dXBfc2VtYXBob3JlLnBhcmVudF9jaGFubmVsW1NFTV9MSVNURU5dLAorICAgICAgICAmdGNfbWFnaWNfcGFyZW50LAorICAgICAgICBzaXplb2YgKHRjX21hZ2ljX3BhcmVudCkpOworICBpZiAodGNfbWFnaWNfY2hpbGQgIT0gdGNfbWFnaWNfcGFyZW50KQorICAgICAgd2FybmluZyAoIm1pc21hdGNoZWQgc2VtYXBob3JlIG1hZ2ljIik7CisKKyAgLyogRGlzY2FyZCBvdXIgY29weSBvZiB0aGUgc2VtYXBob3JlLiAqLworICAodm9pZCkgY2xvc2UgKHN0YXJ0dXBfc2VtYXBob3JlLnBhcmVudF9jaGFubmVsW1NFTV9MSVNURU5dKTsKKyAgKHZvaWQpIGNsb3NlIChzdGFydHVwX3NlbWFwaG9yZS5wYXJlbnRfY2hhbm5lbFtTRU1fVEFMS10pOworICAodm9pZCkgY2xvc2UgKHN0YXJ0dXBfc2VtYXBob3JlLmNoaWxkX2NoYW5uZWxbU0VNX0xJU1RFTl0pOworICAodm9pZCkgY2xvc2UgKHN0YXJ0dXBfc2VtYXBob3JlLmNoaWxkX2NoYW5uZWxbU0VNX1RBTEtdKTsKKyNlbmRpZgorICAKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50CitocHBhX3JlcXVpcmVfYXR0YWNoIChwaWQpCisgICAgIGludCBwaWQ7Cit7CisgIGludCBwdF9zdGF0dXM7CisgIENPUkVfQUREUiAgcGM7CisgIENPUkVfQUREUiAgcGNfYWRkcjsKKyAgdW5zaWduZWQgaW50IHJlZ3Nfb2Zmc2V0OworCisgIC8qIEFyZSB3ZSBhbHJlYWR5IGF0dGFjaGVkPyAgVGhlcmUgYXBwZWFycyB0byBiZSBubyBleHBsaWNpdCB3YXkgdG8KKyAgICAgYW5zd2VyIHRoaXMgdmlhIHB0cmFjZSwgc28gd2UgdHJ5IHNvbWV0aGluZyB3aGljaCBzaG91bGQgYmUKKyAgICAgaW5ub2N1b3VzIGlmIHdlIGFyZSBhdHRhY2hlZC4gIElmIHRoYXQgZmFpbHMsIHRoZW4gd2UgYXNzdW1lCisgICAgIHdlJ3JlIG5vdCBhdHRhY2hlZCwgYW5kIHNvIGF0dGVtcHQgdG8gbWFrZSBpdCBzby4gKi8KKworICBlcnJubyA9IDA7CisgIHJlZ3Nfb2Zmc2V0ID0gVV9SRUdTX09GRlNFVDsKKyAgcGNfYWRkciA9IHJlZ2lzdGVyX2FkZHIgKFBDX1JFR05VTSwgcmVnc19vZmZzZXQpOworICBwYyA9IGNhbGxfcHRyYWNlIChQVF9SRUFEX1UsIHBpZCwgKFBUUkFDRV9BUkczX1RZUEUpIHBjX2FkZHIsIDApOworCisgIGlmIChlcnJubykKKyAgICB7CisgICAgICBlcnJubyA9IDA7CisgICAgICBwdF9zdGF0dXMgPSBjYWxsX3B0cmFjZSAoUFRfQVRUQUNILCBwaWQsIChQVFJBQ0VfQVJHM19UWVBFKSAwLCAwKTsKKworICAgICAgaWYgKGVycm5vKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgIC8qIE5vdyB3ZSByZWFsbHkgYXJlIGF0dGFjaGVkLiAqLworICAgICAgZXJybm8gPSAwOworICAgIH0KKyAgYXR0YWNoX2ZsYWcgPSAxOworICByZXR1cm4gcGlkOworfQorCitpbnQKK2hwcGFfcmVxdWlyZV9kZXRhY2ggKHBpZCwgc2lnbmFsKQorICBpbnQgcGlkOworICBpbnQgc2lnbmFsOworeworICBlcnJubyA9IDA7CisgIGNhbGxfcHRyYWNlIChQVF9ERVRBQ0gsIHBpZCwgKFBUUkFDRV9BUkczX1RZUEUpIDEsIHNpZ25hbCk7CisgIGVycm5vID0gMDsgIC8qIElnbm9yZSBhbnkgZXJyb3JzLiAqLworICByZXR1cm4gcGlkOworfQorCisvKiBTaW5jZSBwdHJhY2UgZG9lc24ndCBzdXBwb3J0IG1lbW9yeSBwYWdlLXByb3RlY3Rpb24gZXZlbnRzLCB3aGljaAorICAgYXJlIHVzZWQgdG8gaW1wbGVtZW50ICJoYXJkd2FyZSIgd2F0Y2hwb2ludHMgb24gSFAtVVgsIHRoZXNlIGFyZQorICAgZHVtbXkgdmVyc2lvbnMsIHdoaWNoIHBlcmZvcm0gbm8gdXNlZnVsIHdvcmsuICAqLworCit2b2lkCitocHBhX2VuYWJsZV9wYWdlX3Byb3RlY3Rpb25fZXZlbnRzIChwaWQpCisgICAgIGludCBwaWQ7Cit7Cit9CisKK3ZvaWQKK2hwcGFfZGlzYWJsZV9wYWdlX3Byb3RlY3Rpb25fZXZlbnRzIChwaWQpCisgICAgIGludCBwaWQ7Cit7Cit9CisKK2ludAoraHBwYV9pbnNlcnRfaHdfd2F0Y2hwb2ludCAocGlkLCBzdGFydCwgbGVuLCB0eXBlKQorICAgICBpbnQgcGlkOworICAgICBDT1JFX0FERFIgc3RhcnQ7CisgICAgIExPTkdFU1QgbGVuOworICAgICBpbnQgdHlwZTsKK3sKKyAgZXJyb3IgKCJIYXJkd2FyZSB3YXRjaHBvaW50cyBub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBwbGF0Zm9ybS4iKTsKK30KKworaW50CitocHBhX3JlbW92ZV9od193YXRjaHBvaW50IChwaWQsIHN0YXJ0LCBsZW4sIHR5cGUpCisgICAgIGludCBwaWQ7CisgICAgIENPUkVfQUREUiBzdGFydDsKKyAgICAgTE9OR0VTVCBsZW47CisgICAgIGVudW0gYnB0eXBlIHR5cGU7Cit7CisgIGVycm9yICgiSGFyZHdhcmUgd2F0Y2hwb2ludHMgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0uIik7Cit9CisKK2ludAoraHBwYV9jYW5fdXNlX2h3X3dhdGNocG9pbnQgKHR5cGUsIGNudCwgb3QpCisgICAgIGVudW0gYnB0eXBlIHR5cGU7CisgICAgIGludCBjbnQ7CisgICAgIGVudW0gYnB0eXBlIG90OworeworICByZXR1cm4gMDsKK30KKworaW50CitocHBhX3JhbmdlX3Byb2ZpdGFibGVfZm9yX2h3X3dhdGNocG9pbnQgKHBpZCwgc3RhcnQsIGxlbikKKyAgICAgaW50IHBpZDsKKyAgICAgQ09SRV9BRERSIHN0YXJ0OworICAgICBMT05HRVNUIGxlbjsKK3sKKyAgZXJyb3IgKCJIYXJkd2FyZSB3YXRjaHBvaW50cyBub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBwbGF0Zm9ybS4iKTsKK30KKworY2hhciAqCitocHBhX3BpZF9vcl90aWRfdG9fc3RyIChpZCkKKyAgICAgcGlkX3QgaWQ7Cit7CisgIC8qIEluIHRoZSBwdHJhY2Ugd29ybGQsIHRoZXJlIGFyZSBvbmx5IHByb2Nlc3Nlcy4gKi8KKyAgcmV0dXJuIGhwcGFfcGlkX3RvX3N0ciAoaWQpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGhhcyBubyBtZWFuaW5nIGluIGEgbm9uLXRocmVhZGVkIHdvcmxkLiAgVGh1cywgd2UKKyAgIHJldHVybiAwIChGQUxTRSkuICBTZWUgdGhlIHVzZSBvZiAiaHBwYV9wcmVwYXJlX3RvX3Byb2NlZWQiIGluCisgICBocHBhLXRkZXAuYy4gKi8KKworcGlkX3QKK2hwcGFfc3dpdGNoZWRfdGhyZWFkcyAocGlkKQorICAgICBwaWRfdCBwaWQ7Cit7CisgIHJldHVybiAocGlkX3QpIDA7Cit9CisKK3ZvaWQKK2hwcGFfZW5zdXJlX3Zmb3JraW5nX3BhcmVudF9yZW1haW5zX3N0b3BwZWQgKHBpZCkKKyAgICAgaW50IHBpZDsKK3sKKyAgLyogVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHZmb3JrZWQgcGFyZW50IGlzIHByZXNlbnRseSBzdG9wcGVkLCBhbmQKKyAgICAgdGhhdCB0aGUgdmZvcmtlZCBjaGlsZCBoYXMganVzdCBkZWxpdmVyZWQgaXRzIGZpcnN0IGV4ZWMgZXZlbnQuCisgICAgIENhbGxpbmcga2lsbCgpIHRoaXMgd2F5IHdpbGwgY2F1c2UgdGhlIFNJR1RSQVAgdG8gYmUgZGVsaXZlcmVkIGFzCisgICAgIHNvb24gYXMgdGhlIHBhcmVudCBpcyByZXN1bWVkLCB3aGljaCBoYXBwZW5zIGFzIHNvb24gYXMgdGhlCisgICAgIHZmb3JrZWQgY2hpbGQgaXMgcmVzdW1lZC4gIFNlZSB3YWl0X2Zvcl9pbmZlcmlvciBmb3IgdGhlIHVzZSBvZgorICAgICB0aGlzIGZ1bmN0aW9uLiAgKi8KKyAga2lsbCAocGlkLCBTSUdUUkFQKTsKK30KKworaW50CitocHBhX3Jlc3VtZV9leGVjZF92Zm9ya2luZ19jaGlsZF90b19nZXRfcGFyZW50X3Zmb3JrICgpCit7CisgIHJldHVybiAxOyAgLyogWWVzLCB0aGUgY2hpbGQgbXVzdCBiZSByZXN1bWVkLiAqLworfQorCit2b2lkCityZXF1aXJlX25vdGlmaWNhdGlvbl9vZl9ldmVudHMgKHBpZCkKKyAgaW50IHBpZDsKK3sKKyNpZiBkZWZpbmVkKFBUX1NFVF9FVkVOVF9NQVNLKQorICBpbnQgcHRfc3RhdHVzOworICBwdHJhY2VfZXZlbnRfdCBwdHJhY2VfZXZlbnRzOworCisgIC8qIEluc3RydWN0IHRoZSBrZXJuZWwgYXMgdG8gdGhlIHNldCBvZiBldmVudHMgd2Ugd2lzaCB0byBiZQorICAgICBpbmZvcm1lZCBvZi4gIChUaGlzIHN1cHBvcnQgZG9lcyBub3QgZXhpc3QgYmVmb3JlIEhQVVggMTAuMC4KKyAgICAgV2UnbGwgYXNzdW1lIGlmIFBUX1NFVF9FVkVOVF9NQVNLIGhhcyBub3QgYmVlbiBkZWZpbmVkIGJ5CisgICAgIDxzeXMvcHRyYWNlLmg+LCB0aGVuIHdlJ3JlIGJlaW5nIGJ1aWx0IG9uIHByZS0xMC4wLikKKyAgICAgKi8KKyAgbWVtc2V0ICgmcHRyYWNlX2V2ZW50cywgMCwgc2l6ZW9mIChwdHJhY2VfZXZlbnRzKSk7CisKKyAgLyogTm90ZTogQnkgZGVmYXVsdCwgYWxsIHNpZ25hbHMgYXJlIHZpc2libGUgdG8gdXMuICBJZiB3ZSB3aXNoCisgICAgIHRoZSBrZXJuZWwgdG8ga2VlcCBjZXJ0YWluIHNpZ25hbHMgaGlkZGVuIGZyb20gdXMsIHdlIGRvIGl0CisgICAgIGJ5IGNhbGxpbmcgc2lnZGVsc2V0IChwdHJhY2VfZXZlbnRzLnBlX3NpZ25hbHMsIHNpZ25hbCkgZm9yCisgICAgIGVhY2ggc3VjaCBzaWduYWwgaGVyZSwgYmVmb3JlIGRvaW5nIFBUX1NFVF9FVkVOVF9NQVNLLgorICAgICAqLworICBzaWdlbXB0eXNldCAoJnB0cmFjZV9ldmVudHMucGVfc2lnbmFscyk7CisKKyAgcHRyYWNlX2V2ZW50cy5wZV9zZXRfZXZlbnQgPSAwOworCisgIHB0cmFjZV9ldmVudHMucGVfc2V0X2V2ZW50IHw9IFBUUkFDRV9TSUdOQUw7CisgIHB0cmFjZV9ldmVudHMucGVfc2V0X2V2ZW50IHw9IFBUUkFDRV9FWEVDOworICBwdHJhY2VfZXZlbnRzLnBlX3NldF9ldmVudCB8PSBQVFJBQ0VfRk9SSzsKKyAgcHRyYWNlX2V2ZW50cy5wZV9zZXRfZXZlbnQgfD0gUFRSQUNFX1ZGT1JLOworICAvKiA/P3JlaHJhdWVyOiBBZGQgdGhpcyBvbmUgd2hlbiB3ZSdyZSBwcmVwYXJlZCB0byBjYXRjaCBpdC4uLgorICBwdHJhY2VfZXZlbnRzLnBlX3NldF9ldmVudCB8PSBQVFJBQ0VfRVhJVDsKKyAgKi8KKworICBlcnJubyA9IDA7CisgIHB0X3N0YXR1cyA9IGNhbGxfcHRyYWNlIChQVF9TRVRfRVZFTlRfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgKFBUUkFDRV9BUkczX1RZUEUpICZwdHJhY2VfZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAocHRyYWNlX2V2ZW50cykpOworICBpZiAoZXJybm8pCisgICAgcGVycm9yX3dpdGhfbmFtZSAoInB0cmFjZSIpOworICBpZiAocHRfc3RhdHVzIDwgMCkKKyAgICByZXR1cm47CisjZW5kaWYKK30KKwordm9pZAorcmVxdWlyZV9ub3RpZmljYXRpb25fb2ZfZXhlY19ldmVudHMgKHBpZCkKKyAgaW50IHBpZDsKK3sKKyNpZiBkZWZpbmVkKFBUX1NFVF9FVkVOVF9NQVNLKQorICBpbnQgcHRfc3RhdHVzOworICBwdHJhY2VfZXZlbnRfdCBwdHJhY2VfZXZlbnRzOworCisgIC8qIEluc3RydWN0IHRoZSBrZXJuZWwgYXMgdG8gdGhlIHNldCBvZiBldmVudHMgd2Ugd2lzaCB0byBiZQorICAgICBpbmZvcm1lZCBvZi4gIChUaGlzIHN1cHBvcnQgZG9lcyBub3QgZXhpc3QgYmVmb3JlIEhQVVggMTAuMC4KKyAgICAgV2UnbGwgYXNzdW1lIGlmIFBUX1NFVF9FVkVOVF9NQVNLIGhhcyBub3QgYmVlbiBkZWZpbmVkIGJ5CisgICAgIDxzeXMvcHRyYWNlLmg+LCB0aGVuIHdlJ3JlIGJlaW5nIGJ1aWx0IG9uIHByZS0xMC4wLikKKyAgICAgKi8KKyAgbWVtc2V0ICgmcHRyYWNlX2V2ZW50cywgMCwgc2l6ZW9mIChwdHJhY2VfZXZlbnRzKSk7CisKKyAgLyogTm90ZTogQnkgZGVmYXVsdCwgYWxsIHNpZ25hbHMgYXJlIHZpc2libGUgdG8gdXMuICBJZiB3ZSB3aXNoCisgICAgIHRoZSBrZXJuZWwgdG8ga2VlcCBjZXJ0YWluIHNpZ25hbHMgaGlkZGVuIGZyb20gdXMsIHdlIGRvIGl0CisgICAgIGJ5IGNhbGxpbmcgc2lnZGVsc2V0IChwdHJhY2VfZXZlbnRzLnBlX3NpZ25hbHMsIHNpZ25hbCkgZm9yCisgICAgIGVhY2ggc3VjaCBzaWduYWwgaGVyZSwgYmVmb3JlIGRvaW5nIFBUX1NFVF9FVkVOVF9NQVNLLgorICAgICAqLworICBzaWdlbXB0eXNldCAoJnB0cmFjZV9ldmVudHMucGVfc2lnbmFscyk7CisKKyAgcHRyYWNlX2V2ZW50cy5wZV9zZXRfZXZlbnQgPSAwOworCisgIHB0cmFjZV9ldmVudHMucGVfc2V0X2V2ZW50IHw9IFBUUkFDRV9FWEVDOworICAvKiA/P3JlaHJhdWVyOiBBZGQgdGhpcyBvbmUgd2hlbiB3ZSdyZSBwcmVwYXJlZCB0byBjYXRjaCBpdC4uLgorICBwdHJhY2VfZXZlbnRzLnBlX3NldF9ldmVudCB8PSBQVFJBQ0VfRVhJVDsKKyAgKi8KKworICBlcnJubyA9IDA7CisgIHB0X3N0YXR1cyA9IGNhbGxfcHRyYWNlIChQVF9TRVRfRVZFTlRfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgKFBUUkFDRV9BUkczX1RZUEUpICZwdHJhY2VfZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAocHRyYWNlX2V2ZW50cykpOworICBpZiAoZXJybm8pCisgICAgcGVycm9yX3dpdGhfbmFtZSAoInB0cmFjZSIpOworICBpZiAocHRfc3RhdHVzIDwgMCkKKyAgICByZXR1cm47CisjZW5kaWYKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHBhcmVudCBwcm9jZXNzLCB3aXRoIHBpZCBiZWluZyB0aGUKKyAgIElEIG9mIHRoZSBjaGlsZCBwcm9jZXNzLCBhZnRlciB0aGUgZGVidWdnZXIgaGFzIGZvcmtlZC4gICovCisKK3ZvaWQKK2NoaWxkX2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IgKHBpZCkKKyAgICBpbnQgcGlkOworeworICAvKiBXZSBuZWVkIGEgbWVtb3J5IGhvbWUgZm9yIGEgY29uc3RhbnQuICAqLworICBpbnQgdGNfbWFnaWNfcGFyZW50ID0gUFRfVkVSU0lPTjsKKyAgaW50IHRjX21hZ2ljX2NoaWxkID0gMDsKKworICAvKiBXYWl0IGZvciB0aGUgY2hpbGQgdG8gdGVsbCB1cyB0aGF0IGl0IGhhcyBmb3JrZWQuICovCisgIHJlYWQgKHN0YXJ0dXBfc2VtYXBob3JlLmNoaWxkX2NoYW5uZWxbU0VNX0xJU1RFTl0sCisgICAgICAgICZ0Y19tYWdpY19jaGlsZCwKKyAgICAgICAgc2l6ZW9mKHRjX21hZ2ljX2NoaWxkKSk7CisKKyAgLyogTm90aWZ5IHRoZSBjaGlsZCB0aGF0IGl0IGNhbiBleGVjLgorCisgICAgIEluIHRoZSBpbmZ0dHJhY2UuYyB2YXJpYW50IG9mIHRoaXMgZnVuY3Rpb24sIHdlIHNldCB0aGUgY2hpbGQncworICAgICBldmVudCBtYXNrIGFmdGVyIHRoZSBmb3JrIGJ1dCBiZWZvcmUgdGhlIGV4ZWMuICBJbiB0aGUgcHRyYWNlCisgICAgIHdvcmxkLCBpdCBzZWVtcyB3ZSBjYW4ndCBzZXQgdGhlIGV2ZW50IG1hc2sgdW50aWwgYWZ0ZXIgdGhlIGV4ZWMuICAqLworCisgIHdyaXRlIChzdGFydHVwX3NlbWFwaG9yZS5wYXJlbnRfY2hhbm5lbFtTRU1fVEFMS10sCisgICAgICAgICAmdGNfbWFnaWNfcGFyZW50LAorICAgICAgICAgc2l6ZW9mICh0Y19tYWdpY19wYXJlbnQpKTsKKworICAvKiBXZSdkIGJldHRlciBwYXVzZSBhIGJpdCBiZWZvcmUgdHJ5aW5nIHRvIHNldCB0aGUgZXZlbnQgbWFzaywKKyAgICAgdGhvdWdoLCB0byBlbnN1cmUgdGhhdCB0aGUgZXhlYyBoYXMgaGFwcGVuZWQuICBXZSBkb24ndCB3YW50IHRvCisgICAgIHdhaXQoKSBvbiB0aGUgY2hpbGQsIGJlY2F1c2UgdGhhdCdsbCBzY3JldyB1cCB0aGUgdXBwZXIgbGF5ZXJzCisgICAgIG9mIGdkYidzIGV4ZWN1dGlvbiBjb250cm9sIHRoYXQgZXhwZWN0IHRvIHNlZSB0aGUgZXhlYyBldmVudC4KKworICAgICBBZnRlciBhbiBleGVjLCB0aGUgY2hpbGQgaXMgbm8gbG9uZ2VyIGV4ZWN1dGluZyBnZGIgY29kZS4gIEhlbmNlLAorICAgICB3ZSBjYW4ndCBoYXZlIHlldCBhbm90aGVyIHN5bmNocm9uaXphdGlvbiB2aWEgdGhlIHBpcGVzLiAgV2UnbGwKKyAgICAganVzdCBzbGVlcCBmb3IgYSBzZWNvbmQsIGFuZCBob3BlIHRoYXQncyBlbm91Z2ggZGVsYXkuLi4gICovCisKKyAgc2xlZXAgKDEpOworCisgIC8qIEluc3RydWN0IHRoZSBrZXJuZWwgYXMgdG8gdGhlIHNldCBvZiBldmVudHMgd2Ugd2lzaCB0byBiZQorICAgICBpbmZvcm1lZCBvZi4gICovCisKKyAgcmVxdWlyZV9ub3RpZmljYXRpb25fb2ZfZXhlY19ldmVudHMgKHBpZCk7CisKKyAgLyogRGlzY2FyZCBvdXIgY29weSBvZiB0aGUgc2VtYXBob3JlLiAqLworICAodm9pZCkgY2xvc2UgKHN0YXJ0dXBfc2VtYXBob3JlLnBhcmVudF9jaGFubmVsW1NFTV9MSVNURU5dKTsKKyAgKHZvaWQpIGNsb3NlIChzdGFydHVwX3NlbWFwaG9yZS5wYXJlbnRfY2hhbm5lbFtTRU1fVEFMS10pOworICAodm9pZCkgY2xvc2UgKHN0YXJ0dXBfc2VtYXBob3JlLmNoaWxkX2NoYW5uZWxbU0VNX0xJU1RFTl0pOworICAodm9pZCkgY2xvc2UgKHN0YXJ0dXBfc2VtYXBob3JlLmNoaWxkX2NoYW5uZWxbU0VNX1RBTEtdKTsKK30KKwordm9pZAorY2hpbGRfcG9zdF9zdGFydHVwX2luZmVyaW9yIChwaWQpCisgIGludCBwaWQ7CisKK3sKKyAgcmVxdWlyZV9ub3RpZmljYXRpb25fb2ZfZXZlbnRzIChwaWQpOworfQorCit2b2lkCitjaGlsZF9wb3N0X2F0dGFjaCAocGlkKQorICBpbnQgcGlkOworeworICByZXF1aXJlX25vdGlmaWNhdGlvbl9vZl9ldmVudHMgKHBpZCk7Cit9CisKK2ludAorY2hpbGRfaW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCAocGlkKQorICBpbnQgcGlkOworeworICAvKiBUaGlzIHJlcXVlc3QgaXMgb25seSBhdmFpbGFibGUgb24gSFBVWCAxMC4wIGFuZCBsYXRlci4gICovCisjaWYgIWRlZmluZWQoUFRfU0VUX0VWRU5UX01BU0spCisgIGVycm9yICgiVW5hYmxlIHRvIGNhdGNoIGZvcmtzIHByaW9yIHRvIEhQVVggMTAuMCIpOworI2Vsc2UKKyAgLyogRW5hYmxlIHJlcG9ydGluZyBvZiBmb3JrIGV2ZW50cyBmcm9tIHRoZSBrZXJuZWwuICovCisgIC8qID8/cmVocmF1ZXI6IEZvciB0aGUgbW9tZW50LCB3ZSdyZSBhbHdheXMgZW5hYmxpbmcgdGhlc2UgZXZlbnRzLAorICAgICBhbmQganVzdCBpZ25vcmluZyB0aGVtIGlmIHRoZXJlJ3Mgbm8gY2F0Y2hwb2ludCB0byBjYXRjaCB0aGVtLgorICAgICAqLworICByZXR1cm4gMDsKKyNlbmRpZgorfQorCitpbnQKK2NoaWxkX3JlbW92ZV9mb3JrX2NhdGNocG9pbnQgKHBpZCkKKyAgaW50IHBpZDsKK3sKKyAgLyogVGhpcyByZXF1ZXN0IGlzIG9ubHkgYXZhaWxhYmxlIG9uIEhQVVggMTAuMCBhbmQgbGF0ZXIuICAqLworI2lmICFkZWZpbmVkKFBUX1NFVF9FVkVOVF9NQVNLKQorICBlcnJvciAoIlVuYWJsZSB0byBjYXRjaCBmb3JrcyBwcmlvciB0byBIUFVYIDEwLjAiKTsKKyNlbHNlCisgIC8qIERpc2FibGUgcmVwb3J0aW5nIG9mIGZvcmsgZXZlbnRzIGZyb20gdGhlIGtlcm5lbC4gKi8KKyAgLyogPz9yZWhyYXVlcjogRm9yIHRoZSBtb21lbnQsIHdlJ3JlIGFsd2F5cyBlbmFibGluZyB0aGVzZSBldmVudHMsCisgICAgIGFuZCBqdXN0IGlnbm9yaW5nIHRoZW0gaWYgdGhlcmUncyBubyBjYXRjaHBvaW50IHRvIGNhdGNoIHRoZW0uICAqLworICByZXR1cm4gMDsKKyNlbmRpZgorfQorCitpbnQKK2NoaWxkX2luc2VydF92Zm9ya19jYXRjaHBvaW50IChwaWQpCisgIGludCBwaWQ7Cit7CisgIC8qIFRoaXMgcmVxdWVzdCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBIUFVYIDEwLjAgYW5kIGxhdGVyLiAgKi8KKyNpZiAhZGVmaW5lZChQVF9TRVRfRVZFTlRfTUFTSykKKyAgZXJyb3IgKCJVbmFibGUgdG8gY2F0Y2ggdmZvcmtzIHByaW9yIHRvIEhQVVggMTAuMCIpOworI2Vsc2UKKyAgLyogRW5hYmxlIHJlcG9ydGluZyBvZiB2Zm9yayBldmVudHMgZnJvbSB0aGUga2VybmVsLiAqLworICAvKiA/P3JlaHJhdWVyOiBGb3IgdGhlIG1vbWVudCwgd2UncmUgYWx3YXlzIGVuYWJsaW5nIHRoZXNlIGV2ZW50cywKKyAgICAgYW5kIGp1c3QgaWdub3JpbmcgdGhlbSBpZiB0aGVyZSdzIG5vIGNhdGNocG9pbnQgdG8gY2F0Y2ggdGhlbS4gICovCisgIHJldHVybiAwOworI2VuZGlmCit9CisKK2ludAorY2hpbGRfcmVtb3ZlX3Zmb3JrX2NhdGNocG9pbnQgKHBpZCkKKyAgaW50IHBpZDsKK3sKKyAgLyogVGhpcyByZXF1ZXN0IGlzIG9ubHkgYXZhaWxhYmxlIG9uIEhQVVggMTAuMCBhbmQgbGF0ZXIuICAqLworI2lmICFkZWZpbmVkKFBUX1NFVF9FVkVOVF9NQVNLKQorICBlcnJvciAoIlVuYWJsZSB0byBjYXRjaCB2Zm9ya3MgcHJpb3IgdG8gSFBVWCAxMC4wIik7CisjZWxzZQorICAvKiBEaXNhYmxlIHJlcG9ydGluZyBvZiB2Zm9yayBldmVudHMgZnJvbSB0aGUga2VybmVsLiAqLworICAvKiA/P3JlaHJhdWVyOiBGb3IgdGhlIG1vbWVudCwgd2UncmUgYWx3YXlzIGVuYWJsaW5nIHRoZXNlIGV2ZW50cywKKyAgICAgYW5kIGp1c3QgaWdub3JpbmcgdGhlbSBpZiB0aGVyZSdzIG5vIGNhdGNocG9pbnQgdG8gY2F0Y2ggdGhlbS4gICovCisgIHJldHVybiAwOworI2VuZGlmCit9CisKK2ludAorY2hpbGRfaGFzX2ZvcmtlZCAocGlkLCBjaGlsZHBpZCkKKyAgaW50IHBpZDsKKyAgaW50ICogIGNoaWxkcGlkOworeworICAvKiBUaGlzIHJlcXVlc3QgaXMgb25seSBhdmFpbGFibGUgb24gSFBVWCAxMC4wIGFuZCBsYXRlci4gICovCisjaWYgIWRlZmluZWQoUFRfR0VUX1BST0NFU1NfU1RBVEUpCisgICpjaGlsZHBpZCA9IDA7CisgIHJldHVybiAwOworI2Vsc2UKKyAgaW50IHB0X3N0YXR1czsKKyAgcHRyYWNlX3N0YXRlX3QgIHB0cmFjZV9zdGF0ZTsKKworICBlcnJubyA9IDA7CisgIHB0X3N0YXR1cyA9IGNhbGxfcHRyYWNlIChQVF9HRVRfUFJPQ0VTU19TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgICBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgKFBUUkFDRV9BUkczX1RZUEUpICZwdHJhY2Vfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChwdHJhY2Vfc3RhdGUpKTsKKyAgaWYgKGVycm5vKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJwdHJhY2UiKTsKKyAgaWYgKHB0X3N0YXR1cyA8IDApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHB0cmFjZV9zdGF0ZS5wZV9yZXBvcnRfZXZlbnQgJiBQVFJBQ0VfRk9SSykKKyAgICB7CisgICAgICAqY2hpbGRwaWQgPSBwdHJhY2Vfc3RhdGUucGVfb3RoZXJfcGlkOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIHJldHVybiAwOworI2VuZGlmCit9CisKK2ludAorY2hpbGRfaGFzX3Zmb3JrZWQgKHBpZCwgY2hpbGRwaWQpCisgIGludCBwaWQ7CisgIGludCAqIGNoaWxkcGlkOworeworICAvKiBUaGlzIHJlcXVlc3QgaXMgb25seSBhdmFpbGFibGUgb24gSFBVWCAxMC4wIGFuZCBsYXRlci4gICovCisjaWYgIWRlZmluZWQoUFRfR0VUX1BST0NFU1NfU1RBVEUpCisgICpjaGlsZHBpZCA9IDA7CisgIHJldHVybiAwOworCisjZWxzZQorICBpbnQgcHRfc3RhdHVzOworICBwdHJhY2Vfc3RhdGVfdCAgcHRyYWNlX3N0YXRlOworCisgIGVycm5vID0gMDsKKyAgcHRfc3RhdHVzID0gY2FsbF9wdHJhY2UgKFBUX0dFVF9QUk9DRVNTX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgIHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAoUFRSQUNFX0FSRzNfVFlQRSkgJnB0cmFjZV9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHB0cmFjZV9zdGF0ZSkpOworICBpZiAoZXJybm8pCisgICAgcGVycm9yX3dpdGhfbmFtZSAoInB0cmFjZSIpOworICBpZiAocHRfc3RhdHVzIDwgMCkKKyAgICByZXR1cm4gMDsKKworICBpZiAocHRyYWNlX3N0YXRlLnBlX3JlcG9ydF9ldmVudCAmIFBUUkFDRV9WRk9SSykKKyAgICB7CisgICAgICAqY2hpbGRwaWQgPSBwdHJhY2Vfc3RhdGUucGVfb3RoZXJfcGlkOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIHJldHVybiAwOworI2VuZGlmCit9CisKK2ludAorY2hpbGRfY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjICgpCit7CisgIC8qIHB0cmFjZSBkb2Vzbid0IGFsbG93IHRoaXMuICovCisgIHJldHVybiAwOworfQorCitpbnQKK2NoaWxkX2luc2VydF9leGVjX2NhdGNocG9pbnQgKHBpZCkKKyAgaW50IHBpZDsKK3sKKyAgLyogVGhpcyByZXF1ZXN0IGlzIG9ubHkgYXZhaWxhYmxlIG9uIEhQVVggMTAuMCBhbmQgbGF0ZXIuCisgICAgICovCisjaWYgIWRlZmluZWQoUFRfU0VUX0VWRU5UX01BU0spCisgIGVycm9yICgiVW5hYmxlIHRvIGNhdGNoIGV4ZWNzIHByaW9yIHRvIEhQVVggMTAuMCIpOworCisjZWxzZQorICAvKiBFbmFibGUgcmVwb3J0aW5nIG9mIGV4ZWMgZXZlbnRzIGZyb20gdGhlIGtlcm5lbC4gKi8KKyAgLyogPz9yZWhyYXVlcjogRm9yIHRoZSBtb21lbnQsIHdlJ3JlIGFsd2F5cyBlbmFibGluZyB0aGVzZSBldmVudHMsCisgICAgIGFuZCBqdXN0IGlnbm9yaW5nIHRoZW0gaWYgdGhlcmUncyBubyBjYXRjaHBvaW50IHRvIGNhdGNoIHRoZW0uCisgICAgICovCisgIHJldHVybiAwOworI2VuZGlmCit9CisKK2ludAorY2hpbGRfcmVtb3ZlX2V4ZWNfY2F0Y2hwb2ludCAocGlkKQorICBpbnQgcGlkOworeworICAvKiBUaGlzIHJlcXVlc3QgaXMgb25seSBhdmFpbGFibGUgb24gSFBVWCAxMC4wIGFuZCBsYXRlci4KKyAgICAgKi8KKyNpZiAhZGVmaW5lZChQVF9TRVRfRVZFTlRfTUFTSykKKyAgZXJyb3IgKCJVbmFibGUgdG8gY2F0Y2ggZXhlY3MgcHJpb3IgdG8gSFBVWCAxMC4wIik7CisKKyNlbHNlCisgIC8qIERpc2FibGUgcmVwb3J0aW5nIG9mIGV4ZWMgZXZlbnRzIGZyb20gdGhlIGtlcm5lbC4gKi8KKyAgLyogPz9yZWhyYXVlcjogRm9yIHRoZSBtb21lbnQsIHdlJ3JlIGFsd2F5cyBlbmFibGluZyB0aGVzZSBldmVudHMsCisgICAgIGFuZCBqdXN0IGlnbm9yaW5nIHRoZW0gaWYgdGhlcmUncyBubyBjYXRjaHBvaW50IHRvIGNhdGNoIHRoZW0uCisgICAgICovCisgIHJldHVybiAwOworI2VuZGlmCit9CisKK2ludAorY2hpbGRfaGFzX2V4ZWNkIChwaWQsIGV4ZWNkX3BhdGhuYW1lKQorICBpbnQgcGlkOworICBjaGFyICoqICBleGVjZF9wYXRobmFtZTsKK3sKKworICAvKiBUaGlzIHJlcXVlc3QgaXMgb25seSBhdmFpbGFibGUgb24gSFBVWCAxMC4wIGFuZCBsYXRlci4KKyAgICAgKi8KKyNpZiAhZGVmaW5lZChQVF9HRVRfUFJPQ0VTU19TVEFURSkKKyAgKmV4ZWNkX3BhdGhuYW1lID0gTlVMTDsKKyAgcmV0dXJuIDA7CisKKyNlbHNlCisgIGludCBwdF9zdGF0dXM7CisgIHB0cmFjZV9zdGF0ZV90ICBwdHJhY2Vfc3RhdGU7CisKKyAgZXJybm8gPSAwOworICBwdF9zdGF0dXMgPSBjYWxsX3B0cmFjZSAoUFRfR0VUX1BST0NFU1NfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgcGlkLAorICAgICAgICAgICAgICAgICAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSAmcHRyYWNlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAocHRyYWNlX3N0YXRlKSk7CisgIGlmIChlcnJubykKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgicHRyYWNlIik7CisgIGlmIChwdF9zdGF0dXMgPCAwKQorICAgIHJldHVybiAwOworCisgIGlmIChwdHJhY2Vfc3RhdGUucGVfcmVwb3J0X2V2ZW50ICYgUFRSQUNFX0VYRUMpCisgICAgeworICAgICAgY2hhciAqICBleGVjX2ZpbGUgPSB0YXJnZXRfcGlkX3RvX2V4ZWNfZmlsZSAocGlkKTsKKyAgICAgICpleGVjZF9wYXRobmFtZSA9IHNhdmVzdHJpbmcgKGV4ZWNfZmlsZSwgc3RybGVuIChleGVjX2ZpbGUpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICByZXR1cm4gMDsKKyNlbmRpZgorfQorCitpbnQKK2NoaWxkX3JlcG9ydGVkX2V4ZWNfZXZlbnRzX3Blcl9leGVjX2NhbGwgKCkKK3sKKyAgcmV0dXJuIDI7ICAvKiBwdHJhY2UgcmVwb3J0cyB0aGUgZXZlbnQgdHdpY2UgcGVyIGNhbGwuICovCit9CisKK2ludAorY2hpbGRfaGFzX3N5c2NhbGxfZXZlbnQgKHBpZCwga2luZCwgc3lzY2FsbF9pZCkKKyAgICAgaW50IHBpZDsKKyAgICAgZW51bSB0YXJnZXRfd2FpdGtpbmQgKmtpbmQ7CisgICAgIGludCAqc3lzY2FsbF9pZDsKK3sKKyAgLyogVGhpcyByZXF1ZXN0IGlzIG9ubHkgYXZhaWxhYmxlIG9uIEhQVVggMTAuMzAgYW5kIGxhdGVyLCB2aWEKKyAgICAgdGhlIHR0cmFjZSBpbnRlcmZhY2UuICAqLworCisgICpraW5kID0gVEFSR0VUX1dBSVRLSU5EX1NQVVJJT1VTOworICAqc3lzY2FsbF9pZCA9IC0xOworICByZXR1cm4gMDsKK30KKworY2hhciAqCitjaGlsZF9waWRfdG9fZXhlY19maWxlIChwaWQpCisgICAgaW50IHBpZDsKK3sKKyAgc3RhdGljIGNoYXIgIGV4ZWNfZmlsZV9idWZmZXJbMTAyNF07CisgIGludCBwdF9zdGF0dXM7CisgIENPUkVfQUREUiAgdG9wX29mX3N0YWNrOworICBjaGFyICBmb3VyX2NoYXJzWzRdOworICBpbnQgbmFtZV9pbmRleDsKKyAgaW50IGk7CisgIGludCBzYXZlZF9pbmZlcmlvcl9waWQ7CisgIGJvb2xlYW4gIGRvbmU7CisgIAorI2lmZGVmIFBUX0dFVF9QUk9DRVNTX1BBVEhOQU1FCisgIC8qIEFzIG9mIDEwLnggSFAtVVgsIHRoZXJlJ3MgYW4gZXhwbGljaXQgcmVxdWVzdCB0byBnZXQgdGhlIHBhdGhuYW1lLiAqLworICBwdF9zdGF0dXMgPSBjYWxsX3B0cmFjZSAoUFRfR0VUX1BST0NFU1NfUEFUSE5BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFRSQUNFX0FSRzNfVFlQRSkgZXhlY19maWxlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoZXhlY19maWxlX2J1ZmZlcikgLSAxKTsKKyAgaWYgKHB0X3N0YXR1cyA9PSAwKQorICAgIHJldHVybiBleGVjX2ZpbGVfYnVmZmVyOworI2VuZGlmCisKKyAgLyogSXQgYXBwZWFycyB0aGF0IHRoaXMgcmVxdWVzdCBpcyBicm9rZW4gcHJpb3IgdG8gMTAuMzAuCisgICAgIElmIGl0IGZhaWxzLCB0cnkgYSByZWFsbHksIHRydWx5IGFtYXppbmdseSBncm9zcyBoYWNrCisgICAgIHRoYXQgRERFIHVzZXMsIG9mIHBhd2luZyB0aHJvdWdoIHRoZSBwcm9jZXNzJyBkYXRhCisgICAgIHNlZ21lbnQgdG8gZmluZCB0aGUgcGF0aG5hbWUuICAqLworCisgIHRvcF9vZl9zdGFjayA9IDB4N2IwM2EwMDA7CisgIG5hbWVfaW5kZXggPSAwOworICBkb25lID0gMDsKKworICAvKiBPbiB0aGUgY2hhbmNlIHRoYXQgcGlkICE9IGluZmVyaW9yX3BpZCwgc2V0IGluZmVyaW9yX3BpZAorICAgICB0byBwaWQsIHNvIHRoYXQgKGdycnJyISkgaW1wbGljaXQgdXNlcyBvZiBpbmZlcmlvcl9waWQgZ2V0CisgICAgIHRoZSByaWdodCBpZC4gICovCisKKyAgc2F2ZWRfaW5mZXJpb3JfcGlkID0gaW5mZXJpb3JfcGlkOworICBpbmZlcmlvcl9waWQgPSBwaWQ7CisKKyAgLyogVHJ5IHRvIGdyYWIgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLiAqLworICB3aGlsZSAoISBkb25lKQorICAgIHsKKyAgICAgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkgKHRvcF9vZl9zdGFjaywgZm91cl9jaGFycywgNCkgIT0gMCkKKwl7CisJICBpbmZlcmlvcl9waWQgPSBzYXZlZF9pbmZlcmlvcl9waWQ7CisJICByZXR1cm4gTlVMTDsKKwl9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCXsKKwkgIGV4ZWNfZmlsZV9idWZmZXJbbmFtZV9pbmRleCsrXSA9IGZvdXJfY2hhcnNbaV07CisJICBkb25lID0gKGZvdXJfY2hhcnNbaV0gPT0gJ1wwJyk7CisJICBpZiAoZG9uZSkKKwkgICAgYnJlYWs7CisJfQorICAgICAgdG9wX29mX3N0YWNrICs9IDQ7CisgICAgfQorCisgIGlmIChleGVjX2ZpbGVfYnVmZmVyWzBdID09ICdcMCcpCisgICAgeworICAgICAgaW5mZXJpb3JfcGlkID0gc2F2ZWRfaW5mZXJpb3JfcGlkOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGluZmVyaW9yX3BpZCA9IHNhdmVkX2luZmVyaW9yX3BpZDsKKyAgcmV0dXJuIGV4ZWNfZmlsZV9idWZmZXI7Cit9CisKK3ZvaWQKK3ByZV9mb3JrX2luZmVyaW9yICgpCit7CisgIGludCBzdGF0dXM7CisKKyAgc3RhdHVzID0gcGlwZSAoc3RhcnR1cF9zZW1hcGhvcmUucGFyZW50X2NoYW5uZWwpOworICBpZiAoc3RhdHVzIDwgMCkKKyAgICB7CisgICAgICB3YXJuaW5nICgiZXJyb3IgZ2V0dGluZyBwYXJlbnQgcGlwZSBmb3Igc3RhcnR1cCBzZW1hcGhvcmUiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc3RhdHVzID0gcGlwZSAoc3RhcnR1cF9zZW1hcGhvcmUuY2hpbGRfY2hhbm5lbCk7CisgIGlmIChzdGF0dXMgPCAwKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJlcnJvciBnZXR0aW5nIGNoaWxkIHBpcGUgZm9yIHN0YXJ0dXAgc2VtYXBob3JlIik7CisgICAgICByZXR1cm47CisgICAgfQorfQorCisMCisvKiBDaGVjayB0byBzZWUgaWYgdGhlIGdpdmVuIHRocmVhZCBpcyBhbGl2ZS4KKworICAgVGhpcyBpcyBhIG5vLW9wLCBhcyBwdHJhY2UgZG9lc24ndCBzdXBwb3J0IHRocmVhZHMsIHNvIHdlIGp1c3QKKyAgIHJldHVybiAiVFJVRSIuICAqLworCitpbnQKK2NoaWxkX3RocmVhZF9hbGl2ZSAocGlkKQorICAgICBpbnQgcGlkOworeworICAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvKiAhIEdEQl9OQVRJVkVfSFBVWF8xMSAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2hwcGFtMy1uYXQuYyBiL2dkYi9ocHBhbTMtbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVhNjZiMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9ocHBhbTMtbmF0LmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qIExvdyBsZXZlbCBpbnRlcmZhY2UgdG8gSFA4MDAgcnVubmluZyBtYWNoIDQuMC4KKyAgIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiZmxvYXRmb3JtYXQuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxtYWNoLmg+CisjaW5jbHVkZSA8bWFjaC9tZXNzYWdlLmg+CisjaW5jbHVkZSA8bWFjaC9leGNlcHRpb24uaD4KKyNpbmNsdWRlIDxtYWNoX2Vycm9yLmg+CisKKyNpbmNsdWRlIDx0YXJnZXQuaD4KKworLyoKKyAqIEZldGNoIGluZmVyaW9ycyByZWdpc3RlcnMgZm9yIGdkYi4KKyAqIFJFR05PIHNwZWNpZmllcyB3aGljaCAoYXMgZ2RiIHZpZXdzIGl0KSByZWdpc3RlciwgLTEgZm9yIGFsbC4KKyAqLworCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGtlcm5fcmV0dXJuX3QgcmV0OworICB0aHJlYWRfc3RhdGVfZGF0YV90IHN0YXRlOworICB1bnNpZ25lZCBpbnQgc3RhdGVDbnQgPSBUUkFDRV9GTEFWT1JfU0laRTsKKyAgaW50IGluZGV4OworICAKKyAgaWYgKCEgTUFDSF9QT1JUX1ZBTElEIChjdXJyZW50X3RocmVhZCkpCisgICAgZXJyb3IgKCJmZXRjaCBpbmZlcmlvciByZWdpc3RlcnM6IEludmFsaWQgdGhyZWFkIik7CisKKyAgaWYgKG11c3Rfc3VzcGVuZF90aHJlYWQpCisgICAgc2V0dXBfdGhyZWFkIChjdXJyZW50X3RocmVhZCwgMSk7CisKKyAgcmV0ID0gdGhyZWFkX2dldF9zdGF0ZSAoY3VycmVudF90aHJlYWQsCisJCQkgIFRSQUNFX0ZMQVZPUiwKKwkJCSAgc3RhdGUsCisJCQkgICZzdGF0ZUNudCk7CisKKyAgaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpCisgICAgd2FybmluZyAoImZldGNoX2luZmVyaW9yX3JlZ2lzdGVyczogJXMgIiwKKwkgICAgIG1hY2hfZXJyb3Jfc3RyaW5nIChyZXQpKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9SRUdTOyBpbmRleCsrKSAKKwlzdXBwbHlfcmVnaXN0ZXIgKGluZGV4LCh2b2lkKikmc3RhdGVbaW5kZXhdKTsKKyAgICB9CisKKyAgaWYgKG11c3Rfc3VzcGVuZF90aHJlYWQpCisgICAgc2V0dXBfdGhyZWFkIChjdXJyZW50X3RocmVhZCwgMCk7Cit9CisMCisvKiBTdG9yZSBvdXIgcmVnaXN0ZXIgdmFsdWVzIGJhY2sgaW50byB0aGUgaW5mZXJpb3IuCisgKiBJZiBSRUdOTyBpcyAtMSwgZG8gdGhpcyBmb3IgYWxsIHJlZ2lzdGVycy4KKyAqIE90aGVyd2lzZSwgUkVHTk8gc3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVyCisgKgorICogT24gbWFjaDMgYWxsIHJlZ2lzdGVycyBhcmUgYWx3YXlzIHNhdmVkIGluIG9uZSBjYWxsLgorICovCit2b2lkCitzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGtlcm5fcmV0dXJuX3QgcmV0OworICB0aHJlYWRfc3RhdGVfZGF0YV90IHN0YXRlOworICB1bnNpZ25lZCBpbnQgc3RhdGVDbnQgPSBUUkFDRV9GTEFWT1JfU0laRTsKKyAgcmVnaXN0ZXIgaW50IGluZGV4OworCisgIGlmICghIE1BQ0hfUE9SVF9WQUxJRCAoY3VycmVudF90aHJlYWQpKQorICAgIGVycm9yICgic3RvcmUgaW5mZXJpb3IgcmVnaXN0ZXJzOiBJbnZhbGlkIHRocmVhZCIpOworCisgIGlmIChtdXN0X3N1c3BlbmRfdGhyZWFkKQorICAgIHNldHVwX3RocmVhZCAoY3VycmVudF90aHJlYWQsIDEpOworCisgIC8qIEZldGNoIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCB0aHJlYWQgKi8KKyAgcmV0ID0gdGhyZWFkX2dldF9zdGF0ZSAoY3VycmVudF90aHJlYWQsCisJCQkgIFRSQUNFX0ZMQVZPUiwKKwkJCSAgc3RhdGUsCisJCQkgICZzdGF0ZUNudCk7CisKKyAgIGlmIChyZXQgIT0gS0VSTl9TVUNDRVNTKSAKKyAgICB7CisgICAgICB3YXJuaW5nICgic3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChnZXQpOiAlcyIsCisJICAgICAgIG1hY2hfZXJyb3Jfc3RyaW5nIChyZXQpKTsKKyAgICAgIGlmIChtdXN0X3N1c3BlbmRfdGhyZWFkKQorCXNldHVwX3RocmVhZCAoY3VycmVudF90aHJlYWQsIDApOworICAgICAgcmV0dXJuOworICAgIH0KKworCisgIC8qIG1vdmUgZ2RiJ3MgcmVnaXN0ZXJzIHRvIHRocmVhZCdzIHN0YXRlCisgICAqCisgICAqIFNpbmNlIHdlIHNhdmUgYWxsIHJlZ2lzdGVycyBhbnl3YXksIHNhdmUgdGhlIG9uZXMKKyAgICogdGhhdCBnZGIgdGhpbmtzIGFyZSB2YWxpZCAoZS5nLiBpZ25vcmUgdGhlIHJlZ25vCisgICAqIHBhcmFtZXRlcikKKyAgICovCisgIGlmIChyZWdubyA+IDAgJiYgcmVnbm8gPCBOVU1fUkVHUyApIAorICAgIHsKKyAgICAgIG1lbWNweSgmc3RhdGVbcmVnbm9dLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ25vKV0sIAorCSAgICAgUkVHSVNURVJfUkFXX1NJWkUocmVnbm8pKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fUkVHUzsgaW5kZXgrKykgCisJbWVtY3B5KCZzdGF0ZVtpbmRleF0sICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoaW5kZXgpXSwgCisJICAgICAgIFJFR0lTVEVSX1JBV19TSVpFKGluZGV4KSk7CisvKiAJc3RhdGVbaW5kZXhdID0gcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKGluZGV4KV07Ki8KKworICAgIH0KKyAgCisgIC8qIFdyaXRlIGdkYidzIGN1cnJlbnQgdmlldyBvZiByZWdpc3RlciB0byB0aGUgdGhyZWFkCisgICAqLworICByZXQgPSB0aHJlYWRfc2V0X3N0YXRlIChjdXJyZW50X3RocmVhZCwKKwkJCSAgVFJBQ0VfRkxBVk9SLAorCQkJICBzdGF0ZSwKKwkJCSAgVFJBQ0VfRkxBVk9SX1NJWkUpOworICAKKyAgaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpCisgICAgd2FybmluZyAoInN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAoc2V0KTogJXMiLAorCSAgICAgbWFjaF9lcnJvcl9zdHJpbmcgKHJldCkpOworCisgIGlmIChtdXN0X3N1c3BlbmRfdGhyZWFkKQorICAgIHNldHVwX3RocmVhZCAoY3VycmVudF90aHJlYWQsIDApOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2hwcmVhZC5jIGIvZ2RiL2hwcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNDY0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvaHByZWFkLmMKQEAgLTAsMCArMSwyMDUwIEBACisvKiBSZWFkIGhwIGRlYnVnIHN5bWJvbHMgYW5kIGNvbnZlcnQgdG8gaW50ZXJuYWwgZm9ybWF0LCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5OTMsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisgICBXcml0dGVuIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaAorICAgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSAiaHAtc3ltdGFiLmgiCisjaW5jbHVkZSAic3ltcy5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIKKyNpbmNsdWRlICJvYmpmaWxlcy5oIgorI2luY2x1ZGUgImJ1aWxkc3ltLmgiCisjaW5jbHVkZSAiY29tcGxhaW50cy5oIgorI2luY2x1ZGUgImdkYi1zdGFicy5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAiZGVtYW5nbGUuaCIKKworLyogUHJpdmF0ZSBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byBhbiBvYmpmaWxlIHdoaWNoIHdlIHVzZSB0byBmaW5kCisgICBhbmQgaW50ZXJuYWxpemUgdGhlIEhQIEMgZGVidWcgc3ltYm9scyB3aXRoaW4gdGhhdCBvYmpmaWxlLiAgKi8KKworc3RydWN0IGhwcmVhZF9zeW1maWxlX2luZm8KK3sKKyAgLyogVGhlIGNvbnRlbnRzIG9mIGVhY2ggb2YgdGhlIGRlYnVnIHNlY3Rpb25zICh0aGVyZSBhcmUgNCBvZiB0aGVtKS4gICovCisgIGNoYXIgKmdudHQ7CisgIGNoYXIgKmxudHQ7CisgIGNoYXIgKnNsdDsKKyAgY2hhciAqdnQ7CisKKyAgLyogV2Uga2VlcCB0aGUgc2l6ZSBvZiB0aGUgJFZUJCBzZWN0aW9uIGZvciByYW5nZSBjaGVja2luZy4gICovCisgIHVuc2lnbmVkIGludCB2dF9zaXplOworCisgIC8qIFNvbWUgcm91dGluZXMgc3RpbGwgbmVlZCB0byBrbm93IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiB0aGUKKyAgICAgbWFpbiBkZWJ1ZyBzZWN0aW9ucyAoJExOVFQkIGFuZCAkR05UVCQpLiAqLworICB1bnNpZ25lZCBpbnQgbG50dF9zeW1jb3VudDsKKyAgdW5zaWduZWQgaW50IGdudHRfc3ltY291bnQ7CisKKyAgLyogVG8ga2VlcCB0cmFjayBvZiBhbGwgdGhlIHR5cGVzIHdlJ3ZlIHByb2Nlc3NlZC4gICovCisgIHN0cnVjdCB0eXBlICoqdHlwZV92ZWN0b3I7CisgIGludCB0eXBlX3ZlY3Rvcl9sZW5ndGg7CisKKyAgLyogS2VlcHMgdHJhY2sgb2YgdGhlIGJlZ2lubmluZyBvZiBhIHJhbmdlIG9mIHNvdXJjZSBsaW5lcy4gICovCisgIHNsdHBvaW50ZXIgc2xfaW5kZXg7CisKKyAgLyogU29tZSBzdGF0ZSB2YXJpYWJsZXMgd2UnbGwgbmVlZC4gICovCisgIGludCB3aXRoaW5fZnVuY3Rpb247CisKKyAgLyogS2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBmdW5jdGlvbidzIGFkZHJlc3MuICBXZSBtYXkgbmVlZCB0byBsb29rCisgICAgIHVwIHNvbWV0aGluZyBiYXNlZCBvbiB0aGlzIGFkZHJlc3MuICAqLworICB1bnNpZ25lZCBpbnQgY3VycmVudF9mdW5jdGlvbl92YWx1ZTsKK307CisKKy8qIEFjY2Vzc29yIG1hY3JvcyB0byBnZXQgYXQgdGhlIGZpZWxkcy4gICovCisjZGVmaW5lIEhQVVhfU1lNRklMRV9JTkZPKG8pIFwKKyAgKChzdHJ1Y3QgaHByZWFkX3N5bWZpbGVfaW5mbyAqKSgobyktPnN5bV9wcml2YXRlKSkKKyNkZWZpbmUgR05UVChvKSAgICAgICAgICAgICAgICAgKEhQVVhfU1lNRklMRV9JTkZPKG8pLT5nbnR0KQorI2RlZmluZSBMTlRUKG8pICAgICAgICAgICAgICAgICAoSFBVWF9TWU1GSUxFX0lORk8obyktPmxudHQpCisjZGVmaW5lIFNMVChvKSAgICAgICAgICAgICAgICAgIChIUFVYX1NZTUZJTEVfSU5GTyhvKS0+c2x0KQorI2RlZmluZSBWVChvKSAgICAgICAgICAgICAgICAgICAoSFBVWF9TWU1GSUxFX0lORk8obyktPnZ0KQorI2RlZmluZSBWVF9TSVpFKG8pICAgICAgICAgICAgICAoSFBVWF9TWU1GSUxFX0lORk8obyktPnZ0X3NpemUpCisjZGVmaW5lIExOVFRfU1lNQ09VTlQobykgICAgICAgIChIUFVYX1NZTUZJTEVfSU5GTyhvKS0+bG50dF9zeW1jb3VudCkKKyNkZWZpbmUgR05UVF9TWU1DT1VOVChvKSAgICAgICAgKEhQVVhfU1lNRklMRV9JTkZPKG8pLT5nbnR0X3N5bWNvdW50KQorI2RlZmluZSBUWVBFX1ZFQ1RPUihvKSAgICAgICAgICAoSFBVWF9TWU1GSUxFX0lORk8obyktPnR5cGVfdmVjdG9yKQorI2RlZmluZSBUWVBFX1ZFQ1RPUl9MRU5HVEgobykgICAoSFBVWF9TWU1GSUxFX0lORk8obyktPnR5cGVfdmVjdG9yX2xlbmd0aCkKKyNkZWZpbmUgU0xfSU5ERVgobykgICAgICAgICAgICAgKEhQVVhfU1lNRklMRV9JTkZPKG8pLT5zbF9pbmRleCkKKyNkZWZpbmUgV0lUSElOX0ZVTkNUSU9OKG8pICAgICAgKEhQVVhfU1lNRklMRV9JTkZPKG8pLT53aXRoaW5fZnVuY3Rpb24pCisjZGVmaW5lIENVUlJFTlRfRlVOQ1RJT05fVkFMVUUobykgKEhQVVhfU1lNRklMRV9JTkZPKG8pLT5jdXJyZW50X2Z1bmN0aW9uX3ZhbHVlKQorCisvKiBHaXZlbiB0aGUgbmF0aXZlIGRlYnVnIHN5bWJvbCBTWU0sIHNldCBOQU1FUCB0byB0aGUgbmFtZSBhc3NvY2lhdGVkCisgICB3aXRoIHRoZSBkZWJ1ZyBzeW1ib2wuICBOb3RlIHdlIG1heSBiZSBjYWxsZWQgd2l0aCBhIGRlYnVnIHN5bWJvbCB3aGljaAorICAgaGFzIG5vIGFzc29jaWF0ZWQgbmFtZSwgaW4gdGhhdCBjYXNlIHdlIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCisKKyAgIEFsc28gbm90ZSB3ZSAia25vdyIgdGhhdCB0aGUgbmFtZSBmb3IgYW55IHN5bWJvbCBpcyBhbHdheXMgaW4gdGhlCisgICBzYW1lIHBsYWNlLiAgSGVuY2Ugd2UgZG9uJ3QgaGF2ZSB0byBjb25kaXRpb25hbGl6ZSBvbiB0aGUgc3ltYm9sIHR5cGUuICAqLworI2RlZmluZSBTRVRfTkFNRVNUUklORyhTWU0sIE5BTUVQLCBPQkpGSUxFKSBcCisgIGlmICghIGhwcmVhZF9oYXNfbmFtZSAoKFNZTSktPmRibG9jay5raW5kKSkgXAorICAgICpOQU1FUCA9ICIiOyBcCisgIGVsc2UgaWYgKCgodW5zaWduZWQpKFNZTSktPmRzZmlsZS5uYW1lKSA+PSBWVF9TSVpFIChPQkpGSUxFKSkgXAorICAgIHsgXAorICAgICAgY29tcGxhaW4gKCZzdHJpbmdfdGFibGVfb2Zmc2V0X2NvbXBsYWludCwgKGNoYXIgKikgc3ltbnVtKTsgXAorICAgICAgKk5BTUVQID0gIiI7IFwKKyAgICB9IFwKKyAgZWxzZSBcCisgICAgKk5BTUVQID0gKFNZTSktPmRzZmlsZS5uYW1lICsgVlQgKE9CSkZJTEUpCisMCisvKiBXZSBwdXQgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlIGluIHRoZSByZWFkX3N5bXRhYl9wcml2YXRlIGZpZWxkCisgICBvZiB0aGUgcHN5bXRhYi4gICovCisKK3N0cnVjdCBzeW1sb2MKK3sKKyAgLyogVGhlIG9mZnNldCB3aXRoaW4gdGhlIGZpbGUgc3ltYm9sIHRhYmxlIG9mIGZpcnN0IGxvY2FsIHN5bWJvbCBmb3IKKyAgICAgdGhpcyBmaWxlLiAgKi8KKworICBpbnQgbGRzeW1vZmY7CisKKyAgLyogTGVuZ3RoIChpbiBieXRlcykgb2YgdGhlIHNlY3Rpb24gb2YgdGhlIHN5bWJvbCB0YWJsZSBkZXZvdGVkIHRvCisgICAgIHRoaXMgZmlsZSdzIHN5bWJvbHMgKGFjdHVhbGx5LCB0aGUgc2VjdGlvbiBicmFja2V0ZWQgbWF5IGNvbnRhaW4KKyAgICAgbW9yZSB0aGFuIGp1c3QgdGhpcyBmaWxlJ3Mgc3ltYm9scykuICBJZiBsZHN5bWxlbiBpcyAwLCB0aGUgb25seQorICAgICByZWFzb24gZm9yIHRoaXMgdGhpbmcncyBleGlzdGVuY2UgaXMgdGhlIGRlcGVuZGVuY3kgbGlzdC4KKyAgICAgTm90aGluZyBlbHNlIHdpbGwgaGFwcGVuIHdoZW4gaXQgaXMgcmVhZCBpbi4gICovCisKKyAgaW50IGxkc3ltbGVuOworfTsKKworI2RlZmluZSBMRFNZTU9GRihwKSAoKChzdHJ1Y3Qgc3ltbG9jICopKChwKS0+cmVhZF9zeW10YWJfcHJpdmF0ZSkpLT5sZHN5bW9mZikKKyNkZWZpbmUgTERTWU1MRU4ocCkgKCgoc3RydWN0IHN5bWxvYyAqKSgocCktPnJlYWRfc3ltdGFiX3ByaXZhdGUpKS0+bGRzeW1sZW4pCisjZGVmaW5lIFNZTUxPQyhwKSAoKHN0cnVjdCBzeW1sb2MgKikoKHApLT5yZWFkX3N5bXRhYl9wcml2YXRlKSkKKwwKKy8qIEZJWE1FOiBTaG91bGRuJ3QgdGhpcyBzdHVmZiBiZSBpbiBhIC5oIGZpbGUgc29tZXdoZXJlPyAgKi8KKy8qIE5vbnplcm8gbWVhbnMgZ2l2ZSB2ZXJib3NlIGluZm8gb24gZ2RiIGFjdGlvbi4gICovCitleHRlcm4gaW50IGluZm9fdmVyYm9zZTsKKworLyogQ29tcGxhaW50cyBhYm91dCB0aGUgc3ltYm9scyB3ZSBoYXZlIGVuY291bnRlcmVkLiAgKi8KK2V4dGVybiBzdHJ1Y3QgY29tcGxhaW50IHN0cmluZ190YWJsZV9vZmZzZXRfY29tcGxhaW50OworZXh0ZXJuIHN0cnVjdCBjb21wbGFpbnQgbGJyYWNfdW5tYXRjaGVkX2NvbXBsYWludDsKK2V4dGVybiBzdHJ1Y3QgY29tcGxhaW50IGxicmFjX21pc21hdGNoX2NvbXBsYWludDsKKworDAordm9pZCBocHJlYWRfc3ltZmlsZV9pbml0ICBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitocHJlYWRfcmVhZF9hcnJheV90eXBlIFBBUkFNUyAoKGRudHRwb2ludGVyLCB1bmlvbiBkbnR0ZW50cnkgKiwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKmhwcmVhZF9hbGxvY190eXBlCisgIFBBUkFNUyAoKGRudHRwb2ludGVyLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqKmhwcmVhZF9sb29rdXBfdHlwZQorICBQQVJBTVMgKChkbnR0cG9pbnRlciwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKmhwcmVhZF9yZWFkX2VudW1fdHlwZQorICBQQVJBTVMgKChkbnR0cG9pbnRlciwgdW5pb24gZG50dGVudHJ5ICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICpocHJlYWRfcmVhZF9zZXRfdHlwZQorICBQQVJBTVMgKChkbnR0cG9pbnRlciwgdW5pb24gZG50dGVudHJ5ICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICpocHJlYWRfcmVhZF9zdWJyYW5nZV90eXBlCisgIFBBUkFNUyAoKGRudHRwb2ludGVyLCB1bmlvbiBkbnR0ZW50cnkgKiwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKmhwcmVhZF9yZWFkX3N0cnVjdF90eXBlCisgIFBBUkFNUyAoKGRudHRwb2ludGVyLCB1bmlvbiBkbnR0ZW50cnkgKiwgc3RydWN0IG9iamZpbGUgKikpOworCit2b2lkIGhwcmVhZF9idWlsZF9wc3ltdGFicworICBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICosIGludCkpOworCit2b2lkIGhwcmVhZF9zeW1maWxlX2ZpbmlzaCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKmhwcmVhZF9zdGFydF9wc3ltdGFiCisgIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKiwgY2hhciAqLCBDT1JFX0FERFIsIGludCwKKwkgICBzdHJ1Y3QgcGFydGlhbF9zeW1ib2wgKiosIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKikpOworCitzdGF0aWMgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpocHJlYWRfZW5kX3BzeW10YWIKKyAgUEFSQU1TICgoc3RydWN0IHBhcnRpYWxfc3ltdGFiICosIGNoYXIgKiosIGludCwgaW50LCBDT1JFX0FERFIsCisJICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICoqLCBpbnQpKTsKKworc3RhdGljIHN0cnVjdCBzeW10YWIgKmhwcmVhZF9leHBhbmRfc3ltdGFiCisgIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIGludCwgaW50LCBDT1JFX0FERFIsIGludCwKKwkgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICosIGNoYXIgKikpOworCitzdGF0aWMgdm9pZCBocHJlYWRfcHJvY2Vzc19vbmVfZGVidWdfc3ltYm9sCisgIFBBUkFNUyAoKHVuaW9uIGRudHRlbnRyeSAqLCBjaGFyICosIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKiwKKwkgICBzdHJ1Y3Qgb2JqZmlsZSAqLCBDT1JFX0FERFIsIGludCwgY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHNsdHBvaW50ZXIgaHByZWFkX3JlY29yZF9saW5lcworICBQQVJBTVMgKChzdHJ1Y3Qgc3ViZmlsZSAqLCBzbHRwb2ludGVyLCBzbHRwb2ludGVyLAorCSAgIHN0cnVjdCBvYmpmaWxlICosIENPUkVfQUREUikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKmhwcmVhZF9yZWFkX2Z1bmN0aW9uX3R5cGUKKyAgUEFSQU1TICgoZG50dHBvaW50ZXIsIHVuaW9uIGRudHRlbnRyeSAqLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqIGhwcmVhZF90eXBlX2xvb2t1cAorICBQQVJBTVMgKChkbnR0cG9pbnRlciwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBocHJlYWRfZ2V0X2RlcHRoCisgIFBBUkFNUyAoKHNsdHBvaW50ZXIsIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHByZWFkX2dldF9saW5lCisgIFBBUkFNUyAoKHNsdHBvaW50ZXIsIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIENPUkVfQUREUiBocHJlYWRfZ2V0X2xvY2F0aW9uCisgIFBBUkFNUyAoKHNsdHBvaW50ZXIsIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIGludCBocHJlYWRfdHlwZV90cmFuc2xhdGUgUEFSQU1TICgoZG50dHBvaW50ZXIpKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwcmVhZF9nZXRfdGV4dGxvdyBQQVJBTVMgKChpbnQsIGludCwgc3RydWN0IG9iamZpbGUgKikpOworc3RhdGljIHVuaW9uIGRudHRlbnRyeSAqaHByZWFkX2dldF9nbnR0IFBBUkFNUyAoKGludCwgc3RydWN0IG9iamZpbGUgKikpOworc3RhdGljIHVuaW9uIGRudHRlbnRyeSAqaHByZWFkX2dldF9sbnR0IFBBUkFNUyAoKGludCwgc3RydWN0IG9iamZpbGUgKikpOworc3RhdGljIHVuaW9uIHNsdGVudHJ5ICpocHJlYWRfZ2V0X3NsdCBQQVJBTVMgKChpbnQsIHN0cnVjdCBvYmpmaWxlICopKTsKK3N0YXRpYyB2b2lkIGhwcmVhZF9wc3ltdGFiX3RvX3N5bXRhYiBQQVJBTVMgKChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworc3RhdGljIHZvaWQgaHByZWFkX3BzeW10YWJfdG9fc3ltdGFiXzEgUEFSQU1TICgoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKK3N0YXRpYyBpbnQgaHByZWFkX2hhc19uYW1lIFBBUkFNUyAoKGVudW0gZG50dF9lbnRyeV90eXBlKSk7CisKKwwKKy8qIEluaXRpYWxpemF0aW9uIGZvciByZWFkaW5nIG5hdGl2ZSBIUCBDIGRlYnVnIHN5bWJvbHMgZnJvbSBPQkpGSUxFLgorCisgICBJdCdzIG9ubHkgcHVycG9zZSBpbiBsaWZlIGlzIHRvIHNldCB1cCB0aGUgc3ltYm9sIHJlYWRlcidzIHByaXZhdGUKKyAgIHBlci1vYmpmaWxlIGRhdGEgc3RydWN0dXJlcywgYW5kIHJlYWQgaW4gdGhlIHJhdyBjb250ZW50cyBvZiB0aGUgZGVidWcKKyAgIHNlY3Rpb25zIChhdHRhY2hpbmcgcG9pbnRlcnMgdG8gdGhlIGRlYnVnIGluZm8gaW50byB0aGUgcHJpdmF0ZSBkYXRhCisgICBzdHJ1Y3R1cmVzKS4KKworICAgU2luY2UgQkZEIGRvZXNuJ3Qga25vdyBob3cgdG8gcmVhZCBkZWJ1ZyBzeW1ib2xzIGluIGEgZm9ybWF0LWluZGVwZW5kZW50CisgICB3YXkgKGFuZCBtYXkgbmV2ZXIgZG8gc28uLi4pLCB3ZSBoYXZlIHRvIGRvIGl0IG91cnNlbHZlcy4gIE5vdGUgd2UgbWF5CisgICBiZSBjYWxsZWQgb24gYSBmaWxlIHdpdGhvdXQgbmF0aXZlIEhQIEMgZGVidWdnaW5nIHN5bWJvbHMuCisgICBGSVhNRSwgdGhlcmUgc2hvdWxkIGJlIGEgY2xlYW5lciBwZWVwaG9sZSBpbnRvIHRoZSBCRkQgZW52aXJvbm1lbnQgaGVyZS4gICovCisKK3ZvaWQKK2hwcmVhZF9zeW1maWxlX2luaXQgKG9iamZpbGUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBhc2VjdGlvbiAqdnRfc2VjdGlvbiwgKnNsdF9zZWN0aW9uLCAqbG50dF9zZWN0aW9uLCAqZ250dF9zZWN0aW9uOworCisgIC8qIEFsbG9jYXRlIHN0cnVjdCB0byBrZWVwIHRyYWNrIG9mIHRoZSBzeW1maWxlICovCisgIG9iamZpbGUtPnN5bV9wcml2YXRlID0gKFBUUikKKyAgICB4bW1hbGxvYyAob2JqZmlsZS0+bWQsIHNpemVvZiAoc3RydWN0IGhwcmVhZF9zeW1maWxlX2luZm8pKTsKKyAgbWVtc2V0IChvYmpmaWxlLT5zeW1fcHJpdmF0ZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgaHByZWFkX3N5bWZpbGVfaW5mbykpOworCisgIC8qIFdlIGhhdmVuJ3QgcmVhZCBpbiBhbnkgdHlwZXMgeWV0LiAgKi8KKyAgVFlQRV9WRUNUT1IgKG9iamZpbGUpID0gMDsKKworICAvKiBSZWFkIGluIGRhdGEgZnJvbSB0aGUgJEdOVFQkIHN1YnNwYWNlLiAgKi8KKyAgZ250dF9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG9iamZpbGUtPm9iZmQsICIkR05UVCQiKTsKKyAgaWYgKCFnbnR0X3NlY3Rpb24pCisgICAgcmV0dXJuOworCisgIEdOVFQgKG9iamZpbGUpCisgICAgPSBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssCisJCSAgICAgYmZkX3NlY3Rpb25fc2l6ZSAob2JqZmlsZS0+b2JmZCwgZ250dF9zZWN0aW9uKSk7CisKKyAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChvYmpmaWxlLT5vYmZkLCBnbnR0X3NlY3Rpb24sIEdOVFQgKG9iamZpbGUpLAorCQkJICAgIDAsIGJmZF9zZWN0aW9uX3NpemUgKG9iamZpbGUtPm9iZmQsIGdudHRfc2VjdGlvbikpOworCisgIEdOVFRfU1lNQ09VTlQgKG9iamZpbGUpCisgICAgPSBiZmRfc2VjdGlvbl9zaXplIChvYmpmaWxlLT5vYmZkLCBnbnR0X3NlY3Rpb24pCisJCQkvIHNpemVvZiAoc3RydWN0IGRudHRfdHlwZV9ibG9jayk7CisKKyAgLyogUmVhZCBpbiBkYXRhIGZyb20gdGhlICRMTlRUJCBzdWJzcGFjZS4gICBBbHNvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlcgorICAgICBvZiBMTlRUIHN5bWJvbHMuICAqLworICBsbnR0X3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob2JqZmlsZS0+b2JmZCwgIiRMTlRUJCIpOworICBpZiAoIWxudHRfc2VjdGlvbikKKyAgICByZXR1cm47CisKKyAgTE5UVCAob2JqZmlsZSkKKyAgICA9IG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywKKwkJICAgICBiZmRfc2VjdGlvbl9zaXplIChvYmpmaWxlLT5vYmZkLCBsbnR0X3NlY3Rpb24pKTsKKworICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKG9iamZpbGUtPm9iZmQsIGxudHRfc2VjdGlvbiwgTE5UVCAob2JqZmlsZSksCisJCQkgICAgMCwgYmZkX3NlY3Rpb25fc2l6ZSAob2JqZmlsZS0+b2JmZCwgbG50dF9zZWN0aW9uKSk7CisKKyAgTE5UVF9TWU1DT1VOVCAob2JqZmlsZSkKKyAgICA9IGJmZF9zZWN0aW9uX3NpemUgKG9iamZpbGUtPm9iZmQsIGxudHRfc2VjdGlvbikKKwkJCS8gc2l6ZW9mIChzdHJ1Y3QgZG50dF90eXBlX2Jsb2NrKTsKKworICAvKiBSZWFkIGluIGRhdGEgZnJvbSB0aGUgJFNMVCQgc3Vic3BhY2UuICAkU0xUJCBjb250YWlucyBpbmZvcm1hdGlvbgorICAgICBvbiBzb3VyY2UgbGluZSBudW1iZXJzLiAgKi8KKyAgc2x0X3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob2JqZmlsZS0+b2JmZCwgIiRTTFQkIik7CisgIGlmICghc2x0X3NlY3Rpb24pCisgICAgcmV0dXJuOworCisgIFNMVCAob2JqZmlsZSkgPQorICAgIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywKKwkJICAgYmZkX3NlY3Rpb25fc2l6ZSAob2JqZmlsZS0+b2JmZCwgc2x0X3NlY3Rpb24pKTsKKworICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKG9iamZpbGUtPm9iZmQsIHNsdF9zZWN0aW9uLCBTTFQgKG9iamZpbGUpLAorCQkJICAgIDAsIGJmZF9zZWN0aW9uX3NpemUgKG9iamZpbGUtPm9iZmQsIHNsdF9zZWN0aW9uKSk7CisKKyAgLyogUmVhZCBpbiBkYXRhIGZyb20gdGhlICRWVCQgc3Vic3BhY2UuICAkVlQkIGNvbnRhaW5zIHRoaW5ncyBsaWtlCisgICAgIG5hbWVzIGFuZCBjb25zdGFudHMuICBLZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiB0aGUgVlQuICAqLworICB2dF9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG9iamZpbGUtPm9iZmQsICIkVlQkIik7CisgIGlmICghdnRfc2VjdGlvbikKKyAgICByZXR1cm47CisKKyAgVlRfU0laRSAob2JqZmlsZSkgPSBiZmRfc2VjdGlvbl9zaXplIChvYmpmaWxlLT5vYmZkLCB2dF9zZWN0aW9uKTsKKworICBWVCAob2JqZmlsZSkgPQorICAgIChjaGFyICopIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywKKwkJCSAgICBWVF9TSVpFIChvYmpmaWxlKSk7CisKKyAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChvYmpmaWxlLT5vYmZkLCB2dF9zZWN0aW9uLCBWVCAob2JqZmlsZSksCisJCQkgICAgMCwgVlRfU0laRSAob2JqZmlsZSkpOworfQorCisvKiBTY2FuIGFuZCBidWlsZCBwYXJ0aWFsIHN5bWJvbHMgZm9yIGEgc3ltYm9sIGZpbGUuCisKKyAgIFRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZSAoZWl0aGVyIFNPTSBvciBIUCBhLm91dCkgaGFzIGFscmVhZHkgYmVlbgorICAgcmVhZCBpbjsgYWxsIHdlIG5lZWQgdG8gZG8gaXMgc2V0dXAgcGFydGlhbCBzeW1ib2xzIGJhc2VkIG9uIHRoZQorICAgbmF0aXZlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KKworICAgV2UgYXNzdW1lIGhwcmVhZF9zeW1maWxlX2luaXQgaGFzIGJlZW4gY2FsbGVkIHRvIGluaXRpYWxpemUgdGhlCisgICBzeW1ib2wgcmVhZGVyJ3MgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZXMuCisKKyAgIFNFQ1RJT05fT0ZGU0VUUyBjb250YWlucyBvZmZzZXRzIHJlbGF0aXZlIHRvIHdoaWNoIHRoZSBzeW1ib2xzIGluIHRoZQorICAgdmFyaW91cyBzZWN0aW9ucyBhcmUgKGRlcGVuZGluZyB3aGVyZSB0aGUgc2VjdGlvbnMgd2VyZSBhY3R1YWxseSBsb2FkZWQpLgorICAgTUFJTkxJTkUgaXMgdHJ1ZSBpZiB3ZSBhcmUgcmVhZGluZyB0aGUgbWFpbiBzeW1ib2wKKyAgIHRhYmxlIChhcyBvcHBvc2VkIHRvIGEgc2hhcmVkIGxpYiBvciBkeW5hbWljYWxseSBsb2FkZWQgZmlsZSkuICAqLworCit2b2lkCitocHJlYWRfYnVpbGRfcHN5bXRhYnMgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywgbWFpbmxpbmUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHM7CisgICAgIGludCBtYWlubGluZTsKK3sKKyAgY2hhciAqbmFtZXN0cmluZzsKKyAgaW50IHBhc3RfZmlyc3Rfc291cmNlX2ZpbGUgPSAwOworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworCisgIGludCBocF9zeW1udW0sIHN5bWNvdW50LCBpOworCisgIHVuaW9uIGRudHRlbnRyeSAqZG5fYnVmcDsKKyAgdW5zaWduZWQgbG9uZyB2YWx1OworICBjaGFyICpwOworICBpbnQgdGV4dGhpZ2ggPSAwOworICBpbnQgaGF2ZV9uYW1lID0gMDsKKworICAvKiBDdXJyZW50IHBhcnRpYWwgc3ltdGFiICovCisgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN0OworCisgIC8qIExpc3Qgb2YgY3VycmVudCBwc3ltdGFiJ3MgaW5jbHVkZSBmaWxlcyAqLworICBjaGFyICoqcHN5bXRhYl9pbmNsdWRlX2xpc3Q7CisgIGludCBpbmNsdWRlc19hbGxvY2F0ZWQ7CisgIGludCBpbmNsdWRlc191c2VkOworCisgIC8qIEluZGV4IHdpdGhpbiBjdXJyZW50IHBzeW10YWIgZGVwZW5kZW5jeSBsaXN0ICovCisgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKmRlcGVuZGVuY3lfbGlzdDsKKyAgaW50IGRlcGVuZGVuY2llc191c2VkLCBkZXBlbmRlbmNpZXNfYWxsb2NhdGVkOworCisgIC8qIEp1c3QgaW4gY2FzZSB0aGUgc3RhYnMgcmVhZGVyIGxlZnQgdHVyZHMgbHlpbmcgYXJvdW5kLiAgKi8KKyAgZnJlZV9wZW5kaW5nX2Jsb2NrcyAoKTsKKyAgbWFrZV9jbGVhbnVwIChyZWFsbHlfZnJlZV9wZW5kaW5ncywgMCk7CisKKyAgcHN0ID0gKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSAwOworCisgIC8qIFdlIHNob3VsZG4ndCB1c2UgYWxsb2NhLCBpbnN0ZWFkIHVzZSBtYWxsb2MvZnJlZS4gIERvaW5nIHNvIGF2b2lkcworICAgICBhIG51bWJlciBvZiBwcm9ibGVtcyB3aXRoIGNyb3NzIGNvbXBpbGF0aW9uIGFuZCBjcmVhdGluZyB1c2VsZXNzIGhvbGVzCisgICAgIGluIHRoZSBzdGFjayB3aGVuIHdlIGhhdmUgdG8gYWxsb2NhdGUgbmV3IGVudHJpZXMuICBGSVhNRS4gICovCisKKyAgaW5jbHVkZXNfYWxsb2NhdGVkID0gMzA7CisgIGluY2x1ZGVzX3VzZWQgPSAwOworICBwc3ltdGFiX2luY2x1ZGVfbGlzdCA9IChjaGFyICoqKSBhbGxvY2EgKGluY2x1ZGVzX2FsbG9jYXRlZCAqCisJCQkJCSAgIHNpemVvZiAoY2hhciAqKSk7CisKKyAgZGVwZW5kZW5jaWVzX2FsbG9jYXRlZCA9IDMwOworICBkZXBlbmRlbmNpZXNfdXNlZCA9IDA7CisgIGRlcGVuZGVuY3lfbGlzdCA9CisgICAgKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKikgYWxsb2NhIChkZXBlbmRlbmNpZXNfYWxsb2NhdGVkICoKKwkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworCisgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoZnJlZV9vYmpmaWxlLCBvYmpmaWxlKTsKKworICBsYXN0X3NvdXJjZV9maWxlID0gMDsKKworICAvKiBNYWtlIHR3byBwYXNzZXMsIG9uZSBvZnIgdGhlIEdOVFQgc3ltYm9scywgdGhlIG90aGVyIGZvciB0aGUKKyAgICAgTE5UVCBzeW1ib2xzLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDE7IGkrKykKKyAgICB7CisgICAgICBpbnQgd2l0aGluX2Z1bmN0aW9uID0gMDsKKworICAgICAgaWYgKGkpCisJc3ltY291bnQgPSBHTlRUX1NZTUNPVU5UIChvYmpmaWxlKTsKKyAgICAgIGVsc2UKKwlzeW1jb3VudCA9IExOVFRfU1lNQ09VTlQgKG9iamZpbGUpOworCisgICAgICBmb3IgKGhwX3N5bW51bSA9IDA7IGhwX3N5bW51bSA8IHN5bWNvdW50OyBocF9zeW1udW0rKykKKwl7CisJICBRVUlUOworCSAgaWYgKGkpCisJICAgIGRuX2J1ZnAgPSBocHJlYWRfZ2V0X2dudHQgKGhwX3N5bW51bSwgb2JqZmlsZSk7CisJICBlbHNlCisJICAgIGRuX2J1ZnAgPSBocHJlYWRfZ2V0X2xudHQgKGhwX3N5bW51bSwgb2JqZmlsZSk7CisKKwkgIGlmIChkbl9idWZwLT5kYmxvY2suZXh0ZW5zaW9uKQorCSAgICBjb250aW51ZTsKKworCSAgLyogT25seSBoYW5kbGUgdGhpbmdzIHdoaWNoIGFyZSBuZWNlc3NhcnkgZm9yIG1pbmltYWwgc3ltYm9scy4KKwkgICAgIGV2ZXJ5dGhpbmcgZWxzZSBpcyBpZ25vcmVkLiAgKi8KKwkgIHN3aXRjaCAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQpCisJICAgIHsKKwkgICAgY2FzZSBETlRUX1RZUEVfU1JDRklMRToKKwkgICAgICB7CisJCS8qIEEgc291cmNlIGZpbGUgb2Ygc29tZSBraW5kLiAgTm90ZSB0aGlzIG1heSBzaW1wbHkKKwkJICAgYmUgYW4gaW5jbHVkZWQgZmlsZS4gICovCisJCVNFVF9OQU1FU1RSSU5HIChkbl9idWZwLCAmbmFtZXN0cmluZywgb2JqZmlsZSk7CisKKwkJLyogQ2hlY2sgaWYgdGhpcyBpcyB0aGUgc291cmNlIGZpbGUgd2UgYXJlIGFscmVhZHkgd29ya2luZworCQkgICB3aXRoLiAgKi8KKwkJaWYgKHBzdCAmJiAhc3RyY21wIChuYW1lc3RyaW5nLCBwc3QtPmZpbGVuYW1lKSkKKwkJICBjb250aW51ZTsKKworCQkvKiBDaGVjayBpZiB0aGlzIGlzIGFuIGluY2x1ZGUgZmlsZSwgaWYgc28gY2hlY2sgaWYgd2UgaGF2ZQorCQkgICBhbHJlYWR5IHNlZW4gaXQuICBBZGQgaXQgdG8gdGhlIGluY2x1ZGUgbGlzdCAqLworCQlwID0gc3RycmNociAobmFtZXN0cmluZywgJy4nKTsKKwkJaWYgKCFzdHJjbXAgKHAsICIuaCIpKQorCQkgIHsKKwkJICAgIGludCBqLCBmb3VuZDsKKworCQkgICAgZm91bmQgPSAwOworCQkgICAgZm9yIChqID0gMDsgaiA8IGluY2x1ZGVzX3VzZWQ7IGorKykKKwkJICAgICAgaWYgKCFzdHJjbXAgKG5hbWVzdHJpbmcsIHBzeW10YWJfaW5jbHVkZV9saXN0W2pdKSkKKwkJCXsKKwkJCSAgZm91bmQgPSAxOworCQkJICBicmVhazsKKwkJCX0KKwkJICAgIGlmIChmb3VuZCkKKwkJICAgICAgY29udGludWU7CisKKwkJICAgIC8qIEFkZCBpdCB0byB0aGUgbGlzdCBvZiBpbmNsdWRlcyBzZWVuIHNvIGZhciBhbmQKKwkJICAgICAgIGFsbG9jYXRlIG1vcmUgaW5jbHVkZSBzcGFjZSBpZiBuZWNlc3NhcnkuICAqLworCQkgICAgcHN5bXRhYl9pbmNsdWRlX2xpc3RbaW5jbHVkZXNfdXNlZCsrXSA9IG5hbWVzdHJpbmc7CisJCSAgICBpZiAoaW5jbHVkZXNfdXNlZCA+PSBpbmNsdWRlc19hbGxvY2F0ZWQpCisJCSAgICAgIHsKKwkJCWNoYXIgKipvcmlnID0gcHN5bXRhYl9pbmNsdWRlX2xpc3Q7CisKKwkJCXBzeW10YWJfaW5jbHVkZV9saXN0ID0gKGNoYXIgKiopCisJCQkgIGFsbG9jYSAoKGluY2x1ZGVzX2FsbG9jYXRlZCAqPSAyKSAqCisJCQkJICBzaXplb2YgKGNoYXIgKikpOworCQkJbWVtY3B5ICgoUFRSKSBwc3ltdGFiX2luY2x1ZGVfbGlzdCwgKFBUUikgb3JpZywKKwkJCQlpbmNsdWRlc191c2VkICogc2l6ZW9mIChjaGFyICopKTsKKwkJICAgICAgfQorCQkgICAgY29udGludWU7CisJCSAgfQorCisKKwkJaWYgKHBzdCkKKwkJICB7CisJCSAgICBpZiAoIWhhdmVfbmFtZSkKKwkJICAgICAgeworCQkJcHN0LT5maWxlbmFtZSA9IChjaGFyICopCisJCQkgIG9ic3RhY2tfYWxsb2MgKCZwc3QtPm9iamZpbGUtPnBzeW1ib2xfb2JzdGFjaywKKwkJCQkJIHN0cmxlbiAobmFtZXN0cmluZykgKyAxKTsKKwkJCXN0cmNweSAocHN0LT5maWxlbmFtZSwgbmFtZXN0cmluZyk7CisJCQloYXZlX25hbWUgPSAxOworCQkJY29udGludWU7CisJCSAgICAgIH0KKwkJICAgIGNvbnRpbnVlOworCQkgIH0KKworCQkvKiBUaGlzIGlzIGEgYm9uYWZpZGUgbmV3IHNvdXJjZSBmaWxlLgorCQkgICBFbmQgdGhlIGN1cnJlbnQgcGFydGlhbCBzeW10YWIgYW5kIHN0YXJ0IGEgbmV3IG9uZS4gICovCisKKwkJaWYgKHBzdCAmJiBwYXN0X2ZpcnN0X3NvdXJjZV9maWxlKQorCQkgIHsKKwkJICAgIGhwcmVhZF9lbmRfcHN5bXRhYiAocHN0LCBwc3ltdGFiX2luY2x1ZGVfbGlzdCwKKwkJCQkJaW5jbHVkZXNfdXNlZCwKKwkJCQkJKGhwX3N5bW51bQorCQkJCQkgKiBzaXplb2YgKHN0cnVjdCBkbnR0X3R5cGVfYmxvY2spKSwKKwkJCQkJdGV4dGhpZ2gsCisJCQkJCWRlcGVuZGVuY3lfbGlzdCwgZGVwZW5kZW5jaWVzX3VzZWQpOworCQkgICAgcHN0ID0gKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSAwOworCQkgICAgaW5jbHVkZXNfdXNlZCA9IDA7CisJCSAgICBkZXBlbmRlbmNpZXNfdXNlZCA9IDA7CisJCSAgfQorCQllbHNlCisJCSAgcGFzdF9maXJzdF9zb3VyY2VfZmlsZSA9IDE7CisKKwkJdmFsdSA9IGhwcmVhZF9nZXRfdGV4dGxvdyAoaSwgaHBfc3ltbnVtLCBvYmpmaWxlKTsKKwkJdmFsdSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKTsKKwkJcHN0ID0gaHByZWFkX3N0YXJ0X3BzeW10YWIgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywKKwkJCQkJICAgIG5hbWVzdHJpbmcsIHZhbHUsCisJCQkJCSAgICAoaHBfc3ltbnVtCisJCQkJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBkbnR0X3R5cGVfYmxvY2spKSwKKwkJCQkJICAgIG9iamZpbGUtPmdsb2JhbF9wc3ltYm9scy5uZXh0LAorCQkJCQkgICAgb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLm5leHQpOworCQl0ZXh0aGlnaCA9IHZhbHU7CisJCWhhdmVfbmFtZSA9IDE7CisJCWNvbnRpbnVlOworCSAgICAgIH0KKworCSAgICBjYXNlIEROVFRfVFlQRV9NT0RVTEU6CisJICAgICAgLyogQSBzb3VyY2UgZmlsZS4gIEl0J3Mgc3RpbGwgdW5jbGVhciB0byBtZSB3aGF0IHRoZQorCQkgcmVhbCBkaWZmZXJlbmNlIGJldHdlZW4gYSBETlRUX1RZUEVfU1JDRklMRSBhbmQgRE5UVF9UWVBFX01PRFVMRQorCQkgaXMgc3VwcG9zZWQgdG8gYmUuICAqLworCSAgICAgIFNFVF9OQU1FU1RSSU5HIChkbl9idWZwLCAmbmFtZXN0cmluZywgb2JqZmlsZSk7CisJICAgICAgdmFsdSA9IGhwcmVhZF9nZXRfdGV4dGxvdyAoaSwgaHBfc3ltbnVtLCBvYmpmaWxlKTsKKwkgICAgICB2YWx1ICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOworCSAgICAgIGlmICghcHN0KQorCQl7CisJCSAgcHN0ID0gaHByZWFkX3N0YXJ0X3BzeW10YWIgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywKKwkJCQkJICAgICAgbmFtZXN0cmluZywgdmFsdSwKKwkJCQkJICAgICAgKGhwX3N5bW51bQorCQkJCQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBkbnR0X3R5cGVfYmxvY2spKSwKKwkJCQkJICAgICAgb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLm5leHQsCisJCQkJCSAgICAgIG9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5uZXh0KTsKKwkJICB0ZXh0aGlnaCA9IHZhbHU7CisJCSAgaGF2ZV9uYW1lID0gMDsKKwkJfQorCSAgICAgIGNvbnRpbnVlOworCSAgICBjYXNlIEROVFRfVFlQRV9GVU5DVElPTjoKKwkgICAgY2FzZSBETlRUX1RZUEVfRU5UUlk6CisJICAgICAgLyogVGhlIGJlZ2lubmluZyBvZiBhIGZ1bmN0aW9uLiAgRE5UVF9UWVBFX0VOVFJZIG1heSBhbHNvIGRlbm90ZQorCQkgYSBzZWNvbmRhcnkgZW50cnkgcG9pbnQuICAqLworCSAgICAgIHZhbHUgPSBkbl9idWZwLT5kZnVuYy5oaWFkZHIgKyBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLAorCQkJCQkJICAgICAgIFNFQ1RfT0ZGX1RFWFQpOworCSAgICAgIGlmICh2YWx1ID4gdGV4dGhpZ2gpCisJCXRleHRoaWdoID0gdmFsdTsKKwkgICAgICB2YWx1ID0gZG5fYnVmcC0+ZGZ1bmMubG93YWRkciArCisJCUFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOworCSAgICAgIFNFVF9OQU1FU1RSSU5HIChkbl9idWZwLCAmbmFtZXN0cmluZywgb2JqZmlsZSk7CisJICAgICAgYWRkX3BzeW1ib2xfdG9fbGlzdCAobmFtZXN0cmluZywgc3RybGVuIChuYW1lc3RyaW5nKSwKKwkJCQkgICBWQVJfTkFNRVNQQUNFLCBMT0NfQkxPQ0ssCisJCQkJICAgJm9iamZpbGUtPnN0YXRpY19wc3ltYm9scywgdmFsdSwKKwkJCQkgICAwLCBsYW5ndWFnZV91bmtub3duLCBvYmpmaWxlKTsKKwkgICAgICB3aXRoaW5fZnVuY3Rpb24gPSAxOworCSAgICAgIGNvbnRpbnVlOworCSAgICBjYXNlIEROVFRfVFlQRV9CRUdJTjoKKwkgICAgY2FzZSBETlRUX1RZUEVfRU5EOgorCSAgICAgIC8qIFNjb3BlIGJsb2NrIGJlZ2luL2VuZC4gIFdlIG9ubHkgY2FyZSBhYm91dCBmdW5jdGlvbgorCQkgYW5kIGZpbGUgYmxvY2tzIHJpZ2h0IG5vdy4gICovCisJICAgICAgaWYgKGRuX2J1ZnAtPmRlbmQuZW5ka2luZCA9PSBETlRUX1RZUEVfTU9EVUxFKQorCQl7CisJCSAgaHByZWFkX2VuZF9wc3ltdGFiIChwc3QsIHBzeW10YWJfaW5jbHVkZV9saXN0LCBpbmNsdWRlc191c2VkLAorCQkJCSAgICAgIChocF9zeW1udW0KKwkJCQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBkbnR0X3R5cGVfYmxvY2spKSwKKwkJCQkgICAgICB0ZXh0aGlnaCwKKwkJCQkgICAgICBkZXBlbmRlbmN5X2xpc3QsIGRlcGVuZGVuY2llc191c2VkKTsKKwkJICBwc3QgPSAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopIDA7CisJCSAgaW5jbHVkZXNfdXNlZCA9IDA7CisJCSAgZGVwZW5kZW5jaWVzX3VzZWQgPSAwOworCQkgIGhhdmVfbmFtZSA9IDA7CisJCX0KKwkgICAgICBpZiAoZG5fYnVmcC0+ZGVuZC5lbmRraW5kID09IEROVFRfVFlQRV9GVU5DVElPTikKKwkJd2l0aGluX2Z1bmN0aW9uID0gMDsKKwkgICAgICBjb250aW51ZTsKKwkgICAgY2FzZSBETlRUX1RZUEVfU1ZBUjoKKwkgICAgY2FzZSBETlRUX1RZUEVfRFZBUjoKKwkgICAgY2FzZSBETlRUX1RZUEVfVFlQRURFRjoKKwkgICAgY2FzZSBETlRUX1RZUEVfVEFHREVGOgorCSAgICAgIHsKKwkJLyogVmFyaWFibGVzLCB0eXBlZGVmcyBhbiB0aGUgbGlrZS4gICovCisJCWVudW0gYWRkcmVzc19jbGFzcyBzdG9yYWdlOworCQluYW1lc3BhY2VfZW51bSBuYW1lc3BhY2U7CisKKwkJLyogRG9uJ3QgYWRkIGxvY2FscyB0byB0aGUgcGFydGlhbCBzeW1ib2wgdGFibGUuICAqLworCQlpZiAod2l0aGluX2Z1bmN0aW9uCisJCSAgICAmJiAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX1NWQVIKKwkJCXx8IGRuX2J1ZnAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9EVkFSKSkKKwkJICBjb250aW51ZTsKKworCQkvKiBUQUdERUZzIGdvIGludG8gdGhlIHN0cnVjdHVyZSBuYW1lc3BhY2UuICAqLworCQlpZiAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX1RBR0RFRikKKwkJICBuYW1lc3BhY2UgPSBTVFJVQ1RfTkFNRVNQQUNFOworCQllbHNlCisJCSAgbmFtZXNwYWNlID0gVkFSX05BTUVTUEFDRTsKKworCQkvKiBXaGF0IGtpbmQgb2YgInN0b3JhZ2UiIGRvZXMgdGhpcyB1c2U/ICAqLworCQlpZiAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX1NWQVIpCisJCSAgc3RvcmFnZSA9IExPQ19TVEFUSUM7CisJCWVsc2UgaWYgKGRuX2J1ZnAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9EVkFSCisJCQkgJiYgZG5fYnVmcC0+ZGR2YXIucmVndmFyKQorCQkgIHN0b3JhZ2UgPSBMT0NfUkVHSVNURVI7CisJCWVsc2UgaWYgKGRuX2J1ZnAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9EVkFSKQorCQkgIHN0b3JhZ2UgPSBMT0NfTE9DQUw7CisJCWVsc2UKKwkJICBzdG9yYWdlID0gTE9DX1VOREVGOworCisJCVNFVF9OQU1FU1RSSU5HIChkbl9idWZwLCAmbmFtZXN0cmluZywgb2JqZmlsZSk7CisJCWlmICghcHN0KQorCQkgIHsKKwkJICAgIHBzdCA9IGhwcmVhZF9zdGFydF9wc3ltdGFiIChvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMsCisJCQkJCQkiZ2xvYmFscyIsIDAsCisJCQkJCQkoaHBfc3ltbnVtCisJCQkJCQkgKiBzaXplb2YgKHN0cnVjdCBkbnR0X3R5cGVfYmxvY2spKSwKKwkJCQkJCW9iamZpbGUtPmdsb2JhbF9wc3ltYm9scy5uZXh0LAorCQkJCQkJb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLm5leHQpOworCQkgIH0KKwkJaWYgKGRuX2J1ZnAtPmRzdmFyLmdsb2JhbCkKKwkJICB7CisJCSAgICBhZGRfcHN5bWJvbF90b19saXN0IChuYW1lc3RyaW5nLCBzdHJsZW4gKG5hbWVzdHJpbmcpLAorCQkJCQkgbmFtZXNwYWNlLCBzdG9yYWdlLAorCQkJCQkgJm9iamZpbGUtPmdsb2JhbF9wc3ltYm9scywKKwkJCQkJIGRuX2J1ZnAtPmRzdmFyLmxvY2F0aW9uLAorCQkJCQkgMCwgbGFuZ3VhZ2VfdW5rbm93biwgb2JqZmlsZSk7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgYWRkX3BzeW1ib2xfdG9fbGlzdCAobmFtZXN0cmluZywgc3RybGVuIChuYW1lc3RyaW5nKSwKKwkJCQkJIG5hbWVzcGFjZSwgc3RvcmFnZSwKKwkJCQkJICZvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMsCisJCQkJCSBkbl9idWZwLT5kc3Zhci5sb2NhdGlvbiwKKwkJCQkJIDAsIGxhbmd1YWdlX3Vua25vd24sIG9iamZpbGUpOworCQkgIH0KKwkJY29udGludWU7CisJICAgICAgfQorCSAgICBjYXNlIEROVFRfVFlQRV9NRU1FTlVNOgorCSAgICBjYXNlIEROVFRfVFlQRV9DT05TVDoKKwkgICAgICAvKiBDb25zdGFudHMgYW5kIG1lbWJlcnMgb2YgZW51bWVyYXRlZCB0eXBlcy4gICovCisJICAgICAgU0VUX05BTUVTVFJJTkcgKGRuX2J1ZnAsICZuYW1lc3RyaW5nLCBvYmpmaWxlKTsKKwkgICAgICBpZiAoIXBzdCkKKwkJeworCQkgIHBzdCA9IGhwcmVhZF9zdGFydF9wc3ltdGFiIChvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMsCisJCQkJCSAgICAgICJnbG9iYWxzIiwgMCwKKwkJCQkJICAgICAgKGhwX3N5bW51bSAKKwkJCQkJICAgICAgICogc2l6ZW9mIChzdHJ1Y3QgZG50dF90eXBlX2Jsb2NrKSksCisJCQkJCSAgICAgIG9iamZpbGUtPmdsb2JhbF9wc3ltYm9scy5uZXh0LAorCQkJCQkgICAgICBvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMubmV4dCk7CisJCX0KKwkgICAgICBhZGRfcHN5bWJvbF90b19saXN0IChuYW1lc3RyaW5nLCBzdHJsZW4gKG5hbWVzdHJpbmcpLAorCQkJCSAgIFZBUl9OQU1FU1BBQ0UsIExPQ19DT05TVCwKKwkJCQkgICAmb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLCAwLAorCQkJCSAgIDAsIGxhbmd1YWdlX3Vua25vd24sIG9iamZpbGUpOworCSAgICAgIGNvbnRpbnVlOworCSAgICBkZWZhdWx0OgorCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBFbmQgYW55IHBlbmRpbmcgcGFydGlhbCBzeW1ib2wgdGFibGUuICAqLworICBpZiAocHN0KQorICAgIHsKKyAgICAgIGhwcmVhZF9lbmRfcHN5bXRhYiAocHN0LCBwc3ltdGFiX2luY2x1ZGVfbGlzdCwgaW5jbHVkZXNfdXNlZCwKKwkJCSAgaHBfc3ltbnVtICogc2l6ZW9mIChzdHJ1Y3QgZG50dF90eXBlX2Jsb2NrKSwKKwkJCSAgMCwgZGVwZW5kZW5jeV9saXN0LCBkZXBlbmRlbmNpZXNfdXNlZCk7CisgICAgfQorCisgIGRpc2NhcmRfY2xlYW51cHMgKG9sZF9jaGFpbik7Cit9CisKKy8qIFBlcmZvcm0gYW55IGxvY2FsIGNsZWFudXBzIHJlcXVpcmVkIHdoZW4gd2UgYXJlIGRvbmUgd2l0aCBhIHBhcnRpY3VsYXIKKyAgIG9iamZpbGUuICBJLkUsIHdlIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBkaXNjYXJkaW5nIGFsbCBzeW1ib2wgaW5mb3JtYXRpb24KKyAgIGZvciBhbiBvYmpmaWxlLCBmcmVlaW5nIHVwIGFsbCBtZW1vcnkgaGVsZCBmb3IgaXQsIGFuZCB1bmxpbmtpbmcgdGhlCisgICBvYmpmaWxlIHN0cnVjdCBmcm9tIHRoZSBnbG9iYWwgbGlzdCBvZiBrbm93biBvYmpmaWxlcy4gKi8KKwordm9pZAoraHByZWFkX3N5bWZpbGVfZmluaXNoIChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaWYgKG9iamZpbGUtPnN5bV9wcml2YXRlICE9IE5VTEwpCisgICAgeworICAgICAgbWZyZWUgKG9iamZpbGUtPm1kLCBvYmpmaWxlLT5zeW1fcHJpdmF0ZSk7CisgICAgfQorfQorDAorCisvKiBUaGUgcmVtYWluaW5nIGZ1bmN0aW9ucyBhcmUgYWxsIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gICovCisKKy8qIFZhcmlvdXMgc21hbGwgZnVuY3Rpb25zIHRvIGdldCBlbnRyaWVzIGluIHRoZSBkZWJ1ZyBzeW1ib2wgc2VjdGlvbnMuICAqLworCitzdGF0aWMgdW5pb24gZG50dGVudHJ5ICoKK2hwcmVhZF9nZXRfbG50dCAoaW5kZXgsIG9iamZpbGUpCisgICAgIGludCBpbmRleDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHJldHVybiAodW5pb24gZG50dGVudHJ5ICopCisgICAgJihMTlRUIChvYmpmaWxlKVsoaW5kZXggKiBzaXplb2YgKHN0cnVjdCBkbnR0X3R5cGVfYmxvY2spKV0pOworfQorCitzdGF0aWMgdW5pb24gZG50dGVudHJ5ICoKK2hwcmVhZF9nZXRfZ250dCAoaW5kZXgsIG9iamZpbGUpCisgICAgIGludCBpbmRleDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHJldHVybiAodW5pb24gZG50dGVudHJ5ICopCisgICAgJihHTlRUIChvYmpmaWxlKVsoaW5kZXggKiBzaXplb2YgKHN0cnVjdCBkbnR0X3R5cGVfYmxvY2spKV0pOworfQorCitzdGF0aWMgdW5pb24gc2x0ZW50cnkgKgoraHByZWFkX2dldF9zbHQgKGluZGV4LCBvYmpmaWxlKQorICAgICBpbnQgaW5kZXg7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICByZXR1cm4gKHVuaW9uIHNsdGVudHJ5ICopJihTTFQgKG9iamZpbGUpW2luZGV4ICogc2l6ZW9mICh1bmlvbiBzbHRlbnRyeSldKTsKK30KKworLyogR2V0IHRoZSBsb3cgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggc29tZSBzeW1ib2wgKHR5cGljYWxseSB0aGUgc3RhcnQKKyAgIG9mIGEgcGFydGljdWxhciBzb3VyY2UgZmlsZSBvciBtb2R1bGUpLiAgU2luY2UgdGhhdCBpbmZvcm1hdGlvbiBpcyBub3QKKyAgIHN0b3JlZCBhcyBwYXJ0IG9mIHRoZSBETlRUX1RZUEVfTU9EVUxFIG9yIEROVFRfVFlQRV9TUkNGSUxFIHN5bWJvbCB3ZSBtdXN0IGluZmVyIGl0IGZyb20KKyAgIHRoZSBleGlzdGFuY2Ugb2YgRE5UVF9UWVBFX0ZVTkNUSU9OIHN5bWJvbHMuICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworaHByZWFkX2dldF90ZXh0bG93IChnbG9iYWwsIGluZGV4LCBvYmpmaWxlKQorICAgICBpbnQgZ2xvYmFsOworICAgICBpbnQgaW5kZXg7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICB1bmlvbiBkbnR0ZW50cnkgKmRuX2J1ZnA7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbDsKKworICAvKiBMb29rIGZvciBhIEROVFRfVFlQRV9GVU5DVElPTiBzeW1ib2wuICAqLworICBkbworICAgIHsKKyAgICAgIGlmIChnbG9iYWwpCisJZG5fYnVmcCA9IGhwcmVhZF9nZXRfZ250dCAoaW5kZXgrKywgb2JqZmlsZSk7CisgICAgICBlbHNlCisJZG5fYnVmcCA9IGhwcmVhZF9nZXRfbG50dCAoaW5kZXgrKywgb2JqZmlsZSk7CisgICAgfSB3aGlsZSAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgIT0gRE5UVF9UWVBFX0ZVTkNUSU9OCisJICAgICAmJiBkbl9idWZwLT5kYmxvY2sua2luZCAhPSBETlRUX1RZUEVfRU5EKTsKKworICAvKiBBdm9pZCBnb2luZyBwYXN0IGEgRE5UVF9UWVBFX0VORCB3aGVuIGxvb2tpbmcgZm9yIGEgRE5UVF9UWVBFX0ZVTkNUSU9OLiAgVGhpcworICAgICBtaWdodCBoYXBwZW4gd2hlbiBhIHNvdXJjZWZpbGUgaGFzIG5vIGZ1bmN0aW9ucy4gICovCisgIGlmIChkbl9idWZwLT5kYmxvY2sua2luZCA9PSBETlRUX1RZUEVfRU5EKQorICAgIHJldHVybiAwOworCisgIC8qIFRoZSBtaW5pbWFsIHN5bWJvbHMgYXJlIHR5cGljYWxseSBtb3JlIGFjY3VyYXRlIGZvciBzb21lIHJlYXNvbi4gICovCisgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKGRuX2J1ZnAtPmRmdW5jLm5hbWUgKyBWVCAob2JqZmlsZSksIE5VTEwsCisJCQkJICAgb2JqZmlsZSk7CisgIGlmIChtc3ltYm9sKQorICAgIHJldHVybiBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCk7CisgIGVsc2UKKyAgICByZXR1cm4gZG5fYnVmcC0+ZGZ1bmMubG93YWRkcjsKK30KKworLyogR2V0IHRoZSBuZXN0aW5nIGRlcHRoIGZvciB0aGUgc291cmNlIGxpbmUgaWRlbnRpZmllZCBieSBJTkRFWC4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitocHJlYWRfZ2V0X2RlcHRoIChpbmRleCwgb2JqZmlsZSkKKyAgICAgc2x0cG9pbnRlciBpbmRleDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHVuaW9uIHNsdGVudHJ5ICpzbF9idWZwOworCisgIHNsX2J1ZnAgPSBocHJlYWRfZ2V0X3NsdCAoaW5kZXgsIG9iamZpbGUpOworICByZXR1cm4gc2xfYnVmcC0+c3NwZWMuYmFja3B0ci5kbnR0cC5pbmRleDsKK30KKworLyogR2V0IHRoZSBzb3VyY2UgbGluZSBudW1iZXIgdGhlIHRoZSBsaW5lIGlkZW50aWZpZWQgYnkgSU5ERVguICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworaHByZWFkX2dldF9saW5lIChpbmRleCwgb2JqZmlsZSkKKyAgICAgc2x0cG9pbnRlciBpbmRleDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHVuaW9uIHNsdGVudHJ5ICpzbF9idWZwOworCisgIHNsX2J1ZnAgPSBocHJlYWRfZ2V0X3NsdCAoaW5kZXgsIG9iamZpbGUpOworICByZXR1cm4gc2xfYnVmcC0+c25vcm0ubGluZTsKK30KKworc3RhdGljIENPUkVfQUREUgoraHByZWFkX2dldF9sb2NhdGlvbiAoaW5kZXgsIG9iamZpbGUpCisgICAgIHNsdHBvaW50ZXIgaW5kZXg7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICB1bmlvbiBzbHRlbnRyeSAqc2xfYnVmcDsKKyAgaW50IGk7CisKKyAgLyogY29kZSBsb2NhdGlvbiBvZiBzcGVjaWFsIHNsdGVudHJ5cyBpcyBkZXRlcm1pbmVkIGZyb20gY29udGV4dCAqLworICBzbF9idWZwID0gaHByZWFkX2dldF9zbHQgKGluZGV4LCBvYmpmaWxlKTsKKworICBpZiAoc2xfYnVmcC0+c25vcm0uc2x0ZGVzYyA9PSBTTFRfRU5EKQorICAgIHsKKyAgICAgIC8qIGZpbmQgcHJldmlvdXMgbm9ybWFsIHNsdGVudHJ5IGFuZCBnZXQgYWRkcmVzcyAqLworICAgICAgZm9yIChpID0gMDsgKChzbF9idWZwLT5zbm9ybS5zbHRkZXNjICE9IFNMVF9OT1JNQUwpICYmCisJCSAgIChzbF9idWZwLT5zbm9ybS5zbHRkZXNjICE9IFNMVF9FWElUKSk7IGkrKykKKwlzbF9idWZwID0gaHByZWFkX2dldF9zbHQgKGluZGV4IC0gaSwgb2JqZmlsZSk7CisgICAgICByZXR1cm4gc2xfYnVmcC0+c25vcm0uYWRkcmVzczsKKyAgICB9CisKKyAgLyogZmluZCBuZXh0IG5vcm1hbCBzbHRlbnRyeSBhbmQgZ2V0IGFkZHJlc3MgKi8KKyAgZm9yIChpID0gMDsgKChzbF9idWZwLT5zbm9ybS5zbHRkZXNjICE9IFNMVF9OT1JNQUwpICYmCisJICAgICAgIChzbF9idWZwLT5zbm9ybS5zbHRkZXNjICE9IFNMVF9FWElUKSk7IGkrKykKKyAgICBzbF9idWZwID0gaHByZWFkX2dldF9zbHQgKGluZGV4ICsgaSwgb2JqZmlsZSk7CisgIHJldHVybiBzbF9idWZwLT5zbm9ybS5hZGRyZXNzOworfQorDAorCisvKiBSZXR1cm4gMSBpZiBhbiBIUCBkZWJ1ZyBzeW1ib2wgb2YgdHlwZSBLSU5EIGhhcyBhIG5hbWUgYXNzb2NpYXRlZCB3aXRoCisgICBpdCwgZWxzZSByZXR1cm4gMC4gICovCisKK3N0YXRpYyBpbnQKK2hwcmVhZF9oYXNfbmFtZSAoa2luZCkKKyAgICAgZW51bSBkbnR0X2VudHJ5X3R5cGUga2luZDsKK3sKKyAgc3dpdGNoIChraW5kKQorICAgIHsKKyAgICBjYXNlIEROVFRfVFlQRV9TUkNGSUxFOgorICAgIGNhc2UgRE5UVF9UWVBFX01PRFVMRToKKyAgICBjYXNlIEROVFRfVFlQRV9GVU5DVElPTjoKKyAgICBjYXNlIEROVFRfVFlQRV9FTlRSWToKKyAgICBjYXNlIEROVFRfVFlQRV9JTVBPUlQ6CisgICAgY2FzZSBETlRUX1RZUEVfTEFCRUw6CisgICAgY2FzZSBETlRUX1RZUEVfRlBBUkFNOgorICAgIGNhc2UgRE5UVF9UWVBFX1NWQVI6CisgICAgY2FzZSBETlRUX1RZUEVfRFZBUjoKKyAgICBjYXNlIEROVFRfVFlQRV9DT05TVDoKKyAgICBjYXNlIEROVFRfVFlQRV9UWVBFREVGOgorICAgIGNhc2UgRE5UVF9UWVBFX1RBR0RFRjoKKyAgICBjYXNlIEROVFRfVFlQRV9NRU1FTlVNOgorICAgIGNhc2UgRE5UVF9UWVBFX0ZJRUxEOgorICAgIGNhc2UgRE5UVF9UWVBFX1NBOgorICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIEROVFRfVFlQRV9CRUdJTjoKKyAgICBjYXNlIEROVFRfVFlQRV9FTkQ6CisgICAgY2FzZSBETlRUX1RZUEVfV0lUSDoKKyAgICBjYXNlIEROVFRfVFlQRV9DT01NT046CisgICAgY2FzZSBETlRUX1RZUEVfUE9JTlRFUjoKKyAgICBjYXNlIEROVFRfVFlQRV9FTlVNOgorICAgIGNhc2UgRE5UVF9UWVBFX1NFVDoKKyAgICBjYXNlIEROVFRfVFlQRV9TVUJSQU5HRToKKyAgICBjYXNlIEROVFRfVFlQRV9BUlJBWToKKyAgICBjYXNlIEROVFRfVFlQRV9TVFJVQ1Q6CisgICAgY2FzZSBETlRUX1RZUEVfVU5JT046CisgICAgY2FzZSBETlRUX1RZUEVfVkFSSUFOVDoKKyAgICBjYXNlIEROVFRfVFlQRV9GSUxFOgorICAgIGNhc2UgRE5UVF9UWVBFX0ZVTkNUWVBFOgorICAgIGNhc2UgRE5UVF9UWVBFX0NPQlNUUlVDVDoKKyAgICBjYXNlIEROVFRfVFlQRV9YUkVGOgorICAgIGNhc2UgRE5UVF9UWVBFX01BQ1JPOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qIEFsbG9jYXRlIGFuZCBwYXJ0aWFsbHkgZmlsbCBhIHBhcnRpYWwgc3ltdGFiLiAgSXQgd2lsbCBiZQorICAgY29tcGxldGVseSBmaWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIGxpc3QuCisKKyAgIFNZTUZJTEVfTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sLWZpbGUgd2UgYXJlIHJlYWRpbmcgZnJvbSwgYW5kIEFERFIKKyAgIGlzIHRoZSBhZGRyZXNzIHJlbGF0aXZlIHRvIHdoaWNoIGl0cyBzeW1ib2xzIGFyZSAoaW5jcmVtZW50YWwpIG9yIDAKKyAgIChub3JtYWwpLiAqLworCitzdGF0aWMgc3RydWN0IHBhcnRpYWxfc3ltdGFiICoKK2hwcmVhZF9zdGFydF9wc3ltdGFiIChvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMsCisJCSAgZmlsZW5hbWUsIHRleHRsb3csIGxkc3ltb2ZmLCBnbG9iYWxfc3ltcywgc3RhdGljX3N5bXMpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHM7CisgICAgIGNoYXIgKmZpbGVuYW1lOworICAgICBDT1JFX0FERFIgdGV4dGxvdzsKKyAgICAgaW50IGxkc3ltb2ZmOworICAgICBzdHJ1Y3QgcGFydGlhbF9zeW1ib2wgKipnbG9iYWxfc3ltczsKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqc3RhdGljX3N5bXM7Cit7CisgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcmVzdWx0ID0KKyAgc3RhcnRfcHN5bXRhYl9jb21tb24gKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywKKwkJCWZpbGVuYW1lLCB0ZXh0bG93LCBnbG9iYWxfc3ltcywgc3RhdGljX3N5bXMpOworCisgIHJlc3VsdC0+cmVhZF9zeW10YWJfcHJpdmF0ZSA9IChjaGFyICopCisgICAgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnBzeW1ib2xfb2JzdGFjaywgc2l6ZW9mIChzdHJ1Y3Qgc3ltbG9jKSk7CisgIExEU1lNT0ZGIChyZXN1bHQpID0gbGRzeW1vZmY7CisgIHJlc3VsdC0+cmVhZF9zeW10YWIgPSBocHJlYWRfcHN5bXRhYl90b19zeW10YWI7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwwKKworLyogQ2xvc2Ugb2ZmIHRoZSBjdXJyZW50IHVzYWdlIG9mIFBTVC4gIAorICAgUmV0dXJucyBQU1Qgb3IgTlVMTCBpZiB0aGUgcGFydGlhbCBzeW10YWIgd2FzIGVtcHR5IGFuZCB0aHJvd24gYXdheS4KKworICAgRklYTUU6ICBMaXN0IHZhcmlhYmxlcyBhbmQgcGVjdWxpYXJpdGllcyBvZiBzYW1lLiAgKi8KKworc3RhdGljIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqCitocHJlYWRfZW5kX3BzeW10YWIgKHBzdCwgaW5jbHVkZV9saXN0LCBudW1faW5jbHVkZXMsIGNhcHBpbmdfc3ltYm9sX29mZnNldCwKKwkgICAgIGNhcHBpbmdfdGV4dCwgZGVwZW5kZW5jeV9saXN0LCBudW1iZXJfZGVwZW5kZW5jaWVzKQorICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdDsKKyAgICAgY2hhciAqKmluY2x1ZGVfbGlzdDsKKyAgICAgaW50IG51bV9pbmNsdWRlczsKKyAgICAgaW50IGNhcHBpbmdfc3ltYm9sX29mZnNldDsKKyAgICAgQ09SRV9BRERSIGNhcHBpbmdfdGV4dDsKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICoqZGVwZW5kZW5jeV9saXN0OworICAgICBpbnQgbnVtYmVyX2RlcGVuZGVuY2llczsKK3sKKyAgaW50IGk7CisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlID0gcHN0IC0+IG9iamZpbGU7CisKKyAgaWYgKGNhcHBpbmdfc3ltYm9sX29mZnNldCAhPSAtMSkKKyAgICAgIExEU1lNTEVOKHBzdCkgPSBjYXBwaW5nX3N5bWJvbF9vZmZzZXQgLSBMRFNZTU9GRihwc3QpOworICBwc3QtPnRleHRoaWdoID0gY2FwcGluZ190ZXh0OworCisgIHBzdC0+bl9nbG9iYWxfc3ltcyA9CisgICAgb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLm5leHQgLSAob2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLmxpc3QgKyBwc3QtPmdsb2JhbHNfb2Zmc2V0KTsKKyAgcHN0LT5uX3N0YXRpY19zeW1zID0KKyAgICBvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMubmV4dCAtIChvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMubGlzdCArIHBzdC0+c3RhdGljc19vZmZzZXQpOworCisgIHBzdC0+bnVtYmVyX29mX2RlcGVuZGVuY2llcyA9IG51bWJlcl9kZXBlbmRlbmNpZXM7CisgIGlmIChudW1iZXJfZGVwZW5kZW5jaWVzKQorICAgIHsKKyAgICAgIHBzdC0+ZGVwZW5kZW5jaWVzID0gKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKikKKwlvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+cHN5bWJvbF9vYnN0YWNrLAorCQkgICAgICAgbnVtYmVyX2RlcGVuZGVuY2llcyAqIHNpemVvZiAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKKyAgICAgIG1lbWNweSAocHN0LT5kZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3lfbGlzdCwKKwkgICAgIG51bWJlcl9kZXBlbmRlbmNpZXMgKiBzaXplb2YgKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSk7CisgICAgfQorICBlbHNlCisgICAgcHN0LT5kZXBlbmRlbmNpZXMgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1faW5jbHVkZXM7IGkrKykKKyAgICB7CisgICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnN1YnBzdCA9CisJYWxsb2NhdGVfcHN5bXRhYiAoaW5jbHVkZV9saXN0W2ldLCBvYmpmaWxlKTsKKworICAgICAgc3VicHN0LT5zZWN0aW9uX29mZnNldHMgPSBwc3QtPnNlY3Rpb25fb2Zmc2V0czsKKyAgICAgIHN1YnBzdC0+cmVhZF9zeW10YWJfcHJpdmF0ZSA9CisJICAoY2hhciAqKSBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+cHN5bWJvbF9vYnN0YWNrLAorCQkJCSAgc2l6ZW9mIChzdHJ1Y3Qgc3ltbG9jKSk7CisgICAgICBMRFNZTU9GRihzdWJwc3QpID0KKwlMRFNZTUxFTihzdWJwc3QpID0KKwkgIHN1YnBzdC0+dGV4dGxvdyA9CisJICAgIHN1YnBzdC0+dGV4dGhpZ2ggPSAwOworCisgICAgICAvKiBXZSBjb3VsZCBzYXZlIHNsaWdodCBiaXRzIG9mIHNwYWNlIGJ5IG9ubHkgbWFraW5nIG9uZSBvZiB0aGVzZSwKKwkgc2hhcmVkIGJ5IHRoZSBlbnRpcmUgc2V0IG9mIGluY2x1ZGUgZmlsZXMuICBGSVhNRS1zb21lZGF5LiAgKi8KKyAgICAgIHN1YnBzdC0+ZGVwZW5kZW5jaWVzID0gKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKikKKwlvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+cHN5bWJvbF9vYnN0YWNrLAorCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworICAgICAgc3VicHN0LT5kZXBlbmRlbmNpZXNbMF0gPSBwc3Q7CisgICAgICBzdWJwc3QtPm51bWJlcl9vZl9kZXBlbmRlbmNpZXMgPSAxOworCisgICAgICBzdWJwc3QtPmdsb2JhbHNfb2Zmc2V0ID0KKwlzdWJwc3QtPm5fZ2xvYmFsX3N5bXMgPQorCSAgc3VicHN0LT5zdGF0aWNzX29mZnNldCA9CisJICAgIHN1YnBzdC0+bl9zdGF0aWNfc3ltcyA9IDA7CisKKyAgICAgIHN1YnBzdC0+cmVhZGluID0gMDsKKyAgICAgIHN1YnBzdC0+c3ltdGFiID0gMDsKKyAgICAgIHN1YnBzdC0+cmVhZF9zeW10YWIgPSBwc3QtPnJlYWRfc3ltdGFiOworICAgIH0KKworICBzb3J0X3BzdF9zeW1ib2xzIChwc3QpOworCisgIC8qIElmIHRoZXJlIGlzIGFscmVhZHkgYSBwc3ltdGFiIG9yIHN5bXRhYiBmb3IgYSBmaWxlIG9mIHRoaXMgbmFtZSwgcmVtb3ZlIGl0LgorICAgICAoSWYgdGhlcmUgaXMgYSBzeW10YWIsIG1vcmUgZHJhc3RpYyB0aGluZ3MgYWxzbyBoYXBwZW4uKQorICAgICBUaGlzIGhhcHBlbnMgaW4gVnhXb3Jrcy4gICovCisgIGZyZWVfbmFtZWRfc3ltdGFicyAocHN0LT5maWxlbmFtZSk7CisKKyAgaWYgKG51bV9pbmNsdWRlcyA9PSAwCisgICAgICAmJiBudW1iZXJfZGVwZW5kZW5jaWVzID09IDAKKyAgICAgICYmIHBzdC0+bl9nbG9iYWxfc3ltcyA9PSAwCisgICAgICAmJiBwc3QtPm5fc3RhdGljX3N5bXMgPT0gMCkKKyAgICB7CisgICAgICAvKiBUaHJvdyBhd2F5IHRoaXMgcHN5bXRhYiwgaXQncyBlbXB0eS4gIFdlIGNhbid0IGRlYWxsb2NhdGUgaXQsIHNpbmNlCisJIGl0IGlzIG9uIHRoZSBvYnN0YWNrLCBidXQgd2UgY2FuIGZvcmdldCB0byBjaGFpbiBpdCBvbiB0aGUgbGlzdC4gICovCisgICAgICAvKiBFbXB0eSBwc3ltdGFicyBoYXBwZW4gYXMgYSByZXN1bHQgb2YgaGVhZGVyIGZpbGVzIHdoaWNoIGRvbid0IGhhdmUKKwkgYW55IHN5bWJvbHMgaW4gdGhlbS4gIFRoZXJlIGNhbiBiZSBhIGxvdCBvZiB0aGVtLiAgQnV0IHRoaXMgY2hlY2sKKwkgaXMgd3JvbmcsIGluIHRoYXQgYSBwc3ltdGFiIHdpdGggTl9TTElORSBlbnRyaWVzIGJ1dCBub3RoaW5nIGVsc2UKKwkgaXMgbm90IGVtcHR5LCBidXQgd2UgZG9uJ3QgcmVhbGl6ZSB0aGF0LiAgRml4aW5nIHRoYXQgd2l0aG91dCBzbG93aW5nCisJIHRoaW5ncyBkb3duIG1pZ2h0IGJlIHRyaWNreS4gICovCisKKyAgICAgIGRpc2NhcmRfcHN5bXRhYiAocHN0KTsKKworICAgICAgLyogSW5kaWNhdGUgdGhhdCBwc3ltdGFiIHdhcyB0aHJvd24gYXdheS4gICovCisgICAgICBwc3QgPSAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopTlVMTDsKKyAgICB9CisgIHJldHVybiBwc3Q7Cit9CisMCisvKiBEbyB0aGUgZGlydHkgd29yayBvZiByZWFkaW5nIGluIHRoZSBmdWxsIHN5bWJvbCBmcm9tIGEgcGFydGlhbCBzeW1ib2wKKyAgIHRhYmxlLiAgKi8KKworc3RhdGljIHZvaWQKK2hwcmVhZF9wc3ltdGFiX3RvX3N5bXRhYl8xIChwc3QpCisgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN0OworeworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworICBpbnQgaTsKKworICAvKiBHZXQgb3V0IHF1aWNrIGlmIHBhc3NlZCBqdW5rLiAgKi8KKyAgaWYgKCFwc3QpCisgICAgcmV0dXJuOworCisgIC8qIENvbXBsYWluIGlmIHdlJ3ZlIGFscmVhZHkgcmVhZCBpbiB0aGlzIHN5bWJvbCB0YWJsZS4gICovCisgIGlmIChwc3QtPnJlYWRpbikKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJQc3ltdGFiIGZvciAlcyBhbHJlYWR5IHJlYWQgaW4uICBTaG91bGRuJ3QgaGFwcGVuLlxuIiwKKwkgICAgICAgcHN0LT5maWxlbmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFJlYWQgaW4gYWxsIHBhcnRpYWwgc3ltdGFicyBvbiB3aGljaCB0aGlzIG9uZSBpcyBkZXBlbmRlbnQgKi8KKyAgZm9yIChpID0gMDsgaSA8IHBzdC0+bnVtYmVyX29mX2RlcGVuZGVuY2llczsgaSsrKQorICAgIGlmICghcHN0LT5kZXBlbmRlbmNpZXNbaV0tPnJlYWRpbikKKyAgICAgIHsKKwkvKiBJbmZvcm0gYWJvdXQgYWRkaXRpb25hbCBmaWxlcyB0aGF0IG5lZWQgdG8gYmUgcmVhZCBpbi4gICovCisJaWYgKGluZm9fdmVyYm9zZSkKKwkgIHsKKwkgICAgZnB1dHNfZmlsdGVyZWQgKCIgIiwgZ2RiX3N0ZG91dCk7CisJICAgIHdyYXBfaGVyZSAoIiIpOworCSAgICBmcHV0c19maWx0ZXJlZCAoImFuZCAiLCBnZGJfc3Rkb3V0KTsKKwkgICAgd3JhcF9oZXJlICgiIik7CisJICAgIHByaW50Zl9maWx0ZXJlZCAoIiVzLi4uIiwgcHN0LT5kZXBlbmRlbmNpZXNbaV0tPmZpbGVuYW1lKTsKKwkgICAgd3JhcF9oZXJlICgiIik7CS8qIEZsdXNoIG91dHB1dCAqLworCSAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCSAgfQorCWhwcmVhZF9wc3ltdGFiX3RvX3N5bXRhYl8xIChwc3QtPmRlcGVuZGVuY2llc1tpXSk7CisgICAgICB9CisKKyAgLyogSWYgaXQncyByZWFsLi4uICAqLworICBpZiAoTERTWU1MRU4gKHBzdCkpCisgICAgeworICAgICAgLyogSW5pdCBzdHVmZiBuZWNlc3NhcnkgZm9yIHJlYWRpbmcgaW4gc3ltYm9scyAqLworICAgICAgYnVpbGRzeW1faW5pdCAoKTsKKyAgICAgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAocmVhbGx5X2ZyZWVfcGVuZGluZ3MsIDApOworCisgICAgICBwc3QtPnN5bXRhYiA9CisJaHByZWFkX2V4cGFuZF9zeW10YWIgKHBzdC0+b2JqZmlsZSwgTERTWU1PRkYgKHBzdCksIExEU1lNTEVOIChwc3QpLAorCQkJICAgICAgcHN0LT50ZXh0bG93LCBwc3QtPnRleHRoaWdoIC0gcHN0LT50ZXh0bG93LAorCQkJICAgICAgcHN0LT5zZWN0aW9uX29mZnNldHMsIHBzdC0+ZmlsZW5hbWUpOworICAgICAgc29ydF9zeW10YWJfc3ltcyAocHN0LT5zeW10YWIpOworCisgICAgICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKKyAgICB9CisKKyAgcHN0LT5yZWFkaW4gPSAxOworfQorCisvKiBSZWFkIGluIGFsbCBvZiB0aGUgc3ltYm9scyBmb3IgYSBnaXZlbiBwc3ltdGFiIGZvciByZWFsLgorICAgQmUgdmVyYm9zZSBhYm91dCBpdCBpZiB0aGUgdXNlciB3YW50cyB0aGF0LiAgKi8KKworc3RhdGljIHZvaWQKK2hwcmVhZF9wc3ltdGFiX3RvX3N5bXRhYiAocHN0KQorICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdDsKK3sKKyAgLyogR2V0IG91dCBxdWljayBpZiBnaXZlbiBqdW5rLiAgKi8KKyAgaWYgKCFwc3QpCisgICAgcmV0dXJuOworCisgIC8qIFNhbml0eSBjaGVjay4gICovCisgIGlmIChwc3QtPnJlYWRpbikKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJQc3ltdGFiIGZvciAlcyBhbHJlYWR5IHJlYWQgaW4uICBTaG91bGRuJ3QgaGFwcGVuLlxuIiwKKwkgICAgICAgcHN0LT5maWxlbmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChMRFNZTUxFTiAocHN0KSB8fCBwc3QtPm51bWJlcl9vZl9kZXBlbmRlbmNpZXMpCisgICAgeworICAgICAgLyogUHJpbnQgdGhlIG1lc3NhZ2Ugbm93LCBiZWZvcmUgcmVhZGluZyB0aGUgc3RyaW5nIHRhYmxlLAorICAgICAgICAgdG8gYXZvaWQgZGlzY29uY2VydGluZyBwYXVzZXMuICAqLworICAgICAgaWYgKGluZm9fdmVyYm9zZSkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCJSZWFkaW5nIGluIHN5bWJvbHMgZm9yICVzLi4uIiwgcHN0LT5maWxlbmFtZSk7CisJICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCX0KKworICAgICAgaHByZWFkX3BzeW10YWJfdG9fc3ltdGFiXzEgKHBzdCk7CisKKyAgICAgIC8qIE1hdGNoIHdpdGggZ2xvYmFsIHN5bWJvbHMuICBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBvbmNlLAorICAgICAgICAgYWZ0ZXIgYWxsIG9mIHRoZSBzeW10YWJzIGFuZCBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIHJlYWQgaW4uICAgKi8KKyAgICAgIHNjYW5fZmlsZV9nbG9iYWxzIChwc3QtPm9iamZpbGUpOworCisgICAgICAvKiBGaW5pc2ggdXAgdGhlIGRlYnVnIGVycm9yIG1lc3NhZ2UuICAqLworICAgICAgaWYgKGluZm9fdmVyYm9zZSkKKwlwcmludGZfZmlsdGVyZWQgKCJkb25lLlxuIik7CisgICAgfQorfQorLyogUmVhZCBpbiBhIGRlZmluZWQgc2VjdGlvbiBvZiBhIHNwZWNpZmljIG9iamVjdCBmaWxlJ3Mgc3ltYm9scy4KKworICAgREVTQyBpcyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZSwgcG9zaXRpb25lZCBhdCB0aGUKKyAgIGJlZ2lubmluZyBvZiB0aGUgc3ltdGFiCisgICBTWU1fT0ZGU0VUIGlzIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBmaWxlIG9mCisgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzeW1ib2xzIHdlIHdhbnQgdG8gcmVhZAorICAgU1lNX1NJWkUgaXMgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCBpbmZvIHRvIHJlYWQgaW4uCisgICBURVhUX09GRlNFVCBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0IHNlZ21lbnQgd2UgYXJlIHJlYWRpbmcgc3ltYm9scyBmb3IKKyAgIFRFWFRfU0laRSBpcyB0aGUgc2l6ZSBvZiB0aGUgdGV4dCBzZWdtZW50IHJlYWQgaW4uCisgICBTRUNUSU9OX09GRlNFVFMgYXJlIHRoZSByZWxvY2F0aW9uIG9mZnNldHMgd2hpY2ggZ2V0IGFkZGVkIHRvIGVhY2ggc3ltYm9sLiAqLworCitzdGF0aWMgc3RydWN0IHN5bXRhYiAqCitocHJlYWRfZXhwYW5kX3N5bXRhYiAob2JqZmlsZSwgc3ltX29mZnNldCwgc3ltX3NpemUsIHRleHRfb2Zmc2V0LCB0ZXh0X3NpemUsCisJCSAgICAgIHNlY3Rpb25fb2Zmc2V0cywgZmlsZW5hbWUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBpbnQgc3ltX29mZnNldDsKKyAgICAgaW50IHN5bV9zaXplOworICAgICBDT1JFX0FERFIgdGV4dF9vZmZzZXQ7CisgICAgIGludCB0ZXh0X3NpemU7CisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKyAgICAgY2hhciAqZmlsZW5hbWU7Cit7CisgIGNoYXIgKm5hbWVzdHJpbmc7CisgIHVuaW9uIGRudHRlbnRyeSAqZG5fYnVmcDsKKyAgdW5zaWduZWQgbWF4X3N5bW51bTsKKworICBpbnQgc3ltX2luZGV4ID0gc3ltX29mZnNldCAvIHNpemVvZiAoc3RydWN0IGRudHRfdHlwZV9ibG9jayk7CisKKyAgY3VycmVudF9vYmpmaWxlID0gb2JqZmlsZTsKKyAgc3ViZmlsZV9zdGFjayA9IDA7CisKKyAgbGFzdF9zb3VyY2VfZmlsZSA9IDA7CisKKyAgZG5fYnVmcCA9IGhwcmVhZF9nZXRfbG50dCAoc3ltX2luZGV4LCBvYmpmaWxlKTsKKyAgaWYgKCEoKGRuX2J1ZnAtPmRibG9jay5raW5kID09ICh1bnNpZ25lZCBjaGFyKSBETlRUX1RZUEVfU1JDRklMRSkgfHwKKwkoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gKHVuc2lnbmVkIGNoYXIpIEROVFRfVFlQRV9NT0RVTEUpKSkKKyAgICB7CisgICAgICBzdGFydF9zeW10YWIgKCJnbG9iYWxzIiwgTlVMTCwgMCk7CisgICAgICByZWNvcmRfZGVidWdmb3JtYXQgKCJIUCIpOworICAgIH0KKworICBtYXhfc3ltbnVtID0gc3ltX3NpemUgLyBzaXplb2YgKHN0cnVjdCBkbnR0X3R5cGVfYmxvY2spOworCisgIC8qIFJlYWQgaW4gYW5kIHByb2Nlc3MgZWFjaCBkZWJ1ZyBzeW1ib2wgd2l0aGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UuICAqLworICBmb3IgKHN5bW51bSA9IDA7CisgICAgICAgc3ltbnVtIDwgbWF4X3N5bW51bTsKKyAgICAgICBzeW1udW0rKykKKyAgICB7CisgICAgICBRVUlUOwkJCS8qIEFsbG93IHRoaXMgdG8gYmUgaW50ZXJydXB0YWJsZSAqLworICAgICAgZG5fYnVmcCA9IGhwcmVhZF9nZXRfbG50dCAoc3ltX2luZGV4ICsgc3ltbnVtLCBvYmpmaWxlKTsKKworICAgICAgaWYgKGRuX2J1ZnAtPmRibG9jay5leHRlbnNpb24pCisJY29udGludWU7CisKKyAgICAgIC8qIFlvdyEgIFdlIGNhbGwgU0VUX05BTUVTVFJJTkcgb24gdGhpbmdzIHdpdGhvdXQgbmFtZXMhICAqLworICAgICAgU0VUX05BTUVTVFJJTkcgKGRuX2J1ZnAsICZuYW1lc3RyaW5nLCBvYmpmaWxlKTsKKworICAgICAgaHByZWFkX3Byb2Nlc3Nfb25lX2RlYnVnX3N5bWJvbCAoZG5fYnVmcCwgbmFtZXN0cmluZywgc2VjdGlvbl9vZmZzZXRzLAorCQkJCSAgICAgICBvYmpmaWxlLCB0ZXh0X29mZnNldCwgdGV4dF9zaXplLAorCQkJCSAgICAgICBmaWxlbmFtZSwgc3ltbnVtICsgc3ltX2luZGV4KTsKKyAgICB9CisKKyAgY3VycmVudF9vYmpmaWxlID0gTlVMTDsKKworICByZXR1cm4gZW5kX3N5bXRhYiAodGV4dF9vZmZzZXQgKyB0ZXh0X3NpemUsIG9iamZpbGUsIDApOworfQorDAorCisvKiBDb252ZXJ0IGJhc2ljIHR5cGVzIGZyb20gSFAgZGVidWcgZm9ybWF0IGludG8gR0RCIGludGVybmFsIGZvcm1hdC4gICovCisKK3N0YXRpYyBpbnQKK2hwcmVhZF90eXBlX3RyYW5zbGF0ZSAodHlwZXApCisgICAgIGRudHRwb2ludGVyIHR5cGVwOworeworICBpZiAoIXR5cGVwLmRudHRpLmltbWVkaWF0ZSkKKyAgICBhYm9ydCAoKTsKKworICBzd2l0Y2ggKHR5cGVwLmRudHRpLnR5cGUpCisgICAgeworICAgIGNhc2UgSFBfVFlQRV9CT09MRUFOOgorICAgIGNhc2UgSFBfVFlQRV9CT09MRUFOX1MzMDBfQ09NUEFUOgorICAgIGNhc2UgSFBfVFlQRV9CT09MRUFOX1ZBWF9DT01QQVQ6CisgICAgICByZXR1cm4gRlRfQk9PTEVBTjsKKyAgICAgIC8qIFVnaC4gIE5vIHdheSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHNpZ25lZCBhbmQgdW5zaWduZWQgY2hhcnMuICAqLworICAgIGNhc2UgSFBfVFlQRV9DSEFSOgorICAgIGNhc2UgSFBfVFlQRV9XSURFX0NIQVI6CisgICAgICByZXR1cm4gRlRfQ0hBUjsKKyAgICBjYXNlIEhQX1RZUEVfSU5UOgorICAgICAgaWYgKHR5cGVwLmRudHRpLmJpdGxlbmd0aCA8PSA4KQorCXJldHVybiBGVF9DSEFSOworICAgICAgaWYgKHR5cGVwLmRudHRpLmJpdGxlbmd0aCA8PSAxNikKKwlyZXR1cm4gRlRfU0hPUlQ7CisgICAgICBpZiAodHlwZXAuZG50dGkuYml0bGVuZ3RoIDw9IDMyKQorCXJldHVybiBGVF9JTlRFR0VSOworICAgICAgcmV0dXJuIEZUX0xPTkdfTE9ORzsKKyAgICBjYXNlIEhQX1RZUEVfTE9ORzoKKyAgICAgIHJldHVybiBGVF9MT05HOworICAgIGNhc2UgSFBfVFlQRV9VTlNJR05FRF9MT05HOgorICAgICAgaWYgKHR5cGVwLmRudHRpLmJpdGxlbmd0aCA8PSA4KQorCXJldHVybiBGVF9VTlNJR05FRF9DSEFSOworICAgICAgaWYgKHR5cGVwLmRudHRpLmJpdGxlbmd0aCA8PSAxNikKKwlyZXR1cm4gRlRfVU5TSUdORURfU0hPUlQ7CisgICAgICBpZiAodHlwZXAuZG50dGkuYml0bGVuZ3RoIDw9IDMyKQorCXJldHVybiBGVF9VTlNJR05FRF9MT05HOworICAgICAgcmV0dXJuIEZUX1VOU0lHTkVEX0xPTkdfTE9ORzsKKyAgICBjYXNlIEhQX1RZUEVfVU5TSUdORURfSU5UOgorICAgICAgaWYgKHR5cGVwLmRudHRpLmJpdGxlbmd0aCA8PSA4KQorCXJldHVybiBGVF9VTlNJR05FRF9DSEFSOworICAgICAgaWYgKHR5cGVwLmRudHRpLmJpdGxlbmd0aCA8PSAxNikKKwlyZXR1cm4gRlRfVU5TSUdORURfU0hPUlQ7CisgICAgICBpZiAodHlwZXAuZG50dGkuYml0bGVuZ3RoIDw9IDMyKQorCXJldHVybiBGVF9VTlNJR05FRF9JTlRFR0VSOworICAgICAgcmV0dXJuIEZUX1VOU0lHTkVEX0xPTkdfTE9ORzsKKyAgICBjYXNlIEhQX1RZUEVfUkVBTDoKKyAgICBjYXNlIEhQX1RZUEVfUkVBTF8zMDAwOgorICAgIGNhc2UgSFBfVFlQRV9ET1VCTEU6CisgICAgICBpZiAodHlwZXAuZG50dGkuYml0bGVuZ3RoID09IDY0KQorCXJldHVybiBGVF9EQkxfUFJFQ19GTE9BVDsKKyAgICAgIGlmICh0eXBlcC5kbnR0aS5iaXRsZW5ndGggPT0gMTI4KQorCXJldHVybiBGVF9FWFRfUFJFQ19GTE9BVDsKKyAgICAgIHJldHVybiBGVF9GTE9BVDsKKyAgICBjYXNlIEhQX1RZUEVfQ09NUExFWDoKKyAgICBjYXNlIEhQX1RZUEVfQ09NUExFWFMzMDAwOgorICAgICAgaWYgKHR5cGVwLmRudHRpLmJpdGxlbmd0aCA9PSAxMjgpCisJcmV0dXJuIEZUX0RCTF9QUkVDX0NPTVBMRVg7CisgICAgICBpZiAodHlwZXAuZG50dGkuYml0bGVuZ3RoID09IDE5MikKKwlyZXR1cm4gRlRfRVhUX1BSRUNfQ09NUExFWDsKKyAgICAgIHJldHVybiBGVF9DT01QTEVYOworICAgIGNhc2UgSFBfVFlQRV9TVFJJTkcyMDA6CisgICAgY2FzZSBIUF9UWVBFX0xPTkdTVFJJTkcyMDA6CisgICAgY2FzZSBIUF9UWVBFX0ZUTl9TVFJJTkdfU1BFQzoKKyAgICBjYXNlIEhQX1RZUEVfTU9EX1NUUklOR19TUEVDOgorICAgIGNhc2UgSFBfVFlQRV9NT0RfU1RSSU5HXzMwMDA6CisgICAgY2FzZSBIUF9UWVBFX0ZUTl9TVFJJTkdfUzMwMF9DT01QQVQ6CisgICAgY2FzZSBIUF9UWVBFX0ZUTl9TVFJJTkdfVkFYX0NPTVBBVDoKKyAgICAgIHJldHVybiBGVF9TVFJJTkc7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5kZXggZm91bmQgaW4gSFBfVFlQRS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqKgoraHByZWFkX2xvb2t1cF90eXBlIChocF90eXBlLCBvYmpmaWxlKQorICAgICBkbnR0cG9pbnRlciBocF90eXBlOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgdW5zaWduZWQgb2xkX2xlbjsKKyAgaW50IGluZGV4ID0gaHBfdHlwZS5kbnR0cC5pbmRleDsKKworICBpZiAoaHBfdHlwZS5kbnR0aS5pbW1lZGlhdGUpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGluZGV4IDwgTE5UVF9TWU1DT1VOVCAob2JqZmlsZSkpCisgICAgeworICAgICAgaWYgKGluZGV4ID49IFRZUEVfVkVDVE9SX0xFTkdUSCAob2JqZmlsZSkpCisJeworCSAgb2xkX2xlbiA9IFRZUEVfVkVDVE9SX0xFTkdUSCAob2JqZmlsZSk7CisJICBpZiAob2xkX2xlbiA9PSAwKQorCSAgICB7CisJICAgICAgVFlQRV9WRUNUT1JfTEVOR1RIIChvYmpmaWxlKSA9IDEwMDsKKwkgICAgICBUWVBFX1ZFQ1RPUiAob2JqZmlsZSkgPSAoc3RydWN0IHR5cGUgKiopCisJCXhtbWFsbG9jIChvYmpmaWxlIC0+IG1kLAorCQkJICBUWVBFX1ZFQ1RPUl9MRU5HVEggKG9iamZpbGUpICogc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSk7CisJICAgIH0KKwkgIHdoaWxlIChpbmRleCA+PSBUWVBFX1ZFQ1RPUl9MRU5HVEggKG9iamZpbGUpKQorCSAgICBUWVBFX1ZFQ1RPUl9MRU5HVEggKG9iamZpbGUpICo9IDI7CisJICBUWVBFX1ZFQ1RPUiAob2JqZmlsZSkgPSAoc3RydWN0IHR5cGUgKiopCisJICAgIHhtcmVhbGxvYyAob2JqZmlsZSAtPiBtZCwKKwkJICAgICAgIChjaGFyICopIFRZUEVfVkVDVE9SIChvYmpmaWxlKSwKKwkJICAgICAgKFRZUEVfVkVDVE9SX0xFTkdUSCAob2JqZmlsZSkgKiBzaXplb2YgKHN0cnVjdCB0eXBlICopKSk7CisJICBtZW1zZXQgKCZUWVBFX1ZFQ1RPUiAob2JqZmlsZSlbb2xkX2xlbl0sIDAsCisJCSAgKFRZUEVfVkVDVE9SX0xFTkdUSCAob2JqZmlsZSkgLSBvbGRfbGVuKSAqCisJCSAgc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSk7CisJfQorICAgICAgcmV0dXJuICZUWVBFX1ZFQ1RPUiAob2JqZmlsZSlbaW5kZXhdOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBOVUxMOworfQorCisvKiBQb3NzaWJseSBhbGxvY2F0ZSBhIEdEQiBpbnRlcm5hbCB0eXBlIHNvIHdlIGNhbiBpbnRlcm5hbGl6ZSBIUF9UWVBFLgorICAgTm90ZSB3ZSdsbCBqdXN0IHJldHVybiB0aGUgYWRkcmVzcyBvZiBhIEdEQiBpbnRlcm5hbCB0eXBlIGlmIHdlIGFscmVhZHkKKyAgIGhhdmUgaXQgbHlpbmcgYXJvdW5kLiAgKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2hwcmVhZF9hbGxvY190eXBlIChocF90eXBlLCBvYmpmaWxlKQorICAgICBkbnR0cG9pbnRlciBocF90eXBlOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IHR5cGUgKip0eXBlX2FkZHI7CisKKyAgdHlwZV9hZGRyID0gaHByZWFkX2xvb2t1cF90eXBlIChocF90eXBlLCBvYmpmaWxlKTsKKyAgaWYgKCp0eXBlX2FkZHIgPT0gMCkKKyAgICAqdHlwZV9hZGRyID0gYWxsb2NfdHlwZSAob2JqZmlsZSk7CisKKyAgVFlQRV9DUExVU19TUEVDSUZJQyAoKnR5cGVfYWRkcikKKyAgICA9IChzdHJ1Y3QgY3BsdXNfc3RydWN0X3R5cGUgKikgJmNwbHVzX3N0cnVjdF9kZWZhdWx0OworICByZXR1cm4gKnR5cGVfYWRkcjsKK30KKworLyogUmVhZCBhIG5hdGl2ZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHJldHVybiBpdCBpbiBHREIgaW50ZXJuYWwgZm9ybS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitocHJlYWRfcmVhZF9lbnVtX3R5cGUgKGhwX3R5cGUsIGRuX2J1ZnAsIG9iamZpbGUpCisgICAgIGRudHRwb2ludGVyIGhwX3R5cGU7CisgICAgIHVuaW9uIGRudHRlbnRyeSAqZG5fYnVmcDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlOworICBzdHJ1Y3QgcGVuZGluZyAqKnN5bWxpc3QsICpvc3ltcywgKnN5bXM7CisgIGludCBvX25zeW1zLCBuc3ltcyA9IDA7CisgIGRudHRwb2ludGVyIG1lbTsKKyAgdW5pb24gZG50dGVudHJ5ICptZW1wOworICBjaGFyICpuYW1lOworICBsb25nIG47CisgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKworICB0eXBlID0gaHByZWFkX2FsbG9jX3R5cGUgKGhwX3R5cGUsIG9iamZpbGUpOworICBUWVBFX0xFTkdUSCAodHlwZSkgPSA0OworCisgIHN5bWxpc3QgPSAmZmlsZV9zeW1ib2xzOworICBvc3ltcyA9ICpzeW1saXN0OworICBvX25zeW1zID0gb3N5bXMgPyBvc3ltcy0+bnN5bXMgOiAwOworCisgIC8qIEdldCBhIG5hbWUgZm9yIGVhY2ggbWVtYmVyIGFuZCBhZGQgaXQgdG8gb3VyIGxpc3Qgb2YgbWVtYmVycy4gICovCisgIG1lbSA9IGRuX2J1ZnAtPmRlbnVtLmZpcnN0bWVtOworICB3aGlsZSAobWVtLmRudHRwLmV4dGVuc2lvbiAmJiBtZW0ud29yZCAhPSBETlRUTklMKQorICAgIHsKKyAgICAgIG1lbXAgPSBocHJlYWRfZ2V0X2xudHQgKG1lbS5kbnR0cC5pbmRleCwgb2JqZmlsZSk7CisKKyAgICAgIG5hbWUgPSBWVCAob2JqZmlsZSkgKyBtZW1wLT5kbWVtYmVyLm5hbWU7CisgICAgICBzeW0gPSAoc3RydWN0IHN5bWJvbCAqKSBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssCisJCQkJCSAgICAgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisgICAgICBtZW1zZXQgKHN5bSwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisgICAgICBTWU1CT0xfTkFNRSAoc3ltKSA9IG9ic2F2ZXN0cmluZyAobmFtZSwgc3RybGVuIChuYW1lKSwgCisJCQkJCSZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjayk7CisgICAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfQ09OU1Q7CisgICAgICBTWU1CT0xfTkFNRVNQQUNFIChzeW0pID0gVkFSX05BTUVTUEFDRTsKKyAgICAgIFNZTUJPTF9WQUxVRSAoc3ltKSA9IG1lbXAtPmRtZW1iZXIudmFsdWU7CisgICAgICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgc3ltbGlzdCk7CisgICAgICBuc3ltcysrOworICAgICAgbWVtID0gbWVtcC0+ZG1lbWJlci5uZXh0bWVtOworICAgIH0KKworICAvKiBOb3cgdGhhdCB3ZSBrbm93IG1vcmUgYWJvdXQgdGhlIGVudW0sIGZpbGwgaW4gbW9yZSBpbmZvLiAgKi8KKyAgVFlQRV9DT0RFICh0eXBlKSA9IFRZUEVfQ09ERV9FTlVNOworICBUWVBFX0ZMQUdTICh0eXBlKSAmPSB+VFlQRV9GTEFHX1NUVUI7CisgIFRZUEVfTkZJRUxEUyAodHlwZSkgPSBuc3ltczsKKyAgVFlQRV9GSUVMRFMgKHR5cGUpID0gKHN0cnVjdCBmaWVsZCAqKQorICAgIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT50eXBlX29ic3RhY2ssIHNpemVvZiAoc3RydWN0IGZpZWxkKSAqIG5zeW1zKTsKKworICAvKiBGaW5kIHRoZSBzeW1ib2xzIGZvciB0aGUgbWVtYmVycyBhbmQgcHV0IHRoZW0gaW50byB0aGUgdHlwZS4KKyAgICAgVGhlIHN5bWJvbHMgY2FuIGJlIGZvdW5kIGluIHRoZSBzeW1saXN0IHRoYXQgd2UgcHV0IHRoZW0gb24KKyAgICAgdG8gY2F1c2UgdGhlbSB0byBiZSBkZWZpbmVkLiAgb3N5bXMgY29udGFpbnMgdGhlIG9sZCB2YWx1ZQorICAgICBvZiB0aGF0IHN5bWxpc3Q7IGV2ZXJ5dGhpbmcgdXAgdG8gdGhlcmUgd2FzIGRlZmluZWQgYnkgdXMuCisKKyAgICAgTm90ZSB0aGF0IHdlIHByZXNlcnZlIHRoZSBvcmRlciBvZiB0aGUgZW51bSBjb25zdGFudHMsIHNvCisgICAgIHRoYXQgaW4gc29tZXRoaW5nIGxpa2UgImVudW0ge0ZPTywgTEFTVF9USElORz1GT099IiB3ZSBwcmludAorICAgICBGT08sIG5vdCBMQVNUX1RISU5HLiAgKi8KKyAgZm9yIChzeW1zID0gKnN5bWxpc3QsIG4gPSAwOyBzeW1zOyBzeW1zID0gc3ltcy0+bmV4dCkKKyAgICB7CisgICAgICBpbnQgaiA9IDA7CisgICAgICBpZiAoc3ltcyA9PSBvc3ltcykKKwlqID0gb19uc3ltczsKKyAgICAgIGZvciAoOyBqIDwgc3ltcy0+bnN5bXM7IGorKywgbisrKQorCXsKKwkgIHN0cnVjdCBzeW1ib2wgKnhzeW0gPSBzeW1zLT5zeW1ib2xbal07CisJICBTWU1CT0xfVFlQRSAoeHN5bSkgPSB0eXBlOworCSAgVFlQRV9GSUVMRF9OQU1FICh0eXBlLCBuKSA9IFNZTUJPTF9OQU1FICh4c3ltKTsKKwkgIFRZUEVfRklFTERfQklUUE9TICh0eXBlLCBuKSA9IFNZTUJPTF9WQUxVRSAoeHN5bSk7CisJICBUWVBFX0ZJRUxEX0JJVFNJWkUgKHR5cGUsIG4pID0gMDsKKwl9CisgICAgICBpZiAoc3ltcyA9PSBvc3ltcykKKwlicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIHR5cGU7Cit9CisKKy8qIFJlYWQgYW5kIGludGVybmFsaXplIGEgbmF0aXZlIGZ1bmN0aW9uIGRlYnVnIHN5bWJvbC4gICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitocHJlYWRfcmVhZF9mdW5jdGlvbl90eXBlIChocF90eXBlLCBkbl9idWZwLCBvYmpmaWxlKQorICAgICBkbnR0cG9pbnRlciBocF90eXBlOworICAgICB1bmlvbiBkbnR0ZW50cnkgKmRuX2J1ZnA7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBzdHJ1Y3QgdHlwZSAqdHlwZSwgKnR5cGUxOworICBzdHJ1Y3QgcGVuZGluZyAqKnN5bWxpc3QsICpvc3ltcywgKnN5bXM7CisgIGludCBvX25zeW1zLCBuc3ltcyA9IDA7CisgIGRudHRwb2ludGVyIHBhcmFtOworICB1bmlvbiBkbnR0ZW50cnkgKnBhcmFtcDsKKyAgY2hhciAqbmFtZTsKKyAgbG9uZyBuOworICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisKKyAgcGFyYW0gPSBkbl9idWZwLT5kZnVuYy5maXJzdHBhcmFtOworCisgIC8qIFNlZSBpZiB3ZSd2ZSBhbHJlYWR5IHJlYWQgaW4gdGhpcyB0eXBlLiAgKi8KKyAgdHlwZSA9IGhwcmVhZF9hbGxvY190eXBlIChocF90eXBlLCBvYmpmaWxlKTsKKyAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX0ZVTkMpCisgICAgcmV0dXJuIHR5cGU7CisKKyAgLyogTm9wZSwgc28gcmVhZCBpdCBpbiBhbmQgc3RvcmUgaXQgYXdheS4gICovCisgIHR5cGUxID0gbG9va3VwX2Z1bmN0aW9uX3R5cGUgKGhwcmVhZF90eXBlX2xvb2t1cCAoZG5fYnVmcC0+ZGZ1bmMucmV0dmFsLAorCQkJCQkJICAgIG9iamZpbGUpKTsKKyAgbWVtY3B5ICgoY2hhciAqKSB0eXBlLCAoY2hhciAqKSB0eXBlMSwgc2l6ZW9mIChzdHJ1Y3QgdHlwZSkpOworCisgIHN5bWxpc3QgPSAmbG9jYWxfc3ltYm9sczsKKyAgb3N5bXMgPSAqc3ltbGlzdDsKKyAgb19uc3ltcyA9IG9zeW1zID8gb3N5bXMtPm5zeW1zIDogMDsKKworICAvKiBOb3cgZXhhbWluZSBlYWNoIHBhcmFtZXRlciBub3RpbmcgaXRzIHR5cGUsIGxvY2F0aW9uLCBhbmQgYQorICAgICB3ZWFsdGggb2Ygb3RoZXIgaW5mb3JtYXRpb24uICAqLworICB3aGlsZSAocGFyYW0ud29yZCAmJiBwYXJhbS53b3JkICE9IEROVFROSUwpCisgICAgeworICAgICAgcGFyYW1wID0gaHByZWFkX2dldF9sbnR0IChwYXJhbS5kbnR0cC5pbmRleCwgb2JqZmlsZSk7CisgICAgICBuc3ltcysrOworICAgICAgcGFyYW0gPSBwYXJhbXAtPmRmcGFyYW0ubmV4dHBhcmFtOworCisgICAgICAvKiBHZXQgdGhlIG5hbWUuICAqLworICAgICAgbmFtZSA9IFZUIChvYmpmaWxlKSArIHBhcmFtcC0+ZGZwYXJhbS5uYW1lOworICAgICAgc3ltID0gKHN0cnVjdCBzeW1ib2wgKikgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrLAorCQkJCQkgICAgIHNpemVvZiAoc3RydWN0IHN5bWJvbCkpOworICAgICAgKHZvaWQpIG1lbXNldCAoc3ltLCAwLCBzaXplb2YgKHN0cnVjdCBzeW1ib2wpKTsKKyAgICAgIFNZTUJPTF9OQU1FIChzeW0pID0gb2JzYXZlc3RyaW5nIChuYW1lLCBzdHJsZW4gKG5hbWUpLAorCQkJCQkmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2spOworCisgICAgICAvKiBGaWd1cmUgb3V0IHdoZXJlIGl0IGxpdmVzLiAgKi8KKyAgICAgIGlmIChwYXJhbXAtPmRmcGFyYW0ucmVncGFyYW0pCisJU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX1JFR1BBUk07CisgICAgICBlbHNlIGlmIChwYXJhbXAtPmRmcGFyYW0uaW5kaXJlY3QpCisJU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX1JFRl9BUkc7CisgICAgICBlbHNlCisJU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0FSRzsKKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworICAgICAgaWYgKHBhcmFtcC0+ZGZwYXJhbS5jb3B5cGFyYW0pCisJeworCSAgU1lNQk9MX1ZBTFVFIChzeW0pID0gcGFyYW1wLT5kZnBhcmFtLmxvY2F0aW9uIDsKKyNpZmRlZiBIUFJFQURfQURKVVNUX1NUQUNLX0FERFJFU1MKKwkgIFNZTUJPTF9WQUxVRSAoc3ltKQorCSAgICArPSBIUFJFQURfQURKVVNUX1NUQUNLX0FERFJFU1MgKENVUlJFTlRfRlVOQ1RJT05fVkFMVUUgKG9iamZpbGUpKTsKKyNlbmRpZgorCSAgLyogVGhpcyBpcyBsaWtlbHkgYSBwYXNzLWJ5LWludmlzaWJsZSByZWZlcmVuY2UgcGFyYW1ldGVyLAorCSAgICAgSGFjayBvbiB0aGUgc3ltYm9sIGNsYXNzIHRvIG1ha2UgR0RCIGhhcHB5LiAgKi8KKwkgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19SRUdQQVJNX0FERFI7CisJfQorICAgICAgZWxzZQorCVNZTUJPTF9WQUxVRSAoc3ltKSA9IHBhcmFtcC0+ZGZwYXJhbS5sb2NhdGlvbjsKKworICAgICAgLyogR2V0IGl0cyB0eXBlLiAgKi8KKyAgICAgIFNZTUJPTF9UWVBFIChzeW0pID0gaHByZWFkX3R5cGVfbG9va3VwIChwYXJhbXAtPmRmcGFyYW0udHlwZSwgb2JqZmlsZSk7CisKKyAgICAgIC8qIEFkZCBpdCB0byB0aGUgbGlzdC4gICovCisgICAgICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgc3ltbGlzdCk7CisgICAgfQorCisgIC8qIE5vdGUgaG93IG1hbnkgcGFyYW1ldGVycyB3ZSBmb3VuZC4gICovCisgIFRZUEVfTkZJRUxEUyAodHlwZSkgPSBuc3ltczsKKyAgVFlQRV9GSUVMRFMgKHR5cGUpID0gKHN0cnVjdCBmaWVsZCAqKQorICAgIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT50eXBlX29ic3RhY2ssCisJCSAgIHNpemVvZiAoc3RydWN0IGZpZWxkKSAqIG5zeW1zKTsKKworICAvKiBGaW5kIHRoZSBzeW1ib2xzIGZvciB0aGUgdmFsdWVzIGFuZCBwdXQgdGhlbSBpbnRvIHRoZSB0eXBlLgorICAgICBUaGUgc3ltYm9scyBjYW4gYmUgZm91bmQgaW4gdGhlIHN5bWxpc3QgdGhhdCB3ZSBwdXQgdGhlbSBvbgorICAgICB0byBjYXVzZSB0aGVtIHRvIGJlIGRlZmluZWQuICBvc3ltcyBjb250YWlucyB0aGUgb2xkIHZhbHVlCisgICAgIG9mIHRoYXQgc3ltbGlzdDsgZXZlcnl0aGluZyB1cCB0byB0aGVyZSB3YXMgZGVmaW5lZCBieSB1cy4gICovCisgIC8qIE5vdGUgdGhhdCB3ZSBwcmVzZXJ2ZSB0aGUgb3JkZXIgb2YgdGhlIHBhcmFtZXRlcnMsIHNvCisgICAgIHRoYXQgaW4gc29tZXRoaW5nIGxpa2UgImVudW0ge0ZPTywgTEFTVF9USElORz1GT099IiB3ZSBwcmludAorICAgICBGT08sIG5vdCBMQVNUX1RISU5HLiAgKi8KKyAgZm9yIChzeW1zID0gKnN5bWxpc3QsIG4gPSAwOyBzeW1zOyBzeW1zID0gc3ltcy0+bmV4dCkKKyAgICB7CisgICAgICBpbnQgaiA9IDA7CisgICAgICBpZiAoc3ltcyA9PSBvc3ltcykKKwlqID0gb19uc3ltczsKKyAgICAgIGZvciAoOyBqIDwgc3ltcy0+bnN5bXM7IGorKywgbisrKQorCXsKKwkgIHN0cnVjdCBzeW1ib2wgKnhzeW0gPSBzeW1zLT5zeW1ib2xbal07CisJICBUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIG4pID0gU1lNQk9MX05BTUUgKHhzeW0pOworCSAgVFlQRV9GSUVMRF9UWVBFICh0eXBlLCBuKSA9IFNZTUJPTF9UWVBFICh4c3ltKTsKKwkgIFRZUEVfRklFTERfQklUUE9TICh0eXBlLCBuKSA9IG47CisJICBUWVBFX0ZJRUxEX0JJVFNJWkUgKHR5cGUsIG4pID0gMDsKKwl9CisgICAgICBpZiAoc3ltcyA9PSBvc3ltcykKKwlicmVhazsKKyAgICB9CisgIHJldHVybiB0eXBlOworfQorCisvKiBSZWFkIGluIGFuZCBpbnRlcm5hbGl6ZSBhIHN0cnVjdHVyZSBkZWZpbml0aW9uLiAgKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2hwcmVhZF9yZWFkX3N0cnVjdF90eXBlIChocF90eXBlLCBkbl9idWZwLCBvYmpmaWxlKQorICAgICBkbnR0cG9pbnRlciBocF90eXBlOworICAgICB1bmlvbiBkbnR0ZW50cnkgKmRuX2J1ZnA7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBzdHJ1Y3QgbmV4dGZpZWxkCisgICAgeworICAgICAgc3RydWN0IG5leHRmaWVsZCAqbmV4dDsKKyAgICAgIHN0cnVjdCBmaWVsZCBmaWVsZDsKKyAgICB9OworCisgIHN0cnVjdCB0eXBlICp0eXBlOworICBzdHJ1Y3QgbmV4dGZpZWxkICpsaXN0ID0gMDsKKyAgc3RydWN0IG5leHRmaWVsZCAqbmV3OworICBpbnQgbiwgbmZpZWxkcyA9IDA7CisgIGRudHRwb2ludGVyIGZpZWxkOworICB1bmlvbiBkbnR0ZW50cnkgKmZpZWxkcDsKKworICAvKiBJcyBpdCBzb21ldGhpbmcgd2UndmUgYWxyZWFkeSBkZWFsdCB3aXRoPyAgKi8KKyAgdHlwZSA9IGhwcmVhZF9hbGxvY190eXBlIChocF90eXBlLCBvYmpmaWxlKTsKKyAgaWYgKChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9TVFJVQ1QpIHx8CisgICAgICAoVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfVU5JT04pKQorICAgICAgcmV0dXJuIHR5cGU7CisKKyAgLyogR2V0IHRoZSBiYXNpYyB0eXBlIGNvcnJlY3QuICAqLworICBpZiAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX1NUUlVDVCkKKyAgICB7CisgICAgICBUWVBFX0NPREUgKHR5cGUpID0gVFlQRV9DT0RFX1NUUlVDVDsKKyAgICAgIFRZUEVfTEVOR1RIICh0eXBlKSA9IGRuX2J1ZnAtPmRzdHJ1Y3QuYml0bGVuZ3RoIC8gODsKKyAgICB9CisgIGVsc2UgaWYgKGRuX2J1ZnAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9VTklPTikKKyAgICB7CisgICAgICBUWVBFX0NPREUgKHR5cGUpID0gVFlQRV9DT0RFX1VOSU9OOworICAgICAgVFlQRV9MRU5HVEggKHR5cGUpID0gZG5fYnVmcC0+ZHVuaW9uLmJpdGxlbmd0aCAvIDg7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIHR5cGU7CisKKworICBUWVBFX0ZMQUdTICh0eXBlKSAmPSB+VFlQRV9GTEFHX1NUVUI7CisKKyAgLyogUmVhZCBpbiBhbmQgaW50ZXJuYWxpemUgYWxsIHRoZSBmaWVsZHMuICAqLworICBmaWVsZCA9IGRuX2J1ZnAtPmRzdHJ1Y3QuZmlyc3RmaWVsZDsKKyAgd2hpbGUgKGZpZWxkLndvcmQgIT0gRE5UVE5JTCAmJiBmaWVsZC5kbnR0cC5leHRlbnNpb24pCisgICAgeworICAgICAgZmllbGRwID0gaHByZWFkX2dldF9sbnR0IChmaWVsZC5kbnR0cC5pbmRleCwgb2JqZmlsZSk7CisKKyAgICAgIC8qIEdldCBzcGFjZSB0byByZWNvcmQgdGhlIG5leHQgZmllbGQncyBkYXRhLiAgKi8KKyAgICAgIG5ldyA9IChzdHJ1Y3QgbmV4dGZpZWxkICopIGFsbG9jYSAoc2l6ZW9mIChzdHJ1Y3QgbmV4dGZpZWxkKSk7CisgICAgICBuZXctPm5leHQgPSBsaXN0OworICAgICAgbGlzdCA9IG5ldzsKKworICAgICAgbGlzdC0+ZmllbGQubmFtZSA9IFZUIChvYmpmaWxlKSArIGZpZWxkcC0+ZGZpZWxkLm5hbWU7CisgICAgICBGSUVMRF9CSVRQT1MgKGxpc3QtPmZpZWxkKSA9IGZpZWxkcC0+ZGZpZWxkLmJpdG9mZnNldDsKKyAgICAgIGlmIChmaWVsZHAtPmRmaWVsZC5iaXRsZW5ndGggJSA4KQorCUZJRUxEX0JJVFNJWkUgKGxpc3QtPmZpZWxkKSA9IGZpZWxkcC0+ZGZpZWxkLmJpdGxlbmd0aDsKKyAgICAgIGVsc2UKKwlGSUVMRF9CSVRTSVpFIChsaXN0LT5maWVsZCkgPSAwOworICAgICAgbmZpZWxkcysrOworICAgICAgZmllbGQgPSBmaWVsZHAtPmRmaWVsZC5uZXh0ZmllbGQ7CisgICAgICBGSUVMRF9UWVBFIChsaXN0LT5maWVsZCkgPSBocHJlYWRfdHlwZV9sb29rdXAgKGZpZWxkcC0+ZGZpZWxkLnR5cGUsCisJCQkJCQkgICAgIG9iamZpbGUpOworICAgIH0KKworICBUWVBFX05GSUVMRFMgKHR5cGUpID0gbmZpZWxkczsKKyAgVFlQRV9GSUVMRFMgKHR5cGUpID0gKHN0cnVjdCBmaWVsZCAqKQorICAgIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT50eXBlX29ic3RhY2ssIHNpemVvZiAoc3RydWN0IGZpZWxkKSAqIG5maWVsZHMpOworCisgIC8qIENvcHkgdGhlIHNhdmVkLXVwIGZpZWxkcyBpbnRvIHRoZSBmaWVsZCB2ZWN0b3IuICAqLworICBmb3IgKG4gPSBuZmllbGRzOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkKKyAgICB7CisgICAgICBuIC09IDE7CisgICAgICBUWVBFX0ZJRUxEICh0eXBlLCBuKSA9IGxpc3QtPmZpZWxkOworICAgIH0KKyAgcmV0dXJuIHR5cGU7Cit9CisKKy8qIFJlYWQgaW4gYW5kIGludGVybmFsaXplIGEgc2V0IGRlYnVnIHN5bWJvbC4gICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitocHJlYWRfcmVhZF9zZXRfdHlwZSAoaHBfdHlwZSwgZG5fYnVmcCwgb2JqZmlsZSkKKyAgICAgZG50dHBvaW50ZXIgaHBfdHlwZTsKKyAgICAgdW5pb24gZG50dGVudHJ5ICpkbl9idWZwOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IHR5cGUgKnR5cGU7CisKKyAgLyogU2VlIGlmIGl0J3Mgc29tZXRoaW5nIHdlJ3ZlIGFscmVhZHkgZGVhbCB3aXRoLiAgKi8KKyAgdHlwZSA9IGhwcmVhZF9hbGxvY190eXBlIChocF90eXBlLCBvYmpmaWxlKTsKKyAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1NFVCkKKyAgICByZXR1cm4gdHlwZTsKKworICAvKiBOb3BlLiAgRmlsbCBpbiB0aGUgYXBwcm9wcmlhdGUgZmllbGRzLiAgKi8KKyAgVFlQRV9DT0RFICh0eXBlKSA9IFRZUEVfQ09ERV9TRVQ7CisgIFRZUEVfTEVOR1RIICh0eXBlKSA9IGRuX2J1ZnAtPmRzZXQuYml0bGVuZ3RoIC8gODsKKyAgVFlQRV9ORklFTERTICh0eXBlKSA9IDA7CisgIFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpID0gaHByZWFkX3R5cGVfbG9va3VwIChkbl9idWZwLT5kc2V0LnN1YnR5cGUsCisJCQkJCQlvYmpmaWxlKTsKKyAgcmV0dXJuIHR5cGU7Cit9CisKKy8qIFJlYWQgaW4gYW5kIGludGVybmFsaXplIGFuIGFycmF5IGRlYnVnIHN5bWJvbC4gICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitocHJlYWRfcmVhZF9hcnJheV90eXBlIChocF90eXBlLCBkbl9idWZwLCBvYmpmaWxlKQorICAgICBkbnR0cG9pbnRlciBocF90eXBlOworICAgICB1bmlvbiBkbnR0ZW50cnkgKmRuX2J1ZnA7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgdW5pb24gZG50dGVudHJ5IHNhdmU7CisgIHNhdmUgPSAqZG5fYnVmcDsKKworICAvKiBXaHkgbm8gY2hlY2sgaGVyZT8gIEJlY2F1c2UgaXQga2VwdCB1cyBmcm9tIHByb3Blcmx5IGRldGVybWluaW5nCisgICAgIHRoZSBzaXplIG9mIHRoZSBhcnJheSEgICovCisgIHR5cGUgPSBocHJlYWRfYWxsb2NfdHlwZSAoaHBfdHlwZSwgb2JqZmlsZSk7CisKKyAgVFlQRV9DT0RFICh0eXBlKSA9IFRZUEVfQ09ERV9BUlJBWTsKKworICAvKiB2YWx1ZXMgYXJlIG5vdCBub3JtYWxpemVkLiAgKi8KKyAgaWYgKCEoKGRuX2J1ZnAtPmRhcnJheS5hcnJheWlzYnl0ZXMgJiYgZG5fYnVmcC0+ZGFycmF5LmVsZW1pc2J5dGVzKQorCXx8ICghZG5fYnVmcC0+ZGFycmF5LmFycmF5aXNieXRlcyAmJiAhZG5fYnVmcC0+ZGFycmF5LmVsZW1pc2J5dGVzKSkpCisgICAgYWJvcnQgKCk7CisgIGVsc2UgaWYgKGRuX2J1ZnAtPmRhcnJheS5hcnJheWxlbmd0aCA9PSAweDdmZmZmZmZmKQorICAgIHsKKyAgICAgIC8qIFRoZSBIUCBkZWJ1ZyBmb3JtYXQgcmVwcmVzZW50cyBjaGFyIGZvb1tdOyBhcyBhbiBhcnJheSB3aXRoCisJIGxlbmd0aCAweDdmZmZmZmZmLiAgSW50ZXJuYWxseSBHREIgd2FudHMgdG8gcmVwcmVzZW50IHRoaXMKKwkgYXMgYW4gYXJyYXkgb2YgbGVuZ3RoIHplcm8uICAqLworICAgICBUWVBFX0xFTkdUSCAodHlwZSkgPSAwOworICAgIH0KKyAgZWxzZQorICAgIFRZUEVfTEVOR1RIICh0eXBlKSA9IGRuX2J1ZnAtPmRhcnJheS5hcnJheWxlbmd0aCAvIDg7CisKKyAgVFlQRV9ORklFTERTICh0eXBlKSA9IDE7CisgIFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpID0gaHByZWFkX3R5cGVfbG9va3VwIChkbl9idWZwLT5kYXJyYXkuZWxlbXR5cGUsCisJCQkJCQlvYmpmaWxlKTsKKyAgZG5fYnVmcCA9ICZzYXZlOworICBUWVBFX0ZJRUxEUyAodHlwZSkgPSAoc3RydWN0IGZpZWxkICopCisgICAgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnR5cGVfb2JzdGFjaywgc2l6ZW9mIChzdHJ1Y3QgZmllbGQpKTsKKyAgVFlQRV9GSUVMRF9UWVBFICh0eXBlLCAwKSA9IGhwcmVhZF90eXBlX2xvb2t1cCAoZG5fYnVmcC0+ZGFycmF5LmluZGV4dHlwZSwKKwkJCQkJCSAgb2JqZmlsZSk7CisgIHJldHVybiB0eXBlOworfQorCisvKiBSZWFkIGluIGFuZCBpbnRlcm5hbGl6ZSBhIHN1YnJhbmdlIGRlYnVnIHN5bWJvbC4gICovCitzdGF0aWMgc3RydWN0IHR5cGUgKgoraHByZWFkX3JlYWRfc3VicmFuZ2VfdHlwZSAoaHBfdHlwZSwgZG5fYnVmcCwgb2JqZmlsZSkKKyAgICAgZG50dHBvaW50ZXIgaHBfdHlwZTsKKyAgICAgdW5pb24gZG50dGVudHJ5ICpkbl9idWZwOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IHR5cGUgKnR5cGU7CisKKyAgLyogSXMgaXQgc29tZXRoaW5nIHdlJ3ZlIGFscmVhZHkgZGVhbHQgd2l0aC4gICovCisgIHR5cGUgPSBocHJlYWRfYWxsb2NfdHlwZSAoaHBfdHlwZSwgb2JqZmlsZSk7CisgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9SQU5HRSkKKyAgICByZXR1cm4gdHlwZTsKKworICAvKiBOb3BlLCBpbnRlcm5hbGl6ZSBpdC4gICovCisgIFRZUEVfQ09ERSAodHlwZSkgPSBUWVBFX0NPREVfUkFOR0U7CisgIFRZUEVfTEVOR1RIICh0eXBlKSA9IGRuX2J1ZnAtPmRzdWJyLmJpdGxlbmd0aCAvIDg7CisgIFRZUEVfTkZJRUxEUyAodHlwZSkgPSAyOworICBUWVBFX0ZJRUxEUyAodHlwZSkKKyAgICA9IChzdHJ1Y3QgZmllbGQgKikgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnR5cGVfb2JzdGFjaywKKwkJCQkgICAgICAyICogc2l6ZW9mIChzdHJ1Y3QgZmllbGQpKTsKKworICBpZiAoZG5fYnVmcC0+ZHN1YnIuZHluX2xvdykKKyAgICBUWVBFX0ZJRUxEX0JJVFBPUyAodHlwZSwgMCkgPSAwOworICBlbHNlCisgICAgVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIDApID0gZG5fYnVmcC0+ZHN1YnIubG93Ym91bmQ7CisKKyAgaWYgKGRuX2J1ZnAtPmRzdWJyLmR5bl9oaWdoKQorICAgIFRZUEVfRklFTERfQklUUE9TICh0eXBlLCAxKSA9IC0xOworICBlbHNlCisgICAgVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIDEpID0gZG5fYnVmcC0+ZHN1YnIuaGlnaGJvdW5kOworICBUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSA9IGhwcmVhZF90eXBlX2xvb2t1cCAoZG5fYnVmcC0+ZHN1YnIuc3VidHlwZSwKKwkJCQkJCW9iamZpbGUpOworICByZXR1cm4gdHlwZTsKK30KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2hwcmVhZF90eXBlX2xvb2t1cCAoaHBfdHlwZSwgb2JqZmlsZSkKKyAgICAgZG50dHBvaW50ZXIgaHBfdHlwZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHVuaW9uIGRudHRlbnRyeSAqZG5fYnVmcDsKKworICAvKiBGaXJzdCBzZWUgaWYgaXQncyBhIHNpbXBsZSBidWlsdGluIHR5cGUuICAqLworICBpZiAoaHBfdHlwZS5kbnR0aS5pbW1lZGlhdGUpCisgICAgcmV0dXJuIGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCBocHJlYWRfdHlwZV90cmFuc2xhdGUgKGhwX3R5cGUpKTsKKworICAvKiBOb3QgYSBidWlsdGluIHR5cGUuICBXZSdsbCBoYXZlIHRvIHJlYWQgaXQgaW4uICAqLworICBpZiAoaHBfdHlwZS5kbnR0cC5pbmRleCA8IExOVFRfU1lNQ09VTlQgKG9iamZpbGUpKQorICAgIGRuX2J1ZnAgPSBocHJlYWRfZ2V0X2xudHQgKGhwX3R5cGUuZG50dHAuaW5kZXgsIG9iamZpbGUpOworICBlbHNlCisgICAgcmV0dXJuIGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCBGVF9WT0lEKTsKKworICBzd2l0Y2ggKGRuX2J1ZnAtPmRibG9jay5raW5kKQorICAgIHsKKyAgICBjYXNlIEROVFRfVFlQRV9TUkNGSUxFOgorICAgIGNhc2UgRE5UVF9UWVBFX01PRFVMRToKKyAgICBjYXNlIEROVFRfVFlQRV9GVU5DVElPTjoKKyAgICBjYXNlIEROVFRfVFlQRV9FTlRSWToKKyAgICBjYXNlIEROVFRfVFlQRV9CRUdJTjoKKyAgICBjYXNlIEROVFRfVFlQRV9FTkQ6CisgICAgY2FzZSBETlRUX1RZUEVfSU1QT1JUOgorICAgIGNhc2UgRE5UVF9UWVBFX0xBQkVMOgorICAgIGNhc2UgRE5UVF9UWVBFX1dJVEg6CisgICAgY2FzZSBETlRUX1RZUEVfQ09NTU9OOgorICAgIGNhc2UgRE5UVF9UWVBFX0ZQQVJBTToKKyAgICBjYXNlIEROVFRfVFlQRV9TVkFSOgorICAgIGNhc2UgRE5UVF9UWVBFX0RWQVI6CisgICAgY2FzZSBETlRUX1RZUEVfQ09OU1Q6CisgICAgICAvKiBPcHBzLiAgU29tZXRoaW5nIHdlbnQgdmVyeSB3cm9uZy4gICovCisgICAgICByZXR1cm4gbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUgKG9iamZpbGUsIEZUX1ZPSUQpOworCisgICAgY2FzZSBETlRUX1RZUEVfVFlQRURFRjoKKyAgICAgIHsKKwlzdHJ1Y3QgdHlwZSAqc3RydWN0dHlwZSA9IGhwcmVhZF90eXBlX2xvb2t1cCAoZG5fYnVmcC0+ZHR5cGUudHlwZSwKKwkJCQkJCSAgICAgIG9iamZpbGUpOworCWNoYXIgKnN1ZmZpeDsKKwlzdWZmaXggPSBWVCAob2JqZmlsZSkgKyBkbl9idWZwLT5kdHlwZS5uYW1lOworCisJVFlQRV9DUExVU19TUEVDSUZJQyAoc3RydWN0dHlwZSkKKwkgID0gKHN0cnVjdCBjcGx1c19zdHJ1Y3RfdHlwZSAqKSAmY3BsdXNfc3RydWN0X2RlZmF1bHQ7CisgCVRZUEVfTkFNRSAoc3RydWN0dHlwZSkgPSBzdWZmaXg7CisJcmV0dXJuIHN0cnVjdHR5cGU7CisgICAgICB9CisKKyAgICBjYXNlIEROVFRfVFlQRV9UQUdERUY6CisgICAgICB7CisJLyogSnVzdCBhIGxpdHRsZSBkaWZmZXJlbnQgZnJvbSBhYm92ZS4gIFdlIGhhdmUgdG8gdGFjayBvbgorCSAgIGFuIGlkZW50aWZpZXIgb2Ygc29tZSBraW5kIChzdHJ1Y3QsIHVuaW9uLCBlbnVtLCBldGMpLiAgKi8KKwlzdHJ1Y3QgdHlwZSAqc3RydWN0dHlwZSA9IGhwcmVhZF90eXBlX2xvb2t1cCAoZG5fYnVmcC0+ZHR5cGUudHlwZSwKKwkJCQkJCSAgICAgIG9iamZpbGUpOworCWNoYXIgKnByZWZpeCwgKnN1ZmZpeDsKKwlzdWZmaXggPSBWVCAob2JqZmlsZSkgKyBkbl9idWZwLT5kdHlwZS5uYW1lOworCisJLyogTG9va3VwIHRoZSBuZXh0IHR5cGUgaW4gdGhlIGxpc3QuICBJdCBzaG91bGQgYmUgYSBzdHJ1Y3R1cmUsCisJICAgdW5pb24sIG9yIGVudW0gdHlwZS4gIFdlIHdpbGwgbmVlZCB0byBhdHRhY2ggdGhhdCB0byBvdXIgbmFtZS4gICovCisJaWYgKGRuX2J1ZnAtPmR0eXBlLnR5cGUuZG50dHAuaW5kZXggPCBMTlRUX1NZTUNPVU5UIChvYmpmaWxlKSkKKwkgIGRuX2J1ZnAgPSBocHJlYWRfZ2V0X2xudHQgKGRuX2J1ZnAtPmR0eXBlLnR5cGUuZG50dHAuaW5kZXgsIG9iamZpbGUpOworCWVsc2UKKwkgIGFib3J0ICgpOworCisJaWYgKGRuX2J1ZnAtPmRibG9jay5raW5kID09IEROVFRfVFlQRV9TVFJVQ1QpCisJICBwcmVmaXggPSAic3RydWN0ICI7CisJZWxzZSBpZiAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgPT0gRE5UVF9UWVBFX1VOSU9OKQorCSAgcHJlZml4ID0gInVuaW9uICI7CisJZWxzZQorCSAgcHJlZml4ID0gImVudW0gIjsKKworCS8qIEJ1aWxkIHRoZSBjb3JyZWN0IG5hbWUuICAqLworCXN0cnVjdHR5cGUtPm5hbWUKKwkgID0gKGNoYXIgKikgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnR5cGVfb2JzdGFjaywKKwkJCQkgICAgc3RybGVuIChwcmVmaXgpICsgc3RybGVuIChzdWZmaXgpICsgMSk7CisJVFlQRV9OQU1FIChzdHJ1Y3R0eXBlKSA9IHN0cmNweSAoVFlQRV9OQU1FIChzdHJ1Y3R0eXBlKSwgcHJlZml4KTsKKwlUWVBFX05BTUUgKHN0cnVjdHR5cGUpID0gc3RyY2F0IChUWVBFX05BTUUgKHN0cnVjdHR5cGUpLCBzdWZmaXgpOworCVRZUEVfVEFHX05BTUUgKHN0cnVjdHR5cGUpID0gc3VmZml4OworCisJVFlQRV9DUExVU19TUEVDSUZJQyAoc3RydWN0dHlwZSkKKwkgID0gKHN0cnVjdCBjcGx1c19zdHJ1Y3RfdHlwZSAqKSAmY3BsdXNfc3RydWN0X2RlZmF1bHQ7CisKKwlyZXR1cm4gc3RydWN0dHlwZTsKKyAgICAgIH0KKyAgICBjYXNlIEROVFRfVFlQRV9QT0lOVEVSOgorICAgICAgcmV0dXJuIGxvb2t1cF9wb2ludGVyX3R5cGUgKGhwcmVhZF90eXBlX2xvb2t1cCAoZG5fYnVmcC0+ZHB0ci5wb2ludHN0bywKKwkJCQkJCSAgICAgIG9iamZpbGUpKTsKKyAgICBjYXNlIEROVFRfVFlQRV9FTlVNOgorICAgICAgcmV0dXJuIGhwcmVhZF9yZWFkX2VudW1fdHlwZSAoaHBfdHlwZSwgZG5fYnVmcCwgb2JqZmlsZSk7CisgICAgY2FzZSBETlRUX1RZUEVfTUVNRU5VTToKKyAgICAgIHJldHVybiBsb29rdXBfZnVuZGFtZW50YWxfdHlwZSAob2JqZmlsZSwgRlRfVk9JRCk7CisgICAgY2FzZSBETlRUX1RZUEVfU0VUOgorICAgICAgcmV0dXJuIGhwcmVhZF9yZWFkX3NldF90eXBlIChocF90eXBlLCBkbl9idWZwLCBvYmpmaWxlKTsKKyAgICBjYXNlIEROVFRfVFlQRV9TVUJSQU5HRToKKyAgICAgIHJldHVybiBocHJlYWRfcmVhZF9zdWJyYW5nZV90eXBlIChocF90eXBlLCBkbl9idWZwLCBvYmpmaWxlKTsKKyAgICBjYXNlIEROVFRfVFlQRV9BUlJBWToKKyAgICAgIHJldHVybiBocHJlYWRfcmVhZF9hcnJheV90eXBlIChocF90eXBlLCBkbl9idWZwLCBvYmpmaWxlKTsKKyAgICBjYXNlIEROVFRfVFlQRV9TVFJVQ1Q6CisgICAgY2FzZSBETlRUX1RZUEVfVU5JT046CisgICAgICByZXR1cm4gaHByZWFkX3JlYWRfc3RydWN0X3R5cGUgKGhwX3R5cGUsIGRuX2J1ZnAsIG9iamZpbGUpOworICAgIGNhc2UgRE5UVF9UWVBFX0ZJRUxEOgorICAgICAgcmV0dXJuIGhwcmVhZF90eXBlX2xvb2t1cCAoZG5fYnVmcC0+ZGZpZWxkLnR5cGUsIG9iamZpbGUpOworICAgIGNhc2UgRE5UVF9UWVBFX1ZBUklBTlQ6CisgICAgY2FzZSBETlRUX1RZUEVfRklMRToKKyAgICAgIHJldHVybiBsb29rdXBfZnVuZGFtZW50YWxfdHlwZSAob2JqZmlsZSwgRlRfVk9JRCk7CisgICAgY2FzZSBETlRUX1RZUEVfRlVOQ1RZUEU6CisgICAgICByZXR1cm4gbG9va3VwX2Z1bmN0aW9uX3R5cGUgKGhwcmVhZF90eXBlX2xvb2t1cCAoZG5fYnVmcC0+ZGZ1bmN0eXBlLnJldHZhbCwKKwkJCQkJCSAgICAgICBvYmpmaWxlKSk7CisgICAgY2FzZSBETlRUX1RZUEVfQ09CU1RSVUNUOgorICAgIGNhc2UgRE5UVF9UWVBFX1hSRUY6CisgICAgY2FzZSBETlRUX1RZUEVfU0E6CisgICAgY2FzZSBETlRUX1RZUEVfTUFDUk86CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBsb29rdXBfZnVuZGFtZW50YWxfdHlwZSAob2JqZmlsZSwgRlRfVk9JRCk7CisgICAgfQorfQorCitzdGF0aWMgc2x0cG9pbnRlcgoraHByZWFkX3JlY29yZF9saW5lcyAoc3ViZmlsZSwgc19pZHgsIGVfaWR4LCBvYmpmaWxlLCBvZmZzZXQpCisgICAgIHN0cnVjdCBzdWJmaWxlICpzdWJmaWxlOworICAgICBzbHRwb2ludGVyIHNfaWR4LCBlX2lkeDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIENPUkVfQUREUiBvZmZzZXQ7Cit7CisgIHVuaW9uIHNsdGVudHJ5ICpzbF9idWZwOworCisgIHdoaWxlIChzX2lkeCA8PSBlX2lkeCkKKyAgICB7CisgICAgICBzbF9idWZwID0gaHByZWFkX2dldF9zbHQgKHNfaWR4LCBvYmpmaWxlKTsKKyAgICAgIC8qIE9ubHkgcmVjb3JkICJub3JtYWwiIGVudHJpZXMgaW4gdGhlIFNMVC4gICovCisgICAgICBpZiAoc2xfYnVmcC0+c25vcm0uc2x0ZGVzYyA9PSBTTFRfTk9STUFMCisJICB8fCBzbF9idWZwLT5zbm9ybS5zbHRkZXNjID09IFNMVF9FWElUKQorCXJlY29yZF9saW5lIChzdWJmaWxlLCBzbF9idWZwLT5zbm9ybS5saW5lLAorCQkgICAgIHNsX2J1ZnAtPnNub3JtLmFkZHJlc3MgKyBvZmZzZXQpOworICAgICAgc19pZHgrKzsKKyAgICB9CisgIHJldHVybiBlX2lkeDsKK30KKworLyogSW50ZXJuYWxpemUgb25lIG5hdGl2ZSBkZWJ1ZyBzeW1ib2wuICAqLworCitzdGF0aWMgdm9pZAoraHByZWFkX3Byb2Nlc3Nfb25lX2RlYnVnX3N5bWJvbCAoZG5fYnVmcCwgbmFtZSwgc2VjdGlvbl9vZmZzZXRzLCBvYmpmaWxlLAorCQkJCSB0ZXh0X29mZnNldCwgdGV4dF9zaXplLCBmaWxlbmFtZSwgaW5kZXgpCisgICAgIHVuaW9uIGRudHRlbnRyeSAqZG5fYnVmcDsKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgQ09SRV9BRERSIHRleHRfb2Zmc2V0OworICAgICBpbnQgdGV4dF9zaXplOworICAgICBjaGFyICpmaWxlbmFtZTsKKyAgICAgaW50IGluZGV4OworeworICB1bnNpZ25lZCBsb25nIGRlc2M7CisgIGludCB0eXBlOworICBDT1JFX0FERFIgdmFsdTsKKyAgaW50IG9mZnNldCA9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOworICB1bmlvbiBkbnR0ZW50cnkgKmRuX3RlbXA7CisgIGRudHRwb2ludGVyIGhwX3R5cGU7CisgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgc3RydWN0IGNvbnRleHRfc3RhY2sgKm5ldzsKKworICAvKiBBbGxvY2F0ZSBvbmUgR0RCIGRlYnVnIHN5bWJvbCBhbmQgZmlsbCBpbiBzb21lIGRlZmF1bHQgdmFsdWVzLiAgKi8KKyAgc3ltID0gKHN0cnVjdCBzeW1ib2wgKikgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrLAorCQkJCQkgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisgIG1lbXNldCAoc3ltLCAwLCBzaXplb2YgKHN0cnVjdCBzeW1ib2wpKTsKKyAgU1lNQk9MX05BTUUgKHN5bSkgPSBvYnNhdmVzdHJpbmcgKG5hbWUsIHN0cmxlbiAobmFtZSksICZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjayk7CisgIFNZTUJPTF9MQU5HVUFHRSAoc3ltKSA9IGxhbmd1YWdlX2F1dG87CisgIFNZTUJPTF9JTklUX0RFTUFOR0xFRF9OQU1FIChzeW0sICZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjayk7CisgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworICBTWU1CT0xfTElORSAoc3ltKSA9IDA7CisgIFNZTUJPTF9WQUxVRSAoc3ltKSA9IDA7CisgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19UWVBFREVGOworCisgIGhwX3R5cGUuZG50dHAuZXh0ZW5zaW9uID0gMTsKKyAgaHBfdHlwZS5kbnR0cC5pbW1lZGlhdGUgPSAwOworICBocF90eXBlLmRudHRwLmdsb2JhbCA9IDA7CisgIGhwX3R5cGUuZG50dHAuaW5kZXggPSBpbmRleDsKKworICB0eXBlID0gZG5fYnVmcC0+ZGJsb2NrLmtpbmQ7CisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIEROVFRfVFlQRV9TUkNGSUxFOgorICAgICAgLyogVGhpcyB0eXBlIG9mIHN5bWJvbCBpbmRpY2F0ZXMgZnJvbSB3aGljaCBzb3VyY2UgZmlsZSBvciBpbmNsdWRlIGZpbGUKKyAgICAgICAgIHRoZSBmb2xsb3dpbmcgZGF0YSBjb21lcy4gSWYgdGhlcmUgYXJlIG5vIG1vZHVsZXMgaXQgYWxzbyBtYXkKKyAgICAgICAgIGluZGljYXRlIHRoZSBzdGFydCBvZiBhIG5ldyBzb3VyY2UgZmlsZSwgaW4gd2hpY2ggY2FzZSB3ZSBtdXN0CisgICAgICAgICBmaW5pc2ggdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUgcHJldmlvdXMgc291cmNlIGZpbGUKKyAgICAgICAgIChpZiBhbnkpIGFuZCBzdGFydCBhY2N1bXVsYXRpbmcgYSBuZXcgc3ltYm9sIHRhYmxlLiAgKi8KKworICAgICAgdmFsdSA9IHRleHRfb2Zmc2V0OworICAgICAgaWYgKCFsYXN0X3NvdXJjZV9maWxlKQorCXsKKwkgIHN0YXJ0X3N5bXRhYiAobmFtZSwgTlVMTCwgdmFsdSk7CisJICByZWNvcmRfZGVidWdmb3JtYXQgKCJIUCIpOworCSAgU0xfSU5ERVggKG9iamZpbGUpID0gZG5fYnVmcC0+ZHNmaWxlLmFkZHJlc3M7CisJfQorICAgICAgZWxzZQorCXsKKwkgIFNMX0lOREVYIChvYmpmaWxlKSA9IGhwcmVhZF9yZWNvcmRfbGluZXMgKGN1cnJlbnRfc3ViZmlsZSwKKwkJCQkJCSAgICBTTF9JTkRFWCAob2JqZmlsZSksCisJCQkJCQkgICAgZG5fYnVmcC0+ZHNmaWxlLmFkZHJlc3MsCisJCQkJCQkgICAgb2JqZmlsZSwgb2Zmc2V0KTsKKwl9CisgICAgICBzdGFydF9zdWJmaWxlIChuYW1lLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBETlRUX1RZUEVfTU9EVUxFOgorICAgICAgLyogTm8gbmVlZCB0byBkbyBhbnl0aGluZyB3aXRoIHRoZXNlIEROVFRfVFlQRV9NT0RVTEUgc3ltYm9scyBhbnltb3JlLiAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBETlRUX1RZUEVfRlVOQ1RJT046CisgICAgY2FzZSBETlRUX1RZUEVfRU5UUlk6CisgICAgICAvKiBBIGZ1bmN0aW9uIG9yIHNlY29uZGFyeSBlbnRyeSBwb2ludC4gICovCisgICAgICB2YWx1ID0gZG5fYnVmcC0+ZGZ1bmMubG93YWRkciArIG9mZnNldDsKKyAgICAgIFNMX0lOREVYIChvYmpmaWxlKSA9IGhwcmVhZF9yZWNvcmRfbGluZXMgKGN1cnJlbnRfc3ViZmlsZSwKKwkJCQkJCVNMX0lOREVYIChvYmpmaWxlKSwKKwkJCQkJCWRuX2J1ZnAtPmRmdW5jLmFkZHJlc3MsCisJCQkJCQlvYmpmaWxlLCBvZmZzZXQpOworICAgICAgCisgICAgICBXSVRISU5fRlVOQ1RJT04gKG9iamZpbGUpID0gMTsKKyAgICAgIENVUlJFTlRfRlVOQ1RJT05fVkFMVUUgKG9iamZpbGUpID0gdmFsdTsKKworICAgICAgLyogU3RhY2sgbXVzdCBiZSBlbXB0eSBub3cuICAqLworICAgICAgaWYgKGNvbnRleHRfc3RhY2tfZGVwdGggIT0gMCkKKwljb21wbGFpbiAoJmxicmFjX3VubWF0Y2hlZF9jb21wbGFpbnQsIChjaGFyICopIHN5bW51bSk7CisgICAgICBuZXcgPSBwdXNoX2NvbnRleHQgKDAsIHZhbHUpOworCisgICAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfQkxPQ0s7CisgICAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IGhwcmVhZF9yZWFkX2Z1bmN0aW9uX3R5cGUgKGhwX3R5cGUsIGRuX2J1ZnAsIG9iamZpbGUpOworICAgICAgaWYgKGRuX2J1ZnAtPmRmdW5jLmdsb2JhbCkKKwlhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmdsb2JhbF9zeW1ib2xzKTsKKyAgICAgIGVsc2UKKwlhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmZpbGVfc3ltYm9scyk7CisgICAgICBuZXctPm5hbWUgPSBzeW07CisKKyAgICAgIC8qIFNlYXJjaCBmb3J3YXJkIHRvIHRoZSBuZXh0IHNjb3BlIGJlZ2lubmluZy4gICovCisgICAgICB3aGlsZSAoZG5fYnVmcC0+ZGJsb2NrLmtpbmQgIT0gRE5UVF9UWVBFX0JFR0lOKQorCXsKKwkgIGRuX2J1ZnAgPSBocHJlYWRfZ2V0X2xudHQgKCsraW5kZXgsIG9iamZpbGUpOworCSAgaWYgKGRuX2J1ZnAtPmRibG9jay5leHRlbnNpb24pCisJICAgIGNvbnRpbnVlOworCX0KKyAgICAgIFNMX0lOREVYIChvYmpmaWxlKSA9IGhwcmVhZF9yZWNvcmRfbGluZXMgKGN1cnJlbnRfc3ViZmlsZSwKKwkJCQkJCVNMX0lOREVYIChvYmpmaWxlKSwKKwkJCQkJCWRuX2J1ZnAtPmRiZWdpbi5hZGRyZXNzLAorCQkJCQkJb2JqZmlsZSwgb2Zmc2V0KTsKKyAgICAgIFNZTUJPTF9MSU5FIChzeW0pID0gaHByZWFkX2dldF9saW5lIChkbl9idWZwLT5kYmVnaW4uYWRkcmVzcywgb2JqZmlsZSk7CisgICAgICByZWNvcmRfbGluZSAoY3VycmVudF9zdWJmaWxlLCBTWU1CT0xfTElORSAoc3ltKSwgdmFsdSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRE5UVF9UWVBFX0JFR0lOOgorICAgICAgLyogQmVnaW4gYSBuZXcgc2NvcGUuICAqLworICAgICAgU0xfSU5ERVggKG9iamZpbGUpID0gaHByZWFkX3JlY29yZF9saW5lcyAoY3VycmVudF9zdWJmaWxlLAorCQkJCQkJU0xfSU5ERVggKG9iamZpbGUpLAorCQkJCQkJZG5fYnVmcC0+ZGJlZ2luLmFkZHJlc3MsCisJCQkJCQlvYmpmaWxlLCBvZmZzZXQpOworICAgICAgdmFsdSA9IGhwcmVhZF9nZXRfbG9jYXRpb24gKGRuX2J1ZnAtPmRiZWdpbi5hZGRyZXNzLCBvYmpmaWxlKTsKKyAgICAgIHZhbHUgKz0gb2Zmc2V0OwkJLyogUmVsb2NhdGUgZm9yIGR5bmFtaWMgbG9hZGluZyAqLworICAgICAgZGVzYyA9IGhwcmVhZF9nZXRfZGVwdGggKGRuX2J1ZnAtPmRiZWdpbi5hZGRyZXNzLCBvYmpmaWxlKTsKKyAgICAgIG5ldyA9IHB1c2hfY29udGV4dCAoZGVzYywgdmFsdSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRE5UVF9UWVBFX0VORDoKKyAgICAgIC8qIEVuZCBhIHNjb3BlLiAgKi8KKyAgICAgIFNMX0lOREVYIChvYmpmaWxlKSA9IGhwcmVhZF9yZWNvcmRfbGluZXMgKGN1cnJlbnRfc3ViZmlsZSwKKwkJCQkJCVNMX0lOREVYIChvYmpmaWxlKSwKKwkJCQkJCWRuX2J1ZnAtPmRlbmQuYWRkcmVzcyArIDEsCisJCQkJCQlvYmpmaWxlLCBvZmZzZXQpOworICAgICAgc3dpdGNoIChkbl9idWZwLT5kZW5kLmVuZGtpbmQpCisJeworCWNhc2UgRE5UVF9UWVBFX01PRFVMRToKKwkgIC8qIEVuZGluZyBhIG1vZHVsZSBlbmRzIHRoZSBzeW1ib2wgdGFibGUgZm9yIHRoYXQgbW9kdWxlLiAgKi8KKwkgIHZhbHUgPSB0ZXh0X29mZnNldCArIHRleHRfc2l6ZSArIG9mZnNldDsKKwkgICh2b2lkKSBlbmRfc3ltdGFiICh2YWx1LCBvYmpmaWxlLCAwKTsKKwkgIGJyZWFrOworCisJY2FzZSBETlRUX1RZUEVfRlVOQ1RJT046CisJICAvKiBFbmRpbmcgYSBmdW5jdGlvbiwgd2VsbCwgZW5kcyB0aGUgZnVuY3Rpb24ncyBzY29wZS4gICovCisJICBkbl90ZW1wID0gaHByZWFkX2dldF9sbnR0IChkbl9idWZwLT5kZW5kLmJlZ2luc2NvcGUuZG50dHAuaW5kZXgsCisJCQkJICAgICBvYmpmaWxlKTsKKwkgIHZhbHUgPSBkbl90ZW1wLT5kZnVuYy5oaWFkZHIgKyBvZmZzZXQ7CisJICBuZXcgPSBwb3BfY29udGV4dCAoKTsKKwkgIC8qIE1ha2UgYSBibG9jayBmb3IgdGhlIGxvY2FsIHN5bWJvbHMgd2l0aGluLiAgKi8KKwkgIGZpbmlzaF9ibG9jayAobmV3LT5uYW1lLCAmbG9jYWxfc3ltYm9scywgbmV3LT5vbGRfYmxvY2tzLAorCQkJbmV3LT5zdGFydF9hZGRyLCB2YWx1LCBvYmpmaWxlKTsKKwkgIFdJVEhJTl9GVU5DVElPTiAob2JqZmlsZSkgPSAwOworCSAgYnJlYWs7CisJY2FzZSBETlRUX1RZUEVfQkVHSU46CisJICAvKiBKdXN0IGVuZGluZyBhIGxvY2FsIHNjb3BlLiAgKi8KKwkgIHZhbHUgPSBocHJlYWRfZ2V0X2xvY2F0aW9uIChkbl9idWZwLT5kZW5kLmFkZHJlc3MsIG9iamZpbGUpOworCSAgLyogV2h5IGluIHRoZSBoZWxsIGlzIHRoaXMgbmVlZGVkPyAgKi8KKwkgIHZhbHUgKz0gb2Zmc2V0ICsgOTsJLyogUmVsb2NhdGUgZm9yIGR5bmFtaWMgbG9hZGluZyAqLworCSAgbmV3ID0gcG9wX2NvbnRleHQgKCk7CisJICBkZXNjID0gZG5fYnVmcC0+ZGVuZC5iZWdpbnNjb3BlLmRudHRwLmluZGV4OworCSAgaWYgKGRlc2MgIT0gbmV3LT5kZXB0aCkKKwkgICAgY29tcGxhaW4gKCZsYnJhY19taXNtYXRjaF9jb21wbGFpbnQsIChjaGFyICopIHN5bW51bSk7CisJICAvKiBNYWtlIGEgYmxvY2sgZm9yIHRoZSBsb2NhbCBzeW1ib2xzIHdpdGhpbi4gICovCisJICBmaW5pc2hfYmxvY2sgKG5ldy0+bmFtZSwgJmxvY2FsX3N5bWJvbHMsIG5ldy0+b2xkX2Jsb2NrcywKKwkJCW5ldy0+c3RhcnRfYWRkciwgdmFsdSwgb2JqZmlsZSk7CisJICBsb2NhbF9zeW1ib2xzID0gbmV3LT5sb2NhbHM7CisJICBicmVhazsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIEROVFRfVFlQRV9MQUJFTDoKKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBMQUJFTF9OQU1FU1BBQ0U7CisgICAgICBicmVhazsKKyAgICBjYXNlIEROVFRfVFlQRV9GUEFSQU06CisgICAgICAvKiBGdW5jdGlvbiBwYXJhbWV0ZXJzLiAgKi8KKyAgICAgIGlmIChkbl9idWZwLT5kZnBhcmFtLnJlZ3BhcmFtKQorCVNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19SRUdJU1RFUjsKKyAgICAgIGVsc2UKKwlTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfTE9DQUw7CisgICAgICBpZiAoZG5fYnVmcC0+ZGZwYXJhbS5jb3B5cGFyYW0pCisJeworCSAgU1lNQk9MX1ZBTFVFIChzeW0pID0gZG5fYnVmcC0+ZGZwYXJhbS5sb2NhdGlvbjsKKyNpZmRlZiBIUFJFQURfQURKVVNUX1NUQUNLX0FERFJFU1MKKwkgIFNZTUJPTF9WQUxVRSAoc3ltKQorCSAgICArPSBIUFJFQURfQURKVVNUX1NUQUNLX0FERFJFU1MgKENVUlJFTlRfRlVOQ1RJT05fVkFMVUUgKG9iamZpbGUpKTsKKyNlbmRpZgorCX0KKyAgICAgIGVsc2UKKwlTWU1CT0xfVkFMVUUgKHN5bSkgPSBkbl9idWZwLT5kZnBhcmFtLmxvY2F0aW9uOworICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSBocHJlYWRfdHlwZV9sb29rdXAgKGRuX2J1ZnAtPmRmcGFyYW0udHlwZSwgb2JqZmlsZSk7CisgICAgICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmxvY2FsX3N5bWJvbHMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBETlRUX1RZUEVfU1ZBUjoKKyAgICAgIC8qIFN0YXRpYyB2YXJpYWJsZXMuICAqLworICAgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX1NUQVRJQzsKKyAgICAgIFNZTUJPTF9WQUxVRV9BRERSRVNTIChzeW0pID0gZG5fYnVmcC0+ZHN2YXIubG9jYXRpb247CisgICAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IGhwcmVhZF90eXBlX2xvb2t1cCAoZG5fYnVmcC0+ZHN2YXIudHlwZSwgb2JqZmlsZSk7CisgICAgICBpZiAoZG5fYnVmcC0+ZHN2YXIuZ2xvYmFsKQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZ2xvYmFsX3N5bWJvbHMpOworICAgICAgZWxzZSBpZiAoV0lUSElOX0ZVTkNUSU9OIChvYmpmaWxlKSkKKwlhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmxvY2FsX3N5bWJvbHMpOworICAgICAgZWxzZQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZmlsZV9zeW1ib2xzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRE5UVF9UWVBFX0RWQVI6CisgICAgICAvKiBEeW5hbWljIHZhcmlhYmxlcy4gICovCisgICAgICBpZiAoZG5fYnVmcC0+ZGR2YXIucmVndmFyKQorCVNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19SRUdJU1RFUjsKKyAgICAgIGVsc2UKKwlTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfTE9DQUw7CisgICAgICBTWU1CT0xfVkFMVUUgKHN5bSkgPSBkbl9idWZwLT5kZHZhci5sb2NhdGlvbjsKKyNpZmRlZiBIUFJFQURfQURKVVNUX1NUQUNLX0FERFJFU1MKKyAgICAgIFNZTUJPTF9WQUxVRSAoc3ltKQorCSs9IEhQUkVBRF9BREpVU1RfU1RBQ0tfQUREUkVTUyAoQ1VSUkVOVF9GVU5DVElPTl9WQUxVRSAob2JqZmlsZSkpOworI2VuZGlmCisgICAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IGhwcmVhZF90eXBlX2xvb2t1cCAoZG5fYnVmcC0+ZGR2YXIudHlwZSwgb2JqZmlsZSk7CisgICAgICBpZiAoZG5fYnVmcC0+ZGR2YXIuZ2xvYmFsKQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZ2xvYmFsX3N5bWJvbHMpOworICAgICAgZWxzZSBpZiAoV0lUSElOX0ZVTkNUSU9OIChvYmpmaWxlKSkKKwlhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmxvY2FsX3N5bWJvbHMpOworICAgICAgZWxzZQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZmlsZV9zeW1ib2xzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRE5UVF9UWVBFX0NPTlNUOgorICAgICAgLyogQSBjb25zdGFudCAocGFzY2FsPykuICAqLworICAgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0NPTlNUOworICAgICAgU1lNQk9MX1ZBTFVFIChzeW0pID0gZG5fYnVmcC0+ZGNvbnN0LmxvY2F0aW9uOworICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSBocHJlYWRfdHlwZV9sb29rdXAgKGRuX2J1ZnAtPmRjb25zdC50eXBlLCBvYmpmaWxlKTsKKyAgICAgIGlmIChkbl9idWZwLT5kY29uc3QuZ2xvYmFsKQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZ2xvYmFsX3N5bWJvbHMpOworICAgICAgZWxzZSBpZiAoV0lUSElOX0ZVTkNUSU9OIChvYmpmaWxlKSkKKwlhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmxvY2FsX3N5bWJvbHMpOworICAgICAgZWxzZQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZmlsZV9zeW1ib2xzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRE5UVF9UWVBFX1RZUEVERUY6CisgICAgICBTWU1CT0xfTkFNRVNQQUNFIChzeW0pID0gVkFSX05BTUVTUEFDRTsKKyAgICAgIFNZTUJPTF9UWVBFIChzeW0pID0gaHByZWFkX3R5cGVfbG9va3VwIChkbl9idWZwLT5kdHlwZS50eXBlLCBvYmpmaWxlKTsKKyAgICAgIGlmIChkbl9idWZwLT5kdHlwZS5nbG9iYWwpCisJYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZnbG9iYWxfc3ltYm9scyk7CisgICAgICBlbHNlIGlmIChXSVRISU5fRlVOQ1RJT04gKG9iamZpbGUpKQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmbG9jYWxfc3ltYm9scyk7CisgICAgICBlbHNlCisJYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZmaWxlX3N5bWJvbHMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBETlRUX1RZUEVfVEFHREVGOgorICAgICAgU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9IFNUUlVDVF9OQU1FU1BBQ0U7CisgICAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IGhwcmVhZF90eXBlX2xvb2t1cCAoZG5fYnVmcC0+ZHR5cGUudHlwZSwgb2JqZmlsZSk7CisgICAgICBUWVBFX05BTUUgKHN5bS0+dHlwZSkgPSBTWU1CT0xfTkFNRSAoc3ltKTsKKyAgICAgIFRZUEVfVEFHX05BTUUgKHN5bS0+dHlwZSkgPSBTWU1CT0xfTkFNRSAoc3ltKTsKKyAgICAgIGlmIChkbl9idWZwLT5kdHlwZS5nbG9iYWwpCisJYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZnbG9iYWxfc3ltYm9scyk7CisgICAgICBlbHNlIGlmIChXSVRISU5fRlVOQ1RJT04gKG9iamZpbGUpKQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmbG9jYWxfc3ltYm9scyk7CisgICAgICBlbHNlCisJYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZmaWxlX3N5bWJvbHMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBETlRUX1RZUEVfUE9JTlRFUjoKKyAgICAgIFNZTUJPTF9UWVBFIChzeW0pID0gbG9va3VwX3BvaW50ZXJfdHlwZSAoaHByZWFkX3R5cGVfbG9va3VwCisJCQkJCSAgICAgICAoZG5fYnVmcC0+ZHB0ci5wb2ludHN0bywKKwkJCQkJCW9iamZpbGUpKTsKKyAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZmlsZV9zeW1ib2xzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRE5UVF9UWVBFX0VOVU06CisgICAgICBTWU1CT0xfTkFNRVNQQUNFIChzeW0pID0gU1RSVUNUX05BTUVTUEFDRTsKKyAgICAgIFNZTUJPTF9UWVBFIChzeW0pID0gaHByZWFkX3JlYWRfZW51bV90eXBlIChocF90eXBlLCBkbl9idWZwLCBvYmpmaWxlKTsKKyAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZmlsZV9zeW1ib2xzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRE5UVF9UWVBFX01FTUVOVU06CisgICAgICBicmVhazsKKyAgICBjYXNlIEROVFRfVFlQRV9TRVQ6CisgICAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IGhwcmVhZF9yZWFkX3NldF90eXBlIChocF90eXBlLCBkbl9idWZwLCBvYmpmaWxlKTsKKyAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZmlsZV9zeW1ib2xzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRE5UVF9UWVBFX1NVQlJBTkdFOgorICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSBocHJlYWRfcmVhZF9zdWJyYW5nZV90eXBlIChocF90eXBlLCBkbl9idWZwLAorCQkJCQkJICAgICBvYmpmaWxlKTsKKyAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZmlsZV9zeW1ib2xzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRE5UVF9UWVBFX0FSUkFZOgorICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSBocHJlYWRfcmVhZF9hcnJheV90eXBlIChocF90eXBlLCBkbl9idWZwLCBvYmpmaWxlKTsKKyAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZmlsZV9zeW1ib2xzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRE5UVF9UWVBFX1NUUlVDVDoKKyAgICBjYXNlIEROVFRfVFlQRV9VTklPTjoKKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBTVFJVQ1RfTkFNRVNQQUNFOworICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSBocHJlYWRfcmVhZF9zdHJ1Y3RfdHlwZSAoaHBfdHlwZSwgZG5fYnVmcCwgb2JqZmlsZSk7CisgICAgICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmZpbGVfc3ltYm9scyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ2RiL2hwcmVhZC5oIGIvZ2RiL2hwcmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NjRkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvaHByZWFkLmgKQEAgLTAsMCArMSwxNTAgQEAKKy8qIGhwcmVhZC5oCisgKiBDb21tb24gaW5jbHVkZSBmaWxlIGZvcjoKKyAqICAgaHBfc3ltdGFiX3JlYWQuYworICogICBocF9wc3ltdGFiX3JlYWQuYworICovCisKKy8qIENvcHlyaWdodCAxOTkzLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworICAgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKKyAgIGFuZCBieSBDeWdudXMgU3VwcG9ydC4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImhwLXN5bXRhYi5oIgorI2luY2x1ZGUgInN5bXMuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJidWlsZHN5bS5oIgorI2luY2x1ZGUgImNvbXBsYWludHMuaCIKKyNpbmNsdWRlICJnZGItc3RhYnMuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgImRlbWFuZ2xlLmgiCisKKy8qIFByaXZhdGUgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gYW4gb2JqZmlsZSB3aGljaCB3ZSB1c2UgdG8gZmluZAorICAgYW5kIGludGVybmFsaXplIHRoZSBIUCBDIGRlYnVnIHN5bWJvbHMgd2l0aGluIHRoYXQgb2JqZmlsZS4gICovCisKK3N0cnVjdCBocHJlYWRfc3ltZmlsZV9pbmZvCit7CisgIC8qIFRoZSBjb250ZW50cyBvZiBlYWNoIG9mIHRoZSBkZWJ1ZyBzZWN0aW9ucyAodGhlcmUgYXJlIDQgb2YgdGhlbSkuICAqLworICBjaGFyICpnbnR0OworICBjaGFyICpsbnR0OworICBjaGFyICpzbHQ7CisgIGNoYXIgKnZ0OworCisgIC8qIFdlIGtlZXAgdGhlIHNpemUgb2YgdGhlICRWVCQgc2VjdGlvbiBmb3IgcmFuZ2UgY2hlY2tpbmcuICAqLworICB1bnNpZ25lZCBpbnQgdnRfc2l6ZTsKKworICAvKiBTb21lIHJvdXRpbmVzIHN0aWxsIG5lZWQgdG8ga25vdyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gdGhlCisgICAgIG1haW4gZGVidWcgc2VjdGlvbnMgKCRMTlRUJCBhbmQgJEdOVFQkKS4gKi8KKyAgdW5zaWduZWQgaW50IGxudHRfc3ltY291bnQ7CisgIHVuc2lnbmVkIGludCBnbnR0X3N5bWNvdW50OworCisgIC8qIFRvIGtlZXAgdHJhY2sgb2YgYWxsIHRoZSB0eXBlcyB3ZSd2ZSBwcm9jZXNzZWQuICAqLworICBzdHJ1Y3QgdHlwZSAqKnR5cGVfdmVjdG9yOworICBpbnQgdHlwZV92ZWN0b3JfbGVuZ3RoOworCisgIC8qIEtlZXBzIHRyYWNrIG9mIHRoZSBiZWdpbm5pbmcgb2YgYSByYW5nZSBvZiBzb3VyY2UgbGluZXMuICAqLworICBzbHRwb2ludGVyIHNsX2luZGV4OworCisgIC8qIFNvbWUgc3RhdGUgdmFyaWFibGVzIHdlJ2xsIG5lZWQuICAqLworICBpbnQgd2l0aGluX2Z1bmN0aW9uOworCisgIC8qIEtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24ncyBhZGRyZXNzLiAgV2UgbWF5IG5lZWQgdG8gbG9vaworICAgICB1cCBzb21ldGhpbmcgYmFzZWQgb24gdGhpcyBhZGRyZXNzLiAgKi8KKyAgdW5zaWduZWQgaW50IGN1cnJlbnRfZnVuY3Rpb25fdmFsdWU7Cit9OworCisvKiBBY2Nlc3NvciBtYWNyb3MgdG8gZ2V0IGF0IHRoZSBmaWVsZHMuICAqLworI2RlZmluZSBIUFVYX1NZTUZJTEVfSU5GTyhvKSBcCisgICgoc3RydWN0IGhwcmVhZF9zeW1maWxlX2luZm8gKikoKG8pLT5zeW1fcHJpdmF0ZSkpCisjZGVmaW5lIEdOVFQobykgICAgICAgICAgICAgICAgIChIUFVYX1NZTUZJTEVfSU5GTyhvKS0+Z250dCkKKyNkZWZpbmUgTE5UVChvKSAgICAgICAgICAgICAgICAgKEhQVVhfU1lNRklMRV9JTkZPKG8pLT5sbnR0KQorI2RlZmluZSBTTFQobykgICAgICAgICAgICAgICAgICAoSFBVWF9TWU1GSUxFX0lORk8obyktPnNsdCkKKyNkZWZpbmUgVlQobykgICAgICAgICAgICAgICAgICAgKEhQVVhfU1lNRklMRV9JTkZPKG8pLT52dCkKKyNkZWZpbmUgVlRfU0laRShvKSAgICAgICAgICAgICAgKEhQVVhfU1lNRklMRV9JTkZPKG8pLT52dF9zaXplKQorI2RlZmluZSBMTlRUX1NZTUNPVU5UKG8pICAgICAgICAoSFBVWF9TWU1GSUxFX0lORk8obyktPmxudHRfc3ltY291bnQpCisjZGVmaW5lIEdOVFRfU1lNQ09VTlQobykgICAgICAgIChIUFVYX1NZTUZJTEVfSU5GTyhvKS0+Z250dF9zeW1jb3VudCkKKyNkZWZpbmUgVFlQRV9WRUNUT1IobykgICAgICAgICAgKEhQVVhfU1lNRklMRV9JTkZPKG8pLT50eXBlX3ZlY3RvcikKKyNkZWZpbmUgVFlQRV9WRUNUT1JfTEVOR1RIKG8pICAgKEhQVVhfU1lNRklMRV9JTkZPKG8pLT50eXBlX3ZlY3Rvcl9sZW5ndGgpCisjZGVmaW5lIFNMX0lOREVYKG8pICAgICAgICAgICAgIChIUFVYX1NZTUZJTEVfSU5GTyhvKS0+c2xfaW5kZXgpCisjZGVmaW5lIFdJVEhJTl9GVU5DVElPTihvKSAgICAgIChIUFVYX1NZTUZJTEVfSU5GTyhvKS0+d2l0aGluX2Z1bmN0aW9uKQorI2RlZmluZSBDVVJSRU5UX0ZVTkNUSU9OX1ZBTFVFKG8pIChIUFVYX1NZTUZJTEVfSU5GTyhvKS0+Y3VycmVudF9mdW5jdGlvbl92YWx1ZSkKKworLyogR2l2ZW4gdGhlIG5hdGl2ZSBkZWJ1ZyBzeW1ib2wgU1lNLCBzZXQgTkFNRVAgdG8gdGhlIG5hbWUgYXNzb2NpYXRlZAorICAgd2l0aCB0aGUgZGVidWcgc3ltYm9sLiAgTm90ZSB3ZSBtYXkgYmUgY2FsbGVkIHdpdGggYSBkZWJ1ZyBzeW1ib2wgd2hpY2gKKyAgIGhhcyBubyBhc3NvY2lhdGVkIG5hbWUsIGluIHRoYXQgY2FzZSB3ZSByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgorCisgICBBbHNvIG5vdGUgd2UgImtub3ciIHRoYXQgdGhlIG5hbWUgZm9yIGFueSBzeW1ib2wgaXMgYWx3YXlzIGluIHRoZQorICAgc2FtZSBwbGFjZS4gIEhlbmNlIHdlIGRvbid0IGhhdmUgdG8gY29uZGl0aW9uYWxpemUgb24gdGhlIHN5bWJvbCB0eXBlLiAgKi8KKyNkZWZpbmUgU0VUX05BTUVTVFJJTkcoU1lNLCBOQU1FUCwgT0JKRklMRSkgXAorICBpZiAoISBocHJlYWRfaGFzX25hbWUgKChTWU0pLT5kYmxvY2sua2luZCkpIFwKKyAgICAqTkFNRVAgPSAiIjsgXAorICBlbHNlIGlmICgoKHVuc2lnbmVkKShTWU0pLT5kc2ZpbGUubmFtZSkgPj0gVlRfU0laRSAoT0JKRklMRSkpIFwKKyAgICB7IFwKKyAgICAgIGNvbXBsYWluICgmc3RyaW5nX3RhYmxlX29mZnNldF9jb21wbGFpbnQsIChjaGFyICopIHN5bW51bSk7IFwKKyAgICAgICpOQU1FUCA9ICIiOyBcCisgICAgfSBcCisgIGVsc2UgXAorICAgICpOQU1FUCA9IChTWU0pLT5kc2ZpbGUubmFtZSArIFZUIChPQkpGSUxFKQorDAorLyogV2UgcHV0IGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSBpbiB0aGUgcmVhZF9zeW10YWJfcHJpdmF0ZSBmaWVsZAorICAgb2YgdGhlIHBzeW10YWIuICAqLworCitzdHJ1Y3Qgc3ltbG9jCit7CisgIC8qIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBmaWxlIHN5bWJvbCB0YWJsZSBvZiBmaXJzdCBsb2NhbCBzeW1ib2wgZm9yCisgICAgIHRoaXMgZmlsZS4gICovCisKKyAgaW50IGxkc3ltb2ZmOworCisgIC8qIExlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoZSBzZWN0aW9uIG9mIHRoZSBzeW1ib2wgdGFibGUgZGV2b3RlZCB0bworICAgICB0aGlzIGZpbGUncyBzeW1ib2xzIChhY3R1YWxseSwgdGhlIHNlY3Rpb24gYnJhY2tldGVkIG1heSBjb250YWluCisgICAgIG1vcmUgdGhhbiBqdXN0IHRoaXMgZmlsZSdzIHN5bWJvbHMpLiAgSWYgbGRzeW1sZW4gaXMgMCwgdGhlIG9ubHkKKyAgICAgcmVhc29uIGZvciB0aGlzIHRoaW5nJ3MgZXhpc3RlbmNlIGlzIHRoZSBkZXBlbmRlbmN5IGxpc3QuCisgICAgIE5vdGhpbmcgZWxzZSB3aWxsIGhhcHBlbiB3aGVuIGl0IGlzIHJlYWQgaW4uICAqLworCisgIGludCBsZHN5bWxlbjsKK307CisKKyNkZWZpbmUgTERTWU1PRkYocCkgKCgoc3RydWN0IHN5bWxvYyAqKSgocCktPnJlYWRfc3ltdGFiX3ByaXZhdGUpKS0+bGRzeW1vZmYpCisjZGVmaW5lIExEU1lNTEVOKHApICgoKHN0cnVjdCBzeW1sb2MgKikoKHApLT5yZWFkX3N5bXRhYl9wcml2YXRlKSktPmxkc3ltbGVuKQorI2RlZmluZSBTWU1MT0MocCkgKChzdHJ1Y3Qgc3ltbG9jICopKChwKS0+cmVhZF9zeW10YWJfcHJpdmF0ZSkpCisMCisvKiBGSVhNRTogU2hvdWxkbid0IHRoaXMgc3R1ZmYgYmUgaW4gYSAuaCBmaWxlIHNvbWV3aGVyZT8gICovCisvKiBOb256ZXJvIG1lYW5zIGdpdmUgdmVyYm9zZSBpbmZvIG9uIGdkYiBhY3Rpb24uICAqLworZXh0ZXJuIGludCBpbmZvX3ZlcmJvc2U7CisKKy8qIENvbXBsYWludHMgYWJvdXQgdGhlIHN5bWJvbHMgd2UgaGF2ZSBlbmNvdW50ZXJlZC4gICovCitleHRlcm4gc3RydWN0IGNvbXBsYWludCBzdHJpbmdfdGFibGVfb2Zmc2V0X2NvbXBsYWludDsKK2V4dGVybiBzdHJ1Y3QgY29tcGxhaW50IGxicmFjX3VubWF0Y2hlZF9jb21wbGFpbnQ7CitleHRlcm4gc3RydWN0IGNvbXBsYWludCBsYnJhY19taXNtYXRjaF9jb21wbGFpbnQ7CisKK2V4dGVybiB1bmlvbiBzbHRlbnRyeSAqaHByZWFkX2dldF9zbHQKKyAgUEFSQU1TICgoaW50LCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK2V4dGVybiB1bmlvbiBkbnR0ZW50cnkgKmhwcmVhZF9nZXRfbG50dAorICBQQVJBTVMgKChpbnQsIHN0cnVjdCBvYmpmaWxlICopKTsKKworaW50IGhwcmVhZF9oYXNfbmFtZQorICBQQVJBTVMgKChlbnVtIGRudHRfZW50cnlfdHlwZSkpOworCisvKiBlbmQgb2YgaHByZWFkLmggKi8KZGlmZiAtLWdpdCBhL2dkYi9ocHV4LXRocmVhZC5jIGIvZ2RiL2hwdXgtdGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0MjFmMwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9ocHV4LXRocmVhZC5jCkBAIC0wLDAgKzEsNjQxIEBACisvKiBMb3cgbGV2ZWwgaW50ZXJmYWNlIGZvciBkZWJ1Z2dpbmcgSFBVWC9EQ0UgdGhyZWFkcyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBhIHNvcnQgb2YgaGFsZiB0YXJnZXQgdGhhdCBzaXRzIGJldHdlZW4gdGhlCisgICBtYWNoaW5lLWluZGVwZW5kZW50IHBhcnRzIG9mIEdEQiBhbmQgdGhlIHB0cmFjZSBpbnRlcmZhY2UgKGluZnB0cmFjZS5jKSB0bworICAgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIEhQVVggdXNlci1tb2RlIHRocmVhZCBpbXBsZW1lbnRhdGlvbi4KKworICAgSFBVWCB0aHJlYWRzIGFyZSB0cnVlIHVzZXItbW9kZSB0aHJlYWRzLCB3aGljaCBhcmUgaW52b2tlZCB2aWEgdGhlIGNtYV8qCisgICBhbmQgcHRocmVhZF8qIChEQ0UgYW5kIFBvc2l4IHJlc3BlY3Rpdmx5KSBpbnRlcmZhY2VzLiAgVGhlc2UgYXJlIG1vc3RseQorICAgaW1wbGVtZW50ZWQgaW4gdXNlci1zcGFjZSwgd2l0aCBhbGwgdGhyZWFkIGNvbnRleHQga2VwdCBpbiB2YXJpb3VzCisgICBzdHJ1Y3R1cmVzIHRoYXQgbGl2ZSBpbiB0aGUgdXNlcidzIGhlYXAuICBGb3IgdGhlIG1vc3QgcGFydCwgdGhlIGtlcm5lbCBoYXMKKyAgIG5vIGtub3dsZWdlIG9mIHRoZXNlIHRocmVhZHMuCisKKyAgICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisKKyNkZWZpbmUgX0NNQV9OT1dSQVBQRVJTXworCisjaW5jbHVkZSA8Y21hX3RjYl9kZWZzLmg+CisjaW5jbHVkZSA8Y21hX2RlYl9jb3JlLmg+CisjaW5jbHVkZSAiZ2RidGhyZWFkLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAiZ2RiY29yZS5oIgorCitleHRlcm4gaW50IGNoaWxkX3N1cHByZXNzX3J1bjsKK2V4dGVybiBzdHJ1Y3QgdGFyZ2V0X29wcyBjaGlsZF9vcHM7IC8qIHRhcmdldCB2ZWN0b3IgZm9yIGluZnRhcmcuYyAqLworCitleHRlcm4gdm9pZCBfaW5pdGlhbGl6ZV9ocHV4X3RocmVhZCBQQVJBTVMgKCh2b2lkKSk7CisKK3N0cnVjdCBzdHJpbmdfbWFwCit7CisgIGludCBudW07CisgIGNoYXIgKnN0cjsKK307CisKK3N0YXRpYyBpbnQgaHB1eF90aHJlYWRfYWN0aXZlID0gMDsKKworc3RhdGljIGludCBtYWluX3BpZDsJCS8qIFJlYWwgcHJvY2VzcyBJRCAqLworCitzdGF0aWMgQ09SRV9BRERSIFBfY21hX19nX2tub3duX3RocmVhZHM7CitzdGF0aWMgQ09SRV9BRERSIFBfY21hX19nX2N1cnJlbnRfdGhyZWFkOworCitzdGF0aWMgc3RydWN0IGNsZWFudXAgKiBzYXZlX2luZmVyaW9yX3BpZCBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVfaW5mZXJpb3JfcGlkIFBBUkFNUyAoKGludCBwaWQpKTsKKworc3RhdGljIHZvaWQgaHB1eF90aHJlYWRfcmVzdW1lIFBBUkFNUyAoKGludCBwaWQsIGludCBzdGVwLAorCQkJCQllbnVtIHRhcmdldF9zaWduYWwgc2lnbm8pKTsKKworc3RhdGljIHZvaWQgaW5pdF9ocHV4X3RocmVhZF9vcHMgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgc3RydWN0IHRhcmdldF9vcHMgaHB1eF90aHJlYWRfb3BzOworDAorLyoKKworTE9DQUwgRlVOQ1RJT04KKworCXNhdmVfaW5mZXJpb3JfcGlkIC0gU2F2ZSBpbmZlcmlvcl9waWQgb24gdGhlIGNsZWFudXAgbGlzdAorCXJlc3RvcmVfaW5mZXJpb3JfcGlkIC0gUmVzdG9yZSBpbmZlcmlvcl9waWQgZnJvbSB0aGUgY2xlYW51cCBsaXN0CisKK1NZTk9QU0lTCisKKwlzdHJ1Y3QgY2xlYW51cCAqc2F2ZV9pbmZlcmlvcl9waWQgKCkKKwl2b2lkIHJlc3RvcmVfaW5mZXJpb3JfcGlkIChpbnQgcGlkKQorCitERVNDUklQVElPTgorCisJVGhlc2UgdHdvIGZ1bmN0aW9ucyBhY3QgaW4gdW5pc29uIHRvIHJlc3RvcmUgaW5mZXJpb3JfcGlkIGluCisJY2FzZSBvZiBhbiBlcnJvci4KKworTk9URVMKKworCWluZmVyaW9yX3BpZCBpcyBhIGdsb2JhbCB2YXJpYWJsZSB0aGF0IG5lZWRzIHRvIGJlIGNoYW5nZWQgYnkgbWFueSBvZgorCXRoZXNlIHJvdXRpbmVzIGJlZm9yZSBjYWxsaW5nIGZ1bmN0aW9ucyBpbiBwcm9jZnMuYy4gIEluIG9yZGVyIHRvCisJZ3VhcmFudGVlIHRoYXQgaW5mZXJpb3JfcGlkIGdldHMgcmVzdG9yZWQgKGluIGNhc2Ugb2YgZXJyb3JzKSwgeW91CisJbmVlZCB0byBjYWxsIHNhdmVfaW5mZXJpb3JfcGlkIGJlZm9yZSBjaGFuZ2luZyBpdC4gIEF0IHRoZSBlbmQgb2YgdGhlCisJZnVuY3Rpb24sIHlvdSBzaG91bGQgaW52b2tlIGRvX2NsZWFudXBzIHRvIHJlc3RvcmUgaXQuCisKKyAqLworCisKK3N0YXRpYyBzdHJ1Y3QgY2xlYW51cCAqCitzYXZlX2luZmVyaW9yX3BpZCAoKQoreworICByZXR1cm4gbWFrZV9jbGVhbnVwIChyZXN0b3JlX2luZmVyaW9yX3BpZCwgaW5mZXJpb3JfcGlkKTsKK30KKworc3RhdGljIHZvaWQKK3Jlc3RvcmVfaW5mZXJpb3JfcGlkIChwaWQpCisgICAgIGludCBwaWQ7Cit7CisgIGluZmVyaW9yX3BpZCA9IHBpZDsKK30KKwwKK3N0YXRpYyBpbnQgZmluZF9hY3RpdmVfdGhyZWFkIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIGludCBjYWNoZWRfdGhyZWFkOworc3RhdGljIGludCBjYWNoZWRfYWN0aXZlX3RocmVhZDsKK3N0YXRpYyBjbWFfX3RfaW50X3RjYiBjYWNoZWRfdGNiOworCitzdGF0aWMgaW50CitmaW5kX2FjdGl2ZV90aHJlYWQgKCkKK3sKKyAgc3RhdGljIGNtYV9fdF9pbnRfdGNiIHRjYjsKKyAgQ09SRV9BRERSIHRjYl9wdHI7CisKKyAgaWYgKGNhY2hlZF9hY3RpdmVfdGhyZWFkICE9IDApCisgICAgcmV0dXJuIGNhY2hlZF9hY3RpdmVfdGhyZWFkOworCisgIHJlYWRfbWVtb3J5ICgoQ09SRV9BRERSKVBfY21hX19nX2N1cnJlbnRfdGhyZWFkLAorCSAgICAgICAoY2hhciAqKSZ0Y2JfcHRyLAorCSAgICAgICBzaXplb2YgdGNiX3B0cik7CisKKyAgcmVhZF9tZW1vcnkgKHRjYl9wdHIsIChjaGFyICopJnRjYiwgc2l6ZW9mIHRjYik7CisKKyAgcmV0dXJuIChjbWFfdGhyZWFkX2dldF91bmlxdWUgKCZ0Y2IucHJvbG9nLmNsaWVudF90aHJlYWQpIDw8IDE2KSB8IG1haW5fcGlkOworfQorCitzdGF0aWMgY21hX190X2ludF90Y2IgKiBmaW5kX3RjYiBQQVJBTVMgKChpbnQgdGhyZWFkKSk7CisKK3N0YXRpYyBjbWFfX3RfaW50X3RjYiAqCitmaW5kX3RjYiAodGhyZWFkKQorICAgICBpbnQgdGhyZWFkOworeworICBjbWFfX3Rfa25vd25fb2JqZWN0IHF1ZXVlX2hlYWRlcjsKKyAgY21hX190X3F1ZXVlICpxdWV1ZV9wdHI7CisKKyAgaWYgKHRocmVhZCA9PSBjYWNoZWRfdGhyZWFkKQorICAgIHJldHVybiAmY2FjaGVkX3RjYjsKKworICByZWFkX21lbW9yeSAoKENPUkVfQUREUilQX2NtYV9fZ19rbm93bl90aHJlYWRzLAorCSAgICAgICAoY2hhciAqKSZxdWV1ZV9oZWFkZXIsCisJICAgICAgIHNpemVvZiBxdWV1ZV9oZWFkZXIpOworCisgIGZvciAocXVldWVfcHRyID0gcXVldWVfaGVhZGVyLnF1ZXVlLmZsaW5rOworICAgICAgIHF1ZXVlX3B0ciAhPSAoY21hX190X3F1ZXVlICopUF9jbWFfX2dfa25vd25fdGhyZWFkczsKKyAgICAgICBxdWV1ZV9wdHIgPSBjYWNoZWRfdGNiLnRocmVhZHMuZmxpbmspCisgICAgeworICAgICAgY21hX190X2ludF90Y2IgKnRjYl9wdHI7CisKKyAgICAgIHRjYl9wdHIgPSBjbWFfX2Jhc2UgKHF1ZXVlX3B0ciwgdGhyZWFkcywgY21hX190X2ludF90Y2IpOworCisgICAgICByZWFkX21lbW9yeSAoKENPUkVfQUREUil0Y2JfcHRyLCAoY2hhciAqKSZjYWNoZWRfdGNiLCBzaXplb2YgY2FjaGVkX3RjYik7CisKKyAgICAgIGlmIChjYWNoZWRfdGNiLmhlYWRlci50eXBlID09IGNtYV9fY19vYmpfdGNiKQorCWlmIChjbWFfdGhyZWFkX2dldF91bmlxdWUgKCZjYWNoZWRfdGNiLnByb2xvZy5jbGllbnRfdGhyZWFkKSA9PSB0aHJlYWQgPj4gMTYpCisJICB7CisJICAgIGNhY2hlZF90aHJlYWQgPSB0aHJlYWQ7CisJICAgIHJldHVybiAmY2FjaGVkX3RjYjsKKwkgIH0KKyAgICB9CisKKyAgZXJyb3IgKCJDYW4ndCBmaW5kIFRDQiAlZCwlZCIsIHRocmVhZCA+PiAxNiwgdGhyZWFkICYgMHhmZmZmKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisMCisvKiBNb3N0IHRhcmdldCB2ZWN0b3IgZnVuY3Rpb25zIGZyb20gaGVyZSBvbiBhY3R1YWxseSBqdXN0IHBhc3MgdGhyb3VnaCB0bworICAgaW5mdGFyZy5jLCBhcyB0aGV5IGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lmaWMgZm9yIHRocmVhZHMuICAqLworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2hwdXhfdGhyZWFkX29wZW4gKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjaGlsZF9vcHMudG9fb3BlbiAoYXJnLCBmcm9tX3R0eSk7Cit9CisKKy8qIEF0dGFjaCB0byBwcm9jZXNzIFBJRCwgdGhlbiBpbml0aWFsaXplIGZvciBkZWJ1Z2dpbmcgaXQKKyAgIGFuZCB3YWl0IGZvciB0aGUgdHJhY2UtdHJhcCB0aGF0IHJlc3VsdHMgZnJvbSBhdHRhY2hpbmcuICAqLworCitzdGF0aWMgdm9pZAoraHB1eF90aHJlYWRfYXR0YWNoIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjaGlsZF9vcHMudG9fYXR0YWNoIChhcmdzLCBmcm9tX3R0eSk7CisKKyAgLyogWFhYIC0gbWlnaHQgd2FudCB0byBpdGVyYXRlIG92ZXIgYWxsIHRoZSB0aHJlYWRzIGFuZCByZWdpc3RlciB0aGVtLiAqLworfQorCisvKiBUYWtlIGEgcHJvZ3JhbSBwcmV2aW91c2x5IGF0dGFjaGVkIHRvIGFuZCBkZXRhY2hlcyBpdC4KKyAgIFRoZSBwcm9ncmFtIHJlc3VtZXMgZXhlY3V0aW9uIGFuZCB3aWxsIG5vIGxvbmdlciBzdG9wCisgICBvbiBzaWduYWxzLCBldGMuICBXZSdkIGJldHRlciBub3QgaGF2ZSBsZWZ0IGFueSBicmVha3BvaW50cworICAgaW4gdGhlIHByb2dyYW0gb3IgaXQnbGwgZGllIHdoZW4gaXQgaGl0cyBvbmUuICBGb3IgdGhpcworICAgdG8gd29yaywgaXQgbWF5IGJlIG5lY2Vzc2FyeSBmb3IgdGhlIHByb2Nlc3MgdG8gaGF2ZSBiZWVuCisgICBwcmV2aW91c2x5IGF0dGFjaGVkLiAgSXQgKm1pZ2h0KiB3b3JrIGlmIHRoZSBwcm9ncmFtIHdhcworICAgc3RhcnRlZCB2aWEgdGhlIG5vcm1hbCBwdHJhY2UgKFBUUkFDRV9UUkFDRU1FKS4gICovCisKK3N0YXRpYyB2b2lkCitocHV4X3RocmVhZF9kZXRhY2ggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoaWxkX29wcy50b19kZXRhY2ggKGFyZ3MsIGZyb21fdHR5KTsKK30KKworLyogUmVzdW1lIGV4ZWN1dGlvbiBvZiBwcm9jZXNzIFBJRC4gIElmIFNURVAgaXMgbm96ZXJvLCB0aGVuCisgICBqdXN0IHNpbmdsZSBzdGVwIGl0LiAgSWYgU0lHTkFMIGlzIG5vbnplcm8sIHJlc3RhcnQgaXQgd2l0aCB0aGF0CisgICBzaWduYWwgYWN0aXZhdGVkLiAgV2UgbWF5IGhhdmUgdG8gY29udmVydCBwaWQgZnJvbSBhIHRocmVhZC1pZCB0byBhbiBMV1AgaWQKKyAgIGZvciBwcm9jZnMuICAqLworCitzdGF0aWMgdm9pZAoraHB1eF90aHJlYWRfcmVzdW1lIChwaWQsIHN0ZXAsIHNpZ25vKQorICAgICBpbnQgcGlkOworICAgICBpbnQgc3RlcDsKKyAgICAgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ25vOworeworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworCisgIG9sZF9jaGFpbiA9IHNhdmVfaW5mZXJpb3JfcGlkICgpOworCisgIHBpZCA9IGluZmVyaW9yX3BpZCA9IG1haW5fcGlkOworCisjaWYgMAorICBpZiAocGlkICE9IC0xKQorICAgIHsKKyAgICAgIHBpZCA9IHRocmVhZF90b19sd3AgKHBpZCwgLTIpOworICAgICAgaWYgKHBpZCA9PSAtMikJCS8qIEluYWN0aXZlIHRocmVhZCAqLworCWVycm9yICgiVGhpcyB2ZXJzaW9uIG9mIFNvbGFyaXMgY2FuJ3Qgc3RhcnQgaW5hY3RpdmUgdGhyZWFkcy4iKTsKKyAgICB9CisjZW5kaWYKKworICBjaGlsZF9vcHMudG9fcmVzdW1lIChwaWQsIHN0ZXAsIHNpZ25vKTsKKworICBjYWNoZWRfdGhyZWFkID0gMDsKKyAgY2FjaGVkX2FjdGl2ZV90aHJlYWQgPSAwOworCisgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworfQorCisvKiBXYWl0IGZvciBhbnkgdGhyZWFkcyB0byBzdG9wLiAgV2UgbWF5IGhhdmUgdG8gY29udmVydCBQSUQgZnJvbSBhIHRocmVhZCBpZAorICAgdG8gYSBMV1AgaWQsIGFuZCB2aWNlIHZlcnNhIG9uIHRoZSB3YXkgb3V0LiAgKi8KKworc3RhdGljIGludAoraHB1eF90aHJlYWRfd2FpdCAocGlkLCBvdXJzdGF0dXMpCisgICAgIGludCBwaWQ7CisgICAgIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqb3Vyc3RhdHVzOworeworICBpbnQgcnRudmFsOworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworCisgIG9sZF9jaGFpbiA9IHNhdmVfaW5mZXJpb3JfcGlkICgpOworCisgIGluZmVyaW9yX3BpZCA9IG1haW5fcGlkOworCisgIGlmIChwaWQgIT0gLTEpCisgICAgcGlkID0gbWFpbl9waWQ7CisKKyAgcnRudmFsID0gY2hpbGRfb3BzLnRvX3dhaXQgKHBpZCwgb3Vyc3RhdHVzKTsKKworICBydG52YWwgPSBmaW5kX2FjdGl2ZV90aHJlYWQgKCk7CisKKyAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisKKyAgcmV0dXJuIHJ0bnZhbDsKK30KKworc3RhdGljIGNoYXIgcmVnbWFwW05VTV9SRUdTXSA9Cit7CisgIC0yLCAtMSwgLTEsIDAsIDQsIDgsIDEyLCAxNiwgMjAsIDI0LCAvKiBmbGFncywgcjEgLT4gcjkgKi8KKyAgMjgsIDMyLCAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgLTEsIC8qIHIxMCAtPiByMTkgKi8KKyAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC8qIHIyMCAtPiByMjkgKi8KKworICAvKiByMzAsIHIzMSwgc2FyLCBwY29xaCwgcGNzcWgsIHBjb3F0LCBwY3NxdCwgZWllbSwgaWlyLCBpc3IgKi8KKyAgLTIsIC0xLCAtMSwgLTIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisKKyAgLyogaW9yLCBpcHN3LCBnb3RvLCBzcjQsIHNyMCwgc3IxLCBzcjIsIHNyMywgc3I1LCBzcjYgKi8KKyAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisKKyAgLyogc3I3LCBjcjAsIGNyOCwgY3I5LCBjY3IsIGNyMTIsIGNyMTMsIGNyMjQsIGNyMjUsIGNyMjYgKi8KKyAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisKKyAgLTEsIC0xLCAtMSwgLTEsCQkvKiBtcHNmdV9oaWdoLCBtcHNmdV9sb3csIG1wc2Z1X292ZmxvLCBwYWQgKi8KKyAgMTQ0LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLyogZnBzciwgZnBlMSAtPiBmcGU3ICovCisgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLyogZnI0IC0+IGZyNyAqLworICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC8qIGZyOCAtPiBmcjExICovCisgIDEzNiwgLTEsIDEyOCwgLTEsIDEyMCwgLTEsIDExMiwgLTEsIC8qIGZyMTIgLT4gZnIxNSAqLworICAxMDQsIC0xLCA5NiwgLTEsIDg4LCAtMSwgODAsIC0xLCAvKiBmcjE2IC0+IGZyMTkgKi8KKyAgNzIsIC0xLCA2NCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAvKiBmcjIwIC0+IGZyMjMgKi8KKyAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAvKiBmcjI0IC0+IGZyMjcgKi8KKyAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAvKiBmcjI4IC0+IGZyMzEgKi8KK307CisKK3N0YXRpYyB2b2lkCitocHV4X3RocmVhZF9mZXRjaF9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGNtYV9fdF9pbnRfdGNiIHRjYiwgKnRjYl9wdHI7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisgIGludCBpOworICBpbnQgZmlyc3RfcmVnbm8sIGxhc3RfcmVnbm87CisKKyAgdGNiX3B0ciA9IGZpbmRfdGNiIChpbmZlcmlvcl9waWQpOworCisgIG9sZF9jaGFpbiA9IHNhdmVfaW5mZXJpb3JfcGlkICgpOworCisgIGluZmVyaW9yX3BpZCA9IG1haW5fcGlkOworCisgIGlmICh0Y2JfcHRyLT5zdGF0ZSA9PSBjbWFfX2Nfc3RhdGVfcnVubmluZykKKyAgICB7CisgICAgICBjaGlsZF9vcHMudG9fZmV0Y2hfcmVnaXN0ZXJzIChyZWdubyk7CisKKyAgICAgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworCisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChyZWdubyA9PSAtMSkKKyAgICB7CisgICAgICBmaXJzdF9yZWdubyA9IDA7CisgICAgICBsYXN0X3JlZ25vID0gTlVNX1JFR1MgLSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZpcnN0X3JlZ25vID0gcmVnbm87CisgICAgICBsYXN0X3JlZ25vID0gcmVnbm87CisgICAgfQorCisgIGZvciAocmVnbm8gPSBmaXJzdF9yZWdubzsgcmVnbm8gPD0gbGFzdF9yZWdubzsgcmVnbm8rKykKKyAgICB7CisgICAgICBpZiAocmVnbWFwW3JlZ25vXSA9PSAtMSkKKwljaGlsZF9vcHMudG9fZmV0Y2hfcmVnaXN0ZXJzIChyZWdubyk7CisgICAgICBlbHNlCisJeworCSAgdW5zaWduZWQgY2hhciBidWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKwkgIENPUkVfQUREUiBzcDsKKworCSAgc3AgPSAoQ09SRV9BRERSKXRjYl9wdHItPnN0YXRpY19jdHguc3AgLSAxNjA7CisKKwkgIGlmIChyZWdubyA9PSBGTEFHU19SRUdOVU0pCisJICAgIC8qIEZsYWdzIG11c3QgYmUgMCB0byBhdm9pZCBib2d1cyB2YWx1ZSBmb3IgU1NfSU5TWVNDQUxMICovCisJICAgIG1lbXNldCAoYnVmLCAnXDAwMCcsIFJFR0lTVEVSX1JBV19TSVpFIChyZWdubykpOworCSAgZWxzZSBpZiAocmVnbm8gPT0gU1BfUkVHTlVNKQorCSAgICBzdG9yZV9hZGRyZXNzIChidWYsIHNpemVvZiBzcCwgc3ApOworCSAgZWxzZSBpZiAocmVnbm8gPT0gUENfUkVHTlVNKQorCSAgICByZWFkX21lbW9yeSAoc3AgLSAyMCwgYnVmLCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pKTsKKwkgIGVsc2UKKwkgICAgcmVhZF9tZW1vcnkgKHNwICsgcmVnbWFwW3JlZ25vXSwgYnVmLCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pKTsKKworCSAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgYnVmKTsKKwl9CisgICAgfQorCisgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworfQorCitzdGF0aWMgdm9pZAoraHB1eF90aHJlYWRfc3RvcmVfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBjbWFfX3RfaW50X3RjYiB0Y2IsICp0Y2JfcHRyOworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworICBpbnQgaTsKKyAgaW50IGZpcnN0X3JlZ25vLCBsYXN0X3JlZ25vOworCisgIHRjYl9wdHIgPSBmaW5kX3RjYiAoaW5mZXJpb3JfcGlkKTsKKworICBvbGRfY2hhaW4gPSBzYXZlX2luZmVyaW9yX3BpZCAoKTsKKworICBpbmZlcmlvcl9waWQgPSBtYWluX3BpZDsKKworICBpZiAodGNiX3B0ci0+c3RhdGUgPT0gY21hX19jX3N0YXRlX3J1bm5pbmcpCisgICAgeworICAgICAgY2hpbGRfb3BzLnRvX3N0b3JlX3JlZ2lzdGVycyAocmVnbm8pOworCisgICAgICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAocmVnbm8gPT0gLTEpCisgICAgeworICAgICAgZmlyc3RfcmVnbm8gPSAwOworICAgICAgbGFzdF9yZWdubyA9IE5VTV9SRUdTIC0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmaXJzdF9yZWdubyA9IHJlZ25vOworICAgICAgbGFzdF9yZWdubyA9IHJlZ25vOworICAgIH0KKworICBmb3IgKHJlZ25vID0gZmlyc3RfcmVnbm87IHJlZ25vIDw9IGxhc3RfcmVnbm87IHJlZ25vKyspCisgICAgeworICAgICAgaWYgKHJlZ21hcFtyZWdub10gPT0gLTEpCisJY2hpbGRfb3BzLnRvX3N0b3JlX3JlZ2lzdGVycyAocmVnbm8pOworICAgICAgZWxzZQorCXsKKwkgIHVuc2lnbmVkIGNoYXIgYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisJICBDT1JFX0FERFIgc3A7CisKKwkgIHNwID0gKENPUkVfQUREUil0Y2JfcHRyLT5zdGF0aWNfY3R4LnNwIC0gMTYwOworCisJICBpZiAocmVnbm8gPT0gRkxBR1NfUkVHTlVNKQorCSAgICBjaGlsZF9vcHMudG9fc3RvcmVfcmVnaXN0ZXJzIChyZWdubyk7IC8qIExldCBsb3dlciBsYXllciBoYW5kbGUgdGhpcy4uLiAqLworCSAgZWxzZSBpZiAocmVnbm8gPT0gU1BfUkVHTlVNKQorCSAgICB7CisJICAgICAgd3JpdGVfbWVtb3J5ICgoQ09SRV9BRERSKSZ0Y2JfcHRyLT5zdGF0aWNfY3R4LnNwLAorCQkJICAgIHJlZ2lzdGVycyArIFJFR0lTVEVSX0JZVEUgKHJlZ25vKSwKKwkJCSAgICBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pKTsKKwkgICAgICB0Y2JfcHRyLT5zdGF0aWNfY3R4LnNwID0gKGNtYV9fdF9ocHBhX3JlZ3MgKikKKwkJKGV4dHJhY3RfYWRkcmVzcyAocmVnaXN0ZXJzICsgUkVHSVNURVJfQllURSAocmVnbm8pLCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pKSArIDE2MCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKHJlZ25vID09IFBDX1JFR05VTSkKKwkgICAgd3JpdGVfbWVtb3J5IChzcCAtIDIwLAorCQkJICByZWdpc3RlcnMgKyBSRUdJU1RFUl9CWVRFIChyZWdubyksCisJCQkgIFJFR0lTVEVSX1JBV19TSVpFIChyZWdubykpOworCSAgZWxzZQorCSAgICB3cml0ZV9tZW1vcnkgKHNwICsgcmVnbWFwW3JlZ25vXSwKKwkJCSAgcmVnaXN0ZXJzICsgUkVHSVNURVJfQllURSAocmVnbm8pLAorCQkJICBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pKTsKKwl9CisgICAgfQorCisgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworfQorCisvKiBHZXQgcmVhZHkgdG8gbW9kaWZ5IHRoZSByZWdpc3RlcnMgYXJyYXkuICBPbiBtYWNoaW5lcyB3aGljaCBzdG9yZQorICAgaW5kaXZpZHVhbCByZWdpc3RlcnMsIHRoaXMgZG9lc24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLiAgT24gbWFjaGluZXMKKyAgIHdoaWNoIHN0b3JlIGFsbCB0aGUgcmVnaXN0ZXJzIGluIG9uZSBmZWxsIHN3b29wLCB0aGlzIG1ha2VzIHN1cmUKKyAgIHRoYXQgcmVnaXN0ZXJzIGNvbnRhaW5zIGFsbCB0aGUgcmVnaXN0ZXJzIGZyb20gdGhlIHByb2dyYW0gYmVpbmcKKyAgIGRlYnVnZ2VkLiAgKi8KKworc3RhdGljIHZvaWQKK2hwdXhfdGhyZWFkX3ByZXBhcmVfdG9fc3RvcmUgKCkKK3sKKyAgY2hpbGRfb3BzLnRvX3ByZXBhcmVfdG9fc3RvcmUgKCk7Cit9CisKK3N0YXRpYyBpbnQKK2hwdXhfdGhyZWFkX3hmZXJfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbiwgZG93cml0ZSwgdGFyZ2V0KQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworICAgICBpbnQgZG93cml0ZTsKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldDsgLyogaWdub3JlZCAqLworeworICBpbnQgcmV0dmFsOworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworCisgIG9sZF9jaGFpbiA9IHNhdmVfaW5mZXJpb3JfcGlkICgpOworCisgIGluZmVyaW9yX3BpZCA9IG1haW5fcGlkOworCisgIHJldHZhbCA9IGNoaWxkX29wcy50b194ZmVyX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4sIGRvd3JpdGUsIHRhcmdldCk7CisKKyAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogUHJpbnQgc3RhdHVzIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgd2UncmUgYWNjZXNzaW5nLiAgKi8KKworc3RhdGljIHZvaWQKK2hwdXhfdGhyZWFkX2ZpbGVzX2luZm8gKGlnbm9yZSkKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKmlnbm9yZTsKK3sKKyAgY2hpbGRfb3BzLnRvX2ZpbGVzX2luZm8gKGlnbm9yZSk7Cit9CisKK3N0YXRpYyB2b2lkCitocHV4X3RocmVhZF9raWxsX2luZmVyaW9yICgpCit7CisgIGNoaWxkX29wcy50b19raWxsICgpOworfQorCitzdGF0aWMgdm9pZAoraHB1eF90aHJlYWRfbm90aWNlX3NpZ25hbHMgKHBpZCkKKyAgICAgaW50IHBpZDsKK3sKKyAgY2hpbGRfb3BzLnRvX25vdGljZV9zaWduYWxzIChwaWQpOworfQorCisvKiBGb3JrIGFuIGluZmVyaW9yIHByb2Nlc3MsIGFuZCBzdGFydCBkZWJ1Z2dpbmcgaXQgd2l0aCAvcHJvYy4gICovCisKK3N0YXRpYyB2b2lkCitocHV4X3RocmVhZF9jcmVhdGVfaW5mZXJpb3IgKGV4ZWNfZmlsZSwgYWxsYXJncywgZW52KQorICAgICBjaGFyICpleGVjX2ZpbGU7CisgICAgIGNoYXIgKmFsbGFyZ3M7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGNoaWxkX29wcy50b19jcmVhdGVfaW5mZXJpb3IgKGV4ZWNfZmlsZSwgYWxsYXJncywgZW52KTsKKworICBpZiAoaHB1eF90aHJlYWRfYWN0aXZlKQorICAgIHsKKyAgICAgIG1haW5fcGlkID0gaW5mZXJpb3JfcGlkOworCisgICAgICBwdXNoX3RhcmdldCAoJmhwdXhfdGhyZWFkX29wcyk7CisKKyAgICAgIGluZmVyaW9yX3BpZCA9IGZpbmRfYWN0aXZlX3RocmVhZCAoKTsKKworICAgICAgYWRkX3RocmVhZCAoaW5mZXJpb3JfcGlkKTsKKyAgICB9Cit9CisKKy8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBuZXcgc3ltYm9sIHRhYmxlIGlzIHJlYWQgaW4sIG9yIHdoZW4gYWxsCisgICBzeW1ib2wgdGFibGVzIGFyZSByZW1vdmVkLiAgbGlidGhyZWFkX2RiIGNhbiBvbmx5IGJlIGluaXRpYWxpemVkIHdoZW4gaXQKKyAgIGZpbmRzIHRoZSByaWdodCB2YXJpYWJsZXMgaW4gbGlidGhyZWFkLnNvLiAgU2luY2UgaXQncyBhIHNoYXJlZCBsaWJyYXJ5LAorICAgdGhvc2UgdmFyaWFibGVzIGRvbid0IHNob3cgdXAgdW50aWwgdGhlIGxpYnJhcnkgZ2V0cyBtYXBwZWQgYW5kIHRoZSBzeW1ib2wKKyAgIHRhYmxlIGlzIHJlYWQgaW4uICAqLworCit2b2lkCitocHV4X3RocmVhZF9uZXdfb2JqZmlsZSAob2JqZmlsZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXM7CisKKyAgaWYgKCFvYmpmaWxlKQorICAgIHsKKyAgICAgIGhwdXhfdGhyZWFkX2FjdGl2ZSA9IDA7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbXMgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKCJjbWFfX2dfa25vd25fdGhyZWFkcyIsIE5VTEwsIG9iamZpbGUpOworCisgIGlmICghbXMpCisgICAgcmV0dXJuOworCisgIFBfY21hX19nX2tub3duX3RocmVhZHMgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXMpOworCisgIG1zID0gbG9va3VwX21pbmltYWxfc3ltYm9sICgiY21hX19nX2N1cnJlbnRfdGhyZWFkIiwgTlVMTCwgb2JqZmlsZSk7CisKKyAgaWYgKCFtcykKKyAgICByZXR1cm47CisKKyAgUF9jbWFfX2dfY3VycmVudF90aHJlYWQgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXMpOworCisgIGhwdXhfdGhyZWFkX2FjdGl2ZSA9IDE7Cit9CisKKy8qIENsZWFuIHVwIGFmdGVyIHRoZSBpbmZlcmlvciBkaWVzLiAgKi8KKworc3RhdGljIHZvaWQKK2hwdXhfdGhyZWFkX21vdXJuX2luZmVyaW9yICgpCit7CisgIGNoaWxkX29wcy50b19tb3Vybl9pbmZlcmlvciAoKTsKK30KKworLyogTWFyayBvdXIgdGFyZ2V0LXN0cnVjdCBhcyBlbGlnaWJsZSBmb3Igc3RyYXkgInJ1biIgYW5kICJhdHRhY2giIGNvbW1hbmRzLiAgKi8KKworc3RhdGljIGludAoraHB1eF90aHJlYWRfY2FuX3J1biAoKQoreworICByZXR1cm4gY2hpbGRfc3VwcHJlc3NfcnVuOworfQorCitzdGF0aWMgaW50CitocHV4X3RocmVhZF9hbGl2ZSAocGlkKQorICAgICBpbnQgcGlkOworeworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK2hwdXhfdGhyZWFkX3N0b3AgKCkKK3sKKyAgY2hpbGRfb3BzLnRvX3N0b3AgKCk7Cit9CisMCisvKiBDb252ZXJ0IGEgcGlkIHRvIHByaW50YWJsZSBmb3JtLiAqLworCitjaGFyICoKK2hwdXhfcGlkX3RvX3N0ciAocGlkKQorICAgICBpbnQgcGlkOworeworICBzdGF0aWMgY2hhciBidWZbMTAwXTsKKworICBzcHJpbnRmIChidWYsICJUaHJlYWQgJWQiLCBwaWQgPj4gMTYpOworCisgIHJldHVybiBidWY7Cit9CisMCitzdGF0aWMgdm9pZAoraW5pdF9ocHV4X3RocmVhZF9vcHMgKCkKK3sKKyAgaHB1eF90aHJlYWRfb3BzLnRvX3Nob3J0bmFtZSA9ICJocHV4LXRocmVhZHMiOworICBocHV4X3RocmVhZF9vcHMudG9fbG9uZ25hbWUgPSAiSFBVWCB0aHJlYWRzIGFuZCBwdGhyZWFkLiI7CisgIGhwdXhfdGhyZWFkX29wcy50b19kb2MgPSAiSFBVWCB0aHJlYWRzIGFuZCBwdGhyZWFkIHN1cHBvcnQuIjsKKyAgaHB1eF90aHJlYWRfb3BzLnRvX29wZW4gPSBocHV4X3RocmVhZF9vcGVuOworICBocHV4X3RocmVhZF9vcHMudG9fYXR0YWNoID0gaHB1eF90aHJlYWRfYXR0YWNoOworICBocHV4X3RocmVhZF9vcHMudG9fZGV0YWNoID0gaHB1eF90aHJlYWRfZGV0YWNoOworICBocHV4X3RocmVhZF9vcHMudG9fcmVzdW1lID0gaHB1eF90aHJlYWRfcmVzdW1lOworICBocHV4X3RocmVhZF9vcHMudG9fd2FpdCA9IGhwdXhfdGhyZWFkX3dhaXQ7CisgIGhwdXhfdGhyZWFkX29wcy50b19mZXRjaF9yZWdpc3RlcnMgPSBocHV4X3RocmVhZF9mZXRjaF9yZWdpc3RlcnM7CisgIGhwdXhfdGhyZWFkX29wcy50b19zdG9yZV9yZWdpc3RlcnMgPSBocHV4X3RocmVhZF9zdG9yZV9yZWdpc3RlcnM7CisgIGhwdXhfdGhyZWFkX29wcy50b19wcmVwYXJlX3RvX3N0b3JlID0gaHB1eF90aHJlYWRfcHJlcGFyZV90b19zdG9yZTsKKyAgaHB1eF90aHJlYWRfb3BzLnRvX3hmZXJfbWVtb3J5ID0gaHB1eF90aHJlYWRfeGZlcl9tZW1vcnk7CisgIGhwdXhfdGhyZWFkX29wcy50b19maWxlc19pbmZvID0gaHB1eF90aHJlYWRfZmlsZXNfaW5mbzsKKyAgaHB1eF90aHJlYWRfb3BzLnRvX2luc2VydF9icmVha3BvaW50ID0gbWVtb3J5X2luc2VydF9icmVha3BvaW50OworICBocHV4X3RocmVhZF9vcHMudG9fcmVtb3ZlX2JyZWFrcG9pbnQgPSBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQ7CisgIGhwdXhfdGhyZWFkX29wcy50b190ZXJtaW5hbF9pbml0ID0gdGVybWluYWxfaW5pdF9pbmZlcmlvcjsKKyAgaHB1eF90aHJlYWRfb3BzLnRvX3Rlcm1pbmFsX2luZmVyaW9yID0gdGVybWluYWxfaW5mZXJpb3I7CisgIGhwdXhfdGhyZWFkX29wcy50b190ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgPSB0ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQ7CisgIGhwdXhfdGhyZWFkX29wcy50b190ZXJtaW5hbF9vdXJzID0gdGVybWluYWxfb3VyczsKKyAgaHB1eF90aHJlYWRfb3BzLnRvX3Rlcm1pbmFsX2luZm8gPSBjaGlsZF90ZXJtaW5hbF9pbmZvOworICBocHV4X3RocmVhZF9vcHMudG9fa2lsbCA9IGhwdXhfdGhyZWFkX2tpbGxfaW5mZXJpb3I7CisgIGhwdXhfdGhyZWFkX29wcy50b19jcmVhdGVfaW5mZXJpb3IgPSBocHV4X3RocmVhZF9jcmVhdGVfaW5mZXJpb3I7CisgIGhwdXhfdGhyZWFkX29wcy50b19tb3Vybl9pbmZlcmlvciA9IGhwdXhfdGhyZWFkX21vdXJuX2luZmVyaW9yOworICBocHV4X3RocmVhZF9vcHMudG9fY2FuX3J1biA9IGhwdXhfdGhyZWFkX2Nhbl9ydW47CisgIGhwdXhfdGhyZWFkX29wcy50b19ub3RpY2Vfc2lnbmFscyA9IGhwdXhfdGhyZWFkX25vdGljZV9zaWduYWxzOworICBocHV4X3RocmVhZF9vcHMudG9fdGhyZWFkX2FsaXZlID0gaHB1eF90aHJlYWRfdGhyZWFkX2FsaXZlOworICBocHV4X3RocmVhZF9vcHMudG9fc3RvcCA9IGhwdXhfdGhyZWFkX3N0b3A7CisgIGhwdXhfdGhyZWFkX29wcy50b19zdHJhdHVtID0gcHJvY2Vzc19zdHJhdHVtOworICBocHV4X3RocmVhZF9vcHMudG9faGFzX2FsbF9tZW1vcnkgPSAxOworICBocHV4X3RocmVhZF9vcHMudG9faGFzX21lbW9yeSA9IDE7CisgIGhwdXhfdGhyZWFkX29wcy50b19oYXNfc3RhY2sgPSAxOworICBocHV4X3RocmVhZF9vcHMudG9faGFzX3JlZ2lzdGVycyA9IDE7CisgIGhwdXhfdGhyZWFkX29wcy50b19oYXNfZXhlY3V0aW9uID0gMTsKKyAgaHB1eF90aHJlYWRfb3BzLnRvX21hZ2ljID0gT1BTX01BR0lDOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9ocHV4X3RocmVhZCAoKQoreworICBpbml0X2hwdXhfdGhyZWFkX29wcyAoKTsKKyAgYWRkX3RhcmdldCAoJmhwdXhfdGhyZWFkX29wcyk7CisKKyAgY2hpbGRfc3VwcHJlc3NfcnVuID0gMTsKK30KZGlmZiAtLWdpdCBhL2dkYi9pMzg2LXN0dWIuYyBiL2dkYi9pMzg2LXN0dWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjhmMDBjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2kzODYtc3R1Yi5jCkBAIC0wLDAgKzEsOTI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJCVRISVMgU09GVFdBUkUgSVMgTk9UIENPUFlSSUdIVEVECisKKyAgIEhQIG9mZmVycyB0aGUgZm9sbG93aW5nIGZvciB1c2UgaW4gdGhlIHB1YmxpYyBkb21haW4uICBIUCBtYWtlcyBubworICAgd2FycmFudHkgd2l0aCByZWdhcmQgdG8gdGhlIHNvZnR3YXJlIG9yIGl0J3MgcGVyZm9ybWFuY2UgYW5kIHRoZQorICAgdXNlciBhY2NlcHRzIHRoZSBzb2Z0d2FyZSAiQVMgSVMiIHdpdGggYWxsIGZhdWx0cy4KKworICAgSFAgRElTQ0xBSU1TIEFOWSBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIFdJVEggUkVHQVJECisgICBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAgIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgSGVhZGVyOiByZW1jb20uYyx2IDEuMzQgOTEvMDMvMDkgMTI6Mjk6NDkgZ2xlbm5lIEV4cCAkCisgKgorICogIE1vZHVsZSBuYW1lOiByZW1jb20uYyAkCisgKiAgUmV2aXNpb246IDEuMzQgJAorICogIERhdGU6IDkxLzAzLzA5IDEyOjI5OjQ5ICQKKyAqICBDb250cmlidXRvcjogICAgIExha2UgU3RldmVucyBJbnN0cnVtZW50IERpdmlzaW9uJAorICoKKyAqICBEZXNjcmlwdGlvbjogICAgIGxvdyBsZXZlbCBzdXBwb3J0IGZvciBnZGIgZGVidWdnZXIuICQKKyAqCisgKiAgQ29uc2lkZXJhdGlvbnM6ICBvbmx5IHdvcmtzIG9uIHRhcmdldCBoYXJkd2FyZSAkCisgKgorICogIFdyaXR0ZW4gYnk6ICAgICAgR2xlbm4gRW5nZWwgJAorICogIE1vZHVsZVN0YXRlOiAgICAgRXhwZXJpbWVudGFsICQKKyAqCisgKiAgTk9URVM6ICAgICAgICAgICBTZWUgQmVsb3cgJAorICoKKyAqICBNb2RpZmllZCBmb3IgMzg2IGJ5IEppbSBLaW5nZG9uLCBDeWdudXMgU3VwcG9ydC4KKyAqCisgKiAgVG8gZW5hYmxlIGRlYnVnZ2VyIHN1cHBvcnQsIHR3byB0aGluZ3MgbmVlZCB0byBoYXBwZW4uICBPbmUsIGEKKyAqICBjYWxsIHRvIHNldF9kZWJ1Z190cmFwcygpIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBhbGxvdyBhbnkgYnJlYWtwb2ludHMKKyAqICBvciBlcnJvciBjb25kaXRpb25zIHRvIGJlIHByb3Blcmx5IGludGVyY2VwdGVkIGFuZCByZXBvcnRlZCB0byBnZGIuCisgKiAgVHdvLCBhIGJyZWFrcG9pbnQgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkIHRvIGJlZ2luIGNvbW11bmljYXRpb24uICBUaGlzCisgKiAgaXMgbW9zdCBlYXNpbHkgYWNjb21wbGlzaGVkIGJ5IGEgY2FsbCB0byBicmVha3BvaW50KCkuICBCcmVha3BvaW50KCkKKyAqICBzaW11bGF0ZXMgYSBicmVha3BvaW50IGJ5IGV4ZWN1dGluZyBhIHRyYXAgIzEuCisgKgorICogIFRoZSBleHRlcm5hbCBmdW5jdGlvbiBleGNlcHRpb25IYW5kbGVyKCkgaXMKKyAqICB1c2VkIHRvIGF0dGFjaCBhIHNwZWNpZmljIGhhbmRsZXIgdG8gYSBzcGVjaWZpYyAzODYgdmVjdG9yIG51bWJlci4KKyAqICBJdCBzaG91bGQgdXNlIHRoZSBzYW1lIHByaXZpbGVnZSBsZXZlbCBpdCBydW5zIGF0LiAgSXQgc2hvdWxkCisgKiAgaW5zdGFsbCBpdCBhcyBhbiBpbnRlcnJ1cHQgZ2F0ZSBzbyB0aGF0IGludGVycnVwdHMgYXJlIG1hc2tlZAorICogIHdoaWxlIHRoZSBoYW5kbGVyIHJ1bnMuCisgKiAgQWxzbywgbmVlZCB0byBhc3NpZ24gZXhjZXB0aW9uSG9vayBhbmQgb2xkRXhjZXB0aW9uSG9vay4KKyAqCisgKiAgQmVjYXVzZSBnZGIgd2lsbCBzb21ldGltZXMgd3JpdGUgdG8gdGhlIHN0YWNrIGFyZWEgdG8gZXhlY3V0ZSBmdW5jdGlvbgorICogIGNhbGxzLCB0aGlzIHByb2dyYW0gY2Fubm90IHJlbHkgb24gdXNpbmcgdGhlIHN1cGVydmlzb3Igc3RhY2sgc28gaXQKKyAqICB1c2VzIGl0J3Mgb3duIHN0YWNrIGFyZWEgcmVzZXJ2ZWQgaW4gdGhlIGludCBhcnJheSByZW1jb21TdGFjay4KKyAqCisgKioqKioqKioqKioqKgorICoKKyAqICAgIFRoZSBmb2xsb3dpbmcgZ2RiIGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQ6CisgKgorICogY29tbWFuZCAgICAgICAgICBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4gdmFsdWUKKyAqCisgKiAgICBnICAgICAgICAgICAgIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIENQVSByZWdpc3RlcnMgIGhleCBkYXRhIG9yIEVOTgorICogICAgRyAgICAgICAgICAgICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBDUFUgcmVnaXN0ZXJzICAgICBPSyBvciBFTk4KKyAqCisgKiAgICBtQUEuLkFBLExMTEwgIFJlYWQgTExMTCBieXRlcyBhdCBhZGRyZXNzIEFBLi5BQSAgICAgIGhleCBkYXRhIG9yIEVOTgorICogICAgTUFBLi5BQSxMTExMOiBXcml0ZSBMTExMIGJ5dGVzIGF0IGFkZHJlc3MgQUEuQUEgICAgICBPSyBvciBFTk4KKyAqCisgKiAgICBjICAgICAgICAgICAgIFJlc3VtZSBhdCBjdXJyZW50IGFkZHJlc3MgICAgICAgICAgICAgIFNOTiAgICggc2lnbmFsIE5OKQorICogICAgY0FBLi5BQSAgICAgICBDb250aW51ZSBhdCBhZGRyZXNzIEFBLi5BQSAgICAgICAgICAgICBTTk4KKyAqCisgKiAgICBzICAgICAgICAgICAgIFN0ZXAgb25lIGluc3RydWN0aW9uICAgICAgICAgICAgICAgICAgIFNOTgorICogICAgc0FBLi5BQSAgICAgICBTdGVwIG9uZSBpbnN0cnVjdGlvbiBmcm9tIEFBLi5BQSAgICAgICBTTk4KKyAqCisgKiAgICBrICAgICAgICAgICAgIGtpbGwKKyAqCisgKiAgICA/ICAgICAgICAgICAgIFdoYXQgd2FzIHRoZSBsYXN0IHNpZ3ZhbCA/ICAgICAgICAgICAgIFNOTiAgIChzaWduYWwgTk4pCisgKgorICogQWxsIGNvbW1hbmRzIGFuZCByZXNwb25zZXMgYXJlIHNlbnQgd2l0aCBhIHBhY2tldCB3aGljaCBpbmNsdWRlcyBhCisgKiBjaGVja3N1bS4gIEEgcGFja2V0IGNvbnNpc3RzIG9mCisgKgorICogJDxwYWNrZXQgaW5mbz4jPGNoZWNrc3VtPi4KKyAqCisgKiB3aGVyZQorICogPHBhY2tldCBpbmZvPiA6OiA8Y2hhcmFjdGVycyByZXByZXNlbnRpbmcgdGhlIGNvbW1hbmQgb3IgcmVzcG9uc2U+CisgKiA8Y2hlY2tzdW0+ICAgIDo6IDwgdHdvIGhleCBkaWdpdHMgY29tcHV0ZWQgYXMgbW9kdWxvIDI1NiBzdW0gb2YgPHBhY2tldGluZm8+PgorICoKKyAqIFdoZW4gYSBwYWNrZXQgaXMgcmVjZWl2ZWQsIGl0IGlzIGZpcnN0IGFja25vd2xlZGdlZCB3aXRoIGVpdGhlciAnKycgb3IgJy0nLgorICogJysnIGluZGljYXRlcyBhIHN1Y2Nlc3NmdWwgdHJhbnNmZXIuICAnLScgaW5kaWNhdGVzIGEgZmFpbGVkIHRyYW5zZmVyLgorICoKKyAqIEV4YW1wbGU6CisgKgorICogSG9zdDogICAgICAgICAgICAgICAgICBSZXBseToKKyAqICRtMCwxMCMyYSAgICAgICAgICAgICAgICskMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUjNDIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBleHRlcm5hbCBsb3ctbGV2ZWwgc3VwcG9ydCByb3V0aW5lcworICovCit0eXBlZGVmIHZvaWQgKCpFeGNlcHRpb25Ib29rKShpbnQpOyAgIC8qIHBvaW50ZXIgdG8gZnVuY3Rpb24gd2l0aCBpbnQgcGFybSAqLwordHlwZWRlZiB2b2lkICgqRnVuY3Rpb24pKCk7ICAgICAgICAgICAvKiBwb2ludGVyIHRvIGEgZnVuY3Rpb24gKi8KKworZXh0ZXJuIHZvaWQgcHV0RGVidWdDaGFyKCk7CS8qIHdyaXRlIGEgc2luZ2xlIGNoYXJhY3RlciAgICAgICovCitleHRlcm4gaW50IGdldERlYnVnQ2hhcigpOwkvKiByZWFkIGFuZCByZXR1cm4gYSBzaW5nbGUgY2hhciAqLworCitleHRlcm4gRnVuY3Rpb24gZXhjZXB0aW9uSGFuZGxlcigpOyAgLyogYXNzaWduIGFuIGV4Y2VwdGlvbiBoYW5kbGVyICovCitleHRlcm4gRXhjZXB0aW9uSG9vayBleGNlcHRpb25Ib29rOyAgLyogaG9vayB2YXJpYWJsZSBmb3IgZXJyb3JzL2V4Y2VwdGlvbnMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJVRk1BWCBkZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGluYm91bmQvb3V0Ym91bmQgYnVmZmVycyovCisvKiBhdCBsZWFzdCBOVU1SRUdCWVRFUyoyIGFyZSBuZWVkZWQgZm9yIHJlZ2lzdGVyIHBhY2tldHMgKi8KKyNkZWZpbmUgQlVGTUFYIDQwMAorCitzdGF0aWMgY2hhciBpbml0aWFsaXplZDsgIC8qIGJvb2xlYW4gZmxhZy4gIT0gMCBtZWFucyB3ZSd2ZSBiZWVuIGluaXRpYWxpemVkICovCisKK2ludCAgICAgcmVtb3RlX2RlYnVnOworLyogIGRlYnVnID4gIDAgcHJpbnRzIGlsbC1mb3JtZWQgY29tbWFuZHMgaW4gdmFsaWQgcGFja2V0cyAmIGNoZWNrc3VtIGVycm9ycyAqLworCit2b2lkIHdhaXRhYml0KCk7CisKK3N0YXRpYyBjb25zdCBjaGFyIGhleGNoYXJzW109IjAxMjM0NTY3ODlhYmNkZWYiOworCisvKiBOdW1iZXIgb2YgcmVnaXN0ZXJzLiAgKi8KKyNkZWZpbmUgTlVNUkVHUwkxNgorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2YgcmVnaXN0ZXJzLiAgKi8KKyNkZWZpbmUgTlVNUkVHQllURVMgKE5VTVJFR1MgKiA0KQorCitlbnVtIHJlZ25hbWVzIHtFQVgsIEVDWCwgRURYLCBFQlgsIEVTUCwgRUJQLCBFU0ksIEVESSwKKwkgICAgICAgUEMgLyogYWxzbyBrbm93biBhcyBlaXAgKi8sCisJICAgICAgIFBTIC8qIGFsc28ga25vd24gYXMgZWZsYWdzICovLAorCSAgICAgICBDUywgU1MsIERTLCBFUywgRlMsIEdTfTsKKworLyoKKyAqIHRoZXNlIHNob3VsZCBub3QgYmUgc3RhdGljIGN1eiB0aGV5IGNhbiBiZSB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKKyAqLworaW50IHJlZ2lzdGVyc1tOVU1SRUdTXTsKKworI2RlZmluZSBTVEFDS1NJWkUgMTAwMDAKK2ludCByZW1jb21TdGFja1tTVEFDS1NJWkUvc2l6ZW9mKGludCldOworc3RhdGljIGludCogc3RhY2tQdHIgPSAmcmVtY29tU3RhY2tbU1RBQ0tTSVpFL3NpemVvZihpbnQpIC0gMV07CisKKy8qCisgKiBJbiBtYW55IGNhc2VzLCB0aGUgc3lzdGVtIHdpbGwgd2FudCB0byBjb250aW51ZSBleGNlcHRpb24gcHJvY2Vzc2luZworICogd2hlbiBhIGNvbnRpbnVlIGNvbW1hbmQgaXMgZ2l2ZW4uCisgKiBvbGRFeGNlcHRpb25Ib29rIGlzIGEgZnVuY3Rpb24gdG8gaW52b2tlIGluIHRoaXMgY2FzZS4KKyAqLworCitzdGF0aWMgRXhjZXB0aW9uSG9vayBvbGRFeGNlcHRpb25Ib29rOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBBU1NFTUJMWSBDT0RFIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogCQkJCQkJCQkJICAgKi8KKworZXh0ZXJuIHZvaWQKK3JldHVybl90b19wcm9nICgpOworCisvKiBSZXN0b3JlIHRoZSBwcm9ncmFtJ3MgcmVnaXN0ZXJzIChpbmNsdWRpbmcgdGhlIHN0YWNrIHBvaW50ZXIsIHdoaWNoCisgICBtZWFucyB3ZSBnZXQgdGhlIHJpZ2h0IHN0YWNrIGFuZCBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHBvcHBpbmcgb3VyCisgICByZXR1cm4gYWRkcmVzcyBhbmQgYW55IHN0YWNrIGZyYW1lcyBhbmQgc28gb24pIGFuZCByZXR1cm4uICAqLworYXNtKCIudGV4dCIpOworYXNtKCIuZ2xvYmwgX3JldHVybl90b19wcm9nIik7Cithc20oIl9yZXR1cm5fdG9fcHJvZzoiKTsKK2FzbSgiICAgICAgICBtb3Z3IF9yZWdpc3RlcnMrNDQsICVzcyIpOworYXNtKCIgICAgICAgIG1vdmwgX3JlZ2lzdGVycysxNiwgJWVzcCIpOworYXNtKCIgICAgICAgIG1vdmwgX3JlZ2lzdGVycys0LCAlZWN4Iik7Cithc20oIiAgICAgICAgbW92bCBfcmVnaXN0ZXJzKzgsICVlZHgiKTsKK2FzbSgiICAgICAgICBtb3ZsIF9yZWdpc3RlcnMrMTIsICVlYngiKTsKK2FzbSgiICAgICAgICBtb3ZsIF9yZWdpc3RlcnMrMjAsICVlYnAiKTsKK2FzbSgiICAgICAgICBtb3ZsIF9yZWdpc3RlcnMrMjQsICVlc2kiKTsKK2FzbSgiICAgICAgICBtb3ZsIF9yZWdpc3RlcnMrMjgsICVlZGkiKTsKK2FzbSgiICAgICAgICBtb3Z3IF9yZWdpc3RlcnMrNDgsICVkcyIpOworYXNtKCIgICAgICAgIG1vdncgX3JlZ2lzdGVycys1MiwgJWVzIik7Cithc20oIiAgICAgICAgbW92dyBfcmVnaXN0ZXJzKzU2LCAlZnMiKTsKK2FzbSgiICAgICAgICBtb3Z3IF9yZWdpc3RlcnMrNjAsICVncyIpOworYXNtKCIgICAgICAgIG1vdmwgX3JlZ2lzdGVycyszNiwgJWVheCIpOworYXNtKCIgICAgICAgIHB1c2hsICVlYXgiKTsgIC8qIHNhdmVkIGVmbGFncyAqLworYXNtKCIgICAgICAgIG1vdmwgX3JlZ2lzdGVycys0MCwgJWVheCIpOworYXNtKCIgICAgICAgIHB1c2hsICVlYXgiKTsgIC8qIHNhdmVkIGNzICovCithc20oIiAgICAgICAgbW92bCBfcmVnaXN0ZXJzKzMyLCAlZWF4Iik7Cithc20oIiAgICAgICAgcHVzaGwgJWVheCIpOyAgLyogc2F2ZWQgZWlwICovCithc20oIiAgICAgICAgbW92bCBfcmVnaXN0ZXJzLCAlZWF4Iik7CisvKiB1c2UgaXJldCB0byByZXN0b3JlIHBjIGFuZCBmbGFncyB0b2dldGhlciBzbworICAgdGhhdCB0cmFjZSBmbGFnIHdvcmtzIHJpZ2h0LiAgKi8KK2FzbSgiICAgICAgICBpcmV0Iik7CisKKyNkZWZpbmUgQlJFQUtQT0lOVCgpIGFzbSgiICAgaW50ICQzIik7CisKKy8qIFB1dCB0aGUgZXJyb3IgY29kZSBoZXJlIGp1c3QgaW4gY2FzZSB0aGUgdXNlciBjYXJlcy4gICovCitpbnQgZ2RiX2kzODZlcnJjb2RlOworLyogTGlrZXdpc2UsIHRoZSB2ZWN0b3IgbnVtYmVyIGhlcmUgKHNpbmNlIEdEQiBvbmx5IGdldHMgdGhlIHNpZ25hbAorICAgbnVtYmVyIHRocm91Z2ggdGhlIHVzdWFsIG1lYW5zLCBhbmQgdGhhdCdzIG5vdCB2ZXJ5IHNwZWNpZmljKS4gICovCitpbnQgZ2RiX2kzODZ2ZWN0b3IgPSAtMTsKKworLyogR0RCIHN0b3JlcyBzZWdtZW50IHJlZ2lzdGVycyBpbiAzMi1iaXQgd29yZHMgKHRoYXQncyBqdXN0IHRoZSB3YXkKKyAgIG0taTM4NnYuaCBpcyB3cml0dGVuKS4gIFNvIHplcm8gdGhlIGFwcHJvcHJpYXRlIGFyZWFzIGluIHJlZ2lzdGVycy4gICovCisjZGVmaW5lIFNBVkVfUkVHSVNURVJTMSgpIFwKKyAgYXNtICgibW92bCAlZWF4LCBfcmVnaXN0ZXJzIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICBcCisgIGFzbSAoIm1vdmwgJWVjeCwgX3JlZ2lzdGVycys0Iik7CQkJICAJCSAgICAgXAorICBhc20gKCJtb3ZsICVlZHgsIF9yZWdpc3RlcnMrOCIpOwkJCSAgCQkgICAgIFwKKyAgYXNtICgibW92bCAlZWJ4LCBfcmVnaXN0ZXJzKzEyIik7CQkJICAJCSAgICAgXAorICBhc20gKCJtb3ZsICVlYnAsIF9yZWdpc3RlcnMrMjAiKTsJCQkgIAkJICAgICBcCisgIGFzbSAoIm1vdmwgJWVzaSwgX3JlZ2lzdGVycysyNCIpOwkJCSAgCQkgICAgIFwKKyAgYXNtICgibW92bCAlZWRpLCBfcmVnaXN0ZXJzKzI4Iik7CQkJICAJCSAgICAgXAorICBhc20gKCJtb3Z3ICQwLCAlYXgiKTsJCQkJCQkJICAgICBcCisgIGFzbSAoIm1vdncgJWRzLCBfcmVnaXN0ZXJzKzQ4Iik7CQkJICAJCSAgICAgXAorICBhc20gKCJtb3Z3ICVheCwgX3JlZ2lzdGVycys1MCIpOwkJCQkJICAgICBcCisgIGFzbSAoIm1vdncgJWVzLCBfcmVnaXN0ZXJzKzUyIik7CQkJICAJCSAgICAgXAorICBhc20gKCJtb3Z3ICVheCwgX3JlZ2lzdGVycys1NCIpOwkJCQkJICAgICBcCisgIGFzbSAoIm1vdncgJWZzLCBfcmVnaXN0ZXJzKzU2Iik7CQkJICAJCSAgICAgXAorICBhc20gKCJtb3Z3ICVheCwgX3JlZ2lzdGVycys1OCIpOwkJCQkJICAgICBcCisgIGFzbSAoIm1vdncgJWdzLCBfcmVnaXN0ZXJzKzYwIik7CQkJICAJCSAgICAgXAorICBhc20gKCJtb3Z3ICVheCwgX3JlZ2lzdGVycys2MiIpOworI2RlZmluZSBTQVZFX0VSUkNPREUoKSBcCisgIGFzbSAoInBvcGwgJWVieCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzbSAoIm1vdmwgJWVieCwgX2dkYl9pMzg2ZXJyY29kZSIpOworI2RlZmluZSBTQVZFX1JFR0lTVEVSUzIoKSBcCisgIGFzbSAoInBvcGwgJWVieCIpOyAvKiBvbGQgZWlwICovCQkJICAJCSAgICAgXAorICBhc20gKCJtb3ZsICVlYngsIF9yZWdpc3RlcnMrMzIiKTsJCQkgIAkJICAgICBcCisgIGFzbSAoInBvcGwgJWVieCIpOwkgLyogb2xkIGNzICovCQkJICAJCSAgICAgXAorICBhc20gKCJtb3ZsICVlYngsIF9yZWdpc3RlcnMrNDAiKTsJCQkgIAkJICAgICBcCisgIGFzbSAoIm1vdncgJWF4LCBfcmVnaXN0ZXJzKzQyIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNtICgicG9wbCAlZWJ4Iik7CSAvKiBvbGQgZWZsYWdzICovCQkgIAkJICAgICBcCisgIGFzbSAoIm1vdmwgJWVieCwgX3JlZ2lzdGVycyszNiIpOwkJCSAJCSAgICAgXAorICAvKiBOb3cgdGhhdCB3ZSd2ZSBkb25lIHRoZSBwb3BzLCB3ZSBjYW4gc2F2ZSB0aGUgc3RhY2sgcG9pbnRlci4iKTsgICovICAgXAorICBhc20gKCJtb3Z3ICVzcywgX3JlZ2lzdGVycys0NCIpOwkJCQkJICAgICBcCisgIGFzbSAoIm1vdncgJWF4LCBfcmVnaXN0ZXJzKzQ2Iik7ICAgICAJICAgICAgIAkgICAgICAgCSAgICAgICAJICAgICAgIAkgICAgIFwKKyAgYXNtICgibW92bCAlZXNwLCBfcmVnaXN0ZXJzKzE2Iik7CisKKy8qIFNlZSBpZiBtZW1fZmF1bHRfcm91dGluZSBpcyBzZXQsIGlmIHNvIGp1c3QgSVJFVCB0byB0aGF0IGFkZHJlc3MuICAqLworI2RlZmluZSBDSEVDS19GQVVMVCgpIFwKKyAgYXNtICgiY21wbCAkMCwgX21lbV9mYXVsdF9yb3V0aW5lIik7CQkJCQkgICBcCisgIGFzbSAoImpuZSBtZW1fZmF1bHQiKTsKKworYXNtICgiLnRleHQiKTsKK2FzbSAoIm1lbV9mYXVsdDoiKTsKKy8qIE9LIHRvIGNsb2JiZXIgdGVtcCByZWdpc3RlcnM7IHdlJ3JlIGp1c3QgZ29pbmcgdG8gZW5kIHVwIGluIHNldF9tZW1fZXJyLiAgKi8KKy8qIFBvcCBlcnJvciBjb2RlIGZyb20gdGhlIHN0YWNrIGFuZCBzYXZlIGl0LiAgKi8KK2FzbSAoIiAgICAgcG9wbCAlZWF4Iik7Cithc20gKCIgICAgIG1vdmwgJWVheCwgX2dkYl9pMzg2ZXJyY29kZSIpOworCithc20gKCIgICAgIHBvcGwgJWVheCIpOyAvKiBlaXAgKi8KKy8qIFdlIGRvbid0IHdhbnQgdG8gcmV0dXJuIHRoZXJlLCB3ZSB3YW50IHRvIHJldHVybiB0byB0aGUgZnVuY3Rpb24KKyAgIHBvaW50ZWQgdG8gYnkgbWVtX2ZhdWx0X3JvdXRpbmUgaW5zdGVhZC4gICovCithc20gKCIgICAgIG1vdmwgX21lbV9mYXVsdF9yb3V0aW5lLCAlZWF4Iik7Cithc20gKCIgICAgIHBvcGwgJWVjeCIpOyAvKiBjcyAobG93IDE2IGJpdHM7IGp1bmsgaW4gaGkgMTYgYml0cykuICAqLworYXNtICgiICAgICBwb3BsICVlZHgiKTsgLyogZWZsYWdzICovCisKKy8qIFJlbW92ZSB0aGlzIHN0YWNrIGZyYW1lOyB3aGVuIHdlIGRvIHRoZSBpcmV0LCB3ZSB3aWxsIGJlIGdvaW5nIHRvCisgICB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbiwgc28gd2Ugd2FudCB0aGUgc3RhY2sgdG8gbG9vayBqdXN0IGxpa2UgaXQKKyAgIHdvdWxkIGFmdGVyIGEgImNhbGwiIGluc3RydWN0aW9uLiAgKi8KK2FzbSAoIiAgICAgbGVhdmUiKTsKKworLyogUHVzaCB0aGUgc3R1ZmYgdGhhdCBpcmV0IHdhbnRzLiAgKi8KK2FzbSAoIiAgICAgcHVzaGwgJWVkeCIpOyAvKiBlZmxhZ3MgKi8KK2FzbSAoIiAgICAgcHVzaGwgJWVjeCIpOyAvKiBjcyAqLworYXNtICgiICAgICBwdXNobCAlZWF4Iik7IC8qIGVpcCAqLworCisvKiBaZXJvIG1lbV9mYXVsdF9yb3V0aW5lLiAgKi8KK2FzbSAoIiAgICAgbW92bCAkMCwgJWVheCIpOworYXNtICgiICAgICBtb3ZsICVlYXgsIF9tZW1fZmF1bHRfcm91dGluZSIpOworCithc20gKCJpcmV0Iik7CisKKyNkZWZpbmUgQ0FMTF9IT09LKCkgYXNtKCJjYWxsIF9yZW1jb21IYW5kbGVyIik7CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBpMzg2IGV4Y2VwdGlvbiBvY2N1cnMuICBJdCBzYXZlcworICogYWxsIHRoZSBjcHUgcmVncyBpbiB0aGUgX3JlZ2lzdGVycyBhcnJheSwgbXVuZ2VzIHRoZSBzdGFjayBhIGJpdCwKKyAqIGFuZCBpbnZva2VzIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIChyZW1jb21faGFuZGxlcikuCisgKgorICogc3RhY2sgb24gZW50cnk6ICAgICAgICAgICAgICAgICAgICAgICBzdGFjayBvbiBleGl0OgorICogICBvbGQgZWZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgbnVtYmVyCisgKiAgIG9sZCBjcyAoemVyby1maWxsZWQgdG8gMzIgYml0cykKKyAqICAgb2xkIGVpcAorICoKKyAqLworZXh0ZXJuIHZvaWQgX2NhdGNoRXhjZXB0aW9uMygpOworYXNtKCIudGV4dCIpOworYXNtKCIuZ2xvYmwgX19jYXRjaEV4Y2VwdGlvbjMiKTsKK2FzbSgiX19jYXRjaEV4Y2VwdGlvbjM6Iik7CitTQVZFX1JFR0lTVEVSUzEoKTsKK1NBVkVfUkVHSVNURVJTMigpOworYXNtICgicHVzaGwgJDMiKTsKK0NBTExfSE9PSygpOworCisvKiBTYW1lIHRoaW5nIGZvciBleGNlcHRpb24gMS4gICovCitleHRlcm4gdm9pZCBfY2F0Y2hFeGNlcHRpb24xKCk7Cithc20oIi50ZXh0Iik7Cithc20oIi5nbG9ibCBfX2NhdGNoRXhjZXB0aW9uMSIpOworYXNtKCJfX2NhdGNoRXhjZXB0aW9uMToiKTsKK1NBVkVfUkVHSVNURVJTMSgpOworU0FWRV9SRUdJU1RFUlMyKCk7Cithc20gKCJwdXNobCAkMSIpOworQ0FMTF9IT09LKCk7CisKKy8qIFNhbWUgdGhpbmcgZm9yIGV4Y2VwdGlvbiAwLiAgKi8KK2V4dGVybiB2b2lkIF9jYXRjaEV4Y2VwdGlvbjAoKTsKK2FzbSgiLnRleHQiKTsKK2FzbSgiLmdsb2JsIF9fY2F0Y2hFeGNlcHRpb24wIik7Cithc20oIl9fY2F0Y2hFeGNlcHRpb24wOiIpOworU0FWRV9SRUdJU1RFUlMxKCk7CitTQVZFX1JFR0lTVEVSUzIoKTsKK2FzbSAoInB1c2hsICQwIik7CitDQUxMX0hPT0soKTsKKworLyogU2FtZSB0aGluZyBmb3IgZXhjZXB0aW9uIDQuICAqLworZXh0ZXJuIHZvaWQgX2NhdGNoRXhjZXB0aW9uNCgpOworYXNtKCIudGV4dCIpOworYXNtKCIuZ2xvYmwgX19jYXRjaEV4Y2VwdGlvbjQiKTsKK2FzbSgiX19jYXRjaEV4Y2VwdGlvbjQ6Iik7CitTQVZFX1JFR0lTVEVSUzEoKTsKK1NBVkVfUkVHSVNURVJTMigpOworYXNtICgicHVzaGwgJDQiKTsKK0NBTExfSE9PSygpOworCisvKiBTYW1lIHRoaW5nIGZvciBleGNlcHRpb24gNS4gICovCitleHRlcm4gdm9pZCBfY2F0Y2hFeGNlcHRpb241KCk7Cithc20oIi50ZXh0Iik7Cithc20oIi5nbG9ibCBfX2NhdGNoRXhjZXB0aW9uNSIpOworYXNtKCJfX2NhdGNoRXhjZXB0aW9uNToiKTsKK1NBVkVfUkVHSVNURVJTMSgpOworU0FWRV9SRUdJU1RFUlMyKCk7Cithc20gKCJwdXNobCAkNSIpOworQ0FMTF9IT09LKCk7CisKKy8qIFNhbWUgdGhpbmcgZm9yIGV4Y2VwdGlvbiA2LiAgKi8KK2V4dGVybiB2b2lkIF9jYXRjaEV4Y2VwdGlvbjYoKTsKK2FzbSgiLnRleHQiKTsKK2FzbSgiLmdsb2JsIF9fY2F0Y2hFeGNlcHRpb242Iik7Cithc20oIl9fY2F0Y2hFeGNlcHRpb242OiIpOworU0FWRV9SRUdJU1RFUlMxKCk7CitTQVZFX1JFR0lTVEVSUzIoKTsKK2FzbSAoInB1c2hsICQ2Iik7CitDQUxMX0hPT0soKTsKKworLyogU2FtZSB0aGluZyBmb3IgZXhjZXB0aW9uIDcuICAqLworZXh0ZXJuIHZvaWQgX2NhdGNoRXhjZXB0aW9uNygpOworYXNtKCIudGV4dCIpOworYXNtKCIuZ2xvYmwgX19jYXRjaEV4Y2VwdGlvbjciKTsKK2FzbSgiX19jYXRjaEV4Y2VwdGlvbjc6Iik7CitTQVZFX1JFR0lTVEVSUzEoKTsKK1NBVkVfUkVHSVNURVJTMigpOworYXNtICgicHVzaGwgJDciKTsKK0NBTExfSE9PSygpOworCisvKiBTYW1lIHRoaW5nIGZvciBleGNlcHRpb24gOC4gICovCitleHRlcm4gdm9pZCBfY2F0Y2hFeGNlcHRpb244KCk7Cithc20oIi50ZXh0Iik7Cithc20oIi5nbG9ibCBfX2NhdGNoRXhjZXB0aW9uOCIpOworYXNtKCJfX2NhdGNoRXhjZXB0aW9uODoiKTsKK1NBVkVfUkVHSVNURVJTMSgpOworU0FWRV9FUlJDT0RFKCk7CitTQVZFX1JFR0lTVEVSUzIoKTsKK2FzbSAoInB1c2hsICQ4Iik7CitDQUxMX0hPT0soKTsKKworLyogU2FtZSB0aGluZyBmb3IgZXhjZXB0aW9uIDkuICAqLworZXh0ZXJuIHZvaWQgX2NhdGNoRXhjZXB0aW9uOSgpOworYXNtKCIudGV4dCIpOworYXNtKCIuZ2xvYmwgX19jYXRjaEV4Y2VwdGlvbjkiKTsKK2FzbSgiX19jYXRjaEV4Y2VwdGlvbjk6Iik7CitTQVZFX1JFR0lTVEVSUzEoKTsKK1NBVkVfUkVHSVNURVJTMigpOworYXNtICgicHVzaGwgJDkiKTsKK0NBTExfSE9PSygpOworCisvKiBTYW1lIHRoaW5nIGZvciBleGNlcHRpb24gMTAuICAqLworZXh0ZXJuIHZvaWQgX2NhdGNoRXhjZXB0aW9uMTAoKTsKK2FzbSgiLnRleHQiKTsKK2FzbSgiLmdsb2JsIF9fY2F0Y2hFeGNlcHRpb24xMCIpOworYXNtKCJfX2NhdGNoRXhjZXB0aW9uMTA6Iik7CitTQVZFX1JFR0lTVEVSUzEoKTsKK1NBVkVfRVJSQ09ERSgpOworU0FWRV9SRUdJU1RFUlMyKCk7Cithc20gKCJwdXNobCAkMTAiKTsKK0NBTExfSE9PSygpOworCisvKiBTYW1lIHRoaW5nIGZvciBleGNlcHRpb24gMTIuICAqLworZXh0ZXJuIHZvaWQgX2NhdGNoRXhjZXB0aW9uMTIoKTsKK2FzbSgiLnRleHQiKTsKK2FzbSgiLmdsb2JsIF9fY2F0Y2hFeGNlcHRpb24xMiIpOworYXNtKCJfX2NhdGNoRXhjZXB0aW9uMTI6Iik7CitTQVZFX1JFR0lTVEVSUzEoKTsKK1NBVkVfRVJSQ09ERSgpOworU0FWRV9SRUdJU1RFUlMyKCk7Cithc20gKCJwdXNobCAkMTIiKTsKK0NBTExfSE9PSygpOworCisvKiBTYW1lIHRoaW5nIGZvciBleGNlcHRpb24gMTYuICAqLworZXh0ZXJuIHZvaWQgX2NhdGNoRXhjZXB0aW9uMTYoKTsKK2FzbSgiLnRleHQiKTsKK2FzbSgiLmdsb2JsIF9fY2F0Y2hFeGNlcHRpb24xNiIpOworYXNtKCJfX2NhdGNoRXhjZXB0aW9uMTY6Iik7CitTQVZFX1JFR0lTVEVSUzEoKTsKK1NBVkVfUkVHSVNURVJTMigpOworYXNtICgicHVzaGwgJDE2Iik7CitDQUxMX0hPT0soKTsKKworLyogRm9yIDEzLCAxMSwgYW5kIDE0IHdlIGhhdmUgdG8gZGVhbCB3aXRoIHRoZSBDSEVDS19GQVVMVCBzdHVmZi4gICovCisKKy8qIFNhbWUgdGhpbmcgZm9yIGV4Y2VwdGlvbiAxMy4gICovCitleHRlcm4gdm9pZCBfY2F0Y2hFeGNlcHRpb24xMyAoKTsKK2FzbSAoIi50ZXh0Iik7Cithc20gKCIuZ2xvYmwgX19jYXRjaEV4Y2VwdGlvbjEzIik7Cithc20gKCJfX2NhdGNoRXhjZXB0aW9uMTM6Iik7CitDSEVDS19GQVVMVCgpOworU0FWRV9SRUdJU1RFUlMxKCk7CitTQVZFX0VSUkNPREUoKTsKK1NBVkVfUkVHSVNURVJTMigpOworYXNtICgicHVzaGwgJDEzIik7CitDQUxMX0hPT0soKTsKKworLyogU2FtZSB0aGluZyBmb3IgZXhjZXB0aW9uIDExLiAgKi8KK2V4dGVybiB2b2lkIF9jYXRjaEV4Y2VwdGlvbjExICgpOworYXNtICgiLnRleHQiKTsKK2FzbSAoIi5nbG9ibCBfX2NhdGNoRXhjZXB0aW9uMTEiKTsKK2FzbSAoIl9fY2F0Y2hFeGNlcHRpb24xMToiKTsKK0NIRUNLX0ZBVUxUKCk7CitTQVZFX1JFR0lTVEVSUzEoKTsKK1NBVkVfRVJSQ09ERSgpOworU0FWRV9SRUdJU1RFUlMyKCk7Cithc20gKCJwdXNobCAkMTEiKTsKK0NBTExfSE9PSygpOworCisvKiBTYW1lIHRoaW5nIGZvciBleGNlcHRpb24gMTQuICAqLworZXh0ZXJuIHZvaWQgX2NhdGNoRXhjZXB0aW9uMTQgKCk7Cithc20gKCIudGV4dCIpOworYXNtICgiLmdsb2JsIF9fY2F0Y2hFeGNlcHRpb24xNCIpOworYXNtICgiX19jYXRjaEV4Y2VwdGlvbjE0OiIpOworQ0hFQ0tfRkFVTFQoKTsKK1NBVkVfUkVHSVNURVJTMSgpOworU0FWRV9FUlJDT0RFKCk7CitTQVZFX1JFR0lTVEVSUzIoKTsKK2FzbSAoInB1c2hsICQxNCIpOworQ0FMTF9IT09LKCk7CisKKy8qCisgKiByZW1jb21IYW5kbGVyIGlzIGEgZnJvbnQgZW5kIGZvciBoYW5kbGVfZXhjZXB0aW9uLiAgSXQgbW92ZXMgdGhlCisgKiBzdGFjayBwb2ludGVyIGludG8gYW4gYXJlYSByZXNlcnZlZCBmb3IgZGVidWdnZXIgdXNlLgorICovCithc20oIl9yZW1jb21IYW5kbGVyOiIpOworYXNtKCIgICAgICAgICAgIHBvcGwgJWVheCIpOyAgICAgICAgLyogcG9wIG9mZiByZXR1cm4gYWRkcmVzcyAgICAgKi8KK2FzbSgiICAgICAgICAgICBwb3BsICVlYXgiKTsgICAgICAvKiBnZXQgdGhlIGV4Y2VwdGlvbiBudW1iZXIgICAqLworYXNtKCIJCW1vdmwgX3N0YWNrUHRyLCAlZXNwIik7IC8qIG1vdmUgdG8gcmVtY29tIHN0YWNrIGFyZWEgICovCithc20oIgkJcHVzaGwgJWVheCIpOwkvKiBwdXNoIGV4Y2VwdGlvbiBvbnRvIHN0YWNrICAqLworYXNtKCIJCWNhbGwgIF9oYW5kbGVfZXhjZXB0aW9uIik7ICAgIC8qIHRoaXMgbmV2ZXIgcmV0dXJucyAqLworCit2b2lkIF9yZXR1cm5Gcm9tRXhjZXB0aW9uKCkKK3sKKyAgcmV0dXJuX3RvX3Byb2cgKCk7Cit9CisKK2ludCBoZXgoY2gpCitjaGFyIGNoOworeworICBpZiAoKGNoID49ICdhJykgJiYgKGNoIDw9ICdmJykpIHJldHVybiAoY2gtJ2EnKzEwKTsKKyAgaWYgKChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpKSByZXR1cm4gKGNoLScwJyk7CisgIGlmICgoY2ggPj0gJ0EnKSAmJiAoY2ggPD0gJ0YnKSkgcmV0dXJuIChjaC0nQScrMTApOworICByZXR1cm4gKC0xKTsKK30KKworCisvKiBzY2FuIGZvciB0aGUgc2VxdWVuY2UgJDxkYXRhPiM8Y2hlY2tzdW0+ICAgICAqLwordm9pZCBnZXRwYWNrZXQoYnVmZmVyKQorY2hhciAqIGJ1ZmZlcjsKK3sKKyAgdW5zaWduZWQgY2hhciBjaGVja3N1bTsKKyAgdW5zaWduZWQgY2hhciB4bWl0Y3N1bTsKKyAgaW50ICBpOworICBpbnQgIGNvdW50OworICBjaGFyIGNoOworCisgIGRvIHsKKyAgICAvKiB3YWl0IGFyb3VuZCBmb3IgdGhlIHN0YXJ0IGNoYXJhY3RlciwgaWdub3JlIGFsbCBvdGhlciBjaGFyYWN0ZXJzICovCisgICAgd2hpbGUgKChjaCA9IChnZXREZWJ1Z0NoYXIoKSAmIDB4N2YpKSAhPSAnJCcpOworICAgIGNoZWNrc3VtID0gMDsKKyAgICB4bWl0Y3N1bSA9IC0xOworCisgICAgY291bnQgPSAwOworCisgICAgLyogbm93LCByZWFkIHVudGlsIGEgIyBvciBlbmQgb2YgYnVmZmVyIGlzIGZvdW5kICovCisgICAgd2hpbGUgKGNvdW50IDwgQlVGTUFYKSB7CisgICAgICBjaCA9IGdldERlYnVnQ2hhcigpICYgMHg3ZjsKKyAgICAgIGlmIChjaCA9PSAnIycpIGJyZWFrOworICAgICAgY2hlY2tzdW0gPSBjaGVja3N1bSArIGNoOworICAgICAgYnVmZmVyW2NvdW50XSA9IGNoOworICAgICAgY291bnQgPSBjb3VudCArIDE7CisgICAgICB9CisgICAgYnVmZmVyW2NvdW50XSA9IDA7CisKKyAgICBpZiAoY2ggPT0gJyMnKSB7CisgICAgICB4bWl0Y3N1bSA9IGhleChnZXREZWJ1Z0NoYXIoKSAmIDB4N2YpIDw8IDQ7CisgICAgICB4bWl0Y3N1bSArPSBoZXgoZ2V0RGVidWdDaGFyKCkgJiAweDdmKTsKKyAgICAgIGlmICgocmVtb3RlX2RlYnVnICkgJiYgKGNoZWNrc3VtICE9IHhtaXRjc3VtKSkgeworICAgICAgICBmcHJpbnRmIChzdGRlcnIgLCJiYWQgY2hlY2tzdW0uICBNeSBjb3VudCA9IDB4JXgsIHNlbnQ9MHgleC4gYnVmPSVzXG4iLAorCQkgY2hlY2tzdW0seG1pdGNzdW0sYnVmZmVyKTsKKyAgICAgIH0KKworICAgICAgaWYgKGNoZWNrc3VtICE9IHhtaXRjc3VtKSBwdXREZWJ1Z0NoYXIoJy0nKTsgIC8qIGZhaWxlZCBjaGVja3N1bSAqLworICAgICAgZWxzZSB7CisJIHB1dERlYnVnQ2hhcignKycpOyAgLyogc3VjY2Vzc2Z1bCB0cmFuc2ZlciAqLworCSAvKiBpZiBhIHNlcXVlbmNlIGNoYXIgaXMgcHJlc2VudCwgcmVwbHkgdGhlIHNlcXVlbmNlIElEICovCisJIGlmIChidWZmZXJbMl0gPT0gJzonKSB7CisJICAgIHB1dERlYnVnQ2hhciggYnVmZmVyWzBdICk7CisJICAgIHB1dERlYnVnQ2hhciggYnVmZmVyWzFdICk7CisJICAgIC8qIHJlbW92ZSBzZXF1ZW5jZSBjaGFycyBmcm9tIGJ1ZmZlciAqLworCSAgICBjb3VudCA9IHN0cmxlbihidWZmZXIpOworCSAgICBmb3IgKGk9MzsgaSA8PSBjb3VudDsgaSsrKSBidWZmZXJbaS0zXSA9IGJ1ZmZlcltpXTsKKwkgfQorICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAoY2hlY2tzdW0gIT0geG1pdGNzdW0pOworCit9CisKKy8qIHNlbmQgdGhlIHBhY2tldCBpbiBidWZmZXIuICAqLworCisKK3ZvaWQgcHV0cGFja2V0KGJ1ZmZlcikKK2NoYXIgKiBidWZmZXI7Cit7CisgIHVuc2lnbmVkIGNoYXIgY2hlY2tzdW07CisgIGludCAgY291bnQ7CisgIGNoYXIgY2g7CisKKyAgLyogICQ8cGFja2V0IGluZm8+IzxjaGVja3N1bT4uICovCisgIGRvIHsKKyAgcHV0RGVidWdDaGFyKCckJyk7CisgIGNoZWNrc3VtID0gMDsKKyAgY291bnQgICAgPSAwOworCisgIHdoaWxlIChjaD1idWZmZXJbY291bnRdKSB7CisgICAgcHV0RGVidWdDaGFyKGNoKTsKKyAgICBjaGVja3N1bSArPSBjaDsKKyAgICBjb3VudCArPSAxOworICB9CisKKyAgcHV0RGVidWdDaGFyKCcjJyk7CisgIHB1dERlYnVnQ2hhcihoZXhjaGFyc1tjaGVja3N1bSA+PiA0XSk7CisgIHB1dERlYnVnQ2hhcihoZXhjaGFyc1tjaGVja3N1bSAlIDE2XSk7CisKKyAgfSB3aGlsZSAoKGdldERlYnVnQ2hhcigpICYgMHg3ZikgIT0gJysnKTsKKworfQorCitjaGFyICByZW1jb21JbkJ1ZmZlcltCVUZNQVhdOworY2hhciAgcmVtY29tT3V0QnVmZmVyW0JVRk1BWF07CitzdGF0aWMgc2hvcnQgZXJyb3I7CisKKwordm9pZCBkZWJ1Z19lcnJvcihmb3JtYXQsIHBhcm0pCitjaGFyICogZm9ybWF0OworY2hhciAqIHBhcm07Cit7CisgIGlmIChyZW1vdGVfZGVidWcpIGZwcmludGYgKHN0ZGVycixmb3JtYXQscGFybSk7Cit9CisKKy8qIEFkZHJlc3Mgb2YgYSByb3V0aW5lIHRvIFJURSB0byBpZiB3ZSBnZXQgYSBtZW1vcnkgZmF1bHQuICAqLworc3RhdGljIHZvaWQgKCp2b2xhdGlsZSBtZW1fZmF1bHRfcm91dGluZSkoKSA9IE5VTEw7CisKKy8qIEluZGljYXRlIHRvIGNhbGxlciBvZiBtZW0yaGV4IG9yIGhleDJtZW0gdGhhdCB0aGVyZSBoYXMgYmVlbiBhbgorICAgZXJyb3IuICAqLworc3RhdGljIHZvbGF0aWxlIGludCBtZW1fZXJyID0gMDsKKwordm9pZAorc2V0X21lbV9lcnIgKCkKK3sKKyAgbWVtX2VyciA9IDE7Cit9CisKKy8qIFRoZXNlIGFyZSBzZXBhcmF0ZSBmdW5jdGlvbnMgc28gdGhhdCB0aGV5IGFyZSBzbyBzaG9ydCBhbmQgc3dlZXQKKyAgIHRoYXQgdGhlIGNvbXBpbGVyIHdvbid0IHNhdmUgYW55IHJlZ2lzdGVycyAoaWYgdGhlcmUgaXMgYSBmYXVsdAorICAgdG8gbWVtX2ZhdWx0LCB0aGV5IHdvbid0IGdldCByZXN0b3JlZCwgc28gdGhlcmUgYmV0dGVyIG5vdCBiZSBhbnkKKyAgIHNhdmVkKS4gICovCitpbnQKK2dldF9jaGFyIChhZGRyKQorICAgICBjaGFyICphZGRyOworeworICByZXR1cm4gKmFkZHI7Cit9CisKK3ZvaWQKK3NldF9jaGFyIChhZGRyLCB2YWwpCisgICAgIGNoYXIgKmFkZHI7CisgICAgIGludCB2YWw7Cit7CisgICphZGRyID0gdmFsOworfQorCisvKiBjb252ZXJ0IHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSBtZW0gaW50byBoZXgsIHBsYWNpbmcgcmVzdWx0IGluIGJ1ZiAqLworLyogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbGFzdCBjaGFyIHB1dCBpbiBidWYgKG51bGwpICovCisvKiBJZiBNQVlfRkFVTFQgaXMgbm9uLXplcm8sIHRoZW4gd2Ugc2hvdWxkIHNldCBtZW1fZXJyIGluIHJlc3BvbnNlIHRvCisgICBhIGZhdWx0OyBpZiB6ZXJvIHRyZWF0IGEgZmF1bHQgbGlrZSBhbnkgb3RoZXIgZmF1bHQgaW4gdGhlIHN0dWIuICAqLworY2hhciogbWVtMmhleChtZW0sIGJ1ZiwgY291bnQsIG1heV9mYXVsdCkKK2NoYXIqIG1lbTsKK2NoYXIqIGJ1ZjsKK2ludCAgIGNvdW50OworaW50IG1heV9mYXVsdDsKK3sKKyAgICAgIGludCBpOworICAgICAgdW5zaWduZWQgY2hhciBjaDsKKworICAgICAgaWYgKG1heV9mYXVsdCkKKwkgIG1lbV9mYXVsdF9yb3V0aW5lID0gc2V0X21lbV9lcnI7CisgICAgICBmb3IgKGk9MDtpPGNvdW50O2krKykgeworICAgICAgICAgIGNoID0gZ2V0X2NoYXIgKG1lbSsrKTsKKwkgIGlmIChtYXlfZmF1bHQgJiYgbWVtX2VycikKKwkgICAgcmV0dXJuIChidWYpOworICAgICAgICAgICpidWYrKyA9IGhleGNoYXJzW2NoID4+IDRdOworICAgICAgICAgICpidWYrKyA9IGhleGNoYXJzW2NoICUgMTZdOworICAgICAgfQorICAgICAgKmJ1ZiA9IDA7CisgICAgICBpZiAobWF5X2ZhdWx0KQorCSAgbWVtX2ZhdWx0X3JvdXRpbmUgPSBOVUxMOworICAgICAgcmV0dXJuKGJ1Zik7Cit9CisKKy8qIGNvbnZlcnQgdGhlIGhleCBhcnJheSBwb2ludGVkIHRvIGJ5IGJ1ZiBpbnRvIGJpbmFyeSB0byBiZSBwbGFjZWQgaW4gbWVtICovCisvKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjaGFyYWN0ZXIgQUZURVIgdGhlIGxhc3QgYnl0ZSB3cml0dGVuICovCitjaGFyKiBoZXgybWVtKGJ1ZiwgbWVtLCBjb3VudCwgbWF5X2ZhdWx0KQorY2hhciogYnVmOworY2hhciogbWVtOworaW50ICAgY291bnQ7CitpbnQgbWF5X2ZhdWx0OworeworICAgICAgaW50IGk7CisgICAgICB1bnNpZ25lZCBjaGFyIGNoOworCisgICAgICBpZiAobWF5X2ZhdWx0KQorCSAgbWVtX2ZhdWx0X3JvdXRpbmUgPSBzZXRfbWVtX2VycjsKKyAgICAgIGZvciAoaT0wO2k8Y291bnQ7aSsrKSB7CisgICAgICAgICAgY2ggPSBoZXgoKmJ1ZisrKSA8PCA0OworICAgICAgICAgIGNoID0gY2ggKyBoZXgoKmJ1ZisrKTsKKyAgICAgICAgICBzZXRfY2hhciAobWVtKyssIGNoKTsKKwkgIGlmIChtYXlfZmF1bHQgJiYgbWVtX2VycikKKwkgICAgcmV0dXJuIChtZW0pOworICAgICAgfQorICAgICAgaWYgKG1heV9mYXVsdCkKKwkgIG1lbV9mYXVsdF9yb3V0aW5lID0gTlVMTDsKKyAgICAgIHJldHVybihtZW0pOworfQorCisvKiB0aGlzIGZ1bmN0aW9uIHRha2VzIHRoZSAzODYgZXhjZXB0aW9uIHZlY3RvciBhbmQgYXR0ZW1wdHMgdG8KKyAgIHRyYW5zbGF0ZSB0aGlzIG51bWJlciBpbnRvIGEgdW5peCBjb21wYXRpYmxlIHNpZ25hbCB2YWx1ZSAqLworaW50IGNvbXB1dGVTaWduYWwoIGV4Y2VwdGlvblZlY3RvciApCitpbnQgZXhjZXB0aW9uVmVjdG9yOworeworICBpbnQgc2lndmFsOworICBzd2l0Y2ggKGV4Y2VwdGlvblZlY3RvcikgeworICAgIGNhc2UgMCA6IHNpZ3ZhbCA9IDg7IGJyZWFrOyAvKiBkaXZpZGUgYnkgemVybyAqLworICAgIGNhc2UgMSA6IHNpZ3ZhbCA9IDU7IGJyZWFrOyAvKiBkZWJ1ZyBleGNlcHRpb24gKi8KKyAgICBjYXNlIDMgOiBzaWd2YWwgPSA1OyBicmVhazsgLyogYnJlYWtwb2ludCAqLworICAgIGNhc2UgNCA6IHNpZ3ZhbCA9IDE2OyBicmVhazsgLyogaW50byBpbnN0cnVjdGlvbiAob3ZlcmZsb3cpICovCisgICAgY2FzZSA1IDogc2lndmFsID0gMTY7IGJyZWFrOyAvKiBib3VuZCBpbnN0cnVjdGlvbiAqLworICAgIGNhc2UgNiA6IHNpZ3ZhbCA9IDQ7IGJyZWFrOyAvKiBJbnZhbGlkIG9wY29kZSAqLworICAgIGNhc2UgNyA6IHNpZ3ZhbCA9IDg7IGJyZWFrOyAvKiBjb3Byb2Nlc3NvciBub3QgYXZhaWxhYmxlICovCisgICAgY2FzZSA4IDogc2lndmFsID0gNzsgYnJlYWs7IC8qIGRvdWJsZSBmYXVsdCAqLworICAgIGNhc2UgOSA6IHNpZ3ZhbCA9IDExOyBicmVhazsgLyogY29wcm9jZXNzb3Igc2VnbWVudCBvdmVycnVuICovCisgICAgY2FzZSAxMCA6IHNpZ3ZhbCA9IDExOyBicmVhazsgLyogSW52YWxpZCBUU1MgKi8KKyAgICBjYXNlIDExIDogc2lndmFsID0gMTE7IGJyZWFrOyAvKiBTZWdtZW50IG5vdCBwcmVzZW50ICovCisgICAgY2FzZSAxMiA6IHNpZ3ZhbCA9IDExOyBicmVhazsgLyogc3RhY2sgZXhjZXB0aW9uICovCisgICAgY2FzZSAxMyA6IHNpZ3ZhbCA9IDExOyBicmVhazsgLyogZ2VuZXJhbCBwcm90ZWN0aW9uICovCisgICAgY2FzZSAxNCA6IHNpZ3ZhbCA9IDExOyBicmVhazsgLyogcGFnZSBmYXVsdCAqLworICAgIGNhc2UgMTYgOiBzaWd2YWwgPSA3OyBicmVhazsgLyogY29wcm9jZXNzb3IgZXJyb3IgKi8KKyAgICBkZWZhdWx0OgorICAgICAgc2lndmFsID0gNzsgICAgICAgICAvKiAic29mdHdhcmUgZ2VuZXJhdGVkIiovCisgIH0KKyAgcmV0dXJuIChzaWd2YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFdISUxFIFdFIEZJTkQgTklDRSBIRVggQ0hBUlMsIEJVSUxEIEFOIElOVCAqLworLyogUkVUVVJOIE5VTUJFUiBPRiBDSEFSUyBQUk9DRVNTRUQgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBoZXhUb0ludChjaGFyICoqcHRyLCBpbnQgKmludFZhbHVlKQoreworICAgIGludCBudW1DaGFycyA9IDA7CisgICAgaW50IGhleFZhbHVlOworCisgICAgKmludFZhbHVlID0gMDsKKworICAgIHdoaWxlICgqKnB0cikKKyAgICB7CisgICAgICAgIGhleFZhbHVlID0gaGV4KCoqcHRyKTsKKyAgICAgICAgaWYgKGhleFZhbHVlID49MCkKKyAgICAgICAgeworICAgICAgICAgICAgKmludFZhbHVlID0gKCppbnRWYWx1ZSA8PDQpIHwgaGV4VmFsdWU7CisgICAgICAgICAgICBudW1DaGFycyArKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAoKnB0cikrKzsKKyAgICB9CisKKyAgICByZXR1cm4gKG51bUNoYXJzKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBhbGwgY29tbWFuZCBwcm9jZXNpbmcgZm9yIGludGVyZmFjaW5nIHRvIGdkYi4KKyAqLwordm9pZCBoYW5kbGVfZXhjZXB0aW9uKGludCBleGNlcHRpb25WZWN0b3IpCit7CisgIGludCAgICBzaWd2YWw7CisgIGludCAgICBhZGRyLCBsZW5ndGg7CisgIGNoYXIgKiBwdHI7CisgIGludCAgICBuZXdQQzsKKworICBnZGJfaTM4NnZlY3RvciA9IGV4Y2VwdGlvblZlY3RvcjsKKworICBpZiAocmVtb3RlX2RlYnVnKSBwcmludGYoInZlY3Rvcj0lZCwgc3I9MHgleCwgcGM9MHgleFxuIiwKKwkJCSAgICBleGNlcHRpb25WZWN0b3IsCisJCQkgICAgcmVnaXN0ZXJzWyBQUyBdLAorCQkJICAgIHJlZ2lzdGVyc1sgUEMgXSk7CisKKyAgLyogcmVwbHkgdG8gaG9zdCB0aGF0IGFuIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgKi8KKyAgc2lndmFsID0gY29tcHV0ZVNpZ25hbCggZXhjZXB0aW9uVmVjdG9yICk7CisgIHJlbWNvbU91dEJ1ZmZlclswXSA9ICdTJzsKKyAgcmVtY29tT3V0QnVmZmVyWzFdID0gIGhleGNoYXJzW3NpZ3ZhbCA+PiA0XTsKKyAgcmVtY29tT3V0QnVmZmVyWzJdID0gIGhleGNoYXJzW3NpZ3ZhbCAlIDE2XTsKKyAgcmVtY29tT3V0QnVmZmVyWzNdID0gMDsKKworICBwdXRwYWNrZXQocmVtY29tT3V0QnVmZmVyKTsKKworICB3aGlsZSAoMT09MSkgeworICAgIGVycm9yID0gMDsKKyAgICByZW1jb21PdXRCdWZmZXJbMF0gPSAwOworICAgIGdldHBhY2tldChyZW1jb21JbkJ1ZmZlcik7CisgICAgc3dpdGNoIChyZW1jb21JbkJ1ZmZlclswXSkgeworICAgICAgY2FzZSAnPycgOiAgIHJlbWNvbU91dEJ1ZmZlclswXSA9ICdTJzsKKyAgICAgICAgICAgICAgICAgICByZW1jb21PdXRCdWZmZXJbMV0gPSAgaGV4Y2hhcnNbc2lndmFsID4+IDRdOworICAgICAgICAgICAgICAgICAgIHJlbWNvbU91dEJ1ZmZlclsyXSA9ICBoZXhjaGFyc1tzaWd2YWwgJSAxNl07CisgICAgICAgICAgICAgICAgICAgcmVtY29tT3V0QnVmZmVyWzNdID0gMDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdkJyA6IHJlbW90ZV9kZWJ1ZyA9ICEocmVtb3RlX2RlYnVnKTsgIC8qIHRvZ2dsZSBkZWJ1ZyBmbGFnICovCisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnZycgOiAvKiByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBDUFUgcmVnaXN0ZXJzICovCisgICAgICAgICAgICAgICAgbWVtMmhleCgoY2hhciopIHJlZ2lzdGVycywgcmVtY29tT3V0QnVmZmVyLCBOVU1SRUdCWVRFUywgMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdHJyA6IC8qIHNldCB0aGUgdmFsdWUgb2YgdGhlIENQVSByZWdpc3RlcnMgLSByZXR1cm4gT0sgKi8KKyAgICAgICAgICAgICAgICBoZXgybWVtKCZyZW1jb21JbkJ1ZmZlclsxXSwgKGNoYXIqKSByZWdpc3RlcnMsIE5VTVJFR0JZVEVTLCAwKTsKKyAgICAgICAgICAgICAgICBzdHJjcHkocmVtY29tT3V0QnVmZmVyLCJPSyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnUCcgOiAvKiBzZXQgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIENQVSByZWdpc3RlciAtIHJldHVybiBPSyAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGludCByZWdubzsKKworICAgICAgICAgICAgICAgICAgcHRyID0gJnJlbWNvbUluQnVmZmVyWzFdOworICAgICAgICAgICAgICAgICAgaWYgKGhleFRvSW50ICgmcHRyLCAmcmVnbm8pICYmICpwdHIrKyA9PSAnPScpIAorICAgICAgICAgICAgICAgICAgaWYgKHJlZ25vID49IDAgJiYgcmVnbm8gPCBOVU1SRUdTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaGV4Mm1lbSAocHRyLCAoY2hhciAqKSZyZWdpc3RlcnNbcmVnbm9dLCA0LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkocmVtY29tT3V0QnVmZmVyLCJPSyIpOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIHN0cmNweSAocmVtY29tT3V0QnVmZmVyLCAiRTAxIik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgIC8qIG1BQS4uQUEsTExMTCAgUmVhZCBMTExMIGJ5dGVzIGF0IGFkZHJlc3MgQUEuLkFBICovCisgICAgICBjYXNlICdtJyA6CisJCSAgICAvKiBUUlkgVE8gUkVBRCAleCwleC4gIElGIFNVQ0NFRUQsIFNFVCBQVFIgPSAwICovCisgICAgICAgICAgICAgICAgICAgIHB0ciA9ICZyZW1jb21JbkJ1ZmZlclsxXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhleFRvSW50KCZwdHIsJmFkZHIpKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCoocHRyKyspID09ICcsJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGV4VG9JbnQoJnB0ciwmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IDA7CisJCQkJbWVtX2VyciA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbTJoZXgoKGNoYXIqKSBhZGRyLCByZW1jb21PdXRCdWZmZXIsIGxlbmd0aCwgMSk7CisJCQkJaWYgKG1lbV9lcnIpIHsKKwkJCQkgICAgc3RyY3B5IChyZW1jb21PdXRCdWZmZXIsICJFMDMiKTsKKwkJCQkgICAgZGVidWdfZXJyb3IgKCJtZW1vcnkgZmF1bHQiKTsKKwkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChwdHIpCisgICAgICAgICAgICAgICAgICAgIHsKKwkJICAgICAgc3RyY3B5KHJlbWNvbU91dEJ1ZmZlciwiRTAxIik7CisJCSAgICAgIGRlYnVnX2Vycm9yKCJtYWxmb3JtZWQgcmVhZCBtZW1vcnkgY29tbWFuZDogJXMiLHJlbWNvbUluQnVmZmVyKTsKKwkJICAgIH0KKwkgICAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIE1BQS4uQUEsTExMTDogV3JpdGUgTExMTCBieXRlcyBhdCBhZGRyZXNzIEFBLkFBIHJldHVybiBPSyAqLworICAgICAgY2FzZSAnTScgOgorCQkgICAgLyogVFJZIFRPIFJFQUQgJyV4LCV4OicuICBJRiBTVUNDRUVELCBTRVQgUFRSID0gMCAqLworICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcmVtY29tSW5CdWZmZXJbMV07CisgICAgICAgICAgICAgICAgICAgIGlmIChoZXhUb0ludCgmcHRyLCZhZGRyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHB0cisrKSA9PSAnLCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhleFRvSW50KCZwdHIsJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHB0cisrKSA9PSAnOicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKwkJCQkgICAgbWVtX2VyciA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXgybWVtKHB0ciwgKGNoYXIqKSBhZGRyLCBsZW5ndGgsIDEpOworCisJCQkJICAgIGlmIChtZW1fZXJyKSB7CisJCQkJCXN0cmNweSAocmVtY29tT3V0QnVmZmVyLCAiRTAzIik7CisJCQkJCWRlYnVnX2Vycm9yICgibWVtb3J5IGZhdWx0Iik7CisJCQkJICAgIH0gZWxzZSB7CisJCQkJICAgICAgICBzdHJjcHkocmVtY29tT3V0QnVmZmVyLCJPSyIpOworCQkJCSAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0cikKKyAgICAgICAgICAgICAgICAgICAgeworCQkgICAgICBzdHJjcHkocmVtY29tT3V0QnVmZmVyLCJFMDIiKTsKKwkJICAgICAgZGVidWdfZXJyb3IoIm1hbGZvcm1lZCB3cml0ZSBtZW1vcnkgY29tbWFuZDogJXMiLHJlbWNvbUluQnVmZmVyKTsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAvKiBjQUEuLkFBICAgIENvbnRpbnVlIGF0IGFkZHJlc3MgQUEuLkFBKG9wdGlvbmFsKSAqLworICAgICAvKiBzQUEuLkFBICAgU3RlcCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBBQS4uQUEob3B0aW9uYWwpICovCisgICAgIGNhc2UgJ2MnIDoKKyAgICAgY2FzZSAncycgOgorICAgICAgICAgIC8qIHRyeSB0byByZWFkIG9wdGlvbmFsIHBhcmFtZXRlciwgcGMgdW5jaGFuZ2VkIGlmIG5vIHBhcm0gKi8KKyAgICAgICAgIHB0ciA9ICZyZW1jb21JbkJ1ZmZlclsxXTsKKyAgICAgICAgIGlmIChoZXhUb0ludCgmcHRyLCZhZGRyKSkKKyAgICAgICAgICAgICByZWdpc3RlcnNbIFBDIF0gPSBhZGRyOworCisgICAgICAgICAgbmV3UEMgPSByZWdpc3RlcnNbIFBDXTsKKworICAgICAgICAgIC8qIGNsZWFyIHRoZSB0cmFjZSBiaXQgKi8KKyAgICAgICAgICByZWdpc3RlcnNbIFBTIF0gJj0gMHhmZmZmZmVmZjsKKworICAgICAgICAgIC8qIHNldCB0aGUgdHJhY2UgYml0IGlmIHdlJ3JlIHN0ZXBwaW5nICovCisgICAgICAgICAgaWYgKHJlbWNvbUluQnVmZmVyWzBdID09ICdzJykgcmVnaXN0ZXJzWyBQUyBdIHw9IDB4MTAwOworCisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBJZiB3ZSBmb3VuZCBhIG1hdGNoIGZvciB0aGUgUEMgQU5EIHdlIGFyZSBub3QgcmV0dXJuaW5nCisgICAgICAgICAgICogYXMgYSByZXN1bHQgb2YgYSBicmVha3BvaW50ICgzMyksCisgICAgICAgICAgICogdHJhY2UgZXhjZXB0aW9uICg5KSwgbm1pICgzMSksIGptcCB0bworICAgICAgICAgICAqIHRoZSBvbGQgZXhjZXB0aW9uIGhhbmRsZXIgYXMgaWYgdGhpcyBjb2RlIG5ldmVyIHJhbi4KKyAgICAgICAgICAgKi8KKyNpZiAwCisJICAvKiBEb24ndCByZWFsbHkgdGhpbmsgd2UgbmVlZCB0aGlzLCBleGNlcHQgbWF5YmUgZm9yIHByb3RlY3Rpb24KKwkgICAgIGV4Y2VwdGlvbnMuICAqLworICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAqIGludm9rZSB0aGUgcHJldmlvdXMgaGFuZGxlci4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgaWYgKG9sZEV4Y2VwdGlvbkhvb2spCisgICAgICAgICAgICAgICAgICAgICAgKCpvbGRFeGNlcHRpb25Ib29rKSAoZnJhbWUtPmV4Y2VwdGlvblZlY3Rvcik7CisgICAgICAgICAgICAgICAgICBuZXdQQyA9IHJlZ2lzdGVyc1sgUEMgXTsgICAgLyogcGMgbWF5IGhhdmUgY2hhbmdlZCAgKi8KKyNlbmRpZiAvKiAwICovCisKKwkgIF9yZXR1cm5Gcm9tRXhjZXB0aW9uKCk7IC8qIHRoaXMgaXMgYSBqdW1wICovCisKKyAgICAgICAgICBicmVhazsKKworICAgICAgLyoga2lsbCB0aGUgcHJvZ3JhbSAqLworICAgICAgY2FzZSAnaycgOiAgLyogZG8gbm90aGluZyAqLworI2lmIDAKKwkvKiBIdWg/IFRoaXMgZG9lc24ndCBsb29rIGxpa2UgIm5vdGhpbmciLgorCSAgIG02OGstc3R1Yi5jIGFuZCBzcGFyYy1zdHViLmMgZG9uJ3QgaGF2ZSBpdC4gICovCisJCUJSRUFLUE9JTlQoKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgfSAvKiBzd2l0Y2ggKi8KKworICAgIC8qIHJlcGx5IHRvIHRoZSByZXF1ZXN0ICovCisgICAgcHV0cGFja2V0KHJlbWNvbU91dEJ1ZmZlcik7CisgICAgfQorfQorCisvKiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHVwIGV4Y2VwdGlvbiBoYW5kbGVycyBmb3IgdHJhY2luZyBhbmQKKyAgIGJyZWFrcG9pbnRzICovCit2b2lkIHNldF9kZWJ1Z190cmFwcygpCit7CitleHRlcm4gdm9pZCByZW1jb21IYW5kbGVyKCk7CitpbnQgZXhjZXB0aW9uOworCisgIHN0YWNrUHRyICA9ICZyZW1jb21TdGFja1tTVEFDS1NJWkUvc2l6ZW9mKGludCkgLSAxXTsKKworICBleGNlcHRpb25IYW5kbGVyICgwLCBfY2F0Y2hFeGNlcHRpb24wKTsKKyAgZXhjZXB0aW9uSGFuZGxlciAoMSwgX2NhdGNoRXhjZXB0aW9uMSk7CisgIGV4Y2VwdGlvbkhhbmRsZXIgKDMsIF9jYXRjaEV4Y2VwdGlvbjMpOworICBleGNlcHRpb25IYW5kbGVyICg0LCBfY2F0Y2hFeGNlcHRpb240KTsKKyAgZXhjZXB0aW9uSGFuZGxlciAoNSwgX2NhdGNoRXhjZXB0aW9uNSk7CisgIGV4Y2VwdGlvbkhhbmRsZXIgKDYsIF9jYXRjaEV4Y2VwdGlvbjYpOworICBleGNlcHRpb25IYW5kbGVyICg3LCBfY2F0Y2hFeGNlcHRpb243KTsKKyAgZXhjZXB0aW9uSGFuZGxlciAoOCwgX2NhdGNoRXhjZXB0aW9uOCk7CisgIGV4Y2VwdGlvbkhhbmRsZXIgKDksIF9jYXRjaEV4Y2VwdGlvbjkpOworICBleGNlcHRpb25IYW5kbGVyICgxMCwgX2NhdGNoRXhjZXB0aW9uMTApOworICBleGNlcHRpb25IYW5kbGVyICgxMSwgX2NhdGNoRXhjZXB0aW9uMTEpOworICBleGNlcHRpb25IYW5kbGVyICgxMiwgX2NhdGNoRXhjZXB0aW9uMTIpOworICBleGNlcHRpb25IYW5kbGVyICgxMywgX2NhdGNoRXhjZXB0aW9uMTMpOworICBleGNlcHRpb25IYW5kbGVyICgxNCwgX2NhdGNoRXhjZXB0aW9uMTQpOworICBleGNlcHRpb25IYW5kbGVyICgxNiwgX2NhdGNoRXhjZXB0aW9uMTYpOworCisgIGlmIChleGNlcHRpb25Ib29rICE9IHJlbWNvbUhhbmRsZXIpCisgIHsKKyAgICAgIG9sZEV4Y2VwdGlvbkhvb2sgPSBleGNlcHRpb25Ib29rOworICAgICAgZXhjZXB0aW9uSG9vayAgICA9IHJlbWNvbUhhbmRsZXI7CisgIH0KKworICAvKiBJbiBjYXNlIEdEQiBpcyBzdGFydGVkIGJlZm9yZSB1cywgYWNrIGFueSBwYWNrZXRzIChwcmVzdW1hYmx5CisgICAgICIkPyN4eCIpIHNpdHRpbmcgdGhlcmUuICAqLworICBwdXREZWJ1Z0NoYXIgKCcrJyk7CisKKyAgaW5pdGlhbGl6ZWQgPSAxOworCit9CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZSBhIGJyZWFrcG9pbnQgZXhjZXB0aW9uLiAgSXQgaXMgdXNlZCBhdCB0aGUKKyAgIGJlZ2lubmluZyBvZiBhIHByb2dyYW0gdG8gc3luYyB1cCB3aXRoIGEgZGVidWdnZXIgYW5kIGNhbiBiZSB1c2VkCisgICBvdGhlcndpc2UgYXMgYSBxdWljayBtZWFucyB0byBzdG9wIHByb2dyYW0gZXhlY3V0aW9uIGFuZCAiYnJlYWsiIGludG8KKyAgIHRoZSBkZWJ1Z2dlci4gKi8KKwordm9pZCBicmVha3BvaW50KCkKK3sKKyAgaWYgKGluaXRpYWxpemVkKQorI2lmIDAKKyAgICBoYW5kbGVfZXhjZXB0aW9uKDMpOworI2Vsc2UKKyAgICBCUkVBS1BPSU5UKCk7CisjZW5kaWYKKyAgd2FpdGFiaXQoKTsKK30KKworaW50IHdhaXRsaW1pdCA9IDEwMDAwMDA7CisKK3ZvaWQKK3dhaXRhYml0KCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCB3YWl0bGltaXQ7IGkrKykgOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2kzODYtdGRlcC5jIGIvZ2RiL2kzODYtdGRlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYWE4MWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvaTM4Ni10ZGVwLmMKQEAgLTAsMCArMSw3OTQgQEAKKy8qIEludGVsIDM4NiB0YXJnZXQtZGVwZW5kZW50IHN0dWZmLgorICAgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTg5LCAxOTkxLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgImZsb2F0Zm9ybWF0LmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorCitzdGF0aWMgbG9uZyBpMzg2X2dldF9mcmFtZV9zZXR1cCBQQVJBTVMgKChDT1JFX0FERFIpKTsKKworc3RhdGljIHZvaWQgaTM4Nl9mb2xsb3dfanVtcCBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIGNvZGVzdHJlYW1fcmVhZCBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBjb2Rlc3RyZWFtX3NlZWsgUEFSQU1TICgoQ09SRV9BRERSKSk7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNvZGVzdHJlYW1fZmlsbCBQQVJBTVMgKChpbnQpKTsKKworQ09SRV9BRERSIHNraXBfdHJhbXBvbGluZV9jb2RlIFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqKSk7CisKK3N0YXRpYyBpbnQgZ2RiX3ByaW50X2luc25faTM4NiAoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKTsKKwordm9pZCBfaW5pdGlhbGl6ZV9pMzg2X3RkZXAgUEFSQU1TICgodm9pZCkpOworCisvKiBUaGlzIGlzIHRoZSB2YXJpYWJsZSB0aGUgaXMgc2V0IHdpdGggInNldCBkaXNhc3NlbWJseS1mbGF2b3IiLAorIGFuZCBpdHMgbGVnaXRpbWF0ZSB2YWx1ZXMuICovCitzdGF0aWMgY2hhciBhdHRfZmxhdm9yW10gPSAiYXR0IjsKK3N0YXRpYyBjaGFyIGludGVsX2ZsYXZvcltdID0gImludGVsIjsKK3N0YXRpYyBjaGFyICp2YWxpZF9mbGF2b3JzW10gPSB7CisgIGF0dF9mbGF2b3IsCisgIGludGVsX2ZsYXZvciwKKyAgTlVMTAorfTsKK3N0YXRpYyBjaGFyICpkaXNhc3NlbWJseV9mbGF2b3IgPSBhdHRfZmxhdm9yOworCisvKiBTdGRpbyBzdHlsZSBidWZmZXJpbmcgd2FzIHVzZWQgdG8gbWluaW1pemUgY2FsbHMgdG8gcHRyYWNlLCBidXQgdGhpcworICAgYnVmZmVyaW5nIGRpZCBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGUgY29kZSBzZWN0aW9uIGJlaW5nIGFjY2Vzc2VkCisgICBtYXkgbm90IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGJ1ZmZlcnMgbG9uZyAoZXZlbiBpZiB0aGUgYnVmZmVyIGlzIG9ubHkKKyAgIHNpemVvZihpbnQpIGxvbmcpLiAgSW4gY2FzZXMgd2hlcmUgdGhlIGNvZGUgc2VjdGlvbiBzaXplIGhhcHBlbmVkIHRvCisgICBiZSBhIG5vbi1pbnRlZ3JhbCBudW1iZXIgb2YgYnVmZmVycyBsb25nLCBhdHRlbXB0aW5nIHRvIHJlYWQgdGhlIGxhc3QKKyAgIGJ1ZmZlciB3b3VsZCBmYWlsLiAgU2ltcGx5IHVzaW5nIHRhcmdldF9yZWFkX21lbW9yeSBhbmQgaWdub3JpbmcgZXJyb3JzLAorICAgcmF0aGVyIHRoYW4gcmVhZF9tZW1vcnksIGlzIG5vdCB0aGUgY29ycmVjdCBzb2x1dGlvbiwgc2luY2UgbGVnaXRpbWF0ZQorICAgYWNjZXNzIGVycm9ycyB3b3VsZCB0aGVuIGJlIHRvdGFsbHkgaWdub3JlZC4gIFRvIHByb3Blcmx5IGhhbmRsZSB0aGlzCisgICBzaXR1YXRpb24gYW5kIGNvbnRpbnVlIHRvIHVzZSBidWZmZXJpbmcgd291bGQgcmVxdWlyZSB0aGF0IHRoaXMgY29kZQorICAgYmUgYWJsZSB0byBkZXRlcm1pbmUgdGhlIG1pbmltdW0gY29kZSBzZWN0aW9uIHNpemUgZ3JhbnVsYXJpdHkgKG5vdCB0aGUKKyAgIGFsaWdubWVudCBvZiB0aGUgc2VjdGlvbiBpdHNlbGYsIHNpbmNlIHRoZSBhY3R1YWwgZmFpbGluZyBjYXNlIHRoYXQKKyAgIHBvaW50ZWQgb3V0IHRoaXMgcHJvYmxlbSBoYWQgYSBzZWN0aW9uIGFsaWdubWVudCBvZiA0IGJ1dCB3YXMgbm90IGEKKyAgIG11bHRpcGxlIG9mIDQgYnl0ZXMgbG9uZyksIG9uIGEgdGFyZ2V0IGJ5IHRhcmdldCBiYXNpcywgYW5kIHRoZW4KKyAgIGFkanVzdCBpdCdzIGJ1ZmZlciBzaXplIGFjY29yZGluZ2x5LiAgVGhpcyBpcyBtZXNzeSwgYnV0IHBvdGVudGlhbGx5CisgICBmZWFzaWJsZS4gIEl0IHByb2JhYmx5IG5lZWRzIHRoZSBiZmQgbGlicmFyeSdzIGhlbHAgYW5kIHN1cHBvcnQuICBGb3IKKyAgIG5vdywgdGhlIGJ1ZmZlciBzaXplIGlzIHNldCB0byAxLiAgKEZJWE1FIC1mbmYpICovCisKKyNkZWZpbmUgQ09ERVNUUkVBTV9CVUZTSVogMQkvKiBXYXMgc2l6ZW9mKGludCksIHNlZSBub3RlIGFib3ZlLiAqLworc3RhdGljIENPUkVfQUREUiBjb2Rlc3RyZWFtX25leHRfYWRkcjsKK3N0YXRpYyBDT1JFX0FERFIgY29kZXN0cmVhbV9hZGRyOworc3RhdGljIHVuc2lnbmVkIGNoYXIgY29kZXN0cmVhbV9idWZbQ09ERVNUUkVBTV9CVUZTSVpdOworc3RhdGljIGludCBjb2Rlc3RyZWFtX29mZjsKK3N0YXRpYyBpbnQgY29kZXN0cmVhbV9jbnQ7CisKKyNkZWZpbmUgY29kZXN0cmVhbV90ZWxsKCkgKGNvZGVzdHJlYW1fYWRkciArIGNvZGVzdHJlYW1fb2ZmKQorI2RlZmluZSBjb2Rlc3RyZWFtX3BlZWsoKSAoY29kZXN0cmVhbV9jbnQgPT0gMCA/IFwKKwkJCSAgIGNvZGVzdHJlYW1fZmlsbCgxKTogY29kZXN0cmVhbV9idWZbY29kZXN0cmVhbV9vZmZdKQorI2RlZmluZSBjb2Rlc3RyZWFtX2dldCgpIChjb2Rlc3RyZWFtX2NudC0tID09IDAgPyBcCisJCQkgY29kZXN0cmVhbV9maWxsKDApIDogY29kZXN0cmVhbV9idWZbY29kZXN0cmVhbV9vZmYrK10pCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIAorY29kZXN0cmVhbV9maWxsIChwZWVrX2ZsYWcpCisgICAgaW50IHBlZWtfZmxhZzsKK3sKKyAgY29kZXN0cmVhbV9hZGRyID0gY29kZXN0cmVhbV9uZXh0X2FkZHI7CisgIGNvZGVzdHJlYW1fbmV4dF9hZGRyICs9IENPREVTVFJFQU1fQlVGU0laOworICBjb2Rlc3RyZWFtX29mZiA9IDA7CisgIGNvZGVzdHJlYW1fY250ID0gQ09ERVNUUkVBTV9CVUZTSVo7CisgIHJlYWRfbWVtb3J5IChjb2Rlc3RyZWFtX2FkZHIsIChjaGFyICopIGNvZGVzdHJlYW1fYnVmLCBDT0RFU1RSRUFNX0JVRlNJWik7CisgIAorICBpZiAocGVla19mbGFnKQorICAgIHJldHVybiAoY29kZXN0cmVhbV9wZWVrKCkpOworICBlbHNlCisgICAgcmV0dXJuIChjb2Rlc3RyZWFtX2dldCgpKTsKK30KKworc3RhdGljIHZvaWQKK2NvZGVzdHJlYW1fc2VlayAocGxhY2UpCisgICAgQ09SRV9BRERSIHBsYWNlOworeworICBjb2Rlc3RyZWFtX25leHRfYWRkciA9IHBsYWNlIC8gQ09ERVNUUkVBTV9CVUZTSVo7CisgIGNvZGVzdHJlYW1fbmV4dF9hZGRyICo9IENPREVTVFJFQU1fQlVGU0laOworICBjb2Rlc3RyZWFtX2NudCA9IDA7CisgIGNvZGVzdHJlYW1fZmlsbCAoMSk7CisgIHdoaWxlIChjb2Rlc3RyZWFtX3RlbGwoKSAhPSBwbGFjZSkKKyAgICBjb2Rlc3RyZWFtX2dldCAoKTsKK30KKworc3RhdGljIHZvaWQKK2NvZGVzdHJlYW1fcmVhZCAoYnVmLCBjb3VudCkKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgICBpbnQgY291bnQ7Cit7CisgIHVuc2lnbmVkIGNoYXIgKnA7CisgIGludCBpOworICBwID0gYnVmOworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAqcCsrID0gY29kZXN0cmVhbV9nZXQgKCk7Cit9CisKKy8qIG5leHQgaW5zdHJ1Y3Rpb24gaXMgYSBqdW1wLCBtb3ZlIHRvIHRhcmdldCAqLworCitzdGF0aWMgdm9pZAoraTM4Nl9mb2xsb3dfanVtcCAoKQoreworICB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKKyAgbG9uZyBkZWx0YTsKKworICBpbnQgZGF0YTE2OworICBDT1JFX0FERFIgcG9zOworCisgIHBvcyA9IGNvZGVzdHJlYW1fdGVsbCAoKTsKKworICBkYXRhMTYgPSAwOworICBpZiAoY29kZXN0cmVhbV9wZWVrICgpID09IDB4NjYpCisgICAgeworICAgICAgY29kZXN0cmVhbV9nZXQgKCk7CisgICAgICBkYXRhMTYgPSAxOworICAgIH0KKworICBzd2l0Y2ggKGNvZGVzdHJlYW1fZ2V0ICgpKQorICAgIHsKKyAgICBjYXNlIDB4ZTk6CisgICAgICAvKiByZWxhdGl2ZSBqdW1wOiBpZiBkYXRhMTYgPT0gMCwgZGlzcDMyLCBlbHNlIGRpc3AxNiAqLworICAgICAgaWYgKGRhdGExNikKKwl7CisJICBjb2Rlc3RyZWFtX3JlYWQgKGJ1ZiwgMik7CisJICBkZWx0YSA9IGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKGJ1ZiwgMik7CisKKwkgIC8qIGluY2x1ZGUgc2l6ZSBvZiBqbXAgaW5zdCAoaW5jbHVkaW5nIHRoZSAweDY2IHByZWZpeCkuICAqLworCSAgcG9zICs9IGRlbHRhICsgNDsgCisJfQorICAgICAgZWxzZQorCXsKKwkgIGNvZGVzdHJlYW1fcmVhZCAoYnVmLCA0KTsKKwkgIGRlbHRhID0gZXh0cmFjdF9zaWduZWRfaW50ZWdlciAoYnVmLCA0KTsKKworCSAgcG9zICs9IGRlbHRhICsgNTsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZWI6CisgICAgICAvKiByZWxhdGl2ZSBqdW1wLCBkaXNwOCAoaWdub3JlIGRhdGExNikgKi8KKyAgICAgIGNvZGVzdHJlYW1fcmVhZCAoYnVmLCAxKTsKKyAgICAgIC8qIFNpZ24tZXh0ZW5kIGl0LiAgKi8KKyAgICAgIGRlbHRhID0gZXh0cmFjdF9zaWduZWRfaW50ZWdlciAoYnVmLCAxKTsKKworICAgICAgcG9zICs9IGRlbHRhICsgMjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgY29kZXN0cmVhbV9zZWVrIChwb3MpOworfQorCisvKgorICogZmluZCAmIHJldHVybiBhbW91bmQgYSBsb2NhbCBzcGFjZSBhbGxvY2F0ZWQsIGFuZCBhZHZhbmNlIGNvZGVzdHJlYW0gdG8KKyAqIGZpcnN0IHJlZ2lzdGVyIHB1c2ggKGlmIGFueSkKKyAqCisgKiBpZiBlbnRyeSBzZXF1ZW5jZSBkb2Vzbid0IG1ha2Ugc2Vuc2UsIHJldHVybiAtMSwgYW5kIGxlYXZlIAorICogY29kZXN0cmVhbSBwb2ludGVyIHJhbmRvbQorICovCisKK3N0YXRpYyBsb25nCitpMzg2X2dldF9mcmFtZV9zZXR1cCAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgdW5zaWduZWQgY2hhciBvcDsKKworICBjb2Rlc3RyZWFtX3NlZWsgKHBjKTsKKworICBpMzg2X2ZvbGxvd19qdW1wICgpOworCisgIG9wID0gY29kZXN0cmVhbV9nZXQgKCk7CisKKyAgaWYgKG9wID09IDB4NTgpCQkvKiBwb3BsICVlYXggKi8KKyAgICB7CisgICAgICAvKgorICAgICAgICogdGhpcyBmdW5jdGlvbiBtdXN0IHN0YXJ0IHdpdGgKKyAgICAgICAqIAorICAgICAgICogICAgcG9wbCAlZWF4CQkgIDB4NTgKKyAgICAgICAqICAgIHhjaGdsICVlYXgsICglZXNwKSAgMHg4NyAweDA0IDB4MjQKKyAgICAgICAqIG9yIHhjaGdsICVlYXgsIDAoJWVzcCkgMHg4NyAweDQ0IDB4MjQgMHgwMAorICAgICAgICoKKyAgICAgICAqICh0aGUgc3lzdGVtIDUgY29tcGlsZXIgcHV0cyBvdXQgdGhlIHNlY29uZCB4Y2hnCisgICAgICAgKiBpbnN0LCBhbmQgdGhlIGFzc2VtYmxlciBkb2Vzbid0IHRyeSB0byBvcHRpbWl6ZSBpdCwKKyAgICAgICAqIHNvIHRoZSAnc2liJyBmb3JtIGdldHMgZ2VuZXJhdGVkKQorICAgICAgICogCisgICAgICAgKiB0aGlzIHNlcXVlbmNlIGlzIHVzZWQgdG8gZ2V0IHRoZSBhZGRyZXNzIG9mIHRoZSByZXR1cm4KKyAgICAgICAqIGJ1ZmZlciBmb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBzdHJ1Y3R1cmUKKyAgICAgICAqLworICAgICAgaW50IHBvczsKKyAgICAgIHVuc2lnbmVkIGNoYXIgYnVmWzRdOworICAgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgcHJvdG8xWzNdID0geyAweDg3LDB4MDQsMHgyNCB9OworICAgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgcHJvdG8yWzRdID0geyAweDg3LDB4NDQsMHgyNCwweDAwIH07CisgICAgICBwb3MgPSBjb2Rlc3RyZWFtX3RlbGwgKCk7CisgICAgICBjb2Rlc3RyZWFtX3JlYWQgKGJ1ZiwgNCk7CisgICAgICBpZiAobWVtY21wIChidWYsIHByb3RvMSwgMykgPT0gMCkKKwlwb3MgKz0gMzsKKyAgICAgIGVsc2UgaWYgKG1lbWNtcCAoYnVmLCBwcm90bzIsIDQpID09IDApCisJcG9zICs9IDQ7CisKKyAgICAgIGNvZGVzdHJlYW1fc2VlayAocG9zKTsKKyAgICAgIG9wID0gY29kZXN0cmVhbV9nZXQgKCk7IC8qIHVwZGF0ZSBuZXh0IG9wY29kZSAqLworICAgIH0KKworICBpZiAob3AgPT0gMHg2OCB8fCBvcCA9PSAweDZhKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiB0aGlzIGZ1bmN0aW9uIG1heSBzdGFydCB3aXRoCisgICAgICAgKgorICAgICAgICogICBwdXNobCBjb25zdGFudAorICAgICAgICogICBjYWxsIF9wcm9iZQorICAgICAgICogICBhZGRsICQ0LCAlZXNwCisgICAgICAgKiAgICAgIGZvbGxvd2VkIGJ5IAorICAgICAgICogICAgIHB1c2hsICVlYnAKKyAgICAgICAqICAgICBldGMuCisgICAgICAgKi8KKyAgICAgIGludCBwb3M7CisgICAgICB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKworICAgICAgLyogU2tpcCBwYXN0IHRoZSBwdXNobCBpbnN0cnVjdGlvbjsgaXQgaGFzIGVpdGhlciBhIG9uZS1ieXRlIAorICAgICAgICAgb3IgYSBmb3VyLWJ5dGUgb3BlcmFuZCwgZGVwZW5kaW5nIG9uIHRoZSBvcGNvZGUuICAqLworICAgICAgcG9zID0gY29kZXN0cmVhbV90ZWxsICgpOworICAgICAgaWYgKG9wID09IDB4NjgpCisJcG9zICs9IDQ7CisgICAgICBlbHNlCisJcG9zICs9IDE7CisgICAgICBjb2Rlc3RyZWFtX3NlZWsgKHBvcyk7CisKKyAgICAgIC8qIFJlYWQgdGhlIGZvbGxvd2luZyA4IGJ5dGVzLCB3aGljaCBzaG91bGQgYmUgImNhbGwgX3Byb2JlIiAoNiBieXRlcykKKyAgICAgICAgIGZvbGxvd2VkIGJ5ICJhZGRsICQ0LCVlc3AiICgyIGJ5dGVzKS4gICovCisgICAgICBjb2Rlc3RyZWFtX3JlYWQgKGJ1Ziwgc2l6ZW9mIChidWYpKTsKKyAgICAgIGlmIChidWZbMF0gPT0gMHhlOCAmJiBidWZbNl0gPT0gMHhjNCAmJiBidWZbN10gPT0gMHg0KQorCXBvcyArPSBzaXplb2YgKGJ1Zik7CisgICAgICBjb2Rlc3RyZWFtX3NlZWsgKHBvcyk7CisgICAgICBvcCA9IGNvZGVzdHJlYW1fZ2V0ICgpOyAvKiB1cGRhdGUgbmV4dCBvcGNvZGUgKi8KKyAgICB9CisKKyAgaWYgKG9wID09IDB4NTUpCQkvKiBwdXNobCAlZWJwICovCisgICAgewkJCQorICAgICAgLyogY2hlY2sgZm9yIG1vdmwgJWVzcCwgJWVicCAtIGNhbiBiZSB3cml0dGVuIHR3byB3YXlzICovCisgICAgICBzd2l0Y2ggKGNvZGVzdHJlYW1fZ2V0ICgpKQorCXsKKwljYXNlIDB4OGI6CisJICBpZiAoY29kZXN0cmVhbV9nZXQgKCkgIT0gMHhlYykKKwkgICAgcmV0dXJuICgtMSk7CisJICBicmVhazsKKwljYXNlIDB4ODk6CisJICBpZiAoY29kZXN0cmVhbV9nZXQgKCkgIT0gMHhlNSkKKwkgICAgcmV0dXJuICgtMSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgcmV0dXJuICgtMSk7CisJfQorICAgICAgLyogY2hlY2sgZm9yIHN0YWNrIGFkanVzdG1lbnQgCisgICAgICAgKgorICAgICAgICogIHN1YmwgJFhYWCwgJWVzcAorICAgICAgICoKKyAgICAgICAqIG5vdGU6IHlvdSBjYW4ndCBzdWJ0cmFjdCBhIDE2IGJpdCBpbW1lZGlhdGUKKyAgICAgICAqIGZyb20gYSAzMiBiaXQgcmVnLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5CisgICAgICAgKiBhYm91dCBhIGRhdGExNiBwcmVmaXggCisgICAgICAgKi8KKyAgICAgIG9wID0gY29kZXN0cmVhbV9wZWVrICgpOworICAgICAgaWYgKG9wID09IDB4ODMpCisJeworCSAgLyogc3VibCB3aXRoIDggYml0IGltbWVkICovCisJICBjb2Rlc3RyZWFtX2dldCAoKTsKKwkgIGlmIChjb2Rlc3RyZWFtX2dldCAoKSAhPSAweGVjKQorCSAgICAvKiBTb21lIGluc3RydWN0aW9uIHN0YXJ0aW5nIHdpdGggMHg4MyBvdGhlciB0aGFuIHN1YmwuICAqLworCSAgICB7CisJICAgICAgY29kZXN0cmVhbV9zZWVrIChjb2Rlc3RyZWFtX3RlbGwgKCkgLSAyKTsKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCSAgLyogc3VibCB3aXRoIHNpZ25lZCBieXRlIGltbWVkaWF0ZSAKKwkgICAqICh0aG91Z2ggaXQgd291bGRuJ3QgbWFrZSBzZW5zZSB0byBiZSBuZWdhdGl2ZSkKKwkgICAqLworCSAgcmV0dXJuIChjb2Rlc3RyZWFtX2dldCgpKTsKKwl9CisgICAgICBlbHNlIGlmIChvcCA9PSAweDgxKQorCXsKKwkgIGNoYXIgYnVmWzRdOworCSAgLyogTWF5YmUgaXQgaXMgc3VibCB3aXRoIDMyIGJpdCBpbW1lZGVkaWF0ZS4gICovCisJICBjb2Rlc3RyZWFtX2dldCgpOworCSAgaWYgKGNvZGVzdHJlYW1fZ2V0ICgpICE9IDB4ZWMpCisJICAgIC8qIFNvbWUgaW5zdHJ1Y3Rpb24gc3RhcnRpbmcgd2l0aCAweDgxIG90aGVyIHRoYW4gc3VibC4gICovCisJICAgIHsKKwkgICAgICBjb2Rlc3RyZWFtX3NlZWsgKGNvZGVzdHJlYW1fdGVsbCAoKSAtIDIpOworCSAgICAgIHJldHVybiAwOworCSAgICB9CisJICAvKiBJdCBpcyBzdWJsIHdpdGggMzIgYml0IGltbWVkaWF0ZS4gICovCisJICBjb2Rlc3RyZWFtX3JlYWQgKCh1bnNpZ25lZCBjaGFyICopYnVmLCA0KTsKKwkgIHJldHVybiBleHRyYWN0X3NpZ25lZF9pbnRlZ2VyIChidWYsIDQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICByZXR1cm4gKDApOworCX0KKyAgICB9CisgIGVsc2UgaWYgKG9wID09IDB4YzgpCisgICAgeworICAgICAgY2hhciBidWZbMl07CisgICAgICAvKiBlbnRlciBpbnN0cnVjdGlvbjogYXJnIGlzIDE2IGJpdCB1bnNpZ25lZCBpbW1lZCAqLworICAgICAgY29kZXN0cmVhbV9yZWFkICgodW5zaWduZWQgY2hhciAqKWJ1ZiwgMik7CisgICAgICBjb2Rlc3RyZWFtX2dldCAoKTsgLyogZmx1c2ggZmluYWwgYnl0ZSBvZiBlbnRlciBpbnN0cnVjdGlvbiAqLworICAgICAgcmV0dXJuIGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYnVmLCAyKTsKKyAgICB9CisgIHJldHVybiAoLTEpOworfQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIGFyZ3MgcGFzc2VkIHRvIGEgZnJhbWUuCisgICBDYW4gcmV0dXJuIC0xLCBtZWFuaW5nIG5vIHdheSB0byB0ZWxsLiAgKi8KKworaW50CitpMzg2X2ZyYW1lX251bV9hcmdzIChmaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworeworI2lmIDEKKyAgcmV0dXJuIC0xOworI2Vsc2UKKyAgLyogVGhpcyBsb3NlcyBiZWNhdXNlIG5vdCBvbmx5IG1pZ2h0IHRoZSBjb21waWxlciBub3QgYmUgcG9wcGluZyB0aGUKKyAgICAgYXJncyByaWdodCBhZnRlciB0aGUgZnVuY3Rpb24gY2FsbCwgaXQgbWlnaHQgYmUgcG9wcGluZyBhcmdzIGZyb20gYm90aAorICAgICB0aGlzIGNhbGwgYW5kIGEgcHJldmlvdXMgb25lLCBhbmQgd2Ugd291bGQgc2F5IHRoZXJlIGFyZSBtb3JlIGFyZ3MKKyAgICAgdGhhbiB0aGVyZSByZWFsbHkgYXJlLiAgKi8KKworICBpbnQgcmV0cGM7CQkJCQkJCisgIHVuc2lnbmVkIGNoYXIgb3A7CQkJCQkKKyAgc3RydWN0IGZyYW1lX2luZm8gKnBmaTsKKworICAvKiBvbiB0aGUgMzg2LCB0aGUgaW5zdHJ1Y3Rpb24gZm9sbG93aW5nIHRoZSBjYWxsIGNvdWxkIGJlOgorICAgICBwb3BsICVlY3ggICAgICAgIC0gIG9uZSBhcmcKKyAgICAgYWRkbCAkaW1tLCAlZXNwICAtICBpbW0vNCBhcmdzOyBpbW0gbWF5IGJlIDggb3IgMzIgYml0cworICAgICBhbnl0aGluZyBlbHNlICAgIC0gIHplcm8gYXJncyAgKi8KKworICBpbnQgZnJhbWVsZXNzOworCisgIEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OIChmaSwgZnJhbWVsZXNzKTsKKyAgaWYgKGZyYW1lbGVzcykKKyAgICAvKiBJbiB0aGUgYWJzZW5jZSBvZiBhIGZyYW1lIHBvaW50ZXIsIEdEQiBkb2Vzbid0IGdldCBjb3JyZWN0IHZhbHVlcworICAgICAgIGZvciBuYW1lbGVzcyBhcmd1bWVudHMuICBSZXR1cm4gLTEsIHNvIGl0IGRvZXNuJ3QgcHJpbnQgYW55CisgICAgICAgbmFtZWxlc3MgYXJndW1lbnRzLiAgKi8KKyAgICByZXR1cm4gLTE7CisKKyAgcGZpID0gZ2V0X3ByZXZfZnJhbWVfaW5mbyAoZmkpOwkJCQorICBpZiAocGZpID09IDApCisgICAgeworICAgICAgLyogTm90ZTogIHRoaXMgY2FuIGhhcHBlbiBpZiB3ZSBhcmUgbG9va2luZyBhdCB0aGUgZnJhbWUgZm9yCisJIG1haW4sIGJlY2F1c2UgRlJBTUVfQ0hBSU5fVkFMSUQgd29uJ3QgbGV0IHVzIGdvIGludG8KKwkgc3RhcnQuICBJZiB3ZSBoYXZlIGRlYnVnZ2luZyBzeW1ib2xzLCB0aGF0J3Mgbm90IHJlYWxseQorCSBhIGJpZyBkZWFsOyBpdCBqdXN0IG1lYW5zIGl0IHdpbGwgb25seSBzaG93IGFzIG1hbnkgYXJndW1lbnRzCisJIHRvIG1haW4gYXMgYXJlIGRlY2xhcmVkLiAgKi8KKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXRwYyA9IHBmaS0+cGM7CQkJCQkKKyAgICAgIG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocmV0cGMsIDEpOwkJCQorICAgICAgaWYgKG9wID09IDB4NTkpCQkJCQkKKwkvKiBwb3AgJWVjeCAqLwkJCSAgICAgICAKKwlyZXR1cm4gMTsJCQkJCisgICAgICBlbHNlIGlmIChvcCA9PSAweDgzKQorCXsKKwkgIG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocmV0cGMrMSwgMSk7CQorCSAgaWYgKG9wID09IDB4YzQpCQkJCQorCSAgICAvKiBhZGRsICQ8c2lnbmVkIGltbSA4IGJpdHM+LCAlZXNwICovCQorCSAgICByZXR1cm4gKHJlYWRfbWVtb3J5X2ludGVnZXIgKHJldHBjKzIsMSkmMHhmZikvNDsKKwkgIGVsc2UKKwkgICAgcmV0dXJuIDA7CisJfQorICAgICAgZWxzZSBpZiAob3AgPT0gMHg4MSkKKwl7IC8qIGFkZCB3aXRoIDMyIGJpdCBpbW1lZGlhdGUgKi8KKwkgIG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocmV0cGMrMSwgMSk7CQorCSAgaWYgKG9wID09IDB4YzQpCQkJCQorCSAgICAvKiBhZGRsICQ8aW1tIDMyPiwgJWVzcCAqLwkJCisJICAgIHJldHVybiByZWFkX21lbW9yeV9pbnRlZ2VyIChyZXRwYysyLCA0KSAvIDQ7CisJICBlbHNlCisJICAgIHJldHVybiAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICByZXR1cm4gMDsKKwl9CisgICAgfQorI2VuZGlmCit9CisKKy8qCisgKiBwYXJzZSB0aGUgZmlyc3QgZmV3IGluc3RydWN0aW9ucyBvZiB0aGUgZnVuY3Rpb24gdG8gc2VlCisgKiB3aGF0IHJlZ2lzdGVycyB3ZXJlIHN0b3JlZC4KKyAqCisgKiBXZSBoYW5kbGUgdGhlc2UgY2FzZXM6CisgKgorICogVGhlIHN0YXJ0dXAgc2VxdWVuY2UgY2FuIGJlIGF0IHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24sCisgKiBvciB0aGUgZnVuY3Rpb24gY2FuIHN0YXJ0IHdpdGggYSBicmFuY2ggdG8gc3RhcnR1cCBjb2RlIGF0IHRoZSBlbmQuCisgKgorICogJWVicCBjYW4gYmUgc2V0IHVwIHdpdGggZWl0aGVyIHRoZSAnZW50ZXInIGluc3RydWN0aW9uLCBvciAKKyAqICdwdXNobCAlZWJwLCBtb3ZsICVlc3AsICVlYnAnIChlbnRlciBpcyB0b28gc2xvdyB0byBiZSB1c2VmdWwsCisgKiBidXQgd2FzIG9uY2UgdXNlZCBpbiB0aGUgc3lzNSBjb21waWxlcikKKyAqCisgKiBMb2NhbCBzcGFjZSBpcyBhbGxvY2F0ZWQganVzdCBiZWxvdyB0aGUgc2F2ZWQgJWVicCBieSBlaXRoZXIgdGhlCisgKiAnZW50ZXInIGluc3RydWN0aW9uLCBvciBieSAnc3VibCAkPHNpemU+LCAlZXNwJy4gICdlbnRlcicgaGFzCisgKiBhIDE2IGJpdCB1bnNpZ25lZCBhcmd1bWVudCBmb3Igc3BhY2UgdG8gYWxsb2NhdGUsIGFuZCB0aGUKKyAqICdhZGRsJyBpbnN0cnVjdGlvbiBjb3VsZCBoYXZlIGVpdGhlciBhIHNpZ25lZCBieXRlLCBvcgorICogMzIgYml0IGltbWVkaWF0ZS4KKyAqCisgKiBOZXh0LCB0aGUgcmVnaXN0ZXJzIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBhcmUgcHVzaGVkLiAgSW4KKyAqIHRoZSBzeXM1IGNvbXBpbGVyIHRoZXkgd2lsbCBhbHdheXMgYmUgaW4gdGhlIG9yZGVyOiAlZWRpLCAlZXNpLCAlZWJ4CisgKiAoYW5kIHNvbWV0aW1lcyBhIGhhcm1sZXNzIGJ1ZyBjYXVzZXMgaXQgdG8gYWxzbyBzYXZlIGJ1dCBub3QgcmVzdG9yZSAlZWF4KTsKKyAqIGhvd2V2ZXIsIHRoZSBjb2RlIGJlbG93IGlzIHdpbGxpbmcgdG8gc2VlIHRoZSBwdXNoZXMgaW4gYW55IG9yZGVyLAorICogYW5kIHdpbGwgaGFuZGxlIHVwIHRvIDggb2YgdGhlbS4KKyAqCisgKiBJZiB0aGUgc2V0dXAgc2VxdWVuY2UgaXMgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIHRoZW4gdGhlCisgKiBuZXh0IGluc3RydWN0aW9uIHdpbGwgYmUgYSBicmFuY2ggYmFjayB0byB0aGUgc3RhcnQuCisgKi8KKwordm9pZAoraTM4Nl9mcmFtZV9maW5kX3NhdmVkX3JlZ3MgKGZpcCwgZnNycCkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpcDsKKyAgICAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKmZzcnA7Cit7CisgIGxvbmcgbG9jYWxzID0gLTE7CisgIHVuc2lnbmVkIGNoYXIgb3A7CisgIENPUkVfQUREUiBkdW1teV9ib3R0b207CisgIENPUkVfQUREUiBhZHI7CisgIENPUkVfQUREUiBwYzsKKyAgaW50IGk7CisgIAorICBtZW1zZXQgKGZzcnAsIDAsIHNpemVvZiAqZnNycCk7CisgIAorICAvKiBpZiBmcmFtZSBpcyB0aGUgZW5kIG9mIGEgZHVtbXksIGNvbXB1dGUgd2hlcmUgdGhlCisgICAqIGJlZ2lubmluZyB3b3VsZCBiZQorICAgKi8KKyAgZHVtbXlfYm90dG9tID0gZmlwLT5mcmFtZSAtIDQgLSBSRUdJU1RFUl9CWVRFUyAtIENBTExfRFVNTVlfTEVOR1RIOworICAKKyAgLyogY2hlY2sgaWYgdGhlIFBDIGlzIGluIHRoZSBzdGFjaywgaW4gYSBkdW1teSBmcmFtZSAqLworICBpZiAoZHVtbXlfYm90dG9tIDw9IGZpcC0+cGMgJiYgZmlwLT5wYyA8PSBmaXAtPmZyYW1lKSAKKyAgICB7CisgICAgICAvKiBhbGwgcmVncyB3ZXJlIHNhdmVkIGJ5IHB1c2hfY2FsbF9kdW1teSAoKSAqLworICAgICAgYWRyID0gZmlwLT5mcmFtZTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUkVHUzsgaSsrKSAKKwl7CisJICBhZHIgLT0gUkVHSVNURVJfUkFXX1NJWkUgKGkpOworCSAgZnNycC0+cmVnc1tpXSA9IGFkcjsKKwl9CisgICAgICByZXR1cm47CisgICAgfQorICAKKyAgcGMgPSBnZXRfcGNfZnVuY3Rpb25fc3RhcnQgKGZpcC0+cGMpOworICBpZiAocGMgIT0gMCkKKyAgICBsb2NhbHMgPSBpMzg2X2dldF9mcmFtZV9zZXR1cCAocGMpOworICAKKyAgaWYgKGxvY2FscyA+PSAwKSAKKyAgICB7CisgICAgICBhZHIgPSBmaXAtPmZyYW1lIC0gNCAtIGxvY2FsczsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIAorCXsKKwkgIG9wID0gY29kZXN0cmVhbV9nZXQgKCk7CisJICBpZiAob3AgPCAweDUwIHx8IG9wID4gMHg1NykKKwkgICAgYnJlYWs7CisjaWZkZWYgSTM4Nl9SRUdOT19UT19TWU1NRVRSWQorCSAgLyogRHluaXggdXNlcyBkaWZmZXJlbnQgaW50ZXJuYWwgbnVtYmVyaW5nLiAgSWNrLiAgKi8KKwkgIGZzcnAtPnJlZ3NbSTM4Nl9SRUdOT19UT19TWU1NRVRSWShvcCAtIDB4NTApXSA9IGFkcjsKKyNlbHNlCisJICBmc3JwLT5yZWdzW29wIC0gMHg1MF0gPSBhZHI7CisjZW5kaWYKKwkgIGFkciAtPSA0OworCX0KKyAgICB9CisgIAorICBmc3JwLT5yZWdzW1BDX1JFR05VTV0gPSBmaXAtPmZyYW1lICsgNDsKKyAgZnNycC0+cmVnc1tGUF9SRUdOVU1dID0gZmlwLT5mcmFtZTsKK30KKworLyogcmV0dXJuIHBjIG9mIGZpcnN0IHJlYWwgaW5zdHJ1Y3Rpb24gKi8KKworaW50CitpMzg2X3NraXBfcHJvbG9ndWUgKHBjKQorICAgICBpbnQgcGM7Cit7CisgIHVuc2lnbmVkIGNoYXIgb3A7CisgIGludCBpOworICBzdGF0aWMgdW5zaWduZWQgY2hhciBwaWNfcGF0WzZdID0geyAweGU4LCAwLCAwLCAwLCAwLCAvKiBjYWxsICAgMHgwICovCisJCQkJICAgICAgMHg1YiwgICAgICAgICAgICAgLyogcG9wbCAgICVlYnggKi8KKwkJCQkgICAgfTsKKyAgQ09SRV9BRERSIHBvczsKKyAgCisgIGlmIChpMzg2X2dldF9mcmFtZV9zZXR1cCAocGMpIDwgMCkKKyAgICByZXR1cm4gKHBjKTsKKyAgCisgIC8qIGZvdW5kIHZhbGlkIGZyYW1lIHNldHVwIC0gY29kZXN0cmVhbSBub3cgcG9pbnRzIHRvIAorICAgKiBzdGFydCBvZiBwdXNoIGluc3RydWN0aW9ucyBmb3Igc2F2aW5nIHJlZ2lzdGVycworICAgKi8KKyAgCisgIC8qIHNraXAgb3ZlciByZWdpc3RlciBzYXZlcyAqLworICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgIHsKKyAgICAgIG9wID0gY29kZXN0cmVhbV9wZWVrICgpOworICAgICAgLyogYnJlYWsgaWYgbm90IHB1c2hsIGluc3QgKi8KKyAgICAgIGlmIChvcCA8IDB4NTAgfHwgb3AgPiAweDU3KSAKKwlicmVhazsKKyAgICAgIGNvZGVzdHJlYW1fZ2V0ICgpOworICAgIH0KKworICAvKiBUaGUgbmF0aXZlIGNjIG9uIFNWUjQgaW4gLUsgUElDIG1vZGUgaW5zZXJ0cyB0aGUgZm9sbG93aW5nIGNvZGUgdG8gZ2V0CisgICAgIHRoZSBhZGRyZXNzIG9mIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIChHT1QpIGludG8gcmVnaXN0ZXIgJWVieC4KKyAgICAgIGNhbGwJMHgwCisgICAgICBwb3BsCSVlYngKKyAgICAgIG1vdmwJJWVieCx4KCVlYnApCShvcHRpb25hbCkKKyAgICAgIGFkZGwJeSwlZWJ4CisgICAgIFRoaXMgY29kZSBpcyB3aXRoIHRoZSByZXN0IG9mIHRoZSBwcm9sb2d1ZSAoYXQgdGhlIGVuZCBvZiB0aGUKKyAgICAgZnVuY3Rpb24pLCBzbyB3ZSBoYXZlIHRvIHNraXAgaXQgdG8gZ2V0IHRvIHRoZSBmaXJzdCByZWFsCisgICAgIGluc3RydWN0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICAqLworICAgICAKKyAgcG9zID0gY29kZXN0cmVhbV90ZWxsICgpOworICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgIHsKKyAgICAgIG9wID0gY29kZXN0cmVhbV9nZXQgKCk7CisgICAgICBpZiAocGljX3BhdCBbaV0gIT0gb3ApCisJYnJlYWs7CisgICAgfQorICBpZiAoaSA9PSA2KQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgYnVmWzRdOworICAgICAgbG9uZyBkZWx0YSA9IDY7CisKKyAgICAgIG9wID0gY29kZXN0cmVhbV9nZXQgKCk7CisgICAgICBpZiAob3AgPT0gMHg4OSkJCQkvKiBtb3ZsICVlYngsIHgoJWVicCkgKi8KKwl7CisJICBvcCA9IGNvZGVzdHJlYW1fZ2V0ICgpOworCSAgaWYgKG9wID09IDB4NWQpCQkvKiBvbmUgYnl0ZSBvZmZzZXQgZnJvbSAlZWJwICovCisJICAgIHsKKwkgICAgICBkZWx0YSArPSAzOworCSAgICAgIGNvZGVzdHJlYW1fcmVhZCAoYnVmLCAxKTsKKwkgICAgfQorCSAgZWxzZSBpZiAob3AgPT0gMHg5ZCkJCS8qIGZvdXIgYnl0ZSBvZmZzZXQgZnJvbSAlZWJwICovCisJICAgIHsKKwkgICAgICBkZWx0YSArPSA2OworCSAgICAgIGNvZGVzdHJlYW1fcmVhZCAoYnVmLCA0KTsKKwkgICAgfQorCSAgZWxzZQkJCQkvKiB1bmV4cGVjdGVkIGluc3RydWN0aW9uICovCisJICAgICAgZGVsdGEgPSAtMTsKKyAgICAgICAgICBvcCA9IGNvZGVzdHJlYW1fZ2V0ICgpOworCX0KKwkJCQkJLyogYWRkbCB5LCVlYnggKi8KKyAgICAgIGlmIChkZWx0YSA+IDAgJiYgb3AgPT0gMHg4MSAmJiBjb2Rlc3RyZWFtX2dldCAoKSA9PSAweGMzKSAKKwl7CisJICAgIHBvcyArPSBkZWx0YSArIDY7CisJfQorICAgIH0KKyAgY29kZXN0cmVhbV9zZWVrIChwb3MpOworICAKKyAgaTM4Nl9mb2xsb3dfanVtcCAoKTsKKyAgCisgIHJldHVybiAoY29kZXN0cmVhbV90ZWxsICgpKTsKK30KKwordm9pZAoraTM4Nl9wdXNoX2R1bW15X2ZyYW1lICgpCit7CisgIENPUkVfQUREUiBzcCA9IHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSk7CisgIGludCByZWdudW07CisgIGNoYXIgcmVnYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisgIAorICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKFBDX1JFR05VTSkpOworICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKEZQX1JFR05VTSkpOworICB3cml0ZV9yZWdpc3RlciAoRlBfUkVHTlVNLCBzcCk7CisgIGZvciAocmVnbnVtID0gMDsgcmVnbnVtIDwgTlVNX1JFR1M7IHJlZ251bSsrKQorICAgIHsKKyAgICAgIHJlYWRfcmVnaXN0ZXJfZ2VuIChyZWdudW0sIHJlZ2J1Zik7CisgICAgICBzcCA9IHB1c2hfYnl0ZXMgKHNwLCByZWdidWYsIFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pKTsKKyAgICB9CisgIHdyaXRlX3JlZ2lzdGVyIChTUF9SRUdOVU0sIHNwKTsKK30KKwordm9pZAoraTM4Nl9wb3BfZnJhbWUgKCkKK3sKKyAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lID0gZ2V0X2N1cnJlbnRfZnJhbWUgKCk7CisgIENPUkVfQUREUiBmcDsKKyAgaW50IHJlZ251bTsKKyAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgZnNyOworICBjaGFyIHJlZ2J1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworICAKKyAgZnAgPSBGUkFNRV9GUCAoZnJhbWUpOworICBnZXRfZnJhbWVfc2F2ZWRfcmVncyAoZnJhbWUsICZmc3IpOworICBmb3IgKHJlZ251bSA9IDA7IHJlZ251bSA8IE5VTV9SRUdTOyByZWdudW0rKykgCisgICAgeworICAgICAgQ09SRV9BRERSIGFkcjsKKyAgICAgIGFkciA9IGZzci5yZWdzW3JlZ251bV07CisgICAgICBpZiAoYWRyKQorCXsKKwkgIHJlYWRfbWVtb3J5IChhZHIsIHJlZ2J1ZiwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSkpOworCSAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKFJFR0lTVEVSX0JZVEUgKHJlZ251bSksIHJlZ2J1ZiwKKwkJCQlSRUdJU1RFUl9SQVdfU0laRSAocmVnbnVtKSk7CisJfQorICAgIH0KKyAgd3JpdGVfcmVnaXN0ZXIgKEZQX1JFR05VTSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnAsIDQpKTsKKyAgd3JpdGVfcmVnaXN0ZXIgKFBDX1JFR05VTSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnAgKyA0LCA0KSk7CisgIHdyaXRlX3JlZ2lzdGVyIChTUF9SRUdOVU0sIGZwICsgOCk7CisgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7Cit9CisKKyNpZmRlZiBHRVRfTE9OR0pNUF9UQVJHRVQKKworLyogRmlndXJlIG91dCB3aGVyZSB0aGUgbG9uZ2ptcCB3aWxsIGxhbmQuICBTbHVycCB0aGUgYXJncyBvdXQgb2YgdGhlIHN0YWNrLgorICAgV2UgZXhwZWN0IHRoZSBmaXJzdCBhcmcgdG8gYmUgYSBwb2ludGVyIHRvIHRoZSBqbXBfYnVmIHN0cnVjdHVyZSBmcm9tIHdoaWNoCisgICB3ZSBleHRyYWN0IHRoZSBwYyAoSkJfUEMpIHRoYXQgd2Ugd2lsbCBsYW5kIGF0LiAgVGhlIHBjIGlzIGNvcGllZCBpbnRvIFBDLgorICAgVGhpcyByb3V0aW5lIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiAqLworCitpbnQKK2dldF9sb25nam1wX3RhcmdldChwYykKKyAgICAgQ09SRV9BRERSICpwYzsKK3sKKyAgY2hhciBidWZbVEFSR0VUX1BUUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVRdOworICBDT1JFX0FERFIgc3AsIGpiX2FkZHI7CisKKyAgc3AgPSByZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pOworCisgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkgKHNwICsgU1BfQVJHMCwgLyogT2Zmc2V0IG9mIGZpcnN0IGFyZyBvbiBzdGFjayAqLworCQkJICBidWYsCisJCQkgIFRBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUKSkKKyAgICByZXR1cm4gMDsKKworICBqYl9hZGRyID0gZXh0cmFjdF9hZGRyZXNzIChidWYsIFRBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUKTsKKworICBpZiAodGFyZ2V0X3JlYWRfbWVtb3J5IChqYl9hZGRyICsgSkJfUEMgKiBKQl9FTEVNRU5UX1NJWkUsIGJ1ZiwKKwkJCSAgVEFSR0VUX1BUUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQpKQorICAgIHJldHVybiAwOworCisgICpwYyA9IGV4dHJhY3RfYWRkcmVzcyAoYnVmLCBUQVJHRVRfUFRSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCk7CisKKyAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvKiBHRVRfTE9OR0pNUF9UQVJHRVQgKi8KKwordm9pZAoraTM4Nl9leHRyYWN0X3JldHVybl92YWx1ZSh0eXBlLCByZWdidWYsIHZhbGJ1ZikKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGNoYXIgcmVnYnVmW1JFR0lTVEVSX0JZVEVTXTsKKyAgICAgY2hhciAqdmFsYnVmOworeworLyogT24gQUlYLCBmbG9hdGluZyBwb2ludCB2YWx1ZXMgYXJlIHJldHVybmVkIGluIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycy4gICovCisjaWZkZWYgSTM4Nl9BSVhfVEFSR0VUCisgIGlmIChUWVBFX0NPREVfRkxUID09IFRZUEVfQ09ERSh0eXBlKSkKKyAgICB7CisgICAgICBkb3VibGUgZDsKKyAgICAgIC8qIDM4NyAlc3QoMCksIGdjYyB1c2VzIHRoaXMgKi8KKyAgICAgIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X2kzODdfZXh0LAorCQkJICAgICAmcmVnYnVmW1JFR0lTVEVSX0JZVEUoRlAwX1JFR05VTSldLAorCQkJICAgICAmZCk7CisgICAgICBzdG9yZV9mbG9hdGluZyAodmFsYnVmLCBUWVBFX0xFTkdUSCAodHlwZSksIGQpOworICAgIH0KKyAgZWxzZQorI2VuZGlmIC8qIEkzODZfQUlYX1RBUkdFVCAqLworICAgIHsgCisgICAgICBtZW1jcHkgKHZhbGJ1ZiwgcmVnYnVmLCBUWVBFX0xFTkdUSCAodHlwZSkpOyAKKyAgICB9Cit9CisKKyNpZmRlZiBJMzg2VjRfU0lHVFJBTVBfU0FWRURfUEMKKy8qIEdldCBzYXZlZCB1c2VyIFBDIGZvciBzaWd0cmFtcCBmcm9tIHRoZSBwdXNoZWQgdWNvbnRleHQgb24gdGhlIHN0YWNrCisgICBmb3IgYWxsIHRocmVlIHZhcmlhbnRzIG9mIFNWUjQgc2lndHJhbXBzLiAgKi8KKworQ09SRV9BRERSCitpMzg2djRfc2lndHJhbXBfc2F2ZWRfcGMgKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIENPUkVfQUREUiBzYXZlZF9wY19vZmZzZXQgPSA0OworICBjaGFyICpuYW1lID0gTlVMTDsKKworICBmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gKGZyYW1lLT5wYywgJm5hbWUsIE5VTEwsIE5VTEwpOworICBpZiAobmFtZSkKKyAgICB7CisgICAgICBpZiAoU1RSRVEgKG5hbWUsICJfc2lncmV0dXJuIikpCisJc2F2ZWRfcGNfb2Zmc2V0ID0gMTMyICsgMTQgKiA0OworICAgICAgZWxzZSBpZiAoU1RSRVEgKG5hbWUsICJfc2lnYWN0aGFuZGxlciIpKQorCXNhdmVkX3BjX29mZnNldCA9IDgwICsgMTQgKiA0OworICAgICAgZWxzZSBpZiAoU1RSRVEgKG5hbWUsICJzaWd2ZWNoYW5kbGVyIikpCisJc2F2ZWRfcGNfb2Zmc2V0ID0gMTIwICsgMTQgKiA0OworICAgIH0KKworICBpZiAoZnJhbWUtPm5leHQpCisgICAgcmV0dXJuIHJlYWRfbWVtb3J5X2ludGVnZXIgKGZyYW1lLT5uZXh0LT5mcmFtZSArIHNhdmVkX3BjX29mZnNldCwgNCk7CisgIHJldHVybiByZWFkX21lbW9yeV9pbnRlZ2VyIChyZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pICsgc2F2ZWRfcGNfb2Zmc2V0LCA0KTsKK30KKyNlbmRpZiAvKiBJMzg2VjRfU0lHVFJBTVBfU0FWRURfUEMgKi8KKworI2lmZGVmIFNUQVRJQ19UUkFOU0ZPUk1fTkFNRQorLyogU3VuUFJPIGVuY29kZXMgdGhlIHN0YXRpYyB2YXJpYWJsZXMuICBUaGlzIGlzIG5vdCByZWxhdGVkIHRvIEMrKyBtYW5nbGluZywKKyAgIGl0IGlzIGRvbmUgZm9yIEMgdG9vLiAgKi8KKworY2hhciAqCitzdW5wcm9fc3RhdGljX3RyYW5zZm9ybV9uYW1lIChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICBjaGFyICpwOworICBpZiAoSVNfU1RBVElDX1RSQU5TRk9STV9OQU1FIChuYW1lKSkKKyAgICB7CisgICAgICAvKiBGb3IgZmlsZS1sb2NhbCBzdGF0aWNzIHRoZXJlIHdpbGwgYmUgYSBwZXJpb2QsIGEgYnVuY2gKKwkgb2YganVuayAodGhlIGNvbnRlbnRzIG9mIHdoaWNoIG1hdGNoIGEgc3RyaW5nIGdpdmVuIGluIHRoZQorCSBOX09QVCksIGEgcGVyaW9kIGFuZCB0aGUgbmFtZS4gIEZvciBmdW5jdGlvbi1sb2NhbCBzdGF0aWNzCisJIHRoZXJlIHdpbGwgYmUgYSBidW5jaCBvZiBqdW5rICh3aGljaCBzZWVtcyB0byBjaGFuZ2UgdGhlCisJIHNlY29uZCBjaGFyYWN0ZXIgZnJvbSAnQScgdG8gJ0InKSwgYSBwZXJpb2QsIHRoZSBuYW1lIG9mIHRoZQorCSBmdW5jdGlvbiwgYW5kIHRoZSBuYW1lLiAgU28ganVzdCBza2lwIGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZQorCSBsYXN0IHBlcmlvZC4gICovCisgICAgICBwID0gc3RycmNociAobmFtZSwgJy4nKTsKKyAgICAgIGlmIChwICE9IE5VTEwpCisJbmFtZSA9IHAgKyAxOworICAgIH0KKyAgcmV0dXJuIG5hbWU7Cit9CisjZW5kaWYgLyogU1RBVElDX1RSQU5TRk9STV9OQU1FICovCisKKworCisvKiBTdHVmZiBmb3IgV0lOMzIgUEUgc3R5bGUgRExMJ3MgYnV0IGlzIHByZXR0eSBnZW5lcmljIHJlYWxseS4gKi8KKworQ09SRV9BRERSCitza2lwX3RyYW1wb2xpbmVfY29kZSAocGMsIG5hbWUpCisgICAgIENPUkVfQUREUiBwYzsKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgaWYgKHBjICYmIHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKHBjLCAyKSA9PSAweDI1ZmYpIC8qIGptcCAqKGRlc3QpICovCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBpbmRpcmVjdCA9IHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKHBjKzIsIDQpOworICAgICAgc3RydWN0IG1pbmltYWxfc3ltYm9sICppbmRzeW0gPQorCWluZGlyZWN0ID8gbG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjIChpbmRpcmVjdCkgOiAwOworICAgICAgY2hhciAqc3ltbmFtZSA9IGluZHN5bSA/IFNZTUJPTF9OQU1FKGluZHN5bSkgOiAwOworCisgICAgICBpZiAoc3ltbmFtZSkgCisJeworCSAgaWYgKHN0cm5jbXAgKHN5bW5hbWUsIl9faW1wXyIsIDYpID09IDAKKwkgICAgICB8fCBzdHJuY21wIChzeW1uYW1lLCJfaW1wXyIsIDUpID09IDApCisJICAgIHJldHVybiBuYW1lID8gMSA6IHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKGluZGlyZWN0LCA0KTsKKwl9CisgICAgfQorICByZXR1cm4gMDsJCQkvKiBub3QgYSB0cmFtcG9saW5lICovCit9CisKK3N0YXRpYyBpbnQKK2dkYl9wcmludF9pbnNuX2kzODYgKG1lbWFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgbWVtYWRkcjsKKyAgICAgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Cit7CisgIGlmIChkaXNhc3NlbWJseV9mbGF2b3IgPT0gYXR0X2ZsYXZvcikKKyAgICByZXR1cm4gcHJpbnRfaW5zbl9pMzg2X2F0dCAobWVtYWRkciwgaW5mbyk7CisgIGVsc2UgaWYgKGRpc2Fzc2VtYmx5X2ZsYXZvciA9PSBpbnRlbF9mbGF2b3IpCisgICAgcmV0dXJuIHByaW50X2luc25faTM4Nl9pbnRlbCAobWVtYWRkciwgaW5mbyk7Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX2kzODZfdGRlcCAoKQoreworICB0bV9wcmludF9pbnNuID0gZ2RiX3ByaW50X2luc25faTM4NjsKKyAgdG1fcHJpbnRfaW5zbl9pbmZvLm1hY2ggPSBiZmRfbG9va3VwX2FyY2ggKGJmZF9hcmNoX2kzODYsIDApLT5tYWNoOworCisgIC8qIEFkZCB0aGUgdmFyaWFibGUgdGhhdCBjb250cm9scyB0aGUgZGlzYXNzZW1ibHkgZmxhdm9yICovCisgIGFkZF9zaG93X2Zyb21fc2V0KAorCSAgICBhZGRfc2V0X2VudW1fY21kICgiZGlzYXNzZW1ibHktZmxhdm9yIiwgbm9fY2xhc3MsCisJCQkJICB2YWxpZF9mbGF2b3JzLAorCQkJCSAgKGNoYXIgKikgJmRpc2Fzc2VtYmx5X2ZsYXZvciwKKwkJCQkgICJTZXQgdGhlIGRpc2Fzc2VtYmx5IGZsYXZvciwgdGhlIHZhbGlkIHZhbHVlcyBhcmUgXCJhdHRcIiBhbmQgXCJpbnRlbFwiLCBcCithbmQgdGhlIGRlZmF1bHQgdmFsdWUgaXMgXCJhdHRcIi4iLAorCQkJCSAgJnNldGxpc3QpLAorCSAgICAmc2hvd2xpc3QpOworCisgIAorfQpkaWZmIC0tZ2l0IGEvZ2RiL2kzODZhaXgtbmF0LmMgYi9nZGIvaTM4NmFpeC1uYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGU2NTZlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2kzODZhaXgtbmF0LmMKQEAgLTAsMCArMSwzNjIgQEAKKy8qIEludGVsIDM4NiBuYXRpdmUgc3VwcG9ydC4KKyAgIENvcHlyaWdodCAoQykgMTk4OCwgMTk4OSwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKworI2lmZGVmIFVTRworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3VzZXIuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlICJnZGJfc3RhdC5oIgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorCisvKiBEb2VzIEFJWCBkZWZpbmUgdGhpcyBpbiA8ZXJybm8uaD4/ICAqLworZXh0ZXJuIGludCBlcnJubzsKKworI2lmZGVmIEhBVkVfU1lTX1JFR19ICisjaW5jbHVkZSA8c3lzL3JlZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJmbG9hdGZvcm1hdC5oIgorCisjaW5jbHVkZSAidGFyZ2V0LmgiCisKK3N0YXRpYyB2b2lkIGZldGNoX2NvcmVfcmVnaXN0ZXJzIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQsIGludCwgQ09SRV9BRERSKSk7CisKKwwKKy8qIHRoaXMgdGFibGUgbXVzdCBsaW5lIHVwIHdpdGggUkVHSVNURVJfTkFNRVMgaW4gdG0taTM4NnYuaCAqLworLyogc3ltYm9scyBsaWtlICdFQVgnIGNvbWUgZnJvbSA8c3lzL3JlZy5oPiAqLworc3RhdGljIGludCByZWdtYXBbXSA9IAoreworICBFQVgsIEVDWCwgRURYLCBFQlgsCisgIFVTUCwgRUJQLCBFU0ksIEVESSwKKyAgRUlQLCBFRkwsIENTLCBTUywKKyAgRFMsIEVTLCBGUywgR1MsCit9OworCisvKiBibG9ja2VuZCBpcyB0aGUgdmFsdWUgb2YgdS51X2FyMCwgYW5kIHBvaW50cyB0byB0aGUKKyAqIHBsYWNlIHdoZXJlIEdTIGlzIHN0b3JlZAorICovCisKK2ludAoraTM4Nl9yZWdpc3Rlcl91X2FkZHIgKGJsb2NrZW5kLCByZWdudW0pCisgICAgIGludCBibG9ja2VuZDsKKyAgICAgaW50IHJlZ251bTsKK3sKKyNpZiAwCisgIC8qIHRoaXMgd2lsbCBiZSBuZWVkZWQgaWYgZnAgcmVnaXN0ZXJzIGFyZSByZWluc3RhdGVkICovCisgIC8qIGZvciBub3csIHlvdSBjYW4gbG9vayBhdCB0aGVtIHdpdGggJ2luZm8gZmxvYXQnCisgICAqIHN5czUgd29udCBsZXQgeW91IGNoYW5nZSB0aGVtIHdpdGggcHRyYWNlIGFueXdheQorICAgKi8KKyAgaWYgKHJlZ251bSA+PSBGUDBfUkVHTlVNICYmIHJlZ251bSA8PSBGUDdfUkVHTlVNKSAKKyAgICB7CisgICAgICBpbnQgdWJhc2UsIGZwc3RhdGU7CisgICAgICBzdHJ1Y3QgdXNlciB1OworICAgICAgdWJhc2UgPSBibG9ja2VuZCArIDQgKiAoU1MgKyAxKSAtIEtTVEtTWjsKKyAgICAgIGZwc3RhdGUgPSB1YmFzZSArICgoY2hhciAqKSZ1LnVfZnBzdGF0ZSAtIChjaGFyICopJnUpOworICAgICAgcmV0dXJuIChmcHN0YXRlICsgMHgxYyArIDEwICogKHJlZ251bSAtIEZQMF9SRUdOVU0pKTsKKyAgICB9IAorICBlbHNlCisjZW5kaWYKKyAgICByZXR1cm4gKGJsb2NrZW5kICsgNCAqIHJlZ21hcFtyZWdudW1dKTsKKyAgCit9CisKKy8qIFRoZSBjb2RlIGJlbG93IG9ubHkgd29yayBvbiB0aGUgYWl4IHBzLzIgKGkzODYtaWJtLWFpeCkgLQorICogbXRyYW5sZUBwYXJpcyAtIFNhdCBBcHIgMTEgMTA6MzQ6MTIgMTk5MgorICovCisKK3N0cnVjdCBlbnYzODcgCit7CisgIHVuc2lnbmVkIHNob3J0IGNvbnRyb2w7CisgIHVuc2lnbmVkIHNob3J0IHIwOworICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisgIHVuc2lnbmVkIHNob3J0IHIxOworICB1bnNpZ25lZCBzaG9ydCB0YWc7CisgIHVuc2lnbmVkIHNob3J0IHIyOworICB1bnNpZ25lZCBsb25nIGVpcDsKKyAgdW5zaWduZWQgc2hvcnQgY29kZV9zZWc7CisgIHVuc2lnbmVkIHNob3J0IG9wY29kZTsKKyAgdW5zaWduZWQgbG9uZyBvcGVyYW5kOworICB1bnNpZ25lZCBzaG9ydCBvcGVyYW5kX3NlZzsKKyAgdW5zaWduZWQgc2hvcnQgcjM7CisgIHVuc2lnbmVkIGNoYXIgcmVnc1s4XVsxMF07Cit9OworCitzdGF0aWMKK3ByaW50XzM4N19zdGF0dXMgKHN0YXR1cywgZXApCisgICAgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKKyAgICAgc3RydWN0IGVudjM4NyAqZXA7Cit7CisgIGludCBpOworICBpbnQgYm90aHN0YXR1czsKKyAgaW50IHRvcDsKKyAgaW50IGZwcmVnOworICB1bnNpZ25lZCBjaGFyICpwOworICAKKyAgYm90aHN0YXR1cyA9ICgoc3RhdHVzICE9IDApICYmIChlcC0+c3RhdHVzICE9IDApKTsKKyAgaWYgKHN0YXR1cyAhPSAwKSAKKyAgICB7CisgICAgICBpZiAoYm90aHN0YXR1cykKKwlwcmludGZfdW5maWx0ZXJlZCAoInU6ICIpOworICAgICAgcHJpbnRfMzg3X3N0YXR1c193b3JkIChzdGF0dXMpOworICAgIH0KKyAgCisgIGlmIChlcC0+c3RhdHVzICE9IDApIAorICAgIHsKKyAgICAgIGlmIChib3Roc3RhdHVzKQorCXByaW50Zl91bmZpbHRlcmVkICgiZTogIik7CisgICAgICBwcmludF8zODdfc3RhdHVzX3dvcmQgKGVwLT5zdGF0dXMpOworICAgIH0KKyAgCisgIHByaW50XzM4N19jb250cm9sX3dvcmQgKGVwLT5jb250cm9sKTsKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJsYXN0IGV4Y2VwdGlvbjogIik7CisgIHByaW50Zl91bmZpbHRlcmVkICgib3Bjb2RlICVzOyAiLCBsb2NhbF9oZXhfc3RyaW5nKGVwLT5vcGNvZGUpKTsKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJwYyAlczoiLCBsb2NhbF9oZXhfc3RyaW5nKGVwLT5jb2RlX3NlZykpOworICBwcmludGZfdW5maWx0ZXJlZCAoIiVzOyAiLCBsb2NhbF9oZXhfc3RyaW5nKGVwLT5laXApKTsKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJvcGVyYW5kICVzIiwgbG9jYWxfaGV4X3N0cmluZyhlcC0+b3BlcmFuZF9zZWcpKTsKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCI6JXNcbiIsIGxvY2FsX2hleF9zdHJpbmcoZXAtPm9wZXJhbmQpKTsKKworICB0b3AgPSAoKGVwLT5zdGF0dXMgPj4gMTEpICYgNyk7CisKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJyZWdubyAgdGFnICBtc2IgICAgICAgICAgICAgIGxzYiAgdmFsdWVcbiIpOworICBmb3IgKGZwcmVnID0gNzsgZnByZWcgPj0gMDsgZnByZWctLSkgCisgICAgeworICAgICAgZG91YmxlIHZhbDsKKworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlcyAlZDogIiwgZnByZWcgPT0gdG9wID8gIj0+IiA6ICIgICIsIGZwcmVnKTsKKworICAgICAgc3dpdGNoICgoZXAtPnRhZyA+PiAoKDcgLSBmcHJlZykgKiAyKSkgJiAzKSAKKwl7CisJY2FzZSAwOiBwcmludGZfdW5maWx0ZXJlZCAoInZhbGlkICIpOyBicmVhazsKKwljYXNlIDE6IHByaW50Zl91bmZpbHRlcmVkICgiemVybyAgIik7IGJyZWFrOworCWNhc2UgMjogcHJpbnRmX3VuZmlsdGVyZWQgKCJ0cmFwICAiKTsgYnJlYWs7CisJY2FzZSAzOiBwcmludGZfdW5maWx0ZXJlZCAoImVtcHR5ICIpOyBicmVhazsKKwl9CisgICAgICBmb3IgKGkgPSA5OyBpID49IDA7IGktLSkKKwlwcmludGZfdW5maWx0ZXJlZCAoIiUwMngiLCBlcC0+cmVnc1tmcHJlZ11baV0pOworICAgICAgCisgICAgICBpMzg3X3RvX2RvdWJsZSAoKGNoYXIgKillcC0+cmVnc1tmcHJlZ10sIChjaGFyICopJnZhbCk7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIiAgJSNnXG4iLCB2YWwpOworICAgIH0KK30KKworc3RhdGljIHN0cnVjdCBlbnYzODcgY29yZV9lbnYzODc7CisKK3ZvaWQKK2kzODZfZmxvYXRfaW5mbyAoKQoreworICBzdHJ1Y3QgZW52Mzg3IGZwczsKKyAgaW50IGZwc2F2ZWQgPSAwOworICAvKiBXZSBuZWVkIHRvIHJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSByZWdpc3RlcnMuICBBcHBhcmVudGx5IEFJWCBzdG9yZXMKKyAgICAgdGhlIGhpZ2hlc3QtbnVtYmVyZWQgb25lcyBmaXJzdC4gICovCisgIHN0cnVjdCBlbnYzODcgZnBzX2ZpeGVkOworICBpbnQgaTsKKworICBpZiAoaW5mZXJpb3JfcGlkKQorICAgIHsKKyAgICAgIGNoYXIgYnVmWzEwXTsKKyAgICAgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKKworICAgICAgcHRyYWNlIChQVF9SRUFEX0ZQUiwgaW5mZXJpb3JfcGlkLCBidWYsIG9mZnNldG9mKHN0cnVjdCBlbnYzODcsIHN0YXR1cykpOworICAgICAgbWVtY3B5ICgmc3RhdHVzLCBidWYsIHNpemVvZiAoc3RhdHVzKSk7CisgICAgICBmcHNhdmVkID0gc3RhdHVzOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICgoZnBzYXZlZCA9IGNvcmVfZW52Mzg3LnN0YXR1cykgIT0gMCkKKwltZW1jcHkoJmZwcywgJmNvcmVfZW52Mzg3LCBzaXplb2YoZnBzKSk7CisgICAgfQorICAKKyAgaWYgKGZwc2F2ZWQgPT0gMCkgCisgICAgeworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJubyBmbG9hdGluZyBwb2ludCBzdGF0dXMgc2F2ZWRcbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoaW5mZXJpb3JfcGlkKQorICAgIHsKKyAgICAgIGludCBvZmZzZXQ7CisgICAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IHNpemVvZihmcHMpOyBvZmZzZXQgKz0gMTApCisJeworCSAgY2hhciBidWZbMTBdOworCSAgcHRyYWNlIChQVF9SRUFEX0ZQUiwgaW5mZXJpb3JfcGlkLCBidWYsIG9mZnNldCk7CisJICBtZW1jcHkgKChjaGFyICopJmZwcy5jb250cm9sICsgb2Zmc2V0LCBidWYsCisJCSAgTUlOKDEwLCBzaXplb2YoZnBzKSAtIG9mZnNldCkpOworCX0KKyAgICB9IAorICBmcHNfZml4ZWQgPSBmcHM7CisgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpCisgICAgbWVtY3B5IChmcHNfZml4ZWQucmVnc1tpXSwgZnBzLnJlZ3NbNyAtIGldLCAxMCk7CisgIHByaW50XzM4N19zdGF0dXMgKDAsICZmcHNfZml4ZWQpOworfQorCisvKiBGZXRjaCBvbmUgcmVnaXN0ZXIuICAqLworc3RhdGljIHZvaWQKK2ZldGNoX3JlZ2lzdGVyIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBjaGFyIGJ1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworICBpZiAocmVnbm8gPCBGUDBfUkVHTlVNKQorICAgICooaW50ICopYnVmID0gcHRyYWNlIChQVF9SRUFEX0dQUiwgaW5mZXJpb3JfcGlkLAorCQkJICBQVF9SRUcocmVnbWFwW3JlZ25vXSksIDAsIDApOworICBlbHNlCisgICAgcHRyYWNlIChQVF9SRUFEX0ZQUiwgaW5mZXJpb3JfcGlkLCBidWYsCisJICAgIChyZWdubyAtIEZQMF9SRUdOVU0pKjEwICsgb2Zmc2V0b2Yoc3RydWN0IGVudjM4NywgcmVncykpOworICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCBidWYpOworfQorCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGlmIChyZWdubyA8IDApCisgICAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgTlVNX1JFR1M7IHJlZ25vKyspCisgICAgICBmZXRjaF9yZWdpc3RlciAocmVnbm8pOworICBlbHNlCisgICAgZmV0Y2hfcmVnaXN0ZXIgKHJlZ25vKTsKK30KKworLyogc3RvcmUgb25lIHJlZ2lzdGVyICovCitzdGF0aWMgdm9pZAorc3RvcmVfcmVnaXN0ZXIgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGNoYXIgYnVmWzgwXTsKKyAgZXh0ZXJuIGNoYXIgcmVnaXN0ZXJzW107CisgIGVycm5vID0gMDsKKyAgaWYgKHJlZ25vIDwgRlAwX1JFR05VTSkKKyAgICBwdHJhY2UgKFBUX1dSSVRFX0dQUiwgaW5mZXJpb3JfcGlkLCBQVF9SRUcocmVnbWFwW3JlZ25vXSksCisJICAgICooaW50ICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnbm8pXSwgMCk7CisgIGVsc2UKKyAgICBwdHJhY2UgKFBUX1dSSVRFX0ZQUiwgaW5mZXJpb3JfcGlkLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ25vKV0sCisJICAgIChyZWdubyAtIEZQMF9SRUdOVU0pKjEwICsgb2Zmc2V0b2Yoc3RydWN0IGVudjM4NywgcmVncykpOworCisgIGlmIChlcnJubyAhPSAwKQorICAgIHsKKyAgICAgIHNwcmludGYgKGJ1ZiwgIndyaXRpbmcgcmVnaXN0ZXIgbnVtYmVyICVkIiwgcmVnbm8pOworICAgICAgcGVycm9yX3dpdGhfbmFtZSAoYnVmKTsKKyAgICB9Cit9CisKKy8qIFN0b3JlIG91ciByZWdpc3RlciB2YWx1ZXMgYmFjayBpbnRvIHRoZSBpbmZlcmlvci4KKyAgIElmIFJFR05PIGlzIC0xLCBkbyB0aGlzIGZvciBhbGwgcmVnaXN0ZXJzLgorICAgT3RoZXJ3aXNlLCBSRUdOTyBzcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXIgKHNvIHdlIGNhbiBzYXZlIHRpbWUpLiAgKi8KK3ZvaWQKK3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgaWYgKHJlZ25vIDwgMCkKKyAgICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCBOVU1fUkVHUzsgcmVnbm8rKykKKyAgICAgIHN0b3JlX3JlZ2lzdGVyIChyZWdubyk7CisgIGVsc2UKKyAgICBzdG9yZV9yZWdpc3RlciAocmVnbm8pOworfQorCisjaWZuZGVmIENEX0FYCQkJLyogZGVmaW5lZCBpbiBzeXMvaTM4Ni9jb3JlZHVtcC5oICovCisjIGRlZmluZSBDRF9BWAkwCisjIGRlZmluZSBDRF9CWAkxCisjIGRlZmluZSBDRF9DWAkyCisjIGRlZmluZSBDRF9EWAkzCisjIGRlZmluZSBDRF9TSQk0CisjIGRlZmluZSBDRF9ESQk1CisjIGRlZmluZSBDRF9CUAk2CisjIGRlZmluZSBDRF9TUAk3CisjIGRlZmluZSBDRF9GTAk4CisjIGRlZmluZSBDRF9JUAk5CisjIGRlZmluZSBDRF9DUwkxMAorIyBkZWZpbmUgQ0RfRFMJMTEKKyMgZGVmaW5lIENEX0VTCTEyCisjIGRlZmluZSBDRF9GUwkxMworIyBkZWZpbmUgQ0RfR1MJMTQKKyMgZGVmaW5lIENEX1NTCTE1CisjZW5kaWYKKworLyoKKyAqIFRoZSBvcmRlciBoZXJlIGluIGNvcmVfcmVnbWFwW10gaGFzIHRvIGJlIHRoZSBzYW1lIGFzIGluIAorICogcmVnbWFwW10gYWJvdmUuCisgKi8KK3N0YXRpYyBpbnQgY29yZV9yZWdtYXBbXSA9IAoreworICBDRF9BWCwgQ0RfQ1gsIENEX0RYLCBDRF9CWCwKKyAgQ0RfU1AsIENEX0JQLCBDRF9TSSwgQ0RfREksCisgIENEX0lQLCBDRF9GTCwgQ0RfQ1MsIENEX1NTLAorICBDRF9EUywgQ0RfRVMsIENEX0ZTLCBDRF9HUywKK307CisKK3N0YXRpYyB2b2lkCitmZXRjaF9jb3JlX3JlZ2lzdGVycyAoY29yZV9yZWdfc2VjdCwgY29yZV9yZWdfc2l6ZSwgd2hpY2gsIHJlZ19hZGRyKQorICAgICBjaGFyICpjb3JlX3JlZ19zZWN0OworICAgICB1bnNpZ25lZCBjb3JlX3JlZ19zaXplOworICAgICBpbnQgd2hpY2g7CisgICAgIENPUkVfQUREUiByZWdfYWRkcjsJLyogaWdub3JlZCAqLworeworCisgIGlmICh3aGljaCA9PSAwKQorICAgIHsKKyAgICAgIC8qIEludGVnZXIgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgY2RfcmVncyhuKSAoKGludCAqKWNvcmVfcmVnX3NlY3QpW25dCisjZGVmaW5lIHJlZ3MobikgKigoaW50ICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAobildKQorCisgICAgICBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBGUDBfUkVHTlVNOyBpKyspCisJcmVncyhpKSA9IGNkX3JlZ3MoY29yZV9yZWdtYXBbaV0pOworICAgIH0KKyAgZWxzZSBpZiAod2hpY2ggPT0gMikKKyAgICB7CisgICAgICAvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KKworICAgICAgaWYgKGNvcmVfcmVnX3NpemUgPj0gc2l6ZW9mIChjb3JlX2VudjM4NykpCisJbWVtY3B5ICgmY29yZV9lbnYzODcsIGNvcmVfcmVnX3NlY3QsIGNvcmVfcmVnX3NpemUpOworICAgICAgZWxzZQorCWZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIkNvdWxkbid0IHJlYWQgZmxvYXQgcmVncyBmcm9tIGNvcmUgZmlsZVxuIik7CisgICAgfQorfQorCisMCisvKiBSZWdpc3RlciB0aGF0IHdlIGFyZSBhYmxlIHRvIGhhbmRsZSBpMzg2YWl4IGNvcmUgZmlsZSBmb3JtYXRzLgorICAgRklYTUU6IGlzIHRoaXMgcmVhbGx5IGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyPyAqLworCitzdGF0aWMgc3RydWN0IGNvcmVfZm5zIGkzODZhaXhfY29yZV9mbnMgPQoreworICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKKyAgZmV0Y2hfY29yZV9yZWdpc3RlcnMsCisgIE5VTEwKK307CisKK3ZvaWQKK19pbml0aWFsaXplX2NvcmVfaTM4NmFpeCAoKQoreworICBhZGRfY29yZV9mbnMgKCZpMzg2YWl4X2NvcmVfZm5zKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9pMzg2Yi1uYXQuYyBiL2dkYi9pMzg2Yi1uYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzg0NzczCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2kzODZiLW5hdC5jCkBAIC0wLDAgKzEsMjg1IEBACisvKiBOYXRpdmUtZGVwZW5kZW50IGNvZGUgZm9yIEJTRCBVbml4IHJ1bm5pbmcgb24gaTM4NidzLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5ODgsIDE5ODksIDE5OTEsIDE5OTIsIDE5OTQsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKworI2lmZGVmIEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgorI2luY2x1ZGUgPG1hY2hpbmUvZnJhbWUuaD4KKyNpbmNsdWRlICJpbmZlcmlvci5oIgorCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgc3RydWN0IHJlZyBpbmZlcmlvcl9yZWdpc3RlcnM7CisKKyAgcHRyYWNlIChQVF9HRVRSRUdTLCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfcmVnaXN0ZXJzLCAwKTsKKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKDApXSwgJmluZmVyaW9yX3JlZ2lzdGVycywgNCpOVU1fUkVHUyk7CisgIHJlZ2lzdGVyc19mZXRjaGVkICgpOworfQorCit2b2lkCitzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgc3RydWN0IHJlZyBpbmZlcmlvcl9yZWdpc3RlcnM7CisKKyAgbWVtY3B5ICgmaW5mZXJpb3JfcmVnaXN0ZXJzLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKDApXSwgNCpOVU1fUkVHUyk7CisgIHB0cmFjZSAoUFRfU0VUUkVHUywgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgJmluZmVyaW9yX3JlZ2lzdGVycywgMCk7Cit9CisKK3N0cnVjdCBtZF9jb3JlIHsKKyAgc3RydWN0IHJlZyBpbnRyZWc7CisgIHN0cnVjdCBmcHJlZyBmcmVnOworfTsKKwordm9pZAorZmV0Y2hfY29yZV9yZWdpc3RlcnMgKGNvcmVfcmVnX3NlY3QsIGNvcmVfcmVnX3NpemUsIHdoaWNoLCBpZ25vcmUpCisgICAgIGNoYXIgKmNvcmVfcmVnX3NlY3Q7CisgICAgIHVuc2lnbmVkIGNvcmVfcmVnX3NpemU7CisgICAgIGludCB3aGljaDsKKyAgICAgQ09SRV9BRERSIGlnbm9yZTsKK3sKKyAgc3RydWN0IG1kX2NvcmUgKmNvcmVfcmVnID0gKHN0cnVjdCBtZF9jb3JlICopY29yZV9yZWdfc2VjdDsKKworICAvKiBpbnRlZ2VyIHJlZ2lzdGVycyAqLworICBtZW1jcHkoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFICgwKV0sICZjb3JlX3JlZy0+aW50cmVnLAorCSBzaXplb2Yoc3RydWN0IHJlZykpOworICAvKiBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KKyAgLyogWFhYICovCit9CisKKyNlbHNlCisKKyNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgorCisvKiB0aGlzIHRhYmxlIG11c3QgbGluZSB1cCB3aXRoIFJFR0lTVEVSX05BTUVTIGluIHRtLWkzODYuaCAqLworLyogc3ltYm9scyBsaWtlICd0RUFYJyBjb21lIGZyb20gPG1hY2hpbmUvcmVnLmg+ICovCitzdGF0aWMgaW50IHRyZWdtYXBbXSA9IAoreworICB0RUFYLCB0RUNYLCB0RURYLCB0RUJYLAorICB0RVNQLCB0RUJQLCB0RVNJLCB0RURJLAorICB0RUlQLCB0RUZMQUdTLCB0Q1MsIHRTUworfTsKKworI2lmZGVmIHNFQVgKK3N0YXRpYyBpbnQgc3JlZ21hcFtdID0gCit7CisgIHNFQVgsIHNFQ1gsIHNFRFgsIHNFQlgsCisgIHNFU1AsIHNFQlAsIHNFU0ksIHNFREksCisgIHNFSVAsIHNFRkxBR1MsIHNDUywgc1NTCit9OworI2Vsc2UgLyogTm8gc0VBWCAqLworCisvKiBGcmVlQlNEIGhhcyBkZWNpZGVkIHRvIGNvbGxhcHNlIHRoZSBzKiBhbmQgdCogc3ltYm9scy4gIFNvIGlmIHRoZSBzKgorICAgb25lcyBhcmVuJ3QgYXJvdW5kLCB1c2UgdGhlIHQqIG9uZXMgZm9yIHNyZWdtYXAgdG9vLiAgKi8KKworc3RhdGljIGludCBzcmVnbWFwW10gPSAKK3sKKyAgdEVBWCwgdEVDWCwgdEVEWCwgdEVCWCwKKyAgdEVTUCwgdEVCUCwgdEVTSSwgdEVESSwKKyAgdEVJUCwgdEVGTEFHUywgdENTLCB0U1MKK307CisjZW5kaWYgLyogTm8gc0VBWCAqLworCisvKiBibG9ja2VuZCBpcyB0aGUgdmFsdWUgb2YgdS51X2FyMCwgYW5kIHBvaW50cyB0byB0aGUKKyAgIHBsYWNlIHdoZXJlIEVTIGlzIHN0b3JlZC4gICovCisKK2ludAoraTM4Nl9yZWdpc3Rlcl91X2FkZHIgKGJsb2NrZW5kLCByZWdudW0pCisgICAgIGludCBibG9ja2VuZDsKKyAgICAgaW50IHJlZ251bTsKK3sKKyAgLyogVGhlIGZvbGxvd2luZyBjb25kaXRpb24gaXMgYSBrbHVkZ2UgdG8gZ2V0IGF0IHRoZSBwcm9wZXIgcmVnaXN0ZXIgbWFwCisgICAgIGRlcGVuZGluZyB1cG9uIHRoZSBzdGF0ZSBvZiBwY2JfZmxhZy4KKyAgICAgVGhlIHByb3BlciBjb25kaXRpb24gd291bGQgYmUKKyAgICAgaWYgKHUudV9wY2IucGNiX2ZsYWcgJiBGTV9UUkFQKQorICAgICBidXQgdGhhdCB3b3VsZCByZXF1aXJlIGEgcHRyYWNlIGNhbGwgaGVyZSBhbmQgd291bGRuJ3Qgd29yaworICAgICBmb3IgY29yZWZpbGVzLiAgKi8KKworICBpZiAoYmxvY2tlbmQgPCAweDFmY2MpCisgICAgcmV0dXJuIChibG9ja2VuZCArIDQgKiB0cmVnbWFwW3JlZ251bV0pOworICBlbHNlCisgICAgcmV0dXJuIChibG9ja2VuZCArIDQgKiBzcmVnbWFwW3JlZ251bV0pOworfQorCisjZW5kaWYgLyogIUZFVENIX0lORkVSSU9SX1JFR0lTVEVSUyAqLworCisjaWZkZWYgRkxPQVRfSU5GTworI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgkJCS8qIGZvciBsb2NhbF9oZXhfc3RyaW5nICovCisjaW5jbHVkZSAiZmxvYXRmb3JtYXQuaCIKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9kaXIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8YS5vdXQuaD4KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2RlZmluZSBjdXJwY2IgWGN1cnBjYgkvKiBYWFggYXZvaWQgbGVha2luZyBkZWNsYXJhdGlvbiBmcm9tIHBjYi5oICovCisjaW5jbHVkZSA8c3lzL3VzZXIuaD4KKyN1bmRlZiBjdXJwY2IKKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgImdkYl9zdGF0LmgiCisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorCitleHRlcm4gdm9pZCBwcmludF8zODdfY29udHJvbF93b3JkICgpOwkJLyogaTM4Ny10ZGVwLmggKi8KK2V4dGVybiB2b2lkIHByaW50XzM4N19zdGF0dXNfd29yZCAoKTsKKworI2RlZmluZQlmcHN0YXRlCQlzYXZlODcKKyNkZWZpbmUJVV9GUFNUQVRFKHUpCXUudV9wY2IucGNiX3NhdmVmcHUKKworc3RydWN0IGVudjM4NyAKK3sKKyAgdW5zaWduZWQgc2hvcnQgY29udHJvbDsKKyAgdW5zaWduZWQgc2hvcnQgcjA7CisgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQgcjE7CisgIHVuc2lnbmVkIHNob3J0IHRhZzsKKyAgdW5zaWduZWQgc2hvcnQgcjI7CisgIHVuc2lnbmVkIGxvbmcgZWlwOworICB1bnNpZ25lZCBzaG9ydCBjb2RlX3NlZzsKKyAgdW5zaWduZWQgc2hvcnQgb3Bjb2RlOworICB1bnNpZ25lZCBsb25nIG9wZXJhbmQ7CisgIHVuc2lnbmVkIHNob3J0IG9wZXJhbmRfc2VnOworICB1bnNpZ25lZCBzaG9ydCByMzsKKyAgdW5zaWduZWQgY2hhciByZWdzWzhdWzEwXTsKK307CisKK3N0YXRpYyB2b2lkCitwcmludF8zODdfc3RhdHVzIChzdGF0dXMsIGVwKQorICAgICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisgICAgIHN0cnVjdCBlbnYzODcgKmVwOworeworICBpbnQgaTsKKyAgaW50IGJvdGhzdGF0dXM7CisgIGludCB0b3A7CisgIGludCBmcHJlZzsKKyAgCisgIGJvdGhzdGF0dXMgPSAoKHN0YXR1cyAhPSAwKSAmJiAoZXAtPnN0YXR1cyAhPSAwKSk7CisgIGlmIChzdGF0dXMgIT0gMCkgCisgICAgeworICAgICAgaWYgKGJvdGhzdGF0dXMpCisJcHJpbnRmX3VuZmlsdGVyZWQgKCJ1OiAiKTsKKyAgICAgIHByaW50XzM4N19zdGF0dXNfd29yZCAoKHVuc2lnbmVkIGludClzdGF0dXMpOworICAgIH0KKyAgCisgIGlmIChlcC0+c3RhdHVzICE9IDApIAorICAgIHsKKyAgICAgIGlmIChib3Roc3RhdHVzKQorCXByaW50Zl91bmZpbHRlcmVkICgiZTogIik7CisgICAgICBwcmludF8zODdfc3RhdHVzX3dvcmQgKCh1bnNpZ25lZCBpbnQpZXAtPnN0YXR1cyk7CisgICAgfQorICAKKyAgcHJpbnRfMzg3X2NvbnRyb2xfd29yZCAoKHVuc2lnbmVkIGludCllcC0+Y29udHJvbCk7CisgIHByaW50Zl91bmZpbHRlcmVkICgibGFzdCBleGNlcHRpb246ICIpOworICBwcmludGZfdW5maWx0ZXJlZCAoIm9wY29kZSAlczsgIiwgbG9jYWxfaGV4X3N0cmluZyhlcC0+b3Bjb2RlKSk7CisgIHByaW50Zl91bmZpbHRlcmVkICgicGMgJXM6IiwgbG9jYWxfaGV4X3N0cmluZyhlcC0+Y29kZV9zZWcpKTsKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlczsgIiwgbG9jYWxfaGV4X3N0cmluZyhlcC0+ZWlwKSk7CisgIHByaW50Zl91bmZpbHRlcmVkICgib3BlcmFuZCAlcyIsIGxvY2FsX2hleF9zdHJpbmcoZXAtPm9wZXJhbmRfc2VnKSk7CisgIHByaW50Zl91bmZpbHRlcmVkICgiOiVzXG4iLCBsb2NhbF9oZXhfc3RyaW5nKGVwLT5vcGVyYW5kKSk7CisKKyAgdG9wID0gKGVwLT5zdGF0dXMgPj4gMTEpICYgNzsKKyAgCisgIHByaW50Zl91bmZpbHRlcmVkICgicmVnbm8gICAgIHRhZyAgbXNiICAgICAgICAgICAgICBsc2IgIHZhbHVlXG4iKTsKKyAgZm9yIChmcHJlZyA9IDc7IGZwcmVnID49IDA7IGZwcmVnLS0pIAorICAgIHsKKyAgICAgIGRvdWJsZSB2YWw7CisgICAgICAKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiJXMgJWQ6ICIsIGZwcmVnID09IHRvcCA/ICI9PiIgOiAiICAiLCBmcHJlZyk7IAorCisgICAgICBzd2l0Y2ggKChlcC0+dGFnID4+IChmcHJlZyAqIDIpKSAmIDMpIAorCXsKKwljYXNlIDA6IHByaW50Zl91bmZpbHRlcmVkICgidmFsaWQgIik7IGJyZWFrOworCWNhc2UgMTogcHJpbnRmX3VuZmlsdGVyZWQgKCJ6ZXJvICAiKTsgYnJlYWs7CisJY2FzZSAyOiBwcmludGZfdW5maWx0ZXJlZCAoInRyYXAgICIpOyBicmVhazsKKwljYXNlIDM6IHByaW50Zl91bmZpbHRlcmVkICgiZW1wdHkgIik7IGJyZWFrOworCX0KKyAgICAgIGZvciAoaSA9IDk7IGkgPj0gMDsgaS0tKQorCXByaW50Zl91bmZpbHRlcmVkICgiJTAyeCIsIGVwLT5yZWdzW2ZwcmVnXVtpXSk7CisgICAgICAKKyAgICAgIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSgmZmxvYXRmb3JtYXRfaTM4N19leHQsIChjaGFyICopIGVwLT5yZWdzW2ZwcmVnXSwgCisJCQkgICAgICAmdmFsKTsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiICAlZ1xuIiwgdmFsKTsKKyAgICB9Cit9CisKK2kzODZfZmxvYXRfaW5mbyAoKQoreworICBzdHJ1Y3QgdXNlciB1OyAvKiBqdXN0IGZvciBhZGRyZXNzIGNvbXB1dGF0aW9ucyAqLworICBpbnQgaTsKKyAgLyogZnBzdGF0ZSBkZWZpbmVkIGluIDxzeXMvdXNlci5oPiAqLworICBzdHJ1Y3QgZnBzdGF0ZSAqZnBzdGF0ZXA7CisgIGNoYXIgYnVmW3NpemVvZiAoc3RydWN0IGZwc3RhdGUpICsgMiAqIHNpemVvZiAoaW50KV07CisgIHVuc2lnbmVkIGludCB1YWRkcjsKKyAgY2hhciBmcHZhbGlkOworICB1bnNpZ25lZCBpbnQgcm91bmRlZF9hZGRyOworICB1bnNpZ25lZCBpbnQgcm91bmRlZF9zaXplOworICAvKmV4dGVybiBpbnQgY29yZWNoYW47Ki8KKyAgaW50IHNraXA7CisgIGV4dGVybiBpbnQgaW5mZXJpb3JfcGlkOworICAKKyAgdWFkZHIgPSAoY2hhciAqKSZVX0ZQU1RBVEUodSkgLSAoY2hhciAqKSZ1OworICBpZiAoaW5mZXJpb3JfcGlkKSAKKyAgICB7CisgICAgICBpbnQgKmlwOworICAgICAgCisgICAgICByb3VuZGVkX2FkZHIgPSB1YWRkciAmIC1zaXplb2YgKGludCk7CisgICAgICByb3VuZGVkX3NpemUgPSAoKCh1YWRkciArIHNpemVvZiAoc3RydWN0IGZwc3RhdGUpKSAtIHVhZGRyKSArCisJCSAgICAgIHNpemVvZiAoaW50KSAtIDEpIC8gc2l6ZW9mIChpbnQpOworICAgICAgc2tpcCA9IHVhZGRyIC0gcm91bmRlZF9hZGRyOworICAgICAgCisgICAgICBpcCA9IChpbnQgKilidWY7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcm91bmRlZF9zaXplOyBpKyspIAorCXsKKwkgICppcCsrID0gcHRyYWNlIChQVF9SRUFEX1UsIGluZmVyaW9yX3BpZCwgKGNhZGRyX3Qpcm91bmRlZF9hZGRyLCAwKTsKKwkgIHJvdW5kZWRfYWRkciArPSBzaXplb2YgKGludCk7CisJfQorICAgIH0gCisgIGVsc2UgCisgICAgeworICAgICAgcHJpbnRmKCJmbG9hdCBpbmZvOiBjYW4ndCBkbyBhIGNvcmUgZmlsZSAoeWV0KVxuIik7CisgICAgICByZXR1cm47CisjaWYgMAorICAgICAgaWYgKGxzZWVrIChjb3JlY2hhbiwgdWFkZHIsIDApIDwgMCkKKwlwZXJyb3Jfd2l0aF9uYW1lICgic2VlayBvbiBjb3JlIGZpbGUiKTsKKyAgICAgIGlmIChteXJlYWQgKGNvcmVjaGFuLCBidWYsIHNpemVvZiAoc3RydWN0IGZwc3RhdGUpKSA8IDApIAorCXBlcnJvcl93aXRoX25hbWUgKCJyZWFkIGZyb20gY29yZSBmaWxlIik7CisgICAgICBza2lwID0gMDsKKyNlbmRpZgorICAgIH0KKyAgCisgIHByaW50XzM4N19zdGF0dXMgKDAsIChzdHJ1Y3QgZW52Mzg3ICopYnVmKTsKK30KKworaW50CitrZXJuZWxfdV9zaXplICgpCit7CisgIHJldHVybiAoc2l6ZW9mIChzdHJ1Y3QgdXNlcikpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dkYi9pMzg2Z251LW5hdC5jIGIvZ2RiL2kzODZnbnUtbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkOTJjMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9pMzg2Z251LW5hdC5jCkBAIC0wLDAgKzEsMzU3IEBACisvKiBMb3cgbGV2ZWwgaW50ZXJmYWNlIHRvIEkzODYgcnVubmluZyB0aGUgR05VIEh1cmQKKyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiZmxvYXRmb3JtYXQuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG1hY2guaD4KKyNpbmNsdWRlIDxtYWNoL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtYWNoL2V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPG1hY2hfZXJyb3IuaD4KKworI2luY2x1ZGUgImdudS1uYXQuaCIKKworLyogSG1tbS4uLiBTaG91bGQgdGhpcyBub3QgYmUgaGVyZT8KKyAqIE5vdyBmb3IgaTM4Nl9mbG9hdF9pbmZvKCkgdGFyZ2V0X2hhc19leGVjdXRpb24KKyAqLworI2luY2x1ZGUgPHRhcmdldC5oPgorCisvKiBAQEAgU2hvdWxkIG1vdmUgcHJpbnRfMzg3X3N0YXR1cygpIHRvIGkzODctdGRlcC5jICovCitleHRlcm4gdm9pZCBwcmludF8zODdfY29udHJvbF93b3JkICgpOwkJLyogaTM4Ny10ZGVwLmggKi8KK2V4dGVybiB2b2lkIHByaW50XzM4N19zdGF0dXNfd29yZCAoKTsKKwwKKy8qIEZpbmQgb2Zmc2V0cyB0byB0aHJlYWQgc3RhdGVzIGF0IGNvbXBpbGUgdGltZS4KKyAqIElmIHlvdXIgY29tcGlsZXIgZG9lcyBub3QgZ3JvayB0aGlzLCBjYWxjdWxhdGUgb2Zmc2V0cworICogb2Zmc2V0cyB5b3Vyc2VsZiBhbmQgdXNlIHRoZW0gKG9yIGdldCBhIGNvbXBhdGlibGUgY29tcGlsZXIgOi0pCisgKi8KKworI2RlZmluZSAgUkVHX09GRlNFVChyZWcpIChpbnQpKCYoKHN0cnVjdCBpMzg2X3RocmVhZF9zdGF0ZSAqKTApLT5yZWcpCisKKy8qIGF0IHJlZ19vZmZzZXRbaV0gaXMgdGhlIG9mZnNldCB0byB0aGUgaTM4Nl90aHJlYWRfc3RhdGUKKyAqIGxvY2F0aW9uIHdoZXJlIHRoZSBnZGIgcmVnaXN0ZXJzW2ldIGlzIHN0b3JlZC4KKyAqLworCitzdGF0aWMgaW50IHJlZ19vZmZzZXRbXSA9IAoreworICBSRUdfT0ZGU0VUKGVheCksICBSRUdfT0ZGU0VUKGVjeCksIFJFR19PRkZTRVQoZWR4KSwgUkVHX09GRlNFVChlYngpLAorICBSRUdfT0ZGU0VUKHVlc3ApLCBSRUdfT0ZGU0VUKGVicCksIFJFR19PRkZTRVQoZXNpKSwgUkVHX09GRlNFVChlZGkpLAorICBSRUdfT0ZGU0VUKGVpcCksICBSRUdfT0ZGU0VUKGVmbCksIFJFR19PRkZTRVQoY3MpLCAgUkVHX09GRlNFVChzcyksCisgIFJFR19PRkZTRVQoZHMpLCAgIFJFR19PRkZTRVQoZXMpLCAgUkVHX09GRlNFVChmcyksICBSRUdfT0ZGU0VUKGdzKQorfTsKKworI2RlZmluZSBSRUdfQUREUihzdGF0ZSxyZWdudW0pICgoY2hhciAqKShzdGF0ZSkrcmVnX29mZnNldFtyZWdudW1dKQorCisvKiBGZXRjaCBDT1VOVCBjb250aWd1b3VzIHJlZ2lzdGVycyBmcm9tIHRocmVhZCBTVEFURSBzdGFydGluZyBmcm9tIFJFR05VTQorICogQ2FsbGVyIGtub3dzIHRoYXQgdGhlIHJlZ3MgaGFuZGxlZCBpbiBvbmUgdHJhbnNhY3Rpb24gYXJlIG9mIHNhbWUgc2l6ZS4KKyAqLworI2RlZmluZSBGRVRDSF9SRUdTKHN0YXRlLCByZWdudW0sIGNvdW50KSBcCisgIG1lbWNweSAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdudW0pXSwgXAorCSAgUkVHX0FERFIgKHN0YXRlLCByZWdudW0pLCBcCisJICBjb3VudCAqIFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pKQorCisvKiBTdG9yZSBDT1VOVCBjb250aWd1b3VzIHJlZ2lzdGVycyB0byB0aHJlYWQgU1RBVEUgc3RhcnRpbmcgZnJvbSBSRUdOVU0gKi8KKyNkZWZpbmUgU1RPUkVfUkVHUyhzdGF0ZSwgcmVnbnVtLCBjb3VudCkgXAorICBtZW1jcHkgKFJFR19BRERSIChzdGF0ZSwgcmVnbnVtKSwgXAorCSAgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdudW0pXSwgXAorCSAgY291bnQgKiBSRUdJU1RFUl9SQVdfU0laRSAocmVnbnVtKSkKKwwKKy8qCisgKiBGZXRjaCBpbmZlcmlvcnMgcmVnaXN0ZXJzIGZvciBnZGIuCisgKiBSRUcgc3BlY2lmaWVzIHdoaWNoIChhcyBnZGIgdmlld3MgaXQpIHJlZ2lzdGVyLCAtMSBmb3IgYWxsLgorICovCit2b2lkCitnbnVfZmV0Y2hfcmVnaXN0ZXJzIChpbnQgcmVnKQoreworICBzdHJ1Y3QgcHJvYyAqdGhyZWFkOworICB0aHJlYWRfc3RhdGVfdCBzdGF0ZTsKKyAgCisgIGluZl91cGRhdGVfcHJvY3MgKGN1cnJlbnRfaW5mZXJpb3IpOyAvKiBNYWtlIHN1cmUgd2Uga25vdyBhYm91dCBuZXcgdGhyZWFkcy4gICovCisKKyAgdGhyZWFkID0gaW5mX3RpZF90b190aHJlYWQgKGN1cnJlbnRfaW5mZXJpb3IsIGluZmVyaW9yX3BpZCk7CisgIGlmICghIHRocmVhZCkKKyAgICBlcnJvciAoImZldGNoIGluZmVyaW9yIHJlZ2lzdGVyczogJWQ6IEludmFsaWQgdGhyZWFkIiwgaW5mZXJpb3JfcGlkKTsKKworICBzdGF0ZSA9IHByb2NfZ2V0X3N0YXRlICh0aHJlYWQsIDApOworCisgIGlmICghIHN0YXRlKQorICAgIHdhcm5pbmcgKCJDb3VsZG4ndCBmZXRjaCByZWdpc3RlciAlcyBmcm9tICVzIChpbnZhbGlkIHRocmVhZCkuIiwKKwkgICAgIFJFR0lTVEVSX05BTUUgKHJlZyksIHByb2Nfc3RyaW5nICh0aHJlYWQpKTsKKyAgZWxzZSBpZiAocmVnID49IDApCisgICAgeworICAgICAgcHJvY19kZWJ1ZyAodGhyZWFkLCAiZmV0Y2hpbmcgcmVnaXN0ZXI6ICVzIiwgUkVHSVNURVJfTkFNRSAocmVnKSk7CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZywgUkVHX0FERFIoc3RhdGUsIHJlZykpOworICAgICAgdGhyZWFkLT5mZXRjaGVkX3JlZ3MgfD0gKDEgPDwgcmVnKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcm9jX2RlYnVnICh0aHJlYWQsICJmZXRjaGluZyBhbGwgcmVnaXN0ZXJzIik7CisgICAgICBmb3IgKHJlZyA9IDA7IHJlZyA8IE5VTV9SRUdTOyByZWcrKykgCisJc3VwcGx5X3JlZ2lzdGVyIChyZWcsIFJFR19BRERSKHN0YXRlLCByZWcpKTsKKyAgICAgIHRocmVhZC0+ZmV0Y2hlZF9yZWdzID0gfjA7CisgICAgfQorfQorDAorLyogU3RvcmUgb3VyIHJlZ2lzdGVyIHZhbHVlcyBiYWNrIGludG8gdGhlIGluZmVyaW9yLgorICogSWYgUkVHIGlzIC0xLCBkbyB0aGlzIGZvciBhbGwgcmVnaXN0ZXJzLgorICogT3RoZXJ3aXNlLCBSRUcgc3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVyCisgKgorICogT24gbWFjaDMgYWxsIHJlZ2lzdGVycyBhcmUgYWx3YXlzIHNhdmVkIGluIG9uZSBjYWxsLgorICovCit2b2lkCitnbnVfc3RvcmVfcmVnaXN0ZXJzIChyZWcpCisgICAgIGludCByZWc7Cit7CisgIHN0cnVjdCBwcm9jICp0aHJlYWQ7CisgIGludCB3YXNfYWJvcnRlZCwgd2FzX3ZhbGlkOworICB0aHJlYWRfc3RhdGVfdCBzdGF0ZTsKKyAgdGhyZWFkX3N0YXRlX2RhdGFfdCBvbGRfc3RhdGU7CisgIAorICBpbmZfdXBkYXRlX3Byb2NzIChjdXJyZW50X2luZmVyaW9yKTsgLyogTWFrZSBzdXJlIHdlIGtub3cgYWJvdXQgbmV3IHRocmVhZHMuICAqLworCisgIHRocmVhZCA9IGluZl90aWRfdG9fdGhyZWFkIChjdXJyZW50X2luZmVyaW9yLCBpbmZlcmlvcl9waWQpOworICBpZiAoISB0aHJlYWQpCisgICAgZXJyb3IgKCJzdG9yZSBpbmZlcmlvciByZWdpc3RlcnM6ICVkOiBJbnZhbGlkIHRocmVhZCIsIGluZmVyaW9yX3BpZCk7CisKKyAgcHJvY19kZWJ1ZyAodGhyZWFkLCAic3RvcmluZyByZWdpc3RlciAlcy4iLCBSRUdJU1RFUl9OQU1FIChyZWcpKTsKKworICB3YXNfYWJvcnRlZCA9IHRocmVhZC0+YWJvcnRlZDsKKyAgd2FzX3ZhbGlkID0gdGhyZWFkLT5zdGF0ZV92YWxpZDsKKyAgaWYgKCEgd2FzX2Fib3J0ZWQgJiYgd2FzX3ZhbGlkKQorICAgIGJjb3B5ICgmdGhyZWFkLT5zdGF0ZSwgJm9sZF9zdGF0ZSwgc2l6ZW9mIChvbGRfc3RhdGUpKTsKKworICBzdGF0ZSA9IHByb2NfZ2V0X3N0YXRlICh0aHJlYWQsIDEpOworCisgIGlmICghIHN0YXRlKQorICAgIHdhcm5pbmcgKCJDb3VsZG4ndCBzdG9yZSByZWdpc3RlciAlcyBmcm9tICVzIChpbnZhbGlkIHRocmVhZCkuIiwKKwkgICAgIFJFR0lTVEVSX05BTUUgKHJlZyksIHByb2Nfc3RyaW5nICh0aHJlYWQpKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghIHdhc19hYm9ydGVkICYmIHdhc192YWxpZCkKKwkvKiBTZWUgd2hpY2ggcmVnaXN0ZXJzIGhhdmUgY2hhbmdlZCBhZnRlciBhYm9ydGluZyB0aGUgdGhyZWFkLiAgKi8KKwl7CisJICBpbnQgY2hlY2tfcmVnOworCSAgZm9yIChjaGVja19yZWcgPSAwOyBjaGVja19yZWcgPCBOVU1fUkVHUzsgY2hlY2tfcmVnKyspCisJICAgIGlmICgodGhyZWFkLT5mZXRjaGVkX3JlZ3MgJiAoMSA8PCBjaGVja19yZWcpKQorCQkmJiBiY21wIChSRUdfQUREUiAoJm9sZF9zdGF0ZSwgY2hlY2tfcmVnKSwKKwkJCSBSRUdfQUREUiAoc3RhdGUsIGNoZWNrX3JlZyksCisJCQkgUkVHSVNURVJfUkFXX1NJWkUgKGNoZWNrX3JlZykpKQorCSAgICAgIC8qIFJlZ2lzdGVyIENIRUNLX1JFRyBoYXMgY2hhbmdlZCEgIEFjayEgICovCisJICAgICAgeworCQl3YXJuaW5nICgiUmVnaXN0ZXIgJXMgY2hhbmdlZCBhZnRlciB0aHJlYWQgd2FzIGFib3J0ZWQuIiwKKwkJCSBSRUdJU1RFUl9OQU1FIChjaGVja19yZWcpKTsKKwkJaWYgKHJlZyA+PSAwICYmIHJlZyAhPSBjaGVja19yZWcpCisJCSAgLyogVXBkYXRlIGdkYidzIGNvcHkgb2YgdGhlIHJlZ2lzdGVyLiAgKi8KKwkJICBzdXBwbHlfcmVnaXN0ZXIgKGNoZWNrX3JlZywgUkVHX0FERFIgKHN0YXRlLCBjaGVja19yZWcpKTsKKwkJZWxzZQorCQkgIHdhcm5pbmcgKCIuLi4gYWxzbyB3cml0aW5nIHRoaXMgcmVnaXN0ZXIhICBTdXNwaWNpb3VzLi4uIik7CisJICAgICAgfQorCX0KKworICAgICAgaWYgKHJlZyA+PSAwKQorCXsKKwkgIHByb2NfZGVidWcgKHRocmVhZCwgInN0b3JpbmcgcmVnaXN0ZXI6ICVzIiwgUkVHSVNURVJfTkFNRSAocmVnKSk7CisJICBTVE9SRV9SRUdTIChzdGF0ZSwgcmVnLCAxKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcHJvY19kZWJ1ZyAodGhyZWFkLCAic3RvcmluZyBhbGwgcmVnaXN0ZXJzIik7CisJICBmb3IgKHJlZyA9IDA7IHJlZyA8IE5VTV9SRUdTOyByZWcrKykgCisJICAgIFNUT1JFX1JFR1MgKHN0YXRlLCByZWcsIDEpOworCX0KKyAgICB9Cit9CisMCisvKiBqdHZAaHV0LmZpOiBJIGNvcGllZCBhbmQgbW9kaWZpZWQgdGhpcyAzODcgY29kZSBmcm9tCisgKiBnZGIvaTM4Ni14ZGVwLmMuIE1vZGlmaWNhdGlvbnMgZm9yIE1hY2ggMy4wLgorICoKKyAqIGkzODcgc3RhdHVzIGR1bXBlci4gU2VlIGFsc28gaTM4Ny10ZGVwLmMKKyAqLworc3RydWN0IGVudjM4NyAKK3sKKyAgdW5zaWduZWQgc2hvcnQgY29udHJvbDsKKyAgdW5zaWduZWQgc2hvcnQgcjA7CisgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQgcjE7CisgIHVuc2lnbmVkIHNob3J0IHRhZzsKKyAgdW5zaWduZWQgc2hvcnQgcjI7CisgIHVuc2lnbmVkIGxvbmcgZWlwOworICB1bnNpZ25lZCBzaG9ydCBjb2RlX3NlZzsKKyAgdW5zaWduZWQgc2hvcnQgb3Bjb2RlOworICB1bnNpZ25lZCBsb25nIG9wZXJhbmQ7CisgIHVuc2lnbmVkIHNob3J0IG9wZXJhbmRfc2VnOworICB1bnNpZ25lZCBzaG9ydCByMzsKKyAgdW5zaWduZWQgY2hhciByZWdzWzhdWzEwXTsKK307CisvKiBUaGlzIHJvdXRpbmUgaXMgbWFjaGluZSBpbmRlcGVuZGVudD8KKyAqIFNob3VsZCBtb3ZlIGl0IHRvIGkzODctdGRlcC5jIGJ1dCB5b3UgbmVlZCB0byBleHBvcnQgc3RydWN0IGVudjM4NworICovCitzdGF0aWMKK3ByaW50XzM4N19zdGF0dXMgKHN0YXR1cywgZXApCisgICAgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKKyAgICAgc3RydWN0IGVudjM4NyAqZXA7Cit7CisgIGludCBpOworICBpbnQgYm90aHN0YXR1czsKKyAgaW50IHRvcDsKKyAgaW50IGZwcmVnOworICB1bnNpZ25lZCBjaGFyICpwOworICAKKyAgYm90aHN0YXR1cyA9ICgoc3RhdHVzICE9IDApICYmIChlcC0+c3RhdHVzICE9IDApKTsKKyAgaWYgKHN0YXR1cyAhPSAwKSAKKyAgICB7CisgICAgICBpZiAoYm90aHN0YXR1cykKKwlwcmludGZfdW5maWx0ZXJlZCAoInU6ICIpOworICAgICAgcHJpbnRfMzg3X3N0YXR1c193b3JkIChzdGF0dXMpOworICAgIH0KKyAgCisgIGlmIChlcC0+c3RhdHVzICE9IDApIAorICAgIHsKKyAgICAgIGlmIChib3Roc3RhdHVzKQorCXByaW50Zl91bmZpbHRlcmVkICgiZTogIik7CisgICAgICBwcmludF8zODdfc3RhdHVzX3dvcmQgKGVwLT5zdGF0dXMpOworICAgIH0KKyAgCisgIHByaW50XzM4N19jb250cm9sX3dvcmQgKGVwLT5jb250cm9sKTsKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJsYXN0IGV4Y2VwdGlvbjogIik7CisgIHByaW50Zl91bmZpbHRlcmVkICgib3Bjb2RlICVzOyAiLCBsb2NhbF9oZXhfc3RyaW5nKGVwLT5vcGNvZGUpKTsKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJwYyAlczoiLCBsb2NhbF9oZXhfc3RyaW5nKGVwLT5jb2RlX3NlZykpOworICBwcmludGZfdW5maWx0ZXJlZCAoIiVzOyAiLCBsb2NhbF9oZXhfc3RyaW5nKGVwLT5laXApKTsKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJvcGVyYW5kICVzIiwgbG9jYWxfaGV4X3N0cmluZyhlcC0+b3BlcmFuZF9zZWcpKTsKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCI6JXNcbiIsIGxvY2FsX2hleF9zdHJpbmcoZXAtPm9wZXJhbmQpKTsKKyAgCisgIHRvcCA9IChlcC0+c3RhdHVzID4+IDExKSAmIDc7CisgIAorICBwcmludGZfdW5maWx0ZXJlZCAoInJlZ25vICB0YWcgIG1zYiAgICAgICAgICAgICAgbHNiICB2YWx1ZVxuIik7CisgIGZvciAoZnByZWcgPSA3OyBmcHJlZyA+PSAwOyBmcHJlZy0tKSAKKyAgICB7CisgICAgICBkb3VibGUgdmFsOworICAgICAgCisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIiVzICVkOiAiLCBmcHJlZyA9PSB0b3AgPyAiPT4iIDogIiAgIiwgZnByZWcpOworICAgICAgCisgICAgICBzd2l0Y2ggKChlcC0+dGFnID4+IChmcHJlZyAqIDIpKSAmIDMpIAorCXsKKwljYXNlIDA6IHByaW50Zl91bmZpbHRlcmVkICgidmFsaWQgIik7IGJyZWFrOworCWNhc2UgMTogcHJpbnRmX3VuZmlsdGVyZWQgKCJ6ZXJvICAiKTsgYnJlYWs7CisJY2FzZSAyOiBwcmludGZfdW5maWx0ZXJlZCAoInRyYXAgICIpOyBicmVhazsKKwljYXNlIDM6IHByaW50Zl91bmZpbHRlcmVkICgiZW1wdHkgIik7IGJyZWFrOworCX0KKyAgICAgIGZvciAoaSA9IDk7IGkgPj0gMDsgaS0tKQorCXByaW50Zl91bmZpbHRlcmVkICgiJTAyeCIsIGVwLT5yZWdzW2ZwcmVnXVtpXSk7CisgICAgICAKKyAgICAgIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X2kzODdfZXh0LCAoY2hhciAqKWVwLT5yZWdzW2ZwcmVnXSwKKwkJCSAgICAgICAmdmFsKTsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiICAlZ1xuIiwgdmFsKTsKKyAgICB9CisgIGlmIChlcC0+cjApCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJ3YXJuaW5nOiByZXNlcnZlZDAgaXMgJXNcbiIsIGxvY2FsX2hleF9zdHJpbmcoZXAtPnIwKSk7CisgIGlmIChlcC0+cjEpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJ3YXJuaW5nOiByZXNlcnZlZDEgaXMgJXNcbiIsIGxvY2FsX2hleF9zdHJpbmcoZXAtPnIxKSk7CisgIGlmIChlcC0+cjIpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJ3YXJuaW5nOiByZXNlcnZlZDIgaXMgJXNcbiIsIGxvY2FsX2hleF9zdHJpbmcoZXAtPnIyKSk7CisgIGlmIChlcC0+cjMpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJ3YXJuaW5nOiByZXNlcnZlZDMgaXMgJXNcbiIsIGxvY2FsX2hleF9zdHJpbmcoZXAtPnIzKSk7Cit9CisJCisvKgorICogdmFsdWVzIHRoYXQgZ28gaW50byBmcF9raW5kIChmcm9tIDxpMzg2L2ZwcmVnLmg+KQorICovCisjZGVmaW5lIEZQX05PICAgMCAgICAgICAvKiBubyBmcCBjaGlwLCBubyBlbXVsYXRvciAobm8gZnAgc3VwcG9ydCkgICAgICAqLworI2RlZmluZSBGUF9TVyAgIDEgICAgICAgLyogbm8gZnAgY2hpcCwgdXNpbmcgc29mdHdhcmUgZW11bGF0b3IgICAgICAgICAgKi8KKyNkZWZpbmUgRlBfSFcgICAyICAgICAgIC8qIGNoaXAgcHJlc2VudCBiaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZQXzI4NyAgMiAgICAgICAvKiA4MDI4NyBjaGlwIHByZXNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGUF8zODcgIDMgICAgICAgLyogODAzODcgY2hpcCBwcmVzZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZnBzdGF0ZSB7CisjaWYgMQorICB1bnNpZ25lZCBjaGFyCXN0YXRlW0ZQX1NUQVRFX0JZVEVTXTsgLyogImhhcmR3YXJlIiBzdGF0ZSAqLworI2Vsc2UKKyAgc3RydWN0IGVudjM4NwlzdGF0ZTsJLyogQWN0dWFsbHkgdGhpcyAqLworI2VuZGlmCisgIGludCBzdGF0dXM7CQkvKiBEdXBsaWNhdGUgc3RhdHVzICovCit9ICpmcHN0YXRlX3Q7CisKKy8qIE1hY2ggMyBzcGVjaWZpYyByb3V0aW5lcy4KKyAqLworc3RhdGljIGludAorZ2V0X2kzODdfc3RhdGUgKGZzdGF0ZSkKKyAgICAgc3RydWN0IGZwc3RhdGUgKmZzdGF0ZTsKK3sKKyAgZXJyb3JfdCBlcnI7CisgIHRocmVhZF9zdGF0ZV9kYXRhX3Qgc3RhdGU7CisgIHVuc2lnbmVkIGludCBmc0NudCA9IGkzODZfRkxPQVRfU1RBVEVfQ09VTlQ7CisgIHN0cnVjdCBpMzg2X2Zsb2F0X3N0YXRlICpmc3A7CisgIHN0cnVjdCBwcm9jICp0aHJlYWQgPSBpbmZfdGlkX3RvX3RocmVhZCAoY3VycmVudF9pbmZlcmlvciwgaW5mZXJpb3JfcGlkKTsKKyAgCisgIGlmICghdGhyZWFkKQorICAgIGVycm9yICgiZ2V0X2kzODdfc3RhdGU6IEludmFsaWQgdGhyZWFkIik7CisKKyAgcHJvY19hYm9ydCAodGhyZWFkLCAwKTsJLyogTWFrZSBzdXJlIFRIUkVBRCdzIGluIGEgcmVhc29uYWJsZSBzdGF0ZS4gKi8KKworICBlcnIgPSB0aHJlYWRfZ2V0X3N0YXRlICh0aHJlYWQtPnBvcnQsIGkzODZfRkxPQVRfU1RBVEUsIHN0YXRlLCAmZnNDbnQpOworICBpZiAoZXJyKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJDYW4gbm90IGdldCBsaXZlIGZsb2F0aW5nIHBvaW50IHN0YXRlOiAlcyIsCisJICAgICAgIG1hY2hfZXJyb3Jfc3RyaW5nIChlcnIpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBmc3AgPSAoc3RydWN0IGkzODZfZmxvYXRfc3RhdGUgKilzdGF0ZTsKKyAgLyogVGhlIDM4NyBjaGlwIChhbHNvIDQ4NiBjb3VudHMpIG9yIGEgc29mdHdhcmUgZW11bGF0b3I/ICovCisgIGlmICghZnNwLT5pbml0aWFsaXplZCB8fCAoZnNwLT5mcGtpbmQgIT0gRlBfMzg3ICYmIGZzcC0+ZnBraW5kICE9IEZQX1NXKSkKKyAgICByZXR1cm4gMDsKKworICAvKiBDbGVhciB0aGUgdGFyZ2V0IHRoZW4gY29weSB0aHJlYWQncyBmbG9hdCBzdGF0ZSB0aGVyZS4KKyAgICAgTWFrZSBhIGNvcHkgb2YgdGhlIHN0YXR1cyB3b3JkLCBmb3Igc29tZSByZWFzb24/CisgICAqLworICBtZW1zZXQgKGZzdGF0ZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgZnBzdGF0ZSkpOworCisgIGZzdGF0ZS0+c3RhdHVzID0gZnNwLT5leGNfc3RhdHVzOworCisgIG1lbWNweSAoZnN0YXRlLT5zdGF0ZSwgKGNoYXIgKikmZnNwLT5od19zdGF0ZSwgRlBfU1RBVEVfQllURVMpOworCisgIHJldHVybiAxOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgYnkgImluZm8gZmxvYXQiIGNvbW1hbmQKKyAqLwordm9pZAoraTM4Nl9tYWNoM19mbG9hdF9pbmZvKCkKK3sKKyAgY2hhciBidWYgW3NpemVvZiAoc3RydWN0IGZwc3RhdGUpICsgMiAqIHNpemVvZiAoaW50KV07CisgIGludCB2YWxpZCA9IDA7CisgIGZwc3RhdGVfdCBmcHM7CisgIAorICBpZiAodGFyZ2V0X2hhc19leGVjdXRpb24pCisgICAgdmFsaWQgPSBnZXRfaTM4N19zdGF0ZSAoYnVmKTsKKworICBpZiAoIXZhbGlkKSAKKyAgICB7CisgICAgICB3YXJuaW5nICgibm8gZmxvYXRpbmcgcG9pbnQgc3RhdHVzIHNhdmVkIik7CisgICAgICByZXR1cm47CisgICAgfQorICAKKyAgZnBzID0gKGZwc3RhdGVfdCkgYnVmOworCisgIHByaW50XzM4N19zdGF0dXMgKGZwcy0+c3RhdHVzLCAoc3RydWN0IGVudjM4NyAqKWZwcy0+c3RhdGUpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2kzODZseS10ZGVwLmMgYi9nZGIvaTM4Nmx5LXRkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDFmNGVkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2kzODZseS10ZGVwLmMKQEAgLTAsMCArMSw0MyBAQAorLyogVGFyZ2V0LWRlcGVuZGVudCBjb2RlIGZvciBJbnRlbCAzODYgcnVubmluZyBMeW54T1MuCisgICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorCisvKiBSZXR1cm4gdGhlIFBDIG9mIHRoZSBjYWxsZXIgZnJvbSB0aGUgY2FsbCBmcmFtZS4gIEFzc3VtZXMgdGhlIHN1YnIgcHJvbG9ndWUKKyAgIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQsIGFuZCB0aGUgZnJhbWUgcG9pbnRlciBzZXR1cC4gIElmIHRoaXMgaXMgdGhlCisgICBvdXRlcm1vc3QgZnJhbWUsIHdlIGNoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4gYSBzeXN0ZW0gY2FsbCBieSBleGFtaW5pbmcgdGhlCisgICBwcmV2aW91cyBpbnN0cnVjdGlvbi4gIElmIHNvLCB0aGVuIHRoZSByZXR1cm4gUEMgaXMgYWN0dWFsbHkgYXQgU1ArNCBiZWNhdXNlCisgICBzeXN0ZW0gY2FsbHMgdXNlIGEgZGlmZmVyZW50IGNhbGxpbmcgc2VxdWVuY2UuICAqLworCitDT1JFX0FERFIKK2kzODZseW54X3NhdmVkX3BjX2FmdGVyX2NhbGwgKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIGNoYXIgb3Bjb2RlWzddOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBjYWxsX2luc3RbXSA9IHsweDlhLCAwLCAwLCAwLCAwLCA4LCAwfTsgLyogbGNhbGwgMHg4LDB4MCAqLworCisgIHJlYWRfbWVtb3J5IChmcmFtZS0+cGMgLSA3LCBvcGNvZGUsIDcpOworICBpZiAobWVtY21wIChvcGNvZGUsIGNhbGxfaW5zdCwgNykgPT0gMCkKKyAgICByZXR1cm4gcmVhZF9tZW1vcnlfaW50ZWdlciAocmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKSArIDQsIDQpOworCisgIHJldHVybiByZWFkX21lbW9yeV9pbnRlZ2VyIChyZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pLCA0KTsKK30KZGlmZiAtLWdpdCBhL2dkYi9pMzg2bTMtbmF0LmMgYi9nZGIvaTM4Nm0zLW5hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMjU3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvaTM4Nm0zLW5hdC5jCkBAIC0wLDAgKzEsNDIxIEBACisvKiBMb3cgbGV2ZWwgaW50ZXJmYWNlIHRvIEkzODYgcnVubmluZyBtYWNoIDMuMC4KKyAgIENvcHlyaWdodCAoQykgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiZmxvYXRmb3JtYXQuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxtYWNoLmg+CisjaW5jbHVkZSA8bWFjaC9tZXNzYWdlLmg+CisjaW5jbHVkZSA8bWFjaC9leGNlcHRpb24uaD4KKyNpbmNsdWRlIDxtYWNoX2Vycm9yLmg+CisKKy8qIEhtbW0uLi4gU2hvdWxkIHRoaXMgbm90IGJlIGhlcmU/CisgKiBOb3cgZm9yIGkzODZfZmxvYXRfaW5mbygpIHRhcmdldF9oYXNfZXhlY3V0aW9uCisgKi8KKyNpbmNsdWRlIDx0YXJnZXQuaD4KKworLyogVGhpcyBtZXNzIGlzIGR1cGxpY2F0ZWQgaW4gYmZkL2kzODZtYWNoMy5oCisgKgorICogVGhpcyBpcyBhbiB1Z2x5IHdheSB0byBoYWNrIGFyb3VuZCB0aGUgaW5jb3JyZWN0CisgKiBkZWZpbml0aW9uIG9mIFVQQUdFUyBpbiBpMzg2L21hY2hwYXJhbS5oLgorICoKKyAqIFRoZSBkZWZpbml0aW9uIHNob3VsZCBzcGVjaWZ5IHRoZSBzaXplIHJlc2VydmVkCisgKiBmb3IgInN0cnVjdCB1c2VyIiBpbiBjb3JlIGZpbGVzIGluIFBBR0VTLAorICogYnV0IGluc3RlYWQgaXQgZ2l2ZXMgaXQgaW4gNTEyLWJ5dGUgY29yZS1jbGlja3MKKyAqIGZvciBpMzg2IGFuZCBpODYwLgorICovCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaWYgVVBBR0VTID09IDE2CisjZGVmaW5lIFVBUkVBX1NJWkUgY3RvYihVUEFHRVMpCisjZWxpZiBVUEFHRVMgPT0gMgorI2RlZmluZSBVQVJFQV9TSVpFIChOQlBHKlVQQUdFUykKKyNlbHNlCitGSVhNRSEhIFVQQUdFUyBpcyBuZWl0aGVyIDIgbm9yIDE2CisjZW5kaWYKKworLyogQEBAIFNob3VsZCBtb3ZlIHByaW50XzM4N19zdGF0dXMoKSB0byBpMzg3LXRkZXAuYyAqLworZXh0ZXJuIHZvaWQgcHJpbnRfMzg3X2NvbnRyb2xfd29yZCAoKTsJCS8qIGkzODctdGRlcC5oICovCitleHRlcm4gdm9pZCBwcmludF8zODdfc3RhdHVzX3dvcmQgKCk7CisKKyNkZWZpbmUgcHJpdmF0ZSBzdGF0aWMKKworDAorLyogRmluZCBvZmZzZXRzIHRvIHRocmVhZCBzdGF0ZXMgYXQgY29tcGlsZSB0aW1lLgorICogSWYgeW91ciBjb21waWxlciBkb2VzIG5vdCBncm9rIHRoaXMsIGNhbGN1bGF0ZSBvZmZzZXRzCisgKiBvZmZzZXRzIHlvdXJzZWxmIGFuZCB1c2UgdGhlbSAob3IgZ2V0IGEgY29tcGF0aWJsZSBjb21waWxlciA6LSkKKyAqLworCisjZGVmaW5lICBSRUdfT0ZGU0VUKHJlZykgKGludCkoJigoc3RydWN0IGkzODZfdGhyZWFkX3N0YXRlICopMCktPnJlZykKKworLyogYXQgcmVnX29mZnNldFtpXSBpcyB0aGUgb2Zmc2V0IHRvIHRoZSBpMzg2X3RocmVhZF9zdGF0ZQorICogbG9jYXRpb24gd2hlcmUgdGhlIGdkYiByZWdpc3RlcnNbaV0gaXMgc3RvcmVkLgorICovCisKK3N0YXRpYyBpbnQgcmVnX29mZnNldFtdID0gCit7CisgIFJFR19PRkZTRVQoZWF4KSwgIFJFR19PRkZTRVQoZWN4KSwgUkVHX09GRlNFVChlZHgpLCBSRUdfT0ZGU0VUKGVieCksCisgIFJFR19PRkZTRVQodWVzcCksIFJFR19PRkZTRVQoZWJwKSwgUkVHX09GRlNFVChlc2kpLCBSRUdfT0ZGU0VUKGVkaSksCisgIFJFR19PRkZTRVQoZWlwKSwgIFJFR19PRkZTRVQoZWZsKSwgUkVHX09GRlNFVChjcyksICBSRUdfT0ZGU0VUKHNzKSwKKyAgUkVHX09GRlNFVChkcyksICAgUkVHX09GRlNFVChlcyksICBSRUdfT0ZGU0VUKGZzKSwgIFJFR19PRkZTRVQoZ3MpCit9OworCisjZGVmaW5lIFJFR19BRERSRVNTKHN0YXRlLHJlZ251bSkgKChjaGFyICopKHN0YXRlKStyZWdfb2Zmc2V0W3JlZ251bV0pCisKKy8qIEZldGNoIENPVU5UIGNvbnRpZ3VvdXMgcmVnaXN0ZXJzIGZyb20gdGhyZWFkIFNUQVRFIHN0YXJ0aW5nIGZyb20gUkVHTlVNCisgKiBDYWxsZXIga25vd3MgdGhhdCB0aGUgcmVncyBoYW5kbGVkIGluIG9uZSB0cmFuc2FjdGlvbiBhcmUgb2Ygc2FtZSBzaXplLgorICovCisjZGVmaW5lIEZFVENIX1JFR1Moc3RhdGUsIHJlZ251bSwgY291bnQpIFwKKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ251bSldLCBcCisJICBSRUdfQUREUkVTUyAoc3RhdGUsIHJlZ251bSksIFwKKwkgIGNvdW50KlJFR0lTVEVSX1NJWkUpCisKKy8qIFN0b3JlIENPVU5UIGNvbnRpZ3VvdXMgcmVnaXN0ZXJzIHRvIHRocmVhZCBTVEFURSBzdGFydGluZyBmcm9tIFJFR05VTSAqLworI2RlZmluZSBTVE9SRV9SRUdTKHN0YXRlLCByZWdudW0sIGNvdW50KSBcCisgIG1lbWNweSAoUkVHX0FERFJFU1MgKHN0YXRlLCByZWdudW0pLCBcCisJICAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ251bSldLCBcCisJICBjb3VudCpSRUdJU1RFUl9TSVpFKQorDAorLyoKKyAqIEZldGNoIGluZmVyaW9ycyByZWdpc3RlcnMgZm9yIGdkYi4KKyAqIFJFR05PIHNwZWNpZmllcyB3aGljaCAoYXMgZ2RiIHZpZXdzIGl0KSByZWdpc3RlciwgLTEgZm9yIGFsbC4KKyAqLworCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGtlcm5fcmV0dXJuX3QgcmV0OworICB0aHJlYWRfc3RhdGVfZGF0YV90IHN0YXRlOworICB1bnNpZ25lZCBpbnQgc3RhdGVDbnQgPSBpMzg2X1RIUkVBRF9TVEFURV9DT1VOVDsKKyAgaW50IGluZGV4OworICAKKyAgaWYgKCEgTUFDSF9QT1JUX1ZBTElEIChjdXJyZW50X3RocmVhZCkpCisgICAgZXJyb3IgKCJmZXRjaCBpbmZlcmlvciByZWdpc3RlcnM6IEludmFsaWQgdGhyZWFkIik7CisKKyAgaWYgKG11c3Rfc3VzcGVuZF90aHJlYWQpCisgICAgc2V0dXBfdGhyZWFkIChjdXJyZW50X3RocmVhZCwgMSk7CisKKyAgcmV0ID0gdGhyZWFkX2dldF9zdGF0ZSAoY3VycmVudF90aHJlYWQsCisJCQkgIGkzODZfVEhSRUFEX1NUQVRFLAorCQkJICBzdGF0ZSwKKwkJCSAgJnN0YXRlQ250KTsKKworICBpZiAocmV0ICE9IEtFUk5fU1VDQ0VTUykKKyAgICB3YXJuaW5nICgiZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzOiAlcyAiLAorCSAgICAgbWFjaF9lcnJvcl9zdHJpbmcgKHJldCkpOworI2lmIDAKKyAgLyogSXQgbWF5IGJlIG1vcmUgZWZmZWN0aXZlIHRvIHN0b3JlIHZhbGlkYXRlIGFsbCBvZiB0aGVtLAorICAgKiBzaW5jZSB3ZSBmZXRjaGVkIHRoZW0gYWxsIGFueXdheQorICAgKi8KKyAgZWxzZSBpZiAocmVnbm8gIT0gLTEpCisgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgKGNoYXIgKilzdGF0ZStyZWdfb2Zmc2V0W3JlZ25vXSk7CisjZW5kaWYKKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9SRUdTOyBpbmRleCsrKSAKKwlzdXBwbHlfcmVnaXN0ZXIgKGluZGV4LCAoY2hhciAqKXN0YXRlK3JlZ19vZmZzZXRbaW5kZXhdKTsKKyAgICB9CisKKyAgaWYgKG11c3Rfc3VzcGVuZF90aHJlYWQpCisgICAgc2V0dXBfdGhyZWFkIChjdXJyZW50X3RocmVhZCwgMCk7Cit9CisMCisvKiBTdG9yZSBvdXIgcmVnaXN0ZXIgdmFsdWVzIGJhY2sgaW50byB0aGUgaW5mZXJpb3IuCisgKiBJZiBSRUdOTyBpcyAtMSwgZG8gdGhpcyBmb3IgYWxsIHJlZ2lzdGVycy4KKyAqIE90aGVyd2lzZSwgUkVHTk8gc3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVyCisgKgorICogT24gbWFjaDMgYWxsIHJlZ2lzdGVycyBhcmUgYWx3YXlzIHNhdmVkIGluIG9uZSBjYWxsLgorICovCit2b2lkCitzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGtlcm5fcmV0dXJuX3QgcmV0OworICB0aHJlYWRfc3RhdGVfZGF0YV90IHN0YXRlOworICB1bnNpZ25lZCBpbnQgc3RhdGVDbnQgPSBpMzg2X1RIUkVBRF9TVEFURV9DT1VOVDsKKyAgcmVnaXN0ZXIgaW50IGluZGV4OworCisgIGlmICghIE1BQ0hfUE9SVF9WQUxJRCAoY3VycmVudF90aHJlYWQpKQorICAgIGVycm9yICgic3RvcmUgaW5mZXJpb3IgcmVnaXN0ZXJzOiBJbnZhbGlkIHRocmVhZCIpOworCisgIGlmIChtdXN0X3N1c3BlbmRfdGhyZWFkKQorICAgIHNldHVwX3RocmVhZCAoY3VycmVudF90aHJlYWQsIDEpOworCisgIC8qIEZldGNoIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCB0aHJlYWQgKi8KKyAgcmV0ID0gdGhyZWFkX2dldF9zdGF0ZSAoY3VycmVudF90aHJlYWQsCisJCQkgIGkzODZfVEhSRUFEX1NUQVRFLAorCQkJICBzdGF0ZSwKKwkJCSAgJnN0YXRlQ250KTsKKworICAgaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpIAorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKGdldCk6ICVzIiwKKwkgICAgICAgbWFjaF9lcnJvcl9zdHJpbmcgKHJldCkpOworICAgICAgaWYgKG11c3Rfc3VzcGVuZF90aHJlYWQpCisJc2V0dXBfdGhyZWFkIChjdXJyZW50X3RocmVhZCwgMCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIG1vdmUgZ2RiJ3MgcmVnaXN0ZXJzIHRvIHRocmVhZCdzIHN0YXRlCisgICAqCisgICAqIFNpbmNlIHdlIHNhdmUgYWxsIHJlZ2lzdGVycyBhbnl3YXksIHNhdmUgdGhlIG9uZXMKKyAgICogdGhhdCBnZGIgdGhpbmtzIGFyZSB2YWxpZCAoZS5nLiBpZ25vcmUgdGhlIHJlZ25vCisgICAqIHBhcmFtZXRlcikKKyAgICovCisjaWYgMAorICBpZiAocmVnbm8gIT0gLTEpCisgICAgU1RPUkVfUkVHUyAoc3RhdGUsIHJlZ25vLCAxKTsKKyAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX1JFR1M7IGluZGV4KyspIAorCVNUT1JFX1JFR1MgKHN0YXRlLCBpbmRleCwgMSk7CisgICAgfQorICAKKyAgLyogV3JpdGUgZ2RiJ3MgY3VycmVudCB2aWV3IG9mIHJlZ2lzdGVyIHRvIHRoZSB0aHJlYWQKKyAgICovCisgIHJldCA9IHRocmVhZF9zZXRfc3RhdGUgKGN1cnJlbnRfdGhyZWFkLAorCQkJICBpMzg2X1RIUkVBRF9TVEFURSwKKwkJCSAgc3RhdGUsCisJCQkgIGkzODZfVEhSRUFEX1NUQVRFX0NPVU5UKTsKKyAgCisgIGlmIChyZXQgIT0gS0VSTl9TVUNDRVNTKQorICAgIHdhcm5pbmcgKCJzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKHNldCk6ICVzIiwKKwkgICAgIG1hY2hfZXJyb3Jfc3RyaW5nIChyZXQpKTsKKworICBpZiAobXVzdF9zdXNwZW5kX3RocmVhZCkKKyAgICBzZXR1cF90aHJlYWQgKGN1cnJlbnRfdGhyZWFkLCAwKTsKK30KKworDAorCisvKiBSZXR1cm4gdGhlIGFkZHJlc3MgaW4gdGhlIGNvcmUgZHVtcCBvciBpbmZlcmlvciBvZiByZWdpc3RlciBSRUdOTy4KKyAqIEJMT0NLRU5EIHNob3VsZCBiZSB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBVUEFHRVMgYXJlYSByZWFkCisgKiBpbiBtZW1vcnksIGJ1dCBpdCdzIG5vdD8KKyAqCisgKiBDdXJyZW50bHkgb3VyIFVYIHNlcnZlciBkdW1wcyB0aGUgd2hvbGUgdGhyZWFkIHN0YXRlIHRvIHRoZQorICogY29yZSBmaWxlLiBJZiB5b3VyIFVYIGRvZXMgc29tZXRoaW5nIGVsc2UsIGFkYXB0IHRoZSByb3V0aW5lCisgKiBiZWxvdyB0byByZXR1cm4gdGhlIG9mZnNldCB0byB0aGUgZ2l2ZW4gcmVnaXN0ZXIuCisgKiAKKyAqIENhbGxlZCBieSBjb3JlLWFvdXQuYyhmZXRjaF9jb3JlX3JlZ2lzdGVycykKKyAqLworCitDT1JFX0FERFIKK3JlZ2lzdGVyX2FkZHIgKHJlZ25vLCBibG9ja2VuZCkKKyAgICAgaW50IHJlZ25vOworICAgICBDT1JFX0FERFIgYmxvY2tlbmQ7Cit7CisgIENPUkVfQUREUiBhZGRyOworCisgIGlmIChyZWdubyA8IDAgfHwgcmVnbm8gPj0gTlVNX1JFR1MpCisgICAgZXJyb3IgKCJJbnZhbGlkIHJlZ2lzdGVyIG51bWJlciAlZC4iLCByZWdubyk7CisKKyAgLyogVUFSRUFfU0laRSA9PSA4IGtCIGluIGkzODYgKi8KKyAgYWRkciA9ICh1bnNpZ25lZCBpbnQpUkVHX0FERFJFU1MgKFVBUkVBX1NJWkUgLSBzaXplb2Yoc3RydWN0IGkzODZfdGhyZWFkX3N0YXRlKSwgcmVnbm8pOworCisgIHJldHVybiBhZGRyOworfQorCisvKiBqdHZAaHV0LmZpOiBJIGNvcGllZCBhbmQgbW9kaWZpZWQgdGhpcyAzODcgY29kZSBmcm9tCisgKiBnZGIvaTM4Ni14ZGVwLmMuIE1vZGlmaWNhdGlvbnMgZm9yIE1hY2ggMy4wLgorICoKKyAqIGkzODcgc3RhdHVzIGR1bXBlci4gU2VlIGFsc28gaTM4Ny10ZGVwLmMKKyAqLworc3RydWN0IGVudjM4NyAKK3sKKyAgdW5zaWduZWQgc2hvcnQgY29udHJvbDsKKyAgdW5zaWduZWQgc2hvcnQgcjA7CisgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQgcjE7CisgIHVuc2lnbmVkIHNob3J0IHRhZzsKKyAgdW5zaWduZWQgc2hvcnQgcjI7CisgIHVuc2lnbmVkIGxvbmcgZWlwOworICB1bnNpZ25lZCBzaG9ydCBjb2RlX3NlZzsKKyAgdW5zaWduZWQgc2hvcnQgb3Bjb2RlOworICB1bnNpZ25lZCBsb25nIG9wZXJhbmQ7CisgIHVuc2lnbmVkIHNob3J0IG9wZXJhbmRfc2VnOworICB1bnNpZ25lZCBzaG9ydCByMzsKKyAgdW5zaWduZWQgY2hhciByZWdzWzhdWzEwXTsKK307CisvKiBUaGlzIHJvdXRpbmUgaXMgbWFjaGluZSBpbmRlcGVuZGVudD8KKyAqIFNob3VsZCBtb3ZlIGl0IHRvIGkzODctdGRlcC5jIGJ1dCB5b3UgbmVlZCB0byBleHBvcnQgc3RydWN0IGVudjM4NworICovCitwcml2YXRlCitwcmludF8zODdfc3RhdHVzIChzdGF0dXMsIGVwKQorICAgICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisgICAgIHN0cnVjdCBlbnYzODcgKmVwOworeworICBpbnQgaTsKKyAgaW50IGJvdGhzdGF0dXM7CisgIGludCB0b3A7CisgIGludCBmcHJlZzsKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgCisgIGJvdGhzdGF0dXMgPSAoKHN0YXR1cyAhPSAwKSAmJiAoZXAtPnN0YXR1cyAhPSAwKSk7CisgIGlmIChzdGF0dXMgIT0gMCkgCisgICAgeworICAgICAgaWYgKGJvdGhzdGF0dXMpCisJcHJpbnRmX3VuZmlsdGVyZWQgKCJ1OiAiKTsKKyAgICAgIHByaW50XzM4N19zdGF0dXNfd29yZCAoc3RhdHVzKTsKKyAgICB9CisgIAorICBpZiAoZXAtPnN0YXR1cyAhPSAwKSAKKyAgICB7CisgICAgICBpZiAoYm90aHN0YXR1cykKKwlwcmludGZfdW5maWx0ZXJlZCAoImU6ICIpOworICAgICAgcHJpbnRfMzg3X3N0YXR1c193b3JkIChlcC0+c3RhdHVzKTsKKyAgICB9CisgIAorICBwcmludF8zODdfY29udHJvbF93b3JkIChlcC0+Y29udHJvbCk7CisgIHByaW50Zl91bmZpbHRlcmVkICgibGFzdCBleGNlcHRpb246ICIpOworICBwcmludGZfdW5maWx0ZXJlZCAoIm9wY29kZSAlczsgIiwgbG9jYWxfaGV4X3N0cmluZyhlcC0+b3Bjb2RlKSk7CisgIHByaW50Zl91bmZpbHRlcmVkICgicGMgJXM6IiwgbG9jYWxfaGV4X3N0cmluZyhlcC0+Y29kZV9zZWcpKTsKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlczsgIiwgbG9jYWxfaGV4X3N0cmluZyhlcC0+ZWlwKSk7CisgIHByaW50Zl91bmZpbHRlcmVkICgib3BlcmFuZCAlcyIsIGxvY2FsX2hleF9zdHJpbmcoZXAtPm9wZXJhbmRfc2VnKSk7CisgIHByaW50Zl91bmZpbHRlcmVkICgiOiVzXG4iLCBsb2NhbF9oZXhfc3RyaW5nKGVwLT5vcGVyYW5kKSk7CisgIAorICB0b3AgPSAoZXAtPnN0YXR1cyA+PiAxMSkgJiA3OworICAKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJyZWdubyAgdGFnICBtc2IgICAgICAgICAgICAgIGxzYiAgdmFsdWVcbiIpOworICBmb3IgKGZwcmVnID0gNzsgZnByZWcgPj0gMDsgZnByZWctLSkgCisgICAgeworICAgICAgZG91YmxlIHZhbDsKKyAgICAgIAorICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlcyAlZDogIiwgZnByZWcgPT0gdG9wID8gIj0+IiA6ICIgICIsIGZwcmVnKTsKKyAgICAgIAorICAgICAgc3dpdGNoICgoZXAtPnRhZyA+PiAoZnByZWcgKiAyKSkgJiAzKSAKKwl7CisJY2FzZSAwOiBwcmludGZfdW5maWx0ZXJlZCAoInZhbGlkICIpOyBicmVhazsKKwljYXNlIDE6IHByaW50Zl91bmZpbHRlcmVkICgiemVybyAgIik7IGJyZWFrOworCWNhc2UgMjogcHJpbnRmX3VuZmlsdGVyZWQgKCJ0cmFwICAiKTsgYnJlYWs7CisJY2FzZSAzOiBwcmludGZfdW5maWx0ZXJlZCAoImVtcHR5ICIpOyBicmVhazsKKwl9CisgICAgICBmb3IgKGkgPSA5OyBpID49IDA7IGktLSkKKwlwcmludGZfdW5maWx0ZXJlZCAoIiUwMngiLCBlcC0+cmVnc1tmcHJlZ11baV0pOworICAgICAgCisgICAgICBmbG9hdGZvcm1hdF90b19kb3VibGUgKCZmbG9hdGZvcm1hdF9pMzg3X2V4dCwgKGNoYXIgKillcC0+cmVnc1tmcHJlZ10sCisJCQkgICAgICAgJnZhbCk7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIiAgJWdcbiIsIHZhbCk7CisgICAgfQorICBpZiAoZXAtPnIwKQorICAgIHByaW50Zl91bmZpbHRlcmVkICgid2FybmluZzogcmVzZXJ2ZWQwIGlzICVzXG4iLCBsb2NhbF9oZXhfc3RyaW5nKGVwLT5yMCkpOworICBpZiAoZXAtPnIxKQorICAgIHByaW50Zl91bmZpbHRlcmVkICgid2FybmluZzogcmVzZXJ2ZWQxIGlzICVzXG4iLCBsb2NhbF9oZXhfc3RyaW5nKGVwLT5yMSkpOworICBpZiAoZXAtPnIyKQorICAgIHByaW50Zl91bmZpbHRlcmVkICgid2FybmluZzogcmVzZXJ2ZWQyIGlzICVzXG4iLCBsb2NhbF9oZXhfc3RyaW5nKGVwLT5yMikpOworICBpZiAoZXAtPnIzKQorICAgIHByaW50Zl91bmZpbHRlcmVkICgid2FybmluZzogcmVzZXJ2ZWQzIGlzICVzXG4iLCBsb2NhbF9oZXhfc3RyaW5nKGVwLT5yMykpOworfQorCQorLyoKKyAqIHZhbHVlcyB0aGF0IGdvIGludG8gZnBfa2luZCAoZnJvbSA8aTM4Ni9mcHJlZy5oPikKKyAqLworI2RlZmluZSBGUF9OTyAgIDAgICAgICAgLyogbm8gZnAgY2hpcCwgbm8gZW11bGF0b3IgKG5vIGZwIHN1cHBvcnQpICAgICAgKi8KKyNkZWZpbmUgRlBfU1cgICAxICAgICAgIC8qIG5vIGZwIGNoaXAsIHVzaW5nIHNvZnR3YXJlIGVtdWxhdG9yICAgICAgICAgICovCisjZGVmaW5lIEZQX0hXICAgMiAgICAgICAvKiBjaGlwIHByZXNlbnQgYml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGUF8yODcgIDIgICAgICAgLyogODAyODcgY2hpcCBwcmVzZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlBfMzg3ICAzICAgICAgIC8qIDgwMzg3IGNoaXAgcHJlc2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3R5cGVkZWYgc3RydWN0IGZwc3RhdGUgeworI2lmIDEKKyAgdW5zaWduZWQgY2hhcglzdGF0ZVtGUF9TVEFURV9CWVRFU107IC8qICJoYXJkd2FyZSIgc3RhdGUgKi8KKyNlbHNlCisgIHN0cnVjdCBlbnYzODcJc3RhdGU7CS8qIEFjdHVhbGx5IHRoaXMgKi8KKyNlbmRpZgorICBpbnQgc3RhdHVzOwkJLyogRHVwbGljYXRlIHN0YXR1cyAqLworfSAqZnBzdGF0ZV90OworCisvKiBNYWNoIDMgc3BlY2lmaWMgcm91dGluZXMuCisgKi8KK3ByaXZhdGUgYm9vbGVhbl90CitnZXRfaTM4N19zdGF0ZSAoZnN0YXRlKQorICAgICBzdHJ1Y3QgZnBzdGF0ZSAqZnN0YXRlOworeworICBrZXJuX3JldHVybl90IHJldDsKKyAgdGhyZWFkX3N0YXRlX2RhdGFfdCBzdGF0ZTsKKyAgdW5zaWduZWQgaW50IGZzQ250ID0gaTM4Nl9GTE9BVF9TVEFURV9DT1VOVDsKKyAgc3RydWN0IGkzODZfZmxvYXRfc3RhdGUgKmZzcDsKKyAgCisgIHJldCA9IHRocmVhZF9nZXRfc3RhdGUgKGN1cnJlbnRfdGhyZWFkLAorCQkJICBpMzg2X0ZMT0FUX1NUQVRFLAorCQkJICBzdGF0ZSwKKwkJCSAgJmZzQ250KTsKKworICBpZiAocmV0ICE9IEtFUk5fU1VDQ0VTUykKKyAgICB7CisgICAgICB3YXJuaW5nICgiQ2FuIG5vdCBnZXQgbGl2ZSBmbG9hdGluZyBwb2ludCBzdGF0ZTogJXMiLAorCSAgICAgICBtYWNoX2Vycm9yX3N0cmluZyAocmV0KSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGZzcCA9IChzdHJ1Y3QgaTM4Nl9mbG9hdF9zdGF0ZSAqKXN0YXRlOworICAvKiBUaGUgMzg3IGNoaXAgKGFsc28gNDg2IGNvdW50cykgb3IgYSBzb2Z0d2FyZSBlbXVsYXRvcj8gKi8KKyAgaWYgKCFmc3AtPmluaXRpYWxpemVkIHx8IChmc3AtPmZwa2luZCAhPSBGUF8zODcgJiYgZnNwLT5mcGtpbmQgIT0gRlBfU1cpKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBDbGVhciB0aGUgdGFyZ2V0IHRoZW4gY29weSB0aHJlYWQncyBmbG9hdCBzdGF0ZSB0aGVyZS4KKyAgICAgTWFrZSBhIGNvcHkgb2YgdGhlIHN0YXR1cyB3b3JkLCBmb3Igc29tZSByZWFzb24/CisgICAqLworICBtZW1zZXQgKGZzdGF0ZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgZnBzdGF0ZSkpOworCisgIGZzdGF0ZS0+c3RhdHVzID0gZnNwLT5leGNfc3RhdHVzOworCisgIG1lbWNweSAoZnN0YXRlLT5zdGF0ZSwgKGNoYXIgKikmZnNwLT5od19zdGF0ZSwgRlBfU1RBVEVfQllURVMpOworCisgIHJldHVybiBUUlVFOworfQorCitwcml2YXRlIGJvb2xlYW5fdAorZ2V0X2kzODdfY29yZV9zdGF0ZSAoZnN0YXRlKQorICAgICBzdHJ1Y3QgZnBzdGF0ZSAqZnN0YXRlOworeworICAvKiBOb3QgaW1wbGVtZW50ZWQgeWV0LiBDb3JlIGZpbGVzIGRvIG5vdCBjb250YWluIGZsb2F0IHN0YXRlLiAqLworICByZXR1cm4gRkFMU0U7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBieSAiaW5mbyBmbG9hdCIgY29tbWFuZAorICovCit2b2lkCitpMzg2X21hY2gzX2Zsb2F0X2luZm8oKQoreworICBjaGFyIGJ1ZiBbc2l6ZW9mIChzdHJ1Y3QgZnBzdGF0ZSkgKyAyICogc2l6ZW9mIChpbnQpXTsKKyAgYm9vbGVhbl90IHZhbGlkID0gRkFMU0U7CisgIGZwc3RhdGVfdCBmcHM7CisgIAorICBpZiAodGFyZ2V0X2hhc19leGVjdXRpb24pCisgICAgdmFsaWQgPSBnZXRfaTM4N19zdGF0ZSAoYnVmKTsKKyNpZiAwICAKKyAgZWxzZSBpZiAoV0UgSEFWRSBDT1JFIEZJTEUpICAvKiBAQEBAIENvcmUgZmlsZXMgbm90IHN1cHBvcnRlZCAqLworICAgIHZhbGlkID0gZ2V0X2kzODdfY29yZV9zdGF0ZSAoYnVmKTsKKyNlbmRpZiAgICAKKworICBpZiAoIXZhbGlkKSAKKyAgICB7CisgICAgICB3YXJuaW5nICgibm8gZmxvYXRpbmcgcG9pbnQgc3RhdHVzIHNhdmVkIik7CisgICAgICByZXR1cm47CisgICAgfQorICAKKyAgZnBzID0gKGZwc3RhdGVfdCkgYnVmOworCisgIHByaW50XzM4N19zdGF0dXMgKGZwcy0+c3RhdHVzLCAoc3RydWN0IGVudjM4NyAqKWZwcy0+c3RhdGUpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2kzODZtYWNoLW5hdC5jIGIvZ2RiL2kzODZtYWNoLW5hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NDNkN2YKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvaTM4Nm1hY2gtbmF0LmMKQEAgLTAsMCArMSwxNjMgQEAKKy8qIE5hdGl2ZSBkZXBlbmRlbnQgY29kZSBmb3IgTWFjaCAzODYncyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5LCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9kaXIuaD4KKyNpbmNsdWRlIDxzeXMvdXNlci5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisjaW5jbHVkZSA8bWFjaGluZS9yZWcuaD4KKworI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSAiZ2RiX3N0YXQuaCIKKyNpbmNsdWRlIDxzeXMvY29yZS5oPgorCitzdGF0aWMgdm9pZCBmZXRjaF9jb3JlX3JlZ2lzdGVycyBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkLCBpbnQsIENPUkVfQUREUikpOworCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87CQkvKiBPcmlnaW5hbCB2YWx1ZSBkaXNjYXJkZWQgKi8KK3sKKyAgc3RydWN0IHJlZ3MgaW5mZXJpb3JfcmVnaXN0ZXJzOworICBzdHJ1Y3QgZnBfc3RhdGUgaW5mZXJpb3JfZnBfcmVnaXN0ZXJzOworICBleHRlcm4gY2hhciByZWdpc3RlcnNbXTsKKworICByZWdpc3RlcnNfZmV0Y2hlZCAoKTsKKworICBwdHJhY2UgKFBUUkFDRV9HRVRSRUdTLCBpbmZlcmlvcl9waWQsCisJICAoUFRSQUNFX0FSRzNfVFlQRSkgJmluZmVyaW9yX3JlZ2lzdGVycyk7CisgIHB0cmFjZSAoUFRSQUNFX0dFVEZQUkVHUywgaW5mZXJpb3JfcGlkLAorCSAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9mcF9yZWdpc3RlcnMpOworCisgIG1lbWNweSAocmVnaXN0ZXJzLCAmaW5mZXJpb3JfcmVnaXN0ZXJzLCBzaXplb2YgaW5mZXJpb3JfcmVnaXN0ZXJzKTsKKworICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLAorCSBpbmZlcmlvcl9mcF9yZWdpc3RlcnMuZl9zdCwKKwkgc2l6ZW9mIGluZmVyaW9yX2ZwX3JlZ2lzdGVycy5mX3N0KTsKKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQQ19SRUdOVU0pXSwKKwkgJmluZmVyaW9yX2ZwX3JlZ2lzdGVycy5mX2N0cmwsCisJIHNpemVvZiBpbmZlcmlvcl9mcF9yZWdpc3RlcnMgLSBzaXplb2YgaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLmZfc3QpOworfQorCisvKiBTdG9yZSBvdXIgcmVnaXN0ZXIgdmFsdWVzIGJhY2sgaW50byB0aGUgaW5mZXJpb3IuCisgICBJZiBSRUdOTyBpcyAtMSwgZG8gdGhpcyBmb3IgYWxsIHJlZ2lzdGVycy4KKyAgIE90aGVyd2lzZSwgUkVHTk8gc3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVyIChzbyB3ZSBjYW4gc2F2ZSB0aW1lKS4gICovCisKK3ZvaWQKK3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgc3RydWN0IHJlZ3MgaW5mZXJpb3JfcmVnaXN0ZXJzOworICBzdHJ1Y3QgZnBfc3RhdGUgaW5mZXJpb3JfZnBfcmVnaXN0ZXJzOworICBleHRlcm4gY2hhciByZWdpc3RlcnNbXTsKKworICBtZW1jcHkgKCZpbmZlcmlvcl9yZWdpc3RlcnMsIHJlZ2lzdGVycywgMjAgKiA0KTsKKworICBtZW1jcHkgKGluZmVyaW9yX2ZwX3JlZ2lzdGVycy5mX3N0LCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLAorCSBzaXplb2YgaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLmZfc3QpOworICBtZW1jcHkgKCZpbmZlcmlvcl9mcF9yZWdpc3RlcnMuZl9jdHJsLAorCSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQQ19SRUdOVU0pXSwKKwkgc2l6ZW9mIGluZmVyaW9yX2ZwX3JlZ2lzdGVycyAtIHNpemVvZiBpbmZlcmlvcl9mcF9yZWdpc3RlcnMuZl9zdCk7CisgIAorI2lmZGVmIFBUUkFDRV9GUF9CVUcKKyAgaWYgKHJlZ25vID09IEZQX1JFR05VTSB8fCByZWdubyA9PSAtMSkKKyAgICAvKiBTdG9yaW5nIHRoZSBmcmFtZSBwb2ludGVyIHJlcXVpcmVzIGEgZ3Jvc3MgaGFjaywgaW4gd2hpY2ggYW4KKyAgICAgICBpbnN0cnVjdGlvbiB0aGF0IG1vdmVzIGVheCBpbnRvIGVicCBnZXRzIHNpbmdsZS1zdGVwcGVkLiAgKi8KKyAgICB7CisgICAgICBpbnQgc3RhY2sgPSBpbmZlcmlvcl9yZWdpc3RlcnMucl9yZWdbU1BfUkVHTlVNXTsKKyAgICAgIGludCBzdHVmZiA9IHB0cmFjZSAoUFRSQUNFX1BFRUtEQVRBLCBpbmZlcmlvcl9waWQsCisJCQkgIChQVFJBQ0VfQVJHM19UWVBFKSBzdGFjayk7CisgICAgICBpbnQgcmVnID0gaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcmVnW0VBWF07CisgICAgICBpbmZlcmlvcl9yZWdpc3RlcnMucl9yZWdbRUFYXSA9CisJaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcmVnW0ZQX1JFR05VTV07CisgICAgICBwdHJhY2UgKFBUUkFDRV9TRVRSRUdTLCBpbmZlcmlvcl9waWQsCisJICAgICAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9yZWdpc3RlcnMpOworICAgICAgcHRyYWNlIChQVFJBQ0VfUE9LRURBVEEsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIHN0YWNrLCAweGM1ODkpOworICAgICAgcHRyYWNlIChQVFJBQ0VfU0lOR0xFU1RFUCwgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgc3RhY2ssIDApOworICAgICAgd2FpdCAoMCk7CisgICAgICBwdHJhY2UgKFBUUkFDRV9QT0tFREFUQSwgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgc3RhY2ssIHN0dWZmKTsKKyAgICAgIGluZmVyaW9yX3JlZ2lzdGVycy5yX3JlZ1tFQVhdID0gcmVnOworICAgIH0KKyNlbmRpZgorICBwdHJhY2UgKFBUUkFDRV9TRVRSRUdTLCBpbmZlcmlvcl9waWQsCisJICAoUFRSQUNFX0FSRzNfVFlQRSkgJmluZmVyaW9yX3JlZ2lzdGVycyk7CisgIHB0cmFjZSAoUFRSQUNFX1NFVEZQUkVHUywgaW5mZXJpb3JfcGlkLAorCSAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9mcF9yZWdpc3RlcnMpOworfQorCisKKworLyogV29yayB3aXRoIGNvcmUgZmlsZXMsIGZvciBHREIuICovCisKK3N0YXRpYyB2b2lkCitmZXRjaF9jb3JlX3JlZ2lzdGVycyAoY29yZV9yZWdfc2VjdCwgY29yZV9yZWdfc2l6ZSwgd2hpY2gsIHJlZ19hZGRyKQorICAgICBjaGFyICpjb3JlX3JlZ19zZWN0OworICAgICB1bnNpZ25lZCBjb3JlX3JlZ19zaXplOworICAgICBpbnQgd2hpY2g7CisgICAgIENPUkVfQUREUiByZWdfYWRkcjsJLyogVW51c2VkIGluIHRoaXMgdmVyc2lvbiAqLworeworICBpbnQgdmFsOworICBleHRlcm4gY2hhciByZWdpc3RlcnNbXTsKKworICBzd2l0Y2ggKHdoaWNoKSB7CisgIGNhc2UgMDoKKyAgY2FzZSAxOgorICAgIG1lbWNweSAocmVnaXN0ZXJzLCBjb3JlX3JlZ19zZWN0LCBjb3JlX3JlZ19zaXplKTsKKyAgICBicmVhazsKKworICBjYXNlIDI6CisjaWZkZWYgRlAwX1JFR05VTQorICAgIG1lbWNweSAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNKV0sCisJICAgY29yZV9yZWdfc2VjdCwKKwkgICBjb3JlX3JlZ19zaXplKTsJCS8qIEZJWE1FLCBwcm9iYWJseSBib2d1cyAqLworI2VuZGlmCisjaWZkZWYgRlBDX1JFR05VTQorICAgIG1lbWNweSAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUENfUkVHTlVNKV0sCisJICAgJmNvcmVzdHIuY19mcHUuZl9mcHN0YXR1cy5mX2N0cmwsCisJICAgc2l6ZW9mIGNvcmVzdHIuY19mcHUuZl9mcHN0YXR1cyAtCisJICAgc2l6ZW9mIGNvcmVzdHIuY19mcHUuZl9mcHN0YXR1cy5mX3N0KTsKKyNlbmRpZgorICAgIGJyZWFrOworICB9Cit9CisKKwwKKy8qIFJlZ2lzdGVyIHRoYXQgd2UgYXJlIGFibGUgdG8gaGFuZGxlIGkzODZtYWNoIGNvcmUgZmlsZSBmb3JtYXRzLgorICAgRklYTUU6IGlzIHRoaXMgcmVhbGx5IGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyPyAqLworCitzdGF0aWMgc3RydWN0IGNvcmVfZm5zIGkzODZtYWNoX2NvcmVfZm5zID0KK3sKKyAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCisgIGZldGNoX2NvcmVfcmVnaXN0ZXJzLAorICBOVUxMCit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9jb3JlX2kzODZtYWNoICgpCit7CisgIGFkZF9jb3JlX2ZucyAoJmkzODZtYWNoX2NvcmVfZm5zKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9pMzg2di1uYXQuYyBiL2dkYi9pMzg2di1uYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjE4Njg3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2kzODZ2LW5hdC5jCkBAIC0wLDAgKzEsMzkyIEBACisvKiBJbnRlbCAzODYgbmF0aXZlIHN1cHBvcnQgZm9yIFNZU1Ygc3lzdGVtcyAocHJlLVNWUjQpLgorICAgQ29weXJpZ2h0IChDKSAxOTg4LCA4OSwgOTEsIDkyLCA5NCwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKworI2lmZGVmIEhBVkVfUFRSQUNFX0gKKyMgaW5jbHVkZSA8cHRyYWNlLmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX1NZU19QVFJBQ0VfSAorIyAgaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisKKyNpZmRlZiBVU0cKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL2Rpci5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy91c2VyLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworCisvKiBGSVhNRTogVGhlIGZvbGxvd2luZyB1c2VkIHRvIGJlIGp1c3QgIiNpbmNsdWRlIDxzeXMvZGVidWdyZWcuaD4iLCBidXQKKyAqIHRoZSB0aGUgTGludXggMi4xLngga2VybmVsIGFuZCBnbGliYyAyLjAueCBhcmUgbm90IGluIHN5bmM7IGluY2x1ZGluZworICogPHN5cy9kZWJ1Z3JlZy5oPiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFdpdGggbHVjaywgdGhlc2UgbG9zZXJzCisgKiB3aWxsIGdldCB0aGVpciBhY3QgdG9nZXRoZXIgYW5kIHdlIGNhbiB0cmFzaCB0aGlzIGhhY2sgaW4gdGhlIG5lYXIgZnV0dXJlLgorICogLS1qc20gMTk5OC0xMC0yMQorICovCisKKyNpZmRlZiBUQVJHRVRfSEFTX0hBUkRXQVJFX1dBVENIUE9JTlRTCisjIGlmZGVmIEhBVkVfQVNNX0RFQlVHUkVHX0gKKyMgIGluY2x1ZGUgPGFzbS9kZWJ1Z3JlZy5oPgorIyBlbHNlCisjICBpbmNsdWRlIDxzeXMvZGVidWdyZWcuaD4KKyMgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlICJnZGJfc3RhdC5oIgorCisjaWZkZWYgSEFWRV9TWVNfUkVHX0gKKyNpbmNsdWRlIDxzeXMvcmVnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImZsb2F0Zm9ybWF0LmgiCisKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKworDAorLyogdGhpcyB0YWJsZSBtdXN0IGxpbmUgdXAgd2l0aCBSRUdJU1RFUl9OQU1FUyBpbiB0bS1pMzg2di5oICovCisvKiBzeW1ib2xzIGxpa2UgJ0VBWCcgY29tZSBmcm9tIDxzeXMvcmVnLmg+ICovCitzdGF0aWMgaW50IHJlZ21hcFtdID0gCit7CisgIEVBWCwgRUNYLCBFRFgsIEVCWCwKKyAgVUVTUCwgRUJQLCBFU0ksIEVESSwKKyAgRUlQLCBFRkwsIENTLCBTUywKKyAgRFMsIEVTLCBGUywgR1MsCit9OworCisvKiBibG9ja2VuZCBpcyB0aGUgdmFsdWUgb2YgdS51X2FyMCwgYW5kIHBvaW50cyB0byB0aGUKKyAqIHBsYWNlIHdoZXJlIEdTIGlzIHN0b3JlZAorICovCisKK2ludAoraTM4Nl9yZWdpc3Rlcl91X2FkZHIgKGJsb2NrZW5kLCByZWdudW0pCisgICAgIGludCBibG9ja2VuZDsKKyAgICAgaW50IHJlZ251bTsKK3sKKyAgc3RydWN0IHVzZXIgdTsKKyAgaW50IGZwc3RhdGU7CisgIGludCB1YmFzZTsKKworICB1YmFzZSA9IGJsb2NrZW5kOworICAvKiBGSVhNRTogIFNob3VsZCBoYXZlIGJldHRlciB3YXkgdG8gdGVzdCBmbG9hdGluZyBwb2ludCByYW5nZSAqLworICBpZiAocmVnbnVtID49IEZQMF9SRUdOVU0gJiYgcmVnbnVtIDw9IChGUDBfUkVHTlVNICsgNykpIAorICAgIHsKKyNpZmRlZiBLU1RLU1oJLyogU0NPLCBhbmQgb3RoZXJzPyAqLworICAgICAgdWJhc2UgKz0gNCAqIChTUyArIDEpIC0gS1NUS1NaOworICAgICAgZnBzdGF0ZSA9IHViYXNlICsgKChjaGFyICopJnUudV9mcHMudV9mcHN0YXRlIC0gKGNoYXIgKikmdSk7CisgICAgICByZXR1cm4gKGZwc3RhdGUgKyAweDFjICsgMTAgKiAocmVnbnVtIC0gRlAwX1JFR05VTSkpOworI2Vsc2UKKyAgICAgIGZwc3RhdGUgPSB1YmFzZSArICgoY2hhciAqKSZ1LmkzODcuc3Rfc3BhY2UgLSAoY2hhciAqKSZ1KTsKKyAgICAgIHJldHVybiAoZnBzdGF0ZSArIDEwICogKHJlZ251bSAtIEZQMF9SRUdOVU0pKTsKKyNlbmRpZgorICAgIH0gCisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gKHViYXNlICsgNCAqIHJlZ21hcFtyZWdudW1dKTsKKyAgICB9CisgIAorfQorDAoraW50CitrZXJuZWxfdV9zaXplICgpCit7CisgIHJldHVybiAoc2l6ZW9mIChzdHJ1Y3QgdXNlcikpOworfQorDAorI2lmZGVmIFRBUkdFVF9IQVNfSEFSRFdBUkVfV0FUQ0hQT0lOVFMKKworI2lmICFkZWZpbmVkIChvZmZzZXRvZikKKyNkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKHVuc2lnbmVkIGxvbmcpICYoKFRZUEUgKikwKS0+TUVNQkVSKQorI2VuZGlmCisKKy8qIFJlY29yZCB0aGUgdmFsdWUgb2YgdGhlIGRlYnVnIGNvbnRyb2wgcmVnaXN0ZXIuICAqLworc3RhdGljIGludCBkZWJ1Z19jb250cm9sX21pcnJvcjsKKworLyogUmVjb3JkIHdoaWNoIGFkZHJlc3MgYXNzb2NpYXRlcyB3aXRoIHdoaWNoIHJlZ2lzdGVyLiAgKi8KK3N0YXRpYyBDT1JFX0FERFIgYWRkcmVzc19sb29rdXBbRFJfTEFTVEFERFIgLSBEUl9GSVJTVEFERFIgKyAxXTsKKworc3RhdGljIGludAoraTM4Nl9pbnNlcnRfYWxpZ25lZF93YXRjaHBvaW50IFBBUkFNUyAoKGludCwgQ09SRV9BRERSLCBDT1JFX0FERFIsIGludCwKKwkJCQkJICAgaW50KSk7CisKK3N0YXRpYyBpbnQKK2kzODZfaW5zZXJ0X25vbmFsaWduZWRfd2F0Y2hwb2ludCBQQVJBTVMgKChpbnQsIENPUkVfQUREUiwgQ09SRV9BRERSLCBpbnQsCisJCQkJCSAgIGludCkpOworCisvKiBJbnNlcnQgYSB3YXRjaHBvaW50LiAgKi8KKworaW50CitpMzg2X2luc2VydF93YXRjaHBvaW50IChwaWQsIGFkZHIsIGxlbiwgcncpCisgICAgIGludCBwaWQ7CisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBpbnQgbGVuOworICAgICBpbnQgcnc7Cit7CisgIHJldHVybiBpMzg2X2luc2VydF9hbGlnbmVkX3dhdGNocG9pbnQgKHBpZCwgYWRkciwgYWRkciwgbGVuLCBydyk7Cit9CisKK3N0YXRpYyBpbnQKK2kzODZfaW5zZXJ0X2FsaWduZWRfd2F0Y2hwb2ludCAocGlkLCB3YWRkciwgYWRkciwgbGVuLCBydykKKyAgICAgaW50IHBpZDsKKyAgICAgQ09SRV9BRERSIHdhZGRyOworICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IHJ3OworeworICBpbnQgaTsKKyAgaW50IHJlYWRfd3JpdGVfYml0cywgbGVuX2JpdHM7CisgIGludCBmcmVlX2RlYnVnX3JlZ2lzdGVyOworICBpbnQgcmVnaXN0ZXJfbnVtYmVyOworICAKKyAgLyogTG9vayBmb3IgYSBmcmVlIGRlYnVnIHJlZ2lzdGVyLiAgKi8KKyAgZm9yIChpID0gRFJfRklSU1RBRERSOyBpIDw9IERSX0xBU1RBRERSOyBpKyspCisgICAgeworICAgICAgaWYgKGFkZHJlc3NfbG9va3VwW2kgLSBEUl9GSVJTVEFERFJdID09IDApCisJYnJlYWs7CisgICAgfQorCisgIC8qIE5vIG1vcmUgZGVidWcgcmVnaXN0ZXJzISAgKi8KKyAgaWYgKGkgPiBEUl9MQVNUQUREUikKKyAgICByZXR1cm4gLTE7CisKKyAgcmVhZF93cml0ZV9iaXRzID0gKHJ3ICYgMSkgPyBEUl9SV19SRUFEIDogRFJfUldfV1JJVEU7CisKKyAgaWYgKGxlbiA9PSAxKQorICAgIGxlbl9iaXRzID0gRFJfTEVOXzE7CisgIGVsc2UgaWYgKGxlbiA9PSAyKQorICAgIHsKKyAgICAgIGlmIChhZGRyICUgMikKKwlyZXR1cm4gaTM4Nl9pbnNlcnRfbm9uYWxpZ25lZF93YXRjaHBvaW50IChwaWQsIHdhZGRyLCBhZGRyLCBsZW4sIHJ3KTsKKyAgICAgIGxlbl9iaXRzID0gRFJfTEVOXzI7CisgICAgfQorCisgIGVsc2UgaWYgKGxlbiA9PSA0KQorICAgIHsKKyAgICAgIGlmIChhZGRyICUgNCkKKwlyZXR1cm4gaTM4Nl9pbnNlcnRfbm9uYWxpZ25lZF93YXRjaHBvaW50IChwaWQsIHdhZGRyLCBhZGRyLCBsZW4sIHJ3KTsKKyAgICAgIGxlbl9iaXRzID0gRFJfTEVOXzQ7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIGkzODZfaW5zZXJ0X25vbmFsaWduZWRfd2F0Y2hwb2ludCAocGlkLCB3YWRkciwgYWRkciwgbGVuLCBydyk7CisgIAorICBmcmVlX2RlYnVnX3JlZ2lzdGVyID0gaTsKKyAgcmVnaXN0ZXJfbnVtYmVyID0gZnJlZV9kZWJ1Z19yZWdpc3RlciAtIERSX0ZJUlNUQUREUjsKKyAgZGVidWdfY29udHJvbF9taXJyb3IgfD0KKyAgICAoKHJlYWRfd3JpdGVfYml0cyB8IGxlbl9iaXRzKQorICAgICA8PCAoRFJfQ09OVFJPTF9TSElGVCArIERSX0NPTlRST0xfU0laRSAqIHJlZ2lzdGVyX251bWJlcikpOworICBkZWJ1Z19jb250cm9sX21pcnJvciB8PQorICAgICgxIDw8IChEUl9MT0NBTF9FTkFCTEVfU0hJRlQgKyBEUl9FTkFCTEVfU0laRSAqIHJlZ2lzdGVyX251bWJlcikpOworICBkZWJ1Z19jb250cm9sX21pcnJvciB8PSBEUl9MT0NBTF9TTE9XRE9XTjsKKyAgZGVidWdfY29udHJvbF9taXJyb3IgJj0gfkRSX0NPTlRST0xfUkVTRVJWRUQ7CisgIAorICBwdHJhY2UgKDYsIHBpZCwgb2Zmc2V0b2YgKHN0cnVjdCB1c2VyLCB1X2RlYnVncmVnW0RSX0NPTlRST0xdKSwKKwkgIGRlYnVnX2NvbnRyb2xfbWlycm9yKTsKKyAgcHRyYWNlICg2LCBwaWQsIG9mZnNldG9mIChzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1tmcmVlX2RlYnVnX3JlZ2lzdGVyXSksCisJICBhZGRyKTsKKworICAvKiBSZWNvcmQgd2hlcmUgd2UgY2FtZSBmcm9tLiAgKi8KKyAgYWRkcmVzc19sb29rdXBbcmVnaXN0ZXJfbnVtYmVyXSA9IGFkZHI7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpMzg2X2luc2VydF9ub25hbGlnbmVkX3dhdGNocG9pbnQgKHBpZCwgd2FkZHIsIGFkZHIsIGxlbiwgcncpCisgICAgIGludCBwaWQ7CisgICAgIENPUkVfQUREUiB3YWRkcjsKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGludCBsZW47CisgICAgIGludCBydzsKK3sKKyAgaW50IGFsaWduOworICBpbnQgc2l6ZTsKKyAgaW50IHJ2OworCisgIHN0YXRpYyBpbnQgc2l6ZV90cnlfYXJyYXlbMTZdID0geworICAgIDEsIDEsIDEsIDEsCQkJLyogdHJ5aW5nIHNpemUgb25lICovCisgICAgMiwgMSwgMiwgMSwJCQkvKiB0cnlpbmcgc2l6ZSB0d28gKi8KKyAgICAyLCAxLCAyLCAxLAkJCS8qIHRyeWluZyBzaXplIHRocmVlICovCisgICAgNCwgMSwgMiwgMQkJCS8qIHRyeWluZyBzaXplIGZvdXIgKi8KKyAgfTsKKworICBydiA9IDA7CisgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgIGFsaWduID0gYWRkciAlIDQ7CisgICAgICAvKiBGb3VyIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgMzg2LiAgKi8KKyAgICAgIHNpemUgPSAobGVuID4gNCkgPyAzIDogbGVuIC0gMTsKKyAgICAgIHNpemUgPSBzaXplX3RyeV9hcnJheVtzaXplICogNCArIGFsaWduXTsKKworICAgICAgcnYgPSBpMzg2X2luc2VydF9hbGlnbmVkX3dhdGNocG9pbnQgKHBpZCwgd2FkZHIsIGFkZHIsIHNpemUsIHJ3KTsKKyAgICAgIGlmIChydikKKwl7CisJICBpMzg2X3JlbW92ZV93YXRjaHBvaW50IChwaWQsIHdhZGRyLCBzaXplKTsKKwkgIHJldHVybiBydjsKKwl9CisgICAgICBhZGRyICs9IHNpemU7CisgICAgICBsZW4gLT0gc2l6ZTsKKyAgICB9CisgIHJldHVybiBydjsKK30KKworLyogUmVtb3ZlIGEgd2F0Y2hwb2ludC4gICovCisKK2ludAoraTM4Nl9yZW1vdmVfd2F0Y2hwb2ludCAocGlkLCBhZGRyLCBsZW4pCisgICAgIGludCBwaWQ7CisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBpbnQgbGVuOworeworICBpbnQgaTsKKyAgaW50IHJlZ2lzdGVyX251bWJlcjsKKworICBmb3IgKGkgPSBEUl9GSVJTVEFERFI7IGkgPD0gRFJfTEFTVEFERFI7IGkrKykKKyAgICB7CisgICAgICByZWdpc3Rlcl9udW1iZXIgPSBpIC0gRFJfRklSU1RBRERSOworICAgICAgaWYgKGFkZHJlc3NfbG9va3VwW3JlZ2lzdGVyX251bWJlcl0gPT0gYWRkcikKKwl7CisJICBkZWJ1Z19jb250cm9sX21pcnJvciAmPQorCSAgICB+KDEgPDwgKERSX0xPQ0FMX0VOQUJMRV9TSElGVCArIERSX0VOQUJMRV9TSVpFICogcmVnaXN0ZXJfbnVtYmVyKSk7CisJICBhZGRyZXNzX2xvb2t1cFtyZWdpc3Rlcl9udW1iZXJdID0gMDsKKwl9CisgICAgfQorICBwdHJhY2UgKDYsIHBpZCwgb2Zmc2V0b2YgKHN0cnVjdCB1c2VyLCB1X2RlYnVncmVnW0RSX0NPTlRST0xdKSwKKwkgIGRlYnVnX2NvbnRyb2xfbWlycm9yKTsKKyAgcHRyYWNlICg2LCBwaWQsIG9mZnNldG9mIChzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1tEUl9TVEFUVVNdKSwgMCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIENoZWNrIGlmIHN0b3BwZWQgYnkgYSB3YXRjaHBvaW50LiAgKi8KKworQ09SRV9BRERSCitpMzg2X3N0b3BwZWRfYnlfd2F0Y2hwb2ludCAocGlkKQorICAgIGludCBwaWQ7Cit7CisgIGludCBpOworICBpbnQgc3RhdHVzOworCisgIHN0YXR1cyA9IHB0cmFjZSAoMywgcGlkLCBvZmZzZXRvZiAoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbRFJfU1RBVFVTXSksIDApOworICBwdHJhY2UgKDYsIHBpZCwgb2Zmc2V0b2YgKHN0cnVjdCB1c2VyLCB1X2RlYnVncmVnW0RSX1NUQVRVU10pLCAwKTsKKworICBmb3IgKGkgPSBEUl9GSVJTVEFERFI7IGkgPD0gRFJfTEFTVEFERFI7IGkrKykKKyAgICB7CisgICAgICBpZiAoc3RhdHVzICYgKDEgPDwgKGkgLSBEUl9GSVJTVEFERFIpKSkKKwlyZXR1cm4gYWRkcmVzc19sb29rdXBbaSAtIERSX0ZJUlNUQUREUl07CisgICAgfQorCisgIHJldHVybiAwOworfQorCisjZW5kaWYgLyogVEFSR0VUX0hBU19IQVJEV0FSRV9XQVRDSFBPSU5UUyAqLworCisjaWYgMAorLyogdXNpbmcgRkxPQVRfSU5GTyBhcyBpcyB3b3VsZCBiZSBhIHByb2JsZW0uICBGTE9BVF9JTkZPIGlzIGNhbGxlZAorICAgdmlhIGEgY29tbWFuZCB4eHggYW5kIGV2ZW50dWFsbHkgY2FsbHMgcHRyYWNlIHdpdGhvdXQgZXZlciBoYXZpbmcKKyAgIHRyYXZlcnNlZCB0aGUgdGFyZ2V0IHZlY3Rvci4gIFRoaXMgd291bGQgYmUgdGVycmlibHkgaW1wb2xpdGUKKyAgIGJlaGF2aW91ciBmb3IgYSBzdW40IGhvc3RlZCByZW1vdGUgZ2RiLgorCisgICBBIGZpeCBtaWdodCBiZSB0byBtb3ZlIHRoaXMgY29kZSBpbnRvIHRoZSAiaW5mbyByZWdpc3RlcnMiIGNvbW1hbmQuCisgICByaWNoQGN5Z251cy5jb20gMTUgU2VwdCA5Mi4gKi8KK2kzODZfZmxvYXRfaW5mbyAoKQoreworICBzdHJ1Y3QgdXNlciB1OyAvKiBqdXN0IGZvciBhZGRyZXNzIGNvbXB1dGF0aW9ucyAqLworICBpbnQgaTsKKyAgLyogZnBzdGF0ZSBkZWZpbmVkIGluIDxzeXMvdXNlci5oPiAqLworICBzdHJ1Y3QgZnBzdGF0ZSAqZnBzdGF0ZXA7CisgIGNoYXIgYnVmW3NpemVvZiAoc3RydWN0IGZwc3RhdGUpICsgMiAqIHNpemVvZiAoaW50KV07CisgIHVuc2lnbmVkIGludCB1YWRkcjsKKyAgY2hhciBmcHZhbGlkID0gMDsKKyAgdW5zaWduZWQgaW50IHJvdW5kZWRfYWRkcjsKKyAgdW5zaWduZWQgaW50IHJvdW5kZWRfc2l6ZTsKKyAgZXh0ZXJuIGludCBjb3JlY2hhbjsKKyAgaW50IHNraXA7CisgIAorICB1YWRkciA9IChjaGFyICopJnUudV9mcHZhbGlkIC0gKGNoYXIgKikmdTsKKyAgaWYgKHRhcmdldF9oYXNfZXhlY3V0aW9uKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBkYXRhOworICAgICAgdW5zaWduZWQgaW50IG1hc2s7CisgICAgICAKKyAgICAgIHJvdW5kZWRfYWRkciA9IHVhZGRyICYgLXNpemVvZiAoaW50KTsKKyAgICAgIGRhdGEgPSBwdHJhY2UgKDMsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIHJvdW5kZWRfYWRkciwgMCk7CisgICAgICBtYXNrID0gMHhmZiA8PCAoKHVhZGRyIC0gcm91bmRlZF9hZGRyKSAqIDgpOworICAgICAgCisgICAgICBmcHZhbGlkID0gKChkYXRhICYgbWFzaykgIT0gMCk7CisgICAgfSAKKyNpZiAwCisgIGVsc2UgCisgICAgeworICAgICAgaWYgKGxzZWVrIChjb3JlY2hhbiwgdWFkZHIsIDApIDwgMCkKKwlwZXJyb3IgKCJzZWVrIG9uIGNvcmUgZmlsZSIpOworICAgICAgaWYgKG15cmVhZCAoY29yZWNoYW4sICZmcHZhbGlkLCAxKSA8IDApIAorCXBlcnJvciAoInJlYWQgb24gY29yZSBmaWxlIik7CisgICAgICAKKyAgICB9CisjZW5kaWYJLyogbm8gY29yZSBzdXBwb3J0IHlldCAqLworICAKKyAgaWYgKGZwdmFsaWQgPT0gMCkgCisgICAgeworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJubyBmbG9hdGluZyBwb2ludCBzdGF0dXMgc2F2ZWRcbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgCisgIHVhZGRyID0gKGNoYXIgKikmVV9GUFNUQVRFKHUpIC0gKGNoYXIgKikmdTsKKyAgaWYgKHRhcmdldF9oYXNfZXhlY3V0aW9uKQorICAgIHsKKyAgICAgIGludCAqaXA7CisgICAgICAKKyAgICAgIHJvdW5kZWRfYWRkciA9IHVhZGRyICYgLXNpemVvZiAoaW50KTsKKyAgICAgIHJvdW5kZWRfc2l6ZSA9ICgoKHVhZGRyICsgc2l6ZW9mIChzdHJ1Y3QgZnBzdGF0ZSkpIC0gdWFkZHIpICsKKwkJICAgICAgc2l6ZW9mIChpbnQpIC0gMSkgLyBzaXplb2YgKGludCk7CisgICAgICBza2lwID0gdWFkZHIgLSByb3VuZGVkX2FkZHI7CisgICAgICAKKyAgICAgIGlwID0gKGludCAqKWJ1ZjsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCByb3VuZGVkX3NpemU7IGkrKykgCisJeworCSAgKmlwKysgPSBwdHJhY2UgKDMsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIHJvdW5kZWRfYWRkciwgMCk7CisJICByb3VuZGVkX2FkZHIgKz0gc2l6ZW9mIChpbnQpOworCX0KKyAgICB9IAorI2lmIDAKKyAgZWxzZSAKKyAgICB7CisgICAgICBpZiAobHNlZWsgKGNvcmVjaGFuLCB1YWRkciwgMCkgPCAwKQorCXBlcnJvcl93aXRoX25hbWUgKCJzZWVrIG9uIGNvcmUgZmlsZSIpOworICAgICAgaWYgKG15cmVhZCAoY29yZWNoYW4sIGJ1Ziwgc2l6ZW9mIChzdHJ1Y3QgZnBzdGF0ZSkpIDwgMCkgCisJcGVycm9yX3dpdGhfbmFtZSAoInJlYWQgZnJvbSBjb3JlIGZpbGUiKTsKKyAgICAgIHNraXAgPSAwOworICAgIH0KKyNlbmRpZgkvKiAwICovIAorCisgIGZwc3RhdGVwID0gKHN0cnVjdCBmcHN0YXRlICopKGJ1ZiArIHNraXApOworICBwcmludF8zODdfc3RhdHVzIChmcHN0YXRlcC0+c3RhdHVzLCAoc3RydWN0IGVudjM4NyAqKWZwc3RhdGVwLT5zdGF0ZSk7Cit9CisKKyNlbmRpZiAvKiBuZXZlciAqLwpkaWZmIC0tZ2l0IGEvZ2RiL2kzODZ2NC1uYXQuYyBiL2dkYi9pMzg2djQtbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4NGM2NQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9pMzg2djQtbmF0LmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qIE5hdGl2ZS1kZXBlbmRlbnQgY29kZSBmb3IgU1ZSNCBVbml4IHJ1bm5pbmcgb24gaTM4NidzLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5ODgsIDE5ODksIDE5OTEsIDE5OTIsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorCisjaWZkZWYgSEFWRV9TWVNfUkVHX0gKKyNpbmNsdWRlIDxzeXMvcmVnLmg+CisjZW5kaWYKKworCisjaWZkZWYgSEFWRV9TWVNfUFJPQ0ZTX0gKKworI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KKworLyogIFRoZSAvcHJvYyBpbnRlcmZhY2UgZGl2aWRlcyB0aGUgdGFyZ2V0IG1hY2hpbmUncyByZWdpc3RlciBzZXQgdXAgaW50bworICAgIHR3byBkaWZmZXJlbnQgc2V0cywgdGhlIGdlbmVyYWwgcmVnaXN0ZXIgc2V0IChncmVnc2V0KSBhbmQgdGhlIGZsb2F0aW5nCisgICAgcG9pbnQgcmVnaXN0ZXIgc2V0IChmcHJlZ3NldCkuICBGb3IgZWFjaCBzZXQsIHRoZXJlIGlzIGFuIGlvY3RsIHRvIGdldAorICAgIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHNldCBhbmQgYW5vdGhlciBpb2N0bCB0byBzZXQgdGhlIGN1cnJlbnQgdmFsdWVzLgorCisgICAgVGhlIGFjdHVhbCBzdHJ1Y3R1cmUgcGFzc2VkIHRocm91Z2ggdGhlIGlvY3RsIGludGVyZmFjZSBpcywgb2YgY291cnNlLAorICAgIG5hdHVyYWxseSBtYWNoaW5lIGRlcGVuZGVudCwgYW5kIGlzIGRpZmZlcmVudCBmb3IgZWFjaCBzZXQgb2YgcmVnaXN0ZXJzLgorICAgIEZvciB0aGUgaTM4NiBmb3IgZXhhbXBsZSwgdGhlIGdlbmVyYWwgcmVnaXN0ZXIgc2V0IGlzIHR5cGljYWxseSBkZWZpbmVkCisgICAgYnk6CisKKwl0eXBlZGVmIGludCBncmVnc2V0X3RbMTldOwkJKGluIDxzeXMvcmVnc2V0Lmg+KQorCisJI2RlZmluZSBHUwkwCQkJKGluIDxzeXMvcmVnLmg+KQorCSNkZWZpbmUgRlMJMQorCS4uLgorCSNkZWZpbmUgVUVTUAkxNworCSNkZWZpbmUgU1MJMTgKKworICAgIGFuZCB0aGUgZmxvYXRpbmcgcG9pbnQgc2V0IGJ5OgorCisJdHlwZWRlZiBzdHJ1Y3QgZnByZWdzZXQKKwkgIHsKKwkgICAgdW5pb24KKwkgICAgICB7CisJCXN0cnVjdCBmcGNoaXBfc3RhdGUJLy8gZnAgZXh0ZW5zaW9uIHN0YXRlIC8vCisJCXsKKwkJICBpbnQgc3RhdGVbMjddOwkvLyAyODcvMzg3IHNhdmVkIHN0YXRlIC8vCisJCSAgaW50IHN0YXR1czsJCS8vIHN0YXR1cyB3b3JkIHNhdmVkIGF0IGV4Y2VwdGlvbiAvLworCQl9IGZwY2hpcF9zdGF0ZTsKKwkJc3RydWN0IGZwX2VtdWxfc3BhY2UJLy8gZm9yIGVtdWxhdG9ycyAvLworCQl7CisJCSAgY2hhciBmcF9lbXVsWzI0Nl07CisJCSAgY2hhciBmcF9lcGFkWzJdOworCQl9IGZwX2VtdWxfc3BhY2U7CisJCWludCBmX2ZwcmVnc1s2Ml07CS8vIHVuaW9uIG9mIHRoZSBhYm92ZSAvLworCSAgICAgIH0gZnBfcmVnX3NldDsKKwkgICAgbG9uZyBmX3dyZWdzWzMzXTsJCS8vIHNhdmVkIHdlaXRlayBzdGF0ZSAvLworCX0gZnByZWdzZXRfdDsKKworICAgIFRoZXNlIHJvdXRpbmVzIHByb3ZpZGUgdGhlIHBhY2tpbmcgYW5kIHVucGFja2luZyBvZiBncmVnc2V0X3QgYW5kCisgICAgZnByZWdzZXRfdCBmb3JtYXR0ZWQgZGF0YS4KKworICovCisKKyNpZmRlZiBIQVZFX0dSRUdTRVRfVAorCisvKiBUaGlzIGlzIGEgZHVwbGljYXRlIG9mIHRoZSB0YWJsZSBpbiBpMzg2LXhkZXAuYy4gKi8KKworc3RhdGljIGludCByZWdtYXBbXSA9IAoreworICBFQVgsIEVDWCwgRURYLCBFQlgsCisgIFVFU1AsIEVCUCwgRVNJLCBFREksCisgIEVJUCwgRUZMLCBDUywgU1MsCisgIERTLCBFUywgRlMsIEdTLAorfTsKKworLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zICovCisKK3ZvaWQgZmlsbF9ncmVnc2V0IFBBUkFNUyAoKGdyZWdzZXRfdCAqLCBpbnQpKTsKKwordm9pZCBzdXBwbHlfZ3JlZ3NldCBQQVJBTVMgKChncmVnc2V0X3QgKikpOworCit2b2lkIHN1cHBseV9mcHJlZ3NldCBQQVJBTVMgKChmcHJlZ3NldF90ICopKTsKKwordm9pZCBmaWxsX2ZwcmVnc2V0IFBBUkFNUyAoKGZwcmVnc2V0X3QgKiwgaW50KSk7CisKKworLyogIEZJWE1FOiAgVGhlc2Ugcm91dGluZSBhYnNvbHV0ZWx5IGRlcGVuZHMgdXBvbiAoTlVNX1JFR1MgLSBOVU1fRlJFR1MpCisgICAgYmVpbmcgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIHRoYXQgY2FuIGJlIHN0b3JlZAorICAgIGluIGEgZ3JlZ3NldF90LiAgTm90ZSB0aGF0IHdpdGggdGhlIGN1cnJlbnQgc2NoZW1lIHRoZXJlIHdpbGwgdHlwaWNhbGx5CisgICAgYmUgbW9yZSByZWdpc3RlcnMgYWN0dWFsbHkgc3RvcmVkIGluIGEgZ3JlZ3NldF90IHRoYXQgd2hhdCB3ZSBrbm93CisgICAgYWJvdXQuICBUaGlzIGlzIGJvZ3VzIGFuZCBzaG91bGQgYmUgZml4ZWQuICovCisKKy8qICBHaXZlbiBhIHBvaW50ZXIgdG8gYSBnZW5lcmFsIHJlZ2lzdGVyIHNldCBpbiAvcHJvYyBmb3JtYXQgKGdyZWdzZXRfdCAqKSwKKyAgICB1bnBhY2sgdGhlIHJlZ2lzdGVyIGNvbnRlbnRzIGFuZCBzdXBwbHkgdGhlbSBhcyBnZGIncyBpZGVhIG9mIHRoZSBjdXJyZW50CisgICAgcmVnaXN0ZXIgdmFsdWVzLiAqLworCit2b2lkCitzdXBwbHlfZ3JlZ3NldCAoZ3JlZ3NldHApCisgICAgIGdyZWdzZXRfdCAqZ3JlZ3NldHA7Cit7CisgIHJlZ2lzdGVyIGludCByZWdpOworICByZWdpc3RlciBncmVnX3QgKnJlZ3AgPSAoZ3JlZ190ICopIGdyZWdzZXRwOworICBleHRlcm4gaW50IHJlZ21hcFtdOworCisgIGZvciAocmVnaSA9IDAgOyByZWdpIDwgKE5VTV9SRUdTIC0gTlVNX0ZSRUdTKSA7IHJlZ2krKykKKyAgICB7CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ2ksIChjaGFyICopIChyZWdwICsgcmVnbWFwW3JlZ2ldKSk7CisgICAgfQorfQorCit2b2lkCitmaWxsX2dyZWdzZXQgKGdyZWdzZXRwLCByZWdubykKKyAgICAgZ3JlZ3NldF90ICpncmVnc2V0cDsKKyAgICAgaW50IHJlZ25vOworeworICBpbnQgcmVnaTsKKyAgcmVnaXN0ZXIgZ3JlZ190ICpyZWdwID0gKGdyZWdfdCAqKSBncmVnc2V0cDsKKyAgZXh0ZXJuIGNoYXIgcmVnaXN0ZXJzW107CisgIGV4dGVybiBpbnQgcmVnbWFwW107CisKKyAgZm9yIChyZWdpID0gMCA7IHJlZ2kgPCAoTlVNX1JFR1MgLSBOVU1fRlJFR1MpIDsgcmVnaSsrKQorICAgIHsKKyAgICAgIGlmICgocmVnbm8gPT0gLTEpIHx8IChyZWdubyA9PSByZWdpKSkKKwl7CisJICAqKHJlZ3AgKyByZWdtYXBbcmVnaV0pID0gKihpbnQgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdpKV07CisJfQorICAgIH0KK30KKworI2VuZGlmCS8qIEhBVkVfR1JFR1NFVF9UICovCisKKyNpZiBkZWZpbmVkIChGUDBfUkVHTlVNKSAmJiBkZWZpbmVkIChIQVZFX0ZQUkVHU0VUX1QpCisKKy8qICBHaXZlbiBhIHBvaW50ZXIgdG8gYSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBzZXQgaW4gL3Byb2MgZm9ybWF0CisgICAgKGZwcmVnc2V0X3QgKiksIHVucGFjayB0aGUgcmVnaXN0ZXIgY29udGVudHMgYW5kIHN1cHBseSB0aGVtIGFzIGdkYidzCisgICAgaWRlYSBvZiB0aGUgY3VycmVudCBmbG9hdGluZyBwb2ludCByZWdpc3RlciB2YWx1ZXMuICovCisKK3ZvaWQgCitzdXBwbHlfZnByZWdzZXQgKGZwcmVnc2V0cCkKKyAgICAgZnByZWdzZXRfdCAqZnByZWdzZXRwOworeworICAvKiBGSVhNRTogc2VlIG02OGstdGRlcC5jIGZvciBhbiBleGFtcGxlLCBmb3IgdGhlIG02OGsuICovCit9CisKKy8qICBHaXZlbiBhIHBvaW50ZXIgdG8gYSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBzZXQgaW4gL3Byb2MgZm9ybWF0CisgICAgKGZwcmVnc2V0X3QgKiksIHVwZGF0ZSB0aGUgcmVnaXN0ZXIgc3BlY2lmaWVkIGJ5IFJFR05PIGZyb20gZ2RiJ3MgaWRlYQorICAgIG9mIHRoZSBjdXJyZW50IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHNldC4gIElmIFJFR05PIGlzIC0xLCB1cGRhdGUKKyAgICB0aGVtIGFsbC4gKi8KKwordm9pZAorZmlsbF9mcHJlZ3NldCAoZnByZWdzZXRwLCByZWdubykKKyAgICAgZnByZWdzZXRfdCAqZnByZWdzZXRwOworICAgICBpbnQgcmVnbm87Cit7CisgIC8qIEZJWE1FOiBzZWUgbTY4ay10ZGVwLmMgZm9yIGFuIGV4YW1wbGUsIGZvciB0aGUgbTY4ay4gKi8KK30KKworI2VuZGlmCS8qIGRlZmluZWQgKEZQMF9SRUdOVU0pICYmIGRlZmluZWQgKEhBVkVfRlBSRUdTRVRfVCkgKi8KKworI2VuZGlmCS8qIEhBVkVfU1lTX1BST0NGU19IICovCmRpZmYgLS1naXQgYS9nZGIvaTM4Ny10ZGVwLmMgYi9nZGIvaTM4Ny10ZGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY5YWI5YQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9pMzg3LXRkZXAuYwpAQCAtMCwwICsxLDExMSBAQAorLyogSW50ZWwgMzg3IGZsb2F0aW5nIHBvaW50IHN0dWZmLgorICAgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTg5LCAxOTkxLCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImZsb2F0Zm9ybWF0LmgiCisKK3ZvaWQgaTM4N190b19kb3VibGUgUEFSQU1TICgoY2hhciAqLCBjaGFyICopKTsKKwordm9pZCBkb3VibGVfdG9faTM4NyBQQVJBTVMgKChjaGFyICosIGNoYXIgKikpOworCisvKiBGSVhNRTogIEVsaW1pbmF0ZSB0aGVzZSByb3V0aW5lcyB3aGVuIHdlIGhhdmUgdGhlIHRpbWUgdG8gY2hhbmdlIGFsbAorICAgdGhlIGNhbGxlcnMuICAqLworCit2b2lkCitpMzg3X3RvX2RvdWJsZSAoZnJvbSwgdG8pCisgICAgIGNoYXIgKmZyb207CisgICAgIGNoYXIgKnRvOworeworICBmbG9hdGZvcm1hdF90b19kb3VibGUgKCZmbG9hdGZvcm1hdF9pMzg3X2V4dCwgZnJvbSwgKGRvdWJsZSAqKXRvKTsKK30KKwordm9pZAorZG91YmxlX3RvX2kzODcgKGZyb20sIHRvKQorICAgICBjaGFyICpmcm9tOworICAgICBjaGFyICp0bzsKK3sKKyAgZmxvYXRmb3JtYXRfZnJvbV9kb3VibGUgKCZmbG9hdGZvcm1hdF9pMzg3X2V4dCwgKGRvdWJsZSAqKWZyb20sIHRvKTsKK30KKwordm9pZAorcHJpbnRfMzg3X2NvbnRyb2xfd29yZCAoY29udHJvbCkKKyAgICAgdW5zaWduZWQgaW50IGNvbnRyb2w7Cit7CisgIHByaW50Zl91bmZpbHRlcmVkICgiY29udHJvbCAlczogIiwgbG9jYWxfaGV4X3N0cmluZyhjb250cm9sKSk7CisgIHByaW50Zl91bmZpbHRlcmVkICgiY29tcHV0ZSB0byAiKTsKKyAgc3dpdGNoICgoY29udHJvbCA+PiA4KSAmIDMpIAorICAgIHsKKyAgICBjYXNlIDA6IHByaW50Zl91bmZpbHRlcmVkICgiMjQgYml0czsgIik7IGJyZWFrOworICAgIGNhc2UgMTogcHJpbnRmX3VuZmlsdGVyZWQgKCIoYmFkKTsgIik7IGJyZWFrOworICAgIGNhc2UgMjogcHJpbnRmX3VuZmlsdGVyZWQgKCI1MyBiaXRzOyAiKTsgYnJlYWs7CisgICAgY2FzZSAzOiBwcmludGZfdW5maWx0ZXJlZCAoIjY0IGJpdHM7ICIpOyBicmVhazsKKyAgICB9CisgIHByaW50Zl91bmZpbHRlcmVkICgicm91bmQgIik7CisgIHN3aXRjaCAoKGNvbnRyb2wgPj4gMTApICYgMykgCisgICAgeworICAgIGNhc2UgMDogcHJpbnRmX3VuZmlsdGVyZWQgKCJORUFSRVNUOyAiKTsgYnJlYWs7CisgICAgY2FzZSAxOiBwcmludGZfdW5maWx0ZXJlZCAoIkRPV047ICIpOyBicmVhazsKKyAgICBjYXNlIDI6IHByaW50Zl91bmZpbHRlcmVkICgiVVA7ICIpOyBicmVhazsKKyAgICBjYXNlIDM6IHByaW50Zl91bmZpbHRlcmVkICgiQ0hPUDsgIik7IGJyZWFrOworICAgIH0KKyAgaWYgKGNvbnRyb2wgJiAweDNmKSAKKyAgICB7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIm1hc2s6Iik7CisgICAgICBpZiAoY29udHJvbCAmIDB4MDAwMSkgcHJpbnRmX3VuZmlsdGVyZWQgKCIgSU5WQUxJRCIpOworICAgICAgaWYgKGNvbnRyb2wgJiAweDAwMDIpIHByaW50Zl91bmZpbHRlcmVkICgiIERFTk9STSIpOworICAgICAgaWYgKGNvbnRyb2wgJiAweDAwMDQpIHByaW50Zl91bmZpbHRlcmVkICgiIERJVloiKTsKKyAgICAgIGlmIChjb250cm9sICYgMHgwMDA4KSBwcmludGZfdW5maWx0ZXJlZCAoIiBPVkVSRiIpOworICAgICAgaWYgKGNvbnRyb2wgJiAweDAwMTApIHByaW50Zl91bmZpbHRlcmVkICgiIFVOREVSRiIpOworICAgICAgaWYgKGNvbnRyb2wgJiAweDAwMjApIHByaW50Zl91bmZpbHRlcmVkICgiIExPUyIpOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCI7Iik7CisgICAgfQorICBwcmludGZfdW5maWx0ZXJlZCAoIlxuIik7CisgIGlmIChjb250cm9sICYgMHhlMDgwKSB3YXJuaW5nICgicmVzZXJ2ZWQgYml0cyBvbjogJXNcbiIsCisJCQkJbG9jYWxfaGV4X3N0cmluZyhjb250cm9sICYgMHhlMDgwKSk7Cit9CisKK3ZvaWQKK3ByaW50XzM4N19zdGF0dXNfd29yZCAoc3RhdHVzKQorICAgICB1bnNpZ25lZCBpbnQgc3RhdHVzOworeworICBwcmludGZfdW5maWx0ZXJlZCAoInN0YXR1cyAlczogIiwgbG9jYWxfaGV4X3N0cmluZyAoc3RhdHVzKSk7CisgIGlmIChzdGF0dXMgJiAweGZmKSAKKyAgICB7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoImV4Y2VwdGlvbnM6Iik7CisgICAgICBpZiAoc3RhdHVzICYgMHgwMDAxKSBwcmludGZfdW5maWx0ZXJlZCAoIiBJTlZBTElEIik7CisgICAgICBpZiAoc3RhdHVzICYgMHgwMDAyKSBwcmludGZfdW5maWx0ZXJlZCAoIiBERU5PUk0iKTsKKyAgICAgIGlmIChzdGF0dXMgJiAweDAwMDQpIHByaW50Zl91bmZpbHRlcmVkICgiIERJVloiKTsKKyAgICAgIGlmIChzdGF0dXMgJiAweDAwMDgpIHByaW50Zl91bmZpbHRlcmVkICgiIE9WRVJGIik7CisgICAgICBpZiAoc3RhdHVzICYgMHgwMDEwKSBwcmludGZfdW5maWx0ZXJlZCAoIiBVTkRFUkYiKTsKKyAgICAgIGlmIChzdGF0dXMgJiAweDAwMjApIHByaW50Zl91bmZpbHRlcmVkICgiIExPUyIpOworICAgICAgaWYgKHN0YXR1cyAmIDB4MDA0MCkgcHJpbnRmX3VuZmlsdGVyZWQgKCIgRlBTVEFDSyIpOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCI7ICIpOworICAgIH0KKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJmbGFnczogJWQlZCVkJWQ7ICIsCisJICAoc3RhdHVzICYgMHg0MDAwKSAhPSAwLAorCSAgKHN0YXR1cyAmIDB4MDQwMCkgIT0gMCwKKwkgIChzdGF0dXMgJiAweDAyMDApICE9IDAsCisJICAoc3RhdHVzICYgMHgwMTAwKSAhPSAwKTsKKworICBwcmludGZfdW5maWx0ZXJlZCAoInRvcCAlZFxuIiwgKHN0YXR1cyA+PiAxMSkgJiA3KTsKK30KZGlmZiAtLWdpdCBhL2dkYi9pOTYwLXRkZXAuYyBiL2dkYi9pOTYwLXRkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzM0MTVkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2k5NjAtdGRlcC5jCkBAIC0wLDAgKzEsODM4IEBACisvKiBUYXJnZXQtbWFjaGluZSBkZXBlbmRlbnQgY29kZSBmb3IgdGhlIEludGVsIDk2MAorICAgQ29weXJpZ2h0IDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgIGV4YW1pbmVfcHJvbG9ndWUgYW5kIG90aGVyIHBhcnRzIGNvbnRyaWJ1dGVkIGJ5IFdpbmQgUml2ZXIgU3lzdGVtcy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJmbG9hdGZvcm1hdC5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKworc3RhdGljIENPUkVfQUREUiBuZXh0X2luc24gUEFSQU1TICgoQ09SRV9BRERSIG1lbWFkZHIsCisJCQkJICAgIHVuc2lnbmVkIGludCAqcHdvcmQxLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKnB3b3JkMikpOworCisvKiBEb2VzIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gdXNlIHRoZSAic3RydWN0IHJldHVybmluZyIgY29udmVudGlvbgorICAgb3IgdGhlICJ2YWx1ZSByZXR1cm5pbmciIGNvbnZlbnRpb24/ICBUaGUgInZhbHVlIHJldHVybmluZyIgY29udmVudGlvbgorICAgYWxtb3N0IGludmFyaWFibHkgcmV0dXJucyB0aGUgZW50aXJlIHZhbHVlIGluIHJlZ2lzdGVycy4gIFRoZQorICAgInN0cnVjdCByZXR1cm5pbmciIGNvbnZlbnRpb24gb2Z0ZW4gcmV0dXJucyB0aGUgZW50aXJlIHZhbHVlIGluCisgICBtZW1vcnksIGFuZCBwYXNzZXMgYSBwb2ludGVyIChvdXQgb2Ygb3IgaW50byB0aGUgZnVuY3Rpb24pIHNheWluZworICAgd2hlcmUgdGhlIHZhbHVlIChpcyBvciBzaG91bGQgZ28pLgorCisgICBTaW5jZSB0aGlzIHNvbWV0aW1lcyBkZXBlbmRzIG9uIHdoZXRoZXIgaXQgd2FzIGNvbXBpbGVkIHdpdGggR0NDLAorICAgdGhpcyBpcyBhbHNvIGFuIGFyZ3VtZW50LiAgVGhpcyBpcyB1c2VkIGluIGNhbGxfZnVuY3Rpb24gdG8gYnVpbGQgYQorICAgc3RhY2ssIGFuZCBpbiB2YWx1ZV9iZWluZ19yZXR1cm5lZCB0byBwcmludCByZXR1cm4gdmFsdWVzLgorCisgICBPbiBpOTYwLCBhIHN0cnVjdHVyZSBpcyByZXR1cm5lZCBpbiByZWdpc3RlcnMgZzAtZzMsIGlmIGl0IHdpbGwgZml0LgorICAgSWYgaXQncyBtb3JlIHRoYW4gMTYgYnl0ZXMgbG9uZywgZzEzIHBvaW50ZWQgdG8gaXQgb24gZW50cnkuICAqLworCitpbnQKK2k5NjBfdXNlX3N0cnVjdF9jb252ZW50aW9uIChnY2NfcCwgdHlwZSkKKyAgICAgaW50IGdjY19wOworICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgcmV0dXJuIChUWVBFX0xFTkdUSCAodHlwZSkgPiAxNik7Cit9CisKKy8qIGdkYjk2MCBpcyBhbHdheXMgcnVubmluZyBvbiBhIG5vbi05NjAgaG9zdC4gIENoZWNrIGl0cyBjaGFyYWN0ZXJpc3RpY3MuCisgICBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYXMgcGFydCBvZiBnZGIgaW5pdGlhbGl6YXRpb24uICAqLworCitzdGF0aWMgdm9pZAorY2hlY2tfaG9zdCgpCit7CisJaW50IGk7CisKKwlzdGF0aWMgc3RydWN0IHR5cGVzdHJ1Y3QgeworCQlpbnQgaG9zdHNpemU7CQkvKiBTaXplIG9mIHR5cGUgb24gaG9zdAkJKi8KKwkJaW50IGk5NjBzaXplOwkJLyogU2l6ZSBvZiB0eXBlIG9uIGk5NjAJCSovCisJCWNoYXIgKnR5cGVuYW1lOwkJLyogTmFtZSBvZiB0eXBlLCBmb3IgZXJyb3IgbXNnCSovCisJfSB0eXBlc1tdID0geworCQl7IHNpemVvZihzaG9ydCksICAyLCAic2hvcnQiIH0sCisJCXsgc2l6ZW9mKGludCksICAgIDQsICJpbnQiIH0sCisJCXsgc2l6ZW9mKGxvbmcpLCAgIDQsICJsb25nIiB9LAorCQl7IHNpemVvZihmbG9hdCksICA0LCAiZmxvYXQiIH0sCisJCXsgc2l6ZW9mKGRvdWJsZSksIDgsICJkb3VibGUiIH0sCisJCXsgc2l6ZW9mKGNoYXIgKiksIDQsICJwb2ludGVyIiB9LAorCX07CisjZGVmaW5lIFRZUEVMRU4JKHNpemVvZih0eXBlcykgLyBzaXplb2Yoc3RydWN0IHR5cGVzdHJ1Y3QpKQorCisJLyogTWFrZSBzdXJlIHRoYXQgaG9zdCB0eXBlIHNpemVzIGFyZSBzYW1lIGFzIGk5NjAKKwkgKi8KKwlmb3IgKCBpID0gMDsgaSA8IFRZUEVMRU47IGkrKyApeworCQlpZiAoIHR5cGVzW2ldLmhvc3RzaXplICE9IHR5cGVzW2ldLmk5NjBzaXplICl7CisJCQlwcmludGZfdW5maWx0ZXJlZCgic2l6ZW9mKCVzKSAhPSAlZDogIFBST0NFRUQgQVQgWU9VUiBPV04gUklTSyFcbiIsCisJCQkJCXR5cGVzW2ldLnR5cGVuYW1lLCB0eXBlc1tpXS5pOTYwc2l6ZSApOworCQl9CisKKwl9Cit9CisMCisvKiBFeGFtaW5lIGFuIGk5NjAgZnVuY3Rpb24gcHJvbG9ndWUsIHJlY29yZGluZyB0aGUgYWRkcmVzc2VzIGF0IHdoaWNoCisgICByZWdpc3RlcnMgYXJlIHNhdmVkIGV4cGxpY2l0bHkgYnkgdGhlIHByb2xvZ3VlIGNvZGUsIGFuZCByZXR1cm5pbmcKKyAgIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBhZnRlciB0aGUgcHJvbG9ndWUgKGJ1dCBub3QKKyAgIGFmdGVyIHRoZSBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzIExJTUlULCBhcyBleHBsYWluZWQgYmVsb3cpLgorCisgICBMSU1JVCBwbGFjZXMgYW4gdXBwZXIgYm91bmQgb24gYWRkcmVzc2VzIG9mIHRoZSBpbnN0cnVjdGlvbnMgdG8gYmUKKyAgIGV4YW1pbmVkLiAgSWYgdGhlIHByb2xvZ3VlIGNvZGUgc2NhbiByZWFjaGVzIExJTUlULCB0aGUgc2NhbiBpcworICAgYWJvcnRlZCBhbmQgTElNSVQgaXMgcmV0dXJuZWQuICBUaGlzIGlzIHVzZWQsIHdoZW4gZXhhbWluaW5nIHRoZQorICAgcHJvbG9ndWUgZm9yIHRoZSBjdXJyZW50IGZyYW1lLCB0byBrZWVwIGV4YW1pbmVfcHJvbG9ndWUgKCkgZnJvbQorICAgY2xhaW1pbmcgdGhhdCBhIGdpdmVuIHJlZ2lzdGVyIGhhcyBiZWVuIHNhdmVkIHdoZW4gaW4gZmFjdCB0aGUKKyAgIGluc3RydWN0aW9uIHRoYXQgc2F2ZXMgaXQgaGFzIG5vdCB5ZXQgYmVlbiBleGVjdXRlZC4gIExJTUlUIGlzIHVzZWQKKyAgIGF0IG90aGVyIHRpbWVzIHRvIHN0b3AgdGhlIHNjYW4gd2hlbiB3ZSBoaXQgY29kZSBhZnRlciB0aGUgdHJ1ZQorICAgZnVuY3Rpb24gcHJvbG9ndWUgKGUuZy4gZm9yIHRoZSBmaXJzdCBzb3VyY2UgbGluZSkgd2hpY2ggbWlnaHQKKyAgIG90aGVyd2lzZSBiZSBtaXN0YWtlbiBmb3IgZnVuY3Rpb24gcHJvbG9ndWUuCisKKyAgIFRoZSBmb3JtYXQgb2YgdGhlIGZ1bmN0aW9uIHByb2xvZ3VlIG1hdGNoZWQgYnkgdGhpcyByb3V0aW5lIGlzCisgICBkZXJpdmVkIGZyb20gZXhhbWluYXRpb24gb2YgdGhlIHNvdXJjZSB0byBnY2M5NjAgMS4yMSwgcGFydGljdWxhcmx5CisgICB0aGUgcm91dGluZSBpOTYwX2Z1bmN0aW9uX3Byb2xvZ3VlICgpLiAgQSAicmVndWxhciBleHByZXNzaW9uIiBmb3IKKyAgIHRoZSBmdW5jdGlvbiBwcm9sb2d1ZSBpcyBnaXZlbiBiZWxvdzoKKworICAgKGxkYSBMUm4sIGcxNAorICAgIG1vdiBnMTQsIGdbMC03XQorICAgIChtb3YgMCwgZzE0KSB8IChsZGEgMCwgZzE0KSk/CisKKyAgIChtb3ZbcXRsXT8gZ1swLTE1XSwgcls0LTE1XSkqCisgICAoKGFkZG8gWzEtMzFdLCBzcCwgc3ApIHwgKGxkYSBuKHNwKSwgc3ApKT8KKyAgIChzdFtxdGxdPyBnWzAtMTVdLCBuKGZwKSkqCisKKyAgIChjbXBvYm5lIDAsIGcxNCwgTEZuCisgICAgbW92IHNwLCBnMTQKKyAgICBsZGEgMHgzMChzcCksIHNwCisgICAgTEZuOiBzdHEgZzAsIChnMTQpCisgICAgc3RxIGc0LCAweDEwKGcxNCkKKyAgICBzdHEgZzgsIDB4MjAoZzE0KSk/CisKKyAgIChzdCBnMTQsIG4oZnApKT8KKyAgIChtb3YgZzEzLHJbNC0xNV0pPworKi8KKworLyogTWFjcm9zIGZvciBleHRyYWN0aW5nIGZpZWxkcyBmcm9tIGk5NjAgaW5zdHJ1Y3Rpb25zLiAgKi8KKworI2RlZmluZSBCSVRNQVNLKHBvcywgd2lkdGgpICgoKDB4MSA8PCAod2lkdGgpKSAtIDEpIDw8IChwb3MpKQorI2RlZmluZSBFWFRSQUNUX0ZJRUxEKHZhbCwgcG9zLCB3aWR0aCkgKCh2YWwpID4+IChwb3MpICYgQklUTUFTSyAoMCwgd2lkdGgpKQorCisjZGVmaW5lIFJFR19TUkMxKGluc24pICAgIEVYVFJBQ1RfRklFTEQgKGluc24sIDAsIDUpCisjZGVmaW5lIFJFR19TUkMyKGluc24pICAgIEVYVFJBQ1RfRklFTEQgKGluc24sIDE0LCA1KQorI2RlZmluZSBSRUdfU1JDRFNUKGluc24pICBFWFRSQUNUX0ZJRUxEIChpbnNuLCAxOSwgNSkKKyNkZWZpbmUgTUVNX1NSQ0RTVChpbnNuKSAgRVhUUkFDVF9GSUVMRCAoaW5zbiwgMTksIDUpCisjZGVmaW5lIE1FTUFfT0ZGU0VUKGluc24pIEVYVFJBQ1RfRklFTEQgKGluc24sIDAsIDEyKQorCisvKiBGZXRjaCB0aGUgaW5zdHJ1Y3Rpb24gYXQgQUREUiwgcmV0dXJuaW5nIDAgaWYgQUREUiBpcyBiZXlvbmQgTElNIG9yCisgICBpcyBub3QgdGhlIGFkZHJlc3Mgb2YgYSB2YWxpZCBpbnN0cnVjdGlvbiwgdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQKKyAgIGluc3RydWN0aW9uIGJleW9uZCBBRERSIG90aGVyd2lzZS4gICpQV09SRDEgcmVjZWl2ZXMgdGhlIGZpcnN0IHdvcmQKKyAgIG9mIHRoZSBpbnN0cnVjdGlvbiwgYW5kIChmb3IgdHdvLXdvcmQgaW5zdHJ1Y3Rpb25zKSwgKlBXT1JEMiByZWNlaXZlcworICAgdGhlIHNlY29uZC4gICovCisKKyNkZWZpbmUgTkVYVF9QUk9MT0dVRV9JTlNOKGFkZHIsIGxpbSwgcHdvcmQxLCBwd29yZDIpIFwKKyAgKCgoYWRkcikgPCAobGltKSkgPyBuZXh0X2luc24gKGFkZHIsIHB3b3JkMSwgcHdvcmQyKSA6IDApCisKK3N0YXRpYyBDT1JFX0FERFIKK2V4YW1pbmVfcHJvbG9ndWUgKGlwLCBsaW1pdCwgZnJhbWVfYWRkciwgZnNyKQorICAgICByZWdpc3RlciBDT1JFX0FERFIgaXA7CisgICAgIHJlZ2lzdGVyIENPUkVfQUREUiBsaW1pdDsKKyAgICAgQ09SRV9BRERSIGZyYW1lX2FkZHI7CisgICAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICpmc3I7Cit7CisgIHJlZ2lzdGVyIENPUkVfQUREUiBuZXh0X2lwOworICByZWdpc3RlciBpbnQgc3JjLCBkc3Q7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCAqcGNvZGU7CisgIHVuc2lnbmVkIGludCBpbnNuMSwgaW5zbjI7CisgIGludCBzaXplOworICBpbnQgd2l0aGluX2xlYWZfcHJvbG9ndWU7CisgIENPUkVfQUREUiBzYXZlX2FkZHI7CisgIHN0YXRpYyB1bnNpZ25lZCBpbnQgdmFyYXJnc19wcm9sb2d1ZV9jb2RlIFtdID0KKyAgICB7CisgICAgICAgMHgzNTA3YTAwYywJLyogY21wb2JuZSAweDAsIGcxNCwgTEZuICovCisgICAgICAgMHg1Y2YwMTYwMSwJLyogbW92IHNwLCBnMTQJCSAqLworICAgICAgIDB4OGMwODYwMzAsCS8qIGxkYSAweDMwKHNwKSwgc3AJICovCisgICAgICAgMHhiMjg3OTAwMCwJLyogTEZuOiBzdHEgIGcwLCAoZzE0KSAgICovCisgICAgICAgMHhiMmE3YTAxMCwJLyogc3RxIGc0LCAweDEwKGcxNCkJICovCisgICAgICAgMHhiMmM3YTAyMAkvKiBzdHEgZzgsIDB4MjAoZzE0KQkgKi8KKyAgICB9OworCisgIC8qIEFjY2VwdCBhIGxlYWYgcHJvY2VkdXJlIHByb2xvZ3VlIGNvZGUgZnJhZ21lbnQgaWYgcHJlc2VudC4KKyAgICAgTm90ZSB0aGF0IGlwIG1pZ2h0IHBvaW50IHRvIGVpdGhlciB0aGUgbGVhZiBvciBub24tbGVhZgorICAgICBlbnRyeSBwb2ludDsgd2UgbG9vayBmb3IgdGhlIG5vbi1sZWFmIGVudHJ5IHBvaW50IGZpcnN0OiAgKi8KKworICB3aXRoaW5fbGVhZl9wcm9sb2d1ZSA9IDA7CisgIGlmICgobmV4dF9pcCA9IE5FWFRfUFJPTE9HVUVfSU5TTiAoaXAsIGxpbWl0LCAmaW5zbjEsICZpbnNuMikpCisgICAgICAmJiAoKGluc24xICYgMHhmZmZmZjAwMCkgPT0gMHg4Y2YwMDAwMCAgICAgICAgIC8qIGxkYSBMUngsIGcxNCAoTUVNQSkgKi8KKwkgIHx8IChpbnNuMSAmIDB4ZmZmZmZjNjApID09IDB4OGNmMDMwMDApKSAgICAvKiBsZGEgTFJ4LCBnMTQgKE1FTUIpICovCisgICAgeworICAgICAgd2l0aGluX2xlYWZfcHJvbG9ndWUgPSAxOworICAgICAgbmV4dF9pcCA9IE5FWFRfUFJPTE9HVUVfSU5TTiAobmV4dF9pcCwgbGltaXQsICZpbnNuMSwgJmluc24yKTsKKyAgICB9CisKKyAgLyogTm93IGxvb2sgZm9yIHRoZSBwcm9sb2d1ZSBjb2RlIGF0IGEgbGVhZiBlbnRyeSBwb2ludDogICovCisKKyAgaWYgKG5leHRfaXAKKyAgICAgICYmIChpbnNuMSAmIDB4ZmY4N2ZmZmYpID09IDB4NWM4MDE2MWUgICAgICAgICAvKiBtb3YgZzE0LCBneCAqLworICAgICAgJiYgUkVHX1NSQ0RTVCAoaW5zbjEpIDw9IEcwX1JFR05VTSArIDcpCisgICAgeworICAgICAgd2l0aGluX2xlYWZfcHJvbG9ndWUgPSAxOworICAgICAgaWYgKChuZXh0X2lwID0gTkVYVF9QUk9MT0dVRV9JTlNOIChuZXh0X2lwLCBsaW1pdCwgJmluc24xLCAmaW5zbjIpKQorCSAgJiYgKGluc24xID09IDB4OGNmMDAwMDAgICAgICAgICAgICAgICAgICAgLyogbGRhIDAsIGcxNCAqLworCSAgICAgIHx8IGluc24xID09IDB4NWNmMDFlMDApKSAgICAgICAgICAgICAgLyogbW92IDAsIGcxNCAqLworCXsKKwkgIGlwID0gbmV4dF9pcDsKKwkgIG5leHRfaXAgPSBORVhUX1BST0xPR1VFX0lOU04gKGlwLCBsaW1pdCwgJmluc24xLCAmaW5zbjIpOworCSAgd2l0aGluX2xlYWZfcHJvbG9ndWUgPSAwOworCX0KKyAgICB9CisKKyAgLyogSWYgc29tZXRoaW5nIHRoYXQgbG9va3MgbGlrZSB0aGUgYmVnaW5uaW5nIG9mIGEgbGVhZiBwcm9sb2d1ZQorICAgICBoYXMgYmVlbiBzZWVuLCBidXQgdGhlIHJlbWFpbmRlciBvZiB0aGUgcHJvbG9ndWUgaXMgbWlzc2luZywgYmFpbC4KKyAgICAgV2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3ZlIGdvdC4gICovCisKKyAgaWYgKHdpdGhpbl9sZWFmX3Byb2xvZ3VlKQorICAgIHJldHVybiAoaXApOworCSAgCisgIC8qIEFjY2VwdCB6ZXJvIG9yIG1vcmUgaW5zdGFuY2VzIG9mICJtb3ZbcXRsXT8gZ3gsIHJ5Iiwgd2hlcmUgeSA+PSA0LgorICAgICBUaGlzIG1heSBjYXVzZSB1cyB0byBtaXN0YWtlIHRoZSBtb3Zpbmcgb2YgYSByZWdpc3RlcgorICAgICBwYXJhbWV0ZXIgdG8gYSBsb2NhbCByZWdpc3RlciBmb3IgdGhlIHNhdmluZyBvZiBhIGNhbGxlZS1zYXZlZAorICAgICByZWdpc3RlciwgYnV0IHRoYXQgY2FuJ3QgYmUgaGVscGVkLCBzaW5jZSB3aXRoIHRoZQorICAgICAiLWZjYWxsLXNhdmVkIiBmbGFnLCBhbnkgcmVnaXN0ZXIgY2FuIGJlIG1hZGUgY2FsbGVlLXNhdmVkLiAgKi8KKworICB3aGlsZSAobmV4dF9pcAorCSAmJiAoaW5zbjEgJiAweGZjODAyZmIwKSA9PSAweDVjMDAwNjEwCisJICYmIChkc3QgPSBSRUdfU1JDRFNUIChpbnNuMSkpID49IChSMF9SRUdOVU0gKyA0KSkKKyAgICB7CisgICAgICBzcmMgPSBSRUdfU1JDMSAoaW5zbjEpOworICAgICAgc2l6ZSA9IEVYVFJBQ1RfRklFTEQgKGluc24xLCAyNCwgMikgKyAxOworICAgICAgc2F2ZV9hZGRyID0gZnJhbWVfYWRkciArICgoZHN0IC0gUjBfUkVHTlVNKSAqIDQpOworICAgICAgd2hpbGUgKHNpemUtLSkKKwl7CisJICBmc3ItPnJlZ3Nbc3JjKytdID0gc2F2ZV9hZGRyOworCSAgc2F2ZV9hZGRyICs9IDQ7CisJfQorICAgICAgaXAgPSBuZXh0X2lwOworICAgICAgbmV4dF9pcCA9IE5FWFRfUFJPTE9HVUVfSU5TTiAoaXAsIGxpbWl0LCAmaW5zbjEsICZpbnNuMik7CisgICAgfQorCisgIC8qIEFjY2VwdCBhbiBvcHRpb25hbCAiYWRkbyBuLCBzcCwgc3AiIG9yICJsZGEgbihzcCksIHNwIi4gICovCisKKyAgaWYgKG5leHRfaXAgJiYKKyAgICAgICgoaW5zbjEgJiAweGZmZmZmZmUwKSA9PSAweDU5MDg0ODAwCS8qIGFkZG8gbiwgc3AsIHNwICovCisgICAgICAgfHwgKGluc24xICYgMHhmZmZmZjAwMCkgPT0gMHg4YzA4NjAwMAkvKiBsZGEgbihzcCksIHNwIChNRU1BKSAqLworICAgICAgIHx8IChpbnNuMSAmIDB4ZmZmZmZjNjApID09IDB4OGMwODc0MDApKQkvKiBsZGEgbihzcCksIHNwIChNRU1CKSAqLworICAgIHsKKyAgICAgIGlwID0gbmV4dF9pcDsKKyAgICAgIG5leHRfaXAgPSBORVhUX1BST0xPR1VFX0lOU04gKGlwLCBsaW1pdCwgJmluc24xLCAmaW5zbjIpOworICAgIH0KKworICAvKiBBY2NlcHQgemVybyBvciBtb3JlIGluc3RhbmNlcyBvZiAic3RbcXRsXT8gZ3gsIG4oZnApIi4gIAorICAgICBUaGlzIG1heSBjYXVzZSB1cyB0byBtaXN0YWtlIHRoZSBjb3B5aW5nIG9mIGEgcmVnaXN0ZXIKKyAgICAgcGFyYW1ldGVyIHRvIHRoZSBmcmFtZSBmb3IgdGhlIHNhdmluZyBvZiBhIGNhbGxlZS1zYXZlZAorICAgICByZWdpc3RlciwgYnV0IHRoYXQgY2FuJ3QgYmUgaGVscGVkLCBzaW5jZSB3aXRoIHRoZQorICAgICAiLWZjYWxsLXNhdmVkIiBmbGFnLCBhbnkgcmVnaXN0ZXIgY2FuIGJlIG1hZGUgY2FsbGVlLXNhdmVkLgorICAgICBXZSBjYW4sIGhvd2V2ZXIsIHJlZnVzZSB0byBhY2NlcHQgYSBzYXZlIG9mIHJlZ2lzdGVyIGcxNCwKKyAgICAgc2luY2UgdGhhdCBpcyBtYXRjaGVkIGV4cGxpY2l0bHkgYmVsb3cuICAqLworCisgIHdoaWxlIChuZXh0X2lwICYmCisJICgoaW5zbjEgJiAweGY3ODdmMDAwKSA9PSAweDkyODdlMDAwICAgICAgLyogc3RsPyBneCwgbihmcCkgKE1FTUEpICovCisJICB8fCAoaW5zbjEgJiAweGY3ODdmYzYwKSA9PSAweDkyODdmNDAwICAgLyogc3RsPyBneCwgbihmcCkgKE1FTUIpICovCisJICB8fCAoaW5zbjEgJiAweGVmODdmMDAwKSA9PSAweGEyODdlMDAwICAgLyogc3RbdHFdIGd4LCBuKGZwKSAoTUVNQSkgKi8KKwkgIHx8IChpbnNuMSAmIDB4ZWY4N2ZjNjApID09IDB4YTI4N2Y0MDApICAvKiBzdFt0cV0gZ3gsIG4oZnApIChNRU1CKSAqLworCSAmJiAoKHNyYyA9IE1FTV9TUkNEU1QgKGluc24xKSkgIT0gRzE0X1JFR05VTSkpCisgICAgeworICAgICAgc2F2ZV9hZGRyID0gZnJhbWVfYWRkciArICgoaW5zbjEgJiBCSVRNQVNLICgxMiwgMSkpCisJCQkJPyBpbnNuMiA6IE1FTUFfT0ZGU0VUIChpbnNuMSkpOworICAgICAgc2l6ZSA9IChpbnNuMSAmIEJJVE1BU0sgKDI5LCAxKSkgPyAoKGluc24xICYgQklUTUFTSyAoMjgsIDEpKSA/IDQgOiAzKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoaW5zbjEgJiBCSVRNQVNLICgyNywgMSkpID8gMiA6IDEpOworICAgICAgd2hpbGUgKHNpemUtLSkKKwl7CisJICBmc3ItPnJlZ3Nbc3JjKytdID0gc2F2ZV9hZGRyOworCSAgc2F2ZV9hZGRyICs9IDQ7CisJfQorICAgICAgaXAgPSBuZXh0X2lwOworICAgICAgbmV4dF9pcCA9IE5FWFRfUFJPTE9HVUVfSU5TTiAoaXAsIGxpbWl0LCAmaW5zbjEsICZpbnNuMik7CisgICAgfQorCisgIC8qIEFjY2VwdCB0aGUgdmFyYXJncyBwcm9sb2d1ZSBjb2RlIGlmIHByZXNlbnQuICAqLworCisgIHNpemUgPSBzaXplb2YgKHZhcmFyZ3NfcHJvbG9ndWVfY29kZSkgLyBzaXplb2YgKGludCk7CisgIHBjb2RlID0gdmFyYXJnc19wcm9sb2d1ZV9jb2RlOworICB3aGlsZSAoc2l6ZS0tICYmIG5leHRfaXAgJiYgKnBjb2RlKysgPT0gaW5zbjEpCisgICAgeworICAgICAgaXAgPSBuZXh0X2lwOworICAgICAgbmV4dF9pcCA9IE5FWFRfUFJPTE9HVUVfSU5TTiAoaXAsIGxpbWl0LCAmaW5zbjEsICZpbnNuMik7CisgICAgfQorCisgIC8qIEFjY2VwdCBhbiBvcHRpb25hbCAic3QgZzE0LCBuKGZwKSIuICAqLworCisgIGlmIChuZXh0X2lwICYmCisgICAgICAoKGluc24xICYgMHhmZmZmZjAwMCkgPT0gMHg5MmY3ZTAwMAkgLyogc3QgZzE0LCBuKGZwKSAoTUVNQSkgKi8KKyAgICAgICB8fCAoaW5zbjEgJiAweGZmZmZmYzYwKSA9PSAweDkyZjdmNDAwKSkgICAvKiBzdCBnMTQsIG4oZnApIChNRU1CKSAqLworICAgIHsKKyAgICAgIGZzci0+cmVnc1tHMTRfUkVHTlVNXSA9IGZyYW1lX2FkZHIgKyAoKGluc24xICYgQklUTUFTSyAoMTIsIDEpKQorCQkJCSAgICAgICAgICAgID8gaW5zbjIgOiBNRU1BX09GRlNFVCAoaW5zbjEpKTsKKyAgICAgIGlwID0gbmV4dF9pcDsKKyAgICAgIG5leHRfaXAgPSBORVhUX1BST0xPR1VFX0lOU04gKGlwLCBsaW1pdCwgJmluc24xLCAmaW5zbjIpOworICAgIH0KKworICAvKiBBY2NlcHQgemVybyBvciBvbmUgaW5zdGFuY2Ugb2YgIm1vdiBnMTMsIHJ5Iiwgd2hlcmUgeSA+PSA0LgorICAgICBUaGlzIGlzIHNhdmluZyB0aGUgYWRkcmVzcyB3aGVyZSBhIHN0cnVjdCBzaG91bGQgYmUgcmV0dXJuZWQuICAqLworCisgIGlmIChuZXh0X2lwCisgICAgICAmJiAoaW5zbjEgJiAweGZmODAyZmJmKSA9PSAweDVjMDAwNjFkCisgICAgICAmJiAoZHN0ID0gUkVHX1NSQ0RTVCAoaW5zbjEpKSA+PSAoUjBfUkVHTlVNICsgNCkpCisgICAgeworICAgICAgc2F2ZV9hZGRyID0gZnJhbWVfYWRkciArICgoZHN0IC0gUjBfUkVHTlVNKSAqIDQpOworICAgICAgZnNyLT5yZWdzW0cwX1JFR05VTSsxM10gPSBzYXZlX2FkZHI7CisgICAgICBpcCA9IG5leHRfaXA7CisjaWYgMCAgLyogV2UnbGwgbmVlZCB0aGlzIG9uY2UgdGhlcmUgaXMgYSBzdWJzZXF1ZW50IGluc3RydWN0aW9uIGV4YW1pbmVkLiAqLworICAgICAgbmV4dF9pcCA9IE5FWFRfUFJPTE9HVUVfSU5TTiAoaXAsIGxpbWl0LCAmaW5zbjEsICZpbnNuMik7CisjZW5kaWYKKyAgICB9CisKKyAgcmV0dXJuIChpcCk7Cit9CisKKy8qIEdpdmVuIGFuIGlwIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24sCisgICByZXR1cm4gdGhlIGlwIG9mIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBhZnRlciB0aGUgZnVuY3Rpb24gCisgICBwcm9sb2d1ZS4gICovCisKK0NPUkVfQUREUgorc2tpcF9wcm9sb2d1ZSAoaXApCisgICAgIENPUkVfQUREUiAoaXApOworeworICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyBzYXZlZF9yZWdzX2R1bW15OworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKyAgQ09SRV9BRERSIGxpbWl0OworCisgIHNhbCA9IGZpbmRfcGNfbGluZSAoaXAsIDApOworICBsaW1pdCA9IChzYWwuZW5kKSA/IHNhbC5lbmQgOiAweGZmZmZmZmZmOworCisgIHJldHVybiAoZXhhbWluZV9wcm9sb2d1ZSAoaXAsIGxpbWl0LCAoQ09SRV9BRERSKSAwLCAmc2F2ZWRfcmVnc19kdW1teSkpOworfQorCisvKiBQdXQgaGVyZSB0aGUgY29kZSB0byBzdG9yZSwgaW50byBhIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzLAorICAgdGhlIGFkZHJlc3NlcyBvZiB0aGUgc2F2ZWQgcmVnaXN0ZXJzIG9mIGZyYW1lIGRlc2NyaWJlZCBieSBGUkFNRV9JTkZPLgorICAgVGhpcyBpbmNsdWRlcyBzcGVjaWFsIHJlZ2lzdGVycyBzdWNoIGFzIHBjIGFuZCBmcCBzYXZlZCBpbiBzcGVjaWFsCisgICB3YXlzIGluIHRoZSBzdGFjayBmcmFtZS4gIHNwIGlzIGV2ZW4gbW9yZSBzcGVjaWFsOgorICAgdGhlIGFkZHJlc3Mgd2UgcmV0dXJuIGZvciBpdCBJUyB0aGUgc3AgZm9yIHRoZSBuZXh0IGZyYW1lLgorCisgICBXZSBjYWNoZSB0aGUgcmVzdWx0IG9mIGRvaW5nIHRoaXMgaW4gdGhlIGZyYW1lX29ic3RhY2ssIHNpbmNlIGl0IGlzCisgICBmYWlybHkgZXhwZW5zaXZlLiAgKi8KKwordm9pZAorZnJhbWVfZmluZF9zYXZlZF9yZWdzIChmaSwgZnNyKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7CisgICAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICpmc3I7Cit7CisgIHJlZ2lzdGVyIENPUkVfQUREUiBuZXh0X2FkZHI7CisgIHJlZ2lzdGVyIENPUkVfQUREUiAqc2F2ZWRfcmVnczsKKyAgcmVnaXN0ZXIgaW50IHJlZ251bTsKKyAgcmVnaXN0ZXIgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKmNhY2hlX2ZzcjsKKyAgQ09SRV9BRERSIGlwOworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKyAgQ09SRV9BRERSIGxpbWl0OworCisgIGlmICghZmktPmZzcikKKyAgICB7CisgICAgICBjYWNoZV9mc3IgPSAoc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKikKKwlmcmFtZV9vYnN0YWNrX2FsbG9jIChzaXplb2YgKHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzKSk7CisgICAgICBtZW1zZXQgKGNhY2hlX2ZzciwgJ1wwJywgc2l6ZW9mIChzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncykpOworICAgICAgZmktPmZzciA9IGNhY2hlX2ZzcjsKKworICAgICAgLyogRmluZCB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZnVuY3Rpb24gcHJvbG9ndWUuICBJZiB0aGUgUEMKKwkgaXMgaW4gdGhlIGZ1bmN0aW9uIHByb2xvZ3VlLCB3ZSBvbmx5IGNvbnNpZGVyIHRoZSBwYXJ0IHRoYXQKKwkgaGFzIGV4ZWN1dGVkIGFscmVhZHkuICAqLworICAgICAgICAgCisgICAgICBpcCA9IGdldF9wY19mdW5jdGlvbl9zdGFydCAoZmktPnBjKTsKKyAgICAgIHNhbCA9IGZpbmRfcGNfbGluZSAoaXAsIDApOworICAgICAgbGltaXQgPSAoc2FsLmVuZCAmJiBzYWwuZW5kIDwgZmktPnBjKSA/IHNhbC5lbmQ6IGZpLT5wYzsKKworICAgICAgZXhhbWluZV9wcm9sb2d1ZSAoaXAsIGxpbWl0LCBmaS0+ZnJhbWUsIGNhY2hlX2Zzcik7CisKKyAgICAgIC8qIFJlY29yZCB0aGUgYWRkcmVzc2VzIGF0IHdoaWNoIHRoZSBsb2NhbCByZWdpc3RlcnMgYXJlIHNhdmVkLgorCSBTdHJpY3RseSBzcGVha2luZywgd2Ugc2hvdWxkIG9ubHkgZG8gdGhpcyBmb3Igbm9uLWxlYWYgcHJvY2VkdXJlcywKKwkgYnV0IG5vIG9uZSB3aWxsIGV2ZXIgbG9vayBhdCB0aGVzZSB2YWx1ZXMgaWYgaXQgaXMgYSBsZWFmIHByb2NlZHVyZSwKKwkgc2luY2UgbG9jYWwgcmVnaXN0ZXJzIGFyZSBhbHdheXMgY2FsbGVyLXNhdmVkLiAgKi8KKworICAgICAgbmV4dF9hZGRyID0gKENPUkVfQUREUikgZmktPmZyYW1lOworICAgICAgc2F2ZWRfcmVncyA9IGNhY2hlX2Zzci0+cmVnczsKKyAgICAgIGZvciAocmVnbnVtID0gUjBfUkVHTlVNOyByZWdudW0gPD0gUjE1X1JFR05VTTsgcmVnbnVtKyspCisJeworCSAgKnNhdmVkX3JlZ3MrKyA9IG5leHRfYWRkcjsKKwkgIG5leHRfYWRkciArPSA0OworCX0KKworICAgICAgY2FjaGVfZnNyLT5yZWdzW0ZQX1JFR05VTV0gPSBjYWNoZV9mc3ItPnJlZ3NbUEZQX1JFR05VTV07CisgICAgfQorCisgICpmc3IgPSAqZmktPmZzcjsKKworICAvKiBGZXRjaCB0aGUgdmFsdWUgb2YgdGhlIHNwIGZyb20gbWVtb3J5IGV2ZXJ5IHRpbWUsIHNpbmNlIGl0CisgICAgIGlzIGNvbmNlaXZhYmxlIHRoYXQgaXQgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGNhY2hlIHdhcyBmbHVzaGVkLiAgCisgICAgIFRoaXMgdW5mb3J0dW5hdGVseSB1bmRvZXMgbXVjaCBvZiB0aGUgc2F2aW5ncyBmcm9tIGNhY2hpbmcgdGhlIAorICAgICBzYXZlZCByZWdpc3RlciB2YWx1ZXMuICBJIHN1Z2dlc3QgYWRkaW5nIGFuIGFyZ3VtZW50IHRvIAorICAgICBnZXRfZnJhbWVfc2F2ZWRfcmVncyAoKSBzcGVjaWZ5aW5nIHRoZSByZWdpc3RlciBudW1iZXIgd2UncmUKKyAgICAgaW50ZXJlc3RlZCBpbiAob3IgLTEgZm9yIGFsbCByZWdpc3RlcnMpLiAgVGhpcyB3b3VsZCBiZSBwYXNzZWQKKyAgICAgdGhyb3VnaCB0byBGUkFNRV9GSU5EX1NBVkVEX1JFR1MgKCksIHBlcm1pdHRpbmcgbW9yZSBlZmZpY2llbnQKKyAgICAgY29tcHV0YXRpb24gb2Ygc2F2ZWQgcmVnaXN0ZXIgYWRkcmVzc2VzIChlLmcuLCBvbiB0aGUgaTk2MCwKKyAgICAgd2UgZG9uJ3QgaGF2ZSB0byBleGFtaW5lIHRoZSBwcm9sb2d1ZSB0byBmaW5kIGxvY2FsIHJlZ2lzdGVycykuIAorCS0tIG1hcmtmQHdycy5jb20gCisgICAgIEZJWE1FLCB3ZSBkb24ndCBuZWVkIHRvIHJlZmV0Y2ggdGhpcywgc2luY2UgdGhlIGNhY2hlIGlzIGNsZWFyZWQKKyAgICAgZXZlcnkgdGltZSB0aGUgY2hpbGQgcHJvY2VzcyBpcyByZXN0YXJ0ZWQuICBJZiBHREIgaXRzZWxmCisgICAgIG1vZGlmaWVzIFNQLCBpdCBoYXMgdG8gY2xlYXIgdGhlIGNhY2hlIGJ5IGhhbmQgKGRvZXMgaXQ/KS4gIC1nbnUgKi8KKworICBmc3ItPnJlZ3NbU1BfUkVHTlVNXSA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKGZzci0+cmVnc1tTUF9SRUdOVU1dLCA0KTsKK30KKworLyogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBhcmd1bWVudCBibG9jayBmb3IgdGhlIGZyYW1lCisgICBkZXNjcmliZWQgYnkgRkkuICBSZXR1cm5zIDAgaWYgdGhlIGFkZHJlc3MgaXMgdW5rbm93bi4gICovCisKK0NPUkVfQUREUgorZnJhbWVfYXJnc19hZGRyZXNzIChmaSwgbXVzdF9iZV9jb3JyZWN0KQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7Cit7CisgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzIGZzcjsKKyAgQ09SRV9BRERSIGFwOworCisgIC8qIElmIGcxNCB3YXMgc2F2ZWQgaW4gdGhlIGZyYW1lIGJ5IHRoZSBmdW5jdGlvbiBwcm9sb2d1ZSBjb2RlLCByZXR1cm4KKyAgICAgdGhlIHNhdmVkIHZhbHVlLiAgSWYgdGhlIGZyYW1lIGlzIGN1cnJlbnQgYW5kIHdlIGFyZSBiZWluZyBzbG9wcHksCisgICAgIHJldHVybiB0aGUgdmFsdWUgb2YgZzE0LiAgT3RoZXJ3aXNlLCByZXR1cm4gemVyby4gICovCisKKyAgZ2V0X2ZyYW1lX3NhdmVkX3JlZ3MgKGZpLCAmZnNyKTsKKyAgaWYgKGZzci5yZWdzW0cxNF9SRUdOVU1dKQorICAgIGFwID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoZnNyLnJlZ3NbRzE0X1JFR05VTV0sNCk7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAobXVzdF9iZV9jb3JyZWN0KQorCXJldHVybiAwOwkJCS8qIERvbid0IGNhY2hlIHRoaXMgcmVzdWx0ICovCisgICAgICBpZiAoZ2V0X25leHRfZnJhbWUgKGZpKSkKKwlhcCA9IDA7CisgICAgICBlbHNlCisJYXAgPSByZWFkX3JlZ2lzdGVyIChHMTRfUkVHTlVNKTsKKyAgICAgIGlmIChhcCA9PSAwKQorCWFwID0gZmktPmZyYW1lOworICAgIH0KKyAgZmktPmFyZ19wb2ludGVyID0gYXA7CQkvKiBDYWNoZSBpdCBmb3IgbmV4dCB0aW1lICovCisgIHJldHVybiBhcDsKK30KKworLyogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSByZXR1cm4gc3RydWN0IGZvciB0aGUgZnJhbWUKKyAgIGRlc2NyaWJlZCBieSBGSS4gIFJldHVybnMgMCBpZiB0aGUgYWRkcmVzcyBpcyB1bmtub3duLiAgKi8KKworQ09SRV9BRERSCitmcmFtZV9zdHJ1Y3RfcmVzdWx0X2FkZHJlc3MgKGZpKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7Cit7CisgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzIGZzcjsKKyAgQ09SRV9BRERSIGFwOworCisgIC8qIElmIHRoZSBmcmFtZSBpcyBub24tY3VycmVudCwgY2hlY2sgdG8gc2VlIGlmIGcxNCB3YXMgc2F2ZWQgaW4gdGhlCisgICAgIGZyYW1lIGJ5IHRoZSBmdW5jdGlvbiBwcm9sb2d1ZSBjb2RlOyByZXR1cm4gdGhlIHNhdmVkIHZhbHVlIGlmIHNvLAorICAgICB6ZXJvIG90aGVyd2lzZS4gIElmIHRoZSBmcmFtZSBpcyBjdXJyZW50LCByZXR1cm4gdGhlIHZhbHVlIG9mIGcxNC4KKworICAgICBGSVhNRSwgc2hvdWxkbid0IHRoaXMgdXNlIHRoZSBzYXZlZCB2YWx1ZSBhcyBsb25nIGFzIHdlIGFyZSBwYXN0CisgICAgIHRoZSBmdW5jdGlvbiBwcm9sb2d1ZSwgYW5kIG9ubHkgdXNlIHRoZSBjdXJyZW50IHZhbHVlIGlmIHdlIGhhdmUKKyAgICAgbm8gc2F2ZWQgdmFsdWUgYW5kIGFyZSBhdCBUT1M/ICAgLS0gZ251QGN5Z251cy5jb20gKi8KKworICBpZiAoZ2V0X25leHRfZnJhbWUgKGZpKSkKKyAgICB7CisgICAgICBnZXRfZnJhbWVfc2F2ZWRfcmVncyAoZmksICZmc3IpOworICAgICAgaWYgKGZzci5yZWdzW0cxM19SRUdOVU1dKQorCWFwID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoZnNyLnJlZ3NbRzEzX1JFR05VTV0sNCk7CisgICAgICBlbHNlCisJYXAgPSAwOworICAgIH0KKyAgZWxzZQorICAgIGFwID0gcmVhZF9yZWdpc3RlciAoRzEzX1JFR05VTSk7CisKKyAgcmV0dXJuIGFwOworfQorCisvKiBSZXR1cm4gYWRkcmVzcyB0byB3aGljaCB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBsZWFmcHJvYyB3aWxsIHJldHVybiwKKyAgIG9yIDAgaWYgaXAgaXMgbm90IGluIGEgbGVhZnByb2MgKG9yIGlmIHdlIGNhbid0IHRlbGwgaWYgaXQgaXMpLgorICAKKyAgIERvIHRoaXMgYnkgZmluZGluZyB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgcm91dGluZSBpbiB3aGljaCBpcCBsaWVzLgorICAgSWYgdGhlIGluc3RydWN0aW9uIHRoZXJlIGlzICJtb3YgZzE0LCBneCIgKHdoZXJlIHggaXMgaW4gWzAsN10pLCB0aGlzCisgICBpcyBhIGxlYWZwcm9jIGFuZCB0aGUgcmV0dXJuIGFkZHJlc3MgaXMgaW4gcmVnaXN0ZXIgZ3guICBXZWxsLCB0aGlzIGlzCisgICB0cnVlIHVubGVzcyB0aGUgcmV0dXJuIGFkZHJlc3MgcG9pbnRzIGF0IGEgUkVUIGluc3RydWN0aW9uIGluIHRoZSBjdXJyZW50CisgICBwcm9jZWR1cmUsIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIGhhdmUgYSAnZHVhbCBlbnRyeScgcm91dGluZSB0aGF0CisgICBoYXMgYmVlbiBlbnRlcmVkIHRocm91Z2ggdGhlIENBTEwgZW50cnkgcG9pbnQuICAqLworCitDT1JFX0FERFIKK2xlYWZwcm9jX3JldHVybiAoaXApCisgICAgIENPUkVfQUREUiBpcDsJLyogaXAgZnJvbSBjdXJyZW50bHkgZXhlY3V0aW5nIGZ1bmN0aW9uCSovCit7CisgIHJlZ2lzdGVyIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbDsKKyAgY2hhciAqcDsKKyAgaW50IGRzdDsKKyAgdW5zaWduZWQgaW50IGluc24xLCBpbnNuMjsKKyAgQ09SRV9BRERSIHJldHVybl9hZGRyOworCisgIGlmICgobXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbF9ieV9wYyAoaXApKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICgocCA9IHN0cmNocihTWU1CT0xfTkFNRSAobXN5bWJvbCksICcuJykpICYmIFNUUkVRIChwLCAiLmxmIikpCisJeworCSAgaWYgKG5leHRfaW5zbiAoU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpLCAmaW5zbjEsICZpbnNuMikKKwkgICAgICAmJiAoaW5zbjEgJiAweGZmODdmZmZmKSA9PSAweDVjODAxNjFlICAgICAgIC8qIG1vdiBnMTQsIGd4ICovCisJICAgICAgJiYgKGRzdCA9IFJFR19TUkNEU1QgKGluc24xKSkgPD0gRzBfUkVHTlVNICsgNykKKwkgICAgeworCSAgICAgIC8qIEdldCB0aGUgcmV0dXJuIGFkZHJlc3MuICBJZiB0aGUgIm1vdiBnMTQsIGd4IiAKKwkJIGluc3RydWN0aW9uIGhhc24ndCBiZWVuIGV4ZWN1dGVkIHlldCwgcmVhZAorCQkgdGhlIHJldHVybiBhZGRyZXNzIGZyb20gZzE0OyBvdGhlcndpc2UsIHJlYWQgaXQKKwkJIGZyb20gdGhlIHJlZ2lzdGVyIGludG8gd2hpY2ggZzE0IHdhcyBtb3ZlZC4gICovCisKKwkgICAgICByZXR1cm5fYWRkciA9CisJCSAgcmVhZF9yZWdpc3RlciAoKGlwID09IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKSkKKwkJCQkgICAgICAgICAgID8gRzE0X1JFR05VTSA6IGRzdCk7CisKKwkgICAgICAvKiBXZSBrbm93IHdlIGFyZSBpbiBhIGxlYWYgcHJvY2VkdXJlLCBidXQgd2UgZG9uJ3Qga25vdworCQkgd2hldGhlciB0aGUgY2FsbGVyIGFjdHVhbGx5IGRpZCBhICJiYWwiIHRvIHRoZSAiLmxmIgorCQkgZW50cnkgcG9pbnQsIG9yIGEgbm9ybWFsICJjYWxsIiB0byB0aGUgbm9uLWxlYWYgZW50cnkKKwkJIHBvaW50IG9uZSBpbnN0cnVjdGlvbiBiZWZvcmUuICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZQorCQkgcmV0dXJuIGFkZHJlc3Mgd2lsbCBiZSB0aGUgYWRkcmVzcyBvZiBhICJyZXQiCisJCSBpbnN0cnVjdGlvbiB3aXRoaW4gdGhlIHByb2NlZHVyZSBpdHNlbGYuICBXZSB0ZXN0IGZvcgorCQkgdGhpcyBiZWxvdy4gICovCisKKwkgICAgICBpZiAoIW5leHRfaW5zbiAocmV0dXJuX2FkZHIsICZpbnNuMSwgJmluc24yKQorCQkgIHx8IChpbnNuMSAmIDB4ZmYwMDAwMDApICE9IDB4YTAwMDAwMCAgIC8qIHJldCAqLworCSAgICAgICAgICB8fCBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGMgKHJldHVybl9hZGRyKSAhPSBtc3ltYm9sKQorCQlyZXR1cm4gKHJldHVybl9hZGRyKTsKKwkgICAgfQorCX0KKyAgICB9CisgIAorICByZXR1cm4gKDApOworfQorCisvKiBJbW1lZGlhdGVseSBhZnRlciBhIGZ1bmN0aW9uIGNhbGwsIHJldHVybiB0aGUgc2F2ZWQgcGMuCisgICBDYW4ndCBnbyB0aHJvdWdoIHRoZSBmcmFtZXMgZm9yIHRoaXMgYmVjYXVzZSBvbiBzb21lIG1hY2hpbmVzCisgICB0aGUgbmV3IGZyYW1lIGlzIG5vdCBzZXQgdXAgdW50aWwgdGhlIG5ldyBmdW5jdGlvbiBleGVjdXRlcworICAgc29tZSBpbnN0cnVjdGlvbnMuIAorICAgT24gdGhlIGk5NjAsIHRoZSBmcmFtZSAqaXMqIHNldCB1cCBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2FsbCwKKyAgIHVubGVzcyB0aGUgZnVuY3Rpb24gaXMgYSBsZWFmIHByb2NlZHVyZS4gICovCisKK0NPUkVfQUREUgorc2F2ZWRfcGNfYWZ0ZXJfY2FsbCAoZnJhbWUpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgQ09SRV9BRERSIHNhdmVkX3BjOworCisgIHNhdmVkX3BjID0gbGVhZnByb2NfcmV0dXJuIChnZXRfZnJhbWVfcGMgKGZyYW1lKSk7CisgIGlmICghc2F2ZWRfcGMpCisgICAgc2F2ZWRfcGMgPSBGUkFNRV9TQVZFRF9QQyAoZnJhbWUpOworCisgIHJldHVybiBzYXZlZF9wYzsKK30KKworLyogRGlzY2FyZCBmcm9tIHRoZSBzdGFjayB0aGUgaW5uZXJtb3N0IGZyYW1lLAorICAgcmVzdG9yaW5nIGFsbCBzYXZlZCByZWdpc3RlcnMuICAqLworCit2b2lkCitwb3BfZnJhbWUgKCkKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGZyYW1lX2luZm8gKmN1cnJlbnRfZmksICpwcmV2X2ZpOworICByZWdpc3RlciBpbnQgaTsKKyAgQ09SRV9BRERSIHNhdmVfYWRkcjsKKyAgQ09SRV9BRERSIGxlYWZfcmV0dXJuX2FkZHI7CisgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzIGZzcjsKKyAgY2hhciBsb2NhbF9yZWdzX2J1ZlsxNiAqIDRdOworCisgIGN1cnJlbnRfZmkgPSBnZXRfY3VycmVudF9mcmFtZSAoKTsKKworICAvKiBGaXJzdCwgdW5kbyB3aGF0IHRoZSBoYXJkd2FyZSBkb2VzIHdoZW4gd2UgcmV0dXJuLgorICAgICBJZiB0aGlzIGlzIGEgbm9uLWxlYWYgcHJvY2VkdXJlLCByZXN0b3JlIGxvY2FsIHJlZ2lzdGVycyBmcm9tCisgICAgIHRoZSBzYXZlIGFyZWEgaW4gdGhlIGNhbGxpbmcgZnJhbWUuICBPdGhlcndpc2UsIGxvYWQgdGhlIHJldHVybgorICAgICBhZGRyZXNzIG9idGFpbmVkIGZyb20gbGVhZnByb2NfcmV0dXJuICgpIGludG8gdGhlIHJpcC4gICovCisKKyAgbGVhZl9yZXR1cm5fYWRkciA9IGxlYWZwcm9jX3JldHVybiAoY3VycmVudF9maS0+cGMpOworICBpZiAoIWxlYWZfcmV0dXJuX2FkZHIpCisgICAgeworICAgICAgLyogTm9uLWxlYWYgcHJvY2VkdXJlLiAgUmVzdG9yZSBsb2NhbCByZWdpc3RlcnMsIGluY2wgSVAuICAqLworICAgICAgcHJldl9maSA9IGdldF9wcmV2X2ZyYW1lIChjdXJyZW50X2ZpKTsKKyAgICAgIHJlYWRfbWVtb3J5IChwcmV2X2ZpLT5mcmFtZSwgbG9jYWxfcmVnc19idWYsIHNpemVvZiAobG9jYWxfcmVnc19idWYpKTsKKyAgICAgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFIChSMF9SRUdOVU0pLCBsb2NhbF9yZWdzX2J1ZiwgCisJCSAgICAgICAgICAgIHNpemVvZiAobG9jYWxfcmVnc19idWYpKTsKKworICAgICAgLyogUmVzdG9yZSBmcmFtZSBwb2ludGVyLiAgKi8KKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChGUF9SRUdOVU0sIHByZXZfZmktPmZyYW1lKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBMZWFmIHByb2NlZHVyZS4gIEp1c3QgcmVzdG9yZSB0aGUgcmV0dXJuIGFkZHJlc3MgaW50byB0aGUgSVAuICAqLworICAgICAgd3JpdGVfcmVnaXN0ZXIgKFJJUF9SRUdOVU0sIGxlYWZfcmV0dXJuX2FkZHIpOworICAgIH0KKworICAvKiBOb3cgcmVzdG9yZSBhbnkgZ2xvYmFsIHJlZ3MgdGhhdCB0aGUgY3VycmVudCBmdW5jdGlvbiBoYWQgc2F2ZWQuICovCisgIGdldF9mcmFtZV9zYXZlZF9yZWdzIChjdXJyZW50X2ZpLCAmZnNyKTsKKyAgZm9yIChpID0gRzBfUkVHTlVNOyBpIDwgRzE0X1JFR05VTTsgaSsrKQorICAgIHsKKyAgICAgIGlmIChzYXZlX2FkZHIgPSBmc3IucmVnc1tpXSkKKwl3cml0ZV9yZWdpc3RlciAoaSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoc2F2ZV9hZGRyLCA0KSk7CisgICAgfQorCisgIC8qIEZsdXNoIHRoZSBmcmFtZSBjYWNoZSwgY3JlYXRlIGEgZnJhbWUgZm9yIHRoZSBuZXcgaW5uZXJtb3N0IGZyYW1lLAorICAgICBhbmQgbWFrZSBpdCB0aGUgY3VycmVudCBmcmFtZS4gICovCisKKyAgZmx1c2hfY2FjaGVkX2ZyYW1lcyAoKTsKK30KKworLyogR2l2ZW4gYSA5NjAgc3RvcCBjb2RlIChmYXVsdCBvciB0cmFjZSksIHJldHVybiB0aGUgc2lnbmFsIHdoaWNoCisgICBjb3JyZXNwb25kcy4gICovCisKK2VudW0gdGFyZ2V0X3NpZ25hbAoraTk2MF9mYXVsdF90b19zaWduYWwgKGZhdWx0KQorICAgIGludCBmYXVsdDsKK3sKKyAgc3dpdGNoIChmYXVsdCkKKyAgICB7CisgICAgY2FzZSAwOiByZXR1cm4gVEFSR0VUX1NJR05BTF9CVVM7IC8qIHBhcmFsbGVsIGZhdWx0ICovCisgICAgY2FzZSAxOiByZXR1cm4gVEFSR0VUX1NJR05BTF9VTktOT1dOOworICAgIGNhc2UgMjogcmV0dXJuIFRBUkdFVF9TSUdOQUxfSUxMOyAvKiBvcGVyYXRpb24gZmF1bHQgKi8KKyAgICBjYXNlIDM6IHJldHVybiBUQVJHRVRfU0lHTkFMX0ZQRTsgLyogYXJpdGhtZXRpYyBmYXVsdCAqLworICAgIGNhc2UgNDogcmV0dXJuIFRBUkdFVF9TSUdOQUxfRlBFOyAvKiBmbG9hdGluZyBwb2ludCBmYXVsdCAqLworCisgICAgICAvKiBjb25zdHJhaW50IGZhdWx0LiAgVGhpcyBhcHBlYXJzIG5vdCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCisJIGEgcmFuZ2UgY29uc3RyYWludCBmYXVsdCAod2hpY2ggc2hvdWxkIGJlIFNJR0ZQRSkgYW5kIGEgcHJpdmlsZWdlZAorCSBmYXVsdCAod2hpY2ggc2hvdWxkIGJlIFNJR0lMTCkuICAqLworICAgIGNhc2UgNTogcmV0dXJuIFRBUkdFVF9TSUdOQUxfSUxMOworCisgICAgY2FzZSA2OiByZXR1cm4gVEFSR0VUX1NJR05BTF9TRUdWOyAvKiB2aXJ0dWFsIG1lbW9yeSBmYXVsdCAqLworCisgICAgICAvKiBwcm90ZWN0aW9uIGZhdWx0LiAgVGhpcyBpcyBmb3IgYW4gb3V0LW9mLXJhbmdlIGFyZ3VtZW50IHRvCisJICJjYWxscyIuICBJIGd1ZXNzIGl0IGFsc28gY291bGQgYmUgU0lHSUxMLiAqLworICAgIGNhc2UgNzogcmV0dXJuIFRBUkdFVF9TSUdOQUxfU0VHVjsKKworICAgIGNhc2UgODogcmV0dXJuIFRBUkdFVF9TSUdOQUxfQlVTOyAvKiBtYWNoaW5lIGZhdWx0ICovCisgICAgY2FzZSA5OiByZXR1cm4gVEFSR0VUX1NJR05BTF9CVVM7IC8qIHN0cnVjdHVyYWwgZmF1bHQgKi8KKyAgICBjYXNlIDB4YTogcmV0dXJuIFRBUkdFVF9TSUdOQUxfSUxMOyAvKiB0eXBlIGZhdWx0ICovCisgICAgY2FzZSAweGI6IHJldHVybiBUQVJHRVRfU0lHTkFMX1VOS05PV047IC8qIHJlc2VydmVkIGZhdWx0ICovCisgICAgY2FzZSAweGM6IHJldHVybiBUQVJHRVRfU0lHTkFMX0JVUzsgLyogcHJvY2VzcyBmYXVsdCAqLworICAgIGNhc2UgMHhkOiByZXR1cm4gVEFSR0VUX1NJR05BTF9TRUdWOyAvKiBkZXNjcmlwdG9yIGZhdWx0ICovCisgICAgY2FzZSAweGU6IHJldHVybiBUQVJHRVRfU0lHTkFMX0JVUzsgLyogZXZlbnQgZmF1bHQgKi8KKyAgICBjYXNlIDB4ZjogcmV0dXJuIFRBUkdFVF9TSUdOQUxfVU5LTk9XTjsgLyogcmVzZXJ2ZWQgZmF1bHQgKi8KKyAgICBjYXNlIDB4MTA6IHJldHVybiBUQVJHRVRfU0lHTkFMX1RSQVA7IC8qIHNpbmdsZS1zdGVwIHRyYWNlICovCisgICAgY2FzZSAweDExOiByZXR1cm4gVEFSR0VUX1NJR05BTF9UUkFQOyAvKiBicmFuY2ggdHJhY2UgKi8KKyAgICBjYXNlIDB4MTI6IHJldHVybiBUQVJHRVRfU0lHTkFMX1RSQVA7IC8qIGNhbGwgdHJhY2UgKi8KKyAgICBjYXNlIDB4MTM6IHJldHVybiBUQVJHRVRfU0lHTkFMX1RSQVA7IC8qIHJldHVybiB0cmFjZSAqLworICAgIGNhc2UgMHgxNDogcmV0dXJuIFRBUkdFVF9TSUdOQUxfVFJBUDsgLyogcHJlLXJldHVybiB0cmFjZSAqLworICAgIGNhc2UgMHgxNTogcmV0dXJuIFRBUkdFVF9TSUdOQUxfVFJBUDsgLyogc3VwZXJ2aXNvciBjYWxsIHRyYWNlICovCisgICAgY2FzZSAweDE2OiByZXR1cm4gVEFSR0VUX1NJR05BTF9UUkFQOyAvKiBicmVha3BvaW50IHRyYWNlICovCisgICAgZGVmYXVsdDogcmV0dXJuIFRBUkdFVF9TSUdOQUxfVU5LTk9XTjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTUVNIGZvcm1hdAkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCB0YWJlbnQgeworCWNoYXIJKm5hbWU7CisJY2hhcgludW1vcHM7Cit9OworCitzdGF0aWMgaW50CQkJCS8qIHJldHVybnMgaW5zdHJ1Y3Rpb24gbGVuZ3RoOiA0IG9yIDggKi8KK21lbSggbWVtYWRkciwgd29yZDEsIHdvcmQyLCBub3ByaW50ICkKKyAgICB1bnNpZ25lZCBsb25nIG1lbWFkZHI7CisgICAgdW5zaWduZWQgbG9uZyB3b3JkMSwgd29yZDI7CisgICAgaW50IG5vcHJpbnQ7CQkvKiBJZiBUUlVFLCByZXR1cm4gaW5zdHJ1Y3Rpb24gbGVuZ3RoLCBidXQKKwkJCQkgICBkb24ndCBvdXRwdXQgYW55IHRleHQuICAqLworeworCWludCBpLCBqOworCWludCBsZW47CisJaW50IG1vZGU7CisJaW50IG9mZnNldDsKKwljb25zdCBjaGFyICpyZWcxLCAqcmVnMiwgKnJlZzM7CisKKwkvKiBUaGlzIGxvb2t1cCB0YWJsZSBpcyB0b28gc3BhcnNlIHRvIG1ha2UgaXQgd29ydGggdHlwaW5nIGluLCBidXQgbm90CisJICogc28gbGFyZ2UgYXMgdG8gbWFrZSBhIHNwYXJzZSBhcnJheSBuZWNlc3NhcnkuICBXZSBhbGxvY2F0ZSB0aGUKKwkgKiB0YWJsZSBhdCBydW50aW1lLCBpbml0aWFsaXplIGFsbCBlbnRyaWVzIHRvIGVtcHR5LCBhbmQgY29weSB0aGUKKwkgKiByZWFsIG9uZXMgaW4gZnJvbSBhbiBpbml0aWFsaXphdGlvbiB0YWJsZS4KKwkgKgorCSAqIE5PVEU6IEluIHRoaXMgdGFibGUsIHRoZSBtZWFuaW5nIG9mICdudW1vcHMnIGlzOgorCSAqCSAxOiBzaW5nbGUgb3BlcmFuZAorCSAqCSAyOiAyIG9wZXJhbmRzLCBsb2FkIGluc3RydWN0aW9uCisJICoJLTI6IDIgb3BlcmFuZHMsIHN0b3JlIGluc3RydWN0aW9uCisJICovCisJc3RhdGljIHN0cnVjdCB0YWJlbnQgKm1lbV90YWIgPSBOVUxMOworLyogT3Bjb2RlcyBvZiAweDhYLCA5WCwgYVgsIGJYLCBhbmQgY1ggbXVzdCBiZSBpbiB0aGUgdGFibGUuICAqLworI2RlZmluZSBNRU1fTUlOCTB4ODAKKyNkZWZpbmUgTUVNX01BWAkweGNmCisjZGVmaW5lIE1FTV9TSVoJKChNRU1fTUFYLU1FTV9NSU4rMSkgKiBzaXplb2Yoc3RydWN0IHRhYmVudCkpCisKKwlzdGF0aWMgc3RydWN0IHsgaW50IG9wY29kZTsgY2hhciAqbmFtZTsgY2hhciBudW1vcHM7IH0gbWVtX2luaXRbXSA9IHsKKwkJMHg4MCwJImxkb2IiLAkgMiwKKwkJMHg4MiwJInN0b2IiLAktMiwKKwkJMHg4NCwJImJ4IiwJIDEsCisJCTB4ODUsCSJiYWx4IiwJIDIsCisJCTB4ODYsCSJjYWxseCIsIDEsCisJCTB4ODgsCSJsZG9zIiwJIDIsCisJCTB4OGEsCSJzdG9zIiwJLTIsCisJCTB4OGMsCSJsZGEiLAkgMiwKKwkJMHg5MCwJImxkIiwJIDIsCisJCTB4OTIsCSJzdCIsCS0yLAorCQkweDk4LAkibGRsIiwJIDIsCisJCTB4OWEsCSJzdGwiLAktMiwKKwkJMHhhMCwJImxkdCIsCSAyLAorCQkweGEyLAkic3R0IiwJLTIsCisJCTB4YjAsCSJsZHEiLAkgMiwKKwkJMHhiMiwJInN0cSIsCS0yLAorCQkweGMwLAkibGRpYiIsCSAyLAorCQkweGMyLAkic3RpYiIsCS0yLAorCQkweGM4LAkibGRpcyIsCSAyLAorCQkweGNhLAkic3RpcyIsCS0yLAorCQkwLAlOVUxMLAkwCisJfTsKKworCWlmICggbWVtX3RhYiA9PSBOVUxMICl7CisJCW1lbV90YWIgPSAoc3RydWN0IHRhYmVudCAqKSB4bWFsbG9jKCBNRU1fU0laICk7CisJCW1lbXNldCggbWVtX3RhYiwgJ1wwJywgTUVNX1NJWiApOworCQlmb3IgKCBpID0gMDsgbWVtX2luaXRbaV0ub3Bjb2RlICE9IDA7IGkrKyApeworCQkJaiA9IG1lbV9pbml0W2ldLm9wY29kZSAtIE1FTV9NSU47CisJCQltZW1fdGFiW2pdLm5hbWUgPSBtZW1faW5pdFtpXS5uYW1lOworCQkJbWVtX3RhYltqXS5udW1vcHMgPSBtZW1faW5pdFtpXS5udW1vcHM7CisJCX0KKwl9CisKKwlpID0gKCh3b3JkMSA+PiAyNCkgJiAweGZmKSAtIE1FTV9NSU47CisJbW9kZSA9ICh3b3JkMSA+PiAxMCkgJiAweGY7CisKKwlpZiAoIChtZW1fdGFiW2ldLm5hbWUgIT0gTlVMTCkJCS8qIFZhbGlkIGluc3RydWN0aW9uICovCisJJiYgICAoKG1vZGUgPT0gNSkgfHwgKG1vZGUgPj0xMikpICl7CS8qIFdpdGggMzItYml0IGRpc3BsYWNlbWVudCAqLworCQlsZW4gPSA4OworCX0gZWxzZSB7CisJCWxlbiA9IDQ7CisJfQorCisJaWYgKCBub3ByaW50ICl7CisJCXJldHVybiBsZW47CisJfQorCWFib3J0ICgpOworfQorCisvKiBSZWFkIHRoZSBpOTYwIGluc3RydWN0aW9uIGF0ICdtZW1hZGRyJyBhbmQgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIAorICAgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gYWZ0ZXIgdGhhdCwgb3IgMCBpZiAnbWVtYWRkcicgaXMgbm90IHRoZQorICAgYWRkcmVzcyBvZiBhIHZhbGlkIGluc3RydWN0aW9uLiAgVGhlIGZpcnN0IHdvcmQgb2YgdGhlIGluc3RydWN0aW9uCisgICBpcyBzdG9yZWQgYXQgJ3B3b3JkMScsIGFuZCB0aGUgc2Vjb25kIHdvcmQsIGlmIGFueSwgaXMgc3RvcmVkIGF0CisgICAncHdvcmQyJy4gICovCisKK3N0YXRpYyBDT1JFX0FERFIKK25leHRfaW5zbiAobWVtYWRkciwgcHdvcmQxLCBwd29yZDIpCisgICAgIHVuc2lnbmVkIGludCAqcHdvcmQxLCAqcHdvcmQyOworICAgICBDT1JFX0FERFIgbWVtYWRkcjsKK3sKKyAgaW50IGxlbjsKKyAgY2hhciBidWZbOF07CisKKyAgLyogUmVhZCB0aGUgdHdvIChwb3RlbnRpYWwpIHdvcmRzIG9mIHRoZSBpbnN0cnVjdGlvbiBhdCBvbmNlLAorICAgICB0byBlbGltaW5hdGUgdGhlIG92ZXJoZWFkIG9mIHR3byBjYWxscyB0byByZWFkX21lbW9yeSAoKS4KKyAgICAgRklYTUU6IExvc2VzIGlmIHRoZSBmaXJzdCBvbmUgaXMgcmVhZGFibGUgYnV0IHRoZSBzZWNvbmQgaXMgbm90CisgICAgIChlLmcuIGxhc3Qgd29yZCBvZiB0aGUgc2VnbWVudCkuICAqLworCisgIHJlYWRfbWVtb3J5IChtZW1hZGRyLCBidWYsIDgpOworICAqcHdvcmQxID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChidWYsIDQpOworICAqcHdvcmQyID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChidWYgKyA0LCA0KTsKKworICAvKiBEaXZpZGUgaW5zdHJ1Y3Rpb24gc2V0IGludG8gY2xhc3NlcyBiYXNlZCBvbiBoaWdoIDQgYml0cyBvZiBvcGNvZGUqLworCisgIHN3aXRjaCAoKCpwd29yZDEgPj4gMjgpICYgMHhmKQorICAgIHsKKyAgICBjYXNlIDB4MDoKKyAgICBjYXNlIDB4MToJLyogY3RybCAqLworCisgICAgY2FzZSAweDI6CisgICAgY2FzZSAweDM6CS8qIGNvYnIgKi8KKworICAgIGNhc2UgMHg1OgorICAgIGNhc2UgMHg2OgorICAgIGNhc2UgMHg3OgkvKiByZWcgKi8KKyAgICAgIGxlbiA9IDQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMHg4OgorICAgIGNhc2UgMHg5OgorICAgIGNhc2UgMHhhOgorICAgIGNhc2UgMHhiOgorICAgIGNhc2UgMHhjOgorICAgICAgbGVuID0gbWVtIChtZW1hZGRyLCAqcHdvcmQxLCAqcHdvcmQyLCAxKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoJLyogaW52YWxpZCBpbnN0cnVjdGlvbiAqLworICAgICAgbGVuID0gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAobGVuKQorICAgIHJldHVybiBtZW1hZGRyICsgbGVuOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8qICdzdGFydF9mcmFtZScgaXMgYSB2YXJpYWJsZSBpbiB0aGUgTU9OOTYwIHJ1bnRpbWUgc3RhcnR1cCByb3V0aW5lCisgICB0aGF0IGNvbnRhaW5zIHRoZSBmcmFtZSBwb2ludGVyIG9mIHRoZSAnc3RhcnQnIHJvdXRpbmUgKHRoZSByb3V0aW5lCisgICB0aGF0IGNhbGxzICdtYWluJykuICBCeSByZWFkaW5nIGl0cyBjb250ZW50cyBvdXQgb2YgcmVtb3RlIG1lbW9yeSwKKyAgIHdlIGNhbiB0ZWxsIHdoZXJlIHRoZSBmcmFtZSBjaGFpbiBlbmRzOiAgYmFja3RyYWNlcyBzaG91bGQgaGFsdCBiZWZvcmUKKyAgIHRoZXkgZGlzcGxheSB0aGlzIGZyYW1lLiAgKi8KKworaW50Cittb245NjBfZnJhbWVfY2hhaW5fdmFsaWQgKGNoYWluLCBjdXJmcmFtZSkKKyAgICBDT1JFX0FERFIgY2hhaW47CisgICAgc3RydWN0IGZyYW1lX2luZm8gKmN1cmZyYW1lOworeworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisKKwkvKiBjcnRtb245NjAubyBpcyBhbiBhc3NlbWJsZXIgbW9kdWxlIHRoYXQgaXMgYXNzdW1lZCB0byBiZSBsaW5rZWQKKwkgKiBmaXJzdCBpbiBhbiBpODA5NjAgZXhlY3V0YWJsZS4gIEl0IGNvbnRhaW5zIHRoZSB0cnVlIGVudHJ5IHBvaW50OworCSAqIGl0IHBlcmZvcm1zIHN0YXJ0dXAgdXAgaW5pdGlhbGl6YXRpb24gYW5kIHRoZW4gY2FsbHMgJ21haW4nLgorCSAqCisJICogJ3NmJyBpcyB0aGUgbmFtZSBvZiBhIHZhcmlhYmxlIGluIGNydG1vbjk2MC5vIHRoYXQgaXMgc2V0CisJICoJZHVyaW5nIHN0YXJ0dXAgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGZyYW1lLgorCSAqCisJICogJ2EnIGlzIHRoZSBhZGRyZXNzIG9mIHRoYXQgdmFyaWFibGUgaW4gODA5NjAgbWVtb3J5LgorCSAqLworCXN0YXRpYyBjaGFyIHNmW10gPSAic3RhcnRfZnJhbWUiOworCUNPUkVfQUREUiBhOworCisKKwljaGFpbiAmPSB+MHgzZjsgLyogWmVybyBsb3cgNiBiaXRzIGJlY2F1c2UgcHJldmlvdXMgZnJhbWUgcG9pbnRlcnMKKwkJCSAgIGNvbnRhaW4gcmV0dXJuIHN0YXR1cyBpbmZvIGluIHRoZW0uICAqLworCWlmICggY2hhaW4gPT0gMCApeworCQlyZXR1cm4gMDsKKwl9CisKKwlzeW0gPSBsb29rdXBfc3ltYm9sKHNmLCAwLCBWQVJfTkFNRVNQQUNFLCAoaW50ICopTlVMTCwgCisJCQkJICAoc3RydWN0IHN5bXRhYiAqKilOVUxMKTsKKwlpZiAoIHN5bSAhPSAwICl7CisJCWEgPSBTWU1CT0xfVkFMVUUgKHN5bSk7CisJfSBlbHNlIHsKKwkJbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoc2YsIE5VTEwsIE5VTEwpOworCQlpZiAobXN5bWJvbCA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWEgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCk7CisJfQorCisJcmV0dXJuICggY2hhaW4gIT0gcmVhZF9tZW1vcnlfaW50ZWdlcihhLDQpICk7Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX2k5NjBfdGRlcCAoKQoreworICBjaGVja19ob3N0ICgpOworCisgIHRtX3ByaW50X2luc24gPSBwcmludF9pbnNuX2k5NjA7Cit9CmRpZmYgLS1naXQgYS9nZGIvaW5mY21kLmMgYi9nZGIvaW5mY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFkZDFmMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9pbmZjbWQuYwpAQCAtMCwwICsxLDE1NTMgQEAKKy8qIE1lbW9yeS1hY2Nlc3MgYW5kIGNvbW1hbmRzIGZvciAiaW5mZXJpb3IiIHByb2Nlc3MsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk4NiwgODcsIDg4LCA4OSwgOTEsIDkyLCA5NSwgOTYsIDE5OTggCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJlbnZpcm9uLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKworLyogRnVuY3Rpb25zIGV4cG9ydGVkIGZvciBnZW5lcmFsIHVzZTogKi8KKwordm9pZCBub2ZwX3JlZ2lzdGVyc19pbmZvIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3ZvaWQgYWxsX3JlZ2lzdGVyc19pbmZvIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3ZvaWQgcmVnaXN0ZXJzX2luZm8gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworLyogTG9jYWwgZnVuY3Rpb25zOiAqLworCit2b2lkIGNvbnRpbnVlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgdW50aWxfbmV4dF9jb21tYW5kIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgdm9pZCB1bnRpbF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHBhdGhfaW5mbyBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBwYXRoX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgdW5zZXRfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBmbG9hdF9pbmZvIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGRldGFjaF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKKyNpZiAhZGVmaW5lZCAoRE9fUkVHSVNURVJTX0lORk8pCitzdGF0aWMgdm9pZCBkb19yZWdpc3RlcnNfaW5mbyBQQVJBTVMgKChpbnQsIGludCkpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHVuc2V0X2Vudmlyb25tZW50X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgc2V0X2Vudmlyb25tZW50X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgZW52aXJvbm1lbnRfaW5mbyBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBwcm9ncmFtX2luZm8gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgZmluaXNoX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgc2lnbmFsX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQganVtcF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHN0ZXBfMSBQQVJBTVMgKChpbnQsIGludCwgY2hhciAqKSk7CisKK3ZvaWQgbmV4dGlfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCit2b2lkIHN0ZXBpX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgbmV4dF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHN0ZXBfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBydW5fY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCit2b2lkIF9pbml0aWFsaXplX2luZmNtZCBQQVJBTVMgKCh2b2lkKSk7CisKKyNkZWZpbmUgR09fVVNBR0UgICAiVXNhZ2U6IGdvIDxsb2NhdGlvbj5cbiIKKworI2lmZGVmIENBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQKK3N0YXRpYyB2b2lkIGJyZWFrcG9pbnRfYXV0b19kZWxldGVfY29udGVudHMgUEFSQU1TICgoUFRSKSk7CisjZW5kaWYKKworI2RlZmluZSBFUlJPUl9OT19JTkZFUklPUiBcCisgICBpZiAoIXRhcmdldF9oYXNfZXhlY3V0aW9uKSBlcnJvciAoIlRoZSBwcm9ncmFtIGlzIG5vdCBiZWluZyBydW4uIik7CisKKy8qIFN0cmluZyBjb250YWluaW5nIGFyZ3VtZW50cyB0byBnaXZlIHRvIHRoZSBwcm9ncmFtLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLgorICAgRW1wdHkgc3RyaW5nIChwb2ludGVyIHRvICdcMCcpIG1lYW5zIG5vIGFyZ3MuICAqLworCitzdGF0aWMgY2hhciAqaW5mZXJpb3JfYXJnczsKKworLyogRmlsZSBuYW1lIGZvciBkZWZhdWx0IHVzZSBmb3Igc3RhbmRhcmQgaW4vb3V0IGluIHRoZSBpbmZlcmlvci4gICovCisKK2NoYXIgKmluZmVyaW9yX2lvX3Rlcm1pbmFsOworCisvKiBQaWQgb2Ygb3VyIGRlYnVnZ2VkIGluZmVyaW9yLCBvciAwIGlmIG5vIGluZmVyaW9yIG5vdy4KKyAgIFNpbmNlIHZhcmlvdXMgcGFydHMgb2YgaW5mcnVuLmMgdGVzdCB0aGlzIHRvIHNlZSB3aGV0aGVyIHRoZXJlIGlzIGEgcHJvZ3JhbQorICAgYmVpbmcgZGVidWdnZWQgaXQgc2hvdWxkIGJlIG5vbnplcm8gKGN1cnJlbnRseSAzIGlzIHVzZWQpIGZvciByZW1vdGUKKyAgIGRlYnVnZ2luZy4gICovCisKK2ludCBpbmZlcmlvcl9waWQ7CisKKy8qIExhc3Qgc2lnbmFsIHRoYXQgdGhlIGluZmVyaW9yIHJlY2VpdmVkICh3aHkgaXQgc3RvcHBlZCkuICAqLworCitlbnVtIHRhcmdldF9zaWduYWwgc3RvcF9zaWduYWw7CisKKy8qIEFkZHJlc3MgYXQgd2hpY2ggaW5mZXJpb3Igc3RvcHBlZC4gICovCisKK0NPUkVfQUREUiBzdG9wX3BjOworCisvKiBDaGFpbiBjb250YWluaW5nIHN0YXR1cyBvZiBicmVha3BvaW50KHMpIHRoYXQgd2UgaGF2ZSBzdG9wcGVkIGF0LiAgKi8KKworYnBzdGF0IHN0b3BfYnBzdGF0OworCisvKiBGbGFnIGluZGljYXRpbmcgdGhhdCBhIGNvbW1hbmQgaGFzIHByb2NlZWRlZCB0aGUgaW5mZXJpb3IgcGFzdCB0aGUKKyAgIGN1cnJlbnQgYnJlYWtwb2ludC4gICovCisKK2ludCBicmVha3BvaW50X3Byb2NlZWRlZDsKKworLyogTm9uemVybyBpZiBzdG9wcGVkIGR1ZSB0byBhIHN0ZXAgY29tbWFuZC4gICovCisKK2ludCBzdG9wX3N0ZXA7CisKKy8qIE5vbnplcm8gaWYgc3RvcHBlZCBkdWUgdG8gY29tcGxldGlvbiBvZiBhIHN0YWNrIGR1bW15IHJvdXRpbmUuICAqLworCitpbnQgc3RvcF9zdGFja19kdW1teTsKKworLyogTm9uemVybyBpZiBzdG9wcGVkIGR1ZSB0byBhIHJhbmRvbSAodW5leHBlY3RlZCkgc2lnbmFsIGluIGluZmVyaW9yCisgICBwcm9jZXNzLiAgKi8KKworaW50IHN0b3BwZWRfYnlfcmFuZG9tX3NpZ25hbDsKKworLyogUmFuZ2UgdG8gc2luZ2xlIHN0ZXAgd2l0aGluLgorICAgSWYgdGhpcyBpcyBub256ZXJvLCByZXNwb25kIHRvIGEgc2luZ2xlLXN0ZXAgc2lnbmFsCisgICBieSBjb250aW51aW5nIHRvIHN0ZXAgaWYgdGhlIHBjIGlzIGluIHRoaXMgcmFuZ2UuICAqLworCitDT1JFX0FERFIgc3RlcF9yYW5nZV9zdGFydDsgLyogSW5jbHVzaXZlICovCitDT1JFX0FERFIgc3RlcF9yYW5nZV9lbmQ7IC8qIEV4Y2x1c2l2ZSAqLworCisvKiBTdGFjayBmcmFtZSBhZGRyZXNzIGFzIG9mIHdoZW4gc3RlcHBpbmcgY29tbWFuZCB3YXMgaXNzdWVkLgorICAgVGhpcyBpcyBob3cgd2Uga25vdyB3aGVuIHdlIHN0ZXAgaW50byBhIHN1YnJvdXRpbmUgY2FsbCwKKyAgIGFuZCBob3cgdG8gc2V0IHRoZSBmcmFtZSBmb3IgdGhlIGJyZWFrcG9pbnQgdXNlZCB0byBzdGVwIG91dC4gICovCisKK0NPUkVfQUREUiBzdGVwX2ZyYW1lX2FkZHJlc3M7CisKKy8qIE91ciBub3Rpb24gb2YgdGhlIGN1cnJlbnQgc3RhY2sgcG9pbnRlci4gICovCisKK0NPUkVfQUREUiBzdGVwX3NwOworCisvKiAxIG1lYW5zIHN0ZXAgb3ZlciBhbGwgc3Vicm91dGluZSBjYWxscy4KKyAgIDAgbWVhbnMgZG9uJ3Qgc3RlcCBvdmVyIGNhbGxzICh1c2VkIGJ5IHN0ZXBpKS4KKyAgIC0xIG1lYW5zIHN0ZXAgb3ZlciBjYWxscyB0byB1bmRlYnVnZ2FibGUgZnVuY3Rpb25zLiAgKi8KKworaW50IHN0ZXBfb3Zlcl9jYWxsczsKKworLyogSWYgc3RlcHBpbmcsIG5vbnplcm8gbWVhbnMgc3RlcCBjb3VudCBpcyA+IDEKKyAgIHNvIGRvbid0IHByaW50IGZyYW1lIG5leHQgdGltZSBpbmZlcmlvciBzdG9wcworICAgaWYgaXQgc3RvcHMgZHVlIHRvIHN0ZXBwaW5nLiAgKi8KKworaW50IHN0ZXBfbXVsdGk7CisKKy8qIEVudmlyb25tZW50IHRvIHVzZSBmb3IgcnVubmluZyBpbmZlcmlvciwKKyAgIGluIGZvcm1hdCBkZXNjcmliZWQgaW4gZW52aXJvbi5oLiAgKi8KKworc3RydWN0IGVudmlyb24gKmluZmVyaW9yX2Vudmlyb247CisKKwwKKy8qIEFSR1NVU0VEICovCit2b2lkCit0dHlfY29tbWFuZCAoZmlsZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmZpbGU7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaWYgKGZpbGUgPT0gMCkKKyAgICBlcnJvcl9ub19hcmcgKCJ0ZXJtaW5hbCBuYW1lIGZvciBydW5uaW5nIHRhcmdldCBwcm9jZXNzIik7CisKKyAgaW5mZXJpb3JfaW9fdGVybWluYWwgPSBzYXZlc3RyaW5nIChmaWxlLCBzdHJsZW4gKGZpbGUpKTsKK30KKworc3RhdGljIHZvaWQKK3J1bl9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjaGFyICpleGVjX2ZpbGU7CisKKyAgZG9udF9yZXBlYXQgKCk7CisKKyAgaWYgKGluZmVyaW9yX3BpZCAhPSAwICYmIHRhcmdldF9oYXNfZXhlY3V0aW9uKQorICAgIHsKKyAgICAgIGlmICgKKwkgICFxdWVyeSAoIlRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkIGhhcyBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cblwKK1N0YXJ0IGl0IGZyb20gdGhlIGJlZ2lubmluZz8gIikpCisJZXJyb3IgKCJQcm9ncmFtIG5vdCByZXN0YXJ0ZWQuIik7CisgICAgICB0YXJnZXRfa2lsbCAoKTsKKyNpZiBkZWZpbmVkKFNPTElCX1JFU1RBUlQpCisgICAgICBTT0xJQl9SRVNUQVJUICgpOworI2VuZGlmCisgICAgICBpbml0X3dhaXRfZm9yX2luZmVyaW9yICgpOworICAgIH0KKworICBjbGVhcl9icmVha3BvaW50X2hpdF9jb3VudHMgKCk7CisKKyAgZXhlY19maWxlID0gKGNoYXIgKikgZ2V0X2V4ZWNfZmlsZSAoMCk7CisKKyAgLyogUHVyZ2Ugb2xkIHNvbGliIG9iamZpbGVzLiAqLworICBvYmpmaWxlX3B1cmdlX3NvbGlicyAoKTsKKworICBkb19ydW5fY2xlYW51cHMgKE5VTEwpOworCisgIC8qIFRoZSBleGVjIGZpbGUgaXMgcmUtcmVhZCBldmVyeSB0aW1lIHdlIGRvIGEgZ2VuZXJpY19tb3Vybl9pbmZlcmlvciwgc28KKyAgICAgd2UganVzdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBzeW1ib2wgZmlsZS4gICovCisgIHJlcmVhZF9zeW1ib2xzICgpOworCisgIC8qIFdlIGtlZXAgc3ltYm9scyBmcm9tIGFkZC1zeW1ib2wtZmlsZSwgb24gdGhlIGdyb3VuZHMgdGhhdCB0aGUKKyAgICAgdXNlciBtaWdodCB3YW50IHRvIGFkZCBzb21lIHN5bWJvbHMgYmVmb3JlIHJ1bm5pbmcgdGhlIHByb2dyYW0KKyAgICAgKHJpZ2h0PykuICBCdXQgc29tZXRpbWVzIChkeW5hbWljIGxvYWRpbmcgd2hlcmUgdGhlIHVzZXIgbWFudWFsbHkKKyAgICAgaW50cm9kdWNlcyB0aGUgbmV3IHN5bWJvbHMgd2l0aCBhZGQtc3ltYm9sLWZpbGUpLCB0aGUgY29kZSB3aGljaAorICAgICB0aGUgc3ltYm9scyBkZXNjcmliZSBkb2VzIG5vdCBwZXJzaXN0IGJldHdlZW4gcnVucy4gIEN1cnJlbnRseQorICAgICB0aGUgdXNlciBoYXMgdG8gbWFudWFsbHkgbnVrZSBhbGwgc3ltYm9scyBiZXR3ZWVuIHJ1bnMgaWYgdGhleQorICAgICB3YW50IHRoZW0gdG8gZ28gYXdheSAoUFIgMjIwNykuICBUaGlzIGlzIHByb2JhYmx5IHJlYXNvbmFibGUuICAqLworCisgIGlmIChhcmdzKQorICAgIHsKKyAgICAgIGNoYXIgKmNtZDsKKyAgICAgIGNtZCA9IGNvbmNhdCAoInNldCBhcmdzICIsIGFyZ3MsIE5VTEwpOworICAgICAgbWFrZV9jbGVhbnVwIChmcmVlLCBjbWQpOworICAgICAgZXhlY3V0ZV9jb21tYW5kIChjbWQsIGZyb21fdHR5KTsKKyAgICB9CisKKyAgaWYgKGZyb21fdHR5KQorICAgIHsKKyAgICAgIHB1dHNfZmlsdGVyZWQoIlN0YXJ0aW5nIHByb2dyYW06ICIpOworICAgICAgaWYgKGV4ZWNfZmlsZSkKKwlwdXRzX2ZpbHRlcmVkKGV4ZWNfZmlsZSk7CisgICAgICBwdXRzX2ZpbHRlcmVkKCIgIik7CisgICAgICBwdXRzX2ZpbHRlcmVkKGluZmVyaW9yX2FyZ3MpOworICAgICAgcHV0c19maWx0ZXJlZCgiXG4iKTsKKyAgICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisgICAgfQorCisgIHRhcmdldF9jcmVhdGVfaW5mZXJpb3IgKGV4ZWNfZmlsZSwgaW5mZXJpb3JfYXJncywKKwkJCSAgZW52aXJvbl92ZWN0b3IgKGluZmVyaW9yX2Vudmlyb24pKTsKK30KKworCitzdGF0aWMgdm9pZAorcnVuX25vX2FyZ3NfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZXhlY3V0ZV9jb21tYW5kKCJzZXQgYXJncyIsIGZyb21fdHR5KTsKKyAgcnVuX2NvbW1hbmQoKGNoYXIgKilOVUxMLCBmcm9tX3R0eSk7Cit9CisKKwwKK3ZvaWQKK2NvbnRpbnVlX2NvbW1hbmQgKHByb2NfY291bnRfZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqcHJvY19jb3VudF9leHA7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgRVJST1JfTk9fSU5GRVJJT1I7CisKKyAgLyogSWYgaGF2ZSBhcmd1bWVudCwgc2V0IHByb2NlZWQgY291bnQgb2YgYnJlYWtwb2ludCB3ZSBzdG9wcGVkIGF0LiAgKi8KKworICBpZiAocHJvY19jb3VudF9leHAgIT0gTlVMTCkKKyAgICB7CisgICAgICBicHN0YXQgYnMgPSBzdG9wX2Jwc3RhdDsKKyAgICAgIGludCBudW0gPSBicHN0YXRfbnVtICgmYnMpOworICAgICAgaWYgKG51bSA9PSAwICYmIGZyb21fdHR5KQorCXsKKwkgIHByaW50Zl9maWx0ZXJlZAorCSAgICAoIk5vdCBzdG9wcGVkIGF0IGFueSBicmVha3BvaW50OyBhcmd1bWVudCBpZ25vcmVkLlxuIik7CisJfQorICAgICAgd2hpbGUgKG51bSAhPSAwKQorCXsKKwkgIHNldF9pZ25vcmVfY291bnQgKG51bSwKKwkJCSAgICBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIChwcm9jX2NvdW50X2V4cCkgLSAxLAorCQkJICAgIGZyb21fdHR5KTsKKwkgIC8qIHNldF9pZ25vcmVfY291bnQgcHJpbnRzIGEgbWVzc2FnZSBlbmRpbmcgd2l0aCBhIHBlcmlvZC4KKwkgICAgIFNvIHByaW50IHR3byBzcGFjZXMgYmVmb3JlICJDb250aW51aW5nLiIuICAqLworCSAgaWYgKGZyb21fdHR5KQorCSAgICBwcmludGZfZmlsdGVyZWQgKCIgICIpOworCSAgbnVtID0gYnBzdGF0X251bSAoJmJzKTsKKwl9CisgICAgfQorCisgIGlmIChmcm9tX3R0eSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJDb250aW51aW5nLlxuIik7CisKKyAgY2xlYXJfcHJvY2VlZF9zdGF0dXMgKCk7CisKKyAgcHJvY2VlZCAoKENPUkVfQUREUikgLTEsIFRBUkdFVF9TSUdOQUxfREVGQVVMVCwgMCk7Cit9CisMCisvKiBTdGVwIHVudGlsIG91dHNpZGUgb2YgY3VycmVudCBzdGF0ZW1lbnQuICAqLworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3N0ZXBfY29tbWFuZCAoY291bnRfc3RyaW5nLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqY291bnRfc3RyaW5nOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0ZXBfMSAoMCwgMCwgY291bnRfc3RyaW5nKTsKK30KKworLyogTGlrZXdpc2UsIGJ1dCBza2lwIG92ZXIgc3Vicm91dGluZSBjYWxscyBhcyBpZiBzaW5nbGUgaW5zdHJ1Y3Rpb25zLiAgKi8KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCituZXh0X2NvbW1hbmQgKGNvdW50X3N0cmluZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmNvdW50X3N0cmluZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBzdGVwXzEgKDEsIDAsIGNvdW50X3N0cmluZyk7Cit9CisKKy8qIExpa2V3aXNlLCBidXQgc3RlcCBvbmx5IG9uZSBpbnN0cnVjdGlvbi4gICovCisKKy8qIEFSR1NVU0VEICovCit2b2lkCitzdGVwaV9jb21tYW5kIChjb3VudF9zdHJpbmcsIGZyb21fdHR5KQorICAgICBjaGFyICpjb3VudF9zdHJpbmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgc3RlcF8xICgwLCAxLCBjb3VudF9zdHJpbmcpOworfQorCisvKiBBUkdTVVNFRCAqLwordm9pZAorbmV4dGlfY29tbWFuZCAoY291bnRfc3RyaW5nLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqY291bnRfc3RyaW5nOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0ZXBfMSAoMSwgMSwgY291bnRfc3RyaW5nKTsKK30KKworc3RhdGljIHZvaWQKK3N0ZXBfMSAoc2tpcF9zdWJyb3V0aW5lcywgc2luZ2xlX2luc3QsIGNvdW50X3N0cmluZykKKyAgICAgaW50IHNraXBfc3Vicm91dGluZXM7CisgICAgIGludCBzaW5nbGVfaW5zdDsKKyAgICAgY2hhciAqY291bnRfc3RyaW5nOworeworICByZWdpc3RlciBpbnQgY291bnQgPSAxOworICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7CisgIHN0cnVjdCBjbGVhbnVwICpjbGVhbnVwcyA9IDA7CisKKyAgRVJST1JfTk9fSU5GRVJJT1I7CisgIGNvdW50ID0gY291bnRfc3RyaW5nID8gcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAoY291bnRfc3RyaW5nKSA6IDE7CisKKyAgaWYgKCFzaW5nbGVfaW5zdCB8fCBza2lwX3N1YnJvdXRpbmVzKSAvKiBsZWF2ZSBzaSBjb21tYW5kIGFsb25lICovCisgICAgeworICAgICAgZW5hYmxlX2xvbmdqbXBfYnJlYWtwb2ludCgpOworICAgICAgY2xlYW51cHMgPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZGlzYWJsZV9sb25nam1wX2JyZWFrcG9pbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIH0KKworICBmb3IgKDsgY291bnQgPiAwOyBjb3VudC0tKQorICAgIHsKKyAgICAgIGNsZWFyX3Byb2NlZWRfc3RhdHVzICgpOworCisgICAgICBmcmFtZSA9IGdldF9jdXJyZW50X2ZyYW1lICgpOworICAgICAgaWYgKCFmcmFtZSkJCQkvKiBBdm9pZCBjb3JlZHVtcCBoZXJlLiAgV2h5IHRobz8gKi8KKwllcnJvciAoIk5vIGN1cnJlbnQgZnJhbWUiKTsKKyAgICAgIHN0ZXBfZnJhbWVfYWRkcmVzcyA9IEZSQU1FX0ZQIChmcmFtZSk7CisgICAgICBzdGVwX3NwID0gcmVhZF9zcCAoKTsKKworICAgICAgaWYgKCEgc2luZ2xlX2luc3QpCisJeworCSAgZmluZF9wY19saW5lX3BjX3JhbmdlIChzdG9wX3BjLCAmc3RlcF9yYW5nZV9zdGFydCwgJnN0ZXBfcmFuZ2VfZW5kKTsKKwkgIGlmIChzdGVwX3JhbmdlX2VuZCA9PSAwKQorCSAgICB7CisJICAgICAgY2hhciAqbmFtZTsKKwkgICAgICBpZiAoZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIChzdG9wX3BjLCAmbmFtZSwgJnN0ZXBfcmFuZ2Vfc3RhcnQsCisJCQkJCSAgICAmc3RlcF9yYW5nZV9lbmQpID09IDApCisJCWVycm9yICgiQ2Fubm90IGZpbmQgYm91bmRzIG9mIGN1cnJlbnQgZnVuY3Rpb24iKTsKKworCSAgICAgIHRhcmdldF90ZXJtaW5hbF9vdXJzICgpOworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlwKK1NpbmdsZSBzdGVwcGluZyB1bnRpbCBleGl0IGZyb20gZnVuY3Rpb24gJXMsIFxuXAord2hpY2ggaGFzIG5vIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLlxuIiwgbmFtZSk7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyogU2F5IHdlIGFyZSBzdGVwcGluZywgYnV0IHN0b3AgYWZ0ZXIgb25lIGluc24gd2hhdGV2ZXIgaXQgZG9lcy4gICovCisJICBzdGVwX3JhbmdlX3N0YXJ0ID0gc3RlcF9yYW5nZV9lbmQgPSAxOworCSAgaWYgKCFza2lwX3N1YnJvdXRpbmVzKQorCSAgICAvKiBJdCBpcyBzdGVwaS4KKwkgICAgICAgRG9uJ3Qgc3RlcCBvdmVyIGZ1bmN0aW9uIGNhbGxzLCBub3QgZXZlbiB0byBmdW5jdGlvbnMgbGFja2luZworCSAgICAgICBsaW5lIG51bWJlcnMuICAqLworCSAgICBzdGVwX292ZXJfY2FsbHMgPSAwOworCX0KKworICAgICAgaWYgKHNraXBfc3Vicm91dGluZXMpCisJc3RlcF9vdmVyX2NhbGxzID0gMTsKKworICAgICAgc3RlcF9tdWx0aSA9IChjb3VudCA+IDEpOworICAgICAgcHJvY2VlZCAoKENPUkVfQUREUikgLTEsIFRBUkdFVF9TSUdOQUxfREVGQVVMVCwgMSk7CisgICAgICBpZiAoISBzdG9wX3N0ZXApCisJYnJlYWs7CisKKyAgICAgIC8qIEZJWE1FOiBPbiBuZXh0aSwgdGhpcyBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gZG9uZSAod2hlbiB3ZSBoaXQgdGhlCisJIHN0ZXAgcmVzdW1lIGJyZWFrLCBJIHRoaW5rKS4gIFByb2JhYmx5IHRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvCisJIHdhaXRfZm9yX2luZmVyaW9yIChuZWFyIHRoZSB0b3ApLiAgKi8KKyNpZiBkZWZpbmVkIChTSElGVF9JTlNUX1JFR1MpCisgICAgICBTSElGVF9JTlNUX1JFR1MoKTsKKyNlbmRpZgorICAgIH0KKworICBpZiAoIXNpbmdsZV9pbnN0IHx8IHNraXBfc3Vicm91dGluZXMpCisgICAgZG9fY2xlYW51cHMoY2xlYW51cHMpOworfQorDAorLyogQ29udGludWUgcHJvZ3JhbSBhdCBzcGVjaWZpZWQgYWRkcmVzcy4gICovCisKK3N0YXRpYyB2b2lkCitqdW1wX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICByZWdpc3RlciBDT1JFX0FERFIgYWRkcjsKKyAgc3RydWN0IHN5bXRhYnNfYW5kX2xpbmVzIHNhbHM7CisgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOworICBzdHJ1Y3Qgc3ltYm9sICpmbjsKKyAgc3RydWN0IHN5bWJvbCAqc2ZuOworCisgIEVSUk9SX05PX0lORkVSSU9SOworCisgIGlmICghYXJnKQorICAgIGVycm9yX25vX2FyZyAoInN0YXJ0aW5nIGFkZHJlc3MiKTsKKworICBzYWxzID0gZGVjb2RlX2xpbmVfc3BlY18xIChhcmcsIDEpOworICBpZiAoc2Fscy5uZWx0cyAhPSAxKQorICAgIHsKKyAgICAgIGVycm9yICgiVW5yZWFzb25hYmxlIGp1bXAgcmVxdWVzdCIpOworICAgIH0KKworICBzYWwgPSBzYWxzLnNhbHNbMF07CisgIGZyZWUgKChQVFIpc2Fscy5zYWxzKTsKKworICBpZiAoc2FsLnN5bXRhYiA9PSAwICYmIHNhbC5wYyA9PSAwKQorICAgIGVycm9yICgiTm8gc291cmNlIGZpbGUgaGFzIGJlZW4gc3BlY2lmaWVkLiIpOworCisgIHJlc29sdmVfc2FsX3BjICgmc2FsKTsJCQkvKiBNYXkgZXJyb3Igb3V0ICovCisKKyAgLyogU2VlIGlmIHdlIGFyZSB0cnlpbmcgdG8ganVtcCB0byBhbm90aGVyIGZ1bmN0aW9uLiAqLworICBmbiA9IGdldF9mcmFtZV9mdW5jdGlvbiAoZ2V0X2N1cnJlbnRfZnJhbWUgKCkpOworICBzZm4gPSBmaW5kX3BjX2Z1bmN0aW9uIChzYWwucGMpOworICBpZiAoZm4gIT0gTlVMTCAmJiBzZm4gIT0gZm4pCisgICAgeworICAgICAgaWYgKCFxdWVyeSAoIkxpbmUgJWQgaXMgbm90IGluIGAlcycuICBKdW1wIGFueXdheT8gIiwgc2FsLmxpbmUsCisJCSAgU1lNQk9MX1NPVVJDRV9OQU1FIChmbikpKQorCXsKKwkgIGVycm9yICgiTm90IGNvbmZpcm1lZC4iKTsKKwkgIC8qIE5PVFJFQUNIRUQgKi8KKwl9CisgICAgfQorCisgIGlmIChzZm4gIT0gTlVMTCkgCisgICAgeworICAgICAgZml4dXBfc3ltYm9sX3NlY3Rpb24gKHNmbiwgMCk7CisgICAgICBpZiAoc2VjdGlvbl9pc19vdmVybGF5IChTWU1CT0xfQkZEX1NFQ1RJT04gKHNmbikpICYmIAorCSAgIXNlY3Rpb25faXNfbWFwcGVkIChTWU1CT0xfQkZEX1NFQ1RJT04gKHNmbikpKQorCXsKKwkgIGlmICghcXVlcnkgKCJXQVJOSU5HISEhICBEZXN0aW5hdGlvbiBpcyBpbiB1bm1hcHBlZCBvdmVybGF5ISAgSnVtcCBhbnl3YXk/ICIpKQorCSAgICB7CisJICAgICAgZXJyb3IgKCJOb3QgY29uZmlybWVkLiIpOworCSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KKwkgICAgfQorCX0KKyAgICB9CisKKworICBhZGRyID0gc2FsLnBjOworCisgIGlmIChmcm9tX3R0eSkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJDb250aW51aW5nIGF0ICIpOworICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChhZGRyLCAxLCBnZGJfc3Rkb3V0KTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIi5cbiIpOworICAgIH0KKworICBjbGVhcl9wcm9jZWVkX3N0YXR1cyAoKTsKKyAgcHJvY2VlZCAoYWRkciwgVEFSR0VUX1NJR05BTF8wLCAwKTsKK30KKworDAorLyogR28gdG8gbGluZSBvciBhZGRyZXNzIGluIGN1cnJlbnQgcHJvY2VkdXJlICovCitzdGF0aWMgdm9pZAorZ29fY29tbWFuZChsaW5lX25vLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqbGluZV9ubzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAobGluZV9ubyA9PSAoY2hhciAqKU5VTEwgfHwgISpsaW5lX25vKQorICAgIHByaW50Zl9maWx0ZXJlZChHT19VU0FHRSk7CisgIGVsc2UKKyAgICB7CisgICAgICB0YnJlYWtfY29tbWFuZChsaW5lX25vLCBmcm9tX3R0eSk7CisgICAgICBqdW1wX2NvbW1hbmQobGluZV9ubywgZnJvbV90dHkpOworICAgIH0KK30KKworDAorLyogQ29udGludWUgcHJvZ3JhbSBnaXZpbmcgaXQgc3BlY2lmaWVkIHNpZ25hbC4gICovCisKK3N0YXRpYyB2b2lkCitzaWduYWxfY29tbWFuZCAoc2lnbnVtX2V4cCwgZnJvbV90dHkpCisgICAgIGNoYXIgKnNpZ251bV9leHA7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZW51bSB0YXJnZXRfc2lnbmFsIG91cnNpZzsKKworICBkb250X3JlcGVhdCAoKTsJCS8qIFRvbyBkYW5nZXJvdXMuICAqLworICBFUlJPUl9OT19JTkZFUklPUjsKKworICBpZiAoIXNpZ251bV9leHApCisgICAgZXJyb3Jfbm9fYXJnICgic2lnbmFsIG51bWJlciIpOworCisgIC8qIEl0IHdvdWxkIGJlIGV2ZW4gc2xpY2tlciB0byBtYWtlIHNpZ25hbCBuYW1lcyBiZSB2YWxpZCBleHByZXNzaW9ucywKKyAgICAgKHRoZSB0eXBlIGNvdWxkIGJlICJlbnVtICRzaWduYWwiIG9yIHNvbWUgc3VjaCksIHRoZW4gdGhlIHVzZXIgY291bGQKKyAgICAgYXNzaWduIHRoZW0gdG8gY29udmVuaWVuY2UgdmFyaWFibGVzLiAgKi8KKyAgb3Vyc2lnID0gdGFyZ2V0X3NpZ25hbF9mcm9tX25hbWUgKHNpZ251bV9leHApOworCisgIGlmIChvdXJzaWcgPT0gVEFSR0VUX1NJR05BTF9VTktOT1dOKQorICAgIHsKKyAgICAgIC8qIE5vLCB0cnkgbnVtZXJpYy4gICovCisgICAgICBpbnQgbnVtID0gcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAoc2lnbnVtX2V4cCk7CisKKyAgICAgIGlmIChudW0gPT0gMCkKKwlvdXJzaWcgPSBUQVJHRVRfU0lHTkFMXzA7CisgICAgICBlbHNlCisJb3Vyc2lnID0gdGFyZ2V0X3NpZ25hbF9mcm9tX2NvbW1hbmQgKG51bSk7CisgICAgfQorCisgIGlmIChmcm9tX3R0eSkKKyAgICB7CisgICAgICBpZiAob3Vyc2lnID09IFRBUkdFVF9TSUdOQUxfMCkKKwlwcmludGZfZmlsdGVyZWQgKCJDb250aW51aW5nIHdpdGggbm8gc2lnbmFsLlxuIik7CisgICAgICBlbHNlCisJcHJpbnRmX2ZpbHRlcmVkICgiQ29udGludWluZyB3aXRoIHNpZ25hbCAlcy5cbiIsCisJCQkgdGFyZ2V0X3NpZ25hbF90b19uYW1lIChvdXJzaWcpKTsKKyAgICB9CisKKyAgY2xlYXJfcHJvY2VlZF9zdGF0dXMgKCk7CisgIC8qICJzaWduYWwgMCIgc2hvdWxkIG5vdCBnZXQgc3R1Y2sgaWYgd2UgYXJlIHN0b3BwZWQgYXQgYSBicmVha3BvaW50LgorICAgICBGSVhNRTogTmVpdGhlciBzaG91bGQgInNpZ25hbCBmb28iIGJ1dCB3aGVuIEkgdHJpZWQgcGFzc2luZworICAgICAoQ09SRV9BRERSKS0xIHVuY29uZGl0aW9uYWxseSBJIGdvdCBhIHRlc3RzdWl0ZSBmYWlsdXJlIHdoaWNoIEkgaGF2ZW4ndAorICAgICB0cmllZCB0byB0cmFjayBkb3duIHlldC4gICovCisgIHByb2NlZWQgKG91cnNpZyA9PSBUQVJHRVRfU0lHTkFMXzAgPyAoQ09SRV9BRERSKSAtMSA6IHN0b3BfcGMsIG91cnNpZywgMCk7Cit9CisKKy8qIENhbGwgYnJlYWtwb2ludF9hdXRvX2RlbGV0ZSBvbiB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgYnBzdGF0CisgICBwb2ludGVkIHRvIGJ5IGFyZyAod2hpY2ggaXMgcmVhbGx5IGEgYnBzdGF0ICopLiAgKi8KKworI2lmZGVmIENBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQKKworc3RhdGljIHZvaWQKK2JyZWFrcG9pbnRfYXV0b19kZWxldGVfY29udGVudHMgKGFyZykKKyAgICAgUFRSIGFyZzsKK3sKKyAgYnJlYWtwb2ludF9hdXRvX2RlbGV0ZSAoKihicHN0YXQgKilhcmcpOworfQorCisjZW5kaWYJLyogQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVCAqLworCisvKiBFeGVjdXRlIGEgInN0YWNrIGR1bW15IiwgYSBwaWVjZSBvZiBjb2RlIHN0b3JlZCBpbiB0aGUgc3RhY2sKKyAgIGJ5IHRoZSBkZWJ1Z2dlciB0byBiZSBleGVjdXRlZCBpbiB0aGUgaW5mZXJpb3IuCisKKyAgIFRvIGNhbGw6IGZpcnN0LCBkbyBQVVNIX0RVTU1ZX0ZSQU1FLgorICAgVGhlbiBwdXNoIHRoZSBjb250ZW50cyBvZiB0aGUgZHVtbXkuICBJdCBzaG91bGQgZW5kIHdpdGggYSBicmVha3BvaW50IGluc24uCisgICBUaGVuIGNhbGwgaGVyZSwgcGFzc2luZyBhZGRyZXNzIGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSBkdW1teS4KKworICAgVGhlIGNvbnRlbnRzIG9mIGFsbCByZWdpc3RlcnMgYXJlIHNhdmVkIGJlZm9yZSB0aGUgZHVtbXkgZnJhbWUgaXMgcG9wcGVkCisgICBhbmQgY29waWVkIGludG8gdGhlIGJ1ZmZlciBCVUZGRVIuCisKKyAgIFRoZSBkdW1teSdzIGZyYW1lIGlzIGF1dG9tYXRpY2FsbHkgcG9wcGVkIHdoZW5ldmVyIHRoYXQgYnJlYWsgaXMgaGl0LgorICAgSWYgdGhhdCBpcyB0aGUgZmlyc3QgdGltZSB0aGUgcHJvZ3JhbSBzdG9wcywgcnVuX3N0YWNrX2R1bW15CisgICByZXR1cm5zIHRvIGl0cyBjYWxsZXIgd2l0aCB0aGF0IGZyYW1lIGFscmVhZHkgZ29uZSBhbmQgcmV0dXJucyAwLgorICAgT3RoZXJ3aXNlLCBydW5fc3RhY2stZHVtbXkgcmV0dXJucyAxICh0aGUgZnJhbWUgd2lsbCBldmVudHVhbGx5IGJlIHBvcHBlZAorICAgd2hlbiB3ZSBkbyBoaXQgdGhhdCBicmVha3BvaW50KS4gICovCisKKy8qIERFQlVHIEhPT0s6ICA0ID0+IHJldHVybiBpbnN0ZWFkIG9mIGxldHRpbmcgdGhlIHN0YWNrIGR1bW15IHJ1bi4gICovCisKK3N0YXRpYyBpbnQgc3RhY2tfZHVtbXlfdGVzdGluZyA9IDA7CisKK2ludAorcnVuX3N0YWNrX2R1bW15IChhZGRyLCBidWZmZXIpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyIGJ1ZmZlcltSRUdJU1RFUl9CWVRFU107Cit7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2xlYW51cHMgPSBtYWtlX2NsZWFudXAgKG51bGxfY2xlYW51cCwgMCk7CisKKyAgLyogTm93IHByb2NlZWQsIGhhdmluZyByZWFjaGVkIHRoZSBkZXNpcmVkIHBsYWNlLiAgKi8KKyAgY2xlYXJfcHJvY2VlZF9zdGF0dXMgKCk7CisgIGlmIChzdGFja19kdW1teV90ZXN0aW5nICYgNCkKKyAgICB7CisgICAgICBQT1BfRlJBTUU7CisgICAgICByZXR1cm4oMCk7CisgICAgfQorI2lmZGVmIENBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQKKyAgeworICAgIHN0cnVjdCBicmVha3BvaW50ICpicHQ7CisgICAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CisKKyAgICBJTklUX1NBTCAoJnNhbCk7CS8qIGluaXRpYWxpemUgdG8gemVyb2VzICovCisjaWYgQ0FMTF9EVU1NWV9MT0NBVElPTiAhPSBBVF9FTlRSWV9QT0lOVAorICAgIHNhbC5wYyA9IGFkZHIgLSBDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCArIENBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQ7CisjZWxzZQorICAgIHNhbC5wYyA9IENBTExfRFVNTVlfQUREUkVTUyAoKTsKKyNlbmRpZgorICAgIHNhbC5zZWN0aW9uID0gZmluZF9wY19vdmVybGF5IChzYWwucGMpOworCisgICAgLyogU2V0IHVwIGEgRlJBTUUgZm9yIHRoZSBkdW1teSBmcmFtZSBzbyB3ZSBjYW4gcGFzcyBpdCB0bworICAgICAgIHNldF9tb21lbnRhcnlfYnJlYWtwb2ludC4gIFdlIG5lZWQgdG8gZ2l2ZSB0aGUgYnJlYWtwb2ludCBhCisgICAgICAgZnJhbWUgaW4gY2FzZSB0aGVyZSBpcyBvbmx5IG9uZSBjb3B5IG9mIHRoZSBkdW1teSAoZS5nLgorICAgICAgIENBTExfRFVNTVlfTE9DQVRJT04gPT0gQUZURVJfVEVYVF9FTkQpLiAgKi8KKyAgICBmbHVzaF9jYWNoZWRfZnJhbWVzICgpOworICAgIHNldF9jdXJyZW50X2ZyYW1lIChjcmVhdGVfbmV3X2ZyYW1lIChyZWFkX2ZwICgpLCBzYWwucGMpKTsKKworICAgIC8qIElmIGRlZmluZWQsIENBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQgaXMgd2hlcmUgd2UgbmVlZCB0byBwdXQKKyAgICAgICBhIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uICBJZiBub3QsIHRoZSBjYWxsIGR1bW15IGFscmVhZHkgaGFzIHRoZQorICAgICAgIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gaW4gaXQuCisKKyAgICAgICBhZGRyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWxsIGR1bW15IHBsdXMgdGhlIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VULAorICAgICAgIHNvIHdlIG5lZWQgdG8gc3VidHJhY3QgdGhlIENBTExfRFVNTVlfU1RBUlRfT0ZGU0VULiAgKi8KKyAgICBicHQgPSBzZXRfbW9tZW50YXJ5X2JyZWFrcG9pbnQgKHNhbCwKKwkJCQkgICAgZ2V0X2N1cnJlbnRfZnJhbWUgKCksCisJCQkJICAgIGJwX2NhbGxfZHVtbXkpOworICAgIGJwdC0+ZGlzcG9zaXRpb24gPSBkZWw7CisKKyAgICAvKiBJZiBhbGwgZXJyb3IoKXMgb3V0IG9mIHByb2NlZWQgZW5kZWQgdXAgY2FsbGluZyBub3JtYWxfc3RvcCAoYW5kCisgICAgICAgcGVyaGFwcyB0aGV5IHNob3VsZDsgaXQgYWxyZWFkeSBkb2VzIGluIHRoZSBzcGVjaWFsIGNhc2Ugb2YgZXJyb3IKKyAgICAgICBvdXQgb2YgcmVzdW1lKCkpLCB0aGVuIHdlIHdvdWxkbid0IG5lZWQgdGhpcy4gICovCisgICAgbWFrZV9jbGVhbnVwIChicmVha3BvaW50X2F1dG9fZGVsZXRlX2NvbnRlbnRzLCAmc3RvcF9icHN0YXQpOworICB9CisjZW5kaWYgLyogQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVC4gICovCisKKyAgZGlzYWJsZV93YXRjaHBvaW50c19iZWZvcmVfaW50ZXJhY3RpdmVfY2FsbF9zdGFydCAoKTsKKyAgcHJvY2VlZF90b19maW5pc2ggPSAxOwkvKiBXZSB3YW50IHN0b3BfcmVnaXN0ZXJzLCBwbGVhc2UuLi4gKi8KKyAgcHJvY2VlZCAoYWRkciwgVEFSR0VUX1NJR05BTF8wLCAwKTsKKyAgZW5hYmxlX3dhdGNocG9pbnRzX2FmdGVyX2ludGVyYWN0aXZlX2NhbGxfc3RvcCAoKTsKKworICBkaXNjYXJkX2NsZWFudXBzIChvbGRfY2xlYW51cHMpOworCisgIGlmICghc3RvcF9zdGFja19kdW1teSkKKyAgICByZXR1cm4gMTsKKworICAvKiBPbiByZXR1cm4sIHRoZSBzdGFjayBkdW1teSBoYXMgYmVlbiBwb3BwZWQgYWxyZWFkeS4gICovCisKKyAgbWVtY3B5IChidWZmZXIsIHN0b3BfcmVnaXN0ZXJzLCBzaXplb2Ygc3RvcF9yZWdpc3RlcnMpOworICByZXR1cm4gMDsKK30KKwwKKy8qIFByb2NlZWQgdW50aWwgd2UgcmVhY2ggYSBkaWZmZXJlbnQgc291cmNlIGxpbmUgd2l0aCBwYyBncmVhdGVyIHRoYW4KKyAgIG91ciBjdXJyZW50IG9uZSBvciBleGl0IHRoZSBmdW5jdGlvbi4gIFdlIHNraXAgY2FsbHMgaW4gYm90aCBjYXNlcy4KKworICAgTm90ZSB0aGF0IGV2ZW50dWFsbHkgdGhpcyBjb21tYW5kIHNob3VsZCBwcm9iYWJseSBiZSBjaGFuZ2VkIHNvCisgICB0aGF0IG9ubHkgc291cmNlIGxpbmVzIGFyZSBwcmludGVkIG91dCB3aGVuIHdlIGhpdCB0aGUgYnJlYWtwb2ludAorICAgd2Ugc2V0LiAgVGhpcyBtYXkgaW52b2x2ZSBjaGFuZ2VzIHRvIHdhaXRfZm9yX2luZmVyaW9yIGFuZCB0aGUKKyAgIHByb2NlZWQgc3RhdHVzIGNvZGUuICAqLworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3VudGlsX25leHRfY29tbWFuZCAoZnJvbV90dHkpCisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworICBDT1JFX0FERFIgcGM7CisgIHN0cnVjdCBzeW1ib2wgKmZ1bmM7CisgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOworIAorICBjbGVhcl9wcm9jZWVkX3N0YXR1cyAoKTsKKworICBmcmFtZSA9IGdldF9jdXJyZW50X2ZyYW1lICgpOworCisgIC8qIFN0ZXAgdW50aWwgZWl0aGVyIGV4aXRlZCBmcm9tIHRoaXMgZnVuY3Rpb24gb3IgZ3JlYXRlcgorICAgICB0aGFuIHRoZSBjdXJyZW50IGxpbmUgKGlmIGluIHN5bWJvbGljIHNlY3Rpb24pIG9yIHBjIChpZgorICAgICBub3QpLiAqLworCisgIHBjID0gcmVhZF9wYyAoKTsKKyAgZnVuYyA9IGZpbmRfcGNfZnVuY3Rpb24gKHBjKTsKKyAgCisgIGlmICghZnVuYykKKyAgICB7CisgICAgICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGMgKHBjKTsKKyAgICAgIAorICAgICAgaWYgKG1zeW1ib2wgPT0gTlVMTCkKKwllcnJvciAoIkV4ZWN1dGlvbiBpcyBub3Qgd2l0aGluIGEga25vd24gZnVuY3Rpb24uIik7CisgICAgICAKKyAgICAgIHN0ZXBfcmFuZ2Vfc3RhcnQgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCk7CisgICAgICBzdGVwX3JhbmdlX2VuZCA9IHBjOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNhbCA9IGZpbmRfcGNfbGluZSAocGMsIDApOworICAgICAgCisgICAgICBzdGVwX3JhbmdlX3N0YXJ0ID0gQkxPQ0tfU1RBUlQgKFNZTUJPTF9CTE9DS19WQUxVRSAoZnVuYykpOworICAgICAgc3RlcF9yYW5nZV9lbmQgPSBzYWwuZW5kOworICAgIH0KKyAgCisgIHN0ZXBfb3Zlcl9jYWxscyA9IDE7CisgIHN0ZXBfZnJhbWVfYWRkcmVzcyA9IEZSQU1FX0ZQIChmcmFtZSk7CisgIHN0ZXBfc3AgPSByZWFkX3NwICgpOworCisgIHN0ZXBfbXVsdGkgPSAwOwkJLyogT25seSBvbmUgY2FsbCB0byBwcm9jZWVkICovCisgIAorICBwcm9jZWVkICgoQ09SRV9BRERSKSAtMSwgVEFSR0VUX1NJR05BTF9ERUZBVUxULCAxKTsKK30KKworc3RhdGljIHZvaWQgCit1bnRpbF9jb21tYW5kIChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaWYgKCF0YXJnZXRfaGFzX2V4ZWN1dGlvbikKKyAgICBlcnJvciAoIlRoZSBwcm9ncmFtIGlzIG5vdCBydW5uaW5nLiIpOworICBpZiAoYXJnKQorICAgIHVudGlsX2JyZWFrX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpOworICBlbHNlCisgICAgdW50aWxfbmV4dF9jb21tYW5kIChmcm9tX3R0eSk7Cit9CisMCisvKiAiZmluaXNoIjogU2V0IGEgdGVtcG9yYXJ5IGJyZWFrcG9pbnQgYXQgdGhlIHBsYWNlCisgICB0aGUgc2VsZWN0ZWQgZnJhbWUgd2lsbCByZXR1cm4gdG8sIHRoZW4gY29udGludWUuICAqLworCitzdGF0aWMgdm9pZAorZmluaXNoX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKyAgcmVnaXN0ZXIgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworICByZWdpc3RlciBzdHJ1Y3Qgc3ltYm9sICpmdW5jdGlvbjsKKyAgc3RydWN0IGJyZWFrcG9pbnQgKmJyZWFrcG9pbnQ7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisKKyAgaWYgKGFyZykKKyAgICBlcnJvciAoIlRoZSBcImZpbmlzaFwiIGNvbW1hbmQgZG9lcyBub3QgdGFrZSBhbnkgYXJndW1lbnRzLiIpOworICBpZiAoIXRhcmdldF9oYXNfZXhlY3V0aW9uKQorICAgIGVycm9yICgiVGhlIHByb2dyYW0gaXMgbm90IHJ1bm5pbmcuIik7CisgIGlmIChzZWxlY3RlZF9mcmFtZSA9PSBOVUxMKQorICAgIGVycm9yICgiTm8gc2VsZWN0ZWQgZnJhbWUuIik7CisKKyAgZnJhbWUgPSBnZXRfcHJldl9mcmFtZSAoc2VsZWN0ZWRfZnJhbWUpOworICBpZiAoZnJhbWUgPT0gMCkKKyAgICBlcnJvciAoIlwiZmluaXNoXCIgbm90IG1lYW5pbmdmdWwgaW4gdGhlIG91dGVybW9zdCBmcmFtZS4iKTsKKworICBjbGVhcl9wcm9jZWVkX3N0YXR1cyAoKTsKKworICBzYWwgPSBmaW5kX3BjX2xpbmUgKGZyYW1lLT5wYywgMCk7CisgIHNhbC5wYyA9IGZyYW1lLT5wYzsKKworICBicmVha3BvaW50ID0gc2V0X21vbWVudGFyeV9icmVha3BvaW50IChzYWwsIGZyYW1lLCBicF9maW5pc2gpOworCisgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBkZWxldGVfYnJlYWtwb2ludCwgYnJlYWtwb2ludCk7CisKKyAgLyogRmluZCB0aGUgZnVuY3Rpb24gd2Ugd2lsbCByZXR1cm4gZnJvbS4gICovCisKKyAgZnVuY3Rpb24gPSBmaW5kX3BjX2Z1bmN0aW9uIChzZWxlY3RlZF9mcmFtZS0+cGMpOworCisgIC8qIFByaW50IGluZm8gb24gdGhlIHNlbGVjdGVkIGZyYW1lLCBpbmNsdWRpbmcgbGV2ZWwgbnVtYmVyCisgICAgIGJ1dCBub3Qgc291cmNlLiAgKi8KKyAgaWYgKGZyb21fdHR5KQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlJ1biB0aWxsIGV4aXQgZnJvbSAiKTsKKyAgICAgIHByaW50X3N0YWNrX2ZyYW1lIChzZWxlY3RlZF9mcmFtZSwgc2VsZWN0ZWRfZnJhbWVfbGV2ZWwsIDApOworICAgIH0KKworICBwcm9jZWVkX3RvX2ZpbmlzaCA9IDE7CQkvKiBXZSB3YW50IHN0b3BfcmVnaXN0ZXJzLCBwbGVhc2UuLi4gKi8KKyAgcHJvY2VlZCAoKENPUkVfQUREUikgLTEsIFRBUkdFVF9TSUdOQUxfREVGQVVMVCwgMCk7CisKKyAgLyogRGlkIHdlIHN0b3AgYXQgb3VyIGJyZWFrcG9pbnQ/ICovCisgIGlmIChicHN0YXRfZmluZF9icmVha3BvaW50KHN0b3BfYnBzdGF0LCBicmVha3BvaW50KSAhPSBOVUxMCisgICAgICAmJiBmdW5jdGlvbiAhPSAwKQorICAgIHsKKyAgICAgIHN0cnVjdCB0eXBlICp2YWx1ZV90eXBlOworICAgICAgcmVnaXN0ZXIgdmFsdWVfcHRyIHZhbDsKKyAgICAgIENPUkVfQUREUiBmdW5jYWRkcjsKKyAgICAgIGludCBzdHJ1Y3RfcmV0dXJuOworCisgICAgICB2YWx1ZV90eXBlID0gVFlQRV9UQVJHRVRfVFlQRSAoU1lNQk9MX1RZUEUgKGZ1bmN0aW9uKSk7CisgICAgICBpZiAoIXZhbHVlX3R5cGUpCisJZmF0YWwgKCJpbnRlcm5hbDogZmluaXNoX2NvbW1hbmQ6IGZ1bmN0aW9uIGhhcyBubyB0YXJnZXQgdHlwZSIpOworICAgICAgCisgICAgICBpZiAoVFlQRV9DT0RFICh2YWx1ZV90eXBlKSA9PSBUWVBFX0NPREVfVk9JRCkKKwlyZXR1cm47CisKKyAgICAgIGZ1bmNhZGRyID0gQkxPQ0tfU1RBUlQgKFNZTUJPTF9CTE9DS19WQUxVRSAoZnVuY3Rpb24pKTsKKworICAgICAgc3RydWN0X3JldHVybiA9IHVzaW5nX3N0cnVjdF9yZXR1cm4gKHZhbHVlX29mX3ZhcmlhYmxlIChmdW5jdGlvbiwgTlVMTCksCisKKwkJCQkgICBmdW5jYWRkciwKKwkJCQkgICBjaGVja190eXBlZGVmICh2YWx1ZV90eXBlKSwKKwkJQkxPQ0tfR0NDX0NPTVBJTEVEIChTWU1CT0xfQkxPQ0tfVkFMVUUgKGZ1bmN0aW9uKSkpOworCisgICAgICBpZiAoIXN0cnVjdF9yZXR1cm4pCisgICAgICB7CisgICAgICAgIHZhbCA9IHZhbHVlX2JlaW5nX3JldHVybmVkICh2YWx1ZV90eXBlLCBzdG9wX3JlZ2lzdGVycywgc3RydWN0X3JldHVybik7CisgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlZhbHVlIHJldHVybmVkIGlzICQlZCA9ICIsIHJlY29yZF9sYXRlc3RfdmFsdWUgKHZhbCkpOworICAgICAgICB2YWx1ZV9wcmludCAodmFsLCBnZGJfc3Rkb3V0LCAwLCBWYWxfbm9fcHJldHR5cHJpbnQpOworICAgICAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgIC8qIGVsejogd2UgY2Fubm90IGRldGVybWluZSB0aGUgY29udGVudHMgb2YgdGhlIHN0cnVjdHVyZSBiZWNhdXNlCisJICBpdCBpcyBvbiB0aGUgc3RhY2ssIGFuZCB3ZSBkb24ndCBrbm93IHdoZXJlLCBzaW5jZSB3ZSBkaWQgbm90CisJICBpbml0aWF0ZSB0aGUgY2FsbCwgYXMgb3Bwb3NlZCB0byB0aGUgY2FsbF9mdW5jdGlvbl9ieV9oYW5kIGNhc2UgKi8KKyNpZmRlZiBWQUxVRV9SRVRVUk5FRF9GUk9NX1NUQUNLCisgICAgICAgICAgdmFsID0gMDsKKyAgICAgICAgICBwcmludGZfZmlsdGVyZWQgKCJWYWx1ZSByZXR1cm5lZCBoYXMgdHlwZTogJXMuIiwgCisJCQkgICBUWVBFX05BTUUgKHZhbHVlX3R5cGUpKTsKKyAgICAgICAgICBwcmludGZfZmlsdGVyZWQgKCIgQ2Fubm90IGRldGVybWluZSBjb250ZW50c1xuIik7CisjZWxzZQorICAgICAgICAgIHZhbCA9IHZhbHVlX2JlaW5nX3JldHVybmVkICh2YWx1ZV90eXBlLCBzdG9wX3JlZ2lzdGVycywgCisJCQkJICAgICAgc3RydWN0X3JldHVybik7CisgICAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiVmFsdWUgcmV0dXJuZWQgaXMgJCVkID0gIiwgCisJCQkgICByZWNvcmRfbGF0ZXN0X3ZhbHVlICh2YWwpKTsKKyAgICAgICAgICB2YWx1ZV9wcmludCAodmFsLCBnZGJfc3Rkb3V0LCAwLCBWYWxfbm9fcHJldHR5cHJpbnQpOworICAgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisjZW5kaWYKKyAgICAgICAKKyAgICAgIH0KKyAgICB9CisgIGRvX2NsZWFudXBzKG9sZF9jaGFpbik7Cit9CisMCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3Byb2dyYW1faW5mbyAoYXJncywgZnJvbV90dHkpCisgICAgY2hhciAqYXJnczsKKyAgICBpbnQgZnJvbV90dHk7Cit7CisgIGJwc3RhdCBicyA9IHN0b3BfYnBzdGF0OworICBpbnQgbnVtID0gYnBzdGF0X251bSAoJmJzKTsKKyAgCisgIGlmICghdGFyZ2V0X2hhc19leGVjdXRpb24pCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiVGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgaXMgbm90IGJlaW5nIHJ1bi5cbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICB0YXJnZXRfZmlsZXNfaW5mbyAoKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiUHJvZ3JhbSBzdG9wcGVkIGF0ICVzLlxuIiwKKwkJICAgbG9jYWxfaGV4X3N0cmluZygodW5zaWduZWQgbG9uZykgc3RvcF9wYykpOworICBpZiAoc3RvcF9zdGVwKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIkl0IHN0b3BwZWQgYWZ0ZXIgYmVpbmcgc3RlcHBlZC5cbiIpOworICBlbHNlIGlmIChudW0gIT0gMCkKKyAgICB7CisgICAgICAvKiBUaGVyZSBtYXkgYmUgc2V2ZXJhbCBicmVha3BvaW50cyBpbiB0aGUgc2FtZSBwbGFjZSwgc28gdGhpcworCSBpc24ndCBhcyBzdHJhbmdlIGFzIGl0IHNlZW1zLiAgKi8KKyAgICAgIHdoaWxlIChudW0gIT0gMCkKKwl7CisJICBpZiAobnVtIDwgMCkKKwkgICAgeworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkl0IHN0b3BwZWQgYXQgYSBicmVha3BvaW50IHRoYXQgaGFzICIpOworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoInNpbmNlIGJlZW4gZGVsZXRlZC5cbiIpOworCSAgICB9CisJICBlbHNlCisJICAgIHByaW50Zl9maWx0ZXJlZCAoIkl0IHN0b3BwZWQgYXQgYnJlYWtwb2ludCAlZC5cbiIsIG51bSk7CisJICBudW0gPSBicHN0YXRfbnVtICgmYnMpOworCX0KKyAgICB9CisgIGVsc2UgaWYgKHN0b3Bfc2lnbmFsICE9IFRBUkdFVF9TSUdOQUxfMCkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJJdCBzdG9wcGVkIHdpdGggc2lnbmFsICVzLCAlcy5cbiIsCisJCSAgICAgICB0YXJnZXRfc2lnbmFsX3RvX25hbWUgKHN0b3Bfc2lnbmFsKSwKKwkJICAgICAgIHRhcmdldF9zaWduYWxfdG9fc3RyaW5nIChzdG9wX3NpZ25hbCkpOworICAgIH0KKworICBpZiAoIWZyb21fdHR5KQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlR5cGUgXCJpbmZvIHN0YWNrXCIgb3IgXCJpbmZvIHJlZ2lzdGVyc1wiICIpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4iKTsKKyAgICB9Cit9CisMCitzdGF0aWMgdm9pZAorZW52aXJvbm1lbnRfaW5mbyAodmFyLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqdmFyOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGlmICh2YXIpCisgICAgeworICAgICAgcmVnaXN0ZXIgY2hhciAqdmFsID0gZ2V0X2luX2Vudmlyb24gKGluZmVyaW9yX2Vudmlyb24sIHZhcik7CisgICAgICBpZiAodmFsKQorCXsKKwkgIHB1dHNfZmlsdGVyZWQgKHZhcik7CisJICBwdXRzX2ZpbHRlcmVkICgiID0gIik7CisJICBwdXRzX2ZpbHRlcmVkICh2YWwpOworCSAgcHV0c19maWx0ZXJlZCAoIlxuIik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHB1dHNfZmlsdGVyZWQgKCJFbnZpcm9ubWVudCB2YXJpYWJsZSBcIiIpOworCSAgcHV0c19maWx0ZXJlZCAodmFyKTsKKwkgIHB1dHNfZmlsdGVyZWQgKCJcIiBub3QgZGVmaW5lZC5cbiIpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZWdpc3RlciBjaGFyICoqdmVjdG9yID0gZW52aXJvbl92ZWN0b3IgKGluZmVyaW9yX2Vudmlyb24pOworICAgICAgd2hpbGUgKCp2ZWN0b3IpCisJeworCSAgcHV0c19maWx0ZXJlZCAoKnZlY3RvcisrKTsKKwkgIHB1dHNfZmlsdGVyZWQgKCJcbiIpOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfZW52aXJvbm1lbnRfY29tbWFuZCAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKnAsICp2YWwsICp2YXI7CisgIGludCBudWxsc2V0ID0gMDsKKworICBpZiAoYXJnID09IDApCisgICAgZXJyb3Jfbm9fYXJnICgiZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHZhbHVlIik7CisKKyAgLyogRmluZCBzZXBlcmF0aW9uIGJldHdlZW4gdmFyaWFibGUgbmFtZSBhbmQgdmFsdWUgKi8KKyAgcCA9IChjaGFyICopIHN0cmNociAoYXJnLCAnPScpOworICB2YWwgPSAoY2hhciAqKSBzdHJjaHIgKGFyZywgJyAnKTsKKworICBpZiAocCAhPSAwICYmIHZhbCAhPSAwKQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgYm90aCBhIHNwYWNlIGFuZCBhbiBlcXVhbHMuICBJZiB0aGUgc3BhY2UgaXMgYmVmb3JlIHRoZQorCSBlcXVhbHMsIHdhbGsgZm9yd2FyZCBvdmVyIHRoZSBzcGFjZXMgdGlsIHdlIHNlZSBhIG5vbnNwYWNlIAorCSAocG9zc2libHkgdGhlIGVxdWFscykuICovCisgICAgICBpZiAocCA+IHZhbCkKKwl3aGlsZSAoKnZhbCA9PSAnICcpCisJICB2YWwrKzsKKworICAgICAgLyogTm93IGlmIHRoZSA9IGlzIGFmdGVyIHRoZSBjaGFyIGZvbGxvd2luZyB0aGUgc3BhY2VzLAorCSB0YWtlIHRoZSBjaGFyIGZvbGxvd2luZyB0aGUgc3BhY2VzLiAgKi8KKyAgICAgIGlmIChwID4gdmFsKQorCXAgPSB2YWwgLSAxOworICAgIH0KKyAgZWxzZSBpZiAodmFsICE9IDAgJiYgcCA9PSAwKQorICAgIHAgPSB2YWw7CisKKyAgaWYgKHAgPT0gYXJnKQorICAgIGVycm9yX25vX2FyZyAoImVudmlyb25tZW50IHZhcmlhYmxlIHRvIHNldCIpOworCisgIGlmIChwID09IDAgfHwgcFsxXSA9PSAwKQorICAgIHsKKyAgICAgIG51bGxzZXQgPSAxOworICAgICAgaWYgKHAgPT0gMCkKKwlwID0gYXJnICsgc3RybGVuIChhcmcpOwkvKiBTbyB0aGF0IHNhdmVzdHJpbmcgYmVsb3cgd2lsbCB3b3JrICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogTm90IHNldHRpbmcgdmFyaWFibGUgdmFsdWUgdG8gbnVsbCAqLworICAgICAgdmFsID0gcCArIDE7CisgICAgICB3aGlsZSAoKnZhbCA9PSAnICcgfHwgKnZhbCA9PSAnXHQnKQorCXZhbCsrOworICAgIH0KKworICB3aGlsZSAocCAhPSBhcmcgJiYgKHBbLTFdID09ICcgJyB8fCBwWy0xXSA9PSAnXHQnKSkgcC0tOworCisgIHZhciA9IHNhdmVzdHJpbmcgKGFyZywgcCAtIGFyZyk7CisgIGlmIChudWxsc2V0KQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgIik7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJcIiVzXCIgdG8gbnVsbCB2YWx1ZS5cbiIsIHZhcik7CisgICAgICBzZXRfaW5fZW52aXJvbiAoaW5mZXJpb3JfZW52aXJvbiwgdmFyLCAiIik7CisgICAgfQorICBlbHNlCisgICAgc2V0X2luX2Vudmlyb24gKGluZmVyaW9yX2Vudmlyb24sIHZhciwgdmFsKTsKKyAgZnJlZSAodmFyKTsKK30KKworc3RhdGljIHZvaWQKK3Vuc2V0X2Vudmlyb25tZW50X2NvbW1hbmQgKHZhciwgZnJvbV90dHkpCisgICAgIGNoYXIgKnZhcjsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAodmFyID09IDApCisgICAgeworICAgICAgLyogSWYgdGhlcmUgaXMgbm8gYXJndW1lbnQsIGRlbGV0ZSBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCSBBc2sgZm9yIGNvbmZpcm1hdGlvbiBpZiByZWFkaW5nIGZyb20gdGhlIHRlcm1pbmFsLiAgKi8KKyAgICAgIGlmICghZnJvbV90dHkgfHwgcXVlcnkgKCJEZWxldGUgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcz8gIikpCisJeworCSAgZnJlZV9lbnZpcm9uIChpbmZlcmlvcl9lbnZpcm9uKTsKKwkgIGluZmVyaW9yX2Vudmlyb24gPSBtYWtlX2Vudmlyb24gKCk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHVuc2V0X2luX2Vudmlyb24gKGluZmVyaW9yX2Vudmlyb24sIHZhcik7Cit9CisKKy8qIEhhbmRsZSB0aGUgZXhlY3V0aW9uIHBhdGggKFBBVEggdmFyaWFibGUpICovCisKK3N0YXRpYyBjb25zdCBjaGFyIHBhdGhfdmFyX25hbWVbXSA9ICJQQVRIIjsKKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitwYXRoX2luZm8gKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHB1dHNfZmlsdGVyZWQgKCJFeGVjdXRhYmxlIGFuZCBvYmplY3QgZmlsZSBwYXRoOiAiKTsKKyAgcHV0c19maWx0ZXJlZCAoZ2V0X2luX2Vudmlyb24gKGluZmVyaW9yX2Vudmlyb24sIHBhdGhfdmFyX25hbWUpKTsKKyAgcHV0c19maWx0ZXJlZCAoIlxuIik7Cit9CisKKy8qIEFkZCB6ZXJvIG9yIG1vcmUgZGlyZWN0b3JpZXMgdG8gdGhlIGZyb250IG9mIHRoZSBleGVjdXRpb24gcGF0aC4gICovCisKK3N0YXRpYyB2b2lkCitwYXRoX2NvbW1hbmQgKGRpcm5hbWUsIGZyb21fdHR5KQorICAgICBjaGFyICpkaXJuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoYXIgKmV4ZWNfcGF0aDsKKyAgY2hhciAqZW52OworICBkb250X3JlcGVhdCAoKTsKKyAgZW52ID0gZ2V0X2luX2Vudmlyb24gKGluZmVyaW9yX2Vudmlyb24sIHBhdGhfdmFyX25hbWUpOworICAvKiBDYW4gYmUgbnVsbCBpZiBwYXRoIGlzIG5vdCBzZXQgKi8KKyAgaWYgKCFlbnYpCisgICAgZW52ID0gIiI7CisgIGV4ZWNfcGF0aCA9IHN0cnNhdmUgKGVudik7CisgIG1vZF9wYXRoIChkaXJuYW1lLCAmZXhlY19wYXRoKTsKKyAgc2V0X2luX2Vudmlyb24gKGluZmVyaW9yX2Vudmlyb24sIHBhdGhfdmFyX25hbWUsIGV4ZWNfcGF0aCk7CisgIGZyZWUgKGV4ZWNfcGF0aCk7CisgIGlmIChmcm9tX3R0eSkKKyAgICBwYXRoX2luZm8gKChjaGFyICopTlVMTCwgZnJvbV90dHkpOworfQorCisMCisjaWZkZWYgUkVHSVNURVJfTkFNRVMKK2NoYXIgKmdkYl9yZWdpc3Rlcl9uYW1lc1tdID0gUkVHSVNURVJfTkFNRVM7CisjZW5kaWYKKy8qIFByaW50IG91dCB0aGUgbWFjaGluZSByZWdpc3RlciByZWdudW0uIElmIHJlZ251bSBpcyAtMSwKKyAgIHByaW50IGFsbCByZWdpc3RlcnMgKGZwcmVncyA9PSAxKSBvciBhbGwgbm9uLWZsb2F0IHJlZ2lzdGVycworICAgKGZwcmVncyA9PSAwKS4KKworICAgRm9yIG1vc3QgbWFjaGluZXMsIGhhdmluZyBhbGxfcmVnaXN0ZXJzX2luZm8oKSBwcmludCB0aGUKKyAgIHJlZ2lzdGVyKHMpIG9uZSBwZXIgbGluZSBpcyBnb29kIGVub3VnaC4gSWYgYSBkaWZmZXJlbnQgZm9ybWF0CisgICBpcyByZXF1aXJlZCwgKGVnLCBmb3IgTUlQUyBvciBQeXJhbWlkIDkweCwgd2hpY2ggYm90aCBoYXZlCisgICBsb3RzIG9mIHJlZ3MpLCBvciB0aGVyZSBpcyBhbiBleGlzdGluZyBjb252ZW50aW9uIGZvciBzaG93aW5nCisgICBhbGwgdGhlIHJlZ2lzdGVycywgZGVmaW5lIHRoZSBtYWNybyBET19SRUdJU1RFUlNfSU5GTyhyZWdudW0sIGZwKQorICAgdG8gcHJvdmlkZSB0aGF0IGZvcm1hdC4gICovICAKKworI2lmICFkZWZpbmVkIChET19SRUdJU1RFUlNfSU5GTykKKworI2RlZmluZSBET19SRUdJU1RFUlNfSU5GTyhyZWdudW0sIGZwKSBkb19yZWdpc3RlcnNfaW5mbyhyZWdudW0sIGZwKQorCitzdGF0aWMgdm9pZAorZG9fcmVnaXN0ZXJzX2luZm8gKHJlZ251bSwgZnByZWdzKQorICAgICBpbnQgcmVnbnVtOworICAgICBpbnQgZnByZWdzOworeworICByZWdpc3RlciBpbnQgaTsKKyAgaW50IG51bXJlZ3MgPSBBUkNIX05VTV9SRUdTOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1yZWdzOyBpKyspCisgICAgeworICAgICAgY2hhciByYXdfYnVmZmVyW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisgICAgICBjaGFyIHZpcnR1YWxfYnVmZmVyW01BWF9SRUdJU1RFUl9WSVJUVUFMX1NJWkVdOworCisgICAgICAvKiBEZWNpZGUgYmV0d2VlbiBwcmludGluZyBhbGwgcmVncywgbm9uZmxvYXQgcmVncywgb3Igc3BlY2lmaWMgcmVnLiAgKi8KKyAgICAgIGlmIChyZWdudW0gPT0gLTEpIHsKKwlpZiAoVFlQRV9DT0RFIChSRUdJU1RFUl9WSVJUVUFMX1RZUEUgKGkpKSA9PSBUWVBFX0NPREVfRkxUICYmICFmcHJlZ3MpCisJICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpICE9IHJlZ251bSkKKwkgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKiBJZiB0aGUgcmVnaXN0ZXIgbmFtZSBpcyBlbXB0eSwgaXQgaXMgdW5kZWZpbmVkIGZvciB0aGlzCisJIHByb2Nlc3Nvciwgc28gZG9uJ3QgZGlzcGxheSBhbnl0aGluZy4gICovCisgICAgICBpZiAoUkVHSVNURVJfTkFNRSAoaSkgPT0gTlVMTCB8fCAqKFJFR0lTVEVSX05BTUUgKGkpKSA9PSAnXDAnKQorCWNvbnRpbnVlOworCisgICAgICBmcHV0c19maWx0ZXJlZCAoUkVHSVNURVJfTkFNRSAoaSksIGdkYl9zdGRvdXQpOworICAgICAgcHJpbnRfc3BhY2VzX2ZpbHRlcmVkICgxNSAtIHN0cmxlbiAoUkVHSVNURVJfTkFNRSAoaSkpLCBnZGJfc3Rkb3V0KTsKKworICAgICAgLyogR2V0IHRoZSBkYXRhIGluIHJhdyBmb3JtYXQuICAqLworICAgICAgaWYgKHJlYWRfcmVsYXRpdmVfcmVnaXN0ZXJfcmF3X2J5dGVzIChpLCByYXdfYnVmZmVyKSkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCIqdmFsdWUgbm90IGF2YWlsYWJsZSpcbiIpOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBDb252ZXJ0IHJhdyBkYXRhIHRvIHZpcnR1YWwgZm9ybWF0IGlmIG5lY2Vzc2FyeS4gICovCisjaWZkZWYgUkVHSVNURVJfQ09OVkVSVElCTEUKKyAgICAgIGlmIChSRUdJU1RFUl9DT05WRVJUSUJMRSAoaSkpCisJeworCSAgUkVHSVNURVJfQ09OVkVSVF9UT19WSVJUVUFMIChpLCBSRUdJU1RFUl9WSVJUVUFMX1RZUEUgKGkpLAorCQkJCSAgICAgICByYXdfYnVmZmVyLCB2aXJ0dWFsX2J1ZmZlcik7CisJfQorICAgICAgZWxzZQorI2VuZGlmCisJbWVtY3B5ICh2aXJ0dWFsX2J1ZmZlciwgcmF3X2J1ZmZlciwKKwkJUkVHSVNURVJfVklSVFVBTF9TSVpFIChpKSk7CisKKyAgICAgIC8qIElmIHZpcnR1YWwgZm9ybWF0IGlzIGZsb2F0aW5nLCBwcmludCBpdCB0aGF0IHdheSwgYW5kIGluIHJhdyBoZXguICAqLworICAgICAgaWYgKFRZUEVfQ09ERSAoUkVHSVNURVJfVklSVFVBTF9UWVBFIChpKSkgPT0gVFlQRV9DT0RFX0ZMVCkKKwl7CisJICByZWdpc3RlciBpbnQgajsKKworI2lmZGVmIElOVkFMSURfRkxPQVQKKwkgIGlmIChJTlZBTElEX0ZMT0FUICh2aXJ0dWFsX2J1ZmZlciwgUkVHSVNURVJfVklSVFVBTF9TSVpFIChpKSkpCisJICAgIHByaW50Zl9maWx0ZXJlZCAoIjxpbnZhbGlkIGZsb2F0PiIpOworCSAgZWxzZQorI2VuZGlmCisJICAgIHZhbF9wcmludCAoUkVHSVNURVJfVklSVFVBTF9UWVBFIChpKSwgdmlydHVhbF9idWZmZXIsIDAsIDAsCisJCSAgICAgICBnZGJfc3Rkb3V0LCAwLCAxLCAwLCBWYWxfcHJldHR5X2RlZmF1bHQpOworCisJICBwcmludGZfZmlsdGVyZWQgKCJcdChyYXcgMHgiKTsKKwkgIGZvciAoaiA9IDA7IGogPCBSRUdJU1RFUl9SQVdfU0laRSAoaSk7IGorKykKKwkgICAgeworCSAgICAgIHJlZ2lzdGVyIGludCBpZHggPSBUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOID8gagorCQk6IFJFR0lTVEVSX1JBV19TSVpFIChpKSAtIDEgLSBqOworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiUwMngiLCAodW5zaWduZWQgY2hhcilyYXdfYnVmZmVyW2lkeF0pOworCSAgICB9CisJICBwcmludGZfZmlsdGVyZWQgKCIpIik7CisJfQorCisvKiBGSVhNRSEgIHZhbF9wcmludCBwcm9iYWJseSBjYW4gaGFuZGxlIGFsbCBvZiB0aGVzZSBjYXNlcyBub3cuLi4gICovCisKKyAgICAgIC8qIEVsc2UgaWYgdmlydHVhbCBmb3JtYXQgaXMgdG9vIGxvbmcgZm9yIHByaW50ZiwKKwkgcHJpbnQgaW4gaGV4IGEgYnl0ZSBhdCBhIHRpbWUuICAqLworICAgICAgZWxzZSBpZiAoUkVHSVNURVJfVklSVFVBTF9TSVpFIChpKSA+IChpbnQpIHNpemVvZiAobG9uZykpCisJeworCSAgcmVnaXN0ZXIgaW50IGo7CisJICBwcmludGZfZmlsdGVyZWQgKCIweCIpOworCSAgZm9yIChqID0gMDsgaiA8IFJFR0lTVEVSX1ZJUlRVQUxfU0laRSAoaSk7IGorKykKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgiJTAyeCIsICh1bnNpZ25lZCBjaGFyKXZpcnR1YWxfYnVmZmVyW2pdKTsKKwl9CisgICAgICAvKiBFbHNlIHByaW50IGFzIGludGVnZXIgaW4gaGV4IGFuZCBpbiBkZWNpbWFsLiAgKi8KKyAgICAgIGVsc2UKKwl7CisJICB2YWxfcHJpbnQgKFJFR0lTVEVSX1ZJUlRVQUxfVFlQRSAoaSksIHZpcnR1YWxfYnVmZmVyLCAwLCAwLAorCQkgICAgIGdkYl9zdGRvdXQsICd4JywgMSwgMCwgVmFsX3ByZXR0eV9kZWZhdWx0KTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlx0Iik7CisJICB2YWxfcHJpbnQgKFJFR0lTVEVSX1ZJUlRVQUxfVFlQRSAoaSksIHZpcnR1YWxfYnVmZmVyLCAwLCAwLAorCQkgICAgIGdkYl9zdGRvdXQsICAgMCwgMSwgMCwgVmFsX3ByZXR0eV9kZWZhdWx0KTsKKwl9CisKKyAgICAgIC8qIFRoZSBTUEFSQyB3YW50cyB0byBwcmludCBldmVuLW51bWJlcmVkIGZsb2F0IHJlZ3MgYXMgZG91YmxlcworCSBpbiBhZGRpdGlvbiB0byBwcmludGluZyB0aGVtIGFzIGZsb2F0cy4gICovCisjaWZkZWYgUFJJTlRfUkVHSVNURVJfSE9PSworICAgICAgUFJJTlRfUkVHSVNURVJfSE9PSyAoaSk7CisjZW5kaWYKKworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgICB9Cit9CisjZW5kaWYgLyogbm8gRE9fUkVHSVNURVJTX0lORk8uICAqLworCitleHRlcm4gaW50IHRhcmdldF9tYXBfbmFtZV90b19yZWdpc3RlciBQQVJBTVMgKChjaGFyICosIGludCkpOworCit2b2lkCityZWdpc3RlcnNfaW5mbyAoYWRkcl9leHAsIGZwcmVncykKKyAgICAgY2hhciAqYWRkcl9leHA7CisgICAgIGludCBmcHJlZ3M7Cit7CisgIGludCByZWdudW0sIG51bXJlZ3M7CisgIHJlZ2lzdGVyIGNoYXIgKmVuZDsKKworICBpZiAoIXRhcmdldF9oYXNfcmVnaXN0ZXJzKQorICAgIGVycm9yICgiVGhlIHByb2dyYW0gaGFzIG5vIHJlZ2lzdGVycyBub3cuIik7CisgIGlmIChzZWxlY3RlZF9mcmFtZSA9PSBOVUxMKQorICAgIGVycm9yICgiTm8gc2VsZWN0ZWQgZnJhbWUuIik7CisKKyAgaWYgKCFhZGRyX2V4cCkKKyAgICB7CisgICAgICBET19SRUdJU1RFUlNfSU5GTygtMSwgZnByZWdzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZG8KKyAgICB7ICAgICAgCisgICAgICBpZiAoYWRkcl9leHBbMF0gPT0gJyQnKQorCWFkZHJfZXhwKys7CisgICAgICBlbmQgPSBhZGRyX2V4cDsKKyAgICAgIHdoaWxlICgqZW5kICE9ICdcMCcgJiYgKmVuZCAhPSAnICcgJiYgKmVuZCAhPSAnXHQnKQorCSsrZW5kOworICAgICAgbnVtcmVncyA9IEFSQ0hfTlVNX1JFR1M7CisKKyAgICAgIHJlZ251bSA9IHRhcmdldF9tYXBfbmFtZV90b19yZWdpc3RlciAoYWRkcl9leHAsIGVuZCAtIGFkZHJfZXhwKTsKKyAgICAgIGlmIChyZWdudW0gPj0gMCkgCisJZ290byBmb3VuZDsKKworICAgICAgcmVnbnVtID0gbnVtcmVnczsKKworICAgICAgaWYgKCphZGRyX2V4cCA+PSAnMCcgJiYgKmFkZHJfZXhwIDw9ICc5JykKKwlyZWdudW0gPSBhdG9pIChhZGRyX2V4cCk7CQkvKiBUYWtlIGEgbnVtYmVyICovCisgICAgICBpZiAocmVnbnVtID49IG51bXJlZ3MpCQkvKiBCYWQgbmFtZSwgb3IgYmFkIG51bWJlciAqLworCWVycm9yICgiJS4qczogaW52YWxpZCByZWdpc3RlciIsIGVuZCAtIGFkZHJfZXhwLCBhZGRyX2V4cCk7CisKK2ZvdW5kOgorICAgICAgRE9fUkVHSVNURVJTX0lORk8ocmVnbnVtLCBmcHJlZ3MpOworCisgICAgICBhZGRyX2V4cCA9IGVuZDsKKyAgICAgIHdoaWxlICgqYWRkcl9leHAgPT0gJyAnIHx8ICphZGRyX2V4cCA9PSAnXHQnKQorCSsrYWRkcl9leHA7CisgICAgfSB3aGlsZSAoKmFkZHJfZXhwICE9ICdcMCcpOworfQorCit2b2lkCithbGxfcmVnaXN0ZXJzX2luZm8gKGFkZHJfZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYWRkcl9leHA7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcmVnaXN0ZXJzX2luZm8gKGFkZHJfZXhwLCAxKTsKK30KKwordm9pZAorbm9mcF9yZWdpc3RlcnNfaW5mbyAoYWRkcl9leHAsIGZyb21fdHR5KQorICAgICBjaGFyICphZGRyX2V4cDsKKyAgICAgaW50IGZyb21fdHR5OworeworICByZWdpc3RlcnNfaW5mbyAoYWRkcl9leHAsIDApOworfQorCisMCisvKgorICogVE9ETzoKKyAqIFNob3VsZCBzYXZlL3Jlc3RvcmUgdGhlIHR0eSBzdGF0ZSBzaW5jZSBpdCBtaWdodCBiZSB0aGF0IHRoZQorICogcHJvZ3JhbSB0byBiZSBkZWJ1Z2dlZCB3YXMgc3RhcnRlZCBvbiB0aGlzIHR0eSBhbmQgaXQgd2FudHMKKyAqIHRoZSB0dHkgaW4gc29tZSBzdGF0ZSBvdGhlciB0aGFuIHdoYXQgd2Ugd2FudC4gIElmIGl0J3MgcnVubmluZworICogb24gYW5vdGhlciB0ZXJtaW5hbCBvciB3aXRob3V0IGEgdGVybWluYWwsIHRoZW4gc2F2aW5nIGFuZAorICogcmVzdG9yaW5nIHRoZSB0dHkgc3RhdGUgaXMgYSBoYXJtbGVzcyBuby1vcC4KKyAqIFRoaXMgb25seSBuZWVkcyB0byBiZSBkb25lIGlmIHdlIGFyZSBhdHRhY2hpbmcgdG8gYSBwcm9jZXNzLgorICovCisKKy8qCisgICBhdHRhY2hfY29tbWFuZCAtLQorICAgdGFrZXMgYSBwcm9ncmFtIHN0YXJ0ZWQgdXAgb3V0c2lkZSBvZiBnZGIgYW5kIGBgYXR0YWNoZXMnJyB0byBpdC4KKyAgIFRoaXMgc3RvcHMgaXQgY29sZCBpbiBpdHMgdHJhY2tzIGFuZCBhbGxvd3MgdXMgdG8gc3RhcnQgZGVidWdnaW5nIGl0LgorICAgYW5kIHdhaXQgZm9yIHRoZSB0cmFjZS10cmFwIHRoYXQgcmVzdWx0cyBmcm9tIGF0dGFjaGluZy4gICovCisKK3ZvaWQKK2F0dGFjaF9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworI2lmZGVmIFNPTElCX0FERAorICBleHRlcm4gaW50IGF1dG9fc29saWJfYWRkOworI2VuZGlmCisKKyAgY2hhciAqICBleGVjX2ZpbGU7CisgIGNoYXIgKiAgZnVsbF9leGVjX3BhdGggPSBOVUxMOworCisgIGRvbnRfcmVwZWF0ICgpOwkJCS8qIE5vdCBmb3IgdGhlIGZhaW50IG9mIGhlYXJ0ICovCisKKyAgaWYgKHRhcmdldF9oYXNfZXhlY3V0aW9uKQorICAgIHsKKyAgICAgIGlmIChxdWVyeSAoIkEgcHJvZ3JhbSBpcyBiZWluZyBkZWJ1Z2dlZCBhbHJlYWR5LiAgS2lsbCBpdD8gIikpCisJdGFyZ2V0X2tpbGwgKCk7CisgICAgICBlbHNlCisJZXJyb3IgKCJOb3Qga2lsbGVkLiIpOworICAgIH0KKworICB0YXJnZXRfYXR0YWNoIChhcmdzLCBmcm9tX3R0eSk7CisKKyAgLyogU2V0IHVwIHRoZSAic2F2ZWQgdGVybWluYWwgbW9kZXMiIG9mIHRoZSBpbmZlcmlvcgorICAgICBiYXNlZCBvbiB3aGF0IG1vZGVzIHdlIGFyZSBzdGFydGluZyBpdCB3aXRoLiAgKi8KKyAgdGFyZ2V0X3Rlcm1pbmFsX2luaXQgKCk7CisKKyAgLyogSW5zdGFsbCBpbmZlcmlvcidzIHRlcm1pbmFsIG1vZGVzLiAgKi8KKyAgdGFyZ2V0X3Rlcm1pbmFsX2luZmVyaW9yICgpOworCisgIC8qIFNldCB1cCBleGVjdXRpb24gY29udGV4dCB0byBrbm93IHRoYXQgd2Ugc2hvdWxkIHJldHVybiBmcm9tCisgICAgIHdhaXRfZm9yX2luZmVyaW9yIGFzIHNvb24gYXMgdGhlIHRhcmdldCByZXBvcnRzIGEgc3RvcC4gICovCisgIGluaXRfd2FpdF9mb3JfaW5mZXJpb3IgKCk7CisgIGNsZWFyX3Byb2NlZWRfc3RhdHVzICgpOworICBzdG9wX3Nvb25fcXVpZXRseSA9IDE7CisKKyAgLyogTm8gdHJhcHMgYXJlIGdlbmVyYXRlZCB3aGVuIGF0dGFjaGluZyB0byBpbmZlcmlvciB1bmRlciBNYWNoIDMKKyAgICAgb3IgR05VIGh1cmQuICAqLworI2lmbmRlZiBBVFRBQ0hfTk9fV0FJVAorICB3YWl0X2Zvcl9pbmZlcmlvciAoKTsKKyNlbmRpZgorCisgIC8qCisgICAqIElmIG5vIGV4ZWMgZmlsZSBpcyB5ZXQga25vd24sIHRyeSB0byBkZXRlcm1pbmUgaXQgZnJvbSB0aGUKKyAgICogcHJvY2VzcyBpdHNlbGYuCisgICAqLworICBleGVjX2ZpbGUgPSAoY2hhciAqKSBnZXRfZXhlY19maWxlICgwKTsKKyAgaWYgKCEgZXhlY19maWxlKSB7CisgICAgZXhlY19maWxlID0gdGFyZ2V0X3BpZF90b19leGVjX2ZpbGUgKGluZmVyaW9yX3BpZCk7CisgICAgaWYgKGV4ZWNfZmlsZSkgeworICAgICAvKiBJdCdzIHBvc3NpYmxlIHdlIGRvbid0IGhhdmUgYSBmdWxsIHBhdGgsIGJ1dCByYXRoZXIganVzdCBhCisgICAgICAgICBmaWxlbmFtZS4gIFNvbWUgdGFyZ2V0cywgc3VjaCBhcyBIUC1VWCwgZG9uJ3QgcHJvdmlkZSB0aGUKKyAgICAgICAgIGZ1bGwgcGF0aCwgc2lnaC4KKworICAgICAgICAgQXR0ZW1wdCB0byBxdWFsaWZ5IHRoZSBmaWxlbmFtZSBhZ2FpbnN0IHRoZSBzb3VyY2UgcGF0aC4KKyAgICAgICAgIChJZiB0aGF0IGZhaWxzLCB3ZSdsbCBqdXN0IGZhbGwgYmFjayBvbiB0aGUgb3JpZ2luYWwKKyAgICAgICAgIGZpbGVuYW1lLiAgTm90IG11Y2ggbW9yZSB3ZSBjYW4gZG8uLi4pCisgICAgICAgICAqLworICAgICAgaWYgKCFzb3VyY2VfZnVsbF9wYXRoX29mIChleGVjX2ZpbGUsICZmdWxsX2V4ZWNfcGF0aCkpCisgICAgICAgIGZ1bGxfZXhlY19wYXRoID0gc2F2ZXN0cmluZyAoZXhlY19maWxlLCBzdHJsZW4gKGV4ZWNfZmlsZSkpOworCisgICAgICBleGVjX2ZpbGVfYXR0YWNoIChmdWxsX2V4ZWNfcGF0aCwgZnJvbV90dHkpOworICAgICAgc3ltYm9sX2ZpbGVfY29tbWFuZCAoZnVsbF9leGVjX3BhdGgsIGZyb21fdHR5KTsKKyAgICB9CisgIH0KKworI2lmZGVmIFNPTElCX0FERAorICBpZiAoYXV0b19zb2xpYl9hZGQpCisgICAgeworICAgICAgLyogQWRkIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbHMgZnJvbSB0aGUgbmV3bHkgYXR0YWNoZWQgcHJvY2VzcywgaWYgYW55LiAgKi8KKyAgICAgIFNPTElCX0FERCAoKGNoYXIgKikwLCBmcm9tX3R0eSwgJmN1cnJlbnRfdGFyZ2V0KTsKKyAgICAgIHJlX2VuYWJsZV9icmVha3BvaW50c19pbl9zaGxpYnMgKCk7CisgICAgfQorI2VuZGlmCisKKyAgLyogVGFrZSBhbnkgbmVjZXNzYXJ5IHBvc3QtYXR0YWNoaW5nIGFjdGlvbnMgZm9yIHRoaXMgcGxhdGZvcm0uCisgICAgICovCisgIHRhcmdldF9wb3N0X2F0dGFjaCAoaW5mZXJpb3JfcGlkKTsKKworICBub3JtYWxfc3RvcCAoKTsKK30KKworLyoKKyAqIGRldGFjaF9jb21tYW5kIC0tCisgKiB0YWtlcyBhIHByb2dyYW0gcHJldmlvdXNseSBhdHRhY2hlZCB0byBhbmQgZGV0YWNoZXMgaXQuCisgKiBUaGUgcHJvZ3JhbSByZXN1bWVzIGV4ZWN1dGlvbiBhbmQgd2lsbCBubyBsb25nZXIgc3RvcAorICogb24gc2lnbmFscywgZXRjLiAgV2UgYmV0dGVyIG5vdCBoYXZlIGxlZnQgYW55IGJyZWFrcG9pbnRzCisgKiBpbiB0aGUgcHJvZ3JhbSBvciBpdCdsbCBkaWUgd2hlbiBpdCBoaXRzIG9uZS4gIEZvciB0aGlzCisgKiB0byB3b3JrLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IGZvciB0aGUgcHJvY2VzcyB0byBoYXZlIGJlZW4KKyAqIHByZXZpb3VzbHkgYXR0YWNoZWQuICBJdCAqbWlnaHQqIHdvcmsgaWYgdGhlIHByb2dyYW0gd2FzCisgKiBzdGFydGVkIHZpYSB0aGUgbm9ybWFsIHB0cmFjZSAoUFRSQUNFX1RSQUNFTUUpLgorICovCisKK3N0YXRpYyB2b2lkCitkZXRhY2hfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZG9udF9yZXBlYXQgKCk7CQkJLyogTm90IGZvciB0aGUgZmFpbnQgb2YgaGVhcnQgKi8KKyAgdGFyZ2V0X2RldGFjaCAoYXJncywgZnJvbV90dHkpOworI2lmIGRlZmluZWQoU09MSUJfUkVTVEFSVCkKKyAgU09MSUJfUkVTVEFSVCAoKTsKKyNlbmRpZgorfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2Zsb2F0X2luZm8gKGFkZHJfZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYWRkcl9leHA7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyNpZmRlZiBGTE9BVF9JTkZPCisgIEZMT0FUX0lORk87CisjZWxzZQorICBwcmludGZfZmlsdGVyZWQgKCJObyBmbG9hdGluZyBwb2ludCBpbmZvIGF2YWlsYWJsZSBmb3IgdGhpcyBwcm9jZXNzb3IuXG4iKTsKKyNlbmRpZgorfQorDAorLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCit1bnNldF9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBwcmludGZfZmlsdGVyZWQgKCJcInVuc2V0XCIgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiAiKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiYW4gdW5zZXQgc3ViY29tbWFuZC5cbiIpOworICBoZWxwX2xpc3QgKHVuc2V0bGlzdCwgInVuc2V0ICIsIC0xLCBnZGJfc3Rkb3V0KTsKK30KKwordm9pZAorX2luaXRpYWxpemVfaW5mY21kICgpCit7CisgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjOworICAKKyAgYWRkX2NvbSAoInR0eSIsIGNsYXNzX3J1biwgdHR5X2NvbW1hbmQsCisJICAgIlNldCB0ZXJtaW5hbCBmb3IgZnV0dXJlIHJ1bnMgb2YgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZC4iKTsKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoImFyZ3MiLCBjbGFzc19ydW4sIHZhcl9zdHJpbmdfbm9lc2NhcGUsIAorCQkgIChjaGFyICopJmluZmVyaW9yX2FyZ3MsCisiU2V0IGFyZ3VtZW50IGxpc3QgdG8gZ2l2ZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkIHdoZW4gaXQgaXMgc3RhcnRlZC5cblwKK0ZvbGxvdyB0aGlzIGNvbW1hbmQgd2l0aCBhbnkgbnVtYmVyIG9mIGFyZ3MsIHRvIGJlIHBhc3NlZCB0byB0aGUgcHJvZ3JhbS4iLAorCQkgICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKKworICBjID0gYWRkX2NtZAorICAgICgiZW52aXJvbm1lbnQiLCBub19jbGFzcywgZW52aXJvbm1lbnRfaW5mbywKKyAgICAgIlRoZSBlbnZpcm9ubWVudCB0byBnaXZlIHRoZSBwcm9ncmFtLCBvciBvbmUgdmFyaWFibGUncyB2YWx1ZS5cblwKK1dpdGggYW4gYXJndW1lbnQgVkFSLCBwcmludHMgdGhlIHZhbHVlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIFZBUiB0b1xuXAorZ2l2ZSB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZC4gIFdpdGggbm8gYXJndW1lbnRzLCBwcmludHMgdGhlIGVudGlyZVxuXAorZW52aXJvbm1lbnQgdG8gYmUgZ2l2ZW4gdG8gdGhlIHByb2dyYW0uIiwgJnNob3dsaXN0KTsKKyAgYy0+Y29tcGxldGVyID0gbm9vcF9jb21wbGV0ZXI7CisKKyAgYWRkX3ByZWZpeF9jbWQgKCJ1bnNldCIsIG5vX2NsYXNzLCB1bnNldF9jb21tYW5kLAorCQkgICJDb21wbGVtZW50IHRvIGNlcnRhaW4gXCJzZXRcIiBjb21tYW5kcyIsCisJCSAgJnVuc2V0bGlzdCwgInVuc2V0ICIsIDAsICZjbWRsaXN0KTsKKyAgCisgIGMgPSBhZGRfY21kICgiZW52aXJvbm1lbnQiLCBjbGFzc19ydW4sIHVuc2V0X2Vudmlyb25tZW50X2NvbW1hbmQsCisJICAgICAgIkNhbmNlbCBlbnZpcm9ubWVudCB2YXJpYWJsZSBWQVIgZm9yIHRoZSBwcm9ncmFtLlxuXAorVGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIHByb2dyYW0gdW50aWwgdGhlIG5leHQgXCJydW5cIiBjb21tYW5kLiIsCisJICAgJnVuc2V0bGlzdCk7CisgIGMtPmNvbXBsZXRlciA9IG5vb3BfY29tcGxldGVyOworCisgIGMgPSBhZGRfY21kICgiZW52aXJvbm1lbnQiLCBjbGFzc19ydW4sIHNldF9lbnZpcm9ubWVudF9jb21tYW5kLAorCSAgICAgICAiU2V0IGVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlIHRvIGdpdmUgdGhlIHByb2dyYW0uXG5cCitBcmd1bWVudHMgYXJlIFZBUiBWQUxVRSB3aGVyZSBWQVIgaXMgdmFyaWFibGUgbmFtZSBhbmQgVkFMVUUgaXMgdmFsdWUuXG5cCitWQUxVRVMgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSB1bmludGVycHJldGVkIHN0cmluZ3MuXG5cCitUaGlzIGRvZXMgbm90IGFmZmVjdCB0aGUgcHJvZ3JhbSB1bnRpbCB0aGUgbmV4dCBcInJ1blwiIGNvbW1hbmQuIiwKKwkgICAmc2V0bGlzdCk7CisgIGMtPmNvbXBsZXRlciA9IG5vb3BfY29tcGxldGVyOworIAorICBhZGRfY29tICgicGF0aCIsIGNsYXNzX2ZpbGVzLCBwYXRoX2NvbW1hbmQsCisgICAgICAgIkFkZCBkaXJlY3RvcnkgRElSKHMpIHRvIGJlZ2lubmluZyBvZiBzZWFyY2ggcGF0aCBmb3Igb2JqZWN0IGZpbGVzLlxuXAorJGN3ZCBpbiB0aGUgcGF0aCBtZWFucyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cblwKK1RoaXMgcGF0aCBpcyBlcXVpdmFsZW50IHRvIHRoZSAkUEFUSCBzaGVsbCB2YXJpYWJsZS4gIEl0IGlzIGEgbGlzdCBvZlxuXAorZGlyZWN0b3JpZXMsIHNlcGFyYXRlZCBieSBjb2xvbnMuICBUaGVzZSBkaXJlY3RvcmllcyBhcmUgc2VhcmNoZWQgdG8gZmluZFxuXAorZnVsbHkgbGlua2VkIGV4ZWN1dGFibGUgZmlsZXMgYW5kIHNlcGFyYXRlbHkgY29tcGlsZWQgb2JqZWN0IGZpbGVzIGFzIG5lZWRlZC4iKTsKKworICBjID0gYWRkX2NtZCAoInBhdGhzIiwgbm9fY2xhc3MsIHBhdGhfaW5mbywKKwkgICAgIkN1cnJlbnQgc2VhcmNoIHBhdGggZm9yIGZpbmRpbmcgb2JqZWN0IGZpbGVzLlxuXAorJGN3ZCBpbiB0aGUgcGF0aCBtZWFucyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cblwKK1RoaXMgcGF0aCBpcyBlcXVpdmFsZW50IHRvIHRoZSAkUEFUSCBzaGVsbCB2YXJpYWJsZS4gIEl0IGlzIGEgbGlzdCBvZlxuXAorZGlyZWN0b3JpZXMsIHNlcGFyYXRlZCBieSBjb2xvbnMuICBUaGVzZSBkaXJlY3RvcmllcyBhcmUgc2VhcmNoZWQgdG8gZmluZFxuXAorZnVsbHkgbGlua2VkIGV4ZWN1dGFibGUgZmlsZXMgYW5kIHNlcGFyYXRlbHkgY29tcGlsZWQgb2JqZWN0IGZpbGVzIGFzIG5lZWRlZC4iLAorCSAgICAgICAmc2hvd2xpc3QpOworICBjLT5jb21wbGV0ZXIgPSBub29wX2NvbXBsZXRlcjsKKworIGFkZF9jb20gKCJhdHRhY2giLCBjbGFzc19ydW4sIGF0dGFjaF9jb21tYW5kLAorIAkgICAiQXR0YWNoIHRvIGEgcHJvY2VzcyBvciBmaWxlIG91dHNpZGUgb2YgR0RCLlxuXAorVGhpcyBjb21tYW5kIGF0dGFjaGVzIHRvIGFub3RoZXIgdGFyZ2V0LCBvZiB0aGUgc2FtZSB0eXBlIGFzIHlvdXIgbGFzdFxuXAorXCJ0YXJnZXRcIiBjb21tYW5kIChcImluZm8gZmlsZXNcIiB3aWxsIHNob3cgeW91ciB0YXJnZXQgc3RhY2spLlxuXAorVGhlIGNvbW1hbmQgbWF5IHRha2UgYXMgYXJndW1lbnQgYSBwcm9jZXNzIGlkIG9yIGEgZGV2aWNlIGZpbGUuXG5cCitGb3IgYSBwcm9jZXNzIGlkLCB5b3UgbXVzdCBoYXZlIHBlcm1pc3Npb24gdG8gc2VuZCB0aGUgcHJvY2VzcyBhIHNpZ25hbCxcblwKK2FuZCBpdCBtdXN0IGhhdmUgdGhlIHNhbWUgZWZmZWN0aXZlIHVpZCBhcyB0aGUgZGVidWdnZXIuXG5cCitXaGVuIHVzaW5nIFwiYXR0YWNoXCIgd2l0aCBhIHByb2Nlc3MgaWQsIHRoZSBkZWJ1Z2dlciBmaW5kcyB0aGVcblwKK3Byb2dyYW0gcnVubmluZyBpbiB0aGUgcHJvY2VzcywgbG9va2luZyBmaXJzdCBpbiB0aGUgY3VycmVudCB3b3JraW5nXG5cCitkaXJlY3RvcnksIG9yIChpZiBub3QgZm91bmQgdGhlcmUpIHVzaW5nIHRoZSBzb3VyY2UgZmlsZSBzZWFyY2ggcGF0aFxuXAorKHNlZSB0aGUgXCJkaXJlY3RvcnlcIiBjb21tYW5kKS4gIFlvdSBjYW4gYWxzbyB1c2UgdGhlIFwiZmlsZVwiIGNvbW1hbmRcblwKK3RvIHNwZWNpZnkgdGhlIHByb2dyYW0sIGFuZCB0byBsb2FkIGl0cyBzeW1ib2wgdGFibGUuIik7CisKKyAgYWRkX2NvbSAoImRldGFjaCIsIGNsYXNzX3J1biwgZGV0YWNoX2NvbW1hbmQsCisJICAgIkRldGFjaCBhIHByb2Nlc3Mgb3IgZmlsZSBwcmV2aW91c2x5IGF0dGFjaGVkLlxuXAorSWYgYSBwcm9jZXNzLCBpdCBpcyBubyBsb25nZXIgdHJhY2VkLCBhbmQgaXQgY29udGludWVzIGl0cyBleGVjdXRpb24uICBJZlxuXAoreW91IHdlcmUgZGVidWdnaW5nIGEgZmlsZSwgdGhlIGZpbGUgaXMgY2xvc2VkIGFuZCBnZGIgbm8gbG9uZ2VyIGFjY2Vzc2VzIGl0LiIpOworCisgIGFkZF9jb20gKCJzaWduYWwiLCBjbGFzc19ydW4sIHNpZ25hbF9jb21tYW5kLAorCSAgICJDb250aW51ZSBwcm9ncmFtIGdpdmluZyBpdCBzaWduYWwgc3BlY2lmaWVkIGJ5IHRoZSBhcmd1bWVudC5cblwKK0FuIGFyZ3VtZW50IG9mIFwiMFwiIG1lYW5zIGNvbnRpbnVlIHByb2dyYW0gd2l0aG91dCBnaXZpbmcgaXQgYSBzaWduYWwuIik7CisKKyAgYWRkX2NvbSAoInN0ZXBpIiwgY2xhc3NfcnVuLCBzdGVwaV9jb21tYW5kLAorCSAgICJTdGVwIG9uZSBpbnN0cnVjdGlvbiBleGFjdGx5LlxuXAorQXJndW1lbnQgTiBtZWFucyBkbyB0aGlzIE4gdGltZXMgKG9yIHRpbGwgcHJvZ3JhbSBzdG9wcyBmb3IgYW5vdGhlciByZWFzb24pLiIpOworICBhZGRfY29tX2FsaWFzICgic2kiLCAic3RlcGkiLCBjbGFzc19hbGlhcywgMCk7CisKKyAgYWRkX2NvbSAoIm5leHRpIiwgY2xhc3NfcnVuLCBuZXh0aV9jb21tYW5kLAorCSAgICJTdGVwIG9uZSBpbnN0cnVjdGlvbiwgYnV0IHByb2NlZWQgdGhyb3VnaCBzdWJyb3V0aW5lIGNhbGxzLlxuXAorQXJndW1lbnQgTiBtZWFucyBkbyB0aGlzIE4gdGltZXMgKG9yIHRpbGwgcHJvZ3JhbSBzdG9wcyBmb3IgYW5vdGhlciByZWFzb24pLiIpOworICBhZGRfY29tX2FsaWFzICgibmkiLCAibmV4dGkiLCBjbGFzc19hbGlhcywgMCk7CisKKyAgYWRkX2NvbSAoImZpbmlzaCIsIGNsYXNzX3J1biwgZmluaXNoX2NvbW1hbmQsCisJICAgIkV4ZWN1dGUgdW50aWwgc2VsZWN0ZWQgc3RhY2sgZnJhbWUgcmV0dXJucy5cblwKK1Vwb24gcmV0dXJuLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgcHJpbnRlZCBhbmQgcHV0IGluIHRoZSB2YWx1ZSBoaXN0b3J5LiIpOworCisgIGFkZF9jb20gKCJuZXh0IiwgY2xhc3NfcnVuLCBuZXh0X2NvbW1hbmQsCisJICAgIlN0ZXAgcHJvZ3JhbSwgcHJvY2VlZGluZyB0aHJvdWdoIHN1YnJvdXRpbmUgY2FsbHMuXG5cCitMaWtlIHRoZSBcInN0ZXBcIiBjb21tYW5kIGFzIGxvbmcgYXMgc3Vicm91dGluZSBjYWxscyBkbyBub3QgaGFwcGVuO1xuXAord2hlbiB0aGV5IGRvLCB0aGUgY2FsbCBpcyB0cmVhdGVkIGFzIG9uZSBpbnN0cnVjdGlvbi5cblwKK0FyZ3VtZW50IE4gbWVhbnMgZG8gdGhpcyBOIHRpbWVzIChvciB0aWxsIHByb2dyYW0gc3RvcHMgZm9yIGFub3RoZXIgcmVhc29uKS4iKTsKKyAgYWRkX2NvbV9hbGlhcyAoIm4iLCAibmV4dCIsIGNsYXNzX3J1biwgMSk7CisgIGlmICh4ZGJfY29tbWFuZHMpCisgICAgYWRkX2NvbV9hbGlhcygiUyIsICJuZXh0IiwgY2xhc3NfcnVuLCAxKTsKKworICBhZGRfY29tICgic3RlcCIsIGNsYXNzX3J1biwgc3RlcF9jb21tYW5kLAorCSAgICJTdGVwIHByb2dyYW0gdW50aWwgaXQgcmVhY2hlcyBhIGRpZmZlcmVudCBzb3VyY2UgbGluZS5cblwKK0FyZ3VtZW50IE4gbWVhbnMgZG8gdGhpcyBOIHRpbWVzIChvciB0aWxsIHByb2dyYW0gc3RvcHMgZm9yIGFub3RoZXIgcmVhc29uKS4iKTsKKyAgYWRkX2NvbV9hbGlhcyAoInMiLCAic3RlcCIsIGNsYXNzX3J1biwgMSk7CisKKyAgYWRkX2NvbSAoInVudGlsIiwgY2xhc3NfcnVuLCB1bnRpbF9jb21tYW5kLAorIkV4ZWN1dGUgdW50aWwgdGhlIHByb2dyYW0gcmVhY2hlcyBhIHNvdXJjZSBsaW5lIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudFxuXAorb3IgYSBzcGVjaWZpZWQgbGluZSBvciBhZGRyZXNzIG9yIGZ1bmN0aW9uIChzYW1lIGFyZ3MgYXMgYnJlYWsgY29tbWFuZCkuXG5cCitFeGVjdXRpb24gd2lsbCBhbHNvIHN0b3AgdXBvbiBleGl0IGZyb20gdGhlIGN1cnJlbnQgc3RhY2sgZnJhbWUuIik7CisgIGFkZF9jb21fYWxpYXMgKCJ1IiwgInVudGlsIiwgY2xhc3NfcnVuLCAxKTsKKyAgCisgIGFkZF9jb20gKCJqdW1wIiwgY2xhc3NfcnVuLCBqdW1wX2NvbW1hbmQsCisJICAgIkNvbnRpbnVlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgYXQgc3BlY2lmaWVkIGxpbmUgb3IgYWRkcmVzcy5cblwKK0dpdmUgYXMgYXJndW1lbnQgZWl0aGVyIExJTkVOVU0gb3IgKkFERFIsIHdoZXJlIEFERFIgaXMgYW4gZXhwcmVzc2lvblxuXAorZm9yIGFuIGFkZHJlc3MgdG8gc3RhcnQgYXQuIik7CisKKyAgYWRkX2NvbSAoImdvIiwgY2xhc3NfcnVuLCBnb19jb21tYW5kLAorCSAgICJVc2FnZTogZ28gPGxvY2F0aW9uPlxuXAorQ29udGludWUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZCwgc3RvcHBpbmcgYXQgc3BlY2lmaWVkIGxpbmUgb3IgXG5cCithZGRyZXNzLlxuXAorR2l2ZSBhcyBhcmd1bWVudCBlaXRoZXIgTElORU5VTSBvciAqQUREUiwgd2hlcmUgQUREUiBpcyBhbiBcblwKK2V4cHJlc3Npb24gZm9yIGFuIGFkZHJlc3MgdG8gc3RhcnQgYXQuXG5cCitUaGlzIGNvbW1hbmQgaXMgYSBjb21iaW5hdGlvbiBvZiB0YnJlYWsgYW5kIGp1bXAuIik7CisgIGlmICh4ZGJfY29tbWFuZHMpCisgICAgYWRkX2NvbV9hbGlhcygiZyIsICJnIiwgY2xhc3NfcnVuLCAxKTsKKworICBhZGRfY29tICgiY29udGludWUiLCBjbGFzc19ydW4sIGNvbnRpbnVlX2NvbW1hbmQsCisJICAgIkNvbnRpbnVlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQsIGFmdGVyIHNpZ25hbCBvciBicmVha3BvaW50LlxuXAorSWYgcHJvY2VlZGluZyBmcm9tIGJyZWFrcG9pbnQsIGEgbnVtYmVyIE4gbWF5IGJlIHVzZWQgYXMgYW4gYXJndW1lbnQsXG5cCit3aGljaCBtZWFucyB0byBzZXQgdGhlIGlnbm9yZSBjb3VudCBvZiB0aGF0IGJyZWFrcG9pbnQgdG8gTiAtIDEgKHNvIHRoYXRcblwKK3RoZSBicmVha3BvaW50IHdvbid0IGJyZWFrIHVudGlsIHRoZSBOdGggdGltZSBpdCBpcyByZWFjaGVkKS4iKTsKKyAgYWRkX2NvbV9hbGlhcyAoImMiLCAiY29udCIsIGNsYXNzX3J1biwgMSk7CisgIGFkZF9jb21fYWxpYXMgKCJmZyIsICJjb250IiwgY2xhc3NfcnVuLCAxKTsKKworICBhZGRfY29tICgicnVuIiwgY2xhc3NfcnVuLCBydW5fY29tbWFuZCwKKwkgICAiU3RhcnQgZGVidWdnZWQgcHJvZ3JhbS4gIFlvdSBtYXkgc3BlY2lmeSBhcmd1bWVudHMgdG8gZ2l2ZSBpdC5cblwKK0FyZ3MgbWF5IGluY2x1ZGUgXCIqXCIsIG9yIFwiWy4uLl1cIjsgdGhleSBhcmUgZXhwYW5kZWQgdXNpbmcgXCJzaFwiLlxuXAorSW5wdXQgYW5kIG91dHB1dCByZWRpcmVjdGlvbiB3aXRoIFwiPlwiLCBcIjxcIiwgb3IgXCI+PlwiIGFyZSBhbHNvIGFsbG93ZWQuXG5cblwKK1dpdGggbm8gYXJndW1lbnRzLCB1c2VzIGFyZ3VtZW50cyBsYXN0IHNwZWNpZmllZCAod2l0aCBcInJ1blwiIG9yIFwic2V0IGFyZ3NcIikuXG5cCitUbyBjYW5jZWwgcHJldmlvdXMgYXJndW1lbnRzIGFuZCBydW4gd2l0aCBubyBhcmd1bWVudHMsXG5cCit1c2UgXCJzZXQgYXJnc1wiIHdpdGhvdXQgYXJndW1lbnRzLiIpOworICBhZGRfY29tX2FsaWFzICgiciIsICJydW4iLCBjbGFzc19ydW4sIDEpOworICBpZiAoeGRiX2NvbW1hbmRzKQorICAgIGFkZF9jb20gKCJSIiwgY2xhc3NfcnVuLCBydW5fbm9fYXJnc19jb21tYW5kLAorICAgICAgICAgIlN0YXJ0IGRlYnVnZ2VkIHByb2dyYW0gd2l0aCBubyBhcmd1bWVudHMuIik7CisKKyAgYWRkX2luZm8gKCJyZWdpc3RlcnMiLCBub2ZwX3JlZ2lzdGVyc19pbmZvLAorICAgICJMaXN0IG9mIGludGVnZXIgcmVnaXN0ZXJzIGFuZCB0aGVpciBjb250ZW50cywgZm9yIHNlbGVjdGVkIHN0YWNrIGZyYW1lLlxuXAorUmVnaXN0ZXIgbmFtZSBhcyBhcmd1bWVudCBtZWFucyBkZXNjcmliZSBvbmx5IHRoYXQgcmVnaXN0ZXIuIik7CisKKyAgaWYgKHhkYl9jb21tYW5kcykKKyAgICBhZGRfY29tKCJsciIsIGNsYXNzX2luZm8sIG5vZnBfcmVnaXN0ZXJzX2luZm8sCisgICAgIkxpc3Qgb2YgaW50ZWdlciByZWdpc3RlcnMgYW5kIHRoZWlyIGNvbnRlbnRzLCBmb3Igc2VsZWN0ZWQgc3RhY2sgZnJhbWUuXG5cCisgIFJlZ2lzdGVyIG5hbWUgYXMgYXJndW1lbnQgbWVhbnMgZGVzY3JpYmUgb25seSB0aGF0IHJlZ2lzdGVyLiIpOworICBhZGRfaW5mbyAoImFsbC1yZWdpc3RlcnMiLCBhbGxfcmVnaXN0ZXJzX2luZm8sCisgICAgIkxpc3Qgb2YgYWxsIHJlZ2lzdGVycyBhbmQgdGhlaXIgY29udGVudHMsIGZvciBzZWxlY3RlZCBzdGFjayBmcmFtZS5cblwKK1JlZ2lzdGVyIG5hbWUgYXMgYXJndW1lbnQgbWVhbnMgZGVzY3JpYmUgb25seSB0aGF0IHJlZ2lzdGVyLiIpOworCisgIGFkZF9pbmZvICgicHJvZ3JhbSIsIHByb2dyYW1faW5mbywKKwkgICAgIkV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIHByb2dyYW0uIik7CisKKyAgYWRkX2luZm8gKCJmbG9hdCIsIGZsb2F0X2luZm8sCisJICAgICJQcmludCB0aGUgc3RhdHVzIG9mIHRoZSBmbG9hdGluZyBwb2ludCB1bml0XG4iKTsKKworICBpbmZlcmlvcl9hcmdzID0gc2F2ZXN0cmluZyAoIiIsIDEpOwkvKiBJbml0aWFsbHkgbm8gYXJncyAqLworICBpbmZlcmlvcl9lbnZpcm9uID0gbWFrZV9lbnZpcm9uICgpOworICBpbml0X2Vudmlyb24gKGluZmVyaW9yX2Vudmlyb24pOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2luZmVyaW9yLmggYi9nZGIvaW5mZXJpb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTU5YzJhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2luZmVyaW9yLmgKQEAgLTAsMCArMSw0NzMgQEAKKy8qIFZhcmlhYmxlcyB0aGF0IGRlc2NyaWJlIHRoZSBpbmZlcmlvciBwcm9jZXNzIHJ1bm5pbmcgdW5kZXIgR0RCOgorICAgV2hlcmUgaXQgaXMsIHdoeSBpdCBzdG9wcGVkLCBhbmQgaG93IHRvIHN0ZXAgaXQuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4OSwgMTk5MiwgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWYgIWRlZmluZWQgKElORkVSSU9SX0gpCisjZGVmaW5lIElORkVSSU9SX0ggMQorCisvKiBGb3IgYnBzdGF0LiAgKi8KKyNpbmNsdWRlICJicmVha3BvaW50LmgiCisKKy8qIEZvciBlbnVtIHRhcmdldF9zaWduYWwuICAqLworI2luY2x1ZGUgInRhcmdldC5oIgorCisvKiBTdHJ1Y3R1cmUgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgc3RhdHVzIG9mIHRoZSBpbmZlcmlvci4gIFNhdmUKKyAgIHRocm91Z2ggInNhdmVfaW5mZXJpb3Jfc3RhdHVzIiwgcmVzdG9yZSB0aHJvdWdoCisgICAicmVzdG9yZV9pbmZlcmlvcl9zdGF0dXMiLgorICAgVGhpcyBwYWlyIG9mIHJvdXRpbmVzIHNob3VsZCBiZSBjYWxsZWQgYXJvdW5kIGFueSB0cmFuc2ZlciBvZgorICAgY29udHJvbCB0byB0aGUgaW5mZXJpb3Igd2hpY2ggeW91IGRvbid0IHdhbnQgc2hvd2luZyB1cCBpbiB5b3VyCisgICBjb250cm9sIHZhcmlhYmxlcy4gICovCisKK3N0cnVjdCBpbmZlcmlvcl9zdGF0dXMKKyAgeworICAgIGVudW0gdGFyZ2V0X3NpZ25hbCBzdG9wX3NpZ25hbDsKKyAgICBDT1JFX0FERFIgc3RvcF9wYzsKKyAgICBicHN0YXQgc3RvcF9icHN0YXQ7CisgICAgaW50IHN0b3Bfc3RlcDsKKyAgICBpbnQgc3RvcF9zdGFja19kdW1teTsKKyAgICBpbnQgc3RvcHBlZF9ieV9yYW5kb21fc2lnbmFsOworICAgIGludCB0cmFwX2V4cGVjdGVkOworICAgIENPUkVfQUREUiBzdGVwX3JhbmdlX3N0YXJ0OworICAgIENPUkVfQUREUiBzdGVwX3JhbmdlX2VuZDsKKyAgICBDT1JFX0FERFIgc3RlcF9mcmFtZV9hZGRyZXNzOworICAgIGludCBzdGVwX292ZXJfY2FsbHM7CisgICAgQ09SRV9BRERSIHN0ZXBfcmVzdW1lX2JyZWFrX2FkZHJlc3M7CisgICAgaW50IHN0b3BfYWZ0ZXJfdHJhcDsKKyAgICBpbnQgc3RvcF9zb29uX3F1aWV0bHk7CisgICAgQ09SRV9BRERSIHNlbGVjdGVkX2ZyYW1lX2FkZHJlc3M7CisgICAgY2hhciBzdG9wX3JlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFU107CisKKyAgICAvKiBUaGVzZSBhcmUgaGVyZSBiZWNhdXNlIGlmIGNhbGxfZnVuY3Rpb25fYnlfaGFuZCBoYXMgd3JpdHRlbiBzb21lCisgICAgIHJlZ2lzdGVycyBhbmQgdGhlbiBkZWNpZGVzIHRvIGNhbGwgZXJyb3IoKSwgd2UgYmV0dGVyIG5vdCBoYXZlIGNoYW5nZWQKKyAgICAgYW55IHJlZ2lzdGVycy4gICovCisgICAgY2hhciByZWdpc3RlcnNbUkVHSVNURVJfQllURVNdOworCisgICAgaW50IHNlbGVjdGVkX2xldmVsOworICAgIGludCBicmVha3BvaW50X3Byb2NlZWRlZDsKKyAgICBpbnQgcmVzdG9yZV9zdGFja19pbmZvOworICAgIGludCBwcm9jZWVkX3RvX2ZpbmlzaDsKKyAgfTsKKworLyogVGhpcyBtYWNybyBnaXZlcyB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBhY3R1YWxseSBpbiB1c2UgYnkgdGhlCisgICBpbmZlcmlvci4gIFRoaXMgbWF5IGJlIGxlc3MgdGhhbiB0aGUgdG90YWwgbnVtYmVyIG9mIHJlZ2lzdGVycywKKyAgIHBlcmhhcHMgZGVwZW5kaW5nIG9uIHRoZSBhY3R1YWwgQ1BVIGluIHVzZSBvciBwcm9ncmFtIGJlaW5nIHJ1bi4gICovCisKKyNpZm5kZWYgQVJDSF9OVU1fUkVHUworI2RlZmluZSBBUkNIX05VTV9SRUdTIE5VTV9SRUdTCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgc2F2ZV9pbmZlcmlvcl9zdGF0dXMgUEFSQU1TICgoc3RydWN0IGluZmVyaW9yX3N0YXR1cyAqLCBpbnQpKTsKKworZXh0ZXJuIHZvaWQgcmVzdG9yZV9pbmZlcmlvcl9zdGF0dXMgUEFSQU1TICgoc3RydWN0IGluZmVyaW9yX3N0YXR1cyAqKSk7CisKK2V4dGVybiB2b2lkIHNldF9zaWdpbnRfdHJhcCBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIGNsZWFyX3NpZ2ludF90cmFwIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgc2V0X3NpZ2lvX3RyYXAgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCBjbGVhcl9zaWdpb190cmFwIFBBUkFNUyAoKHZvaWQpKTsKKworLyogRmlsZSBuYW1lIGZvciBkZWZhdWx0IHVzZSBmb3Igc3RhbmRhcmQgaW4vb3V0IGluIHRoZSBpbmZlcmlvci4gICovCisKK2V4dGVybiBjaGFyICppbmZlcmlvcl9pb190ZXJtaW5hbDsKKworLyogUGlkIG9mIG91ciBkZWJ1Z2dlZCBpbmZlcmlvciwgb3IgMCBpZiBubyBpbmZlcmlvciBub3cuICAqLworCitleHRlcm4gaW50IGluZmVyaW9yX3BpZDsKKworLyogVGhpcyBpcyBvbmx5IHZhbGlkIHdoZW4gaW5mZXJpb3JfcGlkIGlzIG5vbi16ZXJvLgorCisgICBJZiB0aGlzIGlzIDAsIHRoZW4gZXhlYyBldmVudHMgc2hvdWxkIGJlIG5vdGljZWQgYW5kIHJlc3BvbmRlZCB0bworICAgYnkgdGhlIGRlYnVnZ2VyIChpLmUuLCBiZSByZXBvcnRlZCB0byB0aGUgdXNlcikuCisKKyAgIElmIHRoaXMgaXMgPiAwLCB0aGVuIHRoYXQgbWFueSBzdWJzZXF1ZW50IGV4ZWMgZXZlbnRzIHNob3VsZCBiZQorICAgaWdub3JlZCAoaS5lLiwgbm90IGJlIHJlcG9ydGVkIHRvIHRoZSB1c2VyKS4KKyAgICovCitleHRlcm4gaW50IGluZmVyaW9yX2lnbm9yaW5nX3N0YXJ0dXBfZXhlY19ldmVudHM7CisKKy8qIFRoaXMgaXMgb25seSB2YWxpZCB3aGVuIGluZmVyaW9yX2lnbm9yaW5nX3N0YXJ0dXBfZXhlY19ldmVudHMgaXMKKyAgIHplcm8uCisKKyAgIFNvbWUgdGFyZ2V0cyAoc3R1cGlkbHkpIHJlcG9ydCBtb3JlIHRoYW4gb25lIGV4ZWMgZXZlbnQgcGVyIGFjdHVhbAorICAgY2FsbCB0byBhbiBldmVudCgpIHN5c3RlbSBjYWxsLiAgSWYgb25seSB0aGUgbGFzdCBzdWNoIGV4ZWMgZXZlbnQKKyAgIG5lZWQgYWN0dWFsbHkgYmUgbm90aWNlZCBhbmQgcmVzcG9uZGVkIHRvIGJ5IHRoZSBkZWJ1Z2dlciAoaS5lLiwKKyAgIGJlIHJlcG9ydGVkIHRvIHRoZSB1c2VyKSwgdGhlbiB0aGlzIGlzIHRoZSBudW1iZXIgb2YgImxlYWRpbmciCisgICBleGVjIGV2ZW50cyB3aGljaCBzaG91bGQgYmUgaWdub3JlZC4KKyAgICovCitleHRlcm4gaW50IGluZmVyaW9yX2lnbm9yaW5nX2xlYWRpbmdfZXhlY19ldmVudHM7CisKKy8qIEluZmVyaW9yIGVudmlyb25tZW50LiAqLworCitleHRlcm4gc3RydWN0IGVudmlyb24gKmluZmVyaW9yX2Vudmlyb247CisKKy8qIENoYXJhY3RlciBhcnJheSBjb250YWluaW5nIGFuIGltYWdlIG9mIHRoZSBpbmZlcmlvciBwcm9ncmFtcycgcmVnaXN0ZXJzLiAgKi8KKworZXh0ZXJuIGNoYXIgcmVnaXN0ZXJzW107CisKKy8qIEFycmF5IG9mIHZhbGlkaXR5IGJpdHMgKG9uZSBwZXIgcmVnaXN0ZXIpLiAgTm9uemVybyBhdCBwb3NpdGlvbiBYWFhfUkVHTlVNCisgICBtZWFucyB0aGF0IGByZWdpc3RlcnMnIGNvbnRhaW5zIGEgdmFsaWQgY29weSBvZiBpbmZlcmlvciByZWdpc3RlciBYWFguCisgICAtMSBpZiByZWdpc3RlciB2YWx1ZSBpcyBub3QgYXZhaWxhYmxlLiAqLworCitleHRlcm4gU0lHTkVEIGNoYXIgcmVnaXN0ZXJfdmFsaWRbTlVNX1JFR1NdOworCitleHRlcm4gdm9pZCBjbGVhcl9wcm9jZWVkX3N0YXR1cyBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIHByb2NlZWQgUEFSQU1TICgoQ09SRV9BRERSLCBlbnVtIHRhcmdldF9zaWduYWwsIGludCkpOworCitleHRlcm4gdm9pZCBraWxsX2luZmVyaW9yIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgZ2VuZXJpY19tb3Vybl9pbmZlcmlvciBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIHRlcm1pbmFsX291cnMgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gaW50IHJ1bl9zdGFja19kdW1teSBQQVJBTVMgKChDT1JFX0FERFIsIGNoYXJbUkVHSVNURVJfQllURVNdKSk7CisKK2V4dGVybiBDT1JFX0FERFIgcmVhZF9wYyBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBDT1JFX0FERFIgcmVhZF9wY19waWQgUEFSQU1TICgoaW50KSk7CisKK2V4dGVybiB2b2lkIHdyaXRlX3BjIFBBUkFNUyAoKENPUkVfQUREUikpOworCitleHRlcm4gdm9pZCB3cml0ZV9wY19waWQgUEFSQU1TICgoQ09SRV9BRERSLCBpbnQpKTsKKworZXh0ZXJuIENPUkVfQUREUiByZWFkX3NwIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgd3JpdGVfc3AgUEFSQU1TICgoQ09SRV9BRERSKSk7CisKK2V4dGVybiBDT1JFX0FERFIgcmVhZF9mcCBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIHdyaXRlX2ZwIFBBUkFNUyAoKENPUkVfQUREUikpOworCitleHRlcm4gdm9pZCB3YWl0X2Zvcl9pbmZlcmlvciBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIGluaXRfd2FpdF9mb3JfaW5mZXJpb3IgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCBjbG9zZV9leGVjX2ZpbGUgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCByZW9wZW5fZXhlY19maWxlIFBBUkFNUyAoKHZvaWQpKTsKKworLyogVGhlIGByZXN1bWUnIHJvdXRpbmUgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIHNwZWNpYWwgY2lyY3Vtc3RhbmNlcy4KKyAgIE5vcm1hbGx5LCB1c2UgYHByb2NlZWQnLCB3aGljaCBoYW5kbGVzIGEgbG90IG9mIGJvb2trZWVwaW5nLiAgKi8KKworZXh0ZXJuIHZvaWQgcmVzdW1lIFBBUkFNUyAoKGludCwgZW51bSB0YXJnZXRfc2lnbmFsKSk7CisKKy8qIEZyb20gbWlzYyBmaWxlcyAqLworCitleHRlcm4gdm9pZCBzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgUEFSQU1TICgoaW50KSk7CisKK2V4dGVybiB2b2lkIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyBQQVJBTVMgKChpbnQpKTsKKworZXh0ZXJuIHZvaWQgc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2sgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCBjaGlsZF90ZXJtaW5hbF9pbmZvIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK2V4dGVybiB2b2lkIHRlcm1faW5mbyBQQVJBTVMgKChjaGFyICosIGludCkpOworCitleHRlcm4gdm9pZCB0ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCB0ZXJtaW5hbF9pbmZlcmlvciBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIHRlcm1pbmFsX2luaXRfaW5mZXJpb3IgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCB0ZXJtaW5hbF9pbml0X2luZmVyaW9yX3dpdGhfcGdycCBQQVJBTVMgKChpbnQgcGdycCkpOworCisvKiBGcm9tIGluZnB0cmFjZS5jIG9yIGluZnR0cmFjZS5jICovCisKK2V4dGVybiBpbnQgYXR0YWNoIFBBUkFNUyAoKGludCkpOworCisjaWYgIWRlZmluZWQoUkVRVUlSRV9BVFRBQ0gpCisjZGVmaW5lIFJFUVVJUkVfQVRUQUNIIGF0dGFjaAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChSRVFVSVJFX0RFVEFDSCkKKyNkZWZpbmUgUkVRVUlSRV9ERVRBQ0gocGlkLHNpZ2duYWwpIGRldGFjaCAoc2lnZ25hbCkKKyNlbmRpZgorCitleHRlcm4gdm9pZCBkZXRhY2ggUEFSQU1TICgoaW50KSk7CisKK2ludCBwdHJhY2Vfd2FpdCBQQVJBTVMgKChpbnQsIGludCAqKSk7CisKK2V4dGVybiB2b2lkIGNoaWxkX3Jlc3VtZSBQQVJBTVMgKChpbnQsIGludCwgZW51bSB0YXJnZXRfc2lnbmFsKSk7CisKKyNpZm5kZWYgUFRSQUNFX0FSRzNfVFlQRQorI2RlZmluZSBQVFJBQ0VfQVJHM19UWVBFIGludAkvKiBDb3JyZWN0IGRlZmluaXRpb24gZm9yIG1vc3Qgc3lzdGVtcy4gKi8KKyNlbmRpZgorCitleHRlcm4gaW50IGNhbGxfcHRyYWNlIFBBUkFNUyAoKGludCwgaW50LCBQVFJBQ0VfQVJHM19UWVBFLCBpbnQpKTsKKworZXh0ZXJuIHZvaWQgcHJlX2ZvcmtfaW5mZXJpb3IgUEFSQU1TICgodm9pZCkpOworCisvKiBGcm9tIHByb2Nmcy5jICovCisKK2V4dGVybiBpbnQgcHJvY19pdGVyYXRlX292ZXJfbWFwcGluZ3MgUEFSQU1TICgoaW50ICgqKShpbnQsIENPUkVfQUREUikpKTsKKworZXh0ZXJuIGludCBwcm9jZnNfZmlyc3RfYXZhaWxhYmxlIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIGludCBwcm9jZnNfZ2V0X3BpZF9mZCBQQVJBTVMgKChpbnQpKTsKKworLyogRnJvbSBmb3JrLWNoaWxkLmMgKi8KKworZXh0ZXJuIHZvaWQgZm9ya19pbmZlcmlvciBQQVJBTVMgKChjaGFyICosIGNoYXIgKiwgY2hhciAqKiwKKwkJCQkgICB2b2lkICgqKSh2b2lkKSwKKwkJCQkgICB2b2lkICgqKShpbnQpLAorCQkJCSAgIHZvaWQgKCopKHZvaWQpLAorCQkJCSAgIGNoYXIgKikpOworCisKK2V4dGVybiB2b2lkCitjbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yIFBBUkFNUyAoKGludCwgaW50ICopKTsKKworZXh0ZXJuIHZvaWQgc3RhcnR1cF9pbmZlcmlvciBQQVJBTVMgKChpbnQpKTsKKworLyogRnJvbSBpbmZsb3cuYyAqLworCitleHRlcm4gdm9pZCBuZXdfdHR5X3ByZWZvcmsgUEFSQU1TICgoY2hhciAqKSk7CisKK2V4dGVybiBpbnQgZ2RiX2hhc19hX3Rlcm1pbmFsIFBBUkFNUyAoKHZvaWQpKTsKKworLyogRnJvbSBpbmZydW4uYyAqLworCitleHRlcm4gdm9pZCBzdGFydF9yZW1vdGUgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCBub3JtYWxfc3RvcCBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBpbnQgc2lnbmFsX3N0b3Bfc3RhdGUgUEFSQU1TICgoaW50KSk7CisKK2V4dGVybiBpbnQgc2lnbmFsX3ByaW50X3N0YXRlIFBBUkFNUyAoKGludCkpOworCitleHRlcm4gaW50IHNpZ25hbF9wYXNzX3N0YXRlIFBBUkFNUyAoKGludCkpOworCisvKiBGcm9tIGluZmNtZC5jICovCisKK2V4dGVybiB2b2lkIHR0eV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK2V4dGVybiB2b2lkIGF0dGFjaF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKKy8qIExhc3Qgc2lnbmFsIHRoYXQgdGhlIGluZmVyaW9yIHJlY2VpdmVkICh3aHkgaXQgc3RvcHBlZCkuICAqLworCitleHRlcm4gZW51bSB0YXJnZXRfc2lnbmFsIHN0b3Bfc2lnbmFsOworCisvKiBBZGRyZXNzIGF0IHdoaWNoIGluZmVyaW9yIHN0b3BwZWQuICAqLworCitleHRlcm4gQ09SRV9BRERSIHN0b3BfcGM7CisKKy8qIENoYWluIGNvbnRhaW5pbmcgc3RhdHVzIG9mIGJyZWFrcG9pbnQocykgdGhhdCB3ZSBoYXZlIHN0b3BwZWQgYXQuICAqLworCitleHRlcm4gYnBzdGF0IHN0b3BfYnBzdGF0OworCisvKiBGbGFnIGluZGljYXRpbmcgdGhhdCBhIGNvbW1hbmQgaGFzIHByb2NlZWRlZCB0aGUgaW5mZXJpb3IgcGFzdCB0aGUKKyAgIGN1cnJlbnQgYnJlYWtwb2ludC4gICovCisKK2V4dGVybiBpbnQgYnJlYWtwb2ludF9wcm9jZWVkZWQ7CisKKy8qIE5vbnplcm8gaWYgc3RvcHBlZCBkdWUgdG8gYSBzdGVwIGNvbW1hbmQuICAqLworCitleHRlcm4gaW50IHN0b3Bfc3RlcDsKKworLyogTm9uemVybyBpZiBzdG9wcGVkIGR1ZSB0byBjb21wbGV0aW9uIG9mIGEgc3RhY2sgZHVtbXkgcm91dGluZS4gICovCisKK2V4dGVybiBpbnQgc3RvcF9zdGFja19kdW1teTsKKworLyogTm9uemVybyBpZiBwcm9ncmFtIHN0b3BwZWQgZHVlIHRvIGEgcmFuZG9tICh1bmV4cGVjdGVkKSBzaWduYWwgaW4KKyAgIGluZmVyaW9yIHByb2Nlc3MuICAqLworCitleHRlcm4gaW50IHN0b3BwZWRfYnlfcmFuZG9tX3NpZ25hbDsKKworLyogUmFuZ2UgdG8gc2luZ2xlIHN0ZXAgd2l0aGluLgorICAgSWYgdGhpcyBpcyBub256ZXJvLCByZXNwb25kIHRvIGEgc2luZ2xlLXN0ZXAgc2lnbmFsCisgICBieSBjb250aW51aW5nIHRvIHN0ZXAgaWYgdGhlIHBjIGlzIGluIHRoaXMgcmFuZ2UuCisKKyAgIElmIHN0ZXBfcmFuZ2Vfc3RhcnQgYW5kIHN0ZXBfcmFuZ2VfZW5kIGFyZSBib3RoIDEsIGl0IG1lYW5zIHRvIHN0ZXAgZm9yCisgICBhIHNpbmdsZSBpbnN0cnVjdGlvbiAoRklYTUU6IGl0IG1pZ2h0IGNsZWFuIHVwIHdhaXRfZm9yX2luZmVyaW9yIGluIGEKKyAgIG1pbm9yIHdheSBpZiB0aGlzIHdlcmUgY2hhbmdlZCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYW5kCisgICB0aGF0IGFkZHJlc3MgcGx1cyBvbmUuICBCdXQgbWF5YmUgbm90LikuICAqLworCitleHRlcm4gQ09SRV9BRERSIHN0ZXBfcmFuZ2Vfc3RhcnQ7CS8qIEluY2x1c2l2ZSAqLworZXh0ZXJuIENPUkVfQUREUiBzdGVwX3JhbmdlX2VuZDsvKiBFeGNsdXNpdmUgKi8KKworLyogU3RhY2sgZnJhbWUgYWRkcmVzcyBhcyBvZiB3aGVuIHN0ZXBwaW5nIGNvbW1hbmQgd2FzIGlzc3VlZC4KKyAgIFRoaXMgaXMgaG93IHdlIGtub3cgd2hlbiB3ZSBzdGVwIGludG8gYSBzdWJyb3V0aW5lIGNhbGwsCisgICBhbmQgaG93IHRvIHNldCB0aGUgZnJhbWUgZm9yIHRoZSBicmVha3BvaW50IHVzZWQgdG8gc3RlcCBvdXQuICAqLworCitleHRlcm4gQ09SRV9BRERSIHN0ZXBfZnJhbWVfYWRkcmVzczsKKworLyogT3VyIG5vdGlvbiBvZiB0aGUgY3VycmVudCBzdGFjayBwb2ludGVyLiAgKi8KKworZXh0ZXJuIENPUkVfQUREUiBzdGVwX3NwOworCisvKiAxIG1lYW5zIHN0ZXAgb3ZlciBhbGwgc3Vicm91dGluZSBjYWxscy4KKyAgIC0xIG1lYW5zIHN0ZXAgb3ZlciBjYWxscyB0byB1bmRlYnVnZ2FibGUgZnVuY3Rpb25zLiAgKi8KKworZXh0ZXJuIGludCBzdGVwX292ZXJfY2FsbHM7CisKKy8qIElmIHN0ZXBwaW5nLCBub256ZXJvIG1lYW5zIHN0ZXAgY291bnQgaXMgPiAxCisgICBzbyBkb24ndCBwcmludCBmcmFtZSBuZXh0IHRpbWUgaW5mZXJpb3Igc3RvcHMKKyAgIGlmIGl0IHN0b3BzIGR1ZSB0byBzdGVwcGluZy4gICovCisKK2V4dGVybiBpbnQgc3RlcF9tdWx0aTsKKworLyogTm9uemVybyBtZWFucyBleHBlY3RpbmcgYSB0cmFwIGFuZCBjYWxsZXIgd2lsbCBoYW5kbGUgaXQgdGhlbXNlbHZlcy4KKyAgIEl0IGlzIHVzZWQgYWZ0ZXIgYXR0YWNoLCBkdWUgdG8gYXR0YWNoaW5nIHRvIGEgcHJvY2VzczsKKyAgIHdoZW4gcnVubmluZyBpbiB0aGUgc2hlbGwgYmVmb3JlIHRoZSBjaGlsZCBwcm9ncmFtIGhhcyBiZWVuIGV4ZWMnZDsKKyAgIGFuZCB3aGVuIHJ1bm5pbmcgc29tZSBraW5kcyBvZiByZW1vdGUgc3R1ZmYgKEZJWE1FPykuICAqLworCitleHRlcm4gaW50IHN0b3Bfc29vbl9xdWlldGx5OworCisvKiBOb256ZXJvIGlmIHByb2NlZWQgaXMgYmVpbmcgdXNlZCBmb3IgYSAiZmluaXNoIiBjb21tYW5kIG9yIGEgc2ltaWxhcgorICAgc2l0dWF0aW9uIHdoZW4gc3RvcF9yZWdpc3RlcnMgc2hvdWxkIGJlIHNhdmVkLiAgKi8KKworZXh0ZXJuIGludCBwcm9jZWVkX3RvX2ZpbmlzaDsKKworLyogU2F2ZSByZWdpc3RlciBjb250ZW50cyBoZXJlIHdoZW4gYWJvdXQgdG8gcG9wIGEgc3RhY2sgZHVtbXkgZnJhbWUsCisgICBpZi1hbmQtb25seS1pZiBwcm9jZWVkX3RvX2ZpbmlzaCBpcyBzZXQuCisgICBUaHVzIHRoaXMgY29udGFpbnMgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBjYWxsZWQgZnVuY3Rpb24gKGFzc3VtaW5nCisgICB2YWx1ZXMgYXJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIpLiAgKi8KKworZXh0ZXJuIGNoYXIgc3RvcF9yZWdpc3RlcnNbUkVHSVNURVJfQllURVNdOworCisvKiBOb256ZXJvIGlmIHRoZSBjaGlsZCBwcm9jZXNzIGluIGluZmVyaW9yX3BpZCB3YXMgYXR0YWNoZWQgcmF0aGVyCisgICB0aGFuIGZvcmtlZC4gICovCisKK2V4dGVybiBpbnQgYXR0YWNoX2ZsYWc7CisMCisvKiBTaWd0cmFtcCBpcyBhIHJvdXRpbmUgdGhhdCB0aGUga2VybmVsIGNhbGxzICh3aGljaCB0aGVuIGNhbGxzIHRoZQorICAgc2lnbmFsIGhhbmRsZXIpLiAgT24gbW9zdCBtYWNoaW5lcyBpdCBpcyBhIGxpYnJhcnkgcm91dGluZSB0aGF0CisgICBpcyBsaW5rZWQgaW50byB0aGUgZXhlY3V0YWJsZS4KKworICAgVGhpcyBtYWNybywgZ2l2ZW4gYSBwcm9ncmFtIGNvdW50ZXIgdmFsdWUgYW5kIHRoZSBuYW1lIG9mIHRoZQorICAgZnVuY3Rpb24gaW4gd2hpY2ggdGhhdCBQQyByZXNpZGVzICh3aGljaCBjYW4gYmUgbnVsbCBpZiB0aGUKKyAgIG5hbWUgaXMgbm90IGtub3duKSwgcmV0dXJucyBub256ZXJvIGlmIHRoZSBQQyBhbmQgbmFtZSBzaG93CisgICB0aGF0IHdlIGFyZSBpbiBzaWd0cmFtcC4KKworICAgT24gbW9zdCBtYWNoaW5lcyBqdXN0IHNlZSBpZiB0aGUgbmFtZSBpcyBzaWd0cmFtcCAoYW5kIGlmIHdlIGhhdmUKKyAgIG5vIG5hbWUsIGFzc3VtZSB3ZSBhcmUgbm90IGluIHNpZ3RyYW1wKS4gICovCisjaWYgIWRlZmluZWQgKElOX1NJR1RSQU1QKQorI2lmIGRlZmluZWQgKFNJR1RSQU1QX1NUQVJUKQorI2RlZmluZSBJTl9TSUdUUkFNUChwYywgbmFtZSkgXAorICAgICAgICgocGMpID49IFNJR1RSQU1QX1NUQVJUKHBjKSAgIFwKKyAgICAgICAgJiYgKHBjKSA8IFNJR1RSQU1QX0VORChwYykgXAorICAgICAgICApCisjZWxzZQorI2RlZmluZSBJTl9TSUdUUkFNUChwYywgbmFtZSkgXAorICAgICAgIChuYW1lICYmIFNUUkVRICgiX3NpZ3RyYW1wIiwgbmFtZSkpCisjZW5kaWYKKyNlbmRpZgorDAorLyogUG9zc2libGUgdmFsdWVzIGZvciBDQUxMX0RVTU1ZX0xPQ0FUSU9OLiAgKi8KKyNkZWZpbmUgT05fU1RBQ0sgMQorI2RlZmluZSBCRUZPUkVfVEVYVF9FTkQgMgorI2RlZmluZSBBRlRFUl9URVhUX0VORCAzCisjZGVmaW5lIEFUX0VOVFJZX1BPSU5UIDQKKworI2lmICFkZWZpbmVkIChDQUxMX0RVTU1ZX0xPQ0FUSU9OKQorI2RlZmluZSBDQUxMX0RVTU1ZX0xPQ0FUSU9OIE9OX1NUQUNLCisjZW5kaWYgLyogTm8gQ0FMTF9EVU1NWV9MT0NBVElPTi4gICovCisKKy8qIEFyZSB3ZSBpbiBhIGNhbGwgZHVtbXk/ICBUaGUgY29kZSBiZWxvdyB3aGljaCBhbGxvd3MgREVDUl9QQ19BRlRFUl9CUkVBSworICAgYmVsb3cgaXMgZm9yIGluZnJ1bi5jLCB3aGljaCBtYXkgZ2l2ZSB0aGUgbWFjcm8gYSBwYyB3aXRob3V0IHRoYXQKKyAgIHN1YnRyYWN0ZWQgb3V0LiAgKi8KKyNpZiAhZGVmaW5lZCAoUENfSU5fQ0FMTF9EVU1NWSkKKyNpZiBDQUxMX0RVTU1ZX0xPQ0FUSU9OID09IEJFRk9SRV9URVhUX0VORAorZXh0ZXJuIENPUkVfQUREUiB0ZXh0X2VuZDsKKyNkZWZpbmUgUENfSU5fQ0FMTF9EVU1NWShwYywgc3AsIGZyYW1lX2FkZHJlc3MpIFwKKyAgKChwYykgPj0gdGV4dF9lbmQgLSBDQUxMX0RVTU1ZX0xFTkdUSCAgICAgICAgIFwKKyAgICYmIChwYykgPD0gdGV4dF9lbmQgKyBERUNSX1BDX0FGVEVSX0JSRUFLKQorI2VuZGlmIC8qIEJlZm9yZSB0ZXh0X2VuZC4gICovCisKKyNpZiBDQUxMX0RVTU1ZX0xPQ0FUSU9OID09IEFGVEVSX1RFWFRfRU5ECitleHRlcm4gQ09SRV9BRERSIHRleHRfZW5kOworI2RlZmluZSBQQ19JTl9DQUxMX0RVTU1ZKHBjLCBzcCwgZnJhbWVfYWRkcmVzcykgXAorICAoKHBjKSA+PSB0ZXh0X2VuZCAgIFwKKyAgICYmIChwYykgPD0gdGV4dF9lbmQgKyBDQUxMX0RVTU1ZX0xFTkdUSCArIERFQ1JfUENfQUZURVJfQlJFQUspCisjZW5kaWYgLyogQWZ0ZXIgdGV4dF9lbmQuICAqLworCisjaWYgQ0FMTF9EVU1NWV9MT0NBVElPTiA9PSBPTl9TVEFDSworLyogSXMgdGhlIFBDIGluIGEgY2FsbCBkdW1teT8gIFNQIGFuZCBGUkFNRV9BRERSRVNTIGFyZSB0aGUgYm90dG9tIGFuZAorICAgdG9wIG9mIHRoZSBzdGFjayBmcmFtZSB3aGljaCB3ZSBhcmUgY2hlY2tpbmcsIHdoZXJlICJib3R0b20iIGFuZAorICAgInRvcCIgcmVmZXIgdG8gc29tZSBzZWN0aW9uIG9mIG1lbW9yeSB3aGljaCBjb250YWlucyB0aGUgY29kZSBmb3IKKyAgIHRoZSBjYWxsIGR1bW15LiAgQ2FsbHMgdG8gdGhpcyBtYWNybyBhc3N1bWUgdGhhdCB0aGUgY29udGVudHMgb2YKKyAgIFNQX1JFR05VTSBhbmQgRlBfUkVHTlVNIChvciB0aGUgc2F2ZWQgdmFsdWVzIHRoZXJlb2YpLCByZXNwZWN0aXZlbHksCisgICBhcmUgdGhlIHRoaW5ncyB0byBwYXNzLgorCisgICBUaGlzIHdvbid0IHdvcmsgb24gdGhlIDI5aywgd2hlcmUgU1BfUkVHTlVNIGFuZCBGUF9SRUdOVU0gZG9uJ3QKKyAgIGhhdmUgdGhhdCBtZWFuaW5nLCBidXQgdGhlIDI5ayBkb2Vzbid0IHVzZSBPTl9TVEFDSy4gIFRoaXMgY291bGQgYmUKKyAgIGZpeGVkIGJ5IGdlbmVyYWxpemluZyB0aGlzIHNjaGVtZSwgcGVyaGFwcyBieSBwYXNzaW5nIGluIGEgZnJhbWUKKyAgIGFuZCBhZGRpbmcgYSBmZXcgZmllbGRzLCBhdCBsZWFzdCBvbiBtYWNoaW5lcyB3aGljaCBuZWVkIHRoZW0gZm9yCisgICBQQ19JTl9DQUxMX0RVTU1ZLgorCisgICBTb21ldGhpbmcgc2ltcGxlciwgbGlrZSBjaGVja2luZyBmb3IgdGhlIHN0YWNrIHNlZ21lbnQsIGRvZXNuJ3Qgd29yaywKKyAgIHNpbmNlIHZhcmlvdXMgcHJvZ3JhbXMgKHRocmVhZHMgaW1wbGVtZW50YXRpb25zLCBnY2MgbmVzdGVkIGZ1bmN0aW9uCisgICBzdHVicywgZXRjKSBtYXkgZWl0aGVyIGFsbG9jYXRlIHN0YWNrIGZyYW1lcyBpbiBhbm90aGVyIHNlZ21lbnQsIG9yCisgICBhbGxvY2F0ZSBvdGhlciBraW5kcyBvZiBjb2RlIG9uIHRoZSBzdGFjay4gICovCisKKyNkZWZpbmUgUENfSU5fQ0FMTF9EVU1NWShwYywgc3AsIGZyYW1lX2FkZHJlc3MpIFwKKyAgKElOTkVSX1RIQU4gKChzcCksIChwYykpICYmIChmcmFtZV9hZGRyZXNzICE9IDApICYmIElOTkVSX1RIQU4gKChwYyksIChmcmFtZV9hZGRyZXNzKSkpCisjZW5kaWYgLyogT24gc3RhY2suICAqLworCisjaWYgQ0FMTF9EVU1NWV9MT0NBVElPTiA9PSBBVF9FTlRSWV9QT0lOVAorI2RlZmluZSBQQ19JTl9DQUxMX0RVTU1ZKHBjLCBzcCwgZnJhbWVfYWRkcmVzcykJCQlcCisgICgocGMpID49IENBTExfRFVNTVlfQUREUkVTUyAoKQkJCQlcCisgICAmJiAocGMpIDw9IChDQUxMX0RVTU1ZX0FERFJFU1MgKCkgKyBERUNSX1BDX0FGVEVSX0JSRUFLKSkKKyNlbmRpZiAvKiBBdCBlbnRyeSBwb2ludC4gICovCisjZW5kaWYgLyogTm8gUENfSU5fQ0FMTF9EVU1NWS4gICovCisKKy8qIEl0J3Mgb2Z0ZW4gbm90IGVub3VnaCBmb3Igb3VyIGNsaWVudHMgdG8ga25vdyB3aGV0aGVyIHRoZSBQQyBpcyBtZXJlbHkKKyAgIHNvbWV3aGVyZSB3aXRoaW4gdGhlIGNhbGwgZHVtbXkuICBUaGV5IG1heSBuZWVkIHRvIGtub3cgd2hldGhlciB0aGUKKyAgIGNhbGwgZHVtbXkgaGFzIGFjdHVhbGx5IGNvbXBsZXRlZC4gIChGb3IgZXhhbXBsZSwgd2FpdF9mb3JfaW5mZXJpb3IKKyAgIHdhbnRzIHRvIGtub3cgd2hlbiBpdCBzaG91bGQgdHJ1bHkgc3RvcCBiZWNhdXNlIHRoZSBjYWxsIGR1bW15IGhhcworICAgY29tcGxldGVkLiAgSWYgd2UncmUgc2luZ2xlLXN0ZXBwaW5nIGJlY2F1c2Ugb2Ygc2xvdyB3YXRjaHBvaW50cywKKyAgIHRoZW4gd2UgbWF5IGZpbmQgb3Vyc2VsdmVzIHN0b3BwZWQgYXQgdGhlIGVudHJ5IG9mIHRoZSBjYWxsIGR1bW15LAorICAgYW5kIHdhbnQgdG8gY29udGludWUgc3RlcHBpbmcgdW50aWwgd2UgcmVhY2ggdGhlIGVuZC4pCisKKyAgIE5vdGUgdGhhdCB0aGlzIG1hY3JvIGlzIGludGVuZGVkIGZvciB0YXJnZXRzIChsaWtlIEhQLVVYKSB3aGljaAorICAgcmVxdWlyZSBtb3JlIHRoYW4gYSBzaW5nbGUgYnJlYWtwb2ludCBpbiB0aGVpciBjYWxsIGR1bW1pZXMsIGFuZAorICAgdGhlcmVmb3JlIGNhbm5vdCB1c2UgdGhlIENBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQgbWVjaGFuaXNtLgorCisgICBJZiBhIHRhcmdldCBkb2VzIGRlZmluZSBDQUxMX0RVTU1ZX0JSRUFLUE9JTlRfT0ZGU0VULCB0aGVuIHRoaXMKKyAgIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgQ0FMTF9EVU1NWV9IQVNfQ09NUExFVEVEIGlzIHN1ZmZpY2llbnQuCisgICBFbHNlLCBhIHRhcmdldCBtYXkgd2lzaCB0byBzdXBwbHkgYW4gaW1wbGVtZW50YXRpb24gdGhhdCB3b3JrcyBpbgorICAgdGhlIHByZXNlbnNlIG9mIG11bHRpcGxlIGJyZWFrcG9pbnRzIGluIGl0cyBjYWxsIGR1bW15LgorICAgKi8KKyNpZiAhZGVmaW5lZChDQUxMX0RVTU1ZX0hBU19DT01QTEVURUQpCisjZGVmaW5lIENBTExfRFVNTVlfSEFTX0NPTVBMRVRFRChwYywgc3AsIGZyYW1lX2FkZHJlc3MpIFwKKyAgUENfSU5fQ0FMTF9EVU1NWSgocGMpLCAoc3ApLCAoZnJhbWVfYWRkcmVzcykpCisjZW5kaWYKKworLyogSWYgU1RBUlRVUF9XSVRIX1NIRUxMIGlzIHNldCwgR0RCJ3MgInJ1biIKKyAgIHdpbGwgYXR0ZW1wdHMgdG8gc3RhcnQgdXAgdGhlIGRlYnVnZWUgdW5kZXIgYSBzaGVsbC4KKyAgIFRoaXMgaXMgaW4gb3JkZXIgZm9yIGFyZ3VtZW50LWV4cGFuc2lvbiB0byBvY2N1ci4gRS5nLiwKKyAgIChnZGIpIHJ1biAqCisgICBUaGUgIioiIGdldHMgZXhwYW5kZWQgYnkgdGhlIHNoZWxsIGludG8gYSBsaXN0IG9mIGZpbGVzLgorICAgV2hpbGUgdGhpcyBpcyBhIG5pY2UgZmVhdHVyZSwgaXQgdHVybnMgb3V0IHRvIGludGVyYWN0IGJhZGx5CisgICB3aXRoIHNvbWUgb2YgdGhlIGNhdGNoLWZvcmsvY2F0Y2gtZXhlYyBmZWF0dXJlcyB3ZSBoYXZlIGFkZGVkLgorICAgSW4gcGFydGljdWxhciwgaWYgdGhlIHNoZWxsIGRvZXMgYW55IGZvcmsvZXhlYydzIGJlZm9yZQorICAgdGhlIGV4ZWMgb2YgdGhlIHRhcmdldCBwcm9ncmFtLCB0aGF0IGNhbiBjb25mdXNlIEdEQi4KKyAgIFRvIGRpc2FibGUgdGhpcyBmZWF0dXJlLCBzZXQgU1RBUlRVUF9XSVRIX1NIRUxMIHRvIDAuCisgICBUbyBlbmFibGUgdGhpcyBmZWF0dXJlLCBzZXQgU1RBUlRVUF9XSVRIX1NIRUxMIHRvIDEuCisgICBUaGUgY2F0Y2gtZXhlYyB0cmFwcyBleHBlY3RlZCBkdXJpbmcgc3RhcnQtdXAgd2lsbAorICAgYmUgMSBpZiB0YXJnZXQgaXMgbm90IHN0YXJ0ZWQgdXAgd2l0aCBhIHNoZWxsLCAyIGlmIGl0IGlzLgorICAgLSBSVAorICAgSWYgeW91IGRpc2FibGUgdGhpcywgeW91IG5lZWQgdG8gZGVjcmVtZW50CisgICBTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCBpbiB0bS5oLiAqLworI2RlZmluZSBTVEFSVFVQX1dJVEhfU0hFTEwgMQorI2lmICFkZWZpbmVkKFNUQVJUX0lORkVSSU9SX1RSQVBTX0VYUEVDVEVEKQorI2RlZmluZSBTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRAkyCisjZW5kaWYKKyNlbmRpZiAvKiAhZGVmaW5lZCAoSU5GRVJJT1JfSCkgKi8KZGlmZiAtLWdpdCBhL2dkYi9pbmZsb3cuYyBiL2dkYi9pbmZsb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDMzNjc1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2luZmxvdy5jCkBAIC0wLDAgKzEsNzUxIEBACisvKiBMb3cgbGV2ZWwgaW50ZXJmYWNlIHRvIHB0cmFjZSwgZm9yIEdEQiB3aGVuIHJ1bm5pbmcgdW5kZXIgVW5peC4KKyAgIENvcHlyaWdodCAxOTg2LTg3LCAxOTg5LCAxOTkxLTkyLCAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJzaWduYWxzLmgiCisjaW5jbHVkZSAic2VyaWFsLmgiCisjaW5jbHVkZSAidGVybWluYWwuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJnZGJ0aHJlYWQuaCIKKworI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9URVJNSU9TCisjZGVmaW5lIFBST0NFU1NfR1JPVVBfVFlQRSBwaWRfdAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1RFUk1JTworI2RlZmluZSBQUk9DRVNTX0dST1VQX1RZUEUgaW50CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU0dUVFkKKyNpZmRlZiBTSE9SVF9QR1JQCisvKiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgdGhlIHVsdHJhLiAgRG9lcyBpdCBoYXZlIHBpZF90PyAgKi8KKyNkZWZpbmUgUFJPQ0VTU19HUk9VUF9UWVBFIHNob3J0CisjZWxzZQorI2RlZmluZSBQUk9DRVNTX0dST1VQX1RZUEUgaW50CisjZW5kaWYKKyNlbmRpZiAvKiBzZ3R0eSAqLworCisjaWYgZGVmaW5lZCAoU0lHSU8pICYmIGRlZmluZWQgKEZBU1lOQykgJiYgZGVmaW5lZCAoRkRfU0VUKSAmJiBkZWZpbmVkIChGX1NFVE9XTikKK3N0YXRpYyB2b2lkCitoYW5kbGVfc2lnaW8gUEFSQU1TICgoaW50KSk7CisjZW5kaWYKKworc3RhdGljIHZvaWQKK3Bhc3Nfc2lnbmFsIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgdm9pZAora2lsbF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCit0ZXJtaW5hbF9vdXJzXzEgUEFSQU1TICgoaW50KSk7CisMCisvKiBSZWNvcmQgdGVybWluYWwgc3RhdHVzIHNlcGFyYXRlbHkgZm9yIGRlYnVnZ2VyIGFuZCBpbmZlcmlvci4gICovCisKK3N0YXRpYyBzZXJpYWxfdCBzdGRpbl9zZXJpYWw7CisKKy8qIFRUWSBzdGF0ZSBmb3IgdGhlIGluZmVyaW9yLiAgV2Ugc2F2ZSBpdCB3aGVuZXZlciB0aGUgaW5mZXJpb3Igc3RvcHMsIGFuZAorICAgcmVzdG9yZSBpdCB3aGVuIGl0IHJlc3VtZXMuICAqLworc3RhdGljIHNlcmlhbF90dHlzdGF0ZSBpbmZlcmlvcl90dHlzdGF0ZTsKKworLyogT3VyIG93biB0dHkgc3RhdGUsIHdoaWNoIHdlIHJlc3RvcmUgZXZlcnkgdGltZSB3ZSBuZWVkIHRvIGRlYWwgd2l0aCB0aGUKKyAgIHRlcm1pbmFsLiAgV2Ugb25seSBzZXQgaXQgb25jZSwgd2hlbiBHREIgZmlyc3Qgc3RhcnRzLiAgVGhlIHNldHRpbmdzIG9mCisgICBmbGFncyB3aGljaCByZWFkbGluZSBzYXZlcyBhbmQgcmVzdG9yZXMgYW5kIHVuaW1wb3J0YW50LiAgKi8KK3N0YXRpYyBzZXJpYWxfdHR5c3RhdGUgb3VyX3R0eXN0YXRlOworCisvKiBmY250bCBmbGFncyBmb3IgdXMgYW5kIHRoZSBpbmZlcmlvci4gIFNhdmVkIGFuZCByZXN0b3JlZCBqdXN0IGxpa2UKKyAgIHtvdXIsaW5mZXJpb3J9X3R0eXN0YXRlLiAgKi8KK3N0YXRpYyBpbnQgdGZsYWdzX2luZmVyaW9yOworc3RhdGljIGludCB0ZmxhZ3Nfb3VyczsKKworI2lmZGVmIFBST0NFU1NfR1JPVVBfVFlQRQorLyogUHJvY2VzcyBncm91cCBmb3IgdXMgYW5kIHRoZSBpbmZlcmlvci4gIFNhdmVkIGFuZCByZXN0b3JlZCBqdXN0IGxpa2UKKyAgIHtvdXIsaW5mZXJpb3J9X3R0eXN0YXRlLiAgKi8KK1BST0NFU1NfR1JPVVBfVFlQRSBvdXJfcHJvY2Vzc19ncm91cDsKK1BST0NFU1NfR1JPVVBfVFlQRSBpbmZlcmlvcl9wcm9jZXNzX2dyb3VwOworI2VuZGlmCisKKy8qIFdoaWxlIHRoZSBpbmZlcmlvciBpcyBydW5uaW5nLCB3ZSB3YW50IFNJR0lOVCBhbmQgU0lHUVVJVCB0byBnbyB0byB0aGUKKyAgIGluZmVyaW9yIG9ubHkuICBJZiB3ZSBoYXZlIGpvYiBjb250cm9sLCB0aGF0IHRha2VzIGNhcmUgb2YgaXQuICBJZiBub3QsCisgICB3ZSBzYXZlIG91ciBoYW5kbGVycyBpbiB0aGVzZSB0d28gdmFyaWFibGVzIGFuZCBzZXQgU0lHSU5UIGFuZCBTSUdRVUlUCisgICB0byBTSUdfSUdOLiAgKi8KKworc3RhdGljIHZvaWQgKCpzaWdpbnRfb3VycykgKCk7CitzdGF0aWMgdm9pZCAoKnNpZ3F1aXRfb3VycykgKCk7CisKKy8qIFRoZSBuYW1lIG9mIHRoZSB0dHkgKGZyb20gdGhlIGB0dHknIGNvbW1hbmQpIHRoYXQgd2UgZ2F2ZSB0byB0aGUgaW5mZXJpb3IKKyAgIHdoZW4gaXQgd2FzIGxhc3Qgc3RhcnRlZC4gICovCisKK3N0YXRpYyBjaGFyICppbmZlcmlvcl90aGlzcnVuX3Rlcm1pbmFsOworCisvKiBOb256ZXJvIGlmIG91ciB0ZXJtaW5hbCBzZXR0aW5ncyBhcmUgaW4gZWZmZWN0LiAgWmVybyBpZiB0aGUKKyAgIGluZmVyaW9yJ3Mgc2V0dGluZ3MgYXJlIGluIGVmZmVjdC4gIElnbm9yZWQgaWYgIWdkYl9oYXNfYV90ZXJtaW5hbAorICAgKCkuICAqLworCitpbnQgdGVybWluYWxfaXNfb3VyczsKKworZW51bSB7eWVzLCBubywgaGF2ZV9ub3RfY2hlY2tlZH0gZ2RiX2hhc19hX3Rlcm1pbmFsX2ZsYWcgPSBoYXZlX25vdF9jaGVja2VkOworCisvKiBEb2VzIEdEQiBoYXZlIGEgdGVybWluYWwgKG9uIHN0ZGluKT8gICovCitpbnQKK2dkYl9oYXNfYV90ZXJtaW5hbCAoKQoreworICBzd2l0Y2ggKGdkYl9oYXNfYV90ZXJtaW5hbF9mbGFnKQorICAgIHsKKyAgICBjYXNlIHllczoKKyAgICAgIHJldHVybiAxOworICAgIGNhc2Ugbm86CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIGhhdmVfbm90X2NoZWNrZWQ6CisgICAgICAvKiBHZXQgYWxsIHRoZSBjdXJyZW50IHR0eSBzZXR0aW5ncyAoaW5jbHVkaW5nIHdoZXRoZXIgd2UgaGF2ZSBhIHR0eSBhdAorCSBhbGwhKS4gIENhbid0IGRvIHRoaXMgaW4gX2luaXRpYWxpemVfaW5mbG93IGJlY2F1c2UgU0VSSUFMX0ZET1BFTgorCSB3b24ndCB3b3JrIHVudGlsIHRoZSBzZXJpYWxfb3BzX2xpc3QgaXMgaW5pdGlhbGl6ZWQuICAqLworCisjaWZkZWYgRl9HRVRGTAorICAgICAgdGZsYWdzX291cnMgPSBmY250bCAoMCwgRl9HRVRGTCwgMCk7CisjZW5kaWYKKworICAgICAgZ2RiX2hhc19hX3Rlcm1pbmFsX2ZsYWcgPSBubzsKKyAgICAgIHN0ZGluX3NlcmlhbCA9IFNFUklBTF9GRE9QRU4gKDApOworICAgICAgaWYgKHN0ZGluX3NlcmlhbCAhPSBOVUxMKQorCXsKKwkgIG91cl90dHlzdGF0ZSA9IFNFUklBTF9HRVRfVFRZX1NUQVRFIChzdGRpbl9zZXJpYWwpOworCisJICBpZiAob3VyX3R0eXN0YXRlICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBnZGJfaGFzX2FfdGVybWluYWxfZmxhZyA9IHllczsKKyNpZmRlZiBIQVZFX1RFUk1JT1MKKwkgICAgICBvdXJfcHJvY2Vzc19ncm91cCA9IHRjZ2V0cGdycCAoMCk7CisjZW5kaWYKKyNpZmRlZiBIQVZFX1RFUk1JTworCSAgICAgIG91cl9wcm9jZXNzX2dyb3VwID0gZ2V0cGdycCAoKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfU0dUVFkKKwkgICAgICBpb2N0bCAoMCwgVElPQ0dQR1JQLCAmb3VyX3Byb2Nlc3NfZ3JvdXApOworI2VuZGlmCisJICAgIH0KKwl9CisKKyAgICAgIHJldHVybiBnZGJfaGFzX2FfdGVybWluYWxfZmxhZyA9PSB5ZXM7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qICJDYW4ndCBoYXBwZW4iLiAgKi8KKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyogTWFjcm8gZm9yIHByaW50aW5nIGVycm9ycyBmcm9tIGlvY3RsIG9wZXJhdGlvbnMgKi8KKworI2RlZmluZQlPT1BTWSh3aGF0KQlcCisgIGlmIChyZXN1bHQgPT0gLTEpCVwKKyAgICBmcHJpbnRmX3VuZmlsdGVyZWQoZ2RiX3N0ZGVyciwgIlslcyBmYWlsZWQgaW4gdGVybWluYWxfaW5mZXJpb3I6ICVzXVxuIiwgXAorCSAgICB3aGF0LCBzdHJlcnJvciAoZXJybm8pKQorCitzdGF0aWMgdm9pZCB0ZXJtaW5hbF9vdXJzXzEgUEFSQU1TICgoaW50KSk7CisKKy8qIEluaXRpYWxpemUgdGhlIHRlcm1pbmFsIHNldHRpbmdzIHdlIHJlY29yZCBmb3IgdGhlIGluZmVyaW9yLAorICAgYmVmb3JlIHdlIGFjdHVhbGx5IHJ1biB0aGUgaW5mZXJpb3IuICAqLworCit2b2lkCit0ZXJtaW5hbF9pbml0X2luZmVyaW9yX3dpdGhfcGdycCAocGdycCkKKyAgICAgaW50IHBncnA7Cit7CisgIGlmIChnZGJfaGFzX2FfdGVybWluYWwgKCkpCisgICAgeworICAgICAgLyogV2UgY291bGQganVzdCBhcyB3ZWxsIGNvcHkgb3VyX3R0eXN0YXRlIChpZiB3ZSBmZWx0IGxpa2UgYWRkaW5nCisJIGEgbmV3IGZ1bmN0aW9uIFNFUklBTF9DT1BZX1RUWV9TVEFURSkuICAqLworICAgICAgaWYgKGluZmVyaW9yX3R0eXN0YXRlKQorCWZyZWUgKGluZmVyaW9yX3R0eXN0YXRlKTsKKyAgICAgIGluZmVyaW9yX3R0eXN0YXRlID0gU0VSSUFMX0dFVF9UVFlfU1RBVEUgKHN0ZGluX3NlcmlhbCk7CisKKyNpZmRlZiBQUk9DRVNTX0dST1VQX1RZUEUKKyAgICAgIGluZmVyaW9yX3Byb2Nlc3NfZ3JvdXAgPSBwZ3JwOworI2VuZGlmCisKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IG5leHQgdGltZSB3ZSBjYWxsIHRlcm1pbmFsX2luZmVyaW9yICh3aGljaCB3aWxsIGJlCisJIGJlZm9yZSB0aGUgcHJvZ3JhbSBydW5zLCBhcyBpdCBuZWVkcyB0byBiZSksIHdlIGluc3RhbGwgdGhlIG5ldworCSBwcm9jZXNzIGdyb3VwLiAgKi8KKyAgICAgIHRlcm1pbmFsX2lzX291cnMgPSAxOworICAgIH0KK30KKwordm9pZAordGVybWluYWxfaW5pdF9pbmZlcmlvciAoKQoreworI2lmZGVmIFBST0NFU1NfR1JPVVBfVFlQRQorICAvKiBUaGlzIGlzIGZvciBMeW54LCBhbmQgc2hvdWxkIGJlIGNsZWFuZWQgdXAgYnkgaGF2aW5nIEx5bnggYmUgYSBzZXBhcmF0ZQorICAgICBkZWJ1Z2dpbmcgdGFyZ2V0IHdpdGggYSB2ZXJzaW9uIG9mIHRhcmdldF90ZXJtaW5hbF9pbml0X2luZmVyaW9yIHdoaWNoCisgICAgIHBhc3NlcyBpbiB0aGUgcHJvY2VzcyBncm91cCB0byBhIGdlbmVyaWMgcm91dGluZSB3aGljaCBkb2VzIGFsbCB0aGUgd29yaworICAgICAoYW5kIHRoZSBub24tdGhyZWFkZWQgY2hpbGRfdGVybWluYWxfaW5pdF9pbmZlcmlvciBjYW4ganVzdCBwYXNzIGluCisgICAgIGluZmVyaW9yX3BpZCB0byB0aGUgc2FtZSByb3V0aW5lKS4gICovCisgIC8qIFdlIGFzc3VtZSBJTkZFUklPUl9QSUQgaXMgYWxzbyB0aGUgY2hpbGQncyBwcm9jZXNzIGdyb3VwLiAgKi8KKyAgdGVybWluYWxfaW5pdF9pbmZlcmlvcl93aXRoX3BncnAgKFBJREdFVCAoaW5mZXJpb3JfcGlkKSk7CisjZW5kaWYgLyogUFJPQ0VTU19HUk9VUF9UWVBFICovCit9CisKKy8qIFB1dCB0aGUgaW5mZXJpb3IncyB0ZXJtaW5hbCBzZXR0aW5ncyBpbnRvIGVmZmVjdC4KKyAgIFRoaXMgaXMgcHJlcGFyYXRpb24gZm9yIHN0YXJ0aW5nIG9yIHJlc3VtaW5nIHRoZSBpbmZlcmlvci4gICovCisKK3ZvaWQKK3Rlcm1pbmFsX2luZmVyaW9yICgpCit7CisgIGlmIChnZGJfaGFzX2FfdGVybWluYWwgKCkgJiYgdGVybWluYWxfaXNfb3VycworICAgICAgJiYgaW5mZXJpb3JfdGhpc3J1bl90ZXJtaW5hbCA9PSAwKQorICAgIHsKKyAgICAgIGludCByZXN1bHQ7CisKKyNpZmRlZiBGX0dFVEZMCisgICAgICAvKiBJcyB0aGVyZSBhIHJlYXNvbiB0aGlzIGlzIGJlaW5nIGRvbmUgdHdpY2U/ICBJdCBoYXBwZW5zIGJvdGgKKwkgcGxhY2VzIHdlIHVzZSBGX1NFVEZMLCBzbyBJJ20gaW5jbGluZWQgdG8gdGhpbmsgcGVyaGFwcyB0aGVyZQorCSBpcyBzb21lIHJlYXNvbiwgaG93ZXZlciBwZXJ2ZXJzZS4gIFBlcmhhcHMgbm90IHRob3VnaC4uLiAgKi8KKyAgICAgIHJlc3VsdCA9IGZjbnRsICgwLCBGX1NFVEZMLCB0ZmxhZ3NfaW5mZXJpb3IpOworICAgICAgcmVzdWx0ID0gZmNudGwgKDAsIEZfU0VURkwsIHRmbGFnc19pbmZlcmlvcik7CisgICAgICBPT1BTWSAoImZjbnRsIEZfU0VURkwiKTsKKyNlbmRpZgorCisgICAgICAvKiBCZWNhdXNlIHdlIHdlcmUgY2FyZWZ1bCB0byBub3QgY2hhbmdlIGluIG9yIG91dCBvZiByYXcgbW9kZSBpbgorCSB0ZXJtaW5hbF9vdXJzLCB3ZSB3aWxsIG5vdCBjaGFuZ2UgaW4gb3VyIG91dCBvZiByYXcgbW9kZSB3aXRoCisJIHRoaXMgY2FsbCwgc28gd2UgZG9uJ3QgZmx1c2ggYW55IGlucHV0LiAgKi8KKyAgICAgIHJlc3VsdCA9IFNFUklBTF9TRVRfVFRZX1NUQVRFIChzdGRpbl9zZXJpYWwsIGluZmVyaW9yX3R0eXN0YXRlKTsKKyAgICAgIE9PUFNZICgic2V0dGluZyB0dHkgc3RhdGUiKTsKKworICAgICAgaWYgKCFqb2JfY29udHJvbCkKKwl7CisJICBzaWdpbnRfb3VycyA9ICh2b2lkICgqKSAoKSkgc2lnbmFsIChTSUdJTlQsIFNJR19JR04pOworI2lmZGVmIFNJR1FVSVQKKwkgIHNpZ3F1aXRfb3VycyA9ICh2b2lkICgqKSAoKSkgc2lnbmFsIChTSUdRVUlULCBTSUdfSUdOKTsKKyNlbmRpZgorCX0KKworICAgICAgLyogSWYgYXR0YWNoX2ZsYWcgaXMgc2V0LCB3ZSBkb24ndCBrbm93IHdoZXRoZXIgd2UgYXJlIHNoYXJpbmcgYQorCSB0ZXJtaW5hbCB3aXRoIHRoZSBpbmZlcmlvciBvciBub3QuICAoYXR0YWNoaW5nIGEgcHJvY2VzcworCSB3aXRob3V0IGEgdGVybWluYWwgaXMgb25lIGNhc2Ugd2hlcmUgd2UgZG8gbm90OyBhdHRhY2hpbmcgYQorCSBwcm9jZXNzIHdoaWNoIHdlIHJhbiBmcm9tIHRoZSBzYW1lIHNoZWxsIGFzIEdEQiB2aWEgYCYnIGlzCisJIG9uZSBjYXNlIHdoZXJlIHdlIGRvLCBJIHRoaW5rIChidXQgcGVyaGFwcyB0aGlzIGlzIG5vdAorCSBgc2hhcmluZycgaW4gdGhlIHNlbnNlIHRoYXQgd2UgbmVlZCB0byBzYXZlIGFuZCByZXN0b3JlIHR0eQorCSBzdGF0ZSkpLiAgSSBkb24ndCBrbm93IGlmIHRoZXJlIGlzIGFueSB3YXkgdG8gdGVsbCB3aGV0aGVyIHdlCisJIGFyZSBzaGFyaW5nIGEgdGVybWluYWwuICBTbyB3aGF0IHdlIGRvIGlzIHRvIGdvIHRocm91Z2ggYWxsCisJIHRoZSBzYXZpbmcgYW5kIHJlc3RvcmluZyBvZiB0aGUgdHR5IHN0YXRlLCBidXQgaWdub3JlIGVycm9ycworCSBzZXR0aW5nIHRoZSBwcm9jZXNzIGdyb3VwLCB3aGljaCB3aWxsIGhhcHBlbiBpZiB3ZSBhcmUgbm90CisJIHNoYXJpbmcgYSB0ZXJtaW5hbCkuICAqLworCisgICAgICBpZiAoam9iX2NvbnRyb2wpCisJeworI2lmZGVmIEhBVkVfVEVSTUlPUworCSAgcmVzdWx0ID0gdGNzZXRwZ3JwICgwLCBpbmZlcmlvcl9wcm9jZXNzX2dyb3VwKTsKKwkgIGlmICghYXR0YWNoX2ZsYWcpCisJICAgIE9PUFNZICgidGNzZXRwZ3JwIik7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU0dUVFkKKwkgIHJlc3VsdCA9IGlvY3RsICgwLCBUSU9DU1BHUlAsICZpbmZlcmlvcl9wcm9jZXNzX2dyb3VwKTsKKwkgIGlmICghYXR0YWNoX2ZsYWcpCisJICAgIE9PUFNZICgiVElPQ1NQR1JQIik7CisjZW5kaWYKKwl9CisKKyAgICB9CisgIHRlcm1pbmFsX2lzX291cnMgPSAwOworfQorCisvKiBQdXQgc29tZSBvZiBvdXIgdGVybWluYWwgc2V0dGluZ3MgaW50byBlZmZlY3QsCisgICBlbm91Z2ggdG8gZ2V0IHByb3BlciByZXN1bHRzIGZyb20gb3VyIG91dHB1dCwKKyAgIGJ1dCBkbyBub3QgY2hhbmdlIGludG8gb3Igb3V0IG9mIFJBVyBtb2RlCisgICBzbyB0aGF0IG5vIGlucHV0IGlzIGRpc2NhcmRlZC4KKworICAgQWZ0ZXIgZG9pbmcgdGhpcywgZWl0aGVyIHRlcm1pbmFsX291cnMgb3IgdGVybWluYWxfaW5mZXJpb3IKKyAgIHNob3VsZCBiZSBjYWxsZWQgdG8gZ2V0IGJhY2sgdG8gYSBub3JtYWwgc3RhdGUgb2YgYWZmYWlycy4gICovCisKK3ZvaWQKK3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCAoKQoreworICB0ZXJtaW5hbF9vdXJzXzEgKDEpOworfQorCisvKiBQdXQgb3VyIHRlcm1pbmFsIHNldHRpbmdzIGludG8gZWZmZWN0LgorICAgRmlyc3QgcmVjb3JkIHRoZSBpbmZlcmlvcidzIHRlcm1pbmFsIHNldHRpbmdzCisgICBzbyB0aGV5IGNhbiBiZSByZXN0b3JlZCBwcm9wZXJseSBsYXRlci4gICovCisKK3ZvaWQKK3Rlcm1pbmFsX291cnMgKCkKK3sKKyAgdGVybWluYWxfb3Vyc18xICgwKTsKK30KKworLyogb3V0cHV0X29ubHkgaXMgbm90IHVzZWQsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgdW5sZXNzIHdlIGludHJvZHVjZQorICAgc2VwYXJhdGUgdGVybWluYWxfaXNfb3VycyBhbmQgdGVybWluYWxfaXNfb3Vyc19mb3Jfb3V0cHV0CisgICBmbGFncy4gICovCisKK3N0YXRpYyB2b2lkCit0ZXJtaW5hbF9vdXJzXzEgKG91dHB1dF9vbmx5KQorICAgICBpbnQgb3V0cHV0X29ubHk7Cit7CisgIC8qIENoZWNraW5nIGluZmVyaW9yX3RoaXNydW5fdGVybWluYWwgaXMgbmVjZXNzYXJ5IHNvIHRoYXQKKyAgICAgaWYgR0RCIGlzIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQsIGl0IHdvbid0IGJsb2NrIHRyeWluZworICAgICB0byBkbyB0aGUgaW9jdGwoKSdzIGJlbG93LiAgQ2hlY2tpbmcgZ2RiX2hhc19hX3Rlcm1pbmFsCisgICAgIGF2b2lkcyBhdHRlbXB0aW5nIGFsbCB0aGUgaW9jdGwncyB3aGVuIHJ1bm5pbmcgaW4gYmF0Y2guICAqLworICBpZiAoaW5mZXJpb3JfdGhpc3J1bl90ZXJtaW5hbCAhPSAwIHx8IGdkYl9oYXNfYV90ZXJtaW5hbCAoKSA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAoIXRlcm1pbmFsX2lzX291cnMpCisgICAgeworICAgICAgLyogSWdub3JlIHRoaXMgc2lnbmFsIHNpbmNlIGl0IHdpbGwgaGFwcGVuIHdoZW4gd2UgdHJ5IHRvIHNldCB0aGUKKwkgcGdycC4gICovCisgICAgICB2b2lkICgqb3NpZ3R0b3UpICgpOworICAgICAgaW50IHJlc3VsdDsKKworICAgICAgdGVybWluYWxfaXNfb3VycyA9IDE7CisKKyNpZmRlZiBTSUdUVE9VCisgICAgICBpZiAoam9iX2NvbnRyb2wpCisJb3NpZ3R0b3UgPSAodm9pZCAoKikgKCkpIHNpZ25hbCAoU0lHVFRPVSwgU0lHX0lHTik7CisjZW5kaWYKKworICAgICAgaWYgKGluZmVyaW9yX3R0eXN0YXRlKQorCWZyZWUgKGluZmVyaW9yX3R0eXN0YXRlKTsKKyAgICAgIGluZmVyaW9yX3R0eXN0YXRlID0gU0VSSUFMX0dFVF9UVFlfU1RBVEUgKHN0ZGluX3NlcmlhbCk7CisjaWZkZWYgSEFWRV9URVJNSU9TCisgICAgICBpbmZlcmlvcl9wcm9jZXNzX2dyb3VwID0gdGNnZXRwZ3JwICgwKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfVEVSTUlPCisgICAgICBpbmZlcmlvcl9wcm9jZXNzX2dyb3VwID0gZ2V0cGdycCAoKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfU0dUVFkKKyAgICAgIGlvY3RsICgwLCBUSU9DR1BHUlAsICZpbmZlcmlvcl9wcm9jZXNzX2dyb3VwKTsKKyNlbmRpZgorCisgICAgICAvKiBIZXJlIHdlIHVzZWQgdG8gc2V0IElDQU5PTiBpbiBvdXIgdHR5c3RhdGUsIGJ1dCBJIGJlbGlldmUgdGhpcworCSB3YXMgYW4gYXJ0aWZhY3QgZnJvbSBiZWZvcmUgd2hlbiB3ZSB1c2VkIHJlYWRsaW5lLiAgUmVhZGxpbmUgc2V0cworCSB0aGUgdHR5IHN0YXRlIHdoZW4gaXQgbmVlZHMgdG8uCisJIEZJWE1FLW1heWJlOiBIb3dldmVyLCBxdWVyeSgpIGV4cGVjdHMgbm9uLXJhdyBtb2RlIGFuZCBkb2Vzbid0CisJIHVzZSByZWFkbGluZS4gIE1heWJlIHF1ZXJ5IHNob3VsZCB1c2UgcmVhZGxpbmUgKG9uIHRoZSBvdGhlciBoYW5kLAorCSB0aGlzIG9ubHkgbWF0dGVycyBmb3IgSEFWRV9TR1RUWSwgbm90IHRlcm1pbyBvciB0ZXJtaW9zLCBJIHRoaW5rKS4gICovCisKKyAgICAgIC8qIFNldCB0dHkgc3RhdGUgdG8gb3VyX3R0eXN0YXRlLiAgV2UgZG9uJ3QgY2hhbmdlIGluIG91ciBvdXQgb2YgcmF3CisJIG1vZGUsIHRvIGF2b2lkIGZsdXNoaW5nIGlucHV0LiAgV2UgbmVlZCB0byBkbyB0aGUgc2FtZSB0aGluZworCSByZWdhcmRsZXNzIG9mIG91dHB1dF9vbmx5LCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgc2VwYXJhdGUKKwkgdGVybWluYWxfaXNfb3VycyBhbmQgdGVybWluYWxfaXNfb3Vyc19mb3Jfb3V0cHV0IGZsYWdzLiAgSXQncyBPSywKKwkgdGhvdWdoLCBzaW5jZSByZWFkbGluZSB3aWxsIGRlYWwgd2l0aCByYXcgbW9kZSB3aGVuL2lmIGl0IG5lZWRzIHRvLgorCSAqLworCisgICAgICBTRVJJQUxfTk9GTFVTSF9TRVRfVFRZX1NUQVRFIChzdGRpbl9zZXJpYWwsIG91cl90dHlzdGF0ZSwKKwkJCQkgICAgaW5mZXJpb3JfdHR5c3RhdGUpOworCisgICAgICBpZiAoam9iX2NvbnRyb2wpCisJeworI2lmZGVmIEhBVkVfVEVSTUlPUworCSAgcmVzdWx0ID0gdGNzZXRwZ3JwICgwLCBvdXJfcHJvY2Vzc19ncm91cCk7CisjaWYgMAorCSAgLyogVGhpcyBmYWlscyBvbiBVbHRyaXggd2l0aCBFSU5WQUwgaWYgeW91IHJ1biB0aGUgdGVzdHN1aXRlCisJICAgICBpbiB0aGUgYmFja2dyb3VuZCB3aXRoIG5vaHVwLCBhbmQgdGhlbiBsb2cgb3V0LiAgR0RCIG5ldmVyCisJICAgICB1c2VkIHRvIGNoZWNrIGZvciBhbiBlcnJvciBoZXJlLCBzbyBwZXJoYXBzIHRoZXJlIGFyZSBvdGhlcgorCSAgICAgc3VjaCBzaXR1YXRpb25zIGFzIHdlbGwuICAqLworCSAgaWYgKHJlc3VsdCA9PSAtMSkKKwkgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiW3Rjc2V0cGdycCBmYWlsZWQgaW4gdGVybWluYWxfb3VyczogJXNdXG4iLAorCQkgICAgIHN0cmVycm9yIChlcnJubykpOworI2VuZGlmCisjZW5kaWYgLyogdGVybWlvcyAqLworCisjaWZkZWYgSEFWRV9TR1RUWQorCSAgcmVzdWx0ID0gaW9jdGwgKDAsIFRJT0NTUEdSUCwgJm91cl9wcm9jZXNzX2dyb3VwKTsKKyNlbmRpZgorCX0KKworI2lmZGVmIFNJR1RUT1UKKyAgICAgIGlmIChqb2JfY29udHJvbCkKKwlzaWduYWwgKFNJR1RUT1UsIG9zaWd0dG91KTsKKyNlbmRpZgorCisgICAgICBpZiAoIWpvYl9jb250cm9sKQorCXsKKwkgIHNpZ25hbCAoU0lHSU5ULCBzaWdpbnRfb3Vycyk7CisjaWZkZWYgU0lHUVVJVAorCSAgc2lnbmFsIChTSUdRVUlULCBzaWdxdWl0X291cnMpOworI2VuZGlmCisJfQorCisjaWZkZWYgRl9HRVRGTAorICAgICAgdGZsYWdzX2luZmVyaW9yID0gZmNudGwgKDAsIEZfR0VURkwsIDApOworCisgICAgICAvKiBJcyB0aGVyZSBhIHJlYXNvbiB0aGlzIGlzIGJlaW5nIGRvbmUgdHdpY2U/ICBJdCBoYXBwZW5zIGJvdGgKKwkgcGxhY2VzIHdlIHVzZSBGX1NFVEZMLCBzbyBJJ20gaW5jbGluZWQgdG8gdGhpbmsgcGVyaGFwcyB0aGVyZQorCSBpcyBzb21lIHJlYXNvbiwgaG93ZXZlciBwZXJ2ZXJzZS4gIFBlcmhhcHMgbm90IHRob3VnaC4uLiAgKi8KKyAgICAgIHJlc3VsdCA9IGZjbnRsICgwLCBGX1NFVEZMLCB0ZmxhZ3Nfb3Vycyk7CisgICAgICByZXN1bHQgPSBmY250bCAoMCwgRl9TRVRGTCwgdGZsYWdzX291cnMpOworI2VuZGlmCisKKyAgICAgIHJlc3VsdCA9IHJlc3VsdDsJLyogbGludCAqLworICAgIH0KK30KKworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK3Rlcm1faW5mbyAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHRhcmdldF90ZXJtaW5hbF9pbmZvIChhcmcsIGZyb21fdHR5KTsKK30KKworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK2NoaWxkX3Rlcm1pbmFsX2luZm8gKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGlmICghZ2RiX2hhc19hX3Rlcm1pbmFsICgpKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlRoaXMgR0RCIGRvZXMgbm90IGNvbnRyb2wgYSB0ZXJtaW5hbC5cbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBwcmludGZfZmlsdGVyZWQgKCJJbmZlcmlvcidzIHRlcm1pbmFsIHN0YXR1cyAoY3VycmVudGx5IHNhdmVkIGJ5IEdEQik6XG4iKTsKKworICAvKiBGaXJzdCB0aGUgZmNudGwgZmxhZ3MuICAqLworICB7CisgICAgaW50IGZsYWdzOworICAgIAorICAgIGZsYWdzID0gdGZsYWdzX2luZmVyaW9yOworCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiRmlsZSBkZXNjcmlwdG9yIGZsYWdzID0gIik7CisKKyNpZm5kZWYgT19BQ0NNT0RFCisjZGVmaW5lIE9fQUNDTU9ERSAoT19SRE9OTFkgfCBPX1dST05MWSB8IE9fUkRXUikKKyNlbmRpZgorICAgIC8qIChPX0FDQ01PREUpIHBhcmVucyBhcmUgdG8gYXZvaWQgVWx0cml4IGhlYWRlciBmaWxlIGJ1ZyAqLworICAgIHN3aXRjaCAoZmxhZ3MgJiAoT19BQ0NNT0RFKSkKKyAgICAgIHsKKyAgICAgIGNhc2UgT19SRE9OTFk6IHByaW50Zl9maWx0ZXJlZCAoIk9fUkRPTkxZIik7IGJyZWFrOworICAgICAgY2FzZSBPX1dST05MWTogcHJpbnRmX2ZpbHRlcmVkICgiT19XUk9OTFkiKTsgYnJlYWs7CisgICAgICBjYXNlIE9fUkRXUjogcHJpbnRmX2ZpbHRlcmVkICgiT19SRFdSIik7IGJyZWFrOworICAgICAgfQorICAgIGZsYWdzICY9IH4oT19BQ0NNT0RFKTsKKworI2lmZGVmIE9fTk9OQkxPQ0sKKyAgICBpZiAoZmxhZ3MgJiBPX05PTkJMT0NLKSAKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiB8IE9fTk9OQkxPQ0siKTsKKyAgICBmbGFncyAmPSB+T19OT05CTE9DSzsKKyNlbmRpZgorICAgIAorI2lmIGRlZmluZWQgKE9fTkRFTEFZKQorICAgIC8qIElmIE9fTkRFTEFZIGFuZCBPX05PTkJMT0NLIGFyZSBkZWZpbmVkIHRvIHRoZSBzYW1lIHRoaW5nLCB3ZSB3aWxsCisgICAgICAgcHJpbnQgaXQgYXMgT19OT05CTE9DSywgd2hpY2ggaXMgZ29vZCBjYXVzZSB0aGF0IGlzIHdoYXQgUE9TSVgKKyAgICAgICBoYXMsIGFuZCB0aGUgZmxhZyB3aWxsIGFscmVhZHkgYmUgY2xlYXJlZCBieSB0aGUgdGltZSB3ZSBnZXQgaGVyZS4gICovCisgICAgaWYgKGZsYWdzICYgT19OREVMQVkpCisgICAgICBwcmludGZfZmlsdGVyZWQgKCIgfCBPX05ERUxBWSIpOworICAgIGZsYWdzICY9IH5PX05ERUxBWTsKKyNlbmRpZgorCisgICAgaWYgKGZsYWdzICYgT19BUFBFTkQpCisgICAgICBwcmludGZfZmlsdGVyZWQgKCIgfCBPX0FQUEVORCIpOworICAgIGZsYWdzICY9IH5PX0FQUEVORDsKKworI2lmIGRlZmluZWQgKE9fQklOQVJZKQorICAgIGlmIChmbGFncyAmIE9fQklOQVJZKQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiIHwgT19CSU5BUlkiKTsKKyAgICBmbGFncyAmPSB+T19CSU5BUlk7CisjZW5kaWYKKworICAgIGlmIChmbGFncykKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiB8IDB4JXgiLCBmbGFncyk7CisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgfQorCisjaWZkZWYgUFJPQ0VTU19HUk9VUF9UWVBFCisgIHByaW50Zl9maWx0ZXJlZCAoIlByb2Nlc3MgZ3JvdXAgPSAlZFxuIiwgaW5mZXJpb3JfcHJvY2Vzc19ncm91cCk7CisjZW5kaWYKKworICBTRVJJQUxfUFJJTlRfVFRZX1NUQVRFIChzdGRpbl9zZXJpYWwsIGluZmVyaW9yX3R0eXN0YXRlKTsKK30KKwwKKy8qIE5FV19UVFlfUFJFRk9SSyBpcyBjYWxsZWQgYmVmb3JlIGZvcmtpbmcgYSBuZXcgY2hpbGQgcHJvY2VzcywKKyAgIHNvIHdlIGNhbiByZWNvcmQgdGhlIHN0YXRlIG9mIHR0eXMgaW4gdGhlIGNoaWxkIHRvIGJlIGZvcm1lZC4KKyAgIFRUWU5BTUUgaXMgbnVsbCBpZiB3ZSBhcmUgdG8gc2hhcmUgdGhlIHRlcm1pbmFsIHdpdGggZ2RiOworICAgb3IgcG9pbnRzIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgdHR5LgorCisgICBORVdfVFRZIGlzIGNhbGxlZCBpbiBuZXcgY2hpbGQgcHJvY2Vzc2VzIHVuZGVyIFVuaXgsIHdoaWNoIHdpbGwKKyAgIGJlY29tZSBkZWJ1Z2dlciB0YXJnZXQgcHJvY2Vzc2VzLiAgVGhpcyBhY3R1YWxseSBzd2l0Y2hlcyB0bworICAgdGhlIHRlcm1pbmFsIHNwZWNpZmllZCBpbiB0aGUgTkVXX1RUWV9QUkVGT1JLIGNhbGwuICAqLworCit2b2lkCituZXdfdHR5X3ByZWZvcmsgKHR0eW5hbWUpCisgICAgIGNoYXIgKnR0eW5hbWU7Cit7CisgIC8qIFNhdmUgdGhlIG5hbWUgZm9yIGxhdGVyLCBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciB3ZSBhbmQgdGhlIGNoaWxkCisgICAgIGFyZSBzaGFyaW5nIGEgdHR5LiAgKi8KKyAgaW5mZXJpb3JfdGhpc3J1bl90ZXJtaW5hbCA9IHR0eW5hbWU7Cit9CisKK3ZvaWQKK25ld190dHkgKCkKK3sKKyAgcmVnaXN0ZXIgaW50IHR0eTsKKworICBpZiAoaW5mZXJpb3JfdGhpc3J1bl90ZXJtaW5hbCA9PSAwKQorICAgIHJldHVybjsKKyNpZiAhZGVmaW5lZChfX0dPMzJfXykgJiYgIWRlZmluZWQoX1dJTjMyKQorI2lmZGVmIFRJT0NOT1RUWQorICAvKiBEaXNjb25uZWN0IHRoZSBjaGlsZCBwcm9jZXNzIGZyb20gb3VyIGNvbnRyb2xsaW5nIHRlcm1pbmFsLiAgT24gc29tZQorICAgICBzeXN0ZW1zIChTVlI0IGZvciBleGFtcGxlKSwgdGhpcyBtYXkgY2F1c2UgYSBTSUdUVE9VLCBzbyB0ZW1wb3JhcmlseQorICAgICBpZ25vcmUgU0lHVFRPVS4gKi8KKyAgdHR5ID0gb3BlbigiL2Rldi90dHkiLCBPX1JEV1IpOworICBpZiAodHR5ID4gMCkKKyAgICB7CisgICAgICB2b2lkICgqb3NpZ3R0b3UpICgpOworCisgICAgICBvc2lndHRvdSA9ICh2b2lkICgqKSgpKSBzaWduYWwoU0lHVFRPVSwgU0lHX0lHTik7CisgICAgICBpb2N0bCh0dHksIFRJT0NOT1RUWSwgMCk7CisgICAgICBjbG9zZSh0dHkpOworICAgICAgc2lnbmFsKFNJR1RUT1UsIG9zaWd0dG91KTsKKyAgICB9CisjZW5kaWYKKworICAvKiBOb3cgb3BlbiB0aGUgc3BlY2lmaWVkIG5ldyB0ZXJtaW5hbC4gICovCisKKyNpZmRlZiBVU0VfT19OT0NUVFkKKyAgdHR5ID0gb3BlbihpbmZlcmlvcl90aGlzcnVuX3Rlcm1pbmFsLCBPX1JEV1IgfCBPX05PQ1RUWSk7CisjZWxzZQorICB0dHkgPSBvcGVuKGluZmVyaW9yX3RoaXNydW5fdGVybWluYWwsIE9fUkRXUik7CisjZW5kaWYKKyAgaWYgKHR0eSA9PSAtMSkKKyAgICB7CisgICAgICBwcmludF9zeXNfZXJybXNnIChpbmZlcmlvcl90aGlzcnVuX3Rlcm1pbmFsLCBlcnJubyk7CisgICAgICBfZXhpdCgxKTsKKyAgICB9CisKKyAgLyogQXZvaWQgdXNlIG9mIGR1cDI7IGRvZXNuJ3QgZXhpc3Qgb24gYWxsIHN5c3RlbXMuICAqLworICBpZiAodHR5ICE9IDApCisgICAgeyBjbG9zZSAoMCk7IGR1cCAodHR5KTsgfQorICBpZiAodHR5ICE9IDEpCisgICAgeyBjbG9zZSAoMSk7IGR1cCAodHR5KTsgfQorICBpZiAodHR5ICE9IDIpCisgICAgeyBjbG9zZSAoMik7IGR1cCAodHR5KTsgfQorICBpZiAodHR5ID4gMikKKyAgICBjbG9zZSh0dHkpOworI2VuZGlmIC8qICFnbzMyICYmICF3aW4zMiovCit9CisMCisvKiBLaWxsIHRoZSBpbmZlcmlvciBwcm9jZXNzLiAgTWFrZSB1cyBoYXZlIG5vIGluZmVyaW9yLiAgKi8KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitraWxsX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICAvKiBGSVhNRTogIFRoaXMgc2hvdWxkIG5vdCByZWFsbHkgYmUgaW5mZXJpb3JfcGlkIChvciB0YXJnZXRfaGFzX2V4ZWN1dGlvbikuCisgICAgIEl0IHNob3VsZCBiZSBhIGRpc3RpbmN0IGZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhIHRhcmdldCBpcyBhY3RpdmUsIGN1egorICAgICBzb21lIHRhcmdldHMgZG9uJ3QgaGF2ZSBwcm9jZXNzZXMhICovCisKKyAgaWYgKGluZmVyaW9yX3BpZCA9PSAwKQorICAgIGVycm9yICgiVGhlIHByb2dyYW0gaXMgbm90IGJlaW5nIHJ1bi4iKTsKKyAgaWYgKCFxdWVyeSAoIktpbGwgdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQ/ICIpKQorICAgIGVycm9yICgiTm90IGNvbmZpcm1lZC4iKTsKKyAgdGFyZ2V0X2tpbGwgKCk7CisKKyAgaW5pdF90aHJlYWRfbGlzdCgpOwkJLyogRGVzdHJveSB0aHJlYWQgaW5mbyAqLworCisgIC8qIEtpbGxpbmcgb2ZmIHRoZSBpbmZlcmlvciBjYW4gbGVhdmUgdXMgd2l0aCBhIGNvcmUgZmlsZS4gIElmIHNvLAorICAgICBwcmludCB0aGUgc3RhdGUgd2UgYXJlIGxlZnQgaW4uICAqLworICBpZiAodGFyZ2V0X2hhc19zdGFjaykgeworICAgIHByaW50Zl9maWx0ZXJlZCAoIkluICVzLFxuIiwgdGFyZ2V0X2xvbmduYW1lKTsKKyAgICBpZiAoc2VsZWN0ZWRfZnJhbWUgPT0gTlVMTCkKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiTm8gc2VsZWN0ZWQgc3RhY2sgZnJhbWUuXG4iLCBnZGJfc3Rkb3V0KTsKKyAgICBlbHNlCisgICAgICBwcmludF9zdGFja19mcmFtZSAoc2VsZWN0ZWRfZnJhbWUsIHNlbGVjdGVkX2ZyYW1lX2xldmVsLCAxKTsKKyAgfQorfQorDAorLyogQ2FsbCBzZXRfc2lnaW50X3RyYXAgd2hlbiB5b3UgbmVlZCB0byBwYXNzIGEgc2lnbmFsIG9uIHRvIGFuIGF0dGFjaGVkCisgICBwcm9jZXNzIHdoZW4gaGFuZGxpbmcgU0lHSU5UICovCisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorcGFzc19zaWduYWwgKHNpZ25vKQorICAgIGludCBzaWdubzsKK3sKKyNpZm5kZWYgX1dJTjMyCisgIGtpbGwgKFBJREdFVCAoaW5mZXJpb3JfcGlkKSwgU0lHSU5UKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCAoKm9zaWcpKCk7CisKK3ZvaWQKK3NldF9zaWdpbnRfdHJhcCgpCit7CisgIGlmIChhdHRhY2hfZmxhZyB8fCBpbmZlcmlvcl90aGlzcnVuX3Rlcm1pbmFsKQorICAgIHsKKyAgICAgIG9zaWcgPSAodm9pZCAoKikgKCkpIHNpZ25hbCAoU0lHSU5ULCBwYXNzX3NpZ25hbCk7CisgICAgfQorfQorCit2b2lkCitjbGVhcl9zaWdpbnRfdHJhcCgpCit7CisgIGlmIChhdHRhY2hfZmxhZyB8fCBpbmZlcmlvcl90aGlzcnVuX3Rlcm1pbmFsKQorICAgIHsKKyAgICAgIHNpZ25hbCAoU0lHSU5ULCBvc2lnKTsKKyAgICB9Cit9CisMCisjaWYgZGVmaW5lZCAoU0lHSU8pICYmIGRlZmluZWQgKEZBU1lOQykgJiYgZGVmaW5lZCAoRkRfU0VUKSAmJiBkZWZpbmVkIChGX1NFVE9XTikKK3N0YXRpYyB2b2lkICgqb2xkX3NpZ2lvKSAoKTsKKworc3RhdGljIHZvaWQKK2hhbmRsZV9zaWdpbyAoc2lnbm8pCisgICAgIGludCBzaWdubzsKK3sKKyAgaW50IG51bWZkczsKKyAgZmRfc2V0IHJlYWRmZHM7CisKKyAgc2lnbmFsIChTSUdJTywgaGFuZGxlX3NpZ2lvKTsKKworICBGRF9aRVJPICgmcmVhZGZkcyk7CisgIEZEX1NFVCAodGFyZ2V0X2FjdGl2aXR5X2ZkLCAmcmVhZGZkcyk7CisgIG51bWZkcyA9IHNlbGVjdCAodGFyZ2V0X2FjdGl2aXR5X2ZkICsgMSwgJnJlYWRmZHMsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAobnVtZmRzID49IDAgJiYgRkRfSVNTRVQgKHRhcmdldF9hY3Rpdml0eV9mZCwgJnJlYWRmZHMpKQorICAgIHsKKyNpZm5kZWYgX1dJTjMyCisgICAgICBpZiAoKCp0YXJnZXRfYWN0aXZpdHlfZnVuY3Rpb24pICgpKQorCWtpbGwgKGluZmVyaW9yX3BpZCwgU0lHSU5UKTsKKyNlbmRpZgorICAgIH0KK30KKworc3RhdGljIGludCBvbGRfZmNudGxfZmxhZ3M7CisKK3ZvaWQKK3NldF9zaWdpb190cmFwICgpCit7CisgIGlmICh0YXJnZXRfYWN0aXZpdHlfZnVuY3Rpb24pCisgICAgeworICAgICAgb2xkX3NpZ2lvID0gKHZvaWQgKCopICgpKSBzaWduYWwgKFNJR0lPLCBoYW5kbGVfc2lnaW8pOworICAgICAgZmNudGwgKHRhcmdldF9hY3Rpdml0eV9mZCwgRl9TRVRPV04sIGdldHBpZCgpKTsgCisgICAgICBvbGRfZmNudGxfZmxhZ3MgPSBmY250bCAodGFyZ2V0X2FjdGl2aXR5X2ZkLCBGX0dFVEZMLCAwKTsKKyAgICAgIGZjbnRsICh0YXJnZXRfYWN0aXZpdHlfZmQsIEZfU0VURkwsIG9sZF9mY250bF9mbGFncyB8IEZBU1lOQyk7CisgICAgfQorfQorCit2b2lkCitjbGVhcl9zaWdpb190cmFwICgpCit7CisgIGlmICh0YXJnZXRfYWN0aXZpdHlfZnVuY3Rpb24pCisgICAgeworICAgICAgc2lnbmFsIChTSUdJTywgb2xkX3NpZ2lvKTsKKyAgICAgIGZjbnRsICh0YXJnZXRfYWN0aXZpdHlfZmQsIEZfU0VURkwsIG9sZF9mY250bF9mbGFncyk7CisgICAgfQorfQorI2Vsc2UgLyogTm8gU0lHSU8uICAqLwordm9pZAorc2V0X3NpZ2lvX3RyYXAgKCkKK3sKKyAgaWYgKHRhcmdldF9hY3Rpdml0eV9mdW5jdGlvbikKKyAgICBhYm9ydCAoKTsKK30KKwordm9pZAorY2xlYXJfc2lnaW9fdHJhcCAoKQoreworICBpZiAodGFyZ2V0X2FjdGl2aXR5X2Z1bmN0aW9uKQorICAgIGFib3J0ICgpOworfQorI2VuZGlmIC8qIE5vIFNJR0lPLiAgKi8KKwwKKworLyogVGhpcyBpcyBoZXJlIGJlY2F1c2UgdGhpcyBpcyB3aGVyZSB3ZSBmaWd1cmUgb3V0IHdoZXRoZXIgd2UgKHByb2JhYmx5KQorICAgaGF2ZSBqb2IgY29udHJvbC4gIEp1c3QgdXNpbmcgam9iX2NvbnRyb2wgb25seSBkb2VzIHBhcnQgb2YgaXQgYmVjYXVzZQorICAgc2V0cGdpZCBvciBzZXRwZ3JwIG1pZ2h0IG5vdCBleGlzdCBvbiBhIHN5c3RlbSB3aXRob3V0IGpvYiBjb250cm9sLgorICAgSXQgbWlnaHQgYmUgY29uc2lkZXJlZCBtaXNwbGFjZWQgKG9uIHRoZSBvdGhlciBoYW5kLCBwcm9jZXNzIGdyb3VwcyBhbmQKKyAgIGpvYiBjb250cm9sIGFyZSBjbG9zZWx5IHJlbGF0ZWQgdG8gdHR5cykuCisKKyAgIEZvciBhIG1vcmUgY2xlYW4gaW1wbGVtZW50YXRpb24sIGluIGxpYmliZXJ0eSwgcHV0IGEgc2V0cGdpZCB3aGljaCBtZXJlbHkKKyAgIGNhbGxzIHNldHBncnAgYW5kIGEgc2V0cGdycCB3aGljaCBkb2VzIG5vdGhpbmcgKGFueSBzeXN0ZW0gd2l0aCBqb2IgY29udHJvbAorICAgd2lsbCBoYXZlIG9uZSBvciB0aGUgb3RoZXIpLiAgKi8KK2ludAorZ2RiX3NldHBnaWQgKCkKK3sKKyAgaW50IHJldHZhbCA9IDA7CisKKyAgaWYgKGpvYl9jb250cm9sKQorICAgIHsKKyNpZiBkZWZpbmVkIChORUVEX1BPU0lYX1NFVFBHSUQpIHx8IChkZWZpbmVkIChIQVZFX1RFUk1JT1MpICYmIGRlZmluZWQgKEhBVkVfU0VUUEdJRCkpCisgICAgICAvKiBzZXRwZ2lkICgwLCAwKSBpcyBzdXBwb3NlZCB0byB3b3JrIGFuZCBtZWFuIHRoZSBzYW1lIHRoaW5nIGFzCisJIHRoaXMsIGJ1dCBvbiBVbHRyaXggNC4yQSBpdCBmYWlscyB3aXRoIEVQRVJNIChhbmQKKwkgc2V0cGdpZCAoZ2V0cGlkICgpLCBnZXRwaWQgKCkpIHN1Y2NlZWRzKS4gICovCisgICAgICByZXR2YWwgPSBzZXRwZ2lkIChnZXRwaWQgKCksIGdldHBpZCAoKSk7CisjZWxzZQorI2lmIGRlZmluZWQgKFRJT0NHUEdSUCkKKyNpZiBkZWZpbmVkKFVTRykgJiYgIWRlZmluZWQoU0VUUEdSUF9BUkdTKQorICAgICAgcmV0dmFsID0gc2V0cGdycCAoKTsKKyNlbHNlCisgICAgICByZXR2YWwgPSBzZXRwZ3JwIChnZXRwaWQgKCksIGdldHBpZCAoKSk7CisjZW5kaWYgLyogVVNHICovCisjZW5kaWYgLyogVElPQ0dQR1JQLiAgKi8KKyNlbmRpZiAvKiBORUVEX1BPU0lYX1NFVFBHSUQgKi8KKyAgICB9CisgIHJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX2luZmxvdyAoKQoreworICBhZGRfaW5mbyAoInRlcm1pbmFsIiwgdGVybV9pbmZvLAorCSAgICJQcmludCBpbmZlcmlvcidzIHNhdmVkIHRlcm1pbmFsIHN0YXR1cy4iKTsKKworICBhZGRfY29tICgia2lsbCIsIGNsYXNzX3J1biwga2lsbF9jb21tYW5kLAorCSAgICJLaWxsIGV4ZWN1dGlvbiBvZiBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkLiIpOworCisgIGluZmVyaW9yX3BpZCA9IDA7CisKKyAgdGVybWluYWxfaXNfb3VycyA9IDE7CisKKyAgLyogT0ssIGZpZ3VyZSBvdXQgd2hldGhlciB3ZSBoYXZlIGpvYiBjb250cm9sLiAgSWYgbmVpdGhlciB0ZXJtaW9zIG5vcgorICAgICBzZ3R0eSAoaS5lLiB0ZXJtaW8gb3IgZ28zMiksIGxlYXZlIGpvYl9jb250cm9sIDAuICAqLworCisjaWYgZGVmaW5lZCAoSEFWRV9URVJNSU9TKQorICAvKiBEbyBhbGwgc3lzdGVtcyB3aXRoIHRlcm1pb3MgaGF2ZSB0aGUgUE9TSVggd2F5IG9mIGlkZW50aWZ5aW5nIGpvYgorICAgICBjb250cm9sPyAgSSBob3BlIHNvLiAgKi8KKyNpZmRlZiBfUE9TSVhfSk9CX0NPTlRST0wKKyAgam9iX2NvbnRyb2wgPSAxOworI2Vsc2UKKyNpZmRlZiBfU0NfSk9CX0NPTlRST0wKKyAgam9iX2NvbnRyb2wgPSBzeXNjb25mIChfU0NfSk9CX0NPTlRST0wpOworI2Vsc2UKKyAgam9iX2NvbnRyb2wgPSAwOwkvKiBoYXZlIHRvIGFzc3VtZSB0aGUgd29yc3QgKi8KKyNlbmRpZgkvKiBfU0NfSk9CX0NPTlRST0wgKi8KKyNlbmRpZgkvKiBfUE9TSVhfSk9CX0NPTlRST0wgKi8KKyNlbmRpZgkvKiBIQVZFX1RFUk1JT1MgKi8KKworI2lmZGVmIEhBVkVfU0dUVFkKKyNpZmRlZiBUSU9DR1BHUlAKKyAgam9iX2NvbnRyb2wgPSAxOworI2Vsc2UKKyAgam9iX2NvbnRyb2wgPSAwOworI2VuZGlmIC8qIFRJT0NHUEdSUCAqLworI2VuZGlmIC8qIHNndHR5ICovCit9CmRpZmYgLS1naXQgYS9nZGIvaW5mcHRyYWNlLmMgYi9nZGIvaW5mcHRyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiNzIyMwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9pbmZwdHJhY2UuYwpAQCAtMCwwICsxLDYzOCBAQAorLyogTG93IGxldmVsIFVuaXggY2hpbGQgaW50ZXJmYWNlIHRvIHB0cmFjZSwgZm9yIEdEQiB3aGVuIHJ1bm5pbmcgdW5kZXIgVW5peC4KKyAgIENvcHlyaWdodCAxOTg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTggCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSAid2FpdC5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKworI2lmZGVmIFVTRworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKyNpZmRlZiBIQVZFX1BUUkFDRV9ICisjIGluY2x1ZGUgPHB0cmFjZS5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TWVNfUFRSQUNFX0gKKyMgIGluY2x1ZGUgPHN5cy9wdHJhY2UuaD4KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKFBUX1JFQURfSSkKKyNkZWZpbmUgUFRfUkVBRF9JCTEJLyogUmVhZCB3b3JkIGZyb20gdGV4dCBzcGFjZSAqLworI2VuZGlmCisjaWYgIWRlZmluZWQgKFBUX1JFQURfRCkKKyNkZWZpbmUJUFRfUkVBRF9ECTIJLyogUmVhZCB3b3JkIGZyb20gZGF0YSBzcGFjZSAqLworI2VuZGlmCisjaWYgIWRlZmluZWQgKFBUX1JFQURfVSkKKyNkZWZpbmUgUFRfUkVBRF9VCTMJLyogUmVhZCB3b3JkIGZyb20ga2VybmVsIHVzZXIgc3RydWN0ICovCisjZW5kaWYKKyNpZiAhZGVmaW5lZCAoUFRfV1JJVEVfSSkKKyNkZWZpbmUgUFRfV1JJVEVfSQk0CS8qIFdyaXRlIHdvcmQgdG8gdGV4dCBzcGFjZSAqLworI2VuZGlmCisjaWYgIWRlZmluZWQgKFBUX1dSSVRFX0QpCisjZGVmaW5lIFBUX1dSSVRFX0QJNQkvKiBXcml0ZSB3b3JkIHRvIGRhdGEgc3BhY2UgKi8KKyNlbmRpZgorI2lmICFkZWZpbmVkIChQVF9XUklURV9VKQorI2RlZmluZSBQVF9XUklURV9VCTYJLyogV3JpdGUgd29yZCB0byBrZXJuZWwgdXNlciBzdHJ1Y3QgKi8KKyNlbmRpZgorI2lmICFkZWZpbmVkIChQVF9DT05USU5VRSkKKyNkZWZpbmUgUFRfQ09OVElOVUUJNwkvKiBDb250aW51ZSBhZnRlciBzaWduYWwgKi8KKyNlbmRpZgorI2lmICFkZWZpbmVkIChQVF9TVEVQKQorI2RlZmluZSBQVF9TVEVQCQk5CS8qIFNldCBmbGFnIGZvciBzaW5nbGUgc3RlcHBpbmcgKi8KKyNlbmRpZgorI2lmICFkZWZpbmVkIChQVF9LSUxMKQorI2RlZmluZSBQVF9LSUxMCQk4CS8qIFNlbmQgY2hpbGQgYSBTSUdLSUxMIHNpZ25hbCAqLworI2VuZGlmCisKKyNpZm5kZWYgUFRfQVRUQUNICisjZGVmaW5lIFBUX0FUVEFDSCBQVFJBQ0VfQVRUQUNICisjZW5kaWYKKyNpZm5kZWYgUFRfREVUQUNICisjZGVmaW5lIFBUX0RFVEFDSCBQVFJBQ0VfREVUQUNICisjZW5kaWYKKworI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpZm5kZWYJTk9fU1lTX0ZJTEUKKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2VuZGlmCisjaWYgMAorLyogRG9uJ3QgdGhpbmsgdGhpcyBpcyB1c2VkIGFueW1vcmUuICBPbiB0aGUgc2VxdWVudCAobm90IHN1cmUgd2hldGhlciBpdCdzCisgICBkeW5peCBvciBwdHggb3IgYm90aCksIGl0IGlzIGluY2x1ZGVkIHVuY29uZGl0aW9uYWxseSBieSBzeXMvdXNlci5oIGFuZAorICAgbm90IHByb3RlY3RlZCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4gICovCisjaW5jbHVkZSAiZ2RiX3N0YXQuaCIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUykKKyNpbmNsdWRlIDxzeXMvdXNlci5oPgkJLyogUHJvYmFibHkgbmVlZCB0byBwb2tlIHRoZSB1c2VyIHN0cnVjdHVyZSAqLworI2lmIGRlZmluZWQgKEtFUk5FTF9VX0FERFJfQlNEKQorI2luY2x1ZGUgPGEub3V0Lmg+CQkvKiBGb3Igc3RydWN0IG5saXN0ICovCisjZW5kaWYgLyogS0VSTkVMX1VfQUREUl9CU0QuICAqLworI2VuZGlmIC8qICFGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMgKi8KKworI2lmICFkZWZpbmVkIChDSElMRF9YRkVSX01FTU9SWSkKK3N0YXRpYyB2b2lkIHVkb3RfaW5mbyBQQVJBTVMgKChjaGFyICosIGludCkpOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoRkVUQ0hfSU5GRVJJT1JfUkVHSVNURVJTKQorc3RhdGljIHZvaWQgZmV0Y2hfcmVnaXN0ZXIgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdm9pZCBzdG9yZV9yZWdpc3RlciBQQVJBTVMgKChpbnQpKTsKKyNlbmRpZgorCit2b2lkIF9pbml0aWFsaXplX2tlcm5lbF91X2FkZHIgUEFSQU1TICgodm9pZCkpOwordm9pZCBfaW5pdGlhbGl6ZV9pbmZwdHJhY2UgUEFSQU1TICgodm9pZCkpOworCisMCisvKiBUaGlzIGZ1bmN0aW9uIHNpbXBseSBjYWxscyBwdHJhY2Ugd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiAgCisgICBJdCBleGlzdHMgc28gdGhhdCBhbGwgY2FsbHMgdG8gcHRyYWNlIGFyZSBpc29sYXRlZCBpbiB0aGlzIAorICAgbWFjaGluZS1kZXBlbmRlbnQgZmlsZS4gKi8KK2ludAorY2FsbF9wdHJhY2UgKHJlcXVlc3QsIHBpZCwgYWRkciwgZGF0YSkKKyAgICAgaW50IHJlcXVlc3QsIHBpZDsKKyAgICAgUFRSQUNFX0FSRzNfVFlQRSBhZGRyOworICAgICBpbnQgZGF0YTsKK3sKKyAgaW50IHB0X3N0YXR1cyA9IDA7CisKKyNpZiAwCisgIGludCBzYXZlZF9lcnJubzsKKworICBwcmludGYgKCJjYWxsX3B0cmFjZShyZXF1ZXN0PSVkLCBwaWQ9JWQsIGFkZHI9MHgleCwgZGF0YT0weCV4KSIsCisJICByZXF1ZXN0LCBwaWQsIGFkZHIsIGRhdGEpOworI2VuZGlmCisjaWYgZGVmaW5lZChQVF9TRVRUUkMpCisgIC8qIElmIHRoZSBwYXJlbnQgY2FuIGJlIHRvbGQgdG8gYXR0YWNoIHRvIHVzLCB0cnkgdG8gZG8gaXQuICAqLworICBpZiAocmVxdWVzdCA9PSBQVF9TRVRUUkMpIHsKKyAgICBlcnJubyA9IDA7CisgICAgcHRfc3RhdHVzID0gcHRyYWNlIChQVF9TRVRUUkMsIHBpZCwgYWRkciwgZGF0YQorI2lmIGRlZmluZWQgKEZJVkVfQVJHX1BUUkFDRSkKKyAgICAgICAgICAgICAgICAgICAgICAgLyogRGVhbCB3aXRoIEhQVVggOC4wIGJyYWluZGFtYWdlLiAgV2UgbmV2ZXIgdXNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxscyB3aGljaCByZXF1aXJlIHRoZSBmaWZ0aCBhcmd1bWVudC4gICovCisgICAgICAgICAgICAgICAgICAgICAgICwgMAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgaWYgKGVycm5vKSBwZXJyb3Jfd2l0aF9uYW1lICgicHRyYWNlIik7CisjaWYgMAorICAgICBwcmludGYgKCIgPSAlZFxuIiwgcHRfc3RhdHVzKTsKKyNlbmRpZgorICAgICBpZiAocHRfc3RhdHVzIDwgMCkKKyAgICAgICAgIHJldHVybiBwdF9zdGF0dXM7CisgICAgIGVsc2UKKyAgICAgICAgIHJldHVybiBwYXJlbnRfYXR0YWNoX2FsbCAocGlkLCBhZGRyLCBkYXRhKTsKKyAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBUX0NPTlRJTjEpCisgIC8qIE9uIEhQVVgsIFBUX0NPTlRJTjEgaXMgYSBmb3JtIG9mIGNvbnRpbnVlIHRoYXQgcHJlc2VydmVzIHBlbmRpbmcKKyAgICAgc2lnbmFscy4gIElmIGl0J3MgYXZhaWxhYmxlLCB1c2UgaXQuICAqLworICBpZiAocmVxdWVzdCA9PSBQVF9DT05USU5VRSkKKyAgICByZXF1ZXN0ID0gUFRfQ09OVElOMTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQVF9TSU5HTEUxKQorICAvKiBPbiBIUFVYLCBQVF9TSU5HTEUxIGlzIGEgZm9ybSBvZiBzdGVwIHRoYXQgcHJlc2VydmVzIHBlbmRpbmcKKyAgICAgc2lnbmFscy4gIElmIGl0J3MgYXZhaWxhYmxlLCB1c2UgaXQuICAqLworICBpZiAocmVxdWVzdCA9PSBQVF9TVEVQKQorICAgIHJlcXVlc3QgPSBQVF9TSU5HTEUxOworI2VuZGlmCisKKyNpZiAwCisgIHNhdmVkX2Vycm5vID0gZXJybm87CisgIGVycm5vID0gMDsKKyNlbmRpZgorICBwdF9zdGF0dXMgPSBwdHJhY2UgKHJlcXVlc3QsIHBpZCwgYWRkciwgZGF0YQorI2lmIGRlZmluZWQgKEZJVkVfQVJHX1BUUkFDRSkKKwkJIC8qIERlYWwgd2l0aCBIUFVYIDguMCBicmFpbmRhbWFnZS4gIFdlIG5ldmVyIHVzZSB0aGUKKwkJICAgIGNhbGxzIHdoaWNoIHJlcXVpcmUgdGhlIGZpZnRoIGFyZ3VtZW50LiAgKi8KKwkJICwgMAorI2VuZGlmCisJCSApOworI2lmIDAKKyAgaWYgKGVycm5vKQorICAgIHByaW50ZiAoIiBbZXJybm8gPSAlZF0iLCBlcnJubyk7CisKKyAgZXJybm8gPSBzYXZlZF9lcnJubzsKKyAgcHJpbnRmICgiID0gMHgleFxuIiwgcHRfc3RhdHVzKTsKKyNlbmRpZgorICByZXR1cm4gcHRfc3RhdHVzOworfQorCisKKyNpZiBkZWZpbmVkIChERUJVR19QVFJBQ0UpIHx8IGRlZmluZWQgKEZJVkVfQVJHX1BUUkFDRSkKKy8qIEZvciB0aGUgcmVzdCBvZiB0aGUgZmlsZSwgdXNlIGFuIGV4dHJhIGxldmVsIG9mIGluZGlyZWN0aW9uICovCisvKiBUaGlzIGxldHMgdXMgYnJlYWtwb2ludCB1c2VmdWxseSBvbiBjYWxsX3B0cmFjZS4gKi8KKyNkZWZpbmUgcHRyYWNlIGNhbGxfcHRyYWNlCisjZW5kaWYKKworLyogV2FpdCBmb3IgYSBwcm9jZXNzIHRvIGZpbmlzaCwgcG9zc2libHkgcnVubmluZyBhIHRhcmdldC1zcGVjaWZpYworICAgaG9vayBiZWZvcmUgcmV0dXJuaW5nLiAgKi8KKworaW50CitwdHJhY2Vfd2FpdCAocGlkLCBzdGF0dXMpCisgICAgaW50IHBpZDsKKyAgICBpbnQgKnN0YXR1czsKK3sKKyAgaW50IHdzdGF0ZTsKKworICB3c3RhdGUgPSB3YWl0IChzdGF0dXMpOworICB0YXJnZXRfcG9zdF93YWl0ICh3c3RhdGUsICpzdGF0dXMpOworICByZXR1cm4gd3N0YXRlOworfQorCit2b2lkCitraWxsX2luZmVyaW9yICgpCit7CisgIGludCBzdGF0dXM7CisKKyAgaWYgKGluZmVyaW9yX3BpZCA9PSAwKQorICAgIHJldHVybjsKKworICAvKiBUaGlzIG9uY2UgdXNlZCB0byBjYWxsICJraWxsIiB0byBraWxsIHRoZSBpbmZlcmlvciBqdXN0IGluIGNhc2UKKyAgICAgdGhlIGluZmVyaW9yIHdhcyBzdGlsbCBydW5uaW5nLiAgQXMgb3RoZXJzIGhhdmUgbm90ZWQgaW4gdGhlIHBhc3QKKyAgICAgKGtpbmdkb24pIHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgd2F5IHRvIGdldCBoZXJlIGlmIHRoZSBpbmZlcmlvcgorICAgICBpcyBzdGlsbCBydW5uaW5nIC0tIGVsc2UgdGhlcmUncyBhIG1ham9yIHByb2JsZW0gZWxzZXdlcmUgaW4gZ2RiCisgICAgIGFuZCBpdCBuZWVkcyB0byBiZSBmaXhlZC4KKworICAgICBUaGUga2lsbCBjYWxsIGNhdXNlcyBwcm9ibGVtcyB1bmRlciBocHV4MTAsIHNvIGl0J3MgYmVlbiByZW1vdmVkOworICAgICBpZiB0aGlzIGNhdXNlcyBwcm9ibGVtcyB3ZSdsbCBkZWFsIHdpdGggdGhlbSBhcyB0aGV5IGFyaXNlLiAgKi8KKyAgcHRyYWNlIChQVF9LSUxMLCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSAwLCAwKTsKKyAgcHRyYWNlX3dhaXQgKDAsICZzdGF0dXMpOworICB0YXJnZXRfbW91cm5faW5mZXJpb3IgKCk7Cit9CisKKyNpZm5kZWYgQ0hJTERfUkVTVU1FCisKKy8qIFJlc3VtZSBleGVjdXRpb24gb2YgdGhlIGluZmVyaW9yIHByb2Nlc3MuCisgICBJZiBTVEVQIGlzIG5vbnplcm8sIHNpbmdsZS1zdGVwIGl0LgorICAgSWYgU0lHTkFMIGlzIG5vbnplcm8sIGdpdmUgaXQgdGhhdCBzaWduYWwuICAqLworCit2b2lkCitjaGlsZF9yZXN1bWUgKHBpZCwgc3RlcCwgc2lnbmFsKQorICAgICBpbnQgcGlkOworICAgICBpbnQgc3RlcDsKKyAgICAgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ25hbDsKK3sKKyAgZXJybm8gPSAwOworCisgIGlmIChwaWQgPT0gLTEpCisgICAgLyogUmVzdW1lIGFsbCB0aHJlYWRzLiAgKi8KKyAgICAvKiBJIHRoaW5rIHRoaXMgb25seSBnZXRzIHVzZWQgaW4gdGhlIG5vbi10aHJlYWRlZCBjYXNlLCB3aGVyZSAicmVzdW1lCisgICAgICAgYWxsIHRocmVhZHMiIGFuZCAicmVzdW1lIGluZmVyaW9yX3BpZCIgYXJlIHRoZSBzYW1lLiAgKi8KKyAgICBwaWQgPSBpbmZlcmlvcl9waWQ7CisKKyAgLyogQW4gYWRkcmVzcyBvZiAoUFRSQUNFX0FSRzNfVFlQRSkxIHRlbGxzIHB0cmFjZSB0byBjb250aW51ZSBmcm9tIHdoZXJlCisgICAgIGl0IHdhcy4gIChJZiBHREIgd2FudGVkIGl0IHRvIHN0YXJ0IHNvbWUgb3RoZXIgd2F5LCB3ZSBoYXZlIGFscmVhZHkKKyAgICAgd3JpdHRlbiBhIG5ldyBQQyB2YWx1ZSB0byB0aGUgY2hpbGQuKQorCisgICAgIElmIHRoaXMgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUFRfU1RFUCwgYSBoaWdoZXIgbGV2ZWwgZnVuY3Rpb24gd2lsbAorICAgICBoYXZlIGNhbGxlZCBzaW5nbGVfc3RlcCgpIHRvIHRyYW5zbXV0ZSB0aGUgc3RlcCByZXF1ZXN0IGludG8gYQorICAgICBjb250aW51ZSByZXF1ZXN0IChieSBzZXR0aW5nIGJyZWFrcG9pbnRzIG9uIGFsbCBwb3NzaWJsZSBzdWNjZXNzb3IKKyAgICAgaW5zdHJ1Y3Rpb25zKSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGF0IGhlcmUuICAqLworCisgIGlmIChzdGVwKQorICAgIHsKKyAgICAgIGlmIChTT0ZUV0FSRV9TSU5HTEVfU1RFUF9QKQorCWFib3J0KCk7ICAvKiBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGhhcHBlbi4gKi8KKyAgICAgIGVsc2UKKwlwdHJhY2UgKFBUX1NURVAsICAgICBwaWQsIChQVFJBQ0VfQVJHM19UWVBFKSAxLAorCQl0YXJnZXRfc2lnbmFsX3RvX2hvc3QgKHNpZ25hbCkpOworICAgIH0KKyAgZWxzZQorICAgIHB0cmFjZSAoUFRfQ09OVElOVUUsIHBpZCwgKFBUUkFDRV9BUkczX1RZUEUpIDEsCisJICAgIHRhcmdldF9zaWduYWxfdG9faG9zdCAoc2lnbmFsKSk7CisKKyAgaWYgKGVycm5vKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJwdHJhY2UiKTsKK30KKyNlbmRpZiAvKiBDSElMRF9SRVNVTUUgKi8KKworDAorI2lmZGVmIEFUVEFDSF9ERVRBQ0gKKy8qIFN0YXJ0IGRlYnVnZ2luZyB0aGUgcHJvY2VzcyB3aG9zZSBudW1iZXIgaXMgUElELiAgKi8KK2ludAorYXR0YWNoIChwaWQpCisgICAgIGludCBwaWQ7Cit7CisgIGVycm5vID0gMDsKKyAgcHRyYWNlIChQVF9BVFRBQ0gsIHBpZCwgKFBUUkFDRV9BUkczX1RZUEUpIDAsIDApOworICBpZiAoZXJybm8pCisgICAgcGVycm9yX3dpdGhfbmFtZSAoInB0cmFjZSIpOworICBhdHRhY2hfZmxhZyA9IDE7CisgIHJldHVybiBwaWQ7Cit9CisKKy8qIFN0b3AgZGVidWdnaW5nIHRoZSBwcm9jZXNzIHdob3NlIG51bWJlciBpcyBQSUQKKyAgIGFuZCBjb250aW51ZSBpdCB3aXRoIHNpZ25hbCBudW1iZXIgU0lHTkFMLgorICAgU0lHTkFMID0gMCBtZWFucyBqdXN0IGNvbnRpbnVlIGl0LiAgKi8KKwordm9pZAorZGV0YWNoIChzaWduYWwpCisgICAgIGludCBzaWduYWw7Cit7CisgIGVycm5vID0gMDsKKyAgcHRyYWNlIChQVF9ERVRBQ0gsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIDEsIHNpZ25hbCk7CisgIGlmIChlcnJubykKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgicHRyYWNlIik7CisgIGF0dGFjaF9mbGFnID0gMDsKK30KKyNlbmRpZiAvKiBBVFRBQ0hfREVUQUNIICovCisMCisvKiBEZWZhdWx0IHRoZSB0eXBlIG9mIHRoZSBwdHJhY2UgdHJhbnNmZXIgdG8gaW50LiAgKi8KKyNpZm5kZWYgUFRSQUNFX1hGRVJfVFlQRQorI2RlZmluZSBQVFJBQ0VfWEZFUl9UWVBFIGludAorI2VuZGlmCisKKy8qIEtFUk5FTF9VX0FERFIgaXMgdGhlIGFtb3VudCB0byBzdWJ0cmFjdCBmcm9tIHUudV9hcjAKKyAgIHRvIGdldCB0aGUgb2Zmc2V0IGluIHRoZSBjb3JlIGZpbGUgb2YgdGhlIHJlZ2lzdGVyIHZhbHVlcy4gICovCisjaWYgZGVmaW5lZCAoS0VSTkVMX1VfQUREUl9CU0QpICYmICFkZWZpbmVkIChGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMpCisvKiBHZXQga2VybmVsX3VfYWRkciB1c2luZyBCU0Qtc3R5bGUgbmxpc3QoKS4gICovCitDT1JFX0FERFIga2VybmVsX3VfYWRkcjsKKyNlbmRpZiAvKiBLRVJORUxfVV9BRERSX0JTRC4gICovCisKK3ZvaWQKK19pbml0aWFsaXplX2tlcm5lbF91X2FkZHIgKCkKK3sKKyNpZiBkZWZpbmVkIChLRVJORUxfVV9BRERSX0JTRCkgJiYgIWRlZmluZWQgKEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUykKKyAgc3RydWN0IG5saXN0IG5hbWVzWzJdOworCisgIG5hbWVzWzBdLm5fdW4ubl9uYW1lID0gIl91IjsKKyAgbmFtZXNbMV0ubl91bi5uX25hbWUgPSBOVUxMOworICBpZiAobmxpc3QgKCIvdm11bml4IiwgbmFtZXMpID09IDApCisgICAga2VybmVsX3VfYWRkciA9IG5hbWVzWzBdLm5fdmFsdWU7CisgIGVsc2UKKyAgICBmYXRhbCAoIlVuYWJsZSB0byBnZXQga2VybmVsIHUgYXJlYSBhZGRyZXNzLiIpOworI2VuZGlmIC8qIEtFUk5FTF9VX0FERFJfQlNELiAgKi8KK30KKworI2lmICFkZWZpbmVkIChGRVRDSF9JTkZFUklPUl9SRUdJU1RFUlMpCisKKyNpZiAhZGVmaW5lZCAob2Zmc2V0b2YpCisjZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgKCh1bnNpZ25lZCBsb25nKSAmKChUWVBFICopMCktPk1FTUJFUikKKyNlbmRpZgorCisvKiBVX1JFR1NfT0ZGU0VUIGlzIHRoZSBvZmZzZXQgb2YgdGhlIHJlZ2lzdGVycyB3aXRoaW4gdGhlIHUgYXJlYS4gICovCisjaWYgIWRlZmluZWQgKFVfUkVHU19PRkZTRVQpCisjZGVmaW5lIFVfUkVHU19PRkZTRVQgXAorICBwdHJhY2UgKFBUX1JFQURfVSwgaW5mZXJpb3JfcGlkLCBcCisJICAoUFRSQUNFX0FSRzNfVFlQRSkgKG9mZnNldG9mIChzdHJ1Y3QgdXNlciwgdV9hcjApKSwgMCkgXAorICAgIC0gS0VSTkVMX1VfQUREUgorI2VuZGlmCisKKy8qIFJlZ2lzdGVycyB3ZSBzaG91bGRuJ3QgdHJ5IHRvIGZldGNoLiAgKi8KKyNpZiAhZGVmaW5lZCAoQ0FOTk9UX0ZFVENIX1JFR0lTVEVSKQorI2RlZmluZSBDQU5OT1RfRkVUQ0hfUkVHSVNURVIocmVnbm8pIDAKKyNlbmRpZgorCisvKiBGZXRjaCBvbmUgcmVnaXN0ZXIuICAqLworCitzdGF0aWMgdm9pZAorZmV0Y2hfcmVnaXN0ZXIgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIC8qIFRoaXMgaXNuJ3QgcmVhbGx5IGFuIGFkZHJlc3MuICBCdXQgcHRyYWNlIHRoaW5rcyBvZiBpdCBhcyBvbmUuICAqLworICBDT1JFX0FERFIgcmVnYWRkcjsKKyAgY2hhciBtZXNzWzEyOF07CQkJCS8qIEZvciBtZXNzYWdlcyAqLworICByZWdpc3RlciBpbnQgaTsKKyAgdW5zaWduZWQgaW50IG9mZnNldDsgIC8qIE9mZnNldCBvZiByZWdpc3RlcnMgd2l0aGluIHRoZSB1IGFyZWEuICAqLworICBjaGFyIGJ1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworCisgIGlmIChDQU5OT1RfRkVUQ0hfUkVHSVNURVIgKHJlZ25vKSkKKyAgICB7CisgICAgICBtZW1zZXQgKGJ1ZiwgJ1wwJywgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ25vKSk7CS8qIFN1cHBseSB6ZXJvZXMgKi8KKyAgICAgIHN1cHBseV9yZWdpc3RlciAocmVnbm8sIGJ1Zik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIG9mZnNldCA9IFVfUkVHU19PRkZTRVQ7CisKKyAgcmVnYWRkciA9IHJlZ2lzdGVyX2FkZHIgKHJlZ25vLCBvZmZzZXQpOworICBmb3IgKGkgPSAwOyBpIDwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ25vKTsgaSArPSBzaXplb2YgKFBUUkFDRV9YRkVSX1RZUEUpKQorICAgIHsKKyAgICAgIGVycm5vID0gMDsKKyAgICAgICooUFRSQUNFX1hGRVJfVFlQRSAqKSAmYnVmW2ldID0gcHRyYWNlIChQVF9SRUFEX1UsIGluZmVyaW9yX3BpZCwKKwkJCQkJICAgICAgKFBUUkFDRV9BUkczX1RZUEUpIHJlZ2FkZHIsIDApOworICAgICAgcmVnYWRkciArPSBzaXplb2YgKFBUUkFDRV9YRkVSX1RZUEUpOworICAgICAgaWYgKGVycm5vICE9IDApCisJeworCSAgc3ByaW50ZiAobWVzcywgInJlYWRpbmcgcmVnaXN0ZXIgJXMgKCMlZCkiLCBSRUdJU1RFUl9OQU1FIChyZWdubyksIHJlZ25vKTsKKwkgIHBlcnJvcl93aXRoX25hbWUgKG1lc3MpOworCX0KKyAgICB9CisgIHN1cHBseV9yZWdpc3RlciAocmVnbm8sIGJ1Zik7Cit9CisKKworLyogRmV0Y2ggcmVnaXN0ZXIgdmFsdWVzIGZyb20gdGhlIGluZmVyaW9yLgorICAgSWYgUkVHTk8gaXMgbmVnYXRpdmUsIGRvIHRoaXMgZm9yIGFsbCByZWdpc3RlcnMuCisgICBPdGhlcndpc2UsIFJFR05PIHNwZWNpZmllcyB3aGljaCByZWdpc3RlciAoc28gd2UgY2FuIHNhdmUgdGltZSkuICovCisKK3ZvaWQKK2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgaWYgKHJlZ25vID49IDApCisgICAgeworICAgICAgZmV0Y2hfcmVnaXN0ZXIgKHJlZ25vKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCBBUkNIX05VTV9SRUdTOyByZWdubysrKQorCXsKKwkgIGZldGNoX3JlZ2lzdGVyIChyZWdubyk7CisJfQorICAgIH0KK30KKworLyogUmVnaXN0ZXJzIHdlIHNob3VsZG4ndCB0cnkgdG8gc3RvcmUuICAqLworI2lmICFkZWZpbmVkIChDQU5OT1RfU1RPUkVfUkVHSVNURVIpCisjZGVmaW5lIENBTk5PVF9TVE9SRV9SRUdJU1RFUihyZWdubykgMAorI2VuZGlmCisKKy8qIFN0b3JlIG9uZSByZWdpc3Rlci4gKi8KKworc3RhdGljIHZvaWQKK3N0b3JlX3JlZ2lzdGVyIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICAvKiBUaGlzIGlzbid0IHJlYWxseSBhbiBhZGRyZXNzLiAgQnV0IHB0cmFjZSB0aGlua3Mgb2YgaXQgYXMgb25lLiAgKi8KKyAgQ09SRV9BRERSIHJlZ2FkZHI7CisgIGNoYXIgbWVzc1sxMjhdOwkJCQkvKiBGb3IgbWVzc2FnZXMgKi8KKyAgcmVnaXN0ZXIgaW50IGk7CisgIHVuc2lnbmVkIGludCBvZmZzZXQ7ICAvKiBPZmZzZXQgb2YgcmVnaXN0ZXJzIHdpdGhpbiB0aGUgdSBhcmVhLiAgKi8KKworICBpZiAoQ0FOTk9UX1NUT1JFX1JFR0lTVEVSIChyZWdubykpCisgICAgeworICAgICAgcmV0dXJuOworICAgIH0KKworICBvZmZzZXQgPSBVX1JFR1NfT0ZGU0VUOworCisgIHJlZ2FkZHIgPSByZWdpc3Rlcl9hZGRyIChyZWdubywgb2Zmc2V0KTsKKyAgZm9yIChpID0gMDsgaSA8IFJFR0lTVEVSX1JBV19TSVpFIChyZWdubyk7IGkgKz0gc2l6ZW9mKFBUUkFDRV9YRkVSX1RZUEUpKQorICAgIHsKKyAgICAgIGVycm5vID0gMDsKKyAgICAgIHB0cmFjZSAoUFRfV1JJVEVfVSwgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnYWRkciwKKwkgICAgICAqKFBUUkFDRV9YRkVSX1RZUEUgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdubykgKyBpXSk7CisgICAgICByZWdhZGRyICs9IHNpemVvZiAoUFRSQUNFX1hGRVJfVFlQRSk7CisgICAgICBpZiAoZXJybm8gIT0gMCkKKwl7CisJICBzcHJpbnRmIChtZXNzLCAid3JpdGluZyByZWdpc3RlciAlcyAoIyVkKSIsIFJFR0lTVEVSX05BTUUgKHJlZ25vKSwgcmVnbm8pOworCSAgcGVycm9yX3dpdGhfbmFtZSAobWVzcyk7CisJfQorICAgIH0KK30KKworLyogU3RvcmUgb3VyIHJlZ2lzdGVyIHZhbHVlcyBiYWNrIGludG8gdGhlIGluZmVyaW9yLgorICAgSWYgUkVHTk8gaXMgbmVnYXRpdmUsIGRvIHRoaXMgZm9yIGFsbCByZWdpc3RlcnMuCisgICBPdGhlcndpc2UsIFJFR05PIHNwZWNpZmllcyB3aGljaCByZWdpc3RlciAoc28gd2UgY2FuIHNhdmUgdGltZSkuICAqLworCit2b2lkCitzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGlmIChyZWdubyA+PSAwKQorICAgIHsKKyAgICAgIHN0b3JlX3JlZ2lzdGVyIChyZWdubyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgQVJDSF9OVU1fUkVHUzsgcmVnbm8rKykKKwl7CisJICBzdG9yZV9yZWdpc3RlciAocmVnbm8pOworCX0KKyAgICB9Cit9CisjZW5kaWYgLyogIWRlZmluZWQgKEZFVENIX0lORkVSSU9SX1JFR0lTVEVSUykuICAqLworDAorCisjaWYgIWRlZmluZWQgKENISUxEX1hGRVJfTUVNT1JZKQorLyogTk9URSEgSSB0cmllZCB1c2luZyBQVFJBQ0VfUkVBRERBVEEsIGV0Yy4sIHRvIHJlYWQgYW5kIHdyaXRlIG1lbW9yeQorICAgaW4gdGhlIE5FV19TVU5fUFRSQUNFIGNhc2UuCisgICBJdCBvdWdodCB0byBiZSBzdHJhaWdodGZvcndhcmQuICBCdXQgaXQgYXBwZWFycyB0aGF0IHdyaXRpbmcgZGlkCisgICBub3Qgd3JpdGUgdGhlIGRhdGEgdGhhdCBJIHNwZWNpZmllZC4gIEkgY2Fubm90IHVuZGVyc3RhbmQgd2hlcmUKKyAgIGl0IGdvdCB0aGUgZGF0YSB0aGF0IGl0IGFjdHVhbGx5IGRpZCB3cml0ZS4gICovCisKKy8qIENvcHkgTEVOIGJ5dGVzIHRvIG9yIGZyb20gaW5mZXJpb3IncyBtZW1vcnkgc3RhcnRpbmcgYXQgTUVNQUREUgorICAgdG8gZGVidWdnZXIgbWVtb3J5IHN0YXJ0aW5nIGF0IE1ZQUREUi4gICBDb3B5IHRvIGluZmVyaW9yIGlmCisgICBXUklURSBpcyBub256ZXJvLgorICAKKyAgIFJldHVybnMgdGhlIGxlbmd0aCBjb3BpZWQsIHdoaWNoIGlzIGVpdGhlciB0aGUgTEVOIGFyZ3VtZW50IG9yIHplcm8uCisgICBUaGlzIHhmZXIgZnVuY3Rpb24gZG9lcyBub3QgZG8gcGFydGlhbCBtb3Zlcywgc2luY2UgY2hpbGRfb3BzCisgICBkb2Vzbid0IGFsbG93IG1lbW9yeSBvcGVyYXRpb25zIHRvIGNyb3NzIGJlbG93IHVzIGluIHRoZSB0YXJnZXQgc3RhY2sKKyAgIGFueXdheS4gICovCisKK2ludAorY2hpbGRfeGZlcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuLCB3cml0ZSwgdGFyZ2V0KQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworICAgICBpbnQgd3JpdGU7CisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQ7CQkvKiBpZ25vcmVkICovCit7CisgIHJlZ2lzdGVyIGludCBpOworICAvKiBSb3VuZCBzdGFydGluZyBhZGRyZXNzIGRvd24gdG8gbG9uZ3dvcmQgYm91bmRhcnkuICAqLworICByZWdpc3RlciBDT1JFX0FERFIgYWRkciA9IG1lbWFkZHIgJiAtIHNpemVvZiAoUFRSQUNFX1hGRVJfVFlQRSk7CisgIC8qIFJvdW5kIGVuZGluZyBhZGRyZXNzIHVwOyBnZXQgbnVtYmVyIG9mIGxvbmd3b3JkcyB0aGF0IG1ha2VzLiAgKi8KKyAgcmVnaXN0ZXIgaW50IGNvdW50CisgICAgPSAoKChtZW1hZGRyICsgbGVuKSAtIGFkZHIpICsgc2l6ZW9mIChQVFJBQ0VfWEZFUl9UWVBFKSAtIDEpCisgICAgICAvIHNpemVvZiAoUFRSQUNFX1hGRVJfVFlQRSk7CisgIC8qIEFsbG9jYXRlIGJ1ZmZlciBvZiB0aGF0IG1hbnkgbG9uZ3dvcmRzLiAgKi8KKyAgcmVnaXN0ZXIgUFRSQUNFX1hGRVJfVFlQRSAqYnVmZmVyCisgICAgPSAoUFRSQUNFX1hGRVJfVFlQRSAqKSBhbGxvY2EgKGNvdW50ICogc2l6ZW9mIChQVFJBQ0VfWEZFUl9UWVBFKSk7CisKKyAgaWYgKHdyaXRlKQorICAgIHsKKyAgICAgIC8qIEZpbGwgc3RhcnQgYW5kIGVuZCBleHRyYSBieXRlcyBvZiBidWZmZXIgd2l0aCBleGlzdGluZyBtZW1vcnkgZGF0YS4gICovCisKKyAgICAgIGlmIChhZGRyICE9IG1lbWFkZHIgfHwgbGVuIDwgKGludCkgc2l6ZW9mIChQVFJBQ0VfWEZFUl9UWVBFKSkgeworCS8qIE5lZWQgcGFydCBvZiBpbml0aWFsIHdvcmQgLS0gZmV0Y2ggaXQuICAqLworICAgICAgICBidWZmZXJbMF0gPSBwdHJhY2UgKFBUX1JFQURfSSwgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgYWRkciwKKwkJCSAgICAwKTsKKyAgICAgIH0KKworICAgICAgaWYgKGNvdW50ID4gMSkJCS8qIEZJWE1FLCBhdm9pZCBpZiBldmVuIGJvdW5kYXJ5ICovCisJeworCSAgYnVmZmVyW2NvdW50IC0gMV0KKwkgICAgPSBwdHJhY2UgKFBUX1JFQURfSSwgaW5mZXJpb3JfcGlkLAorCQkgICAgICAoKFBUUkFDRV9BUkczX1RZUEUpCisJCSAgICAgICAoYWRkciArIChjb3VudCAtIDEpICogc2l6ZW9mIChQVFJBQ0VfWEZFUl9UWVBFKSkpLAorCQkgICAgICAwKTsKKwl9CisKKyAgICAgIC8qIENvcHkgZGF0YSB0byBiZSB3cml0dGVuIG92ZXIgY29ycmVzcG9uZGluZyBwYXJ0IG9mIGJ1ZmZlciAqLworCisgICAgICBtZW1jcHkgKChjaGFyICopIGJ1ZmZlciArIChtZW1hZGRyICYgKHNpemVvZiAoUFRSQUNFX1hGRVJfVFlQRSkgLSAxKSksCisJICAgICAgbXlhZGRyLAorCSAgICAgIGxlbik7CisKKyAgICAgIC8qIFdyaXRlIHRoZSBlbnRpcmUgYnVmZmVyLiAgKi8KKworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIGFkZHIgKz0gc2l6ZW9mIChQVFJBQ0VfWEZFUl9UWVBFKSkKKwl7CisJICBlcnJubyA9IDA7CisJICBwdHJhY2UgKFBUX1dSSVRFX0QsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIGFkZHIsCisJCSAgYnVmZmVyW2ldKTsKKwkgIGlmIChlcnJubykKKyAgICAgICAgICAgIHsKKwkgICAgICAvKiBVc2luZyB0aGUgYXBwcm9wcmlhdGUgb25lIChJIG9yIEQpIGlzIG5lY2Vzc2FyeSBmb3IKKwkJIEdvdWxkIE5QMSwgYXQgbGVhc3QuICAqLworCSAgICAgIGVycm5vID0gMDsKKwkgICAgICBwdHJhY2UgKFBUX1dSSVRFX0ksIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIGFkZHIsCisJCSAgICAgIGJ1ZmZlcltpXSk7CisJICAgIH0KKwkgIGlmIChlcnJubykKKwkgICAgcmV0dXJuIDA7CisJfQorI2lmZGVmIENMRUFSX0lOU05fQ0FDSEUKKyAgICAgIENMRUFSX0lOU05fQ0FDSEUoKTsKKyNlbmRpZgorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFJlYWQgYWxsIHRoZSBsb25nd29yZHMgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBhZGRyICs9IHNpemVvZiAoUFRSQUNFX1hGRVJfVFlQRSkpCisJeworCSAgZXJybm8gPSAwOworCSAgYnVmZmVyW2ldID0gcHRyYWNlIChQVF9SRUFEX0ksIGluZmVyaW9yX3BpZCwKKwkJCSAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSBhZGRyLCAwKTsKKwkgIGlmIChlcnJubykKKwkgICAgcmV0dXJuIDA7CisJICBRVUlUOworCX0KKworICAgICAgLyogQ29weSBhcHByb3ByaWF0ZSBieXRlcyBvdXQgb2YgdGhlIGJ1ZmZlci4gICovCisgICAgICBtZW1jcHkgKG15YWRkciwKKwkgICAgICAoY2hhciAqKSBidWZmZXIgKyAobWVtYWRkciAmIChzaXplb2YgKFBUUkFDRV9YRkVSX1RZUEUpIC0gMSkpLAorCSAgICAgIGxlbik7CisgICAgfQorICByZXR1cm4gbGVuOworfQorCisMCitzdGF0aWMgdm9pZAordWRvdF9pbmZvIChkdW1teTEsIGR1bW15MikKKyAgICAgY2hhciAqZHVtbXkxOworICAgICBpbnQgZHVtbXkyOworeworI2lmIGRlZmluZWQgKEtFUk5FTF9VX1NJWkUpCisgIGludCB1ZG90X29mZjsJCS8qIE9mZnNldCBpbnRvIHVzZXIgc3RydWN0ICovCisgIGludCB1ZG90X3ZhbDsJCS8qIFZhbHVlIGZyb20gdXNlciBzdHJ1Y3QgYXQgdWRvdF9vZmYgKi8KKyAgY2hhciBtZXNzWzEyOF07CS8qIEZvciBtZXNzYWdlcyAqLworI2VuZGlmCisKKyAgIGlmICghdGFyZ2V0X2hhc19leGVjdXRpb24pCisgICAgIHsKKyAgICAgICBlcnJvciAoIlRoZSBwcm9ncmFtIGlzIG5vdCBiZWluZyBydW4uIik7CisgICAgIH0KKworI2lmICFkZWZpbmVkIChLRVJORUxfVV9TSVpFKQorCisgIC8qIEFkZGluZyBzdXBwb3J0IGZvciB0aGlzIGNvbW1hbmQgaXMgZWFzeS4gIFR5cGljYWxseSB5b3UganVzdCBhZGQgYQorICAgICByb3V0aW5lLCBjYWxsZWQgImtlcm5lbF91X3NpemUiIHRoYXQgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgdXNlcgorICAgICBzdHJ1Y3QsIHRvIHRoZSBhcHByb3ByaWF0ZSAqLW5hdC5jIGZpbGUgYW5kIHRoZW4gYWRkIHRvIHRoZSBuYXRpdmUKKyAgICAgY29uZmlnIGZpbGUgIiNkZWZpbmUgS0VSTkVMX1VfU0laRSBrZXJuZWxfdV9zaXplKCkiICovCisgIGVycm9yICgiRG9uJ3Qga25vdyBob3cgbGFyZ2UgYGBzdHJ1Y3QgdXNlcicnIGlzIGluIHRoaXMgdmVyc2lvbiBvZiBnZGIuIik7CisKKyNlbHNlCisKKyAgZm9yICh1ZG90X29mZiA9IDA7IHVkb3Rfb2ZmIDwgS0VSTkVMX1VfU0laRTsgdWRvdF9vZmYgKz0gc2l6ZW9mICh1ZG90X3ZhbCkpCisgICAgeworICAgICAgaWYgKCh1ZG90X29mZiAlIDI0KSA9PSAwKQorCXsKKwkgIGlmICh1ZG90X29mZiA+IDApCisJICAgIHsKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworCSAgICB9CisJICBwcmludGZfZmlsdGVyZWQgKCIlMDR4OiIsIHVkb3Rfb2ZmKTsKKwl9CisgICAgICB1ZG90X3ZhbCA9IHB0cmFjZSAoUFRfUkVBRF9VLCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSB1ZG90X29mZiwgMCk7CisgICAgICBpZiAoZXJybm8gIT0gMCkKKwl7CisJICBzcHJpbnRmIChtZXNzLCAiXG5yZWFkaW5nIHVzZXIgc3RydWN0IGF0IG9mZnNldCAweCV4IiwgdWRvdF9vZmYpOworCSAgcGVycm9yX3dpdGhfbmFtZSAobWVzcyk7CisJfQorICAgICAgLyogQXZvaWQgdXNpbmcgbm9ucG9ydGFibGUgKD8pICIqIiBpbiBwcmludCBzcGVjcyAqLworICAgICAgcHJpbnRmX2ZpbHRlcmVkIChzaXplb2YgKGludCkgPT0gNCA/ICIgMHglMDh4IiA6ICIgMHglMTZ4IiwgdWRvdF92YWwpOworICAgIH0KKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKworI2VuZGlmCit9CisjZW5kaWYgLyogIWRlZmluZWQgKENISUxEX1hGRVJfTUVNT1JZKS4gICovCisKKwwKK3ZvaWQKK19pbml0aWFsaXplX2luZnB0cmFjZSAoKQoreworI2lmICFkZWZpbmVkIChDSElMRF9YRkVSX01FTU9SWSkKKyAgYWRkX2luZm8gKCJ1ZG90IiwgdWRvdF9pbmZvLAorCSAgICAiUHJpbnQgY29udGVudHMgb2Yga2VybmVsIGBgc3RydWN0IHVzZXInJyBmb3IgY3VycmVudCBjaGlsZC4iKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZ2RiL2luZnJ1bi5jIGIvZ2RiL2luZnJ1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZDhmYzEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvaW5mcnVuLmMKQEAgLTAsMCArMSwzNzc1IEBACisvKiBUYXJnZXQtc3RydWN0LWluZGVwZW5kZW50IGNvZGUgdG8gc3RhcnQgKHJ1bikgYW5kIHN0b3AgYW4gaW5mZXJpb3IgcHJvY2Vzcy4KKyAgIENvcHlyaWdodCAxOTg2LCA4NywgODgsIDg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiYnJlYWtwb2ludC5oIgorI2luY2x1ZGUgIndhaXQuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiZ2RidGhyZWFkLmgiCisjaW5jbHVkZSAiYW5ub3RhdGUuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCQkvKiBmb3Igb3ZlcmxheSBmdW5jdGlvbnMgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorCisvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMgKi8KKworc3RhdGljIHZvaWQgc2lnbmFsc19pbmZvIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHNpZ19wcmludF9pbmZvIFBBUkFNUyAoKGVudW0gdGFyZ2V0X3NpZ25hbCkpOworCitzdGF0aWMgdm9pZCBzaWdfcHJpbnRfaGVhZGVyIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQgcmVzdW1lX2NsZWFudXBzIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgaW50IGhvb2tfc3RvcF9zdHViIFBBUkFNUyAoKFBUUikpOworCitzdGF0aWMgdm9pZCBkZWxldGVfYnJlYWtwb2ludF9jdXJyZW50X2NvbnRlbnRzIFBBUkFNUyAoKFBUUikpOworCitpbnQgaW5mZXJpb3JfaWdub3Jpbmdfc3RhcnR1cF9leGVjX2V2ZW50cyA9IDA7CitpbnQgaW5mZXJpb3JfaWdub3JpbmdfbGVhZGluZ19leGVjX2V2ZW50cyA9IDA7CisKKyNpZmRlZiBIUFVYSFBQQQorLyogd2FpdF9mb3JfaW5mZXJpb3IgYW5kIG5vcm1hbF9zdG9wIHVzZSB0aGlzIHRvIG5vdGlmeSB0aGUgdXNlcgorICAgd2hlbiB0aGUgaW5mZXJpb3Igc3RvcHBlZCBpbiBhIGRpZmZlcmVudCB0aHJlYWQgdGhhbiBpdCBoYWQgYmVlbgorICAgcnVubmluZyBpbi4gKi8KK3N0YXRpYyBpbnQgc3dpdGNoZWRfZnJvbV9pbmZlcmlvcl9waWQ7CisjZW5kaWYKKworLyogcmVzdW1lIGFuZCB3YWl0X2Zvcl9pbmZlcmlvciB1c2UgdGhpcyB0byBlbnN1cmUgdGhhdCB3aGVuCisgICBzdGVwcGluZyBvdmVyIGEgaGl0IGJyZWFrcG9pbnQgaW4gYSB0aHJlYWRlZCBhcHBsaWNhdGlvbgorICAgb25seSB0aGUgdGhyZWFkIHRoYXQgaGl0IHRoZSBicmVha3BvaW50IGlzIHN0ZXBwZWQgYW5kIHRoZQorICAgb3RoZXIgdGhyZWFkcyBkb24ndCBjb250aW51ZS4gIFRoaXMgcHJldmVudHMgaGF2aW5nIGFub3RoZXIKKyAgIHRocmVhZCBydW4gcGFzdCB0aGUgYnJlYWtwb2ludCB3aGlsZSBpdCBpcyB0ZW1wb3JhcmlseQorICAgcmVtb3ZlZC4KKworICAgVGhpcyBpcyBub3QgdGhyZWFkLXNwZWNpZmljLCBzbyBpdCBpc24ndCBzYXZlZCBhcyBwYXJ0IG9mCisgICB0aGUgaW5mcnVuIHN0YXRlLgorCisgICBWZXJzaW9ucyBvZiBnZGIgd2hpY2ggZG9uJ3QgdXNlIHRoZSAic3RlcCA9PSB0aGlzIHRocmVhZCBzdGVwcworICAgYW5kIG90aGVycyBjb250aW51ZSIgbW9kZWwgYnV0IGluc3RlYWQgdXNlIHRoZSAic3RlcCA9PSB0aGlzCisgICB0aHJlYWQgc3RlcHMgYW5kIG90aGVycyB3YWl0IiBzaG91bGRuJ3QgZG8gdGhpcy4gKi8KK3N0YXRpYyBpbnQgdGhyZWFkX3N0ZXBfbmVlZGVkID0gMDsKKwordm9pZCBfaW5pdGlhbGl6ZV9pbmZydW4gUEFSQU1TICgodm9pZCkpOworCisvKiBHRVRfTE9OR0pNUF9UQVJHRVQgcmV0dXJucyB0aGUgUEMgYXQgd2hpY2ggbG9uZ2ptcCgpIHdpbGwgcmVzdW1lIHRoZQorICAgcHJvZ3JhbS4gIEl0IG5lZWRzIHRvIGV4YW1pbmUgdGhlIGptcF9idWYgYXJndW1lbnQgYW5kIGV4dHJhY3QgdGhlIFBDCisgICBmcm9tIGl0LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBub24temVybyBvbiBzdWNjZXNzLCB6ZXJvIG90aGVyd2lzZS4gKi8KKworI2lmbmRlZiBHRVRfTE9OR0pNUF9UQVJHRVQKKyNkZWZpbmUgR0VUX0xPTkdKTVBfVEFSR0VUKFBDX0FERFIpIDAKKyNlbmRpZgorCisKKy8qIFNvbWUgbWFjaGluZXMgaGF2ZSB0cmFtcG9saW5lIGNvZGUgdGhhdCBzaXRzIGJldHdlZW4gZnVuY3Rpb24gY2FsbGVycworICAgYW5kIHRoZSBhY3R1YWwgZnVuY3Rpb25zIHRoZW1zZWx2ZXMuICBJZiB0aGlzIG1hY2hpbmUgZG9lc24ndCBoYXZlCisgICBzdWNoIHRoaW5ncywgZGlzYWJsZSB0aGVpciBwcm9jZXNzaW5nLiAgKi8KKworI2lmbmRlZiBTS0lQX1RSQU1QT0xJTkVfQ09ERQorI2RlZmluZQlTS0lQX1RSQU1QT0xJTkVfQ09ERShwYykJMAorI2VuZGlmCisKKy8qIER5bmFtaWMgZnVuY3Rpb24gdHJhbXBvbGluZXMgYXJlIHNpbWlsYXIgdG8gc29saWIgdHJhbXBvbGluZXMgaW4gdGhhdCB0aGV5CisgICBhcmUgYmV0d2VlbiB0aGUgY2FsbGVyIGFuZCB0aGUgY2FsbGVlLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB3aGVuIHlvdQorICAgZW50ZXIgYSBkeW5hbWljIHRyYW1wb2xpbmUsIHlvdSBjYW4ndCBkZXRlcm1pbmUgdGhlIGNhbGxlZSdzIGFkZHJlc3MuICBTb21lCisgICAodXN1YWxseSBjb21wbGV4KSBjb2RlIG5lZWRzIHRvIHJ1biBpbiB0aGUgZHluYW1pYyB0cmFtcG9saW5lIHRvIGZpZ3VyZSBvdXQKKyAgIHRoZSBjYWxsZWUncyBhZGRyZXNzLiAgVGhpcyBtYWNybyBpcyB1c3VhbGx5IGNhbGxlZCB0d2ljZS4gIEZpcnN0LCB3aGVuIHdlCisgICBlbnRlciB0aGUgdHJhbXBvbGluZSAobG9va3MgbGlrZSBhIG5vcm1hbCBmdW5jdGlvbiBjYWxsIGF0IHRoYXQgcG9pbnQpLiAgSXQKKyAgIHNob3VsZCByZXR1cm4gdGhlIFBDIG9mIGEgcG9pbnQgd2l0aGluIHRoZSB0cmFtcG9saW5lIHdoZXJlIHRoZSBjYWxsZWUncworICAgYWRkcmVzcyBpcyBrbm93bi4gIFNlY29uZCwgd2hlbiB3ZSBoaXQgdGhlIGJyZWFrcG9pbnQsIHRoaXMgcm91dGluZSByZXR1cm5zCisgICB0aGUgY2FsbGVlJ3MgYWRkcmVzcy4gIEF0IHRoYXQgcG9pbnQsIHRoaW5ncyBwcm9jZWVkIGFzIHBlciBhIHN0ZXAgcmVzdW1lCisgICBicmVha3BvaW50LiAgKi8KKworI2lmbmRlZiBEWU5BTUlDX1RSQU1QT0xJTkVfTkVYVFBDCisjZGVmaW5lIERZTkFNSUNfVFJBTVBPTElORV9ORVhUUEMocGMpIDAKKyNlbmRpZgorCisvKiBPbiBTVlI0IGJhc2VkIHN5c3RlbXMsIGRldGVybWluaW5nIHRoZSBjYWxsZWUncyBhZGRyZXNzIGlzIGV4Y2VlZGluZ2x5CisgICBkaWZmaWN1bHQgYW5kIGRlcGVuZHMgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBydW4gdGltZSBsb2FkZXIuCisgICBJZiB3ZSBhcmUgc3RlcHBpbmcgYXQgdGhlIHNvdXJjZSBsZXZlbCwgd2Ugc2luZ2xlIHN0ZXAgdW50aWwgd2UgZXhpdAorICAgdGhlIHJ1biB0aW1lIGxvYWRlciBjb2RlIGFuZCByZWFjaCB0aGUgY2FsbGVlJ3MgYWRkcmVzcy4gICovCisKKyNpZm5kZWYgSU5fU09MSUJfRFlOU1lNX1JFU09MVkVfQ09ERQorI2RlZmluZSBJTl9TT0xJQl9EWU5TWU1fUkVTT0xWRV9DT0RFKHBjKSAwCisjZW5kaWYKKworLyogRm9yIFNWUjQgc2hhcmVkIGxpYnJhcmllcywgZWFjaCBjYWxsIGdvZXMgdGhyb3VnaCBhIHNtYWxsIHBpZWNlIG9mCisgICB0cmFtcG9saW5lIGNvZGUgaW4gdGhlICIucGx0IiBzZWN0aW9uLiAgSU5fU09MSUJfQ0FMTF9UUkFNUE9MSU5FIGV2YWx1YXRlcworICAgdG8gbm9uemVybyBpZiB3ZSBhcmUgY3VycmVudCBzdG9wcGVkIGluIG9uZSBvZiB0aGVzZS4gKi8KKworI2lmbmRlZiBJTl9TT0xJQl9DQUxMX1RSQU1QT0xJTkUKKyNkZWZpbmUgSU5fU09MSUJfQ0FMTF9UUkFNUE9MSU5FKHBjLG5hbWUpCTAKKyNlbmRpZgorCisvKiBJbiBzb21lIHNoYXJlZCBsaWJyYXJ5IHNjaGVtZXMsIHRoZSByZXR1cm4gcGF0aCBmcm9tIGEgc2hhcmVkIGxpYnJhcnkKKyAgIGNhbGwgbWF5IG5lZWQgdG8gZ28gdGhyb3VnaCBhIHRyYW1wb2xpbmUgdG9vLiAgKi8KKworI2lmbmRlZiBJTl9TT0xJQl9SRVRVUk5fVFJBTVBPTElORQorI2RlZmluZSBJTl9TT0xJQl9SRVRVUk5fVFJBTVBPTElORShwYyxuYW1lKQkwCisjZW5kaWYKKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIFRSVUUgaWYgcGMgaXMgdGhlIGFkZHJlc3Mgb2YgYW4gaW5zdHJ1Y3Rpb24KKyAgIHRoYXQgbGllcyB3aXRoaW4gdGhlIGR5bmFtaWMgbGlua2VyIChzdWNoIGFzIHRoZSBldmVudCBob29rLCBvciB0aGUKKyAgIGRsZCBpdHNlbGYpLgorCisgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gYSBkeW5hbWljIGxpbmtlciBldmVudCBoYXMKKyAgIGJlZW4gY2F1Z2h0LCBhbmQgdGhlIGluZmVyaW9yIGlzIGJlaW5nIHN0ZXBwZWQgb3V0IG9mIHRoZSBob29rLCBvcgorICAgdW5kZWZpbmVkIHJlc3VsdHMgYXJlIGd1YXJhbnRlZWQuICAqLworCisjaWZuZGVmIFNPTElCX0lOX0RZTkFNSUNfTElOS0VSCisjZGVmaW5lIFNPTElCX0lOX0RZTkFNSUNfTElOS0VSKHBpZCxwYykgMAorI2VuZGlmCisKKy8qIE9uIE1JUFMxNiwgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSBtYXkgY2FsbAorICAgYSBsaWJyYXJ5IGhlbHBlciBmdW5jdGlvbiB0byBjb3B5IHRoZSByZXR1cm4gdmFsdWUgdG8gYSBmbG9hdGluZyBwb2ludAorICAgcmVnaXN0ZXIuICBUaGUgSUdOT1JFX0hFTFBFUl9DQUxMIG1hY3JvIHJldHVybnMgbm9uLXplcm8gaWYgd2UKKyAgIHNob3VsZCBpZ25vcmUgKGkuZS4gc3RlcCBvdmVyKSB0aGlzIGZ1bmN0aW9uIGNhbGwuICAqLworI2lmbmRlZiBJR05PUkVfSEVMUEVSX0NBTEwKKyNkZWZpbmUgSUdOT1JFX0hFTFBFUl9DQUxMKHBjKQkwCisjZW5kaWYKKworLyogT24gc29tZSBzeXN0ZW1zLCB0aGUgUEMgbWF5IGJlIGxlZnQgcG9pbnRpbmcgYXQgYW4gaW5zdHJ1Y3Rpb24gdGhhdCAgd29uJ3QKKyAgIGFjdHVhbGx5IGJlIGV4ZWN1dGVkLiAgVGhpcyBpcyB1c3VhbGx5IGluZGljYXRlZCBieSBhIGJpdCBpbiB0aGUgUFNXLiAgSWYKKyAgIHdlIGZpbmQgb3Vyc2VsdmVzIGluIHN1Y2ggYSBzdGF0ZSwgdGhlbiB3ZSBzdGVwIHRoZSB0YXJnZXQgYmV5b25kIHRoZQorICAgbnVsbGlmaWVkIGluc3RydWN0aW9uIGJlZm9yZSByZXR1cm5pbmcgY29udHJvbCB0byB0aGUgdXNlciBzbyBhcyB0byBhdm9pZAorICAgY29uZnVzaW9uLiAqLworCisjaWZuZGVmIElOU1RSVUNUSU9OX05VTExJRklFRAorI2RlZmluZSBJTlNUUlVDVElPTl9OVUxMSUZJRUQgMAorI2VuZGlmCisKKy8qIFRhYmxlcyBvZiBob3cgdG8gcmVhY3QgdG8gc2lnbmFsczsgdGhlIHVzZXIgc2V0cyB0aGVtLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnNpZ25hbF9zdG9wOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnNpZ25hbF9wcmludDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpzaWduYWxfcHJvZ3JhbTsKKworI2RlZmluZSBTRVRfU0lHUyhuc2lncyxzaWdzLGZsYWdzKSBcCisgIGRvIHsgXAorICAgIGludCBzaWdudW0gPSAobnNpZ3MpOyBcCisgICAgd2hpbGUgKHNpZ251bS0tID4gMCkgXAorICAgICAgaWYgKChzaWdzKVtzaWdudW1dKSBcCisJKGZsYWdzKVtzaWdudW1dID0gMTsgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFVOU0VUX1NJR1MobnNpZ3Msc2lncyxmbGFncykgXAorICBkbyB7IFwKKyAgICBpbnQgc2lnbnVtID0gKG5zaWdzKTsgXAorICAgIHdoaWxlIChzaWdudW0tLSA+IDApIFwKKyAgICAgIGlmICgoc2lncylbc2lnbnVtXSkgXAorCShmbGFncylbc2lnbnVtXSA9IDA7IFwKKyAgfSB3aGlsZSAoMCkKKworCisvKiBDb21tYW5kIGxpc3QgcG9pbnRlciBmb3IgdGhlICJzdG9wIiBwbGFjZWhvbGRlci4gICovCisKK3N0YXRpYyBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqc3RvcF9jb21tYW5kOworCisvKiBOb256ZXJvIGlmIGJyZWFrcG9pbnRzIGFyZSBub3cgaW5zZXJ0ZWQgaW4gdGhlIGluZmVyaW9yLiAgKi8KKworc3RhdGljIGludCBicmVha3BvaW50c19pbnNlcnRlZDsKKworLyogRnVuY3Rpb24gaW5mZXJpb3Igd2FzIGluIGFzIG9mIGxhc3Qgc3RlcCBjb21tYW5kLiAgKi8KKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN0ZXBfc3RhcnRfZnVuY3Rpb247CisKKy8qIE5vbnplcm8gaWYgd2UgYXJlIGV4cGVjdGluZyBhIHRyYWNlIHRyYXAgYW5kIHNob3VsZCBwcm9jZWVkIGZyb20gaXQuICAqLworCitzdGF0aWMgaW50IHRyYXBfZXhwZWN0ZWQ7CisKKyNpZmRlZiBTT0xJQl9BREQKKy8qIE5vbnplcm8gaWYgd2Ugd2FudCB0byBnaXZlIGNvbnRyb2wgdG8gdGhlIHVzZXIgd2hlbiB3ZSdyZSBub3RpZmllZAorICAgb2Ygc2hhcmVkIGxpYnJhcnkgZXZlbnRzIGJ5IHRoZSBkeW5hbWljIGxpbmtlci4gICovCitzdGF0aWMgaW50IHN0b3Bfb25fc29saWJfZXZlbnRzOworI2VuZGlmCisKKyNpZmRlZiBIUF9PU19CVUcKKy8qIE5vbnplcm8gaWYgdGhlIG5leHQgdGltZSB3ZSB0cnkgdG8gY29udGludWUgdGhlIGluZmVyaW9yLCBpdCB3aWxsCisgICBzdGVwIG9uZSBpbnN0cnVjdGlvbiBhbmQgZ2VuZXJhdGUgYSBzcHVyaW91cyB0cmFjZSB0cmFwLgorICAgVGhpcyBpcyB1c2VkIHRvIGNvbXBlbnNhdGUgZm9yIGEgYnVnIGluIEhQLVVYLiAgKi8KKworc3RhdGljIGludCB0cmFwX2V4cGVjdGVkX2FmdGVyX2NvbnRpbnVlOworI2VuZGlmCisKKy8qIE5vbnplcm8gbWVhbnMgZXhwZWN0aW5nIGEgdHJhY2UgdHJhcAorICAgYW5kIHNob3VsZCBzdG9wIHRoZSBpbmZlcmlvciBhbmQgcmV0dXJuIHNpbGVudGx5IHdoZW4gaXQgaGFwcGVucy4gICovCisKK2ludCBzdG9wX2FmdGVyX3RyYXA7CisKKy8qIE5vbnplcm8gbWVhbnMgZXhwZWN0aW5nIGEgdHJhcCBhbmQgY2FsbGVyIHdpbGwgaGFuZGxlIGl0IHRoZW1zZWx2ZXMuCisgICBJdCBpcyB1c2VkIGFmdGVyIGF0dGFjaCwgZHVlIHRvIGF0dGFjaGluZyB0byBhIHByb2Nlc3M7CisgICB3aGVuIHJ1bm5pbmcgaW4gdGhlIHNoZWxsIGJlZm9yZSB0aGUgY2hpbGQgcHJvZ3JhbSBoYXMgYmVlbiBleGVjJ2Q7CisgICBhbmQgd2hlbiBydW5uaW5nIHNvbWUga2luZHMgb2YgcmVtb3RlIHN0dWZmIChGSVhNRT8pLiAgKi8KKworaW50IHN0b3Bfc29vbl9xdWlldGx5OworCisvKiBOb256ZXJvIGlmIHByb2NlZWQgaXMgYmVpbmcgdXNlZCBmb3IgYSAiZmluaXNoIiBjb21tYW5kIG9yIGEgc2ltaWxhcgorICAgc2l0dWF0aW9uIHdoZW4gc3RvcF9yZWdpc3RlcnMgc2hvdWxkIGJlIHNhdmVkLiAgKi8KKworaW50IHByb2NlZWRfdG9fZmluaXNoOworCisvKiBTYXZlIHJlZ2lzdGVyIGNvbnRlbnRzIGhlcmUgd2hlbiBhYm91dCB0byBwb3AgYSBzdGFjayBkdW1teSBmcmFtZSwKKyAgIGlmLWFuZC1vbmx5LWlmIHByb2NlZWRfdG9fZmluaXNoIGlzIHNldC4KKyAgIFRodXMgdGhpcyBjb250YWlucyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGNhbGxlZCBmdW5jdGlvbiAoYXNzdW1pbmcKKyAgIHZhbHVlcyBhcmUgcmV0dXJuZWQgaW4gYSByZWdpc3RlcikuICAqLworCitjaGFyIHN0b3BfcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEVTXTsKKworLyogTm9uemVybyBpZiBwcm9ncmFtIHN0b3BwZWQgZHVlIHRvIGVycm9yIHRyeWluZyB0byBpbnNlcnQgYnJlYWtwb2ludHMuICAqLworCitzdGF0aWMgaW50IGJyZWFrcG9pbnRzX2ZhaWxlZDsKKworLyogTm9uemVybyBhZnRlciBzdG9wIGlmIGN1cnJlbnQgc3RhY2sgZnJhbWUgc2hvdWxkIGJlIHByaW50ZWQuICAqLworCitzdGF0aWMgaW50IHN0b3BfcHJpbnRfZnJhbWU7CisKK3N0YXRpYyBzdHJ1Y3QgYnJlYWtwb2ludCAqc3RlcF9yZXN1bWVfYnJlYWtwb2ludCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGJyZWFrcG9pbnQgKnRocm91Z2hfc2lndHJhbXBfYnJlYWtwb2ludCA9IE5VTEw7CisKKy8qIE9uIHNvbWUgcGxhdGZvcm1zIChlLmcuLCBIUC1VWCksIGhhcmR3YXJlIHdhdGNocG9pbnRzIGhhdmUgYmFkCisgICBpbnRlcmFjdGlvbnMgd2l0aCBhbiBpbmZlcmlvciB0aGF0IGlzIHJ1bm5pbmcgYSBrZXJuZWwgZnVuY3Rpb24KKyAgIChha2EsIGEgc3lzdGVtIGNhbGwgb3IgInN5c2NhbGwiKS4gIHdhaXRfZm9yX2luZmVyaW9yIHRoZXJlZm9yZQorICAgbWF5IGhhdmUgYSBuZWVkIHRvIGtub3cgd2hlbiB0aGUgaW5mZXJpb3IgaXMgaW4gYSBzeXNjYWxsLiAgVGhpcworICAgaXMgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGluZmVyaW9yIHRocmVhZHMgd2hpY2ggYXJlIGtub3duIHRvCisgICBjdXJyZW50bHkgYmUgcnVubmluZyBpbiBhIHN5c2NhbGwuICovCitzdGF0aWMgaW50IG51bWJlcl9vZl90aHJlYWRzX2luX3N5c2NhbGxzOworCisvKiBUaGlzIGlzIHVzZWQgdG8gcmVtZW1iZXIgd2hlbiBhIGZvcmssIHZmb3JrIG9yIGV4ZWMgZXZlbnQKKyAgIHdhcyBjYXVnaHQgYnkgYSBjYXRjaHBvaW50LCBhbmQgdGh1cyB0aGUgZXZlbnQgaXMgdG8gYmUKKyAgIGZvbGxvd2VkIGF0IHRoZSBuZXh0IHJlc3VtZSBvZiB0aGUgaW5mZXJpb3IsIGFuZCBub3QKKyAgIGltbWVkaWF0ZWx5LiAqLworc3RhdGljIHN0cnVjdAorICB7CisgICAgZW51bSB0YXJnZXRfd2FpdGtpbmQga2luZDsKKyAgICBzdHJ1Y3QKKyAgICAgIHsKKwlpbnQgcGFyZW50X3BpZDsKKwlpbnQgc2F3X3BhcmVudF9mb3JrOworCWludCBjaGlsZF9waWQ7CisJaW50IHNhd19jaGlsZF9mb3JrOworCWludCBzYXdfY2hpbGRfZXhlYzsKKyAgICAgIH0KKyAgICBmb3JrX2V2ZW50OworICAgIGNoYXIgKmV4ZWNkX3BhdGhuYW1lOworICB9CitwZW5kaW5nX2ZvbGxvdzsKKworLyogU29tZSBwbGF0Zm9ybXMgZG9uJ3QgYWxsb3cgdXMgdG8gZG8gYW55dGhpbmcgbWVhbmluZ2Z1bCB3aXRoIGEKKyAgIHZmb3JrZWQgY2hpbGQgdW50aWwgaXQgaGFzIGV4ZWMnZC4gIFZmb3JrZWQgcHJvY2Vzc2VzIG9uIHN1Y2gKKyAgIHBsYXRmb3JtcyBjYW4gb25seSBiZSBmb2xsb3dlZCBhZnRlciB0aGV5J3ZlIGV4ZWMnZC4KKworICAgV2hlbiB0aGlzIGlzIHNldCB0byAwLCBhIHZmb3JrIGNhbiBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCwKKyAgIGFuZCBhbiBleGVjIGNhbiBiZSBmb2xsb3dlZCBtZXJlbHkgYXMgYW4gZXhlYy4gIFdoZW4gdGhpcyBpcworICAgc2V0IHRvIDEsIGEgdmZvcmsgZXZlbnQgaGFzIGJlZW4gc2VlbiwgYnV0IGNhbm5vdCBiZSBmb2xsb3dlZAorICAgdW50aWwgdGhlIGV4ZWMgaXMgc2Vlbi4KKworICAgKEluIHRoZSBsYXR0ZXIgY2FzZSwgaW5mZXJpb3JfcGlkIGlzIHN0aWxsIHRoZSBwYXJlbnQgb2YgdGhlCisgICB2Zm9yaywgYW5kIHBlbmRpbmdfZm9sbG93LmZvcmtfZXZlbnQuY2hpbGRfcGlkIGlzIHRoZSBjaGlsZC4gIFRoZQorICAgYXBwcm9wcmlhdGUgcHJvY2VzcyBpcyBmb2xsb3dlZCwgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5nIG9mCisgICBmb2xsb3ctZm9yay1tb2RlLikgKi8KK3N0YXRpYyBpbnQgZm9sbG93X3Zmb3JrX3doZW5fZXhlYzsKKworc3RhdGljIGNoYXIgKmZvbGxvd19mb3JrX21vZGVfa2luZF9uYW1lc1tdID0KK3sKKy8qID8/cmVocmF1ZXI6ICBUaGUgImJvdGgiIG9wdGlvbiBpcyBicm9rZW4sIGJ5IHdoYXQgbWF5IGJlIGEgMTAuMjAKKyAgIGtlcm5lbCBwcm9ibGVtLiAgSXQncyBhbHNvIG5vdCB0ZXJyaWJseSB1c2VmdWwgd2l0aG91dCBhIEdVSSB0bworICAgaGVscCB0aGUgdXNlciBkcml2ZSB0d28gZGVidWdnZXJzLiAgU28gZm9yIG5vdywgSSdtIGRpc2FibGluZworICAgdGhlICJib3RoIiBvcHRpb24uCisgICJwYXJlbnQiLCAiY2hpbGQiLCAiYm90aCIsICJhc2siIH07CisgICovCisgICJwYXJlbnQiLCAiY2hpbGQiLCAiYXNrIn07CisKK3N0YXRpYyBjaGFyICpmb2xsb3dfZm9ya19tb2RlX3N0cmluZyA9IE5VTEw7CisMCisKKyNpZiBkZWZpbmVkKEhQVVhIUFBBKQorc3RhdGljIHZvaWQKK2ZvbGxvd19pbmZlcmlvcl9mb3JrIChwYXJlbnRfcGlkLCBjaGlsZF9waWQsIGhhc19mb3JrZWQsIGhhc192Zm9ya2VkKQorICAgICBpbnQgcGFyZW50X3BpZDsKKyAgICAgaW50IGNoaWxkX3BpZDsKKyAgICAgaW50IGhhc19mb3JrZWQ7CisgICAgIGludCBoYXNfdmZvcmtlZDsKK3sKKyAgaW50IGZvbGxvd2VkX3BhcmVudCA9IDA7CisgIGludCBmb2xsb3dlZF9jaGlsZCA9IDA7CisgIGludCBpbWFfY2xvbmUgPSAwOworCisgIC8qIFdoaWNoIHByb2Nlc3MgZGlkIHRoZSB1c2VyIHdhbnQgdXMgdG8gZm9sbG93PyAqLworICBjaGFyICpmb2xsb3dfbW9kZSA9CisgIHNhdmVzdHJpbmcgKGZvbGxvd19mb3JrX21vZGVfc3RyaW5nLCBzdHJsZW4gKGZvbGxvd19mb3JrX21vZGVfc3RyaW5nKSk7CisKKyAgLyogT3IsIGRpZCB0aGUgdXNlciBub3Qga25vdywgYW5kIHdhbnQgdXMgdG8gYXNrPyAqLworICBpZiAoU1RSRVEgKGZvbGxvd19mb3JrX21vZGVfc3RyaW5nLCAiYXNrIikpCisgICAgeworICAgICAgY2hhciByZXF1ZXN0ZWRfbW9kZVsxMDBdOworCisgICAgICBmcmVlIChmb2xsb3dfbW9kZSk7CisgICAgICBlcnJvciAoIlwiYXNrXCIgbW9kZSBOWUkiKTsKKyAgICAgIGZvbGxvd19tb2RlID0gc2F2ZXN0cmluZyAocmVxdWVzdGVkX21vZGUsIHN0cmxlbiAocmVxdWVzdGVkX21vZGUpKTsKKyAgICB9CisKKyAgLyogSWYgd2UncmUgdG8gYmUgZm9sbG93aW5nIHRoZSBwYXJlbnQsIHRoZW4gZGV0YWNoIGZyb20gY2hpbGRfcGlkLgorICAgICBXZSdyZSBhbHJlYWR5IGZvbGxvd2luZyB0aGUgcGFyZW50LCBzbyBuZWVkIGRvIG5vdGhpbmcgZXhwbGljaXQKKyAgICAgZm9yIGl0LiAqLworICBpZiAoU1RSRVEgKGZvbGxvd19tb2RlLCAicGFyZW50IikpCisgICAgeworICAgICAgZm9sbG93ZWRfcGFyZW50ID0gMTsKKworICAgICAgLyogV2UncmUgYWxyZWFkeSBhdHRhY2hlZCB0byB0aGUgcGFyZW50LCBieSBkZWZhdWx0LiAqLworCisgICAgICAvKiBCZWZvcmUgZGV0YWNoaW5nIGZyb20gdGhlIGNoaWxkLCByZW1vdmUgYWxsIGJyZWFrcG9pbnRzIGZyb20KKyAgICAgICAgIGl0LiAgKFRoaXMgd29uJ3QgYWN0dWFsbHkgbW9kaWZ5IHRoZSBicmVha3BvaW50IGxpc3QsIGJ1dCB3aWxsCisgICAgICAgICBwaHlzaWNhbGx5IHJlbW92ZSB0aGUgYnJlYWtwb2ludHMgZnJvbSB0aGUgY2hpbGQuKSAqLworICAgICAgaWYgKCFoYXNfdmZvcmtlZCB8fCAhZm9sbG93X3Zmb3JrX3doZW5fZXhlYykKKwl7CisJICBkZXRhY2hfYnJlYWtwb2ludHMgKGNoaWxkX3BpZCk7CisJICBTT0xJQl9SRU1PVkVfSU5GRVJJT1JfSE9PSyAoY2hpbGRfcGlkKTsKKwl9CisKKyAgICAgIC8qIERldGFjaCBmcm9tIHRoZSBjaGlsZC4gKi8KKyAgICAgIGRvbnRfcmVwZWF0ICgpOworCisgICAgICB0YXJnZXRfcmVxdWlyZV9kZXRhY2ggKGNoaWxkX3BpZCwgIiIsIDEpOworICAgIH0KKworICAvKiBJZiB3ZSdyZSB0byBiZSBmb2xsb3dpbmcgdGhlIGNoaWxkLCB0aGVuIGF0dGFjaCB0byBpdCwgZGV0YWNoCisgICAgIGZyb20gaW5mZXJpb3JfcGlkLCBhbmQgc2V0IGluZmVyaW9yX3BpZCB0byBjaGlsZF9waWQuICovCisgIGVsc2UgaWYgKFNUUkVRIChmb2xsb3dfbW9kZSwgImNoaWxkIikpCisgICAgeworICAgICAgY2hhciBjaGlsZF9waWRfc3BlbGxpbmdbMTAwXTsJLyogQXJiaXRyYXJ5IGxlbmd0aC4gKi8KKworICAgICAgZm9sbG93ZWRfY2hpbGQgPSAxOworCisgICAgICAvKiBCZWZvcmUgZGV0YWNoaW5nIGZyb20gdGhlIHBhcmVudCwgZGV0YWNoIGFsbCBicmVha3BvaW50cyBmcm9tCisgICAgICAgICB0aGUgY2hpbGQuICBCdXQgb25seSBpZiB3ZSdyZSBmb3JraW5nLCBvciBpZiB3ZSBmb2xsb3cgdmZvcmtzCisgICAgICAgICBhcyBzb29uIGFzIHRoZXkgaGFwcGVuLiAgKElmIHdlJ3JlIGZvbGxvd2luZyB2Zm9ya3Mgb25seSB3aGVuCisgICAgICAgICB0aGUgY2hpbGQgaGFzIGV4ZWMnZCwgdGhlbiBpdCdzIHZlcnkgd3JvbmcgdG8gdHJ5IHRvIHdyaXRlCisgICAgICAgICBiYWNrIHRoZSAic2hhZG93IGNvbnRlbnRzIiBvZiBpbnNlcnRlZCBicmVha3BvaW50cyBub3cgLS0gdGhleQorICAgICAgICAgYmVsb25nIHRvIHRoZSBjaGlsZCdzIHByZS1leGVjJ2QgYS5vdXQuKSAqLworICAgICAgaWYgKCFoYXNfdmZvcmtlZCB8fCAhZm9sbG93X3Zmb3JrX3doZW5fZXhlYykKKwl7CisJICBkZXRhY2hfYnJlYWtwb2ludHMgKGNoaWxkX3BpZCk7CisJfQorCisgICAgICAvKiBCZWZvcmUgZGV0YWNoaW5nIGZyb20gdGhlIHBhcmVudCwgcmVtb3ZlIGFsbCBicmVha3BvaW50cyBmcm9tIGl0LiAqLworICAgICAgcmVtb3ZlX2JyZWFrcG9pbnRzICgpOworCisgICAgICAvKiBBbHNvIHJlc2V0IHRoZSBzb2xpYiBpbmZlcmlvciBob29rIGZyb20gdGhlIHBhcmVudC4gKi8KKyAgICAgIFNPTElCX1JFTU9WRV9JTkZFUklPUl9IT09LIChpbmZlcmlvcl9waWQpOworCisgICAgICAvKiBEZXRhY2ggZnJvbSB0aGUgcGFyZW50LiAqLworICAgICAgZG9udF9yZXBlYXQgKCk7CisgICAgICB0YXJnZXRfZGV0YWNoIChOVUxMLCAxKTsKKworICAgICAgLyogQXR0YWNoIHRvIHRoZSBjaGlsZC4gKi8KKyAgICAgIGluZmVyaW9yX3BpZCA9IGNoaWxkX3BpZDsKKyAgICAgIHNwcmludGYgKGNoaWxkX3BpZF9zcGVsbGluZywgIiVkIiwgY2hpbGRfcGlkKTsKKyAgICAgIGRvbnRfcmVwZWF0ICgpOworCisgICAgICB0YXJnZXRfcmVxdWlyZV9hdHRhY2ggKGNoaWxkX3BpZF9zcGVsbGluZywgMSk7CisKKyAgICAgIC8qIFdhcyB0aGVyZSBhIHN0ZXBfcmVzdW1lIGJyZWFrcG9pbnQ/ICAoVGhlcmUgd2FzIGlmIHRoZSB1c2VyCisgICAgICAgICBkaWQgYSAibmV4dCIgYXQgdGhlIGZvcmsoKSBjYWxsLikgIElmIHNvLCBleHBsaWNpdGx5IHJlc2V0IGl0cworICAgICAgICAgdGhyZWFkIG51bWJlci4KKworICAgICAgICAgc3RlcF9yZXN1bWVzIGFyZSBhIGZvcm0gb2YgYnAgdGhhdCBhcmUgbWFkZSB0byBiZSBwZXItdGhyZWFkLgorICAgICAgICAgU2luY2Ugd2UgY3JlYXRlZCB0aGUgc3RlcF9yZXN1bWUgYnAgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MKKyAgICAgICAgIHdhcyBiZWluZyBkZWJ1Z2dlZCwgYW5kIG5vdyBhcmUgc3dpdGNoaW5nIHRvIHRoZSBjaGlsZCBwcm9jZXNzLAorICAgICAgICAgZnJvbSB0aGUgYnJlYWtwb2ludCBwYWNrYWdlJ3Mgdmlld3BvaW50LCB0aGF0J3MgYSBzd2l0Y2ggb2YKKyAgICAgICAgICJ0aHJlYWRzIi4gIFdlIG11c3QgdXBkYXRlIHRoZSBicCdzIG5vdGlvbiBvZiB3aGljaCB0aHJlYWQKKyAgICAgICAgIGl0IGlzIGZvciwgb3IgaXQnbGwgYmUgaWdub3JlZCB3aGVuIGl0IHRyaWdnZXJzLi4uICovCisgICAgICBpZiAoc3RlcF9yZXN1bWVfYnJlYWtwb2ludCAmJgorCSAgKCFoYXNfdmZvcmtlZCB8fCAhZm9sbG93X3Zmb3JrX3doZW5fZXhlYykpCisJYnJlYWtwb2ludF9yZV9zZXRfdGhyZWFkIChzdGVwX3Jlc3VtZV9icmVha3BvaW50KTsKKworICAgICAgLyogUmVpbnNlcnQgYWxsIGJyZWFrcG9pbnRzIGluIHRoZSBjaGlsZC4gIChUaGUgdXNlciBtYXkndmUgc2V0CisgICAgICAgICBicmVha3BvaW50cyBhZnRlciBjYXRjaGluZyB0aGUgZm9yaywgaW4gd2hpY2ggY2FzZSB0aG9zZQorICAgICAgICAgYWN0dWFsbHkgZGlkbid0IGdldCBzZXQgaW4gdGhlIGNoaWxkLCBidXQgb25seSBpbiB0aGUgcGFyZW50LikgKi8KKyAgICAgIGlmICghaGFzX3Zmb3JrZWQgfHwgIWZvbGxvd192Zm9ya193aGVuX2V4ZWMpCisJeworCSAgYnJlYWtwb2ludF9yZV9zZXQgKCk7CisJICBpbnNlcnRfYnJlYWtwb2ludHMgKCk7CisJfQorICAgIH0KKworICAvKiBJZiB3ZSdyZSB0byBiZSBmb2xsb3dpbmcgYm90aCBwYXJlbnQgYW5kIGNoaWxkLCB0aGVuIGZvcmsgb3Vyc2VsdmVzLAorICAgICBhbmQgYXR0YWNoIHRoZSBkZWJ1Z2dlciBjbG9uZSB0byB0aGUgY2hpbGQuICovCisgIGVsc2UgaWYgKFNUUkVRIChmb2xsb3dfbW9kZSwgImJvdGgiKSkKKyAgICB7CisgICAgICBjaGFyIHBpZF9zdWZmaXhbMTAwXTsJLyogQXJiaXRyYXJ5IGxlbmd0aC4gKi8KKworICAgICAgLyogQ2xvbmUgb3Vyc2VsdmVzIHRvIGZvbGxvdyB0aGUgY2hpbGQuICBUaGlzIGlzIHRoZSBlbmQgb2Ygb3VyCisgICAgICAgaW52b2x2ZW1lbnQgd2l0aCBjaGlsZF9waWQ7IG91ciBjbG9uZSB3aWxsIHRha2UgaXQgZnJvbSBoZXJlLi4uICovCisgICAgICBkb250X3JlcGVhdCAoKTsKKyAgICAgIHRhcmdldF9jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yIChjaGlsZF9waWQsICZmb2xsb3dlZF9jaGlsZCk7CisgICAgICBmb2xsb3dlZF9wYXJlbnQgPSAhZm9sbG93ZWRfY2hpbGQ7CisKKyAgICAgIC8qIFdlIGNvbnRpbnVlIHRvIGZvbGxvdyB0aGUgcGFyZW50LiAgVG8gaGVscCBkaXN0aW5ndWlzaCB0aGUgdHdvCisgICAgICAgICBkZWJ1Z2dlcnMsIHRob3VnaCwgYm90aCB3ZSBhbmQgb3VyIGNsb25lIHdpbGwgcmVzZXQgb3VyIHByb21wdHMuICovCisgICAgICBzcHJpbnRmIChwaWRfc3VmZml4LCAiWyVkXSAiLCBpbmZlcmlvcl9waWQpOworICAgICAgc2V0X3Byb21wdCAoc3RyY2F0IChnZXRfcHJvbXB0ICgpLCBwaWRfc3VmZml4KSk7CisgICAgfQorCisgIC8qIFRoZSBwYXJlbnQgYW5kIGNoaWxkIG9mIGEgdmZvcmsgc2hhcmUgdGhlIHNhbWUgYWRkcmVzcyBzcGFjZS4KKyAgICAgQWxzbywgb24gc29tZSB0YXJnZXRzIHRoZSBvcmRlciBpbiB3aGljaCB2Zm9yayBhbmQgZXhlYyBldmVudHMKKyAgICAgYXJlIHJlY2VpdmVkIGZvciBwYXJlbnQgaW4gY2hpbGQgcmVxdWlyZXMgc29tZSBkZWxpY2F0ZSBoYW5kbGluZworICAgICBvZiB0aGUgZXZlbnRzLgorCisgICAgIEZvciBpbnN0YW5jZSwgb24gcHRyYWNlLWJhc2VkIEhQVVggd2UgcmVjZWl2ZSB0aGUgY2hpbGQncyB2Zm9yaworICAgICBldmVudCBmaXJzdCwgYXQgd2hpY2ggdGltZSB0aGUgcGFyZW50IGhhcyBiZWVuIHN1c3BlbmRlZCBieSB0aGUKKyAgICAgT1MgYW5kIGlzIGVzc2VudGlhbGx5IHVudG91Y2hhYmxlIHVudGlsIHRoZSBjaGlsZCdzIGV4aXQgb3Igc2Vjb25kCisgICAgIGV4ZWMgZXZlbnQgYXJyaXZlcy4gIEF0IHRoYXQgdGltZSwgdGhlIHBhcmVudCdzIHZmb3JrIGV2ZW50IGlzCisgICAgIGRlbGl2ZXJlZCB0byB1cywgYW5kIHRoYXQncyB3aGVuIHdlIHNlZSBhbmQgZGVjaWRlIGhvdyB0byBmb2xsb3cKKyAgICAgdGhlIHZmb3JrLiAgQnV0IHRvIGdldCB0byB0aGF0IHBvaW50LCB3ZSBtdXN0IGNvbnRpbnVlIHRoZSBjaGlsZAorICAgICB1bnRpbCBpdCBleGVjcyBvciBleGl0cy4gIFRvIGRvIHRoYXQgc21vb3RobHksIGFsbCBicmVha3BvaW50cworICAgICBtdXN0IGJlIHJlbW92ZWQgZnJvbSB0aGUgY2hpbGQsIGluIGNhc2UgdGhlcmUgYXJlIGFueSBzZXQgYmV0d2VlbgorICAgICB0aGUgdmZvcmsoKSBhbmQgZXhlYygpIGNhbGxzLiAgQnV0IHJlbW92aW5nIHRoZW0gZnJvbSB0aGUgY2hpbGQKKyAgICAgYWxzbyByZW1vdmVzIHRoZW0gZnJvbSB0aGUgcGFyZW50LCBkdWUgdG8gdGhlIHNoYXJlZC1hZGRyZXNzLXNwYWNlCisgICAgIG5hdHVyZSBvZiBhIHZmb3JrJ2QgcGFyZW50IGFuZCBjaGlsZC4gIE9uIEhQVVgsIHRoZXJlZm9yZSwgd2UgbXVzdAorICAgICB0YWtlIGNhcmUgdG8gcmVzdG9yZSB0aGUgYnAncyB0byB0aGUgcGFyZW50IGJlZm9yZSB3ZSBjb250aW51ZSBpdC4KKyAgICAgRWxzZSwgaXQncyBsaWtlbHkgdGhhdCB3ZSBtYXkgbm90IHN0b3AgaW4gdGhlIGV4cGVjdGVkIHBsYWNlLiAgKFRoZQorICAgICB3b3JzdCBzY2VuYXJpbyBpcyB3aGVuIHRoZSB1c2VyIHRyaWVzIHRvIHN0ZXAgb3ZlciBhIHZmb3JrKCkgY2FsbDsKKyAgICAgdGhlIHN0ZXAtcmVzdW1lIGJwIG11c3QgYmUgcmVzdG9yZWQgZm9yIHRoZSBzdGVwIHRvIHByb3Blcmx5IHN0b3AKKyAgICAgaW4gdGhlIHBhcmVudCBhZnRlciB0aGUgY2FsbCBjb21wbGV0ZXMhKQorCisgICAgIFNlcXVlbmNlIG9mIGV2ZW50cywgYXMgcmVwb3J0ZWQgdG8gZ2RiIGZyb20gSFBVWDoKKworICAgICAgICAgICBQYXJlbnQgICAgICAgIENoaWxkICAgICAgICAgICBBY3Rpb24gZm9yIGdkYiB0byB0YWtlCisgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDEgICAgICAgICAgICAgICAgVkZPUksgICAgICAgICAgICAgICBDb250aW51ZSBjaGlsZAorICAgICAgICAyICAgICAgICAgICAgICAgIEVYRUMKKyAgICAgICAgMyAgICAgICAgICAgICAgICBFWEVDIG9yIEVYSVQKKyAgICAgICAgNCAgVkZPUksgKi8KKyAgaWYgKGhhc192Zm9ya2VkKQorICAgIHsKKyAgICAgIHRhcmdldF9wb3N0X2ZvbGxvd192Zm9yayAocGFyZW50X3BpZCwKKwkJCQlmb2xsb3dlZF9wYXJlbnQsCisJCQkJY2hpbGRfcGlkLAorCQkJCWZvbGxvd2VkX2NoaWxkKTsKKyAgICB9CisKKyAgcGVuZGluZ19mb2xsb3cuZm9ya19ldmVudC5zYXdfcGFyZW50X2ZvcmsgPSAwOworICBwZW5kaW5nX2ZvbGxvdy5mb3JrX2V2ZW50LnNhd19jaGlsZF9mb3JrID0gMDsKKworICBmcmVlIChmb2xsb3dfbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkCitmb2xsb3dfZm9yayAocGFyZW50X3BpZCwgY2hpbGRfcGlkKQorICAgICBpbnQgcGFyZW50X3BpZDsKKyAgICAgaW50IGNoaWxkX3BpZDsKK3sKKyAgZm9sbG93X2luZmVyaW9yX2ZvcmsgKHBhcmVudF9waWQsIGNoaWxkX3BpZCwgMSwgMCk7Cit9CisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbi4gKi8KK3N0YXRpYyB2b2lkIGZvbGxvd19leGVjIFBBUkFNUyAoKGludCwgY2hhciAqKSk7CisKK3N0YXRpYyB2b2lkCitmb2xsb3dfdmZvcmsgKHBhcmVudF9waWQsIGNoaWxkX3BpZCkKKyAgICAgaW50IHBhcmVudF9waWQ7CisgICAgIGludCBjaGlsZF9waWQ7Cit7CisgIGZvbGxvd19pbmZlcmlvcl9mb3JrIChwYXJlbnRfcGlkLCBjaGlsZF9waWQsIDAsIDEpOworCisgIC8qIERpZCB3ZSBmb2xsb3cgdGhlIGNoaWxkPyAgSGFkIGl0IGV4ZWMnZCBiZWZvcmUgd2Ugc2F3IHRoZSBwYXJlbnQgdmZvcms/ICovCisgIGlmIChwZW5kaW5nX2ZvbGxvdy5mb3JrX2V2ZW50LnNhd19jaGlsZF9leGVjICYmIChpbmZlcmlvcl9waWQgPT0gY2hpbGRfcGlkKSkKKyAgICB7CisgICAgICBwZW5kaW5nX2ZvbGxvdy5mb3JrX2V2ZW50LnNhd19jaGlsZF9leGVjID0gMDsKKyAgICAgIHBlbmRpbmdfZm9sbG93LmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1BVUklPVVM7CisgICAgICBmb2xsb3dfZXhlYyAoaW5mZXJpb3JfcGlkLCBwZW5kaW5nX2ZvbGxvdy5leGVjZF9wYXRobmFtZSk7CisgICAgICBmcmVlIChwZW5kaW5nX2ZvbGxvdy5leGVjZF9wYXRobmFtZSk7CisgICAgfQorfQorI2VuZGlmIC8qIEhQVVhIUFBBICovCisKK3N0YXRpYyB2b2lkCitmb2xsb3dfZXhlYyAocGlkLCBleGVjZF9wYXRobmFtZSkKKyAgICAgaW50IHBpZDsKKyAgICAgY2hhciAqZXhlY2RfcGF0aG5hbWU7Cit7CisjaWZkZWYgSFBVWEhQUEEKKyAgaW50IHNhdmVkX3BpZCA9IHBpZDsKKyAgZXh0ZXJuIHN0cnVjdCB0YXJnZXRfb3BzIGNoaWxkX29wczsKKworICAvKiBEaWQgdGhpcyBleGVjKCkgZm9sbG93IGEgdmZvcmsoKT8gIElmIHNvLCB3ZSBtdXN0IGZvbGxvdyB0aGUKKyAgICAgdmZvcmsgbm93IHRvby4gIERvIGl0IGJlZm9yZSBmb2xsb3dpbmcgdGhlIGV4ZWMuICovCisgIGlmIChmb2xsb3dfdmZvcmtfd2hlbl9leGVjICYmCisgICAgICAocGVuZGluZ19mb2xsb3cua2luZCA9PSBUQVJHRVRfV0FJVEtJTkRfVkZPUktFRCkpCisgICAgeworICAgICAgcGVuZGluZ19mb2xsb3cua2luZCA9IFRBUkdFVF9XQUlUS0lORF9TUFVSSU9VUzsKKyAgICAgIGZvbGxvd192Zm9yayAoaW5mZXJpb3JfcGlkLCBwZW5kaW5nX2ZvbGxvdy5mb3JrX2V2ZW50LmNoaWxkX3BpZCk7CisgICAgICBmb2xsb3dfdmZvcmtfd2hlbl9leGVjID0gMDsKKyAgICAgIHNhdmVkX3BpZCA9IGluZmVyaW9yX3BpZDsKKworICAgICAgLyogRGlkIHdlIGZvbGxvdyB0aGUgcGFyZW50PyAgSWYgc28sIHdlJ3JlIGRvbmUuICBJZiB3ZSBmb2xsb3dlZAorICAgICAgICAgdGhlIGNoaWxkIHRoZW4gd2UgbXVzdCBhbHNvIGZvbGxvdyBpdHMgZXhlYygpLiAqLworICAgICAgaWYgKGluZmVyaW9yX3BpZCA9PSBwZW5kaW5nX2ZvbGxvdy5mb3JrX2V2ZW50LnBhcmVudF9waWQpCisJcmV0dXJuOworICAgIH0KKworICAvKiBUaGlzIGlzIGFuIGV4ZWMgZXZlbnQgdGhhdCB3ZSBhY3R1YWxseSB3aXNoIHRvIHBheSBhdHRlbnRpb24gdG8uCisgICAgIFJlZnJlc2ggb3VyIHN5bWJvbCB0YWJsZSB0byB0aGUgbmV3bHkgZXhlYydkIHByb2dyYW0sIHJlbW92ZSBhbnkKKyAgICAgbW9tZW50YXJ5IGJwJ3MsIGV0Yy4KKworICAgICBJZiB0aGVyZSBhcmUgYnJlYWtwb2ludHMsIHRoZXkgYXJlbid0IHJlYWxseSBpbnNlcnRlZCBub3csCisgICAgIHNpbmNlIHRoZSBleGVjKCkgdHJhbnNmb3JtZWQgb3VyIGluZmVyaW9yIGludG8gYSBmcmVzaCBzZXQKKyAgICAgb2YgaW5zdHJ1Y3Rpb25zLgorCisgICAgIFdlIHdhbnQgdG8gcHJlc2VydmUgc3ltYm9saWMgYnJlYWtwb2ludHMgb24gdGhlIGxpc3QsIHNpbmNlCisgICAgIHdlIGhhdmUgaG9wZXMgdGhhdCB0aGV5IGNhbiBiZSByZXNldCBhZnRlciB0aGUgbmV3IGEub3V0J3MKKyAgICAgc3ltYm9sIHRhYmxlIGlzIHJlYWQuCisKKyAgICAgSG93ZXZlciwgYW55ICJyYXciIGJyZWFrcG9pbnRzIG11c3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0CisgICAgIChlLmcuLCB0aGUgc29saWIgYnAncyksIHNpbmNlIHRoZWlyIGFkZHJlc3MgaXMgcHJvYmFibHkgaW52YWxpZAorICAgICBub3cuCisKKyAgICAgQW5kLCB3ZSBET04nVCB3YW50IHRvIGNhbGwgZGVsZXRlX2JyZWFrcG9pbnRzKCkgaGVyZSwgc2luY2UKKyAgICAgdGhhdCBtYXkgd3JpdGUgdGhlIGJwJ3MgInNoYWRvdyBjb250ZW50cyIgKHRoZSBpbnN0cnVjdGlvbgorICAgICB2YWx1ZSB0aGF0IHdhcyBvdmVyd3JpdHRlbiB3aXRoYSBUUkFQIGluc3RydWN0aW9uKS4gIFNpbmNlCisgICAgIHdlIG5vdyBoYXZlIGEgbmV3IGEub3V0LCB0aG9zZSBzaGFkb3cgY29udGVudHMgYXJlbid0IHZhbGlkLiAqLworICB1cGRhdGVfYnJlYWtwb2ludHNfYWZ0ZXJfZXhlYyAoKTsKKworICAvKiBJZiB0aGVyZSB3YXMgb25lLCBpdCdzIGdvbmUgbm93LiAgV2UgY2Fubm90IHRydWx5IHN0ZXAtdG8tbmV4dAorICAgICBzdGF0ZW1lbnQgdGhyb3VnaCBhbiBleGVjKCkuICovCisgIHN0ZXBfcmVzdW1lX2JyZWFrcG9pbnQgPSBOVUxMOworICBzdGVwX3JhbmdlX3N0YXJ0ID0gMDsKKyAgc3RlcF9yYW5nZV9lbmQgPSAwOworCisgIC8qIElmIHRoZXJlIHdhcyBvbmUsIGl0J3MgZ29uZSBub3cuICovCisgIHRocm91Z2hfc2lndHJhbXBfYnJlYWtwb2ludCA9IE5VTEw7CisKKyAgLyogV2hhdCBpcyB0aGlzIGEub3V0J3MgbmFtZT8gKi8KKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJFeGVjdXRpbmcgbmV3IHByb2dyYW06ICVzXG4iLCBleGVjZF9wYXRobmFtZSk7CisKKyAgLyogV2UndmUgZm9sbG93ZWQgdGhlIGluZmVyaW9yIHRocm91Z2ggYW4gZXhlYy4gIFRoZXJlZm9yZSwgdGhlCisgICAgIGluZmVyaW9yIGhhcyBlc3NlbnRpYWxseSBiZWVuIGtpbGxlZCAmIHJlYm9ybi4gKi8KKyAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgdGFyZ2V0X21vdXJuX2luZmVyaW9yICgpOworICBpbmZlcmlvcl9waWQgPSBzYXZlZF9waWQ7CS8qIEJlY2F1c2UgbW91cm5faW5mZXJpb3IgcmVzZXRzIGluZmVyaW9yX3BpZC4gKi8KKyAgcHVzaF90YXJnZXQgKCZjaGlsZF9vcHMpOworCisgIC8qIFRoYXQgYS5vdXQgaXMgbm93IHRoZSBvbmUgdG8gdXNlLiAqLworICBleGVjX2ZpbGVfYXR0YWNoIChleGVjZF9wYXRobmFtZSwgMCk7CisKKyAgLyogQW5kIGFsc28gaXMgd2hlcmUgc3ltYm9scyBjYW4gYmUgZm91bmQuICovCisgIHN5bWJvbF9maWxlX2NvbW1hbmQgKGV4ZWNkX3BhdGhuYW1lLCAwKTsKKworICAvKiBSZXNldCB0aGUgc2hhcmVkIGxpYnJhcnkgcGFja2FnZS4gIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGdldAorICAgICBhIHNobGliIGV2ZW50IHdoZW4gdGhlIGNoaWxkIHJlYWNoZXMgIl9zdGFydCIsIGF0IHdoaWNoIHBvaW50CisgICAgIHRoZSBkbGQgd2lsbCBoYXZlIGhhZCBhIGNoYW5jZSB0byBpbml0aWFsaXplIHRoZSBjaGlsZC4gKi8KKyAgU09MSUJfUkVTVEFSVCAoKTsKKyAgU09MSUJfQ1JFQVRFX0lORkVSSU9SX0hPT0sgKGluZmVyaW9yX3BpZCk7CisKKyAgLyogUmVpbnNlcnQgYWxsIGJyZWFrcG9pbnRzLiAgKFRob3NlIHdoaWNoIHdlcmUgc3ltYm9saWMgaGF2ZQorICAgICBiZWVuIHJlc2V0IHRvIHRoZSBwcm9wZXIgYWRkcmVzcyBpbiB0aGUgbmV3IGEub3V0LCB0aGFua3MKKyAgICAgdG8gc3ltYm9sX2ZpbGVfY29tbWFuZC4uLikgKi8KKyAgaW5zZXJ0X2JyZWFrcG9pbnRzICgpOworCisgIC8qIFRoZSBuZXh0IHJlc3VtZSBvZiB0aGlzIGluZmVyaW9yIHNob3VsZCBicmluZyBpdCB0byB0aGUgc2hsaWIKKyAgICAgc3RhcnR1cCBicmVha3BvaW50cy4gIChJZiB0aGUgdXNlciBoYWQgYWxzbyBzZXQgYnAncyBvbgorICAgICAibWFpbiIgZnJvbSB0aGUgb2xkIChwYXJlbnQpIHByb2Nlc3MsIHRoZW4gdGhleSdsbCBhdXRvLQorICAgICBtYXRpY2FsbHkgZ2V0IHJlc2V0IHRoZXJlIGluIHRoZSBuZXcgcHJvY2Vzcy4pICovCisjZW5kaWYKK30KKworLyogTm9uLXplcm8gaWYgd2UganVzdCBzaW11bGF0aW5nIGEgc2luZ2xlLXN0ZXAuICBUaGlzIGlzIG5lZWRlZAorICAgYmVjYXVzZSB3ZSBjYW5ub3QgcmVtb3ZlIHRoZSBicmVha3BvaW50cyBpbiB0aGUgaW5mZXJpb3IgcHJvY2VzcworICAgdW50aWwgYWZ0ZXIgdGhlIGB3YWl0JyBpbiBgd2FpdF9mb3JfaW5mZXJpb3InLiAgKi8KK3N0YXRpYyBpbnQgc2luZ2xlc3RlcF9icmVha3BvaW50c19pbnNlcnRlZF9wID0gMDsKKwwKKworLyogVGhpbmdzIHRvIGNsZWFuIHVwIGlmIHdlIFFVSVQgb3V0IG9mIHJlc3VtZSAoKS4gICovCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3Jlc3VtZV9jbGVhbnVwcyAoYXJnKQorICAgICBpbnQgYXJnOworeworICBub3JtYWxfc3RvcCAoKTsKK30KKworc3RhdGljIGNoYXIgc2NoZWRsb2NrX29mZltdID0gIm9mZiI7CitzdGF0aWMgY2hhciBzY2hlZGxvY2tfb25bXSA9ICJvbiI7CitzdGF0aWMgY2hhciBzY2hlZGxvY2tfc3RlcFtdID0gInN0ZXAiOworc3RhdGljIGNoYXIgKnNjaGVkdWxlcl9tb2RlID0gc2NoZWRsb2NrX29mZjsKK3N0YXRpYyBjaGFyICpzY2hlZHVsZXJfZW51bXNbXSA9Cit7c2NoZWRsb2NrX29mZiwgc2NoZWRsb2NrX29uLCBzY2hlZGxvY2tfc3RlcH07CisKK3N0YXRpYyB2b2lkCitzZXRfc2NoZWRsb2NrX2Z1bmMgKGFyZ3MsIGZyb21fdHR5LCBjKQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7CisgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjOworeworICBpZiAoYy0+dHlwZSA9PSBzZXRfY21kKQorICAgIGlmICghdGFyZ2V0X2Nhbl9sb2NrX3NjaGVkdWxlcikKKyAgICAgIHsKKwlzY2hlZHVsZXJfbW9kZSA9IHNjaGVkbG9ja19vZmY7CisJZXJyb3IgKCJUYXJnZXQgJyVzJyBjYW5ub3Qgc3VwcG9ydCB0aGlzIGNvbW1hbmQuIiwKKwkgICAgICAgdGFyZ2V0X3Nob3J0bmFtZSk7CisgICAgICB9Cit9CisKKworLyogUmVzdW1lIHRoZSBpbmZlcmlvciwgYnV0IGFsbG93IGEgUVVJVC4gIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSB1c2VyCisgICB3YW50cyB0byBpbnRlcnJ1cHQgc29tZSBsZW5ndGh5IHNpbmdsZS1zdGVwcGluZyBvcGVyYXRpb24KKyAgIChmb3IgY2hpbGQgcHJvY2Vzc2VzLCB0aGUgU0lHSU5UIGdvZXMgdG8gdGhlIGluZmVyaW9yLCBhbmQgc28KKyAgIHdlIGdldCBhIFNJR0lOVCByYW5kb21fc2lnbmFsLCBidXQgZm9yIHJlbW90ZSBkZWJ1Z2dpbmcgYW5kIHBlcmhhcHMKKyAgIG90aGVyIHRhcmdldHMsIHRoYXQncyBub3QgdHJ1ZSkuCisKKyAgIFNURVAgbm9uemVybyBpZiB3ZSBzaG91bGQgc3RlcCAoemVybyB0byBjb250aW51ZSBpbnN0ZWFkKS4KKyAgIFNJRyBpcyB0aGUgc2lnbmFsIHRvIGdpdmUgdGhlIGluZmVyaW9yICh6ZXJvIGZvciBub25lKS4gICovCit2b2lkCityZXN1bWUgKHN0ZXAsIHNpZykKKyAgICAgaW50IHN0ZXA7CisgICAgIGVudW0gdGFyZ2V0X3NpZ25hbCBzaWc7Cit7CisgIGludCBzaG91bGRfcmVzdW1lID0gMTsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jbGVhbnVwcyA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKQorCQkJCQkgICAgICAgcmVzdW1lX2NsZWFudXBzLCAwKTsKKyAgUVVJVDsKKworI2lmZGVmIENBTk5PVF9TVEVQX0JSRUFLUE9JTlQKKyAgLyogTW9zdCB0YXJnZXRzIGNhbiBzdGVwIGEgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiwgdGh1cyBleGVjdXRpbmcgaXQKKyAgICAgbm9ybWFsbHkuICBCdXQgaWYgdGhpcyBvbmUgY2Fubm90LCBqdXN0IGNvbnRpbnVlIGFuZCB3ZSB3aWxsIGhpdAorICAgICBpdCBhbnl3YXkuICAqLworICBpZiAoc3RlcCAmJiBicmVha3BvaW50c19pbnNlcnRlZCAmJiBicmVha3BvaW50X2hlcmVfcCAocmVhZF9wYyAoKSkpCisgICAgc3RlcCA9IDA7CisjZW5kaWYKKworICBpZiAoU09GVFdBUkVfU0lOR0xFX1NURVBfUCAmJiBzdGVwKQorICAgIHsKKyAgICAgIC8qIERvIGl0IHRoZSBoYXJkIHdheSwgdy90ZW1wIGJyZWFrcG9pbnRzICovCisgICAgICBTT0ZUV0FSRV9TSU5HTEVfU1RFUCAoc2lnLCAxIC8qaW5zZXJ0LWJyZWFrcG9pbnRzKi8gKTsKKyAgICAgIC8qIC4uLmFuZCBkb24ndCBhc2sgaGFyZHdhcmUgdG8gZG8gaXQuICAqLworICAgICAgc3RlcCA9IDA7CisgICAgICAvKiBhbmQgZG8gbm90IHB1bGwgdGhlc2UgYnJlYWtwb2ludHMgdW50aWwgYWZ0ZXIgYSBgd2FpdCcgaW4KKyAgICAgICAgIGB3YWl0X2Zvcl9pbmZlcmlvcicgKi8KKyAgICAgIHNpbmdsZXN0ZXBfYnJlYWtwb2ludHNfaW5zZXJ0ZWRfcCA9IDE7CisgICAgfQorCisgIC8qIEhhbmRsZSBhbnkgb3B0aW1pemVkIHN0b3JlcyB0byB0aGUgaW5mZXJpb3IgTk9XLi4uICAqLworI2lmZGVmIERPX0RFRkVSUkVEX1NUT1JFUworICBET19ERUZFUlJFRF9TVE9SRVM7CisjZW5kaWYKKworI2lmZGVmIEhQVVhIUFBBCisgIC8qIElmIHRoZXJlIHdlcmUgYW55IGZvcmtzL3Zmb3Jrcy9leGVjcyB0aGF0IHdlcmUgY2F1Z2h0IGFuZCBhcmUKKyAgICAgbm93IHRvIGJlIGZvbGxvd2VkLCB0aGVuIGRvIHNvLiAqLworICBzd2l0Y2ggKHBlbmRpbmdfZm9sbG93LmtpbmQpCisgICAgeworICAgIGNhc2UgKFRBUkdFVF9XQUlUS0lORF9GT1JLRUQpOgorICAgICAgcGVuZGluZ19mb2xsb3cua2luZCA9IFRBUkdFVF9XQUlUS0lORF9TUFVSSU9VUzsKKyAgICAgIGZvbGxvd19mb3JrIChpbmZlcmlvcl9waWQsIHBlbmRpbmdfZm9sbG93LmZvcmtfZXZlbnQuY2hpbGRfcGlkKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAoVEFSR0VUX1dBSVRLSU5EX1ZGT1JLRUQpOgorICAgICAgeworCWludCBzYXdfY2hpbGRfZXhlYyA9IHBlbmRpbmdfZm9sbG93LmZvcmtfZXZlbnQuc2F3X2NoaWxkX2V4ZWM7CisKKwlwZW5kaW5nX2ZvbGxvdy5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NQVVJJT1VTOworCWZvbGxvd192Zm9yayAoaW5mZXJpb3JfcGlkLCBwZW5kaW5nX2ZvbGxvdy5mb3JrX2V2ZW50LmNoaWxkX3BpZCk7CisKKwkvKiBEaWQgd2UgZm9sbG93IHRoZSBjaGlsZCwgYnV0IG5vdCB5ZXQgc2VlIHRoZSBjaGlsZCdzIGV4ZWMgZXZlbnQ/CisgICAgICAgICAgICAgSWYgc28sIHRoZW4gaXQgYWN0dWFsbHkgb3VnaHQgdG8gYmUgd2FpdGluZyBmb3IgdXM7IHdlIHJlc3BvbmQgdG8KKyAgICAgICAgICAgICBwYXJlbnQgdmZvcmsgZXZlbnRzLiAgV2UgZG9uJ3QgYWN0dWFsbHkgd2FudCB0byByZXN1bWUgdGhlIGNoaWxkCisgICAgICAgICAgICAgaW4gdGhpcyBzaXR1YXRpb247IHdlIHdhbnQgdG8ganVzdCBnZXQgaXRzIGV4ZWMgZXZlbnQuICovCisJaWYgKCFzYXdfY2hpbGRfZXhlYyAmJgorCSAgICAoaW5mZXJpb3JfcGlkID09IHBlbmRpbmdfZm9sbG93LmZvcmtfZXZlbnQuY2hpbGRfcGlkKSkKKwkgIHNob3VsZF9yZXN1bWUgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIChUQVJHRVRfV0FJVEtJTkRfRVhFQ0QpOgorICAgICAgLyogSWYgd2Ugc2F3IGEgdmZvcmsgZXZlbnQgYnV0IGNvdWxkbid0IGZvbGxvdyBpdCB1bnRpbCB3ZSBzYXcKKyAgICAgICAgICAgYW4gZXhlYywgdGhlbiBub3cgbWlnaHQgYmUgdGhlIHRpbWUhICovCisgICAgICBwZW5kaW5nX2ZvbGxvdy5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NQVVJJT1VTOworICAgICAgLyogZm9sbG93X2V4ZWMgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGV4ZWMgZXZlbnQgaXMgc2Vlbi4gKi8KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBIUFVYSFBQQSAqLworCisgIC8qIEluc3RhbGwgaW5mZXJpb3IncyB0ZXJtaW5hbCBtb2Rlcy4gICovCisgIHRhcmdldF90ZXJtaW5hbF9pbmZlcmlvciAoKTsKKworICBpZiAoc2hvdWxkX3Jlc3VtZSkKKyAgICB7CisjaWZkZWYgSFBVWEhQUEEKKyAgICAgIGlmICh0aHJlYWRfc3RlcF9uZWVkZWQpCisJeworCSAgLyogV2Ugc3RvcHBlZCBvbiBhIEJQVCBpbnN0cnVjdGlvbjsKKwkgICAgIGRvbid0IGNvbnRpbnVlIG90aGVyIHRocmVhZHMgYW5kCisJICAgICBqdXN0IHN0ZXAgdGhpcyB0aHJlYWQuICovCisJICB0aHJlYWRfc3RlcF9uZWVkZWQgPSAwOworCisJICBpZiAoIWJyZWFrcG9pbnRfaGVyZV9wIChyZWFkX3BjICgpKSkKKwkgICAgeworCSAgICAgIC8qIEJyZWFrcG9pbnQgZGVsZXRlZDogb2sgdG8gZG8gcmVndWxhciByZXN1bWUKKwkJIHdoZXJlIGFsbCB0aGUgdGhyZWFkcyBlaXRoZXIgc3RlcCBvciBjb250aW51ZS4gKi8KKwkgICAgICB0YXJnZXRfcmVzdW1lICgtMSwgc3RlcCwgc2lnKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCFzdGVwKQorCQl7CisJCSAgd2FybmluZyAoIkludGVybmFsIGVycm9yLCBjaGFuZ2luZyBjb250aW51ZSB0byBzdGVwLiIpOworCQkgIHJlbW92ZV9icmVha3BvaW50cyAoKTsKKwkJICBicmVha3BvaW50c19pbnNlcnRlZCA9IDA7CisJCSAgdHJhcF9leHBlY3RlZCA9IDE7CisJCSAgc3RlcCA9IDE7CisJCX0KKworCSAgICAgIHRhcmdldF9yZXN1bWUgKGluZmVyaW9yX3BpZCwgc3RlcCwgc2lnKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKyNlbmRpZiAvKiBIUFVYSFBQQSAqLworCXsKKwkgIC8qIFZhbmlsbGEgcmVzdW1lLiAqLworCisJICBpZiAoKHNjaGVkdWxlcl9tb2RlID09IHNjaGVkbG9ja19vbikgfHwKKwkgICAgICAoc2NoZWR1bGVyX21vZGUgPT0gc2NoZWRsb2NrX3N0ZXAgJiYgc3RlcCAhPSAwKSkKKwkgICAgdGFyZ2V0X3Jlc3VtZSAoaW5mZXJpb3JfcGlkLCBzdGVwLCBzaWcpOworCSAgZWxzZQorCSAgICB0YXJnZXRfcmVzdW1lICgtMSwgc3RlcCwgc2lnKTsKKwl9CisgICAgfQorCisgIGRpc2NhcmRfY2xlYW51cHMgKG9sZF9jbGVhbnVwcyk7Cit9CisMCisKKy8qIENsZWFyIG91dCBhbGwgdmFyaWFibGVzIHNheWluZyB3aGF0IHRvIGRvIHdoZW4gaW5mZXJpb3IgaXMgY29udGludWVkLgorICAgRmlyc3QgZG8gdGhpcywgdGhlbiBzZXQgdGhlIG9uZXMgeW91IHdhbnQsIHRoZW4gY2FsbCBgcHJvY2VlZCcuICAqLworCit2b2lkCitjbGVhcl9wcm9jZWVkX3N0YXR1cyAoKQoreworICB0cmFwX2V4cGVjdGVkID0gMDsKKyAgc3RlcF9yYW5nZV9zdGFydCA9IDA7CisgIHN0ZXBfcmFuZ2VfZW5kID0gMDsKKyAgc3RlcF9mcmFtZV9hZGRyZXNzID0gMDsKKyAgc3RlcF9vdmVyX2NhbGxzID0gLTE7CisgIHN0b3BfYWZ0ZXJfdHJhcCA9IDA7CisgIHN0b3Bfc29vbl9xdWlldGx5ID0gMDsKKyAgcHJvY2VlZF90b19maW5pc2ggPSAwOworICBicmVha3BvaW50X3Byb2NlZWRlZCA9IDE7CS8qIFdlJ3JlIGFib3V0IHRvIHByb2NlZWQuLi4gKi8KKworICAvKiBEaXNjYXJkIGFueSByZW1haW5pbmcgY29tbWFuZHMgb3Igc3RhdHVzIGZyb20gcHJldmlvdXMgc3RvcC4gICovCisgIGJwc3RhdF9jbGVhciAoJnN0b3BfYnBzdGF0KTsKK30KKworLyogQmFzaWMgcm91dGluZSBmb3IgY29udGludWluZyB0aGUgcHJvZ3JhbSBpbiB2YXJpb3VzIGZhc2hpb25zLgorCisgICBBRERSIGlzIHRoZSBhZGRyZXNzIHRvIHJlc3VtZSBhdCwgb3IgLTEgZm9yIHJlc3VtZSB3aGVyZSBzdG9wcGVkLgorICAgU0lHR05BTCBpcyB0aGUgc2lnbmFsIHRvIGdpdmUgaXQsIG9yIDAgZm9yIG5vbmUsCisgICAgIG9yIC0xIGZvciBhY3QgYWNjb3JkaW5nIHRvIGhvdyBpdCBzdG9wcGVkLgorICAgU1RFUCBpcyBub256ZXJvIGlmIHNob3VsZCB0cmFwIGFmdGVyIG9uZSBpbnN0cnVjdGlvbi4KKyAgICAgLTEgbWVhbnMgcmV0dXJuIGFmdGVyIHRoYXQgYW5kIHByaW50IG5vdGhpbmcuCisgICAgIFlvdSBzaG91bGQgcHJvYmFibHkgc2V0IHZhcmlvdXMgc3RlcF8uLi4gdmFyaWFibGVzCisgICAgIGJlZm9yZSBjYWxsaW5nIGhlcmUsIGlmIHlvdSBhcmUgc3RlcHBpbmcuCisKKyAgIFlvdSBzaG91bGQgY2FsbCBjbGVhcl9wcm9jZWVkX3N0YXR1cyBiZWZvcmUgY2FsbGluZyBwcm9jZWVkLiAgKi8KKwordm9pZAorcHJvY2VlZCAoYWRkciwgc2lnZ25hbCwgc3RlcCkKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGVudW0gdGFyZ2V0X3NpZ25hbCBzaWdnbmFsOworICAgICBpbnQgc3RlcDsKK3sKKyAgaW50IG9uZXByb2MgPSAwOworCisgIGlmIChzdGVwID4gMCkKKyAgICBzdGVwX3N0YXJ0X2Z1bmN0aW9uID0gZmluZF9wY19mdW5jdGlvbiAocmVhZF9wYyAoKSk7CisgIGlmIChzdGVwIDwgMCkKKyAgICBzdG9wX2FmdGVyX3RyYXAgPSAxOworCisgIGlmIChhZGRyID09IChDT1JFX0FERFIpIC0gMSkKKyAgICB7CisgICAgICAvKiBJZiB0aGVyZSBpcyBhIGJyZWFrcG9pbnQgYXQgdGhlIGFkZHJlc3Mgd2Ugd2lsbCByZXN1bWUgYXQsCisJIHN0ZXAgb25lIGluc3RydWN0aW9uIGJlZm9yZSBpbnNlcnRpbmcgYnJlYWtwb2ludHMKKwkgc28gdGhhdCB3ZSBkbyBub3Qgc3RvcCByaWdodCBhd2F5IChhbmQgcmVwb3J0IGEgc2Vjb25kCisgICAgICAgICBoaXQgYXQgdGhpcyBicmVha3BvaW50KS4gICovCisKKyAgICAgIGlmIChyZWFkX3BjICgpID09IHN0b3BfcGMgJiYgYnJlYWtwb2ludF9oZXJlX3AgKHJlYWRfcGMgKCkpKQorCW9uZXByb2MgPSAxOworCisjaWZuZGVmIFNURVBfU0tJUFNfREVMQVkKKyNkZWZpbmUgU1RFUF9TS0lQU19ERUxBWShwYykgKDApCisjZGVmaW5lIFNURVBfU0tJUFNfREVMQVlfUCAoMCkKKyNlbmRpZgorICAgICAgLyogQ2hlY2sgYnJlYWtwb2ludF9oZXJlX3AgZmlyc3QsIGJlY2F1c2UgYnJlYWtwb2ludF9oZXJlX3AgaXMgZmFzdAorCSAoaXQganVzdCBjaGVja3MgaW50ZXJuYWwgR0RCIGRhdGEgc3RydWN0dXJlcykgYW5kIFNURVBfU0tJUFNfREVMQVkKKwkgaXMgc2xvdyAoaXQgbmVlZHMgdG8gcmVhZCBtZW1vcnkgZnJvbSB0aGUgdGFyZ2V0KS4gICovCisgICAgICBpZiAoU1RFUF9TS0lQU19ERUxBWV9QCisJICAmJiBicmVha3BvaW50X2hlcmVfcCAocmVhZF9wYyAoKSArIDQpCisJICAmJiBTVEVQX1NLSVBTX0RFTEFZIChyZWFkX3BjICgpKSkKKwlvbmVwcm9jID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3cml0ZV9wYyAoYWRkcik7CisKKyAgICAgIC8qIE5ldyBhZGRyZXNzOyB3ZSBkb24ndCBuZWVkIHRvIHNpbmdsZS1zdGVwIGEgdGhyZWFkCisJIG92ZXIgYSBicmVha3BvaW50IHdlIGp1c3QgaGl0LCAnY2F1c2Ugd2UgYXJlbid0CisJIGNvbnRpbnVpbmcgZnJvbSB0aGVyZS4KKworCSBJdCdzIG5vdCB3b3J0aCB3b3JyeWluZyBhYm91dCB0aGUgY2FzZSB3aGVyZSBhIHVzZXIKKwkgYXNrcyBmb3IgYSAianVtcCIgYXQgdGhlIGN1cnJlbnQgUEMtLWlmIHRoZXkgZ2V0IHRoZQorCSBoaWNjdXAgb2YgcmUtaGl0aW5nIGEgaGl0IGJyZWFrcG9pbnQsIHdoYXQgZWxzZSBkbworCSB0aGV5IGV4cGVjdD8gKi8KKyAgICAgIHRocmVhZF9zdGVwX25lZWRlZCA9IDA7CisgICAgfQorCisjaWZkZWYgUFJFUEFSRV9UT19QUk9DRUVECisgIC8qIEluIGEgbXVsdGktdGhyZWFkZWQgdGFzayB3ZSBtYXkgc2VsZWN0IGFub3RoZXIgdGhyZWFkCisgICAgIGFuZCB0aGVuIGNvbnRpbnVlIG9yIHN0ZXAuCisKKyAgICAgQnV0IGlmIHRoZSBvbGQgdGhyZWFkIHdhcyBzdG9wcGVkIGF0IGEgYnJlYWtwb2ludCwgaXQKKyAgICAgd2lsbCBpbW1lZGlhdGVseSBjYXVzZSBhbm90aGVyIGJyZWFrcG9pbnQgc3RvcCB3aXRob3V0CisgICAgIGFueSBleGVjdXRpb24gKGkuZS4gaXQgd2lsbCByZXBvcnQgYSBicmVha3BvaW50IGhpdAorICAgICBpbmNvcnJlY3RseSkuICBTbyB3ZSBtdXN0IHN0ZXAgb3ZlciBpdCBmaXJzdC4KKworICAgICBQUkVQQVJFX1RPX1BST0NFRUQgY2hlY2tzIHRoZSBjdXJyZW50IHRocmVhZCBhZ2FpbnN0IHRoZSB0aHJlYWQKKyAgICAgdGhhdCByZXBvcnRlZCB0aGUgbW9zdCByZWNlbnQgZXZlbnQuICBJZiBhIHN0ZXAtb3ZlciBpcyByZXF1aXJlZAorICAgICBpdCByZXR1cm5zIFRSVUUgYW5kIHNldHMgdGhlIGN1cnJlbnQgdGhyZWFkIHRvIHRoZSBvbGQgdGhyZWFkLiAqLworICBpZiAoUFJFUEFSRV9UT19QUk9DRUVEICgpICYmIGJyZWFrcG9pbnRfaGVyZV9wIChyZWFkX3BjICgpKSkKKyAgICB7CisgICAgICBvbmVwcm9jID0gMTsKKyAgICAgIHRocmVhZF9zdGVwX25lZWRlZCA9IDE7CisgICAgfQorCisjZW5kaWYgLyogUFJFUEFSRV9UT19QUk9DRUVEICovCisKKyNpZmRlZiBIUF9PU19CVUcKKyAgaWYgKHRyYXBfZXhwZWN0ZWRfYWZ0ZXJfY29udGludWUpCisgICAgeworICAgICAgLyogSWYgKHN0ZXAgPT0gMCksIGEgdHJhcCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGFmdGVyCisJIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpcyBleGVjdXRlZC4gIEZvcmNlIHN0ZXAgb25lCisJIGluc3RydWN0aW9uIHRvIGNsZWFyIHRoaXMgY29uZGl0aW9uLiAgVGhpcyBzaG91bGQgbm90IG9jY3VyCisJIGlmIHN0ZXAgaXMgbm9uemVybywgYnV0IGl0IGlzIGhhcm1sZXNzIGluIHRoYXQgY2FzZS4gICovCisgICAgICBvbmVwcm9jID0gMTsKKyAgICAgIHRyYXBfZXhwZWN0ZWRfYWZ0ZXJfY29udGludWUgPSAwOworICAgIH0KKyNlbmRpZiAvKiBIUF9PU19CVUcgKi8KKworICBpZiAob25lcHJvYykKKyAgICAvKiBXZSB3aWxsIGdldCBhIHRyYWNlIHRyYXAgYWZ0ZXIgb25lIGluc3RydWN0aW9uLgorICAgICAgIENvbnRpbnVlIGl0IGF1dG9tYXRpY2FsbHkgYW5kIGluc2VydCBicmVha3BvaW50cyB0aGVuLiAgKi8KKyAgICB0cmFwX2V4cGVjdGVkID0gMTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGludCB0ZW1wID0gaW5zZXJ0X2JyZWFrcG9pbnRzICgpOworICAgICAgaWYgKHRlbXApCisJeworCSAgcHJpbnRfc3lzX2Vycm1zZyAoInB0cmFjZSIsIHRlbXApOworCSAgZXJyb3IgKCJDYW5ub3QgaW5zZXJ0IGJyZWFrcG9pbnRzLlxuXAorVGhlIHNhbWUgcHJvZ3JhbSBtYXkgYmUgcnVubmluZyBpbiBhbm90aGVyIHByb2Nlc3MuIik7CisJfQorCisgICAgICBicmVha3BvaW50c19pbnNlcnRlZCA9IDE7CisgICAgfQorCisgIGlmIChzaWdnbmFsICE9IFRBUkdFVF9TSUdOQUxfREVGQVVMVCkKKyAgICBzdG9wX3NpZ25hbCA9IHNpZ2duYWw7CisgIC8qIElmIHRoaXMgc2lnbmFsIHNob3VsZCBub3QgYmUgc2VlbiBieSBwcm9ncmFtLAorICAgICBnaXZlIGl0IHplcm8uICBVc2VkIGZvciBkZWJ1Z2dpbmcgc2lnbmFscy4gICovCisgIGVsc2UgaWYgKCFzaWduYWxfcHJvZ3JhbVtzdG9wX3NpZ25hbF0pCisgICAgc3RvcF9zaWduYWwgPSBUQVJHRVRfU0lHTkFMXzA7CisKKyAgYW5ub3RhdGVfc3RhcnRpbmcgKCk7CisKKyAgLyogTWFrZSBzdXJlIHRoYXQgb3V0cHV0IGZyb20gR0RCIGFwcGVhcnMgYmVmb3JlIG91dHB1dCBmcm9tIHRoZQorICAgICBpbmZlcmlvci4gICovCisgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisKKyAgLyogUmVzdW1lIGluZmVyaW9yLiAgKi8KKyAgcmVzdW1lIChvbmVwcm9jIHx8IHN0ZXAgfHwgYnBzdGF0X3Nob3VsZF9zdGVwICgpLCBzdG9wX3NpZ25hbCk7CisKKyAgLyogV2FpdCBmb3IgaXQgdG8gc3RvcCAoaWYgbm90IHN0YW5kYWxvbmUpCisgICAgIGFuZCBpbiBhbnkgY2FzZSBkZWNvZGUgd2h5IGl0IHN0b3BwZWQsIGFuZCBhY3QgYWNjb3JkaW5nbHkuICAqLworCisgIHdhaXRfZm9yX2luZmVyaW9yICgpOworICBub3JtYWxfc3RvcCAoKTsKK30KKworLyogUmVjb3JkIHRoZSBwYyBhbmQgc3Agb2YgdGhlIHByb2dyYW0gdGhlIGxhc3QgdGltZSBpdCBzdG9wcGVkLgorICAgVGhlc2UgYXJlIGp1c3QgdXNlZCBpbnRlcm5hbGx5IGJ5IHdhaXRfZm9yX2luZmVyaW9yLCBidXQgbmVlZAorICAgdG8gYmUgcHJlc2VydmVkIG92ZXIgY2FsbHMgdG8gaXQgYW5kIGNsZWFyZWQgd2hlbiB0aGUgaW5mZXJpb3IKKyAgIGlzIHN0YXJ0ZWQuICAqLworc3RhdGljIENPUkVfQUREUiBwcmV2X3BjOworc3RhdGljIENPUkVfQUREUiBwcmV2X2Z1bmNfc3RhcnQ7CitzdGF0aWMgY2hhciAqcHJldl9mdW5jX25hbWU7CisMCisKKy8qIFN0YXJ0IHJlbW90ZS1kZWJ1Z2dpbmcgb2YgYSBtYWNoaW5lIG92ZXIgYSBzZXJpYWwgbGluay4gICovCisKK3ZvaWQKK3N0YXJ0X3JlbW90ZSAoKQoreworICBpbml0X3RocmVhZF9saXN0ICgpOworICBpbml0X3dhaXRfZm9yX2luZmVyaW9yICgpOworICBzdG9wX3Nvb25fcXVpZXRseSA9IDE7CisgIHRyYXBfZXhwZWN0ZWQgPSAwOworICB3YWl0X2Zvcl9pbmZlcmlvciAoKTsKKyAgbm9ybWFsX3N0b3AgKCk7Cit9CisKKy8qIEluaXRpYWxpemUgc3RhdGljIHZhcnMgd2hlbiBhIG5ldyBpbmZlcmlvciBiZWdpbnMuICAqLworCit2b2lkCitpbml0X3dhaXRfZm9yX2luZmVyaW9yICgpCit7CisgIC8qIFRoZXNlIGFyZSBtZWFuaW5nbGVzcyB1bnRpbCB0aGUgZmlyc3QgdGltZSB0aHJvdWdoIHdhaXRfZm9yX2luZmVyaW9yLiAgKi8KKyAgcHJldl9wYyA9IDA7CisgIHByZXZfZnVuY19zdGFydCA9IDA7CisgIHByZXZfZnVuY19uYW1lID0gTlVMTDsKKworI2lmZGVmIEhQX09TX0JVRworICB0cmFwX2V4cGVjdGVkX2FmdGVyX2NvbnRpbnVlID0gMDsKKyNlbmRpZgorICBicmVha3BvaW50c19pbnNlcnRlZCA9IDA7CisgIGJyZWFrcG9pbnRfaW5pdF9pbmZlcmlvciAoaW5mX3N0YXJ0aW5nKTsKKworICAvKiBEb24ndCBjb25mdXNlIGZpcnN0IGNhbGwgdG8gcHJvY2VlZCgpLiAqLworICBzdG9wX3NpZ25hbCA9IFRBUkdFVF9TSUdOQUxfMDsKKworICAvKiBUaGUgZmlyc3QgcmVzdW1lIGlzIG5vdCBmb2xsb3dpbmcgYSBmb3JrL3Zmb3JrL2V4ZWMuICovCisgIHBlbmRpbmdfZm9sbG93LmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1BVUklPVVM7CS8qIEkuZS4sIG5vbmUuICovCisgIHBlbmRpbmdfZm9sbG93LmZvcmtfZXZlbnQuc2F3X3BhcmVudF9mb3JrID0gMDsKKyAgcGVuZGluZ19mb2xsb3cuZm9ya19ldmVudC5zYXdfY2hpbGRfZm9yayA9IDA7CisgIHBlbmRpbmdfZm9sbG93LmZvcmtfZXZlbnQuc2F3X2NoaWxkX2V4ZWMgPSAwOworCisgIC8qIFNlZSB3YWl0X2Zvcl9pbmZlcmlvcidzIGhhbmRsaW5nIG9mIFNZU0NBTExfRU5UUlkvUkVUVVJOIGV2ZW50cy4gKi8KKyAgbnVtYmVyX29mX3RocmVhZHNfaW5fc3lzY2FsbHMgPSAwOworCisgIGNsZWFyX3Byb2NlZWRfc3RhdHVzICgpOworfQorCitzdGF0aWMgdm9pZAorZGVsZXRlX2JyZWFrcG9pbnRfY3VycmVudF9jb250ZW50cyAoYXJnKQorICAgICBQVFIgYXJnOworeworICBzdHJ1Y3QgYnJlYWtwb2ludCAqKmJyZWFrcG9pbnRwID0gKHN0cnVjdCBicmVha3BvaW50ICoqKSBhcmc7CisgIGlmICgqYnJlYWtwb2ludHAgIT0gTlVMTCkKKyAgICB7CisgICAgICBkZWxldGVfYnJlYWtwb2ludCAoKmJyZWFrcG9pbnRwKTsKKyAgICAgICpicmVha3BvaW50cCA9IE5VTEw7CisgICAgfQorfQorDAorLyogV2FpdCBmb3IgY29udHJvbCB0byByZXR1cm4gZnJvbSBpbmZlcmlvciB0byBkZWJ1Z2dlci4KKyAgIElmIGluZmVyaW9yIGdldHMgYSBzaWduYWwsIHdlIG1heSBkZWNpZGUgdG8gc3RhcnQgaXQgdXAgYWdhaW4KKyAgIGluc3RlYWQgb2YgcmV0dXJuaW5nLiAgVGhhdCBpcyB3aHkgdGhlcmUgaXMgYSBsb29wIGluIHRoaXMgZnVuY3Rpb24uCisgICBXaGVuIHRoaXMgZnVuY3Rpb24gYWN0dWFsbHkgcmV0dXJucyBpdCBtZWFucyB0aGUgaW5mZXJpb3IKKyAgIHNob3VsZCBiZSBsZWZ0IHN0b3BwZWQgYW5kIEdEQiBzaG91bGQgcmVhZCBtb3JlIGNvbW1hbmRzLiAgKi8KKwordm9pZAord2FpdF9mb3JfaW5mZXJpb3IgKCkKK3sKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jbGVhbnVwczsKKyAgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzIHc7CisgIGludCBhbm90aGVyX3RyYXA7CisgIGludCByYW5kb21fc2lnbmFsID0gMDsKKyAgQ09SRV9BRERSIHN0b3BfZnVuY19zdGFydDsKKyAgQ09SRV9BRERSIHN0b3BfZnVuY19lbmQ7CisgIGNoYXIgKnN0b3BfZnVuY19uYW1lOworI2lmIDAKKyAgQ09SRV9BRERSIHByb2xvZ3VlX3BjID0gMDsKKyNlbmRpZgorICBDT1JFX0FERFIgdG1wOworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKyAgaW50IHJlbW92ZV9icmVha3BvaW50c19vbl9mb2xsb3dpbmdfc3RlcCA9IDA7CisgIGludCBjdXJyZW50X2xpbmU7CisgIHN0cnVjdCBzeW10YWIgKmN1cnJlbnRfc3ltdGFiOworICBpbnQgaGFuZGxpbmdfbG9uZ2ptcCA9IDA7CS8qIEZJWE1FICovCisgIGludCBwaWQ7CisgIGludCBzYXZlZF9pbmZlcmlvcl9waWQ7CisgIGludCB1cGRhdGVfc3RlcF9zcCA9IDA7CisgIGludCBzdGVwcGluZ190aHJvdWdoX3NvbGliX2FmdGVyX2NhdGNoID0gMDsKKyAgYnBzdGF0IHN0ZXBwaW5nX3Rocm91Z2hfc29saWJfY2F0Y2hwb2ludHMgPSBOVUxMOworICBpbnQgZW5hYmxlX2h3X3dhdGNocG9pbnRzX2FmdGVyX3dhaXQgPSAwOworICBpbnQgc3RlcHBpbmdfdGhyb3VnaF9zaWd0cmFtcCA9IDA7CisgIGludCBuZXdfdGhyZWFkX2V2ZW50OworCisjaWZkZWYgSEFWRV9OT05TVEVQUEFCTEVfV0FUQ0hQT0lOVAorICBpbnQgc3RlcHBlZF9hZnRlcl9zdG9wcGVkX2J5X3dhdGNocG9pbnQ7CisjZW5kaWYKKworICBvbGRfY2xlYW51cHMgPSBtYWtlX2NsZWFudXAgKGRlbGV0ZV9icmVha3BvaW50X2N1cnJlbnRfY29udGVudHMsCisJCQkgICAgICAgJnN0ZXBfcmVzdW1lX2JyZWFrcG9pbnQpOworICBtYWtlX2NsZWFudXAgKGRlbGV0ZV9icmVha3BvaW50X2N1cnJlbnRfY29udGVudHMsCisJCSZ0aHJvdWdoX3NpZ3RyYW1wX2JyZWFrcG9pbnQpOworICBzYWwgPSBmaW5kX3BjX2xpbmUgKHByZXZfcGMsIDApOworICBjdXJyZW50X2xpbmUgPSBzYWwubGluZTsKKyAgY3VycmVudF9zeW10YWIgPSBzYWwuc3ltdGFiOworCisgIC8qIEFyZSB3ZSBzdGVwcGluZz8gICovCisjZGVmaW5lIENVUlJFTlRMWV9TVEVQUElORygpIFwKKyAgKCh0aHJvdWdoX3NpZ3RyYW1wX2JyZWFrcG9pbnQgPT0gTlVMTCBcCisgICAgJiYgIWhhbmRsaW5nX2xvbmdqbXAgXAorICAgICYmICgoc3RlcF9yYW5nZV9lbmQgJiYgc3RlcF9yZXN1bWVfYnJlYWtwb2ludCA9PSBOVUxMKSBcCisJfHwgdHJhcF9leHBlY3RlZCkpIFwKKyAgIHx8IHN0ZXBwaW5nX3Rocm91Z2hfc29saWJfYWZ0ZXJfY2F0Y2ggXAorICAgfHwgYnBzdGF0X3Nob3VsZF9zdGVwICgpKQorICA7CisgIHRocmVhZF9zdGVwX25lZWRlZCA9IDA7CisKKyNpZmRlZiBIUFVYSFBQQQorICAvKiBXZSdsbCB1cGRhdGUgdGhpcyBpZiAmIHdoZW4gd2Ugc3dpdGNoIHRvIGEgbmV3IHRocmVhZC4gKi8KKyAgc3dpdGNoZWRfZnJvbV9pbmZlcmlvcl9waWQgPSBpbmZlcmlvcl9waWQ7CisjZW5kaWYKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBleHRlcm4gaW50IG92ZXJsYXlfY2FjaGVfaW52YWxpZDsJLyogZGVjbGFyZWQgaW4gc3ltZmlsZS5oICovCisKKyAgICAgIG92ZXJsYXlfY2FjaGVfaW52YWxpZCA9IDE7CisKKyAgICAgIC8qIFdlIGhhdmUgdG8gaW52YWxpZGF0ZSB0aGUgcmVnaXN0ZXJzIEJFRk9SRSBjYWxsaW5nIHRhcmdldF93YWl0IGJlY2F1c2UKKwkgdGhleSBjYW4gYmUgbG9hZGVkIGZyb20gdGhlIHRhcmdldCB3aGlsZSBpbiB0YXJnZXRfd2FpdC4gIFRoaXMgbWFrZXMKKwkgcmVtb3RlIGRlYnVnZ2luZyBhIGJpdCBtb3JlIGVmZmljaWVudCBmb3IgdGhvc2UgdGFyZ2V0cyB0aGF0IHByb3ZpZGUKKwkgY3JpdGljYWwgcmVnaXN0ZXJzIGFzIHBhcnQgb2YgdGhlaXIgbm9ybWFsIHN0YXR1cyBtZWNoYW5pc20uICovCisKKyAgICAgIHJlZ2lzdGVyc19jaGFuZ2VkICgpOworCisgICAgICBpZiAodGFyZ2V0X3dhaXRfaG9vaykKKwlwaWQgPSB0YXJnZXRfd2FpdF9ob29rICgtMSwgJncpOworICAgICAgZWxzZQorCXBpZCA9IHRhcmdldF93YWl0ICgtMSwgJncpOworCisgICAgICAvKiBTaW5jZSB3ZSd2ZSBkb25lIGEgd2FpdCwgd2UgaGF2ZSBhIG5ldyBldmVudC4gIERvbid0IGNhcnJ5CisgICAgICAgICBvdmVyIGFueSBleHBlY3RhdGlvbnMgYWJvdXQgbmVlZGluZyB0byBzdGVwIG92ZXIgYQorICAgICAgICAgYnJlYWtwb2ludC4gKi8KKyAgICAgIHRocmVhZF9zdGVwX25lZWRlZCA9IDA7CisKKyAgICAgIC8qIFNlZSBjb21tZW50cyB3aGVyZSBhIFRBUkdFVF9XQUlUS0lORF9TWVNDQUxMX1JFVFVSTiBldmVudCBpcworICAgICAgICAgc2VydmljZWQgaW4gdGhpcyBsb29wLCBiZWxvdy4gKi8KKyAgICAgIGlmIChlbmFibGVfaHdfd2F0Y2hwb2ludHNfYWZ0ZXJfd2FpdCkKKwl7CisJICBUQVJHRVRfRU5BQkxFX0hXX1dBVENIUE9JTlRTIChpbmZlcmlvcl9waWQpOworCSAgZW5hYmxlX2h3X3dhdGNocG9pbnRzX2FmdGVyX3dhaXQgPSAwOworCX0KKworCisjaWZkZWYgSEFWRV9OT05TVEVQUEFCTEVfV0FUQ0hQT0lOVAorICAgICAgc3RlcHBlZF9hZnRlcl9zdG9wcGVkX2J5X3dhdGNocG9pbnQgPSAwOworI2VuZGlmCisKKyAgICAgIC8qIEdyb3NzLgorCisgICAgICAgV2UgZ290byB0aGlzIGxhYmVsIGZyb20gZWxzZXdoZXJlIGluIHdhaXRfZm9yX2luZmVyaW9yIHdoZW4gd2Ugd2FudAorICAgICAgIHRvIGNvbnRpbnVlIHRoZSBtYWluIGxvb3Agd2l0aG91dCBjYWxsaW5nICJ3YWl0IiBhbmQgdHJhc2hpbmcgdGhlCisgICAgICAgd2FpdHN0YXR1cyBjb250YWluZWQgaW4gVy4gICovCisgICAgaGF2ZV93YWl0ZWQ6CisKKyAgICAgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7CisKKyAgICAgIC8qIElmIGl0J3MgYSBuZXcgcHJvY2VzcywgYWRkIGl0IHRvIHRoZSB0aHJlYWQgZGF0YWJhc2UgKi8KKworICAgICAgbmV3X3RocmVhZF9ldmVudCA9ICgocGlkICE9IGluZmVyaW9yX3BpZCkgJiYgIWluX3RocmVhZF9saXN0IChwaWQpKTsKKworICAgICAgaWYgKHcua2luZCAhPSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVECisJICAmJiB3LmtpbmQgIT0gVEFSR0VUX1dBSVRLSU5EX1NJR05BTExFRAorCSAgJiYgbmV3X3RocmVhZF9ldmVudCkKKwl7CisJICBhZGRfdGhyZWFkIChwaWQpOworCisKKyNpZmRlZiBIUFVYSFBQQQorCSAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiW05ldyAlc11cbiIsCisJCQkgICAgICB0YXJnZXRfcGlkX29yX3RpZF90b19zdHIgKHBpZCkpOworCisjZWxzZQorCSAgcHJpbnRmX2ZpbHRlcmVkICgiW05ldyAlc11cbiIsIHRhcmdldF9waWRfdG9fc3RyIChwaWQpKTsKKyNlbmRpZgorCisjaWYgMAorCSAgLyogTk9URTogVGhpcyBibG9jayBpcyBPTkxZIG1lYW50IHRvIGJlIGludm9rZWQgaW4gY2FzZSBvZiBhCisJICAgICAidGhyZWFkIGNyZWF0aW9uIGV2ZW50IiEgIElmIGl0IGlzIGludm9rZWQgZm9yIGFueSBvdGhlcgorCSAgICAgc29ydCBvZiBldmVudCAoc3VjaCBhcyBhIG5ldyB0aHJlYWQgbGFuZGluZyBvbiBhIGJyZWFrcG9pbnQpLAorCSAgICAgdGhlIGV2ZW50IHdpbGwgYmUgZGlzY2FyZGVkLCB3aGljaCBpcyBhbG1vc3QgY2VydGFpbmx5CisJICAgICBhIGJhZCB0aGluZyEKKwkKKwkgICAgIFRvIGF2b2lkIHRoaXMsIHRoZSBsb3ctbGV2ZWwgbW9kdWxlIChlZy4gdGFyZ2V0X3dhaXQpCisJICAgICBzaG91bGQgY2FsbCBpbl90aHJlYWRfbGlzdCBhbmQgYWRkX3RocmVhZCwgc28gdGhhdCB0aGUKKwkgICAgIG5ldyB0aHJlYWQgaXMga25vd24gYnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUuICAqLworCisJICAvKiBXZSBtYXkgd2FudCB0byBjb25zaWRlciBub3QgZG9pbmcgYSByZXN1bWUgaGVyZSBpbiBvcmRlcgorCSAgICAgdG8gZ2l2ZSB0aGUgdXNlciBhIGNoYW5jZSB0byBwbGF5IHdpdGggdGhlIG5ldyB0aHJlYWQuCisJICAgICBJdCBtaWdodCBiZSBnb29kIHRvIG1ha2UgdGhhdCBhIHVzZXItc2V0dGFibGUgb3B0aW9uLiAgKi8KKworCSAgLyogQXQgdGhpcyBwb2ludCwgYWxsIHRocmVhZHMgYXJlIHN0b3BwZWQgKGhhcHBlbnMKKwkgICAgIGF1dG9tYXRpY2FsbHkgaW4gZWl0aGVyIHRoZSBPUyBvciB0aGUgbmF0aXZlIGNvZGUpLgorCSAgICAgVGhlcmVmb3JlIHdlIG5lZWQgdG8gY29udGludWUgYWxsIHRocmVhZHMgaW4gb3JkZXIgdG8KKwkgICAgIG1ha2UgcHJvZ3Jlc3MuICAqLworCisJICB0YXJnZXRfcmVzdW1lICgtMSwgMCwgVEFSR0VUX1NJR05BTF8wKTsKKwkgIGNvbnRpbnVlOworI2VuZGlmCisJfQorCisgICAgICBzd2l0Y2ggKHcua2luZCkKKwl7CisJY2FzZSBUQVJHRVRfV0FJVEtJTkRfTE9BREVEOgorCSAgLyogSWdub3JlIGdyYWNlZnVsbHkgZHVyaW5nIHN0YXJ0dXAgb2YgdGhlIGluZmVyaW9yLCBhcyBpdAorCSAgICAgbWlnaHQgYmUgdGhlIHNoZWxsIHdoaWNoIGhhcyBqdXN0IGxvYWRlZCBzb21lIG9iamVjdHMsCisJICAgICBvdGhlcndpc2UgYWRkIHRoZSBzeW1ib2xzIGZvciB0aGUgbmV3bHkgbG9hZGVkIG9iamVjdHMuICAqLworI2lmZGVmIFNPTElCX0FERAorCSAgaWYgKCFzdG9wX3Nvb25fcXVpZXRseSkKKwkgICAgeworCSAgICAgIGV4dGVybiBpbnQgYXV0b19zb2xpYl9hZGQ7CisKKwkgICAgICAvKiBSZW1vdmUgYnJlYWtwb2ludHMsIFNPTElCX0FERCBtaWdodCBhZGp1c3QKKwkJIGJyZWFrcG9pbnQgYWRkcmVzc2VzIHZpYSBicmVha3BvaW50X3JlX3NldC4gICovCisJICAgICAgaWYgKGJyZWFrcG9pbnRzX2luc2VydGVkKQorCQlyZW1vdmVfYnJlYWtwb2ludHMgKCk7CisKKwkgICAgICAvKiBDaGVjayBmb3IgYW55IG5ld2x5IGFkZGVkIHNoYXJlZCBsaWJyYXJpZXMgaWYgd2UncmUKKwkJIHN1cHBvc2VkIHRvIGJlIGFkZGluZyB0aGVtIGF1dG9tYXRpY2FsbHkuICAqLworCSAgICAgIGlmIChhdXRvX3NvbGliX2FkZCkKKwkJeworCQkgIC8qIFN3aXRjaCB0ZXJtaW5hbCBmb3IgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5CisJCSAgICAgYnJlYWtwb2ludF9yZV9zZXQuICAqLworCQkgIHRhcmdldF90ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgKCk7CisJCSAgU09MSUJfQUREIChOVUxMLCAwLCBOVUxMKTsKKwkJICB0YXJnZXRfdGVybWluYWxfaW5mZXJpb3IgKCk7CisJCX0KKworCSAgICAgIC8qIFJlaW5zZXJ0IGJyZWFrcG9pbnRzIGFuZCBjb250aW51ZS4gICovCisJICAgICAgaWYgKGJyZWFrcG9pbnRzX2luc2VydGVkKQorCQlpbnNlcnRfYnJlYWtwb2ludHMgKCk7CisJICAgIH0KKyNlbmRpZgorCSAgcmVzdW1lICgwLCBUQVJHRVRfU0lHTkFMXzApOworCSAgY29udGludWU7CisKKwljYXNlIFRBUkdFVF9XQUlUS0lORF9TUFVSSU9VUzoKKwkgIHJlc3VtZSAoMCwgVEFSR0VUX1NJR05BTF8wKTsKKwkgIGNvbnRpbnVlOworCisJY2FzZSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVEOgorCSAgdGFyZ2V0X3Rlcm1pbmFsX291cnMgKCk7CS8qIE11c3QgZG8gdGhpcyBiZWZvcmUgbW91cm4gYW55d2F5ICovCisJICBhbm5vdGF0ZV9leGl0ZWQgKHcudmFsdWUuaW50ZWdlcik7CisJICBpZiAody52YWx1ZS5pbnRlZ2VyKQorCSAgICBwcmludGZfZmlsdGVyZWQgKCJcblByb2dyYW0gZXhpdGVkIHdpdGggY29kZSAwJW8uXG4iLAorCQkJICAgICAodW5zaWduZWQgaW50KSB3LnZhbHVlLmludGVnZXIpOworCSAgZWxzZQorCSAgICBwcmludGZfZmlsdGVyZWQgKCJcblByb2dyYW0gZXhpdGVkIG5vcm1hbGx5LlxuIik7CisKKwkgIC8qIFJlY29yZCB0aGUgZXhpdCBjb2RlIGluIHRoZSBjb252ZW5pZW5jZSB2YXJpYWJsZSAkX2V4aXRjb2RlLCBzbworCSAgICAgdGhhdCB0aGUgdXNlciBjYW4gaW5zcGVjdCB0aGlzIGFnYWluIGxhdGVyLiAgKi8KKwkgIHNldF9pbnRlcm5hbHZhciAobG9va3VwX2ludGVybmFsdmFyICgiX2V4aXRjb2RlIiksCisJCQkgICB2YWx1ZV9mcm9tX2xvbmdlc3QgKGJ1aWx0aW5fdHlwZV9pbnQsCisJCQkJCSAgICAgICAoTE9OR0VTVCkgdy52YWx1ZS5pbnRlZ2VyKSk7CisJICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCSAgdGFyZ2V0X21vdXJuX2luZmVyaW9yICgpOworCSAgc2luZ2xlc3RlcF9icmVha3BvaW50c19pbnNlcnRlZF9wID0gMDsJLypTT0ZUV0FSRV9TSU5HTEVfU1RFUF9QKi8KKwkgIHN0b3BfcHJpbnRfZnJhbWUgPSAwOworCSAgZ290byBzdG9wX3N0ZXBwaW5nOworCisJY2FzZSBUQVJHRVRfV0FJVEtJTkRfU0lHTkFMTEVEOgorCSAgc3RvcF9wcmludF9mcmFtZSA9IDA7CisJICBzdG9wX3NpZ25hbCA9IHcudmFsdWUuc2lnOworCSAgdGFyZ2V0X3Rlcm1pbmFsX291cnMgKCk7CS8qIE11c3QgZG8gdGhpcyBiZWZvcmUgbW91cm4gYW55d2F5ICovCisJICBhbm5vdGF0ZV9zaWduYWxsZWQgKCk7CisKKwkgIC8qIFRoaXMgbG9va3MgcHJldHR5IGJvZ3VzIHRvIG1lLiAgRG9lc24ndCBUQVJHRVRfV0FJVEtJTkRfU0lHTkFMTEVECisJICAgICBtZWFuIGl0IGlzIGFscmVhZHkgZGVhZD8gIFRoaXMgaGFzIGJlZW4gaGVyZSBzaW5jZSBHREIgMi44LCBzbworCSAgICAgcGVyaGFwcyBpdCBtZWFucyBybXMgZGlkbid0IHVuZGVyc3RhbmQgdW5peCB3YWl0c3RhdHVzZXM/CisJICAgICBGb3IgdGhlIG1vbWVudCBJJ20ganVzdCBrbHVkZ2luZyBhcm91bmQgdGhpcyBpbiByZW1vdGUuYworCSAgICAgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGNoYW5nZSBpdCBoZXJlIC0ta2luZ2RvbiwgNSBEZWMgMTk5NC4gICovCisJICB0YXJnZXRfa2lsbCAoKTsJLyoga2lsbCBtb3VybnMgYXMgd2VsbCAqLworCisJICBwcmludGZfZmlsdGVyZWQgKCJcblByb2dyYW0gdGVybWluYXRlZCB3aXRoIHNpZ25hbCAiKTsKKwkgIGFubm90YXRlX3NpZ25hbF9uYW1lICgpOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiJXMiLCB0YXJnZXRfc2lnbmFsX3RvX25hbWUgKHN0b3Bfc2lnbmFsKSk7CisJICBhbm5vdGF0ZV9zaWduYWxfbmFtZV9lbmQgKCk7CisJICBwcmludGZfZmlsdGVyZWQgKCIsICIpOworCSAgYW5ub3RhdGVfc2lnbmFsX3N0cmluZyAoKTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIiVzIiwgdGFyZ2V0X3NpZ25hbF90b19zdHJpbmcgKHN0b3Bfc2lnbmFsKSk7CisJICBhbm5vdGF0ZV9zaWduYWxfc3RyaW5nX2VuZCAoKTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIi5cbiIpOworCisJICBwcmludGZfZmlsdGVyZWQgKCJUaGUgcHJvZ3JhbSBubyBsb25nZXIgZXhpc3RzLlxuIik7CisJICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCSAgc2luZ2xlc3RlcF9icmVha3BvaW50c19pbnNlcnRlZF9wID0gMDsJLypTT0ZUV0FSRV9TSU5HTEVfU1RFUF9QKi8KKwkgIGdvdG8gc3RvcF9zdGVwcGluZzsKKworCSAgLyogVGhlIGZvbGxvd2luZyBhcmUgdGhlIG9ubHkgY2FzZXMgaW4gd2hpY2ggd2Uga2VlcCBnb2luZzsKKyAgICAgICAgICAgdGhlIGFib3ZlIGNhc2VzIGVuZCBpbiBhIGNvbnRpbnVlIG9yIGdvdG8uICovCisJY2FzZSBUQVJHRVRfV0FJVEtJTkRfRk9SS0VEOgorCSAgc3RvcF9zaWduYWwgPSBUQVJHRVRfU0lHTkFMX1RSQVA7CisJICBwZW5kaW5nX2ZvbGxvdy5raW5kID0gdy5raW5kOworCisJICAvKiBJZ25vcmUgZm9yayBldmVudHMgcmVwb3J0ZWQgZm9yIHRoZSBwYXJlbnQ7IHdlJ3JlIG9ubHkKKyAgICAgICAgICAgICBpbnRlcmVzdGVkIGluIHJlYWN0aW5nIHRvIGZvcmtzIG9mIHRoZSBjaGlsZC4gIE5vdGUgdGhhdAorICAgICAgICAgICAgIHdlIGV4cGVjdCB0aGUgY2hpbGQncyBmb3JrIGV2ZW50IHRvIGJlIGF2YWlsYWJsZSBpZiB3ZQorICAgICAgICAgICAgIHdhaXRlZCBmb3IgaXQgbm93LiAqLworCSAgaWYgKGluZmVyaW9yX3BpZCA9PSBwaWQpCisJICAgIHsKKwkgICAgICBwZW5kaW5nX2ZvbGxvdy5mb3JrX2V2ZW50LnNhd19wYXJlbnRfZm9yayA9IDE7CisJICAgICAgcGVuZGluZ19mb2xsb3cuZm9ya19ldmVudC5wYXJlbnRfcGlkID0gcGlkOworCSAgICAgIHBlbmRpbmdfZm9sbG93LmZvcmtfZXZlbnQuY2hpbGRfcGlkID0gdy52YWx1ZS5yZWxhdGVkX3BpZDsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcGVuZGluZ19mb2xsb3cuZm9ya19ldmVudC5zYXdfY2hpbGRfZm9yayA9IDE7CisJICAgICAgcGVuZGluZ19mb2xsb3cuZm9ya19ldmVudC5jaGlsZF9waWQgPSBwaWQ7CisJICAgICAgcGVuZGluZ19mb2xsb3cuZm9ya19ldmVudC5wYXJlbnRfcGlkID0gdy52YWx1ZS5yZWxhdGVkX3BpZDsKKwkgICAgfQorCisJICBzdG9wX3BjID0gcmVhZF9wY19waWQgKHBpZCk7CisJICBzYXZlZF9pbmZlcmlvcl9waWQgPSBpbmZlcmlvcl9waWQ7CisJICBpbmZlcmlvcl9waWQgPSBwaWQ7CisJICBzdG9wX2Jwc3RhdCA9IGJwc3RhdF9zdG9wX3N0YXR1cworCSAgICAoJnN0b3BfcGMsCisjaWYgREVDUl9QQ19BRlRFUl9CUkVBSworCSAgICAgKHByZXZfcGMgIT0gc3RvcF9wYyAtIERFQ1JfUENfQUZURVJfQlJFQUsKKwkgICAgICAmJiBDVVJSRU5UTFlfU1RFUFBJTkcgKCkpCisjZWxzZSAvKiBERUNSX1BDX0FGVEVSX0JSRUFLIHplcm8gKi8KKwkgICAgIDAKKyNlbmRpZiAvKiBERUNSX1BDX0FGVEVSX0JSRUFLIHplcm8gKi8KKwkgICAgKTsKKwkgIHJhbmRvbV9zaWduYWwgPSAhYnBzdGF0X2V4cGxhaW5zX3NpZ25hbCAoc3RvcF9icHN0YXQpOworCSAgaW5mZXJpb3JfcGlkID0gc2F2ZWRfaW5mZXJpb3JfcGlkOworCSAgZ290byBwcm9jZXNzX2V2ZW50X3N0b3BfdGVzdDsKKworCSAgLyogSWYgdGhpcyBhIHBsYXRmb3JtIHdoaWNoIGRvZXNuJ3QgYWxsb3cgYSBkZWJ1Z2dlciB0byB0b3VjaCBhCisgICAgICAgICAgIHZmb3JrJ2QgaW5mZXJpb3IgdW50aWwgYWZ0ZXIgaXQgZXhlYydzLCB0aGVuIHdlJ2QgYmVzdCBrZWVwCisgICAgICAgICAgIG91ciBmaW5nZXJzIGVudGlyZWx5IG9mZiB0aGUgaW5mZXJpb3IsIG90aGVyIHRoYW4gY29udGludWluZworICAgICAgICAgICBpdC4gIFRoaXMgaGFzIHRoZSB1bmZvcnR1bmF0ZSBzaWRlLWVmZmVjdCB0aGF0IGNhdGNocG9pbnRzCisgICAgICAgICAgIG9mIHZmb3JrcyB3aWxsIGJlIGlnbm9yZWQuICBCdXQgc2luY2UgdGhlIHBsYXRmb3JtIGRvZXNuJ3QKKyAgICAgICAgICAgYWxsb3cgdGhlIGluZmVyaW9yIGJlIHRvdWNoZWQgYXQgdmZvcmsgdGltZSwgdGhlcmUncyByZWFsbHkKKyAgICAgICAgICAgbGl0dGxlIGNob2ljZS4gKi8KKwljYXNlIFRBUkdFVF9XQUlUS0lORF9WRk9SS0VEOgorCSAgc3RvcF9zaWduYWwgPSBUQVJHRVRfU0lHTkFMX1RSQVA7CisJICBwZW5kaW5nX2ZvbGxvdy5raW5kID0gdy5raW5kOworCisJICAvKiBJcyB0aGlzIGEgdmZvcmsgb2YgdGhlIHBhcmVudD8gIElmIHNvLCB0aGVuIGdpdmUgYW55CisgICAgICAgICAgICAgdmZvcmsgY2F0Y2hwb2ludHMgYSBjaGFuY2UgdG8gdHJpZ2dlciBub3cuICAoSXQncworICAgICAgICAgICAgIGRhbmdlcm91cyB0byBkbyBzbyBpZiB0aGUgY2hpbGQgY2Fub3QgYmUgdG91Y2hlZCB1bnRpbAorICAgICAgICAgICAgIGl0IGV4ZWNzLCBhbmQgdGhlIGNoaWxkIGhhcyBub3QgeWV0IGV4ZWMnZC4gIFdlIHByb2JhYmx5CisgICAgICAgICAgICAgc2hvdWxkIHdhcm4gdGhlIHVzZXIgdG8gdGhhdCBlZmZlY3Qgd2hlbiB0aGUgY2F0Y2hwb2ludAorICAgICAgICAgICAgIHRyaWdnZXJzLi4uKSAqLworCSAgaWYgKHBpZCA9PSBpbmZlcmlvcl9waWQpCisJICAgIHsKKwkgICAgICBwZW5kaW5nX2ZvbGxvdy5mb3JrX2V2ZW50LnNhd19wYXJlbnRfZm9yayA9IDE7CisJICAgICAgcGVuZGluZ19mb2xsb3cuZm9ya19ldmVudC5wYXJlbnRfcGlkID0gcGlkOworCSAgICAgIHBlbmRpbmdfZm9sbG93LmZvcmtfZXZlbnQuY2hpbGRfcGlkID0gdy52YWx1ZS5yZWxhdGVkX3BpZDsKKwkgICAgfQorCisJICAvKiBJZiB3ZSd2ZSBzZWVuIHRoZSBjaGlsZCdzIHZmb3JrIGV2ZW50IGJ1dCBjYW5ub3QgcmVhbGx5IHRvdWNoCisgICAgICAgICAgICAgdGhlIGNoaWxkIHVudGlsIGl0IGV4ZWNzLCB0aGVuIHdlIG11c3QgY29udGludWUgdGhlIGNoaWxkIG5vdy4KKyAgICAgICAgICAgICBFbHNlLCBnaXZlIGFueSB2Zm9yayBjYXRjaHBvaW50cyBhIGNoYW5jZSB0byB0cmlnZ2VyIG5vdy4gKi8KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHBlbmRpbmdfZm9sbG93LmZvcmtfZXZlbnQuc2F3X2NoaWxkX2ZvcmsgPSAxOworCSAgICAgIHBlbmRpbmdfZm9sbG93LmZvcmtfZXZlbnQuY2hpbGRfcGlkID0gcGlkOworCSAgICAgIHBlbmRpbmdfZm9sbG93LmZvcmtfZXZlbnQucGFyZW50X3BpZCA9IHcudmFsdWUucmVsYXRlZF9waWQ7CisJICAgICAgdGFyZ2V0X3Bvc3Rfc3RhcnR1cF9pbmZlcmlvciAocGVuZGluZ19mb2xsb3cuZm9ya19ldmVudC5jaGlsZF9waWQpOworCSAgICAgIGZvbGxvd192Zm9ya193aGVuX2V4ZWMgPSAhdGFyZ2V0X2Nhbl9mb2xsb3dfdmZvcmtfcHJpb3JfdG9fZXhlYyAoKTsKKwkgICAgICBpZiAoZm9sbG93X3Zmb3JrX3doZW5fZXhlYykKKwkJeworCQkgIHRhcmdldF9yZXN1bWUgKHBpZCwgMCwgVEFSR0VUX1NJR05BTF8wKTsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICB9CisKKwkgIHN0b3BfcGMgPSByZWFkX3BjICgpOworCSAgc3RvcF9icHN0YXQgPSBicHN0YXRfc3RvcF9zdGF0dXMKKwkgICAgKCZzdG9wX3BjLAorI2lmIERFQ1JfUENfQUZURVJfQlJFQUsKKwkgICAgIChwcmV2X3BjICE9IHN0b3BfcGMgLSBERUNSX1BDX0FGVEVSX0JSRUFLCisJICAgICAgJiYgQ1VSUkVOVExZX1NURVBQSU5HICgpKQorI2Vsc2UgLyogREVDUl9QQ19BRlRFUl9CUkVBSyB6ZXJvICovCisJICAgICAwCisjZW5kaWYgLyogREVDUl9QQ19BRlRFUl9CUkVBSyB6ZXJvICovCisJICAgICk7CisJICByYW5kb21fc2lnbmFsID0gIWJwc3RhdF9leHBsYWluc19zaWduYWwgKHN0b3BfYnBzdGF0KTsKKwkgIGdvdG8gcHJvY2Vzc19ldmVudF9zdG9wX3Rlc3Q7CisKKwljYXNlIFRBUkdFVF9XQUlUS0lORF9FWEVDRDoKKwkgIHN0b3Bfc2lnbmFsID0gVEFSR0VUX1NJR05BTF9UUkFQOworCisJICAvKiBJcyB0aGlzIGEgdGFyZ2V0IHdoaWNoIHJlcG9ydHMgbXVsdGlwbGUgZXhlYyBldmVudHMgcGVyIGFjdHVhbAorICAgICAgICAgICAgIGNhbGwgdG8gZXhlYygpPyAgKEhQLVVYIHVzaW5nIHB0cmFjZSBkb2VzLCBmb3IgZXhhbXBsZS4pICBJZiBzbywKKyAgICAgICAgICAgICBpZ25vcmUgYWxsIGJ1dCB0aGUgbGFzdCBvbmUuICBKdXN0IHJlc3VtZSB0aGUgZXhlYydyLCBhbmQgd2FpdAorICAgICAgICAgICAgIGZvciB0aGUgbmV4dCBleGVjIGV2ZW50LiAqLworCSAgaWYgKGluZmVyaW9yX2lnbm9yaW5nX2xlYWRpbmdfZXhlY19ldmVudHMpCisJICAgIHsKKwkgICAgICBpbmZlcmlvcl9pZ25vcmluZ19sZWFkaW5nX2V4ZWNfZXZlbnRzLS07CisJICAgICAgaWYgKHBlbmRpbmdfZm9sbG93LmtpbmQgPT0gVEFSR0VUX1dBSVRLSU5EX1ZGT1JLRUQpCisJCUVOU1VSRV9WRk9SS0lOR19QQVJFTlRfUkVNQUlOU19TVE9QUEVEIChwZW5kaW5nX2ZvbGxvdy5mb3JrX2V2ZW50LnBhcmVudF9waWQpOworCSAgICAgIHRhcmdldF9yZXN1bWUgKHBpZCwgMCwgVEFSR0VUX1NJR05BTF8wKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgaW5mZXJpb3JfaWdub3JpbmdfbGVhZGluZ19leGVjX2V2ZW50cyA9CisJICAgIHRhcmdldF9yZXBvcnRlZF9leGVjX2V2ZW50c19wZXJfZXhlY19jYWxsICgpIC0gMTsKKworCSAgcGVuZGluZ19mb2xsb3cuZXhlY2RfcGF0aG5hbWUgPSBzYXZlc3RyaW5nICh3LnZhbHVlLmV4ZWNkX3BhdGhuYW1lLAorCQkJCQkgICBzdHJsZW4gKHcudmFsdWUuZXhlY2RfcGF0aG5hbWUpKTsKKworCSAgLyogRGlkIGluZmVyaW9yX3BpZCBleGVjLCBvciBkaWQgYSAocG9zc2libHkgbm90LXlldC1mb2xsb3dlZCkKKyAgICAgICAgICAgICBjaGlsZCBvZiBhIHZmb3JrIGV4ZWM/CisKKyAgICAgICAgICAgICA/P3JlaHJhdWVyOiBUaGlzIGlzIHVuYWJhc2hlZGx5IGFuIEhQLVVYIHNwZWNpZmljIHRoaW5nLiAgT24KKyAgICAgICAgICAgICBIUC1VWCwgZXZlbnRzIGFzc29jaWF0ZWQgd2l0aCBhIHZmb3JraW5nIGluZmVyaW9yIGNvbWUgaW4KKyAgICAgICAgICAgICB0aHJlZXM6IGEgdmZvcmsgZXZlbnQgZm9yIHRoZSBjaGlsZCAoYWx3YXlzIGZpcnN0KSwgZm9sbG93ZWQKKyAgICAgICAgICAgICBhIHZmb3JrIGV2ZW50IGZvciB0aGUgcGFyZW50IGFuZCBhbiBleGVjIGV2ZW50IGZvciB0aGUgY2hpbGQuCisgICAgICAgICAgICAgVGhlIGxhdHRlciB0d28gY2FuIGNvbWUgaW4gZWl0aGVyIG9yZGVyLgorCisgICAgICAgICAgICAgSWYgd2UgZ2V0IHRoZSBwYXJlbnQgdmZvcmsgZXZlbnQgZmlyc3QsIGxpZmUncyBnb29kOiBXZSBmb2xsb3cKKyAgICAgICAgICAgICBlaXRoZXIgdGhlIHBhcmVudCBvciBjaGlsZCwgYW5kIHRoZW4gdGhlIGNoaWxkJ3MgZXhlYyBldmVudCBpcworICAgICAgICAgICAgIGEgImRvbid0IGNhcmUiLgorCisgICAgICAgICAgICAgQnV0IGlmIHdlIGdldCB0aGUgY2hpbGQncyBleGVjIGV2ZW50IGZpcnN0LCB0aGVuIHdlIGRlbGF5CisgICAgICAgICAgICAgcmVzcG9uZGluZyB0byBpdCB1bnRpbCB3ZSBoYW5kbGUgdGhlIHBhcmVudCdzIHZmb3JrLiAgQmVjYXVzZSwKKyAgICAgICAgICAgICBvdGhlcndpc2Ugd2UgY2FuJ3Qgc2F0aXNmeSBhICJjYXRjaCB2Zm9yayIuICovCisJICBpZiAocGVuZGluZ19mb2xsb3cua2luZCA9PSBUQVJHRVRfV0FJVEtJTkRfVkZPUktFRCkKKwkgICAgeworCSAgICAgIHBlbmRpbmdfZm9sbG93LmZvcmtfZXZlbnQuc2F3X2NoaWxkX2V4ZWMgPSAxOworCisJICAgICAgLyogT24gc29tZSB0YXJnZXRzLCB0aGUgY2hpbGQgbXVzdCBiZSByZXN1bWVkIGJlZm9yZQorICAgICAgICAgICAgICAgICB0aGUgcGFyZW50IHZmb3JrIGV2ZW50IGlzIGRlbGl2ZXJlZC4gIEEgc2luZ2xlLXN0ZXAKKyAgICAgICAgICAgICAgICAgc3VmZmljZXMuICovCisJICAgICAgaWYgKFJFU1VNRV9FWEVDRF9WRk9SS0lOR19DSElMRF9UT19HRVRfUEFSRU5UX1ZGT1JLICgpKQorCQl0YXJnZXRfcmVzdW1lIChwaWQsIDEsIFRBUkdFVF9TSUdOQUxfMCk7CisJICAgICAgLyogV2UgZXhwZWN0IHRoZSBwYXJlbnQgdmZvcmsgZXZlbnQgdG8gYmUgYXZhaWxhYmxlIG5vdy4gKi8KKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICAvKiBUaGlzIGNhdXNlcyB0aGUgZXZlbnRwb2ludHMgYW5kIHN5bWJvbCB0YWJsZSB0byBiZSByZXNldC4gIE11c3QKKyAgICAgICAgICAgICBkbyB0aGlzIG5vdywgYmVmb3JlIHRyeWluZyB0byBkZXRlcm1pbmUgd2hldGhlciB0byBzdG9wLiAqLworCSAgZm9sbG93X2V4ZWMgKGluZmVyaW9yX3BpZCwgcGVuZGluZ19mb2xsb3cuZXhlY2RfcGF0aG5hbWUpOworCSAgZnJlZSAocGVuZGluZ19mb2xsb3cuZXhlY2RfcGF0aG5hbWUpOworCisJICBzdG9wX3BjID0gcmVhZF9wY19waWQgKHBpZCk7CisJICBzYXZlZF9pbmZlcmlvcl9waWQgPSBpbmZlcmlvcl9waWQ7CisJICBpbmZlcmlvcl9waWQgPSBwaWQ7CisJICBzdG9wX2Jwc3RhdCA9IGJwc3RhdF9zdG9wX3N0YXR1cworCSAgICAoJnN0b3BfcGMsCisjaWYgREVDUl9QQ19BRlRFUl9CUkVBSworCSAgICAgKHByZXZfcGMgIT0gc3RvcF9wYyAtIERFQ1JfUENfQUZURVJfQlJFQUsKKwkgICAgICAmJiBDVVJSRU5UTFlfU1RFUFBJTkcgKCkpCisjZWxzZSAvKiBERUNSX1BDX0FGVEVSX0JSRUFLIHplcm8gKi8KKwkgICAgIDAKKyNlbmRpZiAvKiBERUNSX1BDX0FGVEVSX0JSRUFLIHplcm8gKi8KKwkgICAgKTsKKwkgIHJhbmRvbV9zaWduYWwgPSAhYnBzdGF0X2V4cGxhaW5zX3NpZ25hbCAoc3RvcF9icHN0YXQpOworCSAgaW5mZXJpb3JfcGlkID0gc2F2ZWRfaW5mZXJpb3JfcGlkOworCSAgZ290byBwcm9jZXNzX2V2ZW50X3N0b3BfdGVzdDsKKworCSAgLyogVGhlc2Ugc3lzY2FsbCBldmVudHMgYXJlIHJldHVybmVkIG9uIEhQLVVYLCBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiBwYWdlLXByb3RlY3Rpb24tYmFzZWQgImhhcmR3YXJlIiB3YXRjaHBvaW50cy4KKyAgICAgICAgICAgSFAtVVggaGFzIHVuZm9ydHVuYXRlIGludGVyYWN0aW9ucyBiZXR3ZWVuIHBhZ2UtcHJvdGVjdGlvbnMgYW5kCisgICAgICAgICAgIHNvbWUgc3lzdGVtIGNhbGxzLiAgT3VyIHNvbHV0aW9uIGlzIHRvIGRpc2FibGUgaGFyZHdhcmUgd2F0Y2hlcworICAgICAgICAgICB3aGVuIGEgc3lzdGVtIGNhbGwgaXMgZW50ZXJlZCwgYW5kIHJlZW5hYmxlIHRoZW0gd2hlbiB0aGUgc3lzY2FsbAorICAgICAgICAgICBjb21wbGV0ZXMuICBUaGUgZG93bnNpZGUgb2YgdGhpcyBpcyB0aGF0IHdlIG1heSBtaXNzIHRoZSBwcmVjaXNlCisgICAgICAgICAgIHBvaW50IGF0IHdoaWNoIGEgd2F0Y2hlZCBwaWVjZSBvZiBtZW1vcnkgaXMgbW9kaWZpZWQuICAiT2ggd2VsbC4iCisKKyAgICAgICAgICAgTm90ZSB0aGF0IHdlIG1heSBoYXZlIG11bHRpcGxlIHRocmVhZHMgcnVubmluZywgd2hpY2ggbWF5IGVhY2gKKyAgICAgICAgICAgZW50ZXIgc3lzY2FsbHMgYXQgcm91Z2hseSB0aGUgc2FtZSB0aW1lLiAgU2luY2Ugd2UgZG9uJ3QgaGF2ZSBhCisgICAgICAgICAgIGdvb2Qgbm90aW9uIGN1cnJlbnRseSBvZiB3aGV0aGVyIGEgd2F0Y2hlZCBwaWVjZSBvZiBtZW1vcnkgaXMKKyAgICAgICAgICAgdGhyZWFkLXByaXZhdGUsIHdlJ2QgYmVzdCBub3QgaGF2ZSBhbnkgcGFnZS1wcm90ZWN0aW9ucyBhY3RpdmUKKyAgICAgICAgICAgd2hlbiBhbnkgdGhyZWFkIGlzIGluIGEgc3lzY2FsbC4gIFRodXMsIHdlIG9ubHkgd2FudCB0byByZWVuYWJsZQorICAgICAgICAgICBoYXJkd2FyZSB3YXRjaGVzIHdoZW4gbm8gdGhyZWFkcyBhcmUgaW4gYSBzeXNjYWxsLgorCisgICAgICAgICAgIEFsc28sIGJlIGNhcmVmdWwgbm90IHRvIHRyeSB0byBnYXRoZXIgbXVjaCBzdGF0ZSBhYm91dCBhIHRocmVhZAorICAgICAgICAgICB0aGF0J3MgaW4gYSBzeXNjYWxsLiAgSXQncyBmcmVxdWVudGx5IGEgbG9zaW5nIHByb3Bvc2l0aW9uLiAqLworCWNhc2UgVEFSR0VUX1dBSVRLSU5EX1NZU0NBTExfRU5UUlk6CisJICBudW1iZXJfb2ZfdGhyZWFkc19pbl9zeXNjYWxscysrOworCSAgaWYgKG51bWJlcl9vZl90aHJlYWRzX2luX3N5c2NhbGxzID09IDEpCisJICAgIHsKKwkgICAgICBUQVJHRVRfRElTQUJMRV9IV19XQVRDSFBPSU5UUyAoaW5mZXJpb3JfcGlkKTsKKwkgICAgfQorCSAgcmVzdW1lICgwLCBUQVJHRVRfU0lHTkFMXzApOworCSAgY29udGludWU7CisKKwkgIC8qIEJlZm9yZSBleGFtaW5pbmcgdGhlIHRocmVhZHMgZnVydGhlciwgc3RlcCB0aGlzIHRocmVhZCB0bworCSAgIGdldCBpdCBlbnRpcmVseSBvdXQgb2YgdGhlIHN5c2NhbGwuICAoV2UgZ2V0IG5vdGljZSBvZiB0aGUKKwkgICBldmVudCB3aGVuIHRoZSB0aHJlYWQgaXMganVzdCBvbiB0aGUgdmVyZ2Ugb2YgZXhpdGluZyBhCisJICAgc3lzY2FsbC4gIFN0ZXBwaW5nIG9uZSBpbnN0cnVjdGlvbiBzZWVtcyB0byBnZXQgaXQgYmFjaworCSAgIGludG8gdXNlciBjb2RlLikKKworCSAgIE5vdGUgdGhhdCBhbHRob3VnaCB0aGUgbG9naWNhbCBwbGFjZSB0byByZWVuYWJsZSBoL3cgd2F0Y2hlcworCSAgIGlzIGhlcmUsIHdlIGNhbm5vdC4gIFdlIGNhbm5vdCByZWVuYWJsZSB0aGVtIGJlZm9yZSBzdGVwcGluZworCSAgIHRoZSB0aHJlYWQgKHRoaXMgY2F1c2VzIHRoZSBuZXh0IHdhaXQgb24gdGhlIHRocmVhZCB0byBoYW5nKS4KKworCSAgIE5vciBjYW4gd2UgZW5hYmxlIHRoZW0gYWZ0ZXIgc3RlcHBpbmcgdW50aWwgd2UndmUgZG9uZSBhIHdhaXQuCisJICAgVGh1cywgd2Ugc2ltcGx5IHNldCB0aGUgZmxhZyBlbmFibGVfaHdfd2F0Y2hwb2ludHNfYWZ0ZXJfd2FpdAorCSAgIGhlcmUsIHdoaWNoIHdpbGwgYmUgc2VydmljZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRhcmdldAorCSAgIGlzIHdhaXRlZCBvbi4gKi8KKwljYXNlIFRBUkdFVF9XQUlUS0lORF9TWVNDQUxMX1JFVFVSTjoKKwkgIHRhcmdldF9yZXN1bWUgKHBpZCwgMSwgVEFSR0VUX1NJR05BTF8wKTsKKworCSAgaWYgKG51bWJlcl9vZl90aHJlYWRzX2luX3N5c2NhbGxzID4gMCkKKwkgICAgeworCSAgICAgIG51bWJlcl9vZl90aHJlYWRzX2luX3N5c2NhbGxzLS07CisJICAgICAgZW5hYmxlX2h3X3dhdGNocG9pbnRzX2FmdGVyX3dhaXQgPQorCQkobnVtYmVyX29mX3RocmVhZHNfaW5fc3lzY2FsbHMgPT0gMCk7CisJICAgIH0KKwkgIGNvbnRpbnVlOworCisJY2FzZSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDoKKwkgIHN0b3Bfc2lnbmFsID0gdy52YWx1ZS5zaWc7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIFdlIG1heSB3YW50IHRvIGNvbnNpZGVyIG5vdCBkb2luZyBhIHJlc3VtZSBoZXJlIGluIG9yZGVyIHRvIGdpdmUKKyAgICAgICAgIHRoZSB1c2VyIGEgY2hhbmNlIHRvIHBsYXkgd2l0aCB0aGUgbmV3IHRocmVhZC4gIEl0IG1pZ2h0IGJlIGdvb2QKKyAgICAgICAgIHRvIG1ha2UgdGhhdCBhIHVzZXItc2V0dGFibGUgb3B0aW9uLiAgKi8KKworICAgICAgLyogQXQgdGhpcyBwb2ludCwgYWxsIHRocmVhZHMgYXJlIHN0b3BwZWQgKGhhcHBlbnMgYXV0b21hdGljYWxseSBpbgorICAgICAgICAgZWl0aGVyIHRoZSBPUyBvciB0aGUgbmF0aXZlIGNvZGUpLiAgVGhlcmVmb3JlIHdlIG5lZWQgdG8gY29udGludWUKKyAgICAgICAgIGFsbCB0aHJlYWRzIGluIG9yZGVyIHRvIG1ha2UgcHJvZ3Jlc3MuICAqLworICAgICAgaWYgKG5ld190aHJlYWRfZXZlbnQpCisJeworCSAgdGFyZ2V0X3Jlc3VtZSAoLTEsIDAsIFRBUkdFVF9TSUdOQUxfMCk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIHN0b3BfcGMgPSByZWFkX3BjX3BpZCAocGlkKTsKKworICAgICAgLyogU2VlIGlmIGEgdGhyZWFkIGhpdCBhIHRocmVhZC1zcGVjaWZpYyBicmVha3BvaW50IHRoYXQgd2FzIG1lYW50IGZvcgorCSBhbm90aGVyIHRocmVhZC4gIElmIHNvLCB0aGVuIHN0ZXAgdGhhdCB0aHJlYWQgcGFzdCB0aGUgYnJlYWtwb2ludCwKKwkgYW5kIGNvbnRpbnVlIGl0LiAgKi8KKworICAgICAgaWYgKHN0b3Bfc2lnbmFsID09IFRBUkdFVF9TSUdOQUxfVFJBUCkKKwl7CisJICBpZiAoU09GVFdBUkVfU0lOR0xFX1NURVBfUCAmJiBzaW5nbGVzdGVwX2JyZWFrcG9pbnRzX2luc2VydGVkX3ApCisJICAgIHJhbmRvbV9zaWduYWwgPSAwOworCSAgZWxzZSBpZiAoYnJlYWtwb2ludHNfaW5zZXJ0ZWQKKwkJICAgJiYgYnJlYWtwb2ludF9oZXJlX3AgKHN0b3BfcGMgLSBERUNSX1BDX0FGVEVSX0JSRUFLKSkKKwkgICAgeworCSAgICAgIHJhbmRvbV9zaWduYWwgPSAwOworCSAgICAgIGlmICghYnJlYWtwb2ludF90aHJlYWRfbWF0Y2ggKHN0b3BfcGMgLSBERUNSX1BDX0FGVEVSX0JSRUFLLAorCQkJCQkgICAgcGlkKSkKKwkJeworCQkgIGludCByZW1vdmVfc3RhdHVzOworCisJCSAgLyogU2F3IGEgYnJlYWtwb2ludCwgYnV0IGl0IHdhcyBoaXQgYnkgdGhlIHdyb25nIHRocmVhZC4KKwkJICAgICAgIEp1c3QgY29udGludWUuICovCisJCSAgd3JpdGVfcGNfcGlkIChzdG9wX3BjIC0gREVDUl9QQ19BRlRFUl9CUkVBSywgcGlkKTsKKworCQkgIHJlbW92ZV9zdGF0dXMgPSByZW1vdmVfYnJlYWtwb2ludHMgKCk7CisJCSAgLyogRGlkIHdlIGZhaWwgdG8gcmVtb3ZlIGJyZWFrcG9pbnRzPyAgSWYgc28sIHRyeQorICAgICAgICAgICAgICAgICAgICAgICB0byBzZXQgdGhlIFBDIHBhc3QgdGhlIGJwLiAgKFRoZXJlJ3MgYXQgbGVhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgb25lIHNpdHVhdGlvbiBpbiB3aGljaCB3ZSBjYW4gZmFpbCB0byByZW1vdmUKKyAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJwJ3M6IE9uIEhQLVVYJ3MgdGhhdCB1c2UgdHRyYWNlLCB3ZSBjYW4ndAorICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgYSB2Zm9ya2luZyBjaGlsZAorICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzIHVudGlsIHRoZSBjaGlsZCBleGl0cyAod2VsbCwgb2theSwgbm90CisgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gZWl0aGVyIDotKSBvciBleGVjcy4gKi8KKwkJICBpZiAocmVtb3ZlX3N0YXR1cyAhPSAwKQorCQkgICAgeworCQkgICAgICB3cml0ZV9wY19waWQgKHN0b3BfcGMgLSBERUNSX1BDX0FGVEVSX0JSRUFLICsgNCwgcGlkKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CQkvKiBTaW5nbGUgc3RlcCAqLworCQkgICAgICB0YXJnZXRfcmVzdW1lIChwaWQsIDEsIFRBUkdFVF9TSUdOQUxfMCk7CisJCSAgICAgIC8qIEZJWE1FOiBXaGF0IGlmIGEgc2lnbmFsIGFycml2ZXMgaW5zdGVhZCBvZiB0aGUKKwkJCSAgIHNpbmdsZS1zdGVwIGhhcHBlbmluZz8gICovCisKKwkJICAgICAgaWYgKHRhcmdldF93YWl0X2hvb2spCisJCQl0YXJnZXRfd2FpdF9ob29rIChwaWQsICZ3KTsKKwkJICAgICAgZWxzZQorCQkJdGFyZ2V0X3dhaXQgKHBpZCwgJncpOworCQkgICAgICBpbnNlcnRfYnJlYWtwb2ludHMgKCk7CisJCSAgICB9CisKKwkJICAvKiBXZSBuZWVkIHRvIHJlc3RhcnQgYWxsIHRoZSB0aHJlYWRzIG5vdy4gICovCisJCSAgdGFyZ2V0X3Jlc3VtZSAoLTEsIDAsIFRBUkdFVF9TSUdOQUxfMCk7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKiBUaGlzIGJyZWFrcG9pbnQgbWF0Y2hlcy0tZWl0aGVyIGl0IGlzIHRoZSByaWdodAorCQkgICAgICAgdGhyZWFkIG9yIGl0J3MgYSBnZW5lcmljIGJyZWFrcG9pbnQgZm9yIGFsbCB0aHJlYWRzLgorCQkgICAgICAgUmVtZW1iZXIgdGhhdCB3ZSdsbCBuZWVkIHRvIHN0ZXAganVzdCBfdGhpc18gdGhyZWFkCisJCSAgICAgICBvbiBhbnkgZm9sbG93aW5nIHVzZXIgY29udGludWF0aW9uISAqLworCQkgIHRocmVhZF9zdGVwX25lZWRlZCA9IDE7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwlyYW5kb21fc2lnbmFsID0gMTsKKworICAgICAgLyogU2VlIGlmIHNvbWV0aGluZyBpbnRlcmVzdGluZyBoYXBwZW5lZCB0byB0aGUgbm9uLWN1cnJlbnQgdGhyZWFkLiAgSWYKKyAgICAgICAgIHNvLCB0aGVuIHN3aXRjaCB0byB0aGF0IHRocmVhZCwgYW5kIGV2ZW50dWFsbHkgZ2l2ZSBjb250cm9sIGJhY2sgdG8KKwkgdGhlIHVzZXIuCisKKyAgICAgICAgIE5vdGUgdGhhdCBpZiB0aGVyZSdzIGFueSBraW5kIG9mIHBlbmRpbmcgZm9sbG93IChpLmUuLCBvZiBhIGZvcmssCisgICAgICAgICB2Zm9yayBvciBleGVjKSwgd2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzIG5vdy4gIFJhdGhlciwgd2UnbGwgbGV0CisgICAgICAgICB0aGUgbmV4dCByZXN1bWUgaGFuZGxlIGl0LiAqLworICAgICAgaWYgKChwaWQgIT0gaW5mZXJpb3JfcGlkKSAmJgorCSAgKHBlbmRpbmdfZm9sbG93LmtpbmQgPT0gVEFSR0VUX1dBSVRLSU5EX1NQVVJJT1VTKSkKKwl7CisJICBpbnQgcHJpbnRlZCA9IDA7CisKKwkgIC8qIElmIGl0J3MgYSByYW5kb20gc2lnbmFsIGZvciBhIG5vbi1jdXJyZW50IHRocmVhZCwgbm90aWZ5IHVzZXIKKwkgICAgIGlmIGhlJ3MgZXhwcmVzc2VkIGFuIGludGVyZXN0LiAqLworCSAgaWYgKHJhbmRvbV9zaWduYWwKKwkgICAgICAmJiBzaWduYWxfcHJpbnRbc3RvcF9zaWduYWxdKQorCSAgICB7CisvKiA/P3JlaHJhdWVyOiBJIGRvbid0IHVuZGVyc3RhbmQgdGhlIHJhdGlvbmFsZSBmb3IgdGhpcyBjb2RlLiAgSWYgdGhlCisgICBpbmZlcmlvciB3aWxsIHN0b3AgYXMgYSByZXN1bHQgb2YgdGhpcyBzaWduYWwsIHRoZW4gdGhlIGFjdCBvZiBoYW5kbGluZworICAgdGhlIHN0b3Agb3VnaHQgdG8gcHJpbnQgYSBtZXNzYWdlIHRoYXQncyBjb3VjaGVzIHRoZSBzdG9wcGFnZSBpbiB1c2VyCisgICB0ZXJtcywgZS5nLiwgIlN0b3BwZWQgZm9yIGJyZWFrcG9pbnQvd2F0Y2hwb2ludCIuICBJZiB0aGUgaW5mZXJpb3IKKyAgIHdvbid0IHN0b3AgYXMgYSByZXN1bHQgb2YgdGhlIHNpZ25hbCAtLSBpLmUuLCBpZiB0aGUgc2lnbmFsIGlzIG1lcmVseQorICAgYSBzaWRlLWVmZmVjdCBvZiBzb21ldGhpbmcgR0RCJ3MgZG9pbmcgInVuZGVyIHRoZSBjb3ZlcnMiIGZvciB0aGUKKyAgIHVzZXIsIHN1Y2ggYXMgc3RlcHBpbmcgdGhyZWFkcyBvdmVyIGEgYnJlYWtwb2ludCB0aGV5IHNob3VsZG4ndCBzdG9wCisgICBmb3IgLS0gdGhlbiB0aGUgbWVzc2FnZSBzZWVtcyB0byBiZSBhIHNlcmlvdXMgYW5ub3lhbmNlIGF0IGJlc3QuCisKKyAgIEZvciBub3csIHJlbW92ZSB0aGUgbWVzc2FnZSBhbHRvZ2V0aGVyLiAqLworI2lmIDAKKwkgICAgICBwcmludGVkID0gMTsKKwkgICAgICB0YXJnZXRfdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ICgpOworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuUHJvZ3JhbSByZWNlaXZlZCBzaWduYWwgJXMsICVzLlxuIiwKKwkJCSAgICAgICB0YXJnZXRfc2lnbmFsX3RvX25hbWUgKHN0b3Bfc2lnbmFsKSwKKwkJCSAgICAgICB0YXJnZXRfc2lnbmFsX3RvX3N0cmluZyAoc3RvcF9zaWduYWwpKTsKKwkgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworI2VuZGlmCisJICAgIH0KKworCSAgLyogSWYgaXQncyBub3QgU0lHVFJBUCBhbmQgbm90IGEgc2lnbmFsIHdlIHdhbnQgdG8gc3RvcCBmb3IsIHRoZW4KKwkgICAgIGNvbnRpbnVlIHRoZSB0aHJlYWQuICovCisKKwkgIGlmIChzdG9wX3NpZ25hbCAhPSBUQVJHRVRfU0lHTkFMX1RSQVAKKwkgICAgICAmJiAhc2lnbmFsX3N0b3Bbc3RvcF9zaWduYWxdKQorCSAgICB7CisJICAgICAgaWYgKHByaW50ZWQpCisJCXRhcmdldF90ZXJtaW5hbF9pbmZlcmlvciAoKTsKKworCSAgICAgIC8qIENsZWFyIHRoZSBzaWduYWwgaWYgaXQgc2hvdWxkIG5vdCBiZSBwYXNzZWQuICAqLworCSAgICAgIGlmIChzaWduYWxfcHJvZ3JhbVtzdG9wX3NpZ25hbF0gPT0gMCkKKwkJc3RvcF9zaWduYWwgPSBUQVJHRVRfU0lHTkFMXzA7CisKKwkgICAgICB0YXJnZXRfcmVzdW1lIChwaWQsIDAsIHN0b3Bfc2lnbmFsKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICAvKiBJdCdzIGEgU0lHVFJBUCBvciBhIHNpZ25hbCB3ZSdyZSBpbnRlcmVzdGVkIGluLiAgU3dpdGNoIHRocmVhZHMsCisJICAgICBhbmQgZmFsbCBpbnRvIHRoZSByZXN0IG9mIHdhaXRfZm9yX2luZmVyaW9yKCkuICAqLworCisJICAvKiBTYXZlIGluZnJ1biBzdGF0ZSBmb3IgdGhlIG9sZCB0aHJlYWQuICAqLworCSAgc2F2ZV9pbmZydW5fc3RhdGUgKGluZmVyaW9yX3BpZCwgcHJldl9wYywKKwkJCSAgICAgcHJldl9mdW5jX3N0YXJ0LCBwcmV2X2Z1bmNfbmFtZSwKKwkJCSAgICAgdHJhcF9leHBlY3RlZCwgc3RlcF9yZXN1bWVfYnJlYWtwb2ludCwKKwkJCSAgICAgdGhyb3VnaF9zaWd0cmFtcF9icmVha3BvaW50LAorCQkJICAgICBzdGVwX3JhbmdlX3N0YXJ0LCBzdGVwX3JhbmdlX2VuZCwKKwkJCSAgICAgc3RlcF9mcmFtZV9hZGRyZXNzLCBoYW5kbGluZ19sb25nam1wLAorCQkJICAgICBhbm90aGVyX3RyYXAsCisJCQkgICAgIHN0ZXBwaW5nX3Rocm91Z2hfc29saWJfYWZ0ZXJfY2F0Y2gsCisJCQkgICAgIHN0ZXBwaW5nX3Rocm91Z2hfc29saWJfY2F0Y2hwb2ludHMsCisJCQkgICAgIHN0ZXBwaW5nX3Rocm91Z2hfc2lndHJhbXApOworCisjaWZkZWYgSFBVWEhQUEEKKwkgIHN3aXRjaGVkX2Zyb21faW5mZXJpb3JfcGlkID0gaW5mZXJpb3JfcGlkOworI2VuZGlmCisKKwkgIGluZmVyaW9yX3BpZCA9IHBpZDsKKworCSAgLyogTG9hZCBpbmZydW4gc3RhdGUgZm9yIHRoZSBuZXcgdGhyZWFkLiAgKi8KKwkgIGxvYWRfaW5mcnVuX3N0YXRlIChpbmZlcmlvcl9waWQsICZwcmV2X3BjLAorCQkJICAgICAmcHJldl9mdW5jX3N0YXJ0LCAmcHJldl9mdW5jX25hbWUsCisJCQkgICAgICZ0cmFwX2V4cGVjdGVkLCAmc3RlcF9yZXN1bWVfYnJlYWtwb2ludCwKKwkJCSAgICAgJnRocm91Z2hfc2lndHJhbXBfYnJlYWtwb2ludCwKKwkJCSAgICAgJnN0ZXBfcmFuZ2Vfc3RhcnQsICZzdGVwX3JhbmdlX2VuZCwKKwkJCSAgICAgJnN0ZXBfZnJhbWVfYWRkcmVzcywgJmhhbmRsaW5nX2xvbmdqbXAsCisJCQkgICAgICZhbm90aGVyX3RyYXAsCisJCQkgICAgICZzdGVwcGluZ190aHJvdWdoX3NvbGliX2FmdGVyX2NhdGNoLAorCQkJICAgICAmc3RlcHBpbmdfdGhyb3VnaF9zb2xpYl9jYXRjaHBvaW50cywKKwkJCSAgICAgJnN0ZXBwaW5nX3Rocm91Z2hfc2lndHJhbXApOworCisJICBpZiAoY29udGV4dF9ob29rKQorCSAgICBjb250ZXh0X2hvb2sgKHBpZF90b190aHJlYWRfaWQgKHBpZCkpOworCisJICBwcmludGZfZmlsdGVyZWQgKCJbU3dpdGNoaW5nIHRvICVzXVxuIiwgdGFyZ2V0X3BpZF90b19zdHIgKHBpZCkpOworCSAgZmx1c2hfY2FjaGVkX2ZyYW1lcyAoKTsKKwl9CisKKyAgICAgIGlmIChTT0ZUV0FSRV9TSU5HTEVfU1RFUF9QICYmIHNpbmdsZXN0ZXBfYnJlYWtwb2ludHNfaW5zZXJ0ZWRfcCkKKwl7CisJICAvKiBQdWxsIHRoZSBzaW5nbGUgc3RlcCBicmVha3BvaW50cyBvdXQgb2YgdGhlIHRhcmdldC4gKi8KKwkgIFNPRlRXQVJFX1NJTkdMRV9TVEVQICgwLCAwKTsKKwkgIHNpbmdsZXN0ZXBfYnJlYWtwb2ludHNfaW5zZXJ0ZWRfcCA9IDA7CisJfQorCisgICAgICAvKiBJZiBQQyBpcyBwb2ludGluZyBhdCBhIG51bGxpZmllZCBpbnN0cnVjdGlvbiwgdGhlbiBzdGVwIGJleW9uZAorCSBpdCBzbyB0aGF0IHRoZSB1c2VyIHdvbid0IGJlIGNvbmZ1c2VkIHdoZW4gR0RCIGFwcGVhcnMgdG8gYmUgcmVhZHkKKwkgdG8gZXhlY3V0ZSBpdC4gKi8KKworI2lmIDAJCQkJLyogWFhYIERFQlVHICovCisgICAgICBwcmludGYgKCJpbmZydW4uYzoxNjA3OiBwYyA9IDB4JXhcbiIsIHJlYWRfcGMgKCkpOworI2VuZGlmCisgICAgICAvKiAgICAgIGlmIChJTlNUUlVDVElPTl9OVUxMSUZJRUQgJiYgQ1VSUkVOVExZX1NURVBQSU5HICgpKSAqLworICAgICAgaWYgKElOU1RSVUNUSU9OX05VTExJRklFRCkKKwl7CisJICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgdG1wc3RhdHVzOworI2lmIDAKKwkgIGFsbF9yZWdpc3RlcnNfaW5mbyAoKGNoYXIgKikgMCwgMCk7CisjZW5kaWYKKwkgIHJlZ2lzdGVyc19jaGFuZ2VkICgpOworCSAgdGFyZ2V0X3Jlc3VtZSAocGlkLCAxLCBUQVJHRVRfU0lHTkFMXzApOworCisJICAvKiBXZSBtYXkgaGF2ZSByZWNlaXZlZCBhIHNpZ25hbCB0aGF0IHdlIHdhbnQgdG8gcGFzcyB0bworCSAgICAgdGhlIGluZmVyaW9yOyB0aGVyZWZvcmUsIHdlIG11c3Qgbm90IGNsb2JiZXIgdGhlIHdhaXRzdGF0dXMKKwkgICAgIGluIFcuICBTbyB3ZSBjYWxsIHdhaXQgb3Vyc2VsdmVzLCB0aGVuIGNvbnRpbnVlIHRoZSBsb29wCisJICAgICBhdCB0aGUgImhhdmVfd2FpdGVkIiBsYWJlbC4gICovCisJICBpZiAodGFyZ2V0X3dhaXRfaG9vaykKKwkgICAgdGFyZ2V0X3dhaXRfaG9vayAocGlkLCAmdG1wc3RhdHVzKTsKKwkgIGVsc2UKKwkgICAgdGFyZ2V0X3dhaXQgKHBpZCwgJnRtcHN0YXR1cyk7CisKKwkgIGdvdG8gaGF2ZV93YWl0ZWQ7CisJfQorCisjaWZkZWYgSEFWRV9TVEVQUEFCTEVfV0FUQ0hQT0lOVAorICAgICAgLyogSXQgbWF5IG5vdCBiZSBuZWNlc3NhcnkgdG8gZGlzYWJsZSB0aGUgd2F0Y2hwb2ludCB0byBzdG9wIG92ZXIKKwkgaXQuICBGb3IgZXhhbXBsZSwgdGhlIFBBIGNhbiAod2l0aCBzb21lIGtlcm5lbCBjb29wZXJhdGlvbikKKwkgc2luZ2xlIHN0ZXAgb3ZlciBhIHdhdGNocG9pbnQgd2l0aG91dCBkaXNhYmxpbmcgdGhlIHdhdGNocG9pbnQuICAqLworICAgICAgaWYgKFNUT1BQRURfQllfV0FUQ0hQT0lOVCAodykpCisJeworCSAgcmVzdW1lICgxLCAwKTsKKwkgIGNvbnRpbnVlOworCX0KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9OT05TVEVQUEFCTEVfV0FUQ0hQT0lOVAorICAgICAgLyogSXQgaXMgZmFyIG1vcmUgY29tbW9uIHRvIG5lZWQgdG8gZGlzYWJsZSBhIHdhdGNocG9pbnQKKwkgdG8gc3RlcCB0aGUgaW5mZXJpb3Igb3ZlciBpdC4gIEZJWE1FLiAgV2hhdCBlbHNlIG1pZ2h0CisJIGEgZGVidWcgcmVnaXN0ZXIgb3IgcGFnZSBwcm90ZWN0aW9uIHdhdGNocG9pbnQgc2NoZW1lIG5lZWQKKwkgaGVyZT8gICovCisgICAgICBpZiAoU1RPUFBFRF9CWV9XQVRDSFBPSU5UICh3KSkKKwl7CisvKiBBdCB0aGlzIHBvaW50LCB3ZSBhcmUgc3RvcHBlZCBhdCBhbiBpbnN0cnVjdGlvbiB3aGljaCBoYXMgYXR0ZW1wdGVkIHRvIHdyaXRlCisgICB0byBhIHBpZWNlIG9mIG1lbW9yeSB1bmRlciBjb250cm9sIG9mIGEgd2F0Y2hwb2ludC4gIFRoZSBpbnN0cnVjdGlvbiBoYXNuJ3QKKyAgIGFjdHVhbGx5IGV4ZWN1dGVkIHlldC4gIElmIHdlIHdlcmUgdG8gZXZhbHVhdGUgdGhlIHdhdGNocG9pbnQgZXhwcmVzc2lvbgorICAgbm93LCB3ZSB3b3VsZCBnZXQgdGhlIG9sZCB2YWx1ZSwgYW5kIHRoZXJlZm9yZSBubyBjaGFuZ2Ugd291bGQgc2VlbSB0byBoYXZlCisgICBvY2N1cnJlZC4KKworICAgSW4gb3JkZXIgdG8gbWFrZSB3YXRjaHBvaW50cyB3b3JrIGByaWdodCcsIHdlIHJlYWxseSBuZWVkIHRvIGNvbXBsZXRlIHRoZQorICAgbWVtb3J5IHdyaXRlLCBhbmQgdGhlbiBldmFsdWF0ZSB0aGUgd2F0Y2hwb2ludCBleHByZXNzaW9uLiAgVGhlIGZvbGxvd2luZworICAgY29kZSBkb2VzIHRoYXQgYnkgcmVtb3ZpbmcgdGhlIHdhdGNocG9pbnQgKGFjdHVhbGx5LCBhbGwgd2F0Y2hwb2ludHMgYW5kCisgICBicmVha3BvaW50cyksIHNpbmdsZS1zdGVwcGluZyB0aGUgdGFyZ2V0LCByZS1pbnNlcnRpbmcgd2F0Y2hwb2ludHMsIGFuZCB0aGVuCisgICBmYWxsaW5nIHRocm91Z2ggdG8gbGV0IG5vcm1hbCBzaW5nbGUtc3RlcCBwcm9jZXNzaW5nIGhhbmRsZSBwcm9jZWVkLiAgU2luY2UKKyAgIHRoaXMgaW5jbHVkZXMgZXZhbHVhdGluZyB3YXRjaHBvaW50cywgdGhpbmdzIHdpbGwgY29tZSB0byBhIHN0b3AgaW4gdGhlCisgICBjb3JyZWN0IG1hbm5lci4gICovCisKKwkgIHdyaXRlX3BjIChzdG9wX3BjIC0gREVDUl9QQ19BRlRFUl9CUkVBSyk7CisKKwkgIHJlbW92ZV9icmVha3BvaW50cyAoKTsKKwkgIHJlZ2lzdGVyc19jaGFuZ2VkICgpOworCSAgdGFyZ2V0X3Jlc3VtZSAocGlkLCAxLCBUQVJHRVRfU0lHTkFMXzApOwkvKiBTaW5nbGUgc3RlcCAqLworCisJICBpZiAodGFyZ2V0X3dhaXRfaG9vaykKKwkgICAgdGFyZ2V0X3dhaXRfaG9vayAocGlkLCAmdyk7CisJICBlbHNlCisJICAgIHRhcmdldF93YWl0IChwaWQsICZ3KTsKKwkgIGluc2VydF9icmVha3BvaW50cyAoKTsKKworCSAgLyogRklYTUUtbWF5YmU6IGlzIHRoaXMgY2xlYW5lciB0aGFuIHNldHRpbmcgYSBmbGFnPyAgRG9lcyBpdAorCSAgICAgaGFuZGxlIHRoaW5ncyBsaWtlIHNpZ25hbHMgYXJyaXZpbmcgYW5kIG90aGVyIHRoaW5ncyBoYXBwZW5pbmcKKwkgICAgIGluIGNvbWJpbmF0aW9uIGNvcnJlY3RseT8gICovCisJICBzdGVwcGVkX2FmdGVyX3N0b3BwZWRfYnlfd2F0Y2hwb2ludCA9IDE7CisJICBnb3RvIGhhdmVfd2FpdGVkOworCX0KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05USU5VQUJMRV9XQVRDSFBPSU5UCisgICAgICAvKiBJdCBtYXkgYmUgcG9zc2libGUgdG8gc2ltcGx5IGNvbnRpbnVlIGFmdGVyIGEgd2F0Y2hwb2ludC4gICovCisgICAgICBTVE9QUEVEX0JZX1dBVENIUE9JTlQgKHcpOworI2VuZGlmCisKKyAgICAgIHN0b3BfZnVuY19zdGFydCA9IDA7CisgICAgICBzdG9wX2Z1bmNfZW5kID0gMDsKKyAgICAgIHN0b3BfZnVuY19uYW1lID0gMDsKKyAgICAgIC8qIERvbid0IGNhcmUgYWJvdXQgcmV0dXJuIHZhbHVlOyBzdG9wX2Z1bmNfc3RhcnQgYW5kIHN0b3BfZnVuY19uYW1lCisJIHdpbGwgYm90aCBiZSAwIGlmIGl0IGRvZXNuJ3Qgd29yay4gICovCisgICAgICBmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gKHN0b3BfcGMsICZzdG9wX2Z1bmNfbmFtZSwgJnN0b3BfZnVuY19zdGFydCwKKwkJCQkmc3RvcF9mdW5jX2VuZCk7CisgICAgICBzdG9wX2Z1bmNfc3RhcnQgKz0gRlVOQ1RJT05fU1RBUlRfT0ZGU0VUOworICAgICAgYW5vdGhlcl90cmFwID0gMDsKKyAgICAgIGJwc3RhdF9jbGVhciAoJnN0b3BfYnBzdGF0KTsKKyAgICAgIHN0b3Bfc3RlcCA9IDA7CisgICAgICBzdG9wX3N0YWNrX2R1bW15ID0gMDsKKyAgICAgIHN0b3BfcHJpbnRfZnJhbWUgPSAxOworICAgICAgcmFuZG9tX3NpZ25hbCA9IDA7CisgICAgICBzdG9wcGVkX2J5X3JhbmRvbV9zaWduYWwgPSAwOworICAgICAgYnJlYWtwb2ludHNfZmFpbGVkID0gMDsKKworICAgICAgLyogTG9vayBhdCB0aGUgY2F1c2Ugb2YgdGhlIHN0b3AsIGFuZCBkZWNpZGUgd2hhdCB0byBkby4KKwkgVGhlIGFsdGVybmF0aXZlcyBhcmU6CisJIDEpIGJyZWFrOyB0byByZWFsbHkgc3RvcCBhbmQgcmV0dXJuIHRvIHRoZSBkZWJ1Z2dlciwKKwkgMikgZHJvcCB0aHJvdWdoIHRvIHN0YXJ0IHVwIGFnYWluCisJIChzZXQgYW5vdGhlcl90cmFwIHRvIDEgdG8gc2luZ2xlIHN0ZXAgb25jZSkKKwkgMykgc2V0IHJhbmRvbV9zaWduYWwgdG8gMSwgYW5kIHRoZSBkZWNpc2lvbiBiZXR3ZWVuIDEgYW5kIDIKKwkgd2lsbCBiZSBtYWRlIGFjY29yZGluZyB0byB0aGUgc2lnbmFsIGhhbmRsaW5nIHRhYmxlcy4gICovCisKKyAgICAgIC8qIEZpcnN0LCBkaXN0aW5ndWlzaCBzaWduYWxzIGNhdXNlZCBieSB0aGUgZGVidWdnZXIgZnJvbSBzaWduYWxzCisJIHRoYXQgaGF2ZSB0byBkbyB3aXRoIHRoZSBwcm9ncmFtJ3Mgb3duIGFjdGlvbnMuCisJIE5vdGUgdGhhdCBicmVha3BvaW50IGluc25zIG1heSBjYXVzZSBTSUdUUkFQIG9yIFNJR0lMTAorCSBvciBTSUdFTVQsIGRlcGVuZGluZyBvbiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB2ZXJzaW9uLgorCSBIZXJlIHdlIGRldGVjdCB3aGVuIGEgU0lHSUxMIG9yIFNJR0VNVCBpcyByZWFsbHkgYSBicmVha3BvaW50CisJIGFuZCBjaGFuZ2UgaXQgdG8gU0lHVFJBUC4gICovCisKKyAgICAgIGlmIChzdG9wX3NpZ25hbCA9PSBUQVJHRVRfU0lHTkFMX1RSQVAKKwkgIHx8IChicmVha3BvaW50c19pbnNlcnRlZCAmJgorCSAgICAgIChzdG9wX3NpZ25hbCA9PSBUQVJHRVRfU0lHTkFMX0lMTAorCSAgICAgICB8fCBzdG9wX3NpZ25hbCA9PSBUQVJHRVRfU0lHTkFMX0VNVAorCSAgICAgICkpCisJICB8fCBzdG9wX3Nvb25fcXVpZXRseSkKKwl7CisJICBpZiAoc3RvcF9zaWduYWwgPT0gVEFSR0VUX1NJR05BTF9UUkFQICYmIHN0b3BfYWZ0ZXJfdHJhcCkKKwkgICAgeworCSAgICAgIHN0b3BfcHJpbnRfZnJhbWUgPSAwOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBpZiAoc3RvcF9zb29uX3F1aWV0bHkpCisJICAgIGJyZWFrOworCisJICAvKiBEb24ndCBldmVuIHRoaW5rIGFib3V0IGJyZWFrcG9pbnRzCisJICAgICBpZiBqdXN0IHByb2NlZWRlZCBvdmVyIGEgYnJlYWtwb2ludC4KKworCSAgICAgSG93ZXZlciwgaWYgd2UgYXJlIHRyeWluZyB0byBwcm9jZWVkIG92ZXIgYSBicmVha3BvaW50CisJICAgICBhbmQgZW5kIHVwIGluIHNpZ3RyYW1wLCB0aGVuIHRocm91Z2hfc2lndHJhbXBfYnJlYWtwb2ludAorCSAgICAgd2lsbCBiZSBzZXQgYW5kIHdlIHNob3VsZCBjaGVjayB3aGV0aGVyIHdlJ3ZlIGhpdCB0aGUKKwkgICAgIHN0ZXAgYnJlYWtwb2ludC4gICovCisJICBpZiAoc3RvcF9zaWduYWwgPT0gVEFSR0VUX1NJR05BTF9UUkFQICYmIHRyYXBfZXhwZWN0ZWQKKwkgICAgICAmJiB0aHJvdWdoX3NpZ3RyYW1wX2JyZWFrcG9pbnQgPT0gTlVMTCkKKwkgICAgYnBzdGF0X2NsZWFyICgmc3RvcF9icHN0YXQpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogU2VlIGlmIHRoZXJlIGlzIGEgYnJlYWtwb2ludCBhdCB0aGUgY3VycmVudCBQQy4gICovCisJICAgICAgc3RvcF9icHN0YXQgPSBicHN0YXRfc3RvcF9zdGF0dXMKKwkJKCZzdG9wX3BjLAorCQkgKERFQ1JfUENfQUZURVJfQlJFQUsgPworCSAgICAgIC8qIE5vdGljZSB0aGUgY2FzZSBvZiBzdGVwcGluZyB0aHJvdWdoIGEganVtcAorCQkgICAgdGhhdCBsYW5kcyBqdXN0IGFmdGVyIGEgYnJlYWtwb2ludC4KKwkJICAgIERvbid0IGNvbmZ1c2UgdGhhdCB3aXRoIGhpdHRpbmcgdGhlIGJyZWFrcG9pbnQuCisJCSAgICBXaGF0IHdlIGNoZWNrIGZvciBpcyB0aGF0IDEpIHN0ZXBwaW5nIGlzIGdvaW5nIG9uCisJCSAgICBhbmQgMikgdGhlIHBjIGJlZm9yZSB0aGUgbGFzdCBpbnNuIGRvZXMgbm90IG1hdGNoCisJCSAgICB0aGUgYWRkcmVzcyBvZiB0aGUgYnJlYWtwb2ludCBiZWZvcmUgdGhlIGN1cnJlbnQgcGMKKwkJICAgIGFuZCAzKSB3ZSBkaWRuJ3QgaGl0IGEgYnJlYWtwb2ludCBpbiBhIHNpZ25hbCBoYW5kbGVyCisJCSAgICB3aXRob3V0IGFuIGludGVydmVuaW5nIHN0b3AgaW4gc2lndHJhbXAsIHdoaWNoIGlzCisJCSAgICBkZXRlY3RlZCBieSBhIG5ldyBzdGFjayBwb2ludGVyIHZhbHVlIGJlbG93CisJCSAgICBhbnkgdXN1YWwgZnVuY3Rpb24gY2FsbGluZyBzdGFjayBhZGp1c3RtZW50cy4gICovCisJCSAgKENVUlJFTlRMWV9TVEVQUElORyAoKQorCQkgICAmJiBwcmV2X3BjICE9IHN0b3BfcGMgLSBERUNSX1BDX0FGVEVSX0JSRUFLCisJCSAgICYmICEoc3RlcF9yYW5nZV9lbmQKKwkJCSYmIElOTkVSX1RIQU4gKHJlYWRfc3AgKCksIChzdGVwX3NwIC0gMTYpKSkpIDoKKwkJICAwKQorCQkpOworCSAgICAgIC8qIEZvbGxvd2luZyBpbiBjYXNlIGJyZWFrIGNvbmRpdGlvbiBjYWxsZWQgYQorCQkgZnVuY3Rpb24uICAqLworCSAgICAgIHN0b3BfcHJpbnRfZnJhbWUgPSAxOworCSAgICB9CisKKwkgIGlmIChzdG9wX3NpZ25hbCA9PSBUQVJHRVRfU0lHTkFMX1RSQVApCisJICAgIHJhbmRvbV9zaWduYWwKKwkgICAgICA9ICEoYnBzdGF0X2V4cGxhaW5zX3NpZ25hbCAoc3RvcF9icHN0YXQpCisJCSAgfHwgdHJhcF9leHBlY3RlZAorI2lmbmRlZiBDQUxMX0RVTU1ZX0JSRUFLUE9JTlRfT0ZGU0VUCisJCSAgfHwgUENfSU5fQ0FMTF9EVU1NWSAoc3RvcF9wYywgcmVhZF9zcCAoKSwKKwkJCQkgICAgICAgRlJBTUVfRlAgKGdldF9jdXJyZW50X2ZyYW1lICgpKSkKKyNlbmRpZiAvKiBObyBDQUxMX0RVTU1ZX0JSRUFLUE9JTlRfT0ZGU0VULiAgKi8KKwkJICB8fCAoc3RlcF9yYW5nZV9lbmQgJiYgc3RlcF9yZXN1bWVfYnJlYWtwb2ludCA9PSBOVUxMKSk7CisKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHJhbmRvbV9zaWduYWwKKwkJPSAhKGJwc3RhdF9leHBsYWluc19zaWduYWwgKHN0b3BfYnBzdGF0KQorCSAgICAgIC8qIEVuZCBvZiBhIHN0YWNrIGR1bW15LiAgU29tZSBzeXN0ZW1zIChlLmcuIFNvbnkKKwkJICAgICAgIG5ld3MpIGdpdmUgYW5vdGhlciBzaWduYWwgYmVzaWRlcyBTSUdUUkFQLAorCQkgICAgICAgc28gY2hlY2sgaGVyZSBhcyB3ZWxsIGFzIGFib3ZlLiAgKi8KKyNpZm5kZWYgQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVAorCQkgICAgfHwgUENfSU5fQ0FMTF9EVU1NWSAoc3RvcF9wYywgcmVhZF9zcCAoKSwKKwkJCQkJIEZSQU1FX0ZQIChnZXRfY3VycmVudF9mcmFtZSAoKSkpCisjZW5kaWYgLyogTm8gQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVC4gICovCisJCSk7CisJICAgICAgaWYgKCFyYW5kb21fc2lnbmFsKQorCQlzdG9wX3NpZ25hbCA9IFRBUkdFVF9TSUdOQUxfVFJBUDsKKwkgICAgfQorCX0KKworICAgICAgLyogV2hlbiB3ZSByZWFjaCB0aGlzIHBvaW50LCB3ZSd2ZSBwcmV0dHkgbXVjaCBkZWNpZGVkCisgICAgICAgICB0aGF0IHRoZSByZWFzb24gZm9yIHN0b3BwaW5nIG11c3QndmUgYmVlbiBhIHJhbmRvbQorICAgICAgICAgKHVuZXhwZWN0ZWQpIHNpZ25hbC4gKi8KKworICAgICAgZWxzZQorCXJhbmRvbV9zaWduYWwgPSAxOworICAgICAgLyogSWYgYSBmb3JrLCB2Zm9yayBvciBleGVjIGV2ZW50IHdhcyBzZWVuLCB0aGVuIHRoZXJlIGFyZSB0d28KKyAgICAgICAgIHBvc3NpYmxlIHJlc3BvbnNlcyB3ZSBjYW4gbWFrZToKKworICAgICAgICAgMS4gSWYgYSBjYXRjaHBvaW50IHRyaWdnZXJzIGZvciB0aGUgZXZlbnQgKHJhbmRvbV9zaWduYWwgPT0gMCksCisgICAgICAgICAgICB0aGVuIHdlIG11c3Qgc3RvcCBub3cgYW5kIGlzc3VlIGEgcHJvbXB0LiAgV2Ugd2lsbCByZXN1bWUKKyAgICAgICAgICAgIHRoZSBpbmZlcmlvciB3aGVuIHRoZSB1c2VyIHRlbGxzIHVzIHRvLgorICAgICAgICAgMi4gSWYgbm8gY2F0Y2hwb2ludCB0cmlnZ2VycyBmb3IgdGhlIGV2ZW50IChyYW5kb21fc2lnbmFsID09IDEpLAorICAgICAgICAgICAgdGhlbiB3ZSBtdXN0IHJlc3VtZSB0aGUgaW5mZXJpb3Igbm93IGFuZCBrZWVwIGNoZWNraW5nLgorCisgICAgICAgICBJbiBlaXRoZXIgY2FzZSwgd2UgbXVzdCB0YWtlIGFwcHJvcHJpYXRlIHN0ZXBzIHRvICJmb2xsb3ciIHRoZQorICAgICAgICAgdGhlIGZvcmsvdmZvcmsvZXhlYyB3aGVuIHRoZSBpbmZlcmlvciBpcyByZXN1bWVkLiAgRm9yIGV4YW1wbGUsCisgICAgICAgICBpZiBmb2xsb3ctZm9yay1tb2RlIGlzICJjaGlsZCIsIHRoZW4gd2UgbXVzdCBkZXRhY2ggZnJvbSB0aGUKKyAgICAgICAgIHBhcmVudCBpbmZlcmlvciBhbmQgZm9sbG93IHRoZSBuZXcgY2hpbGQgaW5mZXJpb3IuCisKKyAgICAgICAgIEluIGVpdGhlciBjYXNlLCBzZXR0aW5nIHBlbmRpbmdfZm9sbG93IGNhdXNlcyB0aGUgbmV4dCByZXN1bWUoKQorICAgICAgICAgdG8gdGFrZSB0aGUgYXBwcm9wcmlhdGUgZm9sbG93aW5nIGFjdGlvbi4gKi8KKyAgICBwcm9jZXNzX2V2ZW50X3N0b3BfdGVzdDoKKyAgICAgIGlmICh3LmtpbmQgPT0gVEFSR0VUX1dBSVRLSU5EX0ZPUktFRCkKKwl7CisJICBpZiAocmFuZG9tX3NpZ25hbCkJLyogSS5lLiwgbm8gY2F0Y2hwb2ludCB0cmlnZ2VyZWQgZm9yIHRoaXMuICovCisJICAgIHsKKwkgICAgICB0cmFwX2V4cGVjdGVkID0gMTsKKwkgICAgICBzdG9wX3NpZ25hbCA9IFRBUkdFVF9TSUdOQUxfMDsKKwkgICAgICBnb3RvIGtlZXBfZ29pbmc7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmICh3LmtpbmQgPT0gVEFSR0VUX1dBSVRLSU5EX1ZGT1JLRUQpCisJeworCSAgaWYgKHJhbmRvbV9zaWduYWwpCS8qIEkuZS4sIG5vIGNhdGNocG9pbnQgdHJpZ2dlcmVkIGZvciB0aGlzLiAqLworCSAgICB7CisJICAgICAgc3RvcF9zaWduYWwgPSBUQVJHRVRfU0lHTkFMXzA7CisJICAgICAgZ290byBrZWVwX2dvaW5nOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAody5raW5kID09IFRBUkdFVF9XQUlUS0lORF9FWEVDRCkKKwl7CisJICBwZW5kaW5nX2ZvbGxvdy5raW5kID0gdy5raW5kOworCSAgaWYgKHJhbmRvbV9zaWduYWwpCS8qIEkuZS4sIG5vIGNhdGNocG9pbnQgdHJpZ2dlcmVkIGZvciB0aGlzLiAqLworCSAgICB7CisJICAgICAgdHJhcF9leHBlY3RlZCA9IDE7CisJICAgICAgc3RvcF9zaWduYWwgPSBUQVJHRVRfU0lHTkFMXzA7CisJICAgICAgZ290byBrZWVwX2dvaW5nOworCSAgICB9CisJfQorCisgICAgICAvKiBGb3IgdGhlIHByb2dyYW0ncyBvd24gc2lnbmFscywgYWN0IGFjY29yZGluZyB0bworCSB0aGUgc2lnbmFsIGhhbmRsaW5nIHRhYmxlcy4gICovCisKKyAgICAgIGlmIChyYW5kb21fc2lnbmFsKQorCXsKKwkgIC8qIFNpZ25hbCBub3QgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gICovCisJICBpbnQgcHJpbnRlZCA9IDA7CisKKwkgIHN0b3BwZWRfYnlfcmFuZG9tX3NpZ25hbCA9IDE7CisKKwkgIGlmIChzaWduYWxfcHJpbnRbc3RvcF9zaWduYWxdKQorCSAgICB7CisJICAgICAgcHJpbnRlZCA9IDE7CisJICAgICAgdGFyZ2V0X3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCAoKTsKKwkgICAgICBhbm5vdGF0ZV9zaWduYWwgKCk7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5Qcm9ncmFtIHJlY2VpdmVkIHNpZ25hbCAiKTsKKwkgICAgICBhbm5vdGF0ZV9zaWduYWxfbmFtZSAoKTsKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCIlcyIsIHRhcmdldF9zaWduYWxfdG9fbmFtZSAoc3RvcF9zaWduYWwpKTsKKwkgICAgICBhbm5vdGF0ZV9zaWduYWxfbmFtZV9lbmQgKCk7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiLCAiKTsKKwkgICAgICBhbm5vdGF0ZV9zaWduYWxfc3RyaW5nICgpOworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiVzIiwgdGFyZ2V0X3NpZ25hbF90b19zdHJpbmcgKHN0b3Bfc2lnbmFsKSk7CisJICAgICAgYW5ub3RhdGVfc2lnbmFsX3N0cmluZ19lbmQgKCk7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiLlxuIik7CisJICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwkgICAgfQorCSAgaWYgKHNpZ25hbF9zdG9wW3N0b3Bfc2lnbmFsXSkKKwkgICAgYnJlYWs7CisJICAvKiBJZiBub3QgZ29pbmcgdG8gc3RvcCwgZ2l2ZSB0ZXJtaW5hbCBiYWNrCisJICAgICBpZiB3ZSB0b29rIGl0IGF3YXkuICAqLworCSAgZWxzZSBpZiAocHJpbnRlZCkKKwkgICAgdGFyZ2V0X3Rlcm1pbmFsX2luZmVyaW9yICgpOworCisJICAvKiBDbGVhciB0aGUgc2lnbmFsIGlmIGl0IHNob3VsZCBub3QgYmUgcGFzc2VkLiAgKi8KKwkgIGlmIChzaWduYWxfcHJvZ3JhbVtzdG9wX3NpZ25hbF0gPT0gMCkKKwkgICAgc3RvcF9zaWduYWwgPSBUQVJHRVRfU0lHTkFMXzA7CisKKwkgIC8qIElmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSAibmV4dCIgY29tbWFuZCwgbGV0IHRoZSBjb2RlIGZvcgorICAgICAgICAgICAgIHN0ZXBwaW5nIG92ZXIgYSBmdW5jdGlvbiBoYW5kbGUgdGhpcy4gcGFpLzE5OTctMDktMTAKKworICAgICAgICAgICAgIEEgcHJldmlvdXMgY29tbWVudCBoZXJlIHN1Z2dlc3RlZCBpdCB3YXMgcG9zc2libGUgdG8gY2hhbmdlCisgICAgICAgICAgICAgdGhpcyB0byBqdW1wIHRvIGtlZXBfZ29pbmcgaW4gYWxsIGNhc2VzLiAqLworCisJICBpZiAoc3RlcF9vdmVyX2NhbGxzID4gMCkKKwkgICAgZ290byBzdGVwX292ZXJfZnVuY3Rpb247CisJICBlbHNlCisJICAgIGdvdG8gY2hlY2tfc2lndHJhbXAyOworCX0KKworICAgICAgLyogSGFuZGxlIGNhc2VzIGNhdXNlZCBieSBoaXR0aW5nIGEgYnJlYWtwb2ludC4gICovCisgICAgICB7CisJQ09SRV9BRERSIGptcF9idWZfcGM7CisJc3RydWN0IGJwc3RhdF93aGF0IHdoYXQ7CisKKwl3aGF0ID0gYnBzdGF0X3doYXQgKHN0b3BfYnBzdGF0KTsKKworCWlmICh3aGF0LmNhbGxfZHVtbXkpCisJICB7CisJICAgIHN0b3Bfc3RhY2tfZHVtbXkgPSAxOworI2lmZGVmIEhQX09TX0JVRworCSAgICB0cmFwX2V4cGVjdGVkX2FmdGVyX2NvbnRpbnVlID0gMTsKKyNlbmRpZgorCSAgfQorCisJc3dpdGNoICh3aGF0Lm1haW5fYWN0aW9uKQorCSAgeworCSAgY2FzZSBCUFNUQVRfV0hBVF9TRVRfTE9OR0pNUF9SRVNVTUU6CisJICAgIC8qIElmIHdlIGhpdCB0aGUgYnJlYWtwb2ludCBhdCBsb25nam1wLCBkaXNhYmxlIGl0IGZvciB0aGUKKwkgICAgICAgZHVyYXRpb24gb2YgdGhpcyBjb21tYW5kLiAgVGhlbiwgaW5zdGFsbCBhIHRlbXBvcmFyeQorCSAgICAgICBicmVha3BvaW50IGF0IHRoZSB0YXJnZXQgb2YgdGhlIGptcF9idWYuICovCisJICAgIGRpc2FibGVfbG9uZ2ptcF9icmVha3BvaW50ICgpOworCSAgICByZW1vdmVfYnJlYWtwb2ludHMgKCk7CisJICAgIGJyZWFrcG9pbnRzX2luc2VydGVkID0gMDsKKwkgICAgaWYgKCFHRVRfTE9OR0pNUF9UQVJHRVQgKCZqbXBfYnVmX3BjKSkKKwkgICAgICBnb3RvIGtlZXBfZ29pbmc7CisKKwkgICAgLyogTmVlZCB0byBibG93IGF3YXkgc3RlcC1yZXN1bWUgYnJlYWtwb2ludCwgYXMgaXQKKwkgICAgICAgaW50ZXJmZXJlcyB3aXRoIHVzICovCisJICAgIGlmIChzdGVwX3Jlc3VtZV9icmVha3BvaW50ICE9IE5VTEwpCisJICAgICAgeworCQlkZWxldGVfYnJlYWtwb2ludCAoc3RlcF9yZXN1bWVfYnJlYWtwb2ludCk7CisJCXN0ZXBfcmVzdW1lX2JyZWFrcG9pbnQgPSBOVUxMOworCSAgICAgIH0KKwkgICAgLyogTm90IHN1cmUgd2hldGhlciB3ZSBuZWVkIHRvIGJsb3cgdGhpcyBhd2F5IHRvbywgYnV0IHByb2JhYmx5CisJICAgICAgIGl0IGlzIGxpa2UgdGhlIHN0ZXAtcmVzdW1lIGJyZWFrcG9pbnQuICAqLworCSAgICBpZiAodGhyb3VnaF9zaWd0cmFtcF9icmVha3BvaW50ICE9IE5VTEwpCisJICAgICAgeworCQlkZWxldGVfYnJlYWtwb2ludCAodGhyb3VnaF9zaWd0cmFtcF9icmVha3BvaW50KTsKKwkJdGhyb3VnaF9zaWd0cmFtcF9icmVha3BvaW50ID0gTlVMTDsKKwkgICAgICB9CisKKyNpZiAwCisJICAgIC8qIEZJWE1FIC0gTmVlZCB0byBpbXBsZW1lbnQgbmVzdGVkIHRlbXBvcmFyeSBicmVha3BvaW50cyAqLworCSAgICBpZiAoc3RlcF9vdmVyX2NhbGxzID4gMCkKKwkgICAgICBzZXRfbG9uZ2ptcF9yZXN1bWVfYnJlYWtwb2ludCAoam1wX2J1Zl9wYywKKwkJCQkJICAgICBnZXRfY3VycmVudF9mcmFtZSAoKSk7CisJICAgIGVsc2UKKyNlbmRpZiAvKiAwICovCisJICAgICAgc2V0X2xvbmdqbXBfcmVzdW1lX2JyZWFrcG9pbnQgKGptcF9idWZfcGMsIE5VTEwpOworCSAgICBoYW5kbGluZ19sb25nam1wID0gMTsJLyogRklYTUUgKi8KKwkgICAgZ290byBrZWVwX2dvaW5nOworCisJICBjYXNlIEJQU1RBVF9XSEFUX0NMRUFSX0xPTkdKTVBfUkVTVU1FOgorCSAgY2FzZSBCUFNUQVRfV0hBVF9DTEVBUl9MT05HSk1QX1JFU1VNRV9TSU5HTEU6CisJICAgIHJlbW92ZV9icmVha3BvaW50cyAoKTsKKwkgICAgYnJlYWtwb2ludHNfaW5zZXJ0ZWQgPSAwOworI2lmIDAKKwkgICAgLyogRklYTUUgLSBOZWVkIHRvIGltcGxlbWVudCBuZXN0ZWQgdGVtcG9yYXJ5IGJyZWFrcG9pbnRzICovCisJICAgIGlmIChzdGVwX292ZXJfY2FsbHMKKwkJJiYgKElOTkVSX1RIQU4gKEZSQU1FX0ZQIChnZXRfY3VycmVudF9mcmFtZSAoKSksCisJCQkJc3RlcF9mcmFtZV9hZGRyZXNzKSkpCisJICAgICAgeworCQlhbm90aGVyX3RyYXAgPSAxOworCQlnb3RvIGtlZXBfZ29pbmc7CisJICAgICAgfQorI2VuZGlmIC8qIDAgKi8KKwkgICAgZGlzYWJsZV9sb25nam1wX2JyZWFrcG9pbnQgKCk7CisJICAgIGhhbmRsaW5nX2xvbmdqbXAgPSAwOwkvKiBGSVhNRSAqLworCSAgICBpZiAod2hhdC5tYWluX2FjdGlvbiA9PSBCUFNUQVRfV0hBVF9DTEVBUl9MT05HSk1QX1JFU1VNRSkKKwkgICAgICBicmVhazsKKwkgICAgLyogZWxzZSBmYWxsdGhyb3VnaCAqLworCisJICBjYXNlIEJQU1RBVF9XSEFUX1NJTkdMRToKKwkgICAgaWYgKGJyZWFrcG9pbnRzX2luc2VydGVkKQorCSAgICAgIHsKKwkJdGhyZWFkX3N0ZXBfbmVlZGVkID0gMTsKKwkJcmVtb3ZlX2JyZWFrcG9pbnRzICgpOworCSAgICAgIH0KKwkgICAgYnJlYWtwb2ludHNfaW5zZXJ0ZWQgPSAwOworCSAgICBhbm90aGVyX3RyYXAgPSAxOworCSAgICAvKiBTdGlsbCBuZWVkIHRvIGNoZWNrIG90aGVyIHN0dWZmLCBhdCBsZWFzdCB0aGUgY2FzZQorCSAgICAgICB3aGVyZSB3ZSBhcmUgc3RlcHBpbmcgYW5kIHN0ZXAgb3V0IG9mIHRoZSByaWdodCByYW5nZS4gICovCisJICAgIGJyZWFrOworCisJICBjYXNlIEJQU1RBVF9XSEFUX1NUT1BfTk9JU1k6CisJICAgIHN0b3BfcHJpbnRfZnJhbWUgPSAxOworCisJICAgIC8qIFdlIGFyZSBhYm91dCB0byBudWtlIHRoZSBzdGVwX3Jlc3VtZV9icmVha3BvaW50IGFuZAorCSAgICAgICB0aHJvdWdoX3NpZ3RyYW1wX2JyZWFrcG9pbnQgdmlhIHRoZSBjbGVhbnVwIGNoYWluLCBzbworCSAgICAgICBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IGl0IGhlcmUuICAqLworCisJICAgIGdvdG8gc3RvcF9zdGVwcGluZzsKKworCSAgY2FzZSBCUFNUQVRfV0hBVF9TVE9QX1NJTEVOVDoKKwkgICAgc3RvcF9wcmludF9mcmFtZSA9IDA7CisKKwkgICAgLyogV2UgYXJlIGFib3V0IHRvIG51a2UgdGhlIHN0ZXBfcmVzdW1lX2JyZWFrcG9pbnQgYW5kCisJICAgICAgIHRocm91Z2hfc2lndHJhbXBfYnJlYWtwb2ludCB2aWEgdGhlIGNsZWFudXAgY2hhaW4sIHNvCisJICAgICAgIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgaXQgaGVyZS4gICovCisKKwkgICAgZ290byBzdG9wX3N0ZXBwaW5nOworCisJICBjYXNlIEJQU1RBVF9XSEFUX1NURVBfUkVTVU1FOgorCSAgICAvKiBUaGlzIHByb2FibHkgZGVtYW5kcyBhIG1vcmUgZWxlZ2FudCBzb2x1dGlvbiwgYnV0LCB5ZWFoCisgICAgICAgICAgICAgICByaWdodC4uLgorCisgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uJ3MgdXNlIG9mIHRoZSBzaW1wbGUgdmFyaWFibGUKKyAgICAgICAgICAgICAgIHN0ZXBfcmVzdW1lX2JyZWFrcG9pbnQgZG9lc24ndCBzZWVtIHRvIGFjY29tb2RhdGUKKyAgICAgICAgICAgICAgIHNpbXVsdGFuZW91c2x5IGFjdGl2ZSBzdGVwLXJlc3VtZSBicCdzLCBhbHRob3VnaCB0aGUKKyAgICAgICAgICAgICAgIGJyZWFrcG9pbnQgbGlzdCBjZXJ0YWlubHkgY2FuLgorCisgICAgICAgICAgICAgICBJZiB3ZSByZWFjaCBoZXJlIGFuZCBzdGVwX3Jlc3VtZV9icmVha3BvaW50IGlzIGFscmVhZHkKKyAgICAgICAgICAgICAgIE5VTEwsIHRoZW4gYXBwYXJlbnRseSB3ZSBoYXZlIG11bHRpcGxlIGFjdGl2ZQorICAgICAgICAgICAgICAgc3RlcC1yZXN1bWUgYnAncy4gIFdlJ2xsIGp1c3QgZGVsZXRlIHRoZSBicmVha3BvaW50IHdlCisgICAgICAgICAgICAgICBzdG9wcGVkIGF0LCBhbmQgY2Fycnkgb24uICAqLworCSAgICBpZiAoc3RlcF9yZXN1bWVfYnJlYWtwb2ludCA9PSBOVUxMKQorCSAgICAgIHsKKwkJc3RlcF9yZXN1bWVfYnJlYWtwb2ludCA9CisJCSAgYnBzdGF0X2ZpbmRfc3RlcF9yZXN1bWVfYnJlYWtwb2ludCAoc3RvcF9icHN0YXQpOworCSAgICAgIH0KKwkgICAgZGVsZXRlX2JyZWFrcG9pbnQgKHN0ZXBfcmVzdW1lX2JyZWFrcG9pbnQpOworCSAgICBzdGVwX3Jlc3VtZV9icmVha3BvaW50ID0gTlVMTDsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgQlBTVEFUX1dIQVRfVEhST1VHSF9TSUdUUkFNUDoKKwkgICAgaWYgKHRocm91Z2hfc2lndHJhbXBfYnJlYWtwb2ludCkKKwkgICAgICBkZWxldGVfYnJlYWtwb2ludCAodGhyb3VnaF9zaWd0cmFtcF9icmVha3BvaW50KTsKKwkgICAgdGhyb3VnaF9zaWd0cmFtcF9icmVha3BvaW50ID0gTlVMTDsKKworCSAgICAvKiBJZiB3ZXJlIHdhaXRpbmcgZm9yIGEgdHJhcCwgaGl0dGluZyB0aGUgc3RlcF9yZXN1bWVfYnJlYWsKKwkgICAgICAgZG9lc24ndCBjb3VudCBhcyBnZXR0aW5nIGl0LiAgKi8KKwkgICAgaWYgKHRyYXBfZXhwZWN0ZWQpCisJICAgICAgYW5vdGhlcl90cmFwID0gMTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgQlBTVEFUX1dIQVRfQ0hFQ0tfU0hMSUJTOgorCSAgY2FzZSBCUFNUQVRfV0hBVF9DSEVDS19TSExJQlNfUkVTVU1FX0ZST01fSE9PSzoKKyNpZmRlZiBTT0xJQl9BREQKKwkgICAgeworCSAgICAgIGV4dGVybiBpbnQgYXV0b19zb2xpYl9hZGQ7CisKKwkgICAgICAvKiBSZW1vdmUgYnJlYWtwb2ludHMsIHdlIGV2ZW50dWFsbHkgd2FudCB0byBzdGVwIG92ZXIgdGhlCisJCSBzaGxpYiBldmVudCBicmVha3BvaW50LCBhbmQgU09MSUJfQUREIG1pZ2h0IGFkanVzdAorCQkgYnJlYWtwb2ludCBhZGRyZXNzZXMgdmlhIGJyZWFrcG9pbnRfcmVfc2V0LiAgKi8KKwkgICAgICBpZiAoYnJlYWtwb2ludHNfaW5zZXJ0ZWQpCisJCXJlbW92ZV9icmVha3BvaW50cyAoKTsKKwkgICAgICBicmVha3BvaW50c19pbnNlcnRlZCA9IDA7CisKKwkgICAgICAvKiBDaGVjayBmb3IgYW55IG5ld2x5IGFkZGVkIHNoYXJlZCBsaWJyYXJpZXMgaWYgd2UncmUKKwkJIHN1cHBvc2VkIHRvIGJlIGFkZGluZyB0aGVtIGF1dG9tYXRpY2FsbHkuICAqLworCSAgICAgIGlmIChhdXRvX3NvbGliX2FkZCkKKwkJeworCQkgIC8qIFN3aXRjaCB0ZXJtaW5hbCBmb3IgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5CisJCSAgICAgYnJlYWtwb2ludF9yZV9zZXQuICAqLworCQkgIHRhcmdldF90ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgKCk7CisJCSAgU09MSUJfQUREIChOVUxMLCAwLCBOVUxMKTsKKwkJICB0YXJnZXRfdGVybWluYWxfaW5mZXJpb3IgKCk7CisJCX0KKworCSAgICAgIC8qIFRyeSB0byByZWVuYWJsZSBzaGFyZWQgbGlicmFyeSBicmVha3BvaW50cywgYWRkaXRpb25hbAorCQkgY29kZSBzZWdtZW50cyBpbiBzaGFyZWQgbGlicmFyaWVzIG1pZ2h0IGJlIG1hcHBlZCBpbiBub3cuICovCisJICAgICAgcmVfZW5hYmxlX2JyZWFrcG9pbnRzX2luX3NobGlicyAoKTsKKworCSAgICAgIC8qIElmIHJlcXVlc3RlZCwgc3RvcCB3aGVuIHRoZSBkeW5hbWljIGxpbmtlciBub3RpZmllcworCQkgZ2RiIG9mIGV2ZW50cy4gIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIGdldCBjb250cm9sCisJCSBhbmQgcGxhY2UgYnJlYWtwb2ludHMgaW4gaW5pdGlhbGl6ZXIgcm91dGluZXMgZm9yCisJCSBkeW5hbWljYWxseSBsb2FkZWQgb2JqZWN0cyAoYW1vbmcgb3RoZXIgdGhpbmdzKS4gICovCisJICAgICAgaWYgKHN0b3Bfb25fc29saWJfZXZlbnRzKQorCQl7CisJCSAgc3RvcF9wcmludF9mcmFtZSA9IDA7CisJCSAgZ290byBzdG9wX3N0ZXBwaW5nOworCQl9CisKKwkgICAgICAvKiBJZiB3ZSBzdG9wcGVkIGR1ZSB0byBhbiBleHBsaWNpdCBjYXRjaHBvaW50LCB0aGVuIHRoZQorICAgICAgICAgICAgICAgICAoc2VlIGFib3ZlKSBjYWxsIHRvIFNPTElCX0FERCBwdWxsZWQgaW4gYW55IHN5bWJvbHMKKyAgICAgICAgICAgICAgICAgZnJvbSBhIG5ld2x5LWxvYWRlZCBsaWJyYXJ5LCBpZiBhcHByb3ByaWF0ZS4KKworICAgICAgICAgICAgICAgICBXZSBkbyB3YW50IHRoZSBpbmZlcmlvciB0byBzdG9wLCBidXQgbm90IHdoZXJlIGl0IGlzCisgICAgICAgICAgICAgICAgIG5vdywgd2hpY2ggaXMgaW4gdGhlIGR5bmFtaWMgbGlua2VyIGNhbGxiYWNrLiAgUmF0aGVyLAorICAgICAgICAgICAgICAgICB3ZSB3b3VsZCBsaWtlIGl0IHN0b3AgaW4gdGhlIHVzZXIncyBwcm9ncmFtLCBqdXN0IGFmdGVyCisgICAgICAgICAgICAgICAgIHRoZSBjYWxsIHRoYXQgY2F1c2VkIHRoaXMgY2F0Y2hwb2ludCB0byB0cmlnZ2VyLiAgVGhhdAorICAgICAgICAgICAgICAgICBnaXZlcyB0aGUgdXNlciBhIG1vcmUgdXNlZnVsIHZhbnRhZ2UgZnJvbSB3aGljaCB0bworICAgICAgICAgICAgICAgICBleGFtaW5lIHRoZWlyIHByb2dyYW0ncyBzdGF0ZS4gKi8KKwkgICAgICBlbHNlIGlmICh3aGF0Lm1haW5fYWN0aW9uID09IEJQU1RBVF9XSEFUX0NIRUNLX1NITElCU19SRVNVTUVfRlJPTV9IT09LKQorCQl7CisJCSAgLyogPz9yZWhyYXVlcjogSWYgSSBjb3VsZCBmaWd1cmUgb3V0IGhvdyB0byBnZXQgdGhlCisgICAgICAgICAgICAgICAgICAgICByaWdodCByZXR1cm4gUEMgZnJvbSBoZXJlLCB3ZSBjb3VsZCBqdXN0IHNldCBhIHRlbXAKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQgYW5kIHJlc3VtZS4gIEknbSBub3Qgc3VyZSB3ZSBjYW4gd2l0aG91dAorICAgICAgICAgICAgICAgICAgICAgY3JhY2tpbmcgb3BlbiB0aGUgZGxkJ3Mgc2hhcmVkIGxpYnJhcmllcyBhbmQgc25pZmZpbmcKKyAgICAgICAgICAgICAgICAgICAgIHRoZWlyIHVud2luZCB0YWJsZXMgYW5kIHRleHQvZGF0YSByYW5nZXMsIGFuZCB0aGF0J3MKKyAgICAgICAgICAgICAgICAgICAgIG5vdCBhIHRlcnJpYmx5IHBvcnRhYmxlIG5vdGlvbi4KKworICAgICAgICAgICAgICAgICAgICAgVW50aWwgdGhhdCB0aW1lLCB3ZSBtdXN0IHN0ZXAgdGhlIGluZmVyaW9yIG91dCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGRsZCBjYWxsYmFjaywgYW5kIGFsc28gb3V0IG9mIHRoZSBkbGQgaXRzZWxmIChhbmQgYW55CisgICAgICAgICAgICAgICAgICAgICBjb2RlIG9yIHN0dWJzIGluIGxpYmRsZC5zbCwgc3VjaCBhcyAic2hsX2xvYWQiIGFuZAorICAgICAgICAgICAgICAgICAgICAgZnJpZW5kcykgdW50aWwgd2UgcmVhY2ggbm9uLWRsZCBjb2RlLiAgQXQgdGhhdCBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgIHdlIGNhbiBzdG9wIHN0ZXBwaW5nLiAqLworCQkgIGJwc3RhdF9nZXRfdHJpZ2dlcmVkX2NhdGNocG9pbnRzIChzdG9wX2Jwc3RhdCwKKwkJCQkgICAgICAgJnN0ZXBwaW5nX3Rocm91Z2hfc29saWJfY2F0Y2hwb2ludHMpOworCQkgIHN0ZXBwaW5nX3Rocm91Z2hfc29saWJfYWZ0ZXJfY2F0Y2ggPSAxOworCisJCSAgLyogQmUgc3VyZSB0byBsaWZ0IGFsbCBicmVha3BvaW50cywgc28gdGhlIGluZmVyaW9yIGRvZXMKKyAgICAgICAgICAgICAgICAgICAgIGFjdHVhbGx5IHN0ZXAgcGFzdCB0aGlzIHBvaW50Li4uICovCisJCSAgYW5vdGhlcl90cmFwID0gMTsKKwkJICBicmVhazsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIFdlIHdhbnQgdG8gc3RlcCBvdmVyIHRoaXMgYnJlYWtwb2ludCwgdGhlbiBrZWVwIGdvaW5nLiAgKi8KKwkJICBhbm90aGVyX3RyYXAgPSAxOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKyNlbmRpZgorCSAgICBicmVhazsKKworCSAgY2FzZSBCUFNUQVRfV0hBVF9MQVNUOgorCSAgICAvKiBOb3QgYSByZWFsIGNvZGUsIGJ1dCBsaXN0ZWQgaGVyZSB0byBzaHV0IHVwIGdjYyAtV2FsbC4gICovCisKKwkgIGNhc2UgQlBTVEFUX1dIQVRfS0VFUF9DSEVDS0lORzoKKwkgICAgYnJlYWs7CisJICB9CisgICAgICB9CisKKyAgICAgIC8qIFdlIGNvbWUgaGVyZSBpZiB3ZSBoaXQgYSBicmVha3BvaW50IGJ1dCBzaG91bGQgbm90CisJIHN0b3AgZm9yIGl0LiAgUG9zc2libHkgd2UgYWxzbyB3ZXJlIHN0ZXBwaW5nCisJIGFuZCBzaG91bGQgc3RvcCBmb3IgdGhhdC4gIFNvIGZhbGwgdGhyb3VnaCBhbmQKKwkgdGVzdCBmb3Igc3RlcHBpbmcuICBCdXQsIGlmIG5vdCBzdGVwcGluZywKKwkgZG8gbm90IHN0b3AuICAqLworCisgICAgICAvKiBBcmUgd2Ugc3RlcHBpbmcgdG8gZ2V0IHRoZSBpbmZlcmlvciBvdXQgb2YgdGhlIGR5bmFtaWMKKyAgICAgICAgIGxpbmtlcidzIGhvb2sgKGFuZCBwb3NzaWJseSB0aGUgZGxkIGl0c2VsZikgYWZ0ZXIgY2F0Y2hpbmcKKyAgICAgICAgIGEgc2hsaWIgZXZlbnQ/ICovCisgICAgICBpZiAoc3RlcHBpbmdfdGhyb3VnaF9zb2xpYl9hZnRlcl9jYXRjaCkKKwl7CisjaWYgZGVmaW5lZChTT0xJQl9BREQpCisJICAvKiBIYXZlIHdlIHJlYWNoZWQgb3VyIGRlc3RpbmF0aW9uPyAgSWYgbm90LCBrZWVwIGdvaW5nLiAqLworCSAgaWYgKFNPTElCX0lOX0RZTkFNSUNfTElOS0VSIChwaWQsIHN0b3BfcGMpKQorCSAgICB7CisJICAgICAgYW5vdGhlcl90cmFwID0gMTsKKwkgICAgICBnb3RvIGtlZXBfZ29pbmc7CisJICAgIH0KKyNlbmRpZgorCSAgLyogRWxzZSwgc3RvcCBhbmQgcmVwb3J0IHRoZSBjYXRjaHBvaW50KHMpIHdob3NlIHRyaWdnZXJpbmcKKyAgICAgICAgICAgICBjYXVzZWQgdXMgdG8gYmVnaW4gc3RlcHBpbmcuICovCisJICBzdGVwcGluZ190aHJvdWdoX3NvbGliX2FmdGVyX2NhdGNoID0gMDsKKwkgIGJwc3RhdF9jbGVhciAoJnN0b3BfYnBzdGF0KTsKKwkgIHN0b3BfYnBzdGF0ID0gYnBzdGF0X2NvcHkgKHN0ZXBwaW5nX3Rocm91Z2hfc29saWJfY2F0Y2hwb2ludHMpOworCSAgYnBzdGF0X2NsZWFyICgmc3RlcHBpbmdfdGhyb3VnaF9zb2xpYl9jYXRjaHBvaW50cyk7CisJICBzdG9wX3ByaW50X2ZyYW1lID0gMTsKKwkgIGdvdG8gc3RvcF9zdGVwcGluZzsKKwl9CisKKyNpZm5kZWYgQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVAorICAgICAgLyogVGhpcyBpcyB0aGUgb2xkIHdheSBvZiBkZXRlY3RpbmcgdGhlIGVuZCBvZiB0aGUgc3RhY2sgZHVtbXkuCisJIEFuIGFyY2hpdGVjdHVyZSB3aGljaCBkZWZpbmVzIENBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQgZ2V0cworCSBoYW5kbGVkIGFib3ZlLiAgQXMgc29vbiBhcyB3ZSBjYW4gdGVzdCBpdCBvbiBhbGwgb2YgdGhlbSwgYWxsCisJIGFyY2hpdGVjdHVyZXMgc2hvdWxkIGRlZmluZSBpdC4gICovCisKKyAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGJyZWFrcG9pbnQgYXQgdGhlIGVuZCBvZiBhIHN0YWNrIGR1bW15LAorCSBqdXN0IHN0b3Agc2lsZW50bHksIHVubGVzcyB0aGUgdXNlciB3YXMgZG9pbmcgYW4gc2kvbmksIGluIHdoaWNoCisJIGNhc2Ugc2hlJ2QgYmV0dGVyIGtub3cgd2hhdCBzaGUncyBkb2luZy4gICovCisKKyAgICAgIGlmIChDQUxMX0RVTU1ZX0hBU19DT01QTEVURUQgKHN0b3BfcGMsIHJlYWRfc3AgKCksCisJCQkJICAgIEZSQU1FX0ZQIChnZXRfY3VycmVudF9mcmFtZSAoKSkpCisJICAmJiAhc3RlcF9yYW5nZV9lbmQpCisJeworCSAgc3RvcF9wcmludF9mcmFtZSA9IDA7CisJICBzdG9wX3N0YWNrX2R1bW15ID0gMTsKKyNpZmRlZiBIUF9PU19CVUcKKwkgIHRyYXBfZXhwZWN0ZWRfYWZ0ZXJfY29udGludWUgPSAxOworI2VuZGlmCisJICBicmVhazsKKwl9CisjZW5kaWYgLyogTm8gQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVC4gICovCisKKyAgICAgIGlmIChzdGVwX3Jlc3VtZV9icmVha3BvaW50KQorCS8qIEhhdmluZyBhIHN0ZXAtcmVzdW1lIGJyZWFrcG9pbnQgb3ZlcnJpZGVzIGFueXRoaW5nCisJICAgZWxzZSBoYXZpbmcgdG8gZG8gd2l0aCBzdGVwcGluZyBjb21tYW5kcyB1bnRpbAorCSAgIHRoYXQgYnJlYWtwb2ludCBpcyByZWFjaGVkLiAgKi8KKwkvKiBJJ20gbm90IHN1cmUgd2hldGhlciB0aGlzIG5lZWRzIHRvIGJlIGNoZWNrX3NpZ3RyYW1wMiBvcgorCSAgIHdoZXRoZXIgaXQgY291bGQvc2hvdWxkIGJlIGtlZXBfZ29pbmcuICAqLworCWdvdG8gY2hlY2tfc2lndHJhbXAyOworCisgICAgICBpZiAoc3RlcF9yYW5nZV9lbmQgPT0gMCkKKwkvKiBMaWtld2lzZSBpZiB3ZSBhcmVuJ3QgZXZlbiBzdGVwcGluZy4gICovCisJLyogSSdtIG5vdCBzdXJlIHdoZXRoZXIgdGhpcyBuZWVkcyB0byBiZSBjaGVja19zaWd0cmFtcDIgb3IKKwkgICB3aGV0aGVyIGl0IGNvdWxkL3Nob3VsZCBiZSBrZWVwX2dvaW5nLiAgKi8KKwlnb3RvIGNoZWNrX3NpZ3RyYW1wMjsKKworICAgICAgLyogSWYgc3RlcHBpbmcgdGhyb3VnaCBhIGxpbmUsIGtlZXAgZ29pbmcgaWYgc3RpbGwgd2l0aGluIGl0LgorCisgICAgICAgICBOb3RlIHRoYXQgc3RlcF9yYW5nZV9lbmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGluc3RydWN0aW9uCisgICAgICAgICBiZXlvbmQgdGhlIHN0ZXAgcmFuZ2UsIGFuZCBOT1QgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24KKyAgICAgICAgIHdpdGhpbiBpdCEgKi8KKyAgICAgIGlmIChzdG9wX3BjID49IHN0ZXBfcmFuZ2Vfc3RhcnQKKwkgICYmIHN0b3BfcGMgPCBzdGVwX3JhbmdlX2VuZAorI2lmIDAKKy8qIEkgaGF2ZW4ndCBhIGNsdWUgd2hhdCBtaWdodCB0cmlnZ2VyIHRoaXMgY2xhdXNlLCBhbmQgaXQgc2VlbXMgd3JvbmcKKyAgIGFueXdheSwgc28gSSd2ZSBkaXNhYmxlZCBpdCB1bnRpbCBzb21lb25lIGNvbXBsYWlucy4gIC1TdHUgMTAvMjQvOTUgKi8KKworICAgICAgLyogVGhlIHN0ZXAgcmFuZ2UgbWlnaHQgaW5jbHVkZSB0aGUgc3RhcnQgb2YgdGhlCisJICAgICBmdW5jdGlvbiwgc28gaWYgd2UgYXJlIGF0IHRoZSBzdGFydCBvZiB0aGUKKwkgICAgIHN0ZXAgcmFuZ2UgYW5kIGVpdGhlciB0aGUgc3RhY2sgb3IgZnJhbWUgcG9pbnRlcnMKKwkgICAgIGp1c3QgY2hhbmdlZCwgd2UndmUgc3RlcHBlZCBvdXRzaWRlICovCisJICAmJiAhKHN0b3BfcGMgPT0gc3RlcF9yYW5nZV9zdGFydAorCSAgICAgICAmJiBGUkFNRV9GUCAoZ2V0X2N1cnJlbnRfZnJhbWUgKCkpCisJICAgICAgICYmIChJTk5FUl9USEFOIChyZWFkX3NwICgpLCBzdGVwX3NwKQorCQkgICB8fCBGUkFNRV9GUCAoZ2V0X2N1cnJlbnRfZnJhbWUgKCkpICE9IHN0ZXBfZnJhbWVfYWRkcmVzcykpCisjZW5kaWYKKwkpCisJeworCSAgLyogV2UgbWlnaHQgYmUgZG9pbmcgYSBCUFNUQVRfV0hBVF9TSU5HTEUgYW5kIGdldHRpbmcgYSBzaWduYWwuCisJICAgICBTbyBkZWZpbmF0ZWx5IG5lZWQgdG8gY2hlY2sgZm9yIHNpZ3RyYW1wIGhlcmUuICAqLworCSAgZ290byBjaGVja19zaWd0cmFtcDI7CisJfQorCisgICAgICAvKiBXZSBzdGVwcGVkIG91dCBvZiB0aGUgc3RlcHBpbmcgcmFuZ2UuICAqLworCisgICAgICAvKiBJZiB3ZSBhcmUgc3RlcHBpbmcgYXQgdGhlIHNvdXJjZSBsZXZlbCBhbmQgZW50ZXJlZCB0aGUgcnVudGltZQorICAgICAgICAgbG9hZGVyIGR5bmFtaWMgc3ltYm9sIHJlc29sdXRpb24gY29kZSwgd2Uga2VlcCBvbiBzaW5nbGUgc3RlcHBpbmcKKwkgdW50aWwgd2UgZXhpdCB0aGUgcnVuIHRpbWUgbG9hZGVyIGNvZGUgYW5kIHJlYWNoIHRoZSBjYWxsZWUncworCSBhZGRyZXNzLiAgKi8KKyAgICAgIGlmIChzdGVwX292ZXJfY2FsbHMgPCAwICYmIElOX1NPTElCX0RZTlNZTV9SRVNPTFZFX0NPREUgKHN0b3BfcGMpKQorCWdvdG8ga2VlcF9nb2luZzsKKworICAgICAgLyogV2UgY2FuJ3QgdXBkYXRlIHN0ZXBfc3AgZXZlcnkgdGltZSB0aHJvdWdoIHRoZSBsb29wLCBiZWNhdXNlCisJIHJlYWRpbmcgdGhlIHN0YWNrIHBvaW50ZXIgd291bGQgc2xvdyBkb3duIHN0ZXBwaW5nIHRvbyBtdWNoLgorCSBCdXQgd2UgY2FuIHVwZGF0ZSBpdCBldmVyeSB0aW1lIHdlIGxlYXZlIHRoZSBzdGVwIHJhbmdlLiAgKi8KKyAgICAgIHVwZGF0ZV9zdGVwX3NwID0gMTsKKworICAgICAgLyogRGlkIHdlIGp1c3QgdGFrZSBhIHNpZ25hbD8gICovCisgICAgICBpZiAoSU5fU0lHVFJBTVAgKHN0b3BfcGMsIHN0b3BfZnVuY19uYW1lKQorCSAgJiYgIUlOX1NJR1RSQU1QIChwcmV2X3BjLCBwcmV2X2Z1bmNfbmFtZSkKKwkgICYmIElOTkVSX1RIQU4gKHJlYWRfc3AgKCksIHN0ZXBfc3ApKQorCXsKKwkgIC8qIFdlJ3ZlIGp1c3QgdGFrZW4gYSBzaWduYWw7IGdvIHVudGlsIHdlIGFyZSBiYWNrIHRvCisJICAgICB0aGUgcG9pbnQgd2hlcmUgd2UgdG9vayBpdCBhbmQgb25lIG1vcmUuICAqLworCisJICAvKiBOb3RlOiBUaGUgdGVzdCBhYm92ZSBzdWNjZWVkcyBub3Qgb25seSB3aGVuIHdlIHN0ZXBwZWQKKyAgICAgICAgICAgICBpbnRvIGEgc2lnbmFsIGhhbmRsZXIsIGJ1dCBhbHNvIHdoZW4gd2Ugc3RlcCBwYXN0IHRoZSBsYXN0CisgICAgICAgICAgICAgc3RhdGVtZW50IG9mIGEgc2lnbmFsIGhhbmRsZXIgYW5kIGVuZCB1cCBpbiB0aGUgcmV0dXJuIHN0dWIKKyAgICAgICAgICAgICBvZiB0aGUgc2lnbmFsIGhhbmRsZXIgdHJhbXBvbGluZS4gIFRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KKyAgICAgICAgICAgICB0aGVzZSB0d28gY2FzZXMsIGNoZWNrIHRoYXQgdGhlIGZyYW1lIGlzIElOTkVSX1RIQU4gdGhlCisgICAgICAgICAgICAgcHJldmlvdXMgb25lIGJlbG93LiBwYWkvMTk5Ny0wOS0xMSAqLworCisKKwkgIHsKKwkgICAgQ09SRV9BRERSIGN1cnJlbnRfZnJhbWUgPSBGUkFNRV9GUCAoZ2V0X2N1cnJlbnRfZnJhbWUgKCkpOworCisJICAgIGlmIChJTk5FUl9USEFOIChjdXJyZW50X2ZyYW1lLCBzdGVwX2ZyYW1lX2FkZHJlc3MpKQorCSAgICAgIHsKKwkJLyogV2UgaGF2ZSBqdXN0IHRha2VuIGEgc2lnbmFsOyBnbyB1bnRpbCB3ZSBhcmUgYmFjayB0bworICAgICAgICAgICAgICAgICAgIHRoZSBwb2ludCB3aGVyZSB3ZSB0b29rIGl0IGFuZCBvbmUgbW9yZS4gICovCisKKwkJLyogVGhpcyBjb2RlIGlzIG5lZWRlZCBhdCBsZWFzdCBpbiB0aGUgZm9sbG93aW5nIGNhc2U6CisgICAgICAgICAgICAgICAgICAgVGhlIHVzZXIgdHlwZXMgIm5leHQiIGFuZCB0aGVuIGEgc2lnbmFsIGFycml2ZXMgKGJlZm9yZQorICAgICAgICAgICAgICAgICAgIHRoZSAibmV4dCIgaXMgZG9uZSkuICAqLworCisJCS8qIE5vdGUgdGhhdCBpZiB3ZSBhcmUgc3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQsIHRoZW4gd2UgbmVlZAorICAgICAgICAgICAgICAgICAgIHRoZSBzdGVwX3Jlc3VtZSBicmVha3BvaW50IHRvIG92ZXJyaWRlIGFueSBicmVha3BvaW50cyBhdAorICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIGxvY2F0aW9uLCBzbyB0aGF0IHdlIHdpbGwgc3RpbGwgc3RlcCBvdmVyIHRoZQorICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQgZXZlbiB0aG91Z2ggdGhlIHNpZ25hbCBoYXBwZW5lZC4gICovCisJCXN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc3Jfc2FsOworCisJCUlOSVRfU0FMICgmc3Jfc2FsKTsKKwkJc3Jfc2FsLnN5bXRhYiA9IE5VTEw7CisJCXNyX3NhbC5saW5lID0gMDsKKwkJc3Jfc2FsLnBjID0gcHJldl9wYzsKKwkJLyogV2UgY291bGQgcHJvYmFibHkgYmUgc2V0dGluZyB0aGUgZnJhbWUgdG8KKyAgICAgICAgICAgICAgICAgICBzdGVwX2ZyYW1lX2FkZHJlc3M7IEkgZG9uJ3QgdGhpbmsgYW55b25lIHRob3VnaHQgdG8KKyAgICAgICAgICAgICAgICAgICB0cnkgaXQuICAqLworCQlzdGVwX3Jlc3VtZV9icmVha3BvaW50ID0KKwkJICBzZXRfbW9tZW50YXJ5X2JyZWFrcG9pbnQgKHNyX3NhbCwgTlVMTCwgYnBfc3RlcF9yZXN1bWUpOworCQlpZiAoYnJlYWtwb2ludHNfaW5zZXJ0ZWQpCisJCSAgaW5zZXJ0X2JyZWFrcG9pbnRzICgpOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJLyogV2UganVzdCBzdGVwcGVkIG91dCBvZiBhIHNpZ25hbCBoYW5kbGVyIGFuZCBpbnRvCisgICAgICAgICAgICAgICAgICAgaXRzIGNhbGxpbmcgdHJhbXBvbGluZS4KKworICAgICAgICAgICAgICAgICAgIE5vcm1hbGx5LCB3ZSdkIGp1bXAgdG8gc3RlcF9vdmVyX2Z1bmN0aW9uIGZyb20KKyAgICAgICAgICAgICAgICAgICBoZXJlLCBidXQgZm9yIHNvbWUgcmVhc29uIEdEQiBjYW4ndCB1bndpbmQgdGhlCisgICAgICAgICAgICAgICAgICAgc3RhY2sgY29ycmVjdGx5IHRvIGZpbmQgdGhlIHJlYWwgUEMgZm9yIHRoZSBwb2ludAorICAgICAgICAgICAgICAgICAgIHVzZXIgY29kZSB3aGVyZSB0aGUgc2lnbmFsIHRyYW1wb2xpbmUgd2lsbCByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAtLSBGUkFNRV9TQVZFRF9QQyBmYWlscywgYXQgbGVhc3Qgb24gSFAtVVggMTAuMjAuCisgICAgICAgICAgICAgICAgICAgQnV0IHNpZ25hbCB0cmFtcG9saW5lcyBhcmUgcHJldHR5IHNtYWxsIHN0dWJzIG9mCisgICAgICAgICAgICAgICAgICAgY29kZSwgYW55d2F5LCBzbyBpdCdzIE9LIGluc3RlYWQgdG8ganVzdAorICAgICAgICAgICAgICAgICAgIHNpbmdsZS1zdGVwIG91dC4gIE5vdGU6IGFzc3VtaW5nIHN1Y2ggdHJhbXBvbGluZXMKKyAgICAgICAgICAgICAgICAgICBkb24ndCBleGhpYml0IHJlY3Vyc2lvbiBvbiBhbnkgcGxhdGZvcm0uLi4gKi8KKwkJZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIChzdG9wX3BjLCAmc3RvcF9mdW5jX25hbWUsCisJCQkJCSAgJnN0b3BfZnVuY19zdGFydCwKKwkJCQkJICAmc3RvcF9mdW5jX2VuZCk7CisJCS8qIFJlYWRqdXN0IHN0ZXBwaW5nIHJhbmdlICovCisJCXN0ZXBfcmFuZ2Vfc3RhcnQgPSBzdG9wX2Z1bmNfc3RhcnQ7CisJCXN0ZXBfcmFuZ2VfZW5kID0gc3RvcF9mdW5jX2VuZDsKKwkJc3RlcHBpbmdfdGhyb3VnaF9zaWd0cmFtcCA9IDE7CisJICAgICAgfQorCSAgfQorCisKKwkgIC8qIElmIHRoaXMgaXMgc3RlcGkgb3IgbmV4dGksIG1ha2Ugc3VyZSB0aGF0IHRoZSBzdGVwcGluZyByYW5nZQorCSAgICAgZ2V0cyB1cyBwYXN0IHRoYXQgaW5zdHJ1Y3Rpb24uICAqLworCSAgaWYgKHN0ZXBfcmFuZ2VfZW5kID09IDEpCisJICAgIC8qIEZJWE1FOiBEb2VzIHRoaXMgcnVuIGFmb3VsIG9mIHRoZSBjb2RlIGJlbG93IHdoaWNoLCBpZgorCSAgICAgICB3ZSBzdGVwIGludG8gdGhlIG1pZGRsZSBvZiBhIGxpbmUsIHJlc2V0cyB0aGUgc3RlcHBpbmcKKwkgICAgICAgcmFuZ2U/ICAqLworCSAgICBzdGVwX3JhbmdlX2VuZCA9IChzdGVwX3JhbmdlX3N0YXJ0ID0gcHJldl9wYykgKyAxOworCisJICByZW1vdmVfYnJlYWtwb2ludHNfb25fZm9sbG93aW5nX3N0ZXAgPSAxOworCSAgZ290byBrZWVwX2dvaW5nOworCX0KKworI2lmIDAKKyAgICAgIC8qIEkgZGlzYWJsZWQgdGhpcyB0ZXN0IGJlY2F1c2UgaXQgd2FzIHRvbyBjb21wbGljYXRlZCBhbmQgc2xvdy4KKwkgVGhlIFNLSVBfUFJPTE9HVUUgd2FzIGVzcGVjaWFsbHkgc2xvdywgYmVjYXVzZSBpdCBjYXVzZWQKKwkgdW5uZWNlc3NhcnkgcHJvbG9ndWUgZXhhbWluYXRpb24gb24gdmFyaW91cyBhcmNoaXRlY3R1cmVzLgorCSBUaGUgY29kZSBpbiB0aGUgI2Vsc2UgY2xhdXNlIGhhcyBiZWVuIHRlc3RlZCBvbiB0aGUgU3BhcmMsCisJIE1pcHMsIFBBLCBhbmQgUG93ZXIgYXJjaGl0ZWN0dXJlcywgc28gaXQncyBwcmV0dHkgbGlrZWx5IHRvCisJIGJlIGNvcnJlY3QuICAtU3R1IDEwLzI0Lzk1ICovCisKKyAgICAgIC8qIFNlZSBpZiB3ZSBsZWZ0IHRoZSBzdGVwIHJhbmdlIGR1ZSB0byBhIHN1YnJvdXRpbmUgY2FsbCB0aGF0CisJIHdlIHNob3VsZCBwcm9jZWVkIHRvIHRoZSBlbmQgb2YuICAqLworCisgICAgICBpZiAoc3RvcF9mdW5jX3N0YXJ0KQorCXsKKwkgIHN0cnVjdCBzeW10YWIgKnM7CisKKwkgIC8qIERvIHRoaXMgYWZ0ZXIgdGhlIElOX1NJR1RSQU1QIGNoZWNrOyBpdCBtaWdodCBnaXZlCisJICAgICBhbiBlcnJvci4gICovCisJICBwcm9sb2d1ZV9wYyA9IHN0b3BfZnVuY19zdGFydDsKKworCSAgLyogRG9uJ3Qgc2tpcCB0aGUgcHJvbG9ndWUgaWYgdGhpcyBpcyBhc3NlbWJseSBzb3VyY2UgKi8KKwkgIHMgPSBmaW5kX3BjX3N5bXRhYiAoc3RvcF9wYyk7CisJICBpZiAocyAmJiBzLT5sYW5ndWFnZSAhPSBsYW5ndWFnZV9hc20pCisJICAgIFNLSVBfUFJPTE9HVUUgKHByb2xvZ3VlX3BjKTsKKwl9CisKKyAgICAgIGlmICghKElOTkVSX1RIQU4gKHN0ZXBfc3AsIHJlYWRfc3AgKCkpKQkvKiBkb24ndCBtaXN0YWtlIChzaWcpcmV0dXJuCisJCQkJCQkgICBhcyBhIGNhbGwgKi8KKwkgICYmICgJCQkvKiBNaWdodCBiZSBhIG5vbi1yZWN1cnNpdmUgY2FsbC4gIElmIHRoZSBzeW1ib2xzIGFyZSBtaXNzaW5nCisJCSBlbm91Z2ggdGhhdCBzdG9wX2Z1bmNfc3RhcnQgPT0gcHJldl9mdW5jX3N0YXJ0IGV2ZW4gdGhvdWdoCisJCSB0aGV5IGFyZSByZWFsbHkgdHdvIGZ1bmN0aW9ucywgd2Ugd2lsbCB0cmVhdCBzb21lIGNhbGxzIGFzCisJCSBqdW1wcy4gICovCisJICAgICAgIHN0b3BfZnVuY19zdGFydCAhPSBwcmV2X2Z1bmNfc3RhcnQKKworICAgICAgLyogTWlnaHQgYmUgYSByZWN1cnNpdmUgY2FsbCBpZiBlaXRoZXIgd2UgaGF2ZSBhIHByb2xvZ3VlCisJCSBvciB0aGUgY2FsbCBpbnN0cnVjdGlvbiBpdHNlbGYgc2F2ZXMgdGhlIFBDIG9uIHRoZSBzdGFjay4gICovCisJICAgICAgIHx8IHByb2xvZ3VlX3BjICE9IHN0b3BfZnVuY19zdGFydAorCSAgICAgICB8fCByZWFkX3NwICgpICE9IHN0ZXBfc3ApCisJICAmJiAoCQkJLyogUEMgaXMgY29tcGxldGVseSBvdXQgb2YgYm91bmRzIG9mIGFueSBrbm93biBvYmpmaWxlcy4gIFRyZWF0CisJCSBsaWtlIGEgc3Vicm91dGluZSBjYWxsLiAqLworCSAgICAgICAhc3RvcF9mdW5jX3N0YXJ0CisKKyAgICAgIC8qIElmIHdlIGRvIGEgY2FsbCwgd2Ugd2lsbCBiZSBhdCB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbi4uLiAgKi8KKwkgICAgICAgfHwgc3RvcF9wYyA9PSBzdG9wX2Z1bmNfc3RhcnQKKworICAgICAgLyogLi4uZXhjZXB0IG9uIHRoZSBBbHBoYSB3aXRoIC1PIChhbmQgYWxzbyBJcml4IDUgYW5kCisJCSBwZXJoYXBzIG90aGVycyksIGluIHdoaWNoIHdlIG1pZ2h0IGNhbGwgdGhlIGFkZHJlc3MKKwkJIGFmdGVyIHRoZSBsb2FkIG9mIGdwLiAgU2luY2UgcHJvbG9ndWVzIGRvbid0IGNvbnRhaW4KKwkJIGNhbGxzLCB3ZSBjYW4ndCByZXR1cm4gdG8gd2l0aGluIG9uZSwgYW5kIHdlIGRvbid0CisJCSBqdW1wIGJhY2sgaW50byB0aGVtLCBzbyB0aGlzIGNoZWNrIGlzIE9LLiAgKi8KKworCSAgICAgICB8fCBzdG9wX3BjIDwgcHJvbG9ndWVfcGMKKworICAgICAgLyogLi4uYW5kIGlmIGl0IGlzIGEgbGVhZiBmdW5jdGlvbiwgdGhlIHByb2xvZ3VlIG1pZ2h0CisgCQkgY29uc2lzdCBvZiBncCBsb2FkaW5nIG9ubHksIHNvIHRoZSBjYWxsIHRyYW5zZmVycyB0bworIAkJIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBhZnRlciB0aGUgcHJvbG9ndWUuICAqLworCSAgICAgICB8fCAoc3RvcF9wYyA9PSBwcm9sb2d1ZV9wYworCisgICAgICAvKiBEaXN0aW5ndWlzaCB0aGlzIGZyb20gdGhlIGNhc2Ugd2hlcmUgd2UganVtcCBiYWNrCisJCSAgICAgdG8gdGhlIGZpcnN0IGluc3RydWN0aW9uIGFmdGVyIHRoZSBwcm9sb2d1ZSwKKwkJICAgICB3aXRoaW4gYSBmdW5jdGlvbi4gICovCisJCSAgICYmIHN0b3BfZnVuY19zdGFydCAhPSBwcmV2X2Z1bmNfc3RhcnQpCisKKyAgICAgIC8qIElmIHdlIGVuZCB1cCBpbiBjZXJ0YWluIHBsYWNlcywgaXQgbWVhbnMgd2UgZGlkIGEgc3Vicm91dGluZQorCQkgY2FsbC4gIEknbSBub3QgY29tcGxldGVseSBzdXJlIHRoaXMgaXMgbmVjZXNzYXJ5IG5vdyB0aGF0IHdlCisJCSBoYXZlIHRoZSBhYm92ZSBjaGVja3Mgd2l0aCBzdG9wX2Z1bmNfc3RhcnQgKGFuZCBub3cgdGhhdAorCQkgZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIGlzIHBpY2tpZXIpLiAgKi8KKwkgICAgICAgfHwgSU5fU09MSUJfQ0FMTF9UUkFNUE9MSU5FIChzdG9wX3BjLCBzdG9wX2Z1bmNfbmFtZSkKKworICAgICAgLyogSWYgbm9uZSBvZiB0aGUgYWJvdmUgYXBwbHksIGl0IGlzIGEganVtcCB3aXRoaW4gYSBmdW5jdGlvbiwKKwkJIG9yIGEgcmV0dXJuIGZyb20gYSBzdWJyb3V0aW5lLiAgVGhlIG90aGVyIGNhc2UgaXMgbG9uZ2ptcCwKKwkJIHdoaWNoIGNhbiBubyBsb25nZXIgaGFwcGVuIGhlcmUgYXMgbG9uZyBhcyB0aGUKKwkJIGhhbmRsaW5nX2xvbmdqbXAgc3R1ZmYgaXMgd29ya2luZy4gICovCisJICApKQorI2Vsc2UKKyAgICAgIC8qIFRoaXMgdGVzdCBpcyBhIG11Y2ggbW9yZSBzdHJlYW1saW5lZCwgKGJ1dCBob3BlZnVsbHkgY29ycmVjdCkKKwkgICByZXBsYWNlbWVudCBmb3IgdGhlIGNvZGUgYWJvdmUuICBJdCdzIGJlZW4gdGVzdGVkIG9uIHRoZSBTcGFyYywKKwkgICBNaXBzLCBQQSwgYW5kIFBvd2VyIGFyY2hpdGVjdHVyZXMgd2l0aCBnb29kIHJlc3VsdHMuICAqLworCisgICAgICBpZiAoc3RvcF9wYyA9PSBzdG9wX2Z1bmNfc3RhcnQJLyogUXVpY2sgdGVzdCAqLworCSAgfHwgKGluX3Byb2xvZ3VlIChzdG9wX3BjLCBzdG9wX2Z1bmNfc3RhcnQpICYmCisJICAgICAgIUlOX1NPTElCX1JFVFVSTl9UUkFNUE9MSU5FIChzdG9wX3BjLCBzdG9wX2Z1bmNfbmFtZSkpCisJICB8fCBJTl9TT0xJQl9DQUxMX1RSQU1QT0xJTkUgKHN0b3BfcGMsIHN0b3BfZnVuY19uYW1lKQorCSAgfHwgc3RvcF9mdW5jX25hbWUgPT0gMCkKKyNlbmRpZgorCisJeworCSAgLyogSXQncyBhIHN1YnJvdXRpbmUgY2FsbC4gICovCisKKwkgIGlmIChzdGVwX292ZXJfY2FsbHMgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIEkgcHJlc3VtZSB0aGF0IHN0ZXBfb3Zlcl9jYWxscyBpcyBvbmx5IDAgd2hlbiB3ZSdyZQorCQkgc3VwcG9zZWQgdG8gYmUgc3RlcHBpbmcgYXQgdGhlIGFzc2VtYmx5IGxhbmd1YWdlIGxldmVsCisJCSAoInN0ZXBpIikuICBKdXN0IHN0b3AuICAqLworCSAgICAgIHN0b3Bfc3RlcCA9IDE7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgaWYgKHN0ZXBfb3Zlcl9jYWxscyA+IDAgfHwgSUdOT1JFX0hFTFBFUl9DQUxMIChzdG9wX3BjKSkKKwkgICAgLyogV2UncmUgZG9pbmcgYSAibmV4dCIuICAqLworCSAgICBnb3RvIHN0ZXBfb3Zlcl9mdW5jdGlvbjsKKworCSAgLyogSWYgd2UgYXJlIGluIGEgZnVuY3Rpb24gY2FsbCB0cmFtcG9saW5lIChhIHN0dWIgYmV0d2VlbgorCSAgICAgdGhlIGNhbGxpbmcgcm91dGluZSBhbmQgdGhlIHJlYWwgZnVuY3Rpb24pLCBsb2NhdGUgdGhlIHJlYWwKKwkgICAgIGZ1bmN0aW9uLiAgVGhhdCdzIHdoYXQgdGVsbHMgdXMgKGEpIHdoZXRoZXIgd2Ugd2FudCB0byBzdGVwCisJICAgICBpbnRvIGl0IGF0IGFsbCwgYW5kIChiKSB3aGF0IHByb2xvZ3VlIHdlIHdhbnQgdG8gcnVuIHRvCisJICAgICB0aGUgZW5kIG9mLCBpZiB3ZSBkbyBzdGVwIGludG8gaXQuICAqLworCSAgdG1wID0gU0tJUF9UUkFNUE9MSU5FX0NPREUgKHN0b3BfcGMpOworCSAgaWYgKHRtcCAhPSAwKQorCSAgICBzdG9wX2Z1bmNfc3RhcnQgPSB0bXA7CisJICBlbHNlCisJICAgIHsKKwkgICAgICB0bXAgPSBEWU5BTUlDX1RSQU1QT0xJTkVfTkVYVFBDIChzdG9wX3BjKTsKKwkgICAgICBpZiAodG1wKQorCQl7CisJCSAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSB4eHg7CisJCSAgLyogV2h5IGlzbid0IHRoaXMgc19hX2wgY2FsbGVkICJzcl9zYWwiLCBsaWtlIGFsbCBvZiB0aGUKKwkJICAgICBvdGhlciBzX2FfbCdzIHdoZXJlIHRoaXMgY29kZSBpcyBkdXBsaWNhdGVkPyAgKi8KKwkJICBJTklUX1NBTCAoJnh4eCk7CS8qIGluaXRpYWxpemUgdG8gemVyb2VzICovCisJCSAgeHh4LnBjID0gdG1wOworCQkgIHh4eC5zZWN0aW9uID0gZmluZF9wY19vdmVybGF5ICh4eHgucGMpOworCQkgIHN0ZXBfcmVzdW1lX2JyZWFrcG9pbnQgPQorCQkgICAgc2V0X21vbWVudGFyeV9icmVha3BvaW50ICh4eHgsIE5VTEwsIGJwX3N0ZXBfcmVzdW1lKTsKKwkJICBpbnNlcnRfYnJlYWtwb2ludHMgKCk7CisJCSAgZ290byBrZWVwX2dvaW5nOworCQl9CisJICAgIH0KKworCSAgLyogSWYgd2UgaGF2ZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGZ1bmN0aW9uIHdlCisJICAgICBhcmUgdGhpbmtpbmcgb2Ygc3RlcHBpbmcgaW50bywgc3RlcCBpbnRvIGl0LgorCisJICAgICBJZiB0aGVyZSBhcmUgc2V2ZXJhbCBzeW10YWJzIGF0IHRoYXQgUEMgKGUuZy4gd2l0aCBpbmNsdWRlCisJICAgICBmaWxlcyksIGp1c3Qgd2FudCB0byBrbm93IHdoZXRoZXIgKmFueSogb2YgdGhlbSBoYXZlIGxpbmUKKwkgICAgIG51bWJlcnMuICBmaW5kX3BjX2xpbmUgaGFuZGxlcyB0aGlzLiAgKi8KKwkgIHsKKwkgICAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSB0bXBfc2FsOworCisJICAgIHRtcF9zYWwgPSBmaW5kX3BjX2xpbmUgKHN0b3BfZnVuY19zdGFydCwgMCk7CisJICAgIGlmICh0bXBfc2FsLmxpbmUgIT0gMCkKKwkgICAgICBnb3RvIHN0ZXBfaW50b19mdW5jdGlvbjsKKwkgIH0KKworCXN0ZXBfb3Zlcl9mdW5jdGlvbjoKKwkgIC8qIEEgc3Vicm91dGluZSBjYWxsIGhhcyBoYXBwZW5lZC4gICovCisJICB7CisJICAgIC8qIFNldCBhIHNwZWNpYWwgYnJlYWtwb2ludCBhZnRlciB0aGUgcmV0dXJuICovCisJICAgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc3Jfc2FsOworCisJICAgIElOSVRfU0FMICgmc3Jfc2FsKTsKKwkgICAgc3Jfc2FsLnN5bXRhYiA9IE5VTEw7CisJICAgIHNyX3NhbC5saW5lID0gMDsKKworCSAgICAvKiBJZiB3ZSBjYW1lIGhlcmUgYWZ0ZXIgZW5jb3VudGVyaW5nIGEgc2lnbmFsIGluIHRoZSBtaWRkbGUgb2YKKyAgICAgICAgICAgICAgIGEgIm5leHQiLCB1c2UgdGhlIHN0YXNoZWQtYXdheSBwcmV2aW91cyBmcmFtZSBwYyAqLworCSAgICBzcl9zYWwucGMKKwkgICAgICA9IHN0b3BwZWRfYnlfcmFuZG9tX3NpZ25hbAorCSAgICAgID8gcHJldl9wYworCSAgICAgIDogQUREUl9CSVRTX1JFTU9WRSAoU0FWRURfUENfQUZURVJfQ0FMTCAoZ2V0X2N1cnJlbnRfZnJhbWUgKCkpKTsKKworCSAgICBzdGVwX3Jlc3VtZV9icmVha3BvaW50ID0KKwkgICAgICBzZXRfbW9tZW50YXJ5X2JyZWFrcG9pbnQgKHNyX3NhbCwKKwkJCQkJc3RvcHBlZF9ieV9yYW5kb21fc2lnbmFsID8KKwkJCQkJTlVMTCA6IGdldF9jdXJyZW50X2ZyYW1lICgpLAorCQkJCQlicF9zdGVwX3Jlc3VtZSk7CisKKwkgICAgLyogV2UndmUganVzdCBlbnRlcmVkIGEgY2FsbGVlLCBhbmQgd2Ugd2lzaCB0byByZXN1bWUgdW50aWwKKyAgICAgICAgICAgICAgIGl0IHJldHVybnMgdG8gdGhlIGNhbGxlci4gIFNldHRpbmcgYSBzdGVwX3Jlc3VtZSBicCBvbgorICAgICAgICAgICAgICAgdGhlIHJldHVybiBQQyB3aWxsIGNhdGNoIGEgcmV0dXJuIGZyb20gdGhlIGNhbGxlZS4KKworICAgICAgICAgICAgICAgSG93ZXZlciwgaWYgdGhlIGNhbGxlZSBpcyByZWN1cnNpbmcsIHdlIHdhbnQgdG8gYmUKKyAgICAgICAgICAgICAgIGNhcmVmdWwgbm90IHRvIGNhdGNoIHJldHVybnMgb2YgdGhvc2UgcmVjdXJzaXZlIGNhbGxzLAorICAgICAgICAgICAgICAgYnV0IG9mIFRISVMgaW5zdGFuY2Ugb2YgdGhlIGNhbGwuCisKKyAgICAgICAgICAgICAgIFRvIGRvIHRoaXMsIHdlIHNldCB0aGUgc3RlcF9yZXN1bWUgYnAncyBmcmFtZSB0byBvdXIKKyAgICAgICAgICAgICAgIGN1cnJlbnQgY2FsbGVyJ3MgZnJhbWUgKHN0ZXBfZnJhbWVfYWRkcmVzcywgd2hpY2ggaXMKKyAgICAgICAgICAgICAgIHNldCBieSB0aGUgIm5leHQiIG9yICJ1bnRpbCIgY29tbWFuZCwgYmVmb3JlIGV4ZWN1dGlvbgorICAgICAgICAgICAgICAgYmVnaW5zKS4KKworICAgICAgICAgICAgICAgQnV0IC4uLiBkb24ndCBkbyBpdCBpZiB3ZSdyZSBzaW5nbGUtc3RlcHBpbmcgb3V0IG9mIGEKKyAgICAgICAgICAgICAgIHNpZ3RyYW1wLCBiZWNhdXNlIHRoZSByZWFzb24gd2UncmUgc2luZ2xlLXN0ZXBwaW5nIGlzCisgICAgICAgICAgICAgICBwcmVjaXNlbHkgYmVjYXVzZSB1bndpbmRpbmcgaXMgYSBwcm9ibGVtIChIUC1VWCAxMC4yMCwKKyAgICAgICAgICAgICAgIGUuZy4pIGFuZCB0aGUgZnJhbWUgYWRkcmVzcyBpcyBsaWtlbHkgdG8gYmUgaW5jb3JyZWN0LgorICAgICAgICAgICAgICAgTm8gZGFuZ2VyIG9mIHNpZ3RyYW1wIHJlY3Vyc2lvbi4gICovCisKKwkgICAgaWYgKHN0ZXBwaW5nX3Rocm91Z2hfc2lndHJhbXApCisJICAgICAgeworCQlzdGVwX3Jlc3VtZV9icmVha3BvaW50LT5mcmFtZSA9IChDT1JFX0FERFIpIE5VTEw7CisJCXN0ZXBwaW5nX3Rocm91Z2hfc2lndHJhbXAgPSAwOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoIUlOX1NPTElCX0RZTlNZTV9SRVNPTFZFX0NPREUgKHNyX3NhbC5wYykpCisJICAgICAgc3RlcF9yZXN1bWVfYnJlYWtwb2ludC0+ZnJhbWUgPSBzdGVwX2ZyYW1lX2FkZHJlc3M7CisKKwkgICAgaWYgKGJyZWFrcG9pbnRzX2luc2VydGVkKQorCSAgICAgIGluc2VydF9icmVha3BvaW50cyAoKTsKKwkgIH0KKwkgIGdvdG8ga2VlcF9nb2luZzsKKworCXN0ZXBfaW50b19mdW5jdGlvbjoKKwkgIC8qIFN1YnJvdXRpbmUgY2FsbCB3aXRoIHNvdXJjZSBjb2RlIHdlIHNob3VsZCBub3Qgc3RlcCBvdmVyLgorCSAgICAgRG8gc3RlcCB0byB0aGUgZmlyc3QgbGluZSBvZiBjb2RlIGluIGl0LiAgKi8KKwkgIHsKKwkgICAgc3RydWN0IHN5bXRhYiAqczsKKworCSAgICBzID0gZmluZF9wY19zeW10YWIgKHN0b3BfcGMpOworCSAgICBpZiAocyAmJiBzLT5sYW5ndWFnZSAhPSBsYW5ndWFnZV9hc20pCisJICAgICAgU0tJUF9QUk9MT0dVRSAoc3RvcF9mdW5jX3N0YXJ0KTsKKwkgIH0KKwkgIHNhbCA9IGZpbmRfcGNfbGluZSAoc3RvcF9mdW5jX3N0YXJ0LCAwKTsKKwkgIC8qIFVzZSB0aGUgc3RlcF9yZXN1bWVfYnJlYWsgdG8gc3RlcCB1bnRpbAorCSAgICAgdGhlIGVuZCBvZiB0aGUgcHJvbG9ndWUsIGV2ZW4gaWYgdGhhdCBpbnZvbHZlcyBqdW1wcworCSAgICAgKGFzIGl0IHNlZW1zIHRvIG9uIHRoZSB2YXggdW5kZXIgNC4yKS4gICovCisJICAvKiBJZiB0aGUgcHJvbG9ndWUgZW5kcyBpbiB0aGUgbWlkZGxlIG9mIGEgc291cmNlIGxpbmUsCisJICAgICBjb250aW51ZSB0byB0aGUgZW5kIG9mIHRoYXQgc291cmNlIGxpbmUgKGlmIGl0IGlzIHN0aWxsCisJICAgICB3aXRoaW4gdGhlIGZ1bmN0aW9uKS4gIE90aGVyd2lzZSwganVzdCBnbyB0byBlbmQgb2YgcHJvbG9ndWUuICAqLworI2lmZGVmIFBST0xPR1VFX0ZJUlNUTElORV9PVkVSTEFQCisJICAvKiBubywgZG9uJ3QgZWl0aGVyLiAgSXQgc2tpcHMgYW55IGNvZGUgdGhhdCdzCisJICAgICBsZWdpdGltYXRlbHkgb24gdGhlIGZpcnN0IGxpbmUuICAqLworI2Vsc2UKKwkgIGlmIChzYWwuZW5kICYmIHNhbC5wYyAhPSBzdG9wX2Z1bmNfc3RhcnQgJiYgc2FsLmVuZCA8IHN0b3BfZnVuY19lbmQpCisJICAgIHN0b3BfZnVuY19zdGFydCA9IHNhbC5lbmQ7CisjZW5kaWYKKworCSAgaWYgKHN0b3BfZnVuY19zdGFydCA9PSBzdG9wX3BjKQorCSAgICB7CisJICAgICAgLyogV2UgYXJlIGFscmVhZHkgdGhlcmU6IHN0b3Agbm93LiAgKi8KKwkgICAgICBzdG9wX3N0ZXAgPSAxOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBlbHNlCisJICAgIC8qIFB1dCB0aGUgc3RlcC1icmVha3BvaW50IHRoZXJlIGFuZCBnbyB1bnRpbCB0aGVyZS4gKi8KKwkgICAgeworCSAgICAgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc3Jfc2FsOworCisJICAgICAgSU5JVF9TQUwgKCZzcl9zYWwpOwkvKiBpbml0aWFsaXplIHRvIHplcm9lcyAqLworCSAgICAgIHNyX3NhbC5wYyA9IHN0b3BfZnVuY19zdGFydDsKKwkgICAgICBzcl9zYWwuc2VjdGlvbiA9IGZpbmRfcGNfb3ZlcmxheSAoc3RvcF9mdW5jX3N0YXJ0KTsKKwkgICAgICAvKiBEbyBub3Qgc3BlY2lmeSB3aGF0IHRoZSBmcCBzaG91bGQgYmUgd2hlbiB3ZSBzdG9wCisJCSBzaW5jZSBvbiBzb21lIG1hY2hpbmVzIHRoZSBwcm9sb2d1ZQorCQkgaXMgd2hlcmUgdGhlIG5ldyBmcCB2YWx1ZSBpcyBlc3RhYmxpc2hlZC4gICovCisJICAgICAgc3RlcF9yZXN1bWVfYnJlYWtwb2ludCA9CisJCXNldF9tb21lbnRhcnlfYnJlYWtwb2ludCAoc3Jfc2FsLCBOVUxMLCBicF9zdGVwX3Jlc3VtZSk7CisJICAgICAgaWYgKGJyZWFrcG9pbnRzX2luc2VydGVkKQorCQlpbnNlcnRfYnJlYWtwb2ludHMgKCk7CisKKwkgICAgICAvKiBBbmQgbWFrZSBzdXJlIHN0ZXBwaW5nIHN0b3BzIHJpZ2h0IGF3YXkgdGhlbi4gICovCisJICAgICAgc3RlcF9yYW5nZV9lbmQgPSBzdGVwX3JhbmdlX3N0YXJ0OworCSAgICB9CisJICBnb3RvIGtlZXBfZ29pbmc7CisJfQorCisgICAgICAvKiBXZSd2ZSB3YW5kZXJlZCBvdXQgb2YgdGhlIHN0ZXAgcmFuZ2UuICAqLworCisgICAgICBzYWwgPSBmaW5kX3BjX2xpbmUgKHN0b3BfcGMsIDApOworCisgICAgICBpZiAoc3RlcF9yYW5nZV9lbmQgPT0gMSkKKwl7CisJICAvKiBJdCBpcyBzdGVwaSBvciBuZXh0aS4gIFdlIGFsd2F5cyB3YW50IHRvIHN0b3Agc3RlcHBpbmcgYWZ0ZXIKKwkgICAgIG9uZSBpbnN0cnVjdGlvbi4gICovCisJICBzdG9wX3N0ZXAgPSAxOworCSAgYnJlYWs7CisJfQorCisgICAgICAvKiBJZiB3ZSdyZSBpbiB0aGUgcmV0dXJuIHBhdGggZnJvbSBhIHNoYXJlZCBsaWJyYXJ5IHRyYW1wb2xpbmUsCisJIHdlIHdhbnQgdG8gcHJvY2VlZCB0aHJvdWdoIHRoZSB0cmFtcG9saW5lIHdoZW4gc3RlcHBpbmcuICAqLworICAgICAgaWYgKElOX1NPTElCX1JFVFVSTl9UUkFNUE9MSU5FIChzdG9wX3BjLCBzdG9wX2Z1bmNfbmFtZSkpCisJeworCSAgQ09SRV9BRERSIHRtcDsKKworCSAgLyogRGV0ZXJtaW5lIHdoZXJlIHRoaXMgdHJhbXBvbGluZSByZXR1cm5zLiAgKi8KKwkgIHRtcCA9IFNLSVBfVFJBTVBPTElORV9DT0RFIChzdG9wX3BjKTsKKworCSAgLyogT25seSBwcm9jZWVkIHRocm91Z2ggaWYgd2Uga25vdyB3aGVyZSBpdCdzIGdvaW5nLiAgKi8KKwkgIGlmICh0bXApCisJICAgIHsKKwkgICAgICAvKiBBbmQgcHV0IHRoZSBzdGVwLWJyZWFrcG9pbnQgdGhlcmUgYW5kIGdvIHVudGlsIHRoZXJlLiAqLworCSAgICAgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc3Jfc2FsOworCisJICAgICAgSU5JVF9TQUwgKCZzcl9zYWwpOwkvKiBpbml0aWFsaXplIHRvIHplcm9lcyAqLworCSAgICAgIHNyX3NhbC5wYyA9IHRtcDsKKwkgICAgICBzcl9zYWwuc2VjdGlvbiA9IGZpbmRfcGNfb3ZlcmxheSAoc3Jfc2FsLnBjKTsKKwkgICAgICAvKiBEbyBub3Qgc3BlY2lmeSB3aGF0IHRoZSBmcCBzaG91bGQgYmUgd2hlbiB3ZSBzdG9wCisJCSBzaW5jZSBvbiBzb21lIG1hY2hpbmVzIHRoZSBwcm9sb2d1ZQorCQkgaXMgd2hlcmUgdGhlIG5ldyBmcCB2YWx1ZSBpcyBlc3RhYmxpc2hlZC4gICovCisJICAgICAgc3RlcF9yZXN1bWVfYnJlYWtwb2ludCA9CisJCXNldF9tb21lbnRhcnlfYnJlYWtwb2ludCAoc3Jfc2FsLCBOVUxMLCBicF9zdGVwX3Jlc3VtZSk7CisJICAgICAgaWYgKGJyZWFrcG9pbnRzX2luc2VydGVkKQorCQlpbnNlcnRfYnJlYWtwb2ludHMgKCk7CisKKwkgICAgICAvKiBSZXN0YXJ0IHdpdGhvdXQgZmlkZGxpbmcgd2l0aCB0aGUgc3RlcCByYW5nZXMgb3IKKwkJIG90aGVyIHN0YXRlLiAgKi8KKwkgICAgICBnb3RvIGtlZXBfZ29pbmc7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChzYWwubGluZSA9PSAwKQorCXsKKwkgIC8qIFdlIGhhdmUgbm8gbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICBUaGF0IG1lYW5zIHRvIHN0b3AKKwkgICAgIHN0ZXBwaW5nIChkb2VzIHRoaXMgYWx3YXlzIGhhcHBlbiByaWdodCBhZnRlciBvbmUgaW5zdHJ1Y3Rpb24sCisJICAgICB3aGVuIHdlIGRvICJzIiBpbiBhIGZ1bmN0aW9uIHdpdGggbm8gbGluZSBudW1iZXJzLAorCSAgICAgb3IgY2FuIHRoaXMgaGFwcGVuIGFzIGEgcmVzdWx0IG9mIGEgcmV0dXJuIG9yIGxvbmdqbXA/KS4gICovCisJICBzdG9wX3N0ZXAgPSAxOworCSAgYnJlYWs7CisJfQorCisgICAgICBpZiAoKHN0b3BfcGMgPT0gc2FsLnBjKQorCSAgJiYgKGN1cnJlbnRfbGluZSAhPSBzYWwubGluZSB8fCBjdXJyZW50X3N5bXRhYiAhPSBzYWwuc3ltdGFiKSkKKwl7CisJICAvKiBXZSBhcmUgYXQgdGhlIHN0YXJ0IG9mIGEgZGlmZmVyZW50IGxpbmUuICBTbyBzdG9wLiAgTm90ZSB0aGF0CisJICAgICB3ZSBkb24ndCBzdG9wIGlmIHdlIHN0ZXAgaW50byB0aGUgbWlkZGxlIG9mIGEgZGlmZmVyZW50IGxpbmUuCisJICAgICBUaGF0IGlzIHNhaWQgdG8gbWFrZSB0aGluZ3MgbGlrZSBmb3IgKDs7KSBzdGF0ZW1lbnRzIHdvcmsKKwkgICAgIGJldHRlci4gICovCisJICBzdG9wX3N0ZXAgPSAxOworCSAgYnJlYWs7CisJfQorCisgICAgICAvKiBXZSBhcmVuJ3QgZG9uZSBzdGVwcGluZy4KKworCSBPcHRpbWl6ZSBieSBzZXR0aW5nIHRoZSBzdGVwcGluZyByYW5nZSB0byB0aGUgbGluZS4KKwkgKFdlIG1pZ2h0IG5vdCBiZSBpbiB0aGUgb3JpZ2luYWwgbGluZSwgYnV0IGlmIHdlIGVudGVyZWQgYQorCSBuZXcgbGluZSBpbiBtaWQtc3RhdGVtZW50LCB3ZSBjb250aW51ZSBzdGVwcGluZy4gIFRoaXMgbWFrZXMKKwkgdGhpbmdzIGxpa2UgZm9yKDs7KSBzdGF0ZW1lbnRzIHdvcmsgYmV0dGVyLikgICovCisKKyAgICAgIGlmIChzdG9wX2Z1bmNfZW5kICYmIHNhbC5lbmQgPj0gc3RvcF9mdW5jX2VuZCkKKwl7CisJICAvKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGZ1bmN0aW9uLCBkb24ndCBrZWVwIHN0ZXBwaW5nCisJICAgICAoaXQgd291bGQgcHJvYmFibHkgc3RlcCB1cyBvdXQgb2YgdGhlIGZ1bmN0aW9uKS4KKwkgICAgIFRoaXMgaXMgcGFydGljdWxhcmx5IG5lY2Vzc2FyeSBmb3IgYSBvbmUtbGluZSBmdW5jdGlvbiwKKwkgICAgIGluIHdoaWNoIGFmdGVyIHNraXBwaW5nIHRoZSBwcm9sb2d1ZSB3ZSBiZXR0ZXIgc3RvcCBldmVuIHRob3VnaAorCSAgICAgd2Ugd2lsbCBiZSBpbiBtaWQtbGluZS4gICovCisJICBzdG9wX3N0ZXAgPSAxOworCSAgYnJlYWs7CisJfQorICAgICAgc3RlcF9yYW5nZV9zdGFydCA9IHNhbC5wYzsKKyAgICAgIHN0ZXBfcmFuZ2VfZW5kID0gc2FsLmVuZDsKKyAgICAgIHN0ZXBfZnJhbWVfYWRkcmVzcyA9IEZSQU1FX0ZQIChnZXRfY3VycmVudF9mcmFtZSAoKSk7CisgICAgICBjdXJyZW50X2xpbmUgPSBzYWwubGluZTsKKyAgICAgIGN1cnJlbnRfc3ltdGFiID0gc2FsLnN5bXRhYjsKKworICAgICAgLyogSW4gdGhlIGNhc2Ugd2hlcmUgd2UganVzdCBzdGVwcGVkIG91dCBvZiBhIGZ1bmN0aW9uIGludG8gdGhlIG1pZGRsZQorICAgICAgICAgb2YgYSBsaW5lIG9mIHRoZSBjYWxsZXIsIGNvbnRpbnVlIHN0ZXBwaW5nLCBidXQgc3RlcF9mcmFtZV9hZGRyZXNzCisgICAgICAgICBtdXN0IGJlIG1vZGlmaWVkIHRvIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgIHsKKwlDT1JFX0FERFIgY3VycmVudF9mcmFtZSA9IEZSQU1FX0ZQIChnZXRfY3VycmVudF9mcmFtZSAoKSk7CisJaWYgKCEoSU5ORVJfVEhBTiAoY3VycmVudF9mcmFtZSwgc3RlcF9mcmFtZV9hZGRyZXNzKSkpCisJICBzdGVwX2ZyYW1lX2FkZHJlc3MgPSBjdXJyZW50X2ZyYW1lOworICAgICAgfQorCisKKyAgICAgIGdvdG8ga2VlcF9nb2luZzsKKworICAgIGNoZWNrX3NpZ3RyYW1wMjoKKyAgICAgIGlmICh0cmFwX2V4cGVjdGVkCisJICAmJiBJTl9TSUdUUkFNUCAoc3RvcF9wYywgc3RvcF9mdW5jX25hbWUpCisJICAmJiAhSU5fU0lHVFJBTVAgKHByZXZfcGMsIHByZXZfZnVuY19uYW1lKQorCSAgJiYgSU5ORVJfVEhBTiAocmVhZF9zcCAoKSwgc3RlcF9zcCkpCisJeworCSAgLyogV2hhdCBoYXMgaGFwcGVuZWQgaGVyZSBpcyB0aGF0IHdlIGhhdmUganVzdCBzdGVwcGVkIHRoZSBpbmZlcmlvcgorCSAgICAgd2l0aCBhIHNpZ25hbCAoYmVjYXVzZSBpdCBpcyBhIHNpZ25hbCB3aGljaCBzaG91bGRuJ3QgbWFrZQorCSAgICAgdXMgc3RvcCksIHRodXMgc3RlcHBpbmcgaW50byBzaWd0cmFtcC4KKworCSAgICAgU28gd2UgbmVlZCB0byBzZXQgYSBzdGVwX3Jlc3VtZV9icmVha19hZGRyZXNzIGJyZWFrcG9pbnQKKwkgICAgIGFuZCBjb250aW51ZSB1bnRpbCB3ZSBoaXQgaXQsIGFuZCB0aGVuIHN0ZXAuICBGSVhNRTogVGhpcyBzaG91bGQKKwkgICAgIGJlIG1vcmUgZW5kdXJpbmcgdGhhbiBhIHN0ZXBfcmVzdW1lIGJyZWFrcG9pbnQ7IHdlIHNob3VsZCBrbm93CisJICAgICB0aGF0IHdlIHdpbGwgbGF0ZXIgbmVlZCB0byBrZWVwIGdvaW5nIHJhdGhlciB0aGFuIHJlLWhpdHRpbmcKKwkgICAgIHRoZSBicmVha3BvaW50IGhlcmUgKHNlZSB0ZXN0c3VpdGUvZ2RiLnQwNi9zaWduYWxzLmV4cCB3aGVyZQorCSAgICAgaXQgc2F5cyAiZXhjZWVkaW5nbHkgZGlmZmljdWx0IikuICAqLworCSAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzcl9zYWw7CisKKwkgIElOSVRfU0FMICgmc3Jfc2FsKTsJLyogaW5pdGlhbGl6ZSB0byB6ZXJvZXMgKi8KKwkgIHNyX3NhbC5wYyA9IHByZXZfcGM7CisJICBzcl9zYWwuc2VjdGlvbiA9IGZpbmRfcGNfb3ZlcmxheSAoc3Jfc2FsLnBjKTsKKwkgIC8qIFdlIHBlcmhhcHMgY291bGQgc2V0IHRoZSBmcmFtZSBpZiB3ZSBrZXB0IHRyYWNrIG9mIHdoYXQKKwkgICAgIHRoZSBmcmFtZSBjb3JyZXNwb25kaW5nIHRvIHByZXZfcGMgd2FzLiAgQnV0IHdlIGRvbid0LAorCSAgICAgc28gZG9uJ3QuICAqLworCSAgdGhyb3VnaF9zaWd0cmFtcF9icmVha3BvaW50ID0KKwkgICAgc2V0X21vbWVudGFyeV9icmVha3BvaW50IChzcl9zYWwsIE5VTEwsIGJwX3Rocm91Z2hfc2lndHJhbXApOworCSAgaWYgKGJyZWFrcG9pbnRzX2luc2VydGVkKQorCSAgICBpbnNlcnRfYnJlYWtwb2ludHMgKCk7CisKKwkgIHJlbW92ZV9icmVha3BvaW50c19vbl9mb2xsb3dpbmdfc3RlcCA9IDE7CisJICBhbm90aGVyX3RyYXAgPSAxOworCX0KKworICAgIGtlZXBfZ29pbmc6CisgICAgICAvKiBDb21lIHRvIHRoaXMgbGFiZWwgd2hlbiB5b3UgbmVlZCB0byByZXN1bWUgdGhlIGluZmVyaW9yLgorCSBJdCdzIHJlYWxseSBtdWNoIGNsZWFuZXIgdG8gZG8gYSBnb3RvIHRoYW4gYSBtYXplIG9mIGlmLWVsc2UKKwkgY29uZGl0aW9ucy4gICovCisKKyAgICAgIC8qID8/cmVocmF1ZXI6IHR0cmFjZSBvbiBIUC1VWCB0aGVvcmV0aWNhbGx5IGFsbG93cyBvbmUgdG8gZGVidWcKKyAgICAgICAgIGEgdmZvcmtlZCBjaGlsZCBiZWV0d2VlbiBpdHMgY3JlYXRpb24gYW5kIHN1YnNlcXVlbnQgZXhpdCBvcgorICAgICAgICAgY2FsbCB0byBleGVjKCkuICBIb3dldmVyLCBJIGhhZCBiaWcgcHJvYmxlbXMgaW4gdGhpcyByYXRoZXIKKyAgICAgICAgIGNyZWFreSBleGVjIGVuZ2luZSwgZ2V0dGluZyB0aGF0IHRvIHdvcmsuICBUaGUgZnVuZGFtZW50YWwKKyAgICAgICAgIHByb2JsZW0gaXMgdGhhdCBJJ20gdHJ5aW5nIHRvIGRlYnVnIHR3byBwcm9jZXNzZXMgdmlhIGFuCisgICAgICAgICBlbmdpbmUgdGhhdCBvbmx5IHVuZGVyc3RhbmRzIGEgc2luZ2xlIHByb2Nlc3Mgd2l0aCBwb3NzaWJseQorICAgICAgICAgbXVsdGlwbGUgdGhyZWFkcy4KKworICAgICAgICAgSGVuY2UsIHRoaXMgc3BvdCBpcyBrbm93biB0byBoYXZlIHByb2JsZW1zIHdoZW4KKyAgICAgICAgIHRhcmdldF9jYW5fZm9sbG93X3Zmb3JrX3ByaW9yX3RvX2V4ZWMgcmV0dXJucyAxLiAqLworCisgICAgICAvKiBTYXZlIHRoZSBwYyBiZWZvcmUgZXhlY3V0aW9uLCB0byBjb21wYXJlIHdpdGggcGMgYWZ0ZXIgc3RvcC4gICovCisgICAgICBwcmV2X3BjID0gcmVhZF9wYyAoKTsJLyogTWlnaHQgaGF2ZSBiZWVuIERFQ1JfQUZURVJfQlJFQUsgKi8KKyAgICAgIHByZXZfZnVuY19zdGFydCA9IHN0b3BfZnVuY19zdGFydDsJLyogT2ssIHNpbmNlIGlmIERFQ1JfUENfQUZURVIKKwkJCQkJICBCUkVBSyBpcyBkZWZpbmVkLCB0aGUKKwkJCQkJICBvcmlnaW5hbCBwYyB3b3VsZCBub3QgaGF2ZQorCQkJCQkgIGJlZW4gYXQgdGhlIHN0YXJ0IG9mIGEKKwkJCQkJICBmdW5jdGlvbi4gKi8KKyAgICAgIHByZXZfZnVuY19uYW1lID0gc3RvcF9mdW5jX25hbWU7CisKKyAgICAgIGlmICh1cGRhdGVfc3RlcF9zcCkKKwlzdGVwX3NwID0gcmVhZF9zcCAoKTsKKyAgICAgIHVwZGF0ZV9zdGVwX3NwID0gMDsKKworICAgICAgLyogSWYgd2UgZGlkIG5vdCBkbyBicmVhazssIGl0IG1lYW5zIHdlIHNob3VsZCBrZWVwCisJIHJ1bm5pbmcgdGhlIGluZmVyaW9yIGFuZCBub3QgcmV0dXJuIHRvIGRlYnVnZ2VyLiAgKi8KKworICAgICAgaWYgKHRyYXBfZXhwZWN0ZWQgJiYgc3RvcF9zaWduYWwgIT0gVEFSR0VUX1NJR05BTF9UUkFQKQorCXsKKwkgIC8qIFdlIHRvb2sgYSBzaWduYWwgKHdoaWNoIHdlIGFyZSBzdXBwb3NlZCB0byBwYXNzIHRocm91Z2ggdG8KKwkgICAgIHRoZSBpbmZlcmlvciwgZWxzZSB3ZSdkIGhhdmUgZG9uZSBhIGJyZWFrIGFib3ZlKSBhbmQgd2UKKwkgICAgIGhhdmVuJ3QgeWV0IGdvdHRlbiBvdXIgdHJhcC4gIFNpbXBseSBjb250aW51ZS4gICovCisJICByZXN1bWUgKENVUlJFTlRMWV9TVEVQUElORyAoKSwgc3RvcF9zaWduYWwpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBFaXRoZXIgdGhlIHRyYXAgd2FzIG5vdCBleHBlY3RlZCwgYnV0IHdlIGFyZSBjb250aW51aW5nCisJICAgICBhbnl3YXkgKHRoZSB1c2VyIGFza2VkIHRoYXQgdGhpcyBzaWduYWwgYmUgcGFzc2VkIHRvIHRoZQorCSAgICAgY2hpbGQpCisJICAgICAgIC0tIG9yIC0tCisJICAgICBUaGUgc2lnbmFsIHdhcyBTSUdUUkFQLCBlLmcuIGl0IHdhcyBvdXIgc2lnbmFsLCBidXQgd2UKKwkgICAgIGRlY2lkZWQgd2Ugc2hvdWxkIHJlc3VtZSBmcm9tIGl0LgorCisJICAgICBXZSdyZSBnb2luZyB0byBydW4gdGhpcyBiYWJ5IG5vdyEKKworCSAgICAgSW5zZXJ0IGJyZWFrcG9pbnRzIG5vdywgdW5sZXNzIHdlIGFyZSB0cnlpbmcKKwkgICAgIHRvIG9uZS1wcm9jZWVkIHBhc3QgYSBicmVha3BvaW50LiAgKi8KKwkgIC8qIElmIHdlJ3ZlIGp1c3QgZmluaXNoZWQgYSBzcGVjaWFsIHN0ZXAgcmVzdW1lIGFuZCB3ZSBkb24ndAorCSAgICAgd2FudCB0byBoaXQgYSBicmVha3BvaW50LCBwdWxsIGVtIG91dC4gICovCisJICBpZiAoc3RlcF9yZXN1bWVfYnJlYWtwb2ludCA9PSBOVUxMCisJICAgICAgJiYgdGhyb3VnaF9zaWd0cmFtcF9icmVha3BvaW50ID09IE5VTEwKKwkgICAgICAmJiByZW1vdmVfYnJlYWtwb2ludHNfb25fZm9sbG93aW5nX3N0ZXApCisJICAgIHsKKwkgICAgICByZW1vdmVfYnJlYWtwb2ludHNfb25fZm9sbG93aW5nX3N0ZXAgPSAwOworCSAgICAgIHJlbW92ZV9icmVha3BvaW50cyAoKTsKKwkgICAgICBicmVha3BvaW50c19pbnNlcnRlZCA9IDA7CisJICAgIH0KKwkgIGVsc2UgaWYgKCFicmVha3BvaW50c19pbnNlcnRlZCAmJgorCQkgICAodGhyb3VnaF9zaWd0cmFtcF9icmVha3BvaW50ICE9IE5VTEwgfHwgIWFub3RoZXJfdHJhcCkpCisJICAgIHsKKwkgICAgICBicmVha3BvaW50c19mYWlsZWQgPSBpbnNlcnRfYnJlYWtwb2ludHMgKCk7CisJICAgICAgaWYgKGJyZWFrcG9pbnRzX2ZhaWxlZCkKKwkJYnJlYWs7CisJICAgICAgYnJlYWtwb2ludHNfaW5zZXJ0ZWQgPSAxOworCSAgICB9CisKKwkgIHRyYXBfZXhwZWN0ZWQgPSBhbm90aGVyX3RyYXA7CisKKyAgICAgICAgICAvKiBEbyBub3QgZGVsaXZlciBTSUdOQUxfVFJBUCAoZXhjZXB0IHdoZW4gdGhlIHVzZXIKKwkgICAgIGV4cGxpY2l0bHkgc3BlY2lmaWVzIHRoYXQgc3VjaCBhIHNpZ25hbCBzaG91bGQgYmUKKwkgICAgIGRlbGl2ZXJlZCB0byB0aGUgdGFyZ2V0IHByb2dyYW0pLgorCisJICAgICBUeXBpY2FsbHksIHRoaXMgd291bGQgb2NjdXJlIHdoZW4gYSB1c2VyIGlzIGRlYnVnZ2luZyBhCisJICAgICB0YXJnZXQgbW9uaXRvciBvbiBhIHNpbXVsYXRvcjogdGhlIHRhcmdldCBtb25pdG9yIHNldHMgYQorCSAgICAgYnJlYWtwb2ludDsgdGhlIHNpbXVsYXRvciBlbmNvdW50ZXJzIHRoaXMgYnJlYWstcG9pbnQgYW5kCisJICAgICBoYWx0cyB0aGUgc2ltdWxhdGlvbiBoYW5kaW5nIGNvbnRyb2wgdG8gR0RCOyBHREIsIG5vdGVpbmcKKwkgICAgIHRoYXQgdGhlIGJyZWFrLXBvaW50IGlzbid0IHZhbGlkLCByZXR1cm5zIGNvbnRyb2wgYmFjayB0bworCSAgICAgdGhlIHNpbXVsYXRvcjsgdGhlIHNpbXVsYXRvciB0aGVuIGRlbGl2ZXJzIHRoZSBoYXJkd2FyZQorCSAgICAgZXF1aXZhbGVudCBvZiBhIFNJR05BTF9UUkFQIHRvIHRoZSBwcm9ncmFtIGJlaW5nCisJICAgICBkZWJ1Z2dlZC4gKi8KKworCSAgaWYgKHN0b3Bfc2lnbmFsID09IFRBUkdFVF9TSUdOQUxfVFJBUAorCSAgICAgICYmICFzaWduYWxfcHJvZ3JhbVtzdG9wX3NpZ25hbF0pCisJICAgIHN0b3Bfc2lnbmFsID0gVEFSR0VUX1NJR05BTF8wOworCisjaWZkZWYgU0hJRlRfSU5TVF9SRUdTCisJICAvKiBJJ20gbm90IHN1cmUgd2hlbiB0aGlzIGZvbGxvd2luZyBzZWdtZW50IGFwcGxpZXMuICBJIGRvIGtub3csCisJICAgICBub3csIHRoYXQgd2Ugc2hvdWxkbid0IHJld3JpdGUgdGhlIHJlZ3Mgd2hlbiB3ZSB3ZXJlIHN0b3BwZWQKKwkgICAgIGJ5IGEgcmFuZG9tIHNpZ25hbCBmcm9tIHRoZSBpbmZlcmlvciBwcm9jZXNzLiAgKi8KKwkgIC8qIEZJWE1FOiBTaG91bGRuJ3QgdGhpcyBiZSBiYXNlZCBvbiB0aGUgdmFsaWQgYml0IG9mIHRoZSBTWElQPworCSAgICAgKHRoaXMgaXMgb25seSB1c2VkIG9uIHRoZSA4OGspLiAgKi8KKworCSAgaWYgKCFicHN0YXRfZXhwbGFpbnNfc2lnbmFsIChzdG9wX2Jwc3RhdCkKKwkgICAgICAmJiAoc3RvcF9zaWduYWwgIT0gVEFSR0VUX1NJR05BTF9DSExEKQorCSAgICAgICYmICFzdG9wcGVkX2J5X3JhbmRvbV9zaWduYWwpCisJICAgIFNISUZUX0lOU1RfUkVHUyAoKTsKKyNlbmRpZiAvKiBTSElGVF9JTlNUX1JFR1MgKi8KKworCSAgcmVzdW1lIChDVVJSRU5UTFlfU1RFUFBJTkcgKCksIHN0b3Bfc2lnbmFsKTsKKwl9CisgICAgfQorCitzdG9wX3N0ZXBwaW5nOgorICBpZiAodGFyZ2V0X2hhc19leGVjdXRpb24pCisgICAgeworICAgICAgLyogQXJlIHdlIHN0b3BwaW5nIGZvciBhIHZmb3JrIGV2ZW50PyAgV2Ugb25seSBzdG9wIHdoZW4gd2Ugc2VlCisgICAgICAgICB0aGUgY2hpbGQncyBldmVudC4gIEhvd2V2ZXIsIHdlIG1heSBub3QgeWV0IGhhdmUgc2VlbiB0aGUKKyAgICAgICAgIHBhcmVudCdzIGV2ZW50LiAgQW5kLCBpbmZlcmlvcl9waWQgaXMgc3RpbGwgc2V0IHRvIHRoZSBwYXJlbnQncworICAgICAgICAgcGlkLCB1bnRpbCB3ZSByZXN1bWUgYWdhaW4gYW5kIGZvbGxvdyBlaXRoZXIgdGhlIHBhcmVudCBvciBjaGlsZC4KKworICAgICAgICAgVG8gZW5zdXJlIHRoYXQgd2UgY2FuIHJlYWxseSB0b3VjaCBpbmZlcmlvcl9waWQgKGFrYSwgdGhlCisgICAgICAgICBwYXJlbnQgcHJvY2VzcykgLS0gd2hpY2ggY2FsbHMgdG8gZnVuY3Rpb25zIGxpa2UgcmVhZF9wYworICAgICAgICAgaW1wbGljaXRseSBkbyAtLSB3YWl0IG9uIHRoZSBwYXJlbnQgaWYgbmVjZXNzYXJ5LiAqLworICAgICAgaWYgKChwZW5kaW5nX2ZvbGxvdy5raW5kID09IFRBUkdFVF9XQUlUS0lORF9WRk9SS0VEKQorCSAgJiYgIXBlbmRpbmdfZm9sbG93LmZvcmtfZXZlbnQuc2F3X3BhcmVudF9mb3JrKQorCXsKKwkgIGludCBwYXJlbnRfcGlkOworCisJICBkbworCSAgICB7CisJICAgICAgaWYgKHRhcmdldF93YWl0X2hvb2spCisJCXBhcmVudF9waWQgPSB0YXJnZXRfd2FpdF9ob29rICgtMSwgJncpOworCSAgICAgIGVsc2UKKwkJcGFyZW50X3BpZCA9IHRhcmdldF93YWl0ICgtMSwgJncpOworCSAgICB9CisJICB3aGlsZSAocGFyZW50X3BpZCAhPSBpbmZlcmlvcl9waWQpOworCX0KKworCisgICAgICAvKiBBc3N1bWluZyB0aGUgaW5mZXJpb3Igc3RpbGwgZXhpc3RzLCBzZXQgdGhlc2UgdXAgZm9yIG5leHQKKwkgdGltZSwganVzdCBsaWtlIHdlIGRpZCBhYm92ZSBpZiB3ZSBkaWRuJ3QgYnJlYWsgb3V0IG9mIHRoZQorCSBsb29wLiAgKi8KKyAgICAgIHByZXZfcGMgPSByZWFkX3BjICgpOworICAgICAgcHJldl9mdW5jX3N0YXJ0ID0gc3RvcF9mdW5jX3N0YXJ0OworICAgICAgcHJldl9mdW5jX25hbWUgPSBzdG9wX2Z1bmNfbmFtZTsKKyAgICB9CisgIGRvX2NsZWFudXBzIChvbGRfY2xlYW51cHMpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgVFJVRSBpZiBlcCBpcyBhbiBpbnRlcm5hbCBicmVha3BvaW50CisgICBzZXQgdG8gY2F0Y2ggZ2VuZXJpYyBzaGFyZWQgbGlicmFyeSAoYWthIGR5bmFtaWNhbGx5LWxpbmtlZAorICAgbGlicmFyeSkgZXZlbnRzLiAgKFRoaXMgaXMgKk5PVCogdGhlIHNhbWUgYXMgYSBjYXRjaHBvaW50IGZvciBhCisgICBzaGxpYiBldmVudC4gIFRoZSBsYXR0ZXIgaXMgc29tZXRoaW5nIGEgdXNlciBjYW4gc2V0OyB0aGlzIGlzCisgICBzb21ldGhpbmcgZ2RiIHNldHMgZm9yIGl0cyBvd24gdXNlLCBhbmQgaXNuJ3QgZXZlciBzaG93biB0byBhCisgICB1c2VyLikgKi8KK3N0YXRpYyBpbnQKK2lzX2ludGVybmFsX3NobGliX2V2ZW50cG9pbnQgKGVwKQorICAgICBzdHJ1Y3QgYnJlYWtwb2ludCAqZXA7Cit7CisgIHJldHVybgorICAgIChlcC0+dHlwZSA9PSBicF9zaGxpYl9ldmVudCkKKyAgICA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBUUlVFIGlmIGJzIGluZGljYXRlcyB0aGF0IHRoZSBpbmZlcmlvcgorICAgc3RvcHBlZCBkdWUgdG8gYSBzaGFyZWQgbGlicmFyeSAoYWthIGR5bmFtaWNhbGx5LWxpbmtlZCBsaWJyYXJ5KQorICAgZXZlbnQuICovCitzdGF0aWMgaW50CitzdG9wcGVkX2Zvcl9pbnRlcm5hbF9zaGxpYl9ldmVudCAoYnMpCisgICAgIGJwc3RhdCBiczsKK3sKKyAgLyogTm90ZSB0aGF0IG11bHRpcGxlIGV2ZW50cG9pbnRzIG1heSd2ZSBjYXVzZWQgdGhlIHN0b3AuICBBbnkKKyAgICAgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHNobGliIGV2ZW50cyB3aWxsIGJlIGFjY2VwdGVkLiAqLworICBmb3IgKDsgYnMgIT0gTlVMTDsgYnMgPSBicy0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoKGJzLT5icmVha3BvaW50X2F0ICE9IE5VTEwpCisJICAmJiBpc19pbnRlcm5hbF9zaGxpYl9ldmVudHBvaW50IChicy0+YnJlYWtwb2ludF9hdCkpCisJcmV0dXJuIDE7CisgICAgfQorCisgIC8qIElmIHdlIGdldCBoZXJlLCB0aGVuIG5vIGNhbmRpZGF0ZSB3YXMgZm91bmQuICovCisgIHJldHVybiAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgVFJVRSBpZiBicyBpbmRpY2F0ZXMgdGhhdCB0aGUgaW5mZXJpb3IKKyAgIHN0b3BwZWQgZHVlIHRvIGEgc2hhcmVkIGxpYnJhcnkgKGFrYSBkeW5hbWljYWxseS1saW5rZWQgbGlicmFyeSkKKyAgIGV2ZW50IGNhdWdodCBieSBhIGNhdGNocG9pbnQuCisKKyAgIElmIFRSVUUsIGNwX3AgaXMgc2V0IHRvIHBvaW50IHRvIHRoZSBjYXRjaHBvaW50LgorCisgICBFbHNlLCB0aGUgdmFsdWUgb2YgY3BfcCBpcyB1bmRlZmluZWQuICovCitzdGF0aWMgaW50CitzdG9wcGVkX2Zvcl9zaGxpYl9jYXRjaHBvaW50IChicywgY3BfcCkKKyAgICAgYnBzdGF0IGJzOworICAgICBzdHJ1Y3QgYnJlYWtwb2ludCAqKmNwX3A7Cit7CisgIC8qIE5vdGUgdGhhdCBtdWx0aXBsZSBldmVudHBvaW50cyBtYXkndmUgY2F1c2VkIHRoZSBzdG9wLiAgQW55CisgICAgIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBzaGxpYiBldmVudHMgd2lsbCBiZSBhY2NlcHRlZC4gKi8KKyAgKmNwX3AgPSBOVUxMOworCisgIGZvciAoOyBicyAhPSBOVUxMOyBicyA9IGJzLT5uZXh0KQorICAgIHsKKyAgICAgIGlmICgoYnMtPmJyZWFrcG9pbnRfYXQgIT0gTlVMTCkKKwkgICYmIGVwX2lzX3NobGliX2NhdGNocG9pbnQgKGJzLT5icmVha3BvaW50X2F0KSkKKwl7CisJICAqY3BfcCA9IGJzLT5icmVha3BvaW50X2F0OworCSAgcmV0dXJuIDE7CisJfQorICAgIH0KKworICAvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlbiBubyBjYW5kaWRhdGUgd2FzIGZvdW5kLiAqLworICByZXR1cm4gMDsKK30KKwwKKworLyogSGVyZSB0byByZXR1cm4gY29udHJvbCB0byBHREIgd2hlbiB0aGUgaW5mZXJpb3Igc3RvcHMgZm9yIHJlYWwuCisgICBQcmludCBhcHByb3ByaWF0ZSBtZXNzYWdlcywgcmVtb3ZlIGJyZWFrcG9pbnRzLCBnaXZlIHRlcm1pbmFsIG91ciBtb2Rlcy4KKworICAgU1RPUF9QUklOVF9GUkFNRSBub256ZXJvIG1lYW5zIHByaW50IHRoZSBleGVjdXRpbmcgZnJhbWUKKyAgIChwYywgZnVuY3Rpb24sIGFyZ3MsIGZpbGUsIGxpbmUgbnVtYmVyIGFuZCBsaW5lIHRleHQpLgorICAgQlJFQUtQT0lOVFNfRkFJTEVEIG5vbnplcm8gbWVhbnMgc3RvcCB3YXMgZHVlIHRvIGVycm9yCisgICBhdHRlbXB0aW5nIHRvIGluc2VydCBicmVha3BvaW50cy4gICovCisKK3ZvaWQKK25vcm1hbF9zdG9wICgpCit7CisKKyNpZmRlZiBIUFVYSFBQQQorICAvKiBBcyB3aXRoIHRoZSBub3RpZmljYXRpb24gb2YgdGhyZWFkIGV2ZW50cywgd2Ugd2FudCB0byBkZWxheQorICAgICBub3RpZnlpbmcgdGhlIHVzZXIgdGhhdCB3ZSd2ZSBzd2l0Y2hlZCB0aHJlYWQgY29udGV4dCB1bnRpbAorICAgICB0aGUgaW5mZXJpb3IgYWN0dWFsbHkgc3RvcHMuCisKKyAgICAgKE5vdGUgdGhhdCB0aGVyZSdzIG5vIHBvaW50IGluIHNheWluZyBhbnl0aGluZyBpZiB0aGUgaW5mZXJpb3IKKyAgICAgaGFzIGV4aXRlZCEpICovCisgIGlmICgoc3dpdGNoZWRfZnJvbV9pbmZlcmlvcl9waWQgIT0gaW5mZXJpb3JfcGlkKSAmJgorICAgICAgdGFyZ2V0X2hhc19leGVjdXRpb24pCisgICAgeworICAgICAgdGFyZ2V0X3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCAoKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIltTd2l0Y2hlZCB0byAlc11cbiIsCisJCSAgICAgICB0YXJnZXRfcGlkX29yX3RpZF90b19zdHIgKGluZmVyaW9yX3BpZCkpOworICAgICAgc3dpdGNoZWRfZnJvbV9pbmZlcmlvcl9waWQgPSBpbmZlcmlvcl9waWQ7CisgICAgfQorI2VuZGlmCisKKyAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGN1cnJlbnRfZnJhbWUncyBwYyBpcyBjb3JyZWN0LiAgVGhpcworICAgICBpcyBhIGNvcnJlY3Rpb24gZm9yIHNldHRpbmcgdXAgdGhlIGZyYW1lIGluZm8gYmVmb3JlIGRvaW5nCisgICAgIERFQ1JfUENfQUZURVJfQlJFQUsgKi8KKyAgaWYgKHRhcmdldF9oYXNfZXhlY3V0aW9uICYmIGdldF9jdXJyZW50X2ZyYW1lICgpKQorICAgIChnZXRfY3VycmVudF9mcmFtZSAoKSktPnBjID0gcmVhZF9wYyAoKTsKKworICBpZiAoYnJlYWtwb2ludHNfZmFpbGVkKQorICAgIHsKKyAgICAgIHRhcmdldF90ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgKCk7CisgICAgICBwcmludF9zeXNfZXJybXNnICgicHRyYWNlIiwgYnJlYWtwb2ludHNfZmFpbGVkKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlN0b3BwZWQ7IGNhbm5vdCBpbnNlcnQgYnJlYWtwb2ludHMuXG5cCitUaGUgc2FtZSBwcm9ncmFtIG1heSBiZSBydW5uaW5nIGluIGFub3RoZXIgcHJvY2Vzcy5cbiIpOworICAgIH0KKworICBpZiAodGFyZ2V0X2hhc19leGVjdXRpb24gJiYgYnJlYWtwb2ludHNfaW5zZXJ0ZWQpCisgICAgeworICAgICAgaWYgKHJlbW92ZV9icmVha3BvaW50cyAoKSkKKwl7CisJICB0YXJnZXRfdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ICgpOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiQ2Fubm90IHJlbW92ZSBicmVha3BvaW50cyBiZWNhdXNlICIpOworCSAgcHJpbnRmX2ZpbHRlcmVkICgicHJvZ3JhbSBpcyBubyBsb25nZXIgd3JpdGFibGUuXG4iKTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIkl0IG1pZ2h0IGJlIHJ1bm5pbmcgaW4gYW5vdGhlciBwcm9jZXNzLlxuIik7CisJICBwcmludGZfZmlsdGVyZWQgKCJGdXJ0aGVyIGV4ZWN1dGlvbiBpcyBwcm9iYWJseSBpbXBvc3NpYmxlLlxuIik7CisJfQorICAgIH0KKyAgYnJlYWtwb2ludHNfaW5zZXJ0ZWQgPSAwOworCisgIC8qIERlbGV0ZSB0aGUgYnJlYWtwb2ludCB3ZSBzdG9wcGVkIGF0LCBpZiBpdCB3YW50cyB0byBiZSBkZWxldGVkLgorICAgICBEZWxldGUgYW55IGJyZWFrcG9pbnQgdGhhdCBpcyB0byBiZSBkZWxldGVkIGF0IHRoZSBuZXh0IHN0b3AuICAqLworCisgIGJyZWFrcG9pbnRfYXV0b19kZWxldGUgKHN0b3BfYnBzdGF0KTsKKworICAvKiBJZiBhbiBhdXRvLWRpc3BsYXkgY2FsbGVkIGEgZnVuY3Rpb24gYW5kIHRoYXQgZ290IGEgc2lnbmFsLAorICAgICBkZWxldGUgdGhhdCBhdXRvLWRpc3BsYXkgdG8gYXZvaWQgYW4gaW5maW5pdGUgcmVjdXJzaW9uLiAgKi8KKworICBpZiAoc3RvcHBlZF9ieV9yYW5kb21fc2lnbmFsKQorICAgIGRpc2FibGVfY3VycmVudF9kaXNwbGF5ICgpOworCisgIC8qIERvbid0IHByaW50IGEgbWVzc2FnZSBpZiBpbiB0aGUgbWlkZGxlIG9mIGRvaW5nIGEgInN0ZXAgbiIKKyAgICAgb3BlcmF0aW9uIGZvciBuID4gMSAqLworICBpZiAoc3RlcF9tdWx0aSAmJiBzdG9wX3N0ZXApCisgICAgZ290byBkb25lOworCisgIHRhcmdldF90ZXJtaW5hbF9vdXJzICgpOworCisgIC8qIERpZCB3ZSBzdG9wIGJlY2F1c2UgdGhlIHVzZXIgc2V0IHRoZSBzdG9wX29uX3NvbGliX2V2ZW50cworICAgICB2YXJpYWJsZT8gIChJZiBzbywgd2UgcmVwb3J0IHRoaXMgYXMgYSBnZW5lcmljLCAiU3RvcHBlZCBkdWUKKyAgICAgdG8gc2hsaWIgZXZlbnQiIG1lc3NhZ2UuKSAqLworICBpZiAoc3RvcHBlZF9mb3JfaW50ZXJuYWxfc2hsaWJfZXZlbnQgKHN0b3BfYnBzdGF0KSkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJTdG9wcGVkIGR1ZSB0byBzaGFyZWQgbGlicmFyeSBldmVudFxuIik7CisgICAgfQorCisgIC8qIExvb2sgdXAgdGhlIGhvb2tfc3RvcCBhbmQgcnVuIGl0IGlmIGl0IGV4aXN0cy4gICovCisKKyAgaWYgKHN0b3BfY29tbWFuZCAmJiBzdG9wX2NvbW1hbmQtPmhvb2spCisgICAgeworICAgICAgY2F0Y2hfZXJyb3JzIChob29rX3N0b3Bfc3R1Yiwgc3RvcF9jb21tYW5kLT5ob29rLAorCQkgICAgIkVycm9yIHdoaWxlIHJ1bm5pbmcgaG9va19zdG9wOlxuIiwgUkVUVVJOX01BU0tfQUxMKTsKKyAgICB9CisKKyAgaWYgKCF0YXJnZXRfaGFzX3N0YWNrKQorICAgIHsKKworICAgICAgZ290byBkb25lOworICAgIH0KKworICAvKiBTZWxlY3QgaW5uZXJtb3N0IHN0YWNrIGZyYW1lIC0gaS5lLiwgY3VycmVudCBmcmFtZSBpcyBmcmFtZSAwLAorICAgICBhbmQgY3VycmVudCBsb2NhdGlvbiBpcyBiYXNlZCBvbiB0aGF0LgorICAgICBEb24ndCBkbyB0aGlzIG9uIHJldHVybiBmcm9tIGEgc3RhY2sgZHVtbXkgcm91dGluZSwKKyAgICAgb3IgaWYgdGhlIHByb2dyYW0gaGFzIGV4aXRlZC4gKi8KKworICBpZiAoIXN0b3Bfc3RhY2tfZHVtbXkpCisgICAgeworICAgICAgc2VsZWN0X2ZyYW1lIChnZXRfY3VycmVudF9mcmFtZSAoKSwgMCk7CisKKyAgICAgIC8qIFByaW50IGN1cnJlbnQgbG9jYXRpb24gd2l0aG91dCBhIGxldmVsIG51bWJlciwgaWYKKwkgd2UgaGF2ZSBjaGFuZ2VkIGZ1bmN0aW9ucyBvciBoaXQgYSBicmVha3BvaW50LgorCSBQcmludCBzb3VyY2UgbGluZSBpZiB3ZSBoYXZlIG9uZS4KKwkgYnBzdGF0X3ByaW50KCkgY29udGFpbnMgdGhlIGxvZ2ljIGRlY2lkaW5nIGluIGRldGFpbAorCSB3aGF0IHRvIHByaW50LCBiYXNlZCBvbiB0aGUgZXZlbnQocykgdGhhdCBqdXN0IG9jY3VycmVkLiAqLworCisgICAgICBpZiAoc3RvcF9wcmludF9mcmFtZSkKKwl7CisJICBpbnQgYnBzdGF0X3JldDsKKwkgIGludCBzb3VyY2VfZmxhZzsKKworCSAgYnBzdGF0X3JldCA9IGJwc3RhdF9wcmludCAoc3RvcF9icHN0YXQpOworCSAgLyogYnBzdGF0X3ByaW50KCkgcmV0dXJuZWQgb25lIG9mOgorICAgICAgICAgICAgIC0xOiBEaWRuJ3QgcHJpbnQgYW55dGhpbmcKKyAgICAgICAgICAgICAgMDogUHJpbnRlZCBwcmVsaW1pbmFyeSAiQnJlYWtwb2ludCBuLCAiIG1lc3NhZ2UsIGRlc2lyZXMKKyAgICAgICAgICAgICAgICAgbG9jYXRpb24gdGFja2VkIG9uCisgICAgICAgICAgICAgIDE6IFByaW50ZWQgc29tZXRoaW5nLCBkb24ndCB0YWNrIG9uIGxvY2F0aW9uICovCisKKwkgIGlmIChicHN0YXRfcmV0ID09IC0xKQorCSAgICBpZiAoc3RvcF9zdGVwCisJCSYmIHN0ZXBfZnJhbWVfYWRkcmVzcyA9PSBGUkFNRV9GUCAoZ2V0X2N1cnJlbnRfZnJhbWUgKCkpCisJCSYmIHN0ZXBfc3RhcnRfZnVuY3Rpb24gPT0gZmluZF9wY19mdW5jdGlvbiAoc3RvcF9wYykpCisJICAgICAgc291cmNlX2ZsYWcgPSAtMTsJLyogZmluaXNoZWQgc3RlcCwganVzdCBwcmludCBzb3VyY2UgbGluZSAqLworCSAgICBlbHNlCisJICAgICAgc291cmNlX2ZsYWcgPSAxOwkvKiBwcmludCBsb2NhdGlvbiBhbmQgc291cmNlIGxpbmUgKi8KKwkgIGVsc2UgaWYgKGJwc3RhdF9yZXQgPT0gMCkJLyogaGl0IGJwdCwgZGVzaXJlIGxvY2F0aW9uICovCisJICAgIHNvdXJjZV9mbGFnID0gMTsJLyogcHJpbnQgbG9jYXRpb24gYW5kIHNvdXJjZSBsaW5lICovCisJICBlbHNlCQkJLyogYnBzdGF0X3JldCA9PSAxLCBoaXQgYnB0LCBkbyBub3QgZGVzaXJlIGxvY2F0aW9uICovCisJICAgIHNvdXJjZV9mbGFnID0gLTE7CS8qIGp1c3QgcHJpbnQgc291cmNlIGxpbmUgKi8KKworCSAgLyogVGhlIGJlaGF2aW9yIG9mIHRoaXMgcm91dGluZSB3aXRoIHJlc3BlY3QgdG8gdGhlIHNvdXJjZQorCSAgICAgZmxhZyBpczoKKwkgICAgIC0xOiBQcmludCBvbmx5IHNvdXJjZSBsaW5lCisJICAgICAwOiBQcmludCBvbmx5IGxvY2F0aW9uCisJICAgICAxOiBQcmludCBsb2NhdGlvbiBhbmQgc291cmNlIGxpbmUgKi8KKwkgIHNob3dfYW5kX3ByaW50X3N0YWNrX2ZyYW1lIChzZWxlY3RlZF9mcmFtZSwgLTEsIHNvdXJjZV9mbGFnKTsKKworCSAgLyogRGlzcGxheSB0aGUgYXV0by1kaXNwbGF5IGV4cHJlc3Npb25zLiAgKi8KKwkgIGRvX2Rpc3BsYXlzICgpOworCX0KKyAgICB9CisKKyAgLyogU2F2ZSB0aGUgZnVuY3Rpb24gdmFsdWUgcmV0dXJuIHJlZ2lzdGVycywgaWYgd2UgY2FyZS4KKyAgICAgV2UgbWlnaHQgYmUgYWJvdXQgdG8gcmVzdG9yZSB0aGVpciBwcmV2aW91cyBjb250ZW50cy4gICovCisgIGlmIChwcm9jZWVkX3RvX2ZpbmlzaCkKKyAgICByZWFkX3JlZ2lzdGVyX2J5dGVzICgwLCBzdG9wX3JlZ2lzdGVycywgUkVHSVNURVJfQllURVMpOworCisgIGlmIChzdG9wX3N0YWNrX2R1bW15KQorICAgIHsKKyAgICAgIC8qIFBvcCB0aGUgZW1wdHkgZnJhbWUgdGhhdCBjb250YWlucyB0aGUgc3RhY2sgZHVtbXkuCisgICAgICAgICBQT1BfRlJBTUUgZW5kcyB3aXRoIGEgc2V0dGluZyBvZiB0aGUgY3VycmVudCBmcmFtZSwgc28gd2UKKwkgY2FuIHVzZSB0aGF0IG5leHQuICovCisgICAgICBQT1BfRlJBTUU7CisgICAgICAvKiBTZXQgc3RvcF9wYyB0byB3aGF0IGl0IHdhcyBiZWZvcmUgd2UgY2FsbGVkIHRoZSBmdW5jdGlvbi4KKwkgQ2FuJ3QgcmVseSBvbiByZXN0b3JlX2luZmVyaW9yX3N0YXR1cyBiZWNhdXNlIHRoYXQgb25seSBnZXRzCisJIGNhbGxlZCBpZiB3ZSBkb24ndCBzdG9wIGluIHRoZSBjYWxsZWQgZnVuY3Rpb24uICAqLworICAgICAgc3RvcF9wYyA9IHJlYWRfcGMgKCk7CisgICAgICBzZWxlY3RfZnJhbWUgKGdldF9jdXJyZW50X2ZyYW1lICgpLCAwKTsKKyAgICB9CisKKworICBUVUlETyAoKChUdWlPcGFxdWVGdW5jUHRyKSB0dWlfdkNoZWNrRGF0YVZhbHVlcywgc2VsZWN0ZWRfZnJhbWUpKTsKKworZG9uZToKKyAgYW5ub3RhdGVfc3RvcHBlZCAoKTsKK30KKworc3RhdGljIGludAoraG9va19zdG9wX3N0dWIgKGNtZCkKKyAgICAgUFRSIGNtZDsKK3sKKyAgZXhlY3V0ZV91c2VyX2NvbW1hbmQgKChzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqKSBjbWQsIDApOworICByZXR1cm4gKDApOworfQorDAoraW50IAorc2lnbmFsX3N0b3Bfc3RhdGUgKHNpZ25vKQorICAgICBpbnQgc2lnbm87Cit7CisgIHJldHVybiBzaWduYWxfc3RvcFtzaWdub107Cit9CisKK2ludCAKK3NpZ25hbF9wcmludF9zdGF0ZSAoc2lnbm8pCisgICAgIGludCBzaWdubzsKK3sKKyAgcmV0dXJuIHNpZ25hbF9wcmludFtzaWdub107Cit9CisKK2ludCAKK3NpZ25hbF9wYXNzX3N0YXRlIChzaWdubykKKyAgICAgaW50IHNpZ25vOworeworICByZXR1cm4gc2lnbmFsX3Byb2dyYW1bc2lnbm9dOworfQorCitzdGF0aWMgdm9pZAorc2lnX3ByaW50X2hlYWRlciAoKQoreworICBwcmludGZfZmlsdGVyZWQgKCJcCitTaWduYWwgICAgICAgIFN0b3BcdFByaW50XHRQYXNzIHRvIHByb2dyYW1cdERlc2NyaXB0aW9uXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3NpZ19wcmludF9pbmZvIChvdXJzaWcpCisgICAgIGVudW0gdGFyZ2V0X3NpZ25hbCBvdXJzaWc7Cit7CisgIGNoYXIgKm5hbWUgPSB0YXJnZXRfc2lnbmFsX3RvX25hbWUgKG91cnNpZyk7CisgIGludCBuYW1lX3BhZGRpbmcgPSAxMyAtIHN0cmxlbiAobmFtZSk7CisgIGlmIChuYW1lX3BhZGRpbmcgPD0gMCkKKyAgICBuYW1lX3BhZGRpbmcgPSAwOworCisgIHByaW50Zl9maWx0ZXJlZCAoIiVzIiwgbmFtZSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIiUqLipzICIsIG5hbWVfcGFkZGluZywgbmFtZV9wYWRkaW5nLAorCQkgICAiICAgICAgICAgICAgICAgICAiKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiJXNcdCIsIHNpZ25hbF9zdG9wW291cnNpZ10gPyAiWWVzIiA6ICJObyIpOworICBwcmludGZfZmlsdGVyZWQgKCIlc1x0Iiwgc2lnbmFsX3ByaW50W291cnNpZ10gPyAiWWVzIiA6ICJObyIpOworICBwcmludGZfZmlsdGVyZWQgKCIlc1x0XHQiLCBzaWduYWxfcHJvZ3JhbVtvdXJzaWddID8gIlllcyIgOiAiTm8iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiJXNcbiIsIHRhcmdldF9zaWduYWxfdG9fc3RyaW5nIChvdXJzaWcpKTsKK30KKworLyogU3BlY2lmeSBob3cgdmFyaW91cyBzaWduYWxzIGluIHRoZSBpbmZlcmlvciBzaG91bGQgYmUgaGFuZGxlZC4gICovCisKK3N0YXRpYyB2b2lkCitoYW5kbGVfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgY2hhciAqKmFyZ3Y7CisgIGludCBkaWdpdHMsIHdvcmRsZW47CisgIGludCBzaWdmaXJzdCwgc2lnbnVtLCBzaWdsYXN0OworICBlbnVtIHRhcmdldF9zaWduYWwgb3Vyc2lnOworICBpbnQgYWxsc2lnczsKKyAgaW50IG5zaWdzOworICB1bnNpZ25lZCBjaGFyICpzaWdzOworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworCisgIGlmIChhcmdzID09IE5VTEwpCisgICAgeworICAgICAgZXJyb3Jfbm9fYXJnICgic2lnbmFsIHRvIGhhbmRsZSIpOworICAgIH0KKworICAvKiBBbGxvY2F0ZSBhbmQgemVybyBhbiBhcnJheSBvZiBmbGFncyBmb3Igd2hpY2ggc2lnbmFscyB0byBoYW5kbGUuICovCisKKyAgbnNpZ3MgPSAoaW50KSBUQVJHRVRfU0lHTkFMX0xBU1Q7CisgIHNpZ3MgPSAodW5zaWduZWQgY2hhciAqKSBhbGxvY2EgKG5zaWdzKTsKKyAgbWVtc2V0IChzaWdzLCAwLCBuc2lncyk7CisKKyAgLyogQnJlYWsgdGhlIGNvbW1hbmQgbGluZSB1cCBpbnRvIGFyZ3MuICovCisKKyAgYXJndiA9IGJ1aWxkYXJndiAoYXJncyk7CisgIGlmIChhcmd2ID09IE5VTEwpCisgICAgeworICAgICAgbm9tZW0gKDApOworICAgIH0KKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVhcmd2LCAoY2hhciAqKSBhcmd2KTsKKworICAvKiBXYWxrIHRocm91Z2ggdGhlIGFyZ3MsIGxvb2tpbmcgZm9yIHNpZ25hbCBvdXJzaWdzLCBzaWduYWwgbmFtZXMsIGFuZAorICAgICBhY3Rpb25zLiAgU2lnbmFsIG51bWJlcnMgYW5kIHNpZ25hbCBuYW1lcyBtYXkgYmUgaW50ZXJzcGVyc2VkIHdpdGgKKyAgICAgYWN0aW9ucywgd2l0aCB0aGUgYWN0aW9ucyBiZWluZyBwZXJmb3JtZWQgZm9yIGFsbCBzaWduYWxzIGN1bXVsYXRpdmVseQorICAgICBzcGVjaWZpZWQuICBTaWduYWwgcmFuZ2VzIGNhbiBiZSBzcGVjaWZpZWQgYXMgPExPVz4tPEhJR0g+LiAqLworCisgIHdoaWxlICgqYXJndiAhPSBOVUxMKQorICAgIHsKKyAgICAgIHdvcmRsZW4gPSBzdHJsZW4gKCphcmd2KTsKKyAgICAgIGZvciAoZGlnaXRzID0gMDsgaXNkaWdpdCAoKCphcmd2KVtkaWdpdHNdKTsgZGlnaXRzKyspCisJezsKKwl9CisgICAgICBhbGxzaWdzID0gMDsKKyAgICAgIHNpZ2ZpcnN0ID0gc2lnbGFzdCA9IC0xOworCisgICAgICBpZiAod29yZGxlbiA+PSAxICYmICFzdHJuY21wICgqYXJndiwgImFsbCIsIHdvcmRsZW4pKQorCXsKKwkgIC8qIEFwcGx5IGFjdGlvbiB0byBhbGwgc2lnbmFscyBleGNlcHQgdGhvc2UgdXNlZCBieSB0aGUKKwkgICAgIGRlYnVnZ2VyLiAgU2lsZW50bHkgc2tpcCB0aG9zZS4gKi8KKwkgIGFsbHNpZ3MgPSAxOworCSAgc2lnZmlyc3QgPSAwOworCSAgc2lnbGFzdCA9IG5zaWdzIC0gMTsKKwl9CisgICAgICBlbHNlIGlmICh3b3JkbGVuID49IDEgJiYgIXN0cm5jbXAgKCphcmd2LCAic3RvcCIsIHdvcmRsZW4pKQorCXsKKwkgIFNFVF9TSUdTIChuc2lncywgc2lncywgc2lnbmFsX3N0b3ApOworCSAgU0VUX1NJR1MgKG5zaWdzLCBzaWdzLCBzaWduYWxfcHJpbnQpOworCX0KKyAgICAgIGVsc2UgaWYgKHdvcmRsZW4gPj0gMSAmJiAhc3RybmNtcCAoKmFyZ3YsICJpZ25vcmUiLCB3b3JkbGVuKSkKKwl7CisJICBVTlNFVF9TSUdTIChuc2lncywgc2lncywgc2lnbmFsX3Byb2dyYW0pOworCX0KKyAgICAgIGVsc2UgaWYgKHdvcmRsZW4gPj0gMiAmJiAhc3RybmNtcCAoKmFyZ3YsICJwcmludCIsIHdvcmRsZW4pKQorCXsKKwkgIFNFVF9TSUdTIChuc2lncywgc2lncywgc2lnbmFsX3ByaW50KTsKKwl9CisgICAgICBlbHNlIGlmICh3b3JkbGVuID49IDIgJiYgIXN0cm5jbXAgKCphcmd2LCAicGFzcyIsIHdvcmRsZW4pKQorCXsKKwkgIFNFVF9TSUdTIChuc2lncywgc2lncywgc2lnbmFsX3Byb2dyYW0pOworCX0KKyAgICAgIGVsc2UgaWYgKHdvcmRsZW4gPj0gMyAmJiAhc3RybmNtcCAoKmFyZ3YsICJub3N0b3AiLCB3b3JkbGVuKSkKKwl7CisJICBVTlNFVF9TSUdTIChuc2lncywgc2lncywgc2lnbmFsX3N0b3ApOworCX0KKyAgICAgIGVsc2UgaWYgKHdvcmRsZW4gPj0gMyAmJiAhc3RybmNtcCAoKmFyZ3YsICJub2lnbm9yZSIsIHdvcmRsZW4pKQorCXsKKwkgIFNFVF9TSUdTIChuc2lncywgc2lncywgc2lnbmFsX3Byb2dyYW0pOworCX0KKyAgICAgIGVsc2UgaWYgKHdvcmRsZW4gPj0gNCAmJiAhc3RybmNtcCAoKmFyZ3YsICJub3ByaW50Iiwgd29yZGxlbikpCisJeworCSAgVU5TRVRfU0lHUyAobnNpZ3MsIHNpZ3MsIHNpZ25hbF9wcmludCk7CisJICBVTlNFVF9TSUdTIChuc2lncywgc2lncywgc2lnbmFsX3N0b3ApOworCX0KKyAgICAgIGVsc2UgaWYgKHdvcmRsZW4gPj0gNCAmJiAhc3RybmNtcCAoKmFyZ3YsICJub3Bhc3MiLCB3b3JkbGVuKSkKKwl7CisJICBVTlNFVF9TSUdTIChuc2lncywgc2lncywgc2lnbmFsX3Byb2dyYW0pOworCX0KKyAgICAgIGVsc2UgaWYgKGRpZ2l0cyA+IDApCisJeworCSAgLyogSXQgaXMgbnVtZXJpYy4gIFRoZSBudW1lcmljIHNpZ25hbCByZWZlcnMgdG8gb3VyIG93bgorCSAgICAgaW50ZXJuYWwgc2lnbmFsIG51bWJlcmluZyBmcm9tIHRhcmdldC5oLCBub3QgdG8gaG9zdC90YXJnZXQKKwkgICAgIHNpZ25hbCAgbnVtYmVyLiAgVGhpcyBpcyBhIGZlYXR1cmU7IHVzZXJzIHJlYWxseSBzaG91bGQgYmUKKwkgICAgIHVzaW5nIHN5bWJvbGljIG5hbWVzIGFueXdheSwgYW5kIHRoZSBjb21tb24gb25lcyBsaWtlCisJICAgICBTSUdIVVAsIFNJR0lOVCwgU0lHQUxSTSwgZXRjLiB3aWxsIHdvcmsgcmlnaHQgYW55d2F5LiAgKi8KKworCSAgc2lnZmlyc3QgPSBzaWdsYXN0ID0gKGludCkKKwkgICAgdGFyZ2V0X3NpZ25hbF9mcm9tX2NvbW1hbmQgKGF0b2kgKCphcmd2KSk7CisJICBpZiAoKCphcmd2KVtkaWdpdHNdID09ICctJykKKwkgICAgeworCSAgICAgIHNpZ2xhc3QgPSAoaW50KQorCQl0YXJnZXRfc2lnbmFsX2Zyb21fY29tbWFuZCAoYXRvaSAoKCphcmd2KSArIGRpZ2l0cyArIDEpKTsKKwkgICAgfQorCSAgaWYgKHNpZ2ZpcnN0ID4gc2lnbGFzdCkKKwkgICAgeworCSAgICAgIC8qIEJldCBoZSBkaWRuJ3QgZmlndXJlIHdlJ2QgdGhpbmsgb2YgdGhpcyBjYXNlLi4uICovCisJICAgICAgc2lnbnVtID0gc2lnZmlyc3Q7CisJICAgICAgc2lnZmlyc3QgPSBzaWdsYXN0OworCSAgICAgIHNpZ2xhc3QgPSBzaWdudW07CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgb3Vyc2lnID0gdGFyZ2V0X3NpZ25hbF9mcm9tX25hbWUgKCphcmd2KTsKKwkgIGlmIChvdXJzaWcgIT0gVEFSR0VUX1NJR05BTF9VTktOT1dOKQorCSAgICB7CisJICAgICAgc2lnZmlyc3QgPSBzaWdsYXN0ID0gKGludCkgb3Vyc2lnOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBOb3QgYSBudW1iZXIgYW5kIG5vdCBhIHJlY29nbml6ZWQgZmxhZyB3b3JkID0+IGNvbXBsYWluLiAgKi8KKwkgICAgICBlcnJvciAoIlVucmVjb2duaXplZCBvciBhbWJpZ3VvdXMgZmxhZyB3b3JkOiBcIiVzXCIuIiwgKmFyZ3YpOworCSAgICB9CisJfQorCisgICAgICAvKiBJZiBhbnkgc2lnbmFsIG51bWJlcnMgb3Igc3ltYm9sIG5hbWVzIHdlcmUgZm91bmQsIHNldCBmbGFncyBmb3IKKwkgd2hpY2ggc2lnbmFscyB0byBhcHBseSBhY3Rpb25zIHRvLiAqLworCisgICAgICBmb3IgKHNpZ251bSA9IHNpZ2ZpcnN0OyBzaWdudW0gPj0gMCAmJiBzaWdudW0gPD0gc2lnbGFzdDsgc2lnbnVtKyspCisJeworCSAgc3dpdGNoICgoZW51bSB0YXJnZXRfc2lnbmFsKSBzaWdudW0pCisJICAgIHsKKwkgICAgY2FzZSBUQVJHRVRfU0lHTkFMX1RSQVA6CisJICAgIGNhc2UgVEFSR0VUX1NJR05BTF9JTlQ6CisJICAgICAgaWYgKCFhbGxzaWdzICYmICFzaWdzW3NpZ251bV0pCisJCXsKKwkJICBpZiAocXVlcnkgKCIlcyBpcyB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci5cblwKK0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjaGFuZ2UgaXQ/ICIsCisJCQkgICAgIHRhcmdldF9zaWduYWxfdG9fbmFtZQorCQkJICAgICAoKGVudW0gdGFyZ2V0X3NpZ25hbCkgc2lnbnVtKSkpCisJCSAgICB7CisJCSAgICAgIHNpZ3Nbc2lnbnVtXSA9IDE7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIk5vdCBjb25maXJtZWQsIHVuY2hhbmdlZC5cbiIpOworCQkgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCQkgICAgfQorCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgVEFSR0VUX1NJR05BTF8wOgorCSAgICBjYXNlIFRBUkdFVF9TSUdOQUxfREVGQVVMVDoKKwkgICAgY2FzZSBUQVJHRVRfU0lHTkFMX1VOS05PV046CisJICAgICAgLyogTWFrZSBzdXJlIHRoYXQgImFsbCIgZG9lc24ndCBwcmludCB0aGVzZS4gICovCisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgc2lnc1tzaWdudW1dID0gMTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgYXJndisrOworICAgIH0KKworICB0YXJnZXRfbm90aWNlX3NpZ25hbHMgKGluZmVyaW9yX3BpZCk7CisKKyAgaWYgKGZyb21fdHR5KQorICAgIHsKKyAgICAgIC8qIFNob3cgdGhlIHJlc3VsdHMuICAqLworICAgICAgc2lnX3ByaW50X2hlYWRlciAoKTsKKyAgICAgIGZvciAoc2lnbnVtID0gMDsgc2lnbnVtIDwgbnNpZ3M7IHNpZ251bSsrKQorCXsKKwkgIGlmIChzaWdzW3NpZ251bV0pCisJICAgIHsKKwkgICAgICBzaWdfcHJpbnRfaW5mbyAoc2lnbnVtKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7Cit9CisKK3N0YXRpYyB2b2lkCit4ZGJfaGFuZGxlX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoYXIgKiphcmd2OworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworCisgIC8qIEJyZWFrIHRoZSBjb21tYW5kIGxpbmUgdXAgaW50byBhcmdzLiAqLworCisgIGFyZ3YgPSBidWlsZGFyZ3YgKGFyZ3MpOworICBpZiAoYXJndiA9PSBOVUxMKQorICAgIHsKKyAgICAgIG5vbWVtICgwKTsKKyAgICB9CisgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlYXJndiwgKGNoYXIgKikgYXJndik7CisgIGlmIChhcmd2WzFdICE9IChjaGFyICopIE5VTEwpCisgICAgeworICAgICAgY2hhciAqYXJnQnVmOworICAgICAgaW50IGJ1ZkxlbjsKKworICAgICAgYnVmTGVuID0gc3RybGVuIChhcmd2WzBdKSArIDIwOworICAgICAgYXJnQnVmID0gKGNoYXIgKikgeG1hbGxvYyAoYnVmTGVuKTsKKyAgICAgIGlmIChhcmdCdWYpCisJeworCSAgaW50IHZhbGlkRmxhZyA9IDE7CisJICBlbnVtIHRhcmdldF9zaWduYWwgb3Vyc2lnOworCisJICBvdXJzaWcgPSB0YXJnZXRfc2lnbmFsX2Zyb21fbmFtZSAoYXJndlswXSk7CisJICBtZW1zZXQgKGFyZ0J1ZiwgMCwgYnVmTGVuKTsKKwkgIGlmIChzdHJjbXAgKGFyZ3ZbMV0sICJRIikgPT0gMCkKKwkgICAgc3ByaW50ZiAoYXJnQnVmLCAiJXMgJXMiLCBhcmd2WzBdLCAibm9wcmludCIpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKHN0cmNtcCAoYXJndlsxXSwgInMiKSA9PSAwKQorCQl7CisJCSAgaWYgKCFzaWduYWxfc3RvcFtvdXJzaWddKQorCQkgICAgc3ByaW50ZiAoYXJnQnVmLCAiJXMgJXMiLCBhcmd2WzBdLCAic3RvcCIpOworCQkgIGVsc2UKKwkJICAgIHNwcmludGYgKGFyZ0J1ZiwgIiVzICVzIiwgYXJndlswXSwgIm5vc3RvcCIpOworCQl9CisJICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmd2WzFdLCAiaSIpID09IDApCisJCXsKKwkJICBpZiAoIXNpZ25hbF9wcm9ncmFtW291cnNpZ10pCisJCSAgICBzcHJpbnRmIChhcmdCdWYsICIlcyAlcyIsIGFyZ3ZbMF0sICJwYXNzIik7CisJCSAgZWxzZQorCQkgICAgc3ByaW50ZiAoYXJnQnVmLCAiJXMgJXMiLCBhcmd2WzBdLCAibm9wYXNzIik7CisJCX0KKwkgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3ZbMV0sICJyIikgPT0gMCkKKwkJeworCQkgIGlmICghc2lnbmFsX3ByaW50W291cnNpZ10pCisJCSAgICBzcHJpbnRmIChhcmdCdWYsICIlcyAlcyIsIGFyZ3ZbMF0sICJwcmludCIpOworCQkgIGVsc2UKKwkJICAgIHNwcmludGYgKGFyZ0J1ZiwgIiVzICVzIiwgYXJndlswXSwgIm5vcHJpbnQiKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJdmFsaWRGbGFnID0gMDsKKwkgICAgfQorCSAgaWYgKHZhbGlkRmxhZykKKwkgICAgaGFuZGxlX2NvbW1hbmQgKGFyZ0J1ZiwgZnJvbV90dHkpOworCSAgZWxzZQorCSAgICBwcmludGZfZmlsdGVyZWQgKCJJbnZhbGlkIHNpZ25hbCBoYW5kbGluZyBmbGFnLlxuIik7CisJICBpZiAoYXJnQnVmKQorCSAgICBmcmVlIChhcmdCdWYpOworCX0KKyAgICB9CisgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworfQorCisvKiBQcmludCBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSB0YWJsZXMgc2V0IGJ5IHRoZSBoYW5kbGUgY29tbWFuZC4KKyAgIEl0IGlzIHBvc3NpYmxlIHdlIHNob3VsZCBqdXN0IGJlIHByaW50aW5nIHNpZ25hbHMgYWN0dWFsbHkgdXNlZAorICAgYnkgdGhlIGN1cnJlbnQgdGFyZ2V0IChidXQgZm9yIHRoaW5ncyB0byB3b3JrIHJpZ2h0IHdoZW4gc3dpdGNoaW5nCisgICB0YXJnZXRzLCBhbGwgc2lnbmFscyBzaG91bGQgYmUgaW4gdGhlIHNpZ25hbCB0YWJsZXMpLiAgKi8KKworc3RhdGljIHZvaWQKK3NpZ25hbHNfaW5mbyAoc2lnbnVtX2V4cCwgZnJvbV90dHkpCisgICAgIGNoYXIgKnNpZ251bV9leHA7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZW51bSB0YXJnZXRfc2lnbmFsIG91cnNpZzsKKyAgc2lnX3ByaW50X2hlYWRlciAoKTsKKworICBpZiAoc2lnbnVtX2V4cCkKKyAgICB7CisgICAgICAvKiBGaXJzdCBzZWUgaWYgdGhpcyBpcyBhIHN5bWJvbCBuYW1lLiAgKi8KKyAgICAgIG91cnNpZyA9IHRhcmdldF9zaWduYWxfZnJvbV9uYW1lIChzaWdudW1fZXhwKTsKKyAgICAgIGlmIChvdXJzaWcgPT0gVEFSR0VUX1NJR05BTF9VTktOT1dOKQorCXsKKwkgIC8qIE5vLCB0cnkgbnVtZXJpYy4gICovCisJICBvdXJzaWcgPQorCSAgICB0YXJnZXRfc2lnbmFsX2Zyb21fY29tbWFuZCAocGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAoc2lnbnVtX2V4cCkpOworCX0KKyAgICAgIHNpZ19wcmludF9pbmZvIChvdXJzaWcpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICAvKiBUaGVzZSB1Z2x5IGNhc3RzIGJyb3VnaHQgdG8geW91IGJ5IHRoZSBuYXRpdmUgVkFYIGNvbXBpbGVyLiAgKi8KKyAgZm9yIChvdXJzaWcgPSBUQVJHRVRfU0lHTkFMX0ZJUlNUOworICAgICAgIChpbnQpIG91cnNpZyA8IChpbnQpIFRBUkdFVF9TSUdOQUxfTEFTVDsKKyAgICAgICBvdXJzaWcgPSAoZW51bSB0YXJnZXRfc2lnbmFsKSAoKGludCkgb3Vyc2lnICsgMSkpCisgICAgeworICAgICAgUVVJVDsKKworICAgICAgaWYgKG91cnNpZyAhPSBUQVJHRVRfU0lHTkFMX1VOS05PV04KKwkgICYmIG91cnNpZyAhPSBUQVJHRVRfU0lHTkFMX0RFRkFVTFQKKwkgICYmIG91cnNpZyAhPSBUQVJHRVRfU0lHTkFMXzApCisJc2lnX3ByaW50X2luZm8gKG91cnNpZyk7CisgICAgfQorCisgIHByaW50Zl9maWx0ZXJlZCAoIlxuVXNlIHRoZSBcImhhbmRsZVwiIGNvbW1hbmQgdG8gY2hhbmdlIHRoZXNlIHRhYmxlcy5cbiIpOworfQorDAorLyogU2F2ZSBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5mZXJpb3I8PT0+Z2RiCisgICBjb25uZWN0aW9uLiAgSU5GX1NUQVRVUyBpcyBhIHBvaW50ZXIgdG8gYSAic3RydWN0IGluZmVyaW9yX3N0YXR1cyIKKyAgIChkZWZpbmVkIGluIGluZmVyaW9yLmgpLiAgKi8KKwordm9pZAorc2F2ZV9pbmZlcmlvcl9zdGF0dXMgKGluZl9zdGF0dXMsIHJlc3RvcmVfc3RhY2tfaW5mbykKKyAgICAgc3RydWN0IGluZmVyaW9yX3N0YXR1cyAqaW5mX3N0YXR1czsKKyAgICAgaW50IHJlc3RvcmVfc3RhY2tfaW5mbzsKK3sKKyAgaW5mX3N0YXR1cy0+c3RvcF9zaWduYWwgPSBzdG9wX3NpZ25hbDsKKyAgaW5mX3N0YXR1cy0+c3RvcF9wYyA9IHN0b3BfcGM7CisgIGluZl9zdGF0dXMtPnN0b3Bfc3RlcCA9IHN0b3Bfc3RlcDsKKyAgaW5mX3N0YXR1cy0+c3RvcF9zdGFja19kdW1teSA9IHN0b3Bfc3RhY2tfZHVtbXk7CisgIGluZl9zdGF0dXMtPnN0b3BwZWRfYnlfcmFuZG9tX3NpZ25hbCA9IHN0b3BwZWRfYnlfcmFuZG9tX3NpZ25hbDsKKyAgaW5mX3N0YXR1cy0+dHJhcF9leHBlY3RlZCA9IHRyYXBfZXhwZWN0ZWQ7CisgIGluZl9zdGF0dXMtPnN0ZXBfcmFuZ2Vfc3RhcnQgPSBzdGVwX3JhbmdlX3N0YXJ0OworICBpbmZfc3RhdHVzLT5zdGVwX3JhbmdlX2VuZCA9IHN0ZXBfcmFuZ2VfZW5kOworICBpbmZfc3RhdHVzLT5zdGVwX2ZyYW1lX2FkZHJlc3MgPSBzdGVwX2ZyYW1lX2FkZHJlc3M7CisgIGluZl9zdGF0dXMtPnN0ZXBfb3Zlcl9jYWxscyA9IHN0ZXBfb3Zlcl9jYWxsczsKKyAgaW5mX3N0YXR1cy0+c3RvcF9hZnRlcl90cmFwID0gc3RvcF9hZnRlcl90cmFwOworICBpbmZfc3RhdHVzLT5zdG9wX3Nvb25fcXVpZXRseSA9IHN0b3Bfc29vbl9xdWlldGx5OworICAvKiBTYXZlIG9yaWdpbmFsIGJwc3RhdCBjaGFpbiBoZXJlOyByZXBsYWNlIGl0IHdpdGggY29weSBvZiBjaGFpbi4KKyAgICAgSWYgY2FsbGVyJ3MgY2FsbGVyIGlzIHdhbGtpbmcgdGhlIGNoYWluLCB0aGV5J2xsIGJlIGhhcHBpZXIgaWYgd2UKKyAgICAgaGFuZCB0aGVtIGJhY2sgdGhlIG9yaWdpbmFsIGNoYWluIHdoZW4gcmVzdG9yZV9pX3MgaXMgY2FsbGVkLiAgKi8KKyAgaW5mX3N0YXR1cy0+c3RvcF9icHN0YXQgPSBzdG9wX2Jwc3RhdDsKKyAgc3RvcF9icHN0YXQgPSBicHN0YXRfY29weSAoc3RvcF9icHN0YXQpOworICBpbmZfc3RhdHVzLT5icmVha3BvaW50X3Byb2NlZWRlZCA9IGJyZWFrcG9pbnRfcHJvY2VlZGVkOworICBpbmZfc3RhdHVzLT5yZXN0b3JlX3N0YWNrX2luZm8gPSByZXN0b3JlX3N0YWNrX2luZm87CisgIGluZl9zdGF0dXMtPnByb2NlZWRfdG9fZmluaXNoID0gcHJvY2VlZF90b19maW5pc2g7CisKKyAgbWVtY3B5IChpbmZfc3RhdHVzLT5zdG9wX3JlZ2lzdGVycywgc3RvcF9yZWdpc3RlcnMsIFJFR0lTVEVSX0JZVEVTKTsKKworICByZWFkX3JlZ2lzdGVyX2J5dGVzICgwLCBpbmZfc3RhdHVzLT5yZWdpc3RlcnMsIFJFR0lTVEVSX0JZVEVTKTsKKworICByZWNvcmRfc2VsZWN0ZWRfZnJhbWUgKCYoaW5mX3N0YXR1cy0+c2VsZWN0ZWRfZnJhbWVfYWRkcmVzcyksCisJCQkgJihpbmZfc3RhdHVzLT5zZWxlY3RlZF9sZXZlbCkpOworICByZXR1cm47Cit9CisKK3N0cnVjdCByZXN0b3JlX3NlbGVjdGVkX2ZyYW1lX2FyZ3MKK3sKKyAgQ09SRV9BRERSIGZyYW1lX2FkZHJlc3M7CisgIGludCBsZXZlbDsKK307CisKK3N0YXRpYyBpbnQgcmVzdG9yZV9zZWxlY3RlZF9mcmFtZSBQQVJBTVMgKChQVFIpKTsKKworLyogUmVzdG9yZSB0aGUgc2VsZWN0ZWQgZnJhbWUuICBhcmdzIGlzIHJlYWxseSBhIHN0cnVjdAorICAgcmVzdG9yZV9zZWxlY3RlZF9mcmFtZV9hcmdzICogKGRlY2xhcmVkIGFzIGNoYXIgKiBmb3IgY2F0Y2hfZXJyb3JzKQorICAgdGVsbGluZyB1cyB3aGF0IGZyYW1lIHRvIHJlc3RvcmUuICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIG9yIDAgZm9yCisgICBmYWlsdXJlLiAgQW4gZXJyb3IgbWVzc2FnZSB3aWxsIGhhdmUgYmVlbiBwcmludGVkIG9uIGVycm9yLiAgKi8KKworc3RhdGljIGludAorcmVzdG9yZV9zZWxlY3RlZF9mcmFtZSAoYXJncykKKyAgICAgUFRSIGFyZ3M7Cit7CisgIHN0cnVjdCByZXN0b3JlX3NlbGVjdGVkX2ZyYW1lX2FyZ3MgKmZyID0KKyAgKHN0cnVjdCByZXN0b3JlX3NlbGVjdGVkX2ZyYW1lX2FyZ3MgKikgYXJnczsKKyAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworICBpbnQgbGV2ZWwgPSBmci0+bGV2ZWw7CisKKyAgZnJhbWUgPSBmaW5kX3JlbGF0aXZlX2ZyYW1lIChnZXRfY3VycmVudF9mcmFtZSAoKSwgJmxldmVsKTsKKworICAvKiBJZiBpbmZfc3RhdHVzLT5zZWxlY3RlZF9mcmFtZV9hZGRyZXNzIGlzIE5VTEwsIHRoZXJlIHdhcyBubworICAgICBwcmV2aW91c2x5IHNlbGVjdGVkIGZyYW1lLiAgKi8KKyAgaWYgKGZyYW1lID09IE5VTEwgfHwKKyAgLyogIEZSQU1FX0ZQIChmcmFtZSkgIT0gZnItPmZyYW1lX2FkZHJlc3MgfHwgKi8KKyAgLyogZWx6OiBkZWxldGVkIHRoaXMgY2hlY2sgYXMgYSBxdWljayBmaXggdG8gdGhlIHByb2JsZW0gdGhhdAorCSBmb3IgZnVuY3Rpb24gY2FsbGVkIGJ5IGhhbmQgZ2RiIGNyZWF0ZXMgbm8gaW50ZXJuYWwgZnJhbWUKKwkgc3RydWN0dXJlIGFuZCB0aGUgcmVhbCBzdGFjayBhbmQgZ2RiJ3MgaWRlYSBvZiBzdGFjayBhcmUKKwkgZGlmZmVyZW50IGlmIG5lc3RlZCBjYWxscyBieSBoYW5kcyBhcmUgbWFkZS4KKworCSBtdnM6IHRoaXMgd29ycmllcyBtZS4gICovCisgICAgICBsZXZlbCAhPSAwKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJVbmFibGUgdG8gcmVzdG9yZSBwcmV2aW91c2x5IHNlbGVjdGVkIGZyYW1lLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgc2VsZWN0X2ZyYW1lIChmcmFtZSwgZnItPmxldmVsKTsKKworICByZXR1cm4gKDEpOworfQorCit2b2lkCityZXN0b3JlX2luZmVyaW9yX3N0YXR1cyAoaW5mX3N0YXR1cykKKyAgICAgc3RydWN0IGluZmVyaW9yX3N0YXR1cyAqaW5mX3N0YXR1czsKK3sKKyAgc3RvcF9zaWduYWwgPSBpbmZfc3RhdHVzLT5zdG9wX3NpZ25hbDsKKyAgc3RvcF9wYyA9IGluZl9zdGF0dXMtPnN0b3BfcGM7CisgIHN0b3Bfc3RlcCA9IGluZl9zdGF0dXMtPnN0b3Bfc3RlcDsKKyAgc3RvcF9zdGFja19kdW1teSA9IGluZl9zdGF0dXMtPnN0b3Bfc3RhY2tfZHVtbXk7CisgIHN0b3BwZWRfYnlfcmFuZG9tX3NpZ25hbCA9IGluZl9zdGF0dXMtPnN0b3BwZWRfYnlfcmFuZG9tX3NpZ25hbDsKKyAgdHJhcF9leHBlY3RlZCA9IGluZl9zdGF0dXMtPnRyYXBfZXhwZWN0ZWQ7CisgIHN0ZXBfcmFuZ2Vfc3RhcnQgPSBpbmZfc3RhdHVzLT5zdGVwX3JhbmdlX3N0YXJ0OworICBzdGVwX3JhbmdlX2VuZCA9IGluZl9zdGF0dXMtPnN0ZXBfcmFuZ2VfZW5kOworICBzdGVwX2ZyYW1lX2FkZHJlc3MgPSBpbmZfc3RhdHVzLT5zdGVwX2ZyYW1lX2FkZHJlc3M7CisgIHN0ZXBfb3Zlcl9jYWxscyA9IGluZl9zdGF0dXMtPnN0ZXBfb3Zlcl9jYWxsczsKKyAgc3RvcF9hZnRlcl90cmFwID0gaW5mX3N0YXR1cy0+c3RvcF9hZnRlcl90cmFwOworICBzdG9wX3Nvb25fcXVpZXRseSA9IGluZl9zdGF0dXMtPnN0b3Bfc29vbl9xdWlldGx5OworICBicHN0YXRfY2xlYXIgKCZzdG9wX2Jwc3RhdCk7CisgIHN0b3BfYnBzdGF0ID0gaW5mX3N0YXR1cy0+c3RvcF9icHN0YXQ7CisgIGJyZWFrcG9pbnRfcHJvY2VlZGVkID0gaW5mX3N0YXR1cy0+YnJlYWtwb2ludF9wcm9jZWVkZWQ7CisgIHByb2NlZWRfdG9fZmluaXNoID0gaW5mX3N0YXR1cy0+cHJvY2VlZF90b19maW5pc2g7CisKKyAgbWVtY3B5IChzdG9wX3JlZ2lzdGVycywgaW5mX3N0YXR1cy0+c3RvcF9yZWdpc3RlcnMsIFJFR0lTVEVSX0JZVEVTKTsKKworICAvKiBUaGUgaW5mZXJpb3IgY2FuIGJlIGdvbmUgaWYgdGhlIHVzZXIgdHlwZXMgInByaW50IGV4aXQoMCkiCisgICAgIChhbmQgcGVyaGFwcyBvdGhlciB0aW1lcykuICAqLworICBpZiAodGFyZ2V0X2hhc19leGVjdXRpb24pCisgICAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKDAsIGluZl9zdGF0dXMtPnJlZ2lzdGVycywgUkVHSVNURVJfQllURVMpOworCisgIC8qIFRoZSBpbmZlcmlvciBjYW4gYmUgZ29uZSBpZiB0aGUgdXNlciB0eXBlcyAicHJpbnQgZXhpdCgwKSIKKyAgICAgKGFuZCBwZXJoYXBzIG90aGVyIHRpbWVzKS4gICovCisKKyAgLyogRklYTUU6IElmIHdlIGFyZSBiZWluZyBjYWxsZWQgYWZ0ZXIgc3RvcHBpbmcgaW4gYSBmdW5jdGlvbiB3aGljaAorICAgICBpcyBjYWxsZWQgZnJvbSBnZGIsIHdlIHNob3VsZCBub3QgYmUgdHJ5aW5nIHRvIHJlc3RvcmUgdGhlCisgICAgIHNlbGVjdGVkIGZyYW1lOyBpdCBqdXN0IHByaW50cyBhIHNwdXJpb3VzIGVycm9yIG1lc3NhZ2UgKFRoZQorICAgICBtZXNzYWdlIGlzIHVzZWZ1bCwgaG93ZXZlciwgaW4gZGV0ZWN0aW5nIGJ1Z3MgaW4gZ2RiIChsaWtlIGlmIGdkYgorICAgICBjbG9iYmVycyB0aGUgc3RhY2spKS4gIEluIGZhY3QsIHNob3VsZCB3ZSBiZSByZXN0b3JpbmcgdGhlCisgICAgIGluZmVyaW9yIHN0YXR1cyBhdCBhbGwgaW4gdGhhdCBjYXNlPyAgLiAgKi8KKworICBpZiAodGFyZ2V0X2hhc19zdGFjayAmJiBpbmZfc3RhdHVzLT5yZXN0b3JlX3N0YWNrX2luZm8pCisgICAgeworICAgICAgc3RydWN0IHJlc3RvcmVfc2VsZWN0ZWRfZnJhbWVfYXJncyBmcjsKKyAgICAgIGZyLmxldmVsID0gaW5mX3N0YXR1cy0+c2VsZWN0ZWRfbGV2ZWw7CisgICAgICBmci5mcmFtZV9hZGRyZXNzID0gaW5mX3N0YXR1cy0+c2VsZWN0ZWRfZnJhbWVfYWRkcmVzczsKKyAgICAgIC8qIFRoZSBwb2ludCBvZiBjYXRjaF9lcnJvcnMgaXMgdGhhdCBpZiB0aGUgc3RhY2sgaXMgY2xvYmJlcmVkLAorCSB3YWxraW5nIHRoZSBzdGFjayBtaWdodCBlbmNvdW50ZXIgYSBnYXJiYWdlIHBvaW50ZXIgYW5kIGVycm9yKCkKKwkgdHJ5aW5nIHRvIGRlcmVmZXJlbmNlIGl0LiAgKi8KKyAgICAgIGlmIChjYXRjaF9lcnJvcnMgKHJlc3RvcmVfc2VsZWN0ZWRfZnJhbWUsICZmciwKKwkJCSJVbmFibGUgdG8gcmVzdG9yZSBwcmV2aW91c2x5IHNlbGVjdGVkIGZyYW1lOlxuIiwKKwkJCVJFVFVSTl9NQVNLX0VSUk9SKSA9PSAwKQorCS8qIEVycm9yIGluIHJlc3RvcmluZyB0aGUgc2VsZWN0ZWQgZnJhbWUuICBTZWxlY3QgdGhlIGlubmVybW9zdAorCSAgIGZyYW1lLiAgKi8KKworCisJc2VsZWN0X2ZyYW1lIChnZXRfY3VycmVudF9mcmFtZSAoKSwgMCk7CisKKyAgICB9Cit9CisMCisKKwordm9pZAorc2V0X2ZvbGxvd19mb3JrX21vZGVfY29tbWFuZCAoYXJnLCBmcm9tX3R0eSwgYykKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7CisgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjOworeworICBpZiAoIVNUUkVRIChhcmcsICJwYXJlbnQiKSAmJgorICAgICAgIVNUUkVRIChhcmcsICJjaGlsZCIpICYmCisgICAgICAhU1RSRVEgKGFyZywgImJvdGgiKSAmJgorICAgICAgIVNUUkVRIChhcmcsICJhc2siKSkKKyAgICBlcnJvciAoImZvbGxvdy1mb3JrLW1vZGUgbXVzdCBiZSBvbmUgb2YgXCJwYXJlbnRcIiwgXCJjaGlsZFwiLCBcImJvdGhcIiBvciBcImFza1wiLiIpOworCisgIGlmIChmb2xsb3dfZm9ya19tb2RlX3N0cmluZyAhPSBOVUxMKQorICAgIGZyZWUgKGZvbGxvd19mb3JrX21vZGVfc3RyaW5nKTsKKyAgZm9sbG93X2ZvcmtfbW9kZV9zdHJpbmcgPSBzYXZlc3RyaW5nIChhcmcsIHN0cmxlbiAoYXJnKSk7Cit9CisMCisKKwordm9pZAorX2luaXRpYWxpemVfaW5mcnVuICgpCit7CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBpbnQgbnVtc2lnczsKKyAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7CisKKyAgYWRkX2luZm8gKCJzaWduYWxzIiwgc2lnbmFsc19pbmZvLAorCSAgICAiV2hhdCBkZWJ1Z2dlciBkb2VzIHdoZW4gcHJvZ3JhbSBnZXRzIHZhcmlvdXMgc2lnbmFscy5cblwKK1NwZWNpZnkgYSBzaWduYWwgYXMgYXJndW1lbnQgdG8gcHJpbnQgaW5mbyBvbiB0aGF0IHNpZ25hbCBvbmx5LiIpOworICBhZGRfaW5mb19hbGlhcyAoImhhbmRsZSIsICJzaWduYWxzIiwgMCk7CisKKyAgYWRkX2NvbSAoImhhbmRsZSIsIGNsYXNzX3J1biwgaGFuZGxlX2NvbW1hbmQsCisJICAgY29uY2F0ICgiU3BlY2lmeSBob3cgdG8gaGFuZGxlIGEgc2lnbmFsLlxuXAorQXJncyBhcmUgc2lnbmFscyBhbmQgYWN0aW9ucyB0byBhcHBseSB0byB0aG9zZSBzaWduYWxzLlxuXAorU3ltYm9saWMgc2lnbmFscyAoZS5nLiBTSUdTRUdWKSBhcmUgcmVjb21tZW5kZWQgYnV0IG51bWVyaWMgc2lnbmFsc1xuXAorZnJvbSAxLTE1IGFyZSBhbGxvd2VkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHZlcnNpb25zIG9mIEdEQi5cblwKK051bWVyaWMgcmFuZ2VzIG1heSBiZSBzcGVjaWZpZWQgd2l0aCB0aGUgZm9ybSBMT1ctSElHSCAoZS5nLiAxLTUpLlxuXAorVGhlIHNwZWNpYWwgYXJnIFwiYWxsXCIgaXMgcmVjb2duaXplZCB0byBtZWFuIGFsbCBzaWduYWxzIGV4Y2VwdCB0aG9zZVxuXAordXNlZCBieSB0aGUgZGVidWdnZXIsIHR5cGljYWxseSBTSUdUUkFQIGFuZCBTSUdJTlQuXG4iLAorCQkgICAiUmVjb2duaXplZCBhY3Rpb25zIGluY2x1ZGUgXCJzdG9wXCIsIFwibm9zdG9wXCIsIFwicHJpbnRcIiwgXCJub3ByaW50XCIsXG5cCitcInBhc3NcIiwgXCJub3Bhc3NcIiwgXCJpZ25vcmVcIiwgb3IgXCJub2lnbm9yZVwiLlxuXAorU3RvcCBtZWFucyByZWVudGVyIGRlYnVnZ2VyIGlmIHRoaXMgc2lnbmFsIGhhcHBlbnMgKGltcGxpZXMgcHJpbnQpLlxuXAorUHJpbnQgbWVhbnMgcHJpbnQgYSBtZXNzYWdlIGlmIHRoaXMgc2lnbmFsIGhhcHBlbnMuXG5cCitQYXNzIG1lYW5zIGxldCBwcm9ncmFtIHNlZSB0aGlzIHNpZ25hbDsgb3RoZXJ3aXNlIHByb2dyYW0gZG9lc24ndCBrbm93LlxuXAorSWdub3JlIGlzIGEgc3lub255bSBmb3Igbm9wYXNzIGFuZCBub2lnbm9yZSBpcyBhIHN5bm9ueW0gZm9yIHBhc3MuXG5cCitQYXNzIGFuZCBTdG9wIG1heSBiZSBjb21iaW5lZC4iLCBOVUxMKSk7CisgIGlmICh4ZGJfY29tbWFuZHMpCisgICAgeworICAgICAgYWRkX2NvbSAoImx6IiwgY2xhc3NfaW5mbywgc2lnbmFsc19pbmZvLAorCSAgICAgICAiV2hhdCBkZWJ1Z2dlciBkb2VzIHdoZW4gcHJvZ3JhbSBnZXRzIHZhcmlvdXMgc2lnbmFscy5cblwKK1NwZWNpZnkgYSBzaWduYWwgYXMgYXJndW1lbnQgdG8gcHJpbnQgaW5mbyBvbiB0aGF0IHNpZ25hbCBvbmx5LiIpOworICAgICAgYWRkX2NvbSAoInoiLCBjbGFzc19ydW4sIHhkYl9oYW5kbGVfY29tbWFuZCwKKwkgICAgICAgY29uY2F0ICgiU3BlY2lmeSBob3cgdG8gaGFuZGxlIGEgc2lnbmFsLlxuXAorQXJncyBhcmUgc2lnbmFscyBhbmQgYWN0aW9ucyB0byBhcHBseSB0byB0aG9zZSBzaWduYWxzLlxuXAorU3ltYm9saWMgc2lnbmFscyAoZS5nLiBTSUdTRUdWKSBhcmUgcmVjb21tZW5kZWQgYnV0IG51bWVyaWMgc2lnbmFsc1xuXAorZnJvbSAxLTE1IGFyZSBhbGxvd2VkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHZlcnNpb25zIG9mIEdEQi5cblwKK051bWVyaWMgcmFuZ2VzIG1heSBiZSBzcGVjaWZpZWQgd2l0aCB0aGUgZm9ybSBMT1ctSElHSCAoZS5nLiAxLTUpLlxuXAorVGhlIHNwZWNpYWwgYXJnIFwiYWxsXCIgaXMgcmVjb2duaXplZCB0byBtZWFuIGFsbCBzaWduYWxzIGV4Y2VwdCB0aG9zZVxuXAordXNlZCBieSB0aGUgZGVidWdnZXIsIHR5cGljYWxseSBTSUdUUkFQIGFuZCBTSUdJTlQuXG4iLAorCQkgICAgICAgIlJlY29nbml6ZWQgYWN0aW9ucyBpbmNsdWRlIFwic1wiICh0b2dnbGVzIGJldHdlZW4gc3RvcCBhbmQgbm9zdG9wKSwgXG5cCitcInJcIiAodG9nZ2xlcyBiZXR3ZWVuIHByaW50IGFuZCBub3ByaW50KSwgXCJpXCIgKHRvZ2dsZXMgYmV0d2VlbiBwYXNzIGFuZCBcCitub3Bhc3MpLCBcIlFcIiAobm9wcmludClcblwKK1N0b3AgbWVhbnMgcmVlbnRlciBkZWJ1Z2dlciBpZiB0aGlzIHNpZ25hbCBoYXBwZW5zIChpbXBsaWVzIHByaW50KS5cblwKK1ByaW50IG1lYW5zIHByaW50IGEgbWVzc2FnZSBpZiB0aGlzIHNpZ25hbCBoYXBwZW5zLlxuXAorUGFzcyBtZWFucyBsZXQgcHJvZ3JhbSBzZWUgdGhpcyBzaWduYWw7IG90aGVyd2lzZSBwcm9ncmFtIGRvZXNuJ3Qga25vdy5cblwKK0lnbm9yZSBpcyBhIHN5bm9ueW0gZm9yIG5vcGFzcyBhbmQgbm9pZ25vcmUgaXMgYSBzeW5vbnltIGZvciBwYXNzLlxuXAorUGFzcyBhbmQgU3RvcCBtYXkgYmUgY29tYmluZWQuIiwgTlVMTCkpOworICAgIH0KKworICBpZiAoIWRieF9jb21tYW5kcykKKyAgICBzdG9wX2NvbW1hbmQgPSBhZGRfY21kICgic3RvcCIsIGNsYXNzX29ic2N1cmUsIG5vdF9qdXN0X2hlbHBfY2xhc3NfY29tbWFuZCwKKwkJCSAgICAiVGhlcmUgaXMgbm8gYHN0b3AnIGNvbW1hbmQsIGJ1dCB5b3UgY2FuIHNldCBhIGhvb2sgb24gYHN0b3AnLlxuXAorVGhpcyBhbGxvd3MgeW91IHRvIHNldCBhIGxpc3Qgb2YgY29tbWFuZHMgdG8gYmUgcnVuIGVhY2ggdGltZSBleGVjdXRpb25cblwKK29mIHRoZSBwcm9ncmFtIHN0b3BzLiIsICZjbWRsaXN0KTsKKworICBudW1zaWdzID0gKGludCkgVEFSR0VUX1NJR05BTF9MQVNUOworICBzaWduYWxfc3RvcCA9ICh1bnNpZ25lZCBjaGFyICopCisgICAgeG1hbGxvYyAoc2l6ZW9mIChzaWduYWxfc3RvcFswXSkgKiBudW1zaWdzKTsKKyAgc2lnbmFsX3ByaW50ID0gKHVuc2lnbmVkIGNoYXIgKikKKyAgICB4bWFsbG9jIChzaXplb2YgKHNpZ25hbF9wcmludFswXSkgKiBudW1zaWdzKTsKKyAgc2lnbmFsX3Byb2dyYW0gPSAodW5zaWduZWQgY2hhciAqKQorICAgIHhtYWxsb2MgKHNpemVvZiAoc2lnbmFsX3Byb2dyYW1bMF0pICogbnVtc2lncyk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1zaWdzOyBpKyspCisgICAgeworICAgICAgc2lnbmFsX3N0b3BbaV0gPSAxOworICAgICAgc2lnbmFsX3ByaW50W2ldID0gMTsKKyAgICAgIHNpZ25hbF9wcm9ncmFtW2ldID0gMTsKKyAgICB9CisKKyAgLyogU2lnbmFscyBjYXVzZWQgYnkgZGVidWdnZXIncyBvd24gYWN0aW9ucworICAgICBzaG91bGQgbm90IGJlIGdpdmVuIHRvIHRoZSBwcm9ncmFtIGFmdGVyd2FyZHMuICAqLworICBzaWduYWxfcHJvZ3JhbVtUQVJHRVRfU0lHTkFMX1RSQVBdID0gMDsKKyAgc2lnbmFsX3Byb2dyYW1bVEFSR0VUX1NJR05BTF9JTlRdID0gMDsKKworICAvKiBTaWduYWxzIHRoYXQgYXJlIG5vdCBlcnJvcnMgc2hvdWxkIG5vdCBub3JtYWxseSBlbnRlciB0aGUgZGVidWdnZXIuICAqLworICBzaWduYWxfc3RvcFtUQVJHRVRfU0lHTkFMX0FMUk1dID0gMDsKKyAgc2lnbmFsX3ByaW50W1RBUkdFVF9TSUdOQUxfQUxSTV0gPSAwOworICBzaWduYWxfc3RvcFtUQVJHRVRfU0lHTkFMX1ZUQUxSTV0gPSAwOworICBzaWduYWxfcHJpbnRbVEFSR0VUX1NJR05BTF9WVEFMUk1dID0gMDsKKyAgc2lnbmFsX3N0b3BbVEFSR0VUX1NJR05BTF9QUk9GXSA9IDA7CisgIHNpZ25hbF9wcmludFtUQVJHRVRfU0lHTkFMX1BST0ZdID0gMDsKKyAgc2lnbmFsX3N0b3BbVEFSR0VUX1NJR05BTF9DSExEXSA9IDA7CisgIHNpZ25hbF9wcmludFtUQVJHRVRfU0lHTkFMX0NITERdID0gMDsKKyAgc2lnbmFsX3N0b3BbVEFSR0VUX1NJR05BTF9JT10gPSAwOworICBzaWduYWxfcHJpbnRbVEFSR0VUX1NJR05BTF9JT10gPSAwOworICBzaWduYWxfc3RvcFtUQVJHRVRfU0lHTkFMX1BPTExdID0gMDsKKyAgc2lnbmFsX3ByaW50W1RBUkdFVF9TSUdOQUxfUE9MTF0gPSAwOworICBzaWduYWxfc3RvcFtUQVJHRVRfU0lHTkFMX1VSR10gPSAwOworICBzaWduYWxfcHJpbnRbVEFSR0VUX1NJR05BTF9VUkddID0gMDsKKyAgc2lnbmFsX3N0b3BbVEFSR0VUX1NJR05BTF9XSU5DSF0gPSAwOworICBzaWduYWxfcHJpbnRbVEFSR0VUX1NJR05BTF9XSU5DSF0gPSAwOworCisjaWZkZWYgU09MSUJfQURECisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgic3RvcC1vbi1zb2xpYi1ldmVudHMiLCBjbGFzc19zdXBwb3J0LCB2YXJfemludGVnZXIsCisJCSAgKGNoYXIgKikgJnN0b3Bfb25fc29saWJfZXZlbnRzLAorCQkgICJTZXQgc3RvcHBpbmcgZm9yIHNoYXJlZCBsaWJyYXJ5IGV2ZW50cy5cblwKK0lmIG5vbnplcm8sIGdkYiB3aWxsIGdpdmUgY29udHJvbCB0byB0aGUgdXNlciB3aGVuIHRoZSBkeW5hbWljIGxpbmtlclxuXAorbm90aWZpZXMgZ2RiIG9mIHNoYXJlZCBsaWJyYXJ5IGV2ZW50cy4gIFRoZSBtb3N0IGNvbW1vbiBldmVudCBvZiBpbnRlcmVzdFxuXAordG8gdGhlIHVzZXIgd291bGQgYmUgbG9hZGluZy91bmxvYWRpbmcgb2YgYSBuZXcgbGlicmFyeS5cbiIsCisJCSAgJnNldGxpc3QpLAorICAgICAmc2hvd2xpc3QpOworI2VuZGlmCisKKyAgYyA9IGFkZF9zZXRfZW51bV9jbWQgKCJmb2xsb3ctZm9yay1tb2RlIiwKKwkJCWNsYXNzX3J1biwKKwkJCWZvbGxvd19mb3JrX21vZGVfa2luZF9uYW1lcywKKwkJCShjaGFyICopICZmb2xsb3dfZm9ya19tb2RlX3N0cmluZywKKy8qID8/cmVocmF1ZXI6ICBUaGUgImJvdGgiIG9wdGlvbiBpcyBicm9rZW4sIGJ5IHdoYXQgbWF5IGJlIGEgMTAuMjAKKyAgIGtlcm5lbCBwcm9ibGVtLiAgSXQncyBhbHNvIG5vdCB0ZXJyaWJseSB1c2VmdWwgd2l0aG91dCBhIEdVSSB0bworICAgaGVscCB0aGUgdXNlciBkcml2ZSB0d28gZGVidWdnZXJzLiAgU28gZm9yIG5vdywgSSdtIGRpc2FibGluZworICAgdGhlICJib3RoIiBvcHRpb24uICAqLworLyoJCQkiU2V0IGRlYnVnZ2VyIHJlc3BvbnNlIHRvIGEgcHJvZ3JhbSBjYWxsIG9mIGZvcmsgXAorb3IgdmZvcmsuXG5cCitBIGZvcmsgb3IgdmZvcmsgY3JlYXRlcyBhIG5ldyBwcm9jZXNzLiAgZm9sbG93LWZvcmstbW9kZSBjYW4gYmU6XG5cCisgIHBhcmVudCAgLSB0aGUgb3JpZ2luYWwgcHJvY2VzcyBpcyBkZWJ1Z2dlZCBhZnRlciBhIGZvcmtcblwKKyAgY2hpbGQgICAtIHRoZSBuZXcgcHJvY2VzcyBpcyBkZWJ1Z2dlZCBhZnRlciBhIGZvcmtcblwKKyAgYm90aCAgICAtIGJvdGggdGhlIHBhcmVudCBhbmQgY2hpbGQgYXJlIGRlYnVnZ2VkIGFmdGVyIGEgZm9ya1xuXAorICBhc2sgICAgIC0gdGhlIGRlYnVnZ2VyIHdpbGwgYXNrIGZvciBvbmUgb2YgdGhlIGFib3ZlIGNob2ljZXNcblwKK0ZvciBcImJvdGhcIiwgYW5vdGhlciBjb3B5IG9mIHRoZSBkZWJ1Z2dlciB3aWxsIGJlIHN0YXJ0ZWQgdG8gZm9sbG93XG5cCit0aGUgbmV3IGNoaWxkIHByb2Nlc3MuICBUaGUgb3JpZ2luYWwgZGVidWdnZXIgd2lsbCBjb250aW51ZSB0byBmb2xsb3dcblwKK3RoZSBvcmlnaW5hbCBwYXJlbnQgcHJvY2Vzcy4gIFRvIGRpc3Rpbmd1aXNoIHRoZWlyIHByb21wdHMsIHRoZVxuXAorZGVidWdnZXIgY29weSdzIHByb21wdCB3aWxsIGJlIGNoYW5nZWQuXG5cCitGb3IgXCJwYXJlbnRcIiBvciBcImNoaWxkXCIsIHRoZSB1bmZvbGxvd2VkIHByb2Nlc3Mgd2lsbCBydW4gZnJlZS5cblwKK0J5IGRlZmF1bHQsIHRoZSBkZWJ1Z2dlciB3aWxsIGZvbGxvdyB0aGUgcGFyZW50IHByb2Nlc3MuIiwKKyovCisJCQkiU2V0IGRlYnVnZ2VyIHJlc3BvbnNlIHRvIGEgcHJvZ3JhbSBjYWxsIG9mIGZvcmsgXAorb3IgdmZvcmsuXG5cCitBIGZvcmsgb3IgdmZvcmsgY3JlYXRlcyBhIG5ldyBwcm9jZXNzLiAgZm9sbG93LWZvcmstbW9kZSBjYW4gYmU6XG5cCisgIHBhcmVudCAgLSB0aGUgb3JpZ2luYWwgcHJvY2VzcyBpcyBkZWJ1Z2dlZCBhZnRlciBhIGZvcmtcblwKKyAgY2hpbGQgICAtIHRoZSBuZXcgcHJvY2VzcyBpcyBkZWJ1Z2dlZCBhZnRlciBhIGZvcmtcblwKKyAgYXNrICAgICAtIHRoZSBkZWJ1Z2dlciB3aWxsIGFzayBmb3Igb25lIG9mIHRoZSBhYm92ZSBjaG9pY2VzXG5cCitGb3IgXCJwYXJlbnRcIiBvciBcImNoaWxkXCIsIHRoZSB1bmZvbGxvd2VkIHByb2Nlc3Mgd2lsbCBydW4gZnJlZS5cblwKK0J5IGRlZmF1bHQsIHRoZSBkZWJ1Z2dlciB3aWxsIGZvbGxvdyB0aGUgcGFyZW50IHByb2Nlc3MuIiwKKwkJCSZzZXRsaXN0KTsKKy8qICBjLT5mdW5jdGlvbi5zZnVuYyA9IDsqLworICBhZGRfc2hvd19mcm9tX3NldCAoYywgJnNob3dsaXN0KTsKKworICBzZXRfZm9sbG93X2ZvcmtfbW9kZV9jb21tYW5kICgicGFyZW50IiwgMCwgTlVMTCk7CisKKyAgYyA9IGFkZF9zZXRfZW51bV9jbWQgKCJzY2hlZHVsZXItbG9ja2luZyIsIGNsYXNzX3J1biwKKwkJCXNjaGVkdWxlcl9lbnVtcywJLyogYXJyYXkgb2Ygc3RyaW5nIG5hbWVzICovCisJCQkoY2hhciAqKSAmc2NoZWR1bGVyX21vZGUsCS8qIGN1cnJlbnQgbW9kZSAgKi8KKwkJCSJTZXQgbW9kZSBmb3IgbG9ja2luZyBzY2hlZHVsZXIgZHVyaW5nIGV4ZWN1dGlvbi5cblwKK29mZiAgPT0gbm8gbG9ja2luZyAodGhyZWFkcyBtYXkgcHJlZW1wdCBhdCBhbnkgdGltZSlcblwKK29uICAgPT0gZnVsbCBsb2NraW5nIChubyB0aHJlYWQgZXhjZXB0IHRoZSBjdXJyZW50IHRocmVhZCBtYXkgcnVuKVxuXAorc3RlcCA9PSBzY2hlZHVsZXIgbG9ja2VkIGR1cmluZyBldmVyeSBzaW5nbGUtc3RlcCBvcGVyYXRpb24uXG5cCisJSW4gdGhpcyBtb2RlLCBubyBvdGhlciB0aHJlYWQgbWF5IHJ1biBkdXJpbmcgYSBzdGVwIGNvbW1hbmQuXG5cCisJT3RoZXIgdGhyZWFkcyBtYXkgcnVuIHdoaWxlIHN0ZXBwaW5nIG92ZXIgYSBmdW5jdGlvbiBjYWxsICgnbmV4dCcpLiIsCisJCQkmc2V0bGlzdCk7CisKKyAgYy0+ZnVuY3Rpb24uc2Z1bmMgPSBzZXRfc2NoZWRsb2NrX2Z1bmM7CS8qIHRyYXBzIG9uIHRhcmdldCB2ZWN0b3IgKi8KKyAgYWRkX3Nob3dfZnJvbV9zZXQgKGMsICZzaG93bGlzdCk7Cit9CmRpZmYgLS1naXQgYS9nZGIvaW5mdGFyZy5jIGIvZ2RiL2luZnRhcmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjVjZDNkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2luZnRhcmcuYwpAQCAtMCwwICsxLDk2OCBAQAorLyogVGFyZ2V0LXZlY3RvciBvcGVyYXRpb25zIGZvciBjb250cm9sbGluZyBVbml4IGNoaWxkIHByb2Nlc3NlcywgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTkwLTE5OTYsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworIyMgQ29udGFpbnMgdGVtcG9yYXJ5IGhhY2tzLi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiICAvKiByZXF1aXJlZCBieSBpbmZlcmlvci5oICovCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgImdkYl9zdGF0LmgiCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2lmZGVmIEhBVkVfV0FJVF9ICisjIGluY2x1ZGUgPHdhaXQuaD4KKyNlbHNlCisjIGlmZGVmIEhBVkVfU1lTX1dBSVRfSAorIyAgaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyMgZW5kaWYKKyNlbmRpZgorCisvKiAid2FpdC5oIiBmaWxscyBpbiB0aGUgZ2FwcyBsZWZ0IGJ5IDx3YWl0Lmg+ICovCisjaW5jbHVkZSAid2FpdC5oIgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCitleHRlcm4gc3RydWN0IHN5bXRhYl9hbmRfbGluZSAqCitjaGlsZF9lbmFibGVfZXhjZXB0aW9uX2NhbGxiYWNrIFBBUkFNUyAoKGVudW0gZXhjZXB0aW9uX2V2ZW50X2tpbmQsIGludCkpOworCitleHRlcm4gc3RydWN0IGV4Y2VwdGlvbl9ldmVudF9yZWNvcmQgKgorY2hpbGRfZ2V0X2N1cnJlbnRfZXhjZXB0aW9uX2V2ZW50IFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgX2luaXRpYWxpemVfaW5mdGFyZyBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkCitjaGlsZF9wcmVwYXJlX3RvX3N0b3JlIFBBUkFNUyAoKHZvaWQpKTsKKworI2lmbmRlZiBDSElMRF9XQUlUCitzdGF0aWMgaW50IGNoaWxkX3dhaXQgUEFSQU1TICgoaW50LCBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKikpOworI2VuZGlmIC8qIENISUxEX1dBSVQgKi8KKworI2lmICFkZWZpbmVkKENISUxEX1BPU1RfV0FJVCkKK3ZvaWQKK2NoaWxkX3Bvc3Rfd2FpdCBQQVJBTVMgKChpbnQsIGludCkpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNoaWxkX29wZW4gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2NoaWxkX2ZpbGVzX2luZm8gUEFSQU1TICgoc3RydWN0IHRhcmdldF9vcHMgKikpOworCitzdGF0aWMgdm9pZAorY2hpbGRfZGV0YWNoIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitjaGlsZF9kZXRhY2hfZnJvbV9wcm9jZXNzIFBBUkFNUyAoKGludCwgY2hhciAqLCBpbnQsIGludCkpOworCitzdGF0aWMgdm9pZAorY2hpbGRfYXR0YWNoIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitjaGlsZF9hdHRhY2hfdG9fcHJvY2VzcyBQQVJBTVMgKChjaGFyICosIGludCwgaW50KSk7CisKKyNpZiAhZGVmaW5lZChDSElMRF9QT1NUX0FUVEFDSCkKK2V4dGVybiB2b2lkIGNoaWxkX3Bvc3RfYXR0YWNoIFBBUkFNUyAoKGludCkpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkCitjaGlsZF9yZXF1aXJlX2F0dGFjaCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZAorY2hpbGRfcmVxdWlyZV9kZXRhY2ggUEFSQU1TICgoaW50LCBjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZAorcHRyYWNlX21lIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQgCitwdHJhY2VfaGltIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgdm9pZCAKK2NoaWxkX2NyZWF0ZV9pbmZlcmlvciBQQVJBTVMgKChjaGFyICosIGNoYXIgKiwgY2hhciAqKikpOworCitzdGF0aWMgdm9pZAorY2hpbGRfbW91cm5faW5mZXJpb3IgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgaW50CitjaGlsZF9jYW5fcnVuIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQKK2NoaWxkX3N0b3AgUEFSQU1TICgodm9pZCkpOworCisjaWZuZGVmIENISUxEX1RIUkVBRF9BTElWRQoraW50IGNoaWxkX3RocmVhZF9hbGl2ZSBQQVJBTVMgKChpbnQpKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpbml0X2NoaWxkX29wcyBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKworc3RydWN0IHRhcmdldF9vcHMgY2hpbGRfb3BzOworCitpbnQgY2hpbGRfc3VwcHJlc3NfcnVuID0gMDsJLyogTm9uLXplcm8gaWYgaW5mdGFyZyBzaG91bGQgcHJldGVuZCBub3QgdG8KKwkJCQkgICBiZSBhIHJ1bm5hYmxlIHRhcmdldC4gIFVzZWQgYnkgdGFyZ2V0cworCQkJCSAgIHRoYXQgY2FuIHNpdCBhdG9wIGluZnRhcmcsIHN1Y2ggYXMgSFBVWAorCQkJCSAgIHRocmVhZCBzdXBwb3J0LiAgKi8KKworI2lmbmRlZiBDSElMRF9XQUlUCisKKy8qIyMqLworLyogRW5hYmxlIEhBQ0sgZm9yIHR0cmFjZSB3b3JrLiAgSW4KKyAqIGluZnR0cmFjZS5jL3JlcXVpcmVfbm90aWZpY2F0aW9uX29mX2V2ZW50cywKKyAqIHRoaXMgaXMgc2V0IHRvIDAgc28gdGhhdCB0aGUgbG9vcCBpbiBjaGlsZF93YWl0CisgKiB3b24ndCBsb29wLgorICovCitpbnQgbm90X3NhbWVfcmVhbF9waWQgPSAxOworLyojIyovCisKKworLyogV2FpdCBmb3IgY2hpbGQgdG8gZG8gc29tZXRoaW5nLiAgUmV0dXJuIHBpZCBvZiBjaGlsZCwgb3IgLTEgaW4gY2FzZQorICAgb2YgZXJyb3I7IHN0b3JlIHN0YXR1cyB0aHJvdWdoIGFyZ3VtZW50IHBvaW50ZXIgT1VSU1RBVFVTLiAgKi8KKworc3RhdGljIGludAorY2hpbGRfd2FpdCAocGlkLCBvdXJzdGF0dXMpCisgICAgIGludCBwaWQ7CisgICAgIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqb3Vyc3RhdHVzOworeworICBpbnQgc2F2ZV9lcnJubzsKKyAgaW50IHN0YXR1czsKKyAgY2hhciAqICBleGVjZF9wYXRobmFtZTsKKyAgaW50ICBleGl0X3N0YXR1czsKKyAgaW50ICByZWxhdGVkX3BpZDsKKyAgaW50ICBzeXNjYWxsX2lkOworICBlbnVtIHRhcmdldF93YWl0a2luZCAga2luZDsKKworICBkbyB7CisgICAgc2V0X3NpZ2ludF90cmFwKCk7CS8qIENhdXNlcyBTSUdJTlQgdG8gYmUgcGFzc2VkIG9uIHRvIHRoZQorCQkJICAgYXR0YWNoZWQgcHJvY2Vzcy4gKi8KKyAgICBzZXRfc2lnaW9fdHJhcCAoKTsKKworICAgIHBpZCA9IHB0cmFjZV93YWl0IChpbmZlcmlvcl9waWQsICZzdGF0dXMpOworCisgICAgc2F2ZV9lcnJubyA9IGVycm5vOworCisgICAgY2xlYXJfc2lnaW9fdHJhcCAoKTsKKworICAgIGNsZWFyX3NpZ2ludF90cmFwKCk7CisKKyAgICBpZiAocGlkID09IC0xKQorICAgICAgeworCWlmIChzYXZlX2Vycm5vID09IEVJTlRSKQorCSAgY29udGludWU7CisKKwlmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJDaGlsZCBwcm9jZXNzIHVuZXhwZWN0ZWRseSBtaXNzaW5nOiAlcy5cbiIsCisJCSBzYWZlX3N0cmVycm9yIChzYXZlX2Vycm5vKSk7CisKKwkvKiBDbGFpbSBpdCBleGl0ZWQgd2l0aCB1bmtub3duIHNpZ25hbC4gICovCisJb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NJR05BTExFRDsKKwlvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVU5LTk9XTjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorCisgICAgLyogRGlkIGl0IGV4aXQ/CisgICAgICovCisgICAgaWYgKHRhcmdldF9oYXNfZXhpdGVkIChwaWQsIHN0YXR1cywgJmV4aXRfc3RhdHVzKSkKKyAgICAgIHsKKyAgICAgICAgLyogPz9yZWhyYXVlcjogRm9yIG5vdywgaWdub3JlIHRoaXMuICovCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgaWYgKCF0YXJnZXRfdGhyZWFkX2FsaXZlIChwaWQpKQorICAgICAgeworICAgICAgICBvdXJzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1BVUklPVVM7CisgICAgICAgIHJldHVybiBwaWQ7CisgICAgICB9CisgICAgICAKKyAgICBpZiAodGFyZ2V0X2hhc19mb3JrZWQgKHBpZCwgJnJlbGF0ZWRfcGlkKQorCSAmJiAoKHBpZCA9PSBpbmZlcmlvcl9waWQpIHx8IChyZWxhdGVkX3BpZCA9PSBpbmZlcmlvcl9waWQpKSkKKyAgICAgIHsKKyAgICAgICAgb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0ZPUktFRDsKKyAgICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5yZWxhdGVkX3BpZCA9IHJlbGF0ZWRfcGlkOworICAgICAgICByZXR1cm4gcGlkOworICAgICAgfQorCisgICAgaWYgKHRhcmdldF9oYXNfdmZvcmtlZCAocGlkLCAmcmVsYXRlZF9waWQpCisJICYmICgocGlkID09IGluZmVyaW9yX3BpZCkgfHwgKHJlbGF0ZWRfcGlkID09IGluZmVyaW9yX3BpZCkpKQorICAgICAgeworICAgICAgICBvdXJzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfVkZPUktFRDsKKyAgICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5yZWxhdGVkX3BpZCA9IHJlbGF0ZWRfcGlkOworICAgICAgICByZXR1cm4gcGlkOworICAgICAgfQorCisgICAgaWYgKHRhcmdldF9oYXNfZXhlY2QgKHBpZCwgJmV4ZWNkX3BhdGhuYW1lKSkKKyAgICAgIHsKKyAgICAgICAgLyogQXJlIHdlIGlnbm9yaW5nIGluaXRpYWwgZXhlYyBldmVudHM/ICAoVGhpcyBpcyBsaWtlbHkgYmVjYXVzZQorICAgICAgICAgICB3ZSdyZSBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cCB0aGUgaW5mZXJpb3IsIGFuZCBhbm90aGVyCisgICAgICAgICAgIChvbGRlcikgbWVjaGFuaXNtIGhhbmRsZXMgdGhvc2UuKSAgSWYgc28sIHdlJ2xsIHJlcG9ydCB0aGlzCisgICAgICAgICAgIGFzIGEgcmVndWxhciBzdG9wLCBub3QgYW4gZXhlYy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKGluZmVyaW9yX2lnbm9yaW5nX3N0YXJ0dXBfZXhlY19ldmVudHMpCisgICAgICAgICAgeworICAgICAgICAgICAgaW5mZXJpb3JfaWdub3Jpbmdfc3RhcnR1cF9leGVjX2V2ZW50cy0tOworICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG91cnN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9FWEVDRDsKKyAgICAgICAgICAgIG91cnN0YXR1cy0+dmFsdWUuZXhlY2RfcGF0aG5hbWUgPSBleGVjZF9wYXRobmFtZTsKKyAgICAgICAgICAgIHJldHVybiBwaWQ7CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgLyogQWxsIHdlIG11c3QgZG8gd2l0aCB0aGVzZSBpcyBjb21tdW5pY2F0ZSB0aGVpciBvY2N1cnJlbmNlCisgICAgICAgdG8gd2FpdF9mb3JfaW5mZXJpb3IuLi4KKyAgICAgICAqLworICAgIGlmICh0YXJnZXRfaGFzX3N5c2NhbGxfZXZlbnQgKHBpZCwgJmtpbmQsICZzeXNjYWxsX2lkKSkKKyAgICAgIHsKKyAgICAgICAgb3Vyc3RhdHVzLT5raW5kID0ga2luZDsKKyAgICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zeXNjYWxsX2lkID0gc3lzY2FsbF9pZDsKKyAgICAgICAgcmV0dXJuIHBpZDsKKyAgICAgIH0KKworLyojIyAgfSB3aGlsZSAocGlkICE9IGluZmVyaW9yX3BpZCk7ICMjKi8gLyogU29tZSBvdGhlciBjaGlsZCBkaWVkIG9yIHN0b3BwZWQgKi8KKy8qIGhhY2sgZm9yIHRocmVhZCB0ZXN0aW5nICovCisgICAgICB9IHdoaWxlKCAocGlkICE9IGluZmVyaW9yX3BpZCkgJiYgbm90X3NhbWVfcmVhbF9waWQgKTsKKy8qIyMqLworCisgIHN0b3JlX3dhaXRzdGF0dXMgKG91cnN0YXR1cywgc3RhdHVzKTsKKyAgcmV0dXJuIHBpZDsKK30KKyNlbmRpZiAvKiBDSElMRF9XQUlUICovCisKKyNpZiAhZGVmaW5lZChDSElMRF9QT1NUX1dBSVQpCit2b2lkCitjaGlsZF9wb3N0X3dhaXQgKHBpZCwgd2FpdF9zdGF0dXMpCisgIGludCAgcGlkOworICBpbnQgIHdhaXRfc3RhdHVzOworeworICAvKiBUaGlzIHZlcnNpb24gb2YgVW5peCBkb2Vzbid0IHJlcXVpcmUgYSBtZWFuaW5nZnVsICJwb3N0IHdhaXQiCisgICAgIG9wZXJhdGlvbi4KKyAgICAgKi8KK30KKyNlbmRpZgorIAorCisjaWZuZGVmIENISUxEX1RIUkVBRF9BTElWRQorCisvKiBDaGVjayB0byBzZWUgaWYgdGhlIGdpdmVuIHRocmVhZCBpcyBhbGl2ZS4KKworICAgRklYTUU6IElzIGtpbGwoKSBldmVyIHRoZSByaWdodCB3YXkgdG8gZG8gdGhpcz8gIEkgZG91YnQgaXQsIGJ1dAorICAgZm9yIG5vdyB3ZSdyZSBnb2luZyB0byB0cnkgYW5kIGJlIGNvbXBhdGFibGUgd2l0aCB0aGUgb2xkIHRocmVhZAorICAgY29kZS4gICovCitpbnQKK2NoaWxkX3RocmVhZF9hbGl2ZSAocGlkKQorICAgICBpbnQgcGlkOworeworICByZXR1cm4gKGtpbGwgKHBpZCwgMCkgIT0gLTEpOworfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQKK2NoaWxkX2F0dGFjaF90b19wcm9jZXNzIChhcmdzLCBmcm9tX3R0eSwgYWZ0ZXJfZm9yaykKKyAgY2hhciAqICBhcmdzOworICBpbnQgIGZyb21fdHR5OworICBpbnQgIGFmdGVyX2Zvcms7Cit7CisgIGlmICghYXJncykKKyAgICBlcnJvcl9ub19hcmcgKCJwcm9jZXNzLWlkIHRvIGF0dGFjaCIpOworCisjaWZuZGVmIEFUVEFDSF9ERVRBQ0gKKyAgZXJyb3IgKCJDYW4ndCBhdHRhY2ggdG8gYSBwcm9jZXNzIG9uIHRoaXMgbWFjaGluZS4iKTsKKyNlbHNlCisgIHsKKyAgICBjaGFyICpleGVjX2ZpbGU7CisgICAgaW50IHBpZDsKKyAgICBjaGFyICpkdW1teTsKKworICAgIGR1bW15ID0gYXJnczsKKyAgICBwaWQgPSBzdHJ0b2wgKGFyZ3MsICZkdW1teSwgMCk7CisgICAgLyogU29tZSB0YXJnZXRzIGRvbid0IHNldCBlcnJubyBvbiBlcnJvcnMsIGdycnIhICovCisgICAgaWYgKChwaWQgPT0gMCkgJiYgKGFyZ3MgPT0gZHVtbXkpKQorICAgICAgZXJyb3IgKCJJbGxlZ2FsIHByb2Nlc3MtaWQ6ICVzXG4iLCBhcmdzKTsKKworICAgIGlmIChwaWQgPT0gZ2V0cGlkKCkpCQkvKiBUcnlpbmcgdG8gbWFzdHVyYmF0ZT8gKi8KKyAgICAgIGVycm9yICgiSSByZWZ1c2UgdG8gZGVidWcgbXlzZWxmISIpOworCisgICAgaWYgKGZyb21fdHR5KQorICAgICAgeworCWV4ZWNfZmlsZSA9IChjaGFyICopIGdldF9leGVjX2ZpbGUgKDApOworCisJaWYgKGFmdGVyX2ZvcmspCisJICBwcmludGZfdW5maWx0ZXJlZCAoIkF0dGFjaGluZyBhZnRlciBmb3JrIHRvICVzXG4iLCAKKwkJICB0YXJnZXRfcGlkX3RvX3N0ciAocGlkKSk7CisJZWxzZSBpZiAoZXhlY19maWxlKQorCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCJBdHRhY2hpbmcgdG8gcHJvZ3JhbTogJXMsICVzXG4iLCBleGVjX2ZpbGUsCisgICAgICAgICAgICAgICAgICB0YXJnZXRfcGlkX3RvX3N0ciAocGlkKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIkF0dGFjaGluZyB0byAlc1xuIiwgdGFyZ2V0X3BpZF90b19zdHIgKHBpZCkpOworCisJZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgICAgIH0KKworICAgIGlmICghYWZ0ZXJfZm9yaykKKyAgICAgIGF0dGFjaCAocGlkKTsKKyAgICBlbHNlCisgICAgICBSRVFVSVJFX0FUVEFDSCAocGlkKTsKKworICAgIGluZmVyaW9yX3BpZCA9IHBpZDsKKyAgICBwdXNoX3RhcmdldCAoJmNoaWxkX29wcyk7CisgIH0KKyNlbmRpZiAgLyogQVRUQUNIX0RFVEFDSCAqLworfQorCisKKy8qIEF0dGFjaCB0byBwcm9jZXNzIFBJRCwgdGhlbiBpbml0aWFsaXplIGZvciBkZWJ1Z2dpbmcgaXQuICAqLworCitzdGF0aWMgdm9pZAorY2hpbGRfYXR0YWNoIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjaGlsZF9hdHRhY2hfdG9fcHJvY2VzcyAoYXJncywgZnJvbV90dHksIDApOworfQorCisjaWYgIWRlZmluZWQoQ0hJTERfUE9TVF9BVFRBQ0gpCit2b2lkCitjaGlsZF9wb3N0X2F0dGFjaCAocGlkKQorICBpbnQgIHBpZDsKK3sKKyAgLyogVGhpcyB2ZXJzaW9uIG9mIFVuaXggZG9lc24ndCByZXF1aXJlIGEgbWVhbmluZ2Z1bCAicG9zdCBhdHRhY2giCisgICAgIG9wZXJhdGlvbiBieSBhIGRlYnVnZ2VyLiAgKi8KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorY2hpbGRfcmVxdWlyZV9hdHRhY2ggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoaWxkX2F0dGFjaF90b19wcm9jZXNzIChhcmdzLCBmcm9tX3R0eSwgMSk7Cit9IAorCitzdGF0aWMgdm9pZAorY2hpbGRfZGV0YWNoX2Zyb21fcHJvY2VzcyAocGlkLCBhcmdzLCBmcm9tX3R0eSwgYWZ0ZXJfZm9yaykKKyAgaW50ICBwaWQ7CisgIGNoYXIgKiAgYXJnczsKKyAgaW50ICBmcm9tX3R0eTsKKyAgaW50ICBhZnRlcl9mb3JrOworeworI2lmZGVmIEFUVEFDSF9ERVRBQ0gKKyAgeworICAgIGludCBzaWdnbmFsID0gMDsKKworICAgIGlmIChmcm9tX3R0eSkKKyAgICAgIHsKKwljaGFyICpleGVjX2ZpbGUgPSBnZXRfZXhlY19maWxlICgwKTsKKwlpZiAoZXhlY19maWxlID09IDApCisJICBleGVjX2ZpbGUgPSAiIjsKKyAgICAgICAgaWYgKGFmdGVyX2ZvcmspCisgICAgICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJEZXRhY2hpbmcgYWZ0ZXIgZm9yayBmcm9tICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfcGlkX3RvX3N0ciAocGlkKSk7CisgICAgICAgIGVsc2UKKwkgIHByaW50Zl91bmZpbHRlcmVkICgiRGV0YWNoaW5nIGZyb20gcHJvZ3JhbTogJXMsICVzXG4iLCBleGVjX2ZpbGUsCisJCSAgICAgICAgICAgICB0YXJnZXRfcGlkX3RvX3N0ciAocGlkKSk7CisJZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgICAgIH0KKyAgICBpZiAoYXJncykKKyAgICAgIHNpZ2duYWwgPSBhdG9pIChhcmdzKTsKKworICAgIGlmICghYWZ0ZXJfZm9yaykKKyAgICAgIGRldGFjaCAoc2lnZ25hbCk7CisgICAgZWxzZQorICAgICAgUkVRVUlSRV9ERVRBQ0ggKHBpZCwgc2lnZ25hbCk7CisgIH0KKyNlbHNlCisgIGVycm9yICgiVGhpcyB2ZXJzaW9uIG9mIFVuaXggZG9lcyBub3Qgc3VwcG9ydCBkZXRhY2hpbmcgYSBwcm9jZXNzLiIpOworI2VuZGlmCit9CisKKy8qIFRha2UgYSBwcm9ncmFtIHByZXZpb3VzbHkgYXR0YWNoZWQgdG8gYW5kIGRldGFjaGVzIGl0LgorICAgVGhlIHByb2dyYW0gcmVzdW1lcyBleGVjdXRpb24gYW5kIHdpbGwgbm8gbG9uZ2VyIHN0b3AKKyAgIG9uIHNpZ25hbHMsIGV0Yy4gIFdlJ2QgYmV0dGVyIG5vdCBoYXZlIGxlZnQgYW55IGJyZWFrcG9pbnRzCisgICBpbiB0aGUgcHJvZ3JhbSBvciBpdCdsbCBkaWUgd2hlbiBpdCBoaXRzIG9uZS4gIEZvciB0aGlzCisgICB0byB3b3JrLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IGZvciB0aGUgcHJvY2VzcyB0byBoYXZlIGJlZW4KKyAgIHByZXZpb3VzbHkgYXR0YWNoZWQuICBJdCAqbWlnaHQqIHdvcmsgaWYgdGhlIHByb2dyYW0gd2FzCisgICBzdGFydGVkIHZpYSB0aGUgbm9ybWFsIHB0cmFjZSAoUFRSQUNFX1RSQUNFTUUpLiAgKi8KKworc3RhdGljIHZvaWQKK2NoaWxkX2RldGFjaCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgY2hpbGRfZGV0YWNoX2Zyb21fcHJvY2VzcyAoaW5mZXJpb3JfcGlkLCBhcmdzLCBmcm9tX3R0eSwgMCk7CisgIGluZmVyaW9yX3BpZCA9IDA7CisgIHVucHVzaF90YXJnZXQgKCZjaGlsZF9vcHMpOworfQorCitzdGF0aWMgdm9pZAorY2hpbGRfcmVxdWlyZV9kZXRhY2ggKHBpZCwgYXJncywgZnJvbV90dHkpCisgIGludCAgcGlkOworICBjaGFyICogIGFyZ3M7CisgIGludCAgZnJvbV90dHk7Cit7CisgIGNoaWxkX2RldGFjaF9mcm9tX3Byb2Nlc3MgKHBpZCwgYXJncywgZnJvbV90dHksIDEpOworfQorCisKKy8qIEdldCByZWFkeSB0byBtb2RpZnkgdGhlIHJlZ2lzdGVycyBhcnJheS4gIE9uIG1hY2hpbmVzIHdoaWNoIHN0b3JlCisgICBpbmRpdmlkdWFsIHJlZ2lzdGVycywgdGhpcyBkb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuICBPbiBtYWNoaW5lcworICAgd2hpY2ggc3RvcmUgYWxsIHRoZSByZWdpc3RlcnMgaW4gb25lIGZlbGwgc3dvb3AsIHRoaXMgbWFrZXMgc3VyZQorICAgdGhhdCByZWdpc3RlcnMgY29udGFpbnMgYWxsIHRoZSByZWdpc3RlcnMgZnJvbSB0aGUgcHJvZ3JhbSBiZWluZworICAgZGVidWdnZWQuICAqLworCitzdGF0aWMgdm9pZAorY2hpbGRfcHJlcGFyZV90b19zdG9yZSAoKQoreworI2lmZGVmIENISUxEX1BSRVBBUkVfVE9fU1RPUkUKKyAgQ0hJTERfUFJFUEFSRV9UT19TVE9SRSAoKTsKKyNlbmRpZgorfQorCisvKiBQcmludCBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCB3ZSdyZSBhY2Nlc3NpbmcuICAqLworCitzdGF0aWMgdm9pZAorY2hpbGRfZmlsZXNfaW5mbyAoaWdub3JlKQorICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqaWdub3JlOworeworICBwcmludGZfdW5maWx0ZXJlZCAoIlx0VXNpbmcgdGhlIHJ1bm5pbmcgaW1hZ2Ugb2YgJXMgJXMuXG4iLAorCSAgYXR0YWNoX2ZsYWc/ICJhdHRhY2hlZCI6ICJjaGlsZCIsIHRhcmdldF9waWRfdG9fc3RyIChpbmZlcmlvcl9waWQpKTsKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitjaGlsZF9vcGVuIChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZXJyb3IgKCJVc2UgdGhlIFwicnVuXCIgY29tbWFuZCB0byBzdGFydCBhIFVuaXggY2hpbGQgcHJvY2Vzcy4iKTsKK30KKworLyogU3R1YiBmdW5jdGlvbiB3aGljaCBjYXVzZXMgdGhlIGluZmVyaW9yIHRoYXQgcnVucyBpdCwgdG8gYmUgcHRyYWNlLWFibGUKKyAgIGJ5IGl0cyBwYXJlbnQgcHJvY2Vzcy4gICovCisKK3N0YXRpYyB2b2lkCitwdHJhY2VfbWUgKCkKK3sKKyAgLyogIlRyYWNlIG1lLCBEci4gTWVtb3J5ISIgKi8KKyAgY2FsbF9wdHJhY2UgKDAsIDAsIChQVFJBQ0VfQVJHM19UWVBFKSAwLCAwKTsKK30KKworLyogU3R1YiBmdW5jdGlvbiB3aGljaCBjYXVzZXMgdGhlIEdEQiB0aGF0IHJ1bnMgaXQsIHRvIHN0YXJ0IHB0cmFjZS1pbmcKKyAgIHRoZSBjaGlsZCBwcm9jZXNzLiAgKi8KKworc3RhdGljIHZvaWQgCitwdHJhY2VfaGltIChwaWQpCisgICAgIGludCBwaWQ7Cit7CisgIHB1c2hfdGFyZ2V0ICgmY2hpbGRfb3BzKTsKKworICAvKiBPbiBzb21lIHRhcmdldHMsIHRoZXJlIG11c3QgYmUgc29tZSBleHBsaWNpdCBzeW5jaHJvbml6YXRpb24KKyAgICAgYmV0d2VlbiB0aGUgcGFyZW50IGFuZCBjaGlsZCBwcm9jZXNzZXMgYWZ0ZXIgdGhlIGRlYnVnZ2VyCisgICAgIGZvcmtzLCBhbmQgYmVmb3JlIHRoZSBjaGlsZCBleGVjcyB0aGUgZGVidWdnZWUgcHJvZ3JhbS4gIFRoaXMKKyAgICAgY2FsbCBiYXNpY2FsbHkgZ2l2ZXMgcGVybWlzc2lvbiBmb3IgdGhlIGNoaWxkIHRvIGV4ZWMuCisgICAgICovCisKKyAgdGFyZ2V0X2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IgKHBpZCk7CisKKyAgLyogU1RBUlRfSU5GRVJJT1JfVFJBUFNfRVhQRUNURUQgaXMgZGVmaW5lZCBpbiBpbmZlcmlvci5oLAorICAgKiBhbmQgd2lsbCBiZSAxIG9yIDIgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UncmUgc3RhcnRpbmcKKyAgICogd2l0aG91dCBvciB3aXRoIGEgc2hlbGwuCisgICAqLworICBzdGFydHVwX2luZmVyaW9yIChTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCk7CisKKyAgLyogT24gc29tZSB0YXJnZXRzLCB0aGVyZSBtdXN0IGJlIHNvbWUgZXhwbGljaXQgYWN0aW9ucyB0YWtlbiBhZnRlcgorICAgICB0aGUgaW5mZXJpb3IgaGFzIGJlZW4gc3RhcnRlZCB1cC4KKyAgICAgKi8KKyAgdGFyZ2V0X3Bvc3Rfc3RhcnR1cF9pbmZlcmlvciAocGlkKTsKK30KKworLyogU3RhcnQgYW4gaW5mZXJpb3IgVW5peCBjaGlsZCBwcm9jZXNzIGFuZCBzZXRzIGluZmVyaW9yX3BpZCB0byBpdHMgcGlkLgorICAgRVhFQ19GSUxFIGlzIHRoZSBmaWxlIHRvIHJ1bi4KKyAgIEFMTEFSR1MgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgYXJndW1lbnRzIHRvIHRoZSBwcm9ncmFtLgorICAgRU5WIGlzIHRoZSBlbnZpcm9ubWVudCB2ZWN0b3IgdG8gcGFzcy4gIEVycm9ycyByZXBvcnRlZCB3aXRoIGVycm9yKCkuICAqLworCitzdGF0aWMgdm9pZAorY2hpbGRfY3JlYXRlX2luZmVyaW9yIChleGVjX2ZpbGUsIGFsbGFyZ3MsIGVudikKKyAgICAgY2hhciAqZXhlY19maWxlOworICAgICBjaGFyICphbGxhcmdzOworICAgICBjaGFyICoqZW52OworeworCisjaWZkZWYgSFBVWEhQUEEKKyAgY2hhciAqdHJ5bmFtZTsKKyAgY2hhciAqc2hlbGxfZmlsZTsKKyAgY2hhciAqcDsKKyAgY2hhciAqcDE7CisgIGNoYXIgKnBhdGggPSBnZXRlbnYgKCJQQVRIIik7CisgIGludCBsZW47CisgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisKKyAgLyogT24gSFAtVVgsIHdlIGhhdmUgYSBwb3NzaWJsZSBiYWQgaW50ZXJhY3Rpb24gYmV0d2VlbgorICAgKiB0aGUgc3RhcnQtdXAtd2l0aC1zaGVsbCBjb2RlIGFuZCBvdXIgY2F0Y2gtZm9yay9jYXRjaC1leGVjCisgICAqIGxvZ2ljLiBUbyBhdm9pZCB0aGUgYmFkIGludGVyYWN0aW9uLCB3ZSBzdGFydCB1cCB3aXRoIHRoZQorICAgKiBDIHNoZWxsICgiY3NoIikgYW5kIHBhc3MgaXQgdGhlICItZiIgZmxhZyAoZmFzdCBzdGFydC11cCwKKyAgICogZG9uJ3QgcnVuIC5jc2hyYyBjb2RlKS4KKyAgICogU2VlIGZ1cnRoZXIgY29tbWVudHMgaW4gaW5mZXJpb3IuaCB0b3dhcmQgdGhlIGJvdHRvbQorICAgKiAoU1RBUlRVUF9XSVRIX1NIRUxMIGZsYWcpIGFuZCBpbiBmb3JrLWNoaWxkLmMKKyAgICovCisKKyAgLyogUmF0aGVyIHRoYW4gcGFzc2luZyBpbiBhIGhhcmQtd2lyZWQgcGF0aCBsaWtlICIvYmluL2NzaCIsCisgICAqIHdlIGxvb2sgZG93biB0aGUgUEFUSCB0byBmaW5kIGNzaC4gSSB0b29rIHRoaXMgY29kZSBmcm9tCisgICAqIHByb2Nmcy5jLCB3aGljaCBpcyB0aGUgZmlsZSBpbiB0aGUgU3VuLXNwZWNpZmljIHBhcnQgb2YgR0RCCisgICAqIGFuYWxvZ291cyB0byBpbmZ0YXJnLmMuIFNlZSBwcm9jZnMuYyBmb3IgbW9yZSBkZXRhaWxlZCAKKyAgICogY29tbWVudHMuIC0gUlQKKyAgICovCisgIHNoZWxsX2ZpbGUgPSAiY3NoIjsKKyAgaWYgKHBhdGggPT0gTlVMTCkKKyAgICBwYXRoID0gIi9iaW46L3Vzci9iaW4iOworICB0cnluYW1lID0gYWxsb2NhIChzdHJsZW4gKHBhdGgpICsgc3RybGVuIChzaGVsbF9maWxlKSArIDIpOworICBmb3IgKHAgPSBwYXRoOyBwICE9IE5VTEw7IHAgPSBwMSA/IHAxICsgMTogTlVMTCkKKyAgICB7CisgICAgcDEgPSBzdHJjaHIgKHAsICc6Jyk7CisgICAgaWYgKHAxICE9IE5VTEwpCisgICAgICBsZW4gPSBwMSAtIHA7CisgICAgZWxzZQorICAgICAgbGVuID0gc3RybGVuIChwKTsKKyAgICBzdHJuY3B5ICh0cnluYW1lLCBwLCBsZW4pOworICAgIHRyeW5hbWVbbGVuXSA9ICdcMCc7CisgICAgc3RyY2F0ICh0cnluYW1lLCAiLyIpOworICAgIHN0cmNhdCAodHJ5bmFtZSwgc2hlbGxfZmlsZSk7CisgICAgaWYgKGFjY2VzcyAodHJ5bmFtZSwgWF9PSykgPCAwKQorICAgICAgY29udGludWU7CisgICAgaWYgKHN0YXQgKHRyeW5hbWUsICZzdGF0YnVmKSA8IDApCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoIVNfSVNSRUcgKHN0YXRidWYuc3RfbW9kZSkpCisgICAgICAvKiBXZSBjZXJ0YWlubHkgbmVlZCB0byByZWplY3QgZGlyZWN0b3JpZXMuICBJJ20gbm90IHF1aXRlCisgICAgICAgICBhcyBzdXJlIGFib3V0IEZJRk9zLCBzb2NrZXRzLCBldGMuLCBidXQgSSBraW5kIG9mIGRvdWJ0CisgICAgICAgICB0aGF0IHBlb3BsZSB3YW50IHRvIGV4ZWMoKSB0aGVzZSB0aGluZ3MuICAqLworICAgICAgY29udGludWU7CisgICAgICBicmVhazsKKyAgICB9CisgIGlmIChwID09IE5VTEwpCisgICAgLyogTm90IGZvdW5kLiBJIHJlcGxhY2VkIHRoZSBlcnJvcigpIHdoaWNoIGV4aXN0ZWQgaW4gcHJvY2ZzLmMKKyAgICAgKiB3aXRoIHNpbXBseSBwYXNzaW5nIGluIE5VTEwgYW5kIGhvcGluZyBmb3JrX2luZmVyaW9yKCkgCisgICAgICogY2FuIGRlYWwgd2l0aCBpdC4gLSBSVAorICAgICAqLyAKKyAgICAvKiBlcnJvciAoIkNhbid0IGZpbmQgc2hlbGwgJXMgaW4gUEFUSCIsIHNoZWxsX2ZpbGUpOyAqLworICAgIHNoZWxsX2ZpbGUgPSBOVUxMOworICBlbHNlCisgICAgc2hlbGxfZmlsZSA9IHRyeW5hbWU7CisKKyAgZm9ya19pbmZlcmlvciAoZXhlY19maWxlLCBhbGxhcmdzLCBlbnYsIHB0cmFjZV9tZSwgcHRyYWNlX2hpbSwgcHJlX2ZvcmtfaW5mZXJpb3IsIE5VTEwpOworI2Vsc2UKKyBmb3JrX2luZmVyaW9yIChleGVjX2ZpbGUsIGFsbGFyZ3MsIGVudiwgcHRyYWNlX21lLCBwdHJhY2VfaGltLCBOVUxMLCBOVUxMKTsKKyNlbmRpZgorICAvKiBXZSBhcmUgYXQgdGhlIGZpcnN0IGluc3RydWN0aW9uIHdlIGNhcmUgYWJvdXQuICAqLworICAvKiBQZWRhbCB0byB0aGUgbWV0YWwuLi4gKi8KKyAgcHJvY2VlZCAoKENPUkVfQUREUikgLTEsIFRBUkdFVF9TSUdOQUxfMCwgMCk7Cit9CisKKyNpZiAhZGVmaW5lZChDSElMRF9QT1NUX1NUQVJUVVBfSU5GRVJJT1IpCit2b2lkCitjaGlsZF9wb3N0X3N0YXJ0dXBfaW5mZXJpb3IgKHBpZCkKKyAgaW50ICBwaWQ7Cit7CisgIC8qIFRoaXMgdmVyc2lvbiBvZiBVbml4IGRvZXNuJ3QgcmVxdWlyZSBhIG1lYW5pbmdmdWwgInBvc3Qgc3RhcnR1cCBpbmZlcmlvciIKKyAgICAgb3BlcmF0aW9uIGJ5IGEgZGVidWdnZXIuCisgICAgICovCit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKENISUxEX0FDS05PV0xFREdFX0NSRUFURURfSU5GRVJJT1IpCit2b2lkCitjaGlsZF9hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yIChwaWQpCisgIGludCAgcGlkOworeworICAvKiBUaGlzIHZlcnNpb24gb2YgVW5peCBkb2Vzbid0IHJlcXVpcmUgYSBtZWFuaW5nZnVsICJhY2tub3dsZWRnZSBjcmVhdGVkIGluZmVyaW9yIgorICAgICBvcGVyYXRpb24gYnkgYSBkZWJ1Z2dlci4KKyAgICAgKi8KK30KKyNlbmRpZgorCisKK3ZvaWQKK2NoaWxkX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IgKGNoaWxkX3BpZCwgZm9sbG93ZWRfY2hpbGQpCisgIGludCAgY2hpbGRfcGlkOworICBpbnQgICpmb2xsb3dlZF9jaGlsZDsKK3sKKyAgY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciAoY2hpbGRfcGlkLCBmb2xsb3dlZF9jaGlsZCk7CisKKyAgLyogRG9uJ3QgcmVzdW1lIENISUxEX1BJRDsgaXQncyBzdG9wcGVkIHdoZXJlIGl0IG91Z2h0IHRvIGJlLCB1bnRpbAorICAgICB0aGUgZGVjaXNpb24gZ2V0cyBtYWRlIGVsc2V3aGVyZSBob3cgdG8gY29udGludWUgaXQuCisgICAgICovCit9CisKKworI2lmICFkZWZpbmVkKENISUxEX1BPU1RfRk9MTE9XX0lORkVSSU9SX0JZX0NMT05FKQordm9pZAorY2hpbGRfcG9zdF9mb2xsb3dfaW5mZXJpb3JfYnlfY2xvbmUgKCkKK3sKKyAgLyogVGhpcyB2ZXJzaW9uIG9mIFVuaXggZG9lc24ndCByZXF1aXJlIGEgbWVhbmluZ2Z1bCAicG9zdCBmb2xsb3cgaW5mZXJpb3IiCisgICAgIG9wZXJhdGlvbiBieSBhIGNsb25lIGRlYnVnZ2VyLgorICAgICAqLworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDSElMRF9JTlNFUlRfRk9SS19DQVRDSFBPSU5UKQoraW50CitjaGlsZF9pbnNlcnRfZm9ya19jYXRjaHBvaW50IChwaWQpCisgICAgIGludCBwaWQ7Cit7CisgIC8qIFRoaXMgdmVyc2lvbiBvZiBVbml4IGRvZXNuJ3Qgc3VwcG9ydCBub3RpZmljYXRpb24gb2YgZm9yayBldmVudHMuICAqLworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ0hJTERfUkVNT1ZFX0ZPUktfQ0FUQ0hQT0lOVCkKK2ludAorY2hpbGRfcmVtb3ZlX2ZvcmtfY2F0Y2hwb2ludCAocGlkKQorICAgICBpbnQgcGlkOworeworICAvKiBUaGlzIHZlcnNpb24gb2YgVW5peCBkb2Vzbid0IHN1cHBvcnQgbm90aWZpY2F0aW9uIG9mIGZvcmsgZXZlbnRzLiAgKi8KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKENISUxEX0lOU0VSVF9WRk9SS19DQVRDSFBPSU5UKQoraW50CitjaGlsZF9pbnNlcnRfdmZvcmtfY2F0Y2hwb2ludCAocGlkKQorICAgICBpbnQgcGlkOworeworICAvKiBUaGlzIHZlcnNpb24gb2YgVW5peCBkb2Vzbid0IHN1cHBvcnQgbm90aWZpY2F0aW9uIG9mIHZmb3JrIGV2ZW50cy4gICovCisgIHJldHVybiAwOworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDSElMRF9SRU1PVkVfVkZPUktfQ0FUQ0hQT0lOVCkKK2ludAorY2hpbGRfcmVtb3ZlX3Zmb3JrX2NhdGNocG9pbnQgKHBpZCkKKyAgICAgaW50IHBpZDsKK3sKKyAgLyogVGhpcyB2ZXJzaW9uIG9mIFVuaXggZG9lc24ndCBzdXBwb3J0IG5vdGlmaWNhdGlvbiBvZiB2Zm9yayBldmVudHMuICAqLworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ0hJTERfSEFTX0ZPUktFRCkKK2ludAorY2hpbGRfaGFzX2ZvcmtlZCAocGlkLCBjaGlsZF9waWQpCisgICAgIGludCBwaWQ7CisgICAgIGludCAqY2hpbGRfcGlkOworeworICAvKiBUaGlzIHZlcnNpb24gb2YgVW5peCBkb2Vzbid0IHN1cHBvcnQgbm90aWZpY2F0aW9uIG9mIGZvcmsgZXZlbnRzLiAgKi8KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisjaWYgIWRlZmluZWQoQ0hJTERfSEFTX1ZGT1JLRUQpCitpbnQKK2NoaWxkX2hhc192Zm9ya2VkIChwaWQsIGNoaWxkX3BpZCkKKyAgaW50ICBwaWQ7CisgIGludCAqICBjaGlsZF9waWQ7Cit7CisgIC8qIFRoaXMgdmVyc2lvbiBvZiBVbml4IGRvZXNuJ3Qgc3VwcG9ydCBub3RpZmljYXRpb24gb2YgdmZvcmsgZXZlbnRzLgorICAgICAqLworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisKKyNpZiAhZGVmaW5lZChDSElMRF9DQU5fRk9MTE9XX1ZGT1JLX1BSSU9SX1RPX0VYRUMpCitpbnQKK2NoaWxkX2Nhbl9mb2xsb3dfdmZvcmtfcHJpb3JfdG9fZXhlYyAoKQoreworICAvKiBUaGlzIHZlcnNpb24gb2YgVW5peCBkb2Vzbid0IHN1cHBvcnQgbm90aWZpY2F0aW9uIG9mIHZmb3JrIGV2ZW50cy4KKyAgICAgSG93ZXZlciwgaWYgaXQgZGlkLCBpdCBwcm9iYWJseSB3b3VsZG4ndCBhbGxvdyB2Zm9ya3MgdG8gYmUgZm9sbG93ZWQKKyAgICAgYmVmb3JlIHRoZSBmb2xsb3dpbmcgZXhlYy4KKyAgICAgKi8KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisjaWYgIWRlZmluZWQoQ0hJTERfUE9TVF9GT0xMT1dfVkZPUkspCit2b2lkCitjaGlsZF9wb3N0X2ZvbGxvd192Zm9yayAocGFyZW50X3BpZCwgZm9sbG93ZWRfcGFyZW50LCBjaGlsZF9waWQsIGZvbGxvd2VkX2NoaWxkKQorICBpbnQgIHBhcmVudF9waWQ7CisgIGludCAgZm9sbG93ZWRfcGFyZW50OworICBpbnQgIGNoaWxkX3BpZDsKKyAgaW50ICBmb2xsb3dlZF9jaGlsZDsKK3sKKyAgLyogVGhpcyB2ZXJzaW9uIG9mIFVuaXggZG9lc24ndCByZXF1aXJlIGEgbWVhbmluZ2Z1bCAicG9zdCBmb2xsb3cgdmZvcmsiCisgICAgIG9wZXJhdGlvbiBieSBhIGNsb25lIGRlYnVnZ2VyLgorICAgICAqLworfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDSElMRF9JTlNFUlRfRVhFQ19DQVRDSFBPSU5UKQoraW50CitjaGlsZF9pbnNlcnRfZXhlY19jYXRjaHBvaW50IChwaWQpCisgICAgIGludCBwaWQ7Cit7CisgIC8qIFRoaXMgdmVyc2lvbiBvZiBVbml4IGRvZXNuJ3Qgc3VwcG9ydCBub3RpZmljYXRpb24gb2YgZXhlYyBldmVudHMuICAqLworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ0hJTERfUkVNT1ZFX0VYRUNfQ0FUQ0hQT0lOVCkKK2ludAorY2hpbGRfcmVtb3ZlX2V4ZWNfY2F0Y2hwb2ludCAocGlkKQorICAgICBpbnQgcGlkOworeworICAvKiBUaGlzIHZlcnNpb24gb2YgVW5peCBkb2Vzbid0IHN1cHBvcnQgbm90aWZpY2F0aW9uIG9mIGV4ZWMgZXZlbnRzLiAgKi8KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKENISUxEX0hBU19FWEVDRCkKK2ludAorY2hpbGRfaGFzX2V4ZWNkIChwaWQsIGV4ZWNkX3BhdGhuYW1lKQorICBpbnQgIHBpZDsKKyAgY2hhciAqKiAgZXhlY2RfcGF0aG5hbWU7Cit7CisgIC8qIFRoaXMgdmVyc2lvbiBvZiBVbml4IGRvZXNuJ3Qgc3VwcG9ydCBub3RpZmljYXRpb24gb2YgZXhlYyBldmVudHMuCisgICAgICovCisgIHJldHVybiAwOworfQorI2VuZGlmCisKKworI2lmICFkZWZpbmVkKENISUxEX1JFUE9SVEVEX0VYRUNfRVZFTlRTX1BFUl9FWEVDX0NBTEwpCitpbnQKK2NoaWxkX3JlcG9ydGVkX2V4ZWNfZXZlbnRzX3Blcl9leGVjX2NhbGwgKCkKK3sKKyAgLyogVGhpcyB2ZXJzaW9uIG9mIFVuaXggZG9lc24ndCBzdXBwb3J0IG5vdGlmaWNhdGlvbiBvZiBleGVjIGV2ZW50cy4KKyAgICAgKi8KKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworCisjaWYgIWRlZmluZWQoQ0hJTERfSEFTX1NZU0NBTExfRVZFTlQpCitpbnQKK2NoaWxkX2hhc19zeXNjYWxsX2V2ZW50IChwaWQsIGtpbmQsIHN5c2NhbGxfaWQpCisgIGludCAgcGlkOworICBlbnVtIHRhcmdldF93YWl0a2luZCAqICBraW5kOworICBpbnQgKiAgc3lzY2FsbF9pZDsKK3sKKyAgLyogVGhpcyB2ZXJzaW9uIG9mIFVuaXggZG9lc24ndCBzdXBwb3J0IG5vdGlmaWNhdGlvbiBvZiBzeXNjYWxsIGV2ZW50cy4KKyAgICAgKi8KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisjaWYgIWRlZmluZWQoQ0hJTERfSEFTX0VYSVRFRCkKK2ludAorY2hpbGRfaGFzX2V4aXRlZCAocGlkLCB3YWl0X3N0YXR1cywgZXhpdF9zdGF0dXMpCisgIGludCAgcGlkOworICBpbnQgIHdhaXRfc3RhdHVzOworICBpbnQgKiAgZXhpdF9zdGF0dXM7Cit7CisgIGlmIChXSUZFWElURUQgKHdhaXRfc3RhdHVzKSkKKyAgICB7CisgICAgICAqZXhpdF9zdGF0dXMgPSBXRVhJVFNUQVRVUyAod2FpdF9zdGF0dXMpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIGlmIChXSUZTSUdOQUxFRCAod2FpdF9zdGF0dXMpKQorICAgIHsKKyAgICAgICpleGl0X3N0YXR1cyA9IDA7ICAvKiA/PyBEb24ndCBrbm93IHdoYXQgZWxzZSB0byBzYXkgaGVyZS4gKi8KKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiA/PyBEbyB3ZSByZWFsbHkgbmVlZCB0byBjb25zdWx0IHRoZSBldmVudCBzdGF0ZSwgdG9vPyAgQXNzdW1lIHRoZQorICAgd2FpdF9zdGF0ZSBhbG9uZSBzdWZmaWNlcy4KKyAgICovCisgIHJldHVybiAwOworfQorI2VuZGlmCisKKworc3RhdGljIHZvaWQKK2NoaWxkX21vdXJuX2luZmVyaW9yICgpCit7CisgIC8qIEZJWE1FOiBTaG91bGQgYmUgaW4gYSBoZWFkZXIgZmlsZSAqLworICBleHRlcm4gdm9pZCBwcm9jX3JlbW92ZV9mb3JlaWduIFBBUkFNUyAoKGludCkpOworCisgIHVucHVzaF90YXJnZXQgKCZjaGlsZF9vcHMpOworICBwcm9jX3JlbW92ZV9mb3JlaWduIChpbmZlcmlvcl9waWQpOworICBnZW5lcmljX21vdXJuX2luZmVyaW9yICgpOworfQorCitzdGF0aWMgaW50CitjaGlsZF9jYW5fcnVuICgpCit7CisgIC8qIFRoaXMgdmFyaWFibGUgaXMgY29udHJvbGxlZCBieSBtb2R1bGVzIHRoYXQgc2l0IGF0b3AgaW5mdGFyZyB0aGF0IG1heSBsYXllcgorICAgICB0aGVpciBvd24gcHJvY2VzcyBzdHJ1Y3R1cmUgYXRvcCB0aGF0IHByb3ZpZGVkIGhlcmUuICBocHV4LXRocmVhZC5jIGRvZXMKKyAgICAgdGhpcyBiZWNhdXNlIG9mIHRoZSBIcHV4IHVzZXItbW9kZSBsZXZlbCB0aHJlYWQgbW9kZWwuICAqLworCisgIHJldHVybiAhY2hpbGRfc3VwcHJlc3NfcnVuOworfQorCisvKiBTZW5kIGEgU0lHSU5UIHRvIHRoZSBwcm9jZXNzIGdyb3VwLiAgVGhpcyBhY3RzIGp1c3QgbGlrZSB0aGUgdXNlciB0eXBlZCBhCisgICBeQyBvbiB0aGUgY29udHJvbGxpbmcgdGVybWluYWwuCisKKyAgIFhYWCAtIFRoaXMgbWF5IG5vdCBiZSBjb3JyZWN0IGZvciBhbGwgc3lzdGVtcy4gIFNvbWUgbWF5IHdhbnQgdG8gdXNlCisgICBraWxscGcoKSBpbnN0ZWFkIG9mIGtpbGwgKC1wZ3JwKS4gKi8KKworc3RhdGljIHZvaWQKK2NoaWxkX3N0b3AgKCkKK3sKKyAgZXh0ZXJuIHBpZF90IGluZmVyaW9yX3Byb2Nlc3NfZ3JvdXA7CisKKyAga2lsbCAoLWluZmVyaW9yX3Byb2Nlc3NfZ3JvdXAsIFNJR0lOVCk7Cit9CisKKyNpZiAhZGVmaW5lZChDSElMRF9FTkFCTEVfRVhDRVBUSU9OX0NBTExCQUNLKQorc3RydWN0IHN5bXRhYl9hbmRfbGluZSAqCitjaGlsZF9lbmFibGVfZXhjZXB0aW9uX2NhbGxiYWNrIChraW5kLCBlbmFibGUpCisgIGVudW0gZXhjZXB0aW9uX2V2ZW50X2tpbmQga2luZDsKKyAgaW50IGVuYWJsZTsKK3sKKyAgcmV0dXJuIChzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lICopIE5VTEw7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKENISUxEX0dFVF9DVVJSRU5UX0VYQ0VQVElPTl9FVkVOVCkKK3N0cnVjdCBleGNlcHRpb25fZXZlbnRfcmVjb3JkICoKK2NoaWxkX2dldF9jdXJyZW50X2V4Y2VwdGlvbl9ldmVudCAoKQoreworICByZXR1cm4gKHN0cnVjdCBleGNlcHRpb25fZXZlbnRfcmVjb3JkICopIE5VTEw7Cit9CisjZW5kaWYKKworCisjaWYgIWRlZmluZWQoQ0hJTERfUElEX1RPX0VYRUNfRklMRSkKK2NoYXIgKgorY2hpbGRfcGlkX3RvX2V4ZWNfZmlsZSAocGlkKQorICBpbnQgIHBpZDsKK3sKKyAgLyogVGhpcyB2ZXJzaW9uIG9mIFVuaXggZG9lc24ndCBzdXBwb3J0IHRyYW5zbGF0aW9uIG9mIGEgcHJvY2VzcyBJRAorICAgICB0byB0aGUgZmlsZW5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgZmlsZS4KKyAgICAgKi8KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworY2hhciAqCitjaGlsZF9jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUgKGNvcmUpCisgIGNoYXIgKiAgY29yZTsKK3sKKyAgLyogVGhlIHRhcmdldCBzdHJhdHVtIGZvciBhIHJ1bm5pbmcgZXhlY3V0YWJsZSBuZWVkIG5vdCBzdXBwb3J0CisgICAgIHRoaXMgb3BlcmF0aW9uLgorICAgICAqLworICByZXR1cm4gTlVMTDsKK30KKworCisMCitzdGF0aWMgdm9pZAoraW5pdF9jaGlsZF9vcHMgKCkKK3sKKyAgY2hpbGRfb3BzLnRvX3Nob3J0bmFtZSA9ICJjaGlsZCI7CisgIGNoaWxkX29wcy50b19sb25nbmFtZSA9ICJVbml4IGNoaWxkIHByb2Nlc3MiOworICBjaGlsZF9vcHMudG9fZG9jID0gIlVuaXggY2hpbGQgcHJvY2VzcyAoc3RhcnRlZCBieSB0aGUgXCJydW5cIiBjb21tYW5kKS4iOworICBjaGlsZF9vcHMudG9fb3BlbiA9IGNoaWxkX29wZW47CisgIGNoaWxkX29wcy50b19hdHRhY2ggPSBjaGlsZF9hdHRhY2g7CisgIGNoaWxkX29wcy50b19wb3N0X2F0dGFjaCA9IGNoaWxkX3Bvc3RfYXR0YWNoOworICBjaGlsZF9vcHMudG9fcmVxdWlyZV9hdHRhY2ggPSBjaGlsZF9yZXF1aXJlX2F0dGFjaDsKKyAgY2hpbGRfb3BzLnRvX2RldGFjaCA9IGNoaWxkX2RldGFjaDsKKyAgY2hpbGRfb3BzLnRvX3JlcXVpcmVfZGV0YWNoID0gY2hpbGRfcmVxdWlyZV9kZXRhY2g7CisgIGNoaWxkX29wcy50b19yZXN1bWUgPSBjaGlsZF9yZXN1bWU7CisgIGNoaWxkX29wcy50b193YWl0ID0gY2hpbGRfd2FpdDsKKyAgY2hpbGRfb3BzLnRvX3Bvc3Rfd2FpdCA9IGNoaWxkX3Bvc3Rfd2FpdDsKKyAgY2hpbGRfb3BzLnRvX2ZldGNoX3JlZ2lzdGVycyA9IGZldGNoX2luZmVyaW9yX3JlZ2lzdGVyczsKKyAgY2hpbGRfb3BzLnRvX3N0b3JlX3JlZ2lzdGVycyA9IHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVyczsKKyAgY2hpbGRfb3BzLnRvX3ByZXBhcmVfdG9fc3RvcmUgPSBjaGlsZF9wcmVwYXJlX3RvX3N0b3JlOworICBjaGlsZF9vcHMudG9feGZlcl9tZW1vcnkgPSBjaGlsZF94ZmVyX21lbW9yeTsKKyAgY2hpbGRfb3BzLnRvX2ZpbGVzX2luZm8gPSBjaGlsZF9maWxlc19pbmZvOworICBjaGlsZF9vcHMudG9faW5zZXJ0X2JyZWFrcG9pbnQgPSBtZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQ7CisgIGNoaWxkX29wcy50b19yZW1vdmVfYnJlYWtwb2ludCA9IG1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludDsKKyAgY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX2luaXQgPSB0ZXJtaW5hbF9pbml0X2luZmVyaW9yOworICBjaGlsZF9vcHMudG9fdGVybWluYWxfaW5mZXJpb3IgPSB0ZXJtaW5hbF9pbmZlcmlvcjsKKyAgY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCA9IHRlcm1pbmFsX291cnNfZm9yX291dHB1dDsKKyAgY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX291cnMgPSB0ZXJtaW5hbF9vdXJzOworICBjaGlsZF9vcHMudG9fdGVybWluYWxfaW5mbyA9IGNoaWxkX3Rlcm1pbmFsX2luZm87CisgIGNoaWxkX29wcy50b19raWxsID0ga2lsbF9pbmZlcmlvcjsKKyAgY2hpbGRfb3BzLnRvX2NyZWF0ZV9pbmZlcmlvciA9IGNoaWxkX2NyZWF0ZV9pbmZlcmlvcjsKKyAgY2hpbGRfb3BzLnRvX3Bvc3Rfc3RhcnR1cF9pbmZlcmlvciA9IGNoaWxkX3Bvc3Rfc3RhcnR1cF9pbmZlcmlvcjsKKyAgY2hpbGRfb3BzLnRvX2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IgPSBjaGlsZF9hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yOworICBjaGlsZF9vcHMudG9fY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciA9IGNoaWxkX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3I7CisgIGNoaWxkX29wcy50b19wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSA9IGNoaWxkX3Bvc3RfZm9sbG93X2luZmVyaW9yX2J5X2Nsb25lOworICBjaGlsZF9vcHMudG9faW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCA9IGNoaWxkX2luc2VydF9mb3JrX2NhdGNocG9pbnQ7CisgIGNoaWxkX29wcy50b19yZW1vdmVfZm9ya19jYXRjaHBvaW50ID0gY2hpbGRfcmVtb3ZlX2ZvcmtfY2F0Y2hwb2ludDsKKyAgY2hpbGRfb3BzLnRvX2luc2VydF92Zm9ya19jYXRjaHBvaW50ID0gY2hpbGRfaW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQ7CisgIGNoaWxkX29wcy50b19yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludCA9IGNoaWxkX3JlbW92ZV92Zm9ya19jYXRjaHBvaW50OworICBjaGlsZF9vcHMudG9faGFzX2ZvcmtlZCA9IGNoaWxkX2hhc19mb3JrZWQ7CisgIGNoaWxkX29wcy50b19oYXNfdmZvcmtlZCA9IGNoaWxkX2hhc192Zm9ya2VkOworICBjaGlsZF9vcHMudG9fY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjID0gY2hpbGRfY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjOworICBjaGlsZF9vcHMudG9fcG9zdF9mb2xsb3dfdmZvcmsgPSBjaGlsZF9wb3N0X2ZvbGxvd192Zm9yazsKKyAgY2hpbGRfb3BzLnRvX2luc2VydF9leGVjX2NhdGNocG9pbnQgPSBjaGlsZF9pbnNlcnRfZXhlY19jYXRjaHBvaW50OworICBjaGlsZF9vcHMudG9fcmVtb3ZlX2V4ZWNfY2F0Y2hwb2ludCA9IGNoaWxkX3JlbW92ZV9leGVjX2NhdGNocG9pbnQ7CisgIGNoaWxkX29wcy50b19oYXNfZXhlY2QgPSBjaGlsZF9oYXNfZXhlY2Q7CisgIGNoaWxkX29wcy50b19yZXBvcnRlZF9leGVjX2V2ZW50c19wZXJfZXhlY19jYWxsID0gY2hpbGRfcmVwb3J0ZWRfZXhlY19ldmVudHNfcGVyX2V4ZWNfY2FsbDsKKyAgY2hpbGRfb3BzLnRvX2hhc19zeXNjYWxsX2V2ZW50ID0gY2hpbGRfaGFzX3N5c2NhbGxfZXZlbnQ7CisgIGNoaWxkX29wcy50b19oYXNfZXhpdGVkID0gY2hpbGRfaGFzX2V4aXRlZDsKKyAgY2hpbGRfb3BzLnRvX21vdXJuX2luZmVyaW9yID0gY2hpbGRfbW91cm5faW5mZXJpb3I7CisgIGNoaWxkX29wcy50b19jYW5fcnVuID0gY2hpbGRfY2FuX3J1bjsKKyAgY2hpbGRfb3BzLnRvX3RocmVhZF9hbGl2ZSA9IGNoaWxkX3RocmVhZF9hbGl2ZTsKKyAgY2hpbGRfb3BzLnRvX3N0b3AgPSBjaGlsZF9zdG9wOworICBjaGlsZF9vcHMudG9fZW5hYmxlX2V4Y2VwdGlvbl9jYWxsYmFjayA9IGNoaWxkX2VuYWJsZV9leGNlcHRpb25fY2FsbGJhY2s7CisgIGNoaWxkX29wcy50b19nZXRfY3VycmVudF9leGNlcHRpb25fZXZlbnQgPSBjaGlsZF9nZXRfY3VycmVudF9leGNlcHRpb25fZXZlbnQ7CisgIGNoaWxkX29wcy50b19waWRfdG9fZXhlY19maWxlID0gY2hpbGRfcGlkX3RvX2V4ZWNfZmlsZTsKKyAgY2hpbGRfb3BzLnRvX2NvcmVfZmlsZV90b19zeW1fZmlsZSA9IGNoaWxkX2NvcmVfZmlsZV90b19zeW1fZmlsZTsKKyAgY2hpbGRfb3BzLnRvX3N0cmF0dW0gPSBwcm9jZXNzX3N0cmF0dW07CisgIGNoaWxkX29wcy50b19oYXNfYWxsX21lbW9yeSA9IDE7CisgIGNoaWxkX29wcy50b19oYXNfbWVtb3J5ID0gMTsKKyAgY2hpbGRfb3BzLnRvX2hhc19zdGFjayA9IDE7CisgIGNoaWxkX29wcy50b19oYXNfcmVnaXN0ZXJzID0gMTsKKyAgY2hpbGRfb3BzLnRvX2hhc19leGVjdXRpb24gPSAxOworICBjaGlsZF9vcHMudG9fbWFnaWMgPSBPUFNfTUFHSUM7Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX2luZnRhcmcgKCkKK3sKKyNpZmRlZiBIQVZFX09QVElPTkFMX1BST0NfRlMKKyAgY2hhciBwcm9jbmFtZVszMl07CisgIGludCBmZDsKKworICAvKiBJZiB3ZSBoYXZlIGFuIG9wdGlvbmFsIC9wcm9jIGZpbGVzeXN0ZW0gKGUuZy4gdW5kZXIgT1NGLzEpLAorICAgICBkb24ndCBhZGQgcHRyYWNlIHN1cHBvcnQgaWYgd2UgY2FuIGFjY2VzcyB0aGUgcnVubmluZyBHREIgdmlhIC9wcm9jLiAgKi8KKyNpZm5kZWYgUFJPQ19OQU1FX0ZNVAorI2RlZmluZSBQUk9DX05BTUVfRk1UICIvcHJvYy8lMDVkIgorI2VuZGlmCisgIHNwcmludGYgKHByb2NuYW1lLCBQUk9DX05BTUVfRk1ULCBnZXRwaWQgKCkpOworICBpZiAoKGZkID0gb3BlbiAocHJvY25hbWUsIE9fUkRPTkxZKSkgPj0gMCkKKyAgICB7CisgICAgICBjbG9zZSAoZmQpOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgIGluaXRfY2hpbGRfb3BzICgpOworICBhZGRfdGFyZ2V0ICgmY2hpbGRfb3BzKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9pbmZ0dHJhY2UuYyBiL2dkYi9pbmZ0dHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTcyM2RmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2luZnR0cmFjZS5jCkBAIC0wLDAgKzEsNTY3NCBAQAorLyogTG93IGxldmVsIFVuaXggY2hpbGQgaW50ZXJmYWNlIHRvIHR0cmFjZSwgZm9yIEdEQiB3aGVuIHJ1bm5pbmcgdW5kZXIgSFAtVVguCisgICBDb3B5cmlnaHQgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NgorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgIndhaXQuaCIKKyNpbmNsdWRlICJjb21tYW5kLmgiCisKKy8qIFNvbWUgaGFja2VyeSB0byB3b3JrIGFyb3VuZCBhIHVzZSBvZiB0aGUgI2RlZmluZSBuYW1lIE5PX0ZMQUdTCisgKiBpbiBib3RoIGdkYiBhbmQgSFBVWCAoYmZkLmggYW5kIC91c3IvaW5jbHVkZS9tYWNoaW5lL3ZtcGFyYW0uaCkuCisgKi8KKyNpZmRlZiAgTk9fRkxBR1MKKyNkZWZpbmUgSU5GVFRSQUNFX1RFTVBfSEFDSyBOT19GTEFHUworI3VuZGVmICBOT19GTEFHUworI2VuZGlmCisKKyNpZmRlZiBVU0cKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL2Rpci5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaW5jbHVkZSA8c3lzL3R0cmFjZS5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpZm5kZWYgTk9fUFRSQUNFX0gKKyNpZmRlZiBQVFJBQ0VfSU5fV1JPTkdfUExBQ0UKKyNpbmNsdWRlIDxwdHJhY2UuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorI2VuZGlmCisjZW5kaWYgLyogTk9fUFRSQUNFX0ggKi8KKworLyogU2Vjb25kIGhhbGYgb2YgdGhlIGhhY2tlcnkgYWJvdmUuICBOb24tQU5TSSBDLCBzbworICogd2UgY2FuJ3QgdXNlICIjZXJyb3IiLCBhbGFzLgorICovCisjaWZkZWYgTk9fRkxBR1MKKyNpZiAoTk9fRkxBR1MgIT0gSU5GVFRSQUNFX1RFTVBfSEFDSyApCisgIC8qICNlcnJvciAiSGFja2VyeSB0byByZW1vdmUgd2FybmluZyBkaWRuJ3Qgd29yayByaWdodCIgKi8KKyNlbHNlCisgIC8qIE9rLCBuZXcgZGVmJ24gb2YgTk9fRkxBR1MgaXMgc2FtZSBhcyBvbGQgb25lOyBubyBhY3Rpb24gbmVlZGVkLiAqLworI2VuZGlmCisjZWxzZQorICAvKiAjZXJyb3IgIkRpZG4ndCBnZXQgZXhwZWN0ZWQgcmUtZGVmaW5pdGlvbiBvZiBOT19GTEFHUyIgKi8KKyNkZWZpbmUgTk9fRkxBR1MgSU5GVFRSQUNFX1RFTVBfSEFDSworI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoUFRfU0VUVFJDKQorI2RlZmluZSBQVF9TRVRUUkMJMAkvKiBNYWtlIHByb2Nlc3MgdHJhY2VhYmxlIGJ5IHBhcmVudCAqLworI2VuZGlmCisjaWYgIWRlZmluZWQgKFBUX1JFQURfSSkKKyNkZWZpbmUgUFRfUkVBRF9JCTEJLyogUmVhZCB3b3JkIGZyb20gdGV4dCBzcGFjZSAqLworI2VuZGlmCisjaWYgIWRlZmluZWQgKFBUX1JFQURfRCkKKyNkZWZpbmUJUFRfUkVBRF9ECTIJLyogUmVhZCB3b3JkIGZyb20gZGF0YSBzcGFjZSAqLworI2VuZGlmCisjaWYgIWRlZmluZWQgKFBUX1JFQURfVSkKKyNkZWZpbmUgUFRfUkVBRF9VCTMJLyogUmVhZCB3b3JkIGZyb20ga2VybmVsIHVzZXIgc3RydWN0ICovCisjZW5kaWYKKyNpZiAhZGVmaW5lZCAoUFRfV1JJVEVfSSkKKyNkZWZpbmUgUFRfV1JJVEVfSQk0CS8qIFdyaXRlIHdvcmQgdG8gdGV4dCBzcGFjZSAqLworI2VuZGlmCisjaWYgIWRlZmluZWQgKFBUX1dSSVRFX0QpCisjZGVmaW5lIFBUX1dSSVRFX0QJNQkvKiBXcml0ZSB3b3JkIHRvIGRhdGEgc3BhY2UgKi8KKyNlbmRpZgorI2lmICFkZWZpbmVkIChQVF9XUklURV9VKQorI2RlZmluZSBQVF9XUklURV9VCTYJLyogV3JpdGUgd29yZCB0byBrZXJuZWwgdXNlciBzdHJ1Y3QgKi8KKyNlbmRpZgorI2lmICFkZWZpbmVkIChQVF9DT05USU5VRSkKKyNkZWZpbmUgUFRfQ09OVElOVUUJNwkvKiBDb250aW51ZSBhZnRlciBzaWduYWwgKi8KKyNlbmRpZgorI2lmICFkZWZpbmVkIChQVF9TVEVQKQorI2RlZmluZSBQVF9TVEVQCQk5CS8qIFNldCBmbGFnIGZvciBzaW5nbGUgc3RlcHBpbmcgKi8KKyNlbmRpZgorI2lmICFkZWZpbmVkIChQVF9LSUxMKQorI2RlZmluZSBQVF9LSUxMCQk4CS8qIFNlbmQgY2hpbGQgYSBTSUdLSUxMIHNpZ25hbCAqLworI2VuZGlmCisKKyNpZm5kZWYgUFRfQVRUQUNICisjZGVmaW5lIFBUX0FUVEFDSCBQVFJBQ0VfQVRUQUNICisjZW5kaWYKKyNpZm5kZWYgUFRfREVUQUNICisjZGVmaW5lIFBUX0RFVEFDSCBQVFJBQ0VfREVUQUNICisjZW5kaWYKKworI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpZm5kZWYJTk9fU1lTX0ZJTEUKKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2VuZGlmCisKKy8qIFRoaXMgc2VtYXBob3JlIGlzIHVzZWQgdG8gY29vcmRpbmF0ZSB0aGUgY2hpbGQgYW5kIHBhcmVudCBwcm9jZXNzZXMKKyAgIGFmdGVyIGEgZm9yaygpLCBhbmQgYmVmb3JlIGFuIGV4ZWMoKSBieSB0aGUgY2hpbGQuICBTZWUgcGFyZW50X2F0dGFjaF9hbGwKKyAgIGZvciBkZXRhaWxzLgorICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgIHBhcmVudF9jaGFubmVsWzJdOyAgLyogUGFyZW50ICJ0YWxrcyIgdG8gWzFdLCBjaGlsZCAibGlzdGVucyIgdG8gWzBdICovCisgICAgaW50ICBjaGlsZF9jaGFubmVsWzJdOyAgIC8qIENoaWxkICJ0YWxrcyIgdG8gWzFdLCBwYXJlbnQgImxpc3RlbnMiIHRvIFswXSAqLworfSBzdGFydHVwX3NlbWFwaG9yZV90OworCisjZGVmaW5lIFNFTV9UQUxLICgxKQorI2RlZmluZSBTRU1fTElTVEVOICgwKQorCitzdGF0aWMgc3RhcnR1cF9zZW1hcGhvcmVfdCAgc3RhcnR1cF9zZW1hcGhvcmU7CisKKy8qIFNlZSBjYW5fdG91Y2hfdGhyZWFkc19vZl9wcm9jZXNzIGZvciBkZXRhaWxzLiAqLworc3RhdGljIGludCAgdmZvcmtpbmdfY2hpbGRfcGlkID0gMDsKK3N0YXRpYyBpbnQgIHZmb3JrX2luX2ZsaWdodCA9IDA7CisKKy8qIFRvIHN1cHBvcnQgUFJFUEFSRV9UT19QUk9DRUVEIChocHBhX3ByZXBhcmVfdG9fcHJvY2VlZCkuCisgKi8KK3N0YXRpYyBwaWRfdCBvbGRfZ2RiX3BpZCAgPSAwOworc3RhdGljIHBpZF90IHJlcG9ydGVkX3BpZCA9IDA7CitzdGF0aWMgaW50IHJlcG9ydGVkX2JwdCA9IDA7CisKKy8qIDEgaWYgb2sgYXMgcmVzdWx0cyBvZiBhIHR0cmFjZSBvciB0dHJhY2Vfd2FpdCBjYWxsLCAwIG90aGVyd2lzZS4KKyAqLworI2RlZmluZSBUVF9PSyggX3N0YXR1cywgX2Vycm5vICkgXAorICAgICgoKF9zdGF0dXMpID09IDEpICYmICgoX2Vycm5vKSA9PSAwKSkKKworI2RlZmluZSBUVFJBQ0VfQVJHX1RZUEUgdWludDY0X3QKKworLyogV2hlbiBzdXBwbGllZCBhcyB0aGUgImFkZHIiIG9wZXJhbmQsIHR0cmFjZSBpbnRlcnByZXRzIHRoaXMKKyAgIHRvIG1lYW4sICJmcm9tIHRoZSBjdXJyZW50IGFkZHJlc3MiLgorICAgKi8KKyNkZWZpbmUgVFRfVVNFX0NVUlJFTlRfUEMgKChUVFJBQ0VfQVJHX1RZUEUpIFRUX05PUEMpCisKKy8qIFdoZW4gc3VwcGxpZWQgYXMgdGhlICJhZGRyIiwgImRhdGEiIG9yICJhZGRyMiIgb3BlcmFuZCBmb3IgbW9zdAorICAgcmVxdWVzdHMsIHR0cmFjZSBpbnRlcnByZXRzIHRoaXMgdG8gbWVhbiwgInBheSBubyBoZWVkIHRvIHRoaXMKKyAgIGFyZ3VtZW50Ii4KKyAgICovCisjZGVmaW5lIFRUX05JTCAoKFRUUkFDRV9BUkdfVFlQRSkgVFRfTlVMTEFSRykKKworLyogVGhpcyBpcyBjYXBhYmxlIG9mIGhvbGRpbmcgdGhlIHZhbHVlIG9mIGEgMzItYml0IHJlZ2lzdGVyLiAgVGhlCisgICB2YWx1ZSBpcyBhbHdheXMgbGVmdC1hbGlnbmVkIGluIHRoZSBidWZmZXI7IGkuZS4sIFswXSBjb250YWlucworICAgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYnl0ZSBvZiB0aGUgcmVnaXN0ZXIncyB2YWx1ZSwgYW5kIFtzaXplb2YocmVnKV0KKyAgIGNvbnRhaW5zIHRoZSBsZWFzdC1zaWduaWZpY2FudCB2YWx1ZS4KKworICAgPz9yZWhyYXVlcjogWWVzLCB0aGlzIGFzc3VtZXMgdGhhdCBhbiBpbnQgaXMgMzItYml0cyBvbiBIUC1VWCwgYW5kCisgICB0aGF0IHJlZ2lzdGVycyBhcmUgMzItYml0cyBvbiBIUC1VWC4gIFRoZSBsYXR0ZXIgYXNzdW1wdGlvbiBjaGFuZ2VzCisgICB3aXRoIFBBMi4wLgorICAgKi8KK3R5cGVkZWYgaW50ICByZWdpc3Rlcl92YWx1ZV90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICAgICAgICAgICBIb3cgdGhpcyB3b3JrczoKKworICAgMS4gIFRocmVhZCBudW1iZXJzCisKKyAgIFRoZSByZXN0IG9mIEdEQiBzZWVzIHRocmVhZHMgYXMgYmVpbmcgdGhpbmdzIHdpdGggZGlmZmVyZW50CisgICAicGlkIiAocHJvY2VzcyBpZCkgdmFsdWVzLiAgU2VlICJ0aHJlYWQuYyIgZm9yIGRldGFpbHMuICBUaGUKKyAgIHNlcGFyYXRlIHRocmVhZHMgd2lsbCBiZSBzZWVuIGFuZCByZWFjdGVkIHRvIGlmIGluZnR0cmFjZSBwYXNzZXMKKyAgIGJhY2sgZGlmZmVyZW50IHBpZCB2YWx1ZXMgKGZvciBfZXZlbnRzXykuICBTZWUgd2FpdF9mb3JfaW5mZXJpb3IKKyAgIGluIGluZnRhcmcuYy4KKworICAgU28gaW5mdHRyYWNlIGlzIGdvaW5nIHRvIHVzZSB0aHJlYWQgaWRzIGV4dGVybmFsbHksIHByZXRlbmRpbmcKKyAgIHRoZXkgYXJlIHByb2Nlc3MgaWRzLCBhbmQga2VlcCB0cmFjayBpbnRlcm5hbGx5IHNvIHRoYXQgaXQgY2FuCisgICB1c2UgdGhlIHJlYWwgcHJvY2VzcyBpZCAoYW5kIHRocmVhZCBpZCkgd2hlbiBjYWxsaW5nIHR0cmFjZS4KKworICAgVGhlIGRhdGEgc3RydWN0dXJlIHRoYXQgc3VwcG9ydHMgdGhpcyBpcyBhIGxpbmtlZCBsaXN0IG9mIHRoZQorICAgY3VycmVudCB0aHJlYWRzLiAgU2luY2UgYXQgc29tZSBkYXRlIGluZnR0cmFjZSB3aWxsIGhhdmUgdG8KKyAgIGRlYWwgd2l0aCBtdWx0aXBsZSBwcm9jZXNzZXMsIGVhY2ggbGlzdCBlbGVtZW50IHJlY29yZHMgaXRzCisgICBjb3JyZXNwb25kaW5nIHBpZCwgcmF0aGVyIHRoYW4gaGF2aW5nIGEgc2luZ2xlIGdsb2JhbC4KKworICAgTm90ZSB0aGF0IHRoZSBsaXN0IGlzIG9ubHkgYXBwcm94aW1hdGVseSBjdXJyZW50OyB0aGF0J3Mgb2ssIGFzCisgICBpdCdzIHVwIHRvIGRhdGUgd2hlbiB3ZSBuZWVkIGl0ICh3ZSBob3BlISkuICBBbHNvLCBpdCBjYW4gY29udGFpbgorICAgZGVhZCB0aHJlYWRzLCBhcyB0aGVyZSdzIG5vIGhhcm0gaWYgaXQgZG9lcy4KKworICAgVGhlIGFwcHJvYWNoIHRha2VuIGhlcmUgaXMgdG8gYnVyeSB0aGUgdHJhbnNsYXRpb24gZnJvbSBleHRlcm5hbAorICAgdG8gaW50ZXJuYWwgaW5zaWRlICJjYWxsX3R0cmFjZSIgYW5kIGEgZmV3IG90aGVyIHBsYWNlcy4KKworICAgVGhlcmUgYXJlIHNvbWUgd3JpbmtsZXM6CisKKyAgIG8gIFdoZW4gR0RCIGZvcmtzIGl0c2VsZiB0byBjcmVhdGUgdGhlIGRlYnVnIHRhcmdldCBwcm9jZXNzLAorICAgICAgdGhlcmUncyBvbmx5IGEgcGlkIG9mIDAgYXJvdW5kIGluIHRoZSBjaGlsZCwgc28gdGhlCisgICAgICBUVF9QUk9DX1NFVFRSQyBvcGVyYXRpb24gdXNlcyBhIG1vcmUgZGlyZWN0IGNhbGwgdG8gdHRyYWNlOworICAgICAgU2ltaWxpYXJseSwgdGhlIGluaXRpYWwgc2V0dGluZyBvZiB0aGUgZXZlbnQgbWFzayBoYXBwZW5zCisgICAgICBlYXJseSBhcyAgd2VsbCwgYW5kIHNvIGlzIGFsc28gc3BlY2lhbC1jYXNlZCwgYW5kIGFuIGF0dGFjaAorICAgICAgdXNlcyBhIHJlYWwgcGlkOworCisgICBvICBXZSBkZWZpbmUgYW4gdW50aHJlYWRlZCBhcHBsaWNhdGlvbiBhcyBoYXZpbmcgYSAicHNldWRvIgorICAgICAgdGhyZWFkOworCisgICBvICBUbyBrZWVwIGZyb20gY29uZnVzaW5nIHRoZSByZXN0IG9mIEdEQiwgd2UgZG9uJ3Qgc3dpdGNoCisgICAgICB0aGUgUElEIGZvciB0aGUgcHNldWRvIHRocmVhZCB0byBhIFRJRC4gIEEgdGFibGUgd2lsbCBoZWxwOgorCisgICAgICBSZXN0IG9mIEdEQiBzZWVzIHRoZXNlIFBJRHM6ICAgICBwaWQgICB0aWQxICB0aWQyICB0aWQzIC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgT3VyIHRocmVhZCBsaXN0IHN0b3JlczogICAgICAgICAgcGlkICAgcGlkICAgcGlkICAgcGlkICAuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZDAgIHRpZDEgIHRpZDIgIHRpZDMKKyAgICAgIAorICAgICAgVHRyYWNlIHNlZXMgdGhlc2UgVElEUzogICAgICAgICAgdGlkMCAgdGlkMSAgdGlkMiAgdGlkMyAuLi4KKworICAgICAgQm90aCBwaWQgYW5kIHRpZDAgd2lsbCBtYXAgdG8gdGlkMCwgYXMgdGhlcmUgYXJlIGluZnR0cmFjZS5jLWludGVybmFsCisgICAgICBjYWxscyB0byB0dHJhY2UgdXNpbmcgdGlkMC4KKworICAgMi4gU3RlcCBhbmQgQ29udGludWUKKworICAgU2luY2Ugd2UncmUgaW1wbGVtZW50aW5nIHRoZSAic3RvcCB0aGUgd29ybGQiIG1vZGVsLCBzdWItbW9kZWwKKyAgICJvdGhlciB0aHJlYWRzIHJ1biBkdXJpbmcgc3RlcCIsIHdlIGhhdmUgc29tZSBzdHVmZiB0byBkbzoKKworICAgbyAgVXNlciBzdGVwcyByZXF1aXJlIGNvbnRpbnVpbmcgYWxsIHRocmVhZHMgb3RoZXIgdGhhbiB0aGUKKyAgICAgIG9uZSB0aGUgdXNlciBpcyBzdGVwcGluZzsKKworICAgbyAgSW50ZXJuYWwgZGVidWdnZXIgc3RlcHMgKHN1Y2ggYXMgb3ZlciBhIGJyZWFrcG9pbnQgb3Igd2F0Y2hwb2ludCwKKyAgICAgIGJ1dCBub3Qgb3V0IG9mIGEgbGlicmFyeSBsb2FkIHRodW5rKSByZXF1aXJlIHN0ZXBwaW5nIG9ubHkKKyAgICAgIHRoZSBzZWxlY3RlZCB0aHJlYWQ7IHRoaXMgbWVhbnMgdGhhdCB3ZSBoYXZlIHRvIHJlcG9ydCB0aGUKKyAgICAgIHN0ZXAgZmluaXNoIG9uIHRoYXQgdGhyZWFkLCB3aGljaCBjYW4gbGVhZCB0byBjb21wbGljYXRpb25zOworCisgICBvICBXaGVuIGEgdGhyZWFkIGlzIGNyZWF0ZWQsIGl0IGlzIGNyZWF0ZWQgcnVubmluZywgcmF0aGVyCisgICAgICB0aGFuIHN0b3BwZWQtLXNvIHdlIGhhdmUgdG8gc3RvcCBpdC4KKworICAgVGhlIE9TIGRvZXNuJ3QgZ3VhcmFudGVlIHRoZSBzdG9wcGVkIHRocmVhZCBsaXN0IHdpbGwgYmUgc3RhYmxlLAorICAgbm8gZG9lcyBpdCBndWFyYW50ZWUgd2hlcmUgb24gdGhlIHN0b3BwZWQgdGhyZWFkIGxpc3QgYSB0aHJlYWQKKyAgIHRoYXQgaXMgc2luZ2xlLXN0ZXBwZWQgd2lsbCB3aW5kIHVwOiBpdCdzIHBvc3NpYmxlIHRoYXQgaXQgd2lsbAorICAgYmUgb2ZmIHRoZSBsaXN0IGZvciBhIHdoaWxlLCBpdCdzIHBvc3NpYmxlIHRoZSBzdGVwIHdpbGwgY29tcGxldGUKKyAgIGFuZCBpdCB3aWxsIGJlIHJlLXBvc3RlZCB0byB0aGUgZW5kLi4uCisKKyAgIFRoaXMgbWVhbnMgd2UgaGF2ZSB0byBzY2FuIHRoZSBzdG9wcGVkIHRocmVhZCBsaXN0LCBidWlsZCB1cAorICAgYSB3b3JrLWxpc3QsIGFuZCB0aGVuIHJ1biBkb3duIHRoZSB3b3JrIGxpc3Q7IHdlIGNhbid0IGRvIHRoZQorICAgc3RlcC9jb250aW51ZSBkdXJpbmcgdGhlIHNjYW4uCisKKyAgIDMuIEJ1ZmZlcmluZyBldmVudHMKKworICAgVGhlbiB0aGVyZSdzIHRoZSBpc3N1ZSBvZiB3YWl0aW5nIGZvciBhbiBldmVudC4gIFdlIGRvIHRoaXMgYnkKKyAgIG5vdGljaW5nIGhvdyBtYW55IGV2ZW50cyBhcmUgcmVwb3J0ZWQgYXQgdGhlIGVuZCBvZiBlYWNoIHdhaXQuCisgICBGcm9tIHRoZW4gb24sIHdlICJmYWtlIiBhbGwgcmVzdW1lcyBhbmQgc3RlcHMsIHJldHVybmluZyBpbnN0YW50bHksCisgICBhbmQgZG9uJ3QgZG8gYW5vdGhlciB3YWl0LiAgT25jZSBhbGwgcGVuZGluZyBldmVudHMgYXJlIHJlcG9ydGVkLAorICAgd2UgY2FuIHJlYWxseSByZXN1bWUgYWdhaW4uCisKKyAgIFRvIGtlZXAgdGhpcyBoaWRkZW4sIGFsbCB0aGUgcm91dGluZXMgd2hpY2gga25vdyBhYm91dCB0aWRzIGFuZAorICAgcGlkcyBvciByZWFsIGV2ZW50cyBhbmQgc2ltdWxhdGVkIG9uZXMgYXJlIHN0YXRpYyAoZmlsZS1sb2NhbCkuCisKKyAgIFRoaXMgY29kZSBjYW4gbWFrZSBsb3RzIG9mIGNhbGxzIHRvIHR0cmFjZSwgaW4gcGFydGljdWxhciBpdAorICAgY2FuIHNwaW4gZG93biB0aGUgbGlzdCBvZiB0aHJlYWQgc3RhdGVzIG1vcmUgdGhhbiBvbmNlLiAgSWYgdGhpcworICAgYmVjb21lcyBhIHBlcmZvcm1hbmNlIGhpdCwgdGhlIHNwaW4gY291bGQgYmUgZG9uZSBvbmNlIGFuZCB0aGUKKyAgIHZhcmlvdXMgInRzcCIgYmxvY2tzIHNhdmVkLCBrZWVwaW5nIGFsbCBsYXRlciBzcGlucyBpbiB0aGlzCisgICBwcm9jZXNzLgorCisgICBUaGUgTy9TIGRvZXNuJ3QgcHJvbWlzZSB0byBrZWVwIHRoZSBsaXN0IHN0cmFpZ2h0LCBhbmQgc28gd2UgbXVzdAorICAgcmUtc2NhbiBhIGxvdC4gIEJ5IG9ic2VydmF0aW9uLCBpdCBsb29rcyBsaWtlIGEgc2luZ2xlLXN0ZXAvd2FpdAorICAgcHV0cyB0aGUgc3RlcHBlZCB0aHJlYWQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBidXQgZG9lc24ndCBjaGFuZ2UKKyAgIGl0IG90aGVyd2lzZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLyogVW5jb21tZW50IHRoZXNlIHRvIHR1cm4gb24gdmFyaW91cyBkZWJ1Z2dpbmcgb3V0cHV0ICovCisvKiAjZGVmaW5lIFRIUkVBRF9ERUJVRyAqLworLyogI2RlZmluZSBXQUlUX0JVRkZFUl9ERUJVRyAqLworLyogI2RlZmluZSBQQVJBTk9JQSAqLworCisKKyNkZWZpbmUgSU5GVFRSQUNFX0FMTF9USFJFQURTICgtMSkKKyNkZWZpbmUgSU5GVFRSQUNFX1NURVAgICAgICAgICgxKQorI2RlZmluZSBJTkZUVFJBQ0VfQ09OVElOVUUgICAgKDApCisKKy8qIEZJWDogdGhpcyBpcyB1c2VkIGluIGluZnRhcmcuYy9jaGlsZF93YWl0LCBpbiBhIGhhY2suCisgKi8KK2V4dGVybiBpbnQgbm90X3NhbWVfcmVhbF9waWQ7CisKKy8qIFRoaXMgaXMgdXNlZCB0byBjb3VudCBidWZmZXJlZCBldmVudHMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbW9yZV9ldmVudHNfbGVmdCA9IDA7CisKKy8qIFByb2Nlc3Mgc3RhdGUuCisgKi8KK3R5cGVkZWYgZW51bSBwcm9jZXNzX3N0YXRlX2VudW0geworICAgIFNUT1BQRUQsCisgICAgRkFLRV9TVEVQUElORywKKyAgICBGQUtFX0NPTlRJTlVFLCAgIC8qIEZvciBsYXRlciB1c2UgKi8KKyAgICBSVU5OSU5HLAorICAgIEZPUktJTkcsCisgICAgVkZPUktJTkcKK30gcHJvY2Vzc19zdGF0ZV90OworCitzdGF0aWMgcHJvY2Vzc19zdGF0ZV90IHByb2Nlc3Nfc3RhdGUgPSBTVE9QUEVEOworCisvKiBVc2VyLXNwZWNpZmllZCBzdGVwcGluZyBtb2RhbGl0eS4KKyAqLwordHlwZWRlZiBlbnVtIHN0ZXBwaW5nX21vZGVfZW51bSB7CisgICAgRE9fREVGQVVMVCwgIC8qIC4uLndoaWNoIGlzIGEgY29udGludWUhICovCisgICAgRE9fU1RFUCwKKyAgICBET19DT05USU5VRQorfSBzdGVwcGluZ19tb2RlX3Q7CisgCisvKiBBY3Rpb24gdG8gdGFrZSBvbiBhbiBhdHRhY2gsIGRlcGVuZHMgb24KKyAqIHdoYXQga2luZCAodXNlciBjb21tYW5kLCBmb3JrLCB2Zm9yaykuCisgKgorICogQXQgdGhlIG1vbWVudCwgdGhpcyBpcyBlaXRoZXI6CisgKgorICogbyAgY29udGludWUgd2l0aCBhIFNJR1RSQVAgc2lnbmFsLCBvcgorICoKKyAqIG8gIGxlYXZlIHN0b3BwZWQuCisgKi8KK3R5cGVkZWYgZW51bSBhdHRhY2hfY29udGludWVfZW51bSB7CisgICBET19BVFRBQ0hfQ09OVElOVUUsCisgICBET05UX0FUVEFDSF9DT05USU5VRQorfSBhdHRhY2hfY29udGludWVfdDsKKworLyogVGhpcyBmbGFnIGlzIHRydWUgaWYgd2UgYXJlIGRvaW5nIGEgc3RlcC1vdmVyLWJwdAorICogd2l0aCBidWZmZXJlZCBldmVudHMuICBXZSB3aWxsIGhhdmUgdG8gYmUgc3VyZSB0bworICogcmVwb3J0IHRoZSByaWdodCB0aHJlYWQsIGFzIG90aGVyd2lzZSB0aGUgc3BhZ2hldHRpCisgKiBjb2RlIGluICJpbmZydW4uYy93YWl0X2Zvcl9pbmZlcmlvciIgd2lsbCBnZXQKKyAqIGNvbmZ1c2VkLgorICovCitzdGF0aWMgaW50IGRvaW5nX2Zha2Vfc3RlcCAgPSAwOworc3RhdGljIGx3cGlkX3QgIGZha2Vfc3RlcF90aWQgICAgPSAwOworCisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhyZWFkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSByb3V0aW5lcyBhbmQgdHlwZXMuICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3R5cGVkZWYgCitzdHJ1Y3QgdGhyZWFkX2luZm9fc3RydWN0Cit7CisgICAgaW50CQkJYW1fcHNldWRvOyAgICAgIC8qIFRoaXMgaXMgYSBwc2V1ZG8tdGhyZWFkIGZvciB0aGUgcHJvY2Vzcy4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIHBpZDsgICAgICAgICAgICAvKiBQcm9jZXNzIElEICovCisgICAgbHdwaWRfdCAgICAgICAgICAgICB0aWQ7ICAgICAgICAgICAgLyogVGhyZWFkICBJRCAqLworICAgIGludAkJCWhhbmRsZWQ7ICAgICAgICAvKiAxIGlmIGEgYnVmZmVyZWQgZXZlbnQgd2FzIGhhbmRsZWQuICovCisgICAgaW50CQkJc2VlbjsgICAgICAgICAgIC8qIDEgaWYgdGhpcyB0aHJlYWQgd2FzIHNlZW4gb24gYSB0cmF2ZXJzZS4gKi8KKyAgICBpbnQJCQl0ZXJtaW5hdGVkOyAgICAgLyogMSBpZiB0aHJlYWQgaGFzIHRlcm1pbmF0ZWQuICovCisgICAgaW50CQkJaGF2ZV9zaWduYWw7ICAgIC8qIDEgaWYgc2lnbmFsIHRvIGJlIHNlbnQgKi8KKyAgICBlbnVtIHRhcmdldF9zaWduYWwgIHNpZ25hbF92YWx1ZTsgICAvKiBTaWduYWwgdG8gc2VuZCAqLworICAgIGludAkJCWhhdmVfc3RhcnQ7ICAgICAvKiAxIGlmIGFsdGVybmF0ZSBzdGFydGluZyBhZGRyZXNzICovCisgICAgc3RlcHBpbmdfbW9kZV90ICAgICBzdGVwcGluZ19tb2RlOyAgLyogV2hldGhlciB0byBzdGVwIG9yIGNvbnRpbnVlICovCisgICAgQ09SRV9BRERSICAgICAgICAgICBzdGFydDsgICAgICAgICAgLyogV2hlcmUgdG8gc3RhcnQgKi8KKyAgICBpbnQJCQloYXZlX3N0YXRlOyAgICAgLyogMSBpZiB0aGUgZXZlbnQgc3RhdGUgaGFzIGJlZW4gc2V0ICovCisgICAgdHRzdGF0ZV90ICAgICAgICAgICBsYXN0X3N0b3Bfc3RhdGU7LyogVGhlIG1vc3QgcmVjZW50bHktd2FpdGVkIGV2ZW50IGZvciB0aGlzIHRocmVhZC4gKi8KKyAgICBzdHJ1Y3QgdGhyZWFkX2luZm9fc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICpuZXh0OyAgICAgICAgICAgLyogQWxsIHRocmVhZHMgYXJlIGxpbmtlZCB2aWEgdGhpcyBmaWVsZC4gKi8KKyAgICBzdHJ1Y3QgdGhyZWFkX2luZm9fc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICpuZXh0X3BzZXVkbzsgICAgLyogQWxsIHBzZXVkby10aHJlYWRzIGFyZSBsaW5rZWQgdmlhIHRoaXMgZmllbGQuICovCit9IHRocmVhZF9pbmZvOworCit0eXBlZGVmCitzdHJ1Y3QgdGhyZWFkX2luZm9faGVhZGVyX3N0cnVjdAoreworICAgIGludCAgICAgICAgICBjb3VudDsKKyAgICB0aHJlYWRfaW5mbyAqaGVhZDsKKyAgICB0aHJlYWRfaW5mbyAqaGVhZF9wc2V1ZG87CisgICAgCit9IHRocmVhZF9pbmZvX2hlYWRlcjsKKworc3RhdGljIHRocmVhZF9pbmZvX2hlYWRlciB0aHJlYWRfaGVhZCAgICAgPSB7IDAsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyB0aHJlYWRfaW5mb19oZWFkZXIgZGVsZXRlZF90aHJlYWRzID0geyAwLCBOVUxMLCBOVUxMIH07CisKK3N0YXRpYyBzYXZlZF9yZWFsX3BpZCA9IDA7CisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICBEZWJ1Z2dpbmcgc3VwcG9ydCBmdW5jdGlvbnMgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworQ09SRV9BRERSCitnZXRfcmF3X3BjKCB0dGlkICkKKyAgICBsd3BpZF90IHR0aWQ7Cit7CisgICAgdW5zaWduZWQgbG9uZyBwY192YWw7CisgICAgaW50ICAgICAgb2Zmc2V0OworICAgIGludCAgICAgIHJlczsKKyAKKyAgICBvZmZzZXQgPSByZWdpc3Rlcl9hZGRyKCBQQ19SRUdOVU0sIFVfUkVHU19PRkZTRVQgKTsKKyAgICByZXMgICAgPSByZWFkX2Zyb21fcmVnaXN0ZXJfc2F2ZV9zdGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgdHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmcGNfdmFsLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIHBjX3ZhbCApKTsKKyAgICBpZiggcmVzIDw9IDAgKSB7CisgICAgICAgIHJldHVybiAoQ09SRV9BRERSKSBwY192YWw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gKENPUkVfQUREUikgMDsKKyAgICB9Cit9ICAgICAgICAgICAgICAgICAgIAorCitzdGF0aWMgY2hhciAqCitnZXRfcHJpbnRhYmxlX25hbWVfb2Zfc3RlcHBpbmdfbW9kZSggbW9kZSApCisgICAgc3RlcHBpbmdfbW9kZV90IG1vZGU7Cit7CisgIHN3aXRjaCggbW9kZSApIHsKKyAgICBjYXNlIERPX0RFRkFVTFQ6ICByZXR1cm4gIkRPX0RFRkFVTFQiOworICAgIGNhc2UgRE9fU1RFUDogICAgIHJldHVybiAiRE9fU1RFUCI7CisgICAgY2FzZSBET19DT05USU5VRTogcmV0dXJuICJET19DT05USU5VRSI7CisgICAgZGVmYXVsdDogICAgICAgICAgcmV0dXJuICI/dW5rbm93biBtb2RlPyI7CisgIH0KK30KKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZyBkZXNjcmliaW5nIHRoZQorICogdHRyYWNlIGV2ZW50IGJlaW5nIHJlcG9ydGVkLgorICovCitjaGFyICoKK2dldF9wcmludGFibGVfbmFtZV9vZl90dHJhY2VfZXZlbnQgKGV2ZW50KQorICB0dGV2ZW50c190IGV2ZW50OworeworICAvKiBUaGlzIGVudW1lcmF0aW9uIGlzICJnYXBweSIsIHNvIGRvbid0IHVzZSBhIHRhYmxlLiAqLworICBzd2l0Y2ggKGV2ZW50KSB7CisKKyAgICBjYXNlIFRURVZUX05PTkU6CisgICAgICAgcmV0dXJuICJUVEVWVF9OT05FIjsKKyAgICBjYXNlIFRURVZUX1NJR05BTDoKKyAgICAgICByZXR1cm4gIlRURVZUX1NJR05BTCI7CisgICAgY2FzZSBUVEVWVF9GT1JLOgorICAgICAgIHJldHVybiAiVFRFVlRfRk9SSyI7CisgICAgY2FzZSBUVEVWVF9FWEVDOgorICAgICAgIHJldHVybiAiVFRFVlRfRVhFQyI7CisgICAgY2FzZSBUVEVWVF9FWElUOgorICAgICAgIHJldHVybiAiVFRFVlRfRVhJVCI7CisgICAgY2FzZSBUVEVWVF9WRk9SSzoKKyAgICAgICByZXR1cm4gIlRURVZUX1ZGT1JLIjsKKyAgICBjYXNlIFRURVZUX1NZU0NBTExfUkVUVVJOOgorICAgICAgIHJldHVybiAiVFRFVlRfU1lTQ0FMTF9SRVRVUk4iOworICAgIGNhc2UgVFRFVlRfTFdQX0NSRUFURToKKyAgICAgICByZXR1cm4gIlRURVZUX0xXUF9DUkVBVEUiOworICAgIGNhc2UgVFRFVlRfTFdQX1RFUk1JTkFURToKKyAgICAgICByZXR1cm4gIlRURVZUX0xXUF9URVJNSU5BVEUiOworICAgIGNhc2UgVFRFVlRfTFdQX0VYSVQ6CisgICAgICAgcmV0dXJuICJUVEVWVF9MV1BfRVhJVCI7CisgICAgY2FzZSBUVEVWVF9MV1BfQUJPUlRfU1lTQ0FMTDoKKyAgICAgICByZXR1cm4gIlRURVZUX0xXUF9BQk9SVF9TWVNDQUxMIjsKKyAgICBjYXNlIFRURVZUX1NZU0NBTExfRU5UUlk6CisgICAgICAgcmV0dXJuICJUVEVWVF9TWVNDQUxMX0VOVFJZIjsKKyAgICBjYXNlIFRURVZUX1NZU0NBTExfUkVTVEFSVDoJCisgICAgICAgcmV0dXJuICJUVEVWVF9TWVNDQUxMX1JFU1RBUlQiOworICAgIGRlZmF1bHQgOgorICAgICAgcmV0dXJuICI/bmV3IGV2ZW50PyI7CisgIH0KK30KKworDAorLyogVGhpcyBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZSB0dHJhY2UgcmVxdWVzdCBlbnVtZXJhdGlvbiBpbnRvCisgKiBhIGNoYXJhY3RlciBzdHJpbmcgdGhhdCBpcyBpdHMgcHJpbnRhYmxlIChha2EgImh1bWFuIHJlYWRhYmxlIikKKyAqIG5hbWUuCisgKi8KK2NoYXIgKgorZ2V0X3ByaW50YWJsZV9uYW1lX29mX3R0cmFjZV9yZXF1ZXN0IChyZXF1ZXN0KQorICB0dHJlcV90ICByZXF1ZXN0OworeworICBpZiAoIUlTX1RUUkFDRV9SRVEgKHJlcXVlc3QpKQorICAgIHJldHVybiAiP2JhZCByZXE/IjsKKworICAvKiBUaGlzIGVudW1lcmF0aW9uIGlzICJnYXBweSIsIHNvIGRvbid0IHVzZSBhIHRhYmxlLiAqLworICBzd2l0Y2ggKHJlcXVlc3QpIHsKKyAgICBjYXNlIFRUX1BST0NfU0VUVFJDIDoKKyAgICAgIHJldHVybiAiVFRfUFJPQ19TRVRUUkMiOworICAgIGNhc2UgVFRfUFJPQ19BVFRBQ0ggOgorICAgICAgcmV0dXJuICJUVF9QUk9DX0FUVEFDSCI7CisgICAgY2FzZSBUVF9QUk9DX0RFVEFDSCA6CisgICAgICByZXR1cm4gIlRUX1BST0NfREVUQUNIIjsKKyAgICBjYXNlIFRUX1BST0NfUkRURVhUIDoKKyAgICAgIHJldHVybiAiVFRfUFJPQ19SRFRFWFQiOworICAgIGNhc2UgVFRfUFJPQ19XUlRFWFQgOgorICAgICAgcmV0dXJuICJUVF9QUk9DX1dSVEVYVCI7CisgICAgY2FzZSBUVF9QUk9DX1JEREFUQSA6CisgICAgICByZXR1cm4gIlRUX1BST0NfUkREQVRBIjsKKyAgICBjYXNlIFRUX1BST0NfV1JEQVRBIDoKKyAgICAgIHJldHVybiAiVFRfUFJPQ19XUkRBVEEiOworICAgIGNhc2UgVFRfUFJPQ19TVE9QIDoKKyAgICAgIHJldHVybiAiVFRfUFJPQ19TVE9QIjsKKyAgICBjYXNlIFRUX1BST0NfQ09OVElOVUUgOgorICAgICAgcmV0dXJuICJUVF9QUk9DX0NPTlRJTlVFIjsKKyAgICBjYXNlIFRUX1BST0NfR0VUX1BBVEhOQU1FIDoKKyAgICAgIHJldHVybiAiVFRfUFJPQ19HRVRfUEFUSE5BTUUiOworICAgIGNhc2UgVFRfUFJPQ19HRVRfRVZFTlRfTUFTSyA6CisgICAgICByZXR1cm4gIlRUX1BST0NfR0VUX0VWRU5UX01BU0siOworICAgIGNhc2UgVFRfUFJPQ19TRVRfRVZFTlRfTUFTSyA6CisgICAgICByZXR1cm4gIlRUX1BST0NfU0VUX0VWRU5UX01BU0siOworICAgIGNhc2UgVFRfUFJPQ19HRVRfRklSU1RfTFdQX1NUQVRFIDoKKyAgICAgIHJldHVybiAiVFRfUFJPQ19HRVRfRklSU1RfTFdQX1NUQVRFIjsKKyAgICBjYXNlIFRUX1BST0NfR0VUX05FWFRfTFdQX1NUQVRFIDoKKyAgICAgIHJldHVybiAiVFRfUFJPQ19HRVRfTkVYVF9MV1BfU1RBVEUiOworICAgIGNhc2UgVFRfUFJPQ19FWElUIDoKKyAgICAgIHJldHVybiAiVFRfUFJPQ19FWElUIjsKKyAgICBjYXNlIFRUX1BST0NfR0VUX01QUk9URUNUIDoKKyAgICAgIHJldHVybiAiVFRfUFJPQ19HRVRfTVBST1RFQ1QiOworICAgIGNhc2UgVFRfUFJPQ19TRVRfTVBST1RFQ1QgOgorICAgICAgcmV0dXJuICJUVF9QUk9DX1NFVF9NUFJPVEVDVCI7CisgICAgY2FzZSBUVF9QUk9DX1NFVF9TQ0JNIDoKKyAgICAgIHJldHVybiAiVFRfUFJPQ19TRVRfU0NCTSI7CisgICAgY2FzZSBUVF9MV1BfU1RPUCA6CisgICAgICByZXR1cm4gIlRUX0xXUF9TVE9QIjsKKyAgICBjYXNlIFRUX0xXUF9DT05USU5VRSA6CisgICAgICByZXR1cm4gIlRUX0xXUF9DT05USU5VRSI7CisgICAgY2FzZSBUVF9MV1BfU0lOR0xFIDoKKyAgICAgIHJldHVybiAiVFRfTFdQX1NJTkdMRSI7CisgICAgY2FzZSBUVF9MV1BfUlVSRUdTIDoKKyAgICAgIHJldHVybiAiVFRfTFdQX1JVUkVHUyI7CisgICAgY2FzZSBUVF9MV1BfV1VSRUdTIDoKKyAgICAgIHJldHVybiAiVFRfTFdQX1dVUkVHUyI7CisgICAgY2FzZSBUVF9MV1BfR0VUX0VWRU5UX01BU0sgOgorICAgICAgcmV0dXJuICJUVF9MV1BfR0VUX0VWRU5UX01BU0siOworICAgIGNhc2UgVFRfTFdQX1NFVF9FVkVOVF9NQVNLIDoKKyAgICAgIHJldHVybiAiVFRfTFdQX1NFVF9FVkVOVF9NQVNLIjsKKyAgICBjYXNlIFRUX0xXUF9HRVRfU1RBVEUJOgorICAgICAgcmV0dXJuICJUVF9MV1BfR0VUX1NUQVRFIjsKKyAgICBkZWZhdWx0IDoKKyAgICAgIHJldHVybiAiP25ldyByZXE/IjsKKyAgfQorfQorCisMCisvKiBUaGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlIHByb2Nlc3Mgc3RhdGUgZW51bWVyYXRpb24gaW50bworICogYSBjaGFyYWN0ZXIgc3RyaW5nIHRoYXQgaXMgaXRzIHByaW50YWJsZSAoYWthICJodW1hbiByZWFkYWJsZSIpCisgKiBuYW1lLgorICovCitzdGF0aWMgY2hhciAqCitnZXRfcHJpbnRhYmxlX25hbWVfb2ZfcHJvY2Vzc19zdGF0ZSAocHJvY2Vzc19zdGF0ZSkKKyAgcHJvY2Vzc19zdGF0ZV90ICBwcm9jZXNzX3N0YXRlOworeworICBzd2l0Y2ggKHByb2Nlc3Nfc3RhdGUpIHsKKyAgICBjYXNlIFNUT1BQRUQ6CisgICAgICByZXR1cm4gIlNUT1BQRUQiOworICAgIGNhc2UgRkFLRV9TVEVQUElORzoKKyAgICAgIHJldHVybiAiRkFLRV9TVEVQUElORyI7CisgICAgY2FzZSBSVU5OSU5HOgorICAgICAgcmV0dXJuICJSVU5OSU5HIjsKKyAgICBjYXNlIEZPUktJTkc6CisgICAgICByZXR1cm4gIkZPUktJTkciOworICAgIGNhc2UgVkZPUktJTkc6CisgICAgICByZXR1cm4gIlZGT1JLSU5HIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICI/c29tZSB1bmtub3duIHN0YXRlPyI7CisgIH0KK30KKworLyogU2V0IGEgdHRyYWNlIHRocmVhZCBzdGF0ZSB0byBhIHNhZmUsIGluaXRpYWwgc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkCitjbGVhcl90dHN0YXRlX3QgKHR0cykKKyAgICB0dHN0YXRlX3QgKiAgdHRzOworeworICAgIHR0cy0+dHRzX3BpZCA9IDA7CisgICAgdHRzLT50dHNfbHdwaWQgPSAwOworICAgIHR0cy0+dHRzX3VzZXJfdGlkID0gMDsKKyAgICB0dHMtPnR0c19ldmVudCA9IFRURVZUX05PTkU7Cit9CisKKy8qIENvcHkgdHRyYWNlIHRocmVhZCBzdGF0ZSBUVFNfRlJPTSBpbnRvIFRUU19UTy4KKyAqLworc3RhdGljIHZvaWQKK2NvcHlfdHRzdGF0ZV90ICh0dHNfdG8sIHR0c19mcm9tKQorICAgIHR0c3RhdGVfdCAqICB0dHNfdG87CisgICAgdHRzdGF0ZV90ICogIHR0c19mcm9tOworeworICAgIG1lbWNweSAoKGNoYXIgKikgdHRzX3RvLCAoY2hhciAqKSB0dHNfZnJvbSwgc2l6ZW9mICgqdHRzX3RvKSk7Cit9CisKKy8qIEFyZSB0aGVyZSBhbnkgbGl2ZSB0aHJlYWRzIHdlIGtub3cgYWJvdXQ/CisgKi8KK3N0YXRpYyBpbnQgCithbnlfdGhyZWFkX3JlY29yZHMoKQoreworICAgIHJldHVybiggdGhyZWFkX2hlYWQuY291bnQgPiAwICk7Cit9CisKKy8qIENyZWF0ZSwgZmlsbCBpbiBhbmQgbGluayBpbiBhIHRocmVhZCBkZXNjcmlwdG9yLgorICovCitzdGF0aWMgdGhyZWFkX2luZm8gKgorY3JlYXRlX3RocmVhZF9pbmZvIChwaWQsIHRpZCkKKyAgICBpbnQgICAgIHBpZDsKKyAgICBsd3BpZF90IHRpZDsKK3sKKyAgICB0aHJlYWRfaW5mbyAqICBuZXdfcDsKKyAgICB0aHJlYWRfaW5mbyAqICBwOworICAgIGludCAgdGhyZWFkX2NvdW50X29mX3BpZDsKKworICAgIG5ld19wID0gbWFsbG9jKCBzaXplb2YoIHRocmVhZF9pbmZvICkpOworICAgIG5ld19wLT5waWQgPSBwaWQ7CisgICAgbmV3X3AtPnRpZCA9IHRpZDsKKyAgICBuZXdfcC0+aGF2ZV9zaWduYWwgPSAwOworICAgIG5ld19wLT5oYXZlX3N0YXJ0ICA9IDA7CisgICAgbmV3X3AtPmhhdmVfc3RhdGUgID0gMDsKKyAgICBjbGVhcl90dHN0YXRlX3QoICZuZXdfcC0+bGFzdF9zdG9wX3N0YXRlICk7CisgICAgbmV3X3AtPmFtX3BzZXVkbyAgID0gMDsKKyAgICBuZXdfcC0+aGFuZGxlZCAgICAgPSAwOworICAgIG5ld19wLT5zZWVuICAgICAgICA9IDA7CisgICAgbmV3X3AtPnRlcm1pbmF0ZWQgID0gMDsKKyAgICBuZXdfcC0+bmV4dCAgICAgICAgPSBOVUxMOworICAgIG5ld19wLT5uZXh0X3BzZXVkbyA9IE5VTEw7CisgICAgbmV3X3AtPnN0ZXBwaW5nX21vZGUgPSBET19ERUZBVUxUOworCisgICAgaWYoIDAgPT0gdGhyZWFkX2hlYWQuY291bnQgKSB7CisjaWZkZWYgVEhSRUFEX0RFQlVHCisgICAgICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgICAgICBwcmludGYoICJGaXJzdCB0aHJlYWQsIHBpZCAlZCB0aWQgJWQhXG4iLCBwaWQsIHRpZCApOworI2VuZGlmCisgICAgICAgIHNhdmVkX3JlYWxfcGlkID0gaW5mZXJpb3JfcGlkOworICAgIH0KKyAgICBlbHNlIHsKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgICAgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgICAgIHByaW50ZiggIlN1YnNlcXVlbnQgdGhyZWFkLCBwaWQgJWQgdGlkICVkXG4iLCBwaWQsIHRpZCApOworI2VuZGlmCisgICAgfQorCisgICAgLyogQW5vdGhlciBkYXksIGFub3RoZXIgdGhyZWFkLi4uCisgICAgICovCisgICAgdGhyZWFkX2hlYWQuY291bnQrKzsKKworICAgIC8qIFRoZSBuZXcgdGhyZWFkIGFsd2F5cyBnb2VzIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LgorICAgICAqLworICAgIG5ld19wLT5uZXh0ICAgICAgID0gdGhyZWFkX2hlYWQuaGVhZDsKKyAgICB0aHJlYWRfaGVhZC5oZWFkICA9IG5ld19wOworCisgICAgLyogSXMgdGhpcyB0aGUgInBzZXVkbyIgdGhyZWFkIG9mIGEgcHJvY2Vzcz8gIEl0IGlzIGlmIHRoZXJlJ3MKKyAgICAgKiBubyBvdGhlciB0aHJlYWQgZm9yIHRoaXMgcHJvY2VzcyBvbiB0aGUgbGlzdC4gIChOb3RlIHRoYXQgdGhpcworICAgICAqIGFjY29tb2RhdGVzIG11bHRpcGxlIHByb2Nlc3Nlcywgc3VjaCBhcyB3ZSBzZWUgZXZlbiBmb3Igc2ltcGxlCisgICAgICogY2FzZXMgbGlrZSBmb3JraW5nICJub24tdGhyZWFkZWQiIHByb2dyYW1zLikKKyAgICAgKi8KKyAgICBwID0gdGhyZWFkX2hlYWQuaGVhZDsKKyAgICB0aHJlYWRfY291bnRfb2ZfcGlkID0gMDsKKyAgICB3aGlsZSAocCkKKyAgICAgIHsKKyAgICAgICAgaWYgKHAtPnBpZCA9PSBuZXdfcC0+cGlkKQorICAgICAgICAgIHRocmVhZF9jb3VudF9vZl9waWQrKzsKKyAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICB9CisKKyAgICAvKiBEaWQgd2Ugc2VlIGFueSBvdGhlciB0aHJlYWRzIGZvciB0aGlzIHBpZD8gIChSZWNhbGwgdGhhdCB3ZSBqdXN0CisgICAgICogYWRkZWQgdGhpcyB0aHJlYWQgdG8gdGhlIGxpc3QuLi4pCisgICAgICovCisgICAgaWYgKHRocmVhZF9jb3VudF9vZl9waWQgPT0gMSkKKyAgICAgIHsKKyAgICAgICAgbmV3X3AtPmFtX3BzZXVkbyAgICAgICAgPSAxOworICAgICAgICBuZXdfcC0+bmV4dF9wc2V1ZG8gICAgICA9IHRocmVhZF9oZWFkLmhlYWRfcHNldWRvOworICAgICAgICB0aHJlYWRfaGVhZC5oZWFkX3BzZXVkbyA9IG5ld19wOworICAgICAgfQorICAgIAorICAgIHJldHVybiBuZXdfcDsKK30KKworLyogR2V0IHJpZCBvZiBvdXIgdGhyZWFkIGluZm8uCisgKi8KK3N0YXRpYyB2b2lkCitjbGVhcl90aHJlYWRfaW5mbyAoKQoreworICAgIHRocmVhZF9pbmZvICpwOworICAgIHRocmVhZF9pbmZvICpxOworCisjaWZkZWYgVEhSRUFEX0RFQlVHCisgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgcHJpbnRmKCAiQ2xlYXJpbmcgYWxsIHRocmVhZCBpbmZvXG4iICk7CisjZW5kaWYKKworICAgIHAgPSB0aHJlYWRfaGVhZC5oZWFkOworICAgIHdoaWxlKCBwICkgeworICAgICAgICBxID0gcDsKKyAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgICAgIGZyZWUoIHEgKTsKKyAgICB9CisKKyAgICB0aHJlYWRfaGVhZC5oZWFkICAgICAgICA9IE5VTEw7CisgICAgdGhyZWFkX2hlYWQuaGVhZF9wc2V1ZG8gPSBOVUxMOworICAgIHRocmVhZF9oZWFkLmNvdW50ICAgICAgID0gMDsKKworICAgIHAgPSBkZWxldGVkX3RocmVhZHMuaGVhZDsKKyAgICB3aGlsZSggcCApIHsKKyAgICAgICAgcSA9IHA7CisgICAgICAgIHAgPSBwLT5uZXh0OworICAgICAgICBmcmVlKCBxICk7CisgICAgfQorCisgICAgZGVsZXRlZF90aHJlYWRzLmhlYWQgICAgICAgID0gTlVMTDsKKyAgICBkZWxldGVkX3RocmVhZHMuaGVhZF9wc2V1ZG8gPSBOVUxMOworICAgIGRlbGV0ZWRfdGhyZWFkcy5jb3VudCAgICAgICA9IDA7CisKKyAgICAvKiBObyB0aHJlYWRzLCBzbyBjYW4ndCBoYXZlIHBlbmRpbmcgZXZlbnRzLgorICAgICAqLworICAgIG1vcmVfZXZlbnRzX2xlZnQgPSAwOyAgIAorfQorCisvKiBHaXZlbiBhIHRpZCwgZmluZCB0aGUgdGhyZWFkIGJsb2NrIGZvciBpdC4KKyAqLworc3RhdGljIHRocmVhZF9pbmZvICoKK2ZpbmRfdGhyZWFkX2luZm8gKHRpZCkKKyAgICBsd3BpZF90IHRpZDsKK3sKKyAgICB0aHJlYWRfaW5mbyAqcDsKKworICAgIGZvciggcCA9IHRocmVhZF9oZWFkLmhlYWQ7IHA7IHAgPSBwLT5uZXh0ICkgIHsKKyAgICAgICBpZiggcC0+dGlkID09IHRpZCApIHsKKyAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgfQorICAgIH0KKworICAgIGZvciggcCA9IGRlbGV0ZWRfdGhyZWFkcy5oZWFkOyBwOyBwID0gcC0+bmV4dCApICB7CisgICAgICAgaWYoIHAtPnRpZCA9PSB0aWQgKSB7CisgICAgICAgICAgIHJldHVybiBwOworICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIE5VTEw7ICAKK30KKworLyogRm9yIGFueSBidXQgdGhlIHBzZXVkbyB0aHJlYWQsIHRoaXMgbWFwcyB0byB0aGUKKyAqIHRocmVhZCBJRC4gIEZvciB0aGUgcHNldWRvIHRocmVhZCwgaWYgeW91IHBhc3MgZWl0aGVyCisgKiB0aGUgdGhyZWFkIGlkIG9yIHRoZSBQSUQsIHlvdSBnZXQgdGhlIHBzZXVkbyB0aHJlYWQgSUQuCisgKgorICogV2UgaGF2ZSB0byBiZSBwcmVwYXJlZCBmb3IgY29yZSBnZGIgdG8gYXNrIGFib3V0CisgKiBkZWxldGVkIHRocmVhZHMuICBXZSBkbyB0aGUgbWFwLCBidXQgd2UgZG9uJ3QgbGlrZSBpdC4KKyAqLworc3RhdGljIGx3cGlkX3QKK21hcF9mcm9tX2dkYl90aWQoIGdkYl90aWQgKQorICAgIGx3cGlkX3QgZ2RiX3RpZDsKK3sKKyAgICB0aHJlYWRfaW5mbyAqcDsKKworICAgIC8qIEZpcnN0IGFzc3VtZSBnZGJfdGlkIHJlYWxseSBpcyBhIHRpZCwgYW5kIHRyeSB0byBmaW5kIGEKKyAgICAgKiBtYXRjaGluZyBlbnRyeSBvbiB0aGUgdGhyZWFkcyBsaXN0LgorICAgICAqLworICAgIGZvciggcCA9IHRocmVhZF9oZWFkLmhlYWQ7IHA7IHAgPSBwLT5uZXh0ICkgIHsKKyAgICAgICAgaWYoIHAtPnRpZCA9PSBnZGJfdGlkICkKKyAgICAgICAgICAgIHJldHVybiBnZGJfdGlkOworICAgIH0KKworICAgIC8qIEl0IGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgdGlkOyBwZXJoYXBzIGl0J3MgcmVhbGx5IGEgcGlkPworICAgICAqIFRyeSB0byBmaW5kIGEgInBzZXVkbyIgdGhyZWFkIGVudHJ5IG9uIHRoZSB0aHJlYWRzIGxpc3QuCisgICAgICovCisgICAgZm9yIChwID0gdGhyZWFkX2hlYWQuaGVhZF9wc2V1ZG87IHAgIT0gTlVMTDsgcCA9IHAtPm5leHRfcHNldWRvKQorICAgICAgeworICAgICAgICBpZiAocC0+cGlkID09IGdkYl90aWQpCisgICAgICAgICAgcmV0dXJuIHAtPnRpZDsKKyAgICAgIH0KKworICAgIC8qIFBlcmhhcHMgaXQncyB0aGUgdGlkIG9mIGEgZGVsZXRlZCB0aHJlYWQgd2UgbWF5IHN0aWxsCisgICAgICogaGF2ZSBzb21lIGtub3dsZWRnZSBvZj8KKyAgICAgKi8KKyAgICBmb3IoIHAgPSBkZWxldGVkX3RocmVhZHMuaGVhZDsgcDsgcCA9IHAtPiBuZXh0ICkgeworICAgICAgICBpZiggcC0+dGlkID09IGdkYl90aWQgKQorICAgICAgICAgICAgcmV0dXJuIGdkYl90aWQ7CisgICAgfQorCisgICAgLyogT3IgcGVyaGFwcyBpdCdzIHRoZSBwaWQgb2YgYSBkZWxldGVkIHByb2Nlc3Mgd2UgbWF5IHN0aWxsCisgICAgICogaGF2ZSBrbm93bGVkZ2Ugb2Y/CisgICAgICovCisgICAgZm9yIChwID0gZGVsZXRlZF90aHJlYWRzLmhlYWRfcHNldWRvOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0X3BzZXVkbykKKyAgICAgIHsKKyAgICAgICAgaWYgKHAtPnBpZCA9PSBnZGJfdGlkKQorICAgICAgICAgIHJldHVybiBwLT50aWQ7CisgICAgICB9CisKKyAgICByZXR1cm4gMDsgIC8qIEVycm9yPyAqLworfQorCisvKiBNYXAgdGhlIG90aGVyIHdheTogZnJvbSBhIHJlYWwgdGlkIHRvIHRoZQorICogInBpZCIga25vd24gYnkgY29yZSBnZGIuICBUaGlzIHRpZCBtYXkgYmUKKyAqIGZvciBhIHRocmVhZCB0aGF0IGp1c3QgZ290IGRlbGV0ZWQsIHNvIHdlCisgKiBhbHNvIG5lZWQgdG8gY29uc2lkZXIgZGVsZXRlZCB0aHJlYWRzLgorICovCitzdGF0aWMgbHdwaWRfdAorbWFwX3RvX2dkYl90aWQoIHJlYWxfdGlkICkKKyAgICBsd3BpZF90IHJlYWxfdGlkOworeworICAgIHRocmVhZF9pbmZvICpwOworCisgICAgZm9yKCBwID0gdGhyZWFkX2hlYWQuaGVhZDsgcDsgcCA9IHAtPm5leHQgKSAgeworICAgICAgICBpZiggcC0+dGlkID09IHJlYWxfdGlkICkgeworICAgICAgICAgICAgaWYoIHAtPmFtX3BzZXVkbyApCisgICAgICAgICAgICAgICAgcmV0dXJuIHAtPnBpZDsKKyAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfdGlkOworICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoIHAgPSBkZWxldGVkX3RocmVhZHMuaGVhZDsgcDsgcCA9IHAtPiBuZXh0ICkgeworICAgICAgICBpZiggcC0+dGlkID09IHJlYWxfdGlkICkKKyAgICAgICAgICAgIGlmKCBwLT5hbV9wc2V1ZG8gKQorICAgICAgICAgICAgICAgIHJldHVybiBwLT5waWQ7ICAvKiBFcnJvcj8gKi8KKyAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfdGlkOworICAgIH0KKworICAgIHJldHVybiAwOyAgLyogRXJyb3I/ICBOZXZlciBoZWFyZCBvZiB0aGlzIHRocmVhZCEgKi8KK30KKworLyogRG8gYW55IHRocmVhZHMgaGF2ZSBzYXZlZCBzaWduYWxzPworICovCitzdGF0aWMgaW50IAorc2F2ZWRfc2lnbmFsc19leGlzdCAoKQoreworICAgIHRocmVhZF9pbmZvICpwOworICAgCisgICAgZm9yKCBwID0gdGhyZWFkX2hlYWQuaGVhZDsgcDsgcCA9IHAtPm5leHQgKSAgeworICAgICAgIGlmKCBwLT5oYXZlX3NpZ25hbCApIHsKKyAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKiBJcyB0aGlzIHRoZSB0aWQgZm9yIHRoZSB6ZXJvLXRoIHRocmVhZD8KKyAqLworc3RhdGljIGludCAKK2lzX3BzZXVkb190aHJlYWQgKHRpZCkKKyAgICBsd3BpZF90IHRpZDsKK3sKKyAgICB0aHJlYWRfaW5mbyAqcCA9IGZpbmRfdGhyZWFkX2luZm8oIHRpZCApOworICAgIGlmKCBOVUxMID09IHAgfHwgcC0+dGVybWluYXRlZCApCisgICAgICAgIHJldHVybiAwOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHAtPmFtX3BzZXVkbzsKK30KKworLyogSXMgdGhpcyB0aHJlYWQgdGVybWluYXRlZD8KKyAqLworc3RhdGljIGludCAKK2lzX3Rlcm1pbmF0ZWQgKHRpZCkKKyAgICBsd3BpZF90IHRpZDsKK3sKKyAgICB0aHJlYWRfaW5mbyAqcCA9IGZpbmRfdGhyZWFkX2luZm8oIHRpZCApOworCisgICAgaWYoIE5VTEwgIT0gcCApCisgICAgICAgIHJldHVybiBwLT50ZXJtaW5hdGVkOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIElzIHRoaXMgcGlkIGEgcmVhbCBQSUQgb3IgYSBUSUQ/CisgKi8KK3N0YXRpYyBpbnQgCitpc19wcm9jZXNzX2lkIChwaWQpCisgIGludCAgcGlkOworeworICBsd3BpZF90ICB0aWQ7CisgIHRocmVhZF9pbmZvICogIHRpbmZvOworICBwaWRfdCAgdGhpc19waWQ7CisgIGludCAgdGhpc19waWRfY291bnQ7CisKKyAgLyogV2hhdCBkb2VzIFBJRCByZWFsbHkgcmVwcmVzZW50PworICAgKi8KKyAgdGlkID0gbWFwX2Zyb21fZ2RiX3RpZCAocGlkKTsKKyAgaWYgKHRpZCA8PSAwKQorICAgIHJldHVybiAwOyAvKiBBY3R1YWxseSwgaXMgcHJvYmFibHkgYW4gZXJyb3IuLi4gKi8KKworICB0aW5mbyA9IGZpbmRfdGhyZWFkX2luZm8gKHRpZCk7CisKKyAgLyogRG9lcyBpdCBhcHBlYXIgdG8gYmUgYSB0cnVlIHRocmVhZD8KKyAgICovCisgIGlmICghIHRpbmZvLT5hbV9wc2V1ZG8pCisgICAgcmV0dXJuIDA7CisKKyAgLyogRWxzZSwgaXQgbG9va3MgbGlrZSBpdCBtYXkgYmUgYSBwcm9jZXNzLiAgU2VlIGlmIHRoZXJlJ3MgYW55IG90aGVyCisgICAqIHRocmVhZHMgd2l0aCB0aGUgc2FtZSBwcm9jZXNzIElELCB0aG91Z2guICBJZiB0aGVyZSBhcmUsIHRoZW4gVElECisgICAqIGp1c3QgaGFwcGVucyB0byBiZSB0aGUgZmlyc3QgdGhyZWFkIG9mIHNldmVyYWwgZm9yIHRoaXMgcHJvY2Vzcy4KKyAgICovCisgIHRoaXNfcGlkID0gdGluZm8tPnBpZDsKKyAgdGhpc19waWRfY291bnQgPSAwOworICBmb3IgKHRpbmZvID0gdGhyZWFkX2hlYWQuaGVhZDsgdGluZm87IHRpbmZvID0gdGluZm8tPm5leHQpCisgICAgeworICAgICAgaWYgKHRpbmZvLT5waWQgPT0gdGhpc19waWQpCisgICAgICAgIHRoaXNfcGlkX2NvdW50Kys7CisgICAgfQorCisgIHJldHVybiAodGhpc19waWRfY291bnQgPT0gMSk7Cit9CisKKworLyogQWRkIGEgdGhyZWFkIHRvIG91ciBpbmZvLiAgUHJldmVudCBkdXBsaWNhdGUgZW50cmllcy4KKyAqLworc3RhdGljIHRocmVhZF9pbmZvICoKK2FkZF90dGhyZWFkIChwaWQsIHRpZCkKKyAgICBpbnQgICAgIHBpZDsKKyAgICBsd3BpZF90IHRpZDsKK3sKKyAgICB0aHJlYWRfaW5mbyAqcDsKKworICAgIHAgPSBmaW5kX3RocmVhZF9pbmZvKCB0aWQgKTsKKyAgICBpZiggTlVMTCA9PSBwICkKKyAgICAgICAgcCA9IGNyZWF0ZV90aHJlYWRfaW5mbyggcGlkLCB0aWQgKTsKKworICAgIHJldHVybiBwOworfQorCisvKiBOb3RpY2UgdGhhdCBhIHRocmVhZCB3YXMgZGVsZXRlZC4KKyAqLworc3RhdGljIHZvaWQKK2RlbF90dGhyZWFkICh0aWQpCisgICAgbHdwaWRfdCB0aWQ7Cit7CisgICAgdGhyZWFkX2luZm8gKnA7CisgICAgdGhyZWFkX2luZm8gKmNoYXNlOworCisgICAgaWYoIHRocmVhZF9oZWFkLmNvdW50IDw9IDAgKSB7CisgICAgICAgIGVycm9yKCAiSW50ZXJuYWwgZXJyb3IgaW4gdGhyZWFkIGRhdGFiYXNlLiIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNoYXNlID0gTlVMTDsKKyAgICBmb3IoIHAgPSB0aHJlYWRfaGVhZC5oZWFkOyBwOyBwID0gcC0+bmV4dCApICB7CisgICAgICAgaWYoIHAtPnRpZCA9PSB0aWQgKSB7CisKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgICAgICAgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgICAgICAgIHByaW50ZiggIkRlbGV0ZSBoZXJlOiAlZCBcbiIsIHRpZCApOworI2VuZGlmCisKKyAgICAgICAgICAgaWYoIHAtPmFtX3BzZXVkbyApIHsKKyAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgKiBEZWxldGluZyBhIG1haW4gdGhyZWFkIGlzIG9rIGlmIHdlJ3JlIGRvaW5nCisgICAgICAgICAgICAgICAgKiBhIHBhcmVudC1mb2xsb3cgb24gYSBjaGlsZDsgdGhpcyBpcyBvZGQgYnV0CisgICAgICAgICAgICAgICAgKiBub3Qgd3JvbmcuICBJdCBhcHBhcmVudGx5IF9kb2Vzbid0XyBoYXBwZW4KKyAgICAgICAgICAgICAgICAqIG9uIHRoZSBjaGlsZC1mb2xsb3csIGFzIHdlIGRvbid0IGp1c3QgZGVsZXRlCisgICAgICAgICAgICAgICAgKiB0aGUgcHNldWRvIHdoaWxlIGtlZXBpbmcgdGhlIHJlc3Qgb2YgdGhlCisgICAgICAgICAgICAgICAgKiB0aHJlYWRzIGFyb3VuZC0taW5zdGVhZCwgd2UgY2xlYXIgb3V0IHRoZSB3aG9sZQorICAgICAgICAgICAgICAgICogdGhyZWFkIGxpc3QgYXQgb25jZS4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgdGhyZWFkX2luZm8gKnE7CisgICAgICAgICAgICAgICB0aHJlYWRfaW5mbyAqcV9jaGFzZTsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgcV9jaGFzZSA9IE5VTEw7CisgICAgICAgICAgICAgICBmb3IoIHEgPSB0aHJlYWRfaGVhZC5oZWFkX3BzZXVkbzsgcTsgcSA9IHEgLT4gbmV4dCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHEgPT0gcCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBmcm9tIHBzZXVkbyBsaXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcV9jaGFzZSA9PSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfaGVhZC5oZWFkX3BzZXVkbyA9IHAtPm5leHRfcHNldWRvOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFfY2hhc2UtPiBuZXh0ID0gcC0+bmV4dF9wc2V1ZG87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcV9jaGFzZSA9IHE7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICAgICAgCisgICAgICAgICAgIC8qIFJlbW92ZSBmcm9tIGxpdmUgbGlzdC4KKyAgICAgICAgICAgICovCisgICAgICAgICAgIHRocmVhZF9oZWFkLmNvdW50LS07CisKKyAgICAgICAgICAgaWYoIE5VTEwgPT0gY2hhc2UgKQorICAgICAgICAgICAgICAgdGhyZWFkX2hlYWQuaGVhZCA9IHAtPm5leHQ7CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIGNoYXNlLT5uZXh0ICAgICAgPSBwLT5uZXh0OworCisgICAgICAgICAgIC8qIEFkZCB0byBkZWxldGVkIHRocmVhZCBsaXN0LgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgcC0+bmV4dCA9IGRlbGV0ZWRfdGhyZWFkcy5oZWFkOworICAgICAgICAgICBkZWxldGVkX3RocmVhZHMuaGVhZCA9IHA7CisgICAgICAgICAgIGRlbGV0ZWRfdGhyZWFkcy5jb3VudCsrOworICAgICAgICAgICBpZiggcC0+YW1fcHNldWRvICkgeworICAgICAgICAgICAgICAgcC0+bmV4dF9wc2V1ZG8gICAgICAgICAgICAgID0gZGVsZXRlZF90aHJlYWRzLmhlYWRfcHNldWRvOworICAgICAgICAgICAgICAgZGVsZXRlZF90aHJlYWRzLmhlYWRfcHNldWRvID0gcDsKKyAgICAgICAgICAgfQorICAgICAgICAgICBwLT50ZXJtaW5hdGVkID0gMTsKKyAgICAgICAgICAgCisgICAgICAgICAgIHJldHVybjsKKyAgICAgICB9CisKKyAgICAgICBlbHNlCisgICAgICAgICAgIGNoYXNlID0gcDsKKyAgICB9Cit9CisKKy8qIEdldCB0aGUgcGlkIGZvciB0aGlzIHRpZC4gKEhhcyB0byBiZSBhIHJlYWwgVElEISkuCisgKi8KK3N0YXRpYyBpbnQKK2dldF9waWRfZm9yICh0aWQpCisgICAgbHdwaWRfdCB0aWQ7Cit7CisgICAgdGhyZWFkX2luZm8gKnA7CisKKyAgICBmb3IoIHAgPSB0aHJlYWRfaGVhZC5oZWFkOyBwOyBwID0gcC0+bmV4dCApIHsKKyAgICAgICAgaWYoIHAtPnRpZCA9PSB0aWQgKSB7CisgICAgICAgICAgICByZXR1cm4gcC0+cGlkOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKCBwID0gZGVsZXRlZF90aHJlYWRzLmhlYWQ7IHA7IHAgPSBwLT5uZXh0ICkgeworICAgICAgICBpZiggcC0+dGlkID09IHRpZCApIHsKKyAgICAgICAgICAgIHJldHVybiBwLT5waWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIE5vdGUgdGhhdCB0aGlzIHRocmVhZCdzIGN1cnJlbnQgZXZlbnQgaGFzIGJlZW4gaGFuZGxlZC4KKyAqLworc3RhdGljIHZvaWQKK3NldF9oYW5kbGVkKCBwaWQsIHRpZCApCisgICAgaW50ICAgICBwaWQ7CisgICAgbHdwaWRfdCB0aWQ7Cit7CisgICAgdGhyZWFkX2luZm8gKnA7CisgICAgCisgICAgcCA9IGZpbmRfdGhyZWFkX2luZm8oIHRpZCApOworICAgIGlmKCBOVUxMID09IHAgKQorICAgICAgICBwID0gYWRkX3R0aHJlYWQoIHBpZCwgdGlkICk7CisKKyAgICBwLT5oYW5kbGVkID0gMTsKK30KKworLyogV2FzIHRoaXMgdGhyZWFkJ3MgY3VycmVudCBldmVudCBoYW5kbGVkPworICovCitzdGF0aWMgaW50IAord2FzX2hhbmRsZWQoIHRpZCApCisgICAgbHdwaWRfdCB0aWQ7Cit7CisgICAgdGhyZWFkX2luZm8gKnA7CisgICAgCisgICAgcCA9IGZpbmRfdGhyZWFkX2luZm8oIHRpZCApOworICAgIGlmKCBOVUxMICE9IHAgKQorICAgICAgICByZXR1cm4gcC0+aGFuZGxlZDsKKworICAgIHJldHVybiAwOyAgLyogTmV3IHRocmVhZHMgaGF2ZSBub3QgYmVlbiBoYW5kbGVkICovCit9CisKKy8qIFNldCB0aGlzIHRocmVhZCB0byB1bmhhbmRsZWQuCisgKi8KK3N0YXRpYyB2b2lkCitjbGVhcl9oYW5kbGVkKCB0aWQgKQorICBsd3BpZF90ICB0aWQ7Cit7CisgIHRocmVhZF9pbmZvICogIHA7CisgICAgCisjaWZkZWYgV0FJVF9CVUZGRVJfREVCVUcKKyAgICBpZiggZGVidWdfb24gKQorICAgICAgICBwcmludGYoICJjbGVhcl9oYW5kbGVkICVkXG4iLCAoaW50KSB0aWQgKTsKKyNlbmRpZgorCisgIHAgPSBmaW5kX3RocmVhZF9pbmZvICh0aWQpOworICBpZiAocCA9PSBOVUxMKQorICAgIGVycm9yICgiSW50ZXJuYWwgZXJyb3I6IE5vIHRocmVhZCBzdGF0ZSB0byBjbGVhcj8iKTsKKworICBwLT5oYW5kbGVkID0gMDsKK30KKworLyogU2V0IGFsbCB0aHJlYWRzIHRvIHVuaGFuZGxlZC4KKyAqLworc3RhdGljIHZvaWQKK2NsZWFyX2FsbF9oYW5kbGVkICgpCit7CisgICAgdGhyZWFkX2luZm8gKnA7CisKKyNpZmRlZiBXQUlUX0JVRkZFUl9ERUJVRworICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgIHByaW50ZiggImNsZWFyX2FsbF9oYW5kbGVkXG4iICk7CisjZW5kaWYKKworICAgIGZvciggcCA9IHRocmVhZF9oZWFkLmhlYWQ7IHA7IHAgPSBwLT5uZXh0ICkgeworICAgICAgICBwLT5oYW5kbGVkID0gMDsKKyAgICB9CisKKyAgICBmb3IoIHAgPSBkZWxldGVkX3RocmVhZHMuaGVhZDsgcDsgcCA9IHAtPm5leHQgKSB7CisgICAgICAgIHAtPmhhbmRsZWQgPSAwOworICAgIH0KK30KKworLyogU2V0IHRoaXMgdGhyZWFkIHRvIGRlZmF1bHQgc3RlcHBpbmcgbW9kZS4KKyAqLworc3RhdGljIHZvaWQKK2NsZWFyX3N0ZXBwaW5nX21vZGUoIHRpZCApCisgIGx3cGlkX3QgIHRpZDsKK3sKKyAgdGhyZWFkX2luZm8gKiAgcDsKKyAgICAKKyNpZmRlZiBXQUlUX0JVRkZFUl9ERUJVRworICBpZiggZGVidWdfb24gKQorICAgICAgIHByaW50ZiggImNsZWFyX3N0ZXBwaW5nX21vZGUgJWRcbiIsIChpbnQpIHRpZCApOworI2VuZGlmCisKKyAgcCA9IGZpbmRfdGhyZWFkX2luZm8gKHRpZCk7CisgIGlmIChwID09IE5VTEwpCisgICAgZXJyb3IgKCJJbnRlcm5hbCBlcnJvcjogTm8gdGhyZWFkIHN0YXRlIHRvIGNsZWFyPyIpOworCisgIHAtPnN0ZXBwaW5nX21vZGUgPSBET19ERUZBVUxUOworfQorCisvKiBTZXQgYWxsIHRocmVhZHMgdG8gZG8gZGVmYXVsdCBjb250aW51ZSBvbiByZXN1bWUuCisgKi8KK3N0YXRpYyB2b2lkCitjbGVhcl9hbGxfc3RlcHBpbmdfbW9kZSAoKQoreworICAgIHRocmVhZF9pbmZvICpwOworCisjaWZkZWYgV0FJVF9CVUZGRVJfREVCVUcKKyAgICBpZiggZGVidWdfb24gKQorICAgICAgICBwcmludGYoICJjbGVhcl9hbGxfc3RlcHBpbmdfbW9kZVxuIiApOworI2VuZGlmCisKKyAgICBmb3IoIHAgPSB0aHJlYWRfaGVhZC5oZWFkOyBwOyBwID0gcC0+bmV4dCApIHsKKyAgICAgICAgcC0+c3RlcHBpbmdfbW9kZSA9IERPX0RFRkFVTFQ7CisgICAgfQorCisgICAgZm9yKCBwID0gZGVsZXRlZF90aHJlYWRzLmhlYWQ7IHA7IHAgPSBwLT5uZXh0ICkgeworICAgICAgICBwLT5zdGVwcGluZ19tb2RlID0gRE9fREVGQVVMVDsKKyAgICB9Cit9CisKKy8qIFNldCBhbGwgdGhyZWFkcyB0byB1bnNlZW4gb24gdGhpcyBwYXNzLgorICovICAgIAorc3RhdGljIHZvaWQKK3NldF9hbGxfdW5zZWVuICgpCit7CisgICAgdGhyZWFkX2luZm8gKnA7CisKKyAgICBmb3IoIHAgPSB0aHJlYWRfaGVhZC5oZWFkOyBwOyBwID0gcC0+bmV4dCApIHsKKyAgICAgICAgcC0+c2VlbiA9IDA7CisgICAgfQorfQorCisjaWYgKGRlZmluZWQoIFRIUkVBRF9ERUJVRyApIHx8IGRlZmluZWQoIFBBUkFOT0lBICkpCisvKiBkZWJ1Z2dpbmcgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQKK3ByaW50X3R0aHJlYWQgKHApCisgICAgdGhyZWFkX2luZm8gKiAgcDsKK3sKKyAgICBwcmludGYoICIgVGhyZWFkIHBpZCAlZCwgdGlkICVkIiwgcC0+cGlkLCBwLT50aWQgKTsKKyAgICBpZiggcC0+aGF2ZV9zdGF0ZSApIAorICAgICAgICBwcmludGYoICIsIGV2ZW50IGlzICVzIiwKKyAgICAgICAgICAgIGdldF9wcmludGFibGVfbmFtZV9vZl90dHJhY2VfZXZlbnQoIHAtPmxhc3Rfc3RvcF9zdGF0ZS50dHNfZXZlbnQgKSk7CisgICAgICAgICAgICAKKyAgICBpZiggcC0+YW1fcHNldWRvICkKKyAgICAgICAgcHJpbnRmKCAiLCBwc2V1ZG8gdGhyZWFkIiApOworICAgICAgICAKKyAgICBpZiggcC0+aGF2ZV9zaWduYWwgKQorICAgICAgICBwcmludGYoICIsIGhhdmUgc2lnbmFsIDB4JXgiLCBwLT5zaWduYWxfdmFsdWUgKTsKKyAgICAgICAgCisgICAgaWYoIHAtPmhhdmVfc3RhcnQgKQorICAgICAgICBwcmludGYoICIsIGhhdmUgc3RhcnQgYXQgMHgleCIsIHAtPnN0YXJ0ICk7CisgICAgICAgIAorICAgIHByaW50ZiggIiwgc3RlcCBpcyAlcyIsIGdldF9wcmludGFibGVfbmFtZV9vZl9zdGVwcGluZ19tb2RlKCBwLT5zdGVwcGluZ19tb2RlICkpOworICAgICAgICAKKyAgICBpZiggcC0+aGFuZGxlZCApCisgICAgICAgIHByaW50ZiggIiwgaGFuZGxlZCIgKTsKKyAgICBlbHNlCisgICAgICAgIHByaW50ZiggIiwgbm90IGhhbmRsZWQiICk7CisgICAgICAgIAorICAgIGlmKCBwLT5zZWVuICkKKyAgICAgICAgcHJpbnRmKCAiLCBzZWVuIiApOworICAgIGVsc2UKKyAgICAgICAgcHJpbnRmKCAiLCBub3Qgc2VlbiIgKTsKKworICAgIHByaW50ZiggIlxuIiApOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfdHRocmVhZHMgKCkKK3sKKyAgICB0aHJlYWRfaW5mbyAqcDsKKworICAgIGlmKCB0aHJlYWRfaGVhZC5jb3VudCA9PSAwICkKKyAgICAgICAgcHJpbnRmKCAiVGhyZWFkIGxpc3QgaXMgZW1wdHlcbiIgKTsKKyAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCAiVGhyZWFkIGxpc3QgaGFzICIgKTsKKyAgICAgICAgaWYoIHRocmVhZF9oZWFkLmNvdW50ID09IDEgKQorICAgICAgICAgICAgcHJpbnRmKCAiMSBlbnRyeTpcbiIgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKCAiJWQgZW50cmllczpcbiIsIHRocmVhZF9oZWFkLmNvdW50ICk7CisgICAgICAgIGZvciggcCA9IHRocmVhZF9oZWFkLmhlYWQ7IHA7IHAgPSBwLT5uZXh0ICkgeworICAgICAgICAgICAgcHJpbnRfdHRocmVhZCAocCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggZGVsZXRlZF90aHJlYWRzLmNvdW50ID09IDAgKQorICAgICAgICBwcmludGYoICJEZWxldGVkIHRocmVhZCBsaXN0IGlzIGVtcHR5XG4iICk7CisgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiggIkRlbGV0ZWQgdGhyZWFkIGxpc3QgaGFzICIgKTsKKyAgICAgICAgaWYoIGRlbGV0ZWRfdGhyZWFkcy5jb3VudCA9PSAxICkKKyAgICAgICAgICAgIHByaW50ZiggIjEgZW50cnk6XG4iICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZiggIiVkIGVudHJpZXM6XG4iLCBkZWxldGVkX3RocmVhZHMuY291bnQgKTsKKworICAgICAgICBmb3IoIHAgPSBkZWxldGVkX3RocmVhZHMuaGVhZDsgcDsgcCA9IHAtPm5leHQgKSB7CisgICAgICAgICAgICBwcmludF90dGhyZWFkIChwKTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgorCisvKiBVcGRhdGUgdGhlIHRocmVhZCBsaXN0IGJhc2VkIG9uIHRoZSAic2VlbiIgYml0cy4KKyAqLworc3RhdGljIHZvaWQKK3VwZGF0ZV90aHJlYWRfbGlzdCAoKQoreworICAgIHRocmVhZF9pbmZvICpwOworICAgIHRocmVhZF9pbmZvICpjaGFzZTsKKworICAgIGNoYXNlID0gTlVMTDsKKyAgICBmb3IoIHAgPSB0aHJlYWRfaGVhZC5oZWFkOyBwOyBwID0gcC0+bmV4dCApIHsKKyAgICAgIC8qIElzIHRoaXMgYW4gInVuc2VlbiIgdGhyZWFkIHdoaWNoIHJlYWxseSBoYXBwZW5zIHRvIGJlIGEgcHJvY2Vzcz8KKyAgICAgICAgIElmIHNvLCBpcyBpdCBpbmZlcmlvcl9waWQgYW5kIGlzIGEgdmZvcmsgaW4gZmxpZ2h0PyAgSWYgeWVzIHRvCisgICAgICAgICBhbGwsIHRoZW4gRE9OJ1QgUkVNT1ZFIElUISAgV2UncmUgaW4gdGhlIG1pZHN0IG9mIG1vdmluZyBhIHZmb3JrCisgICAgICAgICBvcGVyYXRpb24sIHdoaWNoIGlzIGEgbXVsdGlwbGUgc3RlcCB0aGluZywgdG8gdGhlIHBvaW50IHdoZXJlIHdlCisgICAgICAgICBjYW4gdG91Y2ggdGhlIHBhcmVudCBhZ2Fpbi4gIFdlJ3ZlIG1vc3QgbGlrZWx5IHN0b3BwZWQgdG8gZXhhbWluZQorICAgICAgICAgdGhlIGNoaWxkIGF0IGEgbGF0ZSBzdGFnZSBpbiB0aGUgdmZvcmssIGFuZCBpZiB3ZSdyZSBub3QgZm9sbG93aW5nCisgICAgICAgICB0aGUgY2hpbGQsIHdlJ2QgYmVzdCBub3QgdHJlYXQgdGhlIHBhcmVudCBhcyBhIGRlYWQgInRocmVhZCIuLi4KKyAgICAgICAgICovCisgICAgICAgIGlmKCAoIXAtPnNlZW4pICYmIHAtPmFtX3BzZXVkbyAmJiB2Zm9ya19pbl9mbGlnaHQKKyAgICAgICAgICYmIChwLT5waWQgIT0gdmZvcmtpbmdfY2hpbGRfcGlkKSkKKyAgICAgICAgICAgIHAtPnNlZW4gPSAxOworCisgICAgICAgIGlmKCAhcC0+c2VlbiApIHsKKyAgICAgICAgICAgIC8qIFJlbW92ZSB0aGlzIG9uZQorICAgICAgICAgICAgICovCisKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgICAgICAgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgICAgICAgIHByaW50ZiggIkRlbGV0ZSB1bnNlZW4gdGhyZWFkOiAlZCBcbiIsIHAtPnRpZCApOworI2VuZGlmCisgICAgICAgICAgIGRlbF90dGhyZWFkKCBwLT50aWQgKTsKKyAgICAgICB9CisgICAgfQorfQorCisgICAgCisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIE8vUyBjYWxsIHdyYXBwZXJzICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyogVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgdHRyYWNlIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gIAorICogSXQgZXhpc3RzIHNvIHRoYXQgYWxsIGNhbGxzIHRvIHR0cmFjZSBhcmUgaXNvbGF0ZWQuICBBbGwKKyAqIHBhcmFtZXRlcnMgc2hvdWxkIGJlIGFzIHNwZWNpZmllZCBieSAibWFuIDIgdHRyYWNlIi4KKyAqCisgKiBObyBvdGhlciAicmF3IiBjYWxscyB0byB0dHJhY2Ugc2hvdWxkIGV4aXN0IGluIHRoaXMgbW9kdWxlLgorICovCitzdGF0aWMgaW50CitjYWxsX3JlYWxfdHRyYWNlKCByZXF1ZXN0LCBwaWQsIHRpZCwgYWRkciwgZGF0YSwgYWRkcjIgKQorICB0dHJlcV90ICAgICAgICAgIHJlcXVlc3Q7CisgIHBpZF90ICAgICAgICAgICAgcGlkOworICBsd3BpZF90ICAgICAgICAgIHRpZDsKKyAgVFRSQUNFX0FSR19UWVBFICBhZGRyLCBkYXRhLCBhZGRyMjsKK3sKKyAgaW50ICB0dF9zdGF0dXM7CisKKyAgZXJybm8gPSAwOworICB0dF9zdGF0dXMgPSB0dHJhY2UoIHJlcXVlc3QsIHBpZCwgdGlkLCBhZGRyLCBkYXRhLCBhZGRyMiApOworCisjaWZkZWYgVEhSRUFEX0RFQlVHCisgIGlmIChlcnJubykgeworICAgIC8qIERvbid0IGJvdGhlciBmb3IgYSBrbm93biBiZW5pZ24gZXJyb3I6IGlmIHlvdSBhc2sgZm9yIHRoZQorICAgICAqIGZpcnN0IHRocmVhZCBzdGF0ZSwgYnV0IHRoZXJlIGlzIG9ubHkgb25lIHRocmVhZCBhbmQgaXQncworICAgICAqIG5vdCBzdG9wcGVkLCB0dHJhY2UgY29tcGxhaW5zLgorICAgICAqCisgICAgICogV2UgaGF2ZSB0aGlzIGluc2lkZSB0aGUgI2lmZGVmIGJlY2F1c2Ugb3VyIGNhbGxlciB3aWxsIGRvCisgICAgICogdGhpcyBjaGVjayBmb3IgcmVhbC4KKyAgICAgKi8KKyAgICBpZiggcmVxdWVzdCAhPSBUVF9QUk9DX0dFVF9GSVJTVF9MV1BfU1RBVEUKKyAgICB8fCAgZXJybm8gICAhPSBFUFJPVE8gKSB7CisgICAgICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgICAgICBwcmludGYoICJUVCBmYWlsIGZvciAlcywgd2l0aCBwaWQgJWQsIHRpZCAlZCwgc3RhdHVzICVkIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0X3ByaW50YWJsZV9uYW1lX29mX3R0cmFjZV9yZXF1ZXN0IChyZXF1ZXN0KSwKKyAgICAgICAgICAgICAgICAgICAgcGlkLCB0aWQsIHR0X3N0YXR1cyApOworICAgIH0KKyAgfQorI2VuZGlmCisKKyNpZiAwCisgIC8qID8/cmVocmF1ZXI6IEl0IHdvdWxkIHByb2JhYmx5IGJlIG1vc3Qgcm9idXN0IHRvIGNhdGNoIGFuZCByZXBvcnQKKyAgICogZmFpbGVkIHJlcXVlc3RzIGhlcmUuICBIb3dldmVyLCBzb21lIGNsaWVudHMgb2YgdGhpcyBpbnRlcmZhY2UKKyAgICogc2VlbSB0byBleHBlY3QgdG8gY2F0Y2ggJiBkZWFsIHdpdGggdGhlbSwgc28gd2UnZCBiZXN0IG5vdC4KKyAgICovCisgIGlmIChlcnJubykgeworICAgIHN0cmNweSAocmVhc29uX2Zvcl9mYWlsdXJlLCAidHRyYWNlICgiKTsKKyAgICBzdHJjYXQgKHJlYXNvbl9mb3JfZmFpbHVyZSwgZ2V0X3ByaW50YWJsZV9uYW1lX29mX3R0cmFjZV9yZXF1ZXN0IChyZXF1ZXN0KSk7CisgICAgc3RyY2F0IChyZWFzb25fZm9yX2ZhaWx1cmUsICIpIik7CisgICAgcHJpbnRmKCAidHRyYWNlIGVycm9yLCBlcnJubyA9ICVkXG4iLCBlcnJubyApOworICAgIHBlcnJvcl93aXRoX25hbWUgKHJlYXNvbl9mb3JfZmFpbHVyZSk7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiB0dF9zdGF0dXM7Cit9CisKKwwKKy8qIFRoaXMgZnVuY3Rpb24gc2ltcGx5IGNhbGxzIHR0cmFjZV93YWl0IHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gIAorICogSXQgZXhpc3RzIHNvIHRoYXQgYWxsIGNhbGxzIHRvIHR0cmFjZV93YWl0IGFyZSBpc29sYXRlZC4KKyAqCisgKiBObyAicmF3IiBjYWxscyB0byB0dHJhY2Vfd2FpdCBzaG91bGQgZXhpc3QgZWxzZXdoZXJlLgorICovCitzdGF0aWMgaW50CitjYWxsX3JlYWxfdHRyYWNlX3dhaXQoIHBpZCwgdGlkLCBvcHRpb24sIHRzcCwgdHNwX3NpemUgKQorICBpbnQgICAgICAgIHBpZDsKKyAgbHdwaWRfdCAgICB0aWQ7CisgIHR0d29wdF90ICAgb3B0aW9uOworICB0dHN0YXRlX3QgKnRzcDsKKyAgc2l6ZV90ICAgICB0c3Bfc2l6ZTsKK3sKKyAgaW50ICAgICAgICB0dHdfc3RhdHVzOworICB0aHJlYWRfaW5mbyAqICB0aW5mbyA9IE5VTEw7CisKKyAgZXJybm8gPSAwOworICB0dHdfc3RhdHVzID0gdHRyYWNlX3dhaXQgKHBpZCwgdGlkLCBvcHRpb24sIHRzcCwgdHNwX3NpemUpOworICAKKyAgaWYgKGVycm5vKSB7CisjaWZkZWYgVEhSRUFEX0RFQlVHCisgICAgICBpZiggZGVidWdfb24gKQorICAgICAgICAgIHByaW50ZiggIlRXIGZhaWwgd2l0aCBwaWQgJWQsIHRpZCAlZCBcbiIsIHBpZCwgdGlkICk7CisjZW5kaWYKKworICAgICAgcGVycm9yX3dpdGhfbmFtZSAoInR0cmFjZSB3YWl0Iik7CisgIH0KKworICByZXR1cm4gdHR3X3N0YXR1czsKK30KKworDAorLyogQSBwcm9jZXNzIG1heSBoYXZlIG9uZSBvciBtb3JlIGtlcm5lbCB0aHJlYWRzLCBvZiB3aGljaCBhbGwgb3IKKyAgIG5vbmUgbWF5IGJlIHN0b3BwZWQuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIElEIG9mIHRoZSBmaXJzdAorICAga2VybmVsIHRocmVhZCBpbiBhIHN0b3BwZWQgc3RhdGUsIG9yIDAgaWYgbm9uZSBhcmUgc3RvcHBlZC4KKworICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB3aXRoIGdldF9wcm9jZXNzX25leHRfc3RvcHBlZF90aHJlYWRfaWQKKyAgIHRvIGl0ZXJhdGUgb3ZlciB0aGUgSURzIG9mIGFsbCBzdG9wcGVkIHRocmVhZHMgb2YgdGhpcyBwcm9jZXNzLgorICovCitzdGF0aWMgbHdwaWRfdAorZ2V0X3Byb2Nlc3NfZmlyc3Rfc3RvcHBlZF90aHJlYWRfaWQgKHBpZCwgdGhyZWFkX3N0YXRlKQorICBpbnQgIHBpZDsKKyAgdHRzdGF0ZV90ICogIHRocmVhZF9zdGF0ZTsKK3sKKyAgaW50ICB0dF9zdGF0dXM7CisKKyAgdHRfc3RhdHVzID0gY2FsbF9yZWFsX3R0cmFjZSAoCisgICAgICAgICAgICAgICAgICAgICAgVFRfUFJPQ19HRVRfRklSU1RfTFdQX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgIChwaWRfdCkgcGlkLAorICAgICAgICAgICAgICAgICAgICAgIChsd3BpZF90KSBUVF9OSUwsCisgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgdGhyZWFkX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIHNpemVvZiAoKnRocmVhZF9zdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgVFRfTklMKTsKKyAgICAgICAgICAgICAgICAgICAgICAKKyAgaWYgKGVycm5vKSB7CisgICAgaWYoIGVycm5vID09IEVQUk9UTykgeworICAgICAgICAvKiBUaGlzIGlzIGFuIGVycm9yIHdlIGNhbiBoYW5kbGU6IHRoZXJlIGlzbid0IGFueSBzdG9wcGVkCisgICAgICAgICAqIHRocmVhZC4gIFRoaXMgaGFwcGVucyB3aGVuIHdlJ3JlIHJlLXN0YXJ0aW5nIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgKiBhbmQgaXQgaGFzIG9ubHkgb25lIHRocmVhZC4gIEdFVF9ORVhUIGhhbmRsZXMgdGhlIGNhc2Ugb2YKKyAgICAgICAgICogbm8gbW9yZSBzdG9wcGVkIHRocmVhZHMgd2VsbDsgR0VUX0ZJUlNUIGRvZXNuJ3QuICAoQSB0dHJhY2UKKyAgICAgICAgICogImZlYXR1cmUiLikKKyAgICAgICAgICovCisgICAgICAgIHR0X3N0YXR1cyA9IDE7CisgICAgICAgIGVycm5vICAgICA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBlcnJvcl93aXRoX25hbWUgKCJ0dHJhY2UiKTsKKyAgfQorICAKKyAgaWYoIHR0X3N0YXR1cyA8IDAgKQorICAgIC8qIEZhaWxlZCBzb21laG93LgorICAgICAqLworICAgIHJldHVybiAwOworCisgIHJldHVybiB0aHJlYWRfc3RhdGUtPnR0c19sd3BpZDsKK30KKworDAorLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBJRCBvZiB0aGUgIm5leHQiIGtlcm5lbCB0aHJlYWQgaW4gYQorICAgc3RvcHBlZCBzdGF0ZSwgb3IgMCBpZiB0aGVyZSBhcmUgbm9uZS4gICJOZXh0IiByZWZlcnMgdG8gdGhlCisgICB0aHJlYWQgZm9sbG93aW5nIHRoYXQgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBjYWxsIHRvIHRoaXMKKyAgIGZ1bmN0aW9uIG9yIHRvIGdldF9wcm9jZXNzX2ZpcnN0X3N0b3BwZWRfdGhyZWFkX2lkLCB1c2luZworICAgdGhlIHZhbHVlIG9mIHRocmVhZF9zdGF0ZSByZXR1cm5lZCBieSB0aGF0IGNhbGwuCisKKyAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgd2l0aCBnZXRfcHJvY2Vzc19maXJzdF9zdG9wcGVkX3RocmVhZF9pZAorICAgdG8gaXRlcmF0ZSBvdmVyIHRoZSBJRHMgb2YgYWxsIHN0b3BwZWQgdGhyZWFkcyBvZiB0aGlzIHByb2Nlc3MuCisgKi8KK3N0YXRpYyBsd3BpZF90CitnZXRfcHJvY2Vzc19uZXh0X3N0b3BwZWRfdGhyZWFkX2lkIChwaWQsIHRocmVhZF9zdGF0ZSkKKyAgaW50ICBwaWQ7CisgIHR0c3RhdGVfdCAqICB0aHJlYWRfc3RhdGU7Cit7CisgIGludCAgdHRfc3RhdHVzOworCisgIHR0X3N0YXR1cyA9IGNhbGxfcmVhbF90dHJhY2UgKAorICAgICAgICAgICAgICAgICAgICAgIFRUX1BST0NfR0VUX05FWFRfTFdQX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgIChwaWRfdCkgcGlkLAorICAgICAgICAgICAgICAgICAgICAgIChsd3BpZF90KSBUVF9OSUwsCisgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgdGhyZWFkX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIHNpemVvZiAoKnRocmVhZF9zdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgVFRfTklMKTsKKyAgaWYgKGVycm5vKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJ0dHJhY2UiKTsKKworICBpZiAodHRfc3RhdHVzIDwgMCkKKyAgICAvKiBGYWlsZWQKKyAgICAgKi8KKyAgICByZXR1cm4gMDsKKworICBlbHNlIGlmKCB0dF9zdGF0dXMgPT0gMCApIHsKKyAgICAvKiBFbmQgb2YgbGlzdCwgbm8gbmV4dCBzdGF0ZS4gIERvbid0IHJldHVybiB0aGUKKyAgICAgKiB0dHNfbHdwaWQsIGFzIGl0J3MgYSBtZWFuaW5nbGVzcyAiMjQwIi4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgYW4gSFBVWCAiZmVhdHVyZSIuCisgICAgICovCisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIHJldHVybiB0aHJlYWRfc3RhdGUtPnR0c19sd3BpZDsKK30KKworLyogPz9yZWhyYXVlcjogRXZlbnR1YWxseSB0aGlzIGZ1bmN0aW9uIHBlcmhhcHMgc2hvdWxkIGJlIGNhbGxpbmcKKyAgIHBpZF90b190aHJlYWRfaWQuICBIb3dldmVyLCB0aGF0IGZ1bmN0aW9uIGN1cnJlbnRseSBkb2VzIG5vdGhpbmcKKyAgIGZvciBIUC1VWC4gIEV2ZW4gdGhlbiwgSSdtIG5vdCBjbGVhciB3aGV0aGVyIHRoYXQgZnVuY3Rpb24KKyAgIHdpbGwgcmV0dXJuIGEgImtlcm5lbCIgdGhyZWFkIElELCBvciBhICJ1c2VyIiB0aHJlYWQgSUQuICBJZgorICAgdGhlIGZvcm1lciwgd2UgY2FuIGp1c3QgY2FsbCBpdCBoZXJlLiAgSWYgdGhlIGxhdHRlciwgd2UgbXVzdAorICAgbWFwIGZyb20gdGhlICJ1c2VyIiB0aWQgdG8gYSAia2VybmVsIiB0aWQuCisKKyAgIE5PVEU6IGN1cnJlbnRseSBub3QgY2FsbGVkLgorICovCitzdGF0aWMgbHdwaWRfdAorZ2V0X2FjdGl2ZV90aWRfb2ZfcGlkIChwaWQpCisgIGludCAgcGlkOworeworICB0dHN0YXRlX3QgIHRocmVhZF9zdGF0ZTsKKworICByZXR1cm4gZ2V0X3Byb2Nlc3NfZmlyc3Rfc3RvcHBlZF90aHJlYWRfaWQgKHBpZCwgJnRocmVhZF9zdGF0ZSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAxIGlmIHR0X3JlcXVlc3QgaXMgYSB0dHJhY2UgcmVxdWVzdCB0aGF0CisgKiBvcGVyYXRlcyB1cG9uIGFsbCB0aHJlYWRzIG9mIGEgKGkuZS4sIHRoZSBlbnRpcmUpIHByb2Nlc3MuCisgKi8KK2ludAoraXNfcHJvY2Vzc190dHJhY2VfcmVxdWVzdCAodHRfcmVxdWVzdCkKKyAgdHRyZXFfdCAgdHRfcmVxdWVzdDsKK3sKKyAgcmV0dXJuIElTX1RUUkFDRV9QUk9DUkVRICh0dF9yZXF1ZXN0KTsKK30KKworDAorLyogVGhpcyBmdW5jdGlvbiB0cmFuc2xhdGVzIGEgdGhyZWFkIHR0cmFjZSByZXF1ZXN0IGludG8KKyAqIHRoZSBlcXVpdmFsZW50IHByb2Nlc3MgcmVxdWVzdCBmb3IgYSBvbmUtdGhyZWFkIHByb2Nlc3MuCisgKi8KK3N0YXRpYyB0dHJlcV90CittYWtlX3Byb2Nlc3NfdmVyc2lvbiggcmVxdWVzdCApCisgIHR0cmVxX3QgcmVxdWVzdDsKK3sKKyAgaWYgKCFJU19UVFJBQ0VfUkVRIChyZXF1ZXN0KSkgeworICAgIGVycm9yKCAiSW50ZXJuYWwgZXJyb3IsIGJhZCB0dHJhY2UgcmVxdWVzdCBtYWRlXG4iICk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgc3dpdGNoIChyZXF1ZXN0KSB7CisgICAgY2FzZSBUVF9MV1BfU1RPUCA6CisgICAgICByZXR1cm4gVFRfUFJPQ19TVE9QOworCisgICAgY2FzZSBUVF9MV1BfQ09OVElOVUUgOgorICAgICAgcmV0dXJuIFRUX1BST0NfQ09OVElOVUU7CisKKyAgICBjYXNlIFRUX0xXUF9HRVRfRVZFTlRfTUFTSyA6CisgICAgICByZXR1cm4gVFRfUFJPQ19HRVRfRVZFTlRfTUFTSzsKKworICAgIGNhc2UgVFRfTFdQX1NFVF9FVkVOVF9NQVNLIDoKKyAgICAgIHJldHVybiBUVF9QUk9DX1NFVF9FVkVOVF9NQVNLOworCisgICAgY2FzZSBUVF9MV1BfU0lOR0xFIDoKKyAgICBjYXNlIFRUX0xXUF9SVVJFR1MgOgorICAgIGNhc2UgVFRfTFdQX1dVUkVHUyA6CisgICAgY2FzZSBUVF9MV1BfR0VUX1NUQVRFCToKKyAgICAgIHJldHVybiAtMTsgICAgICAgLyogTm8gZXF1aXZhbGVudCAqLworCisgICAgZGVmYXVsdCA6CisgICAgICByZXR1cm4gcmVxdWVzdDsKKyAgfQorfQorCisMCisvKiBUaGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlICJwaWQiIHVzZWQgYnkgdGhlIHJlc3Qgb2YKKyAqIGdkYiB0byBhIHJlYWwgcGlkIGFuZCBhIHRpZC4gIEl0IHRoZW4gY2FsbHMgImNhbGxfcmVhbF90dHJhY2UiCisgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCisgKgorICogSW4gZ2VuZXJhbCwgb3RoZXIgcGFydHMgb2YgdGhpcyBtb2R1bGUgc2hvdWxkIGNhbGwgdGhpcworICogZnVuY3Rpb24gd2hlbiB0aGV5IGFyZSBkZWFsaW5nIHdpdGggZXh0ZXJuYWwgdXNlcnMsIHdobyBvbmx5CisgKiBoYXZlIHRpZHMgdG8gcGFzcyAoYnV0IHRoZXkgY2FsbCBpdCAicGlkIiBmb3IgaGlzdG9yaWNhbAorICogcmVhc29ucykuCisgKi8KK3N0YXRpYyBpbnQKK2NhbGxfdHRyYWNlKCByZXF1ZXN0LCBnZGJfdGlkLCBhZGRyLCBkYXRhLCBhZGRyMiApCisgIHR0cmVxX3QgIHJlcXVlc3Q7CisgIGludCAgICAgIGdkYl90aWQ7CisgIFRUUkFDRV9BUkdfVFlQRSAgYWRkciwgZGF0YSwgYWRkcjI7Cit7CisgIGx3cGlkX3QgIHJlYWxfdGlkOworICBpbnQgICAgICByZWFsX3BpZDsKKyAgdHRyZXFfdCAgbmV3X3JlcXVlc3Q7CisgIGludCAgICAgIHR0X3N0YXR1czsKKyAgY2hhciAgICAgcmVhc29uX2Zvcl9mYWlsdXJlIFsxMDBdOyAgLyogQXJiaXRyYXJ5IHNpemUsIHNob3VsZCBiZSBiaWcgZW5vdWdoLiAqLworICAKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgaW50CWlzX2ludGVyZXN0aW5nID0gMDsKKworICBpZiggVFRfTFdQX1JVUkVHUyA9PSByZXF1ZXN0ICkgeworICAgICBpc19pbnRlcmVzdGluZyA9IDE7ICAgICAgICAgIC8qIEFkanVzdCBjb2RlIGhlcmUgYXMgZGVzaXJlZCAqLworICB9CisgIAorICBpZiggaXNfaW50ZXJlc3RpbmcgJiYgMCAmJiBkZWJ1Z19vbiApIHsKKyAgICAgIGlmKCAhaXNfcHJvY2Vzc190dHJhY2VfcmVxdWVzdCggcmVxdWVzdCApKSB7CisgICAgICAgICAgcHJpbnRmKCAiVFQ6IFRocmVhZCByZXF1ZXN0LCB0aWQgaXMgJWQiLCBnZGJfdGlkICk7CisgICAgICAgICAgcHJpbnRmKCAiPT0gU0lOR0xFIGF0ICV4IiwgYWRkciApOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICAgcHJpbnRmKCAiVFQ6IFByb2Nlc3MgcmVxdWVzdCwgdGlkIGlzICVkXG4iLCBnZGJfdGlkICk7CisgICAgICAgICAgcHJpbnRmKCAiPT0hIFNJTkdMRSBhdCAleCIsIGFkZHIgKTsKKyAgICAgIH0KKyAgfQorI2VuZGlmCisKKyAgLyogVGhlIGluaXRpYWwgU0VUVFJDIGFuZCBTRVRfRVZFTlRfTUFTSyBjYWxscyAoYW5kIGFsbCBvdGhlcnMKKyAgICogd2hpY2ggaGFwcGVuIGJlZm9yZSBhbnkgdGhyZWFkcyBnZXQgc2V0IHVwKSBzaG91bGQgZ28KKyAgICogZGlyZWN0bHkgdG8gImNhbGxfcmVhbF90dHJhY2UiLCBzbyB0aGV5IGRvbid0IGhhcHBlbiBoZXJlLgorICAgKgorICAgKiBCdXQgaGFyZHdhcmUgd2F0Y2hwb2ludHMgZG8gYSBTRVRfRVZFTlRfTUFTSywgc28gd2UgY2FuJ3QKKyAgICogcnVsZSB0aGVtIG91dC4uLi4KKyAgICovCisjaWZkZWYgVEhSRUFEX0RFQlVHCisgIGlmKCByZXF1ZXN0ID09IFRUX1BST0NfU0VUVFJDICYmIGRlYnVnX29uICkKKyAgICAgIHByaW50ZiggIlVuZXhwZWN0ZWQgY2FsbCBmb3IgVFRfUFJPQ19TRVRUUkNcbiIgKTsKKyNlbmRpZgorCisgIC8qIFNvbWV0aW1lcyB3ZSBnZXQgY2FsbGVkIHdpdGggYSBib2d1cyB0aWQgKGUuZy4sIGlmIGEKKyAgICogdGhyZWFkIGhhcyB0ZXJtaW5hdGVkLCB3ZSByZXR1cm4gMDsgaW5mdGFyZyBsYXRlciBhc2tzCisgICAqIHdoZXRoZXIgdGhlIHRocmVhZCBoYXMgZXhpdGVkL2ZvcmtlZC92Zm9ya2VkKS4KKyAgICovCisgIGlmKCBnZGJfdGlkID09IDAgKQorICAgIHsKKyAgICAgIGVycm5vID0gRVNSQ0g7ICAvKiB0dHJhY2UncyByZXNwb25zZSB3b3VsZCBwcm9iYWJseSBiZSAiTm8gc3VjaCBwcm9jZXNzIi4gKi8KKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgLyogQWxsIG90aGVyIGNhc2VzIHNob3VsZCBiZSBhYmxlIHRvIGV4cGVjdCB0aGF0IHRoZXJlIGFyZQorICAgKiB0aHJlYWQgcmVjb3Jkcy4KKyAgICovCisgIGlmKCAhYW55X3RocmVhZF9yZWNvcmRzKCkpIHsKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgICAgd2FybmluZyAoIk5vIHRocmVhZCByZWNvcmRzIGZvciB0dHJhY2UgY2FsbCIpOworI2VuZGlmCisgICAgICBlcnJubyA9IEVTUkNIOyAgLyogdHRyYWNlJ3MgcmVzcG9uc2Ugd291bGQgYmUgIk5vIHN1Y2ggcHJvY2VzcyIuICovCisgICAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBPSywgbm93IHRoZSB0YXNrIGlzIHRvIHRyYW5zbGF0ZSB0aGUgaW5jb21pbmcgdGlkIGludG8KKyAgICogYSBwaWQvdGlkIHBhaXIuCisgICAqLworICByZWFsX3RpZCA9IG1hcF9mcm9tX2dkYl90aWQoIGdkYl90aWQgKTsKKyAgcmVhbF9waWQgPSBnZXRfcGlkX2ZvciggcmVhbF90aWQgKTsKKworICAvKiBOb3cgY2hlY2sgdGhlIHJlc3VsdC4gICJSZWFsX3BpZCIgaXMgTlVMTCBpZiBvdXIgbGlzdAorICAgKiBkaWRuJ3QgZmluZCBpdC4gIFdlIGhhdmUgc29tZSB0cmlja3Mgd2UgY2FuIHBsYXkgdG8gZml4CisgICAqIHRoaXMsIGhvd2V2ZXIuCisgICAqLworICBpZiggMCA9PSByZWFsX3BpZCApIHsKKyAgICB0dHN0YXRlX3QgIHRocmVhZF9zdGF0ZTsKKworI2lmZGVmIFRIUkVBRF9ERUJVRworICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgIHByaW50ZiggIk5vIHNhdmVkIHBpZCBmb3IgdGlkICVkXG4iLCBnZGJfdGlkICk7CisjZW5kaWYKKworICAgIGlmKCBpc19wcm9jZXNzX3R0cmFjZV9yZXF1ZXN0KCByZXF1ZXN0ICkpIHsKKyAgICAgCisgICAgICAgIC8qIE9rLCB3ZSBjb3VsZG4ndCBnZXQgYSB0aWQuICBUcnkgdG8gdHJhbnNsYXRlIHRvCisgICAgICAgICAqIHRoZSBlcXVpdmFsZW50IHByb2Nlc3Mgb3BlcmF0aW9uLiAgV2UgZXhwZWN0IHRoaXMKKyAgICAgICAgICogTk9UIHRvIGhhcHBlbiwgc28gdGhpcyBpcyBhIGRlc3BhcmF0aW9uLXR5cGUKKyAgICAgICAgICogbW92ZS4gIEl0IGNhbiBoYXBwZW4gaWYgdGhlcmUgaXMgYW4gaW50ZXJuYWwKKyAgICAgICAgICogZXJyb3IgYW5kIHNvIG5vICJ3YWl0KCkiIGNhbGwgaXMgZXZlciBkb25lLgorICAgICAgICAgKi8KKyAgICAgICAgbmV3X3JlcXVlc3QgPSBtYWtlX3Byb2Nlc3NfdmVyc2lvbiggcmVxdWVzdCApOworICAgICAgICBpZiggbmV3X3JlcXVlc3QgPT0gLTEgKSB7CisgICAgICAgIAorI2lmZGVmIFRIUkVBRF9ERUJVRworICAgICAgICAgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgICAgICAgICBwcmludGYoICIuLi5hbmQgY291bGRuJ3QgbWFrZSBwcm9jZXNzIHZlcnNpb24gb2YgdGhyZWFkIG9wZXJhdGlvblxuIiApOworI2VuZGlmCisKKyAgICAgICAgICAgIC8qIFVzZSBoYWNreSBzYXZlZCBwaWQsIHdoaWNoIHdvbid0IGFsd2F5cyBiZSBjb3JyZWN0CisgICAgICAgICAgICAgKiBpbiB0aGUgbXVsdGktcHJvY2VzcyBmdXR1cmUuICBVc2UgdGlkIGFzIHRocmVhZCwKKyAgICAgICAgICAgICAqIHByb2JhYmx5IGRvb21pbmcgdGhpcyB0byBmYWlsdXJlLiAgRklYIQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiggc2F2ZWRfcmVhbF9waWQgIT0gMCApIHsKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgICAgICAgICAgICAgICBpZiggZGVidWdfb24gKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoICIuLi51c2luZyBzYXZlZCBwaWQgJWRcbiIsIHNhdmVkX3JlYWxfcGlkICk7CisjZW5kaWYKKworICAgICAgICAgICAgICAgIHJlYWxfcGlkID0gc2F2ZWRfcmVhbF9waWQ7CisgICAgICAgICAgICAgICAgcmVhbF90aWQgPSBnZGJfdGlkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZXJyb3IoICJVbmFibGUgdG8gcGVyZm9ybSB0aHJlYWQgb3BlcmF0aW9uIiApOworICAgICAgICB9IAorCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogU3VjZXNzZnVsbHkgdHJhbnNsYXRlZCB0aGlzIHRvIGEgcHJvY2VzcyByZXF1ZXN0LAorICAgICAgICAgICAgICogd2hpY2ggbmVlZHMgbm8gdGhyZWFkIHZhbHVlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZWFsX3BpZCA9IGdkYl90aWQ7CisgICAgICAgICAgICByZWFsX3RpZCA9IDA7CisgICAgICAgICAgICByZXF1ZXN0ICA9IG5ld19yZXF1ZXN0OworCisjaWZkZWYgVEhSRUFEX0RFQlVHCisgICAgICAgICAgICBpZiggZGVidWdfb24gKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCAiVHJhbnNsYXRlZCB0aHJlYWQgcmVxdWVzdCB0byBwcm9jZXNzIHJlcXVlc3RcbiIgKTsKKyAgICAgICAgICAgICAgICBpZiggc2F2ZWRfcmVhbF9waWQgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIHByaW50ZiggIi4uLmJ1dCB0aGVyZSdzIG5vIHNhdmVkIHBpZFxuIiApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiggZ2RiX3RpZCAhPSBzYXZlZF9yZWFsX3BpZCApCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoICIuLi5idXQgaGF2ZSB0aGUgd3JvbmcgcGlkICglZCByYXRoZXIgdGhhbiAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkYl90aWQsIHNhdmVkX3JlYWxfcGlkICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0gLyogVHJhbnNsYXRlZCB0byBhIHByb2Nlc3MgcmVxdWVzdCAqLworICAgIH0gICAgIC8qIElzIGEgcHJvY2VzcyByZXF1ZXN0ICovCisKKyAgICBlbHNlIHsKKyAgICAgICAgLyogV2UgaGF2ZSB0byBoYXZlIGEgdGhyZWFkLiAgT29vcHMuCisgICAgICAgICAqLworICAgICAgIGVycm9yKCAiVGhyZWFkIHJlcXVlc3Qgd2l0aCBubyB0aHJlYWRzICglcykiLAorICAgICAgICAgICAgICAgZ2V0X3ByaW50YWJsZV9uYW1lX29mX3R0cmFjZV9yZXF1ZXN0KCByZXF1ZXN0ICkpOworICAgIH0KKyAgfQorCisgIC8qIFR0cmFjZSBkb2Vzbid0IGxpa2UgdG8gc2VlIHRpZCB2YWx1ZXMgb24gcHJvY2VzcyByZXF1ZXN0cywKKyAgICogZXZlbiBpZiB3ZSBoYXZlIHRoZSByaWdodCBvbmUuCisgICAqLworICBpZiAoaXNfcHJvY2Vzc190dHJhY2VfcmVxdWVzdCAocmVxdWVzdCkpIHsKKyAgICAgIHJlYWxfdGlkID0gMDsKKyAgfQorICAKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgaWYoIGlzX2ludGVyZXN0aW5nICYmIDAgJiYgZGVidWdfb24gKSB7CisgICAgcHJpbnRmKCAiICAgIG5vdyB0aWQgJWQsIHBpZCAlZFxuIiwgcmVhbF90aWQsIHJlYWxfcGlkICk7CisgICAgcHJpbnRmKCAiICAgIHJlcXVlc3QgaXMgJXNcbiIsIGdldF9wcmludGFibGVfbmFtZV9vZl90dHJhY2VfcmVxdWVzdCAocmVxdWVzdCkpOworICB9CisjZW5kaWYKKworICAvKiBGaW5hbGx5LCB0aGUgKGFsbW9zdCkgcmVhbCBjYWxsLgorICAgKi8KKyAgdHRfc3RhdHVzID0gY2FsbF9yZWFsX3R0cmFjZSAocmVxdWVzdCwgcmVhbF9waWQsIHJlYWxfdGlkLCBhZGRyLCBkYXRhLCBhZGRyMik7CisKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgaWYoaXNfaW50ZXJlc3RpbmcgJiYgZGVidWdfb24gKSB7CisgICAgaWYoICFUVF9PSyggdHRfc3RhdHVzLCBlcnJubyApCisgICAgJiYgICEodHRfc3RhdHVzID09IDAgJiBlcnJubyA9PSAwKSkKKyAgICAgIHByaW50ZiggIiBnb3QgZXJyb3IgKGVycm5vPT0lZCwgc3RhdHVzPT0lZClcbiIsIGVycm5vLCB0dF9zdGF0dXMgKTsKKyAgfQorI2VuZGlmCisKKyAgcmV0dXJuIHR0X3N0YXR1czsKK30KKworCisvKiBTdG9wIGFsbCB0aGUgdGhyZWFkcyBvZiBhIHByb2Nlc3MuCisgKgorICogTk9URTogdXNlIG9mIFRUX1BST0NfU1RPUCBjYW4gY2F1c2UgYSB0aHJlYWQgd2l0aCBhIHJlYWwgZXZlbnQKKyAqICAgICAgIHRvIGdldCBhIFRURVZUX05PTkUgZXZlbnQsIGRpc2NhcmRpbmcgdGhlIG9sZCBldmVudC4gIEJlCisgKiAgICAgICB2ZXJ5IGNhcmVmdWwsIGFuZCBvbmx5IGNhbGwgVFRfUFJPQ19TVE9QIHdoZW4geW91IG1lYW4gaXQhCisgKi8KK3N0YXRpYyB2b2lkCitzdG9wX2FsbF90aHJlYWRzX29mX3Byb2Nlc3MoIHJlYWxfcGlkICkKKyAgcGlkX3QgIHJlYWxfcGlkOworeworICBpbnQgIHR0d19zdGF0dXM7CisKKyAgdHR3X3N0YXR1cyA9IGNhbGxfcmVhbF90dHJhY2UgKFRUX1BST0NfU1RPUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwaWRfdCkgcmVhbF9waWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobHdwaWRfdCkgVFRfTklMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgVFRfTklMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgVFRfTklMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTklMICk7CisgIGlmIChlcnJubykKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgidHRyYWNlIHN0b3Agb2Ygb3RoZXIgdGhyZWFkcyIpOworfQorCisKKy8qIFVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcywgaXQncyB1bnNhZmUgdG8gYXR0ZW1wdCB0byBzdG9wLCBvciBldmVuCisgICBxdWVyeSB0aGUgc3RhdGUgb2YsIGEgcHJvY2VzcycgdGhyZWFkcy4KKworICAgSW4gdHRyYWNlLWJhc2VkIEhQLVVYLCBhbiBleGFtcGxlIGlzIGEgdmZvcmtpbmcgY2hpbGQgcHJvY2Vzcy4gIFRoZQorICAgdmZvcmtpbmcgcGFyZW50IGFuZCBjaGlsZCBhcmUgc29tZXdoYXQgZnJhZ2lsZSwgdy9yL3Qgd2hhdCB3ZSBjYW4gZG8KKyAgIHdoYXQgd2UgY2FuIGRvIHRvIHRoZW0gd2l0aCB0dHJhY2UsIHVudGlsIGFmdGVyIHRoZSBjaGlsZCBleGl0cyBvcgorICAgZXhlY3MsIG9yIHVudGlsIHRoZSBwYXJlbnQncyB2Zm9yayBldmVudCBpcyBkZWxpdmVyZWQuICBVbnRpbCB0aGF0CisgICB0aW1lLCB3ZSBtdXN0IG5vdCB0cnkgdG8gc3RvcCB0aGUgcHJvY2VzcycgdGhyZWFkcywgb3IgaW5xdWlyZSBob3cKKyAgIG1hbnkgdGhlcmUgYXJlLCBvciBldmVuIGFsdGVyIGl0cyBkYXRhIHNlZ21lbnRzLCBvciBpdCB0eXBpY2FsbHkgZGllcworICAgd2l0aCBhIFNJR0lMTC4gIFNpZ2guCisKKyAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAxIGlmIHRoaXMgc3RvcHBlZCBwcm9jZXNzLCBhbmQgdGhlIGV2ZW50IHRoYXQKKyAgIHdlJ3JlIHRvbGQgd2FzIHJlc3BvbnNpYmxlIGZvciBpdHMgY3VycmVudCBzdG9wcGVkIHN0YXRlLCBjYW5ub3Qgc2FmZWx5CisgICBoYXZlIGl0cyB0aHJlYWRzIGV4YW1pbmVkLgorICAgKi8KKyNkZWZpbmUgQ0hJTERfVkZPUktFRChldnQscGlkKSBcCisgICgoKGV2dCkgPT0gVFRFVlRfVkZPUkspICYmICgocGlkKSAhPSBpbmZlcmlvcl9waWQpKQorI2RlZmluZSBDSElMRF9VUlBFRChldnQscGlkKSBcCisgICgoKChldnQpID09IFRURVZUX0VYRUMpIHx8ICgoZXZ0KSA9PSBUVEVWVF9FWElUKSkgJiYgKChwaWQpICE9IHZmb3JraW5nX2NoaWxkX3BpZCkpCisjZGVmaW5lIFBBUkVOVF9WRk9SS0VEKGV2dCxwaWQpIFwKKyAgKCgoZXZ0KSA9PSBUVEVWVF9WRk9SSykgJiYgKChwaWQpID09IGluZmVyaW9yX3BpZCkpCisKK3N0YXRpYyBpbnQKK2Nhbl90b3VjaF90aHJlYWRzX29mX3Byb2Nlc3MgKHBpZCwgc3RvcHBpbmdfZXZlbnQpCisgIGludCAgcGlkOworICB0dGV2ZW50c190ICBzdG9wcGluZ19ldmVudDsKK3sKKyAgaWYgKENISUxEX1ZGT1JLRUQgKHN0b3BwaW5nX2V2ZW50LCBwaWQpKQorICAgIHsKKyAgICAgIHZmb3JraW5nX2NoaWxkX3BpZCA9IHBpZDsKKyAgICAgIHZmb3JrX2luX2ZsaWdodCA9IDE7CisgICAgfQorCisgIGVsc2UgaWYgKHZmb3JrX2luX2ZsaWdodCAmJgorICAgICAgICAgICAoUEFSRU5UX1ZGT1JLRUQgKHN0b3BwaW5nX2V2ZW50LCBwaWQpIHx8CisgICAgICAgICAgICBDSElMRF9VUlBFRCAoc3RvcHBpbmdfZXZlbnQsIHBpZCkpKQorICAgIHsKKyAgICAgIHZmb3JrX2luX2ZsaWdodCA9IDA7CisgICAgICB2Zm9ya2luZ19jaGlsZF9waWQgPSAwOworICAgIH0KKworICByZXR1cm4gISB2Zm9ya19pbl9mbGlnaHQ7Cit9CisKKworLyogSWYgd2UgY2FuIGZpbmQgYW4gYXMteWV0LXVuaGFuZGxlZCB0aHJlYWQgc3RhdGUgb2YgYQorICogc3RvcHBlZCB0aHJlYWQgb2YgdGhpcyBwcm9jZXNzIHJldHVybiAxIGFuZCBzZXQgInRzcCIuCisgKiBSZXR1cm4gMCBpZiB3ZSBjYW4ndC4KKyAqCisgKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiB0aGUgdGhyZWFkcyBvZiBQSVMgaGF2ZW4ndAorICogYmVlbiBzdG9wcGVkLCB1bmRlZmluZWQgYmVoYXZpb3VyIGlzIGd1YXJhbnRlZWQhCisgKi8KK3N0YXRpYyBpbnQgCitzZWxlY3Rfc3RvcHBlZF90aHJlYWRfb2ZfcHJvY2VzcyAocGlkLCB0c3ApCisgIGludCAgcGlkOworICB0dHN0YXRlX3QgKiAgdHNwOworeworICBsd3BpZF90ICAgIGNhbmRpZGF0ZV90aWQsICAgIHRpZDsKKyAgdHRzdGF0ZV90ICBjYW5kaWRhdGVfdHN0YXRlLCB0c3RhdGU7CisKKyAgLyogSWYgd2UncmUgbm90IGFsbG93ZWQgdG8gdG91Y2ggdGhlIHByb2Nlc3Mgbm93LCB0aGVuIGp1c3QKKyAgICogcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mICpUU1AuCisgICAqCisgICAqIFRoaXMgc3VwcG9ydHMgInZmb3JrIi4gIEl0J3Mgb2ssIHJlYWxseSwgdG8gZG91YmxlIHRoZQorICAgKiBjdXJyZW50IGV2ZW50ICh0aGUgY2hpbGQgRVhFQywgd2UgaG9wZSEpLgorICAgKi8KKyAgaWYgKCEgY2FuX3RvdWNoX3RocmVhZHNfb2ZfcHJvY2VzcyAocGlkLCB0c3AtPnR0c19ldmVudCkpCisgICAgcmV0dXJuIDE7CisKKyAgLyogRGVjaWRlIHdoaWNoIG9mIChwb3NzaWJseSBtb3JlIHRoYW4gb25lKSBldmVudHMgdG8KKyAgICogcmV0dXJuIGFzIHRoZSBmaXJzdCBvbmUuICBXZSBzY2FuIHRoZW0gYWxsIHNvIHRoYXQKKyAgICogd2UgYWx3YXlzIHJldHVybiB0aGUgcmVzdWx0IG9mIGEgZmFrZS1zdGVwIGZpcnN0LgorICAgKi8KKyAgY2FuZGlkYXRlX3RpZCA9IDA7CisgIGZvciAodGlkID0gZ2V0X3Byb2Nlc3NfZmlyc3Rfc3RvcHBlZF90aHJlYWRfaWQgKHBpZCwgJnRzdGF0ZSk7CisgICAgICAgdGlkICE9IDA7CisgICAgICAgdGlkID0gZ2V0X3Byb2Nlc3NfbmV4dF9zdG9wcGVkX3RocmVhZF9pZCAocGlkLCAmdHN0YXRlKSkKKyAgICB7CisgICAgICAvKiBUVEVWVF9OT05FIGV2ZW50cyBhcmUgdW5pbnRlcmVzdGluZyB0byBvdXIgY2xpZW50cy4gIFRoZXkncmUKKyAgICAgICAqIGFuIGFydGlmYWN0IG9mIG91ciAic3RvcCB0aGUgd29ybGQiIG1vZGVsLS10aGUgdGhyZWFkIGlzCisgICAgICAgKiBzdG9wcGVkIGJlY2F1c2Ugd2Ugc3RvcHBlZCBpdC4KKyAgICAgICAqLworICAgICAgaWYgKHRzdGF0ZS50dHNfZXZlbnQgPT0gVFRFVlRfTk9ORSkgeworICAgICAgICAgIHNldF9oYW5kbGVkKCBwaWQsIHRzdGF0ZS50dHNfbHdwaWQgKTsKKyAgICAgIH0KKworICAgICAgLyogRGlkIHdlIGp1c3Qgc2luZ2xlLXN0ZXAgYSBzaW5nbGUgdGhyZWFkLCB3aXRob3V0IGxldHRpbmcgYW55CisgICAgICAgKiBvZiB0aGUgb3RoZXJzIHJ1bj8gIElzIHRoaXMgYW4gZXZlbnQgZm9yIHRoYXQgdGhyZWFkPworICAgICAgICoKKyAgICAgICAqIElmIHNvLCB3ZSBiZWxpZXZlIG91ciBjbGllbnQgd291bGQgcHJlZmVyIHRvIHNlZSB0aGlzIGV2ZW50CisgICAgICAgKiBvdmVyIGFueSBvdGhlcnMuICAoVHlwaWNhbGx5IHRoZSBjbGllbnQgd2FudHMgdG8ganVzdCBwdXNoCisgICAgICAgKiBvbmUgdGhyZWFkIGEgbGl0dGxlIGZhcnRoZXIgZm9yd2FyZCwgYW5kIHRoZW4gZ28gYXJvdW5kCisgICAgICAgKiBjaGVja2luZyBmb3Igd2hhdCBhbGwgdGhyZWFkcyBhcmUgZG9pbmcuKQorICAgICAgICovCisgICAgICBlbHNlIGlmIChkb2luZ19mYWtlX3N0ZXAgJiYgKHRzdGF0ZS50dHNfbHdwaWQgPT0gZmFrZV9zdGVwX3RpZCkpCisgICAgICAgIHsKKyNpZmRlZiBXQUlUX0JVRkZFUl9ERUJVRworICAgICAgICAgIC8qIEl0J3MgcG9zc2libGUgaGVyZSB0byBzZWUgZWl0aGVyIGEgU0lHVFJBUCAoZHVlIHRvCisgICAgICAgICAgICogc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGEgc3RlcCkgb3IgYSBTWVNDQUxMX0VOVFJZCisgICAgICAgICAgICogKGR1ZSB0byBhIHN0ZXAgY29tcGxldGlvbiB3aXRoIGFjdGl2ZSBoYXJkd2FyZQorICAgICAgICAgICAqIHdhdGNocG9pbnRzKS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgICAgICAgIHByaW50ZiggIkVuZGluZyBmYWtlIHN0ZXAgd2l0aCB0aWQgJWQsIHN0YXRlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB0c3RhdGUudHRzX2x3cGlkLAorICAgICAgICAgICAgICAgICAgICAgICBnZXRfcHJpbnRhYmxlX25hbWVfb2ZfdHRyYWNlX2V2ZW50KCB0c3RhdGUudHRzX2V2ZW50ICkpOworI2VuZGlmIAorCisgICAgICAgICAgLyogUmVtZW1iZXIgdGhpcyBvbmUsIGFuZCB0aHJvdyBhd2F5IGFueSBwcmV2aW91cworICAgICAgICAgICAqIGNhbmRpZGF0ZS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBjYW5kaWRhdGVfdGlkICAgID0gdHN0YXRlLnR0c19sd3BpZDsKKyAgICAgICAgICBjYW5kaWRhdGVfdHN0YXRlID0gdHN0YXRlOworICAgICAgfQorCisjaWZkZWYgRk9SR0VUX0RFTEVURURfQlBUUworCisgICAgICAvKiBXZSBjYW4ndCBqdXN0IGRvIHRoaXMsIGFzIGlmIHdlIGRvLCBhbmQgdGhlbiB3aW5kCisgICAgICAgKiB1cCB0aGUgbG9vcCB3aXRoIG5vIHVuaGFuZGxlZCBldmVudHMsIHdlIG5lZWQgdG8KKyAgICAgICAqIGhhbmRsZSB0aGF0IGNhc2UtLXRoZSBhcHByb3ByaWF0ZSByZWFjdGlvbiBpcyB0bworICAgICAgICoganVzdCBjb250aW51ZSwgYnV0IHRoZXJlJ3Mgbm8gZWFzeSB3YXkgdG8gZG8gdGhhdC4KKyAgICAgICAqCisgICAgICAgKiBCZXR0ZXIgdG8gcHV0IHRoaXMgaW4gdGhlIHR0cmFjZV93YWl0IGNhbGwtLWlmLCB3aGVuCisgICAgICAgKiB3ZSBmYWtlIGEgd2FpdCwgd2UgdXBkYXRlIG91ciBldmVudHMgYmFzZWQgb24gdGhlCisgICAgICAgKiBicmVha3BvaW50X2hlcmVfcGMgY2FsbCBhbmQgZmluZCB0aGVyZSBhcmUgbm8gbW9yZSBldmVudHMsCisgICAgICAgKiB0aGVuIHdlIGJldHRlciBjb250aW51ZSBhbmQgc28gb24uCisgICAgICAgKgorICAgICAgICogT3Igd2UgY291bGQgcHV0IGl0IGluIHRoZSBuZXh0L2NvbnRpbnVlIGZha2UuCisgICAgICAgKiBCdXQgaXQgaGFzIHRvIGdvIGluIHRoZSBidWZmZXJpbmcgY29kZSwgbm90IGluIHRoZQorICAgICAgICogcmVhbCBnby93YWl0IGNvZGUuCisgICAgICAgKi8KKyAgICAgIGVsc2UgaWYoIChUVEVWVF9TSUdOQUwgPT0gdHN0YXRlLnR0c19ldmVudCkKKyAgICAgICAgICAgICYmICg1ID09IHRzdGF0ZS50dHNfdS50dHNfc2lnbmFsLnR0c19zaWdubykKKyAgICAgICAgICAgICYmICgwICE9IGdldF9yYXdfcGMoIHRzdGF0ZS50dHNfbHdwaWQgKSkKKyAgICAgICAgICAgICYmICEgYnJlYWtwb2ludF9oZXJlX3AoIGdldF9yYXdfcGMoIHRzdGF0ZS50dHNfbHdwaWQgKSkgKSB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBJZiB0aGUgdXNlciBkZWxldGVkIGEgYnJlYWtwb2ludCB3aGlsZSB0aGlzCisgICAgICAgICAgICogYnJlYWtwb2ludC1oaXQgZXZlbnQgd2FzIGJ1ZmZlcmVkLCB3ZSBjYW4gZm9yZ2V0CisgICAgICAgICAgICogaXQgbm93LgorICAgICAgICAgICAqLworI2lmZGVmIFdBSVRfQlVGRkVSX0RFQlVHCisgICAgICAgICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgICAgICAgICBwcmludGYoICJGb3JnZXR0aW5nIGRlbGV0ZWQgYnAgaGl0IGZvciB0aHJlYWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRzdGF0ZS50dHNfbHdwaWQgKTsKKyNlbmRpZiAKKworICAgICAgICAgIHNldF9oYW5kbGVkKCBwaWQsIHRzdGF0ZS50dHNfbHdwaWQgKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKiBFbHNlLCBpcyB0aGlzIHRoZSBmaXJzdCAidW5oYW5kbGVkIiBldmVudD8gIElmIHNvLAorICAgICAgICogd2UgYmVsaWV2ZSBvdXIgY2xpZW50IHdhbnRzIHRvIHNlZSBpdCAoaWYgd2UgZG9uJ3QKKyAgICAgICAqIHNlZSBhIGZha2Utc3RlcCBsYXRlciBvbiBpbiB0aGUgc2NhbikuCisgICAgICAgKi8KKyAgICAgIGVsc2UgaWYoICF3YXNfaGFuZGxlZCggdHN0YXRlLnR0c19sd3BpZCApICYmIGNhbmRpZGF0ZV90aWQgPT0gMCApIHsKKyAgICAgICAgICBjYW5kaWRhdGVfdGlkICAgID0gdHN0YXRlLnR0c19sd3BpZDsKKyAgICAgICAgICBjYW5kaWRhdGVfdHN0YXRlID0gdHN0YXRlOworICAgICAgfQorCisgICAgICAvKiBUaGlzIGlzIGVpdGhlciBhbiBldmVudCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gImhhbmRsZWQiLAorICAgICAgICogYW5kIHRodXMgd2UgYmVsaWV2ZSBpcyB1bmludGVyZXN0aW5nIHRvIG91ciBjbGllbnQsIG9yIHdlCisgICAgICAgKiBhbHJlYWR5IGhhdmUgYSBjYW5kaWRhdGUgZXZlbnQuICBJZ25vcmUgaXQuLi4KKyAgICAgICAqLworICAgIH0KKworICAvKiBXaGF0IGRvIHdlIHJlcG9ydD8KKyAgICovCisgIGlmKCBkb2luZ19mYWtlX3N0ZXAgKSB7CisgICAgICBpZiggY2FuZGlkYXRlX3RpZCA9PSBmYWtlX3N0ZXBfdGlkICkgeworICAgICAgICAgIC8qIEZha2Ugc3RlcC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICB0c3RhdGUgPSBjYW5kaWRhdGVfdHN0YXRlOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICAgd2FybmluZyggIkludGVybmFsIGVycm9yOiBmYWtlLXN0ZXAgZmFpbGVkIHRvIGNvbXBsZXRlLiIgKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgfQorICBlbHNlIGlmKCBjYW5kaWRhdGVfdGlkICE9IDAgKSB7CisgICAgICAvKiBGb3VuZCBhIGNhbmRpZGF0ZSB1bmhhbmRsZWQgZXZlbnQuCisgICAgICAgKi8KKyAgICAgIHRzdGF0ZSA9IGNhbmRpZGF0ZV90c3RhdGU7CisgIH0KKyAgZWxzZSBpZiggdGlkICE9IDAgKSB7CisgICAgICB3YXJuaW5nKCAiSW50ZXJuYWwgZXJyb3IgaW4gY2FsbCBvZiB0dHJhY2Vfd2FpdC4iICk7CisgICAgICByZXR1cm4gMDsKKyAgfQorICBlbHNlIHsKKyAgICAgIHdhcm5pbmcgKCJJbnRlcm5hbCBlcnJvcjogbm8gdW5oYW5kbGVkIHRocmVhZCBldmVudCB0byBzZWxlY3QiKTsKKyAgICAgIHJldHVybiAwOworICB9CisKKyAgY29weV90dHN0YXRlX3QgKHRzcCwgJnRzdGF0ZSk7CisgIHJldHVybiAxOworfSAvKiBFbmQgb2Ygc2VsZWN0X3N0b3BwZWRfdGhyZWFkX29mX3Byb2Nlc3MgKi8KKworI2lmZGVmIFBBUkFOT0lBCisvKiBDaGVjayBvdXIgaW50ZXJuYWwgdGhyZWFkIGRhdGEgYWdhaW5zdCB0aGUgcmVhbCB0aGluZy4KKyAqLworc3RhdGljIHZvaWQKK2NoZWNrX3RocmVhZF9jb25zaXN0ZW5jeSggcmVhbF9waWQgKQorICAgIHBpZF90IHJlYWxfcGlkOworeworICAgIGludCAgICAgICAgICB0aWQ7ICAgICAgIC8qIHJlYWxseSBsd3BpZF90ICovCisgICAgdHRzdGF0ZV90ICAgIHRzdGF0ZTsKKyAgICB0aHJlYWRfaW5mbyAqcDsKKworICAgIC8qIFNwaW4gZG93biB0aGUgTy9TIGxpc3Qgb2YgdGhyZWFkcywgY2hlY2tpbmcgdGhhdCB0aGV5CisgICAgICogbWF0Y2ggd2hhdCB3ZSd2ZSBnb3QuCisgICAgICovCisgICAgZm9yICh0aWQgPSBnZXRfcHJvY2Vzc19maXJzdF9zdG9wcGVkX3RocmVhZF9pZCggcmVhbF9waWQsICZ0c3RhdGUgKTsKKyAgICAgICAgIHRpZCAhPSAwOworICAgICAgICAgdGlkID0gZ2V0X3Byb2Nlc3NfbmV4dF9zdG9wcGVkX3RocmVhZF9pZCggIHJlYWxfcGlkLCAmdHN0YXRlICkpIHsKKyAgICAgICAKKyAgICAgICAgcCA9IGZpbmRfdGhyZWFkX2luZm8oIHRpZCApOworICAgICAgCisgICAgICAgIGlmKCBOVUxMID09IHAgKSB7CisgICAgICAgICAgICB3YXJuaW5nKCAiTm8gaW50ZXJuYWwgdGhyZWFkIGRhdGEgZm9yIHRocmVhZCAlZC4iLCB0aWQgKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYoICFwLT5zZWVuICkgeworICAgICAgICAgICAgd2FybmluZyggIkluY29uc2lzdGVudCBpbnRlcm5hbCB0aHJlYWQgZGF0YSBmb3IgdGhyZWFkICVkLiIsIHRpZCApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHAtPnRlcm1pbmF0ZWQgKSB7CisgICAgICAgICAgICB3YXJuaW5nKCAiVGhyZWFkICVkIGlzIG5vdCB0ZXJtaW5hdGVkLCBpbnRlcm5hbCBlcnJvci4iLCB0aWQgKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKworI2RlZmluZSBUVF9DT01QQVJFKCBmbGQgKSBcCisgICAgICAgICAgICB0c3RhdGUuZmxkICE9IHAtPmxhc3Rfc3RvcF9zdGF0ZS5mbGQKKyAgICAgICAgICAgIAorICAgICAgICBpZiggcC0+aGF2ZV9zdGF0ZSApIHsKKyAgICAgICAgICAgIGlmKCBUVF9DT01QQVJFKCB0dHNfcGlkICAgICAgKQorICAgICAgICAgICAgIHx8IFRUX0NPTVBBUkUoIHR0c19sd3BpZCAgICApCisgICAgICAgICAgICAgfHwgVFRfQ09NUEFSRSggdHRzX3VzZXJfdGlkICkKKyAgICAgICAgICAgICB8fCBUVF9DT01QQVJFKCB0dHNfZXZlbnQgICAgKQorICAgICAgICAgICAgIHx8IFRUX0NPTVBBUkUoIHR0c19mbGFncyAgICApCisgICAgICAgICAgICAgfHwgVFRfQ09NUEFSRSggdHRzX3Njbm8gICAgICkKKyAgICAgICAgICAgICB8fCBUVF9DT01QQVJFKCB0dHNfc2NuYXJncyAgKSkgeworICAgICAgICAgICAgICAgIHdhcm5pbmcoICJJbnRlcm5hbCB0aHJlYWQgZGF0YSBmb3IgdGhyZWFkICVkIGlzIHdyb25nLiIsIHRpZCApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorI2VuZGlmICAvKiBQQVJBTk9JQSAqLworCisMCisvKiBUaGlzIGZ1bmN0aW9uIHdyYXBzIGNhbGxzIHRvICJjYWxsX3JlYWxfdHRyYWNlX3dhaXQiIHNvCisgKiB0aGF0IGEgYWN0dWFsIHdhaXQgaXMgb25seSBkb25lIHdoZW4gYWxsIHBlbmRpbmcgZXZlbnRzCisgKiBoYXZlIGJlZW4gcmVwb3J0ZWQuCisgKgorICogTm90ZSB0aGF0IHR5cGljYWxseSBpdCBpcyBjYWxsZWQgd2l0aCBhIHBpZCBvZiAiMCIsIGkuZS4gCisgKiB0aGUgImRvbid0IGNhcmUiIHZhbHVlLgorICoKKyAqIFJldHVybiB2YWx1ZSBpcyB0aGUgc3RhdHVzIG9mIHRoZSBwc2V1ZG8gd2FpdC4KKyAqLworc3RhdGljIGludAorY2FsbF90dHJhY2Vfd2FpdCggcGlkLCBvcHRpb24sIHRzcCwgdHNwX3NpemUgKQorICBpbnQgICAgICAgIHBpZDsKKyAgdHR3b3B0X3QgICBvcHRpb247CisgIHR0c3RhdGVfdCAqdHNwOworICBzaXplX3QgICAgIHRzcF9zaXplOworeworICAvKiBUaGlzIGhvbGRzIHRoZSBhY3R1YWwsIGZvci1yZWFsLCB0cnVlIHByb2Nlc3MgSUQuCisgICAqLworICBzdGF0aWMgaW50IHJlYWxfcGlkOworCisgIC8qIEFzIGFuIGFyZ3VtZW50IHRvIHR0cmFjZV93YWl0LCB6ZXJvIHBpZAorICAgKiBtZWFucyAiQW55IHByb2Nlc3MiLCBhbmQgemVybyB0aWQgbWVhbnMKKyAgICogIkFueSB0aHJlYWQgb2YgdGhlIHNwZWNpZmllZCBwcm9jZXNzIi4KKyAgICovCisgIGludCAgICAgIHdhaXRfcGlkID0gMDsKKyAgbHdwaWRfdCAgd2FpdF90aWQgPSAwOworICBsd3BpZF90ICByZWFsX3RpZDsKKworICBpbnQgICAgICAgdHR3X3N0YXR1cyA9IDA7ICAgLyogVG8gYmUgcmV0dXJuZWQgKi8KKworICB0aHJlYWRfaW5mbyAqICB0aW5mbyA9IE5VTEw7CisKKyAgaWYoIHBpZCAhPSAwICkgeworICAgICAgLyogVW5leHBlY3RlZCBjYXNlLgorICAgICAgICovCisjaWZkZWYgVEhSRUFEX0RFQlVHCisgICAgICBpZiggZGVidWdfb24gKQorICAgICAgICAgIHByaW50ZiggIlRXOiBQaWQgdG8gd2FpdCBvbiBpcyAlZFxuIiwgcGlkICk7CisjZW5kaWYKKworICAgICAgaWYoICFhbnlfdGhyZWFkX3JlY29yZHMoKSkKKyAgICAgICAgICBlcnJvciggIk5vIHRocmVhZCByZWNvcmRzIGZvciB0dHJhY2UgY2FsbCB3LiBzcGVjaWZpYyBwaWQiICk7CisKKyAgICAgIC8qIE9LLCBub3cgdGhlIHRhc2sgaXMgdG8gdHJhbnNsYXRlIHRoZSBpbmNvbWluZyB0aWQgaW50bworICAgICAgICogYSBwaWQvdGlkIHBhaXIuCisgICAgICAgKi8KKyAgICAgIHJlYWxfdGlkID0gbWFwX2Zyb21fZ2RiX3RpZCggcGlkICk7CisgICAgICByZWFsX3BpZCA9IGdldF9waWRfZm9yKCByZWFsX3RpZCApOworI2lmZGVmIFRIUkVBRF9ERUJVRworICAgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgICBwcmludGYoICI9PVRXOiByZWFsIHBpZCAlZCwgcmVhbCB0aWQgJWRcbiIsIHJlYWxfcGlkLCByZWFsX3RpZCApOworI2VuZGlmCisgIH0KKworCisgIC8qIFNhbml0eSBjaGVja3MgYW5kIHNldC11cC4KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MgU3RhdGUKKyAgICoKKyAgICogICAgICAgICAgICAgICAgICAgICAgICBTdG9wcGVkICAgUnVubmluZyAgICBGYWtlLXN0ZXAgICh2KUZvcmsKKyAgICogICAgICAgICAgICAgICAgICAgICAgXF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAgICogICAgICAgICAgICAgICAgICAgICAgfAorICAgKiAgTm8gYnVmZmVyZWQgZXZlbnRzICB8ICBlcnJvciAgICAgd2FpdCAgICAgICB3YWl0ICAgICAgd2FpdAorICAgKiAgICAgICAgICAgICAgICAgICAgICB8CisgICAqICBCdWZmZXJlZCBldmVudHMgICAgIHwgIGRlYnVmZmVyICBlcnJvciAgICAgIHdhaXQgICAgICBkZWJ1ZmZlciAoPykKKyAgICoKKyAgICovCisgIGlmKCBtb3JlX2V2ZW50c19sZWZ0ID09IDAgKSB7CisKKyAgICAgIGlmKCBwcm9jZXNzX3N0YXRlID09IFJVTk5JTkcgKSB7CisgICAgICAgICAgLyogT0stLW5vcm1hbCBjYWxsIG9mIHR0cmFjZV93YWl0IHdpdGggbm8gYnVmZmVyZWQgZXZlbnRzLgorICAgICAgICAgICAqLworICAgICAgICAgIDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoIHByb2Nlc3Nfc3RhdGUgPT0gRkFLRV9TVEVQUElORyApIHsKKyAgICAgICAgICAvKiBPay0tY2FsbCBvZiB0dHJhY2Vfd2FpdCB0byBzdXBwb3J0CisgICAgICAgICAgICogZmFrZSBzdGVwcGluZyB3aXRoIG5vIGJ1ZmZlcmVkIGV2ZW50cy4KKyAgICAgICAgICAgKgorICAgICAgICAgICAqIEJ1dCB3ZSBiZXR0ZXIgYmUgZmFrZS1zdGVwcGluZyEKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiggIWRvaW5nX2Zha2Vfc3RlcCApIHsKKyAgICAgICAgICAgICAgd2FybmluZyggIkluY29uc2lzdGVudCB0aHJlYWQgc3RhdGUuIiApOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoIChwcm9jZXNzX3N0YXRlID09IEZPUktJTkcpCisgICAgICAgICAgICB8fCAocHJvY2Vzc19zdGF0ZSA9PSBWRk9SS0lORykpIHsKKyAgICAgICAgICAvKiBPay0tdGhlcmUgYXJlIHR3byBwcm9jZXNzZXMsIHNvIHdhaXRpbmcKKyAgICAgICAgICAgKiBmb3IgdGhlIHNlY29uZCB3aGlsZSB0aGUgZmlyc3QgaXMgc3RvcHBlZAorICAgICAgICAgICAqIGlzIG9rLiAgSGFuZGxlZCBiaXRzIHN0YXkgYXMgdGhleSB3ZXJlLgorICAgICAgICAgICAqLworICAgICAgICAgICA7CisgICAgICB9CisgICAgICBlbHNlIGlmKCBwcm9jZXNzX3N0YXRlID09IFNUT1BQRUQgKSB7CisgICAgICAgICAgd2FybmluZyggIlByb2Nlc3Mgbm90IHJ1bm5pbmcgYXQgd2FpdCBjYWxsLiIgKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgICAvKiBObyBrbm93biBzdGF0ZS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICB3YXJuaW5nKCAiSW5jb25zaXN0ZW50IHByb2Nlc3Mgc3RhdGUuIiApOworICB9CisgIAorICBlbHNlIHsKKyAgICAgIC8qIE1vcmUgZXZlbnRzIGxlZnQKKyAgICAgICAqLworICAgICAgaWYoIHByb2Nlc3Nfc3RhdGUgPT0gU1RPUFBFRCApIHsKKyAgICAgICAgICAvKiBPSy0tYnVmZmVyZWQgZXZlbnRzIGJlaW5nIHVuYnVmZmVyZWQuCisgICAgICAgICAgICovCisgICAgICAgICAgOworICAgICAgfQorICAgICAgZWxzZSBpZiggcHJvY2Vzc19zdGF0ZSA9PSBSVU5OSU5HICkgeworICAgICAgICAgIC8qIEFuIGVycm9yLS1zaG91bGRuJ3QgaGF2ZSBidWZmZXJlZCBldmVudHMKKyAgICAgICAgICAgKiB3aGVuIHJ1bm5pbmcuCisgICAgICAgICAgICovCisgICAgICAgICAgd2FybmluZyggIlRyeWluZyB0byBjb250aW51ZSB3aXRoIGJ1ZmZlcmVkIGV2ZW50czoiICk7CisgICAgICB9CisgICAgICBlbHNlIGlmKCBwcm9jZXNzX3N0YXRlID09IEZBS0VfU1RFUFBJTkcgKSB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBCZXR0ZXIgYmUgZmFrZS1zdGVwcGluZyEKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiggIWRvaW5nX2Zha2Vfc3RlcCApIHsKKyAgICAgICAgICAgICAgd2FybmluZyggIkxvc2luZyBidWZmZXJlZCB0aHJlYWQgZXZlbnRzIVxuIiApOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoIChwcm9jZXNzX3N0YXRlID09IEZPUktJTkcpCisgICAgICAgICAgICB8fCAocHJvY2Vzc19zdGF0ZSA9PSBWRk9SS0lORykpIHsKKyAgICAgICAgICAvKiBPay0tdGhlcmUgYXJlIHR3byBwcm9jZXNzZXMsIHNvIHdhaXRpbmcKKyAgICAgICAgICAgKiBmb3IgdGhlIHNlY29uZCB3aGlsZSB0aGUgZmlyc3QgaXMgc3RvcHBlZAorICAgICAgICAgICAqIGlzIG9rLiAgSGFuZGxlZCBiaXRzIHN0YXkgYXMgdGhleSB3ZXJlLgorICAgICAgICAgICAqLworICAgICAgICAgICA7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICAgd2FybmluZyggIlByb2Nlc3MgaW4gdW5rbm93biBzdGF0ZSB3aXRoIGJ1ZmZlcmVkIGV2ZW50cy4iICk7CisgIH0KKworICAvKiBTb21ldGltZXMgd2UgaGF2ZSB0byB3YWl0IGZvciBhIHBhcnRpY3VsYXIgdGhyZWFkCisgICAqIChpZiB3ZSdyZSBzdGVwcGluZyBvdmVyIGEgYnB0KS4gIEluIHRoYXQgY2FzZSwgd2UKKyAgICogX2tub3dfIGl0J3MgZ29pbmcgdG8gY29tcGxldGUgdGhlIHNpbmdsZS1zdGVwIHdlCisgICAqIGFza2VkIGZvciAoYmVjYXVzZSB3ZSdyZSBvbmx5IGRvaW5nIHRoZSBzdGVwIHVuZGVyCisgICAqIGNlcnRhaW4gdmVyeSB3ZWxsLXVuZGVyc3Rvb2QgY2lyY3Vtc3RhbmNlcyksIHNvIGl0CisgICAqIGNhbid0IGJsb2NrLgorICAgKi8KKyAgaWYoIGRvaW5nX2Zha2Vfc3RlcCApIHsKKyAgICAgIHdhaXRfdGlkID0gZmFrZV9zdGVwX3RpZDsKKyAgICAgIHdhaXRfcGlkID0gZ2V0X3BpZF9mb3IoIGZha2Vfc3RlcF90aWQgKTsKKworI2lmZGVmIFdBSVRfQlVGRkVSX0RFQlVHCisgICAgICBpZiggZGVidWdfb24gKQorICAgICAgICAgIHByaW50ZiggIkRvaW5nIGEgd2FpdCBhZnRlciBhIGZha2Utc3RlcCBmb3IgJWQsIHBpZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHdhaXRfdGlkLCB3YWl0X3BpZCApOworI2VuZGlmCisgIH0KKworICBpZiggbW9yZV9ldmVudHNfbGVmdCA9PSAwICAgICAgICAgLyogTm8gYnVmZmVyZWQgZXZlbnRzLCBuZWVkIHJlYWwgb25lcy4gKi8KKyAgfHwgIHByb2Nlc3Nfc3RhdGUgIT0gU1RPUFBFRCApIHsKKyAgICAgIC8qIElmIHRoZXJlIGFyZSBubyBidWZmZXJlZCBldmVudHMsIGFuZCBzbyB3ZSBuZWVkCisgICAgICAgKiByZWFsIG9uZXMsIG9yIGlmIHdlIGFyZSBGT1JLSU5HLCBWRk9SS0lORywgCisgICAgICAgKiBGQUtFX1NURVBQSU5HIG9yIFJVTk5JTkcsIGFuZCB0aHVzIGhhdmUgdG8gZG8KKyAgICAgICAqIGEgcmVhbCB3YWl0LCB0aGVuIGRvIGEgcmVhbCB3YWl0LgorICAgICAgICovCisKKyNpZmRlZiBXQUlUX0JVRkZFUl9ERUJVRworICAgICAgLyogTm9ybWFsIGNhc2UuLi4gKi8KKyAgICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgICAgcHJpbnRmKCAiVFc6IGRvIGl0IGZvciByZWFsOyBwaWQgJWQsIHRpZCAlZFxuIiwgd2FpdF9waWQsIHdhaXRfdGlkICk7CisjZW5kaWYKKworICAgICAgLyogVGhlIGFjdHVhbCB3YWl0IGNhbGwuCisgICAgICAgKi8KKyAgICAgIHR0d19zdGF0dXMgPSBjYWxsX3JlYWxfdHRyYWNlX3dhaXQoIHdhaXRfcGlkLCB3YWl0X3RpZCwgb3B0aW9uLCB0c3AsIHRzcF9zaXplKTsKKworICAgICAgLyogTm90ZSB0aGF0IHRoZSByb3V0aW5lcyB3ZSdsbCBjYWxsIHdpbGwgYmUgdXNpbmcgImNhbGxfcmVhbF90dHJhY2UiLAorICAgICAgICogbm90ICJjYWxsX3R0cmFjZSIsIGFuZCB0aHVzIG5lZWQgdGhlIHJlYWwgcGlkIHJhdGhlciB0aGFuIHRoZSBwc2V1ZG8tdGlkCisgICAgICAgKiB0aGUgcmVzdCBvZiB0aGUgd29ybGQgdXNlcyAod2hpY2ggaXMgYWN0dWFsbHkgdGhlIHRpZCkuCisgICAgICAgKi8KKyAgICAgIHJlYWxfcGlkID0gdHNwLT50dHNfcGlkOworCisgICAgICAvKiBGb3IgbW9zdCBldmVudHM6IFN0b3AgdGhlIHdvcmxkIQorICAgICAgICoKKyAgICAgICAqIEl0J3Mgc29tZXRpbWVzIG5vdCBzYWZlIHRvIHN0b3AgYWxsIHRocmVhZHMgb2YgYSBwcm9jZXNzLgorICAgICAgICogU29tZXRpbWVzIGl0J3Mgbm90IGV2ZW4gc2FmZSB0byBhc2sgZm9yIHRoZSB0aHJlYWQgc3RhdGUKKyAgICAgICAqIG9mIGEgcHJvY2VzcyEKKyAgICAgICAqLworICAgICAgaWYgKGNhbl90b3VjaF90aHJlYWRzX29mX3Byb2Nlc3MgKHJlYWxfcGlkLCB0c3AtPnR0c19ldmVudCkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJZiB3ZSdyZSByZWFsbHkgb25seSBzdGVwcGluZyBhIHNpbmdsZSB0aHJlYWQsIHRoZW4gZG9uJ3QKKyAgICAgICAgICAgKiB0cnkgdG8gc3RvcCBhbGwgdGhlIG90aGVycyAtLSB3ZSBvbmx5IGRvIHRoaXMgc2luZ2xlLXN0ZXBwaW5nCisgICAgICAgICAgICogYnVzaW5lc3Mgd2hlbiBhbGwgb3RoZXJzIHdlcmUgYWxyZWFkeSBzdG9wcGVkLi4uYW5kIHRoZSBzdG9wCisgICAgICAgICAgICogd291bGQgbWVzcyB1cCBvdGhlciB0aHJlYWRzJyBldmVudHMuCisgICAgICAgICAgICoKKyAgICAgICAgICAgKiBTaW1pbGlhcmx5LCBpZiB0aGVyZSBhcmUgb3RoZXIgdGhyZWFkcyB3aXRoIGV2ZW50cywKKyAgICAgICAgICAgKiBkb24ndCBkbyB0aGUgc3RvcC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiggIWRvaW5nX2Zha2Vfc3RlcCApIHsKKyAgICAgICAgICAgIGlmKCBtb3JlX2V2ZW50c19sZWZ0ID4gMCApCisgICAgICAgICAgICAgICAgd2FybmluZyggIkludGVybmFsIGVycm9yIGluIHN0b3BwaW5nIHByb2Nlc3MiICk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBzdG9wX2FsbF90aHJlYWRzX29mX3Byb2Nlc3MgKHJlYWxfcGlkKTsKKworICAgICAgICAgICAgLyogQXQgdGhpcyBwb2ludCwgd2UgY291bGQgc2NhbiBhbmQgdXBkYXRlX3RocmVhZF9saXN0KCksCisgICAgICAgICAgICAgKiBhbmQgb25seSB1c2UgdGhlIGxvY2FsIGxpc3QgZm9yIHRoZSByZXN0IG9mIHRoZQorICAgICAgICAgICAgICogbW9kdWxlISBXZSdkIGdldCByaWQgb2YgdGhlIHNjYW5zIGluIHRoZSB2YXJpb3VzCisgICAgICAgICAgICAgKiBjb250aW51ZSByb3V0aW5lcyAoYWRkaW5nIG9uZSBpbiBhdHRhY2gpLiAgSXQnZAorICAgICAgICAgICAgICogYmUgZ3JlYXQtLVVQR1JBREUgTUUhCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyNpZmRlZiBQQVJBTk9JQQorICAgICAgZWxzZSBpZiggZGVidWdfb24gKSB7CisgICAgICAgICAgaWYoIG1vcmVfZXZlbnRzX2xlZnQgPiAwICkKKyAgICAgICAgICAgICAgcHJpbnRmKCAiPT0gQ2FuJ3Qgc3RvcCBwcm9jZXNzOyBtb3JlIGV2ZW50cyFcbiIgKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHByaW50ZiggIj09IENhbid0IHN0b3AgcHJvY2VzcyFcbiIgKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBwcm9jZXNzX3N0YXRlICAgPSBTVE9QUEVEOworCisjaWZkZWYgV0FJVF9CVUZGRVJfREVCVUcKKyAgICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgICAgcHJpbnRmKCAiUHJvY2VzcyBzZXQgdG8gU1RPUFBFRFxuIiApOworI2VuZGlmCisgIH0KKyAgCisgIGVsc2UgeworICAgICAgLyogRmFrZSBhIGNhbGwgdG8gdHRyYWNlX3dhaXQuICBUaGUgcHJvY2VzcyBtdXN0IGJlCisgICAgICAgKiBTVE9QUEVELCBhcyB3ZSBhcmVuJ3QgZ29pbmcgdG8gZG8gYW55IHdhaXQuCisgICAgICAgKi8KKyNpZmRlZiBXQUlUX0JVRkZFUl9ERUJVRworICAgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgICBwcmludGYoICJUVzogZmFrZSBpdFxuIiApOworI2VuZGlmCisKKyAgICAgIGlmKCBwcm9jZXNzX3N0YXRlICE9IFNUT1BQRUQgKSB7CisgICAgICAgICAgd2FybmluZyggIlByb2Nlc3Mgbm90IHN0b3BwZWQgYXQgd2FpdCBjYWxsLCBpbiBzdGF0ZSAnJXMnLlxuIiwKKyAgICAgICAgICAgICAgICAgICBnZXRfcHJpbnRhYmxlX25hbWVfb2ZfcHJvY2Vzc19zdGF0ZSggcHJvY2Vzc19zdGF0ZSApKTsKKyAgICAgIH0KKyAgICAKKyAgICAgIGlmKCBkb2luZ19mYWtlX3N0ZXAgKQorICAgICAgICAgIGVycm9yKCAiSW50ZXJuYWwgZXJyb3IgaW4gc3RlcHBpbmcgb3ZlciBicmVha3BvaW50IiApOworCisgICAgICB0dHdfc3RhdHVzID0gMDsgIC8qIEZha2luZyBpdCBpcyBhbHdheXMgc3VjY2Vzc2Z1bCEgKi8KKyAgfSAgIC8qIEVuZCBvZiBmYWtlIG9yIG5vdD8gaWYgKi8KKworICAvKiBQaWNrIGFuIGV2ZW50IHRvIHBhc3MgdG8gb3VyIGNhbGxlci4gIEJlIHBhcmFub2lkLgorICAgKi8KKyAgaWYoICFzZWxlY3Rfc3RvcHBlZF90aHJlYWRfb2ZfcHJvY2VzcyggcmVhbF9waWQsIHRzcCApKQorICAgICAgd2FybmluZyggIkNhbid0IGZpbmQgZXZlbnQsIHVzaW5nIHByZXZpb3VzIGV2ZW50LiIgKTsKKworICBlbHNlIGlmKCB0c3AtPnR0c19ldmVudCA9PSBUVEVWVF9OT05FICkKKyAgICAgIHdhcm5pbmcoICJJbnRlcm5hbCBlcnJvcjogbm8gdGhyZWFkIGhhcyBhIHJlYWwgZXZlbnQuIiApOworCisgIGVsc2UgaWYoIGRvaW5nX2Zha2Vfc3RlcCApIHsKKyAgICAgIGlmKCBmYWtlX3N0ZXBfdGlkICE9IHRzcC0+dHRzX2x3cGlkICkKKyAgICAgICAgICB3YXJuaW5nKCAiSW50ZXJuYWwgZXJyb3IgaW4gc3RlcHBpbmcgb3ZlciBicmVha3BvaW50LiIgKTsKKyAgICAgICAgICAKKyAgICAgIC8qIFRoaXMgd2FpdCBjbGVhcnMgdGhlIChjdXJyZW50KSBmYWtlLXN0ZXAgaWYgdGhlcmUgd2FzIG9uZS4KKyAgICAgICAqLworICAgICAgZG9pbmdfZmFrZV9zdGVwID0gMDsKKyAgICAgIGZha2Vfc3RlcF90aWQgICA9IDA7CisgIH0KKworICAvKiBXZSBub3cgaGF2ZSBhIGNvcnJlY3QgdHNwIGFuZCB0dHdfc3RhdHVzIGZvciB0aGUgdGhyZWFkCisgICAqIHdoaWNoIHdlIHdhbnQgdG8gcmVwb3J0LiAgU28gaXQncyAiaGFuZGxlZCIhICBUaGlzIGNhbGwKKyAgICogd2lsbCBhZGQgaXQgdG8gb3VyIGxpc3QgaWYgaXQncyBub3QgdGhlcmUgYWxyZWFkeS4KKyAgICovCisgIHNldF9oYW5kbGVkKCByZWFsX3BpZCwgdHNwLT50dHNfbHdwaWQgKTsKKworICAvKiBTYXZlIGEgY29weSBvZiB0aGUgdHRyYWNlIHN0YXRlIG9mIHRoaXMgdGhyZWFkLCBpbiBvdXIgbG9jYWwKKyAgICAgdGhyZWFkIGRlc2NyaXB0b3IuCisKKyAgICAgVGhpcyBjYWNoZXMgdGhlIHN0YXRlLiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHF1ZXJpZXMgbGlrZQorICAgICB0YXJnZXRfaGFzX2V4ZWNkIGNhbiB0aGVuIHVzZSB0aGlzIGNhY2hlZCBzdGF0ZSwgcmF0aGVyIHRoYW4KKyAgICAgYmUgZm9yY2VkIHRvIG1ha2UgYW4gZXhwbGljaXQgdHRyYWNlIGNhbGwgdG8gZ2V0IGl0LgorCisgICAgIChHdWFyZCBhZ2FpbnN0IHRoZSBjb25kaXRpb24gdGhhdCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlCisgICAgIHdhaXRlZCBvbiwgaS5lLiwgc2VlbiB0aGlzIHRocmVhZCwgYW5kIHNvIGhhdmVuJ3QgeWV0IGVudGVyZWQKKyAgICAgaXQgaW50byBvdXIgbGlzdCBvZiB0aHJlYWRzLikKKyAgICovCisgIHRpbmZvID0gZmluZF90aHJlYWRfaW5mbyAodHNwLT50dHNfbHdwaWQpOworICBpZiAodGluZm8gIT0gTlVMTCkgeworICAgIGNvcHlfdHRzdGF0ZV90ICgmdGluZm8tPmxhc3Rfc3RvcF9zdGF0ZSwgdHNwKTsKKyAgICB0aW5mby0+aGF2ZV9zdGF0ZSA9IDE7CisgIH0KKyAgCisgIHJldHVybiB0dHdfc3RhdHVzOworfSAvKiBjYWxsX3R0cmFjZV93YWl0ICovCisKKyNpZiBkZWZpbmVkKENISUxEX1JFUE9SVEVEX0VYRUNfRVZFTlRTX1BFUl9FWEVDX0NBTEwpCitpbnQKK2NoaWxkX3JlcG9ydGVkX2V4ZWNfZXZlbnRzX3Blcl9leGVjX2NhbGwgKCkKK3sKKyAgcmV0dXJuIDE7ICAvKiB0dHJhY2UgcmVwb3J0cyB0aGUgZXZlbnQgb25jZSBwZXIgY2FsbC4gKi8KK30KKyNlbmRpZgorCisKKwwKKy8qIE91ciBpbXBsZW1lbnRhdGlvbiBvZiBoYXJkd2FyZSB3YXRjaHBvaW50cyBpbnZvbHZlcyBtYWtpbmcgbWVtb3J5CisgICBwYWdlcyB3cml0ZS1wcm90ZWN0ZWQuICBXZSBtdXN0IHJlbWVtYmVyIGEgcGFnZSdzIG9yaWdpbmFsIHBlcm1pc3Npb25zLAorICAgYW5kIHdlIG11c3QgYWxzbyBrbm93IHdoZW4gaXQgaXMgYXBwcm9wcmlhdGUgdG8gcmVzdG9yZSBhIHBhZ2UncworICAgcGVybWlzc2lvbnMgdG8gaXRzIG9yaWdpbmFsIHN0YXRlLgorCisgICBXZSB1c2UgYSAiZGljdGlvbmFyeSIgb2YgaGFyZHdhcmUtd2F0Y2hlZCBwYWdlcyB0byBkbyB0aGlzLiAgRWFjaAorICAgaGFyZHdhcmUtd2F0Y2hlZCBwYWdlIGlzIHJlY29yZGVkIGluIHRoZSBkaWN0aW9uYXJ5LiAgRWFjaCBwYWdlJ3MKKyAgIGRpY3Rpb25hcnkgZW50cnkgY29udGFpbnMgdGhlIG9yaWdpbmFsIHBlcm1pc3Npb25zIGFuZCBhIHJlZmVyZW5jZQorICAgY291bnQuICBQYWdlcyBhcmUgaGFzaGVkIGludG8gdGhlIGRpY3Rpb25hcnkgYnkgdGhlaXIgc3RhcnQgYWRkcmVzcy4KKworICAgV2hlbiBoYXJkd2FyZSB3YXRjaHBvaW50IGlzIHNldCBvbiBwYWdlIFggZm9yIHRoZSBmaXJzdCB0aW1lLCBwYWdlIFgKKyAgIGlzIGFkZGVkIHRvIHRoZSBkaWN0aW9uYXJ5IHdpdGggYSByZWZlcmVuY2UgY291bnQgb2YgMS4gIElmIG90aGVyCisgICBoYXJkd2FyZSB3YXRjaHBvaW50cyBhcmUgc3Vic2VxdWVudGx5IHNldCBvbiBwYWdlIFgsIGl0cyByZWZlcmVuY2UKKyAgIGNvdW50IGlzIGluY3JlbWVudGVkLiAgV2hlbiBoYXJkd2FyZSB3YXRjaHBvaW50cyBhcmUgcmVtb3ZlZCBmcm9tCisgICBwYWdlIFgsIGl0cyByZWZlcmVuY2UgY291bnQgaXMgZGVjcmVtZW50ZWQuICBJZiBhIHBhZ2UncyByZWZlcmVuY2UKKyAgIGNvdW50IGRyb3BzIHRvIDAsIGl0J3MgcGVybWlzc2lvbnMgYXJlIHJlc3RvcmVkIGFuZCB0aGUgcGFnZSdzIGVudHJ5CisgICBpcyB0aHJvd24gb3V0IG9mIHRoZSBkaWN0aW9uYXJ5LgorICAgKi8KK3R5cGVkZWYgc3RydWN0IG1lbW9yeV9wYWdlIHsKKyAgQ09SRV9BRERSICBwYWdlX3N0YXJ0OworICBpbnQgIHJlZmVyZW5jZV9jb3VudDsKKyAgaW50ICBvcmlnaW5hbF9wZXJtaXNzaW9uczsKKyAgc3RydWN0IG1lbW9yeV9wYWdlICogIG5leHQ7CisgIHN0cnVjdCBtZW1vcnlfcGFnZSAqICBwcmV2aW91czsKK30gbWVtb3J5X3BhZ2VfdDsKKworI2RlZmluZSBNRU1PUllfUEFHRV9ESUNUSU9OQVJZX0JVQ0tFVF9DT1VOVCAgMTI4CisKK3N0YXRpYyBzdHJ1Y3QgeworICBMT05HRVNUICBwYWdlX2NvdW50OworICBpbnQgIHBhZ2Vfc2l6ZTsKKyAgaW50ICBwYWdlX3Byb3RlY3Rpb25zX2FsbG93ZWQ7CisgIC8qIFRoZXNlIGFyZSBqdXN0IHRoZSBoZWFkcyBvZiBjaGFpbnMgb2YgYWN0dWFsIHBhZ2UgZGVzY3JpcHRvcnMuICovCisgIG1lbW9yeV9wYWdlX3QgIGJ1Y2tldHMgW01FTU9SWV9QQUdFX0RJQ1RJT05BUllfQlVDS0VUX0NPVU5UXTsKK30gbWVtb3J5X3BhZ2VfZGljdGlvbmFyeTsKKworCitzdGF0aWMgdm9pZAorcmVxdWlyZV9tZW1vcnlfcGFnZV9kaWN0aW9uYXJ5ICgpCit7CisgIGludCAgaTsKKworICAvKiBJcyB0aGUgbWVtb3J5IHBhZ2UgZGljdGlvbmFyeSByZWFkeSBmb3IgdXNlPyAgSWYgc28sIHdlJ3JlIGRvbmUuICovCisgIGlmIChtZW1vcnlfcGFnZV9kaWN0aW9uYXJ5LnBhZ2VfY291bnQgPj0gKExPTkdFU1QpIDApCisgICAgcmV0dXJuOworCisgIC8qIEVsc2UsIGluaXRpYWxpemUgaXQuICovCisgIG1lbW9yeV9wYWdlX2RpY3Rpb25hcnkucGFnZV9jb3VudCA9IChMT05HRVNUKSAwOworCisgIGZvciAoaT0wOyBpPE1FTU9SWV9QQUdFX0RJQ1RJT05BUllfQlVDS0VUX0NPVU5UOyBpKyspCisgICAgeworICAgICAgbWVtb3J5X3BhZ2VfZGljdGlvbmFyeS5idWNrZXRzW2ldLnBhZ2Vfc3RhcnQgPSAoQ09SRV9BRERSKSAwOworICAgICAgbWVtb3J5X3BhZ2VfZGljdGlvbmFyeS5idWNrZXRzW2ldLnJlZmVyZW5jZV9jb3VudCA9IDA7CisgICAgICBtZW1vcnlfcGFnZV9kaWN0aW9uYXJ5LmJ1Y2tldHNbaV0ubmV4dCA9IE5VTEw7CisgICAgICBtZW1vcnlfcGFnZV9kaWN0aW9uYXJ5LmJ1Y2tldHNbaV0ucHJldmlvdXMgPSBOVUxMOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorcmV0aXJlX21lbW9yeV9wYWdlX2RpY3Rpb25hcnkgKCkKK3sKKyAgbWVtb3J5X3BhZ2VfZGljdGlvbmFyeS5wYWdlX2NvdW50ID0gKExPTkdFU1QpIC0xOworfQorCisKKy8qIFdyaXRlLXByb3RlY3QgdGhlIG1lbW9yeSBwYWdlIHRoYXQgc3RhcnRzIGF0IHRoaXMgYWRkcmVzcy4KKworICAgUmV0dXJucyB0aGUgb3JpZ2luYWwgcGVybWlzc2lvbnMgb2YgdGhlIHBhZ2UuCisgKi8KK3N0YXRpYyBpbnQKK3dyaXRlX3Byb3RlY3RfcGFnZSAocGlkLCBwYWdlX3N0YXJ0KQorICBpbnQgICAgICAgcGlkOworICBDT1JFX0FERFIgcGFnZV9zdGFydDsKK3sKKyAgaW50ICB0dF9zdGF0dXM7CisgIGludCAgb3JpZ2luYWxfcGVybWlzc2lvbnM7CisgIGludCAgbmV3X3Blcm1pc3Npb25zOworCisgIHR0X3N0YXR1cyA9IGNhbGxfdHRyYWNlIChUVF9QUk9DX0dFVF9NUFJPVEVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIHBhZ2Vfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9OSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSAmb3JpZ2luYWxfcGVybWlzc2lvbnMpOworICBpZiAoZXJybm8gfHwgKHR0X3N0YXR1cyA8IDApKQorICAgIHsKKyAgICAgIHJldHVybiAwOyAgLyogV2hhdCBlbHNlIGNhbiB3ZSBkbz8gKi8KKyAgICB9CisKKyAgLyogV2UnbGwgYWxzbyB3cml0ZS1wcm90ZWN0IHRoZSBwYWdlIG5vdywgaWYgdGhhdCdzIGFsbG93ZWQuICovCisgIGlmIChtZW1vcnlfcGFnZV9kaWN0aW9uYXJ5LnBhZ2VfcHJvdGVjdGlvbnNfYWxsb3dlZCkKKyAgICB7CisgICAgICBuZXdfcGVybWlzc2lvbnMgPSBvcmlnaW5hbF9wZXJtaXNzaW9ucyAmIH5QUk9UX1dSSVRFOworICAgICAgdHRfc3RhdHVzID0gY2FsbF90dHJhY2UgKFRUX1BST0NfU0VUX01QUk9URUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBwYWdlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIG1lbW9yeV9wYWdlX2RpY3Rpb25hcnkucGFnZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIG5ld19wZXJtaXNzaW9ucyk7CisgICAgICBpZiAoZXJybm8gfHwgKHR0X3N0YXR1cyA8IDApKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIDA7ICAvKiBXaGF0IGVsc2UgY2FuIHdlIGRvPyAqLworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiBvcmlnaW5hbF9wZXJtaXNzaW9uczsKK30KKworCisvKiBVbndyaXRlLXByb3RlY3QgdGhlIG1lbW9yeSBwYWdlIHRoYXQgc3RhcnRzIGF0IHRoaXMgYWRkcmVzcywgcmVzdG9yaW5nCisgICAod2hhdCB3ZSBtdXN0IGFzc3VtZSBhcmUpIGl0cyBvcmlnaW5hbCBwZXJtaXNzaW9ucy4KKyAgICovCitzdGF0aWMgdm9pZAordW53cml0ZV9wcm90ZWN0X3BhZ2UgKHBpZCwgcGFnZV9zdGFydCwgb3JpZ2luYWxfcGVybWlzc2lvbnMpCisgIGludCAgcGlkOworICBDT1JFX0FERFIgIHBhZ2Vfc3RhcnQ7CisgIGludCAgb3JpZ2luYWxfcGVybWlzc2lvbnM7Cit7CisgIGludCAgdHRfc3RhdHVzOworCisgIHR0X3N0YXR1cyA9IGNhbGxfdHRyYWNlIChUVF9QUk9DX1NFVF9NUFJPVEVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIHBhZ2Vfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBtZW1vcnlfcGFnZV9kaWN0aW9uYXJ5LnBhZ2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIG9yaWdpbmFsX3Blcm1pc3Npb25zKTsKKyAgaWYgKGVycm5vIHx8ICh0dF9zdGF0dXMgPCAwKSkKKyAgICB7CisgICAgICByZXR1cm47ICAvKiBXaGF0IGVsc2UgY2FuIHdlIGRvPyAqLworICAgIH0KK30KKworCisvKiBNZW1vcnkgcGFnZS1wcm90ZWN0aW9ucyBhcmUgdXNlZCB0byBpbXBsZW1lbnQgImhhcmR3YXJlIiB3YXRjaHBvaW50cworICAgb24gSFAtVVguCisKKyAgIEZvciBldmVyeSBtZW1vcnkgcGFnZSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyB3YXRjaGVkIChpLmUuLCB0aGF0CisgICBwcmVzZW50bHkgc2hvdWxkIGJlIHdyaXRlLXByb3RlY3RlZCksIHdyaXRlLXByb3RlY3QgaXQuCisgICAqLwordm9pZAoraHBwYV9lbmFibGVfcGFnZV9wcm90ZWN0aW9uX2V2ZW50cyAocGlkKQorICBpbnQgIHBpZDsKK3sKKyAgaW50ICBidWNrZXQ7CisKKyAgbWVtb3J5X3BhZ2VfZGljdGlvbmFyeS5wYWdlX3Byb3RlY3Rpb25zX2FsbG93ZWQgPSAxOworCisgIGZvciAoYnVja2V0PTA7IGJ1Y2tldDxNRU1PUllfUEFHRV9ESUNUSU9OQVJZX0JVQ0tFVF9DT1VOVDsgYnVja2V0KyspCisgICAgeworICAgICAgbWVtb3J5X3BhZ2VfdCAqICBwYWdlOworCisgICAgICBwYWdlID0gbWVtb3J5X3BhZ2VfZGljdGlvbmFyeS5idWNrZXRzW2J1Y2tldF0ubmV4dDsKKyAgICAgIHdoaWxlIChwYWdlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICBwYWdlLT5vcmlnaW5hbF9wZXJtaXNzaW9ucyA9IHdyaXRlX3Byb3RlY3RfcGFnZSAocGlkLCBwYWdlLT5wYWdlX3N0YXJ0KTsKKyAgICAgICAgICBwYWdlID0gcGFnZS0+bmV4dDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvKiBNZW1vcnkgcGFnZS1wcm90ZWN0aW9ucyBhcmUgdXNlZCB0byBpbXBsZW1lbnQgImhhcmR3YXJlIiB3YXRjaHBvaW50cworICAgb24gSFAtVVguCisKKyAgIEZvciBldmVyeSBtZW1vcnkgcGFnZSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyB3YXRjaGVkIChpLmUuLCB0aGF0CisgICBwcmVzZW50bHkgaXMgb3Igc2hvdWxkIGJlIHdyaXRlLXByb3RlY3RlZCksIHVuLXdyaXRlLXByb3RlY3QgaXQuCisgICAqLwordm9pZAoraHBwYV9kaXNhYmxlX3BhZ2VfcHJvdGVjdGlvbl9ldmVudHMgKHBpZCkKKyAgaW50ICBwaWQ7Cit7CisgIGludCAgYnVja2V0OworCisgIGZvciAoYnVja2V0PTA7IGJ1Y2tldDxNRU1PUllfUEFHRV9ESUNUSU9OQVJZX0JVQ0tFVF9DT1VOVDsgYnVja2V0KyspCisgICAgeworICAgICAgbWVtb3J5X3BhZ2VfdCAqICBwYWdlOworCisgICAgICBwYWdlID0gbWVtb3J5X3BhZ2VfZGljdGlvbmFyeS5idWNrZXRzW2J1Y2tldF0ubmV4dDsKKyAgICAgIHdoaWxlIChwYWdlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICB1bndyaXRlX3Byb3RlY3RfcGFnZSAocGlkLCBwYWdlLT5wYWdlX3N0YXJ0LCBwYWdlLT5vcmlnaW5hbF9wZXJtaXNzaW9ucyk7CisgICAgICAgICAgcGFnZSA9IHBhZ2UtPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgbWVtb3J5X3BhZ2VfZGljdGlvbmFyeS5wYWdlX3Byb3RlY3Rpb25zX2FsbG93ZWQgPSAwOworfQorCisvKiBDb3VudCB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGV2ZW50cy4gIEF0IHRoaXMKKyAqIHBvaW50LCB3ZSBoYXZlIHNlbGVjdGVkIG9uZSB0aHJlYWQgYW5kIGl0cyBldmVudAorICogYXMgdGhlIG9uZSB0byBiZSAicmVwb3J0ZWQiIHVwd2FyZHMgdG8gY29yZSBnZGIuCisgKiBUaGF0IHRocmVhZCBpcyBhbHJlYWR5IG1hcmtlZCBhcyAiaGFuZGxlZCIuCisgKgorICogTm90ZTogd2UgY291bGQganVzdCBzY2FuIG91ciBvd24gdGhyZWFkIGxpc3QuICBGSVhNRSEKKyAqLworc3RhdGljIGludAorY291bnRfdW5oYW5kbGVkX2V2ZW50cyggcmVhbF9waWQsIHJlYWxfdGlkICkKKyAgaW50ICAgICByZWFsX3BpZDsKKyAgbHdwaWRfdCByZWFsX3RpZDsKK3sKKyAgdHRzdGF0ZV90ICB0c3RhdGU7CisgIGx3cGlkX3QgICAgdHRpZDsKKyAgaW50ICAgICAgICBldmVudHNfbGVmdDsKKyAgCisgIC8qIE9rLCBmaW5kIG91dCBob3cgbWFueSB0aHJlYWRzIGhhdmUgcmVhbCBldmVudHMgdG8gcmVwb3J0LgorICAgKi8KKyAgZXZlbnRzX2xlZnQgPSAwOworICB0dGlkID0gZ2V0X3Byb2Nlc3NfZmlyc3Rfc3RvcHBlZF90aHJlYWRfaWQoIHJlYWxfcGlkLCAmdHN0YXRlICk7CisKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgaWYoIGRlYnVnX29uICkgeworICAgICAgaWYoIHR0aWQgPT0gMCApCisgICAgICAgICAgcHJpbnRmKCAiUHJvY2VzcyAlZCBoYXMgbm8gdGhyZWFkc1xuIiwgcmVhbF9waWQgKTsKKyAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYoICJQcm9jZXNzICVkIGhhcyB0aGVzZSB0aHJlYWRzOlxuIiwgcmVhbF9waWQgKTsKKyAgfQorI2VuZGlmCisKKyAgd2hpbGUgKHR0aWQgPiAwICkgeworICAgICAgaWYoIHRzdGF0ZS50dHNfZXZlbnQgIT0gVFRFVlRfTk9ORQorICAgICAgJiYgICF3YXNfaGFuZGxlZCggdHRpZCApKSB7CisgICAgICAgICAgLyogVFRFVlRfTk9ORSBpbXBsaWVzIHdlIGp1c3Qgc3RvcHBlZCBpdCBvdXJzZWx2ZXMKKyAgICAgICAgICAgKiBiZWNhdXNlIHdlJ3JlIHRoZSBzdG9wLXRoZS13b3JsZCBndXlzLCBzbyBpdCdzCisgICAgICAgICAgICogbm90IGFuIGV2ZW50IGZyb20gb3VyIHBvaW50IG9mIHZpZXcuCisgICAgICAgICAgICoKKyAgICAgICAgICAgKiBJZiAid2FzX2hhbmRsZWQiIGlzIHRydWUsIHRoaXMgaXMgYW4gZXZlbnQgd2UKKyAgICAgICAgICAgKiBhbHJlYWR5IGhhbmRsZWQsIHNvIGRvbid0IGNvdW50IGl0LgorICAgICAgICAgICAqCisgICAgICAgICAgICogTm90ZSB0aGF0IHdlIGRvbid0IGNvdW50IHRoZSB0aHJlYWQgd2l0aCB0aGUKKyAgICAgICAgICAgKiBjdXJyZW50bHktcmVwb3J0ZWQgZXZlbnQsIGFzIGl0J3MgYWxyZWFkeSBtYXJrZWQKKyAgICAgICAgICAgKiBhcyBoYW5kbGVkLgorICAgICAgICAgICAqLworICAgICAgICAgIGV2ZW50c19sZWZ0Kys7CisgICAgICB9CisgICAgICAgICAKKyNpZiBkZWZpbmVkKCBUSFJFQURfREVCVUcgKSB8fCBkZWZpbmVkKCBXQUlUX0JVRkZFUl9ERUJVRyApCisgIGlmKCBkZWJ1Z19vbiApIHsKKyAgICAgIGlmKCB0dGlkID09IHJlYWxfdGlkICkKKyAgICAgICAgICBwcmludGYoICIqIiApOyAgICAgICAgIC8qIFRocmVhZCB3ZSdyZSByZXBvcnRpbmcgKi8KKyAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYoICIgIiApOworICAgICAgICAgCisgICAgICBpZiggdHN0YXRlLnR0c19ldmVudCAhPSBUVEVWVF9OT05FICkKKyAgICAgICAgICBwcmludGYoICIrIiApOyAgICAgICAgIC8qIFRocmVhZCB3aXRoIGEgcmVhbCBldmVudCAqLworICAgICAgZWxzZQorICAgICAgICAgIHByaW50ZiggIiAiICk7CisKKyAgICAgIGlmKCB3YXNfaGFuZGxlZCggdHRpZCApKQorICAgICAgICAgIHByaW50ZiggImgiICk7ICAgICAgICAgLyogVGhyZWFkIGhhcyBiZWVuIGhhbmRsZWQgKi8KKyAgICAgIGVsc2UKKyAgICAgICAgICBwcmludGYoICIgIiApOworICAgICAgICAgCisgICAgICBwcmludGYoICIgJWQsIHdpdGggZXZlbnQgJXMiLCB0dGlkLAorICAgICAgICAgICAgICBnZXRfcHJpbnRhYmxlX25hbWVfb2ZfdHRyYWNlX2V2ZW50KCB0c3RhdGUudHRzX2V2ZW50ICkpOworICAgICAgICAgICAgICAKKyAgICAgIGlmKCB0c3RhdGUudHRzX2V2ZW50ID09IFRURVZUX1NJR05BTAorICAgICAgICYmIDUgPT0gdHN0YXRlLnR0c191LnR0c19zaWduYWwudHRzX3NpZ25vICkgeworICAgICAgICAgIENPUkVfQUREUiBwY192YWw7CisKKyAgICAgICAgICBwY192YWwgPSBnZXRfcmF3X3BjKCB0dGlkICk7CisKKyAgICAgICAgICBpZiggcGNfdmFsID4gMCApCisgICAgICAgICAgICAgIHByaW50ZiggIiBicmVha3BvaW50IGF0IDB4JXhcbiIsIHBjX3ZhbCApOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcHJpbnRmKCAiIGJwdCwgY2FuJ3QgZmV0Y2ggcGMuXG4iICk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmKCAiXG4iICk7CisgIH0KKyNlbmRpZgorCisgICAgICB0dGlkID0gZ2V0X3Byb2Nlc3NfbmV4dF9zdG9wcGVkX3RocmVhZF9pZCAocmVhbF9waWQsICZ0c3RhdGUpOworICB9CisKKyNpZiBkZWZpbmVkKCBUSFJFQURfREVCVUcgKSB8fCBkZWZpbmVkKCBXQUlUX0JVRkZFUl9ERUJVRyApCisgIGlmKCBkZWJ1Z19vbiApCisgICAgICBpZiggZXZlbnRzX2xlZnQgPiAwICkKKyAgICAgICAgICBwcmludGYoICJUaGVyZSBhcmUgdGh1cyAlZCBwZW5kaW5nIGV2ZW50c1xuIiwgZXZlbnRzX2xlZnQgKTsKKyNlbmRpZgorCisgIHJldHVybiBldmVudHNfbGVmdDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCBhcyBhIHNvcCB0byBjbGllbnRzIHRoYXQgYXJlIGNhbGxpbmcKKyAqIHB0cmFjZV93YWl0IHRvIHdhaXQgZm9yIGEgcHJvY2VzcyB0byBzdG9wLiAgKHNlZSB0aGUKKyAqIGltcGxlbWVudGF0aW9uIG9mIGNoaWxkX3dhaXQuKSAgUmV0dXJuIHZhbHVlIGlzIHRoZSBwaWQgZm9yCisgKiB0aGUgZXZlbnQgdGhhdCBlbmRlZCB0aGUgd2FpdC4KKyAqCisgKiBOb3RlOiB1c2VkIGJ5IGNvcmUgZ2RiIGFuZCBzbyB1c2VzIHRoZSBwc2V1ZG8tcGlkIChyZWFsbHkgdGlkKS4KKyAqLworaW50CitwdHJhY2Vfd2FpdCAocGlkLCBzdGF0dXMpCisgICAgaW50IHBpZDsKKyAgICBpbnQgKnN0YXR1czsKK3sKKyAgdHRzdGF0ZV90ICB0c3A7CisgIGludCAgICAgICAgdHR3YWl0X3JldHVybjsKKyAgaW50ICAgICAgICByZWFsX3BpZDsKKyAgdHRzdGF0ZV90ICBzdGF0ZTsKKyAgbHdwaWRfdCAgICByZWFsX3RpZDsKKyAgaW50ICByZXR1cm5fcGlkOworCisgIC8qIFRoZSBwdHJhY2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBhbHNvIGlnbm9yZXMgcGlkLgorICAgKi8KKyAgKnN0YXR1cyA9IDA7CisKKyAgdHR3YWl0X3JldHVybiA9IGNhbGxfdHRyYWNlX3dhaXQoIDAsIFRUUkFDRV9XQUlUT0ssICZ0c3AsIHNpemVvZiAodHNwKSApOworICBpZiAodHR3YWl0X3JldHVybiA8IDApCisgICAgeworICAgICAgLyogPz9yZWhyYXVlcjogSXQgYXBwZWFycyB0aGF0IGlmIG91ciBpbmZlcmlvciBleGl0cyBhbmQgd2UKKyAgICAgICAgIGhhdmVuJ3QgYXNrZWQgZm9yIGV4aXQgZXZlbnRzLCB0aGF0IHdlJ3JlIG5vdCBnZXR0aW5nIGFueQorICAgICAgICAgaW5kaWNhdGlvbiBzYXZlIGEgbmVnYXRpdmUgcmV0dXJuIGZyb20gdHRyYWNlX3dhaXQgYW5kIGFuCisgICAgICAgICBlcnJubyBzZXQgdG8gRVNSQ0g/CisgICAgICAgICAqLworICAgICAgaWYgKGVycm5vID09IEVTUkNIKQorICAgICAgICB7CisgICAgICAgICAgKnN0YXR1cyA9IDA7ICAvKiBXSUZFWElURUQgKi8KKyAgICAgICAgICByZXR1cm4gaW5mZXJpb3JfcGlkOworICAgICAgICB9CisKKyAgICAgIHdhcm5pbmcoICJDYWxsIG9mIHR0cmFjZV93YWl0IHJldHVybmVkIHdpdGggZXJybm8gJWQuIiwKKyAgICAgICAgICAgICAgIGVycm5vICk7CisgICAgICAqc3RhdHVzID0gdHR3YWl0X3JldHVybjsKKyAgICAgIHJldHVybiBpbmZlcmlvcl9waWQ7CisgICAgfQorCisgIHJlYWxfcGlkID0gdHNwLnR0c19waWQ7CisgIHJlYWxfdGlkID0gdHNwLnR0c19sd3BpZDsKKworICAvKiBPbmUgY29tcGxpY2F0aW9uIGlzIHRoYXQgdGhlICJ0dHNfZXZlbnQiIHN0cnVjdHVyZSBoYXMKKyAgICogYSBzZXQgb2YgZmxhZ3MsIGFuZCBtb3JlIHRoYW4gb25lIGNhbiBiZSBzZXQuICBTbyB3ZQorICAgKiBlaXRoZXIgaGF2ZSB0byBmb3JjZSBhbiBvcmRlciAoYXMgd2UgZG8gaGVyZSksIG9yIGhhbmRsZQorICAgKiBtb3JlIHRoYW4gb25lIGZsYWcgYXQgYSB0aW1lLgorICAgKi8KKyAgaWYgKHRzcC50dHNfZXZlbnQgJiBUVEVWVF9MV1BfQ1JFQVRFKSB7CisKKyAgICAgLyogVW5saWtlIHdoYXQgeW91IG1pZ2h0IGV4cGVjdCwgdGhpcyBldmVudCBpcyByZXBvcnRlZCBpbgorICAgICAgKiB0aGUgX2NyZWF0aW5nXyB0aHJlYWQsIGFuZCB0aGUgX2NyZWF0ZWRfIHRocmVhZCAod2hvc2UgdGlkCisgICAgICAqIHdlIGhhdmUpIGlzIHN0aWxsIHJ1bm5pbmcuICBTbyB3ZSBoYXZlIHRvIHN0b3AgaXQuICBUaGlzCisgICAgICAqIGhhcyBhbHJlYWR5IGJlZW4gZG9uZSBpbiAiY2FsbF90dHJhY2Vfd2FpdCIsIGJ1dCBzaG91bGQgd2UKKyAgICAgICogZXZlciBhYmFuZG9uIHRoZSAic3RvcC10aGUtd29ybGQiIG1vZGVsLCBoZXJlJ3MgdGhlIGNvbW1hbmQKKyAgICAgICogdG8gdXNlOgorICAgICAgKgorICAgICAgKiAgICBjYWxsX3R0cmFjZSggVFRfTFdQX1NUT1AsIHJlYWxfdGlkLCBUVF9OSUwsIFRUX05JTCwgVFRfTklMICk7CisgICAgICAqCisgICAgICAqIE5vdGUgdGhhdCB0aGlzIHdvdWxkIGRlcGVuZCBvbiBiZWluZyBjYWxsZWQgX2FmdGVyXyAiYWRkX3R0aHJlYWQiCisgICAgICAqIGJlbG93IGZvciB0aGUgdGlkLXRvLXBpZCB0cmFuc2xhdGlvbiB0byBiZSBkb25lIGluICJjYWxsX3R0cmFjZSIuCisgICAgICAqLworCisjaWZkZWYgVEhSRUFEX0RFQlVHCisgICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgICBwcmludGYoICJOZXcgdGhyZWFkOiBwaWQgJWQsIHRpZCAlZCwgY3JlYXRvciB0aWQgJWRcbiIsCisgICAgICAgICAgICAgICAgIHJlYWxfcGlkLCB0c3AudHRzX3UudHRzX3RocmVhZC50dHNfdGFyZ2V0X2x3cGlkLAorICAgICAgICAgICAgICAgICByZWFsX3RpZCApOworI2VuZGlmCisKKyAgICAgLyogTm93IHdlIGhhdmUgdG8gcmV0dXJuIHRoZSB0aWQgb2YgdGhlIGNyZWF0ZWQgdGhyZWFkLCBub3QKKyAgICAgICogdGhlIGNyZWF0aW5nIHRocmVhZCwgb3IgIndhaXRfZm9yX2luZmVyaW9yIiB3b24ndCBrbm93IHdlCisgICAgICAqIGhhdmUgYSBuZXcgInByb2Nlc3MiICh0aHJlYWQpLiAgUGx1cyB3ZSBzaG91bGQgcmVjb3JkIGl0CisgICAgICAqIHJpZ2h0LCB0b28uCisgICAgICAqLworICAgICAgcmVhbF90aWQgPSB0c3AudHRzX3UudHRzX3RocmVhZC50dHNfdGFyZ2V0X2x3cGlkOworCisgICAgICBhZGRfdHRocmVhZCggcmVhbF9waWQsIHJlYWxfdGlkICk7CisgIH0KKworICBlbHNlIGlmKCAodHNwLnR0c19ldmVudCAmIFRURVZUX0xXUF9URVJNSU5BVEUgKQorICAgICAgICB8fCAodHNwLnR0c19ldmVudCAmIFRURVZUX0xXUF9FWElUKSApIHsKKworI2lmZGVmIFRIUkVBRF9ERUJVRworICAgICBpZiggZGVidWdfb24gKQorICAgICAgICAgcHJpbnRmKCAiVGhyZWFkIGRpZXM6ICVkXG4iLCByZWFsX3RpZCApOworI2VuZGlmCisKKyAgICAgZGVsX3R0aHJlYWQoIHJlYWxfdGlkICk7CisgIH0KKworICBlbHNlIGlmICh0c3AudHRzX2V2ZW50ICYgVFRFVlRfRVhFQykgeworCisjaWZkZWYgVEhSRUFEX0RFQlVHIAorICAgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgICBwcmludGYoICJQaWQgJWQgaGFzIHplcm8ndGggdGhyZWFkICVkOyBpbmZlcmlvciBwaWQgaXMgJWRcbiIsCisgICAgICAgICAgICAgICAgICByZWFsX3BpZCwgcmVhbF90aWQsIGluZmVyaW9yX3BpZCApOworI2VuZGlmCisKKyAgICAgYWRkX3R0aHJlYWQoIHJlYWxfcGlkLCByZWFsX3RpZCApOworICB9CisKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgZWxzZSBpZiggZGVidWdfb24gKSB7CisgICAgIHByaW50ZiggIlByb2Nlc3MtbGV2ZWwgZXZlbnQgJXMsIHVzaW5nIHRpZCAlZFxuIiwKKyAgICAgICAgICAgICBnZXRfcHJpbnRhYmxlX25hbWVfb2ZfdHRyYWNlX2V2ZW50KCB0c3AudHRzX2V2ZW50ICksCisgICAgICAgICAgICAgcmVhbF90aWQgKTsKKworICAgICAvKiBPSyB0byBkbyB0aGlzLCBhcyAiYWRkX3R0aHJlYWQiIHdvbid0IGFkZAorICAgICAgKiBkdXBsaWNhdGUgZW50cmllcy4gIEFsc28gT0sgbm90IHRvIGRvIGl0LAorICAgICAgKiBhcyB0aGlzIGV2ZW50IGlzbid0IG9uZSB3aGljaCBjYW4gY2hhbmdlIHRoZQorICAgICAgKiB0aHJlYWQgc3RhdGUuCisgICAgICAqLworICAgICBhZGRfdHRocmVhZCggcmVhbF9waWQsIHJlYWxfdGlkICk7CisgIH0KKyNlbmRpZgorCisKKyAgLyogSG93IG1hbnkgZXZlbnRzIGFyZSBsZWZ0IHRvIHJlcG9ydCBsYXRlcj8KKyAgICogSW4gYSBub24tc3RvcC10aGUtd29ybGQgbW9kZWwsIHRoaXMgaXNuJ3QgbmVlZGVkLgorICAgKgorICAgKiBOb3RlIHRoYXQgaXQncyBub3QgYWx3YXlzIHNhZmUgdG8gcXVlcnkgdGhlIHRocmVhZCBzdGF0ZSBvZiBhIHByb2Nlc3MsCisgICAqIHdoaWNoIGlzIHdoYXQgY291bnRfdW5oYW5kbGVkX2V2ZW50cyBkb2VzLiAgKElmIHVuc2FmZSwgd2UncmUgbGVmdCB3aXRoCisgICAqIG5vIG90aGVyIHJlc29ydCB0aGFuIHRvIGFzc3VtZSB0aGF0IG5vIG1vcmUgZXZlbnRzIHJlbWFpbi4uLikKKyAgICovCisgIGlmIChjYW5fdG91Y2hfdGhyZWFkc19vZl9wcm9jZXNzIChyZWFsX3BpZCwgdHNwLnR0c19ldmVudCkpCisgICAgICBtb3JlX2V2ZW50c19sZWZ0ID0gY291bnRfdW5oYW5kbGVkX2V2ZW50cyggcmVhbF9waWQsIHJlYWxfdGlkICk7CisgICAgICAKKyAgZWxzZSB7CisgICAgICBpZiggbW9yZV9ldmVudHNfbGVmdCA+IDAgKQorICAgICAgICAgIHdhcm5pbmcoICJWZm9yayBvciBmb3JrIGNhdXNpbmcgbG9zcyBvZiAlZCBidWZmZXJlZCBldmVudHMuIiwKKyAgICAgICAgICAgICAgICAgICBtb3JlX2V2ZW50c19sZWZ0ICk7CisgICAgICAgICAgCisgICAgICBtb3JlX2V2ZW50c19sZWZ0ID0gMDsKKyAgfQorCisgIC8qIEF0dGVtcHQgdG8gdHJhbnNsYXRlIHRoZSB0dHJhY2Vfd2FpdC1yZXR1cm5lZCBzdGF0dXMgaW50byB0aGUKKyAgICAgcHRyYWNlIGVxdWl2YWxlbnQuCisKKyAgICAgPz9yZWhyYXVlcjogVGhpcyBpcyBzb21ld2hhdCBmcmFnaWxlLiAgV2UgcmVhbGx5IG91Z2h0IHRvIHJld3JpdGUKKyAgICAgY2xpZW50cyB0aGF0IGV4cGVjdCB0byBwaWNrIGFwYXJ0IGEgcHRyYWNlIHdhaXQgc3RhdHVzLCB0byB1c2UKKyAgICAgc29tZXRoaW5nIGEgbGl0dGxlIG1vcmUgYWJzdHJhY3QuCisgICAgICovCisgIGlmICggICAodHNwLnR0c19ldmVudCAmIFRURVZUX0VYRUMpCisgICAgICB8fCAodHNwLnR0c19ldmVudCAmIFRURVZUX0ZPUkspCisgICAgICB8fCAodHNwLnR0c19ldmVudCAmIFRURVZUX1ZGT1JLKSkKKyAgICB7CisgICAgICAvKiBGb3JrcyBjb21lIGluIHBhaXJzIChwYXJlbnQgYW5kIGNoaWxkKSwgc28gY29yZSBnZGIKKyAgICAgICAqIHdpbGwgZG8gdHdvIHdhaXRzLiAgQmUgcmVhZHkgdG8gbm90aWNlIHRoaXMuCisgICAgICAgKi8KKyAgICAgIGlmICh0c3AudHRzX2V2ZW50ICYgVFRFVlRfRk9SSykKKyAgICAgICAgeworICAgICAgICAgIHByb2Nlc3Nfc3RhdGUgPSBGT1JLSU5HOworICAgICAgICAgIAorI2lmZGVmIFdBSVRfQlVGRkVSX0RFQlVHCisgICAgICAgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgICAgICAgcHJpbnRmKCAiUHJvY2VzcyBzZXQgdG8gRk9SS0lOR1xuIiApOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHRzcC50dHNfZXZlbnQgJiBUVEVWVF9WRk9SSykKKyAgICAgICAgeworICAgICAgICAgIHByb2Nlc3Nfc3RhdGUgPSBWRk9SS0lORzsKKyAgICAgICAgICAKKyNpZmRlZiBXQUlUX0JVRkZFUl9ERUJVRworICAgICAgICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgICAgICAgIHByaW50ZiggIlByb2Nlc3Mgc2V0IHRvIFZGT1JLSU5HXG4iICk7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAvKiBNYWtlIGFuIGV4ZWMgb3IgZm9yayBsb29rIGxpa2UgYSBicmVha3BvaW50LiAgRGVmaW5pdGVseSBhIGhhY2ssCisgICAgICAgICBidXQgSSBkb24ndCB0aGluayBub24gSFAtVVgtc3BlY2lmaWMgY2xpZW50cyByZWFsbHkgY2FyZWZ1bGx5CisgICAgICAgICBpbnNwZWN0IHRoZSBmaXJzdCBldmVudHMgdGhleSBnZXQgYWZ0ZXIgaW5mZXJpb3Igc3RhcnR1cCwgc28KKyAgICAgICAgIGl0IHByb2JhYmx5IGFsbW9zdCBkb2Vzbid0IG1hdHRlciB3aGF0IHdlIGNsYWltIHRoaXMgaXMuCisgICAgICAgICAqLworCisjaWZkZWYgVEhSRUFEX0RFQlVHCisgICAgICBpZiggZGVidWdfb24gKQorICAgICAgICAgIHByaW50ZiggIi4uYSBwcm9jZXNzICdldmVudCdcbiIgKTsKKyNlbmRpZgorCisgICAgICAvKiBBbHNvIG1ha2UgZm9yayBhbmQgZXhlYyBldmVudHMgbG9vayBsaWtlIGJwdHMsIHNvIHRoZXkgY2FuIGJlIGNhdWdodC4KKyAgICAgICovCisgICAgICAqc3RhdHVzID0gMDE3NyB8IChfU0lHVFJBUCA8PCA4KTsKKyAgICB9CisKKyAgLyogU3BlY2lhbC1jYXNlczogV2UgYXNrIGZvciBzeXNjYWxsIGVudHJ5IGFuZCBleGl0IGV2ZW50cyB0byBpbXBsZW1lbnQKKyAgICAgImZhc3QiIChha2EgImhhcmR3YXJlIikgd2F0Y2hwb2ludHMuCisKKyAgICAgV2hlbiB3ZSBnZXQgYSBzeXNjYWxsIGVudHJ5LCB3ZSB3YW50IHRvIGRpc2FibGUgcGFnZS1wcm90ZWN0aW9ucywKKyAgICAgYW5kIHJlc3VtZSB0aGUgaW5mZXJpb3I7IHRoaXMgaXNuJ3QgYW4gZXZlbnQgd2Ugd2lzaCBmb3IKKyAgICAgd2FpdF9mb3JfaW5mZXJpb3IgdG8gc2VlLiAgTm90ZSB0aGF0IHdlIG11c3QgcmVzdW1lIE9OTFkgdGhlCisgICAgIHRocmVhZCB0aGF0IHJlcG9ydGVkIHRoZSBzeXNjYWxsIGVudHJ5OyB3ZSBkb24ndCB3YW50IHRvIGFsbG93CisgICAgIG90aGVyIHRocmVhZHMgdG8gcnVuIHdpdGggdGhlIHBhZ2UgcHJvdGVjdGlvbnMgb2ZmLCBhcyB0aGV5IG1pZ2h0CisgICAgIHRoZW4gYmUgYWJsZSB0byB3cml0ZSB0byB3YXRjaCBtZW1vcnkgd2l0aG91dCBpdCBiZWluZyBjYXVnaHQuCisKKyAgICAgV2hlbiB3ZSBnZXQgYSBzeXNjYWxsIGV4aXQsIHdlIHdhbnQgdG8gcmVlbmFibGUgcGFnZS1wcm90ZWN0aW9ucywKKyAgICAgYnV0IHdlIGRvbid0IHdhbnQgdG8gcmVzdW1lIHRoZSBpbmZlcmlvcjsgdGhpcyBpcyBhbiBldmVudCB3ZSB3aXNoCisgICAgIHdhaXRfZm9yX2luZmVyaW9yIHRvIHNlZS4gIE1ha2UgaXQgbG9vayBsaWtlIHRoZSBzaWduYWwgd2Ugbm9ybWFsbHkKKyAgICAgZ2V0IGZvciBhIHNpbmdsZS1zdGVwIGNvbXBsZXRpb24uICBUaGlzIHNob3VsZCBjYXVzZSB3YWl0X2Zvcl9pbmZlcmlvcgorICAgICB0byBldmFsdWF0ZSB3aGV0aGVyIGFueSB3YXRjaHBvaW50IHRyaWdnZXJlZC4KKworICAgICBPciByYXRoZXIsIHRoYXQncyB3aGF0IHdlJ2QgTElLRSB0byBkbyBmb3Igc3lzY2FsbCBleGl0OyB3ZSBjYW4ndCwKKyAgICAgZHVlIHRvIHNvbWUgSFAtVVggImZlYXR1cmVzIi4gIFNvbWUgc3lzY2FsbHMgaGF2ZSBwcm9ibGVtcyB3aXRoCisgICAgIHdyaXRlLXByb3RlY3Rpb25zIG9uIHNvbWUgcGFnZXMsIGFuZCBzb21lIHN5c2NhbGxzIHNlZW0gdG8gaGF2ZQorICAgICBwZW5kaW5nIHdyaXRlcyB0byB0aG9zZSBwYWdlcyBhdCB0aGUgdGltZSB3ZSdyZSBnZXR0aW5nIHRoZSByZXR1cm4KKyAgICAgZXZlbnQuICBTbywgd2UnbGwgc2luZ2xlLXN0ZXAgdGhlIGluZmVyaW9yIHRvIGdldCBvdXQgb2YgdGhlIHN5c2NhbGwsCisgICAgIGFuZCB0aGVuIHJlZW5hYmxlIHByb3RlY3Rpb25zLgorCisgICAgIE5vdGUgdGhhdCB3ZSdyZSBpbnRlbnRpb25hbGx5IGFsbG93aW5nIHRoZSBzeXNjYWxsIGV4aXQgY2FzZSB0bworICAgICBmYWxsIHRocm91Z2ggaW50byB0aGUgc3VjY2VlZGluZyBjYXNlcywgYXMgc29tZXRpbWVzIHdlIHNpbmdsZS0KKyAgICAgc3RlcCBvdXQgb2Ygb25lIHN5c2NhbGwgb25seSB0byBpbW1lZGlhdGVseSBlbnRlciBhbm90aGVyLi4uCisgICAqLworICBlbHNlIGlmICgodHNwLnR0c19ldmVudCAmIFRURVZUX1NZU0NBTExfRU5UUlkpCisgICAgICAgIHx8ICh0c3AudHRzX2V2ZW50ICYgVFRFVlRfU1lTQ0FMTF9SRVRVUk4pKQorICAgIHsKKyAgICAgIC8qIE1ha2UgYSBzeXNjYWxsIGV2ZW50IGxvb2sgbGlrZSBhIGJyZWFrcG9pbnQuICBTYW1lIGNvbW1lbnRzCisgICAgICAgICBhcyBmb3IgZXhlYyAmIGZvcmsgZXZlbnRzLgorICAgICAgICAgKi8KKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgICAgcHJpbnRmKCAiLi5hIHN5c2NhbGwgJ2V2ZW50J1xuIiApOworI2VuZGlmCisKKyAgICAgIC8qIEFsc28gbWFrZSBzeXNjYWxsIGV2ZW50cyBsb29rIGxpa2UgYnB0cywgc28gdGhleSBjYW4gYmUgY2F1Z2h0LgorICAgICAgKi8KKyAgICAgICpzdGF0dXMgPSAwMTc3IHwgKF9TSUdUUkFQIDw8IDgpOworICAgIH0KKworICBlbHNlIGlmICgodHNwLnR0c19ldmVudCAmIFRURVZUX0xXUF9DUkVBVEUpCisgICAgICAgIHx8ICh0c3AudHRzX2V2ZW50ICYgVFRFVlRfTFdQX1RFUk1JTkFURSkKKyAgICAgICAgfHwgKHRzcC50dHNfZXZlbnQgJiBUVEVWVF9MV1BfRVhJVCkpCisgICAgeworICAgICAgLyogTWFrZSBhIHRocmVhZCBldmVudCBsb29rIGxpa2UgYSBicmVha3BvaW50LiAgU2FtZSBjb21tZW50cworICAgICAgICogYXMgZm9yIGV4ZWMgJiBmb3JrIGV2ZW50cy4KKyAgICAgICAqLworI2lmZGVmIFRIUkVBRF9ERUJVRworICAgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgICBwcmludGYoICIuLmEgdGhyZWFkICdldmVudCdcbiIgKTsKKyNlbmRpZgorCisgICAgICAvKiBBbHNvIG1ha2UgdGhyZWFkIGV2ZW50cyBsb29rIGxpa2UgYnB0cywgc28gdGhleSBjYW4gYmUgY2F1Z2h0LgorICAgICAgKi8KKyAgICAgICpzdGF0dXMgPSAwMTc3IHwgKF9TSUdUUkFQIDw8IDgpOworICAgIH0KKyAgICAKKyAgZWxzZSBpZiAoKHRzcC50dHNfZXZlbnQgJiBUVEVWVF9FWElUKSkKKyAgICB7ICAvKiBXSUZFWElURUQgKi8KKyAgICAKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgICAgICBpZiggZGVidWdfb24gKQorICAgICAgICAgICBwcmludGYoICIuLmFuIGV4aXRcbiIgKTsKKyNlbmRpZgorCisgICAgICAvKiBQcmV2ZW50IHJlc3Qgb2YgZ2RiIGZyb20gdGhpbmtpbmcgdGhpcyBpcworICAgICAgICogYSBuZXcgdGhyZWFkIGlmIGZvciBzb21lIHJlYXNvbiBpdCdzIG5ldmVyCisgICAgICAgKiBzZWVuIHRoZSBtYWluIHRocmVhZCBiZWZvcmUuCisgICAgICAgKi8KKyAgICAgIGluZmVyaW9yX3BpZCA9IG1hcF90b19nZGJfdGlkKCByZWFsX3RpZCApOyAvKiBIQUNLLCBGSVggKi8KKyAgICAgIAorICAgICAgKnN0YXR1cyA9IDAgfCAodHNwLnR0c191LnR0c19leGl0LnR0c19leGl0Y29kZSk7CisgICAgfQorICAgIAorICBlbHNlIGlmICh0c3AudHRzX2V2ZW50ICYgVFRFVlRfU0lHTkFMKQorICAgIHsgIC8qIFdJRlNUT1BQRUQgKi8KKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgICAgICBpZiggZGVidWdfb24gKQorICAgICAgICAgICBwcmludGYoICIuLmEgc2lnbmFsLCAlZFxuIiwgdHNwLnR0c191LnR0c19zaWduYWwudHRzX3NpZ25vICk7CisjZW5kaWYKKworICAgICAgKnN0YXR1cyA9IDAxNzcgfCAodHNwLnR0c191LnR0c19zaWduYWwudHRzX3NpZ25vIDw8IDgpOworICAgIH0KKworICBlbHNlCisgICAgeyAgLyogIVdJRlNUT1BQRUQgKi8KKworICAgICAgLyogVGhpcyBtZWFucyB0aGUgcHJvY2VzcyBvciB0aHJlYWQgdGVybWluYXRlZC4gIEJ1dCB3ZSBzaG91bGQndmUKKyAgICAgICAgIGNhdWdodCBhbiBleHBsaWNpdCBleGl0L3Rlcm1pbmF0aW9uIGFib3ZlLiAgU28gd2FybiAodGhpcyBpcworICAgICAgICAgcmVhbGx5IGFuIGludGVybmFsIGVycm9yKSBhbmQgY2xhaW0gdGhlIHByb2Nlc3Mgb3IgdGhyZWFkCisgICAgICAgICB0ZXJtaW5hdGVkIHdpdGggYSBTSUdUUkFQLgorICAgICAgICovCisKKyAgICAgIHdhcm5pbmcgKCJwcm9jZXNzX3dhaXQ6IHVua25vd24gcHJvY2VzcyBzdGF0ZSIpOworCisjaWZkZWYgVEhSRUFEX0RFQlVHCisgICAgICBpZiggZGVidWdfb24gKQorICAgICAgICAgIHByaW50ZiggIlByb2Nlc3MtbGV2ZWwgZXZlbnQgJXMsIHVzaW5nIHRpZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGdldF9wcmludGFibGVfbmFtZV9vZl90dHJhY2VfZXZlbnQoIHRzcC50dHNfZXZlbnQgKSwKKyAgICAgICAgICAgICAgICAgIHJlYWxfdGlkICk7CisjZW5kaWYKKworICAgICAgKnN0YXR1cyA9IF9TSUdUUkFQOworICAgIH0KKworICB0YXJnZXRfcG9zdF93YWl0ICh0c3AudHRzX3BpZCwgKnN0YXR1cyk7CisKKworI2lmZGVmIFRIUkVBRF9ERUJVRworICBpZiggZGVidWdfb24gKQorICAgICAgcHJpbnRmKCAiRG9uZSB3YWl0aW5nLCBwaWQgaXMgJWQsIHRpZCAlZFxuIiwgcmVhbF9waWQsIHJlYWxfdGlkICk7CisjZW5kaWYKKworICAvKiBBbGwgY29kZSBleHRlcm5hbCB0byB0aGlzIG1vZHVsZSB1c2VzIHRoZSB0aWQsIGJ1dCBjYWxscworICAgKiBpdCAicGlkIi4gIFRoZXJlJ3Mgc29tZSB0d2Vha2luZyBzbyB0aGF0IHRoZSBvdXRzaWRlIHNlZXMKKyAgICogdGhlIGZpcnN0IHRocmVhZCBhcyBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIGFzIHRoZSBzdGFydGluZworICAgKiBwaWQuCisgICAqLworICByZXR1cm5fcGlkID0gbWFwX3RvX2dkYl90aWQoIHJlYWxfdGlkICk7CisKKyAgLyogUmVtZW1iZXIgdGhpcyBmb3IgbGF0ZXIgdXNlIGluICJocHBhX3ByZXBhcmVfdG9fcHJvY2VlZCIuCisgICAqLworICBvbGRfZ2RiX3BpZCAgPSBpbmZlcmlvcl9waWQ7CisgIHJlcG9ydGVkX3BpZCA9IHJldHVybl9waWQ7CisgIHJlcG9ydGVkX2JwdCA9ICgodHNwLnR0c19ldmVudCAmIFRURVZUX1NJR05BTCkgJiYgKDUgPT0gdHNwLnR0c191LnR0c19zaWduYWwudHRzX3NpZ25vKSk7CisKKyAgaWYoIHJlYWxfdGlkID09IDAgfHwgcmV0dXJuX3BpZCA9PSAwICkgeworICAgICAgd2FybmluZyggIkludGVybmFsIGVycm9yOiBwcm9jZXNzLXdhaXQgZmFpbGVkLiIgKTsKKyAgfQorICAgICAgICAKKyAgcmV0dXJuIHJldHVybl9waWQ7Cit9CisKKwwKKy8qIFRoaXMgZnVuY3Rpb24gY2F1c2VzIHRoZSBjYWxsZXIncyBwcm9jZXNzIHRvIGJlIHRyYWNlZCBieSBpdHMKKyAgIHBhcmVudC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGFmdGVyIEdEQiBmb3JrcyBpdHNlbGYsCisgICBhbmQgYmVmb3JlIHRoZSBjaGlsZCBleGVjcyB0aGUgdGFyZ2V0LiAgRGVzcGl0ZSB0aGUgbmFtZSwgaXQKKyAgIGlzIGNhbGxlZCBieSB0aGUgY2hpbGQuCisKKyAgIE5vdGUgdGhhdCBIUC1VWCB0dHJhY2UgaXMgcmF0aGVyIGZ1bmt5IGluIGhvdyB0aGlzIGlzIGRvbmUuCisgICBJZiB0aGUgcGFyZW50IHdhbnRzIHRvIGdldCB0aGUgaW5pdGlhbCBleGVjIGV2ZW50IG9mIGEgY2hpbGQsCisgICBpdCBtdXN0IHNldCB0aGUgdHRyYWNlIGV2ZW50IG1hc2sgb2YgdGhlIGNoaWxkIHRvIGluY2x1ZGUgZXhlY3MuCisgICAoVGhlIGNoaWxkIGNhbm5vdCBkbyB0aGlzIGl0c2VsZi4pICBUaGlzIG11c3QgYmUgZG9uZSBhZnRlciB0aGUKKyAgIGNoaWxkIGlzIGZvcmtlZCwgYnV0IGJlZm9yZSBpdCBleGVjcy4KKworICAgVG8gY29vcmRpbmF0ZSB0aGUgcGFyZW50IGFuZCBjaGlsZCwgd2UgaW1wbGVtZW50IGEgc2VtYXBob3JlIHVzaW5nCisgICBwaXBlcy4gIEFmdGVyIFNFVFRSQydpbmcgaXRzZWxmLCB0aGUgY2hpbGQgdGVsbHMgdGhlIHBhcmVudCB0aGF0CisgICBpdCBpcyBub3cgdHJhY2VhYmxlIGJ5IHRoZSBwYXJlbnQsIGFuZCB3YWl0cyBmb3IgdGhlIHBhcmVudCdzCisgICBhY2tub3dsZWRnZW1lbnQuICBUaGUgcGFyZW50IGNhbiB0aGVuIHNldCB0aGUgY2hpbGQncyBldmVudCBtYXNrLAorICAgYW5kIG5vdGlmeSB0aGUgY2hpbGQgdGhhdCBpdCBjYW4gbm93IGV4ZWMuCisKKyAgIChUaGUgYWNrbm93bGVkZ2VtZW50IGJ5IHBhcmVudCBoYXBwZW5zIGFzIGEgcmVzdWx0IG9mIGEgY2FsbCB0bworICAgY2hpbGRfYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvci4pCisgKi8KK2ludAorcGFyZW50X2F0dGFjaF9hbGwgKCkKK3sKKyAgaW50ICB0dF9zdGF0dXM7CisKKyAgLyogV2UgbmVlZCBhIG1lbW9yeSBob21lIGZvciBhIGNvbnN0YW50LCB0byBwYXNzIGl0IHRvIHR0cmFjZS4KKyAgICAgVGhlIHZhbHVlIG9mIHRoZSBjb25zdGFudCBpcyBhcmJpdHJhcnksIHNvIGxvbmcgYXMgYm90aAorICAgICBwYXJlbnQgYW5kIGNoaWxkIHVzZSB0aGUgc2FtZSB2YWx1ZS4gIE1pZ2h0IGFzIHdlbGwgdXNlIHRoZQorICAgICAibWFnaWMiIGNvbnN0YW50IHByb3ZpZGVkIGJ5IHR0cmFjZS4uLgorICAgKi8KKyAgdWludDY0X3QgIHRjX21hZ2ljX2NoaWxkID0gVFRfVkVSU0lPTjsKKyAgdWludDY0X3QgIHRjX21hZ2ljX3BhcmVudCA9IDA7CisKKyAgdHRfc3RhdHVzID0gY2FsbF9yZWFsX3R0cmFjZSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfUFJPQ19TRVRUUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgICAgIFRUX05JTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobHdwaWRfdCkgVFRfTklMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX05JTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBUVF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX05JTCApOworCisgIGlmICh0dF9zdGF0dXMgPCAwKQorICAgIHJldHVybiB0dF9zdGF0dXM7CisKKyAgLyogTm90aWZ5IHRoZSBwYXJlbnQgdGhhdCB3ZSdyZSBwb3RlbnRpYWxseSByZWFkeSB0byBleGVjKCkuICovCisgIHdyaXRlIChzdGFydHVwX3NlbWFwaG9yZS5jaGlsZF9jaGFubmVsW1NFTV9UQUxLXSwKKyAgICAgICAgICZ0Y19tYWdpY19jaGlsZCwKKyAgICAgICAgIHNpemVvZiAodGNfbWFnaWNfY2hpbGQpKTsKKworICAvKiBXYWl0IGZvciBhY2tub3dsZWRnZW1lbnQgZnJvbSB0aGUgcGFyZW50LiAqLworICByZWFkIChzdGFydHVwX3NlbWFwaG9yZS5wYXJlbnRfY2hhbm5lbFtTRU1fTElTVEVOXSwKKyAgICAgICAgJnRjX21hZ2ljX3BhcmVudCwKKyAgICAgICAgc2l6ZW9mICh0Y19tYWdpY19wYXJlbnQpKTsKKyAgICAgICAgCisgIGlmICh0Y19tYWdpY19jaGlsZCAhPSB0Y19tYWdpY19wYXJlbnQpCisgICAgd2FybmluZyAoIm1pc21hdGNoZWQgc2VtYXBob3JlIG1hZ2ljIik7CisKKyAgLyogRGlzY2FyZCBvdXIgY29weSBvZiB0aGUgc2VtYXBob3JlLiAqLworICAodm9pZCkgY2xvc2UgKHN0YXJ0dXBfc2VtYXBob3JlLnBhcmVudF9jaGFubmVsW1NFTV9MSVNURU5dKTsKKyAgKHZvaWQpIGNsb3NlIChzdGFydHVwX3NlbWFwaG9yZS5wYXJlbnRfY2hhbm5lbFtTRU1fVEFMS10pOworICAodm9pZCkgY2xvc2UgKHN0YXJ0dXBfc2VtYXBob3JlLmNoaWxkX2NoYW5uZWxbU0VNX0xJU1RFTl0pOworICAodm9pZCkgY2xvc2UgKHN0YXJ0dXBfc2VtYXBob3JlLmNoaWxkX2NoYW5uZWxbU0VNX1RBTEtdKTsKKyAgCisgIHJldHVybiB0dF9zdGF0dXM7Cit9CisKKy8qIERlc3BpdGUgYmVpbmcgZmlsZS1sb2NhbCwgdGhpcyByb3V0aW5lIGlzIGRlYWxpbmcgd2l0aAorICogYWN0dWFsIHByb2Nlc3MgSURzLCBub3QgdGhyZWFkIGlkcy4gIFRoYXQncyBiZWNhdXNlIGl0J3MKKyAqIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0ICJ3YWl0IiBjYWxsLCBhbmQgdGhlcmUncyBubyBtYXAKKyAqIHlldCBmcm9tIHRpZHMgdG8gcGlkcy4KKyAqCisgKiBXaGVuIGl0IGlzIGNhbGxlZCwgYSBmb3JrZWQgY2hpbGQgaXMgcnVubmluZywgYnV0IHdhaXRpbmcgb24KKyAqIHRoZSBzZW1hcGhvcmUuICBJZiB5b3Ugc3RvcCB0aGUgY2hpbGQgYW5kIHJlLXN0YXJ0IGl0LAorICogdGhpbmdzIGdldCBjb25mdXNlZCwgc28gZG9uJ3QgZG8gdGhhdCEgIEFuIGF0dGFjaGVkIGNoaWxkIGlzCisgKiBzdG9wcGVkLgorICoKKyAqIFNpbmNlIHRoaXMgaXMgY2FsbGVkIGFmdGVyIGVpdGhlciBhdHRhY2ggb3IgcnVuLCB3ZQorICogaGF2ZSB0byBiZSB0aGUgY29tbW9uIHBhcnQgb2YgYm90aC4KKyAqLworc3RhdGljIHZvaWQKK3JlcXVpcmVfbm90aWZpY2F0aW9uX29mX2V2ZW50cyAoIHJlYWxfcGlkICkKKyAgaW50ICByZWFsX3BpZDsKK3sKKyAgaW50ICB0dF9zdGF0dXM7CisgIHR0ZXZlbnRfdCAgbm90aWZpYWJsZV9ldmVudHM7CisKKyAgbHdwaWRfdCAgICB0aWQ7CisgIHR0c3RhdGVfdCAgdGhyZWFkX3N0YXRlOworCisjaWZkZWYgVEhSRUFEX0RFQlVHCisgIGlmKCBkZWJ1Z19vbiApCisgICAgICBwcmludGYoICJSZXF1aXJlIG5vdGlmLCBwaWQgaXMgJWRcbiIsIHJlYWxfcGlkICk7CisjZW5kaWYKKworICAvKiBUZW1wb3JhcnkgSEFDSzogdGVsbCBpbmZ0YXJnLmMvY2hpbGRfd2FpdCB0byBub3QKKyAgICogbG9vcCB1bnRpbCBwaWRzIGFyZSB0aGUgc2FtZS4KKyAgICovCisgIG5vdF9zYW1lX3JlYWxfcGlkID0gMDsKKworICBzaWdlbXB0eXNldCAoJm5vdGlmaWFibGVfZXZlbnRzLnR0ZV9zaWduYWxzKTsKKyAgbm90aWZpYWJsZV9ldmVudHMudHRlX29wdHMgPSBUVEVPX05PTkU7CisKKyAgLyogVGhpcyBlbnN1cmVzIHRoYXQgZm9ya2VkIGNoaWxkcmVuIGluaGVyaXQgdGhlaXIgcGFyZW50J3MKKyAgICogZXZlbnQgbWFzaywgd2hpY2ggd2UncmUgc2V0dGluZyBoZXJlLgorICAgKgorICAgKiBOT1RFOiBpZiB5b3UgZGVidWcgZ2RiIHdpdGggaXRzZWxmLCB0aGVuIHRoZSB1bHRpbWF0ZQorICAgKiAgICAgICBkZWJ1Z2dlZSBnZXRzIGZsYWdzIHNldCBieSB0aGUgb3V0ZXJtb3N0IGdkYiwgYXMKKyAgICogICAgICAgYSBjaGlsZCBvZiBhIGNoaWxkIHdpbGwgc3RpbGwgaW5oZXJpdC4KKyAgICovCisgIG5vdGlmaWFibGVfZXZlbnRzLnR0ZV9vcHRzIHw9IFRURU9fUFJPQ19JTkhFUklUOworCisgIG5vdGlmaWFibGVfZXZlbnRzLnR0ZV9ldmVudHMgID0gVFRFVlRfREVGQVVMVDsKKyAgbm90aWZpYWJsZV9ldmVudHMudHRlX2V2ZW50cyB8PSBUVEVWVF9TSUdOQUw7CisgIG5vdGlmaWFibGVfZXZlbnRzLnR0ZV9ldmVudHMgfD0gVFRFVlRfRVhFQzsKKyAgbm90aWZpYWJsZV9ldmVudHMudHRlX2V2ZW50cyB8PSBUVEVWVF9FWElUOworICBub3RpZmlhYmxlX2V2ZW50cy50dGVfZXZlbnRzIHw9IFRURVZUX0ZPUks7CisgIG5vdGlmaWFibGVfZXZlbnRzLnR0ZV9ldmVudHMgfD0gVFRFVlRfVkZPUks7CisgIG5vdGlmaWFibGVfZXZlbnRzLnR0ZV9ldmVudHMgfD0gVFRFVlRfTFdQX0NSRUFURTsKKyAgbm90aWZpYWJsZV9ldmVudHMudHRlX2V2ZW50cyB8PSBUVEVWVF9MV1BfRVhJVDsKKyAgbm90aWZpYWJsZV9ldmVudHMudHRlX2V2ZW50cyB8PSBUVEVWVF9MV1BfVEVSTUlOQVRFOworCisgIHR0X3N0YXR1cyA9IGNhbGxfcmVhbF90dHJhY2UgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfUFJPQ19TRVRfRVZFTlRfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxfcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGx3cGlkX3QpIFRUX05JTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpICZub3RpZmlhYmxlX2V2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIHNpemVvZiAobm90aWZpYWJsZV9ldmVudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTklMKTsKK30KKworc3RhdGljIHZvaWQKK3JlcXVpcmVfbm90aWZpY2F0aW9uX29mX2V4ZWNfZXZlbnRzICggcmVhbF9waWQgKQorICBpbnQgIHJlYWxfcGlkOworeworICBpbnQgIHR0X3N0YXR1czsKKyAgdHRldmVudF90ICBub3RpZmlhYmxlX2V2ZW50czsKKworICBsd3BpZF90ICAgIHRpZDsKKyAgdHRzdGF0ZV90ICB0aHJlYWRfc3RhdGU7CisKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgaWYoIGRlYnVnX29uICkKKyAgICAgIHByaW50ZiggIlJlcXVpcmUgbm90aWYsIHBpZCBpcyAlZFxuIiwgcmVhbF9waWQgKTsKKyNlbmRpZgorCisgIC8qIFRlbXBvcmFyeSBIQUNLOiB0ZWxsIGluZnRhcmcuYy9jaGlsZF93YWl0IHRvIG5vdAorICAgKiBsb29wIHVudGlsIHBpZHMgYXJlIHRoZSBzYW1lLgorICAgKi8KKyAgbm90X3NhbWVfcmVhbF9waWQgPSAwOworCisgIHNpZ2VtcHR5c2V0ICgmbm90aWZpYWJsZV9ldmVudHMudHRlX3NpZ25hbHMpOworICBub3RpZmlhYmxlX2V2ZW50cy50dGVfb3B0cyA9IFRURU9fTk9TVFJDQ0hMRDsKKworICAvKiBUaGlzIGVuc3VyZXMgdGhhdCBmb3JrZWQgY2hpbGRyZW4gZG9uJ3QgaW5oZXJpdCB0aGVpciBwYXJlbnQncworICAgKiBldmVudCBtYXNrLCB3aGljaCB3ZSdyZSBzZXR0aW5nIGhlcmUuCisgICAqLworICBub3RpZmlhYmxlX2V2ZW50cy50dGVfb3B0cyAmPSB+VFRFT19QUk9DX0lOSEVSSVQ7CisKKyAgbm90aWZpYWJsZV9ldmVudHMudHRlX2V2ZW50cyAgPSBUVEVWVF9ERUZBVUxUOworICBub3RpZmlhYmxlX2V2ZW50cy50dGVfZXZlbnRzIHw9IFRURVZUX0VYRUM7CisgIG5vdGlmaWFibGVfZXZlbnRzLnR0ZV9ldmVudHMgfD0gVFRFVlRfRVhJVDsKKworICB0dF9zdGF0dXMgPSBjYWxsX3JlYWxfdHRyYWNlICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1BST0NfU0VUX0VWRU5UX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsX3BpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsd3BpZF90KSBUVF9OSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSAmbm90aWZpYWJsZV9ldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBzaXplb2YgKG5vdGlmaWFibGVfZXZlbnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX05JTCk7Cit9CisKKwwKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBwYXJlbnQgcHJvY2Vzcywgd2l0aCBwaWQgYmVpbmcgdGhlCisgKiBJRCBvZiB0aGUgY2hpbGQgcHJvY2VzcywgYWZ0ZXIgdGhlIGRlYnVnZ2VyIGhhcyBmb3JrZWQuCisgKi8KK3ZvaWQKK2NoaWxkX2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IgKHBpZCkKKyAgICBpbnQgIHBpZDsKK3sKKyAgLyogV2UgbmVlZCBhIG1lbW9yeSBob21lIGZvciBhIGNvbnN0YW50LCB0byBwYXNzIGl0IHRvIHR0cmFjZS4KKyAgICAgVGhlIHZhbHVlIG9mIHRoZSBjb25zdGFudCBpcyBhcmJpdHJhcnksIHNvIGxvbmcgYXMgYm90aAorICAgICBwYXJlbnQgYW5kIGNoaWxkIHVzZSB0aGUgc2FtZSB2YWx1ZS4gIE1pZ2h0IGFzIHdlbGwgdXNlIHRoZQorICAgICAibWFnaWMiIGNvbnN0YW50IHByb3ZpZGVkIGJ5IHR0cmFjZS4uLgorICAgICAqLworICB1aW50NjRfdCAgdGNfbWFnaWNfcGFyZW50ID0gVFRfVkVSU0lPTjsKKyAgdWludDY0X3QgIHRjX21hZ2ljX2NoaWxkID0gMDsKKworICAvKiBXYWl0IGZvciB0aGUgY2hpbGQgdG8gdGVsbCB1cyB0aGF0IGl0IGhhcyBmb3JrZWQuICovCisgIHJlYWQgKHN0YXJ0dXBfc2VtYXBob3JlLmNoaWxkX2NoYW5uZWxbU0VNX0xJU1RFTl0sCisgICAgICAgICZ0Y19tYWdpY19jaGlsZCwKKyAgICAgICAgc2l6ZW9mKHRjX21hZ2ljX2NoaWxkKSk7CisKKyAgLyogQ2xlYXIgdGhyZWFkIGluZm8gbm93LiAgV2UnZCBsaWtlIHRvIGRvIHRoaXMgaW4KKyAgICogInJlcXVpcmUuLi4iLCBidXQgdGhhdCBtZXNzZXMgdXAgYXR0YWNoLgorICAgKi8KKyAgY2xlYXJfdGhyZWFkX2luZm8oKTsKKworICAvKiBUZWxsIHRoZSAicmVzdCBvZiBnZGIiIHRoYXQgdGhlIGluaXRpYWwgdGhyZWFkIGV4aXN0cy4KKyAgICogVGhpcyBpc24ndCByZWFsbHkgYSBoYWNrLiAgT3RoZXIgdGhyZWFkLWJhc2VkIHZlcnNpb25zCisgICAqIG9mIGdkYiAoZS5nLiBnbnUtbmF0LmMpIHNlZW0gdG8gZG8gdGhlIHNhbWUgdGhpbmcuCisgICAqCisgICAqIFE6IFdoeSBkb24ndCB3ZSBhbHNvIGFkZCB0aGlzIHRocmVhZCB0byB0aGUgbG9jYWwKKyAgICogICAgbGlzdCB2aWEgImFkZF90dGhyZWFkIj8KKyAgICoKKyAgICogQTogQmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZSB0aWQsIGFuZCBjYW4ndCBzdG9wIHRoZQorICAgKiAgICB0aGUgcHJvY2VzcyBzYWZlbHkgdG8gYXNrIHdoYXQgaXQgaXMuICBBbnl3YXksIHdlJ2xsCisgICAqICAgIGFkZCBpdCB3aGVuIGl0IGdldHMgdGhlIEVYRUMgZXZlbnQuCisgICAqLworICBhZGRfdGhyZWFkKCBwaWQgKTsgICAgICAgLyogaW4gdGhyZWFkLmMgKi8KKworICAvKiBXZSBjYW4gbm93IHNldCB0aGUgY2hpbGQncyB0dHJhY2UgZXZlbnQgbWFzay4KKyAgICovCisgIHJlcXVpcmVfbm90aWZpY2F0aW9uX29mX2V4ZWNfZXZlbnRzIChwaWQpOworCisgIC8qIFRlbGwgb3Vyc2VsdmVzIHRoYXQgdGhlIHByb2Nlc3MgaXMgcnVubmluZy4KKyAgICovCisgIHByb2Nlc3Nfc3RhdGUgPSBSVU5OSU5HOworCisgIC8qIE5vdGlmeSB0aGUgY2hpbGQgdGhhdCBpdCBjYW4gZXhlYy4gKi8KKyAgd3JpdGUgKHN0YXJ0dXBfc2VtYXBob3JlLnBhcmVudF9jaGFubmVsW1NFTV9UQUxLXSwKKyAgICAgICAgICZ0Y19tYWdpY19wYXJlbnQsCisgICAgICAgICBzaXplb2YgKHRjX21hZ2ljX3BhcmVudCkpOworCisgIC8qIERpc2NhcmQgb3VyIGNvcHkgb2YgdGhlIHNlbWFwaG9yZS4gKi8KKyAgKHZvaWQpIGNsb3NlIChzdGFydHVwX3NlbWFwaG9yZS5wYXJlbnRfY2hhbm5lbFtTRU1fTElTVEVOXSk7CisgICh2b2lkKSBjbG9zZSAoc3RhcnR1cF9zZW1hcGhvcmUucGFyZW50X2NoYW5uZWxbU0VNX1RBTEtdKTsKKyAgKHZvaWQpIGNsb3NlIChzdGFydHVwX3NlbWFwaG9yZS5jaGlsZF9jaGFubmVsW1NFTV9MSVNURU5dKTsKKyAgKHZvaWQpIGNsb3NlIChzdGFydHVwX3NlbWFwaG9yZS5jaGlsZF9jaGFubmVsW1NFTV9UQUxLXSk7Cit9CisKKworLyoKKyAqIGFycmFuZ2UgZm9yIG5vdGlmaWNhdGlvbiBvZiBhbGwgZXZlbnRzIGJ5CisgKiBjYWxsaW5nIHJlcXVpcmVfbm90aWZpY2F0aW9uX29mX2V2ZW50cy4KKyAqLwordm9pZAorY2hpbGRfcG9zdF9zdGFydHVwX2luZmVyaW9yICggcmVhbF9waWQpCisgIGludCAgcmVhbF9waWQ7Cit7CisgIHJlcXVpcmVfbm90aWZpY2F0aW9uX29mX2V2ZW50cyAocmVhbF9waWQpOworfQorCisvKiBGcm9tIGhlcmUgb24sIHdlIHNob3VsZCBleHBlY3QgdGlkcyByYXRoZXIgdGhhbiBwaWRzLgorICovCitzdGF0aWMgdm9pZAoraHBwYV9lbmFibGVfY2F0Y2hfZm9yayAodGlkKQorICBpbnQgIHRpZDsKK3sKKyAgaW50ICAgICAgICB0dF9zdGF0dXM7CisgIHR0ZXZlbnRfdCAgdHRyYWNlX2V2ZW50czsKKworICAvKiBHZXQgdGhlIHNldCBvZiBldmVudHMgdGhhdCBhcmUgY3VycmVudGx5IGVuYWJsZWQuCisgICAqLworICB0dF9zdGF0dXMgPSBjYWxsX3R0cmFjZSAoVFRfUFJPQ19HRVRfRVZFTlRfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpICZ0dHJhY2VfZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgc2l6ZW9mICh0dHJhY2VfZXZlbnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX05JTCApOworICBpZiAoZXJybm8pCisgICAgcGVycm9yX3dpdGhfbmFtZSAoInR0cmFjZSIpOworCisgIC8qIEFkZCBmb3JrcyB0byB0aGF0IHNldC4gKi8KKyAgdHRyYWNlX2V2ZW50cy50dGVfZXZlbnRzIHw9IFRURVZUX0ZPUks7CisKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgaWYoIGRlYnVnX29uICkKKyAgICAgIHByaW50ZiggImVuYWJsZSBmb3JrLCB0aWQgaXMgJWRcbiIsIHRpZCApOworI2VuZGlmCisKKyAgdHRfc3RhdHVzID0gY2FsbF90dHJhY2UgKFRUX1BST0NfU0VUX0VWRU5UX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSAmdHRyYWNlX2V2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIHNpemVvZiAodHRyYWNlX2V2ZW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9OSUwpOworICBpZiAoZXJybm8pCisgICAgcGVycm9yX3dpdGhfbmFtZSAoInR0cmFjZSIpOworfQorCisKK3N0YXRpYyB2b2lkCitocHBhX2Rpc2FibGVfY2F0Y2hfZm9yayAodGlkKQorICBpbnQgIHRpZDsKK3sKKyAgaW50ICAgICAgICB0dF9zdGF0dXM7CisgIHR0ZXZlbnRfdCAgdHRyYWNlX2V2ZW50czsKKworICAvKiBHZXQgdGhlIHNldCBvZiBldmVudHMgdGhhdCBhcmUgY3VycmVudGx5IGVuYWJsZWQuCisgICAqLworICB0dF9zdGF0dXMgPSBjYWxsX3R0cmFjZSAoVFRfUFJPQ19HRVRfRVZFTlRfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpICZ0dHJhY2VfZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgc2l6ZW9mICh0dHJhY2VfZXZlbnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX05JTCk7CisKKyAgaWYgKGVycm5vKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJ0dHJhY2UiKTsKKworICAvKiBSZW1vdmUgZm9ya3MgZnJvbSB0aGF0IHNldC4gKi8KKyAgdHRyYWNlX2V2ZW50cy50dGVfZXZlbnRzICY9IH5UVEVWVF9GT1JLOworCisjaWZkZWYgVEhSRUFEX0RFQlVHCisgIGlmKCBkZWJ1Z19vbiApCisgICAgICBwcmludGYoImRpc2FibGUgZm9yaywgdGlkIGlzICVkXG4iLCB0aWQgKTsKKyNlbmRpZgorCisgIHR0X3N0YXR1cyA9IGNhbGxfdHRyYWNlIChUVF9QUk9DX1NFVF9FVkVOVF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgJnR0cmFjZV9ldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBzaXplb2YgKHR0cmFjZV9ldmVudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTklMKTsKKworICBpZiAoZXJybm8pCisgICAgcGVycm9yX3dpdGhfbmFtZSAoInR0cmFjZSIpOworfQorCisKKyNpZiBkZWZpbmVkKENISUxEX0lOU0VSVF9GT1JLX0NBVENIUE9JTlQpCitpbnQKK2NoaWxkX2luc2VydF9mb3JrX2NhdGNocG9pbnQgKHRpZCkKKyAgaW50ICB0aWQ7Cit7CisgIC8qIEVuYWJsZSByZXBvcnRpbmcgb2YgZm9yayBldmVudHMgZnJvbSB0aGUga2VybmVsLiAqLworICAvKiA/P3JlaHJhdWVyOiBGb3IgdGhlIG1vbWVudCwgd2UncmUgYWx3YXlzIGVuYWJsaW5nIHRoZXNlIGV2ZW50cywKKyAgICAgYW5kIGp1c3QgaWdub3JpbmcgdGhlbSBpZiB0aGVyZSdzIG5vIGNhdGNocG9pbnQgdG8gY2F0Y2ggdGhlbS4KKyAgICAgKi8KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChDSElMRF9SRU1PVkVfRk9SS19DQVRDSFBPSU5UKQoraW50CitjaGlsZF9yZW1vdmVfZm9ya19jYXRjaHBvaW50ICh0aWQpCisgIGludCAgdGlkOworeworICAvKiBEaXNhYmxlIHJlcG9ydGluZyBvZiBmb3JrIGV2ZW50cyBmcm9tIHRoZSBrZXJuZWwuICovCisgIC8qID8/cmVocmF1ZXI6IEZvciB0aGUgbW9tZW50LCB3ZSdyZSBhbHdheXMgZW5hYmxpbmcgdGhlc2UgZXZlbnRzLAorICAgICBhbmQganVzdCBpZ25vcmluZyB0aGVtIGlmIHRoZXJlJ3Mgbm8gY2F0Y2hwb2ludCB0byBjYXRjaCB0aGVtLgorICAgICAqLworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkCitocHBhX2VuYWJsZV9jYXRjaF92Zm9yayAodGlkKQorICBpbnQgIHRpZDsKK3sKKyAgaW50ICB0dF9zdGF0dXM7CisgIHR0ZXZlbnRfdCAgdHRyYWNlX2V2ZW50czsKKworICAvKiBHZXQgdGhlIHNldCBvZiBldmVudHMgdGhhdCBhcmUgY3VycmVudGx5IGVuYWJsZWQuCisgICAqLworICB0dF9zdGF0dXMgPSBjYWxsX3R0cmFjZSAoVFRfUFJPQ19HRVRfRVZFTlRfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpICZ0dHJhY2VfZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgc2l6ZW9mICh0dHJhY2VfZXZlbnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX05JTCk7CisKKyAgaWYgKGVycm5vKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJ0dHJhY2UiKTsKKworICAvKiBBZGQgdmZvcmtzIHRvIHRoYXQgc2V0LiAqLworICB0dHJhY2VfZXZlbnRzLnR0ZV9ldmVudHMgfD0gVFRFVlRfVkZPUks7CisKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgaWYoIGRlYnVnX29uICkKKyAgICAgIHByaW50ZigiZW5hYmxlIHZmb3JrLCB0aWQgaXMgJWRcbiIsIHRpZCApOworI2VuZGlmCisKKyAgdHRfc3RhdHVzID0gY2FsbF90dHJhY2UgKFRUX1BST0NfU0VUX0VWRU5UX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSAmdHRyYWNlX2V2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIHNpemVvZiAodHRyYWNlX2V2ZW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9OSUwpOworCisgIGlmIChlcnJubykKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgidHRyYWNlIik7Cit9CisKKworc3RhdGljIHZvaWQKK2hwcGFfZGlzYWJsZV9jYXRjaF92Zm9yayAodGlkKQorICBpbnQgIHRpZDsKK3sKKyAgaW50ICB0dF9zdGF0dXM7CisgIHR0ZXZlbnRfdCAgdHRyYWNlX2V2ZW50czsKKworICAvKiBHZXQgdGhlIHNldCBvZiBldmVudHMgdGhhdCBhcmUgY3VycmVudGx5IGVuYWJsZWQuICovCisgIHR0X3N0YXR1cyA9IGNhbGxfdHRyYWNlIChUVF9QUk9DX0dFVF9FVkVOVF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgJnR0cmFjZV9ldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBzaXplb2YgKHR0cmFjZV9ldmVudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTklMKTsKKworICBpZiAoZXJybm8pCisgICAgcGVycm9yX3dpdGhfbmFtZSAoInR0cmFjZSIpOworCisgIC8qIFJlbW92ZSB2Zm9ya3MgZnJvbSB0aGF0IHNldC4gKi8KKyAgdHRyYWNlX2V2ZW50cy50dGVfZXZlbnRzICY9IH5UVEVWVF9WRk9SSzsKKworI2lmZGVmIFRIUkVBRF9ERUJVRworICBpZiggZGVidWdfb24gKQorICAgICAgcHJpbnRmKCJkaXNhYmxlIHZmb3JrLCB0aWQgaXMgJWRcbiIsIHRpZCApOworI2VuZGlmCisgIHR0X3N0YXR1cyA9IGNhbGxfdHRyYWNlIChUVF9QUk9DX1NFVF9FVkVOVF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgJnR0cmFjZV9ldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBzaXplb2YgKHR0cmFjZV9ldmVudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTklMKTsKKworICBpZiAoZXJybm8pCisgICAgcGVycm9yX3dpdGhfbmFtZSAoInR0cmFjZSIpOworfQorCisKKyNpZiBkZWZpbmVkKENISUxEX0lOU0VSVF9WRk9SS19DQVRDSFBPSU5UKQoraW50CitjaGlsZF9pbnNlcnRfdmZvcmtfY2F0Y2hwb2ludCAodGlkKQorICBpbnQgIHRpZDsKK3sKKyAgLyogRW5hYmxlIHJlcG9ydGluZyBvZiB2Zm9yayBldmVudHMgZnJvbSB0aGUga2VybmVsLiAqLworICAvKiA/P3JlaHJhdWVyOiBGb3IgdGhlIG1vbWVudCwgd2UncmUgYWx3YXlzIGVuYWJsaW5nIHRoZXNlIGV2ZW50cywKKyAgICAgYW5kIGp1c3QgaWdub3JpbmcgdGhlbSBpZiB0aGVyZSdzIG5vIGNhdGNocG9pbnQgdG8gY2F0Y2ggdGhlbS4KKyAgICAgKi8KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChDSElMRF9SRU1PVkVfVkZPUktfQ0FUQ0hQT0lOVCkKK2ludAorY2hpbGRfcmVtb3ZlX3Zmb3JrX2NhdGNocG9pbnQgKHRpZCkKKyAgaW50ICB0aWQ7Cit7CisgIC8qIERpc2FibGUgcmVwb3J0aW5nIG9mIHZmb3JrIGV2ZW50cyBmcm9tIHRoZSBrZXJuZWwuICovCisgIC8qID8/cmVocmF1ZXI6IEZvciB0aGUgbW9tZW50LCB3ZSdyZSBhbHdheXMgZW5hYmxpbmcgdGhlc2UgZXZlbnRzLAorICAgICBhbmQganVzdCBpZ25vcmluZyB0aGVtIGlmIHRoZXJlJ3Mgbm8gY2F0Y2hwb2ludCB0byBjYXRjaCB0aGVtLgorICAgICAqLworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDSElMRF9IQVNfRk9SS0VEKQorCisvKiBROiBEbyB3ZSBuZWVkIHRvIG1hcCB0aGUgcmV0dXJuZWQgcHJvY2VzcyBJRCB0byBhIHRocmVhZCBJRD8KKyAqCisgKiBBOiBJIGRvbid0IHRoaW5rIHNvLS1oZXJlIHdlIHdhbnQgYSBfcmVhbF8gcGlkLiAgQW55IGxhdGVyCisgKiAgICBvcGVyYXRpb25zIHdpbGwgY2FsbCAicmVxdWlyZV9ub3RpZmljYXRpb25fb2ZfZXZlbnRzIiBhbmQKKyAqICAgIHN0YXJ0IHRoZSBtYXBwaW5nLgorICovCitpbnQKK2NoaWxkX2hhc19mb3JrZWQgKHRpZCwgY2hpbGRwaWQpCisgIGludCAgdGlkOworICBpbnQgKmNoaWxkcGlkOworeworICBpbnQgIHR0X3N0YXR1czsKKyAgdHRzdGF0ZV90ICB0dHJhY2Vfc3RhdGU7CisgIHRocmVhZF9pbmZvICogIHRpbmZvOworCisgIC8qIERvIHdlIGhhdmUgY2FjaGVkIHRocmVhZCBzdGF0ZSB0aGF0IHdlIGNhbiBjb25zdWx0PyAgSWYgc28sIHVzZSBpdC4gKi8KKyAgdGluZm8gPSBmaW5kX3RocmVhZF9pbmZvIChtYXBfZnJvbV9nZGJfdGlkICh0aWQpKTsKKyAgaWYgKHRpbmZvICE9IE5VTEwpIHsKKyAgICBjb3B5X3R0c3RhdGVfdCAoJnR0cmFjZV9zdGF0ZSwgJnRpbmZvLT5sYXN0X3N0b3Bfc3RhdGUpOworICB9CisKKyAgLyogTm9wZSwgbXVzdCByZWFkIHRoZSB0aHJlYWQncyBjdXJyZW50IHN0YXRlICovCisgIGVsc2UKKyAgICB7CisgICAgICB0dF9zdGF0dXMgPSBjYWxsX3R0cmFjZSAoVFRfTFdQX0dFVF9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgJnR0cmFjZV9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBzaXplb2YgKHR0cmFjZV9zdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTklMKTsKKworICAgICAgaWYgKGVycm5vKQorICAgICAgICBwZXJyb3Jfd2l0aF9uYW1lICgidHRyYWNlIik7CisgICAgCisgICAgICBpZiAodHRfc3RhdHVzIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmICh0dHJhY2Vfc3RhdGUudHRzX2V2ZW50ICYgVFRFVlRfRk9SSykKKyAgICB7CisgICAgICAqY2hpbGRwaWQgPSB0dHJhY2Vfc3RhdGUudHRzX3UudHRzX2ZvcmsudHRzX2ZwaWQ7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChDSElMRF9IQVNfVkZPUktFRCkKKworLyogU2VlIGNoaWxkX2hhc19mb3JrZWQgZm9yIHBpZCBkaXNjdXNzaW9uLgorICovCitpbnQKK2NoaWxkX2hhc192Zm9ya2VkICh0aWQsIGNoaWxkcGlkKQorICBpbnQgIHRpZDsKKyAgaW50ICogIGNoaWxkcGlkOworeworICBpbnQgIHR0X3N0YXR1czsKKyAgdHRzdGF0ZV90ICB0dHJhY2Vfc3RhdGU7CisgIHRocmVhZF9pbmZvICogIHRpbmZvOworCisgIC8qIERvIHdlIGhhdmUgY2FjaGVkIHRocmVhZCBzdGF0ZSB0aGF0IHdlIGNhbiBjb25zdWx0PyAgSWYgc28sIHVzZSBpdC4gKi8KKyAgdGluZm8gPSBmaW5kX3RocmVhZF9pbmZvIChtYXBfZnJvbV9nZGJfdGlkICh0aWQpKTsKKyAgaWYgKHRpbmZvICE9IE5VTEwpCisgICAgY29weV90dHN0YXRlX3QgKCZ0dHJhY2Vfc3RhdGUsICZ0aW5mby0+bGFzdF9zdG9wX3N0YXRlKTsKKworICAvKiBOb3BlLCBtdXN0IHJlYWQgdGhlIHRocmVhZCdzIGN1cnJlbnQgc3RhdGUgKi8KKyAgZWxzZQorICAgIHsKKyAgICAgIHR0X3N0YXR1cyA9IGNhbGxfdHRyYWNlIChUVF9MV1BfR0VUX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSAmdHRyYWNlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIHNpemVvZiAodHRyYWNlX3N0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9OSUwpOworCisgICAgICBpZiAoZXJybm8pCisgICAgICAgIHBlcnJvcl93aXRoX25hbWUgKCJ0dHJhY2UiKTsKKyAgICAKKyAgICAgIGlmICh0dF9zdGF0dXMgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKHR0cmFjZV9zdGF0ZS50dHNfZXZlbnQgJiBUVEVWVF9WRk9SSykKKyAgICB7CisgICAgICAqY2hpbGRwaWQgPSB0dHJhY2Vfc3RhdGUudHRzX3UudHRzX2ZvcmsudHRzX2ZwaWQ7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChDSElMRF9DQU5fRk9MTE9XX1ZGT1JLX1BSSU9SX1RPX0VYRUMpCitpbnQKK2NoaWxkX2Nhbl9mb2xsb3dfdmZvcmtfcHJpb3JfdG9fZXhlYyAoKQoreworICAvKiB0dHJhY2UgZG9lcyBhbGxvdyB0aGlzLgorCisgICAgID8/cmVocmF1ZXI6IEhvd2V2ZXIsIEkgaGFkIG1ham9yLWxlYWd1ZSBwcm9ibGVtcyB0cnlpbmcgdG8KKyAgICAgY29udmluY2Ugd2FpdF9mb3JfaW5mZXJpb3IgdG8gaGFuZGxlIHRoYXQgY2FzZS4gIFBlcmhhcHMgd2hlbgorICAgICBpdCBpcyByZXdyaXR0ZW4gdG8gZ3JvayBtdWx0aXBsZSBwcm9jZXNzZXMgaW4gYW4gZXhwbGljaXQgd2F5Li4uCisgICAgICovCisgIHJldHVybiAwOworfQorI2VuZGlmCisKKworI2lmIGRlZmluZWQoQ0hJTERfSU5TRVJUX0VYRUNfQ0FUQ0hQT0lOVCkKK2ludAorY2hpbGRfaW5zZXJ0X2V4ZWNfY2F0Y2hwb2ludCAodGlkKQorICBpbnQgIHRpZDsKK3sKKyAgLyogRW5hYmxlIHJlcG9ydGluZyBvZiBleGVjIGV2ZW50cyBmcm9tIHRoZSBrZXJuZWwuICovCisgIC8qID8/cmVocmF1ZXI6IEZvciB0aGUgbW9tZW50LCB3ZSdyZSBhbHdheXMgZW5hYmxpbmcgdGhlc2UgZXZlbnRzLAorICAgICBhbmQganVzdCBpZ25vcmluZyB0aGVtIGlmIHRoZXJlJ3Mgbm8gY2F0Y2hwb2ludCB0byBjYXRjaCB0aGVtLgorICAgICAqLworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKENISUxEX1JFTU9WRV9FWEVDX0NBVENIUE9JTlQpCitpbnQKK2NoaWxkX3JlbW92ZV9leGVjX2NhdGNocG9pbnQgKHRpZCkKKyAgaW50ICB0aWQ7Cit7CisgIC8qIERpc2FibGUgcmVwb3J0aW5nIG9mIGV4ZWNldmVudHMgZnJvbSB0aGUga2VybmVsLiAqLworICAvKiA/P3JlaHJhdWVyOiBGb3IgdGhlIG1vbWVudCwgd2UncmUgYWx3YXlzIGVuYWJsaW5nIHRoZXNlIGV2ZW50cywKKyAgICAgYW5kIGp1c3QgaWdub3JpbmcgdGhlbSBpZiB0aGVyZSdzIG5vIGNhdGNocG9pbnQgdG8gY2F0Y2ggdGhlbS4KKyAgICAgKi8KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChDSElMRF9IQVNfRVhFQ0QpCitpbnQKK2NoaWxkX2hhc19leGVjZCAodGlkLCBleGVjZF9wYXRobmFtZSkKKyAgaW50ICB0aWQ7CisgIGNoYXIgKiogIGV4ZWNkX3BhdGhuYW1lOworeworICBpbnQgIHR0X3N0YXR1czsKKyAgdHRzdGF0ZV90ICB0dHJhY2Vfc3RhdGU7CisgIHRocmVhZF9pbmZvICogIHRpbmZvOworCisgIC8qIERvIHdlIGhhdmUgY2FjaGVkIHRocmVhZCBzdGF0ZSB0aGF0IHdlIGNhbiBjb25zdWx0PyAgSWYgc28sIHVzZSBpdC4gKi8KKyAgdGluZm8gPSBmaW5kX3RocmVhZF9pbmZvIChtYXBfZnJvbV9nZGJfdGlkICh0aWQpKTsKKyAgaWYgKHRpbmZvICE9IE5VTEwpCisgICAgY29weV90dHN0YXRlX3QgKCZ0dHJhY2Vfc3RhdGUsICZ0aW5mby0+bGFzdF9zdG9wX3N0YXRlKTsKKworICAvKiBOb3BlLCBtdXN0IHJlYWQgdGhlIHRocmVhZCdzIGN1cnJlbnQgc3RhdGUgKi8KKyAgZWxzZQorICAgIHsKKyAgICAgIHR0X3N0YXR1cyA9IGNhbGxfdHRyYWNlIChUVF9MV1BfR0VUX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSAmdHRyYWNlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIHNpemVvZiAodHRyYWNlX3N0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9OSUwpOworCisgICAgICBpZiAoZXJybm8pCisgICAgICAgIHBlcnJvcl93aXRoX25hbWUgKCJ0dHJhY2UiKTsKKyAgICAKKyAgICAgIGlmICh0dF9zdGF0dXMgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKHR0cmFjZV9zdGF0ZS50dHNfZXZlbnQgJiBUVEVWVF9FWEVDKQorICAgIHsKKyAgICAgIC8qIFNlZSBjaGlsZF9waWRfdG9fZXhlY19maWxlIGluIHRoaXMgZmlsZTogdGhpcyBpcyBhIG1hY3JvLgorICAgICAgICovCisgICAgICBjaGFyICogIGV4ZWNfZmlsZSA9IHRhcmdldF9waWRfdG9fZXhlY19maWxlICh0aWQpOworICAgICAgCisgICAgICAqZXhlY2RfcGF0aG5hbWUgPSBzYXZlc3RyaW5nIChleGVjX2ZpbGUsIHN0cmxlbiAoZXhlY19maWxlKSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChDSElMRF9IQVNfU1lTQ0FMTF9FVkVOVCkKK2ludAorY2hpbGRfaGFzX3N5c2NhbGxfZXZlbnQgKHBpZCwga2luZCwgc3lzY2FsbF9pZCkKKyAgaW50ICBwaWQ7CisgIGVudW0gdGFyZ2V0X3dhaXRraW5kICogIGtpbmQ7CisgIGludCAqICBzeXNjYWxsX2lkOworeworICBpbnQgIHR0X3N0YXR1czsKKyAgdHRzdGF0ZV90ICB0dHJhY2Vfc3RhdGU7CisgIHRocmVhZF9pbmZvICogIHRpbmZvOworCisgIC8qIERvIHdlIGhhdmUgY2FjaGVkIHRocmVhZCBzdGF0ZSB0aGF0IHdlIGNhbiBjb25zdWx0PyAgSWYgc28sIHVzZSBpdC4gKi8KKyAgdGluZm8gPSBmaW5kX3RocmVhZF9pbmZvIChtYXBfZnJvbV9nZGJfdGlkIChwaWQpKTsKKyAgaWYgKHRpbmZvICE9IE5VTEwpCisgICAgY29weV90dHN0YXRlX3QgKCZ0dHJhY2Vfc3RhdGUsICZ0aW5mby0+bGFzdF9zdG9wX3N0YXRlKTsKKworICAvKiBOb3BlLCBtdXN0IHJlYWQgdGhlIHRocmVhZCdzIGN1cnJlbnQgc3RhdGUgKi8KKyAgZWxzZQorICAgIHsKKyAgICB0dF9zdGF0dXMgPSBjYWxsX3R0cmFjZSAoVFRfTFdQX0dFVF9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgJnR0cmFjZV9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBzaXplb2YgKHR0cmFjZV9zdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTklMKTsKKworICAgICAgaWYgKGVycm5vKQorICAgICAgICBwZXJyb3Jfd2l0aF9uYW1lICgidHRyYWNlIik7CisgICAgCisgICAgICBpZiAodHRfc3RhdHVzIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICpraW5kID0gVEFSR0VUX1dBSVRLSU5EX1NQVVJJT1VTOyAgLyogVW50aWwgcHJvdmVuIG90aGVyd2lzZS4uLiAqLworICAqc3lzY2FsbF9pZCA9IC0xOworCisgIGlmICh0dHJhY2Vfc3RhdGUudHRzX2V2ZW50ICYgVFRFVlRfU1lTQ0FMTF9FTlRSWSkKKyAgICAqa2luZCA9IFRBUkdFVF9XQUlUS0lORF9TWVNDQUxMX0VOVFJZOworICBlbHNlIGlmICh0dHJhY2Vfc3RhdGUudHRzX2V2ZW50ICYgVFRFVlRfU1lTQ0FMTF9SRVRVUk4pCisgICAgKmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1lTQ0FMTF9SRVRVUk47CisgIGVsc2UKKyAgICByZXR1cm4gMDsKKworICAqc3lzY2FsbF9pZCA9IHR0cmFjZV9zdGF0ZS50dHNfc2NubzsKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworCisMCisjaWYgZGVmaW5lZChDSElMRF9USFJFQURfQUxJVkUpCisKKy8qIENoZWNrIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gdGhyZWFkIGlzIGFsaXZlLgorICoKKyAqIFdlJ2xsIHRydXN0IHRoZSB0aHJlYWQgbGlzdCwgYXMgdGhlIG1vcmUgY29ycmVjdAorICogYXBwcm9hY2ggb2Ygc3RvcHBpbmcgdGhlIHByb2Nlc3MgYW5kIHNwaW5uaW5nIGRvd24KKyAqIHRoZSBPUydzIHRocmVhZCBsaXN0IGlzIF92ZXJ5XyBleHBlbnNpdmUuCisgKgorICogTWF5IG5lZWQgYSBGSVhNRSBmb3IgdGhhdCByZWFzb24uCisgKi8KK2ludAorY2hpbGRfdGhyZWFkX2FsaXZlIChnZGJfdGlkKQorICAgICBsd3BpZF90IGdkYl90aWQ7Cit7CisgICBsd3BpZF90ICB0aWQ7CisKKyAgIC8qIFRoaXMgc3BpbnMgZG93biB0aGUgbGlzdHMgdHdpY2UuCisgICAgKiBQb3NzaWJsZSBwZWZvcm1hbmNlIGltcHJvdmVtZW50IGhlcmUhCisgICAgKi8KKyAgIHRpZCA9IG1hcF9mcm9tX2dkYl90aWQoIGdkYl90aWQgKTsKKyAgIHJldHVybiAhaXNfdGVybWluYXRlZCggdGlkICk7Cit9CisKKyNlbmRpZgorCisKKwwKKy8qIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gcmVhZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZQorICAgc2F2ZV9zdGF0ZV90IHRoYXQgaXMgb3VyIHZpZXcgaW50byB0aGUgaGFyZHdhcmUgcmVnaXN0ZXJzLCBzdGFydGluZyBhdAorICAgc3Nfb2Zmc2V0LCBhbmQgZW5kaW5nIGF0IHNzX29mZnNldCArIHNpemVvZl9idWYgLSAxCisKKyAgIElmIHRoaXMgZnVuY3Rpb24gc3VjY2VlZHMsIGl0IGRlcG9zaXRzIHRoZSBmZXRjaGVkIGJ5dGVzIGludG8gYnVmLAorICAgYW5kIHJldHVybnMgMC4KKworICAgSWYgaXQgZmFpbHMsIGl0IHJldHVybnMgYSBuZWdhdGl2ZSByZXN1bHQuICBUaGUgY29udGVudHMgb2YgYnVmIGFyZQorICAgdW5kZWZpbmVkIGl0IHRoaXMgZnVuY3Rpb24gZmFpbHMuCisgICAqLworaW50CityZWFkX2Zyb21fcmVnaXN0ZXJfc2F2ZV9zdGF0ZSAodGlkLCBzc19vZmZzZXQsIGJ1Ziwgc2l6ZW9mX2J1ZikKKyAgICBpbnQgIHRpZDsKKyAgICBUVFJBQ0VfQVJHX1RZUEUgIHNzX29mZnNldDsKKyAgICBjaGFyICogIGJ1ZjsKKyAgICBpbnQgIHNpemVvZl9idWY7Cit7CisgIGludCAgdHRfc3RhdHVzOworICByZWdpc3Rlcl92YWx1ZV90ICByZWdpc3Rlcl92YWx1ZSA9IDA7CisKKyAgdHRfc3RhdHVzID0gY2FsbF90dHJhY2UgKFRUX0xXUF9SVVJFR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzc19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBzaXplb2ZfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgYnVmKTsKKworICBpZiggdHRfc3RhdHVzID09IDEgKQorICAgICAgLyogTWFwIHR0cmFjZSdzIHZlcnNpb24gb2Ygc3VjY2VzcyB0byBvdXIgdmVyc2lvbi4KKyAgICAgICAqIFNvbWV0aW1lIHR0cmFjZSByZXR1cm5zIDAsIGJ1dCB0aGF0J3Mgb2sgaGVyZS4KKyAgICAgICAqLworICAgICAgcmV0dXJuIDA7CisgICAgICAKKyAgcmV0dXJuIHR0X3N0YXR1czsKK30KKworDAorLyogVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byB3cml0ZSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyB0byB0aGUKKyAgIHNhdmVfc3RhdGVfdCB0aGF0IGlzIG91ciB2aWV3IGludG8gdGhlIGhhcmR3YXJlIHJlZ2lzdGVycywgc3RhcnRpbmcgYXQKKyAgIHNzX29mZnNldCwgYW5kIGVuZGluZyBhdCBzc19vZmZzZXQgKyBzaXplb2ZfYnVmIC0gMQorCisgICBJZiB0aGlzIGZ1bmN0aW9uIHN1Y2NlZWRzLCBpdCBkZXBvc2l0cyB0aGUgYnl0ZXMgaW4gYnVmLCBhbmQgcmV0dXJucyAwLgorCisgICBJZiBpdCBmYWlscywgaXQgcmV0dXJucyBhIG5lZ2F0aXZlIHJlc3VsdC4gIFRoZSBjb250ZW50cyBvZiB0aGUgc2F2ZV9zdGF0ZV90CisgICBhcmUgdW5kZWZpbmVkIGl0IHRoaXMgZnVuY3Rpb24gZmFpbHMuCisgICAqLworaW50Cit3cml0ZV90b19yZWdpc3Rlcl9zYXZlX3N0YXRlICh0aWQsIHNzX29mZnNldCwgYnVmLCBzaXplb2ZfYnVmKQorICAgIGludCAgdGlkOworICAgIFRUUkFDRV9BUkdfVFlQRSAgc3Nfb2Zmc2V0OworICAgIGNoYXIgKiAgYnVmOworICAgIGludCAgc2l6ZW9mX2J1ZjsKK3sKKyAgaW50ICB0dF9zdGF0dXM7CisgIHJlZ2lzdGVyX3ZhbHVlX3QgIHJlZ2lzdGVyX3ZhbHVlID0gMDsKKworICB0dF9zdGF0dXMgPSBjYWxsX3R0cmFjZSAoVFRfTFdQX1dVUkVHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIHNpemVvZl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBidWYpOworICByZXR1cm4gdHRfc3RhdHVzOworfQorCisMCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGEgc29wIHRvIHRoZSBsYXJnZWlzaCBudW1iZXIgb2YgZGlyZWN0IGNhbGxzCisgICB0byBjYWxsX3B0cmFjZSB0aGF0IGV4aXN0IGluIG90aGVyIGZpbGVzLiAgUmF0aGVyIHRoYW4gY3JlYXRlCisgICBmdW5jdGlvbnMgd2hvc2UgbmFtZSBhYnN0cmFjdHMgYXdheSBmcm9tIHB0cmFjZSwgYW5kIGNoYW5nZSBhbGwKKyAgIHRoZSBwcmVzZW50IGNhbGxlcnMgb2YgY2FsbF9wdHJhY2UsIHdlJ2xsIGRvIHRoZSBleHBlZGllbnQgKGFuZAorICAgcGVyaGFwcyBvbmx5IHByYWN0aWNhbCkgdGhpbmcuCisKKyAgIE5vdGUgSFAtVVggZXhwbGljaXRseSBkaXNhbGxvd3MgYSBtaXggb2YgcHRyYWNlICYgdHRyYWNlIG9uIGEgdHJhY2VkCisgICBwcm9jZXNzLiAgVGh1cywgd2UgbXVzdCB0cmFuc2xhdGUgYWxsIHB0cmFjZSByZXF1ZXN0cyBpbnRvIHRoZWlyCisgICBwcm9jZXNzLXNwZWNpZmljLCB0dHJhY2UgZXF1aXZhbGVudHMuCisgICAqLworaW50CitjYWxsX3B0cmFjZSAocHRfcmVxdWVzdCwgZ2RiX3RpZCwgYWRkciwgZGF0YSkKKyAgICAgaW50ICAgICAgICAgICAgICAgcHRfcmVxdWVzdDsKKyAgICAgaW50ICAgICAgICAgICAgICAgZ2RiX3RpZDsKKyAgICAgUFRSQUNFX0FSRzNfVFlQRSAgYWRkcjsKKyAgICAgaW50ICAgICAgICAgICAgICAgZGF0YTsKK3sKKyAgdHRyZXFfdCAgICAgICAgICAgdHRfcmVxdWVzdDsKKyAgVFRSQUNFX0FSR19UWVBFICAgdHRfYWRkciA9IChUVFJBQ0VfQVJHX1RZUEUpIGFkZHI7CisgIFRUUkFDRV9BUkdfVFlQRSAgIHR0X2RhdGEgPSAoVFRSQUNFX0FSR19UWVBFKSBkYXRhOworICBUVFJBQ0VfQVJHX1RZUEUgICB0dF9hZGRyMiA9IFRUX05JTDsKKyAgaW50ICAgICAgICAgICAgICAgdHRfc3RhdHVzOworICByZWdpc3Rlcl92YWx1ZV90ICByZWdpc3Rlcl92YWx1ZTsKKyAgaW50ICAgICAgICAgICAgICAgcmVhZF9idWY7CisKKyAgLyogUGVyZm9ybSB0aGUgbmVjZXNzYXJ5IGFyZ3VtZW50IHRyYW5zbGF0aW9uLiAgTm90ZSB0aGF0IHNvbWUKKyAgICAgY2FzZXMgYXJlIGZ1bmt5IGVub3VnaCBpbiB0aGUgdHRyYWNlIHJlYWxtIHRoYXQgd2UgaGFuZGxlIHRoZW0KKyAgICAgdmVyeSBzcGVjaWFsbHkuCisgICAqLworICBzd2l0Y2ggKHB0X3JlcXVlc3QpIHsKKyAgICAgIC8qIFRoZSBmb2xsb3dpbmcgY2FzZXMgY2Fubm90IGNvbnZlbmllbnRseSBiZSBoYW5kbGVkIGNvbnZlbmllbnRseQorICAgICAgICAgYnkgbWVyZWx5IGFkanVzdGluZyB0aGUgcHRyYWNlIGFyZ3VtZW50cyBhbmQgZmVlZGluZyBpbnRvIHRoZQorICAgICAgICAgZ2VuZXJpYyBjYWxsIHRvIHR0cmFjZSBhdCB0aGUgYm90dG9tIG9mIHRoaXMgZnVuY3Rpb24uCisKKyAgICAgICAgIE5vdGUgdGhhdCBiZWNhdXNlIGFsbCBicmFuY2hlcyBvZiB0aGlzIHN3aXRjaCBlbmQgaW4gInJldHVybiIsCisgICAgICAgICB0aGVyZSdzIG5vIG5lZWQgZm9yIGFueSAiYnJlYWsiIHN0YXRlbWVudHMuCisgICAgICAgICAqLworICAgICAgY2FzZSBQVF9TRVRUUkMgOgorICAgICAgICAgIHJldHVybiBwYXJlbnRfYXR0YWNoX2FsbCAoKTsKKyAgICAgICAgICAKKyAgICAgIGNhc2UgUFRfUlVSRUdTIDoKKyAgICAgICAgICB0dF9zdGF0dXMgPSByZWFkX2Zyb21fcmVnaXN0ZXJfc2F2ZV9zdGF0ZSAoZ2RiX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2lzdGVyX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKHJlZ2lzdGVyX3ZhbHVlKSk7CisgICAgICAgICAgaWYgKHR0X3N0YXR1cyA8IDApCisgICAgICAgICAgICByZXR1cm4gdHRfc3RhdHVzOworICAgICAgICAgIHJldHVybiByZWdpc3Rlcl92YWx1ZTsKKworICAgICAgY2FzZSBQVF9XVVJFR1MgOgorICAgICAgICAgIHJlZ2lzdGVyX3ZhbHVlID0gKGludCkgdHRfZGF0YTsKKyAgICAgICAgICB0dF9zdGF0dXMgPSB3cml0ZV90b19yZWdpc3Rlcl9zYXZlX3N0YXRlIChnZGJfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0X2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2lzdGVyX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAocmVnaXN0ZXJfdmFsdWUpKTsKKyAgICAgICAgICByZXR1cm4gdHRfc3RhdHVzOworICAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBUX1JFQURfSSA6CisgICAgICAgICAgdHRfc3RhdHVzID0gY2FsbF90dHJhY2UgKFRUX1BST0NfUkRURVhULCAgLyogSW1wbGljaXQgNC1ieXRlIHhmZXIgYmVjb21lcyBibG9jay14ZmVyLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZGJfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSAmcmVhZF9idWYpOworICAgICAgICAgIGlmICh0dF9zdGF0dXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHR0X3N0YXR1czsKKyAgICAgICAgICByZXR1cm4gcmVhZF9idWY7CisKKyAgICAgIGNhc2UgUFRfUkVBRF9EIDoKKyAgICAgICAgICB0dF9zdGF0dXMgPSBjYWxsX3R0cmFjZSAoVFRfUFJPQ19SRERBVEEsICAvKiBJbXBsaWNpdCA0LWJ5dGUgeGZlciBiZWNvbWVzIGJsb2NrLXhmZXIuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkYl90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0X2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpICZyZWFkX2J1Zik7CisgICAgICAgICAgaWYgKHR0X3N0YXR1cyA8IDApCisgICAgICAgICAgICByZXR1cm4gdHRfc3RhdHVzOworICAgICAgICAgIHJldHVybiByZWFkX2J1ZjsKKworICAgICAgY2FzZSBQVF9BVFRBQ0ggOgorICAgICAgICAgIHR0X3N0YXR1cyA9IGNhbGxfcmVhbF90dHJhY2UgKFRUX1BST0NfQVRUQUNILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mcm9tX2dkYl90aWQgKGdkYl90aWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsd3BpZF90KSBUVF9OSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBUVF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0X2FkZHIyKTsKKyAgICAgICAgICBpZiAodHRfc3RhdHVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiB0dF9zdGF0dXM7CisgICAgICAgICAgcmV0dXJuIHR0X3N0YXR1czsKKworICAgICAgLyogVGhlIGZvbGxvd2luZyBjYXNlcyBhcmUgaGFuZGxlZCBieSBtZXJlbHkgYWRqdXN0aW5nIHRoZSBwdHJhY2UKKyAgICAgICAgIGFyZ3VtZW50cyBhbmQgZmVlZGluZyBpbnRvIHRoZSBnZW5lcmljIGNhbGwgdG8gdHRyYWNlLgorICAgICAgICAgKi8KKyAgICAgIGNhc2UgUFRfREVUQUNIIDoKKyAgICAgICAgICB0dF9yZXF1ZXN0ID0gVFRfUFJPQ19ERVRBQ0g7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUFRfV1JJVEVfSSA6CisgICAgICAgICAgdHRfcmVxdWVzdCA9IFRUX1BST0NfV1JURVhUOyAgLyogVHJhbnNsYXRlcyA0LWJ5dGUgeGZlciB0byBibG9jay14ZmVyLiAqLworICAgICAgICAgIHR0X2RhdGEgPSA0OyAgICAgICAgICAgICAgICAgIC8qIFRoaXMgbWFueSBieXRlcy4gKi8KKyAgICAgICAgICB0dF9hZGRyMiA9IChUVFJBQ0VfQVJHX1RZUEUpICZkYXRhOyAgLyogQWRkcmVzcyBvZiB4ZmVyIHNvdXJjZS4gKi8KKyAgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQVF9XUklURV9EIDoKKyAgICAgICAgICB0dF9yZXF1ZXN0ID0gVFRfUFJPQ19XUkRBVEE7ICAvKiBUcmFuc2xhdGVzIDQtYnl0ZSB4ZmVyIHRvIGJsb2NrLXhmZXIuICovCisgICAgICAgICAgdHRfZGF0YSA9IDQ7ICAgICAgICAgICAgICAgICAgLyogVGhpcyBtYW55IGJ5dGVzLiAqLworICAgICAgICAgIHR0X2FkZHIyID0gKFRUUkFDRV9BUkdfVFlQRSkgJmRhdGE7ICAvKiBBZGRyZXNzIG9mIHhmZXIgc291cmNlLiAqLworICAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBUX1JEVEVYVCA6CisgICAgICAgICAgdHRfcmVxdWVzdCA9IFRUX1BST0NfUkRURVhUOworICAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBUX1JEREFUQSA6CisgICAgICAgICAgdHRfcmVxdWVzdCA9IFRUX1BST0NfUkREQVRBOworICAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBUX1dSVEVYVCA6CisgICAgICAgICAgdHRfcmVxdWVzdCA9IFRUX1BST0NfV1JURVhUOworICAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBUX1dSREFUQSA6CisgICAgICAgICAgdHRfcmVxdWVzdCA9IFRUX1BST0NfV1JEQVRBOworICAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBUX0NPTlRJTlVFIDoKKyAgICAgICAgICB0dF9yZXF1ZXN0ID0gVFRfUFJPQ19DT05USU5VRTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQVF9TVEVQIDoKKyAgICAgICAgICB0dF9yZXF1ZXN0ID0gVFRfTFdQX1NJTkdMRTsgIC8qIFNob3VsZCBub3QgYmUgbWFraW5nIHRoaXMgcmVxdWVzdD8gKi8KKyAgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBQVF9LSUxMIDoKKyAgICAgICAgICB0dF9yZXF1ZXN0ID0gVFRfUFJPQ19FWElUOworICAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBUX0dFVF9QUk9DRVNTX1BBVEhOQU1FIDoKKyAgICAgICAgICB0dF9yZXF1ZXN0ID0gVFRfUFJPQ19HRVRfUEFUSE5BTUU7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgIHR0X3JlcXVlc3QgPSBwdF9yZXF1ZXN0OyAgLyogTGV0IHR0cmFjZSBiZSB0aGUgb25lIHRvIGNvbXBsYWluLiAqLworICAgICAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGNhbGxfdHRyYWNlICh0dF9yZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIGdkYl90aWQsCisgICAgICAgICAgICAgICAgICAgICAgdHRfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICB0dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgIHR0X2FkZHIyKTsKK30KKworLyogS2lsbCB0aGF0IHBlc2t5IHByb2Nlc3MhCisgKi8KK3ZvaWQKK2tpbGxfaW5mZXJpb3IgKCkKK3sKKyAgaW50ICB0aWQ7CisgIGludCAgd2FpdF9zdGF0dXM7CisgIHRocmVhZF9pbmZvICogIHQ7CisgIHRocmVhZF9pbmZvICoqcGFyYW5vaWE7CisgIGludCAgICAgICAgICAgcGFyYV9jb3VudCwgaTsKKworICBpZiAoaW5mZXJpb3JfcGlkID09IDApCisgICAgcmV0dXJuOworCisgIC8qIFdhbGsgdGhlIGxpc3Qgb2YgInRocmVhZHMiLCBzb21lIG9mIHdoaWNoIGFyZSAicHNldWRvIHRocmVhZHMiLAorICAgICBha2EgInByb2Nlc3NlcyIuICBGb3IgZWFjaCB0aGF0IGlzIE5PVCBpbmZlcmlvcl9waWQsIHN0b3AgaXQsCisgICAgIGFuZCBkZXRhY2ggaXQuCisKKyAgICAgWW91IHNlZSwgd2UgbWF5IG5vdCBoYXZlIGp1c3QgYSBzaW5nbGUgcHJvY2VzcyB0byBraWxsLiAgSWYgd2UncmUKKyAgICAgcmVzdGFydGluZyBvciBxdWl0dGluZyBvciBkZXRhY2hpbmcganVzdCBhZnRlciB0aGUgaW5mZXJpb3IgaGFzCisgICAgIGZvcmtlZCwgdGhlbiB3ZSd2ZSBhY3R1YWxseSB0d28gcHJvY2Vzc2VzIHRvIGNsZWFuIHVwLgorCisgICAgIEJ1dCB3ZSBjYW4ndCBqdXN0IGNhbGwgdGFyZ2V0X21vdXJuX2luZmVyaW9yKCkgZm9yIGVhY2gsIHNpbmNlIHRoYXQKKyAgICAgemFwcyB0aGUgdGFyZ2V0IHZlY3Rvci4KKyAgICAgKi8KKworICBwYXJhbm9pYSA9ICh0aHJlYWRfaW5mbyAqKikgbWFsbG9jKCB0aHJlYWRfaGVhZC5jb3VudCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0aHJlYWRfaW5mbyAqKSk7CisgIHBhcmFfY291bnQgPSAwOworICAKKyAgdCA9IHRocmVhZF9oZWFkLmhlYWQ7CisgIHdoaWxlICh0KSB7CisgIAorICAgIHBhcmFub2lhWyBwYXJhX2NvdW50IF0gPSB0OworICAgIGZvciggaSA9IDA7IGkgPCBwYXJhX2NvdW50OyBpKysgKXsKKyAgICAgICAgaWYoIHQtPm5leHQgPT0gcGFyYW5vaWFbaV0gKSB7CisgICAgICAgICAgICB3YXJuaW5nKCAiQmFkIGRhdGEgaW4gZ2RiJ3MgdGhyZWFkIGRhdGE7IHJlcGFpcmluZy4iICk7CisgICAgICAgICAgICB0LT5uZXh0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBwYXJhX2NvdW50Kys7CisKKyAgICBpZiAodC0+YW1fcHNldWRvICYmICh0LT5waWQgIT0gaW5mZXJpb3JfcGlkKSkKKyAgICAgIHsKKyAgICAgICAgLyogVFRfUFJPQ19TVE9QIGRvZXNuJ3QgcmVxdWlyZSBhIHN1YnNlcXVlbnQgdHRyYWNlX3dhaXQsIGFzIGl0CisgICAgICAgICAqIGdlbmVyYXRlcyBubyBldmVudC4KKyAgICAgICAgICovCisgICAgICAgIGNhbGxfdHRyYWNlIChUVF9QUk9DX1NUT1AsCisgICAgICAgICAgICAgICAgICAgICB0LT5waWQsCisgICAgICAgICAgICAgICAgICAgICBUVF9OSUwsCisgICAgICAgICAgICAgICAgICAgICBUVF9OSUwsCisgICAgICAgICAgICAgICAgICAgICBUVF9OSUwpOworCisgICAgICAgIGNhbGxfdHRyYWNlIChUVF9QUk9DX0RFVEFDSCwKKyAgICAgICAgICAgICAgICAgICAgIHQtPnBpZCwKKyAgICAgICAgICAgICAgICAgICAgIFRUX05JTCwKKyAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIFRBUkdFVF9TSUdOQUxfMCwKKyAgICAgICAgICAgICAgICAgICAgIFRUX05JTCk7CisgICAgICB9CisgICAgdCA9IHQtPm5leHQ7CisgIH0KKworICBmcmVlKCBwYXJhbm9pYSApOworICAKKyAgY2FsbF90dHJhY2UgKFRUX1BST0NfU1RPUCwKKyAgICAgICAgICAgICAgIGluZmVyaW9yX3BpZCwKKyAgICAgICAgICAgICAgIFRUX05JTCwKKyAgICAgICAgICAgICAgIFRUX05JTCwKKyAgICAgICAgICAgICAgIFRUX05JTCk7CisgIHRhcmdldF9tb3Vybl9pbmZlcmlvciAoKTsKKyAgY2xlYXJfdGhyZWFkX2luZm8oKTsKK30KKworCisjaWZuZGVmIENISUxEX1JFU1VNRQorCisvKiBTYW5pdHkgY2hlY2sgYSB0aHJlYWQgYWJvdXQgdG8gYmUgY29udGludWVkLgorICovCitzdGF0aWMgdm9pZAordGhyZWFkX2Ryb3BwaW5nX2V2ZW50X2NoZWNrKCBwICkKKyAgICB0aHJlYWRfaW5mbyAqcDsKK3sKKyAgICBpZiggIXAtPmhhbmRsZWQgKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoaXMgc2VlbXMgdG8gaGFwcGVuIHdoZW4gd2UgIm5leHQiIG92ZXIgYQorICAgICAgICAgKiAiZm9yaygpIiB3aGlsZSBmb2xsb3dpbmcgdGhlIHBhcmVudC4gIElmIGl0J3MKKyAgICAgICAgICogdGhlIEZPUksgZXZlbnQsIHRoYXQncyBvay4gIElmIGl0J3MgYSBTSUdOQUwKKyAgICAgICAgICogaW4gdGhlIHVuZm9sbG93ZWQgY2hpbGQsIHRoYXQncyBvayB0by0tYnV0CisgICAgICAgICAqIGhvdyBjYW4gd2Uga25vdyB0aGF0J3Mgd2hhdCdzIGdvaW5nIG9uPworICAgICAgICAgKgorICAgICAgICAgKiBGSVhNRSEKKyAgICAgICAgICovCisgICAgICAgICBpZiggcC0+aGF2ZV9zdGF0ZSApIHsKKyAgICAgICAgICAgICBpZiggcC0+bGFzdF9zdG9wX3N0YXRlLnR0c19ldmVudCA9PSBUVEVWVF9GT1JLICkgeworICAgICAgICAgICAgICAgICAvKiBPayAqLworICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGVsc2UgaWYoIHAtPmxhc3Rfc3RvcF9zdGF0ZS50dHNfZXZlbnQgPT0gVFRFVlRfU0lHTkFMICkgeworICAgICAgICAgICAgICAgICAvKiBPaywgY2xvc2UgZXllcyBhbmQgbGV0IGl0IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbi0td2UncmUgZHJvcHBpbmcgYQorICAgICAgICAgICAgICAgICAgKiByZWFsIGV2ZW50LgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgd2FybmluZyggIkFib3V0IHRvIGNvbnRpbnVlIHByb2Nlc3MgJWQsIHRocmVhZCAlZCB3aXRoIHVuaGFuZGxlZCBldmVudCAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBpZCwgcC0+dGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9wcmludGFibGVfbmFtZV9vZl90dHJhY2VfZXZlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmxhc3Rfc3RvcF9zdGF0ZS50dHNfZXZlbnQgKSk7CisKKyNpZmRlZiBQQVJBTk9JQQorICAgICAgICAgICAgICAgICBpZiggZGVidWdfb24gKQorICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdHRocmVhZCggcCApOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBObyBzYXZlZCBzdGF0ZSwgaGF2ZSB0byBhc3N1bWUgaXQgZmFpbGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB3YXJuaW5nKCAiQWJvdXQgdG8gY29udGludWUgcHJvY2VzcyAlZCwgdGhyZWFkICVkIHdpdGggdW5oYW5kbGVkIGV2ZW50LiIsCisgICAgICAgICAgICAgICAgICAgICBwLT5waWQsIHAtPnRpZCApOworI2lmZGVmIFBBUkFOT0lBCisgICAgICAgICAgICBpZiggZGVidWdfb24gKQorICAgICAgICAgICAgICAgIHByaW50X3R0aHJlYWQoIHAgKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorICAgIAorfSAgIC8qIHRocmVhZF9kcm9wcGluZ19ldmVudF9jaGVjayAqLworCisvKiBVc2UgYSBsb29wIG92ZXIgdGhlIHRocmVhZHMgdG8gY29udGludWUgYWxsIHRoZSB0aHJlYWRzIGJ1dAorICogdGhlIG9uZSBzcGVjaWZpZWQsIHdoaWNoIGlzIHRvIGJlIHN0ZXBwZWQuCisgKi8KK3N0YXRpYyB2b2lkCit0aHJlYWRzX2NvbnRpbnVlX2FsbF9idXRfb25lKCBnZGJfdGlkLCBzaWduYWwgKQorICAgIGx3cGlkX3QgZ2RiX3RpZDsKKyAgICBpbnQgICAgIHNpZ25hbDsKK3sKKyAgICB0aHJlYWRfaW5mbyAgKnA7CisgICAgaW50ICAgICAgICAgICB0aHJlYWRfc2lnbmFsOworICAgIGx3cGlkX3QgICAgICAgcmVhbF90aWQ7CisgICAgbHdwaWRfdCAgICAgICBzY2FuX3RpZDsKKyAgICB0dHN0YXRlX3QgICAgIHN0YXRlOworICAgIGludCAgICAgICAgICAgcmVhbF9waWQ7CisgICAgCisjaWZkZWYgVEhSRUFEX0RFQlVHCisgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgcHJpbnRmKCAiVXNpbmcgbG9vcCBvdmVyIHRocmVhZHMgdG8gc3RlcC9yZXN1bWUgd2l0aCBzaWduYWxzXG4iICk7CisjZW5kaWYKKworICAgIC8qIEZpcnN0IHVwZGF0ZSB0aGUgdGhyZWFkIGxpc3QuCisgICAgICovCisgICAgc2V0X2FsbF91bnNlZW4oKTsKKyAgICByZWFsX3RpZCA9IG1hcF9mcm9tX2dkYl90aWQoIGdkYl90aWQgKTsKKyAgICByZWFsX3BpZCA9IGdldF9waWRfZm9yKCByZWFsX3RpZCApOworICAgIAorICAgIHNjYW5fdGlkID0gZ2V0X3Byb2Nlc3NfZmlyc3Rfc3RvcHBlZF90aHJlYWRfaWQoIHJlYWxfcGlkLCAmc3RhdGUgKTsKKyAgICB3aGlsZSAoIDAgIT0gc2Nhbl90aWQgKSB7CisgICAgCisjaWZkZWYgVEhSRUFEX0RFQlVHCisgICAgICAgIC8qIEZJWDogbGF0ZXIgc2hvdWxkIGNoZWNrIHN0YXRlIGlzIHN0b3BwZWQ7CisgICAgICAgICAqIHN0YXRlLnR0c19mbGFncyAmIFRUU19TVEFURU1BU0sgPT0gVFRTX1dBU1NVU1BFTkRFRAorICAgICAgICAgKi8KKyAgICAgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgICAgIGlmKCBzdGF0ZS50dHNfZmxhZ3MgJiBUVFNfU1RBVEVNQVNLICE9IFRUU19XQVNTVVNQRU5ERUQgKQorICAgICAgICAgICAgICAgIHByaW50ZiggIkFib3V0IHRvIGNvbnRpbnVlIG5vbi1zdG9wcGVkIHRocmVhZCAlZFxuIiwgc2Nhbl90aWQgKTsKKyNlbmRpZgorCisgICAgICAgIHAgPSBmaW5kX3RocmVhZF9pbmZvKCBzY2FuX3RpZCApOworICAgICAgICBpZiggTlVMTCA9PSBwICkgeworICAgICAgICAgICAgYWRkX3R0aHJlYWQoIHJlYWxfcGlkLCBzY2FuX3RpZCApOworICAgICAgICAgICAgcCA9IGZpbmRfdGhyZWFkX2luZm8oIHNjYW5fdGlkICk7CisKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgZWl0aGVyIGEgbmV3bHktY3JlYXRlZCB0aHJlYWQgb3IgdGhlCisgICAgICAgICAgICAgKiByZXN1bHQgb2YgYSBmb3JrOyBpbiBlaXRoZXIgY2FzZSB0aGVyZSdzIG5vCisgICAgICAgICAgICAgKiBhY3R1YWwgZXZlbnQgdG8gd29ycnkgYWJvdXQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHAtPmhhbmRsZWQgPSAxOworCisgICAgICAgICAgICBpZiggc3RhdGUudHRzX2V2ZW50ICE9IFRURVZUX05PTkUgKSB7CisgICAgICAgICAgICAgICAgLyogT29wcywgZG8gbmVlZCB0byB3b3JyeSEKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB3YXJuaW5nKCAiVW5leHBlY3RlZCB0aHJlYWQgd2l0aCBcIiVzXCIgZXZlbnQuIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0X3ByaW50YWJsZV9uYW1lX29mX3R0cmFjZV9ldmVudCggc3RhdGUudHRzX2V2ZW50ICkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIHNjYW5fdGlkICE9IHAtPnRpZCApCisgICAgICAgICAgICBlcnJvciggIkJhZCBkYXRhIGluIHRocmVhZCBkYXRhYmFzZS4iICk7CisKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgICAgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgICAgIGlmKCBwLT50ZXJtaW5hdGVkICkKKyAgICAgICAgICAgICAgICBwcmludGYoICJXaHkgYXJlIHdlIGNvbnRpbnVpbmcgYSBkZWFkIHRocmVhZD9cbiIgKTsKKyNlbmRpZgorCisgICAgICAgIHAtPnNlZW4gPSAxOworICAgICAgICAgICAgCisgICAgICAgIHNjYW5fdGlkID0gZ2V0X3Byb2Nlc3NfbmV4dF9zdG9wcGVkX3RocmVhZF9pZCggcmVhbF9waWQsICZzdGF0ZSApOworICAgIH0KKworICAgIC8qIFJlbW92ZSB1bnNlZW4gdGhyZWFkcy4KKyAgICAgKi8KKyAgICB1cGRhdGVfdGhyZWFkX2xpc3QoKTsKKworICAgIC8qIE5vdyBydW4gZG93biB0aGUgdGhyZWFkIGxpc3QgYW5kIGNvbnRpbnVlIG9yIHN0ZXAuCisgICAgICovCisgICAgZm9yKCBwID0gdGhyZWFkX2hlYWQuaGVhZDsgcDsgcCA9IHAtPm5leHQgKSB7CisKKyAgICAgICAgLyogU2FuaXR5IGNoZWNrLgorICAgICAgICAgKi8KKyAgICAgICAgdGhyZWFkX2Ryb3BwaW5nX2V2ZW50X2NoZWNrKCBwICk7CisKKyAgICAgICAgLyogUGFzcyB0aGUgY29ycmVjdCBzaWduYWxzIGFsb25nLgorICAgICAgICAgKi8KKyAgICAgICAgaWYoIHAtPmhhdmVfc2lnbmFsICkgeworICAgICAgICAgICAgdGhyZWFkX3NpZ25hbCAgPSBwLT5zaWduYWxfdmFsdWU7CisgICAgICAgICAgICBwLT5oYXZlX3NpZ25hbCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyZWFkX3NpZ25hbCA9IDA7CisgICAgICAgICAgICAgCisgICAgICAgIGlmKCBwLT50aWQgIT0gcmVhbF90aWQgKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogTm90IHRoZSB0aHJlYWQgb2YgaW50ZXJlc3QsIHNvIGNvbnRpbnVlIGl0CisgICAgICAgICAgICAgKiBhcyB0aGUgdXNlciBleHBlY3RzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiggcC0+c3RlcHBpbmdfbW9kZSA9PSBET19TVEVQICkgeworICAgICAgICAgICAgICAgIC8qIEp1c3Qgc3RlcCB0aGlzIHRocmVhZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBjYWxsX3R0cmFjZSgKKyAgICAgICAgICAgICAgICAgICAgIFRUX0xXUF9TSU5HTEUsCisgICAgICAgICAgICAgICAgICAgICBwLT50aWQsCisgICAgICAgICAgICAgICAgICAgICBUVF9VU0VfQ1VSUkVOVF9QQywKKyAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIHRhcmdldF9zaWduYWxfdG9faG9zdCggc2lnbmFsICksCisgICAgICAgICAgICAgICAgICAgICBUVF9OSUwgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIFJlZ3VsYXIgY29udGludWUgKGRlZmF1bHQgY2FzZSkuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgY2FsbF90dHJhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTFdQX0NPTlRJTlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUVF9VU0VfQ1VSUkVOVF9QQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSB0YXJnZXRfc2lnbmFsX3RvX2hvc3QoIHRocmVhZF9zaWduYWwgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUVF9OSUwgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgLyogU3RlcCB0aGUgdGhyZWFkIG9mIGludGVyZXN0LgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNhbGxfdHRyYWNlKAorICAgICAgICAgICAgICAgICAgICAgVFRfTFdQX1NJTkdMRSwKKyAgICAgICAgICAgICAgICAgICAgIHJlYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgVFRfVVNFX0NVUlJFTlRfUEMsCisgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSB0YXJnZXRfc2lnbmFsX3RvX2hvc3QoIHNpZ25hbCApLAorICAgICAgICAgICAgICAgICAgICAgVFRfTklMICk7CisgICAgICAgIH0gICAKKyAgICB9ICAgLyogTG9vcCBvdmVyIHRocmVhZHMgKi8KK30gICAvKiBFbmQgdGhyZWFkc19jb250aW51ZV9hbGxfYnV0X29uZSAqLworCisvKiBVc2UgYSBsb29wIG92ZXIgdGhlIHRocmVhZHMgdG8gY29udGludWUgYWxsIHRoZSB0aHJlYWRzLgorICogVGhpcyBpcyBkb25lIHdoZW4gYSBzaWduYWwgbXVzdCBiZSBzZW50IHRvIGFueSBvZiB0aGUgdGhyZWFkcy4KKyAqLworc3RhdGljIHZvaWQKK3RocmVhZHNfY29udGludWVfYWxsX3dpdGhfc2lnbmFscyggZ2RiX3RpZCwgc2lnbmFsICkKKyAgICBsd3BpZF90IGdkYl90aWQ7CisgICAgaW50ICAgICBzaWduYWw7Cit7CisgICAgdGhyZWFkX2luZm8gICpwOworICAgIGludCAgICAgICAgICAgdGhyZWFkX3NpZ25hbDsKKyAgICBsd3BpZF90ICAgICAgIHJlYWxfdGlkOworICAgIGx3cGlkX3QgICAgICAgc2Nhbl90aWQ7CisgICAgdHRzdGF0ZV90ICAgICBzdGF0ZTsKKyAgICBpbnQgICAgICAgICAgIHJlYWxfcGlkOworCisjaWZkZWYgVEhSRUFEX0RFQlVHCisgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgcHJpbnRmKCAiVXNpbmcgbG9vcCBvdmVyIHRocmVhZHMgdG8gcmVzdW1lIHdpdGggc2lnbmFsc1xuIiApOworI2VuZGlmCisKKyAgICAvKiBTY2FuIGFuZCB1cGRhdGUgdGhyZWFkIGxpc3QuCisgICAgICovCisgICAgc2V0X2FsbF91bnNlZW4oKTsKKyAgICByZWFsX3RpZCA9IG1hcF9mcm9tX2dkYl90aWQoIGdkYl90aWQgKTsgCisgICAgcmVhbF9waWQgPSBnZXRfcGlkX2ZvciggcmVhbF90aWQgKTsKKworICAgIHNjYW5fdGlkID0gZ2V0X3Byb2Nlc3NfZmlyc3Rfc3RvcHBlZF90aHJlYWRfaWQoIHJlYWxfcGlkLCAmc3RhdGUgKTsKKyAgICB3aGlsZSAoIDAgIT0gc2Nhbl90aWQgKSB7CisgICAgCisjaWZkZWYgVEhSRUFEX0RFQlVHCisgICAgICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgICAgICBpZiggc3RhdGUudHRzX2ZsYWdzICYgVFRTX1NUQVRFTUFTSyAhPSBUVFNfV0FTU1VTUEVOREVEICkKKyAgICAgICAgICAgICAgICB3YXJuaW5nKCAiQWJvdXQgdG8gY29udGludWUgbm9uLXN0b3BwZWQgdGhyZWFkICVkXG4iLCBzY2FuX3RpZCApOworI2VuZGlmCisKKyAgICAgICAgcCA9IGZpbmRfdGhyZWFkX2luZm8oIHNjYW5fdGlkICk7CisgICAgICAgIGlmKCBOVUxMID09IHAgKSB7CisgICAgICAgICAgICBhZGRfdHRocmVhZCggcmVhbF9waWQsIHNjYW5fdGlkICk7CisgICAgICAgICAgICBwID0gZmluZF90aHJlYWRfaW5mbyggc2Nhbl90aWQgKTsKKworICAgICAgICAgICAgLyogVGhpcyBpcyBlaXRoZXIgYSBuZXdseS1jcmVhdGVkIHRocmVhZCBvciB0aGUKKyAgICAgICAgICAgICAqIHJlc3VsdCBvZiBhIGZvcms7IGluIGVpdGhlciBjYXNlIHRoZXJlJ3Mgbm8KKyAgICAgICAgICAgICAqIGFjdHVhbCBldmVudCB0byB3b3JyeSBhYm91dC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcC0+aGFuZGxlZCA9IDE7CisKKyAgICAgICAgICAgIGlmKCBzdGF0ZS50dHNfZXZlbnQgIT0gVFRFVlRfTk9ORSApIHsKKyAgICAgICAgICAgICAgICAvKiBPb3BzLCBkbyBuZWVkIHRvIHdvcnJ5IQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHdhcm5pbmcoICJVbmV4cGVjdGVkIHRocmVhZCB3aXRoIFwiJXNcIiBldmVudC4iLAorICAgICAgICAgICAgICAgICAgICBnZXRfcHJpbnRhYmxlX25hbWVfb2ZfdHRyYWNlX2V2ZW50KCBzdGF0ZS50dHNfZXZlbnQgKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmZGVmIFRIUkVBRF9ERUJVRworICAgICAgICBpZiggZGVidWdfb24gKQorICAgICAgICAgICAgaWYoIHAtPnRlcm1pbmF0ZWQgKQorICAgICAgICAgICAgICAgIHByaW50ZiggIldoeSBhcmUgd2UgY29udGludWluZyBhIGRlYWQgdGhyZWFkPyAoMSlcbiIgKTsKKyNlbmRpZgorCisgICAgICAgIHAtPnNlZW4gPSAxOworCisgICAgICAgIHNjYW5fdGlkID0gZ2V0X3Byb2Nlc3NfbmV4dF9zdG9wcGVkX3RocmVhZF9pZCggcmVhbF9waWQsICZzdGF0ZSApOworICAgIH0KKworICAgIC8qIFJlbW92ZSB1bnNlZW4gdGhyZWFkcyBmcm9tIG91ciBsaXN0LgorICAgICAqLworICAgIHVwZGF0ZV90aHJlYWRfbGlzdCgpOworCisgICAgLyogQ29udGludWUgdGhlIHRocmVhZHMuCisgICAgICovCisgICAgZm9yKCBwID0gdGhyZWFkX2hlYWQuaGVhZDsgcDsgcCA9IHAtPm5leHQgKSB7CisKKyAgICAgICAgLyogU2FuaXR5IGNoZWNrLgorICAgICAgICAgKi8KKyAgICAgICAgdGhyZWFkX2Ryb3BwaW5nX2V2ZW50X2NoZWNrKCBwICk7CisKKyAgICAgICAgLyogUGFzcyB0aGUgY29ycmVjdCBzaWduYWxzIGFsb25nLgorICAgICAgICAgKi8KKyAgICAgICAgaWYoIHAtPnRpZCA9PSByZWFsX3RpZCApIHsKKyAgICAgICAgICAgIHRocmVhZF9zaWduYWwgID0gc2lnbmFsOworICAgICAgICAgICAgcC0+aGF2ZV9zaWduYWwgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIHAtPmhhdmVfc2lnbmFsICkgeworICAgICAgICAgICAgdGhyZWFkX3NpZ25hbCAgPSBwLT5zaWduYWxfdmFsdWU7CisgICAgICAgICAgICBwLT5oYXZlX3NpZ25hbCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyZWFkX3NpZ25hbCAgPSAwOworCisgICAgICAgIGlmKCBwLT5zdGVwcGluZ19tb2RlID09IERPX1NURVAgKSB7CisgICAgICAgICAgICBjYWxsX3R0cmFjZSgKKyAgICAgICAgICAgICAgICAgICAgIFRUX0xXUF9TSU5HTEUsCisgICAgICAgICAgICAgICAgICAgICBwLT50aWQsCisgICAgICAgICAgICAgICAgICAgICBUVF9VU0VfQ1VSUkVOVF9QQywKKyAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIHRhcmdldF9zaWduYWxfdG9faG9zdCggc2lnbmFsICksCisgICAgICAgICAgICAgICAgICAgICBUVF9OSUwgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIENvbnRpbnVlIHRoaXMgdGhyZWFkIChkZWZhdWx0IGNhc2UpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjYWxsX3R0cmFjZSgKKyAgICAgICAgICAgICAgICAgICAgVFRfTFdQX0NPTlRJTlVFLAorICAgICAgICAgICAgICAgICAgICBwLT50aWQsCisgICAgICAgICAgICAgICAgICAgIFRUX1VTRV9DVVJSRU5UX1BDLAorICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSB0YXJnZXRfc2lnbmFsX3RvX2hvc3QoIHRocmVhZF9zaWduYWwgKSwKKyAgICAgICAgICAgICAgICAgICAgVFRfTklMICk7CisgICAgICAgIH0KKyAgICB9Cit9ICAgLyogRW5kIHRocmVhZHNfY29udGludWVfYWxsX3dpdGhfc2lnbmFscyAqLworCisvKiBTdGVwIG9uZSB0aHJlYWQgb25seS4gIAorICovCitzdGF0aWMgdm9pZAordGhyZWFkX2Zha2Vfc3RlcCggdGlkLCBzaWduYWwgKQorICAgIGx3cGlkX3QgICAgICAgICAgICB0aWQ7CisgICAgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ25hbDsKK3sKKyAgICB0aHJlYWRfaW5mbyAqcDsKKworI2lmZGVmIFRIUkVBRF9ERUJVRworICAgIGlmKCBkZWJ1Z19vbiApIHsKKyAgICAgICAgcHJpbnRmKCAiRG9pbmcgYSBmYWtlLXN0ZXAgb3ZlciBhIGJwdCwgZXRjLiBmb3IgJWRcbiIsIHRpZCApOworCisgICAgICAgIGlmKCBpc190ZXJtaW5hdGVkKCB0aWQgKSkKKyAgICAgICAgICAgIHByaW50ZiggIldoeSBhcmUgd2UgY29udGludWluZyBhIGRlYWQgdGhyZWFkPyAoNClcbiIgKTsKKyAgICB9CisjZW5kaWYKKyAgICAgICAgICAKKyAgICBpZiggZG9pbmdfZmFrZV9zdGVwICkKKyAgICAgICAgd2FybmluZyggIlN0ZXAgd2hpbGUgc3RlcCBhbHJlYWR5IGluIHByb2dyZXNzLiIgKTsKKworICAgIC8qIFNlZSBpZiB0aGVyZSdzIGEgc2F2ZWQgc2lnbmFsIHZhbHVlIGZvciB0aGlzCisgICAgICogdGhyZWFkIHRvIGJlIHBhc3NlZCBvbiwgYnV0IG5vIGN1cnJlbnQgc2lnbmFsLgorICAgICAqLworICAgIHAgPSBmaW5kX3RocmVhZF9pbmZvKCB0aWQgKTsKKyAgICBpZiggcCAhPSBOVUxMICkgeworICAgICAgICBpZiggcC0+aGF2ZV9zaWduYWwgJiYgc2lnbmFsID09IE5VTEwgKSB7CisgICAgICAgICAgICAvKiBQYXNzIG9uIGEgc2F2ZWQgc2lnbmFsLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzaWduYWwgPSBwLT5zaWduYWxfdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHAtPmhhdmVfc2lnbmFsICA9IDA7CisgICAgfQorCisgICAgaWYoICFwLT5oYW5kbGVkICkKKyAgICAgICAgd2FybmluZyggIkludGVybmFsIGVycm9yOiBjb250aW51aW5nIHVuaGFuZGxlZCB0aHJlYWQuIiApOworICAgICAgICAKKyAgICBjYWxsX3R0cmFjZSggVFRfTFdQX1NJTkdMRSwKKyAgICAgICAgICAgICAgICAgdGlkLAorICAgICAgICAgICAgICAgICBUVF9VU0VfQ1VSUkVOVF9QQywKKyAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgdGFyZ2V0X3NpZ25hbF90b19ob3N0IChzaWduYWwpLAorICAgICAgICAgICAgICAgICBUVF9OSUwgKTsKKworICAgIC8qIERvIGJvb2trZWVwaW5nIHNvICJjYWxsX3R0cmFjZV93YWl0IiBrbm93cyBpdCBoYXMgdG8gd2FpdAorICAgICAqIGZvciB0aGlzIHRocmVhZCBvbmx5LCBhbmQgY2xlYXIgYW55IHNhdmVkIHNpZ25hbCBpbmZvLgorICAgICAqLworICAgIGRvaW5nX2Zha2Vfc3RlcCAgID0gMTsKKyAgICBmYWtlX3N0ZXBfdGlkICAgICA9IHRpZDsKKworfSAgIC8qIEVuZCB0aHJlYWRfZmFrZV9zdGVwICovCisKKy8qIENvbnRpbnVlIG9uZSB0aHJlYWQgd2hlbiBhIHNpZ25hbCBtdXN0IGJlIHNlbnQgdG8gaXQuCisgKi8KK3N0YXRpYyB2b2lkCit0aHJlYWRzX2NvbnRpbnVlX29uZV93aXRoX3NpZ25hbCggZ2RiX3RpZCwgc2lnbmFsICkKKyAgICBsd3BpZF90IGdkYl90aWQ7CisgICAgaW50ICAgICBzaWduYWw7Cit7CisgICAgdGhyZWFkX2luZm8gICpwOworICAgIGx3cGlkX3QgICAgICAgcmVhbF90aWQ7CisgICAgaW50ICAgICAgICAgICByZWFsX3BpZDsKKyAgICAKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgICBpZiggZGVidWdfb24gKQorICAgICAgICBwcmludGYoICJDb250aW51aW5nIG9uZSB0aHJlYWQgd2l0aCBhIHNpZ25hbFxuIiApOworI2VuZGlmCisKKyAgICByZWFsX3RpZCA9IG1hcF9mcm9tX2dkYl90aWQoIGdkYl90aWQgKTsKKyAgICByZWFsX3BpZCA9IGdldF9waWRfZm9yKCByZWFsX3RpZCApOworCisgICAgcCA9IGZpbmRfdGhyZWFkX2luZm8oIHJlYWxfdGlkICk7CisgICAgaWYoIE5VTEwgPT0gcCApIHsKKyAgICAgICAgYWRkX3R0aHJlYWQoIHJlYWxfcGlkLCByZWFsX3RpZCApOworICAgIH0KKworI2lmZGVmIFRIUkVBRF9ERUJVRworICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgIGlmKCBwLT50ZXJtaW5hdGVkICkKKyAgICAgICAgICAgIHByaW50ZiggIldoeSBhcmUgd2UgY29udGludWluZyBhIGRlYWQgdGhyZWFkPyAoMilcbiIgKTsKKyNlbmRpZgorCisgICAgaWYoICFwLT5oYW5kbGVkICkKKyAgICAgICAgd2FybmluZyggIkludGVybmFsIGVycm9yOiBjb250aW51aW5nIHVuaGFuZGxlZCB0aHJlYWQuIiApOworICAgICAgICAKKyAgICBwLT5oYXZlX3NpZ25hbCA9IDA7CisgICAgICAgICAgICAgCisgICAgY2FsbF90dHJhY2UoIFRUX0xXUF9DT05USU5VRSwKKyAgICAgICAgICAgICAgICAgZ2RiX3RpZCwKKyAgICAgICAgICAgICAgICAgVFRfVVNFX0NVUlJFTlRfUEMsCisgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIHRhcmdldF9zaWduYWxfdG9faG9zdCggc2lnbmFsICksCisgICAgICAgICAgICAgICAgIFRUX05JTCApOworfQorI2VuZGlmCisKKyNpZm5kZWYgQ0hJTERfUkVTVU1FCisKKy8qIFJlc3VtZSBleGVjdXRpb24gb2YgdGhlIGluZmVyaW9yIHByb2Nlc3MuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGluIGNoYXJnZSBvZiBzZXR0aW5nIHRoZSAiaGFuZGxlZCIgYml0cy4gCisgKgorICogICBJZiBTVEVQIGlzIHplcm8sICAgICAgY29udGludWUgaXQuCisgKiAgIElmIFNURVAgaXMgbm9uemVybywgICBzaW5nbGUtc3RlcCBpdC4KKyAqICAgCisgKiAgIElmIFNJR05BTCBpcyBub256ZXJvLCBnaXZlIGl0IHRoYXQgc2lnbmFsLgorICoKKyAqICAgSWYgVElEIGlzIC0xLCAgICAgICAgIGFwcGx5IHRvIGFsbCB0aHJlYWRzLgorICogICBJZiBUSUQgaXMgbm90IC0xLCAgICAgYXBwbHkgdG8gc3BlY2lmaWVkIHRocmVhZC4KKyAqICAgCisgKiAgICAgICAgICAgU1RFUAorICogICAgICBcICAgICAgITAgICAgICAgICAgICAgICAgICAgICAgICAwCisgKiAgVElEICBcX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiAgICAgICB8CisgKiAgIC0xICB8ICAgU3RlcCBjdXJyZW50ICAgICAgICAgICAgQ29udGludWUgYWxsIHRocmVhZHMKKyAqICAgICAgIHwgICB0aHJlYWQgYW5kICAgICAgICAgICAgICAoYnV0IHdoaWNoIGdldHMgYW55CisgKiAgICAgICB8ICAgY29udGludWUgb3RoZXJzICAgICAgICAgc2lnbmFsPy0tV2UgbG9vayBhdAorICogICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmZlcmlvcl9waWQiKQorICogICAgICAgfAorICogICAgTiAgfCAgIFN0ZXAgX3RoaXNfIHRocmVhZCAgICAgIENvbnRpbnVlIF90aGlzXyB0aHJlYWQKKyAqICAgICAgIHwgICBhbmQgbGVhdmUgb3RoZXJzICAgICAgICBhbmQgbGVhdmUgb3RoZXJzIAorICogICAgICAgfCAgIHN0b3BwZWQ7IGludGVybmFsbHkgICAgIHN0b3BwZWQ7IHVzZWQgb25seSBmb3IKKyAqICAgICAgIHwgICB1c2VkIGJ5IGdkYiwgbmV2ZXIgICAgICBoYXJkd2FyZSB3YXRjaHBvaW50cworICogICAgICAgfCAgIGEgdXNlciBjb21tYW5kLiAgICAgICAgIGFuZCBhdHRhY2gsIG5ldmVyIGEKKyAqICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyIGNvbW1hbmQuCisgKi8KK3ZvaWQKK2NoaWxkX3Jlc3VtZSggZ2RiX3RpZCwgc3RlcCwgc2lnbmFsICkKKyAgICAgbHdwaWRfdCBnZGJfdGlkOworICAgICBpbnQgICAgIHN0ZXA7CisgICAgIGVudW0gdGFyZ2V0X3NpZ25hbCBzaWduYWw7Cit7CisgIGludCAgICAgcmVzdW1lX2FsbF90aHJlYWRzOworICBsd3BpZF90IHRpZDsKKyAgcHJvY2Vzc19zdGF0ZV90ICBuZXdfcHJvY2Vzc19zdGF0ZTsKKworICByZXN1bWVfYWxsX3RocmVhZHMgPQorICAgIChnZGJfdGlkID09IElORlRUUkFDRV9BTExfVEhSRUFEUykgfHwKKyAgICAodmZvcmtfaW5fZmxpZ2h0KTsKKworICBpZiAocmVzdW1lX2FsbF90aHJlYWRzKSB7CisgICAgLyogUmVzdW1lIGFsbCB0aHJlYWRzLCBidXQgZmlyc3QgcGljayBhIHRpZCB2YWx1ZQorICAgICAqIHNvIHdlIGNhbiBnZXQgdGhlIHBpZCB3aGVuIGluIGNhbGxfdHRyYWNlIGRvaW5nCisgICAgICogdGhlIG1hcC4KKyAgICAgKi8KKyAgICBpZiAodmZvcmtfaW5fZmxpZ2h0KQorICAgICAgICB0aWQgPSB2Zm9ya2luZ19jaGlsZF9waWQ7CisgICAgZWxzZQorICAgICAgICB0aWQgPSBtYXBfZnJvbV9nZGJfdGlkKCBpbmZlcmlvcl9waWQgKTsKKyAgfQorICBlbHNlCisgICAgICB0aWQgPSBtYXBfZnJvbV9nZGJfdGlkKCBnZGJfdGlkICk7CisKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgaWYoIGRlYnVnX29uICkgeworICAgICAgaWYoIG1vcmVfZXZlbnRzX2xlZnQgKQorICAgICAgICAgIHByaW50ZiggIk1vcmUgZXZlbnRzOyAiICk7CisKKyAgICAgIGlmKCBzaWduYWwgIT0gMCApCisgICAgICAgICAgcHJpbnRmKCAiU2VuZGluZyBzaWduYWwgJWQ7ICIsIHNpZ25hbCApOworICAgICAgCisgICAgICBpZiggcmVzdW1lX2FsbF90aHJlYWRzICkgeworICAgICAgICAgIGlmKCBzdGVwID09IDAgKQorICAgICAgICAgICAgICBwcmludGYoICJDb250aW51ZSBwcm9jZXNzICVkXG4iLCB0aWQgKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHByaW50ZiggIlN0ZXAvY29udGludWUgdGhyZWFkICVkXG4iLCB0aWQgKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgIGlmKCBzdGVwID09IDAgKQorICAgICAgICAgICAgICBwcmludGYoICJDb250aW51ZSB0aHJlYWQgJWRcbiIsIHRpZCApOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcHJpbnRmKCAiU3RlcCBqdXN0IHRocmVhZCAlZFxuIiwgdGlkICk7CisgICAgICB9CisKKyAgICAgIGlmKCB2Zm9ya19pbl9mbGlnaHQgKQorICAgICAgICAgIHByaW50ZiggIlZmb3JrIGluIGZsaWdodFxuIiApOworICB9CisjZW5kaWYKKworICBpZiggcHJvY2Vzc19zdGF0ZSA9PSBSVU5OSU5HICkKKyAgICAgIHdhcm5pbmcoICJJbnRlcm5hbCBlcnJvciBpbiByZXN1bWUgbG9naWM7IGRvaW5nIHJlc3VtZSBvciBzdGVwIGFueXdheS4iICk7CisgICAgICAKKyAgaWYoICAgIXN0ZXAgICAgICAgICAgICAgICAgICAgIC8qIEFza2VkIHRvIGNvbnRpbnVlLi4uICAgICAgICovCisgICAgICYmIHJlc3VtZV9hbGxfdGhyZWFkcyAgICAgICAvKiB3aG9sZSBwcm9jZXNzLi4gICAgICAgICAgICAqLworICAgICAmJiBzaWduYWwgIT0gMCAgICAgICAgICAgICAgLyogd2l0aCBhIHNpZ25hbC4uLiAgICAgICAgICAgKi8KKyAgICAgJiYgbW9yZV9ldmVudHNfbGVmdCA+IDAgKSB7IC8qIGJ1dCB3ZSBjYW4ndCB5ZXQtLXNhdmUgaXQhICovCisKKyAgICAgIC8qIENvbnRpbnVlIHdpdGggc2lnbmFsIG1lYW5zIHdlIGhhdmUgdG8gc2V0IHRoZSBwZW5kaW5nCisgICAgICAgKiBzaWduYWwgdmFsdWUgZm9yIHRoaXMgdGhyZWFkLgorICAgICAgICovCisgICAgICB0aHJlYWRfaW5mbyAqazsKKyAgICAgIAorI2lmZGVmIFRIUkVBRF9ERUJVRworICAgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgICAgcHJpbnRmKCAiU2F2aW5nIHNpZ25hbCAlZCBmb3IgdGhyZWFkICVkXG4iLCBzaWduYWwsIHRpZCApOworI2VuZGlmCisKKyAgICAgICBrID0gZmluZF90aHJlYWRfaW5mbyggdGlkICk7CisgICAgICAgaWYoIGsgIT0gTlVMTCApIHsKKyAgICAgICAgICAgay0+aGF2ZV9zaWduYWwgID0gMTsKKyAgICAgICAgICAgay0+c2lnbmFsX3ZhbHVlID0gc2lnbmFsOworCisjaWZkZWYgVEhSRUFEX0RFQlVHCisgICAgICAgICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgICAgICAgICBpZiggay0+dGVybWluYXRlZCApCisgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiV2h5IGFyZSB3ZSBjb250aW51aW5nIGEgZGVhZCB0aHJlYWQ/ICgzKVxuIiApOworI2VuZGlmCisKKyAgICAgICB9CisKKyNpZmRlZiBUSFJFQURfREVCVUcKKyAgICAgICBlbHNlIGlmKCBkZWJ1Z19vbiApIHsKKyAgICAgICAgICAgcHJpbnRmKCAiTm8gdGhyZWFkIGluZm8gZm9yIHRpZCAlZFxuIiwgdGlkICk7CisgICAgICAgfQorI2VuZGlmCisgIH0KKworICAvKiBBcmUgd2UgZmFraW5nIHRoaXMgImNvbnRpbnVlIiBvciAic3RlcCI/CisgICAqCisgICAqIFdlIHVzZWQgdG8gZG8gc3RlcHMgYnkgY29udGludWluZyBhbGwgdGhlIHRocmVhZHMgZm9yIAorICAgKiB3aGljaCB0aGUgZXZlbnRzIGhhZCBiZWVuIGhhbmRsZWQgYWxyZWFkeS4gIFdoaWxlCisgICAqIGNvbmNlcHR1YWxseSBuaWNlciAoaGlkZXMgaXQgYWxsIGluIGEgbG93ZXIgbGV2ZWwpLCB0aGlzCisgICAqIGNhbiBsZWFkIHRvIHN0YXJ2YXRpb24gYW5kIGEgaGFuZyAoZS5nLiBhbGwgYnV0IG9uZSB0aHJlYWQKKyAgICogYXJlIHVuaGFuZGxlZCBhdCBhIGJyZWFrcG9pbnQganVzdCBiZWZvcmUgYSAiam9pbiIgb3BlcmF0aW9uLAorICAgKiBhbmQgb25lIHRocmVhZCBpcyBpbiB0aGUgam9pbiwgYW5kIHRoZSB1c2VyIHdhbnRzIHRvIHN0ZXAgdGhhdAorICAgKiB0aHJlYWQpLgorICAgKi8KKyAgaWYoIHJlc3VtZV9hbGxfdGhyZWFkcyAgICAgICAvKiBXaG9sZSBwcm9jZXNzLCB0aGVyZWZvcmUgdXNlciBjb21tYW5kICovCisgICAmJiBtb3JlX2V2ZW50c19sZWZ0ID4gMCApIHsgLyogQnV0IHdlIGNhbid0IGRvIHRoaXMgeWV0LS1mYWtlIGl0ISAqLworICAgICAgdGhyZWFkX2luZm8gKnA7CisgICAgICAKKyAgICAgIGlmKCAhc3RlcCApIHsKKyAgICAgICAgICAvKiBObyBuZWVkIHRvIGRvIGFueSBub3RlcyBvbiBhIHBlci10aHJlYWQKKyAgICAgICAgICAgKiBiYXNpcy0td2UncmUgZG9uZSEKKyAgICAgICAgICAgKi8KKyNpZmRlZiBXQUlUX0JVRkZFUl9ERUJVRworICAgICAgICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgICAgICAgIHByaW50ZiggIkZha2luZyBhIHByb2Nlc3MgcmVzdW1lLlxuIiApOworI2VuZGlmCisKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBlbHNlIHsKKworI2lmZGVmIFdBSVRfQlVGRkVSX0RFQlVHCisgICAgICAgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgICAgICAgcHJpbnRmKCAiRmFraW5nIGEgcHJvY2VzcyBzdGVwLlxuIiApOworI2VuZGlmCisKKyAgICAgIH0KKyAgICAgIAorICAgICAgcCA9IGZpbmRfdGhyZWFkX2luZm8oIHRpZCApOworICAgICAgaWYoIHAgPT0gTlVMTCApIHsKKyAgICAgICAgICB3YXJuaW5nKCAiTm8gdGhyZWFkIGluZm9ybWF0aW9uIGZvciB0aWQgJWQsICduZXh0JyBjb21tYW5kIGlnbm9yZWQuXG4iLCB0aWQgKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBlbHNlIHsKKworI2lmZGVmIFRIUkVBRF9ERUJVRworICAgICAgICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgICAgICAgIGlmKCBwLT50ZXJtaW5hdGVkICkKKyAgICAgICAgICAgICAgICAgIHByaW50ZiggIldoeSBhcmUgd2UgY29udGludWluZyBhIGRlYWQgdGhyZWFkPyAoMy41KVxuIiApOworI2VuZGlmCisKKyAgICAgICAgICBpZiggcC0+c3RlcHBpbmdfbW9kZSAhPSBET19ERUZBVUxUICkgeworICAgICAgICAgICAgICB3YXJuaW5nKCAiU3RlcCBvciBjb250aW51ZSBjb21tYW5kIGFwcGxpZWQgdG8gdGhyZWFkIHdoaWNoIGlzIGFscmVhZHkgc3RlcHBpbmcgb3IgY29udGludWluZzsgY29tbWFuZCBpZ25vcmVkLiIgKTsKKworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYoIHN0ZXAgKQorICAgICAgICAgICAgICBwLT5zdGVwcGluZ19tb2RlID0gRE9fU1RFUDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHAtPnN0ZXBwaW5nX21vZGUgPSBET19DT05USU5VRTsKKworICAgICAgICAgIHJldHVybjsKKyAgICAgIH0gICAvKiBIYXZlIHRocmVhZCBpbmZvICovCisgIH0gICAvKiBNdXN0IGZha2Ugc3RlcCBvciBnbyAqLworCisgIC8qIEV4ZWNlcHQgZm9yIGZha2Utc3RlcHMsIGZyb20gaGVyZSBvbiB3ZSBrbm93IHdlIGFyZQorICAgKiBnb2luZyB0byB3aW5kIHVwIHdpdGggYSBydW5uaW5nIHByb2Nlc3Mgd2hpY2ggd2lsbAorICAgKiBuZWVkIGEgcmVhbCB3YWl0LgorICAgKi8KKyAgbmV3X3Byb2Nlc3Nfc3RhdGUgPSBSVU5OSU5HOworCisgIC8qIEFuIGFkZHJlc3Mgb2YgVFRfVVNFX0NVUlJFTlRfUEMgdGVsbHMgdHRyYWNlIHRvIGNvbnRpbnVlIGZyb20gd2hlcmUKKyAgICogaXQgd2FzLiAgKElmIEdEQiB3YW50ZWQgaXQgdG8gc3RhcnQgc29tZSBvdGhlciB3YXksIHdlIGhhdmUgYWxyZWFkeQorICAgKiB3cml0dGVuIGEgbmV3IFBDIHZhbHVlIHRvIHRoZSBjaGlsZC4pCisgICAqCisgICAqIElmIHRoaXMgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUFRfU1RFUCwgYSBoaWdoZXIgbGV2ZWwgZnVuY3Rpb24gd2lsbAorICAgKiBoYXZlIGNhbGxlZCBzaW5nbGVfc3RlcCgpIHRvIHRyYW5zbXV0ZSB0aGUgc3RlcCByZXF1ZXN0IGludG8gYQorICAgKiBjb250aW51ZSByZXF1ZXN0IChieSBzZXR0aW5nIGJyZWFrcG9pbnRzIG9uIGFsbCBwb3NzaWJsZSBzdWNjZXNzb3IKKyAgICogaW5zdHJ1Y3Rpb25zKSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGF0IGhlcmUuCisgICAqLworICBpZiAoc3RlcCkgeworICAgICAgaWYoIHJlc3VtZV9hbGxfdGhyZWFkcyApIHsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIFJlZ3VsYXIgdXNlciBzdGVwOiBvdGhlciB0aHJlYWRzIGdldCBhICJjb250aW51ZSIuCisgICAgICAgICAgICovCisgICAgICAgICAgdGhyZWFkc19jb250aW51ZV9hbGxfYnV0X29uZSggdGlkLCBzaWduYWwgKTsKKyAgICAgICAgICBjbGVhcl9hbGxfaGFuZGxlZCgpOworICAgICAgICAgIGNsZWFyX2FsbF9zdGVwcGluZ19tb2RlKCk7CisgICAgICB9CisKKyAgICAgIGVsc2UgeworICAgICAgICAgIC8qICJGYWtlIHN0ZXAiOiBnZGIgaXMgc3RlcHBpbmcgb25lIHRocmVhZCBvdmVyIGEKKyAgICAgICAgICAgKiBicmVha3BvaW50LCB3YXRjaHBvaW50LCBvciBvdXQgb2YgYSBsaWJyYXJ5IGxvYWQKKyAgICAgICAgICAgKiBldmVudCwgZXRjLiAgVGhlIHJlc3QganVzdCBzdGF5IHdoZXJlIHRoZXkgYXJlLgorICAgICAgICAgICAqCisgICAgICAgICAgICogQWxzbyB1c2VkIHdoZW4gdGhlcmUgYXJlIHBlbmRpbmcgZXZlbnRzOiB3ZSByZWFsbHkKKyAgICAgICAgICAgKiBzdGVwIHRoZSBjdXJyZW50IHRocmVhZCwgYnV0IGxlYXZlIHRoZSByZXN0IHN0b3BwZWQuCisgICAgICAgICAgICogVXNlcnMgY2FuJ3QgcmVxdWVzdCB0aGlzLCBidXQgIndhaXRfZm9yX2luZmVyaW9yIgorICAgICAgICAgICAqIGRvZXMtLWEgbG90IQorICAgICAgICAgICAqLworICAgICAgICAgIHRocmVhZF9mYWtlX3N0ZXAoIHRpZCwgc2lnbmFsICk7CisKKyAgICAgICAgICAvKiBDbGVhciB0aGUgImhhbmRsZWQiIHN0YXRlIG9mIHRoaXMgdGhyZWFkLCBiZWNhdXNlCisgICAgICAgICAgICogd2UnbGwgc29vbiBnZXQgYSBuZXcgZXZlbnQgZm9yIGl0LiAgT3RoZXIgZXZlbnRzCisgICAgICAgICAgICogc3RheSBhcyB0aGV5IHdlcmUuCisgICAgICAgICAgICovCisgICAgICAgICAgY2xlYXJfaGFuZGxlZCggdGlkICk7CisgICAgICAgICAgY2xlYXJfc3RlcHBpbmdfbW9kZSggdGlkICk7CisgICAgICAgICAgbmV3X3Byb2Nlc3Nfc3RhdGUgPSBGQUtFX1NURVBQSU5HOworICAgICAgfQorICB9CisgIAorICBlbHNlIHsKKyAgICAgIC8qIFRUX0xXUF9DT05USU5VRSBjYW4gcGFzcyBzaWduYWxzIHRvIHRocmVhZHMsCisgICAgICAgKiBUVF9QUk9DX0NPTlRJTlVFIGNhbid0LiAgU28gaWYgdGhlcmUgYXJlIGFueQorICAgICAgICogc2lnbmFscyB0byBwYXNzLCB3ZSBoYXZlIHRvIHVzZSB0aGUgKHNsb3dlcikKKyAgICAgICAqIGxvb3Agb3ZlciB0aGUgc3RvcHBlZCB0aHJlYWRzLgorICAgICAgICoKKyAgICAgICAqIEVxdWFsbHksIGlmIHdlIGhhdmUgdG8gbm90IGNvbnRpbnVlIHNvbWUgdGhyZWFkcywKKyAgICAgICAqIGR1ZSB0byBzYXZlZCBldmVudHMsIHdlIGhhdmUgdG8gdXNlIHRoZSBsb29wLgorICAgICAgICovCisgICAgICBpZiggKHNpZ25hbCAhPSAwKSB8fCBzYXZlZF9zaWduYWxzX2V4aXN0KCkpIHsKKyAgICAgICAgICBpZiggcmVzdW1lX2FsbF90aHJlYWRzICkgeworCisjaWZkZWYgVEhSRUFEX0RFQlVHCisgICAgICAgICAgICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgICAgICAgICAgICBwcmludGYoICJEb2luZyBhIGNvbnRpbnVlIGJ5IGxvb3Agb2YgYWxsIHRocmVhZHNcbiIgKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgIHRocmVhZHNfY29udGludWVfYWxsX3dpdGhfc2lnbmFscyggdGlkLCBzaWduYWwgKTsKKworICAgICAgICAgICAgICBjbGVhcl9hbGxfaGFuZGxlZCgpOworICAgICAgICAgICAgICBjbGVhcl9hbGxfc3RlcHBpbmdfbW9kZSgpOworICAgICAgICAgIH0KKworICAgICAgICAgIGVsc2UgeworI2lmZGVmIFRIUkVBRF9ERUJVRworICAgICAgICAgICAgICBwcmludGYoICJEb2luZyBhIGNvbnRpbnVlIHcvc2lnbmFsIG9mIGp1c3QgdGhyZWFkICVkXG4iLCB0aWQgKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgIHRocmVhZHNfY29udGludWVfb25lX3dpdGhfc2lnbmFsKCB0aWQsIHNpZ25hbCApOworCisgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSAiaGFuZGxlZCIgc3RhdGUgb2YgdGhpcyB0aHJlYWQsIGJlY2F1c2UKKyAgICAgICAgICAgICAgICogd2UnbGwgc29vbiBnZXQgYSBuZXcgZXZlbnQgZm9yIGl0LiAgT3RoZXIgZXZlbnRzCisgICAgICAgICAgICAgICAqIGNhbiBzdGF5IGFzIHRoZXkgd2VyZS4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGNsZWFyX2hhbmRsZWQoIHRpZCApOworICAgICAgICAgICAgICBjbGVhcl9zdGVwcGluZ19tb2RlKCB0aWQgKTsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGVsc2UgeworICAgICAgICAgIC8qIE5vIHNpZ25hbHMgdG8gc2VuZC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiggcmVzdW1lX2FsbF90aHJlYWRzICkgeworI2lmZGVmIFRIUkVBRF9ERUJVRworICAgICAgICAgICAgICBpZiggZGVidWdfb24gKQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiRG9pbmcgYSBjb250aW51ZSBieSBwcm9jZXNzIG9mIHByb2Nlc3MgJWRcbiIsIHRpZCApOworI2VuZGlmCisKKyAgICAgICAgICAgICAgaWYoIG1vcmVfZXZlbnRzX2xlZnQgPiAwICkgeworICAgICAgICAgICAgICAgICAgd2FybmluZyggIkxvc2luZyBidWZmZXJlZCBldmVudHMgb24gY29udGludWUuIiApOworICAgICAgICAgICAgICAgICAgbW9yZV9ldmVudHNfbGVmdCA9IDA7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjYWxsX3R0cmFjZSggVFRfUFJPQ19DT05USU5VRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX05JTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX05JTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX05JTCApOworCisgICAgICAgICAgICAgIGNsZWFyX2FsbF9oYW5kbGVkKCk7CisgICAgICAgICAgICAgIGNsZWFyX2FsbF9zdGVwcGluZ19tb2RlKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZWxzZSB7CisjaWZkZWYgVEhSRUFEX0RFQlVHCisgICAgICAgICAgICAgIGlmKCBkZWJ1Z19vbiApIHsKKyAgICAgICAgICAgICAgICAgIHByaW50ZiggIkRvaW5nIGEgY29udGludWUgb2YganVzdCB0aHJlYWQgJWRcbiIsIHRpZCApOworICAgICAgICAgICAgICAgICAgaWYoIGlzX3Rlcm1pbmF0ZWQoIHRpZCApKQorICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoICJXaHkgYXJlIHdlIGNvbnRpbnVpbmcgYSBkZWFkIHRocmVhZD8gKDUpXG4iICk7CisgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgIGNhbGxfdHRyYWNlKCBUVF9MV1BfQ09OVElOVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9OSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9OSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9OSUwgKTsKKworICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgImhhbmRsZWQiIHN0YXRlIG9mIHRoaXMgdGhyZWFkLCBiZWNhdXNlCisgICAgICAgICAgICAgICAqIHdlJ2xsIHNvb24gZ2V0IGEgbmV3IGV2ZW50IGZvciBpdC4gIE90aGVyIGV2ZW50cworICAgICAgICAgICAgICAgKiBjYW4gc3RheSBhcyB0aGV5IHdlcmUuCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBjbGVhcl9oYW5kbGVkKCB0aWQgKTsKKyAgICAgICAgICAgICAgY2xlYXJfc3RlcHBpbmdfbW9kZSggdGlkICk7CisgICAgICAgICAgfQorICAgICAgfQorICB9CisKKyAgcHJvY2Vzc19zdGF0ZSA9IG5ld19wcm9jZXNzX3N0YXRlOworCisjaWZkZWYgV0FJVF9CVUZGRVJfREVCVUcKKyAgaWYoIGRlYnVnX29uICkKKyAgICAgIHByaW50ZiggIlByb2Nlc3Mgc2V0IHRvICVzXG4iLAorICAgICAgICAgICAgICBnZXRfcHJpbnRhYmxlX25hbWVfb2ZfcHJvY2Vzc19zdGF0ZSAocHJvY2Vzc19zdGF0ZSkgKTsKKyNlbmRpZgorCit9CisjZW5kaWYgLyogQ0hJTERfUkVTVU1FICovCisKKwwKKyNpZmRlZiBBVFRBQ0hfREVUQUNICisvKgorICogTGlrZSBpdCBzYXlzLgorICoKKyAqIE9uZSB3b3JyeSBpcyB0aGF0IHdlIG1heSBub3QgYmUgYXR0YWNoaW5nIHRvICJpbmZlcmlvcl9waWQiCisgKiBhbmQgdGh1cyBtYXkgbm90IHdhbnQgdG8gY2xlYXIgb3V0IG91ciBkYXRhLiAgRklYTUU/CisgKiAKKyAqLworc3RhdGljIHZvaWQKK3VwZGF0ZV90aHJlYWRfc3RhdGVfYWZ0ZXJfYXR0YWNoKCBwaWQsIGtpbmRfb2ZfZ28gKQorICBpbnQgICAgICAgICAgICAgICBwaWQ7CisgIGF0dGFjaF9jb250aW51ZV90IGtpbmRfb2ZfZ287Cit7CisgIGludCAgICAgICAgdHRfc3RhdHVzOworICB0dHN0YXRlX3QgIHRocmVhZF9zdGF0ZTsKKyAgbHdwaWRfdCAgICBhX3RocmVhZDsKKyAgbHdwaWRfdCAgICB0aWQ7CisKKyAgLyogVGhlIHByb2Nlc3MgYmV0dGVyIGJlIHN0b3BwZWQuCisgICAqLworICBpZiggcHJvY2Vzc19zdGF0ZSAhPSBTVE9QUEVECisgICAmJiBwcm9jZXNzX3N0YXRlICE9IFZGT1JLSU5HICkKKyAgICAgIHdhcm5pbmcoICJJbnRlcm5hbCBlcnJvciBhdHRhY2hpbmcuIiApOworCisgIC8qIENsZWFyIG91dCBvbGQgdHRocmVhZCBpbmZvIGFuZCBzdGFydCBvdmVyLiAgVGhpcyBoYXMgdGhlCisgICAqIHNpZGUgZWZmZWN0IG9mIGVuc3VyaW5nIHRoYXQgdGhlIFRSQVAgaXMgcmVwb3J0ZWQgYXMgYmVpbmcKKyAgICogaW4gdGhlIHJpZ2h0IHRocmVhZCAocmUtbWFwcGVkIGZyb20gdGlkIHRvIHBpZCkuCisgICAqCisgICAqIEl0J3MgYmVjYXVzZSB3ZSBuZWVkIHRvIGFkZCB0aGUgdHRocmVhZCBfbm93XyB0aGF0IHdlCisgICAqIG5lZWQgdG8gY2FsbCAiY2xlYXJfdGhyZWFkX2luZm8iIF9ub3dfLCBhbmQgdGhhdCdzIHdoeQorICAgKiAicmVxdWlyZV9ub3RpZmljYXRpb25fb2ZfZXZlbnRzIiBkb2Vzbid0IGNsZWFyIHRoZSB0aHJlYWQKKyAgICogaW5mbyAoaXQncyBjYWxsZWQgbGF0ZXIgdGhhbiB0aGlzIHJvdXRpbmUpLgorICAgKi8KKyAgY2xlYXJfdGhyZWFkX2luZm8oKTsKKyAgYV90aHJlYWQgPSAwOworCisgIGZvciAodGlkID0gZ2V0X3Byb2Nlc3NfZmlyc3Rfc3RvcHBlZF90aHJlYWRfaWQgKHBpZCwgJnRocmVhZF9zdGF0ZSk7CisgICAgICAgdGlkICE9IDA7CisgICAgICAgdGlkID0gZ2V0X3Byb2Nlc3NfbmV4dF9zdG9wcGVkX3RocmVhZF9pZCAocGlkLCAmdGhyZWFkX3N0YXRlKSkKKyAgICB7CisgICAgICB0aHJlYWRfaW5mbyAqcDsKKyAgICAKKyAgICAgIGlmIChhX3RocmVhZCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgYV90aHJlYWQgPSB0aWQ7CisjaWZkZWYgVEhSRUFEX0RFQlVHCisgICAgICAgICAgaWYoIGRlYnVnX29uICkKKyAgICAgICAgICAgICAgcHJpbnRmKCAiQXR0YWNoaW5nIHRvIHByb2Nlc3MgJWQsIHRocmVhZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwaWQsIGFfdGhyZWFkICk7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAvKiBUZWxsIG91cnNlbHZlcyBhbmQgdGhlICJyZXN0IG9mIGdkYiIgdGhhdCB0aGlzIHRocmVhZAorICAgICAgICogZXhpc3RzLgorICAgICAgICoKKyAgICAgICAqIFRoaXMgaXNuJ3QgcmVhbGx5IGEgaGFjay4gIE90aGVyIHRocmVhZC1iYXNlZCB2ZXJzaW9ucworICAgICAgICogb2YgZ2RiIChlLmcuIGdudS1uYXQuYykgc2VlbSB0byBkbyB0aGUgc2FtZSB0aGluZy4KKyAgICAgICAqCisgICAgICAgKiBXZSBkb24ndCBuZWVkIHRvIGRvIG1hcHBpbmcgaGVyZSwgYXMgd2Uga25vdyB0aGlzCisgICAgICAgKiBpcyB0aGUgZmlyc3QgdGhyZWFkIGFuZCB0aHVzIGdldHMgdGhlIHJlYWwgcGlkCisgICAgICAgKiAoYW5kIGlzICJpbmZlcmlvcl9waWQiKS4KKyAgICAgICAqCisgICAgICAgKiBOT1RFOiBpdCBwcm9iYWJseSBpc24ndCB0aGUgb3JpZ2luYXRpbmcgdGhyZWFkLAorICAgICAgICogICAgICAgYnV0IHRoYXQgZG9lc24ndCBtYXR0ZXIgKHdlIGhvcGUhKS4KKyAgICAgICAqLworICAgICAgYWRkX3R0aHJlYWQoIHBpZCwgdGlkICk7CisgICAgICBwID0gZmluZF90aHJlYWRfaW5mbyggdGlkICk7CisgICAgICBpZiggTlVMTCA9PSBwICkgLyogP1dlIGp1c3QgYWRkZWQgaXQhICovCisgICAgICAgICAgZXJyb3IoICJJbnRlcm5hbCBlcnJvciBhZGRpbmcgYSB0aHJlYWQgb24gYXR0YWNoLiIgKTsKKyAgICAgICAgICAKKyAgICAgIGNvcHlfdHRzdGF0ZV90KCAmcC0+bGFzdF9zdG9wX3N0YXRlLCB0aHJlYWRfc3RhdGUgKTsKKyAgICAgIHAtPmhhdmVfc3RhdGUgPSAxOworICAgICAgCisgICAgICBpZiggRE9fQVRUQUNIX0NPTlRJTlVFID09IGtpbmRfb2ZfZ28gKSB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBJZiB3ZSBhcmUgZ29pbmcgdG8gQ09OVElOVUUgYWZ0ZXJ3YXJkcywKKyAgICAgICAgICAgKiByYWlzaW5nIGEgU0lHVFJBUCwgZG9uJ3QgYm90aGVyIHRyeWluZyB0bworICAgICAgICAgICAqIGhhbmRsZSB0aGlzIGV2ZW50LiAgQnV0IGNoZWNrIGZpcnN0IQorICAgICAgICAgICAqLworICAgICAgICAgIHN3aXRjaCggcC0+bGFzdF9zdG9wX3N0YXRlLnR0c19ldmVudCApIHsKKworICAgICAgICAgIGNhc2UgVFRFVlRfTk9ORToKKyAgICAgICAgICAgICAvKiBPayB0byBzZXQgdGhpcyBoYW5kbGVkLgorICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHdhcm5pbmcoICJJbnRlcm5hbCBlcnJvcjsgc2tpcHBpbmcgZXZlbnQgJXMgb24gcHJvY2VzcyAlZCwgdGhyZWFkICVkLiIsCisgICAgICAgICAgICAgICAgICBnZXRfcHJpbnRhYmxlX25hbWVfb2ZfdHRyYWNlX2V2ZW50KAorICAgICAgICAgICAgICAgICAgICAgICBwLT5sYXN0X3N0b3Bfc3RhdGUudHRzX2V2ZW50ICksCisgICAgICAgICAgICAgICAgICBwLT5waWQsIHAtPnRpZCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgc2V0X2hhbmRsZWQoIHBpZCwgdGlkICk7CisKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgIC8qIFRoZXJlIHdpbGwgYmUgbm8gImNvbnRpbnVlIiBvcGVydGlvbiwgc28gdGhlCisgICAgICAgICAgICogcHJvY2VzcyByZW1haW5zIHN0b3BwZWQuICBEb24ndCBzZXQgYW55IGV2ZW50cworICAgICAgICAgICAqIGhhbmRsZWQgZXhjZXB0IHRoZSAiZ2ltbWllcyIuCisgICAgICAgICAgICovCisgICAgICAgICAgc3dpdGNoKCBwLT5sYXN0X3N0b3Bfc3RhdGUudHRzX2V2ZW50ICkgeworCisgICAgICAgICAgY2FzZSBUVEVWVF9OT05FOgorICAgICAgICAgICAgICAvKiBPayB0byBpZ25vcmUgdGhpcy4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIHNldF9oYW5kbGVkKCBwaWQsIHRpZCApOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgVFRFVlRfRVhFQzoKKyAgICAgICAgICBjYXNlIFRURVZUX0ZPUks6CisgICAgICAgICAgICAgIC8qIEV4cGVjdGVkICJvdGhlciIgRk9SSyBvciBFWEVDIGV2ZW50IGZyb20gYQorICAgICAgICAgICAgICAgKiBmb3JrIG9yIHZmb3JrLgorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBwcmludGYoICJJbnRlcm5hbCBlcnJvcjogZmFpbGVkIHRvIGhhbmRsZSBldmVudCAlcyBvbiBwcm9jZXNzICVkLCB0aHJlYWQgJWQuIiwKKyAgICAgICAgICAgICAgICAgIGdldF9wcmludGFibGVfbmFtZV9vZl90dHJhY2VfZXZlbnQoCisgICAgICAgICAgICAgICAgICAgICAgIHAtPmxhc3Rfc3RvcF9zdGF0ZS50dHNfZXZlbnQgKSwKKyAgICAgICAgICAgICAgICAgIHAtPnBpZCwgcC0+dGlkKTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIGFkZF90aHJlYWQoIHRpZCApOyAgICAgICAvKiBpbiB0aHJlYWQuYyAqLworICAgIH0KKyAKKyNpZmRlZiBQQVJBTk9JQQorICAgIGlmKCBkZWJ1Z19vbiApCisgICAgICAgIHByaW50X3R0aHJlYWRzKCk7CisjZW5kaWYKKworICAvKiBPbmUgbXVzdG4ndCBjYWxsIHR0cmFjZV93YWl0KCkgYWZ0ZXIgYXR0YWNoaW5nIHZpYSB0dHJhY2UsCisgICAgICdjYXVzZSB0aGUgcHJvY2VzcyBpcyBzdG9wcGVkIGFscmVhZHkuCisgICAgIAorICAgICBIb3dldmVyLCB0aGUgdXBwZXIgbGF5ZXJzIG9mIGdkYidzIGV4ZWN1dGlvbiBjb250cm9sIHdpbGwKKyAgICAgd2FudCB0byB3YWl0IGFmdGVyIGF0dGFjaGluZyAoYnV0IG5vdCBhZnRlciBmb3JrcywgaW4KKyAgICAgd2hpY2ggY2FzZSB0aGV5IHdpbGwgYmUgZG9pbmcgYSAidGFyZ2V0X3Jlc3VtZSIsIGFudGljaXBhdGluZworICAgICBhIGxhdGVyIFRURVZUX0VYRUMgb3IgVFRFVlRfRk9SSyBldmVudCkuCisKKyAgICAgVG8gbWFrZSB0aGlzIGF0dGFjaCgpIGltcGxlbWVudGF0aW9uIG1vcmUgY29tcGF0aWJsZSB3aXRoCisgICAgIG90aGVycywgd2UnbGwgbWFrZSB0aGUgYXR0YWNoZWQtdG8gcHJvY2VzcyByYWlzZSBhIFNJR1RSQVAuCisKKyAgICAgSXNzdWU6IHRoaXMgY29udGludWVzIG9ubHkgb25lIHRocmVhZC4gIFRoYXQgY291bGQgYmUKKyAgICAgZGFuZ2Vyb3VzIGlmIHRoZSB0aHJlYWQgaXMgYmxvY2tlZC0tdGhlIHByb2Nlc3Mgd29uJ3QgcnVuCisgICAgIGFuZCBubyB0cmFwIHdpbGwgYmUgcmFpc2VkLiAgRklYISAoY2hlY2sgc3RhdGUudHRzX2ZsYWdzPworICAgICBuZWVkIG9uZSB0aGF0J3MgZWl0aGVyIFRUU19XQVNSVU5OSU5HLS1idXQgd2UndmUgc3RvcHBlZAorICAgICBpdCBhbmQgbWFkZSBpdCBUVFNfV0FTU1VTUEVOREVELiAgSHVtLi4uRklYTUUhKQorICAgKi8KKyAgaWYoIERPX0FUVEFDSF9DT05USU5VRSA9PSBraW5kX29mX2dvICkgeworICAgICAgdHRfc3RhdHVzID0gY2FsbF9yZWFsX3R0cmFjZSgKKyAgICAgICAgICAgICAgICAgICAgICBUVF9MV1BfQ09OVElOVUUsCisgICAgICAgICAgICAgICAgICAgICAgcGlkLAorICAgICAgICAgICAgICAgICAgICAgIGFfdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgIFRUX1VTRV9DVVJSRU5UX1BDLAorICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIHRhcmdldF9zaWduYWxfdG9faG9zdCAoVEFSR0VUX1NJR05BTF9UUkFQKSwKKyAgICAgICAgICAgICAgICAgICAgICBUVF9OSUwpOworICAgICAgaWYgKGVycm5vKQorICAgICAgICAgIHBlcnJvcl93aXRoX25hbWUgKCJ0dHJhY2UiKTsKKworICAgICAgY2xlYXJfaGFuZGxlZCggYV90aHJlYWQgKTsgIC8qIFNvIFRSQVAgd2lsbCBiZSByZXBvcnRlZC4gKi8KKworICAgICAgLyogTm93IHJ1bm5pbmcuCisgICAgICAgKi8KKyAgICAgIHByb2Nlc3Nfc3RhdGUgPSBSVU5OSU5HOworICB9CisKKyAgYXR0YWNoX2ZsYWcgPSAxOworfQorI2VuZGlmIC8qIEFUVEFDSF9ERVRBQ0ggKi8KKworDAorI2lmZGVmIEFUVEFDSF9ERVRBQ0gKKy8qIFN0YXJ0IGRlYnVnZ2luZyB0aGUgcHJvY2VzcyB3aG9zZSBudW1iZXIgaXMgUElELgorICogKEEgX3JlYWxfIHBpZCkuCisgKi8KK2ludAorYXR0YWNoKCBwaWQgKQorICAgICBpbnQgcGlkOworeworICBpbnQgICAgICAgdHRfc3RhdHVzOworICAKKyAgdHRfc3RhdHVzID0gY2FsbF9yZWFsX3R0cmFjZSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9QUk9DX0FUVEFDSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsd3BpZF90KSBUVF9OSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9OSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBUVF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTklMKTsKKyAgaWYgKGVycm5vKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJ0dHJhY2UgYXR0YWNoIik7CisKKyAgLyogSWYgc3VjY2Vzc2Z1bCwgdGhlIHByb2Nlc3MgaXMgbm93IHN0b3BwZWQuCisgICAqLworICBwcm9jZXNzX3N0YXRlID0gU1RPUFBFRDsKKworICAvKiBPdXIgY2FsbGVyICgiYXR0YWNoX2NvbW1hbmQiIGluICJpbmZjbWQuYyIpCisgICAqIGV4cGVjdHMgdG8gZG8gYSAid2FpdF9mb3JfaW5mZXJpb3IiIGFmdGVyCisgICAqIHRoZSBhdHRhY2gsIHNvIG1ha2Ugc3VyZSB0aGUgaW5mZXJpb3IgaXMKKyAgICogcnVubmluZyB3aGVuIHdlJ3JlIGRvbmUuCisgICAqLworICB1cGRhdGVfdGhyZWFkX3N0YXRlX2FmdGVyX2F0dGFjaCggcGlkLCBET19BVFRBQ0hfQ09OVElOVUUgKTsKKworICByZXR1cm4gcGlkOworfQorCisKKyNpZiBkZWZpbmVkKENISUxEX1BPU1RfQVRUQUNIKQordm9pZAorY2hpbGRfcG9zdF9hdHRhY2ggKHBpZCkKKyAgaW50ICBwaWQ7Cit7CisjaWZkZWYgVEhSRUFEX0RFQlVHCisgIGlmKCBkZWJ1Z19vbiApCisgICAgICBwcmludGYoICJjaGlsZC1wb3N0LWF0dGFjaCBjYWxsXG4iICk7CisjZW5kaWYKKworICByZXF1aXJlX25vdGlmaWNhdGlvbl9vZl9ldmVudHMgKHBpZCk7Cit9CisjZW5kaWYKKworCisvKiBTdG9wIGRlYnVnZ2luZyB0aGUgcHJvY2VzcyB3aG9zZSBudW1iZXIgaXMgUElECisgICBhbmQgY29udGludWUgaXQgd2l0aCBzaWduYWwgbnVtYmVyIFNJR05BTC4KKyAgIFNJR05BTCA9IDAgbWVhbnMganVzdCBjb250aW51ZSBpdC4KKyAqLwordm9pZAorZGV0YWNoKCBzaWduYWwgKQorICAgICBpbnQgc2lnbmFsOworeworICBlcnJubyA9IDA7CisgIGNhbGxfdHRyYWNlIChUVF9QUk9DX0RFVEFDSCwKKyAgICAgICAgICAgICAgIGluZmVyaW9yX3BpZCwKKyAgICAgICAgICAgICAgIFRUX05JTCwKKyAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIHNpZ25hbCwKKyAgICAgICAgICAgICAgIFRUX05JTCk7CisgIGF0dGFjaF9mbGFnID0gMDsKKworICBjbGVhcl90aHJlYWRfaW5mbygpOworCisgIC8qIFByb2Nlc3Mtc3RhdGU/ICovCit9CisjZW5kaWYgLyogQVRUQUNIX0RFVEFDSCAqLworCisMCisvKiBEZWZhdWx0IHRoZSB0eXBlIG9mIHRoZSB0dHJhY2UgdHJhbnNmZXIgdG8gaW50LiAgKi8KKyNpZm5kZWYgVFRSQUNFX1hGRVJfVFlQRQorI2RlZmluZSBUVFJBQ0VfWEZFUl9UWVBFIGludAorI2VuZGlmCisKK3ZvaWQKK19pbml0aWFsaXplX2tlcm5lbF91X2FkZHIgKCkKK3sKK30KKworI2lmICFkZWZpbmVkIChDSElMRF9YRkVSX01FTU9SWSkKKy8qIE5PVEUhIEkgdHJpZWQgdXNpbmcgVFRSQUNFX1JFQUREQVRBLCBldGMuLCB0byByZWFkIGFuZCB3cml0ZSBtZW1vcnkKKyAgIGluIHRoZSBORVdfU1VOX1RUUkFDRSBjYXNlLgorICAgSXQgb3VnaHQgdG8gYmUgc3RyYWlnaHRmb3J3YXJkLiAgQnV0IGl0IGFwcGVhcnMgdGhhdCB3cml0aW5nIGRpZAorICAgbm90IHdyaXRlIHRoZSBkYXRhIHRoYXQgSSBzcGVjaWZpZWQuICBJIGNhbm5vdCB1bmRlcnN0YW5kIHdoZXJlCisgICBpdCBnb3QgdGhlIGRhdGEgdGhhdCBpdCBhY3R1YWxseSBkaWQgd3JpdGUuICAqLworCisvKiBDb3B5IExFTiBieXRlcyB0byBvciBmcm9tIGluZmVyaW9yJ3MgbWVtb3J5IHN0YXJ0aW5nIGF0IE1FTUFERFIKKyAgIHRvIGRlYnVnZ2VyIG1lbW9yeSBzdGFydGluZyBhdCBNWUFERFIuICAgQ29weSB0byBpbmZlcmlvciBpZgorICAgV1JJVEUgaXMgbm9uemVyby4KKyAgCisgICBSZXR1cm5zIHRoZSBsZW5ndGggY29waWVkLCB3aGljaCBpcyBlaXRoZXIgdGhlIExFTiBhcmd1bWVudCBvciB6ZXJvLgorICAgVGhpcyB4ZmVyIGZ1bmN0aW9uIGRvZXMgbm90IGRvIHBhcnRpYWwgbW92ZXMsIHNpbmNlIGNoaWxkX29wcworICAgZG9lc24ndCBhbGxvdyBtZW1vcnkgb3BlcmF0aW9ucyB0byBjcm9zcyBiZWxvdyB1cyBpbiB0aGUgdGFyZ2V0IHN0YWNrCisgICBhbnl3YXkuICAqLworCitpbnQKK2NoaWxkX3hmZXJfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbiwgd3JpdGUsIHRhcmdldCkKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IHdyaXRlOworICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0OwkJLyogaWdub3JlZCAqLworeworICByZWdpc3RlciBpbnQgaTsKKyAgLyogUm91bmQgc3RhcnRpbmcgYWRkcmVzcyBkb3duIHRvIGxvbmd3b3JkIGJvdW5kYXJ5LiAgKi8KKyAgcmVnaXN0ZXIgQ09SRV9BRERSIGFkZHIgPSBtZW1hZGRyICYgLSBzaXplb2YgKFRUUkFDRV9YRkVSX1RZUEUpOworICAvKiBSb3VuZCBlbmRpbmcgYWRkcmVzcyB1cDsgZ2V0IG51bWJlciBvZiBsb25nd29yZHMgdGhhdCBtYWtlcy4gICovCisgIHJlZ2lzdGVyIGludCBjb3VudAorICAgID0gKCgobWVtYWRkciArIGxlbikgLSBhZGRyKSArIHNpemVvZiAoVFRSQUNFX1hGRVJfVFlQRSkgLSAxKQorICAgICAgLyBzaXplb2YgKFRUUkFDRV9YRkVSX1RZUEUpOworICAvKiBBbGxvY2F0ZSBidWZmZXIgb2YgdGhhdCBtYW55IGxvbmd3b3Jkcy4gICovCisgIHJlZ2lzdGVyIFRUUkFDRV9YRkVSX1RZUEUgKmJ1ZmZlcgorICAgID0gKFRUUkFDRV9YRkVSX1RZUEUgKikgYWxsb2NhIChjb3VudCAqIHNpemVvZiAoVFRSQUNFX1hGRVJfVFlQRSkpOworCisgIGlmICh3cml0ZSkKKyAgICB7CisgICAgICAvKiBGaWxsIHN0YXJ0IGFuZCBlbmQgZXh0cmEgYnl0ZXMgb2YgYnVmZmVyIHdpdGggZXhpc3RpbmcgbWVtb3J5IGRhdGEuICAqLworCisgICAgICBpZiAoYWRkciAhPSBtZW1hZGRyIHx8IGxlbiA8IChpbnQpIHNpemVvZiAoVFRSQUNFX1hGRVJfVFlQRSkpIHsKKwkvKiBOZWVkIHBhcnQgb2YgaW5pdGlhbCB3b3JkIC0tIGZldGNoIGl0LiAgKi8KKyAgICAgICAgYnVmZmVyWzBdID0gY2FsbF90dHJhY2UgKFRUX0xXUF9SRFRFWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZlcmlvcl9waWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTklMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTklMKTsKKyAgICAgIH0KKworICAgICAgaWYgKGNvdW50ID4gMSkJCS8qIEZJWE1FLCBhdm9pZCBpZiBldmVuIGJvdW5kYXJ5ICovCisJeworCSAgYnVmZmVyW2NvdW50IC0gMV0gPSBjYWxsX3R0cmFjZSAoVFRfTFdQX1JEVEVYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZlcmlvcl9waWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUVFJBQ0VfQVJHX1RZUEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyICsgKGNvdW50IC0gMSkgKiBzaXplb2YgKFRUUkFDRV9YRkVSX1RZUEUpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTklMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX05JTCk7CisJfQorCisgICAgICAvKiBDb3B5IGRhdGEgdG8gYmUgd3JpdHRlbiBvdmVyIGNvcnJlc3BvbmRpbmcgcGFydCBvZiBidWZmZXIgKi8KKworICAgICAgbWVtY3B5ICgoY2hhciAqKSBidWZmZXIgKyAobWVtYWRkciAmIChzaXplb2YgKFRUUkFDRV9YRkVSX1RZUEUpIC0gMSkpLAorCSAgICAgIG15YWRkciwKKwkgICAgICBsZW4pOworCisgICAgICAvKiBXcml0ZSB0aGUgZW50aXJlIGJ1ZmZlci4gICovCisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBhZGRyICs9IHNpemVvZiAoVFRSQUNFX1hGRVJfVFlQRSkpCisJeworCSAgZXJybm8gPSAwOworCSAgY2FsbF90dHJhY2UgKFRUX0xXUF9XUkRBVEEsCisgICAgICAgICAgICAgICAgICAgICAgIGluZmVyaW9yX3BpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgYnVmZmVyW2ldLAorICAgICAgICAgICAgICAgICAgICAgICBUVF9OSUwpOworCSAgaWYgKGVycm5vKQorCSAgICB7CisJICAgICAgLyogVXNpbmcgdGhlIGFwcHJvcHJpYXRlIG9uZSAoSSBvciBEKSBpcyBuZWNlc3NhcnkgZm9yCisJCSBHb3VsZCBOUDEsIGF0IGxlYXN0LiAgKi8KKwkgICAgICBlcnJubyA9IDA7CisJICAgICAgY2FsbF90dHJhY2UgKFRUX0xXUF9XUlRFWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZlcmlvcl9waWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgYnVmZmVyW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTklMKTsKKwkgICAgfQorCSAgaWYgKGVycm5vKQorCSAgICByZXR1cm4gMDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogUmVhZCBhbGwgdGhlIGxvbmd3b3JkcyAqLworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIGFkZHIgKz0gc2l6ZW9mIChUVFJBQ0VfWEZFUl9UWVBFKSkKKwl7CisJICBlcnJubyA9IDA7CisJICBidWZmZXJbaV0gPSBjYWxsX3R0cmFjZSAoVFRfTFdQX1JEVEVYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mZXJpb3JfcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9OSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX05JTCk7CisJICBpZiAoZXJybm8pCisJICAgIHJldHVybiAwOworCSAgUVVJVDsKKwl9CisKKyAgICAgIC8qIENvcHkgYXBwcm9wcmlhdGUgYnl0ZXMgb3V0IG9mIHRoZSBidWZmZXIuICAqLworICAgICAgbWVtY3B5IChteWFkZHIsCisJICAgICAgKGNoYXIgKikgYnVmZmVyICsgKG1lbWFkZHIgJiAoc2l6ZW9mIChUVFJBQ0VfWEZFUl9UWVBFKSAtIDEpKSwKKwkgICAgICBsZW4pOworICAgIH0KKyAgcmV0dXJuIGxlbjsKK30KKworDAorc3RhdGljIHZvaWQKK3Vkb3RfaW5mbyAoKQoreworICBpbnQgdWRvdF9vZmY7CQkvKiBPZmZzZXQgaW50byB1c2VyIHN0cnVjdCAqLworICBpbnQgdWRvdF92YWw7CQkvKiBWYWx1ZSBmcm9tIHVzZXIgc3RydWN0IGF0IHVkb3Rfb2ZmICovCisgIGNoYXIgbWVzc1sxMjhdOwkvKiBGb3IgbWVzc2FnZXMgKi8KKworICAgaWYgKCF0YXJnZXRfaGFzX2V4ZWN1dGlvbikKKyAgICAgeworICAgICAgIGVycm9yICgiVGhlIHByb2dyYW0gaXMgbm90IGJlaW5nIHJ1bi4iKTsKKyAgICAgfQorCisjaWYgIWRlZmluZWQgKEtFUk5FTF9VX1NJWkUpCisKKyAgLyogQWRkaW5nIHN1cHBvcnQgZm9yIHRoaXMgY29tbWFuZCBpcyBlYXN5LiAgVHlwaWNhbGx5IHlvdSBqdXN0IGFkZCBhCisgICAgIHJvdXRpbmUsIGNhbGxlZCAia2VybmVsX3Vfc2l6ZSIgdGhhdCByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSB1c2VyCisgICAgIHN0cnVjdCwgdG8gdGhlIGFwcHJvcHJpYXRlICotbmF0LmMgZmlsZSBhbmQgdGhlbiBhZGQgdG8gdGhlIG5hdGl2ZQorICAgICBjb25maWcgZmlsZSAiI2RlZmluZSBLRVJORUxfVV9TSVpFIGtlcm5lbF91X3NpemUoKSIgKi8KKyAgZXJyb3IgKCJEb24ndCBrbm93IGhvdyBsYXJnZSBgYHN0cnVjdCB1c2VyJycgaXMgaW4gdGhpcyB2ZXJzaW9uIG9mIGdkYi4iKTsKKworI2Vsc2UKKworICBmb3IgKHVkb3Rfb2ZmID0gMDsgdWRvdF9vZmYgPCBLRVJORUxfVV9TSVpFOyB1ZG90X29mZiArPSBzaXplb2YgKHVkb3RfdmFsKSkKKyAgICB7CisgICAgICBpZiAoKHVkb3Rfb2ZmICUgMjQpID09IDApCisJeworCSAgaWYgKHVkb3Rfb2ZmID4gMCkKKwkgICAgeworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisJICAgIH0KKwkgIHByaW50Zl9maWx0ZXJlZCAoIiUwNHg6IiwgdWRvdF9vZmYpOworCX0KKyAgICAgIHVkb3RfdmFsID0gY2FsbF90dHJhY2UgKFRUX0xXUF9SVVJFR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZlcmlvcl9waWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSB1ZG90X29mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX05JTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX05JTCk7CisgICAgICBpZiAoZXJybm8gIT0gMCkKKwl7CisJICBzcHJpbnRmIChtZXNzLCAiXG5yZWFkaW5nIHVzZXIgc3RydWN0IGF0IG9mZnNldCAweCV4IiwgdWRvdF9vZmYpOworCSAgcGVycm9yX3dpdGhfbmFtZSAobWVzcyk7CisJfQorICAgICAgLyogQXZvaWQgdXNpbmcgbm9ucG9ydGFibGUgKD8pICIqIiBpbiBwcmludCBzcGVjcyAqLworICAgICAgcHJpbnRmX2ZpbHRlcmVkIChzaXplb2YgKGludCkgPT0gNCA/ICIgMHglMDh4IiA6ICIgMHglMTZ4IiwgdWRvdF92YWwpOworICAgIH0KKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKworI2VuZGlmCit9CisjZW5kaWYgLyogIWRlZmluZWQgKENISUxEX1hGRVJfTUVNT1JZKS4gICovCisKKy8qIFRUcmFjZSB2ZXJzaW9uIG9mICJ0YXJnZXRfcGlkX3RvX2V4ZWNfZmlsZSIKKyAqLworY2hhciAqCitjaGlsZF9waWRfdG9fZXhlY19maWxlICh0aWQpCisgICAgaW50ICB0aWQ7Cit7CisgIHN0YXRpYyBjaGFyICBleGVjX2ZpbGVfYnVmZmVyWzEwMjRdOworICBpbnQgIHR0X3N0YXR1czsKKyAgQ09SRV9BRERSICB0b3Bfb2Zfc3RhY2s7CisgIGNoYXIgIGZvdXJfY2hhcnNbNF07CisgIGludCAgbmFtZV9pbmRleDsKKyAgaW50ICBpOworICBpbnQgIGRvbmU7CisgIGludCAgc2F2ZWRfaW5mZXJpb3JfcGlkOworICAKKyAgLyogQXMgb2YgMTAueCBIUC1VWCwgdGhlcmUncyBhbiBleHBsaWNpdCByZXF1ZXN0IHRvIGdldCB0aGUKKyAgICpwYXRobmFtZS4KKyAgICovCisgIHR0X3N0YXR1cyA9IGNhbGxfdHRyYWNlIChUVF9QUk9DX0dFVF9QQVRITkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIGV4ZWNfZmlsZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBzaXplb2YgKGV4ZWNfZmlsZV9idWZmZXIpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX05JTCk7CisgIGlmICh0dF9zdGF0dXMgPj0gMCkKKyAgICByZXR1cm4gZXhlY19maWxlX2J1ZmZlcjsKKworICAvKiA/P3JlaHJhdWVyOiBUaGUgYWJvdmUgcmVxdWVzdCBtYXkgb3IgbWF5IG5vdCBiZSBicm9rZW4uICBJdAorICAgICBkb2Vzbid0IHNlZW0gdG8gd29yayB3aGVuIEkgdXNlIGl0LiAgQnV0LCBpdCBtYXkgYmUgZGVzaWduZWQKKyAgICAgdG8gb25seSB3b3JrIGltbWVkaWF0ZWx5IGFmdGVyIGFuIGV4ZWMgZXZlbnQgb2NjdXJzLiAgKEknbQorICAgICB3YWl0aW5nIGZvciBDT1NMIHRvIGV4cGxhaW4uKQorCisgICAgIEluIGFueSBjYXNlLCBpZiBpdCBmYWlscywgdHJ5IGEgcmVhbGx5LCB0cnVseSBhbWF6aW5nbHkgZ3Jvc3MKKyAgICAgaGFjayB0aGF0IERERSB1c2VzLCBvZiBwYXdpbmcgdGhyb3VnaCB0aGUgcHJvY2VzcycgZGF0YQorICAgICBzZWdtZW50IHRvIGZpbmQgdGhlIHBhdGhuYW1lLgorICAgICAqLworICB0b3Bfb2Zfc3RhY2sgPSAweDdiMDNhMDAwOworICBuYW1lX2luZGV4ID0gMDsKKyAgZG9uZSA9IDA7CisKKyAgLyogT24gdGhlIGNoYW5jZSB0aGF0IHBpZCAhPSBpbmZlcmlvcl9waWQsIHNldCBpbmZlcmlvcl9waWQKKyAgICAgdG8gcGlkLCBzbyB0aGF0IChncnJyciEpIGltcGxpY2l0IHVzZXMgb2YgaW5mZXJpb3JfcGlkIGdldAorICAgICB0aGUgcmlnaHQgaWQuCisgICAgICovCisgIHNhdmVkX2luZmVyaW9yX3BpZCA9IGluZmVyaW9yX3BpZDsKKyAgaW5mZXJpb3JfcGlkID0gdGlkOworCisgIC8qIFRyeSB0byBncmFiIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4gKi8KKyAgd2hpbGUgKCEgZG9uZSkgeworICAgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkgKHRvcF9vZl9zdGFjaywgZm91cl9jaGFycywgNCkgIT0gMCkKKyAgICAgIHsKKyAgICAgICAgaW5mZXJpb3JfcGlkID0gc2F2ZWRfaW5mZXJpb3JfcGlkOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICBleGVjX2ZpbGVfYnVmZmVyW25hbWVfaW5kZXgrK10gPSBmb3VyX2NoYXJzW2ldOworICAgICAgZG9uZSA9IChmb3VyX2NoYXJzW2ldID09ICdcMCcpOworICAgICAgaWYgKGRvbmUpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB0b3Bfb2Zfc3RhY2sgKz0gNDsKKyAgfQorCisgIGlmIChleGVjX2ZpbGVfYnVmZmVyWzBdID09ICdcMCcpCisgICAgeworICAgICAgaW5mZXJpb3JfcGlkID0gc2F2ZWRfaW5mZXJpb3JfcGlkOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGluZmVyaW9yX3BpZCA9IHNhdmVkX2luZmVyaW9yX3BpZDsKKyAgcmV0dXJuIGV4ZWNfZmlsZV9idWZmZXI7Cit9CisKKwordm9pZAorcHJlX2ZvcmtfaW5mZXJpb3IgKCkKK3sKKyAgaW50ICBzdGF0dXM7CisKKyAgc3RhdHVzID0gcGlwZSAoc3RhcnR1cF9zZW1hcGhvcmUucGFyZW50X2NoYW5uZWwpOworICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgd2FybmluZyAoImVycm9yIGdldHRpbmcgcGFyZW50IHBpcGUgZm9yIHN0YXJ0dXAgc2VtYXBob3JlIik7CisgICAgICByZXR1cm47CisgIH0KKworICBzdGF0dXMgPSBwaXBlIChzdGFydHVwX3NlbWFwaG9yZS5jaGlsZF9jaGFubmVsKTsKKyAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgIHdhcm5pbmcgKCJlcnJvciBnZXR0aW5nIGNoaWxkIHBpcGUgZm9yIHN0YXJ0dXAgc2VtYXBob3JlIik7CisgICAgICByZXR1cm47CisgIH0KK30KKworLyogQ2FsbGVkIHZpYSAjZGVmaW5lIFJFUVVJUkVfQVRUQUNIIGZyb20gaW5mdGFyZy5jLAorICogdWx0aW1hdGVseSBmcm9tICJmb2xsb3dfaW5mZXJpb3JfZm9yayIgaW4gaW5mcnVuLmMsCisgKiBpdHNlbGYgY2FsbGVkIGZyb20gInJlc3VtZSIuCisgKgorICogVGhpcyBzZWVtcyB0byBiZSBpbnRlbmRlZCB0byBhdHRhY2ggYWZ0ZXIgYSBmb3JrIG9yCisgKiB2Zm9yaywgd2hpbGUgImF0dGFjaCIgaXMgdXNlZCB0byBhdHRhY2ggdG8gYSBwaWQKKyAqIGdpdmVuIGJ5IHRoZSB1c2VyLiAgVGhlIGNoZWNrIGZvciBhbiBleGlzdGluZyBhdHRhY2gKKyAqIHNlZW1zIG9kZC0taXQgYWx3YXlzIGZhaWxzIGluIG91ciB0ZXN0IHN5c3RlbS4KKyAqLworaW50CitocHBhX3JlcXVpcmVfYXR0YWNoIChwaWQpCisgIGludCAgcGlkOworeworICBpbnQgICAgICAgICAgICAgdHRfc3RhdHVzOworICBDT1JFX0FERFIgICAgICAgcGM7CisgIENPUkVfQUREUiAgICAgICBwY19hZGRyOworICB1bnNpZ25lZCBpbnQgICAgcmVnc19vZmZzZXQ7CisgIHByb2Nlc3Nfc3RhdGVfdCBvbGRfcHJvY2Vzc19zdGF0ZSA9IHByb2Nlc3Nfc3RhdGU7CisgIAorICAvKiBBcmUgd2UgYWxyZWFkeSBhdHRhY2hlZD8gIFRoZXJlIGFwcGVhcnMgdG8gYmUgbm8gZXhwbGljaXQKKyAgICogd2F5IHRvIGFuc3dlciB0aGlzIHZpYSB0dHJhY2UsIHNvIHdlIHRyeSBzb21ldGhpbmcgd2hpY2gKKyAgICogc2hvdWxkIGJlIGlubm9jdW91cyBpZiB3ZSBhcmUgYXR0YWNoZWQuICBJZiB0aGF0IGZhaWxzLAorICAgKiB0aGVuIHdlIGFzc3VtZSB3ZSdyZSBub3QgYXR0YWNoZWQsIGFuZCBzbyBhdHRlbXB0IHRvIG1ha2UKKyAgICogaXQgc28uCisgICAqLworICBlcnJubyA9IDA7CisgIHR0X3N0YXR1cyA9IGNhbGxfcmVhbF90dHJhY2UgKFRUX1BST0NfU1RPUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobHdwaWRfdCkgVFRfTklMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBUVF9OSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIFRUX05JTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTklMKTsKKyAgCisgIGlmIChlcnJubykKKyAgICB7CisgICAgICAvKiBObyBjaGFuZ2UgdG8gcHJvY2Vzcy1zdGF0ZSEKKyAgICAgICAqLworICAgICAgZXJybm8gPSAwOworICAgICAgcGlkICAgPSBhdHRhY2ggKHBpZCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAvKiBJZiBzdWNjZXNzZnVsLCB0aGUgcHJvY2VzcyBpcyBub3cgc3RvcHBlZC4gIEJ1dCBpZgorICAgICAgKiB3ZSdyZSBWRk9SS0lORywgdGhlIHBhcmVudCBpcyBzdGlsbCBydW5uaW5nLCBzbyBkb24ndAorICAgICAgKiBjaGFuZ2UgdGhlIHByb2Nlc3Mgc3RhdGUuCisgICAgICAqLworICAgICBpZiggcHJvY2Vzc19zdGF0ZSAhPSBWRk9SS0lORyApCisgICAgICAgICBwcm9jZXNzX3N0YXRlID0gU1RPUFBFRDsKKworICAgICAvKiBJZiB3ZSB3ZXJlIGFscmVhZHkgYXR0YWNoZWQsIHlvdSdkIHRoaW5rIHRoYXQgd2UKKyAgICAgICogd291bGQgbmVlZCB0byBzdGFydCBnb2luZyBhZ2Fpbi0tYnV0IHlvdSdkIGJlIHdyb25nLAorICAgICAgKiBhcyB0aGUgZm9yay1mb2xsb3dpbmcgY29kZSBpcyBhY3R1YWxseSBpbiB0aGUgbWlkZGxlCisgICAgICAqIG9mIHRoZSAicmVzdW1lIiByb3V0aW5lIGluIGluICJpbmZydW4uYyIgYW5kIHNvCisgICAgICAqIHdpbGwgKGFsbW9zdCkgaW1tZWRpYXRlbHkgZG8gYSByZXN1bWUuCisgICAgICAqCisgICAgICAqIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB3ZSBhcmUgVkZPUktJTkcsIHdoaWNoIG1lYW5zCisgICAgICAqIHRoYXQgdGhlIGNoaWxkIGFuZCB0aGUgcGFyZW50IHNoYXJlIGEgcHJvY2VzcyBmb3IgYQorICAgICAgKiB3aGlsZSwgd2Uga25vdyB0aGF0ICJyZXN1bWUiIHdvbid0IGJlIHJlc3VtaW5nCisgICAgICAqIHVudGlsIHRoZSBjaGlsZCBFWEVDIGV2ZW50IGlzIHNlZW4uICBCdXQgd2Ugc3RpbGwKKyAgICAgICogZG9uJ3Qgd2FudCB0byBjb250aW51ZSwgYXMgdGhlIGV2ZW50IGlzIGFscmVhZHkKKyAgICAgICogdGhlcmUgd2FpdGluZy4KKyAgICAgICovCisgICAgIHVwZGF0ZV90aHJlYWRfc3RhdGVfYWZ0ZXJfYXR0YWNoKCBwaWQsIERPTlRfQVRUQUNIX0NPTlRJTlVFICk7CisgICAgfSAgIC8qIFNUT1Agc3VjY2VlZGVkICovCisgICAgCisgIHJldHVybiBwaWQ7Cit9CisKK2ludAoraHBwYV9yZXF1aXJlX2RldGFjaCAocGlkLCBzaWduYWwpCisgIGludCAgcGlkOworICBpbnQgIHNpZ25hbDsKK3sKKyAgaW50ICB0dF9zdGF0dXM7CisKKyAgLyogSWYgc2lnbmFsIGlzIG5vbi16ZXJvLCB3ZSBtdXN0IHBhc3MgdGhlIHNpZ25hbCBvbiB0byB0aGUgYWN0aXZlCisgICAgIHRocmVhZCBwcmlvciB0byBkZXRhY2hpbmcuICBXZSBkbyB0aGlzIGJ5IGNvbnRpbnVpbmcgdGhlIHRocmVhZHMKKyAgICAgd2l0aCB0aGUgc2lnbmFsLgorICAgKi8KKyAgaWYgKHNpZ25hbCAhPSAwKQorICAgIHsKKyAgICAgIGVycm5vID0gMDsKKyAgICAgIHRocmVhZHNfY29udGludWVfYWxsX3dpdGhfc2lnbmFscyggcGlkLCBzaWduYWwgKTsKKyAgICB9CisKKyAgZXJybm8gPSAwOworICB0dF9zdGF0dXMgPSBjYWxsX3R0cmFjZSAoVFRfUFJPQ19ERVRBQ0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9OSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9OSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9OSUwpOworCisgIGVycm5vID0gMDsgLyogSWdub3JlIGFueSBlcnJvcnMuICovCisKKyAgLyogcHJvY2Vzc19zdGF0ZT8gKi8KKyAgCisgIHJldHVybiBwaWQ7Cit9CisKKy8qIEdpdmVuIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIGEgbWVtb3J5IHBhZ2UsIGhhc2ggaXQgdG8gYSBidWNrZXQgaW4KKyAgIHRoZSBtZW1vcnkgcGFnZSBkaWN0aW9uYXJ5LgorICAgKi8KK3N0YXRpYyBpbnQKK2dldF9kaWN0aW9uYXJ5X2J1Y2tldF9vZl9wYWdlIChwYWdlX3N0YXJ0KQorICBDT1JFX0FERFIgIHBhZ2Vfc3RhcnQ7Cit7CisgIGludCAgaGFzaDsKKworICBoYXNoID0gKHBhZ2Vfc3RhcnQgLyBtZW1vcnlfcGFnZV9kaWN0aW9uYXJ5LnBhZ2Vfc2l6ZSk7CisgIGhhc2ggPSBoYXNoICUgTUVNT1JZX1BBR0VfRElDVElPTkFSWV9CVUNLRVRfQ09VTlQ7CisKKyAgcmV0dXJuIGhhc2g7Cit9CisKKworLyogR2l2ZW4gYSBtZW1vcnkgcGFnZSdzIHN0YXJ0aW5nIGFkZHJlc3MsIGdldCAoaS5lLiwgZmluZCBhbiBleGlzdGluZworICAgb3IgY3JlYXRlIGEgbmV3KSBkaWN0aW9uYXJ5IGVudHJ5IGZvciB0aGUgcGFnZS4gIFRoZSBwYWdlIHdpbGwgYmUKKyAgIHdyaXRlLXByb3RlY3RlZCB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgYnV0IG1heSBoYXZlIGEgcmVmZXJlbmNlCisgICBjb3VudCBvZiAwIChpZiB0aGUgcGFnZSB3YXMgbmV3bHktYWRkZWQgdG8gdGhlIGRpY3Rpb25hcnkpLgorICAgKi8KK3N0YXRpYyBtZW1vcnlfcGFnZV90ICoKK2dldF9kaWN0aW9uYXJ5X2VudHJ5X29mX3BhZ2UgKHBpZCwgcGFnZV9zdGFydCkKKyAgaW50ICBwaWQ7CisgIENPUkVfQUREUiAgcGFnZV9zdGFydDsKK3sKKyAgaW50ICBidWNrZXQ7CisgIG1lbW9yeV9wYWdlX3QgKiAgcGFnZSA9IE5VTEw7CisgIG1lbW9yeV9wYWdlX3QgKiAgcHJldmlvdXNfcGFnZSA9IE5VTEw7CisKKyAgLyogV2UncmUgZ29pbmcgdG8gYmUgdXNpbmcgdGhlIGRpY3Rpb25hcnkgbm93LCB0aGFuLWtldy4gKi8KKyAgcmVxdWlyZV9tZW1vcnlfcGFnZV9kaWN0aW9uYXJ5IChwaWQpOworCisgIC8qIFRyeSB0byBmaW5kIGFuIGV4aXN0aW5nIGRpY3Rpb25hcnkgZW50cnkgZm9yIHRoaXMgcGFnZS4gIEhhc2gKKyAgICAgb24gdGhlIHBhZ2UncyBzdGFydGluZyBhZGRyZXNzLgorICAgICAqLworICBidWNrZXQgPSBnZXRfZGljdGlvbmFyeV9idWNrZXRfb2ZfcGFnZSAocGFnZV9zdGFydCk7CisgIHBhZ2UgPSAmbWVtb3J5X3BhZ2VfZGljdGlvbmFyeS5idWNrZXRzW2J1Y2tldF07CisgIHdoaWxlIChwYWdlICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHBhZ2UtPnBhZ2Vfc3RhcnQgPT0gcGFnZV9zdGFydCkKKyAgICAgICAgYnJlYWs7CisgICAgICBwcmV2aW91c19wYWdlID0gcGFnZTsKKyAgICAgIHBhZ2UgPSBwYWdlLT5uZXh0OworICAgIH0KKworICAvKiBEaWQgd2UgZmluZCBhIGRpY3Rpb25hcnkgZW50cnkgZm9yIHRoaXMgcGFnZT8gIElmIG5vdCwgdGhlbgorICAgICBhZGQgaXQgdG8gdGhlIGRpY3Rpb25hcnkgbm93LgorICAgICAqLworICBpZiAocGFnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIENyZWF0ZSBhIG5ldyBlbnRyeS4gKi8KKyAgICAgIHBhZ2UgPSAobWVtb3J5X3BhZ2VfdCAqKSB4bWFsbG9jIChzaXplb2YgKG1lbW9yeV9wYWdlX3QpKTsKKyAgICAgIHBhZ2UtPnBhZ2Vfc3RhcnQgPSBwYWdlX3N0YXJ0OworICAgICAgcGFnZS0+cmVmZXJlbmNlX2NvdW50ID0gMDsKKyAgICAgIHBhZ2UtPm5leHQgPSBOVUxMOworICAgICAgcGFnZS0+cHJldmlvdXMgPSBOVUxMOworCisgICAgICAvKiBXZSdsbCB3cml0ZS1wcm90ZWN0IHRoZSBwYWdlIG5vdywgaWYgdGhhdCdzIGFsbG93ZWQuICovCisgICAgICBwYWdlLT5vcmlnaW5hbF9wZXJtaXNzaW9ucyA9IHdyaXRlX3Byb3RlY3RfcGFnZSAocGlkLCBwYWdlX3N0YXJ0KTsKKworICAgICAgLyogQWRkIHRoZSBuZXcgZW50cnkgdG8gdGhlIGRpY3Rpb25hcnkuICovCisgICAgICBwYWdlLT5wcmV2aW91cyA9IHByZXZpb3VzX3BhZ2U7CisgICAgICBwcmV2aW91c19wYWdlLT5uZXh0ID0gcGFnZTsKKworICAgICAgbWVtb3J5X3BhZ2VfZGljdGlvbmFyeS5wYWdlX2NvdW50Kys7CisgICAgfQorCisgIHJldHVybiBwYWdlOworfQorCisKK3N0YXRpYyB2b2lkCityZW1vdmVfZGljdGlvbmFyeV9lbnRyeV9vZl9wYWdlIChwaWQsIHBhZ2UpCisgIGludCAgcGlkOworICBtZW1vcnlfcGFnZV90ICogIHBhZ2U7Cit7CisgIC8qIFJlc3RvcmUgdGhlIHBhZ2UncyBvcmlnaW5hbCBwZXJtaXNzaW9ucy4gKi8KKyAgdW53cml0ZV9wcm90ZWN0X3BhZ2UgKHBpZCwgcGFnZS0+cGFnZV9zdGFydCwgcGFnZS0+b3JpZ2luYWxfcGVybWlzc2lvbnMpOworCisgIC8qIEtpY2sgdGhlIHBhZ2Ugb3V0IG9mIHRoZSBkaWN0aW9uYXJ5LiAqLworICBpZiAocGFnZS0+cHJldmlvdXMgIT0gTlVMTCkKKyAgICBwYWdlLT5wcmV2aW91cy0+bmV4dCA9IHBhZ2UtPm5leHQ7CisgIGlmIChwYWdlLT5uZXh0ICE9IE5VTEwpCisgICAgcGFnZS0+bmV4dC0+cHJldmlvdXMgPSBwYWdlLT5wcmV2aW91czsKKworICAvKiBKdXN0IGluIGNhc2Ugc29tZW9uZSByZXRhaW5zIGEgaGFuZGxlIHRvIHRoaXMgYWZ0ZXIgaXQncyBmcmVlZC4gKi8KKyAgcGFnZS0+cGFnZV9zdGFydCA9IChDT1JFX0FERFIpIDA7CisKKyAgbWVtb3J5X3BhZ2VfZGljdGlvbmFyeS5wYWdlX2NvdW50LS07CisKKyAgZnJlZSAocGFnZSk7Cit9CisKKworc3RhdGljIHZvaWQKK2hwcGFfZW5hYmxlX3N5c2NhbGxfZXZlbnRzIChwaWQpCisgIGludCAgcGlkOworeworICBpbnQgIHR0X3N0YXR1czsKKyAgdHRldmVudF90ICB0dHJhY2VfZXZlbnRzOworCisgIC8qIEdldCB0aGUgc2V0IG9mIGV2ZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgZW5hYmxlZC4gKi8KKyAgdHRfc3RhdHVzID0gY2FsbF90dHJhY2UgKFRUX1BST0NfR0VUX0VWRU5UX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSAmdHRyYWNlX2V2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIHNpemVvZiAodHRyYWNlX2V2ZW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9OSUwpOworICBpZiAoZXJybm8pCisgICAgcGVycm9yX3dpdGhfbmFtZSAoInR0cmFjZSIpOworCisgIC8qIEFkZCBzeXNjYWxsIGV2ZW50cyB0byB0aGF0IHNldC4gKi8KKyAgdHRyYWNlX2V2ZW50cy50dGVfZXZlbnRzIHw9IFRURVZUX1NZU0NBTExfRU5UUlk7CisgIHR0cmFjZV9ldmVudHMudHRlX2V2ZW50cyB8PSBUVEVWVF9TWVNDQUxMX1JFVFVSTjsKKworICB0dF9zdGF0dXMgPSBjYWxsX3R0cmFjZSAoVFRfUFJPQ19TRVRfRVZFTlRfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpICZ0dHJhY2VfZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgc2l6ZW9mICh0dHJhY2VfZXZlbnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX05JTCk7CisgIGlmIChlcnJubykKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgidHRyYWNlIik7Cit9CisKKworc3RhdGljIHZvaWQKK2hwcGFfZGlzYWJsZV9zeXNjYWxsX2V2ZW50cyAocGlkKQorICBpbnQgIHBpZDsKK3sKKyAgaW50ICB0dF9zdGF0dXM7CisgIHR0ZXZlbnRfdCAgdHRyYWNlX2V2ZW50czsKKworICAvKiBHZXQgdGhlIHNldCBvZiBldmVudHMgdGhhdCBhcmUgY3VycmVudGx5IGVuYWJsZWQuICovCisgIHR0X3N0YXR1cyA9IGNhbGxfdHRyYWNlIChUVF9QUk9DX0dFVF9FVkVOVF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgJnR0cmFjZV9ldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBzaXplb2YgKHR0cmFjZV9ldmVudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTklMKTsKKyAgaWYgKGVycm5vKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJ0dHJhY2UiKTsKKworICAvKiBSZW1vdmUgc3lzY2FsbCBldmVudHMgZnJvbSB0aGF0IHNldC4gKi8KKyAgdHRyYWNlX2V2ZW50cy50dGVfZXZlbnRzICY9IH5UVEVWVF9TWVNDQUxMX0VOVFJZOworICB0dHJhY2VfZXZlbnRzLnR0ZV9ldmVudHMgJj0gflRURVZUX1NZU0NBTExfUkVUVVJOOworCisgIHR0X3N0YXR1cyA9IGNhbGxfdHRyYWNlIChUVF9QUk9DX1NFVF9FVkVOVF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRUUkFDRV9BUkdfVFlQRSkgJnR0cmFjZV9ldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoVFRSQUNFX0FSR19UWVBFKSBzaXplb2YgKHR0cmFjZV9ldmVudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTklMKTsKKyAgaWYgKGVycm5vKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJ0dHJhY2UiKTsKK30KKworCisvKiBUaGUgYWRkcmVzcyByYW5nZSBiZWdpbm5pbmcgd2l0aCBTVEFSVCBhbmQgZW5kaW5nIHdpdGggU1RBUlQrTEVOLTEKKyAgIChpbmNsdXNpdmUpIGlzIHRvIGJlIHdhdGNoZWQgdmlhIHBhZ2UtcHJvdGVjdGlvbiBieSBhIG5ldyB3YXRjaHBvaW50LgorICAgU2V0IHByb3RlY3Rpb24gZm9yIGFsbCBwYWdlcyB0aGF0IG92ZXJsYXAgdGhhdCByYW5nZS4KKworICAgTm90ZSB0aGF0IG91ciBjYWxsZXIgc2V0cyBUWVBFIHRvOgorICAgICAwIGZvciBhIGJwX2hhcmR3YXJlX3dhdGNocG9pbnQsCisgICAgIDEgZm9yIGEgYnBfcmVhZF93YXRjaHBvaW50LAorICAgICAyIGZvciBhIGJwX2FjY2Vzc193YXRjaHBvaW50CisKKyAgIChZZXMsIHRoaXMgaXMgaW50ZW50aW9uYWxseSAodGhvdWdoIGxvcmQgb25seSBrbm93cyB3aHkpIGRpZmZlcmVudAorICAgZnJvbSB0aGUgVFlQRSB0aGF0IGlzIHBhc3NlZCB0byBocHBhX3JlbW92ZV9od193YXRjaHBvaW50LikKKyAgICovCitpbnQKK2hwcGFfaW5zZXJ0X2h3X3dhdGNocG9pbnQgKHBpZCwgc3RhcnQsIGxlbiwgdHlwZSkKKyAgaW50ICBwaWQ7CisgIENPUkVfQUREUiAgc3RhcnQ7CisgIExPTkdFU1QgIGxlbjsKKyAgaW50ICB0eXBlOworeworICBDT1JFX0FERFIgIHBhZ2Vfc3RhcnQ7CisgIGludCAgZGljdGlvbmFyeV93YXNfZW1wdHk7CisgIGludCAgcGFnZV9zaXplOworICBpbnQgIHBhZ2VfaWQ7CisgIExPTkdFU1QgIHJhbmdlX3NpemVfaW5fcGFnZXM7CisKKyAgaWYgKHR5cGUgIT0gMCkKKyAgICBlcnJvciAoInJlYWQgb3IgYWNjZXNzIGhhcmR3YXJlIHdhdGNocG9pbnRzIG5vdCBzdXBwb3J0ZWQgb24gSFAtVVgiKTsKKworICAvKiBFeGFtaW5lIGFsbCBwYWdlcyBpbiB0aGUgYWRkcmVzcyByYW5nZS4gKi8KKyAgcmVxdWlyZV9tZW1vcnlfcGFnZV9kaWN0aW9uYXJ5ICgpOworCisgIGRpY3Rpb25hcnlfd2FzX2VtcHR5ID0gKG1lbW9yeV9wYWdlX2RpY3Rpb25hcnkucGFnZV9jb3VudCA9PSAoTE9OR0VTVCkgMCk7CisKKyAgcGFnZV9zaXplID0gbWVtb3J5X3BhZ2VfZGljdGlvbmFyeS5wYWdlX3NpemU7CisgIHBhZ2Vfc3RhcnQgPSAoc3RhcnQgLyBwYWdlX3NpemUpICogcGFnZV9zaXplOworICByYW5nZV9zaXplX2luX3BhZ2VzID0gKChMT05HRVNUKSBsZW4gKyAoTE9OR0VTVCkgcGFnZV9zaXplIC0gMSkgLyAoTE9OR0VTVCkgcGFnZV9zaXplOworCisgIGZvciAocGFnZV9pZD0wOyBwYWdlX2lkIDwgcmFuZ2Vfc2l6ZV9pbl9wYWdlczsgcGFnZV9pZCsrLCBwYWdlX3N0YXJ0Kz1wYWdlX3NpemUpCisgICAgeworICAgICAgbWVtb3J5X3BhZ2VfdCAqICBwYWdlOworCisgICAgICAvKiBUaGlzIGdldHMgdGhlIHBhZ2UgZW50ZXJlZCBpbnRvIHRoZSBkaWN0aW9uYXJ5IGlmIGl0IHdhcworICAgICAgICAgbm90IGFscmVhZHkgZW50ZXJlZC4KKyAgICAgICAgICovCisgICAgICBwYWdlID0gZ2V0X2RpY3Rpb25hcnlfZW50cnlfb2ZfcGFnZSAocGlkLCBwYWdlX3N0YXJ0KTsKKyAgICAgIHBhZ2UtPnJlZmVyZW5jZV9jb3VudCsrOworICAgIH0KKworICAvKiBPdXIgaW1wbGVtZW50YXRpb24gZGVwZW5kcyBvbiBzZWVpbmcgY2FsbHMgdG8ga2VybmVsIGNvZGUsIGZvciB0aGUKKyAgICAgZm9sbG93aW5nIHJlYXNvbi4gIEhlcmUgd2UgYXNrIHRvIGJlIG5vdGlmaWVkIG9mIHN5c2NhbGxzLgorCisgICAgIFdoZW4gYSBwcm90ZWN0ZWQgcGFnZSBpcyBhY2Nlc3NlZCBieSB1c2VyIGNvZGUsIEhQLVVYIHJhaXNlcyBhIFNJR0JVUy4KKyAgICAgRmluZS4KKworICAgICBCdXQgd2hlbiBrZXJuZWwgY29kZSBhY2Nlc3NlcyB0aGUgcGFnZSwgaXQgZG9lc24ndCBnaXZlIGEgU0lHQlVTLgorICAgICBSYXRoZXIsIHRoZSBzeXN0ZW0gY2FsbCB0aGF0IHRvdWNoZWQgdGhlIHBhZ2UgZmFpbHMsIHdpdGggZXJybm89RUZBVUxULgorICAgICBOb3QgZ29vZCBmb3IgdXMuCisKKyAgICAgV2UgY291bGQgYWNjb21vZGF0ZSB0aGlzICJmZWF0dXJlIiBieSBhc2tpbmcgdG8gYmUgbm90aWZpZWQgb2Ygc3lzY2FsbAorICAgICBlbnRyaWVzICYgZXhpdHM7IHVwb24gZ2V0dGluZyBhbiBlbnRyeSBldmVudCwgZGlzYWJsaW5nIHBhZ2UtcHJvdGVjdGlvbnM7CisgICAgIHVwb24gZ2V0dGluZyBhbiBleGl0IGV2ZW50LCByZWVuYWJsaW5nIHBhZ2UtcHJvdGVjdGlvbnMgYW5kIHRoZW4gY2hlY2tpbmcKKyAgICAgaWYgYW55IHdhdGNocG9pbnRzIHRyaWdnZXJlZC4KKworICAgICBIb3dldmVyLCB0aGlzIHR1cm5zIG91dCB0byBiZSBhIHJlYWwgcGVyZm9ybWFuY2UgbG9zZXIuICBzeXNjYWxscyBhcmUKKyAgICAgdXN1YWxseSBhIGZyZXF1ZW50IG9jY3VycmVuY2UuICBIYXZpbmcgdG8gdW5wcm90ZWN0LXJlcHJvdGVjdCBhbGwgd2F0Y2hlZAorICAgICBwYWdlcywgYW5kIGFsc28gdG8gdGhlbiByZWFkIGFsbCB3YXRjaGVkIG1lbW9yeSBsb2NhdGlvbnMgYW5kIGNvbXBhcmUgZm9yCisgICAgIHRyaWdnZXJzLCBjYW4gYmUgcXVpdGUgZXhwZW5zaXZlLgorCisgICAgIEluc3RlYWQsIHdlJ2xsIG9ubHkgYXNrIHRvIGJlIG5vdGlmaWVkIG9mIHN5c2NhbGwgZXhpdHMuICBXaGVuIHdlIGdldAorICAgICBvbmUsIHdlJ2xsIGNoZWNrIHdoZXRoZXIgZXJybm8gaXMgc2V0LiAgSWYgbm90LCBvciBpZiBpdCdzIG5vdCBFRkFVTFQsCisgICAgIHdlIGNhbiBqdXN0IGNvbnRpbnVlIHRoZSBpbmZlcmlvci4KKworICAgICBJZiBlcnJubyBpcyBzZXQgdXBvbiBzeXNjYWxsIGV4aXQgdG8gRUZBVUxULCB3ZSBtdXN0IHBlcmZvcm0gc29tZSBmYWlybHkKKyAgICAgaGFja2lzaCBzdHVmZiB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZmFpbHVyZSByZWFsbHkgd2FzIGR1ZSB0byBhCisgICAgIHBhZ2UtcHJvdGVjdCB0cmFwIG9uIGEgd2F0Y2hlZCBsb2NhdGlvbi4KKyAgICAgKi8KKyAgaWYgKGRpY3Rpb25hcnlfd2FzX2VtcHR5KQorICAgIGhwcGFfZW5hYmxlX3N5c2NhbGxfZXZlbnRzIChwaWQpOworCisgIHJldHVybiAxOworfQorCisKKy8qIFRoZSBhZGRyZXNzIHJhbmdlIGJlZ2lubmluZyB3aXRoIFNUQVJUIGFuZCBlbmRpbmcgd2l0aCBTVEFSVCtMRU4tMQorICAgKGluY2x1c2l2ZSkgd2FzIGJlaW5nIHdhdGNoZWQgdmlhIHBhZ2UtcHJvdGVjdGlvbiBieSBhIHdhdGNocG9pbnQKKyAgIHdoaWNoIGhhcyBiZWVuIHJlbW92ZWQuICBSZW1vdmUgcHJvdGVjdGlvbiBmb3IgYWxsIHBhZ2VzIHRoYXQKKyAgIG92ZXJsYXAgdGhhdCByYW5nZSwgd2hpY2ggYXJlIG5vdCBhbHNvIGJlaW5nIHdhdGNoZWQgYnkgb3RoZXIKKyAgIHdhdGNocG9pbnRzLgorICAgKi8KK2ludAoraHBwYV9yZW1vdmVfaHdfd2F0Y2hwb2ludCAocGlkLCBzdGFydCwgbGVuLCB0eXBlKQorICBpbnQgIHBpZDsKKyAgQ09SRV9BRERSICBzdGFydDsKKyAgTE9OR0VTVCAgbGVuOworICBlbnVtIGJwdHlwZSAgdHlwZTsKK3sKKyAgQ09SRV9BRERSICBwYWdlX3N0YXJ0OworICBpbnQgIGRpY3Rpb25hcnlfaXNfZW1wdHk7CisgIGludCAgcGFnZV9zaXplOworICBpbnQgIHBhZ2VfaWQ7CisgIExPTkdFU1QgIHJhbmdlX3NpemVfaW5fcGFnZXM7CisKKyAgaWYgKHR5cGUgIT0gMCkKKyAgICBlcnJvciAoInJlYWQgb3IgYWNjZXNzIGhhcmR3YXJlIHdhdGNocG9pbnRzIG5vdCBzdXBwb3J0ZWQgb24gSFAtVVgiKTsKKworICAvKiBFeGFtaW5lIGFsbCBwYWdlcyBpbiB0aGUgYWRkcmVzcyByYW5nZS4gKi8KKyAgcmVxdWlyZV9tZW1vcnlfcGFnZV9kaWN0aW9uYXJ5ICgpOworCisgIHBhZ2Vfc2l6ZSA9IG1lbW9yeV9wYWdlX2RpY3Rpb25hcnkucGFnZV9zaXplOworICBwYWdlX3N0YXJ0ID0gKHN0YXJ0IC8gcGFnZV9zaXplKSAqIHBhZ2Vfc2l6ZTsKKyAgcmFuZ2Vfc2l6ZV9pbl9wYWdlcyA9ICgoTE9OR0VTVCkgbGVuICsgKExPTkdFU1QpIHBhZ2Vfc2l6ZSAtIDEpIC8gKExPTkdFU1QpIHBhZ2Vfc2l6ZTsKKworICBmb3IgKHBhZ2VfaWQ9MDsgcGFnZV9pZCA8IHJhbmdlX3NpemVfaW5fcGFnZXM7IHBhZ2VfaWQrKywgcGFnZV9zdGFydCs9cGFnZV9zaXplKQorICAgIHsKKyAgICAgIG1lbW9yeV9wYWdlX3QgKiAgcGFnZTsKKworICAgICAgcGFnZSA9IGdldF9kaWN0aW9uYXJ5X2VudHJ5X29mX3BhZ2UgKHBpZCwgcGFnZV9zdGFydCk7CisgICAgICBwYWdlLT5yZWZlcmVuY2VfY291bnQtLTsKKworICAgICAgLyogV2FzIHRoaXMgdGhlIGxhc3QgcmVmZXJlbmNlIG9mIHRoaXMgcGFnZT8gIElmIHNvLCB0aGVuIHdlCisgICAgICAgICBtdXN0IHNjcnViIHRoZSBlbnRyeSBmcm9tIHRoZSBkaWN0aW9uYXJ5LCBhbmQgYWxzbyByZXN0b3JlCisgICAgICAgICB0aGUgcGFnZSdzIG9yaWdpbmFsIHBlcm1pc3Npb25zLgorICAgICAgICAgKi8KKyAgICAgIGlmIChwYWdlLT5yZWZlcmVuY2VfY291bnQgPT0gMCkKKyAgICAgICAgcmVtb3ZlX2RpY3Rpb25hcnlfZW50cnlfb2ZfcGFnZSAocGlkLCBwYWdlKTsKKyAgICB9CisKKyAgZGljdGlvbmFyeV9pc19lbXB0eSA9IChtZW1vcnlfcGFnZV9kaWN0aW9uYXJ5LnBhZ2VfY291bnQgPT0gKExPTkdFU1QpIDApOworCisgIC8qIElmIHdyaXRlIHByb3RlY3Rpb25zIGFyZSBjdXJyZW50bHkgZGlzYWxsb3dlZCwgdGhlbiB0aGF0IGltcGxpZXMgdGhhdAorICAgICB3YWl0X2Zvcl9pbmZlcmlvciBiZWxpZXZlcyB0aGF0IHRoZSBpbmZlcmlvciBpcyB3aXRoaW4gYSBzeXN0ZW0gY2FsbC4KKyAgICAgU2luY2Ugd2Ugd2FudCB0byBzZWUgYm90aCBzeXNjYWxsIGVudHJ5IGFuZCByZXR1cm4sIGl0J3MgY2xlYXJseSBub3QKKyAgICAgZ29vZCB0byBkaXNhYmxlIHN5c2NhbGwgZXZlbnRzIGluIHRoaXMgc3RhdGUhCisKKyAgICAgPz9yZWhyYXVlcjogWWVhaCwgaXQnZCBiZSBiZXR0ZXIgaWYgd2UgaGFkIGEgc3BlY2lmaWMgZmxhZyB0aGF0IHNhaWQsCisgICAgICJpbmZlcmlvciBpcyBiZXR3ZWVuIHN5c2NhbGwgZXZlbnRzIG5vdyIuICBPaCB3ZWxsLgorICAgICAqLworICBpZiAoZGljdGlvbmFyeV9pc19lbXB0eSAmJiBtZW1vcnlfcGFnZV9kaWN0aW9uYXJ5LnBhZ2VfcHJvdGVjdGlvbnNfYWxsb3dlZCkKKyAgICBocHBhX2Rpc2FibGVfc3lzY2FsbF9ldmVudHMgKHBpZCk7CisKKyAgcmV0dXJuIDE7Cit9CisKKworLyogQ291bGQgd2UgaW1wbGVtZW50IGEgd2F0Y2hwb2ludCBvZiB0aGlzIHR5cGUgdmlhIG91ciBhdmFpbGFibGUKKyAgIGhhcmR3YXJlIHN1cHBvcnQ/CisKKyAgIFRoaXMgcXVlcnkgZG9lcyBub3QgY29uc2lkZXIgd2hldGhlciBhIHBhcnRpY3VsYXIgYWRkcmVzcyByYW5nZQorICAgY291bGQgYmUgc28gd2F0Y2hlZCwgYnV0IGp1c3Qgd2hldGhlciBzdXBwb3J0IGlzIGdlbmVyYWxseSBhdmFpbGFibGUKKyAgIGZvciBzdWNoIHRoaW5ncy4gIFNlZSBocHBhX3JhbmdlX3Byb2ZpdGFibGVfZm9yX2h3X3dhdGNocG9pbnQgZm9yIGEKKyAgIHF1ZXJ5IHRoYXQgYW5zd2VycyB3aGV0aGVyIGEgcGFydGljdWxhciByYW5nZSBzaG91bGQgYmUgd2F0Y2hlZCB2aWEKKyAgIGhhcmR3YXJlIHN1cHBvcnQuCisgICAqLworaW50CitocHBhX2Nhbl91c2VfaHdfd2F0Y2hwb2ludCAodHlwZSwgY250LCBvdCkKKyAgZW51bSBicHR5cGUgIHR5cGU7CisgIGludCAgY250OworICBlbnVtIGJwdHlwZSAgb3Q7Cit7CisgIHJldHVybiAodHlwZSA9PSBicF9oYXJkd2FyZV93YXRjaHBvaW50KTsKK30KKworCisvKiBBc3N1bWluZyB3ZSBjb3VsZCBzZXQgYSBoYXJkd2FyZSB3YXRjaHBvaW50IG9uIHRoaXMgYWRkcmVzcywgZG8KKyAgIHdlIHRoaW5rIGl0IHdvdWxkIGJlIHByb2ZpdGFibGUgKCJhIGdvb2QgaWRlYSIpIHRvIGRvIHNvPyAgSWYgbm90LAorICAgd2UgY2FuIGFsd2F5cyBzZXQgYSByZWd1bGFyIChha2Egc2luZ2xlLXN0ZXAgJiB0ZXN0KSB3YXRjaHBvaW50CisgICBvbiB0aGUgYWRkcmVzcy4uLgorICAgKi8KK2ludAoraHBwYV9yYW5nZV9wcm9maXRhYmxlX2Zvcl9od193YXRjaHBvaW50IChwaWQsIHN0YXJ0LCBsZW4pCisgIGludCAgcGlkOworICBDT1JFX0FERFIgIHN0YXJ0OworICBMT05HRVNUICBsZW47Cit7CisgIGludCAgcmFuZ2VfaXNfc3RhY2tfYmFzZWQ7CisgIGludCAgcmFuZ2VfaXNfYWNjZXNzaWJsZTsKKyAgQ09SRV9BRERSICBwYWdlX3N0YXJ0OworICBpbnQgIHBhZ2Vfc2l6ZTsKKyAgaW50ICBwYWdlOworICBMT05HRVNUICByYW5nZV9zaXplX2luX3BhZ2VzOworCisgIC8qID8/cmVocmF1ZXI6IEZvciBub3csIHNheSB0aGF0IGFsbCBhZGRyZXNzZXMgYXJlIHBvdGVudGlhbGx5CisgICAgIHByb2ZpdGFibGUuICBQb3NzaWJseSBsYXRlciB3ZSdsbCB3YW50IHRvIHRlc3QgdGhlIGFkZHJlc3MKKyAgICAgZm9yICJzdGFja25lc3MiPworICAgICAqLworICByYW5nZV9pc19zdGFja19iYXNlZCA9IDA7CisKKyAgLyogSWYgYW55IHBhZ2UgaW4gdGhlIHJhbmdlIGlzIGluYWNjZXNzaWJsZSwgdGhlbiB3ZSBjYW5ub3QKKyAgICAgcmVhbGx5IHVzZSBoYXJkd2FyZSB3YXRjaHBvaW50aW5nLCBldmVuIHRob3VnaCBvdXIgY2xpZW50CisgICAgIHRoaW5rcyB3ZSBjYW4uICBJbiB0aGF0IGNhc2UsIGl0J3MgYWN0dWFsbHkgYW4gZXJyb3IgdG8KKyAgICAgYXR0ZW1wdCB0byB1c2UgaHcgd2F0Y2hwb2ludHMsIHNvIHdlJ2xsIHRlbGwgb3VyIGNsaWVudAorICAgICB0aGF0IHRoZSByYW5nZSBpcyAidW5wcm9maXRhYmxlIiwgYW5kIGhvcGUgdGhhdCB0aGV5IGxpc3Rlbi4uLgorICAgICAqLworICByYW5nZV9pc19hY2Nlc3NpYmxlID0gMTsgIC8qIFVudGlsIHByb3ZlbiBvdGhlcndpc2UuICovCisKKyAgLyogRXhhbWluZSBhbGwgcGFnZXMgaW4gdGhlIGFkZHJlc3MgcmFuZ2UuICovCisgIGVycm5vID0gMDsKKyAgcGFnZV9zaXplID0gc3lzY29uZiAoX1NDX1BBR0VfU0laRSk7CisKKyAgLyogSWYgd2UgY2FuJ3QgZGV0ZXJtaW5lIHBhZ2Ugc2l6ZSwgd2UncmUgaG9zZWQuICBUZWxsIG91cgorICAgICBjbGllbnQgaXQncyB1bnByb2ZpdGFibGUgdG8gdXNlIGh3IHdhdGNocG9pbnRzIGZvciB0aGlzCisgICAgIHJhbmdlLgorICAgICAqLworICBpZiAoZXJybm8gfHwgKHBhZ2Vfc2l6ZSA8PSAwKSkKKyAgICB7CisgICAgICBlcnJubyA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcGFnZV9zdGFydCA9IChzdGFydCAvIHBhZ2Vfc2l6ZSkgKiBwYWdlX3NpemU7CisgIHJhbmdlX3NpemVfaW5fcGFnZXMgPSBsZW4gLyAoTE9OR0VTVClwYWdlX3NpemU7CisKKyAgZm9yIChwYWdlPTA7IHBhZ2UgPCByYW5nZV9zaXplX2luX3BhZ2VzOyBwYWdlKyssIHBhZ2Vfc3RhcnQrPXBhZ2Vfc2l6ZSkKKyAgICB7CisgICAgICBpbnQgIHR0X3N0YXR1czsKKyAgICAgIGludCAgcGFnZV9wZXJtaXNzaW9uczsKKworICAgICAgLyogSXMgdGhpcyBwYWdlIGFjY2Vzc2libGU/ICovCisgICAgICBlcnJubyA9IDA7CisgICAgICB0dF9zdGF0dXMgPSBjYWxsX3R0cmFjZSAoVFRfUFJPQ19HRVRfTVBST1RFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpIHBhZ2Vfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTklMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUVFJBQ0VfQVJHX1RZUEUpICZwYWdlX3Blcm1pc3Npb25zKTsKKyAgICAgIGlmIChlcnJubyB8fCAodHRfc3RhdHVzIDwgMCkpCisgICAgICAgIHsKKyAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgcmFuZ2VfaXNfYWNjZXNzaWJsZSA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgLyogWWVzLCBnbyBmb3IgYW5vdGhlci4uLiAqLworICAgIH0KKworICByZXR1cm4gKCEgcmFuZ2VfaXNfc3RhY2tfYmFzZWQgJiYgcmFuZ2VfaXNfYWNjZXNzaWJsZSk7Cit9CisKKworY2hhciAqCitocHBhX3BpZF9vcl90aWRfdG9fc3RyIChpZCkKKyAgcGlkX3QgIGlkOworeworICBzdGF0aWMgY2hhciAgYnVmWzEwMF07IC8qIFN0YXRpYyBiZWNhdXNlIGFkZHJlc3MgcmV0dXJuZWQuICovCisKKyAgLyogRG9lcyB0aGlzIGFwcGVhciB0byBiZSBhIHByb2Nlc3M/ICBJZiBzbywgcHJpbnQgaXQgdGhhdCB3YXkuICovCisgIGlmIChpc19wcm9jZXNzX2lkIChpZCkpCisgICAgcmV0dXJuIGhwcGFfcGlkX3RvX3N0ciAoaWQpOworCisgIC8qIEVsc2UsIHByaW50IGJvdGggdGhlIEdEQiB0aHJlYWQgbnVtYmVyIGFuZCB0aGUgc3lzdGVtIHRocmVhZCBpZC4gKi8KKyAgc3ByaW50ZiAoYnVmLCAidGhyZWFkICVkICgiLCBwaWRfdG9fdGhyZWFkX2lkIChpZCkpOworICBzdHJjYXQgKGJ1ZiwgaHBwYV90aWRfdG9fc3RyIChpZCkpOworICBzdHJjYXQgKGJ1ZiwgIilcMCIpOworCisgIHJldHVybiBidWY7Cit9CisKKwwKKy8qIElmIHRoZSBjdXJyZW50IHBpZCBpcyBub3QgdGhlIHBpZCB0aGlzIG1vZHVsZSByZXBvcnRlZAorICogZnJvbSAicHRyYWNlX3dhaXQiIHdpdGggdGhlIG1vc3QgcmVjZW50IGV2ZW50LCB0aGVuIHRoZQorICogdXNlciBoYXMgc3dpdGNoZWQgdGhyZWFkcy4KKyAqCisgKiBJZiB0aGUgbGFzdCByZXBvcnRlZCBldmVudCB3YXMgYSBicmVha3BvaW50LCB0aGVuIHJldHVybgorICogdGhlIG9sZCB0aHJlYWQgaWQsIGVsc2UgcmV0dXJuIDAuCisgKi8KK3BpZF90IAoraHBwYV9zd2l0Y2hlZF90aHJlYWRzKCBnZGJfcGlkICkKKyAgcGlkX3QgZ2RiX3BpZDsKK3sKKyAgaWYoIGdkYl9waWQgPT0gb2xkX2dkYl9waWQgKSB7CisgICAgICAvKgorICAgICAgICogQ29yZSBnZGIgaXMgd29ya2luZyB3aXRoIHRoZSBzYW1lIHBpZCB0aGF0IGl0CisgICAgICAgKiB3YXMgYmVmb3JlIHdlIHJlcG9ydGVkIHRoZSBsYXN0IGV2ZW50LiAgVGhpcworICAgICAgICogaXMgb2s6IGUuZy4gd2UgcmVwb3J0ZWQgaGl0dGluZyBhIHRocmVhZC1zcGVjaWZpYworICAgICAgICogYnJlYWtwb2ludCwgYnV0IHdlIHdlcmUgcmVwb3J0aW5nIHRoZSB3cm9uZworICAgICAgICogdGhyZWFkLCBzbyB0aGUgY29yZSBqdXN0IGlnbm9yZWQgdGhlIGV2ZW50LgorICAgICAgICoKKyAgICAgICAqIE5vIHRocmVhZCBzd2l0Y2ggaGFzIGhhcHBlbmVkLgorICAgICAgICovCisgICAgICByZXR1cm4gKHBpZF90KSAwOworICB9CisgIGVsc2UgaWYoIGdkYl9waWQgPT0gcmVwb3J0ZWRfcGlkICkgeworICAgICAgLyoKKyAgICAgICAqIENvcmUgZ2RiIGlzIHdvcmtpbmcgd2l0aCB0aGUgcGlkIHdlIHJlcG9ydGVkLCBzbworICAgICAgICogYW55IGNvbnRpbnVlIG9yIHN0ZXAgd2lsbCBiZSBhYmxlIHRvIGZpZ3VyZSBvdXQKKyAgICAgICAqIHRoYXQgaXQgbmVlZHMgdG8gc3RlcCBvdmVyIGFueSBoaXQgYnJlYWtwb2ludHMKKyAgICAgICAqIHdpdGhvdXQgb3VyIChpLmUuIFBSRVBBUkVfVE9fUFJPQ0VFRCdzKSBoZWxwLgorICAgICAgICovCisgICAgICByZXR1cm4gKHBpZF90KSAwOworICB9CisgIGVsc2UgaWYoICFyZXBvcnRlZF9icHQgKSB7CisgICAgICAgLyoKKyAgICAgICAgKiBUaGUgY29yZSBzd2l0Y2hlZCwgYnV0IHdlIGRpZG4ndCBqdXN0IHJlcG9ydCBhCisgICAgICAgICogYnJlYWtwb2ludCwgc28gdGhlcmUncyBubyBqdXN0LWhpdCBicmVha3BvaW50CisgICAgICAgICogaW5zdHJ1Y3Rpb24gYXQgInJlcG9ydGVkX3BpZCIncyBQQywgYW5kIHRodXMgdGhlcmUKKyAgICAgICAgKiBpcyBubyBuZWVkIHRvIHN0ZXAgb3ZlciBpdC4KKyAgICAgICAgKi8KKyAgICAgIHJldHVybiAocGlkX3QpIDA7CisgIH0KKyAgZWxzZSB7CisgICAgICAgLyogVGhlcmUncyBiZWVuIGEgcmVhbCBzd2l0Y2gsIGFuZCB3ZSByZXBvcnRlZAorICAgICAgICAqIGEgaGl0IGJyZWFrcG9pbnQuICBMZXQgImhwcGFfcHJlcGFyZV90b19wcm9jZWVkIgorICAgICAgICAqIGtub3csIHNvIGl0IGNhbiBzZWUgd2hldGhlciB0aGUgYnJlYWtwb2ludCBpcworICAgICAgICAqIHN0aWxsIGFjdGl2ZS4KKyAgICAgICAgKi8KKyAgICAgICByZXR1cm4gcmVwb3J0ZWRfcGlkOworICB9CisKKyAgLyogS2VlcCBjb21waWxlciBoYXBweSB3aXRoIGFuIG9idmlvdXMgcmV0dXJuIGF0IHRoZSBlbmQuCisgICAqLworICByZXR1cm4gKHBpZF90KSAwOyAgCit9CisKK3ZvaWQKK2hwcGFfZW5zdXJlX3Zmb3JraW5nX3BhcmVudF9yZW1haW5zX3N0b3BwZWQgKHBpZCkKKyAgaW50ICBwaWQ7Cit7CisgIC8qIE5vdGhpbmcgdG8gZG8gd2hlbiB1c2luZyB0dHJhY2UuICBPbmx5IHRoZSBwdHJhY2UtYmFzZWQgaW1wbGVtZW50YXRpb24KKyAgICAgbXVzdCBkbyByZWFsIHdvcmsuCisgICAqLworfQorCisKK2ludAoraHBwYV9yZXN1bWVfZXhlY2RfdmZvcmtpbmdfY2hpbGRfdG9fZ2V0X3BhcmVudF92Zm9yayAoKQoreworICByZXR1cm4gMDsgIC8qIE5vLCB0aGUgcGFyZW50IHZmb3JrIGlzIGF2YWlsYWJsZSBub3cuICovCit9CisKKworDAordm9pZAorX2luaXRpYWxpemVfaW5mdHRyYWNlICgpCit7CisgIC8qIEluaXRpYWxpemUgdGhlIHR0cmFjZS1iYXNlZCBoYXJkd2FyZSB3YXRjaHBvaW50IGltcGxlbWVudGF0aW9uLiAqLworICBtZW1vcnlfcGFnZV9kaWN0aW9uYXJ5LnBhZ2VfY291bnQgPSAoTE9OR0VTVCkgLTE7CisgIG1lbW9yeV9wYWdlX2RpY3Rpb25hcnkucGFnZV9wcm90ZWN0aW9uc19hbGxvd2VkID0gMTsKKworICBlcnJubyA9IDA7CisgIG1lbW9yeV9wYWdlX2RpY3Rpb25hcnkucGFnZV9zaXplID0gc3lzY29uZiAoX1NDX1BBR0VfU0laRSk7CisKKyAgaWYgKGVycm5vIHx8IChtZW1vcnlfcGFnZV9kaWN0aW9uYXJ5LnBhZ2Vfc2l6ZSA8PSAwKSkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgic3lzY29uZiIpOworfQorCmRpZmYgLS1naXQgYS9nZGIvaXJpeDQtbmF0LmMgYi9nZGIvaXJpeDQtbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE2ZTExMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9pcml4NC1uYXQuYwpAQCAtMCwwICsxLDE5NSBAQAorLyogTmF0aXZlIHN1cHBvcnQgZm9yIHRoZSBTR0kgSXJpcyBydW5uaW5nIElSSVggdmVyc2lvbiA0LCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQWxlc3NhbmRybyBGb3JpbihhZkBjcy5jbXUuZWR1KSBhdCBDTVUKKyAgIGFuZCBieSBQZXIgQm90aG5lcihib3RobmVyQGNzLndpc2MuZWR1KSBhdCBVLldpc2NvbnNpbi4KKyAgIEltcGxlbWVudGVkIGZvciBJcml4IDQueCBieSBHYXJyZXR0IEEuIFdvbGxtYW4uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgorI2luY2x1ZGUgPHNldGptcC5oPgkJLyogRm9yIEpCX1hYWC4gICovCisKKy8qIFNpemUgb2YgZWxlbWVudHMgaW4gam1wYnVmICovCisKKyNkZWZpbmUgSkJfRUxFTUVOVF9TSVpFIDQKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZ3JlZ190OwkvKiB3aHkgaXNuJ3QgdGhpcyBkZWZpbmVkPyAqLworCitzdGF0aWMgdm9pZAorZmV0Y2hfY29yZV9yZWdpc3RlcnMgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBpbnQsIGludCwgQ09SRV9BRERSKSk7CisKKy8qCisgKiBTZWUgdGhlIGNvbW1lbnQgaW4gbTY4ay10ZGVwLmMgcmVnYXJkaW5nIHRoZSB1dGlsaXR5IG9mIHRoZXNlIGZ1bmN0aW9ucy4KKyAqLworCit2b2lkIAorc3VwcGx5X2dyZWdzZXQgKGdyZWdzZXRwKQorICAgICBncmVnc2V0X3QgKmdyZWdzZXRwOworeworICByZWdpc3RlciBpbnQgcmVnaTsKKyAgcmVnaXN0ZXIgZ3JlZ190ICpyZWdwID0gKGdyZWdfdCAqKShncmVnc2V0cC0+Z3BfcmVncyk7CisgIHN0YXRpYyBjaGFyIHplcm9idWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXSA9IHswfTsKKworICAvKiBGSVhNRTogc29tZXdoZXJlLCB0aGVyZSBzaG91bGQgYmUgYSAjZGVmaW5lIGZvciB0aGUgbWVhbmluZworICAgICBvZiB0aGlzIG1hZ2ljIG51bWJlciAzMjsgd2Ugc2hvdWxkIHVzZSB0aGF0LiAqLworICBmb3IocmVnaSA9IDA7IHJlZ2kgPCAzMjsgcmVnaSsrKQorICAgIHN1cHBseV9yZWdpc3RlciAocmVnaSwgKGNoYXIgKikocmVncCArIHJlZ2kpKTsKKworICBzdXBwbHlfcmVnaXN0ZXIgKFBDX1JFR05VTSwgKGNoYXIgKikmKGdyZWdzZXRwLT5ncF9wYykpOworICBzdXBwbHlfcmVnaXN0ZXIgKEhJX1JFR05VTSwgKGNoYXIgKikmKGdyZWdzZXRwLT5ncF9tZGhpKSk7CisgIHN1cHBseV9yZWdpc3RlciAoTE9fUkVHTlVNLCAoY2hhciAqKSYoZ3JlZ3NldHAtPmdwX21kbG8pKTsKKyAgc3VwcGx5X3JlZ2lzdGVyIChDQVVTRV9SRUdOVU0sIChjaGFyICopJihncmVnc2V0cC0+Z3BfY2F1c2UpKTsKKworICAvKiBGaWxsIGluYWNjZXNzaWJsZSByZWdpc3RlcnMgd2l0aCB6ZXJvLiAgKi8KKyAgc3VwcGx5X3JlZ2lzdGVyIChCQURWQUREUl9SRUdOVU0sIHplcm9idWYpOworfQorCit2b2lkCitmaWxsX2dyZWdzZXQgKGdyZWdzZXRwLCByZWdubykKKyAgICAgZ3JlZ3NldF90ICpncmVnc2V0cDsKKyAgICAgaW50IHJlZ25vOworeworICBpbnQgcmVnaTsKKyAgcmVnaXN0ZXIgZ3JlZ190ICpyZWdwID0gKGdyZWdfdCAqKShncmVnc2V0cC0+Z3BfcmVncyk7CisKKyAgLyogc2FtZSBGSVhNRSBhcyBhYm92ZSB3cnQgMzIqLworICBmb3IgKHJlZ2kgPSAwOyByZWdpIDwgMzI7IHJlZ2krKykKKyAgICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gcmVnaSkpCisgICAgICAqKHJlZ3AgKyByZWdpKSA9ICooZ3JlZ190ICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnaSldOworCisgIGlmICgocmVnbm8gPT0gLTEpIHx8IChyZWdubyA9PSBQQ19SRUdOVU0pKQorICAgIGdyZWdzZXRwLT5ncF9wYyA9ICooZ3JlZ190ICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUENfUkVHTlVNKV07CisKKyAgaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IENBVVNFX1JFR05VTSkpCisgICAgZ3JlZ3NldHAtPmdwX2NhdXNlID0gKihncmVnX3QgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChDQVVTRV9SRUdOVU0pXTsKKworICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gSElfUkVHTlVNKSkKKyAgICBncmVnc2V0cC0+Z3BfbWRoaSA9ICooZ3JlZ190ICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoSElfUkVHTlVNKV07CisKKyAgaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IExPX1JFR05VTSkpCisgICAgZ3JlZ3NldHAtPmdwX21kbG8gPSAqKGdyZWdfdCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKExPX1JFR05VTSldOworfQorCisvKgorICogTm93IHdlIGRvIHRoZSBzYW1lIHRoaW5nIGZvciBmbG9hdGluZy1wb2ludCByZWdpc3RlcnMuCisgKiBXZSBkb24ndCBib3RoZXIgdG8gY29uZGl0aW9uIG9uIEZQMF9SRUdOVU0gc2luY2UgYW55CisgKiByZWFzb25hYmxlIE1JUFMgY29uZmlndXJhdGlvbiBoYXMgYW4gUjMwMTAgaW4gaXQuCisgKgorICogQWdhaW4sIHNlZSB0aGUgY29tbWVudHMgaW4gbTY4ay10ZGVwLmMuCisgKi8KKwordm9pZAorc3VwcGx5X2ZwcmVnc2V0IChmcHJlZ3NldHApCisgICAgIGZwcmVnc2V0X3QgKmZwcmVnc2V0cDsKK3sKKyAgcmVnaXN0ZXIgaW50IHJlZ2k7CisgIHN0YXRpYyBjaGFyIHplcm9idWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXSA9IHswfTsKKworICBmb3IgKHJlZ2kgPSAwOyByZWdpIDwgMzI7IHJlZ2krKykKKyAgICBzdXBwbHlfcmVnaXN0ZXIgKEZQMF9SRUdOVU0gKyByZWdpLAorCQkgICAgIChjaGFyICopJmZwcmVnc2V0cC0+ZnBfci5mcF9yZWdzW3JlZ2ldKTsKKworICBzdXBwbHlfcmVnaXN0ZXIgKEZDUkNTX1JFR05VTSwgKGNoYXIgKikmZnByZWdzZXRwLT5mcF9jc3IpOworCisgIC8qIEZJWE1FOiBob3cgY2FuIHdlIHN1cHBseSBGQ1JJUl9SRUdOVU0/ICBTR0kgZG9lc24ndCB0ZWxsIHVzLiAqLworICBzdXBwbHlfcmVnaXN0ZXIgKEZDUklSX1JFR05VTSwgemVyb2J1Zik7Cit9CisKK3ZvaWQKK2ZpbGxfZnByZWdzZXQgKGZwcmVnc2V0cCwgcmVnbm8pCisgICAgIGZwcmVnc2V0X3QgKmZwcmVnc2V0cDsKKyAgICAgaW50IHJlZ25vOworeworICBpbnQgcmVnaTsKKyAgY2hhciAqZnJvbSwgKnRvOworCisgIGZvciAocmVnaSA9IEZQMF9SRUdOVU07IHJlZ2kgPCBGUDBfUkVHTlVNICsgMzI7IHJlZ2krKykKKyAgICB7CisgICAgICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gcmVnaSkpCisJeworCSAgZnJvbSA9IChjaGFyICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnaSldOworCSAgdG8gPSAoY2hhciAqKSAmKGZwcmVnc2V0cC0+ZnBfci5mcF9yZWdzW3JlZ2kgLSBGUDBfUkVHTlVNXSk7CisJICBtZW1jcHkodG8sIGZyb20sIFJFR0lTVEVSX1JBV19TSVpFIChyZWdpKSk7CisJfQorICAgIH0KKworICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gRkNSQ1NfUkVHTlVNKSkKKyAgICBmcHJlZ3NldHAtPmZwX2NzciA9ICoodW5zaWduZWQgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKEZDUkNTX1JFR05VTSldOworfQorCisKKy8qIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIGxvbmdqbXAgd2lsbCBsYW5kLgorICAgV2UgZXhwZWN0IHRoZSBmaXJzdCBhcmcgdG8gYmUgYSBwb2ludGVyIHRvIHRoZSBqbXBfYnVmIHN0cnVjdHVyZSBmcm9tIHdoaWNoCisgICB3ZSBleHRyYWN0IHRoZSBwYyAoSkJfUEMpIHRoYXQgd2Ugd2lsbCBsYW5kIGF0LiAgVGhlIHBjIGlzIGNvcGllZCBpbnRvIFBDLgorICAgVGhpcyByb3V0aW5lIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiAqLworCitpbnQKK2dldF9sb25nam1wX3RhcmdldCAocGMpCisgICAgIENPUkVfQUREUiAqcGM7Cit7CisgIGNoYXIgYnVmW1RBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUXTsKKyAgQ09SRV9BRERSIGpiX2FkZHI7CisKKyAgamJfYWRkciA9IHJlYWRfcmVnaXN0ZXIgKEEwX1JFR05VTSk7CisKKyAgaWYgKHRhcmdldF9yZWFkX21lbW9yeSAoamJfYWRkciArIEpCX1BDICogSkJfRUxFTUVOVF9TSVpFLCBidWYsCisJCQkgIFRBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUKSkKKyAgICByZXR1cm4gMDsKKworICAqcGMgPSBleHRyYWN0X2FkZHJlc3MgKGJ1ZiwgVEFSR0VUX1BUUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorZmV0Y2hfY29yZV9yZWdpc3RlcnMgKGNvcmVfcmVnX3NlY3QsIGNvcmVfcmVnX3NpemUsIHdoaWNoLCByZWdfYWRkcikKKyAgICAgY2hhciAqY29yZV9yZWdfc2VjdDsKKyAgICAgdW5zaWduZWQgY29yZV9yZWdfc2l6ZTsKKyAgICAgaW50IHdoaWNoOwkJCS8qIFVudXNlZCAqLworICAgICBDT1JFX0FERFIgcmVnX2FkZHI7CS8qIFVudXNlZCAqLworeworICBpZiAoY29yZV9yZWdfc2l6ZSAhPSBSRUdJU1RFUl9CWVRFUykKKyAgICB7CisgICAgICB3YXJuaW5nICgid3Jvbmcgc2l6ZSBncmVnc2V0IHN0cnVjdCBpbiBjb3JlIGZpbGUiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbWVtY3B5ICgoY2hhciAqKXJlZ2lzdGVycywgY29yZV9yZWdfc2VjdCwgY29yZV9yZWdfc2l6ZSk7Cit9CisKKwwKKy8qIFJlZ2lzdGVyIHRoYXQgd2UgYXJlIGFibGUgdG8gaGFuZGxlIGlyaXg0IGNvcmUgZmlsZSBmb3JtYXRzLgorICAgRklYTUU6IGlzIHRoaXMgcmVhbGx5IGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyPyAqLworCitzdGF0aWMgc3RydWN0IGNvcmVfZm5zIGlyaXg0X2NvcmVfZm5zID0KK3sKKyAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCisgIGZldGNoX2NvcmVfcmVnaXN0ZXJzLAorICBOVUxMCit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9jb3JlX2lyaXg0ICgpCit7CisgIGFkZF9jb3JlX2ZucyAoJmlyaXg0X2NvcmVfZm5zKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9pcml4NS1uYXQuYyBiL2dkYi9pcml4NS1uYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzM3M2E5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2lyaXg1LW5hdC5jCkBAIC0wLDAgKzEsMTM0OSBAQAorLyogTmF0aXZlIHN1cHBvcnQgZm9yIHRoZSBTR0kgSXJpcyBydW5uaW5nIElSSVggdmVyc2lvbiA1LCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5ODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTgsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQWxlc3NhbmRybyBGb3JpbihhZkBjcy5jbXUuZWR1KSBhdCBDTVUKKyAgIGFuZCBieSBQZXIgQm90aG5lcihib3RobmVyQGNzLndpc2MuZWR1KSBhdCBVLldpc2NvbnNpbi4KKyAgIEltcGxlbWVudGVkIGZvciBJcml4IDQueCBieSBHYXJyZXR0IEEuIFdvbGxtYW4uCisgICBNb2RpZmllZCBmb3IgSXJpeCA1LnggYnkgSWFuIExhbmNlIFRheWxvci4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgorI2luY2x1ZGUgPHNldGptcC5oPgkJLyogRm9yIEpCX1hYWC4gICovCisKK3N0YXRpYyB2b2lkCitmZXRjaF9jb3JlX3JlZ2lzdGVycyBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGludCwgaW50LCBDT1JFX0FERFIpKTsKKworLyogU2l6ZSBvZiBlbGVtZW50cyBpbiBqbXBidWYgKi8KKworI2RlZmluZSBKQl9FTEVNRU5UX1NJWkUgNAorCisvKgorICogU2VlIHRoZSBjb21tZW50IGluIG02OGstdGRlcC5jIHJlZ2FyZGluZyB0aGUgdXRpbGl0eSBvZiB0aGVzZSBmdW5jdGlvbnMuCisgKgorICogVGhlc2UgZGVmaW5pdGlvbnMgYXJlIGZyb20gdGhlIE1JUFMgU1ZSNCBBQkksIHNvIHRoZXkgbWF5IHdvcmsgZm9yCisgKiBhbnkgTUlQUyBTVlI0IHRhcmdldC4KKyAqLworCit2b2lkIAorc3VwcGx5X2dyZWdzZXQgKGdyZWdzZXRwKQorICAgICBncmVnc2V0X3QgKmdyZWdzZXRwOworeworICByZWdpc3RlciBpbnQgcmVnaTsKKyAgcmVnaXN0ZXIgZ3JlZ190ICpyZWdwID0gJigqZ3JlZ3NldHApWzBdOworICBpbnQgZ3JlZ29mZiA9IHNpemVvZiAoZ3JlZ190KSAtIE1JUFNfUkVHU0laRTsKKyAgc3RhdGljIGNoYXIgemVyb2J1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdID0gezB9OworCisgIGZvcihyZWdpID0gMDsgcmVnaSA8PSBDVFhfUkE7IHJlZ2krKykKKyAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ2ksIChjaGFyICopKHJlZ3AgKyByZWdpKSArIGdyZWdvZmYpOworCisgIHN1cHBseV9yZWdpc3RlciAoUENfUkVHTlVNLCAoY2hhciAqKShyZWdwICsgQ1RYX0VQQykgKyBncmVnb2ZmKTsKKyAgc3VwcGx5X3JlZ2lzdGVyIChISV9SRUdOVU0sIChjaGFyICopKHJlZ3AgKyBDVFhfTURISSkgKyBncmVnb2ZmKTsKKyAgc3VwcGx5X3JlZ2lzdGVyIChMT19SRUdOVU0sIChjaGFyICopKHJlZ3AgKyBDVFhfTURMTykgKyBncmVnb2ZmKTsKKyAgc3VwcGx5X3JlZ2lzdGVyIChDQVVTRV9SRUdOVU0sIChjaGFyICopKHJlZ3AgKyBDVFhfQ0FVU0UpICsgZ3JlZ29mZik7CisKKyAgLyogRmlsbCBpbmFjY2Vzc2libGUgcmVnaXN0ZXJzIHdpdGggemVyby4gICovCisgIHN1cHBseV9yZWdpc3RlciAoQkFEVkFERFJfUkVHTlVNLCB6ZXJvYnVmKTsKK30KKwordm9pZAorZmlsbF9ncmVnc2V0IChncmVnc2V0cCwgcmVnbm8pCisgICAgIGdyZWdzZXRfdCAqZ3JlZ3NldHA7CisgICAgIGludCByZWdubzsKK3sKKyAgaW50IHJlZ2k7CisgIHJlZ2lzdGVyIGdyZWdfdCAqcmVncCA9ICYoKmdyZWdzZXRwKVswXTsKKworICAvKiBVbmRlciBJcml4NiwgaWYgR0RCIGlzIGJ1aWx0IHdpdGggTjMyIEFCSSBhbmQgaXMgZGVidWdnaW5nIGFuIE8zMgorICAgICBleGVjdXRhYmxlLCB3ZSBoYXZlIHRvIHNpZ24gZXh0ZW5kIHRoZSByZWdpc3RlcnMgdG8gNjQgYml0cyBiZWZvcmUKKyAgICAgZmlsbGluZyBpbiB0aGUgZ3JlZ3NldCBzdHJ1Y3R1cmUuICAqLworCisgIGZvciAocmVnaSA9IDA7IHJlZ2kgPD0gQ1RYX1JBOyByZWdpKyspCisgICAgaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IHJlZ2kpKQorICAgICAgKihyZWdwICsgcmVnaSkgPQorCWV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnaSldLAorCQkJCVJFR0lTVEVSX1JBV19TSVpFIChyZWdpKSk7CisKKyAgaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IFBDX1JFR05VTSkpCisgICAgKihyZWdwICsgQ1RYX0VQQykgPQorICAgICAgZXh0cmFjdF9zaWduZWRfaW50ZWdlciAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQQ19SRUdOVU0pXSwKKwkJCSAgICAgIFJFR0lTVEVSX1JBV19TSVpFIChQQ19SRUdOVU0pKTsKKworICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gQ0FVU0VfUkVHTlVNKSkKKyAgICAqKHJlZ3AgKyBDVFhfQ0FVU0UpID0KKyAgICAgIGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoQ0FVU0VfUkVHTlVNKV0sCisJCQkgICAgICBSRUdJU1RFUl9SQVdfU0laRSAoQ0FVU0VfUkVHTlVNKSk7CisKKyAgaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IEhJX1JFR05VTSkpCisgICAgKihyZWdwICsgQ1RYX01ESEkpID0KKyAgICAgIGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoSElfUkVHTlVNKV0sCisJCQkgICAgICBSRUdJU1RFUl9SQVdfU0laRSAoSElfUkVHTlVNKSk7CisKKyAgaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IExPX1JFR05VTSkpCisgICAgKihyZWdwICsgQ1RYX01ETE8pID0KKyAgICAgIGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoTE9fUkVHTlVNKV0sCisJCQkgICAgICBSRUdJU1RFUl9SQVdfU0laRSAoTE9fUkVHTlVNKSk7Cit9CisKKy8qCisgKiBOb3cgd2UgZG8gdGhlIHNhbWUgdGhpbmcgZm9yIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVycy4KKyAqIFdlIGRvbid0IGJvdGhlciB0byBjb25kaXRpb24gb24gRlAwX1JFR05VTSBzaW5jZSBhbnkKKyAqIHJlYXNvbmFibGUgTUlQUyBjb25maWd1cmF0aW9uIGhhcyBhbiBSMzAxMCBpbiBpdC4KKyAqCisgKiBBZ2Fpbiwgc2VlIHRoZSBjb21tZW50cyBpbiBtNjhrLXRkZXAuYy4KKyAqLworCit2b2lkCitzdXBwbHlfZnByZWdzZXQgKGZwcmVnc2V0cCkKKyAgICAgZnByZWdzZXRfdCAqZnByZWdzZXRwOworeworICByZWdpc3RlciBpbnQgcmVnaTsKKyAgc3RhdGljIGNoYXIgemVyb2J1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdID0gezB9OworCisgIC8qIEZJWE1FLCB0aGlzIGlzIHdyb25nIGZvciB0aGUgTjMyIEFCSSB3aGljaCBoYXMgNjQgYml0IEZQIHJlZ3MuICovCisKKyAgZm9yIChyZWdpID0gMDsgcmVnaSA8IDMyOyByZWdpKyspCisgICAgc3VwcGx5X3JlZ2lzdGVyIChGUDBfUkVHTlVNICsgcmVnaSwKKwkJICAgICAoY2hhciAqKSZmcHJlZ3NldHAtPmZwX3IuZnBfcmVnc1tyZWdpXSk7CisKKyAgc3VwcGx5X3JlZ2lzdGVyIChGQ1JDU19SRUdOVU0sIChjaGFyICopJmZwcmVnc2V0cC0+ZnBfY3NyKTsKKworICAvKiBGSVhNRTogaG93IGNhbiB3ZSBzdXBwbHkgRkNSSVJfUkVHTlVNPyAgU0dJIGRvZXNuJ3QgdGVsbCB1cy4gKi8KKyAgc3VwcGx5X3JlZ2lzdGVyIChGQ1JJUl9SRUdOVU0sIHplcm9idWYpOworfQorCit2b2lkCitmaWxsX2ZwcmVnc2V0IChmcHJlZ3NldHAsIHJlZ25vKQorICAgICBmcHJlZ3NldF90ICpmcHJlZ3NldHA7CisgICAgIGludCByZWdubzsKK3sKKyAgaW50IHJlZ2k7CisgIGNoYXIgKmZyb20sICp0bzsKKworICAvKiBGSVhNRSwgdGhpcyBpcyB3cm9uZyBmb3IgdGhlIE4zMiBBQkkgd2hpY2ggaGFzIDY0IGJpdCBGUCByZWdzLiAqLworCisgIGZvciAocmVnaSA9IEZQMF9SRUdOVU07IHJlZ2kgPCBGUDBfUkVHTlVNICsgMzI7IHJlZ2krKykKKyAgICB7CisgICAgICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gcmVnaSkpCisJeworCSAgZnJvbSA9IChjaGFyICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnaSldOworCSAgdG8gPSAoY2hhciAqKSAmKGZwcmVnc2V0cC0+ZnBfci5mcF9yZWdzW3JlZ2kgLSBGUDBfUkVHTlVNXSk7CisJICBtZW1jcHkodG8sIGZyb20sIFJFR0lTVEVSX1JBV19TSVpFIChyZWdpKSk7CisJfQorICAgIH0KKworICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gRkNSQ1NfUkVHTlVNKSkKKyAgICBmcHJlZ3NldHAtPmZwX2NzciA9ICoodW5zaWduZWQgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKEZDUkNTX1JFR05VTSldOworfQorCisKKy8qIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIGxvbmdqbXAgd2lsbCBsYW5kLgorICAgV2UgZXhwZWN0IHRoZSBmaXJzdCBhcmcgdG8gYmUgYSBwb2ludGVyIHRvIHRoZSBqbXBfYnVmIHN0cnVjdHVyZSBmcm9tIHdoaWNoCisgICB3ZSBleHRyYWN0IHRoZSBwYyAoSkJfUEMpIHRoYXQgd2Ugd2lsbCBsYW5kIGF0LiAgVGhlIHBjIGlzIGNvcGllZCBpbnRvIFBDLgorICAgVGhpcyByb3V0aW5lIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiAqLworCitpbnQKK2dldF9sb25nam1wX3RhcmdldCAocGMpCisgICAgIENPUkVfQUREUiAqcGM7Cit7CisgIGNoYXIgYnVmW1RBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUXTsKKyAgQ09SRV9BRERSIGpiX2FkZHI7CisKKyAgamJfYWRkciA9IHJlYWRfcmVnaXN0ZXIgKEEwX1JFR05VTSk7CisKKyAgaWYgKHRhcmdldF9yZWFkX21lbW9yeSAoamJfYWRkciArIEpCX1BDICogSkJfRUxFTUVOVF9TSVpFLCBidWYsCisJCQkgIFRBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUKSkKKyAgICByZXR1cm4gMDsKKworICAqcGMgPSBleHRyYWN0X2FkZHJlc3MgKGJ1ZiwgVEFSR0VUX1BUUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorZmV0Y2hfY29yZV9yZWdpc3RlcnMgKGNvcmVfcmVnX3NlY3QsIGNvcmVfcmVnX3NpemUsIHdoaWNoLCByZWdfYWRkcikKKyAgICAgY2hhciAqY29yZV9yZWdfc2VjdDsKKyAgICAgdW5zaWduZWQgY29yZV9yZWdfc2l6ZTsKKyAgICAgaW50IHdoaWNoOwkJCS8qIFVudXNlZCAqLworICAgICBDT1JFX0FERFIgcmVnX2FkZHI7CS8qIFVudXNlZCAqLworeworICBpZiAoY29yZV9yZWdfc2l6ZSA9PSBSRUdJU1RFUl9CWVRFUykKKyAgICB7CisgICAgICBtZW1jcHkgKChjaGFyICopcmVnaXN0ZXJzLCBjb3JlX3JlZ19zZWN0LCBjb3JlX3JlZ19zaXplKTsKKyAgICB9CisgIGVsc2UgaWYgKE1JUFNfUkVHU0laRSA9PSA0ICYmCisJICAgY29yZV9yZWdfc2l6ZSA9PSAoMiAqIE1JUFNfUkVHU0laRSkgKiBOVU1fUkVHUykKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIGEgY29yZSBmaWxlIGZyb20gYSBOMzIgZXhlY3V0YWJsZSwgNjQgYml0cyBhcmUgc2F2ZWQKKwkgZm9yIGFsbCByZWdpc3RlcnMuICAqLworICAgICAgY2hhciAqc3JjcCA9IGNvcmVfcmVnX3NlY3Q7CisgICAgICBjaGFyICpkc3RwID0gcmVnaXN0ZXJzOworICAgICAgaW50IHJlZ25vOworCisgICAgICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCBOVU1fUkVHUzsgcmVnbm8rKykKKwl7CisJICBpZiAocmVnbm8gPj0gRlAwX1JFR05VTSAmJiByZWdubyA8IChGUDBfUkVHTlVNICsgMzIpKQorCSAgICB7CisJICAgICAgLyogRklYTUUsIHRoaXMgaXMgd3JvbmcsIE4zMiBoYXMgNjQgYml0IEZQIHJlZ3MsIGJ1dCBHREIKKwkJIGN1cnJlbnRseSBhc3N1bWVzIHRoYXQgdGhleSBhcmUgMzIgYml0LiAgKi8KKwkgICAgICAqZHN0cCsrID0gKnNyY3ArKzsKKwkgICAgICAqZHN0cCsrID0gKnNyY3ArKzsKKwkgICAgICAqZHN0cCsrID0gKnNyY3ArKzsKKwkgICAgICAqZHN0cCsrID0gKnNyY3ArKzsKKwkgICAgICBpZiAoUkVHSVNURVJfUkFXX1NJWkUocmVnbm8pID09IDQpCisJCXsKKwkJICAvKiBjb3B5aW5nIDQgYnl0ZXMgZnJvbSBlaWdodCBieXRlcz8KKwkJICAgICBJIGRvbid0IHNlZSBob3cgdGhpcyBjYW4gYmUgcmlnaHQuLi4gICovCisJCSAgc3JjcCArPSA0OwkKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIGNvcHkgYWxsIDggYnl0ZXMgKHNpemVvZihkb3VibGUpKSAqLworCQkgICpkc3RwKysgPSAqc3JjcCsrOworCQkgICpkc3RwKysgPSAqc3JjcCsrOworCQkgICpkc3RwKysgPSAqc3JjcCsrOworCQkgICpkc3RwKysgPSAqc3JjcCsrOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHNyY3AgKz0gNDsKKwkgICAgICAqZHN0cCsrID0gKnNyY3ArKzsKKwkgICAgICAqZHN0cCsrID0gKnNyY3ArKzsKKwkgICAgICAqZHN0cCsrID0gKnNyY3ArKzsKKwkgICAgICAqZHN0cCsrID0gKnNyY3ArKzsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3YXJuaW5nICgid3Jvbmcgc2l6ZSBncmVnc2V0IHN0cnVjdCBpbiBjb3JlIGZpbGUiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgcmVnaXN0ZXJzX2ZldGNoZWQgKCk7Cit9CisMCisvKiBJcml4IDUgdXNlcyB3aGF0IGFwcGVhcnMgdG8gYmUgYSB1bmlxdWUgZm9ybSBvZiBzaGFyZWQgbGlicmFyeQorICAgc3VwcG9ydC4gIFRoaXMgaXMgYSBjb3B5IG9mIHNvbGliLmMgbW9kaWZpZWQgZm9yIElyaXggNS4gICovCisvKiBGSVhNRTogTW9zdCBvZiB0aGlzIGNvZGUgY291bGQgYmUgbWVyZ2VkIHdpdGggb3Nmc29saWIuYyBhbmQgc29saWIuYworICAgYnkgdXNpbmcgbmV4dF9saW5rX21hcF9tZW1iZXIgYW5kIHhmZXJfbGlua19tYXBfbWVtYmVyIGluIHNvbGliLmMuICAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworLyogPG9iai5oPiBpbmNsdWRlcyA8c3ltLmg+IGFuZCA8c3ltY29uc3QuaD4sIHdoaWNoIGNhdXNlcyBjb25mbGljdHMKKyAgIHdpdGggb3VyIHZlcnNpb25zIG9mIHRob3NlIGZpbGVzIGluY2x1ZGVkIGJ5IHRtLW1pcHMuaC4gIFByZXZlbnQKKyAgIDxvYmouaD4gZnJvbSBpbmNsdWRpbmcgdGhlbSB3aXRoIHNvbWUgYXBwcm9wcmlhdGUgZGVmaW5lcy4gICovCisjZGVmaW5lIF9fU1lNX0hfXworI2RlZmluZSBfX1NZTUNPTlNUX0hfXworI2luY2x1ZGUgPG9iai5oPgorI2lmZGVmIEhBVkVfT0JKTElTVF9ICisjaW5jbHVkZSA8b2JqbGlzdC5oPgorI2VuZGlmCisKKyNpZmRlZiBORVdfT0JKX0lORk9fTUFHSUMKKyNkZWZpbmUgSEFORExFX05FV19PQkpfTElTVAorI2VuZGlmCisKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJjb21tYW5kLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJnbnUtcmVnZXguaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisKKy8qIFRoZSBzeW1ib2wgd2hpY2ggc3RhcnRzIG9mZiB0aGUgbGlzdCBvZiBzaGFyZWQgbGlicmFyaWVzLiAgKi8KKyNkZWZpbmUgREVCVUdfQkFTRSAiX19ybGRfb2JqX2hlYWQiCisKKy8qIElyaXggNi54IGludHJvZHVjZXMgYSBuZXcgdmFyaWFudCBvZiBvYmplY3QgbGlzdHMuCisgICBUbyBiZSBhYmxlIHRvIGRlYnVnIE8zMiBleGVjdXRhYmxlcyB1bmRlciBJcml4IDYsIHdlIGhhdmUgdG8gaGFuZGxlIGJvdGgKKyAgIHZhcmlhbnRzLiAgKi8KKwordHlwZWRlZiBlbnVtCit7CisgIE9CSl9MSVNUX09MRCwJCS8qIFByZSBJcml4IDYueCBvYmplY3QgbGlzdC4gICovCisgIE9CSl9MSVNUXzMyLAkJLyogMzIgQml0IEVsZjMyX09ial9JbmZvLiAgKi8KKyAgT0JKX0xJU1RfNjQJCS8qIDY0IEJpdCBFbGY2NF9PYmpfSW5mbywgRklYTUUgbm90IHlldCBpbXBsZW1lbnRlZC4gICovCit9IG9ial9saXN0X3ZhcmlhbnQ7CisKKy8qIERlZmluZSBvdXIgb3duIGxpbmtfbWFwIHN0cnVjdHVyZS4KKyAgIFRoaXMgd2lsbCBoZWxwIHRvIHNoYXJlIGNvZGUgd2l0aCBvc2Zzb2xpYi5jIGFuZCBzb2xpYi5jLiAgKi8KKworc3RydWN0IGxpbmtfbWFwIHsKKyAgb2JqX2xpc3RfdmFyaWFudCBsX3ZhcmlhbnQ7CS8qIHdoaWNoIHZhcmlhbnQgb2Ygb2JqZWN0IGxpc3QgKi8KKyAgQ09SRV9BRERSIGxfbGxhZGRyOwkJLyogYWRkciBpbiBpbmZlcmlvciBsaXN0IHdhcyByZWFkIGZyb20gKi8KKyAgQ09SRV9BRERSIGxfbmV4dDsJCS8qIGFkZHJlc3Mgb2YgbmV4dCBvYmplY3QgbGlzdCBlbnRyeSAqLworfTsKKworLyogSXJpeCA1IHNoYXJlZCBvYmplY3RzIGFyZSBwcmUtbGlua2VkIHRvIHBhcnRpY3VsYXIgYWRkcmVzc2VzCisgICBhbHRob3VnaCB0aGUgZHluYW1pYyBsaW5rZXIgbWF5IGhhdmUgdG8gcmVsb2NhdGUgdGhlbSBpZiB0aGUKKyAgIGFkZHJlc3MgcmFuZ2VzIG9mIHRoZSBsaWJyYXJpZXMgdXNlZCBieSB0aGUgbWFpbiBwcm9ncmFtIGNsYXNoLgorICAgVGhlIG9mZnNldCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBvYmplY3QKKyAgIGlzIG1hcHBlZCBhbmQgdGhlIGJpbmRpbmcgYWRkcmVzcyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLworI2RlZmluZSBMTV9PRkZTRVQoc28pICgoc28pIC0+IG9mZnNldCkKKy8qIExvYWRlZCBhZGRyZXNzIG9mIHNoYXJlZCBsaWJyYXJ5LiAgKi8KKyNkZWZpbmUgTE1fQUREUihzbykgKChzbykgLT4gbG1zdGFydCkKKworY2hhciBzaGFkb3dfY29udGVudHNbQlJFQUtQT0lOVF9NQVhdOwkvKiBTdGFzaCBvbGQgYmtwdCBhZGRyIGNvbnRlbnRzICovCisKK3N0cnVjdCBzb19saXN0IHsKKyAgc3RydWN0IHNvX2xpc3QgKm5leHQ7CQkJLyogbmV4dCBzdHJ1Y3R1cmUgaW4gbGlua2VkIGxpc3QgKi8KKyAgc3RydWN0IGxpbmtfbWFwIGxtOworICBDT1JFX0FERFIgb2Zmc2V0OwkJCS8qIHByZWxpbmsgdG8gbG9hZCBhZGRyZXNzIG9mZnNldCAqLworICBjaGFyICpzb19uYW1lOwkJCS8qIHNoYXJlZCBvYmplY3QgbGliIG5hbWUgKi8KKyAgQ09SRV9BRERSIGxtc3RhcnQ7CQkJLyogbG93ZXIgYWRkciBib3VuZCBvZiBtYXBwZWQgb2JqZWN0ICovCisgIENPUkVfQUREUiBsbWVuZDsJCQkvKiB1cHBlciBhZGRyIGJvdW5kIG9mIG1hcHBlZCBvYmplY3QgKi8KKyAgY2hhciBzeW1ib2xzX2xvYWRlZDsJCQkvKiBmbGFnOiBzeW1ib2xzIHJlYWQgaW4geWV0PyAqLworICBjaGFyIGZyb21fdHR5OwkJCS8qIGZsYWc6IHByaW50IG1zZ3M/ICovCisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOwkJLyogb2JqZmlsZSBmb3IgbG9hZGVkIGxpYiAqLworICBzdHJ1Y3Qgc2VjdGlvbl90YWJsZSAqc2VjdGlvbnM7CisgIHN0cnVjdCBzZWN0aW9uX3RhYmxlICpzZWN0aW9uc19lbmQ7CisgIHN0cnVjdCBzZWN0aW9uX3RhYmxlICp0ZXh0c2VjdGlvbjsKKyAgYmZkICphYmZkOworfTsKKworc3RhdGljIHN0cnVjdCBzb19saXN0ICpzb19saXN0X2hlYWQ7CS8qIExpc3Qgb2Yga25vd24gc2hhcmVkIG9iamVjdHMgKi8KK3N0YXRpYyBDT1JFX0FERFIgZGVidWdfYmFzZTsJCS8qIEJhc2Ugb2YgZHluYW1pYyBsaW5rZXIgc3RydWN0dXJlcyAqLworc3RhdGljIENPUkVfQUREUiBicmVha3BvaW50X2FkZHI7CS8qIEFkZHJlc3Mgd2hlcmUgZW5kIGJrcHQgaXMgc2V0ICovCisKKy8qIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQKK3NoYXJlZGxpYnJhcnlfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgaW50CitlbmFibGVfYnJlYWsgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgaW50CitkaXNhYmxlX2JyZWFrIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQKK2luZm9fc2hhcmVkbGlicmFyeV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyBpbnQKK3N5bWJvbF9hZGRfc3R1YiBQQVJBTVMgKChjaGFyICopKTsKKworc3RhdGljIHN0cnVjdCBzb19saXN0ICoKK2ZpbmRfc29saWIgUEFSQU1TICgoc3RydWN0IHNvX2xpc3QgKikpOworCitzdGF0aWMgc3RydWN0IGxpbmtfbWFwICoKK2ZpcnN0X2xpbmtfbWFwX21lbWJlciBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyBzdHJ1Y3QgbGlua19tYXAgKgorbmV4dF9saW5rX21hcF9tZW1iZXIgUEFSQU1TICgoc3RydWN0IHNvX2xpc3QgKikpOworCitzdGF0aWMgdm9pZAoreGZlcl9saW5rX21hcF9tZW1iZXIgUEFSQU1TICgoc3RydWN0IHNvX2xpc3QgKiwgc3RydWN0IGxpbmtfbWFwICopKTsKKworc3RhdGljIENPUkVfQUREUgorbG9jYXRlX2Jhc2UgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgaW50Citzb2xpYl9tYXBfc2VjdGlvbnMgUEFSQU1TICgoY2hhciAqKSk7CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlzb2xpYl9tYXBfc2VjdGlvbnMgLS0gb3BlbiBiZmQgYW5kIGJ1aWxkIHNlY3Rpb25zIGZvciBzaGFyZWQgbGliCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgaW50IHNvbGliX21hcF9zZWN0aW9ucyAoc3RydWN0IHNvX2xpc3QgKnNvKQorCitERVNDUklQVElPTgorCisJR2l2ZW4gYSBwb2ludGVyIHRvIG9uZSBvZiB0aGUgc2hhcmVkIG9iamVjdHMgaW4gb3VyIGxpc3QKKwlvZiBtYXBwZWQgb2JqZWN0cywgdXNlIHRoZSByZWNvcmRlZCBuYW1lIHRvIG9wZW4gYSBiZmQKKwlkZXNjcmlwdG9yIGZvciB0aGUgb2JqZWN0LCBidWlsZCBhIHNlY3Rpb24gdGFibGUsIGFuZCB0aGVuCisJcmVsb2NhdGUgYWxsIHRoZSBzZWN0aW9uIGFkZHJlc3NlcyBieSB0aGUgYmFzZSBhZGRyZXNzIGF0CisJd2hpY2ggdGhlIHNoYXJlZCBvYmplY3Qgd2FzIG1hcHBlZC4KKworRklYTUVTCisKKwlJbiBtb3N0IChhbGw/KSBjYXNlcyB0aGUgc2hhcmVkIG9iamVjdCBmaWxlIG5hbWUgcmVjb3JkZWQgaW4gdGhlCisJZHluYW1pYyBsaW5rYWdlIHRhYmxlcyB3aWxsIGJlIGEgZnVsbHkgcXVhbGlmaWVkIHBhdGhuYW1lLiAgRm9yCisJY2FzZXMgd2hlcmUgaXQgaXNuJ3QsIGRvIHdlIHJlYWxseSBtaW1pYyB0aGUgc3lzdGVtcyBzZWFyY2gKKwltZWNoYW5pc20gY29ycmVjdGx5IGluIHRoZSBiZWxvdyBjb2RlIChwYXJ0aWN1bGFybHkgdGhlIHRpbGRlCisJZXhwYW5zaW9uIHN0dWZmPykuCisgKi8KKworc3RhdGljIGludAorc29saWJfbWFwX3NlY3Rpb25zIChhcmcpCisgICAgIGNoYXIgKmFyZzsKK3sKKyAgc3RydWN0IHNvX2xpc3QgKnNvID0gKHN0cnVjdCBzb19saXN0ICopIGFyZzsJLyogY2F0Y2hfZXJyb3JzIGJvZ29uICovCisgIGNoYXIgKmZpbGVuYW1lOworICBjaGFyICpzY3JhdGNoX3BhdGhuYW1lOworICBpbnQgc2NyYXRjaF9jaGFuOworICBzdHJ1Y3Qgc2VjdGlvbl90YWJsZSAqcDsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKyAgYmZkICphYmZkOworICAKKyAgZmlsZW5hbWUgPSB0aWxkZV9leHBhbmQgKHNvIC0+IHNvX25hbWUpOworICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKGZyZWUsIGZpbGVuYW1lKTsKKyAgCisgIHNjcmF0Y2hfY2hhbiA9IG9wZW5wIChnZXRlbnYgKCJQQVRIIiksIDEsIGZpbGVuYW1lLCBPX1JET05MWSwgMCwKKwkJCSZzY3JhdGNoX3BhdGhuYW1lKTsKKyAgaWYgKHNjcmF0Y2hfY2hhbiA8IDApCisgICAgeworICAgICAgc2NyYXRjaF9jaGFuID0gb3BlbnAgKGdldGVudiAoIkxEX0xJQlJBUllfUEFUSCIpLCAxLCBmaWxlbmFtZSwKKwkJCSAgICBPX1JET05MWSwgMCwgJnNjcmF0Y2hfcGF0aG5hbWUpOworICAgIH0KKyAgaWYgKHNjcmF0Y2hfY2hhbiA8IDApCisgICAgeworICAgICAgcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworICAgIH0KKyAgLyogTGVhdmUgc2NyYXRjaF9wYXRobmFtZSBhbGxvY2F0ZWQuICBhYmZkLT5uYW1lIHdpbGwgcG9pbnQgdG8gaXQuICAqLworCisgIGFiZmQgPSBiZmRfZmRvcGVuciAoc2NyYXRjaF9wYXRobmFtZSwgZ251dGFyZ2V0LCBzY3JhdGNoX2NoYW4pOworICBpZiAoIWFiZmQpCisgICAgeworICAgICAgY2xvc2UgKHNjcmF0Y2hfY2hhbik7CisgICAgICBlcnJvciAoIkNvdWxkIG5vdCBvcGVuIGAlcycgYXMgYW4gZXhlY3V0YWJsZSBmaWxlOiAlcyIsCisJICAgICBzY3JhdGNoX3BhdGhuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgfQorICAvKiBMZWF2ZSBiZmQgb3BlbiwgY29yZV94ZmVyX21lbW9yeSBhbmQgImluZm8gZmlsZXMiIG5lZWQgaXQuICAqLworICBzbyAtPiBhYmZkID0gYWJmZDsKKyAgYWJmZCAtPiBjYWNoZWFibGUgPSB0cnVlOworCisgIGlmICghYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkpCisgICAgeworICAgICAgZXJyb3IgKCJcIiVzXCI6IG5vdCBpbiBleGVjdXRhYmxlIGZvcm1hdDogJXMuIiwKKwkgICAgIHNjcmF0Y2hfcGF0aG5hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKyAgICB9CisgIGlmIChidWlsZF9zZWN0aW9uX3RhYmxlIChhYmZkLCAmc28gLT4gc2VjdGlvbnMsICZzbyAtPiBzZWN0aW9uc19lbmQpKQorICAgIHsKKyAgICAgIGVycm9yICgiQ2FuJ3QgZmluZCB0aGUgZmlsZSBzZWN0aW9ucyBpbiBgJXMnOiAlcyIsIAorCSAgICAgYmZkX2dldF9maWxlbmFtZSAoZXhlY19iZmQpLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgfQorCisgIGZvciAocCA9IHNvIC0+IHNlY3Rpb25zOyBwIDwgc28gLT4gc2VjdGlvbnNfZW5kOyBwKyspCisgICAgeworICAgICAgLyogUmVsb2NhdGUgdGhlIHNlY3Rpb24gYmluZGluZyBhZGRyZXNzZXMgYXMgcmVjb3JkZWQgaW4gdGhlIHNoYXJlZAorCSBvYmplY3QncyBmaWxlIGJ5IHRoZSBvZmZzZXQgdG8gZ2V0IHRoZSBhZGRyZXNzIHRvIHdoaWNoIHRoZQorCSBvYmplY3Qgd2FzIGFjdHVhbGx5IG1hcHBlZC4gICovCisgICAgICBwIC0+IGFkZHIgKz0gTE1fT0ZGU0VUIChzbyk7CisgICAgICBwIC0+IGVuZGFkZHIgKz0gTE1fT0ZGU0VUIChzbyk7CisgICAgICBzbyAtPiBsbWVuZCA9IChDT1JFX0FERFIpIG1heCAocCAtPiBlbmRhZGRyLCBzbyAtPiBsbWVuZCk7CisgICAgICBpZiAoU1RSRVEgKHAgLT4gdGhlX2JmZF9zZWN0aW9uIC0+IG5hbWUsICIudGV4dCIpKQorCXsKKwkgIHNvIC0+IHRleHRzZWN0aW9uID0gcDsKKwl9CisgICAgfQorCisgIC8qIEZyZWUgdGhlIGZpbGUgbmFtZXMsIGNsb3NlIHRoZSBmaWxlIG5vdy4gICovCisgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworCisgIHJldHVybiAoMSk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlsb2NhdGVfYmFzZSAtLSBsb2NhdGUgdGhlIGJhc2UgYWRkcmVzcyBvZiBkeW5hbWljIGxpbmtlciBzdHJ1Y3RzCisKK1NZTk9QU0lTCisKKwlDT1JFX0FERFIgbG9jYXRlX2Jhc2UgKHZvaWQpCisKK0RFU0NSSVBUSU9OCisKKwlGb3IgYm90aCB0aGUgU3VuT1MgYW5kIFNWUjQgc2hhcmVkIGxpYnJhcnkgaW1wbGVtZW50YXRpb25zLCBpZiB0aGUKKwlpbmZlcmlvciBleGVjdXRhYmxlIGhhcyBiZWVuIGxpbmtlZCBkeW5hbWljYWxseSwgdGhlcmUgaXMgYSBzaW5nbGUKKwlhZGRyZXNzIHNvbWV3aGVyZSBpbiB0aGUgaW5mZXJpb3IncyBkYXRhIHNwYWNlIHdoaWNoIGlzIHRoZSBrZXkgdG8KKwlsb2NhdGluZyBhbGwgb2YgdGhlIGR5bmFtaWMgbGlua2VyJ3MgcnVudGltZSBzdHJ1Y3R1cmVzLiAgVGhpcworCWFkZHJlc3MgaXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgZGVmaW5lZCBieSB0aGUgbWFjcm8gREVCVUdfQkFTRS4KKwlUaGUgam9iIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gZmluZCBhbmQgcmV0dXJuIHRoYXQgYWRkcmVzcywgb3IgdG8KKwlyZXR1cm4gMCBpZiB0aGVyZSBpcyBubyBzdWNoIGFkZHJlc3MgKHRoZSBleGVjdXRhYmxlIGlzIHN0YXRpY2FsbHkKKwlsaW5rZWQgZm9yIGV4YW1wbGUpLgorCisJRm9yIFN1bk9TLCB0aGUgam9iIGlzIGFsbW9zdCB0cml2aWFsLCBzaW5jZSB0aGUgZHluYW1pYyBsaW5rZXIgYW5kCisJYWxsIG9mIGl0J3Mgc3RydWN0dXJlcyBhcmUgc3RhdGljYWxseSBsaW5rZWQgdG8gdGhlIGV4ZWN1dGFibGUgYXQKKwlsaW5rIHRpbWUuICBUaHVzIHRoZSBzeW1ib2wgZm9yIHRoZSBhZGRyZXNzIHdlIGFyZSBsb29raW5nIGZvciBoYXMKKwlhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlIGZvciB0aGUgZXhlY3V0YWJsZSdzCisJb2JqZmlsZSBhdCB0aGUgdGltZSB0aGUgc3ltYm9sIGZpbGUncyBzeW1ib2xzIHdlcmUgcmVhZCwgYW5kIGFsbCB3ZQorCWhhdmUgdG8gZG8gaXMgbG9vayBpdCB1cCB0aGVyZS4gIE5vdGUgdGhhdCB3ZSBleHBsaWNpdGx5IGRvIE5PVCB3YW50CisJdG8gZmluZCB0aGUgY29waWVzIGluIHRoZSBzaGFyZWQgbGlicmFyeS4KKworCVRoZSBTVlI0IHZlcnNpb24gaXMgbXVjaCBtb3JlIGNvbXBsaWNhdGVkIGJlY2F1c2UgdGhlIGR5bmFtaWMgbGlua2VyCisJYW5kIGl0J3Mgc3RydWN0dXJlcyBhcmUgbG9jYXRlZCBpbiB0aGUgc2hhcmVkIEMgbGlicmFyeSwgd2hpY2ggZ2V0cworCXJ1biBhcyB0aGUgZXhlY3V0YWJsZSdzICJpbnRlcnByZXRlciIgYnkgdGhlIGtlcm5lbC4gIFdlIGhhdmUgdG8gZ28KKwl0byBhIGxvdCBtb3JlIHdvcmsgdG8gZGlzY292ZXIgdGhlIGFkZHJlc3Mgb2YgREVCVUdfQkFTRS4gIEJlY2F1c2UKKwlvZiB0aGlzIGNvbXBsZXhpdHksIHdlIGNhY2hlIHRoZSB2YWx1ZSB3ZSBmaW5kIGFuZCByZXR1cm4gdGhhdCB2YWx1ZQorCW9uIHN1YnNlcXVlbnQgaW52b2NhdGlvbnMuICBOb3RlIHRoZXJlIGlzIG5vIGNvcHkgaW4gdGhlIGV4ZWN1dGFibGUKKwlzeW1ib2wgdGFibGVzLgorCisJSXJpeCA1IGlzIGJhc2ljYWxseSBsaWtlIFN1bk9TLgorCisJTm90ZSB0aGF0IHdlIGNhbiBhc3N1bWUgbm90aGluZyBhYm91dCB0aGUgcHJvY2VzcyBzdGF0ZSBhdCB0aGUgdGltZQorCXdlIG5lZWQgdG8gZmluZCB0aGlzIGFkZHJlc3MuICBXZSBtYXkgYmUgc3RvcHBlZCBvbiB0aGUgZmlyc3QgaW5zdHJ1Yy0KKwl0aW9uIG9mIHRoZSBpbnRlcnByZXRlciAoQyBzaGFyZWQgbGlicmFyeSksIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBvZgorCXRoZSBleGVjdXRhYmxlIGl0c2VsZiwgb3Igc29tZXdoZXJlIGVsc2UgZW50aXJlbHkgKGlmIHdlIGF0dGFjaGVkCisJdG8gdGhlIHByb2Nlc3MgZm9yIGV4YW1wbGUpLgorCisgKi8KKworc3RhdGljIENPUkVfQUREUgorbG9jYXRlX2Jhc2UgKCkKK3sKKyAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sOworICBDT1JFX0FERFIgYWRkcmVzcyA9IDA7CisKKyAgbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoREVCVUdfQkFTRSwgTlVMTCwgc3ltZmlsZV9vYmpmaWxlKTsKKyAgaWYgKChtc3ltYm9sICE9IE5VTEwpICYmIChTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCkgIT0gMCkpCisgICAgeworICAgICAgYWRkcmVzcyA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKTsKKyAgICB9CisgIHJldHVybiAoYWRkcmVzcyk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlmaXJzdF9saW5rX21hcF9tZW1iZXIgLS0gbG9jYXRlIGZpcnN0IG1lbWJlciBpbiBkeW5hbWljIGxpbmtlcidzIG1hcAorCitTWU5PUFNJUworCisJc3RhdGljIHN0cnVjdCBsaW5rX21hcCAqZmlyc3RfbGlua19tYXBfbWVtYmVyICh2b2lkKQorCitERVNDUklQVElPTgorCisJUmVhZCBpbiBhIGNvcHkgb2YgdGhlIGZpcnN0IG1lbWJlciBpbiB0aGUgaW5mZXJpb3IncyBkeW5hbWljCisJbGluayBtYXAgZnJvbSB0aGUgaW5mZXJpb3IncyBkeW5hbWljIGxpbmtlciBzdHJ1Y3R1cmVzLCBhbmQgcmV0dXJuCisJYSBwb2ludGVyIHRvIHRoZSBsaW5rIG1hcCBkZXNjcmlwdG9yLgorKi8KKworc3RhdGljIHN0cnVjdCBsaW5rX21hcCAqCitmaXJzdF9saW5rX21hcF9tZW1iZXIgKCkKK3sKKyAgc3RydWN0IG9ial9saXN0ICpsaXN0cDsKKyAgc3RydWN0IG9ial9saXN0IGxpc3Rfb2xkOworICBzdHJ1Y3QgbGlua19tYXAgKmxtOworICBzdGF0aWMgc3RydWN0IGxpbmtfbWFwIGZpcnN0X2xtOworICBDT1JFX0FERFIgbGxhZGRyOworICBDT1JFX0FERFIgbmV4dF9sbGFkZHI7CisKKyAgLyogV2UgaGF2ZSBub3QgYWxyZWFkeSByZWFkIGluIHRoZSBkeW5hbWljIGxpbmtpbmcgc3RydWN0dXJlcworICAgICBmcm9tIHRoZSBpbmZlcmlvciwgbG9va3VwIHRoZSBhZGRyZXNzIG9mIHRoZSBiYXNlIHN0cnVjdHVyZS4gKi8KKyAgZGVidWdfYmFzZSA9IGxvY2F0ZV9iYXNlICgpOworICBpZiAoZGVidWdfYmFzZSA9PSAwKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIEdldCBhZGRyZXNzIG9mIGZpcnN0IGxpc3QgZW50cnkuICAqLworICByZWFkX21lbW9yeSAoZGVidWdfYmFzZSwgKGNoYXIgKikgJmxpc3RwLCBzaXplb2YgKHN0cnVjdCBvYmpfbGlzdCAqKSk7CisKKyAgaWYgKGxpc3RwID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogR2V0IGZpcnN0IGxpc3QgZW50cnkuICAqLworICBsbGFkZHIgPSAoQ09SRV9BRERSKSBsaXN0cDsKKyAgcmVhZF9tZW1vcnkgKGxsYWRkciwgKGNoYXIgKikgJmxpc3Rfb2xkLCBzaXplb2YgKHN0cnVjdCBvYmpfbGlzdCkpOworCisgIC8qIFRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgbGlzdCBpcyB0aGUgb2JqZWN0IGZpbGUgd2UgYXJlIGRlYnVnZ2luZywKKyAgICAgc28gc2tpcCBpdC4gICovCisgIG5leHRfbGxhZGRyID0gKENPUkVfQUREUikgbGlzdF9vbGQubmV4dDsgCisKKyNpZmRlZiBIQU5ETEVfTkVXX09CSl9MSVNUCisgIGlmIChsaXN0X29sZC5kYXRhID09IE5FV19PQkpfSU5GT19NQUdJQykKKyAgICB7CisgICAgICBFbGYzMl9PYmpfSW5mbyBsaXN0XzMyOworCisgICAgICByZWFkX21lbW9yeSAobGxhZGRyLCAoY2hhciAqKSAmbGlzdF8zMiwgc2l6ZW9mIChFbGYzMl9PYmpfSW5mbykpOworICAgICAgaWYgKGxpc3RfMzIub2lfc2l6ZSAhPSBzaXplb2YgKEVsZjMyX09ial9JbmZvKSkKKwlyZXR1cm4gTlVMTDsKKyAgICAgIG5leHRfbGxhZGRyID0gKENPUkVfQUREUikgbGlzdF8zMi5vaV9uZXh0OyAKKyAgICB9CisjZW5kaWYKKworICBpZiAobmV4dF9sbGFkZHIgPT0gMCkKKyAgICByZXR1cm4gTlVMTDsKKworICBmaXJzdF9sbS5sX2xsYWRkciA9IG5leHRfbGxhZGRyOworICBsbSA9ICZmaXJzdF9sbTsKKyAgcmV0dXJuIGxtOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJbmV4dF9saW5rX21hcF9tZW1iZXIgLS0gbG9jYXRlIG5leHQgbWVtYmVyIGluIGR5bmFtaWMgbGlua2VyJ3MgbWFwCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgc3RydWN0IGxpbmtfbWFwICpuZXh0X2xpbmtfbWFwX21lbWJlciAoc29fbGlzdF9wdHIpCisKK0RFU0NSSVBUSU9OCisKKwlSZWFkIGluIGEgY29weSBvZiB0aGUgbmV4dCBtZW1iZXIgaW4gdGhlIGluZmVyaW9yJ3MgZHluYW1pYworCWxpbmsgbWFwIGZyb20gdGhlIGluZmVyaW9yJ3MgZHluYW1pYyBsaW5rZXIgc3RydWN0dXJlcywgYW5kIHJldHVybgorCWEgcG9pbnRlciB0byB0aGUgbGluayBtYXAgZGVzY3JpcHRvci4KKyovCisKK3N0YXRpYyBzdHJ1Y3QgbGlua19tYXAgKgorbmV4dF9saW5rX21hcF9tZW1iZXIgKHNvX2xpc3RfcHRyKQorICAgICBzdHJ1Y3Qgc29fbGlzdCAqc29fbGlzdF9wdHI7Cit7CisgIHN0cnVjdCBsaW5rX21hcCAqbG0gPSAmc29fbGlzdF9wdHIgLT4gbG07CisgIENPUkVfQUREUiBuZXh0X2xsYWRkciA9IGxtIC0+IGxfbmV4dDsKKyAgc3RhdGljIHN0cnVjdCBsaW5rX21hcCBuZXh0X2xtOworCisgIGlmIChuZXh0X2xsYWRkciA9PSAwKQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgaGl0IHRoZSBlbmQgb2YgdGhlIGxpc3QsIHNvIGNoZWNrIHRvIHNlZSBpZiBhbnkgd2VyZQorCSBhZGRlZCwgYnV0IGJlIHF1aWV0IGlmIHdlIGNhbid0IHJlYWQgZnJvbSB0aGUgdGFyZ2V0IGFueSBtb3JlLiAqLworICAgICAgaW50IHN0YXR1cyA9IDA7CisKKyAgICAgIGlmIChsbSAtPiBsX3ZhcmlhbnQgPT0gT0JKX0xJU1RfT0xEKQorCXsKKwkgIHN0cnVjdCBvYmpfbGlzdCBsaXN0X29sZDsKKworCSAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChsbSAtPiBsX2xsYWRkciwKKwkJCQkgICAgICAgKGNoYXIgKikgJmxpc3Rfb2xkLAorCQkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBvYmpfbGlzdCkpOworCSAgbmV4dF9sbGFkZHIgPSAoQ09SRV9BRERSKSBsaXN0X29sZC5uZXh0OworCX0KKyNpZmRlZiBIQU5ETEVfTkVXX09CSl9MSVNUCisgICAgICBlbHNlIGlmIChsbSAtPiBsX3ZhcmlhbnQgPT0gT0JKX0xJU1RfMzIpCisJeworCSAgRWxmMzJfT2JqX0luZm8gbGlzdF8zMjsKKwkgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAobG0gLT4gbF9sbGFkZHIsCisJCQkJICAgICAgIChjaGFyICopICZsaXN0XzMyLAorCQkJCSAgICAgICBzaXplb2YgKEVsZjMyX09ial9JbmZvKSk7CisJICBuZXh0X2xsYWRkciA9IChDT1JFX0FERFIpIGxpc3RfMzIub2lfbmV4dDsKKwl9CisjZW5kaWYKKworICAgICAgaWYgKHN0YXR1cyAhPSAwIHx8IG5leHRfbGxhZGRyID09IDApCisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgIG5leHRfbG0ubF9sbGFkZHIgPSBuZXh0X2xsYWRkcjsKKyAgbG0gPSAmbmV4dF9sbTsKKyAgcmV0dXJuIGxtOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJeGZlcl9saW5rX21hcF9tZW1iZXIgLS0gc2V0IGxvY2FsIHZhcmlhYmxlcyBmcm9tIGR5bmFtaWMgbGlua2VyJ3MgbWFwCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgdm9pZCB4ZmVyX2xpbmtfbWFwX21lbWJlciAoc29fbGlzdF9wdHIsIGxtKQorCitERVNDUklQVElPTgorCisJUmVhZCBpbiBhIGNvcHkgb2YgdGhlIHJlcXVlc3RlZCBtZW1iZXIgaW4gdGhlIGluZmVyaW9yJ3MgZHluYW1pYworCWxpbmsgbWFwIGZyb20gdGhlIGluZmVyaW9yJ3MgZHluYW1pYyBsaW5rZXIgc3RydWN0dXJlcywgYW5kIGZpbGwKKwlpbiB0aGUgbmVjZXNzYXJ5IHNvX2xpc3RfcHRyIGVsZW1lbnRzLgorKi8KKworc3RhdGljIHZvaWQKK3hmZXJfbGlua19tYXBfbWVtYmVyIChzb19saXN0X3B0ciwgbG0pCisgICAgIHN0cnVjdCBzb19saXN0ICpzb19saXN0X3B0cjsKKyAgICAgc3RydWN0IGxpbmtfbWFwICpsbTsKK3sKKyAgc3RydWN0IG9ial9saXN0IGxpc3Rfb2xkOworICBDT1JFX0FERFIgbGxhZGRyID0gbG0gLT4gbF9sbGFkZHI7CisgIHN0cnVjdCBsaW5rX21hcCAqbmV3X2xtID0gJnNvX2xpc3RfcHRyIC0+IGxtOworICBpbnQgZXJyY29kZTsKKworICByZWFkX21lbW9yeSAobGxhZGRyLCAoY2hhciAqKSAmbGlzdF9vbGQsIHNpemVvZiAoc3RydWN0IG9ial9saXN0KSk7CisKKyAgbmV3X2xtIC0+IGxfdmFyaWFudCA9IE9CSl9MSVNUX09MRDsKKyAgbmV3X2xtIC0+IGxfbGxhZGRyID0gbGxhZGRyOworICBuZXdfbG0gLT4gbF9uZXh0ID0gKENPUkVfQUREUikgbGlzdF9vbGQubmV4dDsgCisKKyNpZmRlZiBIQU5ETEVfTkVXX09CSl9MSVNUCisgIGlmIChsaXN0X29sZC5kYXRhID09IE5FV19PQkpfSU5GT19NQUdJQykKKyAgICB7CisgICAgICBFbGYzMl9PYmpfSW5mbyBsaXN0XzMyOworCisgICAgICByZWFkX21lbW9yeSAobGxhZGRyLCAoY2hhciAqKSAmbGlzdF8zMiwgc2l6ZW9mIChFbGYzMl9PYmpfSW5mbykpOworICAgICAgaWYgKGxpc3RfMzIub2lfc2l6ZSAhPSBzaXplb2YgKEVsZjMyX09ial9JbmZvKSkKKwlyZXR1cm47CisgICAgICBuZXdfbG0gLT4gbF92YXJpYW50ID0gT0JKX0xJU1RfMzI7CisgICAgICBuZXdfbG0gLT4gbF9uZXh0ID0gKENPUkVfQUREUikgbGlzdF8zMi5vaV9uZXh0OyAKKworICAgICAgdGFyZ2V0X3JlYWRfc3RyaW5nICgoQ09SRV9BRERSKSBsaXN0XzMyLm9pX3BhdGhuYW1lLAorCQkJICAmc29fbGlzdF9wdHIgLT4gc29fbmFtZSwKKwkJCSAgbGlzdF8zMi5vaV9wYXRobmFtZV9sZW4gKyAxLCAmZXJyY29kZSk7CisgICAgICBpZiAoZXJyY29kZSAhPSAwKQorCW1lbW9yeV9lcnJvciAoZXJyY29kZSwgKENPUkVfQUREUikgbGlzdF8zMi5vaV9wYXRobmFtZSk7CisKKyAgICAgIExNX0FERFIgKHNvX2xpc3RfcHRyKSA9IChDT1JFX0FERFIpIGxpc3RfMzIub2lfZWhkcjsKKyAgICAgIExNX09GRlNFVCAoc29fbGlzdF9wdHIpID0KKwkoQ09SRV9BRERSKSBsaXN0XzMyLm9pX2VoZHIgLSAoQ09SRV9BRERSKSBsaXN0XzMyLm9pX29yaWdfZWhkcjsKKyAgICB9CisgIGVsc2UKKyNlbmRpZgorICAgIHsKKyNpZiBkZWZpbmVkIChfTUlQU19TSU1fTkFCSTMyKSAmJiBfTUlQU19TSU0gPT0gX01JUFNfU0lNX05BQkkzMgorICAgICAgLyogSWYgd2UgYXJlIGNvbXBpbGluZyBHREIgdW5kZXIgTjMyIEFCSSwgdGhlIGFsaWdubWVudHMgaW4KKwkgdGhlIG9iaiBzdHJ1Y3QgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSBPMzIgQUJJIGFuZCB3ZSB3aWxsIGdldAorCSB3cm9uZyB2YWx1ZXMgd2hlbiBhY2Nlc3NpbmcgdGhlIHN0cnVjdC4KKwkgQXMgYSB3b3JrYXJvdW5kIHdlIHVzZSBmaXhlZCB2YWx1ZXMgd2hpY2ggYXJlIGdvb2QgZm9yCisJIElyaXggNi4yLiAgKi8KKyAgICAgIGNoYXIgYnVmWzQzMl07CisKKyAgICAgIHJlYWRfbWVtb3J5ICgoQ09SRV9BRERSKSBsaXN0X29sZC5kYXRhLCBidWYsIHNpemVvZiAoYnVmKSk7CisKKyAgICAgIHRhcmdldF9yZWFkX3N0cmluZyAoZXh0cmFjdF9hZGRyZXNzICgmYnVmWzIzNl0sIDQpLAorCQkJICAmc29fbGlzdF9wdHIgLT4gc29fbmFtZSwKKwkJCSAgSU5UX01BWCwgJmVycmNvZGUpOworICAgICAgaWYgKGVycmNvZGUgIT0gMCkKKwltZW1vcnlfZXJyb3IgKGVycmNvZGUsIGV4dHJhY3RfYWRkcmVzcyAoJmJ1ZlsyMzZdLCA0KSk7CisKKyAgICAgIExNX0FERFIgKHNvX2xpc3RfcHRyKSA9IGV4dHJhY3RfYWRkcmVzcyAoJmJ1ZlsxOTZdLCA0KTsKKyAgICAgIExNX09GRlNFVCAoc29fbGlzdF9wdHIpID0KKwlleHRyYWN0X2FkZHJlc3MgKCZidWZbMTk2XSwgNCkgLSBleHRyYWN0X2FkZHJlc3MgKCZidWZbMjQ4XSwgNCk7CisjZWxzZQorICAgICAgc3RydWN0IG9iaiBvYmpfb2xkOworCisgICAgICByZWFkX21lbW9yeSAoKENPUkVfQUREUikgbGlzdF9vbGQuZGF0YSwgKGNoYXIgKikgJm9ial9vbGQsCisJCSAgIHNpemVvZiAoc3RydWN0IG9iaikpOworCisgICAgICB0YXJnZXRfcmVhZF9zdHJpbmcgKChDT1JFX0FERFIpIG9ial9vbGQub19wYXRoLAorCQkJICAmc29fbGlzdF9wdHIgLT4gc29fbmFtZSwKKwkJCSAgSU5UX01BWCwgJmVycmNvZGUpOworICAgICAgaWYgKGVycmNvZGUgIT0gMCkKKwltZW1vcnlfZXJyb3IgKGVycmNvZGUsIChDT1JFX0FERFIpIG9ial9vbGQub19wYXRoKTsKKworICAgICAgTE1fQUREUiAoc29fbGlzdF9wdHIpID0gKENPUkVfQUREUikgb2JqX29sZC5vX3ByYXc7CisgICAgICBMTV9PRkZTRVQgKHNvX2xpc3RfcHRyKSA9CisJKENPUkVfQUREUikgb2JqX29sZC5vX3ByYXcgLSBvYmpfb2xkLm9fYmFzZV9hZGRyZXNzOworI2VuZGlmCisgICAgfQorCisgIGNhdGNoX2Vycm9ycyAoc29saWJfbWFwX3NlY3Rpb25zLCAoY2hhciAqKSBzb19saXN0X3B0ciwKKwkJIkVycm9yIHdoaWxlIG1hcHBpbmcgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbnM6XG4iLAorCQlSRVRVUk5fTUFTS19BTEwpOworfQorCisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlmaW5kX3NvbGliIC0tIHN0ZXAgdGhyb3VnaCBsaXN0IG9mIHNoYXJlZCBvYmplY3RzCisKK1NZTk9QU0lTCisKKwlzdHJ1Y3Qgc29fbGlzdCAqZmluZF9zb2xpYiAoc3RydWN0IHNvX2xpc3QgKnNvX2xpc3RfcHRyKQorCitERVNDUklQVElPTgorCisJVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIHJvdXRpbmUgd2hpY2ggZmluZHMgdGhlIG5hbWVzIG9mIGFueQorCWxvYWRlZCAiaW1hZ2VzIiBpbiB0aGUgY3VycmVudCBwcm9jZXNzLiBUaGUgYXJndW1lbnQgaW4gbXVzdCBiZQorCU5VTEwgb24gdGhlIGZpcnN0IGNhbGwsIGFuZCB0aGVuIHRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIHBhc3NlZAorCWluIG9uIHN1YnNlcXVlbnQgY2FsbHMuIFRoaXMgcHJvdmlkZXMgdGhlIGNhcGFiaWxpdHkgdG8gInN0ZXAiIGRvd24KKwl0aGUgbGlzdCBvZiBsb2FkZWQgb2JqZWN0cy4gT24gdGhlIGxhc3Qgb2JqZWN0LCBhIE5VTEwgdmFsdWUgaXMKKwlyZXR1cm5lZC4KKyAqLworCitzdGF0aWMgc3RydWN0IHNvX2xpc3QgKgorZmluZF9zb2xpYiAoc29fbGlzdF9wdHIpCisgICAgIHN0cnVjdCBzb19saXN0ICpzb19saXN0X3B0cjsJLyogTGFzdCBsbSBvciBOVUxMIGZvciBmaXJzdCBvbmUgKi8KK3sKKyAgc3RydWN0IHNvX2xpc3QgKnNvX2xpc3RfbmV4dCA9IE5VTEw7CisgIHN0cnVjdCBsaW5rX21hcCAqbG0gPSBOVUxMOworICBzdHJ1Y3Qgc29fbGlzdCAqbmV3OworICAKKyAgaWYgKHNvX2xpc3RfcHRyID09IE5VTEwpCisgICAgeworICAgICAgLyogV2UgYXJlIHNldHRpbmcgdXAgZm9yIGEgbmV3IHNjYW4gdGhyb3VnaCB0aGUgbG9hZGVkIGltYWdlcy4gKi8KKyAgICAgIGlmICgoc29fbGlzdF9uZXh0ID0gc29fbGlzdF9oZWFkKSA9PSBOVUxMKQorCXsKKwkgIC8qIEZpbmQgdGhlIGZpcnN0IGxpbmsgbWFwIGxpc3QgbWVtYmVyLiAqLworCSAgbG0gPSBmaXJzdF9saW5rX21hcF9tZW1iZXIgKCk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgYmVlbiBjYWxsZWQgYmVmb3JlLCBhbmQgYXJlIGluIHRoZSBwcm9jZXNzIG9mIHdhbGtpbmcKKwkgdGhlIHNoYXJlZCBsaWJyYXJ5IGxpc3QuICBBZHZhbmNlIHRvIHRoZSBuZXh0IHNoYXJlZCBvYmplY3QuICovCisgICAgICBsbSA9IG5leHRfbGlua19tYXBfbWVtYmVyIChzb19saXN0X3B0cik7CisgICAgICBzb19saXN0X25leHQgPSBzb19saXN0X3B0ciAtPiBuZXh0OworICAgIH0KKyAgaWYgKChzb19saXN0X25leHQgPT0gTlVMTCkgJiYgKGxtICE9IE5VTEwpKQorICAgIHsKKyAgICAgIG5ldyA9IChzdHJ1Y3Qgc29fbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzb19saXN0KSk7CisgICAgICBtZW1zZXQgKChjaGFyICopIG5ldywgMCwgc2l6ZW9mIChzdHJ1Y3Qgc29fbGlzdCkpOworICAgICAgLyogQWRkIHRoZSBuZXcgbm9kZSBhcyB0aGUgbmV4dCBub2RlIGluIHRoZSBsaXN0LCBvciBhcyB0aGUgcm9vdAorCSBub2RlIGlmIHRoaXMgaXMgdGhlIGZpcnN0IG9uZS4gKi8KKyAgICAgIGlmIChzb19saXN0X3B0ciAhPSBOVUxMKQorCXsKKwkgIHNvX2xpc3RfcHRyIC0+IG5leHQgPSBuZXc7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHNvX2xpc3RfaGVhZCA9IG5ldzsKKwl9ICAgICAgCisgICAgICBzb19saXN0X25leHQgPSBuZXc7CisgICAgICB4ZmVyX2xpbmtfbWFwX21lbWJlciAobmV3LCBsbSk7CisgICAgfQorICByZXR1cm4gKHNvX2xpc3RfbmV4dCk7Cit9CisKKy8qIEEgc21hbGwgc3R1YiB0byBnZXQgdXMgcGFzdCB0aGUgYXJnLXBhc3NpbmcgcGluaG9sZSBvZiBjYXRjaF9lcnJvcnMuICAqLworCitzdGF0aWMgaW50CitzeW1ib2xfYWRkX3N0dWIgKGFyZykKKyAgICAgY2hhciAqYXJnOworeworICByZWdpc3RlciBzdHJ1Y3Qgc29fbGlzdCAqc28gPSAoc3RydWN0IHNvX2xpc3QgKikgYXJnOwkvKiBjYXRjaF9lcnJzIGJvZ29uICovCisgIENPUkVfQUREUiB0ZXh0X2FkZHIgPSAwOworCisgIGlmIChzbyAtPiB0ZXh0c2VjdGlvbikKKyAgICB0ZXh0X2FkZHIgPSBzbyAtPiB0ZXh0c2VjdGlvbiAtPiBhZGRyOworICBlbHNlIGlmIChzbyAtPiBhYmZkICE9IE5VTEwpCisgICAgeworICAgICAgYXNlY3Rpb24gKmxvd2VzdF9zZWN0OworCisgICAgICAvKiBJZiB3ZSBkaWRuJ3QgZmluZCBhIG1hcHBlZCBub24gemVybyBzaXplZCAudGV4dCBzZWN0aW9uLCBzZXQgdXAKKwkgdGV4dF9hZGRyIHNvIHRoYXQgdGhlIHJlbG9jYXRpb24gaW4gc3ltYm9sX2ZpbGVfYWRkIGRvZXMgbm8gaGFybS4gICovCisKKyAgICAgIGxvd2VzdF9zZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHNvIC0+IGFiZmQsICIudGV4dCIpOworICAgICAgaWYgKGxvd2VzdF9zZWN0ID09IE5VTEwpCisJYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzbyAtPiBhYmZkLCBmaW5kX2xvd2VzdF9zZWN0aW9uLAorCQkJICAgICAgIChQVFIpICZsb3dlc3Rfc2VjdCk7CisgICAgICBpZiAobG93ZXN0X3NlY3QpCisJdGV4dF9hZGRyID0gYmZkX3NlY3Rpb25fdm1hIChzbyAtPiBhYmZkLCBsb3dlc3Rfc2VjdCkgKyBMTV9PRkZTRVQgKHNvKTsKKyAgICB9CisgIAorICBzbyAtPiBvYmpmaWxlID0gc3ltYm9sX2ZpbGVfYWRkIChzbyAtPiBzb19uYW1lLCBzbyAtPiBmcm9tX3R0eSwKKwkJCQkgICB0ZXh0X2FkZHIsCisJCQkJICAgMCwgMCwgMCwgMCwgMCk7CisgIHJldHVybiAoMSk7Cit9CisKKy8qCisKK0dMT0JBTCBGVU5DVElPTgorCisJc29saWJfYWRkIC0tIGFkZCBhIHNoYXJlZCBsaWJyYXJ5IGZpbGUgdG8gdGhlIHN5bXRhYiBhbmQgc2VjdGlvbiBsaXN0CisKK1NZTk9QU0lTCisKKwl2b2lkIHNvbGliX2FkZCAoY2hhciAqYXJnX3N0cmluZywgaW50IGZyb21fdHR5LAorCQkJc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldCkKKworREVTQ1JJUFRJT04KKworKi8KKwordm9pZAorc29saWJfYWRkIChhcmdfc3RyaW5nLCBmcm9tX3R0eSwgdGFyZ2V0KQorICAgICBjaGFyICphcmdfc3RyaW5nOworICAgICBpbnQgZnJvbV90dHk7CisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQ7Cit7CQorICByZWdpc3RlciBzdHJ1Y3Qgc29fbGlzdCAqc28gPSBOVUxMOyAgIAkvKiBsaW5rIG1hcCBzdGF0ZSB2YXJpYWJsZSAqLworCisgIC8qIExhc3Qgc2hhcmVkIGxpYnJhcnkgdGhhdCB3ZSByZWFkLiAgKi8KKyAgc3RydWN0IHNvX2xpc3QgKnNvX2xhc3QgPSBOVUxMOworCisgIGNoYXIgKnJlX2VycjsKKyAgaW50IGNvdW50OworICBpbnQgb2xkOworICAKKyAgaWYgKChyZV9lcnIgPSByZV9jb21wIChhcmdfc3RyaW5nID8gYXJnX3N0cmluZyA6ICIuIikpICE9IE5VTEwpCisgICAgeworICAgICAgZXJyb3IgKCJJbnZhbGlkIHJlZ2V4cDogJXMiLCByZV9lcnIpOworICAgIH0KKyAgCisgIC8qIEFkZCB0aGUgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbnMgdG8gdGhlIHNlY3Rpb24gdGFibGUgb2YgdGhlCisgICAgIHNwZWNpZmllZCB0YXJnZXQsIGlmIGFueS4gICovCisgIGlmICh0YXJnZXQpCisgICAgeworICAgICAgLyogQ291bnQgaG93IG1hbnkgbmV3IHNlY3Rpb25fdGFibGUgZW50cmllcyB0aGVyZSBhcmUuICAqLworICAgICAgc28gPSBOVUxMOworICAgICAgY291bnQgPSAwOworICAgICAgd2hpbGUgKChzbyA9IGZpbmRfc29saWIgKHNvKSkgIT0gTlVMTCkKKwl7CisJICBpZiAoc28gLT4gc29fbmFtZVswXSkKKwkgICAgeworCSAgICAgIGNvdW50ICs9IHNvIC0+IHNlY3Rpb25zX2VuZCAtIHNvIC0+IHNlY3Rpb25zOworCSAgICB9CisJfQorICAgICAgCisgICAgICBpZiAoY291bnQpCisJeworCSAgaW50IHVwZGF0ZV9jb3Jlb3BzOworCisJICAvKiBXZSBtdXN0IHVwZGF0ZSB0aGUgdG9fc2VjdGlvbnMgZmllbGQgaW4gdGhlIGNvcmVfb3BzIHN0cnVjdHVyZQorCSAgICAgaGVyZSwgb3RoZXJ3aXNlIHdlIGRlcmVmZXJlbmNlIGEgcG90ZW50aWFsIGRhbmdsaW5nIHBvaW50ZXIKKwkgICAgIGZvciBlYWNoIGNhbGwgdG8gdGFyZ2V0X3JlYWQvd3JpdGVfbWVtb3J5IHdpdGhpbiB0aGlzIHJvdXRpbmUuICAqLworCSAgdXBkYXRlX2NvcmVvcHMgPSBjb3JlX29wcy50b19zZWN0aW9ucyA9PSB0YXJnZXQtPnRvX3NlY3Rpb25zOworCSAgICAgCisJICAvKiBSZWFsbG9jYXRlIHRoZSB0YXJnZXQncyBzZWN0aW9uIHRhYmxlIGluY2x1ZGluZyB0aGUgbmV3IHNpemUuICAqLworCSAgaWYgKHRhcmdldCAtPiB0b19zZWN0aW9ucykKKwkgICAgeworCSAgICAgIG9sZCA9IHRhcmdldCAtPiB0b19zZWN0aW9uc19lbmQgLSB0YXJnZXQgLT4gdG9fc2VjdGlvbnM7CisJICAgICAgdGFyZ2V0IC0+IHRvX3NlY3Rpb25zID0gKHN0cnVjdCBzZWN0aW9uX3RhYmxlICopCisJCXhyZWFsbG9jICgoY2hhciAqKXRhcmdldCAtPiB0b19zZWN0aW9ucywKKwkJCSAoc2l6ZW9mIChzdHJ1Y3Qgc2VjdGlvbl90YWJsZSkpICogKGNvdW50ICsgb2xkKSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG9sZCA9IDA7CisJICAgICAgdGFyZ2V0IC0+IHRvX3NlY3Rpb25zID0gKHN0cnVjdCBzZWN0aW9uX3RhYmxlICopCisJCXhtYWxsb2MgKChzaXplb2YgKHN0cnVjdCBzZWN0aW9uX3RhYmxlKSkgKiBjb3VudCk7CisJICAgIH0KKwkgIHRhcmdldCAtPiB0b19zZWN0aW9uc19lbmQgPSB0YXJnZXQgLT4gdG9fc2VjdGlvbnMgKyAoY291bnQgKyBvbGQpOworCSAgCisJICAvKiBVcGRhdGUgdGhlIHRvX3NlY3Rpb25zIGZpZWxkIGluIHRoZSBjb3JlX29wcyBzdHJ1Y3R1cmUKKwkgICAgIGlmIG5lZWRlZC4gICovCisJICBpZiAodXBkYXRlX2NvcmVvcHMpCisJICAgIHsKKwkgICAgICBjb3JlX29wcy50b19zZWN0aW9ucyA9IHRhcmdldC0+dG9fc2VjdGlvbnM7CisJICAgICAgY29yZV9vcHMudG9fc2VjdGlvbnNfZW5kID0gdGFyZ2V0LT50b19zZWN0aW9uc19lbmQ7CisJICAgIH0KKworCSAgLyogQWRkIHRoZXNlIHNlY3Rpb24gdGFibGUgZW50cmllcyB0byB0aGUgdGFyZ2V0J3MgdGFibGUuICAqLworCSAgd2hpbGUgKChzbyA9IGZpbmRfc29saWIgKHNvKSkgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmIChzbyAtPiBzb19uYW1lWzBdKQorCQl7CisJCSAgY291bnQgPSBzbyAtPiBzZWN0aW9uc19lbmQgLSBzbyAtPiBzZWN0aW9uczsKKwkJICBtZW1jcHkgKChjaGFyICopICh0YXJnZXQgLT4gdG9fc2VjdGlvbnMgKyBvbGQpLAorCQkJICBzbyAtPiBzZWN0aW9ucywgCisJCQkgIChzaXplb2YgKHN0cnVjdCBzZWN0aW9uX3RhYmxlKSkgKiBjb3VudCk7CisJCSAgb2xkICs9IGNvdW50OworCQl9CisJICAgIH0KKwl9CisgICAgfQorICAKKyAgLyogTm93IGFkZCB0aGUgc3ltYm9sIGZpbGVzLiAgKi8KKyAgd2hpbGUgKChzbyA9IGZpbmRfc29saWIgKHNvKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoc28gLT4gc29fbmFtZVswXSAmJiByZV9leGVjIChzbyAtPiBzb19uYW1lKSkKKwl7CisJICBzbyAtPiBmcm9tX3R0eSA9IGZyb21fdHR5OworCSAgaWYgKHNvIC0+IHN5bWJvbHNfbG9hZGVkKQorCSAgICB7CisJICAgICAgaWYgKGZyb21fdHR5KQorCQl7CisJCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCJTeW1ib2xzIGFscmVhZHkgbG9hZGVkIGZvciAlc1xuIiwgc28gLT4gc29fbmFtZSk7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoY2F0Y2hfZXJyb3JzCisJCSAgIChzeW1ib2xfYWRkX3N0dWIsIChjaGFyICopIHNvLAorCQkgICAgIkVycm9yIHdoaWxlIHJlYWRpbmcgc2hhcmVkIGxpYnJhcnkgc3ltYm9sczpcbiIsCisJCSAgICBSRVRVUk5fTUFTS19BTEwpKQorCSAgICB7CisJICAgICAgc29fbGFzdCA9IHNvOworCSAgICAgIHNvIC0+IHN5bWJvbHNfbG9hZGVkID0gMTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogR2V0dGluZyBuZXcgc3ltYm9scyBtYXkgY2hhbmdlIG91ciBvcGluaW9uIGFib3V0IHdoYXQgaXMKKyAgICAgZnJhbWVsZXNzLiAgKi8KKyAgaWYgKHNvX2xhc3QpCisgICAgcmVpbml0X2ZyYW1lX2NhY2hlICgpOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJaW5mb19zaGFyZWRsaWJyYXJ5X2NvbW1hbmQgLS0gY29kZSBmb3IgImluZm8gc2hhcmVkbGlicmFyeSIKKworU1lOT1BTSVMKKworCXN0YXRpYyB2b2lkIGluZm9fc2hhcmVkbGlicmFyeV9jb21tYW5kICgpCisKK0RFU0NSSVBUSU9OCisKKwlXYWxrIHRocm91Z2ggdGhlIHNoYXJlZCBsaWJyYXJ5IGxpc3QgYW5kIHByaW50IGluZm9ybWF0aW9uCisJYWJvdXQgZWFjaCBhdHRhY2hlZCBsaWJyYXJ5LgorKi8KKworc3RhdGljIHZvaWQKK2luZm9fc2hhcmVkbGlicmFyeV9jb21tYW5kIChpZ25vcmUsIGZyb21fdHR5KQorICAgICBjaGFyICppZ25vcmU7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHNvX2xpc3QgKnNvID0gTlVMTDsgIAkvKiBsaW5rIG1hcCBzdGF0ZSB2YXJpYWJsZSAqLworICBpbnQgaGVhZGVyX2RvbmUgPSAwOworICAKKyAgaWYgKGV4ZWNfYmZkID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJObyBleGVjIGZpbGUuXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIHdoaWxlICgoc28gPSBmaW5kX3NvbGliIChzbykpICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHNvIC0+IHNvX25hbWVbMF0pCisJeworCSAgaWYgKCFoZWFkZXJfZG9uZSkKKwkgICAgeworCSAgICAgIHByaW50Zl91bmZpbHRlcmVkKCIlLTEycyUtMTJzJS0xMnMlc1xuIiwgIkZyb20iLCAiVG8iLCAiU3ltcyBSZWFkIiwKKwkJICAgICAiU2hhcmVkIE9iamVjdCBMaWJyYXJ5Iik7CisJICAgICAgaGVhZGVyX2RvbmUrKzsKKwkgICAgfQorCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlLTEycyIsCisJCSAgbG9jYWxfaGV4X3N0cmluZ19jdXN0b20gKCh1bnNpZ25lZCBsb25nKSBMTV9BRERSIChzbyksCisJCQkJCSAgICIwOGwiKSk7CisJICBwcmludGZfdW5maWx0ZXJlZCAoIiUtMTJzIiwKKwkJICBsb2NhbF9oZXhfc3RyaW5nX2N1c3RvbSAoKHVuc2lnbmVkIGxvbmcpIHNvIC0+IGxtZW5kLAorCQkJCQkgICAiMDhsIikpOworCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlLTEycyIsIHNvIC0+IHN5bWJvbHNfbG9hZGVkID8gIlllcyIgOiAiTm8iKTsKKwkgIHByaW50Zl91bmZpbHRlcmVkICgiJXNcbiIsICBzbyAtPiBzb19uYW1lKTsKKwl9CisgICAgfQorICBpZiAoc29fbGlzdF9oZWFkID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJObyBzaGFyZWQgbGlicmFyaWVzIGxvYWRlZCBhdCB0aGlzIHRpbWUuXG4iKTsJCisgICAgfQorfQorCisvKgorCitHTE9CQUwgRlVOQ1RJT04KKworCXNvbGliX2FkZHJlc3MgLS0gY2hlY2sgdG8gc2VlIGlmIGFuIGFkZHJlc3MgaXMgaW4gYSBzaGFyZWQgbGliCisKK1NZTk9QU0lTCisKKwljaGFyICpzb2xpYl9hZGRyZXNzIChDT1JFX0FERFIgYWRkcmVzcykKKworREVTQ1JJUFRJT04KKworCVByb3ZpZGVzIGEgaG9vayBmb3Igb3RoZXIgZ2RiIHJvdXRpbmVzIHRvIGRpc2NvdmVyIHdoZXRoZXIgb3IKKwlub3QgYSBwYXJ0aWN1bGFyIGFkZHJlc3MgaXMgd2l0aGluIHRoZSBtYXBwZWQgYWRkcmVzcyBzcGFjZSBvZgorCWEgc2hhcmVkIGxpYnJhcnkuICBBbnkgYWRkcmVzcyBiZXR3ZWVuIHRoZSBiYXNlIG1hcHBpbmcgYWRkcmVzcworCWFuZCB0aGUgZmlyc3QgYWRkcmVzcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgbGFzdCBtYXBwaW5nLCBpcworCWNvbnNpZGVyZWQgdG8gYmUgd2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeSBhZGRyZXNzIHNwYWNlLCBmb3IKKwlvdXIgcHVycG9zZXMuCisKKwlGb3IgZXhhbXBsZSwgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhdCBvbmUgcG9pbnQgdG8gZGlzYWJsZQorCWJyZWFrcG9pbnRzIHdoaWNoIGFyZSBpbiBzaGFyZWQgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBjdXJyZW50bHkKKwltYXBwZWQgaW4uCisgKi8KKworY2hhciAqCitzb2xpYl9hZGRyZXNzIChhZGRyZXNzKQorICAgICBDT1JFX0FERFIgYWRkcmVzczsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHNvX2xpc3QgKnNvID0gMDsgICAJLyogbGluayBtYXAgc3RhdGUgdmFyaWFibGUgKi8KKyAgCisgIHdoaWxlICgoc28gPSBmaW5kX3NvbGliIChzbykpICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHNvIC0+IHNvX25hbWVbMF0pCisJeworCSAgaWYgKChhZGRyZXNzID49IChDT1JFX0FERFIpIExNX0FERFIgKHNvKSkgJiYKKwkgICAgICAoYWRkcmVzcyA8IChDT1JFX0FERFIpIHNvIC0+IGxtZW5kKSkKKwkgICAgcmV0dXJuIChzby0+c29fbmFtZSk7CisJfQorICAgIH0KKyAgcmV0dXJuICgwKTsKK30KKworLyogQ2FsbGVkIGJ5IGZyZWVfYWxsX3N5bXRhYnMgKi8KKwordm9pZCAKK2NsZWFyX3NvbGliKCkKK3sKKyAgc3RydWN0IHNvX2xpc3QgKm5leHQ7CisgIGNoYXIgKmJmZF9maWxlbmFtZTsKKyAgCisgIGRpc2FibGVfYnJlYWtwb2ludHNfaW5fc2hsaWJzICgxKTsKKworICB3aGlsZSAoc29fbGlzdF9oZWFkKQorICAgIHsKKyAgICAgIGlmIChzb19saXN0X2hlYWQgLT4gc2VjdGlvbnMpCisJeworCSAgZnJlZSAoKFBUUilzb19saXN0X2hlYWQgLT4gc2VjdGlvbnMpOworCX0KKyAgICAgIGlmIChzb19saXN0X2hlYWQgLT4gYWJmZCkKKwl7CisJICBiZmRfZmlsZW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChzb19saXN0X2hlYWQgLT4gYWJmZCk7CisJICBpZiAoIWJmZF9jbG9zZSAoc29fbGlzdF9oZWFkIC0+IGFiZmQpKQorCSAgICB3YXJuaW5nICgiY2Fubm90IGNsb3NlIFwiJXNcIjogJXMiLAorCQkgICAgIGJmZF9maWxlbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCX0KKyAgICAgIGVsc2UKKwkvKiBUaGlzIGhhcHBlbnMgZm9yIHRoZSBleGVjdXRhYmxlIG9uIFNWUjQuICAqLworCWJmZF9maWxlbmFtZSA9IE5VTEw7CisKKyAgICAgIG5leHQgPSBzb19saXN0X2hlYWQgLT4gbmV4dDsKKyAgICAgIGlmIChiZmRfZmlsZW5hbWUpCisJZnJlZSAoKFBUUiliZmRfZmlsZW5hbWUpOworICAgICAgZnJlZSAoc29fbGlzdF9oZWFkLT5zb19uYW1lKTsKKyAgICAgIGZyZWUgKChQVFIpc29fbGlzdF9oZWFkKTsKKyAgICAgIHNvX2xpc3RfaGVhZCA9IG5leHQ7CisgICAgfQorICBkZWJ1Z19iYXNlID0gMDsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWRpc2FibGVfYnJlYWsgLS0gcmVtb3ZlIHRoZSAibWFwcGluZyBjaGFuZ2VkIiBicmVha3BvaW50CisKK1NZTk9QU0lTCisKKwlzdGF0aWMgaW50IGRpc2FibGVfYnJlYWsgKCkKKworREVTQ1JJUFRJT04KKworCVJlbW92ZXMgdGhlIGJyZWFrcG9pbnQgdGhhdCBnZXRzIGhpdCB3aGVuIHRoZSBkeW5hbWljIGxpbmtlcgorCWNvbXBsZXRlcyBhIG1hcHBpbmcgY2hhbmdlLgorCisqLworCitzdGF0aWMgaW50CitkaXNhYmxlX2JyZWFrICgpCit7CisgIGludCBzdGF0dXMgPSAxOworCisKKyAgLyogTm90ZSB0aGF0IGJyZWFrcG9pbnQgYWRkcmVzcyBhbmQgb3JpZ2luYWwgY29udGVudHMgYXJlIGluIG91ciBhZGRyZXNzCisgICAgIHNwYWNlLCBzbyB3ZSBqdXN0IG5lZWQgdG8gd3JpdGUgdGhlIG9yaWdpbmFsIGNvbnRlbnRzIGJhY2suICovCisKKyAgaWYgKG1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCAoYnJlYWtwb2ludF9hZGRyLCBzaGFkb3dfY29udGVudHMpICE9IDApCisgICAgeworICAgICAgc3RhdHVzID0gMDsKKyAgICB9CisKKyAgLyogRm9yIHRoZSBTVlI0IHZlcnNpb24sIHdlIGFsd2F5cyBrbm93IHRoZSBicmVha3BvaW50IGFkZHJlc3MuICBGb3IgdGhlCisgICAgIFN1bk9TIHZlcnNpb24gd2UgZG9uJ3Qga25vdyBpdCB1bnRpbCB0aGUgYWJvdmUgY29kZSBpcyBleGVjdXRlZC4KKyAgICAgR3J1bWJsZSBpZiB3ZSBhcmUgc3RvcHBlZCBhbnl3aGVyZSBiZXNpZGVzIHRoZSBicmVha3BvaW50IGFkZHJlc3MuICovCisKKyAgaWYgKHN0b3BfcGMgIT0gYnJlYWtwb2ludF9hZGRyKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJzdG9wcGVkIGF0IHVua25vd24gYnJlYWtwb2ludCB3aGlsZSBoYW5kbGluZyBzaGFyZWQgbGlicmFyaWVzIik7CisgICAgfQorCisgIHJldHVybiAoc3RhdHVzKTsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWVuYWJsZV9icmVhayAtLSBhcnJhbmdlIGZvciBkeW5hbWljIGxpbmtlciB0byBoaXQgYnJlYWtwb2ludAorCitTWU5PUFNJUworCisJaW50IGVuYWJsZV9icmVhayAodm9pZCkKKworREVTQ1JJUFRJT04KKworCVRoaXMgZnVuY3Rpb25zIGluc2VydHMgYSBicmVha3BvaW50IGF0IHRoZSBlbnRyeSBwb2ludCBvZiB0aGUKKwltYWluIGV4ZWN1dGFibGUsIHdoZXJlIGFsbCBzaGFyZWQgbGlicmFyaWVzIGFyZSBtYXBwZWQgaW4uCisqLworCitzdGF0aWMgaW50CitlbmFibGVfYnJlYWsgKCkKK3sKKyAgaWYgKHN5bWZpbGVfb2JqZmlsZSAhPSBOVUxMCisgICAgICAmJiB0YXJnZXRfaW5zZXJ0X2JyZWFrcG9pbnQgKHN5bWZpbGVfb2JqZmlsZS0+ZWkuZW50cnlfcG9pbnQsCisJCQkJICAgc2hhZG93X2NvbnRlbnRzKSA9PSAwKQorICAgIHsKKyAgICAgIGJyZWFrcG9pbnRfYWRkciA9IHN5bWZpbGVfb2JqZmlsZS0+ZWkuZW50cnlfcG9pbnQ7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisgIAorLyoKKyAgCitHTE9CQUwgRlVOQ1RJT04KKyAgCisJc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2sgLS0gc2hhcmVkIGxpYnJhcnkgc3RhcnR1cCBzdXBwb3J0CisgIAorU1lOT1BTSVMKKyAgCisJdm9pZCBzb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vaygpCisgIAorREVTQ1JJUFRJT04KKyAgCisJV2hlbiBnZGIgc3RhcnRzIHVwIHRoZSBpbmZlcmlvciwgaXQgbnVyc2VzIGl0IGFsb25nICh0aHJvdWdoIHRoZQorCXNoZWxsKSB1bnRpbCBpdCBpcyByZWFkeSB0byBleGVjdXRlIGl0J3MgZmlyc3QgaW5zdHJ1Y3Rpb24uICBBdCB0aGlzCisJcG9pbnQsIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgdmlhIGV4cGFuc2lvbiBvZiB0aGUgbWFjcm8KKwlTT0xJQl9DUkVBVEVfSU5GRVJJT1JfSE9PSy4KKworCUZvciBTdW5PUyBleGVjdXRhYmxlcywgdGhpcyBmaXJzdCBpbnN0cnVjdGlvbiBpcyB0eXBpY2FsbHkgdGhlCisJb25lIGF0ICJfc3RhcnQiLCBvciBhIHNpbWlsYXIgdGV4dCBsYWJlbCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCisJdGhlIGV4ZWN1dGFibGUgaXMgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSBsaW5rZWQuICBUaGUgcnVudGltZQorCXN0YXJ0dXAgY29kZSB0YWtlcyBjYXJlIG9mIGR5bmFtaWNhbGx5IGxpbmtpbmcgaW4gYW55IHNoYXJlZAorCWxpYnJhcmllcywgb25jZSBnZGIgYWxsb3dzIHRoZSBpbmZlcmlvciB0byBjb250aW51ZS4KKworCUZvciBTVlI0IGV4ZWN1dGFibGVzLCB0aGlzIGZpcnN0IGluc3RydWN0aW9uIGlzIGVpdGhlciB0aGUgZmlyc3QKKwlpbnN0cnVjdGlvbiBpbiB0aGUgZHluYW1pYyBsaW5rZXIgKGZvciBkeW5hbWljYWxseSBsaW5rZWQKKwlleGVjdXRhYmxlcykgb3IgdGhlIGluc3RydWN0aW9uIGF0ICJzdGFydCIgZm9yIHN0YXRpY2FsbHkgbGlua2VkCisJZXhlY3V0YWJsZXMuICBGb3IgZHluYW1pY2FsbHkgbGlua2VkIGV4ZWN1dGFibGVzLCB0aGUgc3lzdGVtCisJZmlyc3QgZXhlYydzIC9saWIvbGliYy5zby5OLCB3aGljaCBjb250YWlucyB0aGUgZHluYW1pYyBsaW5rZXIsCisJYW5kIHN0YXJ0cyBpdCBydW5uaW5nLiAgVGhlIGR5bmFtaWMgbGlua2VyIG1hcHMgaW4gYW55IG5lZWRlZAorCXNoYXJlZCBsaWJyYXJpZXMsIG1hcHMgaW4gdGhlIGFjdHVhbCB1c2VyIGV4ZWN1dGFibGUsIGFuZCB0aGVuCisJanVtcHMgdG8gInN0YXJ0IiBpbiB0aGUgdXNlciBleGVjdXRhYmxlLgorCisJRm9yIGJvdGggU3VuT1Mgc2hhcmVkIGxpYnJhcmllcywgYW5kIFNWUjQgc2hhcmVkIGxpYnJhcmllcywgd2UKKwljYW4gYXJyYW5nZSB0byBjb29wZXJhdGUgd2l0aCB0aGUgZHluYW1pYyBsaW5rZXIgdG8gZGlzY292ZXIgdGhlCisJbmFtZXMgb2Ygc2hhcmVkIGxpYnJhcmllcyB0aGF0IGFyZSBkeW5hbWljYWxseSBsaW5rZWQsIGFuZCB0aGUKKwliYXNlIGFkZHJlc3NlcyB0byB3aGljaCB0aGV5IGFyZSBsaW5rZWQuCisKKwlUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkaXNjb3ZlcmluZyB0aG9zZSBuYW1lcyBhbmQKKwlhZGRyZXNzZXMsIGFuZCBzYXZpbmcgc3VmZmljaWVudCBpbmZvcm1hdGlvbiBhYm91dCB0aGVtIHRvIGFsbG93CisJdGhlaXIgc3ltYm9scyB0byBiZSByZWFkIGF0IGEgbGF0ZXIgdGltZS4KKworRklYTUUKKworCUJldHdlZW4gZW5hYmxlX2JyZWFrKCkgYW5kIGRpc2FibGVfYnJlYWsoKSwgdGhpcyBjb2RlIGRvZXMgbm90CisJcHJvcGVybHkgaGFuZGxlIGhpdHRpbmcgYnJlYWtwb2ludHMgd2hpY2ggdGhlIHVzZXIgbWlnaHQgaGF2ZQorCXNldCBpbiB0aGUgc3RhcnR1cCBjb2RlIG9yIGluIHRoZSBkeW5hbWljIGxpbmtlciBpdHNlbGYuICBQcm9wZXIKKwloYW5kbGluZyB3aWxsIHByb2JhYmx5IGhhdmUgdG8gd2FpdCB1bnRpbCB0aGUgaW1wbGVtZW50YXRpb24gaXMKKwljaGFuZ2VkIHRvIHVzZSB0aGUgImJyZWFrcG9pbnQgaGFuZGxlciBmdW5jdGlvbiIgbWV0aG9kLgorCisJQWxzbywgd2hhdCBpZiBjaGlsZCBoYXMgZXhpdCgpZWQ/ICBNdXN0IGV4aXQgbG9vcCBzb21laG93LgorICAqLworCit2b2lkIAorc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2soKQoreworICBpZiAoIWVuYWJsZV9icmVhayAoKSkKKyAgICB7CisgICAgICB3YXJuaW5nICgic2hhcmVkIGxpYnJhcnkgaGFuZGxlciBmYWlsZWQgdG8gZW5hYmxlIGJyZWFrcG9pbnQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogTm93IHJ1biB0aGUgdGFyZ2V0LiAgSXQgd2lsbCBldmVudHVhbGx5IGhpdCB0aGUgYnJlYWtwb2ludCwgYXQKKyAgICAgd2hpY2ggcG9pbnQgYWxsIG9mIHRoZSBsaWJyYXJpZXMgd2lsbCBoYXZlIGJlZW4gbWFwcGVkIGluIGFuZCB3ZQorICAgICBjYW4gZ28gZ3JvdmVsaW5nIGFyb3VuZCBpbiB0aGUgZHluYW1pYyBsaW5rZXIgc3RydWN0dXJlcyB0byBmaW5kCisgICAgIG91dCB3aGF0IHdlIG5lZWQgdG8ga25vdyBhYm91dCB0aGVtLiAqLworCisgIGNsZWFyX3Byb2NlZWRfc3RhdHVzICgpOworICBzdG9wX3Nvb25fcXVpZXRseSA9IDE7CisgIHN0b3Bfc2lnbmFsID0gVEFSR0VUX1NJR05BTF8wOworICBkbworICAgIHsKKyAgICAgIHRhcmdldF9yZXN1bWUgKC0xLCAwLCBzdG9wX3NpZ25hbCk7CisgICAgICB3YWl0X2Zvcl9pbmZlcmlvciAoKTsKKyAgICB9CisgIHdoaWxlIChzdG9wX3NpZ25hbCAhPSBUQVJHRVRfU0lHTkFMX1RSQVApOworICAKKyAgLyogV2UgYXJlIG5vdyBlaXRoZXIgYXQgdGhlICJtYXBwaW5nIGNvbXBsZXRlIiBicmVha3BvaW50IChvciBzb21ld2hlcmUKKyAgICAgZWxzZSwgYSBjb25kaXRpb24gd2UgYXJlbid0IHByZXBhcmVkIHRvIGRlYWwgd2l0aCBhbnl3YXkpLCBzbyBhZGp1c3QKKyAgICAgdGhlIFBDIGFzIG5lY2Vzc2FyeSBhZnRlciBhIGJyZWFrcG9pbnQsIGRpc2FibGUgdGhlIGJyZWFrcG9pbnQsIGFuZAorICAgICBhZGQgYW55IHNoYXJlZCBsaWJyYXJpZXMgdGhhdCB3ZXJlIG1hcHBlZCBpbi4gKi8KKworICBpZiAoREVDUl9QQ19BRlRFUl9CUkVBSykKKyAgICB7CisgICAgICBzdG9wX3BjIC09IERFQ1JfUENfQUZURVJfQlJFQUs7CisgICAgICB3cml0ZV9yZWdpc3RlciAoUENfUkVHTlVNLCBzdG9wX3BjKTsKKyAgICB9CisKKyAgaWYgKCFkaXNhYmxlX2JyZWFrICgpKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJzaGFyZWQgbGlicmFyeSBoYW5kbGVyIGZhaWxlZCB0byBkaXNhYmxlIGJyZWFrcG9pbnQiKTsKKyAgICB9CisKKyAgLyogIHNvbGliX2FkZCB3aWxsIGNhbGwgcmVpbml0X2ZyYW1lX2NhY2hlLgorICAgICAgQnV0IHdlIGFyZSBzdG9wcGVkIGluIHRoZSBzdGFydHVwIGNvZGUgYW5kIHdlIG1pZ2h0IG5vdCBoYXZlIHN5bWJvbHMKKyAgICAgIGZvciB0aGUgc3RhcnR1cCBjb2RlLCBzbyBoZXVyaXN0aWNfcHJvY19zdGFydCBjb3VsZCBiZSBjYWxsZWQKKyAgICAgIGFuZCB3aWxsIHB1dCBvdXQgYW4gYW5ub3lpbmcgd2FybmluZy4KKyAgICAgIERlbGF5aW5nIHRoZSByZXNldHRpbmcgb2Ygc3RvcF9zb29uX3F1aWV0bHkgdW50aWwgYWZ0ZXIgc3ltYm9sIGxvYWRpbmcKKyAgICAgIHN1cHByZXNzZXMgdGhlIHdhcm5pbmcuICAqLworICBpZiAoYXV0b19zb2xpYl9hZGQpCisgICAgc29saWJfYWRkICgoY2hhciAqKSAwLCAwLCAoc3RydWN0IHRhcmdldF9vcHMgKikgMCk7CisgIHN0b3Bfc29vbl9xdWlldGx5ID0gMDsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCXNoYXJlZGxpYnJhcnlfY29tbWFuZCAtLSBoYW5kbGUgY29tbWFuZCB0byBleHBsaWNpdGx5IGFkZCBsaWJyYXJ5CisKK1NZTk9QU0lTCisKKwlzdGF0aWMgdm9pZCBzaGFyZWRsaWJyYXJ5X2NvbW1hbmQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkKKworREVTQ1JJUFRJT04KKworKi8KKworc3RhdGljIHZvaWQKK3NoYXJlZGxpYnJhcnlfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCitjaGFyICphcmdzOworaW50IGZyb21fdHR5OworeworICBkb250X3JlcGVhdCAoKTsKKyAgc29saWJfYWRkIChhcmdzLCBmcm9tX3R0eSwgKHN0cnVjdCB0YXJnZXRfb3BzICopIDApOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9zb2xpYigpCit7CisgIGFkZF9jb20gKCJzaGFyZWRsaWJyYXJ5IiwgY2xhc3NfZmlsZXMsIHNoYXJlZGxpYnJhcnlfY29tbWFuZCwKKwkgICAiTG9hZCBzaGFyZWQgb2JqZWN0IGxpYnJhcnkgc3ltYm9scyBmb3IgZmlsZXMgbWF0Y2hpbmcgUkVHRVhQLiIpOworICBhZGRfaW5mbyAoInNoYXJlZGxpYnJhcnkiLCBpbmZvX3NoYXJlZGxpYnJhcnlfY29tbWFuZCwgCisJICAgICJTdGF0dXMgb2YgbG9hZGVkIHNoYXJlZCBvYmplY3QgbGlicmFyaWVzLiIpOworCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgiYXV0by1zb2xpYi1hZGQiLCBjbGFzc19zdXBwb3J0LCB2YXJfemludGVnZXIsCisJCSAgKGNoYXIgKikgJmF1dG9fc29saWJfYWRkLAorCQkgICJTZXQgYXV0b2xvYWRpbmcgb2Ygc2hhcmVkIGxpYnJhcnkgc3ltYm9scy5cblwKK0lmIG5vbnplcm8sIHN5bWJvbHMgZnJvbSBhbGwgc2hhcmVkIG9iamVjdCBsaWJyYXJpZXMgd2lsbCBiZSBsb2FkZWRcblwKK2F1dG9tYXRpY2FsbHkgd2hlbiB0aGUgaW5mZXJpb3IgYmVnaW5zIGV4ZWN1dGlvbiBvciB3aGVuIHRoZSBkeW5hbWljIGxpbmtlclxuXAoraW5mb3JtcyBnZGIgdGhhdCBhIG5ldyBsaWJyYXJ5IGhhcyBiZWVuIGxvYWRlZC4gIE90aGVyd2lzZSwgc3ltYm9sc1xuXAorbXVzdCBiZSBsb2FkZWQgbWFudWFsbHksIHVzaW5nIGBzaGFyZWRsaWJyYXJ5Jy4iLAorCQkgICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKK30KKworDAorLyogUmVnaXN0ZXIgdGhhdCB3ZSBhcmUgYWJsZSB0byBoYW5kbGUgaXJpeDUgY29yZSBmaWxlIGZvcm1hdHMuCisgICBUaGlzIHJlYWxseSBpcyBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciAqLworCitzdGF0aWMgc3RydWN0IGNvcmVfZm5zIGlyaXg1X2NvcmVfZm5zID0KK3sKKyAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCisgIGZldGNoX2NvcmVfcmVnaXN0ZXJzLAorICBOVUxMCit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9jb3JlX2lyaXg1ICgpCit7CisgIGFkZF9jb3JlX2ZucyAoJmlyaXg1X2NvcmVfZm5zKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9pc2kteGRlcC5jIGIvZ2RiL2lzaS14ZGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc3M2M4MwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9pc2kteGRlcC5jCkBAIC0wLDAgKzEsMjAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPG1hY2hpbmUvcmVnLmg+CitpbnQgcmxvY1tdID0geworICAgIFIwLCBSMSwgUjIsIFIzLCBSNCwgUjUsIFI2LCBSNywgUjgsIFI5LCBSMTAsIFIxMSwgUjEyLCBSMTMsIEZQLCBTUCwgUFMsIFBDCit9OwpkaWZmIC0tZ2l0IGEvZ2RiL2p2LWV4cC55IGIvZ2RiL2p2LWV4cC55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxN2M0ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvanYtZXhwLnkKQEAgLTAsMCArMSwxNDY2IEBACisvKiBZQUNDIHBhcnNlciBmb3IgSmF2YSBleHByZXNzaW9ucywgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OS4KKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFBhcnNlIGEgSmF2YSBleHByZXNzaW9uIGZyb20gdGV4dCBpbiBhIHN0cmluZywKKyAgIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhICBzdHJ1Y3QgZXhwcmVzc2lvbiAgcG9pbnRlci4KKyAgIFRoYXQgc3RydWN0dXJlIGNvbnRhaW5zIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBpbiByZXZlcnNlIHBvbGlzaCwKKyAgIHdpdGggY29uc3RhbnRzIHJlcHJlc2VudGVkIGJ5IG9wZXJhdGlvbnMgdGhhdCBhcmUgZm9sbG93ZWQgYnkgc3BlY2lhbCBkYXRhLgorICAgU2VlIGV4cHJlc3Npb24uaCBmb3IgdGhlIGRldGFpbHMgb2YgdGhlIGZvcm1hdC4KKyAgIFdoYXQgaXMgaW1wb3J0YW50IGhlcmUgaXMgdGhhdCBpdCBjYW4gYmUgYnVpbHQgdXAgc2VxdWVudGlhbGx5CisgICBkdXJpbmcgdGhlIHByb2Nlc3Mgb2YgcGFyc2luZzsgdGhlIGxvd2VyIGxldmVscyBvZiB0aGUgdHJlZSBhbHdheXMKKyAgIGNvbWUgZmlyc3QgaW4gdGhlIHJlc3VsdC4gIFdlbGwsIGFsbW9zdCBhbHdheXM7IHNlZSBBcnJheUFjY2Vzcy4KKworICAgTm90ZSB0aGF0IG1hbGxvYydzIGFuZCByZWFsbG9jJ3MgaW4gdGhpcyBmaWxlIGFyZSB0cmFuc2Zvcm1lZCB0bworICAgeG1hbGxvYyBhbmQgeHJlYWxsb2MgcmVzcGVjdGl2ZWx5IGJ5IHRoZSBzYW1lIHNlZCBjb21tYW5kIGluIHRoZQorICAgbWFrZWZpbGUgdGhhdCByZW1hcHMgYW55IG90aGVyIG1hbGxvYy9yZWFsbG9jIGluc2VydGVkIGJ5IHRoZSBwYXJzZXIKKyAgIGdlbmVyYXRvci4gIERvaW5nIHRoaXMgd2l0aCAjZGVmaW5lcyBhbmQgdHJ5aW5nIHRvIGNvbnRyb2wgdGhlIGludGVyYWN0aW9uCisgICB3aXRoIGluY2x1ZGUgZmlsZXMgKDxtYWxsb2MuaD4gYW5kIDxzdGRsaWIuaD4gZm9yIGV4YW1wbGUpIGp1c3QgYmVjYW1lCisgICB0b28gbWVzc3ksIHBhcnRpY3VsYXJseSB3aGVuIHN1Y2ggaW5jbHVkZXMgY2FuIGJlIGluc2VydGVkIGF0IHJhbmRvbQorICAgdGltZXMgYnkgdGhlIHBhcnNlciBnZW5lcmF0b3IuICAqLworICAKKyV7CisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAicGFyc2VyLWRlZnMuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1ZGUgImp2LWxhbmcuaCIKKyNpbmNsdWRlICJiZmQuaCIgLyogUmVxdWlyZWQgYnkgb2JqZmlsZXMuaC4gICovCisjaW5jbHVkZSAic3ltZmlsZS5oIiAvKiBSZXF1aXJlZCBieSBvYmpmaWxlcy5oLiAgKi8KKyNpbmNsdWRlICJvYmpmaWxlcy5oIiAvKiBGb3IgaGF2ZV9mdWxsX3N5bWJvbHMgYW5kIGhhdmVfcGFydGlhbF9zeW1ib2xzICovCisKKy8qIFJlbWFwIG5vcm1hbCB5YWNjIHBhcnNlciBpbnRlcmZhY2UgbmFtZXMgKHl5cGFyc2UsIHl5bGV4LCB5eWVycm9yLCBldGMpLAorICAgYXMgd2VsbCBhcyBncmF0dWl0aW91c2x5IGdsb2JhbCBzeW1ib2wgbmFtZXMsIHNvIHdlIGNhbiBoYXZlIG11bHRpcGxlCisgICB5YWNjIGdlbmVyYXRlZCBwYXJzZXJzIGluIGdkYi4gIE5vdGUgdGhhdCB0aGVzZSBhcmUgb25seSB0aGUgdmFyaWFibGVzCisgICBwcm9kdWNlZCBieSB5YWNjLiAgSWYgb3RoZXIgcGFyc2VyIGdlbmVyYXRvcnMgKGJpc29uLCBieWFjYywgZXRjKSBwcm9kdWNlCisgICBhZGRpdGlvbmFsIGdsb2JhbCBuYW1lcyB0aGF0IGNvbmZsaWN0IGF0IGxpbmsgdGltZSwgdGhlbiB0aG9zZSBwYXJzZXIKKyAgIGdlbmVyYXRvcnMgbmVlZCB0byBiZSBmaXhlZCBpbnN0ZWFkIG9mIGFkZGluZyB0aG9zZSBuYW1lcyB0byB0aGlzIGxpc3QuICovCisKKyNkZWZpbmUJeXltYXhkZXB0aCBqYXZhX21heGRlcHRoCisjZGVmaW5lCXl5cGFyc2UJamF2YV9wYXJzZQorI2RlZmluZQl5eWxleAlqYXZhX2xleAorI2RlZmluZQl5eWVycm9yCWphdmFfZXJyb3IKKyNkZWZpbmUJeXlsdmFsCWphdmFfbHZhbAorI2RlZmluZQl5eWNoYXIJamF2YV9jaGFyCisjZGVmaW5lCXl5ZGVidWcJamF2YV9kZWJ1ZworI2RlZmluZQl5eXBhY3QJamF2YV9wYWN0CQorI2RlZmluZQl5eXIxCWphdmFfcjEJCQkKKyNkZWZpbmUJeXlyMglqYXZhX3IyCQkJCisjZGVmaW5lCXl5ZGVmCWphdmFfZGVmCQkKKyNkZWZpbmUJeXljaGsJamF2YV9jaGsJCQorI2RlZmluZQl5eXBnbwlqYXZhX3BnbwkJCisjZGVmaW5lCXl5YWN0CWphdmFfYWN0CQkKKyNkZWZpbmUJeXlleGNhCWphdmFfZXhjYQorI2RlZmluZSB5eWVycmZsYWcgamF2YV9lcnJmbGFnCisjZGVmaW5lIHl5bmVycnMJamF2YV9uZXJycworI2RlZmluZQl5eXBzCWphdmFfcHMKKyNkZWZpbmUJeXlwdglqYXZhX3B2CisjZGVmaW5lCXl5cwlqYXZhX3MKKyNkZWZpbmUJeXlfeXlzCWphdmFfeXlzCisjZGVmaW5lCXl5c3RhdGUJamF2YV9zdGF0ZQorI2RlZmluZQl5eXRtcAlqYXZhX3RtcAorI2RlZmluZQl5eXYJamF2YV92CisjZGVmaW5lCXl5X3l5dglqYXZhX3l5dgorI2RlZmluZQl5eXZhbAlqYXZhX3ZhbAorI2RlZmluZQl5eWxsb2MJamF2YV9sbG9jCisjZGVmaW5lIHl5cmVkcwlqYXZhX3JlZHMJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCisjZGVmaW5lIHl5dG9rcwlqYXZhX3Rva3MJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCisjZGVmaW5lIHl5bGhzCWphdmFfeXlsaHMKKyNkZWZpbmUgeXlsZW4JamF2YV95eWxlbgorI2RlZmluZSB5eWRlZnJlZCBqYXZhX3l5ZGVmcmVkCisjZGVmaW5lIHl5ZGdvdG8JamF2YV95eWRnb3RvCisjZGVmaW5lIHl5c2luZGV4IGphdmFfeXlzaW5kZXgKKyNkZWZpbmUgeXlyaW5kZXggamF2YV95eXJpbmRleAorI2RlZmluZSB5eWdpbmRleCBqYXZhX3l5Z2luZGV4CisjZGVmaW5lIHl5dGFibGUJIGphdmFfeXl0YWJsZQorI2RlZmluZSB5eWNoZWNrCSBqYXZhX3l5Y2hlY2sKKworI2lmbmRlZiBZWURFQlVHCisjZGVmaW5lCVlZREVCVUcJMAkJLyogRGVmYXVsdCB0byBubyB5eWRlYnVnIHN1cHBvcnQgKi8KKyNlbmRpZgorCitpbnQKK3l5cGFyc2UgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgaW50Cit5eWxleCBQQVJBTVMgKCh2b2lkKSk7CisKK3ZvaWQKK3l5ZXJyb3IgUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqIGphdmFfdHlwZV9mcm9tX25hbWUgUEFSQU1TICgoc3RydWN0IHN0b2tlbikpOworc3RhdGljIHZvaWQgcHVzaF9leHByZXNzaW9uX25hbWUgUEFSQU1TICgoc3RydWN0IHN0b2tlbikpOworc3RhdGljIHZvaWQgcHVzaF9maWVsZG5hbWVzIFBBUkFNUyAoKHN0cnVjdCBzdG9rZW4pKTsKKworc3RhdGljIHN0cnVjdCBleHByZXNzaW9uICpjb3B5X2V4cCBQQVJBTVMgKChzdHJ1Y3QgZXhwcmVzc2lvbiAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIGluc2VydF9leHAgUEFSQU1TICgoaW50LCBzdHJ1Y3QgZXhwcmVzc2lvbiAqKSk7CisKKyV9CisKKy8qIEFsdGhvdWdoIHRoZSB5YWNjICJ2YWx1ZSIgb2YgYW4gZXhwcmVzc2lvbiBpcyBub3QgdXNlZCwKKyAgIHNpbmNlIHRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHRoZSBzdHJ1Y3R1cmUgYmVpbmcgY3JlYXRlZCwKKyAgIG90aGVyIG5vZGUgdHlwZXMgZG8gaGF2ZSB2YWx1ZXMuICAqLworCisldW5pb24KKyAgeworICAgIExPTkdFU1QgbHZhbDsKKyAgICBzdHJ1Y3QgeworICAgICAgTE9OR0VTVCB2YWw7CisgICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICB9IHR5cGVkX3ZhbF9pbnQ7CisgICAgc3RydWN0IHsKKyAgICAgIERPVUJMRVNUIGR2YWw7CisgICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICB9IHR5cGVkX3ZhbF9mbG9hdDsKKyAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgICAgc3RydWN0IHR5cGUgKnR2YWw7CisgICAgc3RydWN0IHN0b2tlbiBzdmFsOworICAgIHN0cnVjdCB0dHlwZSB0c3ltOworICAgIHN0cnVjdCBzeW10b2tlbiBzc3ltOworICAgIHN0cnVjdCBibG9jayAqYnZhbDsKKyAgICBlbnVtIGV4cF9vcGNvZGUgb3Bjb2RlOworICAgIHN0cnVjdCBpbnRlcm5hbHZhciAqaXZhcjsKKyAgICBpbnQgKml2ZWM7CisgIH0KKworJXsKKy8qIFlZU1RZUEUgZ2V0cyBkZWZpbmVkIGJ5ICV1bmlvbiAqLworc3RhdGljIGludAorcGFyc2VfbnVtYmVyIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBpbnQsIFlZU1RZUEUgKikpOworJX0KKworJXR5cGUgPGx2YWw+IHJjdXJseSBEaW1zIERpbXNfb3B0CisldHlwZSA8dHZhbD4gQ2xhc3NPckludGVyZmFjZVR5cGUgQ2xhc3NUeXBlIC8qIFJlZmVyZW5jZVR5cGUgVHlwZSBBcnJheVR5cGUgKi8KKyV0eXBlIDx0dmFsPiBJbnRlZ3JhbFR5cGUgRmxvYXRpbmdQb2ludFR5cGUgTnVtZXJpY1R5cGUgUHJpbWl0aXZlVHlwZSBBcnJheVR5cGUgUHJpbWl0aXZlT3JBcnJheVR5cGUKKworJXRva2VuIDx0eXBlZF92YWxfaW50PiBJTlRFR0VSX0xJVEVSQUwKKyV0b2tlbiA8dHlwZWRfdmFsX2Zsb2F0PiBGTE9BVElOR19QT0lOVF9MSVRFUkFMCisKKyV0b2tlbiA8c3ZhbD4gSURFTlRJRklFUgorJXRva2VuIDxzdmFsPiBTVFJJTkdfTElURVJBTAorJXRva2VuIDxsdmFsPiBCT09MRUFOX0xJVEVSQUwKKyV0b2tlbiA8dHN5bT4gVFlQRU5BTUUKKyV0eXBlIDxzdmFsPiBOYW1lIFNpbXBsZU5hbWUgUXVhbGlmaWVkTmFtZSBGb3JjZWROYW1lCisKKy8qIEEgTkFNRV9PUl9JTlQgaXMgYSBzeW1ib2wgd2hpY2ggaXMgbm90IGtub3duIGluIHRoZSBzeW1ib2wgdGFibGUsCisgICBidXQgd2hpY2ggd291bGQgcGFyc2UgYXMgYSB2YWxpZCBudW1iZXIgaW4gdGhlIGN1cnJlbnQgaW5wdXQgcmFkaXguCisgICBFLmcuICJjIiB3aGVuIGlucHV0X3JhZGl4PT0xNi4gIERlcGVuZGluZyBvbiB0aGUgcGFyc2UsIGl0IHdpbGwgYmUKKyAgIHR1cm5lZCBpbnRvIGEgbmFtZSBvciBpbnRvIGEgbnVtYmVyLiAgKi8KKworJXRva2VuIDxzdmFsPiBOQU1FX09SX0lOVCAKKworJXRva2VuIEVSUk9SCisKKy8qIFNwZWNpYWwgdHlwZSBjYXNlcywgcHV0IGluIHRvIGFsbG93IHRoZSBwYXJzZXIgdG8gZGlzdGluZ3Vpc2ggZGlmZmVyZW50CisgICBsZWdhbCBiYXNldHlwZXMuICAqLworJXRva2VuIExPTkcgU0hPUlQgQllURSBJTlQgQ0hBUiBCT09MRUFOIERPVUJMRSBGTE9BVAorCisldG9rZW4gVkFSSUFCTEUKKworJXRva2VuIDxvcGNvZGU+IEFTU0lHTl9NT0RJRlkKKworJXRva2VuIFRISVMgU1VQRVIgTkVXCisKKyVsZWZ0ICcsJworJXJpZ2h0ICc9JyBBU1NJR05fTU9ESUZZCislcmlnaHQgJz8nCislbGVmdCBPUk9SCislbGVmdCBBTkRBTkQKKyVsZWZ0ICd8JworJWxlZnQgJ14nCislbGVmdCAnJicKKyVsZWZ0IEVRVUFMIE5PVEVRVUFMCislbGVmdCAnPCcgJz4nIExFUSBHRVEKKyVsZWZ0IExTSCBSU0gKKyVsZWZ0ICcrJyAnLScKKyVsZWZ0ICcqJyAnLycgJyUnCislcmlnaHQgSU5DUkVNRU5UIERFQ1JFTUVOVAorJXJpZ2h0ICcuJyAnWycgJygnCisKKwwKKyUlCisKK3N0YXJ0ICAgOglleHAxCisJfAl0eXBlX2V4cAorCTsKKwordHlwZV9leHA6CVByaW1pdGl2ZU9yQXJyYXlUeXBlCisJCXsKKwkJICB3cml0ZV9leHBfZWx0X29wY29kZShPUF9UWVBFKTsKKwkJICB3cml0ZV9leHBfZWx0X3R5cGUoJDEpOworCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpOworCQl9CisJOworCitQcmltaXRpdmVPckFycmF5VHlwZToKKwkJUHJpbWl0aXZlVHlwZQorCXwJQXJyYXlUeXBlCisJOworCitTdHJpbmdMaXRlcmFsOgorCVNUUklOR19MSVRFUkFMCisJCXsKKwkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfU1RSSU5HKTsKKwkJICB3cml0ZV9leHBfc3RyaW5nICgkMSk7CisJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1NUUklORyk7CisJCX0KKzsKKworTGl0ZXJhbDoKKwlJTlRFR0VSX0xJVEVSQUwKKwkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7CisJCSAgd3JpdGVfZXhwX2VsdF90eXBlICgkMS50eXBlKTsKKwkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSgkMS52YWwpKTsKKwkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IH0KK3wJTkFNRV9PUl9JTlQKKwkJeyBZWVNUWVBFIHZhbDsKKwkJICBwYXJzZV9udW1iZXIgKCQxLnB0ciwgJDEubGVuZ3RoLCAwLCAmdmFsKTsKKwkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7CisJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh2YWwudHlwZWRfdmFsX2ludC50eXBlKTsKKwkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKXZhbC50eXBlZF92YWxfaW50LnZhbCk7CisJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOworCQl9Cit8CUZMT0FUSU5HX1BPSU5UX0xJVEVSQUwKKwkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRE9VQkxFKTsKKwkJICB3cml0ZV9leHBfZWx0X3R5cGUgKCQxLnR5cGUpOworCQkgIHdyaXRlX2V4cF9lbHRfZGJsY3N0ICgkMS5kdmFsKTsKKwkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRE9VQkxFKTsgfQorfAlCT09MRUFOX0xJVEVSQUwKKwkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7CisJCSAgd3JpdGVfZXhwX2VsdF90eXBlIChqYXZhX2Jvb2xlYW5fdHlwZSk7CisJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkkMSk7CisJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOyB9Cit8CVN0cmluZ0xpdGVyYWwKKwk7CisKKy8qIFVOVVNFRDoKK1R5cGU6CisJUHJpbWl0aXZlVHlwZQorfAlSZWZlcmVuY2VUeXBlCis7CisqLworCitQcmltaXRpdmVUeXBlOgorCU51bWVyaWNUeXBlCit8CUJPT0xFQU4KKwkJeyAkJCA9IGphdmFfYm9vbGVhbl90eXBlOyB9Cis7CisKK051bWVyaWNUeXBlOgorCUludGVncmFsVHlwZQorfAlGbG9hdGluZ1BvaW50VHlwZQorOworCitJbnRlZ3JhbFR5cGU6CisJQllURQorCQl7ICQkID0gamF2YV9ieXRlX3R5cGU7IH0KK3wJU0hPUlQKKwkJeyAkJCA9IGphdmFfc2hvcnRfdHlwZTsgfQorfAlJTlQKKwkJeyAkJCA9IGphdmFfaW50X3R5cGU7IH0KK3wJTE9ORworCQl7ICQkID0gamF2YV9sb25nX3R5cGU7IH0KK3wJQ0hBUgorCQl7ICQkID0gamF2YV9jaGFyX3R5cGU7IH0KKzsKKworRmxvYXRpbmdQb2ludFR5cGU6CisJRkxPQVQKKwkJeyAkJCA9IGphdmFfZmxvYXRfdHlwZTsgfQorfAlET1VCTEUKKwkJeyAkJCA9IGphdmFfZG91YmxlX3R5cGU7IH0KKzsKKworLyogVU5VU0VEOgorUmVmZXJlbmNlVHlwZToKKwlDbGFzc09ySW50ZXJmYWNlVHlwZQorfAlBcnJheVR5cGUKKzsKKyovCisKK0NsYXNzT3JJbnRlcmZhY2VUeXBlOgorCU5hbWUKKwkJeyAkJCA9IGphdmFfdHlwZV9mcm9tX25hbWUgKCQxKTsgfQorOworCitDbGFzc1R5cGU6CisJQ2xhc3NPckludGVyZmFjZVR5cGUKKzsKKworQXJyYXlUeXBlOgorCVByaW1pdGl2ZVR5cGUgRGltcworCQl7ICQkID0gamF2YV9hcnJheV90eXBlICgkMSwgJDIpOyB9Cit8CU5hbWUgRGltcworCQl7ICQkID0gamF2YV9hcnJheV90eXBlIChqYXZhX3R5cGVfZnJvbV9uYW1lICgkMSksICQyKTsgfQorOworCitOYW1lOgorCUlERU5USUZJRVIKK3wJUXVhbGlmaWVkTmFtZQorOworCitGb3JjZWROYW1lOgorCVNpbXBsZU5hbWUKK3wJUXVhbGlmaWVkTmFtZQorOworCitTaW1wbGVOYW1lOgorCUlERU5USUZJRVIKK3wJTkFNRV9PUl9JTlQKKzsKKworUXVhbGlmaWVkTmFtZToKKwlOYW1lICcuJyBTaW1wbGVOYW1lCisJCXsgJCQubGVuZ3RoID0gJDEubGVuZ3RoICsgJDMubGVuZ3RoICsgMTsKKwkJICBpZiAoJDEucHRyICsgJDEubGVuZ3RoICsgMSA9PSAkMy5wdHIKKwkJICAgICAgJiYgJDEucHRyWyQxLmxlbmd0aF0gPT0gJy4nKQorCQkgICAgJCQucHRyID0gJDEucHRyOyAgLyogT3B0aW1pemF0aW9uLiAqLworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgJCQucHRyID0gKGNoYXIgKikgbWFsbG9jICgkJC5sZW5ndGggKyAxKTsKKwkJICAgICAgbWFrZV9jbGVhbnVwIChmcmVlLCAkJC5wdHIpOworCQkgICAgICBzcHJpbnRmICgkJC5wdHIsICIlLipzLiUuKnMiLAorCQkJICAgICAgICQxLmxlbmd0aCwgJDEucHRyLCAkMy5sZW5ndGgsICQzLnB0cik7CisJCX0gfQorOworCisvKgordHlwZV9leHA6CXR5cGUKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSgkMSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpO30KKwk7CisJKi8KKworLyogRXhwcmVzc2lvbnMsIGluY2x1ZGluZyB0aGUgY29tbWEgb3BlcmF0b3IuICAqLworZXhwMQk6CUV4cHJlc3Npb24KKwl8CWV4cDEgJywnIEV4cHJlc3Npb24KKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0NPTU1BKTsgfQorCTsKKworUHJpbWFyeToKKwlQcmltYXJ5Tm9OZXdBcnJheQorfAlBcnJheUNyZWF0aW9uRXhwcmVzc2lvbgorOworCitQcmltYXJ5Tm9OZXdBcnJheToKKwlMaXRlcmFsCit8CVRISVMKKwkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVEhJUyk7CisJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1RISVMpOyB9Cit8CScoJyBFeHByZXNzaW9uICcpJworfAlDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uCit8CUZpZWxkQWNjZXNzCit8CU1ldGhvZEludm9jYXRpb24KK3wJQXJyYXlBY2Nlc3MKK3wJbGN1cmx5IEFyZ3VtZW50TGlzdCByY3VybHkKKwkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQVJSQVkpOworCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIDApOworCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpICQzKTsKKwkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQVJSQVkpOyB9Cis7CisKK2xjdXJseToKKwkneycKKwkJeyBzdGFydF9hcmdsaXN0ICgpOyB9Cis7CisKK3JjdXJseToKKwknfScKKwkJeyAkJCA9IGVuZF9hcmdsaXN0ICgpIC0gMTsgfQorOworCitDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uOgorCU5FVyBDbGFzc1R5cGUgJygnIEFyZ3VtZW50TGlzdF9vcHQgJyknCisJCXsgZXJyb3IgKCJGSVhNRSAtIENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24iKTsgfQorOworCitBcmd1bWVudExpc3Q6CisJRXhwcmVzc2lvbgorCQl7IGFyZ2xpc3RfbGVuID0gMTsgfQorfAlBcmd1bWVudExpc3QgJywnIEV4cHJlc3Npb24KKwkJeyBhcmdsaXN0X2xlbisrOyB9Cis7CisKK0FyZ3VtZW50TGlzdF9vcHQ6CisJLyogRU1QVFkgKi8KKwkJeyBhcmdsaXN0X2xlbiA9IDA7IH0KK3wgQXJndW1lbnRMaXN0Cis7CisKK0FycmF5Q3JlYXRpb25FeHByZXNzaW9uOgorCU5FVyBQcmltaXRpdmVUeXBlIERpbUV4cHJzIERpbXNfb3B0CisJCXsgZXJyb3IgKCJGSVhNRSAtIEFycmF5Q3JlYXRpaW9uRXhwcmVzc2lvbiIpOyB9Cit8CU5FVyBDbGFzc09ySW50ZXJmYWNlVHlwZSBEaW1FeHBycyBEaW1zX29wdAorCQl7IGVycm9yICgiRklYTUUgLSBBcnJheUNyZWF0aWlvbkV4cHJlc3Npb24iKTsgfQorOworCitEaW1FeHByczoKKwlEaW1FeHByCit8CURpbUV4cHJzIERpbUV4cHIKKzsKKworRGltRXhwcjoKKwknWycgRXhwcmVzc2lvbiAnXScKKzsKKworRGltczoKKwknWycgJ10nCisJCXsgJCQgPSAxOyB9Cit8CURpbXMgJ1snICddJworCXsgJCQgPSAkMSArIDE7IH0KKzsKKworRGltc19vcHQ6CisJRGltcworfAkvKiBFTVBUWSAqLworCQl7ICQkID0gMDsgfQorOworCitGaWVsZEFjY2VzczoKKwlQcmltYXJ5ICcuJyBTaW1wbGVOYW1lCisJCXsgcHVzaF9maWVsZG5hbWVzICgkMyk7IH0KK3wJVkFSSUFCTEUgJy4nIFNpbXBsZU5hbWUKKwkJeyBwdXNoX2ZpZWxkbmFtZXMgKCQzKTsgfQorLyp8CVNVUEVSICcuJyBTaW1wbGVOYW1lIHsgRklYTUUgfSAqLworOworCitNZXRob2RJbnZvY2F0aW9uOgorCU5hbWUgJygnIEFyZ3VtZW50TGlzdF9vcHQgJyknCisJCXsgZXJyb3IgKCJtZXRob2QgaW52b2NhdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsgfQorfAlQcmltYXJ5ICcuJyBTaW1wbGVOYW1lICcoJyBBcmd1bWVudExpc3Rfb3B0ICcpJworCQl7IGVycm9yICgibWV0aG9kIGludm9jYXRpb24gbm90IGltcGxlbWVudGVkIik7IH0KK3wJU1VQRVIgJy4nIFNpbXBsZU5hbWUgJygnIEFyZ3VtZW50TGlzdF9vcHQgJyknCisJCXsgZXJyb3IgKCJtZXRob2QgaW52b2NhdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsgfQorOworCitBcnJheUFjY2VzczoKKwlOYW1lICdbJyBFeHByZXNzaW9uICddJworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIEVtaXQgY29kZSBmb3IgdGhlIE5hbWUgbm93LCB0aGVuIGV4Y2hhbmdlIGl0IGluIHRoZQorCQkgICAgIGV4cG91dCBhcnJheSB3aXRoIHRoZSBFeHByZXNzaW9uJ3MgY29kZS4gIFdlIGNvdWxkCisJCSAgICAgaW50cm9kdWNlIGEgT1BfU1dBUCBjb2RlIG9yIGEgcmV2ZXJzZWQgdmVyc2lvbiBvZgorCQkgICAgIEJJTk9QX1NVQlNDUklQVCwgYnV0IHRoYXQgbWFrZXMgdGhlIHJlc3Qgb2YgR0RCIHBheQorCQkgICAgIGZvciBvdXIgcGFyc2luZyBrbHVkZ2VzLiAgKi8KKwkJICBzdHJ1Y3QgZXhwcmVzc2lvbiAqbmFtZV9leHByOworCisJCSAgcHVzaF9leHByZXNzaW9uX25hbWUgKCQxKTsKKwkJICBuYW1lX2V4cHIgPSBjb3B5X2V4cCAoZXhwb3V0LCBleHBvdXRfcHRyKTsKKwkJICBleHBvdXRfcHRyIC09IG5hbWVfZXhwci0+bmVsdHM7CisJCSAgaW5zZXJ0X2V4cCAoZXhwb3V0X3B0ci1sZW5ndGhfb2Zfc3ViZXhwIChleHBvdXQsIGV4cG91dF9wdHIpLAorCQkJICAgICAgbmFtZV9leHByKTsKKwkJICBmcmVlIChuYW1lX2V4cHIpOworCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9TVUJTQ1JJUFQpOworCQl9Cit8CVZBUklBQkxFICdbJyBFeHByZXNzaW9uICddJworCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9TVUJTQ1JJUFQpOyB9Cit8CVByaW1hcnlOb05ld0FycmF5ICdbJyBFeHByZXNzaW9uICddJworCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9TVUJTQ1JJUFQpOyB9Cis7CisKK1Bvc3RmaXhFeHByZXNzaW9uOgorCVByaW1hcnkKK3wJTmFtZQorCQl7IHB1c2hfZXhwcmVzc2lvbl9uYW1lICgkMSk7IH0KK3wJVkFSSUFCTEUKKwkJLyogQWxyZWFkeSB3cml0dGVuIGJ5IHdyaXRlX2RvbGxhcl92YXJpYWJsZS4gKi8KK3wJUG9zdEluY3JlbWVudEV4cHJlc3Npb24KK3wJUG9zdERlY3JlbWVudEV4cHJlc3Npb24KKzsKKworUG9zdEluY3JlbWVudEV4cHJlc3Npb246CisJUG9zdGZpeEV4cHJlc3Npb24gSU5DUkVNRU5UCisJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfUE9TVElOQ1JFTUVOVCk7IH0KKzsKKworUG9zdERlY3JlbWVudEV4cHJlc3Npb246CisJUG9zdGZpeEV4cHJlc3Npb24gREVDUkVNRU5UCisJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfUE9TVERFQ1JFTUVOVCk7IH0KKzsKKworVW5hcnlFeHByZXNzaW9uOgorCVByZUluY3JlbWVudEV4cHJlc3Npb24KK3wJUHJlRGVjcmVtZW50RXhwcmVzc2lvbgorfAknKycgVW5hcnlFeHByZXNzaW9uCit8CSctJyBVbmFyeUV4cHJlc3Npb24KKwkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9ORUcpOyB9Cit8CScqJyBVbmFyeUV4cHJlc3Npb24gCisJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfSU5EKTsgfSAvKkZJWE1FIG5vdCBpbiBKYXZhICAqLworfAlVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKKzsKKworUHJlSW5jcmVtZW50RXhwcmVzc2lvbjoKKwlJTkNSRU1FTlQgVW5hcnlFeHByZXNzaW9uCisJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfUFJFSU5DUkVNRU5UKTsgfQorOworCitQcmVEZWNyZW1lbnRFeHByZXNzaW9uOgorCURFQ1JFTUVOVCBVbmFyeUV4cHJlc3Npb24KKwkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9QUkVERUNSRU1FTlQpOyB9Cis7CisKK1VuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51czoKKwlQb3N0Zml4RXhwcmVzc2lvbgorfAknficgVW5hcnlFeHByZXNzaW9uCisJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ09NUExFTUVOVCk7IH0KK3wJJyEnIFVuYXJ5RXhwcmVzc2lvbgorCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0xPR0lDQUxfTk9UKTsgfQorfAlDYXN0RXhwcmVzc2lvbgorCTsKKworQ2FzdEV4cHJlc3Npb246CisJJygnIFByaW1pdGl2ZVR5cGUgRGltc19vcHQgJyknIFVuYXJ5RXhwcmVzc2lvbgorCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOworCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoamF2YV9hcnJheV90eXBlICgkMiwgJDMpKTsKKwkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsgfQorfAknKCcgRXhwcmVzc2lvbiAnKScgVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCisJCXsKKwkJICBpbnQgZXhwX3NpemUgPSBleHBvdXRfcHRyOworCQkgIGludCBsYXN0X2V4cF9zaXplID0gbGVuZ3RoX29mX3N1YmV4cChleHBvdXQsIGV4cG91dF9wdHIpOworCQkgIHN0cnVjdCB0eXBlICp0eXBlOworCQkgIGludCBpOworCQkgIGludCBiYXNlID0gZXhwb3V0X3B0ciAtIGxhc3RfZXhwX3NpemUgLSAzOworCQkgIGlmIChiYXNlIDwgMCB8fCBleHBvdXQtPmVsdHNbYmFzZSsyXS5vcGNvZGUgIT0gT1BfVFlQRSkKKwkJICAgIGVycm9yICgiaW52YWxpZCBjYXN0IGV4cHJlc3Npb24iKTsKKwkJICB0eXBlID0gZXhwb3V0LT5lbHRzW2Jhc2UrMV0udHlwZTsKKwkJICAvKiBSZW1vdmUgdGhlICdFeHByZXNzaW9uJyBhbmQgc2xpZGUgdGhlCisJCSAgICAgVW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzIGRvd24gdG8gcmVwbGFjZSBpdC4gKi8KKwkJICBmb3IgKGkgPSAwOyAgaSA8IGxhc3RfZXhwX3NpemU7ICBpKyspCisJCSAgICBleHBvdXQtPmVsdHNbYmFzZSArIGldID0gZXhwb3V0LT5lbHRzW2Jhc2UgKyBpICsgM107CisJCSAgZXhwb3V0X3B0ciAtPSAzOworCQkgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9TVFJVQ1QpCisJCSAgICB0eXBlID0gbG9va3VwX3BvaW50ZXJfdHlwZSAodHlwZSk7CisJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7CisJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh0eXBlKTsKKwkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsKKwkJfQorfAknKCcgTmFtZSBEaW1zICcpJyBVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKKwkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsKKwkJICB3cml0ZV9leHBfZWx0X3R5cGUgKGphdmFfYXJyYXlfdHlwZSAoamF2YV90eXBlX2Zyb21fbmFtZSAoJDIpLCAkMykpOworCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOyB9Cis7CisKKworTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uOgorCVVuYXJ5RXhwcmVzc2lvbgorfAlNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gJyonIFVuYXJ5RXhwcmVzc2lvbgorCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9NVUwpOyB9Cit8CU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAnLycgVW5hcnlFeHByZXNzaW9uCisJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0RJVik7IH0KK3wJTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICclJyBVbmFyeUV4cHJlc3Npb24KKwkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfUkVNKTsgfQorOworCitBZGRpdGl2ZUV4cHJlc3Npb246CisJTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCit8CUFkZGl0aXZlRXhwcmVzc2lvbiAnKycgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCisJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FERCk7IH0KK3wJQWRkaXRpdmVFeHByZXNzaW9uICctJyBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KKwkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfU1VCKTsgfQorOworCitTaGlmdEV4cHJlc3Npb246CisJQWRkaXRpdmVFeHByZXNzaW9uCit8CVNoaWZ0RXhwcmVzc2lvbiBMU0ggQWRkaXRpdmVFeHByZXNzaW9uCisJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xTSCk7IH0KK3wJU2hpZnRFeHByZXNzaW9uIFJTSCBBZGRpdGl2ZUV4cHJlc3Npb24KKwkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfUlNIKTsgfQorLyogfAlTaGlmdEV4cHJlc3Npb24gPj4+IEFkZGl0aXZlRXhwcmVzc2lvbiB7IEZJWE1FIH0gKi8KKzsKKworUmVsYXRpb25hbEV4cHJlc3Npb246CisJU2hpZnRFeHByZXNzaW9uCit8CVJlbGF0aW9uYWxFeHByZXNzaW9uICc8JyBTaGlmdEV4cHJlc3Npb24KKwkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTEVTUyk7IH0KK3wJUmVsYXRpb25hbEV4cHJlc3Npb24gJz4nIFNoaWZ0RXhwcmVzc2lvbgorCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9HVFIpOyB9Cit8CVJlbGF0aW9uYWxFeHByZXNzaW9uIExFUSBTaGlmdEV4cHJlc3Npb24KKwkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTEVRKTsgfQorfAlSZWxhdGlvbmFsRXhwcmVzc2lvbiBHRVEgU2hpZnRFeHByZXNzaW9uCisJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0dFUSk7IH0KKy8qIHwgUmVsYXRpb25hbEV4cHJlc2lvbiBJTlNUQU5DRU9GIFJlZmVyZW5jZVR5cGUgeyBGSVhNRSB9ICovCis7CisKK0VxdWFsaXR5RXhwcmVzc2lvbjoKKwlSZWxhdGlvbmFsRXhwcmVzc2lvbgorfAlFcXVhbGl0eUV4cHJlc3Npb24gRVFVQUwgUmVsYXRpb25hbEV4cHJlc3Npb24KKwkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfRVFVQUwpOyB9Cit8CUVxdWFsaXR5RXhwcmVzc2lvbiBOT1RFUVVBTCBSZWxhdGlvbmFsRXhwcmVzc2lvbgorCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9OT1RFUVVBTCk7IH0KKzsKKworQW5kRXhwcmVzc2lvbjoKKwlFcXVhbGl0eUV4cHJlc3Npb24KK3wJQW5kRXhwcmVzc2lvbiAnJicgRXF1YWxpdHlFeHByZXNzaW9uCisJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0JJVFdJU0VfQU5EKTsgfQorOworCitFeGNsdXNpdmVPckV4cHJlc3Npb246CisJQW5kRXhwcmVzc2lvbgorfAlFeGNsdXNpdmVPckV4cHJlc3Npb24gJ14nIEFuZEV4cHJlc3Npb24KKwkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQklUV0lTRV9YT1IpOyB9Cis7CitJbmNsdXNpdmVPckV4cHJlc3Npb246CisJRXhjbHVzaXZlT3JFeHByZXNzaW9uCit8CUluY2x1c2l2ZU9yRXhwcmVzc2lvbiAnfCcgRXhjbHVzaXZlT3JFeHByZXNzaW9uCisJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0JJVFdJU0VfSU9SKTsgfQorOworCitDb25kaXRpb25hbEFuZEV4cHJlc3Npb246CisJSW5jbHVzaXZlT3JFeHByZXNzaW9uCit8CUNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiBBTkRBTkQgSW5jbHVzaXZlT3JFeHByZXNzaW9uCisJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xPR0lDQUxfQU5EKTsgfQorOworCitDb25kaXRpb25hbE9yRXhwcmVzc2lvbjoKKwlDb25kaXRpb25hbEFuZEV4cHJlc3Npb24KK3wJQ29uZGl0aW9uYWxPckV4cHJlc3Npb24gT1JPUiBDb25kaXRpb25hbEFuZEV4cHJlc3Npb24KKwkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTE9HSUNBTF9PUik7IH0KKzsKKworQ29uZGl0aW9uYWxFeHByZXNzaW9uOgorCUNvbmRpdGlvbmFsT3JFeHByZXNzaW9uCit8CUNvbmRpdGlvbmFsT3JFeHByZXNzaW9uICc/JyBFeHByZXNzaW9uICc6JyBDb25kaXRpb25hbEV4cHJlc3Npb24KKwkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoVEVSTk9QX0NPTkQpOyB9Cis7CisKK0Fzc2lnbm1lbnRFeHByZXNzaW9uOgorCUNvbmRpdGlvbmFsRXhwcmVzc2lvbgorfAlBc3NpZ25tZW50Cis7CisJCQkgIAorQXNzaWdubWVudDoKKwlMZWZ0SGFuZFNpZGUgJz0nIENvbmRpdGlvbmFsRXhwcmVzc2lvbgorCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BU1NJR04pOyB9Cit8CUxlZnRIYW5kU2lkZSBBU1NJR05fTU9ESUZZIENvbmRpdGlvbmFsRXhwcmVzc2lvbgorCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BU1NJR05fTU9ESUZZKTsKKwkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoJDIpOworCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BU1NJR05fTU9ESUZZKTsgfQorOworCitMZWZ0SGFuZFNpZGU6CisJRm9yY2VkTmFtZQorCQl7IHB1c2hfZXhwcmVzc2lvbl9uYW1lICgkMSk7IH0KK3wJVkFSSUFCTEUKKwkJLyogQWxyZWFkeSB3cml0dGVuIGJ5IHdyaXRlX2RvbGxhcl92YXJpYWJsZS4gKi8KK3wJRmllbGRBY2Nlc3MKK3wJQXJyYXlBY2Nlc3MKKzsKKworCitFeHByZXNzaW9uOgorCUFzc2lnbm1lbnRFeHByZXNzaW9uCis7CisKKyUlCisvKiBUYWtlIGNhcmUgb2YgcGFyc2luZyBhIG51bWJlciAoYW55dGhpbmcgdGhhdCBzdGFydHMgd2l0aCBhIGRpZ2l0KS4KKyAgIFNldCB5eWx2YWwgYW5kIHJldHVybiB0aGUgdG9rZW4gdHlwZTsgdXBkYXRlIGxleHB0ci4KKyAgIExFTiBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gaXQuICAqLworCisvKioqIE5lZWRzIHNvbWUgZXJyb3IgY2hlY2tpbmcgZm9yIHRoZSBmbG9hdCBjYXNlICoqKi8KKworc3RhdGljIGludAorcGFyc2VfbnVtYmVyIChwLCBsZW4sIHBhcnNlZF9mbG9hdCwgcHV0aXRoZXJlKQorICAgICByZWdpc3RlciBjaGFyICpwOworICAgICByZWdpc3RlciBpbnQgbGVuOworICAgICBpbnQgcGFyc2VkX2Zsb2F0OworICAgICBZWVNUWVBFICpwdXRpdGhlcmU7Cit7CisgIHJlZ2lzdGVyIFVMT05HRVNUIG4gPSAwOworICBVTE9OR0VTVCBsaW1pdCwgbGltaXRfZGl2X2Jhc2U7CisKKyAgcmVnaXN0ZXIgaW50IGM7CisgIHJlZ2lzdGVyIGludCBiYXNlID0gaW5wdXRfcmFkaXg7CisKKyAgc3RydWN0IHR5cGUgKnR5cGU7CisKKyAgaWYgKHBhcnNlZF9mbG9hdCkKKyAgICB7CisgICAgICAvKiBJdCdzIGEgZmxvYXQgc2luY2UgaXQgY29udGFpbnMgYSBwb2ludCBvciBhbiBleHBvbmVudC4gICovCisgICAgICBjaGFyIGM7CisgICAgICBpbnQgbnVtID0gMDsJLyogbnVtYmVyIG9mIHRva2VucyBzY2FubmVkIGJ5IHNjYW5mICovCisgICAgICBjaGFyIHNhdmVkX2NoYXIgPSBwW2xlbl07CisKKyAgICAgIHBbbGVuXSA9IDA7CS8qIG51bGwtdGVybWluYXRlIHRoZSB0b2tlbiAqLworICAgICAgaWYgKHNpemVvZiAocHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQuZHZhbCkgPD0gc2l6ZW9mIChmbG9hdCkpCisJbnVtID0gc3NjYW5mIChwLCAiJWclYyIsIChmbG9hdCAqKSAmcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQuZHZhbCwgJmMpOworICAgICAgZWxzZSBpZiAoc2l6ZW9mIChwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC5kdmFsKSA8PSBzaXplb2YgKGRvdWJsZSkpCisJbnVtID0gc3NjYW5mIChwLCAiJWxnJWMiLCAoZG91YmxlICopICZwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC5kdmFsLCAmYyk7CisgICAgICBlbHNlCisJeworI2lmZGVmIFNDQU5GX0hBU19MT05HX0RPVUJMRQorCSAgbnVtID0gc3NjYW5mIChwLCAiJUxnJWMiLCAmcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQuZHZhbCwgJmMpOworI2Vsc2UKKwkgIC8qIFNjYW4gaXQgaW50byBhIGRvdWJsZSwgdGhlbiBhc3NpZ24gaXQgdG8gdGhlIGxvbmcgZG91YmxlLgorCSAgICAgVGhpcyBhdCBsZWFzdCB3aW5zIHdpdGggdmFsdWVzIHJlcHJlc2VudGFibGUgaW4gdGhlIHJhbmdlCisJICAgICBvZiBkb3VibGVzLiAqLworCSAgZG91YmxlIHRlbXA7CisJICBudW0gPSBzc2NhbmYgKHAsICIlbGclYyIsICZ0ZW1wLCAmYyk7CisJICBwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC5kdmFsID0gdGVtcDsKKyNlbmRpZgorCX0KKyAgICAgIHBbbGVuXSA9IHNhdmVkX2NoYXI7CS8qIHJlc3RvcmUgdGhlIGlucHV0IHN0cmVhbSAqLworICAgICAgaWYgKG51bSAhPSAxKSAJCS8qIGNoZWNrIHNjYW5mIGZvdW5kIE9OTFkgYSBmbG9hdCAuLi4gKi8KKwlyZXR1cm4gRVJST1I7CisgICAgICAvKiBTZWUgaWYgaXQgaGFzIGBmJyBvciBgZCcgc3VmZml4IChmbG9hdCBvciBkb3VibGUpLiAgKi8KKworICAgICAgYyA9IHRvbG93ZXIgKHBbbGVuIC0gMV0pOworCisgICAgICBpZiAoYyA9PSAnZicgfHwgYyA9PSAnRicpCisJcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQudHlwZSA9IGJ1aWx0aW5fdHlwZV9mbG9hdDsKKyAgICAgIGVsc2UgaWYgKGlzZGlnaXQgKGMpIHx8IGMgPT0gJy4nIHx8IGMgPT0gJ2QnIHx8IGMgPT0gJ0QnKQorCXB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LnR5cGUgPSBidWlsdGluX3R5cGVfZG91YmxlOworICAgICAgZWxzZQorCXJldHVybiBFUlJPUjsKKworICAgICAgcmV0dXJuIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw7CisgICAgfQorCisgIC8qIEhhbmRsZSBiYXNlLXN3aXRjaGluZyBwcmVmaXhlcyAweCwgMHQsIDBkLCAwICovCisgIGlmIChwWzBdID09ICcwJykKKyAgICBzd2l0Y2ggKHBbMV0pCisgICAgICB7CisgICAgICBjYXNlICd4JzoKKyAgICAgIGNhc2UgJ1gnOgorCWlmIChsZW4gPj0gMykKKwkgIHsKKwkgICAgcCArPSAyOworCSAgICBiYXNlID0gMTY7CisJICAgIGxlbiAtPSAyOworCSAgfQorCWJyZWFrOworCisgICAgICBjYXNlICd0JzoKKyAgICAgIGNhc2UgJ1QnOgorICAgICAgY2FzZSAnZCc6CisgICAgICBjYXNlICdEJzoKKwlpZiAobGVuID49IDMpCisJICB7CisJICAgIHAgKz0gMjsKKwkgICAgYmFzZSA9IDEwOworCSAgICBsZW4gLT0gMjsKKwkgIH0KKwlicmVhazsKKworICAgICAgZGVmYXVsdDoKKwliYXNlID0gODsKKwlicmVhazsKKyAgICAgIH0KKworICBjID0gcFtsZW4tMV07CisgIGxpbWl0ID0gKFVMT05HRVNUKTB4ZmZmZmZmZmY7CisgIGlmIChjID09ICdsJyB8fCBjID09ICdMJykKKyAgICB7CisgICAgICB0eXBlID0gamF2YV9sb25nX3R5cGU7CisgICAgICBsZW4tLTsKKyAgICAgIC8qIEEgcGFyYW5vaWQgY2FsY3VsYXRpb24gb2YgKDE8PDY0KS0xLiAqLworICAgICAgbGltaXQgPSAoKGxpbWl0IDw8IDE2KSA8PCAxNikgfCBsaW1pdDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB0eXBlID0gamF2YV9pbnRfdHlwZTsKKyAgICB9CisgIGxpbWl0X2Rpdl9iYXNlID0gbGltaXQgLyAoVUxPTkdFU1QpIGJhc2U7CisKKyAgd2hpbGUgKC0tbGVuID49IDApCisgICAgeworICAgICAgYyA9ICpwKys7CisgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJYyAtPSAnMCc7CisgICAgICBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykKKwljIC09ICdBJyAtIDEwOworICAgICAgZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpCisJYyAtPSAnYScgLSAxMDsKKyAgICAgIGVsc2UKKwlyZXR1cm4gRVJST1I7CS8qIENoYXIgbm90IGEgZGlnaXQgKi8KKyAgICAgIGlmIChjID49IGJhc2UpCisJcmV0dXJuIEVSUk9SOworICAgICAgaWYgKG4gPiBsaW1pdF9kaXZfYmFzZQorCSAgfHwgKG4gKj0gYmFzZSkgPiBsaW1pdCAtIGMpCisJZXJyb3IgKCJOdW1lcmljIGNvbnN0YW50IHRvbyBsYXJnZS4iKTsKKyAgICAgIG4gKz0gYzsKKwl9CisKKyAgIHB1dGl0aGVyZS0+dHlwZWRfdmFsX2ludC52YWwgPSBuOworICAgcHV0aXRoZXJlLT50eXBlZF92YWxfaW50LnR5cGUgPSB0eXBlOworICAgcmV0dXJuIElOVEVHRVJfTElURVJBTDsKK30KKworc3RydWN0IHRva2VuCit7CisgIGNoYXIgKm9wZXJhdG9yOworICBpbnQgdG9rZW47CisgIGVudW0gZXhwX29wY29kZSBvcGNvZGU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRva2VuIHRva2VudGFiM1tdID0KKyAgeworICAgIHsiPj49IiwgQVNTSUdOX01PRElGWSwgQklOT1BfUlNIfSwKKyAgICB7Ijw8PSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX0xTSH0KKyAgfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2tlbiB0b2tlbnRhYjJbXSA9CisgIHsKKyAgICB7Iis9IiwgQVNTSUdOX01PRElGWSwgQklOT1BfQUREfSwKKyAgICB7Ii09IiwgQVNTSUdOX01PRElGWSwgQklOT1BfU1VCfSwKKyAgICB7Iio9IiwgQVNTSUdOX01PRElGWSwgQklOT1BfTVVMfSwKKyAgICB7Ii89IiwgQVNTSUdOX01PRElGWSwgQklOT1BfRElWfSwKKyAgICB7IiU9IiwgQVNTSUdOX01PRElGWSwgQklOT1BfUkVNfSwKKyAgICB7Inw9IiwgQVNTSUdOX01PRElGWSwgQklOT1BfQklUV0lTRV9JT1J9LAorICAgIHsiJj0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9CSVRXSVNFX0FORH0sCisgICAgeyJePSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX0JJVFdJU0VfWE9SfSwKKyAgICB7IisrIiwgSU5DUkVNRU5ULCBCSU5PUF9FTkR9LAorICAgIHsiLS0iLCBERUNSRU1FTlQsIEJJTk9QX0VORH0sCisgICAgeyImJiIsIEFOREFORCwgQklOT1BfRU5EfSwKKyAgICB7Inx8IiwgT1JPUiwgQklOT1BfRU5EfSwKKyAgICB7Ijw8IiwgTFNILCBCSU5PUF9FTkR9LAorICAgIHsiPj4iLCBSU0gsIEJJTk9QX0VORH0sCisgICAgeyI9PSIsIEVRVUFMLCBCSU5PUF9FTkR9LAorICAgIHsiIT0iLCBOT1RFUVVBTCwgQklOT1BfRU5EfSwKKyAgICB7Ijw9IiwgTEVRLCBCSU5PUF9FTkR9LAorICAgIHsiPj0iLCBHRVEsIEJJTk9QX0VORH0KKyAgfTsKKworLyogUmVhZCBvbmUgdG9rZW4sIGdldHRpbmcgY2hhcmFjdGVycyB0aHJvdWdoIGxleHB0ci4gICovCisKK3N0YXRpYyBpbnQKK3l5bGV4ICgpCit7CisgIGludCBjOworICBpbnQgbmFtZWxlbjsKKyAgdW5zaWduZWQgaW50IGk7CisgIGNoYXIgKnRva3N0YXJ0OworICBjaGFyICp0b2twdHI7CisgIGludCB0ZW1wYnVmaW5kZXg7CisgIHN0YXRpYyBjaGFyICp0ZW1wYnVmOworICBzdGF0aWMgaW50IHRlbXBidWZzaXplOworICAKKyByZXRyeToKKworICB0b2tzdGFydCA9IGxleHB0cjsKKyAgLyogU2VlIGlmIGl0IGlzIGEgc3BlY2lhbCB0b2tlbiBvZiBsZW5ndGggMy4gICovCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgdG9rZW50YWIzIC8gc2l6ZW9mIHRva2VudGFiM1swXTsgaSsrKQorICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCB0b2tlbnRhYjNbaV0ub3BlcmF0b3IsIDMpKQorICAgICAgeworCWxleHB0ciArPSAzOworCXl5bHZhbC5vcGNvZGUgPSB0b2tlbnRhYjNbaV0ub3Bjb2RlOworCXJldHVybiB0b2tlbnRhYjNbaV0udG9rZW47CisgICAgICB9CisKKyAgLyogU2VlIGlmIGl0IGlzIGEgc3BlY2lhbCB0b2tlbiBvZiBsZW5ndGggMi4gICovCisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgdG9rZW50YWIyIC8gc2l6ZW9mIHRva2VudGFiMlswXTsgaSsrKQorICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCB0b2tlbnRhYjJbaV0ub3BlcmF0b3IsIDIpKQorICAgICAgeworCWxleHB0ciArPSAyOworCXl5bHZhbC5vcGNvZGUgPSB0b2tlbnRhYjJbaV0ub3Bjb2RlOworCXJldHVybiB0b2tlbnRhYjJbaV0udG9rZW47CisgICAgICB9CisKKyAgc3dpdGNoIChjID0gKnRva3N0YXJ0KQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgJyAnOgorICAgIGNhc2UgJ1x0JzoKKyAgICBjYXNlICdcbic6CisgICAgICBsZXhwdHIrKzsKKyAgICAgIGdvdG8gcmV0cnk7CisKKyAgICBjYXNlICdcJyc6CisgICAgICAvKiBXZSBlaXRoZXIgaGF2ZSBhIGNoYXJhY3RlciBjb25zdGFudCAoJzAnIG9yICdcMTc3JyBmb3IgZXhhbXBsZSkKKwkgb3Igd2UgaGF2ZSBhIHF1b3RlZCBzeW1ib2wgcmVmZXJlbmNlICgnZm9vKGludCxpbnQpJyBpbiBDKysKKwkgZm9yIGV4YW1wbGUpLiAqLworICAgICAgbGV4cHRyKys7CisgICAgICBjID0gKmxleHB0cisrOworICAgICAgaWYgKGMgPT0gJ1xcJykKKwljID0gcGFyc2VfZXNjYXBlICgmbGV4cHRyKTsKKyAgICAgIGVsc2UgaWYgKGMgPT0gJ1wnJykKKwllcnJvciAoIkVtcHR5IGNoYXJhY3RlciBjb25zdGFudC4iKTsKKworICAgICAgeXlsdmFsLnR5cGVkX3ZhbF9pbnQudmFsID0gYzsKKyAgICAgIHl5bHZhbC50eXBlZF92YWxfaW50LnR5cGUgPSBidWlsdGluX3R5cGVfY2hhcjsKKworICAgICAgYyA9ICpsZXhwdHIrKzsKKyAgICAgIGlmIChjICE9ICdcJycpCisJeworCSAgbmFtZWxlbiA9IHNraXBfcXVvdGVkICh0b2tzdGFydCkgLSB0b2tzdGFydDsKKwkgIGlmIChuYW1lbGVuID4gMikKKwkgICAgeworCSAgICAgIGxleHB0ciA9IHRva3N0YXJ0ICsgbmFtZWxlbjsKKwkgICAgICBpZiAobGV4cHRyWy0xXSAhPSAnXCcnKQorCQllcnJvciAoIlVubWF0Y2hlZCBzaW5nbGUgcXVvdGUuIik7CisJICAgICAgbmFtZWxlbiAtPSAyOworCSAgICAgIHRva3N0YXJ0Kys7CisJICAgICAgZ290byB0cnluYW1lOworCSAgICB9CisJICBlcnJvciAoIkludmFsaWQgY2hhcmFjdGVyIGNvbnN0YW50LiIpOworCX0KKyAgICAgIHJldHVybiBJTlRFR0VSX0xJVEVSQUw7CisKKyAgICBjYXNlICcoJzoKKyAgICAgIHBhcmVuX2RlcHRoKys7CisgICAgICBsZXhwdHIrKzsKKyAgICAgIHJldHVybiBjOworCisgICAgY2FzZSAnKSc6CisgICAgICBpZiAocGFyZW5fZGVwdGggPT0gMCkKKwlyZXR1cm4gMDsKKyAgICAgIHBhcmVuX2RlcHRoLS07CisgICAgICBsZXhwdHIrKzsKKyAgICAgIHJldHVybiBjOworCisgICAgY2FzZSAnLCc6CisgICAgICBpZiAoY29tbWFfdGVybWluYXRlcyAmJiBwYXJlbl9kZXB0aCA9PSAwKQorCXJldHVybiAwOworICAgICAgbGV4cHRyKys7CisgICAgICByZXR1cm4gYzsKKworICAgIGNhc2UgJy4nOgorICAgICAgLyogTWlnaHQgYmUgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuICAqLworICAgICAgaWYgKGxleHB0clsxXSA8ICcwJyB8fCBsZXhwdHJbMV0gPiAnOScpCisJZ290byBzeW1ib2w7CQkvKiBOb3BlLCBtdXN0IGJlIGEgc3ltYm9sLiAqLworICAgICAgLyogRkFMTCBUSFJVIGludG8gbnVtYmVyIGNhc2UuICAqLworCisgICAgY2FzZSAnMCc6CisgICAgY2FzZSAnMSc6CisgICAgY2FzZSAnMic6CisgICAgY2FzZSAnMyc6CisgICAgY2FzZSAnNCc6CisgICAgY2FzZSAnNSc6CisgICAgY2FzZSAnNic6CisgICAgY2FzZSAnNyc6CisgICAgY2FzZSAnOCc6CisgICAgY2FzZSAnOSc6CisgICAgICB7CisJLyogSXQncyBhIG51bWJlci4gICovCisJaW50IGdvdF9kb3QgPSAwLCBnb3RfZSA9IDAsIHRva3R5cGU7CisJcmVnaXN0ZXIgY2hhciAqcCA9IHRva3N0YXJ0OworCWludCBoZXggPSBpbnB1dF9yYWRpeCA+IDEwOworCisJaWYgKGMgPT0gJzAnICYmIChwWzFdID09ICd4JyB8fCBwWzFdID09ICdYJykpCisJICB7CisJICAgIHAgKz0gMjsKKwkgICAgaGV4ID0gMTsKKwkgIH0KKwllbHNlIGlmIChjID09ICcwJyAmJiAocFsxXT09J3QnIHx8IHBbMV09PSdUJyB8fCBwWzFdPT0nZCcgfHwgcFsxXT09J0QnKSkKKwkgIHsKKwkgICAgcCArPSAyOworCSAgICBoZXggPSAwOworCSAgfQorCisJZm9yICg7OyArK3ApCisJICB7CisJICAgIC8qIFRoaXMgdGVzdCBpbmNsdWRlcyAhaGV4IGJlY2F1c2UgJ2UnIGlzIGEgdmFsaWQgaGV4IGRpZ2l0CisJICAgICAgIGFuZCB0aHVzIGRvZXMgbm90IGluZGljYXRlIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHdoZW4KKwkgICAgICAgdGhlIHJhZGl4IGlzIGhleC4gICovCisJICAgIGlmICghaGV4ICYmICFnb3RfZSAmJiAoKnAgPT0gJ2UnIHx8ICpwID09ICdFJykpCisJICAgICAgZ290X2RvdCA9IGdvdF9lID0gMTsKKwkgICAgLyogVGhpcyB0ZXN0IGRvZXMgbm90IGluY2x1ZGUgIWhleCwgYmVjYXVzZSBhICcuJyBhbHdheXMgaW5kaWNhdGVzCisJICAgICAgIGEgZGVjaW1hbCBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVnYXJkbGVzcyBvZiB0aGUgcmFkaXguICAqLworCSAgICBlbHNlIGlmICghZ290X2RvdCAmJiAqcCA9PSAnLicpCisJICAgICAgZ290X2RvdCA9IDE7CisJICAgIGVsc2UgaWYgKGdvdF9lICYmIChwWy0xXSA9PSAnZScgfHwgcFstMV0gPT0gJ0UnKQorCQkgICAgICYmICgqcCA9PSAnLScgfHwgKnAgPT0gJysnKSkKKwkgICAgICAvKiBUaGlzIGlzIHRoZSBzaWduIG9mIHRoZSBleHBvbmVudCwgbm90IHRoZSBlbmQgb2YgdGhlCisJCSBudW1iZXIuICAqLworCSAgICAgIGNvbnRpbnVlOworCSAgICAvKiBXZSB3aWxsIHRha2UgYW55IGxldHRlcnMgb3IgZGlnaXRzLiAgcGFyc2VfbnVtYmVyIHdpbGwKKwkgICAgICAgY29tcGxhaW4gaWYgcGFzdCB0aGUgcmFkaXgsIG9yIGlmIEwgb3IgVSBhcmUgbm90IGZpbmFsLiAgKi8KKwkgICAgZWxzZSBpZiAoKCpwIDwgJzAnIHx8ICpwID4gJzknKQorCQkgICAgICYmICgoKnAgPCAnYScgfHwgKnAgPiAneicpCisJCQkJICAmJiAoKnAgPCAnQScgfHwgKnAgPiAnWicpKSkKKwkgICAgICBicmVhazsKKwkgIH0KKwl0b2t0eXBlID0gcGFyc2VfbnVtYmVyICh0b2tzdGFydCwgcCAtIHRva3N0YXJ0LCBnb3RfZG90fGdvdF9lLCAmeXlsdmFsKTsKKyAgICAgICAgaWYgKHRva3R5cGUgPT0gRVJST1IpCisJICB7CisJICAgIGNoYXIgKmVycl9jb3B5ID0gKGNoYXIgKikgYWxsb2NhIChwIC0gdG9rc3RhcnQgKyAxKTsKKworCSAgICBtZW1jcHkgKGVycl9jb3B5LCB0b2tzdGFydCwgcCAtIHRva3N0YXJ0KTsKKwkgICAgZXJyX2NvcHlbcCAtIHRva3N0YXJ0XSA9IDA7CisJICAgIGVycm9yICgiSW52YWxpZCBudW1iZXIgXCIlc1wiLiIsIGVycl9jb3B5KTsKKwkgIH0KKwlsZXhwdHIgPSBwOworCXJldHVybiB0b2t0eXBlOworICAgICAgfQorCisgICAgY2FzZSAnKyc6CisgICAgY2FzZSAnLSc6CisgICAgY2FzZSAnKic6CisgICAgY2FzZSAnLyc6CisgICAgY2FzZSAnJSc6CisgICAgY2FzZSAnfCc6CisgICAgY2FzZSAnJic6CisgICAgY2FzZSAnXic6CisgICAgY2FzZSAnfic6CisgICAgY2FzZSAnISc6CisgICAgY2FzZSAnPCc6CisgICAgY2FzZSAnPic6CisgICAgY2FzZSAnWyc6CisgICAgY2FzZSAnXSc6CisgICAgY2FzZSAnPyc6CisgICAgY2FzZSAnOic6CisgICAgY2FzZSAnPSc6CisgICAgY2FzZSAneyc6CisgICAgY2FzZSAnfSc6CisgICAgc3ltYm9sOgorICAgICAgbGV4cHRyKys7CisgICAgICByZXR1cm4gYzsKKworICAgIGNhc2UgJyInOgorCisgICAgICAvKiBCdWlsZCB0aGUgZ2RiIGludGVybmFsIGZvcm0gb2YgdGhlIGlucHV0IHN0cmluZyBpbiB0ZW1wYnVmLAorCSB0cmFuc2xhdGluZyBhbnkgc3RhbmRhcmQgQyBlc2NhcGUgZm9ybXMgc2Vlbi4gIE5vdGUgdGhhdCB0aGUKKwkgYnVmZmVyIGlzIG51bGwgYnl0ZSB0ZXJtaW5hdGVkICpvbmx5KiBmb3IgdGhlIGNvbnZlbmllbmNlIG9mCisJIGRlYnVnZ2luZyBnZGIgaXRzZWxmIGFuZCBwcmludGluZyB0aGUgYnVmZmVyIGNvbnRlbnRzIHdoZW4KKwkgdGhlIGJ1ZmZlciBjb250YWlucyBubyBlbWJlZGRlZCBudWxscy4gIEdkYiBkb2VzIG5vdCBkZXBlbmQKKwkgdXBvbiB0aGUgYnVmZmVyIGJlaW5nIG51bGwgYnl0ZSB0ZXJtaW5hdGVkLCBpdCB1c2VzIHRoZSBsZW5ndGgKKwkgc3RyaW5nIGluc3RlYWQuICBUaGlzIGFsbG93cyBnZGIgdG8gaGFuZGxlIEMgc3RyaW5ncyAoYXMgd2VsbAorCSBhcyBzdHJpbmdzIGluIG90aGVyIGxhbmd1YWdlcykgd2l0aCBlbWJlZGRlZCBudWxsIGJ5dGVzICovCisKKyAgICAgIHRva3B0ciA9ICsrdG9rc3RhcnQ7CisgICAgICB0ZW1wYnVmaW5kZXggPSAwOworCisgICAgICBkbyB7CisJLyogR3JvdyB0aGUgc3RhdGljIHRlbXAgYnVmZmVyIGlmIG5lY2Vzc2FyeSwgaW5jbHVkaW5nIGFsbG9jYXRpbmcKKwkgICB0aGUgZmlyc3Qgb25lIG9uIGRlbWFuZC4gKi8KKwlpZiAodGVtcGJ1ZmluZGV4ICsgMSA+PSB0ZW1wYnVmc2l6ZSkKKwkgIHsKKwkgICAgdGVtcGJ1ZiA9IChjaGFyICopIHJlYWxsb2MgKHRlbXBidWYsIHRlbXBidWZzaXplICs9IDY0KTsKKwkgIH0KKwlzd2l0Y2ggKCp0b2twdHIpCisJICB7CisJICBjYXNlICdcMCc6CisJICBjYXNlICciJzoKKwkgICAgLyogRG8gbm90aGluZywgbG9vcCB3aWxsIHRlcm1pbmF0ZS4gKi8KKwkgICAgYnJlYWs7CisJICBjYXNlICdcXCc6CisJICAgIHRva3B0cisrOworCSAgICBjID0gcGFyc2VfZXNjYXBlICgmdG9rcHRyKTsKKwkgICAgaWYgKGMgPT0gLTEpCisJICAgICAgeworCQljb250aW51ZTsKKwkgICAgICB9CisJICAgIHRlbXBidWZbdGVtcGJ1ZmluZGV4KytdID0gYzsKKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICB0ZW1wYnVmW3RlbXBidWZpbmRleCsrXSA9ICp0b2twdHIrKzsKKwkgICAgYnJlYWs7CisJICB9CisgICAgICB9IHdoaWxlICgoKnRva3B0ciAhPSAnIicpICYmICgqdG9rcHRyICE9ICdcMCcpKTsKKyAgICAgIGlmICgqdG9rcHRyKysgIT0gJyInKQorCXsKKwkgIGVycm9yICgiVW50ZXJtaW5hdGVkIHN0cmluZyBpbiBleHByZXNzaW9uLiIpOworCX0KKyAgICAgIHRlbXBidWZbdGVtcGJ1ZmluZGV4XSA9ICdcMCc7CS8qIFNlZSBub3RlIGFib3ZlICovCisgICAgICB5eWx2YWwuc3ZhbC5wdHIgPSB0ZW1wYnVmOworICAgICAgeXlsdmFsLnN2YWwubGVuZ3RoID0gdGVtcGJ1ZmluZGV4OworICAgICAgbGV4cHRyID0gdG9rcHRyOworICAgICAgcmV0dXJuIChTVFJJTkdfTElURVJBTCk7CisgICAgfQorCisgIGlmICghKGMgPT0gJ18nIHx8IGMgPT0gJyQnCisJfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpKSkKKyAgICAvKiBXZSBtdXN0IGhhdmUgY29tZSBhY3Jvc3MgYSBiYWQgY2hhcmFjdGVyIChlLmcuICc7JykuICAqLworICAgIGVycm9yICgiSW52YWxpZCBjaGFyYWN0ZXIgJyVjJyBpbiBleHByZXNzaW9uLiIsIGMpOworCisgIC8qIEl0J3MgYSBuYW1lLiAgU2VlIGhvdyBsb25nIGl0IGlzLiAgKi8KKyAgbmFtZWxlbiA9IDA7CisgIGZvciAoYyA9IHRva3N0YXJ0W25hbWVsZW5dOworICAgICAgIChjID09ICdfJworCXx8IGMgPT0gJyQnCisJfHwgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCXx8IChjID49ICdhJyAmJiBjIDw9ICd6JykKKwl8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpCisJfHwgYyA9PSAnPCcpOworICAgICAgICkKKyAgICB7CisgICAgICBpZiAoYyA9PSAnPCcpCisJeworCSAgaW50IGkgPSBuYW1lbGVuOworCSAgd2hpbGUgKHRva3N0YXJ0WysraV0gJiYgdG9rc3RhcnRbaV0gIT0gJz4nKTsKKwkgIGlmICh0b2tzdGFydFtpXSA9PSAnPicpCisJICAgIG5hbWVsZW4gPSBpOworCX0KKyAgICAgICBjID0gdG9rc3RhcnRbKytuYW1lbGVuXTsKKyAgICAgfQorCisgIC8qIFRoZSB0b2tlbiAiaWYiIHRlcm1pbmF0ZXMgdGhlIGV4cHJlc3Npb24gYW5kIGlzIE5PVCAKKyAgICAgcmVtb3ZlZCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uICAqLworICBpZiAobmFtZWxlbiA9PSAyICYmIHRva3N0YXJ0WzBdID09ICdpJyAmJiB0b2tzdGFydFsxXSA9PSAnZicpCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGxleHB0ciArPSBuYW1lbGVuOworCisgIHRyeW5hbWU6CisKKyAgLyogQ2F0Y2ggc3BlY2lmaWMga2V5d29yZHMuICBTaG91bGQgYmUgZG9uZSB3aXRoIGEgZGF0YSBzdHJ1Y3R1cmUuICAqLworICBzd2l0Y2ggKG5hbWVsZW4pCisgICAgeworICAgIGNhc2UgNzoKKyAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiYm9vbGVhbiIsIDcpKQorCXJldHVybiBCT09MRUFOOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJkb3VibGUiLCA2KSkgICAgICAKKwlyZXR1cm4gRE9VQkxFOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJzaG9ydCIsIDUpKQorCXJldHVybiBTSE9SVDsKKyAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiZmFsc2UiLCA1KSkKKwl7CisJICB5eWx2YWwubHZhbCA9IDA7CisJICByZXR1cm4gQk9PTEVBTl9MSVRFUkFMOworCX0KKyAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAic3VwZXIiLCA1KSkKKwlyZXR1cm4gU1VQRVI7CisgICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImZsb2F0IiwgNSkpCisJcmV0dXJuIEZMT0FUOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJsb25nIiwgNCkpCisJcmV0dXJuIExPTkc7CisgICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImJ5dGUiLCA0KSkKKwlyZXR1cm4gQllURTsKKyAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiY2hhciIsIDQpKQorCXJldHVybiBDSEFSOworICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJ0cnVlIiwgNCkpCisJeworCSAgeXlsdmFsLmx2YWwgPSAxOworCSAgcmV0dXJuIEJPT0xFQU5fTElURVJBTDsKKwl9CisgICAgICBpZiAoY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfY3BsdXMKKwkgICYmIFNUUkVRTiAodG9rc3RhcnQsICJ0aGlzIiwgNCkpCisJeworCSAgc3RhdGljIGNvbnN0IGNoYXIgdGhpc19uYW1lW10gPQorCQkJCSB7IENQTFVTX01BUktFUiwgJ3QnLCAnaCcsICdpJywgJ3MnLCAnXDAnIH07CisKKwkgIGlmIChsb29rdXBfc3ltYm9sICh0aGlzX25hbWUsIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywKKwkJCSAgICAgVkFSX05BTUVTUEFDRSwgKGludCAqKSBOVUxMLAorCQkJICAgICAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCkpCisJICAgIHJldHVybiBUSElTOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiaW50IiwgMykpCisJcmV0dXJuIElOVDsKKyAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAibmV3IiwgMykpCisJcmV0dXJuIE5FVzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgeXlsdmFsLnN2YWwucHRyID0gdG9rc3RhcnQ7CisgIHl5bHZhbC5zdmFsLmxlbmd0aCA9IG5hbWVsZW47CisKKyAgaWYgKCp0b2tzdGFydCA9PSAnJCcpCisgICAgeworICAgICAgd3JpdGVfZG9sbGFyX3ZhcmlhYmxlICh5eWx2YWwuc3ZhbCk7CisgICAgICByZXR1cm4gVkFSSUFCTEU7CisgICAgfQorCisgIC8qIElucHV0IG5hbWVzIHRoYXQgYXJlbid0IHN5bWJvbHMgYnV0IEFSRSB2YWxpZCBoZXggbnVtYmVycywKKyAgICAgd2hlbiB0aGUgaW5wdXQgcmFkaXggcGVybWl0cyB0aGVtLCBjYW4gYmUgbmFtZXMgb3IgbnVtYmVycworICAgICBkZXBlbmRpbmcgb24gdGhlIHBhcnNlLiAgTm90ZSB3ZSBzdXBwb3J0IHJhZGl4ZXMgPiAxNiBoZXJlLiAgKi8KKyAgaWYgKCgodG9rc3RhcnRbMF0gPj0gJ2EnICYmIHRva3N0YXJ0WzBdIDwgJ2EnICsgaW5wdXRfcmFkaXggLSAxMCkgfHwKKyAgICAgICAodG9rc3RhcnRbMF0gPj0gJ0EnICYmIHRva3N0YXJ0WzBdIDwgJ0EnICsgaW5wdXRfcmFkaXggLSAxMCkpKQorICAgIHsKKyAgICAgIFlZU1RZUEUgbmV3bHZhbDsJLyogSXRzIHZhbHVlIGlzIGlnbm9yZWQuICAqLworICAgICAgaW50IGhleHR5cGUgPSBwYXJzZV9udW1iZXIgKHRva3N0YXJ0LCBuYW1lbGVuLCAwLCAmbmV3bHZhbCk7CisgICAgICBpZiAoaGV4dHlwZSA9PSBJTlRFR0VSX0xJVEVSQUwpCisJcmV0dXJuIE5BTUVfT1JfSU5UOworICAgIH0KKyAgcmV0dXJuIElERU5USUZJRVI7Cit9CisKK3ZvaWQKK3l5ZXJyb3IgKG1zZykKKyAgICAgY2hhciAqbXNnOworeworICBlcnJvciAoIkEgJXMgaW4gZXhwcmVzc2lvbiwgbmVhciBgJXMnLiIsIChtc2cgPyBtc2cgOiAiZXJyb3IiKSwgbGV4cHRyKTsKK30KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK2phdmFfdHlwZV9mcm9tX25hbWUgKG5hbWUpCisgICAgIHN0cnVjdCBzdG9rZW4gbmFtZTsKKyAKK3sKKyAgY2hhciAqdG1wID0gY29weV9uYW1lIChuYW1lKTsKKyAgc3RydWN0IHR5cGUgKnR5cCA9IGphdmFfbG9va3VwX2NsYXNzICh0bXApOworICBpZiAodHlwID09IE5VTEwgfHwgVFlQRV9DT0RFICh0eXApICE9IFRZUEVfQ09ERV9TVFJVQ1QpCisgICAgZXJyb3IgKCJObyBjbGFzcyBuYW1lZCAlcy4iLCB0bXApOworICByZXR1cm4gdHlwOworfQorCisvKiBJZiBOQU1FIGlzIGEgdmFsaWQgdmFyaWFibGUgbmFtZSBpbiB0aGlzIHNjb3BlLCBwdXNoIGl0IGFuZCByZXR1cm4gMS4KKyAgIE90aGVyd2lzZSwgcmV0dXJuIDAuICovCisKK3N0YXRpYyBpbnQKK3B1c2hfdmFyaWFibGUgKG5hbWUpCisgICAgIHN0cnVjdCBzdG9rZW4gbmFtZTsKKyAKK3sKKyAgY2hhciAqdG1wID0gY29weV9uYW1lIChuYW1lKTsKKyAgaW50IGlzX2FfZmllbGRfb2ZfdGhpcyA9IDA7CisgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgc3ltID0gbG9va3VwX3N5bWJvbCAodG1wLCBleHByZXNzaW9uX2NvbnRleHRfYmxvY2ssIFZBUl9OQU1FU1BBQ0UsCisJCSAgICAgICAmaXNfYV9maWVsZF9vZl90aGlzLCAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCk7CisgIGlmIChzeW0gJiYgU1lNQk9MX0NMQVNTIChzeW0pICE9IExPQ19UWVBFREVGKQorICAgIHsKKyAgICAgIGlmIChzeW1ib2xfcmVhZF9uZWVkc19mcmFtZSAoc3ltKSkKKwl7CisJICBpZiAoaW5uZXJtb3N0X2Jsb2NrID09IDAgfHwKKwkgICAgICBjb250YWluZWRfaW4gKGJsb2NrX2ZvdW5kLCBpbm5lcm1vc3RfYmxvY2spKQorCSAgICBpbm5lcm1vc3RfYmxvY2sgPSBibG9ja19mb3VuZDsKKwl9CisKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOworICAgICAgLyogV2Ugd2FudCB0byB1c2UgdGhlIHNlbGVjdGVkIGZyYW1lLCBub3QgYW5vdGhlciBtb3JlIGlubmVyIGZyYW1lCisJIHdoaWNoIGhhcHBlbnMgdG8gYmUgaW4gdGhlIHNhbWUgYmxvY2suICAqLworICAgICAgd3JpdGVfZXhwX2VsdF9ibG9jayAoTlVMTCk7CisgICAgICB3cml0ZV9leHBfZWx0X3N5bSAoc3ltKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBpZiAoaXNfYV9maWVsZF9vZl90aGlzKQorICAgIHsKKyAgICAgIC8qIGl0IGhhbmdzIG9mZiBvZiBgdGhpcycuICBNdXN0IG5vdCBpbmFkdmVydGVudGx5IGNvbnZlcnQgZnJvbSBhCisJIG1ldGhvZCBjYWxsIHRvIGRhdGEgcmVmLiAgKi8KKyAgICAgIGlmIChpbm5lcm1vc3RfYmxvY2sgPT0gMCB8fCAKKwkgIGNvbnRhaW5lZF9pbiAoYmxvY2tfZm91bmQsIGlubmVybW9zdF9ibG9jaykpCisJaW5uZXJtb3N0X2Jsb2NrID0gYmxvY2tfZm91bmQ7CisgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVEhJUyk7CisgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVEhJUyk7CisgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfUFRSKTsKKyAgICAgIHdyaXRlX2V4cF9zdHJpbmcgKG5hbWUpOworICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX1BUUik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBBc3N1bWluZyBhIHJlZmVyZW5jZSBleHByZXNzaW9uIGhhcyBiZWVuIHB1c2hlZCwgZW1pdCB0aGUKKyAgIFNUUlVDVE9QX1NUUlVDVCBvcHMgdG8gYWNjZXNzIHRoZSBmaWVsZCBuYW1lZCBOQU1FLiAgSWYgTkFNRSBpcyBhCisgICBxdWFsaWZpZWQgbmFtZSAoaGFzICcuJyksIGdlbmVyYXRlIGEgZmllbGQgYWNjZXNzIGZvciBlYWNoIHBhcnQuICovCisKK3N0YXRpYyB2b2lkCitwdXNoX2ZpZWxkbmFtZXMgKG5hbWUpCisgICAgIHN0cnVjdCBzdG9rZW4gbmFtZTsKK3sKKyAgaW50IGk7CisgIHN0cnVjdCBzdG9rZW4gdG9rZW47CisgIHRva2VuLnB0ciA9IG5hbWUucHRyOworICBmb3IgKGkgPSAwOyAgOyAgaSsrKQorICAgIHsKKyAgICAgIGlmIChpID09IG5hbWUubGVuZ3RoIHx8IG5hbWUucHRyW2ldID09ICcuJykKKwl7CisJICAvKiB0b2tlbi5wdHIgaXMgc3RhcnQgb2YgY3VycmVudCBmaWVsZCBuYW1lLiAqLworCSAgdG9rZW4ubGVuZ3RoID0gJm5hbWUucHRyW2ldIC0gdG9rZW4ucHRyOworCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX1NUUlVDVCk7CisJICB3cml0ZV9leHBfc3RyaW5nICh0b2tlbik7CisJICB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfU1RSVUNUKTsKKwkgIHRva2VuLnB0ciArPSB0b2tlbi5sZW5ndGggKyAxOworCX0KKyAgICAgIGlmIChpID49IG5hbWUubGVuZ3RoKQorCWJyZWFrOworICAgIH0KK30KKworLyogSGVscGVyIHJvdXRpbmUgZm9yIHB1c2hfZXhwcmVzc2lvbl9uYW1lLgorICAgSGFuZGxlIGEgcXVhbGlmaWVkIG5hbWUsIHdoZXJlIERPVF9JTkRFWCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0ICcuJyAqLworCitzdGF0aWMgdm9pZAorcHVzaF9xdWFsaWZpZWRfZXhwcmVzc2lvbl9uYW1lIChuYW1lLCBkb3RfaW5kZXgpCisgICAgIHN0cnVjdCBzdG9rZW4gbmFtZTsKKyAgICAgaW50IGRvdF9pbmRleDsKK3sKKyAgc3RydWN0IHN0b2tlbiB0b2tlbjsKKyAgY2hhciAqdG1wOworICBzdHJ1Y3QgdHlwZSAqdHlwOworCisgIHRva2VuLnB0ciA9IG5hbWUucHRyOworICB0b2tlbi5sZW5ndGggPSBkb3RfaW5kZXg7CisKKyAgaWYgKHB1c2hfdmFyaWFibGUgKHRva2VuKSkKKyAgICB7CisgICAgICB0b2tlbi5wdHIgPSBuYW1lLnB0ciArIGRvdF9pbmRleCArIDE7CisgICAgICB0b2tlbi5sZW5ndGggPSBuYW1lLmxlbmd0aCAtIGRvdF9pbmRleCAtIDE7CisgICAgICBwdXNoX2ZpZWxkbmFtZXMgKHRva2VuKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgdG9rZW4ucHRyID0gbmFtZS5wdHI7CisgIGZvciAoOzspCisgICAgeworICAgICAgdG9rZW4ubGVuZ3RoID0gZG90X2luZGV4OworICAgICAgdG1wID0gY29weV9uYW1lICh0b2tlbik7CisgICAgICB0eXAgPSBqYXZhX2xvb2t1cF9jbGFzcyAodG1wKTsKKyAgICAgIGlmICh0eXAgIT0gTlVMTCkKKwl7CisJICBpZiAoZG90X2luZGV4ID09IG5hbWUubGVuZ3RoKQorCSAgICB7CisJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7CisJICAgICAgd3JpdGVfZXhwX2VsdF90eXBlKHR5cCk7CisJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBkb3RfaW5kZXgrKzsgIC8qIFNraXAgJy4nICovCisJICBuYW1lLnB0ciArPSBkb3RfaW5kZXg7CisJICBuYW1lLmxlbmd0aCAtPSBkb3RfaW5kZXg7CisJICBkb3RfaW5kZXggPSAwOworCSAgd2hpbGUgKGRvdF9pbmRleCA8IG5hbWUubGVuZ3RoICYmIG5hbWUucHRyW2RvdF9pbmRleF0gIT0gJy4nKSAKKwkgICAgZG90X2luZGV4Kys7CisJICB0b2tlbi5wdHIgPSBuYW1lLnB0cjsKKwkgIHRva2VuLmxlbmd0aCA9IGRvdF9pbmRleDsKKwkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9TQ09QRSk7CisJICB3cml0ZV9leHBfZWx0X3R5cGUgKHR5cCk7CisJICB3cml0ZV9leHBfc3RyaW5nICh0b2tlbik7CisJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfU0NPUEUpOyAKKwkgIGlmIChkb3RfaW5kZXggPCBuYW1lLmxlbmd0aCkKKwkgICAgeworCSAgICAgIGRvdF9pbmRleCsrOworCSAgICAgIG5hbWUucHRyICs9IGRvdF9pbmRleDsKKwkgICAgICBuYW1lLmxlbmd0aCAtPSBkb3RfaW5kZXg7CisJICAgICAgcHVzaF9maWVsZG5hbWVzIChuYW1lKTsKKwkgICAgfQorCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKGRvdF9pbmRleCA+PSBuYW1lLmxlbmd0aCkKKwlicmVhazsKKyAgICAgIGRvdF9pbmRleCsrOyAgLyogU2tpcCAnLicgKi8KKyAgICAgIHdoaWxlIChkb3RfaW5kZXggPCBuYW1lLmxlbmd0aCAmJiBuYW1lLnB0cltkb3RfaW5kZXhdICE9ICcuJykKKwlkb3RfaW5kZXgrKzsKKyAgICB9CisgIGVycm9yICgidW5rbm93biB0eXBlIGAlLipzJyIsIG5hbWUubGVuZ3RoLCBuYW1lLnB0cik7Cit9CisKKy8qIEhhbmRsZSBOYW1lIGluIGFuIGV4cHJlc3Npb24gKG9yIExIUykuCisgICBIYW5kbGUgVkFSLCBUWVBFLCBUWVBFLkZJRUxEMS4uLi5GSUVMRE4gYW5kIFZBUi5GSUVMRDEuLi4uRklFTEROLiAqLworCitzdGF0aWMgdm9pZAorcHVzaF9leHByZXNzaW9uX25hbWUgKG5hbWUpCisgICAgIHN0cnVjdCBzdG9rZW4gbmFtZTsKK3sKKyAgY2hhciAqdG1wOworICBzdHJ1Y3QgdHlwZSAqdHlwOworICBjaGFyICpwdHI7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7ICBpIDwgbmFtZS5sZW5ndGg7ICBpKyspCisgICAgeworICAgICAgaWYgKG5hbWUucHRyW2ldID09ICcuJykKKwl7CisJICAvKiBJdCdzIGEgUXVhbGlmaWVkIEV4cHJlc3Npb24gTmFtZS4gKi8KKwkgIHB1c2hfcXVhbGlmaWVkX2V4cHJlc3Npb25fbmFtZSAobmFtZSwgaSk7CisJICByZXR1cm47CisJfQorICAgIH0KKworICAvKiBJdCdzIGEgU2ltcGxlIEV4cHJlc3Npb24gTmFtZS4gKi8KKyAgCisgIGlmIChwdXNoX3ZhcmlhYmxlIChuYW1lKSkKKyAgICByZXR1cm47CisgIHRtcCA9IGNvcHlfbmFtZSAobmFtZSk7CisgIHR5cCA9IGphdmFfbG9va3VwX2NsYXNzICh0bXApOworICBpZiAodHlwICE9IE5VTEwpCisgICAgeworICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7CisgICAgICB3cml0ZV9leHBfZWx0X3R5cGUodHlwKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbDsKKworICAgICAgbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAodG1wLCBOVUxMLCBOVUxMKTsKKyAgICAgIGlmIChtc3ltYm9sICE9IE5VTEwpCisJeworCSAgd3JpdGVfZXhwX21zeW1ib2wgKG1zeW1ib2wsCisJCQkgICAgIGxvb2t1cF9mdW5jdGlvbl90eXBlIChidWlsdGluX3R5cGVfaW50KSwKKwkJCSAgICAgYnVpbHRpbl90eXBlX2ludCk7CisJfQorICAgICAgZWxzZSBpZiAoIWhhdmVfZnVsbF9zeW1ib2xzICgpICYmICFoYXZlX3BhcnRpYWxfc3ltYm9scyAoKSkKKwllcnJvciAoIk5vIHN5bWJvbCB0YWJsZSBpcyBsb2FkZWQuICBVc2UgdGhlIFwiZmlsZVwiIGNvbW1hbmQuIik7CisgICAgICBlbHNlCisJZXJyb3IgKCJObyBzeW1ib2wgXCIlc1wiIGluIGN1cnJlbnQgY29udGV4dC4iLCB0bXApOworICAgIH0KKworfQorCisKKy8qIFRoZSBmb2xsb3dpbmcgdHdvIHJvdXRpbmVzLCBjb3B5X2V4cCBhbmQgaW5zZXJ0X2V4cCwgYXJlbid0IHNwZWNpZmljIHRvCisgICBKYXZhLCBzbyB0aGV5IGNvdWxkIGdvIGluIHBhcnNlLmMsIGJ1dCB0aGVpciBvbmx5IHB1cnBvc2UgaXMgdG8gc3VwcG9ydAorICAgdGhlIHBhcnNpbmcga2x1ZGdlcyB3ZSB1c2UgaW4gdGhpcyBmaWxlLCBzbyBtYXliZSBpdCdzIGJlc3QgdG8gaXNvbGF0ZQorICAgdGhlbSBoZXJlLiAgKi8KKworLyogQ29weSB0aGUgZXhwcmVzc2lvbiB3aG9zZSBsYXN0IGVsZW1lbnQgaXMgYXQgaW5kZXggRU5EUE9TIC0gMSBpbiBFWFBSCisgICBpbnRvIGEgZnJlc2hseSBtYWxsb2MnZWQgc3RydWN0IGV4cHJlc3Npb24uICBJdHMgbGFuZ3VhZ2VfZGVmbiBpcyBzZXQKKyAgIHRvIG51bGwuICAqLworc3RhdGljIHN0cnVjdCBleHByZXNzaW9uICoKK2NvcHlfZXhwIChleHByLCBlbmRwb3MpCisgICAgIHN0cnVjdCBleHByZXNzaW9uICpleHByOworICAgICBpbnQgZW5kcG9zOworeworICBpbnQgbGVuID0gbGVuZ3RoX29mX3N1YmV4cCAoZXhwciwgZW5kcG9zKTsKKyAgc3RydWN0IGV4cHJlc3Npb24gKm5ldworICAgID0gKHN0cnVjdCBleHByZXNzaW9uICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3KSArIEVYUF9FTEVNX1RPX0JZVEVTIChsZW4pKTsKKyAgbmV3LT5uZWx0cyA9IGxlbjsKKyAgbWVtY3B5IChuZXctPmVsdHMsIGV4cHItPmVsdHMgKyBlbmRwb3MgLSBsZW4sIEVYUF9FTEVNX1RPX0JZVEVTIChsZW4pKTsKKyAgbmV3LT5sYW5ndWFnZV9kZWZuID0gMDsKKworICByZXR1cm4gbmV3OworfQorCisvKiBJbnNlcnQgdGhlIGV4cHJlc3Npb24gTkVXIGludG8gdGhlIGN1cnJlbnQgZXhwcmVzc2lvbiAoZXhwb3V0KSBhdCBQT1MuICAqLworc3RhdGljIHZvaWQKK2luc2VydF9leHAgKHBvcywgbmV3KQorICAgICBpbnQgcG9zOworICAgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqbmV3OworeworICBpbnQgbmV3bGVuID0gbmV3LT5uZWx0czsKKworICAvKiBHcm93IGV4cG91dCBpZiBuZWNlc3NhcnkuICBJbiB0aGlzIGZ1bmN0aW9uJ3Mgb25seSB1c2UgYXQgcHJlc2VudCwKKyAgICAgdGhpcyBzaG91bGQgbmV2ZXIgYmUgbmVjZXNzYXJ5LiAgKi8KKyAgaWYgKGV4cG91dF9wdHIgKyBuZXdsZW4gPiBleHBvdXRfc2l6ZSkKKyAgICB7CisgICAgICBleHBvdXRfc2l6ZSA9IG1heCAoZXhwb3V0X3NpemUgKiAyLCBleHBvdXRfcHRyICsgbmV3bGVuICsgMTApOworICAgICAgZXhwb3V0ID0gKHN0cnVjdCBleHByZXNzaW9uICopCisJcmVhbGxvYyAoKGNoYXIgKikgZXhwb3V0LCAoc2l6ZW9mIChzdHJ1Y3QgZXhwcmVzc2lvbikKKwkJCQkgICAgKyBFWFBfRUxFTV9UT19CWVRFUyAoZXhwb3V0X3NpemUpKSk7CisgICAgfQorCisgIHsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IGV4cG91dF9wdHIgLSAxOyBpID49IHBvczsgaS0tKQorICAgICAgZXhwb3V0LT5lbHRzW2kgKyBuZXdsZW5dID0gZXhwb3V0LT5lbHRzW2ldOworICB9CisgIAorICBtZW1jcHkgKGV4cG91dC0+ZWx0cyArIHBvcywgbmV3LT5lbHRzLCBFWFBfRUxFTV9UT19CWVRFUyAobmV3bGVuKSk7CisgIGV4cG91dF9wdHIgKz0gbmV3bGVuOworfQpkaWZmIC0tZ2l0IGEvZ2RiL2p2LWxhbmcuYyBiL2dkYi9qdi1sYW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4MTQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9qdi1sYW5nLmMKQEAgLTAsMCArMSwxMDg4IEBACisvKiBKYXZhIGxhbmd1YWdlIHN1cHBvcnQgcm91dGluZXMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAicGFyc2VyLWRlZnMuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgIm9iamZpbGVzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAiYy1sYW5nLmgiCisjaW5jbHVkZSAianYtbGFuZy5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorCitzdHJ1Y3QgdHlwZSAqamF2YV9pbnRfdHlwZTsKK3N0cnVjdCB0eXBlICpqYXZhX2J5dGVfdHlwZTsKK3N0cnVjdCB0eXBlICpqYXZhX3Nob3J0X3R5cGU7CitzdHJ1Y3QgdHlwZSAqamF2YV9sb25nX3R5cGU7CitzdHJ1Y3QgdHlwZSAqamF2YV9ib29sZWFuX3R5cGU7CitzdHJ1Y3QgdHlwZSAqamF2YV9jaGFyX3R5cGU7CitzdHJ1Y3QgdHlwZSAqamF2YV9mbG9hdF90eXBlOworc3RydWN0IHR5cGUgKmphdmFfZG91YmxlX3R5cGU7CitzdHJ1Y3QgdHlwZSAqamF2YV92b2lkX3R5cGU7CisKK3N0YXRpYyBpbnQgamF2YV9kZW1hbmdsZWRfc2lnbmF0dXJlX2xlbmd0aCBQQVJBTVMgKChjaGFyKikpOworc3RhdGljIHZvaWQgamF2YV9kZW1hbmdsZWRfc2lnbmF0dXJlX2NvcHkgUEFSQU1TICgoY2hhciosIGNoYXIqKSk7CisKK3N0YXRpYyB2b2lkIGphdmFfZW1pdF9jaGFyIFBBUkFNUyAoKGludCBjLCBHREJfRklMRSAqc3RyZWFtLCBpbnQgcXVvdGVyKSk7CisKKy8qIFRoaXMgb2JqZmlsZSBjb250YWlucyBzeW10YWJzIHRoYXQgaGF2ZSBiZWVuIGR5bmFtaWNhbGx5IGNyZWF0ZWQKKyAgIHRvIHJlY29yZCBkeW5hbWljYWxseSBsb2FkZWQgSmF2YSBjbGFzc2VzIGFuZCBkeW5hbWljYWxseQorICAgY29tcGlsZWQgamF2YSBtZXRob2RzLiAqLworCitzdGF0aWMgc3RydWN0IG9iamZpbGUgKmR5bmFtaWNzX29iamZpbGUgPSBOVUxMOworCitzdGF0aWMgc3RydWN0IHR5cGUgKmphdmFfbGlua19jbGFzc190eXBlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIHZhbHVlX3B0cikpOworCitzdGF0aWMgc3RydWN0IG9iamZpbGUgKgorZ2V0X2R5bmFtaWNzX29iamZpbGUgKCkKK3sKKyAgaWYgKGR5bmFtaWNzX29iamZpbGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBkeW5hbWljc19vYmpmaWxlID0gYWxsb2NhdGVfb2JqZmlsZSAoTlVMTCwgMCwgMCwgMCk7CisgICAgfQorICByZXR1cm4gZHluYW1pY3Nfb2JqZmlsZTsKK30KKworI2lmIDEKKy8qIHN5bXRhYiBjb250YWlucyBjbGFzc2VzIHJlYWQgZnJvbSB0aGUgaW5mZXJpb3IuICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3ltdGFiICpjbGFzc19zeW10YWIgPSBOVUxMOworCisvKiBNYXhpbXVtIG51bWJlciBvZiBjbGFzcyBpbiBjbGFzc19zeW10YWIgYmVmb3JlIHJlbG9jYXRpb24gaXMgbmVlZGVkLiAqLworCitzdGF0aWMgaW50IGNsYXNzX3N5bXRhYl9zcGFjZTsKKworc3RydWN0IHN5bXRhYiAqCitnZXRfamF2YV9jbGFzc19zeW10YWIgKCkKK3sKKyAgaWYgKGNsYXNzX3N5bXRhYiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlID0gZ2V0X2R5bmFtaWNzX29iamZpbGUoKTsKKyAgICAgIHN0cnVjdCBibG9ja3ZlY3RvciAqYnY7CisgICAgICBzdHJ1Y3QgYmxvY2sgKmJsOworICAgICAgY2xhc3Nfc3ltdGFiID0gYWxsb2NhdGVfc3ltdGFiICgiPGphdmEtY2xhc3Nlcz4iLCBvYmpmaWxlKTsKKyAgICAgIGNsYXNzX3N5bXRhYi0+bGFuZ3VhZ2UgPSBsYW5ndWFnZV9qYXZhOworICAgICAgYnYgPSAoc3RydWN0IGJsb2NrdmVjdG9yICopCisJb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrLCBzaXplb2YgKHN0cnVjdCBibG9ja3ZlY3RvcikpOworICAgICAgQkxPQ0tWRUNUT1JfTkJMT0NLUyAoYnYpID0gMTsKKyAgICAgIEJMT0NLVkVDVE9SIChjbGFzc19zeW10YWIpID0gYnY7CisKKyAgICAgIC8qIEFsbG9jYXRlIGR1bW15IFNUQVRJQ19CTE9DSy4gKi8KKyAgICAgIGJsID0gKHN0cnVjdCBibG9jayAqKQorCW9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywgc2l6ZW9mIChzdHJ1Y3QgYmxvY2spKTsKKyAgICAgIEJMT0NLX05TWU1TIChibCkgPSAwOworICAgICAgQkxPQ0tfU1RBUlQgKGJsKSA9IDA7CisgICAgICBCTE9DS19FTkQgKGJsKSA9IDA7CisgICAgICBCTE9DS19GVU5DVElPTiAoYmwpID0gTlVMTDsKKyAgICAgIEJMT0NLX1NVUEVSQkxPQ0sgKGJsKSA9IE5VTEw7CisgICAgICBCTE9DS19HQ0NfQ09NUElMRUQgKGJsKSA9IDA7CisgICAgICBCTE9DS1ZFQ1RPUl9CTE9DSyAoYnYsIFNUQVRJQ19CTE9DSykgPSBibDsKKworICAgICAgLyogQWxsb2NhdGUgR0xPQkFMX0JMT0NLLiAgVGhpcyBoYXMgdG8gYmUgcmVsb2NhdGFibGUuICovCisgICAgICBjbGFzc19zeW10YWJfc3BhY2UgPSAxMjg7CisgICAgICBibCA9IChzdHJ1Y3QgYmxvY2sgKikKKwltbWFsbG9jIChvYmpmaWxlLT5tZCwKKwkJIHNpemVvZiAoc3RydWN0IGJsb2NrKQorCQkgKyAoKGNsYXNzX3N5bXRhYl9zcGFjZSAtIDEpICogc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sICopKSk7CisgICAgICAqYmwgPSAqQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBTVEFUSUNfQkxPQ0spOworICAgICAgQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBHTE9CQUxfQkxPQ0spID0gYmw7CisgICAgICBjbGFzc19zeW10YWItPmZyZWVfcHRyID0gKGNoYXIgKikgYmw7CisgICAgfQorICByZXR1cm4gY2xhc3Nfc3ltdGFiOworfQorCitzdGF0aWMgdm9pZAorYWRkX2NsYXNzX3N5bXRhYl9zeW1ib2wgKHN5bSkKKyAgICAgc3RydWN0IHN5bWJvbCAqc3ltOworeworICBzdHJ1Y3Qgc3ltdGFiICpzeW10YWIgPSBnZXRfamF2YV9jbGFzc19zeW10YWIgKCk7CisgIHN0cnVjdCBibG9ja3ZlY3RvciAqYnYgPSBCTE9DS1ZFQ1RPUiAoc3ltdGFiKTsKKyAgc3RydWN0IGJsb2NrICpibCA9IEJMT0NLVkVDVE9SX0JMT0NLIChidiwgR0xPQkFMX0JMT0NLKTsKKyAgaWYgKEJMT0NLX05TWU1TIChibCkgPj0gY2xhc3Nfc3ltdGFiX3NwYWNlKQorICAgIHsKKyAgICAgIC8qIE5lZWQgdG8gcmUtYWxsb2NhdGUuICovCisgICAgICBjbGFzc19zeW10YWJfc3BhY2UgKj0gMjsKKyAgICAgIGJsID0gKHN0cnVjdCBibG9jayAqKQorCW1yZWFsbG9jIChzeW10YWItPm9iamZpbGUtPm1kLCBibCwKKwkJICBzaXplb2YgKHN0cnVjdCBibG9jaykKKwkJICArICgoY2xhc3Nfc3ltdGFiX3NwYWNlIC0gMSkgKiBzaXplb2YgKHN0cnVjdCBzeW1ib2wgKikpKTsKKyAgICAgIGNsYXNzX3N5bXRhYi0+ZnJlZV9wdHIgPSAoY2hhciAqKSBibDsKKyAgICAgIEJMT0NLVkVDVE9SX0JMT0NLIChidiwgR0xPQkFMX0JMT0NLKSA9IGJsOworICAgIH0KKyAgCisgIEJMT0NLX1NZTSAoYmwsIEJMT0NLX05TWU1TIChibCkpID0gc3ltOworICBCTE9DS19OU1lNUyAoYmwpID0gQkxPQ0tfTlNZTVMgKGJsKSArIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9sICogYWRkX2NsYXNzX3N5bWJvbCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqdHlwZSwgQ09SRV9BRERSIGFkZHIpKTsKKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKgorYWRkX2NsYXNzX3N5bWJvbCAodHlwZSwgYWRkcikKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIENPUkVfQUREUiBhZGRyOworeworICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIHN5bSA9IChzdHJ1Y3Qgc3ltYm9sICopCisgICAgb2JzdGFja19hbGxvYyAoJmR5bmFtaWNzX29iamZpbGUtPnN5bWJvbF9vYnN0YWNrLCBzaXplb2YgKHN0cnVjdCBzeW1ib2wpKTsKKyAgbWVtc2V0IChzeW0sIDAsIHNpemVvZiAoc3RydWN0IHN5bWJvbCkpOworICBTWU1CT0xfTEFOR1VBR0UgKHN5bSkgPSBsYW5ndWFnZV9qYXZhOworICBTWU1CT0xfTkFNRSAoc3ltKSA9IFRZUEVfVEFHX05BTUUgKHR5cGUpOworICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfVFlQRURFRjsKKyAgLyogIFNZTUJPTF9WQUxVRSAoc3ltKSA9IHZhbHU7Ki8KKyAgU1lNQk9MX1RZUEUgKHN5bSkgPSB0eXBlOworICBTWU1CT0xfTkFNRVNQQUNFIChzeW0pID0gU1RSVUNUX05BTUVTUEFDRTsKKyAgU1lNQk9MX1ZBTFVFX0FERFJFU1MgKHN5bSkgPSBhZGRyOworICByZXR1cm4gc3ltOworfQorI2VuZGlmCisKK3N0cnVjdCB0eXBlICoKK2phdmFfbG9va3VwX2NsYXNzIChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIHN5bSA9IGxvb2t1cF9zeW1ib2wgKG5hbWUsIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywgU1RSVUNUX05BTUVTUEFDRSwKKwkJICAgICAgIChpbnQgKikgMCwgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpOworICBpZiAoc3ltICE9IE5VTEwpCisgICAgcmV0dXJuIFNZTUJPTF9UWVBFIChzeW0pOworI2lmIDAKKyAgQ09SRV9BRERSIGFkZHI7CisgIGlmIChjYWxsZWQgZnJvbSBwYXJzZXIpCisgICAgeworICAgICAgY2FsbCBsb29rdXBfY2xhc3MgKG9yIHNpbWlsYXIpIGluIGluZmVyaW9yOworICAgICAgaWYgbm90IGZvdW5kOgorCXJldHVybiBOVUxMOworICAgICAgYWRkciA9IGZvdW5kIGluIGluZmVyaW9yOworICAgIH0KKyAgZWxzZQorICAgIGFkZHIgPSAwOworICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgdHlwZSA9IGFsbG9jX3R5cGUgKG9iamZpbGUpOworICBUWVBFX0NPREUgKHR5cGUpID0gVFlQRV9DT0RFX1NUUlVDVDsKKyAgSU5JVF9DUExVU19TUEVDSUZJQyAodHlwZSk7CisgIFRZUEVfVEFHX05BTUUgKHR5cGUpID0gb2JzYXZlc3RyaW5nIChuYW1lLCBzdHJsZW4obmFtZSksICZvYmpmaWxlLT50eXBlX29ic3RhY2spOworICBUWVBFX0ZMQUdTICh0eXBlKSB8PSBUWVBFX0ZMQUdfU1RVQjsKKyAgVFlQRSA/ID0gYWRkcjsKKyAgcmV0dXJuIHR5cGU7CisjZWxzZQorICAvKiBGSVhNRSAtIHNob3VsZCBzZWFyY2ggaW5mZXJpb3IncyBzeW1ib2wgdGFibGUuICovCisgIHJldHVybiBOVUxMOworI2VuZGlmCit9CisKKy8qIFJldHVybiBhIG51bC10ZXJtaW5hdGVkIHN0cmluZyAoYWxsb2NhdGVkIG9uIE9CU1RBQ0spIGZvcgorICAgYSBuYW1lIGdpdmVuIGJ5IE5BTUUgKHdoaWNoIGhhcyB0eXBlIFV0ZjhDb25zdCopLiAqLworCitjaGFyICoKK2dldF9qYXZhX3V0ZjhfbmFtZSAob2JzdGFjaywgbmFtZSkKKyAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7CisgICAgIHZhbHVlX3B0ciBuYW1lOworeworICBjaGFyICpjaHJzOworICB2YWx1ZV9wdHIgdGVtcCA9IG5hbWU7CisgIGludCBuYW1lX2xlbmd0aDsKKyAgQ09SRV9BRERSIGRhdGFfYWRkcjsKKyAgdGVtcCA9IHZhbHVlX3N0cnVjdF9lbHQgKCZ0ZW1wLCBOVUxMLCAibGVuZ3RoIiwgTlVMTCwgInN0cnVjdHVyZSIpOworICBuYW1lX2xlbmd0aCA9IChpbnQpIHZhbHVlX2FzX2xvbmcgKHRlbXApOworICBkYXRhX2FkZHIgPSBWQUxVRV9BRERSRVNTICh0ZW1wKSArIFZBTFVFX09GRlNFVCAodGVtcCkKKyAgICArIFRZUEVfTEVOR1RIIChWQUxVRV9UWVBFICh0ZW1wKSk7CisgIGNocnMgPSBvYnN0YWNrX2FsbG9jIChvYnN0YWNrLCBuYW1lX2xlbmd0aCsxKTsKKyAgY2hycyBbbmFtZV9sZW5ndGhdID0gJ1wwJzsKKyAgcmVhZF9tZW1vcnlfc2VjdGlvbiAoZGF0YV9hZGRyLCBjaHJzLCBuYW1lX2xlbmd0aCwgTlVMTCk7CisgIHJldHVybiBjaHJzOworfQorCit2YWx1ZV9wdHIKK2phdmFfY2xhc3NfZnJvbV9vYmplY3QgKG9ial92YWwpCisgICAgIHZhbHVlX3B0ciBvYmpfdmFsOworeworICAvKiBUaGlzIGlzIGFsbCByYXRoZXIgaW5lZmZpY2llbnQsIHNpbmNlIHRoZSBvZmZzZXRzIG9mIHZ0YWJsZSBhbmQKKyAgICAgY2xhc3MgYXJlIGZpeGVkLiAgRklYTUUgKi8KKyAgdmFsdWVfcHRyIHZ0YWJsZV92YWw7CisKKyAgaWYgKFRZUEVfQ09ERSAoVkFMVUVfVFlQRSAob2JqX3ZhbCkpID09IFRZUEVfQ09ERV9QVFIKKyAgICAgICYmIFRZUEVfTEVOR1RIIChUWVBFX1RBUkdFVF9UWVBFIChWQUxVRV9UWVBFIChvYmpfdmFsKSkpID09IDApCisgICAgb2JqX3ZhbCA9IHZhbHVlX2F0IChnZXRfamF2YV9vYmplY3RfdHlwZSAoKSwKKwkJCXZhbHVlX2FzX3BvaW50ZXIgKG9ial92YWwpLCBOVUxMKTsKKworICB2dGFibGVfdmFsID0gdmFsdWVfc3RydWN0X2VsdCAoJm9ial92YWwsIE5VTEwsICJ2dGFibGUiLCBOVUxMLCAic3RydWN0dXJlIik7CisgIHJldHVybiB2YWx1ZV9zdHJ1Y3RfZWx0ICgmdnRhYmxlX3ZhbCwgTlVMTCwgImNsYXNzIiwgTlVMTCwgInN0cnVjdHVyZSIpOworfQorCisvKiBDaGVjayBpZiBDTEFTU19JU19QUklNSVRJVkUodmFsdWUgb2YgY2xhcyk6ICovCitpbnQKK2phdmFfY2xhc3NfaXNfcHJpbWl0aXZlIChjbGFzKQorICAgICB2YWx1ZV9wdHIgY2xhczsKK3sKKyAgdmFsdWVfcHRyIHZ0YWJsZSA9IHZhbHVlX3N0cnVjdF9lbHQgKCZjbGFzLCBOVUxMLCAidnRhYmxlIiwgTlVMTCwgInN0cnVjdCIpOworICBDT1JFX0FERFIgaSA9IHZhbHVlX2FzX3BvaW50ZXIgKHZ0YWJsZSk7CisgIHJldHVybiAoaW50KSAoaSAmIDB4N2ZmZmZmZmYpID09IChpbnQpIDB4N2ZmZmZmZmY7Cit9CisKKy8qIFJlYWQgYSBHQ0ogQ2xhc3Mgb2JqZWN0LCBhbmQgZ2VuZXJhdGVkIGEgZ2RiIChUWVBFX0NPREVfU1RSVUNUKSB0eXBlLiAqLworCitzdHJ1Y3QgdHlwZSAqCit0eXBlX2Zyb21fY2xhc3MgKGNsYXMpCisgICAgIHZhbHVlX3B0ciBjbGFzOworeworICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgY2hhciAqbmFtZTsKKyAgdmFsdWVfcHRyIHRlbXA7CisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICB2YWx1ZV9wdHIgdXRmOF9uYW1lOworICBjaGFyICpucHRyOworICBDT1JFX0FERFIgYWRkcjsKKyAgc3RydWN0IGJsb2NrICpibDsKKyAgaW50IGk7CisgIGludCBpc19hcnJheSA9IDA7CisKKyAgdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGNsYXMpKTsKKyAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1BUUikKKyAgICB7CisgICAgICBpZiAodmFsdWVfbG9naWNhbF9ub3QgKGNsYXMpKQorCXJldHVybiBOVUxMOworICAgICAgY2xhcyA9IHZhbHVlX2luZCAoY2xhcyk7CisgICAgfQorICBhZGRyID0gVkFMVUVfQUREUkVTUyAoY2xhcykgKyBWQUxVRV9PRkZTRVQgKGNsYXMpOworCisjaWYgMAorICBnZXRfamF2YV9jbGFzc19zeW10YWIgKCk7CisgIGJsID0gQkxPQ0tWRUNUT1JfQkxPQ0sgKEJMT0NLVkVDVE9SIChjbGFzc19zeW10YWIpLCBHTE9CQUxfQkxPQ0spOworICBmb3IgKGkgPSBCTE9DS19OU1lNUyAoYmwpOyAgLS1pID49IDA7ICkKKyAgICB7CisgICAgICBzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBCTE9DS19TWU0gKGJsLCBpKTsKKyAgICAgIGlmIChTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltKSA9PSBhZGRyKQorCXJldHVybiBTWU1CT0xfVFlQRSAoc3ltKTsKKyAgICB9CisjZW5kaWYKKworICBvYmpmaWxlID0gZ2V0X2R5bmFtaWNzX29iamZpbGUoKTsKKyAgaWYgKGphdmFfY2xhc3NfaXNfcHJpbWl0aXZlIChjbGFzKSkKKyAgICB7CisgICAgICB2YWx1ZV9wdHIgc2lnOworICAgICAgdGVtcCA9IGNsYXM7CisgICAgICBzaWcgPSB2YWx1ZV9zdHJ1Y3RfZWx0ICgmdGVtcCwgTlVMTCwgIm1ldGhvZF9jb3VudCIsIE5VTEwsICJzdHJ1Y3R1cmUiKTsKKyAgICAgIHJldHVybiBqYXZhX3ByaW1pdGl2ZV90eXBlICh2YWx1ZV9hc19sb25nIChzaWcpKTsKKyAgICB9CisKKyAgLyogR2V0IENsYXNzIG5hbWUuICovCisgIC8qIGlmIGNsYXNsb2FkZXIgbm9uLW51bGwsIHByZXBlbmQgbG9hZGVyIGFkZHJlc3MuIEZJWE1FICovCisgIHRlbXAgPSBjbGFzOworICB1dGY4X25hbWUgPSB2YWx1ZV9zdHJ1Y3RfZWx0ICgmdGVtcCwgTlVMTCwgIm5hbWUiLCBOVUxMLCAic3RydWN0dXJlIik7CisgIG5hbWUgPSBnZXRfamF2YV91dGY4X25hbWUgKCZvYmpmaWxlLT50eXBlX29ic3RhY2ssIHV0ZjhfbmFtZSk7CisgIGZvciAobnB0ciA9IG5hbWU7ICAqbnB0ciAhPSAwOyAgbnB0cisrKQorICAgIHsKKyAgICAgIGlmICgqbnB0ciA9PSAnLycpCisJKm5wdHIgPSAnLic7CisgICAgfQorCisgIHR5cGUgPSBqYXZhX2xvb2t1cF9jbGFzcyAobmFtZSk7CisgIGlmICh0eXBlICE9IE5VTEwpCisgICAgcmV0dXJuIHR5cGU7CisKKyAgdHlwZSA9IGFsbG9jX3R5cGUgKG9iamZpbGUpOworICBUWVBFX0NPREUgKHR5cGUpID0gVFlQRV9DT0RFX1NUUlVDVDsKKyAgSU5JVF9DUExVU19TUEVDSUZJQyAodHlwZSk7CisKKyAgaWYgKG5hbWVbMF0gPT0gJ1snKQorICAgIHsKKyAgICAgIGNoYXIgKnNpZ25hdHVyZSA9IG5hbWU7CisgICAgICBpbnQgbmFtZWxlbiA9IGphdmFfZGVtYW5nbGVkX3NpZ25hdHVyZV9sZW5ndGggKHNpZ25hdHVyZSk7CisgICAgICBpZiAobmFtZWxlbiA+IHN0cmxlbiAobmFtZSkpCisJbmFtZSA9IG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT50eXBlX29ic3RhY2ssIG5hbWVsZW4rMSk7CisgICAgICBqYXZhX2RlbWFuZ2xlZF9zaWduYXR1cmVfY29weSAobmFtZSwgc2lnbmF0dXJlKTsKKyAgICAgIG5hbWVbbmFtZWxlbl0gPSAnXDAnOworICAgICAgaXNfYXJyYXkgPSAxOworICAgICAgdGVtcCA9IGNsYXM7CisgICAgICAvKiBTZXQgYXJyYXkgZWxlbWVudCB0eXBlLiAqLworICAgICAgdGVtcCA9IHZhbHVlX3N0cnVjdF9lbHQgKCZ0ZW1wLCBOVUxMLCAibWV0aG9kcyIsIE5VTEwsICJzdHJ1Y3R1cmUiKTsKKyAgICAgIFZBTFVFX1RZUEUgKHRlbXApID0gbG9va3VwX3BvaW50ZXJfdHlwZSAoVkFMVUVfVFlQRSAoY2xhcykpOworICAgICAgVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkgPSB0eXBlX2Zyb21fY2xhc3MgKHRlbXApOworICAgIH0KKworICBBTExPQ0FURV9DUExVU19TVFJVQ1RfVFlQRSAodHlwZSk7CisgIFRZUEVfVEFHX05BTUUgKHR5cGUpID0gbmFtZTsKKworICBhZGRfY2xhc3Nfc3ltdGFiX3N5bWJvbCAoYWRkX2NsYXNzX3N5bWJvbCAodHlwZSwgYWRkcikpOworICByZXR1cm4gamF2YV9saW5rX2NsYXNzX3R5cGUgKHR5cGUsIGNsYXMpOworfQorCisvKiBGaWxsIGluIGNsYXNzIFRZUEUgd2l0aCBkYXRhIGZyb20gdGhlIENMQVMgdmFsdWUuICovIAorCitzdHJ1Y3QgdHlwZSAqCitqYXZhX2xpbmtfY2xhc3NfdHlwZSAodHlwZSwgY2xhcykKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIHZhbHVlX3B0ciBjbGFzOworeworICB2YWx1ZV9wdHIgdGVtcDsKKyAgY2hhciAqdW5xdWFsaWZpZWRfbmFtZTsKKyAgY2hhciAqbmFtZSA9IFRZUEVfVEFHX05BTUUgKHR5cGUpOworICBpbnQgbmludGVyZmFjZXMsIG5maWVsZHMsIG5tZXRob2RzOworICBpbnQgdHlwZV9pc19vYmplY3QgPSAwOworICBzdHJ1Y3QgZm5fZmllbGQgKmZuX2ZpZWxkczsKKyAgc3RydWN0IGZuX2ZpZWxkbGlzdCAqZm5fZmllbGRsaXN0czsKKyAgdmFsdWVfcHRyIGZpZWxkcywgZmllbGQsIG1ldGhvZCwgbWV0aG9kczsKKyAgaW50IGksIGo7CisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlID0gZ2V0X2R5bmFtaWNzX29iamZpbGUoKTsKKyAgc3RydWN0IHR5cGUgKnRzdXBlcjsKKworICB1bnF1YWxpZmllZF9uYW1lID0gc3RycmNociAobmFtZSwgJy4nKTsKKyAgaWYgKHVucXVhbGlmaWVkX25hbWUgPT0gTlVMTCkKKyAgICB1bnF1YWxpZmllZF9uYW1lID0gbmFtZTsKKworICB0ZW1wID0gY2xhczsKKyAgdGVtcCA9IHZhbHVlX3N0cnVjdF9lbHQgKCZ0ZW1wLCBOVUxMLCAic3VwZXJjbGFzcyIsIE5VTEwsICJzdHJ1Y3R1cmUiKTsKKyAgaWYgKG5hbWUgIT0gTlVMTCAmJiBzdHJjbXAgKG5hbWUsICJqYXZhLmxhbmcuT2JqZWN0IikgPT0gMCkKKyAgICB7CisgICAgICB0c3VwZXIgPSBnZXRfamF2YV9vYmplY3RfdHlwZSAoKTsKKyAgICAgIGlmICh0c3VwZXIgJiYgVFlQRV9DT0RFICh0c3VwZXIpID09IFRZUEVfQ09ERV9QVFIpCisJdHN1cGVyID0gVFlQRV9UQVJHRVRfVFlQRSAodHN1cGVyKTsKKyAgICAgIHR5cGVfaXNfb2JqZWN0ID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB0c3VwZXIgPSB0eXBlX2Zyb21fY2xhc3MgKHRlbXApOworCisjaWYgMQorICBuaW50ZXJmYWNlcyA9IDA7CisjZWxzZQorICB0ZW1wID0gY2xhczsKKyAgbmludGVyZmFjZXMgPSB2YWx1ZV9hc19sb25nICh2YWx1ZV9zdHJ1Y3RfZWx0ICgmdGVtcCwgTlVMTCwgImludGVyZmFjZV9sZW4iLCBOVUxMLCAic3RydWN0dXJlIikpOworI2VuZGlmCisgIFRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSkgPSAodHN1cGVyID09IE5VTEwgPyAwIDogMSkgKyBuaW50ZXJmYWNlczsKKyAgdGVtcCA9IGNsYXM7CisgIG5maWVsZHMgPSB2YWx1ZV9hc19sb25nICh2YWx1ZV9zdHJ1Y3RfZWx0ICgmdGVtcCwgTlVMTCwgImZpZWxkX2NvdW50IiwgTlVMTCwgInN0cnVjdHVyZSIpKTsKKyAgbmZpZWxkcyArPSBUWVBFX05fQkFTRUNMQVNTRVMgKHR5cGUpOworICBuZmllbGRzKys7ICAvKiBBZGQgb25lIGZvciBkdW1teSAiY2xhc3MiIGZpZWxkLiAqLworICBUWVBFX05GSUVMRFMgKHR5cGUpID0gbmZpZWxkczsKKyAgVFlQRV9GSUVMRFMgKHR5cGUpID0gKHN0cnVjdCBmaWVsZCAqKQorICAgIFRZUEVfQUxMT0MgKHR5cGUsIHNpemVvZiAoc3RydWN0IGZpZWxkKSAqIG5maWVsZHMpOworCisgIG1lbXNldCAoVFlQRV9GSUVMRFMgKHR5cGUpLCAwLCBzaXplb2YgKHN0cnVjdCBmaWVsZCkgKiBuZmllbGRzKTsKKworICBUWVBFX0ZJRUxEX1BSSVZBVEVfQklUUyAodHlwZSkgPQorICAgIChCX1RZUEUgKikgVFlQRV9BTExPQyAodHlwZSwgQl9CWVRFUyAobmZpZWxkcykpOworICBCX0NMUkFMTCAoVFlQRV9GSUVMRF9QUklWQVRFX0JJVFMgKHR5cGUpLCBuZmllbGRzKTsKKworICBUWVBFX0ZJRUxEX1BST1RFQ1RFRF9CSVRTICh0eXBlKSA9CisgICAgKEJfVFlQRSAqKSBUWVBFX0FMTE9DICh0eXBlLCBCX0JZVEVTIChuZmllbGRzKSk7CisgIEJfQ0xSQUxMIChUWVBFX0ZJRUxEX1BST1RFQ1RFRF9CSVRTICh0eXBlKSwgbmZpZWxkcyk7CisKKyAgVFlQRV9GSUVMRF9JR05PUkVfQklUUyAodHlwZSkgPQorICAgIChCX1RZUEUgKikgVFlQRV9BTExPQyAodHlwZSwgQl9CWVRFUyAobmZpZWxkcykpOworICBCX0NMUkFMTCAoVFlQRV9GSUVMRF9JR05PUkVfQklUUyAodHlwZSksIG5maWVsZHMpOworCisgIFRZUEVfRklFTERfVklSVFVBTF9CSVRTICh0eXBlKSA9IChCX1RZUEUgKikKKyAgICBUWVBFX0FMTE9DICh0eXBlLCBCX0JZVEVTIChUWVBFX05fQkFTRUNMQVNTRVMgKHR5cGUpKSk7CisgIEJfQ0xSQUxMIChUWVBFX0ZJRUxEX1ZJUlRVQUxfQklUUyAodHlwZSksIFRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSkpOworCisgIGlmICh0c3VwZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBUWVBFX0JBU0VDTEFTUyAodHlwZSwgMCkgPSB0c3VwZXI7CisgICAgICBpZiAodHlwZV9pc19vYmplY3QpCisJU0VUX1RZUEVfRklFTERfUFJJVkFURSAodHlwZSwgMCk7CisgICAgfQorCisgIGkgPSBzdHJsZW4gKG5hbWUpOworICBpZiAoaSA+IDIgJiYgbmFtZVtpLTFdID09ICddJyAmJiB0c3VwZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBGSVhNRSAqLworICAgICAgVFlQRV9MRU5HVEggKHR5cGUpID0gVFlQRV9MRU5HVEggKHRzdXBlcikgKyA0OyAgLyogc2l6ZSB3aXRoICJsZW5ndGgiICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdGVtcCA9IGNsYXM7CisgICAgICB0ZW1wID0gdmFsdWVfc3RydWN0X2VsdCAoJnRlbXAsIE5VTEwsICJzaXplX2luX2J5dGVzIiwgTlVMTCwgInN0cnVjdHVyZSIpOworICAgICAgVFlQRV9MRU5HVEggKHR5cGUpID0gdmFsdWVfYXNfbG9uZyAodGVtcCk7CisgICAgfQorCisgIGZpZWxkcyA9IE5VTEw7CisgIG5maWVsZHMtLTsgIC8qIEZpcnN0IHNldCB1cCBkdW1teSAiY2xhc3MiIGZpZWxkLiAqLworICBTRVRfRklFTERfUEhZU0FERFIgKFRZUEVfRklFTEQgKHR5cGUsIG5maWVsZHMpLAorCQkgICAgICBWQUxVRV9BRERSRVNTIChjbGFzKSArIFZBTFVFX09GRlNFVCAoY2xhcykpOworICBUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIG5maWVsZHMpID0gImNsYXNzIjsKKyAgVFlQRV9GSUVMRF9UWVBFICh0eXBlLCBuZmllbGRzKSA9IFZBTFVFX1RZUEUgKGNsYXMpOworICBTRVRfVFlQRV9GSUVMRF9QUklWQVRFICh0eXBlLCBuZmllbGRzKTsKKyAgCisgIGZvciAoaSA9IFRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSk7ICBpIDwgbmZpZWxkczsgIGkrKykKKyAgICB7CisgICAgICBpbnQgYWNjZmxhZ3M7CisgICAgICBpbnQgYm9mZnNldDsKKyAgICAgIGlmIChmaWVsZHMgPT0gTlVMTCkKKwl7CisJICB0ZW1wID0gY2xhczsKKwkgIGZpZWxkcyA9IHZhbHVlX3N0cnVjdF9lbHQgKCZ0ZW1wLCBOVUxMLCAiZmllbGRzIiwgTlVMTCwgInN0cnVjdHVyZSIpOworCSAgZmllbGQgPSB2YWx1ZV9pbmQgKGZpZWxkcyk7CisJfQorICAgICAgZWxzZQorCXsgLyogUmUtdXNlIGZpZWxkIHZhbHVlIGZvciBuZXh0IGZpZWxkLiAqLworCSAgVkFMVUVfQUREUkVTUyAoZmllbGQpICs9IFRZUEVfTEVOR1RIIChWQUxVRV9UWVBFIChmaWVsZCkpOworCSAgVkFMVUVfTEFaWSAoZmllbGQpID0gMTsKKwl9CisgICAgICB0ZW1wID0gZmllbGQ7CisgICAgICB0ZW1wID0gdmFsdWVfc3RydWN0X2VsdCAoJnRlbXAsIE5VTEwsICJuYW1lIiwgTlVMTCwgInN0cnVjdHVyZSIpOworICAgICAgVFlQRV9GSUVMRF9OQU1FICh0eXBlLCBpKSA9CisJZ2V0X2phdmFfdXRmOF9uYW1lICgmb2JqZmlsZS0+dHlwZV9vYnN0YWNrLCB0ZW1wKTsKKyAgICAgIHRlbXAgPSBmaWVsZDsKKyAgICAgIGFjY2ZsYWdzID0gdmFsdWVfYXNfbG9uZyAodmFsdWVfc3RydWN0X2VsdCAoJnRlbXAsIE5VTEwsICJhY2NmbGFncyIsCisJCQkJCQkgIE5VTEwsICJzdHJ1Y3R1cmUiKSk7CisgICAgICB0ZW1wID0gZmllbGQ7CisgICAgICB0ZW1wID0gdmFsdWVfc3RydWN0X2VsdCAoJnRlbXAsIE5VTEwsICJpbmZvIiwgTlVMTCwgInN0cnVjdHVyZSIpOworICAgICAgYm9mZnNldCA9IHZhbHVlX2FzX2xvbmcgKHZhbHVlX3N0cnVjdF9lbHQgKCZ0ZW1wLCBOVUxMLCAiYm9mZnNldCIsCisJCQkJCQkgIE5VTEwsICJzdHJ1Y3R1cmUiKSk7CisgICAgICBpZiAoYWNjZmxhZ3MgJiAweDAwMDEpIC8qIHB1YmxpYyBhY2Nlc3MgKi8KKwl7CisJICAvKiA/Pz8gKi8KKwl9CisgICAgICBpZiAoYWNjZmxhZ3MgJiAweDAwMDIpIC8qIHByaXZhdGUgYWNjZXNzICovCisJeworCSAgU0VUX1RZUEVfRklFTERfUFJJVkFURSAodHlwZSwgaSk7CisJfQorICAgICAgaWYgKGFjY2ZsYWdzICYgMHgwMDA0KSAvKiBwcm90ZWN0ZWQgYWNjZXNzICovCisJeworCSAgU0VUX1RZUEVfRklFTERfUFJPVEVDVEVEICh0eXBlLCBpKTsKKwl9CisgICAgICBpZiAoYWNjZmxhZ3MgJiAweDAwMDgpICAvKiBBQ0NfU1RBVElDICovCisJU0VUX0ZJRUxEX1BIWVNBRERSKFRZUEVfRklFTEQodHlwZSwgaSksIGJvZmZzZXQpOworICAgICAgZWxzZQorCVRZUEVfRklFTERfQklUUE9TICh0eXBlLCBpKSA9IDggKiBib2Zmc2V0OworICAgICAgaWYgKGFjY2ZsYWdzICYgMHg4MDAwKSAvKiBGSUVMRF9VTlJFU09MVkVEX0ZMQUcgKi8KKwl7CisJICBUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpID0gZ2V0X2phdmFfb2JqZWN0X3R5cGUgKCk7IC8qIEZJWE1FICovCisJfQorICAgICAgZWxzZQorCXsKKwkgIHN0cnVjdCB0eXBlICpmdHlwZTsKKwkgIHRlbXAgPSBmaWVsZDsKKwkgIHRlbXAgPSB2YWx1ZV9zdHJ1Y3RfZWx0ICgmdGVtcCwgTlVMTCwgInR5cGUiLCBOVUxMLCAic3RydWN0dXJlIik7CisJICBmdHlwZSA9IHR5cGVfZnJvbV9jbGFzcyAodGVtcCk7CisJICBpZiAoVFlQRV9DT0RFIChmdHlwZSkgPT0gVFlQRV9DT0RFX1NUUlVDVCkKKwkgICAgZnR5cGUgPSBsb29rdXBfcG9pbnRlcl90eXBlIChmdHlwZSk7CisJICBUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpID0gZnR5cGU7CisJfQorICAgIH0KKworICB0ZW1wID0gY2xhczsKKyAgbm1ldGhvZHMgPSB2YWx1ZV9hc19sb25nICh2YWx1ZV9zdHJ1Y3RfZWx0ICgmdGVtcCwgTlVMTCwgIm1ldGhvZF9jb3VudCIsCisJCQkJCSAgICAgIE5VTEwsICJzdHJ1Y3R1cmUiKSk7CisgIFRZUEVfTkZOX0ZJRUxEU19UT1RBTCAodHlwZSkgPSBubWV0aG9kczsKKyAgaiA9IG5tZXRob2RzICogc2l6ZW9mIChzdHJ1Y3QgZm5fZmllbGQpOworICBmbl9maWVsZHMgPSAoc3RydWN0IGZuX2ZpZWxkKikKKyAgICBvYnN0YWNrX2FsbG9jICgmZHluYW1pY3Nfb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssIGopOworICBtZW1zZXQgKGZuX2ZpZWxkcywgMCwgaik7CisgIGZuX2ZpZWxkbGlzdHMgPSAoc3RydWN0IGZuX2ZpZWxkbGlzdCopCisgICAgYWxsb2NhIChubWV0aG9kcyAqIHNpemVvZiAoc3RydWN0IGZuX2ZpZWxkbGlzdCkpOworCisgIG1ldGhvZHMgPSBOVUxMOworICBmb3IgKGkgPSAwOyAgaSA8IG5tZXRob2RzOyAgaSsrKQorICAgIHsKKyAgICAgIGNoYXIgKm1uYW1lOworICAgICAgaW50IGs7CisgICAgICBpZiAobWV0aG9kcyA9PSBOVUxMKQorCXsKKwkgIHRlbXAgPSBjbGFzOworCSAgbWV0aG9kcyA9IHZhbHVlX3N0cnVjdF9lbHQgKCZ0ZW1wLCBOVUxMLCAibWV0aG9kcyIsIE5VTEwsICJzdHJ1Y3R1cmUiKTsKKwkgIG1ldGhvZCA9IHZhbHVlX2luZCAobWV0aG9kcyk7CisJfQorICAgICAgZWxzZQorCXsgLyogUmUtdXNlIG1ldGhvZCB2YWx1ZSBmb3IgbmV4dCBtZXRob2QuICovCisJICBWQUxVRV9BRERSRVNTIChtZXRob2QpICs9IFRZUEVfTEVOR1RIIChWQUxVRV9UWVBFIChtZXRob2QpKTsKKwkgIFZBTFVFX0xBWlkgKG1ldGhvZCkgPSAxOworCX0KKworICAgICAgLyogR2V0IG1ldGhvZCBuYW1lLiAqLworICAgICAgdGVtcCA9IG1ldGhvZDsKKyAgICAgIHRlbXAgPSB2YWx1ZV9zdHJ1Y3RfZWx0ICgmdGVtcCwgTlVMTCwgIm5hbWUiLCBOVUxMLCAic3RydWN0dXJlIik7CisgICAgICBtbmFtZSA9IGdldF9qYXZhX3V0ZjhfbmFtZSAoJm9iamZpbGUtPnR5cGVfb2JzdGFjaywgdGVtcCk7CisgICAgICBpZiAoc3RyY21wIChtbmFtZSwgIjxpbml0PiIpID09IDApCisJbW5hbWUgPSB1bnF1YWxpZmllZF9uYW1lOworCisgICAgICAvKiBDaGVjayBmb3IgYW4gZXhpc3RpbmcgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZS4KKyAgICAgICAqIFRoaXMgbWFrZXMgYnVpbGRpbmcgdGhlIGZuX2ZpZWxkc2xpc3RzIGFuIE8obm1ldGhvZHMqKjIpCisgICAgICAgKiBvcGVyYXRpb24uICBUaGF0IGNvdWxkIGJlIHVzaW5nIGhhc2hpbmcsIGJ1dCBJIGRvdWJ0IGl0CisgICAgICAgKiBpcyB3b3J0aCBpdC4gIE5vdGUgdGhhdCB3ZSBkbyBtYWludGFpbiB0aGUgb3JkZXIgb2YgbWV0aG9kcworICAgICAgICogaW4gdGhlIGluZmVyaW9yJ3MgTWV0aG9kIHRhYmxlIChhcyBsb25nIGFzIHRoYXQgaXMgZ3JvdXBlZAorICAgICAgICogYnkgbWV0aG9kIG5hbWUpLCB3aGljaCBJIHRoaW5rIGlzIGRlc2lyYWJsZS4gIC0tUEIgKi8KKyAgICAgIGZvciAoayA9IDAsIGogPSBUWVBFX05GTl9GSUVMRFMgKHR5cGUpOyAgOyApCisJeworCSAgaWYgKC0taiA8IDApCisJICAgIHsgLyogTm8gbWF0Y2ggLSBuZXcgbWV0aG9kIG5hbWUuICovCisJICAgICAgaiA9IFRZUEVfTkZOX0ZJRUxEUyh0eXBlKSsrOworCSAgICAgIGZuX2ZpZWxkbGlzdHNbal0ubmFtZSA9IG1uYW1lOworCSAgICAgIGZuX2ZpZWxkbGlzdHNbal0ubGVuZ3RoID0gMTsKKwkgICAgICBmbl9maWVsZGxpc3RzW2pdLmZuX2ZpZWxkcyA9ICZmbl9maWVsZHNbaV07CisJICAgICAgayA9IGk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGlmIChzdHJjbXAgKG1uYW1lLCBmbl9maWVsZGxpc3RzW2pdLm5hbWUpID09IDApCisJICAgIHsgLyogRm91bmQgYW4gZXhpc3RpbmcgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZS4gKi8KKwkgICAgICBpbnQgbDsKKwkgICAgICBpZiAobW5hbWUgIT0gdW5xdWFsaWZpZWRfbmFtZSkKKwkJb2JzdGFja19mcmVlICgmb2JqZmlsZS0+dHlwZV9vYnN0YWNrLCBtbmFtZSk7CisJICAgICAgbW5hbWUgPSBmbl9maWVsZGxpc3RzW2pdLm5hbWU7CisJICAgICAgZm5fZmllbGRsaXN0c1tqXS5sZW5ndGgrKzsKKwkgICAgICBrID0gaSAtIGs7ICAvKiBJbmRleCBvZiBuZXcgc2xvdC4gKi8KKwkgICAgICAvKiBTaGlmdCBpbnRlcnZlbmluZyBmbl9maWVsZHMgKGJldHdlZW4gayBhbmQgaSkgZG93bi4gKi8KKwkgICAgICBmb3IgKGwgPSBpOyAgbCA+IGs7ICBsLS0pIGZuX2ZpZWxkc1tsXSA9IGZuX2ZpZWxkc1tsLTFdOworCSAgICAgIGZvciAobCA9IFRZUEVfTkZOX0ZJRUxEUyAodHlwZSk7ICAtLWwgPiBqOyApCisJCWZuX2ZpZWxkbGlzdHNbbF0uZm5fZmllbGRzKys7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGsgKz0gZm5fZmllbGRsaXN0c1tqXS5sZW5ndGg7CisJfQorICAgICAgZm5fZmllbGRzW2tdLnBoeXNuYW1lID0gIiI7CisgICAgICBmbl9maWVsZHNba10uaXNfc3R1YiA9IDE7CisgICAgICBmbl9maWVsZHNba10udHlwZSA9IG1ha2VfZnVuY3Rpb25fdHlwZSAoamF2YV92b2lkX3R5cGUsIE5VTEwpOyAvKiBGSVhNRSovCisgICAgICBUWVBFX0NPREUgKGZuX2ZpZWxkc1trXS50eXBlKSA9IFRZUEVfQ09ERV9NRVRIT0Q7CisgICAgfQorCisgIGogPSBUWVBFX05GTl9GSUVMRFModHlwZSkgKiBzaXplb2YgKHN0cnVjdCBmbl9maWVsZGxpc3QpOworICBUWVBFX0ZOX0ZJRUxETElTVFMgKHR5cGUpID0gKHN0cnVjdCBmbl9maWVsZGxpc3QqKQorICAgIG9ic3RhY2tfYWxsb2MgKCZkeW5hbWljc19vYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywgaik7CisgIG1lbWNweSAoVFlQRV9GTl9GSUVMRExJU1RTICh0eXBlKSwgZm5fZmllbGRsaXN0cywgaik7CisgCisgIHJldHVybiB0eXBlOworfQorCitzdGF0aWMgc3RydWN0IHR5cGUgKmphdmFfb2JqZWN0X3R5cGU7CisKK3N0cnVjdCB0eXBlICoKK2dldF9qYXZhX29iamVjdF90eXBlICgpCit7CisgIGlmIChqYXZhX29iamVjdF90eXBlID09IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IHN5bWJvbCAqc3ltOworICAgICAgc3ltID0gbG9va3VwX3N5bWJvbCAoImphdmEubGFuZy5PYmplY3QiLCBOVUxMLCBTVFJVQ1RfTkFNRVNQQUNFLAorCQkJICAgKGludCAqKSAwLCAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCk7CisgICAgICBpZiAoc3ltID09IE5VTEwpCisJZXJyb3IgKCJjYW5ub3QgZmluZCBqYXZhLmxhbmcuT2JqZWN0Iik7CisgICAgICBqYXZhX29iamVjdF90eXBlID0gU1lNQk9MX1RZUEUgKHN5bSk7CisgICAgfQorICByZXR1cm4gamF2YV9vYmplY3RfdHlwZTsKK30KKworaW50CitnZXRfamF2YV9vYmplY3RfaGVhZGVyX3NpemUgKCkKK3sKKyAgc3RydWN0IHR5cGUgKm9ianR5cGUgPSBnZXRfamF2YV9vYmplY3RfdHlwZSAoKTsKKyAgaWYgKG9ianR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gKDIgKiBUQVJHRVRfUFRSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCk7CisgIGVsc2UKKyAgICByZXR1cm4gVFlQRV9MRU5HVEggKG9ianR5cGUpOworfQorCitpbnQKK2lzX29iamVjdF90eXBlICh0eXBlKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgQ0hFQ0tfVFlQRURFRiAodHlwZSk7CisgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9QVFIpCisgICAgeworICAgICAgc3RydWN0IHR5cGUgKnR0eXBlID0gY2hlY2tfdHlwZWRlZiAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpOworICAgICAgY2hhciAqbmFtZTsKKyAgICAgIGlmIChUWVBFX0NPREUgKHR0eXBlKSAhPSBUWVBFX0NPREVfU1RSVUNUKQorCXJldHVybiAwOworICAgICAgd2hpbGUgKFRZUEVfTl9CQVNFQ0xBU1NFUyAodHR5cGUpID4gMCkKKwl0dHlwZSA9IFRZUEVfQkFTRUNMQVNTICh0dHlwZSwgMCk7CisgICAgICBuYW1lID0gVFlQRV9UQUdfTkFNRSAodHR5cGUpOworICAgICAgaWYgKG5hbWUgIT0gTlVMTCAmJiBzdHJjbXAgKG5hbWUsICJqYXZhLmxhbmcuT2JqZWN0IikgPT0gMCkKKwlyZXR1cm4gMTsKKyAgICAgIG5hbWUgPSBUWVBFX05GSUVMRFMgKHR0eXBlKSA+IDAgPyBUWVBFX0ZJRUxEX05BTUUgKHR0eXBlLCAwKSA6IChjaGFyKikwOworICAgICAgaWYgKG5hbWUgIT0gTlVMTCAmJiBzdHJjbXAgKG5hbWUsICJ2dGFibGUiKSA9PSAwKQorCXsKKwkgIGlmIChqYXZhX29iamVjdF90eXBlID09IE5VTEwpCisJICAgIGphdmFfb2JqZWN0X3R5cGUgPSB0eXBlOworCSAgcmV0dXJuIDE7CisJfQorICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB0eXBlICoKK2phdmFfcHJpbWl0aXZlX3R5cGUgKHNpZ25hdHVyZSkKKyAgICAgaW50IHNpZ25hdHVyZTsKK3sKKyAgc3dpdGNoIChzaWduYXR1cmUpCisgICAgeworICAgIGNhc2UgJ0InOiAgcmV0dXJuIGphdmFfYnl0ZV90eXBlOworICAgIGNhc2UgJ1MnOiAgcmV0dXJuIGphdmFfc2hvcnRfdHlwZTsKKyAgICBjYXNlICdJJzogIHJldHVybiBqYXZhX2ludF90eXBlOworICAgIGNhc2UgJ0onOiAgcmV0dXJuIGphdmFfbG9uZ190eXBlOworICAgIGNhc2UgJ1onOiAgcmV0dXJuIGphdmFfYm9vbGVhbl90eXBlOworICAgIGNhc2UgJ0MnOiAgcmV0dXJuIGphdmFfY2hhcl90eXBlOworICAgIGNhc2UgJ0YnOiAgcmV0dXJuIGphdmFfZmxvYXRfdHlwZTsKKyAgICBjYXNlICdEJzogIHJldHVybiBqYXZhX2RvdWJsZV90eXBlOworICAgIGNhc2UgJ1YnOiAgcmV0dXJuIGphdmFfdm9pZF90eXBlOworICAgIH0KKyAgZXJyb3IgKCJ1bmtub3duIHNpZ25hdHVyZSAnJWMnIGZvciBwcmltaXRpdmUgdHlwZSIsIChjaGFyKSBzaWduYXR1cmUpOworfQorCisvKiBJZiBuYW1lWzAgLi4gbmFtZWxlbi0xXSBpcyB0aGUgbmFtZSBvZiBhIHByaW1pdGl2ZSBKYXZhIHR5cGUsCisgICByZXR1cm4gdGhhdCB0eXBlLiAgT3RoZXJ3aXNlLCByZXR1cm4gTlVMTC4gKi8KKworc3RydWN0IHR5cGUgKgoramF2YV9wcmltaXRpdmVfdHlwZV9mcm9tX25hbWUgKG5hbWUsIG5hbWVsZW4pCisgICAgIGNoYXIqIG5hbWU7CisgICAgIGludCBuYW1lbGVuOworeworICBzd2l0Y2ggKG5hbWVbMF0pCisgICAgeworICAgIGNhc2UgJ2InOgorICAgICAgaWYgKG5hbWVsZW4gPT0gNCAmJiBtZW1jbXAgKG5hbWUsICJieXRlIiwgNCkgPT0gMCkKKwlyZXR1cm4gamF2YV9ieXRlX3R5cGU7CisgICAgICBpZiAobmFtZWxlbiA9PSA3ICYmIG1lbWNtcCAobmFtZSwgImJvb2xlYW4iLCA3KSA9PSAwKQorCXJldHVybiBqYXZhX2Jvb2xlYW5fdHlwZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2MnOgorICAgICAgaWYgKG5hbWVsZW4gPT0gNCAmJiBtZW1jbXAgKG5hbWUsICJjaGFyIiwgNCkgPT0gMCkKKwlyZXR1cm4gamF2YV9jaGFyX3R5cGU7CisgICAgY2FzZSAnZCc6CisgICAgICBpZiAobmFtZWxlbiA9PSA2ICYmIG1lbWNtcCAobmFtZSwgImRvdWJsZSIsIDYpID09IDApCisJcmV0dXJuIGphdmFfZG91YmxlX3R5cGU7CisgICAgICBicmVhazsKKyAgICBjYXNlICdmJzoKKyAgICAgIGlmIChuYW1lbGVuID09IDUgJiYgbWVtY21wIChuYW1lLCAiZmxvYXQiLCA1KSA9PSAwKQorCXJldHVybiBqYXZhX2Zsb2F0X3R5cGU7CisgICAgICBicmVhazsKKyAgICBjYXNlICdpJzoKKyAgICAgIGlmIChuYW1lbGVuID09IDMgJiYgbWVtY21wIChuYW1lLCAiaW50IiwgMykgPT0gMCkKKwlyZXR1cm4gamF2YV9pbnRfdHlwZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2wnOgorICAgICAgaWYgKG5hbWVsZW4gPT0gNCAmJiBtZW1jbXAgKG5hbWUsICJsb25nIiwgNCkgPT0gMCkKKwlyZXR1cm4gamF2YV9sb25nX3R5cGU7CisgICAgICBicmVhazsKKyAgICBjYXNlICdzJzoKKyAgICAgIGlmIChuYW1lbGVuID09IDUgJiYgbWVtY21wIChuYW1lLCAic2hvcnQiLCA1KSA9PSAwKQorCXJldHVybiBqYXZhX3Nob3J0X3R5cGU7CisgICAgICBicmVhazsKKyAgICBjYXNlICd2JzoKKyAgICAgIGlmIChuYW1lbGVuID09IDQgJiYgbWVtY21wIChuYW1lLCAidm9pZCIsIDQpID09IDApCisJcmV0dXJuIGphdmFfdm9pZF90eXBlOworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJuIHRoZSBsZW5ndGggKGluIGJ5dGVzKSBvZiBkZW1hbmdsZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlCisgICBzaWduYXR1cmUgc3RyaW5nIFNJR05BVFVSRS4gKi8KKworc3RhdGljIGludAoramF2YV9kZW1hbmdsZWRfc2lnbmF0dXJlX2xlbmd0aCAoc2lnbmF0dXJlKQorICAgICBjaGFyICpzaWduYXR1cmU7Cit7CisgIGludCBhcnJheSA9IDA7CisgIGZvciAoOyAqc2lnbmF0dXJlID09ICdbJzsgIHNpZ25hdHVyZSsrKQorICAgIGFycmF5ICs9IDI7ICAvKiBUd28gY2hhcnMgZm9yICJbXSIuICovCisgIHN3aXRjaCAoc2lnbmF0dXJlWzBdKQorICAgIHsKKyAgICBjYXNlICdMJzoKKyAgICAgIC8qIFN1YnRyYWN0IDIgZm9yICdMJyBhbmQgJzsnLiAqLworICAgICAgcmV0dXJuIHN0cmxlbiAoc2lnbmF0dXJlKSAtIDIgKyBhcnJheTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHN0cmxlbiAoVFlQRV9OQU1FIChqYXZhX3ByaW1pdGl2ZV90eXBlIChzaWduYXR1cmVbMF0pKSkgKyBhcnJheTsKKyAgICB9Cit9CisKKy8qIERlbWFuZ2xlIHRoZSBKYXZhIHR5cGUgc2lnbmF0dXJlIFNJR05BVFVSRSwgbGVhdmluZyB0aGUgcmVzdWx0IGluIFJFU1VMVC4gKi8KKworc3RhdGljIHZvaWQKK2phdmFfZGVtYW5nbGVkX3NpZ25hdHVyZV9jb3B5IChyZXN1bHQsIHNpZ25hdHVyZSkKKyAgICAgY2hhciAqcmVzdWx0OworICAgICBjaGFyICpzaWduYXR1cmU7Cit7CisgIGludCBhcnJheSA9IDA7CisgIGNoYXIgKnB0cjsKKyAgaW50IGk7CisgIHdoaWxlICgqc2lnbmF0dXJlID09ICdbJykKKyAgICB7CisgICAgICBhcnJheSsrOworICAgICAgc2lnbmF0dXJlKys7CisgICAgfQorICBzd2l0Y2ggKHNpZ25hdHVyZVswXSkKKyAgICB7CisgICAgY2FzZSAnTCc6CisgICAgICAvKiBTdWJ0cmFjdCAyIGZvciAnTCcgYW5kICc7JywgYnV0IGFkZCAxIGZvciBmaW5hbCBudWwuICovCisgICAgICBzaWduYXR1cmUrKzsKKyAgICAgIHB0ciA9IHJlc3VsdDsKKyAgICAgIGZvciAoIDsgKnNpZ25hdHVyZSAhPSAnOycgJiYgKnNpZ25hdHVyZSAhPSAnXDAnOyBzaWduYXR1cmUrKykKKwl7CisJICBpZiAoKnNpZ25hdHVyZSA9PSAnLycpCisJICAgICpwdHIrKyA9ICcuJzsKKwkgIGVsc2UKKwkgICAgKnB0cisrID0gKnNpZ25hdHVyZTsKKwl9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcHRyID0gVFlQRV9OQU1FIChqYXZhX3ByaW1pdGl2ZV90eXBlIChzaWduYXR1cmVbMF0pKTsKKyAgICAgIGkgPSBzdHJsZW4gKHB0cik7CisgICAgICBzdHJjcHkgKHJlc3VsdCwgcHRyKTsKKyAgICAgIHB0ciA9IHJlc3VsdCArIGk7CisgICAgICBicmVhazsKKyAgICB9CisgIHdoaWxlICgtLWFycmF5ID49IDApCisgICAgeworICAgICAgKnB0cisrID0gJ1snOworICAgICAgKnB0cisrID0gJ10nOworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSBkZW1hbmdsZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlIHNpZ25hdHVyZSBzdHJpbmcgU0lHTkFUVVJFLAorICAgYXMgYSBmcmVzaGx5IGFsbG9jYXRlZCBjb3B5LiAqLworCitjaGFyICoKK2phdmFfZGVtYW5nbGVfdHlwZV9zaWduYXR1cmUgKHNpZ25hdHVyZSkKKyAgICAgY2hhciAqc2lnbmF0dXJlOworeworICBpbnQgbGVuZ3RoID0gamF2YV9kZW1hbmdsZWRfc2lnbmF0dXJlX2xlbmd0aCAoc2lnbmF0dXJlKTsKKyAgY2hhciAqcmVzdWx0ID0geG1hbGxvYyAobGVuZ3RoICsgMSk7CisgIGphdmFfZGVtYW5nbGVkX3NpZ25hdHVyZV9jb3B5IChyZXN1bHQsIHNpZ25hdHVyZSk7CisgIHJlc3VsdFtsZW5ndGhdID0gJ1wwJzsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IHR5cGUgKgoramF2YV9sb29rdXBfdHlwZSAoc2lnbmF0dXJlKQorICAgICBjaGFyICpzaWduYXR1cmU7Cit7CisgIHN3aXRjaCAoc2lnbmF0dXJlWzBdKQorICAgIHsKKyAgICBjYXNlICdMJzoKKyAgICBjYXNlICdbJzoKKyAgICAgIGVycm9yICgiamF2YV9sb29rdXBfdHlwZSBub3QgZnVsbHkgaW1wbGVtZW50ZWQiKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGphdmFfcHJpbWl0aXZlX3R5cGUgKHNpZ25hdHVyZVswXSk7CisgICAgfQorfQorCisvKiBSZXR1cm4gdGhlIHR5cGUgb2YgVFlQRSBmb2xsb3dlZCBieSBESU1TIHBhaXJzIG9mIFsgXS4KKyAgIElmIERJTVMgPT0gMCwgVFlQRSBpcyByZXR1cm5lZC4gKi8KKworc3RydWN0IHR5cGUgKgoramF2YV9hcnJheV90eXBlICh0eXBlLCBkaW1zKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgaW50IGRpbXM7Cit7CisgIHN0cnVjdCB0eXBlICpyYW5nZV90eXBlOworCisgIHdoaWxlIChkaW1zLS0gPiAwKQorICAgIHsKKyAgICAgIHJhbmdlX3R5cGUgPSBjcmVhdGVfcmFuZ2VfdHlwZSAoTlVMTCwgYnVpbHRpbl90eXBlX2ludCwgMCwgMCk7CisgICAgICAvKiBGSVhNRSAgVGhpcyBpcyBib2d1cyEgIEphdmEgYXJyYXlzIGFyZSBub3QgZ2RiIGFycmF5cyEgKi8KKyAgICAgIHR5cGUgPSBjcmVhdGVfYXJyYXlfdHlwZSAoTlVMTCwgdHlwZSwgcmFuZ2VfdHlwZSk7CisgICAgfQorCisgIHJldHVybiB0eXBlOworfQorCisvKiBDcmVhdGUgYSBKYXZhIHN0cmluZyBpbiB0aGUgaW5mZXJpb3IgZnJvbSBhIChVdGY4KSBsaXRlcmFsLiAqLworCit2YWx1ZV9wdHIKK2phdmFfdmFsdWVfc3RyaW5nIChwdHIsIGxlbikKKyAgICAgY2hhciAqcHRyOworICAgICBpbnQgbGVuOworeworICBlcnJvciAoIm5vdCBpbXBsZW1lbnRlZCAtIGphdmFfdmFsdWVfc3RyaW5nIik7IC8qIEZJWE1FICovCit9CisKKy8qIFByaW50IHRoZSBjaGFyYWN0ZXIgQyBvbiBTVFJFQU0gYXMgcGFydCBvZiB0aGUgY29udGVudHMgb2YgYSBsaXRlcmFsCisgICBzdHJpbmcgd2hvc2UgZGVsaW1pdGVyIGlzIFFVT1RFUi4gIE5vdGUgdGhhdCB0aGF0IGZvcm1hdCBmb3IgcHJpbnRpbmcKKyAgIGNoYXJhY3RlcnMgYW5kIHN0cmluZ3MgaXMgbGFuZ3VhZ2Ugc3BlY2lmaWMuICovCisKK3N0YXRpYyB2b2lkCitqYXZhX2VtaXRfY2hhciAoYywgc3RyZWFtLCBxdW90ZXIpCisgICAgIGludCBjOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgcXVvdGVyOworeworICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgJ1xcJzoKKyAgICBjYXNlICdcJyc6CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJcXCVjIiwgYyk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcYic6CisgICAgICBmcHV0c19maWx0ZXJlZCAoIlxcYiIsIHN0cmVhbSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcdCc6CisgICAgICBmcHV0c19maWx0ZXJlZCAoIlxcdCIsIHN0cmVhbSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcbic6CisgICAgICBmcHV0c19maWx0ZXJlZCAoIlxcbiIsIHN0cmVhbSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcZic6CisgICAgICBmcHV0c19maWx0ZXJlZCAoIlxcZiIsIHN0cmVhbSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdccic6CisgICAgICBmcHV0c19maWx0ZXJlZCAoIlxcciIsIHN0cmVhbSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKGlzcHJpbnQgKGMpKQorCWZwdXRjX2ZpbHRlcmVkIChjLCBzdHJlYW0pOworICAgICAgZWxzZQorCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlxcdSUuNHgiLCAodW5zaWduZWQgaW50KSBjKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZhbHVlX3B0cgorZXZhbHVhdGVfc3ViZXhwX2phdmEgKGV4cGVjdF90eXBlLCBleHAsIHBvcywgbm9zaWRlKQorICAgICBzdHJ1Y3QgdHlwZSAqZXhwZWN0X3R5cGU7CisgICAgIHJlZ2lzdGVyIHN0cnVjdCBleHByZXNzaW9uICpleHA7CisgICAgIHJlZ2lzdGVyIGludCAqcG9zOworICAgICBlbnVtIG5vc2lkZSBub3NpZGU7Cit7CisgIGludCBwYyA9ICpwb3M7CisgIGludCBpOworICBjaGFyICpuYW1lOworICBlbnVtIGV4cF9vcGNvZGUgb3AgPSBleHAtPmVsdHNbKnBvc10ub3Bjb2RlOworICB2YWx1ZV9wdHIgYXJnMSwgYXJnMjsKKyAgc3RydWN0IHR5cGUgKnR5cGU7CisgIHN3aXRjaCAob3ApCisgICAgeworICAgIGNhc2UgVU5PUF9JTkQ6CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfU0tJUCkKKwlnb3RvIHN0YW5kYXJkOworICAgICAgKCpwb3MpKys7CisgICAgICBhcmcxID0gZXZhbHVhdGVfc3ViZXhwX2phdmEgKE5VTExfVFlQRSwgZXhwLCBwb3MsIEVWQUxfTk9STUFMKTsKKyAgICAgIGlmIChpc19vYmplY3RfdHlwZSAoVkFMVUVfVFlQRSAoYXJnMSkpKQorCXsKKwkgIHN0cnVjdCB0eXBlICp0eXBlOworCisJICB0eXBlID0gdHlwZV9mcm9tX2NsYXNzIChqYXZhX2NsYXNzX2Zyb21fb2JqZWN0IChhcmcxKSk7CisJICBhcmcxID0gdmFsdWVfY2FzdCAobG9va3VwX3BvaW50ZXJfdHlwZSAodHlwZSksIGFyZzEpOworCX0KKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQKQorCWdvdG8gbm9zaWRlcmV0OworICAgICAgcmV0dXJuIHZhbHVlX2luZCAoYXJnMSk7CisKKyAgICBjYXNlIEJJTk9QX1NVQlNDUklQVDoKKyAgICAgICgqcG9zKSsrOworICAgICAgYXJnMSA9IGV2YWx1YXRlX3N1YmV4cF93aXRoX2NvZXJjaW9uIChleHAsIHBvcywgbm9zaWRlKTsKKyAgICAgIGFyZzIgPSBldmFsdWF0ZV9zdWJleHBfd2l0aF9jb2VyY2lvbiAoZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfU0tJUCkKKwlnb3RvIG5vc2lkZXJldDsKKyAgICAgIC8qIElmIHRoZSB1c2VyIGF0dGVtcHRzIHRvIHN1YnNjcmlwdCBzb21ldGhpbmcgdGhhdCBpcyBub3QgYW4KKwkgYXJyYXkgb3IgcG9pbnRlciB0eXBlIChsaWtlIGEgcGxhaW4gaW50IHZhcmlhYmxlIGZvciBleGFtcGxlKSwKKwkgdGhlbiByZXBvcnQgdGhpcyBhcyBhbiBlcnJvci4gKi8KKyAgICAgIAorICAgICAgQ09FUkNFX1JFRiAoYXJnMSk7CisgICAgICB0eXBlID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnMSkpOworICAgICAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1BUUikKKwl0eXBlID0gY2hlY2tfdHlwZWRlZiAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpOworICAgICAgbmFtZSA9IFRZUEVfTkFNRSAodHlwZSk7CisgICAgICBpZiAobmFtZSA9PSBOVUxMKQorCW5hbWUgPSBUWVBFX1RBR19OQU1FICh0eXBlKTsKKyAgICAgIGkgPSBuYW1lID09IE5VTEwgPyAwIDogc3RybGVuIChuYW1lKTsKKyAgICAgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9TVFJVQ1QKKwkgICYmIGkgPiAyICYmIG5hbWUgW2kgLSAxXSA9PSAnXScpCisJeworCSAgQ09SRV9BRERSIGFkZHJlc3M7CisJICBsb25nIGxlbmd0aCwgaW5kZXg7CisJICBzdHJ1Y3QgdHlwZSAqZWxfdHlwZTsKKwkgIGNoYXIgYnVmNFs0XTsKKworCSAgdmFsdWVfcHRyIGNsYXMgPSBqYXZhX2NsYXNzX2Zyb21fb2JqZWN0KGFyZzEpOworCSAgdmFsdWVfcHRyIHRlbXAgPSBjbGFzOworCSAgLyogR2V0IENMQVNTX0VMRU1FTlRfVFlQRSBvZiB0aGUgYXJyYXkgdHlwZS4gKi8KKwkgIHRlbXAgPSB2YWx1ZV9zdHJ1Y3RfZWx0ICgmdGVtcCwgTlVMTCwgIm1ldGhvZHMiLAorCQkJCSAgIE5VTEwsICJzdHJ1Y3R1cmUiKTsgCisJICBWQUxVRV9UWVBFICh0ZW1wKSA9IFZBTFVFX1RZUEUgKGNsYXMpOworCSAgZWxfdHlwZSA9IHR5cGVfZnJvbV9jbGFzcyAodGVtcCk7CisJICBpZiAoVFlQRV9DT0RFIChlbF90eXBlKSA9PSBUWVBFX0NPREVfU1RSVUNUKQorCSAgICBlbF90eXBlID0gbG9va3VwX3BvaW50ZXJfdHlwZSAoZWxfdHlwZSk7CisKKwkgIGlmIChub3NpZGUgPT0gRVZBTF9BVk9JRF9TSURFX0VGRkVDVFMpCisJICAgIHJldHVybiB2YWx1ZV96ZXJvIChlbF90eXBlLCBWQUxVRV9MVkFMIChhcmcxKSk7CisJICBhZGRyZXNzID0gdmFsdWVfYXNfcG9pbnRlciAoYXJnMSk7CisJICBhZGRyZXNzICs9IEpBVkFfT0JKRUNUX1NJWkU7CisJICByZWFkX21lbW9yeSAoYWRkcmVzcywgYnVmNCwgNCk7CisJICBsZW5ndGggPSAobG9uZykgZXh0cmFjdF9zaWduZWRfaW50ZWdlciAoYnVmNCwgNCk7CisJICBpbmRleCA9IChsb25nKSB2YWx1ZV9hc19sb25nIChhcmcyKTsKKwkgIGlmIChpbmRleCA+PSBsZW5ndGggfHwgaW5kZXggPCAwKQorCSAgICBlcnJvciAoImFycmF5IGluZGV4ICglbGQpIG91dCBvZiBib3VuZHMgKGxlbmd0aDogJWxkKSIsCisJCSAgIGluZGV4LCBsZW5ndGgpOworCSAgYWRkcmVzcyA9IChhZGRyZXNzICsgNCkgKyBpbmRleCAqIFRZUEVfTEVOR1RIIChlbF90eXBlKTsKKwkgIHJldHVybiB2YWx1ZV9hdCAoZWxfdHlwZSwgYWRkcmVzcywgTlVMTCk7CisJfQorICAgICAgZWxzZSBpZiAoVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfQVJSQVkpCisJeworCSAgaWYgKG5vc2lkZSA9PSBFVkFMX0FWT0lEX1NJREVfRUZGRUNUUykKKwkgICAgcmV0dXJuIHZhbHVlX3plcm8gKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpLCBWQUxVRV9MVkFMIChhcmcxKSk7CisJICBlbHNlCisJICAgIHJldHVybiB2YWx1ZV9zdWJzY3JpcHQgKGFyZzEsIGFyZzIpOworCX0KKyAgICAgIGlmIChuYW1lKQorCWVycm9yICgiY2Fubm90IHN1YnNjcmlwdCBzb21ldGhpbmcgb2YgdHlwZSBgJXMnIiwgbmFtZSk7CisgICAgICBlbHNlCisJZXJyb3IgKCJjYW5ub3Qgc3Vic2NyaXB0IHJlcXVlc3RlZCB0eXBlIik7CisKKyAgICBjYXNlIE9QX1NUUklORzoKKyAgICAgICgqcG9zKSsrOworICAgICAgaSA9IGxvbmdlc3RfdG9faW50IChleHAtPmVsdHNbcGMgKyAxXS5sb25nY29uc3QpOworICAgICAgKCpwb3MpICs9IDMgKyBCWVRFU19UT19FWFBfRUxFTSAoaSArIDEpOworICAgICAgaWYgKG5vc2lkZSA9PSBFVkFMX1NLSVApCisJZ290byBub3NpZGVyZXQ7CisgICAgICByZXR1cm4gamF2YV92YWx1ZV9zdHJpbmcgKCZleHAtPmVsdHNbcGMgKyAyXS5zdHJpbmcsIGkpOworCisgICAgY2FzZSBTVFJVQ1RPUF9TVFJVQ1Q6CisgICAgICBhcmcxID0gZXZhbHVhdGVfc3ViZXhwX3N0YW5kYXJkIChleHBlY3RfdHlwZSwgZXhwLCBwb3MsIG5vc2lkZSk7CisgICAgICAvKiBDb252ZXJ0IG9iamVjdCBmaWVsZCAoc3VjaCBhcyBUWVBFLmNsYXNzKSB0byByZWZlcmVuY2UuICovCisgICAgICBpZiAoVFlQRV9DT0RFIChWQUxVRV9UWVBFIChhcmcxKSkgPT0gVFlQRV9DT0RFX1NUUlVDVCkKKwlhcmcxID0gdmFsdWVfYWRkciAoYXJnMSk7CisgICAgICByZXR1cm4gYXJnMTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorc3RhbmRhcmQ6CisgIHJldHVybiBldmFsdWF0ZV9zdWJleHBfc3RhbmRhcmQgKGV4cGVjdF90eXBlLCBleHAsIHBvcywgbm9zaWRlKTsKKyBub3NpZGVyZXQ6CisgIHJldHVybiB2YWx1ZV9mcm9tX2xvbmdlc3QgKGJ1aWx0aW5fdHlwZV9sb25nLCAoTE9OR0VTVCkgMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitqYXZhX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCB0eXBlaWQpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBpbnQgdHlwZWlkOworeworICBzd2l0Y2ggKHR5cGVpZCkKKyAgICB7CisgICAgY2FzZSBGVF9WT0lEOiAgICAgICAgICAgcmV0dXJuIGphdmFfdm9pZF90eXBlOworICAgIGNhc2UgRlRfQk9PTEVBTjogICAgICAgIHJldHVybiBqYXZhX2Jvb2xlYW5fdHlwZTsKKyAgICBjYXNlIEZUX0NIQVI6ICAgICAgICAgICByZXR1cm4gamF2YV9jaGFyX3R5cGU7CisgICAgY2FzZSBGVF9GTE9BVDogICAgICAgICAgcmV0dXJuIGphdmFfZmxvYXRfdHlwZTsKKyAgICBjYXNlIEZUX0RCTF9QUkVDX0ZMT0FUOiByZXR1cm4gamF2YV9kb3VibGVfdHlwZTsKKyAgICBjYXNlIEZUX0JZVEU6IGNhc2UgRlRfU0lHTkVEX0NIQVI6ICAgICAgIHJldHVybiBqYXZhX2J5dGVfdHlwZTsKKyAgICBjYXNlIEZUX1NIT1JUOiBjYXNlIEZUX1NJR05FRF9TSE9SVDogICAgIHJldHVybiBqYXZhX3Nob3J0X3R5cGU7CisgICAgY2FzZSBGVF9JTlRFR0VSOiBjYXNlIEZUX1NJR05FRF9JTlRFR0VSOiByZXR1cm4gamF2YV9pbnRfdHlwZTsKKyAgICBjYXNlIEZUX0xPTkc6IGNhc2UgRlRfU0lHTkVEX0xPTkc6ICAgICAgIHJldHVybiBqYXZhX2xvbmdfdHlwZTsKKyAgICB9CisgIHJldHVybiBjX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCB0eXBlaWQpOworfQorCisvKiBUYWJsZSBtYXBwaW5nIG9wY29kZXMgaW50byBzdHJpbmdzIGZvciBwcmludGluZyBvcGVyYXRvcnMKKyAgIGFuZCBwcmVjZWRlbmNlcyBvZiB0aGUgb3BlcmF0b3JzLiAgKi8KKworY29uc3Qgc3RydWN0IG9wX3ByaW50IGphdmFfb3BfcHJpbnRfdGFiW10gPQorICB7CisgICAgeyIsIiwgIEJJTk9QX0NPTU1BLCBQUkVDX0NPTU1BLCAwfSwKKyAgICB7Ij0iLCAgQklOT1BfQVNTSUdOLCBQUkVDX0FTU0lHTiwgMX0sCisgICAgeyJ8fCIsIEJJTk9QX0xPR0lDQUxfT1IsIFBSRUNfTE9HSUNBTF9PUiwgMH0sCisgICAgeyImJiIsIEJJTk9QX0xPR0lDQUxfQU5ELCBQUkVDX0xPR0lDQUxfQU5ELCAwfSwKKyAgICB7InwiLCAgQklOT1BfQklUV0lTRV9JT1IsIFBSRUNfQklUV0lTRV9JT1IsIDB9LAorICAgIHsiXiIsICBCSU5PUF9CSVRXSVNFX1hPUiwgUFJFQ19CSVRXSVNFX1hPUiwgMH0sCisgICAgeyImIiwgIEJJTk9QX0JJVFdJU0VfQU5ELCBQUkVDX0JJVFdJU0VfQU5ELCAwfSwKKyAgICB7Ij09IiwgQklOT1BfRVFVQUwsIFBSRUNfRVFVQUwsIDB9LAorICAgIHsiIT0iLCBCSU5PUF9OT1RFUVVBTCwgUFJFQ19FUVVBTCwgMH0sCisgICAgeyI8PSIsIEJJTk9QX0xFUSwgUFJFQ19PUkRFUiwgMH0sCisgICAgeyI+PSIsIEJJTk9QX0dFUSwgUFJFQ19PUkRFUiwgMH0sCisgICAgeyI+IiwgIEJJTk9QX0dUUiwgUFJFQ19PUkRFUiwgMH0sCisgICAgeyI8IiwgIEJJTk9QX0xFU1MsIFBSRUNfT1JERVIsIDB9LAorICAgIHsiPj4iLCBCSU5PUF9SU0gsIFBSRUNfU0hJRlQsIDB9LAorICAgIHsiPDwiLCBCSU5PUF9MU0gsIFBSRUNfU0hJRlQsIDB9LAorI2lmIDAKKyAgICB7Ij4+PiIsIEJJTk9QXz8/PywgUFJFQ19TSElGVCwgMH0sCisjZW5kaWYKKyAgICB7IisiLCAgQklOT1BfQURELCBQUkVDX0FERCwgMH0sCisgICAgeyItIiwgIEJJTk9QX1NVQiwgUFJFQ19BREQsIDB9LAorICAgIHsiKiIsICBCSU5PUF9NVUwsIFBSRUNfTVVMLCAwfSwKKyAgICB7Ii8iLCAgQklOT1BfRElWLCBQUkVDX01VTCwgMH0sCisgICAgeyIlIiwgIEJJTk9QX1JFTSwgUFJFQ19NVUwsIDB9LAorICAgIHsiLSIsICBVTk9QX05FRywgUFJFQ19QUkVGSVgsIDB9LAorICAgIHsiISIsICBVTk9QX0xPR0lDQUxfTk9ULCBQUkVDX1BSRUZJWCwgMH0sCisgICAgeyJ+IiwgIFVOT1BfQ09NUExFTUVOVCwgUFJFQ19QUkVGSVgsIDB9LAorICAgIHsiKiIsICBVTk9QX0lORCwgUFJFQ19QUkVGSVgsIDB9LAorI2lmIDAKKyAgICB7Imluc3RhbmNlb2YiLCA/Pz8sID8/PywgMH0sCisjZW5kaWYKKyAgICB7IisrIiwgVU5PUF9QUkVJTkNSRU1FTlQsIFBSRUNfUFJFRklYLCAwfSwKKyAgICB7Ii0tIiwgVU5PUF9QUkVERUNSRU1FTlQsIFBSRUNfUFJFRklYLCAwfSwKKyAgICB7TlVMTCwgMCwgMCwgMH0KK307CisKK2NvbnN0IHN0cnVjdCBsYW5ndWFnZV9kZWZuIGphdmFfbGFuZ3VhZ2VfZGVmbiA9IHsKKyAgImphdmEiLAkJCQkvKiBMYW5ndWFnZSBuYW1lICovCisgIGxhbmd1YWdlX2phdmEsCisgIGNfYnVpbHRpbl90eXBlcywKKyAgcmFuZ2VfY2hlY2tfb2ZmLAorICB0eXBlX2NoZWNrX29mZiwKKyAgamF2YV9wYXJzZSwKKyAgamF2YV9lcnJvciwKKyAgZXZhbHVhdGVfc3ViZXhwX2phdmEsCisgIGNfcHJpbnRjaGFyLAkJCS8qIFByaW50IGEgY2hhcmFjdGVyIGNvbnN0YW50ICovCisgIGNfcHJpbnRzdHIsCQkJLyogRnVuY3Rpb24gdG8gcHJpbnQgc3RyaW5nIGNvbnN0YW50ICovCisgIGphdmFfZW1pdF9jaGFyLAkJLyogRnVuY3Rpb24gdG8gcHJpbnQgYSBzaW5nbGUgY2hhcmFjdGVyICovCisgIGphdmFfY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGUsCS8qIENyZWF0ZSBmdW5kYW1lbnRhbCB0eXBlIGluIHRoaXMgbGFuZ3VhZ2UgKi8KKyAgamF2YV9wcmludF90eXBlLAkJLyogUHJpbnQgYSB0eXBlIHVzaW5nIGFwcHJvcHJpYXRlIHN5bnRheCAqLworICBqYXZhX3ZhbF9wcmludCwJCS8qIFByaW50IGEgdmFsdWUgdXNpbmcgYXBwcm9wcmlhdGUgc3ludGF4ICovCisgIGphdmFfdmFsdWVfcHJpbnQsCQkvKiBQcmludCBhIHRvcC1sZXZlbCB2YWx1ZSAqLworICB7IiIsICAgICAgIiIsICAgICIiLCAgICIifSwJLyogQmluYXJ5IGZvcm1hdCBpbmZvICovCisgIHsiMCVsbyIsICAgIjAiLCAgICJvIiwgICIifSwJLyogT2N0YWwgZm9ybWF0IGluZm8gKi8KKyAgeyIlbGQiLCAgICAiIiwgICAgImQiLCAgIiJ9LAkvKiBEZWNpbWFsIGZvcm1hdCBpbmZvICovCisgIHsiMHglbHgiLCAgIjB4IiwgICJ4IiwgICIifSwJLyogSGV4IGZvcm1hdCBpbmZvICovCisgIGphdmFfb3BfcHJpbnRfdGFiLAkJLyogZXhwcmVzc2lvbiBvcGVyYXRvcnMgZm9yIHByaW50aW5nICovCisgIDAsCQkJCS8qIG5vdCBjLXN0eWxlIGFycmF5cyAqLworICAwLAkJCQkvKiBTdHJpbmcgbG93ZXIgYm91bmQgKi8KKyAgJmJ1aWx0aW5fdHlwZV9jaGFyLAkJLyogVHlwZSBvZiBzdHJpbmcgZWxlbWVudHMgKi8gCisgIExBTkdfTUFHSUMKK307CisKK3ZvaWQKK19pbml0aWFsaXplX2phdmFfbGFuZ3VhZ2UgKCkKK3sKKworICBqYXZhX2ludF90eXBlICAgID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCAgNCwgMCwgImludCIsIE5VTEwpOworICBqYXZhX3Nob3J0X3R5cGUgID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCAgMiwgMCwgInNob3J0IiwgTlVMTCk7CisgIGphdmFfbG9uZ190eXBlICAgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsICA4LCAwLCAibG9uZyIsIE5VTEwpOworICBqYXZhX2J5dGVfdHlwZSAgID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCAgMSwgMCwgImJ5dGUiLCBOVUxMKTsKKyAgamF2YV9ib29sZWFuX3R5cGU9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0JPT0wsIDEsIDAsICJib29sZWFuIiwgTlVMTCk7CisgIGphdmFfY2hhcl90eXBlICAgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9DSEFSLCAyLCBUWVBFX0ZMQUdfVU5TSUdORUQsICJjaGFyIiwgTlVMTCk7CisgIGphdmFfZmxvYXRfdHlwZSAgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9GTFQsICA0LCAwLCAiZmxvYXQiLCBOVUxMKTsKKyAgamF2YV9kb3VibGVfdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0ZMVCwgIDgsIDAsICJkb3VibGUiLCBOVUxMKTsKKyAgamF2YV92b2lkX3R5cGUgICA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX1ZPSUQsIDEsIDAsICJ2b2lkIiwgTlVMTCk7CisKKyAgYWRkX2xhbmd1YWdlICgmamF2YV9sYW5ndWFnZV9kZWZuKTsKK30KKworLyogQ2xlYW51cCBjb2RlIHRoYXQgc2hvdWxkIGJlIHJ1biBvbiBldmVyeSAicnVuIi4KKyAgIFdlIHNob3VsZCB1c2UgbWFrZV9ydW5fY2xlYW51cCB0byBoYXZlIHRoaXMgYmUgY2FsbGVkLgorICAgQnV0IHdpbGwgdGhhdCBtZXNzIHVwIHZhbHVlcyBpbiB2YWx1ZSBoaXN0cnk/ICBGSVhNRSAqLworCit2b2lkIGphdmFfcmVydW5fY2xlYW51cCAoKQoreworICBpZiAoY2xhc3Nfc3ltdGFiICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZV9zeW10YWIgKGNsYXNzX3N5bXRhYik7IC8qID8/PyAqLworICAgICAgY2xhc3Nfc3ltdGFiID0gTlVMTDsKKyAgICB9CisgIGlmIChkeW5hbWljc19vYmpmaWxlICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZV9vYmpmaWxlIChkeW5hbWljc19vYmpmaWxlKTsKKyAgICAgIGR5bmFtaWNzX29iamZpbGUgPSBOVUxMOworICAgIH0KKworICBqYXZhX29iamVjdF90eXBlID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2dkYi9qdi1sYW5nLmggYi9nZGIvanYtbGFuZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YzQ0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvanYtbGFuZy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIEphdmEgbGFuZ3VhZ2Ugc3VwcG9ydCBkZWZpbml0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworZXh0ZXJuIGludAoramF2YV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7CS8qIERlZmluZWQgaW4ganYtZXhwLnkgKi8KKworZXh0ZXJuIHZvaWQKK2phdmFfZXJyb3IgUEFSQU1TICgoY2hhciAqKSk7CS8qIERlZmluZWQgaW4ganYtZXhwLnkgKi8KKworLyogc2l6ZW9mIChzdHJ1Y3QgT2JqZWN0KSAqLworI2RlZmluZSBKQVZBX09CSkVDVF9TSVpFIChnZXRfamF2YV9vYmplY3RfaGVhZGVyX3NpemUgKCkpCisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqamF2YV9pbnRfdHlwZTsKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqamF2YV9ieXRlX3R5cGU7CitleHRlcm4gc3RydWN0IHR5cGUgKmphdmFfc2hvcnRfdHlwZTsKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqamF2YV9sb25nX3R5cGU7CitleHRlcm4gc3RydWN0IHR5cGUgKmphdmFfYm9vbGVhbl90eXBlOworZXh0ZXJuIHN0cnVjdCB0eXBlICpqYXZhX2NoYXJfdHlwZTsKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqamF2YV9mbG9hdF90eXBlOworZXh0ZXJuIHN0cnVjdCB0eXBlICpqYXZhX2RvdWJsZV90eXBlOworZXh0ZXJuIHN0cnVjdCB0eXBlICpqYXZhX3ZvaWRfdHlwZTsKKworZXh0ZXJuIGludAoramF2YV92YWxfcHJpbnQgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqLCBpbnQsIENPUkVfQUREUiwgR0RCX0ZJTEUgKiwgaW50LCBpbnQsCisJCQlpbnQsIGVudW0gdmFsX3ByZXR0eXByaW50KSk7CisKK2V4dGVybiBpbnQKK2phdmFfdmFsdWVfcHJpbnQgUEFSQU1TICgoc3RydWN0IHZhbHVlICosIEdEQl9GSUxFICosIGludCwKKwkJCSAgZW51bSB2YWxfcHJldHR5cHJpbnQpKTsKKworZXh0ZXJuIHZhbHVlX3B0ciBqYXZhX2NsYXNzX2Zyb21fb2JqZWN0IFBBUkFNUyAoKHZhbHVlX3B0cikpOworCitleHRlcm4gc3RydWN0IHR5cGUgKnR5cGVfZnJvbV9jbGFzcyBQQVJBTVMgKChzdHJ1Y3QgdmFsdWUgKikpOworCitleHRlcm4gc3RydWN0IHR5cGUgKmphdmFfcHJpbWl0aXZlX3R5cGUgUEFSQU1TICgoaW50IHNpZ25hdHVyZSkpOworCitleHRlcm4gc3RydWN0IHR5cGUgKmphdmFfcHJpbWl0aXZlX3R5cGVfZnJvbV9uYW1lIFBBUkFNUyAoKGNoYXIqLCBpbnQpKTsKKworZXh0ZXJuIHN0cnVjdCB0eXBlICpqYXZhX2FycmF5X3R5cGUgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgaW50KSk7CisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqZ2V0X2phdmFfb2JqZWN0X3R5cGUgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIGludCBnZXRfamF2YV9vYmplY3RfaGVhZGVyX3NpemUgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gc3RydWN0IHR5cGUgKmphdmFfbG9va3VwX2NsYXNzIFBBUkFNUygoY2hhciAqKSk7CisKK2V4dGVybiBpbnQgaXNfb2JqZWN0X3R5cGUgUEFSQU1TICgoc3RydWN0IHR5cGUqKSk7CisKK2V4dGVybiB2b2lkCQkJLyogRGVmaW5lZCBpbiBqdi10eXBlcHJpbnQuYyAqLworamF2YV9wcmludF90eXBlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIGNoYXIgKiwgR0RCX0ZJTEUgKiwgaW50LCBpbnQpKTsKKworZXh0ZXJuIGNoYXIgKmphdmFfZGVtYW5nbGVfdHlwZV9zaWduYXR1cmUgUEFSQU1TICgoY2hhciAqKSk7CmRpZmYgLS1naXQgYS9nZGIvanYtdHlwZXByaW50LmMgYi9nZGIvanYtdHlwZXByaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1MzlhMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9qdi10eXBlcHJpbnQuYwpAQCAtMCwwICsxLDMzOSBAQAorLyogU3VwcG9ydCBmb3IgcHJpbnRpbmcgSmF2YSB0eXBlcyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJkZW1hbmdsZS5oIgorI2luY2x1ZGUgImp2LWxhbmcuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSAidHlwZXByaW50LmgiCisKK3N0YXRpYyB2b2lkCitqYXZhX3R5cGVfcHJpbnRfZGVyaXZhdGlvbl9pbmZvIChzdHJlYW0sIHR5cGUpCisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworeworICBjaGFyICpuYW1lOworICBpbnQgaTsKKyAgaW50IG5fYmFzZXM7CisgIGludCBwcmV2OworCisgIG5fYmFzZXMgPSBUWVBFX05fQkFTRUNMQVNTRVMgKHR5cGUpOworCisgIGZvciAoaSA9IDAsIHByZXYgPSAwOyBpIDwgbl9iYXNlczsgaSsrKQorICAgIHsKKyAgICAgIGludCBraW5kOworCisgICAgICBraW5kID0gQkFTRVRZUEVfVklBX1ZJUlRVQUwodHlwZSwgaSkgPyAnSScgOiAnRSc7CisKKyAgICAgIGZwdXRzX2ZpbHRlcmVkIChraW5kID09IHByZXYgPyAiLCAiCisJCSAgICAgIDoga2luZCA9PSAnSScgPyAiIGltcGxlbWVudHMgIgorCQkgICAgICA6ICIgZXh0ZW5kcyAiLAorCQkgICAgICBzdHJlYW0pOworICAgICAgcHJldiA9IGtpbmQ7CisgICAgICBuYW1lID0gdHlwZV9uYW1lX25vX3RhZyAoVFlQRV9CQVNFQ0xBU1MgKHR5cGUsIGkpKTsKKworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJXMiLCBuYW1lID8gbmFtZSA6ICIobnVsbCkiKTsKKyAgICB9CisKKyAgaWYgKGkgPiAwKQorICAgIGZwdXRzX2ZpbHRlcmVkICgiICIsIHN0cmVhbSk7Cit9CisKKy8qIFByaW50IHRoZSBuYW1lIG9mIHRoZSB0eXBlIChvciB0aGUgdWx0aW1hdGUgcG9pbnRlciB0YXJnZXQsCisgICBmdW5jdGlvbiB2YWx1ZSBvciBhcnJheSBlbGVtZW50KSwgb3IgdGhlIGRlc2NyaXB0aW9uIG9mIGEKKyAgIHN0cnVjdHVyZSBvciB1bmlvbi4KKworICAgU0hPVyBwb3NpdGl2ZSBtZWFucyBwcmludCBkZXRhaWxzIGFib3V0IHRoZSB0eXBlIChlLmcuIGVudW0gdmFsdWVzKSwKKyAgIGFuZCBwcmludCBzdHJ1Y3R1cmUgZWxlbWVudHMgcGFzc2luZyBTSE9XIC0gMSBmb3Igc2hvdy4KKyAgIFNIT1cgbmVnYXRpdmUgbWVhbnMganVzdCBwcmludCB0aGUgdHlwZSBuYW1lIG9yIHN0cnVjdCB0YWcgaWYgdGhlcmUgaXMgb25lLgorICAgSWYgdGhlcmUgaXMgbm8gbmFtZSwgcHJpbnQgc29tZXRoaW5nIHNlbnNpYmxlIGJ1dCBjb25jaXNlIGxpa2UKKyAgICJzdHJ1Y3Qgey4uLn0iLgorICAgU0hPVyB6ZXJvIG1lYW5zIGp1c3QgcHJpbnQgdGhlIHR5cGUgbmFtZSBvciBzdHJ1Y3QgdGFnIGlmIHRoZXJlIGlzIG9uZS4KKyAgIElmIHRoZXJlIGlzIG5vIG5hbWUsIHByaW50IHNvbWV0aGluZyBzZW5zaWJsZSBidXQgbm90IGFzIGNvbmNpc2UgbGlrZQorICAgInN0cnVjdCB7aW50IHg7IGludCB5O30iLgorCisgICBMRVZFTCBpcyB0aGUgbnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgYnkuCisgICBXZSBpbmNyZWFzZSBpdCBmb3Igc29tZSByZWN1cnNpdmUgY2FsbHMuICAqLworCit2b2lkCitqYXZhX3R5cGVfcHJpbnRfYmFzZSAodHlwZSwgc3RyZWFtLCBzaG93LCBsZXZlbCkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGludCBzaG93OworICAgICBpbnQgbGV2ZWw7Cit7CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBpbnQgbGVuOworICBjaGFyICptYW5nbGVkX25hbWU7CisgIGNoYXIgKmRlbWFuZ2xlZF9uYW1lOworICBRVUlUOworCisgIHdyYXBfaGVyZSAoIiAgICAiKTsKKworICBpZiAodHlwZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiPHR5cGUgdW5rbm93bj4iLCBzdHJlYW0pOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBXaGVuIFNIT1cgaXMgemVybyBvciBsZXNzLCBhbmQgdGhlcmUgaXMgYSB2YWxpZCB0eXBlIG5hbWUsIHRoZW4gYWx3YXlzCisgICAgIGp1c3QgcHJpbnQgdGhlIHR5cGUgbmFtZSBkaXJlY3RseSBmcm9tIHRoZSB0eXBlLiAgKi8KKworICBpZiAoc2hvdyA8PSAwCisgICAgICAmJiBUWVBFX05BTUUgKHR5cGUpICE9IE5VTEwpCisgICAgeworICAgICAgZnB1dHNfZmlsdGVyZWQgKFRZUEVfTkFNRSAodHlwZSksIHN0cmVhbSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIENIRUNLX1RZUEVERUYgKHR5cGUpOworCisgIHN3aXRjaCAoVFlQRV9DT0RFICh0eXBlKSkKKyAgICB7CisgICAgY2FzZSBUWVBFX0NPREVfUFRSOgorICAgICAgamF2YV90eXBlX3ByaW50X2Jhc2UgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpLCBzdHJlYW0sIHNob3csIGxldmVsKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfU1RSVUNUOgorICAgICAgaWYgKFRZUEVfVEFHX05BTUUgKHR5cGUpICE9IE5VTEwgJiYgVFlQRV9UQUdfTkFNRSAodHlwZSlbMF0gPT0gJ1snKQorCXsJCQkvKiBhcnJheSB0eXBlICovCisJICBjaGFyICpuYW1lID0gamF2YV9kZW1hbmdsZV90eXBlX3NpZ25hdHVyZSAoVFlQRV9UQUdfTkFNRSAodHlwZSkpOworCSAgZnB1dHNfZmlsdGVyZWQgKG5hbWUsIHN0cmVhbSk7CisJICBmcmVlIChuYW1lKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgaWYgKHNob3cgPj0gMCkKKwlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJjbGFzcyAiKTsKKworICAgICAgaWYgKFRZUEVfVEFHX05BTUUgKHR5cGUpICE9IE5VTEwpCisJeworCSAgZnB1dHNfZmlsdGVyZWQgKFRZUEVfVEFHX05BTUUgKHR5cGUpLCBzdHJlYW0pOworCSAgaWYgKHNob3cgPiAwKQorCSAgICBmcHV0c19maWx0ZXJlZCAoIiAiLCBzdHJlYW0pOworCX0KKworICAgICAgd3JhcF9oZXJlICgiICAgICIpOworCisgICAgICBpZiAoc2hvdyA8IDApCisJeworCSAgLyogSWYgd2UganVzdCBwcmludGVkIGEgdGFnIG5hbWUsIG5vIG5lZWQgdG8gcHJpbnQgYW55dGhpbmcgZWxzZS4gICovCisJICBpZiAoVFlQRV9UQUdfTkFNRSAodHlwZSkgPT0gTlVMTCkKKwkgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiey4uLn0iKTsKKwl9CisgICAgICBlbHNlIGlmIChzaG93ID4gMCB8fCBUWVBFX1RBR19OQU1FICh0eXBlKSA9PSBOVUxMKQorCXsKKwkgIGphdmFfdHlwZV9wcmludF9kZXJpdmF0aW9uX2luZm8gKHN0cmVhbSwgdHlwZSk7CisJICAKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIntcbiIpOworCSAgaWYgKChUWVBFX05GSUVMRFMgKHR5cGUpID09IDApICYmIChUWVBFX05GTl9GSUVMRFMgKHR5cGUpID09IDApKQorCSAgICBpZiAoVFlQRV9GTEFHUyAodHlwZSkgJiBUWVBFX0ZMQUdfU1RVQikKKwkgICAgICBmcHJpbnRmaV9maWx0ZXJlZCAobGV2ZWwgKyA0LCBzdHJlYW0sICI8aW5jb21wbGV0ZSB0eXBlPlxuIik7CisJICAgIGVsc2UKKwkgICAgICBmcHJpbnRmaV9maWx0ZXJlZCAobGV2ZWwgKyA0LCBzdHJlYW0sICI8bm8gZGF0YSBmaWVsZHM+XG4iKTsKKworCSAgLyogSWYgdGhlcmUgaXMgYSBiYXNlIGNsYXNzIGZvciB0aGlzIHR5cGUsCisJICAgICBkbyBub3QgcHJpbnQgdGhlIGZpZWxkIHRoYXQgaXQgb2NjdXBpZXMuICAqLworCisJICBsZW4gPSBUWVBFX05GSUVMRFMgKHR5cGUpOworCSAgZm9yIChpID0gVFlQRV9OX0JBU0VDTEFTU0VTICh0eXBlKTsgaSA8IGxlbjsgaSsrKQorCSAgICB7CisJICAgICAgUVVJVDsKKwkgICAgICAvKiBEb24ndCBwcmludCBvdXQgdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gICovCisJICAgICAgaWYgKFNUUkVRTiAoVFlQRV9GSUVMRF9OQU1FICh0eXBlLCBpKSwgIl92cHRyIiwgNSkKKwkJICAmJiBpc19jcGx1c19tYXJrZXIgKChUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIGkpKVs1XSkpCisJCWNvbnRpbnVlOworCisJICAgICAgLyogRG9uJ3QgcHJpbnQgdGhlIGR1bW15IGZpZWxkICJjbGFzcyIuICovCisJICAgICAgaWYgKFNUUkVRTiAoVFlQRV9GSUVMRF9OQU1FICh0eXBlLCBpKSwgImNsYXNzIiwgNSkpCisJCWNvbnRpbnVlOworCisJICAgICAgcHJpbnRfc3BhY2VzX2ZpbHRlcmVkIChsZXZlbCArIDQsIHN0cmVhbSk7CisKKwkgICAgICBpZiAoSEFWRV9DUExVU19TVFJVQ1QgKHR5cGUpKQorCQlpZiAoVFlQRV9GSUVMRF9QUk9URUNURUQgKHR5cGUsIGkpKQorCQkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInByb3RlY3RlZCAiKTsKKwkJZWxzZSBpZiAoVFlQRV9GSUVMRF9QUklWQVRFICh0eXBlLCBpKSkKKwkJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJwcml2YXRlICIpOworCQllbHNlCisJCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAicHVibGljICIpOworCisJICAgICAgaWYgKFRZUEVfRklFTERfU1RBVElDICh0eXBlLCBpKSkKKwkJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAic3RhdGljICIpOworCisJICAgICAgamF2YV9wcmludF90eXBlIChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpLAorCQkJICAgICAgIFRZUEVfRklFTERfTkFNRSAodHlwZSwgaSksCisJCQkgICAgICAgc3RyZWFtLCBzaG93IC0gMSwgbGV2ZWwgKyA0KTsKKworCSAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjtcbiIpOworCSAgICB9CisKKwkgIC8qIElmIHRoZXJlIGFyZSBib3RoIGZpZWxkcyBhbmQgbWV0aG9kcywgcHV0IGEgc3BhY2UgYmV0d2Vlbi4gKi8KKwkgIGxlbiA9IFRZUEVfTkZOX0ZJRUxEUyAodHlwZSk7CisJICBpZiAobGVuKQorCSAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiXG4iKTsKKworCSAgLyogUHJpbnQgb3V0IHRoZSBtZXRob2RzICovCisKKwkgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkgICAgeworCSAgICAgIHN0cnVjdCBmbl9maWVsZCAqZjsKKwkgICAgICBpbnQgajsKKwkgICAgICBjaGFyICptZXRob2RfbmFtZTsKKwkgICAgICBjaGFyICpuYW1lOworCSAgICAgIGludCBpc19jb25zdHJ1Y3RvcjsKKwkgICAgICBpbnQgbl9vdmVybG9hZHM7CisKKwkgICAgICBmID0gVFlQRV9GTl9GSUVMRExJU1QxICh0eXBlLCBpKTsKKwkgICAgICBuX292ZXJsb2FkcyA9IFRZUEVfRk5fRklFTERMSVNUX0xFTkdUSCAodHlwZSwgaSk7CisJICAgICAgbWV0aG9kX25hbWUgPSBUWVBFX0ZOX0ZJRUxETElTVF9OQU1FICh0eXBlLCBpKTsKKwkgICAgICBuYW1lID0gdHlwZV9uYW1lX25vX3RhZyAodHlwZSk7CisJICAgICAgaXNfY29uc3RydWN0b3IgPSBuYW1lICYmIFNUUkVRIChtZXRob2RfbmFtZSwgbmFtZSk7CisKKwkgICAgICBmb3IgKGogPSAwOyBqIDwgbl9vdmVybG9hZHM7IGorKykKKwkJeworCQkgIGNoYXIgKnBoeXNuYW1lOworCQkgIGludCBpc19mdWxsX3BoeXNuYW1lX2NvbnN0cnVjdG9yOworCisJCSAgcGh5c25hbWUgPSBUWVBFX0ZOX0ZJRUxEX1BIWVNOQU1FIChmLCBqKTsKKworCQkgIGlzX2Z1bGxfcGh5c25hbWVfY29uc3RydWN0b3IgPSAKKwkJICAgICgocGh5c25hbWVbMF0gPT0gJ18nICYmIHBoeXNuYW1lWzFdID09ICdfJworCQkgICAgICAmJiBzdHJjaHIgKCIwMTIzNDU2Nzg5UXQiLCBwaHlzbmFtZVsyXSkpCisJCSAgICAgfHwgU1RSRVFOIChwaHlzbmFtZSwgIl9fY3RfXyIsIDYpCisJCSAgICAgfHwgREVTVFJVQ1RPUl9QUkVGSVhfUCAocGh5c25hbWUpCisJCSAgICAgfHwgU1RSRVFOIChwaHlzbmFtZSwgIl9fZHRfXyIsIDYpKTsKKworCQkgIFFVSVQ7CisKKwkJICBwcmludF9zcGFjZXNfZmlsdGVyZWQgKGxldmVsICsgNCwgc3RyZWFtKTsKKworCQkgIGlmIChUWVBFX0ZOX0ZJRUxEX1BST1RFQ1RFRCAoZiwgaikpCisJCSAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJwcm90ZWN0ZWQgIik7CisJCSAgZWxzZSBpZiAoVFlQRV9GTl9GSUVMRF9QUklWQVRFIChmLCBqKSkKKwkJICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInByaXZhdGUgIik7CisJCSAgZWxzZSBpZiAoVFlQRV9GTl9GSUVMRF9QVUJMSUMgKGYsIGopKQorCQkgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAicHVibGljICIpOworCisJCSAgaWYgKFRZUEVfRk5fRklFTERfQUJTVFJBQ1QgKGYsIGopKQorCQkgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiYWJzdHJhY3QgIik7CisJCSAgaWYgKFRZUEVfRk5fRklFTERfU1RBVElDIChmLCBqKSkKKwkJICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInN0YXRpYyAiKTsKKwkJICBpZiAoVFlQRV9GTl9GSUVMRF9GSU5BTCAoZiwgaikpCisJCSAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJmaW5hbCAiKTsKKwkJICBpZiAoVFlQRV9GTl9GSUVMRF9TWU5DSFJPTklaRUQgKGYsIGopKQorCQkgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAic3luY2hyb25pemVkICIpOworCQkgIGlmIChUWVBFX0ZOX0ZJRUxEX05BVElWRSAoZiwgaikpCisJCSAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJuYXRpdmUgIik7CisKKwkJICBpZiAoVFlQRV9UQVJHRVRfVFlQRSAoVFlQRV9GTl9GSUVMRF9UWVBFIChmLCBqKSkgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgLyogS2VlcCBHREIgZnJvbSBjcmFzaGluZyBoZXJlLiAgKi8KKwkJICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiPHVuZGVmaW5lZCB0eXBlPiAlcztcbiIsCisJCQkgICAgICAgVFlQRV9GTl9GSUVMRF9QSFlTTkFNRSAoZiwgaikpOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICBlbHNlIGlmICghaXNfY29uc3RydWN0b3IgJiYgIWlzX2Z1bGxfcGh5c25hbWVfY29uc3RydWN0b3IpCisJCSAgICB7CisJCSAgICAgIHR5cGVfcHJpbnQgKFRZUEVfVEFSR0VUX1RZUEUgKFRZUEVfRk5fRklFTERfVFlQRSAoZiwgaikpLAorCQkJCSAgIiIsIHN0cmVhbSwgLTEpOworCQkgICAgICBmcHV0c19maWx0ZXJlZCAoIiAiLCBzdHJlYW0pOworCQkgICAgfQorCisJCSAgaWYgKFRZUEVfRk5fRklFTERfU1RVQiAoZiwgaikpCisJCSAgICAvKiBCdWlsZCBzb21ldGhpbmcgd2UgY2FuIGRlbWFuZ2xlLiAgKi8KKwkJICAgIG1hbmdsZWRfbmFtZSA9IGdkYl9tYW5nbGVfbmFtZSAodHlwZSwgaSwgaik7CisJCSAgZWxzZQorCQkgICAgbWFuZ2xlZF9uYW1lID0gVFlQRV9GTl9GSUVMRF9QSFlTTkFNRSAoZiwgaik7CisKKwkJICBkZW1hbmdsZWRfbmFtZSA9CisJCSAgICBjcGx1c19kZW1hbmdsZSAobWFuZ2xlZF9uYW1lLAorCQkJCSAgICBETUdMX0FOU0kgfCBETUdMX1BBUkFNUyB8IERNR0xfSkFWQSk7CisKKwkJICBpZiAoZGVtYW5nbGVkX25hbWUgPT0gTlVMTCkKKwkJICAgIGRlbWFuZ2xlZF9uYW1lID0gc3RyZHVwIChtYW5nbGVkX25hbWUpOworCisJCSAgeworCQkgICAgY2hhciAqZGVtYW5nbGVkX25vX2NsYXNzOworCQkgICAgY2hhciAqcHRyOworCisJCSAgICBwdHIgPSBkZW1hbmdsZWRfbm9fY2xhc3MgPSBkZW1hbmdsZWRfbmFtZTsKKworCQkgICAgd2hpbGUgKDEpCisJCSAgICAgIHsKKwkJCWNoYXIgYzsKKworCQkJYyA9ICpwdHIrKzsKKworCQkJaWYgKGMgPT0gMCB8fCBjID09ICcoJykKKwkJCSAgYnJlYWs7CisJCQlpZiAoYyA9PSAnLicpCisJCQkgIGRlbWFuZ2xlZF9ub19jbGFzcyA9IHB0cjsKKwkJICAgICAgfQorCisJCSAgICBmcHV0c19maWx0ZXJlZCAoZGVtYW5nbGVkX25vX2NsYXNzLCBzdHJlYW0pOworCQkgICAgZnJlZSAoZGVtYW5nbGVkX25hbWUpOworCQkgIH0KKworCQkgIGlmIChUWVBFX0ZOX0ZJRUxEX1NUVUIgKGYsIGopKQorCQkgICAgZnJlZSAobWFuZ2xlZF9uYW1lKTsKKworCQkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjtcbiIpOworCQl9CisJICAgIH0KKworCSAgZnByaW50ZmlfZmlsdGVyZWQgKGxldmVsLCBzdHJlYW0sICJ9Iik7CisJfQorICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisJY190eXBlX3ByaW50X2Jhc2UgKHR5cGUsIHN0cmVhbSwgc2hvdywgbGV2ZWwpOworICAgIH0KK30KKworLyogTEVWRUwgaXMgdGhlIGRlcHRoIHRvIGluZGVudCBsaW5lcyBieS4gICovCisKK3ZvaWQKK2phdmFfcHJpbnRfdHlwZSAodHlwZSwgdmFyc3RyaW5nLCBzdHJlYW0sIHNob3csIGxldmVsKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgY2hhciAqdmFyc3RyaW5nOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgc2hvdzsKKyAgICAgaW50IGxldmVsOworeworICBpbnQgZGVtYW5nbGVkX2FyZ3M7CisKKyAgamF2YV90eXBlX3ByaW50X2Jhc2UgKHR5cGUsIHN0cmVhbSwgc2hvdywgbGV2ZWwpOworCisgIGlmICh2YXJzdHJpbmcgIT0gTlVMTCAmJiAqdmFyc3RyaW5nICE9ICdcMCcpCisgICAgeworICAgICAgZnB1dHNfZmlsdGVyZWQgKCIgIiwgc3RyZWFtKTsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICh2YXJzdHJpbmcsIHN0cmVhbSk7CisgICAgfQorCisgIC8qIEZvciBkZW1hbmdsZWQgZnVuY3Rpb24gbmFtZXMsIHdlIGhhdmUgdGhlIGFyZ2xpc3QgYXMgcGFydCBvZiB0aGUgbmFtZSwKKyAgICAgc28gZG9uJ3QgcHJpbnQgYW4gYWRkaXRpb25hbCBwYWlyIG9mICgpJ3MgKi8KKworICBkZW1hbmdsZWRfYXJncyA9IHN0cmNocih2YXJzdHJpbmcsICcoJykgIT0gTlVMTDsKKyAgY190eXBlX3ByaW50X3ZhcnNwZWNfc3VmZml4ICh0eXBlLCBzdHJlYW0sIHNob3csIDAsIGRlbWFuZ2xlZF9hcmdzKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9qdi12YWxwcmludC5jIGIvZ2RiL2p2LXZhbHByaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmYWU3ZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9qdi12YWxwcmludC5jCkBAIC0wLDAgKzEsNTI2IEBACisvKiBTdXBwb3J0IGZvciBwcmludGluZyBKYXZhIHZhbHVlcyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgImRlbWFuZ2xlLmgiCisjaW5jbHVkZSAidmFscHJpbnQuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1ZGUgImp2LWxhbmcuaCIKKyNpbmNsdWRlICJjLWxhbmcuaCIKKworaW50CitqYXZhX3ZhbHVlX3ByaW50ICh2YWwsIHN0cmVhbSwgZm9ybWF0LCBwcmV0dHkpCisgICAgIHZhbHVlX3B0ciB2YWw7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGludCBmb3JtYXQ7CisgICAgIGVudW0gdmFsX3ByZXR0eXByaW50IHByZXR0eTsKK3sKKyAgc3RydWN0IHR5cGUgKnR5cGU7CisgIENPUkVfQUREUiBhZGRyZXNzOworICBpbnQgaTsKKyAgY2hhciAqbmFtZTsKKworICB0eXBlID0gVkFMVUVfVFlQRSAodmFsKTsKKyAgYWRkcmVzcyA9IFZBTFVFX0FERFJFU1MgKHZhbCkgKyBWQUxVRV9PRkZTRVQgKHZhbCk7CisKKyAgaWYgKGlzX29iamVjdF90eXBlICh0eXBlKSkKKyAgICB7CisgICAgICBDT1JFX0FERFIgb2JqX2FkZHI7CisKKyAgICAgIC8qIEdldCB0aGUgcnVuLXRpbWUgdHlwZSwgYW5kIGNhc3QgdGhlIG9iamVjdCBpbnRvIHRoYXQgKi8KKworICAgICAgb2JqX2FkZHIgPSB1bnBhY2tfcG9pbnRlciAodHlwZSwgVkFMVUVfQ09OVEVOVFMgKHZhbCkpOworCisgICAgICBpZiAob2JqX2FkZHIgIT0gMCkKKwl7CisJICB0eXBlID0gdHlwZV9mcm9tX2NsYXNzIChqYXZhX2NsYXNzX2Zyb21fb2JqZWN0ICh2YWwpKTsKKwkgIHR5cGUgPSBsb29rdXBfcG9pbnRlcl90eXBlICh0eXBlKTsKKworCSAgdmFsID0gdmFsdWVfYXQgKHR5cGUsIGFkZHJlc3MsIE5VTEwpOworCX0KKyAgICB9CisKKyAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1BUUiAmJiAhIHZhbHVlX2xvZ2ljYWxfbm90ICh2YWwpKQorICAgIHR5cGVfcHJpbnQgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpLCAiIiwgc3RyZWFtLCAtMSk7CisKKyAgbmFtZSA9IFRZUEVfVEFHX05BTUUgKHR5cGUpOworICBpZiAoVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfU1RSVUNUICYmIG5hbWUgIT0gTlVMTAorICAgICAgJiYgKGkgPSBzdHJsZW4gKG5hbWUpLCBuYW1lW2ktMV0gPT0gJ10nKSkKKyAgICB7CisgICAgICBjaGFyIGJ1ZjRbNF07CisgICAgICBsb25nIGxlbmd0aDsKKyAgICAgIHVuc2lnbmVkIGludCB0aGluZ3NfcHJpbnRlZCA9IDA7CisgICAgICBpbnQgcmVwczsgCisgICAgICBzdHJ1Y3QgdHlwZSAqZWxfdHlwZSA9IGphdmFfcHJpbWl0aXZlX3R5cGVfZnJvbV9uYW1lIChuYW1lLCBpIC0gMik7CisKKyAgICAgIGkgPSAwOworICAgICAgcmVhZF9tZW1vcnkgKGFkZHJlc3MgKyBKQVZBX09CSkVDVF9TSVpFLCBidWY0LCA0KTsKKworICAgICAgbGVuZ3RoID0gKGxvbmcpIGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKGJ1ZjQsIDQpOworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAie2xlbmd0aDogJWxkIiwgbGVuZ3RoKTsKKworICAgICAgaWYgKGVsX3R5cGUgPT0gTlVMTCkKKwl7CisJICBDT1JFX0FERFIgZWxlbWVudCwgbmV4dF9lbGVtZW50OworCisJICBhZGRyZXNzICs9IEpBVkFfT0JKRUNUX1NJWkUgKyA0OyAvKiBTa2lwIG9iamVjdCBoZWFkZXIgYW5kIGxlbmd0aC4gKi8KKworCSAgd2hpbGUgKGkgPCBsZW5ndGggJiYgdGhpbmdzX3ByaW50ZWQgPCBwcmludF9tYXgpCisJICAgIHsKKwkgICAgICBjaGFyIGJ1ZltUQVJHRVRfUFRSX0JJVCAvIEhPU1RfQ0hBUl9CSVRdOworCisJICAgICAgZnB1dHNfZmlsdGVyZWQgKCIsICIsIHN0cmVhbSk7CisJICAgICAgd3JhcF9oZXJlIChuX3NwYWNlcyAoMikpOworCisJICAgICAgaWYgKGkgPiAwKQorCQllbGVtZW50ID0gbmV4dF9lbGVtZW50OworCSAgICAgIGVsc2UKKwkJeworCQkgIHJlYWRfbWVtb3J5IChhZGRyZXNzLCBidWYsIHNpemVvZihidWYpKTsKKwkJICBhZGRyZXNzICs9IFRBUkdFVF9QVFJfQklUIC8gSE9TVF9DSEFSX0JJVDsKKwkJICBlbGVtZW50ID0gZXh0cmFjdF9hZGRyZXNzIChidWYsIHNpemVvZihidWYpKTsKKwkJfQorCisJICAgICAgZm9yIChyZXBzID0gMTsgIGkgKyByZXBzIDwgbGVuZ3RoOyAgcmVwcysrKQorCQl7CisJCSAgcmVhZF9tZW1vcnkgKGFkZHJlc3MsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQkgIGFkZHJlc3MgKz0gVEFSR0VUX1BUUl9CSVQgLyBIT1NUX0NIQVJfQklUOworCQkgIG5leHRfZWxlbWVudCA9IGV4dHJhY3RfYWRkcmVzcyAoYnVmLCBzaXplb2YoYnVmKSk7CisJCSAgaWYgKG5leHRfZWxlbWVudCAhPSBlbGVtZW50KQorCQkgICAgYnJlYWs7CisJCX0KKworCSAgICAgIGlmIChyZXBzID09IDEpCisJCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiVkOiAiLCBpKTsKKwkgICAgICBlbHNlCisJCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiVkLi4lZDogIiwgaSwgaSArIHJlcHMgLSAxKTsKKworCSAgICAgIGlmIChlbGVtZW50ID09IDApCisJCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIm51bGwiKTsKKwkgICAgICBlbHNlCisJCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIkAleCIsIGVsZW1lbnQpOworCisJICAgICAgdGhpbmdzX3ByaW50ZWQrKzsKKwkgICAgICBpICs9IHJlcHM7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgdmFsdWVfcHRyIHYgPSBhbGxvY2F0ZV92YWx1ZSAoZWxfdHlwZSk7CisJICB2YWx1ZV9wdHIgbmV4dF92ID0gYWxsb2NhdGVfdmFsdWUgKGVsX3R5cGUpOworCisJICBWQUxVRV9BRERSRVNTICh2KSA9IGFkZHJlc3MgKyBKQVZBX09CSkVDVF9TSVpFICsgNDsKKwkgIFZBTFVFX0FERFJFU1MgKG5leHRfdikgPSBWQUxVRV9BRERSRVNTICh2KTsKKworCSAgd2hpbGUgKGkgPCBsZW5ndGggJiYgdGhpbmdzX3ByaW50ZWQgPCBwcmludF9tYXgpCisJICAgIHsKKwkgICAgICBmcHV0c19maWx0ZXJlZCAoIiwgIiwgc3RyZWFtKTsKKwkgICAgICB3cmFwX2hlcmUgKG5fc3BhY2VzICgyKSk7CisKKwkgICAgICBpZiAoaSA+IDApCisJCXsKKwkJICB2YWx1ZV9wdHIgdG1wOworCisJCSAgdG1wID0gbmV4dF92OworCQkgIG5leHRfdiA9IHY7CisJCSAgdiA9IHRtcDsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIFZBTFVFX0xBWlkgKHYpID0gMTsKKwkJICBWQUxVRV9PRkZTRVQgKHYpID0gMDsKKwkJfQorCisJICAgICAgVkFMVUVfT0ZGU0VUIChuZXh0X3YpID0gVkFMVUVfT0ZGU0VUICh2KTsKKworCSAgICAgIGZvciAocmVwcyA9IDE7ICBpICsgcmVwcyA8IGxlbmd0aDsgIHJlcHMrKykKKwkJeworCQkgIFZBTFVFX0xBWlkgKG5leHRfdikgPSAxOworCQkgIFZBTFVFX09GRlNFVCAobmV4dF92KSArPSBUWVBFX0xFTkdUSCAoZWxfdHlwZSk7CisJCSAgaWYgKG1lbWNtcCAoVkFMVUVfQ09OVEVOVFMgKHYpLCBWQUxVRV9DT05URU5UUyAobmV4dF92KSwKKwkJCSAgICAgIFRZUEVfTEVOR1RIIChlbF90eXBlKSkgIT0gMCkKKwkJICAgIGJyZWFrOworCQl9CisKKwkgICAgICBpZiAocmVwcyA9PSAxKQorCQlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlZDogIiwgaSk7CisJICAgICAgZWxzZQorCQlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlZC4uJWQ6ICIsIGksIGkgKyByZXBzIC0gMSk7CisKKwkgICAgICB2YWxfcHJpbnQgKFZBTFVFX1RZUEUgKHYpLCBWQUxVRV9DT05URU5UUyAodiksIDAsIDAsCisJCQkgc3RyZWFtLCBmb3JtYXQsIDIsIDEsIHByZXR0eSk7CisKKwkgICAgICB0aGluZ3NfcHJpbnRlZCsrOworCSAgICAgIGkgKz0gcmVwczsKKwkgICAgfQorCX0KKworICAgICAgaWYgKGkgPCBsZW5ndGgpCisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiLi4uIik7CisKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIn0iKTsKKworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIElmIGl0J3MgdHlwZSBTdHJpbmcsIHByaW50IGl0ICovCisKKyAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1BUUgorICAgICAgJiYgVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkKKyAgICAgICYmIFRZUEVfTkFNRSAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpCisgICAgICAmJiBzdHJjbXAgKFRZUEVfTkFNRSAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpLCAiamF2YS5sYW5nLlN0cmluZyIpID09IDAKKyAgICAgICYmIChmb3JtYXQgPT0gMCB8fCBmb3JtYXQgPT0gJ3MnKQorICAgICAgJiYgYWRkcmVzcyAhPSAwKQorICAgIHsKKyAgICAgIHZhbHVlX3B0ciBkYXRhX3ZhbDsKKyAgICAgIENPUkVfQUREUiBkYXRhOworICAgICAgdmFsdWVfcHRyIGJvZmZzZXRfdmFsOworICAgICAgdW5zaWduZWQgbG9uZyBib2Zmc2V0OworICAgICAgdmFsdWVfcHRyIGNvdW50X3ZhbDsKKyAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQ7CisgICAgICB2YWx1ZV9wdHIgbWFyazsKKworICAgICAgbWFyayA9IHZhbHVlX21hcmsgKCk7CS8qIFJlbWVtYmVyIHN0YXJ0IG9mIG5ldyB2YWx1ZXMgKi8KKworICAgICAgZGF0YV92YWwgPSB2YWx1ZV9zdHJ1Y3RfZWx0ICgmdmFsLCBOVUxMLCAiZGF0YSIsIE5VTEwsIE5VTEwpOworICAgICAgZGF0YSA9IHZhbHVlX2FzX3BvaW50ZXIgKGRhdGFfdmFsKTsKKworICAgICAgYm9mZnNldF92YWwgPSB2YWx1ZV9zdHJ1Y3RfZWx0ICgmdmFsLCBOVUxMLCAiYm9mZnNldCIsIE5VTEwsIE5VTEwpOworICAgICAgYm9mZnNldCA9IHZhbHVlX2FzX3BvaW50ZXIgKGJvZmZzZXRfdmFsKTsKKworICAgICAgY291bnRfdmFsID0gdmFsdWVfc3RydWN0X2VsdCAoJnZhbCwgTlVMTCwgImNvdW50IiwgTlVMTCwgTlVMTCk7CisgICAgICBjb3VudCA9IHZhbHVlX2FzX3BvaW50ZXIgKGNvdW50X3ZhbCk7CisKKyAgICAgIHZhbHVlX2ZyZWVfdG9fbWFyayAobWFyayk7IC8qIFJlbGVhc2UgdW5uZWNlc3NhcnkgdmFsdWVzICovCisKKyAgICAgIHZhbF9wcmludF9zdHJpbmcgKGRhdGEgKyBib2Zmc2V0LCBjb3VudCwgMiwgc3RyZWFtKTsKKworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHJldHVybiAodmFsX3ByaW50ICh0eXBlLCBWQUxVRV9DT05URU5UUyAodmFsKSwgMCwgYWRkcmVzcywKKwkJICAgICBzdHJlYW0sIGZvcm1hdCwgMSwgMCwgcHJldHR5KSk7Cit9CisKKy8qIFRZUEUsIFZBTEFERFIsIEFERFJFU1MsIFNUUkVBTSwgUkVDVVJTRSwgYW5kIFBSRVRUWSBoYXZlIHRoZQorICAgc2FtZSBtZWFuaW5ncyBhcyBpbiBjcF9wcmludF92YWx1ZSBhbmQgY192YWxfcHJpbnQuCisKKyAgIERPTlRfUFJJTlQgaXMgYW4gYXJyYXkgb2YgYmFzZWNsYXNzIHR5cGVzIHRoYXQgd2UKKyAgIHNob3VsZCBub3QgcHJpbnQsIG9yIHplcm8gaWYgY2FsbGVkIGZyb20gdG9wIGxldmVsLiAgKi8KKwordm9pZAoramF2YV9wcmludF92YWx1ZV9maWVsZHMgKHR5cGUsIHZhbGFkZHIsIGFkZHJlc3MsIHN0cmVhbSwKKwkJCSBmb3JtYXQsIHJlY3Vyc2UsIHByZXR0eSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGNoYXIgKnZhbGFkZHI7CisgICAgIENPUkVfQUREUiBhZGRyZXNzOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgZm9ybWF0OworICAgICBpbnQgcmVjdXJzZTsKKyAgICAgZW51bSB2YWxfcHJldHR5cHJpbnQgcHJldHR5OworeworICBpbnQgaSwgbGVuLCBuX2Jhc2VjbGFzc2VzOworCisgIENIRUNLX1RZUEVERUYgKHR5cGUpOworCisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgInsiKTsKKyAgbGVuID0gVFlQRV9ORklFTERTICh0eXBlKTsKKyAgbl9iYXNlY2xhc3NlcyA9IFRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSk7CisKKyAgaWYgKG5fYmFzZWNsYXNzZXMgPiAwKQorICAgIHsKKyAgICAgIGludCBpLCBuX2Jhc2VjbGFzc2VzID0gVFlQRV9OX0JBU0VDTEFTU0VTICh0eXBlKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG5fYmFzZWNsYXNzZXM7IGkrKykKKwl7CisJICBpbnQgYm9mZnNldDsKKwkgIHN0cnVjdCB0eXBlICpiYXNlY2xhc3MgPSBjaGVja190eXBlZGVmIChUWVBFX0JBU0VDTEFTUyAodHlwZSwgaSkpOworCSAgY2hhciAqYmFzZW5hbWUgPSBUWVBFX05BTUUgKGJhc2VjbGFzcyk7CisJICBjaGFyICpiYXNlX3ZhbGFkZHI7CisJICAKKwkgIGlmIChCQVNFVFlQRV9WSUFfVklSVFVBTCAodHlwZSwgaSkpCisJICAgIGNvbnRpbnVlOworCisJICBpZiAoYmFzZW5hbWUgIT0gTlVMTCAmJiBzdHJjbXAgKGJhc2VuYW1lLCAiamF2YS5sYW5nLk9iamVjdCIpID09IDApCisJICAgIGNvbnRpbnVlOworCisJICBib2Zmc2V0ID0gMDsKKworCSAgaWYgKHByZXR0eSkKKwkgICAgeworCSAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlxuIik7CisJICAgICAgcHJpbnRfc3BhY2VzX2ZpbHRlcmVkICgyICogKHJlY3Vyc2UrMSksIHN0cmVhbSk7CisJICAgIH0KKwkgIGZwdXRzX2ZpbHRlcmVkICgiPCIsIHN0cmVhbSk7CisJICAvKiBOb3Qgc3VyZSB3aGF0IHRoZSBiZXN0IG5vdGF0aW9uIGlzIGluIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIG5vCisJICAgICBiYXNlY2xhc3MgbmFtZS4gICovCisJICBmcHV0c19maWx0ZXJlZCAoYmFzZW5hbWUgPyBiYXNlbmFtZSA6ICIiLCBzdHJlYW0pOworCSAgZnB1dHNfZmlsdGVyZWQgKCI+ID0gIiwgc3RyZWFtKTsKKworCSAgYmFzZV92YWxhZGRyID0gdmFsYWRkcjsKKworCSAgamF2YV9wcmludF92YWx1ZV9maWVsZHMgKGJhc2VjbGFzcywgYmFzZV92YWxhZGRyLCBhZGRyZXNzICsgYm9mZnNldCwKKwkJCQkgICBzdHJlYW0sIGZvcm1hdCwgcmVjdXJzZSsxLCBwcmV0dHkpOworCSAgZnB1dHNfZmlsdGVyZWQgKCIsICIsIHN0cmVhbSk7CisJICAKKwlmbHVzaF9pdDoKKwkgIDsKKwl9CisKKyAgICB9CisKKyAgaWYgKCFsZW4gJiYgbl9iYXNlY2xhc3NlcyA9PSAxKQorICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjxObyBkYXRhIGZpZWxkcz4iKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGV4dGVybiBpbnQgaW5zcGVjdF9pdDsKKyAgICAgIGludCBmaWVsZHNfc2VlbiA9IDA7CisKKyAgICAgIGZvciAoaSA9IG5fYmFzZWNsYXNzZXM7IGkgPCBsZW47IGkrKykKKwl7CisJICAvKiBJZiByZXF1ZXN0ZWQsIHNraXAgcHJpbnRpbmcgb2Ygc3RhdGljIGZpZWxkcy4gICovCisJICBpZiAoVFlQRV9GSUVMRF9TVEFUSUMgKHR5cGUsIGkpKQorCSAgICB7CisJICAgICAgY2hhciAqbmFtZSA9IFRZUEVfRklFTERfTkFNRSAodHlwZSwgaSk7CisJICAgICAgaWYgKCFzdGF0aWNfZmllbGRfcHJpbnQpCisJCWNvbnRpbnVlOworCSAgICAgIGlmIChuYW1lICE9IE5VTEwgJiYgc3RyY21wIChuYW1lLCAiY2xhc3MiKSA9PSAwKQorCQljb250aW51ZTsKKwkgICAgfQorCSAgaWYgKGZpZWxkc19zZWVuKQorCSAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIsICIpOworCSAgZWxzZSBpZiAobl9iYXNlY2xhc3NlcyA+IDApCisJICAgIHsKKwkgICAgICBpZiAocHJldHR5KQorCQl7CisJCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiXG4iKTsKKwkJICBwcmludF9zcGFjZXNfZmlsdGVyZWQgKDIgKyAyICogcmVjdXJzZSwgc3RyZWFtKTsKKwkJICBmcHV0c19maWx0ZXJlZCAoIm1lbWJlcnMgb2YgIiwgc3RyZWFtKTsKKwkJICBmcHV0c19maWx0ZXJlZCAodHlwZV9uYW1lX25vX3RhZyAodHlwZSksIHN0cmVhbSk7CisJCSAgZnB1dHNfZmlsdGVyZWQgKCI6ICIsIHN0cmVhbSk7CisJCX0KKwkgICAgfQorCSAgZmllbGRzX3NlZW4gPSAxOworCisJICBpZiAocHJldHR5KQorCSAgICB7CisJICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiXG4iKTsKKwkgICAgICBwcmludF9zcGFjZXNfZmlsdGVyZWQgKDIgKyAyICogcmVjdXJzZSwgc3RyZWFtKTsKKwkgICAgfQorCSAgZWxzZSAKKwkgICAgeworCSAgICAgIHdyYXBfaGVyZSAobl9zcGFjZXMgKDIgKyAyICogcmVjdXJzZSkpOworCSAgICB9CisJICBpZiAoaW5zcGVjdF9pdCkKKwkgICAgeworCSAgICAgIGlmIChUWVBFX0NPREUgKFRZUEVfRklFTERfVFlQRSAodHlwZSwgaSkpID09IFRZUEVfQ09ERV9QVFIpCisJCWZwdXRzX2ZpbHRlcmVkICgiXCIoIHB0ciBcIiIsIHN0cmVhbSk7CisJICAgICAgZWxzZQorCQlmcHV0c19maWx0ZXJlZCAoIlwiKCBub2RlZiBcIiIsIHN0cmVhbSk7CisJICAgICAgaWYgKFRZUEVfRklFTERfU1RBVElDICh0eXBlLCBpKSkKKwkJZnB1dHNfZmlsdGVyZWQgKCJzdGF0aWMgIiwgc3RyZWFtKTsKKwkgICAgICBmcHJpbnRmX3N5bWJvbF9maWx0ZXJlZCAoc3RyZWFtLCBUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIGkpLAorCQkJCSAgICAgICBsYW5ndWFnZV9jcGx1cywKKwkJCQkgICAgICAgRE1HTF9QQVJBTVMgfCBETUdMX0FOU0kpOworCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiXCIgXCIiLCBzdHJlYW0pOworCSAgICAgIGZwcmludGZfc3ltYm9sX2ZpbHRlcmVkIChzdHJlYW0sIFRZUEVfRklFTERfTkFNRSAodHlwZSwgaSksCisJCQkJICAgICAgIGxhbmd1YWdlX2NwbHVzLAorCQkJCSAgICAgICBETUdMX1BBUkFNUyB8IERNR0xfQU5TSSk7CisJICAgICAgZnB1dHNfZmlsdGVyZWQgKCJcIikgXCIiLCBzdHJlYW0pOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhbm5vdGF0ZV9maWVsZF9iZWdpbiAoVFlQRV9GSUVMRF9UWVBFICh0eXBlLCBpKSk7CisKKwkgICAgICBpZiAoVFlQRV9GSUVMRF9TVEFUSUMgKHR5cGUsIGkpKQorCQlmcHV0c19maWx0ZXJlZCAoInN0YXRpYyAiLCBzdHJlYW0pOworCSAgICAgIGZwcmludGZfc3ltYm9sX2ZpbHRlcmVkIChzdHJlYW0sIFRZUEVfRklFTERfTkFNRSAodHlwZSwgaSksCisJCQkJICAgICAgIGxhbmd1YWdlX2NwbHVzLAorCQkJCSAgICAgICBETUdMX1BBUkFNUyB8IERNR0xfQU5TSSk7CisJICAgICAgYW5ub3RhdGVfZmllbGRfbmFtZV9lbmQgKCk7CisJICAgICAgZnB1dHNfZmlsdGVyZWQgKCI6ICIsIHN0cmVhbSk7CisJICAgICAgYW5ub3RhdGVfZmllbGRfdmFsdWUgKCk7CisJICAgIH0KKworCSAgaWYgKCFUWVBFX0ZJRUxEX1NUQVRJQyAodHlwZSwgaSkgJiYgVFlQRV9GSUVMRF9QQUNLRUQgKHR5cGUsIGkpKQorCSAgICB7CisJICAgICAgdmFsdWVfcHRyIHY7CisKKwkgICAgICAvKiBCaXRmaWVsZHMgcmVxdWlyZSBzcGVjaWFsIGhhbmRsaW5nLCBlc3BlY2lhbGx5IGR1ZSB0byBieXRlCisJCSBvcmRlciBwcm9ibGVtcy4gICovCisJICAgICAgaWYgKFRZUEVfRklFTERfSUdOT1JFICh0eXBlLCBpKSkKKwkJeworCQkgICBmcHV0c19maWx0ZXJlZCAoIjxvcHRpbWl6ZWQgb3V0IG9yIHplcm8gbGVuZ3RoPiIsIHN0cmVhbSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkgICAgICAgICAgIHYgPSB2YWx1ZV9mcm9tX2xvbmdlc3QgKFRZUEVfRklFTERfVFlQRSAodHlwZSwgaSksCisJCQkJICAgdW5wYWNrX2ZpZWxkX2FzX2xvbmcgKHR5cGUsIHZhbGFkZHIsIGkpKTsKKworICAgICAgICAgICAgICAgICAgIHZhbF9wcmludCAoVFlQRV9GSUVMRF9UWVBFKHR5cGUsIGkpLCBWQUxVRV9DT05URU5UUyAodiksIDAsCisJCQkgICAgICAwLCBzdHJlYW0sIGZvcm1hdCwgMCwgcmVjdXJzZSArIDEsIHByZXR0eSk7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKFRZUEVfRklFTERfSUdOT1JFICh0eXBlLCBpKSkKKwkJeworCQkgICBmcHV0c19maWx0ZXJlZCAoIjxvcHRpbWl6ZWQgb3V0IG9yIHplcm8gbGVuZ3RoPiIsIHN0cmVhbSk7CisJCX0KKwkgICAgICBlbHNlIGlmIChUWVBFX0ZJRUxEX1NUQVRJQyAodHlwZSwgaSkpCisJCXsKKwkJICB2YWx1ZV9wdHIgdiA9IHZhbHVlX3N0YXRpY19maWVsZCAodHlwZSwgaSk7CisJCSAgaWYgKHYgPT0gTlVMTCkKKwkJICAgIGZwdXRzX2ZpbHRlcmVkICgiPG9wdGltaXplZCBvdXQ+Iiwgc3RyZWFtKTsKKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIHN0cnVjdCB0eXBlICp0ID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAodikpOworCQkgICAgICBpZiAoVFlQRV9DT0RFICh0KSA9PSBUWVBFX0NPREVfU1RSVUNUKQorCQkJdiA9IHZhbHVlX2FkZHIgKHYpOworCQkgICAgICB2YWxfcHJpbnQgKFZBTFVFX1RZUEUgKHYpLAorCQkJCSBWQUxVRV9DT05URU5UUyAodiksIDAsIFZBTFVFX0FERFJFU1MgKHYpLAorCQkJCSBzdHJlYW0sIGZvcm1hdCwgMCwgcmVjdXJzZSsxLCBwcmV0dHkpOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJICAgICAgICAgICB2YWxfcHJpbnQgKFRZUEVfRklFTERfVFlQRSAodHlwZSwgaSksIAorCQkJICAgICAgdmFsYWRkciArIFRZUEVfRklFTERfQklUUE9TICh0eXBlLCBpKSAvIDgsIDAsCisJCQkgICAgICBhZGRyZXNzICsgVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIGkpIC8gOCwKKwkJCSAgICAgIHN0cmVhbSwgZm9ybWF0LCAwLCByZWN1cnNlICsgMSwgcHJldHR5KTsKKwkJfQorCSAgICB9CisJICBhbm5vdGF0ZV9maWVsZF9lbmQgKCk7CisJfQorCisgICAgICBpZiAocHJldHR5KQorCXsKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlxuIik7CisJICBwcmludF9zcGFjZXNfZmlsdGVyZWQgKDIgKiByZWN1cnNlLCBzdHJlYW0pOworCX0KKyAgICB9CisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIn0iKTsKK30KKworLyogUHJpbnQgZGF0YSBvZiB0eXBlIFRZUEUgbG9jYXRlZCBhdCBWQUxBRERSICh3aXRoaW4gR0RCKSwgd2hpY2ggY2FtZSBmcm9tCisgICB0aGUgaW5mZXJpb3IgYXQgYWRkcmVzcyBBRERSRVNTLCBvbnRvIHN0ZGlvIHN0cmVhbSBTVFJFQU0gYWNjb3JkaW5nIHRvCisgICBGT1JNQVQgKGEgbGV0dGVyIG9yIDAgZm9yIG5hdHVyYWwgZm9ybWF0KS4gIFRoZSBkYXRhIGF0IFZBTEFERFIgaXMgaW4KKyAgIHRhcmdldCBieXRlIG9yZGVyLgorCisgICBJZiB0aGUgZGF0YSBhcmUgYSBzdHJpbmcgcG9pbnRlciwgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0cmluZyBjaGFyYWN0ZXJzCisgICBwcmludGVkLgorCisgICBJZiBERVJFRl9SRUYgaXMgbm9uemVybywgdGhlbiBkZXJlZmVyZW5jZSByZWZlcmVuY2VzLCBvdGhlcndpc2UganVzdCBwcmludAorICAgdGhlbSBsaWtlIHBvaW50ZXJzLgorCisgICBUaGUgUFJFVFRZIHBhcmFtZXRlciBjb250cm9scyBwcmV0dHlwcmludGluZy4gICovCisKK2ludAoramF2YV92YWxfcHJpbnQgKHR5cGUsIHZhbGFkZHIsIGVtYmVkZGVkX29mZnNldCwgYWRkcmVzcywgc3RyZWFtLCBmb3JtYXQsCisJCWRlcmVmX3JlZiwgcmVjdXJzZSwgcHJldHR5KQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgY2hhciAqdmFsYWRkcjsKKyAgICAgQ09SRV9BRERSIGFkZHJlc3M7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGludCBmb3JtYXQ7CisgICAgIGludCBkZXJlZl9yZWY7CisgICAgIGludCByZWN1cnNlOworICAgICBlbnVtIHZhbF9wcmV0dHlwcmludCBwcmV0dHk7Cit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpID0gMDsJCS8qIE51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQgKi8KKyAgc3RydWN0IHR5cGUgKnRhcmdldF90eXBlOworICBDT1JFX0FERFIgYWRkcjsKKworICBDSEVDS19UWVBFREVGICh0eXBlKTsKKyAgc3dpdGNoIChUWVBFX0NPREUgKHR5cGUpKQorICAgIHsKKyAgICBjYXNlIFRZUEVfQ09ERV9QVFI6CisgICAgICBpZiAoZm9ybWF0ICYmIGZvcm1hdCAhPSAncycpCisJeworCSAgcHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCAodmFsYWRkciwgdHlwZSwgZm9ybWF0LCAwLCBzdHJlYW0pOworCSAgYnJlYWs7CisJfQorI2lmIDAKKyAgICAgIGlmICh2dGJscHJpbnQgJiYgY3BfaXNfdnRibF9wdHJfdHlwZSh0eXBlKSkKKwl7CisgICAgICAgICAgLyogUHJpbnQgdGhlIHVubWFuZ2xlZCBuYW1lIGlmIGRlc2lyZWQuICAqLworCSAgLyogUHJpbnQgdnRhYmxlIGVudHJ5IC0gd2Ugb25seSBnZXQgaGVyZSBpZiB3ZSBBUkUgdXNpbmcKKwkgICAgIC1mdnRhYmxlX3RodW5rcy4gIChPdGhlcndpc2UsIGxvb2sgdW5kZXIgVFlQRV9DT0RFX1NUUlVDVC4pICovCisJICBwcmludF9hZGRyZXNzX2RlbWFuZ2xlKGV4dHJhY3RfYWRkcmVzcyAodmFsYWRkciwgVFlQRV9MRU5HVEggKHR5cGUpKSwKKwkJCQkgc3RyZWFtLCBkZW1hbmdsZSk7CisJICBicmVhazsKKwl9CisjZW5kaWYKKyAgICAgIGFkZHIgPSB1bnBhY2tfcG9pbnRlciAodHlwZSwgdmFsYWRkcik7CisgICAgICBpZiAoYWRkciA9PSAwKQorCXsKKwkgIGZwdXRzX2ZpbHRlcmVkICgibnVsbCIsIHN0cmVhbSk7CisJICByZXR1cm4gaTsKKwl9CisgICAgICB0YXJnZXRfdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKKworICAgICAgaWYgKFRZUEVfQ09ERSAodGFyZ2V0X3R5cGUpID09IFRZUEVfQ09ERV9GVU5DKQorCXsKKwkgIC8qIFRyeSB0byBwcmludCB3aGF0IGZ1bmN0aW9uIGl0IHBvaW50cyB0by4gICovCisJICBwcmludF9hZGRyZXNzX2RlbWFuZ2xlIChhZGRyLCBzdHJlYW0sIGRlbWFuZ2xlKTsKKwkgIC8qIFJldHVybiB2YWx1ZSBpcyBpcnJlbGV2YW50IGV4Y2VwdCBmb3Igc3RyaW5nIHBvaW50ZXJzLiAgKi8KKwkgIHJldHVybiAoMCk7CisJfQorCisgICAgICBpZiAoYWRkcmVzc3ByaW50ICYmIGZvcm1hdCAhPSAncycpCisJeworCSAgZnB1dHNfZmlsdGVyZWQgKCJAIiwgc3RyZWFtKTsKKwkgIHByaW50X2xvbmdlc3QgKHN0cmVhbSwgJ3gnLCAwLCAoVUxPTkdFU1QpIGFkZHIpOworCX0KKworICAgICAgcmV0dXJuIGk7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9DSEFSOgorICAgICAgZm9ybWF0ID0gZm9ybWF0ID8gZm9ybWF0IDogb3V0cHV0X2Zvcm1hdDsKKyAgICAgIGlmIChmb3JtYXQpCisJcHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCAodmFsYWRkciwgdHlwZSwgZm9ybWF0LCAwLCBzdHJlYW0pOworICAgICAgZWxzZQorCUxBX1BSSU5UX0NIQVIgKChpbnQpIHVucGFja19sb25nICh0eXBlLCB2YWxhZGRyKSwgc3RyZWFtKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfSU5UOgorICAgICAgLyogQ2FuJ3QganVzdCBjYWxsIGNfdmFsX3ByaW50IGJlY2F1c2UgdGhhdCBwcmludCBieXRlcyBhcyBDIGNoYXJzLiAqLworICAgICAgZm9ybWF0ID0gZm9ybWF0ID8gZm9ybWF0IDogb3V0cHV0X2Zvcm1hdDsKKyAgICAgIGlmIChmb3JtYXQpCisJcHJpbnRfc2NhbGFyX2Zvcm1hdHRlZCAodmFsYWRkciwgdHlwZSwgZm9ybWF0LCAwLCBzdHJlYW0pOworICAgICAgZWxzZQorCXZhbF9wcmludF90eXBlX2NvZGVfaW50ICh0eXBlLCB2YWxhZGRyLCBzdHJlYW0pOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9TVFJVQ1Q6CisgICAgICBqYXZhX3ByaW50X3ZhbHVlX2ZpZWxkcyAodHlwZSwgdmFsYWRkciwgYWRkcmVzcywgc3RyZWFtLCBmb3JtYXQsCisJCQkgICAgICAgcmVjdXJzZSwgcHJldHR5KTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBjX3ZhbF9wcmludCAodHlwZSwgdmFsYWRkciwgZW1iZWRkZWRfb2Zmc2V0LCBhZGRyZXNzLCBzdHJlYW0sCisJCQkgIGZvcm1hdCwgZGVyZWZfcmVmLCByZWN1cnNlLCBwcmV0dHkpOworICAgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dkYi9rZGItc3RhcnQuYyBiL2dkYi9rZGItc3RhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWM1NThmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL2tkYi1zdGFydC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIE1haW4gbG9vcCBmb3IgdGhlIHN0YW5kYWxvbmUga2VybmVsIGRlYnVnZ2VyLCBmb3IgR0RCLCB0aGUgR05VIERlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5ODksIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKworc3RhdGljIGNoYXIgKmFyZ3NbXSA9IHsia2RiIiwgImtkYi1zeW1ib2xzIiwgMH07CisKK3N0YXRpYyBjaGFyICplbnZpcm9ubWVudFtdID0gezB9OworCitjaGFyICoqZW52aXJvbjsKKworc3RhcnQgKCkKK3sKKyAgSU5JVF9TVEFDSyAoa2RiX3N0YWNrX2JlZywga2RiX3N0YWNrX2VuZCk7CisKKyAgZW52aXJvbiA9IGVudmlyb25tZW50OworCisgIG1haW4gKDIsIGFyZ3MsIGVudmlyb25tZW50KTsKK30KZGlmZiAtLWdpdCBhL2dkYi9sYW5ndWFnZS5jIGIvZ2RiL2xhbmd1YWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI1ZDQyMwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9sYW5ndWFnZS5jCkBAIC0wLDAgKzEsMTQ1MSBAQAorLyogTXVsdGlwbGUgc291cmNlIGxhbmd1YWdlIHN1cHBvcnQgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgdGhlIERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZSBhdCB0aGUgU3RhdGUgVW5pdmVyc2l0eQorICAgb2YgTmV3IFlvcmsgYXQgQnVmZmFsby4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIHRoaW5ncyB0aGF0IGFyZSBzcGVjaWZpYworICAgdG8gbGFuZ3VhZ2VzLiAgRWFjaCBmdW5jdGlvbiBzaG91bGQgZXhhbWluZSBjdXJyZW50X2xhbmd1YWdlIGlmIG5lY2Vzc2FyeSwKKyAgIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHJlc3VsdC4gKi8KKworLyogRklYTUU6ICBNb3N0IG9mIHRoZXNlIHdvdWxkIGJlIGJldHRlciBvcmdhbml6ZWQgYXMgbWFjcm9zIHdoaWNoCisgICByZXR1cm4gZGF0YSBvdXQgb2YgYSAibGFuZ3VhZ2Utc3BlY2lmaWMiIHN0cnVjdCBwb2ludGVyIHRoYXQgaXMgc2V0CisgICB3aGVuZXZlciB0aGUgd29ya2luZyBsYW5ndWFnZSBjaGFuZ2VzLiAgVGhhdCB3b3VsZCBiZSBhIGxvdCBmYXN0ZXIuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAicGFyc2VyLWRlZnMuaCIKKworc3RhdGljIHZvaWQKK3Nob3dfbGFuZ3VhZ2VfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZAorc2V0X2xhbmd1YWdlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK3Nob3dfdHlwZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitzZXRfdHlwZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitzaG93X3JhbmdlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK3NldF9yYW5nZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitzZXRfcmFuZ2Vfc3RyIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQKK3NldF90eXBlX3N0ciBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkCitzZXRfbGFuZ19zdHIgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZAordW5rX2xhbmdfZXJyb3IgUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyBpbnQKK3Vua19sYW5nX3BhcnNlciBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkCitzaG93X2NoZWNrIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitzZXRfY2hlY2sgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK3NldF90eXBlX3JhbmdlIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQKK3Vua19sYW5nX2VtaXRfY2hhciBQQVJBTVMgKChpbnQgYywgR0RCX0ZJTEUgKnN0cmVhbSwgaW50IHF1b3RlcikpOworCitzdGF0aWMgdm9pZAordW5rX2xhbmdfcHJpbnRjaGFyIFBBUkFNUyAoKGludCBjLCBHREJfRklMRSAqc3RyZWFtKSk7CisKK3N0YXRpYyB2b2lkCit1bmtfbGFuZ19wcmludHN0ciBQQVJBTVMgKChHREJfRklMRSAqc3RyZWFtLCBjaGFyICpzdHJpbmcsIHVuc2lnbmVkIGludCBsZW5ndGgsIGludCB3aWR0aCwgaW50IGZvcmNlX2VsbGlwc2VzKSk7CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCit1bmtfbGFuZ19jcmVhdGVfZnVuZGFtZW50YWxfdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK3Vua19sYW5nX3ByaW50X3R5cGUgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqLCBHREJfRklMRSAqLCBpbnQsIGludCkpOworCitzdGF0aWMgaW50Cit1bmtfbGFuZ192YWxfcHJpbnQgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqLCBpbnQsIENPUkVfQUREUiwgR0RCX0ZJTEUgKiwKKwkJCSAgICBpbnQsIGludCwgaW50LCBlbnVtIHZhbF9wcmV0dHlwcmludCkpOworCitzdGF0aWMgaW50Cit1bmtfbGFuZ192YWx1ZV9wcmludCBQQVJBTVMgKCh2YWx1ZV9wdHIsIEdEQl9GSUxFICosIGludCwgZW51bSB2YWxfcHJldHR5cHJpbnQpKTsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBsYW5ndWFnZV9kZWZuIHVua25vd25fbGFuZ3VhZ2VfZGVmbjsKK2V4dGVybiBjaGFyICp3YXJuaW5nX3ByZV9wcmludDsKKyAgCisvKiBUaGUgY3VycmVudCAoZGVmYXVsdCBhdCBzdGFydHVwKSBzdGF0ZSBvZiB0eXBlIGFuZCByYW5nZSBjaGVja2luZy4KKyAgICAoSWYgdGhlIG1vZGVzIGFyZSBzZXQgdG8gImF1dG8iLCB0aG91Z2gsIHRoZXNlIGFyZSBjaGFuZ2VkIGJhc2VkCisgICAgb24gdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgYXQgc3RhcnR1cCwgYW5kIHRoZW4gYWdhaW4gYmFzZWQgb24gdGhlCisgICAgbGFuZ3VhZ2Ugb2YgdGhlIGZpcnN0IHNvdXJjZSBmaWxlLiAgKi8KKworZW51bSByYW5nZV9tb2RlIHJhbmdlX21vZGUgPSByYW5nZV9tb2RlX2F1dG87CitlbnVtIHJhbmdlX2NoZWNrIHJhbmdlX2NoZWNrID0gcmFuZ2VfY2hlY2tfb2ZmOworZW51bSB0eXBlX21vZGUgdHlwZV9tb2RlID0gdHlwZV9tb2RlX2F1dG87CitlbnVtIHR5cGVfY2hlY2sgdHlwZV9jaGVjayA9IHR5cGVfY2hlY2tfb2ZmOworCisvKiBUaGUgY3VycmVudCBsYW5ndWFnZSBhbmQgbGFuZ3VhZ2VfbW9kZSAoc2VlIGxhbmd1YWdlLmgpICovCisKK2NvbnN0IHN0cnVjdCBsYW5ndWFnZV9kZWZuICpjdXJyZW50X2xhbmd1YWdlID0gJnVua25vd25fbGFuZ3VhZ2VfZGVmbjsKK2VudW0gbGFuZ3VhZ2VfbW9kZSBsYW5ndWFnZV9tb2RlID0gbGFuZ3VhZ2VfbW9kZV9hdXRvOworCisvKiBUaGUgbGFuZ3VhZ2UgdGhhdCB0aGUgdXNlciBleHBlY3RzIHRvIGJlIHR5cGluZyBpbiAodGhlIGxhbmd1YWdlCisgICBvZiBtYWluKCksIG9yIHRoZSBsYXN0IGxhbmd1YWdlIHdlIG5vdGlmaWVkIHRoZW0gYWJvdXQsIG9yIEMpLiAgKi8KKworY29uc3Qgc3RydWN0IGxhbmd1YWdlX2RlZm4gKmV4cGVjdGVkX2xhbmd1YWdlOworCisvKiBUaGUgbGlzdCBvZiBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLiAgVGhlIGxpc3QgaXRzZWxmIGlzIG1hbGxvYydkLiAgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBsYW5ndWFnZV9kZWZuICoqbGFuZ3VhZ2VzOworc3RhdGljIHVuc2lnbmVkIGxhbmd1YWdlc19zaXplOworc3RhdGljIHVuc2lnbmVkIGxhbmd1YWdlc19hbGxvY3NpemU7CisjZGVmaW5lCURFRkFVTFRfQUxMT0NTSVpFIDQKKworLyogVGhlICJzZXQgbGFuZ3VhZ2UvdHlwZS9yYW5nZSIgY29tbWFuZHMgYWxsIHB1dCBzdHVmZiBpbiB0aGVzZQorICAgYnVmZmVycy4gIFRoaXMgaXMgdG8gbWFrZSB0aGVtIHdvcmsgYXMgc2V0L3Nob3cgY29tbWFuZHMuICBUaGUKKyAgIHVzZXIncyBzdHJpbmcgaXMgY29waWVkIGhlcmUsIHRoZW4gdGhlIHNldF8qIGNvbW1hbmRzIGxvb2sgYXQKKyAgIHRoZW0gYW5kIHVwZGF0ZSB0aGVtIHRvIHNvbWV0aGluZyB0aGF0IGxvb2tzIG5pY2Ugd2hlbiBpdCBpcworICAgcHJpbnRlZCBvdXQuICovCisKK3N0YXRpYyBjaGFyICpsYW5ndWFnZTsKK3N0YXRpYyBjaGFyICp0eXBlOworc3RhdGljIGNoYXIgKnJhbmdlOworCisvKiBXYXJuaW5nIGlzc3VlZCB3aGVuIGN1cnJlbnRfbGFuZ3VhZ2UgYW5kIHRoZSBsYW5ndWFnZSBvZiB0aGUgY3VycmVudAorICAgZnJhbWUgZG8gbm90IG1hdGNoLiAqLworY2hhciBsYW5nX2ZyYW1lX21pc21hdGNoX3dhcm5bXSA9CisJIldhcm5pbmc6IHRoZSBjdXJyZW50IGxhbmd1YWdlIGRvZXMgbm90IG1hdGNoIHRoaXMgZnJhbWUuIjsKKworDAorLyogVGhpcyBwYWdlIGNvbnRhaW5zIHRoZSBmdW5jdGlvbnMgY29ycmVzcG9uZGluZyB0byBHREIgY29tbWFuZHMKKyAgIGFuZCB0aGVpciBoZWxwZXJzLiAqLworCisvKiBTaG93IGNvbW1hbmQuICBEaXNwbGF5IGEgd2FybmluZyBpZiB0aGUgbGFuZ3VhZ2Ugc2V0CisgICBkb2VzIG5vdCBtYXRjaCB0aGUgZnJhbWUuICovCitzdGF0aWMgdm9pZAorc2hvd19sYW5ndWFnZV9jb21tYW5kIChpZ25vcmUsIGZyb21fdHR5KQorICAgY2hhciAqaWdub3JlOworICAgaW50IGZyb21fdHR5OworeworICAgZW51bSBsYW5ndWFnZSBmbGFuZzsJCS8qIFRoZSBsYW5ndWFnZSBvZiB0aGUgY3VycmVudCBmcmFtZSAqLworCisgICBmbGFuZyA9IGdldF9mcmFtZV9sYW5ndWFnZSgpOworICAgaWYgKGZsYW5nICE9IGxhbmd1YWdlX3Vua25vd24gJiYKKyAgICAgICBsYW5ndWFnZV9tb2RlID09IGxhbmd1YWdlX21vZGVfbWFudWFsICYmCisgICAgICAgY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UgIT0gZmxhbmcpCisgICAgIHByaW50Zl9maWx0ZXJlZCgiJXNcbiIsbGFuZ19mcmFtZV9taXNtYXRjaF93YXJuKTsKK30KKworLyogU2V0IGNvbW1hbmQuICBDaGFuZ2UgdGhlIGN1cnJlbnQgd29ya2luZyBsYW5ndWFnZS4gKi8KK3N0YXRpYyB2b2lkCitzZXRfbGFuZ3VhZ2VfY29tbWFuZCAoaWdub3JlLCBmcm9tX3R0eSkKKyAgIGNoYXIgKmlnbm9yZTsKKyAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IGk7CisgIGVudW0gbGFuZ3VhZ2UgZmxhbmc7CisgIGNoYXIgKmVycl9sYW5nOworCisgIGlmICghbGFuZ3VhZ2UgfHwgIWxhbmd1YWdlWzBdKQorICAgIHsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkKCJUaGUgY3VycmVudGx5IHVuZGVyc3Rvb2Qgc2V0dGluZ3MgYXJlOlxuXG4iKTsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgibG9jYWwgb3IgYXV0byAgICBBdXRvbWF0aWMgc2V0dGluZyBiYXNlZCBvbiBzb3VyY2UgZmlsZVxuIik7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsYW5ndWFnZXNfc2l6ZTsgKytpKQorCXsKKwkgIC8qIEFscmVhZHkgZGVhbHQgd2l0aCB0aGVzZSBhYm92ZS4gICovCisJICBpZiAobGFuZ3VhZ2VzW2ldLT5sYV9sYW5ndWFnZSA9PSBsYW5ndWFnZV91bmtub3duCisJICAgICAgfHwgbGFuZ3VhZ2VzW2ldLT5sYV9sYW5ndWFnZSA9PSBsYW5ndWFnZV9hdXRvKQorCSAgICBjb250aW51ZTsKKworCSAgLyogRklYTUUgZm9yIG5vdyBhc3N1bWUgdGhhdCB0aGUgaHVtYW4tcmVhZGFibGUgbmFtZSBpcyBqdXN0CisJICAgICBhIGNhcGl0YWxpemF0aW9uIG9mIHRoZSBpbnRlcm5hbCBuYW1lLiAgKi8KKwkgIHByaW50Zl91bmZpbHRlcmVkICgiJS0xNnMgVXNlIHRoZSAlYyVzIGxhbmd1YWdlXG4iLAorCQkJICAgICBsYW5ndWFnZXNbaV0tPmxhX25hbWUsCisJCQkgICAgIC8qIENhcGl0YWxpemUgZmlyc3QgbGV0dGVyIG9mIGxhbmd1YWdlCisJCQkJbmFtZS4gICovCisJCQkgICAgIHRvdXBwZXIgKGxhbmd1YWdlc1tpXS0+bGFfbmFtZVswXSksCisJCQkgICAgIGxhbmd1YWdlc1tpXS0+bGFfbmFtZSArIDEpOworCX0KKyAgICAgIC8qIFJlc3RvcmUgdGhlIHNpbGx5IHN0cmluZy4gKi8KKyAgICAgIHNldF9sYW5ndWFnZShjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFNlYXJjaCB0aGUgbGlzdCBvZiBsYW5ndWFnZXMgZm9yIGEgbWF0Y2guICAqLworICBmb3IgKGkgPSAwOyBpIDwgbGFuZ3VhZ2VzX3NpemU7IGkrKykgeworICAgIGlmIChTVFJFUSAobGFuZ3VhZ2VzW2ldLT5sYV9uYW1lLCBsYW5ndWFnZSkpIHsKKyAgICAgIC8qIEZvdW5kIGl0ISAgR28gaW50byBtYW51YWwgbW9kZSwgYW5kIHVzZSB0aGlzIGxhbmd1YWdlLiAgKi8KKyAgICAgIGlmIChsYW5ndWFnZXNbaV0tPmxhX2xhbmd1YWdlID09IGxhbmd1YWdlX2F1dG8pIHsKKwkvKiBFbnRlciBhdXRvIG1vZGUuICBTZXQgdG8gdGhlIGN1cnJlbnQgZnJhbWUncyBsYW5ndWFnZSwgaWYga25vd24uICAqLworCWxhbmd1YWdlX21vZGUgPSBsYW5ndWFnZV9tb2RlX2F1dG87CisgIAlmbGFuZyA9IGdldF9mcmFtZV9sYW5ndWFnZSgpOworCWlmIChmbGFuZyE9bGFuZ3VhZ2VfdW5rbm93bikKKwkgIHNldF9sYW5ndWFnZShmbGFuZyk7CisJZXhwZWN0ZWRfbGFuZ3VhZ2UgPSBjdXJyZW50X2xhbmd1YWdlOworCXJldHVybjsKKyAgICAgIH0gZWxzZSB7CisJLyogRW50ZXIgbWFudWFsIG1vZGUuICBTZXQgdGhlIHNwZWNpZmllZCBsYW5ndWFnZS4gICovCisJbGFuZ3VhZ2VfbW9kZSA9IGxhbmd1YWdlX21vZGVfbWFudWFsOworCWN1cnJlbnRfbGFuZ3VhZ2UgPSBsYW5ndWFnZXNbaV07CisJc2V0X3R5cGVfcmFuZ2UgKCk7CisJc2V0X2xhbmdfc3RyKCk7CisJZXhwZWN0ZWRfbGFuZ3VhZ2UgPSBjdXJyZW50X2xhbmd1YWdlOworCXJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBSZXNldCB0aGUgbGFuZ3VhZ2UgKGVzcC4gdGhlIGdsb2JhbCBzdHJpbmcgImxhbmd1YWdlIikgdG8gdGhlIAorICAgICBjb3JyZWN0IHZhbHVlcy4gKi8KKyAgZXJyX2xhbmc9c2F2ZXN0cmluZyhsYW5ndWFnZSxzdHJsZW4obGFuZ3VhZ2UpKTsKKyAgbWFrZV9jbGVhbnVwIChmcmVlLCBlcnJfbGFuZyk7CS8qIEZyZWUgaXQgYWZ0ZXIgZXJyb3IgKi8KKyAgc2V0X2xhbmd1YWdlKGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2xhbmd1YWdlKTsKKyAgZXJyb3IgKCJVbmtub3duIGxhbmd1YWdlIGAlcycuIixlcnJfbGFuZyk7Cit9CisKKy8qIFNob3cgY29tbWFuZC4gIERpc3BsYXkgYSB3YXJuaW5nIGlmIHRoZSB0eXBlIHNldHRpbmcgZG9lcworICAgbm90IG1hdGNoIHRoZSBjdXJyZW50IGxhbmd1YWdlLiAqLworc3RhdGljIHZvaWQKK3Nob3dfdHlwZV9jb21tYW5kKGlnbm9yZSwgZnJvbV90dHkpCisgICBjaGFyICppZ25vcmU7CisgICBpbnQgZnJvbV90dHk7Cit7CisgICBpZiAodHlwZV9jaGVjayAhPSBjdXJyZW50X2xhbmd1YWdlLT5sYV90eXBlX2NoZWNrKQorICAgICAgcHJpbnRmX3VuZmlsdGVyZWQoCisiV2FybmluZzogdGhlIGN1cnJlbnQgdHlwZSBjaGVjayBzZXR0aW5nIGRvZXMgbm90IG1hdGNoIHRoZSBsYW5ndWFnZS5cbiIpOworfQorCisvKiBTZXQgY29tbWFuZC4gIENoYW5nZSB0aGUgc2V0dGluZyBmb3IgdHlwZSBjaGVja2luZy4gKi8KK3N0YXRpYyB2b2lkCitzZXRfdHlwZV9jb21tYW5kKGlnbm9yZSwgZnJvbV90dHkpCisgICBjaGFyICppZ25vcmU7CisgICBpbnQgZnJvbV90dHk7Cit7CisgICBpZiAoU1RSRVEodHlwZSwib24iKSkKKyAgIHsKKyAgICAgIHR5cGVfY2hlY2sgPSB0eXBlX2NoZWNrX29uOworICAgICAgdHlwZV9tb2RlID0gdHlwZV9tb2RlX21hbnVhbDsKKyAgIH0KKyAgIGVsc2UgaWYgKFNUUkVRKHR5cGUsIndhcm4iKSkKKyAgIHsKKyAgICAgIHR5cGVfY2hlY2sgPSB0eXBlX2NoZWNrX3dhcm47CisgICAgICB0eXBlX21vZGUgPSB0eXBlX21vZGVfbWFudWFsOworICAgfQorICAgZWxzZSBpZiAoU1RSRVEodHlwZSwib2ZmIikpCisgICB7CisgICAgICB0eXBlX2NoZWNrID0gdHlwZV9jaGVja19vZmY7CisgICAgICB0eXBlX21vZGUgPSB0eXBlX21vZGVfbWFudWFsOworICAgfQorICAgZWxzZSBpZiAoU1RSRVEodHlwZSwiYXV0byIpKQorICAgeworICAgICAgdHlwZV9tb2RlID0gdHlwZV9tb2RlX2F1dG87CisgICAgICBzZXRfdHlwZV9yYW5nZSgpOworICAgICAgLyogQXZvaWQgaGl0dGluZyB0aGUgc2V0X3R5cGVfc3RyIGNhbGwgYmVsb3cuICBXZQorICAgICAgICAgZGlkIGl0IGluIHNldF90eXBlX3JhbmdlLiAqLworICAgICAgcmV0dXJuOworICAgfQorICAgc2V0X3R5cGVfc3RyKCk7CisgICBzaG93X3R5cGVfY29tbWFuZCgoY2hhciAqKU5VTEwsIGZyb21fdHR5KTsKK30KKworLyogU2hvdyBjb21tYW5kLiAgRGlzcGxheSBhIHdhcm5pbmcgaWYgdGhlIHJhbmdlIHNldHRpbmcgZG9lcworICAgbm90IG1hdGNoIHRoZSBjdXJyZW50IGxhbmd1YWdlLiAqLworc3RhdGljIHZvaWQKK3Nob3dfcmFuZ2VfY29tbWFuZChpZ25vcmUsIGZyb21fdHR5KQorICAgY2hhciAqaWdub3JlOworICAgaW50IGZyb21fdHR5OworeworCisgICBpZiAocmFuZ2VfY2hlY2sgIT0gY3VycmVudF9sYW5ndWFnZS0+bGFfcmFuZ2VfY2hlY2spCisgICAgICBwcmludGZfdW5maWx0ZXJlZCgKKyJXYXJuaW5nOiB0aGUgY3VycmVudCByYW5nZSBjaGVjayBzZXR0aW5nIGRvZXMgbm90IG1hdGNoIHRoZSBsYW5ndWFnZS5cbiIpOworfQorCisvKiBTZXQgY29tbWFuZC4gIENoYW5nZSB0aGUgc2V0dGluZyBmb3IgcmFuZ2UgY2hlY2tpbmcuICovCitzdGF0aWMgdm9pZAorc2V0X3JhbmdlX2NvbW1hbmQoaWdub3JlLCBmcm9tX3R0eSkKKyAgIGNoYXIgKmlnbm9yZTsKKyAgIGludCBmcm9tX3R0eTsKK3sKKyAgIGlmIChTVFJFUShyYW5nZSwib24iKSkKKyAgIHsKKyAgICAgIHJhbmdlX2NoZWNrID0gcmFuZ2VfY2hlY2tfb247CisgICAgICByYW5nZV9tb2RlID0gcmFuZ2VfbW9kZV9tYW51YWw7CisgICB9CisgICBlbHNlIGlmIChTVFJFUShyYW5nZSwid2FybiIpKQorICAgeworICAgICAgcmFuZ2VfY2hlY2sgPSByYW5nZV9jaGVja193YXJuOworICAgICAgcmFuZ2VfbW9kZSA9IHJhbmdlX21vZGVfbWFudWFsOworICAgfQorICAgZWxzZSBpZiAoU1RSRVEocmFuZ2UsIm9mZiIpKQorICAgeworICAgICAgcmFuZ2VfY2hlY2sgPSByYW5nZV9jaGVja19vZmY7CisgICAgICByYW5nZV9tb2RlID0gcmFuZ2VfbW9kZV9tYW51YWw7CisgICB9CisgICBlbHNlIGlmIChTVFJFUShyYW5nZSwiYXV0byIpKQorICAgeworICAgICAgcmFuZ2VfbW9kZSA9IHJhbmdlX21vZGVfYXV0bzsKKyAgICAgIHNldF90eXBlX3JhbmdlKCk7CisgICAgICAvKiBBdm9pZCBoaXR0aW5nIHRoZSBzZXRfcmFuZ2Vfc3RyIGNhbGwgYmVsb3cuICBXZQorCSBkaWQgaXQgaW4gc2V0X3R5cGVfcmFuZ2UuICovCisgICAgICByZXR1cm47CisgICB9CisgICBzZXRfcmFuZ2Vfc3RyKCk7CisgICBzaG93X3JhbmdlX2NvbW1hbmQoKGNoYXIgKikwLCBmcm9tX3R0eSk7Cit9CisKKy8qIFNldCB0aGUgc3RhdHVzIG9mIHJhbmdlIGFuZCB0eXBlIGNoZWNraW5nIGJhc2VkIG9uCisgICB0aGUgY3VycmVudCBtb2RlcyBhbmQgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuCisgICBJZiBTSE9XIGlzIG5vbi16ZXJvLCB0aGVuIHByaW50IG91dCB0aGUgY3VycmVudCBsYW5ndWFnZSwKKyAgIHR5cGUgYW5kIHJhbmdlIGNoZWNraW5nIHN0YXR1cy4gKi8KK3N0YXRpYyB2b2lkCitzZXRfdHlwZV9yYW5nZSgpCit7CisKKyAgaWYgKHJhbmdlX21vZGUgPT0gcmFuZ2VfbW9kZV9hdXRvKQorICAgIHJhbmdlX2NoZWNrID0gY3VycmVudF9sYW5ndWFnZS0+bGFfcmFuZ2VfY2hlY2s7CisKKyAgaWYgKHR5cGVfbW9kZSA9PSB0eXBlX21vZGVfYXV0bykKKyAgICB0eXBlX2NoZWNrID0gY3VycmVudF9sYW5ndWFnZS0+bGFfdHlwZV9jaGVjazsKKworICBzZXRfdHlwZV9zdHIoKTsKKyAgc2V0X3JhbmdlX3N0cigpOworfQorCisvKiBTZXQgY3VycmVudCBsYW5ndWFnZSB0byAoZW51bSBsYW5ndWFnZSkgTEFORy4gIFJldHVybnMgcHJldmlvdXMgbGFuZ3VhZ2UuICovCisKK2VudW0gbGFuZ3VhZ2UKK3NldF9sYW5ndWFnZShsYW5nKQorICAgZW51bSBsYW5ndWFnZSBsYW5nOworeworICBpbnQgaTsKKyAgZW51bSBsYW5ndWFnZSBwcmV2X2xhbmd1YWdlOworCisgIHByZXZfbGFuZ3VhZ2UgPSBjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGFuZ3VhZ2VzX3NpemU7IGkrKykgeworICAgIGlmIChsYW5ndWFnZXNbaV0tPmxhX2xhbmd1YWdlID09IGxhbmcpIHsKKyAgICAgIGN1cnJlbnRfbGFuZ3VhZ2UgPSBsYW5ndWFnZXNbaV07CisgICAgICBzZXRfdHlwZV9yYW5nZSAoKTsKKyAgICAgIHNldF9sYW5nX3N0cigpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHByZXZfbGFuZ3VhZ2U7Cit9CisMCisvKiBUaGlzIHBhZ2UgY29udGFpbnMgZnVuY3Rpb25zIHRoYXQgdXBkYXRlIHRoZSBnbG9iYWwgdmFycworICAgbGFuZ3VhZ2UsIHR5cGUgYW5kIHJhbmdlLiAqLworc3RhdGljIHZvaWQKK3NldF9sYW5nX3N0cigpCit7CisgICBjaGFyICpwcmVmaXggPSAiIjsKKworICAgZnJlZSAobGFuZ3VhZ2UpOworICAgaWYgKGxhbmd1YWdlX21vZGUgPT0gbGFuZ3VhZ2VfbW9kZV9hdXRvKQorICAgICAgcHJlZml4ID0gImF1dG87IGN1cnJlbnRseSAiOworCisgICBsYW5ndWFnZSA9IGNvbmNhdChwcmVmaXgsIGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX25hbWUsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZAorc2V0X3R5cGVfc3RyKCkKK3sKKyAgIGNoYXIgKnRtcCwgKnByZWZpeCA9ICIiOworCisgICBmcmVlICh0eXBlKTsKKyAgIGlmICh0eXBlX21vZGU9PXR5cGVfbW9kZV9hdXRvKQorICAgICAgcHJlZml4ID0gImF1dG87IGN1cnJlbnRseSAiOworCisgICBzd2l0Y2godHlwZV9jaGVjaykKKyAgIHsKKyAgIGNhc2UgdHlwZV9jaGVja19vbjoKKyAgICAgIHRtcCA9ICJvbiI7CisgICAgICBicmVhazsKKyAgIGNhc2UgdHlwZV9jaGVja19vZmY6CisgICAgICB0bXAgPSAib2ZmIjsKKyAgICAgIGJyZWFrOworICAgY2FzZSB0eXBlX2NoZWNrX3dhcm46CisgICAgICB0bXAgPSAid2FybiI7CisgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciAoIlVucmVjb2duaXplZCB0eXBlIGNoZWNrIHNldHRpbmcuIik7CisgICB9CisKKyAgIHR5cGUgPSBjb25jYXQocHJlZml4LHRtcCxOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK3NldF9yYW5nZV9zdHIoKQoreworICAgY2hhciAqdG1wLCAqcHJlZiA9ICIiOworCisgICBmcmVlIChyYW5nZSk7CisgICBpZiAocmFuZ2VfbW9kZT09cmFuZ2VfbW9kZV9hdXRvKQorICAgICAgcHJlZiA9ICJhdXRvOyBjdXJyZW50bHkgIjsKKworICAgc3dpdGNoKHJhbmdlX2NoZWNrKQorICAgeworICAgY2FzZSByYW5nZV9jaGVja19vbjoKKyAgICAgIHRtcCA9ICJvbiI7CisgICAgICBicmVhazsKKyAgIGNhc2UgcmFuZ2VfY2hlY2tfb2ZmOgorICAgICAgdG1wID0gIm9mZiI7CisgICAgICBicmVhazsKKyAgIGNhc2UgcmFuZ2VfY2hlY2tfd2FybjoKKyAgICAgIHRtcCA9ICJ3YXJuIjsKKyAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yICgiVW5yZWNvZ25pemVkIHJhbmdlIGNoZWNrIHNldHRpbmcuIik7CisgICB9CisKKyAgIHJhbmdlID0gY29uY2F0KHByZWYsdG1wLE5VTEwpOworfQorCisKKy8qIFByaW50IG91dCB0aGUgY3VycmVudCBsYW5ndWFnZSBzZXR0aW5nczogbGFuZ3VhZ2UsIHJhbmdlIGFuZAorICAgdHlwZSBjaGVja2luZy4gIElmIFFVSUVUTFksIHByaW50IG9ubHkgd2hhdCBoYXMgY2hhbmdlZC4gICovCisKK3ZvaWQKK2xhbmd1YWdlX2luZm8gKHF1aWV0bHkpCisgICAgIGludCBxdWlldGx5OworeworICBpZiAocXVpZXRseSAmJiBleHBlY3RlZF9sYW5ndWFnZSA9PSBjdXJyZW50X2xhbmd1YWdlKQorICAgIHJldHVybjsKKworICBleHBlY3RlZF9sYW5ndWFnZSA9IGN1cnJlbnRfbGFuZ3VhZ2U7CisgIHByaW50Zl91bmZpbHRlcmVkKCJDdXJyZW50IGxhbmd1YWdlOiAgJXNcbiIsbGFuZ3VhZ2UpOworICBzaG93X2xhbmd1YWdlX2NvbW1hbmQoKGNoYXIgKikwLCAxKTsKKworICBpZiAoIXF1aWV0bHkpCisgICAgeworICAgICAgIHByaW50Zl91bmZpbHRlcmVkKCJUeXBlIGNoZWNraW5nOiAgICAgJXNcbiIsdHlwZSk7CisgICAgICAgc2hvd190eXBlX2NvbW1hbmQoKGNoYXIgKikwLCAxKTsKKyAgICAgICBwcmludGZfdW5maWx0ZXJlZCgiUmFuZ2UgY2hlY2tpbmc6ICAgICVzXG4iLHJhbmdlKTsKKyAgICAgICBzaG93X3JhbmdlX2NvbW1hbmQoKGNoYXIgKikwLCAxKTsKKyAgICB9Cit9CisMCisvKiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBhIGJpbmFyeSBvcGVyYXRpb24uICovCisKKyNpZiAwCS8qIEN1cnJlbnRseSB1bnVzZWQgKi8KKworc3RydWN0IHR5cGUgKgorYmlub3BfcmVzdWx0X3R5cGUgKHYxLCB2MikKKyAgIHZhbHVlX3B0ciB2MSwgdjI7Cit7CisgICBpbnQgc2l6ZSx1bnM7CisgICBzdHJ1Y3QgdHlwZSAqdDEgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFICh2MSkpOworICAgc3RydWN0IHR5cGUgKnQyID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAodjIpKTsKKworICAgaW50IGwxID0gVFlQRV9MRU5HVEggKHQxKTsKKyAgIGludCBsMiA9IFRZUEVfTEVOR1RIICh0Mik7CisKKyAgIHN3aXRjaChjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSkKKyAgIHsKKyAgIGNhc2UgbGFuZ3VhZ2VfYzoKKyAgIGNhc2UgbGFuZ3VhZ2VfY3BsdXM6CisgICAgICBpZiAoVFlQRV9DT0RFICh0MSk9PVRZUEVfQ09ERV9GTFQpCisJIHJldHVybiBUWVBFX0NPREUodDIpID09IFRZUEVfQ09ERV9GTFQgJiYgbDIgPiBsMSA/CisJICAgIFZBTFVFX1RZUEUodjIpIDogVkFMVUVfVFlQRSh2MSk7CisgICAgICBlbHNlIGlmIChUWVBFX0NPREUodDIpPT1UWVBFX0NPREVfRkxUKQorCSByZXR1cm4gVFlQRV9DT0RFKHQxKSkgPT0gVFlQRV9DT0RFX0ZMVCAmJiBsMSA+IGwyID8KKwkgICAgVkFMVUVfVFlQRSh2MSkgOiBWQUxVRV9UWVBFKHYyKTsKKyAgICAgIGVsc2UgaWYgKFRZUEVfVU5TSUdORUQodDEpICYmIGwxID4gbDIpCisJIHJldHVybiBWQUxVRV9UWVBFKHYxKTsKKyAgICAgIGVsc2UgaWYgKFRZUEVfVU5TSUdORUQodDIpICYmIGwyID4gbDEpCisJIHJldHVybiBWQUxVRV9UWVBFKHYyKTsKKyAgICAgIGVsc2UgIC8qIEJvdGggYXJlIHNpZ25lZC4gIFJlc3VsdCBpcyB0aGUgbG9uZ2VyIHR5cGUgKi8KKwkgcmV0dXJuIGwxID4gbDIgPyBWQUxVRV9UWVBFKHYxKSA6IFZBTFVFX1RZUEUodjIpOworICAgICAgYnJlYWs7CisgICBjYXNlIGxhbmd1YWdlX20yOgorICAgICAgLyogSWYgd2UgYXJlIGRvaW5nIHR5cGUtY2hlY2tpbmcsIGwxIHNob3VsZCBlcXVhbCBsMiwgc28gdGhpcyBpcworCSBub3QgbmVlZGVkLiAqLworICAgICAgcmV0dXJuIGwxID4gbDIgPyBWQUxVRV9UWVBFKHYxKSA6IFZBTFVFX1RZUEUodjIpOworICAgICAgYnJlYWs7CisgICBjYXNlIGxhbmd1YWdlX2NoaWxsOgorICAgICAgZXJyb3IgKCJNaXNzaW5nIENoaWxsIHN1cHBvcnQgaW4gZnVuY3Rpb24gYmlub3BfcmVzdWx0X2NoZWNrLiIpOy8qRklYTUUqLworICAgfQorICAgYWJvcnQoKTsKKyAgIHJldHVybiAoc3RydWN0IHR5cGUgKikwOwkvKiBGb3IgbGludCAqLworfQorCisjZW5kaWYJLyogMCAqLworCisMCisvKiBUaGlzIHBhZ2UgY29udGFpbnMgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGZvcm1hdCBzdHJpbmdzIGZvcgorICAgcHJpbnRmIGZvciBwcmludGluZyBvdXQgbnVtYmVycyBpbiBkaWZmZXJlbnQgZm9ybWF0cyAqLworCisvKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBwcmludGYgZm9ybWF0IGZvciBoZXhhZGVjaW1hbAorICAgbnVtYmVycy4gKi8KK2NoYXIgKgorbG9jYWxfaGV4X2Zvcm1hdF9jdXN0b20ocHJlKQorICAgY2hhciAqcHJlOworeworICAgc3RhdGljIGNoYXIgZm9ybVs1MF07CisKKyAgIHN0cmNweSAoZm9ybSwgbG9jYWxfaGV4X2Zvcm1hdF9wcmVmaXggKCkpOworICAgc3RyY2F0IChmb3JtLCAiJSIpOworICAgc3RyY2F0IChmb3JtLCBwcmUpOworICAgc3RyY2F0IChmb3JtLCBsb2NhbF9oZXhfZm9ybWF0X3NwZWNpZmllciAoKSk7CisgICBzdHJjYXQgKGZvcm0sIGxvY2FsX2hleF9mb3JtYXRfc3VmZml4ICgpKTsKKyAgIHJldHVybiBmb3JtOworfQorCisvKiBDb252ZXJ0cyBhIG51bWJlciB0byBoZXhhZGVjaW1hbCBhbmQgc3RvcmVzIGl0IGluIGEgc3RhdGljCisgICBzdHJpbmcuICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGlzIHN0cmluZy4gKi8KK2NoYXIgKgorbG9jYWxfaGV4X3N0cmluZyAobnVtKQorICAgdW5zaWduZWQgbG9uZyBudW07Cit7CisgICBzdGF0aWMgY2hhciByZXNbNTBdOworCisgICBzcHJpbnRmIChyZXMsIGxvY2FsX2hleF9mb3JtYXQoKSwgbnVtKTsKKyAgIHJldHVybiByZXM7Cit9CisKKy8qIENvbnZlcnRzIGEgbnVtYmVyIHRvIGN1c3RvbSBoZXhhZGVjaW1hbCBhbmQgc3RvcmVzIGl0IGluIGEgc3RhdGljCisgICBzdHJpbmcuICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGlzIHN0cmluZy4gKi8KK2NoYXIgKgorbG9jYWxfaGV4X3N0cmluZ19jdXN0b20obnVtLHByZSkKKyAgIHVuc2lnbmVkIGxvbmcgbnVtOworICAgY2hhciAqcHJlOworeworICAgc3RhdGljIGNoYXIgcmVzWzUwXTsKKworICAgc3ByaW50ZiAocmVzLCBsb2NhbF9oZXhfZm9ybWF0X2N1c3RvbShwcmUpLCBudW0pOworICAgcmV0dXJuIHJlczsKK30KKworLyogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgcHJpbnRmIGZvcm1hdCBmb3Igb2N0YWwKKyAgIG51bWJlcnMuICovCitjaGFyICoKK2xvY2FsX29jdGFsX2Zvcm1hdF9jdXN0b20ocHJlKQorICAgY2hhciAqcHJlOworeworICAgc3RhdGljIGNoYXIgZm9ybVs1MF07CisKKyAgIHN0cmNweSAoZm9ybSwgbG9jYWxfb2N0YWxfZm9ybWF0X3ByZWZpeCAoKSk7CisgICBzdHJjYXQgKGZvcm0sICIlIik7CisgICBzdHJjYXQgKGZvcm0sIHByZSk7CisgICBzdHJjYXQgKGZvcm0sIGxvY2FsX29jdGFsX2Zvcm1hdF9zcGVjaWZpZXIgKCkpOworICAgc3RyY2F0IChmb3JtLCBsb2NhbF9vY3RhbF9mb3JtYXRfc3VmZml4ICgpKTsKKyAgIHJldHVybiBmb3JtOworfQorCisvKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBwcmludGYgZm9ybWF0IGZvciBkZWNpbWFsIG51bWJlcnMuICovCitjaGFyICoKK2xvY2FsX2RlY2ltYWxfZm9ybWF0X2N1c3RvbShwcmUpCisgICBjaGFyICpwcmU7Cit7CisgICBzdGF0aWMgY2hhciBmb3JtWzUwXTsKKworICAgc3RyY3B5IChmb3JtLCBsb2NhbF9kZWNpbWFsX2Zvcm1hdF9wcmVmaXggKCkpOworICAgc3RyY2F0IChmb3JtLCAiJSIpOworICAgc3RyY2F0IChmb3JtLCBwcmUpOworICAgc3RyY2F0IChmb3JtLCBsb2NhbF9kZWNpbWFsX2Zvcm1hdF9zcGVjaWZpZXIgKCkpOworICAgc3RyY2F0IChmb3JtLCBsb2NhbF9kZWNpbWFsX2Zvcm1hdF9zdWZmaXggKCkpOworICAgcmV0dXJuIGZvcm07Cit9CisMCisjaWYgMAorLyogVGhpcyBwYWdlIGNvbnRhaW5zIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIGluIHR5cGUvcmFuZ2UgY2hlY2tpbmcuCisgICBUaGV5IGFsbCByZXR1cm4gemVybyBpZiB0aGUgdHlwZS9yYW5nZSBjaGVjayBmYWlscy4KKworICAgSXQgaXMgaG9wZWQgdGhhdCB0aGVzZSB3aWxsIG1ha2UgZXh0ZW5kaW5nIEdEQiB0byBwYXJzZSBkaWZmZXJlbnQKKyAgIGxhbmd1YWdlcyBhIGxpdHRsZSBlYXNpZXIuICBUaGVzZSBhcmUgcHJpbWFyaWx5IHVzZWQgaW4gZXZhbC5jIHdoZW4KKyAgIGV2YWx1YXRpbmcgZXhwcmVzc2lvbnMgYW5kIG1ha2luZyBzdXJlIHRoYXQgdGhlaXIgdHlwZXMgYXJlIGNvcnJlY3QuCisgICBJbnN0ZWFkIG9mIGhhdmluZyBhIG1lc3Mgb2YgY29uanVjdGVkL2Rpc2p1bmN0ZWQgZXhwcmVzc2lvbnMgaW4gYW4gImlmIiwKKyAgIHRoZSBpZGVhcyBvZiB0eXBlIGNhbiBiZSB3cmFwcGVkIHVwIGluIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zLgorCisgICBOb3RlIHRoYXQgc29tZSBvZiB0aGVtIGFyZSBub3QgY3VycmVudGx5IGRlcGVuZGVudCB1cG9uIHdoaWNoIGxhbmd1YWdlCisgICBpcyBjdXJyZW50bHkgYmVpbmcgcGFyc2VkLiAgRm9yIGV4YW1wbGUsIGZsb2F0cyBhcmUgdGhlIHNhbWUgaW4KKyAgIEMgYW5kIE1vZHVsYS0yIChpZS4gdGhlIG9ubHkgZmxvYXRpbmcgcG9pbnQgdHlwZSBoYXMgVFlQRV9DT0RFIG9mCisgICBUWVBFX0NPREVfRkxUKSwgd2hpbGUgYm9vbGVhbnMgYXJlIGRpZmZlcmVudC4gKi8KKworLyogUmV0dXJucyBub24temVybyBpZiBpdHMgYXJndW1lbnQgaXMgYSBzaW1wbGUgdHlwZS4gIFRoaXMgaXMgdGhlIHNhbWUgZm9yCisgICBib3RoIE1vZHVsYS0yIGFuZCBmb3IgQy4gIEluIHRoZSBDIGNhc2UsIFRZUEVfQ09ERV9DSEFSIHdpbGwgbmV2ZXIgb2NjdXIsCisgICBhbmQgdGh1cyB3aWxsIG5ldmVyIGNhdXNlIHRoZSBmYWlsdXJlIG9mIHRoZSB0ZXN0LiAqLworaW50CitzaW1wbGVfdHlwZSh0eXBlKQorICAgIHN0cnVjdCB0eXBlICp0eXBlOworeworICBDSEVDS19UWVBFREVGICh0eXBlKTsKKyAgc3dpdGNoIChUWVBFX0NPREUgKHR5cGUpKSB7CisgIGNhc2UgVFlQRV9DT0RFX0lOVDoKKyAgY2FzZSBUWVBFX0NPREVfQ0hBUjoKKyAgY2FzZSBUWVBFX0NPREVfRU5VTToKKyAgY2FzZSBUWVBFX0NPREVfRkxUOgorICBjYXNlIFRZUEVfQ09ERV9SQU5HRToKKyAgY2FzZSBUWVBFX0NPREVfQk9PTDoKKyAgICByZXR1cm4gMTsKKworICBkZWZhdWx0OgorICAgIHJldHVybiAwOworICB9Cit9CisKKy8qIFJldHVybnMgbm9uLXplcm8gaWYgaXRzIGFyZ3VtZW50IGlzIG9mIGFuIG9yZGVyZWQgdHlwZS4KKyAgIEFuIG9yZGVyZWQgdHlwZSBpcyBvbmUgaW4gd2hpY2ggdGhlIGVsZW1lbnRzIGNhbiBiZSB0ZXN0ZWQgZm9yIHRoZQorICAgcHJvcGVydGllcyBvZiAiZ3JlYXRlciB0aGFuIiwgImxlc3MgdGhhbiIsIGV0Yywgb3IgZm9yIHdoaWNoIHRoZQorICAgb3BlcmF0aW9ucyAiaW5jcmVtZW50IiBvciAiZGVjcmVtZW50IiBtYWtlIHNlbnNlLiAqLworaW50CitvcmRlcmVkX3R5cGUgKHR5cGUpCisgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgQ0hFQ0tfVFlQRURFRiAodHlwZSk7CisgIHN3aXRjaCAoVFlQRV9DT0RFICh0eXBlKSkgeworICBjYXNlIFRZUEVfQ09ERV9JTlQ6CisgIGNhc2UgVFlQRV9DT0RFX0NIQVI6CisgIGNhc2UgVFlQRV9DT0RFX0VOVU06CisgIGNhc2UgVFlQRV9DT0RFX0ZMVDoKKyAgY2FzZSBUWVBFX0NPREVfUkFOR0U6CisgICAgcmV0dXJuIDE7CisKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisvKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSB0d28gdHlwZXMgYXJlIHRoZSBzYW1lICovCitpbnQKK3NhbWVfdHlwZSAoYXJnMSwgYXJnMikKKyAgIHN0cnVjdCB0eXBlICphcmcxLCAqYXJnMjsKK3sKKyAgQ0hFQ0tfVFlQRURFRiAodHlwZSk7CisgICBpZiAoc3RydWN0dXJlZF90eXBlKGFyZzEpID8gIXN0cnVjdHVyZWRfdHlwZShhcmcyKSA6IHN0cnVjdHVyZWRfdHlwZShhcmcyKSkKKyAgICAgIC8qIE9uZSBpcyBzdHJ1Y3R1cmVkIGFuZCBvbmUgaXNuJ3QgKi8KKyAgICAgIHJldHVybiAwOworICAgZWxzZSBpZiAoc3RydWN0dXJlZF90eXBlKGFyZzEpICYmIHN0cnVjdHVyZWRfdHlwZShhcmcyKSkKKyAgICAgIHJldHVybiBhcmcxID09IGFyZzI7CisgICBlbHNlIGlmIChudW1lcmljX3R5cGUoYXJnMSkgJiYgbnVtZXJpY190eXBlKGFyZzIpKQorICAgICAgcmV0dXJuIChUWVBFX0NPREUoYXJnMikgPT0gVFlQRV9DT0RFKGFyZzEpKSAmJgorCSAoVFlQRV9VTlNJR05FRChhcmcxKSA9PSBUWVBFX1VOU0lHTkVEKGFyZzIpKQorCSAgICA/IDEgOiAwOworICAgZWxzZQorICAgICAgcmV0dXJuIGFyZzE9PWFyZzI7Cit9CisKKy8qIFJldHVybnMgbm9uLXplcm8gaWYgdGhlIHR5cGUgaXMgaW50ZWdyYWwgKi8KK2ludAoraW50ZWdyYWxfdHlwZSAodHlwZSkKKyAgIHN0cnVjdCB0eXBlICp0eXBlOworeworICBDSEVDS19UWVBFREVGICh0eXBlKTsKKyAgIHN3aXRjaChjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSkKKyAgIHsKKyAgIGNhc2UgbGFuZ3VhZ2VfYzoKKyAgIGNhc2UgbGFuZ3VhZ2VfY3BsdXM6CisgICAgICByZXR1cm4gKFRZUEVfQ09ERSh0eXBlKSAhPSBUWVBFX0NPREVfSU5UKSAmJgorCSAoVFlQRV9DT0RFKHR5cGUpICE9IFRZUEVfQ09ERV9FTlVNKSA/IDAgOiAxOworICAgY2FzZSBsYW5ndWFnZV9tMjoKKyAgICAgIHJldHVybiBUWVBFX0NPREUodHlwZSkgIT0gVFlQRV9DT0RFX0lOVCA/IDAgOiAxOworICAgY2FzZSBsYW5ndWFnZV9jaGlsbDoKKyAgICAgIGVycm9yICgiTWlzc2luZyBDaGlsbCBzdXBwb3J0IGluIGZ1bmN0aW9uIGludGVncmFsX3R5cGUuIik7ICAvKkZJWE1FKi8KKyAgIGRlZmF1bHQ6CisgICAgICBlcnJvciAoIkxhbmd1YWdlIG5vdCBzdXBwb3J0ZWQuIik7CisgICB9Cit9CisKKy8qIFJldHVybnMgbm9uLXplcm8gaWYgdGhlIHZhbHVlIGlzIG51bWVyaWMgKi8KK2ludAorbnVtZXJpY190eXBlICh0eXBlKQorICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIENIRUNLX1RZUEVERUYgKHR5cGUpOworICBzd2l0Y2ggKFRZUEVfQ09ERSAodHlwZSkpIHsKKyAgY2FzZSBUWVBFX0NPREVfSU5UOgorICBjYXNlIFRZUEVfQ09ERV9GTFQ6CisgICAgcmV0dXJuIDE7CisKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisvKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSB2YWx1ZSBpcyBhIGNoYXJhY3RlciB0eXBlICovCitpbnQKK2NoYXJhY3Rlcl90eXBlICh0eXBlKQorICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIENIRUNLX1RZUEVERUYgKHR5cGUpOworICBzd2l0Y2goY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UpCisgICB7CisgICBjYXNlIGxhbmd1YWdlX2NoaWxsOgorICAgY2FzZSBsYW5ndWFnZV9tMjoKKyAgICAgIHJldHVybiBUWVBFX0NPREUodHlwZSkgIT0gVFlQRV9DT0RFX0NIQVIgPyAwIDogMTsKKworICAgY2FzZSBsYW5ndWFnZV9jOgorICAgY2FzZSBsYW5ndWFnZV9jcGx1czoKKyAgICAgIHJldHVybiAoVFlQRV9DT0RFKHR5cGUpID09IFRZUEVfQ09ERV9JTlQpICYmCisJIFRZUEVfTEVOR1RIKHR5cGUpID09IHNpemVvZihjaGFyKQorCSA/IDEgOiAwOworICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAoMCk7CisgICB9Cit9CisKKy8qIFJldHVybnMgbm9uLXplcm8gaWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nIHR5cGUgKi8KK2ludAorc3RyaW5nX3R5cGUgKHR5cGUpCisgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgQ0hFQ0tfVFlQRURFRiAodHlwZSk7CisgIHN3aXRjaChjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSkKKyAgIHsKKyAgIGNhc2UgbGFuZ3VhZ2VfY2hpbGw6CisgICBjYXNlIGxhbmd1YWdlX20yOgorICAgICAgcmV0dXJuIFRZUEVfQ09ERSh0eXBlKSAhPSBUWVBFX0NPREVfU1RSSU5HID8gMCA6IDE7CisKKyAgIGNhc2UgbGFuZ3VhZ2VfYzoKKyAgIGNhc2UgbGFuZ3VhZ2VfY3BsdXM6CisgICAgICAvKiBDIGRvZXMgbm90IGhhdmUgZGlzdGluY3Qgc3RyaW5nIHR5cGUuICovCisgICAgICByZXR1cm4gKDApOworICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAoMCk7CisgICB9Cit9CisKKy8qIFJldHVybnMgbm9uLXplcm8gaWYgdGhlIHZhbHVlIGlzIGEgYm9vbGVhbiB0eXBlICovCitpbnQKK2Jvb2xlYW5fdHlwZSAodHlwZSkKKyAgIHN0cnVjdCB0eXBlICp0eXBlOworeworICBDSEVDS19UWVBFREVGICh0eXBlKTsKKyAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX0JPT0wpCisgICAgcmV0dXJuIDE7CisgIHN3aXRjaChjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSkKKyAgICB7CisgICAgY2FzZSBsYW5ndWFnZV9jOgorICAgIGNhc2UgbGFuZ3VhZ2VfY3BsdXM6CisgICAgICAvKiBNaWdodCBiZSBtb3JlIGNsZWFubHkgaGFuZGxlZCBieSBoYXZpbmcgYSBUWVBFX0NPREVfSU5UX05PVF9CT09MCisJIGZvciBDSElMTCBhbmQgc3VjaCBsYW5ndWFnZXMsIG9yIGEgVFlQRV9DT0RFX0lOVF9PUl9CT09MIGZvciBDLiAgKi8KKyAgICAgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9JTlQpCisJcmV0dXJuIDE7CisgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICB9CisgIHJldHVybiAwOworfQorCisvKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSB2YWx1ZSBpcyBhIGZsb2F0aW5nLXBvaW50IHR5cGUgKi8KK2ludAorZmxvYXRfdHlwZSAodHlwZSkKKyAgIHN0cnVjdCB0eXBlICp0eXBlOworeworICBDSEVDS19UWVBFREVGICh0eXBlKTsKKyAgcmV0dXJuIFRZUEVfQ09ERSh0eXBlKSA9PSBUWVBFX0NPREVfRkxUOworfQorCisvKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSB2YWx1ZSBpcyBhIHBvaW50ZXIgdHlwZSAqLworaW50Citwb2ludGVyX3R5cGUodHlwZSkKKyAgIHN0cnVjdCB0eXBlICp0eXBlOworeworICAgcmV0dXJuIFRZUEVfQ09ERSh0eXBlKSA9PSBUWVBFX0NPREVfUFRSIHx8CisgICAgICBUWVBFX0NPREUodHlwZSkgPT0gVFlQRV9DT0RFX1JFRjsKK30KKworLyogUmV0dXJucyBub24temVybyBpZiB0aGUgdmFsdWUgaXMgYSBzdHJ1Y3R1cmVkIHR5cGUgKi8KK2ludAorc3RydWN0dXJlZF90eXBlKHR5cGUpCisgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgQ0hFQ0tfVFlQRURFRiAodHlwZSk7CisgICBzd2l0Y2goY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UpCisgICB7CisgICBjYXNlIGxhbmd1YWdlX2M6CisgICBjYXNlIGxhbmd1YWdlX2NwbHVzOgorICAgICAgcmV0dXJuIChUWVBFX0NPREUodHlwZSkgPT0gVFlQRV9DT0RFX1NUUlVDVCkgfHwKKwkgKFRZUEVfQ09ERSh0eXBlKSA9PSBUWVBFX0NPREVfVU5JT04pIHx8CisJICAgIChUWVBFX0NPREUodHlwZSkgPT0gVFlQRV9DT0RFX0FSUkFZKTsKKyAgIGNhc2UgbGFuZ3VhZ2VfbTI6CisgICAgICByZXR1cm4gKFRZUEVfQ09ERSh0eXBlKSA9PSBUWVBFX0NPREVfU1RSVUNUKSB8fAorCSAoVFlQRV9DT0RFKHR5cGUpID09IFRZUEVfQ09ERV9TRVQpIHx8CisJICAgIChUWVBFX0NPREUodHlwZSkgPT0gVFlQRV9DT0RFX0FSUkFZKTsKKyAgIGNhc2UgbGFuZ3VhZ2VfY2hpbGw6CisgICAgICBlcnJvciAoIk1pc3NpbmcgQ2hpbGwgc3VwcG9ydCBpbiBmdW5jdGlvbiBzdHJ1Y3R1cmVkX3R5cGUuIik7ICAvKkZJWE1FKi8KKyAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gKDApOworICAgfQorfQorI2VuZGlmCisMCitzdHJ1Y3QgdHlwZSAqCitsYW5nX2Jvb2xfdHlwZSAoKQoreworICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIHN0cnVjdCB0eXBlICp0eXBlOworICBzd2l0Y2goY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UpCisgICAgeworICAgIGNhc2UgbGFuZ3VhZ2VfY2hpbGw6CisgICAgICByZXR1cm4gYnVpbHRpbl90eXBlX2NoaWxsX2Jvb2w7CisgICAgY2FzZSBsYW5ndWFnZV9mb3J0cmFuOgorICAgICAgc3ltID0gbG9va3VwX3N5bWJvbCAoImxvZ2ljYWwiLCBOVUxMLCBWQVJfTkFNRVNQQUNFLCBOVUxMLCBOVUxMKTsKKyAgICAgIGlmIChzeW0pCisJeworCSAgdHlwZSA9IFNZTUJPTF9UWVBFIChzeW0pOworCSAgaWYgKHR5cGUgJiYgVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfQk9PTCkKKwkgICAgcmV0dXJuIHR5cGU7CisJfQorICAgICAgcmV0dXJuIGJ1aWx0aW5fdHlwZV9mX2xvZ2ljYWxfczI7CisgICAgY2FzZSBsYW5ndWFnZV9jcGx1czoKKyAgICAgIHN5bSA9IGxvb2t1cF9zeW1ib2wgKCJib29sIiwgTlVMTCwgVkFSX05BTUVTUEFDRSwgTlVMTCwgTlVMTCk7CisgICAgICBpZiAoc3ltKQorCXsKKwkgIHR5cGUgPSBTWU1CT0xfVFlQRSAoc3ltKTsKKwkgIGlmICh0eXBlICYmIFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX0JPT0wpCisJICAgIHJldHVybiB0eXBlOworCX0KKyAgICAgIHJldHVybiBidWlsdGluX3R5cGVfYm9vbDsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGJ1aWx0aW5fdHlwZV9pbnQ7CisgICAgfQorfQorDAorLyogVGhpcyBwYWdlIGNvbnRhaW5zIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBpbmZvIGFib3V0CisgICAoc3RydWN0IHZhbHVlKSB2YWx1ZXMgdXNlZCBpbiBHREIuICovCisKKy8qIFJldHVybnMgbm9uLXplcm8gaWYgdGhlIHZhbHVlIFZBTCByZXByZXNlbnRzIGEgdHJ1ZSB2YWx1ZS4gKi8KK2ludAordmFsdWVfdHJ1ZSAodmFsKQorICAgICB2YWx1ZV9wdHIgdmFsOworeworICAvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHdlIHNob3VsZCBoYXZlIHNvbWUgc29ydCBvZiBlcnJvciBpZiBhIG5vbi1ib29sZWFuCisgICAgIHZhbHVlIGlzIHVzZWQgaW4gdGhpcyBjb250ZXh0LiAgUG9zc2libHkgZGVwZW5kZW50IG9uIHNvbWUga2luZCBvZgorICAgICAiYm9vbGVhbi1jaGVja2luZyIgb3B0aW9uIGxpa2UgcmFuZ2UgY2hlY2tpbmcuICBCdXQgaXQgc2hvdWxkIHByb2JhYmx5CisgICAgIG5vdCBkZXBlbmQgb24gdGhlIGxhbmd1YWdlIGV4Y2VwdCBpbnNvZmFyIGFzIGlzIG5lY2Vzc2FyeSB0byBpZGVudGlmeQorICAgICBhICJib29sZWFuIiB2YWx1ZSAoaS5lLiBpbiBDIHVzaW5nIGEgZmxvYXQsIHBvaW50ZXIsIGV0Yy4sIGFzIGEgYm9vbGVhbgorICAgICBzaG91bGQgYmUgYW4gZXJyb3IsIHByb2JhYmx5KS4gICovCisgIHJldHVybiAhdmFsdWVfbG9naWNhbF9ub3QgKHZhbCk7Cit9CisMCisvKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBvcGVyYXRvciBPUCBpcyBkZWZpbmVkIG9uCisgICB0aGUgdmFsdWVzIEFSRzEgYW5kIEFSRzIuICovCisKKyNpZiAwCS8qIEN1cnJlbnRseSB1bnVzZWQgKi8KKwordm9pZAorYmlub3BfdHlwZV9jaGVjayhhcmcxLGFyZzIsb3ApCisgICB2YWx1ZV9wdHIgYXJnMSxhcmcyOworICAgaW50IG9wOworeworICAgc3RydWN0IHR5cGUgKnQxLCAqdDI7CisKKyAgIC8qIElmIHdlJ3JlIG5vdCBjaGVja2luZyB0eXBlcywgYWx3YXlzIHJldHVybiBzdWNjZXNzLiAqLworICAgaWYgKCFTVFJJQ1RfVFlQRSkKKyAgICAgIHJldHVybjsKKworICAgdDE9VkFMVUVfVFlQRShhcmcxKTsKKyAgIGlmIChhcmcyICE9IE5VTEwpCisgICAgICB0Mj1WQUxVRV9UWVBFKGFyZzIpOworICAgZWxzZQorICAgICAgdDI9TlVMTDsKKworICAgc3dpdGNoKG9wKQorICAgeworICAgY2FzZSBCSU5PUF9BREQ6CisgICBjYXNlIEJJTk9QX1NVQjoKKyAgICAgIGlmICgobnVtZXJpY190eXBlKHQxKSAmJiBwb2ludGVyX3R5cGUodDIpKSB8fAorCSAocG9pbnRlcl90eXBlKHQxKSAmJiBudW1lcmljX3R5cGUodDIpKSkKKyAgICAgIHsKKwkgd2FybmluZyAoImNvbWJpbmluZyBwb2ludGVyIGFuZCBpbnRlZ2VyLlxuIik7CisJIGJyZWFrOworICAgICAgfQorICAgY2FzZSBCSU5PUF9NVUw6CisgICBjYXNlIEJJTk9QX0xTSDoKKyAgIGNhc2UgQklOT1BfUlNIOgorICAgICAgaWYgKCFudW1lcmljX3R5cGUodDEpIHx8ICFudW1lcmljX3R5cGUodDIpKQorCSB0eXBlX29wX2Vycm9yICgiQXJndW1lbnRzIHRvICVzIG11c3QgYmUgbnVtYmVycy4iLG9wKTsKKyAgICAgIGVsc2UgaWYgKCFzYW1lX3R5cGUodDEsdDIpKQorCSB0eXBlX29wX2Vycm9yICgiQXJndW1lbnRzIHRvICVzIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZS4iLG9wKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJJTk9QX0xPR0lDQUxfQU5EOgorICAgY2FzZSBCSU5PUF9MT0dJQ0FMX09SOgorICAgICAgaWYgKCFib29sZWFuX3R5cGUodDEpIHx8ICFib29sZWFuX3R5cGUodDIpKQorCSB0eXBlX29wX2Vycm9yICgiQXJndW1lbnRzIHRvICVzIG11c3QgYmUgb2YgYm9vbGVhbiB0eXBlLiIsb3ApOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgQklOT1BfRVFVQUw6CisgICAgICBpZiAoKHBvaW50ZXJfdHlwZSh0MSkgJiYgIShwb2ludGVyX3R5cGUodDIpIHx8IGludGVncmFsX3R5cGUodDIpKSkgfHwKKwkgKHBvaW50ZXJfdHlwZSh0MikgJiYgIShwb2ludGVyX3R5cGUodDEpIHx8IGludGVncmFsX3R5cGUodDEpKSkpCisJIHR5cGVfb3BfZXJyb3IgKCJBIHBvaW50ZXIgY2FuIG9ubHkgYmUgY29tcGFyZWQgdG8gYW4gaW50ZWdlciBvciBwb2ludGVyLiIsb3ApOworICAgICAgZWxzZSBpZiAoKHBvaW50ZXJfdHlwZSh0MSkgJiYgaW50ZWdyYWxfdHlwZSh0MikpIHx8CisJIChpbnRlZ3JhbF90eXBlKHQxKSAmJiBwb2ludGVyX3R5cGUodDIpKSkKKyAgICAgIHsKKwkgd2FybmluZyAoImNvbWJpbmluZyBpbnRlZ2VyIGFuZCBwb2ludGVyLlxuIik7CisJIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXNpbXBsZV90eXBlKHQxKSB8fCAhc2ltcGxlX3R5cGUodDIpKQorCSB0eXBlX29wX2Vycm9yICgiQXJndW1lbnRzIHRvICVzIG11c3QgYmUgb2Ygc2ltcGxlIHR5cGUuIixvcCk7CisgICAgICBlbHNlIGlmICghc2FtZV90eXBlKHQxLHQyKSkKKwkgdHlwZV9vcF9lcnJvciAoIkFyZ3VtZW50cyB0byAlcyBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUuIixvcCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCSU5PUF9SRU06CisgICBjYXNlIEJJTk9QX01PRDoKKyAgICAgIGlmICghaW50ZWdyYWxfdHlwZSh0MSkgfHwgIWludGVncmFsX3R5cGUodDIpKQorCSB0eXBlX29wX2Vycm9yICgiQXJndW1lbnRzIHRvICVzIG11c3QgYmUgb2YgaW50ZWdyYWwgdHlwZS4iLG9wKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIEJJTk9QX0xFU1M6CisgICBjYXNlIEJJTk9QX0dUUjoKKyAgIGNhc2UgQklOT1BfTEVROgorICAgY2FzZSBCSU5PUF9HRVE6CisgICAgICBpZiAoIW9yZGVyZWRfdHlwZSh0MSkgfHwgIW9yZGVyZWRfdHlwZSh0MikpCisJIHR5cGVfb3BfZXJyb3IgKCJBcmd1bWVudHMgdG8gJXMgbXVzdCBiZSBvZiBvcmRlcmVkIHR5cGUuIixvcCk7CisgICAgICBlbHNlIGlmICghc2FtZV90eXBlKHQxLHQyKSkKKwkgdHlwZV9vcF9lcnJvciAoIkFyZ3VtZW50cyB0byAlcyBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUuIixvcCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBCSU5PUF9BU1NJR046CisgICAgICBpZiAocG9pbnRlcl90eXBlKHQxKSAmJiAhaW50ZWdyYWxfdHlwZSh0MikpCisJIHR5cGVfb3BfZXJyb3IgKCJBIHBvaW50ZXIgY2FuIG9ubHkgYmUgYXNzaWduZWQgYW4gaW50ZWdlci4iLG9wKTsKKyAgICAgIGVsc2UgaWYgKHBvaW50ZXJfdHlwZSh0MSkgJiYgaW50ZWdyYWxfdHlwZSh0MikpCisgICAgICB7CisJIHdhcm5pbmcgKCJjb21iaW5pbmcgaW50ZWdlciBhbmQgcG9pbnRlci4iKTsKKwkgYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlIGlmICghc2ltcGxlX3R5cGUodDEpIHx8ICFzaW1wbGVfdHlwZSh0MikpCisJIHR5cGVfb3BfZXJyb3IgKCJBcmd1bWVudHMgdG8gJXMgbXVzdCBiZSBvZiBzaW1wbGUgdHlwZS4iLG9wKTsKKyAgICAgIGVsc2UgaWYgKCFzYW1lX3R5cGUodDEsdDIpKQorCSB0eXBlX29wX2Vycm9yICgiQXJndW1lbnRzIHRvICVzIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZS4iLG9wKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBCSU5PUF9DT05DQVQ6CisgICAgICAvKiBGSVhNRTogIE5lZWRzIHRvIGhhbmRsZSBiaXRzdHJpbmdzIGFzIHdlbGwuICovCisgICAgICBpZiAoIShzdHJpbmdfdHlwZSh0MSkgfHwgY2hhcmFjdGVyX3R5cGUodDEpIHx8IGludGVncmFsX3R5cGUodDEpKQorCSAgfHwgIShzdHJpbmdfdHlwZSh0MikgfHwgY2hhcmFjdGVyX3R5cGUodDIpIHx8IGludGVncmFsX3R5cGUodDIpKSkKKwkgIHR5cGVfb3BfZXJyb3IgKCJBcmd1bWVudHMgdG8gJXMgbXVzdCBiZSBzdHJpbmdzIG9yIGNoYXJhY3RlcnMuIiwgb3ApOworICAgICAgYnJlYWs7CisKKyAgIC8qIFVuYXJ5IGNoZWNrcyAtLSBhcmcyIGlzIG51bGwgKi8KKworICAgY2FzZSBVTk9QX0xPR0lDQUxfTk9UOgorICAgICAgaWYgKCFib29sZWFuX3R5cGUodDEpKQorCSB0eXBlX29wX2Vycm9yICgiQXJndW1lbnQgdG8gJXMgbXVzdCBiZSBvZiBib29sZWFuIHR5cGUuIixvcCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBVTk9QX1BMVVM6CisgICBjYXNlIFVOT1BfTkVHOgorICAgICAgaWYgKCFudW1lcmljX3R5cGUodDEpKQorCSB0eXBlX29wX2Vycm9yICgiQXJndW1lbnQgdG8gJXMgbXVzdCBiZSBvZiBudW1lcmljIHR5cGUuIixvcCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBVTk9QX0lORDoKKyAgICAgIGlmIChpbnRlZ3JhbF90eXBlKHQxKSkKKyAgICAgIHsKKwkgd2FybmluZyAoImNvbWJpbmluZyBwb2ludGVyIGFuZCBpbnRlZ2VyLlxuIik7CisJIGJyZWFrOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIXBvaW50ZXJfdHlwZSh0MSkpCisJIHR5cGVfb3BfZXJyb3IgKCJBcmd1bWVudCB0byAlcyBtdXN0IGJlIGEgcG9pbnRlci4iLG9wKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFVOT1BfUFJFSU5DUkVNRU5UOgorICAgY2FzZSBVTk9QX1BPU1RJTkNSRU1FTlQ6CisgICBjYXNlIFVOT1BfUFJFREVDUkVNRU5UOgorICAgY2FzZSBVTk9QX1BPU1RERUNSRU1FTlQ6CisgICAgICBpZiAoIW9yZGVyZWRfdHlwZSh0MSkpCisJIHR5cGVfb3BfZXJyb3IgKCJBcmd1bWVudCB0byAlcyBtdXN0IGJlIG9mIGFuIG9yZGVyZWQgdHlwZS4iLG9wKTsKKyAgICAgIGJyZWFrOworCisgICBkZWZhdWx0OgorICAgICAgLyogT2suICBUaGUgZm9sbG93aW5nIG9wZXJhdG9ycyBoYXZlIGRpZmZlcmVudCBtZWFuaW5ncyBpbgorCSBkaWZmZXJlbnQgbGFuZ3VhZ2VzLiAqLworICAgICAgc3dpdGNoKGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2xhbmd1YWdlKQorICAgICAgeworI2lmZGVmIF9MQU5HX2MKKyAgICAgIGNhc2UgbGFuZ3VhZ2VfYzoKKyAgICAgIGNhc2UgbGFuZ3VhZ2VfY3BsdXM6CisJIHN3aXRjaChvcCkKKwkgeworCSBjYXNlIEJJTk9QX0RJVjoKKwkgICAgaWYgKCFudW1lcmljX3R5cGUodDEpIHx8ICFudW1lcmljX3R5cGUodDIpKQorCSAgICAgICB0eXBlX29wX2Vycm9yICgiQXJndW1lbnRzIHRvICVzIG11c3QgYmUgbnVtYmVycy4iLG9wKTsKKwkgICAgYnJlYWs7CisJIH0KKwkgYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIF9MQU5HX20yCisgICAgICBjYXNlIGxhbmd1YWdlX20yOgorCSBzd2l0Y2gob3ApCisJIHsKKwkgY2FzZSBCSU5PUF9ESVY6CisJICAgIGlmICghZmxvYXRfdHlwZSh0MSkgfHwgIWZsb2F0X3R5cGUodDIpKQorCSAgICAgICB0eXBlX29wX2Vycm9yICgiQXJndW1lbnRzIHRvICVzIG11c3QgYmUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4iLG9wKTsKKwkgICAgYnJlYWs7CisJIGNhc2UgQklOT1BfSU5URElWOgorCSAgICBpZiAoIWludGVncmFsX3R5cGUodDEpIHx8ICFpbnRlZ3JhbF90eXBlKHQyKSkKKwkgICAgICAgdHlwZV9vcF9lcnJvciAoIkFyZ3VtZW50cyB0byAlcyBtdXN0IGJlIG9mIGludGVncmFsIHR5cGUuIixvcCk7CisJICAgIGJyZWFrOworCSB9CisjZW5kaWYKKworI2lmZGVmIF9MQU5HX2NoaWxsCisgICAgICAgY2FzZSBsYW5ndWFnZV9jaGlsbDoKKwkgZXJyb3IgKCJNaXNzaW5nIENoaWxsIHN1cHBvcnQgaW4gZnVuY3Rpb24gYmlub3BfdHlwZV9jaGVjay4iKTsvKkZJWE1FKi8KKyNlbmRpZgorCisgICAgICB9CisgICB9Cit9CisKKyNlbmRpZgkvKiAwICovCisKKwwKKy8qIFRoaXMgcGFnZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIHRoZSBwcmludGluZyBvdXQgb2YKKyAgIGVycm9yIG1lc3NhZ2VzIHRoYXQgb2NjdXIgZHVyaW5nIHR5cGUtIGFuZCByYW5nZS0KKyAgIGNoZWNraW5nLiAqLworCisvKiBQcmludHMgdGhlIGZvcm1hdCBzdHJpbmcgRk1UIHdpdGggdGhlIG9wZXJhdG9yIGFzIGEgc3RyaW5nCisgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBvcGNvZGUgT1AuICBJZiBGQVRBTCBpcyBub24temVybywgdGhlbgorICAgdGhpcyBpcyBhbiBlcnJvciBhbmQgZXJyb3IgKCkgaXMgY2FsbGVkLiAgT3RoZXJ3aXNlLCBpdCBpcworICAgYSB3YXJuaW5nIGFuZCBwcmludGYoKSBpcyBjYWxsZWQuICovCit2b2lkCitvcF9lcnJvciAoZm10LG9wLGZhdGFsKQorICAgY2hhciAqZm10OworICAgZW51bSBleHBfb3Bjb2RlIG9wOworICAgaW50IGZhdGFsOworeworICAgaWYgKGZhdGFsKQorICAgICAgZXJyb3IgKGZtdCxvcF9zdHJpbmcob3ApKTsKKyAgIGVsc2UKKyAgIHsKKyAgICAgIHdhcm5pbmcgKGZtdCxvcF9zdHJpbmcob3ApKTsKKyAgIH0KK30KKworLyogVGhlc2UgYXJlIGNhbGxlZCB3aGVuIGEgbGFuZ3VhZ2UgZmFpbHMgYSB0eXBlLSBvciByYW5nZS1jaGVjay4KKyAgIFRoZSBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgYSBwcmludGYoKS1zdHlsZSBmb3JtYXQgc3RyaW5nLCBhbmQKKyAgIHRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMgc2hvdWxkIGJlIGl0cyBhcmd1bWVudHMuICBJZgorICAgW3R5cGV8cmFuZ2VdX2NoZWNrIGlzIFt0eXBlfHJhbmdlXV9jaGVja19vbiwgdGhlbiByZXR1cm5fdG9fdG9wX2xldmVsKCkKKyAgIGlzIGNhbGxlZCBpbiB0aGUgc3R5bGUgb2YgZXJyb3IgKCkuICBPdGhlcndpc2UsIHRoZSBtZXNzYWdlIGlzIHByZWZpeGVkCisgICBieSB0aGUgdmFsdWUgb2Ygd2FybmluZ19wcmVfcHJpbnQgYW5kIHdlIGRvIG5vdCByZXR1cm4gdG8gdGhlIHRvcCBsZXZlbC4gKi8KKwordm9pZAorI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwordHlwZV9lcnJvciAoY2hhciAqc3RyaW5nLCAuLi4pCisjZWxzZQordHlwZV9lcnJvciAodmFfYWxpc3QpCisgICAgIHZhX2RjbAorI2VuZGlmCit7CisgICB2YV9saXN0IGFyZ3M7CisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisgICB2YV9zdGFydCAoYXJncywgc3RyaW5nKTsKKyNlbHNlCisgICBjaGFyICpzdHJpbmc7CisgICB2YV9zdGFydCAoYXJncyk7CisgICBzdHJpbmcgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7CisjZW5kaWYKKworICAgaWYgKHR5cGVfY2hlY2sgPT0gdHlwZV9jaGVja193YXJuKQorICAgICBmcHJpbnRmX2ZpbHRlcmVkIChnZGJfc3RkZXJyLCB3YXJuaW5nX3ByZV9wcmludCk7CisgICBlbHNlCisgICAgIGVycm9yX2JlZ2luICgpOworCisgICB2ZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgc3RyaW5nLCBhcmdzKTsKKyAgIGZwcmludGZfZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJcbiIpOworICAgdmFfZW5kIChhcmdzKTsKKyAgIGlmICh0eXBlX2NoZWNrID09IHR5cGVfY2hlY2tfb24pCisgICAgIHJldHVybl90b190b3BfbGV2ZWwgKFJFVFVSTl9FUlJPUik7Cit9CisKK3ZvaWQKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKK3JhbmdlX2Vycm9yIChjaGFyICpzdHJpbmcsIC4uLikKKyNlbHNlCityYW5nZV9lcnJvciAodmFfYWxpc3QpCisgICAgIHZhX2RjbAorI2VuZGlmCit7CisgICB2YV9saXN0IGFyZ3M7CisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisgICB2YV9zdGFydCAoYXJncywgc3RyaW5nKTsKKyNlbHNlCisgICBjaGFyICpzdHJpbmc7CisgICB2YV9zdGFydCAoYXJncyk7CisgICBzdHJpbmcgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7CisjZW5kaWYKKworICAgaWYgKHJhbmdlX2NoZWNrID09IHJhbmdlX2NoZWNrX3dhcm4pCisgICAgIGZwcmludGZfZmlsdGVyZWQgKGdkYl9zdGRlcnIsIHdhcm5pbmdfcHJlX3ByaW50KTsKKyAgIGVsc2UKKyAgICAgZXJyb3JfYmVnaW4gKCk7CisKKyAgIHZmcHJpbnRmX2ZpbHRlcmVkIChnZGJfc3RkZXJyLCBzdHJpbmcsIGFyZ3MpOworICAgZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlxuIik7CisgICB2YV9lbmQgKGFyZ3MpOworICAgaWYgKHJhbmdlX2NoZWNrID09IHJhbmdlX2NoZWNrX29uKQorICAgICByZXR1cm5fdG9fdG9wX2xldmVsIChSRVRVUk5fRVJST1IpOworfQorCisMCisvKiBUaGlzIHBhZ2UgY29udGFpbnMgbWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgKi8KKworLyogUmV0dXJuIHRoZSBsYW5ndWFnZSBlbnVtIGZvciBhIGdpdmVuIGxhbmd1YWdlIHN0cmluZy4gKi8KKworZW51bSBsYW5ndWFnZQorbGFuZ3VhZ2VfZW51bSAoc3RyKQorICAgICBjaGFyICpzdHI7Cit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBsYW5ndWFnZXNfc2l6ZTsgaSsrKSAKKyAgICBpZiAoU1RSRVEgKGxhbmd1YWdlc1tpXS0+bGFfbmFtZSwgc3RyKSkKKyAgICAgIHJldHVybiBsYW5ndWFnZXNbaV0tPmxhX2xhbmd1YWdlOworCisgIHJldHVybiBsYW5ndWFnZV91bmtub3duOworfQorCisvKiBSZXR1cm4gdGhlIGxhbmd1YWdlIHN0cnVjdCBmb3IgYSBnaXZlbiBsYW5ndWFnZSBlbnVtLiAqLworCitjb25zdCBzdHJ1Y3QgbGFuZ3VhZ2VfZGVmbiAqCitsYW5ndWFnZV9kZWYobGFuZykKKyAgIGVudW0gbGFuZ3VhZ2UgbGFuZzsKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGxhbmd1YWdlc19zaXplOyBpKyspIHsKKyAgICBpZiAobGFuZ3VhZ2VzW2ldLT5sYV9sYW5ndWFnZSA9PSBsYW5nKSB7CisgICAgICByZXR1cm4gbGFuZ3VhZ2VzW2ldOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJuIHRoZSBsYW5ndWFnZSBhcyBhIHN0cmluZyAqLworY2hhciAqCitsYW5ndWFnZV9zdHIobGFuZykKKyAgIGVudW0gbGFuZ3VhZ2UgbGFuZzsKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGxhbmd1YWdlc19zaXplOyBpKyspIHsKKyAgICBpZiAobGFuZ3VhZ2VzW2ldLT5sYV9sYW5ndWFnZSA9PSBsYW5nKSB7CisgICAgICByZXR1cm4gbGFuZ3VhZ2VzW2ldLT5sYV9uYW1lOworICAgIH0KKyAgfQorICByZXR1cm4gIlVua25vd24iOworfQorCitzdGF0aWMgdm9pZAorc2V0X2NoZWNrIChpZ25vcmUsIGZyb21fdHR5KQorICAgY2hhciAqaWdub3JlOworICAgaW50IGZyb21fdHR5OworeworICAgcHJpbnRmX3VuZmlsdGVyZWQoCisiXCJzZXQgY2hlY2tcIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIGEgY2hlY2sgc3ViY29tbWFuZC5cbiIpOworICAgaGVscF9saXN0KHNldGNoZWNrbGlzdCwgInNldCBjaGVjayAiLCAtMSwgZ2RiX3N0ZG91dCk7Cit9CisKK3N0YXRpYyB2b2lkCitzaG93X2NoZWNrIChpZ25vcmUsIGZyb21fdHR5KQorICAgY2hhciAqaWdub3JlOworICAgaW50IGZyb21fdHR5OworeworICAgY21kX3Nob3dfbGlzdChzaG93Y2hlY2tsaXN0LCBmcm9tX3R0eSwgIiIpOworfQorDAorLyogQWRkIGEgbGFuZ3VhZ2UgdG8gdGhlIHNldCBvZiBrbm93biBsYW5ndWFnZXMuICAqLworCit2b2lkCithZGRfbGFuZ3VhZ2UgKGxhbmcpCisgICAgIGNvbnN0IHN0cnVjdCBsYW5ndWFnZV9kZWZuICpsYW5nOworeworICBpZiAobGFuZy0+bGFfbWFnaWMgIT0gTEFOR19NQUdJQykKKyAgICB7CisgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQoZ2RiX3N0ZGVyciwgIk1hZ2ljIG51bWJlciBvZiAlcyBsYW5ndWFnZSBzdHJ1Y3Qgd3JvbmdcbiIsCisJbGFuZy0+bGFfbmFtZSk7CisgICAgICBhYm9ydCgpOworICAgIH0KKworICBpZiAoIWxhbmd1YWdlcykKKyAgICB7CisgICAgICBsYW5ndWFnZXNfYWxsb2NzaXplID0gREVGQVVMVF9BTExPQ1NJWkU7CisgICAgICBsYW5ndWFnZXMgPSAoY29uc3Qgc3RydWN0IGxhbmd1YWdlX2RlZm4gKiopIHhtYWxsb2MKKwkobGFuZ3VhZ2VzX2FsbG9jc2l6ZSAqIHNpemVvZiAoKmxhbmd1YWdlcykpOworICAgIH0KKyAgaWYgKGxhbmd1YWdlc19zaXplID49IGxhbmd1YWdlc19hbGxvY3NpemUpCisgICAgeworICAgICAgbGFuZ3VhZ2VzX2FsbG9jc2l6ZSAqPSAyOworICAgICAgbGFuZ3VhZ2VzID0gKGNvbnN0IHN0cnVjdCBsYW5ndWFnZV9kZWZuICoqKSB4cmVhbGxvYyAoKGNoYXIgKikgbGFuZ3VhZ2VzLAorCWxhbmd1YWdlc19hbGxvY3NpemUgKiBzaXplb2YgKCpsYW5ndWFnZXMpKTsKKyAgICB9CisgIGxhbmd1YWdlc1tsYW5ndWFnZXNfc2l6ZSsrXSA9IGxhbmc7Cit9CisKKy8qIERlZmluZSB0aGUgbGFuZ3VhZ2UgdGhhdCBpcyBubyBsYW5ndWFnZS4gICovCisKK3N0YXRpYyBpbnQKK3Vua19sYW5nX3BhcnNlciAoKQoreworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3Vua19sYW5nX2Vycm9yIChtc2cpCisgICAgIGNoYXIgKm1zZzsKK3sKKyAgZXJyb3IgKCJBdHRlbXB0ZWQgdG8gcGFyc2UgYW4gZXhwcmVzc2lvbiB3aXRoIHVua25vd24gbGFuZ3VhZ2UiKTsKK30KKworc3RhdGljIHZvaWQKK3Vua19sYW5nX2VtaXRfY2hhciAoYywgc3RyZWFtLCBxdW90ZXIpCisgICAgIHJlZ2lzdGVyIGludCBjOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgcXVvdGVyOworeworICBlcnJvciAoImludGVybmFsIGVycm9yIC0gdW5pbXBsZW1lbnRlZCBmdW5jdGlvbiB1bmtfbGFuZ19lbWl0X2NoYXIgY2FsbGVkLiIpOworfQorCitzdGF0aWMgdm9pZAordW5rX2xhbmdfcHJpbnRjaGFyIChjLCBzdHJlYW0pCisgICAgIHJlZ2lzdGVyIGludCBjOworICAgICBHREJfRklMRSAqc3RyZWFtOworeworICBlcnJvciAoImludGVybmFsIGVycm9yIC0gdW5pbXBsZW1lbnRlZCBmdW5jdGlvbiB1bmtfbGFuZ19wcmludGNoYXIgY2FsbGVkLiIpOworfQorCitzdGF0aWMgdm9pZAordW5rX2xhbmdfcHJpbnRzdHIgKHN0cmVhbSwgc3RyaW5nLCBsZW5ndGgsIHdpZHRoLCBmb3JjZV9lbGxpcHNlcykKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgY2hhciAqc3RyaW5nOworICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworICAgICBpbnQgd2lkdGg7CisgICAgIGludCBmb3JjZV9lbGxpcHNlczsKK3sKKyAgZXJyb3IgKCJpbnRlcm5hbCBlcnJvciAtIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gdW5rX2xhbmdfcHJpbnRzdHIgY2FsbGVkLiIpOworfQorCitzdGF0aWMgc3RydWN0IHR5cGUgKgordW5rX2xhbmdfY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGUgKG9iamZpbGUsIHR5cGVpZCkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIGludCB0eXBlaWQ7Cit7CisgIGVycm9yICgiaW50ZXJuYWwgZXJyb3IgLSB1bmltcGxlbWVudGVkIGZ1bmN0aW9uIHVua19sYW5nX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlIGNhbGxlZC4iKTsKK30KKworc3RhdGljIHZvaWQKK3Vua19sYW5nX3ByaW50X3R5cGUgKHR5cGUsIHZhcnN0cmluZywgc3RyZWFtLCBzaG93LCBsZXZlbCkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGNoYXIgKnZhcnN0cmluZzsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgaW50IHNob3c7CisgICAgIGludCBsZXZlbDsKK3sKKyAgZXJyb3IgKCJpbnRlcm5hbCBlcnJvciAtIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gdW5rX2xhbmdfcHJpbnRfdHlwZSBjYWxsZWQuIik7Cit9CisKK3N0YXRpYyBpbnQKK3Vua19sYW5nX3ZhbF9wcmludCAodHlwZSwgdmFsYWRkciwgIGVtYmVkZGVkX29mZnNldCwgYWRkcmVzcywgc3RyZWFtLCBmb3JtYXQsIGRlcmVmX3JlZiwKKwkJICAgIHJlY3Vyc2UsIHByZXR0eSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGNoYXIgKnZhbGFkZHI7CisgICAgIGludCBlbWJlZGRlZF9vZmZzZXQ7CisgICAgIENPUkVfQUREUiBhZGRyZXNzOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgZm9ybWF0OworICAgICBpbnQgZGVyZWZfcmVmOworICAgICBpbnQgcmVjdXJzZTsKKyAgICAgZW51bSB2YWxfcHJldHR5cHJpbnQgcHJldHR5OworeworICBlcnJvciAoImludGVybmFsIGVycm9yIC0gdW5pbXBsZW1lbnRlZCBmdW5jdGlvbiB1bmtfbGFuZ192YWxfcHJpbnQgY2FsbGVkLiIpOworfQorCitzdGF0aWMgaW50Cit1bmtfbGFuZ192YWx1ZV9wcmludCAodmFsLCBzdHJlYW0sIGZvcm1hdCwgcHJldHR5KQorICAgICB2YWx1ZV9wdHIgdmFsOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgZm9ybWF0OworICAgICBlbnVtIHZhbF9wcmV0dHlwcmludCBwcmV0dHk7Cit7CisgIGVycm9yICgiaW50ZXJuYWwgZXJyb3IgLSB1bmltcGxlbWVudGVkIGZ1bmN0aW9uIHVua19sYW5nX3ZhbHVlX3ByaW50IGNhbGxlZC4iKTsKK30KKworc3RhdGljIHN0cnVjdCB0eXBlICoqIENPTlNUX1BUUiAodW5rbm93bl9idWlsdGluX3R5cGVzW10pID0geyAwIH07CitzdGF0aWMgY29uc3Qgc3RydWN0IG9wX3ByaW50IHVua19vcF9wcmludF90YWJbXSA9IHsKKyAgICB7TlVMTCwgT1BfTlVMTCwgUFJFQ19OVUxMLCAwfQorfTsKKworY29uc3Qgc3RydWN0IGxhbmd1YWdlX2RlZm4gdW5rbm93bl9sYW5ndWFnZV9kZWZuID0geworICAidW5rbm93biIsCisgIGxhbmd1YWdlX3Vua25vd24sCisgICZ1bmtub3duX2J1aWx0aW5fdHlwZXNbMF0sCisgIHJhbmdlX2NoZWNrX29mZiwKKyAgdHlwZV9jaGVja19vZmYsCisgIHVua19sYW5nX3BhcnNlciwKKyAgdW5rX2xhbmdfZXJyb3IsCisgIGV2YWx1YXRlX3N1YmV4cF9zdGFuZGFyZCwKKyAgdW5rX2xhbmdfcHJpbnRjaGFyLAkJLyogUHJpbnQgY2hhcmFjdGVyIGNvbnN0YW50ICovCisgIHVua19sYW5nX3ByaW50c3RyLAorICB1bmtfbGFuZ19lbWl0X2NoYXIsCisgIHVua19sYW5nX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlLAorICB1bmtfbGFuZ19wcmludF90eXBlLAkJLyogUHJpbnQgYSB0eXBlIHVzaW5nIGFwcHJvcHJpYXRlIHN5bnRheCAqLworICB1bmtfbGFuZ192YWxfcHJpbnQsCQkvKiBQcmludCBhIHZhbHVlIHVzaW5nIGFwcHJvcHJpYXRlIHN5bnRheCAqLworICB1bmtfbGFuZ192YWx1ZV9wcmludCwJCS8qIFByaW50IGEgdG9wLWxldmVsIHZhbHVlICovCisgIHsiIiwgICAgICAiIiwgICAgIiIsICAgIiJ9LAkvKiBCaW5hcnkgZm9ybWF0IGluZm8gKi8KKyAgeyIwJWxvIiwgICAiMCIsICAgIm8iLCAgIiJ9LAkvKiBPY3RhbCBmb3JtYXQgaW5mbyAqLworICB7IiVsZCIsICAgICIiLCAgICAiZCIsICAiIn0sCS8qIERlY2ltYWwgZm9ybWF0IGluZm8gKi8KKyAgeyIweCVseCIsICAiMHgiLCAgIngiLCAgIiJ9LAkvKiBIZXggZm9ybWF0IGluZm8gKi8KKyAgdW5rX29wX3ByaW50X3RhYiwJCS8qIGV4cHJlc3Npb24gb3BlcmF0b3JzIGZvciBwcmludGluZyAqLworICAxLAkJCQkvKiBjLXN0eWxlIGFycmF5cyAqLworICAwLAkJCQkvKiBTdHJpbmcgbG93ZXIgYm91bmQgKi8KKyAgJmJ1aWx0aW5fdHlwZV9jaGFyLAkJLyogVHlwZSBvZiBzdHJpbmcgZWxlbWVudHMgKi8gCisgIExBTkdfTUFHSUMKK307CisKKy8qIFRoZXNlIHR3byBzdHJ1Y3RzIGRlZmluZSBmYWtlIGVudHJpZXMgZm9yIHRoZSAibG9jYWwiIGFuZCAiYXV0byIgb3B0aW9ucy4gKi8KK2NvbnN0IHN0cnVjdCBsYW5ndWFnZV9kZWZuIGF1dG9fbGFuZ3VhZ2VfZGVmbiA9IHsKKyAgImF1dG8iLAorICBsYW5ndWFnZV9hdXRvLAorICAmdW5rbm93bl9idWlsdGluX3R5cGVzWzBdLAorICByYW5nZV9jaGVja19vZmYsCisgIHR5cGVfY2hlY2tfb2ZmLAorICB1bmtfbGFuZ19wYXJzZXIsCisgIHVua19sYW5nX2Vycm9yLAorICBldmFsdWF0ZV9zdWJleHBfc3RhbmRhcmQsCisgIHVua19sYW5nX3ByaW50Y2hhciwJCS8qIFByaW50IGNoYXJhY3RlciBjb25zdGFudCAqLworICB1bmtfbGFuZ19wcmludHN0ciwKKyAgdW5rX2xhbmdfZW1pdF9jaGFyLAorICB1bmtfbGFuZ19jcmVhdGVfZnVuZGFtZW50YWxfdHlwZSwKKyAgdW5rX2xhbmdfcHJpbnRfdHlwZSwJCS8qIFByaW50IGEgdHlwZSB1c2luZyBhcHByb3ByaWF0ZSBzeW50YXggKi8KKyAgdW5rX2xhbmdfdmFsX3ByaW50LAkJLyogUHJpbnQgYSB2YWx1ZSB1c2luZyBhcHByb3ByaWF0ZSBzeW50YXggKi8KKyAgdW5rX2xhbmdfdmFsdWVfcHJpbnQsCQkvKiBQcmludCBhIHRvcC1sZXZlbCB2YWx1ZSAqLworICB7IiIsICAgICAgIiIsICAgICIiLCAgICIifSwJLyogQmluYXJ5IGZvcm1hdCBpbmZvICovCisgIHsiMCVsbyIsICAgIjAiLCAgICJvIiwgICIifSwJLyogT2N0YWwgZm9ybWF0IGluZm8gKi8KKyAgeyIlbGQiLCAgICAiIiwgICAgImQiLCAgIiJ9LAkvKiBEZWNpbWFsIGZvcm1hdCBpbmZvICovCisgIHsiMHglbHgiLCAgIjB4IiwgICJ4IiwgICIifSwJLyogSGV4IGZvcm1hdCBpbmZvICovCisgIHVua19vcF9wcmludF90YWIsCQkvKiBleHByZXNzaW9uIG9wZXJhdG9ycyBmb3IgcHJpbnRpbmcgKi8KKyAgMSwJCQkJLyogYy1zdHlsZSBhcnJheXMgKi8KKyAgMCwJCQkJLyogU3RyaW5nIGxvd2VyIGJvdW5kICovCisgICZidWlsdGluX3R5cGVfY2hhciwJCS8qIFR5cGUgb2Ygc3RyaW5nIGVsZW1lbnRzICovIAorICBMQU5HX01BR0lDCit9OworCitjb25zdCBzdHJ1Y3QgbGFuZ3VhZ2VfZGVmbiBsb2NhbF9sYW5ndWFnZV9kZWZuID0geworICAibG9jYWwiLAorICBsYW5ndWFnZV9hdXRvLAorICAmdW5rbm93bl9idWlsdGluX3R5cGVzWzBdLAorICByYW5nZV9jaGVja19vZmYsCisgIHR5cGVfY2hlY2tfb2ZmLAorICB1bmtfbGFuZ19wYXJzZXIsCisgIHVua19sYW5nX2Vycm9yLAorICBldmFsdWF0ZV9zdWJleHBfc3RhbmRhcmQsCisgIHVua19sYW5nX3ByaW50Y2hhciwJCS8qIFByaW50IGNoYXJhY3RlciBjb25zdGFudCAqLworICB1bmtfbGFuZ19wcmludHN0ciwKKyAgdW5rX2xhbmdfZW1pdF9jaGFyLAorICB1bmtfbGFuZ19jcmVhdGVfZnVuZGFtZW50YWxfdHlwZSwKKyAgdW5rX2xhbmdfcHJpbnRfdHlwZSwJCS8qIFByaW50IGEgdHlwZSB1c2luZyBhcHByb3ByaWF0ZSBzeW50YXggKi8KKyAgdW5rX2xhbmdfdmFsX3ByaW50LAkJLyogUHJpbnQgYSB2YWx1ZSB1c2luZyBhcHByb3ByaWF0ZSBzeW50YXggKi8KKyAgdW5rX2xhbmdfdmFsdWVfcHJpbnQsCQkvKiBQcmludCBhIHRvcC1sZXZlbCB2YWx1ZSAqLworICB7IiIsICAgICAgIiIsICAgICIiLCAgICIifSwJLyogQmluYXJ5IGZvcm1hdCBpbmZvICovCisgIHsiMCVsbyIsICAgIjAiLCAgICJvIiwgICIifSwJLyogT2N0YWwgZm9ybWF0IGluZm8gKi8KKyAgeyIlbGQiLCAgICAiIiwgICAgImQiLCAgIiJ9LAkvKiBEZWNpbWFsIGZvcm1hdCBpbmZvICovCisgIHsiMHglbHgiLCAgIjB4IiwgICJ4IiwgICIifSwJLyogSGV4IGZvcm1hdCBpbmZvICovCisgIHVua19vcF9wcmludF90YWIsCQkvKiBleHByZXNzaW9uIG9wZXJhdG9ycyBmb3IgcHJpbnRpbmcgKi8KKyAgMSwJCQkJLyogYy1zdHlsZSBhcnJheXMgKi8KKyAgMCwJCQkJLyogU3RyaW5nIGxvd2VyIGJvdW5kICovCisgICZidWlsdGluX3R5cGVfY2hhciwJCS8qIFR5cGUgb2Ygc3RyaW5nIGVsZW1lbnRzICovIAorICBMQU5HX01BR0lDCit9OworDAorLyogSW5pdGlhbGl6ZSB0aGUgbGFuZ3VhZ2Ugcm91dGluZXMgKi8KKwordm9pZAorX2luaXRpYWxpemVfbGFuZ3VhZ2UoKQoreworICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKnNldCwgKnNob3c7CisKKyAgIC8qIEdEQiBjb21tYW5kcyBmb3IgbGFuZ3VhZ2Ugc3BlY2lmaWMgc3R1ZmYgKi8KKworICAgc2V0ID0gYWRkX3NldF9jbWQgKCJsYW5ndWFnZSIsIGNsYXNzX3N1cHBvcnQsIHZhcl9zdHJpbmdfbm9lc2NhcGUsCisJCSAgICAgIChjaGFyICopJmxhbmd1YWdlLAorCQkgICAgICAiU2V0IHRoZSBjdXJyZW50IHNvdXJjZSBsYW5ndWFnZS4iLAorCQkgICAgICAmc2V0bGlzdCk7CisgICBzaG93ID0gYWRkX3Nob3dfZnJvbV9zZXQgKHNldCwgJnNob3dsaXN0KTsKKyAgIHNldC0+ZnVuY3Rpb24uY2Z1bmMgPSBzZXRfbGFuZ3VhZ2VfY29tbWFuZDsKKyAgIHNob3ctPmZ1bmN0aW9uLmNmdW5jID0gc2hvd19sYW5ndWFnZV9jb21tYW5kOworCisgICBhZGRfcHJlZml4X2NtZCAoImNoZWNrIiwgbm9fY2xhc3MsIHNldF9jaGVjaywKKwkJICAgIlNldCB0aGUgc3RhdHVzIG9mIHRoZSB0eXBlL3JhbmdlIGNoZWNrZXIiLAorCQkgICAmc2V0Y2hlY2tsaXN0LCAic2V0IGNoZWNrICIsIDAsICZzZXRsaXN0KTsKKyAgIGFkZF9hbGlhc19jbWQgKCJjIiwgImNoZWNrIiwgbm9fY2xhc3MsIDEsICZzZXRsaXN0KTsKKyAgIGFkZF9hbGlhc19jbWQgKCJjaCIsICJjaGVjayIsIG5vX2NsYXNzLCAxLCAmc2V0bGlzdCk7CisKKyAgIGFkZF9wcmVmaXhfY21kICgiY2hlY2siLCBub19jbGFzcywgc2hvd19jaGVjaywKKwkJICAgIlNob3cgdGhlIHN0YXR1cyBvZiB0aGUgdHlwZS9yYW5nZSBjaGVja2VyIiwKKwkJICAgJnNob3djaGVja2xpc3QsICJzaG93IGNoZWNrICIsIDAsICZzaG93bGlzdCk7CisgICBhZGRfYWxpYXNfY21kICgiYyIsICJjaGVjayIsIG5vX2NsYXNzLCAxLCAmc2hvd2xpc3QpOworICAgYWRkX2FsaWFzX2NtZCAoImNoIiwgImNoZWNrIiwgbm9fY2xhc3MsIDEsICZzaG93bGlzdCk7CisKKyAgIHNldCA9IGFkZF9zZXRfY21kICgidHlwZSIsIGNsYXNzX3N1cHBvcnQsIHZhcl9zdHJpbmdfbm9lc2NhcGUsCisJCSAgICAgIChjaGFyICopJnR5cGUsCisJCSAgICAgICJTZXQgdHlwZSBjaGVja2luZy4gIChvbi93YXJuL29mZi9hdXRvKSIsCisJCSAgICAgICZzZXRjaGVja2xpc3QpOworICAgc2hvdyA9IGFkZF9zaG93X2Zyb21fc2V0IChzZXQsICZzaG93Y2hlY2tsaXN0KTsKKyAgIHNldC0+ZnVuY3Rpb24uY2Z1bmMgPSBzZXRfdHlwZV9jb21tYW5kOworICAgc2hvdy0+ZnVuY3Rpb24uY2Z1bmMgPSBzaG93X3R5cGVfY29tbWFuZDsKKworICAgc2V0ID0gYWRkX3NldF9jbWQgKCJyYW5nZSIsIGNsYXNzX3N1cHBvcnQsIHZhcl9zdHJpbmdfbm9lc2NhcGUsCisJCSAgICAgIChjaGFyICopJnJhbmdlLAorCQkgICAgICAiU2V0IHJhbmdlIGNoZWNraW5nLiAgKG9uL3dhcm4vb2ZmL2F1dG8pIiwKKwkJICAgICAgJnNldGNoZWNrbGlzdCk7CisgICBzaG93ID0gYWRkX3Nob3dfZnJvbV9zZXQgKHNldCwgJnNob3djaGVja2xpc3QpOworICAgc2V0LT5mdW5jdGlvbi5jZnVuYyA9IHNldF9yYW5nZV9jb21tYW5kOworICAgc2hvdy0+ZnVuY3Rpb24uY2Z1bmMgPSBzaG93X3JhbmdlX2NvbW1hbmQ7CisKKyAgIGFkZF9sYW5ndWFnZSAoJnVua25vd25fbGFuZ3VhZ2VfZGVmbik7CisgICBhZGRfbGFuZ3VhZ2UgKCZsb2NhbF9sYW5ndWFnZV9kZWZuKTsKKyAgIGFkZF9sYW5ndWFnZSAoJmF1dG9fbGFuZ3VhZ2VfZGVmbik7CisKKyAgIGxhbmd1YWdlID0gc2F2ZXN0cmluZyAoImF1dG8iLHN0cmxlbigiYXV0byIpKTsKKyAgIHJhbmdlID0gc2F2ZXN0cmluZyAoImF1dG8iLHN0cmxlbigiYXV0byIpKTsKKyAgIHR5cGUgPSBzYXZlc3RyaW5nICgiYXV0byIsc3RybGVuKCJhdXRvIikpOworCisgICAvKiBIYXZlIHRoZSBhYm92ZSB0YWtlIGVmZmVjdCAqLworCisgICBzZXRfbGFuZ3VhZ2VfY29tbWFuZCAobGFuZ3VhZ2UsIDApOworICAgc2V0X3R5cGVfY29tbWFuZCAoTlVMTCwgMCk7CisgICBzZXRfcmFuZ2VfY29tbWFuZCAoTlVMTCwgMCk7Cit9CmRpZmYgLS1naXQgYS9nZGIvbGFuZ3VhZ2UuaCBiL2dkYi9sYW5ndWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMzY4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbGFuZ3VhZ2UuaApAQCAtMCwwICsxLDQzOSBAQAorLyogU291cmNlLWxhbmd1YWdlLXJlbGF0ZWQgZGVmaW5pdGlvbnMgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgdGhlIERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZSBhdCB0aGUgU3RhdGUgVW5pdmVyc2l0eQorICAgb2YgTmV3IFlvcmsgYXQgQnVmZmFsby4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWYgIWRlZmluZWQgKExBTkdVQUdFX0gpCisjZGVmaW5lIExBTkdVQUdFX0ggMQorCisjaWZkZWYgX19TVERDX18JCS8qIEZvcndhcmQgZGVjbHMgZm9yIHByb3RvdHlwZXMgKi8KK3N0cnVjdCB2YWx1ZTsKK3N0cnVjdCBvYmpmaWxlOworc3RydWN0IGV4cHJlc3Npb247CisvKiBlbnVtIGV4cF9vcGNvZGU7CUFOU0kncyBgd2lzZG9tJyBkaWRuJ3QgaW5jbHVkZSBmb3J3YXJkIGVudW0gZGVjbHMuICovCisjZW5kaWYKKworLyogVGhpcyB1c2VkIHRvIGJlIGluY2x1ZGVkIHRvIGNvbmZpZ3VyZSBHREIgZm9yIG9uZSBvciBtb3JlIHNwZWNpZmljCisgICBsYW5ndWFnZXMuICBOb3cgaXQgaXMgc2hvcnRjdXR0ZWQgdG8gY29uZmlndXJlIGZvciBhbGwgb2YgdGhlbS4gIEZJWE1FLiAgKi8KKy8qICNpbmNsdWRlICJsYW5nX2RlZi5oIiAqLworI2RlZmluZQlfTEFOR19jCisjZGVmaW5lCV9MQU5HX20yCisjZGVmaW5lCV9MQU5HX2NoaWxsCisjZGVmaW5lIF9MQU5HX2ZvcnRyYW4KKworI2RlZmluZSBNQVhfRk9SVFJBTl9ESU1TICA3ICAgLyogTWF4aW11bSBudW1iZXIgb2YgRjc3IGFycmF5IGRpbXMgKi8gCisKKy8qIHJhbmdlX21vZGUgPT0KKyAgIHJhbmdlX21vZGVfYXV0bzogICByYW5nZV9jaGVjayBzZXQgYXV0b21hdGljYWxseSB0byBkZWZhdWx0IG9mIGxhbmd1YWdlLgorICAgcmFuZ2VfbW9kZV9tYW51YWw6IHJhbmdlX2NoZWNrIHNldCBtYW51YWxseSBieSB1c2VyLiAgKi8KKworZXh0ZXJuIGVudW0gcmFuZ2VfbW9kZSB7cmFuZ2VfbW9kZV9hdXRvLCByYW5nZV9tb2RlX21hbnVhbH0gcmFuZ2VfbW9kZTsKKworLyogcmFuZ2VfY2hlY2sgPT0KKyAgIHJhbmdlX2NoZWNrX29uOiAgICBSYW5nZXMgYXJlIGNoZWNrZWQgaW4gR0RCIGV4cHJlc3Npb25zLCBwcm9kdWNpbmcgZXJyb3JzLgorICAgcmFuZ2VfY2hlY2tfd2FybjogIFJhbmdlcyBhcmUgY2hlY2tlZCwgcHJvZHVjaW5nIHdhcm5pbmdzLgorICAgcmFuZ2VfY2hlY2tfb2ZmOiAgIFJhbmdlcyBhcmUgbm90IGNoZWNrZWQgaW4gR0RCIGV4cHJlc3Npb25zLiAgKi8KKworZXh0ZXJuIGVudW0gcmFuZ2VfY2hlY2sKKyAge3JhbmdlX2NoZWNrX29mZiwgcmFuZ2VfY2hlY2tfd2FybiwgcmFuZ2VfY2hlY2tfb259IHJhbmdlX2NoZWNrOworCisvKiB0eXBlX21vZGUgPT0KKyAgIHR5cGVfbW9kZV9hdXRvOiAgIHR5cGVfY2hlY2sgc2V0IGF1dG9tYXRpY2FsbHkgdG8gZGVmYXVsdCBvZiBsYW5ndWFnZQorICAgdHlwZV9tb2RlX21hbnVhbDogdHlwZV9jaGVjayBzZXQgbWFudWFsbHkgYnkgdXNlci4gKi8KKworZXh0ZXJuIGVudW0gdHlwZV9tb2RlIHt0eXBlX21vZGVfYXV0bywgdHlwZV9tb2RlX21hbnVhbH0gdHlwZV9tb2RlOworCisvKiB0eXBlX2NoZWNrID09CisgICB0eXBlX2NoZWNrX29uOiAgICBUeXBlcyBhcmUgY2hlY2tlZCBpbiBHREIgZXhwcmVzc2lvbnMsIHByb2R1Y2luZyBlcnJvcnMuCisgICB0eXBlX2NoZWNrX3dhcm46ICBUeXBlcyBhcmUgY2hlY2tlZCwgcHJvZHVjaW5nIHdhcm5pbmdzLgorICAgdHlwZV9jaGVja19vZmY6ICAgVHlwZXMgYXJlIG5vdCBjaGVja2VkIGluIEdEQiBleHByZXNzaW9ucy4gICovCisKK2V4dGVybiBlbnVtIHR5cGVfY2hlY2sKKyAge3R5cGVfY2hlY2tfb2ZmLCB0eXBlX2NoZWNrX3dhcm4sIHR5cGVfY2hlY2tfb259IHR5cGVfY2hlY2s7CisMCisvKiBJbmZvcm1hdGlvbiBmb3IgZG9pbmcgbGFuZ3VhZ2UgZGVwZW5kZW50IGZvcm1hdHRpbmcgb2YgcHJpbnRlZCB2YWx1ZXMuICovCisKK3N0cnVjdCBsYW5ndWFnZV9mb3JtYXRfaW5mbworeworICAvKiBUaGUgZm9ybWF0IHRoYXQgY2FuIGJlIHBhc3NlZCBkaXJlY3RseSB0byBzdGFuZGFyZCBDIHByaW50ZiBmdW5jdGlvbnMKKyAgICAgdG8gZ2VuZXJhdGUgYSBjb21wbGV0ZWx5IGZvcm1hdHRlZCB2YWx1ZSBpbiB0aGUgZm9ybWF0IGFwcHJvcHJpYXRlIGZvcgorICAgICB0aGUgbGFuZ3VhZ2UuICovCisKKyAgY2hhciAqbGFfZm9ybWF0OworCisgIC8qIFRoZSBwcmVmaXggdG8gYmUgdXNlZCB3aGVuIGRpcmVjdGx5IHByaW50aW5nIGEgdmFsdWUsIG9yIGNvbnN0cnVjdGluZworICAgICBhIHN0YW5kYXJkIEMgcHJpbnRmIGZvcm1hdC4gIFRoaXMgZ2VuZXJhbGx5IGlzIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlCisgICAgIGNvbnZlcnNpb24gc3BlY2lmaWNhdGlvbiAodGhlIHBhcnQgaW50cm9kdWNlZCBieSB0aGUgJyUnIGNoYXJhY3RlcgorICAgICBhbmQgdGVybWluYXRlZCBieSB0aGUgY29udmVyc2lvbiBzcGVjaWZpZXIgY2hhcmFjdGVyKS4gKi8KKworICBjaGFyICpsYV9mb3JtYXRfcHJlZml4OworCisgIC8qIFRoZSBjb252ZXJzaW9uIHNwZWNpZmllci4gIFRoaXMgaXMgZ2VuZXJhbGx5IGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlCisgICAgIGZpZWxkIHdpZHRoIGFuZCBwcmVjaXNpb24sIHR5cGljYWxseSBvbmx5IGEgc2luZ2xlIGNoYXJhY3RlciBzdWNoCisgICAgIGFzICdvJyBmb3Igb2N0YWwgZm9ybWF0IG9yICd4JyBmb3IgaGV4YWRlY2ltYWwgZm9ybWF0LiAqLworCisgIGNoYXIgKmxhX2Zvcm1hdF9zcGVjaWZpZXI7CisKKyAgLyogVGhlIHN1ZmZpeCB0byBiZSB1c2VkIHdoZW4gZGlyZWN0bHkgcHJpbnRpbmcgYSB2YWx1ZSwgb3IgY29uc3RydWN0aW5nCisgICAgIGEgc3RhbmRhcmQgQyBwcmludGYgZm9ybWF0LiAgVGhpcyBnZW5lcmFsbHkgaXMgZXZlcnl0aGluZyBhZnRlciB0aGUKKyAgICAgY29udmVyc2lvbiBzcGVjaWZpY2F0aW9uICh0aGUgcGFydCBpbnRyb2R1Y2VkIGJ5IHRoZSAnJScgY2hhcmFjdGVyCisgICAgIGFuZCB0ZXJtaW5hdGVkIGJ5IHRoZSBjb252ZXJzaW9uIHNwZWNpZmllciBjaGFyYWN0ZXIpLiAqLworCisgIGNoYXIgKmxhX2Zvcm1hdF9zdWZmaXg7CQkvKiBTdWZmaXggZm9yIGN1c3RvbSBmb3JtYXQgc3RyaW5nICovCit9OworCisvKiBTdHJ1Y3R1cmUgdHlpbmcgdG9nZXRoZXIgYXNzb3J0ZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBsYW5ndWFnZS4gICovCisKK3N0cnVjdCBsYW5ndWFnZV9kZWZuCit7CisgIC8qIE5hbWUgb2YgdGhlIGxhbmd1YWdlICovCisgIAorICBjaGFyICpsYV9uYW1lOworCisgIC8qIGl0cyBzeW10YWIgbGFuZ3VhZ2UtZW51bSAoZGVmcy5oKSAqLworCisgIGVudW0gbGFuZ3VhZ2UgbGFfbGFuZ3VhZ2U7CisKKyAgLyogSXRzIGJ1aWx0aW4gdHlwZXMuICBUaGlzIGlzIGEgdmVjdG9yIGVuZGVkIGJ5IGEgTlVMTCBwb2ludGVyLiAgVGhlc2UKKyAgICAgdHlwZXMgY2FuIGJlIHNwZWNpZmllZCBieSBuYW1lIGluIHBhcnNpbmcgdHlwZXMgaW4gZXhwcmVzc2lvbnMsCisgICAgIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZCBhY3R1YWxseSBkZWZpbmVzCisgICAgIHN1Y2ggYSB0eXBlLiAgKi8KKworICBzdHJ1Y3QgdHlwZSAqKiBjb25zdCAqbGFfYnVpbHRpbl90eXBlX3ZlY3RvcjsKKworICAvKiBEZWZhdWx0IHJhbmdlIGNoZWNraW5nICovCisKKyAgZW51bSByYW5nZV9jaGVjayBsYV9yYW5nZV9jaGVjazsKKworICAvKiBEZWZhdWx0IHR5cGUgY2hlY2tpbmcgKi8KKworICBlbnVtIHR5cGVfY2hlY2sgbGFfdHlwZV9jaGVjazsKKworICAvKiBQYXJzZXIgZnVuY3Rpb24uICovCisgIAorICBpbnQgKCpsYV9wYXJzZXIpIFBBUkFNUygodm9pZCkpOworCisgIC8qIFBhcnNlciBlcnJvciBmdW5jdGlvbiAqLworCisgIHZvaWQgKCpsYV9lcnJvcikgUEFSQU1TICgoY2hhciAqKSk7CisKKyAgLyogRXZhbHVhdGUgYW4gZXhwcmVzc2lvbi4gKi8KKyAgc3RydWN0IHZhbHVlICogKCpldmFsdWF0ZV9leHApIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIHN0cnVjdCBleHByZXNzaW9uICosIAorCQkJCQkgIGludCAqLCBlbnVtIG5vc2lkZSkpOworCisgIHZvaWQgKCpsYV9wcmludGNoYXIpIFBBUkFNUyAoKGludCBjaCwgR0RCX0ZJTEUgKnN0cmVhbSkpOworCisgIHZvaWQgKCpsYV9wcmludHN0cikgUEFSQU1TICgoR0RCX0ZJTEUgKnN0cmVhbSwgY2hhciAqc3RyaW5nLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBsZW5ndGgsIGludCB3aWR0aCwKKwkJCSAgICAgICBpbnQgZm9yY2VfZWxsaXBzZXMpKTsKKworICB2b2lkICgqbGFfZW1pdGNoYXIpIFBBUkFNUyAoKGludCBjaCwgR0RCX0ZJTEUgKnN0cmVhbSwgaW50IHF1b3RlcikpOworCisgIHN0cnVjdCB0eXBlICooKmxhX2Z1bmRfdHlwZSkgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgaW50KSk7CisKKyAgLyogUHJpbnQgYSB0eXBlIHVzaW5nIHN5bnRheCBhcHByb3ByaWF0ZSBmb3IgdGhpcyBsYW5ndWFnZS4gKi8KKworICB2b2lkICgqbGFfcHJpbnRfdHlwZSkgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqLCBHREJfRklMRSAqLCBpbnQsIGludCkpOworCisgIC8qIFByaW50IGEgdmFsdWUgdXNpbmcgc3ludGF4IGFwcHJvcHJpYXRlIGZvciB0aGlzIGxhbmd1YWdlLiAqLworCisgIGludCAoKmxhX3ZhbF9wcmludCkgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqLCBpbnQsIENPUkVfQUREUiwgR0RCX0ZJTEUgKiwKKwkJCSAgICAgICBpbnQsIGludCwgaW50LCBlbnVtIHZhbF9wcmV0dHlwcmludCkpOworCisgIC8qIFByaW50IGEgdG9wLWxldmVsIHZhbHVlIHVzaW5nIHN5bnRheCBhcHByb3ByaWF0ZSBmb3IgdGhpcyBsYW5ndWFnZS4gKi8KKworICBpbnQgKCpsYV92YWx1ZV9wcmludCkgUEFSQU1TICgoc3RydWN0IHZhbHVlICosIEdEQl9GSUxFICosCisJCQkJIGludCwgZW51bSB2YWxfcHJldHR5cHJpbnQpKTsKKworICAvKiBCYXNlIDIgKGJpbmFyeSkgZm9ybWF0cy4gKi8KKworICBzdHJ1Y3QgbGFuZ3VhZ2VfZm9ybWF0X2luZm8gbGFfYmluYXJ5X2Zvcm1hdDsKKworICAvKiBCYXNlIDggKG9jdGFsKSBmb3JtYXRzLiAqLworCisgIHN0cnVjdCBsYW5ndWFnZV9mb3JtYXRfaW5mbyBsYV9vY3RhbF9mb3JtYXQ7CisKKyAgLyogQmFzZSAxMCAoZGVjaW1hbCkgZm9ybWF0cyAqLworCisgIHN0cnVjdCBsYW5ndWFnZV9mb3JtYXRfaW5mbyBsYV9kZWNpbWFsX2Zvcm1hdDsKKworICAvKiBCYXNlIDE2IChoZXhhZGVjaW1hbCkgZm9ybWF0cyAqLworCisgIHN0cnVjdCBsYW5ndWFnZV9mb3JtYXRfaW5mbyBsYV9oZXhfZm9ybWF0OworCisgIC8qIFRhYmxlIGZvciBwcmludGluZyBleHByZXNzaW9ucyAqLworCisgIGNvbnN0IHN0cnVjdCBvcF9wcmludCAqbGFfb3BfcHJpbnRfdGFiOworCisgIC8qIFplcm8gaWYgdGhlIGxhbmd1YWdlIGhhcyBmaXJzdC1jbGFzcyBhcnJheXMuICBUcnVlIGlmIHRoZXJlIGFyZSBubworICAgICBhcnJheSB2YWx1ZXMsIGFuZCBhcnJheSBvYmplY3RzIGRlY2F5IHRvIHBvaW50ZXJzLCBhcyBpbiBDLiAqLworCisgIGNoYXIgY19zdHlsZV9hcnJheXM7CisKKyAgLyogSW5kZXggdG8gdXNlIGZvciBleHRyYWN0aW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgc3RyaW5nLiAqLworICBjaGFyIHN0cmluZ19sb3dlcl9ib3VuZDsKKworICAvKiBUeXBlIG9mIGVsZW1lbnRzIG9mIHN0cmluZ3MuICovCisgIHN0cnVjdCB0eXBlICoqc3RyaW5nX2NoYXJfdHlwZTsKKworICAvKiBBZGQgZmllbGRzIGFib3ZlIHRoaXMgcG9pbnQsIHNvIHRoZSBtYWdpYyBudW1iZXIgaXMgYWx3YXlzIGxhc3QuICovCisgIC8qIE1hZ2ljIG51bWJlciBmb3IgY29tcGF0IGNoZWNraW5nICovCisKKyAgbG9uZyBsYV9tYWdpYzsKKworfTsKKworI2RlZmluZSBMQU5HX01BR0lDCTkxMDgyM0wKKworLyogUG9pbnRlciB0byB0aGUgbGFuZ3VhZ2VfZGVmbiBmb3Igb3VyIGN1cnJlbnQgbGFuZ3VhZ2UuICBUaGlzIHBvaW50ZXIKKyAgIGFsd2F5cyBwb2ludHMgdG8gKnNvbWUqIHZhbGlkIHN0cnVjdDsgaXQgY2FuIGJlIHVzZWQgd2l0aG91dCBjaGVja2luZworICAgaXQgZm9yIHZhbGlkaXR5LgorCisgICBUaGUgY3VycmVudCBsYW5ndWFnZSBhZmZlY3RzIGV4cHJlc3Npb24gcGFyc2luZyBhbmQgZXZhbHVhdGlvbgorICAgKEZJWE1FOiBpdCBtaWdodCBiZSBjbGVhbmVyIHRvIG1ha2UgdGhlIGV2YWx1YXRpb24tcmVsYXRlZCBzdHVmZgorICAgc2VwYXJhdGUgZXhwX29wY29kZXMgZm9yIGVhY2ggZGlmZmVyZW50IHNldCBvZiBzZW1hbnRpY3MuICBXZQorICAgc2hvdWxkIGF0IGxlYXN0IHRoaW5rIHRoaXMgdGhyb3VnaCBtb3JlIGNsZWFybHkgd2l0aCByZXNwZWN0IHRvCisgICB3aGF0IGhhcHBlbnMgaWYgdGhlIGxhbmd1YWdlIGlzIGNoYW5nZWQgYmV0d2VlbiBwYXJzaW5nIGFuZAorICAgZXZhbHVhdGlvbikgYW5kIHByaW50aW5nIG9mIHRoaW5ncyBsaWtlIHR5cGVzIGFuZCBhcnJheXMuICBJdCBkb2VzCisgICAqbm90KiBhZmZlY3Qgc3ltYm9sLXJlYWRpbmctLSBlYWNoIHNvdXJjZSBmaWxlIGluIGEgc3ltYm9sLWZpbGUgaGFzCisgICBpdHMgb3duIGxhbmd1YWdlIGFuZCB3ZSBzaG91bGQga2VlcCB0cmFjayBvZiB0aGF0IHJlZ2FyZGxlc3Mgb2YgdGhlCisgICBsYW5ndWFnZSB3aGVuIHN5bWJvbHMgYXJlIHJlYWQuICBJZiB3ZSB3YW50IHNvbWUgbWFudWFsIHNldHRpbmcgZm9yCisgICB0aGUgbGFuZ3VhZ2Ugb2Ygc3ltYm9sIGZpbGVzIChlLmcuIGRldGVjdGluZyB3aGVuICIuYyIgZmlsZXMgYXJlCisgICBDKyspLCBpdCBzaG91bGQgYmUgYSBzZXByYXRlIHNldHRpbmcgZnJvbSB0aGUgY3VycmVudF9sYW5ndWFnZS4gICovCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbGFuZ3VhZ2VfZGVmbiAqY3VycmVudF9sYW5ndWFnZTsKKworLyogUG9pbnRlciB0byB0aGUgbGFuZ3VhZ2VfZGVmbiBleHBlY3RlZCBieSB0aGUgdXNlciwgZS5nLiB0aGUgbGFuZ3VhZ2UKKyAgIG9mIG1haW4oKSwgb3IgdGhlIGxhbmd1YWdlIHdlIGxhc3QgbWVudGlvbmVkIGluIGEgbWVzc2FnZSwgb3IgQy4gICovCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbGFuZ3VhZ2VfZGVmbiAqZXhwZWN0ZWRfbGFuZ3VhZ2U7CisKKy8qIGxhbmd1YWdlX21vZGUgPT0gCisgICBsYW5ndWFnZV9tb2RlX2F1dG86ICAgY3VycmVudF9sYW5ndWFnZSBhdXRvbWF0aWNhbGx5IHNldCB1cG9uIHNlbGVjdGlvbgorCQkJIG9mIHNjb3BlIChlLmcuIHN0YWNrIGZyYW1lKQorICAgbGFuZ3VhZ2VfbW9kZV9tYW51YWw6IGN1cnJlbnRfbGFuZ3VhZ2Ugc2V0IG9ubHkgYnkgdXNlci4gICovCisKK2V4dGVybiBlbnVtIGxhbmd1YWdlX21vZGUKKyAge2xhbmd1YWdlX21vZGVfYXV0bywgbGFuZ3VhZ2VfbW9kZV9tYW51YWx9IGxhbmd1YWdlX21vZGU7CisMCisvKiBUaGVzZSBtYWNyb3MgZGVmaW5lIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGV4cHJlc3Npb24gCisgICBldmFsdWF0b3IuICAqLworCisvKiBTaG91bGQgd2Ugc3RyaWN0bHkgdHlwZSBjaGVjayBleHByZXNzaW9ucz8gKi8KKyNkZWZpbmUgU1RSSUNUX1RZUEUgKHR5cGVfY2hlY2sgIT0gdHlwZV9jaGVja19vZmYpCisKKy8qIFNob3VsZCB3ZSByYW5nZSBjaGVjayB2YWx1ZXMgYWdhaW5zdCB0aGUgZG9tYWluIG9mIHRoZWlyIHR5cGU/ICovCisjZGVmaW5lIFJBTkdFX0NIRUNLIChyYW5nZV9jaGVjayAhPSByYW5nZV9jaGVja19vZmYpCisKKy8qICJjYXN0IiByZWFsbHkgbWVhbnMgY29udmVyc2lvbiAqLworLyogRklYTUUgLS0gc2hvdWxkIGJlIGEgc2V0dGluZyBpbiBsYW5ndWFnZV9kZWZuICovCisjZGVmaW5lIENBU1RfSVNfQ09OVkVSU0lPTiAoY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfYyAgfHwgXAorCQkJICAgIGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2xhbmd1YWdlID09IGxhbmd1YWdlX2NwbHVzKQorCitleHRlcm4gdm9pZAorbGFuZ3VhZ2VfaW5mbyBQQVJBTVMgKChpbnQpKTsKKworZXh0ZXJuIGVudW0gbGFuZ3VhZ2UKK3NldF9sYW5ndWFnZSBQQVJBTVMgKChlbnVtIGxhbmd1YWdlKSk7CisKKwwKKy8qIFRoaXMgcGFnZSBjb250YWlucyBmdW5jdGlvbnMgdGhhdCByZXR1cm4gdGhpbmdzIHRoYXQgYXJlCisgICBzcGVjaWZpYyB0byBsYW5ndWFnZXMuICBFYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBiYXNlZCBvbgorICAgdGhlIGN1cnJlbnQgc2V0dGluZyBvZiB3b3JraW5nX2xhbmcsIHdoaWNoIHRoZSB1c2VyIHNldHMKKyAgIHdpdGggdGhlICJzZXQgbGFuZ3VhZ2UiIGNvbW1hbmQuICovCisKKyNkZWZpbmUgY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGUob2JqZmlsZSx0eXBlaWQpIFwKKyAgKGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2Z1bmRfdHlwZShvYmpmaWxlLCB0eXBlaWQpKQorCisjZGVmaW5lIExBX1BSSU5UX1RZUEUodHlwZSx2YXJzdHJpbmcsc3RyZWFtLHNob3csbGV2ZWwpIFwKKyAgKGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX3ByaW50X3R5cGUodHlwZSx2YXJzdHJpbmcsc3RyZWFtLHNob3csbGV2ZWwpKQorCisjZGVmaW5lIExBX1ZBTF9QUklOVCh0eXBlLHZhbGFkZHIsb2Zmc2V0LGFkZHIsc3RyZWFtLGZtdCxkZXJlZixyZWN1cnNlLHByZXR0eSkgXAorICAoY3VycmVudF9sYW5ndWFnZS0+bGFfdmFsX3ByaW50KHR5cGUsdmFsYWRkcixvZmZzZXQsYWRkcixzdHJlYW0sZm10LGRlcmVmLCBcCisJCQkJICByZWN1cnNlLHByZXR0eSkpCisjZGVmaW5lIExBX1ZBTFVFX1BSSU5UKHZhbCxzdHJlYW0sZm10LHByZXR0eSkgXAorICAoY3VycmVudF9sYW5ndWFnZS0+bGFfdmFsdWVfcHJpbnQodmFsLHN0cmVhbSxmbXQscHJldHR5KSkKKworLyogUmV0dXJuIGEgZm9ybWF0IHN0cmluZyBmb3IgcHJpbnRmIHRoYXQgd2lsbCBwcmludCBhIG51bWJlciBpbiBvbmUgb2YKKyAgIHRoZSBsb2NhbCAobGFuZ3VhZ2Utc3BlY2lmaWMpIGZvcm1hdHMuICBSZXN1bHQgaXMgc3RhdGljIGFuZCBpcworICAgb3ZlcndyaXR0ZW4gYnkgdGhlIG5leHQgY2FsbC4gIFRha2VzIHByaW50ZiBvcHRpb25zIGxpa2UgIjA4IiBvciAibCIKKyAgICh0byBwcm9kdWNlIGUuZy4gJTA4eCBvciAlbHgpLiAgKi8KKworI2RlZmluZSBsb2NhbF9iaW5hcnlfZm9ybWF0KCkgXAorICAoY3VycmVudF9sYW5ndWFnZS0+bGFfYmluYXJ5X2Zvcm1hdC5sYV9mb3JtYXQpCisjZGVmaW5lIGxvY2FsX2JpbmFyeV9mb3JtYXRfcHJlZml4KCkgXAorICAoY3VycmVudF9sYW5ndWFnZS0+bGFfYmluYXJ5X2Zvcm1hdC5sYV9mb3JtYXRfcHJlZml4KQorI2RlZmluZSBsb2NhbF9iaW5hcnlfZm9ybWF0X3NwZWNpZmllcigpIFwKKyAgKGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2JpbmFyeV9mb3JtYXQubGFfZm9ybWF0X3NwZWNpZmllcikKKyNkZWZpbmUgbG9jYWxfYmluYXJ5X2Zvcm1hdF9zdWZmaXgoKSBcCisgIChjdXJyZW50X2xhbmd1YWdlLT5sYV9iaW5hcnlfZm9ybWF0LmxhX2Zvcm1hdF9zdWZmaXgpCisKKyNkZWZpbmUgbG9jYWxfb2N0YWxfZm9ybWF0KCkgXAorICAoY3VycmVudF9sYW5ndWFnZS0+bGFfb2N0YWxfZm9ybWF0LmxhX2Zvcm1hdCkKKyNkZWZpbmUgbG9jYWxfb2N0YWxfZm9ybWF0X3ByZWZpeCgpIFwKKyAgKGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX29jdGFsX2Zvcm1hdC5sYV9mb3JtYXRfcHJlZml4KQorI2RlZmluZSBsb2NhbF9vY3RhbF9mb3JtYXRfc3BlY2lmaWVyKCkgXAorICAoY3VycmVudF9sYW5ndWFnZS0+bGFfb2N0YWxfZm9ybWF0LmxhX2Zvcm1hdF9zcGVjaWZpZXIpCisjZGVmaW5lIGxvY2FsX29jdGFsX2Zvcm1hdF9zdWZmaXgoKSBcCisgIChjdXJyZW50X2xhbmd1YWdlLT5sYV9vY3RhbF9mb3JtYXQubGFfZm9ybWF0X3N1ZmZpeCkKKworI2RlZmluZSBsb2NhbF9kZWNpbWFsX2Zvcm1hdCgpIFwKKyAgKGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2RlY2ltYWxfZm9ybWF0LmxhX2Zvcm1hdCkKKyNkZWZpbmUgbG9jYWxfZGVjaW1hbF9mb3JtYXRfcHJlZml4KCkgXAorICAoY3VycmVudF9sYW5ndWFnZS0+bGFfZGVjaW1hbF9mb3JtYXQubGFfZm9ybWF0X3ByZWZpeCkKKyNkZWZpbmUgbG9jYWxfZGVjaW1hbF9mb3JtYXRfc3BlY2lmaWVyKCkgXAorICAoY3VycmVudF9sYW5ndWFnZS0+bGFfZGVjaW1hbF9mb3JtYXQubGFfZm9ybWF0X3NwZWNpZmllcikKKyNkZWZpbmUgbG9jYWxfZGVjaW1hbF9mb3JtYXRfc3VmZml4KCkgXAorICAoY3VycmVudF9sYW5ndWFnZS0+bGFfZGVjaW1hbF9mb3JtYXQubGFfZm9ybWF0X3N1ZmZpeCkKKworI2RlZmluZSBsb2NhbF9oZXhfZm9ybWF0KCkgXAorICAoY3VycmVudF9sYW5ndWFnZS0+bGFfaGV4X2Zvcm1hdC5sYV9mb3JtYXQpCisjZGVmaW5lIGxvY2FsX2hleF9mb3JtYXRfcHJlZml4KCkgXAorICAoY3VycmVudF9sYW5ndWFnZS0+bGFfaGV4X2Zvcm1hdC5sYV9mb3JtYXRfcHJlZml4KQorI2RlZmluZSBsb2NhbF9oZXhfZm9ybWF0X3NwZWNpZmllcigpIFwKKyAgKGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2hleF9mb3JtYXQubGFfZm9ybWF0X3NwZWNpZmllcikKKyNkZWZpbmUgbG9jYWxfaGV4X2Zvcm1hdF9zdWZmaXgoKSBcCisgIChjdXJyZW50X2xhbmd1YWdlLT5sYV9oZXhfZm9ybWF0LmxhX2Zvcm1hdF9zdWZmaXgpCisKKyNkZWZpbmUgTEFfUFJJTlRfQ0hBUihjaCwgc3RyZWFtKSBcCisgIChjdXJyZW50X2xhbmd1YWdlLT5sYV9wcmludGNoYXIoY2gsIHN0cmVhbSkpCisjZGVmaW5lIExBX1BSSU5UX1NUUklORyhzdHJlYW0sIHN0cmluZywgbGVuZ3RoLCB3aWR0aCwgZm9yY2VfZWxsaXBzZXMpIFwKKyAgKGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX3ByaW50c3RyKHN0cmVhbSwgc3RyaW5nLCBsZW5ndGgsIHdpZHRoLCBmb3JjZV9lbGxpcHNlcykpCisjZGVmaW5lIExBX0VNSVRfQ0hBUihjaCwgc3RyZWFtLCBxdW90ZXIpIFwKKyAgKGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2VtaXRjaGFyKGNoLCBzdHJlYW0sIHF1b3RlcikpCisKKy8qIFRlc3QgYSBjaGFyYWN0ZXIgdG8gZGVjaWRlIHdoZXRoZXIgaXQgY2FuIGJlIHByaW50ZWQgaW4gbGl0ZXJhbCBmb3JtCisgICBvciBuZWVkcyB0byBiZSBwcmludGVkIGluIGFub3RoZXIgcmVwcmVzZW50YXRpb24uICBGb3IgZXhhbXBsZSwKKyAgIGluIEMgdGhlIGxpdGVyYWwgZm9ybSBvZiB0aGUgY2hhcmFjdGVyIHdpdGggb2N0YWwgdmFsdWUgMTQxIGlzICdhJworICAgYW5kIHRoZSAib3RoZXIgcmVwcmVzZW50YXRpb24iIGlzICdcMTQxJy4gIFRoZSAib3RoZXIgcmVwcmVzZW50YXRpb24iCisgICBpcyBwcm9ncmFtIGxhbmd1YWdlIGRlcGVuZGVudC4gKi8KKworI2RlZmluZSBQUklOVF9MSVRFUkFMX0ZPUk0oYykJCVwKKyAgKChjKSA+PSAweDIwCQkJCVwKKyAgICYmICgoYykgPCAweDdGIHx8IChjKSA+PSAweEEwKQlcCisgICAmJiAoIXNldmVuYml0X3N0cmluZ3MgfHwgKGMpIDwgMHg4MCkpCisKKy8qIFJldHVybiBhIGZvcm1hdCBzdHJpbmcgZm9yIHByaW50ZiB0aGF0IHdpbGwgcHJpbnQgYSBudW1iZXIgaW4gb25lIG9mCisgICB0aGUgbG9jYWwgKGxhbmd1YWdlLXNwZWNpZmljKSBmb3JtYXRzLiAgUmVzdWx0IGlzIHN0YXRpYyBhbmQgaXMKKyAgIG92ZXJ3cml0dGVuIGJ5IHRoZSBuZXh0IGNhbGwuICBUYWtlcyBwcmludGYgb3B0aW9ucyBsaWtlICIwOCIgb3IgImwiCisgICAodG8gcHJvZHVjZSBlLmcuICUwOHggb3IgJWx4KS4gICovCisKK2V4dGVybiBjaGFyICoKK2xvY2FsX2RlY2ltYWxfZm9ybWF0X2N1c3RvbSBQQVJBTVMgKChjaGFyICopKTsJLyogbGFuZ3VhZ2UuYyAqLworCitleHRlcm4gY2hhciAqCitsb2NhbF9vY3RhbF9mb3JtYXRfY3VzdG9tIFBBUkFNUyAoKGNoYXIgKikpOwkvKiBsYW5ndWFnZS5jICovCisKK2V4dGVybiBjaGFyICoKK2xvY2FsX2hleF9mb3JtYXRfY3VzdG9tIFBBUkFNUyAoKGNoYXIgKikpOwkvKiBsYW5ndWFnZS5jICovCisKKy8qIFJldHVybiBhIHN0cmluZyB0aGF0IGNvbnRhaW5zIGEgbnVtYmVyIGZvcm1hdHRlZCBpbiBvbmUgb2YgdGhlIGxvY2FsCisgICAobGFuZ3VhZ2Utc3BlY2lmaWMpIGZvcm1hdHMuICBSZXN1bHQgaXMgc3RhdGljIGFuZCBpcyBvdmVyd3JpdHRlbiBieQorICAgdGhlIG5leHQgY2FsbC4gIFRha2VzIHByaW50ZiBvcHRpb25zIGxpa2UgIjA4IiBvciAibCIuICAqLworCitleHRlcm4gY2hhciAqCitsb2NhbF9oZXhfc3RyaW5nIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsJCS8qIGxhbmd1YWdlLmMgKi8KKworZXh0ZXJuIGNoYXIgKgorbG9jYWxfaGV4X3N0cmluZ19jdXN0b20gUEFSQU1TICgodW5zaWduZWQgbG9uZywgY2hhciAqKSk7IC8qIGxhbmd1YWdlLmMgKi8KKworLyogVHlwZSBwcmVkaWNhdGVzICovCisKK2V4dGVybiBpbnQKK3NpbXBsZV90eXBlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICopKTsKKworZXh0ZXJuIGludAorb3JkZXJlZF90eXBlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICopKTsKKworZXh0ZXJuIGludAorc2FtZV90eXBlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIHN0cnVjdCB0eXBlICopKTsKKworZXh0ZXJuIGludAoraW50ZWdyYWxfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKSk7CisKK2V4dGVybiBpbnQKK251bWVyaWNfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKSk7CisKK2V4dGVybiBpbnQKK2NoYXJhY3Rlcl90eXBlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICopKTsKKworZXh0ZXJuIGludAorYm9vbGVhbl90eXBlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICopKTsKKworZXh0ZXJuIGludAorZmxvYXRfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKSk7CisKK2V4dGVybiBpbnQKK3BvaW50ZXJfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKSk7CisKK2V4dGVybiBpbnQKK3N0cnVjdHVyZWRfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqKSk7CisKKy8qIENoZWNrcyBCaW5hcnkgYW5kIFVuYXJ5IG9wZXJhdGlvbnMgZm9yIHNlbWFudGljIHR5cGUgY29ycmVjdG5lc3MgKi8KKy8qIEZJWE1FOiAgRG9lcyBub3QgYXBwZWFyIHRvIGJlIHVzZWQgKi8KKyNkZWZpbmUgdW5vcF90eXBlX2NoZWNrKHYsbykgYmlub3BfdHlwZV9jaGVjaygodiksTlVMTCwobykpCisKK2V4dGVybiB2b2lkCitiaW5vcF90eXBlX2NoZWNrIFBBUkFNUyAoKHN0cnVjdCB2YWx1ZSAqLCBzdHJ1Y3QgdmFsdWUgKiwgaW50KSk7CisKKy8qIEVycm9yIG1lc3NhZ2VzICovCisKK2V4dGVybiB2b2lkCitvcF9lcnJvciBQQVJBTVMgKChjaGFyICpmbXQsIGVudW0gZXhwX29wY29kZSwgaW50KSk7CisKKyNkZWZpbmUgdHlwZV9vcF9lcnJvcihmLG8pIFwKKyAgIG9wX2Vycm9yKChmKSwobyksdHlwZV9jaGVjaz09dHlwZV9jaGVja19vbiA/IDEgOiAwKQorI2RlZmluZSByYW5nZV9vcF9lcnJvcihmLG8pIFwKKyAgIG9wX2Vycm9yKChmKSwobykscmFuZ2VfY2hlY2s9PXJhbmdlX2NoZWNrX29uID8gMSA6IDApCisKK2V4dGVybiB2b2lkCit0eXBlX2Vycm9yIFBBUkFNUyAoKGNoYXIgKiwgLi4uKSkKKyAgICAgQVRUUl9GT1JNQVQocHJpbnRmLCAxLCAyKTsKKwordm9pZAorcmFuZ2VfZXJyb3IgUEFSQU1TICgoY2hhciAqLCAuLi4pKQorICAgICBBVFRSX0ZPUk1BVChwcmludGYsIDEsIDIpOworCisvKiBEYXRhOiAgRG9lcyB0aGlzIHZhbHVlIHJlcHJlc2VudCAidHJ1dGgiIHRvIHRoZSBjdXJyZW50IGxhbmd1YWdlPyAgKi8KKworZXh0ZXJuIGludAordmFsdWVfdHJ1ZSBQQVJBTVMgKChzdHJ1Y3QgdmFsdWUgKikpOworCitleHRlcm4gc3RydWN0IHR5cGUgKiBsYW5nX2Jvb2xfdHlwZSBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIFRoZSB0eXBlIHVzZWQgZm9yIEJvb2xlYW4gdmFsdWVzIGluIHRoZSBjdXJyZW50IGxhbmd1YWdlLiAqLworI2RlZmluZSBMQV9CT09MX1RZUEUgbGFuZ19ib29sX3R5cGUgKCkKKworLyogTWlzYzogIFRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgcGFydGljdWxhciBlbnVtIGxhbmd1YWdlLiAgKi8KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBsYW5ndWFnZV9kZWZuICoKK2xhbmd1YWdlX2RlZiBQQVJBTVMgKChlbnVtIGxhbmd1YWdlKSk7CisKK2V4dGVybiBjaGFyICoKK2xhbmd1YWdlX3N0ciBQQVJBTVMgKChlbnVtIGxhbmd1YWdlKSk7CisKKy8qIEFkZCBhIGxhbmd1YWdlIHRvIHRoZSBzZXQga25vd24gYnkgR0RCIChhdCBpbml0aWFsaXphdGlvbiB0aW1lKS4gICovCisKK2V4dGVybiB2b2lkCithZGRfbGFuZ3VhZ2UgUEFSQU1TICgoY29uc3Qgc3RydWN0IGxhbmd1YWdlX2RlZm4gKikpOworCitleHRlcm4gZW51bSBsYW5ndWFnZQorZ2V0X2ZyYW1lX2xhbmd1YWdlIFBBUkFNUyAoKHZvaWQpKTsJCS8qIEluIHN0YWNrLmMgKi8KKworI2VuZGlmCS8qIGRlZmluZWQgKExBTkdVQUdFX0gpICovCmRpZmYgLS1naXQgYS9nZGIvbHlueC1uYXQuYyBiL2dkYi9seW54LW5hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMDZhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbHlueC1uYXQuYwpAQCAtMCwwICsxLDgzNyBAQAorLyogTmF0aXZlLWRlcGVuZGVudCBjb2RlIGZvciBMeW54T1MuCisgICBDb3B5cmlnaHQgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisKKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvZnBwLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJlZ2lzdGVyc19hZGRyIFBBUkFNUyAoKGludCBwaWQpKTsKK3N0YXRpYyB2b2lkIGZldGNoX2NvcmVfcmVnaXN0ZXJzIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQsIGludCwgQ09SRV9BRERSKTsKKworI2RlZmluZSBYKEVOVFJZKShvZmZzZXRvZihzdHJ1Y3QgZWNvbnRleHQsIEVOVFJZKSkKKworI2lmZGVmIEkzODYKKy8qIE1hcHBpbmdzIGZyb20gdG0taTM4NnYuaCAqLworCitzdGF0aWMgaW50IHJlZ21hcFtdID0KK3sKKyAgWChlYXgpLAorICBYKGVjeCksCisgIFgoZWR4KSwKKyAgWChlYngpLAorICBYKGVzcCksCQkJLyogc3AgKi8KKyAgWChlYnApLAkJCS8qIGZwICovCisgIFgoZXNpKSwKKyAgWChlZGkpLAorICBYKGVpcCksCQkJLyogcGMgKi8KKyAgWChmbGFncyksCQkJLyogcHMgKi8KKyAgWChjcyksCisgIFgoc3MpLAorICBYKGRzKSwKKyAgWChlcyksCisgIFgoZWNvZGUpLAkJCS8qIEx5bnggZG9lc24ndCBnaXZlIHVzIGVpdGhlciBmcyBvciBncywgc28gKi8KKyAgWChmYXVsdCksCQkJLyogd2UganVzdCBzdWJzdGl0dXRlIHRoZXNlIHR3byBpbiB0aGUgaG9wZXMKKwkJCQkgICB0aGF0IHRoZXkgYXJlIHVzZWZ1bC4gKi8KK307CisjZW5kaWYgLyogSTM4NiAqLworCisjaWZkZWYgTTY4SworLyogTWFwcGluZ3MgZnJvbSB0bS1tNjhrLmggKi8KKworc3RhdGljIGludCByZWdtYXBbXSA9Cit7CisgIFgocmVnc1swXSksCQkJLyogZDAgKi8KKyAgWChyZWdzWzFdKSwJCQkvKiBkMSAqLworICBYKHJlZ3NbMl0pLAkJCS8qIGQyICovCisgIFgocmVnc1szXSksCQkJLyogZDMgKi8KKyAgWChyZWdzWzRdKSwJCQkvKiBkNCAqLworICBYKHJlZ3NbNV0pLAkJCS8qIGQ1ICovCisgIFgocmVnc1s2XSksCQkJLyogZDYgKi8KKyAgWChyZWdzWzddKSwJCQkvKiBkNyAqLworICBYKHJlZ3NbOF0pLAkJCS8qIGEwICovCisgIFgocmVnc1s5XSksCQkJLyogYTEgKi8KKyAgWChyZWdzWzEwXSksCQkJLyogYTIgKi8KKyAgWChyZWdzWzExXSksCQkJLyogYTMgKi8KKyAgWChyZWdzWzEyXSksCQkJLyogYTQgKi8KKyAgWChyZWdzWzEzXSksCQkJLyogYTUgKi8KKyAgWChyZWdzWzE0XSksCQkJLyogZnAgKi8KKyAgb2Zmc2V0b2YgKHN0X3QsIHVzcCkgLSBvZmZzZXRvZiAoc3RfdCwgZWMpLCAvKiBzcCAqLworICBYKHN0YXR1cyksCQkJLyogcHMgKi8KKyAgWChwYyksCisKKyAgWChmcmVnc1swKjNdKSwJCS8qIGZwMCAqLworICBYKGZyZWdzWzEqM10pLAkJLyogZnAxICovCisgIFgoZnJlZ3NbMiozXSksCQkvKiBmcDIgKi8KKyAgWChmcmVnc1szKjNdKSwJCS8qIGZwMyAqLworICBYKGZyZWdzWzQqM10pLAkJLyogZnA0ICovCisgIFgoZnJlZ3NbNSozXSksCQkvKiBmcDUgKi8KKyAgWChmcmVnc1s2KjNdKSwJCS8qIGZwNiAqLworICBYKGZyZWdzWzcqM10pLAkJLyogZnA3ICovCisKKyAgWChmY3JlZ3NbMF0pLAkJCS8qIGZwY29udHJvbCAqLworICBYKGZjcmVnc1sxXSksCQkJLyogZnBzdGF0dXMgKi8KKyAgWChmY3JlZ3NbMl0pLAkJCS8qIGZwaWFkZHIgKi8KKyAgWChzc3cpLAkJCS8qIGZwY29kZSAqLworICBYKGZhdWx0KSwJCQkvKiBmcGZsYWdzICovCit9OworI2VuZGlmIC8qIE02OEsgKi8KKworI2lmZGVmIFNQQVJDCisvKiBNYXBwaW5ncyBmcm9tIHRtLXNwYXJjLmggKi8KKworI2RlZmluZSBGWChFTlRSWSkob2Zmc2V0b2Yoc3RydWN0IGZjb250ZXh0LCBFTlRSWSkpCisKK3N0YXRpYyBpbnQgcmVnbWFwW10gPQoreworICAtMSwJCQkJLyogZzAgKi8KKyAgWChnMSksCisgIFgoZzIpLAorICBYKGczKSwKKyAgWChnNCksCisgIC0xLAkJCQkvKiBnNS0+ZzcgYXJlbid0IHNhdmVkIGJ5IEx5bnggKi8KKyAgLTEsCisgIC0xLAorCisgIFgob1swXSksCisgIFgob1sxXSksCisgIFgob1syXSksCisgIFgob1szXSksCisgIFgob1s0XSksCisgIFgob1s1XSksCisgIFgob1s2XSksCQkJLyogc3AgKi8KKyAgWChvWzddKSwJCQkvKiByYSAqLworCisgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAkvKiBsMCAtPiBsNyAqLworCisgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAkvKiBpMCAtPiBpNyAqLworCisgIEZYKGYuZnJlZ3NbMF0pLAkJLyogZjAgKi8KKyAgRlgoZi5mcmVnc1sxXSksCisgIEZYKGYuZnJlZ3NbMl0pLAorICBGWChmLmZyZWdzWzNdKSwKKyAgRlgoZi5mcmVnc1s0XSksCisgIEZYKGYuZnJlZ3NbNV0pLAorICBGWChmLmZyZWdzWzZdKSwKKyAgRlgoZi5mcmVnc1s3XSksCisgIEZYKGYuZnJlZ3NbOF0pLAorICBGWChmLmZyZWdzWzldKSwKKyAgRlgoZi5mcmVnc1sxMF0pLAorICBGWChmLmZyZWdzWzExXSksCisgIEZYKGYuZnJlZ3NbMTJdKSwKKyAgRlgoZi5mcmVnc1sxM10pLAorICBGWChmLmZyZWdzWzE0XSksCisgIEZYKGYuZnJlZ3NbMTVdKSwKKyAgRlgoZi5mcmVnc1sxNl0pLAorICBGWChmLmZyZWdzWzE3XSksCisgIEZYKGYuZnJlZ3NbMThdKSwKKyAgRlgoZi5mcmVnc1sxOV0pLAorICBGWChmLmZyZWdzWzIwXSksCisgIEZYKGYuZnJlZ3NbMjFdKSwKKyAgRlgoZi5mcmVnc1syMl0pLAorICBGWChmLmZyZWdzWzIzXSksCisgIEZYKGYuZnJlZ3NbMjRdKSwKKyAgRlgoZi5mcmVnc1syNV0pLAorICBGWChmLmZyZWdzWzI2XSksCisgIEZYKGYuZnJlZ3NbMjddKSwKKyAgRlgoZi5mcmVnc1syOF0pLAorICBGWChmLmZyZWdzWzI5XSksCisgIEZYKGYuZnJlZ3NbMzBdKSwKKyAgRlgoZi5mcmVnc1szMV0pLAorCisgIFgoeSksCisgIFgocHNyKSwKKyAgWCh3aW0pLAorICBYKHRiciksCisgIFgocGMpLAorICBYKG5wYyksCisgIEZYKGZzciksCQkJLyogZnBzciAqLworICAtMSwJCQkJLyogY3BzciAqLworfTsKKyNlbmRpZiAvKiBTUEFSQyAqLworCisjaWZkZWYgcnM2MDAwCisKK3N0YXRpYyBpbnQgcmVnbWFwW10gPQoreworICBYKGlyZWdzWzBdKSwJCQkvKiByMCAqLworICBYKGlyZWdzWzFdKSwKKyAgWChpcmVnc1syXSksCisgIFgoaXJlZ3NbM10pLAorICBYKGlyZWdzWzRdKSwKKyAgWChpcmVnc1s1XSksCisgIFgoaXJlZ3NbNl0pLAorICBYKGlyZWdzWzddKSwKKyAgWChpcmVnc1s4XSksCisgIFgoaXJlZ3NbOV0pLAorICBYKGlyZWdzWzEwXSksCisgIFgoaXJlZ3NbMTFdKSwKKyAgWChpcmVnc1sxMl0pLAorICBYKGlyZWdzWzEzXSksCisgIFgoaXJlZ3NbMTRdKSwKKyAgWChpcmVnc1sxNV0pLAorICBYKGlyZWdzWzE2XSksCisgIFgoaXJlZ3NbMTddKSwKKyAgWChpcmVnc1sxOF0pLAorICBYKGlyZWdzWzE5XSksCisgIFgoaXJlZ3NbMjBdKSwKKyAgWChpcmVnc1syMV0pLAorICBYKGlyZWdzWzIyXSksCisgIFgoaXJlZ3NbMjNdKSwKKyAgWChpcmVnc1syNF0pLAorICBYKGlyZWdzWzI1XSksCisgIFgoaXJlZ3NbMjZdKSwKKyAgWChpcmVnc1syN10pLAorICBYKGlyZWdzWzI4XSksCisgIFgoaXJlZ3NbMjldKSwKKyAgWChpcmVnc1szMF0pLAorICBYKGlyZWdzWzMxXSksCisKKyAgWChmcmVnc1swXSksCQkJLyogZjAgKi8KKyAgWChmcmVnc1sxXSksCisgIFgoZnJlZ3NbMl0pLAorICBYKGZyZWdzWzNdKSwKKyAgWChmcmVnc1s0XSksCisgIFgoZnJlZ3NbNV0pLAorICBYKGZyZWdzWzZdKSwKKyAgWChmcmVnc1s3XSksCisgIFgoZnJlZ3NbOF0pLAorICBYKGZyZWdzWzldKSwKKyAgWChmcmVnc1sxMF0pLAorICBYKGZyZWdzWzExXSksCisgIFgoZnJlZ3NbMTJdKSwKKyAgWChmcmVnc1sxM10pLAorICBYKGZyZWdzWzE0XSksCisgIFgoZnJlZ3NbMTVdKSwKKyAgWChmcmVnc1sxNl0pLAorICBYKGZyZWdzWzE3XSksCisgIFgoZnJlZ3NbMThdKSwKKyAgWChmcmVnc1sxOV0pLAorICBYKGZyZWdzWzIwXSksCisgIFgoZnJlZ3NbMjFdKSwKKyAgWChmcmVnc1syMl0pLAorICBYKGZyZWdzWzIzXSksCisgIFgoZnJlZ3NbMjRdKSwKKyAgWChmcmVnc1syNV0pLAorICBYKGZyZWdzWzI2XSksCisgIFgoZnJlZ3NbMjddKSwKKyAgWChmcmVnc1syOF0pLAorICBYKGZyZWdzWzI5XSksCisgIFgoZnJlZ3NbMzBdKSwKKyAgWChmcmVnc1szMV0pLAorCisgIFgoc3JyMCksCQkJLyogSUFSIChQQykgKi8KKyAgWChzcnIxKSwJCQkvKiBNU1IgKFBTKSAqLworICBYKGNyKSwJCQkvKiBDUiAqLworICBYKGxyKSwJCQkvKiBMUiAqLworICBYKGN0ciksCQkJLyogQ1RSICovCisgIFgoeGVyKSwJCQkvKiBYRVIgKi8KKyAgWChtcSkJCQkJLyogTVEgKi8KK307CisKKyNlbmRpZiAvKiByczYwMDAgKi8KKworI2lmZGVmIFNQQVJDCisKKy8qIFRoaXMgcm91dGluZSBoYW5kbGVzIHNvbWUgb2RkYmFsbCBjYXNlcyBmb3IgU3BhcmMgcmVnaXN0ZXJzIGFuZCBMeW54T1MuCisgICBJbiBwYXJ0dWN1bGFyLCBpdCBjYXVzZXMgcmVmcyB0byBHMCwgZzUtPjcsIGFuZCBhbGwgZnAgcmVncyB0byByZXR1cm4gemVyby4KKyAgIEl0IGFsc28gaGFuZGxlcyBrbm93cyB3aGVyZSB0byBmaW5kIHRoZSBJICYgTCByZWdzIG9uIHRoZSBzdGFjay4gICovCisKK3ZvaWQKK2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgaW50IHdoYXRyZWdzID0gMDsKKworI2RlZmluZSBXSEFUUkVHU19GTE9BVCAxCisjZGVmaW5lIFdIQVRSRUdTX0dFTiAyCisjZGVmaW5lIFdIQVRSRUdTX1NUQUNLIDQKKworICBpZiAocmVnbm8gPT0gLTEpCisgICAgd2hhdHJlZ3MgPSBXSEFUUkVHU19GTE9BVCB8IFdIQVRSRUdTX0dFTiB8IFdIQVRSRUdTX1NUQUNLOworICBlbHNlIGlmIChyZWdubyA+PSBMMF9SRUdOVU0gJiYgcmVnbm8gPD0gSTdfUkVHTlVNKQorICAgIHdoYXRyZWdzID0gV0hBVFJFR1NfU1RBQ0s7CisgIGVsc2UgaWYgKHJlZ25vID49IEZQMF9SRUdOVU0gJiYgcmVnbm8gPCBGUDBfUkVHTlVNICsgMzIpCisgICAgd2hhdHJlZ3MgPSBXSEFUUkVHU19GTE9BVDsKKyAgZWxzZQorICAgIHdoYXRyZWdzID0gV0hBVFJFR1NfR0VOOworCisgIGlmICh3aGF0cmVncyAmIFdIQVRSRUdTX0dFTikKKyAgICB7CisgICAgICBzdHJ1Y3QgZWNvbnRleHQgZWM7CQkvKiBnZW5lcmFsIHJlZ3MgKi8KKyAgICAgIGNoYXIgYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisgICAgICBpbnQgcmV0dmFsOworICAgICAgaW50IGk7CisKKyAgICAgIGVycm5vID0gMDsKKyAgICAgIHJldHZhbCA9IHB0cmFjZSAoUFRSQUNFX0dFVFJFR1MsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpICZlYywKKwkJICAgICAgIDApOworICAgICAgaWYgKGVycm5vKQorCXBlcnJvcl93aXRoX25hbWUgKCJwdHJhY2UoUFRSQUNFX0dFVFJFR1MpIik7CisgIAorICAgICAgbWVtc2V0IChidWYsIDAsIFJFR0lTVEVSX1JBV19TSVpFIChHMF9SRUdOVU0pKTsKKyAgICAgIHN1cHBseV9yZWdpc3RlciAoRzBfUkVHTlVNLCBidWYpOworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChUQlJfUkVHTlVNLCAoY2hhciAqKSZlYy50YnIpOworCisgICAgICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRzFfUkVHTlVNKV0sICZlYy5nMSwKKwkgICAgICA0ICogUkVHSVNURVJfUkFXX1NJWkUgKEcxX1JFR05VTSkpOworICAgICAgZm9yIChpID0gRzFfUkVHTlVNOyBpIDw9IEcxX1JFR05VTSArIDM7IGkrKykKKwlyZWdpc3Rlcl92YWxpZFtpXSA9IDE7CisKKyAgICAgIHN1cHBseV9yZWdpc3RlciAoUFNfUkVHTlVNLCAoY2hhciAqKSZlYy5wc3IpOworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChZX1JFR05VTSwgKGNoYXIgKikmZWMueSk7CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKFBDX1JFR05VTSwgKGNoYXIgKikmZWMucGMpOworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChOUENfUkVHTlVNLCAoY2hhciAqKSZlYy5ucGMpOworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChXSU1fUkVHTlVNLCAoY2hhciAqKSZlYy53aW0pOworCisgICAgICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoTzBfUkVHTlVNKV0sIGVjLm8sCisJICAgICAgOCAqIFJFR0lTVEVSX1JBV19TSVpFIChPMF9SRUdOVU0pKTsKKyAgICAgIGZvciAoaSA9IE8wX1JFR05VTTsgaSA8PSBPMF9SRUdOVU0gKyA3OyBpKyspCisJcmVnaXN0ZXJfdmFsaWRbaV0gPSAxOworICAgIH0KKworICBpZiAod2hhdHJlZ3MgJiBXSEFUUkVHU19TVEFDSykKKyAgICB7CisgICAgICBDT1JFX0FERFIgc3A7CisgICAgICBpbnQgaTsKKworICAgICAgc3AgPSByZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pOworCisgICAgICB0YXJnZXRfeGZlcl9tZW1vcnkgKHNwICsgRlJBTUVfU0FWRURfSTAsCisJCQkgICZyZWdpc3RlcnNbUkVHSVNURVJfQllURShJMF9SRUdOVU0pXSwKKwkJCSAgOCAqIFJFR0lTVEVSX1JBV19TSVpFIChJMF9SRUdOVU0pLCAwKTsKKyAgICAgIGZvciAoaSA9IEkwX1JFR05VTTsgaSA8PSBJN19SRUdOVU07IGkrKykKKwlyZWdpc3Rlcl92YWxpZFtpXSA9IDE7CisKKyAgICAgIHRhcmdldF94ZmVyX21lbW9yeSAoc3AgKyBGUkFNRV9TQVZFRF9MMCwKKwkJCSAgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKEwwX1JFR05VTSldLAorCQkJICA4ICogUkVHSVNURVJfUkFXX1NJWkUgKEwwX1JFR05VTSksIDApOworICAgICAgZm9yIChpID0gTDBfUkVHTlVNOyBpIDw9IEwwX1JFR05VTSArIDc7IGkrKykKKwlyZWdpc3Rlcl92YWxpZFtpXSA9IDE7CisgICAgfQorCisgIGlmICh3aGF0cmVncyAmIFdIQVRSRUdTX0ZMT0FUKQorICAgIHsKKyAgICAgIHN0cnVjdCBmY29udGV4dCBmYzsJCS8qIGZwIHJlZ3MgKi8KKyAgICAgIGludCByZXR2YWw7CisgICAgICBpbnQgaTsKKworICAgICAgZXJybm8gPSAwOworICAgICAgcmV0dmFsID0gcHRyYWNlIChQVFJBQ0VfR0VURlBSRUdTLCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSAmZmMsCisJCSAgICAgICAwKTsKKyAgICAgIGlmIChlcnJubykKKwlwZXJyb3Jfd2l0aF9uYW1lICgicHRyYWNlKFBUUkFDRV9HRVRGUFJFR1MpIik7CisgIAorICAgICAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pXSwgZmMuZi5mcmVncywKKwkgICAgICAzMiAqIFJFR0lTVEVSX1JBV19TSVpFIChGUDBfUkVHTlVNKSk7CisgICAgICBmb3IgKGkgPSBGUDBfUkVHTlVNOyBpIDw9IEZQMF9SRUdOVU0gKyAzMTsgaSsrKQorCXJlZ2lzdGVyX3ZhbGlkW2ldID0gMTsKKworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChGUFNfUkVHTlVNLCAoY2hhciAqKSZmYy5mc3IpOworICAgIH0KK30KKworLyogVGhpcyByb3V0aW5lIGhhbmRsZXMgc3RvcmluZyBvZiB0aGUgSSAmIEwgcmVncyBmb3IgdGhlIFNwYXJjLiAgVGhlIHRyaWNrCisgICBoZXJlIGlzIHRoYXQgdGhleSBhY3R1YWxseSBsaXZlIG9uIHRoZSBzdGFjay4gIFRoZSByZWFsbHkgdHJpY2t5IHBhcnQgaXMKKyAgIHRoYXQgd2hlbiBjaGFuZ2luZyB0aGUgc3RhY2sgcG9pbnRlciwgdGhlIEkgJiBMIHJlZ3MgbXVzdCBiZSB3cml0dGVuIHRvCisgICB3aGVyZSB0aGUgbmV3IFNQIHBvaW50cywgb3RoZXJ3aXNlIHRoZSByZWdzIHdpbGwgYmUgaW5jb3JyZWN0IHdoZW4gdGhlCisgICBwcm9jZXNzIGlzIHN0YXJ0ZWQgdXAgYWdhaW4uICAgV2UgYXNzdW1lIHRoYXQgdGhlIEkgJiBMIHJlZ3MgYXJlIHZhbGlkIGF0CisgICB0aGlzIHBvaW50LiAgKi8KKwordm9pZAorc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBpbnQgd2hhdHJlZ3MgPSAwOworCisgIGlmIChyZWdubyA9PSAtMSkKKyAgICB3aGF0cmVncyA9IFdIQVRSRUdTX0ZMT0FUIHwgV0hBVFJFR1NfR0VOIHwgV0hBVFJFR1NfU1RBQ0s7CisgIGVsc2UgaWYgKHJlZ25vID49IEwwX1JFR05VTSAmJiByZWdubyA8PSBJN19SRUdOVU0pCisgICAgd2hhdHJlZ3MgPSBXSEFUUkVHU19TVEFDSzsKKyAgZWxzZSBpZiAocmVnbm8gPj0gRlAwX1JFR05VTSAmJiByZWdubyA8IEZQMF9SRUdOVU0gKyAzMikKKyAgICB3aGF0cmVncyA9IFdIQVRSRUdTX0ZMT0FUOworICBlbHNlIGlmIChyZWdubyA9PSBTUF9SRUdOVU0pCisgICAgd2hhdHJlZ3MgPSBXSEFUUkVHU19TVEFDSyB8IFdIQVRSRUdTX0dFTjsKKyAgZWxzZQorICAgIHdoYXRyZWdzID0gV0hBVFJFR1NfR0VOOworCisgIGlmICh3aGF0cmVncyAmIFdIQVRSRUdTX0dFTikKKyAgICB7CisgICAgICBzdHJ1Y3QgZWNvbnRleHQgZWM7CQkvKiBnZW5lcmFsIHJlZ3MgKi8KKyAgICAgIGludCByZXR2YWw7CisKKyAgICAgIGVjLnRiciA9IHJlYWRfcmVnaXN0ZXIgKFRCUl9SRUdOVU0pOworICAgICAgbWVtY3B5ICgmZWMuZzEsICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRzFfUkVHTlVNKV0sCisJICAgICAgNCAqIFJFR0lTVEVSX1JBV19TSVpFIChHMV9SRUdOVU0pKTsKKworICAgICAgZWMucHNyID0gcmVhZF9yZWdpc3RlciAoUFNfUkVHTlVNKTsKKyAgICAgIGVjLnkgPSByZWFkX3JlZ2lzdGVyIChZX1JFR05VTSk7CisgICAgICBlYy5wYyA9IHJlYWRfcmVnaXN0ZXIgKFBDX1JFR05VTSk7CisgICAgICBlYy5ucGMgPSByZWFkX3JlZ2lzdGVyIChOUENfUkVHTlVNKTsKKyAgICAgIGVjLndpbSA9IHJlYWRfcmVnaXN0ZXIgKFdJTV9SRUdOVU0pOworCisgICAgICBtZW1jcHkgKGVjLm8sICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoTzBfUkVHTlVNKV0sCisJICAgICAgOCAqIFJFR0lTVEVSX1JBV19TSVpFIChPMF9SRUdOVU0pKTsKKworICAgICAgZXJybm8gPSAwOworICAgICAgcmV0dmFsID0gcHRyYWNlIChQVFJBQ0VfU0VUUkVHUywgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgJmVjLAorCQkgICAgICAgMCk7CisgICAgICBpZiAoZXJybm8pCisJcGVycm9yX3dpdGhfbmFtZSAoInB0cmFjZShQVFJBQ0VfU0VUUkVHUykiKTsKKyAgICB9CisKKyAgaWYgKHdoYXRyZWdzICYgV0hBVFJFR1NfU1RBQ0spCisgICAgeworICAgICAgaW50IHJlZ29mZnNldDsKKyAgICAgIENPUkVfQUREUiBzcDsKKworICAgICAgc3AgPSByZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pOworCisgICAgICBpZiAocmVnbm8gPT0gLTEgfHwgcmVnbm8gPT0gU1BfUkVHTlVNKQorCXsKKwkgIGlmICghcmVnaXN0ZXJfdmFsaWRbTDBfUkVHTlVNKzVdKQorCSAgICBhYm9ydCgpOworCSAgdGFyZ2V0X3hmZXJfbWVtb3J5IChzcCArIEZSQU1FX1NBVkVEX0kwLAorCQkJICAgICAgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChJMF9SRUdOVU0pXSwKKwkJCSAgICAgIDggKiBSRUdJU1RFUl9SQVdfU0laRSAoSTBfUkVHTlVNKSwgMSk7CisKKwkgIHRhcmdldF94ZmVyX21lbW9yeSAoc3AgKyBGUkFNRV9TQVZFRF9MMCwKKwkJCSAgICAgICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoTDBfUkVHTlVNKV0sCisJCQkgICAgICA4ICogUkVHSVNURVJfUkFXX1NJWkUgKEwwX1JFR05VTSksIDEpOworCX0KKyAgICAgIGVsc2UgaWYgKHJlZ25vID49IEwwX1JFR05VTSAmJiByZWdubyA8PSBJN19SRUdOVU0pCisJeworCSAgaWYgKCFyZWdpc3Rlcl92YWxpZFtyZWdub10pCisJICAgIGFib3J0KCk7CisJICBpZiAocmVnbm8gPj0gTDBfUkVHTlVNICYmIHJlZ25vIDw9IEwwX1JFR05VTSArIDcpCisJICAgIHJlZ29mZnNldCA9IFJFR0lTVEVSX0JZVEUgKHJlZ25vKSAtIFJFR0lTVEVSX0JZVEUgKEwwX1JFR05VTSkKKwkgICAgICArIEZSQU1FX1NBVkVEX0wwOworCSAgZWxzZQorCSAgICByZWdvZmZzZXQgPSBSRUdJU1RFUl9CWVRFIChyZWdubykgLSBSRUdJU1RFUl9CWVRFIChJMF9SRUdOVU0pCisJICAgICAgKyBGUkFNRV9TQVZFRF9JMDsKKwkgIHRhcmdldF94ZmVyX21lbW9yeSAoc3AgKyByZWdvZmZzZXQsICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnbm8pXSwKKwkJCSAgICAgIFJFR0lTVEVSX1JBV19TSVpFIChyZWdubyksIDEpOworCX0KKyAgICB9CisKKyAgaWYgKHdoYXRyZWdzICYgV0hBVFJFR1NfRkxPQVQpCisgICAgeworICAgICAgc3RydWN0IGZjb250ZXh0IGZjOwkJLyogZnAgcmVncyAqLworICAgICAgaW50IHJldHZhbDsKKworLyogV2UgcmVhZCBmY29udGV4dCBmaXJzdCBzbyB0aGF0IHdlIGNhbiBnZXQgZ29vZCB2YWx1ZXMgZm9yIGZxX3QuLi4gKi8KKyAgICAgIGVycm5vID0gMDsKKyAgICAgIHJldHZhbCA9IHB0cmFjZSAoUFRSQUNFX0dFVEZQUkVHUywgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgJmZjLAorCQkgICAgICAgMCk7CisgICAgICBpZiAoZXJybm8pCisJcGVycm9yX3dpdGhfbmFtZSAoInB0cmFjZShQVFJBQ0VfR0VURlBSRUdTKSIpOworICAKKyAgICAgIG1lbWNweSAoZmMuZi5mcmVncywgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNKV0sCisJICAgICAgMzIgKiBSRUdJU1RFUl9SQVdfU0laRSAoRlAwX1JFR05VTSkpOworCisgICAgICBmYy5mc3IgPSByZWFkX3JlZ2lzdGVyIChGUFNfUkVHTlVNKTsKKworICAgICAgZXJybm8gPSAwOworICAgICAgcmV0dmFsID0gcHRyYWNlIChQVFJBQ0VfU0VURlBSRUdTLCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSAmZmMsCisJCSAgICAgICAwKTsKKyAgICAgIGlmIChlcnJubykKKwlwZXJyb3Jfd2l0aF9uYW1lICgicHRyYWNlKFBUUkFDRV9TRVRGUFJFR1MpIik7CisgICAgICB9Cit9CisjZW5kaWYgLyogU1BBUkMgKi8KKworI2lmIGRlZmluZWQgKEkzODYpIHx8IGRlZmluZWQgKE02OEspIHx8IGRlZmluZWQgKHJzNjAwMCkKKworLyogUmV0dXJuIHRoZSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwZXItdGhyZWFkIGRhdGEgdG8gdGhlCisgICBzYXZlZCBjb250ZXh0IGJsb2NrLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK3JlZ2lzdGVyc19hZGRyKHBpZCkKKyAgICAgaW50IHBpZDsKK3sKKyAgQ09SRV9BRERSIHN0YmxvY2s7CisgIGludCBlY3BvZmYgPSBvZmZzZXRvZihzdF90LCBlY3ApOworICBDT1JFX0FERFIgZWNwOworCisgIGVycm5vID0gMDsKKyAgc3RibG9jayA9IChDT1JFX0FERFIpIHB0cmFjZSAoUFRSQUNFX1RIUkVBRFVTRVIsIHBpZCwgKFBUUkFDRV9BUkczX1RZUEUpMCwKKwkJCQkwKTsKKyAgaWYgKGVycm5vKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJwdHJhY2UoUFRSQUNFX1RIUkVBRFVTRVIpIik7CisKKyAgZWNwID0gKENPUkVfQUREUikgcHRyYWNlIChQVFJBQ0VfUEVFS1RIUkVBRCwgcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSllY3BvZmYsCisJCQkgICAgMCk7CisgIGlmIChlcnJubykKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgicHRyYWNlKFBUUkFDRV9QRUVLVEhSRUFEKSIpOworCisgIHJldHVybiBlY3AgLSBzdGJsb2NrOworfQorCisvKiBGZXRjaCBvbmUgb3IgbW9yZSByZWdpc3RlcnMgZnJvbSB0aGUgaW5mZXJpb3IuICBSRUdOTyA9PSAtMSB0byBnZXQKKyAgIHRoZW0gYWxsLiAgV2UgYWN0dWFsbHkgZmV0Y2ggbW9yZSB0aGFuIHJlcXVlc3RlZCwgd2hlbiBjb252ZW5pZW50LAorICAgbWFya2luZyB0aGVtIGFzIHZhbGlkIHNvIHdlIHdvbid0IGZldGNoIHRoZW0gYWdhaW4uICAqLworCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGludCByZWdsbywgcmVnaGk7CisgIGludCBpOworICB1bnNpZ25lZCBsb25nIGVjcDsKKworICBpZiAocmVnbm8gPT0gLTEpCisgICAgeworICAgICAgcmVnbG8gPSAwOworICAgICAgcmVnaGkgPSBOVU1fUkVHUyAtIDE7CisgICAgfQorICBlbHNlCisgICAgcmVnbG8gPSByZWdoaSA9IHJlZ25vOworCisgIGVjcCA9IHJlZ2lzdGVyc19hZGRyIChpbmZlcmlvcl9waWQpOworCisgIGZvciAocmVnbm8gPSByZWdsbzsgcmVnbm8gPD0gcmVnaGk7IHJlZ25vKyspCisgICAgeworICAgICAgY2hhciBidWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKyAgICAgIGludCBwdHJhY2VfZnVuID0gUFRSQUNFX1BFRUtUSFJFQUQ7CisKKyNpZmRlZiBNNjhLCisgICAgICBwdHJhY2VfZnVuID0gcmVnbm8gPT0gU1BfUkVHTlVNID8gUFRSQUNFX1BFRUtVU1AgOiBQVFJBQ0VfUEVFS1RIUkVBRDsKKyNlbmRpZgorCisgICAgICBmb3IgKGkgPSAwOyBpIDwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ25vKTsgaSArPSBzaXplb2YgKGludCkpCisJeworCSAgdW5zaWduZWQgaW50IHJlZzsKKworCSAgZXJybm8gPSAwOworCSAgcmVnID0gcHRyYWNlIChwdHJhY2VfZnVuLCBpbmZlcmlvcl9waWQsCisJCQkoUFRSQUNFX0FSRzNfVFlQRSkgKGVjcCArIHJlZ21hcFtyZWdub10gKyBpKSwgMCk7CisJICBpZiAoZXJybm8pCisJICAgIHBlcnJvcl93aXRoX25hbWUgKCJwdHJhY2UoUFRSQUNFX1BFRUtVU1ApIik7CisgIAorCSAgKihpbnQgKikmYnVmW2ldID0gcmVnOworCX0KKyAgICAgIHN1cHBseV9yZWdpc3RlciAocmVnbm8sIGJ1Zik7CisgICAgfQorfQorCisvKiBTdG9yZSBvdXIgcmVnaXN0ZXIgdmFsdWVzIGJhY2sgaW50byB0aGUgaW5mZXJpb3IuCisgICBJZiBSRUdOTyBpcyAtMSwgZG8gdGhpcyBmb3IgYWxsIHJlZ2lzdGVycy4KKyAgIE90aGVyd2lzZSwgUkVHTk8gc3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVyIChzbyB3ZSBjYW4gc2F2ZSB0aW1lKS4gICovCisKKy8qIFJlZ2lzdGVycyB3ZSBzaG91bGRuJ3QgdHJ5IHRvIHN0b3JlLiAgKi8KKyNpZiAhZGVmaW5lZCAoQ0FOTk9UX1NUT1JFX1JFR0lTVEVSKQorI2RlZmluZSBDQU5OT1RfU1RPUkVfUkVHSVNURVIocmVnbm8pIDAKKyNlbmRpZgorCit2b2lkCitzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGludCByZWdsbywgcmVnaGk7CisgIGludCBpOworICB1bnNpZ25lZCBsb25nIGVjcDsKKworICBpZiAocmVnbm8gPT0gLTEpCisgICAgeworICAgICAgcmVnbG8gPSAwOworICAgICAgcmVnaGkgPSBOVU1fUkVHUyAtIDE7CisgICAgfQorICBlbHNlCisgICAgcmVnbG8gPSByZWdoaSA9IHJlZ25vOworCisgIGVjcCA9IHJlZ2lzdGVyc19hZGRyIChpbmZlcmlvcl9waWQpOworCisgIGZvciAocmVnbm8gPSByZWdsbzsgcmVnbm8gPD0gcmVnaGk7IHJlZ25vKyspCisgICAgeworICAgICAgaW50IHB0cmFjZV9mdW4gPSBQVFJBQ0VfUE9LRVVTRVI7CisKKyAgICAgIGlmIChDQU5OT1RfU1RPUkVfUkVHSVNURVIgKHJlZ25vKSkKKwljb250aW51ZTsKKworI2lmZGVmIE02OEsKKyAgICAgIHB0cmFjZV9mdW4gPSByZWdubyA9PSBTUF9SRUdOVU0gPyBQVFJBQ0VfUE9LRVVTUCA6IFBUUkFDRV9QT0tFVVNFUjsKKyNlbmRpZgorCisgICAgICBmb3IgKGkgPSAwOyBpIDwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ25vKTsgaSArPSBzaXplb2YgKGludCkpCisJeworCSAgdW5zaWduZWQgaW50IHJlZzsKKworCSAgcmVnID0gKih1bnNpZ25lZCBpbnQgKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ25vKSArIGldOworCisJICBlcnJubyA9IDA7CisJICBwdHJhY2UgKHB0cmFjZV9mdW4sIGluZmVyaW9yX3BpZCwKKwkJICAoUFRSQUNFX0FSRzNfVFlQRSkgKGVjcCArIHJlZ21hcFtyZWdub10gKyBpKSwgcmVnKTsKKwkgIGlmIChlcnJubykKKwkgICAgcGVycm9yX3dpdGhfbmFtZSAoInB0cmFjZShQVFJBQ0VfUE9LRVVTUCkiKTsKKwl9CisgICAgfQorfQorI2VuZGlmIC8qIGRlZmluZWQgKEkzODYpIHx8IGRlZmluZWQgKE02OEspIHx8IGRlZmluZWQgKHJzNjAwMCkgKi8KKworLyogV2FpdCBmb3IgY2hpbGQgdG8gZG8gc29tZXRoaW5nLiAgUmV0dXJuIHBpZCBvZiBjaGlsZCwgb3IgLTEgaW4gY2FzZQorICAgb2YgZXJyb3I7IHN0b3JlIHN0YXR1cyB0aHJvdWdoIGFyZ3VtZW50IHBvaW50ZXIgT1VSU1RBVFVTLiAgKi8KKworaW50CitjaGlsZF93YWl0IChwaWQsIG91cnN0YXR1cykKKyAgICAgaW50IHBpZDsKKyAgICAgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpvdXJzdGF0dXM7Cit7CisgIGludCBzYXZlX2Vycm5vOworICBpbnQgdGhyZWFkOworICB1bmlvbiB3YWl0IHN0YXR1czsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpbnQgc2lnOworCisgICAgICBzZXRfc2lnaW50X3RyYXAoKTsJLyogQ2F1c2VzIFNJR0lOVCB0byBiZSBwYXNzZWQgb24gdG8gdGhlCisJCQkJICAgYXR0YWNoZWQgcHJvY2Vzcy4gKi8KKyAgICAgIHBpZCA9IHdhaXQgKCZzdGF0dXMpOworCisgICAgICBzYXZlX2Vycm5vID0gZXJybm87CisKKyAgICAgIGNsZWFyX3NpZ2ludF90cmFwKCk7CisKKyAgICAgIGlmIChwaWQgPT0gLTEpCisJeworCSAgaWYgKHNhdmVfZXJybm8gPT0gRUlOVFIpCisJICAgIGNvbnRpbnVlOworCSAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiQ2hpbGQgcHJvY2VzcyB1bmV4cGVjdGVkbHkgbWlzc2luZzogJXMuXG4iLAorCQkgICBzYWZlX3N0cmVycm9yIChzYXZlX2Vycm5vKSk7CisJICAvKiBDbGFpbSBpdCBleGl0ZWQgd2l0aCB1bmtub3duIHNpZ25hbC4gICovCisJICBvdXJzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU0lHTkFMTEVEOworCSAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1VOS05PV047CisJICByZXR1cm4gLTE7CisJfQorCisgICAgICBpZiAocGlkICE9IFBJREdFVCAoaW5mZXJpb3JfcGlkKSkJLyogU29tZSBvdGhlciBwcm9jZXNzPyE/ICovCisJY29udGludWU7CisKKyAgICAgIHRocmVhZCA9IHN0YXR1cy53X3RpZDsJLyogR2V0IHRocmVhZCBpZCBmcm9tIHN0YXR1cyAqLworCisgICAgICAvKiBJbml0aWFsIHRocmVhZCB2YWx1ZSBjYW4gb25seSBiZSBhY3F1aXJlZCB2aWEgd2FpdCwgc28gd2UgaGF2ZSB0bworCSByZXNvcnQgdG8gdGhpcyBoYWNrLiAgKi8KKworICAgICAgaWYgKFRJREdFVCAoaW5mZXJpb3JfcGlkKSA9PSAwICYmIHRocmVhZCAhPSAwKQorCXsKKwkgIGluZmVyaW9yX3BpZCA9IEJVSUxEUElEIChpbmZlcmlvcl9waWQsIHRocmVhZCk7CisJICBhZGRfdGhyZWFkIChpbmZlcmlvcl9waWQpOworCX0KKworICAgICAgcGlkID0gQlVJTERQSUQgKHBpZCwgdGhyZWFkKTsKKworICAgICAgLyogV2UndmUgYmVjb21lIGEgc2luZ2xlIHRocmVhZGVkIHByb2Nlc3MgYWdhaW4uICAqLworICAgICAgaWYgKHRocmVhZCA9PSAwKQorCWluZmVyaW9yX3BpZCA9IHBpZDsKKworICAgICAgLyogQ2hlY2sgZm9yIHRocmVhZCBjcmVhdGlvbi4gICovCisgICAgICBpZiAoV0lGU1RPUFBFRChzdGF0dXMpCisJICAmJiBXU1RPUFNJRyhzdGF0dXMpID09IFNJR1RSQVAKKwkgICYmICFpbl90aHJlYWRfbGlzdCAocGlkKSkKKwl7CisJICBpbnQgcmVhbHNpZzsKKworCSAgcmVhbHNpZyA9IHB0cmFjZSAoUFRSQUNFX0dFVFRSQUNFU0lHLCBwaWQsIChQVFJBQ0VfQVJHM19UWVBFKTAsIDApOworCisJICBpZiAocmVhbHNpZyA9PSBTSUdORVdUSFJFQUQpCisJICAgIHsKKwkgICAgICAvKiBJdCdzIGEgbmV3IHRocmVhZCBub3RpZmljYXRpb24uICBXZSBkb24ndCB3YW50IHRvIG11Y2ggd2l0aAorCQkgcmVhbHNpZyAtLSB0aGUgY29kZSBpbiB3YWl0X2Zvcl9pbmZlcmlvciBleHBlY3RzIFNJR1RSQVAuICovCisJICAgICAgb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NQVVJJT1VTOworCSAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF8wOworCSAgICAgIHJldHVybiBwaWQ7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgZXJyb3IgKCJTaWduYWwgZm9yIHVua25vd24gdGhyZWFkIHdhcyBub3QgU0lHTkVXVEhSRUFEIik7CisJfQorCisgICAgICAvKiBDaGVjayBmb3IgdGhyZWFkIHRlcm1pbmF0aW9uLiAgKi8KKyAgICAgIGVsc2UgaWYgKFdJRlNUT1BQRUQoc3RhdHVzKQorCSAgICAgICAmJiBXU1RPUFNJRyhzdGF0dXMpID09IFNJR1RSQVAKKwkgICAgICAgJiYgaW5fdGhyZWFkX2xpc3QgKHBpZCkpCisJeworCSAgaW50IHJlYWxzaWc7CisKKwkgIHJlYWxzaWcgPSBwdHJhY2UgKFBUUkFDRV9HRVRUUkFDRVNJRywgcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkwLCAwKTsKKworCSAgaWYgKHJlYWxzaWcgPT0gU0lHVEhSRUFERVhJVCkKKwkgICAgeworCSAgICAgIHB0cmFjZSAoUFRSQUNFX0NPTlQsIFBJREdFVCAocGlkKSwgKFBUUkFDRV9BUkczX1RZUEUpMCwgMCk7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwl9CisKKyNpZmRlZiBTUEFSQworICAgICAgLyogU1BBUkMgTHlueCB1c2VzIGFuIGJ5dGUgcmV2ZXJzZWQgd2FpdCBzdGF0dXM7IHdlIG11c3QgdXNlIHRoZQorCSBob3N0IG1hY3JvcyB0byBhY2Nlc3MgaXQuICBUaGVzZSBsaW5lcyBqdXN0IGEgY29weSBvZgorCSBzdG9yZV93YWl0c3RhdHVzLiAgV2UgY2FuJ3QgdXNlIENISUxEX1NQRUNJQUxfV0FJVFNUQVRVUworCSBiZWNhdXNlIHRhcmdldC5jIGNhbid0IGluY2x1ZGUgdGhlIEx5bnggPHN5cy93YWl0Lmg+LiAgKi8KKyAgICAgIGlmIChXSUZFWElURUQgKHN0YXR1cykpCisJeworCSAgb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0VYSVRFRDsKKwkgIG91cnN0YXR1cy0+dmFsdWUuaW50ZWdlciA9IFdFWElUU1RBVFVTIChzdGF0dXMpOworCX0KKyAgICAgIGVsc2UgaWYgKCFXSUZTVE9QUEVEIChzdGF0dXMpKQorCXsKKwkgIG91cnN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TSUdOQUxMRUQ7CisJICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9CisJICAgIHRhcmdldF9zaWduYWxfZnJvbV9ob3N0IChXVEVSTVNJRyAoc3RhdHVzKSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG91cnN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOworCSAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPQorCSAgICB0YXJnZXRfc2lnbmFsX2Zyb21faG9zdCAoV1NUT1BTSUcgKHN0YXR1cykpOworCX0KKyNlbHNlCisgICAgICBzdG9yZV93YWl0c3RhdHVzIChvdXJzdGF0dXMsIHN0YXR1cy53X3N0YXR1cyk7CisjZW5kaWYKKworICAgICAgcmV0dXJuIHBpZDsKKyAgICB9Cit9CisKKy8qIFJldHVybiBub256ZXJvIGlmIHRoZSBnaXZlbiB0aHJlYWQgaXMgc3RpbGwgYWxpdmUuICAqLworaW50CitjaGlsZF90aHJlYWRfYWxpdmUgKHBpZCkKKyAgICAgaW50IHBpZDsKK3sKKyAgLyogQXJnZ2guICBBcHBhcmVudGx5IHB0aHJlYWRfa2lsbCBvbmx5IHdvcmtzIGZvciB0aHJlYWRzIHdpdGhpbgorICAgICB0aGUgcHJvY2VzcyB0aGF0IGNhbGxzIHB0aHJlYWRfa2lsbC4KKworICAgICBXZSB3YW50IHRvIGF2b2lkIHRoZSBseW54IHNpZ25hbCBleHRlbnNpb25zIGFzIHRoZXkgc2ltcGx5IGRvbid0CisgICAgIG1hcCB3ZWxsIHRvIHRoZSBnZW5lcmljIGdkYiBpbnRlcmZhY2Ugd2Ugd2FudCB0byBrZWVwLgorCisgICAgIEFsbCB3ZSB3YW50IHRvIGRvIGlzIGRldGVybWluZSBpZiBhIHBhcnRpY3VsYXIgdGhyZWFkIGlzIGFsaXZlOworICAgICBpdCBhcHBlYXJzIGFzIGlmIHdlIGNhbiBqdXN0IG1ha2UgYSBoYXJtbGVzcyB0aHJlYWQgc3BlY2lmaWMKKyAgICAgcHRyYWNlIGNhbGwgdG8gZG8gdGhhdC4gICovCisgIHJldHVybiAocHRyYWNlIChQVFJBQ0VfVEhSRUFEVVNFUiwgcGlkLCAwLCAwKSAhPSAtMSk7Cit9CisKKy8qIFJlc3VtZSBleGVjdXRpb24gb2YgdGhlIGluZmVyaW9yIHByb2Nlc3MuCisgICBJZiBTVEVQIGlzIG5vbnplcm8sIHNpbmdsZS1zdGVwIGl0LgorICAgSWYgU0lHTkFMIGlzIG5vbnplcm8sIGdpdmUgaXQgdGhhdCBzaWduYWwuICAqLworCit2b2lkCitjaGlsZF9yZXN1bWUgKHBpZCwgc3RlcCwgc2lnbmFsKQorICAgICBpbnQgcGlkOworICAgICBpbnQgc3RlcDsKKyAgICAgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ25hbDsKK3sKKyAgaW50IGZ1bmM7CisKKyAgZXJybm8gPSAwOworCisgIC8qIElmIHBpZCA9PSAtMSwgdGhlbiB3ZSB3YW50IHRvIHN0ZXAvY29udGludWUgYWxsIHRocmVhZHMsIGVsc2UKKyAgICAgd2Ugb25seSB3YW50IHRvIHN0ZXAvY29udGludWUgYSBzaW5nbGUgdGhyZWFkLiAgKi8KKyAgaWYgKHBpZCA9PSAtMSkKKyAgICB7CisgICAgICBwaWQgPSBpbmZlcmlvcl9waWQ7CisgICAgICBmdW5jID0gc3RlcCA/IFBUUkFDRV9TSU5HTEVTVEVQIDogUFRSQUNFX0NPTlQ7CisgICAgfQorICBlbHNlCisgICAgZnVuYyA9IHN0ZXAgPyBQVFJBQ0VfU0lOR0xFU1RFUF9PTkUgOiBQVFJBQ0VfQ09OVF9PTkU7CisKKworICAvKiBBbiBhZGRyZXNzIG9mIChQVFJBQ0VfQVJHM19UWVBFKTEgdGVsbHMgcHRyYWNlIHRvIGNvbnRpbnVlIGZyb20gd2hlcmUKKyAgICAgaXQgd2FzLiAgKElmIEdEQiB3YW50ZWQgaXQgdG8gc3RhcnQgc29tZSBvdGhlciB3YXksIHdlIGhhdmUgYWxyZWFkeQorICAgICB3cml0dGVuIGEgbmV3IFBDIHZhbHVlIHRvIHRoZSBjaGlsZC4pCisKKyAgICAgSWYgdGhpcyBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBQVF9TVEVQLCBhIGhpZ2hlciBsZXZlbCBmdW5jdGlvbiB3aWxsCisgICAgIGhhdmUgY2FsbGVkIHNpbmdsZV9zdGVwKCkgdG8gdHJhbnNtdXRlIHRoZSBzdGVwIHJlcXVlc3QgaW50byBhCisgICAgIGNvbnRpbnVlIHJlcXVlc3QgKGJ5IHNldHRpbmcgYnJlYWtwb2ludHMgb24gYWxsIHBvc3NpYmxlIHN1Y2Nlc3NvcgorICAgICBpbnN0cnVjdGlvbnMpLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoYXQgaGVyZS4gICovCisKKyAgcHRyYWNlIChmdW5jLCBwaWQsIChQVFJBQ0VfQVJHM19UWVBFKSAxLCB0YXJnZXRfc2lnbmFsX3RvX2hvc3QgKHNpZ25hbCkpOworCisgIGlmIChlcnJubykKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgicHRyYWNlIik7Cit9CisKKy8qIENvbnZlcnQgYSBMeW54IHByb2Nlc3MgSUQgdG8gYSBzdHJpbmcuICBSZXR1cm5zIHRoZSBzdHJpbmcgaW4gYSBzdGF0aWMKKyAgIGJ1ZmZlci4gICovCisKK2NoYXIgKgorbHlueF9waWRfdG9fc3RyIChwaWQpCisgICAgIGludCBwaWQ7Cit7CisgIHN0YXRpYyBjaGFyIGJ1Zls0MF07CisKKyAgc3ByaW50ZiAoYnVmLCAicHJvY2VzcyAlZCB0aHJlYWQgJWQiLCBQSURHRVQgKHBpZCksIFRJREdFVCAocGlkKSk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworLyogRXh0cmFjdCB0aGUgcmVnaXN0ZXIgdmFsdWVzIG91dCBvZiB0aGUgY29yZSBmaWxlIGFuZCBzdG9yZQorICAgdGhlbSB3aGVyZSBgcmVhZF9yZWdpc3Rlcicgd2lsbCBmaW5kIHRoZW0uCisKKyAgIENPUkVfUkVHX1NFQ1QgcG9pbnRzIHRvIHRoZSByZWdpc3RlciB2YWx1ZXMgdGhlbXNlbHZlcywgcmVhZCBpbnRvIG1lbW9yeS4KKyAgIENPUkVfUkVHX1NJWkUgaXMgdGhlIHNpemUgb2YgdGhhdCBhcmVhLgorICAgV0hJQ0ggc2F5cyB3aGljaCBzZXQgb2YgcmVnaXN0ZXJzIHdlIGFyZSBoYW5kbGluZyAoMCA9IGludCwgMiA9IGZsb2F0CisgICAgICAgICBvbiBtYWNoaW5lcyB3aGVyZSB0aGV5IGFyZSBkaXNjb250aWd1b3VzKS4KKyAgIFJFR19BRERSIGlzIHRoZSBvZmZzZXQgZnJvbSB1LnVfYXIwIHRvIHRoZSByZWdpc3RlciB2YWx1ZXMgcmVsYXRpdmUgdG8KKyAgICAgICAgICAgIGNvcmVfcmVnX3NlY3QuICBUaGlzIGlzIHVzZWQgd2l0aCBvbGQtZmFzaGlvbmVkIGNvcmUgZmlsZXMgdG8KKwkgICAgbG9jYXRlIHRoZSByZWdpc3RlcnMgaW4gYSBsYXJnZSB1cGFnZS1wbHVzLXN0YWNrICIucmVnIiBzZWN0aW9uLgorCSAgICBPcmlnaW5hbCB1cGFnZSBhZGRyZXNzIFggaXMgYXQgbG9jYXRpb24gY29yZV9yZWdfc2VjdCt4K3JlZ19hZGRyLgorICovCisKK3N0YXRpYyB2b2lkCitmZXRjaF9jb3JlX3JlZ2lzdGVycyAoY29yZV9yZWdfc2VjdCwgY29yZV9yZWdfc2l6ZSwgd2hpY2gsIHJlZ19hZGRyKQorICAgICBjaGFyICpjb3JlX3JlZ19zZWN0OworICAgICB1bnNpZ25lZCBjb3JlX3JlZ19zaXplOworICAgICBpbnQgd2hpY2g7CisgICAgIENPUkVfQUREUiByZWdfYWRkcjsKK3sKKyAgc3RydWN0IHN0X2VudHJ5IHM7CisgIHVuc2lnbmVkIGludCByZWdubzsKKworICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCBOVU1fUkVHUzsgcmVnbm8rKykKKyAgICBpZiAocmVnbWFwW3JlZ25vXSAhPSAtMSkKKyAgICAgIHN1cHBseV9yZWdpc3RlciAocmVnbm8sIGNvcmVfcmVnX3NlY3QgKyBvZmZzZXRvZiAoc3RfdCwgZWMpCisJCSAgICAgICArIHJlZ21hcFtyZWdub10pOworCisjaWZkZWYgU1BBUkMKKy8qIEZldGNoaW5nIHRoaXMgcmVnaXN0ZXIgY2F1c2VzIGFsbCBvZiB0aGUgSSAmIEwgcmVncyB0byBiZSByZWFkIGZyb20gdGhlCisgICBzdGFjayBhbmQgdmFsaWRhdGVkLiAgKi8KKworICBmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKEkwX1JFR05VTSk7CisjZW5kaWYKK30KKworDAorLyogUmVnaXN0ZXIgdGhhdCB3ZSBhcmUgYWJsZSB0byBoYW5kbGUgbHlueCBjb3JlIGZpbGUgZm9ybWF0cy4KKyAgIEZJWE1FOiBpcyB0aGlzIHJlYWxseSBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91cj8gKi8KKworc3RhdGljIHN0cnVjdCBjb3JlX2ZucyBseW54X2NvcmVfZm5zID0KK3sKKyAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCisgIGZldGNoX2NvcmVfcmVnaXN0ZXJzLAorICBOVUxMCit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9jb3JlX2x5bnggKCkKK3sKKyAgYWRkX2NvcmVfZm5zICgmbHlueF9jb3JlX2Zucyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvbTItZXhwLnkgYi9nZGIvbTItZXhwLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA3ZTViYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9tMi1leHAueQpAQCAtMCwwICsxLDEwOTQgQEAKKy8qIFlBQ0MgZ3JhbW1hciBmb3IgTW9kdWxhLTIgZXhwcmVzc2lvbnMsIGZvciBHREIuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgR2VuZXJhdGVkIGZyb20gZXhwcmVhZC55IChub3cgYy1leHAueSkgYW5kIGNvbnRyaWJ1dGVkIGJ5IHRoZSBEZXBhcnRtZW50CisgICBvZiBDb21wdXRlciBTY2llbmNlIGF0IHRoZSBTdGF0ZSBVbml2ZXJzaXR5IG9mIE5ldyBZb3JrIGF0IEJ1ZmZhbG8sIDE5OTEuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogUGFyc2UgYSBNb2R1bGEtMiBleHByZXNzaW9uIGZyb20gdGV4dCBpbiBhIHN0cmluZywKKyAgIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhICBzdHJ1Y3QgZXhwcmVzc2lvbiAgcG9pbnRlci4KKyAgIFRoYXQgc3RydWN0dXJlIGNvbnRhaW5zIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBpbiByZXZlcnNlIHBvbGlzaCwKKyAgIHdpdGggY29uc3RhbnRzIHJlcHJlc2VudGVkIGJ5IG9wZXJhdGlvbnMgdGhhdCBhcmUgZm9sbG93ZWQgYnkgc3BlY2lhbCBkYXRhLgorICAgU2VlIGV4cHJlc3Npb24uaCBmb3IgdGhlIGRldGFpbHMgb2YgdGhlIGZvcm1hdC4KKyAgIFdoYXQgaXMgaW1wb3J0YW50IGhlcmUgaXMgdGhhdCBpdCBjYW4gYmUgYnVpbHQgdXAgc2VxdWVudGlhbGx5CisgICBkdXJpbmcgdGhlIHByb2Nlc3Mgb2YgcGFyc2luZzsgdGhlIGxvd2VyIGxldmVscyBvZiB0aGUgdHJlZSBhbHdheXMKKyAgIGNvbWUgZmlyc3QgaW4gdGhlIHJlc3VsdC4KKworICAgTm90ZSB0aGF0IG1hbGxvYydzIGFuZCByZWFsbG9jJ3MgaW4gdGhpcyBmaWxlIGFyZSB0cmFuc2Zvcm1lZCB0bworICAgeG1hbGxvYyBhbmQgeHJlYWxsb2MgcmVzcGVjdGl2ZWx5IGJ5IHRoZSBzYW1lIHNlZCBjb21tYW5kIGluIHRoZQorICAgbWFrZWZpbGUgdGhhdCByZW1hcHMgYW55IG90aGVyIG1hbGxvYy9yZWFsbG9jIGluc2VydGVkIGJ5IHRoZSBwYXJzZXIKKyAgIGdlbmVyYXRvci4gIERvaW5nIHRoaXMgd2l0aCAjZGVmaW5lcyBhbmQgdHJ5aW5nIHRvIGNvbnRyb2wgdGhlIGludGVyYWN0aW9uCisgICB3aXRoIGluY2x1ZGUgZmlsZXMgKDxtYWxsb2MuaD4gYW5kIDxzdGRsaWIuaD4gZm9yIGV4YW1wbGUpIGp1c3QgYmVjYW1lCisgICB0b28gbWVzc3ksIHBhcnRpY3VsYXJseSB3aGVuIHN1Y2ggaW5jbHVkZXMgY2FuIGJlIGluc2VydGVkIGF0IHJhbmRvbQorICAgdGltZXMgYnkgdGhlIHBhcnNlciBnZW5lcmF0b3IuICovCisgICAKKyV7CisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAicGFyc2VyLWRlZnMuaCIKKyNpbmNsdWRlICJtMi1sYW5nLmgiCisjaW5jbHVkZSAiYmZkLmgiIC8qIFJlcXVpcmVkIGJ5IG9iamZpbGVzLmguICAqLworI2luY2x1ZGUgInN5bWZpbGUuaCIgLyogUmVxdWlyZWQgYnkgb2JqZmlsZXMuaC4gICovCisjaW5jbHVkZSAib2JqZmlsZXMuaCIgLyogRm9yIGhhdmVfZnVsbF9zeW1ib2xzIGFuZCBoYXZlX3BhcnRpYWxfc3ltYm9scyAqLworCisvKiBSZW1hcCBub3JtYWwgeWFjYyBwYXJzZXIgaW50ZXJmYWNlIG5hbWVzICh5eXBhcnNlLCB5eWxleCwgeXllcnJvciwgZXRjKSwKKyAgIGFzIHdlbGwgYXMgZ3JhdHVpdGlvdXNseSBnbG9iYWwgc3ltYm9sIG5hbWVzLCBzbyB3ZSBjYW4gaGF2ZSBtdWx0aXBsZQorICAgeWFjYyBnZW5lcmF0ZWQgcGFyc2VycyBpbiBnZGIuICBOb3RlIHRoYXQgdGhlc2UgYXJlIG9ubHkgdGhlIHZhcmlhYmxlcworICAgcHJvZHVjZWQgYnkgeWFjYy4gIElmIG90aGVyIHBhcnNlciBnZW5lcmF0b3JzIChiaXNvbiwgYnlhY2MsIGV0YykgcHJvZHVjZQorICAgYWRkaXRpb25hbCBnbG9iYWwgbmFtZXMgdGhhdCBjb25mbGljdCBhdCBsaW5rIHRpbWUsIHRoZW4gdGhvc2UgcGFyc2VyCisgICBnZW5lcmF0b3JzIG5lZWQgdG8gYmUgZml4ZWQgaW5zdGVhZCBvZiBhZGRpbmcgdGhvc2UgbmFtZXMgdG8gdGhpcyBsaXN0LiAqLworCisjZGVmaW5lCXl5bWF4ZGVwdGggbTJfbWF4ZGVwdGgKKyNkZWZpbmUJeXlwYXJzZQltMl9wYXJzZQorI2RlZmluZQl5eWxleAltMl9sZXgKKyNkZWZpbmUJeXllcnJvcgltMl9lcnJvcgorI2RlZmluZQl5eWx2YWwJbTJfbHZhbAorI2RlZmluZQl5eWNoYXIJbTJfY2hhcgorI2RlZmluZQl5eWRlYnVnCW0yX2RlYnVnCisjZGVmaW5lCXl5cGFjdAltMl9wYWN0CisjZGVmaW5lCXl5cjEJbTJfcjEKKyNkZWZpbmUJeXlyMgltMl9yMgorI2RlZmluZQl5eWRlZgltMl9kZWYKKyNkZWZpbmUJeXljaGsJbTJfY2hrCisjZGVmaW5lCXl5cGdvCW0yX3BnbworI2RlZmluZQl5eWFjdAltMl9hY3QKKyNkZWZpbmUJeXlleGNhCW0yX2V4Y2EKKyNkZWZpbmUJeXllcnJmbGFnIG0yX2VycmZsYWcKKyNkZWZpbmUJeXluZXJycwltMl9uZXJycworI2RlZmluZQl5eXBzCW0yX3BzCisjZGVmaW5lCXl5cHYJbTJfcHYKKyNkZWZpbmUJeXlzCW0yX3MKKyNkZWZpbmUJeXlfeXlzCW0yX3l5cworI2RlZmluZQl5eXN0YXRlCW0yX3N0YXRlCisjZGVmaW5lCXl5dG1wCW0yX3RtcAorI2RlZmluZQl5eXYJbTJfdgorI2RlZmluZQl5eV95eXYJbTJfeXl2CisjZGVmaW5lCXl5dmFsCW0yX3ZhbAorI2RlZmluZQl5eWxsb2MJbTJfbGxvYworI2RlZmluZQl5eXJlZHMJbTJfcmVkcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KKyNkZWZpbmUJeXl0b2tzCW0yX3Rva3MJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCisjZGVmaW5lIHl5bGhzCW0yX3l5bGhzCisjZGVmaW5lIHl5bGVuCW0yX3l5bGVuCisjZGVmaW5lIHl5ZGVmcmVkIG0yX3l5ZGVmcmVkCisjZGVmaW5lIHl5ZGdvdG8JbTJfeXlkZ290bworI2RlZmluZSB5eXNpbmRleCBtMl95eXNpbmRleAorI2RlZmluZSB5eXJpbmRleCBtMl95eXJpbmRleAorI2RlZmluZSB5eWdpbmRleCBtMl95eWdpbmRleAorI2RlZmluZSB5eXRhYmxlCSBtMl95eXRhYmxlCisjZGVmaW5lIHl5Y2hlY2sJIG0yX3l5Y2hlY2sKKworI2lmbmRlZiBZWURFQlVHCisjZGVmaW5lCVlZREVCVUcJMAkJLyogRGVmYXVsdCB0byBubyB5eWRlYnVnIHN1cHBvcnQgKi8KKyNlbmRpZgorCitpbnQKK3l5cGFyc2UgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgaW50Cit5eWxleCBQQVJBTVMgKCh2b2lkKSk7CisKK3ZvaWQKK3l5ZXJyb3IgUEFSQU1TICgoY2hhciAqKSk7CisKKyNpZiAwCitzdGF0aWMgY2hhciAqCittYWtlX3F1YWxuYW1lIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKSk7CisjZW5kaWYKKworc3RhdGljIGludAorcGFyc2VfbnVtYmVyIFBBUkFNUyAoKGludCkpOworCisvKiBUaGUgc2lnbiBvZiB0aGUgbnVtYmVyIGJlaW5nIHBhcnNlZC4gKi8KK3N0YXRpYyBpbnQgbnVtYmVyX3NpZ24gPSAxOworCisvKiBUaGUgYmxvY2sgdGhhdCB0aGUgbW9kdWxlIHNwZWNpZmllZCBieSB0aGUgcXVhbGlmZXIgb24gYW4gaWRlbnRpZmVyIGlzCisgICBjb250YWluZWQgaW4sICovCisjaWYgMAorc3RhdGljIHN0cnVjdCBibG9jayAqbW9kYmxvY2s9MDsKKyNlbmRpZgorCislfQorCisvKiBBbHRob3VnaCB0aGUgeWFjYyAidmFsdWUiIG9mIGFuIGV4cHJlc3Npb24gaXMgbm90IHVzZWQsCisgICBzaW5jZSB0aGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB0aGUgc3RydWN0dXJlIGJlaW5nIGNyZWF0ZWQsCisgICBvdGhlciBub2RlIHR5cGVzIGRvIGhhdmUgdmFsdWVzLiAgKi8KKworJXVuaW9uCisgIHsKKyAgICBMT05HRVNUIGx2YWw7CisgICAgVUxPTkdFU1QgdWx2YWw7CisgICAgRE9VQkxFU1QgZHZhbDsKKyAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgICAgc3RydWN0IHR5cGUgKnR2YWw7CisgICAgc3RydWN0IHN0b2tlbiBzdmFsOworICAgIGludCB2b2lkdmFsOworICAgIHN0cnVjdCBibG9jayAqYnZhbDsKKyAgICBlbnVtIGV4cF9vcGNvZGUgb3Bjb2RlOworICAgIHN0cnVjdCBpbnRlcm5hbHZhciAqaXZhcjsKKworICAgIHN0cnVjdCB0eXBlICoqdHZlYzsKKyAgICBpbnQgKml2ZWM7CisgIH0KKworJXR5cGUgPHZvaWR2YWw+IGV4cCB0eXBlX2V4cCBzdGFydCBzZXQKKyV0eXBlIDx2b2lkdmFsPiB2YXJpYWJsZQorJXR5cGUgPHR2YWw+IHR5cGUKKyV0eXBlIDxidmFsPiBibG9jayAKKyV0eXBlIDxzeW0+IGZibG9jayAKKworJXRva2VuIDxsdmFsPiBJTlQgSEVYIEVSUk9SCisldG9rZW4gPHVsdmFsPiBVSU5UIE0yX1RSVUUgTTJfRkFMU0UgQ0hBUgorJXRva2VuIDxkdmFsPiBGTE9BVAorCisvKiBCb3RoIE5BTUUgYW5kIFRZUEVOQU1FIHRva2VucyByZXByZXNlbnQgc3ltYm9scyBpbiB0aGUgaW5wdXQsCisgICBhbmQgYm90aCBjb252ZXkgdGhlaXIgZGF0YSBhcyBzdHJpbmdzLgorICAgQnV0IGEgVFlQRU5BTUUgaXMgYSBzdHJpbmcgdGhhdCBoYXBwZW5zIHRvIGJlIGRlZmluZWQgYXMgYSB0eXBlZGVmCisgICBvciBidWlsdGluIHR5cGUgbmFtZSAoc3VjaCBhcyBpbnQgb3IgY2hhcikKKyAgIGFuZCBhIE5BTUUgaXMgYW55IG90aGVyIHN5bWJvbC4KKworICAgQ29udGV4dHMgd2hlcmUgdGhpcyBkaXN0aW5jdGlvbiBpcyBub3QgaW1wb3J0YW50IGNhbiB1c2UgdGhlCisgICBub250ZXJtaW5hbCAibmFtZSIsIHdoaWNoIG1hdGNoZXMgZWl0aGVyIE5BTUUgb3IgVFlQRU5BTUUuICAqLworCisldG9rZW4gPHN2YWw+IFNUUklORworJXRva2VuIDxzdmFsPiBOQU1FIEJMT0NLTkFNRSBJREVOVCBWQVJOQU1FCisldG9rZW4gPHN2YWw+IFRZUEVOQU1FCisKKyV0b2tlbiBTSVpFIENBUCBPUkQgSElHSCBBQlMgTUlOX0ZVTkMgTUFYX0ZVTkMgRkxPQVRfRlVOQyBWQUwgQ0hSIE9ERCBUUlVOQworJXRva2VuIElOQyBERUMgSU5DTCBFWENMCisKKy8qIFRoZSBHREIgc2NvcGUgb3BlcmF0b3IgKi8KKyV0b2tlbiBDT0xPTkNPTE9OCisKKyV0b2tlbiA8dm9pZHZhbD4gSU5URVJOQUxfVkFSCisKKy8qIE0yIHRva2VucyAqLworJWxlZnQgJywnCislbGVmdCBBQk9WRV9DT01NQQorJW5vbmFzc29jIEFTU0lHTgorJWxlZnQgJzwnICc+JyBMRVEgR0VRICc9JyBOT1RFUVVBTCAnIycgSU4KKyVsZWZ0IE9ST1IKKyVsZWZ0IExPR0lDQUxfQU5EICcmJworJWxlZnQgJ0AnCislbGVmdCAnKycgJy0nCislbGVmdCAnKicgJy8nIERJViBNT0QKKyVyaWdodCBVTkFSWQorJXJpZ2h0ICdeJyBET1QgJ1snICcoJworJXJpZ2h0IE5PVCAnficKKyVsZWZ0IENPTE9OQ09MT04gUUlECisvKiBUaGlzIGlzIG5vdCBhbiBhY3R1YWwgdG9rZW4gOyBpdCBpcyB1c2VkIGZvciBwcmVjZWRlbmNlLiAKKyVyaWdodCBRSUQKKyovCisKKwwKKyUlCisKK3N0YXJ0ICAgOglleHAKKwl8CXR5cGVfZXhwCisJOworCit0eXBlX2V4cDoJdHlwZQorCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpOworCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSgkMSk7CisJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7CisJCX0KKwk7CisKKy8qIEV4cHJlc3Npb25zICovCisKK2V4cCAgICAgOiAgICAgICBleHAgJ14nICAgJXByZWMgVU5BUlkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfSU5EKTsgfQorCitleHAJOgknLScKKwkJCXsgbnVtYmVyX3NpZ24gPSAtMTsgfQorCQlleHAgICAgJXByZWMgVU5BUlkKKwkJCXsgbnVtYmVyX3NpZ24gPSAxOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9ORUcpOyB9CisJOworCitleHAJOgknKycgZXhwICAgICVwcmVjIFVOQVJZCisJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUoVU5PUF9QTFVTKTsgfQorCTsKKworZXhwCToJbm90X2V4cCBleHAgJXByZWMgVU5BUlkKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTE9HSUNBTF9OT1QpOyB9CisJOworCitub3RfZXhwCToJTk9UCisJfAknficKKwk7CisKK2V4cAk6CUNBUCAnKCcgZXhwICcpJworCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVApOyB9CisJOworCitleHAJOglPUkQgJygnIGV4cCAnKScKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfT1JEKTsgfQorCTsKKworZXhwCToJQUJTICcoJyBleHAgJyknCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0FCUyk7IH0KKwk7CisKK2V4cAk6IAlISUdIICcoJyBleHAgJyknCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0hJR0gpOyB9CisJOworCitleHAgCToJTUlOX0ZVTkMgJygnIHR5cGUgJyknCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX01JTik7CisJCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoJDMpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9NSU4pOyB9CisJOworCitleHAJOiAJTUFYX0ZVTkMgJygnIHR5cGUgJyknCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX01BWCk7CisJCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoJDMpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9NSU4pOyB9CisJOworCitleHAJOglGTE9BVF9GVU5DICcoJyBleHAgJyknCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0ZMT0FUKTsgfQorCTsKKworZXhwCToJVkFMICcoJyB0eXBlICcsJyBleHAgJyknCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9WQUwpOworCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKCQzKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1ZBTCk7IH0KKwk7CisKK2V4cAk6CUNIUiAnKCcgZXhwICcpJworCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DSFIpOyB9CisJOworCitleHAJOglPREQgJygnIGV4cCAnKScKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfT0REKTsgfQorCTsKKworZXhwCToJVFJVTkMgJygnIGV4cCAnKScKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfVFJVTkMpOyB9CisJOworCitleHAJOglTSVpFIGV4cCAgICAgICAlcHJlYyBVTkFSWQorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9TSVpFT0YpOyB9CisJOworCisKK2V4cAk6CUlOQyAnKCcgZXhwICcpJworCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZShVTk9QX1BSRUlOQ1JFTUVOVCk7IH0KKwk7CisKK2V4cAk6CUlOQyAnKCcgZXhwICcsJyBleHAgJyknCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlKEJJTk9QX0FTU0lHTl9NT0RJRlkpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZShCSU5PUF9BREQpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZShCSU5PUF9BU1NJR05fTU9ESUZZKTsgfQorCTsKKworZXhwCToJREVDICcoJyBleHAgJyknCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlKFVOT1BfUFJFREVDUkVNRU5UKTt9CisJOworCitleHAJOglERUMgJygnIGV4cCAnLCcgZXhwICcpJworCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZShCSU5PUF9BU1NJR05fTU9ESUZZKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoQklOT1BfU1VCKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoQklOT1BfQVNTSUdOX01PRElGWSk7IH0KKwk7CisKK2V4cAk6CWV4cCBET1QgTkFNRQorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfU1RSVUNUKTsKKwkJCSAgd3JpdGVfZXhwX3N0cmluZyAoJDMpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfU1RSVUNUKTsgfQorCTsKKworZXhwCToJc2V0CisJOworCitleHAJOglleHAgSU4gc2V0CisJCQl7IGVycm9yKCJTZXRzIGFyZSBub3QgaW1wbGVtZW50ZWQuIik7fQorCTsKKworZXhwCToJSU5DTCAnKCcgZXhwICcsJyBleHAgJyknCisJCQl7IGVycm9yKCJTZXRzIGFyZSBub3QgaW1wbGVtZW50ZWQuIik7fQorCTsKKworZXhwCToJRVhDTCAnKCcgZXhwICcsJyBleHAgJyknCisJCQl7IGVycm9yKCJTZXRzIGFyZSBub3QgaW1wbGVtZW50ZWQuIik7fQorCitzZXQJOgkneycgYXJnbGlzdCAnfScKKwkJCXsgZXJyb3IoIlNldHMgYXJlIG5vdCBpbXBsZW1lbnRlZC4iKTt9CisJfAl0eXBlICd7JyBhcmdsaXN0ICd9JworCQkJeyBlcnJvcigiU2V0cyBhcmUgbm90IGltcGxlbWVudGVkLiIpO30KKwk7CisKKworLyogTW9kdWxhLTIgYXJyYXkgc3Vic2NyaXB0IG5vdGF0aW9uIFthLGIsYy4uLl0gKi8KK2V4cCAgICAgOiAgICAgICBleHAgJ1snCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGZ1bmN0aW9uIGp1c3Qgc2F2ZXMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMKKwkJCSAgIHRoYXQgZm9sbG93IGluIHRoZSBsaXN0LiAgSXQgaXMgKm5vdCogc3BlY2lmaWMgdG8KKwkJCSAgIGZ1bmN0aW9uIHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICB7IHN0YXJ0X2FyZ2xpc3QoKTsgfQorICAgICAgICAgICAgICAgIG5vbl9lbXB0eV9hcmdsaXN0ICddJyAgJXByZWMgRE9UCisgICAgICAgICAgICAgICAgICAgICAgICB7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChNVUxUSV9TVUJTQ1JJUFQpOworCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSBlbmRfYXJnbGlzdCgpKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE1VTFRJX1NVQlNDUklQVCk7IH0KKyAgICAgICAgOworCitleHAJOglleHAgJygnCisJCQkvKiBUaGlzIGlzIHRvIHNhdmUgdGhlIHZhbHVlIG9mIGFyZ2xpc3RfbGVuCisJCQkgICBiZWluZyBhY2N1bXVsYXRlZCBieSBhbiBvdXRlciBmdW5jdGlvbiBjYWxsLiAgKi8KKwkJCXsgc3RhcnRfYXJnbGlzdCAoKTsgfQorCQlhcmdsaXN0ICcpJwklcHJlYyBET1QKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0ZVTkNBTEwpOworCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSBlbmRfYXJnbGlzdCAoKSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9GVU5DQUxMKTsgfQorCTsKKworYXJnbGlzdAk6CisJOworCithcmdsaXN0CToJZXhwCisJCQl7IGFyZ2xpc3RfbGVuID0gMTsgfQorCTsKKworYXJnbGlzdAk6CWFyZ2xpc3QgJywnIGV4cCAgICVwcmVjIEFCT1ZFX0NPTU1BCisJCQl7IGFyZ2xpc3RfbGVuKys7IH0KKwk7CisKK25vbl9lbXB0eV9hcmdsaXN0CisgICAgICAgIDogICAgICAgZXhwCisgICAgICAgICAgICAgICAgICAgICAgICB7IGFyZ2xpc3RfbGVuID0gMTsgfQorCTsKKworbm9uX2VtcHR5X2FyZ2xpc3QKKyAgICAgICAgOiAgICAgICBub25fZW1wdHlfYXJnbGlzdCAnLCcgZXhwICVwcmVjIEFCT1ZFX0NPTU1BCisgICAgIAkgICAgICAgCSAgICAJeyBhcmdsaXN0X2xlbisrOyB9CisgICAgIAk7CisKKy8qIEdEQiBjb25zdHJ1Y3QgKi8KK2V4cAk6CSd7JyB0eXBlICd9JyBleHAgICVwcmVjIFVOQVJZCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX01FTVZBTCk7CisJCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoJDIpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9NRU1WQUwpOyB9CisJOworCitleHAgICAgIDogICAgICAgdHlwZSAnKCcgZXhwICcpJyAlcHJlYyBVTkFSWQorICAgICAgICAgICAgICAgICAgICAgICAgeyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICgkMSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOyB9CisJOworCitleHAJOgknKCcgZXhwICcpJworCQkJeyB9CisJOworCisvKiBCaW5hcnkgb3BlcmF0b3JzIGluIG9yZGVyIG9mIGRlY3JlYXNpbmcgcHJlY2VkZW5jZS4gIE5vdGUgdGhhdCBzb21lCisgICBvZiB0aGVzZSBvcGVyYXRvcnMgYXJlIG92ZXJsb2FkZWQhICAoaWUuIHNldHMpICovCisKKy8qIEdEQiBjb25zdHJ1Y3QgKi8KK2V4cAk6CWV4cCAnQCcgZXhwCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9SRVBFQVQpOyB9CisJOworCitleHAJOglleHAgJyonIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTVVMKTsgfQorCTsKKworZXhwCToJZXhwICcvJyBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0RJVik7IH0KKwk7CisKK2V4cCAgICAgOiAgICAgICBleHAgRElWIGV4cAorICAgICAgICAgICAgICAgICAgICAgICAgeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfSU5URElWKTsgfQorICAgICAgICA7CisKK2V4cAk6CWV4cCBNT0QgZXhwCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9SRU0pOyB9CisJOworCitleHAJOglleHAgJysnIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQUREKTsgfQorCTsKKworZXhwCToJZXhwICctJyBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1NVQik7IH0KKwk7CisKK2V4cAk6CWV4cCAnPScgZXhwCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9FUVVBTCk7IH0KKwk7CisKK2V4cAk6CWV4cCBOT1RFUVVBTCBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX05PVEVRVUFMKTsgfQorICAgICAgICB8ICAgICAgIGV4cCAnIycgZXhwCisgICAgICAgICAgICAgICAgICAgICAgICB7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9OT1RFUVVBTCk7IH0KKwk7CisKK2V4cAk6CWV4cCBMRVEgZXhwCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MRVEpOyB9CisJOworCitleHAJOglleHAgR0VRIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfR0VRKTsgfQorCTsKKworZXhwCToJZXhwICc8JyBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xFU1MpOyB9CisJOworCitleHAJOglleHAgJz4nIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfR1RSKTsgfQorCTsKKworZXhwCToJZXhwIExPR0lDQUxfQU5EIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTE9HSUNBTF9BTkQpOyB9CisJOworCitleHAJOglleHAgT1JPUiBleHAKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xPR0lDQUxfT1IpOyB9CisJOworCitleHAJOglleHAgQVNTSUdOIGV4cAorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQVNTSUdOKTsgfQorCTsKKworCisvKiBDb25zdGFudHMgKi8KKworZXhwCToJTTJfVFJVRQorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQk9PTCk7CisJCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpICQxKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0JPT0wpOyB9CisJOworCitleHAJOglNMl9GQUxTRQorCQkJeyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQk9PTCk7CisJCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpICQxKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0JPT0wpOyB9CisJOworCitleHAJOglJTlQKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOworCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9tMl9pbnQpOworCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSAkMSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsgfQorCTsKKworZXhwCToJVUlOVAorCQkJeworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7CisJCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX20yX2NhcmQpOworCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSAkMSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKKwkJCX0KKwk7CisKK2V4cAk6CUNIQVIKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOworCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9tMl9jaGFyKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgJDEpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IH0KKwk7CisKKworZXhwCToJRkxPQVQKKwkJCXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0RPVUJMRSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX20yX3JlYWwpOworCQkJICB3cml0ZV9leHBfZWx0X2RibGNzdCAoJDEpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRE9VQkxFKTsgfQorCTsKKworZXhwCToJdmFyaWFibGUKKwk7CisKK2V4cAk6CVNJWkUgJygnIHR5cGUgJyknCSVwcmVjIFVOQVJZCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF90eXBlIChidWlsdGluX3R5cGVfaW50KTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgVFlQRV9MRU5HVEggKCQzKSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsgfQorCTsKKworZXhwCToJU1RSSU5HCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9NMl9TVFJJTkcpOworCQkJICB3cml0ZV9leHBfc3RyaW5nICgkMSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9NMl9TVFJJTkcpOyB9CisJOworCisvKiBUaGlzIHdpbGwgYmUgdXNlZCBmb3IgZXh0ZW5zaW9ucyBsYXRlci4gIExpa2UgYWRkaW5nIG1vZHVsZXMuICovCitibG9jawk6CWZibG9jawkKKwkJCXsgJCQgPSBTWU1CT0xfQkxPQ0tfVkFMVUUoJDEpOyB9CisJOworCitmYmxvY2sJOglCTE9DS05BTUUKKwkJCXsgc3RydWN0IHN5bWJvbCAqc3ltCisJCQkgICAgPSBsb29rdXBfc3ltYm9sIChjb3B5X25hbWUgKCQxKSwgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrLAorCQkJCQkgICAgIFZBUl9OQU1FU1BBQ0UsIDAsIE5VTEwpOworCQkJICAkJCA9IHN5bTt9CisJOworCQkJICAgICAKKworLyogR0RCIHNjb3BlIG9wZXJhdG9yICovCitmYmxvY2sJOglibG9jayBDT0xPTkNPTE9OIEJMT0NLTkFNRQorCQkJeyBzdHJ1Y3Qgc3ltYm9sICp0ZW0KKwkJCSAgICA9IGxvb2t1cF9zeW1ib2wgKGNvcHlfbmFtZSAoJDMpLCAkMSwKKwkJCQkJICAgICBWQVJfTkFNRVNQQUNFLCAwLCBOVUxMKTsKKwkJCSAgaWYgKCF0ZW0gfHwgU1lNQk9MX0NMQVNTICh0ZW0pICE9IExPQ19CTE9DSykKKwkJCSAgICBlcnJvciAoIk5vIGZ1bmN0aW9uIFwiJXNcIiBpbiBzcGVjaWZpZWQgY29udGV4dC4iLAorCQkJCSAgIGNvcHlfbmFtZSAoJDMpKTsKKwkJCSAgJCQgPSB0ZW07CisJCQl9CisJOworCisvKiBVc2VmdWwgZm9yIGFzc2lnbmluZyB0byBQUk9DRURVUkUgdmFyaWFibGVzICovCit2YXJpYWJsZToJZmJsb2NrCisJCQl7IHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1ZBUl9WQUxVRSk7CisJCQkgIHdyaXRlX2V4cF9lbHRfYmxvY2sgKE5VTEwpOworCQkJICB3cml0ZV9leHBfZWx0X3N5bSAoJDEpOworCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsgfQorCTsKKworLyogR0RCIGludGVybmFsICgkZm9vKSB2YXJpYWJsZSAqLwordmFyaWFibGU6CUlOVEVSTkFMX1ZBUgorCTsKKworLyogR0RCIHNjb3BlIG9wZXJhdG9yICovCit2YXJpYWJsZToJYmxvY2sgQ09MT05DT0xPTiBOQU1FCisJCQl7IHN0cnVjdCBzeW1ib2wgKnN5bTsKKwkJCSAgc3ltID0gbG9va3VwX3N5bWJvbCAoY29weV9uYW1lICgkMyksICQxLAorCQkJCQkgICAgICAgVkFSX05BTUVTUEFDRSwgMCwgTlVMTCk7CisJCQkgIGlmIChzeW0gPT0gMCkKKwkJCSAgICBlcnJvciAoIk5vIHN5bWJvbCBcIiVzXCIgaW4gc3BlY2lmaWVkIGNvbnRleHQuIiwKKwkJCQkgICBjb3B5X25hbWUgKCQzKSk7CisKKwkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7CisJCQkgIC8qIGJsb2NrX2ZvdW5kIGlzIHNldCBieSBsb29rdXBfc3ltYm9sLiAgKi8KKwkJCSAgd3JpdGVfZXhwX2VsdF9ibG9jayAoYmxvY2tfZm91bmQpOworCQkJICB3cml0ZV9leHBfZWx0X3N5bSAoc3ltKTsKKwkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7IH0KKwk7CisKKy8qIEJhc2UgY2FzZSBmb3IgdmFyaWFibGVzLiAqLwordmFyaWFibGU6CU5BTUUKKwkJCXsgc3RydWN0IHN5bWJvbCAqc3ltOworCQkJICBpbnQgaXNfYV9maWVsZF9vZl90aGlzOworCisgCQkJICBzeW0gPSBsb29rdXBfc3ltYm9sIChjb3B5X25hbWUgKCQxKSwKKwkJCQkJICAgICAgIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywKKwkJCQkJICAgICAgIFZBUl9OQU1FU1BBQ0UsCisJCQkJCSAgICAgICAmaXNfYV9maWVsZF9vZl90aGlzLAorCQkJCQkgICAgICAgTlVMTCk7CisJCQkgIGlmIChzeW0pCisJCQkgICAgeworCQkJICAgICAgaWYgKHN5bWJvbF9yZWFkX25lZWRzX2ZyYW1lIChzeW0pKQorCQkJCXsKKwkJCQkgIGlmIChpbm5lcm1vc3RfYmxvY2sgPT0gMCB8fAorCQkJCSAgICAgIGNvbnRhaW5lZF9pbiAoYmxvY2tfZm91bmQsIAorCQkJCQkJICAgIGlubmVybW9zdF9ibG9jaykpCisJCQkJICAgIGlubmVybW9zdF9ibG9jayA9IGJsb2NrX2ZvdW5kOworCQkJCX0KKworCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7CisJCQkgICAgICAvKiBXZSB3YW50IHRvIHVzZSB0aGUgc2VsZWN0ZWQgZnJhbWUsIG5vdAorCQkJCSBhbm90aGVyIG1vcmUgaW5uZXIgZnJhbWUgd2hpY2ggaGFwcGVucyB0bworCQkJCSBiZSBpbiB0aGUgc2FtZSBibG9jay4gICovCisJCQkgICAgICB3cml0ZV9leHBfZWx0X2Jsb2NrIChOVUxMKTsKKwkJCSAgICAgIHdyaXRlX2V4cF9lbHRfc3ltIChzeW0pOworCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7CisJCQkgICAgfQorCQkJICBlbHNlCisJCQkgICAgeworCQkJICAgICAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sOworCQkJICAgICAgcmVnaXN0ZXIgY2hhciAqYXJnID0gY29weV9uYW1lICgkMSk7CisKKwkJCSAgICAgIG1zeW1ib2wgPQorCQkJCWxvb2t1cF9taW5pbWFsX3N5bWJvbCAoYXJnLCBOVUxMLCBOVUxMKTsKKwkJCSAgICAgIGlmIChtc3ltYm9sICE9IE5VTEwpCisJCQkJeworCQkJCSAgd3JpdGVfZXhwX21zeW1ib2wKKwkJCQkgICAgKG1zeW1ib2wsCisJCQkJICAgICBsb29rdXBfZnVuY3Rpb25fdHlwZSAoYnVpbHRpbl90eXBlX2ludCksCisJCQkJICAgICBidWlsdGluX3R5cGVfaW50KTsKKwkJCQl9CisJCQkgICAgICBlbHNlIGlmICghaGF2ZV9mdWxsX3N5bWJvbHMgKCkgJiYgIWhhdmVfcGFydGlhbF9zeW1ib2xzICgpKQorCQkJCWVycm9yICgiTm8gc3ltYm9sIHRhYmxlIGlzIGxvYWRlZC4gIFVzZSB0aGUgXCJzeW1ib2wtZmlsZVwiIGNvbW1hbmQuIik7CisJCQkgICAgICBlbHNlCisJCQkJZXJyb3IgKCJObyBzeW1ib2wgXCIlc1wiIGluIGN1cnJlbnQgY29udGV4dC4iLAorCQkJCSAgICAgICBjb3B5X25hbWUgKCQxKSk7CisJCQkgICAgfQorCQkJfQorCTsKKwordHlwZQorCToJVFlQRU5BTUUKKwkJCXsgJCQgPSBsb29rdXBfdHlwZW5hbWUgKGNvcHlfbmFtZSAoJDEpLAorCQkJCQkJZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrLCAwKTsgfQorCisJOworCislJQorCisjaWYgMCAgLyogRklYTUUhICovCitpbnQKK292ZXJmbG93KGEsYikKKyAgIGxvbmcgYSxiOworeworICAgcmV0dXJuIChNQVhfT0ZfVFlQRShidWlsdGluX3R5cGVfbTJfaW50KSAtIGIpIDwgYTsKK30KKworaW50Cit1b3ZlcmZsb3coYSxiKQorICAgdW5zaWduZWQgbG9uZyBhLGI7Cit7CisgICByZXR1cm4gKE1BWF9PRl9UWVBFKGJ1aWx0aW5fdHlwZV9tMl9jYXJkKSAtIGIpIDwgYTsKK30KKyNlbmRpZiAvKiBGSVhNRSAqLworCisvKiBUYWtlIGNhcmUgb2YgcGFyc2luZyBhIG51bWJlciAoYW55dGhpbmcgdGhhdCBzdGFydHMgd2l0aCBhIGRpZ2l0KS4KKyAgIFNldCB5eWx2YWwgYW5kIHJldHVybiB0aGUgdG9rZW4gdHlwZTsgdXBkYXRlIGxleHB0ci4KKyAgIExFTiBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gaXQuICAqLworCisvKioqIE5lZWRzIHNvbWUgZXJyb3IgY2hlY2tpbmcgZm9yIHRoZSBmbG9hdCBjYXNlICoqKi8KKworc3RhdGljIGludAorcGFyc2VfbnVtYmVyIChvbGVuKQorICAgICBpbnQgb2xlbjsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqcCA9IGxleHB0cjsKKyAgcmVnaXN0ZXIgTE9OR0VTVCBuID0gMDsKKyAgcmVnaXN0ZXIgTE9OR0VTVCBwcmV2biA9IDA7CisgIHJlZ2lzdGVyIGludCBjLGksaXNjaGFyPTA7CisgIHJlZ2lzdGVyIGludCBiYXNlID0gaW5wdXRfcmFkaXg7CisgIHJlZ2lzdGVyIGludCBsZW4gPSBvbGVuOworICBpbnQgdW5zaWduZWRfcCA9IG51bWJlcl9zaWduID09IDEgPyAxIDogMDsKKworICBpZihwW2xlbi0xXSA9PSAnSCcpCisgIHsKKyAgICAgYmFzZSA9IDE2OworICAgICBsZW4tLTsKKyAgfQorICBlbHNlIGlmKHBbbGVuLTFdID09ICdDJyB8fCBwW2xlbi0xXSA9PSAnQicpCisgIHsKKyAgICAgYmFzZSA9IDg7CisgICAgIGlzY2hhciA9IHBbbGVuLTFdID09ICdDJzsKKyAgICAgbGVuLS07CisgIH0KKworICAvKiBTY2FuIHRoZSBudW1iZXIgKi8KKyAgZm9yIChjID0gMDsgYyA8IGxlbjsgYysrKQorICB7CisgICAgaWYgKHBbY10gPT0gJy4nICYmIGJhc2UgPT0gMTApCisgICAgICB7CisJLyogSXQncyBhIGZsb2F0IHNpbmNlIGl0IGNvbnRhaW5zIGEgcG9pbnQuICAqLworCXl5bHZhbC5kdmFsID0gYXRvZiAocCk7CisJbGV4cHRyICs9IGxlbjsKKwlyZXR1cm4gRkxPQVQ7CisgICAgICB9CisgICAgaWYgKHBbY10gPT0gJy4nICYmIGJhc2UgIT0gMTApCisgICAgICAgZXJyb3IoIkZsb2F0aW5nIHBvaW50IG51bWJlcnMgbXVzdCBiZSBiYXNlIDEwLiIpOworICAgIGlmIChiYXNlID09IDEwICYmIChwW2NdIDwgJzAnIHx8IHBbY10gPiAnOScpKQorICAgICAgIGVycm9yKCJJbnZhbGlkIGRpZ2l0IFwnJWNcJyBpbiBudW1iZXIuIixwW2NdKTsKKyB9CisKKyAgd2hpbGUgKGxlbi0tID4gMCkKKyAgICB7CisgICAgICBjID0gKnArKzsKKyAgICAgIG4gKj0gYmFzZTsKKyAgICAgIGlmKCBiYXNlID09IDggJiYgKGMgPT0gJzgnIHx8IGMgPT0gJzknKSkKKwkgZXJyb3IoIkludmFsaWQgZGlnaXQgXCclY1wnIGluIG9jdGFsIG51bWJlci4iLGMpOworICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCWkgPSBjIC0gJzAnOworICAgICAgZWxzZQorCXsKKwkgIGlmIChiYXNlID09IDE2ICYmIGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorCSAgICBpID0gYyAtICdBJyArIDEwOworCSAgZWxzZQorCSAgICAgcmV0dXJuIEVSUk9SOworCX0KKyAgICAgIG4rPWk7CisgICAgICBpZihpID49IGJhc2UpCisJIHJldHVybiBFUlJPUjsKKyAgICAgIGlmKCF1bnNpZ25lZF9wICYmIG51bWJlcl9zaWduID09IDEgJiYgKHByZXZuID49IG4pKQorCSB1bnNpZ25lZF9wPTE7CQkvKiBUcnkgc29tZXRoaW5nIHVuc2lnbmVkICovCisgICAgICAvKiBEb24ndCBkbyB0aGUgcmFuZ2UgY2hlY2sgaWYgbj09aSBhbmQgaT09MCwgc2luY2UgdGhhdCBzcGVjaWFsCisJIGNhc2Ugd2lsbCBnaXZlIGFuIG92ZXJmbG93IGVycm9yLiAqLworICAgICAgaWYoUkFOR0VfQ0hFQ0sgJiYgbiE9aSAmJiBpKQorICAgICAgeworCSBpZigodW5zaWduZWRfcCAmJiAodW5zaWduZWQpcHJldm4gPj0gKHVuc2lnbmVkKW4pIHx8CisJICAgICgoIXVuc2lnbmVkX3AgJiYgbnVtYmVyX3NpZ249PS0xKSAmJiAtcHJldm4gPD0gLW4pKQorCSAgICByYW5nZV9lcnJvcigiT3ZlcmZsb3cgb24gbnVtZXJpYyBjb25zdGFudC4iKTsKKyAgICAgIH0KKwkgcHJldm49bjsKKyAgICB9CisKKyAgbGV4cHRyID0gcDsKKyAgaWYoKnAgPT0gJ0InIHx8ICpwID09ICdDJyB8fCAqcCA9PSAnSCcpCisgICAgIGxleHB0cisrOwkJCS8qIEFkdmFuY2UgcGFzdCBCLEMgb3IgSCAqLworCisgIGlmIChpc2NoYXIpCisgIHsKKyAgICAgeXlsdmFsLnVsdmFsID0gbjsKKyAgICAgcmV0dXJuIENIQVI7CisgIH0KKyAgZWxzZSBpZiAoIHVuc2lnbmVkX3AgJiYgbnVtYmVyX3NpZ24gPT0gMSkKKyAgeworICAgICB5eWx2YWwudWx2YWwgPSBuOworICAgICByZXR1cm4gVUlOVDsKKyAgfQorICBlbHNlIGlmKCh1bnNpZ25lZF9wICYmIChuPDApKSkgeworICAgICByYW5nZV9lcnJvcigiT3ZlcmZsb3cgb24gbnVtZXJpYyBjb25zdGFudCAtLSBudW1iZXIgdG9vIGxhcmdlLiIpOworICAgICAvKiBCdXQsIHRoaXMgY2FuIHJldHVybiBpZiByYW5nZV9jaGVjayA9PSByYW5nZV93YXJuLiAgKi8KKyAgfQorICB5eWx2YWwubHZhbCA9IG47CisgIHJldHVybiBJTlQ7Cit9CisKKworLyogU29tZSB0b2tlbnMgKi8KKworc3RhdGljIHN0cnVjdAoreworICAgY2hhciBuYW1lWzJdOworICAgaW50IHRva2VuOworfSB0b2tlbnRhYjJbXSA9Cit7CisgICAgeyB7JzwnLCAnPid9LCAgICBOT1RFUVVBTCAJfSwKKyAgICB7IHsnOicsICc9J30sICAgIEFTU0lHTgl9LAorICAgIHsgeyc8JywgJz0nfSwgICAgTEVRCX0sCisgICAgeyB7Jz4nLCAnPSd9LCAgICBHRVEJfSwKKyAgICB7IHsnOicsICc6J30sICAgIENPTE9OQ09MT04gfSwKKworfTsKKworLyogU29tZSBzcGVjaWZpYyBrZXl3b3JkcyAqLworCitzdHJ1Y3Qga2V5d29yZCB7CisgICBjaGFyIGtleXdbMTBdOworICAgaW50IHRva2VuOworfTsKKworc3RhdGljIHN0cnVjdCBrZXl3b3JkIGtleXRhYltdID0KK3sKKyAgICB7Ik9SIiAsICAgT1JPUgkgfSwKKyAgICB7IklOIiwgICAgSU4gICAgICAgICB9LC8qIE5vdGUgc3BhY2UgYWZ0ZXIgSU4gKi8KKyAgICB7IkFORCIsICAgTE9HSUNBTF9BTkR9LAorICAgIHsiQUJTIiwgICBBQlMJIH0sCisgICAgeyJDSFIiLCAgIENIUgkgfSwKKyAgICB7IkRFQyIsICAgREVDCSB9LAorICAgIHsiTk9UIiwgICBOT1QJIH0sCisgICAgeyJESVYiLCAgIERJViAgICAJIH0sCisgICAgeyJJTkMiLCAgIElOQwkgfSwKKyAgICB7Ik1BWCIsICAgTUFYX0ZVTkMJIH0sCisgICAgeyJNSU4iLCAgIE1JTl9GVU5DCSB9LAorICAgIHsiTU9EIiwgICBNT0QJIH0sCisgICAgeyJPREQiLCAgIE9ERAkgfSwKKyAgICB7IkNBUCIsICAgQ0FQCSB9LAorICAgIHsiT1JEIiwgICBPUkQJIH0sCisgICAgeyJWQUwiLCAgIFZBTAkgfSwKKyAgICB7IkVYQ0wiLCAgRVhDTAkgfSwKKyAgICB7IkhJR0giLCAgSElHSCAgICAgICB9LAorICAgIHsiSU5DTCIsICBJTkNMCSB9LAorICAgIHsiU0laRSIsICBTSVpFICAgICAgIH0sCisgICAgeyJGTE9BVCIsIEZMT0FUX0ZVTkMgfSwKKyAgICB7IlRSVU5DIiwgVFJVTkMJIH0sCit9OworCisKKy8qIFJlYWQgb25lIHRva2VuLCBnZXR0aW5nIGNoYXJhY3RlcnMgdGhyb3VnaCBsZXhwdHIuICAqLworCisvKiBUaGlzIGlzIHdoZXJlIHdlIHdpbGwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxhbmd1YWdlIGFuZCB0aGUgb3BlcmF0b3JzIHVzZWQgYXJlCisgICBjb21wYXRpYmxlICAqLworCitzdGF0aWMgaW50Cit5eWxleCAoKQoreworICByZWdpc3RlciBpbnQgYzsKKyAgcmVnaXN0ZXIgaW50IG5hbWVsZW47CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBjaGFyICp0b2tzdGFydDsKKyAgcmVnaXN0ZXIgY2hhciBxdW90ZTsKKworIHJldHJ5OgorCisgIHRva3N0YXJ0ID0gbGV4cHRyOworCisKKyAgLyogU2VlIGlmIGl0IGlzIGEgc3BlY2lhbCB0b2tlbiBvZiBsZW5ndGggMiAqLworICBmb3IoIGkgPSAwIDsgaSA8IChpbnQpIChzaXplb2YgdG9rZW50YWIyIC8gc2l6ZW9mIHRva2VudGFiMlswXSkgOyBpKyspCisgICAgIGlmKFNUUkVRTih0b2tlbnRhYjJbaV0ubmFtZSwgdG9rc3RhcnQsIDIpKQorICAgICB7CisJbGV4cHRyICs9IDI7CisJcmV0dXJuIHRva2VudGFiMltpXS50b2tlbjsKKyAgICAgfQorCisgIHN3aXRjaCAoYyA9ICp0b2tzdGFydCkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlICcgJzoKKyAgICBjYXNlICdcdCc6CisgICAgY2FzZSAnXG4nOgorICAgICAgbGV4cHRyKys7CisgICAgICBnb3RvIHJldHJ5OworCisgICAgY2FzZSAnKCc6CisgICAgICBwYXJlbl9kZXB0aCsrOworICAgICAgbGV4cHRyKys7CisgICAgICByZXR1cm4gYzsKKworICAgIGNhc2UgJyknOgorICAgICAgaWYgKHBhcmVuX2RlcHRoID09IDApCisJcmV0dXJuIDA7CisgICAgICBwYXJlbl9kZXB0aC0tOworICAgICAgbGV4cHRyKys7CisgICAgICByZXR1cm4gYzsKKworICAgIGNhc2UgJywnOgorICAgICAgaWYgKGNvbW1hX3Rlcm1pbmF0ZXMgJiYgcGFyZW5fZGVwdGggPT0gMCkKKwlyZXR1cm4gMDsKKyAgICAgIGxleHB0cisrOworICAgICAgcmV0dXJuIGM7CisKKyAgICBjYXNlICcuJzoKKyAgICAgIC8qIE1pZ2h0IGJlIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiAgKi8KKyAgICAgIGlmIChsZXhwdHJbMV0gPj0gJzAnICYmIGxleHB0clsxXSA8PSAnOScpCisJYnJlYWs7CQkJLyogRmFsbHMgaW50byBudW1iZXIgY29kZS4gICovCisgICAgICBlbHNlCisgICAgICB7CisJIGxleHB0cisrOworCSByZXR1cm4gRE9UOworICAgICAgfQorCisvKiBUaGVzZSBhcmUgY2hhcmFjdGVyIHRva2VucyB0aGF0IGFwcGVhciBhcy1pcyBpbiB0aGUgWUFDQyBncmFtbWFyICovCisgICAgY2FzZSAnKyc6CisgICAgY2FzZSAnLSc6CisgICAgY2FzZSAnKic6CisgICAgY2FzZSAnLyc6CisgICAgY2FzZSAnXic6CisgICAgY2FzZSAnPCc6CisgICAgY2FzZSAnPic6CisgICAgY2FzZSAnWyc6CisgICAgY2FzZSAnXSc6CisgICAgY2FzZSAnPSc6CisgICAgY2FzZSAneyc6CisgICAgY2FzZSAnfSc6CisgICAgY2FzZSAnIyc6CisgICAgY2FzZSAnQCc6CisgICAgY2FzZSAnfic6CisgICAgY2FzZSAnJic6CisgICAgICBsZXhwdHIrKzsKKyAgICAgIHJldHVybiBjOworCisgICAgY2FzZSAnXCcnIDoKKyAgICBjYXNlICciJzoKKyAgICAgIHF1b3RlID0gYzsKKyAgICAgIGZvciAobmFtZWxlbiA9IDE7IChjID0gdG9rc3RhcnRbbmFtZWxlbl0pICE9IHF1b3RlICYmIGMgIT0gJ1wwJzsgbmFtZWxlbisrKQorCWlmIChjID09ICdcXCcpCisJICB7CisJICAgIGMgPSB0b2tzdGFydFsrK25hbWVsZW5dOworCSAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJICAgICAgeworCQljID0gdG9rc3RhcnRbKytuYW1lbGVuXTsKKwkJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCQkgIGMgPSB0b2tzdGFydFsrK25hbWVsZW5dOworCSAgICAgIH0KKwkgIH0KKyAgICAgIGlmKGMgIT0gcXVvdGUpCisJIGVycm9yKCJVbnRlcm1pbmF0ZWQgc3RyaW5nIG9yIGNoYXJhY3RlciBjb25zdGFudC4iKTsKKyAgICAgIHl5bHZhbC5zdmFsLnB0ciA9IHRva3N0YXJ0ICsgMTsKKyAgICAgIHl5bHZhbC5zdmFsLmxlbmd0aCA9IG5hbWVsZW4gLSAxOworICAgICAgbGV4cHRyICs9IG5hbWVsZW4gKyAxOworCisgICAgICBpZihuYW1lbGVuID09IDIpICAJLyogU2luZ2xlIGNoYXJhY3RlciAqLworICAgICAgeworCSAgIHl5bHZhbC51bHZhbCA9IHRva3N0YXJ0WzFdOworCSAgIHJldHVybiBDSEFSOworICAgICAgfQorICAgICAgZWxzZQorCSByZXR1cm4gU1RSSU5HOworICAgIH0KKworICAvKiBJcyBpdCBhIG51bWJlcj8gICovCisgIC8qIE5vdGU6ICBXZSBoYXZlIGFscmVhZHkgZGVhbHQgd2l0aCB0aGUgY2FzZSBvZiB0aGUgdG9rZW4gJy4nLgorICAgICBTZWUgY2FzZSAnLicgYWJvdmUuICAqLworICBpZiAoKGMgPj0gJzAnICYmIGMgPD0gJzknKSkKKyAgICB7CisgICAgICAvKiBJdCdzIGEgbnVtYmVyLiAgKi8KKyAgICAgIGludCBnb3RfZG90ID0gMCwgZ290X2UgPSAwOworICAgICAgcmVnaXN0ZXIgY2hhciAqcCA9IHRva3N0YXJ0OworICAgICAgaW50IHRva3R5cGU7CisKKyAgICAgIGZvciAoKytwIDs7ICsrcCkKKwl7CisJICBpZiAoIWdvdF9lICYmICgqcCA9PSAnZScgfHwgKnAgPT0gJ0UnKSkKKwkgICAgZ290X2RvdCA9IGdvdF9lID0gMTsKKwkgIGVsc2UgaWYgKCFnb3RfZG90ICYmICpwID09ICcuJykKKwkgICAgZ290X2RvdCA9IDE7CisJICBlbHNlIGlmIChnb3RfZSAmJiAocFstMV0gPT0gJ2UnIHx8IHBbLTFdID09ICdFJykKKwkJICAgJiYgKCpwID09ICctJyB8fCAqcCA9PSAnKycpKQorCSAgICAvKiBUaGlzIGlzIHRoZSBzaWduIG9mIHRoZSBleHBvbmVudCwgbm90IHRoZSBlbmQgb2YgdGhlCisJICAgICAgIG51bWJlci4gICovCisJICAgIGNvbnRpbnVlOworCSAgZWxzZSBpZiAoKCpwIDwgJzAnIHx8ICpwID4gJzknKSAmJgorCQkgICAoKnAgPCAnQScgfHwgKnAgPiAnRicpICYmCisJCSAgICgqcCAhPSAnSCcpKSAgLyogTW9kdWxhLTIgaGV4YWRlY2ltYWwgbnVtYmVyICovCisJICAgIGJyZWFrOworCX0KKwl0b2t0eXBlID0gcGFyc2VfbnVtYmVyIChwIC0gdG9rc3RhcnQpOworICAgICAgICBpZiAodG9rdHlwZSA9PSBFUlJPUikKKwkgIHsKKwkgICAgY2hhciAqZXJyX2NvcHkgPSAoY2hhciAqKSBhbGxvY2EgKHAgLSB0b2tzdGFydCArIDEpOworCisJICAgIG1lbWNweSAoZXJyX2NvcHksIHRva3N0YXJ0LCBwIC0gdG9rc3RhcnQpOworCSAgICBlcnJfY29weVtwIC0gdG9rc3RhcnRdID0gMDsKKwkgICAgZXJyb3IgKCJJbnZhbGlkIG51bWJlciBcIiVzXCIuIiwgZXJyX2NvcHkpOworCSAgfQorCWxleHB0ciA9IHA7CisJcmV0dXJuIHRva3R5cGU7CisgICAgfQorCisgIGlmICghKGMgPT0gJ18nIHx8IGMgPT0gJyQnCisJfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpKSkKKyAgICAvKiBXZSBtdXN0IGhhdmUgY29tZSBhY3Jvc3MgYSBiYWQgY2hhcmFjdGVyIChlLmcuICc7JykuICAqLworICAgIGVycm9yICgiSW52YWxpZCBjaGFyYWN0ZXIgJyVjJyBpbiBleHByZXNzaW9uLiIsIGMpOworCisgIC8qIEl0J3MgYSBuYW1lLiAgU2VlIGhvdyBsb25nIGl0IGlzLiAgKi8KKyAgbmFtZWxlbiA9IDA7CisgIGZvciAoYyA9IHRva3N0YXJ0W25hbWVsZW5dOworICAgICAgIChjID09ICdfJyB8fCBjID09ICckJyB8fCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpKTsKKyAgICAgICBjID0gdG9rc3RhcnRbKytuYW1lbGVuXSkKKyAgICA7CisKKyAgLyogVGhlIHRva2VuICJpZiIgdGVybWluYXRlcyB0aGUgZXhwcmVzc2lvbiBhbmQgaXMgTk9UCisgICAgIHJlbW92ZWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAgKi8KKyAgaWYgKG5hbWVsZW4gPT0gMiAmJiB0b2tzdGFydFswXSA9PSAnaScgJiYgdG9rc3RhcnRbMV0gPT0gJ2YnKQorICAgIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBsZXhwdHIgKz0gbmFtZWxlbjsKKworICAvKiAgTG9va3VwIHNwZWNpYWwga2V5d29yZHMgKi8KKyAgZm9yKGkgPSAwIDsgaSA8IChpbnQpIChzaXplb2Yoa2V5dGFiKSAvIHNpemVvZihrZXl0YWJbMF0pKSA7IGkrKykKKyAgICAgaWYobmFtZWxlbiA9PSBzdHJsZW4oa2V5dGFiW2ldLmtleXcpICYmIFNUUkVRTih0b2tzdGFydCxrZXl0YWJbaV0ua2V5dyxuYW1lbGVuKSkKKwkgICByZXR1cm4ga2V5dGFiW2ldLnRva2VuOworCisgIHl5bHZhbC5zdmFsLnB0ciA9IHRva3N0YXJ0OworICB5eWx2YWwuc3ZhbC5sZW5ndGggPSBuYW1lbGVuOworCisgIGlmICgqdG9rc3RhcnQgPT0gJyQnKQorICAgIHsKKyAgICAgIHdyaXRlX2RvbGxhcl92YXJpYWJsZSAoeXlsdmFsLnN2YWwpOworICAgICAgcmV0dXJuIElOVEVSTkFMX1ZBUjsKKyAgICB9CisKKyAgLyogVXNlIHRva2VuLXR5cGUgQkxPQ0tOQU1FIGZvciBzeW1ib2xzIHRoYXQgaGFwcGVuIHRvIGJlIGRlZmluZWQgYXMKKyAgICAgZnVuY3Rpb25zLiAgSWYgdGhpcyBpcyBub3Qgc28sIHRoZW4gLi4uCisgICAgIFVzZSB0b2tlbi10eXBlIFRZUEVOQU1FIGZvciBzeW1ib2xzIHRoYXQgaGFwcGVuIHRvIGJlIGRlZmluZWQKKyAgICAgY3VycmVudGx5IGFzIG5hbWVzIG9mIHR5cGVzOyBOQU1FIGZvciBvdGhlciBzeW1ib2xzLgorICAgICBUaGUgY2FsbGVyIGlzIG5vdCBjb25zdHJhaW5lZCB0byBjYXJlIGFib3V0IHRoZSBkaXN0aW5jdGlvbi4gICovCisgeworCisKKyAgICBjaGFyICp0bXAgPSBjb3B5X25hbWUgKHl5bHZhbC5zdmFsKTsKKyAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisKKyAgICBpZiAobG9va3VwX3BhcnRpYWxfc3ltdGFiICh0bXApKQorICAgICAgcmV0dXJuIEJMT0NLTkFNRTsKKyAgICBzeW0gPSBsb29rdXBfc3ltYm9sICh0bXAsIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywKKwkJCSBWQVJfTkFNRVNQQUNFLCAwLCBOVUxMKTsKKyAgICBpZiAoc3ltICYmIFNZTUJPTF9DTEFTUyAoc3ltKSA9PSBMT0NfQkxPQ0spCisgICAgICByZXR1cm4gQkxPQ0tOQU1FOworICAgIGlmIChsb29rdXBfdHlwZW5hbWUgKGNvcHlfbmFtZSAoeXlsdmFsLnN2YWwpLCBleHByZXNzaW9uX2NvbnRleHRfYmxvY2ssIDEpKQorICAgICAgcmV0dXJuIFRZUEVOQU1FOworCisgICAgaWYoc3ltKQorICAgIHsKKyAgICAgICBzd2l0Y2goc3ltLT5hY2xhc3MpCisgICAgICAgeworICAgICAgIGNhc2UgTE9DX1NUQVRJQzoKKyAgICAgICBjYXNlIExPQ19SRUdJU1RFUjoKKyAgICAgICBjYXNlIExPQ19BUkc6CisgICAgICAgY2FzZSBMT0NfUkVGX0FSRzoKKyAgICAgICBjYXNlIExPQ19SRUdQQVJNOgorICAgICAgIGNhc2UgTE9DX1JFR1BBUk1fQUREUjoKKyAgICAgICBjYXNlIExPQ19MT0NBTDoKKyAgICAgICBjYXNlIExPQ19MT0NBTF9BUkc6CisgICAgICAgY2FzZSBMT0NfQkFTRVJFRzoKKyAgICAgICBjYXNlIExPQ19CQVNFUkVHX0FSRzoKKyAgICAgICBjYXNlIExPQ19DT05TVDoKKyAgICAgICBjYXNlIExPQ19DT05TVF9CWVRFUzoKKyAgICAgICBjYXNlIExPQ19PUFRJTUlaRURfT1VUOgorCSAgcmV0dXJuIE5BTUU7CisKKyAgICAgICBjYXNlIExPQ19UWVBFREVGOgorCSAgcmV0dXJuIFRZUEVOQU1FOworCisgICAgICAgY2FzZSBMT0NfQkxPQ0s6CisJICByZXR1cm4gQkxPQ0tOQU1FOworCisgICAgICAgY2FzZSBMT0NfVU5ERUY6CisJICBlcnJvcigiaW50ZXJuYWw6ICBVbmRlZmluZWQgY2xhc3MgaW4gbTJsZXgoKSIpOworCisgICAgICAgY2FzZSBMT0NfTEFCRUw6CisgICAgICAgY2FzZSBMT0NfVU5SRVNPTFZFRDoKKwkgIGVycm9yKCJpbnRlcm5hbDogIFVuZm9yc2VlbiBjYXNlIGluIG0ybGV4KCkiKTsKKyAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgLyogQnVpbHQtaW4gQk9PTEVBTiB0eXBlLiAgVGhpcyBpcyBzb3J0IG9mIGEgaGFjay4gKi8KKyAgICAgICBpZihTVFJFUU4odG9rc3RhcnQsIlRSVUUiLDQpKQorICAgICAgIHsKKwkgIHl5bHZhbC51bHZhbCA9IDE7CisJICByZXR1cm4gTTJfVFJVRTsKKyAgICAgICB9CisgICAgICAgZWxzZSBpZihTVFJFUU4odG9rc3RhcnQsIkZBTFNFIiw1KSkKKyAgICAgICB7CisJICB5eWx2YWwudWx2YWwgPSAwOworCSAgcmV0dXJuIE0yX0ZBTFNFOworICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBNdXN0IGJlIGFub3RoZXIgdHlwZSBvZiBuYW1lLi4uICovCisgICAgcmV0dXJuIE5BTUU7CisgfQorfQorCisjaWYgMAkJLyogVW51c2VkICovCitzdGF0aWMgY2hhciAqCittYWtlX3F1YWxuYW1lKG1vZCxpZGVudCkKKyAgIGNoYXIgKm1vZCwgKmlkZW50OworeworICAgY2hhciAqbmV3ID0gbWFsbG9jKHN0cmxlbihtb2QpK3N0cmxlbihpZGVudCkrMik7CisKKyAgIHN0cmNweShuZXcsbW9kKTsKKyAgIHN0cmNhdChuZXcsIi4iKTsKKyAgIHN0cmNhdChuZXcsaWRlbnQpOworICAgcmV0dXJuIG5ldzsKK30KKyNlbmRpZiAgLyogMCAqLworCit2b2lkCit5eWVycm9yIChtc2cpCisgICAgIGNoYXIgKm1zZzsKK3sKKyAgZXJyb3IgKCJBICVzIGluIGV4cHJlc3Npb24sIG5lYXIgYCVzJy4iLCAobXNnID8gbXNnIDogImVycm9yIiksIGxleHB0cik7Cit9CmRpZmYgLS1naXQgYS9nZGIvbTItbGFuZy5jIGIvZ2RiL20yLWxhbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWYzOGE5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL20yLWxhbmcuYwpAQCAtMCwwICsxLDQ3MiBAQAorLyogTW9kdWxhIDIgbGFuZ3VhZ2Ugc3VwcG9ydCByb3V0aW5lcyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJwYXJzZXItZGVmcy5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAibTItbGFuZy5oIgorI2luY2x1ZGUgImMtbGFuZy5oIgorCitzdGF0aWMgc3RydWN0IHR5cGUgKm0yX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIGludCkpOworc3RhdGljIHZvaWQgbTJfcHJpbnRzdHIgUEFSQU1TICgoR0RCX0ZJTEUgKnN0cmVhbSwgY2hhciAqc3RyaW5nLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLCBpbnQgd2lkdGgsIGludCBmb3JjZV9lbGxpcHNlcykpOworc3RhdGljIHZvaWQgbTJfcHJpbnRjaGFyIFBBUkFNUyAoKGludCwgR0RCX0ZJTEUgKikpOworc3RhdGljIHZvaWQgbTJfZW1pdF9jaGFyIFBBUkFNUyAoKGludCwgR0RCX0ZJTEUgKiwgaW50KSk7CisKKy8qIFByaW50IHRoZSBjaGFyYWN0ZXIgQyBvbiBTVFJFQU0gYXMgcGFydCBvZiB0aGUgY29udGVudHMgb2YgYSBsaXRlcmFsCisgICBzdHJpbmcgd2hvc2UgZGVsaW1pdGVyIGlzIFFVT1RFUi4gIE5vdGUgdGhhdCB0aGF0IGZvcm1hdCBmb3IgcHJpbnRpbmcKKyAgIGNoYXJhY3RlcnMgYW5kIHN0cmluZ3MgaXMgbGFuZ3VhZ2Ugc3BlY2lmaWMuCisgICBGSVhNRTogIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBzYW1lIGZ1bmN0aW9uIGZyb20gYy1leHAueS4gIEl0IHNob3VsZAorICAgYmUgcmVwbGFjZWQgd2l0aCBhIHRydWUgTW9kdWxhIHZlcnNpb24uCisgKi8KKworc3RhdGljIHZvaWQKK20yX2VtaXRfY2hhciAoYywgc3RyZWFtLCBxdW90ZXIpCisgICAgIHJlZ2lzdGVyIGludCBjOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgcXVvdGVyOworeworCisgIGMgJj0gMHhGRjsJCQkvKiBBdm9pZCBzaWduIGJpdCBmb2xsaWVzICovCisKKyAgaWYgKFBSSU5UX0xJVEVSQUxfRk9STSAoYykpCisgICAgeworICAgICAgaWYgKGMgPT0gJ1xcJyB8fCBjID09IHF1b3RlcikKKwl7CisJICBmcHV0c19maWx0ZXJlZCAoIlxcIiwgc3RyZWFtKTsKKwl9CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlYyIsIGMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAnXG4nOgorCSAgZnB1dHNfZmlsdGVyZWQgKCJcXG4iLCBzdHJlYW0pOworCSAgYnJlYWs7CisJY2FzZSAnXGInOgorCSAgZnB1dHNfZmlsdGVyZWQgKCJcXGIiLCBzdHJlYW0pOworCSAgYnJlYWs7CisJY2FzZSAnXHQnOgorCSAgZnB1dHNfZmlsdGVyZWQgKCJcXHQiLCBzdHJlYW0pOworCSAgYnJlYWs7CisJY2FzZSAnXGYnOgorCSAgZnB1dHNfZmlsdGVyZWQgKCJcXGYiLCBzdHJlYW0pOworCSAgYnJlYWs7CisJY2FzZSAnXHInOgorCSAgZnB1dHNfZmlsdGVyZWQgKCJcXHIiLCBzdHJlYW0pOworCSAgYnJlYWs7CisJY2FzZSAnXDAzMyc6CisJICBmcHV0c19maWx0ZXJlZCAoIlxcZSIsIHN0cmVhbSk7CisJICBicmVhazsKKwljYXNlICdcMDA3JzoKKwkgIGZwdXRzX2ZpbHRlcmVkICgiXFxhIiwgc3RyZWFtKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJcXCUuM28iLCAodW5zaWduZWQgaW50KSBjKTsKKwkgIGJyZWFrOworCX0KKyAgICB9Cit9CisKKy8qIEZJWE1FOiAgVGhpcyBpcyBhIGNvcHkgb2YgdGhlIHNhbWUgZnVuY3Rpb24gZnJvbSBjLWV4cC55LiAgSXQgc2hvdWxkCisgICBiZSByZXBsYWNlZCB3aXRoIGEgdHJ1ZSBNb2R1bGEgdmVyc2lvbi4gKi8KKworc3RhdGljIHZvaWQKK20yX3ByaW50Y2hhciAoYywgc3RyZWFtKQorICAgICBpbnQgYzsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgZnB1dHNfZmlsdGVyZWQgKCInIiwgc3RyZWFtKTsKKyAgTEFfRU1JVF9DSEFSIChjLCBzdHJlYW0sICdcJycpOworICBmcHV0c19maWx0ZXJlZCAoIiciLCBzdHJlYW0pOworfQorCisvKiBQcmludCB0aGUgY2hhcmFjdGVyIHN0cmluZyBTVFJJTkcsIHByaW50aW5nIGF0IG1vc3QgTEVOR1RIIGNoYXJhY3RlcnMuCisgICBQcmludGluZyBzdG9wcyBlYXJseSBpZiB0aGUgbnVtYmVyIGhpdHMgcHJpbnRfbWF4OyByZXBlYXQgY291bnRzCisgICBhcmUgcHJpbnRlZCBhcyBhcHByb3ByaWF0ZS4gIFByaW50IGVsbGlwc2VzIGF0IHRoZSBlbmQgaWYgd2UKKyAgIGhhZCB0byBzdG9wIGJlZm9yZSBwcmludGluZyBMRU5HVEggY2hhcmFjdGVycywgb3IgaWYgRk9SQ0VfRUxMSVBTRVMuCisgICBGSVhNRTogIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBzYW1lIGZ1bmN0aW9uIGZyb20gYy1leHAueS4gIEl0IHNob3VsZAorICAgYmUgcmVwbGFjZWQgd2l0aCBhIHRydWUgTW9kdWxhIHZlcnNpb24uICovCisKK3N0YXRpYyB2b2lkCittMl9wcmludHN0ciAoc3RyZWFtLCBzdHJpbmcsIGxlbmd0aCwgd2lkdGgsIGZvcmNlX2VsbGlwc2VzKQorICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBjaGFyICpzdHJpbmc7CisgICAgIHVuc2lnbmVkIGludCBsZW5ndGg7CisgICAgIGludCB3aWR0aDsKKyAgICAgaW50IGZvcmNlX2VsbGlwc2VzOworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKKyAgdW5zaWduZWQgaW50IHRoaW5nc19wcmludGVkID0gMDsKKyAgaW50IGluX3F1b3RlcyA9IDA7CisgIGludCBuZWVkX2NvbW1hID0gMDsKKyAgZXh0ZXJuIGludCBpbnNwZWN0X2l0OworICBleHRlcm4gaW50IHJlcGVhdF9jb3VudF90aHJlc2hvbGQ7CisgIGV4dGVybiBpbnQgcHJpbnRfbWF4OworCisgIGlmIChsZW5ndGggPT0gMCkKKyAgICB7CisgICAgICBmcHV0c19maWx0ZXJlZCAoIlwiXCIiLCBnZGJfc3Rkb3V0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbmd0aCAmJiB0aGluZ3NfcHJpbnRlZCA8IHByaW50X21heDsgKytpKQorICAgIHsKKyAgICAgIC8qIFBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgd2UgYXJlIGV4YW1pbmluZworCSB0byBzZWUgd2hldGhlciBpdCBpcyByZXBlYXRlZC4gICovCisgICAgICB1bnNpZ25lZCBpbnQgcmVwMTsKKyAgICAgIC8qIE51bWJlciBvZiByZXBldGl0aW9ucyB3ZSBoYXZlIGRldGVjdGVkIHNvIGZhci4gICovCisgICAgICB1bnNpZ25lZCBpbnQgcmVwczsKKworICAgICAgUVVJVDsKKworICAgICAgaWYgKG5lZWRfY29tbWEpCisJeworCSAgZnB1dHNfZmlsdGVyZWQgKCIsICIsIHN0cmVhbSk7CisJICBuZWVkX2NvbW1hID0gMDsKKwl9CisKKyAgICAgIHJlcDEgPSBpICsgMTsKKyAgICAgIHJlcHMgPSAxOworICAgICAgd2hpbGUgKHJlcDEgPCBsZW5ndGggJiYgc3RyaW5nW3JlcDFdID09IHN0cmluZ1tpXSkKKwl7CisJICArK3JlcDE7CisJICArK3JlcHM7CisJfQorCisgICAgICBpZiAocmVwcyA+IHJlcGVhdF9jb3VudF90aHJlc2hvbGQpCisJeworCSAgaWYgKGluX3F1b3RlcykKKwkgICAgeworCSAgICAgIGlmIChpbnNwZWN0X2l0KQorCQlmcHV0c19maWx0ZXJlZCAoIlxcXCIsICIsIHN0cmVhbSk7CisJICAgICAgZWxzZQorCQlmcHV0c19maWx0ZXJlZCAoIlwiLCAiLCBzdHJlYW0pOworCSAgICAgIGluX3F1b3RlcyA9IDA7CisJICAgIH0KKwkgIG0yX3ByaW50Y2hhciAoc3RyaW5nW2ldLCBzdHJlYW0pOworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiIDxyZXBlYXRzICV1IHRpbWVzPiIsIHJlcHMpOworCSAgaSA9IHJlcDEgLSAxOworCSAgdGhpbmdzX3ByaW50ZWQgKz0gcmVwZWF0X2NvdW50X3RocmVzaG9sZDsKKwkgIG5lZWRfY29tbWEgPSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoIWluX3F1b3RlcykKKwkgICAgeworCSAgICAgIGlmIChpbnNwZWN0X2l0KQorCQlmcHV0c19maWx0ZXJlZCAoIlxcXCIiLCBzdHJlYW0pOworCSAgICAgIGVsc2UKKwkJZnB1dHNfZmlsdGVyZWQgKCJcIiIsIHN0cmVhbSk7CisJICAgICAgaW5fcXVvdGVzID0gMTsKKwkgICAgfQorCSAgTEFfRU1JVF9DSEFSIChzdHJpbmdbaV0sIHN0cmVhbSwgJyInKTsKKwkgICsrdGhpbmdzX3ByaW50ZWQ7CisJfQorICAgIH0KKworICAvKiBUZXJtaW5hdGUgdGhlIHF1b3RlcyBpZiBuZWNlc3NhcnkuICAqLworICBpZiAoaW5fcXVvdGVzKQorICAgIHsKKyAgICAgIGlmIChpbnNwZWN0X2l0KQorCWZwdXRzX2ZpbHRlcmVkICgiXFxcIiIsIHN0cmVhbSk7CisgICAgICBlbHNlCisJZnB1dHNfZmlsdGVyZWQgKCJcIiIsIHN0cmVhbSk7CisgICAgfQorCisgIGlmIChmb3JjZV9lbGxpcHNlcyB8fCBpIDwgbGVuZ3RoKQorICAgIGZwdXRzX2ZpbHRlcmVkICgiLi4uIiwgc3RyZWFtKTsKK30KKworLyogRklYTUU6ICBUaGlzIGlzIGEgY29weSBvZiBjX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlKCksIGJlZm9yZQorICAgYWxsIHRoZSBub24tQyB0eXBlcyB3ZXJlIHN0cmlwcGVkIGZyb20gaXQuICBOZWVkcyB0byBiZSBmaXhlZAorICAgYnkgYW4gZXhwZXJpZW5jZWQgTW9kdWxhIHByb2dyYW1tZXIuICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCittMl9jcmVhdGVfZnVuZGFtZW50YWxfdHlwZSAob2JqZmlsZSwgdHlwZWlkKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgaW50IHR5cGVpZDsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKnR5cGUgPSBOVUxMOworCisgIHN3aXRjaCAodHlwZWlkKQorICAgIHsKKyAgICAgIGRlZmF1bHQ6CisJLyogRklYTUU6ICBGb3Igbm93LCBpZiB3ZSBhcmUgYXNrZWQgdG8gcHJvZHVjZSBhIHR5cGUgbm90IGluIHRoaXMKKwkgICBsYW5ndWFnZSwgY3JlYXRlIHRoZSBlcXVpdmFsZW50IG9mIGEgQyBpbnRlZ2VyIHR5cGUgd2l0aCB0aGUKKwkgICBuYW1lICI8P3R5cGU/PiIuICBXaGVuIGFsbCB0aGUgZHVzdCBzZXR0bGVzIGZyb20gdGhlIHR5cGUKKwkgICByZWNvbnN0cnVjdGlvbiB3b3JrLCB0aGlzIHNob3VsZCBwcm9iYWJseSBiZWNvbWUgYW4gZXJyb3IuICovCisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwKKwkJCSAgVEFSR0VUX0lOVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIDAsICI8P3R5cGU/PiIsIG9iamZpbGUpOworICAgICAgICB3YXJuaW5nICgiaW50ZXJuYWwgZXJyb3I6IG5vIE1vZHVsYSBmdW5kYW1lbnRhbCB0eXBlICVkIiwgdHlwZWlkKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfVk9JRDoKKwl0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfVk9JRCwKKwkJCSAgVEFSR0VUX0NIQVJfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJICAwLCAidm9pZCIsIG9iamZpbGUpOworCWJyZWFrOworICAgICAgY2FzZSBGVF9CT09MRUFOOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9CT09MLAorCQkJICBUQVJHRVRfQ0hBUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIFRZUEVfRkxBR19VTlNJR05FRCwgImJvb2xlYW4iLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfU1RSSU5HOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9TVFJJTkcsCisJCQkgIFRBUkdFVF9DSEFSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCSAgMCwgInN0cmluZyIsIG9iamZpbGUpOworCWJyZWFrOworICAgICAgY2FzZSBGVF9DSEFSOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsCisJCQkgIFRBUkdFVF9DSEFSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCSAgMCwgImNoYXIiLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfU0lHTkVEX0NIQVI6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwKKwkJCSAgVEFSR0VUX0NIQVJfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJICAwLCAic2lnbmVkIGNoYXIiLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfVU5TSUdORURfQ0hBUjoKKwl0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJICBUQVJHRVRfQ0hBUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIFRZUEVfRkxBR19VTlNJR05FRCwgInVuc2lnbmVkIGNoYXIiLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfU0hPUlQ6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwKKwkJCSAgVEFSR0VUX1NIT1JUX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCSAgMCwgInNob3J0Iiwgb2JqZmlsZSk7CisJYnJlYWs7CisgICAgICBjYXNlIEZUX1NJR05FRF9TSE9SVDoKKwl0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJICBUQVJHRVRfU0hPUlRfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJICAwLCAic2hvcnQiLCBvYmpmaWxlKTsJLyogRklYTUUtZm5mICovCisJYnJlYWs7CisgICAgICBjYXNlIEZUX1VOU0lHTkVEX1NIT1JUOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsCisJCQkgIFRBUkdFVF9TSE9SVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIFRZUEVfRkxBR19VTlNJR05FRCwgInVuc2lnbmVkIHNob3J0Iiwgb2JqZmlsZSk7CisJYnJlYWs7CisgICAgICBjYXNlIEZUX0lOVEVHRVI6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwKKwkJCSAgVEFSR0VUX0lOVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIDAsICJpbnQiLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfU0lHTkVEX0lOVEVHRVI6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwKKwkJCSAgVEFSR0VUX0lOVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIDAsICJpbnQiLCBvYmpmaWxlKTsgLyogRklYTUUgLWZuZiAqLworCWJyZWFrOworICAgICAgY2FzZSBGVF9VTlNJR05FRF9JTlRFR0VSOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsCisJCQkgIFRBUkdFVF9JTlRfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJICBUWVBFX0ZMQUdfVU5TSUdORUQsICJ1bnNpZ25lZCBpbnQiLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfRklYRURfREVDSU1BTDoKKwl0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJICBUQVJHRVRfSU5UX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCSAgMCwgImZpeGVkIGRlY2ltYWwiLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfTE9ORzoKKwl0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJICBUQVJHRVRfTE9OR19CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIDAsICJsb25nIiwgb2JqZmlsZSk7CisJYnJlYWs7CisgICAgICBjYXNlIEZUX1NJR05FRF9MT05HOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsCisJCQkgIFRBUkdFVF9MT05HX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCSAgMCwgImxvbmciLCBvYmpmaWxlKTsgLyogRklYTUUgLWZuZiAqLworCWJyZWFrOworICAgICAgY2FzZSBGVF9VTlNJR05FRF9MT05HOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsCisJCQkgIFRBUkdFVF9MT05HX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCSAgVFlQRV9GTEFHX1VOU0lHTkVELCAidW5zaWduZWQgbG9uZyIsIG9iamZpbGUpOworCWJyZWFrOworICAgICAgY2FzZSBGVF9MT05HX0xPTkc6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwKKwkJCSAgVEFSR0VUX0xPTkdfTE9OR19CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIDAsICJsb25nIGxvbmciLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfU0lHTkVEX0xPTkdfTE9ORzoKKwl0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJICBUQVJHRVRfTE9OR19MT05HX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCSAgMCwgInNpZ25lZCBsb25nIGxvbmciLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfVU5TSUdORURfTE9OR19MT05HOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsCisJCQkgIFRBUkdFVF9MT05HX0xPTkdfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJICBUWVBFX0ZMQUdfVU5TSUdORUQsICJ1bnNpZ25lZCBsb25nIGxvbmciLCBvYmpmaWxlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRlRfRkxPQVQ6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0ZMVCwKKwkJCSAgVEFSR0VUX0ZMT0FUX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCSAgMCwgImZsb2F0Iiwgb2JqZmlsZSk7CisJYnJlYWs7CisgICAgICBjYXNlIEZUX0RCTF9QUkVDX0ZMT0FUOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9GTFQsCisJCQkgIFRBUkdFVF9ET1VCTEVfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJICAwLCAiZG91YmxlIiwgb2JqZmlsZSk7CisJYnJlYWs7CisgICAgICBjYXNlIEZUX0ZMT0FUX0RFQ0lNQUw6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0ZMVCwKKwkJCSAgVEFSR0VUX0RPVUJMRV9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIDAsICJmbG9hdGluZyBkZWNpbWFsIiwgb2JqZmlsZSk7CisJYnJlYWs7CisgICAgICBjYXNlIEZUX0VYVF9QUkVDX0ZMT0FUOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9GTFQsCisJCQkgIFRBUkdFVF9MT05HX0RPVUJMRV9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIDAsICJsb25nIGRvdWJsZSIsIG9iamZpbGUpOworCWJyZWFrOworICAgICAgY2FzZSBGVF9DT01QTEVYOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9DT01QTEVYLAorCQkJICAyICogVEFSR0VUX0ZMT0FUX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJCSAgMCwgImNvbXBsZXgiLCBvYmpmaWxlKTsKKwlUWVBFX1RBUkdFVF9UWVBFICh0eXBlKQorCSAgPSBtMl9jcmVhdGVfZnVuZGFtZW50YWxfdHlwZSAob2JqZmlsZSwgRlRfRkxPQVQpOworCWJyZWFrOworICAgICAgY2FzZSBGVF9EQkxfUFJFQ19DT01QTEVYOgorCXR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9DT01QTEVYLAorCQkJICAyICogVEFSR0VUX0RPVUJMRV9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgIDAsICJkb3VibGUgY29tcGxleCIsIG9iamZpbGUpOworCVRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpCisJICA9IG0yX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCBGVF9EQkxfUFJFQ19GTE9BVCk7CisJYnJlYWs7CisgICAgICBjYXNlIEZUX0VYVF9QUkVDX0NPTVBMRVg6CisJdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0NPTVBMRVgsCisJCQkgIDIgKiBUQVJHRVRfTE9OR19ET1VCTEVfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJICAwLCAibG9uZyBkb3VibGUgY29tcGxleCIsIG9iamZpbGUpOworCVRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpCisJICA9IG0yX2NyZWF0ZV9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLCBGVF9FWFRfUFJFQ19GTE9BVCk7CisJYnJlYWs7CisgICAgICB9CisgIHJldHVybiAodHlwZSk7Cit9CisKKwwKKy8qIFRhYmxlIG9mIG9wZXJhdG9ycyBhbmQgdGhlaXIgcHJlY2VkZW5jZXMgZm9yIHByaW50aW5nIGV4cHJlc3Npb25zLiAgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcF9wcmludCBtMl9vcF9wcmludF90YWJbXSA9IHsKKyAgICB7IisiLCAgIEJJTk9QX0FERCwgUFJFQ19BREQsIDB9LAorICAgIHsiKyIsICAgVU5PUF9QTFVTLCBQUkVDX1BSRUZJWCwgMH0sCisgICAgeyItIiwgICBCSU5PUF9TVUIsIFBSRUNfQURELCAwfSwKKyAgICB7Ii0iLCAgIFVOT1BfTkVHLCBQUkVDX1BSRUZJWCwgMH0sCisgICAgeyIqIiwgICBCSU5PUF9NVUwsIFBSRUNfTVVMLCAwfSwKKyAgICB7Ii8iLCAgIEJJTk9QX0RJViwgUFJFQ19NVUwsIDB9LAorICAgIHsiRElWIiwgQklOT1BfSU5URElWLCBQUkVDX01VTCwgMH0sCisgICAgeyJNT0QiLCBCSU5PUF9SRU0sIFBSRUNfTVVMLCAwfSwKKyAgICB7Ijo9IiwgIEJJTk9QX0FTU0lHTiwgUFJFQ19BU1NJR04sIDF9LAorICAgIHsiT1IiLCAgQklOT1BfTE9HSUNBTF9PUiwgUFJFQ19MT0dJQ0FMX09SLCAwfSwKKyAgICB7IkFORCIsIEJJTk9QX0xPR0lDQUxfQU5ELCBQUkVDX0xPR0lDQUxfQU5ELCAwfSwKKyAgICB7Ik5PVCIsIFVOT1BfTE9HSUNBTF9OT1QsIFBSRUNfUFJFRklYLCAwfSwKKyAgICB7Ij0iLCAgIEJJTk9QX0VRVUFMLCBQUkVDX0VRVUFMLCAwfSwKKyAgICB7Ijw+IiwgIEJJTk9QX05PVEVRVUFMLCBQUkVDX0VRVUFMLCAwfSwKKyAgICB7Ijw9IiwgIEJJTk9QX0xFUSwgUFJFQ19PUkRFUiwgMH0sCisgICAgeyI+PSIsICBCSU5PUF9HRVEsIFBSRUNfT1JERVIsIDB9LAorICAgIHsiPiIsICAgQklOT1BfR1RSLCBQUkVDX09SREVSLCAwfSwKKyAgICB7IjwiLCAgIEJJTk9QX0xFU1MsIFBSRUNfT1JERVIsIDB9LAorICAgIHsiXiIsICAgVU5PUF9JTkQsIFBSRUNfUFJFRklYLCAwfSwKKyAgICB7IkAiLCAgIEJJTk9QX1JFUEVBVCwgUFJFQ19SRVBFQVQsIDB9LAorICAgIHsiQ0FQIiwgVU5PUF9DQVAsIFBSRUNfQlVJTFRJTl9GVU5DVElPTiwgMH0sCisgICAgeyJDSFIiLCBVTk9QX0NIUiwgUFJFQ19CVUlMVElOX0ZVTkNUSU9OLCAwfSwKKyAgICB7Ik9SRCIsIFVOT1BfT1JELCBQUkVDX0JVSUxUSU5fRlVOQ1RJT04sIDB9LAorICAgIHsiRkxPQVQiLFVOT1BfRkxPQVQsIFBSRUNfQlVJTFRJTl9GVU5DVElPTiwgMH0sCisgICAgeyJISUdIIiwgVU5PUF9ISUdILCBQUkVDX0JVSUxUSU5fRlVOQ1RJT04sIDB9LAorICAgIHsiTUFYIiwgVU5PUF9NQVgsIFBSRUNfQlVJTFRJTl9GVU5DVElPTiwgMH0sCisgICAgeyJNSU4iLCBVTk9QX01JTiwgUFJFQ19CVUlMVElOX0ZVTkNUSU9OLCAwfSwKKyAgICB7Ik9ERCIsIFVOT1BfT0RELCBQUkVDX0JVSUxUSU5fRlVOQ1RJT04sIDB9LAorICAgIHsiVFJVTkMiLCBVTk9QX1RSVU5DLCBQUkVDX0JVSUxUSU5fRlVOQ1RJT04sIDB9LAorICAgIHtOVUxMLCAgMCwgMCwgMH0KK307CisMCisvKiBUaGUgYnVpbHQtaW4gdHlwZXMgb2YgTW9kdWxhLTIuICAqLworCitzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX20yX2NoYXI7CitzdHJ1Y3QgdHlwZSAqYnVpbHRpbl90eXBlX20yX2ludDsKK3N0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfbTJfY2FyZDsKK3N0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfbTJfcmVhbDsKK3N0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfbTJfYm9vbDsKKworc3RydWN0IHR5cGUgKiogQ09OU1RfUFRSIChtMl9idWlsdGluX3R5cGVzW10pID0gCit7CisgICZidWlsdGluX3R5cGVfbTJfY2hhciwKKyAgJmJ1aWx0aW5fdHlwZV9tMl9pbnQsCisgICZidWlsdGluX3R5cGVfbTJfY2FyZCwKKyAgJmJ1aWx0aW5fdHlwZV9tMl9yZWFsLAorICAmYnVpbHRpbl90eXBlX20yX2Jvb2wsCisgIDAKK307CisKK2NvbnN0IHN0cnVjdCBsYW5ndWFnZV9kZWZuIG0yX2xhbmd1YWdlX2RlZm4gPSB7CisgICJtb2R1bGEtMiIsCisgIGxhbmd1YWdlX20yLAorICBtMl9idWlsdGluX3R5cGVzLAorICByYW5nZV9jaGVja19vbiwKKyAgdHlwZV9jaGVja19vbiwKKyAgbTJfcGFyc2UsCQkJLyogcGFyc2VyICovCisgIG0yX2Vycm9yLAkJCS8qIHBhcnNlciBlcnJvciBmdW5jdGlvbiAqLworICBldmFsdWF0ZV9zdWJleHBfc3RhbmRhcmQsCisgIG0yX3ByaW50Y2hhciwJCQkvKiBQcmludCBjaGFyYWN0ZXIgY29uc3RhbnQgKi8KKyAgbTJfcHJpbnRzdHIsCQkJLyogZnVuY3Rpb24gdG8gcHJpbnQgc3RyaW5nIGNvbnN0YW50ICovCisgIG0yX2VtaXRfY2hhciwJCQkvKiBGdW5jdGlvbiB0byBwcmludCBhIHNpbmdsZSBjaGFyYWN0ZXIgKi8KKyAgbTJfY3JlYXRlX2Z1bmRhbWVudGFsX3R5cGUsCS8qIENyZWF0ZSBmdW5kYW1lbnRhbCB0eXBlIGluIHRoaXMgbGFuZ3VhZ2UgKi8KKyAgbTJfcHJpbnRfdHlwZSwJCS8qIFByaW50IGEgdHlwZSB1c2luZyBhcHByb3ByaWF0ZSBzeW50YXggKi8KKyAgbTJfdmFsX3ByaW50LAkJCS8qIFByaW50IGEgdmFsdWUgdXNpbmcgYXBwcm9wcmlhdGUgc3ludGF4ICovCisgIGNfdmFsdWVfcHJpbnQsCQkvKiBQcmludCBhIHRvcC1sZXZlbCB2YWx1ZSAqLworICB7IiIsICAgICAgIiIsICAgIiIsICAgIiJ9LAkvKiBCaW5hcnkgZm9ybWF0IGluZm8gKi8KKyAgeyIlbG9CIiwgICAiIiwgICAibyIsICAiQiJ9LAkvKiBPY3RhbCBmb3JtYXQgaW5mbyAqLworICB7IiVsZCIsICAgICIiLCAgICJkIiwgICIifSwJLyogRGVjaW1hbCBmb3JtYXQgaW5mbyAqLworICB7IjAlbFhIIiwgICIwIiwgICJYIiwgICJIIn0sCS8qIEhleCBmb3JtYXQgaW5mbyAqLworICBtMl9vcF9wcmludF90YWIsCQkvKiBleHByZXNzaW9uIG9wZXJhdG9ycyBmb3IgcHJpbnRpbmcgKi8KKyAgMCwJCQkJLyogYXJyYXlzIGFyZSBmaXJzdC1jbGFzcyAobm90IGMtc3R5bGUpICovCisgIDAsCQkJCS8qIFN0cmluZyBsb3dlciBib3VuZCAqLworICAmYnVpbHRpbl90eXBlX20yX2NoYXIsCS8qIFR5cGUgb2Ygc3RyaW5nIGVsZW1lbnRzICovIAorICBMQU5HX01BR0lDCit9OworCisvKiBJbml0aWFsaXphdGlvbiBmb3IgTW9kdWxhLTIgKi8KKwordm9pZAorX2luaXRpYWxpemVfbTJfbGFuZ3VhZ2UgKCkKK3sKKyAgLyogTW9kdWxhLTIgInBlcnZhc2l2ZSIgdHlwZXMuICBOT1RFOiAgdGhlc2UgY2FuIGJlIHJlZGVmaW5lZCEhISAqLworICBidWlsdGluX3R5cGVfbTJfaW50ID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIFRBUkdFVF9JTlRfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCSAgICAgICAwLAorCSAgICAgICAiSU5URUdFUiIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgYnVpbHRpbl90eXBlX20yX2NhcmQgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgVEFSR0VUX0lOVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJICAgICAgIFRZUEVfRkxBR19VTlNJR05FRCwKKwkgICAgICAgIkNBUkRJTkFMIiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICBidWlsdGluX3R5cGVfbTJfcmVhbCA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfRkxULCBUQVJHRVRfRkxPQVRfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCSAgICAgICAwLAorCSAgICAgICAiUkVBTCIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgYnVpbHRpbl90eXBlX20yX2NoYXIgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0NIQVIsIFRBUkdFVF9DSEFSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgVFlQRV9GTEFHX1VOU0lHTkVELAorCSAgICAgICAiQ0hBUiIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgYnVpbHRpbl90eXBlX20yX2Jvb2wgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0JPT0wsIFRBUkdFVF9JTlRfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCSAgICAgICBUWVBFX0ZMQUdfVU5TSUdORUQsCisJICAgICAgICJCT09MRUFOIiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworCisgIGFkZF9sYW5ndWFnZSAoJm0yX2xhbmd1YWdlX2RlZm4pOworfQpkaWZmIC0tZ2l0IGEvZ2RiL20yLWxhbmcuaCBiL2dkYi9tMi1sYW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2MjdiNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9tMi1sYW5nLmgKQEAgLTAsMCArMSwzMSBAQAorLyogTW9kdWxhIDIgbGFuZ3VhZ2Ugc3VwcG9ydCBkZWZpbml0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworZXh0ZXJuIGludAorbTJfcGFyc2UgUEFSQU1TICgodm9pZCkpOwkvKiBEZWZpbmVkIGluIG0yLWV4cC55ICovCisKK2V4dGVybiB2b2lkCittMl9lcnJvciBQQVJBTVMgKChjaGFyICopKTsJLyogRGVmaW5lZCBpbiBtMi1leHAueSAqLworCitleHRlcm4gdm9pZAkJCS8qIERlZmluZWQgaW4gbTItdHlwZXByaW50LmMgKi8KK20yX3ByaW50X3R5cGUgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqLCBHREJfRklMRSAqLCBpbnQsIGludCkpOworCitleHRlcm4gaW50CittMl92YWxfcHJpbnQgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqLCBpbnQsIENPUkVfQUREUiwgR0RCX0ZJTEUgKiwgaW50LCBpbnQsCisJCSAgICAgIGludCwgZW51bSB2YWxfcHJldHR5cHJpbnQpKTsKZGlmZiAtLWdpdCBhL2dkYi9tMi10eXBlcHJpbnQuYyBiL2dkYi9tMi10eXBlcHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTdmNDAxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL20yLXR5cGVwcmludC5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qIFN1cHBvcnQgZm9yIHByaW50aW5nIE1vZHVsYSAyIHR5cGVzIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4OCwgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJiZmQuaCIJCS8qIEJpbmFyeSBGaWxlIERlc2NyaXB0aW9uICovCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAiZGVtYW5nbGUuaCIKKyNpbmNsdWRlICJtMi1sYW5nLmgiCisKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKwordm9pZAorbTJfcHJpbnRfdHlwZSAodHlwZSwgdmFyc3RyaW5nLCBzdHJlYW0sIHNob3csIGxldmVsKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgY2hhciAqdmFyc3RyaW5nOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgc2hvdzsKKyAgICAgaW50IGxldmVsOworeworICBleHRlcm4gdm9pZCBjX3ByaW50X3R5cGUgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqLCBHREJfRklMRSAqLCBpbnQsIGludCkpOworCisgIGNfcHJpbnRfdHlwZSAodHlwZSwgdmFyc3RyaW5nLCBzdHJlYW0sIHNob3csIGxldmVsKTsJLyogRklYTUUgKi8KK30KZGlmZiAtLWdpdCBhL2dkYi9tMi12YWxwcmludC5jIGIvZ2RiL20yLXZhbHByaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhMmYyNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9tMi12YWxwcmludC5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIFN1cHBvcnQgZm9yIHByaW50aW5nIE1vZHVsYSAyIHZhbHVlcyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODgsIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJvYnN0YWNrLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJ2YWxwcmludC5oIgorI2luY2x1ZGUgIm0yLWxhbmcuaCIKKworLyogRklYTUU6ICBGb3Igbm93LCBqdXN0IGV4cGxpY2l0bHkgZGVjbGFyZSBjX3ZhbF9wcmludCBhbmQgdXNlIGl0IGluc3RlYWQgKi8KKworaW50CittMl92YWxfcHJpbnQgKHR5cGUsIHZhbGFkZHIsIGVtYmVkZGVkX29mZnNldCwgYWRkcmVzcywKKyAgICAgICAgICAgICAgc3RyZWFtLCBmb3JtYXQsIGRlcmVmX3JlZiwgcmVjdXJzZSwgcHJldHR5KQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgY2hhciAqdmFsYWRkcjsKKyAgICAgaW50IGVtYmVkZGVkX29mZnNldDsKKyAgICAgQ09SRV9BRERSIGFkZHJlc3M7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGludCBmb3JtYXQ7CisgICAgIGludCBkZXJlZl9yZWY7CisgICAgIGludCByZWN1cnNlOworICAgICBlbnVtIHZhbF9wcmV0dHlwcmludCBwcmV0dHk7Cit7CisgIGV4dGVybiBpbnQKKyAgY192YWxfcHJpbnQgUEFSQU1TICgoc3RydWN0IHR5cGUgKiwgY2hhciAqLCBpbnQsIENPUkVfQUREUiwKKyAgICAgICAgICAgICAgICAgICAgICAgR0RCX0ZJTEUgKiwgaW50LCBpbnQsIGludCwgZW51bSB2YWxfcHJldHR5cHJpbnQpKTsKKyAgcmV0dXJuIChjX3ZhbF9wcmludCAodHlwZSwgdmFsYWRkciwgMCwgYWRkcmVzcywgc3RyZWFtLCBmb3JtYXQsIGRlcmVmX3JlZiwKKwkJICAgICAgIHJlY3Vyc2UsIHByZXR0eSkpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL20zLW5hdC5jIGIvZ2RiL20zLW5hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MTRmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbTMtbmF0LmMKQEAgLTAsMCArMSw0NjQ2IEBACisvKiBJbnRlcmZhY2UgR0RCIHRvIE1hY2ggMy4wIG9wZXJhdGluZyBzeXN0ZW1zLgorICAgKE1vc3QpIE1hY2ggMy4wIHJlbGF0ZWQgcm91dGluZXMgbGl2ZSBpbiB0aGlzIGZpbGUuCisKKyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICogQXV0aG9yOiBKdWtrYSBWaXJ0YW5lbiA8anR2QGh1dC5maT4KKyAqCSAgIENvbXB1dGluZyBDZW50cmUKKyAqICAgICAgICAgSGVsc2lua2kgVW5pdmVyc2l0eSBvZiBUZWNobm9sb2d5CisgKiAgICAgICAgIEZpbmxhbmQKKyAqCisgKiBUaGFua3MgdG8gbXkgZnJpZW5kcyB3aG8gaGVscGVkIHdpdGggaWRlYXMgYW5kIHRlc3Rpbmc6CisgKgorICoJSm9oYW5uZXMgSGVsYW5kZXIsIEFudHRpIExvdWtvLCBUZXJvIE1vbm9uZW4sCisgKglqdmhAY3MuaHV0LmZpCSAgIGFsb0BodXQuZmkgICB0bW9AY3MuaHV0LmZpCisgKgorICogICAgICBUZXJvIEtpdmluZW4gICAgICAgYW5kICAgICAgICAgIEVhbW9ubiBNY01hbnVzCisgKglraXZpbmVuQGNzLmh1dC5maSAgICAgICAgICAgICAgIGVtY21hbnVzQGdyLm9zZi5vcmcKKyAqCQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8bWFjaC5oPgorI2luY2x1ZGUgPHNlcnZlcnMvbmV0bmFtZS5oPgorI2luY2x1ZGUgPHNlcnZlcnMvbWFjaGlkLmg+CisjaW5jbHVkZSA8bWFjaC9tZXNzYWdlLmg+CisjaW5jbHVkZSA8bWFjaC9ub3RpZnkuaD4KKyNpbmNsdWRlIDxtYWNoX2Vycm9yLmg+CisjaW5jbHVkZSA8bWFjaC9leGNlcHRpb24uaD4KKyNpbmNsdWRlIDxtYWNoL3ZtX2F0dHJpYnV0ZXMuaD4KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJ3YWl0LmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorCisjaWYgMAorI2luY2x1ZGUgPHNlcnZlcnMvbWFjaGlkX2xpYi5oPgorI2Vsc2UKKyNkZWZpbmUJTUFDSF9UWVBFX1RBU0sJCQkxCisjZGVmaW5lIE1BQ0hfVFlQRV9USFJFQUQJCTIKKyNlbmRpZgorCisvKiBJbmNsdWRlZCBvbmx5IGZvciBzaWduYWwgbmFtZXMgYW5kIE5TSUcKKyAqCisgKiBub3RlOiBUaGVyZSBhcmUgbWFueSBwcm9ibGVtcyBpbiBzaWduYWwgaGFuZGxpbmcgd2l0aAorICogICAgICAgZ2RiIGluIE1hY2ggMy4wIGluIGdlbmVyYWwuCisgKi8KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNkZWZpbmUgU0lHX1VOS05PV04gMAkvKiBFeGNlcHRpb24gdGhhdCBoYXMgbm8gbWF0Y2hpbmcgdW5peCBzaWduYWwgKi8KKworI2luY2x1ZGUgPGN0aHJlYWRzLmg+CisKKy8qIFRoaXMgaXMgd2hhdCBhIGNwcm9jIGxvb2tzIGxpa2UuICBUaGlzIGlzIGhlcmUgcGFydGx5IGJlY2F1c2UKKyAgIGN0aHJlYWRfaW50ZXJuYWxzLmggaXMgbm90IGEgaGVhZGVyIHdlIGNhbiBqdXN0ICNpbmNsdWRlLCBwYXJ0bHkgd2l0aAorICAgYW4gZXllIHRvd2FyZHMgcGVyaGFwcyBnZXR0aW5nIHRoaXMgdG8gd29yayB3aXRoIGNyb3NzLWRlYnVnZ2luZworICAgc29tZWRheS4gIEJlc3Qgc29sdXRpb24gaXMgaWYgQ01VIHB1Ymxpc2hlcyBhIHJlYWwgaW50ZXJmYWNlIHRvIHRoaXMKKyAgIHN0dWZmLiAgKi8KKyNkZWZpbmUgQ1BST0NfTkVYVF9PRkZTRVQgMAorI2RlZmluZSBDUFJPQ19ORVhUX1NJWkUgKFRBUkdFVF9QVFJfQklUIC8gSE9TVF9DSEFSX0JJVCkKKyNkZWZpbmUgQ1BST0NfSU5DQVJOQVRJT05fT0ZGU0VUIChDUFJPQ19ORVhUX09GRlNFVCArIENQUk9DX05FWFRfU0laRSkKKyNkZWZpbmUgQ1BST0NfSU5DQVJOQVRJT05fU0laRSAoc2l6ZW9mIChjdGhyZWFkX3QpKQorI2RlZmluZSBDUFJPQ19MSVNUX09GRlNFVCAoQ1BST0NfSU5DQVJOQVRJT05fT0ZGU0VUICsgQ1BST0NfSU5DQVJOQVRJT05fU0laRSkKKyNkZWZpbmUgQ1BST0NfTElTVF9TSVpFIChUQVJHRVRfUFRSX0JJVCAvIEhPU1RfQ0hBUl9CSVQpCisjZGVmaW5lIENQUk9DX1dBSVRfT0ZGU0VUIChDUFJPQ19MSVNUX09GRlNFVCArIENQUk9DX0xJU1RfU0laRSkKKyNkZWZpbmUgQ1BST0NfV0FJVF9TSVpFIChUQVJHRVRfUFRSX0JJVCAvIEhPU1RfQ0hBUl9CSVQpCisjZGVmaW5lIENQUk9DX1JFUExZX09GRlNFVCAoQ1BST0NfV0FJVF9PRkZTRVQgKyBDUFJPQ19XQUlUX1NJWkUpCisjZGVmaW5lIENQUk9DX1JFUExZX1NJWkUgKHNpemVvZiAobWFjaF9wb3J0X3QpKQorI2RlZmluZSBDUFJPQ19DT05URVhUX09GRlNFVCAoQ1BST0NfUkVQTFlfT0ZGU0VUICsgQ1BST0NfUkVQTFlfU0laRSkKKyNkZWZpbmUgQ1BST0NfQ09OVEVYVF9TSVpFIChUQVJHRVRfSU5UX0JJVCAvIEhPU1RfQ0hBUl9CSVQpCisjZGVmaW5lIENQUk9DX0xPQ0tfT0ZGU0VUIChDUFJPQ19DT05URVhUX09GRlNFVCArIENQUk9DX0NPTlRFWFRfU0laRSkKKyNkZWZpbmUgQ1BST0NfTE9DS19TSVpFIChzaXplb2YgKHNwaW5fbG9ja190KSkKKyNkZWZpbmUgQ1BST0NfU1RBVEVfT0ZGU0VUIChDUFJPQ19MT0NLX09GRlNFVCArIENQUk9DX0xPQ0tfU0laRSkKKyNkZWZpbmUgQ1BST0NfU1RBVEVfU0laRSAoVEFSR0VUX0lOVF9CSVQgLyBIT1NUX0NIQVJfQklUKQorI2RlZmluZSBDUFJPQ19XSVJFRF9PRkZTRVQgKENQUk9DX1NUQVRFX09GRlNFVCArIENQUk9DX1NUQVRFX1NJWkUpCisjZGVmaW5lIENQUk9DX1dJUkVEX1NJWkUgKHNpemVvZiAobWFjaF9wb3J0X3QpKQorI2RlZmluZSBDUFJPQ19CVVNZX09GRlNFVCAoQ1BST0NfV0lSRURfT0ZGU0VUICsgQ1BST0NfV0lSRURfU0laRSkKKyNkZWZpbmUgQ1BST0NfQlVTWV9TSVpFIChUQVJHRVRfSU5UX0JJVCAvIEhPU1RfQ0hBUl9CSVQpCisjZGVmaW5lIENQUk9DX01TR19PRkZTRVQgKENQUk9DX0JVU1lfT0ZGU0VUICsgQ1BST0NfQlVTWV9TSVpFKQorI2RlZmluZSBDUFJPQ19NU0dfU0laRSAoc2l6ZW9mIChtYWNoX21zZ19oZWFkZXJfdCkpCisjZGVmaW5lIENQUk9DX0JBU0VfT0ZGU0VUIChDUFJPQ19NU0dfT0ZGU0VUICsgQ1BST0NfTVNHX1NJWkUpCisjZGVmaW5lIENQUk9DX0JBU0VfU0laRSAoVEFSR0VUX0lOVF9CSVQgLyBIT1NUX0NIQVJfQklUKQorI2RlZmluZSBDUFJPQ19TSVpFX09GRlNFVCAoQ1BST0NfQkFTRV9PRkZTRVQgKyBDUFJPQ19CQVNFX1NJWkUpCisjZGVmaW5lIENQUk9DX1NJWkVfU0laRSAoVEFSR0VUX0lOVF9CSVQgLyBIT1NUX0NIQVJfQklUKQorI2RlZmluZSBDUFJPQ19TSVpFIChDUFJPQ19TSVpFX09GRlNFVCArIENQUk9DX1NJWkVfU0laRSkKKworLyogVmFsdWVzIGZvciB0aGUgc3RhdGUgZmllbGQgaW4gdGhlIGNwcm9jLiAgKi8KKyNkZWZpbmUgQ1BST0NfUlVOTklORwkwCisjZGVmaW5lIENQUk9DX1NXSVRDSElORyAxCisjZGVmaW5lIENQUk9DX0JMT0NLRUQJMgorI2RlZmluZSBDUFJPQ19DT05EV0FJVAk0CisKKy8qIEZvciBjcHJvYyBhbmQga2VybmVsIHRocmVhZCBtYXBwaW5nICovCit0eXBlZGVmIHN0cnVjdCBnZGJfdGhyZWFkIHsKKyAgbWFjaF9wb3J0X3QJbmFtZTsKKyAgQ09SRV9BRERSCXNwOworICBDT1JFX0FERFIJcGM7CisgIENPUkVfQUREUglmcDsKKyAgYm9vbGVhbl90ICAgICBpbl9lbXVsYXRvcjsKKyAgaW50CQlzbG90aWQ7CisKKyAgLyogVGhpcyBpcyBmb3IgdGhlIG10aHJlYWRzIGxpc3QuICBJdCBwb2ludHMgdG8gdGhlIGNwcm9jIGxpc3QuCisgICAgIFBlcmhhcHMgdGhlIHR3byBsaXN0cyBzaG91bGQgYmUgbWVyZ2VkIChvciBwZXJoYXBzIGl0IHdhcyBhIG1pc3Rha2UKKyAgICAgdG8gbWFrZSB0aGVtIGJvdGggdXNlIGEgc3RydWN0IGdkYl90aHJlYWQpLiAgKi8KKyAgc3RydWN0IGdkYl90aHJlYWQgKmNwcm9jOworCisgIC8qIFRoZXNlIGFyZSBmb3IgdGhlIGNwcm9jIGxpc3QsIHdoaWNoIGlzIGxpbmtlZCB0aHJvdWdoIHRoZSBuZXh0IGZpZWxkCisgICAgIG9mIHRoZSBzdHJ1Y3QgZ2RiX3RocmVhZC4gICovCisgIGNoYXIgcmF3X2Nwcm9jW0NQUk9DX1NJWkVdOworICAvKiBUaGUgY3RocmVhZCB3aGljaCBpcyBwb2ludGVkIHRvIGJ5IHRoZSBpbmNhcm5hdGlvbiBmaWVsZCBmcm9tIHRoZQorICAgICBjcHJvYy4gIFRoaXMgcG9pbnRzIHRvIHRoZSBjb3B5IHdlJ3ZlIHJlYWQgaW50byBHREIuICAqLworICBjdGhyZWFkX3QgY3RocmVhZDsKKyAgLyogUG9pbnQgYmFjayB0byB0aGUgbXRocmVhZHMgbGlzdC4gICovCisgIGludCByZXZlcnNlX21hcDsKKyAgc3RydWN0IGdkYl90aHJlYWQgKm5leHQ7Cit9ICpnZGJfdGhyZWFkX3Q7CisKKy8qIAorICogQWN0aW9ucyBmb3IgTWFjaCBleGNlcHRpb25zLgorICoKKyAqIHNpZ21hcCBmaWVsZCBtYXBzIHRoZSBleGNlcHRpb24gdG8gY29ycmVzcG9uZGluZyBVbml4IHNpZ25hbC4KKyAqCisgKiBJIGRvIG5vdCBrbm93IGhvdyB0byBtYXAgdGhlIGV4Y2VwdGlvbiB0byB1bml4IHNpZ25hbAorICogaWYgU0lHX1VOS05PV04gaXMgc3BlY2lmaWVkLgorICovCisKK3N0cnVjdCBleGNlcHRpb25fbGlzdCB7CisgIGNoYXIgKm5hbWU7CisgIGJvb2xlYW5fdCBmb3J3YXJkOworICBib29sZWFuX3QgcHJpbnQ7CisgIGludCAgICAgICBzaWdtYXA7Cit9IGV4Y2VwdGlvbl9tYXBbXSA9IHsKKyAgeyJub3RfbWFjaDNfZXhjZXB0aW9uIiwJRkFMU0UsIFRSVUUsICBTSUdfVU5LTk9XTn0sCisgIHsiRVhDX0JBRF9BQ0NFU1MiLAkJRkFMU0UsIFRSVUUsICBTSUdTRUdWfSwKKyAgeyJFWENfQkFEX0lOU1RSVUNUSU9OIiwJRkFMU0UsIFRSVUUsICBTSUdJTEx9LAorICB7IkVYQ19BUklUSE1FVElDIiwJCUZBTFNFLCBUUlVFLCAgU0lHRlBFfSwKKyAgeyJFWENfRU1VTEFUSU9OIiwJCUZBTFNFLCBUUlVFLCAgU0lHRU1UfSwJLyogPz8/ICovCisgIHsiRVhDX1NPRlRXQVJFIiwJCUZBTFNFLCBUUlVFLCAgU0lHX1VOS05PV059LAorICB7IkVYQ19CUkVBS1BPSU5UIiwJCUZBTFNFLCBGQUxTRSwgU0lHVFJBUH0KK307CisKKy8qIE1hY2ggZXhjZXB0aW9uIHRhYmxlIHNpemUgKi8KK2ludCBtYXhfZXhjZXB0aW9uID0gc2l6ZW9mKGV4Y2VwdGlvbl9tYXApL3NpemVvZihzdHJ1Y3QgZXhjZXB0aW9uX2xpc3QpIC0gMTsKKworI2RlZmluZSBNQVhfRVhDRVBUSU9OIG1heF9leGNlcHRpb24KKworV0FJVFRZUEUgd2FpdF9zdGF0dXM7CisKKy8qIElmIHlvdSBkZWZpbmUgdGhpcywgaW50ZXJjZXB0ZWQgYnNkIHNlcnZlciBjYWxscyB3aWxsIGJlCisgKiBkdW1wZWQgd2hpbGUgd2FpdGluZyB0aGUgaW5mZXJpb3IgdG8gRVhFQyB0aGUgY29ycmVjdAorICogcHJvZ3JhbQorICovCisvKiAjZGVmaW5lIERVTVBfU1lTQ0FMTAkJLyogZGVidWdnaW5nIGludGVyY2VwdG9yICovCisKKy8qIHh4X2RlYnVnKCkgb3V0cHV0cyBtZXNzYWdlcyBpZiB0aGlzIGlzIG5vbnplcm8uCisgKiBJZiA+IDEsIERVTVBfU1lTQ0FMTCB3aWxsIGR1bXAgbWVzc2FnZSBjb250ZW50cy4KKyAqLworaW50IGRlYnVnX2xldmVsID0gMDsKKworLyogIlRlbXBvcmFyeSIgZGVidWcgc3R1ZmYgKi8KK3ZvaWQKK3h4X2RlYnVnIChmbXQsIGEsYixjKQorY2hhciAqZm10OworaW50IGEsYixjOworeworICBpZiAoZGVidWdfbGV2ZWwpCisgICAgd2FybmluZyAoZm10LCBhLCBiLCBjKTsKK30KKworLyogVGhpcyBpcyBpbiBsaWJtYWNoLmEgKi8KK2V4dGVybiAgbWFjaF9wb3J0X3QgIG5hbWVfc2VydmVyX3BvcnQ7CisKKy8qIFNldCBpbiBjYXRjaF9leGNlcHRpb25fcmFpc2UgKi8KK2ludCBzdG9wX2V4Y2VwdGlvbiwgc3RvcF9jb2RlLCBzdG9wX3N1YmNvZGU7CitpbnQgc3RvcHBlZF9pbl9leGNlcHRpb247CisKKy8qIFRocmVhZCB0aGF0IHdhcyB0aGUgYWN0aXZlIHRocmVhZCB3aGVuIHdlIHN0b3BwZWQgKi8KK3RocmVhZF90IHN0b3BfdGhyZWFkID0gTUFDSF9QT1JUX05VTEw7CisKK2NoYXIgKmhvc3RuYW1lID0gIiI7CisKKy8qIFNldCB3aGVuIHRhc2sgaXMgYXR0YWNoZWQgb3IgY3JlYXRlZCAqLworYm9vbGVhbl90IGVtdWxhdG9yX3ByZXNlbnQgPSBGQUxTRTsKKwordGFza190ICAgaW5mZXJpb3JfdGFzazsKK3RocmVhZF90IGN1cnJlbnRfdGhyZWFkOworCisvKiBFeGNlcHRpb24gcG9ydHMgZm9yIGluZmVyaW9yIHRhc2sgKi8KK21hY2hfcG9ydF90IGluZmVyaW9yX2V4Y2VwdGlvbl9wb3J0ICAgICA9IE1BQ0hfUE9SVF9OVUxMOworbWFjaF9wb3J0X3QgaW5mZXJpb3Jfb2xkX2V4Y2VwdGlvbl9wb3J0ID0gTUFDSF9QT1JUX05VTEw7CisKKy8qIHRhc2sgZXhjZXB0aW9ucyBhbmQgbm90aWZpY2F0aW9ucyAqLworbWFjaF9wb3J0X3QgaW5mZXJpb3Jfd2FpdF9wb3J0X3NldAk9IE1BQ0hfUE9SVF9OVUxMOworbWFjaF9wb3J0X3Qgb3VyX25vdGlmeV9wb3J0ICAgICAgIAk9IE1BQ0hfUE9SVF9OVUxMOworCisvKiBUaGlzIGlzICJpbmZlcmlvcl93YWl0X3BvcnRfc2V0IiB3aGVuIG5vdCBzaW5nbGUgc3RlcHBpbmcsIGFuZAorICogICAgICAgICAic2luZ2xlc3RlcHBlZF90aHJlYWRfcG9ydCIgd2hlbiB3ZSBhcmUgc2luZ2xlIHN0ZXBwaW5nLgorICogCisgKiBUaGlzIGlzIHByb3RlY3RlZCBieSBhIGNsZWFudXAgZnVuY3Rpb246IGRpc2NhcmRfc2luZ2xlX3N0ZXAoKQorICovCittYWNoX3BvcnRfdCBjdXJyZW50bHlfd2FpdGluZ19mb3IJPSBNQUNIX1BPUlRfTlVMTDsKKworLyogQSBwb3J0IGZvciBleHRlcm5hbCBtZXNzYWdlcyB0byBnZGIuCisgKiBFeHRlcm5hbCBpbiB0aGUgbWVhbmluZyB0aGF0IHRoZXkgZG8gbm90IGNvbWUKKyAqIGZyb20gdGhlIGluZmVyaW9yX3Rhc2ssIGJ1dCByYXRoZXIgZnJvbSBleHRlcm5hbAorICogdGFza3MuCisgKgorICogQXMgYSBkZWJ1Z2dpbmcgZmVhdHVyZToKKyAqIEEgZGVidWdnZXIgZGVidWdnaW5nIGFub3RoZXIgZGVidWdnZXIgY2FuIHN0b3AgdGhlCisgKiBpbmZlcmlvciBkZWJ1Z2dlciBieSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgc2VxdWVuY2UKKyAqICh3aXRob3V0IHJ1bm5pbmcgZXh0ZXJuYWwgcHJvZ3JhbXMpCisgKgorICogICAgKHRvcC1nZGIpIHNldCBzdG9wX2luZmVyaW9yX2dkYiAoKQorICogICAgKHRvcC1nZGIpIGNvbnRpbnVlCisgKi8KK21hY2hfcG9ydF90IG91cl9tZXNzYWdlX3BvcnQgICAgICAgCT0gTUFDSF9QT1JUX05VTEw7CisKKy8qIEZvciBzaW5nbGUgc3RlcHBpbmcgKi8KK21hY2hfcG9ydF90IHRocmVhZF9leGNlcHRpb25fcG9ydCAJPSBNQUNIX1BPUlRfTlVMTDsKK21hY2hfcG9ydF90IHRocmVhZF9zYXZlZF9leGNlcHRpb25fcG9ydCA9IE1BQ0hfUE9SVF9OVUxMOworbWFjaF9wb3J0X3Qgc2luZ2xlc3RlcHBlZF90aHJlYWRfcG9ydCAgID0gTUFDSF9QT1JUX05VTEw7CisKKy8qIEZvciBtYWNoaWQgY2FsbHMgKi8KK21hY2hfcG9ydF90IG1pZF9zZXJ2ZXIgPSBNQUNIX1BPUlRfTlVMTDsKK21hY2hfcG9ydF90IG1pZF9hdXRoICAgPSBNQUNIX1BPUlRfTlVMTDsKKworLyogSWYgZ2RiIHRoaW5rcyB0aGUgaW5mZXJpb3IgdGFzayBpcyBub3Qgc3VzcGVuZGVkLCBpdAorICogbXVzdCB0YWtlIHN1c3BlbmQvYWJvcnQgdGhlIHRocmVhZHMgd2hlbiBpdCByZWFkcyB0aGUgc3RhdGUuCisgKi8KK2ludCBtdXN0X3N1c3BlbmRfdGhyZWFkID0gMDsKKworLyogV2hlbiBzaW5nbGUgc3RlcHBpbmcsIHdlIHN3aXRjaCB0aGUgcG9ydCB0aGF0IG1hY2hfcmVhbGx5X3dhaXQoKSBsaXN0ZW5zIHRvLgorICogVGhpcyBjbGVhbnVwIGlzIGEgZ3VhcmQgdG8gcHJldmVudCB0aGUgcG9ydCBzZXQgZnJvbSBiZWluZyBsZWZ0IHRvCisgKiB0aGUgc2luZ2xlc3RlcHBlZF90aHJlYWRfcG9ydCB3aGVuIGVycm9yKCkgaXMgY2FsbGVkLgorICogIFRoaXMgaXMgbm9uemVybyBvbmx5IHdoZW4gd2UgYXJlIHNpbmdsZSBzdGVwcGluZy4KKyAqLworI2RlZmluZSBOVUxMX0NMRUFOVVAgKHN0cnVjdCBjbGVhbnVwICopMAorc3RydWN0IGNsZWFudXAgKmNsZWFudXBfc3RlcCA9IE5VTExfQ0xFQU5VUDsKKworDAorc3RhdGljIHN0cnVjdCB0YXJnZXRfb3BzIG0zX29wczsKKworc3RhdGljIHZvaWQgbTNfa2lsbF9pbmZlcmlvciAoKTsKKwwKKyNpZiAwCisjZGVmaW5lIE1BQ0hfVFlQRV9FWENFUFRJT05fUE9SVAktMQorI2VuZGlmCisKKy8qIENoYWluIG9mIHBvcnRzIHRvIHJlbWVtYmVyIHJlcXVlc3RlZCBub3RpZmljYXRpb25zLiAqLworCitzdHJ1Y3QgcG9ydF9jaGFpbiB7CisgIHN0cnVjdCBwb3J0X2NoYWluICpuZXh0OworICBtYWNoX3BvcnRfdAkgICAgIHBvcnQ7CisgIGludAkJICAgICB0eXBlOworICBpbnQJCSAgICAgbWlkOyAgLyogTm93IG9ubHkgdmFsaWQgd2l0aCBNQUNIX1RZUEVfVEhSRUFEIGFuZCAqLworICAJCQkgICAvKiAgTUFDSF9UWVBFX1RIUkVBRCAqLworfTsKK3R5cGVkZWYgc3RydWN0IHBvcnRfY2hhaW4gKnBvcnRfY2hhaW5fdDsKKworLyogUm9vbSBmb3IgY2hhaW4gbm9kZXMgY29tZXMgZnJvbSBwY2hhaW5fb2JzdGFjayAqLworc3RydWN0IG9ic3RhY2sgcGNoYWluX29ic3RhY2s7CitzdHJ1Y3Qgb2JzdGFjayAqcG9ydF9jaGFpbl9vYnN0YWNrID0gJnBjaGFpbl9vYnN0YWNrOworCisvKiBGb3IgdGhyZWFkIGhhbmRsaW5nICovCitzdHJ1Y3Qgb2JzdGFjayBDcHJvY19vYnN0YWNrOworc3RydWN0IG9ic3RhY2sgKmNwcm9jX29ic3RhY2sgPSAmQ3Byb2Nfb2JzdGFjazsKKworLyogdGhlIGxpc3Qgb2Ygbm90aWZpZWQgcG9ydHMgKi8KK3BvcnRfY2hhaW5fdCBub3RpZnlfY2hhaW4gPSAocG9ydF9jaGFpbl90KSBOVUxMOworCitwb3J0X2NoYWluX3QKK3BvcnRfY2hhaW5faW5zZXJ0IChsaXN0LCBuYW1lLCB0eXBlKQorICAgICBwb3J0X2NoYWluX3QgbGlzdDsKKyAgICAgbWFjaF9wb3J0X3QgbmFtZTsKKyAgICAgaW50CSB0eXBlOworeworICBrZXJuX3JldHVybl90IHJldDsKKyAgcG9ydF9jaGFpbl90IG5ldzsKKyAgaW50IG1pZDsKKworICBpZiAoISBNQUNIX1BPUlRfVkFMSUQgKG5hbWUpKQorICAgIHJldHVybiBsaXN0OworICAKKyAgaWYgKHR5cGUgPT0gTUFDSF9UWVBFX1RBU0sgfHwgdHlwZSA9PSBNQUNIX1RZUEVfVEhSRUFEKQorICAgIHsKKyAgICAgIGlmICghIE1BQ0hfUE9SVF9WQUxJRCAobWlkX3NlcnZlcikpCisJeworCSAgd2FybmluZyAoIk1hY2hpZCBzZXJ2ZXIgcG9ydCBpbnZhbGlkLCBjYW4gbm90IG1hcCBwb3J0IDB4JXggdG8gTUlEIiwKKwkJICAgbmFtZSk7CisJICBtaWQgPSBuYW1lOworCX0KKyAgICAgIGVsc2UKKwl7CisJICByZXQgPSBtYWNoaWRfbWFjaF9yZWdpc3RlciAobWlkX3NlcnZlciwgbWlkX2F1dGgsIG5hbWUsIHR5cGUsICZtaWQpOworCSAgCisJICBpZiAocmV0ICE9IEtFUk5fU1VDQ0VTUykKKwkgICAgeworCSAgICAgIHdhcm5pbmcgKCJDYW4gbm90IG1hcCBuYW1lICgweCV4KSB0byBNSUQgd2l0aCBtYWNoaWQiLCBuYW1lKTsKKwkgICAgICBtaWQgPSBuYW1lOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIGFib3J0ICgpOworCisgIG5ldyA9IChwb3J0X2NoYWluX3QpIG9ic3RhY2tfYWxsb2MgKHBvcnRfY2hhaW5fb2JzdGFjaywKKwkJCQkgICAgICBzaXplb2YgKHN0cnVjdCBwb3J0X2NoYWluKSk7CisgIG5ldy0+bmV4dCAgPSBsaXN0OworICBuZXctPnBvcnQgID0gbmFtZTsKKyAgbmV3LT50eXBlICA9IHR5cGU7CisgIG5ldy0+bWlkICAgPSBtaWQ7CisKKyAgcmV0dXJuIG5ldzsKK30KKworcG9ydF9jaGFpbl90Citwb3J0X2NoYWluX2RlbGV0ZSAobGlzdCwgZWxlbSkKKyAgICAgcG9ydF9jaGFpbl90IGxpc3Q7CisgICAgIG1hY2hfcG9ydF90IGVsZW07Cit7CisgIGlmIChsaXN0KQorICAgIGlmIChsaXN0LT5wb3J0ID09IGVsZW0pCisgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICBlbHNlCisgICAgICB3aGlsZSAobGlzdC0+bmV4dCkKKwl7CisJICBpZiAobGlzdC0+bmV4dC0+cG9ydCA9PSBlbGVtKQorCSAgICBsaXN0LT5uZXh0ID0gbGlzdC0+bmV4dC0+bmV4dDsgLyogR0NkIHdpdGggb2JzdGFja19mcmVlKCkgKi8KKwkgIGVsc2UKKwkgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisJfQorICByZXR1cm4gbGlzdDsKK30KKwordm9pZAorcG9ydF9jaGFpbl9kZXN0cm95IChvc3RhY2spCisgICAgIHN0cnVjdCBvYnN0YWNrICpvc3RhY2s7Cit7CisgIG9ic3RhY2tfZnJlZSAob3N0YWNrLCAwKTsKKyAgb2JzdGFja19pbml0IChvc3RhY2spOworfQorCitwb3J0X2NoYWluX3QKK3BvcnRfY2hhaW5fbWVtYmVyIChsaXN0LCBlbGVtKQorICAgICBwb3J0X2NoYWluX3QgbGlzdDsKKyAgICAgbWFjaF9wb3J0X3QgZWxlbTsKK3sKKyAgd2hpbGUgKGxpc3QpCisgICAgeworICAgICAgaWYgKGxpc3QtPnBvcnQgPT0gZWxlbSkKKwlyZXR1cm4gbGlzdDsKKyAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgIH0KKyAgcmV0dXJuIChwb3J0X2NoYWluX3QpIE5VTEw7Cit9CisMCitpbnQKK21hcF9wb3J0X25hbWVfdG9fbWlkIChuYW1lLCB0eXBlKQorbWFjaF9wb3J0X3QgbmFtZTsKK2ludCAgICAgICAgIHR5cGU7Cit7CisgIHBvcnRfY2hhaW5fdCBlbGVtOworCisgIGlmICghTUFDSF9QT1JUX1ZBTElEIChuYW1lKSkKKyAgICByZXR1cm4gLTE7CisKKyAgZWxlbSA9IHBvcnRfY2hhaW5fbWVtYmVyIChub3RpZnlfY2hhaW4sIG5hbWUpOworCisgIGlmIChlbGVtICYmIChlbGVtLT50eXBlID09IHR5cGUpKQorICAgIHJldHVybiBlbGVtLT5taWQ7CisgIAorICBpZiAoZWxlbSkKKyAgICByZXR1cm4gLTE7CisgIAorICBpZiAoISBNQUNIX1BPUlRfVkFMSUQgKG1pZF9zZXJ2ZXIpKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJNYWNoaWQgc2VydmVyIHBvcnQgaW52YWxpZCwgY2FuIG5vdCBtYXAgcG9ydCAweCV4IHRvIG1pZCIsCisJICAgICAgIG5hbWUpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBtaWQ7CisgICAgICBrZXJuX3JldHVybl90IHJldDsKKworICAgICAgcmV0ID0gbWFjaGlkX21hY2hfcmVnaXN0ZXIgKG1pZF9zZXJ2ZXIsIG1pZF9hdXRoLCBuYW1lLCB0eXBlLCAmbWlkKTsKKyAgICAgIAorICAgICAgaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpCisJeworCSAgd2FybmluZyAoIkNhbiBub3QgbWFwIG5hbWUgKDB4JXgpIHRvIG1pZCB3aXRoIG1hY2hpZCIsIG5hbWUpOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIHJldHVybiBtaWQ7CisgICAgfQorfQorDAorLyogR3VhcmQgZm9yIGN1cnJlbnRseV93YWl0aW5nX2ZvciBhbmQgc2luZ2xlc3RlcHBlZF90aHJlYWRfcG9ydCAqLworc3RhdGljIHZvaWQKK2Rpc2NhcmRfc2luZ2xlX3N0ZXAgKHRocmVhZCkKKyAgICAgdGhyZWFkX3QgdGhyZWFkOworeworICBjdXJyZW50bHlfd2FpdGluZ19mb3IgPSBpbmZlcmlvcl93YWl0X3BvcnRfc2V0OworCisgIGNsZWFudXBfc3RlcCA9IE5VTExfQ0xFQU5VUDsKKyAgaWYgKE1BQ0hfUE9SVF9WQUxJRCAodGhyZWFkKSAmJiBNQUNIX1BPUlRfVkFMSUQgKHNpbmdsZXN0ZXBwZWRfdGhyZWFkX3BvcnQpKQorICAgIHNldHVwX3NpbmdsZV9zdGVwICh0aHJlYWQsIEZBTFNFKTsKK30KKworc2V0dXBfc2luZ2xlX3N0ZXAgKHRocmVhZCwgc3RhcnRfc3RlcCkKKyAgICAgdGhyZWFkX3QgIHRocmVhZDsKKyAgICAgYm9vbGVhbl90IHN0YXJ0X3N0ZXA7Cit7CisgIGtlcm5fcmV0dXJuX3QgcmV0OworCisgIGlmICghIE1BQ0hfUE9SVF9WQUxJRCAodGhyZWFkKSkKKyAgICBlcnJvciAoIkludmFsaWQgdGhyZWFkIHN1cHBsaWVkIHRvIHNldHVwX3NpbmdsZV9zdGVwIik7CisgIGVsc2UKKyAgICB7CisgICAgICBtYWNoX3BvcnRfdCB0ZXBvcnQ7CisKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCB0aHJlYWQgZXhjZXB0aW9uIHBvcnQgKi8KKyAgICAgIHJldCA9IHRocmVhZF9nZXRfZXhjZXB0aW9uX3BvcnQgKHRocmVhZCwgJnRlcG9ydCk7CisgICAgICBDSEsgKCJHZXR0aW5nIHRocmVhZCdzIGV4Y2VwdGlvbiBwb3J0IiwgcmV0KTsKKwkgIAorICAgICAgaWYgKHN0YXJ0X3N0ZXApCisJeworCSAgaWYgKE1BQ0hfUE9SVF9WQUxJRCAoc2luZ2xlc3RlcHBlZF90aHJlYWRfcG9ydCkpCisJICAgIHsKKwkgICAgICB3YXJuaW5nICgiU2luZ2xlc3RlcHBlZF90aHJlYWRfcG9ydCAoMHgleCkgaXMgc3RpbGwgdmFsaWQ/IiwKKwkJICAgICAgIHNpbmdsZXN0ZXBwZWRfdGhyZWFkX3BvcnQpOworCSAgICAgIHNpbmdsZXN0ZXBwZWRfdGhyZWFkX3BvcnQgPSBNQUNIX1BPUlRfTlVMTDsKKwkgICAgfQorICAgICAgCisJICAvKiBJZiB3ZSBhcmUgYWxyZWFkeSBzdGVwcGluZyB0aGlzIHRocmVhZCAqLworCSAgaWYgKE1BQ0hfUE9SVF9WQUxJRCAodGVwb3J0KSAmJiB0ZXBvcnQgPT0gdGhyZWFkX2V4Y2VwdGlvbl9wb3J0KQorCSAgICB7CisJICAgICAgcmV0ID0gbWFjaF9wb3J0X2RlYWxsb2NhdGUgKG1hY2hfdGFza19zZWxmICgpLCB0ZXBvcnQpOworCSAgICAgIENISyAoIkNvdWxkIG5vdCBkZWFsbG9jYXRlIHRocmVhZCBleGNlcHRpb24gcG9ydCIsIHJldCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHJldCA9IHRocmVhZF9zZXRfZXhjZXB0aW9uX3BvcnQgKHRocmVhZCwgdGhyZWFkX2V4Y2VwdGlvbl9wb3J0KTsKKwkgICAgICBDSEsgKCJTZXR0aW5nIGV4Y2VwdGlvbiBwb3J0IGZvciB0aHJlYWQiLCByZXQpOworI2lmIDAKKwkgICAgICAvKiBJbnNlcnQgdGhyZWFkIGV4Y2VwdGlvbiBwb3J0IHRvIHdhaXQgcG9ydCBzZXQgKi8KKwkgICAgICByZXQgPSBtYWNoX3BvcnRfbW92ZV9tZW1iZXIgKG1hY2hfdGFza19zZWxmKCksIAorCQkJCQkgICB0aHJlYWRfZXhjZXB0aW9uX3BvcnQsCisJCQkJCSAgIGluZmVyaW9yX3dhaXRfcG9ydF9zZXQpOworCSAgICAgIENISyAoIk1vdmluZyB0aHJlYWQgZXhjZXB0aW9uIHBvcnQgdG8gaW5mZXJpb3Jfd2FpdF9wb3J0X3NldCIsCisJCSAgIHJldCk7CisjZW5kaWYKKwkgICAgICB0aHJlYWRfc2F2ZWRfZXhjZXB0aW9uX3BvcnQgPSB0ZXBvcnQ7CisJICAgIH0KKwkgIAorCSAgdGhyZWFkX3RyYWNlICh0aHJlYWQsIFRSVUUpOworCSAgCisJICBzaW5nbGVzdGVwcGVkX3RocmVhZF9wb3J0ICAgPSB0aHJlYWRfZXhjZXB0aW9uX3BvcnQ7CisJICBjdXJyZW50bHlfd2FpdGluZ19mb3IgICAgICAgPSBzaW5nbGVzdGVwcGVkX3RocmVhZF9wb3J0OworCSAgY2xlYW51cF9zdGVwID0gbWFrZV9jbGVhbnVwIChkaXNjYXJkX3NpbmdsZV9zdGVwLCB0aHJlYWQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoISBNQUNIX1BPUlRfVkFMSUQgKHRlcG9ydCkpCisJICAgIGVycm9yICgiU2luZ2xlIHN0ZXBwZWQgdGhyZWFkIGhhZCBhbiBpbnZhbGlkIGV4Y2VwdGlvbiBwb3J0PyIpOworCisJICBpZiAodGVwb3J0ICE9IHRocmVhZF9leGNlcHRpb25fcG9ydCkKKwkgICAgZXJyb3IgKCJTaW5nbGUgc3RlcHBlZCB0aHJlYWQgaGFkIGFuIHVua25vd24gZXhjZXB0aW9uIHBvcnQ/Iik7CisJICAKKwkgIHJldCA9IG1hY2hfcG9ydF9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwgdGVwb3J0KTsKKwkgIENISyAoIkNvdWxkbid0IGRlYWxsb2NhdGUgdGhyZWFkIGV4Y2VwdGlvbiBwb3J0IiwgcmV0KTsKKyNpZiAwCisJICAvKiBSZW1vdmUgdGhyZWFkIGV4Y2VwdGlvbiBwb3J0IGZyb20gd2FpdCBwb3J0IHNldCAqLworCSAgcmV0ID0gbWFjaF9wb3J0X21vdmVfbWVtYmVyIChtYWNoX3Rhc2tfc2VsZigpLCAKKwkJCQkgICAgICAgdGhyZWFkX2V4Y2VwdGlvbl9wb3J0LAorCQkJCSAgICAgICBNQUNIX1BPUlRfTlVMTCk7CisJICBDSEsgKCJSZW1vdmluZyB0aHJlYWQgZXhjZXB0aW9uIHBvcnQgZnJvbSBpbmZlcmlvcl93YWl0X3BvcnRfc2V0IiwKKwkgICAgICAgcmV0KTsKKyNlbmRpZgkgIAorCSAgLyogUmVzdG9yZSB0aHJlYWQncyBvbGQgZXhjZXB0aW9uIHBvcnQgKi8KKwkgIHJldCA9IHRocmVhZF9zZXRfZXhjZXB0aW9uX3BvcnQgKHRocmVhZCwKKwkJCQkJICAgdGhyZWFkX3NhdmVkX2V4Y2VwdGlvbl9wb3J0KTsKKwkgIENISyAoIlJlc3RvcmluZyBzdGVwcGVkIHRocmVhZCdzIGV4Y2VwdGlvbiBwb3J0IiwgcmV0KTsKKwkgIAorCSAgaWYgKE1BQ0hfUE9SVF9WQUxJRCAodGhyZWFkX3NhdmVkX2V4Y2VwdGlvbl9wb3J0KSkKKwkgICAgKHZvaWQpIG1hY2hfcG9ydF9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwKKwkJCQkJIHRocmVhZF9zYXZlZF9leGNlcHRpb25fcG9ydCk7CisJICAKKwkgIHRocmVhZF90cmFjZSAodGhyZWFkLCBGQUxTRSk7CisJICAKKwkgIHNpbmdsZXN0ZXBwZWRfdGhyZWFkX3BvcnQgPSBNQUNIX1BPUlRfTlVMTDsKKwkgIGN1cnJlbnRseV93YWl0aW5nX2ZvciA9IGluZmVyaW9yX3dhaXRfcG9ydF9zZXQ7CisJICBpZiAoY2xlYW51cF9zdGVwKQorCSAgICBkaXNjYXJkX2NsZWFudXBzIChjbGVhbnVwX3N0ZXApOworCX0KKyAgICB9Cit9CisMCitzdGF0aWMKK3JlcXVlc3Rfbm90aWZ5IChuYW1lLCB2YXJpYW50LCB0eXBlKQorICAgICBtYWNoX3BvcnRfdAluYW1lOworICAgICBtYWNoX21zZ19pZF90CXZhcmlhbnQ7CisgICAgIGludAkgICAgICAgIHR5cGU7Cit7CisgIGtlcm5fcmV0dXJuX3QgcmV0OworICBtYWNoX3BvcnRfdAlwcmV2aW91c19wb3J0X2R1bW15ID0gTUFDSF9QT1JUX05VTEw7CisgIAorICBpZiAoISBNQUNIX1BPUlRfVkFMSUQgKG5hbWUpKQorICAgIHJldHVybjsKKyAgCisgIGlmIChwb3J0X2NoYWluX21lbWJlciAobm90aWZ5X2NoYWluLCBuYW1lKSkKKyAgICByZXR1cm47CisKKyAgcmV0ID0gbWFjaF9wb3J0X3JlcXVlc3Rfbm90aWZpY2F0aW9uIChtYWNoX3Rhc2tfc2VsZigpLAorCQkJCQluYW1lLAorCQkJCQl2YXJpYW50LAorCQkJCQkxLAorCQkJCQlvdXJfbm90aWZ5X3BvcnQsCisJCQkJCU1BQ0hfTVNHX1RZUEVfTUFLRV9TRU5EX09OQ0UsCisJCQkJCSZwcmV2aW91c19wb3J0X2R1bW15KTsKKyAgQ0hLICgiU2VyaW91czogcmVxdWVzdF9ub3RpZnkgZmFpbGVkIiwgcmV0KTsKKworICAodm9pZCkgbWFjaF9wb3J0X2RlYWxsb2NhdGUgKG1hY2hfdGFza19zZWxmICgpLAorCQkJICAgICAgIHByZXZpb3VzX3BvcnRfZHVtbXkpOworCisgIG5vdGlmeV9jaGFpbiA9IHBvcnRfY2hhaW5faW5zZXJ0IChub3RpZnlfY2hhaW4sIG5hbWUsIHR5cGUpOworfQorCityZXZlcnNlX21zZ19iaXRzKG1zZ3AsIHR5cGUpCisgICAgIG1hY2hfbXNnX2hlYWRlcl90CSptc2dwOworICAgICBpbnQgdHlwZTsKK3sKKyAgaW50CQlyYml0cyxsYml0czsKKyAgcmJpdHMgPSBNQUNIX01TR0hfQklUU19SRU1PVEUobXNncC0+bXNnaF9iaXRzKTsKKyAgbGJpdHMgPSB0eXBlOworICBtc2dwLT5tc2doX2JpdHMgPQorICAgIChtc2dwLT5tc2doX2JpdHMgJiB+TUFDSF9NU0dIX0JJVFNfUE9SVFNfTUFTSykgfAorICAgICAgTUFDSF9NU0dIX0JJVFMobGJpdHMscmJpdHMpOworfQorDAorLyogT24gdGhlIHRoaXJkIGRheSBIZSBzYWlkOgorCisgICAJTGV0IHRoaXMgYmUgZ2xvYmFsCisJYW5kIHRoZW4gaXQgd2FzIGdsb2JhbC4KKworICAgV2hlbiBjcmVhdGluZyB0aGUgaW5mZXJpb3IgZm9yaywgdGhlCisgICBjaGlsZCBjb2RlIGluIGluZmxvdy5jIHNldHMgdGhlIG5hbWUgb2YgdGhlCisgICBib290c3RyYXBfcG9ydCBpbiBpdHMgYWRkcmVzcyBzcGFjZSB0byB0aGlzCisgICB2YXJpYWJsZS4KKworICAgVGhlIG5hbWUgaXMgdHJhbnNmZXJyZWQgdG8gb3VyIGFkZHJlc3Mgc3BhY2UKKyAgIHdpdGggbWFjaDNfcmVhZF9pbmZlcmlvcigpLgorCisgICBUaG91IHNoYWx0IG5vdCBkbyB0aGlzIHdpdGgKKyAgIHRhc2tfZ2V0X2Jvb3RzdHJhcF9wb3J0KCkgaW4gdGhpcyB0YXNrLCBzaW5jZQorICAgdGhlIG5hbWUgaW4gdGhlIGluZmVyaW9yIHRhc2sgaXMgZGlmZmVyZW50IHRoYW4KKyAgIHRoZSBvbmUgd2UgZ2V0LgorCisgICBGb3IgYmxlc3NlZCBhcmUgdGhlIG1lZWssIGFzIHRoZXkgc2hhbGwgaW5oZXJpdAorICAgdGhlIGFkZHJlc3Mgc3BhY2UuCisgKi8KK21hY2hfcG9ydF90IG9yaWdpbmFsX3NlcnZlcl9wb3J0X25hbWUgPSBNQUNIX1BPUlRfTlVMTDsKKworCisvKiBDYWxsZWQgZnJvbSBpbmZlcmlvciBhZnRlciBGT1JLIGJ1dCBiZWZvcmUgRVhFQyAqLworc3RhdGljIHZvaWQKK20zX3RyYWNlX21lICgpCit7CisgIGtlcm5fcmV0dXJuX3QgcmV0OworICAKKyAgLyogR2V0IHRoZSBOQU1FIG9mIHRoZSBib290c3RyYXAgcG9ydCBpbiB0aGlzIHRhc2sKKyAgICAgc28gdGhhdCBHREIgY2FuIHJlYWQgaXQgKi8KKyAgcmV0ID0gdGFza19nZXRfYm9vdHN0cmFwX3BvcnQgKG1hY2hfdGFza19zZWxmICgpLAorCQkJCSAmb3JpZ2luYWxfc2VydmVyX3BvcnRfbmFtZSk7CisgIGlmIChyZXQgIT0gS0VSTl9TVUNDRVNTKQorICAgIGFib3J0ICgpOworICByZXQgPSBtYWNoX3BvcnRfZGVhbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYgKCksCisJCQkgICAgICBvcmlnaW5hbF9zZXJ2ZXJfcG9ydF9uYW1lKTsKKyAgaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpCisgICAgYWJvcnQgKCk7CisgIAorICAvKiBTdXNwZW5kIHRoaXMgdGFzayB0byBsZXQgdGhlIHBhcmVudCBjaGFuZ2UgbXkgcG9ydHMuCisgICAgIFJlc3VtZWQgYnkgdGhlIGRlYnVnZ2VyICovCisgIHJldCA9IHRhc2tfc3VzcGVuZCAobWFjaF90YXNrX3NlbGYgKCkpOworICBpZiAocmV0ICE9IEtFUk5fU1VDQ0VTUykKKyAgICBhYm9ydCAoKTsKK30KKwwKKy8qCisgKiBJbnRlcmNlcHQgc3lzdGVtIGNhbGxzIHRvIFVuaXggc2VydmVyLgorICogQWZ0ZXIgRVhFQ19DT1VOVEVSIGNhbGxzIHRvIGV4ZWMoKSwgcmV0dXJuLgorICoKKyAqIFByZS1hc3NlcnRpb246ICBDaGlsZCBpcyBzdXNwZW5kZWQuIChOb3QgdmVyaWZpZWQpCisgKiBQb3N0LWNvbmRpdGlvbjogQ2hpbGQgaXMgc3VzcGVuZGVkIGFmdGVyIEVYRUNfQ09VTlRFUiBleGVjKCkgY2FsbHMuCisgKi8KKwordm9pZAoraW50ZXJjZXB0X2V4ZWNfY2FsbHMgKGV4ZWNfY291bnRlcikKKyAgICAgaW50IGV4ZWNfY291bnRlcjsKK3sKKyAgaW50IHRlcm1pbmFsX2luaXR0ZWQgPSAwOworCisgIHN0cnVjdCBzeXNjYWxsX21zZ190IHsKKyAgICBtYWNoX21zZ19oZWFkZXJfdAloZWFkZXI7CisgICAgbWFjaF9tc2dfdHlwZV90IAl0eXBlOworICAgIGNoYXIgcm9vbVsgMjAwMCBdOwkvKiBFbnVmZiBzcGFjZSAqLworICB9OworCisgIHN0cnVjdCBzeXNjYWxsX21zZ190IHN5c2NhbGxfaW4sIHN5c2NhbGxfb3V0OworCisgIG1hY2hfcG9ydF90IGZha2Vfc2VydmVyOworICBtYWNoX3BvcnRfdCBvcmlnaW5hbF9zZXJ2ZXJfc2VuZDsKKyAgbWFjaF9wb3J0X3Qgb3JpZ2luYWxfZXhlY19yZXBseTsKKyAgbWFjaF9wb3J0X3QgZXhlY19yZXBseTsKKyAgbWFjaF9wb3J0X3QgZXhlY19yZXBseV9zZW5kOworICBtYWNoX21zZ190eXBlX25hbWVfdCBhY3F1aXJlZDsKKyAgbWFjaF9wb3J0X3QgZW11bGF0b3Jfc2VydmVyX3BvcnRfbmFtZTsKKyAgc3RydWN0IHRhc2tfYmFzaWNfaW5mbyBpbmZvOworICBtYWNoX21zZ190eXBlX251bWJlcl90IGluZm9fY291bnQ7CisKKyAga2Vybl9yZXR1cm5fdCByZXQ7CisKKyAgaWYgKGV4ZWNfY291bnRlciA8PSAwKQorICAgIHJldHVybjsJCS8qIFdlIGFyZSBhbHJlYWR5IHNldCB1cCBpbiB0aGUgY29ycmVjdCBwcm9ncmFtICovCisKKyAgcmV0ID0gbWFjaF9wb3J0X2FsbG9jYXRlKG1hY2hfdGFza19zZWxmKCksIAorCQkJICAgTUFDSF9QT1JUX1JJR0hUX1JFQ0VJVkUsCisJCQkgICAmZmFrZV9zZXJ2ZXIpOworICBDSEsoImNyZWF0ZSBpbmZlcmlvcl9mYWtlX3NlcnZlciBwb3J0IGZhaWxlZCIsIHJldCk7CisgIAorICAvKiBXYWl0IGZvciBpbmZlcmlvcl90YXNrIHRvIHN1c3BlbmQgaXRzZWxmICovCisgIHdoaWxlKDEpCisgICAgeworICAgICAgaW5mb19jb3VudCA9IHNpemVvZiAoaW5mbyk7CisgICAgICByZXQgPSB0YXNrX2luZm8gKGluZmVyaW9yX3Rhc2ssCisJCSAgICAgICBUQVNLX0JBU0lDX0lORk8sCisJCSAgICAgICAodGFza19pbmZvX3QpJmluZm8sCisJCSAgICAgICAmaW5mb19jb3VudCk7CisgICAgICBDSEsgKCJUYXNrIGluZm8iLCByZXQpOworCisgICAgICBpZiAoaW5mby5zdXNwZW5kX2NvdW50KQorCWJyZWFrOworCisgICAgICAvKiBOb3RlIHRoYXQgdGhlIGRlZmluaXRpb24gb2YgdGhlIHBhcmFtZXRlciB3YXMgdW5kZWZpbmVkCisgICAgICAgKiBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIHNvIEkganVzdCB1c2UgYW4gYGFkIGhvYycgdmFsdWUuCisgICAgICAgKi8KKyAgICAgICh2b2lkKSBzd3RjaF9wcmkgKDQyKTsgLyogVW5pdmVyc2FsIFByaW9yaXR5IFZhbHVlICovCisgICAgfQorCisgIC8qIFJlYWQgdGhlIGluZmVyaW9yJ3MgYm9vdHN0cmFwIHBvcnQgbmFtZSAqLworICBpZiAoIW1hY2gzX3JlYWRfaW5mZXJpb3IgKCZvcmlnaW5hbF9zZXJ2ZXJfcG9ydF9uYW1lLAorCQkJICAgICZvcmlnaW5hbF9zZXJ2ZXJfcG9ydF9uYW1lLAorCQkJICAgIHNpemVvZiAob3JpZ2luYWxfc2VydmVyX3BvcnRfbmFtZSkpKQorICAgIGVycm9yICgiQ2FuJ3QgcmVhZCBpbmZlcmlvciB0YXNrIGJvb3RzdHJhcCBwb3J0IG5hbWUiKTsKKworICAvKiBAQCBCVUc6IElmIG1vcmUgdGhhbiAxIHNlbmQgcmlnaHQgR0RCIHdpbGwgRkFJTCEhISAqLworICAvKiAgICAgIFNob3VsZCBnZXQgcmVmcywgYW5kIHNldCB0aGVtIGJhY2sgd2hlbiByZXN0b3JpbmcgKi8KKyAgLyogU3RlYWwgdGhlIG9yaWdpbmFsIGJzZCBzZXJ2ZXIgc2VuZCByaWdodCBmcm9tIGluZmVyaW9yICovCisgIHJldCA9IG1hY2hfcG9ydF9leHRyYWN0X3JpZ2h0IChpbmZlcmlvcl90YXNrLAorCQkJCSBvcmlnaW5hbF9zZXJ2ZXJfcG9ydF9uYW1lLAorCQkJCSBNQUNIX01TR19UWVBFX01PVkVfU0VORCwKKwkJCQkgJm9yaWdpbmFsX3NlcnZlcl9zZW5kLAorCQkJCSAmYWNxdWlyZWQpOworICBDSEsoIm1hY2hfcG9ydF9leHRyYWN0X3JpZ2h0IChic2Qgc2VydmVyIHNlbmQpIixyZXQpOworICAKKyAgaWYgKGFjcXVpcmVkICE9IE1BQ0hfTVNHX1RZUEVfUE9SVF9TRU5EKQorICAgIGVycm9yKCJJbmNvcnJlY3QgcmlnaHQgZXh0cmFjdGVkLCBzZW5kIHJpZ2h0IHRvIGJzZCBzZXJ2ZXIgZXhjcGVjdGVkIik7CisKKyAgcmV0ID0gbWFjaF9wb3J0X2luc2VydF9yaWdodCAoaW5mZXJpb3JfdGFzaywKKwkJCQlvcmlnaW5hbF9zZXJ2ZXJfcG9ydF9uYW1lLAorCQkJCWZha2Vfc2VydmVyLAorCQkJCU1BQ0hfTVNHX1RZUEVfTUFLRV9TRU5EKTsKKyAgQ0hLKCJtYWNoX3BvcnRfaW5zZXJ0X3JpZ2h0IChmYWtlIHNlcnZlciBzZW5kKSIscmV0KTsKKworICB4eF9kZWJ1ZyAoImluZmVyaW9yIHRhc2sgYnNkIHNlcnZlciBwb3J0cyBzZXQgdXAgXG5mcyAleCwgb3NwbiAleCwgb3NzICV4XG4iLAorCSAgICBmYWtlX3NlcnZlciwKKwkgICAgb3JpZ2luYWxfc2VydmVyX3BvcnRfbmFtZSwgb3JpZ2luYWxfc2VydmVyX3NlbmQpOworCisgIC8qIEEgcmVjZWl2ZSByaWdodCB0byB0aGUgcmVwbHkgZ2VuZXJhdGVkIGJ5IHVuaXggc2VydmVyIGV4ZWMoKSByZXF1ZXN0ICovCisgIHJldCA9IG1hY2hfcG9ydF9hbGxvY2F0ZShtYWNoX3Rhc2tfc2VsZigpLCAKKwkJCSAgIE1BQ0hfUE9SVF9SSUdIVF9SRUNFSVZFLAorCQkJICAgJmV4ZWNfcmVwbHkpOworICBDSEsoImNyZWF0ZSBpbnRlcmNlcHRlZF9yZXBseV9wb3J0IHBvcnQgZmFpbGVkIiwgcmV0KTsKKyAgICAKKyAgLyogUGFzcyB0aGlzIHNlbmQgcmlnaHQgdG8gVW5peCBzZXJ2ZXIgc28gaXQgcmVwbGllcyB0byB1cyBhZnRlciBleGVjKCkgKi8KKyAgcmV0ID0gbWFjaF9wb3J0X2V4dHJhY3RfcmlnaHQgKG1hY2hfdGFza19zZWxmICgpLAorCQkJCSBleGVjX3JlcGx5LAorCQkJCSBNQUNIX01TR19UWVBFX01BS0VfU0VORF9PTkNFLAorCQkJCSAmZXhlY19yZXBseV9zZW5kLAorCQkJCSAmYWNxdWlyZWQpOworICBDSEsoIm1hY2hfcG9ydF9leHRyYWN0X3JpZ2h0IChleGVjX3JlcGx5KSIscmV0KTsKKworICBpZiAoYWNxdWlyZWQgIT0gTUFDSF9NU0dfVFlQRV9QT1JUX1NFTkRfT05DRSkKKyAgICBlcnJvcigiSW5jb3JyZWN0IHJpZ2h0IGV4dHJhY3RlZCwgc2VuZCBvbmNlIGV4Y3BlY3RlZCBmb3IgZXhlYyByZXBseSIpOworCisgIHJldCA9IG1hY2hfcG9ydF9tb3ZlX21lbWJlcihtYWNoX3Rhc2tfc2VsZigpLCAKKwkJCSAgICAgIGZha2Vfc2VydmVyLAorCQkJICAgICAgaW5mZXJpb3Jfd2FpdF9wb3J0X3NldCk7CisgIENISyAoIk1vdmluZyBmYWtlIHN5c2NhbGwgcG9ydCB0byBpbmZlcmlvcl93YWl0X3BvcnRfc2V0IiwgcmV0KTsKKworICB4eF9kZWJ1ZyAoInN5c2NhbGwgZmFrZSBzZXJ2ZXIgc2V0IHVwLCByZXN1bWluZyBpbmZlcmlvclxuIik7CisgIAorICByZXQgPSB0YXNrX3Jlc3VtZSAoaW5mZXJpb3JfdGFzayk7CisgIENISygidGFza19yZXN1bWUgKHN0YXJ0dXApIiwgcmV0KTsKKwkKKyAgLyogUmVhZCByZXF1ZXN0cyBmcm9tIHRoZSBpbmZlcmlvci4KKyAgICAgUGFzcyBkaXJlY3RseSB0aHJvdWdoIGV2ZXJ5dGhpbmcgZWxzZSBleGNlcHQgZXhlYygpIGNhbGxzLgorICAgKi8KKyAgd2hpbGUoZXhlY19jb3VudGVyID4gMCkKKyAgICB7CisgICAgICByZXQgPSBtYWNoX21zZyAoJnN5c2NhbGxfaW4uaGVhZGVyLAkvKiBoZWFkZXIgKi8KKwkJICAgICAgTUFDSF9SQ1ZfTVNHLAkJLyogb3B0aW9ucyAqLworCQkgICAgICAwLAkJCS8qIHNlbmQgc2l6ZSAqLworCQkgICAgICBzaXplb2YgKHN0cnVjdCBzeXNjYWxsX21zZ190KSwgLyogcmVjZWl2ZSBzaXplICovCisJCSAgICAgIGluZmVyaW9yX3dhaXRfcG9ydF9zZXQsICAgICAgICAvKiByZWNlaXZlX25hbWUgKi8KKwkJICAgICAgTUFDSF9NU0dfVElNRU9VVF9OT05FLAorCQkgICAgICBNQUNIX1BPUlRfTlVMTCk7CisgICAgICBDSEsoIm1hY2hfbXNnIChpbnRlcmNlcHRlZCBzeWNhbGwpIiwgcmV0KTsKKwkgICAgCisjaWZkZWYgRFVNUF9TWVNDQUxMCisgICAgICBwcmludF9tc2cgKCZzeXNjYWxsX2luLmhlYWRlcik7CisjZW5kaWYKKworICAgICAgLyogQVNTRVJUIDogbXNnaF9sb2NhbF9wb3J0ID09IGZha2Vfc2VydmVyICovCisKKyAgICAgIGlmIChub3RpZnlfc2VydmVyICgmc3lzY2FsbF9pbi5oZWFkZXIsICZzeXNjYWxsX291dC5oZWFkZXIpKQorCWVycm9yICgicmVjZWl2ZWQgYSBub3RpZnkgd2hpbGUgaW50ZXJjZXB0aW5nIHN5c2NhbGxzIik7CisKKyAgICAgIGlmIChzeXNjYWxsX2luLmhlYWRlci5tc2doX2lkID09IE1JR19FWEVDX1NZU0NBTExfSUQpCisJeworCSAgeHhfZGVidWcgKCJSZWNlaXZlZCBFWEVDIFNZU0NBTEwsIGNvdW50ZXIgPSAlZFxuIiwgZXhlY19jb3VudGVyKTsKKwkgIGlmIChleGVjX2NvdW50ZXIgPT0gMSkKKwkgICAgeworCSAgICAgIG9yaWdpbmFsX2V4ZWNfcmVwbHkgPSBzeXNjYWxsX2luLmhlYWRlci5tc2doX3JlbW90ZV9wb3J0OworCSAgICAgIHN5c2NhbGxfaW4uaGVhZGVyLm1zZ2hfcmVtb3RlX3BvcnQgPSBleGVjX3JlcGx5X3NlbmQ7CisJICAgIH0KKworCSAgaWYgKCF0ZXJtaW5hbF9pbml0dGVkKQorCSAgICB7CisJICAgICAgLyogTm93IHRoYXQgdGhlIGNoaWxkIGhhcyBleGVjJ2Qgd2Uga25vdyBpdCBoYXMgYWxyZWFkeSBzZXQgaXRzCisJCSBwcm9jZXNzIGdyb3VwLiAgT24gUE9TSVggc3lzdGVtcywgdGNzZXRwZ3JwIHdpbGwgZmFpbCB3aXRoCisJCSBFUEVSTSBpZiB3ZSB0cnkgaXQgYmVmb3JlIHRoZSBjaGlsZCdzIHNldHBnaWQuICAqLworCisJICAgICAgLyogU2V0IHVwIHRoZSAic2F2ZWQgdGVybWluYWwgbW9kZXMiIG9mIHRoZSBpbmZlcmlvcgorCQkgYmFzZWQgb24gd2hhdCBtb2RlcyB3ZSBhcmUgc3RhcnRpbmcgaXQgd2l0aC4gICovCisJICAgICAgdGFyZ2V0X3Rlcm1pbmFsX2luaXQgKCk7CisKKwkgICAgICAvKiBJbnN0YWxsIGluZmVyaW9yJ3MgdGVybWluYWwgbW9kZXMuICAqLworCSAgICAgIHRhcmdldF90ZXJtaW5hbF9pbmZlcmlvciAoKTsKKworCSAgICAgIHRlcm1pbmFsX2luaXR0ZWQgPSAxOworCSAgICB9CisKKwkgIGV4ZWNfY291bnRlci0tOworCX0KKwkgICAgCisgICAgICBzeXNjYWxsX2luLmhlYWRlci5tc2doX2xvY2FsX3BvcnQgID0gc3lzY2FsbF9pbi5oZWFkZXIubXNnaF9yZW1vdGVfcG9ydDsKKyAgICAgIHN5c2NhbGxfaW4uaGVhZGVyLm1zZ2hfcmVtb3RlX3BvcnQgPSBvcmlnaW5hbF9zZXJ2ZXJfc2VuZDsKKworICAgICAgcmV2ZXJzZV9tc2dfYml0cygmc3lzY2FsbF9pbi5oZWFkZXIsIE1BQ0hfTVNHX1RZUEVfQ09QWV9TRU5EKTsKKworICAgICAgcmV0ID0gbWFjaF9tc2dfc2VuZCAoJnN5c2NhbGxfaW4uaGVhZGVyKTsKKyAgICAgIENISyAoIkZvcndhcmRlZCBzeXNjYWxsIiwgcmV0KTsKKyAgICB9CisJCisgIHJldCA9IG1hY2hfcG9ydF9tb3ZlX21lbWJlcihtYWNoX3Rhc2tfc2VsZigpLCAKKwkJCSAgICAgIGZha2Vfc2VydmVyLAorCQkJICAgICAgTUFDSF9QT1JUX05VTEwpOworICBDSEsgKCJNb3ZpbmcgZmFrZSBzeXNjYWxsIG91dCBvZiBpbmZlcmlvcl93YWl0X3BvcnRfc2V0IiwgcmV0KTsKKworICByZXQgPSBtYWNoX3BvcnRfbW92ZV9tZW1iZXIobWFjaF90YXNrX3NlbGYoKSwgCisJCQkgICAgICBleGVjX3JlcGx5LAorCQkJICAgICAgaW5mZXJpb3Jfd2FpdF9wb3J0X3NldCk7CisgIENISyAoIk1vdmluZyBleGVjX3JlcGx5IHRvIGluZmVyaW9yX3dhaXRfcG9ydF9zZXQiLCByZXQpOworCisgIHJldCA9IG1hY2hfbXNnICgmc3lzY2FsbF9pbi5oZWFkZXIsCS8qIGhlYWRlciAqLworCQkgIE1BQ0hfUkNWX01TRywJCS8qIG9wdGlvbnMgKi8KKwkJICAwLAkJCS8qIHNlbmQgc2l6ZSAqLworCQkgIHNpemVvZiAoc3RydWN0IHN5c2NhbGxfbXNnX3QpLAkvKiByZWNlaXZlIHNpemUgKi8KKwkJICBpbmZlcmlvcl93YWl0X3BvcnRfc2V0LAkJLyogcmVjZWl2ZV9uYW1lICovCisJCSAgTUFDSF9NU0dfVElNRU9VVF9OT05FLAorCQkgIE1BQ0hfUE9SVF9OVUxMKTsKKyAgQ0hLKCJtYWNoX21zZyAoZXhlYyByZXBseSkiLCByZXQpOworCisgIHJldCA9IHRhc2tfc3VzcGVuZCAoaW5mZXJpb3JfdGFzayk7CisgIENISyAoIlN1c3BlbmRpbmcgaW5mZXJpb3IgYWZ0ZXIgbGFzdCBleGVjIiwgcmV0KTsKKworICBtdXN0X3N1c3BlbmRfdGhyZWFkID0gMDsKKworICB4eF9kZWJ1ZyAoIlJlY2VpdmVkIGV4ZWMgcmVwbHkgZnJvbSBic2Qgc2VydmVyLCBzdXNwZW5kZWQgaW5mZXJpb3IgdGFza1xuIik7CisKKyNpZmRlZiBEVU1QX1NZU0NBTEwKKyAgICAgIHByaW50X21zZyAoJnN5c2NhbGxfaW4uaGVhZGVyKTsKKyNlbmRpZgorCisgIC8qIE1lc3NhZ2Ugc2hvdWxkIGFwcGVhciBhcyBpZiBpdCBjYW1lIGZyb20gdGhlIHVuaXggc2VydmVyICovCisgIHN5c2NhbGxfaW4uaGVhZGVyLm1zZ2hfbG9jYWxfcG9ydCA9IE1BQ0hfUE9SVF9OVUxMOworCisgIC8qICBhbmQgZ28gdG8gdGhlIGluZmVyaW9yIHRhc2sgb3JpZ2luYWwgcmVwbHkgcG9ydCAqLworICBzeXNjYWxsX2luLmhlYWRlci5tc2doX3JlbW90ZV9wb3J0ID0gb3JpZ2luYWxfZXhlY19yZXBseTsKKworICByZXZlcnNlX21zZ19iaXRzKCZzeXNjYWxsX2luLmhlYWRlciwgTUFDSF9NU0dfVFlQRV9NT1ZFX1NFTkRfT05DRSk7CisKKyAgcmV0ID0gbWFjaF9tc2dfc2VuZCAoJnN5c2NhbGxfaW4uaGVhZGVyKTsKKyAgQ0hLICgiRm9yd2FyZGluZyBleGVjIHJlcGx5IHRvIGluZmVyaW9yIiwgcmV0KTsKKworICAvKiBHYXJiYWdlIGNvbGxlY3QgKi8KKyAgcmV0ID0gbWFjaF9wb3J0X2RlYWxsb2NhdGUgKGluZmVyaW9yX3Rhc2ssCisJCQkgICAgICBvcmlnaW5hbF9zZXJ2ZXJfcG9ydF9uYW1lKTsKKyAgQ0hLICgiZGVhbGxvY2F0aW5nIGZha2Ugc2VydmVyIHNlbmQgcmlnaHQiLCByZXQpOworCisgIHJldCA9IG1hY2hfcG9ydF9pbnNlcnRfcmlnaHQgKGluZmVyaW9yX3Rhc2ssCisJCQkJb3JpZ2luYWxfc2VydmVyX3BvcnRfbmFtZSwKKwkJCQlvcmlnaW5hbF9zZXJ2ZXJfc2VuZCwKKwkJCQlNQUNIX01TR19UWVBFX01PVkVfU0VORCk7CisgIENISyAoIlJlc3RvcmluZyB0aGUgb3JpZ2luYWwgYnNkIHNlcnZlciBzZW5kIHJpZ2h0IiwgcmV0KTsKKworICByZXQgPSBtYWNoX3BvcnRfZGVzdHJveSAobWFjaF90YXNrX3NlbGYgKCksCisJCQkgICBmYWtlX3NlcnZlcik7CisgIGZha2Vfc2VydmVyID0gTUFDSF9QT1JUX0RFQUQ7CisgIENISygibWFjaF9wb3J0X2Rlc3Ryb3kgKGZha2Vfc2VydmVyKSIsIHJldCk7CisKKyAgcmV0ID0gbWFjaF9wb3J0X2Rlc3Ryb3kgKG1hY2hfdGFza19zZWxmICgpLAorCQkJICAgZXhlY19yZXBseSk7CisgIGV4ZWNfcmVwbHkgPSBNQUNIX1BPUlRfREVBRDsKKyAgQ0hLKCJtYWNoX3BvcnRfZGVzdHJveSAoZXhlY19yZXBseSkiLCByZXQpOworCisgIHh4X2RlYnVnICgiRG9uZSB3aXRoIGV4ZWMgY2FsbCBpbnRlcmNlcHRpb25cbiIpOworfQorCit2b2lkCitjb25zdW1lX3NlbmRfcmlnaHRzICh0aHJlYWRfbGlzdCwgdGhyZWFkX2NvdW50KQorICAgICB0aHJlYWRfYXJyYXlfdCB0aHJlYWRfbGlzdDsKKyAgICAgaW50ICAgICAgICAgICAgdGhyZWFkX2NvdW50OworeworICBpbnQgaW5kZXg7CisKKyAgaWYgKCF0aHJlYWRfY291bnQpCisgICAgcmV0dXJuOworCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHRocmVhZF9jb3VudDsgaW5kZXgrKykKKyAgICB7CisgICAgICAvKiBTaW5jZSB0aHJlYWQga2lsbCBjb21tYW5kIGtpbGxzIHRocmVhZHMsIGRvbid0IGNoZWNrIHJldCAqLworICAgICAgKHZvaWQpIG1hY2hfcG9ydF9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwKKwkJCQkgICB0aHJlYWRfbGlzdCBbIGluZGV4IF0pOworICAgIH0KK30KKworLyogc3VzcGVuZC9hYm9ydC9yZXN1bWUgYSB0aHJlYWQuICovCitzZXR1cF90aHJlYWQgKHRocmVhZCwgd2hhdCkKKyAgICAgbWFjaF9wb3J0X3QgdGhyZWFkOworICAgICBpbnQgd2hhdDsKK3sKKyAga2Vybl9yZXR1cm5fdCByZXQ7CisKKyAgaWYgKHdoYXQpCisgICAgeworICAgICAgcmV0ID0gdGhyZWFkX3N1c3BlbmQgKHRocmVhZCk7CisgICAgICBDSEsgKCJzZXR1cF90aHJlYWQgdGhyZWFkX3N1c3BlbmQiLCByZXQpOworICAgICAgCisgICAgICByZXQgPSB0aHJlYWRfYWJvcnQgKHRocmVhZCk7CisgICAgICBDSEsgKCJzZXR1cF90aHJlYWQgdGhyZWFkX2Fib3J0IiwgcmV0KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXQgPSB0aHJlYWRfcmVzdW1lICh0aHJlYWQpOworICAgICAgQ0hLICgic2V0dXBfdGhyZWFkIHRocmVhZF9yZXN1bWUiLCByZXQpOworICAgIH0KK30KKworaW50CittYXBfc2xvdF90b19taWQgKHNsb3QsIHRocmVhZHMsIHRocmVhZF9jb3VudCkKKyAgICAgaW50IHNsb3Q7CisgICAgIHRocmVhZF9hcnJheV90IHRocmVhZHM7CisgICAgIGludCB0aHJlYWRfY291bnQ7Cit7CisgIGtlcm5fcmV0dXJuX3QgcmV0OworICBpbnQgZGVhbGxvY2F0ZSA9IDA7CisgIGludCBpbmRleDsKKyAgaW50IG1pZDsKKworICBpZiAoISB0aHJlYWRzKQorICAgIHsKKyAgICAgIGRlYWxsb2NhdGUrKzsKKyAgICAgIHJldCA9IHRhc2tfdGhyZWFkcyAoaW5mZXJpb3JfdGFzaywgJnRocmVhZHMsICZ0aHJlYWRfY291bnQpOworICAgICAgQ0hLICgiQ2FuIG5vdCBzZWxlY3QgYSB0aHJlYWQgZnJvbSBhIGRlYWQgdGFzayIsIHJldCk7CisgICAgfQorICAKKyAgaWYgKHNsb3QgPCAwIHx8IHNsb3QgPj0gdGhyZWFkX2NvdW50KQorICAgIHsKKyAgICAgIGlmIChkZWFsbG9jYXRlKQorCXsKKwkgIGNvbnN1bWVfc2VuZF9yaWdodHMgKHRocmVhZHMsIHRocmVhZF9jb3VudCk7CisJICAodm9pZCkgdm1fZGVhbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYoKSwgKHZtX2FkZHJlc3NfdCl0aHJlYWRzLCAKKwkJCQkodGhyZWFkX2NvdW50ICogc2l6ZW9mKG1hY2hfcG9ydF90KSkpOworCX0KKyAgICAgIGlmIChzbG90IDwgMCkKKwllcnJvciAoImludmFsaWQgc2xvdCBudW1iZXIiKTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gLShzbG90KzEpOworICAgIH0KKworICBtaWQgPSBtYXBfcG9ydF9uYW1lX3RvX21pZCAodGhyZWFkcyBbc2xvdF0sIE1BQ0hfVFlQRV9USFJFQUQpOworCisgIGlmIChkZWFsbG9jYXRlKQorICAgIHsKKyAgICAgIGNvbnN1bWVfc2VuZF9yaWdodHMgKHRocmVhZHMsIHRocmVhZF9jb3VudCk7CisgICAgICAodm9pZCkgdm1fZGVhbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYoKSwgKHZtX2FkZHJlc3NfdCl0aHJlYWRzLCAKKwkJCSAgICAodGhyZWFkX2NvdW50ICogc2l6ZW9mKG1hY2hfcG9ydF90KSkpOworICAgIH0KKworICByZXR1cm4gbWlkOworfQorCitzdGF0aWMgaW50CitwYXJzZV90aHJlYWRfaWQgKGFyZywgdGhyZWFkX2NvdW50LCBzbG90cykKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgdGhyZWFkX2NvdW50OworICAgICBpbnQgc2xvdHM7Cit7CisgIGtlcm5fcmV0dXJuX3QgcmV0OworICBpbnQgbWlkOworICBpbnQgc2xvdDsKKyAgaW50IGluZGV4OworICAKKyAgaWYgKGFyZyA9PSAwKQorICAgIHJldHVybiAwOworICAKKyAgd2hpbGUgKCphcmcgJiYgKCphcmcgPT0gJyAnIHx8ICphcmcgPT0gJ1x0JykpCisgICAgYXJnKys7CisgIAorICBpZiAoISAqYXJnKQorICAgIHJldHVybiAwOworICAKKyAgLyogQ3VycmVudGx5IHBhcnNlIE1JRCBhbmQgQFNMT1ROVU1CRVIgKi8KKyAgaWYgKCphcmcgIT0gJ0AnKQorICAgIHsKKyAgICAgIG1pZCA9IGF0b2kgKGFyZyk7CisgICAgICBpZiAobWlkIDw9IDApCisJZXJyb3IgKCJ2YWxpZCB0aHJlYWQgbWlkIGV4cGVjdGVkIik7CisgICAgICByZXR1cm4gbWlkOworICAgIH0KKyAgCisgIGFyZysrOworICBzbG90ID0gYXRvaSAoYXJnKTsKKworICBpZiAoc2xvdCA8IDApCisgICAgZXJyb3IgKCJpbnZhbGlkIHNsb3QgbnVtYmVyIik7CisKKyAgLyogSWYgeW91IHdhbnQgc2xvdCBudW1iZXJzIHRvIHJlbWFpbiBzbG90IG51bWJlcnMsIHNldCBzbG90cy4KKyAgICoKKyAgICogV2VsbCwgc2luY2UgMCBpcyByZXNlcnZlZCwgcmV0dXJuIHRoZSBvcmRpbmFsIG51bWJlcgorICAgKiBvZiB0aGUgdGhyZWFkIHJhdGhlciB0aGFuIHRoZSBzbG90IG51bWJlci4gQXdrLCB0aGlzCisgICAqIGNvdW50cyBhcyBhIGtsdWRnZS4KKyAgICovCisgIGlmIChzbG90cykKKyAgICByZXR1cm4gLShzbG90KzEpOworCisgIGlmICh0aHJlYWRfY291bnQgJiYgc2xvdCA+PSB0aHJlYWRfY291bnQpCisgICAgcmV0dXJuIC0oc2xvdCsxKTsKKworICBtaWQgPSBtYXBfc2xvdF90b19taWQgKHNsb3QpOworICAKKyAgcmV0dXJuIG1pZDsKK30KKworLyogVEhSRUFEX0lEIDAgaXMgc3BlY2lhbDsgaXQgc2VsZWN0cyB0aGUgZmlyc3Qga2VybmVsCisgKiB0aHJlYWQgZnJvbSB0aGUgbGlzdCAoaS5lLiBTTE9UTlVNQkVSIDApCisgKiBUaGlzIGlzIHVzZWQgd2hlbiBzdGFydGluZyB0aGUgcHJvZ3JhbSB3aXRoICdydW4nIG9yIHdoZW4gYXR0YWNoaW5nLgorICoKKyAqIElmIEZMQUcgaXMgMCB0aGUgY29udGV4dCBpcyBub3QgY2hhbmdlZCwgYW5kIHRoZSByZWdpc3RlcnMsIGZyYW1lLCBldGMKKyAqIHdpbGwgY29udGludWUgdG8gZGVzY3JpYmUgdGhlIG9sZCB0aHJlYWQuCisgKgorICogSWYgRkxBRyBpcyBub256ZXJvLCByZWFsbHkgc2VsZWN0IHRoZSB0aHJlYWQuCisgKiBJZiBGTEFHIGlzIDIsIHRoZSBUSFJFQURfSUQgaXMgYSBzbG90bnVtYmVyIGluc3RlYWQgb2YgYSBtaWQuCisgKiAKKyAqLwora2Vybl9yZXR1cm5fdAorc2VsZWN0X3RocmVhZCAodGFzaywgdGhyZWFkX2lkLCBmbGFnKQorICAgICBtYWNoX3BvcnRfdCB0YXNrOworICAgICBpbnQgdGhyZWFkX2lkOworICAgICBpbnQgZmxhZzsKK3sKKyAgdGhyZWFkX2FycmF5X3QgdGhyZWFkX2xpc3Q7CisgIGludCB0aHJlYWRfY291bnQ7CisgIGtlcm5fcmV0dXJuX3QgcmV0OworICBpbnQgaW5kZXg7CisgIHRocmVhZF90IG5ld190aHJlYWQgPSBNQUNIX1BPUlRfTlVMTDsKKworICBpZiAodGhyZWFkX2lkIDwgMCkKKyAgICBlcnJvciAoIkNhbid0IHNlbGVjdCBjcHJvY3Mgd2l0aG91dCBrZXJuZWwgdGhyZWFkIik7CisKKyAgcmV0ID0gdGFza190aHJlYWRzICh0YXNrLCAmdGhyZWFkX2xpc3QsICZ0aHJlYWRfY291bnQpOworICBpZiAocmV0ICE9IEtFUk5fU1VDQ0VTUykKKyAgICB7CisgICAgICB3YXJuaW5nICgiQ2FuIG5vdCBzZWxlY3QgYSB0aHJlYWQgZnJvbSBhIGRlYWQgdGFzayIpOworICAgICAgbTNfa2lsbF9pbmZlcmlvciAoKTsKKyAgICAgIHJldHVybiBLRVJOX0ZBSUxVUkU7CisgICAgfQorCisgIGlmICh0aHJlYWRfY291bnQgPT0gMCkKKyAgICB7CisgICAgICAvKiBUaGUgdGFzayBjYW4gbm90IGRvIGFueXRoaW5nIGFueW1vcmUsIGJ1dCBpdCBzdGlsbAorICAgICAgICogZXhpc3RzIGFzIGEgY29udGFpbmVyIGZvciBtZW1vcnkgYW5kIHBvcnRzLgorICAgICAgICovCisgICAgICByZWdpc3RlcnNfY2hhbmdlZCAoKTsKKyAgICAgIHdhcm5pbmcgKCJUYXNrICVkIGhhcyBubyB0aHJlYWRzIiwKKwkgICAgICAgbWFwX3BvcnRfbmFtZV90b19taWQgKHRhc2ssIE1BQ0hfVFlQRV9UQVNLKSk7CisgICAgICBjdXJyZW50X3RocmVhZCA9IE1BQ0hfUE9SVF9OVUxMOworICAgICAgKHZvaWQpIHZtX2RlYWxsb2NhdGUobWFjaF90YXNrX3NlbGYoKSwKKwkJCSAgICh2bV9hZGRyZXNzX3QpIHRocmVhZF9saXN0LAorCQkJICAgKHRocmVhZF9jb3VudCAqIHNpemVvZihtYWNoX3BvcnRfdCkpKTsKKyAgICAgIHJldHVybiBLRVJOX0ZBSUxVUkU7CisgICAgfQorCisgIGlmICghIHRocmVhZF9pZCB8fCBmbGFnID09IDIpCisgICAgeworICAgICAgLyogRmlyc3QgdGhyZWFkIG9yIGEgc2xvdG51bWJlciAqLworICAgICAgaWYgKCEgdGhyZWFkX2lkKQorCW5ld190aHJlYWQgPSB0aHJlYWRfbGlzdFswXTsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAodGhyZWFkX2lkIDwgdGhyZWFkX2NvdW50KQorCSAgICBuZXdfdGhyZWFkID0gdGhyZWFkX2xpc3RbIHRocmVhZF9pZCBdOworCSAgZWxzZQorCSAgICB7CisJICAgICAgKHZvaWQpIHZtX2RlYWxsb2NhdGUobWFjaF90YXNrX3NlbGYoKSwKKwkJCQkgICAodm1fYWRkcmVzc190KSB0aHJlYWRfbGlzdCwKKwkJCQkgICAodGhyZWFkX2NvdW50ICogc2l6ZW9mKG1hY2hfcG9ydF90KSkpOworCSAgICAgIGVycm9yICgiTm8gc3VjaCB0aHJlYWQgc2xvdCBudW1iZXIgOiAlZCIsIHRocmVhZF9pZCk7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdGhyZWFkX2NvdW50OyBpbmRleCsrKQorCWlmICh0aHJlYWRfaWQgPT0gbWFwX3BvcnRfbmFtZV90b19taWQgKHRocmVhZF9saXN0IFtpbmRleF0sCisJCQkJCSAgICAgICBNQUNIX1RZUEVfVEhSRUFEKSkKKwkgIHsKKwkgICAgbmV3X3RocmVhZCA9IHRocmVhZF9saXN0IFtpbmRleF07CisJICAgIGluZGV4ID0gLTE7CisJICAgIGJyZWFrOworCSAgfQorICAgICAgCisgICAgICBpZiAoaW5kZXggIT0gLTEpCisJZXJyb3IgKCJObyB0aHJlYWQgd2l0aCBtaWQgJWQiLCB0aHJlYWRfaWQpOworICAgIH0KKyAgCisgIC8qIE5vdGlmeSB3aGVuIHRoZSBzZWxlY3RlZCB0aHJlYWQgZGllcyAqLworICByZXF1ZXN0X25vdGlmeSAobmV3X3RocmVhZCwgTUFDSF9OT1RJRllfREVBRF9OQU1FLCBNQUNIX1RZUEVfVEhSRUFEKTsKKyAgCisgIHJldCA9IHZtX2RlYWxsb2NhdGUobWFjaF90YXNrX3NlbGYoKSwKKwkJICAgICAgKHZtX2FkZHJlc3NfdCkgdGhyZWFkX2xpc3QsCisJCSAgICAgICh0aHJlYWRfY291bnQgKiBzaXplb2YobWFjaF9wb3J0X3QpKSk7CisgIENISyAoInZtX2RlYWxsb2NhdGUiLCByZXQpOworICAKKyAgaWYgKCEgZmxhZykKKyAgICBjdXJyZW50X3RocmVhZCA9IG5ld190aHJlYWQ7CisgIGVsc2UKKyAgICB7CisjaWYgMAorICAgICAgaWYgKE1BQ0hfUE9SVF9WQUxJRCAoY3VycmVudF90aHJlYWQpKQorCXsKKwkgIC8qIFN0b3JlIHRoZSBnZGIncyB2aWV3IG9mIHRoZSB0aHJlYWQgd2UgYXJlIGRlc2VsZWN0aW5nCisJICAgKgorCSAgICogQEAgSSB0aGluayBnZGIgdXBkYXRlcyByZWdpc3RlcnMgaW1tZWRpYXRlbHkgd2hlbiB0aGV5IGFyZQorCSAgICogY2hhbmdlZCwgc28gZG9uJ3QgZG8gdGhpcy4KKwkgICAqLworCSAgcmV0ID0gdGhyZWFkX2Fib3J0IChjdXJyZW50X3RocmVhZCk7CisJICBDSEsgKCJDb3VsZCBub3QgYWJvcnQgc3lzdGVtIGNhbGxzIHdoZW4gc2F2aW5nIHN0YXRlIG9mIG9sZCB0aHJlYWQiLAorCSAgICAgICByZXQpOworCSAgdGFyZ2V0X3ByZXBhcmVfdG9fc3RvcmUgKCk7CisJICB0YXJnZXRfc3RvcmVfcmVnaXN0ZXJzICgtMSk7CisJfQorI2VuZGlmCisKKyAgICAgIHJlZ2lzdGVyc19jaGFuZ2VkICgpOworCisgICAgICBjdXJyZW50X3RocmVhZCA9IG5ld190aHJlYWQ7CisKKyAgICAgIHJldCA9IHRocmVhZF9hYm9ydCAoY3VycmVudF90aHJlYWQpOworICAgICAgQ0hLICgiQ291bGQgbm90IGFib3J0IHN5c3RlbSBjYWxscyB3aGVuIHNlbGVjdGluZyBhIHRocmVhZCIsIHJldCk7CisKKyAgICAgIHN0b3BfcGMgPSByZWFkX3BjKCk7CisgICAgICBmbHVzaF9jYWNoZWRfZnJhbWVzICgpOworCisgICAgICBzZWxlY3RfZnJhbWUgKGdldF9jdXJyZW50X2ZyYW1lICgpLCAwKTsKKyAgICB9CisKKyAgcmV0dXJuIEtFUk5fU1VDQ0VTUzsKK30KKworLyoKKyAqIFN3aXRjaCB0byB1c2UgdGhyZWFkIG5hbWVkIE5FV19USFJFQUQuCisgKiBSZXR1cm4gaXQncyBNSUQKKyAqLworaW50Citzd2l0Y2hfdG9fdGhyZWFkIChuZXdfdGhyZWFkKQorICAgICB0aHJlYWRfdCBuZXdfdGhyZWFkOworeworICB0aHJlYWRfdCBzYXZlZF90aHJlYWQgPSBjdXJyZW50X3RocmVhZDsKKyAgaW50IG1pZDsKKworICBtaWQgPSBtYXBfcG9ydF9uYW1lX3RvX21pZCAobmV3X3RocmVhZCwKKwkJCSAgICAgIE1BQ0hfVFlQRV9USFJFQUQpOworICBpZiAobWlkID09IC0xKQorICAgIHdhcm5pbmcgKCJDYW4ndCBtYXAgdGhyZWFkIG5hbWUgMHgleCB0byBtaWQiLCBuZXdfdGhyZWFkKTsKKyAgZWxzZSBpZiAoc2VsZWN0X3RocmVhZCAoaW5mZXJpb3JfdGFzaywgbWlkLCAxKSAhPSBLRVJOX1NVQ0NFU1MpCisgICAgeworICAgICAgaWYgKGN1cnJlbnRfdGhyZWFkKQorCWN1cnJlbnRfdGhyZWFkID0gc2F2ZWRfdGhyZWFkOworICAgICAgZXJyb3IgKCJDb3VsZCBub3Qgc2VsZWN0IHRocmVhZCAlZCIsIG1pZCk7CisgICAgfQorCQorICByZXR1cm4gbWlkOworfQorCisvKiBEbyB0aGlzIGluIGdkYiBhZnRlciBkb2luZyBGT1JLIGJ1dCBiZWZvcmUgU1RBUlRVUF9JTkZFUklPUi4KKyAqIE5vdGUgdGhhdCB0aGUgcmVnaXN0ZXJzIGFyZSBub3QgeWV0IHZhbGlkIGluIHRoZSBpbmZlcmlvciB0YXNrLgorICovCitzdGF0aWMgaW50CittM190cmFjZV9oaW0gKHBpZCkKKyAgICAgaW50IHBpZDsKK3sKKyAga2Vybl9yZXR1cm5fdCByZXQ7CisKKyAgcHVzaF90YXJnZXQgKCZtM19vcHMpOworCisgIGluZmVyaW9yX3Rhc2sgPSB0YXNrX2J5X3BpZCAocGlkKTsKKworICBpZiAoISBNQUNIX1BPUlRfVkFMSUQgKGluZmVyaW9yX3Rhc2spKQorICAgIGVycm9yICgiQ2FuIG5vdCBtYXAgVW5peCBwaWQgJWQgdG8gTWFjaCB0YXNrIiwgcGlkKTsKKworICAvKiBDbGVhbiB1cCBwcmV2aW91cyBub3RpZmljYXRpb25zIGFuZCBjcmVhdGUgbmV3IG9uZXMgKi8KKyAgc2V0dXBfbm90aWZ5X3BvcnQgKDEpOworCisgIC8qIFdoZW4gbm90aWZpY2F0aW9uIGFwcGVhcnMsIHRoZSBpbmZlcmlvciB0YXNrIGhhcyBkaWVkICovCisgIHJlcXVlc3Rfbm90aWZ5IChpbmZlcmlvcl90YXNrLCBNQUNIX05PVElGWV9ERUFEX05BTUUsIE1BQ0hfVFlQRV9UQVNLKTsKKworICBlbXVsYXRvcl9wcmVzZW50ID0gaGF2ZV9lbXVsYXRvcl9wIChpbmZlcmlvcl90YXNrKTsKKworICAvKiBCeSBkZWZhdWx0LCBzZWxlY3QgdGhlIGZpcnN0IHRocmVhZCwKKyAgICogSWYgdGFzayBoYXMgbm8gdGhyZWFkcywgZ2l2ZXMgYSB3YXJuaW5nCisgICAqIERvZXMgbm90IGZldGNoIHJlZ2lzdGVycywgc2luY2UgdGhleSBhcmUgbm90IHlldCB2YWxpZC4KKyAgICovCisgIHNlbGVjdF90aHJlYWQgKGluZmVyaW9yX3Rhc2ssIDAsIDApOworCisgIGluZmVyaW9yX2V4Y2VwdGlvbl9wb3J0ID0gTUFDSF9QT1JUX05VTEw7CisKKyAgc2V0dXBfZXhjZXB0aW9uX3BvcnQgKCk7CisKKyAgeHhfZGVidWcgKCJOb3cgdGhlIGRlYnVnZ2VkIHRhc2sgaXMgY3JlYXRlZFxuIik7CisKKyAgLyogT25lIHRyYXAgdG8gZXhlYyB0aGUgc2hlbGwsIG9uZSB0byBleGVjIHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkLiAgKi8KKyAgaW50ZXJjZXB0X2V4ZWNfY2FsbHMgKDIpOworCisgIHJldHVybiBwaWQ7Cit9CisKK3NldHVwX2V4Y2VwdGlvbl9wb3J0ICgpCit7CisgIGtlcm5fcmV0dXJuX3QgcmV0OworCisgIHJldCA9IG1hY2hfcG9ydF9hbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYoKSwgCisJCQkgICAgTUFDSF9QT1JUX1JJR0hUX1JFQ0VJVkUsCisJCQkgICAgJmluZmVyaW9yX2V4Y2VwdGlvbl9wb3J0KTsKKyAgQ0hLKCJtYWNoX3BvcnRfYWxsb2NhdGUiLHJldCk7CisKKyAgLyogYWRkIHNlbmQgcmlnaHQgKi8KKyAgcmV0ID0gbWFjaF9wb3J0X2luc2VydF9yaWdodCAobWFjaF90YXNrX3NlbGYgKCksCisJCQkJaW5mZXJpb3JfZXhjZXB0aW9uX3BvcnQsCisJCQkJaW5mZXJpb3JfZXhjZXB0aW9uX3BvcnQsCisJCQkJTUFDSF9NU0dfVFlQRV9NQUtFX1NFTkQpOworICBDSEsoIm1hY2hfcG9ydF9pbnNlcnRfcmlnaHQiLHJldCk7CisKKyAgcmV0ID0gbWFjaF9wb3J0X21vdmVfbWVtYmVyIChtYWNoX3Rhc2tfc2VsZigpLCAKKwkJCSAgICAgICBpbmZlcmlvcl9leGNlcHRpb25fcG9ydCwKKwkJCSAgICAgICBpbmZlcmlvcl93YWl0X3BvcnRfc2V0KTsKKyAgQ0hLKCJtYWNoX3BvcnRfbW92ZV9tZW1iZXIiLHJldCk7CisKKyAgcmV0ID0gdGFza19nZXRfc3BlY2lhbF9wb3J0IChpbmZlcmlvcl90YXNrLCAKKwkJCSAgICAgICBUQVNLX0VYQ0VQVElPTl9QT1JULAorCQkJICAgICAgICZpbmZlcmlvcl9vbGRfZXhjZXB0aW9uX3BvcnQpOworICBDSEsgKCJ0YXNrX2dldF9zcGVjaWFsX3BvcnQob2xkIGV4YykiLHJldCk7CisKKyAgcmV0ID0gdGFza19zZXRfc3BlY2lhbF9wb3J0IChpbmZlcmlvcl90YXNrLAorCQkJICAgICAgIFRBU0tfRVhDRVBUSU9OX1BPUlQsIAorCQkJICAgICAgIGluZmVyaW9yX2V4Y2VwdGlvbl9wb3J0KTsKKyAgQ0hLKCJ0YXNrX3NldF9zcGVjaWFsX3BvcnQiLHJldCk7CisKKyAgcmV0ID0gbWFjaF9wb3J0X2RlYWxsb2NhdGUgKG1hY2hfdGFza19zZWxmICgpLAorCQkJICAgICAgaW5mZXJpb3JfZXhjZXB0aW9uX3BvcnQpOworICBDSEsoIm1hY2tfcG9ydF9kZWFsbG9jYXRlIixyZXQpOworCisjaWYgMAorICAvKiBXaGVuIG5vdGlmeSBhcHBlYXJzLCB0aGUgaW5mZXJpb3JfdGFzaydzIGV4Y2VwdGlvbgorICAgKiBwb3J0IGhhcyBiZWVuIGRlc3Ryb3llZC4KKyAgICoKKyAgICogTm90IHVzZWQsIHNpbmNlIHRoZSBkZWFkX25hbWVfbm90aWZpY2F0aW9uIGFscmVhZHkKKyAgICogYXBwZWFycyB3aGVuIHRhc2sgZGllcy4KKyAgICoKKyAgICovCisgIHJlcXVlc3Rfbm90aWZ5IChpbmZlcmlvcl9leGNlcHRpb25fcG9ydCwKKwkJICBNQUNIX05PVElGWV9OT19TRU5ERVJTLAorCQkgIE1BQ0hfVFlQRV9FWENFUFRJT05fUE9SVCk7CisjZW5kaWYKK30KKworLyogTm9uemVybyBpZiBnZGIgaXMgd2FpdGluZyBmb3IgYSBtZXNzYWdlICovCitpbnQgbWFjaF9yZWFsbHlfd2FpdGluZzsKKworLyogV2FpdCBmb3IgdGhlIGluZmVyaW9yIHRvIHN0b3AgZm9yIHNvbWUgcmVhc29uLgorICAgLSBMb29wIG9uIG5vdGlmaWNhdGlvbnMgdW50aWwgaW5mZXJpb3JfdGFzayBkaWVzLgorICAgLSBMb29wIG9uIGV4Y2VwdGlvbnMgdW50aWwgc3RvcHBlZF9pbl9leGNlcHRpb24gY29tZXMgdHJ1ZS4KKyAgICAgKGUuZy4gd2UgcmVjZWl2ZSBhIHNpbmdsZSBzdGVwIHRyYWNlIHRyYXApCisgICAtIGEgbWVzc2FnZSBhcnJpdmVzIHRvIGdkYidzIG1lc3NhZ2UgcG9ydAorCisgICBUaGVyZSBpcyBubyBvdGhlciB3YXkgdG8gZXhpdCB0aGlzIGxvb3AuCisKKyAgIFJldHVybnMgdGhlIGluZmVyaW9yX3BpZCBmb3IgcmVzdCBvZiBnZGIuCisgICBTaWRlIGVmZmVjdHM6IFNldCAqT1VSU1RBVFVTLiAgKi8KK2ludAorbWFjaF9yZWFsbHlfd2FpdCAocGlkLCBvdXJzdGF0dXMpCisgICAgIGludCBwaWQ7CisgICAgIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqb3Vyc3RhdHVzOworeworICBrZXJuX3JldHVybl90IHJldDsKKyAgaW50IHc7CisKKyAgc3RydWN0IG1zZyB7CisgICAgbWFjaF9tc2dfaGVhZGVyX3QgICAgaGVhZGVyOworICAgIG1hY2hfbXNnX3R5cGVfdCBmb287CisgICAgaW50ICAgICAgICAgICAgIGRhdGFbODAwMF07CisgIH0gaW5fbXNnLCBvdXRfbXNnOworCisgIC8qIEVpdGhlciBub3RpZnkgKGRlYXRoKSwgZXhjZXB0aW9uIG9yIG1lc3NhZ2UgY2FuIHN0b3AgdGhlIGluZmVyaW9yICovCisgIHN0b3BwZWRfaW5fZXhjZXB0aW9uID0gRkFMU0U7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgUVVJVDsKKworICAgICAgc3RvcF9leGNlcHRpb24gPSBzdG9wX2NvZGUgPSBzdG9wX3N1YmNvZGUgPSAtMTsKKyAgICAgIHN0b3BfdGhyZWFkID0gTUFDSF9QT1JUX05VTEw7CisKKyAgICAgIG1hY2hfcmVhbGx5X3dhaXRpbmcgPSAxOworICAgICAgcmV0ID0gbWFjaF9tc2cgKCZpbl9tc2cuaGVhZGVyLAkJLyogaGVhZGVyICovCisJCSAgICAgIE1BQ0hfUkNWX01TRywJCS8qIG9wdGlvbnMgKi8KKwkJICAgICAgMCwJCQkvKiBzZW5kIHNpemUgKi8KKwkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgbXNnKSwJLyogcmVjZWl2ZSBzaXplICovCisJCSAgICAgIGN1cnJlbnRseV93YWl0aW5nX2ZvciwJLyogcmVjZWl2ZSBuYW1lICovCisJCSAgICAgIE1BQ0hfTVNHX1RJTUVPVVRfTk9ORSwKKwkJICAgICAgTUFDSF9QT1JUX05VTEwpOworICAgICAgbWFjaF9yZWFsbHlfd2FpdGluZyA9IDA7CisgICAgICBDSEsoIm1hY2hfbXNnIChyZWNlaXZlKSIsIHJldCk7CisKKyAgICAgIC8qIENoZWNrIGlmIHdlIHJlY2VpdmVkIGEgbm90aWZ5IG9mIHRoZSBjaGlsZHMnIGRlYXRoICovCisgICAgICBpZiAobm90aWZ5X3NlcnZlciAoJmluX21zZy5oZWFkZXIsICZvdXRfbXNnLmhlYWRlcikpCisJeworCSAgLyogSWYgaW5mZXJpb3JfdGFzayBpcyBudWxsIHRoZW4gdGhlIGluZmVyaW9yIGhhcworCSAgICAgZ29uZSBhd2F5IGFuZCB3ZSB3YW50IHRvIHJldHVybiB0byBjb21tYW5kIGxldmVsLgorCSAgICAgT3RoZXJ3aXNlIGl0IHdhcyBqdXN0IGFuIGluZm9ybWF0aXZlIG1lc3NhZ2UgYW5kIHdlCisJICAgICBuZWVkIHRvIGxvb2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgbW9yZS4gKi8KKwkgIGlmIChpbmZlcmlvcl90YXNrICE9IE1BQ0hfUE9SVF9OVUxMKQorCSAgICBjb250aW51ZTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIENvbGxlY3QgVW5peCBleGl0IHN0YXR1cyBmb3IgZ2RiICovCisKKwkgICAgICB3YWl0MygmdywgV05PSEFORywgMCk7CisKKwkgICAgICAvKiBUaGlzIG1lc3MgaXMgaGVyZSB0byBjaGVjayB0aGF0IHRoZSByZXN0IG9mCisJICAgICAgICogZ2RiIGtub3dzIHRoYXQgdGhlIGluZmVyaW9yIGRpZWQuIEl0IGFsc28KKwkgICAgICAgKiB0cmllcyB0byBoYWNrIGFyb3VuZCB0aGUgZmFjdCB0aGF0IE1hY2ggMy4wIChtazY5KQorCSAgICAgICAqIHVuaXggc2VydmVyICh1eDI4KSBkb2VzIG5vdCBhbHdheXMga25vdyB3aGF0CisJICAgICAgICogaGFzIGhhcHBlbmVkIHRvIGl0J3MgY2hpbGRyZW4gd2hlbiBtYWNoLW1hZ2ljCisJICAgICAgICogaXMgYXBwbGllZCBvbiB0aGVtLgorCSAgICAgICAqLworCSAgICAgIGlmICgoIVdJRkVYSVRFRCh3KSAmJiBXSUZTVE9QUEVEKHcpKSAgICAgICAgIHx8CisJCSAgKFdJRkVYSVRFRCh3KSAgJiYgV0VYSVRTVEFUVVModykgPiAwMzc3KSkKKwkJeworCQkgIFdTRVRFWElUKHcsIDApOworCQkgIHdhcm5pbmcgKCJVc2luZyBleGl0IHZhbHVlIDAgZm9yIHRlcm1pbmF0ZWQgdGFzayIpOworCQl9CisJICAgICAgZWxzZSBpZiAoIVdJRkVYSVRFRCh3KSkKKwkJeworCQkgIGludCBzaWcgPSBXVEVSTVNJRyh3KTsKKworCQkgIC8qIFNpZ25hbHMgY2F1c2UgcHJvYmxlbXMuIFdhcm4gdGhlIHVzZXIuICovCisJCSAgaWYgKHNpZyAhPSBTSUdLSUxMKSAvKiBCYWQgbHVjayBpZiBnYXJiYWdlIG1hdGNoZXMgdGhpcyAqLworCQkgICAgd2FybmluZyAoIlRoZSB0ZXJtaW5hdGluZyBzaWduYWwgc3R1ZmYgbWF5IGJlIG5vbnNlbnNlIik7CisJCSAgZWxzZSBpZiAoc2lnID4gTlNJRykKKwkJICAgIHsKKwkJICAgICAgV1NFVEVYSVQodywgMCk7CisJCSAgICAgIHdhcm5pbmcgKCJVc2luZyBleGl0IHZhbHVlIDAgZm9yIHRlcm1pbmF0ZWQgdGFzayIpOworCQkgICAgfQorCQl9CisJICAgICAgc3RvcmVfd2FpdHN0YXR1cyAob3Vyc3RhdHVzLCB3KTsKKwkgICAgICByZXR1cm4gaW5mZXJpb3JfcGlkOworCSAgICB9CisJfQorCisgICAgICAvKiBIbW0uIENoZWNrIGZvciBleGNlcHRpb24sIGFzIGl0IHdhcyBub3QgYSBub3RpZmljYXRpb24uCisJIGV4Y19zZXJ2ZXIoKSBkb2VzIGFuIHVwY2FsbCB0byBjYXRjaF9leGNlcHRpb25fcmFpc2UoKQorCSBpZiB0aGlzIHJwYyBpcyBhbiBleGNlcHRpb24uIEZ1cnRoZXIgYWN0aW9ucyBhcmUgZGVjaWRlZAorCSB0aGVyZS4KKyAgICAgICAqLworICAgICAgaWYgKCEgZXhjX3NlcnZlciAoJmluX21zZy5oZWFkZXIsICZvdXRfbXNnLmhlYWRlcikpCisJeworCisJICAvKiBOb3QgYW4gZXhjZXB0aW9uLCBjaGVjayBmb3IgbWVzc2FnZS4KKwkgICAqCisJICAgKiBNZXNzYWdlcyBkb24ndCBjb21lIGZyb20gdGhlIGluZmVyaW9yLCBvciBpZiB0aGV5CisJICAgKiBkbyB0aGV5IGJldHRlciBiZSBhc3luY2hyb25vdXMgb3IgaXQgd2lsbCBoYW5nLgorCSAgICovCisJICBpZiAoZ2RiX21lc3NhZ2Vfc2VydmVyICgmaW5fbXNnLmhlYWRlcikpCisJICAgIGNvbnRpbnVlOworCisJICBlcnJvciAoIlVucmVjb2duaXplZCBtZXNzYWdlIHJlY2VpdmVkIGluIG1hY2hfcmVhbGx5X3dhaXQiKTsKKwl9CisKKyAgICAgIC8qIFNlbmQgdGhlIHJlcGx5IG9mIHRoZSBleGNlcHRpb24gcnBjIHRvIHRoZSBzdXNwZW5kZWQgdGFzayAqLworICAgICAgcmV0ID0gbWFjaF9tc2dfc2VuZCAoJm91dF9tc2cuaGVhZGVyKTsKKyAgICAgIENISyAoIm1hY2hfbXNnX3NlbmQgKGV4YyByZXBseSkiLCByZXQpOworICAgICAgCisgICAgICBpZiAoc3RvcHBlZF9pbl9leGNlcHRpb24pCisJeworCSAgLyogR2V0IHVuaXggc3RhdGUuIE1heSBiZSBjaGFuZ2VkIGluIG1hY2gzX2V4Y2VwdGlvbl9hY3Rpb25zKCkgKi8KKwkgIHdhaXQzKCZ3LCBXTk9IQU5HLCAwKTsKKworCSAgbWFjaDNfZXhjZXB0aW9uX2FjdGlvbnMgKCZ3LCBGQUxTRSwgIlRhc2siKTsKKworCSAgc3RvcmVfd2FpdHN0YXR1cyAob3Vyc3RhdHVzLCB3KTsKKwkgIHJldHVybiBpbmZlcmlvcl9waWQ7CisJfQorICAgIH0KK30KKworLyogQ2FsbGVkIGJ5IG1hY3JvIERPX1FVSVQoKSBpbiB1dGlscy5jKHF1aXQpLgorICogVGhpcyBpcyBjYWxsZWQganVzdCBiZWZvcmUgY2FsbGluZyBlcnJvcigpIHRvIHJldHVybiB0byBjb21tYW5kIGxldmVsCisgKi8KK3ZvaWQKK21hY2gzX3F1aXQgKCkKK3sKKyAgaW50IG1pZDsKKyAga2Vybl9yZXR1cm5fdCByZXQ7CisgIAorICBpZiAobWFjaF9yZWFsbHlfd2FpdGluZykKKyAgICB7CisgICAgICByZXQgPSB0YXNrX3N1c3BlbmQgKGluZmVyaW9yX3Rhc2spOworICAgICAgCisgICAgICBpZiAocmV0ICE9IEtFUk5fU1VDQ0VTUykKKwl7CisJICB3YXJuaW5nICgiQ291bGQgbm90IHN1c3BlbmQgdGFzayBmb3IgaW50ZXJydXB0OiAlcyIsCisJCSAgIG1hY2hfZXJyb3Jfc3RyaW5nIChyZXQpKTsKKwkgIG1hY2hfcmVhbGx5X3dhaXRpbmcgPSAwOworCSAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgbXVzdF9zdXNwZW5kX3RocmVhZCA9IDA7CisgIG1hY2hfcmVhbGx5X3dhaXRpbmcgPSAwOworCisgIG1pZCA9IG1hcF9wb3J0X25hbWVfdG9fbWlkIChjdXJyZW50X3RocmVhZCwgTUFDSF9UWVBFX1RIUkVBRCk7CisgIGlmIChtaWQgPT0gLTEpCisgICAgeworICAgICAgd2FybmluZyAoIlNlbGVjdGluZyBmaXJzdCBleGlzdGluZyBrZXJuZWwgdGhyZWFkIik7CisgICAgICBtaWQgPSAwOworICAgIH0KKworICBjdXJyZW50X3RocmVhZCA9IE1BQ0hfUE9SVF9OVUxMOyAvKiBGb3JjZSBzZXR1cCAqLworICBzZWxlY3RfdGhyZWFkIChpbmZlcmlvcl90YXNrLCBtaWQsIDEpOworCisgIHJldHVybjsKK30KKworI2lmIDAKKy8qIGJvZ3VzIGJvZ3VzIGJvZ3VzLiAgSXQgaXMgTk9UIE9LIHRvIHF1aXQgb3V0IG9mIHRhcmdldF93YWl0LiAgKi8KKworLyogSWYgXkMgaXMgdHlwZWQgd2hlbiB3ZSBhcmUgd2FpdGluZyBmb3IgYSBtZXNzYWdlCisgKiBhbmQgeW91ciBVbml4IHNlcnZlciBpcyBhYmxlIHRvIG5vdGljZSB0aGF0IHdlIAorICogc2hvdWxkIHF1aXQgbm93LgorICoKKyAqIENhbGxlZCBieSBSRVFVRVNUX1FVSVQoKSBmcm9tIHV0aWxzLmMocmVxdWVzdF9xdWl0KQorICovCit2b2lkCittYWNoM19yZXF1ZXN0X3F1aXQgKCkKK3sKKyAgaWYgKG1hY2hfcmVhbGx5X3dhaXRpbmcpCisgICAgaW1tZWRpYXRlX3F1aXQgPSAxOworfSAgICAgIAorI2VuZGlmCisKKy8qCisgKiBHZGIgbWVzc2FnZSBzZXJ2ZXIuCisgKiBDdXJyZW50bHkgaW1wbGVtZW50ZWQgaXMgdGhlIFNUT1AgbWVzc2FnZSwgdGhhdCBjYXVzZXMKKyAqIGdkYiB0byByZXR1cm4gdG8gdGhlIGNvbW1hbmQgbGV2ZWwgbGlrZSBeQyBoYWQgYmVlbiB0eXBlZCBmcm9tIHRlcm1pbmFsLgorICovCitpbnQKK2dkYl9tZXNzYWdlX3NlcnZlciAoSW5QKQorICAgICBtYWNoX21zZ19oZWFkZXJfdCAqSW5QOworeworICBrZXJuX3JldHVybl90IHJldDsKKyAgaW50IG1pZDsKKworICBpZiAoSW5QLT5tc2doX2xvY2FsX3BvcnQgPT0gb3VyX21lc3NhZ2VfcG9ydCkKKyAgICB7CisgICAgICAvKiBBIG1lc3NhZ2UgY29taW5nIHRvIG91cl9tZXNzYWdlX3BvcnQuIENoZWNrIHZhbGlkaXR5ICovCisgICAgICBzd2l0Y2ggKEluUC0+bXNnaF9pZCkgeworCisgICAgICBjYXNlIEdEQl9NRVNTQUdFX0lEX1NUT1A6CisJcmV0ID0gdGFza19zdXNwZW5kIChpbmZlcmlvcl90YXNrKTsKKwlpZiAocmV0ICE9IEtFUk5fU1VDQ0VTUykKKwkgIHdhcm5pbmcgKCJDb3VsZCBub3Qgc3VzcGVuZCB0YXNrIGZvciBzdG9wIG1lc3NhZ2U6ICVzIiwKKwkJICAgbWFjaF9lcnJvcl9zdHJpbmcgKHJldCkpOworCisJLyogUVVJVCBpbiBtYWNoX3JlYWxseV93YWl0KCkgbG9vcC4gKi8KKwlyZXF1ZXN0X3F1aXQgKDApOworCWJyZWFrOworCisgICAgICBkZWZhdWx0OgorCXdhcm5pbmcgKCJJbnZhbGlkIG1lc3NhZ2UgaWQgJWQgcmVjZWl2ZWQsIGlnbm9yZWQuIiwKKwkJIEluUC0+bXNnaF9pZCk7CisJYnJlYWs7CisgICAgICB9CisKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBNZXNzYWdlIG5vdCBoYW5kbGVkIGJ5IHRoaXMgc2VydmVyICovCisgIHJldHVybiAwOworfQorCisvKiBOT1RFOiBUaGlzIGlzIG5vdCBhbiBSUEMgY2FsbC4gSXQgaXMgYSBzaW1wbGVyb3V0aW5lLgorICoKKyAqIFRoaXMgaXMgbm90IGNhbGxlZCBmcm9tIHRoaXMgZ2RiIGNvZGUuCisgKgorICogSXQgbWF5IGJlIGNhbGxlZCBieSBhbm90aGVyIGRlYnVnZ2VyIHRvIGNhdXNlIHRoaXMKKyAqIGRlYnVnZ2VyIHRvIGVudGVyIGNvbW1hbmQgbGV2ZWw6CisgKgorICogICAgICAgICAgICAoZ2RiKSBzZXQgc3RvcF9pbmZlcmlvcl9nZGIgKCkKKyAqICAgICAgICAgICAgKGdkYikgY29udGludWUKKyAqCisgKiBFeHRlcm5hbCBwcm9ncmFtICJzdG9wLWdkYiIgaW1wbGVtZW50cyB0aGlzIGFsc28uCisgKi8KK3ZvaWQKK3N0b3BfaW5mZXJpb3JfZ2RiICgpCit7CisgIGtlcm5fcmV0dXJuX3QgcmV0OworCisgIC8qIENvZGUgZ2VuZXJhdGVkIGJ5IG1pZywgd2l0aCBtaW5vciBjbGVhbnVwcyA6LSkKKyAgICoKKyAgICogc2ltcGxlcm91dGluZSBzdG9wX2luZmVyaW9yX2dkYiAob3VyX21lc3NhZ2VfcG9ydCA6IG1hY2hfcG9ydF90KTsKKyAgICovCisKKyAgdHlwZWRlZiBzdHJ1Y3QgeworICAgIG1hY2hfbXNnX2hlYWRlcl90IEhlYWQ7CisgIH0gUmVxdWVzdDsKKworICBSZXF1ZXN0IE1lc3M7CisKKyAgcmVnaXN0ZXIgUmVxdWVzdCAqSW5QID0gJk1lc3M7CisKKyAgSW5QLT5IZWFkLm1zZ2hfYml0cyA9IE1BQ0hfTVNHSF9CSVRTKE1BQ0hfTVNHX1RZUEVfQ09QWV9TRU5ELCAwKTsKKworICAvKiBtc2doX3NpemUgcGFzc2VkIGFzIGFyZ3VtZW50ICovCisgIEluUC0+SGVhZC5tc2doX3JlbW90ZV9wb3J0ID0gb3VyX21lc3NhZ2VfcG9ydDsKKyAgSW5QLT5IZWFkLm1zZ2hfbG9jYWxfcG9ydCAgPSBNQUNIX1BPUlRfTlVMTDsKKyAgSW5QLT5IZWFkLm1zZ2hfc2Vxbm8gICAgICAgPSAwOworICBJblAtPkhlYWQubXNnaF9pZCAgICAgICAgICA9IEdEQl9NRVNTQUdFX0lEX1NUT1A7CisKKyAgcmV0ID0gbWFjaF9tc2cgKCZJblAtPkhlYWQsCisJCSAgTUFDSF9TRU5EX01TR3xNQUNIX01TR19PUFRJT05fTk9ORSwKKwkJICBzaXplb2YoUmVxdWVzdCksCisJCSAgMCwKKwkJICBNQUNIX1BPUlRfTlVMTCwKKwkJICBNQUNIX01TR19USU1FT1VUX05PTkUsCisJCSAgTUFDSF9QT1JUX05VTEwpOworfQorCisjaWZkZWYgVEhSRUFEX0FMTE9XRURfVE9fQlJFQUsKKy8qCisgKiBSZXR1cm4gMSBpZiB0aGUgTUlEIHNwZWNpZmllcyB0aGUgdGhyZWFkIHRoYXQgY2F1c2VkIHRoZQorICogbGFzdCBleGNlcHRpb24uCisgKiAgU2luY2UgY2F0Y2hfZXhjZXB0aW9uX3JhaXNlKCkgc2VsZWN0cyB0aGUgdGhyZWFkIGNhdXNpbmcKKyAqIHRoZSBsYXN0IGV4Y2VwdGlvbiB0byBjdXJyZW50X3RocmVhZCwgd2UganVzdCBjaGVjayB0aGF0CisgKiBpdCBpcyBzZWxlY3RlZCBhbmQgdGhlIGxhc3QgZXhjZXB0aW9uIHdhcyBhIGJyZWFrcG9pbnQuCisgKi8KK2ludAorbWFjaF90aHJlYWRfZm9yX2JyZWFrcG9pbnQgKG1pZCkKKyAgICAgaW50IG1pZDsKK3sKKyAgaW50IGNtaWQgPSBtYXBfcG9ydF9uYW1lX3RvX21pZCAoY3VycmVudF90aHJlYWQsIE1BQ0hfVFlQRV9USFJFQUQpOworCisgIGlmIChtaWQgPCAwKQorICAgIHsKKyAgICAgIG1pZCA9IG1hcF9zbG90X3RvX21pZCAoLShtaWQrMSksIDAsIDApOworICAgICAgaWYgKG1pZCA8IDApCisJcmV0dXJuIDA7CQkvKiBEb24ndCBzdG9wLCBubyBzdWNoIHNsb3QgKi8KKyAgICB9CisKKyAgaWYgKCEgbWlkIHx8IGNtaWQgPT0gLTEpCisgICAgcmV0dXJuIDE7CS8qIHN0b3AgKi8KKworICByZXR1cm4gY21pZCA9PSBtaWQgJiYgc3RvcF9leGNlcHRpb24gPT0gRVhDX0JSRUFLUE9JTlQ7Cit9CisjZW5kaWYgLyogVEhSRUFEX0FMTE9XRURfVE9fQlJFQUsgKi8KKworI2lmZGVmIFRIUkVBRF9QQVJTRV9JRAorLyoKKyAqIE1hcCBhIHRocmVhZCBpZCBzdHJpbmcgKE1JRCBvciBhIEBTTE9UTlVNQkVSKQorICogdG8gYSB0aHJlYWQtaWQuCisgKgorICogICAwICBtYXRjaGVzIGFsbCB0aHJlYWRzLgorICogICBPdGhlcndpc2UgdGhlIG1lYW5pbmcgaXMgZGVmaW5lZCBvbmx5IGluIHRoaXMgZmlsZS4KKyAqICAgKG1hY2hfdGhyZWFkX2Zvcl9icmVha3BvaW50IHVzZXMgaXQpCisgKgorICogQEAgVGhpcyBhbGxvd3Mgbm9uLWV4aXN0ZW50IE1JRHMgdG8gYmUgc3BlY2lmaWVkLgorICogICAgSXQgbm93IGFsc28gYWxsb3dzIG5vbi1leGlzdGVudCBzbG90cyB0byBiZQorICogICAgc3BlY2lmaWVkLiAoU2xvdCBudW1iZXJzIHN0b3JlZCBhcmUgbmVnYXRpdmUsCisgKiAgICBhbmQgdGhlIG1hZ25pdHVkZSBpcyBvbmUgZ3JlYXRlciB0aGFuIHRoZSBhY3R1YWwKKyAqICAgIHNsb3QgaW5kZXguIChTaW5jZSAwIGlzIHJlc2VydmVkKSkKKyAqLworaW50CittYWNoX3RocmVhZF9wYXJzZV9pZCAoYXJnKQorICAgICBjaGFyICphcmc7Cit7CisgIGludCBtaWQ7CisgIGlmIChhcmcgPT0gMCkKKyAgICBlcnJvciAoInRocmVhZCBpZCBleGNwZWN0ZWQiKTsKKyAgbWlkID0gcGFyc2VfdGhyZWFkX2lkIChhcmcsIDAsIDEpOworCisgIHJldHVybiBtaWQ7Cit9CisjZW5kaWYgLyogVEhSRUFEX1BBUlNFX0lEICovCisKKyNpZmRlZiBUSFJFQURfT1VUUFVUX0lECitjaGFyICoKK21hY2hfdGhyZWFkX291dHB1dF9pZCAobWlkKQorICAgICBpbnQgbWlkOworeworICBzdGF0aWMgY2hhciBmb29iYXIgWzIwXTsKKworICBpZiAobWlkID4gMCkKKyAgICBzcHJpbnRmIChmb29iYXIsICJtaWQgJWQiLCBtaWQpOworICBlbHNlIGlmIChtaWQgPCAwKQorICAgIHNwcmludGYgKGZvb2JhciwgIkAlZCIsIC0obWlkKzEpKTsKKyAgZWxzZQorICAgIHNwcmludGYgKGZvb2JhciwgIiphbnkgdGhyZWFkKiIpOworCisgIHJldHVybiBmb29iYXI7Cit9CisjZW5kaWYgLyogVEhSRUFEX09VVFBVVF9JRCAqLworCisvKiBDYWxsZWQgd2l0aCBob29rIFBSRVBBUkVfVE9fUFJPQ0VFRCgpIGZyb20gaW5mcnVuLmMuCisgKgorICogSWYgd2UgaGF2ZSBzd2l0Y2hlZCB0aHJlYWRzIGFuZCBzdG9wcGVkIGF0IGJyZWFrcG9pbnQgcmV0dXJuIDEgb3RoZXJ3aXNlIDAuCisgKgorICogIGlmIFNFTEVDVF9JVCBpcyBub256ZXJvLCByZXNlbGVjdCB0aGUgdGhyZWFkIHRoYXQgd2FzIGFjdGl2ZSB3aGVuCisgKiAgd2Ugc3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQuCisgKgorICovCisKK21hY2gzX3ByZXBhcmVfdG9fcHJvY2VlZCAoc2VsZWN0X2l0KQorICAgICBpbnQgc2VsZWN0X2l0OworeworICBpZiAoc3RvcF90aHJlYWQgJiYKKyAgICAgIHN0b3BfdGhyZWFkICE9IGN1cnJlbnRfdGhyZWFkICYmCisgICAgICBzdG9wX2V4Y2VwdGlvbiA9PSBFWENfQlJFQUtQT0lOVCkKKyAgICB7CisgICAgICBpbnQgbWlkOworCisgICAgICBpZiAoISBzZWxlY3RfaXQpCisJcmV0dXJuIDE7CisKKyAgICAgIG1pZCA9IHN3aXRjaF90b190aHJlYWQgKHN0b3BfdGhyZWFkKTsKKworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiB0aGlzIHN0dWZmIGhlcmUgaXMgYW4gdXBjYWxsIHZpYSBsaWJtYWNoL2V4Y1NlcnZlci5jIAorICAgYW5kIG1hY2hfcmVhbGx5X3dhaXQgd2hpY2ggZG9lcyB0aGUgYWN0dWFsIHVwY2FsbC4KKworICAgVGhlIGNvZGUgd2lsbCBwYXNzIHRoZSBleGNlcHRpb24gdG8gdGhlIGluZmVyaW9yIGlmOgorCisgICAgIC0gVGhlIHRhc2sgdGhhdCBzaWduYWxlZCBpcyBub3QgdGhlIGluZmVyaW9yIHRhc2sKKyAgICAgICAoZS5nLiB3aGVuIGRlYnVnZ2luZyBhbm90aGVyIGRlYnVnZ2VyKQorCisgICAgIC0gVGhlIHVzZXIgaGFzIGV4cGxpY2l0ZWx5IHJlcXVlc3RlZCB0byBwYXNzIG9uIHRoZSBleGNlcHRpb25zLgorICAgICAgIChlLmcgdG8gdGhlIGRlZmF1bHQgdW5peCBleGNlcHRpb24gaGFuZGxlciwgd2hpY2ggbWFwcworCWV4Y2VwdGlvbnMgdG8gc2lnbmFscywgb3IgdGhlIHVzZXIgaGFzIGhlciBvd24gZXhjZXB0aW9uIGhhbmRsZXIpCisKKyAgICAgLSBJZiB0aGUgdGhyZWFkIHRoYXQgc2lnbmFsZWQgaXMgYmVpbmcgc2luZ2xlLXN0ZXBwZWQgYW5kIGl0CisgICAgICAgaGFzIHNldCBpdCdzIG93biBleGNlcHRpb24gcG9ydCBhbmQgdGhlIGV4Y2VwdGlvbiBpcyBub3QKKyAgICAgICBFWENfQlJFQUtQT0lOVC4gKE1heWJlIHRoaXMgaXMgbm90IGRlc2lyYWJsZT8pCisgKi8KKwora2Vybl9yZXR1cm5fdAorY2F0Y2hfZXhjZXB0aW9uX3JhaXNlIChwb3J0LCB0aHJlYWQsIHRhc2ssIGV4Y2VwdGlvbiwgY29kZSwgc3ViY29kZSkKKyAgICAgbWFjaF9wb3J0X3QgcG9ydDsKKyAgICAgdGhyZWFkX3QgdGhyZWFkOworICAgICB0YXNrX3QgdGFzazsKKyAgICAgaW50IGV4Y2VwdGlvbiwgY29kZSwgc3ViY29kZTsKK3sKKyAga2Vybl9yZXR1cm5fdCByZXQ7CisgIGJvb2xlYW5fdCBzaWduYWxfdGhyZWFkOworICBpbnQgbWlkID0gbWFwX3BvcnRfbmFtZV90b19taWQgKHRocmVhZCwgTUFDSF9UWVBFX1RIUkVBRCk7CisKKyAgaWYgKCEgTUFDSF9QT1JUX1ZBTElEICh0aHJlYWQpKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBleGNlcHRpb24gd2FzIHNlbnQgYW5kIHRocmVhZCBkaWVzIGJlZm9yZSB3ZQorCSByZWNlaXZlIGl0LCBUSFJFQUQgd2lsbCBiZSBNQUNIX1BPUlRfREVBRAorICAgICAgICovCisKKyAgICAgIGN1cnJlbnRfdGhyZWFkID0gdGhyZWFkID0gTUFDSF9QT1JUX05VTEw7CisgICAgICBlcnJvciAoIlJlY2VpdmVkIGV4Y2VwdGlvbiBmcm9tIG5vbmV4aXN0ZW50IHRocmVhZCIpOworICAgIH0KKworICAvKiBDaGVjayBpZiB0aGUgdGFzayBkaWVkIGluIHRyYW5zaXQuCisgICAqIEBAIElzbid0IHRoZSB0aHJlYWQgYWxzbyBpbnZhbGlkIGluIHN1Y2ggY2FzZT8KKyAgICovCisgIGlmICghIE1BQ0hfUE9SVF9WQUxJRCAodGFzaykpCisgICAgeworICAgICAgY3VycmVudF90aHJlYWQgPSB0aHJlYWQgPSBNQUNIX1BPUlRfTlVMTDsKKyAgICAgIGVycm9yICgiUmVjZWl2ZWQgZXhjZXB0aW9uIGZyb20gbm9uZXhpc3RlbnQgdGFzayIpOworICAgIH0KKworICBpZiAoZXhjZXB0aW9uIDwgMCB8fCBleGNlcHRpb24gPiBNQVhfRVhDRVBUSU9OKQorICAgIGZhdGFsICgiY2F0Y2hfZXhjZXB0aW9uX3JhaXNlOiB1bmtub3duIGV4Y2VwdGlvbiBjb2RlICVkIHRocmVhZCAlZCIsCisJICAgZXhjZXB0aW9uLAorCSAgIG1pZCk7CisKKyAgaWYgKCEgTUFDSF9QT1JUX1ZBTElEIChpbmZlcmlvcl90YXNrKSkKKyAgICBlcnJvciAoImdvdCBhbiBleGNlcHRpb24sIGJ1dCBpbmZlcmlvcl90YXNrIGlzIG51bGwgb3IgZGVhZCIpOworICAKKyAgc3RvcF9leGNlcHRpb24gPSBleGNlcHRpb247CisgIHN0b3BfY29kZSAgICAgID0gY29kZTsKKyAgc3RvcF9zdWJjb2RlICAgPSBzdWJjb2RlOyAgCisgIHN0b3BfdGhyZWFkICAgID0gdGhyZWFkOworICAKKyAgc2lnbmFsX3RocmVhZCA9IGV4Y2VwdGlvbiAhPSBFWENfQlJFQUtQT0lOVCAgICAgICAmJgorICAgIAkJICBwb3J0ID09IHNpbmdsZXN0ZXBwZWRfdGhyZWFkX3BvcnQgJiYKKwkJICBNQUNIX1BPUlRfVkFMSUQgKHRocmVhZF9zYXZlZF9leGNlcHRpb25fcG9ydCk7CisKKyAgLyogSWYgaXQgd2FzIG5vdCBvdXIgaW5mZXJpb3Igb3IgaWYgd2Ugd2FudCB0byBmb3J3YXJkCisgICAqIHRoZSBleGNlcHRpb24gdG8gdGhlIGluZmVyaW9yJ3MgaGFuZGxlciwgZG8gaXQgaGVyZQorICAgKgorICAgKiBOb3RlOiBJZiB5b3UgaGF2ZSBmb3J3YXJkZWQgRVhDX0JSRUFLUE9JTlQgSSB0cnVzdCB5b3Uga25vdyB3aHkuCisgICAqLworICBpZiAodGFzayAhPSBpbmZlcmlvcl90YXNrIHx8CisgICAgICBzaWduYWxfdGhyZWFkICAgICAgICAgfHwKKyAgICAgIGV4Y2VwdGlvbl9tYXAgW2V4Y2VwdGlvbl0uZm9yd2FyZCkKKyAgICB7CisgICAgICBtYWNoX3BvcnRfdCBlcG9ydCA9IGluZmVyaW9yX29sZF9leGNlcHRpb25fcG9ydDsKKworICAgICAgaWYgKHNpZ25hbF90aHJlYWQpCisJeworCSAgLyoKKwkgICAgR0RCIG5vdyBmb3J3YXJkcyB0aGUgZXhlcHRpb24gdG8gdGhyZWFkJ3Mgb3JpZ2luYWwgaGFuZGxlciwKKwkgICAgc2luY2UgdGhlIHVzZXIgcHJvcGFibHkga25vd3Mgd2hhdCBoZSBpcyBkb2luZy4KKwkgICAgR2l2ZSBhIG1lc3NhZ2UsIHRob3VnaC4KKwkgICAqLworCisJICBtYWNoM19leGNlcHRpb25fYWN0aW9ucyAoKFdBSVRUWVBFICopTlVMTCwgVFJVRSwgIlRocmVhZCIpOworCSAgZXBvcnQgPSB0aHJlYWRfc2F2ZWRfZXhjZXB0aW9uX3BvcnQ7CisJfQorCisgICAgICAvKiBTZW5kIHRoZSBleGNlcHRpb24gdG8gdGhlIG9yaWdpbmFsIGhhbmRsZXIgKi8KKyAgICAgIHJldCA9IGV4Y2VwdGlvbl9yYWlzZSAoZXBvcnQsCisJCQkgICAgIHRocmVhZCwgCisJCQkgICAgIHRhc2ssCisJCQkgICAgIGV4Y2VwdGlvbiwKKwkJCSAgICAgY29kZSwKKwkJCSAgICAgc3ViY29kZSk7CisKKyAgICAgICh2b2lkKSBtYWNoX3BvcnRfZGVhbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYgKCksIHRhc2spOworICAgICAgKHZvaWQpIG1hY2hfcG9ydF9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwgdGhyZWFkKTsKKworICAgICAgLyogSWYgd2UgY29tZSBoZXJlLCB3ZSBkb24ndCB3YW50IHRvIHRyYWNlIGFueSBtb3JlLCBzaW5jZSB3ZQorICAgICAgICogd2lsbCBuZXZlciBzdG9wIGZvciB0cmFjaW5nIGFueXdheS4KKyAgICAgICAqLworICAgICAgZGlzY2FyZF9zaW5nbGVfc3RlcCAodGhyZWFkKTsKKworICAgICAgLyogRG8gbm90IHN0b3AgdGhlIGluZmVyaW9yICovCisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgCisgIC8qIE5vdyBnZGIgaGFuZGxlcyB0aGUgZXhjZXB0aW9uICovCisgIHN0b3BwZWRfaW5fZXhjZXB0aW9uID0gVFJVRTsKKworICByZXQgPSB0YXNrX3N1c3BlbmQgKHRhc2spOworICBDSEsgKCJFcnJvciBzdXNwZW5kaW5nIGluZmVyaW9yIGFmdGVyIGV4Y2VwdGlvbiIsIHJldCk7CisKKyAgbXVzdF9zdXNwZW5kX3RocmVhZCA9IDA7CisKKyAgaWYgKGN1cnJlbnRfdGhyZWFkICE9IHRocmVhZCkKKyAgICB7CisgICAgICBpZiAoTUFDSF9QT1JUX1ZBTElEIChzaW5nbGVzdGVwcGVkX3RocmVhZF9wb3J0KSkKKwkvKiBDbGVhbnVwIGRpc2NhcmRzIHNpbmdsZSBzdGVwcGluZyAqLworCWVycm9yICgiRXhjZXB0aW9uIGZyb20gdGhyZWFkICVkIHdoaWxlIHNpbmdsZXN0ZXBwaW5nIHRocmVhZCAlZCIsCisJICAgICAgIG1pZCwKKwkgICAgICAgbWFwX3BvcnRfbmFtZV90b19taWQgKGN1cnJlbnRfdGhyZWFkLCBNQUNIX1RZUEVfVEhSRUFEKSk7CisgICAgICAKKyAgICAgIC8qIFRoZW4gc2VsZWN0IHRoZSB0aHJlYWQgdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbiAqLworICAgICAgaWYgKHNlbGVjdF90aHJlYWQgKGluZmVyaW9yX3Rhc2ssIG1pZCwgMCkgIT0gS0VSTl9TVUNDRVNTKQorCWVycm9yICgiQ291bGQgbm90IHNlbGVjdCB0aHJlYWQgJWQgY2F1c2luZyBleGNlcHRpb24iLCBtaWQpOworICAgICAgZWxzZQorCXdhcm5pbmcgKCJHZGIgc2VsZWN0ZWQgdGhyZWFkICVkIiwgbWlkKTsKKyAgICB9CisKKyAgLyogSWYgd2UgcmVjZWl2ZSBhbiBleGNlcHRpb24gdGhhdCBpcyBub3QgYnJlYWtwb2ludAorICAgKiBleGNlcHRpb24sIHdlIGludGVycnVwdCB0aGUgc2luZ2xlIHN0ZXAgYW5kIHJldHVybiB0bworICAgKiBkZWJ1Z2dlci4gVHJhY2UgY29uZGl0aW9uIGlzIGNsZWFyZWQuCisgICAqLworICBpZiAoTUFDSF9QT1JUX1ZBTElEIChzaW5nbGVzdGVwcGVkX3RocmVhZF9wb3J0KSkKKyAgICB7CisgICAgICBpZiAoc3RvcF9leGNlcHRpb24gIT0gRVhDX0JSRUFLUE9JTlQpCisJd2FybmluZyAoIlNpbmdsZSBzdGVwIGludGVycnVwdGVkIGJ5IGV4Y2VwdGlvbiIpOworICAgICAgZWxzZSBpZiAocG9ydCA9PSBzaW5nbGVzdGVwcGVkX3RocmVhZF9wb3J0KQorCXsKKwkgIC8qIFNpbmdsZSBzdGVwIGV4Y2VwdGlvbiBvY2N1cnJlZCwgcmVtb3ZlIHRyYWNlIGJpdAorCSAgICogYW5kIHJldHVybiB0byBnZGIuCisJICAgKi8KKwkgIGlmICghIE1BQ0hfUE9SVF9WQUxJRCAoY3VycmVudF90aHJlYWQpKQorCSAgICBlcnJvciAoIlNpbmdsZSBzdGVwcGVkIHRocmVhZCBpcyBub3QgdmFsaWQiKTsKKwkKKwkgIC8qIFJlc3VtZSB0aHJlYWRzLCBidXQgbGVhdmUgdGhlIHRhc2sgc3VzcGVuZGVkICovCisJICByZXN1bWVfYWxsX3RocmVhZHMgKDApOworCX0KKyAgICAgIGVsc2UKKwl3YXJuaW5nICgiQnJlYWtwb2ludCB3aGlsZSBzaW5nbGUgc3RlcHBpbmc/Iik7CisKKyAgICAgIGRpc2NhcmRfc2luZ2xlX3N0ZXAgKGN1cnJlbnRfdGhyZWFkKTsKKyAgICB9CisgIAorICAodm9pZCkgbWFjaF9wb3J0X2RlYWxsb2NhdGUgKG1hY2hfdGFza19zZWxmICgpLCB0YXNrKTsKKyAgKHZvaWQpIG1hY2hfcG9ydF9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwgdGhyZWFkKTsKKworICByZXR1cm4gS0VSTl9TVUNDRVNTOworfQorDAoraW50Citwb3J0X3ZhbGlkIChwb3J0LCBtYXNrKQorICBtYWNoX3BvcnRfdCBwb3J0OworICBpbnQgICAgICAgICBtYXNrOworeworICBrZXJuX3JldHVybl90IHJldDsKKyAgbWFjaF9wb3J0X3R5cGVfdCB0eXBlOworCisgIHJldCA9IG1hY2hfcG9ydF90eXBlIChtYWNoX3Rhc2tfc2VsZiAoKSwKKwkJCXBvcnQsCisJCQkmdHlwZSk7CisgIGlmIChyZXQgIT0gS0VSTl9TVUNDRVNTIHx8ICh0eXBlICYgbWFzaykgIT0gbWFzaykKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisMCisvKiBAQCBObyB2bSByZWFkIGNhY2hlIGltcGxlbWVudGVkIHlldCAqLworYm9vbGVhbl90IHZtX3JlYWRfY2FjaGVfdmFsaWQgPSBGQUxTRTsKKworLyoKKyAqIFJlYWQgaW5mZXJpb3IgdGFzaydzIExFTiBieXRlcyBmcm9tIEFERFIgYW5kIGNvcHkgaXQgdG8gTVlBRERSCisgKiBpbiBnZGIncyBhZGRyZXNzIHNwYWNlLgorICoKKyAqIFJldHVybiAwIG9uIGZhaWx1cmU7IG51bWJlciBvZiBieXRlcyByZWFkIG90aGVyd2lzZS4KKyAqLworaW50CittYWNoM19yZWFkX2luZmVyaW9yIChhZGRyLCBteWFkZHIsIGxlbmd0aCkKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAga2Vybl9yZXR1cm5fdCByZXQ7CisgIHZtX2FkZHJlc3NfdCBsb3dfYWRkcmVzcyAgICAgICA9ICh2bV9hZGRyZXNzX3QpIHRydW5jX3BhZ2UgKGFkZHIpOworICB2bV9zaXplX3QgICAgYWxpZ25lZF9sZW5ndGggPSAKKyAgICAJCQkodm1fc2l6ZV90KSByb3VuZF9wYWdlIChhZGRyK2xlbmd0aCkgLSBsb3dfYWRkcmVzczsKKyAgcG9pbnRlcl90ICAgIGNvcGllZF9tZW1vcnk7CisgIGludAkgICAgICAgY29weV9jb3VudDsKKworICAvKiBHZXQgbWVtb3J5IGZyb20gaW5mZXJpb3Igd2l0aCBwYWdlIGFsaWduZWQgYWRkcmVzc2VzICovCisgIHJldCA9IHZtX3JlYWQgKGluZmVyaW9yX3Rhc2ssCisJCSBsb3dfYWRkcmVzcywKKwkJIGFsaWduZWRfbGVuZ3RoLAorCQkgJmNvcGllZF9tZW1vcnksCisJCSAmY29weV9jb3VudCk7CisgIGlmIChyZXQgIT0gS0VSTl9TVUNDRVNTKQorICAgIHsKKyAgICAgIC8qIHRoZSBwcm9ibGVtIGlzIHRoYXQgdGhlIGluZmVyaW9yIG1pZ2h0IGJlIGtpbGxlZCBmb3Igd2hhdGV2ZXIgcmVhc29uCisgICAgICAgKiBiZWZvcmUgd2UgZ28gdG8gbWFjaF9yZWFsbHlfd2FpdC4gVGhpcyBpcyBvbmUgcGxhY2UgdGhhdCBvdWdodCB0bworICAgICAgICogY2F0Y2ggbWFueSBvZiB0aG9zZSBlcnJvcnMuCisgICAgICAgKiBAQCBBIGJldHRlciBmaXggd291bGQgYmUgdG8gbWFrZSBhbGwgZXh0ZXJuYWwgZXZlbnRzIHRvIEdEQgorICAgICAgICogdG8gYXJyaXZlIHZpYSBhIFNJTkdMRSBwb3J0IHNldC4gKEluY2x1ZGluZyB1c2VyIGlucHV0ISkKKyAgICAgICAqLworCisgICAgICBpZiAoISBwb3J0X3ZhbGlkIChpbmZlcmlvcl90YXNrLCBNQUNIX1BPUlRfVFlQRV9TRU5EKSkKKwl7CisJICBtM19raWxsX2luZmVyaW9yICgpOworCSAgZXJyb3IgKCJJbmZlcmlvciBraWxsZWQgKHRhc2sgcG9ydCBpbnZhbGlkKSIpOworCX0KKyAgICAgIGVsc2UKKwl7CisjaWZkZWYgT1NGCisJICBleHRlcm4gaW50IGVycm5vOworCSAgLyogdmFscHJpbnQuYyBnaXZlcyBuaWNlciBmb3JtYXQgaWYgdGhpcyBkb2VzIG5vdAorCSAgICAgc2NyZXcgaXQuIEVhbW9ubiBzZWVtcyB0byBsaWtlIHRoaXMsIHNvIEkgZW5hYmxlCisJICAgICBpdCBpZiBPU0YgaXMgZGVmaW5lZC4uLgorCSAgICovCisJICB3YXJuaW5nICgiW3JlYWQgaW5mZXJpb3IgJXggZmFpbGVkOiAlc10iLAorCQkgICBhZGRyLCBtYWNoX2Vycm9yX3N0cmluZyAocmV0KSk7CisJICBlcnJubyA9IDA7CisjZW5kaWYKKwkgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAgbWVtY3B5IChteWFkZHIsIChjaGFyICopYWRkciAtIGxvd19hZGRyZXNzICsgY29waWVkX21lbW9yeSwgbGVuZ3RoKTsKKworICByZXQgPSB2bV9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwKKwkJICAgICAgIGNvcGllZF9tZW1vcnksCisJCSAgICAgICBjb3B5X2NvdW50KTsKKyAgQ0hLKCJtYWNoM19yZWFkX2luZmVyaW9yIHZtX2RlYWxsb2NhdGUgZmFpbGVkIiwgcmV0KTsKKworICByZXR1cm4gbGVuZ3RoOworfQorCisjaWZkZWYgX19TVERDX18KKyNkZWZpbmUgQ0hLX0dPVE9fT1VUKHN0cixyZXQpIFwKKyAgZG8gaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpIHsgZXJyc3RyID0gI3N0cjsgZ290byBvdXQ7IH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIENIS19HT1RPX09VVChzdHIscmV0KSBcCisgIGRvIGlmIChyZXQgIT0gS0VSTl9TVUNDRVNTKSB7IGVycnN0ciA9IHN0cjsgZ290byBvdXQ7IH0gd2hpbGUoMCkKKyNlbmRpZgorCitzdHJ1Y3Qgdm1fcmVnaW9uX2xpc3QgeworICBzdHJ1Y3Qgdm1fcmVnaW9uX2xpc3QgKm5leHQ7CisgIHZtX3Byb3RfdAlwcm90ZWN0aW9uOworICB2bV9hZGRyZXNzX3QgIHN0YXJ0OworICB2bV9zaXplX3QJbGVuZ3RoOworfTsKKworc3RydWN0IG9ic3RhY2sgIHJlZ2lvbl9vYnN0YWNrOworCisvKgorICogV3JpdGUgaW5mZXJpb3IgdGFzaydzIExFTiBieXRlcyBmcm9tIEFERFIgYW5kIGNvcHkgaXQgdG8gTVlBRERSCisgKiBpbiBnZGIncyBhZGRyZXNzIHNwYWNlLgorICovCitpbnQKK21hY2gzX3dyaXRlX2luZmVyaW9yIChhZGRyLCBteWFkZHIsIGxlbmd0aCkKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAga2Vybl9yZXR1cm5fdCByZXQ7CisgIHZtX2FkZHJlc3NfdCBsb3dfYWRkcmVzcyAgICAgICA9ICh2bV9hZGRyZXNzX3QpIHRydW5jX3BhZ2UgKGFkZHIpOworICB2bV9zaXplX3QgICAgYWxpZ25lZF9sZW5ndGggPSAKKyAgICAJCQkodm1fc2l6ZV90KSByb3VuZF9wYWdlIChhZGRyK2xlbmd0aCkgLSBsb3dfYWRkcmVzczsKKyAgcG9pbnRlcl90ICAgIGNvcGllZF9tZW1vcnk7CisgIGludAkgICAgICAgY29weV9jb3VudDsKKyAgaW50CSAgICAgICBkZWFsbG9jYXRlID0gMDsKKworICBjaGFyICAgICAgICAgKmVycnN0ciA9ICJCdWcgaW4gbWFjaDNfd3JpdGVfaW5mZXJpb3IiOworCisgIHN0cnVjdCB2bV9yZWdpb25fbGlzdCAqcmVnaW9uX2VsZW1lbnQ7CisgIHN0cnVjdCB2bV9yZWdpb25fbGlzdCAqcmVnaW9uX2hlYWQgPSAoc3RydWN0IHZtX3JlZ2lvbl9saXN0ICopTlVMTDsKKworICAvKiBHZXQgbWVtb3J5IGZyb20gaW5mZXJpb3Igd2l0aCBwYWdlIGFsaWduZWQgYWRkcmVzc2VzICovCisgIHJldCA9IHZtX3JlYWQgKGluZmVyaW9yX3Rhc2ssCisJCSBsb3dfYWRkcmVzcywKKwkJIGFsaWduZWRfbGVuZ3RoLAorCQkgJmNvcGllZF9tZW1vcnksCisJCSAmY29weV9jb3VudCk7CisgIENIS19HT1RPX09VVCAoIm1hY2gzX3dyaXRlX2luZmVyaW9yIHZtX3JlYWQgZmFpbGVkIiwgcmV0KTsKKworICBkZWFsbG9jYXRlKys7CisKKyAgbWVtY3B5ICgoY2hhciAqKWFkZHIgLSBsb3dfYWRkcmVzcyArIGNvcGllZF9tZW1vcnksIG15YWRkciwgbGVuZ3RoKTsKKworICBvYnN0YWNrX2luaXQgKCZyZWdpb25fb2JzdGFjayk7CisKKyAgLyogRG8gd3JpdGVzIGF0b21pY2FsbHkuCisgICAqIEZpcnN0IGNoZWNrIGZvciBob2xlcyBhbmQgdW53cml0YWJsZSBtZW1vcnkuCisgICAqLworICB7CisgICAgdm1fc2l6ZV90ICAgIHJlbWFpbmluZ19sZW5ndGggID0gYWxpZ25lZF9sZW5ndGg7CisgICAgdm1fYWRkcmVzc190IHJlZ2lvbl9hZGRyZXNzICAgID0gbG93X2FkZHJlc3M7CisKKyAgICBzdHJ1Y3Qgdm1fcmVnaW9uX2xpc3QgKnNjYW47CisKKyAgICB3aGlsZShyZWdpb25fYWRkcmVzcyA8IGxvd19hZGRyZXNzICsgYWxpZ25lZF9sZW5ndGgpCisgICAgICB7CisJdm1fcHJvdF90IHByb3RlY3Rpb247CisJdm1fcHJvdF90IG1heF9wcm90ZWN0aW9uOworCXZtX2luaGVyaXRfdCBpbmhlcml0YW5jZTsKKwlib29sZWFuX3Qgc2hhcmVkOworCW1hY2hfcG9ydF90IG9iamVjdF9uYW1lOworCXZtX29mZnNldF90IG9mZnNldDsKKwl2bV9zaXplX3QgICByZWdpb25fbGVuZ3RoID0gcmVtYWluaW5nX2xlbmd0aDsKKwl2bV9hZGRyZXNzX3Qgb2xkX2FkZHJlc3MgID0gcmVnaW9uX2FkZHJlc3M7CisgICAgCisJcmV0ID0gdm1fcmVnaW9uIChpbmZlcmlvcl90YXNrLAorCQkJICZyZWdpb25fYWRkcmVzcywKKwkJCSAmcmVnaW9uX2xlbmd0aCwKKwkJCSAmcHJvdGVjdGlvbiwKKwkJCSAmbWF4X3Byb3RlY3Rpb24sCisJCQkgJmluaGVyaXRhbmNlLAorCQkJICZzaGFyZWQsCisJCQkgJm9iamVjdF9uYW1lLAorCQkJICZvZmZzZXQpOworCUNIS19HT1RPX09VVCAoInZtX3JlZ2lvbiBmYWlsZWQiLCByZXQpOworCisJLyogQ2hlY2sgZm9yIGhvbGVzIGluIG1lbW9yeSAqLworCWlmIChvbGRfYWRkcmVzcyAhPSByZWdpb25fYWRkcmVzcykKKwkgIHsKKwkgICAgd2FybmluZyAoIk5vIG1lbW9yeSBhdCAweCV4LiBOb3RoaW5nIHdyaXR0ZW4iLAorCQkgICAgIG9sZF9hZGRyZXNzKTsKKwkgICAgcmV0ID0gS0VSTl9TVUNDRVNTOworCSAgICBsZW5ndGggPSAwOworCSAgICBnb3RvIG91dDsKKwkgIH0KKworCWlmICghKG1heF9wcm90ZWN0aW9uICYgVk1fUFJPVF9XUklURSkpCisJICB7CisJICAgIHdhcm5pbmcgKCJNZW1vcnkgYXQgYWRkcmVzcyAweCV4IGlzIHVud3JpdGFibGUuIE5vdGhpbmcgd3JpdHRlbiIsCisJCSAgICAgb2xkX2FkZHJlc3MpOworCSAgICByZXQgPSBLRVJOX1NVQ0NFU1M7CisJICAgIGxlbmd0aCA9IDA7CisJICAgIGdvdG8gb3V0OworCSAgfQorCisJLyogQ2hhaW4gdGhlIHJlZ2lvbnMgZm9yIGxhdGVyIHVzZSAqLworCXJlZ2lvbl9lbGVtZW50ID0gCisJICAoc3RydWN0IHZtX3JlZ2lvbl9saXN0ICopCisJICAgIG9ic3RhY2tfYWxsb2MgKCZyZWdpb25fb2JzdGFjaywgc2l6ZW9mIChzdHJ1Y3Qgdm1fcmVnaW9uX2xpc3QpKTsKKyAgICAKKwlyZWdpb25fZWxlbWVudC0+cHJvdGVjdGlvbiA9IHByb3RlY3Rpb247CisJcmVnaW9uX2VsZW1lbnQtPnN0YXJ0ICAgICAgPSByZWdpb25fYWRkcmVzczsKKwlyZWdpb25fZWxlbWVudC0+bGVuZ3RoICAgICA9IHJlZ2lvbl9sZW5ndGg7CisKKwkvKiBDaGFpbiB0aGUgcmVnaW9ucyBhbG9uZyB3aXRoIHByb3RlY3Rpb25zICovCisJcmVnaW9uX2VsZW1lbnQtPm5leHQgPSByZWdpb25faGVhZDsKKwlyZWdpb25faGVhZCAgICAgICAgICA9IHJlZ2lvbl9lbGVtZW50OworCQorCXJlZ2lvbl9hZGRyZXNzICs9IHJlZ2lvbl9sZW5ndGg7CisJcmVtYWluaW5nX2xlbmd0aCA9IHJlbWFpbmluZ19sZW5ndGggLSByZWdpb25fbGVuZ3RoOworICAgICAgfQorCisgICAgLyogSWYgdGhpbmdzIGZhaWwgYWZ0ZXIgdGhpcywgd2UgZ2l2ZSB1cC4KKyAgICAgKiBTb21lYm9keSBpcyBtZXNzaW5nIHVwIGluZmVyaW9yX3Rhc2sncyBtYXBwaW5ncy4KKyAgICAgKi8KKyAgICAKKyAgICAvKiBFbmFibGUgd3JpdGVzIHRvIHRoZSBjaGFpbmVkIHZtIHJlZ2lvbnMgKi8KKyAgICBmb3IgKHNjYW4gPSByZWdpb25faGVhZDsgc2Nhbjsgc2NhbiA9IHNjYW4tPm5leHQpCisgICAgICB7CisJYm9vbGVhbl90IHByb3RlY3Rpb25fY2hhbmdlZCA9IEZBTFNFOworCQorCWlmICghKHNjYW4tPnByb3RlY3Rpb24gJiBWTV9QUk9UX1dSSVRFKSkKKwkgIHsKKwkgICAgcmV0ID0gdm1fcHJvdGVjdCAoaW5mZXJpb3JfdGFzaywKKwkJCSAgICAgIHNjYW4tPnN0YXJ0LAorCQkJICAgICAgc2Nhbi0+bGVuZ3RoLAorCQkJICAgICAgRkFMU0UsCisJCQkgICAgICBzY2FuLT5wcm90ZWN0aW9uIHwgVk1fUFJPVF9XUklURSk7CisJICAgIENIS19HT1RPX09VVCAoInZtX3Byb3RlY3Q6IGVuYWJsZSB3cml0ZSBmYWlsZWQiLCByZXQpOworCSAgfQorICAgICAgfQorCisgICAgcmV0ID0gdm1fd3JpdGUgKGluZmVyaW9yX3Rhc2ssCisJCSAgICBsb3dfYWRkcmVzcywKKwkJICAgIGNvcGllZF9tZW1vcnksCisJCSAgICBhbGlnbmVkX2xlbmd0aCk7CisgICAgQ0hLX0dPVE9fT1VUICgidm1fd3JpdGUgZmFpbGVkIiwgcmV0KTsKKwkKKyAgICAvKiBTZXQgdXAgdGhlIG9yaWdpbmFsIHJlZ2lvbiBwcm90ZWN0aW9ucywgaWYgdGhleSB3ZXJlIGNoYW5nZWQgKi8KKyAgICBmb3IgKHNjYW4gPSByZWdpb25faGVhZDsgc2Nhbjsgc2NhbiA9IHNjYW4tPm5leHQpCisgICAgICB7CisJYm9vbGVhbl90IHByb3RlY3Rpb25fY2hhbmdlZCA9IEZBTFNFOworCQorCWlmICghKHNjYW4tPnByb3RlY3Rpb24gJiBWTV9QUk9UX1dSSVRFKSkKKwkgIHsKKwkgICAgcmV0ID0gdm1fcHJvdGVjdCAoaW5mZXJpb3JfdGFzaywKKwkJCSAgICAgIHNjYW4tPnN0YXJ0LAorCQkJICAgICAgc2Nhbi0+bGVuZ3RoLAorCQkJICAgICAgRkFMU0UsCisJCQkgICAgICBzY2FuLT5wcm90ZWN0aW9uKTsKKwkgICAgQ0hLX0dPVE9fT1VUICgidm1fcHJvdGVjdDogZW5hYmxlIHdyaXRlIGZhaWxlZCIsIHJldCk7CisJICB9CisgICAgICB9CisgIH0KKworIG91dDoKKyAgaWYgKGRlYWxsb2NhdGUpCisgICAgeworICAgICAgb2JzdGFja19mcmVlICgmcmVnaW9uX29ic3RhY2ssIDApOworICAgICAgCisgICAgICAodm9pZCkgdm1fZGVhbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYgKCksCisJCQkgICAgY29waWVkX21lbW9yeSwKKwkJCSAgICBjb3B5X2NvdW50KTsKKyAgICB9CisKKyAgaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpCisgICAgeworICAgICAgd2FybmluZyAoIiVzICVzIiwgZXJyc3RyLCBtYWNoX2Vycm9yX3N0cmluZyAocmV0KSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIGxlbmd0aDsKK30KKworLyogUmV0dXJuIDAgb24gZmFpbHVyZSwgbnVtYmVyIG9mIGJ5dGVzIGhhbmRsZWQgb3RoZXJ3aXNlLiAgKi8KK3N0YXRpYyBpbnQKK20zX3hmZXJfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbiwgd3JpdGUsIHRhcmdldCkKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IHdyaXRlOworICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0OwkvKiBJR05PUkVEICovCit7CisgIGludCByZXN1bHQ7CisKKyAgaWYgKHdyaXRlKQorICAgIHJlc3VsdCA9IG1hY2gzX3dyaXRlX2luZmVyaW9yIChtZW1hZGRyLCBteWFkZHIsIGxlbik7CisgIGVsc2UKKyAgICByZXN1bHQgPSBtYWNoM19yZWFkX2luZmVyaW9yICAobWVtYWRkciwgbXlhZGRyLCBsZW4pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKwwKK3N0YXRpYyBjaGFyICoKK3RyYW5zbGF0ZV9zdGF0ZShzdGF0ZSkKK2ludAlzdGF0ZTsKK3sKKyAgc3dpdGNoIChzdGF0ZSkgeworICBjYXNlIFRIX1NUQVRFX1JVTk5JTkc6CXJldHVybigiUiIpOworICBjYXNlIFRIX1NUQVRFX1NUT1BQRUQ6CXJldHVybigiUyIpOworICBjYXNlIFRIX1NUQVRFX1dBSVRJTkc6CXJldHVybigiVyIpOworICBjYXNlIFRIX1NUQVRFX1VOSU5URVJSVVBUSUJMRTogcmV0dXJuKCJVIik7CisgIGNhc2UgVEhfU1RBVEVfSEFMVEVEOgkJcmV0dXJuKCJIIik7CisgIGRlZmF1bHQ6CQkJcmV0dXJuKCI/Iik7CisgIH0KK30KKworc3RhdGljIGNoYXIgKgordHJhbnNsYXRlX2NzdGF0ZSAoc3RhdGUpCisgICAgIGludCBzdGF0ZTsKK3sKKyAgc3dpdGNoIChzdGF0ZSkKKyAgICB7CisgICAgY2FzZSBDUFJPQ19SVU5OSU5HOglyZXR1cm4gIlIiOworICAgIGNhc2UgQ1BST0NfU1dJVENISU5HOiByZXR1cm4gIlMiOworICAgIGNhc2UgQ1BST0NfQkxPQ0tFRDogcmV0dXJuICJCIjsKKyAgICBjYXNlIENQUk9DX0NPTkRXQUlUOiByZXR1cm4gIkMiOworICAgIGNhc2UgQ1BST0NfQ09ORFdBSVR8Q1BST0NfU1dJVENISU5HOiByZXR1cm4gIkNTIjsKKyAgICBkZWZhdWx0OiByZXR1cm4gIj8iOworICAgIH0KK30KKworLyogdHlwZSA9PSBNQUNIX01TR19UWVBFX0NPUFlfU0VORCB8fCB0eXBlID09IE1BQ0hfTVNHX1RZUEVfTUFLRV9TRU5EICovCisKK21hY2hfcG9ydF90ICAgICAgICAgICAvKiBubyBtYWNoX3BvcnRfbmFtZV90IGZvdW5kIGluIGluY2x1ZGUgZmlsZXMuICovCittYXBfaW5mZXJpb3JfcG9ydF9uYW1lIChpbmZlcmlvcl9uYW1lLCB0eXBlKQorICAgICBtYWNoX3BvcnRfdCBpbmZlcmlvcl9uYW1lOworICAgICBtYWNoX21zZ190eXBlX25hbWVfdCB0eXBlOworeworICBrZXJuX3JldHVybl90ICAgICAgICByZXQ7CisgIG1hY2hfbXNnX3R5cGVfbmFtZV90IGFjcXVpcmVkOworICBtYWNoX3BvcnRfdCAgICAgICAgICBpcG9ydDsKKyAgCisgIHJldCA9IG1hY2hfcG9ydF9leHRyYWN0X3JpZ2h0IChpbmZlcmlvcl90YXNrLAorCQkJCSBpbmZlcmlvcl9uYW1lLAorCQkJCSB0eXBlLAorCQkJCSAmaXBvcnQsCisJCQkJICZhY3F1aXJlZCk7CisgIENISygibWFjaF9wb3J0X2V4dHJhY3RfcmlnaHQgKG1hcF9pbmZlcmlvcl9wb3J0X25hbWUpIiwgcmV0KTsKKworICBpZiAoYWNxdWlyZWQgIT0gTUFDSF9NU0dfVFlQRV9QT1JUX1NFTkQpCisgICAgZXJyb3IoIkluY29ycmVjdCByaWdodCBleHRyYWN0ZWQsIChtYXBfaW5mZXJpb3JfcG9ydF9uYW1lKSIpOworCisgIHJldCA9IG1hY2hfcG9ydF9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwKKwkJCSAgICAgIGlwb3J0KTsKKyAgQ0hLICgiRGVhbGxvY2F0aW5nIG1hcHBlZCBwb3J0IChtYXBfaW5mZXJpb3JfcG9ydF9uYW1lKSIsIHJldCk7CisKKyAgcmV0dXJuIGlwb3J0OworfQorCisvKgorICogTmFtaW5nIGNvbnZlbnRpb246CisgKiAgQWx3YXlzIHJldHVybiB1c2VyIGRlZmluZWQgbmFtZSBpZiBmb3VuZC4KKyAqICBfSyA9PSBBIGtlcm5lbCB0aHJlYWQgd2l0aCBubyBtYXRjaGluZyBDUFJPQworICogIF9DID09IEEgY3Byb2Mgd2l0aCBubyBjdXJyZW50IGN0aHJlYWQKKyAqICBfdCA9PSBBIGN0aHJlYWQgd2l0aCBubyB1c2VyIGRlZmluZWQgbmFtZQorICoKKyAqIFRoZSBkaWdpdHMgdGhhdCBmb2xsb3cgdGhlIF9uYW1lcyBhcmUgdGhlIFNMT1QgbnVtYmVyIG9mIHRoZQorICoga2VybmVsIHRocmVhZCBpZiB0aGVyZSBpcyBzdWNoIGEgdGhpbmcsIG90aGVyd2lzZSBqdXN0IGEgbmVnYXRpb24KKyAqIG9mIHRoZSBzZXF1ZW50aWFsIG51bWJlciBvZiBzdWNoIGNwcm9jcy4KKyAqLworCitzdGF0aWMgY2hhciBidWZbN107CisKK3N0YXRpYyBjaGFyICoKK2dldF90aHJlYWRfbmFtZSAob25lX2Nwcm9jLCBpZCkKKyAgICAgZ2RiX3RocmVhZF90IG9uZV9jcHJvYzsKKyAgICAgaW50IGlkOworeworICBpZiAob25lX2Nwcm9jKQorICAgIGlmIChvbmVfY3Byb2MtPmN0aHJlYWQgPT0gTlVMTCkKKyAgICAgIHsKKwkvKiBjcHJvYyBub3QgbWFwcGVkIHRvIGFueSBjdGhyZWFkICovCisJc3ByaW50ZihidWYsICJfQyVkIiwgaWQpOworICAgICAgfQorICAgIGVsc2UgaWYgKCEgb25lX2Nwcm9jLT5jdGhyZWFkLT5uYW1lKQorICAgICAgeworCS8qIGNwcm9jIGFuZCBjdGhyZWFkLCBidXQgbm8gbmFtZSAqLworCXNwcmludGYoYnVmLCAiX3QlZCIsIGlkKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gKGNoYXIgKikob25lX2Nwcm9jLT5jdGhyZWFkLT5uYW1lKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChpZCA8IDApCisJd2FybmluZyAoIkluY29uc2lzdGVuY3kgaW4gdGhyZWFkIG5hbWUgaWQgJWQiLCBpZCk7CisKKyAgICAgIC8qIEtlcm5lbCB0aHJlYWQgd2l0aG91dCBjcHJvYyAqLworICAgICAgc3ByaW50ZihidWYsICJfSyVkIiwgaWQpOworICAgIH0KKworICByZXR1cm4gYnVmOworfQorCitpbnQKK2ZldGNoX3RocmVhZF9pbmZvICh0YXNrLCBtdGhyZWFkc19vdXQpCisgICAgIG1hY2hfcG9ydF90CXRhc2s7CisgICAgIGdkYl90aHJlYWRfdAkqbXRocmVhZHNfb3V0OwkvKiBvdXQgKi8KK3sKKyAga2Vybl9yZXR1cm5fdCAgcmV0OworICB0aHJlYWRfYXJyYXlfdCB0aF90YWJsZTsKKyAgaW50CQkgdGhfY291bnQ7CisgIGdkYl90aHJlYWRfdCBtdGhyZWFkcyA9IE5VTEw7CisgIGludCAJCSBpbmRleDsKKworICByZXQgPSB0YXNrX3RocmVhZHMgKHRhc2ssICZ0aF90YWJsZSwgJnRoX2NvdW50KTsKKyAgaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpCisgICAgeworICAgICAgd2FybmluZyAoIkVycm9yIGdldHRpbmcgaW5mZXJpb3IncyB0aHJlYWQgbGlzdDolcyIsCisJICAgICAgIG1hY2hfZXJyb3Jfc3RyaW5nKHJldCkpOworICAgICAgbTNfa2lsbF9pbmZlcmlvciAoKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIAorICBtdGhyZWFkcyA9IChnZGJfdGhyZWFkX3QpCisgICAgCQlvYnN0YWNrX2FsbG9jCisJCSAgKGNwcm9jX29ic3RhY2ssCisJCSAgIHRoX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgZ2RiX3RocmVhZCkpOworCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHRoX2NvdW50OyBpbmRleCsrKQorICAgIHsKKyAgICAgIHRocmVhZF90IHNhdmVkX3RocmVhZCA9IE1BQ0hfUE9SVF9OVUxMOworICAgICAgaW50IG1pZDsKKworICAgICAgaWYgKG11c3Rfc3VzcGVuZF90aHJlYWQpCisJc2V0dXBfdGhyZWFkICh0aF90YWJsZVsgaW5kZXggXSwgMSk7CisKKyAgICAgIGlmICh0aF90YWJsZVtpbmRleF0gIT0gY3VycmVudF90aHJlYWQpCisJeworCSAgc2F2ZWRfdGhyZWFkID0gY3VycmVudF90aHJlYWQ7CisJICAKKwkgIG1pZCA9IHN3aXRjaF90b190aHJlYWQgKHRoX3RhYmxlWyBpbmRleCBdKTsKKwl9CisKKyAgICAgIG10aHJlYWRzW2luZGV4XS5uYW1lICA9IHRoX3RhYmxlW2luZGV4XTsKKyAgICAgIG10aHJlYWRzW2luZGV4XS5jcHJvYyA9IE5VTEw7CS8qIG1hcF9jcHJvY3NfdG9fa2VybmVsX3RocmVhZHMoKSAqLworICAgICAgbXRocmVhZHNbaW5kZXhdLmluX2VtdWxhdG9yID0gRkFMU0U7CisgICAgICBtdGhyZWFkc1tpbmRleF0uc2xvdGlkID0gaW5kZXg7CisgICAgICAKKyAgICAgIG10aHJlYWRzW2luZGV4XS5zcCA9IHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSk7CisgICAgICBtdGhyZWFkc1tpbmRleF0uZnAgPSByZWFkX3JlZ2lzdGVyIChGUF9SRUdOVU0pOworICAgICAgbXRocmVhZHNbaW5kZXhdLnBjID0gcmVhZF9wYyAoKTsKKworICAgICAgaWYgKE1BQ0hfUE9SVF9WQUxJRCAoc2F2ZWRfdGhyZWFkKSkKKwltaWQgPSBzd2l0Y2hfdG9fdGhyZWFkIChzYXZlZF90aHJlYWQpOworCisgICAgICBpZiAobXVzdF9zdXNwZW5kX3RocmVhZCkKKwlzZXR1cF90aHJlYWQgKHRoX3RhYmxlWyBpbmRleCBdLCAwKTsKKyAgICB9CisgIAorICBjb25zdW1lX3NlbmRfcmlnaHRzICh0aF90YWJsZSwgdGhfY291bnQpOworICByZXQgPSB2bV9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZigpLCAodm1fYWRkcmVzc190KXRoX3RhYmxlLCAKKwkJICAgICAgICh0aF9jb3VudCAqIHNpemVvZihtYWNoX3BvcnRfdCkpKTsKKyAgaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpCisgICAgeworICAgICAgd2FybmluZyAoIkVycm9yIHRyeWluZyB0byBkZWFsbG9jYXRlIHRocmVhZCBsaXN0IDogJXMiLAorCSAgICAgICBtYWNoX2Vycm9yX3N0cmluZyAocmV0KSk7CisgICAgfQorCisgICptdGhyZWFkc19vdXQgPSBtdGhyZWFkczsKKworICByZXR1cm4gdGhfY291bnQ7Cit9CisKKworLyoKKyAqIEN1cnJlbnQgZW11bGF0b3IgYWx3YXlzIHNhdmVzIHRoZSBVU1Agb24gdG9wIG9mCisgKiBlbXVsYXRvciBzdGFjayBiZWxvdyBzdHJ1Y3QgZW11bF9zdGFja190b3Agc3R1ZmYuCisgKi8KK0NPUkVfQUREUgorZmV0Y2hfdXNwX2Zyb21fZW11bGF0b3Jfc3RhY2sgKHNwKQorICAgICBDT1JFX0FERFIgc3A7Cit7CisgIENPUkVfQUREUiBzdGFja19wb2ludGVyOworCisgIHNwID0gKHNwICYgfihFTVVMQVRPUl9TVEFDS19TSVpFLTEpKSArCisgICAgCUVNVUxBVE9SX1NUQUNLX1NJWkUgLSBzaXplb2YgKHN0cnVjdCBlbXVsX3N0YWNrX3RvcCk7CisgIAorICBpZiAobWFjaDNfcmVhZF9pbmZlcmlvciAoc3AsCisJCQkgICAmc3RhY2tfcG9pbnRlciwKKwkJCSAgIHNpemVvZiAoQ09SRV9BRERSKSkgIT0gc2l6ZW9mIChDT1JFX0FERFIpKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJDYW4ndCByZWFkIHVzZXIgc3AgZnJvbSBlbXVsYXRvciBzdGFjayBhZGRyZXNzIDB4JXgiLCBzcCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIHN0YWNrX3BvaW50ZXI7Cit9CisKKyNpZmRlZiBNSzY3CisKKy8qIGdldF9lbXVsYXRpb25fdmVjdG9yKCkgaW50ZXJmYWNlIHdhcyBjaGFuZ2VkIGFmdGVyIG1rNjcgKi8KKyNkZWZpbmUgRU1VTF9WRUNUT1JfQ09VTlQgNDAwCS8qIFZhbHVlIGRvZXMgbm90IG1hdHRlciB0b28gbXVjaCAqLworCisjZW5kaWYgLyogTUs2NyAqLworCisvKiBDaGVjayBpZiB0aGUgZW11bGF0b3IgZXhpc3RzIGF0IHRhc2sncyBhZGRyZXNzIHNwYWNlLgorICovCitib29sZWFuX3QKK2hhdmVfZW11bGF0b3JfcCAodGFzaykKKyAgICAgdGFza190IHRhc2s7Cit7CisgIGtlcm5fcmV0dXJuX3QJcmV0OworI2lmbmRlZiBFTVVMX1ZFQ1RPUl9DT1VOVAorICB2bV9vZmZzZXRfdAkqZW11bGF0aW9uX3ZlY3RvcjsKKyAgaW50CQluOworI2Vsc2UKKyAgdm1fb2Zmc2V0X3QJZW11bGF0aW9uX3ZlY3RvclsgRU1VTF9WRUNUT1JfQ09VTlQgXTsKKyAgaW50CQluID0gRU1VTF9WRUNUT1JfQ09VTlQ7CisjZW5kaWYKKyAgaW50CQlpOworICBpbnQJCXZlY3Rvcl9zdGFydDsKKyAgCisgIHJldCA9IHRhc2tfZ2V0X2VtdWxhdGlvbl92ZWN0b3IgKHRhc2ssCisJCQkJICAgJnZlY3Rvcl9zdGFydCwKKyNpZm5kZWYgRU1VTF9WRUNUT1JfQ09VTlQKKwkJCQkgICAmZW11bGF0aW9uX3ZlY3RvciwKKyNlbHNlCisJCQkJICAgZW11bGF0aW9uX3ZlY3RvciwKKyNlbmRpZgorCQkJCSAgICZuKTsKKyAgQ0hLKCJ0YXNrX2dldF9lbXVsYXRpb25fdmVjdG9yIiwgcmV0KTsKKyAgeHhfZGVidWcgKCIlZCB2ZWN0b3JzIGZyb20gJWQgYXQgMHglMDh4XG4iLAorCSAgICBuLCB2ZWN0b3Jfc3RhcnQsIGVtdWxhdGlvbl92ZWN0b3IpOworICAKKyAgZm9yKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKyAgICAgIHZtX29mZnNldF90IGVudHJ5ID0gZW11bGF0aW9uX3ZlY3RvciBbaV07CisKKyAgICAgIGlmIChFTVVMQVRPUl9CQVNFIDw9IGVudHJ5ICYmIGVudHJ5IDw9IEVNVUxBVE9SX0VORCkKKwlyZXR1cm4gVFJVRTsKKyAgICAgIGVsc2UgaWYgKGVudHJ5KQorCXsKKwkgIHN0YXRpYyBib29sZWFuX3QgaW5mb3JtZWQgPSBGQUxTRTsKKwkgIGlmICghaW5mb3JtZWQpCisJICAgIHsKKwkgICAgICB3YXJuaW5nKCJFbXVsYXRpb24gdmVjdG9yIGFkZHJlc3MgMHgwOCV4IG91dHNpZGUgZW11bGF0b3Igc3BhY2UiLAorCQkgICAgICBlbnRyeSk7CisJICAgICAgaW5mb3JtZWQgPSBUUlVFOworCSAgICB9CisJfQorICAgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCisvKiBNYXAgY3Byb2NzIHRvIGtlcm5lbCB0aHJlYWRzIGFuZCB2aWNlIHZlcnNhLiAgKi8KKwordm9pZAorbWFwX2Nwcm9jc190b19rZXJuZWxfdGhyZWFkcyAoY3Byb2NzLCBtdGhyZWFkcywgdGhyZWFkX2NvdW50KQorICAgICBnZGJfdGhyZWFkX3QgY3Byb2NzOworICAgICBnZGJfdGhyZWFkX3QgbXRocmVhZHM7CisgICAgIGludCB0aHJlYWRfY291bnQ7Cit7CisgIGludCBpbmRleDsKKyAgZ2RiX3RocmVhZF90IHNjYW47CisgIGJvb2xlYW5fdCBhbGxfbWFwcGVkID0gVFJVRTsKKyAgTE9OR0VTVCBzdGFja19iYXNlOworICBMT05HRVNUIHN0YWNrX3NpemU7CisKKyAgZm9yIChzY2FuID0gY3Byb2NzOyBzY2FuOyBzY2FuID0gc2Nhbi0+bmV4dCkKKyAgICB7CisgICAgICAvKiBEZWZhdWx0IHRvOiBubyBrZXJuZWwgdGhyZWFkIGZvciB0aGlzIGNwcm9jICovCisgICAgICBzY2FuLT5yZXZlcnNlX21hcCA9IC0xOworCisgICAgICAvKiBDaGVjayBpZiB0aGUgY3Byb2MgaXMgZm91bmQgYnkgaXRzIHN0YWNrICovCisgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0aHJlYWRfY291bnQ7IGluZGV4KyspCisJeworCSAgc3RhY2tfYmFzZSA9CisJICAgIGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKHNjYW4tPnJhd19jcHJvYyArIENQUk9DX0JBU0VfT0ZGU0VULAorCQkJCSAgICBDUFJPQ19CQVNFX1NJWkUpOworCSAgc3RhY2tfc2l6ZSA9IAorCSAgICBleHRyYWN0X3NpZ25lZF9pbnRlZ2VyIChzY2FuLT5yYXdfY3Byb2MgKyBDUFJPQ19TSVpFX09GRlNFVCwKKwkJCQkgICAgQ1BST0NfU0laRV9TSVpFKTsKKwkgIGlmICgobXRocmVhZHMgKyBpbmRleCktPnNwID4gc3RhY2tfYmFzZSAmJgorCSAgICAgIChtdGhyZWFkcyArIGluZGV4KS0+c3AgPD0gc3RhY2tfYmFzZSArIHN0YWNrX3NpemUpCisJICAgIHsKKwkgICAgICAobXRocmVhZHMgKyBpbmRleCktPmNwcm9jID0gc2NhbjsKKwkgICAgICBzY2FuLT5yZXZlcnNlX21hcCA9IGluZGV4OworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgYWxsX21hcHBlZCAmPSAoc2Nhbi0+cmV2ZXJzZV9tYXAgIT0gLTEpOworICAgIH0KKworICAvKiBDaGVjayBmb3IgdGhyZWFkcyB0aGF0IGFyZSBjdXJyZW50bHkgaW4gdGhlIGVtdWxhdG9yLgorICAgKiBJZiBzbywgdGhleSBoYXZlIGEgZGlmZmVyZW50IHN0YWNrLCBhbmQgdGhlIHN0aWxsIHVubWFwcGVkCisgICAqIGNwcm9jcyBtYXkgd2VsbCBnZXQgbWFwcGVkIHRvIHRoZXNlIHRocmVhZHMuCisgICAqIAorICAgKiBJZjoKKyAgICogIC0gY3Byb2Mgc3RhY2sgZG9lcyBub3QgbWF0Y2ggYW55IGtlcm5lbCB0aHJlYWQgc3RhY2sgcG9pbnRlcgorICAgKiAgLSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZXh0cmEga2VybmVsIHRocmVhZAorICAgKiAgICB0aGF0IGhhcyBubyBjcHJvYyBtYXBwZWQgYWJvdmUuCisgICAqICAtIHNvbWUga2VybmVsIHRocmVhZCBzdGFjayBwb2ludGVyIHBvaW50cyB0byBlbXVsYXRvciBzcGFjZQorICAgKiAgdGhlbiB3ZSBmaW5kIHRoZSB1c2VyIHN0YWNrIHBvaW50ZXIgc2F2ZWQgaW4gdGhlIGVtdWxhdG9yCisgICAqICBzdGFjaywgYW5kIHRyeSB0byBtYXAgdGhhdCB0byB0aGUgY3Byb2NzLgorICAgKgorICAgKiBBbHNvIHNldCBpbl9lbXVsYXRvciBmb3Iga2VybmVsIHRocmVhZHMuCisgICAqLyAKKworICBpZiAoZW11bGF0b3JfcHJlc2VudCkKKyAgICB7CisgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0aHJlYWRfY291bnQ7IGluZGV4KyspCisJeworCSAgQ09SRV9BRERSIGVtdWxfc3A7CisJICBDT1JFX0FERFIgdXNwOworCisJICBnZGJfdGhyZWFkX3QgbXRocmVhZCA9IChtdGhyZWFkcytpbmRleCk7CisJICBlbXVsX3NwID0gbXRocmVhZC0+c3A7CisKKwkgIGlmIChtdGhyZWFkLT5jcHJvYyA9PSBOVUxMICYmCisJICAgICAgRU1VTEFUT1JfQkFTRSA8PSBlbXVsX3NwICYmIGVtdWxfc3AgPD0gRU1VTEFUT1JfRU5EKQorCSAgICB7CisJICAgICAgbXRocmVhZC0+aW5fZW11bGF0b3IgPSBlbXVsYXRvcl9wcmVzZW50OworCSAgICAgIAorCSAgICAgIGlmICghYWxsX21hcHBlZCAmJiBjcHJvY3MpCisJCXsKKwkJICB1c3AgPSBmZXRjaF91c3BfZnJvbV9lbXVsYXRvcl9zdGFjayAoZW11bF9zcCk7CisJCSAgCisJCSAgLyogQEAgQ291bGQgYmUgbW9yZSBhY2N1cmF0ZSAqLworCQkgIGlmICghIHVzcCkKKwkJICAgIGVycm9yICgiWmVybyBzdGFjayBwb2ludGVyIHJlYWQgZnJvbSBlbXVsYXRvcj8iKTsKKwkJICAKKwkJICAvKiBUcnkgdG8gbWF0Y2ggdGhpcyBzdGFjayBwb2ludGVyIHRvIHRoZSBjcHJvY3MgdGhhdAorCQkgICAqIGRvbid0IHlldCBoYXZlIGEga2VybmVsIHRocmVhZC4KKwkJICAgKi8KKwkJICBmb3IgKHNjYW4gPSBjcHJvY3M7IHNjYW47IHNjYW4gPSBzY2FuLT5uZXh0KQorCQkgICAgeworCQkgICAgICAKKwkJICAgICAgLyogQ2hlY2sgaXMgdGhpcyB1bm1hcHBlZCBDUFJPQyBzdGFjayBjb250YWlucworCQkgICAgICAgKiB0aGUgdXNlciBzdGFjayBwb2ludGVyIHNhdmVkIGluIHRoZQorCQkgICAgICAgKiBlbXVsYXRvci4KKwkJICAgICAgICovCisJCSAgICAgIGlmIChzY2FuLT5yZXZlcnNlX21hcCA9PSAtMSkKKwkJCXsKKwkJCSAgc3RhY2tfYmFzZSA9CisJCQkgICAgZXh0cmFjdF9zaWduZWRfaW50ZWdlcgorCQkJICAgICAgKHNjYW4tPnJhd19jcHJvYyArIENQUk9DX0JBU0VfT0ZGU0VULAorCQkJICAgICAgIENQUk9DX0JBU0VfU0laRSk7CisJCQkgIHN0YWNrX3NpemUgPSAKKwkJCSAgICBleHRyYWN0X3NpZ25lZF9pbnRlZ2VyCisJCQkgICAgICAoc2Nhbi0+cmF3X2Nwcm9jICsgQ1BST0NfU0laRV9PRkZTRVQsCisJCQkgICAgICAgQ1BST0NfU0laRV9TSVpFKTsKKwkJCSAgaWYgKHVzcCA+IHN0YWNrX2Jhc2UgJiYKKwkJCSAgICAgIHVzcCA8PSBzdGFja19iYXNlICsgc3RhY2tfc2l6ZSkKKwkJCSAgICB7CisJCQkgICAgICBtdGhyZWFkLT5jcHJvYyA9IHNjYW47CisJCQkgICAgICBzY2FuLT5yZXZlcnNlX21hcCA9IGluZGV4OworCQkJICAgICAgYnJlYWs7CisJCQkgICAgfQorCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgfQorfQorDAorLyoKKyAqIEZvcm1hdCBvZiB0aGUgdGhyZWFkX2xpc3QgY29tbWFuZAorICoKKyAqIAkgICAgICAgICAgICAgc2xvdCBtaWQgc2VsICAgbmFtZSAgZW11bCBrcyBzdXNwICBjc3RhdGUgd2lyZWQgICBhZGRyZXNzCisgKi8KKyNkZWZpbmUgVExfRk9STUFUICIlLTIuMnMgJTVkJWMgJS0xMC4xMHMgJTEuMXMlcyUtNS41cyAlLTIuMnMgJS01LjVzICIKKworI2RlZmluZSBUTF9IRUFERVIgIlxuQCAgICBNSUQgIE5hbWUgICAgICAgIEtTdGF0ZSBDU3RhdGUgICBXaGVyZVxuIgorCit2b2lkCitwcmludF90bF9hZGRyZXNzIChzdHJlYW0sIHBjKQorICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBDT1JFX0FERFIgcGM7Cit7CisgIGlmICghIGxvb2t1cF9taW5pbWFsX3N5bWJvbF9ieV9wYyAocGMpKQorICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgbG9jYWxfaGV4X2Zvcm1hdCgpLCBwYyk7CisgIGVsc2UKKyAgICB7CisgICAgICBleHRlcm4gaW50IGFkZHJlc3NwcmludDsKKyAgICAgIGV4dGVybiBpbnQgYXNtX2RlbWFuZ2xlOworCisgICAgICBpbnQgc3RvcmUgICAgPSBhZGRyZXNzcHJpbnQ7CisgICAgICBhZGRyZXNzcHJpbnQgPSAwOworICAgICAgcHJpbnRfYWRkcmVzc19zeW1ib2xpYyAocGMsIHN0cmVhbSwgYXNtX2RlbWFuZ2xlLCAiIik7CisgICAgICBhZGRyZXNzcHJpbnQgPSBzdG9yZTsKKyAgICB9Cit9CisMCisvKiBGb3IgdGhyZWFkIG5hbWVzLCBidXQgYWxzbyBmb3IgZ2RiX21lc3NhZ2VfcG9ydCBleHRlcm5hbCBuYW1lICovCisjZGVmaW5lIE1BWF9OQU1FX0xFTiA1MAorCisvKiBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHZhcmlhYmxlIE5BTUUgb3IgMCBpZiBub3QgZm91bmQgKi8KK0NPUkVfQUREUgorbG9va3VwX2FkZHJlc3Nfb2ZfdmFyaWFibGUgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgQ09SRV9BRERSIHN5bWFkZHIgPSAwOworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisKKyAgc3ltID0gbG9va3VwX3N5bWJvbCAobmFtZSwKKwkJICAgICAgIChzdHJ1Y3QgYmxvY2sgKilOVUxMLAorCQkgICAgICAgVkFSX05BTUVTUEFDRSwKKwkJICAgICAgIChpbnQgKilOVUxMLAorCQkgICAgICAgKHN0cnVjdCBzeW10YWIgKiopTlVMTCk7CisKKyAgaWYgKHN5bSkKKyAgICBzeW1hZGRyID0gU1lNQk9MX1ZBTFVFIChzeW0pOworCisgIGlmICghIHN5bWFkZHIpCisgICAgeworICAgICAgbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAobmFtZSwgTlVMTCwgTlVMTCk7CisKKyAgICAgIGlmIChtc3ltYm9sICYmIG1zeW1ib2wtPnR5cGUgPT0gbXN0X2RhdGEpCisJc3ltYWRkciA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKTsKKyAgICB9CisKKyAgcmV0dXJuIHN5bWFkZHI7Cit9CisKK3N0YXRpYyBnZGJfdGhyZWFkX3QKK2dldF9jcHJvY3MoKQoreworICBnZGJfdGhyZWFkX3QgY3Byb2NfaGVhZDsKKyAgZ2RiX3RocmVhZF90IGNwcm9jX2NvcHk7CisgIENPUkVfQUREUiB0aGVpcl9jcHJvY3M7CisgIGNoYXIgKmJ1ZltUQVJHRVRfUFRSX0JJVCAvIEhPU1RfQ0hBUl9CSVRdOworICBjaGFyICpuYW1lOworICBjdGhyZWFkX3QgY3RocmVhZDsKKyAgQ09SRV9BRERSIHN5bWFkZHI7CisgIAorICBzeW1hZGRyID0gbG9va3VwX2FkZHJlc3Nfb2ZfdmFyaWFibGUgKCJjcHJvY19saXN0Iik7CisKKyAgaWYgKCEgc3ltYWRkcikKKyAgICB7CisgICAgICAvKiBjcHJvY19saXN0IGlzIG5vdCBpbiBhIGZpbGUgY29tcGlsZWQgd2l0aCBkZWJ1Z2dpbmcKKwkgc3ltYm9scywgYnV0IGRvbid0IGdpdmUgdXAgeWV0ICovCisKKyAgICAgIHN5bWFkZHIgPSBsb29rdXBfYWRkcmVzc19vZl92YXJpYWJsZSAoImNwcm9jcyIpOworCisgICAgICBpZiAoc3ltYWRkcikKKwl7CisJICBzdGF0aWMgaW50IGluZm9ybWVkID0gMDsKKwkgIGlmICghaW5mb3JtZWQpCisJICAgIHsKKwkgICAgICBpbmZvcm1lZCsrOworCSAgICAgIHdhcm5pbmcgKCJZb3VyIHByb2dyYW0gaXMgbG9hZGVkIHdpdGggYW4gb2xkIHRocmVhZHMgbGlicmFyeS4iKTsKKwkgICAgICB3YXJuaW5nICgiR0RCIGRvZXMgbm90IGtub3cgdGhlIG9sZCBmb3JtIG9mIHRocmVhZHMiKTsKKwkgICAgICB3YXJuaW5nICgic28gdGhpbmdzIG1heSBub3Qgd29yay4iKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogU3RyaXBwZWQgb3Igbm8gLWx0aHJlYWRzIGxvYWRlZCBvciAiY3Byb2NfbGlzdCIgaXMgaW4gd3Jvbmcgc2VnbWVudC4gKi8KKyAgaWYgKCEgc3ltYWRkcikKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGNwcm9jIGluIHRoZSB0YXNrICovCisgIGlmICghbWFjaDNfcmVhZF9pbmZlcmlvciAoc3ltYWRkciwKKwkJCSAgICBidWYsCisJCQkgICAgVEFSR0VUX1BUUl9CSVQgLyBIT1NUX0NIQVJfQklUKSkKKyAgICBlcnJvciAoIkNhbid0IHJlYWQgY3Byb2MgbWFzdGVyIGxpc3QgYXQgYWRkcmVzcyAoMHgleCkuIiwgc3ltYWRkcik7CisgIHRoZWlyX2Nwcm9jcyA9IGV4dHJhY3RfYWRkcmVzcyAoYnVmLCBUQVJHRVRfUFRSX0JJVCAvIEhPU1RfQ0hBUl9CSVQpOworCisgIC8qIFNjYW4gdGhlIENQUk9DcyBpbiB0aGUgdGFzay4KKyAgICAgQ1BST0NzIGFyZSBjaGFpbmVkIHdpdGggTElTVCBmaWVsZCwgbm90IE5FWFQgZmllbGQsIHdoaWNoCisgICAgIGNoYWlucyBtdXRleGVzLCBjb25kaXRpb24gdmFyaWFibGVzIGFuZCBxdWV1ZXMgKi8KKworICBjcHJvY19oZWFkID0gTlVMTDsKKworICB3aGlsZSAodGhlaXJfY3Byb2NzICE9IChDT1JFX0FERFIpMCkKKyAgICB7CisgICAgICBDT1JFX0FERFIgY3Byb2NfY29weV9pbmNhcm5hdGlvbjsKKyAgICAgIGNwcm9jX2NvcHkgPSAoZ2RiX3RocmVhZF90KSBvYnN0YWNrX2FsbG9jIChjcHJvY19vYnN0YWNrLAorCQkJCQkJIHNpemVvZiAoc3RydWN0IGdkYl90aHJlYWQpKTsKKworICAgICAgaWYgKCFtYWNoM19yZWFkX2luZmVyaW9yICh0aGVpcl9jcHJvY3MsCisJCQkJJmNwcm9jX2NvcHktPnJhd19jcHJvY1swXSwKKwkJCQlDUFJPQ19TSVpFKSkKKwllcnJvcigiQ2FuJ3QgcmVhZCBuZXh0IGNwcm9jIGF0IDB4JXguIiwgdGhlaXJfY3Byb2NzKTsKKworICAgICAgdGhlaXJfY3Byb2NzID0KKwlleHRyYWN0X2FkZHJlc3MgKGNwcm9jX2NvcHktPnJhd19jcHJvYyArIENQUk9DX0xJU1RfT0ZGU0VULAorCQkJIENQUk9DX0xJU1RfU0laRSk7CisgICAgICBjcHJvY19jb3B5X2luY2FybmF0aW9uID0KKwlleHRyYWN0X2FkZHJlc3MgKGNwcm9jX2NvcHktPnJhd19jcHJvYyArIENQUk9DX0lOQ0FSTkFUSU9OX09GRlNFVCwKKwkJCSBDUFJPQ19JTkNBUk5BVElPTl9TSVpFKTsKKworICAgICAgaWYgKGNwcm9jX2NvcHlfaW5jYXJuYXRpb24gPT0gKENPUkVfQUREUikwKQorCWNwcm9jX2NvcHktPmN0aHJlYWQgPSBOVUxMOworICAgICAgZWxzZQorCXsKKwkgIC8qIFRoaXMgQ1BST0MgaGFzIGFuIGF0dGFjaGVkIENUSFJFQUQuIEdldCBpdHMgbmFtZSAqLworCSAgY3RocmVhZCA9IChjdGhyZWFkX3Qpb2JzdGFja19hbGxvYyAoY3Byb2Nfb2JzdGFjaywKKwkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBjdGhyZWFkKSk7CisKKwkgIGlmICghbWFjaDNfcmVhZF9pbmZlcmlvciAoY3Byb2NfY29weV9pbmNhcm5hdGlvbiwKKwkJCQkgICAgY3RocmVhZCwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBjdGhyZWFkKSkpCisJICAgIGVycm9yKCJDYW4ndCByZWFkIG5leHQgdGhyZWFkIGF0IDB4JXguIiwKKwkJICBjcHJvY19jb3B5X2luY2FybmF0aW9uKTsKKworCSAgY3Byb2NfY29weS0+Y3RocmVhZCA9IGN0aHJlYWQ7CisKKwkgIGlmIChjdGhyZWFkLT5uYW1lKQorCSAgICB7CisJICAgICAgbmFtZSA9IChjaGFyICopIG9ic3RhY2tfYWxsb2MgKGNwcm9jX29ic3RhY2ssIE1BWF9OQU1FX0xFTik7CisKKwkgICAgICBpZiAoIW1hY2gzX3JlYWRfaW5mZXJpb3IoY3RocmVhZC0+bmFtZSwgbmFtZSwgTUFYX05BTUVfTEVOKSkKKwkJZXJyb3IoIkNhbid0IHJlYWQgbmV4dCB0aHJlYWQncyBuYW1lIGF0IDB4JXguIiwgY3RocmVhZC0+bmFtZSk7CisKKwkgICAgICBjdGhyZWFkLT5uYW1lID0gbmFtZTsKKwkgICAgfQorCX0KKworICAgICAgLyogaW5zZXJ0IGluIGZyb250ICovCisgICAgICBjcHJvY19jb3B5LT5uZXh0ID0gY3Byb2NfaGVhZDsKKyAgICAgIGNwcm9jX2hlYWQgPSBjcHJvY19jb3B5OworICAgIH0KKyAgcmV0dXJuIGNwcm9jX2hlYWQ7Cit9CisKKyNpZm5kZWYgRkVUQ0hfQ1BST0NfU1RBVEUKKy8qCisgKiBDaGVjayBpZiB5b3VyIG1hY2hpbmUgZG9lcyBub3QgZ3JvayB0aGUgd2F5IHRoaXMgcm91dGluZQorICogZmV0Y2hlcyB0aGUgRlAsUEMgYW5kIFNQIG9mIGEgY3Byb2MgdGhhdCBpcyBub3QKKyAqIGN1cnJlbnRseSBhdHRhY2hlZCB0byBhbnkga2VybmVsIHRocmVhZCAoZS5nLiBpdHMgY3Byb2MuY29udGV4dAorICogZmllbGQgcG9pbnRzIHRvIHRoZSBwbGFjZSBpbiBzdGFjayB3aGVyZSB0aGUgY29udGV4dAorICogaXMgc2F2ZWQpLgorICoKKyAqIElmIGl0IGRvZXNuJ3QsIGRlZmluZSB5b3VyIG93biByb3V0aW5lLgorICovCisjZGVmaW5lIEZFVENIX0NQUk9DX1NUQVRFKG10aCkgbWFjaDNfY3Byb2Nfc3RhdGUgKG10aCkKKworaW50CittYWNoM19jcHJvY19zdGF0ZSAobXRocmVhZCkKKyAgICAgZ2RiX3RocmVhZF90IG10aHJlYWQ7Cit7CisgIGludCBjb250ZXh0OworCisgIGlmICghIG10aHJlYWQgfHwgIW10aHJlYWQtPmNwcm9jKQorICAgIHJldHVybiAtMTsKKworICBjb250ZXh0ID0gZXh0cmFjdF9zaWduZWRfaW50ZWdlcgorICAgIChtdGhyZWFkLT5jcHJvYy0+cmF3X2Nwcm9jICsgQ1BST0NfQ09OVEVYVF9PRkZTRVQsCisgICAgIENQUk9DX0NPTlRFWFRfU0laRSk7CisgIGlmIChjb250ZXh0ID09IDApCisgICAgcmV0dXJuIC0xOworCisgIG10aHJlYWQtPnNwID0gY29udGV4dCArIE1BQ0hJTkVfQ1BST0NfU1BfT0ZGU0VUOworCisgIGlmIChtYWNoM19yZWFkX2luZmVyaW9yIChjb250ZXh0ICsgTUFDSElORV9DUFJPQ19QQ19PRkZTRVQsCisJCQkgICAmbXRocmVhZC0+cGMsCisJCQkgICBzaXplb2YgKENPUkVfQUREUikpICE9IHNpemVvZiAoQ09SRV9BRERSKSkKKyAgICB7CisgICAgICB3YXJuaW5nICgiQ2FuJ3QgcmVhZCBjcHJvYyBwYyBmcm9tIGluZmVyaW9yIik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmIChtYWNoM19yZWFkX2luZmVyaW9yIChjb250ZXh0ICsgTUFDSElORV9DUFJPQ19GUF9PRkZTRVQsCisJCQkgICAmbXRocmVhZC0+ZnAsCisJCQkgICBzaXplb2YgKENPUkVfQUREUikpICE9IHNpemVvZiAoQ09SRV9BRERSKSkKKyAgICB7CisgICAgICB3YXJuaW5nICgiQ2FuJ3QgcmVhZCBjcHJvYyBmcCBmcm9tIGluZmVyaW9yIik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAwOworfQorI2VuZGlmIC8qIEZFVENIX0NQUk9DX1NUQVRFICovCisKKwwKK3ZvaWQKK3RocmVhZF9saXN0X2NvbW1hbmQoKQoreworICB0aHJlYWRfYmFzaWNfaW5mb19kYXRhX3QgdGhzOworICBpbnQgICAgIHRocmVhZF9jb3VudDsKKyAgZ2RiX3RocmVhZF90IGNwcm9jczsKKyAgZ2RiX3RocmVhZF90IHNjYW47CisgIGludCAgICAgaW5kZXg7CisgIGNoYXIgICAqbmFtZTsKKyAgY2hhciAgICBzZWxlY3RlZDsKKyAgY2hhciAgICp3aXJlZDsKKyAgaW50ICAgICBpbmZvQ250OworICBrZXJuX3JldHVybl90IHJldDsKKyAgbWFjaF9wb3J0X3QgICBtaWRfb3JfcG9ydDsKKyAgZ2RiX3RocmVhZF90ICB0aGVpcl90aHJlYWRzOworICBnZGJfdGhyZWFkX3QgIGt0aHJlYWQ7CisKKyAgaW50IG5ld29yZGVyID0gMTsKKworICBjaGFyICpmbXQgPSAiVGhlcmUgYXJlICVkIGtlcm5lbCB0aHJlYWRzIGluIHRhc2sgJWQuXG4iOworICAKKyAgaW50IHRtaWQgPSBtYXBfcG9ydF9uYW1lX3RvX21pZCAoaW5mZXJpb3JfdGFzaywgTUFDSF9UWVBFX1RBU0spOworICAKKyAgTUFDSF9FUlJPUl9OT19JTkZFUklPUjsKKyAgCisgIHRocmVhZF9jb3VudCA9IGZldGNoX3RocmVhZF9pbmZvIChpbmZlcmlvcl90YXNrLAorCQkJCSAgICAmdGhlaXJfdGhyZWFkcyk7CisgIGlmICh0aHJlYWRfY291bnQgPT0gLTEpCisgICAgcmV0dXJuOworICAKKyAgaWYgKHRocmVhZF9jb3VudCA9PSAxKQorICAgIGZtdCA9ICJUaGVyZSBpcyAlZCBrZXJuZWwgdGhyZWFkIGluIHRhc2sgJWQuXG4iOworICAKKyAgcHJpbnRmX2ZpbHRlcmVkIChmbXQsIHRocmVhZF9jb3VudCwgdG1pZCk7CisgIAorICBwdXRzX2ZpbHRlcmVkIChUTF9IRUFERVIpOworICAKKyAgY3Byb2NzID0gZ2V0X2Nwcm9jcygpOworICAKKyAgbWFwX2Nwcm9jc190b19rZXJuZWxfdGhyZWFkcyAoY3Byb2NzLCB0aGVpcl90aHJlYWRzLCB0aHJlYWRfY291bnQpOworICAKKyAgZm9yIChzY2FuID0gY3Byb2NzOyBzY2FuOyBzY2FuID0gc2Nhbi0+bmV4dCkKKyAgICB7CisgICAgICBpbnQgbWlkOworICAgICAgY2hhciBidWZbMTBdOworICAgICAgY2hhciBzbG90WzNdOworICAgICAgaW50IGNwcm9jX3N0YXRlID0KKwlleHRyYWN0X3NpZ25lZF9pbnRlZ2VyCisJICAoc2Nhbi0+cmF3X2Nwcm9jICsgQ1BST0NfU1RBVEVfT0ZGU0VULCBDUFJPQ19TVEFURV9TSVpFKTsKKyAgICAgIAorICAgICAgc2VsZWN0ZWQgPSAnICc7CisgICAgICAKKyAgICAgIC8qIGEgd2lyZWQgY3Byb2M/ICovCisgICAgICB3aXJlZCA9IChleHRyYWN0X2FkZHJlc3MgKHNjYW4tPnJhd19jcHJvYyArIENQUk9DX1dJUkVEX09GRlNFVCwKKwkJCQlDUFJPQ19XSVJFRF9TSVpFKQorCSAgICAgICA/ICJ3aXJlZCIgOiAiIik7CisKKyAgICAgIGlmIChzY2FuLT5yZXZlcnNlX21hcCAhPSAtMSkKKwlrdGhyZWFkICA9ICh0aGVpcl90aHJlYWRzICsgc2Nhbi0+cmV2ZXJzZV9tYXApOworICAgICAgZWxzZQorCWt0aHJlYWQgID0gTlVMTDsKKworICAgICAgaWYgKGt0aHJlYWQpCisJeworCSAgLyogVGhlc2UgY3Byb2NzIGhhdmUgYSBrZXJuZWwgdGhyZWFkICovCisJICAKKwkgIG1pZCA9IG1hcF9wb3J0X25hbWVfdG9fbWlkIChrdGhyZWFkLT5uYW1lLCBNQUNIX1RZUEVfVEhSRUFEKTsKKwkgIAorCSAgaW5mb0NudCA9IFRIUkVBRF9CQVNJQ19JTkZPX0NPVU5UOworCSAgCisJICByZXQgPSB0aHJlYWRfaW5mbyAoa3RocmVhZC0+bmFtZSwKKwkJCSAgICAgVEhSRUFEX0JBU0lDX0lORk8sCisJCQkgICAgICh0aHJlYWRfaW5mb190KSZ0aHMsCisJCQkgICAgICZpbmZvQ250KTsKKwkgIAorCSAgaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpCisJICAgIHsKKwkgICAgICB3YXJuaW5nICgiVW5hYmxlIHRvIGdldCBiYXNpYyBpbmZvIG9uIHRocmVhZCAlZCA6ICVzIiwKKwkJICAgICAgIG1pZCwKKwkJICAgICAgIG1hY2hfZXJyb3Jfc3RyaW5nIChyZXQpKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICAvKiBXaG8gaXMgdGhlIGZpcnN0IHRvIGhhdmUgbW9yZSB0aGFuIDEwMCB0aHJlYWRzICovCisJICBzcHJpbnRmIChzbG90LCAiJWQiLCBrdGhyZWFkLT5zbG90aWQlMTAwKTsKKworCSAgaWYgKGt0aHJlYWQtPm5hbWUgPT0gY3VycmVudF90aHJlYWQpCisJICAgIHNlbGVjdGVkID0gJyonOworCSAgCisJICBpZiAodGhzLnN1c3BlbmRfY291bnQpCisJICAgIHNwcmludGYgKGJ1ZiwgIiVkIiwgdGhzLnN1c3BlbmRfY291bnQpOworCSAgZWxzZQorCSAgICBidWZbMF0gPSAnXDAwMCc7CisKKyNpZiAwCisJICBpZiAodGhzLmZsYWdzICYgVEhfRkxBR1NfU1dBUFBFRCkKKwkgICAgc3RyY2F0IChidWYsICJTIik7CisjZW5kaWYKKworCSAgaWYgKHRocy5mbGFncyAmIFRIX0ZMQUdTX0lETEUpCisJICAgIHN0cmNhdCAoYnVmLCAiSSIpOworCisJICBwcmludGZfZmlsdGVyZWQgKFRMX0ZPUk1BVCwKKwkJCSAgIHNsb3QsCisJCQkgICBtaWQsCisJCQkgICBzZWxlY3RlZCwKKwkJCSAgIGdldF90aHJlYWRfbmFtZSAoc2Nhbiwga3RocmVhZC0+c2xvdGlkKSwKKwkJCSAgIGt0aHJlYWQtPmluX2VtdWxhdG9yID8gIkUiIDogIiIsCisJCQkgICB0cmFuc2xhdGVfc3RhdGUgKHRocy5ydW5fc3RhdGUpLAorCQkJICAgYnVmLAorCQkJICAgdHJhbnNsYXRlX2NzdGF0ZSAoY3Byb2Nfc3RhdGUpLAorCQkJICAgd2lyZWQpOworCSAgcHJpbnRfdGxfYWRkcmVzcyAoZ2RiX3N0ZG91dCwga3RocmVhZC0+cGMpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBUaGVzZSBjcHJvY3MgZG9uJ3QgaGF2ZSBhIGtlcm5lbCB0aHJlYWQuCisJICAgKiBmaW5kIG91dCB0aGUgY2FsbGluZyBmcmFtZSB3aXRoIAorCSAgICogRkVUQ0hfQ1BST0NfU1RBVEUuCisJICAgKi8KKworCSAgc3RydWN0IGdkYl90aHJlYWQgc3RhdGU7CisKKyNpZiAwCisJICAvKiBqdHYgLT4gZW1jbWFudXM6IHdoeSBkbyB5b3Ugd2FudCB0aGlzIGhlcmU/ICovCisJICBpZiAoc2Nhbi0+aW5jYXJuYXRpb24gPT0gTlVMTCkKKwkgICAgY29udGludWU7IC8qIEVNY00gKi8KKyNlbmRpZgorCisJICBwcmludGZfZmlsdGVyZWQgKFRMX0ZPUk1BVCwKKwkJCSAgICItIiwKKwkJCSAgIC1uZXdvcmRlciwJLyogUHNldWRvIE1JRCAqLworCQkJICAgc2VsZWN0ZWQsCisJCQkgICBnZXRfdGhyZWFkX25hbWUgKHNjYW4sIC1uZXdvcmRlciksCisJCQkgICAiIiwKKwkJCSAgICItIiwJLyoga2VybmVsIHN0YXRlICovCisJCQkgICAiIiwKKwkJCSAgIHRyYW5zbGF0ZV9jc3RhdGUgKGNwcm9jX3N0YXRlKSwKKwkJCSAgICIiKTsKKwkgIHN0YXRlLmNwcm9jID0gc2NhbjsKKworCSAgaWYgKEZFVENIX0NQUk9DX1NUQVRFICgmc3RhdGUpID09IC0xKQorCSAgICBwdXRzX2ZpbHRlcmVkICgiPz8/Iik7CisJICBlbHNlCisJICAgIHByaW50X3RsX2FkZHJlc3MgKGdkYl9zdGRvdXQsIHN0YXRlLnBjKTsKKworCSAgbmV3b3JkZXIrKzsKKwl9CisgICAgICBwdXRzX2ZpbHRlcmVkICgiXG4iKTsKKyAgICB9CisgIAorICAvKiBTY2FuIGZvciBrZXJuZWwgdGhyZWFkcyB3aXRob3V0IGNwcm9jcyAqLworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0aHJlYWRfY291bnQ7IGluZGV4KyspCisgICAgeworICAgICAgaWYgKCEgdGhlaXJfdGhyZWFkc1tpbmRleF0uY3Byb2MpCisJeworCSAgaW50IG1pZDsKKwkgIAorCSAgY2hhciBidWZbMTBdOworCSAgY2hhciBzbG90WzNdOworCisJICBtYWNoX3BvcnRfdCBuYW1lID0gdGhlaXJfdGhyZWFkc1tpbmRleF0ubmFtZTsKKwkgIAorCSAgbWlkID0gbWFwX3BvcnRfbmFtZV90b19taWQgKG5hbWUsIE1BQ0hfVFlQRV9USFJFQUQpOworCSAgCisJICBpbmZvQ250ID0gVEhSRUFEX0JBU0lDX0lORk9fQ09VTlQ7CisJICAKKwkgIHJldCA9IHRocmVhZF9pbmZvKG5hbWUsCisJCQkgICAgVEhSRUFEX0JBU0lDX0lORk8sCisJCQkgICAgKHRocmVhZF9pbmZvX3QpJnRocywKKwkJCSAgICAmaW5mb0NudCk7CisJICAgIAorCSAgaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpCisJICAgIHsKKwkgICAgICB3YXJuaW5nICgiVW5hYmxlIHRvIGdldCBiYXNpYyBpbmZvIG9uIHRocmVhZCAlZCA6ICVzIiwKKwkJICAgICAgIG1pZCwKKwkJICAgICAgIG1hY2hfZXJyb3Jfc3RyaW5nIChyZXQpKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJICBzcHJpbnRmIChzbG90LCAiJWQiLCBpbmRleCUxMDApOworCisJICBpZiAobmFtZSA9PSBjdXJyZW50X3RocmVhZCkKKwkgICAgc2VsZWN0ZWQgPSAnKic7CisJICBlbHNlCisJICAgIHNlbGVjdGVkID0gJyAnOworCisJICBpZiAodGhzLnN1c3BlbmRfY291bnQpCisJICAgIHNwcmludGYgKGJ1ZiwgIiVkIiwgdGhzLnN1c3BlbmRfY291bnQpOworCSAgZWxzZQorCSAgICBidWZbMF0gPSAnXDAwMCc7CisKKyNpZiAwCisJICBpZiAodGhzLmZsYWdzICYgVEhfRkxBR1NfU1dBUFBFRCkKKwkgICAgc3RyY2F0IChidWYsICJTIik7CisjZW5kaWYKKworCSAgaWYgKHRocy5mbGFncyAmIFRIX0ZMQUdTX0lETEUpCisJICAgIHN0cmNhdCAoYnVmLCAiSSIpOworCisJICBwcmludGZfZmlsdGVyZWQgKFRMX0ZPUk1BVCwKKwkJCSAgIHNsb3QsCisJCQkgICBtaWQsCisJCQkgICBzZWxlY3RlZCwKKwkJCSAgIGdldF90aHJlYWRfbmFtZSAoTlVMTCwgaW5kZXgpLAorCQkJICAgdGhlaXJfdGhyZWFkc1tpbmRleF0uaW5fZW11bGF0b3IgPyAiRSIgOiAiIiwKKwkJCSAgIHRyYW5zbGF0ZV9zdGF0ZSAodGhzLnJ1bl9zdGF0ZSksCisJCQkgICBidWYsCisJCQkgICAiIiwgICAvKiBObyBjcHJvYyBzdGF0ZSAqLworCQkJICAgIiIpOwkvKiBDYW4ndCBiZSB3aXJlZCAqLworCSAgcHJpbnRfdGxfYWRkcmVzcyAoZ2RiX3N0ZG91dCwgdGhlaXJfdGhyZWFkc1tpbmRleF0ucGMpOworCSAgcHV0c19maWx0ZXJlZCAoIlxuIik7CisJfQorICAgIH0KKyAgCisgIG9ic3RhY2tfZnJlZSAoY3Byb2Nfb2JzdGFjaywgMCk7CisgIG9ic3RhY2tfaW5pdCAoY3Byb2Nfb2JzdGFjayk7Cit9CisMCit2b2lkCit0aHJlYWRfc2VsZWN0X2NvbW1hbmQoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IG1pZDsKKyAgdGhyZWFkX2FycmF5X3QgdGhyZWFkX2xpc3Q7CisgIGludCB0aHJlYWRfY291bnQ7CisgIGtlcm5fcmV0dXJuX3QgcmV0OworICBpbnQgaXNfc2xvdCA9IDA7CisKKyAgTUFDSF9FUlJPUl9OT19JTkZFUklPUjsKKworICBpZiAoIWFyZ3MpCisgICAgZXJyb3Jfbm9fYXJnICgiTUlEIG9yIEBTTE9UTlVNQkVSIHRvIHNwZWNpZnkgYSB0aHJlYWQgdG8gc2VsZWN0Iik7CisKKyAgd2hpbGUgKCphcmdzID09ICcgJyB8fCAqYXJncyA9PSAnXHQnKQorICAgIGFyZ3MrKzsKKworICBpZiAoKmFyZ3MgPT0gJ0AnKQorICAgIHsKKyAgICAgIGlzX3Nsb3QrKzsKKyAgICAgIGFyZ3MrKzsKKyAgICB9CisKKyAgbWlkID0gYXRvaShhcmdzKTsKKworICBpZiAobWlkID09IDApCisgICAgaWYgKCFpc19zbG90IHx8ICphcmdzICE9ICcwJykgLyogUnVkaW1lbnRhcnkgY2hlY2tzICovCisgICAgICBlcnJvciAoIllvdSBtdXN0IHNlbGVjdCB0aHJlYWRzIGJ5IE1JRCBvciBAU0xPVE5VTUJFUiIpOworCisgIGlmIChzZWxlY3RfdGhyZWFkIChpbmZlcmlvcl90YXNrLCBtaWQsIGlzX3Nsb3Q/MjoxKSAhPSBLRVJOX1NVQ0NFU1MpCisgICAgcmV0dXJuOworCisgIGlmIChmcm9tX3R0eSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJUaHJlYWQgJWQgc2VsZWN0ZWRcbiIsCisJCSAgICAgaXNfc2xvdCA/IG1hcF9wb3J0X25hbWVfdG9fbWlkIChjdXJyZW50X3RocmVhZCwKKwkJCQkJCSAgICAgTUFDSF9UWVBFX1RIUkVBRCkgOiBtaWQpOworfQorDAordGhyZWFkX3RyYWNlICh0aHJlYWQsIHNldCkKK21hY2hfcG9ydF90IHRocmVhZDsKK2Jvb2xlYW5fdCAgIHNldDsKK3sKKyAgaW50CQkJZmxhdm9yICAgPSBUUkFDRV9GTEFWT1I7CisgIHVuc2lnbmVkIGludAkJc3RhdGVDbnQgPSBUUkFDRV9GTEFWT1JfU0laRTsKKyAga2Vybl9yZXR1cm5fdAkJcmV0OworICB0aHJlYWRfc3RhdGVfZGF0YV90CXN0YXRlOworCisgIGlmICghIE1BQ0hfUE9SVF9WQUxJRCAodGhyZWFkKSkKKyAgICB7CisgICAgICB3YXJuaW5nICgidGhyZWFkX3RyYWNlOiBpbnZhbGlkIHRocmVhZCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAobXVzdF9zdXNwZW5kX3RocmVhZCkKKyAgICBzZXR1cF90aHJlYWQgKHRocmVhZCwgMSk7CisKKyAgcmV0ID0gdGhyZWFkX2dldF9zdGF0ZSh0aHJlYWQsIGZsYXZvciwgc3RhdGUsICZzdGF0ZUNudCk7CisgIENISyAoInRocmVhZF90cmFjZTogZXJyb3IgcmVhZGluZyB0aHJlYWQgc3RhdGUiLCByZXQpOworICAKKyAgaWYgKHNldCkKKyAgICB7CisgICAgICBUUkFDRV9TRVQgKHRocmVhZCwgc3RhdGUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICghIFRSQUNFX0NMRUFSICh0aHJlYWQsIHN0YXRlKSkKKwl7CisJICBpZiAobXVzdF9zdXNwZW5kX3RocmVhZCkKKwkgICAgc2V0dXBfdGhyZWFkICh0aHJlYWQsIDApOworCSAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgcmV0ID0gdGhyZWFkX3NldF9zdGF0ZSh0aHJlYWQsIGZsYXZvciwgc3RhdGUsIHN0YXRlQ250KTsKKyAgQ0hLICgidGhyZWFkX3RyYWNlOiBlcnJvciB3cml0aW5nIHRocmVhZCBzdGF0ZSIsIHJldCk7CisgIGlmIChtdXN0X3N1c3BlbmRfdGhyZWFkKQorICAgIHNldHVwX3RocmVhZCAodGhyZWFkLCAwKTsKK30gIAorCisjaWZkZWYJRkxVU0hfSU5GRVJJT1JfQ0FDSEUKKworLyogV2hlbiBvdmVyLXdyaXRpbmcgY29kZSBvbiBzb21lIG1hY2hpbmVzIHRoZSBJLUNhY2hlIG11c3QgYmUgZmx1c2hlZAorICAgZXhwbGljaXRseSwgYmVjYXVzZSBpdCBpcyBub3Qga2VwdCBjb2hlcmVudCBieSB0aGUgbGF6eSBoYXJkd2FyZS4KKyAgIFRoaXMgZGVmaW5pdGVseSBpbmNsdWRlcyBicmVha3BvaW50cywgZm9yIGluc3RhbmNlLCBvciBlbHNlIHdlCisgICBlbmQgdXAgbG9vcGluZyBpbiBteXN0ZXJpb3VzIEJwdCB0cmFwcyAqLworCitmbHVzaF9pbmZlcmlvcl9pY2FjaGUocGMsIGFtb3VudCkKKyAgICAgQ09SRV9BRERSIHBjOworeworICB2bV9tYWNoaW5lX2F0dHJpYnV0ZV92YWxfdCBmbHVzaCA9IE1BVFRSX1ZBTF9JQ0FDSEVfRkxVU0g7CisgIGtlcm5fcmV0dXJuX3QgICByZXQ7CisgIAorICByZXQgPSB2bV9tYWNoaW5lX2F0dHJpYnV0ZSAoaW5mZXJpb3JfdGFzaywKKwkJCSAgICAgIHBjLAorCQkJICAgICAgYW1vdW50LAorCQkJICAgICAgTUFUVFJfQ0FDSEUsCisJCQkgICAgICAmZmx1c2gpOworICBpZiAocmV0ICE9IEtFUk5fU1VDQ0VTUykKKyAgICB3YXJuaW5nICgiRXJyb3IgZmx1c2hpbmcgaW5mZXJpb3IncyBjYWNoZSA6ICVzIiwKKwkgICAgIG1hY2hfZXJyb3Jfc3RyaW5nIChyZXQpKTsKK30KKyNlbmRpZglGTFVTSF9JTkZFUklPUl9DQUNIRQorCisMCitzdGF0aWMKK3N1c3BlbmRfYWxsX3RocmVhZHMgKGZyb21fdHR5KQorICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGtlcm5fcmV0dXJuX3QJICAgcmV0OworICB0aHJlYWRfYXJyYXlfdCAgIHRocmVhZF9saXN0OworICBpbnQJCSAgIHRocmVhZF9jb3VudCwgaW5kZXg7CisgIGludAkJICAgaW5mb0NudDsKKyAgdGhyZWFkX2Jhc2ljX2luZm9fZGF0YV90IHRoX2luZm87CisKKyAgCisgIHJldCA9IHRhc2tfdGhyZWFkcyAoaW5mZXJpb3JfdGFzaywgJnRocmVhZF9saXN0LCAmdGhyZWFkX2NvdW50KTsKKyAgaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpCisgICAgeworICAgICAgd2FybmluZyAoIkNvdWxkIG5vdCBzdXNwZW5kIGluZmVyaW9yIHRocmVhZHMuIik7CisgICAgICBtM19raWxsX2luZmVyaW9yICgpOworICAgICAgcmV0dXJuX3RvX3RvcF9sZXZlbCAoUkVUVVJOX0VSUk9SKTsKKyAgICB9CisgIAorICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0aHJlYWRfY291bnQ7IGluZGV4KyspCisgICAgeworICAgICAgaW50IG1pZDsKKworICAgICAgbWlkID0gbWFwX3BvcnRfbmFtZV90b19taWQgKHRocmVhZF9saXN0WyBpbmRleCBdLAorCQkJCSAgTUFDSF9UWVBFX1RIUkVBRCk7CisJICAKKyAgICAgIHJldCA9IHRocmVhZF9zdXNwZW5kKHRocmVhZF9saXN0WyBpbmRleCBdKTsKKworICAgICAgaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpCisJd2FybmluZyAoIkVycm9yIHRyeWluZyB0byBzdXNwZW5kIHRocmVhZCAlZCA6ICVzIiwKKwkJIG1pZCwgbWFjaF9lcnJvcl9zdHJpbmcgKHJldCkpOworCisgICAgICBpZiAoZnJvbV90dHkpCisJeworCSAgaW5mb0NudCA9IFRIUkVBRF9CQVNJQ19JTkZPX0NPVU5UOworCSAgcmV0ID0gdGhyZWFkX2luZm8gKHRocmVhZF9saXN0WyBpbmRleCBdLAorCQkJICAgICBUSFJFQURfQkFTSUNfSU5GTywKKwkJCSAgICAgKHRocmVhZF9pbmZvX3QpICZ0aF9pbmZvLAorCQkJICAgICAmaW5mb0NudCk7CisJICBDSEsgKCJzdXNwZW5kIGNhbid0IGdldCB0aHJlYWQgaW5mbyIsIHJldCk7CisJICAKKwkgIHdhcm5pbmcgKCJUaHJlYWQgJWQgc3VzcGVuZCBjb3VudCBpcyAlZCIsCisJCSAgIG1pZCwgdGhfaW5mby5zdXNwZW5kX2NvdW50KTsKKwl9CisgICAgfQorCisgIGNvbnN1bWVfc2VuZF9yaWdodHMgKHRocmVhZF9saXN0LCB0aHJlYWRfY291bnQpOworICByZXQgPSB2bV9kZWFsbG9jYXRlKG1hY2hfdGFza19zZWxmKCksCisJCSAgICAgICh2bV9hZGRyZXNzX3QpdGhyZWFkX2xpc3QsIAorCQkgICAgICAodGhyZWFkX2NvdW50ICogc2l6ZW9mKGludCkpKTsKKyAgQ0hLICgiRXJyb3IgdHJ5aW5nIHRvIGRlYWxsb2NhdGUgdGhyZWFkIGxpc3QiLCByZXQpOworfQorCit2b2lkCit0aHJlYWRfc3VzcGVuZF9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBrZXJuX3JldHVybl90IHJldDsKKyAgaW50ICAgICAgICAgICBtaWQ7CisgIG1hY2hfcG9ydF90ICAgc2F2ZWRfdGhyZWFkOworICBpbnQgICAgICAgICAgIGluZm9DbnQ7CisgIHRocmVhZF9iYXNpY19pbmZvX2RhdGFfdCB0aF9pbmZvOworICAKKyAgTUFDSF9FUlJPUl9OT19JTkZFUklPUjsKKworICBpZiAoIXN0cmNhc2VjbXAgKGFyZ3MsICJhbGwiKSkgeworICAgIHN1c3BlbmRfYWxsX3RocmVhZHMgKGZyb21fdHR5KTsKKyAgICByZXR1cm47CisgIH0KKworICBzYXZlZF90aHJlYWQgPSBjdXJyZW50X3RocmVhZDsKKworICBtaWQgPSBwYXJzZV90aHJlYWRfaWQgKGFyZ3MsIDAsIDApOworCisgIGlmIChtaWQgPCAwKQorICAgIGVycm9yICgiWW91IGNhbiBzdXNwZW5kIG9ubHkgZXhpc3Rpbmcga2VybmVsIHRocmVhZHMgd2l0aCBNSUQgb3IgQFNMT1ROVU1CRVIiKTsKKworICBpZiAobWlkID09IDApCisgICAgbWlkID0gbWFwX3BvcnRfbmFtZV90b19taWQgKGN1cnJlbnRfdGhyZWFkLCBNQUNIX1RZUEVfVEhSRUFEKTsKKyAgZWxzZQorICAgIGlmIChzZWxlY3RfdGhyZWFkIChpbmZlcmlvcl90YXNrLCBtaWQsIDApICE9IEtFUk5fU1VDQ0VTUykKKyAgICAgIHsKKwlpZiAoY3VycmVudF90aHJlYWQpCisJICBjdXJyZW50X3RocmVhZCA9IHNhdmVkX3RocmVhZDsKKwllcnJvciAoIkNvdWxkIG5vdCBzZWxlY3QgdGhyZWFkICVkIiwgbWlkKTsKKyAgICAgIH0KKworICByZXQgPSB0aHJlYWRfc3VzcGVuZCAoY3VycmVudF90aHJlYWQpOworICBpZiAocmV0ICE9IEtFUk5fU1VDQ0VTUykKKyAgICB3YXJuaW5nICgidGhyZWFkX3N1c3BlbmQgZmFpbGVkIDogJXMiLAorCSAgICAgbWFjaF9lcnJvcl9zdHJpbmcgKHJldCkpOworCisgIGluZm9DbnQgPSBUSFJFQURfQkFTSUNfSU5GT19DT1VOVDsKKyAgcmV0ID0gdGhyZWFkX2luZm8gKGN1cnJlbnRfdGhyZWFkLAorCQkgICAgIFRIUkVBRF9CQVNJQ19JTkZPLAorCQkgICAgICh0aHJlYWRfaW5mb190KSAmdGhfaW5mbywKKwkJICAgICAmaW5mb0NudCk7CisgIENISyAoInN1c3BlbmQgY2FuJ3QgZ2V0IHRocmVhZCBpbmZvIiwgcmV0KTsKKyAgCisgIHdhcm5pbmcgKCJUaHJlYWQgJWQgc3VzcGVuZCBjb3VudCBpcyAlZCIsIG1pZCwgdGhfaW5mby5zdXNwZW5kX2NvdW50KTsKKyAgCisgIGN1cnJlbnRfdGhyZWFkID0gc2F2ZWRfdGhyZWFkOworfQorCityZXN1bWVfYWxsX3RocmVhZHMgKGZyb21fdHR5KQorICAgICBpbnQgZnJvbV90dHk7Cit7CisgICAga2Vybl9yZXR1cm5fdCAgcmV0OworICAgIHRocmVhZF9hcnJheV90IHRocmVhZF9saXN0OworICAgIGludAkJICAgdGhyZWFkX2NvdW50LCBpbmRleDsKKyAgICBpbnQgICAgICAgICAgICBtaWQ7CisgICAgaW50CQkgICBpbmZvQ250OworICAgIHRocmVhZF9iYXNpY19pbmZvX2RhdGFfdCB0aF9pbmZvOworCisgICAgcmV0ID0gdGFza190aHJlYWRzIChpbmZlcmlvcl90YXNrLCAmdGhyZWFkX2xpc3QsICZ0aHJlYWRfY291bnQpOworICAgIGlmIChyZXQgIT0gS0VSTl9TVUNDRVNTKQorICAgICAgeworCW0zX2tpbGxfaW5mZXJpb3IgKCk7CisJZXJyb3IoInRhc2tfdGhyZWFkcyIsIG1hY2hfZXJyb3Jfc3RyaW5nKCByZXQpKTsKKyAgICAgIH0KKworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHRocmVhZF9jb3VudDsgaW5kZXgrKykKKyAgICAgIHsKKwlpbmZvQ250ID0gVEhSRUFEX0JBU0lDX0lORk9fQ09VTlQ7CisJcmV0ID0gdGhyZWFkX2luZm8gKHRocmVhZF9saXN0IFsgaW5kZXggXSwKKwkJCSAgIFRIUkVBRF9CQVNJQ19JTkZPLAorCQkJICAgKHRocmVhZF9pbmZvX3QpICZ0aF9pbmZvLAorCQkJICAgJmluZm9DbnQpOworCUNISyAoInJlc3VtZV9hbGwgY2FuJ3QgZ2V0IHRocmVhZCBpbmZvIiwgcmV0KTsKKwkKKwltaWQgPSBtYXBfcG9ydF9uYW1lX3RvX21pZCAodGhyZWFkX2xpc3RbIGluZGV4IF0sCisJCQkJICAgIE1BQ0hfVFlQRV9USFJFQUQpOworCQorCWlmICghIHRoX2luZm8uc3VzcGVuZF9jb3VudCkKKwkgIHsKKwkgICAgaWYgKG1pZCAhPSAtMSAmJiBmcm9tX3R0eSkKKwkgICAgICB3YXJuaW5nICgiVGhyZWFkICVkIGlzIG5vdCBzdXNwZW5kZWQiLCBtaWQpOworCSAgICBjb250aW51ZTsKKwkgIH0KKworCXJldCA9IHRocmVhZF9yZXN1bWUgKHRocmVhZF9saXN0WyBpbmRleCBdKTsKKworCWlmIChyZXQgIT0gS0VSTl9TVUNDRVNTKQorCSAgd2FybmluZyAoIkVycm9yIHRyeWluZyB0byByZXN1bWUgdGhyZWFkICVkIDogJXMiLAorCQkgICBtaWQsIG1hY2hfZXJyb3Jfc3RyaW5nIChyZXQpKTsKKwllbHNlIGlmIChtaWQgIT0gLTEgJiYgZnJvbV90dHkpCisJICB3YXJuaW5nICgiVGhyZWFkICVkIHN1c3BlbmQgY291bnQgaXMgJWQiLAorCQkgICBtaWQsIC0tdGhfaW5mby5zdXNwZW5kX2NvdW50KTsKKyAgICAgIH0KKworICAgIGNvbnN1bWVfc2VuZF9yaWdodHMgKHRocmVhZF9saXN0LCB0aHJlYWRfY291bnQpOworICAgIHJldCA9IHZtX2RlYWxsb2NhdGUobWFjaF90YXNrX3NlbGYoKSwKKwkJCSh2bV9hZGRyZXNzX3QpdGhyZWFkX2xpc3QsIAorCQkJKHRocmVhZF9jb3VudCAqIHNpemVvZihpbnQpKSk7CisgICAgQ0hLKCJFcnJvciB0cnlpbmcgdG8gZGVhbGxvY2F0ZSB0aHJlYWQgbGlzdCIsIHJldCk7Cit9CisKK3ZvaWQKK3RocmVhZF9yZXN1bWVfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IG1pZDsKKyAgbWFjaF9wb3J0X3Qgc2F2ZWRfdGhyZWFkOworICBrZXJuX3JldHVybl90IHJldDsKKyAgdGhyZWFkX2Jhc2ljX2luZm9fZGF0YV90IHRoX2luZm87CisgIGludCBpbmZvQ250ID0gVEhSRUFEX0JBU0lDX0lORk9fQ09VTlQ7CisgIAorICBNQUNIX0VSUk9SX05PX0lORkVSSU9SOworCisgIGlmICghc3RyY2FzZWNtcCAoYXJncywgImFsbCIpKSB7CisgICAgcmVzdW1lX2FsbF90aHJlYWRzIChmcm9tX3R0eSk7CisgICAgcmV0dXJuOworICB9CisKKyAgc2F2ZWRfdGhyZWFkID0gY3VycmVudF90aHJlYWQ7CisKKyAgbWlkID0gcGFyc2VfdGhyZWFkX2lkIChhcmdzLCAwLCAwKTsKKworICBpZiAobWlkIDwgMCkKKyAgICBlcnJvciAoIllvdSBjYW4gcmVzdW1lIG9ubHkgZXhpc3Rpbmcga2VybmVsIHRocmVhZHMgd2l0aCBNSUQgb3IgQFNMT1ROVU1CRVIiKTsKKworICBpZiAobWlkID09IDApCisgICAgbWlkID0gbWFwX3BvcnRfbmFtZV90b19taWQgKGN1cnJlbnRfdGhyZWFkLCBNQUNIX1RZUEVfVEhSRUFEKTsKKyAgZWxzZQorICAgIGlmIChzZWxlY3RfdGhyZWFkIChpbmZlcmlvcl90YXNrLCBtaWQsIDApICE9IEtFUk5fU1VDQ0VTUykKKyAgICAgIHsKKwlpZiAoY3VycmVudF90aHJlYWQpCisJICBjdXJyZW50X3RocmVhZCA9IHNhdmVkX3RocmVhZDsKKwlyZXR1cm5fdG9fdG9wX2xldmVsIChSRVRVUk5fRVJST1IpOworICAgICAgfQorCisgIHJldCA9IHRocmVhZF9pbmZvIChjdXJyZW50X3RocmVhZCwKKwkJICAgICBUSFJFQURfQkFTSUNfSU5GTywKKwkJICAgICAodGhyZWFkX2luZm9fdCkgJnRoX2luZm8sCisJCSAgICAgJmluZm9DbnQpOworICBDSEsgKCJyZXN1bWUgY2FuJ3QgZ2V0IHRocmVhZCBpbmZvIiwgcmV0KTsKKyAgCisgIGlmICghIHRoX2luZm8uc3VzcGVuZF9jb3VudCkKKyAgICB7CisgICAgICB3YXJuaW5nICgiVGhyZWFkICVkIGlzIG5vdCBzdXNwZW5kZWQiLCBtaWQpOworICAgICAgZ290byBvdXQ7CisgICAgfQorCisgIHJldCA9IHRocmVhZF9yZXN1bWUgKGN1cnJlbnRfdGhyZWFkKTsKKyAgaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpCisgICAgd2FybmluZyAoInRocmVhZF9yZXN1bWUgZmFpbGVkIDogJXMiLAorCSAgICAgbWFjaF9lcnJvcl9zdHJpbmcgKHJldCkpOworICBlbHNlCisgICAgeworICAgICAgdGhfaW5mby5zdXNwZW5kX2NvdW50LS07CisgICAgICB3YXJuaW5nICgiVGhyZWFkICVkIHN1c3BlbmQgY291bnQgaXMgJWQiLCBtaWQsIHRoX2luZm8uc3VzcGVuZF9jb3VudCk7CisgICAgfQorICAgICAgCisgb3V0OgorICBjdXJyZW50X3RocmVhZCA9IHNhdmVkX3RocmVhZDsKK30KKwordm9pZAordGhyZWFkX2tpbGxfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IG1pZDsKKyAga2Vybl9yZXR1cm5fdCByZXQ7CisgIGludCB0aHJlYWRfY291bnQ7CisgIHRocmVhZF9hcnJheV90IHRocmVhZF90YWJsZTsKKyAgaW50ICAgaW5kZXg7CisgIG1hY2hfcG9ydF90IHRocmVhZF90b19raWxsID0gTUFDSF9QT1JUX05VTEw7CisgIAorICAKKyAgTUFDSF9FUlJPUl9OT19JTkZFUklPUjsKKworICBpZiAoIWFyZ3MpCisgICAgZXJyb3Jfbm9fYXJnICgidGhyZWFkIG1pZCB0byBraWxsIGZyb20gdGhlIGluZmVyaW9yIHRhc2siKTsKKworICBtaWQgPSBwYXJzZV90aHJlYWRfaWQgKGFyZ3MsIDAsIDApOworCisgIGlmIChtaWQgPCAwKQorICAgIGVycm9yICgiWW91IGNhbiBraWxsIG9ubHkgZXhpc3Rpbmcga2VybmVsIHRocmVhZHMgd2l0aCBNSUQgb3IgQFNMT1ROVU1CRVIiKTsKKworICBpZiAobWlkKQorICAgIHsKKyAgICAgIHJldCA9IG1hY2hpZF9tYWNoX3BvcnQgKG1pZF9zZXJ2ZXIsIG1pZF9hdXRoLCBtaWQsICZ0aHJlYWRfdG9fa2lsbCk7CisgICAgICBDSEsgKCJ0aHJlYWRfa2lsbF9jb21tYW5kOiBtYWNoaWRfbWFjaF9wb3J0IG1hcCBmYWlsZWQiLCByZXQpOworICAgIH0KKyAgZWxzZQorICAgIG1pZCA9IG1hcF9wb3J0X25hbWVfdG9fbWlkIChjdXJyZW50X3RocmVhZCwgTUFDSF9UWVBFX1RIUkVBRCk7CisgICAgICAKKyAgLyogRG9uJ3QgYWxsb3cgZ2RiIHRvIGtpbGwgKmFueSogdGhyZWFkIGluIHRoZSBzeXN0ZW0uIFVzZSBta2lsbCBwcm9ncmFtIGZvciB0aGF0ICovCisgIHJldCA9IHRhc2tfdGhyZWFkcyAoaW5mZXJpb3JfdGFzaywgJnRocmVhZF90YWJsZSwgJnRocmVhZF9jb3VudCk7CisgIENISyAoIkVycm9yIGdldHRpbmcgaW5mZXJpb3IncyB0aHJlYWQgbGlzdCIsIHJldCk7CisgIAorICBpZiAodGhyZWFkX3RvX2tpbGwgPT0gY3VycmVudF90aHJlYWQpCisgICAgeworICAgICAgcmV0ID0gdGhyZWFkX3Rlcm1pbmF0ZSAodGhyZWFkX3RvX2tpbGwpOworICAgICAgQ0hLICgiVGhyZWFkIGNvdWxkIG5vdCBiZSB0ZXJtaW5hdGVkIiwgcmV0KTsKKworICAgICAgaWYgKHNlbGVjdF90aHJlYWQgKGluZmVyaW9yX3Rhc2ssIDAsIDEpICE9IEtFUk5fU1VDQ0VTUykKKwl3YXJuaW5nICgiTGFzdCB0aHJlYWQgd2FzIGtpbGxlZCwgdXNlIFwia2lsbFwiIGNvbW1hbmQgdG8ga2lsbCB0YXNrIik7CisgICAgfQorICBlbHNlCisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdGhyZWFkX2NvdW50OyBpbmRleCsrKQorICAgICAgaWYgKHRocmVhZF90YWJsZSBbIGluZGV4IF0gPT0gdGhyZWFkX3RvX2tpbGwpCisJeworCSAgcmV0ID0gdGhyZWFkX3Rlcm1pbmF0ZSAodGhyZWFkX3RvX2tpbGwpOworCSAgQ0hLICgiVGhyZWFkIGNvdWxkIG5vdCBiZSB0ZXJtaW5hdGVkIiwgcmV0KTsKKwl9CisKKyAgaWYgKHRocmVhZF9jb3VudCA+IDEpCisgICAgY29uc3VtZV9zZW5kX3JpZ2h0cyAodGhyZWFkX3RhYmxlLCB0aHJlYWRfY291bnQpOworICAKKyAgcmV0ID0gdm1fZGVhbGxvY2F0ZSAobWFjaF90YXNrX3NlbGYoKSwgKHZtX2FkZHJlc3NfdCl0aHJlYWRfdGFibGUsIAorCQkgICAgICAgKHRocmVhZF9jb3VudCAqIHNpemVvZihtYWNoX3BvcnRfdCkpKTsKKyAgQ0hLICgiRXJyb3IgdHJ5aW5nIHRvIGRlYWxsb2NhdGUgdGhyZWFkIGxpc3QiLCByZXQpOworICAKKyAgd2FybmluZyAoIlRocmVhZCAlZCBraWxsZWQiLCBtaWQpOworfQorCisMCisvKiBUYXNrIHNwZWNpZmljIGNvbW1hbmRzOyBhZGQgbW9yZSBpZiB5b3UgbGlrZSAqLworCit2b2lkCit0YXNrX3Jlc3VtZV9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBrZXJuX3JldHVybl90IHJldDsKKyAgdGFza19iYXNpY19pbmZvX2RhdGFfdCB0YV9pbmZvOworICBpbnQgaW5mb0NudCA9IFRBU0tfQkFTSUNfSU5GT19DT1VOVDsKKyAgaW50IG1pZCA9IG1hcF9wb3J0X25hbWVfdG9fbWlkIChpbmZlcmlvcl90YXNrLCBNQUNIX1RZUEVfVEFTSyk7CisgIAorICBNQUNIX0VSUk9SX05PX0lORkVSSU9SOworCisgIC8qIFdvdWxkIGJlIHRyaXZpYWwgdG8gY2hhbmdlLCBidXQgaXMgaXQgZGVzaXJhYmxlPyAqLworICBpZiAoYXJncykKKyAgICBlcnJvciAoIkN1cnJlbnRseSBnZGIgY2FuIHJlc3VtZSBvbmx5IGl0J3MgaW5mZXJpb3IgdGFzayIpOworCisgIHJldCA9IHRhc2tfaW5mbyAoaW5mZXJpb3JfdGFzaywKKwkJICAgVEFTS19CQVNJQ19JTkZPLAorCQkgICAodGFza19pbmZvX3QpICZ0YV9pbmZvLAorCQkgICAmaW5mb0NudCk7CisgIENISyAoInRhc2tfcmVzdW1lX2NvbW1hbmQ6IHRhc2tfaW5mbyBmYWlsZWQiLCByZXQpOworICAKKyAgaWYgKHRhX2luZm8uc3VzcGVuZF9jb3VudCA9PSAwKQorICAgIGVycm9yICgiSW5mZXJpb3IgdGFzayAlZCBpcyBub3Qgc3VzcGVuZGVkIiwgbWlkKTsKKyAgZWxzZSBpZiAodGFfaW5mby5zdXNwZW5kX2NvdW50ID09IDEgJiYKKwkgICBmcm9tX3R0eSAmJgorCSAgICFxdWVyeSAoIlN1c3BlbmQgY291bnQgaXMgbm93IDEuIERvIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZz8gIikpCisgICAgZXJyb3IgKCJUYXNrIG5vdCByZXN1bWVkIik7CisKKyAgcmV0ID0gdGFza19yZXN1bWUgKGluZmVyaW9yX3Rhc2spOworICBDSEsgKCJ0YXNrX3Jlc3VtZV9jb21tYW5kOiB0YXNrX3Jlc3VtZSIsIHJldCk7CisKKyAgaWYgKHRhX2luZm8uc3VzcGVuZF9jb3VudCA9PSAxKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJJbmZlcmlvciB0YXNrICVkIGlzIG5vIGxvbmdlciBzdXNwZW5kZWQiLCBtaWQpOworICAgICAgbXVzdF9zdXNwZW5kX3RocmVhZCA9IDE7CisgICAgICAvKiBAQCBUaGlzIGlzIG5vdCBjb21wbGV0ZTogUmVnaXN0ZXJzIGNoYW5nZSBhbGwgdGhlIHRpbWUgd2hlbiBub3QKKwkgc3VzcGVuZGVkISAqLworICAgICAgcmVnaXN0ZXJzX2NoYW5nZWQgKCk7CisgICAgfQorICBlbHNlCisgICAgd2FybmluZyAoIkluZmVyaW9yIHRhc2sgJWQgc3VzcGVuZCBjb3VudCBpcyBub3cgJWQiLAorCSAgICAgbWlkLCB0YV9pbmZvLnN1c3BlbmRfY291bnQtMSk7Cit9CisKKwordm9pZAordGFza19zdXNwZW5kX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGtlcm5fcmV0dXJuX3QgcmV0OworICB0YXNrX2Jhc2ljX2luZm9fZGF0YV90IHRhX2luZm87CisgIGludCBpbmZvQ250ID0gVEFTS19CQVNJQ19JTkZPX0NPVU5UOworICBpbnQgbWlkID0gbWFwX3BvcnRfbmFtZV90b19taWQgKGluZmVyaW9yX3Rhc2ssIE1BQ0hfVFlQRV9UQVNLKTsKKyAgCisgIE1BQ0hfRVJST1JfTk9fSU5GRVJJT1I7CisKKyAgLyogV291bGQgYmUgdHJpdmlhbCB0byBjaGFuZ2UsIGJ1dCBpcyBpdCBkZXNpcmFibGU/ICovCisgIGlmIChhcmdzKQorICAgIGVycm9yICgiQ3VycmVudGx5IGdkYiBjYW4gc3VzcGVuZCBvbmx5IGl0J3MgaW5mZXJpb3IgdGFzayIpOworCisgIHJldCA9IHRhc2tfc3VzcGVuZCAoaW5mZXJpb3JfdGFzayk7CisgIENISyAoInRhc2tfc3VzcGVuZF9jb21tYW5kOiB0YXNrX3N1c3BlbmQiLCByZXQpOworCisgIG11c3Rfc3VzcGVuZF90aHJlYWQgPSAwOworCisgIHJldCA9IHRhc2tfaW5mbyAoaW5mZXJpb3JfdGFzaywKKwkJICAgVEFTS19CQVNJQ19JTkZPLAorCQkgICAodGFza19pbmZvX3QpICZ0YV9pbmZvLAorCQkgICAmaW5mb0NudCk7CisgIENISyAoInRhc2tfc3VzcGVuZF9jb21tYW5kOiB0YXNrX2luZm8gZmFpbGVkIiwgcmV0KTsKKyAgCisgIHdhcm5pbmcgKCJJbmZlcmlvciB0YXNrICVkIHN1c3BlbmQgY291bnQgaXMgbm93ICVkIiwKKwkgICBtaWQsIHRhX2luZm8uc3VzcGVuZF9jb3VudCk7Cit9CisKK3N0YXRpYyBjaGFyICoKK2dldF9zaXplIChieXRlcykKKyAgICAgaW50IGJ5dGVzOworeworICBzdGF0aWMgY2hhciBzaXplIFsgMzAgXTsKKyAgaW50IHp6ID0gYnl0ZXMvMTAyNDsKKworICBpZiAoenogLyAxMDI0KQorICAgIHNwcmludGYgKHNpemUsICIlLTIuMWYgTSIsICgoZmxvYXQpYnl0ZXMpLygxMDI0LjAqMTAyNC4wKSk7CisgIGVsc2UKKyAgICBzcHJpbnRmIChzaXplLCAiJWQgSyIsIHp6KTsKKworICByZXR1cm4gc2l6ZTsKK30KKworLyogRG9lcyB0aGlzIHJlcXVpcmUgdGhlIHRhcmdldCB0YXNrIHRvIGJlIHN1c3BlbmRlZD8/IEkgZG9uJ3QgdGhpbmsgc28uICovCit2b2lkCit0YXNrX2luZm9fY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IG1pZCA9IC01OworICBtYWNoX3BvcnRfdCB0YXNrOworICBrZXJuX3JldHVybl90IHJldDsKKyAgdGFza19iYXNpY19pbmZvX2RhdGFfdCB0YV9pbmZvOworICBpbnQgaW5mb0NudCA9IFRBU0tfQkFTSUNfSU5GT19DT1VOVDsKKyAgaW50IHBhZ2Vfc2l6ZSA9IHJvdW5kX3BhZ2UoMSk7CisgIGludCB0aHJlYWRfY291bnQgPSAwOworICAKKyAgaWYgKE1BQ0hfUE9SVF9WQUxJRCAoaW5mZXJpb3JfdGFzaykpCisgICAgbWlkID0gbWFwX3BvcnRfbmFtZV90b19taWQgKGluZmVyaW9yX3Rhc2ssCisJCQkJTUFDSF9UWVBFX1RBU0spOworCisgIHRhc2sgPSBpbmZlcmlvcl90YXNrOworCisgIGlmIChhcmdzKQorICAgIHsKKyAgICAgIGludCB0bWlkID0gYXRvaSAoYXJncyk7CisKKyAgICAgIGlmICh0bWlkIDw9IDApCisJZXJyb3IgKCJJbnZhbGlkIG1pZCAlZCBmb3IgdGFzayBpbmZvIiwgdG1pZCk7CisKKyAgICAgIGlmICh0bWlkICE9IG1pZCkKKwl7CisJICBtaWQgPSB0bWlkOworCSAgcmV0ID0gbWFjaGlkX21hY2hfcG9ydCAobWlkX3NlcnZlciwgbWlkX2F1dGgsIHRtaWQsICZ0YXNrKTsKKwkgIENISyAoInRhc2tfaW5mb19jb21tYW5kOiBtYWNoaWRfbWFjaF9wb3J0IG1hcCBmYWlsZWQiLCByZXQpOworCX0KKyAgICB9CisKKyAgaWYgKG1pZCA8IDApCisgICAgZXJyb3IgKCJZb3UgaGF2ZSB0byBnaXZlIHRoZSB0YXNrIE1JRCBhcyBhbiBhcmd1bWVudCIpOworCisgIHJldCA9IHRhc2tfaW5mbyAodGFzaywKKwkJICAgVEFTS19CQVNJQ19JTkZPLAorCQkgICAodGFza19pbmZvX3QpICZ0YV9pbmZvLAorCQkgICAmaW5mb0NudCk7CisgIENISyAoInRhc2tfaW5mb19jb21tYW5kOiB0YXNrX2luZm8gZmFpbGVkIiwgcmV0KTsKKworICBwcmludGZfZmlsdGVyZWQgKCJcblRhc2sgaW5mbyBmb3IgdGFzayAlZDpcblxuIiwgbWlkKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiIFN1c3BlbmQgY291bnQgOiAlZFxuIiwgdGFfaW5mby5zdXNwZW5kX2NvdW50KTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiIEJhc2UgcHJpb3JpdHkgOiAlZFxuIiwgdGFfaW5mby5iYXNlX3ByaW9yaXR5KTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiIFZpcnR1YWwgc2l6ZSAgOiAlc1xuIiwgZ2V0X3NpemUgKHRhX2luZm8udmlydHVhbF9zaXplKSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIiBSZXNpZGVudCBzaXplIDogJXNcbiIsIGdldF9zaXplICh0YV9pbmZvLnJlc2lkZW50X3NpemUpKTsKKworICB7CisgICAgdGhyZWFkX2FycmF5X3QgdGhyZWFkX2xpc3Q7CisgICAgCisgICAgcmV0ID0gdGFza190aHJlYWRzICh0YXNrLCAmdGhyZWFkX2xpc3QsICZ0aHJlYWRfY291bnQpOworICAgIENISyAoInRhc2tfaW5mb19jb21tYW5kOiB0YXNrX3RocmVhZHMiLCByZXQpOworICAgIAorICAgIHByaW50Zl9maWx0ZXJlZCAoIiBUaHJlYWQgY291bnQgIDogJWRcbiIsIHRocmVhZF9jb3VudCk7CisKKyAgICBjb25zdW1lX3NlbmRfcmlnaHRzICh0aHJlYWRfbGlzdCwgdGhyZWFkX2NvdW50KTsKKyAgICByZXQgPSB2bV9kZWFsbG9jYXRlKG1hY2hfdGFza19zZWxmKCksCisJCQkodm1fYWRkcmVzc190KXRocmVhZF9saXN0LCAKKwkJCSh0aHJlYWRfY291bnQgKiBzaXplb2YoaW50KSkpOworICAgIENISygiRXJyb3IgdHJ5aW5nIHRvIGRlYWxsb2NhdGUgdGhyZWFkIGxpc3QiLCByZXQpOworICB9CisgIGlmIChoYXZlX2VtdWxhdG9yX3AgKHRhc2spKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIiBFbXVsYXRvciBhdCAgIDogMHgleC4uMHgleFxuIiwKKwkJICAgICBFTVVMQVRPUl9CQVNFLCBFTVVMQVRPUl9FTkQpOworICBlbHNlCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiIE5vIGVtdWxhdG9yLlxuIik7CisKKyAgaWYgKHRocmVhZF9jb3VudCAmJiB0YXNrID09IGluZmVyaW9yX3Rhc2spCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5Vc2UgdGhlIFwidGhyZWFkIGxpc3RcIiBjb21tYW5kIHRvIHNlZSB0aGUgdGhyZWFkc1xuIik7Cit9CisMCisvKiBZb3UgbWF5IGVpdGhlciBGT1JXQVJEIHRoZSBleGNlcHRpb24gdG8gdGhlIGluZmVyaW9yLCBvciBLRUVQCisgKiBpdCBhbmQgcmV0dXJuIHRvIEdEQiBjb21tYW5kIGxldmVsLgorICoKKyAqIGV4Y2VwdGlvbiBtaWQgWyBmb3J3YXJkIHwga2VlcCBdCisgKi8KKworc3RhdGljIHZvaWQKK2V4Y2VwdGlvbl9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjaGFyICpzY2FuID0gYXJnczsKKyAgaW50IGV4Y2VwdGlvbjsKKyAgaW50IGxlbjsKKworICBpZiAoIWFyZ3MpCisgICAgZXJyb3Jfbm9fYXJnICgiZXhjZXB0aW9uIG51bWJlciBhY3Rpb24iKTsKKworICB3aGlsZSAoKnNjYW4gPT0gJyAnIHx8ICpzY2FuID09ICdcdCcpIHNjYW4rKzsKKyAgCisgIGlmICgnMCcgPD0gKnNjYW4gJiYgKnNjYW4gPD0gJzknKQorICAgIHdoaWxlICgnMCcgPD0gKnNjYW4gJiYgKnNjYW4gPD0gJzknKQorICAgICAgc2NhbisrOworICBlbHNlCisgICAgZXJyb3IgKCJleGNlcHRpb24gbnVtYmVyIGFjdGlvbiIpOworCisgIGV4Y2VwdGlvbiA9IGF0b2kgKGFyZ3MpOworICBpZiAoZXhjZXB0aW9uIDw9IDAgfHwgZXhjZXB0aW9uID4gTUFYX0VYQ0VQVElPTikKKyAgICBlcnJvciAoIkFsbG93ZWQgZXhjZXB0aW9uIG51bWJlcnMgYXJlIGluIHJhbmdlIDEuLiVkIiwKKwkgICBNQVhfRVhDRVBUSU9OKTsKKworICBpZiAoKnNjYW4gIT0gJyAnICYmICpzY2FuICE9ICdcdCcpCisgICAgZXJyb3IgKCJleGNlcHRpb24gbnVtYmVyIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBzcGFjZSIpOworICBlbHNlCisgICAgd2hpbGUgKCpzY2FuID09ICcgJyB8fCAqc2NhbiA9PSAnXHQnKSBzY2FuKys7CisKKyAgYXJncyA9IHNjYW47CisgIGxlbiA9IDA7CisgIHdoaWxlICgqc2NhbikKKyAgICB7CisgICAgICBsZW4rKzsKKyAgICAgIHNjYW4rKzsKKyAgICB9CisKKyAgaWYgKCFsZW4pCisgICAgZXJyb3IoImV4Y2VwdGlvbiBudW1iZXIgYWN0aW9uIik7CisKKyAgaWYgKCFzdHJuY2FzZWNtcCAoYXJncywgImZvcndhcmQiLCBsZW4pKQorICAgIGV4Y2VwdGlvbl9tYXBbIGV4Y2VwdGlvbiBdLmZvcndhcmQgPSBUUlVFOworICBlbHNlIGlmICghc3RybmNhc2VjbXAgKGFyZ3MsICJrZWVwIiwgbGVuKSkKKyAgICBleGNlcHRpb25fbWFwWyBleGNlcHRpb24gXS5mb3J3YXJkID0gRkFMU0U7CisgIGVsc2UKKyAgICBlcnJvciAoImV4Y2VwdGlvbiBhY3Rpb24gaXMgZWl0aGVyIFwia2VlcFwiIG9yIFwiZm9yd2FyZFwiIik7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9leGNlcHRpb25faW5mbyAoZXhjZXB0aW9uKQorICAgICBpbnQgZXhjZXB0aW9uOworeworICBib29sZWFuX3QgZm9yd2FyZCA9IGV4Y2VwdGlvbl9tYXBbIGV4Y2VwdGlvbiBdLmZvcndhcmQ7CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiJXNcdCglZCk6ICIsIGV4Y2VwdGlvbl9tYXBbIGV4Y2VwdGlvbiBdLm5hbWUsCisJCSAgIGV4Y2VwdGlvbik7CisgIGlmICghZm9yd2FyZCkKKyAgICBpZiAoZXhjZXB0aW9uX21hcFsgZXhjZXB0aW9uIF0uc2lnbWFwICE9IFNJR19VTktOT1dOKQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgia2VlcCBhbmQgaGFuZGxlIGFzIHNpZ25hbCAlZFxuIiwKKwkJICAgICAgIGV4Y2VwdGlvbl9tYXBbIGV4Y2VwdGlvbiBdLnNpZ21hcCk7CisgICAgZWxzZQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgia2VlcCBhbmQgaGFuZGxlIGFzIHVua25vd24gc2lnbmFsICVkXG4iLAorCQkgICAgICAgZXhjZXB0aW9uX21hcFsgZXhjZXB0aW9uIF0uc2lnbWFwKTsKKyAgZWxzZQorICAgIHByaW50Zl9maWx0ZXJlZCAoImZvcndhcmQgZXhjZXB0aW9uIHRvIGluZmVyaW9yXG4iKTsKK30KKwordm9pZAorZXhjZXB0aW9uX2luZm8gKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGludCBleGNlcHRpb247CisKKyAgaWYgKCFhcmdzKQorICAgIGZvciAoZXhjZXB0aW9uID0gMTsgZXhjZXB0aW9uIDw9IE1BWF9FWENFUFRJT047IGV4Y2VwdGlvbisrKQorICAgICAgcHJpbnRfZXhjZXB0aW9uX2luZm8gKGV4Y2VwdGlvbik7CisgIGVsc2UKKyAgICB7CisgICAgICBleGNlcHRpb24gPSBhdG9pIChhcmdzKTsKKworICAgICAgaWYgKGV4Y2VwdGlvbiA8PSAwIHx8IGV4Y2VwdGlvbiA+IE1BWF9FWENFUFRJT04pCisJZXJyb3IgKCJJbnZhbGlkIGV4Y2VwdGlvbiBudW1iZXIsIHZhbHVlcyBmcm9tIDEgdG8gJWQgYWxsb3dlZCIsCisJICAgICAgIE1BWF9FWENFUFRJT04pOworICAgICAgcHJpbnRfZXhjZXB0aW9uX2luZm8gKGV4Y2VwdGlvbik7CisgICAgfQorfQorDAorLyogQ2hlY2sgZm9yIGFjdGlvbnMgZm9yIG1hY2ggZXhjZXB0aW9ucy4KKyAqLworbWFjaDNfZXhjZXB0aW9uX2FjdGlvbnMgKHcsIGZvcmNlX3ByaW50X29ubHksIHdobykKKyAgICAgV0FJVFRZUEUgKnc7CisgICAgIGJvb2xlYW5fdCBmb3JjZV9wcmludF9vbmx5OworICAgICBjaGFyICp3aG87Cit7CisgIGJvb2xlYW5fdCBmb3JjZV9wcmludCA9IEZBTFNFOworCisgIAorICBpZiAoZm9yY2VfcHJpbnRfb25seSB8fAorICAgICAgZXhjZXB0aW9uX21hcFtzdG9wX2V4Y2VwdGlvbl0uc2lnbWFwID09IFNJR19VTktOT1dOKQorICAgIGZvcmNlX3ByaW50ID0gVFJVRTsKKyAgZWxzZQorICAgIFdTRVRTVE9QICgqdywgZXhjZXB0aW9uX21hcFtzdG9wX2V4Y2VwdGlvbl0uc2lnbWFwKTsKKworICBpZiAoZXhjZXB0aW9uX21hcFtzdG9wX2V4Y2VwdGlvbl0ucHJpbnQgfHwgZm9yY2VfcHJpbnQpCisgICAgeworICAgICAgdGFyZ2V0X3Rlcm1pbmFsX291cnMgKCk7CisgICAgICAKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuJXMgcmVjZWl2ZWQgJXMgZXhjZXB0aW9uIDogIiwKKwkJICAgICAgIHdobywKKwkJICAgICAgIGV4Y2VwdGlvbl9tYXBbc3RvcF9leGNlcHRpb25dLm5hbWUpOworICAgICAgCisgICAgICB3cmFwX2hlcmUgKCIgICAiKTsKKworICAgICAgc3dpdGNoKHN0b3BfZXhjZXB0aW9uKSB7CisgICAgICBjYXNlIEVYQ19CQURfQUNDRVNTOgorCXByaW50Zl9maWx0ZXJlZCAoInJlZmVyZW5jaW5nIGFkZHJlc3MgMHgleCA6ICVzXG4iLAorCQkJIHN0b3Bfc3ViY29kZSwKKwkJCSBtYWNoX2Vycm9yX3N0cmluZyAoc3RvcF9jb2RlKSk7CisJYnJlYWs7CisgICAgICBjYXNlIEVYQ19CQURfSU5TVFJVQ1RJT046CisJcHJpbnRmX2ZpbHRlcmVkCisJICAoImlsbGVnYWwgb3IgdW5kZWZpbmVkIGluc3RydWN0aW9uLiBjb2RlICVkIHN1YmNvZGUgJWRcbiIsCisJICAgc3RvcF9jb2RlLCBzdG9wX3N1YmNvZGUpOworCWJyZWFrOworICAgICAgY2FzZSBFWENfQVJJVEhNRVRJQzoKKwlwcmludGZfZmlsdGVyZWQgKCJjb2RlICVkXG4iLCBzdG9wX2NvZGUpOworCWJyZWFrOworICAgICAgY2FzZSBFWENfRU1VTEFUSU9OOgorCXByaW50Zl9maWx0ZXJlZCAoImNvZGUgJWQgc3ViY29kZSAlZFxuIiwgc3RvcF9jb2RlLCBzdG9wX3N1YmNvZGUpOworCWJyZWFrOworICAgICAgY2FzZSBFWENfU09GVFdBUkU6CisJcHJpbnRmX2ZpbHRlcmVkICgiJXMgc3BlY2lmaWMsIGNvZGUgMHgleFxuIiwKKwkJCSBzdG9wX2NvZGUgPCAweGZmZmYgPyAiaGFyZHdhcmUiIDogIm9zIGVtdWxhdGlvbiIsCisJCQkgc3RvcF9jb2RlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgRVhDX0JSRUFLUE9JTlQ6CisJcHJpbnRmX2ZpbHRlcmVkICgidHlwZSAlZCAobWFjaGluZSBkZXBlbmRlbnQpXG4iLAorCQkJIHN0b3BfY29kZSk7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCWZhdGFsICgiVW5rbm93biBleGNlcHRpb24iKTsKKyAgICAgIH0KKyAgICB9Cit9CisMCitzZXR1cF9ub3RpZnlfcG9ydCAoY3JlYXRlX25ldykKKyAgICAgaW50IGNyZWF0ZV9uZXc7Cit7CisgIGtlcm5fcmV0dXJuX3QgcmV0OworCisgIGlmIChNQUNIX1BPUlRfVkFMSUQgKG91cl9ub3RpZnlfcG9ydCkpCisgICAgeworICAgICAgcmV0ID0gbWFjaF9wb3J0X2Rlc3Ryb3kgKG1hY2hfdGFza19zZWxmICgpLCBvdXJfbm90aWZ5X3BvcnQpOworICAgICAgQ0hLICgiQ291bGQgbm90IGRlc3Ryb3kgb3VyX25vdGlmeV9wb3J0IiwgcmV0KTsKKyAgICB9CisKKyAgb3VyX25vdGlmeV9wb3J0ID0gTUFDSF9QT1JUX05VTEw7CisgIG5vdGlmeV9jaGFpbiAgICA9IChwb3J0X2NoYWluX3QpIE5VTEw7CisgIHBvcnRfY2hhaW5fZGVzdHJveSAocG9ydF9jaGFpbl9vYnN0YWNrKTsKKworICBpZiAoY3JlYXRlX25ldykKKyAgICB7CisgICAgICByZXQgPSBtYWNoX3BvcnRfYWxsb2NhdGUgKG1hY2hfdGFza19zZWxmKCksCisJCQkJTUFDSF9QT1JUX1JJR0hUX1JFQ0VJVkUsCisJCQkJJm91cl9ub3RpZnlfcG9ydCk7CisgICAgICBpZiAocmV0ICE9IEtFUk5fU1VDQ0VTUykKKwlmYXRhbCgiQ3JlYXRpbmcgbm90aWZ5IHBvcnQgJXMiLCBtYWNoX2Vycm9yX3N0cmluZyhyZXQpKTsKKyAgICAgIAorICAgICAgcmV0ID0gbWFjaF9wb3J0X21vdmVfbWVtYmVyKG1hY2hfdGFza19zZWxmKCksIAorCQkJCSAgb3VyX25vdGlmeV9wb3J0LAorCQkJCSAgaW5mZXJpb3Jfd2FpdF9wb3J0X3NldCk7CisgICAgICBpZiAocmV0ICE9IEtFUk5fU1VDQ0VTUykKKwlmYXRhbCgiaW5pdGlhbCBtb3ZlIG1lbWJlciAlcyIsbWFjaF9lcnJvcl9zdHJpbmcocmV0KSk7CisgICAgfQorfQorCisvKgorICogUmVnaXN0ZXIgb3VyIG1lc3NhZ2UgcG9ydCB0byB0aGUgbmV0IG5hbWUgc2VydmVyCisgKgorICogQ3VycmVudGx5IHVzZWQgb25seSBieSB0aGUgZXh0ZXJuYWwgc3RvcC1nZGIgcHJvZ3JhbQorICogc2luY2UgXkMgZG9lcyBub3Qgd29yayBpZiB5b3Ugd291bGQgbGlrZSB0byBlbnRlcgorICogZ2RiIGNvbW1hbmQgbGV2ZWwgd2hpbGUgZGVidWdnaW5nIHlvdXIgcHJvZ3JhbS4KKyAqCisgKiBOT1RFOiBJZiB0aGUgbWVzc2FnZSBwb3J0IGlzIHNvbWV0aW1lcyB1c2VkIGZvciBvdGhlcgorICogcHVycG9zZXMgYWxzbywgdGhlIE5BTUUgbXVzdCBub3QgYmUgYSBndWVzc2FibGUgb25lLgorICogVGhlbiwgdGhlcmUgc2hvdWxkIGJlIGEgd2F5IHRvIGNoYW5nZSBpdC4KKyAqLworCitjaGFyIHJlZ2lzdGVyZWRfbmFtZVsgTUFYX05BTUVfTEVOIF07CisKK3ZvaWQKK21lc3NhZ2VfcG9ydF9pbmZvIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAocmVnaXN0ZXJlZF9uYW1lWzBdKQorICAgIHByaW50Zl9maWx0ZXJlZCAoImdkYidzIG1lc3NhZ2UgcG9ydCBuYW1lOiAnJXMnXG4iLAorCQkgICAgIHJlZ2lzdGVyZWRfbmFtZSk7CisgIGVsc2UKKyAgICBwcmludGZfZmlsdGVyZWQgKCJnZGIncyBtZXNzYWdlIHBvcnQgaXMgbm90IGN1cnJlbnRseSByZWdpc3RlcmVkXG4iKTsKK30KKwordm9pZAorZ2RiX3JlZ2lzdGVyX3BvcnQgKG5hbWUsIHBvcnQpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIG1hY2hfcG9ydF90IHBvcnQ7Cit7CisgIGtlcm5fcmV0dXJuX3QgcmV0OworICBzdGF0aWMgaW50IGFscmVhZHlfc2lnbmVkID0gMDsKKyAgaW50IGxlbjsKKworICBpZiAoISBNQUNIX1BPUlRfVkFMSUQgKHBvcnQpIHx8ICFuYW1lIHx8ICEqbmFtZSkKKyAgICB7CisgICAgICB3YXJuaW5nICgiSW52YWxpZCByZWdpc3RyYXRpb24gcmVxdWVzdCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoISBhbHJlYWR5X3NpZ25lZCkKKyAgICB7CisgICAgICByZXQgPSBtYWNoX3BvcnRfaW5zZXJ0X3JpZ2h0IChtYWNoX3Rhc2tfc2VsZiAoKSwKKwkJCQkgICAgb3VyX21lc3NhZ2VfcG9ydCwKKwkJCQkgICAgb3VyX21lc3NhZ2VfcG9ydCwKKwkJCQkgICAgTUFDSF9NU0dfVFlQRV9NQUtFX1NFTkQpOworICAgICAgQ0hLICgiRmFpbGVkIHRvIGNyZWF0ZSBhIHNpZ25hdHVyZSB0byBvdXJfbWVzc2FnZV9wb3J0IiwgcmV0KTsKKyAgICAgIGFscmVhZHlfc2lnbmVkID0gMTsKKyAgICB9CisgIGVsc2UgaWYgKGFscmVhZHlfc2lnbmVkID4gMSkKKyAgICB7CisgICAgICByZXQgPSBuZXRuYW1lX2NoZWNrX291dCAobmFtZV9zZXJ2ZXJfcG9ydCwKKwkJCSAgICAgICByZWdpc3RlcmVkX25hbWUsCisJCQkgICAgICAgb3VyX21lc3NhZ2VfcG9ydCk7CisgICAgICBDSEsgKCJGYWlsZWQgdG8gY2hlY2sgb3V0IGdkYidzIG1lc3NhZ2UgcG9ydCIsIHJldCk7CisgICAgICByZWdpc3RlcmVkX25hbWVbMF0gPSAnXDAwMCc7CisgICAgICBhbHJlYWR5X3NpZ25lZCA9IDE7CisgICAgfQorCisgIHJldCA9IG5ldG5hbWVfY2hlY2tfaW4gKG5hbWVfc2VydmVyX3BvcnQsCS8qIE5hbWUgc2VydmVyIHBvcnQgKi8KKwkJCSAgbmFtZSwJCQkvKiBOYW1lIG9mIHNlcnZpY2UgKi8KKwkJCSAgb3VyX21lc3NhZ2VfcG9ydCwJLyogU2lnbmF0dXJlICovCisJCQkgIHBvcnQpOyAJCS8qIENyZWF0ZXMgYSBuZXcgc2VuZCByaWdodCAqLworICBDSEsoIkZhaWxlZCB0byBjaGVjayBpbiB0aGUgcG9ydCIsIHJldCk7CisgIAorICBsZW4gPSAwOworICB3aGlsZShsZW4gPCBNQVhfTkFNRV9MRU4gJiYgKihuYW1lK2xlbikpCisgICAgeworICAgICAgcmVnaXN0ZXJlZF9uYW1lW2xlbl0gPSAqKG5hbWUrbGVuKTsKKyAgICAgIGxlbisrOworICAgIH0KKyAgcmVnaXN0ZXJlZF9uYW1lW2xlbl0gPSAnXDAwMCc7CisgIGFscmVhZHlfc2lnbmVkID0gMjsKK30gIAorCitzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqY21kX3RocmVhZF9saXN0Oworc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmNtZF90YXNrX2xpc3Q7CisKKy8qQVJHU1VTRUQqLworc3RhdGljIHZvaWQKK3RocmVhZF9jb21tYW5kIChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcInRocmVhZFwiIG11c3QgYmUgZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgYSB0aHJlYWQgY29tbWFuZC5cbiIpOworICBoZWxwX2xpc3QgKGNtZF90aHJlYWRfbGlzdCwgInRocmVhZCAiLCAtMSwgZ2RiX3N0ZG91dCk7Cit9CisKKy8qQVJHU1VTRUQqLworc3RhdGljIHZvaWQKK3Rhc2tfY29tbWFuZCAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHByaW50Zl91bmZpbHRlcmVkICgiXCJ0YXNrXCIgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiBhIHRhc2sgY29tbWFuZC5cbiIpOworICBoZWxwX2xpc3QgKGNtZF90YXNrX2xpc3QsICJ0YXNrICIsIC0xLCBnZGJfc3Rkb3V0KTsKK30KKworYWRkX21hY2hfc3BlY2lmaWNfY29tbWFuZHMgKCkKK3sKKyAgLyogVGhyZWFkIGhhbmRsaW5nIGNvbW1hbmRzICovCisKKyAgLyogRklYTUU6IE1vdmUgb3VyIHRocmVhZCBzdXBwb3J0IGludG8gdGhlIGdlbmVyaWMgdGhyZWFkLmMgc3R1ZmYgc28gd2UKKyAgICAgY2FuIHNoYXJlIHRoYXQgY29kZS4gICovCisgIGFkZF9wcmVmaXhfY21kICgibXRocmVhZCIsIGNsYXNzX3N0YWNrLCB0aHJlYWRfY29tbWFuZCwKKyAgICAgICJHZW5lcmljIGNvbW1hbmQgZm9yIGhhbmRsaW5nIE1hY2ggdGhyZWFkcyBpbiB0aGUgZGVidWdnZWQgdGFzay4iLAorICAgICAgJmNtZF90aHJlYWRfbGlzdCwgInRocmVhZCAiLCAwLCAmY21kbGlzdCk7CisKKyAgYWRkX2NvbV9hbGlhcyAoInRoIiwgIm10aHJlYWQiLCBjbGFzc19zdGFjaywgMSk7CisKKyAgYWRkX2NtZCAoInNlbGVjdCIsIGNsYXNzX3N0YWNrLCB0aHJlYWRfc2VsZWN0X2NvbW1hbmQsIAorCSAgICJTZWxlY3QgYW5kIHByaW50IE1JRCBvZiB0aGUgc2VsZWN0ZWQgdGhyZWFkIiwKKwkgICAmY21kX3RocmVhZF9saXN0KTsKKyAgYWRkX2NtZCAoImxpc3QiLCAgIGNsYXNzX3N0YWNrLCB0aHJlYWRfbGlzdF9jb21tYW5kLAorCSAgICJMaXN0IGluZm8gb2YgdGFzaydzIHRocmVhZHMuIFNlbGVjdGVkIHRocmVhZCBpcyBtYXJrZWQgd2l0aCAnKiciLAorCSAgICZjbWRfdGhyZWFkX2xpc3QpOworICBhZGRfY21kICgic3VzcGVuZCIsIGNsYXNzX3J1biwgdGhyZWFkX3N1c3BlbmRfY29tbWFuZCwKKwkgICAiU3VzcGVuZCBvbmUgb3IgYWxsIG9mIHRoZSB0aHJlYWRzIGluIHRoZSBzZWxlY3RlZCB0YXNrLiIsCisJICAgJmNtZF90aHJlYWRfbGlzdCk7CisgIGFkZF9jbWQgKCJyZXN1bWUiLCBjbGFzc19ydW4sIHRocmVhZF9yZXN1bWVfY29tbWFuZCwKKwkgICAiUmVzdW1lIG9uZSBvciBhbGwgb2YgdGhlIHRocmVhZHMgaW4gdGhlIHNlbGVjdGVkIHRhc2suIiwKKwkgICAmY21kX3RocmVhZF9saXN0KTsKKyAgYWRkX2NtZCAoImtpbGwiLCBjbGFzc19ydW4sIHRocmVhZF9raWxsX2NvbW1hbmQsCisJICAgIktpbGwgdGhlIHNwZWNpZmllZCB0aHJlYWQgTUlEIGZyb20gaW5mZXJpb3IgdGFzay4iLAorCSAgICZjbWRfdGhyZWFkX2xpc3QpOworI2lmIDAKKyAgLyogVGhlIHJlc3Qgb2YgdGhpcyBzdXBwb3J0IChjb25kaXRpb25fdGhyZWFkKSB3YXMgbm90IG1lcmdlZC4gIEl0IHByb2JhYmx5CisgICAgIHNob3VsZCBub3QgYmUgbWVyZ2VkIGluIHRoaXMgZm9ybSwgYnV0IGluc3RlYWQgYWRkZWQgdG8gdGhlIGdlbmVyaWMgR0RCCisgICAgIHRocmVhZCBzdXBwb3J0LiAgKi8KKyAgYWRkX2NtZCAoImJyZWFrIiwgY2xhc3NfYnJlYWtwb2ludCwgY29uZGl0aW9uX3RocmVhZCwKKwkgICAiQnJlYWtwb2ludCBOIHdpbGwgb25seSBiZSBlZmZlY3RpdmUgZm9yIHRocmVhZCBNSUQgb3IgQFNMT1RcblwKKwkgICAgSWYgTUlEL0BTTE9UIGlzIG9taXR0ZWQgYWxsb3cgYWxsIHRocmVhZHMgdG8gYnJlYWsgYXQgYnJlYWtwb2ludCIsCisJICAgJmNtZF90aHJlYWRfbGlzdCk7CisjZW5kaWYKKyAgLyogVGhyZWFkIGNvbW1hbmQgc2hvcnRoYW5kcyAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpICovCisgIGFkZF9hbGlhc19jbWQgKCJ0cyIsICJtdGhyZWFkIHNlbGVjdCIsIDAsIDAsICZjbWRsaXN0KTsKKyAgYWRkX2FsaWFzX2NtZCAoInRsIiwgIm10aHJlYWQgbGlzdCIsICAgMCwgMCwgJmNtZGxpc3QpOworCisgIC8qIHRhc2sgaGFuZGxpbmcgY29tbWFuZHMgKi8KKworICBhZGRfcHJlZml4X2NtZCAoInRhc2siLCBjbGFzc19zdGFjaywgdGFza19jb21tYW5kLAorICAgICAgIkdlbmVyaWMgY29tbWFuZCBmb3IgaGFuZGxpbmcgZGVidWdnZWQgdGFzay4iLAorICAgICAgJmNtZF90YXNrX2xpc3QsICJ0YXNrICIsIDAsICZjbWRsaXN0KTsKKworICBhZGRfY29tX2FsaWFzICgidGEiLCAidGFzayIsIGNsYXNzX3N0YWNrLCAxKTsKKworICBhZGRfY21kICgic3VzcGVuZCIsIGNsYXNzX3J1biwgdGFza19zdXNwZW5kX2NvbW1hbmQsCisJICAgIlN1c3BlbmQgdGhlIGluZmVyaW9yIHRhc2suIiwKKwkgICAmY21kX3Rhc2tfbGlzdCk7CisgIGFkZF9jbWQgKCJyZXN1bWUiLCBjbGFzc19ydW4sIHRhc2tfcmVzdW1lX2NvbW1hbmQsCisJICAgIlJlc3VtZSB0aGUgaW5mZXJpb3IgdGFzay4iLAorCSAgICZjbWRfdGFza19saXN0KTsKKyAgYWRkX2NtZCAoImluZm8iLCBub19jbGFzcywgdGFza19pbmZvX2NvbW1hbmQsCisJICAgIlByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgdGFzay4iLAorCSAgICZjbWRfdGFza19saXN0KTsKKworICAvKiBQcmludCBteSBtZXNzYWdlIHBvcnQgbmFtZSAqLworCisgIGFkZF9pbmZvICgibWVzc2FnZS1wb3J0IiwgbWVzc2FnZV9wb3J0X2luZm8sCisJICAgICJSZXR1cm5zIHRoZSBuYW1lIG9mIGdkYidzIG1lc3NhZ2UgcG9ydCBpbiB0aGUgbmV0bmFtZXNlcnZlciIpOworCisgIC8qIEV4Y2VwdGlvbiBjb21tYW5kcyAqLworCisgIGFkZF9pbmZvICgiZXhjZXB0aW9ucyIsIGV4Y2VwdGlvbl9pbmZvLAorCSAgICAiV2hhdCBkZWJ1Z2dlciBkb2VzIHdoZW4gcHJvZ3JhbSBnZXRzIHZhcmlvdXMgZXhjZXB0aW9ucy5cblwKK1NwZWNpZnkgYW4gZXhjZXB0aW9uIG51bWJlciBhcyBhcmd1bWVudCB0byBwcmludCBpbmZvIG9uIHRoYXRcblwKK2V4Y2VwdGlvbiBvbmx5LiIpOworCisgIGFkZF9jb20gKCJleGNlcHRpb24iLCBjbGFzc19ydW4sIGV4Y2VwdGlvbl9jb21tYW5kLAorCSAgICJTcGVjaWZ5IGhvdyB0byBoYW5kbGUgYW4gZXhjZXB0aW9uLlxuXAorQXJncyBhcmUgZXhjZXB0aW9uIG51bWJlciBmb2xsb3dlZCBieSBcImZvcndhcmRcIiBvciBcImtlZXBcIi5cblwKK2BGb3J3YXJkJyBtZWFucyBmb3J3YXJkIHRoZSBleGNlcHRpb24gdG8gdGhlIHByb2dyYW0ncyBub3JtYWwgZXhjZXB0aW9uXG5cCitoYW5kbGVyLlxuXAorYEtlZXAnIG1lYW5zIHJlZW50ZXIgZGVidWdnZXIgaWYgdGhpcyBleGNlcHRpb24gaGFwcGVucywgYW5kIEdEQiBtYXBzXG5cCit0aGUgZXhjZXB0aW9uIHRvIHNvbWUgc2lnbmFsIChzZWUgaW5mbyBleGNlcHRpb24pXG5cCitOb3JtYWxseSBcImtlZXBcIiBpcyB1c2VkIHRvIHJldHVybiB0byBHREIgb24gZXhjZXB0aW9uLiIpOworfQorCitrZXJuX3JldHVybl90Citkb19tYWNoX25vdGlmeV9kZWFkX25hbWUgKG5vdGlmeSwgbmFtZSkKKyAgICAgbWFjaF9wb3J0X3Qgbm90aWZ5OworICAgICBtYWNoX3BvcnRfdCBuYW1lOworeworICBrZXJuX3JldHVybl90IGtyID0gS0VSTl9TVUNDRVNTOworCisgIC8qIEZpbmQgdGhlIHRoaW5nIHRoYXQgbm90aWZpZWQgKi8KKyAgcG9ydF9jaGFpbl90IGVsZW1lbnQgPSBwb3J0X2NoYWluX21lbWJlciAobm90aWZ5X2NoYWluLCBuYW1lKTsKKworICAvKiBUYWtlIG5hbWUgb2YgZnJvbSB1bnJlY2VpdmVkIGRlYWQgbmFtZSBub3RpZmljYXRpb24gbGlzdCAqLworICBub3RpZnlfY2hhaW4gPSBwb3J0X2NoYWluX2RlbGV0ZSAobm90aWZ5X2NoYWluLCBuYW1lKTsKKworICBpZiAoISBlbGVtZW50KQorICAgIGVycm9yICgiUmVjZWl2ZWQgYSBkZWFkIG5hbWUgbm90aWZ5IGZyb20gdW5jaGFpbmVkIHBvcnQgKDB4JXgpIiwgbmFtZSk7CisgIAorICBzd2l0Y2ggKGVsZW1lbnQtPnR5cGUpIHsKKworICBjYXNlIE1BQ0hfVFlQRV9USFJFQUQ6CisgICAgdGFyZ2V0X3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCAoKTsKKyAgICBpZiAobmFtZSA9PSBjdXJyZW50X3RocmVhZCkKKyAgICAgIHsKKwlwcmludGZfZmlsdGVyZWQgKCJcbkN1cnJlbnQgdGhyZWFkICVkIGRpZWQiLCBlbGVtZW50LT5taWQpOworCWN1cnJlbnRfdGhyZWFkID0gTUFDSF9QT1JUX05VTEw7CisgICAgICB9CisgICAgZWxzZQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5UaHJlYWQgJWQgZGllZCIsIGVsZW1lbnQtPm1pZCk7CisKKyAgICBicmVhazsKKworICBjYXNlIE1BQ0hfVFlQRV9UQVNLOgorICAgIHRhcmdldF90ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgKCk7CisgICAgaWYgKG5hbWUgIT0gaW5mZXJpb3JfdGFzaykKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlRhc2sgJWQgZGllZCwgYnV0IGl0IHdhcyBub3QgdGhlIHNlbGVjdGVkIHRhc2siLAorCSAgICAgICBlbGVtZW50LT5taWQpOworICAgIGVsc2UJICAgICAgIAorICAgICAgeworCXByaW50Zl9maWx0ZXJlZCAoIkN1cnJlbnQgdGFzayAlZCBkaWVkIiwgZWxlbWVudC0+bWlkKTsKKwkKKwltYWNoX3BvcnRfZGVzdHJveSAobWFjaF90YXNrX3NlbGYoKSwgbmFtZSk7CisJaW5mZXJpb3JfdGFzayA9IE1BQ0hfUE9SVF9OVUxMOworCQorCWlmIChub3RpZnlfY2hhaW4pCisJICB3YXJuaW5nICgiVGhlcmUgd2VyZSBzdGlsbCB1bnJlY2VpdmVkIGRlYWRfbmFtZV9ub3RpZmljYXRpb25zPz8/Iik7CisJCisJLyogRGVzdHJveSB0aGUgb2xkIG5vdGlmaWNhdGlvbnMgKi8KKwlzZXR1cF9ub3RpZnlfcG9ydCAoMCk7CisKKyAgICAgIH0KKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIGVycm9yICgiVW5yZWdpc3RlcmVkIGRlYWRfbmFtZSAweCV4IG5vdGlmaWNhdGlvbiByZWNlaXZlZC4gVHlwZSBpcyAlZCwgbWlkIGlzIDB4JXgiLAorCSAgIG5hbWUsIGVsZW1lbnQtPnR5cGUsIGVsZW1lbnQtPm1pZCk7CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gS0VSTl9TVUNDRVNTOworfQorCitrZXJuX3JldHVybl90Citkb19tYWNoX25vdGlmeV9tc2dfYWNjZXB0ZWQgKG5vdGlmeSwgbmFtZSkKKyAgICAgbWFjaF9wb3J0X3Qgbm90aWZ5OworICAgICBtYWNoX3BvcnRfdCBuYW1lOworeworICB3YXJuaW5nICgiZG9fbWFjaF9ub3RpZnlfbXNnX2FjY2VwdGVkIDogbm90aWZ5ICV4LCBuYW1lICV4IiwKKwkgICBub3RpZnksIG5hbWUpOworICByZXR1cm4gS0VSTl9TVUNDRVNTOworfQorCitrZXJuX3JldHVybl90Citkb19tYWNoX25vdGlmeV9ub19zZW5kZXJzIChub3RpZnksIG1zY291bnQpCisgICAgIG1hY2hfcG9ydF90IG5vdGlmeTsKKyAgICAgbWFjaF9wb3J0X21zY291bnRfdCBtc2NvdW50OworeworICB3YXJuaW5nICgiZG9fbWFjaF9ub3RpZnlfbm9fc2VuZGVycyA6IG5vdGlmeSAleCwgbXNjb3VudCAleCIsCisJICAgbm90aWZ5LCBtc2NvdW50KTsKKyAgcmV0dXJuIEtFUk5fU1VDQ0VTUzsKK30KKwora2Vybl9yZXR1cm5fdAorZG9fbWFjaF9ub3RpZnlfcG9ydF9kZWxldGVkIChub3RpZnksIG5hbWUpCisgICAgIG1hY2hfcG9ydF90IG5vdGlmeTsKKyAgICAgbWFjaF9wb3J0X3QgbmFtZTsKK3sKKyAgd2FybmluZyAoImRvX21hY2hfbm90aWZ5X3BvcnRfZGVsZXRlZCA6IG5vdGlmeSAleCwgbmFtZSAleCIsCisJICAgbm90aWZ5LCBuYW1lKTsKKyAgcmV0dXJuIEtFUk5fU1VDQ0VTUzsKK30KKwora2Vybl9yZXR1cm5fdAorZG9fbWFjaF9ub3RpZnlfcG9ydF9kZXN0cm95ZWQgKG5vdGlmeSwgcmlnaHRzKQorICAgICBtYWNoX3BvcnRfdCBub3RpZnk7CisgICAgIG1hY2hfcG9ydF90IHJpZ2h0czsKK3sKKyAgd2FybmluZyAoImRvX21hY2hfbm90aWZ5X3BvcnRfZGVzdHJveWVkIDogbm90aWZ5ICV4LCByaWdodHMgJXgiLAorCSAgIG5vdGlmeSwgcmlnaHRzKTsKKyAgcmV0dXJuIEtFUk5fU1VDQ0VTUzsKK30KKwora2Vybl9yZXR1cm5fdAorZG9fbWFjaF9ub3RpZnlfc2VuZF9vbmNlIChub3RpZnkpCisgICAgIG1hY2hfcG9ydF90IG5vdGlmeTsKK3sKKyNpZmRlZiBEVU1QX1NZU0NBTEwKKyAgLyogTUFOWSBvZiB0aGVzZSBhcmUgZ2VuZXJhdGVkLiAqLworICB3YXJuaW5nICgiZG9fbWFjaF9ub3RpZnlfc2VuZF9vbmNlIDogbm90aWZ5ICV4IiwKKwkgICBub3RpZnkpOworI2VuZGlmCisgIHJldHVybiBLRVJOX1NVQ0NFU1M7Cit9CisKKy8qIEtpbGxzIHRoZSBpbmZlcmlvci4gSXQncyBnb25lIHdoZW4geW91IGNhbGwgdGhpcyAqLworc3RhdGljIHZvaWQKK2tpbGxfaW5mZXJpb3JfZmFzdCAoKQoreworICBXQUlUVFlQRSB3OworCisgIGlmIChpbmZlcmlvcl9waWQgPT0gMCB8fCBpbmZlcmlvcl9waWQgPT0gMSkKKyAgICByZXR1cm47CisKKyAgLyoga2lsbCgpIGl0LCBzaW5jZSB0aGUgVW5peCBzZXJ2ZXIgZG9lcyBub3Qgb3RoZXJ3aXNlIG5vdGljZSB3aGVuCisgICAqIGtpbGxlZCB3aXRoIHRhc2tfdGVybWluYXRlKCkuCisgICAqLworICBpZiAoaW5mZXJpb3JfcGlkID4gMCkKKyAgICBraWxsIChpbmZlcmlvcl9waWQsIFNJR0tJTEwpOworCisgIC8qIEl0J3MgcHJvcGFibHkgdGVybWluYXRlIGFscmVhZHkgKi8KKyAgKHZvaWQpIHRhc2tfdGVybWluYXRlIChpbmZlcmlvcl90YXNrKTsKKworICBpbmZlcmlvcl90YXNrICA9IE1BQ0hfUE9SVF9OVUxMOworICBjdXJyZW50X3RocmVhZCA9IE1BQ0hfUE9SVF9OVUxMOworCisgIHdhaXQzICgmdywgV05PSEFORywgMCk7CisKKyAgc2V0dXBfbm90aWZ5X3BvcnQgKDApOworfQorCitzdGF0aWMgdm9pZAorbTNfa2lsbF9pbmZlcmlvciAoKQoreworICBraWxsX2luZmVyaW9yX2Zhc3QgKCk7CisgIHRhcmdldF9tb3Vybl9pbmZlcmlvciAoKTsKK30KKworLyogQ2xlYW4gdXAgYWZ0ZXIgdGhlIGluZmVyaW9yIGRpZXMuICAqLworCitzdGF0aWMgdm9pZAorbTNfbW91cm5faW5mZXJpb3IgKCkKK3sKKyAgdW5wdXNoX3RhcmdldCAoJm0zX29wcyk7CisgIGdlbmVyaWNfbW91cm5faW5mZXJpb3IgKCk7Cit9CisKKwwKKy8qIEZvcmsgYW4gaW5mZXJpb3IgcHJvY2VzcywgYW5kIHN0YXJ0IGRlYnVnZ2luZyBpdC4gICovCisKK3N0YXRpYyB2b2lkCittM19jcmVhdGVfaW5mZXJpb3IgKGV4ZWNfZmlsZSwgYWxsYXJncywgZW52KQorICAgICBjaGFyICpleGVjX2ZpbGU7CisgICAgIGNoYXIgKmFsbGFyZ3M7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGZvcmtfaW5mZXJpb3IgKGV4ZWNfZmlsZSwgYWxsYXJncywgZW52LCBtM190cmFjZV9tZSwgbTNfdHJhY2VfaGltLCBOVUxMLCBOVUxMKTsKKyAgLyogV2UgYXJlIGF0IHRoZSBmaXJzdCBpbnN0cnVjdGlvbiB3ZSBjYXJlIGFib3V0LiAgKi8KKyAgLyogUGVkYWwgdG8gdGhlIG1ldGFsLi4uICovCisgIHByb2NlZWQgKChDT1JFX0FERFIpIC0xLCAwLCAwKTsKK30KKworLyogTWFyayBvdXIgdGFyZ2V0LXN0cnVjdCBhcyBlbGlnaWJsZSBmb3Igc3RyYXkgInJ1biIgYW5kICJhdHRhY2giCisgICBjb21tYW5kcy4gICovCitzdGF0aWMgaW50CittM19jYW5fcnVuICgpCit7CisgIHJldHVybiAxOworfQorDAorLyogTWFjaCAzLjAgZG9lcyBub3QgbmVlZCBwdHJhY2UgZm9yIGFueXRoaW5nCisgKiBNYWtlIHN1cmUgbm9ib2R5IHVzZXMgaXQgb24gbWFjaC4KKyAqLworcHRyYWNlIChhLGIsYyxkKQoraW50IGEsYixjLGQ7Cit7CisgIGVycm9yICgiTG9zZSwgTG9zZSEgU29tZWJvZHkgY2FsbGVkIHB0cmFjZVxuIik7Cit9CisKKy8qIFJlc3VtZSBleGVjdXRpb24gb2YgdGhlIGluZmVyaW9yIHByb2Nlc3MuCisgICBJZiBTVEVQIGlzIG5vbnplcm8sIHNpbmdsZS1zdGVwIGl0LgorICAgSWYgU0lHTkFMIGlzIG5vbnplcm8sIGdpdmUgaXQgdGhhdCBzaWduYWwuICAqLworCit2b2lkCittM19yZXN1bWUgKHBpZCwgc3RlcCwgc2lnbmFsKQorICAgICBpbnQgcGlkOworICAgICBpbnQgc3RlcDsKKyAgICAgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ25hbDsKK3sKKyAga2Vybl9yZXR1cm5fdAlyZXQ7CisKKyAgaWYgKHN0ZXApCisgICAgeworICAgICAgdGhyZWFkX2Jhc2ljX2luZm9fZGF0YV90IHRoX2luZm87CisgICAgICB1bnNpZ25lZCBpbnQJICAgICAgIGluZm9DbnQgPSBUSFJFQURfQkFTSUNfSU5GT19DT1VOVDsKKyAgICAgIAorICAgICAgLyogVGhlcmUgaXMgbm8gcG9pbnQgaW4gc2luZ2xlIHN0ZXBwaW5nIHdoZW4gY3VycmVudF90aHJlYWQKKyAgICAgICAqIGlzIGRlYWQuCisgICAgICAgKi8KKyAgICAgIGlmICghIE1BQ0hfUE9SVF9WQUxJRCAoY3VycmVudF90aHJlYWQpKQorCWVycm9yICgiTm8gdGhyZWFkIHNlbGVjdGVkOyBjYW4gbm90IHNpbmdsZSBzdGVwIik7CisgICAgICAKKyAgICAgIC8qIElmIGN1cnJlbnRfdGhyZWFkIGlzIHN1c3BlbmRlZCwgdHJhY2luZyBpdCB3b3VsZCBuZXZlciByZXR1cm4uCisgICAgICAgKi8KKyAgICAgIHJldCA9IHRocmVhZF9pbmZvIChjdXJyZW50X3RocmVhZCwKKwkJCSBUSFJFQURfQkFTSUNfSU5GTywKKwkJCSAodGhyZWFkX2luZm9fdCkgJnRoX2luZm8sCisJCQkgJmluZm9DbnQpOworICAgICAgQ0hLICgiY2hpbGRfcmVzdW1lOiBjYW4ndCBnZXQgdGhyZWFkIGluZm8iLCByZXQpOworICAgICAgCisgICAgICBpZiAodGhfaW5mby5zdXNwZW5kX2NvdW50KQorCWVycm9yICgiQ2FuJ3QgdHJhY2UgYSBzdXNwZW5kZWQgdGhyZWFkLiBVc2UgXCJ0aHJlYWQgcmVzdW1lXCIgY29tbWFuZCB0byByZXN1bWUgaXQiKTsKKyAgICB9CisKKyAgdm1fcmVhZF9jYWNoZV92YWxpZCA9IEZBTFNFOworCisgIGlmIChzaWduYWwgJiYgaW5mZXJpb3JfcGlkID4gMCkgLyogRG8gbm90IHNpZ25hbCwgaWYgYXR0YWNoZWQgYnkgTUlEICovCisgICAga2lsbCAoaW5mZXJpb3JfcGlkLCB0YXJnZXRfc2lnbmFsX3RvX2hvc3QgKHNpZ25hbCkpOworCisgIGlmIChzdGVwKQorICAgIHsKKyAgICAgIHN1c3BlbmRfYWxsX3RocmVhZHMgKDApOworCisgICAgICBzZXR1cF9zaW5nbGVfc3RlcCAoY3VycmVudF90aHJlYWQsIFRSVUUpOworICAgICAgCisgICAgICByZXQgPSB0aHJlYWRfcmVzdW1lIChjdXJyZW50X3RocmVhZCk7CisgICAgICBDSEsgKCJ0aHJlYWRfcmVzdW1lIiwgcmV0KTsKKyAgICB9CisgIAorICByZXQgPSB0YXNrX3Jlc3VtZSAoaW5mZXJpb3JfdGFzayk7CisgIGlmIChyZXQgPT0gS0VSTl9GQUlMVVJFKQorICAgIHdhcm5pbmcgKCJUYXNrIHdhcyBub3Qgc3VzcGVuZGVkIik7CisgIGVsc2UKKyAgICBDSEsgKCJSZXN1bWluZyB0YXNrIiwgcmV0KTsKKyAgCisgIC8qIEhBQ0sgSEFDSyBUaGlzIGlzIG5lZWRlZCBieSB0aGUgbXVsdGlzZXJ2ZXIgc3lzdGVtIEhBQ0sgSEFDSyAqLworICB3aGlsZSAoKHJldCA9IHRhc2tfcmVzdW1lKGluZmVyaW9yX3Rhc2spKSA9PSBLRVJOX1NVQ0NFU1MpCisgICAgLyogbWFrZSBzdXJlIGl0IHJlYWxseSBydW5zICovOworICAvKiBIQUNLIEhBQ0sgVGhpcyBpcyBuZWVkZWQgYnkgdGhlIG11bHRpc2VydmVyIHN5c3RlbSBIQUNLIEhBQ0sgKi8KK30KKwwKKyNpZmRlZiBBVFRBQ0hfREVUQUNICisKKy8qIFN0YXJ0IGRlYnVnZ2luZyB0aGUgcHJvY2VzcyB3aXRoIHRoZSBnaXZlbiB0YXNrICovCit2b2lkCit0YXNrX2F0dGFjaCAodGlkKQorICB0YXNrX3QgdGlkOworeworICBrZXJuX3JldHVybl90IHJldDsKKyAgaW5mZXJpb3JfdGFzayA9IHRpZDsKKworICByZXQgPSB0YXNrX3N1c3BlbmQgKGluZmVyaW9yX3Rhc2spOworICBDSEsoInRhc2tfYXR0YWNoOiB0YXNrX3N1c3BlbmQiLCByZXQpOworCisgIG11c3Rfc3VzcGVuZF90aHJlYWQgPSAwOworCisgIHNldHVwX25vdGlmeV9wb3J0ICgxKTsKKworICByZXF1ZXN0X25vdGlmeSAoaW5mZXJpb3JfdGFzaywgTUFDSF9OT1RJRllfREVBRF9OQU1FLCBNQUNIX1RZUEVfVEFTSyk7CisKKyAgc2V0dXBfZXhjZXB0aW9uX3BvcnQgKCk7CisgIAorICBlbXVsYXRvcl9wcmVzZW50ID0gaGF2ZV9lbXVsYXRvcl9wIChpbmZlcmlvcl90YXNrKTsKKworICBhdHRhY2hfZmxhZyA9IDE7Cit9CisKKy8qIFdlbGwsIHdlIGNhbiBjYWxsIGVycm9yIGFsc28gaGVyZSBhbmQgbGVhdmUgdGhlCisgKiB0YXJnZXQgc3RhY2sgaW5jb25zaXN0ZW50LiBTaWdoLgorICogRml4IHRoaXMgc29tZXRpbWUgKHRoZSBvbmx5IHdheSB0byBmYWlsIGhlcmUgaXMgdGhhdAorICogdGhlIHRhc2sgaGFzIG5vIHRocmVhZHMgYXQgYWxsLCB3aGljaCBpcyByYXJlLCBidXQKKyAqIHBvc3NpYmxlOyBvciBpZiB0aGUgdGFyZ2V0IHRhc2sgaGFzIGRpZWQsIHdoaWNoIGlzIGFsc28KKyAqIHBvc3NpYmxlLCBidXQgdW5saWtlbHksIHNpbmNlIGl0IGhhcyBiZWVuIHN1c3BlbmRlZC4KKyAqIChTb21lb25lIG11c3QgaGF2ZSBraWxsZWQgaXQpKQorICovCit2b2lkCithdHRhY2hfdG9fdGhyZWFkICgpCit7CisgIGlmIChzZWxlY3RfdGhyZWFkIChpbmZlcmlvcl90YXNrLCAwLCAxKSAhPSBLRVJOX1NVQ0NFU1MpCisgICAgZXJyb3IgKCJDb3VsZCBub3Qgc2VsZWN0IGFueSB0aHJlYWRzIHRvIGF0dGFjaCB0byIpOworfQorCittaWRfYXR0YWNoIChtaWQpCisgICAgaW50CW1pZDsKK3sKKyAgICBrZXJuX3JldHVybl90IHJldDsKKworICAgIHJldCA9IG1hY2hpZF9tYWNoX3BvcnQgKG1pZF9zZXJ2ZXIsIG1pZF9hdXRoLCBtaWQsICZpbmZlcmlvcl90YXNrKTsKKyAgICBDSEsoIm1pZF9hdHRhY2g6IG1hY2hpZF9tYWNoX3BvcnQiLCByZXQpOworCisgICAgdGFza19hdHRhY2ggKGluZmVyaW9yX3Rhc2spOworCisgICAgcmV0dXJuIG1pZDsKK30KKworLyogCisgKiBTdGFydCBkZWJ1Z2dpbmcgdGhlIHByb2Nlc3Mgd2hvc2UgdW5peCBwcm9jZXNzLWlkIGlzIFBJRC4KKyAqIEEgbmVnYXRpdmUgInBpZCIgdmFsdWUgaXMgbGVnYWwgYW5kIHNpZ25pZmllcyBhIG1hY2hfaWQgbm90IGEgdW5peCBwaWQuCisgKgorICogUHJldmVudCAocG9zc2libGUgdW53YW50ZWQpIGRhbmdlcm91cyBvcGVyYXRpb25zIGJ5IGVuYWJsZWQgdXNlcnMKKyAqIGxpa2UgImF0dGEgMCIgb3IgImF0dGEgZm9vIiAoZXF1YWwgdG8gdGhlIHByZXZpb3VzIDotKSBhbmQKKyAqICJhdHRhIHBpZHNlbGYiLiBBbnl3YXksIHRoZSBsYXR0ZXIgaXMgYWxsb3dlZCBieSBzcGVjaWZ5aW5nIGEgTUlELgorICovCitzdGF0aWMgaW50CittM19kb19hdHRhY2ggKHBpZCkKKyAgICAgaW50IHBpZDsKK3sKKyAga2Vybl9yZXR1cm5fdCByZXQ7CisKKyAgaWYgKHBpZCA9PSAwKQorICAgIGVycm9yKCJNSUQ9MCwgRGVidWdnaW5nIHRoZSBtYXN0ZXIgdW5peCBzZXJ2ZXIgZG9lcyBub3QgY29tcHV0ZSIpOworCisgIC8qIEZvby4gVGhpcyBhc3N1bWVzIGdkYiBoYXMgYSB1bml4IHBpZCAqLworICBpZiAocGlkID09IGdldHBpZCgpKQorICAgIGVycm9yICgiSSB3aWxsIGRlYnVnIG15c2VsZiBvbmx5IGJ5IG1pZC4gKEdkYiB3b3VsZCBzdXNwZW5kIGl0c2VsZiEpIik7CisKKyAgaWYgKHBpZCA8IDApCisgICAgeworICAgICAgbWlkX2F0dGFjaCAoLShwaWQpKTsKKworICAgICAgLyogaW5mZXJpb3JfcGlkIHdpbGwgYmUgTkVHQVRJVkUhICovCisgICAgICBpbmZlcmlvcl9waWQgPSBwaWQ7CisKKyAgICAgIHJldHVybiBpbmZlcmlvcl9waWQ7CisgICAgfQorCisgIGluZmVyaW9yX3Rhc2sgPSB0YXNrX2J5X3BpZCAocGlkKTsKKyAgaWYgKCEgTUFDSF9QT1JUX1ZBTElEIChpbmZlcmlvcl90YXNrKSkKKyAgICBlcnJvcigiQ2Fubm90IG1hcCBVbml4IHBpZCAlZCB0byBNYWNoIHRhc2sgcG9ydCIsIHBpZCk7CisKKyAgdGFza19hdHRhY2ggKGluZmVyaW9yX3Rhc2spOworCisgIGluZmVyaW9yX3BpZCA9IHBpZDsKKworICByZXR1cm4gaW5mZXJpb3JfcGlkOworfQorCisvKiBBdHRhY2ggdG8gcHJvY2VzcyBQSUQsIHRoZW4gaW5pdGlhbGl6ZSBmb3IgZGVidWdnaW5nIGl0CisgICBhbmQgd2FpdCBmb3IgdGhlIHRyYWNlLXRyYXAgdGhhdCByZXN1bHRzIGZyb20gYXR0YWNoaW5nLiAgKi8KKworc3RhdGljIHZvaWQKK20zX2F0dGFjaCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgY2hhciAqZXhlY19maWxlOworICBpbnQgcGlkOworCisgIGlmICghYXJncykKKyAgICBlcnJvcl9ub19hcmcgKCJwcm9jZXNzLWlkIHRvIGF0dGFjaCIpOworCisgIHBpZCA9IGF0b2kgKGFyZ3MpOworCisgIGlmIChwaWQgPT0gZ2V0cGlkKCkpCQkvKiBUcnlpbmcgdG8gbWFzdHVyYmF0ZT8gKi8KKyAgICBlcnJvciAoIkkgcmVmdXNlIHRvIGRlYnVnIG15c2VsZiEiKTsKKworICBpZiAoZnJvbV90dHkpCisgICAgeworICAgICAgZXhlY19maWxlID0gKGNoYXIgKikgZ2V0X2V4ZWNfZmlsZSAoMCk7CisKKyAgICAgIGlmIChleGVjX2ZpbGUpCisJcHJpbnRmX3VuZmlsdGVyZWQgKCJBdHRhY2hpbmcgdG8gcHJvZ3JhbSBgJXMnLCAlc1xuIiwgZXhlY19maWxlLCB0YXJnZXRfcGlkX3RvX3N0ciAocGlkKSk7CisgICAgICBlbHNlCisJcHJpbnRmX3VuZmlsdGVyZWQgKCJBdHRhY2hpbmcgdG8gJXNcbiIsIHRhcmdldF9waWRfdG9fc3RyIChwaWQpKTsKKworICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgICB9CisKKyAgbTNfZG9fYXR0YWNoIChwaWQpOworICBpbmZlcmlvcl9waWQgPSBwaWQ7CisgIHB1c2hfdGFyZ2V0ICgmbTNfb3BzKTsKK30KKwwKK3ZvaWQKK2RlYWxsb2NhdGVfaW5mZXJpb3JfcG9ydHMgKCkKK3sKKyAga2Vybl9yZXR1cm5fdCAgcmV0OworICB0aHJlYWRfYXJyYXlfdCB0aHJlYWRfbGlzdDsKKyAgaW50CQkgdGhyZWFkX2NvdW50LCBpbmRleDsKKworICBpZiAoIU1BQ0hfUE9SVF9WQUxJRCAoaW5mZXJpb3JfdGFzaykpCisgICAgcmV0dXJuOworCisgIHJldCA9IHRhc2tfdGhyZWFkcyAoaW5mZXJpb3JfdGFzaywgJnRocmVhZF9saXN0LCAmdGhyZWFkX2NvdW50KTsKKyAgaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpCisgICAgeworICAgICAgd2FybmluZyAoImRlYWxsb2NhdGVfaW5mZXJpb3JfcG9ydHM6IHRhc2tfdGhyZWFkcyIsCisJICAgICAgIG1hY2hfZXJyb3Jfc3RyaW5nKHJldCkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBHZXQgcmlkIG9mIHNlbmQgcmlnaHRzIHRvIHRhc2sgdGhyZWFkcyAqLworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0aHJlYWRfY291bnQ7IGluZGV4KyspCisgICAgeworICAgICAgaW50IHJpZ2h0czsKKyAgICAgIHJldCA9IG1hY2hfcG9ydF9nZXRfcmVmcyAobWFjaF90YXNrX3NlbGYgKCksCisJCQkJdGhyZWFkX2xpc3RbaW5kZXhdLAorCQkJCU1BQ0hfUE9SVF9SSUdIVF9TRU5ELAorCQkJCSZyaWdodHMpOworICAgICAgQ0hLKCJkZWFsbG9jYXRlX2luZmVyaW9yX3BvcnRzOiBnZXQgcmVmcyIsIHJldCk7CisKKyAgICAgIGlmIChyaWdodHMgPiAwKQorCXsKKwkgIHJldCA9IG1hY2hfcG9ydF9tb2RfcmVmcyAobWFjaF90YXNrX3NlbGYgKCksCisJCQkJICAgIHRocmVhZF9saXN0W2luZGV4XSwKKwkJCQkgICAgTUFDSF9QT1JUX1JJR0hUX1NFTkQsCisJCQkJICAgIC1yaWdodHMpOworCSAgQ0hLKCJkZWFsbG9jYXRlX2luZmVyaW9yX3BvcnRzOiBtb2QgcmVmcyIsIHJldCk7CisJfQorICAgIH0KKworICByZXQgPSBtYWNoX3BvcnRfbW9kX3JlZnMgKG1hY2hfdGFza19zZWxmICgpLAorCQkJICAgIGluZmVyaW9yX2V4Y2VwdGlvbl9wb3J0LAorCQkJICAgIE1BQ0hfUE9SVF9SSUdIVF9SRUNFSVZFLAorCQkJICAgIC0xKTsKKyAgQ0hLICgiZGVhbGxvY2F0ZV9pbmZlcmlvcl9wb3J0czogY2Fubm90IGdldCByaWQgb2YgZXhjZXB0aW9uIHBvcnQiLCByZXQpOworCisgIHJldCA9IG1hY2hfcG9ydF9kZWFsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwKKwkJCSAgICAgIGluZmVyaW9yX3Rhc2spOworICBDSEsgKCJkZWFsbG9jYXRlX3Rhc2tfcG9ydDogZGVhbGxvY2F0aW5nIGluZmVyaW9yX3Rhc2siLCByZXQpOworCisgIGN1cnJlbnRfdGhyZWFkID0gTUFDSF9QT1JUX05VTEw7CisgIGluZmVyaW9yX3Rhc2sgID0gTUFDSF9QT1JUX05VTEw7Cit9CisKKy8qIFN0b3AgZGVidWdnaW5nIHRoZSBwcm9jZXNzIHdob3NlIG51bWJlciBpcyBQSUQKKyAgIGFuZCBjb250aW51ZSBpdCB3aXRoIHNpZ25hbCBudW1iZXIgU0lHTkFMLgorICAgU0lHTkFMID0gMCBtZWFucyBqdXN0IGNvbnRpbnVlIGl0LiAgKi8KKworc3RhdGljIHZvaWQKK20zX2RvX2RldGFjaCAoc2lnbmFsKQorICAgICBpbnQgc2lnbmFsOworeworICBrZXJuX3JldHVybl90IHJldDsKKworICBNQUNIX0VSUk9SX05PX0lORkVSSU9SOworCisgIGlmIChjdXJyZW50X3RocmVhZCAhPSBNQUNIX1BPUlRfTlVMTCkKKyAgICB7CisgICAgICAvKiBTdG9yZSB0aGUgZ2RiJ3MgdmlldyBvZiB0aGUgdGhyZWFkIHdlIGFyZSBkZXNlbGVjdGluZworICAgICAgICogYmVmb3JlIHdlIGRldGFjaC4KKyAgICAgICAqIEBAIEkgYW0gcmVhbGx5IG5vdCBzdXJlIGlmIHRoaXMgaXMgZXZlciBuZWVkZWVkLgorICAgICAgICovCisgICAgICB0YXJnZXRfcHJlcGFyZV90b19zdG9yZSAoKTsKKyAgICAgIHRhcmdldF9zdG9yZV9yZWdpc3RlcnMgKC0xKTsKKyAgICB9CisKKyAgcmV0ID0gdGFza19zZXRfc3BlY2lhbF9wb3J0IChpbmZlcmlvcl90YXNrLAorCQkJICAgICAgIFRBU0tfRVhDRVBUSU9OX1BPUlQsIAorCQkJICAgICAgIGluZmVyaW9yX29sZF9leGNlcHRpb25fcG9ydCk7CisgIENISyAoInRhc2tfc2V0X3NwZWNpYWxfcG9ydCIsIHJldCk7CisKKyAgLyogRGlzY2FyZCBhbGwgcmVxdWVzdGVkIG5vdGlmaWNhdGlvbnMgKi8KKyAgc2V0dXBfbm90aWZ5X3BvcnQgKDApOworCisgIGlmIChyZW1vdmVfYnJlYWtwb2ludHMgKCkpCisgICAgd2FybmluZyAoIkNvdWxkIG5vdCByZW1vdmUgYnJlYWtwb2ludHMgd2hlbiBkZXRhY2hpbmciKTsKKyAgCisgIGlmIChzaWduYWwgJiYgaW5mZXJpb3JfcGlkID4gMCkKKyAgICBraWxsIChpbmZlcmlvcl9waWQsIHNpZ25hbCk7CisgIAorICAvKiB0aGUgdGFzayBtaWdodCBiZSBkZWFkIGJ5IG5vdyAqLworICAodm9pZCkgdGFza19yZXN1bWUgKGluZmVyaW9yX3Rhc2spOworICAKKyAgZGVhbGxvY2F0ZV9pbmZlcmlvcl9wb3J0cyAoKTsKKyAgCisgIGF0dGFjaF9mbGFnID0gMDsKK30KKworLyogVGFrZSBhIHByb2dyYW0gcHJldmlvdXNseSBhdHRhY2hlZCB0byBhbmQgZGV0YWNoZXMgaXQuCisgICBUaGUgcHJvZ3JhbSByZXN1bWVzIGV4ZWN1dGlvbiBhbmQgd2lsbCBubyBsb25nZXIgc3RvcAorICAgb24gc2lnbmFscywgZXRjLiAgV2UnZCBiZXR0ZXIgbm90IGhhdmUgbGVmdCBhbnkgYnJlYWtwb2ludHMKKyAgIGluIHRoZSBwcm9ncmFtIG9yIGl0J2xsIGRpZSB3aGVuIGl0IGhpdHMgb25lLiAgRm9yIHRoaXMKKyAgIHRvIHdvcmssIGl0IG1heSBiZSBuZWNlc3NhcnkgZm9yIHRoZSBwcm9jZXNzIHRvIGhhdmUgYmVlbgorICAgcHJldmlvdXNseSBhdHRhY2hlZC4gIEl0ICptaWdodCogd29yayBpZiB0aGUgcHJvZ3JhbSB3YXMKKyAgIHN0YXJ0ZWQgdmlhIGZvcmsuICAqLworCitzdGF0aWMgdm9pZAorbTNfZGV0YWNoIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpbnQgc2lnZ25hbCA9IDA7CisKKyAgaWYgKGZyb21fdHR5KQorICAgIHsKKyAgICAgIGNoYXIgKmV4ZWNfZmlsZSA9IGdldF9leGVjX2ZpbGUgKDApOworICAgICAgaWYgKGV4ZWNfZmlsZSA9PSAwKQorCWV4ZWNfZmlsZSA9ICIiOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJEZXRhY2hpbmcgZnJvbSBwcm9ncmFtOiAlcyAlc1xuIiwKKwkgICAgICBleGVjX2ZpbGUsIHRhcmdldF9waWRfdG9fc3RyIChpbmZlcmlvcl9waWQpKTsKKyAgICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisgICAgfQorICBpZiAoYXJncykKKyAgICBzaWdnbmFsID0gYXRvaSAoYXJncyk7CisgIAorICBtM19kb19kZXRhY2ggKHNpZ2duYWwpOworICBpbmZlcmlvcl9waWQgPSAwOworICB1bnB1c2hfdGFyZ2V0ICgmbTNfb3BzKTsJCS8qIFBvcCBvdXQgb2YgaGFuZGxpbmcgYW4gaW5mZXJpb3IgKi8KK30KKyNlbmRpZiAvKiBBVFRBQ0hfREVUQUNIICovCisKKy8qIEdldCByZWFkeSB0byBtb2RpZnkgdGhlIHJlZ2lzdGVycyBhcnJheS4gIE9uIG1hY2hpbmVzIHdoaWNoIHN0b3JlCisgICBpbmRpdmlkdWFsIHJlZ2lzdGVycywgdGhpcyBkb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuICBPbiBtYWNoaW5lcworICAgd2hpY2ggc3RvcmUgYWxsIHRoZSByZWdpc3RlcnMgaW4gb25lIGZlbGwgc3dvb3AsIHRoaXMgbWFrZXMgc3VyZQorICAgdGhhdCByZWdpc3RlcnMgY29udGFpbnMgYWxsIHRoZSByZWdpc3RlcnMgZnJvbSB0aGUgcHJvZ3JhbSBiZWluZworICAgZGVidWdnZWQuICAqLworCitzdGF0aWMgdm9pZAorbTNfcHJlcGFyZV90b19zdG9yZSAoKQoreworI2lmZGVmIENISUxEX1BSRVBBUkVfVE9fU1RPUkUKKyAgQ0hJTERfUFJFUEFSRV9UT19TVE9SRSAoKTsKKyNlbmRpZgorfQorCisvKiBQcmludCBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCB3ZSdyZSBhY2Nlc3NpbmcuICAqLworCitzdGF0aWMgdm9pZAorbTNfZmlsZXNfaW5mbyAoaWdub3JlKQorICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqaWdub3JlOworeworICAvKiBGSVhNRTogc2hvdWxkIHByaW50IE1JRCBhbmQgYWxsIHRoYXQgY3JhcC4gICovCisgIHByaW50Zl91bmZpbHRlcmVkICgiXHRVc2luZyB0aGUgcnVubmluZyBpbWFnZSBvZiAlcyAlcy5cbiIsCisJCSAgICAgICBhdHRhY2hfZmxhZz8gImF0dGFjaGVkIjogImNoaWxkIiwgdGFyZ2V0X3BpZF90b19zdHIgKGluZmVyaW9yX3BpZCkpOworfQorCitzdGF0aWMgdm9pZAorbTNfb3BlbiAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGVycm9yICgiVXNlIHRoZSBcInJ1blwiIGNvbW1hbmQgdG8gc3RhcnQgYSBVbml4IGNoaWxkIHByb2Nlc3MuIik7Cit9CisKKyNpZmRlZiBEVU1QX1NZU0NBTEwKKyNpZmRlZiBfX1NURENfXworI2RlZmluZSBTVFIoeCkgI3gKKyNlbHNlCisjZGVmaW5lIFNUUih4KSAieCIKKyNlbmRpZgorCitjaGFyCSpic2QxX25hbWVzW10gPSB7CisgICJleGVjdmUiLAorICAiZm9yayIsCisgICJ0YWtlX3NpZ25hbCIsCisgICJzaWdyZXR1cm4iLAorICAiZ2V0cnVzYWdlIiwKKyAgImNoZGlyIiwKKyAgImNocm9vdCIsCisgICJvcGVuIiwKKyAgImNyZWF0IiwKKyAgIm1rbm9kIiwKKyAgImxpbmsiLAorICAic3ltbGluayIsCisgICJ1bmxpbmsiLAorICAiYWNjZXNzIiwKKyAgInN0YXQiLAorICAicmVhZGxpbmsiLAorICAiY2htb2QiLAorICAiY2hvd24iLAorICAidXRpbWVzIiwKKyAgInRydW5jYXRlIiwKKyAgInJlbmFtZSIsCisgICJta2RpciIsCisgICJybWRpciIsCisgICJ4dXRpbWVzIiwKKyAgIm1vdW50IiwKKyAgInVtb3VudCIsCisgICJhY2N0IiwKKyAgInNldHF1b3RhIiwKKyAgIndyaXRlX3Nob3J0IiwKKyAgIndyaXRlX2xvbmciLAorICAic2VuZF9zaG9ydCIsCisgICJzZW5kX2xvbmciLAorICAic2VuZHRvX3Nob3J0IiwKKyAgInNlbmR0b19sb25nIiwKKyAgInNlbGVjdCIsCisgICJ0YXNrX2J5X3BpZCIsCisgICJyZWN2ZnJvbV9zaG9ydCIsCisgICJyZWN2ZnJvbV9sb25nIiwKKyAgInNldGdyb3VwcyIsCisgICJzZXRybGltaXQiLAorICAic2lndmVjIiwKKyAgInNpZ3N0YWNrIiwKKyAgInNldHRpbWVvZmRheSIsCisgICJhZGp0aW1lIiwKKyAgInNldGl0aW1lciIsCisgICJzZXRob3N0bmFtZSIsCisgICJiaW5kIiwKKyAgImFjY2VwdCIsCisgICJjb25uZWN0IiwKKyAgInNldHNvY2tvcHQiLAorICAiZ2V0c29ja29wdCIsCisgICJnZXRzb2NrbmFtZSIsCisgICJnZXRwZWVybmFtZSIsCisgICJpbml0X3Byb2Nlc3MiLAorICAidGFibGVfc2V0IiwKKyAgInRhYmxlX2dldCIsCisgICJwaW9jdGwiLAorICAiZW11bGF0b3JfZXJyb3IiLAorICAicmVhZHdyaXRlIiwKKyAgInNoYXJlX3dha2V1cCIsCisgIDAsCisgICJtYXByd19yZXF1ZXN0X2l0IiwKKyAgIm1hcHJ3X3JlbGVhc2VfaXQiLAorICAibWFwcndfcmVtYXAiLAorICAicGlkX2J5X3Rhc2siLAorfTsKKworaW50CWJzZDFfbm5hbWVzID0gc2l6ZW9mKGJzZDFfbmFtZXMpL3NpemVvZihic2QxX25hbWVzWzBdKTsKKworY2hhcioKK25hbWVfc3RyKG5hbWUsYnVmKQorCitpbnQJbmFtZTsKK2NoYXIJKmJ1ZjsKKworeworICBzd2l0Y2ggKG5hbWUpIHsKKyAgY2FzZSBNQUNIX01TR19UWVBFX0JPT0xFQU46CisgICAgcmV0dXJuICJib29sZWFuIjsKKyAgY2FzZSBNQUNIX01TR19UWVBFX0lOVEVHRVJfMTY6CisgICAgcmV0dXJuICJzaG9ydCI7CisgIGNhc2UgTUFDSF9NU0dfVFlQRV9JTlRFR0VSXzMyOgorICAgIHJldHVybiAibG9uZyI7CisgIGNhc2UgTUFDSF9NU0dfVFlQRV9DSEFSOgorICAgIHJldHVybiAiY2hhciI7CisgIGNhc2UgTUFDSF9NU0dfVFlQRV9CWVRFOgorICAgIHJldHVybiAiYnl0ZSI7CisgIGNhc2UgTUFDSF9NU0dfVFlQRV9SRUFMOgorICAgIHJldHVybiAicmVhbCI7CisgIGNhc2UgTUFDSF9NU0dfVFlQRV9TVFJJTkc6CisgICAgcmV0dXJuICJzdHJpbmciOworICBkZWZhdWx0OgorICAgIHNwcmludGYoYnVmLCIlZCIsbmFtZSk7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorfQorCitjaGFyICoKK2lkX3N0cihpZCxidWYpCisKK2ludAlpZDsKK2NoYXIJKmJ1ZjsKKworeworICBjaGFyCSpwOworICBpZiAoaWQgPj0gMTAxMDAwICYmIGlkIDwgMTAxMDAwK2JzZDFfbm5hbWVzKSB7CisgICAgaWYgKHAgPSBic2QxX25hbWVzW2lkLTEwMTAwMF0pCisgICAgICByZXR1cm4gcDsKKyAgfQorICBpZiAoaWQgPT0gMTAyMDAwKQorICAgIHJldHVybiAicHNpZ25hbF9yZXRyeSI7CisgIGlmIChpZCA9PSAxMDAwMDApCisgICAgcmV0dXJuICJzeXNjYWxsIjsKKyAgc3ByaW50ZihidWYsIiVkIixpZCk7CisgIHJldHVybiBidWY7Cit9CisKK3ByaW50X21zZyhtcCkKK21hY2hfbXNnX2hlYWRlcl90CSptcDsKK3sKKyAgY2hhcgkqZm10X3ggPSAiJTIwcyA6IDB4JTA4eFxuIjsKKyAgY2hhcgkqZm10X2QgPSAiJTIwcyA6ICUxMGRcbiI7CisgIGNoYXIJKmZtdF9zID0gIiUyMHMgOiAlc1xuIjsKKyAgY2hhcglidWZbMTAwXTsKKworICBwdXRzX2ZpbHRlcmVkICgiXG4iKTsKKyNkZWZpbmUgcHIoZm10LGgseCkgcHJpbnRmX2ZpbHRlcmVkKGZtdCxTVFIoeCksKGgpLngpCisgIHByKGZtdF94LCgqbXApLG1zZ2hfYml0cyk7CisgIHByKGZtdF9kLCgqbXApLG1zZ2hfc2l6ZSk7CisgIHByKGZtdF94LCgqbXApLG1zZ2hfcmVtb3RlX3BvcnQpOworICBwcihmbXRfeCwoKm1wKSxtc2doX2xvY2FsX3BvcnQpOworICBwcihmbXRfZCwoKm1wKSxtc2doX2tpbmQpOworICBwcmludGZfZmlsdGVyZWQoZm10X3MsU1RSKG1zZ2hfaWQpLGlkX3N0cihtcC0+bXNnaF9pZCxidWYpKTsKKyAgCisgIGlmIChkZWJ1Z19sZXZlbCA+IDEpCisgIHsKKyAgICBjaGFyCSpwLCplcCwqZHA7CisgICAgaW50CQlwbGVuOworICAgIHAgPSAoY2hhciopbXA7CisgICAgZXAgPSBwK21wLT5tc2doX3NpemU7CisgICAgcCArPSBzaXplb2YoKm1wKTsKKyAgICBmb3IoOyBwIDwgZXA7IHAgKz0gcGxlbikgeworICAgICAgbWFjaF9tc2dfdHlwZV90CSp0cDsKKyAgICAgIG1hY2hfbXNnX3R5cGVfbG9uZ190CSp0bHA7CisgICAgICBpbnQJbmFtZSxzaXplLG51bWJlcjsKKyAgICAgIHRwID0gKG1hY2hfbXNnX3R5cGVfdCopcDsKKyAgICAgIGlmICh0cC0+bXNndF9sb25nZm9ybSkgeworCXRscCA9IChtYWNoX21zZ190eXBlX2xvbmdfdCopdHA7CisJbmFtZSA9IHRscC0+bXNndGxfbmFtZTsKKwlzaXplID0gdGxwLT5tc2d0bF9zaXplOworCW51bWJlciA9IHRscC0+bXNndGxfbnVtYmVyOworCXBsZW4gPSBzaXplb2YoKnRscCk7CisgICAgICB9IGVsc2UgeworCW5hbWUgPSB0cC0+bXNndF9uYW1lOworCXNpemUgPSB0cC0+bXNndF9zaXplOworCW51bWJlciA9IHRwLT5tc2d0X251bWJlcjsKKwlwbGVuID0gc2l6ZW9mKCp0cCk7CisgICAgICB9CisgICAgICBwcmludGZfZmlsdGVyZWQoIm5hbWU9JS0xNnMgc2l6ZT0lMmQgbnVtYmVyPSU3ZCBpbmxpbmU9JWQgbG9uZz0lZCBkZWFsPSVkXG4iLAorCQkgICAgICBuYW1lX3N0cihuYW1lLGJ1Ziksc2l6ZSxudW1iZXIsdHAtPm1zZ3RfaW5saW5lLAorCQkgICAgICB0cC0+bXNndF9sb25nZm9ybSwgdHAtPm1zZ3RfZGVhbGxvY2F0ZSk7CisgICAgICBkcCA9IHArcGxlbjsKKyAgICAgIGlmICh0cC0+bXNndF9pbmxpbmUpIHsKKwlpbnQJbDsKKwlsID0gc2l6ZSpudW1iZXIvODsKKwlsID0gKGwrc2l6ZW9mKGxvbmcpLTEpJn4oKHNpemVvZihsb25nKSktMSk7CisJcGxlbiArPSBsOworCXByaW50X2RhdGEoZHAsc2l6ZSxudW1iZXIpOworICAgICAgfSBlbHNlIHsKKwlwbGVuICs9IHNpemVvZihpbnQqKTsKKyAgICAgIH0KKyAgICAgIHByaW50Zl9maWx0ZXJlZCgicGxlbj0lZFxuIixwbGVuKTsKKyAgICB9CisgIH0KK30KKworcHJpbnRfZGF0YShwLHNpemUsbnVtYmVyKQorCitjaGFyCSpwOworCit7CisgIGludAkqaXA7CisgIHNob3J0CSpzcDsKKyAgaW50CWk7CisKKyAgc3dpdGNoIChzaXplKSB7CisgIGNhc2UgODoKKyAgICBmb3IoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkKCIgJTAyeCIscFtpXSk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDE2OgorICAgIHNwID0gKHNob3J0KilwOworICAgIGZvcihpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7CisgICAgICBwcmludGZfZmlsdGVyZWQoIiAlMDR4IixzcFtpXSk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDMyOgorICAgIGlwID0gKGludCopcDsKKyAgICBmb3IoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkKCIgJTA4eCIsaXBbaV0pOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICBwdXRzX2ZpbHRlcmVkKCJcbiIpOworfQorI2VuZGlmICBEVU1QX1NZU0NBTEwKKworc3RhdGljIHZvaWQKK20zX3N0b3AgKCkKK3sKKyAgZXJyb3IgKCJ0b19zdG9wIHRhcmdldCBmdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsKK30KKworc3RhdGljIGNoYXIgKgorbTNfcGlkX3RvX2V4ZWNfZmlsZSAocGlkKQoraW50ICBwaWQ7Cit7CisgIGVycm9yICgidG9fcGlkX3RvX2V4ZWNfZmlsZSB0YXJnZXQgZnVuY3Rpb24gbm90IGltcGxlbWVudGVkIik7CisgIHJldHVybiBOVUxMOyAgLyogVG8ga2VlcCBhbGwgY29tcGlsZXJzIGhhcHB5LiAqLworfQorCitzdGF0aWMgdm9pZAoraW5pdF9tM19vcHMgKCkKK3sKKyAgbTNfb3BzLnRvX3Nob3J0bmFtZSA9ICJtYWNoIjsKKyAgbTNfb3BzLnRvX2xvbmduYW1lID0gIk1hY2ggY2hpbGQgcHJvY2VzcyI7CisgIG0zX29wcy50b19kb2MgPSAiTWFjaCBjaGlsZCBwcm9jZXNzIChzdGFydGVkIGJ5IHRoZSBcInJ1blwiIGNvbW1hbmQpLiI7CisgIG0zX29wcy50b19vcGVuID0gbTNfb3BlbjsKKyAgbTNfb3BzLnRvX2F0dGFjaCA9IG0zX2F0dGFjaDsKKyAgbTNfb3BzLnRvX2RldGFjaCA9IG0zX2RldGFjaDsKKyAgbTNfb3BzLnRvX3Jlc3VtZSA9IG0zX3Jlc3VtZTsKKyAgbTNfb3BzLnRvX3dhaXQgPSBtYWNoX3JlYWxseV9fd2FpdDsKKyAgbTNfb3BzLnRvX2ZldGNoX3JlZ2lzdGVycyA9IGZldGNoX2luZmVyaW9yX3JlZ2lzdGVyczsKKyAgbTNfb3BzLnRvX3N0b3JlX3JlZ2lzdGVycyA9IHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVyczsKKyAgbTNfb3BzLnRvX3ByZXBhcmVfdG9fc3RvcmUgPSBtM19wcmVwYXJlX3RvX3N0b3JlOworICBtM19vcHMudG9feGZlcl9tZW1vcnkgPSBtM194ZmVyX21lbW9yeTsKKyAgbTNfb3BzLnRvX2ZpbGVzX2luZm8gPSBtM19maWxlc19pbmZvOworICBtM19vcHMudG9faW5zZXJ0X2JyZWFrcG9pbnQgPSBtZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQ7CisgIG0zX29wcy50b19yZW1vdmVfYnJlYWtwb2ludCA9IG1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludDsKKyAgbTNfb3BzLnRvX3Rlcm1pbmFsX2luaXQgPSB0ZXJtaW5hbF9pbml0X2luZmVyaW9yOworICBtM19vcHMudG9fdGVybWluYWxfaW5mZXJpb3IgPSB0ZXJtaW5hbF9pbmZlcmlvcjsKKyAgbTNfb3BzLnRvX3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCA9IHRlcm1pbmFsX291cnNfZm9yX291dHB1dDsKKyAgbTNfb3BzLnRvX3Rlcm1pbmFsX291cnMgPSB0ZXJtaW5hbF9vdXJzOworICBtM19vcHMudG9fdGVybWluYWxfaW5mbyA9IGNoaWxkX3Rlcm1pbmFsX2luZm87CisgIG0zX29wcy50b19raWxsID0gbTNfa2lsbF9pbmZlcmlvcjsKKyAgbTNfb3BzLnRvX2NyZWF0ZV9pbmZlcmlvciA9IG0zX2NyZWF0ZV9pbmZlcmlvcjsKKyAgbTNfb3BzLnRvX21vdXJuX2luZmVyaW9yID0gbTNfbW91cm5faW5mZXJpb3I7CisgIG0zX29wcy50b19jYW5fcnVuID0gbTNfY2FuX3J1bjsKKyAgbTNfb3BzLnRvX3N0b3AgPSBtM19zdG9wOworICBtM19vcHMudG9fcGlkX3RvX2V4ZWNfZmlsZSA9IG0zX3BpZF90b19leGVjX2ZpbGU7CisgIG0zX29wcy50b19zdHJhdHVtID0gcHJvY2Vzc19zdHJhdHVtOworICBtM19vcHMudG9faGFzX2FsbF9tZW1vcnkgPSAxOworICBtM19vcHMudG9faGFzX21lbW9yeSA9IDE7CisgIG0zX29wcy50b19oYXNfc3RhY2sgPSAxOworICBtM19vcHMudG9faGFzX3JlZ2lzdGVycyA9IDE7CisgIG0zX29wcy50b19oYXNfZXhlY3V0aW9uID0gMTsKKyAgbTNfb3BzLnRvX21hZ2ljID0gT1BTX01BR0lDOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9tM19uYXQgKCkKK3sKKyAga2Vybl9yZXR1cm5fdCByZXQ7CisKKyAgaW5pdF9tM19vcHMgKCk7CisgIGFkZF90YXJnZXQgKCZtM19vcHMpOworCisgIHJldCA9IG1hY2hfcG9ydF9hbGxvY2F0ZShtYWNoX3Rhc2tfc2VsZigpLCAKKwkJCSAgIE1BQ0hfUE9SVF9SSUdIVF9QT1JUX1NFVCwKKwkJCSAgICZpbmZlcmlvcl93YWl0X3BvcnRfc2V0KTsKKyAgaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpCisgICAgZmF0YWwoImluaXRpYWwgcG9ydCBzZXQgJXMiLG1hY2hfZXJyb3Jfc3RyaW5nKHJldCkpOworCisgIC8qIG1hY2hfcmVhbGx5X3dhaXQgbm93IHdhaXRzIGZvciB0aGlzICovCisgIGN1cnJlbnRseV93YWl0aW5nX2ZvciA9IGluZmVyaW9yX3dhaXRfcG9ydF9zZXQ7CisKKyAgcmV0ID0gbmV0bmFtZV9sb29rX3VwKG5hbWVfc2VydmVyX3BvcnQsIGhvc3RuYW1lLCAiTWFjaElEIiwgJm1pZF9zZXJ2ZXIpOworICBpZiAocmV0ICE9IEtFUk5fU1VDQ0VTUykKKyAgICB7CisgICAgICBtaWRfc2VydmVyID0gTUFDSF9QT1JUX05VTEw7CisgICAgICAKKyAgICAgIHdhcm5pbmcgKCJpbml0aWFsaXplIG1hY2hpZDogbmV0bmFtZV9sb29rdXBfdXAoTWFjaElEKSA6ICVzIiwKKwkgICAgICAgbWFjaF9lcnJvcl9zdHJpbmcocmV0KSk7CisgICAgICB3YXJuaW5nICgiU29tZSAobW9zdD8pIGZlYXR1cmVzIGRpc2FibGVkLi4uIik7CisgICAgfQorICAKKyAgbWlkX2F1dGggPSBtYWNoX3ByaXZpbGVnZWRfaG9zdF9wb3J0KCk7CisgIGlmIChtaWRfYXV0aCA9PSBNQUNIX1BPUlRfTlVMTCkKKyAgICBtaWRfYXV0aCA9IG1hY2hfdGFza19zZWxmKCk7CisgIAorICBvYnN0YWNrX2luaXQgKHBvcnRfY2hhaW5fb2JzdGFjayk7CisKKyAgcmV0ID0gbWFjaF9wb3J0X2FsbG9jYXRlIChtYWNoX3Rhc2tfc2VsZiAoKSwgCisJCQkgICAgTUFDSF9QT1JUX1JJR0hUX1JFQ0VJVkUsCisJCQkgICAgJnRocmVhZF9leGNlcHRpb25fcG9ydCk7CisgIENISyAoIkNyZWF0aW5nIHRocmVhZF9leGNlcHRpb25fcG9ydCBmb3Igc2luZ2xlIHN0ZXBwaW5nIiwgcmV0KTsKKyAgCisgIHJldCA9IG1hY2hfcG9ydF9pbnNlcnRfcmlnaHQgKG1hY2hfdGFza19zZWxmICgpLAorCQkJCXRocmVhZF9leGNlcHRpb25fcG9ydCwKKwkJCQl0aHJlYWRfZXhjZXB0aW9uX3BvcnQsCisJCQkJTUFDSF9NU0dfVFlQRV9NQUtFX1NFTkQpOworICBDSEsgKCJJbnNlcnRpbmcgc2VuZCByaWdodCB0byB0aHJlYWRfZXhjZXB0aW9uX3BvcnQiLCByZXQpOworCisgIC8qIEFsbG9jYXRlIG1lc3NhZ2UgcG9ydCAqLworICByZXQgPSBtYWNoX3BvcnRfYWxsb2NhdGUgKG1hY2hfdGFza19zZWxmICgpLAorCQkJICAgIE1BQ0hfUE9SVF9SSUdIVF9SRUNFSVZFLAorCQkJICAgICZvdXJfbWVzc2FnZV9wb3J0KTsKKyAgaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpCisgICAgd2FybmluZyAoIkNyZWF0aW5nIG1lc3NhZ2UgcG9ydCAlcyIsIG1hY2hfZXJyb3Jfc3RyaW5nIChyZXQpKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgYnVmWyBNQVhfTkFNRV9MRU4gXTsKKyAgICAgIHJldCA9IG1hY2hfcG9ydF9tb3ZlX21lbWJlcihtYWNoX3Rhc2tfc2VsZiAoKSwKKwkJCQkgIG91cl9tZXNzYWdlX3BvcnQsCisJCQkJICBpbmZlcmlvcl93YWl0X3BvcnRfc2V0KTsKKyAgICAgIGlmIChyZXQgIT0gS0VSTl9TVUNDRVNTKQorCXdhcm5pbmcgKCJtZXNzYWdlIG1vdmUgbWVtYmVyICVzIiwgbWFjaF9lcnJvcl9zdHJpbmcgKHJldCkpOworCisKKyAgICAgIC8qIEBAQEAgTm8gd2F5IHRvIGNoYW5nZSBtZXNzYWdlIHBvcnQgbmFtZSBjdXJyZW50bHkgKi8KKyAgICAgIC8qIEZvby4gVGhpcyBhc3N1bWVzIGdkYiBoYXMgYSB1bml4IHBpZCAqLworICAgICAgc3ByaW50ZiAoYnVmLCAiZ2RiLSVkIiwgZ2V0cGlkICgpKTsKKyAgICAgIGdkYl9yZWdpc3Rlcl9wb3J0IChidWYsIG91cl9tZXNzYWdlX3BvcnQpOworICAgIH0KKyAgCisgIC8qIEhlYXAgZm9yIHRocmVhZCBjb21tYW5kcyAqLworICBvYnN0YWNrX2luaXQgKGNwcm9jX29ic3RhY2spOworCisgIGFkZF9tYWNoX3NwZWNpZmljX2NvbW1hbmRzICgpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL20zMnItcm9tLmMgYi9nZGIvbTMyci1yb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmU4MzNlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL20zMnItcm9tLmMKQEAgLTAsMCArMSw2NTAgQEAKKy8qIFJlbW90ZSBkZWJ1Z2dpbmcgaW50ZXJmYWNlIHRvIG0zMnIgYW5kIG1vbjIwMDAgUk9NIG1vbml0b3JzIGZvciBHREIsIAorICAgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBBZGFwdGVkIGJ5IE1pY2hhZWwgU255ZGVyIG9mIEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgbW9kdWxlIGRlZmluZXMgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBNaXRzdWJpc2hpIG0zMnIgbW9uaXRvciAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJtb25pdG9yLmgiCisjaW5jbHVkZSAic2VyaWFsLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIJLyogZm9yIGdlbmVyaWMgbG9hZCAqLworI2luY2x1ZGUgPHRpbWUuaD4JLyogZm9yIHRpbWVfdCAqLworI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJvYmpmaWxlcy5oIgkvKiBmb3IgQUxMX09CSkZJTEVTIGV0Yy4gKi8KKworCitleHRlcm4gdm9pZCByZXBvcnRfdHJhbnNmZXJfcGVyZm9ybWFuY2UgUEFSQU1TICgodW5zaWduZWQgbG9uZywgdGltZV90LCB0aW1lX3QpKTsKKworI2lmbmRlZiBfTVNDX1ZFUgorLyoKKyAqIEFsbCB0aGlzIHN0dWZmIGp1c3QgdG8gZ2V0IG15IGhvc3QgY29tcHV0ZXIncyBJUCBhZGRyZXNzIQorICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4JLyogZm9yIGhvc3RlbnQgKi8KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CS8qIGZvciBzdHJ1Y3QgaW5fYWRkciAqLworI2lmIDEKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4JLyogZm9yIGluZXRfbnRvYSAqLworI2VuZGlmCisjZW5kaWYKKworc3RhdGljIGNoYXIgKmJvYXJkX2FkZHI7CS8qIHVzZXItc2V0dGFibGUgSVAgYWRkcmVzcyBmb3IgTTMyUi1FVkEgKi8KK3N0YXRpYyBjaGFyICpzZXJ2ZXJfYWRkcjsJLyogdXNlci1zZXR0YWJsZSBJUCBhZGRyZXNzIGZvciBnZGIgaG9zdCAqLworc3RhdGljIGNoYXIgKmRvd25sb2FkX3BhdGg7CS8qIHVzZXItc2V0dGFibGUgcGF0aCBmb3IgU1JFQyBmaWxlcyAgICAgKi8KKworCisvKiAKKyAqIEZ1bmN0aW9uOiBtMzJyX2xvYWRfMSAoaGVscGVyIGZ1bmN0aW9uKQorICovCisKK3N0YXRpYyB2b2lkCittMzJyX2xvYWRfc2VjdGlvbiAoYWJmZCwgcywgZGF0YV9jb3VudCkKKyAgICAgYmZkICAgICAgKmFiZmQ7CisgICAgIGFzZWN0aW9uICpzOworICAgICB1bnNpZ25lZCBpbnQgKmRhdGFfY291bnQ7Cit7CisgIGlmIChzLT5mbGFncyAmIFNFQ19MT0FEKQorICAgIHsKKyAgICAgIGJmZF9zaXplX3R5cGUgc2VjdGlvbl9zaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcyk7CisgICAgICBiZmRfdm1hICAgICAgIHNlY3Rpb25fYmFzZSA9IGJmZF9zZWN0aW9uX2xtYSAgKGFiZmQsIHMpOworICAgICAgdW5zaWduZWQgaW50ICBidWZmZXIsIGk7CisKKyAgICAgICpkYXRhX2NvdW50ICs9IHNlY3Rpb25fc2l6ZTsKKworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiTG9hZGluZyBzZWN0aW9uICVzLCBzaXplIDB4JWx4IGxtYSAiLAorCQkgICAgICAgYmZkX3NlY3Rpb25fbmFtZSAoYWJmZCwgcyksIHNlY3Rpb25fc2l6ZSk7CisgICAgICBwcmludF9hZGRyZXNzX251bWVyaWMgKHNlY3Rpb25fYmFzZSwgMSwgZ2RiX3N0ZG91dCk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgICAgIG1vbml0b3JfcHJpbnRmICgiJXggbXdcciIgLCBzZWN0aW9uX2Jhc2UpOworICAgICAgZm9yIChpID0gMDsgaSA8IHNlY3Rpb25fc2l6ZTsgaSArPSA0KQorCXsKKwkgIFFVSVQ7CisJICBtb25pdG9yX2V4cGVjdCAoIiAtPiAiLCBOVUxMLCAwKTsKKwkgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgKGNoYXIgKikgJmJ1ZmZlciwgaSwgNCk7CisJICBtb25pdG9yX3ByaW50ZiAoIiV4XG4iLCBidWZmZXIpOworCX0KKyAgICAgIG1vbml0b3JfZXhwZWN0ICgiIC0+ICIsIE5VTEwsIDApOworICAgICAgbW9uaXRvcl9wcmludGYgKCJxXG4iKTsKKyAgICAgIG1vbml0b3JfZXhwZWN0X3Byb21wdCAoTlVMTCwgMCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IAorbTMycl9sb2FkXzEgKGR1bW15KQorICAgICB2b2lkICpkdW1teTsKK3sKKyAgaW50IGRhdGFfY291bnQgPSAwOworCisgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoKGJmZCAqKSBkdW1teSwgbTMycl9sb2FkX3NlY3Rpb24sICZkYXRhX2NvdW50KTsKKyAgcmV0dXJuIGRhdGFfY291bnQ7Cit9CisKKy8qIAorICogRnVuY3Rpb246IG0zMnJfbG9hZCAoYW4gYWx0ZXJuYXRlIHdheSB0byBsb2FkKSAKKyAqLworCitzdGF0aWMgdm9pZAorbTMycl9sb2FkIChmaWxlbmFtZSwgZnJvbV90dHkpIAorICAgIGNoYXIgKmZpbGVuYW1lOworICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZXh0ZXJuIGludCBpbmZlcmlvcl9waWQ7CisgIGJmZCAqYWJmZDsKKyAgYXNlY3Rpb24gKnM7CisgIHVuc2lnbmVkIGludCBpLCBkYXRhX2NvdW50ID0gMDsKKyAgdGltZV90IHN0YXJ0X3RpbWUsIGVuZF90aW1lOwkvKiBmb3IgdGltaW5nIG9mIGRvd25sb2FkICovCisKKyAgaWYgKGZpbGVuYW1lID09IE5VTEwgfHwgZmlsZW5hbWVbMF0gPT0gMCkKKyAgICBmaWxlbmFtZSA9IGdldF9leGVjX2ZpbGUgKDEpOworCisgIGFiZmQgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCAwKTsKKyAgaWYgKCFhYmZkKQorICAgIGVycm9yICgiVW5hYmxlIHRvIG9wZW4gZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkgPT0gMCkKKyAgICBlcnJvciAoIkZpbGUgaXMgbm90IGFuIG9iamVjdCBmaWxlXG4iKTsKKyAgc3RhcnRfdGltZSA9IHRpbWUgKE5VTEwpOworI2lmIDAKKyAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHM7IHMgPSBzLT5uZXh0KQorICAgIGlmIChzLT5mbGFncyAmIFNFQ19MT0FEKQorICAgICAgeworCWJmZF9zaXplX3R5cGUgc2VjdGlvbl9zaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcyk7CisJYmZkX3ZtYSAgICAgICBzZWN0aW9uX2Jhc2UgPSBiZmRfc2VjdGlvbl92bWEgIChhYmZkLCBzKTsKKwl1bnNpZ25lZCBpbnQgIGJ1ZmZlcjsKKworCWRhdGFfY291bnQgKz0gc2VjdGlvbl9zaXplOworCisJcHJpbnRmX2ZpbHRlcmVkICgiTG9hZGluZyBzZWN0aW9uICVzLCBzaXplIDB4JWx4IHZtYSAiLAorCQkJIGJmZF9zZWN0aW9uX25hbWUgKGFiZmQsIHMpLCBzZWN0aW9uX3NpemUpOworCXByaW50X2FkZHJlc3NfbnVtZXJpYyAoc2VjdGlvbl9iYXNlLCAxLCBnZGJfc3Rkb3V0KTsKKwlwcmludGZfZmlsdGVyZWQgKCJcbiIpOworIAlnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCW1vbml0b3JfcHJpbnRmICgiJXggbXdcciIgLCBzZWN0aW9uX2Jhc2UpOworCWZvciAoaSA9IDA7IGkgPCBzZWN0aW9uX3NpemU7IGkgKz0gNCkKKwkgIHsKKwkgICAgbW9uaXRvcl9leHBlY3QgKCIgLT4gIiwgTlVMTCwgMCk7CisJICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgKGNoYXIgKikgJmJ1ZmZlciwgaSwgNCk7CisJICAgIG1vbml0b3JfcHJpbnRmICgiJXhcbiIsIGJ1ZmZlcik7CisJICB9CisJbW9uaXRvcl9leHBlY3QgKCIgLT4gIiwgTlVMTCwgMCk7CisJbW9uaXRvcl9wcmludGYgKCJxXG4iKTsKKwltb25pdG9yX2V4cGVjdF9wcm9tcHQgKE5VTEwsIDApOworICAgICAgfQorI2Vsc2UKKyAgaWYgKCEoY2F0Y2hfZXJyb3JzIChtMzJyX2xvYWRfMSwgYWJmZCwgIkxvYWQgYWJvcnRlZCFcbiIsIFJFVFVSTl9NQVNLX0FMTCkpKQorICAgIHsKKyAgICAgIG1vbml0b3JfcHJpbnRmICgicVxuIik7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisgIGVuZF90aW1lID0gdGltZSAoTlVMTCk7CisgIHByaW50Zl9maWx0ZXJlZCAoIlN0YXJ0IGFkZHJlc3MgMHglbHhcbiIsIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkpOworICByZXBvcnRfdHJhbnNmZXJfcGVyZm9ybWFuY2UgKGRhdGFfY291bnQsIHN0YXJ0X3RpbWUsIGVuZF90aW1lKTsKKworICAvKiBGaW5hbGx5LCBtYWtlIHRoZSBQQyBwb2ludCBhdCB0aGUgc3RhcnQgYWRkcmVzcyAqLworICBpZiAoZXhlY19iZmQpCisgICAgd3JpdGVfcGMgKGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoZXhlY19iZmQpKTsKKworICBpbmZlcmlvcl9waWQgPSAwOyAgICAgICAgICAgICAvKiBObyBwcm9jZXNzIG5vdyAqLworCisgIC8qIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgbWFueSB0aGluZ3Mgd2VyZSBiYXNlZCBvbiB0aGUgUEMgYXQgdGhlCisgICAgIHRpbWUgdGhhdCB3ZSBhdHRhY2hlZCB0byB0aGUgbW9uaXRvciwgd2hpY2ggaXMgbm8gbG9uZ2VyIHZhbGlkCisgICAgIG5vdyB0aGF0IHdlIGhhdmUgbG9hZGVkIG5ldyBjb2RlIChhbmQganVzdCBjaGFuZ2VkIHRoZSBQQykuCisgICAgIEFub3RoZXIgd2F5IHRvIGRvIHRoaXMgbWlnaHQgYmUgdG8gY2FsbCBub3JtYWxfc3RvcCwgZXhjZXB0IHRoYXQKKyAgICAgdGhlIHN0YWNrIG1heSBub3QgYmUgdmFsaWQsIGFuZCB0aGluZ3Mgd291bGQgZ2V0IGhvcnJpYmx5CisgICAgIGNvbmZ1c2VkLi4uICovCisKKyAgY2xlYXJfc3ltdGFiX3VzZXJzICgpOworfQorCitzdGF0aWMgdm9pZAorbTMycl9sb2FkX2dlbiAoZmlsZW5hbWUsIGZyb21fdHR5KSAKKyAgICBjaGFyICpmaWxlbmFtZTsKKyAgICBpbnQgZnJvbV90dHk7Cit7CisgIGdlbmVyaWNfbG9hZCAoZmlsZW5hbWUsIGZyb21fdHR5KTsKK30KKworc3RhdGljIHZvaWQgbTMycl9vcGVuIFBBUkFNUyAoKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkpOworc3RhdGljIHZvaWQgbW9uMjAwMF9vcGVuIFBBUkFNUyAoKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkpOworCisvKiBUaGlzIGFycmF5IG9mIHJlZ2lzdGVycyBuZWVkcyB0byBtYXRjaCB0aGUgaW5kZXhlcyB1c2VkIGJ5IEdEQi4gVGhlCisgICB3aG9sZSByZWFzb24gdGhpcyBleGlzdHMgaXMgYmVjYXVzZSB0aGUgdmFyaW91cyBST00gbW9uaXRvcnMgdXNlCisgICBkaWZmZXJlbnQgbmFtZXMgdGhhbiBHREIgZG9lcywgYW5kIGRvbid0IHN1cHBvcnQgYWxsIHRoZSByZWdpc3RlcnMKKyAgIGVpdGhlci4gU28sIHR5cGluZyAiaW5mbyByZWcgc3AiIGJlY29tZXMgYW4gIkE3Ii4gKi8KKworc3RhdGljIGNoYXIgKm0zMnJfcmVnbmFtZXNbXSA9IAoreyAicjAiLCAgInIxIiwgICJyMiIsICAicjMiLCAgInI0IiwgICJyNSIsICAicjYiLCAgInI3IiwgCisgICJyOCIsICAicjkiLCAgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IiwgCisgICJwc3ciLCAiY2JyIiwgInNwaSIsICJzcHUiLCAiYnBjIiwgInBjIiwgICJhY2NsIiwgImFjY2giLCAKK307CisKK3N0YXRpYyB2b2lkCittMzJyX3N1cHBseV9yZWdpc3RlciAocmVnbmFtZSwgcmVnbmFtZWxlbiwgdmFsLCB2YWxsZW4pCisgICAgIGNoYXIgKnJlZ25hbWU7CisgICAgIGludCByZWduYW1lbGVuOworICAgICBjaGFyICp2YWw7CisgICAgIGludCB2YWxsZW47Cit7CisgIGludCByZWdubzsKKyAgaW50IG51bV9yZWdzID0gc2l6ZW9mKG0zMnJfcmVnbmFtZXMpIC8gc2l6ZW9mKG0zMnJfcmVnbmFtZXNbMF0pOworCisgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IG51bV9yZWdzOyByZWdubysrKQorICAgIGlmIChzdHJuY21wKHJlZ25hbWUsIG0zMnJfcmVnbmFtZXNbcmVnbm9dLCByZWduYW1lbGVuKSA9PSAwKQorICAgICAgYnJlYWs7CisKKyAgaWYgKHJlZ25vID49IG51bV9yZWdzKQorICAgIHJldHVybjsJCS8qIG5vIG1hdGNoICovCisKKyAgaWYgKHJlZ25vID09IEFDQ0xfUkVHTlVNKQorICAgIHsgLyogc3BlY2lhbCBoYW5kbGluZyBmb3IgNjQtYml0IGFjYyByZWcgKi8KKyAgICAgIG1vbml0b3Jfc3VwcGx5X3JlZ2lzdGVyIChBQ0NIX1JFR05VTSwgdmFsKTsKKyAgICAgIGlmICh2YWwgPSAoY2hhciAqKSBzdHJjaHIodmFsLCAnOicpKSAgLyogc2tpcCBwYXN0ICc6JyB0byBnZXQgMm5kIHdvcmQgKi8KKwltb25pdG9yX3N1cHBseV9yZWdpc3RlciAoQUNDTF9SRUdOVU0sIHZhbCArIDEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1vbml0b3Jfc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgdmFsKTsKKyAgICAgIGlmIChyZWdubyA9PSBQU1dfUkVHTlVNKQorCXsKKwkgIHVuc2lnbmVkIGxvbmcgcHN3ID0gc3RydG91bCAodmFsLCBOVUxMLCAxNik7CisJICBjaGFyICp6ZXJvID0gIjAwMDAwMDAwIiwgKm9uZSA9ICIwMDAwMDAwMSI7CisKKyNpZmRlZiBTTV9SRUdOVU0KKwkgIC8qIFN0YWNrIG1vZGUgYml0ICovCisJICBtb25pdG9yX3N1cHBseV9yZWdpc3RlciAoU01fUkVHTlVNLCAocHN3ICYgMHg4MCkgPyBvbmUgOiB6ZXJvKTsKKyNlbmRpZgorI2lmZGVmIEJTTV9SRUdOVU0KKwkgIC8qIEJhY2t1cCBzdGFjayBtb2RlIGJpdCAqLworCSAgbW9uaXRvcl9zdXBwbHlfcmVnaXN0ZXIgKEJTTV9SRUdOVU0sIChwc3cgJiAweDgwMDApID8gb25lIDogemVybyk7CisjZW5kaWYKKyNpZmRlZiBJRV9SRUdOVU0KKwkgIC8qIEludGVycnVwdCBlbmFibGUgYml0ICovCisJICBtb25pdG9yX3N1cHBseV9yZWdpc3RlciAoSUVfUkVHTlVNLCAocHN3ICYgMHg0MCkgPyBvbmUgOiB6ZXJvKTsKKyNlbmRpZgorI2lmZGVmIEJJRV9SRUdOVU0KKwkgIC8qIEJhY2t1cCBpbnRlcnJ1cHQgZW5hYmxlIGJpdCAqLworCSAgbW9uaXRvcl9zdXBwbHlfcmVnaXN0ZXIgKEJJRV9SRUdOVU0sIChwc3cgJiAweDQwMDApID8gb25lIDogemVybyk7CisjZW5kaWYKKyNpZmRlZiBDT05EX1JFR05VTQorCSAgLyogQ29uZGl0aW9uIGJpdCAoY2FycnkgZXRjLikgKi8KKwkgIG1vbml0b3Jfc3VwcGx5X3JlZ2lzdGVyIChDT05EX1JFR05VTSwgKHBzdyAmIDB4MSkgPyBvbmUgOiB6ZXJvKTsKKyNlbmRpZgorI2lmZGVmIENCUl9SRUdOVU0KKwkgIG1vbml0b3Jfc3VwcGx5X3JlZ2lzdGVyIChDQlJfUkVHTlVNLCAocHN3ICYgMHgxKSA/IG9uZSA6IHplcm8pOworI2VuZGlmCisjaWZkZWYgQlBDX1JFR05VTQorCSAgbW9uaXRvcl9zdXBwbHlfcmVnaXN0ZXIgKEJQQ19SRUdOVU0sIHplcm8pOyAvKiBLTFVER0U6ICAgKD8/Pz8/Pz8pICovCisjZW5kaWYKKyNpZmRlZiBCQ0FSUllfUkVHTlVNCisJICBtb25pdG9yX3N1cHBseV9yZWdpc3RlciAoQkNBUlJZX1JFR05VTSwgemVybyk7IC8qIEtMVURHRTogKD8/Pz8/PykgKi8KKyNlbmRpZgorCX0JICAKKworICAgICAgaWYgKHJlZ25vID09IFNQSV9SRUdOVU0gfHwgcmVnbm8gPT0gU1BVX1JFR05VTSkJCisJeyAvKiBzcGVjaWFsIGhhbmRsaW5nIGZvciBzdGFjayBwb2ludGVyIChzcHUgb3Igc3BpKSAqLworCSAgdW5zaWduZWQgbG9uZyBzdGFja21vZGUgPSByZWFkX3JlZ2lzdGVyIChQU1dfUkVHTlVNKSAmIDB4ODA7CisKKwkgIGlmIChyZWdubyA9PSBTUElfUkVHTlVNICYmICFzdGFja21vZGUpCS8qIFNQID09IFNQSSAqLworCSAgICBtb25pdG9yX3N1cHBseV9yZWdpc3RlciAoU1BfUkVHTlVNLCB2YWwpOworCSAgZWxzZSBpZiAocmVnbm8gPT0gU1BVX1JFR05VTSAmJiBzdGFja21vZGUpCS8qIFNQID09IFNQVSAqLworCSAgICBtb25pdG9yX3N1cHBseV9yZWdpc3RlciAoU1BfUkVHTlVNLCB2YWwpOworCX0KKyAgICB9Cit9CisKKy8qIG0zMnIgUmV2QyBib2FyZCBtb25pdG9yICovCisKK3N0YXRpYyBzdHJ1Y3QgdGFyZ2V0X29wcyBtMzJyX29wczsKKworc3RhdGljIGNoYXIgKm0zMnJfaW5pdHNbXSA9IHsiXHIiLCBOVUxMfTsKKworc3RhdGljIHN0cnVjdCBtb25pdG9yX29wcyBtMzJyX2NtZHMgOworCitzdGF0aWMgdm9pZCAKK2luaXRfbTMycl9jbWRzKHZvaWQpCit7CisgIG0zMnJfY21kcy5mbGFncyA9ICAgTU9fQ0xSX0JSRUFLX1VTRVNfQUREUiB8IE1PX1JFR0lTVEVSX1ZBTFVFX0ZJUlNUOworICBtMzJyX2NtZHMuaW5pdCA9ICAgbTMycl9pbml0czsJCS8qIEluaXQgc3RyaW5ncyAqLworICBtMzJyX2NtZHMuY29udCA9ICAgImdvXHIiOwkJCS8qIGNvbnRpbnVlIGNvbW1hbmQgKi8KKyAgbTMycl9jbWRzLnN0ZXAgPSAgICJzdGVwXHIiOwkJCS8qIHNpbmdsZSBzdGVwICovCisgIG0zMnJfY21kcy5zdG9wID0gICBOVUxMOwkJCS8qIGludGVycnVwdCBjb21tYW5kICovCisgIG0zMnJfY21kcy5zZXRfYnJlYWsgPSAgICIleCArYnBcciI7CQkvKiBzZXQgYSBicmVha3BvaW50ICovCisgIG0zMnJfY21kcy5jbHJfYnJlYWsgPSAgICIleCAtYnBcciI7CQkvKiBjbGVhciBhIGJyZWFrcG9pbnQgKi8KKyAgbTMycl9jbWRzLmNscl9hbGxfYnJlYWsgPSAgICJicG9mZlxyIjsJLyogY2xlYXIgYWxsIGJyZWFrcG9pbnRzICovCisgIG0zMnJfY21kcy5maWxsID0gICAiJXggJXggJXggZmlsbFxyIjsJCS8qIGZpbGwgKHN0YXJ0IGxlbmd0aCB2YWwpICovCisgIG0zMnJfY21kcy5zZXRtZW0uY21kYiA9ICAgICAiJXggMSAleCBmaWxsXHIiOwkvKiBzZXRtZW0uY21kYiAoYWRkciwgdmFsdWUpICovCisgIG0zMnJfY21kcy5zZXRtZW0uY21kdyA9ICAgICAiJXggMSAleCBmaWxsaFxyIjsvKiBzZXRtZW0uY21kdyAoYWRkciwgdmFsdWUpICovCisgIG0zMnJfY21kcy5zZXRtZW0uY21kbCA9ICAgICAiJXggMSAleCBmaWxsd1xyIjsvKiBzZXRtZW0uY21kbCAoYWRkciwgdmFsdWUpICovCisgIG0zMnJfY21kcy5zZXRtZW0uY21kbGwgPSAgICAgTlVMTDsJCS8qIHNldG1lbS5jbWRsbCAoYWRkciwgdmFsdWUpICovCisgIG0zMnJfY21kcy5zZXRtZW0ucmVzcF9kZWxpbSA9ICAgICBOVUxMOwkvKiBzZXRtZW0ucmVzcF9kZWxpbSAqLworICBtMzJyX2NtZHMuc2V0bWVtLnRlcm0gPSAgICAgTlVMTDsJCS8qIHNldG1lbS50ZXJtICovCisgIG0zMnJfY21kcy5zZXRtZW0udGVybV9jbWQgPSAgICAgTlVMTDsJCS8qIHNldG1lbS50ZXJtX2NtZCAqLworICBtMzJyX2NtZHMuZ2V0bWVtLmNtZGIgPSAgICAgIiV4ICV4IGR1bXBcciI7CS8qIGdldG1lbS5jbWRiIChhZGRyLCBsZW4pICovCisgIG0zMnJfY21kcy5nZXRtZW0uY21kdyA9ICAgICBOVUxMOwkJLyogZ2V0bWVtLmNtZHcgKGFkZHIsIGxlbikgKi8KKyAgbTMycl9jbWRzLmdldG1lbS5jbWRsID0gICAgIE5VTEw7CQkvKiBnZXRtZW0uY21kbCAoYWRkciwgbGVuKSAqLworICBtMzJyX2NtZHMuZ2V0bWVtLmNtZGxsID0gICAgIE5VTEw7CQkvKiBnZXRtZW0uY21kbGwgKGFkZHIsIGxlbikgKi8KKyAgbTMycl9jbWRzLmdldG1lbS5yZXNwX2RlbGltID0gICAgICI6ICI7CS8qIGdldG1lbS5yZXNwX2RlbGltICovCisgIG0zMnJfY21kcy5nZXRtZW0udGVybSA9ICAgICBOVUxMOwkJLyogZ2V0bWVtLnRlcm0gKi8KKyAgbTMycl9jbWRzLmdldG1lbS50ZXJtX2NtZCA9ICAgICBOVUxMCTsJLyogZ2V0bWVtLnRlcm1fY21kICovCisgIG0zMnJfY21kcy5zZXRyZWcuY21kID0gICAgICIleCB0byAlJSVzXHIiOwkvKiBzZXRyZWcuY21kIChuYW1lLCB2YWx1ZSkgKi8KKyAgbTMycl9jbWRzLnNldHJlZy5yZXNwX2RlbGltID0gICAgIE5VTEw7CS8qIHNldHJlZy5yZXNwX2RlbGltICovCisgIG0zMnJfY21kcy5zZXRyZWcudGVybSA9ICAgICBOVUxMOwkJLyogc2V0cmVnLnRlcm0gKi8KKyAgbTMycl9jbWRzLnNldHJlZy50ZXJtX2NtZCA9ICAgICBOVUxMCTsJLyogc2V0cmVnLnRlcm1fY21kICovCisgIG0zMnJfY21kcy5nZXRyZWcuY21kID0gICAgIE5VTEw7CQkvKiBnZXRyZWcuY21kIChuYW1lKSAqLworICBtMzJyX2NtZHMuZ2V0cmVnLnJlc3BfZGVsaW0gPSAgICAgTlVMTDsJLyogZ2V0cmVnLnJlc3BfZGVsaW0gKi8KKyAgbTMycl9jbWRzLmdldHJlZy50ZXJtID0gICAgIE5VTEw7CQkvKiBnZXRyZWcudGVybSAqLworICBtMzJyX2NtZHMuZ2V0cmVnLnRlcm1fY21kID0gICAgIE5VTEwJOwkvKiBnZXRyZWcudGVybV9jbWQgKi8KKyAgbTMycl9jbWRzLmR1bXBfcmVnaXN0ZXJzID0gICAiLnJlZ1xyIjsJLyogZHVtcF9yZWdpc3RlcnMgKi8KKyAgbTMycl9jbWRzLnJlZ2lzdGVyX3BhdHRlcm4gPSAgICJcXChcXHcrXFwpICs9IFxcKFswLTlhLWZBLUZdK1xcYlxcKSI7IC8qIHJlZ2lzdGVyX3BhdHRlcm4gKi8KKyAgbTMycl9jbWRzLnN1cHBseV9yZWdpc3RlciA9ICAgbTMycl9zdXBwbHlfcmVnaXN0ZXI7CS8qIHN1cHBseV9yZWdpc3RlciAqLworICBtMzJyX2NtZHMubG9hZF9yb3V0aW5lID0gICBOVUxMOwkJLyogbG9hZF9yb3V0aW5lIChkZWZhdWx0cyB0byBTUkVDcykgKi8KKyAgbTMycl9jbWRzLmxvYWQgPSAgIE5VTEw7CQkJLyogZG93bmxvYWQgY29tbWFuZCAqLworICBtMzJyX2NtZHMubG9hZHJlc3AgPSAgIE5VTEw7CQkJLyogbG9hZCByZXNwb25zZSAqLworICBtMzJyX2NtZHMucHJvbXB0ID0gICAib2sgIjsJCQkvKiBtb25pdG9yIGNvbW1hbmQgcHJvbXB0ICovCisgIG0zMnJfY21kcy5saW5lX3Rlcm0gPSAgICJcciI7CQkJLyogZW5kLW9mLWxpbmUgdGVybWluYXRvciAqLworICBtMzJyX2NtZHMuY21kX2VuZCA9ICAgTlVMTDsJCQkvKiBvcHRpb25hbCBjb21tYW5kIHRlcm1pbmF0b3IgKi8KKyAgbTMycl9jbWRzLnRhcmdldCA9ICAgJm0zMnJfb3BzOwkJLyogdGFyZ2V0IG9wZXJhdGlvbnMgKi8KKyAgbTMycl9jbWRzLnN0b3BiaXRzID0gICBTRVJJQUxfMV9TVE9QQklUUzsJLyogbnVtYmVyIG9mIHN0b3AgYml0cyAqLworICBtMzJyX2NtZHMucmVnbmFtZXMgPSAgIG0zMnJfcmVnbmFtZXM7CQkvKiByZWdpc3RlcnMgbmFtZXMgKi8KKyAgbTMycl9jbWRzLm1hZ2ljID0gICBNT05JVE9SX09QU19NQUdJQwk7CS8qIG1hZ2ljICovCit9IC8qIGluaXRfbTMycl9jbWRzICovCisKK3N0YXRpYyB2b2lkCittMzJyX29wZW4oYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgbW9uaXRvcl9vcGVuIChhcmdzLCAmbTMycl9jbWRzLCBmcm9tX3R0eSk7Cit9CisKKy8qIE1vbjIwMDAgbW9uaXRvciAoTVNBMjAwMCBib2FyZCkgKi8KKworc3RhdGljIHN0cnVjdCB0YXJnZXRfb3BzIG1vbjIwMDBfb3BzOworc3RhdGljIHN0cnVjdCBtb25pdG9yX29wcyBtb24yMDAwX2NtZHM7CisKK3N0YXRpYyB2b2lkIAoraW5pdF9tb24yMDAwX2NtZHModm9pZCkKK3sKKyAgbW9uMjAwMF9jbWRzLmZsYWdzID0gICBNT19DTFJfQlJFQUtfVVNFU19BRERSIHwgTU9fUkVHSVNURVJfVkFMVUVfRklSU1Q7CisgIG1vbjIwMDBfY21kcy5pbml0ID0gICBtMzJyX2luaXRzOwkJLyogSW5pdCBzdHJpbmdzICovCisgIG1vbjIwMDBfY21kcy5jb250ID0gICAiZ29cciI7CQkJLyogY29udGludWUgY29tbWFuZCAqLworICBtb24yMDAwX2NtZHMuc3RlcCA9ICAgInN0ZXBcciI7CQkJLyogc2luZ2xlIHN0ZXAgKi8KKyAgbW9uMjAwMF9jbWRzLnN0b3AgPSAgIE5VTEw7CQkJLyogaW50ZXJydXB0IGNvbW1hbmQgKi8KKyAgbW9uMjAwMF9jbWRzLnNldF9icmVhayA9ICAgIiV4ICticFxyIjsJCS8qIHNldCBhIGJyZWFrcG9pbnQgKi8KKyAgbW9uMjAwMF9jbWRzLmNscl9icmVhayA9ICAgIiV4IC1icFxyIjsJCS8qIGNsZWFyIGEgYnJlYWtwb2ludCAqLworICBtb24yMDAwX2NtZHMuY2xyX2FsbF9icmVhayA9ICAgImJwb2ZmXHIiOwkvKiBjbGVhciBhbGwgYnJlYWtwb2ludHMgKi8KKyAgbW9uMjAwMF9jbWRzLmZpbGwgPSAgICIleCAleCAleCBmaWxsXHIiOwkJLyogZmlsbCAoc3RhcnQgbGVuZ3RoIHZhbCkgKi8KKyAgbW9uMjAwMF9jbWRzLnNldG1lbS5jbWRiID0gICAgICIleCAxICV4IGZpbGxcciI7CS8qIHNldG1lbS5jbWRiIChhZGRyLCB2YWx1ZSkgKi8KKyAgbW9uMjAwMF9jbWRzLnNldG1lbS5jbWR3ID0gICAgICIleCAxICV4IGZpbGxoXHIiOy8qIHNldG1lbS5jbWR3IChhZGRyLCB2YWx1ZSkgKi8KKyAgbW9uMjAwMF9jbWRzLnNldG1lbS5jbWRsID0gICAgICIleCAxICV4IGZpbGx3XHIiOy8qIHNldG1lbS5jbWRsIChhZGRyLCB2YWx1ZSkgKi8KKyAgbW9uMjAwMF9jbWRzLnNldG1lbS5jbWRsbCA9ICAgICBOVUxMOwkJLyogc2V0bWVtLmNtZGxsIChhZGRyLCB2YWx1ZSkgKi8KKyAgbW9uMjAwMF9jbWRzLnNldG1lbS5yZXNwX2RlbGltID0gICAgIE5VTEw7CS8qIHNldG1lbS5yZXNwX2RlbGltICovCisgIG1vbjIwMDBfY21kcy5zZXRtZW0udGVybSA9ICAgICBOVUxMOwkJLyogc2V0bWVtLnRlcm0gKi8KKyAgbW9uMjAwMF9jbWRzLnNldG1lbS50ZXJtX2NtZCA9ICAgICBOVUxMOwkJLyogc2V0bWVtLnRlcm1fY21kICovCisgIG1vbjIwMDBfY21kcy5nZXRtZW0uY21kYiA9ICAgICAiJXggJXggZHVtcFxyIjsJLyogZ2V0bWVtLmNtZGIgKGFkZHIsIGxlbikgKi8KKyAgbW9uMjAwMF9jbWRzLmdldG1lbS5jbWR3ID0gICAgIE5VTEw7CQkvKiBnZXRtZW0uY21kdyAoYWRkciwgbGVuKSAqLworICBtb24yMDAwX2NtZHMuZ2V0bWVtLmNtZGwgPSAgICAgTlVMTDsJCS8qIGdldG1lbS5jbWRsIChhZGRyLCBsZW4pICovCisgIG1vbjIwMDBfY21kcy5nZXRtZW0uY21kbGwgPSAgICAgTlVMTDsJCS8qIGdldG1lbS5jbWRsbCAoYWRkciwgbGVuKSAqLworICBtb24yMDAwX2NtZHMuZ2V0bWVtLnJlc3BfZGVsaW0gPSAgICAgIjogIjsJLyogZ2V0bWVtLnJlc3BfZGVsaW0gKi8KKyAgbW9uMjAwMF9jbWRzLmdldG1lbS50ZXJtID0gICAgIE5VTEw7CQkvKiBnZXRtZW0udGVybSAqLworICBtb24yMDAwX2NtZHMuZ2V0bWVtLnRlcm1fY21kID0gICAgIE5VTEwJOwkvKiBnZXRtZW0udGVybV9jbWQgKi8KKyAgbW9uMjAwMF9jbWRzLnNldHJlZy5jbWQgPSAgICAgIiV4IHRvICUlJXNcciI7CS8qIHNldHJlZy5jbWQgKG5hbWUsIHZhbHVlKSAqLworICBtb24yMDAwX2NtZHMuc2V0cmVnLnJlc3BfZGVsaW0gPSAgICAgTlVMTDsJLyogc2V0cmVnLnJlc3BfZGVsaW0gKi8KKyAgbW9uMjAwMF9jbWRzLnNldHJlZy50ZXJtID0gICAgIE5VTEw7CQkvKiBzZXRyZWcudGVybSAqLworICBtb24yMDAwX2NtZHMuc2V0cmVnLnRlcm1fY21kID0gICAgIE5VTEwJOwkvKiBzZXRyZWcudGVybV9jbWQgKi8KKyAgbW9uMjAwMF9jbWRzLmdldHJlZy5jbWQgPSAgICAgTlVMTDsJCS8qIGdldHJlZy5jbWQgKG5hbWUpICovCisgIG1vbjIwMDBfY21kcy5nZXRyZWcucmVzcF9kZWxpbSA9ICAgICBOVUxMOwkvKiBnZXRyZWcucmVzcF9kZWxpbSAqLworICBtb24yMDAwX2NtZHMuZ2V0cmVnLnRlcm0gPSAgICAgTlVMTDsJCS8qIGdldHJlZy50ZXJtICovCisgIG1vbjIwMDBfY21kcy5nZXRyZWcudGVybV9jbWQgPSAgICAgTlVMTAk7CS8qIGdldHJlZy50ZXJtX2NtZCAqLworICBtb24yMDAwX2NtZHMuZHVtcF9yZWdpc3RlcnMgPSAgICIucmVnXHIiOwkvKiBkdW1wX3JlZ2lzdGVycyAqLworICBtb24yMDAwX2NtZHMucmVnaXN0ZXJfcGF0dGVybiA9ICAgIlxcKFxcdytcXCkgKz0gXFwoWzAtOWEtZkEtRl0rXFxiXFwpIjsgLyogcmVnaXN0ZXJfcGF0dGVybiAqLworICBtb24yMDAwX2NtZHMuc3VwcGx5X3JlZ2lzdGVyID0gICBtMzJyX3N1cHBseV9yZWdpc3RlcjsJLyogc3VwcGx5X3JlZ2lzdGVyICovCisgIG1vbjIwMDBfY21kcy5sb2FkX3JvdXRpbmUgPSAgIE5VTEw7CQkvKiBsb2FkX3JvdXRpbmUgKGRlZmF1bHRzIHRvIFNSRUNzKSAqLworICBtb24yMDAwX2NtZHMubG9hZCA9ICAgTlVMTDsJCQkvKiBkb3dubG9hZCBjb21tYW5kICovCisgIG1vbjIwMDBfY21kcy5sb2FkcmVzcCA9ICAgTlVMTDsJCQkvKiBsb2FkIHJlc3BvbnNlICovCisgIG1vbjIwMDBfY21kcy5wcm9tcHQgPSAgICJNb24yMDAwPiI7CQkJLyogbW9uaXRvciBjb21tYW5kIHByb21wdCAqLworICBtb24yMDAwX2NtZHMubGluZV90ZXJtID0gICAiXHIiOwkJCS8qIGVuZC1vZi1saW5lIHRlcm1pbmF0b3IgKi8KKyAgbW9uMjAwMF9jbWRzLmNtZF9lbmQgPSAgIE5VTEw7CQkJLyogb3B0aW9uYWwgY29tbWFuZCB0ZXJtaW5hdG9yICovCisgIG1vbjIwMDBfY21kcy50YXJnZXQgPSAgICZtb24yMDAwX29wczsJCS8qIHRhcmdldCBvcGVyYXRpb25zICovCisgIG1vbjIwMDBfY21kcy5zdG9wYml0cyA9ICAgU0VSSUFMXzFfU1RPUEJJVFM7CS8qIG51bWJlciBvZiBzdG9wIGJpdHMgKi8KKyAgbW9uMjAwMF9jbWRzLnJlZ25hbWVzID0gICBtMzJyX3JlZ25hbWVzOwkJLyogcmVnaXN0ZXJzIG5hbWVzICovCisgIG1vbjIwMDBfY21kcy5tYWdpYyA9ICAgTU9OSVRPUl9PUFNfTUFHSUMJOwkvKiBtYWdpYyAqLworfSAvKiBpbml0X21vbjIwMDBfY21kcyAqLworCitzdGF0aWMgdm9pZAorbW9uMjAwMF9vcGVuKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIG1vbml0b3Jfb3BlbiAoYXJncywgJm1vbjIwMDBfY21kcywgZnJvbV90dHkpOworfQorCisjaWZuZGVmIF9NU0NfVkVSCisKKy8qIEZ1bmN0aW9uOiBzZXRfYm9hcmRfYWRkcmVzcworICAgVGVsbCB0aGUgQm9vdE9uZSBtb25pdG9yIHdoYXQgaXQncyBldGhlcm5ldCBJUCBhZGRyZXNzIGlzLiAqLworCitzdGF0aWMgdm9pZAorbTMycl9zZXRfYm9hcmRfYWRkcmVzcyAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCAgZnJvbV90dHk7Cit7CisgIGludCByZXNwX2xlbjsKKyAgY2hhciBidWZbMTAyNF07CisKKyAgaWYgKGFyZ3MgJiYgKmFyZ3MpCisgICAgeworICAgICAgbW9uaXRvcl9wcmludGYgKCJ1bGlwICVzXG4iLCBhcmdzKTsKKyAgICAgIHJlc3BfbGVuID0gbW9uaXRvcl9leHBlY3RfcHJvbXB0IChidWYsIHNpemVvZihidWYpKTsKKyAgICAgIC8qIG5vdyBwYXJzZSB0aGUgcmVzdWx0IGZvciBzdWNjZXNzICovCisgICAgfQorICBlbHNlCisgICAgZXJyb3IgKCJSZXF1aXJlcyBhcmd1bWVudCAoSVAgYWRkcmVzcyBmb3IgTTMyUi1FVkEgYm9hcmQpIik7Cit9CisKKy8qIEZ1bmN0aW9uOiBzZXRfc2VydmVyX2FkZHJlc3MKKyAgIFRlbGwgdGhlIEJvb3RPbmUgbW9uaXRvciB3aGF0IGdkYidzIGV0aGVybmV0IElQIGFkZHJlc3MgaXMuICovCisKK3N0YXRpYyB2b2lkCittMzJyX3NldF9zZXJ2ZXJfYWRkcmVzcyAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCAgZnJvbV90dHk7Cit7CisgIGludCByZXNwX2xlbjsKKyAgY2hhciBidWZbMTAyNF07CisKKyAgaWYgKGFyZ3MgJiYgKmFyZ3MpCisgICAgeworICAgICAgbW9uaXRvcl9wcmludGYgKCJ1aGlwICVzXG4iLCBhcmdzKTsKKyAgICAgIHJlc3BfbGVuID0gbW9uaXRvcl9leHBlY3RfcHJvbXB0IChidWYsIHNpemVvZihidWYpKTsKKyAgICAgIC8qIG5vdyBwYXJzZSB0aGUgcmVzdWx0IGZvciBzdWNjZXNzICovCisgICAgfQorICBlbHNlCisgICAgZXJyb3IgKCJSZXF1aXJlcyBhcmd1bWVudCAoSVAgYWRkcmVzcyBvZiBHREIncyBob3N0IGNvbXB1dGVyKSIpOworfQorCisvKiBGdW5jdGlvbjogc2V0X2Rvd25sb2FkX3BhdGgKKyAgIFRlbGwgdGhlIEJvb3RPbmUgbW9uaXRvciB0aGUgZGVmYXVsdCBwYXRoIGZvciBkb3dubG9hZGFibGUgU1JFQyBmaWxlcy4gKi8KKworc3RhdGljIHZvaWQKK20zMnJfc2V0X2Rvd25sb2FkX3BhdGggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgIGZyb21fdHR5OworeworICBpbnQgcmVzcF9sZW47CisgIGNoYXIgYnVmWzEwMjRdOworCisgIGlmIChhcmdzICYmICphcmdzKQorICAgIHsKKyAgICAgIG1vbml0b3JfcHJpbnRmICgidXAgJXNcbiIsIGFyZ3MpOworICAgICAgcmVzcF9sZW4gPSBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgLyogbm93IHBhcnNlIHRoZSByZXN1bHQgZm9yIHN1Y2Nlc3MgKi8KKyAgICB9CisgIGVsc2UKKyAgICBlcnJvciAoIlJlcXVpcmVzIGFyZ3VtZW50IChkZWZhdWx0IHBhdGggZm9yIGRvd25sb2FkYWJsZSBTUkVDIGZpbGVzKSIpOworfQorCitzdGF0aWMgdm9pZAorbTMycl91cGxvYWRfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgYmZkICphYmZkOworICBhc2VjdGlvbiAqczsKKyAgdGltZV90IHN0YXJ0X3RpbWUsIGVuZF90aW1lOwkvKiBmb3IgdGltaW5nIG9mIGRvd25sb2FkICovCisgIGV4dGVybiBpbnQgaW5mZXJpb3JfcGlkOworICBpbnQgcmVzcF9sZW4sIGRhdGFfY291bnQgPSAwOworICBjaGFyIGJ1ZlsxMDI0XTsKKyAgc3RydWN0IGhvc3RlbnQgKmhvc3RlbnQ7CisgIHN0cnVjdCBpbl9hZGRyIGluZXRfYWRkcjsKKworICAvKiBmaXJzdCBjaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbiBldGhlcm5ldCBwb3J0ISAqLworICBtb25pdG9yX3ByaW50ZiAoInVzdFxyIik7CisgIHJlc3BfbGVuID0gbW9uaXRvcl9leHBlY3RfcHJvbXB0IChidWYsIHNpemVvZihidWYpKTsKKyAgaWYgKCFzdHJjaHIgKGJ1ZiwgJzonKSkKKyAgICBlcnJvciAoIk5vIGV0aGVybmV0IGNvbm5lY3Rpb24hIik7CisKKyAgaWYgKGJvYXJkX2FkZHIgPT0gMCkKKyAgICB7CisgICAgICAvKiBzY2FuIHNlY29uZCBjb2xvbiBpbiB0aGUgb3V0cHV0IGZyb20gdGhlICJ1c3QiIGNvbW1hbmQgKi8KKyAgICAgIGNoYXIgKiBteUlQYWRkcmVzcyA9IHN0cmNociAoc3RyY2hyIChidWYsICc6JykgKyAxLCAnOicpICsgMTsKKworICAgICAgd2hpbGUgKGlzc3BhY2UoKm15SVBhZGRyZXNzKSkKKwlteUlQYWRkcmVzcysrOworCisgICAgICBpZiAoIXN0cm5jbXAgKG15SVBhZGRyZXNzLCAiMC4wLiIsIDQpKSAgICAvKiBlbXB0eSAqLworCWVycm9yICgiUGxlYXNlIHVzZSAnc2V0IGJvYXJkLWFkZHJlc3MnIHRvIHNldCB0aGUgTTMyUi1FVkEgYm9hcmQncyBJUCBhZGRyZXNzLiIpOworICAgICAgaWYgKHN0cmNociAobXlJUGFkZHJlc3MsICcoJykpCisJKihzdHJjaHIgKG15SVBhZGRyZXNzLCAnKCcpKSA9ICdcMCc7ICAgIC8qIGRlbGV0ZSB0cmFpbGluZyBqdW5rICovCisgICAgICBib2FyZF9hZGRyID0gc3Ryc2F2ZSAobXlJUGFkZHJlc3MpOworICAgIH0KKyAgaWYgKHNlcnZlcl9hZGRyID09IDApCisgICAgeworICAgICAgYnVmWzBdID0gMDsKKyAgICAgIGdldGhvc3RuYW1lIChidWYsIHNpemVvZihidWYpKTsKKyAgICAgIGlmIChidWZbMF0gIT0gMCkKKwlob3N0ZW50ID0gZ2V0aG9zdGJ5bmFtZSAoYnVmKTsKKyAgICAgIGlmIChob3N0ZW50ICE9IDApCisJeworI2lmIDEKKwkgIG1lbWNweSAoJmluZXRfYWRkci5zX2FkZHIsIGhvc3RlbnQtPmhfYWRkciwgCisJCSAgc2l6ZW9mKGluZXRfYWRkci5zX2FkZHIpKTsKKwkgIHNlcnZlcl9hZGRyID0gKGNoYXIgKikgaW5ldF9udG9hIChpbmV0X2FkZHIpOworI2Vsc2UKKwkgIHNlcnZlcl9hZGRyID0gKGNoYXIgKikgaW5ldF9udG9hIChob3N0ZW50LT5oX2FkZHIpOworI2VuZGlmCisJfQorICAgICAgaWYgKHNlcnZlcl9hZGRyID09IDApCS8qIGZhaWxlZD8gKi8KKwllcnJvciAoIk5lZWQgdG8ga25vdyBnZGIgaG9zdCBjb21wdXRlcidzIElQIGFkZHJlc3MgKHVzZSAnc2V0IHNlcnZlci1hZGRyZXNzJykiKTsKKyAgICB9CisKKyAgaWYgKGFyZ3MgPT0gMCB8fCBhcmdzWzBdID09IDApCS8qIG5vIGFyZ3M6IHVwbG9hZCB0aGUgY3VycmVudCBmaWxlICovCisgICAgYXJncyA9IGdldF9leGVjX2ZpbGUgKDEpOworCisgIGlmIChhcmdzWzBdICE9ICcvJyAmJiBkb3dubG9hZF9wYXRoID09IDApCisgICAgaWYgKGN1cnJlbnRfZGlyZWN0b3J5KQorICAgICAgZG93bmxvYWRfcGF0aCA9IHN0cnNhdmUgKGN1cnJlbnRfZGlyZWN0b3J5KTsKKyAgICBlbHNlCisgICAgICBlcnJvciAoIk5lZWQgdG8ga25vdyBkZWZhdWx0IGRvd25sb2FkIHBhdGggKHVzZSAnc2V0IGRvd25sb2FkLXBhdGgnKSIpOworCisgIHN0YXJ0X3RpbWUgPSB0aW1lIChOVUxMKTsKKyAgbW9uaXRvcl9wcmludGYgKCJ1aGlwICVzXHIiLCBzZXJ2ZXJfYWRkcik7CisgIHJlc3BfbGVuID0gbW9uaXRvcl9leHBlY3RfcHJvbXB0IChidWYsIHNpemVvZihidWYpKTsgIC8qIHBhcnNlIHJlc3VsdD8gKi8KKyAgbW9uaXRvcl9wcmludGYgKCJ1bGlwICVzXHIiLCBib2FyZF9hZGRyKTsKKyAgcmVzcF9sZW4gPSBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKGJ1Ziwgc2l6ZW9mKGJ1ZikpOyAgLyogcGFyc2UgcmVzdWx0PyAqLworICBpZiAoYXJnc1swXSAhPSAnLycpCisgICAgbW9uaXRvcl9wcmludGYgKCJ1cCAlc1xyIiwgZG93bmxvYWRfcGF0aCk7CS8qIHVzZSBkZWZhdWx0IHBhdGggKi8KKyAgZWxzZQorICAgIG1vbml0b3JfcHJpbnRmICgidXBcciIpOwkJCS8qIHJvb3RlZCBmaWxlbmFtZS9wYXRoICovCisgIHJlc3BfbGVuID0gbW9uaXRvcl9leHBlY3RfcHJvbXB0IChidWYsIHNpemVvZihidWYpKTsgIC8qIHBhcnNlIHJlc3VsdD8gKi8KKworICBpZiAoc3RycmNociAoYXJncywgJy4nKSAmJiAhc3RyY21wIChzdHJyY2hyIChhcmdzLCAnLicpLCAiLnNyZWMiKSkKKyAgICBtb25pdG9yX3ByaW50ZiAoInVsICVzXHIiLCBhcmdzKTsKKyAgZWxzZQkJCQkJLyogYWRkICIuc3JlYyIgc3VmZml4ICovCisgICAgbW9uaXRvcl9wcmludGYgKCJ1bCAlcy5zcmVjXHIiLCBhcmdzKTsKKyAgcmVzcF9sZW4gPSBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKGJ1Ziwgc2l6ZW9mKGJ1ZikpOyAgLyogcGFyc2UgcmVzdWx0PyAqLworCisgIGlmIChidWZbMF0gPT0gMCB8fCBzdHJzdHIoYnVmLCAiY29tcGxldGUiKSA9PSAwKQorICAgIGVycm9yKCJVcGxvYWQgZmlsZSBub3QgZm91bmQ6ICVzLnNyZWNcbkNoZWNrIElQIGFkZHJlc3NlcyBhbmQgZG93bmxvYWQgcGF0aC4iLCBhcmdzKTsKKyAgZWxzZQorICAgIHByaW50Zl9maWx0ZXJlZCAoIiAtLSBFdGhlcm5ldCBsb2FkIGNvbXBsZXRlLlxuIik7CisKKyAgZW5kX3RpbWUgPSB0aW1lIChOVUxMKTsKKyAgaWYgKGFiZmQgPSBiZmRfb3BlbnIgKGFyZ3MsIDApKQorICAgIHsgLyogRG93bmxvYWQgaXMgZG9uZSAtLSBwcmludCBzZWN0aW9uIHN0YXRpc3RpY3MgKi8KKyAgICAgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSA9PSAwKQorCXsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIkZpbGUgaXMgbm90IGFuIG9iamVjdCBmaWxlXG4iKTsKKwl9CisgICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCisJaWYgKHMtPmZsYWdzICYgU0VDX0xPQUQpCisJICB7CisJICAgIGJmZF9zaXplX3R5cGUgc2VjdGlvbl9zaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcyk7CisJICAgIGJmZF92bWEgICAgICAgc2VjdGlvbl9iYXNlID0gYmZkX3NlY3Rpb25fbG1hICAoYWJmZCwgcyk7CisJICAgIHVuc2lnbmVkIGludCAgYnVmZmVyOworCisJICAgIGRhdGFfY291bnQgKz0gc2VjdGlvbl9zaXplOworCisJICAgIHByaW50Zl9maWx0ZXJlZCAoIkxvYWRpbmcgc2VjdGlvbiAlcywgc2l6ZSAweCVseCBsbWEgIiwKKwkJCSAgICAgYmZkX3NlY3Rpb25fbmFtZSAoYWJmZCwgcyksIHNlY3Rpb25fc2l6ZSk7CisJICAgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoc2VjdGlvbl9iYXNlLCAxLCBnZGJfc3Rkb3V0KTsKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKwkgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwkgIH0KKyAgICAgIC8qIEZpbmFsbHksIG1ha2UgdGhlIFBDIHBvaW50IGF0IHRoZSBzdGFydCBhZGRyZXNzICovCisgICAgICB3cml0ZV9wYyAoYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSk7CisgICAgICByZXBvcnRfdHJhbnNmZXJfcGVyZm9ybWFuY2UgKGRhdGFfY291bnQsIHN0YXJ0X3RpbWUsIGVuZF90aW1lKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlN0YXJ0IGFkZHJlc3MgMHglbHhcbiIsIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkpOworICAgIH0KKyAgaW5mZXJpb3JfcGlkID0gMDsgICAgICAgICAgICAgLyogTm8gcHJvY2VzcyBub3cgKi8KKworICAvKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG1hbnkgdGhpbmdzIHdlcmUgYmFzZWQgb24gdGhlIFBDIGF0IHRoZQorICAgICB0aW1lIHRoYXQgd2UgYXR0YWNoZWQgdG8gdGhlIG1vbml0b3IsIHdoaWNoIGlzIG5vIGxvbmdlciB2YWxpZAorICAgICBub3cgdGhhdCB3ZSBoYXZlIGxvYWRlZCBuZXcgY29kZSAoYW5kIGp1c3QgY2hhbmdlZCB0aGUgUEMpLgorICAgICBBbm90aGVyIHdheSB0byBkbyB0aGlzIG1pZ2h0IGJlIHRvIGNhbGwgbm9ybWFsX3N0b3AsIGV4Y2VwdCB0aGF0CisgICAgIHRoZSBzdGFjayBtYXkgbm90IGJlIHZhbGlkLCBhbmQgdGhpbmdzIHdvdWxkIGdldCBob3JyaWJseQorICAgICBjb25mdXNlZC4uLiAqLworCisgIGNsZWFyX3N5bXRhYl91c2VycyAoKTsKK30KKworI2VuZGlmIC8qICEgX01TQ19WRVIgKi8KKwordm9pZAorX2luaXRpYWxpemVfbTMycl9yb20gKCkKK3sKKyAgLyogSW5pdGlhbGl6ZSBtMzJyIFJldkMgbW9uaXRvciB0YXJnZXQgKi8KKyAgaW5pdF9tMzJyX2NtZHMgKCkgOworICBpbml0X21vbml0b3Jfb3BzICgmbTMycl9vcHMpOworCisgIG0zMnJfb3BzLnRvX3Nob3J0bmFtZSA9ICJtMzJyIjsKKyAgbTMycl9vcHMudG9fbG9uZ25hbWUgPSAibTMyciBtb25pdG9yIjsKKyAgbTMycl9vcHMudG9fbG9hZCA9IG0zMnJfbG9hZF9nZW47CS8qIG1vbml0b3IgbGFja3MgYSBkb3dubG9hZCBjb21tYW5kICovCisgIG0zMnJfb3BzLnRvX2RvYyA9ICJEZWJ1ZyB2aWEgdGhlIG0zMnIgbW9uaXRvci5cblwKK1NwZWNpZnkgdGhlIHNlcmlhbCBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvIChlLmcuIC9kZXYvdHR5YSkuIjsKKyAgbTMycl9vcHMudG9fb3BlbiA9IG0zMnJfb3BlbjsKKyAgYWRkX3RhcmdldCAoJm0zMnJfb3BzKTsKKworICAvKiBJbml0aWFsaXplIG1vbjIwMDAgbW9uaXRvciB0YXJnZXQgKi8KKyAgaW5pdF9tb24yMDAwX2NtZHMgKCk7CisgIGluaXRfbW9uaXRvcl9vcHMgKCZtb24yMDAwX29wcyk7CisKKyAgbW9uMjAwMF9vcHMudG9fc2hvcnRuYW1lID0gIm1vbjIwMDAiOworICBtb24yMDAwX29wcy50b19sb25nbmFtZSA9ICJNb24yMDAwIG1vbml0b3IiOworICBtb24yMDAwX29wcy50b19sb2FkID0gbTMycl9sb2FkX2dlbjsJLyogbW9uaXRvciBsYWNrcyBhIGRvd25sb2FkIGNvbW1hbmQgKi8KKyAgbW9uMjAwMF9vcHMudG9fZG9jID0gIkRlYnVnIHZpYSB0aGUgTW9uMjAwMCBtb25pdG9yLlxuXAorU3BlY2lmeSB0aGUgc2VyaWFsIGRldmljZSBpdCBpcyBjb25uZWN0ZWQgdG8gKGUuZy4gL2Rldi90dHlhKS4iOworICBtb24yMDAwX29wcy50b19vcGVuID0gbW9uMjAwMF9vcGVuOworICBhZGRfdGFyZ2V0ICgmbW9uMjAwMF9vcHMpOworCisjaWZuZGVmIF9NU0NfVkVSCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgiZG93bmxvYWQtcGF0aCIsIGNsYXNzX29ic2N1cmUsIHZhcl9zdHJpbmcsCisJCSAgKGNoYXIgKikgJmRvd25sb2FkX3BhdGgsCisJCSAgIlNldCB0aGUgZGVmYXVsdCBwYXRoIGZvciBkb3dubG9hZGFibGUgU1JFQyBmaWxlcy4iLAorCQkgICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoImJvYXJkLWFkZHJlc3MiLCBjbGFzc19vYnNjdXJlLCB2YXJfc3RyaW5nLAorCQkgIChjaGFyICopICZib2FyZF9hZGRyLAorCQkgICJTZXQgSVAgYWRkcmVzcyBmb3IgTTMyUi1FVkEgdGFyZ2V0IGJvYXJkLiIsCisJCSAgJnNldGxpc3QpLAorICAgICAmc2hvd2xpc3QpOworCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgic2VydmVyLWFkZHJlc3MiLCBjbGFzc19vYnNjdXJlLCB2YXJfc3RyaW5nLAorCQkgIChjaGFyICopICZzZXJ2ZXJfYWRkciwKKwkJICAiU2V0IElQIGFkZHJlc3MgZm9yIGRvd25sb2FkIHNlcnZlciAoR0RCJ3MgaG9zdCBjb21wdXRlcikuIiwKKwkJICAmc2V0bGlzdCksCisgICAgICZzaG93bGlzdCk7CisKKyAgYWRkX2NvbSAoInVwbG9hZCIsIGNsYXNzX29ic2N1cmUsIG0zMnJfdXBsb2FkX2NvbW1hbmQsCisJICAgIlVwbG9hZCB0aGUgc3JlYyBmaWxlIHZpYSB0aGUgbW9uaXRvcidzIEV0aGVybmV0IHVwbG9hZCBjYXBhYmlsaXR5LiIpOyAKKworICBhZGRfY29tICgidGxvYWQiLCBjbGFzc19vYnNjdXJlLCBtMzJyX2xvYWQsICJ0ZXN0IHVwbG9hZCBjb21tYW5kLiIpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9nZGIvbTMyci1zdHViLmMgYi9nZGIvbTMyci1zdHViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjODI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9tMzJyLXN0dWIuYwpAQCAtMCwwICsxLDE2ODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwkJVEhJUyBTT0ZUV0FSRSBJUyBOT1QgQ09QWVJJR0hURUQKKworICAgSFAgb2ZmZXJzIHRoZSBmb2xsb3dpbmcgZm9yIHVzZSBpbiB0aGUgcHVibGljIGRvbWFpbi4gIEhQIG1ha2VzIG5vCisgICB3YXJyYW50eSB3aXRoIHJlZ2FyZCB0byB0aGUgc29mdHdhcmUgb3IgaXQncyBwZXJmb3JtYW5jZSBhbmQgdGhlCisgICB1c2VyIGFjY2VwdHMgdGhlIHNvZnR3YXJlICJBUyBJUyIgd2l0aCBhbGwgZmF1bHRzLgorCisgICBIUCBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgV0lUSCBSRUdBUkQKKyAgIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBIZWFkZXI6IHJlbWNvbS5jLHYgMS4zNCA5MS8wMy8wOSAxMjoyOTo0OSBnbGVubmUgRXhwICQKKyAqCisgKiAgTW9kdWxlIG5hbWU6IHJlbWNvbS5jICQKKyAqICBSZXZpc2lvbjogMS4zNCAkCisgKiAgRGF0ZTogOTEvMDMvMDkgMTI6Mjk6NDkgJAorICogIENvbnRyaWJ1dG9yOiAgICAgTGFrZSBTdGV2ZW5zIEluc3RydW1lbnQgRGl2aXNpb24kCisgKgorICogIERlc2NyaXB0aW9uOiAgICAgbG93IGxldmVsIHN1cHBvcnQgZm9yIGdkYiBkZWJ1Z2dlci4gJAorICoKKyAqICBDb25zaWRlcmF0aW9uczogIG9ubHkgd29ya3Mgb24gdGFyZ2V0IGhhcmR3YXJlICQKKyAqCisgKiAgV3JpdHRlbiBieTogICAgICBHbGVubiBFbmdlbCAkCisgKiAgTW9kdWxlU3RhdGU6ICAgICBFeHBlcmltZW50YWwgJAorICoKKyAqICBOT1RFUzogICAgICAgICAgIFNlZSBCZWxvdyAkCisgKgorICogIE1vZGlmaWVkIGZvciBNMzJSIGJ5IE1pY2hhZWwgU255ZGVyLCBDeWdudXMgU3VwcG9ydC4KKyAqCisgKiAgVG8gZW5hYmxlIGRlYnVnZ2VyIHN1cHBvcnQsIHR3byB0aGluZ3MgbmVlZCB0byBoYXBwZW4uICBPbmUsIGEKKyAqICBjYWxsIHRvIHNldF9kZWJ1Z190cmFwcygpIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBhbGxvdyBhbnkgYnJlYWtwb2ludHMKKyAqICBvciBlcnJvciBjb25kaXRpb25zIHRvIGJlIHByb3Blcmx5IGludGVyY2VwdGVkIGFuZCByZXBvcnRlZCB0byBnZGIuCisgKiAgVHdvLCBhIGJyZWFrcG9pbnQgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkIHRvIGJlZ2luIGNvbW11bmljYXRpb24uICBUaGlzCisgKiAgaXMgbW9zdCBlYXNpbHkgYWNjb21wbGlzaGVkIGJ5IGEgY2FsbCB0byBicmVha3BvaW50KCkuICBCcmVha3BvaW50KCkKKyAqICBzaW11bGF0ZXMgYSBicmVha3BvaW50IGJ5IGV4ZWN1dGluZyBhIHRyYXAgIzEuCisgKgorICogIFRoZSBleHRlcm5hbCBmdW5jdGlvbiBleGNlcHRpb25IYW5kbGVyKCkgaXMKKyAqICB1c2VkIHRvIGF0dGFjaCBhIHNwZWNpZmljIGhhbmRsZXIgdG8gYSBzcGVjaWZpYyBNMzJSIHZlY3RvciBudW1iZXIuCisgKiAgSXQgc2hvdWxkIHVzZSB0aGUgc2FtZSBwcml2aWxlZ2UgbGV2ZWwgaXQgcnVucyBhdC4gIEl0IHNob3VsZAorICogIGluc3RhbGwgaXQgYXMgYW4gaW50ZXJydXB0IGdhdGUgc28gdGhhdCBpbnRlcnJ1cHRzIGFyZSBtYXNrZWQKKyAqICB3aGlsZSB0aGUgaGFuZGxlciBydW5zLgorICoKKyAqICBCZWNhdXNlIGdkYiB3aWxsIHNvbWV0aW1lcyB3cml0ZSB0byB0aGUgc3RhY2sgYXJlYSB0byBleGVjdXRlIGZ1bmN0aW9uCisgKiAgY2FsbHMsIHRoaXMgcHJvZ3JhbSBjYW5ub3QgcmVseSBvbiB1c2luZyB0aGUgc3VwZXJ2aXNvciBzdGFjayBzbyBpdAorICogIHVzZXMgaXQncyBvd24gc3RhY2sgYXJlYSByZXNlcnZlZCBpbiB0aGUgaW50IGFycmF5IHJlbWNvbVN0YWNrLgorICoKKyAqKioqKioqKioqKioqCisgKgorICogICAgVGhlIGZvbGxvd2luZyBnZGIgY29tbWFuZHMgYXJlIHN1cHBvcnRlZDoKKyAqCisgKiBjb21tYW5kICAgICAgICAgIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybiB2YWx1ZQorICoKKyAqICAgIGcgICAgICAgICAgICAgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgQ1BVIHJlZ2lzdGVycyAgaGV4IGRhdGEgb3IgRU5OCisgKiAgICBHICAgICAgICAgICAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIENQVSByZWdpc3RlcnMgICAgIE9LIG9yIEVOTgorICoKKyAqICAgIG1BQS4uQUEsTExMTCAgUmVhZCBMTExMIGJ5dGVzIGF0IGFkZHJlc3MgQUEuLkFBICAgICAgaGV4IGRhdGEgb3IgRU5OCisgKiAgICBNQUEuLkFBLExMTEw6IFdyaXRlIExMTEwgYnl0ZXMgYXQgYWRkcmVzcyBBQS5BQSAgICAgIE9LIG9yIEVOTgorICogICAgWEFBLi5BQSxMTExMOiBXcml0ZSBMTExMIGJpbmFyeSBieXRlcyBhdCBhZGRyZXNzICAgICBPSyBvciBFTk4KKyAqICAgICAgICAgICAgICAgICAgQUEuLkFBCisgKgorICogICAgYyAgICAgICAgICAgICBSZXN1bWUgYXQgY3VycmVudCBhZGRyZXNzICAgICAgICAgICAgICBTTk4gICAoIHNpZ25hbCBOTikKKyAqICAgIGNBQS4uQUEgICAgICAgQ29udGludWUgYXQgYWRkcmVzcyBBQS4uQUEgICAgICAgICAgICAgU05OCisgKgorICogICAgcyAgICAgICAgICAgICBTdGVwIG9uZSBpbnN0cnVjdGlvbiAgICAgICAgICAgICAgICAgICBTTk4KKyAqICAgIHNBQS4uQUEgICAgICAgU3RlcCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBBQS4uQUEgICAgICAgU05OCisgKgorICogICAgayAgICAgICAgICAgICBraWxsCisgKgorICogICAgPyAgICAgICAgICAgICBXaGF0IHdhcyB0aGUgbGFzdCBzaWd2YWwgPyAgICAgICAgICAgICBTTk4gICAoc2lnbmFsIE5OKQorICoKKyAqIEFsbCBjb21tYW5kcyBhbmQgcmVzcG9uc2VzIGFyZSBzZW50IHdpdGggYSBwYWNrZXQgd2hpY2ggaW5jbHVkZXMgYQorICogY2hlY2tzdW0uICBBIHBhY2tldCBjb25zaXN0cyBvZgorICoKKyAqICQ8cGFja2V0IGluZm8+IzxjaGVja3N1bT4uCisgKgorICogd2hlcmUKKyAqIDxwYWNrZXQgaW5mbz4gOjogPGNoYXJhY3RlcnMgcmVwcmVzZW50aW5nIHRoZSBjb21tYW5kIG9yIHJlc3BvbnNlPgorICogPGNoZWNrc3VtPiAgICA6OiA8dHdvIGhleCBkaWdpdHMgY29tcHV0ZWQgYXMgbW9kdWxvIDI1NiBzdW0gb2YgPHBhY2tldGluZm8+PgorICoKKyAqIFdoZW4gYSBwYWNrZXQgaXMgcmVjZWl2ZWQsIGl0IGlzIGZpcnN0IGFja25vd2xlZGdlZCB3aXRoIGVpdGhlciAnKycgb3IgJy0nLgorICogJysnIGluZGljYXRlcyBhIHN1Y2Nlc3NmdWwgdHJhbnNmZXIuICAnLScgaW5kaWNhdGVzIGEgZmFpbGVkIHRyYW5zZmVyLgorICoKKyAqIEV4YW1wbGU6CisgKgorICogSG9zdDogICAgICAgICAgICAgICAgICBSZXBseToKKyAqICRtMCwxMCMyYSAgICAgICAgICAgICAgICskMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUjNDIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZXh0ZXJuYWwgbG93LWxldmVsIHN1cHBvcnQgcm91dGluZXMKKyAqLworZXh0ZXJuIHZvaWQgcHV0RGVidWdDaGFyKCk7CS8qIHdyaXRlIGEgc2luZ2xlIGNoYXJhY3RlciAgICAgICovCitleHRlcm4gaW50IGdldERlYnVnQ2hhcigpOwkvKiByZWFkIGFuZCByZXR1cm4gYSBzaW5nbGUgY2hhciAqLworZXh0ZXJuIHZvaWQgZXhjZXB0aW9uSGFuZGxlcigpOwkvKiBhc3NpZ24gYW4gZXhjZXB0aW9uIGhhbmRsZXIgICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEJVRk1BWCBkZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGluYm91bmQvb3V0Ym91bmQgYnVmZmVycworICogYXQgbGVhc3QgTlVNUkVHQllURVMqMiBhcmUgbmVlZGVkIGZvciByZWdpc3RlciBwYWNrZXRzIAorICovCisjZGVmaW5lIEJVRk1BWCA0MDAKKworc3RhdGljIGNoYXIgaW5pdGlhbGl6ZWQ7ICAvKiBib29sZWFuIGZsYWcuICE9IDAgbWVhbnMgd2UndmUgYmVlbiBpbml0aWFsaXplZCAqLworCitpbnQgICAgIHJlbW90ZV9kZWJ1ZzsKKy8qICBkZWJ1ZyA+ICAwIHByaW50cyBpbGwtZm9ybWVkIGNvbW1hbmRzIGluIHZhbGlkIHBhY2tldHMgJiBjaGVja3N1bSBlcnJvcnMgKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaGV4Y2hhcnNbXT0iMDEyMzQ1Njc4OWFiY2RlZiI7CisKKyNkZWZpbmUgTlVNUkVHUyAyNAorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2YgcmVnaXN0ZXJzLiAgKi8KKyNkZWZpbmUgTlVNUkVHQllURVMgKE5VTVJFR1MgKiA0KQorZW51bSByZWduYW1lcyB7IFIwLCAgUjEsICBSMiwgIFIzLCAgUjQsICBSNSwgIFI2LCAgIFI3LAorCQlSOCwgIFI5LCAgUjEwLCBSMTEsIFIxMiwgUjEzLCBSMTQsICBSMTUsCisJCVBTVywgQ0JSLCBTUEksIFNQVSwgQlBDLCBQQywgIEFDQ0wsIEFDQ0ggfTsKKworZW51bSBTWVNfY2FsbHMgeworICAJU1lTX251bGwsIAorCVNZU19leGl0LAorCVNZU19vcGVuLAorCVNZU19jbG9zZSwKKwlTWVNfcmVhZCwKKwlTWVNfd3JpdGUsCisJU1lTX2xzZWVrLAorCVNZU191bmxpbmssCisJU1lTX2dldHBpZCwKKwlTWVNfa2lsbCwKKwlTWVNfZnN0YXQsCisJU1lTX3NicmssCisJU1lTX2ZvcmssCisJU1lTX2V4ZWN2ZSwKKwlTWVNfd2FpdDQsCisJU1lTX2xpbmssCisJU1lTX2NoZGlyLAorCVNZU19zdGF0LAorCVNZU191dGltZSwKKwlTWVNfY2hvd24sCisJU1lTX2NobW9kLAorCVNZU190aW1lLAorCVNZU19waXBlIH07CisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJzW05VTVJFR1NdOworCisjZGVmaW5lIFNUQUNLU0laRSA4MDk2CitzdGF0aWMgdW5zaWduZWQgY2hhciByZW1jb21JbkJ1ZmZlcltCVUZNQVhdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVtY29tT3V0QnVmZmVyW0JVRk1BWF07CitzdGF0aWMgaW50ICByZW1jb21TdGFja1tTVEFDS1NJWkUvc2l6ZW9mKGludCldOworc3RhdGljIGludCogIHN0YWNrUHRyID0gJnJlbWNvbVN0YWNrW1NUQUNLU0laRS9zaXplb2YoaW50KSAtIDFdOworCitzdGF0aWMgdW5zaWduZWQgaW50IHNhdmVfdmVjdG9yc1sxOF07CS8qIHByZXZpb3VzIGV4Y2VwdGlvbiB2ZWN0b3JzICovCisKKy8qIEluZGljYXRlIHRvIGNhbGxlciBvZiBtZW0yaGV4IG9yIGhleDJtZW0gdGhhdCB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvci4gKi8KK3N0YXRpYyB2b2xhdGlsZSBpbnQgbWVtX2VyciA9IDA7CisKKy8qIFN0b3JlIHRoZSB2ZWN0b3IgbnVtYmVyIGhlcmUgKHNpbmNlIEdEQiBvbmx5IGdldHMgdGhlIHNpZ25hbAorICAgbnVtYmVyIHRocm91Z2ggdGhlIHVzdWFsIG1lYW5zLCBhbmQgdGhhdCdzIG5vdCB2ZXJ5IHNwZWNpZmljKS4gICovCitpbnQgZ2RiX20zMnJfdmVjdG9yID0gLTE7CisKKyNpZiAwCisjaW5jbHVkZSAic3lzY2FsbC5oIiAvKiBmb3IgU1lTX2V4aXQsIFNZU193cml0ZSBldGMuICovCisjZW5kaWYKKworLyogR2xvYmFsIGVudHJ5IHBvaW50czoKKyAqLworCitleHRlcm4gdm9pZCBoYW5kbGVfZXhjZXB0aW9uKGludCk7CitleHRlcm4gdm9pZCBzZXRfZGVidWdfdHJhcHModm9pZCk7CitleHRlcm4gdm9pZCBicmVha3BvaW50KHZvaWQpOworCisvKiBMb2NhbCBmdW5jdGlvbnM6CisgKi8KKworc3RhdGljIGludCAgY29tcHV0ZVNpZ25hbChpbnQpOworc3RhdGljIHZvaWQgcHV0cGFja2V0KHVuc2lnbmVkIGNoYXIgKik7CitzdGF0aWMgdm9pZCBnZXRwYWNrZXQodW5zaWduZWQgY2hhciAqKTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKm1lbTJoZXgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIGludCwgaW50KTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpoZXgybWVtKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQsIGludCk7CitzdGF0aWMgaW50ICBoZXhUb0ludCh1bnNpZ25lZCBjaGFyICoqLCBpbnQgKik7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqYmluMm1lbSh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgaW50LCBpbnQpOworc3RhdGljIHZvaWQgc3Rhc2hfcmVnaXN0ZXJzKHZvaWQpOworc3RhdGljIHZvaWQgcmVzdG9yZV9yZWdpc3RlcnModm9pZCk7CitzdGF0aWMgaW50ICBwcmVwYXJlX3RvX3N0ZXAoaW50KTsKK3N0YXRpYyBpbnQgIGZpbmlzaF9mcm9tX3N0ZXAodm9pZCk7CisKK3N0YXRpYyB2b2lkIGdkYl9lcnJvcihjaGFyICosIGNoYXIgKik7CitzdGF0aWMgaW50ICBnZGJfcHV0Y2hhcihpbnQpLCBnZGJfcHV0cyhjaGFyICopLCBnZGJfd3JpdGUoY2hhciAqLCBpbnQpOworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqc3RyY3B5ICh1bnNpZ25lZCBjaGFyICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKik7CitzdGF0aWMgaW50ICAgc3RybGVuIChjb25zdCB1bnNpZ25lZCBjaGFyICopOworCisvKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIGFsbCBjb21tYW5kIHByb2Nlc2luZyBmb3IgaW50ZXJmYWNpbmcgdG8gZ2RiLgorICovCisKK3ZvaWQgCitoYW5kbGVfZXhjZXB0aW9uKGludCBleGNlcHRpb25WZWN0b3IpCit7CisgIGludCAgICBzaWd2YWw7CisgIGludCAgICBhZGRyLCBsZW5ndGgsIGk7CisgIHVuc2lnbmVkIGNoYXIgKiBwdHI7CisgIHVuc2lnbmVkIGNoYXIgICBidWZbMTZdOworICBpbnQgYmluYXJ5OworCisgIGlmICghZmluaXNoX2Zyb21fc3RlcCgpKQorICAgIHJldHVybjsJCS8qICJmYWxzZSBzdGVwIjogbGV0IHRoZSB0YXJnZXQgY29udGludWUgKi8KKworICBnZGJfbTMycl92ZWN0b3IgPSBleGNlcHRpb25WZWN0b3I7CisKKyAgaWYgKHJlbW90ZV9kZWJ1ZykKKyAgICB7CisgICAgICBtZW0yaGV4KCh1bnNpZ25lZCBjaGFyICopICZleGNlcHRpb25WZWN0b3IsIGJ1ZiwgNCwgMCk7CisgICAgICBnZGJfZXJyb3IoIkhhbmRsZSBleGNlcHRpb24gJXMsICIsIGJ1Zik7CisgICAgICBtZW0yaGV4KCh1bnNpZ25lZCBjaGFyICopICZyZWdpc3RlcnNbUENdLCBidWYsIDQsIDApOworICAgICAgZ2RiX2Vycm9yKCJQQyA9PSAweCVzXG4iLCBidWYpOworICAgIH0KKworICAvKiByZXBseSB0byBob3N0IHRoYXQgYW4gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCAqLworICBzaWd2YWwgPSBjb21wdXRlU2lnbmFsKCBleGNlcHRpb25WZWN0b3IgKTsKKworICBwdHIgPSByZW1jb21PdXRCdWZmZXI7CisgCisgICpwdHIrKyA9ICdUJzsgICAgICAgICAvKiBub3RpZnkgZ2RiIHdpdGggc2lnbm8sIFBDLCBGUCBhbmQgU1AgKi8KKyAgKnB0cisrID0gaGV4Y2hhcnNbc2lndmFsID4+IDRdOworICAqcHRyKysgPSBoZXhjaGFyc1tzaWd2YWwgJiAweGZdOworIAorICAqcHRyKysgPSBoZXhjaGFyc1tQQyA+PiA0XTsKKyAgKnB0cisrID0gaGV4Y2hhcnNbUEMgJiAweGZdOworICAqcHRyKysgPSAnOic7CisgIHB0ciA9IG1lbTJoZXgoKHVuc2lnbmVkIGNoYXIgKikmcmVnaXN0ZXJzW1BDXSwgcHRyLCA0LCAwKTsgICAgIC8qIFBDICovCisgICpwdHIrKyA9ICc7JzsKKyAKKyAgKnB0cisrID0gaGV4Y2hhcnNbUjEzID4+IDRdOworICAqcHRyKysgPSBoZXhjaGFyc1tSMTMgJiAweGZdOworICAqcHRyKysgPSAnOic7CisgIHB0ciA9IG1lbTJoZXgoKHVuc2lnbmVkIGNoYXIgKikmcmVnaXN0ZXJzW1IxM10sIHB0ciwgNCwgMCk7ICAgIC8qIEZQICovCisgICpwdHIrKyA9ICc7JzsKKyAKKyAgKnB0cisrID0gaGV4Y2hhcnNbUjE1ID4+IDRdOworICAqcHRyKysgPSBoZXhjaGFyc1tSMTUgJiAweGZdOworICAqcHRyKysgPSAnOic7CisgIHB0ciA9IG1lbTJoZXgoKHVuc2lnbmVkIGNoYXIgKikmcmVnaXN0ZXJzW1IxNV0sIHB0ciwgNCwgMCk7ICAgIC8qIFNQICovCisgICpwdHIrKyA9ICc7JzsKKyAgKnB0cisrID0gMDsKKyAKKyAgaWYgKGV4Y2VwdGlvblZlY3RvciA9PSAwKSAgICAgLyogc2ltdWxhdGVkIFNZUyBjYWxsIHN0dWZmICovCisgICAgeworICAgICAgbWVtMmhleCgodW5zaWduZWQgY2hhciAqKSAmcmVnaXN0ZXJzW1BDXSwgYnVmLCA0LCAwKTsKKyAgICAgIHN3aXRjaCAocmVnaXN0ZXJzW1IwXSkgeworICAgICAgY2FzZSBTWVNfZXhpdDoKKwlnZGJfZXJyb3IoIlRhcmdldCBwcm9ncmFtIGhhcyBleGl0ZWQgYXQgJXNcbiIsIGJ1Zik7CisJcHRyID0gcmVtY29tT3V0QnVmZmVyOworCSpwdHIrKyA9ICdXJzsKKwlzaWd2YWwgPSByZWdpc3RlcnNbUjFdICYgMHhmZjsKKwkqcHRyKysgPSBoZXhjaGFyc1tzaWd2YWwgPj4gNF07CisJKnB0cisrID0gaGV4Y2hhcnNbc2lndmFsICYgMHhmXTsKKwkqcHRyKysgPSAwOworCWJyZWFrOworICAgICAgY2FzZSBTWVNfb3BlbjoKKwlnZGJfZXJyb3IoIlRhcmdldCBhdHRlbXB0cyBTWVNfb3BlbiBjYWxsIGF0ICVzXG4iLCBidWYpOworCWJyZWFrOworICAgICAgY2FzZSBTWVNfY2xvc2U6CisJZ2RiX2Vycm9yKCJUYXJnZXQgYXR0ZW1wdHMgU1lTX2Nsb3NlIGNhbGwgYXQgJXNcbiIsIGJ1Zik7CisJYnJlYWs7CisgICAgICBjYXNlIFNZU19yZWFkOgorCWdkYl9lcnJvcigiVGFyZ2V0IGF0dGVtcHRzIFNZU19yZWFkIGNhbGwgYXQgJXNcbiIsIGJ1Zik7CisJYnJlYWs7CisgICAgICBjYXNlIFNZU193cml0ZToKKwlpZiAocmVnaXN0ZXJzW1IxXSA9PSAxIHx8ICAgICAgIC8qIHdyaXRlIHRvIHN0ZG91dCAgKi8KKwkgICAgcmVnaXN0ZXJzW1IxXSA9PSAyKQkJLyogd3JpdGUgdG8gc3RkZXJyICAqLworCSAgewkJCQkvKiAod2UgY2FuIGRvIHRoYXQpICovCisJICAgIHJlZ2lzdGVyc1tSMF0gPSBnZGJfd3JpdGUoKHZvaWQgKikgcmVnaXN0ZXJzW1IyXSwgcmVnaXN0ZXJzW1IzXSk7CisJICAgIHJldHVybjsKKwkgIH0KKwllbHNlCisJICBnZGJfZXJyb3IoIlRhcmdldCBhdHRlbXB0cyBTWVNfd3JpdGUgY2FsbCBhdCAlc1xuIiwgYnVmKTsKKwlicmVhazsKKyAgICAgIGNhc2UgU1lTX2xzZWVrOgorCWdkYl9lcnJvcigiVGFyZ2V0IGF0dGVtcHRzIFNZU19sc2VlayBjYWxsIGF0ICVzXG4iLCBidWYpOworCWJyZWFrOworICAgICAgY2FzZSBTWVNfdW5saW5rOgorCWdkYl9lcnJvcigiVGFyZ2V0IGF0dGVtcHRzIFNZU191bmxpbmsgY2FsbCBhdCAlc1xuIiwgYnVmKTsKKwlicmVhazsKKyAgICAgIGNhc2UgU1lTX2dldHBpZDoKKwlnZGJfZXJyb3IoIlRhcmdldCBhdHRlbXB0cyBTWVNfZ2V0cGlkIGNhbGwgYXQgJXNcbiIsIGJ1Zik7CisJYnJlYWs7CisgICAgICBjYXNlIFNZU19raWxsOgorCWdkYl9lcnJvcigiVGFyZ2V0IGF0dGVtcHRzIFNZU19raWxsIGNhbGwgYXQgJXNcbiIsIGJ1Zik7CisJYnJlYWs7CisgICAgICBjYXNlIFNZU19mc3RhdDoKKwlnZGJfZXJyb3IoIlRhcmdldCBhdHRlbXB0cyBTWVNfZnN0YXQgY2FsbCBhdCAlc1xuIiwgYnVmKTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJZ2RiX2Vycm9yKCJUYXJnZXQgYXR0ZW1wdHMgdW5rbm93biBTWVMgY2FsbCBhdCAlc1xuIiwgYnVmKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgcHV0cGFja2V0KHJlbWNvbU91dEJ1ZmZlcik7CisKKyAgd2hpbGUgKDE9PTEpIHsKKyAgICByZW1jb21PdXRCdWZmZXJbMF0gPSAwOworICAgIGdldHBhY2tldChyZW1jb21JbkJ1ZmZlcik7CisgICAgYmluYXJ5ID0gMDsKKyAgICBzd2l0Y2ggKHJlbWNvbUluQnVmZmVyWzBdKSB7CisgICAgICBkZWZhdWx0OgkvKiBVbmtub3duIGNvZGUuICBSZXR1cm4gYW4gZW1wdHkgcmVwbHkgbWVzc2FnZS4gKi8KKwlicmVhazsKKyAgICAgIGNhc2UgJ1InOgorCXB0ciA9ICZyZW1jb21JbkJ1ZmZlclsxXTsKKwlpZiAoaGV4VG9JbnQgKCZwdHIsICZhZGRyKSkKKwkgIHJlZ2lzdGVyc1tQQ10gPSBhZGRyOworCXN0cmNweShyZW1jb21PdXRCdWZmZXIsICJPSyIpOworCWJyZWFrOworICAgICAgY2FzZSAnISc6CisJc3RyY3B5KHJlbWNvbU91dEJ1ZmZlciwgIk9LIik7CisJYnJlYWs7CisgICAgY2FzZSAnWCc6IC8qIFhBQS4uQUEsTExMTDo8YmluYXJ5IGRhdGE+I2NzICovCisgICAgICBiaW5hcnkgPSAxOworICAgIGNhc2UgJ00nOiAvKiBNQUEuLkFBLExMTEw6IFdyaXRlIExMTEwgYnl0ZXMgYXQgYWRkcmVzcyBBQS5BQSByZXR1cm4gT0sgKi8KKyAgICAgIC8qIFRSWSBUTyBSRUFEICcleCwleDonLiAgSUYgU1VDQ0VFRCwgU0VUIFBUUiA9IDAgKi8KKyAgICAgIHsKKyAgICAgICAgcHRyID0gJnJlbWNvbUluQnVmZmVyWzFdOworICAgICAgICBpZiAoaGV4VG9JbnQoJnB0ciwmYWRkcikpCisgICAgICAgICAgaWYgKCoocHRyKyspID09ICcsJykKKyAgICAgICAgICAgIGlmIChoZXhUb0ludCgmcHRyLCZsZW5ndGgpKQorICAgICAgICAgICAgICBpZiAoKihwdHIrKykgPT0gJzonKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG1lbV9lcnIgPSAwOworICAgICAgICAgICAgICAgICAgaWYgKGJpbmFyeSkKKyAgICAgICAgICAgICAgICAgICAgYmluMm1lbSAocHRyLCAodW5zaWduZWQgY2hhciAqKSBhZGRyLCBsZW5ndGgsIDEpOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBoZXgybWVtKHB0ciwgKHVuc2lnbmVkIGNoYXIqKSBhZGRyLCBsZW5ndGgsIDEpOworICAgICAgICAgICAgICAgICAgaWYgKG1lbV9lcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5IChyZW1jb21PdXRCdWZmZXIsICJFMDMiKTsKKyAgICAgICAgICAgICAgICAgICAgZ2RiX2Vycm9yICgibWVtb3J5IGZhdWx0IiwgIiIpOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHJlbWNvbU91dEJ1ZmZlciwiT0siKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHB0ciA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICBpZiAocHRyKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmNweShyZW1jb21PdXRCdWZmZXIsIkUwMiIpOworICAgICAgICAgICAgZ2RiX2Vycm9yKCJtYWxmb3JtZWQgd3JpdGUgbWVtb3J5IGNvbW1hbmQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICByZW1jb21JbkJ1ZmZlcik7CisgICAgICAgICAgfQorICAgICAgfQorCWJyZWFrOworICAgICAgY2FzZSAnbSc6IC8qIG1BQS4uQUEsTExMTCAgUmVhZCBMTExMIGJ5dGVzIGF0IGFkZHJlc3MgQUEuLkFBICovCisJCS8qIFRSWSBUTyBSRUFEICV4LCV4LiAgSUYgU1VDQ0VFRCwgU0VUIFBUUiA9IDAgKi8KKwlwdHIgPSAmcmVtY29tSW5CdWZmZXJbMV07CisJaWYgKGhleFRvSW50KCZwdHIsJmFkZHIpKQorCSAgaWYgKCoocHRyKyspID09ICcsJykKKwkgICAgaWYgKGhleFRvSW50KCZwdHIsJmxlbmd0aCkpCisJICAgICAgeworCQlwdHIgPSAwOworCQltZW1fZXJyID0gMDsKKwkJbWVtMmhleCgodW5zaWduZWQgY2hhciopIGFkZHIsIHJlbWNvbU91dEJ1ZmZlciwgbGVuZ3RoLCAxKTsKKwkJaWYgKG1lbV9lcnIpIHsKKwkJICBzdHJjcHkgKHJlbWNvbU91dEJ1ZmZlciwgIkUwMyIpOworCQkgIGdkYl9lcnJvciAoIm1lbW9yeSBmYXVsdCIsICIiKTsKKwkJfQorCSAgICAgIH0KKwlpZiAocHRyKQorCSAgeworCSAgICBzdHJjcHkocmVtY29tT3V0QnVmZmVyLCJFMDEiKTsKKwkgICAgZ2RiX2Vycm9yKCJtYWxmb3JtZWQgcmVhZCBtZW1vcnkgY29tbWFuZDogJXMiLAorCQkJcmVtY29tSW5CdWZmZXIpOworCSAgfQorCWJyZWFrOworICAgICAgY2FzZSAnPyc6IAorCXJlbWNvbU91dEJ1ZmZlclswXSA9ICdTJzsKKwlyZW1jb21PdXRCdWZmZXJbMV0gPSAgaGV4Y2hhcnNbc2lndmFsID4+IDRdOworCXJlbWNvbU91dEJ1ZmZlclsyXSA9ICBoZXhjaGFyc1tzaWd2YWwgJSAxNl07CisJcmVtY29tT3V0QnVmZmVyWzNdID0gMDsKKwlicmVhazsKKyAgICAgIGNhc2UgJ2QnOiAKKwlyZW1vdGVfZGVidWcgPSAhKHJlbW90ZV9kZWJ1Zyk7ICAvKiB0b2dnbGUgZGVidWcgZmxhZyAqLworCWJyZWFrOworICAgICAgY2FzZSAnZyc6IC8qIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIENQVSByZWdpc3RlcnMgKi8KKwltZW0yaGV4KCh1bnNpZ25lZCBjaGFyKikgcmVnaXN0ZXJzLCByZW1jb21PdXRCdWZmZXIsIE5VTVJFR0JZVEVTLCAwKTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ1AnOiAvKiBzZXQgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIENQVSByZWdpc3RlciAtIHJldHVybiBPSyAqLworCXsKKwkgIGludCByZWdubzsKKworCSAgcHRyID0gJnJlbWNvbUluQnVmZmVyWzFdOworCSAgaWYgKGhleFRvSW50ICgmcHRyLCAmcmVnbm8pICYmICpwdHIrKyA9PSAnPScpCisJICAgIGlmIChyZWdubyA+PSAwICYmIHJlZ25vIDwgTlVNUkVHUykKKwkgICAgICB7CisJCWludCBzdGFja21vZGU7CisKKwkJaGV4Mm1lbSAocHRyLCAodW5zaWduZWQgY2hhciAqKSAmcmVnaXN0ZXJzW3JlZ25vXSwgNCwgMCk7CisJCS8qCisJCSAqIFNpbmNlIHdlIGp1c3QgY2hhbmdlZCBhIHNpbmdsZSBDUFUgcmVnaXN0ZXIsIGxldCdzCisJCSAqIG1ha2Ugc3VyZSB0byBrZWVwIHRoZSBzZXZlcmFsIHN0YWNrIHBvaW50ZXJzIGNvbnNpc3RhbnQuCisJCSAqLworCQlzdGFja21vZGUgPSByZWdpc3RlcnNbUFNXXSAmIDB4ODA7CisJCWlmIChyZWdubyA9PSBSMTUpCS8qIHN0YWNrIHBvaW50ZXIgY2hhbmdlZCAqLworCQkgIHsJCQkvKiBuZWVkIHRvIGNoYW5nZSBTUEkgb3IgU1BVICovCisJCSAgICBpZiAoc3RhY2ttb2RlID09IDApCisJCSAgICAgIHJlZ2lzdGVyc1tTUEldID0gcmVnaXN0ZXJzW1IxNV07CisJCSAgICBlbHNlCisJCSAgICAgIHJlZ2lzdGVyc1tTUFVdID0gcmVnaXN0ZXJzW1IxNV07CisJCSAgfQorCQllbHNlIGlmIChyZWdubyA9PSBTUFUpCS8qICJ1c2VyIiBzdGFjayBwb2ludGVyIGNoYW5nZWQgKi8KKwkJICB7CisJCSAgICBpZiAoc3RhY2ttb2RlICE9IDApCS8qIHN0YWNrIGluIHVzZXIgbW9kZTogY29weSBTUCAqLworCQkgICAgICByZWdpc3RlcnNbUjE1XSA9IHJlZ2lzdGVyc1tTUFVdOworCQkgIH0KKwkJZWxzZSBpZiAocmVnbm8gPT0gU1BJKQkvKiAiaW50ZXJydXB0IiBzdGFjayBwb2ludGVyIGNoYW5nZWQgKi8KKwkJICB7CisJCSAgICBpZiAoc3RhY2ttb2RlID09IDApCS8qIHN0YWNrIGluIGludGVycnVwdCBtb2RlOiBjb3B5IFNQICovCisJCSAgICAgIHJlZ2lzdGVyc1tSMTVdID0gcmVnaXN0ZXJzW1NQSV07CisJCSAgfQorCQllbHNlIGlmIChyZWdubyA9PSBQU1cpCS8qIHN0YWNrIG1vZGUgbWF5IGhhdmUgY2hhbmdlZCEgKi8KKwkJICB7CQkJLyogZm9yY2UgU1AgdG8gZWl0aGVyIFNQVSBvciBTUEkgKi8KKwkJICAgIGlmIChzdGFja21vZGUgPT0gMCkJLyogc3RhY2sgaW4gdXNlciBtb2RlICovCisJCSAgICAgIHJlZ2lzdGVyc1tSMTVdID0gcmVnaXN0ZXJzW1NQSV07CisJCSAgICBlbHNlCQkvKiBzdGFjayBpbiBpbnRlcnJ1cHQgbW9kZSAqLworCQkgICAgICByZWdpc3RlcnNbUjE1XSA9IHJlZ2lzdGVyc1tTUFVdOworCQkgIH0KKwkJc3RyY3B5IChyZW1jb21PdXRCdWZmZXIsICJPSyIpOworCQlicmVhazsKKwkgICAgICB9CisJICBzdHJjcHkgKHJlbWNvbU91dEJ1ZmZlciwgIlAwMSIpOworCSAgYnJlYWs7CisJfQorICAgICAgY2FzZSAnRyc6IC8qIHNldCB0aGUgdmFsdWUgb2YgdGhlIENQVSByZWdpc3RlcnMgLSByZXR1cm4gT0sgKi8KKwloZXgybWVtKCZyZW1jb21JbkJ1ZmZlclsxXSwgKHVuc2lnbmVkIGNoYXIqKSByZWdpc3RlcnMsIE5VTVJFR0JZVEVTLCAwKTsKKwlzdHJjcHkocmVtY29tT3V0QnVmZmVyLCJPSyIpOworCWJyZWFrOworICAgICAgY2FzZSAncyc6IC8qIHNBQS4uQUEJU3RlcCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBBQS4uQUEob3B0aW9uYWwpICovCisgICAgICBjYXNlICdjJzogLyogY0FBLi5BQQlDb250aW51ZSBmcm9tIGFkZHJlc3MgQUEuLkFBKG9wdGlvbmFsKSAqLworCQkvKiB0cnkgdG8gcmVhZCBvcHRpb25hbCBwYXJhbWV0ZXIsIHBjIHVuY2hhbmdlZCBpZiBubyBwYXJtICovCisJcHRyID0gJnJlbWNvbUluQnVmZmVyWzFdOworCWlmIChoZXhUb0ludCgmcHRyLCZhZGRyKSkKKwkgIHJlZ2lzdGVyc1sgUEMgXSA9IGFkZHI7CisJCisJaWYgKHJlbWNvbUluQnVmZmVyWzBdID09ICdzJykJLyogc2luZ2xlLXN0ZXBwaW5nICovCisJICB7CisJICAgIGlmICghcHJlcGFyZV90b19zdGVwKDApKQkvKiBzZXQgdXAgZm9yIHNpbmdsZS1zdGVwICovCisJICAgICAgeworCQkvKiBwcmVwYXJlX3RvX3N0ZXAgaGFzIGFscmVhZHkgZW11bGF0ZWQgdGhlIHRhcmdldCBpbnNuOgorCQkgICBTZW5kIFNJR1RSQVAgdG8gZ2RiLCBkb24ndCByZXN1bWUgdGhlIHRhcmdldCBhdCBhbGwuICAqLworCQlwdHIgPSByZW1jb21PdXRCdWZmZXI7CisJCSpwdHIrKyA9ICdUJzsgICAgICAgICAgIC8qIFNpbXVsYXRlIHN0b3BwaW5nIHdpdGggU0lHVFJBUCAqLworCQkqcHRyKysgPSAnMCc7CisJCSpwdHIrKyA9ICc1JzsKKworCQkqcHRyKysgPSBoZXhjaGFyc1tQQyA+PiA0XTsgICAgIC8qIHNlbmQgUEMgKi8KKwkJKnB0cisrID0gaGV4Y2hhcnNbUEMgJiAweGZdOworCQkqcHRyKysgPSAnOic7CisJCXB0ciA9IG1lbTJoZXgoKHVuc2lnbmVkIGNoYXIgKikmcmVnaXN0ZXJzW1BDXSwgcHRyLCA0LCAwKTsKKwkJKnB0cisrID0gJzsnOworCisJCSpwdHIrKyA9IGhleGNoYXJzW1IxMyA+PiA0XTsgICAgLyogc2VuZCBGUCAqLworCQkqcHRyKysgPSBoZXhjaGFyc1tSMTMgJiAweGZdOworCQkqcHRyKysgPSAnOic7CisJCXB0ciA9IG1lbTJoZXgoKHVuc2lnbmVkIGNoYXIgKikmcmVnaXN0ZXJzW1IxM10sIHB0ciwgNCwgMCk7CisJCSpwdHIrKyA9ICc7JzsKKworCQkqcHRyKysgPSBoZXhjaGFyc1tSMTUgPj4gNF07ICAgIC8qIHNlbmQgU1AgKi8KKwkJKnB0cisrID0gaGV4Y2hhcnNbUjE1ICYgMHhmXTsKKwkJKnB0cisrID0gJzonOworCQlwdHIgPSBtZW0yaGV4KCh1bnNpZ25lZCBjaGFyICopJnJlZ2lzdGVyc1tSMTVdLCBwdHIsIDQsIDApOworCQkqcHRyKysgPSAnOyc7CisJCSpwdHIrKyA9IDA7CisKKwkJYnJlYWs7CQorCSAgICAgIH0KKwkgIH0KKwllbHNlCS8qIGNvbnRpbnVpbmcsIG5vdCBzaW5nbGUtc3RlcHBpbmcgKi8KKwkgIHsKKwkgICAgLyogT0ssIGFib3V0IHRvIGRvIGEgImNvbnRpbnVlIi4gIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiB0aGUgCisJICAgICAgIHRhcmdldCBwYyBpcyBvbiBhbiBvZGQgYm91bmRhcnkgKHNlY29uZCBpbnN0cnVjdGlvbiBpbiB0aGUgCisJICAgICAgIHdvcmQpLiAgSWYgc28sIHdlIG11c3QgZG8gYSBzaW5nbGUtc3RlcCBmaXJzdCwgYmVjYXVzZSAKKwkgICAgICAgeWEgY2FuJ3QganVtcCBvciByZXR1cm4gYmFjayB0byBhbiBvZGQgYm91bmRhcnkhICAqLworCSAgICBpZiAoKHJlZ2lzdGVyc1tQQ10gJiAyKSAhPSAwKQorCSAgICAgIHByZXBhcmVfdG9fc3RlcCgxKTsKKwkgIH0KKwlyZXR1cm47CisKKyAgICAgIGNhc2UgJ0QnOgkvKiBEZXRhY2ggKi8KKwkvKiBJIGFtIGludGVycHJldGluZyB0aGlzIHRvIG1lYW4sIHJlbGVhc2UgdGhlIGJvYXJkIGZyb20gY29udHJvbCAKKwkgICBieSB0aGUgcmVtb3RlIHN0dWIuICBUbyBkbyB0aGlzLCBJIGFtIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwKKwkgICAob3IgYXQgbGVhc3QgcHJldmlvdXMpIGV4Y2VwdGlvbiB2ZWN0b3JzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAxODsgaSsrKQorCSAgZXhjZXB0aW9uSGFuZGxlciAoaSwgc2F2ZV92ZWN0b3JzW2ldKTsKKwlwdXRwYWNrZXQgKCJPSyIpOworCXJldHVybjsJCS8qIGNvbnRpbnVlIHRoZSBpbmZlcmlvciAqLworCisgICAgICBjYXNlICdrJzogLyoga2lsbCB0aGUgcHJvZ3JhbSAqLworCWNvbnRpbnVlOworICAgICAgfSAvKiBzd2l0Y2ggKi8KKworICAgIC8qIHJlcGx5IHRvIHRoZSByZXF1ZXN0ICovCisgICAgcHV0cGFja2V0KHJlbWNvbU91dEJ1ZmZlcik7CisgIH0KK30KKworc3RhdGljIGludCAKK2hleChjaCkKKyAgICAgdW5zaWduZWQgY2hhciBjaDsKK3sKKyAgaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKSByZXR1cm4gKGNoLSdhJysxMCk7CisgIGlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkgcmV0dXJuIChjaC0nMCcpOworICBpZiAoKGNoID49ICdBJykgJiYgKGNoIDw9ICdGJykpIHJldHVybiAoY2gtJ0EnKzEwKTsKKyAgcmV0dXJuICgtMSk7Cit9CisKKy8qIHNjYW4gZm9yIHRoZSBzZXF1ZW5jZSAkPGRhdGE+IzxjaGVja3N1bT4gICAgICovCisKK3N0YXRpYyB2b2lkIAorZ2V0cGFja2V0KGJ1ZmZlcikKKyAgICAgdW5zaWduZWQgY2hhciAqIGJ1ZmZlcjsKK3sKKyAgdW5zaWduZWQgY2hhciBjaGVja3N1bTsKKyAgdW5zaWduZWQgY2hhciB4bWl0Y3N1bTsKKyAgaW50ICBpOworICBpbnQgIGNvdW50OworICB1bnNpZ25lZCBjaGFyIGNoOworCisgIGRvIHsKKyAgICAvKiB3YWl0IGFyb3VuZCBmb3IgdGhlIHN0YXJ0IGNoYXJhY3RlciwgaWdub3JlIGFsbCBvdGhlciBjaGFyYWN0ZXJzICovCisgICAgd2hpbGUgKChjaCA9IGdldERlYnVnQ2hhcigpKSAhPSAnJCcpOworICAgIGNoZWNrc3VtID0gMDsKKyAgICB4bWl0Y3N1bSA9IC0xOworCisgICAgY291bnQgPSAwOworCisgICAgLyogbm93LCByZWFkIHVudGlsIGEgIyBvciBlbmQgb2YgYnVmZmVyIGlzIGZvdW5kICovCisgICAgd2hpbGUgKGNvdW50IDwgQlVGTUFYKSB7CisgICAgICBjaCA9IGdldERlYnVnQ2hhcigpOworICAgICAgCisgICAgICBpZiAoY2ggPT0gJyMnICYmIChjb3VudCA9PSAwIHx8IGJ1ZmZlcltjb3VudC0xXSAhPSAweDdkKSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNoZWNrc3VtID0gY2hlY2tzdW0gKyBjaDsKKyAgICAgIGJ1ZmZlcltjb3VudF0gPSBjaDsKKyAgICAgIGNvdW50ID0gY291bnQgKyAxOworICAgICAgfQorICAgIGJ1ZmZlcltjb3VudF0gPSAwOworCisgICAgaWYgKGNoID09ICcjJykgeworICAgICAgeG1pdGNzdW0gPSBoZXgoZ2V0RGVidWdDaGFyKCkpIDw8IDQ7CisgICAgICB4bWl0Y3N1bSArPSBoZXgoZ2V0RGVidWdDaGFyKCkpOworICAgICAgaWYgKGNoZWNrc3VtICE9IHhtaXRjc3VtKSB7CisgICAgICAgIGlmIChyZW1vdGVfZGVidWcpIHsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZlsxNl07CisKKyAgICAgICAgICBtZW0yaGV4KCh1bnNpZ25lZCBjaGFyICopICZjaGVja3N1bSwgYnVmLCA0LCAwKTsKKyAgICAgICAgICBnZGJfZXJyb3IoIkJhZCBjaGVja3N1bTogbXkgY291bnQgPSAlcywgIiwgYnVmKTsKKyAgICAgICAgICBtZW0yaGV4KCh1bnNpZ25lZCBjaGFyICopICZ4bWl0Y3N1bSwgYnVmLCA0LCAwKTsKKyAgICAgICAgICBnZGJfZXJyb3IoInNlbnQgY291bnQgPSAlc1xuIiwgYnVmKTsKKyAgICAgICAgICBnZGJfZXJyb3IoIiAtLSBCYWQgYnVmZmVyOiBcIiVzXCJcbiIsIGJ1ZmZlcik7IAorICAgICAgICB9CisKKyAgICAgICAgcHV0RGVidWdDaGFyKCctJyk7ICAvKiBmYWlsZWQgY2hlY2tzdW0gKi8KKyAgICAgIH0gZWxzZSB7CisJcHV0RGVidWdDaGFyKCcrJyk7ICAvKiBzdWNjZXNzZnVsIHRyYW5zZmVyICovCisJLyogaWYgYSBzZXF1ZW5jZSBjaGFyIGlzIHByZXNlbnQsIHJlcGx5IHRoZSBzZXF1ZW5jZSBJRCAqLworCWlmIChidWZmZXJbMl0gPT0gJzonKSB7CisJICBwdXREZWJ1Z0NoYXIoIGJ1ZmZlclswXSApOworCSAgcHV0RGVidWdDaGFyKCBidWZmZXJbMV0gKTsKKwkgIC8qIHJlbW92ZSBzZXF1ZW5jZSBjaGFycyBmcm9tIGJ1ZmZlciAqLworCSAgY291bnQgPSBzdHJsZW4oYnVmZmVyKTsKKwkgIGZvciAoaT0zOyBpIDw9IGNvdW50OyBpKyspIGJ1ZmZlcltpLTNdID0gYnVmZmVyW2ldOworCX0KKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKGNoZWNrc3VtICE9IHhtaXRjc3VtKTsKK30KKworLyogc2VuZCB0aGUgcGFja2V0IGluIGJ1ZmZlci4gICovCisKK3N0YXRpYyB2b2lkIAorcHV0cGFja2V0KGJ1ZmZlcikKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworeworICB1bnNpZ25lZCBjaGFyIGNoZWNrc3VtOworICBpbnQgIGNvdW50OworICBjaGFyIGNoOworCisgIC8qICAkPHBhY2tldCBpbmZvPiM8Y2hlY2tzdW0+LiAqLworICBkbyB7CisgICAgcHV0RGVidWdDaGFyKCckJyk7CisgICAgY2hlY2tzdW0gPSAwOworICAgIGNvdW50ICAgID0gMDsKKworICAgIHdoaWxlIChjaD1idWZmZXJbY291bnRdKSB7CisgICAgICBwdXREZWJ1Z0NoYXIoY2gpOworICAgICAgY2hlY2tzdW0gKz0gY2g7CisgICAgICBjb3VudCArPSAxOworICAgIH0KKyAgICBwdXREZWJ1Z0NoYXIoJyMnKTsKKyAgICBwdXREZWJ1Z0NoYXIoaGV4Y2hhcnNbY2hlY2tzdW0gPj4gNF0pOworICAgIHB1dERlYnVnQ2hhcihoZXhjaGFyc1tjaGVja3N1bSAlIDE2XSk7CisgIH0gd2hpbGUgKGdldERlYnVnQ2hhcigpICE9ICcrJyk7Cit9CisKKy8qIEFkZHJlc3Mgb2YgYSByb3V0aW5lIHRvIFJURSB0byBpZiB3ZSBnZXQgYSBtZW1vcnkgZmF1bHQuICAqLworCitzdGF0aWMgdm9pZCAoKnZvbGF0aWxlIG1lbV9mYXVsdF9yb3V0aW5lKSgpID0gMDsKKworc3RhdGljIHZvaWQKK3NldF9tZW1fZXJyICgpCit7CisgIG1lbV9lcnIgPSAxOworfQorCisvKiBDaGVjayB0aGUgYWRkcmVzcyBmb3Igc2FmZSBhY2Nlc3MgcmFuZ2VzLiAgQXMgY3VycmVudGx5IGRlZmluZWQsCisgICB0aGlzIHJvdXRpbmUgd2lsbCByZWplY3QgdGhlICJleHBhbnNpb24gYnVzIiBhZGRyZXNzIHJhbmdlKHMpLgorICAgVG8gbWFrZSB0aG9zZSByYW5nZXMgdXNlYWJsZSwgc29tZW9uZSBtdXN0IGltcGxlbWVudCBjb2RlIHRvIGRldGVjdAorICAgd2hldGhlciB0aGVyZSdzIGFueXRoaW5nIGNvbm5lY3RlZCB0byB0aGUgZXhwYW5zaW9uIGJ1cy4gKi8KKworc3RhdGljIGludAorbWVtX3NhZmUgKGFkZHIpCisgICAgIHVuc2lnbmVkIGNoYXIgKmFkZHI7Cit7CisjZGVmaW5lIEJBRF9SQU5HRV9PTkVfU1RBUlQJKCh1bnNpZ25lZCBjaGFyICopIDB4NjAwMDAwKQorI2RlZmluZSBCQURfUkFOR0VfT05FX0VORAkoKHVuc2lnbmVkIGNoYXIgKikgMHhhMDAwMDApCisjZGVmaW5lIEJBRF9SQU5HRV9UV09fU1RBUlQJKCh1bnNpZ25lZCBjaGFyICopIDB4ZmY2ODAwMDApCisjZGVmaW5lIEJBRF9SQU5HRV9UV09fRU5ECSgodW5zaWduZWQgY2hhciAqKSAweGZmODAwMDAwKQorCisgIGlmIChhZGRyIDwgQkFEX1JBTkdFX09ORV9TVEFSVCkJcmV0dXJuIDE7CS8qIHNhZmUgKi8KKyAgaWYgKGFkZHIgPCBCQURfUkFOR0VfT05FX0VORCkJCXJldHVybiAwOwkvKiB1bnNhZmUgKi8KKyAgaWYgKGFkZHIgPCBCQURfUkFOR0VfVFdPX1NUQVJUKQlyZXR1cm4gMTsJLyogc2FmZSAqLworICBpZiAoYWRkciA8IEJBRF9SQU5HRV9UV09fRU5EKQkJcmV0dXJuIDA7CS8qIHVuc2FmZSAqLworfQorCisvKiBUaGVzZSBhcmUgc2VwYXJhdGUgZnVuY3Rpb25zIHNvIHRoYXQgdGhleSBhcmUgc28gc2hvcnQgYW5kIHN3ZWV0CisgICB0aGF0IHRoZSBjb21waWxlciB3b24ndCBzYXZlIGFueSByZWdpc3RlcnMgKGlmIHRoZXJlIGlzIGEgZmF1bHQKKyAgIHRvIG1lbV9mYXVsdCwgdGhleSB3b24ndCBnZXQgcmVzdG9yZWQsIHNvIHRoZXJlIGJldHRlciBub3QgYmUgYW55CisgICBzYXZlZCkuICAqLworc3RhdGljIGludAorZ2V0X2NoYXIgKGFkZHIpCisgICAgIHVuc2lnbmVkIGNoYXIgKmFkZHI7Cit7CisjaWYgMQorICBpZiAobWVtX2ZhdWx0X3JvdXRpbmUgJiYgIW1lbV9zYWZlKGFkZHIpKQorICAgIHsKKyAgICAgIG1lbV9mYXVsdF9yb3V0aW5lICgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorI2VuZGlmCisgIHJldHVybiAqYWRkcjsKK30KKworc3RhdGljIHZvaWQKK3NldF9jaGFyIChhZGRyLCB2YWwpCisgICAgIHVuc2lnbmVkIGNoYXIgKmFkZHI7CisgICAgIHVuc2lnbmVkIGNoYXIgdmFsOworeworI2lmIDEKKyAgaWYgKG1lbV9mYXVsdF9yb3V0aW5lICYmICFtZW1fc2FmZSAoYWRkcikpCisgICAgeworICAgICAgbWVtX2ZhdWx0X3JvdXRpbmUgKCk7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisgICphZGRyID0gdmFsOworfQorCisvKiBDb252ZXJ0IHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSBtZW0gaW50byBoZXgsIHBsYWNpbmcgcmVzdWx0IGluIGJ1Zi4KKyAgIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGxhc3QgY2hhciBwdXQgaW4gYnVmIChudWxsKS4KKyAgIElmIE1BWV9GQVVMVCBpcyBub24temVybywgdGhlbiB3ZSBzaG91bGQgc2V0IG1lbV9lcnIgaW4gcmVzcG9uc2UgdG8KKyAgIGEgZmF1bHQ7IGlmIHplcm8gdHJlYXQgYSBmYXVsdCBsaWtlIGFueSBvdGhlciBmYXVsdCBpbiB0aGUgc3R1Yi4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK21lbTJoZXgobWVtLCBidWYsIGNvdW50LCBtYXlfZmF1bHQpCisgICAgIHVuc2lnbmVkIGNoYXIqIG1lbTsKKyAgICAgdW5zaWduZWQgY2hhciogYnVmOworICAgICBpbnQgICBjb3VudDsKKyAgICAgaW50ICAgbWF5X2ZhdWx0OworeworICBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciBjaDsKKworICBpZiAobWF5X2ZhdWx0KQorICAgIG1lbV9mYXVsdF9yb3V0aW5lID0gc2V0X21lbV9lcnI7CisgIGZvciAoaT0wO2k8Y291bnQ7aSsrKSB7CisgICAgY2ggPSBnZXRfY2hhciAobWVtKyspOworICAgIGlmIChtYXlfZmF1bHQgJiYgbWVtX2VycikKKyAgICAgIHJldHVybiAoYnVmKTsKKyAgICAqYnVmKysgPSBoZXhjaGFyc1tjaCA+PiA0XTsKKyAgICAqYnVmKysgPSBoZXhjaGFyc1tjaCAlIDE2XTsKKyAgfQorICAqYnVmID0gMDsKKyAgaWYgKG1heV9mYXVsdCkKKyAgICBtZW1fZmF1bHRfcm91dGluZSA9IDA7CisgIHJldHVybihidWYpOworfQorCisvKiBDb252ZXJ0IHRoZSBoZXggYXJyYXkgcG9pbnRlZCB0byBieSBidWYgaW50byBiaW5hcnkgdG8gYmUgcGxhY2VkIGluIG1lbS4KKyAgIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNoYXJhY3RlciBBRlRFUiB0aGUgbGFzdCBieXRlIHdyaXR0ZW4uICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyKiAKK2hleDJtZW0oYnVmLCBtZW0sIGNvdW50LCBtYXlfZmF1bHQpCisgICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZjsKKyAgICAgdW5zaWduZWQgY2hhciogbWVtOworICAgICBpbnQgICBjb3VudDsKKyAgICAgaW50ICAgbWF5X2ZhdWx0OworeworICBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciBjaDsKKworICBpZiAobWF5X2ZhdWx0KQorICAgIG1lbV9mYXVsdF9yb3V0aW5lID0gc2V0X21lbV9lcnI7CisgIGZvciAoaT0wO2k8Y291bnQ7aSsrKSB7CisgICAgY2ggPSBoZXgoKmJ1ZisrKSA8PCA0OworICAgIGNoID0gY2ggKyBoZXgoKmJ1ZisrKTsKKyAgICBzZXRfY2hhciAobWVtKyssIGNoKTsKKyAgICBpZiAobWF5X2ZhdWx0ICYmIG1lbV9lcnIpCisgICAgICByZXR1cm4gKG1lbSk7CisgIH0KKyAgaWYgKG1heV9mYXVsdCkKKyAgICBtZW1fZmF1bHRfcm91dGluZSA9IDA7CisgIHJldHVybihtZW0pOworfQorCisvKiBDb252ZXJ0IHRoZSBiaW5hcnkgc3RyZWFtIGluIEJVRiB0byBtZW1vcnkuCisKKyAgIEdkYiB3aWxsIGVzY2FwZSAkLCAjLCBhbmQgdGhlIGVzY2FwZSBjaGFyICgweDdkKS4KKyAgIENPVU5UIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgaW50bworICAgbWVtb3J5LiAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgorYmluMm1lbSAoYnVmLCBtZW0sIGNvdW50LCBtYXlfZmF1bHQpCisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICAgdW5zaWduZWQgY2hhciAqbWVtOworICAgICBpbnQgICBjb3VudDsKKyAgICAgaW50ICAgbWF5X2ZhdWx0OworeworICBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciBjaDsKKworICBpZiAobWF5X2ZhdWx0KQorICAgIG1lbV9mYXVsdF9yb3V0aW5lID0gc2V0X21lbV9lcnI7CisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgIC8qIENoZWNrIGZvciBhbnkgZXNjYXBlZCBjaGFyYWN0ZXJzLiBCZSBwYXJhbm9pZCBhbmQKKyAgICAgICAgIG9ubHkgdW5lc2NhcGUgY2hhcnMgdGhhdCBzaG91bGQgYmUgZXNjYXBlZC4gKi8KKyAgICAgIGlmICgqYnVmID09IDB4N2QpCisgICAgICAgIHsKKyAgICAgICAgICBzd2l0Y2ggKCooYnVmKzEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAweDM6ICAvKiAjICovCisgICAgICAgICAgICBjYXNlIDB4NDogIC8qICQgKi8KKyAgICAgICAgICAgIGNhc2UgMHg1ZDogLyogZXNjYXBlIGNoYXIgKi8KKyAgICAgICAgICAgICAgYnVmKys7CisgICAgICAgICAgICAgICpidWYgKz0gMHgyMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAvKiBub3RoaW5nICovCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIHNldF9jaGFyIChtZW0rKywgKmJ1ZisrKTsKKworICAgICAgaWYgKG1heV9mYXVsdCAmJiBtZW1fZXJyKQorICAgICAgICByZXR1cm4gbWVtOworICAgIH0KKworICBpZiAobWF5X2ZhdWx0KQorICAgIG1lbV9mYXVsdF9yb3V0aW5lID0gMDsKKyAgcmV0dXJuIG1lbTsKK30KKworLyogdGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgbTMyciBleGNlcHRpb24gdmVjdG9yIGFuZCBhdHRlbXB0cyB0bworICAgdHJhbnNsYXRlIHRoaXMgbnVtYmVyIGludG8gYSB1bml4IGNvbXBhdGlibGUgc2lnbmFsIHZhbHVlICovCisKK3N0YXRpYyBpbnQgCitjb21wdXRlU2lnbmFsKGV4Y2VwdGlvblZlY3RvcikKKyAgICAgaW50IGV4Y2VwdGlvblZlY3RvcjsKK3sKKyAgaW50IHNpZ3ZhbDsKKyAgc3dpdGNoIChleGNlcHRpb25WZWN0b3IpIHsKKyAgICBjYXNlIDAgIDogc2lndmFsID0gMjM7IGJyZWFrOyAvKiBJL08gdHJhcCAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDEgIDogc2lndmFsID0gNTsgIGJyZWFrOyAvKiBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDIgIDogc2lndmFsID0gNTsgIGJyZWFrOyAvKiBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDMgIDogc2lndmFsID0gNTsgIGJyZWFrOyAvKiBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDQgIDogc2lndmFsID0gNTsgIGJyZWFrOyAvKiBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDUgIDogc2lndmFsID0gNTsgIGJyZWFrOyAvKiBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDYgIDogc2lndmFsID0gNTsgIGJyZWFrOyAvKiBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDcgIDogc2lndmFsID0gNTsgIGJyZWFrOyAvKiBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDggIDogc2lndmFsID0gNTsgIGJyZWFrOyAvKiBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDkgIDogc2lndmFsID0gNTsgIGJyZWFrOyAvKiBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDEwIDogc2lndmFsID0gNTsgIGJyZWFrOyAvKiBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDExIDogc2lndmFsID0gNTsgIGJyZWFrOyAvKiBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDEyIDogc2lndmFsID0gNTsgIGJyZWFrOyAvKiBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDEzIDogc2lndmFsID0gNTsgIGJyZWFrOyAvKiBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDE0IDogc2lndmFsID0gNTsgIGJyZWFrOyAvKiBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDE1IDogc2lndmFsID0gNTsgIGJyZWFrOyAvKiBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgKi8KKyAgICBjYXNlIDE2IDogc2lndmFsID0gMTA7IGJyZWFrOyAvKiBCVVMgRVJST1IgKGFsaWdubWVudCkgICAgICAgKi8KKyAgICBjYXNlIDE3IDogc2lndmFsID0gMjsgIGJyZWFrOyAvKiBJTlRlcnJ1cHQgICAgICAgICAgICAgICAgICAgKi8KKyAgICBkZWZhdWx0IDogc2lndmFsID0gNzsgIGJyZWFrOyAvKiAic29mdHdhcmUgZ2VuZXJhdGVkIiAgICAgICAgKi8KKyAgfQorICByZXR1cm4gKHNpZ3ZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogV0hJTEUgV0UgRklORCBOSUNFIEhFWCBDSEFSUywgQlVJTEQgQU4gSU5UICovCisvKiBSRVRVUk4gTlVNQkVSIE9GIENIQVJTIFBST0NFU1NFRCAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCAKK2hleFRvSW50KHB0ciwgaW50VmFsdWUpCisgICAgIHVuc2lnbmVkIGNoYXIgKipwdHI7CisgICAgIGludCAqaW50VmFsdWU7Cit7CisgIGludCBudW1DaGFycyA9IDA7CisgIGludCBoZXhWYWx1ZTsKKworICAqaW50VmFsdWUgPSAwOworICB3aGlsZSAoKipwdHIpCisgICAgeworICAgICAgaGV4VmFsdWUgPSBoZXgoKipwdHIpOworICAgICAgaWYgKGhleFZhbHVlID49MCkKKyAgICAgICAgeworCSAgKmludFZhbHVlID0gKCppbnRWYWx1ZSA8PDQpIHwgaGV4VmFsdWU7CisJICBudW1DaGFycyArKzsKKyAgICAgICAgfQorICAgICAgZWxzZQorCWJyZWFrOworICAgICAgKCpwdHIpKys7CisgICAgfQorICByZXR1cm4gKG51bUNoYXJzKTsKK30KKworLyoKKyAgVGFibGUgb2YgYnJhbmNoIGluc3RydWN0aW9uczoKKyAgCisgIDEwQjYJCVJURQlyZXR1cm4gZnJvbSB0cmFwIG9yIGV4Y2VwdGlvbgorICAxRkNyCQlKTVAJanVtcAorICAxRUNyCQlKTAlqdW1wIGFuZCBsaW5rCisgIDdGeHgJCUJSQQlicmFuY2gKKyAgRkZ4eHh4eHgJQlJBCWJyYW5jaCAobG9uZykKKyAgQjA5cnh4eHgJQk5FWglicmFuY2ggbm90LWVxdWFsLXplcm8KKyAgQnIxcnh4eHgJQk5FCWJyYW5jaCBub3QtZXF1YWwKKyAgN0R4eAkJQk5DCWJyYW5jaCBub3QtY29uZGl0aW9uCisgIEZEeHh4eHh4CUJOQwlicmFuY2ggbm90LWNvbmRpdGlvbiAobG9uZykKKyAgQjBBcnh4eHgJQkxUWglicmFuY2ggbGVzcy10aGFuLXplcm8KKyAgQjBDcnh4eHgJQkxFWglicmFuY2ggbGVzcy1lcXVhbC16ZXJvCisgIDdFeHgJCUJMCWJyYW5jaCBhbmQgbGluaworICBGRXh4eHh4eAlCTAlicmFuY2ggYW5kIGxpbmsgKGxvbmcpCisgIEIwRHJ4eHh4CUJHVFoJYnJhbmNoIGdyZWF0ZXItdGhhbi16ZXJvCisgIEIwQnJ4eHh4CUJHRVoJYnJhbmNoIGdyZWF0ZXItZXF1YWwtemVybworICBCMDhyeHh4eAlCRVFaCWJyYW5jaCBlcXVhbC16ZXJvCisgIEJyMHJ4eHh4CUJFUQlicmFuY2ggZXF1YWwKKyAgN0N4eAkJQkMJYnJhbmNoIGNvbmRpdGlvbgorICBGQ3h4eHh4eAlCQwlicmFuY2ggY29uZGl0aW9uIChsb25nKQorICAqLworCitzdGF0aWMgaW50IAoraXNTaG9ydEJyYW5jaChpbnN0cikKKyAgICAgdW5zaWduZWQgY2hhciAqaW5zdHI7Cit7CisgIHVuc2lnbmVkIGNoYXIgaW5zdHIwID0gaW5zdHJbMF0gJiAweDdGOwkJLyogbWFzayBvZmYgaGlnaCBiaXQgKi8KKworICBpZiAoaW5zdHIwID09IDB4MTAgJiYgaW5zdHJbMV0gPT0gMHhCNikJLyogUlRFICovCisgICAgcmV0dXJuIDE7CQkvKiByZXR1cm4gZnJvbSB0cmFwIG9yIGV4Y2VwdGlvbiAqLworCisgIGlmIChpbnN0cjAgPT0gMHgxRSB8fCBpbnN0cjAgPT0gMHgxRikJCS8qIEpMIG9yIEpNUCAqLworICAgIGlmICgoaW5zdHJbMV0gJiAweEYwKSA9PSAweEMwKQorICAgICAgcmV0dXJuIDI7CQkJCQkvKiBqdW1wIHRocnUgYSByZWdpc3RlciAqLworCisgIGlmIChpbnN0cjAgPT0gMHg3QyB8fCBpbnN0cjAgPT0gMHg3RCB8fCAJLyogQkMsIEJOQywgQkwsIEJSQSAqLworICAgICAgaW5zdHIwID09IDB4N0UgfHwgaW5zdHIwID09IDB4N0YpCisgICAgcmV0dXJuIDM7CQkJCQkvKiBlaWdodCBiaXQgUEMgb2Zmc2V0ICovCisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lzTG9uZ0JyYW5jaChpbnN0cikKKyAgICAgdW5zaWduZWQgY2hhciAqaW5zdHI7Cit7CisgIGlmIChpbnN0clswXSA9PSAweEZDIHx8IGluc3RyWzBdID09IDB4RkQgfHwJLyogQlJBLCBCTkMsIEJMLCBCQyAqLworICAgICAgaW5zdHJbMF0gPT0gMHhGRSB8fCBpbnN0clswXSA9PSAweEZGKQkvKiAyNCBiaXQgcmVsYXRpdmUgKi8KKyAgICByZXR1cm4gNDsKKyAgaWYgKChpbnN0clswXSAmIDB4RjApID09IDB4QjApCQkvKiAxNiBiaXQgcmVsYXRpdmUgKi8KKyAgICB7CisgICAgICBpZiAoKGluc3RyWzFdICYgMHhGMCkgPT0gMHgwMCB8fCAJCS8qIEJORSwgQkVRICovCisJICAoaW5zdHJbMV0gJiAweEYwKSA9PSAweDEwKQorCXJldHVybiA1OworICAgICAgaWYgKGluc3RyWzBdID09IDB4QjApCS8qIEJORVosIEJMVFosIEJMRVosIEJHVFosIEJHRVosIEJFUVogKi8KKwlpZiAoKGluc3RyWzFdICYgMHhGMCkgPT0gMHg4MCB8fCAoaW5zdHJbMV0gJiAweEYwKSA9PSAweDkwIHx8IAorCSAgICAoaW5zdHJbMV0gJiAweEYwKSA9PSAweEEwIHx8IChpbnN0clsxXSAmIDB4RjApID09IDB4QjAgfHwKKwkgICAgKGluc3RyWzFdICYgMHhGMCkgPT0gMHhDMCB8fCAoaW5zdHJbMV0gJiAweEYwKSA9PSAweEQwKQorCSAgcmV0dXJuIDY7CisgICAgfQorICByZXR1cm4gMDsKK30KKworLyogaWYgYWRkcmVzcyBpcyBOT1Qgb24gYSA0LWJ5dGUgYm91bmRhcnksIG9yIGhpZ2gtYml0IG9mIGluc3RyIGlzIHplcm8sIAorICAgdGhlbiBpdCdzIGEgMi1ieXRlIGluc3RydWN0aW9uLCBlbHNlIGl0J3MgYSA0LWJ5dGUgaW5zdHJ1Y3Rpb24uICAqLworCisjZGVmaW5lIElOU1RSVUNUSU9OX1NJWkUoYWRkcikgXAorICAgICgoKChpbnQpIGFkZHIgJiAyKSB8fCAoKCh1bnNpZ25lZCBjaGFyICopIGFkZHIpWzBdICYgMHg4MCkgPT0gMCkgPyAyIDogNCkKKworc3RhdGljIGludAoraXNCcmFuY2goaW5zdHIpCisgICAgIHVuc2lnbmVkIGNoYXIgKmluc3RyOworeworICBpZiAoSU5TVFJVQ1RJT05fU0laRShpbnN0cikgPT0gMikKKyAgICByZXR1cm4gaXNTaG9ydEJyYW5jaChpbnN0cik7CisgIGVsc2UKKyAgICByZXR1cm4gaXNMb25nQnJhbmNoKGluc3RyKTsKK30KKworc3RhdGljIGludAord2lsbEJyYW5jaChpbnN0ciwgYnJhbmNoQ29kZSkKKyAgICAgdW5zaWduZWQgY2hhciAqaW5zdHI7Cit7CisgIHN3aXRjaCAoYnJhbmNoQ29kZSkgCisgICAgeworICAgIGNhc2UgMDoJcmV0dXJuIDA7CS8qIG5vdCBhIGJyYW5jaCAqLworICAgIGNhc2UgMToJcmV0dXJuIDE7CS8qIFJURSAqLworICAgIGNhc2UgMjoJcmV0dXJuIDE7CS8qIEpMIG9yIEpNUCAgICAqLworICAgIGNhc2UgMzoJCQkvKiBCQywgQk5DLCBCTCwgQlJBIChzaG9ydCkgKi8KKyAgICBjYXNlIDQ6CQkJLyogQkMsIEJOQywgQkwsIEJSQSAobG9uZykgKi8KKyAgICAgIHN3aXRjaCAoaW5zdHJbMF0gJiAweDBGKSAKKwl7CisJY2FzZSAweEM6CQkvKiBCcmFuY2ggaWYgQ29uZGl0aW9uIFJlZ2lzdGVyICovCisJICByZXR1cm4gKHJlZ2lzdGVyc1tDQlJdICE9IDApOworCWNhc2UgMHhEOgkJLyogQnJhbmNoIGlmIE5PVCBDb25kaXRpb24gUmVnaXN0ZXIgKi8KKwkgIHJldHVybiAocmVnaXN0ZXJzW0NCUl0gPT0gMCk7CisJY2FzZSAweEU6CQkvKiBCcmFuY2ggYW5kIExpbmsgKi8KKwljYXNlIDB4RjoJCS8qIEJyYW5jaCAodW5jb25kaXRpb25hbCkgKi8KKwkgIHJldHVybiAxOworCWRlZmF1bHQ6CQkvKiBvb3BzPyAqLworCSAgcmV0dXJuIDA7CisJfQorICAgIGNhc2UgNTogCQkJLyogQk5FLCBCRVEgKi8KKyAgICAgIHN3aXRjaCAoaW5zdHJbMV0gJiAweEYwKSAKKwl7CisJY2FzZSAweDAwOgkJLyogQnJhbmNoIGlmIHIxIGVxdWFsIHRvIHIyICovCisJICByZXR1cm4gKHJlZ2lzdGVyc1tpbnN0clswXSAmIDB4MEZdID09IHJlZ2lzdGVyc1tpbnN0clsxXSAmIDB4MEZdKTsKKwljYXNlIDB4MTA6CQkvKiBCcmFuY2ggaWYgcjEgTk9UIGVxdWFsIHRvIHIyICovCisJICByZXR1cm4gKHJlZ2lzdGVyc1tpbnN0clswXSAmIDB4MEZdICE9IHJlZ2lzdGVyc1tpbnN0clsxXSAmIDB4MEZdKTsKKwlkZWZhdWx0OgkJLyogb29wcz8gKi8KKwkgIHJldHVybiAwOworCX0KKyAgICBjYXNlIDY6IAkJCS8qIEJORVosIEJMVFosIEJMRVosIEJHVFosIEJHRVogLEJFUVogKi8KKyAgICAgIHN3aXRjaCAoaW5zdHJbMV0gJiAweEYwKSAKKwl7CisJY2FzZSAweDgwOgkJLyogQnJhbmNoIGlmIHJlZyBlcXVhbCB0byB6ZXJvICovCisJICByZXR1cm4gKHJlZ2lzdGVyc1tpbnN0clsxXSAmIDB4MEZdID09IDApOworCWNhc2UgMHg5MDoJCS8qIEJyYW5jaCBpZiByZWcgTk9UIGVxdWFsIHRvIHplcm8gKi8KKwkgIHJldHVybiAocmVnaXN0ZXJzW2luc3RyWzFdICYgMHgwRl0gIT0gMCk7CisJY2FzZSAweEEwOgkJLyogQnJhbmNoIGlmIHJlZyBsZXNzIHRoYW4gemVybyAqLworCSAgcmV0dXJuIChyZWdpc3RlcnNbaW5zdHJbMV0gJiAweDBGXSA8IDApOworCWNhc2UgMHhCMDoJCS8qIEJyYW5jaCBpZiByZWcgZ3JlYXRlciBvciBlcXVhbCB0byB6ZXJvICovCisJICByZXR1cm4gKHJlZ2lzdGVyc1tpbnN0clsxXSAmIDB4MEZdID49IDApOworCWNhc2UgMHhDMDoJCS8qIEJyYW5jaCBpZiByZWcgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8gKi8KKwkgIHJldHVybiAocmVnaXN0ZXJzW2luc3RyWzFdICYgMHgwRl0gPD0gMCk7CisJY2FzZSAweEQwOgkJLyogQnJhbmNoIGlmIHJlZyBncmVhdGVyIHRoYW4gemVybyAqLworCSAgcmV0dXJuIChyZWdpc3RlcnNbaW5zdHJbMV0gJiAweDBGXSA+IDApOworCWRlZmF1bHQ6CQkvKiBvb3BzPyAqLworCSAgcmV0dXJuIDA7CisJfQorICAgIGRlZmF1bHQ6CQkJLyogb29wcz8gKi8KKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIGludCAKK2JyYW5jaERlc3RpbmF0aW9uKGluc3RyLCBicmFuY2hDb2RlKSAKKyAgICAgdW5zaWduZWQgY2hhciAqaW5zdHI7Cit7IAorICBzd2l0Y2ggKGJyYW5jaENvZGUpIHsgCisgIGRlZmF1bHQ6IAorICBjYXNlIDA6CQkJCQkvKiBub3QgYSBicmFuY2ggKi8gCisgICAgcmV0dXJuIDA7CisgIGNhc2UgMToJCQkJCS8qIFJURSAqLyAKKyAgICByZXR1cm4gcmVnaXN0ZXJzW0JQQ10gJiB+MzsgCQkvKiBwb3AgQlBDIGludG8gUEMgKi8KKyAgY2FzZSAyOiAJCQkJCS8qIEpMIG9yIEpNUCAqLyAKKyAgICByZXR1cm4gcmVnaXN0ZXJzW2luc3RyWzFdICYgMHgwRl0gJiB+MzsJLyoganVtcCB0aHJ1IGEgcmVnaXN0ZXIgKi8gCisgIGNhc2UgMzogCQkvKiBCQywgQk5DLCBCTCwgQlJBIChzaG9ydCwgOC1iaXQgcmVsYXRpdmUgb2Zmc2V0KSAqLyAKKyAgICByZXR1cm4gKCgoaW50KSBpbnN0cikgJiB+MykgKyAoKHVuc2lnbmVkIGNoYXIpIGluc3RyWzFdIDw8IDIpOworICBjYXNlIDQ6IAkJLyogQkMsIEJOQywgQkwsIEJSQSAobG9uZywgMjQtYml0IHJlbGF0aXZlIG9mZnNldCkgKi8gCisgICAgcmV0dXJuICgoaW50KSBpbnN0ciArIAorCSAgICAoKCgodW5zaWduZWQgY2hhcikgaW5zdHJbMV0gPDwgMTYpIHwgKGluc3RyWzJdIDw8IDgpIHwgKGluc3RyWzNdKSkgPDwgMikpOyAKKyAgY2FzZSA1OiAJCS8qIEJORSwgQkVRICgxNi1iaXQgcmVsYXRpdmUgb2Zmc2V0KSAqLyAKKyAgY2FzZSA2OiAJCS8qIEJORVosIEJMVFosIEJMRVosIEJHVFosIEJHRVogLEJFUVogKGRpdHRvKSAqLyAKKyAgICByZXR1cm4gKChpbnQpIGluc3RyICsgKCgoKHVuc2lnbmVkIGNoYXIpIGluc3RyWzJdIDw8IDgpIHwgKGluc3RyWzNdKSkgPDwgMikpOyAKKyAgfQorCisgIC8qIEFuIGV4cGxhbmF0b3J5IG5vdGU6IGluIHRoZSBsYXN0IHRocmVlIHJldHVybiBleHByZXNzaW9ucywgSSBoYXZlCisgICAgIGNhc3QgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYnl0ZSBvZiB0aGUgcmV0dXJuIG9mZnNldCB0byBjaGFyLgorICAgICBXaGF0IHRoaXMgYWNjb21wbGlzaGVzIGlzIHNpZ24gZXh0ZW5zaW9uLiAgSWYgdGhlIG90aGVyCisgICAgIGxlc3Mtc2lnbmlmaWNhbnQgYnl0ZXMgd2VyZSBzaWduZWQgYXMgd2VsbCwgdGhleSB3b3VsZCBnZXQgc2lnbgorICAgICBleHRlbmRlZCB0b28gYW5kLCBpZiBuZWdhdGl2ZSwgdGhlaXIgbGVhZGluZyBiaXRzIHdvdWxkIGNsb2JiZXIKKyAgICAgdGhlIGJpdHMgb2YgdGhlIG1vcmUtc2lnbmlmaWNhbnQgYnl0ZXMgYWhlYWQgb2YgdGhlbS4gIFRoZXJlIGFyZQorICAgICBvdGhlciB3YXlzIEkgY291bGQgaGF2ZSBkb25lIHRoaXMsIGJ1dCBzaWduIGV4dGVuc2lvbiBmcm9tCisgICAgIG9kZC1zaXplZCBpbnRlZ2VycyBpcyBhbHdheXMgYSBwYWluLiAqLworfQorCitzdGF0aWMgdm9pZAorYnJhbmNoU2lkZUVmZmVjdHMoaW5zdHIsIGJyYW5jaENvZGUpCisgICAgIHVuc2lnbmVkIGNoYXIgKmluc3RyOworICAgICBpbnQgYnJhbmNoQ29kZTsKK3sKKyAgc3dpdGNoIChicmFuY2hDb2RlKQorICAgIHsKKyAgICBjYXNlIDE6CQkJLyogUlRFICovCisgICAgICByZXR1cm47CQkJLyogSSA8VEhJTks+IHRoaXMgaXMgYWxyZWFkeSBoYW5kbGVkLi4uICovCisgICAgY2FzZSAyOgkJCS8qIEpMIChvciBKTVApICovCisgICAgY2FzZSAzOgkJCS8qIEJMIChvciBCQywgQk5DLCBCUkEpICovCisgICAgY2FzZSA0OgorICAgICAgaWYgKChpbnN0clswXSAmIDB4MEYpID09IDB4MEUpCQkvKiBicmFuY2gvanVtcCBhbmQgbGluayAqLworCXJlZ2lzdGVyc1tSMTRdID0gKHJlZ2lzdGVyc1tQQ10gJiB+MykgKyA0OworICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CQkJLyogYW55IG90aGVyIGJyYW5jaCBoYXMgbm8gc2lkZSBlZmZlY3RzICovCisgICAgICByZXR1cm47CisgICAgfQorfQorCitzdGF0aWMgc3RydWN0IFNURVBQSU5HX0NPTlRFWFQgeworICBpbnQgc3RlcHBpbmc7CQkJLyogdHJ1ZSB3aGVuIHdlJ3ZlIHN0YXJ0ZWQgYSBzaW5nbGUtc3RlcCAqLworICB1bnNpZ25lZCBsb25nICB0YXJnZXRfYWRkcjsJLyogdGhlIGluc3RyIHdlJ3JlIHRyeWluZyB0byBleGVjdXRlICovCisgIHVuc2lnbmVkIGxvbmcgIHRhcmdldF9zaXplOwkvKiB0aGUgc2l6ZSBvZiB0aGUgdGFyZ2V0IGluc3RyICovCisgIHVuc2lnbmVkIGxvbmcgIG5vb3BfYWRkcjsJLyogd2hlcmUgd2UndmUgaW5zZXJ0ZWQgYSBuby1vcCwgaWYgYW55ICovCisgIHVuc2lnbmVkIGxvbmcgIHRyYXAxX2FkZHI7CS8qIHRoZSB0cmFwIGZvbGxvd2luZyB0aGUgdGFyZ2V0IGluc3RyICovCisgIHVuc2lnbmVkIGxvbmcgIHRyYXAyX2FkZHI7CS8qIHRoZSB0cmFwIGF0IGEgYnJhbmNoIGRlc3RpbmF0aW9uLCBpZiBhbnkgKi8KKyAgdW5zaWduZWQgc2hvcnQgbm9vcF9zYXZlOwkvKiBpbnN0cnVjdGlvbiBvdmVyd3JpdHRlbiBieSBvdXIgbm8tb3AgKi8KKyAgdW5zaWduZWQgc2hvcnQgdHJhcDFfc2F2ZTsJLyogaW5zdHJ1Y3Rpb24gb3ZlcndyaXR0ZW4gYnkgdHJhcDEgKi8KKyAgdW5zaWduZWQgc2hvcnQgdHJhcDJfc2F2ZTsJLyogaW5zdHJ1Y3Rpb24gb3ZlcndyaXR0ZW4gYnkgdHJhcDIgKi8KKyAgdW5zaWduZWQgc2hvcnQgY29udGludWVfcDsJLyogdHJ1ZSBpZiBOT1QgcmV0dXJuaW5nIHRvIGdkYiBhZnRlciBzdGVwICovCit9IHN0ZXBwaW5nOworCisvKiBGdW5jdGlvbjogcHJlcGFyZV90b19zdGVwCisgICBDYWxsZWQgZnJvbSBoYW5kbGVfZXhjZXB0aW9uIHRvIHByZXBhcmUgdGhlIHVzZXIgcHJvZ3JhbSB0byBzaW5nbGUtc3RlcC4KKyAgIFBsYWNlcyBhIHRyYXAgaW5zdHJ1Y3Rpb24gYWZ0ZXIgdGhlIHRhcmdldCBpbnN0cnVjdGlvbiwgd2l0aCBzcGVjaWFsIAorICAgZXh0cmEgaGFuZGxpbmcgZm9yIGJyYW5jaCBpbnN0cnVjdGlvbnMgYW5kIGZvciBpbnN0cnVjdGlvbnMgaW4gdGhlIAorICAgc2Vjb25kIGhhbGYtd29yZCBvZiBhIHdvcmQuICAKKworICAgUmV0dXJuczogVHJ1ZSAgaWYgd2Ugc2hvdWxkIGFjdHVhbGx5IGV4ZWN1dGUgdGhlIGluc3RydWN0aW9uOyAKKwkgICAgRmFsc2UgaWYgd2UgYXJlIGdvaW5nIHRvIGVtdWxhdGUgZXhlY3V0aW5nIHRoZSBpbnN0cnVjdGlvbiwKKwkgICAgaW4gd2hpY2ggY2FzZSB3ZSBzaW1wbHkgcmVwb3J0IHRvIEdEQiB0aGF0IHRoZSBpbnN0cnVjdGlvbiAKKwkgICAgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZC4gICovCisKKyNkZWZpbmUgVFJBUDEgIDB4MTBmMTsJLyogdHJhcCAjMSBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBOT09QICAgMHg3MDAwOyAgLyogbm9vcCAgICBpbnN0cnVjdGlvbiAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdHJhcDEgPSBUUkFQMTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub29wICA9IE5PT1A7CisKK3N0YXRpYyBpbnQKK3ByZXBhcmVfdG9fc3RlcChjb250aW51ZV9wKQorICAgICBpbnQgY29udGludWVfcDsJLyogaWYgdGhpcyBpc24ndCBSRUFMTFkgYSBzaW5nbGUtc3RlcCAoc2VlIGJlbG93KSAqLworeworICB1bnNpZ25lZCBsb25nIHBjID0gcmVnaXN0ZXJzW1BDXTsKKyAgaW50IGJyYW5jaENvZGUgICA9IGlzQnJhbmNoKCh1bnNpZ25lZCBjaGFyICopIHBjKTsKKyAgdW5zaWduZWQgY2hhciAqcDsKKworICAvKiB6ZXJvIG91dCB0aGUgc3RlcHBpbmcgY29udGV4dCAKKyAgICAgKHBhcmFub2lhIC0tIGl0IHNob3VsZCBhbHJlYWR5IGJlIHplcm9lZCkgKi8KKyAgZm9yIChwID0gKHVuc2lnbmVkIGNoYXIgKikgJnN0ZXBwaW5nOworICAgICAgIHAgPCAoKHVuc2lnbmVkIGNoYXIgKikgJnN0ZXBwaW5nKSArIHNpemVvZihzdGVwcGluZyk7CisgICAgICAgcCsrKQorICAgICpwID0gMDsKKworICBpZiAoYnJhbmNoQ29kZSAhPSAwKQkJCS8qIG5leHQgaW5zdHJ1Y3Rpb24gaXMgYSBicmFuY2ggKi8KKyAgICB7CisgICAgICBicmFuY2hTaWRlRWZmZWN0cygodW5zaWduZWQgY2hhciAqKSBwYywgYnJhbmNoQ29kZSk7CisgICAgICBpZiAod2lsbEJyYW5jaCgodW5zaWduZWQgY2hhciAqKXBjLCBicmFuY2hDb2RlKSkKKwlyZWdpc3RlcnNbUENdID0gYnJhbmNoRGVzdGluYXRpb24oKHVuc2lnbmVkIGNoYXIgKikgcGMsIGJyYW5jaENvZGUpOworICAgICAgZWxzZQorCXJlZ2lzdGVyc1tQQ10gPSBwYyArIElOU1RSVUNUSU9OX1NJWkUocGMpOworICAgICAgcmV0dXJuIDA7CQkJLyogYnJhbmNoICJleGVjdXRlZCIgLS0ganVzdCBub3RpZnkgR0RCICovCisgICAgfQorICBlbHNlIGlmICgoKGludCkgcGMgJiAyKSAhPSAwKQkJLyogInNlY29uZC1zbG90IiBpbnN0cnVjdGlvbiAqLworICAgIHsKKyAgICAgIC8qIGluc2VydCBuby1vcCBiZWZvcmUgcGMgKi8KKyAgICAgIHN0ZXBwaW5nLm5vb3BfYWRkciAgPSAgcGMgLSAyOworICAgICAgc3RlcHBpbmcubm9vcF9zYXZlICA9ICoodW5zaWduZWQgc2hvcnQgKikgc3RlcHBpbmcubm9vcF9hZGRyOworICAgICAgKih1bnNpZ25lZCBzaG9ydCAqKSBzdGVwcGluZy5ub29wX2FkZHIgID0gbm9vcDsKKyAgICAgIC8qIGluc2VydCB0cmFwICBhZnRlciAgcGMgKi8KKyAgICAgIHN0ZXBwaW5nLnRyYXAxX2FkZHIgPSAgcGMgKyAyOworICAgICAgc3RlcHBpbmcudHJhcDFfc2F2ZSA9ICoodW5zaWduZWQgc2hvcnQgKikgc3RlcHBpbmcudHJhcDFfYWRkcjsKKyAgICAgICoodW5zaWduZWQgc2hvcnQgKikgc3RlcHBpbmcudHJhcDFfYWRkciA9IHRyYXAxOworICAgIH0KKyAgZWxzZQkJCQkJLyogImZpcnN0LXNsb3QiIGluc3RydWN0aW9uICovCisgICAgeworICAgICAgLyogaW5zZXJ0IHRyYXAgIGFmdGVyICBwYyAqLworICAgICAgc3RlcHBpbmcudHJhcDFfYWRkciA9IHBjICsgSU5TVFJVQ1RJT05fU0laRShwYyk7CQorICAgICAgc3RlcHBpbmcudHJhcDFfc2F2ZSA9ICoodW5zaWduZWQgc2hvcnQgKikgc3RlcHBpbmcudHJhcDFfYWRkcjsKKyAgICAgICoodW5zaWduZWQgc2hvcnQgKikgc3RlcHBpbmcudHJhcDFfYWRkciA9IHRyYXAxOworICAgIH0KKyAgLyogImNvbnRpbnVlX3AiIG1lYW5zIHRoYXQgd2UgYXJlIGFjdHVhbGx5IGRvaW5nIGEgY29udGludWUsIGFuZCBub3QgCisgICAgIGJlaW5nIHJlcXVlc3RlZCB0byBzaW5nbGUtc3RlcCBieSBHREIuICBTb21ldGltZXMgd2UgaGF2ZSB0byBkbworICAgICBvbmUgc2luZ2xlLXN0ZXAgYmVmb3JlIGNvbnRpbnVpbmcsIGJlY2F1c2UgdGhlIFBDIGlzIG9uIGEgaGFsZi13b3JkCisgICAgIGJvdW5kYXJ5LiAgVGhlcmUncyBubyB3YXkgdG8gc2ltcGx5IHJlc3VtZSBhdCBzdWNoIGFuIGFkZHJlc3MuICAqLworICBzdGVwcGluZy5jb250aW51ZV9wID0gY29udGludWVfcDsKKyAgc3RlcHBpbmcuc3RlcHBpbmcgPSAxOwkJLyogc3RhcnRpbmcgYSBzaW5nbGUtc3RlcCAqLworICByZXR1cm4gMTsKK30KKworLyogRnVuY3Rpb246IGZpbmlzaF9mcm9tX3N0ZXAKKyAgIENhbGxlZCBmcm9tIGhhbmRsZV9leGNlcHRpb24gdG8gZmluaXNoIHVwIHdoZW4gdGhlIHVzZXIgcHJvZ3JhbSAKKyAgIHJldHVybnMgZnJvbSBhIHNpbmdsZS1zdGVwLiAgUmVwbGFjZXMgdGhlIGluc3RydWN0aW9ucyB0aGF0IGhhZAorICAgYmVlbiBvdmVyd3JpdHRlbiBieSB0cmFwcyBvciBuby1vcHMsIAorCisgICBSZXR1cm5zOiBUcnVlICBpZiB3ZSBzaG91bGQgbm90aWZ5IEdEQiB0aGF0IHRoZSB0YXJnZXQgc3RvcHBlZC4KKwkgICAgRmFsc2UgaWYgd2Ugb25seSBzaW5nbGUtc3RlcHBlZCBiZWNhdXNlIHdlIGhhZCB0byBiZWZvcmUgd2UKKwkgICAgY291bGQgY29udGludWUgKGllLiB3ZSB3ZXJlIHRyeWluZyB0byBjb250aW51ZSBhdCBhIAorCSAgICBoYWxmLXdvcmQgYm91bmRhcnkpLiAgSW4gdGhhdCBjYXNlIGRvbid0IG5vdGlmeSBHREI6CisJICAgIGp1c3QgImNvbnRpbnVlIGNvbnRpbnVpbmciLiAgKi8KKworc3RhdGljIGludAorZmluaXNoX2Zyb21fc3RlcCgpCit7CisgIGlmIChzdGVwcGluZy5zdGVwcGluZykJLyogYW55dGhpbmcgdG8gZG8/ICovCisgICAgeworICAgICAgaW50IGNvbnRpbnVlX3AgPSBzdGVwcGluZy5jb250aW51ZV9wOworICAgICAgdW5zaWduZWQgY2hhciAqcDsKKworICAgICAgaWYgKHN0ZXBwaW5nLm5vb3BfYWRkcikJLyogcmVwbGFjZSBpbnN0ciAidW5kZXIiIG91ciBuby1vcCAqLworCSoodW5zaWduZWQgc2hvcnQgKikgc3RlcHBpbmcubm9vcF9hZGRyICA9IHN0ZXBwaW5nLm5vb3Bfc2F2ZTsKKyAgICAgIGlmIChzdGVwcGluZy50cmFwMV9hZGRyKQkvKiByZXBsYWNlIGluc3RyICJ1bmRlciIgb3VyIHRyYXAgICovCisJKih1bnNpZ25lZCBzaG9ydCAqKSBzdGVwcGluZy50cmFwMV9hZGRyID0gc3RlcHBpbmcudHJhcDFfc2F2ZTsKKyAgICAgIGlmIChzdGVwcGluZy50cmFwMl9hZGRyKSAgLyogZGl0dG8gb3VyIG90aGVyIHRyYXAsIGlmIGFueSAgICAqLworCSoodW5zaWduZWQgc2hvcnQgKikgc3RlcHBpbmcudHJhcDJfYWRkciA9IHN0ZXBwaW5nLnRyYXAyX3NhdmU7CisKKyAgICAgIGZvciAocCA9ICh1bnNpZ25lZCBjaGFyICopICZzdGVwcGluZzsJLyogemVybyBvdXQgdGhlIHN0ZXBwaW5nIGNvbnRleHQgKi8KKwkgICBwIDwgKCh1bnNpZ25lZCBjaGFyICopICZzdGVwcGluZykgKyBzaXplb2Yoc3RlcHBpbmcpOworCSAgIHArKykKKwkqcCA9IDA7CisKKyAgICAgIHJldHVybiAhKGNvbnRpbnVlX3ApOworICAgIH0KKyAgZWxzZSAJLyogd2UgZGlkbid0IHNpbmdsZS1zdGVwLCB0aGVyZWZvcmUgdGhpcyBtdXN0IGJlIGEgbGVnaXRpbWF0ZSBzdG9wICovCisgICAgcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBQU1dyZWcgewkJLyogc2VwYXJhdGUgb3V0IHRoZSBiaXQgZmxhZ3MgaW4gdGhlIFBTVyByZWdpc3RlciAqLworICBpbnQgcGFkMSA6IDE2OworICBpbnQgYnNtICA6IDE7CisgIGludCBiaWUgIDogMTsKKyAgaW50IHBhZDIgOiA1OworICBpbnQgYmMgICA6IDE7CisgIGludCBzbSAgIDogMTsKKyAgaW50IGllICAgOiAxOworICBpbnQgcGFkMyA6IDU7CisgIGludCBjICAgIDogMTsKK30gKnBzdzsKKworLyogVXBvbiBlbnRyeSB0aGUgdmFsdWUgZm9yIExSIHRvIHNhdmUgaGFzIGJlZW4gcHVzaGVkLgorICAgV2UgdW5wdXNoIHRoYXQgc28gdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSBzdGFjayBwb2ludGVyIHNhdmVkIGlzIGNvcnJlY3QuCisgICBVcG9uIGVudHJ5LCBhbGwgb3RoZXIgcmVnaXN0ZXJzIGFyZSBhc3N1bWVkIHRvIGhhdmUgbm90IGJlZW4gbW9kaWZpZWQKKyAgIHNpbmNlIHRoZSBpbnRlcnJ1cHQvdHJhcCBvY2N1cmVkLiAgKi8KKworYXNtICgiCitzdGFzaF9yZWdpc3RlcnM6CisJcHVzaCByMAorCXB1c2ggcjEKKwlzZXRoIHIxLCAjc2hpZ2gocmVnaXN0ZXJzKQorCWFkZDMgcjEsIHIxLCAjbG93KHJlZ2lzdGVycykKKwlwb3AgcjAJCTsgcjEKKwlzdCByMCwgQCg0LHIxKQorCXBvcCByMAkJOyByMAorCXN0IHIwLCBAcjEKKwlhZGRpIHIxLCAjNAk7IG9ubHkgYWRkIDQgYXMgc3Vic2VxdWVudCBzYXZlcyBhcmUgYHByZSBpbmMnCisJc3QgcjIsIEArcjEKKwlzdCByMywgQCtyMQorCXN0IHI0LCBAK3IxCisJc3QgcjUsIEArcjEKKwlzdCByNiwgQCtyMQorCXN0IHI3LCBAK3IxCisJc3QgcjgsIEArcjEKKwlzdCByOSwgQCtyMQorCXN0IHIxMCwgQCtyMQorCXN0IHIxMSwgQCtyMQorCXN0IHIxMiwgQCtyMQorCXN0IHIxMywgQCtyMSAgICA7IGZwCisJcG9wIHIwCQk7IGxyIChyMTQpCisJc3QgcjAsIEArcjEKKwlzdCBzcCwgQCtyMQk7IHNwIGNvbnRhaW5zIHJpZ2h0IHZhbHVlIGF0IHRoaXMgcG9pbnQKKwltdmZjIHIwLCBjcjAKKwlzdCByMCwgQCtyMQk7IGNyMCA9PSBQU1cKKwltdmZjIHIwLCBjcjEKKwlzdCByMCwgQCtyMQk7IGNyMSA9PSBDQlIKKwltdmZjIHIwLCBjcjIKKwlzdCByMCwgQCtyMQk7IGNyMiA9PSBTUEkKKwltdmZjIHIwLCBjcjMKKwlzdCByMCwgQCtyMQk7IGNyMyA9PSBTUFUKKwltdmZjIHIwLCBjcjYKKwlzdCByMCwgQCtyMQk7IGNyNiA9PSBCUEMKKwlzdCByMCwgQCtyMQk7IFBDICA9PSBCUEMKKwltdmZhY2xvIHIwCisJc3QgcjAsIEArcjEJOyBBQ0NMCisJbXZmYWNoaSByMAorCXN0IHIwLCBAK3IxCTsgQUNDSAorCWptcCBsciIpOworCisvKiBDIHJvdXRpbmUgdG8gY2xlYW4gdXAgd2hhdCBzdGFzaF9yZWdpc3RlcnMgZGlkLgorICAgSXQgaXMgY2FsbGVkIGFmdGVyIGNhbGxpbmcgc3Rhc2hfcmVnaXN0ZXJzLgorICAgVGhpcyBpcyBzZXBhcmF0ZSBmcm9tIHN0YXNoX3JlZ2lzdGVycyBhcyB3ZSB3YW50IHRvIGRvIHRoaXMgaW4gQworICAgYnV0IGRvaW5nIHN0YXNoX3JlZ2lzdGVycyBpbiBDIGlzbid0IHN0cmFpZ2h0Zm9yd2FyZC4gICovCisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX3N0YXNoICgpCit7CisgIHBzdyA9IChzdHJ1Y3QgUFNXcmVnICopICZyZWdpc3RlcnNbUFNXXTsJLyogZmllbGRzIG9mIFBTVyByZWdpc3RlciAqLworICBwc3ctPnNtID0gcHN3LT5ic207CQkvKiBmaXggdXAgcHJlLXRyYXAgdmFsdWVzIG9mIHBzdyBmaWVsZHMgKi8KKyAgcHN3LT5pZSA9IHBzdy0+YmllOworICBwc3ctPmMgID0gcHN3LT5iYzsKKyAgcmVnaXN0ZXJzW0NCUl0gPSBwc3ctPmJjOwkJLyogZml4IHVwIHByZS10cmFwICJDIiByZWdpc3RlciAqLworCisjaWYgMCAvKiBGSVhNRTogV2FzIGluIHByZXZpb3VzIHZlcnNpb24uICBOZWNlc3Nhcnk/CisJIChSZW1lbWJlciB0aGF0IHdlIHVzZSB0aGUgInJ0ZSIgaW5zbiB0byByZXR1cm4gZnJvbSB0aGUKKwkgdHJhcC9pbnRlcnJ1cHQgc28gdGhlIHZhbHVlcyBvZiBic20sIGJpZSwgYmMgYXJlIGltcG9ydGFudC4gICovCisgIHBzdy0+YnNtID0gcHN3LT5iaWUgPSBwc3ctPmJjID0gMDsJLyogemVybyBwb3N0LXRyYXAgdmFsdWVzICovCisjZW5kaWYKKworICAvKiBGSVhNRTogQ29waWVkIGZyb20gcHJldmlvdXMgdmVyc2lvbi4gIFRoaXMgY2FuIHByb2JhYmx5IGJlIGRlbGV0ZWQKKyAgICAgc2luY2UgbWV0aGlua3Mgc3Rhc2hfcmVnaXN0ZXJzIGhhcyBhbHJlYWR5IGRvbmUgdGhpcy4gICovCisgIHJlZ2lzdGVyc1tQQ10gPSByZWdpc3RlcnNbQlBDXTsJLyogcHJlLXRyYXAgUEMgKi8KKworICAvKiBGSVhNRTogQ29waWVkIGZyb20gcHJldmlvdXMgdmVyc2lvbi4gIE5lY2Vzc2FyeT8gICovCisgIGlmIChwc3ctPnNtKQkJCS8qIGNvcHkgUjE1IGludG8gKHBzdy0+c20gPyBTUFUgOiBTUEkpICovCisgICAgcmVnaXN0ZXJzW1NQVV0gPSByZWdpc3RlcnNbUjE1XTsKKyAgZWxzZQorICAgIHJlZ2lzdGVyc1tTUEldID0gcmVnaXN0ZXJzW1IxNV07Cit9CisKK2FzbSAoIgorcmVzdG9yZV9hbmRfcmV0dXJuOgorCXNldGggcjAsICNzaGlnaChyZWdpc3RlcnMrOCkKKwlhZGQzIHIwLCByMCwgI2xvdyhyZWdpc3RlcnMrOCkKKwlsZCByMiwgQHIwKwk7IHJlc3RvcmUgcjIKKwlsZCByMywgQHIwKwk7IHJlc3RvcmUgcjMKKwlsZCByNCwgQHIwKwk7IHJlc3RvcmUgcjQKKwlsZCByNSwgQHIwKwk7IHJlc3RvcmUgcjUKKwlsZCByNiwgQHIwKwk7IHJlc3RvcmUgcjYKKwlsZCByNywgQHIwKwk7IHJlc3RvcmUgcjcKKwlsZCByOCwgQHIwKwk7IHJlc3RvcmUgcjgKKwlsZCByOSwgQHIwKwk7IHJlc3RvcmUgcjkKKwlsZCByMTAsIEByMCsJOyByZXN0b3JlIHIxMAorCWxkIHIxMSwgQHIwKwk7IHJlc3RvcmUgcjExCisJbGQgcjEyLCBAcjArCTsgcmVzdG9yZSByMTIKKwlsZCByMTMsIEByMCsJOyByZXN0b3JlIHIxMworCWxkIHIxNCwgQHIwKwk7IHJlc3RvcmUgcjE0CisJbGQgcjE1LCBAcjArCTsgcmVzdG9yZSByMTUKKwlsZCByMSwgQHIwKwk7IHJlc3RvcmUgY3IwID09IFBTVworCW12dGMgcjEsIGNyMAorCWxkIHIxLCBAcjArCTsgcmVzdG9yZSBjcjEgPT0gQ0JSIChuby1vcCwgYmVjYXVzZSBpdCdzIHJlYWQgb25seSkKKwltdnRjIHIxLCBjcjEKKwlsZCByMSwgQHIwKwk7IHJlc3RvcmUgY3IyID09IFNQSQorCW12dGMgcjEsIGNyMgorCWxkIHIxLCBAcjArCTsgcmVzdG9yZSBjcjMgPT0gU1BVCisJbXZ0YyByMSwgY3IzCisJYWRkaSByMCwgIzQJOyBza2lwIEJQQworCWxkIHIxLCBAcjArCTsgcmVzdG9yZSBjcjYgKEJQQykgPT0gUEMKKwltdnRjIHIxLCBjcjYKKwlsZCByMSwgQHIwKwk7IHJlc3RvcmUgQUNDTAorCW12dGFjbG8gcjEKKwlsZCByMSwgQHIwKwk7IHJlc3RvcmUgQUNDSAorCW12dGFjaGkgcjEKKwlzZXRoIHIwLCAjc2hpZ2gocmVnaXN0ZXJzKQorCWFkZDMgcjAsIHIwLCAjbG93KHJlZ2lzdGVycykKKwlsZCByMSwgQCg0LHIwKQk7IHJlc3RvcmUgcjEKKwlsZCByMCwgQHIwCTsgcmVzdG9yZSByMAorCXJ0ZSIpOworCisvKiBHZW5lcmFsIHRyYXAgaGFuZGxlciwgY2FsbGVkIGFmdGVyIHRoZSByZWdpc3RlcnMgaGF2ZSBiZWVuIHN0YXNoZWQuCisgICBOVU0gaXMgdGhlIHRyYXAvZXhjZXB0aW9uIG51bWJlci4gICovCisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX2V4Y2VwdGlvbiAobnVtKQorICAgICBpbnQgbnVtOworeworICBjbGVhbnVwX3N0YXNoICgpOworICBhc20gdm9sYXRpbGUgKCIKKwlzZXRoIHIxLCAjc2hpZ2goc3RhY2tQdHIpCisJYWRkMyByMSwgcjEsICNsb3coc3RhY2tQdHIpCisJbGQgcjE1LCBAcjEJCTsgc2V0dXAgbG9jYWwgc3RhY2sgKHByb3RlY3QgdXNlciBzdGFjaykKKwltdiByMCwgJTAKKwlibCBoYW5kbGVfZXhjZXB0aW9uCisJYmwgcmVzdG9yZV9hbmRfcmV0dXJuIgorCQk6IDogInIiIChudW0pIDogInIwIiwgInIxIik7Cit9CisKK3ZvaWQgX2NhdGNoRXhjZXB0aW9uMCAoKTsKKworYXNtICgiCitfY2F0Y2hFeGNlcHRpb24wOgorCXB1c2ggbHIKKwlibCBzdGFzaF9yZWdpc3RlcnMKKwk7IE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IHRoZSBwdXNoZWQgdmFsdWUgb2YgYGxyJyBoYXMgYmVlbiBwb3BwZWQKKwlsZGkgcjAsICMwCisJYmwgcHJvY2Vzc19leGNlcHRpb24iKTsKKwordm9pZCBfY2F0Y2hFeGNlcHRpb24xICgpOworCithc20gKCIKK19jYXRjaEV4Y2VwdGlvbjE6CisJcHVzaCBscgorCWJsIHN0YXNoX3JlZ2lzdGVycworCTsgTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgdGhlIHB1c2hlZCB2YWx1ZSBvZiBgbHInIGhhcyBiZWVuIHBvcHBlZAorCWJsIGNsZWFudXBfc3Rhc2gKKwlzZXRoIHIxLCAjc2hpZ2goc3RhY2tQdHIpCisJYWRkMyByMSwgcjEsICNsb3coc3RhY2tQdHIpCisJbGQgcjE1LCBAcjEJCTsgc2V0dXAgbG9jYWwgc3RhY2sgKHByb3RlY3QgdXNlciBzdGFjaykKKwlzZXRoIHIxLCAjc2hpZ2gocmVnaXN0ZXJzICsgMjEqNCkgOyBQQworCWFkZDMgcjEsIHIxLCAjbG93KHJlZ2lzdGVycyArIDIxKjQpCisJbGQgcjAsIEByMQorCWFkZGkgcjAsICMtNAkJOyBiYWNrIHVwIFBDIGZvciBicmVha3BvaW50IHRyYXAuCisJc3QgcjAsIEByMQkJOyBGSVhNRTogd2hhdCBhYm91dCBicCBpbiByaWdodCBzbG90PworCWxkaSByMCwgIzEKKwlibCBoYW5kbGVfZXhjZXB0aW9uCisJYmwgcmVzdG9yZV9hbmRfcmV0dXJuIik7CisKK3ZvaWQgX2NhdGNoRXhjZXB0aW9uMiAoKTsKKworYXNtICgiCitfY2F0Y2hFeGNlcHRpb24yOgorCXB1c2ggbHIKKwlibCBzdGFzaF9yZWdpc3RlcnMKKwk7IE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IHRoZSBwdXNoZWQgdmFsdWUgb2YgYGxyJyBoYXMgYmVlbiBwb3BwZWQKKwlsZGkgcjAsICMyCisJYmwgcHJvY2Vzc19leGNlcHRpb24iKTsKKwordm9pZCBfY2F0Y2hFeGNlcHRpb24zICgpOworCithc20gKCIKK19jYXRjaEV4Y2VwdGlvbjM6CisJcHVzaCBscgorCWJsIHN0YXNoX3JlZ2lzdGVycworCTsgTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgdGhlIHB1c2hlZCB2YWx1ZSBvZiBgbHInIGhhcyBiZWVuIHBvcHBlZAorCWxkaSByMCwgIzMKKwlibCBwcm9jZXNzX2V4Y2VwdGlvbiIpOworCit2b2lkIF9jYXRjaEV4Y2VwdGlvbjQgKCk7CisKK2FzbSAoIgorX2NhdGNoRXhjZXB0aW9uNDoKKwlwdXNoIGxyCisJYmwgc3Rhc2hfcmVnaXN0ZXJzCisJOyBOb3RlIHRoYXQgYXQgdGhpcyBwb2ludCB0aGUgcHVzaGVkIHZhbHVlIG9mIGBscicgaGFzIGJlZW4gcG9wcGVkCisJbGRpIHIwLCAjNAorCWJsIHByb2Nlc3NfZXhjZXB0aW9uIik7CisKK3ZvaWQgX2NhdGNoRXhjZXB0aW9uNSAoKTsKKworYXNtICgiCitfY2F0Y2hFeGNlcHRpb241OgorCXB1c2ggbHIKKwlibCBzdGFzaF9yZWdpc3RlcnMKKwk7IE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IHRoZSBwdXNoZWQgdmFsdWUgb2YgYGxyJyBoYXMgYmVlbiBwb3BwZWQKKwlsZGkgcjAsICM1CisJYmwgcHJvY2Vzc19leGNlcHRpb24iKTsKKwordm9pZCBfY2F0Y2hFeGNlcHRpb242ICgpOworCithc20gKCIKK19jYXRjaEV4Y2VwdGlvbjY6CisJcHVzaCBscgorCWJsIHN0YXNoX3JlZ2lzdGVycworCTsgTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgdGhlIHB1c2hlZCB2YWx1ZSBvZiBgbHInIGhhcyBiZWVuIHBvcHBlZAorCWxkaSByMCwgIzYKKwlibCBwcm9jZXNzX2V4Y2VwdGlvbiIpOworCit2b2lkIF9jYXRjaEV4Y2VwdGlvbjcgKCk7CisKK2FzbSAoIgorX2NhdGNoRXhjZXB0aW9uNzoKKwlwdXNoIGxyCisJYmwgc3Rhc2hfcmVnaXN0ZXJzCisJOyBOb3RlIHRoYXQgYXQgdGhpcyBwb2ludCB0aGUgcHVzaGVkIHZhbHVlIG9mIGBscicgaGFzIGJlZW4gcG9wcGVkCisJbGRpIHIwLCAjNworCWJsIHByb2Nlc3NfZXhjZXB0aW9uIik7CisKK3ZvaWQgX2NhdGNoRXhjZXB0aW9uOCAoKTsKKworYXNtICgiCitfY2F0Y2hFeGNlcHRpb244OgorCXB1c2ggbHIKKwlibCBzdGFzaF9yZWdpc3RlcnMKKwk7IE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IHRoZSBwdXNoZWQgdmFsdWUgb2YgYGxyJyBoYXMgYmVlbiBwb3BwZWQKKwlsZGkgcjAsICM4CisJYmwgcHJvY2Vzc19leGNlcHRpb24iKTsKKwordm9pZCBfY2F0Y2hFeGNlcHRpb245ICgpOworCithc20gKCIKK19jYXRjaEV4Y2VwdGlvbjk6CisJcHVzaCBscgorCWJsIHN0YXNoX3JlZ2lzdGVycworCTsgTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgdGhlIHB1c2hlZCB2YWx1ZSBvZiBgbHInIGhhcyBiZWVuIHBvcHBlZAorCWxkaSByMCwgIzkKKwlibCBwcm9jZXNzX2V4Y2VwdGlvbiIpOworCit2b2lkIF9jYXRjaEV4Y2VwdGlvbjEwICgpOworCithc20gKCIKK19jYXRjaEV4Y2VwdGlvbjEwOgorCXB1c2ggbHIKKwlibCBzdGFzaF9yZWdpc3RlcnMKKwk7IE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IHRoZSBwdXNoZWQgdmFsdWUgb2YgYGxyJyBoYXMgYmVlbiBwb3BwZWQKKwlsZGkgcjAsICMxMAorCWJsIHByb2Nlc3NfZXhjZXB0aW9uIik7CisKK3ZvaWQgX2NhdGNoRXhjZXB0aW9uMTEgKCk7CisKK2FzbSAoIgorX2NhdGNoRXhjZXB0aW9uMTE6CisJcHVzaCBscgorCWJsIHN0YXNoX3JlZ2lzdGVycworCTsgTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgdGhlIHB1c2hlZCB2YWx1ZSBvZiBgbHInIGhhcyBiZWVuIHBvcHBlZAorCWxkaSByMCwgIzExCisJYmwgcHJvY2Vzc19leGNlcHRpb24iKTsKKwordm9pZCBfY2F0Y2hFeGNlcHRpb24xMiAoKTsKKworYXNtICgiCitfY2F0Y2hFeGNlcHRpb24xMjoKKwlwdXNoIGxyCisJYmwgc3Rhc2hfcmVnaXN0ZXJzCisJOyBOb3RlIHRoYXQgYXQgdGhpcyBwb2ludCB0aGUgcHVzaGVkIHZhbHVlIG9mIGBscicgaGFzIGJlZW4gcG9wcGVkCisJbGRpIHIwLCAjMTIKKwlibCBwcm9jZXNzX2V4Y2VwdGlvbiIpOworCit2b2lkIF9jYXRjaEV4Y2VwdGlvbjEzICgpOworCithc20gKCIKK19jYXRjaEV4Y2VwdGlvbjEzOgorCXB1c2ggbHIKKwlibCBzdGFzaF9yZWdpc3RlcnMKKwk7IE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IHRoZSBwdXNoZWQgdmFsdWUgb2YgYGxyJyBoYXMgYmVlbiBwb3BwZWQKKwlsZGkgcjAsICMxMworCWJsIHByb2Nlc3NfZXhjZXB0aW9uIik7CisKK3ZvaWQgX2NhdGNoRXhjZXB0aW9uMTQgKCk7CisKK2FzbSAoIgorX2NhdGNoRXhjZXB0aW9uMTQ6CisJcHVzaCBscgorCWJsIHN0YXNoX3JlZ2lzdGVycworCTsgTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgdGhlIHB1c2hlZCB2YWx1ZSBvZiBgbHInIGhhcyBiZWVuIHBvcHBlZAorCWxkaSByMCwgIzE0CisJYmwgcHJvY2Vzc19leGNlcHRpb24iKTsKKwordm9pZCBfY2F0Y2hFeGNlcHRpb24xNSAoKTsKKworYXNtICgiCitfY2F0Y2hFeGNlcHRpb24xNToKKwlwdXNoIGxyCisJYmwgc3Rhc2hfcmVnaXN0ZXJzCisJOyBOb3RlIHRoYXQgYXQgdGhpcyBwb2ludCB0aGUgcHVzaGVkIHZhbHVlIG9mIGBscicgaGFzIGJlZW4gcG9wcGVkCisJbGRpIHIwLCAjMTUKKwlibCBwcm9jZXNzX2V4Y2VwdGlvbiIpOworCit2b2lkIF9jYXRjaEV4Y2VwdGlvbjE2ICgpOworCithc20gKCIKK19jYXRjaEV4Y2VwdGlvbjE2OgorCXB1c2ggbHIKKwlibCBzdGFzaF9yZWdpc3RlcnMKKwk7IE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IHRoZSBwdXNoZWQgdmFsdWUgb2YgYGxyJyBoYXMgYmVlbiBwb3BwZWQKKwlsZGkgcjAsICMxNgorCWJsIHByb2Nlc3NfZXhjZXB0aW9uIik7CisKK3ZvaWQgX2NhdGNoRXhjZXB0aW9uMTcgKCk7CisKK2FzbSAoIgorX2NhdGNoRXhjZXB0aW9uMTc6CisJcHVzaCBscgorCWJsIHN0YXNoX3JlZ2lzdGVycworCTsgTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgdGhlIHB1c2hlZCB2YWx1ZSBvZiBgbHInIGhhcyBiZWVuIHBvcHBlZAorCWxkaSByMCwgIzE3CisJYmwgcHJvY2Vzc19leGNlcHRpb24iKTsKKworCisvKiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHVwIGV4Y2VwdGlvbiBoYW5kbGVycyBmb3IgdHJhY2luZyBhbmQKKyAgIGJyZWFrcG9pbnRzICovCit2b2lkIAorc2V0X2RlYnVnX3RyYXBzKCkKK3sKKyAgLyogIGV4dGVybiB2b2lkIHJlbWNvbUhhbmRsZXIoKTsgKi8KKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IDE4OyBpKyspCQkvKiBrZWVwIGEgY29weSBvZiBvbGQgdmVjdG9ycyAqLworICAgIGlmIChzYXZlX3ZlY3RvcnNbaV0gPT0gMCkJCS8qIG9ubHkgY29weSB0aGVtIHRoZSBmaXJzdCB0aW1lICovCisgICAgICBzYXZlX3ZlY3RvcnNbaV0gPSBnZXRFeGNlcHRpb25IYW5kbGVyIChpKTsKKworICBzdGFja1B0ciAgPSAmcmVtY29tU3RhY2tbU1RBQ0tTSVpFL3NpemVvZihpbnQpIC0gMV07CisKKyAgZXhjZXB0aW9uSGFuZGxlciAoMCwgX2NhdGNoRXhjZXB0aW9uMCk7CisgIGV4Y2VwdGlvbkhhbmRsZXIgKDEsIF9jYXRjaEV4Y2VwdGlvbjEpOworICBleGNlcHRpb25IYW5kbGVyICgyLCBfY2F0Y2hFeGNlcHRpb24yKTsKKyAgZXhjZXB0aW9uSGFuZGxlciAoMywgX2NhdGNoRXhjZXB0aW9uMyk7CisgIGV4Y2VwdGlvbkhhbmRsZXIgKDQsIF9jYXRjaEV4Y2VwdGlvbjQpOworICBleGNlcHRpb25IYW5kbGVyICg1LCBfY2F0Y2hFeGNlcHRpb241KTsKKyAgZXhjZXB0aW9uSGFuZGxlciAoNiwgX2NhdGNoRXhjZXB0aW9uNik7CisgIGV4Y2VwdGlvbkhhbmRsZXIgKDcsIF9jYXRjaEV4Y2VwdGlvbjcpOworICBleGNlcHRpb25IYW5kbGVyICg4LCBfY2F0Y2hFeGNlcHRpb244KTsKKyAgZXhjZXB0aW9uSGFuZGxlciAoOSwgX2NhdGNoRXhjZXB0aW9uOSk7CisgIGV4Y2VwdGlvbkhhbmRsZXIgKDEwLCBfY2F0Y2hFeGNlcHRpb24xMCk7CisgIGV4Y2VwdGlvbkhhbmRsZXIgKDExLCBfY2F0Y2hFeGNlcHRpb24xMSk7CisgIGV4Y2VwdGlvbkhhbmRsZXIgKDEyLCBfY2F0Y2hFeGNlcHRpb24xMik7CisgIGV4Y2VwdGlvbkhhbmRsZXIgKDEzLCBfY2F0Y2hFeGNlcHRpb24xMyk7CisgIGV4Y2VwdGlvbkhhbmRsZXIgKDE0LCBfY2F0Y2hFeGNlcHRpb24xNCk7CisgIGV4Y2VwdGlvbkhhbmRsZXIgKDE1LCBfY2F0Y2hFeGNlcHRpb24xNSk7CisgIGV4Y2VwdGlvbkhhbmRsZXIgKDE2LCBfY2F0Y2hFeGNlcHRpb24xNik7CisgIC8qICBleGNlcHRpb25IYW5kbGVyICgxNywgX2NhdGNoRXhjZXB0aW9uMTcpOyAqLworCisgIC8qIEluIGNhc2UgR0RCIGlzIHN0YXJ0ZWQgYmVmb3JlIHVzLCBhY2sgYW55IHBhY2tldHMgKHByZXN1bWFibHkKKyAgICAgIiQ/I3h4Iikgc2l0dGluZyB0aGVyZS4gICovCisgIHB1dERlYnVnQ2hhciAoJysnKTsKKworICBpbml0aWFsaXplZCA9IDE7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZSBhIGJyZWFrcG9pbnQgZXhjZXB0aW9uLiAgSXQgaXMgdXNlZCBhdCB0aGUKKyAgIGJlZ2lubmluZyBvZiBhIHByb2dyYW0gdG8gc3luYyB1cCB3aXRoIGEgZGVidWdnZXIgYW5kIGNhbiBiZSB1c2VkCisgICBvdGhlcndpc2UgYXMgYSBxdWljayBtZWFucyB0byBzdG9wIHByb2dyYW0gZXhlY3V0aW9uIGFuZCAiYnJlYWsiIGludG8KKyAgIHRoZSBkZWJ1Z2dlci4gKi8KKworI2RlZmluZSBCUkVBS1BPSU5UKCkgYXNtIHZvbGF0aWxlICgiCXRyYXAgIzIiKTsKKwordm9pZCAKK2JyZWFrcG9pbnQoKQoreworICBpZiAoaW5pdGlhbGl6ZWQpCisgICAgQlJFQUtQT0lOVCgpOworfQorCisvKiBTVERPVVQgc2VjdGlvbjoKKyAgIFN0dWZmIHBlcnRhaW5pbmcgdG8gc2ltdWxhdGluZyBzdGRvdXQgYnkgc2VuZGluZyBjaGFycyB0byBnZGIgdG8gYmUgZWNob2VkLgorICAgRnVuY3Rpb25zOiBnZGJfcHV0Y2hhcihjaGFyIGNoKQorICAgICAgICAgICAgICBnZGJfcHV0cyhjaGFyICpzdHIpCisgICAgICAgICAgICAgIGdkYl93cml0ZShjaGFyICpzdHIsIGludCBsZW4pCisgICAgICAgICAgICAgIGdkYl9lcnJvcihjaGFyICpmb3JtYXQsIGNoYXIgKnBhcm0pCisJICAgICAgKi8KKyAKKy8qIEZ1bmN0aW9uOiBnZGJfcHV0Y2hhcihpbnQpCisgICBNYWtlIGdkYiB3cml0ZSBhIGNoYXIgdG8gc3Rkb3V0LgorICAgUmV0dXJuczogdGhlIGNoYXIgKi8KKyAKK3N0YXRpYyBpbnQKK2dkYl9wdXRjaGFyKGNoKQorICAgICBpbnQgY2g7Cit7CisgIGNoYXIgYnVmWzRdOworIAorICBidWZbMF0gPSAnTyc7CisgIGJ1ZlsxXSA9IGhleGNoYXJzW2NoID4+IDRdOworICBidWZbMl0gPSBoZXhjaGFyc1tjaCAmIDB4MEZdOworICBidWZbM10gPSAwOworICBwdXRwYWNrZXQoYnVmKTsKKyAgcmV0dXJuIGNoOworfQorIAorLyogRnVuY3Rpb246IGdkYl93cml0ZShjaGFyICosIGludCkKKyAgIE1ha2UgZ2RiIHdyaXRlIG4gYnl0ZXMgdG8gc3Rkb3V0IChub3QgYXNzdW1lZCB0byBiZSBudWxsLXRlcm1pbmF0ZWQpLgorICAgUmV0dXJuczogbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gKi8KKyAKK3N0YXRpYyBpbnQKK2dkYl93cml0ZShkYXRhLCBsZW4pCisgICAgIGNoYXIgKmRhdGE7CisgICAgIGludCBsZW47Cit7CisgIGNoYXIgKmJ1ZiwgKmNweTsKKyAgaW50IGk7CisgCisgIGJ1ZiA9IHJlbWNvbU91dEJ1ZmZlcjsKKyAgYnVmWzBdID0gJ08nOworICBpID0gMDsKKyAgd2hpbGUgKGkgPCBsZW4pCisgICAgeworICAgICAgZm9yIChjcHkgPSBidWYrMTsgCisJICAgaSA8IGxlbiAmJiBjcHkgPCBidWYgKyBzaXplb2YocmVtY29tT3V0QnVmZmVyKSAtIDM7IAorCSAgIGkrKykKKwl7CisJICAqY3B5KysgPSBoZXhjaGFyc1tkYXRhW2ldID4+IDRdOworCSAgKmNweSsrID0gaGV4Y2hhcnNbZGF0YVtpXSAmIDB4MEZdOworCX0KKyAgICAgICpjcHkgPSAwOworICAgICAgcHV0cGFja2V0KGJ1Zik7CisgICAgfQorICByZXR1cm4gbGVuOworfQorCisvKiBGdW5jdGlvbjogZ2RiX3B1dHMoY2hhciAqKQorICAgTWFrZSBnZGIgd3JpdGUgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHN0ZG91dC4KKyAgIFJldHVybnM6IHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAqLworIAorc3RhdGljIGludAorZ2RiX3B1dHMoc3RyKQorICAgICBjaGFyICpzdHI7Cit7CisgIHJldHVybiBnZGJfd3JpdGUoc3RyLCBzdHJsZW4oc3RyKSk7Cit9CisgCisvKiBGdW5jdGlvbjogZ2RiX2Vycm9yKGNoYXIgKiwgY2hhciAqKQorICAgU2VuZCBhbiBlcnJvciBtZXNzYWdlIHRvIGdkYidzIHN0ZG91dC4KKyAgIEZpcnN0IHN0cmluZyBtYXkgaGF2ZSAxIChvbmUpIG9wdGlvbmFsICIlcyIgaW4gaXQsIHdoaWNoCisgICB3aWxsIGNhdXNlIHRoZSBvcHRpb25hbCBzZWNvbmQgc3RyaW5nIHRvIGJlIGluc2VydGVkLiAgKi8KKyAKK3N0YXRpYyB2b2lkCitnZGJfZXJyb3IoZm9ybWF0LCBwYXJtKQorICAgICBjaGFyICogZm9ybWF0OworICAgICBjaGFyICogcGFybTsKK3sKKyAgY2hhciBidWZbNDAwXSwgKmNweTsKKyAgaW50IGxlbjsKKyAKKyAgaWYgKHJlbW90ZV9kZWJ1ZykKKyAgICB7CisgICAgICBpZiAoZm9ybWF0ICYmICpmb3JtYXQpCisJbGVuID0gc3RybGVuKGZvcm1hdCk7CisgICAgICBlbHNlCisJcmV0dXJuOyAgICAgICAgICAgICAvKiBlbXB0eSBpbnB1dCAqLworCisgICAgICBpZiAocGFybSAmJiAqcGFybSkKKwlsZW4gKz0gc3RybGVuKHBhcm0pOworIAorICAgICAgZm9yIChjcHkgPSBidWY7ICpmb3JtYXQ7ICkKKwl7CisJICBpZiAoZm9ybWF0WzBdID09ICclJyAmJiBmb3JtYXRbMV0gPT0gJ3MnKSAvKiBpbmNsdWRlIHNlY29uZCBzdHJpbmcgKi8KKwkgICAgeworCSAgICAgIGZvcm1hdCArPSAyOyAgICAgICAgICAvKiBhZHZhbmNlIHR3byBjaGFycyBpbnN0ZWFkIG9mIGp1c3Qgb25lICovCisJICAgICAgd2hpbGUgKHBhcm0gJiYgKnBhcm0pCisJCSpjcHkrKyA9ICpwYXJtKys7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgKmNweSsrID0gKmZvcm1hdCsrOworCX0KKyAgICAgICpjcHkgPSAnXDAnOworICAgICAgZ2RiX3B1dHMoYnVmKTsKKyAgICB9Cit9CisgCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCitzdHJjcHkgKHVuc2lnbmVkIGNoYXIgKmRlc3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYykKK3sKKyAgdW5zaWduZWQgY2hhciAqcmV0ID0gZGVzdDsKKworICBpZiAoZGVzdCAmJiBzcmMpCisgICAgeworICAgICAgd2hpbGUgKCpzcmMpCisJKmRlc3QrKyA9ICpzcmMrKzsKKyAgICAgICpkZXN0ID0gMDsKKyAgICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3N0cmxlbiAoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjKQoreworICBpbnQgcmV0OworCisgIGZvciAocmV0ID0gMDsgKnNyYzsgc3JjKyspCisgICAgcmV0Kys7CisKKyAgcmV0dXJuIHJldDsKK30KKworI2lmIDAKK3ZvaWQgZXhpdCAoY29kZSkKKyAgICAgaW50IGNvZGU7Cit7CisgIF9leGl0IChjb2RlKTsKK30KKworaW50IGF0ZXhpdCAodm9pZCAqcCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgYWJvcnQgKHZvaWQpCit7CisgIF9leGl0ICgxKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2RiL20zMnItdGRlcC5jIGIvZ2RiL20zMnItdGRlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZDM0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbTMyci10ZGVwLmMKQEAgLTAsMCArMSw3NDUgQEAKKy8qIFRhcmdldC1kZXBlbmRlbnQgY29kZSBmb3IgdGhlIE1pdHN1YmlzaGkgbTMyciBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTYsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorCisvKiBGdW5jdGlvbjogbTMycl91c2Vfc3RydWN0X2NvbnZlbnRpb24KKyAgIFJldHVybiBub256ZXJvIGlmIGNhbGxfZnVuY3Rpb24gc2hvdWxkIGFsbG9jYXRlIHN0YWNrIHNwYWNlIGZvciBhCisgICBzdHJ1Y3QgcmV0dXJuPyAqLworaW50CittMzJyX3VzZV9zdHJ1Y3RfY29udmVudGlvbiAoZ2NjX3AsIHR5cGUpCisgICAgIGludCBnY2NfcDsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIHJldHVybiAoVFlQRV9MRU5HVEggKHR5cGUpID4gOCk7Cit9CisKKy8qIEZ1bmN0aW9uOiBmcmFtZV9maW5kX3NhdmVkX3JlZ3MKKyAgIFJldHVybiB0aGUgZnJhbWVfc2F2ZWRfcmVncyBzdHJ1Y3R1cmUgZm9yIHRoZSBmcmFtZS4KKyAgIERvZXNuJ3QgcmVhbGx5IHdvcmsgZm9yIGR1bW15IGZyYW1lcywgYnV0IGl0IGRvZXMgcGFzcyBiYWNrCisgICBhbiBlbXB0eSBmcmFtZV9zYXZlZF9yZWdzLCBzbyBJIGd1ZXNzIHRoYXQncyBiZXR0ZXIgdGhhbiB0b3RhbCBmYWlsdXJlICovCisKK3ZvaWQgCittMzJyX2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyAoZmksIHJlZ2FkZHIpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKKyAgICAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKnJlZ2FkZHI7Cit7CisgIG1lbWNweShyZWdhZGRyLCAmZmktPmZzciwgc2l6ZW9mKHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzKSk7Cit9CisKKy8qIFR1cm4gdGhpcyBvbiBpZiB5b3Ugd2FudCB0byBzZWUganVzdCBob3cgbXVjaCBpbnN0cnVjdGlvbiBkZWNvZGluZworICAgaWYgYmVpbmcgZG9uZSwgaXRzIHF1aXRlIGEgbG90CisgICAqLworI2lmIDAKK3N0YXRpYyB2b2lkIGR1bXBfaW5zbihjaGFyICogY29tbW50LENPUkVfQUREUiBwYywgaW50IGluc24pCit7CisgIHByaW50Zl9maWx0ZXJlZCgiICAlcyAlMDh4ICUwOHggIiwKKwkJICBjb21tbnQsKHVuc2lnbmVkIGludClwYywodW5zaWduZWQgaW50KSBpbnNuKTsKKyAgKCp0bV9wcmludF9pbnNuKShwYywmdG1fcHJpbnRfaW5zbl9pbmZvKTsKKyAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOworfQorI2RlZmluZSBpbnNuX2RlYnVnKGFyZ3MpIHsgcHJpbnRmX2ZpbHRlcmVkIGFyZ3M7IH0KKyNlbHNlCisjZGVmaW5lIGR1bXBfaW5zbihhLGIsYykge30KKyNkZWZpbmUgaW5zbl9kZWJ1ZyhhcmdzKSB7fQorI2VuZGlmCisKKyNkZWZpbmUgREVGQVVMVF9TRUFSQ0hfTElNSVQgNDQgCisKKy8qIEZ1bmN0aW9uOiBzY2FuX3Byb2xvZ3VlCisgICBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgdGhlIHRhcmdldCBmdW5jdGlvbiBwcm9sb2d1ZSB0byBkZXRlcm1pbmUKKyAgIDEpIHRoZSBzaXplIG9mIHRoZSBzdGFjayBmcmFtZSwgYW5kIDIpIHdoaWNoIHJlZ2lzdGVycyBhcmUgc2F2ZWQgb24gaXQuCisgICBJdCBzYXZlcyB0aGUgb2Zmc2V0cyBvZiBzYXZlZCByZWdzIGluIHRoZSBmcmFtZV9zYXZlZF9yZWdzIGFyZ3VtZW50LAorICAgYW5kIHJldHVybnMgdGhlIGZyYW1lIHNpemUuICAqLworCisvKgorICBUaGUgc2VxdWVuY2UgaXQgY3VycmVudGx5IGdlbmVyYXRlcyBpczoKKyAgCisJaWYgKHZhcmFyZ3MgZnVuY3Rpb24pIHsgZGRpIHNwLCNuIH0KKwlwdXNoIHJlZ2lzdGVycworCWlmIChhZGRpdGlvbmFsIHN0YWNrIDw9IDI1NikgewlhZGRpIHNwLCMtc3RhY2sJfQorCWVsc2UgaWYgKGFkZGl0aW9uYWwgc3RhY2sgPCA2NWspIHsgYWRkMyBzcCxzcCwjLXN0YWNrCisKKwl9IGVsc2UgaWYgKGFkZGl0aW9uYWwgc3RhY2spIHsKKwlzZXRoIHNwLCMoc3RhY2sgJiAweGZmZmYwMDAwKQorCW9yMyBzcCxzcCwjKHN0YWNrICYgMHgwMDAwZmZmZikKKwlzdWIgc3AscjQKKwl9CisJaWYgKGZyYW1lIHBvaW50ZXIpIHsKKwkJbXYgc3AsZnAKKwl9CisKK1RoZXNlIGluc3RydWN0aW9ucyBhcmUgc2NoZWR1bGVkIGxpa2UgZXZlcnl0aGluZyBlbHNlLCBzbyB5b3Ugc2hvdWxkIHN0b3AgYXQKK3RoZSBmaXJzdCBicmFuY2ggaW5zdHJ1Y3Rpb24uCisgCisqLworCisvKiBUaGlzIGlzIHJlcXVpcmVkIGJ5IHNraXAgcHJvbG9ndWUgYW5kIGJ5IG0zMnJfaW5pdF9leHRyYV9mcmFtZV9pbmZvLiAKKyAgIFRoZSByZXN1bHRzIG9mIGRlY29kaW5nIGEgcHJvbG9ndWUgc2hvdWxkIGJlIGNhY2hlZCBiZWNhdXNlIHRoaXMKKyAgIHRocmFzaGluZyBpcyBnZXR0aW5nIG51dHMuCisgICBJIGFtIHRoaW5raW5nIG9mIG1ha2luZyBhIGNvbnRhaW5lciBjbGFzcyB3aXRoIHR3byBpbmRleGVzLCBuYW1lIGFuZAorICAgYWRkcmVzcy4gSXQgbWF5IGJlIGJldHRlciB0byBleHRlbmQgdGhlIHN5bWJvbCB0YWJsZS4KKyAgICovCisKK3N0YXRpYyB2b2lkIGRlY29kZV9wcm9sb2d1ZSAoc3RhcnRfcGMsIHNjYW5fbGltaXQsIAorCQkJICAgICBwbF9lbmRwdHIsIGZyYW1lbGVuZ3RoLCAKKwkJCSAgICAgZmksIGZzcikKKyAgICAgQ09SRV9BRERSIHN0YXJ0X3BjOworICAgICBDT1JFX0FERFIgc2Nhbl9saW1pdDsKKyAgICAgQ09SRV9BRERSICogcGxfZW5kcHRyOyAgLyogdmFyIHBhcmFtZXRlciAqLworICAgICB1bnNpZ25lZCBsb25nICogZnJhbWVsZW5ndGg7CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICogZmk7CisgICAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICogZnNyOworeworICB1bnNpZ25lZCBsb25nIGZyYW1lc2l6ZTsKKyAgaW50IGluc247CisgIGludCBvcDE7CisgIGludCBtYXliZV9vbmVfbW9yZSA9IDA7CisgIENPUkVfQUREUiBhZnRlcl9wcm9sb2d1ZSA9IDA7CisgIENPUkVfQUREUiBhZnRlcl9zdGFja19hZGp1c3QgPSAwOworICBDT1JFX0FERFIgY3VycmVudF9wYzsKKworCisgIGZyYW1lc2l6ZSA9IDA7CisgIGFmdGVyX3Byb2xvZ3VlID0gMDsKKyAgaW5zbl9kZWJ1ZygoInJkIHByb2xvZyBsKCVkKVxuIixzY2FuX2xpbWl0IC0gY3VycmVudF9wYykpOworCisgIGZvciAoY3VycmVudF9wYyA9IHN0YXJ0X3BjOyBjdXJyZW50X3BjIDwgc2Nhbl9saW1pdDsgY3VycmVudF9wYyArPSAyKQorICAgIHsKKworICAgICAgaW5zbiA9IHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKGN1cnJlbnRfcGMsIDIpOworICAgICAgZHVtcF9pbnNuKCJpbnNuLTEiLGN1cnJlbnRfcGMsaW5zbik7ICAgIC8qIE1UWiAqLworICAgICAgCisgICAgICAgLyogSWYgdGhpcyBpcyBhIDMyIGJpdCBpbnN0cnVjdGlvbiwgd2UgZG9udCB3YW50IHRvIGV4YW1pbmUgaXRzCisJIGltbWVkaWF0ZSBkYXRhIGFzIHRob3VnaCBpdCB3ZXJlIGFuIGluc3RydWN0aW9uICovCisgICAgICBpZiAoY3VycmVudF9wYyAmIDB4MDIpCisJeyAvKiBDbGVhciB0aGUgcGFyYWxsZWwgZXhlY3V0aW9uIGJpdCBmcm9tIDE2IGJpdCBpbnN0cnVjdGlvbiAqLworCSAgaWYgKG1heWJlX29uZV9tb3JlKQorCSAgICB7IC8qIFRoZSBsYXN0IGluc3RydWN0aW9uIHdhcyBhIGJyYW5jaCwgdXN1YWxseSB0ZXJtaW5hdGVzCisJCSB0aGUgc2VyaWVzLCBidXQgaWYgdGhpcyBpcyBhIHBhcmFsbGVsIGluc3RydWN0aW9uLAorCQkgaXQgbWF5IGJlIGEgc3RhY2sgZnJhbWluZyBpbnN0cnVjdGlvbiAqLworCSAgICAgIGlmICghIChpbnNuICYgMHg4MDAwKSkKKwkJeyBpbnNuX2RlYnVnKCgiUmVhbGx5IGRvbmUiKSk7CisJCSAgYnJlYWs7IC8qIG5vcGUsIHdlIGFyZSByZWFsbHkgZG9uZSAqLworCQl9CisJICAgIH0KKwkgIGluc24gJj0gMHg3ZmZmOyAgICAgICAgLyogZGVjb2RlIHRoaXMgaW5zdHJ1Y3Rpb24gZnVydGhlciAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAobWF5YmVfb25lX21vcmUpIAorCSAgICBicmVhazsgLyogVGhpcyBpc250IHRoZSBvbmUgbW9yZSAqLworCSAgaWYgKGluc24gJiAweDgwMDApCisJICAgIHsKKwkgICAgICBpbnNuX2RlYnVnKCgiMzIgYml0IGluc25cbiIpKTsKKwkgICAgICBpZiAoY3VycmVudF9wYyA9PSBzY2FuX2xpbWl0KQorCQlzY2FuX2xpbWl0ICs9IDI7IC8qIGV4dGVuZCB0aGUgc2VhcmNoICovCisJICAgICAgY3VycmVudF9wYyArPSAyOyAgIC8qIHNraXAgdGhlIGltbWVkaWF0ZSBkYXRhICovCisJICAgICAgaWYgKGluc24gPT0gMHg4ZmFmKQkJCS8qIGFkZDMgc3AsIHNwLCB4eHh4ICovCisJCS8qIGFkZCAxNiBiaXQgc2lnbi1leHRlbmRlZCBvZmZzZXQgKi8KKwkJeyBpbnNuX2RlYnVnKCgic3RhY2sgaW5jcmVtZW50XG4iKSk7CisJCWZyYW1lc2l6ZSArPSAtKChzaG9ydCkgcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoY3VycmVudF9wYywgMikpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKCgoaW5zbiA+PiA4KSA9PSAweGU0KSAmJiAvKiBsZDI0IHI0LCB4eHh4eHg7IHN1YiBzcCwgcjQgKi8KKwkJICAgICAgcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoY3VycmVudF9wYyArIDIsIDIpID09IDB4MGYyNCkKKwkJICAgIHsgLyogc3VidHJhY3QgMjQgYml0IHNpZ24tZXh0ZW5kZWQgbmVnYXRpdmUtb2Zmc2V0ICovCisJCSAgICAgIGR1bXBfaW5zbigiaW5zbi0yIixjdXJyZW50X3BjKzIsaW5zbik7CisJCSAgICAgIGluc24gPSByZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyIChjdXJyZW50X3BjIC0gMiwgNCk7CisJCSAgICAgIGR1bXBfaW5zbigiaW5zbi0zKGw0KSIsY3VycmVudF9wYyAtMixpbnNuKTsKKwkJICAgICAgaWYgKGluc24gJiAweDAwODAwMDAwKQkvKiBzaWduIGV4dGVuZCAqLworCQkJaW5zbiAgfD0gMHhmZjAwMDAwMDsJLyogbmVnYXRpdmUgKi8KKwkJICAgICAgZWxzZQorCQkJaW5zbiAgJj0gMHgwMGZmZmZmZjsJLyogcG9zaXRpdmUgKi8KKwkJICAgICAgZnJhbWVzaXplICs9IGluc247CisJCSAgICB9CisJCX0KKwkgICAgICBhZnRlcl9wcm9sb2d1ZSA9IGN1cnJlbnRfcGM7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwl9CisgICAgICBvcDEgPSBpbnNuICYgMHhmMDAwOyAvKiBpc29sYXRlIGp1c3QgdGhlIGZpcnN0IG5pYmJsZSAqLworICAgICAgCisgICAgICBpZiAoKGluc24gJiAweGYwZmYpID09IDB4MjA3ZikKKwl7CQkvKiBzdCByZWcsIEAtc3AgKi8KKwkgIGludCByZWdubzsKKwkgIGluc25fZGVidWcoKCJwdXNoXG4iKSk7CisjaWYgMAkvKiBObywgUFVTSCBGUCBpcyBub3QgYW4gaW5kaWNhdGlvbiB0aGF0IHdlIHdpbGwgdXNlIGEgZnJhbWUgcG9pbnRlci4gKi8KKwkgIGlmICgoKGluc24gJiAweGZmZmYpID09IDB4MmQ3ZikgJiYgZmkpIAorCSAgICBmaS0+dXNpbmdfZnJhbWVfcG9pbnRlciA9IDE7CisjZW5kaWYKKwkgIGZyYW1lc2l6ZSAgKz0gNDsKKyNpZiAwIAorLyogV2h5IHNob3VsZCB3ZSBpbmNyZWFzZSB0aGUgc2NhbiBsaW1pdCwganVzdCBiZWNhdXNlIHdlIGRpZCBhIHB1c2g/IAorICAgQW5kIGlmIHRoZXJlIGlzIGEgcmVhc29uLCBzdXJlbHkgd2Ugd291bGQgb25seSB3YW50IHRvIGRvIGl0IGlmIHdlCisgICBoYWQgYWxyZWFkeSByZWFjaGVkIHRoZSBzY2FuIGxpbWl0Li4uICovCisJICBpZiAoY3VycmVudF9wYyA9PSBzY2FuX2xpbWl0KQorCSAgICBzY2FuX2xpbWl0ICs9IDI7CisjZW5kaWYKKwkgIHJlZ25vID0gKChpbnNuID4+IDgpICYgMHhmKTsKKwkgIGlmIChmc3IpCQkJCS8qIHNhdmVfcmVncyBvZmZzZXQgKi8KKwkgICAgZnNyLT5yZWdzW3JlZ25vXSA9IGZyYW1lc2l6ZTsKKwkgIGFmdGVyX3Byb2xvZ3VlID0gMDsKKwkgICAgY29udGludWU7CisJfQorICAgICAgaWYgKChpbnNuID4+IDgpID09IDB4NGYpICAJCS8qIGFkZGkgc3AsIHh4ICovCisJLyogYWRkIDggYml0IHNpZ24tZXh0ZW5kZWQgb2Zmc2V0ICovCisJeworCSAgaW50IHN0YWNrX2FkanVzdCA9IChjaGFyKSAoaW5zbiAmIDB4ZmYpOworCisJICAvKiB0aGVyZSBhcmUgcHJvYmFibHkgdHdvIG9mIHRoZXNlIHN0YWNrIGFkanVzdG1lbnRzOgorCSAgICAgMSkgQSBuZWdhdGl2ZSBvbmUgaW4gdGhlIHByb2xvZ3VlLCBhbmQKKwkgICAgIDIpIEEgcG9zaXRpdmUgb25lIGluIHRoZSBlcGlsb2d1ZS4KKwkgICAgIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGZpcnN0IG9uZS4gICovCisKKwkgIGlmIChzdGFja19hZGp1c3QgPCAwKQorCSAgICB7CisJICAgICAgZnJhbWVzaXplIC09IHN0YWNrX2FkanVzdDsKKwkgICAgICBhZnRlcl9wcm9sb2d1ZSA9IDA7CisJICAgICAgLyogQSBmcmFtZWxlc3MgZnVuY3Rpb24gbWF5IGhhdmUgbm8gIm12IGZwLCBzcCIuCisJCSBJbiB0aGF0IGNhc2UsIHRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgcHJvbG9ndWUuICAqLworCSAgICAgIGFmdGVyX3N0YWNrX2FkanVzdCA9IGN1cnJlbnRfcGMgKyAyOworCSAgICB9CisJICBjb250aW51ZTsKKwl9CisgICAgICBpZiAoaW5zbiA9PSAweDFkOGYpIHsJLyogbXYgZnAsIHNwICovCisJaWYgKGZpKSAKKwkgIGZpLT51c2luZ19mcmFtZV9wb2ludGVyID0gMTsJLyogZnAgaXMgbm93IHZhbGlkICovCisJaW5zbl9kZWJ1ZygoImRvbmUgZnAgZm91bmRcbiIpKTsKKwlhZnRlcl9wcm9sb2d1ZSA9IGN1cnJlbnRfcGMgKyAyOworCWJyZWFrOwkJCQkvKiBlbmQgb2Ygc3RhY2sgYWRqdXN0bWVudHMgKi8KKyAgICAgIH0KKyAgICAgIGlmIChpbnNuID09ICAweDcwMDApICAvKiBOb3AgbG9va3MgbGlrZSBhIGJyYW5jaCwgY29udGludWUgZXhwbGljaXRseSAqLworCXsgaW5zbl9kZWJ1ZygoIm5vcFxuIikpOworCWFmdGVyX3Byb2xvZ3VlID0gY3VycmVudF9wYyArIDI7CisJY29udGludWU7IC8qIG5vcCBvY2N1cnMgYmV0d2VlbiBwdXNoZXMgKi8KKwl9CisgICAgICAvKiBFbmQgb2YgcHJvbG9nIGlmIGFueSBvZiB0aGVzZSBhcmUgYnJhbmNoIGluc3RydWN0aW9ucyAqLworICAgICAgaWYgKChvcDEgPT0gMHg3MDAwKQorCSAgfHwgKCBvcDEgPT0gMHhiMDAwKQorCSAgfHwgKG9wMSA9PSAweDcwMDApKQorCXsKKwkgIGFmdGVyX3Byb2xvZ3VlID0gY3VycmVudF9wYzsKKwkgIGluc25fZGVidWcoKCJEb25lOiBicmFuY2hcbiIpKTsKKwkgIG1heWJlX29uZV9tb3JlID0gMTsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIC8qIFNvbWUgb2YgdGhlIGJyYW5jaCBpbnN0cnVjdGlvbnMgYXJlIG1peGVkIHdpdGggb3RoZXIgdHlwZXMgKi8KKyAgICAgIGlmIChvcDEgPT0gMHgxMDAwKQorCXtpbnQgc3Vib3AgPSBpbnNuICYgMHgwZmYwOworCSAgaWYgKChzdWJvcCA9PSAweDBlYzApIHx8IChzdWJvcCA9PSAweDBmYzApKQorCSAgICB7IGluc25fZGVidWcoKCJkb25lOiBqbXBcbiIpKTsKKwkgICAgICBhZnRlcl9wcm9sb2d1ZSA9IGN1cnJlbnRfcGM7CisJICAgICAgbWF5YmVfb25lX21vcmUgPSAxOworCSAgICAgIGNvbnRpbnVlOyAvKiBqbXAgLCBqbCAqLworCSAgICB9CisJfQorICAgIH0KKworICBpZiAoY3VycmVudF9wYyA+PSBzY2FuX2xpbWl0KQorICAgIHsKKyAgICAgIGlmIChwbF9lbmRwdHIpIAorI2lmIDEKKwlpZiAoYWZ0ZXJfc3RhY2tfYWRqdXN0ICE9IDApCisJICAvKiBXZSBkaWQgbm90IGZpbmQgYSAibXYgZnAsc3AiLCBidXQgd2UgRElEIGZpbmQKKwkgICAgIGEgc3RhY2tfYWRqdXN0LiAgSXMgaXQgc2FmZSB0byB1c2UgdGhhdCBhcyB0aGUKKwkgICAgIGVuZCBvZiB0aGUgcHJvbG9ndWU/ICBJIGp1c3QgZG9uJ3Qga25vdy4gKi8KKwkgIHsKKwkgICAgKnBsX2VuZHB0ciA9IGFmdGVyX3N0YWNrX2FkanVzdDsKKwkgICAgaWYgKGZyYW1lbGVuZ3RoKQorCSAgICAgICpmcmFtZWxlbmd0aCA9IGZyYW1lc2l6ZTsKKwkgIH0KKwllbHNlCisjZW5kaWYKKyAgICAgIC8qIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbG9vcCB3aXRob3V0IGZpbmRpbmcgdGhlIGVuZAorCSBvZiB0aGUgcHJvbG9ndWUuICBObyB3YXkgdG8gd2luIC0tIHdlIHNob3VsZCByZXBvcnQgZmFpbHVyZS4gIAorCSBUaGUgd2F5IHdlIGRvIHRoYXQgaXMgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBzdGFydF9wYy4KKwkgR0RCIHdpbGwgc2V0IGEgYnJlYWtwb2ludCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uIChldGMuKSAqLworCisJKnBsX2VuZHB0ciA9IHN0YXJ0X3BjOworCQorICAgICAgcmV0dXJuOworICAgIH0KKyAgaWYgKGFmdGVyX3Byb2xvZ3VlID09IDApIAorICAgIGFmdGVyX3Byb2xvZ3VlID0gY3VycmVudF9wYzsKKworICBpbnNuX2RlYnVnKCgiIGZyYW1lc2l6ZSAlZCwgZmlyc3RsaW5lICUwOHhcbiIsZnJhbWVzaXplLGFmdGVyX3Byb2xvZ3VlKSk7CisgIGlmIChmcmFtZWxlbmd0aCkgCisgICAgKmZyYW1lbGVuZ3RoID0gZnJhbWVzaXplOworICBpZiAocGxfZW5kcHRyKSAKKyAgICAqcGxfZW5kcHRyID0gYWZ0ZXJfcHJvbG9ndWU7Cit9IC8qICBkZWNvZGVfcHJvbG9ndWUgKi8KKworLyogRnVuY3Rpb246IHNraXBfcHJvbG9ndWUKKyAgIEZpbmQgZW5kIG9mIGZ1bmN0aW9uIHByb2xvZ3VlICovCisKK0NPUkVfQUREUgorbTMycl9za2lwX3Byb2xvZ3VlIChwYykKKyAgICAgQ09SRV9BRERSIHBjOworeworICBDT1JFX0FERFIgZnVuY19hZGRyLCBmdW5jX2VuZDsKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CisKKyAgLyogU2VlIHdoYXQgdGhlIHN5bWJvbCB0YWJsZSBzYXlzICovCisKKyAgaWYgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAocGMsIE5VTEwsICZmdW5jX2FkZHIsICZmdW5jX2VuZCkpCisgICAgeworICAgICAgc2FsID0gZmluZF9wY19saW5lIChmdW5jX2FkZHIsIDApOworCisgICAgICBpZiAoc2FsLmxpbmUgIT0gMCAmJiBzYWwuZW5kIDw9IGZ1bmNfZW5kKQorCXsKKwkgIAorCSAgaW5zbl9kZWJ1ZygoIkJQIGFmdGVyIHByb2xvZ3VlICUwOHhcbiIsc2FsLmVuZCkpOworCSAgZnVuY19lbmQgPSBzYWwuZW5kOworCX0KKyAgICAgIGVsc2UKKwkvKiBFaXRoZXIgdGhlcmUncyBubyBsaW5lIGluZm8sIG9yIHRoZSBsaW5lIGFmdGVyIHRoZSBwcm9sb2d1ZSBpcyBhZnRlcgorCSAgIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLiAgSW4gdGhpcyBjYXNlLCB0aGVyZSBwcm9iYWJseSBpc24ndCBhCisJICAgcHJvbG9ndWUuICAqLworCXsKKwkgIGluc25fZGVidWcoKCJObyBsaW5lIGluZm8sIGxpbmUoJXgpIHNhbF9lbmQoJXgpIGZ1bmNlbmQoJXgpXG4iLAorCQkgICAgICBzYWwubGluZSxzYWwuZW5kLGZ1bmNfZW5kKSk7CisJICBmdW5jX2VuZCA9IG1pbihmdW5jX2VuZCxmdW5jX2FkZHIgKyBERUZBVUxUX1NFQVJDSF9MSU1JVCk7CisJfQorICAgIH0KKyAgZWxzZSAKKyAgICBmdW5jX2VuZCA9IHBjICsgREVGQVVMVF9TRUFSQ0hfTElNSVQ7CisgIGRlY29kZV9wcm9sb2d1ZSAocGMsIGZ1bmNfZW5kLCAmc2FsLmVuZCwgMCwgMCwgMCk7CisgIHJldHVybiBzYWwuZW5kOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworbTMycl9zY2FuX3Byb2xvZ3VlIChmaSwgZnNyKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7CisgICAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICpmc3I7Cit7CisgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOworICBDT1JFX0FERFIgcHJvbG9ndWVfc3RhcnQsIHByb2xvZ3VlX2VuZCwgY3VycmVudF9wYzsKKyAgdW5zaWduZWQgbG9uZyBmcmFtZXNpemU7CisKKyAgLyogdGhpcyBjb2RlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZXMgc2tpcF9wcm9sb2d1ZSwgCisgICAgIGJ1dCB3ZSBuZWVkIHRoZSBzdGFydCBhZGRyZXNzIGJlbG93LiAgKi8KKworICBpZiAoZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIChmaS0+cGMsIE5VTEwsICZwcm9sb2d1ZV9zdGFydCwgJnByb2xvZ3VlX2VuZCkpCisgICAgeworICAgICAgc2FsID0gZmluZF9wY19saW5lIChwcm9sb2d1ZV9zdGFydCwgMCk7CisKKyAgICAgIGlmIChzYWwubGluZSA9PSAwKQkJLyogbm8gbGluZSBpbmZvLCB1c2UgY3VycmVudCBQQyAqLworCWlmIChwcm9sb2d1ZV9zdGFydCA9PSBlbnRyeV9wb2ludF9hZGRyZXNzICgpKQorCSAgcmV0dXJuIDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJvbG9ndWVfc3RhcnQgPSBmaS0+cGM7CisgICAgICBwcm9sb2d1ZV9lbmQgPSBwcm9sb2d1ZV9zdGFydCArIDQ4OyAvKiBXZSdyZSBpbiB0aGUgYm9vbmRvY2tzOiAKKwkJCQkJICAgICAgYWxsb3cgZm9yIDE2IHB1c2hlcywgYW4gYWRkLCAKKwkJCQkJICAgICAgYW5kICJtdiBmcCxzcCIgKi8KKyAgICB9CisjaWYgMAorICBwcm9sb2d1ZV9lbmQgPSBtaW4gKHByb2xvZ3VlX2VuZCwgZmktPnBjKTsKKyNlbmRpZgorICBpbnNuX2RlYnVnKCgiZmlwYyglMDh4KSBzdGFydCglMDh4KSBlbmQoJTA4eClcbiIsCisJICAgICAgZmktPnBjLHByb2xvZ3VlX3N0YXJ0LHByb2xvZ3VlX2VuZCkpOworICBwcm9sb2d1ZV9lbmQgPSBtaW4ocHJvbG9ndWVfZW5kLCBwcm9sb2d1ZV9zdGFydCArIERFRkFVTFRfU0VBUkNIX0xJTUlUKTsKKyAgZGVjb2RlX3Byb2xvZ3VlIChwcm9sb2d1ZV9zdGFydCxwcm9sb2d1ZV9lbmQsJnByb2xvZ3VlX2VuZCwmZnJhbWVzaXplLAorCQkgICBmaSxmc3IpOworICByZXR1cm4gZnJhbWVzaXplOworfQorCisvKiBGdW5jdGlvbjogaW5pdF9leHRyYV9mcmFtZV9pbmZvCisgICBUaGlzIGZ1bmN0aW9uIGFjdHVhbGx5IGZpZ3VyZXMgb3V0IHRoZSBmcmFtZSBhZGRyZXNzIGZvciBhIGdpdmVuIHBjIGFuZAorICAgc3AuICBUaGlzIGlzIHRyaWNreSBvbiB0aGUgbTMyciBiZWNhdXNlIHdlIHNvbWV0aW1lcyBkb24ndCB1c2UgYW4gZXhwbGljaXQKKyAgIGZyYW1lIHBvaW50ZXIsIGFuZCB0aGUgcHJldmlvdXMgc3RhY2sgcG9pbnRlciBpc24ndCBuZWNlc3NhcmlseSByZWNvcmRlZAorICAgb24gdGhlIHN0YWNrLiAgVGhlIG9ubHkgcmVsaWFibGUgd2F5IHRvIGdldCB0aGlzIGluZm8gaXMgdG8KKyAgIGV4YW1pbmUgdGhlIHByb2xvZ3VlLiAgKi8KKwordm9pZAorbTMycl9pbml0X2V4dHJhX2ZyYW1lX2luZm8gKGZpKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7Cit7CisgIGludCByZWc7CisKKyAgaWYgKGZpLT5uZXh0KQorICAgIGZpLT5wYyA9IEZSQU1FX1NBVkVEX1BDIChmaS0+bmV4dCk7CisKKyAgbWVtc2V0IChmaS0+ZnNyLnJlZ3MsICdcMDAwJywgc2l6ZW9mIGZpLT5mc3IucmVncyk7CisKKyAgaWYgKFBDX0lOX0NBTExfRFVNTVkgKGZpLT5wYywgZmktPmZyYW1lLCBmaS0+ZnJhbWUpKQorICAgIHsKKyAgICAgIC8qIFdlIG5lZWQgdG8gc2V0dXAgZmktPmZyYW1lIGhlcmUgYmVjYXVzZSBydW5fc3RhY2tfZHVtbXkgZ2V0cyBpdCB3cm9uZworCSBieSBhc3N1bWluZyBpdCdzIGFsd2F5cyBGUC4gICovCisgICAgICBmaS0+ZnJhbWUgPSBnZW5lcmljX3JlYWRfcmVnaXN0ZXJfZHVtbXkgKGZpLT5wYywgZmktPmZyYW1lLCBTUF9SRUdOVU0pOworICAgICAgZmktPmZyYW1lc2l6ZSA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlIAorICAgIHsKKyAgICAgIGZpLT51c2luZ19mcmFtZV9wb2ludGVyID0gMDsKKyAgICAgIGZpLT5mcmFtZXNpemUgPSBtMzJyX3NjYW5fcHJvbG9ndWUgKGZpLCAmZmktPmZzcik7CisKKyAgICAgIGlmICghZmktPm5leHQpCisJaWYgKGZpLT51c2luZ19mcmFtZV9wb2ludGVyKQorCSAgeworCSAgICBmaS0+ZnJhbWUgPSByZWFkX3JlZ2lzdGVyIChGUF9SRUdOVU0pOworCSAgfQorCWVsc2UKKwkgIGZpLT5mcmFtZSA9IHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSk7CisgICAgICBlbHNlIAkvKiBmaS0+bmV4dCBtZWFucyB0aGlzIGlzIG5vdCB0aGUgaW5uZXJtb3N0IGZyYW1lICovCisJaWYgKGZpLT51c2luZ19mcmFtZV9wb2ludGVyKQkJICAgIC8qIHdlIGhhdmUgYW4gRlAgKi8KKwkgIGlmIChmaS0+bmV4dC0+ZnNyLnJlZ3NbRlBfUkVHTlVNXSAhPSAwKSAgIC8qIGNhbGxlciBzYXZlZCBvdXIgRlAgKi8KKwkgICAgZmktPmZyYW1lID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoZmktPm5leHQtPmZzci5yZWdzW0ZQX1JFR05VTV0sIDQpOworICAgICAgZm9yIChyZWcgPSAwOyByZWcgPCBOVU1fUkVHUzsgcmVnKyspCisJaWYgKGZpLT5mc3IucmVnc1tyZWddICE9IDApCisJICBmaS0+ZnNyLnJlZ3NbcmVnXSA9IGZpLT5mcmFtZSArIGZpLT5mcmFtZXNpemUgLSBmaS0+ZnNyLnJlZ3NbcmVnXTsKKyAgICB9Cit9CisKKy8qIEZ1bmN0aW9uOiBtbjEwMzAwX3ZpcnR1YWxfZnJhbWVfcG9pbnRlcgorICAgUmV0dXJuIHRoZSByZWdpc3RlciB0aGF0IHRoZSBmdW5jdGlvbiB1c2VzIGZvciBhIGZyYW1lIHBvaW50ZXIsIAorICAgcGx1cyBhbnkgbmVjZXNzYXJ5IG9mZnNldCB0byBiZSBhcHBsaWVkIHRvIHRoZSByZWdpc3RlciBiZWZvcmUKKyAgIGFueSBmcmFtZSBwb2ludGVyIG9mZnNldHMuICAqLworCit2b2lkCittMzJyX3ZpcnR1YWxfZnJhbWVfcG9pbnRlciAocGMsIHJlZywgb2Zmc2V0KQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIGxvbmcgKnJlZzsKKyAgICAgbG9uZyAqb2Zmc2V0OworeworICBzdHJ1Y3QgZnJhbWVfaW5mbyBmaTsKKworICAvKiBTZXQgdXAgYSBkdW1teSBmcmFtZV9pbmZvLiAqLworICBmaS5uZXh0ID0gTlVMTDsKKyAgZmkucHJldiA9IE5VTEw7CisgIGZpLmZyYW1lID0gMDsKKyAgZmkucGMgPSBwYzsKKworICAvKiBBbmFseXplIHRoZSBwcm9sb2cgYW5kIGZpbGwgaW4gdGhlIGV4dHJhIGluZm8uICAqLworICBtMzJyX2luaXRfZXh0cmFfZnJhbWVfaW5mbyAoJmZpKTsKKworCisgIC8qIFJlc3VsdHMgd2lsbCB0ZWxsIHVzIHdoaWNoIHR5cGUgb2YgZnJhbWUgaXQgdXNlcy4gICovCisgIGlmIChmaS51c2luZ19mcmFtZV9wb2ludGVyKQorICAgIHsKKyAgICAgICpyZWcgICAgPSBGUF9SRUdOVU07CisgICAgICAqb2Zmc2V0ID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqcmVnICAgID0gU1BfUkVHTlVNOworICAgICAgKm9mZnNldCA9IDA7CisgICAgfQorfQorCisvKiBGdW5jdGlvbjogZmluZF9jYWxsZXJzX3JlZworICAgRmluZCBSRUdOVU0gb24gdGhlIHN0YWNrLiAgT3RoZXJ3aXNlLCBpdCdzIGluIGFuIGFjdGl2ZSByZWdpc3Rlci4gIE9uZSB0aGluZworICAgd2UgbWlnaHQgd2FudCB0byBkbyBoZXJlIGlzIHRvIGNoZWNrIFJFR05VTSBhZ2FpbnN0IHRoZSBjbG9iYmVyIG1hc2ssIGFuZAorICAgc29tZWhvdyBmbGFnIGl0IGFzIGludmFsaWQgaWYgaXQgaXNuJ3Qgc2F2ZWQgb24gdGhlIHN0YWNrIHNvbWV3aGVyZS4gIFRoaXMKKyAgIHdvdWxkIHByb3ZpZGUgYSBncmFjZWZ1bCBmYWlsdXJlIG1vZGUgd2hlbiB0cnlpbmcgdG8gZ2V0IHRoZSB2YWx1ZSBvZgorICAgY2FsbGVyLXNhdmVzIHJlZ2lzdGVycyBmb3IgYW4gaW5uZXIgZnJhbWUuICAqLworCitDT1JFX0FERFIKK20zMnJfZmluZF9jYWxsZXJzX3JlZyAoZmksIHJlZ251bSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworICAgICBpbnQgcmVnbnVtOworeworICBmb3IgKDsgZmk7IGZpID0gZmktPm5leHQpCisgICAgaWYgKFBDX0lOX0NBTExfRFVNTVkgKGZpLT5wYywgZmktPmZyYW1lLCBmaS0+ZnJhbWUpKQorICAgICAgcmV0dXJuIGdlbmVyaWNfcmVhZF9yZWdpc3Rlcl9kdW1teSAoZmktPnBjLCBmaS0+ZnJhbWUsIHJlZ251bSk7CisgICAgZWxzZSBpZiAoZmktPmZzci5yZWdzW3JlZ251bV0gIT0gMCkKKyAgICAgIHJldHVybiByZWFkX21lbW9yeV9pbnRlZ2VyIChmaS0+ZnNyLnJlZ3NbcmVnbnVtXSwgCisJCQkJICBSRUdJU1RFUl9SQVdfU0laRShyZWdudW0pKTsKKyAgcmV0dXJuIHJlYWRfcmVnaXN0ZXIgKHJlZ251bSk7Cit9CisKKy8qIEZ1bmN0aW9uOiBmcmFtZV9jaGFpbgorICAgR2l2ZW4gYSBHREIgZnJhbWUsIGRldGVybWluZSB0aGUgYWRkcmVzcyBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbidzIGZyYW1lLgorICAgVGhpcyB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgbmV3IEdEQiBmcmFtZSBzdHJ1Y3QsIGFuZCB0aGVuCisgICBJTklUX0VYVFJBX0ZSQU1FX0lORk8gYW5kIElOSVRfRlJBTUVfUEMgd2lsbCBiZSBjYWxsZWQgZm9yIHRoZSBuZXcgZnJhbWUuCisgICBGb3IgbTMyciwgd2Ugc2F2ZSB0aGUgZnJhbWUgc2l6ZSB3aGVuIHdlIGluaXRpYWxpemUgdGhlIGZyYW1lX2luZm8uICAqLworCitDT1JFX0FERFIKK20zMnJfZnJhbWVfY2hhaW4gKGZpKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7Cit7CisgIENPUkVfQUREUiBmbl9zdGFydCwgY2FsbGVyc19wYywgZnA7CisKKyAgLyogaXMgdGhpcyBhIGR1bW15IGZyYW1lPyAqLworICBpZiAoUENfSU5fQ0FMTF9EVU1NWShmaS0+cGMsIGZpLT5mcmFtZSwgZmktPmZyYW1lKSkKKyAgICByZXR1cm4gZmktPmZyYW1lOwkvKiBkdW1teSBmcmFtZSBzYW1lIGFzIGNhbGxlcidzIGZyYW1lICovCisKKyAgLyogaXMgY2FsbGVyLW9mLXRoaXMgYSBkdW1teSBmcmFtZT8gKi8KKyAgY2FsbGVyc19wYyA9IEZSQU1FX1NBVkVEX1BDKGZpKTsgIC8qIGZpbmQgb3V0IHdobyBjYWxsZWQgdXM6ICovCisgIGZwID0gbTMycl9maW5kX2NhbGxlcnNfcmVnIChmaSwgRlBfUkVHTlVNKTsKKyAgaWYgKFBDX0lOX0NBTExfRFVNTVkoY2FsbGVyc19wYywgZnAsIGZwKSkJCisgICAgcmV0dXJuIGZwOwkJLyogZHVtbXkgZnJhbWUncyBmcmFtZSBtYXkgYmVhciBubyByZWxhdGlvbiB0byBvdXJzICovCisKKyAgaWYgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAoZmktPnBjLCAwLCAmZm5fc3RhcnQsIDApKQorICAgIGlmIChmbl9zdGFydCA9PSBlbnRyeV9wb2ludF9hZGRyZXNzICgpKQorICAgICAgcmV0dXJuIDA7CQkvKiBpbiBfc3RhcnQgZm4sIGRvbid0IGNoYWluIGZ1cnRoZXIgKi8KKyAgaWYgKGZpLT5mcmFtZXNpemUgPT0gMCkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQoImNhbm5vdCBkZXRlcm1pbmUgZnJhbWUgc2l6ZSBAICUwOHggLCBwYyglMDh4KVxuIiwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGZpLT5mcmFtZSwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGZpLT5wYyApOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpbnNuX2RlYnVnKCgibTMycnggZnJhbWUgJTA4eFxuIixmaS0+ZnJhbWUrZmktPmZyYW1lc2l6ZSkpOworICByZXR1cm4gZmktPmZyYW1lICsgZmktPmZyYW1lc2l6ZTsKK30KKworLyogRnVuY3Rpb246IHB1c2hfcmV0dXJuX2FkZHJlc3MgKHBjKQorICAgU2V0IHVwIHRoZSByZXR1cm4gYWRkcmVzcyBmb3IgdGhlIGluZmVyaW9yIGZ1bmN0aW9uIGNhbGwuCisgICBOZWNlc3NhcnkgZm9yIHRhcmdldHMgdGhhdCBkb24ndCBhY3R1YWxseSBleGVjdXRlIGEgSlNSL0JTUiBpbnN0cnVjdGlvbiAKKyAgIChpZS4gd2hlbiB1c2luZyBhbiBlbXB0eSBDQUxMX0RVTU1ZKSAqLworCitDT1JFX0FERFIKK20zMnJfcHVzaF9yZXR1cm5fYWRkcmVzcyAocGMsIHNwKQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIENPUkVfQUREUiBzcDsKK3sKKyAgd3JpdGVfcmVnaXN0ZXIgKFJQX1JFR05VTSwgQ0FMTF9EVU1NWV9BRERSRVNTICgpKTsKKyAgcmV0dXJuIHNwOworfQorCisKKy8qIEZ1bmN0aW9uOiBwb3BfZnJhbWUKKyAgIERpc2NhcmQgZnJvbSB0aGUgc3RhY2sgdGhlIGlubmVybW9zdCBmcmFtZSwKKyAgIHJlc3RvcmluZyBhbGwgc2F2ZWQgcmVnaXN0ZXJzLiAgKi8KKworc3RydWN0IGZyYW1lX2luZm8gKgorbTMycl9wb3BfZnJhbWUgKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIGludCByZWdudW07CisKKyAgaWYgKFBDX0lOX0NBTExfRFVNTVkgKGZyYW1lLT5wYywgZnJhbWUtPmZyYW1lLCBmcmFtZS0+ZnJhbWUpKQorICAgIGdlbmVyaWNfcG9wX2R1bW15X2ZyYW1lICgpOworICBlbHNlCisgICAgeworICAgICAgZm9yIChyZWdudW0gPSAwOyByZWdudW0gPCBOVU1fUkVHUzsgcmVnbnVtKyspCisJaWYgKGZyYW1lLT5mc3IucmVnc1tyZWdudW1dICE9IDApCisJICB3cml0ZV9yZWdpc3RlciAocmVnbnVtLCAKKwkJCSAgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnJhbWUtPmZzci5yZWdzW3JlZ251bV0sIDQpKTsKKworICAgICAgd3JpdGVfcmVnaXN0ZXIgKFBDX1JFR05VTSwgRlJBTUVfU0FWRURfUEMgKGZyYW1lKSk7CisgICAgICB3cml0ZV9yZWdpc3RlciAoU1BfUkVHTlVNLCByZWFkX3JlZ2lzdGVyIChGUF9SRUdOVU0pKTsKKyAgICAgIGlmIChyZWFkX3JlZ2lzdGVyIChQU1dfUkVHTlVNKSAmIDB4ODApCisJd3JpdGVfcmVnaXN0ZXIgKFNQVV9SRUdOVU0sIHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSkpOworICAgICAgZWxzZQorCXdyaXRlX3JlZ2lzdGVyIChTUElfUkVHTlVNLCByZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pKTsKKyAgICB9CisgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7CisgIHJldHVybiBOVUxMOworfQorCisvKiBGdW5jdGlvbjogZnJhbWVfc2F2ZWRfcGMKKyAgIEZpbmQgdGhlIGNhbGxlciBvZiB0aGlzIGZyYW1lLiAgV2UgZG8gdGhpcyBieSBzZWVpbmcgaWYgUlBfUkVHTlVNIGlzIHNhdmVkCisgICBpbiB0aGUgc3RhY2sgYW55d2hlcmUsIG90aGVyd2lzZSB3ZSBnZXQgaXQgZnJvbSB0aGUgcmVnaXN0ZXJzLiAqLworCitDT1JFX0FERFIKK20zMnJfZnJhbWVfc2F2ZWRfcGMgKGZpKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7Cit7CisgIGlmIChQQ19JTl9DQUxMX0RVTU1ZKGZpLT5wYywgZmktPmZyYW1lLCBmaS0+ZnJhbWUpKQorICAgIHJldHVybiBnZW5lcmljX3JlYWRfcmVnaXN0ZXJfZHVtbXkoZmktPnBjLCBmaS0+ZnJhbWUsIFBDX1JFR05VTSk7CisgIGVsc2UKKyAgICByZXR1cm4gbTMycl9maW5kX2NhbGxlcnNfcmVnIChmaSwgUlBfUkVHTlVNKTsKK30KKworLyogRnVuY3Rpb246IHB1c2hfYXJndW1lbnRzCisgICBTZXR1cCB0aGUgZnVuY3Rpb24gYXJndW1lbnRzIGZvciBjYWxsaW5nIGEgZnVuY3Rpb24gaW4gdGhlIGluZmVyaW9yLgorCisgICBPbiB0aGUgTWl0c3ViaXNoaSBNMzJSIGFyY2hpdGVjdHVyZSwgdGhlcmUgYXJlIGZvdXIgcmVnaXN0ZXJzIChSMCB0byBSMykKKyAgIHdoaWNoIGFyZSBkZWRpY2F0ZWQgZm9yIHBhc3NpbmcgZnVuY3Rpb24gYXJndW1lbnRzLiAgVXAgdG8gdGhlIGZpcnN0IAorICAgZm91ciBhcmd1bWVudHMgKGRlcGVuZGluZyBvbiBzaXplKSBtYXkgZ28gaW50byB0aGVzZSByZWdpc3RlcnMuCisgICBUaGUgcmVzdCBnbyBvbiB0aGUgc3RhY2suCisKKyAgIEFyZ3VtZW50cyB0aGF0IGFyZSBzbWFsbGVyIHRoYW4gNCBieXRlcyB3aWxsIHN0aWxsIHRha2UgdXAgYSB3aG9sZQorICAgcmVnaXN0ZXIgb3IgYSB3aG9sZSAzMi1iaXQgd29yZCBvbiB0aGUgc3RhY2ssIGFuZCB3aWxsIGJlCisgICByaWdodC1qdXN0aWZpZWQgaW4gdGhlIHJlZ2lzdGVyIG9yIHRoZSBzdGFjayB3b3JkLiAgVGhpcyBpbmNsdWRlcworICAgY2hhcnMsIHNob3J0cywgYW5kIHNtYWxsIGFnZ3JlZ2F0ZSB0eXBlcy4KKyAKKyAgIEFyZ3VtZW50cyBvZiA4IGJ5dGVzIHNpemUgYXJlIHNwbGl0IGJldHdlZW4gdHdvIHJlZ2lzdGVycywgaWYgCisgICBhdmFpbGFibGUuICBJZiBvbmx5IG9uZSByZWdpc3RlciBpcyBhdmFpbGFibGUsIHRoZSBhcmd1bWVudCB3aWxsIAorICAgYmUgc3BsaXQgYmV0d2VlbiB0aGUgcmVnaXN0ZXIgYW5kIHRoZSBzdGFjay4gIE90aGVyd2lzZSBpdCBpcworICAgcGFzc2VkIGVudGlyZWx5IG9uIHRoZSBzdGFjay4gIEFnZ3JlZ2F0ZSB0eXBlcyB3aXRoIHNpemVzIGJldHdlZW4KKyAgIDQgYW5kIDggYnl0ZXMgYXJlIHBhc3NlZCBlbnRpcmVseSBvbiB0aGUgc3RhY2ssIGFuZCBhcmUgbGVmdC1qdXN0aWZpZWQKKyAgIHdpdGhpbiB0aGUgZG91YmxlLXdvcmQgKGFzIG9wcG9zZWQgdG8gYWdncmVnYXRlcyBzbWFsbGVyIHRoYW4gNCBieXRlcworICAgd2hpY2ggYXJlIHJpZ2h0LWp1c3RpZmllZCkuCisKKyAgIEFnZ3JlZ2F0ZXMgb2YgZ3JlYXRlciB0aGFuIDggYnl0ZXMgYXJlIGZpcnN0IGNvcGllZCBvbnRvIHRoZSBzdGFjaywgCisgICBhbmQgdGhlbiBhIHBvaW50ZXIgdG8gdGhlIGNvcHkgaXMgcGFzc2VkIGluIHRoZSBwbGFjZSBvZiB0aGUgbm9ybWFsCisgICBhcmd1bWVudCAoZWl0aGVyIGluIGEgcmVnaXN0ZXIgaWYgYXZhaWxhYmxlLCBvciBvbiB0aGUgc3RhY2spLgorCisgICBGdW5jdGlvbnMgdGhhdCBtdXN0IHJldHVybiBhbiBhZ2dyZWdhdGUgdHlwZSBjYW4gcmV0dXJuIGl0IGluIHRoZSAKKyAgIG5vcm1hbCByZXR1cm4gdmFsdWUgcmVnaXN0ZXJzIChSMCBhbmQgUjEpIGlmIGl0cyBzaXplIGlzIDggYnl0ZXMgb3IKKyAgIGxlc3MuICBGb3IgbGFyZ2VyIHJldHVybiB2YWx1ZXMsIHRoZSBjYWxsZXIgbXVzdCBhbGxvY2F0ZSBzcGFjZSBmb3IgCisgICB0aGUgY2FsbGVlIHRvIGNvcHkgdGhlIHJldHVybiB2YWx1ZSB0by4gIEEgcG9pbnRlciB0byB0aGlzIHNwYWNlIGlzCisgICBwYXNzZWQgYXMgYW4gaW1wbGljaXQgZmlyc3QgYXJndW1lbnQsIGFsd2F5cyBpbiBSMC4gKi8KKworQ09SRV9BRERSCittMzJyX3B1c2hfYXJndW1lbnRzIChuYXJncywgYXJncywgc3AsIHN0cnVjdF9yZXR1cm4sIHN0cnVjdF9hZGRyKQorICAgICBpbnQgbmFyZ3M7CisgICAgIHZhbHVlX3B0ciAqYXJnczsKKyAgICAgQ09SRV9BRERSIHNwOworICAgICB1bnNpZ25lZCBjaGFyIHN0cnVjdF9yZXR1cm47CisgICAgIENPUkVfQUREUiBzdHJ1Y3RfYWRkcjsKK3sKKyAgaW50IHN0YWNrX29mZnNldCwgc3RhY2tfYWxsb2M7CisgIGludCBhcmdyZWc7CisgIGludCBhcmdudW07CisgIHN0cnVjdCB0eXBlICp0eXBlOworICBDT1JFX0FERFIgcmVndmFsOworICBjaGFyICp2YWw7CisgIGNoYXIgdmFsYnVmWzRdOworICBpbnQgbGVuOworICBpbnQgb2RkX3NpemVkX3N0cnVjdDsKKworICAvKiBmaXJzdCBmb3JjZSBzcCB0byBhIDQtYnl0ZSBhbGlnbm1lbnQgKi8KKyAgc3AgPSBzcCAmIH4zOworCisgIGFyZ3JlZyA9IEFSRzBfUkVHTlVNOyAgCisgIC8qIFRoZSAic3RydWN0IHJldHVybiBwb2ludGVyIiBwc2V1ZG8tYXJndW1lbnQgZ29lcyBpbiBSMCAqLworICBpZiAoc3RydWN0X3JldHVybikKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChhcmdyZWcrKywgc3RydWN0X2FkZHIpOworIAorICAvKiBOb3cgbWFrZSBzdXJlIHRoZXJlJ3Mgc3BhY2Ugb24gdGhlIHN0YWNrICovCisgIGZvciAoYXJnbnVtID0gMCwgc3RhY2tfYWxsb2MgPSAwOworICAgICAgIGFyZ251bSA8IG5hcmdzOyBhcmdudW0rKykKKyAgICBzdGFja19hbGxvYyArPSAoKFRZUEVfTEVOR1RIKFZBTFVFX1RZUEUoYXJnc1thcmdudW1dKSkgKyAzKSAmIH4zKTsKKyAgc3AgLT0gc3RhY2tfYWxsb2M7ICAgIC8qIG1ha2Ugcm9vbSBvbiBzdGFjayBmb3IgYXJncyAqLworIAorIAorICAvKiBOb3cgbG9hZCBhcyBtYW55IGFzIHBvc3NpYmxlIG9mIHRoZSBmaXJzdCBhcmd1bWVudHMgaW50bworICAgICByZWdpc3RlcnMsIGFuZCBwdXNoIHRoZSByZXN0IG9udG8gdGhlIHN0YWNrLiAgVGhlcmUgYXJlIDE2IGJ5dGVzCisgICAgIGluIGZvdXIgcmVnaXN0ZXJzIGF2YWlsYWJsZS4gIExvb3AgdGhydSBhcmdzIGZyb20gZmlyc3QgdG8gbGFzdC4gICovCisgCisgIGFyZ3JlZyA9IEFSRzBfUkVHTlVNOworICBmb3IgKGFyZ251bSA9IDAsIHN0YWNrX29mZnNldCA9IDA7IGFyZ251bSA8IG5hcmdzOyBhcmdudW0rKykKKyAgICB7CisgICAgICB0eXBlID0gVkFMVUVfVFlQRSAoYXJnc1thcmdudW1dKTsKKyAgICAgIGxlbiAgPSBUWVBFX0xFTkdUSCAodHlwZSk7CisgICAgICBtZW1zZXQodmFsYnVmLCAwLCBzaXplb2YodmFsYnVmKSk7CisgICAgICBpZiAobGVuIDwgNCkKKyAgICAgICAgeyAvKiB2YWx1ZSBnZXRzIHJpZ2h0LWp1c3RpZmllZCBpbiB0aGUgcmVnaXN0ZXIgb3Igc3RhY2sgd29yZCAqLworICAgICAgICAgIG1lbWNweSh2YWxidWYgKyAoNCAtIGxlbiksCisgICAgICAgICAgICAgICAgIChjaGFyICopIFZBTFVFX0NPTlRFTlRTIChhcmdzW2FyZ251bV0pLCBsZW4pOworICAgICAgICAgIHZhbCA9IHZhbGJ1ZjsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB2YWwgPSAoY2hhciAqKSBWQUxVRV9DT05URU5UUyAoYXJnc1thcmdudW1dKTsKKyAKKyAgICAgIGlmIChsZW4gPiA0ICYmIChsZW4gJiAzKSAhPSAwKQorICAgICAgICBvZGRfc2l6ZWRfc3RydWN0ID0gMTsgICAgICAgICAgIC8qIHN1Y2ggc3RydWN0cyBnbyBlbnRpcmVseSBvbiBzdGFjayAqLworICAgICAgZWxzZQorICAgICAgICBvZGRfc2l6ZWRfc3RydWN0ID0gMDsKKyAgICAgIHdoaWxlIChsZW4gPiAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGFyZ3JlZyA+IEFSR0xBU1RfUkVHTlVNIHx8IG9kZF9zaXplZF9zdHJ1Y3QpCisgICAgICAgICAgICB7CQkJCS8qIG11c3QgZ28gb24gdGhlIHN0YWNrICovCisgICAgICAgICAgICAgIHdyaXRlX21lbW9yeSAoc3AgKyBzdGFja19vZmZzZXQsIHZhbCwgNCk7CisgICAgICAgICAgICAgIHN0YWNrX29mZnNldCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgIC8qIE5PVEUgV0VMTCEhISEhICBUaGlzIGlzIG5vdCBhbiAiZWxzZSBpZiIgY2xhdXNlISEhCisgICAgICAgICAgICAgVGhhdCdzIGJlY2F1c2Ugc29tZSAqJl4lJCB0aGluZ3MgZ2V0IHBhc3NlZCBvbiB0aGUgc3RhY2sKKyAgICAgICAgICAgICBBTkQgaW4gdGhlIHJlZ2lzdGVycyEgICAqLworICAgICAgICAgIGlmIChhcmdyZWcgPD0gQVJHTEFTVF9SRUdOVU0pCisgICAgICAgICAgICB7CQkJCS8qIHRoZXJlJ3Mgcm9vbSBpbiBhIHJlZ2lzdGVyICovCisgICAgICAgICAgICAgIHJlZ3ZhbCA9IGV4dHJhY3RfYWRkcmVzcyAodmFsLCBSRUdJU1RFUl9SQVdfU0laRShhcmdyZWcpKTsKKyAgICAgICAgICAgICAgd3JpdGVfcmVnaXN0ZXIgKGFyZ3JlZysrLCByZWd2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgIC8qIFN0b3JlIHRoZSB2YWx1ZSA0IGJ5dGVzIGF0IGEgdGltZS4gIFRoaXMgbWVhbnMgdGhhdCB0aGluZ3MKKyAgICAgICAgICAgICBsYXJnZXIgdGhhbiA0IGJ5dGVzIG1heSBnbyBwYXJ0bHkgaW4gcmVnaXN0ZXJzIGFuZCBwYXJ0bHkKKyAgICAgICAgICAgICBvbiB0aGUgc3RhY2suICAqLworICAgICAgICAgIGxlbiAtPSBSRUdJU1RFUl9SQVdfU0laRShhcmdyZWcpOworICAgICAgICAgIHZhbCArPSBSRUdJU1RFUl9SQVdfU0laRShhcmdyZWcpOworICAgICAgICB9CisgICAgfQorICByZXR1cm4gc3A7Cit9CisKKy8qIEZ1bmN0aW9uOiBmaXhfY2FsbF9kdW1teSAKKyAgIElmIHRoZXJlIGlzIHJlYWwgQ0FMTF9EVU1NWSBjb2RlIChlZy4gb24gdGhlIHN0YWNrKSwgdGhpcyBmdW5jdGlvbgorICAgaGFzIHRoZSByZXNwb25zYWJpbGl0eSB0byBpbnNlcnQgdGhlIGFkZHJlc3Mgb2YgdGhlIGFjdHVhbCBjb2RlIHRoYXQKKyAgIGlzIHRoZSB0YXJnZXQgb2YgdGhlIHRhcmdldCBmdW5jdGlvbiBjYWxsLiAgKi8KKwordm9pZAorbTMycl9maXhfY2FsbF9kdW1teSAoZHVtbXksIHBjLCBmdW4sIG5hcmdzLCBhcmdzLCB0eXBlLCBnY2NfcCkKKyAgICAgY2hhciAqZHVtbXk7CisgICAgIENPUkVfQUREUiBwYzsKKyAgICAgQ09SRV9BRERSIGZ1bjsKKyAgICAgaW50IG5hcmdzOworICAgICB2YWx1ZV9wdHIgKmFyZ3M7CisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBpbnQgZ2NjX3A7Cit7CisgIC8qIGxkMjQgcjgsIDwoaW1tMjQpIGZ1bj4gKi8KKyAgKih1bnNpZ25lZCBsb25nICopIChkdW1teSkgPSAoZnVuICYgMHgwMGZmZmZmZikgfCAweGU4MDAwMDAwOworfQorCisvKiBGdW5jdGlvbjogZ2V0X3NhdmVkX3JlZ2lzdGVyCisgICBKdXN0IGNhbGwgdGhlIGdlbmVyaWNfZ2V0X3NhdmVkX3JlZ2lzdGVyIGZ1bmN0aW9uLiAgKi8KKwordm9pZAorZ2V0X3NhdmVkX3JlZ2lzdGVyIChyYXdfYnVmZmVyLCBvcHRpbWl6ZWQsIGFkZHJwLCBmcmFtZSwgcmVnbnVtLCBsdmFsKQorICAgICBjaGFyICpyYXdfYnVmZmVyOworICAgICBpbnQgKm9wdGltaXplZDsKKyAgICAgQ09SRV9BRERSICphZGRycDsKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworICAgICBpbnQgcmVnbnVtOworICAgICBlbnVtIGx2YWxfdHlwZSAqbHZhbDsKK3sKKyAgZ2VuZXJpY19nZXRfc2F2ZWRfcmVnaXN0ZXIgKHJhd19idWZmZXIsIG9wdGltaXplZCwgYWRkcnAsIAorCQkJICAgICAgZnJhbWUsIHJlZ251bSwgbHZhbCk7Cit9CisKKworLyogRnVuY3Rpb246IG0zMnJfd3JpdGVfc3AKKyAgIEJlY2F1c2UgU1AgaXMgcmVhbGx5IGEgcmVhZC1vbmx5IHJlZ2lzdGVyIHRoYXQgbWlycm9ycyBlaXRoZXIgU1BVIG9yIFNQSSwKKyAgIHdlIG11c3QgYWN0dWFsbHkgd3JpdGUgb25lIG9mIHRob3NlIHR3byBhcyB3ZWxsLCBkZXBlbmRpbmcgb24gUFNXLiAqLworCit2b2lkCittMzJyX3dyaXRlX3NwICh2YWwpCisgICAgIENPUkVfQUREUiB2YWw7Cit7CisgIHVuc2lnbmVkIGxvbmcgcHN3ID0gcmVhZF9yZWdpc3RlciAoUFNXX1JFR05VTSk7CisKKyAgaWYgKHBzdyAmIDB4ODApCS8qIHN0YWNrIG1vZGU6IHVzZXIgb3IgaW50ZXJydXB0ICovCisgICAgd3JpdGVfcmVnaXN0ZXIgKFNQVV9SRUdOVU0sIHZhbCk7CisgIGVsc2UKKyAgICB3cml0ZV9yZWdpc3RlciAoU1BJX1JFR05VTSwgdmFsKTsKKyAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgdmFsKTsKK30KKwordm9pZAorX2luaXRpYWxpemVfbTMycl90ZGVwICgpCit7CisgIHRtX3ByaW50X2luc24gPSBwcmludF9pbnNuX20zMnI7Cit9CisKZGlmZiAtLWdpdCBhL2dkYi9tNjhrLXN0dWIuYyBiL2dkYi9tNjhrLXN0dWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmYxZDNmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL202OGstc3R1Yi5jCkBAIC0wLDAgKzEsMTAxNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCQlUSElTIFNPRlRXQVJFIElTIE5PVCBDT1BZUklHSFRFRCAgCisgICAKKyAgIEhQIG9mZmVycyB0aGUgZm9sbG93aW5nIGZvciB1c2UgaW4gdGhlIHB1YmxpYyBkb21haW4uICBIUCBtYWtlcyBubworICAgd2FycmFudHkgd2l0aCByZWdhcmQgdG8gdGhlIHNvZnR3YXJlIG9yIGl0J3MgcGVyZm9ybWFuY2UgYW5kIHRoZSAKKyAgIHVzZXIgYWNjZXB0cyB0aGUgc29mdHdhcmUgIkFTIElTIiB3aXRoIGFsbCBmYXVsdHMuCisKKyAgIEhQIERJU0NMQUlNUyBBTlkgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBXSVRIIFJFR0FSRAorICAgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEhlYWRlcjogcmVtY29tLmMsdiAxLjM0IDkxLzAzLzA5IDEyOjI5OjQ5IGdsZW5uZSBFeHAgJCAgICAgICAgICAgICAgICAgICAKKyAqCisgKiAgTW9kdWxlIG5hbWU6IHJlbWNvbS5jICQgIAorICogIFJldmlzaW9uOiAxLjM0ICQKKyAqICBEYXRlOiA5MS8wMy8wOSAxMjoyOTo0OSAkCisgKiAgQ29udHJpYnV0b3I6ICAgICBMYWtlIFN0ZXZlbnMgSW5zdHJ1bWVudCBEaXZpc2lvbiQKKyAqICAKKyAqICBEZXNjcmlwdGlvbjogICAgIGxvdyBsZXZlbCBzdXBwb3J0IGZvciBnZGIgZGVidWdnZXIuICQKKyAqCisgKiAgQ29uc2lkZXJhdGlvbnM6ICBvbmx5IHdvcmtzIG9uIHRhcmdldCBoYXJkd2FyZSAkCisgKgorICogIFdyaXR0ZW4gYnk6ICAgICAgR2xlbm4gRW5nZWwgJAorICogIE1vZHVsZVN0YXRlOiAgICAgRXhwZXJpbWVudGFsICQgCisgKgorICogIE5PVEVTOiAgICAgICAgICAgU2VlIEJlbG93ICQKKyAqIAorICogIFRvIGVuYWJsZSBkZWJ1Z2dlciBzdXBwb3J0LCB0d28gdGhpbmdzIG5lZWQgdG8gaGFwcGVuLiAgT25lLCBhCisgKiAgY2FsbCB0byBzZXRfZGVidWdfdHJhcHMoKSBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gYWxsb3cgYW55IGJyZWFrcG9pbnRzCisgKiAgb3IgZXJyb3IgY29uZGl0aW9ucyB0byBiZSBwcm9wZXJseSBpbnRlcmNlcHRlZCBhbmQgcmVwb3J0ZWQgdG8gZ2RiLgorICogIFR3bywgYSBicmVha3BvaW50IG5lZWRzIHRvIGJlIGdlbmVyYXRlZCB0byBiZWdpbiBjb21tdW5pY2F0aW9uLiAgVGhpcworICogIGlzIG1vc3QgZWFzaWx5IGFjY29tcGxpc2hlZCBieSBhIGNhbGwgdG8gYnJlYWtwb2ludCgpLiAgQnJlYWtwb2ludCgpCisgKiAgc2ltdWxhdGVzIGEgYnJlYWtwb2ludCBieSBleGVjdXRpbmcgYSB0cmFwICMxLiAgVGhlIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24KKyAqICBpcyBoYXJkd2lyZWQgdG8gdHJhcCAjMSBiZWNhdXNlIG5vdCB0byBkbyBzbyBpcyBhIGNvbXBhdGliaWxpdHkgcHJvYmxlbS0tCisgKiAgdGhlcmUgZWl0aGVyIHNob3VsZCBiZSBhIHN0YW5kYXJkIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24sIG9yIHRoZSBwcm90b2NvbAorICogIHNob3VsZCBiZSBleHRlbmRlZCB0byBwcm92aWRlIHNvbWUgbWVhbnMgdG8gY29tbXVuaWNhdGUgd2hpY2ggYnJlYWtwb2ludAorICogIGluc3RydWN0aW9uIGlzIGluIHVzZSAob3IgaGF2ZSB0aGUgc3R1YiBpbnNlcnQgdGhlIGJyZWFrcG9pbnQpLgorICogIAorICogIFNvbWUgZXhwbGFuYXRpb24gaXMgcHJvYmFibHkgbmVjZXNzYXJ5IHRvIGV4cGxhaW4gaG93IGV4Y2VwdGlvbnMgYXJlCisgKiAgaGFuZGxlZC4gIFdoZW4gYW4gZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkIHRoZSA2ODAwMCBwdXNoZXMgdGhlIGN1cnJlbnQKKyAqICBwcm9ncmFtIGNvdW50ZXIgYW5kIHN0YXR1cyByZWdpc3RlciBvbnRvIHRoZSBzdXBlcnZpc29yIHN0YWNrIGFuZCB0aGVuCisgKiAgdHJhbnNmZXJzIGV4ZWN1dGlvbiB0byBhIGxvY2F0aW9uIHNwZWNpZmllZCBpbiBpdCdzIHZlY3RvciB0YWJsZS4KKyAqICBUaGUgaGFuZGxlcnMgZm9yIHRoZSBleGNlcHRpb24gdmVjdG9ycyBhcmUgaGFyZHdpcmVkIHRvIGptcCB0byBhbiBhZGRyZXNzCisgKiAgZ2l2ZW4gYnkgdGhlIHJlbGF0aW9uOiAgKGV4Y2VwdGlvbiAtIDI1NikgKiA2LiAgVGhlc2UgYXJlIGRlY2VuZGluZyAKKyAqICBhZGRyZXNzZXMgc3RhcnRpbmcgZnJvbSAtNiwgLTEyLCAtMTgsIC4uLiAgQnkgYWxsb3dpbmcgNiBieXRlcyBmb3IKKyAqICBlYWNoIGVudHJ5LCBhIGpzciwgam1wLCBic3IsIC4uLiBjYW4gYmUgdXNlZCB0byBlbnRlciB0aGUgZXhjZXB0aW9uIAorICogIGhhbmRsZXIuICBVc2luZyBhIGpzciB0byBoYW5kbGUgYW4gZXhjZXB0aW9uIGhhcyBhbiBhZGRlZCBiZW5lZml0IG9mCisgKiAgYWxsb3dpbmcgYSBzaW5nbGUgaGFuZGxlciB0byBzZXJ2aWNlIHNldmVyYWwgZXhjZXB0aW9ucyBhbmQgdXNlIHRoZQorICogIHJldHVybiBhZGRyZXNzIGFzIHRoZSBrZXkgZGlmZmVyZW50aWF0aW9uLiAgVGhlIHZlY3RvciBudW1iZXIgY2FuIGJlCisgKiAgY29tcHV0ZWQgZnJvbSB0aGUgcmV0dXJuIGFkZHJlc3MgYnkgWyBleGNlcHRpb24gPSAoYWRkciArIDE1MzApIC8gNiBdLgorICogIFRoZSBzb2xlIHB1cnBvc2Ugb2YgdGhlIHJvdXRpbmUgX2NhdGNoRXhjZXB0aW9uIGlzIHRvIGNvbXB1dGUgdGhlCisgKiAgZXhjZXB0aW9uIG51bWJlciBhbmQgcHVzaCBpdCBvbiB0aGUgc3RhY2sgaW4gcGxhY2Ugb2YgdGhlIHJldHVybiBhZGRyZXNzLgorICogIFRoZSBleHRlcm5hbCBmdW5jdGlvbiBleGNlcHRpb25IYW5kbGVyKCkgaXMKKyAqICB1c2VkIHRvIGF0dGFjaCBhIHNwZWNpZmljIGhhbmRsZXIgdG8gYSBzcGVjaWZpYyBtNjhrIGV4Y2VwdGlvbi4KKyAqICBGb3IgNjgwMjAgbWFjaGluZXMsIHRoZSBhYmlsaXR5IHRvIGhhdmUgYSByZXR1cm4gYWRkcmVzcyBhcm91bmQganVzdAorICogIHNvIHRoZSB2ZWN0b3IgY2FuIGJlIGRldGVybWluZWQgaXMgbm90IG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSAnMDIwIHB1c2hlcyBhbgorICogIGV4dHJhIHdvcmQgb250byB0aGUgc3RhY2sgY29udGFpbmluZyB0aGUgdmVjdG9yIG9mZnNldAorICogCisgKiAgQmVjYXVzZSBnZGIgd2lsbCBzb21ldGltZXMgd3JpdGUgdG8gdGhlIHN0YWNrIGFyZWEgdG8gZXhlY3V0ZSBmdW5jdGlvbgorICogIGNhbGxzLCB0aGlzIHByb2dyYW0gY2Fubm90IHJlbHkgb24gdXNpbmcgdGhlIHN1cGVydmlzb3Igc3RhY2sgc28gaXQKKyAqICB1c2VzIGl0J3Mgb3duIHN0YWNrIGFyZWEgcmVzZXJ2ZWQgaW4gdGhlIGludCBhcnJheSByZW1jb21TdGFjay4gIAorICogCisgKioqKioqKioqKioqKgorICoKKyAqICAgIFRoZSBmb2xsb3dpbmcgZ2RiIGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQ6CisgKiAKKyAqIGNvbW1hbmQgICAgICAgICAgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuIHZhbHVlCisgKiAKKyAqICAgIGcgICAgICAgICAgICAgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgQ1BVIHJlZ2lzdGVycyAgaGV4IGRhdGEgb3IgRU5OCisgKiAgICBHICAgICAgICAgICAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIENQVSByZWdpc3RlcnMgICAgIE9LIG9yIEVOTgorICogCisgKiAgICBtQUEuLkFBLExMTEwgIFJlYWQgTExMTCBieXRlcyBhdCBhZGRyZXNzIEFBLi5BQSAgICAgIGhleCBkYXRhIG9yIEVOTgorICogICAgTUFBLi5BQSxMTExMOiBXcml0ZSBMTExMIGJ5dGVzIGF0IGFkZHJlc3MgQUEuQUEgICAgICBPSyBvciBFTk4KKyAqIAorICogICAgYyAgICAgICAgICAgICBSZXN1bWUgYXQgY3VycmVudCBhZGRyZXNzICAgICAgICAgICAgICBTTk4gICAoIHNpZ25hbCBOTikKKyAqICAgIGNBQS4uQUEgICAgICAgQ29udGludWUgYXQgYWRkcmVzcyBBQS4uQUEgICAgICAgICAgICAgU05OCisgKiAKKyAqICAgIHMgICAgICAgICAgICAgU3RlcCBvbmUgaW5zdHJ1Y3Rpb24gICAgICAgICAgICAgICAgICAgU05OCisgKiAgICBzQUEuLkFBICAgICAgIFN0ZXAgb25lIGluc3RydWN0aW9uIGZyb20gQUEuLkFBICAgICAgIFNOTgorICogCisgKiAgICBrICAgICAgICAgICAgIGtpbGwKKyAqCisgKiAgICA/ICAgICAgICAgICAgIFdoYXQgd2FzIHRoZSBsYXN0IHNpZ3ZhbCA/ICAgICAgICAgICAgIFNOTiAgIChzaWduYWwgTk4pCisgKiAKKyAqIEFsbCBjb21tYW5kcyBhbmQgcmVzcG9uc2VzIGFyZSBzZW50IHdpdGggYSBwYWNrZXQgd2hpY2ggaW5jbHVkZXMgYSAKKyAqIGNoZWNrc3VtLiAgQSBwYWNrZXQgY29uc2lzdHMgb2YgCisgKiAKKyAqICQ8cGFja2V0IGluZm8+IzxjaGVja3N1bT4uCisgKiAKKyAqIHdoZXJlCisgKiA8cGFja2V0IGluZm8+IDo6IDxjaGFyYWN0ZXJzIHJlcHJlc2VudGluZyB0aGUgY29tbWFuZCBvciByZXNwb25zZT4KKyAqIDxjaGVja3N1bT4gICAgOjogPCB0d28gaGV4IGRpZ2l0cyBjb21wdXRlZCBhcyBtb2R1bG8gMjU2IHN1bSBvZiA8cGFja2V0aW5mbz4+CisgKiAKKyAqIFdoZW4gYSBwYWNrZXQgaXMgcmVjZWl2ZWQsIGl0IGlzIGZpcnN0IGFja25vd2xlZGdlZCB3aXRoIGVpdGhlciAnKycgb3IgJy0nLgorICogJysnIGluZGljYXRlcyBhIHN1Y2Nlc3NmdWwgdHJhbnNmZXIuICAnLScgaW5kaWNhdGVzIGEgZmFpbGVkIHRyYW5zZmVyLgorICogCisgKiBFeGFtcGxlOgorICogCisgKiBIb3N0OiAgICAgICAgICAgICAgICAgIFJlcGx5OgorICogJG0wLDEwIzJhICAgICAgICAgICAgICAgKyQwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNSM0MgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBleHRlcm5hbCBsb3ctbGV2ZWwgc3VwcG9ydCByb3V0aW5lcyAKKyAqLwordHlwZWRlZiB2b2lkICgqRXhjZXB0aW9uSG9vaykoaW50KTsgICAvKiBwb2ludGVyIHRvIGZ1bmN0aW9uIHdpdGggaW50IHBhcm0gKi8KK3R5cGVkZWYgdm9pZCAoKkZ1bmN0aW9uKSgpOyAgICAgICAgICAgLyogcG9pbnRlciB0byBhIGZ1bmN0aW9uICovCisKK2V4dGVybiB2b2lkIHB1dERlYnVnQ2hhcigpOwkvKiB3cml0ZSBhIHNpbmdsZSBjaGFyYWN0ZXIgICAgICAqLworZXh0ZXJuIGludCBnZXREZWJ1Z0NoYXIoKTsJLyogcmVhZCBhbmQgcmV0dXJuIGEgc2luZ2xlIGNoYXIgKi8KKworZXh0ZXJuIEZ1bmN0aW9uIGV4Y2VwdGlvbkhhbmRsZXIoKTsgIC8qIGFzc2lnbiBhbiBleGNlcHRpb24gaGFuZGxlciAqLworZXh0ZXJuIEV4Y2VwdGlvbkhvb2sgZXhjZXB0aW9uSG9vazsgIC8qIGhvb2sgdmFyaWFibGUgZm9yIGVycm9ycy9leGNlcHRpb25zICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGT1JXQVJEIERFQ0xBUkFUSU9OUyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpbml0aWFsaXplUmVtY29tRXJyb3JGcmFtZSAoKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJVRk1BWCBkZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGluYm91bmQvb3V0Ym91bmQgYnVmZmVycyovCisvKiBhdCBsZWFzdCBOVU1SRUdCWVRFUyoyIGFyZSBuZWVkZWQgZm9yIHJlZ2lzdGVyIHBhY2tldHMgKi8KKyNkZWZpbmUgQlVGTUFYIDQwMAorCitzdGF0aWMgY2hhciBpbml0aWFsaXplZDsgIC8qIGJvb2xlYW4gZmxhZy4gIT0gMCBtZWFucyB3ZSd2ZSBiZWVuIGluaXRpYWxpemVkICovCisKK2ludCAgICAgcmVtb3RlX2RlYnVnOworLyogIGRlYnVnID4gIDAgcHJpbnRzIGlsbC1mb3JtZWQgY29tbWFuZHMgaW4gdmFsaWQgcGFja2V0cyAmIGNoZWNrc3VtIGVycm9ycyAqLyAKKworc3RhdGljIGNvbnN0IGNoYXIgaGV4Y2hhcnNbXT0iMDEyMzQ1Njc4OWFiY2RlZiI7CisKKy8qIHRoZXJlIGFyZSAxODAgYnl0ZXMgb2YgcmVnaXN0ZXJzIG9uIGEgNjgwMjAgdy82ODg4MSAgICAgICovCisvKiBtYW55IG9mIHRoZSBmcGEgcmVnaXN0ZXJzIGFyZSAxMiBieXRlICg5NiBiaXQpIHJlZ2lzdGVycyAqLworI2RlZmluZSBOVU1SRUdCWVRFUyAxODAKK2VudW0gcmVnbmFtZXMge0QwLEQxLEQyLEQzLEQ0LEQ1LEQ2LEQ3LCAKKyAgICAgICAgICAgICAgIEEwLEExLEEyLEEzLEE0LEE1LEE2LEE3LCAKKyAgICAgICAgICAgICAgIFBTLFBDLAorICAgICAgICAgICAgICAgRlAwLEZQMSxGUDIsRlAzLEZQNCxGUDUsRlA2LEZQNywKKyAgICAgICAgICAgICAgIEZQQ09OVFJPTCxGUFNUQVRVUyxGUElBRERSCisgICAgICAgICAgICAgIH07CisKKwwKKy8qIFdlIGtlZXAgYSB3aG9sZSBmcmFtZSBjYWNoZSBoZXJlLiAgIldoeT8iLCBJIGhlYXIgeW91IGNyeSwgImRvZXNuJ3QKKyAgIEdEQiBoYW5kbGUgdGhhdCBzb3J0IG9mIHRoaW5nPyIgIFdlbGwsIHllcywgSSBiZWxpZXZlIHRoZSBvbmx5CisgICByZWFzb24gZm9yIHRoaXMgY2FjaGUgaXMgdG8gc2F2ZSBhbmQgcmVzdG9yZSBmbG9hdGluZyBwb2ludCBzdGF0ZQorICAgKGZzYXZlL2ZyZXN0b3JlKS4gIEEgY2xlYW5lciB3YXkgdG8gZG8gdGhpcyB3b3VsZCBiZSB0byBtYWtlIHRoZQorIGZzYXZlIGRhdGEgcGFydCBvZiB0aGUgcmVnaXN0ZXJzIHdoaWNoIEdEQiBkZWFscyB3aXRoIGxpa2UgYW55CisgICBvdGhlciByZWdpc3RlcnMuICBUaGlzIHNob3VsZCBub3QgYmUgYSBwZXJmb3JtYW5jZSBwcm9ibGVtIGlmIHRoZQorICAgYWJpbGl0eSB0byByZWFkIGluZGl2aWR1YWwgcmVnaXN0ZXJzIGlzIGFkZGVkIHRvIHRoZSBwcm90b2NvbC4gICovCisKK3R5cGVkZWYgc3RydWN0IEZyYW1lU3RydWN0Cit7CisgICAgc3RydWN0IEZyYW1lU3RydWN0ICAqcHJldmlvdXM7CisgICAgaW50ICAgICAgIGV4Y2VwdGlvblBDOyAgICAgIC8qIHBjIHZhbHVlIHdoZW4gdGhpcyBmcmFtZSBjcmVhdGVkICovCisgICAgaW50ICAgICAgIGV4Y2VwdGlvblZlY3RvcjsgIC8qIGNwdSB2ZWN0b3IgY2F1c2luZyBleGNlcHRpb24gICAgICovCisgICAgc2hvcnQgICAgIGZyYW1lU2l6ZTsgICAgICAgIC8qIHNpemUgb2YgY3B1IGZyYW1lIGluIHdvcmRzICAgICAgICovCisgICAgc2hvcnQgICAgIHNyOyAgICAgICAgICAgICAgIC8qIGZvciA2ODAwMCwgdGhpcyBub3QgYWx3YXlzIHNyICAgICovCisgICAgaW50ICAgICAgIHBjOworICAgIHNob3J0ICAgICBmb3JtYXQ7CisgICAgaW50ICAgICAgIGZzYXZlSGVhZGVyOworICAgIGludCAgICAgICBtb3JlanVua1swXTsgICAgICAgIC8qIGV4Y2VwdGlvbiBmcmFtZSwgZnAgc2F2ZS4uLiAqLworfSBGcmFtZTsKKworI2RlZmluZSBGUkFNRVNJWkUgNTAwCitpbnQgICBnZGJGcmFtZVN0YWNrW0ZSQU1FU0laRV07CitzdGF0aWMgRnJhbWUgKmxhc3RGcmFtZTsKKworLyoKKyAqIHRoZXNlIHNob3VsZCBub3QgYmUgc3RhdGljIGN1eiB0aGV5IGNhbiBiZSB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKKyAqLworaW50IHJlZ2lzdGVyc1tOVU1SRUdCWVRFUy80XTsKK2ludCBzdXBlclN0YWNrOworCisjZGVmaW5lIFNUQUNLU0laRSAxMDAwMAoraW50IHJlbWNvbVN0YWNrW1NUQUNLU0laRS9zaXplb2YoaW50KV07CitzdGF0aWMgaW50KiBzdGFja1B0ciA9ICZyZW1jb21TdGFja1tTVEFDS1NJWkUvc2l6ZW9mKGludCkgLSAxXTsKKworLyoKKyAqIEluIG1hbnkgY2FzZXMsIHRoZSBzeXN0ZW0gd2lsbCB3YW50IHRvIGNvbnRpbnVlIGV4Y2VwdGlvbiBwcm9jZXNzaW5nCisgKiB3aGVuIGEgY29udGludWUgY29tbWFuZCBpcyBnaXZlbi4gIAorICogb2xkRXhjZXB0aW9uSG9vayBpcyBhIGZ1bmN0aW9uIHRvIGludm9rZSBpbiB0aGlzIGNhc2UuCisgKi8KKworc3RhdGljIEV4Y2VwdGlvbkhvb2sgb2xkRXhjZXB0aW9uSG9vazsKKworI2lmZGVmIG1jNjgwMjAKKy8qIHRoZSBzaXplIG9mIHRoZSBleGNlcHRpb24gc3RhY2sgb24gdGhlIDY4MDIwIHZhcmllcyB3aXRoIHRoZSB0eXBlIG9mCisgKiBleGNlcHRpb24uICBUaGUgZm9sbG93aW5nIHRhYmxlIGlzIHRoZSBudW1iZXIgb2YgV09SRFMgdXNlZAorICogZm9yIGVhY2ggZXhjZXB0aW9uIGZvcm1hdC4KKyAqLworY29uc3Qgc2hvcnQgZXhjZXB0aW9uU2l6ZVtdID0geyA0LDQsNiw0LDQsNCw0LDQsMjksMTAsMTYsNDYsMTIsNCw0LDQgfTsKKyNlbmRpZgorCisjaWZkZWYgbWM2ODMzMgorc3RhdGljIGNvbnN0IHNob3J0IGV4Y2VwdGlvblNpemVbXSA9IHsgNCw0LDYsNCw0LDQsNCw0LDQsNCw0LDQsMTYsNCw0LDQgfTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKiBqdW1wIGJ1ZmZlciB1c2VkIGZvciBzZXRqbXAvbG9uZ2ptcCAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ptcF9idWYgcmVtY29tRW52OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBBU1NFTUJMWSBDT0RFIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogCQkJCQkJCQkJICAgKi8KKworI2lmZGVmIF9fSEFWRV82ODg4MV9fCisvKiBkbyBhbiBmc2F2ZSwgdGhlbiByZW1lbWJlciB0aGUgYWRkcmVzcyB0byBiZWdpbiBhIHJlc3RvcmUgZnJvbSAqLworI2RlZmluZSBTQVZFX0ZQX1JFR1MoKSAgICBhc20oIiBmc2F2ZSAgIGEwQC0iKTsJCVwKKwkJCSAgYXNtKCIgZm1vdmVteCBmcDAtZnA3LF9yZWdpc3RlcnMrNzIiKTsgICAgICAgIFwKKwkJCSAgYXNtKCIgZm1vdmVtbCBmcGNyL2Zwc3IvZnBpLF9yZWdpc3RlcnMrMTY4Iik7IAorI2RlZmluZSBSRVNUT1JFX0ZQX1JFR1MoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2FzbSgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cCisgICAgZm1vdmVtbCAgX3JlZ2lzdGVycysxNjgsZnBjci9mcHNyL2ZwaSAgICAgICAgICAgIFxuXAorICAgIGZtb3ZlbXggIF9yZWdpc3RlcnMrNzIsZnAwLWZwNyAgICAgICAgICAgICAgICAgICBcblwKKyAgICBjbXBsICAgICAjLTEsYTBAICAgICB8ICBza2lwIGZyZXN0b3JlIGZsYWcgc2V0ID8gXG5cCisgICAgYmVxICAgICAgc2tpcF9mcmVzdG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXAorICAgIGZyZXN0b3JlIGEwQCsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblwKK3NraXBfZnJlc3RvcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cCisiKTsKKworI2Vsc2UKKyNkZWZpbmUgU0FWRV9GUF9SRUdTKCkKKyNkZWZpbmUgUkVTVE9SRV9GUF9SRUdTKCkKKyNlbmRpZiAvKiBfX0hBVkVfNjg4ODFfXyAqLworCit2b2lkIHJldHVybl90b19zdXBlcigpOwordm9pZCByZXR1cm5fdG9fdXNlcigpOworCithc20oIgorLnRleHQKKy5nbG9ibCBfcmV0dXJuX3RvX3N1cGVyCitfcmV0dXJuX3RvX3N1cGVyOgorICAgICAgICBtb3ZlbCAgIF9yZWdpc3RlcnMrNjAsc3AgLyogZ2V0IG5ldyBzdGFjayBwb2ludGVyICovICAgICAgICAKKyAgICAgICAgbW92ZWwgICBfbGFzdEZyYW1lLGEwICAgLyogZ2V0IGxhc3QgZnJhbWUgaW5mbyAgKi8gICAgICAgICAgICAgIAorICAgICAgICBicmEgICAgIHJldHVybl90b19hbnkKKworLmdsb2JsIF9yZXR1cm5fdG9fdXNlcgorX3JldHVybl90b191c2VyOgorICAgICAgICBtb3ZlbCAgIF9yZWdpc3RlcnMrNjAsYTAgLyogZ2V0IHVzcCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIG1vdmVsICAgYTAsdXNwICAgICAgICAgICAvKiBzZXQgdXNwICovCQkJCQorICAgICAgICBtb3ZlbCAgIF9zdXBlclN0YWNrLHNwICAvKiBnZXQgb3JpZ2luYWwgc3RhY2sgcG9pbnRlciAqLyAgICAgICAgCisKK3JldHVybl90b19hbnk6CisgICAgICAgIG1vdmVsICAgX2xhc3RGcmFtZSxhMCAgIC8qIGdldCBsYXN0IGZyYW1lIGluZm8gICovICAgICAgICAgICAgICAKKyAgICAgICAgbW92ZWwgICBhMEArLF9sYXN0RnJhbWUgLyogbGluayBpbiBwcmV2aW91cyBmcmFtZSAgICAgKi8gICAgICAgIAorICAgICAgICBhZGRxbCAgICM4LGEwICAgICAgICAgICAvKiBza2lwIG92ZXIgcGMsIHZlY3RvciMqLyAgICAgICAgICAgICAgCisgICAgICAgIG1vdmV3ICAgYTBAKyxkMCAgICAgICAgIC8qIGdldCAjIG9mIHdvcmRzIGluIGNwdSBmcmFtZSAqLyAgICAgICAKKyAgICAgICAgYWRkdyAgICBkMCxhMCAgICAgICAgICAgLyogcG9pbnQgdG8gZW5kIG9mIGRhdGEgICAgICAgICovICAgICAgIAorICAgICAgICBhZGR3ICAgIGQwLGEwICAgICAgICAgICAvKiBwb2ludCB0byBlbmQgb2YgZGF0YSAgICAgICAgKi8gICAgICAgCisgICAgICAgIG1vdmVsICAgYTAsYTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIyBjb3B5IHRoZSBzdGFjayBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHN1YnFsICAgIzEsZDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK2NvcHlVc2VyTG9vcDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgbW92ZXcgICBhMUAtLHNwQC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBkYmYgICAgIGQwLGNvcHlVc2VyTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFJFU1RPUkVfRlBfUkVHUygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgYXNtKCIgICBtb3ZlbWwgIF9yZWdpc3RlcnMsZDAtZDcvYTAtYTYiKTsJCQkgICAgICAgIAorICAgYXNtKCIgICBydGUiKTsgIC8qIHBvcCBhbmQgZ28hICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyNkZWZpbmUgRElTQUJMRV9JTlRFUlJVUFRTKCkgICBhc20oIiAgICAgICAgIG9yaXcgICAjMHgwNzAwLHNyIik7CisjZGVmaW5lIEJSRUFLUE9JTlQoKSBhc20oIiAgIHRyYXAgIzEiKTsKKworLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgd2hlbiBhIGxldmVsIDcgaW50ZXJydXB0IG9jY3VycyAqLworLyogaWYgdGhlIHByZXZpb3VzIGludGVycnVwdCBsZXZlbCB3YXMgNyB0aGVuIHdlJ3JlIGFscmVhZHkgc2VydmljaW5nICAqLworLyogdGhpcyBpbnRlcnJ1cHQgYW5kIGFuIHJ0ZSBpcyBpbiBvcmRlciB0byByZXR1cm4gdG8gdGhlIGRlYnVnZ2VyLiAgICAqLworLyogRm9yIHRoZSA2ODAwMCwgdGhlIG9mZnNldCBmb3Igc3IgaXMgNiBkdWUgdG8gdGhlIGpzciByZXR1cm4gYWRkcmVzcyAqLworYXNtKCIKKy50ZXh0CisuZ2xvYmwgX19kZWJ1Z19sZXZlbDcKK19fZGVidWdfbGV2ZWw3OgorCW1vdmV3ICAgZDAsc3BALSIpOworI2lmIGRlZmluZWQgKG1jNjgwMjApIHx8IGRlZmluZWQgKG1jNjgzMzIpCithc20oIgltb3ZldyAgIHNwQCgyKSxkMCIpOworI2Vsc2UKK2FzbSgiCW1vdmV3ICAgc3BAKDYpLGQwIik7CisjZW5kaWYKK2FzbSgiCWFuZGl3ICAgIzB4NzAwLGQwCisJY21waXcgICAjMHg3MDAsZDAKKwliZXEgICAgIF9hbHJlYWR5NworICAgICAgICBtb3ZldyAgIHNwQCssZDAJCisgICAgICAgIGJyYSAgICAgX19jYXRjaEV4Y2VwdGlvbgorX2FscmVhZHk3OgorCW1vdmV3ICAgc3BAKyxkMCIpOworI2lmICFkZWZpbmVkIChtYzY4MDIwKSAmJiAhZGVmaW5lZCAobWM2ODMzMikKK2FzbSgiCWxlYSAgICAgc3BAKDQpLHNwIik7ICAgICAvKiBwdWxsIG9mZiA2ODAwMCByZXR1cm4gYWRkcmVzcyAqLworI2VuZGlmCithc20oIglydGUiKTsKKworZXh0ZXJuIHZvaWQgX2NhdGNoRXhjZXB0aW9uICgpOworCisjaWYgZGVmaW5lZCAobWM2ODAyMCkgfHwgZGVmaW5lZCAobWM2ODMzMikKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSA2ODAyMCBleGNlcHRpb24gb2NjdXJzLiAgSXQgc2F2ZXMKKyAqIGFsbCB0aGUgY3B1IGFuZCBmcGNwIHJlZ3MgaW4gdGhlIF9yZWdpc3RlcnMgYXJyYXksIGNyZWF0ZXMgYSBmcmFtZSBvbiBhCisgKiBsaW5rZWQgbGlzdCBvZiBmcmFtZXMgd2hpY2ggaGFzIHRoZSBjcHUgYW5kIGZwY3Agc3RhY2sgZnJhbWVzIG5lZWRlZAorICogdG8gcHJvcGVybHkgcmVzdG9yZSB0aGUgY29udGV4dCBvZiB0aGVzZSBwcm9jZXNzb3JzLCBhbmQgaW52b2tlcworICogYW4gZXhjZXB0aW9uIGhhbmRsZXIgKHJlbWNvbV9oYW5kbGVyKS4KKyAqCisgKiBzdGFjayBvbiBlbnRyeTogICAgICAgICAgICAgICAgICAgICAgIHN0YWNrIG9uIGV4aXQ6CisgKiAgIE4gYnl0ZXMgb2YganVuayAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiAjIE1TV29yZAorICogICBFeGNlcHRpb24gRm9ybWF0IFdvcmQgICAgICAgICAgICAgICBleGNlcHRpb24gIyBNU1dvcmQKKyAqICAgUHJvZ3JhbSBjb3VudGVyIExTV29yZCAgICAgICAgICAgICAgCisgKiAgIFByb2dyYW0gY291bnRlciBNU1dvcmQgICAgICAgICAgICAgCisgKiAgIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLworYXNtKCIgCisudGV4dAorLmdsb2JsIF9fY2F0Y2hFeGNlcHRpb24KK19fY2F0Y2hFeGNlcHRpb246Iik7CitESVNBQkxFX0lOVEVSUlVQVFMoKTsKK2FzbSgiCisgICAgICAgIG1vdmVtbCAgZDAtZDcvYTAtYTYsX3JlZ2lzdGVycyAvKiBzYXZlIHJlZ2lzdGVycyAgICAgICAgKi8KKwltb3ZlbAlfbGFzdEZyYW1lLGEwCS8qIGxhc3QgZnJhbWUgcG9pbnRlciAqLworIik7CitTQVZFX0ZQX1JFR1MoKTsgICAgICAgIAorYXNtKCIKKwlsZWEgICAgIF9yZWdpc3RlcnMsYTUgICAvKiBnZXQgYWRkcmVzcyBvZiByZWdpc3RlcnMgICAgICovCisgICAgICAgIG1vdmV3ICAgc3BALGQxICAgICAgICAgIC8qIGdldCBzdGF0dXMgcmVnaXN0ZXIgICAgICAgICAgKi8KKyAgICAgICAgbW92ZXcgICBkMSxhNUAoNjYpICAgICAgLyogc2F2ZSBzcgkJIAkqLwkKKwltb3ZlbCAgIHNwQCgyKSxhNCAgICAgICAvKiBzYXZlIHBjIGluIGE0IGZvciBsYXRlciB1c2UgICovCisgICAgICAgIG1vdmVsICAgYTQsYTVAKDY4KSAgICAgIC8qIHNhdmUgcGMgaW4gX3JlZ2lzZXJzW10gICAgICAJKi8KKworIworIyBmaWd1cmUgb3V0IGhvdyBtYW55IGJ5dGVzIGluIHRoZSBzdGFjayBmcmFtZQorCW1vdmV3ICAgc3BAKDYpLGQwCS8qIGdldCAnMDIwIGV4Y2VwdGlvbiBmb3JtYXQJKi8KKyAgICAgICAgbW92ZXcgICBkMCxkMiAgICAgICAgICAgLyogbWFrZSBhIGNvcHkgb2YgZm9ybWF0IHdvcmQgICAqLworICAgICAgICBhbmRpdyAgICMweGYwMDAsZDAgICAgICAvKiBtYXNrIG9mZiBmb3JtYXQgdHlwZSAgICAgICAgICovCisgICAgICAgIHJvbHcgICAgIzUsZDAgICAgICAgICAgIC8qIHJvdGF0ZSBpbnRvIHRoZSBsb3cgYnl0ZSAqMiAgKi8KKyAgICAgICAgbGVhICAgICBfZXhjZXB0aW9uU2l6ZSxhMSAgIAorICAgICAgICBhZGR3ICAgIGQwLGExICAgICAgICAgICAvKiBpbmRleCBpbnRvIHRoZSB0YWJsZSAgICAgICAgICovCisJbW92ZXcgICBhMUAsZDAgICAgICAgICAgLyogZ2V0IG51bWJlciBvZiB3b3JkcyBpbiBmcmFtZSAqLworICAgICAgICBtb3ZldyAgIGQwLGQzICAgICAgICAgICAvKiBzYXZlIGl0ICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHN1YncgICAgZDAsYTAJCS8qIGFkanVzdCBzYXZlIHBvaW50ZXIgICAgICAgICAgKi8KKyAgICAgICAgc3VidyAgICBkMCxhMAkJLyogYWRqdXN0IHNhdmUgcG9pbnRlcihieXRlcykgICAqLworCW1vdmVsICAgYTAsYTEgICAgICAgICAgIC8qIGNvcHkgc2F2ZSBwb2ludGVyICAgICAgICAgICAgKi8KKwlzdWJxbCAgICMxLGQwICAgICAgICAgICAvKiBwcmVkZWNyZW1lbnQgbG9vcCBjb3VudGVyICAgICovCisjCisjIGNvcHkgdGhlIGZyYW1lCitzYXZlRnJhbWVMb29wOgorCW1vdmV3ICAJc3BAKyxhMUArCisJZGJmICAgICBkMCxzYXZlRnJhbWVMb29wCisjCisjIG5vdyB0aGF0IHRoZSBzdGFjayBoYXMgYmVlbiBjbGVuYWVkLAorIyBzYXZlIHRoZSBhNyBpbiB1c2UgYXQgdGltZSBvZiBleGNlcHRpb24KKyAgICAgICAgbW92ZWwgICBzcCxfc3VwZXJTdGFjayAgLyogc2F2ZSBzdXBlcnZpc29yIHNwICAgICAgICAgICAqLworICAgICAgICBhbmRpdyAgICMweDIwMDAsZDEgICAgICAvKiB3ZXJlIHdlIGluIHN1cGVydmlzb3IgbW9kZSA/ICovCisgICAgICAgIGJlcSAgICAgdXNlck1vZGUgICAgICAgCisgICAgICAgIG1vdmVsICAgYTcsYTVAKDYwKSAgICAgIC8qIHNhdmUgYTcgICAgICAgICAgICAgICAgICAqLworICAgICAgICBicmEgICAgIGE3c2F2ZURvbmUKK3VzZXJNb2RlOiAgCisJbW92ZWwgICB1c3AsYTEgICAgCQorICAgICAgICBtb3ZlbCAgIGExLGE1QCg2MCkgICAgICAvKiBzYXZlIHVzZXIgc3RhY2sgcG9pbnRlcgkqLworYTdzYXZlRG9uZToKKworIworIyBzYXZlIHNpemUgb2YgZnJhbWUKKyAgICAgICAgbW92ZXcgICBkMyxhMEAtCisKKyMKKyMgY29tcHV0ZSBleGNlcHRpb24gbnVtYmVyCisJYW5kbCAgICAjMHhmZmYsZDIgICAJLyogbWFzayBvZmYgdmVjdG9yIG9mZnNldAkqLworCWxzcncgICAgIzIsZDIgICAJLyogZGl2aWRlIGJ5IDQgdG8gZ2V0IHZlY3QgbnVtCSovCisgICAgICAgIG1vdmVsICAgZDIsYTBALSAgICAgICAgIC8qIHNhdmUgaXQgICAgICAgICAgICAgICAgICAgICAgKi8KKyMKKyMgc2F2ZSBwYyBjYXVzaW5nIGV4Y2VwdGlvbgorICAgICAgICBtb3ZlbCAgIGE0LGEwQC0KKyMKKyMgc2F2ZSBvbGQgZnJhbWUgbGluayBhbmQgc2V0IHRoZSBuZXcgdmFsdWUKKwltb3ZlbAlfbGFzdEZyYW1lLGExCS8qIGxhc3QgZnJhbWUgcG9pbnRlciAqLworCW1vdmVsICAgYTEsYTBALQkJLyogc2F2ZSBwb2ludGVyIHRvIHByZXYgZnJhbWUJKi8KKyAgICAgICAgbW92ZWwgICBhMCxfbGFzdEZyYW1lCisKKyAgICAgICAgbW92ZWwgICBkMixzcEAtCQkvKiBwdXNoIGV4Y2VwdGlvbiBudW0gICAgICAgICAgICovCisJbW92ZWwgICBfZXhjZXB0aW9uSG9vayxhMCAgLyogZ2V0IGFkZHJlc3Mgb2YgaGFuZGxlciAqLworICAgICAgICBqYnNyICAgIGEwQCAgICAgICAgICAgICAvKiBhbmQgY2FsbCBpdCAqLworICAgICAgICBjbHJsICAgIHNwQCAgICAgICAgICAgICAvKiByZXBsYWNlIGV4Y2VwdGlvbiBudW0gcGFybSB3aXRoIGZyYW1lIHB0ciAqLworICAgICAgICBqYnNyICAgICBfX3JldHVybkZyb21FeGNlcHRpb24gICAvKiBqYnNyLCBidXQgbmV2ZXIgcmV0dXJucyAqLworIik7CisjZWxzZSAvKiBtYzY4MDAwICovCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMuICBJdCB0cmFuc2xhdGVzIHRoZQorICogcmV0dXJuIGFkZHJlc3MgZm91bmQgb24gdGhlIHN0YWNrIGludG8gYW4gZXhjZXB0aW9uIHZlY3RvciAjIHdoaWNoCisgKiBpcyB0aGVuIGhhbmRsZWQgYnkgZWl0aGVyIGhhbmRsZV9leGNlcHRpb24gb3IgYSBzeXN0ZW0gaGFuZGxlci4KKyAqIF9jYXRjaEV4Y2VwdGlvbiBwcm92aWRlcyBhIGZyb250IGVuZCBmb3IgYm90aC4gIAorICoKKyAqIHN0YWNrIG9uIGVudHJ5OiAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sgb24gZXhpdDoKKyAqICAgUHJvZ3JhbSBjb3VudGVyIE1TV29yZCAgICAgICAgICAgICAgZXhjZXB0aW9uICMgTVNXb3JkIAorICogICBQcm9ncmFtIGNvdW50ZXIgTFNXb3JkICAgICAgICAgICAgICBleGNlcHRpb24gIyBNU1dvcmQKKyAqICAgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgCisgKiAgIFJldHVybiBBZGRyZXNzICBNU1dvcmQgICAgICAgICAgICAgIAorICogICBSZXR1cm4gQWRkcmVzcyAgTFNXb3JkICAgICAgICAgICAgIAorICovCithc20oIgorLnRleHQKKy5nbG9ibCBfX2NhdGNoRXhjZXB0aW9uCitfX2NhdGNoRXhjZXB0aW9uOiIpOworRElTQUJMRV9JTlRFUlJVUFRTKCk7Cithc20oIgorICAgICAgICBtb3ZlbWwgZDAtZDcvYTAtYTYsX3JlZ2lzdGVycyAgLyogc2F2ZSByZWdpc3RlcnMgICAgICAgICAgICAgICAqLworCW1vdmVsCV9sYXN0RnJhbWUsYTAJLyogbGFzdCBmcmFtZSBwb2ludGVyICovCisiKTsKK1NBVkVfRlBfUkVHUygpOyAgICAgICAgCithc20oIgorICAgICAgICBsZWEgICAgIF9yZWdpc3RlcnMsYTUgICAvKiBnZXQgYWRkcmVzcyBvZiByZWdpc3RlcnMgICAgICovCisgICAgICAgIG1vdmVsICAgc3BAKyxkMiAgICAgICAgIC8qIHBvcCByZXR1cm4gYWRkcmVzcyAgICAgICAgICAgKi8KKwlhZGRsIAkjMTUzMCxkMiAgICAgICAgLyogY29udmVydCByZXR1cm4gYWRkciB0byAJKi8KKwlkaXZzIAkjNixkMiAgIAkvKiAgZXhjZXB0aW9uIG51bWJlcgkJKi8KKwlleHRsICAgIGQyICAgCisKKyAgICAgICAgbW92ZXFsICAjMyxkMyAgICAgICAgICAgLyogYXNzdW1lIGEgdGhyZWUgd29yZCBmcmFtZSAgICAgKi8KKworICAgICAgICBjbXBpdyAgICMzLGQyICAgICAgICAgICAvKiBidXMgZXJyb3Igb3IgYWRkcmVzcyBlcnJvciA/ICovCisgICAgICAgIGJndCAgICAgbm9ybWFsICAgICAgICAgIC8qIGlmID4zIHRoZW4gbm9ybWFsIGVycm9yICAgICAgKi8KKyAgICAgICAgbW92ZWwgICBzcEArLGEwQC0gICAgICAgLyogY29weSBlcnJvciBpbmZvIHRvIGZyYW1lIGJ1ZmYqLworICAgICAgICBtb3ZlbCAgIHNwQCssYTBALSAgICAgICAvKiB0aGVzZSBhcmUgbmV2ZXIgdXNlZCAgICAgICAgICovCisgICAgICAgIG1vdmVxbCAgIzcsZDMgICAgICAgICAgIC8qIHRoaXMgaXMgYSA3IHdvcmQgZnJhbWUgICAgICAgKi8KKyAgICAgCitub3JtYWw6ICAgCisJbW92ZXcgICBzcEArLGQxICAgICAgICAgLyogcG9wIHN0YXR1cyByZWdpc3RlciAgICAgICAgICAqLworICAgICAgICBtb3ZlbCAgIHNwQCssYTQgICAgICAgICAvKiBwb3AgcHJvZ3JhbSBjb3VudGVyICAgICAgICAgICovCisgICAgICAgIG1vdmV3ICAgZDEsYTVAKDY2KSAgICAgIC8qIHNhdmUgc3IJCSAJKi8JCisgICAgICAgIG1vdmVsICAgYTQsYTVAKDY4KSAgICAgIC8qIHNhdmUgcGMgaW4gX3JlZ2lzZXJzW10gICAgICAJKi8KKyAgICAgICAgbW92ZWwgICBhNCxhMEAtICAgICAgICAgLyogY29weSBwYyB0byBmcmFtZSBidWZmZXIgICAgICAqLworCW1vdmV3ICAgZDEsYTBALSAgICAgICAgIC8qIGNvcHkgc3IgdG8gZnJhbWUgYnVmZmVyICAgICAgKi8KKworICAgICAgICBtb3ZlbCAgIHNwLF9zdXBlclN0YWNrICAvKiBzYXZlIHN1cGVydmlzb3Igc3AgICAgICAgICAgKi8KKworICAgICAgICBhbmRpdyAgICMweDIwMDAsZDEgICAgICAvKiB3ZXJlIHdlIGluIHN1cGVydmlzb3IgbW9kZSA/ICovCisgICAgICAgIGJlcSAgICAgdXNlck1vZGUgICAgICAgCisgICAgICAgIG1vdmVsICAgYTcsYTVAKDYwKSAgICAgIC8qIHNhdmUgYTcgICAgICAgICAgICAgICAgICAqLworICAgICAgICBicmEgICAgIHNhdmVEb25lICAgICAgICAgICAgIAordXNlck1vZGU6CisgICAgICAgIG1vdmVsICAgdXNwLGExICAgIAkvKiBzYXZlIHVzZXIgc3RhY2sgcG9pbnRlciAJKi8KKyAgICAgICAgbW92ZWwgICBhMSxhNUAoNjApICAgICAgLyogc2F2ZSB1c2VyIHN0YWNrIHBvaW50ZXIJKi8KK3NhdmVEb25lOgorCisgICAgICAgIG1vdmV3ICAgZDMsYTBALSAgICAgICAgIC8qIHB1c2ggZnJhbWUgc2l6ZSBpbiB3b3JkcyAgICAgKi8KKyAgICAgICAgbW92ZWwgICBkMixhMEAtICAgICAgICAgLyogcHVzaCB2ZWN0b3IgbnVtYmVyICAgICAgICAgICAqLworICAgICAgICBtb3ZlbCAgIGE0LGEwQC0gICAgICAgICAvKiBwdXNoIGV4Y2VwdGlvbiBwYyAgICAgICAgICAgICovCisKKyMKKyMgc2F2ZSBvbGQgZnJhbWUgbGluayBhbmQgc2V0IHRoZSBuZXcgdmFsdWUKKwltb3ZlbAlfbGFzdEZyYW1lLGExCS8qIGxhc3QgZnJhbWUgcG9pbnRlciAqLworCW1vdmVsICAgYTEsYTBALQkJLyogc2F2ZSBwb2ludGVyIHRvIHByZXYgZnJhbWUJKi8KKyAgICAgICAgbW92ZWwgICBhMCxfbGFzdEZyYW1lCisKKyAgICAgICAgbW92ZWwgICBkMixzcEAtCQkvKiBwdXNoIGV4Y2VwdGlvbiBudW0gICAgICAgICAgICovCisJbW92ZWwgICBfZXhjZXB0aW9uSG9vayxhMCAgLyogZ2V0IGFkZHJlc3Mgb2YgaGFuZGxlciAqLworICAgICAgICBqYnNyICAgIGEwQCAgICAgICAgICAgICAvKiBhbmQgY2FsbCBpdCAqLworICAgICAgICBjbHJsICAgIHNwQCAgICAgICAgICAgICAvKiByZXBsYWNlIGV4Y2VwdGlvbiBudW0gcGFybSB3aXRoIGZyYW1lIHB0ciAqLworICAgICAgICBqYnNyICAgICBfX3JldHVybkZyb21FeGNlcHRpb24gICAvKiBqYnNyLCBidXQgbmV2ZXIgcmV0dXJucyAqLworIik7CisjZW5kaWYKKworCisvKgorICogcmVtY29tSGFuZGxlciBpcyBhIGZyb250IGVuZCBmb3IgaGFuZGxlX2V4Y2VwdGlvbi4gIEl0IG1vdmVzIHRoZQorICogc3RhY2sgcG9pbnRlciBpbnRvIGFuIGFyZWEgcmVzZXJ2ZWQgZm9yIGRlYnVnZ2VyIHVzZSBpbiBjYXNlIHRoZQorICogYnJlYWtwb2ludCBoYXBwZW5lZCBpbiBzdXBlcnZpc29yIG1vZGUuCisgKi8KK2FzbSgiX3JlbWNvbUhhbmRsZXI6Iik7Cithc20oIiAgICAgICAgICAgYWRkbCAgICAjNCxzcCIpOyAgICAgICAgLyogcG9wIG9mZiByZXR1cm4gYWRkcmVzcyAgICAgKi8KK2FzbSgiICAgICAgICAgICBtb3ZlbCAgIHNwQCssZDAiKTsgICAgICAvKiBnZXQgdGhlIGV4Y2VwdGlvbiBudW1iZXIgICAqLworYXNtKCIJCW1vdmVsICAgX3N0YWNrUHRyLHNwIik7IC8qIG1vdmUgdG8gcmVtY29tIHN0YWNrIGFyZWEgICovCithc20oIgkJbW92ZWwgICBkMCxzcEAtIik7CS8qIHB1c2ggZXhjZXB0aW9uIG9udG8gc3RhY2sgICovCithc20oIgkJamJzciAgICBfaGFuZGxlX2V4Y2VwdGlvbiIpOyAgICAvKiB0aGlzIG5ldmVyIHJldHVybnMgKi8KK2FzbSgiICAgICAgICAgICBydHMiKTsgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gKi8KKwordm9pZCBfcmV0dXJuRnJvbUV4Y2VwdGlvbiggRnJhbWUgKmZyYW1lICkKK3sKKyAgICAvKiBpZiBubyBwYXNzZWQgaW4gZnJhbWUsIHVzZSB0aGUgbGFzdCBvbmUgKi8KKyAgICBpZiAoISBmcmFtZSkKKyAgICB7CisgICAgICAgIGZyYW1lID0gbGFzdEZyYW1lOworCWZyYW1lLT5mcmFtZVNpemUgPSA0OworICAgICAgICBmcmFtZS0+Zm9ybWF0ID0gMDsKKyAgICAgICAgZnJhbWUtPmZzYXZlSGVhZGVyID0gLTE7IC8qIHJlc3RvcmUgcmVncywgYnV0IHdlIGRvbnQgaGF2ZSBmc2F2ZSBpbmZvKi8KKyAgICB9CisKKyNpZiAhZGVmaW5lZCAobWM2ODAyMCkgJiYgIWRlZmluZWQgKG1jNjgzMzIpCisgICAgLyogYSA2ODAwMCBjYW5ub3QgdXNlIHRoZSBpbnRlcm5hbCBpbmZvIHB1c2hlZCBvbnRvIGEgYnVzIGVycm9yCisgICAgICogb3IgYWRkcmVzcyBlcnJvciBmcmFtZSB3aGVuIGRvaW5nIGFuIFJURSBzbyBkb24ndCBwdXQgdGhpcyBpbmZvCisgICAgICogb250byB0aGUgc3RhY2sgb3IgdGhlIHN0YWNrIHdpbGwgY3JlZXAgZXZlcnkgdGltZSB0aGlzIGhhcHBlbnMuCisgICAgICovCisgICAgZnJhbWUtPmZyYW1lU2l6ZT0zOworI2VuZGlmCisKKyAgICAvKiB0aHJvdyBhd2F5IGFueSBmcmFtZXMgaW4gdGhlIGxpc3QgYWZ0ZXIgdGhpcyBmcmFtZSAqLworICAgIGxhc3RGcmFtZSA9IGZyYW1lOworCisgICAgZnJhbWUtPnNyID0gcmVnaXN0ZXJzWyhpbnQpIFBTXTsKKyAgICBmcmFtZS0+cGMgPSByZWdpc3RlcnNbKGludCkgUENdOworCisgICAgaWYgKHJlZ2lzdGVyc1soaW50KSBQU10gJiAweDIwMDApCisgICAgeyAKKyAgICAgICAgLyogcmV0dXJuIHRvIHN1cGVydmlzb3IgbW9kZS4uLiAqLworICAgICAgICByZXR1cm5fdG9fc3VwZXIoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgLyogcmV0dXJuIHRvIHVzZXIgbW9kZSAqLworICAgICAgICByZXR1cm5fdG9fdXNlcigpOworICAgIH0KK30KKworaW50IGhleChjaCkKK2NoYXIgY2g7Cit7CisgIGlmICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ2YnKSkgcmV0dXJuIChjaC0nYScrMTApOworICBpZiAoKGNoID49ICcwJykgJiYgKGNoIDw9ICc5JykpIHJldHVybiAoY2gtJzAnKTsKKyAgaWYgKChjaCA+PSAnQScpICYmIChjaCA8PSAnRicpKSByZXR1cm4gKGNoLSdBJysxMCk7CisgIHJldHVybiAoLTEpOworfQorCisKKy8qIHNjYW4gZm9yIHRoZSBzZXF1ZW5jZSAkPGRhdGE+IzxjaGVja3N1bT4gICAgICovCit2b2lkIGdldHBhY2tldChidWZmZXIpCitjaGFyICogYnVmZmVyOworeworICB1bnNpZ25lZCBjaGFyIGNoZWNrc3VtOworICB1bnNpZ25lZCBjaGFyIHhtaXRjc3VtOworICBpbnQgIGk7CisgIGludCAgY291bnQ7CisgIGNoYXIgY2g7CisgIAorICBkbyB7CisgICAgLyogd2FpdCBhcm91bmQgZm9yIHRoZSBzdGFydCBjaGFyYWN0ZXIsIGlnbm9yZSBhbGwgb3RoZXIgY2hhcmFjdGVycyAqLworICAgIHdoaWxlICgoY2ggPSAoZ2V0RGVidWdDaGFyKCkgJiAweDdmKSkgIT0gJyQnKTsgCisgICAgY2hlY2tzdW0gPSAwOworICAgIHhtaXRjc3VtID0gLTE7CisgICAgCisgICAgY291bnQgPSAwOworICAgIAorICAgIC8qIG5vdywgcmVhZCB1bnRpbCBhICMgb3IgZW5kIG9mIGJ1ZmZlciBpcyBmb3VuZCAqLworICAgIHdoaWxlIChjb3VudCA8IEJVRk1BWCkgeworICAgICAgY2ggPSBnZXREZWJ1Z0NoYXIoKSAmIDB4N2Y7CisgICAgICBpZiAoY2ggPT0gJyMnKSBicmVhazsKKyAgICAgIGNoZWNrc3VtID0gY2hlY2tzdW0gKyBjaDsKKyAgICAgIGJ1ZmZlcltjb3VudF0gPSBjaDsKKyAgICAgIGNvdW50ID0gY291bnQgKyAxOworICAgICAgfQorICAgIGJ1ZmZlcltjb3VudF0gPSAwOworCisgICAgaWYgKGNoID09ICcjJykgeworICAgICAgeG1pdGNzdW0gPSBoZXgoZ2V0RGVidWdDaGFyKCkgJiAweDdmKSA8PCA0OworICAgICAgeG1pdGNzdW0gKz0gaGV4KGdldERlYnVnQ2hhcigpICYgMHg3Zik7CisgICAgICBpZiAoKHJlbW90ZV9kZWJ1ZyApICYmIChjaGVja3N1bSAhPSB4bWl0Y3N1bSkpIHsKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCJiYWQgY2hlY2tzdW0uICBNeSBjb3VudCA9IDB4JXgsIHNlbnQ9MHgleC4gYnVmPSVzXG4iLAorCQkJCQkJICAgICBjaGVja3N1bSx4bWl0Y3N1bSxidWZmZXIpOworICAgICAgfQorICAgICAgCisgICAgICBpZiAoY2hlY2tzdW0gIT0geG1pdGNzdW0pIHB1dERlYnVnQ2hhcignLScpOyAgLyogZmFpbGVkIGNoZWNrc3VtICovIAorICAgICAgZWxzZSB7CisJIHB1dERlYnVnQ2hhcignKycpOyAgLyogc3VjY2Vzc2Z1bCB0cmFuc2ZlciAqLworCSAvKiBpZiBhIHNlcXVlbmNlIGNoYXIgaXMgcHJlc2VudCwgcmVwbHkgdGhlIHNlcXVlbmNlIElEICovCisJIGlmIChidWZmZXJbMl0gPT0gJzonKSB7CisJICAgIHB1dERlYnVnQ2hhciggYnVmZmVyWzBdICk7CisJICAgIHB1dERlYnVnQ2hhciggYnVmZmVyWzFdICk7CisJICAgIC8qIHJlbW92ZSBzZXF1ZW5jZSBjaGFycyBmcm9tIGJ1ZmZlciAqLworCSAgICBjb3VudCA9IHN0cmxlbihidWZmZXIpOworCSAgICBmb3IgKGk9MzsgaSA8PSBjb3VudDsgaSsrKSBidWZmZXJbaS0zXSA9IGJ1ZmZlcltpXTsKKwkgfSAKKyAgICAgIH0gCisgICAgfSAKKyAgfSB3aGlsZSAoY2hlY2tzdW0gIT0geG1pdGNzdW0pOworICAKK30KKworLyogc2VuZCB0aGUgcGFja2V0IGluIGJ1ZmZlci4gIFRoZSBob3N0IGdldCdzIG9uZSBjaGFuY2UgdG8gcmVhZCBpdC4gIAorICAgVGhpcyByb3V0aW5lIGRvZXMgbm90IHdhaXQgZm9yIGEgcG9zaXRpdmUgYWNrbm93bGVkZ2UuICAqLworCisKK3ZvaWQgcHV0cGFja2V0KGJ1ZmZlcikKK2NoYXIgKiBidWZmZXI7Cit7CisgIHVuc2lnbmVkIGNoYXIgY2hlY2tzdW07CisgIGludCAgY291bnQ7CisgIGNoYXIgY2g7CisgIAorICAvKiAgJDxwYWNrZXQgaW5mbz4jPGNoZWNrc3VtPi4gKi8KKyAgZG8geworICBwdXREZWJ1Z0NoYXIoJyQnKTsKKyAgY2hlY2tzdW0gPSAwOworICBjb3VudCAgICA9IDA7CisgIAorICB3aGlsZSAoY2g9YnVmZmVyW2NvdW50XSkgeworICAgIHB1dERlYnVnQ2hhcihjaCk7CisgICAgY2hlY2tzdW0gKz0gY2g7CisgICAgY291bnQgKz0gMTsKKyAgfQorICAKKyAgcHV0RGVidWdDaGFyKCcjJyk7CisgIHB1dERlYnVnQ2hhcihoZXhjaGFyc1tjaGVja3N1bSA+PiA0XSk7CisgIHB1dERlYnVnQ2hhcihoZXhjaGFyc1tjaGVja3N1bSAlIDE2XSk7CisKKyAgfSB3aGlsZSAoMSA9PSAwKTsgIC8qIChnZXREZWJ1Z0NoYXIoKSAhPSAnKycpOyAqLworICAKK30KKworY2hhciAgcmVtY29tSW5CdWZmZXJbQlVGTUFYXTsKK2NoYXIgIHJlbWNvbU91dEJ1ZmZlcltCVUZNQVhdOworc3RhdGljIHNob3J0IGVycm9yOworCisKK3ZvaWQgZGVidWdfZXJyb3IoZm9ybWF0LCBwYXJtKQorY2hhciAqIGZvcm1hdDsKK2NoYXIgKiBwYXJtOworeworICBpZiAocmVtb3RlX2RlYnVnKSBmcHJpbnRmIChzdGRlcnIsZm9ybWF0LHBhcm0pOworfQorCisvKiBjb252ZXJ0IHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSBtZW0gaW50byBoZXgsIHBsYWNpbmcgcmVzdWx0IGluIGJ1ZiAqLworLyogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbGFzdCBjaGFyIHB1dCBpbiBidWYgKG51bGwpICovCitjaGFyKiBtZW0yaGV4KG1lbSwgYnVmLCBjb3VudCkKK2NoYXIqIG1lbTsKK2NoYXIqIGJ1ZjsKK2ludCAgIGNvdW50OworeworICAgICAgaW50IGk7CisgICAgICB1bnNpZ25lZCBjaGFyIGNoOworICAgICAgZm9yIChpPTA7aTxjb3VudDtpKyspIHsKKyAgICAgICAgICBjaCA9ICptZW0rKzsKKyAgICAgICAgICAqYnVmKysgPSBoZXhjaGFyc1tjaCA+PiA0XTsKKyAgICAgICAgICAqYnVmKysgPSBoZXhjaGFyc1tjaCAlIDE2XTsKKyAgICAgIH0KKyAgICAgICpidWYgPSAwOyAKKyAgICAgIHJldHVybihidWYpOworfQorCisvKiBjb252ZXJ0IHRoZSBoZXggYXJyYXkgcG9pbnRlZCB0byBieSBidWYgaW50byBiaW5hcnkgdG8gYmUgcGxhY2VkIGluIG1lbSAqLworLyogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIEFGVEVSIHRoZSBsYXN0IGJ5dGUgd3JpdHRlbiAqLworY2hhciogaGV4Mm1lbShidWYsIG1lbSwgY291bnQpCitjaGFyKiBidWY7CitjaGFyKiBtZW07CitpbnQgICBjb3VudDsKK3sKKyAgICAgIGludCBpOworICAgICAgdW5zaWduZWQgY2hhciBjaDsKKyAgICAgIGZvciAoaT0wO2k8Y291bnQ7aSsrKSB7CisgICAgICAgICAgY2ggPSBoZXgoKmJ1ZisrKSA8PCA0OworICAgICAgICAgIGNoID0gY2ggKyBoZXgoKmJ1ZisrKTsKKyAgICAgICAgICAqbWVtKysgPSBjaDsKKyAgICAgIH0KKyAgICAgIHJldHVybihtZW0pOworfQorCisvKiBhIGJ1cyBlcnJvciBoYXMgb2NjdXJyZWQsIHBlcmZvcm0gYSBsb25nam1wCisgICB0byByZXR1cm4gZXhlY3V0aW9uIGFuZCBhbGxvdyBoYW5kbGluZyBvZiB0aGUgZXJyb3IgKi8KKwordm9pZCBoYW5kbGVfYnVzZXJyb3IoKQoreworICBsb25nam1wKHJlbWNvbUVudiwxKTsKK30KKworLyogdGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgNjgwMDAgZXhjZXB0aW9uIG51bWJlciBhbmQgYXR0ZW1wdHMgdG8gCisgICB0cmFuc2xhdGUgdGhpcyBudW1iZXIgaW50byBhIHVuaXggY29tcGF0aWJsZSBzaWduYWwgdmFsdWUgKi8KK2ludCBjb21wdXRlU2lnbmFsKCBleGNlcHRpb25WZWN0b3IgKQoraW50IGV4Y2VwdGlvblZlY3RvcjsKK3sKKyAgaW50IHNpZ3ZhbDsKKyAgc3dpdGNoIChleGNlcHRpb25WZWN0b3IpIHsKKyAgICBjYXNlIDIgOiBzaWd2YWwgPSAxMDsgYnJlYWs7IC8qIGJ1cyBlcnJvciAgICAgICAgICAgKi8KKyAgICBjYXNlIDMgOiBzaWd2YWwgPSAxMDsgYnJlYWs7IC8qIGFkZHJlc3MgZXJyb3IgICAgICAgKi8KKyAgICBjYXNlIDQgOiBzaWd2YWwgPSA0OyAgYnJlYWs7IC8qIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gKi8KKyAgICBjYXNlIDUgOiBzaWd2YWwgPSA4OyAgYnJlYWs7IC8qIHplcm8gZGl2aWRlICAgICAgICAgKi8KKyAgICBjYXNlIDYgOiBzaWd2YWwgPSA4OyBicmVhazsgLyogY2hrIGluc3RydWN0aW9uICAgICAqLworICAgIGNhc2UgNyA6IHNpZ3ZhbCA9IDg7IGJyZWFrOyAvKiB0cmFwdiBpbnN0cnVjdGlvbiAgICovCisgICAgY2FzZSA4IDogc2lndmFsID0gMTE7IGJyZWFrOyAvKiBwcml2aWxlZ2UgdmlvbGF0aW9uICovCisgICAgY2FzZSA5IDogc2lndmFsID0gNTsgIGJyZWFrOyAvKiB0cmFjZSB0cmFwICAgICAgICAgICovCisgICAgY2FzZSAxMDogc2lndmFsID0gNDsgIGJyZWFrOyAvKiBsaW5lIDEwMTAgZW11bGF0b3IgICovCisgICAgY2FzZSAxMTogc2lndmFsID0gNDsgIGJyZWFrOyAvKiBsaW5lIDExMTEgZW11bGF0b3IgICovCisKKyAgICAgIC8qIENvcHJvY2Vzc29yIHByb3RvY29sIHZpb2xhdGlvbi4gIFVzaW5nIGEgc3RhbmRhcmQgTU1VIG9yIEZQVQorCSB0aGlzIGNhbm5vdCBiZSB0cmlnZ2VyZWQgYnkgc29mdHdhcmUuICBDYWxsIGl0IGEgU0lHQlVTLiAgKi8KKyAgICBjYXNlIDEzOiBzaWd2YWwgPSAxMDsgIGJyZWFrOworCisgICAgY2FzZSAzMTogc2lndmFsID0gMjsgIGJyZWFrOyAvKiBpbnRlcnJ1cHQgICAgICAgICAgICovCisgICAgY2FzZSAzMzogc2lndmFsID0gNTsgIGJyZWFrOyAvKiBicmVha3BvaW50ICAgICAgICAgICovCisKKyAgICAgIC8qIFRoaXMgaXMgYSB0cmFwICM4IGluc3RydWN0aW9uLiAgQXBwYXJlbnRseSBpdCBpcyBzb21lb25lJ3Mgc29mdHdhcmUKKwkgY29udmVudGlvbiBmb3Igc29tZSBzb3J0IG9mIFNJR0ZQRSBjb25kaXRpb24uICBXaG9zZT8gIEhvdyBtYW55CisJIHBlb3BsZSBhcmUgYmVpbmcgc2NyZXdlZCBieSBoYXZpbmcgdGhpcyBjb2RlIHRoZSB3YXkgaXQgaXM/CisJIElzIHRoZXJlIGEgY2xlYW4gc29sdXRpb24/ICAqLworICAgIGNhc2UgNDA6IHNpZ3ZhbCA9IDg7ICBicmVhazsgLyogZmxvYXRpbmcgcG9pbnQgZXJyICAqLworCisgICAgY2FzZSA0ODogc2lndmFsID0gODsgIGJyZWFrOyAvKiBmbG9hdGluZyBwb2ludCBlcnIgICovCisgICAgY2FzZSA0OTogc2lndmFsID0gODsgIGJyZWFrOyAvKiBmbG9hdGluZyBwb2ludCBlcnIgICovCisgICAgY2FzZSA1MDogc2lndmFsID0gODsgIGJyZWFrOyAvKiB6ZXJvIGRpdmlkZSAgICAgICAgICovCisgICAgY2FzZSA1MTogc2lndmFsID0gODsgIGJyZWFrOyAvKiB1bmRlcmZsb3cgICAgICAgICAgICovCisgICAgY2FzZSA1Mjogc2lndmFsID0gODsgIGJyZWFrOyAvKiBvcGVyYW5kIGVycm9yICAgICAgICovCisgICAgY2FzZSA1Mzogc2lndmFsID0gODsgIGJyZWFrOyAvKiBvdmVyZmxvdyAgICAgICAgICAgICovCisgICAgY2FzZSA1NDogc2lndmFsID0gODsgIGJyZWFrOyAvKiBOQU4gICAgICAgICAgICAgICAgICovCisgICAgZGVmYXVsdDogCisgICAgICBzaWd2YWwgPSA3OyAgICAgICAgIC8qICJzb2Z0d2FyZSBnZW5lcmF0ZWQiKi8KKyAgfQorICByZXR1cm4gKHNpZ3ZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogV0hJTEUgV0UgRklORCBOSUNFIEhFWCBDSEFSUywgQlVJTEQgQU4gSU5UICovCisvKiBSRVRVUk4gTlVNQkVSIE9GIENIQVJTIFBST0NFU1NFRCAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGhleFRvSW50KGNoYXIgKipwdHIsIGludCAqaW50VmFsdWUpCit7CisgICAgaW50IG51bUNoYXJzID0gMDsKKyAgICBpbnQgaGV4VmFsdWU7CisgICAgCisgICAgKmludFZhbHVlID0gMDsKKworICAgIHdoaWxlICgqKnB0cikKKyAgICB7CisgICAgICAgIGhleFZhbHVlID0gaGV4KCoqcHRyKTsKKyAgICAgICAgaWYgKGhleFZhbHVlID49MCkKKyAgICAgICAgeworICAgICAgICAgICAgKmludFZhbHVlID0gKCppbnRWYWx1ZSA8PDQpIHwgaGV4VmFsdWU7CisgICAgICAgICAgICBudW1DaGFycyArKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICAgICgqcHRyKSsrOworICAgIH0KKworICAgIHJldHVybiAobnVtQ2hhcnMpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIGFsbCBjb21tYW5kIHByb2Nlc2luZyBmb3IgaW50ZXJmYWNpbmcgdG8gZ2RiLgorICovCit2b2lkIGhhbmRsZV9leGNlcHRpb24oaW50IGV4Y2VwdGlvblZlY3RvcikKK3sKKyAgaW50ICAgIHNpZ3ZhbDsKKyAgaW50ICAgIGFkZHIsIGxlbmd0aDsKKyAgY2hhciAqIHB0cjsKKyAgaW50ICAgIG5ld1BDOworICBGcmFtZSAgKmZyYW1lOworICAKKyAgaWYgKHJlbW90ZV9kZWJ1ZykgcHJpbnRmKCJ2ZWN0b3I9JWQsIHNyPTB4JXgsIHBjPTB4JXhcbiIsIAorCQkJICAgIGV4Y2VwdGlvblZlY3RvciwKKwkJCSAgICByZWdpc3RlcnNbIFBTIF0sIAorCQkJICAgIHJlZ2lzdGVyc1sgUEMgXSk7CisKKyAgLyogcmVwbHkgdG8gaG9zdCB0aGF0IGFuIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgKi8KKyAgc2lndmFsID0gY29tcHV0ZVNpZ25hbCggZXhjZXB0aW9uVmVjdG9yICk7CisgIHJlbWNvbU91dEJ1ZmZlclswXSA9ICdTJzsKKyAgcmVtY29tT3V0QnVmZmVyWzFdID0gIGhleGNoYXJzW3NpZ3ZhbCA+PiA0XTsKKyAgcmVtY29tT3V0QnVmZmVyWzJdID0gIGhleGNoYXJzW3NpZ3ZhbCAlIDE2XTsKKyAgcmVtY29tT3V0QnVmZmVyWzNdID0gMDsKKworICBwdXRwYWNrZXQocmVtY29tT3V0QnVmZmVyKTsgCisKKyAgd2hpbGUgKDE9PTEpIHsgCisgICAgZXJyb3IgPSAwOworICAgIHJlbWNvbU91dEJ1ZmZlclswXSA9IDA7CisgICAgZ2V0cGFja2V0KHJlbWNvbUluQnVmZmVyKTsKKyAgICBzd2l0Y2ggKHJlbWNvbUluQnVmZmVyWzBdKSB7CisgICAgICBjYXNlICc/JyA6ICAgcmVtY29tT3V0QnVmZmVyWzBdID0gJ1MnOworICAgICAgICAgICAgICAgICAgIHJlbWNvbU91dEJ1ZmZlclsxXSA9ICBoZXhjaGFyc1tzaWd2YWwgPj4gNF07CisgICAgICAgICAgICAgICAgICAgcmVtY29tT3V0QnVmZmVyWzJdID0gIGhleGNoYXJzW3NpZ3ZhbCAlIDE2XTsKKyAgICAgICAgICAgICAgICAgICByZW1jb21PdXRCdWZmZXJbM10gPSAwOworICAgICAgICAgICAgICAgICBicmVhazsgCisgICAgICBjYXNlICdkJyA6IHJlbW90ZV9kZWJ1ZyA9ICEocmVtb3RlX2RlYnVnKTsgIC8qIHRvZ2dsZSBkZWJ1ZyBmbGFnICovCisgICAgICAgICAgICAgICAgIGJyZWFrOyAKKyAgICAgIGNhc2UgJ2cnIDogLyogcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgQ1BVIHJlZ2lzdGVycyAqLworICAgICAgICAgICAgICAgIG1lbTJoZXgoKGNoYXIqKSByZWdpc3RlcnMsIHJlbWNvbU91dEJ1ZmZlciwgTlVNUkVHQllURVMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnRycgOiAvKiBzZXQgdGhlIHZhbHVlIG9mIHRoZSBDUFUgcmVnaXN0ZXJzIC0gcmV0dXJuIE9LICovCisgICAgICAgICAgICAgICAgaGV4Mm1lbSgmcmVtY29tSW5CdWZmZXJbMV0sIChjaGFyKikgcmVnaXN0ZXJzLCBOVU1SRUdCWVRFUyk7CisgICAgICAgICAgICAgICAgc3RyY3B5KHJlbWNvbU91dEJ1ZmZlciwiT0siKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIAorICAgICAgLyogbUFBLi5BQSxMTExMICBSZWFkIExMTEwgYnl0ZXMgYXQgYWRkcmVzcyBBQS4uQUEgKi8KKyAgICAgIGNhc2UgJ20nIDogCisJICAgICAgICBpZiAoc2V0am1wKHJlbWNvbUVudikgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXIoMixoYW5kbGVfYnVzZXJyb3IpOyAKKworCQkgICAgLyogVFJZIFRPIFJFQUQgJXgsJXguICBJRiBTVUNDRUVELCBTRVQgUFRSID0gMCAqLworICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcmVtY29tSW5CdWZmZXJbMV07CisgICAgICAgICAgICAgICAgICAgIGlmIChoZXhUb0ludCgmcHRyLCZhZGRyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHB0cisrKSA9PSAnLCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhleFRvSW50KCZwdHIsJmxlbmd0aCkpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtMmhleCgoY2hhciopIGFkZHIsIHJlbWNvbU91dEJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0cikKKyAgICAgICAgICAgICAgICAgICAgeworCQkgICAgICBzdHJjcHkocmVtY29tT3V0QnVmZmVyLCJFMDEiKTsKKwkJICAgICAgZGVidWdfZXJyb3IoIm1hbGZvcm1lZCByZWFkIG1lbW9yeSBjb21tYW5kOiAlcyIscmVtY29tSW5CdWZmZXIpOworICAgICAgICAgICAgICAgICAgfSAgICAgCisgICAgICAgICAgICAgICAgfSAKKwkJZWxzZSB7CisJCSAgZXhjZXB0aW9uSGFuZGxlcigyLF9jYXRjaEV4Y2VwdGlvbik7ICAgCisJCSAgc3RyY3B5KHJlbWNvbU91dEJ1ZmZlciwiRTAzIik7CisJCSAgZGVidWdfZXJyb3IoImJ1cyBlcnJvciIpOworCQkgIH0gICAgIAorICAgICAgICAgICAgICAgIAorCQkvKiByZXN0b3JlIGhhbmRsZXIgZm9yIGJ1cyBlcnJvciAqLworCQlleGNlcHRpb25IYW5kbGVyKDIsX2NhdGNoRXhjZXB0aW9uKTsgICAKKwkJYnJlYWs7CisgICAgICAKKyAgICAgIC8qIE1BQS4uQUEsTExMTDogV3JpdGUgTExMTCBieXRlcyBhdCBhZGRyZXNzIEFBLkFBIHJldHVybiBPSyAqLworICAgICAgY2FzZSAnTScgOiAKKwkgICAgICAgIGlmIChzZXRqbXAocmVtY29tRW52KSA9PSAwKSB7CisJCSAgICBleGNlcHRpb25IYW5kbGVyKDIsaGFuZGxlX2J1c2Vycm9yKTsgCisgICAgICAgICAgICAgICAgICAgIAorCQkgICAgLyogVFJZIFRPIFJFQUQgJyV4LCV4OicuICBJRiBTVUNDRUVELCBTRVQgUFRSID0gMCAqLworICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcmVtY29tSW5CdWZmZXJbMV07CisgICAgICAgICAgICAgICAgICAgIGlmIChoZXhUb0ludCgmcHRyLCZhZGRyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHB0cisrKSA9PSAnLCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhleFRvSW50KCZwdHIsJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqKHB0cisrKSA9PSAnOicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleDJtZW0ocHRyLCAoY2hhciopIGFkZHIsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHJlbWNvbU91dEJ1ZmZlciwiT0siKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHRyKQorICAgICAgICAgICAgICAgICAgICB7CisJCSAgICAgIHN0cmNweShyZW1jb21PdXRCdWZmZXIsIkUwMiIpOworCQkgICAgICBkZWJ1Z19lcnJvcigibWFsZm9ybWVkIHdyaXRlIG1lbW9yeSBjb21tYW5kOiAlcyIscmVtY29tSW5CdWZmZXIpOworCQkgICAgICB9ICAgICAKKyAgICAgICAgICAgICAgICB9IAorCQllbHNlIHsKKwkJICBleGNlcHRpb25IYW5kbGVyKDIsX2NhdGNoRXhjZXB0aW9uKTsgICAKKwkJICBzdHJjcHkocmVtY29tT3V0QnVmZmVyLCJFMDMiKTsKKwkJICBkZWJ1Z19lcnJvcigiYnVzIGVycm9yIik7CisJCSAgfSAgICAgCisKKyAgICAgICAgICAgICAgICAvKiByZXN0b3JlIGhhbmRsZXIgZm9yIGJ1cyBlcnJvciAqLworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXIoMixfY2F0Y2hFeGNlcHRpb24pOyAgIAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAKKyAgICAgLyogY0FBLi5BQSAgICBDb250aW51ZSBhdCBhZGRyZXNzIEFBLi5BQShvcHRpb25hbCkgKi8KKyAgICAgLyogc0FBLi5BQSAgIFN0ZXAgb25lIGluc3RydWN0aW9uIGZyb20gQUEuLkFBKG9wdGlvbmFsKSAqLworICAgICBjYXNlICdjJyA6IAorICAgICBjYXNlICdzJyA6IAorICAgICAgICAgIC8qIHRyeSB0byByZWFkIG9wdGlvbmFsIHBhcmFtZXRlciwgcGMgdW5jaGFuZ2VkIGlmIG5vIHBhcm0gKi8KKyAgICAgICAgIHB0ciA9ICZyZW1jb21JbkJ1ZmZlclsxXTsKKyAgICAgICAgIGlmIChoZXhUb0ludCgmcHRyLCZhZGRyKSkKKyAgICAgICAgICAgICByZWdpc3RlcnNbIFBDIF0gPSBhZGRyOworICAgICAgICAgICAgIAorICAgICAgICAgIG5ld1BDID0gcmVnaXN0ZXJzWyBQQ107CisgICAgICAgICAgCisgICAgICAgICAgLyogY2xlYXIgdGhlIHRyYWNlIGJpdCAqLworICAgICAgICAgIHJlZ2lzdGVyc1sgUFMgXSAmPSAweDdmZmY7CisgICAgICAgICAgCisgICAgICAgICAgLyogc2V0IHRoZSB0cmFjZSBiaXQgaWYgd2UncmUgc3RlcHBpbmcgKi8KKyAgICAgICAgICBpZiAocmVtY29tSW5CdWZmZXJbMF0gPT0gJ3MnKSByZWdpc3RlcnNbIFBTIF0gfD0gMHg4MDAwOworICAgICAgICAgIAorICAgICAgICAgIC8qCisgICAgICAgICAgICogbG9vayBmb3IgbmV3UEMgaW4gdGhlIGxpbmtlZCBsaXN0IG9mIGV4Y2VwdGlvbiBmcmFtZXMuCisgICAgICAgICAgICogaWYgaXQgaXMgZm91bmQsIHVzZSB0aGUgb2xkIGZyYW1lIGl0LiAgb3RoZXJ3aXNlLAorICAgICAgICAgICAqIGZha2UgdXAgYSBkdW1teSBmcmFtZSBpbiByZXR1cm5Gcm9tRXhjZXB0aW9uKCkuCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKHJlbW90ZV9kZWJ1ZykgcHJpbnRmKCJuZXcgcGMgPSAweCV4XG4iLG5ld1BDKTsKKyAgICAgICAgICBmcmFtZSA9IGxhc3RGcmFtZTsKKyAgICAgICAgICB3aGlsZSAoZnJhbWUpCisgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAocmVtb3RlX2RlYnVnKQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCJmcmFtZSBhdCAweCV4IGhhcyBwYz0weCV4LCBleGNlcHQjPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLGZyYW1lLT5leGNlcHRpb25QQywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+ZXhjZXB0aW9uVmVjdG9yKTsKKyAgICAgICAgICAgICAgaWYgKGZyYW1lLT5leGNlcHRpb25QQyA9PSBuZXdQQykgYnJlYWs7ICAvKiBiaW5nbyEgYSBtYXRjaCAqLworICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgKiBmb3IgYSBicmVha3BvaW50IGluc3RydWN0aW9uLCB0aGUgc2F2ZWQgcGMgbWF5CisgICAgICAgICAgICAgICAqIGJlIG9mZiBieSB0d28gZHVlIHRvIHJlLWV4ZWN1dGluZyB0aGUgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICogcmVwbGFjZWQgYnkgdGhlIHRyYXAgaW5zdHJ1Y3Rpb24uICBDaGVjayBmb3IgdGhpcy4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGlmICgoZnJhbWUtPmV4Y2VwdGlvblZlY3RvciA9PSAzMykgJiYKKyAgICAgICAgICAgICAgICAgIChmcmFtZS0+ZXhjZXB0aW9uUEMgPT0gKG5ld1BDKzIpKSkgYnJlYWs7CisgICAgICAgICAgICAgIGlmIChmcmFtZSA9PSBmcmFtZS0+cHJldmlvdXMpCisJICAgICAgeworCSAgICAgICAgICBmcmFtZSA9IDA7IC8qIG5vIG1hdGNoIGZvdW5kICovIAorCSAgICAgICAgICBicmVhazsgCisJICAgICAgfQorCSAgICAgIGZyYW1lID0gZnJhbWUtPnByZXZpb3VzOworICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIElmIHdlIGZvdW5kIGEgbWF0Y2ggZm9yIHRoZSBQQyBBTkQgd2UgYXJlIG5vdCByZXR1cm5pbmcKKyAgICAgICAgICAgKiBhcyBhIHJlc3VsdCBvZiBhIGJyZWFrcG9pbnQgKDMzKSwKKyAgICAgICAgICAgKiB0cmFjZSBleGNlcHRpb24gKDkpLCBubWkgKDMxKSwgam1wIHRvCisgICAgICAgICAgICogdGhlIG9sZCBleGNlcHRpb24gaGFuZGxlciBhcyBpZiB0aGlzIGNvZGUgbmV2ZXIgcmFuLgorICAgICAgICAgICAqLworICAgICAgICAgIGlmIChmcmFtZSkgCisgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoKGZyYW1lLT5leGNlcHRpb25WZWN0b3IgIT0gOSkgICYmIAorICAgICAgICAgICAgICAgICAgKGZyYW1lLT5leGNlcHRpb25WZWN0b3IgIT0gMzEpICYmIAorICAgICAgICAgICAgICAgICAgKGZyYW1lLT5leGNlcHRpb25WZWN0b3IgIT0gMzMpKQorICAgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAqIGludm9rZSB0aGUgcHJldmlvdXMgaGFuZGxlci4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgaWYgKG9sZEV4Y2VwdGlvbkhvb2spCisgICAgICAgICAgICAgICAgICAgICAgKCpvbGRFeGNlcHRpb25Ib29rKSAoZnJhbWUtPmV4Y2VwdGlvblZlY3Rvcik7CisgICAgICAgICAgICAgICAgICBuZXdQQyA9IHJlZ2lzdGVyc1sgUEMgXTsgICAgLyogcGMgbWF5IGhhdmUgY2hhbmdlZCAgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChuZXdQQyAhPSBmcmFtZS0+ZXhjZXB0aW9uUEMpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW90ZV9kZWJ1ZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJmcmFtZSBhdCAweCV4IGhhcyBwYz0weCV4LCBleGNlcHQjPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUsZnJhbWUtPmV4Y2VwdGlvblBDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmV4Y2VwdGlvblZlY3Rvcik7CisgICAgICAgICAgICAgICAgICAgICAgLyogcmUtdXNlIHRoZSBsYXN0IGZyYW1lLCB3ZSdyZSBza2lwcGluZyBpdCAobG9uZ2p1bXA/KSovCisJCSAgICAgIGZyYW1lID0gKEZyYW1lICopIDA7CisJICAgICAgICAgICAgICBfcmV0dXJuRnJvbUV4Y2VwdGlvbiggZnJhbWUgKTsgIC8qIHRoaXMgaXMgYSBqdW1wICovCisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9ICAgICAgICAgCisKKyAgICAJICAvKiBpZiB3ZSBjb3VsZG4ndCBmaW5kIGEgZnJhbWUsIGNyZWF0ZSBvbmUgKi8KKyAgICAgICAgICBpZiAoZnJhbWUgPT0gMCkKKwkgIHsKKyAgICAJICAgICAgZnJhbWUgPSBsYXN0RnJhbWUgLTEgOworCSAgICAgIAorCSAgICAgIC8qIGJ5IHVzaW5nIGEgYnVuY2ggb2YgcHJpbnQgY29tbWFuZHMgd2l0aCBicmVha3BvaW50cywKKyAgICAJICAgICAgICAgaXQncyBwb3NzaWJsZSBmb3IgdGhlIGZyYW1lIHN0YWNrIHRvIGNyZWVwIGRvd24uICBJZiBpdCBjcmVlcHMKKwkJIHRvbyBmYXIsIGdpdmUgdXAgYW5kIHJlc2V0IGl0IHRvIHRoZSB0b3AuICBOb3JtYWwgdXNlIHNob3VsZAorICAgIAkgICAgICAgICBub3Qgc2VlIHRoaXMgaGFwcGVuLgorICAgIAkgICAgICAqLworCSAgICAgIGlmICgodW5zaWduZWQgaW50KSAoZnJhbWUtMikgPCAodW5zaWduZWQgaW50KSAmZ2RiRnJhbWVTdGFjaykKKyAgICAJICAgICAgeworICAgIAkgICAgICAgICBpbml0aWFsaXplUmVtY29tRXJyb3JGcmFtZSgpOworICAgIAkgICAgICAgICBmcmFtZSA9IGxhc3RGcmFtZTsgCisJICAgICAgfQorICAgIAkgICAgICBmcmFtZS0+cHJldmlvdXMgPSBsYXN0RnJhbWU7CisgICAgICAgICAgICAgIGxhc3RGcmFtZSA9IGZyYW1lOworICAgICAgICAgICAgICBmcmFtZSA9IDA7ICAvKiBudWxsIHNvIF9yZXR1cm4uLi4gd2lsbCBwcm9wZXJseSBpbml0aWFsaXplIGl0ICovIAorCSAgfSAgICAKKwkgIAorCSAgX3JldHVybkZyb21FeGNlcHRpb24oIGZyYW1lICk7IC8qIHRoaXMgaXMgYSBqdW1wICovCisKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAKKyAgICAgIC8qIGtpbGwgdGhlIHByb2dyYW0gKi8KKyAgICAgIGNhc2UgJ2snIDogIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIH0gLyogc3dpdGNoICovIAorICAgIAorICAgIC8qIHJlcGx5IHRvIHRoZSByZXF1ZXN0ICovCisgICAgcHV0cGFja2V0KHJlbWNvbU91dEJ1ZmZlcik7IAorICAgIH0KK30KKworCit2b2lkCitpbml0aWFsaXplUmVtY29tRXJyb3JGcmFtZSgpCit7CisgICAgbGFzdEZyYW1lID0gKChGcmFtZSAqKSAmZ2RiRnJhbWVTdGFja1tGUkFNRVNJWkUtMV0pIC0gMTsKKyAgICBsYXN0RnJhbWUtPnByZXZpb3VzID0gbGFzdEZyYW1lOworfQorCisvKiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHVwIGV4Y2VwdGlvbiBoYW5kbGVycyBmb3IgdHJhY2luZyBhbmQgCisgICBicmVha3BvaW50cyAqLwordm9pZCBzZXRfZGVidWdfdHJhcHMoKQoreworICBleHRlcm4gdm9pZCBfZGVidWdfbGV2ZWw3KCk7CisgIGV4dGVybiB2b2lkIHJlbWNvbUhhbmRsZXIoKTsKKyAgaW50IGV4Y2VwdGlvbjsKKworICBpbml0aWFsaXplUmVtY29tRXJyb3JGcmFtZSgpOworICBzdGFja1B0ciAgPSAmcmVtY29tU3RhY2tbU1RBQ0tTSVpFL3NpemVvZihpbnQpIC0gMV07CisKKyAgZm9yIChleGNlcHRpb24gPSAyOyBleGNlcHRpb24gPD0gMjM7IGV4Y2VwdGlvbisrKQorICAgICAgZXhjZXB0aW9uSGFuZGxlcihleGNlcHRpb24sX2NhdGNoRXhjZXB0aW9uKTsgICAKKworICAvKiBsZXZlbCA3IGludGVycnVwdCAgICAgICAgICAgICAgKi8KKyAgZXhjZXB0aW9uSGFuZGxlcigzMSxfZGVidWdfbGV2ZWw3KTsgICAgCisgIAorICAvKiBicmVha3BvaW50IGV4Y2VwdGlvbiAodHJhcCAjMSkgKi8KKyAgZXhjZXB0aW9uSGFuZGxlcigzMyxfY2F0Y2hFeGNlcHRpb24pOworICAKKyAgLyogVGhpcyBpcyBhIHRyYXAgIzggaW5zdHJ1Y3Rpb24uICBBcHBhcmVudGx5IGl0IGlzIHNvbWVvbmUncyBzb2Z0d2FyZQorICAgICBjb252ZW50aW9uIGZvciBzb21lIHNvcnQgb2YgU0lHRlBFIGNvbmRpdGlvbi4gIFdob3NlPyAgSG93IG1hbnkKKyAgICAgcGVvcGxlIGFyZSBiZWluZyBzY3Jld2VkIGJ5IGhhdmluZyB0aGlzIGNvZGUgdGhlIHdheSBpdCBpcz8KKyAgICAgSXMgdGhlcmUgYSBjbGVhbiBzb2x1dGlvbj8gICovCisgIGV4Y2VwdGlvbkhhbmRsZXIoNDAsX2NhdGNoRXhjZXB0aW9uKTsKKyAgCisgIC8qIDQ4IHRvIDU0IGFyZSBmbG9hdGluZyBwb2ludCBjb3Byb2Nlc3NvciBlcnJvcnMgKi8KKyAgZm9yIChleGNlcHRpb24gPSA0ODsgZXhjZXB0aW9uIDw9IDU0OyBleGNlcHRpb24rKykKKyAgICAgIGV4Y2VwdGlvbkhhbmRsZXIoZXhjZXB0aW9uLF9jYXRjaEV4Y2VwdGlvbik7ICAgCisKKyAgaWYgKG9sZEV4Y2VwdGlvbkhvb2sgIT0gcmVtY29tSGFuZGxlcikKKyAgeworICAgICAgb2xkRXhjZXB0aW9uSG9vayA9IGV4Y2VwdGlvbkhvb2s7CisgICAgICBleGNlcHRpb25Ib29rICAgID0gcmVtY29tSGFuZGxlcjsKKyAgfQorICAKKyAgaW5pdGlhbGl6ZWQgPSAxOworCit9CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZSBhIGJyZWFrcG9pbnQgZXhjZXB0aW9uLiAgSXQgaXMgdXNlZCBhdCB0aGUKKyAgIGJlZ2lubmluZyBvZiBhIHByb2dyYW0gdG8gc3luYyB1cCB3aXRoIGEgZGVidWdnZXIgYW5kIGNhbiBiZSB1c2VkCisgICBvdGhlcndpc2UgYXMgYSBxdWljayBtZWFucyB0byBzdG9wIHByb2dyYW0gZXhlY3V0aW9uIGFuZCAiYnJlYWsiIGludG8KKyAgIHRoZSBkZWJ1Z2dlci4gKi8KKyAgIAordm9pZCBicmVha3BvaW50KCkKK3sKKyAgaWYgKGluaXRpYWxpemVkKSBCUkVBS1BPSU5UKCk7Cit9CisKZGlmZiAtLWdpdCBhL2dkYi9tNjhrLXRkZXAuYyBiL2dkYi9tNjhrLXRkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTk3ZWZhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL202OGstdGRlcC5jCkBAIC0wLDAgKzEsNTE2IEBACisvKiBUYXJnZXQgZGVwZW5kZW50IGNvZGUgZm9yIHRoZSBNb3Rvcm9sYSA2ODAwMCBzZXJpZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKworDAorLyogUHVzaCBhbiBlbXB0eSBzdGFjayBmcmFtZSwgdG8gcmVjb3JkIHRoZSBjdXJyZW50IFBDLCBldGMuICAqLworCit2b2lkCittNjhrX3B1c2hfZHVtbXlfZnJhbWUgKCkKK3sKKyAgcmVnaXN0ZXIgQ09SRV9BRERSIHNwID0gcmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKTsKKyAgcmVnaXN0ZXIgaW50IHJlZ251bTsKKyAgY2hhciByYXdfYnVmZmVyWzEyXTsKKworICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKFBDX1JFR05VTSkpOworICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKEZQX1JFR05VTSkpOworICB3cml0ZV9yZWdpc3RlciAoRlBfUkVHTlVNLCBzcCk7CisKKyAgLyogQWx3YXlzIHNhdmUgdGhlIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVycywgd2hldGhlciB0aGV5IGV4aXN0IG9uCisgICAgIHRoaXMgdGFyZ2V0IG9yIG5vdC4gICovCisgIGZvciAocmVnbnVtID0gRlAwX1JFR05VTSArIDc7IHJlZ251bSA+PSBGUDBfUkVHTlVNOyByZWdudW0tLSkKKyAgICB7CisgICAgICByZWFkX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFIChyZWdudW0pLCByYXdfYnVmZmVyLCAxMik7CisgICAgICBzcCA9IHB1c2hfYnl0ZXMgKHNwLCByYXdfYnVmZmVyLCAxMik7CisgICAgfQorCisgIGZvciAocmVnbnVtID0gRlBfUkVHTlVNIC0gMTsgcmVnbnVtID49IDA7IHJlZ251bS0tKQorICAgIHsKKyAgICAgIHNwID0gcHVzaF93b3JkIChzcCwgcmVhZF9yZWdpc3RlciAocmVnbnVtKSk7CisgICAgfQorICBzcCA9IHB1c2hfd29yZCAoc3AsIHJlYWRfcmVnaXN0ZXIgKFBTX1JFR05VTSkpOworICB3cml0ZV9yZWdpc3RlciAoU1BfUkVHTlVNLCBzcCk7Cit9CisKKy8qIERpc2NhcmQgZnJvbSB0aGUgc3RhY2sgdGhlIGlubmVybW9zdCBmcmFtZSwKKyAgIHJlc3RvcmluZyBhbGwgc2F2ZWQgcmVnaXN0ZXJzLiAgKi8KKwordm9pZAorbTY4a19wb3BfZnJhbWUgKCkKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lID0gZ2V0X2N1cnJlbnRfZnJhbWUgKCk7CisgIHJlZ2lzdGVyIENPUkVfQUREUiBmcDsKKyAgcmVnaXN0ZXIgaW50IHJlZ251bTsKKyAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgZnNyOworICBjaGFyIHJhd19idWZmZXJbMTJdOworCisgIGZwID0gRlJBTUVfRlAgKGZyYW1lKTsKKyAgZ2V0X2ZyYW1lX3NhdmVkX3JlZ3MgKGZyYW1lLCAmZnNyKTsKKyAgZm9yIChyZWdudW0gPSBGUDBfUkVHTlVNICsgNyA7IHJlZ251bSA+PSBGUDBfUkVHTlVNIDsgcmVnbnVtLS0pCisgICAgeworICAgICAgaWYgKGZzci5yZWdzW3JlZ251bV0pCisJeworCSAgcmVhZF9tZW1vcnkgKGZzci5yZWdzW3JlZ251bV0sIHJhd19idWZmZXIsIDEyKTsKKwkgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFIChyZWdudW0pLCByYXdfYnVmZmVyLCAxMik7CisJfQorICAgIH0KKyAgZm9yIChyZWdudW0gPSBGUF9SRUdOVU0gLSAxIDsgcmVnbnVtID49IDAgOyByZWdudW0tLSkKKyAgICB7CisgICAgICBpZiAoZnNyLnJlZ3NbcmVnbnVtXSkKKwl7CisJICB3cml0ZV9yZWdpc3RlciAocmVnbnVtLCByZWFkX21lbW9yeV9pbnRlZ2VyIChmc3IucmVnc1tyZWdudW1dLCA0KSk7CisJfQorICAgIH0KKyAgaWYgKGZzci5yZWdzW1BTX1JFR05VTV0pCisgICAgeworICAgICAgd3JpdGVfcmVnaXN0ZXIgKFBTX1JFR05VTSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnNyLnJlZ3NbUFNfUkVHTlVNXSwgNCkpOworICAgIH0KKyAgd3JpdGVfcmVnaXN0ZXIgKEZQX1JFR05VTSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnAsIDQpKTsKKyAgd3JpdGVfcmVnaXN0ZXIgKFBDX1JFR05VTSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnAgKyA0LCA0KSk7CisgIHdyaXRlX3JlZ2lzdGVyIChTUF9SRUdOVU0sIGZwICsgOCk7CisgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7Cit9CisKKwwKKy8qIEdpdmVuIGFuIGlwIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24sCisgICByZXR1cm4gdGhlIGlwIG9mIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBhZnRlciB0aGUgZnVuY3Rpb24gCisgICBwcm9sb2d1ZS4gIFRoaXMgaXMgdGhlIGdlbmVyaWMgbTY4ayBzdXBwb3J0LiAgTWFjaGluZXMgd2hpY2gKKyAgIHJlcXVpcmUgc29tZXRoaW5nIGRpZmZlcmVudCBjYW4gb3ZlcnJpZGUgdGhlIFNLSVBfUFJPTE9HVUUKKyAgIG1hY3JvIHRvIHBvaW50IGVsc2V3aGVyZS4KKworICAgU29tZSBpbnN0cnVjdGlvbnMgd2hpY2ggdHlwaWNhbGx5IG1heSBhcHBlYXIgaW4gYSBmdW5jdGlvbgorICAgcHJvbG9ndWUgaW5jbHVkZToKKworICAgQSBsaW5rIGluc3RydWN0aW9uLCB3b3JkIGZvcm06CisKKwlsaW5rLncJJWE2LCYwCQkJNGU1NiAgWFhYWAorCisgICBBIGxpbmsgaW5zdHJ1Y3Rpb24sIGxvbmcgZm9ybToKKworCWxpbmsubCAgJWZwLCZGJTEJCTQ4MGUgIFhYWFggIFhYWFgKKworICAgQSBtb3ZtIGluc3RydWN0aW9uIHRvIHByZXNlcnZlIGludGVnZXIgcmVnczoKKworCW1vdm0ubCAgJk0lMSwoNCwlc3ApCQk0OGVmICBYWFhYICBYWFhYCisKKyAgIEEgZm1vdm0gaW5zdHJ1Y3Rpb24gdG8gcHJlc2VydmUgZmxvYXQgcmVnczoKKworCWZtb3ZtICAgJkZQTSUxLChGUE8lMSwlc3ApCWYyMzcgIFhYWFggIFhYWFggIFhYWFggIFhYWFgKKworICAgU29tZSBwcm9maWxpbmcgc2V0dXAgY29kZSAoRklYTUUsIG5vdCByZWNvZ25pemVkIHlldCk6CisKKwlsZWEubCAgICguTDMsJXBjKSwlYTEJCTQzZmIgIFhYWFggIFhYWFggIFhYWFgKKwlic3IgICAgIF9tY291bnQJCQk2MWZmICBYWFhYICBYWFhYCisKKyAgKi8KKworI2RlZmluZSBQX0xJTktfTAkweDQ4MGUKKyNkZWZpbmUgUF9MSU5LX1cJMHg0ZTU2CisjZGVmaW5lIFBfTU9WX0wJCTB4MjA3YworI2RlZmluZSBQX0pTUgkJMHg0ZWI5CisjZGVmaW5lIFBfQlNSCQkweDYxZmYKKyNkZWZpbmUgUF9MRUFfTAkJMHg0M2ZiCisjZGVmaW5lIFBfTU9WTV9MCTB4NDhlZgorI2RlZmluZSBQX0ZNT1ZNCQkweGYyMzcKKyNkZWZpbmUgUF9UUkFQCQkweDRlNDAKKworQ09SRV9BRERSCittNjhrX3NraXBfcHJvbG9ndWUgKGlwKQorQ09SRV9BRERSIGlwOworeworICByZWdpc3RlciBDT1JFX0FERFIgbGltaXQ7CisgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOworICByZWdpc3RlciBpbnQgb3A7CisKKyAgLyogRmluZCBvdXQgaWYgdGhlcmUgaXMgYSBrbm93biBsaW1pdCBmb3IgdGhlIGV4dGVudCBvZiB0aGUgcHJvbG9ndWUuCisgICAgIElmIHNvLCBlbnN1cmUgd2UgZG9uJ3QgZ28gcGFzdCBpdC4gIElmIG5vdCwgYXNzdW1lICJpbmZpbml0eSIuICovCisKKyAgc2FsID0gZmluZF9wY19saW5lIChpcCwgMCk7CisgIGxpbWl0ID0gKHNhbC5lbmQpID8gc2FsLmVuZCA6IChDT1JFX0FERFIpIH4wOworCisgIHdoaWxlIChpcCA8IGxpbWl0KQorICAgIHsKKyAgICAgIG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoaXAsIDIpOworICAgICAgb3AgJj0gMHhGRkZGOworICAgICAgCisgICAgICBpZiAob3AgPT0gUF9MSU5LX1cpCisJeworCSAgaXAgKz0gNDsJLyogU2tpcCBsaW5rLncgKi8KKwl9CisgICAgICBlbHNlIGlmIChvcCA9PSAweDQ4NTYpCisJaXAgKz0gMjsgLyogU2tpcCBwZWEgJWZwICovCisgICAgICBlbHNlIGlmIChvcCA9PSAweDJjNGYpCisJaXAgKz0gMjsgLyogU2tpcCBtb3ZlLmwgJXNwLCAlZnAgKi8KKyAgICAgIGVsc2UgaWYgKG9wID09IFBfTElOS19MKQorCXsKKwkgIGlwICs9IDY7CS8qIFNraXAgbGluay5sICovCisJfQorICAgICAgZWxzZSBpZiAob3AgPT0gUF9NT1ZNX0wpCisJeworCSAgaXAgKz0gNjsJLyogU2tpcCBtb3ZtLmwgKi8KKwl9CisgICAgICBlbHNlIGlmIChvcCA9PSBQX0ZNT1ZNKQorCXsKKwkgIGlwICs9IDEwOwkvKiBTa2lwIGZtb3ZtICovCisJfQorICAgICAgZWxzZQorCXsKKwkgIGJyZWFrOwkvKiBGb3VuZCB1bmtub3duIGNvZGUsIGJhaWwgb3V0LiAqLworCX0KKyAgICB9CisgIHJldHVybiAoaXApOworfQorCit2b2lkCittNjhrX2ZpbmRfc2F2ZWRfcmVncyAoZnJhbWVfaW5mbywgc2F2ZWRfcmVncykKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lX2luZm87CisgICAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICpzYXZlZF9yZWdzOworeworICByZWdpc3RlciBpbnQgcmVnbnVtOwkJCQkJCQkKKyAgcmVnaXN0ZXIgaW50IHJlZ21hc2s7CQkJCQkJCQorICByZWdpc3RlciBDT1JFX0FERFIgbmV4dF9hZGRyOwkJCQkJCQorICByZWdpc3RlciBDT1JFX0FERFIgcGM7CisKKyAgLyogRmlyc3QgcG9zc2libGUgYWRkcmVzcyBmb3IgYSBwYyBpbiBhIGNhbGwgZHVtbXkgZm9yIHRoaXMgZnJhbWUuICAqLworICBDT1JFX0FERFIgcG9zc2libGVfY2FsbF9kdW1teV9zdGFydCA9CisgICAgKGZyYW1lX2luZm8pLT5mcmFtZSAtIENBTExfRFVNTVlfTEVOR1RIIC0gRlBfUkVHTlVNKjQgLSA0IC0gOCoxMjsKKworICBpbnQgbmV4dGluc247CisgIG1lbXNldCAoc2F2ZWRfcmVncywgMCwgc2l6ZW9mICgqc2F2ZWRfcmVncykpOworICBpZiAoKGZyYW1lX2luZm8pLT5wYyA+PSBwb3NzaWJsZV9jYWxsX2R1bW15X3N0YXJ0CisgICAgICAmJiAoZnJhbWVfaW5mbyktPnBjIDw9IChmcmFtZV9pbmZvKS0+ZnJhbWUpCisgICAgeworCisgICAgICAvKiBJdCBpcyBhIGNhbGwgZHVtbXkuICBXZSBjb3VsZCBqdXN0IHN0b3Agbm93LCBzaW5jZSB3ZSBrbm93CisJIHdoYXQgdGhlIGNhbGwgZHVtbXkgc2F2ZXMgYW5kIHdoZXJlLiAgQnV0IHRoaXMgY29kZSBwcm9jZWVkcworCSB0byBwYXJzZSB0aGUgInByb2xvZ3VlIiB3aGljaCBpcyBwYXJ0IG9mIHRoZSBjYWxsIGR1bW15LgorCSBUaGlzIGlzIG5lZWRsZXNzbHkgY29tcGxleCBhbmQgY29uZnVzaW5nLiAgRklYTUUuICAqLworCisgICAgICBuZXh0X2FkZHIgPSAoZnJhbWVfaW5mbyktPmZyYW1lOworICAgICAgcGMgPSBwb3NzaWJsZV9jYWxsX2R1bW15X3N0YXJ0OworICAgIH0KKyAgZWxzZSAgIAkJCQkJCQkJCisgICAgeworICAgICAgcGMgPSBnZXRfcGNfZnVuY3Rpb25fc3RhcnQgKChmcmFtZV9pbmZvKS0+cGMpOyAJCQkKKworICAgICAgaWYgKDB4NDg1NiA9PSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgMikKKwkgICYmIDB4MmM0ZiA9PSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYyArIDIsIDIpKQorCXsKKwkgIC8qCisJICAgIHBlYSAlZnAKKyAgICAgICAgICAgIG1vdmUubCAlc3AsICVmcCAqLworCisJICBwYyArPSA0OworCSAgbmV4dF9hZGRyID0gZnJhbWVfaW5mby0+ZnJhbWU7CisJfQorICAgICAgZWxzZSBpZiAoMDQ0MDE2ID09IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAyKSkKKwkvKiBsaW5rLmwgJWZwICovCisJLyogRmluZCB0aGUgYWRkcmVzcyBhYm92ZSB0aGUgc2F2ZWQgICAKKwkgICByZWdzIHVzaW5nIHRoZSBhbW91bnQgb2Ygc3RvcmFnZSBmcm9tIHRoZSBsaW5rIGluc3RydWN0aW9uLiAgKi8KKwluZXh0X2FkZHIgPSAoZnJhbWVfaW5mbyktPmZyYW1lICsgcmVhZF9tZW1vcnlfaW50ZWdlciAocGMgKz0gMiwgNCksIHBjKz00OyAKKyAgICAgIGVsc2UgaWYgKDA0NzEyNiA9PSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgMikpCQkJCisJLyogbGluay53ICVmcCAqLworCS8qIEZpbmQgdGhlIGFkZHJlc3MgYWJvdmUgdGhlIHNhdmVkICAgCisJICAgcmVncyB1c2luZyB0aGUgYW1vdW50IG9mIHN0b3JhZ2UgZnJvbSB0aGUgbGluayBpbnN0cnVjdGlvbi4gICovCisJbmV4dF9hZGRyID0gKGZyYW1lX2luZm8pLT5mcmFtZSArIHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjICs9IDIsIDIpLCBwYys9MjsgCisgICAgICBlbHNlIGdvdG8gbG9zZTsKKworICAgICAgLyogSWYgaGF2ZSBhbiBhZGRhbCAjLW4sIHNwIG5leHQsIGFkanVzdCBuZXh0X2FkZHIuICAqLwkJCisgICAgICBpZiAoKDAxNzc3NzcgJiByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgMikpID09IDAxNTc3NzQpCQkKKwluZXh0X2FkZHIgKz0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMgKz0gMiwgNCksIHBjICs9IDQ7CQkKKyAgICB9CQkJCQkJCQkJCisgIHJlZ21hc2sgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYyArIDIsIDIpOwkJCQkKKworICAvKiBIZXJlIGNhbiBjb21lIGFuIGZtb3ZlbS4gIENoZWNrIGZvciBpdC4gICovCQkKKyAgbmV4dGluc24gPSAweGZmZmYgJiByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgMik7CQkJCisgIGlmICgweGYyMjcgPT0gbmV4dGluc24JCQkJCQkKKyAgICAgICYmIChyZWdtYXNrICYgMHhmZjAwKSA9PSAweGUwMDApCQkJCQkKKyAgICB7IHBjICs9IDQ7IC8qIFJlZ21hc2sncyBsb3cgYml0IGlzIGZvciByZWdpc3RlciBmcDcsIHRoZSBmaXJzdCBwdXNoZWQgKi8gCisgICAgICBmb3IgKHJlZ251bSA9IEZQMF9SRUdOVU0gKyA3OyByZWdudW0gPj0gRlAwX1JFR05VTTsgcmVnbnVtLS0sIHJlZ21hc2sgPj49IDEpCQkKKwlpZiAocmVnbWFzayAmIDEpCQkJCQkJCisgICAgICAgICAgc2F2ZWRfcmVncy0+cmVnc1tyZWdudW1dID0gKG5leHRfYWRkciAtPSAxMik7CQkKKyAgICAgIHJlZ21hc2sgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYyArIDIsIDIpOyB9CisKKyAgLyogbmV4dCBzaG91bGQgYmUgYSBtb3ZlbWwgdG8gKHNwKSBvciAtKHNwKSBvciBhIG1vdmwgciwtKHNwKSAqLwkKKyAgaWYgKDAwNDQzMjcgPT0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDIpKQkJCQkKKyAgICB7IHBjICs9IDQ7IC8qIFJlZ21hc2sncyBsb3cgYml0IGlzIGZvciByZWdpc3RlciAwLCB0aGUgZmlyc3Qgd3JpdHRlbiAqLyAKKyAgICAgIGZvciAocmVnbnVtID0gMDsgcmVnbnVtIDwgMTY7IHJlZ251bSsrLCByZWdtYXNrID4+PSAxKQkJCisJaWYgKHJlZ21hc2sgJiAxKQkJCQkJCQorICAgICAgICAgIHNhdmVkX3JlZ3MtPnJlZ3NbcmVnbnVtXSA9IChuZXh0X2FkZHIgKz0gNCkgLSA0OyB9CQorICBlbHNlIGlmICgwMDQ0MzQ3ID09IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAyKSkJCQkKKyAgICB7CisgICAgICBwYyArPSA0OyAvKiBSZWdtYXNrJ3MgbG93IGJpdCBpcyBmb3IgcmVnaXN0ZXIgMTUsIHRoZSBmaXJzdCBwdXNoZWQgKi8gCisgICAgICBmb3IgKHJlZ251bSA9IDE1OyByZWdudW0gPj0gMDsgcmVnbnVtLS0sIHJlZ21hc2sgPj49IDEpCQkKKwlpZiAocmVnbWFzayAmIDEpCQkJCQkJCisgICAgICAgICAgc2F2ZWRfcmVncy0+cmVnc1tyZWdudW1dID0gKG5leHRfYWRkciAtPSA0KTsKKyAgICB9CisgIGVsc2UgaWYgKDB4MmYwMCA9PSAoMHhmZmYwICYgcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDIpKSkJCQorICAgIHsKKyAgICAgIHJlZ251bSA9IDB4ZiAmIHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAyKTsgcGMgKz0gMjsJCQorICAgICAgc2F2ZWRfcmVncy0+cmVnc1tyZWdudW1dID0gKG5leHRfYWRkciAtPSA0KTsKKyAgICAgIC8qIGdjYywgYXQgbGVhc3QsIG1heSB1c2UgYSBwYWlyIG9mIG1vdmVsIGluc3RydWN0aW9ucyB3aGVuIHNhdmluZworCSBleGFjdGx5IDIgcmVnaXN0ZXJzLiAgKi8KKyAgICAgIGlmICgweDJmMDAgPT0gKDB4ZmZmMCAmIHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAyKSkpCisJeworCSAgcmVnbnVtID0gMHhmICYgcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDIpOworCSAgcGMgKz0gMjsKKwkgIHNhdmVkX3JlZ3MtPnJlZ3NbcmVnbnVtXSA9IChuZXh0X2FkZHIgLT0gNCk7CisJfQorICAgIH0KKworICAvKiBmbW92ZW14IHRvIGluZGV4IG9mIHNwIG1heSBmb2xsb3cuICAqLwkJCQkKKyAgcmVnbWFzayA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjICsgMiwgMik7CQkJCQorICBuZXh0aW5zbiA9IDB4ZmZmZiAmIHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAyKTsJCQkKKyAgaWYgKDB4ZjIzNiA9PSBuZXh0aW5zbgkJCQkJCQorICAgICAgJiYgKHJlZ21hc2sgJiAweGZmMDApID09IDB4ZjAwMCkJCQkJCQorICAgIHsgcGMgKz0gMTA7IC8qIFJlZ21hc2sncyBsb3cgYml0IGlzIGZvciByZWdpc3RlciBmcDAsIHRoZSBmaXJzdCB3cml0dGVuICovIAorICAgICAgZm9yIChyZWdudW0gPSBGUDBfUkVHTlVNICsgNzsgcmVnbnVtID49IEZQMF9SRUdOVU07IHJlZ251bS0tLCByZWdtYXNrID4+PSAxKQkJCisJaWYgKHJlZ21hc2sgJiAxKQkJCQkJCQorICAgICAgICAgIHNhdmVkX3JlZ3MtPnJlZ3NbcmVnbnVtXSA9IChuZXh0X2FkZHIgKz0gMTIpIC0gMTI7CQorICAgICAgcmVnbWFzayA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjICsgMiwgMik7IH0JCQkKKworICAvKiBjbHJ3IC0oc3ApOyBtb3Z3IGNjciwtKHNwKSBtYXkgZm9sbG93LiAgKi8JCQkJCisgIGlmICgweDQyNjc0MmU3ID09IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCA0KSkJCQkKKyAgICBzYXZlZF9yZWdzLT5yZWdzW1BTX1JFR05VTV0gPSAobmV4dF9hZGRyIC09IDQpOwkJCisgIGxvc2U6IDsJCQkJCQkJCQorICBzYXZlZF9yZWdzLT5yZWdzW1NQX1JFR05VTV0gPSAoZnJhbWVfaW5mbyktPmZyYW1lICsgODsJCQorICBzYXZlZF9yZWdzLT5yZWdzW0ZQX1JFR05VTV0gPSAoZnJhbWVfaW5mbyktPmZyYW1lOwkJCisgIHNhdmVkX3JlZ3MtPnJlZ3NbUENfUkVHTlVNXSA9IChmcmFtZV9pbmZvKS0+ZnJhbWUgKyA0OwkJCisjaWZkZWYgU0lHX1NQX0ZQX09GRlNFVAorICAvKiBBZGp1c3Qgc2F2ZWQgU1BfUkVHTlVNIGZvciBmYWtlIF9zaWd0cmFtcCBmcmFtZXMuICAqLworICBpZiAoZnJhbWVfaW5mby0+c2lnbmFsX2hhbmRsZXJfY2FsbGVyICYmIGZyYW1lX2luZm8tPm5leHQpCisgICAgc2F2ZWRfcmVncy0+cmVnc1tTUF9SRUdOVU1dID0gZnJhbWVfaW5mby0+bmV4dC0+ZnJhbWUgKyBTSUdfU1BfRlBfT0ZGU0VUOworI2VuZGlmCit9CisKKworI2lmZGVmIFVTRV9QUk9DX0ZTCS8qIFRhcmdldCBkZXBlbmRlbnQgc3VwcG9ydCBmb3IgL3Byb2MgKi8KKworI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KKworLyogIFRoZSAvcHJvYyBpbnRlcmZhY2UgZGl2aWRlcyB0aGUgdGFyZ2V0IG1hY2hpbmUncyByZWdpc3RlciBzZXQgdXAgaW50bworICAgIHR3byBkaWZmZXJlbnQgc2V0cywgdGhlIGdlbmVyYWwgcmVnaXN0ZXIgc2V0IChncmVnc2V0KSBhbmQgdGhlIGZsb2F0aW5nCisgICAgcG9pbnQgcmVnaXN0ZXIgc2V0IChmcHJlZ3NldCkuICBGb3IgZWFjaCBzZXQsIHRoZXJlIGlzIGFuIGlvY3RsIHRvIGdldAorICAgIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHNldCBhbmQgYW5vdGhlciBpb2N0bCB0byBzZXQgdGhlIGN1cnJlbnQgdmFsdWVzLgorCisgICAgVGhlIGFjdHVhbCBzdHJ1Y3R1cmUgcGFzc2VkIHRocm91Z2ggdGhlIGlvY3RsIGludGVyZmFjZSBpcywgb2YgY291cnNlLAorICAgIG5hdHVyYWxseSBtYWNoaW5lIGRlcGVuZGVudCwgYW5kIGlzIGRpZmZlcmVudCBmb3IgZWFjaCBzZXQgb2YgcmVnaXN0ZXJzLgorICAgIEZvciB0aGUgbTY4ayBmb3IgZXhhbXBsZSwgdGhlIGdlbmVyYWwgcmVnaXN0ZXIgc2V0IGlzIHR5cGljYWxseSBkZWZpbmVkCisgICAgYnk6CisKKwl0eXBlZGVmIGludCBncmVnc2V0X3RbMThdOworCisJI2RlZmluZQlSX0QwCTAKKwkuLi4KKwkjZGVmaW5lCVJfUFMJMTcKKworICAgIGFuZCB0aGUgZmxvYXRpbmcgcG9pbnQgc2V0IGJ5OgorCisgICAgCXR5cGVkZWYJc3RydWN0IGZwcmVnc2V0IHsKKwkgIGludAlmX3BjcjsKKwkgIGludAlmX3BzcjsKKwkgIGludAlmX2ZwaWFkZHI7CisJICBpbnQJZl9mcHJlZ3NbOF1bM107CQkoOCByZWdzLCA5NiBiaXRzIGVhY2gpCisJfSBmcHJlZ3NldF90OworCisgICAgVGhlc2Ugcm91dGluZXMgcHJvdmlkZSB0aGUgcGFja2luZyBhbmQgdW5wYWNraW5nIG9mIGdyZWdzZXRfdCBhbmQKKyAgICBmcHJlZ3NldF90IGZvcm1hdHRlZCBkYXRhLgorCisgKi8KKworLyogQXRhcmkgU1ZSNCBoYXMgUl9TUiBidXQgbm90IFJfUFMgKi8KKworI2lmICFkZWZpbmVkIChSX1BTKSAmJiBkZWZpbmVkIChSX1NSKQorI2RlZmluZSBSX1BTIFJfU1IKKyNlbmRpZgorCisvKiAgR2l2ZW4gYSBwb2ludGVyIHRvIGEgZ2VuZXJhbCByZWdpc3RlciBzZXQgaW4gL3Byb2MgZm9ybWF0IChncmVnc2V0X3QgKiksCisgICAgdW5wYWNrIHRoZSByZWdpc3RlciBjb250ZW50cyBhbmQgc3VwcGx5IHRoZW0gYXMgZ2RiJ3MgaWRlYSBvZiB0aGUgY3VycmVudAorICAgIHJlZ2lzdGVyIHZhbHVlcy4gKi8KKwordm9pZAorc3VwcGx5X2dyZWdzZXQgKGdyZWdzZXRwKQorZ3JlZ3NldF90ICpncmVnc2V0cDsKK3sKKyAgcmVnaXN0ZXIgaW50IHJlZ2k7CisgIHJlZ2lzdGVyIGdyZWdfdCAqcmVncCA9IChncmVnX3QgKikgZ3JlZ3NldHA7CisKKyAgZm9yIChyZWdpID0gMCA7IHJlZ2kgPCBSX1BDIDsgcmVnaSsrKQorICAgIHsKKyAgICAgIHN1cHBseV9yZWdpc3RlciAocmVnaSwgKGNoYXIgKikgKHJlZ3AgKyByZWdpKSk7CisgICAgfQorICBzdXBwbHlfcmVnaXN0ZXIgKFBTX1JFR05VTSwgKGNoYXIgKikgKHJlZ3AgKyBSX1BTKSk7CisgIHN1cHBseV9yZWdpc3RlciAoUENfUkVHTlVNLCAoY2hhciAqKSAocmVncCArIFJfUEMpKTsKK30KKwordm9pZAorZmlsbF9ncmVnc2V0IChncmVnc2V0cCwgcmVnbm8pCitncmVnc2V0X3QgKmdyZWdzZXRwOworaW50IHJlZ25vOworeworICByZWdpc3RlciBpbnQgcmVnaTsKKyAgcmVnaXN0ZXIgZ3JlZ190ICpyZWdwID0gKGdyZWdfdCAqKSBncmVnc2V0cDsKKyAgZXh0ZXJuIGNoYXIgcmVnaXN0ZXJzW107CisKKyAgZm9yIChyZWdpID0gMCA7IHJlZ2kgPCBSX1BDIDsgcmVnaSsrKQorICAgIHsKKyAgICAgIGlmICgocmVnbm8gPT0gLTEpIHx8IChyZWdubyA9PSByZWdpKSkKKwl7CisJICAqKHJlZ3AgKyByZWdpKSA9ICooaW50ICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnaSldOworCX0KKyAgICB9CisgIGlmICgocmVnbm8gPT0gLTEpIHx8IChyZWdubyA9PSBQU19SRUdOVU0pKQorICAgIHsKKyAgICAgICoocmVncCArIFJfUFMpID0gKihpbnQgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQU19SRUdOVU0pXTsKKyAgICB9CisgIGlmICgocmVnbm8gPT0gLTEpIHx8IChyZWdubyA9PSBQQ19SRUdOVU0pKQorICAgIHsKKyAgICAgICoocmVncCArIFJfUEMpID0gKihpbnQgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQQ19SRUdOVU0pXTsKKyAgICB9Cit9CisKKyNpZiBkZWZpbmVkIChGUDBfUkVHTlVNKQorCisvKiAgR2l2ZW4gYSBwb2ludGVyIHRvIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgc2V0IGluIC9wcm9jIGZvcm1hdAorICAgIChmcHJlZ3NldF90ICopLCB1bnBhY2sgdGhlIHJlZ2lzdGVyIGNvbnRlbnRzIGFuZCBzdXBwbHkgdGhlbSBhcyBnZGIncworICAgIGlkZWEgb2YgdGhlIGN1cnJlbnQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgdmFsdWVzLiAqLworCit2b2lkIAorc3VwcGx5X2ZwcmVnc2V0IChmcHJlZ3NldHApCitmcHJlZ3NldF90ICpmcHJlZ3NldHA7Cit7CisgIHJlZ2lzdGVyIGludCByZWdpOworICBjaGFyICpmcm9tOworICAKKyAgZm9yIChyZWdpID0gRlAwX1JFR05VTSA7IHJlZ2kgPCBGUENfUkVHTlVNIDsgcmVnaSsrKQorICAgIHsKKyAgICAgIGZyb20gPSAoY2hhciAqKSAmKGZwcmVnc2V0cCAtPiBmX2ZwcmVnc1tyZWdpLUZQMF9SRUdOVU1dWzBdKTsKKyAgICAgIHN1cHBseV9yZWdpc3RlciAocmVnaSwgZnJvbSk7CisgICAgfQorICBzdXBwbHlfcmVnaXN0ZXIgKEZQQ19SRUdOVU0sIChjaGFyICopICYoZnByZWdzZXRwIC0+IGZfcGNyKSk7CisgIHN1cHBseV9yZWdpc3RlciAoRlBTX1JFR05VTSwgKGNoYXIgKikgJihmcHJlZ3NldHAgLT4gZl9wc3IpKTsKKyAgc3VwcGx5X3JlZ2lzdGVyIChGUElfUkVHTlVNLCAoY2hhciAqKSAmKGZwcmVnc2V0cCAtPiBmX2ZwaWFkZHIpKTsKK30KKworLyogIEdpdmVuIGEgcG9pbnRlciB0byBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHNldCBpbiAvcHJvYyBmb3JtYXQKKyAgICAoZnByZWdzZXRfdCAqKSwgdXBkYXRlIHRoZSByZWdpc3RlciBzcGVjaWZpZWQgYnkgUkVHTk8gZnJvbSBnZGIncyBpZGVhCisgICAgb2YgdGhlIGN1cnJlbnQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgc2V0LiAgSWYgUkVHTk8gaXMgLTEsIHVwZGF0ZQorICAgIHRoZW0gYWxsLiAqLworCit2b2lkCitmaWxsX2ZwcmVnc2V0IChmcHJlZ3NldHAsIHJlZ25vKQorZnByZWdzZXRfdCAqZnByZWdzZXRwOworaW50IHJlZ25vOworeworICBpbnQgcmVnaTsKKyAgY2hhciAqdG87CisgIGNoYXIgKmZyb207CisgIGV4dGVybiBjaGFyIHJlZ2lzdGVyc1tdOworCisgIGZvciAocmVnaSA9IEZQMF9SRUdOVU0gOyByZWdpIDwgRlBDX1JFR05VTSA7IHJlZ2krKykKKyAgICB7CisgICAgICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gcmVnaSkpCisJeworCSAgZnJvbSA9IChjaGFyICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnaSldOworCSAgdG8gPSAoY2hhciAqKSAmKGZwcmVnc2V0cCAtPiBmX2ZwcmVnc1tyZWdpLUZQMF9SRUdOVU1dWzBdKTsKKwkgIG1lbWNweSAodG8sIGZyb20sIFJFR0lTVEVSX1JBV19TSVpFIChyZWdpKSk7CisJfQorICAgIH0KKyAgaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IEZQQ19SRUdOVU0pKQorICAgIHsKKyAgICAgIGZwcmVnc2V0cCAtPiBmX3BjciA9ICooaW50ICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlBDX1JFR05VTSldOworICAgIH0KKyAgaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IEZQU19SRUdOVU0pKQorICAgIHsKKyAgICAgIGZwcmVnc2V0cCAtPiBmX3BzciA9ICooaW50ICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlBTX1JFR05VTSldOworICAgIH0KKyAgaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IEZQSV9SRUdOVU0pKQorICAgIHsKKyAgICAgIGZwcmVnc2V0cCAtPiBmX2ZwaWFkZHIgPSAqKGludCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQSV9SRUdOVU0pXTsKKyAgICB9Cit9CisKKyNlbmRpZgkvKiBkZWZpbmVkIChGUDBfUkVHTlVNKSAqLworCisjZW5kaWYgIC8qIFVTRV9QUk9DX0ZTICovCisKKyNpZmRlZiBHRVRfTE9OR0pNUF9UQVJHRVQKKy8qIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIGxvbmdqbXAgd2lsbCBsYW5kLiAgU2x1cnAgdGhlIGFyZ3Mgb3V0IG9mIHRoZSBzdGFjay4KKyAgIFdlIGV4cGVjdCB0aGUgZmlyc3QgYXJnIHRvIGJlIGEgcG9pbnRlciB0byB0aGUgam1wX2J1ZiBzdHJ1Y3R1cmUgZnJvbSB3aGljaAorICAgd2UgZXh0cmFjdCB0aGUgcGMgKEpCX1BDKSB0aGF0IHdlIHdpbGwgbGFuZCBhdC4gIFRoZSBwYyBpcyBjb3BpZWQgaW50byBQQy4KKyAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4gKi8KKworaW50CitnZXRfbG9uZ2ptcF90YXJnZXQocGMpCisgICAgIENPUkVfQUREUiAqcGM7Cit7CisgIGNoYXIgYnVmW1RBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUXTsKKyAgQ09SRV9BRERSIHNwLCBqYl9hZGRyOworCisgIHNwID0gcmVhZF9yZWdpc3RlcihTUF9SRUdOVU0pOworCisgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkgKHNwICsgU1BfQVJHMCwgLyogT2Zmc2V0IG9mIGZpcnN0IGFyZyBvbiBzdGFjayAqLworCQkJICBidWYsCisJCQkgIFRBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUKSkKKyAgICByZXR1cm4gMDsKKworICBqYl9hZGRyID0gZXh0cmFjdF9hZGRyZXNzIChidWYsIFRBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUKTsKKworICBpZiAodGFyZ2V0X3JlYWRfbWVtb3J5IChqYl9hZGRyICsgSkJfUEMgKiBKQl9FTEVNRU5UX1NJWkUsIGJ1ZiwKKwkJCSAgVEFSR0VUX1BUUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQpKQorICAgIHJldHVybiAwOworCisgICpwYyA9IGV4dHJhY3RfYWRkcmVzcyAoYnVmLCBUQVJHRVRfUFRSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCk7CisKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogR0VUX0xPTkdKTVBfVEFSR0VUICovCisKKy8qIEltbWVkaWF0ZWx5IGFmdGVyIGEgZnVuY3Rpb24gY2FsbCwgcmV0dXJuIHRoZSBzYXZlZCBwYyBiZWZvcmUgdGhlIGZyYW1lCisgICBpcyBzZXR1cC4gIEZvciBzdW4zJ3MsIHdlIGNoZWNrIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgYmVpbmcgaW5zaWRlIG9mIGEKKyAgIHN5c3RlbSBjYWxsLCBhbmQgaWYgc28sIHdlIGtub3cgdGhhdCBTdW4gcHVzaGVzIHRoZSBjYWxsICMgb24gdGhlIHN0YWNrCisgICBwcmlvciB0byBkb2luZyB0aGUgdHJhcC4gKi8KKworQ09SRV9BRERSCittNjhrX3NhdmVkX3BjX2FmdGVyX2NhbGwoZnJhbWUpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyNpZmRlZiBTWVNDQUxMX1RSQVAKKyAgaW50IG9wOworCisgIG9wID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoZnJhbWUtPnBjIC0gU1lTQ0FMTF9UUkFQX09GRlNFVCwgMik7CisKKyAgaWYgKG9wID09IFNZU0NBTExfVFJBUCkKKyAgICByZXR1cm4gcmVhZF9tZW1vcnlfaW50ZWdlciAocmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKSArIDQsIDQpOworICBlbHNlCisjZW5kaWYgLyogU1lTQ0FMTF9UUkFQICovCisgICAgcmV0dXJuIHJlYWRfbWVtb3J5X2ludGVnZXIgKHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSksIDQpOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9tNjhrX3RkZXAgKCkKK3sKKyAgdG1fcHJpbnRfaW5zbiA9IHByaW50X2luc25fbTY4azsKK30KZGlmZiAtLWdpdCBhL2dkYi9tNjhrbGludXgtbmF0LmMgYi9nZGIvbTY4a2xpbnV4LW5hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNjdiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbTY4a2xpbnV4LW5hdC5jCkBAIC0wLDAgKzEsMTU1IEBACisvKiBNb3Rvcm9sYSBtNjhrIG5hdGl2ZSBzdXBwb3J0IGZvciBMaW51eAorICAgQ29weXJpZ2h0IChDKSAxOTk2LDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisKKyNpZmRlZiBVU0cKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL2Rpci5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy91c2VyLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+CisKKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgImdkYl9zdGF0LmgiCisKKyNpbmNsdWRlICJmbG9hdGZvcm1hdC5oIgorCisjaW5jbHVkZSAidGFyZ2V0LmgiCisKKwwKKy8qIFRoaXMgdGFibGUgbXVzdCBsaW5lIHVwIHdpdGggUkVHSVNURVJfTkFNRVMgaW4gdG0tbTY4ay5oICovCitzdGF0aWMgY29uc3QgaW50IHJlZ21hcFtdID0gCit7CisgIFBUX0QwLCBQVF9EMSwgUFRfRDIsIFBUX0QzLCBQVF9ENCwgUFRfRDUsIFBUX0Q2LCBQVF9ENywKKyAgUFRfQTAsIFBUX0ExLCBQVF9BMiwgUFRfQTMsIFBUX0E0LCBQVF9BNSwgUFRfQTYsIFBUX1VTUCwKKyAgUFRfU1IsIFBUX1BDLAorICAvKiBQVF9GUDAsIC4uLiwgUFRfRlA3ICovCisgIDIxLCAyNCwgMjcsIDMwLCAzMywgMzYsIDM5LCA0MiwKKyAgLyogUFRfRlBDUiwgUFRfRlBTUiwgUFRfRlBJQVIgKi8KKyAgNDUsIDQ2LCA0NworfTsKKworLyogQkxPQ0tFTkQgaXMgdGhlIHZhbHVlIG9mIHUudV9hcjAsIGFuZCBwb2ludHMgdG8gdGhlIHBsYWNlIHdoZXJlIEdTCisgICBpcyBzdG9yZWQuICAqLworCitpbnQKK202OGtfbGludXhfcmVnaXN0ZXJfdV9hZGRyIChibG9ja2VuZCwgcmVnbnVtKQorICAgICBpbnQgYmxvY2tlbmQ7CisgICAgIGludCByZWdudW07Cit7CisgICAgcmV0dXJuIChibG9ja2VuZCArIDQgKiByZWdtYXBbcmVnbnVtXSk7Cit9CisKKy8qICBHaXZlbiBhIHBvaW50ZXIgdG8gYSBnZW5lcmFsIHJlZ2lzdGVyIHNldCBpbiAvcHJvYyBmb3JtYXQgKGdyZWdzZXRfdCAqKSwKKyAgICB1bnBhY2sgdGhlIHJlZ2lzdGVyIGNvbnRlbnRzIGFuZCBzdXBwbHkgdGhlbSBhcyBnZGIncyBpZGVhIG9mIHRoZSBjdXJyZW50CisgICAgcmVnaXN0ZXIgdmFsdWVzLiAqLworCisKKy8qIE5vdGUgYm90aCBtNjhrLXRkZXAuYyBhbmQgbTY4a2xpbnV4LW5hdC5jIGNvbnRhaW4gZGVmaW5pdGlvbnMKKyAgIGZvciBzdXBwbHlfZ3JlZ3NldCBhbmQgc3VwcGx5X2ZwcmVnc2V0LiBUaGUgZGVmaW5pdGlvbnMKKyAgIGluIG02OGstdGRlcC5jIGFyZSB2YWxpZCBpZiBVU0VfUFJPQ19GUyBpcyBkZWZpbmVkLiBPdGhlcndpc2UsCisgICB0aGUgZGVmaW5pdGlvbnMgaW4gbTY4a2xpbnV4LW5hdC5jIHdpbGwgYmUgdXNlZC4gVGhpcyBpcyBhIAorICAgYml0IG9mIGEgaGFjay4gVGhlIHN1cHBseV8qIHJvdXRpbmVzIGRvIG5vdCBiZWxvbmcgaW4gCisgICAqX3RkZXAuYyBmaWxlcy4gQnV0LCB0aGVyZSBhcmUgc2V2ZXJhbCBseW54IHBvcnRzIHRoYXQgY3VycmVudGx5IAorICAgZGVwZW5kIG9uIHRoZXNlIGRlZmluaXRpb25zLiAqLyAKKworI2lmbmRlZiBVU0VfUFJPQ19GUworCit2b2lkCitzdXBwbHlfZ3JlZ3NldCAoZ3JlZ3NldHApCisgICAgIGdyZWdzZXRfdCAqZ3JlZ3NldHA7Cit7CisgIGludCByZWdpOworCisgIGZvciAocmVnaSA9IEQwX1JFR05VTSA7IHJlZ2kgPD0gU1BfUkVHTlVNIDsgcmVnaSsrKQorICAgIHN1cHBseV9yZWdpc3RlciAocmVnaSwgKGNoYXIgKikgKCpncmVnc2V0cCArIHJlZ21hcFtyZWdpXSkpOworICBzdXBwbHlfcmVnaXN0ZXIgKFBTX1JFR05VTSwgKGNoYXIgKikgKCpncmVnc2V0cCArIFBUX1NSKSk7CisgIHN1cHBseV9yZWdpc3RlciAoUENfUkVHTlVNLCAoY2hhciAqKSAoKmdyZWdzZXRwICsgUFRfUEMpKTsKK30KKworLyogIEdpdmVuIGEgcG9pbnRlciB0byBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHNldCBpbiAvcHJvYyBmb3JtYXQKKyAgICAoZnByZWdzZXRfdCAqKSwgdW5wYWNrIHRoZSByZWdpc3RlciBjb250ZW50cyBhbmQgc3VwcGx5IHRoZW0gYXMgZ2RiJ3MKKyAgICBpZGVhIG9mIHRoZSBjdXJyZW50IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHZhbHVlcy4gKi8KKwordm9pZCAKK3N1cHBseV9mcHJlZ3NldCAoZnByZWdzZXRwKQorICAgICBmcHJlZ3NldF90ICpmcHJlZ3NldHA7Cit7CisgIGludCByZWdpOworCisgIGZvciAocmVnaSA9IEZQMF9SRUdOVU0gOyByZWdpIDwgRlBDX1JFR05VTSA7IHJlZ2krKykKKyAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ2ksIChjaGFyICopICZmcHJlZ3NldHAtPmZwcmVnc1socmVnaSAtIEZQMF9SRUdOVU0pICogM10pOworICBzdXBwbHlfcmVnaXN0ZXIgKEZQQ19SRUdOVU0sIChjaGFyICopICZmcHJlZ3NldHAtPmZwY250bFswXSk7CisgIHN1cHBseV9yZWdpc3RlciAoRlBTX1JFR05VTSwgKGNoYXIgKikgJmZwcmVnc2V0cC0+ZnBjbnRsWzFdKTsKKyAgc3VwcGx5X3JlZ2lzdGVyIChGUElfUkVHTlVNLCAoY2hhciAqKSAmZnByZWdzZXRwLT5mcGNudGxbMl0pOworfQorCisjZW5kaWYKKworDAoraW50CitrZXJuZWxfdV9zaXplICgpCit7CisgIHJldHVybiAoc2l6ZW9mIChzdHJ1Y3QgdXNlcikpOworfQorDAorLyogUmV0dXJuIG5vbi16ZXJvIGlmIFBDIHBvaW50cyBpbnRvIHRoZSBzaWduYWwgdHJhbXBvbGluZS4gICovCisKK2ludAoraW5fc2lndHJhbXAgKHBjKQorICAgICBDT1JFX0FERFIgcGM7Cit7CisgIENPUkVfQUREUiBzcDsKKyAgY2hhciBidWZbVEFSR0VUX1NIT1JUX0JJVCAvIFRBUkdFVF9DSEFSX0JJVF07CisgIGludCBpbnNuOworCisgIHNwID0gcmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKTsKKyAgaWYgKHBjIC0gMiA8IHNwKQorICAgIHJldHVybiAwOworCisgIGlmIChyZWFkX21lbW9yeV9ub2JwdCAocGMsIGJ1Ziwgc2l6ZW9mIChidWYpKSkKKyAgICByZXR1cm4gMDsKKyAgaW5zbiA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYnVmLCBzaXplb2YgKGJ1ZikpOworICBpZiAoaW5zbiA9PSAweGRlZmMgLyogYWRkYXcgIyxzcCAqLworICAgICAgfHwgaW5zbiA9PSAweDcwNzcgLyogbW92ZXEgIzExOSxkMCAqLworICAgICAgfHwgaW5zbiA9PSAweDRlNDAgLyogdHJhcCAjMCAqLworICAgICAgfHwgaW5zbiA9PSAweDIwM2MgLyogbW92ZWwgIyxkMCAqLykKKyAgICByZXR1cm4gMTsKKworICBpZiAocmVhZF9tZW1vcnlfbm9icHQgKHBjIC0gMiwgYnVmLCBzaXplb2YgKGJ1ZikpKQorICAgIHJldHVybiAwOworICBpbnNuID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChidWYsIHNpemVvZiAoYnVmKSk7CisgIGlmIChpbnNuID09IDB4ZGVmYyAvKiBhZGRhdyAjLHNwICovCisgICAgICB8fCBpbnNuID09IDB4NzA3NyAvKiBtb3ZlcSAjMTE5LGQwICovCisgICAgICB8fCBpbnNuID09IDB4NGU0MCAvKiB0cmFwICMwICovCisgICAgICB8fCBpbnNuID09IDB4MjAzYyAvKiBtb3ZlbCAjLGQwICovKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2RiL202OGtuYnNkLW5hdC5jIGIvZ2RiL202OGtuYnNkLW5hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZTcxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbTY4a25ic2QtbmF0LmMKQEAgLTAsMCArMSw4NiBAQAorLyogTmF0aXZlLWRlcGVuZGVudCBjb2RlIGZvciBNb3Rvcm9sYSBtNjhrJ3MgcnVubmluZyBOZXRCU0QsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk4OCwgMTk4OSwgMTk5MSwgMTk5MiwgMTk5NCwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorI2luY2x1ZGUgPG1hY2hpbmUvcmVnLmg+CisjaW5jbHVkZSA8bWFjaGluZS9mcmFtZS5oPgorCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisKK3ZvaWQKK2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyhyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBzdHJ1Y3QgcmVnIGluZmVyaW9yX3JlZ2lzdGVyczsKKyAgc3RydWN0IGZwcmVnIGluZmVyaW9yX2ZwX3JlZ2lzdGVyczsKKworICBwdHJhY2UgKFBUX0dFVFJFR1MsIGluZmVyaW9yX3BpZCwgCisJICAoUFRSQUNFX0FSRzNfVFlQRSkgJmluZmVyaW9yX3JlZ2lzdGVycywgMCk7CisgIG1lbWNweSAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFICgwKV0sICZpbmZlcmlvcl9yZWdpc3RlcnMsIAorCSAgc2l6ZW9mKGluZmVyaW9yX3JlZ2lzdGVycykpOworCisgIHB0cmFjZSAoUFRfR0VURlBSRUdTLCBpbmZlcmlvcl9waWQsIAorCSAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9mcF9yZWdpc3RlcnMsIDApOworICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLCAmaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLCAKKwkgIHNpemVvZihpbmZlcmlvcl9mcF9yZWdpc3RlcnMpKTsKKworICByZWdpc3RlcnNfZmV0Y2hlZCAoKTsKK30KKwordm9pZAorc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHN0cnVjdCByZWcgaW5mZXJpb3JfcmVnaXN0ZXJzOworICBzdHJ1Y3QgZnByZWcgaW5mZXJpb3JfZnBfcmVnaXN0ZXJzOworCisgIG1lbWNweSAoJmluZmVyaW9yX3JlZ2lzdGVycywgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFICgwKV0sCisJICBzaXplb2YoaW5mZXJpb3JfcmVnaXN0ZXJzKSk7CisgIHB0cmFjZSAoUFRfU0VUUkVHUywgaW5mZXJpb3JfcGlkLCAKKwkgIChQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfcmVnaXN0ZXJzLCAwKTsKKworICBtZW1jcHkgKCZpbmZlcmlvcl9mcF9yZWdpc3RlcnMsICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLAorCSAgc2l6ZW9mKGluZmVyaW9yX2ZwX3JlZ2lzdGVycykpOworICBwdHJhY2UgKFBUX1NFVEZQUkVHUywgaW5mZXJpb3JfcGlkLCAKKwkgIChQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLCAwKTsKK30KKworc3RydWN0IG1kX2NvcmUgeworICBzdHJ1Y3QgcmVnIGludHJlZzsgCisgIHN0cnVjdCBmcHJlZyBmcmVnOworfTsKKwordm9pZAorZmV0Y2hfY29yZV9yZWdpc3RlcnMgKGNvcmVfcmVnX3NlY3QsIGNvcmVfcmVnX3NpemUsIHdoaWNoLCBpZ25vcmUpCisgICAgIGNoYXIgKmNvcmVfcmVnX3NlY3Q7CisgICAgIHVuc2lnbmVkIGNvcmVfcmVnX3NpemU7CisgICAgIGludCB3aGljaDsKKyAgICAgQ09SRV9BRERSIGlnbm9yZTsKK3sKKyAgc3RydWN0IG1kX2NvcmUgKmNvcmVfcmVnID0gKHN0cnVjdCBtZF9jb3JlICopY29yZV9yZWdfc2VjdDsKKyAgCisgIC8qIEludGVnZXIgcmVnaXN0ZXJzICovCisgIG1lbWNweSgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKDApXSwKKwkgJmNvcmVfcmVnLT5pbnRyZWcsIHNpemVvZihzdHJ1Y3QgcmVnKSk7CisgIC8qIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAqLworICBtZW1jcHkoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNKV0sCisJICZjb3JlX3JlZy0+ZnJlZywgc2l6ZW9mKHN0cnVjdCBmcHJlZykpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL204OGstbmF0LmMgYi9nZGIvbTg4ay1uYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWU5MzkyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL204OGstbmF0LmMKQEAgLTAsMCArMSwyODUgQEAKKy8qIE5hdGl2ZS1kZXBlbmRlbnQgTW90b3JvbGEgODh4eHggc3VwcG9ydCBmb3IgR0RCLCB0aGUgR05VIERlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5ODgsIDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgPHN5cy91c2VyLmg+CisKKyNpZm5kZWYgVVNFUgkJCS8qIGFkZGVkIHRvIHN1cHBvcnQgQkNTIHB0cmFjZV91c2VyICovCisjZGVmaW5lIFVTRVIgcHRyYWNlX3VzZXIKKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlICJnZGJfc3RhdC5oIgorCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAic2V0am1wLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKworI2lmZGVmIERFTFRBODgKKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisKKy8qIGRlZmluZSBvZmZzZXRzIHRvIHRoZSBwYyBpbnN0cnVjdGlvbiBvZmZzZXRzIGluIHB0cmFjZV91c2VyIHN0cnVjdCAqLworI2RlZmluZSBTWElQX09GRlNFVCAoKGNoYXIgKikmdS5wdF9zaWdmcmFtZS5zaWdfc3hpcCAtIChjaGFyICopJnUpCisjZGVmaW5lIFNOSVBfT0ZGU0VUICgoY2hhciAqKSZ1LnB0X3NpZ2ZyYW1lLnNpZ19zbmlwIC0gKGNoYXIgKikmdSkKKyNkZWZpbmUgU0ZJUF9PRkZTRVQgKChjaGFyICopJnUucHRfc2lnZnJhbWUuc2lnX3NmaXAgLSAoY2hhciAqKSZ1KQorI2Vsc2UKKy8qIGRlZmluZSBvZmZzZXRzIHRvIHRoZSBwYyBpbnN0cnVjdGlvbiBvZmZzZXRzIGluIHB0cmFjZV91c2VyIHN0cnVjdCAqLworI2RlZmluZSBTWElQX09GRlNFVCAoKGNoYXIgKikmdS5wdF9zaWdmcmFtZS5kZ19zaWdmcmFtZS5zY19zeGlwIC0gKGNoYXIgKikmdSkKKyNkZWZpbmUgU05JUF9PRkZTRVQgKChjaGFyICopJnUucHRfc2lnZnJhbWUuZGdfc2lnZnJhbWUuc2Nfc25pcCAtIChjaGFyICopJnUpCisjZGVmaW5lIFNGSVBfT0ZGU0VUICgoY2hhciAqKSZ1LnB0X3NpZ2ZyYW1lLmRnX3NpZ2ZyYW1lLnNjX3NmaXAgLSAoY2hhciAqKSZ1KQorI2VuZGlmCisKK2V4dGVybiBpbnQgaGF2ZV9zeW1ib2xfZmlsZV9wKCk7CisKK2V4dGVybiBqbXBfYnVmIHN0YWNrX2ptcDsKKworZXh0ZXJuIGludCBlcnJubzsKK2V4dGVybiBjaGFyIHJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFU107CisKK3ZvaWQKK2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsJCS8qIE9yaWdpbmFsIHZhbHVlIGRpc2NhcmRlZCAqLworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgcmVnYWRkcjsKKyAgY2hhciBidWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKyAgcmVnaXN0ZXIgaW50IGk7CisKKyAgc3RydWN0IFVTRVIgdTsKKyAgdW5zaWduZWQgaW50IG9mZnNldDsKKworICBvZmZzZXQgPSAoY2hhciAqKSAmdS5wdF9yMCAtIChjaGFyICopICZ1OyAKKyAgcmVnYWRkciA9IG9mZnNldDsgLyogYnl0ZSBvZmZzZXQgdG8gcjA7Ki8KKworLyogIG9mZnNldCA9IHB0cmFjZSAoMywgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgb2Zmc2V0LCAwKSAtIEtFUk5FTF9VX0FERFI7ICovCisgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IE5VTV9SRUdTOyByZWdubysrKQorICAgIHsKKyAgICAgIC8qcmVnYWRkciA9IHJlZ2lzdGVyX2FkZHIgKHJlZ25vLCBvZmZzZXQpOyovCisJLyogODhrIGVuaGFuY2VtZW50ICAqLworICAgICAgICAKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pOyBpICs9IHNpemVvZiAoaW50KSkKKyAJeworIAkgICooaW50ICopICZidWZbaV0gPSBwdHJhY2UgKDMsIGluZmVyaW9yX3BpZCwKKwkJCQkgICAgIChQVFJBQ0VfQVJHM19UWVBFKSByZWdhZGRyLCAwKTsKKyAJICByZWdhZGRyICs9IHNpemVvZiAoaW50KTsKKyAJfQorICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgYnVmKTsKKyAgICB9CisgICAgLyogbm93IGxvYWQgdXAgcmVnaXN0ZXJzIDM2IC0gMzg7IHNwZWNpYWwgcGMgcmVnaXN0ZXJzICovCisgICAgKihpbnQgKikgJmJ1ZlswXSA9IHB0cmFjZSAoMyxpbmZlcmlvcl9waWQsCisJCQkgICAgICAgKFBUUkFDRV9BUkczX1RZUEUpIFNYSVBfT0ZGU0VUICwwKTsKKyAgICBzdXBwbHlfcmVnaXN0ZXIgKFNYSVBfUkVHTlVNLCBidWYpOworICAgICooaW50ICopICZidWZbMF0gPSBwdHJhY2UgKDMsIGluZmVyaW9yX3BpZCwKKwkJCSAgICAgICAoUFRSQUNFX0FSRzNfVFlQRSkgU05JUF9PRkZTRVQsMCk7CisgICAgc3VwcGx5X3JlZ2lzdGVyIChTTklQX1JFR05VTSwgYnVmKTsKKyAgICAqKGludCAqKSAmYnVmWzBdID0gcHRyYWNlICgzLCBpbmZlcmlvcl9waWQsCisJCQkgICAgICAgKFBUUkFDRV9BUkczX1RZUEUpIFNGSVBfT0ZGU0VULDApOworICAgIHN1cHBseV9yZWdpc3RlciAoU0ZJUF9SRUdOVU0sIGJ1Zik7Cit9CisKKy8qIFN0b3JlIG91ciByZWdpc3RlciB2YWx1ZXMgYmFjayBpbnRvIHRoZSBpbmZlcmlvci4KKyAgIElmIFJFR05PIGlzIC0xLCBkbyB0aGlzIGZvciBhbGwgcmVnaXN0ZXJzLgorICAgT3RoZXJ3aXNlLCBSRUdOTyBzcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXIgKHNvIHdlIGNhbiBzYXZlIHRpbWUpLiAgKi8KKwordm9pZAorc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgcmVnYWRkcjsKKyAgY2hhciBidWZbODBdOworCisgIHN0cnVjdCBVU0VSIHU7CisKKyAgdW5zaWduZWQgaW50IG9mZnNldCA9IChjaGFyICopICZ1LnB0X3IwIC0gKGNoYXIgKikgJnU7CisKKyAgcmVnYWRkciA9IG9mZnNldDsKKworICAvKiBEb24ndCB0cnkgdG8gZGVhbCB3aXRoIEVYSVBfUkVHTlVNIG9yIEVOSVBfUkVHTlVNLCBiZWNhdXNlIEkgdGhpbmsgZWl0aGVyCisgICAgIHN2cjMgZG9lc24ndCBydW4gb24gYW4gODgxMTAsIG9yIHRoZSBrZXJuZWwgaXNvbGF0ZXMgdGhlIGRpZmZlcmVudCAobm90CisgICAgIGNvbXBsZXRlbHkgc3VyZSB0aGlzIGlzIHRydWUsIGJ1dCBzZWVtcyB0byBiZS4gICovCisgIGlmIChyZWdubyA+PSAwKQorICAgIHsKKyAgICAgIC8qICAgICAgcmVnYWRkciA9IHJlZ2lzdGVyX2FkZHIgKHJlZ25vLCBvZmZzZXQpOyAqLworICAgICAgaWYgKHJlZ25vIDwgUENfUkVHTlVNKQorCXsgCisJICByZWdhZGRyID0gb2Zmc2V0ICsgcmVnbm8gKiBzaXplb2YgKGludCk7CisJICBlcnJubyA9IDA7CisJICBwdHJhY2UgKDYsIGluZmVyaW9yX3BpZCwKKwkJICAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnYWRkciwgcmVhZF9yZWdpc3RlciAocmVnbm8pKTsKKwkgIGlmIChlcnJubyAhPSAwKQorCSAgICB7CisJICAgICAgc3ByaW50ZiAoYnVmLCAid3JpdGluZyByZWdpc3RlciBudW1iZXIgJWQiLCByZWdubyk7CisJICAgICAgcGVycm9yX3dpdGhfbmFtZSAoYnVmKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKHJlZ25vID09IFNYSVBfUkVHTlVNKQorCXB0cmFjZSAoNiwgaW5mZXJpb3JfcGlkLAorCQkoUFRSQUNFX0FSRzNfVFlQRSkgU1hJUF9PRkZTRVQsIHJlYWRfcmVnaXN0ZXIocmVnbm8pKTsKKyAgICAgIGVsc2UgaWYgKHJlZ25vID09IFNOSVBfUkVHTlVNKQorCXB0cmFjZSAoNiwgaW5mZXJpb3JfcGlkLAorCQkoUFRSQUNFX0FSRzNfVFlQRSkgU05JUF9PRkZTRVQsIHJlYWRfcmVnaXN0ZXIocmVnbm8pKTsKKyAgICAgIGVsc2UgaWYgKHJlZ25vID09IFNGSVBfUkVHTlVNKQorCXB0cmFjZSAoNiwgaW5mZXJpb3JfcGlkLAorCQkoUFRSQUNFX0FSRzNfVFlQRSkgU0ZJUF9PRkZTRVQsIHJlYWRfcmVnaXN0ZXIocmVnbm8pKTsKKyAgICAgIGVsc2UKKwlwcmludGZfdW5maWx0ZXJlZCAoIkJhZCByZWdpc3RlciBudW1iZXIgZm9yIHN0b3JlX2luZmVyaW9yIHJvdXRpbmVcbiIpOworICAgIH0KKyAgZWxzZQorICAgIHsgCisgICAgICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCBQQ19SRUdOVU07IHJlZ25vKyspCisJeworCSAgLyogICAgICByZWdhZGRyID0gcmVnaXN0ZXJfYWRkciAocmVnbm8sIG9mZnNldCk7ICovCisJICBlcnJubyA9IDA7CisJICByZWdhZGRyID0gb2Zmc2V0ICsgcmVnbm8gKiBzaXplb2YgKGludCk7CisJICBwdHJhY2UgKDYsIGluZmVyaW9yX3BpZCwKKwkJICAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnYWRkciwgcmVhZF9yZWdpc3RlciAocmVnbm8pKTsKKwkgIGlmIChlcnJubyAhPSAwKQorCSAgICB7CisJICAgICAgc3ByaW50ZiAoYnVmLCAid3JpdGluZyByZWdpc3RlciBudW1iZXIgJWQiLCByZWdubyk7CisJICAgICAgcGVycm9yX3dpdGhfbmFtZSAoYnVmKTsKKwkgICAgfQorCX0KKyAgICAgIHB0cmFjZSAoNixpbmZlcmlvcl9waWQsCisJICAgICAgKFBUUkFDRV9BUkczX1RZUEUpIFNYSVBfT0ZGU0VULHJlYWRfcmVnaXN0ZXIoU1hJUF9SRUdOVU0pKTsKKyAgICAgIHB0cmFjZSAoNixpbmZlcmlvcl9waWQsCisJICAgICAgKFBUUkFDRV9BUkczX1RZUEUpIFNOSVBfT0ZGU0VULHJlYWRfcmVnaXN0ZXIoU05JUF9SRUdOVU0pKTsKKyAgICAgIHB0cmFjZSAoNixpbmZlcmlvcl9waWQsCisJICAgICAgKFBUUkFDRV9BUkczX1RZUEUpIFNGSVBfT0ZGU0VULHJlYWRfcmVnaXN0ZXIoU0ZJUF9SRUdOVU0pKTsKKyAgICB9Cit9CisKKworLyogYmxvY2tlbmQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgdXNlciBzdHJ1Y3R1cmUgKi8KK204OGtfcmVnaXN0ZXJfdV9hZGRyIChibG9ja2VuZCwgcmVnbnVtKQoreworICBzdHJ1Y3QgVVNFUiB1OworICBpbnQgdXN0YXJ0ID0gYmxvY2tlbmQgLSBzaXplb2YgKHN0cnVjdCBVU0VSKTsKKyAgc3dpdGNoIChyZWdudW0pCisgICAgeworICAgIGNhc2UgMDoKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgIGNhc2UgMzoKKyAgICBjYXNlIDQ6CisgICAgY2FzZSA1OgorICAgIGNhc2UgNjoKKyAgICBjYXNlIDc6CisgICAgY2FzZSA4OgorICAgIGNhc2UgOToKKyAgICBjYXNlIDEwOgorICAgIGNhc2UgMTE6CisgICAgY2FzZSAxMjoKKyAgICBjYXNlIDEzOgorICAgIGNhc2UgMTQ6CisgICAgY2FzZSAxNToKKyAgICBjYXNlIDE2OgorICAgIGNhc2UgMTc6CisgICAgY2FzZSAxODoKKyAgICBjYXNlIDE5OgorICAgIGNhc2UgMjA6CisgICAgY2FzZSAyMToKKyAgICBjYXNlIDIyOgorICAgIGNhc2UgMjM6CisgICAgY2FzZSAyNDoKKyAgICBjYXNlIDI1OgorICAgIGNhc2UgMjY6CisgICAgY2FzZSAyNzoKKyAgICBjYXNlIDI4OgorICAgIGNhc2UgMjk6CisgICAgY2FzZSAzMDoKKyAgICBjYXNlIDMxOgorICAgICAgcmV0dXJuICh1c3RhcnQgKyAoKGludCkgJnUucHRfcjAgLSAoaW50KSAmdSkgKyBSRUdJU1RFUl9TSVpFICogcmVnbnVtKTsKKyAgICBjYXNlIFBTUl9SRUdOVU06ICByZXR1cm4gKHVzdGFydCArICgoaW50KSAmdS5wdF9wc3IgLSAoaW50KSAmdSkpOworICAgIGNhc2UgRlBTUl9SRUdOVU06IHJldHVybiAodXN0YXJ0ICsgKChpbnQpICZ1LnB0X2Zwc3IgLSAoaW50KSAmdSkpOworICAgIGNhc2UgRlBDUl9SRUdOVU06IHJldHVybiAodXN0YXJ0ICsgKChpbnQpICZ1LnB0X2ZwY3IgLSAoaW50KSAmdSkpOworICAgIGNhc2UgU1hJUF9SRUdOVU06IHJldHVybiAodXN0YXJ0ICsgU1hJUF9PRkZTRVQpOyAKKyAgICBjYXNlIFNOSVBfUkVHTlVNOiByZXR1cm4gKHVzdGFydCArIFNOSVBfT0ZGU0VUKTsKKyAgICBjYXNlIFNGSVBfUkVHTlVNOiByZXR1cm4gKHVzdGFydCArIFNGSVBfT0ZGU0VUKTsgCisgICAgZGVmYXVsdDogCisJaWYgKHJlZ251bSA8IE5VTV9SRUdTKQorCSAgICAvKiBUaGUgcmVnaXN0ZXIgaXMgb25lIG9mIHRob3NlIHdoaWNoIGlzIG5vdCBkZWZpbmVkLi4uCisJICAgICAgIGdpdmUgaXQgemVybyAqLworCSAgICByZXR1cm4gKHVzdGFydCArICgoaW50KSAmdS5wdF9yMCAtIChpbnQpICZ1KSk7CisJZWxzZQorCSAgICByZXR1cm4gKGJsb2NrZW5kICsgUkVHSVNURVJfU0laRSAqIHJlZ251bSk7CisgICAgfQorfQorCisjaWZkZWYgVVNFX1BST0NfRlMKKworI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KKworLyogIEdpdmVuIGEgcG9pbnRlciB0byBhIGdlbmVyYWwgcmVnaXN0ZXIgc2V0IGluIC9wcm9jIGZvcm1hdCAoZ3JlZ3NldF90ICopLAorICAgIHVucGFjayB0aGUgcmVnaXN0ZXIgY29udGVudHMgYW5kIHN1cHBseSB0aGVtIGFzIGdkYidzIGlkZWEgb2YgdGhlIGN1cnJlbnQKKyAgICByZWdpc3RlciB2YWx1ZXMuICovCisKK3ZvaWQKK3N1cHBseV9ncmVnc2V0IChncmVnc2V0cCkKKyAgICAgZ3JlZ3NldF90ICpncmVnc2V0cDsKK3sKKyAgICByZWdpc3RlciBpbnQgcmVnaTsKKyAgICByZWdpc3RlciBncmVnX3QgKnJlZ3AgPSAoZ3JlZ190ICopIGdyZWdzZXRwOworCisgICAgZm9yIChyZWdpPTA7IHJlZ2kgPD0gU1BfUkVHTlVNOyByZWdpKyspCisJc3VwcGx5X3JlZ2lzdGVyIChyZWdpLCAoY2hhciAqKSAocmVncCArIHJlZ2kpKTsKKworICAgIHN1cHBseV9yZWdpc3RlciAoU1hJUF9SRUdOVU0sIChjaGFyICopIChyZWdwICsgUl9YSVApKTsKKyAgICBzdXBwbHlfcmVnaXN0ZXIgKFNOSVBfUkVHTlVNLCAoY2hhciAqKSAocmVncCArIFJfTklQKSk7CisgICAgc3VwcGx5X3JlZ2lzdGVyIChTRklQX1JFR05VTSwgKGNoYXIgKikgKHJlZ3AgKyBSX0ZJUCkpOworICAgIHN1cHBseV9yZWdpc3RlciAoUFNSX1JFR05VTSwgKGNoYXIgKikgKHJlZ3AgKyBSX1BTUikpOworICAgIHN1cHBseV9yZWdpc3RlciAoRlBTUl9SRUdOVU0sIChjaGFyICopIChyZWdwICsgUl9GUFNSKSk7CisgICAgc3VwcGx5X3JlZ2lzdGVyIChGUENSX1JFR05VTSwgKGNoYXIgKikgKHJlZ3AgKyBSX0ZQQ1IpKTsKK30KKwordm9pZAorZmlsbF9ncmVnc2V0IChncmVnc2V0cCwgcmVnbm8pCisgICAgIGdyZWdzZXRfdCAqZ3JlZ3NldHA7CisgICAgIGludCByZWdubzsKK3sKKyAgICBpbnQgcmVnaTsKKyAgICByZWdpc3RlciBncmVnX3QgKnJlZ3AgPSAoZ3JlZ190ICopIGdyZWdzZXRwOworICAgIGV4dGVybiBjaGFyIHJlZ2lzdGVyc1tdOworCisgICAgZm9yIChyZWdpID0gMCA7IHJlZ2kgPD0gUl9SMzEgOyByZWdpKyspCisJaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IHJlZ2kpKQorCSAgICAqKHJlZ3AgKyByZWdpKSA9ICooaW50ICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURShyZWdpKV07CisKKyAgICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gU1hJUF9SRUdOVU0pKQorCSoocmVncCArIFJfWElQKSA9ICooaW50ICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURShTWElQX1JFR05VTSldOworICAgIGlmICgocmVnbm8gPT0gLTEpIHx8IChyZWdubyA9PSBTTklQX1JFR05VTSkpCisJKihyZWdwICsgUl9OSVApID0gKihpbnQgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKFNOSVBfUkVHTlVNKV07CisgICAgaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IFNGSVBfUkVHTlVNKSkKKwkqKHJlZ3AgKyBSX0ZJUCkgPSAqKGludCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU0ZJUF9SRUdOVU0pXTsKKyAgICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gUFNSX1JFR05VTSkpCisJKihyZWdwICsgUl9QU1IpID0gKihpbnQgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKFBTUl9SRUdOVU0pXTsKKyAgICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gRlBTUl9SRUdOVU0pKQorCSoocmVncCArIFJfRlBTUikgPSAqKGludCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoRlBTUl9SRUdOVU0pXTsKKyAgICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gRlBDUl9SRUdOVU0pKQorCSoocmVncCArIFJfRlBDUikgPSAqKGludCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoRlBDUl9SRUdOVU0pXTsKK30KKworI2VuZGlmIC8qIFVTRV9QUk9DX0ZTICovCmRpZmYgLS1naXQgYS9nZGIvbTg4ay10ZGVwLmMgYi9nZGIvbTg4ay10ZGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyY2I3NgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9tODhrLXRkZXAuYwpAQCAtMCwwICsxLDYyOSBAQAorLyogVGFyZ2V0LW1hY2hpbmUgZGVwZW5kZW50IGNvZGUgZm9yIE1vdG9yb2xhIDg4MDAwIHNlcmllcywgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTg4LCAxOTkwLCAxOTkxLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgInNldGptcC5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisKKy8qIFNpemUgb2YgYW4gaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUJQllURVNfUEVSXzg4S19JTlNOCTQKKwordm9pZCBmcmFtZV9maW5kX3NhdmVkX3JlZ3MgKCk7CisKKy8qIElzIHRoaXMgdGFyZ2V0IGFuIG04ODExMD8gIE90aGVyd2lzZSBhc3N1bWUgbTg4MTAwLiAgVGhpcyBoYXMKKyAgIHJlbGV2YW5jZSBmb3IgdGhlIHdheXMgaW4gd2hpY2ggd2Ugc2NyZXcgd2l0aCBpbnN0cnVjdGlvbiBwb2ludGVycy4gICovCisKK2ludCB0YXJnZXRfaXNfbTg4MTEwID0gMDsKKworLyogVGhlIG04OGsga2VybmVsIGFsaWducyBhbGwgaW5zdHJ1Y3Rpb25zIG9uIDQtYnl0ZSBib3VuZGFyaWVzLiAgVGhlCisgICBrZXJuZWwgYWxzbyB1c2VzIHRoZSBsZWFzdCBzaWduaWZpY2FudCB0d28gYml0cyBmb3IgaXRzIG93biBob2N1cworICAgcG9jdXMuICBXaGVuIGdkYiByZWNlaXZlcyBhbiBhZGRyZXNzIGZyb20gdGhlIGtlcm5lbCwgaXQgbmVlZHMgdG8KKyAgIHByZXNlcnZlIHRob3NlIHJpZ2h0LW1vc3QgdHdvIGJpdHMsIGJ1dCBnZGIgYWxzbyBuZWVkcyB0byBiZSBjYXJlZnVsCisgICB0byByZWFsaXplIHRoYXQgdGhvc2UgdHdvIGJpdHMgYXJlIG5vdCByZWFsbHkgYSBwYXJ0IG9mIHRoZSBhZGRyZXNzCisgICBvZiBhbiBpbnN0cnVjdGlvbi4gIFNocnVnLiAgKi8KKworQ09SRV9BRERSCittODhrX2FkZHJfYml0c19yZW1vdmUgKGFkZHIpCisgICAgIENPUkVfQUREUiBhZGRyOworeworICByZXR1cm4gKChhZGRyKSAmIH4zKTsKK30KKworCisvKiBHaXZlbiBhIEdEQiBmcmFtZSwgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uJ3MgZnJhbWUuCisgICBUaGlzIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBuZXcgR0RCIGZyYW1lIHN0cnVjdCwgYW5kIHRoZW4KKyAgIElOSVRfRVhUUkFfRlJBTUVfSU5GTyBhbmQgSU5JVF9GUkFNRV9QQyB3aWxsIGJlIGNhbGxlZCBmb3IgdGhlIG5ldyBmcmFtZS4KKworICAgRm9yIHVzLCB0aGUgZnJhbWUgYWRkcmVzcyBpcyBpdHMgc3RhY2sgcG9pbnRlciB2YWx1ZSwgc28gd2UgbG9vayB1cAorICAgdGhlIGZ1bmN0aW9uIHByb2xvZ3VlIHRvIGRldGVybWluZSB0aGUgY2FsbGVyJ3Mgc3AgdmFsdWUsIGFuZCByZXR1cm4gaXQuICAqLworCitDT1JFX0FERFIKK2ZyYW1lX2NoYWluICh0aGlzZnJhbWUpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICp0aGlzZnJhbWU7Cit7CisKKyAgZnJhbWVfZmluZF9zYXZlZF9yZWdzICh0aGlzZnJhbWUsIChzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqKSAwKTsKKyAgLyogTk9URTogIHRoaXMgZGVwZW5kcyBvbiBmcmFtZV9maW5kX3NhdmVkX3JlZ3MgcmV0dXJuaW5nIHRoZSBWQUxVRSwgbm90CisgCSAgICB0aGUgQUREUkVTUywgb2YgU1BfUkVHTlVNLiAgSXQgYWxzbyBkZXBlbmRzIG9uIHRoZSBjYWNoZSBvZgorCSAgICBmcmFtZV9maW5kX3NhdmVkX3JlZ3MgcmVzdWx0cy4gICovCisgIGlmICh0aGlzZnJhbWUtPmZzci0+cmVnc1tTUF9SRUdOVU1dKQorICAgIHJldHVybiB0aGlzZnJhbWUtPmZzci0+cmVnc1tTUF9SRUdOVU1dOworICBlbHNlCisgICAgcmV0dXJuIHRoaXNmcmFtZS0+ZnJhbWU7CS8qIExlYWYgZm4gLS0gbmV4dCBmcmFtZSB1cCBoYXMgc2FtZSBTUC4gKi8KK30KKworaW50CitmcmFtZWxlc3NfZnVuY3Rpb25faW52b2NhdGlvbiAoZnJhbWUpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKworICBmcmFtZV9maW5kX3NhdmVkX3JlZ3MgKGZyYW1lLCAoc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKikgMCk7CisgIC8qIE5PVEU6ICB0aGlzIGRlcGVuZHMgb24gZnJhbWVfZmluZF9zYXZlZF9yZWdzIHJldHVybmluZyB0aGUgVkFMVUUsIG5vdAorIAkgICAgdGhlIEFERFJFU1MsIG9mIFNQX1JFR05VTS4gIEl0IGFsc28gZGVwZW5kcyBvbiB0aGUgY2FjaGUgb2YKKwkgICAgZnJhbWVfZmluZF9zYXZlZF9yZWdzIHJlc3VsdHMuICAqLworICBpZiAoZnJhbWUtPmZzci0+cmVnc1tTUF9SRUdOVU1dKQorICAgIHJldHVybiAwOwkJCS8qIEZyYW1lZnVsIC0tIHJldHVybiBhZGRyIHNhdmVkIHNvbWV3aGVyZSAqLworICBlbHNlCisgICAgcmV0dXJuIDE7CQkJLyogRnJhbWVsZXNzIC0tIG5vIHNhdmVkIHJldHVybiBhZGRyZXNzICovCit9CisKK3ZvaWQKK2luaXRfZXh0cmFfZnJhbWVfaW5mbyAoZnJvbWxlYWYsIGZyYW1lKQorICAgICBpbnQgZnJvbWxlYWY7CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgZnJhbWUtPmZzciA9IDA7CQkJLyogTm90IHlldCBhbGxvY2F0ZWQgKi8KKyAgZnJhbWUtPmFyZ3NfcG9pbnRlciA9IDA7CQkvKiBVbmtub3duICovCisgIGZyYW1lLT5sb2NhbHNfcG9pbnRlciA9IDA7CS8qIFVua25vd24gKi8KK30KKwwKKy8qIEV4YW1pbmUgYW4gbTg4ayBmdW5jdGlvbiBwcm9sb2d1ZSwgcmVjb3JkaW5nIHRoZSBhZGRyZXNzZXMgYXQgd2hpY2gKKyAgIHJlZ2lzdGVycyBhcmUgc2F2ZWQgZXhwbGljaXRseSBieSB0aGUgcHJvbG9ndWUgY29kZSwgYW5kIHJldHVybmluZworICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGluc3RydWN0aW9uIGFmdGVyIHRoZSBwcm9sb2d1ZSAoYnV0IG5vdAorICAgYWZ0ZXIgdGhlIGluc3RydWN0aW9uIGF0IGFkZHJlc3MgTElNSVQsIGFzIGV4cGxhaW5lZCBiZWxvdykuCisKKyAgIExJTUlUIHBsYWNlcyBhbiB1cHBlciBib3VuZCBvbiBhZGRyZXNzZXMgb2YgdGhlIGluc3RydWN0aW9ucyB0byBiZQorICAgZXhhbWluZWQuICBJZiB0aGUgcHJvbG9ndWUgY29kZSBzY2FuIHJlYWNoZXMgTElNSVQsIHRoZSBzY2FuIGlzCisgICBhYm9ydGVkIGFuZCBMSU1JVCBpcyByZXR1cm5lZC4gIFRoaXMgaXMgdXNlZCwgd2hlbiBleGFtaW5pbmcgdGhlCisgICBwcm9sb2d1ZSBmb3IgdGhlIGN1cnJlbnQgZnJhbWUsIHRvIGtlZXAgZXhhbWluZV9wcm9sb2d1ZSAoKSBmcm9tCisgICBjbGFpbWluZyB0aGF0IGEgZ2l2ZW4gcmVnaXN0ZXIgaGFzIGJlZW4gc2F2ZWQgd2hlbiBpbiBmYWN0IHRoZQorICAgaW5zdHJ1Y3Rpb24gdGhhdCBzYXZlcyBpdCBoYXMgbm90IHlldCBiZWVuIGV4ZWN1dGVkLiAgTElNSVQgaXMgdXNlZAorICAgYXQgb3RoZXIgdGltZXMgdG8gc3RvcCB0aGUgc2NhbiB3aGVuIHdlIGhpdCBjb2RlIGFmdGVyIHRoZSB0cnVlCisgICBmdW5jdGlvbiBwcm9sb2d1ZSAoZS5nLiBmb3IgdGhlIGZpcnN0IHNvdXJjZSBsaW5lKSB3aGljaCBtaWdodAorICAgb3RoZXJ3aXNlIGJlIG1pc3Rha2VuIGZvciBmdW5jdGlvbiBwcm9sb2d1ZS4KKworICAgVGhlIGZvcm1hdCBvZiB0aGUgZnVuY3Rpb24gcHJvbG9ndWUgbWF0Y2hlZCBieSB0aGlzIHJvdXRpbmUgaXMKKyAgIGRlcml2ZWQgZnJvbSBleGFtaW5hdGlvbiBvZiB0aGUgc291cmNlIHRvIGdjYyAxLjk1LCBwYXJ0aWN1bGFybHkKKyAgIHRoZSByb3V0aW5lIG91dHB1dF9wcm9sb2d1ZSAoKSBpbiBjb25maWcvb3V0LW04OGsuYy4KKworICAgc3VidSByMzEscjMxLG4JCQkjIHN0YWNrIHBvaW50ZXIgdXBkYXRlCisKKyAgIChzdCBybixyMzEsb2Zmc2V0KT8JCQkjIHNhdmUgaW5jb21pbmcgcmVncworICAgKHN0LmQgcm4scjMxLG9mZnNldCk/CisKKyAgIChhZGR1IHIzMCxyMzEsbik/CQkJIyBmcmFtZSBwb2ludGVyIHVwZGF0ZQorCisgICAocGljIHNlcXVlbmNlKT8JCQkjIFBJQyBjb2RlIHByb2xvZ3VlCisKKyAgIChvciAgIHJuLHJtLDApPwkJCSMgTW92ZSBwYXJhbWV0ZXJzIHRvIG90aGVyIHJlZ3MKKyovCisKKy8qIE1hY3JvcyBmb3IgZXh0cmFjdGluZyBmaWVsZHMgZnJvbSBpbnN0cnVjdGlvbnMuICAqLworCisjZGVmaW5lIEJJVE1BU0socG9zLCB3aWR0aCkgKCgoMHgxIDw8ICh3aWR0aCkpIC0gMSkgPDwgKHBvcykpCisjZGVmaW5lIEVYVFJBQ1RfRklFTEQodmFsLCBwb3MsIHdpZHRoKSAoKHZhbCkgPj4gKHBvcykgJiBCSVRNQVNLICgwLCB3aWR0aCkpCisjZGVmaW5lCVNVQlVfT0ZGU0VUKHgpCSgodW5zaWduZWQpKHggJiAweEZGRkYpKQorI2RlZmluZQlTVF9PRkZTRVQoeCkJKCh1bnNpZ25lZCkoKHgpICYgMHhGRkZGKSkKKyNkZWZpbmUJU1RfU1JDKHgpCUVYVFJBQ1RfRklFTEQgKCh4KSwgMjEsIDUpCisjZGVmaW5lCUFERFVfT0ZGU0VUKHgpCSgodW5zaWduZWQpKHggJiAweEZGRkYpKQorCisvKgorICogcHJvbG9ndWVfaW5zbl90YmwgaXMgYSB0YWJsZSBvZiBpbnN0cnVjdGlvbnMgd2hpY2ggbWF5IGNvbXByaXNlIGEKKyAqIGZ1bmN0aW9uIHByb2xvZ3VlLiAgQXNzb2NpYXRlZCB3aXRoIGVhY2ggdGFibGUgZW50cnkgKGNvcnJlc3BvbmRpbmcKKyAqIHRvIGEgc2luZ2xlIGluc3RydWN0aW9uIG9yIGdyb3VwIG9mIGluc3RydWN0aW9ucyksIGlzIGFuIGFjdGlvbi4KKyAqIFRoaXMgYWN0aW9uIGlzIHVzZWQgYnkgZXhhbWluZV9wcm9sb2d1ZSAoYmVsb3cpIHRvIGRldGVybWluZQorICogdGhlIHN0YXRlIG9mIGNlcnRhaW4gbWFjaGluZSByZWdpc3RlcnMgYW5kIHdoZXJlIHRoZSBzdGFjayBmcmFtZSBsaXZlcy4KKyAqLworCitlbnVtIHByb2xvZ3VlX2luc25fYWN0aW9uIHsKKyAgUElBX1NLSVAsCQkJLyogZG9uJ3QgY2FyZSB3aGF0IHRoZSBpbnN0cnVjdGlvbiBkb2VzICovCisgIFBJQV9OT1RFX1NULAkJCS8qIG5vdGUgcmVnaXN0ZXIgc3RvcmVkIGFuZCB3aGVyZSAqLworICBQSUFfTk9URV9TVEQsCQkJLyogbm90ZSBwYWlyIG9mIHJlZ2lzdGVycyBzdG9yZWQgYW5kIHdoZXJlICovCisgIFBJQV9OT1RFX1NQX0FESlVTVE1FTlQsCS8qIG5vdGUgc3RhY2sgcG9pbnRlciBhZGp1c3RtZW50ICovCisgIFBJQV9OT1RFX0ZQX0FTU0lHTk1FTlQsCS8qIG5vdGUgZnJhbWUgcG9pbnRlciBhc3NpZ25tZW50ICovCisgIFBJQV9OT1RFX1BST0xPR1VFX0VORCwJLyogbm8gbW9yZSBwcm9sb2d1ZSAqLworfTsKKworc3RydWN0IHByb2xvZ3VlX2luc25zIHsKKyAgICB1bnNpZ25lZCBsb25nIGluc247CisgICAgdW5zaWduZWQgbG9uZyBtYXNrOworICAgIGVudW0gcHJvbG9ndWVfaW5zbl9hY3Rpb24gYWN0aW9uOworfTsKKworc3RydWN0IHByb2xvZ3VlX2luc25zIHByb2xvZ3VlX2luc25fdGJsW10gPSB7CisgIC8qIFZhcmlvdXMgcmVnaXN0ZXIgbW92ZSBpbnN0cnVjdGlvbnMgKi8KKyAgeyAweDU4MDAwMDAwLCAweGY4MDBmZmZmLCBQSUFfU0tJUCB9LAkJLyogb3Ivb3IudSB3aXRoIGltbWVkIG9mIDAgKi8KKyAgeyAweGY0MDA1ODAwLCAweGZjMWZmZmUwLCBQSUFfU0tJUCB9LAkJLyogb3IgcmQsIHIwLCBycyAqLworICB7IDB4ZjQwMDU4MDAsIDB4ZmMwMGZmZmYsIFBJQV9TS0lQIH0sCQkvKiBvciByZCwgcnMsIHIwICovCisKKyAgLyogU3RhY2sgcG9pbnRlciBzZXR1cDogInN1YnUgc3AsIHNwLCBuIiB3aGVyZSBuIGlzIGEgbXVsdGlwbGUgb2YgOCAqLworICB7IDB4NjdmZjAwMDAsIDB4ZmZmZjAwMDcsIFBJQV9OT1RFX1NQX0FESlVTVE1FTlQgfSwKKworICAvKiBGcmFtZSBwb2ludGVyIGFzc2lnbm1lbnQ6ICJhZGR1IHIzMCwgcjMxLCBuIiAqLworICB7IDB4NjNkZjAwMDAsIDB4ZmZmZjAwMDAsIFBJQV9OT1RFX0ZQX0FTU0lHTk1FTlQgfSwKKworICAvKiBTdG9yZSB0byBzdGFjayBpbnN0cnVjdGlvbnM7IGVpdGhlciAic3QgcngsIHNwLCBuIiBvciAic3QuZCByeCwgc3AsIG4iICovCisgIHsgMHgyNDFmMDAwMCwgMHhmYzFmMDAwMCwgUElBX05PVEVfU1QgfSwJLyogc3QgcngsIHNwLCBuICovCisgIHsgMHgyMDFmMDAwMCwgMHhmYzFmMDAwMCwgUElBX05PVEVfU1REIH0sCS8qIHN0LmQgcnMsIHNwLCBuICovCisKKyAgLyogSW5zdHJ1Y3Rpb25zIG5lZWRlZCBmb3Igc2V0dGluZyB1cCByMjUgZm9yIHBpYyBjb2RlLiAqLworICB7IDB4NWYyMDAwMDAsIDB4ZmZmZjAwMDAsIFBJQV9TS0lQIH0sCQkvKiBvci51IHIyNSwgcjAsIG9mZnNldF9oaWdoICovCisgIHsgMHhjYzAwMDAwMiwgMHhmZmZmZmZmZiwgUElBX1NLSVAgfSwJCS8qIGJzci5uIExhYiAqLworICB7IDB4NWIzOTAwMDAsIDB4ZmZmZjAwMDAsIFBJQV9TS0lQIH0sCQkvKiBvciByMjUsIHIyNSwgb2Zmc2V0X2xvdyAqLworICB7IDB4ZjczOTYwMDEsIDB4ZmZmZmZmZmYsIFBJQV9TS0lQIH0sCQkvKiBMYWI6IGFkZHUgcjI1LCByMjUsIHIxICovCisKKyAgLyogVmFyaW91cyBicmFuY2ggb3IganVtcCBpbnN0cnVjdGlvbnMgd2hpY2ggaGF2ZSBhIGRlbGF5IHNsb3QgLS0gdGhlc2UKKyAgICAgZG8gbm90IGZvcm0gcGFydCBvZiB0aGUgcHJvbG9ndWUsIGJ1dCB0aGUgaW5zdHJ1Y3Rpb24gaW4gdGhlIGRlbGF5CisgICAgIHNsb3QgbWlnaHQgYmUgYSBzdG9yZSBpbnN0cnVjdGlvbiB3aGljaCBzaG91bGQgYmUgbm90ZWQuICovCisgIHsgMHhjNDAwMDAwMCwgMHhlNDAwMDAwMCwgUElBX05PVEVfUFJPTE9HVUVfRU5EIH0sIAorICAJCQkJCS8qIGJyLm4sIGJzci5uLCBiYjAubiwgb3IgYmIxLm4gKi8KKyAgeyAweGVjMDAwMDAwLCAweGZjMDAwMDAwLCBQSUFfTk9URV9QUk9MT0dVRV9FTkQgfSwgLyogYmNuZC5uICovCisgIHsgMHhmNDAwYzQwMCwgMHhmZmZmZjdlMCwgUElBX05PVEVfUFJPTE9HVUVfRU5EIH0gLyogam1wLm4gb3IganNyLm4gKi8KKworfTsKKworCisvKiBGZXRjaCB0aGUgaW5zdHJ1Y3Rpb24gYXQgQUREUiwgcmV0dXJuaW5nIDAgaWYgQUREUiBpcyBiZXlvbmQgTElNIG9yCisgICBpcyBub3QgdGhlIGFkZHJlc3Mgb2YgYSB2YWxpZCBpbnN0cnVjdGlvbiwgdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQKKyAgIGluc3RydWN0aW9uIGJleW9uZCBBRERSIG90aGVyd2lzZS4gICpQV09SRDEgcmVjZWl2ZXMgdGhlIGZpcnN0IHdvcmQKKyAgIG9mIHRoZSBpbnN0cnVjdGlvbi4gKi8KKworI2RlZmluZSBORVhUX1BST0xPR1VFX0lOU04oYWRkciwgbGltLCBwd29yZDEpIFwKKyAgKCgoYWRkcikgPCAobGltKSkgPyBuZXh0X2luc24gKGFkZHIsIHB3b3JkMSkgOiAwKQorCisvKiBSZWFkIHRoZSBtODhrIGluc3RydWN0aW9uIGF0ICdtZW1hZGRyJyBhbmQgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIAorICAgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gYWZ0ZXIgdGhhdCwgb3IgMCBpZiAnbWVtYWRkcicgaXMgbm90IHRoZQorICAgYWRkcmVzcyBvZiBhIHZhbGlkIGluc3RydWN0aW9uLiAgVGhlIGluc3RydWN0aW9uCisgICBpcyBzdG9yZWQgYXQgJ3B3b3JkMScuICAqLworCitDT1JFX0FERFIKK25leHRfaW5zbiAobWVtYWRkciwgcHdvcmQxKQorICAgICB1bnNpZ25lZCBsb25nICpwd29yZDE7CisgICAgIENPUkVfQUREUiBtZW1hZGRyOworeworICAqcHdvcmQxID0gcmVhZF9tZW1vcnlfaW50ZWdlciAobWVtYWRkciwgQllURVNfUEVSXzg4S19JTlNOKTsKKyAgcmV0dXJuIG1lbWFkZHIgKyBCWVRFU19QRVJfODhLX0lOU047Cit9CisKKy8qIFJlYWQgYSByZWdpc3RlciBmcm9tIGZyYW1lcyBjYWxsZWQgYnkgdXMgKG9yIGZyb20gdGhlIGhhcmR3YXJlIHJlZ3MpLiAgKi8KKworc3RhdGljIGludAorcmVhZF9uZXh0X2ZyYW1lX3JlZyhmcmFtZSwgcmVnbm8pCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKKyAgICAgaW50IHJlZ25vOworeworICBmb3IgKDsgZnJhbWU7IGZyYW1lID0gZnJhbWUtPm5leHQpIHsKKyAgICAgIGlmIChyZWdubyA9PSBTUF9SRUdOVU0pCisJcmV0dXJuIEZSQU1FX0ZQIChmcmFtZSk7CisgICAgICBlbHNlIGlmIChmcmFtZS0+ZnNyLT5yZWdzW3JlZ25vXSkKKwlyZXR1cm4gcmVhZF9tZW1vcnlfaW50ZWdlcihmcmFtZS0+ZnNyLT5yZWdzW3JlZ25vXSwgNCk7CisgIH0KKyAgcmV0dXJuIHJlYWRfcmVnaXN0ZXIocmVnbm8pOworfQorCisvKiBFeGFtaW5lIHRoZSBwcm9sb2d1ZSBvZiBhIGZ1bmN0aW9uLiAgYGlwJyBwb2ludHMgdG8gdGhlIGZpcnN0IGluc3RydWN0aW9uLgorICAgYGxpbWl0JyBpcyB0aGUgbGltaXQgb2YgdGhlIHByb2xvZ3VlIChlLmcuIHRoZSBhZGRyIG9mIHRoZSBmaXJzdCAKKyAgIGxpbmVudW1iZXIsIG9yIHBlcmhhcHMgdGhlIHByb2dyYW0gY291bnRlciBpZiB3ZSdyZSBzdGVwcGluZyB0aHJvdWdoKS4KKyAgIGBmcmFtZV9zcCcgaXMgdGhlIHN0YWNrIHBvaW50ZXIgdmFsdWUgaW4gdXNlIGluIHRoaXMgZnJhbWUuICAKKyAgIGBmc3InIGlzIGEgcG9pbnRlciB0byBhIGZyYW1lX3NhdmVkX3JlZ3Mgc3RydWN0dXJlIGludG8gd2hpY2ggd2UgcHV0CisgICBpbmZvIGFib3V0IHRoZSByZWdpc3RlcnMgc2F2ZWQgYnkgdGhpcyBmcmFtZS4gIAorICAgYGZpJyBpcyBhIHN0cnVjdCBmcmFtZV9pbmZvIHBvaW50ZXI7IHdlIGZpbGwgaW4gdmFyaW91cyBmaWVsZHMgaW4gaXQKKyAgIHRvIHJlZmxlY3QgdGhlIG9mZnNldHMgb2YgdGhlIGFyZyBwb2ludGVyIGFuZCB0aGUgbG9jYWxzIHBvaW50ZXIuICAqLworCitzdGF0aWMgQ09SRV9BRERSCitleGFtaW5lX3Byb2xvZ3VlIChpcCwgbGltaXQsIGZyYW1lX3NwLCBmc3IsIGZpKQorICAgICByZWdpc3RlciBDT1JFX0FERFIgaXA7CisgICAgIHJlZ2lzdGVyIENPUkVfQUREUiBsaW1pdDsKKyAgICAgQ09SRV9BRERSIGZyYW1lX3NwOworICAgICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqZnNyOworICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7Cit7CisgIHJlZ2lzdGVyIENPUkVfQUREUiBuZXh0X2lwOworICByZWdpc3RlciBpbnQgc3JjOworICB1bnNpZ25lZCBpbnQgaW5zbjsKKyAgaW50IHNpemUsIG9mZnNldDsKKyAgY2hhciBtdXN0X2FkanVzdFszMl07CQkvKiBJZiBzZXQsIG11c3QgYWRqdXN0IG9mZnNldHMgaW4gZnNyICovCisgIGludCBzcF9vZmZzZXQgPSAtMTsJCS8qIC0xIG1lYW5zIG5vdCBzZXQgKHZhbGlkIG11c3QgYmUgbXVsdCBvZiA4KSAqLworICBpbnQgZnBfb2Zmc2V0ID0gLTE7CQkvKiAtMSBtZWFucyBub3Qgc2V0ICovCisgIENPUkVfQUREUiBmcmFtZV9mcDsKKyAgQ09SRV9BRERSIHByb2xvZ3VlX2VuZCA9IDA7CisKKyAgbWVtc2V0IChtdXN0X2FkanVzdCwgJ1wwJywgc2l6ZW9mIChtdXN0X2FkanVzdCkpOworICBuZXh0X2lwID0gTkVYVF9QUk9MT0dVRV9JTlNOIChpcCwgbGltaXQsICZpbnNuKTsKKworICB3aGlsZSAobmV4dF9pcCkKKyAgICB7CisgICAgICBzdHJ1Y3QgcHJvbG9ndWVfaW5zbnMgKnBpcDsgCisKKyAgICAgIGZvciAocGlwPXByb2xvZ3VlX2luc25fdGJsOyAoaW5zbiAmIHBpcC0+bWFzaykgIT0gcGlwLT5pbnNuOyApCisJICBpZiAoKytwaXAgPj0gcHJvbG9ndWVfaW5zbl90YmwgKyBzaXplb2YgcHJvbG9ndWVfaW5zbl90YmwpCisJICAgICAgZ290byBlbmRfb2ZfcHJvbG9ndWVfZm91bmQ7CS8qIG5vdCBhIHByb2xvZ3VlIGluc24gKi8KKworICAgICAgc3dpdGNoIChwaXAtPmFjdGlvbikKKwl7CisJICBjYXNlIFBJQV9OT1RFX1NUOgorCSAgY2FzZSBQSUFfTk9URV9TVEQ6CisJICAgIGlmIChzcF9vZmZzZXQgIT0gLTEpIHsKKwkJc3JjID0gU1RfU1JDIChpbnNuKTsKKwkJb2Zmc2V0ID0gU1RfT0ZGU0VUIChpbnNuKTsKKwkJbXVzdF9hZGp1c3Rbc3JjXSA9IDE7CisJCWZzci0+cmVnc1tzcmMrK10gPSBvZmZzZXQ7CS8qIFdpbGwgYmUgYWRqdXN0ZWQgbGF0ZXIgKi8KKwkJaWYgKHBpcC0+YWN0aW9uID09IFBJQV9OT1RFX1NURCAmJiBzcmMgPCAzMikKKwkJICB7CisJCSAgICBvZmZzZXQgKz0gNDsKKwkJICAgIG11c3RfYWRqdXN0W3NyY10gPSAxOworCQkgICAgZnNyLT5yZWdzW3NyYysrXSA9IG9mZnNldDsKKwkJICB9CisJICAgIH0KKwkgICAgZWxzZQorCQlnb3RvIGVuZF9vZl9wcm9sb2d1ZV9mb3VuZDsKKwkgICAgYnJlYWs7CisJICBjYXNlIFBJQV9OT1RFX1NQX0FESlVTVE1FTlQ6CisJICAgIGlmIChzcF9vZmZzZXQgPT0gLTEpCisJCXNwX29mZnNldCA9IC1TVUJVX09GRlNFVCAoaW5zbik7CisJICAgIGVsc2UKKwkJZ290byBlbmRfb2ZfcHJvbG9ndWVfZm91bmQ7CisJICAgIGJyZWFrOworCSAgY2FzZSBQSUFfTk9URV9GUF9BU1NJR05NRU5UOgorCSAgICBpZiAoZnBfb2Zmc2V0ID09IC0xKQorCQlmcF9vZmZzZXQgPSBBRERVX09GRlNFVCAoaW5zbik7CisJICAgIGVsc2UKKwkJZ290byBlbmRfb2ZfcHJvbG9ndWVfZm91bmQ7CisJICAgIGJyZWFrOworCSAgY2FzZSBQSUFfTk9URV9QUk9MT0dVRV9FTkQ6CisJICAgIGlmICghcHJvbG9ndWVfZW5kKQorCQlwcm9sb2d1ZV9lbmQgPSBpcDsKKwkgICAgYnJlYWs7CisJICBjYXNlIFBJQV9TS0lQOgorCSAgZGVmYXVsdCA6CisJICAgIC8qIERvIG5vdGhpbmcgKi8KKwkgICAgYnJlYWs7CisJfQorCisgICAgICBpcCA9IG5leHRfaXA7CisgICAgICBuZXh0X2lwID0gTkVYVF9QUk9MT0dVRV9JTlNOIChpcCwgbGltaXQsICZpbnNuKTsKKyAgICB9CisKK2VuZF9vZl9wcm9sb2d1ZV9mb3VuZDoKKworICAgIGlmIChwcm9sb2d1ZV9lbmQpCisJaXAgPSBwcm9sb2d1ZV9lbmQ7CisKKyAgLyogV2UncmUgZG9uZSB3aXRoIHRoZSBwcm9sb2d1ZS4gIElmIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHN0YWNrCisgICAgIGZyYW1lIGl0c2VsZiwganVzdCByZXR1cm4uICAoTm90ZSB0aGF0IGZzci0+cmVncyBoYXMgYmVlbiB0cmFzaGVkLAorICAgICBidXQgdGhlIG9uZSBjYWxsZXIgd2hvIGNhbGxzIHdpdGggZmk9PTAgcGFzc2VzIGEgZHVtbXkgdGhlcmUuKSAgKi8KKworICBpZiAoZmkgPT0gMCkKKyAgICByZXR1cm4gaXA7CisKKyAgLyoKKyAgICAgT0ssIG5vdyB3ZSBoYXZlOgorCisgICAgIAlzcF9vZmZzZXQJb3JpZ2luYWwgKGJlZm9yZSBhbnkgYWxsb2NhIGNhbGxzKSBkaXNwbGFjZW1lbnQgb2YgU1AKKwkJCSh3aWxsIGJlIG5lZ2F0aXZlKS4KKworCWZwX29mZnNldAlkaXNwbGFjZW1lbnQgZnJvbSBvcmlnaW5hbCBTUCB0byB0aGUgRlAgZm9yIHRoaXMgZnJhbWUKKwkJCW9yIC0xLgorCisJZnNyLT5yZWdzWzAuLjMxXQlkaXNwbGFjZW1lbnQgZnJvbSBvcmlnaW5hbCBTUCB0byB0aGUgc3RhY2sKKwkJCQlsb2NhdGlvbiB3aGVyZSByZWdbMC4uMzFdIGlzIHN0b3JlZC4KKworCW11c3RfYWRqdXN0WzAuLjMxXQlzZXQgaWYgY29ycmVzcG9uZGluZyBvZmZzZXQgd2FzIHNldC4KKworICAgICBJZiBhbGxvY2EgaGFzIGJlZW4gY2FsbGVkIGJldHdlZW4gdGhlIGZ1bmN0aW9uIHByb2xvZ3VlIGFuZCB0aGUgY3VycmVudAorICAgICBJUCwgdGhlbiB0aGUgY3VycmVudCBTUCAoZnJhbWVfc3ApIHdpbGwgbm90IGJlIHRoZSBvcmlnaW5hbCBTUCBhcyBzZXQgYnkKKyAgICAgdGhlIGZ1bmN0aW9uIHByb2xvZ3VlLiAgSWYgdGhlIGN1cnJlbnQgU1AgaXMgbm90IHRoZSBvcmlnaW5hbCBTUCwgdGhlbiB0aGUKKyAgICAgY29tcGlsZXIgd2lsbCBoYXZlIGFsbG9jYXRlZCBhbiBGUCBmb3IgdGhpcyBmcmFtZSwgZnBfb2Zmc2V0IHdpbGwgYmUgc2V0LAorICAgICBhbmQgd2UgY2FuIHVzZSBpdCB0byBjYWxjdWxhdGUgdGhlIG9yaWdpbmFsIFNQLgorCisgICAgIFRoZW4sIHdlIGZpZ3VyZSBvdXQgd2hlcmUgdGhlIGFyZ3VtZW50cyBhbmQgbG9jYWxzIGFyZSwgYW5kIHJlbG9jYXRlIHRoZQorICAgICBvZmZzZXRzIGluIGZzci0+cmVncyB0byBhYnNvbHV0ZSBhZGRyZXNzZXMuICAqLworCisgIGlmIChmcF9vZmZzZXQgIT0gLTEpIHsKKyAgICAvKiBXZSBoYXZlIGEgZnJhbWUgcG9pbnRlciwgc28gZ2V0IGl0LCBhbmQgYmFzZSBvdXIgY2FsYydzIG9uIGl0LiAgKi8KKyAgICBmcmFtZV9mcCA9IChDT1JFX0FERFIpIHJlYWRfbmV4dF9mcmFtZV9yZWcgKGZpLT5uZXh0LCBBQ1RVQUxfRlBfUkVHTlVNKTsKKyAgICBmcmFtZV9zcCA9IGZyYW1lX2ZwIC0gZnBfb2Zmc2V0OworICB9IGVsc2UgeworICAgIC8qIFdlIGhhdmUgbm8gZnJhbWUgcG9pbnRlciwgdGhlcmVmb3JlIGZyYW1lX3NwIGlzIHN0aWxsIHRoZSBzYW1lIHZhbHVlCisgICAgICAgYXMgc2V0IGJ5IHByb2xvZ3VlLiAgQnV0IHdoZXJlIGlzIHRoZSBmcmFtZSBpdHNlbGY/ICAqLworICAgIGlmIChtdXN0X2FkanVzdFtTUlBfUkVHTlVNXSkgeworICAgICAgLyogRnVuY3Rpb24gaGVhZGVyIHNhdmVkIFNSUCAocjEpLCB0aGUgcmV0dXJuIGFkZHJlc3MuICBGcmFtZSBzdGFydHMKKwkgNCBieXRlcyBkb3duIGZyb20gd2hlcmUgaXQgd2FzIHNhdmVkLiAgKi8KKyAgICAgIGZyYW1lX2ZwID0gZnJhbWVfc3AgKyBmc3ItPnJlZ3NbU1JQX1JFR05VTV0gLSA0OworICAgICAgZmktPmxvY2Fsc19wb2ludGVyID0gZnJhbWVfZnA7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEZ1bmN0aW9uIGhlYWRlciBkaWRuJ3Qgc2F2ZSBTUlAgKHIxKSwgc28gd2UgYXJlIGluIGEgbGVhZiBmbiBvcgorCSBhcmUgb3RoZXJ3aXNlIGNvbmZ1c2VkLiAgKi8KKyAgICAgIGZyYW1lX2ZwID0gLTE7CisgICAgfQorICB9CisKKyAgLyogVGhlIGxvY2FscyBhcmUgcmVsYXRpdmUgdG8gdGhlIEZQICh3aGV0aGVyIGl0IGV4aXN0cyBhcyBhbiBhbGxvY2F0ZWQKKyAgICAgcmVnaXN0ZXIsIG9yIGp1c3QgYXMgYW4gYXNzdW1lZCBvZmZzZXQgZnJvbSB0aGUgU1ApICovCisgIGZpLT5sb2NhbHNfcG9pbnRlciA9IGZyYW1lX2ZwOworCisgIC8qIFRoZSBhcmd1bWVudHMgYXJlIGp1c3QgYWJvdmUgdGhlIFNQIGFzIGl0IHdhcyBiZWZvcmUgd2UgYWRqdXN0ZWQgaXQKKyAgICAgb24gZW50cnkuICAqLworICBmaS0+YXJnc19wb2ludGVyID0gZnJhbWVfc3AgLSBzcF9vZmZzZXQ7CisKKyAgLyogTm93IHRoYXQgd2Uga25vdyB0aGUgU1AgdmFsdWUgdXNlZCBieSB0aGUgcHJvbG9ndWUsIHdlIGtub3cgd2hlcmUKKyAgICAgaXQgc2F2ZWQgYWxsIHRoZSByZWdpc3RlcnMuICAqLworICBmb3IgKHNyYyA9IDA7IHNyYyA8IDMyOyBzcmMrKykKKyAgICBpZiAobXVzdF9hZGp1c3Rbc3JjXSkKKyAgICAgIGZzci0+cmVnc1tzcmNdICs9IGZyYW1lX3NwOworIAorICAvKiBUaGUgc2F2ZWQgdmFsdWUgb2YgdGhlIFNQIGlzIGFsd2F5cyBrbm93bi4gICovCisgIC8qICh3ZSBob3BlLi4uKSAqLworICBpZiAoZnNyLT5yZWdzW1NQX1JFR05VTV0gIT0gMCAKKyAgICYmIGZzci0+cmVnc1tTUF9SRUdOVU1dICE9IGZyYW1lX3NwIC0gc3Bfb2Zmc2V0KQorICAgIGZwcmludGZfdW5maWx0ZXJlZChnZGJfc3RkZXJyLCAiQmFkIHNhdmVkIFNQIHZhbHVlICV4ICE9ICV4LCBvZmZzZXQgJXghXG4iLAorICAgICAgICBmc3ItPnJlZ3NbU1BfUkVHTlVNXSwKKwlmcmFtZV9zcCAtIHNwX29mZnNldCwgc3Bfb2Zmc2V0KTsKKworICBmc3ItPnJlZ3NbU1BfUkVHTlVNXSA9IGZyYW1lX3NwIC0gc3Bfb2Zmc2V0OworCisgIHJldHVybiAoaXApOworfQorCisvKiBHaXZlbiBhbiBpcCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdGFydCBvZiBhIGZ1bmN0aW9uLAorICAgcmV0dXJuIHRoZSBpcCBvZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gYWZ0ZXIgdGhlIGZ1bmN0aW9uIAorICAgcHJvbG9ndWUuICAqLworCitDT1JFX0FERFIKK3NraXBfcHJvbG9ndWUgKGlwKQorICAgICBDT1JFX0FERFIgKGlwKTsKK3sKKyAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3Mgc2F2ZWRfcmVnc19kdW1teTsKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CisgIENPUkVfQUREUiBsaW1pdDsKKworICBzYWwgPSBmaW5kX3BjX2xpbmUgKGlwLCAwKTsKKyAgbGltaXQgPSAoc2FsLmVuZCkgPyBzYWwuZW5kIDogMHhmZmZmZmZmZjsKKworICByZXR1cm4gKGV4YW1pbmVfcHJvbG9ndWUgKGlwLCBsaW1pdCwgKENPUkVfQUREUikgMCwgJnNhdmVkX3JlZ3NfZHVtbXksCisJCQkgICAgKHN0cnVjdCBmcmFtZV9pbmZvICopMCApKTsKK30KKworLyogUHV0IGhlcmUgdGhlIGNvZGUgdG8gc3RvcmUsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywKKyAgIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4KKyAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbAorICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDoKKyAgIHRoZSBhZGRyZXNzIHdlIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4KKworICAgV2UgY2FjaGUgdGhlIHJlc3VsdCBvZiBkb2luZyB0aGlzIGluIHRoZSBmcmFtZV9vYnN0YWNrLCBzaW5jZSBpdCBpcworICAgZmFpcmx5IGV4cGVuc2l2ZS4gICovCisKK3ZvaWQKK2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyAoZmksIGZzcikKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworICAgICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqZnNyOworeworICByZWdpc3RlciBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqY2FjaGVfZnNyOworICBDT1JFX0FERFIgaXA7CisgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOworICBDT1JFX0FERFIgbGltaXQ7CisKKyAgaWYgKCFmaS0+ZnNyKQorICAgIHsKKyAgICAgIGNhY2hlX2ZzciA9IChzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqKQorCWZyYW1lX29ic3RhY2tfYWxsb2MgKHNpemVvZiAoc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MpKTsKKyAgICAgIG1lbXNldCAoY2FjaGVfZnNyLCAnXDAnLCBzaXplb2YgKHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzKSk7CisgICAgICBmaS0+ZnNyID0gY2FjaGVfZnNyOworCisgICAgICAvKiBGaW5kIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBmdW5jdGlvbiBwcm9sb2d1ZS4gIElmIHRoZSBQQworCSBpcyBpbiB0aGUgZnVuY3Rpb24gcHJvbG9ndWUsIHdlIG9ubHkgY29uc2lkZXIgdGhlIHBhcnQgdGhhdAorCSBoYXMgZXhlY3V0ZWQgYWxyZWFkeS4gIEluIHRoZSBjYXNlIHdoZXJlIHRoZSBQQyBpcyBub3QgaW4KKwkgdGhlIGZ1bmN0aW9uIHByb2xvZ3VlLCB3ZSBzZXQgbGltaXQgdG8gdHdvIGluc3RydWN0aW9ucyBiZXlvbmQKKwkgd2hlcmUgdGhlIHByb2xvZ3VlIGVuZHMgaW4gY2FzZSBpZiBhbnkgb2YgdGhlIHByb2xvZ3VlIGluc3RydWN0aW9ucworCSB3ZXJlIG1vdmVkIGludG8gYSBkZWxheSBzbG90IG9mIGEgYnJhbmNoIGluc3RydWN0aW9uLiAqLworICAgICAgICAgCisgICAgICBpcCA9IGdldF9wY19mdW5jdGlvbl9zdGFydCAoZmktPnBjKTsKKyAgICAgIHNhbCA9IGZpbmRfcGNfbGluZSAoaXAsIDApOworICAgICAgbGltaXQgPSAoc2FsLmVuZCAmJiBzYWwuZW5kIDwgZmktPnBjKSA/IHNhbC5lbmQgKyAyICogQllURVNfUEVSXzg4S19JTlNOIAorCQkJCQkgICAgOiBmaS0+cGM7CisKKyAgICAgIC8qIFRoaXMgd2lsbCBmaWxsIGluIGZpZWxkcyBpbiAqZmkgYXMgd2VsbCBhcyBpbiBjYWNoZV9mc3IuICAqLworI2lmZGVmIFNJR1RSQU1QX0ZSQU1FX0ZJWFVQCisgICAgICBpZiAoZmktPnNpZ25hbF9oYW5kbGVyX2NhbGxlcikKKwlTSUdUUkFNUF9GUkFNRV9GSVhVUChmaS0+ZnJhbWUpOworI2VuZGlmCisgICAgICBleGFtaW5lX3Byb2xvZ3VlIChpcCwgbGltaXQsIGZpLT5mcmFtZSwgY2FjaGVfZnNyLCBmaSk7CisjaWZkZWYgU0lHVFJBTVBfU1BfRklYVVAKKyAgICAgIGlmIChmaS0+c2lnbmFsX2hhbmRsZXJfY2FsbGVyICYmIGZpLT5mc3ItPnJlZ3NbU1BfUkVHTlVNXSkKKwlTSUdUUkFNUF9TUF9GSVhVUChmaS0+ZnNyLT5yZWdzW1NQX1JFR05VTV0pOworI2VuZGlmCisgICAgfQorCisgIGlmIChmc3IpCisgICAgKmZzciA9ICpmaS0+ZnNyOworfQorCisvKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGxvY2FscyBibG9jayBmb3IgdGhlIGZyYW1lCisgICBkZXNjcmliZWQgYnkgRkkuICBSZXR1cm5zIDAgaWYgdGhlIGFkZHJlc3MgaXMgdW5rbm93bi4KKyAgIE5PVEUhICBGcmFtZSBsb2NhbHMgYXJlIHJlZmVycmVkIHRvIGJ5IG5lZ2F0aXZlIG9mZnNldHMgZnJvbSB0aGUKKyAgIGFyZ3VtZW50IHBvaW50ZXIsIHNvIHRoaXMgaXMgdGhlIHNhbWUgYXMgZnJhbWVfYXJnc19hZGRyZXNzKCkuICAqLworCitDT1JFX0FERFIKK2ZyYW1lX2xvY2Fsc19hZGRyZXNzIChmaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworeworICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyBmc3I7CisKKyAgaWYgKGZpLT5hcmdzX3BvaW50ZXIpCS8qIENhY2hlZCB2YWx1ZSBpcyBsaWtlbHkgdGhlcmUuICAqLworICAgIHJldHVybiBmaS0+YXJnc19wb2ludGVyOworCisgIC8qIE5vcGUsIGdlbmVyYXRlIGl0LiAgKi8KKworICBnZXRfZnJhbWVfc2F2ZWRfcmVncyAoZmksICZmc3IpOworCisgIHJldHVybiBmaS0+YXJnc19wb2ludGVyOworfQorCisvKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGFyZ3VtZW50IGJsb2NrIGZvciB0aGUgZnJhbWUKKyAgIGRlc2NyaWJlZCBieSBGSS4gIFJldHVybnMgMCBpZiB0aGUgYWRkcmVzcyBpcyB1bmtub3duLiAgKi8KKworQ09SRV9BRERSCitmcmFtZV9hcmdzX2FkZHJlc3MgKGZpKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7Cit7CisgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzIGZzcjsKKworICBpZiAoZmktPmFyZ3NfcG9pbnRlcikJCS8qIENhY2hlZCB2YWx1ZSBpcyBsaWtlbHkgdGhlcmUuICAqLworICAgIHJldHVybiBmaS0+YXJnc19wb2ludGVyOworCisgIC8qIE5vcGUsIGdlbmVyYXRlIGl0LiAgKi8KKworICBnZXRfZnJhbWVfc2F2ZWRfcmVncyAoZmksICZmc3IpOworCisgIHJldHVybiBmaS0+YXJnc19wb2ludGVyOworfQorCisvKiBSZXR1cm4gdGhlIHNhdmVkIFBDIGZyb20gdGhpcyBmcmFtZS4KKworICAgSWYgdGhlIGZyYW1lIGhhcyBhIG1lbW9yeSBjb3B5IG9mIFNSUF9SRUdOVU0sIHVzZSB0aGF0LiAgSWYgbm90LAorICAganVzdCB1c2UgdGhlIHJlZ2lzdGVyIFNSUF9SRUdOVU0gaXRzZWxmLiAgKi8KKworQ09SRV9BRERSCitmcmFtZV9zYXZlZF9wYyAoZnJhbWUpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgcmV0dXJuIHJlYWRfbmV4dF9mcmFtZV9yZWcoZnJhbWUsIFNSUF9SRUdOVU0pOworfQorCisKKyNkZWZpbmUgRFVNTVlfRlJBTUVfU0laRSAxOTIKKworc3RhdGljIHZvaWQKK3dyaXRlX3dvcmQgKHNwLCB3b3JkKQorICAgICBDT1JFX0FERFIgc3A7CisgICAgIFVMT05HRVNUIHdvcmQ7Cit7CisgIHJlZ2lzdGVyIGludCBsZW4gPSBSRUdJU1RFUl9TSVpFOworICBjaGFyIGJ1ZmZlcltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworCisgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZmZlciwgbGVuLCB3b3JkKTsKKyAgd3JpdGVfbWVtb3J5IChzcCwgYnVmZmVyLCBsZW4pOworfQorCit2b2lkCittODhrX3B1c2hfZHVtbXlfZnJhbWUoKQoreworICByZWdpc3RlciBDT1JFX0FERFIgc3AgPSByZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pOworICByZWdpc3RlciBpbnQgcm47CisgIGludCBvZmZzZXQ7CisKKyAgc3AgLT0gRFVNTVlfRlJBTUVfU0laRTsJLyogYWxsb2NhdGUgYSBidW5jaCBvZiBzcGFjZSAqLworCisgIGZvciAocm4gPSAwLCBvZmZzZXQgPSAwOyBybiA8PSBTUF9SRUdOVU07IHJuKyssIG9mZnNldCs9NCkKKyAgICB3cml0ZV93b3JkIChzcCtvZmZzZXQsIHJlYWRfcmVnaXN0ZXIocm4pKTsKKyAgCisgIHdyaXRlX3dvcmQgKHNwK29mZnNldCwgcmVhZF9yZWdpc3RlciAoU1hJUF9SRUdOVU0pKTsKKyAgb2Zmc2V0ICs9IDQ7CisKKyAgd3JpdGVfd29yZCAoc3Arb2Zmc2V0LCByZWFkX3JlZ2lzdGVyIChTTklQX1JFR05VTSkpOworICBvZmZzZXQgKz0gNDsKKworICB3cml0ZV93b3JkIChzcCtvZmZzZXQsIHJlYWRfcmVnaXN0ZXIgKFNGSVBfUkVHTlVNKSk7CisgIG9mZnNldCArPSA0OworCisgIHdyaXRlX3dvcmQgKHNwK29mZnNldCwgcmVhZF9yZWdpc3RlciAoUFNSX1JFR05VTSkpOworICBvZmZzZXQgKz0gNDsKKworICB3cml0ZV93b3JkIChzcCtvZmZzZXQsIHJlYWRfcmVnaXN0ZXIgKEZQU1JfUkVHTlVNKSk7CisgIG9mZnNldCArPSA0OworCisgIHdyaXRlX3dvcmQgKHNwK29mZnNldCwgcmVhZF9yZWdpc3RlciAoRlBDUl9SRUdOVU0pKTsKKyAgb2Zmc2V0ICs9IDQ7CisKKyAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgc3ApOworICB3cml0ZV9yZWdpc3RlciAoQUNUVUFMX0ZQX1JFR05VTSwgc3ApOworfQorCit2b2lkCitwb3BfZnJhbWUgKCkKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lID0gZ2V0X2N1cnJlbnRfZnJhbWUgKCk7CisgIHJlZ2lzdGVyIENPUkVfQUREUiBmcDsKKyAgcmVnaXN0ZXIgaW50IHJlZ251bTsKKyAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgZnNyOworCisgIGZwID0gRlJBTUVfRlAgKGZyYW1lKTsKKyAgZ2V0X2ZyYW1lX3NhdmVkX3JlZ3MgKGZyYW1lLCAmZnNyKTsKKworICBpZiAoUENfSU5fQ0FMTF9EVU1NWSAocmVhZF9wYyAoKSwgcmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKSwgRlJBTUVfRlAgKGZpKSkpCisgICAgeworICAgICAgLyogRklYTUU6IEkgdGhpbmsgZ2V0X2ZyYW1lX3NhdmVkX3JlZ3Mgc2hvdWxkIGJlIGhhbmRsaW5nIHRoaXMgc28KKwkgdGhhdCB3ZSBjYW4gZGVhbCB3aXRoIHRoZSBzYXZlZCByZWdpc3RlcnMgcHJvcGVybHkgKGUuZy4gZnJhbWUKKwkgMSBpcyBhIGNhbGwgZHVtbXksIHRoZSB1c2VyIHR5cGVzICJmcmFtZSAyIiBhbmQgdGhlbiAicHJpbnQgJHBzIikuICAqLworICAgICAgcmVnaXN0ZXIgQ09SRV9BRERSIHNwID0gcmVhZF9yZWdpc3RlciAoQUNUVUFMX0ZQX1JFR05VTSk7CisgICAgICBpbnQgb2Zmc2V0OworCisgICAgICBmb3IgKHJlZ251bSA9IDAsIG9mZnNldCA9IDA7IHJlZ251bSA8PSBTUF9SRUdOVU07IHJlZ251bSsrLCBvZmZzZXQrPTQpCisJKHZvaWQpIHdyaXRlX3JlZ2lzdGVyIChyZWdudW0sIHJlYWRfbWVtb3J5X2ludGVnZXIgKHNwK29mZnNldCwgNCkpOworICAKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChTWElQX1JFR05VTSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoc3Arb2Zmc2V0LCA0KSk7CisgICAgICBvZmZzZXQgKz0gNDsKKworICAgICAgd3JpdGVfcmVnaXN0ZXIgKFNOSVBfUkVHTlVNLCByZWFkX21lbW9yeV9pbnRlZ2VyIChzcCtvZmZzZXQsIDQpKTsKKyAgICAgIG9mZnNldCArPSA0OworCisgICAgICB3cml0ZV9yZWdpc3RlciAoU0ZJUF9SRUdOVU0sIHJlYWRfbWVtb3J5X2ludGVnZXIgKHNwK29mZnNldCwgNCkpOworICAgICAgb2Zmc2V0ICs9IDQ7CisKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChQU1JfUkVHTlVNLCByZWFkX21lbW9yeV9pbnRlZ2VyIChzcCtvZmZzZXQsIDQpKTsKKyAgICAgIG9mZnNldCArPSA0OworCisgICAgICB3cml0ZV9yZWdpc3RlciAoRlBTUl9SRUdOVU0sIHJlYWRfbWVtb3J5X2ludGVnZXIgKHNwK29mZnNldCwgNCkpOworICAgICAgb2Zmc2V0ICs9IDQ7CisKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChGUENSX1JFR05VTSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoc3Arb2Zmc2V0LCA0KSk7CisgICAgICBvZmZzZXQgKz0gNDsKKworICAgIH0KKyAgZWxzZSAKKyAgICB7CisgICAgICBmb3IgKHJlZ251bSA9IEZQX1JFR05VTSA7IHJlZ251bSA+IDAgOyByZWdudW0tLSkKKwkgIGlmIChmc3IucmVnc1tyZWdudW1dKQorCSAgICAgIHdyaXRlX3JlZ2lzdGVyIChyZWdudW0sCisJCQkgICAgICByZWFkX21lbW9yeV9pbnRlZ2VyIChmc3IucmVnc1tyZWdudW1dLCA0KSk7CisgICAgICB3cml0ZV9wYyAoZnJhbWVfc2F2ZWRfcGMgKGZyYW1lKSk7CisgICAgfQorICByZWluaXRfZnJhbWVfY2FjaGUgKCk7Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX204OGtfdGRlcCAoKQoreworICB0bV9wcmludF9pbnNuID0gcHJpbnRfaW5zbl9tODhrOworfQpkaWZmIC0tZ2l0IGEvZ2RiL21hYy1kZWZzLmggYi9nZGIvbWFjLWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmY3ZTcxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL21hYy1kZWZzLmgKQEAgLTAsMCArMSwzNCBAQAorLyogRGVmaW5pdGlvbnMgc2hhcmVkIGJldHdlZW4gQyBhbmQgUmV6IGZpbGVzLiAqLworCisjZGVmaW5lIG1iTWFpbiAxMjgKKworI2RlZmluZSBtQXBwbGUgMTI4CisKKyNkZWZpbmUgbWlBYm91dCAxCisKKyNkZWZpbmUgbUZpbGUgMTI5CisKKyNkZWZpbmUgbWlGaWxlTmV3IDEKKyNkZWZpbmUgbWlGaWxlT3BlbiAyCisvKiAzICovCisjZGVmaW5lIG1pRmlsZVF1aXQgNAorCisjZGVmaW5lIG1FZGl0IDEzMAorCisjZGVmaW5lIG1pRWRpdEN1dCAxCisjZGVmaW5lIG1pRWRpdENvcHkgMgorI2RlZmluZSBtaUVkaXRQYXN0ZSAzCisjZGVmaW5lIG1pRWRpdENsZWFyIDQKKworI2RlZmluZSBtRGVidWcgMTMxCisKKyNkZWZpbmUgbWlEZWJ1Z1RhcmdldCAxCisvKiAyICovCisjZGVmaW5lIG1pRGVidWdSdW4gMworI2RlZmluZSBtaURlYnVnQ29udGludWUgNAorI2RlZmluZSBtaURlYnVnU3RlcCA1CisjZGVmaW5lIG1pRGVidWdOZXh0IDYKKworI2RlZmluZSB3Q29uc29sZSAxMjgKKworCmRpZmYgLS1naXQgYS9nZGIvbWFjLWdkYi5yIGIvZ2RiL21hYy1nZGIucgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzM2ZGRlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL21hYy1nZGIucgpAQCAtMCwwICsxLDE4NCBAQAorLyogUmVzb3VyY2UgZmlsZSBmb3IgTWFjR0RCLiAqLworCisjaW5jbHVkZSAiU3lzVHlwZXMuciIKKyNpbmNsdWRlICJUeXBlcy5yIgorCisjaW5jbHVkZSAibWFjLWRlZnMuaCIKKworLyogVmVyc2lvbiByZXNvdXJjZXMuICovCisKK3Jlc291cmNlICd2ZXJzJyAoMSkgeworCTAsCisJMCwKKwkwLAorCTAsCisJdmVyVVMsCisJVkVSU0lPTl9TVFJJTkcsCisJVkVSU0lPTl9TVFJJTkcgICIgKEMpIDE5ODYtOTUgRlNGLCBJbmMuIgorfTsKKworcmVzb3VyY2UgJ3ZlcnMnICgyLCBwdXJnZWFibGUpICB7CisJMCwKKwkwLAorCTAsCisJMCwKKwl2ZXJVcywKKwlWRVJTSU9OX1NUUklORywKKwkiR0RCICIgVkVSU0lPTl9TVFJJTkcgIiBmb3IgTVBXIgorfTsKKworI2lmZGVmIFdBTlRfQ0ZSRworCisjaW5jbHVkZSAiQ29kZUZyYWdtZW50VHlwZXMuciIKKworcmVzb3VyY2UgJ2NmcmcnICgwKSB7CisJeworCQlrUG93ZXJQQywKKwkJa0Z1bGxMaWIsCisJCWtOb1ZlcnNpb25OdW0sIGtOb1ZlcnNpb25OdW0sCisJCTAsIDAsCisJCWtJc0FwcCwga09uRGlza0ZsYXQsIGtaZXJvT2Zmc2V0LCBrV2hvbGVGb3JrLAorCQlQUk9HX05BTUUKKwl9Cit9OworCisjZW5kaWYgLyogV0FOVF9DRlJHICovCisKKyNpZmRlZiBNYWNnZGIgLyogRXhjbHVkZSB0aGUgZm9sbG93aW5nIGZyb20gU0lPV2dkYiB3aGljaCB1c2VzIFNJT1cuci4gICovCisKK3Jlc291cmNlICdNQkFSJyAoMTI4KSB7CisJeyBtQXBwbGUsIG1GaWxlLCBtRWRpdCwgbURlYnVnIH07Cit9OworCityZXNvdXJjZSAnTUVOVScgKG1BcHBsZSwgcHJlbG9hZCkgeworCW1BcHBsZSwKKwl0ZXh0TWVudVByb2MsCisJMHg3RkZGRkZGRCwKKwllbmFibGVkLAorCWFwcGxlLAorCXsKKwkJIkFib3V0Li4uIiwgbm9JY29uLCBub0tleSwgbm9NYXJrLCBwbGFpbiwKKwkJIi0iLCBub0ljb24sIG5vS2V5LCBub01hcmssIHBsYWluCisJfQorfTsKKworcmVzb3VyY2UgJ01FTlUnIChtRmlsZSwgcHJlbG9hZCkgeworCW1GaWxlLAorCXRleHRNZW51UHJvYywKKwlhbGxFbmFibGVkLAorCWVuYWJsZWQsCisJIkZpbGUiLAorCXsKKwkJIk5ldyIsIG5vSWNvbiwgbm9LZXksIG5vTWFyaywgcGxhaW4sCisJCSJPcGVuLi4uIiwgbm9JY29uLCAiTyIsIG5vTWFyaywgcGxhaW4sCisJCSItIiwgbm9JY29uLCBub0tleSwgbm9NYXJrLCBwbGFpbiwKKwkJIlF1aXQiLCBub0ljb24sICJRIiwgbm9NYXJrLCBwbGFpbgorCX0KK307CisKK3Jlc291cmNlICdNRU5VJyAobUVkaXQsIHByZWxvYWQpIHsKKwltRWRpdCwKKwl0ZXh0TWVudVByb2MsCisJYWxsRW5hYmxlZCwKKwllbmFibGVkLAorCSJFZGl0IiwKKwl7CisJCSJVbmRvIiwgbm9JY29uLCAiWiIsIG5vTWFyaywgcGxhaW4sCisJCSItIiwgbm9JY29uLCBub0tleSwgbm9NYXJrLCBwbGFpbiwKKwkJIkN1dCIsIG5vSWNvbiwgIlgiLCBub01hcmssIHBsYWluLAorCQkiQ29weSIsIG5vSWNvbiwgIkMiLCBub01hcmssIHBsYWluLAorCQkiUGFzdGUiLCBub0ljb24sICJWIiwgbm9NYXJrLCBwbGFpbiwKKwkJIkNsZWFyIiwgbm9JY29uLCBub0tleSwgbm9NYXJrLCBwbGFpbgorCX0KK307CisKK3Jlc291cmNlICdNRU5VJyAobURlYnVnLCBwcmVsb2FkKSB7CisJbURlYnVnLAorCXRleHRNZW51UHJvYywKKwlhbGxFbmFibGVkLAorCWVuYWJsZWQsCisJIkRlYnVnIiwKKwl7CisJCSJUYXJnZXQiLCBub0ljb24sICJUIiwgbm9NYXJrLCBwbGFpbiwKKwkJIi0iLCBub0ljb24sIG5vS2V5LCBub01hcmssIHBsYWluLAorCQkiUnVuIiwgbm9JY29uLCAiUiIsIG5vTWFyaywgcGxhaW4sCisJCSJDb250aW51ZSIsIG5vSWNvbiwgIksiLCBub01hcmssIHBsYWluLAorCQkiU3RlcCIsIG5vSWNvbiwgIlMiLCBub01hcmssIHBsYWluLAorCQkiTmV4dCIsIG5vSWNvbiwgIk4iLCBub01hcmssIHBsYWluCisJfQorfTsKKworcmVzb3VyY2UgJ0FMUlQnICgxMjgpIHsKKwl7NDAsIDQwLCAxODAsIDQyMH0sCisJMTI4LAorCXsJLyogYXJyYXk6IDQgZWxlbWVudHMgKi8KKwkJLyogWzFdICovCisJCU9LLCB2aXNpYmxlLCBzb3VuZDEsCisJCS8qIFsyXSAqLworCQlPSywgdmlzaWJsZSwgc291bmQxLAorCQkvKiBbM10gKi8KKwkJT0ssIHZpc2libGUsIHNvdW5kMSwKKwkJLyogWzRdICovCisJCU9LLCB2aXNpYmxlLCBzb3VuZDEKKwl9Cit9OworCityZXNvdXJjZSAnRElUTCcgKDEyOCkgeworCXsJLyogYXJyYXkgRElUTGFycmF5OiAyIGVsZW1lbnRzICovCisJCS8qIFsxXSAqLworCQl7MTEwLCAxNTAsIDEyOCwgMjAwfSwKKwkJQnV0dG9uIHsKKwkJCWVuYWJsZWQsCisJCQkiT0siCisJCX0sCisJCS8qIFsyXSAqLworCQl7MTAsIDEwLCAxMDAsIDM3MH0sCisJCVN0YXRpY1RleHQgeworCQkJZGlzYWJsZWQsCisJCQkiR0RCIDQuMTIuM1xuIgorCQkJIkNvcHlyaWdodCCpICAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIgorCQl9LAorCX0KK307CisKK3Jlc291cmNlICdXSU5EJyAod0NvbnNvbGUsIHByZWxvYWQsIHB1cmdlYWJsZSkgeworCXs0MCwgNDAsIDMxMCwgNTcyfSwKKwl6b29tRG9jUHJvYywKKwl2aXNpYmxlLAorCWdvQXdheSwKKwkweDAsCisJIkdEQiBDb25zb2xlIgorfTsKKworcmVzb3VyY2UgJ1NJWkUnICgtMSkgeworCXJlc2VydmVkLAorCWFjY2VwdFN1c3BlbmRSZXN1bWVFdmVudHMsCisJcmVzZXJ2ZWQsCisJY2FuQmFja2dyb3VuZCwKKwltdWx0aUZpbmRlckF3YXJlLAorCWJhY2tncm91bmRBbmRGb3JlZ3JvdW5kLAorCWRvbnRHZXRGcm9udENsaWNrcywKKwlpZ25vcmVDaGlsZERpZWRFdmVudHMsCisJbm90MzJCaXRDb21wYXRpYmxlLAorCWlzSGlnaExldmVsRXZlbnRBd2FyZSwKKwlsb2NhbEFuZFJlbW90ZUhMRXZlbnRzLAorCW5vdFN0YXRpb25lcnlBd2FyZSwKKwlkb250VXNlVGV4dEVkaXRTZXJ2aWNlcywKKwlyZXNlcnZlZCwKKwlyZXNlcnZlZCwKKwlyZXNlcnZlZCwKKwk1MDAwKjEwMjQsCisJMjAwMCoxMDI0Cit9OworCityZXNvdXJjZSAnRExPRycgKDEyOCkgeworCXs0MCwgNDAsIDI0MCwgMjgwfSwKKwlkb2N1bWVudFByb2MsCisJdmlzaWJsZSwKKwlnb0F3YXksCisJMHgwLAorCTEyOCwKKwkiIgorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvbWFjLW5hdC5jIGIvZ2RiL21hYy1uYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTE4ZmU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL21hYy1uYXQuYwpAQCAtMCwwICsxLDQxMiBAQAorLyogVGFyZ2V0LXZlY3RvciBvcGVyYXRpb25zIGZvciBjb250cm9sbGluZyBNYWMgYXBwbGljYXRpb25zLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBTdGFuIFNoZWJzLiAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlIG50aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogTm90ZSB0aGF0IGJlY2F1c2UgYWxsIHRoZSBhdmFpbGFibGUgTWFjIGNvbXBpbGVycyBhcmUgQU5TSSBvciB2ZXJ5CisgICBjbG9zZSwgYW5kIHRoaXMgaXMgYSBuYXRpdmUtb25seSBmaWxlLCB0aGUgY29kZSBtYXkgYmUgcHVyZWx5IEFOU0kuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiCQkvKiByZXF1aXJlZCBieSBpbmZlcmlvci5oICovCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJ3YWl0LmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgImJ1aWxkc3ltLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImdkYnRocmVhZC5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorCisjaW5jbHVkZSA8UHJvY2Vzc2VzLmg+CisKKy8qIFdlIGNhbGwgdGhlIGZ1bmN0aW9ucyAiY2hpbGRfLi4uIiByYXRoZXIgdGhhbiAibWFjXy4uLiIgc28gbm8gb25lCisgICBpcyB0ZW1wdGVkIHRvIHRyeSB0byBsaW5rIHRoaXMgd2l0aCBvdGhlciBuYXRpdmUtb25seSBjb2RlLiAgKi8KKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworCitleHRlcm4gc3RydWN0IHRhcmdldF9vcHMgY2hpbGRfb3BzOworCitzdGF0aWMgdm9pZCBjaGlsZF9zdG9wIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQKK2NoaWxkX2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoaW50IHIpCit7CisgIGlmIChyIDwgMCkKKyAgICB7CisgICAgICBmb3IgKHIgPSAwOyByIDwgTlVNX1JFR1M7IHIrKykKKwljaGlsZF9mZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN1cHBseV9yZWdpc3RlciAociwgMCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorY2hpbGRfc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChpbnQgcikKK3sKKyAgaWYgKHIgPCAwKQorICAgIHsKKyAgICAgIGZvciAociA9IDA7IHIgPCBOVU1fUkVHUzsgcisrKQorCWNoaWxkX3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAocik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVhZF9yZWdpc3Rlcl9nZW4gKHIsIDApOworICAgIH0KK30KKworc3RhdGljIGludAorY2hpbGRfd2FpdCAoaW50IHBpZCwgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpvdXJzdGF0dXMpCit7Cit9CisKKy8qIEF0dGFjaCB0byBwcm9jZXNzIFBJRCwgdGhlbiBpbml0aWFsaXplIGZvciBkZWJ1Z2dpbmcgaXQuICAqLworCitzdGF0aWMgdm9pZAorY2hpbGRfYXR0YWNoIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBQcm9jZXNzU2VyaWFsTnVtYmVyIHBzbjsKKyAgUHJvY2Vzc0luZm9SZWMgaW5mb3JlYzsKKyAgU3RyMzEgbmFtZTsKKyAgRlNTcGVjUHRyIGZzc3BlYzsKKyAgT1NUeXBlIGNvZGU7CisgIGludCBwaWQ7CisgIGNoYXIgKmV4ZWNfZmlsZTsKKworICBpZiAoIWFyZ3MpCisgICAgZXJyb3Jfbm9fYXJnICgicHJvY2Vzcy1pZCB0byBhdHRhY2giKTsKKworICBwaWQgPSBhdG9pIChhcmdzKTsKKworICBwc24uaGlnaExvbmdPZlBTTiA9IDA7CisgIHBzbi5sb3dMb25nT2ZQU04gPSBwaWQ7CisKKyAgaW5mb3JlYy5wcm9jZXNzSW5mb0xlbmd0aCA9IHNpemVvZihQcm9jZXNzSW5mb1JlYyk7CisgIGluZm9yZWMucHJvY2Vzc05hbWUgPSBuYW1lOworICBpbmZvcmVjLnByb2Nlc3NBcHBTcGVjID0gZnNzcGVjOworCisgIGlmIChHZXRQcm9jZXNzSW5mb3JtYXRpb24gKCZwc24sICZpbmZvcmVjKSA9PSBub0VycikKKyAgICB7CisgICAgICBpZiAoZnJvbV90dHkpCisJeworCSAgZXhlY19maWxlID0gKGNoYXIgKikgZ2V0X2V4ZWNfZmlsZSAoMCk7CisKKwkgIGlmIChleGVjX2ZpbGUpCisJICAgIHByaW50Zl91bmZpbHRlcmVkICgiQXR0YWNoaW5nIHRvIHByb2dyYW0gYCVzJywgJXNcbiIsIGV4ZWNfZmlsZSwKKwkJCSAgICAgICB0YXJnZXRfcGlkX3RvX3N0ciAocGlkKSk7CisJICBlbHNlCisJICAgIHByaW50Zl91bmZpbHRlcmVkICgiQXR0YWNoaW5nIHRvICVzXG4iLCB0YXJnZXRfcGlkX3RvX3N0ciAocGlkKSk7CisKKwkgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisJfQorICAgICAgLyogRG8gd2UgbmVlZCB0byBkbyBhbnl0aGluZyBzcGVjaWFsPyAqLworICAgICAgYXR0YWNoX2ZsYWcgPSAxOworICAgICAgaW5mZXJpb3JfcGlkID0gcGlkOworICAgICAgcHVzaF90YXJnZXQgKCZjaGlsZF9vcHMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NoaWxkX2RldGFjaCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgY2hhciAqZXhlY19maWxlOworCisgIGlmIChmcm9tX3R0eSkKKyAgICB7CisgICAgICBleGVjX2ZpbGUgPSBnZXRfZXhlY19maWxlICgwKTsKKyAgICAgIGlmIChleGVjX2ZpbGUgPT0gMCkKKwlleGVjX2ZpbGUgPSAiIjsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiRGV0YWNoaW5nIGZyb20gcHJvZ3JhbTogJXMgJXNcbiIsIGV4ZWNfZmlsZSwKKwkJCSB0YXJnZXRfcGlkX3RvX3N0ciAoaW5mZXJpb3JfcGlkKSk7CisgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworICAgIH0KKyAgaW5mZXJpb3JfcGlkID0gMDsKKyAgdW5wdXNoX3RhcmdldCAoJmNoaWxkX29wcyk7Cit9CisKKy8qIFByaW50IHN0YXR1cyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHdlJ3JlIGFjY2Vzc2luZy4gICovCisKK3N0YXRpYyB2b2lkCitjaGlsZF9maWxlc19pbmZvIChpZ25vcmUpCisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICppZ25vcmU7Cit7CisgIHByaW50Zl91bmZpbHRlcmVkICgiXHRVc2luZyB0aGUgcnVubmluZyBpbWFnZSBvZiAlcyAlcy5cbiIsCisgICAgICBhdHRhY2hfZmxhZyA/ICJhdHRhY2hlZCIgOiAiY2hpbGQiLCB0YXJnZXRfcGlkX3RvX3N0ciAoaW5mZXJpb3JfcGlkKSk7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorY2hpbGRfb3BlbiAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGVycm9yICgiVXNlIHRoZSBcInJ1blwiIGNvbW1hbmQgdG8gc3RhcnQgYSBNYWMgYXBwbGljYXRpb24uIik7Cit9CisKKy8qIFN0YXJ0IGFuIGluZmVyaW9yIE1hYyBwcm9ncmFtIGFuZCBzZXRzIGluZmVyaW9yX3BpZCB0byBpdHMgcGlkLgorICAgRVhFQ19GSUxFIGlzIHRoZSBmaWxlIHRvIHJ1bi4KKyAgIEFMTEFSR1MgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgYXJndW1lbnRzIHRvIHRoZSBwcm9ncmFtLgorICAgRU5WIGlzIHRoZSBlbnZpcm9ubWVudCB2ZWN0b3IgdG8gcGFzcy4gIEVycm9ycyByZXBvcnRlZCB3aXRoIGVycm9yKCkuICAqLworCitzdGF0aWMgdm9pZAorY2hpbGRfY3JlYXRlX2luZmVyaW9yIChleGVjX2ZpbGUsIGFsbGFyZ3MsIGVudikKKyAgICAgY2hhciAqZXhlY19maWxlOworICAgICBjaGFyICphbGxhcmdzOworICAgICBjaGFyICoqZW52OworeworICBMYXVuY2hQYXJhbUJsb2NrUmVjIGxhdW5jaHBhcm1zOworICBGU1NwZWMgZnNzcGVjOworICBPU0VyciBsYXVuY2hfZXJyOworCisgIGlmICghZXhlY19maWxlKQorICAgIHsKKyAgICAgIGVycm9yICgiTm8gZXhlY3V0YWJsZSBzcGVjaWZpZWQsIHVzZSBgdGFyZ2V0IGV4ZWMnLlxuIik7CisgICAgfQorCisgIGxhdW5jaHBhcm1zLmxhdW5jaEJsb2NrSUQgPSBleHRlbmRlZEJsb2NrOworICBsYXVuY2hwYXJtcy5sYXVuY2hFUEJMZW5ndGggPSBleHRlbmRlZEJsb2NrTGVuOworICBsYXVuY2hwYXJtcy5sYXVuY2hGaWxlRmxhZ3MgPSAwOworICBsYXVuY2hwYXJtcy5sYXVuY2hDb250cm9sRmxhZ3MgPSBsYXVuY2hDb250aW51ZSB8IGxhdW5jaE5vRmlsZUZsYWdzOworICBmc3NwZWMudlJlZk51bSA9IDA7CisgIGZzc3BlYy5wYXJJRCA9IDA7CisgIHN0cmNweShmc3NwZWMubmFtZSArIDEsIGV4ZWNfZmlsZSk7CisgIGZzc3BlYy5uYW1lWzBdID0gc3RybGVuKGV4ZWNfZmlsZSk7CisgIGxhdW5jaHBhcm1zLmxhdW5jaEFwcFNwZWMgPSAmZnNzcGVjOworICBsYXVuY2hwYXJtcy5sYXVuY2hBcHBQYXJhbWV0ZXJzID0gbmlsOworCisgIGxhdW5jaF9lcnIgPSBMYXVuY2hBcHBsaWNhdGlvbiAoJmxhdW5jaHBhcm1zKTsKKworICBpZiAobGF1bmNoX2VyciA9PSA5OTkgLyptZW1GdWxsRXJyKi8pCisgICAgeworICAgICAgZXJyb3IgKCJOb3QgZW5vdWdoIG1lbW9yeSB0byBsYXVuY2ggJXNcbiIsIGV4ZWNfZmlsZSk7CisgICAgfQorICBlbHNlIGlmIChsYXVuY2hfZXJyICE9IG5vRXJyKQorICAgIHsKKyAgICAgIGVycm9yICgiRXJyb3IgbGF1bmNoaW5nICVzLCBjb2RlICVkXG4iLCBleGVjX2ZpbGUsIGxhdW5jaF9lcnIpOworICAgIH0KKworICBpbmZlcmlvcl9waWQgPSBsYXVuY2hwYXJtcy5sYXVuY2hQcm9jZXNzU04ubG93TG9uZ09mUFNOOworICAvKiBGSVhNRSBiZSBzdXJlIHRoYXQgaGlnaCBsb25nIG9mIFBTTiBpcyAwICovCisKKyAgcHVzaF90YXJnZXQgKCZjaGlsZF9vcHMpOworICBpbml0X3dhaXRfZm9yX2luZmVyaW9yICgpOworICBjbGVhcl9wcm9jZWVkX3N0YXR1cyAoKTsKKworLyogIHByb2NlZWQgKChDT1JFX0FERFIpIC0gMSwgVEFSR0VUX1NJR05BTF8wLCAwKTsgICovCit9CisKK3N0YXRpYyB2b2lkCitjaGlsZF9tb3Vybl9pbmZlcmlvciAoKQoreworICB1bnB1c2hfdGFyZ2V0ICgmY2hpbGRfb3BzKTsKKyAgZ2VuZXJpY19tb3Vybl9pbmZlcmlvciAoKTsKK30KKworc3RhdGljIHZvaWQKK2NoaWxkX3N0b3AgKCkKK3sKK30KKworaW50CitjaGlsZF94ZmVyX21lbW9yeSAoQ09SRV9BRERSIG1lbWFkZHIsIGNoYXIgKm15YWRkciwgaW50IGxlbiwKKwkJIGludCB3cml0ZSwgc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldCkKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQorICAgIHsKKyAgICAgIGlmICh3cml0ZSkKKwl7CisJICAoKGNoYXIgKikgbWVtYWRkcilbaV0gPSBteWFkZHJbaV07CisJfQorICAgICAgZWxzZQorCXsKKwkgIG15YWRkcltpXSA9ICgoY2hhciAqKSBtZW1hZGRyKVtpXTsKKwl9CisgICAgfQorICByZXR1cm4gbGVuOworfQorCit2b2lkCitjaGlsZF9raWxsX2luZmVyaW9yICh2b2lkKQoreworfQorCit2b2lkCitjaGlsZF9yZXN1bWUgKGludCBwaWQsIGludCBzdGVwLCBlbnVtIHRhcmdldF9zaWduYWwgc2lnbmFsKQoreworfQorCitzdGF0aWMgdm9pZAorY2hpbGRfcHJlcGFyZV90b19zdG9yZSAoKQoreworICAvKiBEbyBub3RoaW5nLCBzaW5jZSB3ZSBjYW4gc3RvcmUgaW5kaXZpZHVhbCByZWdzICovCit9CisKK3N0YXRpYyBpbnQKK2NoaWxkX2Nhbl9ydW4gKCkKK3sKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitjaGlsZF9jbG9zZSAoKQoreworfQorCitzdGF0aWMgdm9pZAoraW5mb19wcm9jIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBQcm9jZXNzU2VyaWFsTnVtYmVyIHBzbjsKKyAgUHJvY2Vzc0luZm9SZWMgaW5mb3JlYzsKKyAgU3RyMzEgbmFtZTsKKyAgRlNTcGVjUHRyIGZzc3BlYzsKKyAgT1NUeXBlIGNvZGU7CisKKyAgLyogRXZlbnR1YWxseSB1c2UgYXJncywgYnV0IG5vdCByaWdodCBub3cuICovCisKKyAgcHNuLmhpZ2hMb25nT2ZQU04gPSAwOworICBwc24ubG93TG9uZ09mUFNOID0ga05vUHJvY2VzczsKKworICBpbmZvcmVjLnByb2Nlc3NJbmZvTGVuZ3RoID0gc2l6ZW9mKFByb2Nlc3NJbmZvUmVjKTsKKyAgaW5mb3JlYy5wcm9jZXNzTmFtZSA9IG5hbWU7CisgIGluZm9yZWMucHJvY2Vzc0FwcFNwZWMgPSBmc3NwZWM7CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiUHJvY2VzcyBOYW1lICAgICAgICAgICAgICAgICAgICAgU2dudCBUeXBlICAgIFBTTiAgIExvYyBTaXplIEZyZWVNZW0gVGltZVxuIik7CisKKyAgd2hpbGUgKEdldE5leHRQcm9jZXNzICgmcHNuKSA9PSBub0VycikKKyAgICB7CisgICAgICBpZiAoR2V0UHJvY2Vzc0luZm9ybWF0aW9uICgmcHNuLCAmaW5mb3JlYykgPT0gbm9FcnIpCisJeworCSAgbmFtZVtuYW1lWzBdICsgMV0gPSAnXDAnOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiJS0zMi4zMnMiLCBuYW1lICsgMSk7CisJICBjb2RlID0gaW5mb3JlYy5wcm9jZXNzU2lnbmF0dXJlOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiICVjJWMlYyVjIiwKKwkJCSAgIChjb2RlID4+IDI0KSAmIDB4ZmYsCisJCQkgICAoY29kZSA+PiAxNikgJiAweGZmLAorCQkJICAgKGNvZGUgPj4gIDgpICYgMHhmZiwKKwkJCSAgIChjb2RlID4+ICAwKSAmIDB4ZmYpOworCSAgY29kZSA9IGluZm9yZWMucHJvY2Vzc1R5cGU7CisJICBwcmludGZfZmlsdGVyZWQgKCIgJWMlYyVjJWMiLAorCQkJICAgKGNvZGUgPj4gMjQpICYgMHhmZiwKKwkJCSAgIChjb2RlID4+IDE2KSAmIDB4ZmYsCisJCQkgICAoY29kZSA+PiAgOCkgJiAweGZmLAorCQkJICAgKGNvZGUgPj4gIDApICYgMHhmZik7CisJICBpZiAocHNuLmhpZ2hMb25nT2ZQU04gPT0gMCkKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgiICU5ZCIsIHBzbi5sb3dMb25nT2ZQU04pOworCSAgZWxzZQorCSAgICBwcmludGZfZmlsdGVyZWQgKCIgJTlkLCU5ZFxuIiwKKwkJCSAgICAgcHNuLmhpZ2hMb25nT2ZQU04sIHBzbi5sb3dMb25nT2ZQU04pOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiIDB4JXgiLCBpbmZvcmVjLnByb2Nlc3NMb2NhdGlvbik7CisJICBwcmludGZfZmlsdGVyZWQgKCIgJTlkIiwgaW5mb3JlYy5wcm9jZXNzU2l6ZSk7CisJICBwcmludGZfZmlsdGVyZWQgKCIgJTlkIiwgaW5mb3JlYy5wcm9jZXNzRnJlZU1lbSk7CisJICBwcmludGZfZmlsdGVyZWQgKCIgJTlkIiwgaW5mb3JlYy5wcm9jZXNzQWN0aXZlVGltZSk7CisJICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworCX0KKyAgICB9Cit9CisKK3N0cnVjdCB0YXJnZXRfb3BzIGNoaWxkX29wcyA7CisKK3N0YXRpYyB2b2lkIAoraW5pdF9jaGlsZF9vcHModm9pZCkKK3sKKyAgY2hpbGRfb3BzLnRvX3Nob3J0bmFtZSA9ICAgIm1hYyI7CQkKKyAgY2hpbGRfb3BzLnRvX2xvbmduYW1lID0gICAiTWFjT1MgYXBwbGljYXRpb24iOworICBjaGlsZF9vcHMudG9fZG9jICAgID0gICJNYWNPUyBhcHBsaWNhdGlvbiAoc3RhcnRlZCBieSB0aGUgXCJydW5cIiBjb21tYW5kKS4iOworICBjaGlsZF9vcHMudG9fb3BlbiAgID0gIGNoaWxkX29wZW47IAorICBjaGlsZF9vcHMudG9fY2xvc2UgID0gIGNoaWxkX2Nsb3NlOworICBjaGlsZF9vcHMudG9fYXR0YWNoID0gIGNoaWxkX2F0dGFjaDsKKyAgY2hpbGRfb3BzLnRvX3Bvc3RfYXR0YWNoID0gTlVMTDsKKyAgY2hpbGRfb3BzLnRvX3JlcXVpcmVfYXR0YWNoID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogdG9fcmVxdWlyZV9hdHRhY2ggKi8gIAorICBjaGlsZF9vcHMudG9fZGV0YWNoID0gIGNoaWxkX2RldGFjaDsKKyAgY2hpbGRfb3BzLnRvX3JlcXVpcmVfZGV0YWNoID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogdG9fcmVxdWlyZV9kZXRhY2ggKi8KKyAgY2hpbGRfb3BzLnRvX3Jlc3VtZSA9ICBjaGlsZF9yZXN1bWU7CisgIGNoaWxkX29wcy50b193YWl0ICAgPSAgY2hpbGRfd2FpdDsJCisgIGNoaWxkX29wcy50b19wb3N0X3dhaXQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0b19wb3N0X3dhaXQgKi8KKyAgY2hpbGRfb3BzLnRvX2ZldGNoX3JlZ2lzdGVycyAgPSAgIGNoaWxkX2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVyczsKKyAgY2hpbGRfb3BzLnRvX3N0b3JlX3JlZ2lzdGVycyAgPSAgIGNoaWxkX3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVyczsKKyAgY2hpbGRfb3BzLnRvX3ByZXBhcmVfdG9fc3RvcmUgPSAgIGNoaWxkX3ByZXBhcmVfdG9fc3RvcmU7CisgIGNoaWxkX29wcy50b194ZmVyX21lbW9yeSA9ICAgY2hpbGRfeGZlcl9tZW1vcnk7CQkKKyAgY2hpbGRfb3BzLnRvX2ZpbGVzX2luZm8gID0gICBjaGlsZF9maWxlc19pbmZvOwkJCisgIGNoaWxkX29wcy50b19pbnNlcnRfYnJlYWtwb2ludCA9ICAgbWVtb3J5X2luc2VydF9icmVha3BvaW50OwkKKyAgY2hpbGRfb3BzLnRvX3JlbW92ZV9icmVha3BvaW50ID0gICBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQ7CQorICBjaGlsZF9vcHMudG9fdGVybWluYWxfaW5pdCAgPSAgIDA7CQkJCQorICBjaGlsZF9vcHMudG9fdGVybWluYWxfaW5mZXJpb3IgPSAgIDA7CQkJCQorICBjaGlsZF9vcHMudG9fdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ID0gIDA7CisgIGNoaWxkX29wcy50b190ZXJtaW5hbF9vdXJzICA9ICAgMDsJCQkKKyAgY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX2luZm8gID0gICAwOwkJCQorICBjaGlsZF9vcHMudG9fa2lsbCAgPSAgIGNoaWxkX2tpbGxfaW5mZXJpb3I7CQorICBjaGlsZF9vcHMudG9fbG9hZCAgPSAgIDA7CQorICBjaGlsZF9vcHMudG9fbG9va3VwX3N5bWJvbCAgID0gMDsJCQkKKyAgY2hpbGRfb3BzLnRvX2NyZWF0ZV9pbmZlcmlvciA9IGNoaWxkX2NyZWF0ZV9pbmZlcmlvcjsKKyAgY2hpbGRfb3BzLnRvX3Bvc3Rfc3RhcnR1cF9pbmZlcmlvciA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvX3Bvc3Rfc3RhcnR1cF9pbmZlcmlvciAqLworICBjaGlsZF9vcHMudG9fYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvciA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvX2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IgKi8KKyAgY2hpbGRfb3BzLnRvX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0b19jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yICovCisgIGNoaWxkX29wcy50b19wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvX3Bvc3RfZm9sbG93X2luZmVyaW9yX2J5X2Nsb25lICovCisgIGNoaWxkX29wcy50b19pbnNlcnRfZm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgY2hpbGRfb3BzLnRvX3JlbW92ZV9mb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBjaGlsZF9vcHMudG9faW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBjaGlsZF9vcHMudG9fcmVtb3ZlX3Zmb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBjaGlsZF9vcHMudG9faGFzX2ZvcmtlZCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvX2hhc19mb3JrZWQgKi8KKyAgY2hpbGRfb3BzLnRvX2hhc192Zm9ya2VkID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogdG9faGFzX3Zmb3JrZWQgKi8KKyAgY2hpbGRfb3BzLnRvX2Nhbl9mb2xsb3dfdmZvcmtfcHJpb3JfdG9fZXhlYyA9IE5VTEw7CisgIGNoaWxkX29wcy50b19wb3N0X2ZvbGxvd192Zm9yayA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvX3Bvc3RfZm9sbG93X3Zmb3JrICovCisgIGNoaWxkX29wcy50b19pbnNlcnRfZXhlY19jYXRjaHBvaW50ID0gTlVMTDsKKyAgY2hpbGRfb3BzLnRvX3JlbW92ZV9leGVjX2NhdGNocG9pbnQgPSBOVUxMOworICBjaGlsZF9vcHMudG9faGFzX2V4ZWNkID0gTlVMTDsKKyAgY2hpbGRfb3BzLnRvX3JlcG9ydGVkX2V4ZWNfZXZlbnRzX3Blcl9leGVjX2NhbGwgPSBOVUxMOworICBjaGlsZF9vcHMudG9faGFzX2V4aXRlZCA9IE5VTEw7CisgIGNoaWxkX29wcy50b19tb3Vybl9pbmZlcmlvciAgPSBjaGlsZF9tb3Vybl9pbmZlcmlvcjsJCQorICBjaGlsZF9vcHMudG9fY2FuX3J1biAgICAgICAgID0gY2hpbGRfY2FuX3J1bjsKKyAgY2hpbGRfb3BzLnRvX25vdGljZV9zaWduYWxzID0gIDA7ICAgICAgCisgIGNoaWxkX29wcy50b190aHJlYWRfYWxpdmUgID0gICAwOyAgICAgICAKKyAgY2hpbGRfb3BzLnRvX3N0b3AgID0gICBjaGlsZF9zdG9wOyAgICAgIAorICBjaGlsZF9vcHMudG9fcGlkX3RvX2V4ZWNfZmlsZSA9ICBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0b19waWRfdG9fZXhlY19maWxlICovCisgIGNoaWxkX29wcy50b19jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUgPSBOVUxMOworICBjaGlsZF9vcHMudG9fc3RyYXR1bSA9ICAgcHJvY2Vzc19zdHJhdHVtOworICBjaGlsZF9vcHMuRE9OVF9VU0UgPSAgIDA7IAorICBjaGlsZF9vcHMudG9faGFzX2FsbF9tZW1vcnkgPSAxOyAKKyAgY2hpbGRfb3BzLnRvX2hhc19tZW1vcnkgICAgID0gMTsgCisgIGNoaWxkX29wcy50b19oYXNfc3RhY2sgICAgICA9IDE7IAorICBjaGlsZF9vcHMudG9faGFzX3JlZ2lzdGVycyAgPSAxOyAKKyAgY2hpbGRfb3BzLnRvX2hhc19leGVjdXRpb24gID0gMTsgCisgIGNoaWxkX29wcy50b19zZWN0aW9ucyAgICAgICA9IDA7IAorICBjaGlsZF9vcHMudG9fc2VjdGlvbnNfZW5kICAgPSAwOyAKKyAgY2hpbGRfb3BzLnRvX21hZ2ljID0gICBPUFNfTUFHSUM7Cit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9tYWNfbmF0ICgpCit7CisgIGluaXRfY2hpbGRfb3BzKCkgOworCisgIGFkZF9pbmZvICgicHJvYyIsIGluZm9fcHJvYywKKwkgICAgIlNob3cgaW5mb3JtYXRpb24gYWJvdXQgcHJvY2Vzc2VzLiIpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL21hYy14ZGVwLmMgYi9nZGIvbWFjLXhkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjNmNzhkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL21hYy14ZGVwLmMKQEAgLTAsMCArMSwxMDg3IEBACisvKiBUb3AgbGV2ZWwgc3VwcG9ydCBmb3IgTWFjIGludGVyZmFjZSB0byBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LiAgV3JpdHRlbiBieSBTdGFuIFNoZWJzLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisKKyNpbmNsdWRlIDxyZWFkbGluZS9yZWFkbGluZS5oPgorI2luY2x1ZGUgPHJlYWRsaW5lL2hpc3RvcnkuaD4KKworI2luY2x1ZGUgPFR5cGVzLmg+CisjaW5jbHVkZSA8UmVzb3VyY2VzLmg+CisjaW5jbHVkZSA8UXVpY2tEcmF3Lmg+CisjaW5jbHVkZSA8Rm9udHMuaD4KKyNpbmNsdWRlIDxFdmVudHMuaD4KKyNpbmNsdWRlIDxXaW5kb3dzLmg+CisjaW5jbHVkZSA8TWVudXMuaD4KKyNpbmNsdWRlIDxUZXh0RWRpdC5oPgorI2luY2x1ZGUgPERpYWxvZ3MuaD4KKyNpbmNsdWRlIDxEZXNrLmg+CisjaW5jbHVkZSA8VG9vbFV0aWxzLmg+CisjaW5jbHVkZSA8TWVtb3J5Lmg+CisjaW5jbHVkZSA8U2VnTG9hZC5oPgorI2luY2x1ZGUgPEZpbGVzLmg+CisjaW5jbHVkZSA8Rm9sZGVycy5oPgorI2luY2x1ZGUgPE9TVXRpbHMuaD4KKyNpbmNsdWRlIDxPU0V2ZW50cy5oPgorI2luY2x1ZGUgPERpc2tJbml0Lmg+CisjaW5jbHVkZSA8UGFja2FnZXMuaD4KKyNpbmNsdWRlIDxUcmFwcy5oPgorI2luY2x1ZGUgPExpc3RzLmg+CisjaW5jbHVkZSA8R2VzdGFsdC5oPgorI2luY2x1ZGUgPFBQQ1Rvb2xib3guaD4KKyNpbmNsdWRlIDxBcHBsZUV2ZW50cy5oPgorI2luY2x1ZGUgPFN0YW5kYXJkRmlsZS5oPgorI2luY2x1ZGUgPFNvdW5kLmg+CisKKyNpZmRlZiBNUFcKKyNkZWZpbmUgUUQod2hhdGV2ZXIpIChxZC4jI3doYXRldmVyKQorI2RlZmluZSBRRFBhdCh3aGF0ZXZlcikgKCYocWQuIyN3aGF0ZXZlcikpCisjZW5kaWYgLyogTVBXICovCisKKyNpZmRlZiBUSElOS19DCisjZGVmaW5lIFFEKHdoYXRldmVyKSAod2hhdGV2ZXIpCisjZW5kaWYKKworI2RlZmluZSBwMmMocHN0cixjYnVmKSAgXAorICBzdHJuY3B5KGNidWYsICgoY2hhciAqKSAocHN0cikgKyAxKSwgcHN0clswXSk7ICBcCisgIGNidWZbcHN0clswXV0gPSAnXDAnOworCisjZGVmaW5lIHBhc2NhbGlmeShTVFIpIFwKKyAgc3ByaW50Zih0bXBidWYsICIgJXMiLCBTVFIpOyAgXAorICB0bXBidWZbMF0gPSBzdHJsZW4oU1RSKTsKKworI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgImNhbGwtY21kcy5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAic2lnbmFscy5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgImJyZWFrcG9pbnQuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorCisjaW5jbHVkZSAibWFjLWRlZnMuaCIKKworaW50IGRlYnVnX29wZW5wID0gMDsKKworLyogVGhpcyBpcyB0cnVlIGlmIHdlIGFyZSBydW5uaW5nIGFzIGEgc3RhbmRhbG9uZSBhcHBsaWNhdGlvbi4gICovCisKK2ludCBtYWNfYXBwOworCisvKiBUaGlzIGlzIHRydWUgaWYgd2UgYXJlIHVzaW5nIFdhaXROZXh0RXZlbnQuICAqLworCitpbnQgdXNlX3duZTsKKworLyogVGhpcyBpcyB0cnVlIGlmIHdlIGhhdmUgQ29sb3IgUXVpY2tkcmF3LiAgKi8KKworaW50IGhhc19jb2xvcl9xZDsKKworLyogVGhpcyBpcyB0cnVlIGlmIHdlIGFyZSB1c2luZyBDb2xvciBRdWlja2RyYXcuICovCisKK2ludCB1c2VfY29sb3JfcWQ7CisKK2ludCBpbmJhY2tncm91bmQ7CisKK1JlY3QgZHJhZ3JlY3QgPSB7IC0zMjAwMCwgLTMyMDAwLCAzMjAwMCwgMzIwMDAgfTsKK1JlY3Qgc2l6ZXJlY3Q7CisKK2ludCBzYmFyd2lkID0gMTU7CisKKy8qIEdsb2JhbHMgZm9yIHRoZSBjb25zb2xlIHdpbmRvdy4gKi8KKworV2luZG93UHRyIGNvbnNvbGVfd2luZG93OworCitDb250cm9sSGFuZGxlIGNvbnNvbGVfdl9zY3JvbGxiYXI7CisKK1JlY3QgY29uc29sZV92X3Njcm9sbF9yZWN0OworCitURUhhbmRsZSBjb25zb2xlX3RleHQ7CisKK1JlY3QgY29uc29sZV90ZXh0X3JlY3Q7CisKKy8qIFRoaXMgd2lsbCBnbyBhd2F5IGV2ZW50dWFsbHkuICovCitnZGJfaGFzX2FfdGVybWluYWwgKCkgeyByZXR1cm4gMTsgfQorCittYWNfaW5pdCAoKQoreworICBTeXNFbnZSZWMgc2U7CisgIGludCBldmVudGxvb3Bkb25lID0gMDsKKyAgY2hhciAqc3RyOworICBCb29sZWFuIGdvdGV2ZW50OworICBQb2ludCBtb3VzZTsKKyAgRXZlbnRSZWNvcmQgZXZlbnQ7CisgIFdpbmRvd1B0ciB3aW47CisgIFJnbkhhbmRsZSBjdXJzb3JSZ247CisgIGludCBpOworICBIYW5kbGUgbWVudWJhcjsKKyAgTWVudUhhbmRsZSBtZW51OworICBIYW5kbGUgc2lvd19yZXNvdXJjZTsKKworICBtYWNfYXBwID0gMDsKKworICBzdHIgPSBnZXRlbnYoIkRFQlVHX0dEQiIpOworICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyWzBdICE9ICdcMCcpCisgICAgeworICAgICAgaWYgKHN0cmNtcChzdHIsICJvcGVucCIpID09IDApCisJZGVidWdfb3BlbnAgPSAxOworICAgIH0KKyAgCisgIC8qIERvbid0IGRvIGFueXRoaW5nIGlmIHdlYHJlIHJ1bm5pbmcgdW5kZXIgTVBXLiAqLworICBpZiAoIVN0YW5kQWxvbmUpCisgICAgcmV0dXJuOworCisgIC8qIERvbid0IGRvIGFueXRoaW5nIGlmIHdlJ3JlIHVzaW5nIFNJT1cuICovCisgIC8qIFRoaXMgdGVzdCByZXF1aXJlcyB0aGF0IHRoZSBzaW93IDAgcmVzb3VyY2UsIGFzIGRlZmluZWQgaW4KKyAgICAge1JJbmNsdWRlc31zaW93LnIsIG5vdCBiZSBtZXNzZWQgd2l0aC4gIElmIGl0IGlzLCB0aGVuIHRoZQorICAgICBzdGFuZGFyZCBNYWMgc2V0dXAgYmVsb3cgd2lsbCBzdGVwIG9uIFNJT1cncyBNYWMgc2V0dXAgYW5kCisgICAgIG1vc3QgbGlrZWx5IGNyYXNoIHRoZSBtYWNoaW5lLiAqLworICBzaW93X3Jlc291cmNlID0gR2V0UmVzb3VyY2UoJ3Npb3cnLCAwKTsKKyAgaWYgKHNpb3dfcmVzb3VyY2UgIT0gbmlsKQorICAgIHJldHVybjsKKworICBtYWNfYXBwID0gMTsKKworICAvKiBEbyB0aGUgc3RhbmRhcmQgTWFjIGVudmlyb25tZW50IHNldHVwLiAqLworICBJbml0R3JhZiAoJlFEICh0aGVQb3J0KSk7CisgIEluaXRGb250cyAoKTsKKyAgRmx1c2hFdmVudHMgKGV2ZXJ5RXZlbnQsIDApOworICBJbml0V2luZG93cyAoKTsKKyAgSW5pdE1lbnVzICgpOworICBURUluaXQgKCk7CisgIEluaXREaWFsb2dzIChOVUxMKTsKKyAgSW5pdEN1cnNvciAoKTsKKworICAvKiBDb2xvciBRdWlja2RyYXcgaXMgZGlmZmVyZW50IGZyb20gQ2xhc3NpYyBRRC4gKi8KKyAgU3lzRW52aXJvbnMoMiwgJnNlKTsKKyAgaGFzX2NvbG9yX3FkID0gc2UuaGFzQ29sb3JRRDsKKyAgLyogVXNlIGl0IGlmIHdlIGdvdCBpdC4gKi8KKyAgdXNlX2NvbG9yX3FkID0gaGFzX2NvbG9yX3FkOworCisgIHNpemVyZWN0LnRvcCA9IDUwOworICBzaXplcmVjdC5sZWZ0ID0gNTA7CisgIHNpemVyZWN0LmJvdHRvbSA9IDEwMDA7CisgIHNpemVyZWN0LnJpZ2h0ICA9IDEwMDA7CisjaWYgMAorICBzaXplcmVjdC5ib3R0b20gPSBzY3JlZW5CaXRzLmJvdW5kcy5ib3R0b20gLSBzY3JlZW5CaXRzLmJvdW5kcy50b3A7CisgIHNpemVyZWN0LnJpZ2h0ICA9IHNjcmVlbkJpdHMuYm91bmRzLnJpZ2h0ICAtIHNjcmVlbkJpdHMuYm91bmRzLmxlZnQ7CisjZW5kaWYKKworICAvKiBTZXQgdXAgdGhlIG1lbnVzLiAqLworICBtZW51YmFyID0gR2V0TmV3TUJhciAobWJNYWluKTsKKyAgU2V0TWVudUJhciAobWVudWJhcik7CisgIC8qIEFkZCB0aGUgREFzIGV0YyBhcyB1c3VhbC4gKi8KKyAgbWVudSA9IEdldE1IYW5kbGUgKG1BcHBsZSk7CisgIGlmIChtZW51ICE9IG5pbCkgeworICAgIEFkZFJlc01lbnUgKG1lbnUsICdEUlZSJyk7CisgIH0KKyAgRHJhd01lbnVCYXIgKCk7CisKKyAgbmV3X2NvbnNvbGVfd2luZG93ICgpOworfQorCituZXdfY29uc29sZV93aW5kb3cgKCkKK3sKKyAgLyogQ3JlYXRlIHRoZSBtYWluIHdpbmRvdyB3ZSdyZSBnb2luZyB0byBwbGF5IGluLiAqLworICBpZiAoaGFzX2NvbG9yX3FkKQorICAgIGNvbnNvbGVfd2luZG93ID0gR2V0TmV3Q1dpbmRvdyAod0NvbnNvbGUsIE5VTEwsIChXaW5kb3dQdHIpIC0xTCk7CisgIGVsc2UKKyAgICBjb25zb2xlX3dpbmRvdyA9IEdldE5ld1dpbmRvdyAod0NvbnNvbGUsIE5VTEwsIChXaW5kb3dQdHIpIC0xTCk7CisKKyAgU2V0UG9ydCAoY29uc29sZV93aW5kb3cpOworICBjb25zb2xlX3RleHRfcmVjdCA9IGNvbnNvbGVfd2luZG93LT5wb3J0UmVjdDsKKyAgLyogTGVhdmUgOCBwaXhlbHMgb2YgYmxhbmsgc3BhY2UsIGZvciBhZXN0aGV0aWMgcmVhc29ucyBhbmQgdG8KKyAgICAgbWFrZSBpdCBlYXNpZXIgdG8gc2VsZWN0IGZyb20gdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICovCisgIGNvbnNvbGVfdGV4dF9yZWN0LmxlZnQgKz0gODsKKyAgY29uc29sZV90ZXh0X3JlY3QuYm90dG9tIC09IHNiYXJ3aWQgLSAxOworICBjb25zb2xlX3RleHRfcmVjdC5yaWdodCAtPSBzYmFyd2lkIC0gMTsKKyAgY29uc29sZV90ZXh0ID0gVEVOZXcgKCZjb25zb2xlX3RleHRfcmVjdCwgJmNvbnNvbGVfdGV4dF9yZWN0KTsKKyAgVEVTZXRTZWxlY3QgKDAsIDQwMDAwLCBjb25zb2xlX3RleHQpOworICBURURlbGV0ZSAoY29uc29sZV90ZXh0KTsKKyAgVEVBdXRvVmlldyAoMSwgY29uc29sZV90ZXh0KTsKKworICBjb25zb2xlX3Zfc2Nyb2xsX3JlY3QgPSBjb25zb2xlX3dpbmRvdy0+cG9ydFJlY3Q7CisgIGNvbnNvbGVfdl9zY3JvbGxfcmVjdC5ib3R0b20gLT0gc2JhcndpZCAtIDE7CisgIGNvbnNvbGVfdl9zY3JvbGxfcmVjdC5sZWZ0ID0gY29uc29sZV92X3Njcm9sbF9yZWN0LnJpZ2h0IC0gc2JhcndpZDsKKyAgY29uc29sZV92X3Njcm9sbGJhciA9CisgICAgTmV3Q29udHJvbCAoY29uc29sZV93aW5kb3csICZjb25zb2xlX3Zfc2Nyb2xsX3JlY3QsCisJCSJccCIsIDEsIDAsIDAsIDAsIHNjcm9sbEJhclByb2MsIDBMKTsKKworICBTaG93V2luZG93IChjb25zb2xlX3dpbmRvdyk7CisgIFNlbGVjdFdpbmRvdyAoY29uc29sZV93aW5kb3cpOworfQorCittYWNfY29tbWFuZF9sb29wKCkKK3sKKyAgU3lzRW52UmVjIHNlOworICBpbnQgZXZlbnRsb29wZG9uZSA9IDA7CisgIEJvb2xlYW4gZ290ZXZlbnQ7CisgIFBvaW50IG1vdXNlOworICBFdmVudFJlY29yZCBldmVudDsKKyAgV2luZG93UHRyIHdpbjsKKyAgUmduSGFuZGxlIGN1cnNvclJnbjsKKyAgaW50IGksIHRtOworICBIYW5kbGUgbWVudWJhcjsKKyAgTWVudUhhbmRsZSBtZW51OworCisgIC8qIEZpZ3VyZSBvdXQgaWYgdGhlIFdhaXROZXh0RXZlbnQgVHJhcCBpcyBhdmFpbGFibGUuICAqLworICB1c2Vfd25lID0KKyAgICAoTkdldFRyYXBBZGRyZXNzICgweDYwLCBUb29sVHJhcCkgIT0gTkdldFRyYXBBZGRyZXNzICgweDlmLCBUb29sVHJhcCkpOworICAvKiBQYXNzIFdhaXROZXh0RXZlbnQgYW4gZW1wdHkgcmVnaW9uIHRoZSBmaXJzdCB0aW1lIHRocm91Z2guICAqLworICBjdXJzb3JSZ24gPSBOZXdSZ24gKCk7CisgIC8qIEdvIGludG8gdGhlIG1haW4gZXZlbnQtaGFuZGxpbmcgbG9vcC4gICovCisgIHdoaWxlICghZXZlbnRsb29wZG9uZSkKKyAgICB7CisgICAgICAvKiBVc2UgV2FpdE5leHRFdmVudCBpZiBpdCBpcyBhdmFpbGFibGUsIG90aGVyd2lzZSBHZXROZXh0RXZlbnQuICAqLworICAgICAgaWYgKHVzZV93bmUpCisJeworCSAgZ2V0X2dsb2JhbF9tb3VzZSAoJm1vdXNlKTsKKwkgIGFkanVzdF9jdXJzb3IgKG1vdXNlLCBjdXJzb3JSZ24pOworCSAgdG0gPSBHZXRDYXJldFRpbWUoKTsKKwkgIGdvdGV2ZW50ID0gV2FpdE5leHRFdmVudCAoZXZlcnlFdmVudCwgJmV2ZW50LCB0bSwgY3Vyc29yUmduKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgU3lzdGVtVGFzayAoKTsKKwkgIGdvdGV2ZW50ID0gR2V0TmV4dEV2ZW50IChldmVyeUV2ZW50LCAmZXZlbnQpOworCX0KKyAgICAgIC8qIEZpcnN0IGRlY2lkZSBpZiB0aGUgZXZlbnQgaXMgZm9yIGEgZGlhbG9nIG9yIGlzIGp1c3QgYW55IG9sZCBldmVudC4gKi8KKyAgICAgIGlmIChGcm9udFdpbmRvdyAoKSAhPSBuaWwgJiYgSXNEaWFsb2dFdmVudCAoJmV2ZW50KSkKKwl7CisJICBzaG9ydCBpdGVtaGl0OworCSAgRGlhbG9nUHRyIGRpYWxvZzsKKyAgICAgIAorCSAgLyogSGFuZGxlIGFsbCB0aGUgbW9kZWxlc3MgZGlhbG9ncyBoZXJlLiAqLworCSAgaWYgKERpYWxvZ1NlbGVjdCAoJmV2ZW50LCAmZGlhbG9nLCAmaXRlbWhpdCkpCisJICAgIHsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKGdvdGV2ZW50KQorCXsKKwkgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSByaWdodCBjdXJzb3IgYmVmb3JlIGhhbmRsaW5nIHRoZSBldmVudC4gKi8KKwkgIGFkanVzdF9jdXJzb3IgKGV2ZW50LndoZXJlLCBjdXJzb3JSZ24pOworCSAgZG9fZXZlbnQgKCZldmVudCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGRvX2lkbGUgKCk7CisJfQorICAgIH0KK30KKworLyogQ29sbGVjdCB0aGUgZ2xvYmFsIGNvb3JkaW5hdGVzIG9mIHRoZSBtb3VzZSBwb2ludGVyLiAgKi8KKworZ2V0X2dsb2JhbF9tb3VzZSAobW91c2UpCitQb2ludCAqbW91c2U7Cit7CisgIEV2ZW50UmVjb3JkIGV2dDsKKwkKKyAgT1NFdmVudEF2YWlsICgwLCAmZXZ0KTsKKyAgKm1vdXNlID0gZXZ0LndoZXJlOworfQorCisvKiBDaGFuZ2UgdGhlIGN1cnNvcidzIGFwcGVhcmFuY2UgdG8gYmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiBtb3VzZQorICAgbG9jYXRpb24uICAqLworCithZGp1c3RfY3Vyc29yIChtb3VzZSwgcmVnaW9uKQorUG9pbnQgbW91c2U7CitSZ25IYW5kbGUgcmVnaW9uOworeworfQorCisvKiBEZWNpcGhlciBhbiBldmVudCwgbWF5YmUgZG8gc29tZXRoaW5nIHdpdGggaXQuICAqLworCitkb19ldmVudCAoZXZ0KQorRXZlbnRSZWNvcmQgKmV2dDsKK3sKKyAgc2hvcnQgcGFydCwgZXJyLCByc2x0ID0gMDsKKyAgV2luZG93UHRyIHdpbjsKKyAgQm9vbGVhbiBoaXQ7CisgIGNoYXIga2V5OworICBQb2ludCBwbnQ7CisKKyAgc3dpdGNoIChldnQtPndoYXQpCisgICAgeworICAgIGNhc2UgbW91c2VEb3duOgorICAgICAgLyogU2VlIGlmIHRoZSBjbGljayBoYXBwZW5lZCBpbiBhIHNwZWNpYWwgcGFydCBvZiB0aGUgc2NyZWVuLiAqLworICAgICAgcGFydCA9IEZpbmRXaW5kb3cgKGV2dC0+d2hlcmUsICZ3aW4pOworICAgICAgc3dpdGNoIChwYXJ0KQorCXsKKwljYXNlIGluTWVudUJhcjoKKwkgIGFkanVzdF9tZW51cyAoKTsKKwkgIGRvX21lbnVfY29tbWFuZCAoTWVudVNlbGVjdCAoZXZ0LT53aGVyZSkpOworCSAgYnJlYWs7CisJY2FzZSBpblN5c1dpbmRvdzoKKwkgIFN5c3RlbUNsaWNrIChldnQsIHdpbik7CisJICBicmVhazsKKwljYXNlIGluQ29udGVudDoKKwkgIGlmICh3aW4gIT0gRnJvbnRXaW5kb3cgKCkpCisJICAgIHsKKwkgICAgICAvKiBCcmluZyB0aGUgY2xpY2tlZC1vbiB3aW5kb3cgdG8gdGhlIGZyb250LiAqLworCSAgICAgIFNlbGVjdFdpbmRvdyAod2luKTsKKwkgICAgICAvKiBGaXggdGhlIG1lbnUgdG8gbWF0Y2ggdGhlIG5ldyBmcm9udCB3aW5kb3cuICovCisJICAgICAgYWRqdXN0X21lbnVzICgpOworCSAgICAgIC8qIFdlIGFsd2F5cyB3YW50IHRvIGRpc2NhcmQgdGhlIGV2ZW50IG5vdywgc2luY2UgY2xpY2tzIGluIGEKKwkJIHdpbmRvd3MgYXJlIG9mdGVuIGlycmV2ZXJzaWJsZSBhY3Rpb25zLiAqLworCSAgICB9IGVsc2UKKwkgICAgICAvKiBNb3VzZSBjbGlja3MgaW4gdGhlIGZyb250IHdpbmRvdyBkbyBzb21ldGhpbmcgdXNlZnVsLiAqLworCSAgICAgIGRvX21vdXNlX2Rvd24gKHdpbiwgZXZ0KTsKKwkgIGJyZWFrOworCWNhc2UgaW5EcmFnOgorCSAgLyogU3RhbmRhcmQgZHJhZyBiZWhhdmlvciwgbm8gdHJpY2tzIG5lY2Vzc2FyeS4gKi8KKwkgIERyYWdXaW5kb3cgKHdpbiwgZXZ0LT53aGVyZSwgJmRyYWdyZWN0KTsKKwkgIGJyZWFrOworCWNhc2UgaW5Hcm93OgorCSAgZ3Jvd193aW5kb3cgKHdpbiwgZXZ0LT53aGVyZSk7CisJICBicmVhazsKKwljYXNlIGluWm9vbUluOgorCWNhc2UgaW5ab29tT3V0OgorCSAgem9vbV93aW5kb3cgKHdpbiwgZXZ0LT53aGVyZSwgcGFydCk7CisJICBicmVhazsKKwljYXNlIGluR29Bd2F5OgorCSAgY2xvc2Vfd2luZG93ICh3aW4pOworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBrZXlEb3duOgorICAgIGNhc2UgYXV0b0tleToKKyAgICAgIGtleSA9IGV2dC0+bWVzc2FnZSAmIGNoYXJDb2RlTWFzazsKKyAgICAgIC8qIENoZWNrIGZvciBtZW51a2V5IGVxdWl2YWxlbnRzLiAqLworICAgICAgaWYgKGV2dC0+bW9kaWZpZXJzICYgY21kS2V5KQorCXsKKwkgIGlmIChldnQtPndoYXQgPT0ga2V5RG93bikKKwkgICAgeworCSAgICAgIGFkanVzdF9tZW51cyAoKTsKKwkgICAgICBkb19tZW51X2NvbW1hbmQgKE1lbnVLZXkgKGtleSkpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChldnQtPndoYXQgPT0ga2V5RG93bikKKwkgICAgeworCSAgICAgIC8qIFJhbmRvbSBrZXlwcmVzcywgaW50ZXJwcmV0IGl0LiAqLworCSAgICAgIGRvX2tleWJvYXJkX2NvbW1hbmQgKGtleSk7CisJICAgIH0KKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIGFjdGl2YXRlRXZ0OgorICAgICAgYWN0aXZhdGVfd2luZG93ICgoV2luZG93UHRyKSBldnQtPm1lc3NhZ2UsIGV2dC0+bW9kaWZpZXJzICYgYWN0aXZlRmxhZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHVwZGF0ZUV2dDoKKyAgICAgIHVwZGF0ZV93aW5kb3cgKChXaW5kb3dQdHIpIGV2dC0+bWVzc2FnZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGRpc2tFdnQ6CisgICAgICAvKiBDYWxsIERJQmFkTW91bnQgaW4gcmVzcG9uc2UgdG8gYSBkaXNrRXZ0LCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBmb3JtYXQKKwkgYSBmbG9wcHkuIChmcm9tIERUUyBTYW1wbGUpICovCisgICAgICBpZiAoSGlXb3JkIChldnQtPm1lc3NhZ2UpICE9IG5vRXJyKQorCXsKKwkgIFNldFB0ICgmcG50LCA1MCwgNTApOworCSAgZXJyID0gRElCYWRNb3VudCAocG50LCBldnQtPm1lc3NhZ2UpOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgYXBwNEV2dDoKKyAgICAgIC8qIEdyYWIgb25seSBhIHNpbmdsZSBieXRlLiAqLworICAgICAgc3dpdGNoICgoZXZ0LT5tZXNzYWdlID4+IDI0KSAmIDB4RkYpCisJeworCWNhc2UgMHhmYToKKwkgIGJyZWFrOworCWNhc2UgMToKKwkgIGluYmFja2dyb3VuZCA9ICEoZXZ0LT5tZXNzYWdlICYgMSk7CisJICBhY3RpdmF0ZV93aW5kb3cgKEZyb250V2luZG93ICgpLCAhaW5iYWNrZ3JvdW5kKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2Uga0hpZ2hMZXZlbEV2ZW50OgorICAgICAgQUVQcm9jZXNzQXBwbGVFdmVudCAoZXZ0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgbnVsbEV2ZW50OgorICAgICAgZG9faWRsZSAoKTsKKyAgICAgIHJzbHQgPSAxOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIHJzbHQ7Cit9CisKKy8qIERvIGFueSBpZGxlLXRpbWUgYWN0aXZpdGllcy4gKi8KKworZG9faWRsZSAoKQoreworICBURUlkbGUgKGNvbnNvbGVfdGV4dCk7Cit9CisKK2dyb3dfd2luZG93ICh3aW4sIHdoZXJlKQorV2luZG93UHRyIHdpbjsKK1BvaW50IHdoZXJlOworeworICBsb25nIHdpbnNpemU7CisgIGludCBoLCB2OworICBHcmFmUHRyIG9sZHBvcnQ7CisKKyAgd2luc2l6ZSA9IEdyb3dXaW5kb3cgKHdpbiwgd2hlcmUsICZzaXplcmVjdCk7CisgIC8qIE9ubHkgZG8gYW55dGhpbmcgaWYgaXQgYWN0dWFsbHkgY2hhbmdlZCBzaXplLiAqLworICBpZiAod2luc2l6ZSAhPSAwKQorICAgIHsKKyAgICAgIEdldFBvcnQgKCZvbGRwb3J0KTsKKyAgICAgIFNldFBvcnQgKHdpbik7CisgICAgICBpZiAod2luID09IGNvbnNvbGVfd2luZG93KQorCXsKKwkgIEVyYXNlUmVjdCAoJndpbi0+cG9ydFJlY3QpOworCSAgaCA9IExvV29yZCAod2luc2l6ZSk7CisJICB2ID0gSGlXb3JkICh3aW5zaXplKTsKKwkgIFNpemVXaW5kb3cgKHdpbiwgaCwgdiwgMSk7CisJICByZXNpemVfY29uc29sZV93aW5kb3cgKCk7CisJfQorICAgICAgU2V0UG9ydCAob2xkcG9ydCk7CisgICAgfQorfQorCit6b29tX3dpbmRvdyAod2luLCB3aGVyZSwgcGFydCkKK1dpbmRvd1B0ciB3aW47CitQb2ludCB3aGVyZTsKK3Nob3J0IHBhcnQ7Cit7CisgIFpvb21XaW5kb3cgKHdpbiwgcGFydCwgKHdpbiA9PSBGcm9udFdpbmRvdyAoKSkpOworICBpZiAod2luID09IGNvbnNvbGVfd2luZG93KQorICAgIHsKKyAgICAgIHJlc2l6ZV9jb25zb2xlX3dpbmRvdyAoKTsKKyAgICB9Cit9CisKK3Jlc2l6ZV9jb25zb2xlX3dpbmRvdyAoKQoreworICBhZGp1c3RfY29uc29sZV9zaXplcyAoKTsKKyAgYWRqdXN0X2NvbnNvbGVfc2Nyb2xsYmFycyAoKTsKKyAgYWRqdXN0X2NvbnNvbGVfdGV4dCAoKTsKKyAgSW52YWxSZWN0ICgmY29uc29sZV93aW5kb3ctPnBvcnRSZWN0KTsKK30KKworY2xvc2Vfd2luZG93ICh3aW4pCitXaW5kb3dQdHIgd2luOworeworfQorCitwYXNjYWwgdm9pZAordl9zY3JvbGxfcHJvYyAoQ29udHJvbEhhbmRsZSBjb250cm9sLCBzaG9ydCBwYXJ0KQoreworICBpbnQgb2xkdmFsLCBhbW91bnQgPSAwLCBuZXd2YWw7CisgIGludCBwYWdlc2l6ZSA9ICgoKmNvbnNvbGVfdGV4dCktPnZpZXdSZWN0LmJvdHRvbSAtICgqY29uc29sZV90ZXh0KS0+dmlld1JlY3QudG9wKSAvICgqY29uc29sZV90ZXh0KS0+bGluZUhlaWdodDsKKyAgaWYgKHBhcnQpCisgICAgeworICAgICAgb2xkdmFsID0gR2V0Q3RsVmFsdWUgKGNvbnRyb2wpOworICAgICAgc3dpdGNoIChwYXJ0KQorCXsKKwljYXNlIGluVXBCdXR0b246CisJICBhbW91bnQgPSAxOworCSAgYnJlYWs7CisJY2FzZSBpbkRvd25CdXR0b246CisJICBhbW91bnQgPSAtMTsKKwkgIGJyZWFrOworCWNhc2UgaW5QYWdlVXA6CisJICBhbW91bnQgPSBwYWdlc2l6ZTsKKwkgIGJyZWFrOworCWNhc2UgaW5QYWdlRG93bjoKKwkgIGFtb3VudCA9IC0gcGFnZXNpemU7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgLyogKHNob3VsZCBmcmVhayBvdXQpICovCisJICBicmVhazsKKwl9CisgICAgICBTZXRDdGxWYWx1ZShjb250cm9sLCBvbGR2YWwgLSBhbW91bnQpOworICAgICAgbmV3dmFsID0gR2V0Q3RsVmFsdWUgKGNvbnRyb2wpOworICAgICAgYW1vdW50ID0gb2xkdmFsIC0gbmV3dmFsOworICAgICAgaWYgKGFtb3VudCkKKwlURVNjcm9sbCAoMCwgYW1vdW50ICogKCpjb25zb2xlX3RleHQpLT5saW5lSGVpZ2h0LCBjb25zb2xlX3RleHQpOworICAgIH0KK30KKworZG9fbW91c2VfZG93biAoV2luZG93UHRyIHdpbiwgRXZlbnRSZWNvcmQgKmV2ZW50KQoreworICBzaG9ydCBwYXJ0LCB2YWx1ZTsKKyAgUG9pbnQgbW91c2U7CisgIENvbnRyb2xIYW5kbGUgY29udHJvbDsKKworICBpZiAoMSAvKmlzX2FwcF93aW5kb3cod2luKSovKQorICAgIHsKKyAgICAgIFNldFBvcnQgKHdpbik7CisgICAgICBtb3VzZSA9IGV2ZW50LT53aGVyZTsKKyAgICAgIEdsb2JhbFRvTG9jYWwgKCZtb3VzZSk7CisgICAgICBwYXJ0ID0gRmluZENvbnRyb2wobW91c2UsIHdpbiwgJmNvbnRyb2wpOworICAgICAgaWYgKGNvbnRyb2wgPT0gY29uc29sZV92X3Njcm9sbGJhcikKKwl7CisJICBzd2l0Y2ggKHBhcnQpCisJICAgIHsKKwkgICAgY2FzZSBpblRodW1iOgorCSAgICAgIHZhbHVlID0gR2V0Q3RsVmFsdWUgKGNvbnRyb2wpOworCSAgICAgIHBhcnQgPSBUcmFja0NvbnRyb2wgKGNvbnRyb2wsIG1vdXNlLCBuaWwpOworCSAgICAgIGlmIChwYXJ0KQorCQl7CisJCSAgdmFsdWUgLT0gR2V0Q3RsVmFsdWUgKGNvbnRyb2wpOworCQkgIGlmICh2YWx1ZSkKKwkJICAgIFRFU2Nyb2xsKDAsIHZhbHVlICogKCpjb25zb2xlX3RleHQpLT5saW5lSGVpZ2h0LAorCQkJICAgICBjb25zb2xlX3RleHQpOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisjaWYgMCAvKiBkb24ndCBkZWFsIHdpdGggcmlnaHQgbm93ICovCisjaWYgMSAvKiB1bml2ZXJzYWwgaGVhZGVycyAqLworCSAgICAgIHZhbHVlID0gVHJhY2tDb250cm9sIChjb250cm9sLCBtb3VzZSwgKENvbnRyb2xBY3Rpb25VUFApIHZfc2Nyb2xsX3Byb2MpOworI2Vsc2UKKwkgICAgICB2YWx1ZSA9IFRyYWNrQ29udHJvbCAoY29udHJvbCwgbW91c2UsIChQcm9jUHRyKSB2X3Njcm9sbF9wcm9jKTsKKyNlbmRpZgorI2VuZGlmCisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgVEVDbGljayAobW91c2UsIDAsIGNvbnNvbGVfdGV4dCk7CisJfQorICAgIH0KK30KKworc2Nyb2xsX3RleHQgKGhsaW5lcywgdmxpbmVzKQoraW50IGhsaW5lcywgdmxpbmVzOworeworfQorCithY3RpdmF0ZV93aW5kb3cgKHdpbiwgYWN0aXZhdGUpCitXaW5kb3dQdHIgd2luOworaW50IGFjdGl2YXRlOworeworICBSZWN0IGdyb3dfcmVjdDsKKworICBpZiAod2luID09IG5pbCkgcmV0dXJuOworICAvKiBJdCdzIGNvbnZlbmllbnQgdG8gbWFrZSB0aGUgYWN0aXZhdGVkIHdpbmRvdyBhbHNvIGJlIHRoZQorICAgICBjdXJyZW50IEdyYWZQb3J0LiAqLworICBpZiAoYWN0aXZhdGUpCisgICAgU2V0UG9ydCh3aW4pOworICAvKiBBY3RpdmF0ZSB0aGUgY29uc29sZSB3aW5kb3cncyBzY3JvbGxiYXIuICovCisgIGlmICh3aW4gPT0gY29uc29sZV93aW5kb3cpCisgICAgeworICAgICAgaWYgKGFjdGl2YXRlKQorCXsKKwkgIFRFQWN0aXZhdGUgKGNvbnNvbGVfdGV4dCk7CisJICAvKiBDYXVzZSB0aGUgZ3JvdyBpY29uIHRvIGJlIHJlZHJhd24gYXQgdGhlIG5leHQgdXBkYXRlLiAqLworCSAgZ3Jvd19yZWN0ID0gY29uc29sZV93aW5kb3ctPnBvcnRSZWN0OworCSAgZ3Jvd19yZWN0LnRvcCA9IGdyb3dfcmVjdC5ib3R0b20gLSBzYmFyd2lkOworCSAgZ3Jvd19yZWN0LmxlZnQgPSBncm93X3JlY3QucmlnaHQgLSBzYmFyd2lkOworCSAgSW52YWxSZWN0ICgmZ3Jvd19yZWN0KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgVEVEZWFjdGl2YXRlIChjb25zb2xlX3RleHQpOworCSAgRHJhd0dyb3dJY29uIChjb25zb2xlX3dpbmRvdyk7CisJfQorICAgICAgSGlsaXRlQ29udHJvbCAoY29uc29sZV92X3Njcm9sbGJhciwgKGFjdGl2YXRlID8gMCA6IDI1NSkpOworICAgIH0KK30KKwordXBkYXRlX3dpbmRvdyAod2luKQorV2luZG93UHRyIHdpbjsKK3sKKyAgaW50IGNvbnRyb2xzID0gMSwgZ3Jvd2JveCA9IDA7CisgIEdyYWZQdHIgb2xkcG9ydDsKKworICAvKiBTZXQgdGhlIHVwZGF0aW5nIHdpbmRvdyB0byBiZSB0aGUgY3VycmVudCBncmFmcG9ydC4gKi8KKyAgR2V0UG9ydCAoJm9sZHBvcnQpOworICBTZXRQb3J0ICh3aW4pOworLyogIHJlY2FsY19kZXB0aHMoKTsgICovCisgIEJlZ2luVXBkYXRlICh3aW4pOworICBpZiAod2luID09IGNvbnNvbGVfd2luZG93KQorICAgIHsKKyAgICAgIGRyYXdfY29uc29sZSAoKTsKKyAgICAgIGNvbnRyb2xzID0gMTsKKyAgICAgIGdyb3dib3ggPSAxOworICAgIH0KKyAgaWYgKGNvbnRyb2xzKQorICAgIFVwZGF0ZUNvbnRyb2xzICh3aW4sIHdpbi0+dmlzUmduKTsKKyAgaWYgKGdyb3dib3gpCisgICAgRHJhd0dyb3dJY29uICh3aW4pOworICBFbmRVcGRhdGUgKHdpbik7CisgIFNldFBvcnQgKG9sZHBvcnQpOworfQorCithZGp1c3RfbWVudXMgKCkKK3sKK30KKworZG9fbWVudV9jb21tYW5kICh3aGljaCkKK2xvbmcgd2hpY2g7Cit7CisgIHNob3J0IG1lbnVpZCwgbWVudWl0ZW07CisgIHNob3J0IGl0ZW1IaXQ7CisgIFN0cjI1NSBkYW5hbWU7CisgIHNob3J0IGRhUmVmTnVtOworICBCb29sZWFuIGhhbmRsZWRieWRhOworICBXaW5kb3dQdHIgd2luOworICBzaG9ydCBkaXRlbTsKKyAgaW50IGk7CisgIGNoYXIgY21kYnVmWzMwMF07CisKKyAgY21kYnVmWzBdID0gJ1wwJzsKKyAgbWVudWlkID0gSGlXb3JkICh3aGljaCk7CisgIG1lbnVpdGVtID0gTG9Xb3JkICh3aGljaCk7CisgIHN3aXRjaCAobWVudWlkKQorICAgIHsKKyAgICBjYXNlIG1BcHBsZToKKyAgICAgIHN3aXRjaCAobWVudWl0ZW0pCisJeworCWNhc2UgbWlBYm91dDoKKwkgIEFsZXJ0ICgxMjgsIG5pbCk7CisJICBicmVhazsKKyNpZiAwCisJY2FzZSBtaUhlbHA6CisJICAvKiAoc2hvdWxkIHBvcCB1cCBoZWxwIGluZm8pICovCisJICBicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJICBHZXRJdGVtIChHZXRNSGFuZGxlIChtQXBwbGUpLCBtZW51aXRlbSwgZGFuYW1lKTsKKwkgIGRhUmVmTnVtID0gT3BlbkRlc2tBY2MgKGRhbmFtZSk7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBtRmlsZToKKyAgICAgIHN3aXRjaCAobWVudWl0ZW0pCisJeworCWNhc2UgbWlGaWxlTmV3OgorCSAgaWYgKGNvbnNvbGVfd2luZG93ID09IEZyb250V2luZG93ICgpKQorCSAgICB7CisJICAgICAgY2xvc2Vfd2luZG93IChjb25zb2xlX3dpbmRvdyk7CisJICAgIH0KKwkgIG5ld19jb25zb2xlX3dpbmRvdyAoKTsKKwkgIGJyZWFrOworCWNhc2UgbWlGaWxlT3BlbjoKKwkgIFN5c0JlZXAgKDIwKTsKKwkgIGJyZWFrOworCWNhc2UgbWlGaWxlUXVpdDoKKwkgIEV4aXRUb1NoZWxsICgpOworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBtRWRpdDoKKyAgICAgIC8qIGhhbmRsZWRieWRhID0gU3lzdGVtRWRpdChtZW51aXRlbS0xKTsgKi8KKyAgICAgIHN3aXRjaCAobWVudWl0ZW0pCisJeworCWNhc2UgbWlFZGl0Q3V0OgorCSAgVEVDdXQgKGNvbnNvbGVfdGV4dCk7CisJICBicmVhazsKKwljYXNlIG1pRWRpdENvcHk6CisJICBURUNvcHkgKGNvbnNvbGVfdGV4dCk7CisJICBicmVhazsKKwljYXNlIG1pRWRpdFBhc3RlOgorCSAgVEVQYXN0ZSAoY29uc29sZV90ZXh0KTsKKwkgIGJyZWFrOworCWNhc2UgbWlFZGl0Q2xlYXI6CisJICBURURlbGV0ZSAoY29uc29sZV90ZXh0KTsKKwkgIGJyZWFrOworCX0KKyAgICAgIC8qIEFsbCBvZiB0aGVzZSBvcGVyYXRpb25zIG5lZWQgdGhlIHNhbWUgcG9zdHByb2Nlc3NpbmcuICovCisgICAgICBhZGp1c3RfY29uc29sZV9zaXplcyAoKTsKKyAgICAgIGFkanVzdF9jb25zb2xlX3Njcm9sbGJhcnMgKCk7CisgICAgICBhZGp1c3RfY29uc29sZV90ZXh0ICgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBtRGVidWc6CisgICAgICBzd2l0Y2ggKG1lbnVpdGVtKQorCXsKKwljYXNlIG1pRGVidWdUYXJnZXQ6CisJICBzcHJpbnRmIChjbWRidWYsICJ0YXJnZXQgJXMiLCAicmVtb3RlIik7CisJICBicmVhazsKKwljYXNlIG1pRGVidWdSdW46CisJICBzcHJpbnRmIChjbWRidWYsICJydW4iKTsKKwkgIGJyZWFrOworCWNhc2UgbWlEZWJ1Z0NvbnRpbnVlOgorCSAgc3ByaW50ZiAoY21kYnVmLCAiY29udGludWUiKTsKKwkgIGJyZWFrOworCWNhc2UgbWlEZWJ1Z1N0ZXA6CisJICBzcHJpbnRmIChjbWRidWYsICJzdGVwIik7CisJICBicmVhazsKKwljYXNlIG1pRGVidWdOZXh0OgorCSAgc3ByaW50ZiAoY21kYnVmLCAibmV4dCIpOworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICAgfQorICBIaWxpdGVNZW51ICgwKTsKKyAgLyogRXhlY3V0ZSBhIGNvbW1hbmQgaWYgb25lIGhhZCBiZWVuIGdpdmVuLiAgRG8gaGVyZSBiZWNhdXNlIGEgY29tbWFuZAorICAgICBtYXkgbG9uZ2ptcCBiZWZvcmUgd2UgZ2V0IGEgY2hhbmNlIHRvIHVuaGlsaXRlIHRoZSBtZW51LiAqLworICBpZiAoc3RybGVuIChjbWRidWYpID4gMCkKKyAgICBleGVjdXRlX2NvbW1hbmQgKGNtZGJ1ZiwgMCk7Cit9CisKK2NoYXIgY29tbWFuZGJ1ZlsxMDAwXTsKKworZG9fa2V5Ym9hcmRfY29tbWFuZCAoa2V5KQoraW50IGtleTsKK3sKKyAgaW50IHN0YXJ0cG9zLCBlbmRwb3MsIGksIGxlbjsKKyAgY2hhciAqbGFzdF9uZXdsaW5lOworICBjaGFyIGJ1ZlsxMF0sICp0ZXh0X3N0ciwgKmNvbW1hbmQsICpjbWRfc3RhcnQ7CisgIENoYXJzSGFuZGxlIHRleHQ7CisKKyAgaWYgKGtleSA9PSAnXDAxNScgfHwga2V5ID09ICdcMDAzJykKKyAgICB7CisgICAgICB0ZXh0ID0gVEVHZXRUZXh0IChjb25zb2xlX3RleHQpOworICAgICAgSExvY2sgKChIYW5kbGUpIHRleHQpOworICAgICAgdGV4dF9zdHIgPSAqdGV4dDsKKyAgICAgIHN0YXJ0cG9zID0gKCpjb25zb2xlX3RleHQpLT5zZWxTdGFydDsKKyAgICAgIGVuZHBvcyA9ICgqY29uc29sZV90ZXh0KS0+c2VsRW5kOworICAgICAgaWYgKHN0YXJ0cG9zICE9IGVuZHBvcykKKwl7CisJICBsZW4gPSBlbmRwb3MgLSBzdGFydHBvczsKKwkgIGNtZF9zdGFydCA9IHRleHRfc3RyICsgc3RhcnRwb3M7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZvciAoaSA9IHN0YXJ0cG9zIC0gMTsgaSA+PSAwOyAtLWkpCisJICAgIGlmICh0ZXh0X3N0cltpXSA9PSAnXDAxNScpCisJICAgICAgYnJlYWs7CisJICBsYXN0X25ld2xpbmUgPSB0ZXh0X3N0ciArIGk7CisJICBsZW4gPSAodGV4dF9zdHIgKyBzdGFydHBvcykgLSAxIC0gbGFzdF9uZXdsaW5lOworCSAgY21kX3N0YXJ0ID0gbGFzdF9uZXdsaW5lICsgMTsKKwl9CisgICAgICBpZiAobGVuID4gMTAwMCkgbGVuID0gOTk5OworICAgICAgaWYgKGxlbiA8IDApIGxlbiA9IDA7CisgICAgICBzdHJuY3B5IChjb21tYW5kYnVmICsgMSwgY21kX3N0YXJ0LCBsZW4pOworICAgICAgY29tbWFuZGJ1ZlsxICsgbGVuXSA9IDA7CisgICAgICBjb21tYW5kID0gY29tbWFuZGJ1ZiArIDE7CisgICAgICBIVW5sb2NrICgoSGFuZGxlKSB0ZXh0KTsKKyAgICAgIGNvbW1hbmRidWZbMF0gPSBzdHJsZW4oY29tbWFuZCk7CisKKyAgICAgIC8qIEluc2VydCBhIG5ld2xpbmUgYW5kIHJlY2FsY3VsYXRlIGJlZm9yZSBkb2luZyBhbnkgY29tbWFuZC4gKi8KKyAgICAgIGtleSA9ICdcMDE1JzsKKyAgICAgIFRFS2V5IChrZXksIGNvbnNvbGVfdGV4dCk7CisgICAgICBURUluc2VydCAoYnVmLCAxLCBjb25zb2xlX3RleHQpOworICAgICAgYWRqdXN0X2NvbnNvbGVfc2l6ZXMgKCk7CisgICAgICBhZGp1c3RfY29uc29sZV9zY3JvbGxiYXJzICgpOworICAgICAgYWRqdXN0X2NvbnNvbGVfdGV4dCAoKTsKKworICAgICAgaWYgKHN0cmxlbiAoY29tbWFuZCkgPiAwKQorCXsKKwkgIGV4ZWN1dGVfY29tbWFuZCAoY29tbWFuZCwgMCk7CisJICBicHN0YXRfZG9fYWN0aW9ucyAoJnN0b3BfYnBzdGF0KTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogQSBzZWxmLWluc2VydGluZyBjaGFyYWN0ZXIuICBUaGlzIGluY2x1ZGVzIGRlbGV0ZS4gICovCisgICAgICBURUtleSAoa2V5LCBjb25zb2xlX3RleHQpOworICAgIH0KK30KKworLyogRHJhdyBhbGwgZ3JhcGhpY2FsIHN0dWZmIGluIHRoZSBjb25zb2xlIHdpbmRvdy4gICovCisKK2RyYXdfY29uc29sZSAoKQoreworICBTZXRQb3J0IChjb25zb2xlX3dpbmRvdyk7CisgIFRFVXBkYXRlICgmKGNvbnNvbGVfd2luZG93LT5wb3J0UmVjdCksIGNvbnNvbGVfdGV4dCk7Cit9CisKKy8qIENhdXNlIGFuIHVwZGF0ZSBvZiBhIGdpdmVuIHdpbmRvdydzIGVudGlyZSBjb250ZW50cy4gICovCisKK2ZvcmNlX3VwZGF0ZSAod2luKQorV2luZG93UHRyIHdpbjsKK3sKKyAgR3JhZlB0ciBvbGRwb3J0OworCisgIGlmICh3aW4gPT0gbmlsKSByZXR1cm47CisgIEdldFBvcnQgKCZvbGRwb3J0KTsKKyAgU2V0UG9ydCAod2luKTsKKyAgRXJhc2VSZWN0ICgmd2luLT5wb3J0UmVjdCk7CisgIEludmFsUmVjdCAoJndpbi0+cG9ydFJlY3QpOworICBTZXRQb3J0IChvbGRwb3J0KTsKK30KKworYWRqdXN0X2NvbnNvbGVfc2l6ZXMgKCkKK3sKKyAgUmVjdCB0bXByZWN0OworCisgIHRtcHJlY3QgPSBjb25zb2xlX3dpbmRvdy0+cG9ydFJlY3Q7CisgIC8qIE1vdmUgYW5kIHNpemUgdGhlIHNjcm9sbGJhci4gKi8KKyAgTW92ZUNvbnRyb2wgKGNvbnNvbGVfdl9zY3JvbGxiYXIsIHRtcHJlY3QucmlnaHQgLSBzYmFyd2lkLCAwKTsKKyAgU2l6ZUNvbnRyb2wgKGNvbnNvbGVfdl9zY3JvbGxiYXIsIHNiYXJ3aWQgKyAxLCB0bXByZWN0LmJvdHRvbSAtIHNiYXJ3aWQgKyAxKTsKKyAgLyogTW92ZSBhbmQgc2l6ZSB0aGUgdGV4dC4gKi8KKyAgdG1wcmVjdC5sZWZ0ICs9IDc7CisgIHRtcHJlY3QucmlnaHQgLT0gc2JhcndpZDsKKyAgdG1wcmVjdC5ib3R0b20gLT0gc2JhcndpZDsKKyAgSW5zZXRSZWN0KCZ0bXByZWN0LCAxLCAxKTsKKyAgKCpjb25zb2xlX3RleHQpLT5kZXN0UmVjdCA9IHRtcHJlY3Q7CisgIC8qIEZpZGRsZSBib3R0b20gb2Ygdmlld3JlY3QgdG8gYmUgZXZlbiBtdWx0aXBsZSBvZiB0ZXh0IGxpbmVzLiAqLworICB0bXByZWN0LmJvdHRvbSA9IHRtcHJlY3QudG9wCisgICAgKyAoKHRtcHJlY3QuYm90dG9tIC0gdG1wcmVjdC50b3ApIC8gKCpjb25zb2xlX3RleHQpLT5saW5lSGVpZ2h0KQorICAgICAgKiAoKmNvbnNvbGVfdGV4dCktPmxpbmVIZWlnaHQ7CisgICgqY29uc29sZV90ZXh0KS0+dmlld1JlY3QgPSB0bXByZWN0OworfQorCithZGp1c3RfY29uc29sZV9zY3JvbGxiYXJzICgpCit7CisgIGludCBsaW5lcywgbmV3bWF4LCB2YWx1ZTsKKworICAoKmNvbnNvbGVfdl9zY3JvbGxiYXIpLT5jb250cmxWaXMgPSAwOworICBsaW5lcyA9ICgqY29uc29sZV90ZXh0KS0+bkxpbmVzOworICBuZXdtYXggPSBsaW5lcyAtICgoKCpjb25zb2xlX3RleHQpLT52aWV3UmVjdC5ib3R0b20KKwkJICAgICAtICgqY29uc29sZV90ZXh0KS0+dmlld1JlY3QudG9wKQorCQkgICAgLyAoKmNvbnNvbGVfdGV4dCktPmxpbmVIZWlnaHQpOworICBpZiAobmV3bWF4IDwgMCkgbmV3bWF4ID0gMDsKKyAgU2V0Q3RsTWF4IChjb25zb2xlX3Zfc2Nyb2xsYmFyLCBuZXdtYXgpOworICB2YWx1ZSA9ICgoKmNvbnNvbGVfdGV4dCktPnZpZXdSZWN0LnRvcCAtICgqY29uc29sZV90ZXh0KS0+ZGVzdFJlY3QudG9wKQorICAgIC8gKCpjb25zb2xlX3RleHQpLT5saW5lSGVpZ2h0OworICBTZXRDdGxWYWx1ZSAoY29uc29sZV92X3Njcm9sbGJhciwgdmFsdWUpOworICAoKmNvbnNvbGVfdl9zY3JvbGxiYXIpLT5jb250cmxWaXMgPSAweGZmOworICBTaG93Q29udHJvbCAoY29uc29sZV92X3Njcm9sbGJhcik7Cit9CisKKy8qIFNjcm9sbCB0aGUgVEUgcmVjb3JkIHNvIHRoYXQgaXQgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBzY3JvbGxiYXIocykuICovCisKK2FkanVzdF9jb25zb2xlX3RleHQgKCkKK3sKKyAgVEVTY3JvbGwgKCgoKmNvbnNvbGVfdGV4dCktPnZpZXdSZWN0LmxlZnQKKwkgICAgIC0gKCpjb25zb2xlX3RleHQpLT5kZXN0UmVjdC5sZWZ0KQorCSAgICAtIDAgLyogZ2V0IGggc2Nyb2xsIHZhbHVlICovLAorCSAgICAoKCgoKmNvbnNvbGVfdGV4dCktPnZpZXdSZWN0LnRvcCAtICgqY29uc29sZV90ZXh0KS0+ZGVzdFJlY3QudG9wKQorCSAgICAgIC8gKCpjb25zb2xlX3RleHQpLT5saW5lSGVpZ2h0KQorCSAgICAgLSBHZXRDdGxWYWx1ZSAoY29uc29sZV92X3Njcm9sbGJhcikpCisJICAgICogKCpjb25zb2xlX3RleHQpLT5saW5lSGVpZ2h0LAorCSAgICBjb25zb2xlX3RleHQpOworfQorCisvKiBSZWFkbGluZSBzdWJzdGl0dXRlLiAqLworCitjaGFyICoKK3JlYWRsaW5lIChjaGFyICpwcnJvbXB0KQoreworICByZXR1cm4gZ2RiX3JlYWRsaW5lIChwcnJvbXB0KTsKK30KKworY2hhciAqcmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVyczsKKworY2hhciAqcmxfY29tcGxldGVyX3F1b3RlX2NoYXJhY3RlcnM7CisKK2ludCAoKnJsX2NvbXBsZXRpb25fZW50cnlfZnVuY3Rpb24pICgpOworCitpbnQgcmxfcG9pbnQ7CisKK2NoYXIgKnJsX2xpbmVfYnVmZmVyOworCitjaGFyICpybF9yZWFkbGluZV9uYW1lOworCisvKiBIaXN0b3J5IHN1YnN0aXR1dGUuICovCisKK3ZvaWQKK2FkZF9oaXN0b3J5IChjaGFyICpidWYpCit7Cit9CisKK3ZvaWQKK3N0aWZsZV9oaXN0b3J5IChpbnQgbikKK3sKK30KKworaW50Cit1bnN0aWZsZV9oaXN0b3J5ICgpCit7Cit9CisKK2ludAorcmVhZF9oaXN0b3J5IChjaGFyICpuYW1lKQoreworfQorCitpbnQKK3dyaXRlX2hpc3RvcnkgKGNoYXIgKm5hbWUpCit7Cit9CisKK2ludAoraGlzdG9yeV9leHBhbmQgKGNoYXIgKngsIGNoYXIgKip5KQoreworfQorCitleHRlcm4gSElTVF9FTlRSWSAqCitoaXN0b3J5X2dldCAoaW50IHh4eCkKK3sKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBoaXN0b3J5X2Jhc2U7CisKK2NoYXIgKgorZmlsZW5hbWVfY29tcGxldGlvbl9mdW5jdGlvbiAoY2hhciAqdGV4dCwgY2hhciAqbmFtZSkKK3sKKyAgcmV0dXJuICI/IjsKK30KKworY2hhciAqCit0aWxkZV9leHBhbmQgKGNoYXIgKnN0cikKK3sKKyAgcmV0dXJuIHN0cnNhdmUgKHN0cik7Cit9CisKKy8qIE1vZGlmaWVkIHZlcnNpb25zIG9mIHN0YW5kYXJkIEkvTy4gKi8KKworI3VuZGVmIGZwcmludGYKKworaW50CitoYWNrZWRfZnByaW50ZiAoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICBpbnQgcmV0OworICB2YV9saXN0IGFwOworCisgIHZhX3N0YXJ0IChhcCwgZm10KTsKKyAgaWYgKG1hY19hcHAgJiYgKGZwID09IHN0ZG91dCB8fCBmcCA9PSBzdGRlcnIpKQorICAgIHsKKyAgICAgIGNoYXIgYnVmWzEwMDBdOworCisgICAgICByZXQgPSB2c3ByaW50ZihidWYsIGZtdCwgYXApOworICAgICAgVEVJbnNlcnQgKGJ1Ziwgc3RybGVuKGJ1ZiksIGNvbnNvbGVfdGV4dCk7CisgICAgfQorICBlbHNlCisgICAgcmV0ID0gdmZwcmludGYgKGZwLCBmbXQsIGFwKTsKKyAgdmFfZW5kIChhcCk7CisgIHJldHVybiByZXQ7Cit9CisKKyN1bmRlZiBwcmludGYKKworaW50CitoYWNrZWRfcHJpbnRmIChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgaW50IHJldDsKKyAgdmFfbGlzdCBhcDsKKworICB2YV9zdGFydCAoYXAsIGZtdCk7CisgIHJldCA9IGhhY2tlZF92ZnByaW50ZihzdGRvdXQsIGZtdCwgYXApOworICB2YV9lbmQgKGFwKTsKKyAgcmV0dXJuIHJldDsKK30KKworI3VuZGVmIHZmcHJpbnRmCisKK2ludCAKK2hhY2tlZF92ZnByaW50ZiAoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQoreworICBpZiAobWFjX2FwcCAmJiAoZnAgPT0gc3Rkb3V0IHx8IGZwID09IHN0ZGVycikpCisgICAgeworICAgICAgY2hhciBidWZbMTAwMF07CisgICAgICBpbnQgcmV0OworCisgICAgICByZXQgPSB2c3ByaW50ZihidWYsIGZvcm1hdCwgYXJncyk7CisgICAgICBURUluc2VydCAoYnVmLCBzdHJsZW4oYnVmKSwgY29uc29sZV90ZXh0KTsKKyAgICAgIGlmIChzdHJjaHIoYnVmLCAnXG4nKSkKKwl7CisJICBhZGp1c3RfY29uc29sZV9zaXplcyAoKTsKKwkgIGFkanVzdF9jb25zb2xlX3Njcm9sbGJhcnMgKCk7CisJICBhZGp1c3RfY29uc29sZV90ZXh0ICgpOworCX0KKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIHZmcHJpbnRmIChmcCwgZm9ybWF0LCBhcmdzKTsKK30KKworI3VuZGVmIGZwdXRzCisKK2hhY2tlZF9mcHV0cyAoY29uc3QgY2hhciAqcywgRklMRSAqZnApCit7CisgIGlmIChtYWNfYXBwICYmIChmcCA9PSBzdGRvdXQgfHwgZnAgPT0gc3RkZXJyKSkKKyAgICB7CisgICAgICBURUluc2VydCAocywgc3RybGVuKHMpLCBjb25zb2xlX3RleHQpOworICAgICAgaWYgKHN0cmNocihzLCAnXG4nKSkKKwl7CisJICBhZGp1c3RfY29uc29sZV9zaXplcyAoKTsKKwkgIGFkanVzdF9jb25zb2xlX3Njcm9sbGJhcnMgKCk7CisJICBhZGp1c3RfY29uc29sZV90ZXh0ICgpOworCX0KKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBmcHV0cyAocywgZnApOworfQorCisjdW5kZWYgZnB1dGMKKworaGFja2VkX2ZwdXRjIChjb25zdCBjaGFyIGMsIEZJTEUgKmZwKQoreworICBpZiAobWFjX2FwcCAmJiAoZnAgPT0gc3Rkb3V0IHx8IGZwID09IHN0ZGVycikpCisgICAgeworICAgICAgY2hhciBidWZbMV07CisKKyAgICAgIGJ1ZlswXSA9IGM7CisgICAgICBURUluc2VydCAoYnVmLCAxLCBjb25zb2xlX3RleHQpOworICAgICAgaWYgKGMgPT0gJ1xuJykKKwl7CisJICBhZGp1c3RfY29uc29sZV9zaXplcyAoKTsKKwkgIGFkanVzdF9jb25zb2xlX3Njcm9sbGJhcnMgKCk7CisJICBhZGp1c3RfY29uc29sZV90ZXh0ICgpOworCX0KKyAgICAgIHJldHVybiBjOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBmcHV0YyAoYywgZnApOworfQorCisjdW5kZWYgcHV0YworCitoYWNrZWRfcHV0YyAoY29uc3QgY2hhciBjLCBGSUxFICpmcCkKK3sKKyAgaWYgKG1hY19hcHAgJiYgKGZwID09IHN0ZG91dCB8fCBmcCA9PSBzdGRlcnIpKQorICAgIHsKKyAgICAgIGNoYXIgYnVmWzFdOworCisgICAgICBidWZbMF0gPSBjOworICAgICAgVEVJbnNlcnQgKGJ1ZiwgMSwgY29uc29sZV90ZXh0KTsKKyAgICAgIGlmIChjID09ICdcbicpCisJeworCSAgYWRqdXN0X2NvbnNvbGVfc2l6ZXMgKCk7CisJICBhZGp1c3RfY29uc29sZV9zY3JvbGxiYXJzICgpOworCSAgYWRqdXN0X2NvbnNvbGVfdGV4dCAoKTsKKwl9CisgICAgICByZXR1cm4gYzsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gZnB1dGMgKGMsIGZwKTsKK30KKworI3VuZGVmIGZmbHVzaAorCitoYWNrZWRfZmZsdXNoIChGSUxFICpmcCkKK3sKKyAgaWYgKG1hY19hcHAgJiYgKGZwID09IHN0ZG91dCB8fCBmcCA9PSBzdGRlcnIpKQorICAgIHsKKyAgICAgIGFkanVzdF9jb25zb2xlX3NpemVzICgpOworICAgICAgYWRqdXN0X2NvbnNvbGVfc2Nyb2xsYmFycyAoKTsKKyAgICAgIGFkanVzdF9jb25zb2xlX3RleHQgKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIHJldHVybiBmZmx1c2ggKGZwKTsKK30KKworI3VuZGVmIGZnZXRjCisKK2hhY2tlZF9mZ2V0YyAoRklMRSAqZnApCit7CisgIGlmIChtYWNfYXBwICYmIChmcCA9PSBzdGRpbikpCisgICAgeworICAgICAgLyogQ2F0Y2ggYW55IGF0dGVtcHRzIHRvIHVzZSB0aGlzLiAgKi8KKyAgICAgIERlYnVnU3RyKCJccFNob3VsZCBub3QgYmUgcmVhZGluZyBmcm9tIHN0ZGluISIpOworICAgICAgcmV0dXJuICdcbic7CisgICAgfQorICByZXR1cm4gZmdldGMgKGZwKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9tYWluLmMgYi9nZGIvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YzI0NDUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbWFpbi5jCkBAIC0wLDAgKzEsNzgwIEBACisvKiBUb3AgbGV2ZWwgc3R1ZmYgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgInRvcC5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiY2FsbC1jbWRzLmgiCisKKyNpbmNsdWRlICJnZXRvcHQuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgImdkYl9zdGF0LmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKworLyogVGVtcG9yYXJ5IHZhcmlhYmxlIGZvciBTRVRfVE9QX0xFVkVMLiAgKi8KKworc3RhdGljIGludCB0b3BfbGV2ZWxfdmFsOworCisvKiBEbyBhIHNldGptcCBvbiBlcnJvcl9yZXR1cm4gYW5kIHF1aXRfcmV0dXJuLiAgY2F0Y2hfZXJyb3JzIGlzCisgICBnZW5lcmFsbHkgYSBjbGVhbmVyIHdheSB0byBkbyB0aGlzLCBidXQgbWFpbigpIHdvdWxkIGxvb2sgcHJldHR5CisgICB1Z2x5IGlmIGl0IGhhZCB0byB1c2UgY2F0Y2hfZXJyb3JzIGVhY2ggdGltZS4gICovCisKKyNkZWZpbmUgU0VUX1RPUF9MRVZFTCgpIFwKKyAgKCgodG9wX2xldmVsX3ZhbCA9IFNJR1NFVEpNUCAoZXJyb3JfcmV0dXJuKSkgXAorICAgID8gKFBUUikgMCA6IChQVFIpIG1lbWNweSAocXVpdF9yZXR1cm4sIGVycm9yX3JldHVybiwgc2l6ZW9mIChTSUdKTVBfQlVGKSkpIFwKKyAgICwgdG9wX2xldmVsX3ZhbCkKKworLyogSWYgbm9uemVybywgZGlzcGxheSB0aW1lIHVzYWdlIGJvdGggYXQgc3RhcnR1cCBhbmQgZm9yIGVhY2ggY29tbWFuZC4gICovCisKK2ludCBkaXNwbGF5X3RpbWU7CisKKy8qIElmIG5vbnplcm8sIGRpc3BsYXkgc3BhY2UgdXNhZ2UgYm90aCBhdCBzdGFydHVwIGFuZCBmb3IgZWFjaCBjb21tYW5kLiAgKi8KKworaW50IGRpc3BsYXlfc3BhY2U7CisKKy8qIFdoZXRoZXIgdGhpcyBpcyB0aGUgY29tbWFuZCBsaW5lIHZlcnNpb24gb3Igbm90ICovCitpbnQgdHVpX3ZlcnNpb24gPSAwOworCisvKiBXaGV0aGVyIHhkYiBjb21tYW5kcyB3aWxsIGJlIGhhbmRsZWQgKi8KK2ludCB4ZGJfY29tbWFuZHMgPSAwOworCisvKiBXaGV0aGVyIGRieCBjb21tYW5kcyB3aWxsIGJlIGhhbmRsZWQgKi8KK2ludCBkYnhfY29tbWFuZHMgPSAwOworCitHREJfRklMRSAqZ2RiX3N0ZG91dDsKK0dEQl9GSUxFICpnZGJfc3RkZXJyOworCisvKiBXaGV0aGVyIHRvIGVuYWJsZSB3cml0aW5nIGludG8gZXhlY3V0YWJsZSBhbmQgY29yZSBmaWxlcyAqLworZXh0ZXJuIGludCB3cml0ZV9maWxlczsKKworc3RhdGljIHZvaWQgcHJpbnRfZ2RiX2hlbHAgUEFSQU1TICgoR0RCX0ZJTEUgKikpOworZXh0ZXJuIHZvaWQgZ2RiX2luaXQgUEFSQU1TICgoY2hhciAqKSk7CisKKy8qIFRoZXNlIHR3byBhcmUgdXNlZCB0byBzZXQgdGhlIGV4dGVybmFsIGVkaXRvciBjb21tYW5kcyB3aGVuIGdkYiBpcyBmYXJtaW5nCisgICBvdXQgZmlsZXMgdG8gYmUgZWRpdGVkIGJ5IGFub3RoZXIgcHJvZ3JhbS4gKi8KKworZXh0ZXJuIGludCBlbmFibGVfZXh0ZXJuYWxfZWRpdG9yOworZXh0ZXJuIGNoYXIgKiBleHRlcm5hbF9lZGl0b3JfY29tbWFuZDsKKworI2lmZGVmIF9fQ1lHV0lOX18KKyNpbmNsdWRlIDx3aW5kb3dzLmg+IC8qIGZvciBNQVhfUEFUSCAqLworI2luY2x1ZGUgPHN5cy9jeWd3aW4uaD4gLyogZm9yIGN5Z3dpbjMyX2NvbnZfdG9fcG9zaXhfcGF0aCAqLworI2VuZGlmCisKK2ludAorbWFpbiAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKiphcmd2OworeworICBpbnQgY291bnQ7CisgIHN0YXRpYyBpbnQgcXVpZXQgPSAwOworICBzdGF0aWMgaW50IGJhdGNoID0gMDsKKworICAvKiBQb2ludGVycyB0byB2YXJpb3VzIGFyZ3VtZW50cyBmcm9tIGNvbW1hbmQgbGluZS4gICovCisgIGNoYXIgKnN5bWFyZyA9IE5VTEw7CisgIGNoYXIgKmV4ZWNhcmcgPSBOVUxMOworICBjaGFyICpjb3JlYXJnID0gTlVMTDsKKyAgY2hhciAqY2RhcmcgPSBOVUxMOworICBjaGFyICp0dHlhcmcgPSBOVUxMOworCisgIC8qIFRoZXNlIGFyZSBzdGF0aWMgc28gdGhhdCB3ZSBjYW4gdGFrZSB0aGVpciBhZGRyZXNzIGluIGFuIGluaXRpYWxpemVyLiAgKi8KKyAgc3RhdGljIGludCBwcmludF9oZWxwOworICBzdGF0aWMgaW50IHByaW50X3ZlcnNpb247CisKKyAgLyogUG9pbnRlcnMgdG8gYWxsIGFyZ3VtZW50cyBvZiAtLWNvbW1hbmQgb3B0aW9uLiAgKi8KKyAgY2hhciAqKmNtZGFyZzsKKyAgLyogQWxsb2NhdGVkIHNpemUgb2YgY21kYXJnLiAgKi8KKyAgaW50IGNtZHNpemU7CisgIC8qIE51bWJlciBvZiBlbGVtZW50cyBvZiBjbWRhcmcgdXNlZC4gICovCisgIGludCBuY21kOworCisgIC8qIEluZGljZXMgb2YgYWxsIGFyZ3VtZW50cyBvZiAtLWRpcmVjdG9yeSBvcHRpb24uICAqLworICBjaGFyICoqZGlyYXJnOworICAvKiBBbGxvY2F0ZWQgc2l6ZS4gICovCisgIGludCBkaXJzaXplOworICAvKiBOdW1iZXIgb2YgZWxlbWVudHMgdXNlZC4gICovCisgIGludCBuZGlyOworICAKKyAgc3RydWN0IHN0YXQgaG9tZWJ1ZiwgY3dkYnVmOworICBjaGFyICpob21lZGlyLCAqaG9tZWluaXQ7CisKKyAgcmVnaXN0ZXIgaW50IGk7CisKKyAgbG9uZyB0aW1lX2F0X3N0YXJ0dXAgPSBnZXRfcnVuX3RpbWUgKCk7CisKKyAgaW50IGdkYl9maWxlX3NpemU7CisKKyAgU1RBUlRfUFJPR1JFU1MgKGFyZ3ZbMF0sIDApOworCisjaWZkZWYgTVBXCisgIC8qIERvIGFsbCBNYWMtc3BlY2lmaWMgc2V0dXAuICovCisgIG1hY19pbml0ICgpOworI2VuZGlmIC8qIE1QVyAqLworCisgIC8qIFRoaXMgbmVlZHMgdG8gaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3QgdXNlIG9mIG1hbGxvYy4gICovCisgIGluaXRfbWFsbG9jICgoUFRSKSBOVUxMKTsKKworI2lmIGRlZmluZWQgKEFMSUdOX1NUQUNLX09OX1NUQVJUVVApCisgIGkgPSAoaW50KSAmY291bnQgJiAweDM7CisgIGlmIChpICE9IDApCisgICAgYWxsb2NhICg0IC0gaSk7CisjZW5kaWYKKworICAvKiBJZiBlcnJvcigpIGlzIGNhbGxlZCBmcm9tIGluaXRpYWxpemF0aW9uIGNvZGUsIGp1c3QgZXhpdCAqLworICBpZiAoU0VUX1RPUF9MRVZFTCAoKSkgeworICAgIGV4aXQoMSk7CisgIH0KKworICBjbWRzaXplID0gMTsKKyAgY21kYXJnID0gKGNoYXIgKiopIHhtYWxsb2MgKGNtZHNpemUgKiBzaXplb2YgKCpjbWRhcmcpKTsKKyAgbmNtZCA9IDA7CisgIGRpcnNpemUgPSAxOworICBkaXJhcmcgPSAoY2hhciAqKikgeG1hbGxvYyAoZGlyc2l6ZSAqIHNpemVvZiAoKmRpcmFyZykpOworICBuZGlyID0gMDsKKworICBxdWl0X2ZsYWcgPSAwOworICBsaW5lID0gKGNoYXIgKikgeG1hbGxvYyAobGluZXNpemUpOworICBsaW5lWzBdID0gJ1wwJzsJCS8qIFRlcm1pbmF0ZSBzYXZlZCAobm93IGVtcHR5KSBjbWQgbGluZSAqLworICBpbnN0cmVhbSA9IHN0ZGluOworCisgIGdldGN3ZCAoZ2RiX2RpcmJ1Ziwgc2l6ZW9mIChnZGJfZGlyYnVmKSk7CisgIGN1cnJlbnRfZGlyZWN0b3J5ID0gZ2RiX2RpcmJ1ZjsKKworICBnZGJfZmlsZV9zaXplID0gc2l6ZW9mKEdEQl9GSUxFKTsKKworICBnZGJfc3Rkb3V0ID0gKEdEQl9GSUxFICopeG1hbGxvYyAoZ2RiX2ZpbGVfc2l6ZSk7CisgIGdkYl9zdGRvdXQtPnRzX3N0cmVhbXR5cGUgPSBhZmlsZTsKKyAgZ2RiX3N0ZG91dC0+dHNfZmlsZXN0cmVhbSA9IHN0ZG91dDsKKyAgZ2RiX3N0ZG91dC0+dHNfc3RyYnVmID0gTlVMTDsKKyAgZ2RiX3N0ZG91dC0+dHNfYnVmbGVuID0gMDsKKworICBnZGJfc3RkZXJyID0gKEdEQl9GSUxFICopeG1hbGxvYyAoZ2RiX2ZpbGVfc2l6ZSk7CisgIGdkYl9zdGRlcnItPnRzX3N0cmVhbXR5cGUgPSBhZmlsZTsKKyAgZ2RiX3N0ZGVyci0+dHNfZmlsZXN0cmVhbSA9IHN0ZGVycjsKKyAgZ2RiX3N0ZGVyci0+dHNfc3RyYnVmID0gTlVMTDsKKyAgZ2RiX3N0ZGVyci0+dHNfYnVmbGVuID0gMDsKKworICAvKiBQYXJzZSBhcmd1bWVudHMgYW5kIG9wdGlvbnMuICAqLworICB7CisgICAgaW50IGM7CisgICAgLyogV2hlbiB2YXIgZmllbGQgaXMgMCwgdXNlIGZsYWcgZmllbGQgdG8gcmVjb3JkIHRoZSBlcXVpdmFsZW50CisgICAgICAgc2hvcnQgb3B0aW9uIChvciBhcmJpdHJhcnkgbnVtYmVycyBzdGFydGluZyBhdCAxMCBmb3IgdGhvc2UKKyAgICAgICB3aXRoIG5vIGVxdWl2YWxlbnQpLiAgKi8KKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9CisgICAgICB7CisjaWYgZGVmaW5lZChUVUkpCisJeyJ0dWkiLCBub19hcmd1bWVudCwgJnR1aV92ZXJzaW9uLCAxfSwKKyNlbmRpZgorCXsieGRiIiwgbm9fYXJndW1lbnQsICZ4ZGJfY29tbWFuZHMsIDF9LAorCXsiZGJ4Iiwgbm9fYXJndW1lbnQsICZkYnhfY29tbWFuZHMsIDF9LAorCXsicmVhZG5vdyIsIG5vX2FyZ3VtZW50LCAmcmVhZG5vd19zeW1ib2xfZmlsZXMsIDF9LAorCXsiciIsIG5vX2FyZ3VtZW50LCAmcmVhZG5vd19zeW1ib2xfZmlsZXMsIDF9LAorCXsibWFwcGVkIiwgbm9fYXJndW1lbnQsICZtYXBwZWRfc3ltYm9sX2ZpbGVzLCAxfSwKKwl7Im0iLCBub19hcmd1bWVudCwgJm1hcHBlZF9zeW1ib2xfZmlsZXMsIDF9LAorCXsicXVpZXQiLCBub19hcmd1bWVudCwgJnF1aWV0LCAxfSwKKwl7InEiLCBub19hcmd1bWVudCwgJnF1aWV0LCAxfSwKKwl7InNpbGVudCIsIG5vX2FyZ3VtZW50LCAmcXVpZXQsIDF9LAorCXsibngiLCBub19hcmd1bWVudCwgJmluaGliaXRfZ2RiaW5pdCwgMX0sCisJeyJuIiwgbm9fYXJndW1lbnQsICZpbmhpYml0X2dkYmluaXQsIDF9LAorCXsiYmF0Y2giLCBub19hcmd1bWVudCwgJmJhdGNoLCAxfSwKKwl7ImVwb2NoIiwgbm9fYXJndW1lbnQsICZlcG9jaF9pbnRlcmZhY2UsIDF9LAorCisJLyogVGhpcyBpcyBhIHN5bm9ueW0gZm9yICItLWFubm90YXRlPTEiLiAgLS1hbm5vdGF0ZSBpcyBub3cgcHJlZmVycmVkLAorCSAgIGJ1dCBrZWVwIHRoaXMgaGVyZSBmb3IgYSBsb25nIHRpbWUgYmVjYXVzZSBwZW9wbGUgd2lsbCBiZSBydW5uaW5nCisJICAgZW1hY3NlcyB3aGljaCB1c2UgLS1mdWxsbmFtZS4gICovCisJeyJmdWxsbmFtZSIsIG5vX2FyZ3VtZW50LCAwLCAnZid9LAorCXsiZiIsIG5vX2FyZ3VtZW50LCAwLCAnZid9LAorCisJeyJhbm5vdGF0ZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAxMn0sCisJeyJoZWxwIiwgbm9fYXJndW1lbnQsICZwcmludF9oZWxwLCAxfSwKKwl7InNlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIDEwfSwKKwl7InN5bWJvbHMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3MnfSwKKwl7InMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3MnfSwKKwl7ImV4ZWMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2UnfSwKKwl7ImUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2UnfSwKKwl7ImNvcmUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2MnfSwKKwl7ImMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2MnfSwKKwl7ImNvbW1hbmQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3gnfSwKKwl7InZlcnNpb24iLCBub19hcmd1bWVudCwgJnByaW50X3ZlcnNpb24sIDF9LAorCXsieCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAneCd9LAorCXsiZGlyZWN0b3J5IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdkJ30sCisJeyJjZCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAxMX0sCisJeyJ0dHkiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3QnfSwKKwl7ImJhdWQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2InfSwKKwl7ImIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2InfSwKKwl7Im53Iiwgbm9fYXJndW1lbnQsICZ1c2Vfd2luZG93cywgMH0sCisJeyJub3dpbmRvd3MiLCBub19hcmd1bWVudCwgJnVzZV93aW5kb3dzLCAwfSwKKwl7InciLCBub19hcmd1bWVudCwgJnVzZV93aW5kb3dzLCAxfSwKKwl7IndpbmRvd3MiLCBub19hcmd1bWVudCwgJnVzZV93aW5kb3dzLCAxfSwKKwl7InN0YXRpc3RpY3MiLCBub19hcmd1bWVudCwgMCwgMTN9LAorCXsid3JpdGUiLCBub19hcmd1bWVudCwgJndyaXRlX2ZpbGVzLCAxfSwKKy8qIEFsbG93IG1hY2hpbmUgZGVzY3JpcHRpb25zIHRvIGFkZCBtb3JlIG9wdGlvbnMuLi4gKi8KKyNpZmRlZiBBRERJVElPTkFMX09QVElPTlMKKwlBRERJVElPTkFMX09QVElPTlMKKyNlbmRpZgorCXswLCBub19hcmd1bWVudCwgMCwgMH0KKyAgICAgIH07CisKKyAgICB3aGlsZSAoMSkKKyAgICAgIHsKKwlpbnQgb3B0aW9uX2luZGV4OworCisJYyA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsICIiLAorCQkJICAgICAgbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KTsKKwlpZiAoYyA9PSBFT0YpCisJICBicmVhazsKKworCS8qIExvbmcgb3B0aW9uIHRoYXQgdGFrZXMgYW4gYXJndW1lbnQuICAqLworCWlmIChjID09IDAgJiYgbG9uZ19vcHRpb25zW29wdGlvbl9pbmRleF0uZmxhZyA9PSAwKQorCSAgYyA9IGxvbmdfb3B0aW9uc1tvcHRpb25faW5kZXhdLnZhbDsKKworCXN3aXRjaCAoYykKKwkgIHsKKwkgIGNhc2UgMDoKKwkgICAgLyogTG9uZyBvcHRpb24gdGhhdCBqdXN0IHNldHMgYSBmbGFnLiAgKi8KKwkgICAgYnJlYWs7CisJICBjYXNlIDEwOgorCSAgICBzeW1hcmcgPSBvcHRhcmc7CisJICAgIGV4ZWNhcmcgPSBvcHRhcmc7CisJICAgIGJyZWFrOworCSAgY2FzZSAxMToKKwkgICAgY2RhcmcgPSBvcHRhcmc7CisJICAgIGJyZWFrOworCSAgY2FzZSAxMjoKKwkgICAgLyogRklYTUU6IHdoYXQgaWYgdGhlIHN5bnRheCBpcyB3cm9uZyAoZS5nLiBub3QgZGlnaXRzKT8gICovCisJICAgIGFubm90YXRpb25fbGV2ZWwgPSBhdG9pIChvcHRhcmcpOworCSAgICBicmVhazsKKwkgIGNhc2UgMTM6CisJICAgIC8qIEVuYWJsZSB0aGUgZGlzcGxheSBvZiBib3RoIHRpbWUgYW5kIHNwYWNlIHVzYWdlLiAgKi8KKwkgICAgZGlzcGxheV90aW1lID0gMTsKKwkgICAgZGlzcGxheV9zcGFjZSA9IDE7CisJICAgIGJyZWFrOworCSAgY2FzZSAnZic6CisJICAgIGFubm90YXRpb25fbGV2ZWwgPSAxOworLyogV2UgaGF2ZSBwcm9iYWJseSBiZWVuIGludm9rZWQgZnJvbSBlbWFjcy4gIERpc2FibGUgd2luZG93IGludGVyZmFjZS4gICovCisJICAgIHVzZV93aW5kb3dzID0gMDsKKwkgICAgYnJlYWs7CisJICBjYXNlICdzJzoKKwkgICAgc3ltYXJnID0gb3B0YXJnOworCSAgICBicmVhazsKKwkgIGNhc2UgJ2UnOgorCSAgICBleGVjYXJnID0gb3B0YXJnOworCSAgICBicmVhazsKKwkgIGNhc2UgJ2MnOgorCSAgICBjb3JlYXJnID0gb3B0YXJnOworCSAgICBicmVhazsKKwkgIGNhc2UgJ3gnOgorCSAgICBjbWRhcmdbbmNtZCsrXSA9IG9wdGFyZzsKKwkgICAgaWYgKG5jbWQgPj0gY21kc2l6ZSkKKwkgICAgICB7CisJCWNtZHNpemUgKj0gMjsKKwkJY21kYXJnID0gKGNoYXIgKiopIHhyZWFsbG9jICgoY2hhciAqKWNtZGFyZywKKwkJCQkJICAgICBjbWRzaXplICogc2l6ZW9mICgqY21kYXJnKSk7CisJICAgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgJ2QnOgorCSAgICBkaXJhcmdbbmRpcisrXSA9IG9wdGFyZzsKKwkgICAgaWYgKG5kaXIgPj0gZGlyc2l6ZSkKKwkgICAgICB7CisJCWRpcnNpemUgKj0gMjsKKwkJZGlyYXJnID0gKGNoYXIgKiopIHhyZWFsbG9jICgoY2hhciAqKWRpcmFyZywKKwkJCQkJICAgICBkaXJzaXplICogc2l6ZW9mICgqZGlyYXJnKSk7CisJICAgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgJ3QnOgorCSAgICB0dHlhcmcgPSBvcHRhcmc7CisJICAgIGJyZWFrOworCSAgY2FzZSAncSc6CisJICAgIHF1aWV0ID0gMTsKKwkgICAgYnJlYWs7CisJICBjYXNlICdiJzoKKwkgICAgeworCSAgICAgIGludCBpOworCSAgICAgIGNoYXIgKnA7CisKKwkgICAgICBpID0gc3RydG9sIChvcHRhcmcsICZwLCAwKTsKKwkgICAgICBpZiAoaSA9PSAwICYmIHAgPT0gb3B0YXJnKQorCisJCS8qIERvbid0IHVzZSAqX2ZpbHRlcmVkIG9yIHdhcm5pbmcoKSAod2hpY2ggcmVsaWVzIG9uCisgICAgICAgICAgICAgICAgICAgY3VycmVudF90YXJnZXQpIHVudGlsIGFmdGVyIGluaXRpYWxpemVfYWxsX2ZpbGVzKCkuICovCisKKwkJZnByaW50Zl91bmZpbHRlcmVkCisJCSAgKGdkYl9zdGRlcnIsCisJCSAgICJ3YXJuaW5nOiBjb3VsZCBub3Qgc2V0IGJhdWQgcmF0ZSB0byBgJXMnLlxuIiwgb3B0YXJnKTsKKwkgICAgICBlbHNlCisJCWJhdWRfcmF0ZSA9IGk7CisJICAgIH0KKwkgIGNhc2UgJ2wnOgorCSAgICB7CisJICAgICAgaW50IGk7CisJICAgICAgY2hhciAqcDsKKworCSAgICAgIGkgPSBzdHJ0b2wgKG9wdGFyZywgJnAsIDApOworCSAgICAgIGlmIChpID09IDAgJiYgcCA9PSBvcHRhcmcpCisKKwkJLyogRG9uJ3QgdXNlICpfZmlsdGVyZWQgb3Igd2FybmluZygpICh3aGljaCByZWxpZXMgb24KKyAgICAgICAgICAgICAgICAgICBjdXJyZW50X3RhcmdldCkgdW50aWwgYWZ0ZXIgaW5pdGlhbGl6ZV9hbGxfZmlsZXMoKS4gKi8KKworCQlmcHJpbnRmX3VuZmlsdGVyZWQKKwkJICAoZ2RiX3N0ZGVyciwKKwkJICAgIndhcm5pbmc6IGNvdWxkIG5vdCBzZXQgdGltZW91dCBsaW1pdCB0byBgJXMnLlxuIiwgb3B0YXJnKTsKKwkgICAgICBlbHNlCisJCXJlbW90ZV90aW1lb3V0ID0gaTsKKwkgICAgfQorCSAgICBicmVhazsKKworI2lmZGVmIEFERElUSU9OQUxfT1BUSU9OX0NBU0VTCisJICBBRERJVElPTkFMX09QVElPTl9DQVNFUworI2VuZGlmCisJICBjYXNlICc/JzoKKwkgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLAorCQkgICAgICJVc2UgYCVzIC0taGVscCcgZm9yIGEgY29tcGxldGUgbGlzdCBvZiBvcHRpb25zLlxuIiwKKwkJICAgICBhcmd2WzBdKTsKKwkgICAgZXhpdCAoMSk7CisJICB9CisgICAgICB9CisKKyAgICAvKiBJZiAtLWhlbHAgb3IgLS12ZXJzaW9uLCBkaXNhYmxlIHdpbmRvdyBpbnRlcmZhY2UuICAqLworICAgIGlmIChwcmludF9oZWxwIHx8IHByaW50X3ZlcnNpb24pCisgICAgICB7CisJdXNlX3dpbmRvd3MgPSAwOworI2lmZGVmIFRVSQorCS8qIERpc2FibGUgdGhlIFRVSSBhcyB3ZWxsLiAgKi8KKwl0dWlfdmVyc2lvbiA9IDA7CisjZW5kaWYKKyAgICAgIH0KKworI2lmZGVmIFRVSQorICAgIC8qIEFuIGV4cGxpY2l0IC0tdHVpIGZsYWcgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IFVJLCB3aGljaCBpcyB0aGUKKyAgICAgICB3aW5kb3cgc3lzdGVtLiAgKi8KKyAgICBpZiAodHVpX3ZlcnNpb24pCisgICAgICB1c2Vfd2luZG93cyA9IDA7CisjZW5kaWYgICAgICAKKworICAgIC8qIE9LLCB0aGF0J3MgYWxsIHRoZSBvcHRpb25zLiAgVGhlIG90aGVyIGFyZ3VtZW50cyBhcmUgZmlsZW5hbWVzLiAgKi8KKyAgICBjb3VudCA9IDA7CisgICAgZm9yICg7IG9wdGluZCA8IGFyZ2M7IG9wdGluZCsrKQorICAgICAgc3dpdGNoICgrK2NvdW50KQorCXsKKwljYXNlIDE6CisJICBzeW1hcmcgPSBhcmd2W29wdGluZF07CisJICBleGVjYXJnID0gYXJndltvcHRpbmRdOworCSAgYnJlYWs7CisJY2FzZSAyOgorCSAgY29yZWFyZyA9IGFyZ3Zbb3B0aW5kXTsKKwkgIGJyZWFrOworCWNhc2UgMzoKKwkgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKwkJICAgIkV4Y2VzcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGlnbm9yZWQuICglcyVzKVxuIiwKKwkJICAgYXJndltvcHRpbmRdLCAob3B0aW5kID09IGFyZ2MgLSAxKSA/ICIiIDogIiAuLi4iKTsKKwkgIGJyZWFrOworCX0KKyAgICBpZiAoYmF0Y2gpCisgICAgICBxdWlldCA9IDE7CisgIH0KKworI2lmIGRlZmluZWQoVFVJKQorICBpZiAodHVpX3ZlcnNpb24pCisgICAgaW5pdF91aV9ob29rID0gdHVpSW5pdDsKKyNlbmRpZgorICBnZGJfaW5pdCAoYXJndlswXSk7CisKKyAgLyogRG8gdGhlc2UgKGFuZCBhbnl0aGluZyB3aGljaCBtaWdodCBjYWxsIHdyYXBfaGVyZSBvciAqX2ZpbHRlcmVkKQorICAgICBhZnRlciBpbml0aWFsaXplX2FsbF9maWxlcy4gICovCisgIGlmIChwcmludF92ZXJzaW9uKQorICAgIHsKKyAgICAgIHByaW50X2dkYl92ZXJzaW9uIChnZGJfc3Rkb3V0KTsKKyAgICAgIHdyYXBfaGVyZSAoIiIpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgICAgIGV4aXQgKDApOworICAgIH0KKworICBpZiAocHJpbnRfaGVscCkKKyAgICB7CisgICAgICBwcmludF9nZGJfaGVscCAoZ2RiX3N0ZG91dCk7CisgICAgICBmcHV0c191bmZpbHRlcmVkICgiXG4iLCBnZGJfc3Rkb3V0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0KKworICBpZiAoIXF1aWV0KQorICAgIHsKKyAgICAgIC8qIFByaW50IGFsbCB0aGUganVuayBhdCB0aGUgdG9wLCB3aXRoIHRyYWlsaW5nICIuLi4iIGlmIHdlIGFyZSBhYm91dAorCSB0byByZWFkIGEgc3ltYm9sIGZpbGUgKHBvc3NpYmx5IHNsb3dseSkuICAqLworICAgICAgcHJpbnRfZ2RiX3ZlcnNpb24gKGdkYl9zdGRvdXQpOworICAgICAgaWYgKHN5bWFyZykKKwlwcmludGZfZmlsdGVyZWQgKCIuLiIpOworICAgICAgd3JhcF9oZXJlKCIiKTsKKyAgICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CQkvKiBGb3JjZSB0byBzY3JlZW4gZHVyaW5nIHNsb3cgb3BlcmF0aW9ucyAqLworICAgIH0KKworICBlcnJvcl9wcmVfcHJpbnQgPSAiXG5cbiI7CisgIHF1aXRfcHJlX3ByaW50ID0gZXJyb3JfcHJlX3ByaW50OworCisgIC8qIFdlIG1heSBnZXQgbW9yZSB0aGFuIG9uZSB3YXJuaW5nLCBkb24ndCBkb3VibGUgc3BhY2UgYWxsIG9mIHRoZW0uLi4gKi8KKyAgd2FybmluZ19wcmVfcHJpbnQgPSAiXG53YXJuaW5nOiAiOworCisgIC8qIFJlYWQgYW5kIGV4ZWN1dGUgJEhPTUUvLmdkYmluaXQgZmlsZSwgaWYgaXQgZXhpc3RzLiAgVGhpcyBpcyBkb25lCisgICAgICpiZWZvcmUqIGFsbCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhcmUgcHJvY2Vzc2VkOyBpdCBzZXRzCisgICAgIGdsb2JhbCBwYXJhbWV0ZXJzLCB3aGljaCBhcmUgaW5kZXBlbmRlbnQgb2Ygd2hhdCBmaWxlIHlvdSBhcmUKKyAgICAgZGVidWdnaW5nIG9yIHdoYXQgZGlyZWN0b3J5IHlvdSBhcmUgaW4uICAqLworI2lmZGVmIF9fQ1lHV0lOMzJfXworICB7CisgICAgY2hhciAqIHRtcCA9IGdldGVudiAoIkhPTUUiKTsKKyAgICAKKyAgICBpZiAodG1wICE9IE5VTEwpCisgICAgICB7CisgICAgICAgIGhvbWVkaXIgPSAoY2hhciAqKSBhbGxvY2EgKE1BWF9QQVRIKzEpOworICAgICAgICBjeWd3aW4zMl9jb252X3RvX3Bvc2l4X3BhdGggKHRtcCwgaG9tZWRpcik7CisgICAgICB9CisgICAgZWxzZQorICAgICAgaG9tZWRpciA9IE5VTEw7CisgIH0KKyNlbHNlCisgIGhvbWVkaXIgPSBnZXRlbnYgKCJIT01FIik7ICAKKyNlbmRpZgorICBpZiAoaG9tZWRpcikKKyAgICB7CisgICAgICBob21laW5pdCA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChob21lZGlyKSArCisJCQkJICBzdHJsZW4gKGdkYmluaXQpICsgMTApOworICAgICAgc3RyY3B5IChob21laW5pdCwgaG9tZWRpcik7CisgICAgICBzdHJjYXQgKGhvbWVpbml0LCAiLyIpOworICAgICAgc3RyY2F0IChob21laW5pdCwgZ2RiaW5pdCk7CisKKyAgICAgIGlmICghaW5oaWJpdF9nZGJpbml0KQorCXsKKwkgIGlmICghU0VUX1RPUF9MRVZFTCAoKSkKKwkgICAgc291cmNlX2NvbW1hbmQgKGhvbWVpbml0LCAwKTsKKwl9CisgICAgICBkb19jbGVhbnVwcyAoQUxMX0NMRUFOVVBTKTsKKworICAgICAgLyogRG8gc3RhdHM7IG5vIG5lZWQgdG8gZG8gdGhlbSBlbHNld2hlcmUgc2luY2Ugd2UnbGwgb25seQorCSBuZWVkIHRoZW0gaWYgaG9tZWRpciBpcyBzZXQuICBNYWtlIHN1cmUgdGhhdCB0aGV5IGFyZQorCSB6ZXJvIGluIGNhc2Ugb25lIG9mIHRoZW0gZmFpbHMgKHRoaXMgZ3VhcmFudGVlcyB0aGF0IHRoZXkKKwkgd29uJ3QgbWF0Y2ggaWYgZWl0aGVyIGV4aXN0cykuICAqLworICAgICAgCisgICAgICBtZW1zZXQgKCZob21lYnVmLCAwLCBzaXplb2YgKHN0cnVjdCBzdGF0KSk7CisgICAgICBtZW1zZXQgKCZjd2RidWYsIDAsIHNpemVvZiAoc3RydWN0IHN0YXQpKTsKKyAgICAgIAorICAgICAgc3RhdCAoaG9tZWluaXQsICZob21lYnVmKTsKKyAgICAgIHN0YXQgKGdkYmluaXQsICZjd2RidWYpOyAvKiBXZSdsbCBvbmx5IG5lZWQgdGhpcyBpZgorCQkJCSAgICAgICBob21lZGlyIHdhcyBzZXQuICAqLworICAgIH0KKworICAvKiBOb3cgcGVyZm9ybSBhbGwgdGhlIGFjdGlvbnMgaW5kaWNhdGVkIGJ5IHRoZSBhcmd1bWVudHMuICAqLworICBpZiAoY2RhcmcgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoIVNFVF9UT1BfTEVWRUwgKCkpCisJeworCSAgY2RfY29tbWFuZCAoY2RhcmcsIDApOworCX0KKyAgICB9CisgIGRvX2NsZWFudXBzIChBTExfQ0xFQU5VUFMpOworCisgIGZvciAoaSA9IDA7IGkgPCBuZGlyOyBpKyspCisgICAgaWYgKCFTRVRfVE9QX0xFVkVMICgpKQorICAgICAgZGlyZWN0b3J5X2NvbW1hbmQgKGRpcmFyZ1tpXSwgMCk7CisgIGZyZWUgKChQVFIpZGlyYXJnKTsKKyAgZG9fY2xlYW51cHMgKEFMTF9DTEVBTlVQUyk7CisKKyAgaWYgKGV4ZWNhcmcgIT0gTlVMTAorICAgICAgJiYgc3ltYXJnICE9IE5VTEwKKyAgICAgICYmIFNUUkVRIChleGVjYXJnLCBzeW1hcmcpKQorICAgIHsKKyAgICAgIC8qIFRoZSBleGVjIGZpbGUgYW5kIHRoZSBzeW1ib2wtZmlsZSBhcmUgdGhlIHNhbWUuICBJZiB3ZSBjYW4ndCBvcGVuCisJIGl0LCBiZXR0ZXIgb25seSBwcmludCBvbmUgZXJyb3IgbWVzc2FnZS4gICovCisgICAgICBpZiAoIVNFVF9UT1BfTEVWRUwgKCkpCisJeworCSAgZXhlY19maWxlX2NvbW1hbmQgKGV4ZWNhcmcsICFiYXRjaCk7CisJICBzeW1ib2xfZmlsZV9jb21tYW5kIChzeW1hcmcsIDApOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoZXhlY2FyZyAhPSBOVUxMKQorCWlmICghU0VUX1RPUF9MRVZFTCAoKSkKKwkgIGV4ZWNfZmlsZV9jb21tYW5kIChleGVjYXJnLCAhYmF0Y2gpOworICAgICAgaWYgKHN5bWFyZyAhPSBOVUxMKQorCWlmICghU0VUX1RPUF9MRVZFTCAoKSkKKwkgIHN5bWJvbF9maWxlX2NvbW1hbmQgKHN5bWFyZywgMCk7CisgICAgfQorICBkb19jbGVhbnVwcyAoQUxMX0NMRUFOVVBTKTsKKworICAvKiBBZnRlciB0aGUgc3ltYm9sIGZpbGUgaGFzIGJlZW4gcmVhZCwgcHJpbnQgYSBuZXdsaW5lIHRvIGdldCB1cworICAgICBiZXlvbmQgdGhlIGNvcHlyaWdodCBsaW5lLi4uICBCdXQgZXJyb3JzIHNob3VsZCBzdGlsbCBzZXQgb2ZmCisgICAgIHRoZSBlcnJvciBtZXNzYWdlIHdpdGggYSAoc2luZ2xlKSBibGFuayBsaW5lLiAgKi8KKyAgaWYgKCFxdWlldCkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICBlcnJvcl9wcmVfcHJpbnQgPSAiXG4iOworICBxdWl0X3ByZV9wcmludCA9IGVycm9yX3ByZV9wcmludDsKKyAgd2FybmluZ19wcmVfcHJpbnQgPSAiXG53YXJuaW5nOiAiOworCisgIGlmIChjb3JlYXJnICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKCFTRVRfVE9QX0xFVkVMICgpKQorCWNvcmVfZmlsZV9jb21tYW5kIChjb3JlYXJnLCAhYmF0Y2gpOworICAgICAgZWxzZSBpZiAoaXNkaWdpdCAoY29yZWFyZ1swXSkgJiYgIVNFVF9UT1BfTEVWRUwgKCkpCisJYXR0YWNoX2NvbW1hbmQgKGNvcmVhcmcsICFiYXRjaCk7CisgICAgfQorICBkb19jbGVhbnVwcyAoQUxMX0NMRUFOVVBTKTsKKworICBpZiAodHR5YXJnICE9IE5VTEwpCisgICAgaWYgKCFTRVRfVE9QX0xFVkVMICgpKQorICAgICAgdHR5X2NvbW1hbmQgKHR0eWFyZywgIWJhdGNoKTsKKyAgZG9fY2xlYW51cHMgKEFMTF9DTEVBTlVQUyk7CisKKyNpZmRlZiBBRERJVElPTkFMX09QVElPTl9IQU5ETEVSCisgIEFERElUSU9OQUxfT1BUSU9OX0hBTkRMRVI7CisjZW5kaWYKKworICAvKiBFcnJvciBtZXNzYWdlcyBzaG91bGQgbm8gbG9uZ2VyIGJlIGRpc3Rpbmd1aXNoZWQgd2l0aCBleHRyYSBvdXRwdXQuICovCisgIGVycm9yX3ByZV9wcmludCA9IE5VTEw7CisgIHF1aXRfcHJlX3ByaW50ID0gTlVMTDsKKyAgd2FybmluZ19wcmVfcHJpbnQgPSAid2FybmluZzogIjsKKworICAvKiBSZWFkIHRoZSAuZ2RiaW5pdCBmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgKmlmKiBpdCBpc24ndAorICAgICB0aGUgc2FtZSBhcyB0aGUgJEhPTUUvLmdkYmluaXQgZmlsZSAoaXQgc2hvdWxkIGV4aXN0LCBhbHNvKS4gICovCisgIAorICBpZiAoIWhvbWVkaXIKKyAgICAgIHx8IG1lbWNtcCAoKGNoYXIgKikgJmhvbWVidWYsIChjaGFyICopICZjd2RidWYsIHNpemVvZiAoc3RydWN0IHN0YXQpKSkKKyAgICBpZiAoIWluaGliaXRfZ2RiaW5pdCkKKyAgICAgIHsKKwlpZiAoIVNFVF9UT1BfTEVWRUwgKCkpCisJICBzb3VyY2VfY29tbWFuZCAoZ2RiaW5pdCwgMCk7CisgICAgICB9CisgIGRvX2NsZWFudXBzIChBTExfQ0xFQU5VUFMpOworCisgIGZvciAoaSA9IDA7IGkgPCBuY21kOyBpKyspCisgICAgeworICAgICAgaWYgKCFTRVRfVE9QX0xFVkVMICgpKQorCXsKKwkgIGlmIChjbWRhcmdbaV1bMF0gPT0gJy0nICYmIGNtZGFyZ1tpXVsxXSA9PSAnXDAnKQorCSAgICByZWFkX2NvbW1hbmRfZmlsZSAoc3RkaW4pOworCSAgZWxzZQorCSAgICBzb3VyY2VfY29tbWFuZCAoY21kYXJnW2ldLCAhYmF0Y2gpOworCSAgZG9fY2xlYW51cHMgKEFMTF9DTEVBTlVQUyk7CisJfQorICAgIH0KKyAgZnJlZSAoKFBUUiljbWRhcmcpOworCisgIC8qIFJlYWQgaW4gdGhlIG9sZCBoaXN0b3J5IGFmdGVyIGFsbCB0aGUgY29tbWFuZCBmaWxlcyBoYXZlIGJlZW4gcmVhZC4gKi8KKyAgaW5pdF9oaXN0b3J5KCk7CisKKyAgaWYgKGJhdGNoKQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgaGl0IHRoZSBlbmQgb2YgdGhlIGJhdGNoIGZpbGUuICAqLworICAgICAgZXhpdCAoMCk7CisgICAgfQorCisgIC8qIERvIGFueSBob3N0LSBvciB0YXJnZXQtc3BlY2lmaWMgaGFja3MuICBUaGlzIGlzIHVzZWQgZm9yIGk5NjAgdGFyZ2V0cworICAgICB0byBmb3JjZSB0aGUgdXNlciB0byBzZXQgYSBuaW5keSB0YXJnZXQgYW5kIHNwZWMgaXRzIHBhcmFtZXRlcnMuICAqLworCisjaWZkZWYgQkVGT1JFX01BSU5fTE9PUF9IT09LCisgIEJFRk9SRV9NQUlOX0xPT1BfSE9PSzsKKyNlbmRpZgorCisgIEVORF9QUk9HUkVTUyAoYXJndlswXSk7CisKKyAgLyogU2hvdyB0aW1lIGFuZC9vciBzcGFjZSB1c2FnZS4gICovCisKKyAgaWYgKGRpc3BsYXlfdGltZSkKKyAgICB7CisgICAgICBsb25nIGluaXRfdGltZSA9IGdldF9ydW5fdGltZSAoKSAtIHRpbWVfYXRfc3RhcnR1cDsKKworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJTdGFydHVwIHRpbWU6ICVsZC4lMDZsZFxuIiwKKwkJCSBpbml0X3RpbWUgLyAxMDAwMDAwLCBpbml0X3RpbWUgJSAxMDAwMDAwKTsKKyAgICB9CisKKyAgaWYgKGRpc3BsYXlfc3BhY2UpCisgICAgeworI2lmZGVmIEhBVkVfU0JSSworICAgICAgZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworICAgICAgY2hhciAqbGltID0gKGNoYXIgKikgc2JyayAoMCk7CisKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiU3RhcnR1cCBzaXplOiBkYXRhIHNpemUgJWxkXG4iLAorCQkJIChsb25nKSAobGltIC0gKGNoYXIgKikgJmVudmlyb24pKTsKKyNlbmRpZgorICAgIH0KKworICAvKiBUaGUgZGVmYXVsdCBjb21tYW5kIGxvb3AuIAorICAgICBUaGUgV0lOMzIgR3VpIGNhbGxzIHRoaXMgbWFpbiB0byBzZXQgdXAgZ2RiJ3Mgc3RhdGUsIGFuZCAKKyAgICAgaGFzIGl0cyBvd24gY29tbWFuZCBsb29wLiAqLworI2lmICFkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fR05VQ19fCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGlmICghU0VUX1RPUF9MRVZFTCAoKSkKKwl7CisJICBkb19jbGVhbnVwcyAoQUxMX0NMRUFOVVBTKTsJCS8qIERvIGNvbXBsZXRlIGNsZWFudXAgKi8KKwkgIC8qIEdVSXMgZ2VuZXJhbGx5IGhhdmUgdGhlaXIgb3duIGNvbW1hbmQgbG9vcCwgbWFpbmxvb3AsIG9yIHdoYXRldmVyLgorCSAgICAgVGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gZ2FpbiBjb250cm9sIGJlY2F1c2UgbWFueSBlcnJvcgorCSAgICAgY29uZGl0aW9ucyB3aWxsIGVuZCB1cCBoZXJlIHZpYSBsb25nam1wKCkuICovCisJICBpZiAoY29tbWFuZF9sb29wX2hvb2spCisJICAgIGNvbW1hbmRfbG9vcF9ob29rICgpOworCSAgZWxzZQorCSAgICBjb21tYW5kX2xvb3AgKCk7CisgICAgICAgICAgcXVpdF9jb21tYW5kICgoY2hhciAqKTAsIGluc3RyZWFtID09IHN0ZGluKTsKKwl9CisgICAgfQorCisgIC8qIE5vIGV4aXQgLS0gZXhpdCBpcyB0aHJvdWdoIHF1aXRfY29tbWFuZC4gICovCisjZW5kaWYKKworfQorCisvKiBEb24ndCB1c2UgKl9maWx0ZXJlZCBmb3IgcHJpbnRpbmcgaGVscC4gIFdlIGRvbid0IHdhbnQgdG8gcHJvbXB0CisgICBmb3IgY29udGludWUgbm8gbWF0dGVyIGhvdyBzbWFsbCB0aGUgc2NyZWVuIG9yIGhvdyBtdWNoIHdlJ3JlIGdvaW5nCisgICB0byBwcmludC4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF9nZGJfaGVscCAoc3RyZWFtKQorICBHREJfRklMRSAqc3RyZWFtOworeworICAgICAgZnB1dHNfdW5maWx0ZXJlZCAoIlwKK1RoaXMgaXMgdGhlIEdOVSBkZWJ1Z2dlci4gIFVzYWdlOlxuXG5cCisgICAgZ2RiIFtvcHRpb25zXSBbZXhlY3V0YWJsZS1maWxlIFtjb3JlLWZpbGUgb3IgcHJvY2Vzcy1pZF1dXG5cblwKK09wdGlvbnM6XG5cblwKKyIsIHN0cmVhbSk7CisgICAgICBmcHV0c191bmZpbHRlcmVkICgiXAorICAtYiBCQVVEUkFURSAgICAgICAgU2V0IHNlcmlhbCBwb3J0IGJhdWQgcmF0ZSB1c2VkIGZvciByZW1vdGUgZGVidWdnaW5nLlxuXAorICAtLWJhdGNoICAgICAgICAgICAgRXhpdCBhZnRlciBwcm9jZXNzaW5nIG9wdGlvbnMuXG5cCisgIC0tY2Q9RElSICAgICAgICAgICBDaGFuZ2UgY3VycmVudCBkaXJlY3RvcnkgdG8gRElSLlxuXAorICAtLWNvbW1hbmQ9RklMRSAgICAgRXhlY3V0ZSBHREIgY29tbWFuZHMgZnJvbSBGSUxFLlxuXAorICAtLWNvcmU9Q09SRUZJTEUgICAgQW5hbHl6ZSB0aGUgY29yZSBkdW1wIENPUkVGSUxFLlxuXAorIiwgc3RyZWFtKTsKKyAgICAgIGZwdXRzX3VuZmlsdGVyZWQgKCJcCisgIC0tZGJ4ICAgICAgICAgICAgICBEQlggY29tcGF0aWJpbGl0eSBtb2RlLlxuXAorICAtLWRpcmVjdG9yeT1ESVIgICAgU2VhcmNoIGZvciBzb3VyY2UgZmlsZXMgaW4gRElSLlxuXAorICAtLWVwb2NoICAgICAgICAgICAgT3V0cHV0IGluZm9ybWF0aW9uIHVzZWQgYnkgZXBvY2ggZW1hY3MtR0RCIGludGVyZmFjZS5cblwKKyAgLS1leGVjPUVYRUNGSUxFICAgIFVzZSBFWEVDRklMRSBhcyB0aGUgZXhlY3V0YWJsZS5cblwKKyAgLS1mdWxsbmFtZSAgICAgICAgIE91dHB1dCBpbmZvcm1hdGlvbiB1c2VkIGJ5IGVtYWNzLUdEQiBpbnRlcmZhY2UuXG5cCisgIC0taGVscCAgICAgICAgICAgICBQcmludCB0aGlzIG1lc3NhZ2UuXG5cCisiLCBzdHJlYW0pOworICAgICAgZnB1dHNfdW5maWx0ZXJlZCAoIlwKKyAgLS1tYXBwZWQgICAgICAgICAgIFVzZSBtYXBwZWQgc3ltYm9sIGZpbGVzIGlmIHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbS5cblwKKyAgLS1udwkJICAgICBEbyBub3QgdXNlIGEgd2luZG93IGludGVyZmFjZS5cblwKKyAgLS1ueCAgICAgICAgICAgICAgIERvIG5vdCByZWFkIC5nZGJpbml0IGZpbGUuXG5cCisgIC0tcXVpZXQgICAgICAgICAgICBEbyBub3QgcHJpbnQgdmVyc2lvbiBudW1iZXIgb24gc3RhcnR1cC5cblwKKyAgLS1yZWFkbm93ICAgICAgICAgIEZ1bGx5IHJlYWQgc3ltYm9sIGZpbGVzIG9uIGZpcnN0IGFjY2Vzcy5cblwKKyIsIHN0cmVhbSk7CisgICAgICBmcHV0c191bmZpbHRlcmVkICgiXAorICAtLXNlPUZJTEUgICAgICAgICAgVXNlIEZJTEUgYXMgc3ltYm9sIGZpbGUgYW5kIGV4ZWN1dGFibGUgZmlsZS5cblwKKyAgLS1zeW1ib2xzPVNZTUZJTEUgIFJlYWQgc3ltYm9scyBmcm9tIFNZTUZJTEUuXG5cCisgIC0tdHR5PVRUWSAgICAgICAgICBVc2UgVFRZIGZvciBpbnB1dC9vdXRwdXQgYnkgdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQuXG5cCisiLCBzdHJlYW0pOworI2lmIGRlZmluZWQoVFVJKQorICAgICAgZnB1dHNfdW5maWx0ZXJlZCAoIlwKKyAgLS10dWkgICAgICAgICAgICAgIFVzZSBhIHRlcm1pbmFsIHVzZXIgaW50ZXJmYWNlLlxuXAorIiwgc3RyZWFtKTsKKyNlbmRpZgorICAgICAgZnB1dHNfdW5maWx0ZXJlZCAoIlwKKyAgLS12ZXJzaW9uICAgICAgICAgIFByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIHRoZW4gZXhpdC5cblwKKyAgLXcgICAgICAgICAgICAgICAgIFVzZSBhIHdpbmRvdyBpbnRlcmZhY2UuXG5cCisgIC0td3JpdGUgICAgICAgICAgICBTZXQgd3JpdGluZyBpbnRvIGV4ZWN1dGFibGUgYW5kIGNvcmUgZmlsZXMuXG5cCisgIC0teGRiICAgICAgICAgICAgICBYREIgY29tcGF0aWJpbGl0eSBtb2RlLlxuXAorIiwgc3RyZWFtKTsKKyNpZmRlZiBBRERJVElPTkFMX09QVElPTl9IRUxQCisgICAgICBmcHV0c191bmZpbHRlcmVkIChBRERJVElPTkFMX09QVElPTl9IRUxQLCBzdHJlYW0pOworI2VuZGlmCisgICAgICBmcHV0c191bmZpbHRlcmVkICgiXG5cCitGb3IgbW9yZSBpbmZvcm1hdGlvbiwgdHlwZSBcImhlbHBcIiBmcm9tIHdpdGhpbiBHREIsIG9yIGNvbnN1bHQgdGhlXG5cCitHREIgbWFudWFsIChhdmFpbGFibGUgYXMgb24tbGluZSBpbmZvIG9yIGEgcHJpbnRlZCBtYW51YWwpLlxuXAorUmVwb3J0IGJ1Z3MgdG8gXCJidWctZ2RiQHByZXAuYWkubWl0LmVkdVwiLlwKKyIsIHN0cmVhbSk7Cit9CisKKwwKK3ZvaWQKK2luaXRfcHJvYyAoKQoreworfQorCit2b2lkCitwcm9jX3JlbW92ZV9mb3JlaWduIChwaWQpCisgICAgIGludCBwaWQ7Cit7Cit9CisKKy8qIEFsbCBJL08gc2VudCB0byB0aGUgKl9maWx0ZXJlZCBhbmQgKl91bmZpbHRlcmVkIGZ1bmN0aW9ucyBldmVudHVhbGx5IGVuZHMgdXAKKyAgIGhlcmUuICBUaGUgZnB1dHNfdW5maWx0ZXJlZF9ob29rIGlzIHByaW1hcmlseSB1c2VkIGJ5IEdVSXMgdG8gY29sbGVjdCBhbGwKKyAgIG91dHB1dCBhbmQgc2VuZCBpdCB0byB0aGUgR1VJLCBpbnN0ZWFkIG9mIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbC4gIE9ubHkKKyAgIG91dHB1dCB0byBnZGJfc3Rkb3V0IGFuZCBnZGJfc3RkZXJyIGFyZSBzZW50IHRvIHRoZSBob29rLiAgRXZlcnl0aGluZyBlbHNlCisgICBpcyBzZW50IG9uIHRvIGZwdXRzIHRvIGFsbG93IGZpbGUgSS9PIHRvIGJlIGhhbmRsZWQgYXBwcm9wcmlhdGVseS4gICovCisKK3ZvaWQKK2ZwdXRzX3VuZmlsdGVyZWQgKGxpbmVidWZmZXIsIHN0cmVhbSkKKyAgICAgY29uc3QgY2hhciAqbGluZWJ1ZmZlcjsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyNpZiBkZWZpbmVkKFRVSSkKKyAgZXh0ZXJuIGludCB0dWlfb3duc190ZXJtaW5hbDsKKyNlbmRpZgorICAvKiBJZiBhbnl0aGluZyAoR1VJLCBUVUkpIHdhbnRzIHRvIGNhcHR1cmUgR0RCIG91dHB1dCwgdGhpcyBpcworICAgKiB0aGUgcGxhY2UuLi4gdGhlIHdheSB0byBkbyBpdCBpcyB0byBzZXQgdXAgCisgICAqIGZwdXRzX3VuZmlsdGVyZWRfaG9vay4KKyAgICogT3VyIFRVSSAoImdkYiAtdHVpIikgdXNlZCB0byBob29rIG91dHB1dCwgYnV0IGluIHRoZQorICAgKiBuZXcgKFhEQiBzdHlsZSkgc2NoZW1lLCB3ZSBkbyBub3QgZG8gdGhhdCBhbnltb3JlLi4uIC0gUlQKKyAgICovCisgIGlmIChmcHV0c191bmZpbHRlcmVkX2hvb2sKKyAgICAgICYmIChzdHJlYW0gPT0gZ2RiX3N0ZG91dAorCSAgfHwgc3RyZWFtID09IGdkYl9zdGRlcnIpKQorICAgIGZwdXRzX3VuZmlsdGVyZWRfaG9vayAobGluZWJ1ZmZlciwgc3RyZWFtKTsKKyAgZWxzZQorICAgIHsKKyNpZiBkZWZpbmVkKFRVSSkKKyAgICAgIGlmICh0dWlfdmVyc2lvbiAmJiB0dWlfb3duc190ZXJtaW5hbCkgeworCS8qIElmIHdlIGdldCBoZXJlIHNvbWVob3cgd2hpbGUgdXBkYXRpbmcgdGhlIFRVSSAoZnJvbQorCSAqIHdpdGhpbiBhIHR1aURvKCksIHRoZW4gd2UgbmVlZCB0byB0ZW1wb3JhcmlseSAKKwkgKiBzZXQgdXAgdGhlIHRlcm1pbmFsIGZvciBHREIgb3V0cHV0LiBUaGlzIHByb2JhYmx5IGp1c3QKKwkgKiBoYXBwZW5zIG9uIGVycm9yIG91dHB1dC4KKwkgKi8KKworICAgICAgICBpZiAoc3RyZWFtLT50c19zdHJlYW10eXBlID09IGFzdHJpbmcpIHsKKyAgICAgICAgICAgZ2RiX2ZpbGVfYWRqdXN0X3N0cmJ1ZihzdHJsZW4obGluZWJ1ZmZlciksIHN0cmVhbSk7CisgICAgICAgICAgIHN0cmNhdChzdHJlYW0tPnRzX3N0cmJ1ZiwgbGluZWJ1ZmZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIHR1aVRlcm1VbnNldHVwKDAsICh0dWlfdmVyc2lvbikgPyBjbWRXaW4tPmRldGFpbC5jb21tYW5kSW5mby5jdXJjaCA6IDApOworICAgICAgICAgICBmcHV0cyAobGluZWJ1ZmZlciwgc3RyZWFtLT50c19maWxlc3RyZWFtKTsKKyAgICAgICAgICAgdHVpVGVybVNldHVwKDApOworICAgICAgICAgICBpZiAobGluZWJ1ZmZlcltzdHJsZW4obGluZWJ1ZmZlcikgLSAxXSA9PSAnXG4nKQorICAgICAgICAgICAgICB0dWlDbGVhckNvbW1hbmRDaGFyQ291bnQoKTsKKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB0dWlJbmNyQ29tbWFuZENoYXJDb3VudEJ5KHN0cmxlbihsaW5lYnVmZmVyKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRoZSBub3JtYWwgY2FzZSAtIGp1c3QgZG8gYSBmcHV0cygpICovCisgICAgICAgIGlmIChzdHJlYW0tPnRzX3N0cmVhbXR5cGUgPT0gYXN0cmluZykgeworICAgICAgICAgICBnZGJfZmlsZV9hZGp1c3Rfc3RyYnVmKHN0cmxlbihsaW5lYnVmZmVyKSwgc3RyZWFtKTsKKyAgICAgICAgICAgc3RyY2F0KHN0cmVhbS0+dHNfc3RyYnVmLCBsaW5lYnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIGZwdXRzIChsaW5lYnVmZmVyLCBzdHJlYW0tPnRzX2ZpbGVzdHJlYW0pOworICAgICAgfQorIAorCisjZWxzZQorICAgICAgaWYgKHN0cmVhbS0+dHNfc3RyZWFtdHlwZSA9PSBhc3RyaW5nKSB7CisgICAgICAgICAgIGdkYl9maWxlX2FkanVzdF9zdHJidWYoc3RybGVuKGxpbmVidWZmZXIpLCBzdHJlYW0pOworICAgICAgICAgICBzdHJjYXQoc3RyZWFtLT50c19zdHJidWYsIGxpbmVidWZmZXIpOworICAgICAgICB9IGVsc2UgZnB1dHMgKGxpbmVidWZmZXIsIHN0cmVhbS0+dHNfZmlsZXN0cmVhbSk7CisjZW5kaWYKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9nZGIvbWFpbnQuYyBiL2dkYi9tYWludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNGNlYjcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbWFpbnQuYwpAQCAtMCwwICsxLDQ0OSBAQAorLyogU3VwcG9ydCBmb3IgR0RCIG1haW50ZW5hbmNlIGNvbW1hbmRzLgorICAgQ29weXJpZ2h0IDE5OTIsIDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBhdCBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNpbmNsdWRlICJkZWZzLmgiCisKKyNpZiBNQUlOVEVOQU5DRV9DTURTCS8qIEVudGlyZSByZXN0IG9mIGZpbGUgZ29lcyBhd2F5IGlmIG5vdCBpbmNsdWRpbmcgbWFpbnQgY21kcyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlICJjb21tYW5kLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJkZW1hbmdsZS5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiIC8qIEZvciBsYW5ndWFnZS5oICovCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIG1haW50ZW5hbmNlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgbWFpbnRlbmFuY2VfZHVtcF9tZSBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBtYWludGVuYW5jZV9kZW1hbmdsZSBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBtYWludGVuYW5jZV90aW1lX2Rpc3BsYXkgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgbWFpbnRlbmFuY2Vfc3BhY2VfZGlzcGxheSBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBtYWludGVuYW5jZV9pbmZvX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgcHJpbnRfc2VjdGlvbl90YWJsZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7CisKK3N0YXRpYyB2b2lkIG1haW50ZW5hbmNlX2luZm9fc2VjdGlvbnMgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgbWFpbnRlbmFuY2VfcHJpbnRfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCisvKiBTZXQgdGhpcyB0byB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGluc3RlYWQgb2Ygd2FpdGluZyBmb3JldmVyCisgICBpbiB0YXJnZXRfd2FpdCgpLiAgSWYgdGhpcyB0aW1lciB0aW1lcyBvdXQsIHRoZW4gaXQgZ2VuZXJhdGVzIGFuIGVycm9yIGFuZAorICAgdGhlIGNvbW1hbmQgaXMgYWJvcnRlZC4gIFRoaXMgcmVwbGFjZXMgbW9zdCBvZiB0aGUgbmVlZCBmb3IgdGltZW91dHMgaW4gdGhlCisgICBHREIgdGVzdCBzdWl0ZSwgYW5kIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBodW5nIHRhcmdldAorICAgYW5kIG9uZSB3aXRoIHNsb3cgY29tbXVuaWNhdGlvbnMuICAqLworCitpbnQgd2F0Y2hkb2cgPSAwOworCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJbWFpbnRlbmFuY2VfY29tbWFuZCAtLSBhY2Nlc3MgdGhlIG1haW50ZW5hbmNlIHN1YmNvbW1hbmRzCisKK1NZTk9QU0lTCisKKwl2b2lkIG1haW50ZW5hbmNlX2NvbW1hbmQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkKKworREVTQ1JJUFRJT04KKworKi8KKworc3RhdGljIHZvaWQKK21haW50ZW5hbmNlX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHByaW50Zl91bmZpbHRlcmVkICgiXCJtYWludGVuYW5jZVwiIG11c3QgYmUgZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgYSBtYWludGVuYW5jZSBjb21tYW5kLlxuIik7CisgIGhlbHBfbGlzdCAobWFpbnRlbmFuY2VsaXN0LCAibWFpbnRlbmFuY2UgIiwgLTEsIGdkYl9zdGRvdXQpOworfQorCisjaWZuZGVmIF9XSU4zMgorLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCittYWludGVuYW5jZV9kdW1wX21lIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAocXVlcnkgKCJTaG91bGQgR0RCIGR1bXAgY29yZT8gIikpCisgICAgeworICAgICAgc2lnbmFsIChTSUdRVUlULCBTSUdfREZMKTsKKyAgICAgIGtpbGwgKGdldHBpZCAoKSwgU0lHUVVJVCk7CisgICAgfQorfQorI2VuZGlmCisKKy8qICBTb21lZGF5IHdlIHNob3VsZCBhbGxvdyBkZW1hbmdsaW5nIGZvciB0aGluZ3Mgb3RoZXIgdGhhbiBqdXN0CisgICAgZXhwbGljaXQgc3RyaW5ncy4gIEZvciBleGFtcGxlLCB3ZSBtaWdodCB3YW50IHRvIGJlIGFibGUgdG8KKyAgICBzcGVjaWZ5IHRoZSBhZGRyZXNzIG9mIGEgc3RyaW5nIGluIGVpdGhlciBHREIncyBwcm9jZXNzIHNwYWNlCisgICAgb3IgdGhlIGRlYnVnZ2VlJ3MgcHJvY2VzcyBzcGFjZSwgYW5kIGhhdmUgZ2RiIGZldGNoIGFuZCBkZW1hbmdsZQorICAgIHRoYXQgc3RyaW5nLiAgSWYgd2UgaGF2ZSBhIGNoYXIqIHBvaW50ZXIgInB0ciIgdGhhdCBwb2ludHMgdG8KKyAgICBhIHN0cmluZywgd2UgbWlnaHQgd2FudCB0byBiZSBhYmxlIHRvIGdpdmVuIGp1c3QgdGhlIG5hbWUgYW5kCisgICAgaGF2ZSBHREIgZGVtYW5nbGUgYW5kIHByaW50IHdoYXQgaXQgcG9pbnRzIHRvLCBldGMuICAoRklYTUUpICovCisKK3N0YXRpYyB2b2lkCittYWludGVuYW5jZV9kZW1hbmdsZSAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgY2hhciAqZGVtYW5nbGVkOworCisgIGlmIChhcmdzID09IE5VTEwgfHwgKmFyZ3MgPT0gJ1wwJykKKyAgICB7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIlwibWFpbnRlbmFuY2UgZGVtYW5nbGVcIiB0YWtlcyBhbiBhcmd1bWVudCB0byBkZW1hbmdsZS5cbiIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRlbWFuZ2xlZCA9IGNwbHVzX2RlbWFuZ2xlIChhcmdzLCBETUdMX0FOU0kgfCBETUdMX1BBUkFNUyk7CisgICAgICBpZiAoZGVtYW5nbGVkICE9IE5VTEwpCisJeworCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlc1xuIiwgZGVtYW5nbGVkKTsKKwkgIGZyZWUgKGRlbWFuZ2xlZCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHByaW50Zl91bmZpbHRlcmVkICgiQ2FuJ3QgZGVtYW5nbGUgXCIlc1wiXG4iLCBhcmdzKTsKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorbWFpbnRlbmFuY2VfdGltZV9kaXNwbGF5IChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBleHRlcm4gaW50IGRpc3BsYXlfdGltZTsKKworICBpZiAoYXJncyA9PSBOVUxMIHx8ICphcmdzID09ICdcMCcpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcIm1haW50ZW5hbmNlIHRpbWVcIiB0YWtlcyBhIG51bWVyaWMgYXJndW1lbnQuXG4iKTsKKyAgZWxzZQorICAgIGRpc3BsYXlfdGltZSA9IHN0cnRvbCAoYXJncywgTlVMTCwgMTApOworfQorCitzdGF0aWMgdm9pZAorbWFpbnRlbmFuY2Vfc3BhY2VfZGlzcGxheSAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZXh0ZXJuIGludCBkaXNwbGF5X3NwYWNlOworCisgIGlmIChhcmdzID09IE5VTEwgfHwgKmFyZ3MgPT0gJ1wwJykKKyAgICBwcmludGZfdW5maWx0ZXJlZCAoIlwibWFpbnRlbmFuY2Ugc3BhY2VcIiB0YWtlcyBhIG51bWVyaWMgYXJndW1lbnQuXG4iKTsKKyAgZWxzZQorICAgIGRpc3BsYXlfc3BhY2UgPSBzdHJ0b2wgKGFyZ3MsIE5VTEwsIDEwKTsKK30KKworLyogVGhlICJtYWludGVuYW5jZSBpbmZvIiBjb21tYW5kIGlzIGRlZmluZWQgYXMgYSBwcmVmaXgsIHdpdGggYWxsb3dfdW5rbm93biAwLgorICAgVGhlcmVmb3JlLCBpdHMgb3duIGRlZmluaXRpb24gaXMgY2FsbGVkIG9ubHkgZm9yICJtYWludGVuYW5jZSBpbmZvIiB3aXRoCisgICBubyBhcmdzLiAgKi8KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCittYWludGVuYW5jZV9pbmZvX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBwcmludGZfdW5maWx0ZXJlZCAoIlwibWFpbnRlbmFuY2UgaW5mb1wiIG11c3QgYmUgZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgYW4gaW5mbyBjb21tYW5kLlxuIik7CisgIGhlbHBfbGlzdCAobWFpbnRlbmFuY2VpbmZvbGlzdCwgIm1haW50ZW5hbmNlIGluZm8gIiwgLTEsIGdkYl9zdGRvdXQpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfc2VjdGlvbl90YWJsZSAoYWJmZCwgYXNlY3QsIGlnbm9yZSkKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqYXNlY3Q7CisgICAgIFBUUiBpZ25vcmU7Cit7CisgIGZsYWd3b3JkIGZsYWdzOworCisgIGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBhc2VjdCk7CisKKyAgLyogRklYTUUtMzJ4NjQ6IE5lZWQgcHJpbnRfYWRkcmVzc19udW1lcmljIHdpdGggZmllbGQgd2lkdGguICAqLworICBwcmludGZfZmlsdGVyZWQgKCIgICAgJXMiLAorCQkgICBsb2NhbF9oZXhfc3RyaW5nX2N1c3RvbQorCQkgICAgICgodW5zaWduZWQgbG9uZykgYmZkX3NlY3Rpb25fdm1hIChhYmZkLCBhc2VjdCksICIwOGwiKSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIi0+JXMiLAorCQkgICBsb2NhbF9oZXhfc3RyaW5nX2N1c3RvbQorCQkgICAgICgodW5zaWduZWQgbG9uZykgKGJmZF9zZWN0aW9uX3ZtYSAoYWJmZCwgYXNlY3QpCisJCQkJICAgICAgICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgYXNlY3QpKSwKKwkJICAgICAgIjA4bCIpKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiIGF0ICVzIiwKKwkJICAgbG9jYWxfaGV4X3N0cmluZ19jdXN0b20KKwkJICAgICAoKHVuc2lnbmVkIGxvbmcpIGFzZWN0LT5maWxlcG9zLCAiMDhsIikpOworICBwcmludGZfZmlsdGVyZWQgKCI6ICVzIiwgYmZkX3NlY3Rpb25fbmFtZSAoYWJmZCwgYXNlY3QpKTsKKworICBpZiAoZmxhZ3MgJiBTRUNfQUxMT0MpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiIEFMTE9DIik7CisgIGlmIChmbGFncyAmIFNFQ19MT0FEKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIiBMT0FEIik7CisgIGlmIChmbGFncyAmIFNFQ19SRUxPQykKKyAgICBwcmludGZfZmlsdGVyZWQgKCIgUkVMT0MiKTsKKyAgaWYgKGZsYWdzICYgU0VDX1JFQURPTkxZKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIiBSRUFET05MWSIpOworICBpZiAoZmxhZ3MgJiBTRUNfQ09ERSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIgQ09ERSIpOworICBpZiAoZmxhZ3MgJiBTRUNfREFUQSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIgREFUQSIpOworICBpZiAoZmxhZ3MgJiBTRUNfUk9NKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIiBST00iKTsKKyAgaWYgKGZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIiBDT05TVFJVQ1RPUiIpOworICBpZiAoZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIiBIQVNfQ09OVEVOVFMiKTsKKyAgaWYgKGZsYWdzICYgU0VDX05FVkVSX0xPQUQpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiIE5FVkVSX0xPQUQiKTsKKyAgaWYgKGZsYWdzICYgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiIENPRkZfU0hBUkVEX0xJQlJBUlkiKTsKKyAgaWYgKGZsYWdzICYgU0VDX0lTX0NPTU1PTikKKyAgICBwcmludGZfZmlsdGVyZWQgKCIgSVNfQ09NTU9OIik7CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCittYWludGVuYW5jZV9pbmZvX3NlY3Rpb25zIChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaWYgKGV4ZWNfYmZkKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkV4ZWMgZmlsZTpcbiIpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIGAlcycsICIsIGJmZF9nZXRfZmlsZW5hbWUoZXhlY19iZmQpKTsKKyAgICAgIHdyYXBfaGVyZSAoIiAgICAgICAgIik7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJmaWxlIHR5cGUgJXMuXG4iLCBiZmRfZ2V0X3RhcmdldChleGVjX2JmZCkpOworICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zKGV4ZWNfYmZkLCBwcmludF9zZWN0aW9uX3RhYmxlLCAwKTsKKyAgICB9CisKKyAgaWYgKGNvcmVfYmZkKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkNvcmUgZmlsZTpcbiIpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiICAgIGAlcycsICIsIGJmZF9nZXRfZmlsZW5hbWUoY29yZV9iZmQpKTsKKyAgICAgIHdyYXBfaGVyZSAoIiAgICAgICAgIik7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJmaWxlIHR5cGUgJXMuXG4iLCBiZmRfZ2V0X3RhcmdldChjb3JlX2JmZCkpOworICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zKGNvcmVfYmZkLCBwcmludF9zZWN0aW9uX3RhYmxlLCAwKTsKKyAgICB9Cit9CisKKy8qIEFSR1NVU0VEICovCit2b2lkCittYWludGVuYW5jZV9wcmludF9zdGF0aXN0aWNzIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBwcmludF9vYmpmaWxlX3N0YXRpc3RpY3MgKCk7CisgIHByaW50X3N5bWJvbF9iY2FjaGVfc3RhdGlzdGljcyAoKTsKK30KKworLyogVGhlICJtYWludGVuYW5jZSBwcmludCIgY29tbWFuZCBpcyBkZWZpbmVkIGFzIGEgcHJlZml4LCB3aXRoIGFsbG93X3Vua25vd24KKyAgIDAuICBUaGVyZWZvcmUsIGl0cyBvd24gZGVmaW5pdGlvbiBpcyBjYWxsZWQgb25seSBmb3IgIm1haW50ZW5hbmNlIHByaW50IgorICAgd2l0aCBubyBhcmdzLiAgKi8KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCittYWludGVuYW5jZV9wcmludF9jb21tYW5kIChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcIm1haW50ZW5hbmNlIHByaW50XCIgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiBhIHByaW50IGNvbW1hbmQuXG4iKTsKKyAgaGVscF9saXN0IChtYWludGVuYW5jZXByaW50bGlzdCwgIm1haW50ZW5hbmNlIHByaW50ICIsIC0xLCBnZGJfc3Rkb3V0KTsKK30KKworLyogVGhlICJtYWludGVuYW5jZSB0cmFuc2xhdGUtYWRkcmVzcyIgY29tbWFuZCBjb252ZXJ0cyBhIHNlY3Rpb24gYW5kIGFkZHJlc3MKKyAgIHRvIGEgc3ltYm9sLiAgVGhpcyBjYW4gYmUgY2FsbGVkIGluIHR3byB3YXlzOgorCQltYWludGVuYW5jZSB0cmFuc2xhdGUtYWRkcmVzcyA8c2VjbmFtZT4gPGFkZHI+CisJb3IJbWFpbnRlbmFuY2UgdHJhbnNsYXRlLWFkZHJlc3MgPGFkZHI+CisqLworCitzdGF0aWMgdm9pZAorbWFpbnRlbmFuY2VfdHJhbnNsYXRlX2FkZHJlc3MgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBDT1JFX0FERFIgYWRkcmVzczsKKyAgYXNlY3Rpb24gKnNlY3Q7CisgIGNoYXIgKnA7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqc3ltOworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKworICBpZiAoYXJnID09IE5VTEwgfHwgKmFyZyA9PSAwKQorICAgIGVycm9yICgicmVxdWlyZXMgYXJndW1lbnQgKGFkZHJlc3Mgb3Igc2VjdGlvbiArIGFkZHJlc3MpIik7CisKKyAgc2VjdCA9IE5VTEw7CisgIHAgPSBhcmc7CisKKyAgaWYgKCFpc2RpZ2l0ICgqcCkpCisgICAgewkJCQkvKiBTZWUgaWYgd2UgaGF2ZSBhIHZhbGlkIHNlY3Rpb24gbmFtZSAqLworICAgICAgd2hpbGUgKCpwICYmICFpc3NwYWNlICgqcCkpIC8qIEZpbmQgZW5kIG9mIHNlY3Rpb24gbmFtZSAqLworCXArKzsKKyAgICAgIGlmICgqcCA9PSAnXDAwMCcpCQkvKiBFbmQgb2YgY29tbWFuZD8gKi8KKwllcnJvciAoIk5lZWQgdG8gc3BlY2lmeSA8c2VjdGlvbi1uYW1lPiBhbmQgPGFkZHJlc3M+Iik7CisgICAgICAqcCsrID0gJ1wwMDAnOworICAgICAgd2hpbGUgKGlzc3BhY2UgKCpwKSkgcCsrOwkvKiBTa2lwIHdoaXRlc3BhY2UgKi8KKworICAgICAgQUxMX09CSkZJTEVTIChvYmpmaWxlKQorCXsKKwkgIHNlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob2JqZmlsZS0+b2JmZCwgYXJnKTsKKwkgIGlmIChzZWN0ICE9IE5VTEwpCisJICAgIGJyZWFrOworCX0KKworICAgICAgaWYgKCFzZWN0KQorCWVycm9yICgiVW5rbm93biBzZWN0aW9uICVzLiIsIGFyZyk7CisgICAgfQorCisgIGFkZHJlc3MgPSBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIChwKTsKKworICBpZiAoc2VjdCkKKyAgICBzeW0gPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGNfc2VjdGlvbiAoYWRkcmVzcywgc2VjdCk7CisgIGVsc2UKKyAgICBzeW0gPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGMgKGFkZHJlc3MpOworCisgIGlmIChzeW0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiJXMrJXVcbiIsIAorCQkgICAgIFNZTUJPTF9TT1VSQ0VfTkFNRSAoc3ltKSwgCisJCSAgICAgYWRkcmVzcyAtIFNZTUJPTF9WQUxVRV9BRERSRVNTIChzeW0pKTsKKyAgZWxzZSBpZiAoc2VjdCkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJubyBzeW1ib2wgYXQgJXM6MHglMDh4XG4iLCBzZWN0LT5uYW1lLCBhZGRyZXNzKTsKKyAgZWxzZQorICAgIHByaW50Zl9maWx0ZXJlZCAoIm5vIHN5bWJvbCBhdCAweCUwOHhcbiIsIGFkZHJlc3MpOworCisgIHJldHVybjsKK30KKworI2VuZGlmCS8qIE1BSU5URU5BTkNFX0NNRFMgKi8KKwordm9pZAorX2luaXRpYWxpemVfbWFpbnRfY21kcyAoKQoreworI2lmIE1BSU5URU5BTkNFX0NNRFMJLyogRW50aXJlIGZpbGUgZ29lcyBhd2F5IGlmIG5vdCBpbmNsdWRpbmcgbWFpbnQgY21kcyAqLworICBhZGRfcHJlZml4X2NtZCAoIm1haW50ZW5hbmNlIiwgY2xhc3NfbWFpbnRlbmFuY2UsIG1haW50ZW5hbmNlX2NvbW1hbmQsCisJCSAgIkNvbW1hbmRzIGZvciB1c2UgYnkgR0RCIG1haW50YWluZXJzLlxuXAorSW5jbHVkZXMgY29tbWFuZHMgdG8gZHVtcCBzcGVjaWZpYyBpbnRlcm5hbCBHREIgc3RydWN0dXJlcyBpblxuXAorYSBodW1hbiByZWFkYWJsZSBmb3JtLCB0byBjYXVzZSBHREIgdG8gZGVsaWJlcmF0ZWx5IGR1bXAgY29yZSxcblwKK3RvIHRlc3QgaW50ZXJuYWwgZnVuY3Rpb25zIHN1Y2ggYXMgdGhlIEMrKyBkZW1hbmdsZXIsIGV0Yy4iLAorCQkgICZtYWludGVuYW5jZWxpc3QsICJtYWludGVuYW5jZSAiLCAwLAorCQkgICZjbWRsaXN0KTsKKworICBhZGRfY29tX2FsaWFzICgibXQiLCAibWFpbnRlbmFuY2UiLCBjbGFzc19tYWludGVuYW5jZSwgMSk7CisKKyAgYWRkX3ByZWZpeF9jbWQgKCJpbmZvIiwgY2xhc3NfbWFpbnRlbmFuY2UsIG1haW50ZW5hbmNlX2luZm9fY29tbWFuZCwKKwkJICAiQ29tbWFuZHMgZm9yIHNob3dpbmcgaW50ZXJuYWwgaW5mbyBhYm91dCB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZC4iLAorCQkgICZtYWludGVuYW5jZWluZm9saXN0LCAibWFpbnRlbmFuY2UgaW5mbyAiLCAwLAorCQkgICZtYWludGVuYW5jZWxpc3QpOworCisgIGFkZF9jbWQgKCJzZWN0aW9ucyIsIGNsYXNzX21haW50ZW5hbmNlLCBtYWludGVuYW5jZV9pbmZvX3NlY3Rpb25zLAorCSAgICJMaXN0IHRoZSBCRkQgc2VjdGlvbnMgb2YgdGhlIGV4ZWMgYW5kIGNvcmUgZmlsZXMuIiwKKwkgICAmbWFpbnRlbmFuY2VpbmZvbGlzdCk7CisKKyAgYWRkX3ByZWZpeF9jbWQgKCJwcmludCIsIGNsYXNzX21haW50ZW5hbmNlLCBtYWludGVuYW5jZV9wcmludF9jb21tYW5kLAorCQkgICJNYWludGVuYW5jZSBjb21tYW5kIGZvciBwcmludGluZyBHREIgaW50ZXJuYWwgc3RhdGUuIiwKKwkJICAmbWFpbnRlbmFuY2VwcmludGxpc3QsICJtYWludGVuYW5jZSBwcmludCAiLCAwLAorCQkgICZtYWludGVuYW5jZWxpc3QpOworCisjaWZuZGVmIF9XSU4zMgorICBhZGRfY21kICgiZHVtcC1tZSIsIGNsYXNzX21haW50ZW5hbmNlLCBtYWludGVuYW5jZV9kdW1wX21lLAorCSAgICJHZXQgZmF0YWwgZXJyb3I7IG1ha2UgZGVidWdnZXIgZHVtcCBpdHMgY29yZS5cblwKK0dEQiBzZXRzIGl0J3MgaGFuZGxpbmcgb2YgU0lHUVVJVCBiYWNrIHRvIFNJR19ERkwgYW5kIHRoZW4gc2VuZHNcblwKK2l0c2VsZiBhIFNJR1FVSVQgc2lnbmFsLiIsCisJICAgJm1haW50ZW5hbmNlbGlzdCk7CisjZW5kaWYKKworICBhZGRfY21kICgiZGVtYW5nbGUiLCBjbGFzc19tYWludGVuYW5jZSwgbWFpbnRlbmFuY2VfZGVtYW5nbGUsCisJICAgIkRlbWFuZ2xlIGEgQysrIG1hbmdsZWQgbmFtZS5cblwKK0NhbGwgaW50ZXJuYWwgR0RCIGRlbWFuZ2xlciByb3V0aW5lIHRvIGRlbWFuZ2xlIGEgQysrIGxpbmsgbmFtZVxuXAorYW5kIHByaW50cyB0aGUgcmVzdWx0LiIsCisJICAgJm1haW50ZW5hbmNlbGlzdCk7CisKKyAgYWRkX2NtZCAoInRpbWUiLCBjbGFzc19tYWludGVuYW5jZSwgbWFpbnRlbmFuY2VfdGltZV9kaXNwbGF5LAorCSAgICJTZXQgdGhlIGRpc3BsYXkgb2YgdGltZSB1c2FnZS5cblwKK0lmIG5vbnplcm8sIHdpbGwgY2F1c2UgdGhlIGV4ZWN1dGlvbiB0aW1lIGZvciBlYWNoIGNvbW1hbmQgdG8gYmVcblwKK2Rpc3BsYXllZCwgZm9sbG93aW5nIHRoZSBjb21tYW5kJ3Mgb3V0cHV0LiIsCisJICAgJm1haW50ZW5hbmNlbGlzdCk7CisKKyAgYWRkX2NtZCAoInNwYWNlIiwgY2xhc3NfbWFpbnRlbmFuY2UsIG1haW50ZW5hbmNlX3NwYWNlX2Rpc3BsYXksCisJICAgIlNldCB0aGUgZGlzcGxheSBvZiBzcGFjZSB1c2FnZS5cblwKK0lmIG5vbnplcm8sIHdpbGwgY2F1c2UgdGhlIGV4ZWN1dGlvbiBzcGFjZSBmb3IgZWFjaCBjb21tYW5kIHRvIGJlXG5cCitkaXNwbGF5ZWQsIGZvbGxvd2luZyB0aGUgY29tbWFuZCdzIG91dHB1dC4iLAorCSAgICZtYWludGVuYW5jZWxpc3QpOworCisgIGFkZF9jbWQgKCJ0eXBlIiwgY2xhc3NfbWFpbnRlbmFuY2UsIG1haW50ZW5hbmNlX3ByaW50X3R5cGUsCisJICAgIlByaW50IGEgdHlwZSBjaGFpbiBmb3IgYSBnaXZlbiBzeW1ib2wuXG5cCitGb3IgZWFjaCBub2RlIGluIGEgdHlwZSBjaGFpbiwgcHJpbnQgdGhlIHJhdyBkYXRhIGZvciBlYWNoIG1lbWJlciBvZlxuXAordGhlIHR5cGUgc3RydWN0dXJlLCBhbmQgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBkYXRhLiIsCisJICAgJm1haW50ZW5hbmNlcHJpbnRsaXN0KTsKKworICBhZGRfY21kICgic3ltYm9scyIsIGNsYXNzX21haW50ZW5hbmNlLCBtYWludGVuYW5jZV9wcmludF9zeW1ib2xzLAorCSAgICJQcmludCBkdW1wIG9mIGN1cnJlbnQgc3ltYm9sIGRlZmluaXRpb25zLlxuXAorRW50cmllcyBpbiB0aGUgZnVsbCBzeW1ib2wgdGFibGUgYXJlIGR1bXBlZCB0byBmaWxlIE9VVEZJTEUuXG5cCitJZiBhIFNPVVJDRSBmaWxlIGlzIHNwZWNpZmllZCwgZHVtcCBvbmx5IHRoYXQgZmlsZSdzIHN5bWJvbHMuIiwKKwkgICAmbWFpbnRlbmFuY2VwcmludGxpc3QpOworCisgIGFkZF9jbWQgKCJtc3ltYm9scyIsIGNsYXNzX21haW50ZW5hbmNlLCBtYWludGVuYW5jZV9wcmludF9tc3ltYm9scywKKwkgICAiUHJpbnQgZHVtcCBvZiBjdXJyZW50IG1pbmltYWwgc3ltYm9sIGRlZmluaXRpb25zLlxuXAorRW50cmllcyBpbiB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGUgYXJlIGR1bXBlZCB0byBmaWxlIE9VVEZJTEUuXG5cCitJZiBhIFNPVVJDRSBmaWxlIGlzIHNwZWNpZmllZCwgZHVtcCBvbmx5IHRoYXQgZmlsZSdzIG1pbmltYWwgc3ltYm9scy4iLAorCSAgICZtYWludGVuYW5jZXByaW50bGlzdCk7CisKKyAgYWRkX2NtZCAoInBzeW1ib2xzIiwgY2xhc3NfbWFpbnRlbmFuY2UsIG1haW50ZW5hbmNlX3ByaW50X3BzeW1ib2xzLAorCSAgICJQcmludCBkdW1wIG9mIGN1cnJlbnQgcGFydGlhbCBzeW1ib2wgZGVmaW5pdGlvbnMuXG5cCitFbnRyaWVzIGluIHRoZSBwYXJ0aWFsIHN5bWJvbCB0YWJsZSBhcmUgZHVtcGVkIHRvIGZpbGUgT1VURklMRS5cblwKK0lmIGEgU09VUkNFIGZpbGUgaXMgc3BlY2lmaWVkLCBkdW1wIG9ubHkgdGhhdCBmaWxlJ3MgcGFydGlhbCBzeW1ib2xzLiIsCisJICAgJm1haW50ZW5hbmNlcHJpbnRsaXN0KTsKKworICBhZGRfY21kICgib2JqZmlsZXMiLCBjbGFzc19tYWludGVuYW5jZSwgbWFpbnRlbmFuY2VfcHJpbnRfb2JqZmlsZXMsCisJICAgIlByaW50IGR1bXAgb2YgY3VycmVudCBvYmplY3QgZmlsZSBkZWZpbml0aW9ucy4iLAorCSAgICZtYWludGVuYW5jZXByaW50bGlzdCk7CisKKyAgYWRkX2NtZCAoInN0YXRpc3RpY3MiLCBjbGFzc19tYWludGVuYW5jZSwgbWFpbnRlbmFuY2VfcHJpbnRfc3RhdGlzdGljcywKKwkgICAiUHJpbnQgc3RhdGlzdGljcyBhYm91dCBpbnRlcm5hbCBnZGIgc3RhdGUuIiwKKwkgICAmbWFpbnRlbmFuY2VwcmludGxpc3QpOworCisgIGFkZF9jbWQgKCJjaGVjay1zeW10YWJzIiwgY2xhc3NfbWFpbnRlbmFuY2UsIG1haW50ZW5hbmNlX2NoZWNrX3N5bXRhYnMsCisJICAgIkNoZWNrIGNvbnNpc3RlbmN5IG9mIHBzeW10YWJzIGFuZCBzeW10YWJzLiIsCisJICAgJm1haW50ZW5hbmNlbGlzdCk7CisKKyAgYWRkX2NtZCAoInRyYW5zbGF0ZS1hZGRyZXNzIiwgY2xhc3NfbWFpbnRlbmFuY2UsIG1haW50ZW5hbmNlX3RyYW5zbGF0ZV9hZGRyZXNzLAorCSAgICJUcmFuc2xhdGUgYSBzZWN0aW9uIG5hbWUgYW5kIGFkZHJlc3MgdG8gYSBzeW1ib2wuIiwKKwkgICAmbWFpbnRlbmFuY2VsaXN0KTsKKworICBhZGRfc2hvd19mcm9tX3NldCAoCisgICAgYWRkX3NldF9jbWQgKCJ3YXRjaGRvZyIsIGNsYXNzX21haW50ZW5hbmNlLCB2YXJfemludGVnZXIsIChjaGFyICopJndhdGNoZG9nLAorCQkgIlNldCB3YXRjaGRvZyB0aW1lci5cblwKK1doZW4gbm9uLXplcm8sIHRoaXMgdGltZW91dCBpcyB1c2VkIGluc3RlYWQgb2Ygd2FpdGluZyBmb3JldmVyIGZvciBhIHRhcmdldCB0b1xuXAorZmluaXNoIGEgbG93LWxldmVsIHN0ZXAgb3IgY29udGludWUgb3BlcmF0aW9uLiAgSWYgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZVxuXAorcGFzc2VzIHdpdGhvdXQgYSByZXNwb25zZSBmcm9tIHRoZSB0YXJnZXQsIGFuIGVycm9yIG9jY3Vycy4iLCAmc2V0bGlzdCksCisJCSAgICAgJnNob3dsaXN0KTsKKyNlbmRpZgkvKiBNQUlOVEVOQU5DRV9DTURTICovCit9CmRpZmYgLS1naXQgYS9nZGIvbWRlYnVncmVhZC5jIGIvZ2RiL21kZWJ1Z3JlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDY0NDkwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL21kZWJ1Z3JlYWQuYwpAQCAtMCwwICsxLDQ1NDQgQEAKKy8qIFJlYWQgYSBzeW1ib2wgdGFibGUgaW4gRUNPRkYgZm9ybWF0IChUaGlyZC1FeWUpLgorICAgQ29weXJpZ2h0IDE5ODYsIDg3LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIE9yaWdpbmFsIHZlcnNpb24gY29udHJpYnV0ZWQgYnkgQWxlc3NhbmRybyBGb3JpbiAoYWZAY3MuY211LmVkdSkgYXQKKyAgIENNVS4gIE1ham9yIHdvcmsgYnkgUGVyIEJvdGhuZXIsIEpvaG4gR2lsbW9yZSBhbmQgSWFuIExhbmNlIFRheWxvcgorICAgYXQgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGZ1bmN0aW9uIG1kZWJ1Z19idWlsZF9wc3ltdGFicy4gIEl0IHJlYWRzCisgICBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW50byBwYXJ0aWFsIHN5bWJvbCB0YWJsZXMuICBUaGUKKyAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyByZWFkIGZyb20gdHdvIHN0cnVjdHVyZXMuICBBIHN0cnVjdAorICAgZWNvZmZfZGVidWdfc3dhcCBpbmNsdWRlcyB0aGUgc2l6ZXMgb2YgZWFjaCBFQ09GRiBzdHJ1Y3R1cmUgYW5kCisgICBzd2FwcGluZyByb3V0aW5lczsgdGhlc2UgYXJlIGZpeGVkIGZvciBhIHBhcnRpY3VsYXIgdGFyZ2V0LiAgQQorICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gcG9pbnRzIHRvIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGEKKyAgIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUuCisKKyAgIEVDT0ZGIHN5bWJvbCB0YWJsZXMgYXJlIG1vc3RseSB3cml0dGVuIGluIHRoZSBieXRlIG9yZGVyIG9mIHRoZQorICAgdGFyZ2V0IG1hY2hpbmUuICBIb3dldmVyLCBvbmUgc2VjdGlvbiBvZiB0aGUgdGFibGUgKHRoZSBhdXhpbGlhcnkKKyAgIHN5bWJvbCBpbmZvcm1hdGlvbikgaXMgd3JpdHRlbiBpbiB0aGUgaG9zdCBieXRlIG9yZGVyLiAgVGhlcmUgaXMgYQorICAgYml0IGluIHRoZSBvdGhlciBzeW1ib2wgaW5mbyB3aGljaCBkZXNjcmliZXMgd2hpY2ggaG9zdCBieXRlIG9yZGVyCisgICB3YXMgdXNlZC4gIEVDT0ZGIHRoZXJlYnkgdGFrZXMgdGhlIHRyb3BoeSBmcm9tIEludGVsIGBiLm91dCcgZm9yCisgICB0aGUgbW9zdCBicmFpbi1kZWFkIGFkYXB0YXRpb24gb2YgYSBmaWxlIGZvcm1hdCB0byBieXRlIG9yZGVyLgorCisgICBUaGlzIG1vZHVsZSBjYW4gcmVhZCBhbGwgZm91ciBvZiB0aGUga25vd24gYnl0ZS1vcmRlciBjb21iaW5hdGlvbnMsCisgICBvbiBhbnkgdHlwZSBvZiBob3N0LiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJvYnN0YWNrLmgiCisjaW5jbHVkZSAiYnVpbGRzeW0uaCIKKyNpbmNsdWRlICJzdGFic3JlYWQuaCIKKyNpbmNsdWRlICJjb21wbGFpbnRzLmgiCisjaW5jbHVkZSAiZGVtYW5nbGUuaCIKKworLyogVGhlc2UgYXJlIG5lZWRlZCBpZiB0aGUgdG0uaCBmaWxlIGRvZXMgbm90IGNvbnRhaW4gdGhlIG5lY2Vzc2FyeQorICAgbWlwcyBzcGVjaWZpYyBkZWZpbml0aW9ucy4gICovCisKKyNpZm5kZWYgTUlQU19FRklfU1lNQk9MX05BTUUKKyNkZWZpbmUgTUlQU19FRklfU1lNQk9MX05BTUUgIl9fR0RCX0VGSV9JTkZPX18iCitleHRlcm4gdm9pZCBlY29mZl9yZWxvY2F0ZV9lZmkgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqLCBDT1JFX0FERFIpKTsKKyNpbmNsdWRlICJjb2ZmL3N5bS5oIgorI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKK3R5cGVkZWYgc3RydWN0IG1pcHNfZXh0cmFfZnVuY19pbmZvIHsKKyAgICAgICAgbG9uZyAgICBudW1hcmdzOworICAgICAgICBQRFIgICAgIHBkcjsKK30gKm1pcHNfZXh0cmFfZnVuY19pbmZvX3Q7CisjaWZuZGVmIFJBX1JFR05VTQorI2RlZmluZSBSQV9SRUdOVU0gMAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFVTRworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnZGJfc3RhdC5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKworI2luY2x1ZGUgImdkYi1zdGFicy5oIgorCisjaW5jbHVkZSAiYmZkLmgiCisKKyNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCQkvKiBDT0ZGLWxpa2UgYXNwZWN0cyBvZiBlY29mZiBmaWxlcyAqLworCisjaW5jbHVkZSAibGliYW91dC5oIgkJLyogUHJpdmF0ZSBCRkQgYS5vdXQgaW5mb3JtYXRpb24uICAqLworI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCisjaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgkvKiBTVEFCUyBpbmZvcm1hdGlvbiAqLworCisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCQkvKiBOZWVkZWQgaW5zaWRlIHBhcnRpYWwtc3RhYi5oICovCisKKworLyogUHJvdmlkZSBhIGRlZmF1bHQgbWFwcGluZyBmcm9tIGEgZWNvZmYgcmVnaXN0ZXIgbnVtYmVyIHRvIGEgZ2RiIFJFR05VTS4gICovCisjaWZuZGVmIEVDT0ZGX1JFR19UT19SRUdOVU0KKyNkZWZpbmUgRUNPRkZfUkVHX1RPX1JFR05VTShudW0pIChudW0pCisjZW5kaWYKKworLyogUHJvdmlkZSBhIHdheSB0byB0ZXN0IGlmIHdlIGhhdmUgYm90aCBFQ09GRiBhbmQgRUxGIHN5bWJvbCB0YWJsZXMuICAKKyAgIFdlIHVzZSB0aGlzIGRlZmluZSBpbiBvcmRlciB0byBrbm93IHdoZXRoZXIgd2Ugc2hvdWxkIG92ZXJyaWRlIGEgCisgICBzeW1ib2wncyBFQ09GRiBzZWN0aW9uIHdpdGggaXRzIEVMRiBzZWN0aW9uLiAgVGhpcyBpcyBuZWNlc3NhcnkgaW4gCisgICBjYXNlIHRoZSBzeW1ib2wncyBFTEYgc2VjdGlvbiBjb3VsZCBub3QgYmUgcmVwcmVzZW50ZWQgaW4gRUNPRkYuICAqLworI2RlZmluZSBFQ09GRl9JTl9FTEYoYmZkKSAoYmZkX2dldF9mbGF2b3VyIChiZmQpID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIgXAorCQkJICAgJiYgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGJmZCwgIi5tZGVidWciKSAhPSBOVUxMKQorCisMCisvKiBXZSBwdXQgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlIGluIHRoZSByZWFkX3N5bXRhYl9wcml2YXRlIGZpZWxkCisgICBvZiB0aGUgcHN5bXRhYi4gICovCisKK3N0cnVjdCBzeW1sb2MKK3sKKyAgLyogSW5kZXggb2YgdGhlIEZEUiB0aGF0IHRoaXMgcHN5bXRhYiByZXByZXNlbnRzLiAgKi8KKyAgaW50IGZkcl9pZHg7CisgIC8qIFRoZSBCRkQgdGhhdCB0aGUgcHN5bXRhYiB3YXMgY3JlYXRlZCBmcm9tLiAgKi8KKyAgYmZkICpjdXJfYmZkOworICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqZGVidWdfc3dhcDsKKyAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnX2luZm87CisgIHN0cnVjdCBtZGVidWdfcGVuZGluZyAqKnBlbmRpbmdfbGlzdDsKKyAgLyogUG9pbnRlciB0byBleHRlcm5hbCBzeW1ib2xzIGZvciB0aGlzIGZpbGUuICAqLworICBFWFRSICpleHRlcm5fdGFiOworICAvKiBTaXplIG9mIGV4dGVybl90YWIuICAqLworICBpbnQgZXh0ZXJuX2NvdW50OworICBlbnVtIGxhbmd1YWdlIHBzdF9sYW5ndWFnZTsKK307CisKKyNkZWZpbmUgUFNUX1BSSVZBVEUocCkgKChzdHJ1Y3Qgc3ltbG9jICopKHApLT5yZWFkX3N5bXRhYl9wcml2YXRlKQorI2RlZmluZSBGRFJfSURYKHApIChQU1RfUFJJVkFURShwKS0+ZmRyX2lkeCkKKyNkZWZpbmUgQ1VSX0JGRChwKSAoUFNUX1BSSVZBVEUocCktPmN1cl9iZmQpCisjZGVmaW5lIERFQlVHX1NXQVAocCkgKFBTVF9QUklWQVRFKHApLT5kZWJ1Z19zd2FwKQorI2RlZmluZSBERUJVR19JTkZPKHApIChQU1RfUFJJVkFURShwKS0+ZGVidWdfaW5mbykKKyNkZWZpbmUgUEVORElOR19MSVNUKHApIChQU1RfUFJJVkFURShwKS0+cGVuZGluZ19saXN0KQorCisjZGVmaW5lIFNDX0lTX1RFWFQoc2MpICgoc2MpID09IHNjVGV4dCBcCisJCSAgIHx8IChzYykgPT0gc2NSQ29uc3QgXAorICAgICAgICAgIAkgICB8fCAoc2MpID09IHNjSW5pdCBcCisgICAgICAgICAgCSAgIHx8IChzYykgPT0gc2NGaW5pKQorI2RlZmluZSBTQ19JU19EQVRBKHNjKSAoKHNjKSA9PSBzY0RhdGEgXAorCQkgICB8fCAoc2MpID09IHNjU0RhdGEgXAorCQkgICB8fCAoc2MpID09IHNjUkRhdGEgXAorCQkgICB8fCAoc2MpID09IHNjUERhdGEgXAorCQkgICB8fCAoc2MpID09IHNjWERhdGEpCisjZGVmaW5lIFNDX0lTX0NPTU1PTihzYykgKChzYykgPT0gc2NDb21tb24gfHwgKHNjKSA9PSBzY1NDb21tb24pCisjZGVmaW5lIFNDX0lTX0JTUyhzYykgKChzYykgPT0gc2NCc3MgfHwgKHNjKSA9PSBzY1NCc3MpCisjZGVmaW5lIFNDX0lTX1VOREVGKHNjKSAoKHNjKSA9PSBzY1VuZGVmaW5lZCB8fCAoc2MpID09IHNjU1VuZGVmaW5lZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisMCisvKiBUaGluZ3Mgd2UgaW1wb3J0IGV4cGxpY2l0bHkgZnJvbSBvdGhlciBtb2R1bGVzICovCisKK2V4dGVybiBpbnQgaW5mb192ZXJib3NlOworCisvKiBWYXJpb3VzIGNvbXBsYWludHMgYWJvdXQgc3ltYm9sIHJlYWRpbmcgdGhhdCBkb24ndCBhYm9ydCB0aGUgcHJvY2VzcyAqLworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCBiYWRfZmlsZV9udW1iZXJfY29tcGxhaW50ID0KK3siYmFkIGZpbGUgbnVtYmVyICVkIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGluZGV4X2NvbXBsYWludCA9Cit7ImJhZCBhdXggaW5kZXggYXQgc3ltYm9sICVzIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGF1eF9pbmRleF9jb21wbGFpbnQgPQoreyJiYWQgcHJvYyBlbmQgaW4gYXV4IGZvdW5kIGZyb20gc3ltYm9sICVzIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGJsb2NrX2luZGV4X2NvbXBsYWludCA9Cit7ImJhZCBhdXggaW5kZXggYXQgYmxvY2sgc3ltYm9sICVzIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IHVua25vd25fZXh0X2NvbXBsYWludCA9Cit7InVua25vd24gZXh0ZXJuYWwgc3ltYm9sICVzIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IHVua25vd25fc3ltX2NvbXBsYWludCA9Cit7InVua25vd24gbG9jYWwgc3ltYm9sICVzIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IHVua25vd25fc3RfY29tcGxhaW50ID0KK3sid2l0aCB0eXBlICVkIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGJsb2NrX292ZXJmbG93X2NvbXBsYWludCA9Cit7ImJsb2NrIGNvbnRhaW5pbmcgJXMgb3ZlcmZpbGxlZCIsIDAsIDB9OworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCBiYXNpY190eXBlX2NvbXBsYWludCA9Cit7ImNhbm5vdCBtYXAgRUNPRkYgYmFzaWMgdHlwZSAweCV4IGZvciAlcyIsIDAsIDB9OworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCB1bmtub3duX3R5cGVfcXVhbF9jb21wbGFpbnQgPQoreyJ1bmtub3duIHR5cGUgcXVhbGlmaWVyIDB4JXgiLCAwLCAwfTsKKworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgYXJyYXlfaW5kZXhfdHlwZV9jb21wbGFpbnQgPQoreyJpbGxlZ2FsIGFycmF5IGluZGV4IHR5cGUgZm9yICVzLCBhc3N1bWluZyBpbnQiLCAwLCAwfTsKKworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgYmFkX3RhZ19ndWVzc19jb21wbGFpbnQgPQoreyJndWVzc2VkIHRhZyB0eXBlIG9mICVzIGluY29ycmVjdGx5IiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGJsb2NrX21lbWJlcl9jb21wbGFpbnQgPQoreyJkZWNsYXJhdGlvbiBibG9jayBjb250YWlucyB1bmhhbmRsZWQgc3ltYm9sIHR5cGUgJWQiLCAwLCAwfTsKKworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgc3RFbmRfY29tcGxhaW50ID0KK3sic3RFbmQgd2l0aCBzdG9yYWdlIGNsYXNzICVkIG5vdCBoYW5kbGVkIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IHVua25vd25fbWRlYnVnX3N5bXR5cGVfY29tcGxhaW50ID0KK3sidW5rbm93biBzeW1ib2wgdHlwZSAweCV4IiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IHN0YWJfdW5rbm93bl9jb21wbGFpbnQgPQoreyJ1bmtub3duIHN0YWJzIHN5bWJvbCAlcyIsIDAsIDB9OworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCBwZHJfZm9yX25vbnN5bWJvbF9jb21wbGFpbnQgPQoreyJQRFIgZm9yICVzLCBidXQgbm8gc3ltYm9sIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IHBkcl9zdGF0aWNfc3ltYm9sX2NvbXBsYWludCA9Cit7ImNhbid0IGhhbmRsZSBQRFIgZm9yIHN0YXRpYyBwcm9jIGF0IDB4JWx4IiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGJhZF9zZXRqbXBfcGRyX2NvbXBsYWludCA9Cit7ImZpeGluZyBiYWQgc2V0am1wIFBEUiBmcm9tIGxpYmMiLCAwLCAwfTsKKworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgYmFkX2ZiaXRmaWVsZF9jb21wbGFpbnQgPQoreyJjYW4ndCBoYW5kbGUgVElSIGZCaXRmaWVsZCBmb3IgJXMiLCAwLCAwfTsKKworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgYmFkX2NvbnRpbnVlZF9jb21wbGFpbnQgPQoreyJpbGxlZ2FsIFRJUiBjb250aW51ZWQgZm9yICVzIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGJhZF9yZmRfZW50cnlfY29tcGxhaW50ID0KK3siYmFkIHJmZCBlbnRyeSBmb3IgJXM6IGZpbGUgJWQsIGluZGV4ICVkIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IHVuZXhwZWN0ZWRfdHlwZV9jb2RlX2NvbXBsYWludCA9Cit7InVuZXhwZWN0ZWQgdHlwZSBjb2RlIGZvciAlcyIsIDAsIDB9OworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCB1bmFibGVfdG9fY3Jvc3NfcmVmX2NvbXBsYWludCA9Cit7InVuYWJsZSB0byBjcm9zcyByZWYgYnRUeXBlZGVmIGZvciAlcyIsIDAsIDB9OworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCBiYWRfaW5kaXJlY3RfeHJlZl9jb21wbGFpbnQgPQoreyJ1bmFibGUgdG8gY3Jvc3MgcmVmIGJ0SW5kaXJlY3QgZm9yICVzIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGlsbGVnYWxfZm9yd2FyZF90cTBfY29tcGxhaW50ID0KK3siaWxsZWdhbCB0cTAgaW4gZm9yd2FyZCB0eXBlZGVmIGZvciAlcyIsIDAsIDB9OworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCBpbGxlZ2FsX2ZvcndhcmRfYnRfY29tcGxhaW50ID0KK3siaWxsZWdhbCBidCAlZCBpbiBmb3J3YXJkIHR5cGVkZWYgZm9yICVzIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGJhZF9saW5ldGFibGVfZ3Vlc3NfY29tcGxhaW50ID0KK3siZ3Vlc3NlZCBzaXplIG9mIGxpbmV0YWJsZSBmb3IgJXMgaW5jb3JyZWN0bHkiLCAwLCAwfTsKKworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgYmFkX2V4dF9pZmRfY29tcGxhaW50ID0KK3siYmFkIGlmZCBmb3IgZXh0ZXJuYWwgc3ltYm9sOiAlZCAobWF4ICVkKSIsIDAsIDB9OworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCBiYWRfZXh0X2lzc19jb21wbGFpbnQgPQoreyJiYWQgaXNzIGZvciBleHRlcm5hbCBzeW1ib2w6ICVsZCAobWF4ICVsZCkiLCAwLCAwfTsKKworLyogTWFjcm9zIGFuZCBleHRyYSBkZWZzICovCisKKy8qIFB1bnM6IGhhcmQgdG8gZmluZCB3aGV0aGVyIC1nIHdhcyB1c2VkIGFuZCBob3cgKi8KKworI2RlZmluZSBNSU5fR0xFVkVMIEdMRVZFTF8wCisjZGVmaW5lIGNvbXBhcmVfZ2xldmVsKGEsYikJCQkJCVwKKwkoKChhKSA9PSBHTEVWRUxfMykgPyAoKGIpIDwgR0xFVkVMXzMpIDoJCQlcCisJICgoYikgPT0gR0xFVkVMXzMpID8gLTEgOiAoaW50KSgoYikgLSAoYSkpKQorDAorLyogVGhpbmdzIHRoYXQgcmVhbGx5IGFyZSBsb2NhbCB0byB0aGlzIG1vZHVsZSAqLworCisvKiBSZW1lbWJlciB3aGF0IHdlIGRlZHVjZWQgdG8gYmUgdGhlIHNvdXJjZSBsYW5ndWFnZSBvZiB0aGlzIHBzeW10YWIuICovCisKK3N0YXRpYyBlbnVtIGxhbmd1YWdlIHBzeW10YWJfbGFuZ3VhZ2UgPSBsYW5ndWFnZV91bmtub3duOworCisvKiBDdXJyZW50IEJGRC4gICovCisKK3N0YXRpYyBiZmQgKmN1cl9iZmQ7CisKKy8qIEhvdyB0byBwYXJzZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIENVUl9CRkQuICAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmRlYnVnX3N3YXA7CisKKy8qIFBvaW50ZXJzIHRvIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgQ1VSX0JGRC4gICovCisKK3N0YXRpYyBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWdfaW5mbzsKKworLyogUG9pbnRlciB0byBjdXJyZW50IGZpbGUgZGVjcmlwdG9yIHJlY29yZCwgYW5kIGl0cyBpbmRleCAqLworCitzdGF0aWMgRkRSICpjdXJfZmRyOworc3RhdGljIGludCBjdXJfZmQ7CisKKy8qIEluZGV4IG9mIGN1cnJlbnQgc3ltYm9sICovCisKK3N0YXRpYyBpbnQgY3VyX3NkeDsKKworLyogTm90ZSBob3cgbXVjaCAiZGVidWdnYWJsZSIgdGhpcyBpbWFnZSBpcy4gIFdlIHdvdWxkIGxpa2UKKyAgIHRvIHNlZSBhdCBsZWFzdCBvbmUgRkRSIHdpdGggZnVsbCBzeW1ib2xzICovCisKK3N0YXRpYyBpbnQgbWF4X2dkYmluZm87CitzdGF0aWMgaW50IG1heF9nbGV2ZWw7CisKKy8qIFdoZW4gZXhhbWluaW5nIC5vIGZpbGVzLCByZXBvcnQgb24gdW5kZWZpbmVkIHN5bWJvbHMgKi8KKworc3RhdGljIGludCBuX3VuZGVmX3N5bWJvbHMsIG5fdW5kZWZfbGFiZWxzLCBuX3VuZGVmX3ZhcnMsIG5fdW5kZWZfcHJvY3M7CisKKy8qIFBzZXVkbyBzeW1ib2wgdG8gdXNlIHdoZW4gcHV0dGluZyBzdGFicyBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLworCitzdGF0aWMgY2hhciBzdGFic19zeW1ib2xbXSA9IFNUQUJTX1NZTUJPTDsKKworLyogVHlwZXMgY29ycmVzcG9uZGluZyB0byBtZGVidWcgZm9ybWF0IGJ0KiBiYXNpYyB0eXBlcy4gICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqbWRlYnVnX3R5cGVfdm9pZDsKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqbWRlYnVnX3R5cGVfY2hhcjsKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqbWRlYnVnX3R5cGVfc2hvcnQ7CitzdGF0aWMgc3RydWN0IHR5cGUgKm1kZWJ1Z190eXBlX2ludF8zMjsKKyNkZWZpbmUgbWRlYnVnX3R5cGVfaW50IG1kZWJ1Z190eXBlX2ludF8zMgorc3RhdGljIHN0cnVjdCB0eXBlICptZGVidWdfdHlwZV9pbnRfNjQ7CitzdGF0aWMgc3RydWN0IHR5cGUgKm1kZWJ1Z190eXBlX2xvbmdfMzI7CitzdGF0aWMgc3RydWN0IHR5cGUgKm1kZWJ1Z190eXBlX2xvbmdfNjQ7CitzdGF0aWMgc3RydWN0IHR5cGUgKm1kZWJ1Z190eXBlX2xvbmdfbG9uZ182NDsKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqbWRlYnVnX3R5cGVfdW5zaWduZWRfY2hhcjsKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqbWRlYnVnX3R5cGVfdW5zaWduZWRfc2hvcnQ7CitzdGF0aWMgc3RydWN0IHR5cGUgKm1kZWJ1Z190eXBlX3Vuc2lnbmVkX2ludF8zMjsKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqbWRlYnVnX3R5cGVfdW5zaWduZWRfaW50XzY0Oworc3RhdGljIHN0cnVjdCB0eXBlICptZGVidWdfdHlwZV91bnNpZ25lZF9sb25nXzMyOworc3RhdGljIHN0cnVjdCB0eXBlICptZGVidWdfdHlwZV91bnNpZ25lZF9sb25nXzY0Oworc3RhdGljIHN0cnVjdCB0eXBlICptZGVidWdfdHlwZV91bnNpZ25lZF9sb25nX2xvbmdfNjQ7CitzdGF0aWMgc3RydWN0IHR5cGUgKm1kZWJ1Z190eXBlX2Fkcl8zMjsKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqbWRlYnVnX3R5cGVfYWRyXzY0Oworc3RhdGljIHN0cnVjdCB0eXBlICptZGVidWdfdHlwZV9mbG9hdDsKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqbWRlYnVnX3R5cGVfZG91YmxlOworc3RhdGljIHN0cnVjdCB0eXBlICptZGVidWdfdHlwZV9jb21wbGV4Oworc3RhdGljIHN0cnVjdCB0eXBlICptZGVidWdfdHlwZV9kb3VibGVfY29tcGxleDsKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqbWRlYnVnX3R5cGVfZml4ZWRfZGVjOworc3RhdGljIHN0cnVjdCB0eXBlICptZGVidWdfdHlwZV9mbG9hdF9kZWM7CitzdGF0aWMgc3RydWN0IHR5cGUgKm1kZWJ1Z190eXBlX3N0cmluZzsKKworLyogVHlwZXMgZm9yIHN5bWJvbHMgZnJvbSBmaWxlcyBjb21waWxlZCB3aXRob3V0IGRlYnVnZ2luZyBpbmZvLiAgKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICpub2RlYnVnX2Z1bmNfc3ltYm9sX3R5cGU7CitzdGF0aWMgc3RydWN0IHR5cGUgKm5vZGVidWdfdmFyX3N5bWJvbF90eXBlOworCisvKiBOb256ZXJvIGlmIHdlIGhhdmUgc2VlbiBlY29mZiBkZWJ1Z2dpbmcgaW5mbyBmb3IgYSBmaWxlLiAgKi8KKworc3RhdGljIGludCBmb3VuZF9lY29mZl9kZWJ1Z2dpbmdfaW5mbzsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KKworc3RhdGljIHZvaWQKK2FkZF9wZW5kaW5nIFBBUkFNUyAoKEZEUiAqLCBjaGFyICosIHN0cnVjdCB0eXBlICopKTsKKworc3RhdGljIHN0cnVjdCBtZGVidWdfcGVuZGluZyAqCitpc19wZW5kaW5nX3N5bWJvbCBQQVJBTVMgKChGRFIgKiwgY2hhciAqKSk7CisKK3N0YXRpYyB2b2lkCitwb3BfcGFyc2Vfc3RhY2sgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZAorcHVzaF9wYXJzZV9zdGFjayBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyBjaGFyICoKK2Zkcl9uYW1lIFBBUkFNUyAoKEZEUiAqKSk7CisKK3N0YXRpYyB2b2lkCittZGVidWdfcHN5bXRhYl90b19zeW10YWIgUEFSQU1TICgoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKKworc3RhdGljIGludAordXBncmFkZV90eXBlIFBBUkFNUyAoKGludCwgc3RydWN0IHR5cGUgKiosIGludCwgdW5pb24gYXV4X2V4dCAqLCBpbnQsIGNoYXIgKikpOworCitzdGF0aWMgdm9pZAorcGFyc2VfcGFydGlhbF9zeW1ib2xzIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosCisJCQkgICAgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqKSk7CisKK3N0YXRpYyBGRFIKKypnZXRfcmZkIFBBUkFNUyAoKGludCwgaW50KSk7CisKK3N0YXRpYyBpbnQKK2hhc19vcGFxdWVfeHJlZiBQQVJBTVMgKChGRFIgKiwgU1lNUiAqKSk7CisKK3N0YXRpYyBpbnQKK2Nyb3NzX3JlZiBQQVJBTVMgKChpbnQsIHVuaW9uIGF1eF9leHQgKiwgc3RydWN0IHR5cGUgKiosIGVudW0gdHlwZV9jb2RlLAorCQkgICBjaGFyICoqLCBpbnQsIGNoYXIgKikpOworCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqCituZXdfc3ltYm9sIFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorbmV3X3R5cGUgUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorbmV3X2Jsb2NrIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgc3RydWN0IHN5bXRhYiAqCituZXdfc3ltdGFiIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBpbnQsIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHN0cnVjdCBsaW5ldGFibGUgKgorbmV3X2xpbmV0YWJsZSBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIHN0cnVjdCBibG9ja3ZlY3RvciAqCituZXdfYnZlY3QgUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyBpbnQKK3BhcnNlX3N5bWJvbCBQQVJBTVMgKChTWU1SICosIHVuaW9uIGF1eF9leHQgKiwgY2hhciAqLCBpbnQsIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorcGFyc2VfdHlwZSBQQVJBTVMgKChpbnQsIHVuaW9uIGF1eF9leHQgKiwgdW5zaWduZWQgaW50LCBpbnQgKiwgaW50LCBjaGFyICopKTsKKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKgorbXlsb29rdXBfc3ltYm9sIFBBUkFNUyAoKGNoYXIgKiwgc3RydWN0IGJsb2NrICosIG5hbWVzcGFjZV9lbnVtLAorCQkJIGVudW0gYWRkcmVzc19jbGFzcykpOworCitzdGF0aWMgc3RydWN0IGJsb2NrICoKK3Nocmlua19ibG9jayBQQVJBTVMgKChzdHJ1Y3QgYmxvY2sgKiwgc3RydWN0IHN5bXRhYiAqKSk7CisKK3N0YXRpYyBQVFIKK3h6YWxsb2MgUEFSQU1TICgodW5zaWduZWQgaW50KSk7CisKK3N0YXRpYyB2b2lkCitzb3J0X2Jsb2NrcyBQQVJBTVMgKChzdHJ1Y3Qgc3ltdGFiICopKTsKKworc3RhdGljIGludAorY29tcGFyZV9ibG9ja3MgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKKworc3RhdGljIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqCituZXdfcHN5bXRhYiBQQVJBTVMgKChjaGFyICosIHN0cnVjdCBvYmpmaWxlICosIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKikpOworCitzdGF0aWMgdm9pZAorcHN5bXRhYl90b19zeW10YWJfMSBQQVJBTVMgKChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKiwgY2hhciAqKSk7CisKK3N0YXRpYyB2b2lkCithZGRfYmxvY2sgUEFSQU1TICgoc3RydWN0IGJsb2NrICosIHN0cnVjdCBzeW10YWIgKikpOworCitzdGF0aWMgdm9pZAorYWRkX3N5bWJvbCBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICosIHN0cnVjdCBibG9jayAqKSk7CisKK3N0YXRpYyBpbnQKK2FkZF9saW5lIFBBUkFNUyAoKHN0cnVjdCBsaW5ldGFibGUgKiwgaW50LCBDT1JFX0FERFIsIGludCkpOworCitzdGF0aWMgc3RydWN0IGxpbmV0YWJsZSAqCitzaHJpbmtfbGluZXRhYmxlIFBBUkFNUyAoKHN0cnVjdCBsaW5ldGFibGUgKikpOworCitzdGF0aWMgdm9pZAoraGFuZGxlX3BzeW1ib2xfZW51bWVyYXRvcnMgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgRkRSICosIGludCwgQ09SRV9BRERSKSk7CisKK3N0YXRpYyBjaGFyICoKK21kZWJ1Z19uZXh0X3N5bWJvbF90ZXh0IFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICopKTsKKwwKKy8qIEFkZHJlc3MgYm91bmRzIGZvciB0aGUgc2lnbmFsIHRyYW1wb2xpbmUgaW4gaW5mZXJpb3IsIGlmIGFueSAqLworCitDT1JFX0FERFIgc2lndHJhbXBfYWRkcmVzcywgc2lndHJhbXBfZW5kOworCisvKiBBbGxvY2F0ZSB6ZXJvZWQgbWVtb3J5ICovCisKK3N0YXRpYyBQVFIKK3h6YWxsb2MgKHNpemUpCisgICAgIHVuc2lnbmVkIGludCBzaXplOworeworICBQVFIgcCA9IHhtYWxsb2MgKHNpemUpOworCisgIG1lbXNldCAocCwgMCwgc2l6ZSk7CisgIHJldHVybiBwOworfQorCisvKiBFeHBvcnRlZCBwcm9jZWR1cmU6IEJ1aWxkcyBhIHN5bXRhYiBmcm9tIHRoZSBQU1QgcGFydGlhbCBvbmUuCisgICBSZXN0b3JlcyB0aGUgZW52aXJvbm1lbnQgaW4gZWZmZWN0IHdoZW4gUFNUIHdhcyBjcmVhdGVkLCBkZWxlZ2F0ZXMKKyAgIG1vc3Qgb2YgdGhlIHdvcmsgdG8gYW4gYW5jaWxsYXJ5IHByb2NlZHVyZSwgYW5kIHNvcnRzCisgICBhbmQgcmVvcmRlcnMgdGhlIHN5bXRhYiBsaXN0IGF0IHRoZSBlbmQgKi8KKworc3RhdGljIHZvaWQKK21kZWJ1Z19wc3ltdGFiX3RvX3N5bXRhYiAocHN0KQorICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdDsKK3sKKworICBpZiAoIXBzdCkKKyAgICByZXR1cm47CisKKyAgaWYgKGluZm9fdmVyYm9zZSkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJSZWFkaW5nIGluIHN5bWJvbHMgZm9yICVzLi4uIiwgcHN0LT5maWxlbmFtZSk7CisgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworICAgIH0KKworICBuZXh0X3N5bWJvbF90ZXh0X2Z1bmMgPSBtZGVidWdfbmV4dF9zeW1ib2xfdGV4dDsKKworICBwc3ltdGFiX3RvX3N5bXRhYl8xIChwc3QsIHBzdC0+ZmlsZW5hbWUpOworCisgIC8qIE1hdGNoIHdpdGggZ2xvYmFsIHN5bWJvbHMuICBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBvbmNlLAorICAgICBhZnRlciBhbGwgb2YgdGhlIHN5bXRhYnMgYW5kIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gcmVhZCBpbi4gICAqLworICBzY2FuX2ZpbGVfZ2xvYmFscyAocHN0LT5vYmpmaWxlKTsKKworICBpZiAoaW5mb192ZXJib3NlKQorICAgIHByaW50Zl9maWx0ZXJlZCAoImRvbmUuXG4iKTsKK30KKwwKKy8qIEZpbGUtbGV2ZWwgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLworCisvKiBGaW5kIGEgZmlsZSBkZXNjcmlwdG9yIGdpdmVuIGl0cyBpbmRleCBSRiByZWxhdGl2ZSB0byBhIGZpbGUgQ0YgKi8KKworc3RhdGljIEZEUiAqCitnZXRfcmZkIChjZiwgcmYpCisgICAgIGludCBjZiwgcmY7Cit7CisgIEZEUiAqZmRyczsKKyAgcmVnaXN0ZXIgRkRSICpmOworICBSRkRUIHJmZDsKKworICBmZHJzID0gZGVidWdfaW5mby0+ZmRyOworICBmID0gZmRycyArIGNmOworICAvKiBPYmplY3QgZmlsZXMgZG8gbm90IGhhdmUgdGhlIFJGRCB0YWJsZSwgYWxsIHJlZnMgYXJlIGFic29sdXRlICovCisgIGlmIChmLT5yZmRCYXNlID09IDApCisgICAgcmV0dXJuIGZkcnMgKyByZjsKKyAgKCpkZWJ1Z19zd2FwLT5zd2FwX3JmZF9pbikgKGN1cl9iZmQsCisJCQkgICAgICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9yZmQKKwkJCSAgICAgICsgKChmLT5yZmRCYXNlICsgcmYpCisJCQkJICogZGVidWdfc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpKSwKKwkJCSAgICAgJnJmZCk7CisgIHJldHVybiBmZHJzICsgcmZkOworfQorCisvKiBSZXR1cm4gYSBzYWZlciBwcmludCBOQU1FIGZvciBhIGZpbGUgZGVzY3JpcHRvciAqLworCitzdGF0aWMgY2hhciAqCitmZHJfbmFtZSAoZikKKyAgICAgRkRSICpmOworeworICBpZiAoZi0+cnNzID09IC0xKQorICAgIHJldHVybiAiPHN0cmlwcGVkIGZpbGU+IjsKKyAgaWYgKGYtPnJzcyA9PSAwKQorICAgIHJldHVybiAiPE5GWT4iOworICByZXR1cm4gZGVidWdfaW5mby0+c3MgKyBmLT5pc3NCYXNlICsgZi0+cnNzOworfQorCisKKy8qIFJlYWQgaW4gYW5kIHBhcnNlIHRoZSBzeW10YWIgb2YgdGhlIGZpbGUgT0JKRklMRS4gIFN5bWJvbHMgZnJvbQorICAgZGlmZmVyZW50IHNlY3Rpb25zIGFyZSByZWxvY2F0ZWQgdmlhIHRoZSBTRUNUSU9OX09GRlNFVFMuICAqLworCit2b2lkCittZGVidWdfYnVpbGRfcHN5bXRhYnMgKG9iamZpbGUsIHN3YXAsIGluZm8sIHNlY3Rpb25fb2Zmc2V0cykKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOworICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqaW5mbzsKKyAgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworeworICBjdXJfYmZkID0gb2JqZmlsZS0+b2JmZDsKKyAgZGVidWdfc3dhcCA9IHN3YXA7CisgIGRlYnVnX2luZm8gPSBpbmZvOworCisgIC8qIE1ha2Ugc3VyZSBhbGwgdGhlIEZEUiBpbmZvcm1hdGlvbiBpcyBzd2FwcGVkIGluLiAgKi8KKyAgaWYgKGluZm8tPmZkciA9PSAoRkRSICopIE5VTEwpCisgICAgeworICAgICAgY2hhciAqZmRyX3NyYzsKKyAgICAgIGNoYXIgKmZkcl9lbmQ7CisgICAgICBGRFIgKmZkcl9wdHI7CisKKyAgICAgIGluZm8tPmZkciA9IChGRFIgKikgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnBzeW1ib2xfb2JzdGFjaywKKwkJCQkJIChpbmZvLT5zeW1ib2xpY19oZWFkZXIuaWZkTWF4CisJCQkJCSAgKiBzaXplb2YgKEZEUikpKTsKKyAgICAgIGZkcl9zcmMgPSBpbmZvLT5leHRlcm5hbF9mZHI7CisgICAgICBmZHJfZW5kID0gKGZkcl9zcmMKKwkJICsgaW5mby0+c3ltYm9saWNfaGVhZGVyLmlmZE1heCAqIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplKTsKKyAgICAgIGZkcl9wdHIgPSBpbmZvLT5mZHI7CisgICAgICBmb3IgKDsgZmRyX3NyYyA8IGZkcl9lbmQ7IGZkcl9zcmMgKz0gc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUsIGZkcl9wdHIrKykKKwkoKnN3YXAtPnN3YXBfZmRyX2luKSAob2JqZmlsZS0+b2JmZCwgZmRyX3NyYywgZmRyX3B0cik7CisgICAgfQorCisgIHBhcnNlX3BhcnRpYWxfc3ltYm9scyAob2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzKTsKKworI2lmIDAKKyAgLyogQ2hlY2sgdG8gbWFrZSBzdXJlIGZpbGUgd2FzIGNvbXBpbGVkIHdpdGggLWcuICBJZiBub3QsIHdhcm4gdGhlCisgICAgIHVzZXIgb2YgdGhpcyBsaW1pdGF0aW9uLiAgKi8KKyAgaWYgKGNvbXBhcmVfZ2xldmVsIChtYXhfZ2xldmVsLCBHTEVWRUxfMikgPCAwKQorICAgIHsKKyAgICAgIGlmIChtYXhfZ2RiaW5mbyA9PSAwKQorCXByaW50Zl91bmZpbHRlcmVkICgiXG4lcyBub3QgY29tcGlsZWQgd2l0aCAtZywgZGVidWdnaW5nIHN1cHBvcnQgaXMgbGltaXRlZC5cbiIsCisJCSBvYmpmaWxlLT5uYW1lKTsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiWW91IHNob3VsZCBjb21waWxlIHdpdGggLWcyIG9yIC1nMyBmb3IgYmVzdCBkZWJ1Z2dpbmcgc3VwcG9ydC5cbiIpOworICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgICB9CisjZW5kaWYKK30KKwwKKy8qIExvY2FsIHV0aWxpdGllcyAqLworCisvKiBNYXAgb2YgRkRSIGluZGV4ZXMgdG8gcGFydGlhbCBzeW10YWJzICovCisKK3N0cnVjdCBwc3RfbWFwCit7CisgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN0OwkvKiB0aGUgcHN5bXRhYiBwcm9wZXIgKi8KKyAgbG9uZyBuX2dsb2JhbHM7CQkvKiBleHBvcnRlZCBnbG9iYWxzIChleHRlcm5hbCBzeW1ib2xzKSAqLworICBsb25nIGdsb2JhbHNfb2Zmc2V0OwkJLyogY3VtdWxhdGl2ZSAqLworfTsKKworCisvKiBVdGlsaXR5IHN0YWNrLCB1c2VkIHRvIG5lc3QgcHJvY2VkdXJlcyBhbmQgYmxvY2tzIHByb3Blcmx5LgorICAgSXQgaXMgYSBkb3VibHkgbGlua2VkIGxpc3QsIHRvIGF2b2lkIHRvbyBtYW55IGFsbG9jL2ZyZWUuCisgICBTaW5jZSB3ZSBtaWdodCBuZWVkIGl0IHF1aXRlIGEgZmV3IHRpbWVzIGl0IGlzIE5PVCBkZWFsbG9jYXRlZAorICAgYWZ0ZXIgdXNlLiAqLworCitzdGF0aWMgc3RydWN0IHBhcnNlX3N0YWNrCit7CisgIHN0cnVjdCBwYXJzZV9zdGFjayAqbmV4dCwgKnByZXY7CisgIHN0cnVjdCBzeW10YWIgKmN1cl9zdDsJLyogQ3VycmVudCBzeW10YWIuICovCisgIHN0cnVjdCBibG9jayAqY3VyX2Jsb2NrOwkvKiBCbG9jayBpbiBpdC4gKi8KKworICAvKiBXaGF0IGFyZSB3ZSBwYXJzaW5nLiAgc3RGaWxlLCBvciBzdEJsb2NrIGFyZSBmb3IgZmlsZXMgYW5kCisgICAgIGJsb2Nrcy4gIHN0UHJvYyBvciBzdFN0YXRpY1Byb2MgbWVhbnMgd2UgaGF2ZSBzZWVuIHRoZSBzdGFydCBvZiBhCisgICAgIHByb2NlZHVyZSwgYnV0IG5vdCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIHdpdGhpbiBpbi4gIFdoZW4gd2Ugc2VlCisgICAgIHRoZSBzdGFydCBvZiB0aGF0IGJsb2NrLCB3ZSBjaGFuZ2UgaXQgdG8gc3ROaWwsIHdpdGhvdXQgcHVzaGluZyBhCisgICAgIG5ldyBibG9jaywgaS5lLiBzdE5pbCBtZWFucyBib3RoIGEgcHJvY2VkdXJlIGFuZCBhIGJsb2NrLiAgKi8KKworICBpbnQgYmxvY2t0eXBlOworCisgIGludCBtYXhzeW1zOwkJCS8qIE1heCBzeW1ib2xzIGluIHRoaXMgYmxvY2suICovCisgIHN0cnVjdCB0eXBlICpjdXJfdHlwZTsJLyogVHlwZSB3ZSBwYXJzZSBmaWVsZHMgZm9yLiAqLworICBpbnQgY3VyX2ZpZWxkOwkJLyogRmllbGQgbnVtYmVyIGluIGN1cl90eXBlLiAqLworICBDT1JFX0FERFIgcHJvY2FkcjsJCS8qIFN0YXJ0IGFkZHJlcyBvZiB0aGlzIHByb2NlZHVyZSAqLworICBpbnQgbnVtYXJnczsJCQkvKiBJdHMgYXJndW1lbnQgY291bnQgKi8KK30KKworICp0b3Bfc3RhY2s7CQkJLyogVG9wIHN0YWNrIHB0ciAqLworCisKKy8qIEVudGVyIGEgbmV3IGxleGljYWwgY29udGV4dCAqLworCitzdGF0aWMgdm9pZAorcHVzaF9wYXJzZV9zdGFjayAoKQoreworICBzdHJ1Y3QgcGFyc2Vfc3RhY2sgKm5ldzsKKworICAvKiBSZXVzZSBmcmFtZXMgaWYgcG9zc2libGUgKi8KKyAgaWYgKHRvcF9zdGFjayAmJiB0b3Bfc3RhY2stPnByZXYpCisgICAgbmV3ID0gdG9wX3N0YWNrLT5wcmV2OworICBlbHNlCisgICAgbmV3ID0gKHN0cnVjdCBwYXJzZV9zdGFjayAqKSB4emFsbG9jIChzaXplb2YgKHN0cnVjdCBwYXJzZV9zdGFjaykpOworICAvKiBJbml0aWFsaXplIG5ldyBmcmFtZSB3aXRoIHByZXZpb3VzIGNvbnRlbnQgKi8KKyAgaWYgKHRvcF9zdGFjaykKKyAgICB7CisgICAgICByZWdpc3RlciBzdHJ1Y3QgcGFyc2Vfc3RhY2sgKnByZXYgPSBuZXctPnByZXY7CisKKyAgICAgICpuZXcgPSAqdG9wX3N0YWNrOworICAgICAgdG9wX3N0YWNrLT5wcmV2ID0gbmV3OworICAgICAgbmV3LT5wcmV2ID0gcHJldjsKKyAgICAgIG5ldy0+bmV4dCA9IHRvcF9zdGFjazsKKyAgICB9CisgIHRvcF9zdGFjayA9IG5ldzsKK30KKworLyogRXhpdCBhIGxleGljYWwgY29udGV4dCAqLworCitzdGF0aWMgdm9pZAorcG9wX3BhcnNlX3N0YWNrICgpCit7CisgIGlmICghdG9wX3N0YWNrKQorICAgIHJldHVybjsKKyAgaWYgKHRvcF9zdGFjay0+bmV4dCkKKyAgICB0b3Bfc3RhY2sgPSB0b3Bfc3RhY2stPm5leHQ7Cit9CisKKworLyogQ3Jvc3MtcmVmZXJlbmNlcyBtaWdodCBiZSB0byB0aGluZ3Mgd2UgaGF2ZW4ndCBsb29rZWQgYXQKKyAgIHlldCwgZS5nLiB0eXBlIHJlZmVyZW5jZXMuICBUbyBhdm9pZCB0b28gbWFueSB0eXBlCisgICBkdXBsaWNhdGlvbnMgd2Uga2VlcCBhIHF1aWNrIGZpeHVwIHRhYmxlLCBhbiBhcnJheQorICAgb2YgbGlzdHMgb2YgcmVmZXJlbmNlcyBpbmRleGVkIGJ5IGZpbGUgZGVzY3JpcHRvciAqLworCitzdHJ1Y3QgbWRlYnVnX3BlbmRpbmcKK3sKKyAgc3RydWN0IG1kZWJ1Z19wZW5kaW5nICpuZXh0OwkvKiBsaW5rICovCisgIGNoYXIgKnM7CQkJLyogdGhlIHVuc3dhcHBlZCBzeW1ib2wgKi8KKyAgc3RydWN0IHR5cGUgKnQ7CQkvKiBpdHMgcGFydGlhbCB0eXBlIGRlc2NyaXB0b3IgKi8KK307CisKKworLyogVGhlIHBlbmRpbmcgaW5mb3JtYXRpb24gaXMga2VwdCBmb3IgYW4gZW50aXJlIG9iamVjdCBmaWxlLCBhbmQgdXNlZAorICAgdG8gYmUgaW4gdGhlIHN5bV9wcml2YXRlIGZpZWxkLiAgSSB0b29rIGl0IG91dCB3aGVuIEkgc3BsaXQKKyAgIG1kZWJ1Z3JlYWQgZnJvbSBtaXBzcmVhZCwgYmVjYXVzZSB0aGlzIG1pZ2h0IG5vdCBiZSB0aGUgb25seSB0eXBlCisgICBvZiBzeW1ib2xzIHJlYWQgZnJvbSBhbiBvYmplY3QgZmlsZS4gIEluc3RlYWQsIHdlIGFsbG9jYXRlIHRoZQorICAgcGVuZGluZyBpbmZvcm1hdGlvbiB0YWJsZSB3aGVuIHdlIGNyZWF0ZSB0aGUgcGFydGlhbCBzeW1ib2xzLCBhbmQKKyAgIHdlIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgc2luZ2xlIHRhYmxlIGluIGVhY2ggcHN5bXRhYi4gICovCisKK3N0YXRpYyBzdHJ1Y3QgbWRlYnVnX3BlbmRpbmcgKipwZW5kaW5nX2xpc3Q7CisKKy8qIENoZWNrIHdoZXRoZXIgd2UgYWxyZWFkeSBzYXcgc3ltYm9sIFNIIGluIGZpbGUgRkggKi8KKworc3RhdGljIHN0cnVjdCBtZGVidWdfcGVuZGluZyAqCitpc19wZW5kaW5nX3N5bWJvbCAoZmgsIHNoKQorICAgICBGRFIgKmZoOworICAgICBjaGFyICpzaDsKK3sKKyAgaW50IGZfaWR4ID0gZmggLSBkZWJ1Z19pbmZvLT5mZHI7CisgIHJlZ2lzdGVyIHN0cnVjdCBtZGVidWdfcGVuZGluZyAqcDsKKworICAvKiBMaW5lYXIgc2VhcmNoIGlzIG9rLCBsaXN0IGlzIHR5cGljYWxseSBubyBtb3JlIHRoYW4gMTAgZGVlcCAqLworICBmb3IgKHAgPSBwZW5kaW5nX2xpc3RbZl9pZHhdOyBwOyBwID0gcC0+bmV4dCkKKyAgICBpZiAocC0+cyA9PSBzaCkKKyAgICAgIGJyZWFrOworICByZXR1cm4gcDsKK30KKworLyogQWRkIGEgbmV3IHN5bWJvbCBTSCBvZiB0eXBlIFQgKi8KKworc3RhdGljIHZvaWQKK2FkZF9wZW5kaW5nIChmaCwgc2gsIHQpCisgICAgIEZEUiAqZmg7CisgICAgIGNoYXIgKnNoOworICAgICBzdHJ1Y3QgdHlwZSAqdDsKK3sKKyAgaW50IGZfaWR4ID0gZmggLSBkZWJ1Z19pbmZvLT5mZHI7CisgIHN0cnVjdCBtZGVidWdfcGVuZGluZyAqcCA9IGlzX3BlbmRpbmdfc3ltYm9sIChmaCwgc2gpOworCisgIC8qIE1ha2Ugc3VyZSB3ZSBkbyBub3QgbWFrZSBkdXBsaWNhdGVzICovCisgIGlmICghcCkKKyAgICB7CisgICAgICBwID0gKChzdHJ1Y3QgbWRlYnVnX3BlbmRpbmcgKikKKwkgICBvYnN0YWNrX2FsbG9jICgmY3VycmVudF9vYmpmaWxlLT5wc3ltYm9sX29ic3RhY2ssCisJCQkgIHNpemVvZiAoc3RydWN0IG1kZWJ1Z19wZW5kaW5nKSkpOworICAgICAgcC0+cyA9IHNoOworICAgICAgcC0+dCA9IHQ7CisgICAgICBwLT5uZXh0ID0gcGVuZGluZ19saXN0W2ZfaWR4XTsKKyAgICAgIHBlbmRpbmdfbGlzdFtmX2lkeF0gPSBwOworICAgIH0KK30KKwwKKworLyogUGFyc2luZyBSb3V0aW5lcyBwcm9wZXIuICovCisKKy8qIFBhcnNlIGEgc2luZ2xlIHN5bWJvbC4gTW9zdGx5IGp1c3QgbWFrZSB1cCBhIEdEQiBzeW1ib2wgZm9yIGl0LgorICAgRm9yIGJsb2NrcywgcHJvY2VkdXJlcyBhbmQgdHlwZXMgd2Ugb3BlbiBhIG5ldyBsZXhpY2FsIGNvbnRleHQuCisgICBUaGlzIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBvbiB0aGUgc3ltYm9sJ3MgdHlwZS4gIEFyZ3VtZW50CisgICBBWCBpcyB0aGUgYmFzZSBwb2ludGVyIG9mIGF1eCBzeW1ib2xzIGZvciB0aGlzIGZpbGUgKGZoLT5pYXV4QmFzZSkuCisgICBFWFRfU0ggcG9pbnRzIHRvIHRoZSB1bnN3YXBwZWQgc3ltYm9sLCB3aGljaCBpcyBuZWVkZWQgZm9yIHN0cnVjdCwKKyAgIHVuaW9uLCBldGMuLCB0eXBlczsgaXQgaXMgTlVMTCBmb3IgYW4gRVhUUi4gIEJJR0VORCBzYXlzIHdoZXRoZXIKKyAgIGF1eCBzeW1ib2xzIGFyZSBiaWctZW5kaWFuIG9yIGxpdHRsZS1lbmRpYW4uICBSZXR1cm4gY291bnQgb2YKKyAgIFNZTVIncyBoYW5kbGVkIChub3JtYWxseSBvbmUpLiAgKi8KKworc3RhdGljIGludAorcGFyc2Vfc3ltYm9sIChzaCwgYXgsIGV4dF9zaCwgYmlnZW5kLCBzZWN0aW9uX29mZnNldHMpCisgICAgIFNZTVIgKnNoOworICAgICB1bmlvbiBhdXhfZXh0ICpheDsKKyAgICAgY2hhciAqZXh0X3NoOworICAgICBpbnQgYmlnZW5kOworICAgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHM7Cit7CisgIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfc3ltX3NpemUgPSBkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZTsKKyAgdm9pZCAoKiBjb25zdCBzd2FwX3N5bV9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgU1lNUiAqKSkgPQorICAgIGRlYnVnX3N3YXAtPnN3YXBfc3ltX2luOworICBjaGFyICpuYW1lOworICBzdHJ1Y3Qgc3ltYm9sICpzOworICBzdHJ1Y3QgYmxvY2sgKmI7CisgIHN0cnVjdCBtZGVidWdfcGVuZGluZyAqcGVuZDsKKyAgc3RydWN0IHR5cGUgKnQ7CisgIHN0cnVjdCBmaWVsZCAqZjsKKyAgaW50IGNvdW50ID0gMTsKKyAgZW51bSBhZGRyZXNzX2NsYXNzIGNsYXNzOworICBUSVIgdGlyOworICBsb25nIHN2YWx1ZSA9IHNoLT52YWx1ZTsKKyAgaW50IGJpdHNpemU7CisKKyAgaWYgKGV4dF9zaCA9PSAoY2hhciAqKSBOVUxMKQorICAgIG5hbWUgPSBkZWJ1Z19pbmZvLT5zc2V4dCArIHNoLT5pc3M7CisgIGVsc2UKKyAgICBuYW1lID0gZGVidWdfaW5mby0+c3MgKyBjdXJfZmRyLT5pc3NCYXNlICsgc2gtPmlzczsKKworICBzd2l0Y2ggKHNoLT5zYykKKyAgICB7CisgICAgY2FzZSBzY1RleHQ6CisgICAgY2FzZSBzY1JDb25zdDoKKyAgICAgIC8qIERvIG5vdCByZWxvY2F0ZSByZWxhdGl2ZSB2YWx1ZXMuCisJIFRoZSB2YWx1ZSBvZiBhIHN0RW5kIHN5bWJvbCBpcyB0aGUgZGlzcGxhY2VtZW50IGZyb20gdGhlCisJIGNvcnJlc3BvbmRpbmcgc3RhcnQgc3ltYm9sIHZhbHVlLgorCSBUaGUgdmFsdWUgb2YgYSBzdEJsb2NrIHN5bWJvbCBpcyB0aGUgZGlzcGxhY2VtZW50IGZyb20gdGhlCisJIHByb2NlZHVyZSBhZGRyZXNzLiAgKi8KKyAgICAgIGlmIChzaC0+c3QgIT0gc3RFbmQgJiYgc2gtPnN0ICE9IHN0QmxvY2spCisJc2gtPnZhbHVlICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzY0RhdGE6CisgICAgY2FzZSBzY1NEYXRhOgorICAgIGNhc2Ugc2NSRGF0YToKKyAgICBjYXNlIHNjUERhdGE6CisgICAgY2FzZSBzY1hEYXRhOgorICAgICAgc2gtPnZhbHVlICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX0RBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzY0JzczoKKyAgICBjYXNlIHNjU0JzczoKKyAgICAgIHNoLT52YWx1ZSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9CU1MpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHN3aXRjaCAoc2gtPnN0KQorICAgIHsKKyAgICBjYXNlIHN0TmlsOgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHN0R2xvYmFsOgkJLyogZXh0ZXJuYWwgc3ltYm9sLCBnb2VzIGludG8gZ2xvYmFsIGJsb2NrICovCisgICAgICBjbGFzcyA9IExPQ19TVEFUSUM7CisgICAgICBiID0gQkxPQ0tWRUNUT1JfQkxPQ0sgKEJMT0NLVkVDVE9SICh0b3Bfc3RhY2stPmN1cl9zdCksCisJCQkgICAgIEdMT0JBTF9CTE9DSyk7CisgICAgICBzID0gbmV3X3N5bWJvbCAobmFtZSk7CisgICAgICBTWU1CT0xfVkFMVUVfQUREUkVTUyAocykgPSAoQ09SRV9BRERSKSBzaC0+dmFsdWU7CisgICAgICBnb3RvIGRhdGE7CisKKyAgICBjYXNlIHN0U3RhdGljOgkJLyogc3RhdGljIGRhdGEsIGdvZXMgaW50byBjdXJyZW50IGJsb2NrLiAqLworICAgICAgY2xhc3MgPSBMT0NfU1RBVElDOworICAgICAgYiA9IHRvcF9zdGFjay0+Y3VyX2Jsb2NrOworICAgICAgcyA9IG5ld19zeW1ib2wgKG5hbWUpOworICAgICAgaWYgKFNDX0lTX0NPTU1PTihzaC0+c2MpKQorCXsKKwkgIC8qIEl0IGlzIGEgRk9SVFJBTiBjb21tb24gYmxvY2suICBBdCBsZWFzdCBmb3IgU0dJIEZvcnRyYW4gdGhlCisJICAgICBhZGRyZXNzIGlzIG5vdCBpbiB0aGUgc3ltYm9sOyB3ZSBuZWVkIHRvIGZpeCBpdCBsYXRlciBpbgorCSAgICAgc2Nhbl9maWxlX2dsb2JhbHMuICAqLworCSAgaW50IGJ1Y2tldCA9IGhhc2huYW1lIChTWU1CT0xfTkFNRSAocykpOworCSAgU1lNQk9MX1ZBTFVFX0NIQUlOIChzKSA9IGdsb2JhbF9zeW1fY2hhaW5bYnVja2V0XTsKKwkgIGdsb2JhbF9zeW1fY2hhaW5bYnVja2V0XSA9IHM7CisJfQorICAgICAgZWxzZQorCVNZTUJPTF9WQUxVRV9BRERSRVNTIChzKSA9IChDT1JFX0FERFIpIHNoLT52YWx1ZTsKKyAgICAgIGdvdG8gZGF0YTsKKworICAgIGNhc2Ugc3RMb2NhbDoJCS8qIGxvY2FsIHZhcmlhYmxlLCBnb2VzIGludG8gY3VycmVudCBibG9jayAqLworICAgICAgaWYgKHNoLT5zYyA9PSBzY1JlZ2lzdGVyKQorCXsKKwkgIGNsYXNzID0gTE9DX1JFR0lTVEVSOworCSAgc3ZhbHVlID0gRUNPRkZfUkVHX1RPX1JFR05VTSAoc3ZhbHVlKTsKKwl9CisgICAgICBlbHNlCisJY2xhc3MgPSBMT0NfTE9DQUw7CisgICAgICBiID0gdG9wX3N0YWNrLT5jdXJfYmxvY2s7CisgICAgICBzID0gbmV3X3N5bWJvbCAobmFtZSk7CisgICAgICBTWU1CT0xfVkFMVUUgKHMpID0gc3ZhbHVlOworCisgICAgZGF0YToJCQkvKiBDb21tb24gY29kZSBmb3Igc3ltYm9scyBkZXNjcmliaW5nIGRhdGEgKi8KKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHMpID0gVkFSX05BTUVTUEFDRTsKKyAgICAgIFNZTUJPTF9DTEFTUyAocykgPSBjbGFzczsKKyAgICAgIGFkZF9zeW1ib2wgKHMsIGIpOworCisgICAgICAvKiBUeXBlIGNvdWxkIGJlIG1pc3NpbmcgaWYgZmlsZSBpcyBjb21waWxlZCB3aXRob3V0IGRlYnVnZ2luZyBpbmZvLiAgKi8KKyAgICAgIGlmIChTQ19JU19VTkRFRihzaC0+c2MpCisJICB8fCBzaC0+c2MgPT0gc2NOaWwgfHwgc2gtPmluZGV4ID09IGluZGV4TmlsKQorCVNZTUJPTF9UWVBFIChzKSA9IG5vZGVidWdfdmFyX3N5bWJvbF90eXBlOworICAgICAgZWxzZQorCVNZTUJPTF9UWVBFIChzKSA9IHBhcnNlX3R5cGUgKGN1cl9mZCwgYXgsIHNoLT5pbmRleCwgMCwgYmlnZW5kLCBuYW1lKTsKKyAgICAgIC8qIFZhbHVlIG9mIGEgZGF0YSBzeW1ib2wgaXMgaXRzIG1lbW9yeSBhZGRyZXNzICovCisgICAgICBicmVhazsKKworICAgIGNhc2Ugc3RQYXJhbToJCS8qIGFyZyB0byBwcm9jZWR1cmUsIGdvZXMgaW50byBjdXJyZW50IGJsb2NrICovCisgICAgICBtYXhfZ2RiaW5mbysrOworICAgICAgZm91bmRfZWNvZmZfZGVidWdnaW5nX2luZm8gPSAxOworICAgICAgdG9wX3N0YWNrLT5udW1hcmdzKys7CisKKyAgICAgIC8qIFNwZWNpYWwgR05VIEMrKyBuYW1lLiAgKi8KKyAgICAgIGlmIChpc19jcGx1c19tYXJrZXIgKG5hbWVbMF0pICYmIG5hbWVbMV0gPT0gJ3QnICYmIG5hbWVbMl0gPT0gMCkKKwluYW1lID0gInRoaXMiOwkJLyogRklYTUUsIG5vdCBhbGxvYydkIGluIG9ic3RhY2sgKi8KKyAgICAgIHMgPSBuZXdfc3ltYm9sIChuYW1lKTsKKworICAgICAgU1lNQk9MX05BTUVTUEFDRSAocykgPSBWQVJfTkFNRVNQQUNFOworICAgICAgc3dpdGNoIChzaC0+c2MpCisJeworCWNhc2Ugc2NSZWdpc3RlcjoKKwkgIC8qIFBhc3MgYnkgdmFsdWUgaW4gcmVnaXN0ZXIuICAqLworCSAgU1lNQk9MX0NMQVNTKHMpID0gTE9DX1JFR1BBUk07CisJICBzdmFsdWUgPSBFQ09GRl9SRUdfVE9fUkVHTlVNIChzdmFsdWUpOworCSAgYnJlYWs7CisJY2FzZSBzY1ZhcjoKKwkgIC8qIFBhc3MgYnkgcmVmZXJlbmNlIG9uIHN0YWNrLiAgKi8KKwkgIFNZTUJPTF9DTEFTUyhzKSA9IExPQ19SRUZfQVJHOworCSAgYnJlYWs7CisJY2FzZSBzY1ZhclJlZ2lzdGVyOgorCSAgLyogUGFzcyBieSByZWZlcmVuY2UgaW4gcmVnaXN0ZXIuICAqLworCSAgU1lNQk9MX0NMQVNTKHMpID0gTE9DX1JFR1BBUk1fQUREUjsKKwkgIHN2YWx1ZSA9IEVDT0ZGX1JFR19UT19SRUdOVU0gKHN2YWx1ZSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgLyogUGFzcyBieSB2YWx1ZSBvbiBzdGFjay4gICovCisJICBTWU1CT0xfQ0xBU1MocykgPSBMT0NfQVJHOworCSAgYnJlYWs7CisJfQorICAgICAgU1lNQk9MX1ZBTFVFIChzKSA9IHN2YWx1ZTsKKyAgICAgIFNZTUJPTF9UWVBFIChzKSA9IHBhcnNlX3R5cGUgKGN1cl9mZCwgYXgsIHNoLT5pbmRleCwgMCwgYmlnZW5kLCBuYW1lKTsKKyAgICAgIGFkZF9zeW1ib2wgKHMsIHRvcF9zdGFjay0+Y3VyX2Jsb2NrKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBzdExhYmVsOgkJLyogbGFiZWwsIGdvZXMgaW50byBjdXJyZW50IGJsb2NrICovCisgICAgICBzID0gbmV3X3N5bWJvbCAobmFtZSk7CisgICAgICBTWU1CT0xfTkFNRVNQQUNFIChzKSA9IFZBUl9OQU1FU1BBQ0U7CS8qIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgKi8KKyAgICAgIFNZTUJPTF9DTEFTUyAocykgPSBMT0NfTEFCRUw7CS8qIGJ1dCBub3QgbWlzdXNlZCAqLworICAgICAgU1lNQk9MX1ZBTFVFX0FERFJFU1MgKHMpID0gKENPUkVfQUREUikgc2gtPnZhbHVlOworICAgICAgU1lNQk9MX1RZUEUgKHMpID0gbWRlYnVnX3R5cGVfaW50OworICAgICAgYWRkX3N5bWJvbCAocywgdG9wX3N0YWNrLT5jdXJfYmxvY2spOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHN0UHJvYzoJCS8qIFByb2NlZHVyZSwgdXN1YWxseSBnb2VzIGludG8gZ2xvYmFsIGJsb2NrICovCisgICAgY2FzZSBzdFN0YXRpY1Byb2M6CQkvKiBTdGF0aWMgcHJvY2VkdXJlLCBnb2VzIGludG8gY3VycmVudCBibG9jayAqLworICAgICAgcyA9IG5ld19zeW1ib2wgKG5hbWUpOworICAgICAgU1lNQk9MX05BTUVTUEFDRSAocykgPSBWQVJfTkFNRVNQQUNFOworICAgICAgU1lNQk9MX0NMQVNTIChzKSA9IExPQ19CTE9DSzsKKyAgICAgIC8qIFR5cGUgb2YgdGhlIHJldHVybiB2YWx1ZSAqLworICAgICAgaWYgKFNDX0lTX1VOREVGKHNoLT5zYykgfHwgc2gtPnNjID09IHNjTmlsKQorCXQgPSBtZGVidWdfdHlwZV9pbnQ7CisgICAgICBlbHNlCisJeworCSAgdCA9IHBhcnNlX3R5cGUgKGN1cl9mZCwgYXgsIHNoLT5pbmRleCArIDEsIDAsIGJpZ2VuZCwgbmFtZSk7CisJICBpZiAoU1RSRVEobmFtZSwgIm1hbGxvYyIpICYmIHQtPmNvZGUgPT0gVFlQRV9DT0RFX1ZPSUQpCisJICAgIHsKKwkgICAgICAvKiBJIGRvbid0IGtub3cgd2h5LCBidXQsIGF0IGxlYXN0IHVuZGVyIEFscGhhIEdOVS9MaW51eCwKKwkJIHdoZW4gbGlua2luZyBhZ2FpbnN0IGEgbWFsbG9jIHdpdGhvdXQgZGVidWdnaW5nCisJCSBzeW1ib2xzLCBpdHMgcmVhZCBhcyBhIGZ1bmN0aW9uIHJldHVybmluZyB2b2lkLS0tdGhpcworCQkgaXMgYmFkIGJlY2F1c2UgaXQgbWVhbnMgd2UgY2Fubm90IGNhbGwgZnVuY3Rpb25zIHdpdGgKKwkJIHN0cmluZyBhcmd1bWVudHMgaW50ZXJhY3RpdmVseTsgaS5lLiwgImNhbGwKKwkJIHByaW50ZigiaG93ZHlcbiIpIiB3b3VsZCBmYWlsIHdpdGggdGhlIGVycm9yIG1lc3NhZ2UKKwkJICJwcm9ncmFtIGhhcyBubyBtZW1vcnkgYXZhaWxhYmxlIi4gIFRvIGF2b2lkIHRoaXMsIHdlCisJCSBwYXRjaCB1cCB0aGUgdHlwZSBhbmQgbWFrZSBpdCB2b2lkKgorCQkgaW5zdGVhZC4gKGRhdmlkbUBhenN0YXJuZXQuY29tKQorCQkgKi8KKwkgICAgICB0ID0gbWFrZV9wb2ludGVyX3R5cGUgKHQsIE5VTEwpOworCSAgICB9CisJfQorICAgICAgYiA9IHRvcF9zdGFjay0+Y3VyX2Jsb2NrOworICAgICAgaWYgKHNoLT5zdCA9PSBzdFByb2MpCisJeworCSAgc3RydWN0IGJsb2NrdmVjdG9yICpidiA9IEJMT0NLVkVDVE9SICh0b3Bfc3RhY2stPmN1cl9zdCk7CisJICAvKiBUaGUgbmV4dCB0ZXN0IHNob3VsZCBub3JtYWxseSBiZSB0cnVlLCBidXQgcHJvdmlkZXMgYQorCSAgICAgaG9vayBmb3IgbmVzdGVkIGZ1bmN0aW9ucyAod2hpY2ggd2UgZG9uJ3Qgd2FudCB0byBtYWtlCisJICAgICBnbG9iYWwpLiAqLworCSAgaWYgKGIgPT0gQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBTVEFUSUNfQkxPQ0spKQorCSAgICBiID0gQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBHTE9CQUxfQkxPQ0spOworCSAgLyogSXJpeCA1IHNvbWV0aW1lcyBoYXMgZHVwbGljYXRlIG5hbWVzIGZvciB0aGUgc2FtZQorCSAgICAgZnVuY3Rpb24uICBXZSB3YW50IHRvIGFkZCBzdWNoIG5hbWVzIHVwIGF0IHRoZSBnbG9iYWwKKwkgICAgIGxldmVsLCBub3QgYXMgYSBuZXN0ZWQgZnVuY3Rpb24uICAqLworCSAgZWxzZSBpZiAoc2gtPnZhbHVlID09IHRvcF9zdGFjay0+cHJvY2FkcikKKwkgICAgYiA9IEJMT0NLVkVDVE9SX0JMT0NLIChidiwgR0xPQkFMX0JMT0NLKTsKKwl9CisgICAgICBhZGRfc3ltYm9sIChzLCBiKTsKKworICAgICAgLyogTWFrZSBhIHR5cGUgZm9yIHRoZSBwcm9jZWR1cmUgaXRzZWxmICovCisgICAgICBTWU1CT0xfVFlQRSAocykgPSBsb29rdXBfZnVuY3Rpb25fdHlwZSAodCk7CisKKyAgICAgIC8qIENyZWF0ZSBhbmQgZW50ZXIgYSBuZXcgbGV4aWNhbCBjb250ZXh0ICovCisgICAgICBiID0gbmV3X2Jsb2NrICh0b3Bfc3RhY2stPm1heHN5bXMpOworICAgICAgU1lNQk9MX0JMT0NLX1ZBTFVFIChzKSA9IGI7CisgICAgICBCTE9DS19GVU5DVElPTiAoYikgPSBzOworICAgICAgQkxPQ0tfU1RBUlQgKGIpID0gQkxPQ0tfRU5EIChiKSA9IHNoLT52YWx1ZTsKKyAgICAgIEJMT0NLX1NVUEVSQkxPQ0sgKGIpID0gdG9wX3N0YWNrLT5jdXJfYmxvY2s7CisgICAgICBhZGRfYmxvY2sgKGIsIHRvcF9zdGFjay0+Y3VyX3N0KTsKKworICAgICAgLyogTm90IGlmIHdlIG9ubHkgaGF2ZSBwYXJ0aWFsIGluZm8gKi8KKyAgICAgIGlmIChTQ19JU19VTkRFRihzaC0+c2MpIHx8IHNoLT5zYyA9PSBzY05pbCkKKwlicmVhazsKKworICAgICAgcHVzaF9wYXJzZV9zdGFjayAoKTsKKyAgICAgIHRvcF9zdGFjay0+Y3VyX2Jsb2NrID0gYjsKKyAgICAgIHRvcF9zdGFjay0+YmxvY2t0eXBlID0gc2gtPnN0OworICAgICAgdG9wX3N0YWNrLT5jdXJfdHlwZSA9IFNZTUJPTF9UWVBFIChzKTsKKyAgICAgIHRvcF9zdGFjay0+Y3VyX2ZpZWxkID0gLTE7CisgICAgICB0b3Bfc3RhY2stPnByb2NhZHIgPSBzaC0+dmFsdWU7CisgICAgICB0b3Bfc3RhY2stPm51bWFyZ3MgPSAwOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEJlZ2lubmluZyBvZiBjb2RlIGZvciBzdHJ1Y3R1cmUsIHVuaW9uLCBhbmQgZW51bSBkZWZpbml0aW9ucy4KKwkgICAgICAgVGhleSBhbGwgc2hhcmUgYSBjb21tb24gc2V0IG9mIGxvY2FsIHZhcmlhYmxlcywgZGVmaW5lZCBoZXJlLiAgKi8KKyAgICAgIHsKKwllbnVtIHR5cGVfY29kZSB0eXBlX2NvZGU7CisJY2hhciAqZXh0X3RzeW07CisJaW50IG5maWVsZHM7CisJbG9uZyBtYXhfdmFsdWU7CisJc3RydWN0IGZpZWxkICpmOworCisgICAgY2FzZSBzdFN0cnVjdDoJCS8qIFN0YXJ0IGEgYmxvY2sgZGVmaW5pbmcgYSBzdHJ1Y3QgdHlwZSAqLworCXR5cGVfY29kZSA9IFRZUEVfQ09ERV9TVFJVQ1Q7CisJZ290byBzdHJ1Y3R1cmVkX2NvbW1vbjsKKworICAgIGNhc2Ugc3RVbmlvbjoJCS8qIFN0YXJ0IGEgYmxvY2sgZGVmaW5pbmcgYSB1bmlvbiB0eXBlICovCisJdHlwZV9jb2RlID0gVFlQRV9DT0RFX1VOSU9OOworCWdvdG8gc3RydWN0dXJlZF9jb21tb247CisKKyAgICBjYXNlIHN0RW51bToJCS8qIFN0YXJ0IGEgYmxvY2sgZGVmaW5pbmcgYW4gZW51bSB0eXBlICovCisJdHlwZV9jb2RlID0gVFlQRV9DT0RFX0VOVU07CisJZ290byBzdHJ1Y3R1cmVkX2NvbW1vbjsKKworICAgIGNhc2Ugc3RCbG9jazoJCS8qIEVpdGhlciBhIGxleGljYWwgYmxvY2ssIG9yIHNvbWUgdHlwZSAqLworCWlmIChzaC0+c2MgIT0gc2NJbmZvICYmICFTQ19JU19DT01NT04oc2gtPnNjKSkKKwkgIGdvdG8gY2FzZV9zdEJsb2NrX2NvZGU7CS8qIExleGljYWwgYmxvY2sgKi8KKworCXR5cGVfY29kZSA9IFRZUEVfQ09ERV9VTkRFRjsJLyogV2UgaGF2ZSBhIHR5cGUuICAqLworCisJLyogQ29tbW9uIGNvZGUgZm9yIGhhbmRsaW5nIHN0cnVjdCwgdW5pb24sIGVudW0sIGFuZC9vciBhcy15ZXQtCisJICAgdW5rbm93bi10eXBlIGJsb2NrcyBvZiBpbmZvIGFib3V0IHN0cnVjdHVyZWQgZGF0YS4gIGB0eXBlX2NvZGUnCisJICAgaGFzIGJlZW4gc2V0IHRvIHRoZSBwcm9wZXIgVFlQRV9DT0RFLCBpZiB3ZSBrbm93IGl0LiAgKi8KKyAgICAgIHN0cnVjdHVyZWRfY29tbW9uOgorCWZvdW5kX2Vjb2ZmX2RlYnVnZ2luZ19pbmZvID0gMTsKKwlwdXNoX3BhcnNlX3N0YWNrICgpOworCXRvcF9zdGFjay0+YmxvY2t0eXBlID0gc3RCbG9jazsKKworCS8qIEZpcnN0IGNvdW50IHRoZSBudW1iZXIgb2YgZmllbGRzIGFuZCB0aGUgaGlnaGVzdCB2YWx1ZS4gKi8KKwluZmllbGRzID0gMDsKKwltYXhfdmFsdWUgPSAwOworCWZvciAoZXh0X3RzeW0gPSBleHRfc2ggKyBleHRlcm5hbF9zeW1fc2l6ZTsKKwkgICAgIDsKKwkgICAgIGV4dF90c3ltICs9IGV4dGVybmFsX3N5bV9zaXplKQorCSAgeworCSAgICBTWU1SIHRzeW07CisKKwkgICAgKCpzd2FwX3N5bV9pbikgKGN1cl9iZmQsIGV4dF90c3ltLCAmdHN5bSk7CisKKwkgICAgc3dpdGNoICh0c3ltLnN0KQorCSAgICAgIHsKKwkgICAgICBjYXNlIHN0RW5kOgorCQlnb3RvIGVuZF9vZl9maWVsZHM7CisKKwkgICAgICBjYXNlIHN0TWVtYmVyOgorCQlpZiAobmZpZWxkcyA9PSAwICYmIHR5cGVfY29kZSA9PSBUWVBFX0NPREVfVU5ERUYpCisJCSAgLyogSWYgdGhlIHR5cGUgb2YgdGhlIG1lbWJlciBpcyBOaWwgKG9yIFZvaWQpLAorCQkgICAgIHdpdGhvdXQgcXVhbGlmaWVycywgYXNzdW1lIHRoZSB0YWcgaXMgYW4KKwkJICAgICBlbnVtZXJhdGlvbi4KKwkJICAgICBBbHBoYSBjYyAtbWlncmF0ZSBlbnVtcyBhcmUgcmVjb2duaXplZCBieSBhIHplcm8KKwkJICAgICBpbmRleCBhbmQgYSB6ZXJvIHN5bWJvbCB2YWx1ZS4KKwkJICAgICBEVSA0LjAgY2MgZW51bXMgYXJlIHJlY29nbml6ZWQgYnkgYSBtZW1iZXIgdHlwZSBvZgorCQkgICAgIGJ0RW51bSB3aXRob3V0IHF1YWxpZmllcnMgYW5kIGEgemVybyBzeW1ib2wgdmFsdWUuICAqLworCQkgIGlmICh0c3ltLmluZGV4ID09IGluZGV4TmlsCisJCSAgICAgIHx8ICh0c3ltLmluZGV4ID09IDAgJiYgc2gtPnZhbHVlID09IDApKQorCQkgICAgdHlwZV9jb2RlID0gVFlQRV9DT0RFX0VOVU07CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAoKmRlYnVnX3N3YXAtPnN3YXBfdGlyX2luKSAoYmlnZW5kLAorCQkJCQkJICAmYXhbdHN5bS5pbmRleF0uYV90aSwKKwkJCQkJCSAgJnRpcik7CisJCSAgICAgIGlmICgodGlyLmJ0ID09IGJ0TmlsIHx8IHRpci5idCA9PSBidFZvaWQKKwkJCSAgIHx8ICh0aXIuYnQgPT0gYnRFbnVtICYmIHNoLT52YWx1ZSA9PSAwKSkKKwkJCSAgJiYgdGlyLnRxMCA9PSB0cU5pbCkKKwkJCXR5cGVfY29kZSA9IFRZUEVfQ09ERV9FTlVNOworCQkgICAgfQorCQluZmllbGRzKys7CisJCWlmICh0c3ltLnZhbHVlID4gbWF4X3ZhbHVlKQorCQkgIG1heF92YWx1ZSA9IHRzeW0udmFsdWU7CisJCWJyZWFrOworCisJICAgICAgY2FzZSBzdEJsb2NrOgorCSAgICAgIGNhc2Ugc3RVbmlvbjoKKwkgICAgICBjYXNlIHN0RW51bToKKwkgICAgICBjYXNlIHN0U3RydWN0OgorCQl7CisjaWYgMAorCQkgIC8qIFRoaXMgaXMgYSBuby1vcDsgaXMgaXQgdHJ5aW5nIHRvIHRlbGwgdXMgc29tZXRoaW5nCisJCSAgICAgd2Ugc2hvdWxkIGJlIGNoZWNraW5nPyAgKi8KKwkJICBpZiAodHN5bS5zYyA9PSBzY1ZhcmlhbnQpOwkvKlVOSU1QTEVNRU5URUQqLworI2VuZGlmCisJCSAgaWYgKHRzeW0uaW5kZXggIT0gMCkKKwkJICAgIHsKKwkJICAgICAgLyogVGhpcyBpcyBzb21ldGhpbmcgbGlrZSBhIHN0cnVjdCB3aXRoaW4gYQorCQkJIHN0cnVjdC4gIFNraXAgb3ZlciB0aGUgZmllbGRzIG9mIHRoZSBpbm5lcgorCQkJIHN0cnVjdC4gIFRoZSAtMSBpcyBiZWNhdXNlIHRoZSBmb3IgbG9vcCB3aWxsCisJCQkgaW5jcmVtZW50IGV4dF90c3ltLiAgKi8KKwkJICAgICAgZXh0X3RzeW0gPSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfc3ltCisJCQkJICArICgoY3VyX2Zkci0+aXN5bUJhc2UgKyB0c3ltLmluZGV4IC0gMSkKKwkJCQkgICAgICogZXh0ZXJuYWxfc3ltX3NpemUpKTsKKwkJICAgIH0KKwkJfQorCQlicmVhazsKKworCSAgICAgIGNhc2Ugc3RUeXBlZGVmOgorCQkvKiBtaXBzIGNjIHB1dHMgb3V0IGEgdHlwZWRlZiBmb3Igc3RydWN0IHggaWYgaXQgaXMgbm90IHlldAorCQkgICBkZWZpbmVkIHdoZW4gaXQgZW5jb3VudGVycworCQkgICBzdHJ1Y3QgeSB7IHN0cnVjdCB4ICp4cDsgfTsKKwkJICAgSnVzdCBpZ25vcmUgaXQuICovCisJCWJyZWFrOworCisJICAgICAgY2FzZSBzdEluZGlyZWN0OgorCQkvKiBJcml4NSBjYyBwdXRzIG91dCBhIHN0SW5kaXJlY3QgZm9yIHN0cnVjdCB4IGlmIGl0IGlzIG5vdAorCQkgICB5ZXQgZGVmaW5lZCB3aGVuIGl0IGVuY291bnRlcnMKKwkJICAgc3RydWN0IHkgeyBzdHJ1Y3QgeCAqeHA7IH07CisJCSAgIEp1c3QgaWdub3JlIGl0LiAqLworCQlicmVhazsKKworCSAgICAgIGRlZmF1bHQ6CisJCWNvbXBsYWluICgmYmxvY2tfbWVtYmVyX2NvbXBsYWludCwgdHN5bS5zdCk7CisJICAgICAgfQorCSAgfQorICAgICAgZW5kX29mX2ZpZWxkczo7CisKKwkvKiBJbiBhbiBzdEJsb2NrLCB0aGVyZSBpcyBubyB3YXkgdG8gZGlzdGluZ3Vpc2ggc3RydWN0cywKKwkgICB1bmlvbnMsIGFuZCBlbnVtcyBhdCB0aGlzIHBvaW50LiAgVGhpcyBpcyBhIGJ1ZyBpbiB0aGUKKwkgICBvcmlnaW5hbCBkZXNpZ24gKHRoYXQgaGFzIGJlZW4gZml4ZWQgd2l0aCB0aGUgcmVjZW50CisJICAgYWRkaXRpb24gb2YgdGhlIHN0U3RydWN0LCBzdFVuaW9uLCBhbmQgc3RFbnVtIHN5bWJvbAorCSAgIHR5cGVzLikgIFRoZSB3YXkgeW91IGNhbiB0ZWxsIGlzIGlmL3doZW4geW91IHNlZSBhIHZhcmlhYmxlCisJICAgb3IgZmllbGQgb2YgdGhhdCB0eXBlLiAgSW4gdGhhdCBjYXNlIHRoZSB2YXJpYWJsZSdzIHR5cGUKKwkgICAoaW4gdGhlIEFVWCB0YWJsZSkgc2F5cyBpZiB0aGUgdHlwZSBpcyBzdHJ1Y3QsIHVuaW9uLCBvcgorCSAgIGVudW0sIGFuZCBwb2ludHMgYmFjayB0byB0aGUgc3RCbG9jayBoZXJlLiAgU28geW91IGNhbgorCSAgIHBhdGNoIHRoZSB0YWcga2luZCB1cCBsYXRlciAtIGJ1dCBvbmx5IGlmIHRoZXJlIGFjdHVhbGx5IGlzCisJICAgYSB2YXJpYWJsZSBvciBmaWVsZCBvZiB0aGF0IHR5cGUuCisKKwkgICBTbyB1bnRpbCB3ZSBrbm93IGZvciBzdXJlLCB3ZSB3aWxsIGd1ZXNzIGF0IHRoaXMgcG9pbnQuCisJICAgVGhlIGhldXJpc3RpYyBpczoKKwkgICBJZiB0aGUgZmlyc3QgbWVtYmVyIGhhcyBpbmRleD09aW5kZXhOaWwgb3IgYSB2b2lkIHR5cGUsCisJICAgYXNzdW1lIHdlIGhhdmUgYW4gZW51bWVyYXRpb24uCisJICAgT3RoZXJ3aXNlLCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIG1lbWJlciwgYW5kIGFsbAorCSAgIHRoZSBtZW1iZXJzIGhhdmUgb2Zmc2V0IDAsIGFzc3VtZSB3ZSBoYXZlIGEgdW5pb24uCisJICAgT3RoZXJ3aXNlLCBhc3N1bWUgd2UgaGF2ZSBhIHN0cnVjdC4KKworCSAgIFRoZSBoZXVyaXN0aWMgY291bGQgZ3Vlc3Mgd3JvbmcgaW4gdGhlIGNhc2Ugb2Ygb2YgYW4KKwkgICBlbnVtZXJhdGlvbiB3aXRoIG5vIG1lbWJlcnMgb3IgYSB1bmlvbiB3aXRoIG9uZSAob3IgemVybykKKwkgICBtZW1iZXJzLCBvciB3aGVuIGFsbCBleGNlcHQgdGhlIGxhc3QgZmllbGQgb2YgYSBzdHJ1Y3QgaGF2ZQorCSAgIHdpZHRoIHplcm8uICBUaGVzZSBhcmUgdW5jb21tb24gYW5kL29yIGlsbGVnYWwgc2l0dWF0aW9ucywKKwkgICBhbmQgaW4gYW55IGNhc2UgZ3Vlc3Npbmcgd3JvbmcgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIKKwkgICBtdWNoLgorCisJICAgQnV0IGlmIHdlIGxhdGVyIGRvIGZpbmQgb3V0IHdlIHdlcmUgd3JvbmcsIHdlIGZpeHVwIHRoZSB0YWcKKwkgICBraW5kLiAgTWVtYmVycyBvZiBhbiBlbnVtZXJhdGlvbiBtdXN0IGJlIGhhbmRsZWQKKwkgICBkaWZmZXJlbnRseSBmcm9tIHN0cnVjdC91bmlvbiBmaWVsZHMsIGFuZCB0aGF0IGlzIGhhcmRlciB0bworCSAgIHBhdGNoIHVwLCBidXQgbHVja2lseSB3ZSBzaG91bGRuJ3QgbmVlZCB0by4gIChJZiB0aGVyZSBhcmUKKwkgICBhbnkgZW51bWVyYXRpb24gbWVtYmVycywgd2UgY2FuIHRlbGwgZm9yIHN1cmUgaXQncyBhbiBlbnVtCisJICAgaGVyZS4pICovCisKKwlpZiAodHlwZV9jb2RlID09IFRZUEVfQ09ERV9VTkRFRikKKwkgIGlmIChuZmllbGRzID4gMSAmJiBtYXhfdmFsdWUgPT0gMCkKKwkgICAgdHlwZV9jb2RlID0gVFlQRV9DT0RFX1VOSU9OOworCSAgZWxzZQorCSAgICB0eXBlX2NvZGUgPSBUWVBFX0NPREVfU1RSVUNUOworCisJLyogQ3JlYXRlIGEgbmV3IHR5cGUgb3IgdXNlIHRoZSBwZW5kaW5nIHR5cGUuICAqLworCXBlbmQgPSBpc19wZW5kaW5nX3N5bWJvbCAoY3VyX2ZkciwgZXh0X3NoKTsKKwlpZiAocGVuZCA9PSAoc3RydWN0IG1kZWJ1Z19wZW5kaW5nICopIE5VTEwpCisJICB7CisJICAgIHQgPSBuZXdfdHlwZSAoTlVMTCk7CisJICAgIGFkZF9wZW5kaW5nIChjdXJfZmRyLCBleHRfc2gsIHQpOworCSAgfQorCWVsc2UKKwkgIHQgPSBwZW5kLT50OworCisJLyogRG8gbm90IHNldCB0aGUgdGFnIG5hbWUgaWYgaXQgaXMgYSBjb21waWxlciBnZW5lcmF0ZWQgdGFnIG5hbWUKKwkgICAoLkZ4eCBvciAueHhmYWtlIG9yIGVtcHR5KSBmb3IgdW5uYW1lZCBzdHJ1Y3QvdW5pb24vZW51bXMuCisJICAgQWxwaGEgY2MgcHV0cyBvdXQgYW4gc2gtPmlzcyBvZiB6ZXJvIGZvciB0aG9zZS4gICovCisJaWYgKHNoLT5pc3MgPT0gMCB8fCBuYW1lWzBdID09ICcuJyB8fCBuYW1lWzBdID09ICdcMCcpCisJICBUWVBFX1RBR19OQU1FICh0KSA9IE5VTEw7CisJZWxzZQorCSAgVFlQRV9UQUdfTkFNRSAodCkgPSBvYmNvbmNhdCAoJmN1cnJlbnRfb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssCisJCQkJCSIiLCAiIiwgbmFtZSk7CisKKwlUWVBFX0NPREUgKHQpID0gdHlwZV9jb2RlOworCVRZUEVfTEVOR1RIICh0KSA9IHNoLT52YWx1ZTsKKwlUWVBFX05GSUVMRFMgKHQpID0gbmZpZWxkczsKKwlUWVBFX0ZJRUxEUyAodCkgPSBmID0gKChzdHJ1Y3QgZmllbGQgKikKKwkJCSAgICAgICBUWVBFX0FMTE9DICh0LAorCQkJCQkgICBuZmllbGRzICogc2l6ZW9mIChzdHJ1Y3QgZmllbGQpKSk7CisKKwlpZiAodHlwZV9jb2RlID09IFRZUEVfQ09ERV9FTlVNKQorCSAgeworCSAgICBpbnQgdW5zaWduZWRfZW51bSA9IDE7CisKKwkgICAgLyogVGhpcyBpcyBhIG5vbi1lbXB0eSBlbnVtLiAqLworCisJICAgIC8qIERFQyBjODkgaGFzIHRoZSBudW1iZXIgb2YgZW51bWVyYXRvcnMgaW4gdGhlIHNoLnZhbHVlIGZpZWxkLAorCSAgICAgICBub3QgdGhlIHR5cGUgbGVuZ3RoLCBzbyB3ZSBoYXZlIHRvIGNvbXBlbnNhdGUgZm9yIHRoYXQKKwkgICAgICAgaW5jb21wYXRpYmlsaXR5IHF1aXJrLgorCSAgICAgICBUaGlzIG1pZ2h0IGRvIHRoZSB3cm9uZyB0aGluZyBmb3IgYW4gZW51bSB3aXRoIG9uZSBvciB0d28KKwkgICAgICAgZW51bWVyYXRvcnMgYW5kIGdjYyAtZ2NvZmYgLWZzaG9ydC1lbnVtcywgYnV0IHRoZXNlIGNhc2VzCisJICAgICAgIGFyZSBob3BlZnVsbHkgcmFyZSBlbm91Z2guCisJICAgICAgIEFscGhhIGNjIC1taWdyYXRlIGhhcyBhIHNoLnZhbHVlIGZpZWxkIG9mIHplcm8sIHdlIGFkanVzdAorCSAgICAgICB0aGF0IHRvby4gICovCisJICAgIGlmIChUWVBFX0xFTkdUSCAodCkgPT0gVFlQRV9ORklFTERTICh0KQorCQl8fCBUWVBFX0xFTkdUSCAodCkgPT0gMCkKKwkgICAgICBUWVBFX0xFTkdUSCAodCkgPSBUQVJHRVRfSU5UX0JJVCAvIEhPU1RfQ0hBUl9CSVQ7CisJICAgIGZvciAoZXh0X3RzeW0gPSBleHRfc2ggKyBleHRlcm5hbF9zeW1fc2l6ZTsKKwkJIDsKKwkJIGV4dF90c3ltICs9IGV4dGVybmFsX3N5bV9zaXplKQorCSAgICAgIHsKKwkJU1lNUiB0c3ltOworCQlzdHJ1Y3Qgc3ltYm9sICplbnVtX3N5bTsKKworCQkoKnN3YXBfc3ltX2luKSAoY3VyX2JmZCwgZXh0X3RzeW0sICZ0c3ltKTsKKworCQlpZiAodHN5bS5zdCAhPSBzdE1lbWJlcikKKwkJICBicmVhazsKKworCQlGSUVMRF9CSVRQT1MgKCpmKSA9IHRzeW0udmFsdWU7CisJCUZJRUxEX1RZUEUgKCpmKSA9IHQ7CisJCUZJRUxEX05BTUUgKCpmKSA9IGRlYnVnX2luZm8tPnNzICsgY3VyX2Zkci0+aXNzQmFzZSArIHRzeW0uaXNzOworCQlGSUVMRF9CSVRTSVpFICgqZikgPSAwOworCisJCWVudW1fc3ltID0gKChzdHJ1Y3Qgc3ltYm9sICopCisJCQkgICAgb2JzdGFja19hbGxvYyAoJmN1cnJlbnRfb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssCisJCQkJCSAgIHNpemVvZiAoc3RydWN0IHN5bWJvbCkpKTsKKwkJbWVtc2V0ICgoUFRSKSBlbnVtX3N5bSwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisJCVNZTUJPTF9OQU1FIChlbnVtX3N5bSkgPQorCQkgIG9ic2F2ZXN0cmluZyAoZi0+bmFtZSwgc3RybGVuIChmLT5uYW1lKSwKKwkJCQkmY3VycmVudF9vYmpmaWxlLT5zeW1ib2xfb2JzdGFjayk7CisJCVNZTUJPTF9DTEFTUyAoZW51bV9zeW0pID0gTE9DX0NPTlNUOworCQlTWU1CT0xfVFlQRSAoZW51bV9zeW0pID0gdDsKKwkJU1lNQk9MX05BTUVTUEFDRSAoZW51bV9zeW0pID0gVkFSX05BTUVTUEFDRTsKKwkJU1lNQk9MX1ZBTFVFIChlbnVtX3N5bSkgPSB0c3ltLnZhbHVlOworCQlpZiAoU1lNQk9MX1ZBTFVFIChlbnVtX3N5bSkgPCAwKQorCQkgIHVuc2lnbmVkX2VudW0gPSAwOworCQlhZGRfc3ltYm9sIChlbnVtX3N5bSwgdG9wX3N0YWNrLT5jdXJfYmxvY2spOworCisJCS8qIFNraXAgdGhlIHN0TWVtYmVycyB0aGF0IHdlJ3ZlIGhhbmRsZWQuICovCisJCWNvdW50Kys7CisJCWYrKzsKKwkgICAgICB9CisJICAgIGlmICh1bnNpZ25lZF9lbnVtKQorCSAgICAgIFRZUEVfRkxBR1MgKHQpIHw9IFRZUEVfRkxBR19VTlNJR05FRDsKKwkgIH0KKwkvKiBtYWtlIHRoaXMgdGhlIGN1cnJlbnQgdHlwZSAqLworCXRvcF9zdGFjay0+Y3VyX3R5cGUgPSB0OworCXRvcF9zdGFjay0+Y3VyX2ZpZWxkID0gMDsKKworCS8qIERvIG5vdCBjcmVhdGUgYSBzeW1ib2wgZm9yIGFscGhhIGNjIHVubmFtZWQgc3RydWN0cy4gICovCisJaWYgKHNoLT5pc3MgPT0gMCkKKwkgIGJyZWFrOworCisJLyogZ2NjIHB1dHMgb3V0IGFuIGVtcHR5IHN0cnVjdCBmb3IgYW4gb3BhcXVlIHN0cnVjdCBkZWZpbml0aW9ucywKKwkgICBkbyBub3QgY3JlYXRlIGEgc3ltYm9sIGZvciBpdCBlaXRoZXIuICAqLworCWlmIChUWVBFX05GSUVMRFMgKHQpID09IDApCisJICB7CisJICAgIFRZUEVfRkxBR1MgKHQpIHw9IFRZUEVfRkxBR19TVFVCOworCSAgICBicmVhazsKKwkgIH0KKworCXMgPSBuZXdfc3ltYm9sIChuYW1lKTsKKwlTWU1CT0xfTkFNRVNQQUNFIChzKSA9IFNUUlVDVF9OQU1FU1BBQ0U7CisJU1lNQk9MX0NMQVNTIChzKSA9IExPQ19UWVBFREVGOworCVNZTUJPTF9WQUxVRSAocykgPSAwOworCVNZTUJPTF9UWVBFIChzKSA9IHQ7CisJYWRkX3N5bWJvbCAocywgdG9wX3N0YWNrLT5jdXJfYmxvY2spOworCWJyZWFrOworCisJLyogRW5kIG9mIGxvY2FsIHZhcmlhYmxlcyBzaGFyZWQgYnkgc3RydWN0LCB1bmlvbiwgZW51bSwgYW5kCisJICAgYmxvY2sgKGFzIHlldCB1bmtub3duIHN0cnVjdC91bmlvbi9lbnVtKSBwcm9jZXNzaW5nLiAgKi8KKyAgICAgIH0KKworICAgIGNhc2Vfc3RCbG9ja19jb2RlOgorICAgICAgZm91bmRfZWNvZmZfZGVidWdnaW5nX2luZm8gPSAxOworICAgICAgLyogYmVnaW5ubmluZyBvZiAoY29kZSkgYmxvY2suIFZhbHVlIG9mIHN5bWJvbAorCSBpcyB0aGUgZGlzcGxhY2VtZW50IGZyb20gcHJvY2VkdXJlIHN0YXJ0ICovCisgICAgICBwdXNoX3BhcnNlX3N0YWNrICgpOworCisgICAgICAvKiBEbyBub3Qgc3RhcnQgYSBuZXcgYmxvY2sgaWYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IGJsb2NrIG9mIGEKKwkgcHJvY2VkdXJlLiAgVGhpcyBhbGxvd3MgdGhlIExPQ19CTE9DSyBzeW1ib2wgdG8gcG9pbnQgdG8gdGhlCisJIGJsb2NrIHdpdGggdGhlIGxvY2FsIHZhcmlhYmxlcywgc28gZnVuY25hbWU6OnZhciB3b3Jrcy4gICovCisgICAgICBpZiAodG9wX3N0YWNrLT5ibG9ja3R5cGUgPT0gc3RQcm9jCisJICB8fCB0b3Bfc3RhY2stPmJsb2NrdHlwZSA9PSBzdFN0YXRpY1Byb2MpCisJeworCSAgdG9wX3N0YWNrLT5ibG9ja3R5cGUgPSBzdE5pbDsKKwkgIGJyZWFrOworCX0KKworICAgICAgdG9wX3N0YWNrLT5ibG9ja3R5cGUgPSBzdEJsb2NrOworICAgICAgYiA9IG5ld19ibG9jayAodG9wX3N0YWNrLT5tYXhzeW1zKTsKKyAgICAgIEJMT0NLX1NUQVJUIChiKSA9IHNoLT52YWx1ZSArIHRvcF9zdGFjay0+cHJvY2FkcjsKKyAgICAgIEJMT0NLX1NVUEVSQkxPQ0sgKGIpID0gdG9wX3N0YWNrLT5jdXJfYmxvY2s7CisgICAgICB0b3Bfc3RhY2stPmN1cl9ibG9jayA9IGI7CisgICAgICBhZGRfYmxvY2sgKGIsIHRvcF9zdGFjay0+Y3VyX3N0KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBzdEVuZDoJCS8qIGVuZCAob2YgYW55dGhpbmcpICovCisgICAgICBpZiAoc2gtPnNjID09IHNjSW5mbyB8fCBTQ19JU19DT01NT04oc2gtPnNjKSkKKwl7CisJICAvKiBGaW5pc2hlZCB3aXRoIHR5cGUgKi8KKwkgIHRvcF9zdGFjay0+Y3VyX3R5cGUgPSAwOworCX0KKyAgICAgIGVsc2UgaWYgKHNoLT5zYyA9PSBzY1RleHQgJiYKKwkgICAgICAgKHRvcF9zdGFjay0+YmxvY2t0eXBlID09IHN0UHJvYyB8fAorCQl0b3Bfc3RhY2stPmJsb2NrdHlwZSA9PSBzdFN0YXRpY1Byb2MpKQorCXsKKwkgIC8qIEZpbmlzaGVkIHdpdGggcHJvY2VkdXJlICovCisJICBzdHJ1Y3QgYmxvY2t2ZWN0b3IgKmJ2ID0gQkxPQ0tWRUNUT1IgKHRvcF9zdGFjay0+Y3VyX3N0KTsKKwkgIHN0cnVjdCBtaXBzX2V4dHJhX2Z1bmNfaW5mbyAqZTsKKwkgIHN0cnVjdCBibG9jayAqYjsKKwkgIHN0cnVjdCB0eXBlICpmdHlwZSA9IHRvcF9zdGFjay0+Y3VyX3R5cGU7CisJICBpbnQgaTsKKworCSAgQkxPQ0tfRU5EICh0b3Bfc3RhY2stPmN1cl9ibG9jaykgKz0gc2gtPnZhbHVlOwkvKiBzaXplICovCisKKwkgIC8qIE1ha2UgdXAgc3BlY2lhbCBzeW1ib2wgdG8gY29udGFpbiBwcm9jZWR1cmUgc3BlY2lmaWMgaW5mbyAqLworCSAgcyA9IG5ld19zeW1ib2wgKE1JUFNfRUZJX1NZTUJPTF9OQU1FKTsKKwkgIFNZTUJPTF9OQU1FU1BBQ0UgKHMpID0gTEFCRUxfTkFNRVNQQUNFOworCSAgU1lNQk9MX0NMQVNTIChzKSA9IExPQ19DT05TVDsKKwkgIFNZTUJPTF9UWVBFIChzKSA9IG1kZWJ1Z190eXBlX3ZvaWQ7CisJICBlID0gKChzdHJ1Y3QgbWlwc19leHRyYV9mdW5jX2luZm8gKikKKwkgICAgICAgb2JzdGFja19hbGxvYyAoJmN1cnJlbnRfb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssCisJCQkgICAgICBzaXplb2YgKHN0cnVjdCBtaXBzX2V4dHJhX2Z1bmNfaW5mbykpKTsKKwkgIG1lbXNldCAoKFBUUikgZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgbWlwc19leHRyYV9mdW5jX2luZm8pKTsKKwkgIFNZTUJPTF9WQUxVRSAocykgPSAobG9uZykgZTsKKwkgIGUtPm51bWFyZ3MgPSB0b3Bfc3RhY2stPm51bWFyZ3M7CisJICBlLT5wZHIuZnJhbWVyZWcgPSAtMTsKKwkgIGFkZF9zeW1ib2wgKHMsIHRvcF9zdGFjay0+Y3VyX2Jsb2NrKTsKKworCSAgLyogUmVhbGxvY2F0ZSBzeW1ib2xzLCBzYXZpbmcgbWVtb3J5ICovCisJICBiID0gc2hyaW5rX2Jsb2NrICh0b3Bfc3RhY2stPmN1cl9ibG9jaywgdG9wX3N0YWNrLT5jdXJfc3QpOworCisJICAvKiBmNzcgZW1pdHMgcHJvYy1sZXZlbCB3aXRoIGFkZHJlc3MgYm91bmRzPT1bMCwwXSwKKwkgICAgIFNvIGxvb2sgZm9yIHN1Y2ggY2hpbGQgYmxvY2tzLCBhbmQgcGF0Y2ggdGhlbS4gICovCisJICBmb3IgKGkgPSAwOyBpIDwgQkxPQ0tWRUNUT1JfTkJMT0NLUyAoYnYpOyBpKyspCisJICAgIHsKKwkgICAgICBzdHJ1Y3QgYmxvY2sgKmJfYmFkID0gQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBpKTsKKwkgICAgICBpZiAoQkxPQ0tfU1VQRVJCTE9DSyAoYl9iYWQpID09IGIKKwkJICAmJiBCTE9DS19TVEFSVCAoYl9iYWQpID09IHRvcF9zdGFjay0+cHJvY2FkcgorCQkgICYmIEJMT0NLX0VORCAoYl9iYWQpID09IHRvcF9zdGFjay0+cHJvY2FkcikKKwkJeworCQkgIEJMT0NLX1NUQVJUIChiX2JhZCkgPSBCTE9DS19TVEFSVCAoYik7CisJCSAgQkxPQ0tfRU5EIChiX2JhZCkgPSBCTE9DS19FTkQgKGIpOworCQl9CisJICAgIH0KKworCSAgaWYgKFRZUEVfTkZJRUxEUyAoZnR5cGUpIDw9IDApCisJICAgIHsKKwkgICAgICAvKiBObyBwYXJhbWV0ZXIgdHlwZSBpbmZvcm1hdGlvbiBpcyByZWNvcmRlZCB3aXRoIHRoZSBmdW5jdGlvbidzCisJCSB0eXBlLiAgU2V0IHRoYXQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIHN5bWJvbHMuICovCisJICAgICAgaW50IG5wYXJhbXMgPSB0b3Bfc3RhY2stPm51bWFyZ3M7CisJICAgICAgaW50IGlwYXJhbXM7CisJICAgICAgc3RydWN0IHN5bWJvbCAqc3ltOworCisJICAgICAgaWYgKG5wYXJhbXMgPiAwKQorCQl7CisJCSAgVFlQRV9ORklFTERTIChmdHlwZSkgPSBucGFyYW1zOworCQkgIFRZUEVfRklFTERTIChmdHlwZSkgPSAoc3RydWN0IGZpZWxkICopCisJCSAgICBUWVBFX0FMTE9DIChmdHlwZSwgbnBhcmFtcyAqIHNpemVvZiAoc3RydWN0IGZpZWxkKSk7CisJCQkJCQkgICAgCisJCSAgZm9yIChpID0gaXBhcmFtcyA9IDA7IGlwYXJhbXMgPCBucGFyYW1zOyBpKyspCisJCSAgICB7CisJCSAgICAgIHN5bSA9IEJMT0NLX1NZTSAoYiwgaSk7CisJCSAgICAgIHN3aXRjaCAoU1lNQk9MX0NMQVNTIChzeW0pKQorCQkJeworCQkJY2FzZSBMT0NfQVJHOgorCQkJY2FzZSBMT0NfUkVGX0FSRzoKKwkJCWNhc2UgTE9DX1JFR1BBUk06CisJCQljYXNlIExPQ19SRUdQQVJNX0FERFI6CisJCQkgIFRZUEVfRklFTERfVFlQRSAoZnR5cGUsIGlwYXJhbXMpID0gU1lNQk9MX1RZUEUgKHN5bSk7CisJCQkgIGlwYXJhbXMrKzsKKwkJCSAgYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJICBicmVhazsKKwkJCX0KKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoc2gtPnNjID09IHNjVGV4dCAmJiB0b3Bfc3RhY2stPmJsb2NrdHlwZSA9PSBzdEJsb2NrKQorCXsKKwkgIC8qIEVuZCBvZiAoY29kZSkgYmxvY2suIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIGlzIHRoZQorCSAgICAgZGlzcGxhY2VtZW50IGZyb20gdGhlIHByb2NlZHVyZWBzIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlCisJICAgICBlbmQgb2YgdGhpcyBibG9jay4gKi8KKwkgIEJMT0NLX0VORCAodG9wX3N0YWNrLT5jdXJfYmxvY2spID0gc2gtPnZhbHVlICsgdG9wX3N0YWNrLT5wcm9jYWRyOworCSAgc2hyaW5rX2Jsb2NrICh0b3Bfc3RhY2stPmN1cl9ibG9jaywgdG9wX3N0YWNrLT5jdXJfc3QpOworCX0KKyAgICAgIGVsc2UgaWYgKHNoLT5zYyA9PSBzY1RleHQgJiYgdG9wX3N0YWNrLT5ibG9ja3R5cGUgPT0gc3ROaWwpCisJeworCSAgLyogRW5kIG9mIG91dGVybW9zdCBibG9jay4gIFBvcCBwYXJzZSBzdGFjayBhbmQgaWdub3JlLiAgVGhlCisJICAgICBmb2xsb3dpbmcgc3RFbmQgb2Ygc3RQcm9jIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSBibG9jay4gICovCisJICA7CisJfQorICAgICAgZWxzZSBpZiAoc2gtPnNjID09IHNjVGV4dCAmJiB0b3Bfc3RhY2stPmJsb2NrdHlwZSA9PSBzdEZpbGUpCisJeworCSAgLyogRW5kIG9mIGZpbGUuICBQb3AgcGFyc2Ugc3RhY2sgYW5kIGlnbm9yZS4gIEhpZ2hlcgorCSAgICAgbGV2ZWwgY29kZSBkZWFscyB3aXRoIHRoaXMuICAqLworCSAgOworCX0KKyAgICAgIGVsc2UKKwljb21wbGFpbiAoJnN0RW5kX2NvbXBsYWludCwgc2gtPnNjKTsKKworICAgICAgcG9wX3BhcnNlX3N0YWNrICgpOwkvKiByZXN0b3JlIHByZXZpb3VzIGxleGljYWwgY29udGV4dCAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHN0TWVtYmVyOgkJLyogbWVtYmVyIG9mIHN0cnVjdCBvciB1bmlvbiAqLworICAgICAgZiA9ICZUWVBFX0ZJRUxEUyAodG9wX3N0YWNrLT5jdXJfdHlwZSlbdG9wX3N0YWNrLT5jdXJfZmllbGQrK107CisgICAgICBGSUVMRF9OQU1FICgqZikgPSBuYW1lOworICAgICAgRklFTERfQklUUE9TICgqZikgPSBzaC0+dmFsdWU7CisgICAgICBiaXRzaXplID0gMDsKKyAgICAgIEZJRUxEX1RZUEUgKCpmKSA9IHBhcnNlX3R5cGUgKGN1cl9mZCwgYXgsIHNoLT5pbmRleCwgJmJpdHNpemUsIGJpZ2VuZCwgbmFtZSk7CisgICAgICBGSUVMRF9CSVRTSVpFICgqZikgPSBiaXRzaXplOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHN0SW5kaXJlY3Q6CQkvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9uIElyaXg1ICovCisgICAgICAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmcm9tIElyaXg1IGNjIGFyZSBoYW5kbGVkIGJ5IGNyb3NzX3JlZiwKKwkgc2tpcCB0aGVtLiAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBzdFR5cGVkZWY6CQkvKiB0eXBlIGRlZmluaXRpb24gKi8KKyAgICAgIGZvdW5kX2Vjb2ZmX2RlYnVnZ2luZ19pbmZvID0gMTsKKworICAgICAgLyogVHlwZWRlZnMgZm9yIGZvcndhcmQgZGVjbGFyYXRpb25zIGFuZCBvcGFxdWUgc3RydWN0cyBmcm9tIGFscGhhIGNjCisJIGFyZSBoYW5kbGVkIGJ5IGNyb3NzX3JlZiwgc2tpcCB0aGVtLiAgKi8KKyAgICAgIGlmIChzaC0+aXNzID09IDApCisJYnJlYWs7CisKKyAgICAgIC8qIFBhcnNlIHRoZSB0eXBlIG9yIHVzZSB0aGUgcGVuZGluZyB0eXBlLiAgKi8KKyAgICAgIHBlbmQgPSBpc19wZW5kaW5nX3N5bWJvbCAoY3VyX2ZkciwgZXh0X3NoKTsKKyAgICAgIGlmIChwZW5kID09IChzdHJ1Y3QgbWRlYnVnX3BlbmRpbmcgKikgTlVMTCkKKwl7CisJICB0ID0gcGFyc2VfdHlwZSAoY3VyX2ZkLCBheCwgc2gtPmluZGV4LCAoaW50ICopTlVMTCwgYmlnZW5kLCBuYW1lKTsKKwkgIGFkZF9wZW5kaW5nIChjdXJfZmRyLCBleHRfc2gsIHQpOworCX0KKyAgICAgIGVsc2UKKwl0ID0gcGVuZC0+dDsKKworICAgICAgLyogbWlwcyBjYyBwdXRzIG91dCBhIHR5cGVkZWYgd2l0aCB0aGUgbmFtZSBvZiB0aGUgc3RydWN0IGZvciBmb3J3YXJkCisJIGRlY2xhcmF0aW9ucy4gVGhlc2Ugc2hvdWxkIG5vdCBnbyBpbnRvIHRoZSBzeW1ib2wgdGFibGUgYW5kCisJIFRZUEVfTkFNRSBzaG91bGQgbm90IGJlIHNldCBmb3IgdGhlbS4KKwkgVGhleSBjYW4ndCBiZSBkaXN0aW5ndWlzaGVkIGZyb20gYW4gaW50ZW50aW9uYWwgdHlwZWRlZiB0bworCSB0aGUgc2FtZSBuYW1lIGhvd2V2ZXI6CisJIHguaDoKKwkJc3RydWN0IHggeyBpbnQgaXg7IGludCBqeDsgfTsKKwkJc3RydWN0IHh4OworCSB4LmM6CisJCXR5cGVkZWYgc3RydWN0IHggeDsKKwkJc3RydWN0IHh4IHtpbnQgaXh4OyBpbnQganh4OyB9OworCSBnZW5lcmF0ZXMgYSBjcm9zcyByZWZlcmVuY2luZyBzdFR5cGVkZWYgZm9yIHggYW5kIHh4LgorCSBUaGUgdXNlciB2aXNpYmxlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIHR5cGUgb2YgYSBwb2ludGVyCisJIHRvIHN0cnVjdCBmb28gc29tZXRpbWVzIGlzIGdpdmVuIGFzIGBmb28gKicgaW5zdGVhZCBvZiBgc3RydWN0IGZvbyAqJy4KKwkgVGhlIHByb2JsZW0gaXMgZml4ZWQgd2l0aCBhbHBoYSBjYyBhbmQgSXJpeDUgY2MuICAqLworCisgICAgICAvKiBIb3dldmVyIGlmIHRoZSB0eXBlZGVmIGNyb3NzIHJlZmVyZW5jZXMgdG8gYW4gb3BhcXVlIGFnZ3JlZ2F0ZSwgaXQKKwkgaXMgc2FmZSB0byBvbWl0IGl0IGZyb20gdGhlIHN5bWJvbCB0YWJsZS4gICovCisKKyAgICAgIGlmIChoYXNfb3BhcXVlX3hyZWYgKGN1cl9mZHIsIHNoKSkKKwlicmVhazsKKyAgICAgIHMgPSBuZXdfc3ltYm9sIChuYW1lKTsKKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHMpID0gVkFSX05BTUVTUEFDRTsKKyAgICAgIFNZTUJPTF9DTEFTUyAocykgPSBMT0NfVFlQRURFRjsKKyAgICAgIFNZTUJPTF9CTE9DS19WQUxVRSAocykgPSB0b3Bfc3RhY2stPmN1cl9ibG9jazsKKyAgICAgIFNZTUJPTF9UWVBFIChzKSA9IHQ7CisgICAgICBhZGRfc3ltYm9sIChzLCB0b3Bfc3RhY2stPmN1cl9ibG9jayk7CisKKyAgICAgIC8qIEluY29tcGxldGUgZGVmaW5pdGlvbnMgb2Ygc3RydWN0cyBzaG91bGQgbm90IGdldCBhIG5hbWUuICAqLworICAgICAgaWYgKFRZUEVfTkFNRSAoU1lNQk9MX1RZUEUgKHMpKSA9PSBOVUxMCisJICAmJiAoVFlQRV9ORklFTERTIChTWU1CT0xfVFlQRSAocykpICE9IDAKKyAgICAgICAgICAgICAgfHwgKFRZUEVfQ09ERSAoU1lNQk9MX1RZUEUgKHMpKSAhPSBUWVBFX0NPREVfU1RSVUNUCisJCSAgJiYgVFlQRV9DT0RFIChTWU1CT0xfVFlQRSAocykpICE9IFRZUEVfQ09ERV9VTklPTikpKQorCXsKKwkgIGlmIChUWVBFX0NPREUgKFNZTUJPTF9UWVBFIChzKSkgPT0gVFlQRV9DT0RFX1BUUgorCSAgICAgIHx8IFRZUEVfQ09ERSAoU1lNQk9MX1RZUEUgKHMpKSA9PSBUWVBFX0NPREVfRlVOQykKKwkgICAgeworCSAgICAgIC8qIElmIHdlIGFyZSBnaXZpbmcgYSBuYW1lIHRvIGEgdHlwZSBzdWNoIGFzICJwb2ludGVyIHRvCisJCSBmb28iIG9yICJmdW5jdGlvbiByZXR1cm5pbmcgZm9vIiwgd2UgYmV0dGVyIG5vdCBzZXQKKwkJIHRoZSBUWVBFX05BTUUuICBJZiB0aGUgcHJvZ3JhbSBjb250YWlucyAidHlwZWRlZiBjaGFyCisJCSAqY2FkZHJfdDsiLCB3ZSBkb24ndCB3YW50IGFsbCB2YXJpYWJsZXMgb2YgdHlwZSBjaGFyCisJCSAqIHRvIHByaW50IGFzIGNhZGRyX3QuICBUaGlzIGlzIG5vdCBqdXN0IGEKKwkJIGNvbnNlcXVlbmNlIG9mIEdEQidzIHR5cGUgbWFuYWdlbWVudDsgQ0MgYW5kIEdDQyAoYXQKKwkJIGxlYXN0IHRocm91Z2ggdmVyc2lvbiAyLjQpIGJvdGggb3V0cHV0IHZhcmlhYmxlcyBvZgorCQkgZWl0aGVyIHR5cGUgY2hhciAqIG9yIGNhZGRyX3Qgd2l0aCB0aGUgdHlwZQorCQkgcmVmZXJpbmcgdG8gdGhlIHN0VHlwZWRlZiBzeW1ib2wgZm9yIGNhZGRyX3QuICBJZiBhIGZ1dHVyZQorCQkgY29tcGlsZXIgY2xlYW5zIHRoaXMgdXAgaXQgR0RCIGlzIG5vdCByZWFkeSBmb3IgaXQKKwkJIHlldCwgYnV0IGlmIGl0IGJlY29tZXMgcmVhZHkgd2Ugc29tZWhvdyBuZWVkIHRvCisJCSBkaXNhYmxlIHRoaXMgY2hlY2sgKHdpdGhvdXQgYnJlYWtpbmcgdGhlIFBDQy9HQ0MyLjQKKwkJIGNhc2UpLgorCisJCSBTaWdoLgorCisJCSBGb3J0dW5hdGVseSwgdGhpcyBjaGVjayBzZWVtcyBub3QgdG8gYmUgbmVjZXNzYXJ5CisJCSBmb3IgYW55dGhpbmcgZXhjZXB0IHBvaW50ZXJzIG9yIGZ1bmN0aW9ucy4gICovCisJICAgIH0KKwkgIGVsc2UKKwkgICAgVFlQRV9OQU1FIChTWU1CT0xfVFlQRSAocykpID0gU1lNQk9MX05BTUUgKHMpOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBzdEZpbGU6CQkvKiBmaWxlIG5hbWUgKi8KKyAgICAgIHB1c2hfcGFyc2Vfc3RhY2sgKCk7CisgICAgICB0b3Bfc3RhY2stPmJsb2NrdHlwZSA9IHNoLT5zdDsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBJYHZlIG5ldmVyIHNlZW4gdGhlc2UgZm9yIEMgKi8KKyAgICBjYXNlIHN0UmVnUmVsb2M6CisgICAgICBicmVhazsJCQkvKiByZWdpc3RlciByZWxvY2F0aW9uICovCisgICAgY2FzZSBzdEZvcndhcmQ6CisgICAgICBicmVhazsJCQkvKiBmb3J3YXJkaW5nIGFkZHJlc3MgKi8KKyAgICBjYXNlIHN0Q29uc3RhbnQ6CisgICAgICBicmVhazsJCQkvKiBjb25zdGFudCAqLworICAgIGRlZmF1bHQ6CisgICAgICBjb21wbGFpbiAoJnVua25vd25fbWRlYnVnX3N5bXR5cGVfY29tcGxhaW50LCBzaC0+c3QpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBjb3VudDsKK30KKworLyogUGFyc2UgdGhlIHR5cGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgaW4gdGhlIHJhdyBBWCBlbnRyaWVzIGZvcgorICAgdGhlIHN5bWJvbCBTSC4gUmV0dXJuIHRoZSBiaXRmaWVsZCBzaXplIGluIEJTLCBpbiBjYXNlLgorICAgV2UgbXVzdCBieXRlLXN3YXAgdGhlIEFYIGVudHJpZXMgYmVmb3JlIHdlIHVzZSB0aGVtOyBCSUdFTkQgc2F5cyB3aGV0aGVyCisgICB0aGV5IGFyZSBiaWctZW5kaWFuIG9yIGxpdHRsZS1lbmRpYW4gKGZyb20gZmgtPmZCaWdlbmRpYW4pLiAgKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK3BhcnNlX3R5cGUgKGZkLCBheCwgYXV4X2luZGV4LCBicywgYmlnZW5kLCBzeW1fbmFtZSkKKyAgICAgaW50IGZkOworICAgICB1bmlvbiBhdXhfZXh0ICpheDsKKyAgICAgdW5zaWduZWQgaW50IGF1eF9pbmRleDsKKyAgICAgaW50ICpiczsKKyAgICAgaW50IGJpZ2VuZDsKKyAgICAgY2hhciAqc3ltX25hbWU7Cit7CisgIC8qIE51bGwgZW50cmllcyBpbiB0aGlzIG1hcCBhcmUgdHJlYXRlZCBzcGVjaWFsbHkgKi8KKyAgc3RhdGljIHN0cnVjdCB0eXBlICoqbWFwX2J0W10gPQorICB7CisgICAgJm1kZWJ1Z190eXBlX3ZvaWQsCQkJLyogYnROaWwgKi8KKyAgICAmbWRlYnVnX3R5cGVfYWRyXzMyLAkJLyogYnRBZHIgKi8KKyAgICAmbWRlYnVnX3R5cGVfY2hhciwJCQkvKiBidENoYXIgKi8KKyAgICAmbWRlYnVnX3R5cGVfdW5zaWduZWRfY2hhciwJCS8qIGJ0VUNoYXIgKi8KKyAgICAmbWRlYnVnX3R5cGVfc2hvcnQsCQkJLyogYnRTaG9ydCAqLworICAgICZtZGVidWdfdHlwZV91bnNpZ25lZF9zaG9ydCwJLyogYnRVU2hvcnQgKi8KKyAgICAmbWRlYnVnX3R5cGVfaW50XzMyLAkJLyogYnRJbnQgKi8KKyAgICAmbWRlYnVnX3R5cGVfdW5zaWduZWRfaW50XzMyLAkvKiBidFVJbnQgKi8KKyAgICAmbWRlYnVnX3R5cGVfbG9uZ18zMiwJCS8qIGJ0TG9uZyAqLworICAgICZtZGVidWdfdHlwZV91bnNpZ25lZF9sb25nXzMyLAkvKiBidFVMb25nICovCisgICAgJm1kZWJ1Z190eXBlX2Zsb2F0LAkJCS8qIGJ0RmxvYXQgKi8KKyAgICAmbWRlYnVnX3R5cGVfZG91YmxlLAkJLyogYnREb3VibGUgKi8KKyAgICAwLAkJCQkJLyogYnRTdHJ1Y3QgKi8KKyAgICAwLAkJCQkJLyogYnRVbmlvbiAqLworICAgIDAsCQkJCQkvKiBidEVudW0gKi8KKyAgICAwLAkJCQkJLyogYnRUeXBlZGVmICovCisgICAgMCwJCQkJCS8qIGJ0UmFuZ2UgKi8KKyAgICAwLAkJCQkJLyogYnRTZXQgKi8KKyAgICAmbWRlYnVnX3R5cGVfY29tcGxleCwJCS8qIGJ0Q29tcGxleCAqLworICAgICZtZGVidWdfdHlwZV9kb3VibGVfY29tcGxleCwJLyogYnREQ29tcGxleCAqLworICAgIDAsCQkJCQkvKiBidEluZGlyZWN0ICovCisgICAgJm1kZWJ1Z190eXBlX2ZpeGVkX2RlYywJCS8qIGJ0Rml4ZWREZWMgKi8KKyAgICAmbWRlYnVnX3R5cGVfZmxvYXRfZGVjLAkJLyogYnRGbG9hdERlYyAqLworICAgICZtZGVidWdfdHlwZV9zdHJpbmcsCQkvKiBidFN0cmluZyAqLworICAgIDAsCQkJCQkvKiBidEJpdCAqLworICAgIDAsCQkJCQkvKiBidFBpY3R1cmUgKi8KKyAgICAmbWRlYnVnX3R5cGVfdm9pZCwJCQkvKiBidFZvaWQgKi8KKyAgICAwLAkJCQkJLyogREVDIEMrKzogIFBvaW50ZXIgdG8gbWVtYmVyICovCisgICAgMCwJCQkJCS8qIERFQyBDKys6ICBWaXJ0dWFsIGZ1bmN0aW9uIHRhYmxlICovCisgICAgMCwJCQkJCS8qIERFQyBDKys6ICBDbGFzcyAoUmVjb3JkKSAqLworICAgICZtZGVidWdfdHlwZV9sb25nXzY0LAkJLyogYnRMb25nNjQgICovCisgICAgJm1kZWJ1Z190eXBlX3Vuc2lnbmVkX2xvbmdfNjQsCS8qIGJ0VUxvbmc2NCAqLworICAgICZtZGVidWdfdHlwZV9sb25nX2xvbmdfNjQsCQkvKiBidExvbmdMb25nNjQgICovCisgICAgJm1kZWJ1Z190eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZ182NCwJLyogYnRVTG9uZ0xvbmc2NCAqLworICAgICZtZGVidWdfdHlwZV9hZHJfNjQsCQkvKiBidEFkcjY0ICovCisgICAgJm1kZWJ1Z190eXBlX2ludF82NCwJCS8qIGJ0SW50NjQgICovCisgICAgJm1kZWJ1Z190eXBlX3Vuc2lnbmVkX2ludF82NCwJLyogYnRVSW50NjQgKi8KKyAgfTsKKworICBUSVIgdFsxXTsKKyAgc3RydWN0IHR5cGUgKnRwID0gMDsKKyAgZW51bSB0eXBlX2NvZGUgdHlwZV9jb2RlID0gVFlQRV9DT0RFX1VOREVGOworCisgIC8qIEhhbmRsZSB1bmRlZmluZWQgdHlwZXMsIHRoZXkgaGF2ZSBpbmRleE5pbC4gKi8KKyAgaWYgKGF1eF9pbmRleCA9PSBpbmRleE5pbCkKKyAgICByZXR1cm4gbWRlYnVnX3R5cGVfaW50OworCisgIC8qIEhhbmRsZSBjb3JydXB0IGF1eCBpbmRpY2VzLiAgKi8KKyAgaWYgKGF1eF9pbmRleCA+PSAoZGVidWdfaW5mby0+ZmRyICsgZmQpLT5jYXV4KQorICAgIHsKKyAgICAgIGNvbXBsYWluICgmaW5kZXhfY29tcGxhaW50LCBzeW1fbmFtZSk7CisgICAgICByZXR1cm4gbWRlYnVnX3R5cGVfaW50OworICAgIH0KKyAgYXggKz0gYXV4X2luZGV4OworCisgIC8qIFVzZSBhdXggYXMgYSB0eXBlIGluZm9ybWF0aW9uIHJlY29yZCwgbWFwIGl0cyBiYXNpYyB0eXBlLiAgKi8KKyAgKCpkZWJ1Z19zd2FwLT5zd2FwX3Rpcl9pbikgKGJpZ2VuZCwgJmF4LT5hX3RpLCB0KTsKKyAgaWYgKHQtPmJ0ID49IChzaXplb2YgKG1hcF9idCkgLyBzaXplb2YgKCptYXBfYnQpKSkKKyAgICB7CisgICAgICBjb21wbGFpbiAoJmJhc2ljX3R5cGVfY29tcGxhaW50LCB0LT5idCwgc3ltX25hbWUpOworICAgICAgcmV0dXJuIG1kZWJ1Z190eXBlX2ludDsKKyAgICB9CisgIGlmIChtYXBfYnRbdC0+YnRdKQorICAgIHsKKyAgICAgIHRwID0gKm1hcF9idFt0LT5idF07CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdHAgPSBOVUxMOworICAgICAgLyogQ2Fubm90IHVzZSBidWlsdGluIHR5cGVzIC0tIGJ1aWxkIG91ciBvd24gKi8KKyAgICAgIHN3aXRjaCAodC0+YnQpCisJeworCWNhc2UgYnRTdHJ1Y3Q6CisJICB0eXBlX2NvZGUgPSBUWVBFX0NPREVfU1RSVUNUOworCSAgYnJlYWs7CisJY2FzZSBidFVuaW9uOgorCSAgdHlwZV9jb2RlID0gVFlQRV9DT0RFX1VOSU9OOworCSAgYnJlYWs7CisJY2FzZSBidEVudW06CisJICB0eXBlX2NvZGUgPSBUWVBFX0NPREVfRU5VTTsKKwkgIGJyZWFrOworCWNhc2UgYnRSYW5nZToKKwkgIHR5cGVfY29kZSA9IFRZUEVfQ09ERV9SQU5HRTsKKwkgIGJyZWFrOworCWNhc2UgYnRTZXQ6CisJICB0eXBlX2NvZGUgPSBUWVBFX0NPREVfU0VUOworCSAgYnJlYWs7CisJY2FzZSBidEluZGlyZWN0OgorCSAgLyogYWxwaGEgY2MgLW1pZ3JhdGUgdXNlcyB0aGlzIGZvciB0eXBlZGVmcy4gVGhlIHRydWUgdHlwZSB3aWxsCisJICAgICBiZSBvYnRhaW5lZCBieSBjcm9zc3JlZmVyZW5jaW5nIGJlbG93LiAgKi8KKwkgIHR5cGVfY29kZSA9IFRZUEVfQ09ERV9FUlJPUjsKKwkgIGJyZWFrOworCWNhc2UgYnRUeXBlZGVmOgorCSAgLyogYWxwaGEgY2MgdXNlcyB0aGlzIGZvciB0eXBlZGVmcy4gVGhlIHRydWUgdHlwZSB3aWxsIGJlCisJICAgICBvYnRhaW5lZCBieSBjcm9zc3JlZmVyZW5jaW5nIGJlbG93LiAgKi8KKwkgIHR5cGVfY29kZSA9IFRZUEVfQ09ERV9FUlJPUjsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBjb21wbGFpbiAoJmJhc2ljX3R5cGVfY29tcGxhaW50LCB0LT5idCwgc3ltX25hbWUpOworCSAgcmV0dXJuIG1kZWJ1Z190eXBlX2ludDsKKwl9CisgICAgfQorCisgIC8qIE1vdmUgb24gdG8gbmV4dCBhdXggKi8KKyAgYXgrKzsKKworICBpZiAodC0+ZkJpdGZpZWxkKQorICAgIHsKKyAgICAgIGludCB3aWR0aCA9IEFVWF9HRVRfV0lEVEggKGJpZ2VuZCwgYXgpOworCisgICAgICAvKiBJbmhpYml0IGNvcmUgZHVtcHMgd2l0aCBzb21lIGNmcm9udCBnZW5lcmF0ZWQgb2JqZWN0cyB0aGF0CisJIGNvcnJ1cHQgdGhlIFRJUi4gICovCisgICAgICBpZiAoYnMgPT0gKGludCAqKU5VTEwpCisJeworCSAgLyogQWxwaGEgY2MgLW1pZ3JhdGUgZW5jb2RlcyBjaGFyIGFuZCB1bnNpZ25lZCBjaGFyIHR5cGVzCisJICAgICBhcyBzaG9ydCBhbmQgdW5zaWduZWQgc2hvcnQgdHlwZXMgd2l0aCBhIGZpZWxkIHdpZHRoIG9mIDguCisJICAgICBFbnVtIHR5cGVzIGFsc28gaGF2ZSBhIGZpZWxkIHdpZHRoIHdoaWNoIHdlIGlnbm9yZSBmb3Igbm93LiAgKi8KKwkgIGlmICh0LT5idCA9PSBidFNob3J0ICYmIHdpZHRoID09IDgpCisJICAgIHRwID0gbWRlYnVnX3R5cGVfY2hhcjsKKwkgIGVsc2UgaWYgKHQtPmJ0ID09IGJ0VVNob3J0ICYmIHdpZHRoID09IDgpCisJICAgIHRwID0gbWRlYnVnX3R5cGVfdW5zaWduZWRfY2hhcjsKKwkgIGVsc2UgaWYgKHQtPmJ0ID09IGJ0RW51bSkKKwkgICAgOworCSAgZWxzZQorCSAgICBjb21wbGFpbiAoJmJhZF9mYml0ZmllbGRfY29tcGxhaW50LCBzeW1fbmFtZSk7CisJfQorICAgICAgZWxzZQorICAgICAgICAqYnMgPSB3aWR0aDsKKyAgICAgIGF4Kys7CisgICAgfQorCisgIC8qIEEgYnRJbmRpcmVjdCBlbnRyeSBjcm9zcyByZWZlcmVuY2VzIHRvIGFuIGF1eCBlbnRyeSBjb250YWluaW5nCisgICAgIHRoZSB0eXBlLiAgKi8KKyAgaWYgKHQtPmJ0ID09IGJ0SW5kaXJlY3QpCisgICAgeworICAgICAgUk5EWFIgcm5bMV07CisgICAgICBpbnQgcmY7CisgICAgICBGRFIgKnhyZWZfZmg7CisgICAgICBpbnQgeHJlZl9mZDsKKworICAgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX3JuZHhfaW4pIChiaWdlbmQsICZheC0+YV9ybmR4LCBybik7CisgICAgICBheCsrOworICAgICAgaWYgKHJuLT5yZmQgPT0gMHhmZmYpCisJeworCSAgcmYgPSBBVVhfR0VUX0lTWU0gKGJpZ2VuZCwgYXgpOworCSAgYXgrKzsKKwl9CisgICAgICBlbHNlCisJcmYgPSBybi0+cmZkOworCisgICAgICBpZiAocmYgPT0gLTEpCisJeworCSAgY29tcGxhaW4gKCZiYWRfaW5kaXJlY3RfeHJlZl9jb21wbGFpbnQsIHN5bV9uYW1lKTsKKwkgIHJldHVybiBtZGVidWdfdHlwZV9pbnQ7CisJfQorICAgICAgeHJlZl9maCA9IGdldF9yZmQgKGZkLCByZik7CisgICAgICB4cmVmX2ZkID0geHJlZl9maCAtIGRlYnVnX2luZm8tPmZkcjsKKyAgICAgIHRwID0gcGFyc2VfdHlwZSAoeHJlZl9mZCwgZGVidWdfaW5mby0+ZXh0ZXJuYWxfYXV4ICsgeHJlZl9maC0+aWF1eEJhc2UsCisJCSAgICAgICBybi0+aW5kZXgsIChpbnQgKikgTlVMTCwgeHJlZl9maC0+ZkJpZ2VuZGlhbiwgc3ltX25hbWUpOworICAgIH0KKworICAvKiBBbGwgdGhlc2UgdHlwZXMgcmVhbGx5IHBvaW50IHRvIHNvbWUgKGNvbW1vbikgTUlQUyB0eXBlCisgICAgIGRlZmluaXRpb24sIGFuZCBvbmx5IHRoZSB0eXBlLXF1YWxpZmllcnMgZnVsbHkgaWRlbnRpZnkKKyAgICAgdGhlbS4gIFdlJ2xsIG1ha2UgdGhlIHNhbWUgZWZmb3J0IGF0IHNoYXJpbmcuICovCisgIGlmICh0LT5idCA9PSBidFN0cnVjdCB8fAorICAgICAgdC0+YnQgPT0gYnRVbmlvbiB8fAorICAgICAgdC0+YnQgPT0gYnRFbnVtIHx8CisKKyAgICAgIC8qIGJ0U2V0IChJIHRoaW5rKSBpbXBsaWVzIHRoYXQgdGhlIG5hbWUgaXMgYSB0YWcgbmFtZSwgbm90IGEgdHlwZWRlZgorCSBuYW1lLiAgVGhpcyBhcHBhcmVudGx5IGlzIGEgTUlQUyBleHRlbnNpb24gZm9yIEMgc2V0cy4gICovCisgICAgICB0LT5idCA9PSBidFNldCkKKyAgICB7CisgICAgICBjaGFyICpuYW1lOworCisgICAgICAvKiBUcnkgdG8gY3Jvc3MgcmVmZXJlbmNlIHRoaXMgdHlwZSwgYnVpbGQgbmV3IHR5cGUgb24gZmFpbHVyZS4gICovCisgICAgICBheCArPSBjcm9zc19yZWYgKGZkLCBheCwgJnRwLCB0eXBlX2NvZGUsICZuYW1lLCBiaWdlbmQsIHN5bV9uYW1lKTsKKyAgICAgIGlmICh0cCA9PSAoc3RydWN0IHR5cGUgKikgTlVMTCkKKwl0cCA9IGluaXRfdHlwZSAodHlwZV9jb2RlLCAwLCAwLCAoY2hhciAqKSBOVUxMLCBjdXJyZW50X29iamZpbGUpOworCisgICAgICAvKiBERUMgYzg5IHByb2R1Y2VzIGNyb3NzIHJlZmVyZW5jZXMgdG8gcXVhbGlmaWVkIGFnZ3JlZ2F0ZSB0eXBlcywKKwkgZGVyZWZlcmVuY2UgdGhlbS4gICovCisgICAgICB3aGlsZSAoVFlQRV9DT0RFICh0cCkgPT0gVFlQRV9DT0RFX1BUUgorCSAgICAgfHwgVFlQRV9DT0RFICh0cCkgPT0gVFlQRV9DT0RFX0FSUkFZKQorCXRwID0gdHAtPnRhcmdldF90eXBlOworCisgICAgICAvKiBNYWtlIHN1cmUgdGhhdCBUWVBFX0NPREUodHApIGhhcyBhbiBleHBlY3RlZCB0eXBlIGNvZGUuCisJIEFueSB0eXBlIG1heSBiZSByZXR1cm5lZCBmcm9tIGNyb3NzX3JlZiBpZiBmaWxlIGluZGlyZWN0IGVudHJpZXMKKwkgYXJlIGNvcnJ1cHRlZC4gICovCisgICAgICBpZiAoVFlQRV9DT0RFICh0cCkgIT0gVFlQRV9DT0RFX1NUUlVDVAorCSAgJiYgVFlQRV9DT0RFICh0cCkgIT0gVFlQRV9DT0RFX1VOSU9OCisJICAmJiBUWVBFX0NPREUgKHRwKSAhPSBUWVBFX0NPREVfRU5VTSkKKwl7CisJICBjb21wbGFpbiAoJnVuZXhwZWN0ZWRfdHlwZV9jb2RlX2NvbXBsYWludCwgc3ltX25hbWUpOworCX0KKyAgICAgIGVsc2UKKwl7CisKKwkgIC8qIFVzdWFsbHksIFRZUEVfQ09ERSh0cCkgaXMgYWxyZWFkeSB0eXBlX2NvZGUuICBUaGUgbWFpbgorCSAgICAgZXhjZXB0aW9uIGlzIGlmIHdlIGd1ZXNzZWQgd3JvbmcgcmUgc3RydWN0L3VuaW9uL2VudW0uCisJICAgICBCdXQgZm9yIHN0cnVjdCB2cy4gdW5pb24gYSB3cm9uZyBndWVzcyBpcyBoYXJtbGVzcywgc28KKwkgICAgIGRvbid0IGNvbXBsYWluKCkuICAqLworCSAgaWYgKChUWVBFX0NPREUgKHRwKSA9PSBUWVBFX0NPREVfRU5VTQorCSAgICAgICAmJiB0eXBlX2NvZGUgIT0gVFlQRV9DT0RFX0VOVU0pCisJICAgICAgfHwgKFRZUEVfQ09ERSAodHApICE9IFRZUEVfQ09ERV9FTlVNCisJCSAgJiYgdHlwZV9jb2RlID09IFRZUEVfQ09ERV9FTlVNKSkKKwkgICAgeworCSAgICAgIGNvbXBsYWluICgmYmFkX3RhZ19ndWVzc19jb21wbGFpbnQsIHN5bV9uYW1lKTsKKwkgICAgfQorCisJICBpZiAoVFlQRV9DT0RFICh0cCkgIT0gdHlwZV9jb2RlKQorCSAgICB7CisJICAgICAgVFlQRV9DT0RFICh0cCkgPSB0eXBlX2NvZGU7CisJICAgIH0KKworCSAgLyogRG8gbm90IHNldCB0aGUgdGFnIG5hbWUgaWYgaXQgaXMgYSBjb21waWxlciBnZW5lcmF0ZWQgdGFnIG5hbWUKKwkgICAgICAoLkZ4eCBvciAueHhmYWtlIG9yIGVtcHR5KSBmb3IgdW5uYW1lZCBzdHJ1Y3QvdW5pb24vZW51bXMuICAqLworCSAgaWYgKG5hbWVbMF0gPT0gJy4nIHx8IG5hbWVbMF0gPT0gJ1wwJykKKwkgICAgVFlQRV9UQUdfTkFNRSAodHApID0gTlVMTDsKKwkgIGVsc2UgaWYgKFRZUEVfVEFHX05BTUUgKHRwKSA9PSBOVUxMCisJCSAgIHx8ICFTVFJFUSAoVFlQRV9UQUdfTkFNRSAodHApLCBuYW1lKSkKKwkgICAgVFlQRV9UQUdfTkFNRSAodHApID0gb2JzYXZlc3RyaW5nIChuYW1lLCBzdHJsZW4gKG5hbWUpLAorCQkJCQkgICAgICAgJmN1cnJlbnRfb2JqZmlsZS0+dHlwZV9vYnN0YWNrKTsKKwl9CisgICAgfQorCisgIC8qIEFsbCB0aGVzZSB0eXBlcyByZWFsbHkgcG9pbnQgdG8gc29tZSAoY29tbW9uKSBNSVBTIHR5cGUKKyAgICAgZGVmaW5pdGlvbiwgYW5kIG9ubHkgdGhlIHR5cGUtcXVhbGlmaWVycyBmdWxseSBpZGVudGlmeQorICAgICB0aGVtLiAgV2UnbGwgbWFrZSB0aGUgc2FtZSBlZmZvcnQgYXQgc2hhcmluZy4KKyAgICAgRklYTUU6IFdlIGFyZSBub3QgZG9pbmcgYW55IGd1ZXNzaW5nIG9uIHJhbmdlIHR5cGVzLiAgKi8KKyAgaWYgKHQtPmJ0ID09IGJ0UmFuZ2UpCisgICAgeworICAgICAgY2hhciAqbmFtZTsKKworICAgICAgLyogVHJ5IHRvIGNyb3NzIHJlZmVyZW5jZSB0aGlzIHR5cGUsIGJ1aWxkIG5ldyB0eXBlIG9uIGZhaWx1cmUuICAqLworICAgICAgYXggKz0gY3Jvc3NfcmVmIChmZCwgYXgsICZ0cCwgdHlwZV9jb2RlLCAmbmFtZSwgYmlnZW5kLCBzeW1fbmFtZSk7CisgICAgICBpZiAodHAgPT0gKHN0cnVjdCB0eXBlICopIE5VTEwpCisJdHAgPSBpbml0X3R5cGUgKHR5cGVfY29kZSwgMCwgMCwgKGNoYXIgKikgTlVMTCwgY3VycmVudF9vYmpmaWxlKTsKKworICAgICAgLyogTWFrZSBzdXJlIHRoYXQgVFlQRV9DT0RFKHRwKSBoYXMgYW4gZXhwZWN0ZWQgdHlwZSBjb2RlLgorCSBBbnkgdHlwZSBtYXkgYmUgcmV0dXJuZWQgZnJvbSBjcm9zc19yZWYgaWYgZmlsZSBpbmRpcmVjdCBlbnRyaWVzCisJIGFyZSBjb3JydXB0ZWQuICAqLworICAgICAgaWYgKFRZUEVfQ09ERSAodHApICE9IFRZUEVfQ09ERV9SQU5HRSkKKwl7CisJICBjb21wbGFpbiAoJnVuZXhwZWN0ZWRfdHlwZV9jb2RlX2NvbXBsYWludCwgc3ltX25hbWUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBVc3VhbGx5LCBUWVBFX0NPREUodHApIGlzIGFscmVhZHkgdHlwZV9jb2RlLiAgVGhlIG1haW4KKwkgICAgIGV4Y2VwdGlvbiBpcyBpZiB3ZSBndWVzc2VkIHdyb25nIHJlIHN0cnVjdC91bmlvbi9lbnVtLiAqLworCSAgaWYgKFRZUEVfQ09ERSAodHApICE9IHR5cGVfY29kZSkKKwkgICAgeworCSAgICAgIGNvbXBsYWluICgmYmFkX3RhZ19ndWVzc19jb21wbGFpbnQsIHN5bV9uYW1lKTsKKwkgICAgICBUWVBFX0NPREUgKHRwKSA9IHR5cGVfY29kZTsKKwkgICAgfQorCSAgaWYgKFRZUEVfTkFNRSAodHApID09IE5VTEwgfHwgIVNUUkVRIChUWVBFX05BTUUgKHRwKSwgbmFtZSkpCisJICAgIFRZUEVfTkFNRSAodHApID0gb2JzYXZlc3RyaW5nIChuYW1lLCBzdHJsZW4gKG5hbWUpLAorCQkJCQkgICAmY3VycmVudF9vYmpmaWxlLT50eXBlX29ic3RhY2spOworCX0KKyAgICB9CisgIGlmICh0LT5idCA9PSBidFR5cGVkZWYpCisgICAgeworICAgICAgY2hhciAqbmFtZTsKKworICAgICAgLyogVHJ5IHRvIGNyb3NzIHJlZmVyZW5jZSB0aGlzIHR5cGUsIGl0IHNob3VsZCBzdWNjZWVkLiAgKi8KKyAgICAgIGF4ICs9IGNyb3NzX3JlZiAoZmQsIGF4LCAmdHAsIHR5cGVfY29kZSwgJm5hbWUsIGJpZ2VuZCwgc3ltX25hbWUpOworICAgICAgaWYgKHRwID09IChzdHJ1Y3QgdHlwZSAqKSBOVUxMKQorCXsKKwkgIGNvbXBsYWluICgmdW5hYmxlX3RvX2Nyb3NzX3JlZl9jb21wbGFpbnQsIHN5bV9uYW1lKTsKKwkgIHRwID0gbWRlYnVnX3R5cGVfaW50OworCX0KKyAgICB9CisKKyAgLyogRGVhbCB3aXRoIHJhbmdlIHR5cGVzICovCisgIGlmICh0LT5idCA9PSBidFJhbmdlKQorICAgIHsKKyAgICAgIFRZUEVfTkZJRUxEUyAodHApID0gMjsKKyAgICAgIFRZUEVfRklFTERTICh0cCkgPSAoKHN0cnVjdCBmaWVsZCAqKQorCQkJICBUWVBFX0FMTE9DICh0cCwgMiAqIHNpemVvZiAoc3RydWN0IGZpZWxkKSkpOworICAgICAgVFlQRV9GSUVMRF9OQU1FICh0cCwgMCkgPSBvYnNhdmVzdHJpbmcgKCJMb3ciLCBzdHJsZW4gKCJMb3ciKSwKKwkJCQkJICAgICAgJmN1cnJlbnRfb2JqZmlsZS0+dHlwZV9vYnN0YWNrKTsKKyAgICAgIFRZUEVfRklFTERfQklUUE9TICh0cCwgMCkgPSBBVVhfR0VUX0ROTE9XIChiaWdlbmQsIGF4KTsKKyAgICAgIGF4Kys7CisgICAgICBUWVBFX0ZJRUxEX05BTUUgKHRwLCAxKSA9IG9ic2F2ZXN0cmluZyAoIkhpZ2giLCBzdHJsZW4gKCJIaWdoIiksCisJCQkJCSAgICAgICZjdXJyZW50X29iamZpbGUtPnR5cGVfb2JzdGFjayk7CisgICAgICBUWVBFX0ZJRUxEX0JJVFBPUyAodHAsIDEpID0gQVVYX0dFVF9ETkhJR0ggKGJpZ2VuZCwgYXgpOworICAgICAgYXgrKzsKKyAgICB9CisKKyAgLyogUGFyc2UgYWxsIHRoZSB0eXBlIHF1YWxpZmllcnMgbm93LiBJZiB0aGVyZSBhcmUgbW9yZQorICAgICB0aGFuIDYgdGhlIGdhbWUgd2lsbCBjb250aW51ZSBpbiB0aGUgbmV4dCBhdXggKi8KKworICB3aGlsZSAoMSkKKyAgICB7CisjZGVmaW5lIFBBUlNFX1RRKHRxKSBcCisgICAgICBpZiAodC0+dHEgIT0gdHFOaWwpIFwKKwlheCArPSB1cGdyYWRlX3R5cGUoZmQsICZ0cCwgdC0+dHEsIGF4LCBiaWdlbmQsIHN5bV9uYW1lKTsgXAorICAgICAgZWxzZSBcCisJYnJlYWs7CisKKyAgICAgIFBBUlNFX1RRICh0cTApOworICAgICAgUEFSU0VfVFEgKHRxMSk7CisgICAgICBQQVJTRV9UUSAodHEyKTsKKyAgICAgIFBBUlNFX1RRICh0cTMpOworICAgICAgUEFSU0VfVFEgKHRxNCk7CisgICAgICBQQVJTRV9UUSAodHE1KTsKKyN1bmRlZglQQVJTRV9UUQorCisgICAgICAvKiBtaXBzIGNjIDIueCBhbmQgZ2NjIG5ldmVyIHB1dCBvdXQgY29udGludWVkIGF1eCBlbnRyaWVzLiAgKi8KKyAgICAgIGlmICghdC0+Y29udGludWVkKQorCWJyZWFrOworCisgICAgICAoKmRlYnVnX3N3YXAtPnN3YXBfdGlyX2luKSAoYmlnZW5kLCAmYXgtPmFfdGksIHQpOworICAgICAgYXgrKzsKKyAgICB9CisKKyAgLyogQ29tcGxhaW4gZm9yIGlsbGVnYWwgY29udGludWF0aW9ucyBkdWUgdG8gY29ycnVwdCBhdXggZW50cmllcy4gICovCisgIGlmICh0LT5jb250aW51ZWQpCisgICAgY29tcGxhaW4gKCZiYWRfY29udGludWVkX2NvbXBsYWludCwgc3ltX25hbWUpOworIAorICByZXR1cm4gdHA7Cit9CisKKy8qIE1ha2UgdXAgYSBjb21wbGV4IHR5cGUgZnJvbSBhIGJhc2ljIG9uZS4gIFR5cGUgaXMgcGFzc2VkIGJ5CisgICByZWZlcmVuY2UgaW4gVFBQIGFuZCBzaWRlLWVmZmVjdGVkIGFzIG5lY2Vzc2FyeS4gVGhlIHR5cGUKKyAgIHF1YWxpZmllciBUUSBzYXlzIGhvdyB0byBoYW5kbGUgdGhlIGF1eCBzeW1ib2xzIGF0IEFYIGZvcgorICAgdGhlIHN5bWJvbCBTWCB3ZSBhcmUgY3VycmVudGx5IGFuYWx5emluZy4gIEJJR0VORCBzYXlzIHdoZXRoZXIKKyAgIGF1eCBzeW1ib2xzIGFyZSBiaWctZW5kaWFuIG9yIGxpdHRsZS1lbmRpYW4uCisgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXV4IHN5bWJvbHMgd2UgcGFyc2VkLiAqLworCitzdGF0aWMgaW50Cit1cGdyYWRlX3R5cGUgKGZkLCB0cHAsIHRxLCBheCwgYmlnZW5kLCBzeW1fbmFtZSkKKyAgICAgaW50IGZkOworICAgICBzdHJ1Y3QgdHlwZSAqKnRwcDsKKyAgICAgaW50IHRxOworICAgICB1bmlvbiBhdXhfZXh0ICpheDsKKyAgICAgaW50IGJpZ2VuZDsKKyAgICAgY2hhciAqc3ltX25hbWU7Cit7CisgIGludCBvZmY7CisgIHN0cnVjdCB0eXBlICp0OworCisgIC8qIFVzZWQgaW4gYXJyYXkgcHJvY2Vzc2luZyAqLworICBpbnQgcmYsIGlkOworICBGRFIgKmZoOworICBzdHJ1Y3QgdHlwZSAqcmFuZ2U7CisgIHN0cnVjdCB0eXBlICppbmR4OworICBpbnQgbG93ZXIsIHVwcGVyOworICBSTkRYUiBybmR4OworCisgIHN3aXRjaCAodHEpCisgICAgeworICAgIGNhc2UgdHFQdHI6CisgICAgICB0ID0gbG9va3VwX3BvaW50ZXJfdHlwZSAoKnRwcCk7CisgICAgICAqdHBwID0gdDsKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSB0cVByb2M6CisgICAgICB0ID0gbG9va3VwX2Z1bmN0aW9uX3R5cGUgKCp0cHApOworICAgICAgKnRwcCA9IHQ7CisgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgdHFBcnJheToKKyAgICAgIG9mZiA9IDA7CisKKyAgICAgIC8qIERldGVybWluZSBhbmQgcmVjb3JkIHRoZSBkb21haW4gdHlwZSAodHlwZSBvZiBpbmRleCkgKi8KKyAgICAgICgqZGVidWdfc3dhcC0+c3dhcF9ybmR4X2luKSAoYmlnZW5kLCAmYXgtPmFfcm5keCwgJnJuZHgpOworICAgICAgaWQgPSBybmR4LmluZGV4OworICAgICAgcmYgPSBybmR4LnJmZDsKKyAgICAgIGlmIChyZiA9PSAweGZmZikKKwl7CisJICBheCsrOworCSAgcmYgPSBBVVhfR0VUX0lTWU0gKGJpZ2VuZCwgYXgpOworCSAgb2ZmKys7CisJfQorICAgICAgZmggPSBnZXRfcmZkIChmZCwgcmYpOworCisgICAgICBpbmR4ID0gcGFyc2VfdHlwZSAoZmggLSBkZWJ1Z19pbmZvLT5mZHIsCisJCQkgZGVidWdfaW5mby0+ZXh0ZXJuYWxfYXV4ICsgZmgtPmlhdXhCYXNlLAorCQkJIGlkLCAoaW50ICopIE5VTEwsIGJpZ2VuZCwgc3ltX25hbWUpOworCisgICAgICAvKiBUaGUgYm91bmRzIHR5cGUgc2hvdWxkIGJlIGFuIGludGVnZXIgdHlwZSwgYnV0IG1pZ2h0IGJlIGFueXRoaW5nCisJIGVsc2UgZHVlIHRvIGNvcnJ1cHQgYXV4IGVudHJpZXMuICAqLworICAgICAgaWYgKFRZUEVfQ09ERSAoaW5keCkgIT0gVFlQRV9DT0RFX0lOVCkKKwl7CisJICBjb21wbGFpbiAoJmFycmF5X2luZGV4X3R5cGVfY29tcGxhaW50LCBzeW1fbmFtZSk7CisJICBpbmR4ID0gbWRlYnVnX3R5cGVfaW50OworCX0KKworICAgICAgLyogR2V0IHRoZSBib3VuZHMsIGFuZCBjcmVhdGUgdGhlIGFycmF5IHR5cGUuICAqLworICAgICAgYXgrKzsKKyAgICAgIGxvd2VyID0gQVVYX0dFVF9ETkxPVyAoYmlnZW5kLCBheCk7CisgICAgICBheCsrOworICAgICAgdXBwZXIgPSBBVVhfR0VUX0ROSElHSCAoYmlnZW5kLCBheCk7CisgICAgICBheCsrOworICAgICAgcmYgPSBBVVhfR0VUX1dJRFRIIChiaWdlbmQsIGF4KTsJLyogYml0IHNpemUgb2YgYXJyYXkgZWxlbWVudCAqLworCisgICAgICByYW5nZSA9IGNyZWF0ZV9yYW5nZV90eXBlICgoc3RydWN0IHR5cGUgKikgTlVMTCwgaW5keCwKKwkJCQkgbG93ZXIsIHVwcGVyKTsKKworICAgICAgdCA9IGNyZWF0ZV9hcnJheV90eXBlICgoc3RydWN0IHR5cGUgKikgTlVMTCwgKnRwcCwgcmFuZ2UpOworCisgICAgICAvKiBXZSB1c2VkIHRvIGZpbGwgaW4gdGhlIHN1cHBsaWVkIGFycmF5IGVsZW1lbnQgYml0c2l6ZQorCSBoZXJlIGlmIHRoZSBUWVBFX0xFTkdUSCBvZiB0aGUgdGFyZ2V0IHR5cGUgd2FzIHplcm8uCisJIFRoaXMgaGFwcGVucyBmb3IgYSBgcG9pbnRlciB0byBhbiBhcnJheSBvZiBhbm9ueW1vdXMgc3RydWN0cycsCisJIGJ1dCBpbiB0aGlzIGNhc2UgdGhlIGFycmF5IGVsZW1lbnQgYml0c2l6ZSBpcyBhbHNvIHplcm8sCisJIHNvIG5vdGhpbmcgaXMgZ2FpbmVkLgorCSBBbmQgd2UgdXNlZCB0byBjaGVjayB0aGUgVFlQRV9MRU5HVEggb2YgdGhlIHRhcmdldCB0eXBlIGFnYWluc3QKKwkgdGhlIHN1cHBsaWVkIGFycmF5IGVsZW1lbnQgYml0c2l6ZS4KKwkgZ2NjIGNhdXNlcyBhIG1pc21hdGNoIGZvciBgcG9pbnRlciB0byBhcnJheSBvZiBvYmplY3QnLAorCSBzaW5jZSB0aGUgc2RiIGRpcmVjdGl2ZXMgaXQgdXNlcyBkbyBub3QgaGF2ZSBhIHdheSBvZgorCSBzcGVjaWZ5aW5nIHRoZSBiaXRzaXplLCBidXQgaXQgZG9lcyBubyBoYXJtICh0aGUKKwkgVFlQRV9MRU5HVEggc2hvdWxkIGJlIGNvcnJlY3QpIGFuZCB3ZSBzaG91bGQgYmUgYWJsZSB0bworCSBpZ25vcmUgdGhlIGVycm9uZW91cyBiaXRzaXplIGZyb20gdGhlIGF1eGlsaWFyeSBlbnRyeSBzYWZlbHkuCisJIGRieCBzZWVtcyB0byBpZ25vcmUgaXQgdG9vLiAgKi8KKworICAgICAgLyogVFlQRV9GTEFHX1RBUkdFVF9TVFVCIG5vdyB0YWtlcyBjYXJlIG9mIHRoZSB6ZXJvIFRZUEVfTEVOR1RICisJIHByb2JsZW0uICAqLworICAgICAgaWYgKFRZUEVfTEVOR1RIICgqdHBwKSA9PSAwKQorCXsKKwkgIFRZUEVfRkxBR1MgKHQpIHw9IFRZUEVfRkxBR19UQVJHRVRfU1RVQjsKKwl9CisKKyAgICAgICp0cHAgPSB0OworICAgICAgcmV0dXJuIDQgKyBvZmY7CisKKyAgICBjYXNlIHRxVm9sOgorICAgICAgLyogVm9sYXRpbGUgLS0gY3VycmVudGx5IGlnbm9yZWQgKi8KKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSB0cUNvbnN0OgorICAgICAgLyogQ29uc3QgLS0gY3VycmVudGx5IGlnbm9yZWQgKi8KKyAgICAgIHJldHVybiAwOworCisgICAgZGVmYXVsdDoKKyAgICAgIGNvbXBsYWluICgmdW5rbm93bl90eXBlX3F1YWxfY29tcGxhaW50LCB0cSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKworLyogUGFyc2UgYSBwcm9jZWR1cmUgZGVzY3JpcHRvciByZWNvcmQgUFIuICBOb3RlIHRoYXQgdGhlIHByb2NlZHVyZSBpcworICAgcGFyc2VkIF9hZnRlcl8gdGhlIGxvY2FsIHN5bWJvbHMsIG5vdyB3ZSBqdXN0IGluc2VydCB0aGUgZXh0cmEKKyAgIGluZm9ybWF0aW9uIHdlIG5lZWQgaW50byBhIE1JUFNfRUZJX1NZTUJPTF9OQU1FIHN5bWJvbCB0aGF0IGhhcworICAgYWxyZWFkeSBiZWVuIHBsYWNlZCBpbiB0aGUgcHJvY2VkdXJlJ3MgbWFpbiBibG9jay4gIE5vdGUgYWxzbyB0aGF0CisgICBpbWFnZXMgdGhhdCBoYXZlIGJlZW4gcGFydGlhbGx5IHN0cmlwcGVkIChsZCAteCkgaGF2ZSBiZWVuIGRlcHJpdmVkCisgICBvZiBsb2NhbCBzeW1ib2xzLCBhbmQgd2UgaGF2ZSB0byBjb3BlIHdpdGggdGhlbSBoZXJlLiAgRklSU1RfT0ZGIGlzCisgICB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBwcm9jZWR1cmUgZm9yIHRoaXMgRkRSOyB3ZSBhZGp1c3QgdGhlCisgICBhZGRyZXNzIGJ5IHRoaXMgYW1vdW50LCBidXQgSSBkb24ndCBrbm93IHdoeS4gIFNFQVJDSF9TWU1UQUIgaXMgdGhlIHN5bXRhYgorICAgdG8gbG9vayBmb3IgdGhlIGZ1bmN0aW9uIHdoaWNoIGNvbnRhaW5zIHRoZSBNSVBTX0VGSV9TWU1CT0xfTkFNRSBzeW1ib2wKKyAgIGluIHF1ZXN0aW9uLCBvciBOVUxMIHRvIHVzZSB0b3Bfc3RhY2stPmN1cl9ibG9jay4gICovCisKK3N0YXRpYyB2b2lkIHBhcnNlX3Byb2NlZHVyZSBQQVJBTVMgKChQRFIgKiwgc3RydWN0IHN5bXRhYiAqLAorCQkJCSAgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKKworc3RhdGljIHZvaWQKK3BhcnNlX3Byb2NlZHVyZSAocHIsIHNlYXJjaF9zeW10YWIsIHBzdCkKKyAgICAgUERSICpwcjsKKyAgICAgc3RydWN0IHN5bXRhYiAqc2VhcmNoX3N5bXRhYjsKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7Cit7CisgIHN0cnVjdCBzeW1ib2wgKnMsICppOworICBzdHJ1Y3QgYmxvY2sgKmI7CisgIHN0cnVjdCBtaXBzX2V4dHJhX2Z1bmNfaW5mbyAqZTsKKyAgY2hhciAqc2hfbmFtZTsKKworICAvKiBTaW1wbGUgcnVsZSB0byBmaW5kIGZpbGVzIGxpbmtlZCAiLXgiICovCisgIGlmIChjdXJfZmRyLT5yc3MgPT0gLTEpCisgICAgeworICAgICAgaWYgKHByLT5pc3ltID09IC0xKQorCXsKKwkgIC8qIFN0YXRpYyBwcm9jZWR1cmUgYXQgYWRkcmVzcyBwci0+YWRyLiAgU2lnaC4gKi8KKwkgIC8qIEZJWE1FLTMyeDY0LiAgYXNzdW1pbmcgcHItPmFkciBmaXRzIGluIGxvbmcuICAqLworCSAgY29tcGxhaW4gKCZwZHJfc3RhdGljX3N5bWJvbF9jb21wbGFpbnQsICh1bnNpZ25lZCBsb25nKSBwci0+YWRyKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogZXh0ZXJuYWwgKi8KKwkgIEVYVFIgc2hlOworCSAgCisJICAoKmRlYnVnX3N3YXAtPnN3YXBfZXh0X2luKSAoY3VyX2JmZCwKKwkJCQkgICAgICAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfZXh0CisJCQkJICAgICAgICsgKHByLT5pc3ltCisJCQkJCSAgKiBkZWJ1Z19zd2FwLT5leHRlcm5hbF9leHRfc2l6ZSkpLAorCQkJCSAgICAgICZzaGUpOworCSAgc2hfbmFtZSA9IGRlYnVnX2luZm8tPnNzZXh0ICsgc2hlLmFzeW0uaXNzOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBGdWxsIHN5bWJvbHMgKi8KKyAgICAgIFNZTVIgc2g7CisKKyAgICAgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChjdXJfYmZkLAorCQkJCSAgKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQorCQkJCSAgICsgKChjdXJfZmRyLT5pc3ltQmFzZSArIHByLT5pc3ltKQorCQkJCSAgICAgICogZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpKSwKKwkJCQkgICZzaCk7CisgICAgICBzaF9uYW1lID0gZGVidWdfaW5mby0+c3MgKyBjdXJfZmRyLT5pc3NCYXNlICsgc2guaXNzOworICAgIH0KKworICBpZiAoc2VhcmNoX3N5bXRhYiAhPSBOVUxMKQorICAgIHsKKyNpZiAwCisgICAgICAvKiBUaGlzIGxvc2VzIGJvdGggaW4gdGhlIGNhc2UgbWVudGlvbmVkICh3YW50IGEgc3RhdGljLCBmaW5kIGEgZ2xvYmFsKSwKKwkgYnV0IGFsc28gaWYgd2UgYXJlIGxvb2tpbmcgdXAgYSBub24tbWFuZ2xlZCBuYW1lIHdoaWNoIGhhcHBlbnMgdG8KKwkgbWF0Y2ggdGhlIG5hbWUgb2YgYSBtYW5nbGVkIGZ1bmN0aW9uLiAgKi8KKyAgICAgIC8qIFdlIGhhdmUgdG8gc2F2ZSB0aGUgY3VyX2ZkciBhY3Jvc3MgdGhlIGNhbGwgdG8gbG9va3VwX3N5bWJvbC4KKwkgSWYgdGhlIHBkciBpcyBmb3IgYSBzdGF0aWMgZnVuY3Rpb24gYW5kIGlmIGEgZ2xvYmFsIGZ1bmN0aW9uIHdpdGgKKwkgdGhlIHNhbWUgbmFtZSBleGlzdHMsIGxvb2t1cF9zeW1ib2wgd2lsbCBldmVudHVhbGx5IHJlYWQgaW4gdGhlIHN5bXRhYgorCSBmb3IgdGhlIGdsb2JhbCBmdW5jdGlvbiBhbmQgY2xvYmJlciBjdXJfZmRyLiAgKi8KKyAgICAgIEZEUiAqc2F2ZV9jdXJfZmRyID0gY3VyX2ZkcjsKKyAgICAgIHMgPSBsb29rdXBfc3ltYm9sIChzaF9uYW1lLCBOVUxMLCBWQVJfTkFNRVNQQUNFLCAwLCBOVUxMKTsKKyAgICAgIGN1cl9mZHIgPSBzYXZlX2N1cl9mZHI7CisjZWxzZQorICAgICAgcyA9IG15bG9va3VwX3N5bWJvbAorCShzaF9uYW1lLAorCSBCTE9DS1ZFQ1RPUl9CTE9DSyAoQkxPQ0tWRUNUT1IgKHNlYXJjaF9zeW10YWIpLCBTVEFUSUNfQkxPQ0spLAorCSBWQVJfTkFNRVNQQUNFLAorCSBMT0NfQkxPQ0spOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgcyA9IG15bG9va3VwX3N5bWJvbCAoc2hfbmFtZSwgdG9wX3N0YWNrLT5jdXJfYmxvY2ssCisJCQkgVkFSX05BTUVTUEFDRSwgTE9DX0JMT0NLKTsKKworICBpZiAocyAhPSAwKQorICAgIHsKKyAgICAgIGIgPSBTWU1CT0xfQkxPQ0tfVkFMVUUgKHMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbXBsYWluICgmcGRyX2Zvcl9ub25zeW1ib2xfY29tcGxhaW50LCBzaF9uYW1lKTsKKyNpZiAxCisgICAgICByZXR1cm47CisjZWxzZQorLyogRklYTUUgLS0gZGVsZXRlLiAgV2UgY2FuJ3QgZG8gc3ltYm9sIGFsbG9jYXRpb24gbm93OyBpdCdzIGFsbCBkb25lLiAgKi8KKyAgICAgIHMgPSBuZXdfc3ltYm9sIChzaF9uYW1lKTsKKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHMpID0gVkFSX05BTUVTUEFDRTsKKyAgICAgIFNZTUJPTF9DTEFTUyAocykgPSBMT0NfQkxPQ0s7CisgICAgICAvKiBEb25ubyBpdHMgdHlwZSwgaG9wZSBpbnQgaXMgb2sgKi8KKyAgICAgIFNZTUJPTF9UWVBFIChzKSA9IGxvb2t1cF9mdW5jdGlvbl90eXBlIChtZGVidWdfdHlwZV9pbnQpOworICAgICAgYWRkX3N5bWJvbCAocywgdG9wX3N0YWNrLT5jdXJfYmxvY2spOworICAgICAgLyogV29udCBoYXZlIHN5bWJvbHMgZm9yIHRoaXMgb25lICovCisgICAgICBiID0gbmV3X2Jsb2NrICgyKTsKKyAgICAgIFNZTUJPTF9CTE9DS19WQUxVRSAocykgPSBiOworICAgICAgQkxPQ0tfRlVOQ1RJT04gKGIpID0gczsKKyAgICAgIEJMT0NLX1NUQVJUIChiKSA9IHByLT5hZHI7CisgICAgICAvKiBCT1VORCB1c2VkIHRvIGJlIHRoZSBlbmQgb2YgcHJvY2VkdXJlJ3MgdGV4dCwgYnV0IHRoZQorCSBhcmd1bWVudCBpcyBubyBsb25nZXIgcGFzc2VkIGluLiAgKi8KKyAgICAgIEJMT0NLX0VORCAoYikgPSBib3VuZDsKKyAgICAgIEJMT0NLX1NVUEVSQkxPQ0sgKGIpID0gdG9wX3N0YWNrLT5jdXJfYmxvY2s7CisgICAgICBhZGRfYmxvY2sgKGIsIHRvcF9zdGFjay0+Y3VyX3N0KTsKKyNlbmRpZgorICAgIH0KKworICBpID0gbXlsb29rdXBfc3ltYm9sIChNSVBTX0VGSV9TWU1CT0xfTkFNRSwgYiwgTEFCRUxfTkFNRVNQQUNFLCBMT0NfQ09OU1QpOworCisgIGlmIChpKQorICAgIHsKKyAgICAgIGUgPSAoc3RydWN0IG1pcHNfZXh0cmFfZnVuY19pbmZvICopIFNZTUJPTF9WQUxVRSAoaSk7CisgICAgICBlLT5wZHIgPSAqcHI7CisgICAgICBlLT5wZHIuaXN5bSA9IChsb25nKSBzOworCisgICAgICAvKiBHREIgZXhwZWN0cyB0aGUgYWJzb2x1dGUgZnVuY3Rpb24gc3RhcnQgYWRkcmVzcyBmb3IgdGhlCisJIHByb2NlZHVyZSBkZXNjcmlwdG9yIGluIGUtPnBkci5hZHIuCisJIEFzIHRoZSBhZGRyZXNzIGluIHRoZSBwcm9jZWR1cmUgZGVzY3JpcHRvciBpcyB1c3VhbGx5IHJlbGF0aXZlLAorCSB3ZSB3b3VsZCBoYXZlIHRvIHJlbG9jYXRlIGUtPnBkci5hZHIgd2l0aCBjdXJfZmRyLT5hZHIgYW5kCisJIEFOT0ZGU0VUIChwc3QtPnNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCkuCisJIFVuZm9ydHVuYXRlbHkgY3VyX2Zkci0+YWRyIGFuZCBlLT5wZHIuYWRyIGFyZSBib3RoIGFic29sdXRlCisJIGluIHNoYXJlZCBsaWJyYXJpZXMgb24gc29tZSBzeXN0ZW1zLCBhbmQgb24gb3RoZXIgc3lzdGVtcworCSBlLT5wZHIuYWRyIGlzIHNvbWV0aW1lcyBvZmZzZXQgYnkgYSBib2d1cyB2YWx1ZS4KKwkgVG8gd29yayBhcm91bmQgdGhlc2UgcHJvYmxlbXMsIHdlIHJlcGxhY2UgZS0+cGRyLmFkciB3aXRoCisJIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbi4gICovCisgICAgICBlLT5wZHIuYWRyID0gQkxPQ0tfU1RBUlQgKGIpOworCisgICAgICAvKiBDb3JyZWN0IGluY29ycmVjdCBzZXRqbXAgcHJvY2VkdXJlIGRlc2NyaXB0b3IgZnJvbSB0aGUgbGlicmFyeQorCSB0byBtYWtlIGJhY2t0cmFjZSB0aHJvdWdoIHNldGptcCB3b3JrLiAgKi8KKyAgICAgIGlmIChlLT5wZHIucGNyZWcgPT0gMCAmJiBTVFJFUSAoc2hfbmFtZSwgInNldGptcCIpKQorCXsKKwkgIGNvbXBsYWluICgmYmFkX3NldGptcF9wZHJfY29tcGxhaW50LCAwKTsKKwkgIGUtPnBkci5wY3JlZyA9IFJBX1JFR05VTTsKKwkgIGUtPnBkci5yZWdtYXNrID0gMHg4MDAwMDAwMDsKKwkgIGUtPnBkci5yZWdvZmZzZXQgPSAtNDsKKwl9CisgICAgfQorCisgIC8qIEl0IHdvdWxkIGJlIHJlYXNvbmFibGUgdGhhdCBmdW5jdGlvbnMgdGhhdCBoYXZlIGJlZW4gY29tcGlsZWQKKyAgICAgd2l0aG91dCBkZWJ1Z2dpbmcgaW5mbyBoYXZlIGEgYnROaWwgdHlwZSBmb3IgdGhlaXIgcmV0dXJuIHZhbHVlLAorICAgICBhbmQgZnVuY3Rpb25zIHRoYXQgYXJlIHZvaWQgYW5kIGFyZSBjb21waWxlZCB3aXRoIGRlYnVnZ2luZyBpbmZvCisgICAgIGhhdmUgYnRWb2lkLgorICAgICBnY2MgYW5kIERFQyBmNzcgcHV0IG91dCBidE5pbCB0eXBlcyBmb3IgYm90aCBjYXNlcywgc28gYnROaWwgaXMgbWFwcGVkCisgICAgIHRvIFRZUEVfQ09ERV9WT0lEIGluIHBhcnNlX3R5cGUgdG8gZ2V0IHRoZSBgY29tcGlsZWQgd2l0aCBkZWJ1Z2dpbmcgaW5mbycKKyAgICAgY2FzZSByaWdodC4KKyAgICAgVGhlIGdsZXZlbCBmaWVsZCBpbiBjdXJfZmRyIGNvdWxkIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBwcmVzZW5jZQorICAgICBvZiBkZWJ1Z2dpbmcgaW5mbywgYnV0IEdDQyBkb2Vzbid0IGFsd2F5cyBwYXNzIHRoZSAtZyBzd2l0Y2ggc2V0dGluZ3MKKyAgICAgdG8gdGhlIGFzc2VtYmxlciBhbmQgR0FTIGRvZXNuJ3Qgc2V0IHRoZSBnbGV2ZWwgZmllbGQgZnJvbSB0aGUgLWcgc3dpdGNoCisgICAgIHNldHRpbmdzLgorICAgICBUbyB3b3JrIGFyb3VuZCB0aGVzZSBwcm9ibGVtcywgdGhlIHJldHVybiB2YWx1ZSB0eXBlIG9mIGEgVFlQRV9DT0RFX1ZPSUQKKyAgICAgZnVuY3Rpb24gaXMgYWRqdXN0ZWQgYWNjb3JkaW5nbHkgaWYgbm8gZGVidWdnaW5nIGluZm8gd2FzIGZvdW5kIGluIHRoZQorICAgICBjb21waWxhdGlvbiB1bml0LiAgKi8KKyAKKyAgaWYgKHByb2Nlc3NpbmdfZ2NjX2NvbXBpbGF0aW9uID09IDAKKyAgICAgICYmIGZvdW5kX2Vjb2ZmX2RlYnVnZ2luZ19pbmZvID09IDAKKyAgICAgICYmIFRZUEVfQ09ERSAoVFlQRV9UQVJHRVRfVFlQRSAoU1lNQk9MX1RZUEUgKHMpKSkgPT0gVFlQRV9DT0RFX1ZPSUQpCisgICAgU1lNQk9MX1RZUEUgKHMpID0gbm9kZWJ1Z19mdW5jX3N5bWJvbF90eXBlOworfQorCisvKiBSZWxvY2F0ZSB0aGUgZXh0cmEgZnVuY3Rpb24gaW5mbyBwb2ludGVkIHRvIGJ5IHRoZSBzeW1ib2wgdGFibGUuICAqLworCit2b2lkCitlY29mZl9yZWxvY2F0ZV9lZmkgKHN5bSwgZGVsdGEpCisgICAgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgICAgQ09SRV9BRERSIGRlbHRhOworeworICBzdHJ1Y3QgbWlwc19leHRyYV9mdW5jX2luZm8gKmU7CisKKyAgZSA9IChzdHJ1Y3QgbWlwc19leHRyYV9mdW5jX2luZm8gKikgU1lNQk9MX1ZBTFVFIChzeW0pOworICAKKyAgZS0+cGRyLmFkciArPSBkZWx0YTsKK30KKworLyogUGFyc2UgdGhlIGV4dGVybmFsIHN5bWJvbCBFUy4gSnVzdCBjYWxsIHBhcnNlX3N5bWJvbCgpIGFmdGVyCisgICBtYWtpbmcgc3VyZSB3ZSBrbm93IHdoZXJlIHRoZSBhdXggYXJlIGZvciBpdC4KKyAgIEJJR0VORCBzYXlzIHdoZXRoZXIgYXV4IGVudHJpZXMgYXJlIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbi4KKworICAgVGhpcyByb3V0aW5lIGNsb2JiZXJzIHRvcF9zdGFjay0+Y3VyX2Jsb2NrIGFuZCAtPmN1cl9zdC4gKi8KKworc3RhdGljIHZvaWQgcGFyc2VfZXh0ZXJuYWwgUEFSQU1TICgoRVhUUiAqLCBpbnQsIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKikpOworCitzdGF0aWMgdm9pZAorcGFyc2VfZXh0ZXJuYWwgKGVzLCBiaWdlbmQsIHNlY3Rpb25fb2Zmc2V0cykKKyAgICAgRVhUUiAqZXM7CisgICAgIGludCBiaWdlbmQ7CisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKK3sKKyAgdW5pb24gYXV4X2V4dCAqYXg7CisKKyAgaWYgKGVzLT5pZmQgIT0gaWZkTmlsKQorICAgIHsKKyAgICAgIGN1cl9mZCA9IGVzLT5pZmQ7CisgICAgICBjdXJfZmRyID0gZGVidWdfaW5mby0+ZmRyICsgY3VyX2ZkOworICAgICAgYXggPSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9hdXggKyBjdXJfZmRyLT5pYXV4QmFzZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjdXJfZmRyID0gZGVidWdfaW5mby0+ZmRyOworICAgICAgYXggPSAwOworICAgIH0KKworICAvKiBSZWFkaW5nIC5vIGZpbGVzICovCisgIGlmIChTQ19JU19VTkRFRihlcy0+YXN5bS5zYykgfHwgZXMtPmFzeW0uc2MgPT0gc2NOaWwpCisgICAgeworICAgICAgY2hhciAqd2hhdDsKKyAgICAgIHN3aXRjaCAoZXMtPmFzeW0uc3QpCisJeworCWNhc2Ugc3ROaWw6CisJICAvKiBUaGVzZSBhcmUgZ2VuZXJhdGVkIGZvciBzdGF0aWMgc3ltYm9scyBpbiAubyBmaWxlcywKKwkgICAgIGlnbm9yZSB0aGVtLiAgKi8KKwkgIHJldHVybjsKKwljYXNlIHN0U3RhdGljUHJvYzoKKwljYXNlIHN0UHJvYzoKKwkgIHdoYXQgPSAicHJvY2VkdXJlIjsKKwkgIG5fdW5kZWZfcHJvY3MrKzsKKwkgIGJyZWFrOworCWNhc2Ugc3RHbG9iYWw6CisJICB3aGF0ID0gInZhcmlhYmxlIjsKKwkgIG5fdW5kZWZfdmFycysrOworCSAgYnJlYWs7CisJY2FzZSBzdExhYmVsOgorCSAgd2hhdCA9ICJsYWJlbCI7CisJICBuX3VuZGVmX2xhYmVscysrOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHdoYXQgPSAic3ltYm9sIjsKKwkgIGJyZWFrOworCX0KKyAgICAgIG5fdW5kZWZfc3ltYm9scysrOworICAgICAgLyogRklYTUU6ICBUdXJuIHRoaXMgaW50byBhIGNvbXBsYWludD8gKi8KKyAgICAgIGlmIChpbmZvX3ZlcmJvc2UpCisJcHJpbnRmX2ZpbHRlcmVkICgiV2FybmluZzogJXMgYCVzJyBpcyB1bmRlZmluZWQgKGluICVzKVxuIiwKKwkJCSB3aGF0LCBkZWJ1Z19pbmZvLT5zc2V4dCArIGVzLT5hc3ltLmlzcywKKwkJCSBmZHJfbmFtZSAoY3VyX2ZkcikpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBzd2l0Y2ggKGVzLT5hc3ltLnN0KQorICAgIHsKKyAgICBjYXNlIHN0UHJvYzoKKyAgICBjYXNlIHN0U3RhdGljUHJvYzoKKyAgICAgIC8qIFRoZXJlIGlzIG5vIG5lZWQgdG8gcGFyc2UgdGhlIGV4dGVybmFsIHByb2NlZHVyZSBzeW1ib2xzLgorCSBJZiB0aGV5IGFyZSBmcm9tIG9iamVjdHMgY29tcGlsZWQgd2l0aG91dCAtZywgdGhlaXIgaW5kZXggd2lsbAorCSBiZSBpbmRleE5pbCwgYW5kIHRoZSBzeW1ib2wgZGVmaW5pdGlvbiBmcm9tIHRoZSBtaW5pbWFsIHN5bWJvbAorCSBpcyBwcmVmZXJyYWJsZSAoeWllbGRpbmcgYSBmdW5jdGlvbiByZXR1cm5pbmcgaW50IGluc3RlYWQgb2YgaW50KS4KKwkgSWYgdGhlIGluZGV4IHBvaW50cyB0byBhIGxvY2FsIHByb2NlZHVyZSBzeW1ib2wsIHRoZSBsb2NhbAorCSBzeW1ib2wgYWxyZWFkeSBwcm92aWRlcyB0aGUgY29ycmVjdCB0eXBlLgorCSBOb3RlIHRoYXQgdGhlIGluZGV4IG9mIHRoZSBleHRlcm5hbCBwcm9jZWR1cmUgc3ltYm9sIHBvaW50cworCSB0byB0aGUgbG9jYWwgcHJvY2VkdXJlIHN5bWJvbCBpbiB0aGUgbG9jYWwgc3ltYm9sIHRhYmxlLCBhbmQKKwkgX25vdF8gdG8gdGhlIGF1eGlsaWFyeSBzeW1ib2wgaW5mby4gICovCisgICAgICBicmVhazsKKyAgICBjYXNlIHN0R2xvYmFsOgorICAgIGNhc2Ugc3RMYWJlbDoKKyAgICAgIC8qIEdsb2JhbCBjb21tb24gc3ltYm9scyBhcmUgcmVzb2x2ZWQgYnkgdGhlIHJ1bnRpbWUgbG9hZGVyLAorCSBpZ25vcmUgdGhlbS4gICovCisgICAgICBpZiAoU0NfSVNfQ09NTU9OKGVzLT5hc3ltLnNjKSkKKwlicmVhazsKKworICAgICAgLyogTm90ZSB0aGF0IHRoZSBjYXNlIG9mIGEgc3ltYm9sIHdpdGggaW5kZXhOaWwgbXVzdCBiZSBoYW5kbGVkCisJIGFueXdheXMgYnkgcGFyc2Vfc3ltYm9sKCkuICAqLworICAgICAgcGFyc2Vfc3ltYm9sICgmZXMtPmFzeW0sIGF4LCAoY2hhciAqKSBOVUxMLCBiaWdlbmQsIHNlY3Rpb25fb2Zmc2V0cyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBQYXJzZSB0aGUgbGluZSBudW1iZXIgaW5mbyBmb3IgZmlsZSBkZXNjcmlwdG9yIEZIIGludG8KKyAgIEdEQidzIGxpbmV0YWJsZSBMVC4gIE1JUFMnIGVuY29kaW5nIHJlcXVpcmVzIGEgbGl0dGxlIGJpdAorICAgb2YgbWFnaWMgdG8gZ2V0IHRoaW5ncyBvdXQuICBOb3RlIGFsc28gdGhhdCBNSVBTJyBsaW5lCisgICBudW1iZXJzIGNhbiBnbyBiYWNrIGFuZCBmb3J0aCwgYXBwYXJlbnRseSB3ZSBjYW4gbGl2ZQorICAgd2l0aCB0aGF0IGFuZCBkbyBub3QgbmVlZCB0byByZW9yZGVyIG91ciBsaW5ldGFibGVzICovCisKK3N0YXRpYyB2b2lkIHBhcnNlX2xpbmVzIFBBUkFNUyAoKEZEUiAqLCBQRFIgKiwgc3RydWN0IGxpbmV0YWJsZSAqLCBpbnQsCisJCQkJIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqLCBDT1JFX0FERFIpKTsKKworc3RhdGljIHZvaWQKK3BhcnNlX2xpbmVzIChmaCwgcHIsIGx0LCBtYXhsaW5lcywgcHN0LCBsb3dlc3RfcGRyX2FkZHIpCisgICAgIEZEUiAqZmg7CisgICAgIFBEUiAqcHI7CisgICAgIHN0cnVjdCBsaW5ldGFibGUgKmx0OworICAgICBpbnQgbWF4bGluZXM7CisgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN0OworICAgICBDT1JFX0FERFIgbG93ZXN0X3Bkcl9hZGRyOworeworICB1bnNpZ25lZCBjaGFyICpiYXNlOworICBpbnQgaiwgazsKKyAgaW50IGRlbHRhLCBjb3VudCwgbGluZW5vID0gMDsKKworICBpZiAoZmgtPmNiTGluZSA9PSAwKQorICAgIHJldHVybjsKKworICAvKiBTY2FuIGJ5IHByb2NlZHVyZSBkZXNjcmlwdG9ycyAqLworICBrID0gMDsKKyAgZm9yIChqID0gMDsgaiA8IGZoLT5jcGQ7IGorKywgcHIrKykKKyAgICB7CisgICAgICBDT1JFX0FERFIgbDsKKyAgICAgIENPUkVfQUREUiBhZHI7CisgICAgICB1bnNpZ25lZCBjaGFyICpoYWx0OworCisgICAgICAvKiBObyBjb2RlIGZvciB0aGlzIG9uZSAqLworICAgICAgaWYgKHByLT5pbGluZSA9PSBpbGluZU5pbCB8fAorCSAgcHItPmxuTG93ID09IC0xIHx8IHByLT5sbkhpZ2ggPT0gLTEpCisJY29udGludWU7CisKKyAgICAgIC8qIERldGVybWluZSBzdGFydCBhbmQgZW5kIGFkZHJlc3Mgb2YgY29tcHJlc3NlZCBsaW5lIGJ5dGVzIGZvcgorCSB0aGlzIHByb2NlZHVyZS4gICovCisgICAgICBiYXNlID0gZGVidWdfaW5mby0+bGluZSArIGZoLT5jYkxpbmVPZmZzZXQ7CisgICAgICBpZiAoaiAhPSAoZmgtPmNwZCAtIDEpKQorIAloYWx0ID0gYmFzZSArIHByWzFdLmNiTGluZU9mZnNldDsKKyAgICAgIGVsc2UKKyAJaGFsdCA9IGJhc2UgKyBmaC0+Y2JMaW5lOworICAgICAgYmFzZSArPSBwci0+Y2JMaW5lT2Zmc2V0OworCisgICAgICBhZHIgPSBwc3QtPnRleHRsb3cgKyBwci0+YWRyIC0gbG93ZXN0X3Bkcl9hZGRyOworCisgICAgICBsID0gYWRyID4+IDI7CQkvKiBpbiB3b3JkcyAqLworICAgICAgZm9yIChsaW5lbm8gPSBwci0+bG5Mb3c7IGJhc2UgPCBoYWx0OyApCisJeworCSAgY291bnQgPSAqYmFzZSAmIDB4MGY7CisJICBkZWx0YSA9ICpiYXNlKysgPj4gNDsKKwkgIGlmIChkZWx0YSA+PSA4KQorCSAgICBkZWx0YSAtPSAxNjsKKwkgIGlmIChkZWx0YSA9PSAtOCkKKwkgICAgeworCSAgICAgIGRlbHRhID0gKGJhc2VbMF0gPDwgOCkgfCBiYXNlWzFdOworCSAgICAgIGlmIChkZWx0YSA+PSAweDgwMDApCisJCWRlbHRhIC09IDB4MTAwMDA7CisJICAgICAgYmFzZSArPSAyOworCSAgICB9CisJICBsaW5lbm8gKz0gZGVsdGE7CS8qIGZpcnN0IGRlbHRhIGlzIDAgKi8KKworCSAgLyogQ29tcGxhaW4gaWYgdGhlIGxpbmUgdGFibGUgb3ZlcmZsb3dzLiBDb3VsZCBoYXBwZW4KKwkgICAgIHdpdGggY29ycnVwdCBiaW5hcmllcy4gICovCisJICBpZiAobHQtPm5pdGVtcyA+PSBtYXhsaW5lcykKKwkgICAgeworCSAgICAgIGNvbXBsYWluICgmYmFkX2xpbmV0YWJsZV9ndWVzc19jb21wbGFpbnQsIGZkcl9uYW1lIChmaCkpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBrID0gYWRkX2xpbmUgKGx0LCBsaW5lbm8sIGwsIGspOworCSAgbCArPSBjb3VudCArIDE7CisJfQorICAgIH0KK30KKwwKKy8qIE1hc3RlciBwYXJzaW5nIHByb2NlZHVyZSBmb3IgZmlyc3QtcGFzcyByZWFkaW5nIG9mIGZpbGUgc3ltYm9scworICAgaW50byBhIHBhcnRpYWxfc3ltdGFiLiAgKi8KKworc3RhdGljIHZvaWQKK3BhcnNlX3BhcnRpYWxfc3ltYm9scyAob2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworeworICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplID0gZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemU7CisgIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmZkX3NpemUgPSBkZWJ1Z19zd2FwLT5leHRlcm5hbF9yZmRfc2l6ZTsKKyAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9leHRfc2l6ZSA9IGRlYnVnX3N3YXAtPmV4dGVybmFsX2V4dF9zaXplOworICB2b2lkICgqIGNvbnN0IHN3YXBfZXh0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBFWFRSICopKQorICAgID0gZGVidWdfc3dhcC0+c3dhcF9leHRfaW47CisgIHZvaWQgKCogY29uc3Qgc3dhcF9zeW1faW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFNZTVIgKikpCisgICAgPSBkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbjsKKyAgdm9pZCAoKiBjb25zdCBzd2FwX3JmZF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgUkZEVCAqKSkKKyAgICA9IGRlYnVnX3N3YXAtPnN3YXBfcmZkX2luOworICBpbnQgZl9pZHgsIHNfaWR4OworICBIRFJSICpoZHIgPSAmZGVidWdfaW5mby0+c3ltYm9saWNfaGVhZGVyOworICAvKiBSdW5uaW5nIHBvaW50ZXJzICovCisgIEZEUiAqZmg7CisgIGNoYXIgKmV4dF9vdXQ7CisgIGNoYXIgKmV4dF9vdXRfZW5kOworICBFWFRSICpleHRfYmxvY2s7CisgIHJlZ2lzdGVyIEVYVFIgKmV4dF9pbjsKKyAgRVhUUiAqZXh0X2luX2VuZDsKKyAgU1lNUiBzaDsKKyAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7CisgIGludCB0ZXh0bG93X25vdF9zZXQgPSAxOworICBpbnQgcGFzdF9maXJzdF9zb3VyY2VfZmlsZSA9IDA7CisKKyAgLyogTGlzdCBvZiBjdXJyZW50IHBzeW10YWIncyBpbmNsdWRlIGZpbGVzICovCisgIGNoYXIgKipwc3ltdGFiX2luY2x1ZGVfbGlzdDsKKyAgaW50IGluY2x1ZGVzX2FsbG9jYXRlZDsKKyAgaW50IGluY2x1ZGVzX3VzZWQ7CisgIEVYVFIgKmV4dGVybl90YWI7CisgIHN0cnVjdCBwc3RfbWFwICpmZHJfdG9fcHN0OworICAvKiBJbmRleCB3aXRoaW4gY3VycmVudCBwc3ltdGFiIGRlcGVuZGVuY3kgbGlzdCAqLworICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKipkZXBlbmRlbmN5X2xpc3Q7CisgIGludCBkZXBlbmRlbmNpZXNfdXNlZCwgZGVwZW5kZW5jaWVzX2FsbG9jYXRlZDsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKyAgY2hhciAqbmFtZTsKKyAgZW51bSBsYW5ndWFnZSBwcmV2X2xhbmd1YWdlOworICBhc2VjdGlvbiAqdGV4dF9zZWN0OworICBpbnQgcmVsb2NhdGFibGUgPSAwOworCisgIC8qIElyaXggNS4yIHNoYXJlZCBsaWJyYXJpZXMgaGF2ZSBhIGZoLT5hZHIgZmllbGQgb2YgemVybywgYnV0CisgICAgIHRoZSBzaGFyZWQgbGlicmFyaWVzIGFyZSBwcmVsaW5rZWQgYXQgYSBoaWdoIG1lbW9yeSBhZGRyZXNzLgorICAgICBXZSBoYXZlIHRvIGFkanVzdCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgb2JqZWN0IGZpbGUgZm9yIHRoaXMgY2FzZSwKKyAgICAgYnkgc2V0dGluZyBpdCB0byB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZmlyc3QgcHJvY2VkdXJlIGluIHRoZSBmaWxlLgorICAgICBCdXQgd2Ugc2hvdWxkIGRvIG5vIGFkanVzdG1lbnRzIGlmIHdlIGFyZSBkZWJ1Z2dpbmcgYSAubyBmaWxlLCB3aGVyZQorICAgICB0aGUgdGV4dCBzZWN0aW9uIChhbmQgZmgtPmFkcikgcmVhbGx5IHN0YXJ0cyBhdCB6ZXJvLiAgKi8KKyAgdGV4dF9zZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGN1cl9iZmQsICIudGV4dCIpOworICBpZiAodGV4dF9zZWN0ICE9IE5VTEwKKyAgICAgICYmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGN1cl9iZmQsIHRleHRfc2VjdCkgJiBTRUNfUkVMT0MpKQorICAgIHJlbG9jYXRhYmxlID0gMTsKKworICBleHRlcm5fdGFiID0gKEVYVFIgKikgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnBzeW1ib2xfb2JzdGFjaywKKwkJCQkgICAgICAgc2l6ZW9mIChFWFRSKSAqIGhkci0+aWV4dE1heCk7CisKKyAgaW5jbHVkZXNfYWxsb2NhdGVkID0gMzA7CisgIGluY2x1ZGVzX3VzZWQgPSAwOworICBwc3ltdGFiX2luY2x1ZGVfbGlzdCA9IChjaGFyICoqKSBhbGxvY2EgKGluY2x1ZGVzX2FsbG9jYXRlZCAqCisJCQkJCSAgIHNpemVvZiAoY2hhciAqKSk7CisgIG5leHRfc3ltYm9sX3RleHRfZnVuYyA9IG1kZWJ1Z19uZXh0X3N5bWJvbF90ZXh0OworCisgIGRlcGVuZGVuY2llc19hbGxvY2F0ZWQgPSAzMDsKKyAgZGVwZW5kZW5jaWVzX3VzZWQgPSAwOworICBkZXBlbmRlbmN5X2xpc3QgPQorICAgIChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKiopIGFsbG9jYSAoZGVwZW5kZW5jaWVzX2FsbG9jYXRlZCAqCisJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKKworICBsYXN0X3NvdXJjZV9maWxlID0gTlVMTDsKKworICAvKgorICAgKiBCaWcgcGxhbjoKKyAgICoKKyAgICogT25seSBwYXJzZSB0aGUgTG9jYWwgYW5kIEV4dGVybmFsIHN5bWJvbHMsIGFuZCB0aGUgUmVsYXRpdmUgRkRSLgorICAgKiBGaXh1cCBlbm91Z2ggb2YgdGhlIGxvYWRlciBzeW10YWIgdG8gYmUgYWJsZSB0byB1c2UgaXQuCisgICAqIEFsbG9jYXRlIHNwYWNlIG9ubHkgZm9yIHRoZSBmaWxlJ3MgcG9ydGlvbnMgd2UgbmVlZCB0bworICAgKiBsb29rIGF0LiAoWFhYKQorICAgKi8KKworICBtYXhfZ2RiaW5mbyA9IDA7CisgIG1heF9nbGV2ZWwgPSBNSU5fR0xFVkVMOworCisgIC8qIEFsbG9jYXRlIHRoZSBtYXAgRkRSIC0+IFBTVC4KKyAgICAgTWlub3IgaGFjazogLU8zIGltYWdlcyBtaWdodCBjbGFpbSBzb21lIGdsb2JhbCBkYXRhIGJlbG9uZ3MKKyAgICAgdG8gRkRSIC0xLiBXZWBsbCBnbyBhbG9uZyB3aXRoIHRoYXQgKi8KKyAgZmRyX3RvX3BzdCA9IChzdHJ1Y3QgcHN0X21hcCAqKSB4emFsbG9jICgoaGRyLT5pZmRNYXggKyAxKSAqIHNpemVvZiAqZmRyX3RvX3BzdCk7CisgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoZnJlZSwgZmRyX3RvX3BzdCk7CisgIGZkcl90b19wc3QrKzsKKyAgeworICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN0ID0gbmV3X3BzeW10YWIgKCIiLCBvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMpOworICAgIGZkcl90b19wc3RbLTFdLnBzdCA9IHBzdDsKKyAgICBGRFJfSURYIChwc3QpID0gLTE7CisgIH0KKworICAvKiBBbGxvY2F0ZSB0aGUgZ2xvYmFsIHBlbmRpbmcgbGlzdC4gICovCisgIHBlbmRpbmdfbGlzdCA9CisgICAgKChzdHJ1Y3QgbWRlYnVnX3BlbmRpbmcgKiopCisgICAgIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5wc3ltYm9sX29ic3RhY2ssCisJCSAgICBoZHItPmlmZE1heCAqIHNpemVvZiAoc3RydWN0IG1kZWJ1Z19wZW5kaW5nICopKSk7CisgIG1lbXNldCAoKFBUUikgcGVuZGluZ19saXN0LCAwLAorCSAgaGRyLT5pZmRNYXggKiBzaXplb2YgKHN0cnVjdCBtZGVidWdfcGVuZGluZyAqKSk7CisKKyAgLyogUGFzcyAwIG92ZXIgZXh0ZXJuYWwgc3ltczogc3dhcCB0aGVtIGluLiAgKi8KKyAgZXh0X2Jsb2NrID0gKEVYVFIgKikgeG1hbGxvYyAoaGRyLT5pZXh0TWF4ICogc2l6ZW9mIChFWFRSKSk7CisgIG1ha2VfY2xlYW51cCAoZnJlZSwgZXh0X2Jsb2NrKTsKKworICBleHRfb3V0ID0gKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfZXh0OworICBleHRfb3V0X2VuZCA9IGV4dF9vdXQgKyBoZHItPmlleHRNYXggKiBleHRlcm5hbF9leHRfc2l6ZTsKKyAgZXh0X2luID0gZXh0X2Jsb2NrOworICBmb3IgKDsgZXh0X291dCA8IGV4dF9vdXRfZW5kOyBleHRfb3V0ICs9IGV4dGVybmFsX2V4dF9zaXplLCBleHRfaW4rKykKKyAgICAoKnN3YXBfZXh0X2luKSAoY3VyX2JmZCwgZXh0X291dCwgZXh0X2luKTsKKworICAvKiBQYXNzIDEgb3ZlciBleHRlcm5hbCBzeW1zOiBQcmVzaXplIGFuZCBwYXJ0aXRpb24gdGhlIGxpc3QgKi8KKyAgZXh0X2luID0gZXh0X2Jsb2NrOworICBleHRfaW5fZW5kID0gZXh0X2luICsgaGRyLT5pZXh0TWF4OworICBmb3IgKDsgZXh0X2luIDwgZXh0X2luX2VuZDsgZXh0X2luKyspCisgICAgeworICAgICAgLyogU2VlIGNhbGxzIHRvIGNvbXBsYWluIGJlbG93LiAgKi8KKyAgICAgIGlmIChleHRfaW4tPmlmZCA+PSAtMQorCSAgJiYgZXh0X2luLT5pZmQgPCBoZHItPmlmZE1heAorCSAgJiYgZXh0X2luLT5hc3ltLmlzcyA+PSAwCisJICAmJiBleHRfaW4tPmFzeW0uaXNzIDwgaGRyLT5pc3NFeHRNYXgpCisJZmRyX3RvX3BzdFtleHRfaW4tPmlmZF0ubl9nbG9iYWxzKys7CisgICAgfQorCisgIC8qIFBhc3MgMS41IG92ZXIgZmlsZXM6ICBwYXJ0aXRpb24gb3V0IGdsb2JhbCBzeW1ib2wgc3BhY2UgKi8KKyAgc19pZHggPSAwOworICBmb3IgKGZfaWR4ID0gLTE7IGZfaWR4IDwgaGRyLT5pZmRNYXg7IGZfaWR4KyspCisgICAgeworICAgICAgZmRyX3RvX3BzdFtmX2lkeF0uZ2xvYmFsc19vZmZzZXQgPSBzX2lkeDsKKyAgICAgIHNfaWR4ICs9IGZkcl90b19wc3RbZl9pZHhdLm5fZ2xvYmFsczsKKyAgICAgIGZkcl90b19wc3RbZl9pZHhdLm5fZ2xvYmFscyA9IDA7CisgICAgfQorCisgIC8qIEVDT0ZGIGluIEVMRjoKKworICAgICBGb3IgRUNPRkYgaW4gRUxGLCB3ZSBza2lwIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWluaW1hbCBzeW1ib2xzLgorICAgICBUaGUgRUNPRkYgc3ltYm9scyBzaG91bGQgYmUgYSBzdWJzZXQgb2YgdGhlIEVsZiBzeW1ib2xzLCBhbmQgdGhlIAorICAgICBzZWN0aW9uIGluZm9ybWF0aW9uIG9mIHRoZSBlbGYgc3ltYm9scyB3aWxsIGJlIG1vcmUgYWNjdXJhdGUuCisgICAgIEZJWE1FISAgV2hhdCBhYm91dCBJcml4IDUncyBuYXRpdmUgbGlua2VyPworCisgICAgIEJ5IGRlZmF1bHQsIEVsZiBzZWN0aW9ucyB3aGljaCBkb24ndCBleGlzdCBpbiBFQ09GRiAKKyAgICAgZ2V0IHB1dCBpbiBFQ09GRidzIGFic29sdXRlIHNlY3Rpb24gYnkgdGhlIGdudSBsaW5rZXIuCisgICAgIFNpbmNlIGFic29sdXRlIHNlY3Rpb25zIGRvbid0IGdldCByZWxvY2F0ZWQsIHdlIAorICAgICBlbmQgdXAgY2FsY3VsYXRpbmcgYW4gYWRkcmVzcyBkaWZmZXJlbnQgZnJvbSB0aGF0IG9mIAorICAgICB0aGUgc3ltYm9sJ3MgbWluaW1hbCBzeW1ib2wgKGNyZWF0ZWQgZWFybGllciBmcm9tIHRoZQorICAgICBFbGYgc3ltdGFiKS4gIAorCisgICAgIFRvIGZpeCB0aGlzLCBlaXRoZXIgOgorICAgICAxKSBkb24ndCBjcmVhdGUgdGhlIGR1cGxpY2F0ZSBzeW1ib2wKKwkgKGFzc3VtZXMgRUNPRkYgc3ltdGFiIGlzIGEgc3Vic2V0IG9mIHRoZSBFTEYgc3ltdGFiOworCSBhc3N1bWVzIG5vIHNpZGUtZWZmZWN0cyByZXN1bHQgZnJvbSBpZ25vcmluZyBFQ09GRiBzeW1ib2wpCisgICAgIDIpIGNyZWF0ZSBpdCwgb25seSBpZiBsb29rdXAgZm9yIGV4aXN0aW5nIHN5bWJvbCBpbiBFTEYncyBtaW5pbWFsIAorICAgICAgICBzeW1ib2xzIGZhaWxzCisJIChpbmVmZmljaWVudDsgCisJIGFzc3VtZXMgbm8gc2lkZS1lZmZlY3RzIHJlc3VsdCBmcm9tIGlnbm9yaW5nIEVDT0ZGIHN5bWJvbCkKKyAgICAgMykgY3JlYXRlIGl0LCBidXQgbG9va3VwIEVMRidzIG1pbmltYWwgc3ltYm9sIGFuZCB1c2UgaXQncyBzZWN0aW9uCisgICAgICAgIGR1cmluZyByZWxvY2F0aW9uLCB0aGVuIG1vZGlmeSAidW5pcWlmeSIgcGhhc2UgdG8gbWVyZ2UgYW5kIAorICAgICAgICBlbGltaW5hdGUgdGhlIGR1cGxpY2F0ZSBzeW1ib2wKKwkgKGhpZ2hseSBpbmVmZmljaWVudCkKKworICAgICBJJ3ZlIGltcGxlbWVudGVkICMxIGhlcmUuLi4KKyAgICAgU2tpcCB0aGUgY3JlYXRpb24gb2YgdGhlIG1pbmltYWwgc3ltYm9scyBiYXNlZCBvbiB0aGUgRUNPRkYgCisgICAgIHN5bWJvbCB0YWJsZS4gKi8KKworICAgIC8qIFBhc3MgMiBvdmVyIGV4dGVybmFsIHN5bXM6IGZpbGwgaW4gZXh0ZXJuYWwgc3ltYm9scyAqLworICAgIGV4dF9pbiA9IGV4dF9ibG9jazsKKyAgICBleHRfaW5fZW5kID0gZXh0X2luICsgaGRyLT5pZXh0TWF4OworICAgIGZvciAoOyBleHRfaW4gPCBleHRfaW5fZW5kOyBleHRfaW4rKykKKyAgICAgIHsKKwllbnVtIG1pbmltYWxfc3ltYm9sX3R5cGUgbXNfdHlwZSA9IG1zdF90ZXh0OworCUNPUkVfQUREUiBzdmFsdWUgPSBleHRfaW4tPmFzeW0udmFsdWU7CisKKwkvKiBUaGUgSXJpeCA1IG5hdGl2ZSB0b29scyBzZWVtIHRvIHNvbWV0aW1lcyBnZW5lcmF0ZSBib2d1cworCSAgIGV4dGVybmFsIHN5bWJvbHMuICAqLworCWlmIChleHRfaW4tPmlmZCA8IC0xIHx8IGV4dF9pbi0+aWZkID49IGhkci0+aWZkTWF4KQorCSAgeworCSAgICBjb21wbGFpbiAoJmJhZF9leHRfaWZkX2NvbXBsYWludCwgZXh0X2luLT5pZmQsIGhkci0+aWZkTWF4KTsKKwkgICAgY29udGludWU7CisJICB9CisJaWYgKGV4dF9pbi0+YXN5bS5pc3MgPCAwIHx8IGV4dF9pbi0+YXN5bS5pc3MgPj0gaGRyLT5pc3NFeHRNYXgpCisJICB7CisJICAgIGNvbXBsYWluICgmYmFkX2V4dF9pc3NfY29tcGxhaW50LCBleHRfaW4tPmFzeW0uaXNzLAorCQkJaGRyLT5pc3NFeHRNYXgpOworCSAgICBjb250aW51ZTsKKwkgIH0KKworCWV4dGVybl90YWJbZmRyX3RvX3BzdFtleHRfaW4tPmlmZF0uZ2xvYmFsc19vZmZzZXQKKwkJICAgKyBmZHJfdG9fcHN0W2V4dF9pbi0+aWZkXS5uX2dsb2JhbHMrK10gPSAqZXh0X2luOworCisKKwlpZiAoU0NfSVNfVU5ERUYoZXh0X2luLT5hc3ltLnNjKSB8fCBleHRfaW4tPmFzeW0uc2MgPT0gc2NOaWwpCisJICBjb250aW51ZTsKKworICAgIAorCS8qIFBhc3MgMyBvdmVyIGZpbGVzLCBvdmVyIGxvY2FsIHN5bXM6IGZpbGwgaW4gc3RhdGljIHN5bWJvbHMgKi8KKwluYW1lID0gZGVidWdfaW5mby0+c3NleHQgKyBleHRfaW4tPmFzeW0uaXNzOworCisJLyogUHJvY2VzcyBFQ09GRiBTeW1ib2wgVHlwZXMgYW5kIFN0b3JhZ2UgQ2xhc3NlcyAqLworCXN3aXRjaCAoZXh0X2luLT5hc3ltLnN0KQorCSAgeworCSAgY2FzZSBzdFByb2M6CisJICAgIC8qIEJlZ2lubm5pbmcgb2YgUHJvY2VkdXJlICovCisJICAgIHN2YWx1ZSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIHN0U3RhdGljUHJvYzoKKwkgICAgLyogTG9hZCB0aW1lIG9ubHkgc3RhdGljIHByb2NzICovCisJICAgIG1zX3R5cGUgPSBtc3RfZmlsZV90ZXh0OworCSAgICBzdmFsdWUgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCk7CisJICAgIGJyZWFrOworCSAgY2FzZSBzdEdsb2JhbDoKKwkgICAgLyogRXh0ZXJuYWwgc3ltYm9sICovCisJICAgIGlmIChTQ19JU19DT01NT04gKGV4dF9pbi0+YXN5bS5zYykpCisJICAgICAgeworCQkvKiBUaGUgdmFsdWUgb2YgYSBjb21tb24gc3ltYm9sIGlzIGl0cyBzaXplLCBub3QgaXRzIGFkZHJlc3MuCisJCSAgIElnbm9yZSBpdC4gICovCisJCWNvbnRpbnVlOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoU0NfSVNfREFUQSAoZXh0X2luLT5hc3ltLnNjKSkKKwkgICAgICB7CisJCW1zX3R5cGUgPSBtc3RfZGF0YTsKKwkJc3ZhbHVlICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX0RBVEEpOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoU0NfSVNfQlNTIChleHRfaW4tPmFzeW0uc2MpKQorCSAgICAgIHsKKwkJbXNfdHlwZSA9IG1zdF9ic3M7CisJCXN2YWx1ZSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9CU1MpOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIG1zX3R5cGUgPSBtc3RfYWJzOworCSAgICBicmVhazsKKwkgIGNhc2Ugc3RMYWJlbDoKKwkgICAgLyogTGFiZWwgKi8KKwkgICAgaWYgKFNDX0lTX1RFWFQgKGV4dF9pbi0+YXN5bS5zYykpCisJICAgICAgeworCQltc190eXBlID0gbXN0X2ZpbGVfdGV4dDsKKwkJc3ZhbHVlICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoU0NfSVNfREFUQSAoZXh0X2luLT5hc3ltLnNjKSkKKwkgICAgICB7CisJCW1zX3R5cGUgPSBtc3RfZmlsZV9kYXRhOworCQlzdmFsdWUgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfREFUQSk7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChTQ19JU19CU1MgKGV4dF9pbi0+YXN5bS5zYykpCisJICAgICAgeworCQltc190eXBlID0gbXN0X2ZpbGVfYnNzOworCQlzdmFsdWUgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfQlNTKTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICBtc190eXBlID0gbXN0X2FiczsKKwkgICAgYnJlYWs7CisJICBjYXNlIHN0TG9jYWw6CisJICBjYXNlIHN0TmlsOgorCSAgICAvKiBUaGUgYWxwaGEgaGFzIHRoZSBzZWN0aW9uIHN0YXJ0IGFkZHJlc3NlcyBpbiBzdExvY2FsIHN5bWJvbHMKKwkJIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggYSBgLicuIFNraXAgdGhvc2UgYnV0IGNvbXBsYWluIGZvciBhbGwKKwkJIG90aGVyIHN0TG9jYWwgc3ltYm9scy4KKwkJIElyaXg2IHB1dHMgdGhlIHNlY3Rpb24gc3RhcnQgYWRkcmVzc2VzIGluIHN0TmlsIHN5bWJvbHMsIHNraXAKKwkJIHRob3NlIHRvby4qLworCSAgICBpZiAobmFtZVswXSA9PSAnLicpCisJICAgICAgY29udGludWU7CisJICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJICBkZWZhdWx0OgorCSAgICBtc190eXBlID0gbXN0X3Vua25vd247CisJICAgIGNvbXBsYWluICgmdW5rbm93bl9leHRfY29tcGxhaW50LCBuYW1lKTsKKwkgIH0KKyAgICAgICAgaWYgKCFFQ09GRl9JTl9FTEYoY3VyX2JmZCkpCisJICBwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbCAobmFtZSwgc3ZhbHVlLCBtc190eXBlLCBvYmpmaWxlKTsKKyAgICAgIH0KKworICAvKiBQYXNzIDMgb3ZlciBmaWxlcywgb3ZlciBsb2NhbCBzeW1zOiBmaWxsIGluIHN0YXRpYyBzeW1ib2xzICovCisgIGZvciAoZl9pZHggPSAwOyBmX2lkeCA8IGhkci0+aWZkTWF4OyBmX2lkeCsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqc2F2ZV9wc3Q7CisgICAgICBFWFRSICpleHRfcHRyOworICAgICAgQ09SRV9BRERSIHRleHRsb3c7CisKKyAgICAgIGN1cl9mZHIgPSBmaCA9IGRlYnVnX2luZm8tPmZkciArIGZfaWR4OworCisgICAgICBpZiAoZmgtPmNzeW0gPT0gMCkKKwl7CisJICBmZHJfdG9fcHN0W2ZfaWR4XS5wc3QgPSBOVUxMOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBEZXRlcm1pbmUgdGhlIHN0YXJ0IGFkZHJlc3MgZm9yIHRoaXMgb2JqZWN0IGZpbGUgZnJvbSB0aGUKKwkgZmlsZSBoZWFkZXIgYW5kIHJlbG9jYXRlIGl0LCBleGNlcHQgZm9yIElyaXggNS4yIHplcm8gZmgtPmFkci4gICovCisgICAgICBpZiAoZmgtPmNwZCkKKwl7CisJICB0ZXh0bG93ID0gZmgtPmFkcjsKKwkgIGlmIChyZWxvY2F0YWJsZSB8fCB0ZXh0bG93ICE9IDApCisJICAgIHRleHRsb3cgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCk7CisJfQorICAgICAgZWxzZQorCXRleHRsb3cgPSAwOworICAgICAgcHN0ID0gc3RhcnRfcHN5bXRhYl9jb21tb24gKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywKKwkJCQkgIGZkcl9uYW1lIChmaCksCisJCQkJICB0ZXh0bG93LAorCQkJCSAgb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLm5leHQsCisJCQkJICBvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMubmV4dCk7CisgICAgICBwc3QtPnJlYWRfc3ltdGFiX3ByaXZhdGUgPSAoKGNoYXIgKikKKwkJCQkgIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5wc3ltYm9sX29ic3RhY2ssCisJCQkJCQkgc2l6ZW9mIChzdHJ1Y3Qgc3ltbG9jKSkpOworICAgICAgbWVtc2V0ICgoUFRSKSBwc3QtPnJlYWRfc3ltdGFiX3ByaXZhdGUsIDAsIHNpemVvZiAoc3RydWN0IHN5bWxvYykpOworCisgICAgICBzYXZlX3BzdCA9IHBzdDsKKyAgICAgIEZEUl9JRFggKHBzdCkgPSBmX2lkeDsKKyAgICAgIENVUl9CRkQgKHBzdCkgPSBjdXJfYmZkOworICAgICAgREVCVUdfU1dBUCAocHN0KSA9IGRlYnVnX3N3YXA7CisgICAgICBERUJVR19JTkZPIChwc3QpID0gZGVidWdfaW5mbzsKKyAgICAgIFBFTkRJTkdfTElTVCAocHN0KSA9IHBlbmRpbmdfbGlzdDsKKworICAgICAgLyogVGhlIHdheSB0byB0dXJuIHRoaXMgaW50byBhIHN5bXRhYiBpcyB0byBjYWxsLi4uICovCisgICAgICBwc3QtPnJlYWRfc3ltdGFiID0gbWRlYnVnX3BzeW10YWJfdG9fc3ltdGFiOworCisgICAgICAvKiBTZXQgdXAgbGFuZ3VhZ2UgZm9yIHRoZSBwc3QuCisgICAgICAgICBUaGUgbGFuZ3VhZ2UgZnJvbSB0aGUgRkRSIGlzIHVzZWQgaWYgaXQgaXMgdW5hbWJpZ2lvdXMgKGUuZy4gY2Zyb250CisJIHdpdGggbmF0aXZlIGNjIGFuZCBnKysgd2lsbCBzZXQgdGhlIGxhbmd1YWdlIHRvIEMpLgorCSBPdGhlcndpc2Ugd2UgaGF2ZSB0byBkZWR1Y2UgdGhlIGxhbmd1YWdlIGZyb20gdGhlIGZpbGVuYW1lLgorCSBOYXRpdmUgZWNvZmYgaGFzIGV2ZXJ5IGhlYWRlciBmaWxlIGluIGEgc2VwYXJhdGUgRkRSLCBzbworCSBkZWR1Y2VfbGFuZ3VhZ2VfZnJvbV9maWxlbmFtZSB3aWxsIHJldHVybiBsYW5ndWFnZV91bmtub3duIGZvcgorCSBhIGhlYWRlciBmaWxlLCB3aGljaCBpcyBub3Qgd2hhdCB3ZSB3YW50LgorCSBCdXQgdGhlIEZEUnMgZm9yIHRoZSBoZWFkZXIgZmlsZXMgYXJlIGFmdGVyIHRoZSBGRFIgZm9yIHRoZSBzb3VyY2UKKwkgZmlsZSwgc28gd2UgY2FuIGFzc2lnbiB0aGUgbGFuZ3VhZ2Ugb2YgdGhlIHNvdXJjZSBmaWxlIHRvIHRoZQorCSBmb2xsb3dpbmcgaGVhZGVyIGZpbGVzLiBUaGVuIHdlIHNhdmUgdGhlIGxhbmd1YWdlIGluIHRoZSBwcml2YXRlCisJIHBzdCBkYXRhIHNvIHRoYXQgd2UgY2FuIHJldXNlIGl0IHdoZW4gYnVpbGRpbmcgc3ltdGFicy4gICovCisgICAgICBwcmV2X2xhbmd1YWdlID0gcHN5bXRhYl9sYW5ndWFnZTsKKworICAgICAgc3dpdGNoIChmaC0+bGFuZykKKwl7CisJY2FzZSBsYW5nQ3BsdXNwbHVzVjI6CisJICBwc3ltdGFiX2xhbmd1YWdlID0gbGFuZ3VhZ2VfY3BsdXM7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgcHN5bXRhYl9sYW5ndWFnZSA9IGRlZHVjZV9sYW5ndWFnZV9mcm9tX2ZpbGVuYW1lIChmZHJfbmFtZSAoZmgpKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGlmIChwc3ltdGFiX2xhbmd1YWdlID09IGxhbmd1YWdlX3Vua25vd24pCisJcHN5bXRhYl9sYW5ndWFnZSA9IHByZXZfbGFuZ3VhZ2U7CisgICAgICBQU1RfUFJJVkFURSAocHN0KS0+cHN0X2xhbmd1YWdlID0gcHN5bXRhYl9sYW5ndWFnZTsKKworICAgICAgcHN0LT50ZXh0aGlnaCA9IHBzdC0+dGV4dGxvdzsKKworICAgICAgLyogRm9yIHN0YWJzLWluLWVjb2ZmIGZpbGVzLCB0aGUgc2Vjb25kIHN5bWJvbCBtdXN0IGJlIEBzdGFiLgorCSBUaGlzIHN5bWJvbCBpcyBlbWl0dGVkIGJ5IG1pcHMtdGZpbGUgdG8gc2lnbmFsIHRoYXQgdGhlCisJIGN1cnJlbnQgb2JqZWN0IGZpbGUgdXNlcyBlbmNhcHN1bGF0ZWQgc3RhYnMgaW5zdGVhZCBvZiBtaXBzCisJIGVjb2ZmIGZvciBsb2NhbCBzeW1ib2xzLiAgKEl0IGlzIHRoZSBzZWNvbmQgc3ltYm9sIGJlY2F1c2UKKwkgdGhlIGZpcnN0IHN5bWJvbCBpcyB0aGUgc3RGaWxlIHVzZWQgdG8gc2lnbmFsIHRoZSBzdGFydCBvZiBhCisJIGZpbGUpLiAqLworICAgICAgcHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24gPSAwOworICAgICAgaWYgKGZoLT5jc3ltID49IDIpCisJeworCSAgKCpzd2FwX3N5bV9pbikgKGN1cl9iZmQsCisJCQkgICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0KKwkJCSAgICsgKGZoLT5pc3ltQmFzZSArIDEpICogZXh0ZXJuYWxfc3ltX3NpemUpLAorCQkJICAmc2gpOworCSAgaWYgKFNUUkVRIChkZWJ1Z19pbmZvLT5zcyArIGZoLT5pc3NCYXNlICsgc2guaXNzLCBzdGFic19zeW1ib2wpKQorCSAgICBwcm9jZXNzaW5nX2djY19jb21waWxhdGlvbiA9IDI7CisJfQorCisgICAgICBpZiAocHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24gIT0gMCkKKwl7CisJICBmb3IgKGN1cl9zZHggPSAyOyBjdXJfc2R4IDwgZmgtPmNzeW07IGN1cl9zZHgrKykKKwkgICAgeworCSAgICAgIGludCB0eXBlX2NvZGU7CisJICAgICAgY2hhciAqbmFtZXN0cmluZzsKKworCSAgICAgICgqc3dhcF9zeW1faW4pIChjdXJfYmZkLAorCQkJICAgICAgKCgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0pCisJCQkgICAgICAgKyAoZmgtPmlzeW1CYXNlICsgY3VyX3NkeCkgKiBleHRlcm5hbF9zeW1fc2l6ZSksCisJCQkgICAgICAmc2gpOworCSAgICAgIHR5cGVfY29kZSA9IEVDT0ZGX1VOTUFSS19TVEFCIChzaC5pbmRleCk7CisJICAgICAgaWYgKCFFQ09GRl9JU19TVEFCICgmc2gpKQorCQl7CisJCSAgaWYgKHNoLnN0ID09IHN0UHJvYyB8fCBzaC5zdCA9PSBzdFN0YXRpY1Byb2MpCisJCSAgICB7CisJCSAgICAgIENPUkVfQUREUiBwcm9jYWRkcjsKKwkJICAgICAgbG9uZyBpc3ltOworCQorCQkgICAgICBzaC52YWx1ZSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKTsKKwkJICAgICAgaWYgKHNoLnN0ID09IHN0U3RhdGljUHJvYykKKwkJCXsKKwkJCSAgbmFtZXN0cmluZyA9IGRlYnVnX2luZm8tPnNzICsgZmgtPmlzc0Jhc2UgKyBzaC5pc3M7CisJCQkgIHByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9sX2FuZF9pbmZvIChuYW1lc3RyaW5nLAorCQkJCQkJCSAgICAgICBzaC52YWx1ZSwKKwkJCQkJCQkgICAgICAgbXN0X2ZpbGVfdGV4dCwKKwkJCQkJCQkgICAgICAgTlVMTCwKKwkJCQkJCQkgICAgICAgU0VDVF9PRkZfVEVYVCwKKwkJCQkJCQkgICAgICAgTlVMTCwKKwkJCQkJCQkgICAgICAgb2JqZmlsZSk7CisJCQl9CisJCSAgICAgIHByb2NhZGRyID0gc2gudmFsdWU7CisKKwkJICAgICAgaXN5bSA9IEFVWF9HRVRfSVNZTSAoZmgtPmZCaWdlbmRpYW4sCisJCQkJCSAgIChkZWJ1Z19pbmZvLT5leHRlcm5hbF9hdXgKKwkJCQkJICAgICsgZmgtPmlhdXhCYXNlCisJCQkJCSAgICArIHNoLmluZGV4KSk7CisJCSAgICAgICgqc3dhcF9zeW1faW4pIChjdXJfYmZkLAorCQkJCSAgICAgICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0KKwkJCQkgICAgICAgKyAoKGZoLT5pc3ltQmFzZSArIGlzeW0gLSAxKQorCQkJCQkgICogZXh0ZXJuYWxfc3ltX3NpemUpKSwKKwkJCQkgICAgICAmc2gpOworCQkgICAgICBpZiAoc2guc3QgPT0gc3RFbmQpCisJCQl7CisJCQkgIENPUkVfQUREUiBoaWdoID0gcHJvY2FkZHIgKyBzaC52YWx1ZTsKKworCSAgICAgIAkJICAvKiBLbHVkZ2UgZm9yIElyaXggNS4yIHplcm8gZmgtPmFkci4gICovCisJCQkgIGlmICghcmVsb2NhdGFibGUKKwkJCSAgICAgICYmIChwc3QtPnRleHRsb3cgPT0gMCB8fCBwcm9jYWRkciA8IHBzdC0+dGV4dGxvdykpCisJCQkgICAgcHN0LT50ZXh0bG93ID0gcHJvY2FkZHI7CisJCQkgIGlmIChoaWdoID4gcHN0LT50ZXh0aGlnaCkKKwkJCSAgICBwc3QtPnRleHRoaWdoID0gaGlnaDsKKwkJCX0KKwkJICAgIH0KKwkJICBlbHNlIGlmIChzaC5zdCA9PSBzdFN0YXRpYykKKwkJICAgIHsKKwkJICAgICAgc3dpdGNoIChzaC5zYykKKwkJCXsKKwkJCWNhc2Ugc2NVbmRlZmluZWQ6CisJCQljYXNlIHNjU1VuZGVmaW5lZDoKKwkJCWNhc2Ugc2NOaWw6CisJCQljYXNlIHNjQWJzOgorCQkJICBicmVhazsKKworCQkJY2FzZSBzY0RhdGE6CisJCQljYXNlIHNjU0RhdGE6CisJCQljYXNlIHNjUkRhdGE6CisJCQljYXNlIHNjUERhdGE6CisJCQljYXNlIHNjWERhdGE6CisJCQkgIG5hbWVzdHJpbmcgPSBkZWJ1Z19pbmZvLT5zcyArIGZoLT5pc3NCYXNlICsgc2guaXNzOworCQkgICAgICAgICAgc2gudmFsdWUgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfREFUQSk7CisJCQkgIHByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9sX2FuZF9pbmZvIChuYW1lc3RyaW5nLAorCQkJCQkJCSAgICAgICBzaC52YWx1ZSwKKwkJCQkJCQkgICAgICAgbXN0X2ZpbGVfZGF0YSwKKwkJCQkJCQkgICAgICAgTlVMTCwKKwkJCQkJCQkgICAgICAgU0VDVF9PRkZfREFUQSwKKwkJCQkJCQkgICAgICAgTlVMTCwKKwkJCQkJCQkgICAgICAgb2JqZmlsZSk7CisJCQkgIGJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJICAvKiBGSVhNRSEgIFNob3VsZG4ndCB0aGlzIHVzZSBjYXNlcyBmb3IgYnNzLCAKKwkJCSAgICAgdGhlbiBoYXZlIHRoZSBkZWZhdWx0IGJlIGFicz8gKi8KKwkJCSAgbmFtZXN0cmluZyA9IGRlYnVnX2luZm8tPnNzICsgZmgtPmlzc0Jhc2UgKyBzaC5pc3M7CisJCSAgICAgICAgICBzaC52YWx1ZSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9CU1MpOworCQkJICBwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbF9hbmRfaW5mbyAobmFtZXN0cmluZywKKwkJCQkJCQkgICAgICAgc2gudmFsdWUsCisJCQkJCQkJICAgICAgIG1zdF9maWxlX2JzcywKKwkJCQkJCQkgICAgICAgTlVMTCwKKwkJCQkJCQkgICAgICAgU0VDVF9PRkZfQlNTLAorCQkJCQkJCSAgICAgICBOVUxMLAorCQkJCQkJCSAgICAgICBvYmpmaWxlKTsKKwkJCSAgYnJlYWs7CisJCQl9CisJCSAgICB9CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICAvKiBIYW5kbGUgc3RhYnMgY29udGludWF0aW9uICovCisJICAgICAgeworCQljaGFyICpzdGFic3RyaW5nID0gZGVidWdfaW5mby0+c3MgKyBmaC0+aXNzQmFzZSArIHNoLmlzczsKKwkJaW50IGxlbiA9IHN0cmxlbiAoc3RhYnN0cmluZyk7CisJCXdoaWxlIChzdGFic3RyaW5nW2xlbi0xXSA9PSAnXFwnKQorCQkgIHsKKwkJICAgIFNZTVIgc2gyOworCQkgICAgY2hhciAqc3RhYnN0cmluZzEgPSBzdGFic3RyaW5nOworCQkgICAgY2hhciAqc3RhYnN0cmluZzI7CisJCSAgICBpbnQgbGVuMjsKKworCQkgICAgLyogSWdub3JlIGNvbnRpbnVhdGlvbiBjaGFyIGZyb20gMXN0IHN0cmluZyAqLworCQkgICAgbGVuLS07CisKKwkJICAgIC8qIFJlYWQgbmV4dCBzdGFic3RyaW5nICovCisJCSAgICBjdXJfc2R4Kys7CisJCSAgICAoKnN3YXBfc3ltX2luKSAoY3VyX2JmZCwKKwkJCQkgICAgKCgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0pCisJCQkJICAgICArIChmaC0+aXN5bUJhc2UgKyBjdXJfc2R4KSAKKwkJCQkgICAgICogZXh0ZXJuYWxfc3ltX3NpemUpLAorCQkJCSAgICAmc2gyKTsKKwkJICAgIHN0YWJzdHJpbmcyID0gZGVidWdfaW5mby0+c3MgKyBmaC0+aXNzQmFzZSArIHNoMi5pc3M7CisJCSAgICBsZW4yID0gc3RybGVuIChzdGFic3RyaW5nMik7CisKKwkJICAgIC8qIENvbmNhdGluYXRlIHN0YWJzdHJpbmcyIHdpdGggc3RhYnN0cmluZzEgKi8KKwkJICAgIGlmIChzdGFic3RyaW5nCisJCQkmJiBzdGFic3RyaW5nICE9IGRlYnVnX2luZm8tPnNzICsgZmgtPmlzc0Jhc2UgKyBzaC5pc3MpCisJCSAgICAgIHN0YWJzdHJpbmcgPSB4cmVhbGxvYyAoc3RhYnN0cmluZywgbGVuICsgbGVuMiArIDEpOworCQkgICAgZWxzZQorCQkgICAgICBzdGFic3RyaW5nID0geG1hbGxvYyAobGVuICsgbGVuMiArIDEpOworCQkgICAgc3RyY3B5IChzdGFic3RyaW5nLCBzdGFic3RyaW5nMSk7CisJCSAgICBzdHJjcHkgKHN0YWJzdHJpbmcgKyBsZW4sIHN0YWJzdHJpbmcyKTsKKwkJICAgIGxlbiArPSBsZW4yOworCQkgIH0KKworI2RlZmluZSBTRVRfTkFNRVNUUklORygpIFwKKyAgbmFtZXN0cmluZyA9IHN0YWJzdHJpbmcKKyNkZWZpbmUgQ1VSX1NZTUJPTF9UWVBFIHR5cGVfY29kZQorI2RlZmluZSBDVVJfU1lNQk9MX1ZBTFVFIHNoLnZhbHVlCisjZGVmaW5lIFNUQVJUX1BTWU1UQUIob2ZpbGUsc2Vjb2ZmLGZuYW1lLGxvdyxzeW1vZmYsZ2xvYmFsX3N5bXMsc3RhdGljX3N5bXMpXAorICBwc3QgPSBzYXZlX3BzdAorI2RlZmluZSBFTkRfUFNZTVRBQihwc3QsaWxpc3QsbmluYyxjX29mZixjX3RleHQsZGVwX2xpc3Qsbl9kZXBzLHRleHRsb3dfbm90X3NldCkgKHZvaWQpMAorI2RlZmluZSBIQU5ETEVfUkJSQUModmFsKSBcCisgIGlmICgodmFsKSA+IHNhdmVfcHN0LT50ZXh0aGlnaCkgc2F2ZV9wc3QtPnRleHRoaWdoID0gKHZhbCk7CisjaW5jbHVkZSAicGFydGlhbC1zdGFiLmgiCisKKwkgICAgICAgIGlmIChzdGFic3RyaW5nIAorCQkgICAgJiYgc3RhYnN0cmluZyAhPSBkZWJ1Z19pbmZvLT5zcyArIGZoLT5pc3NCYXNlICsgc2guaXNzKQorCQkgIGZyZWUgKHN0YWJzdHJpbmcpOworCSAgICAgIH0KKwkgICAgLyogZW5kIC0gSGFuZGxlIGNvbnRpbnVhdGlvbiAqLworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZvciAoY3VyX3NkeCA9IDA7IGN1cl9zZHggPCBmaC0+Y3N5bTspCisJICAgIHsKKwkgICAgICBjaGFyICpuYW1lOworCSAgICAgIGVudW0gYWRkcmVzc19jbGFzcyBjbGFzczsKKworCSAgICAgICgqc3dhcF9zeW1faW4pIChjdXJfYmZkLAorCQkJICAgICAgKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQorCQkJICAgICAgICsgKChmaC0+aXN5bUJhc2UgKyBjdXJfc2R4KQorCQkJCSAgKiBleHRlcm5hbF9zeW1fc2l6ZSkpLAorCQkJICAgICAgJnNoKTsKKworCSAgICAgIGlmIChFQ09GRl9JU19TVEFCICgmc2gpKQorCQl7CisJCSAgY3VyX3NkeCsrOworCQkgIGNvbnRpbnVlOworCQl9CisKKwkgICAgICAvKiBOb24gYWJzb2x1dGUgc3RhdGljIHN5bWJvbHMgZ28gaW50byB0aGUgbWluaW1hbCB0YWJsZS4gICovCisJICAgICAgaWYgKFNDX0lTX1VOREVGKHNoLnNjKSB8fCBzaC5zYyA9PSBzY05pbAorCQkgIHx8IChzaC5pbmRleCA9PSBpbmRleE5pbAorCQkgICAgICAmJiAoc2guc3QgIT0gc3RTdGF0aWMgfHwgc2guc2MgPT0gc2NBYnMpKSkKKwkJeworCQkgIC8qIEZJWE1FLCBwcmVtYXR1cmU/ICovCisJCSAgY3VyX3NkeCsrOworCQkgIGNvbnRpbnVlOworCQl9CisKKwkgICAgICBuYW1lID0gZGVidWdfaW5mby0+c3MgKyBmaC0+aXNzQmFzZSArIHNoLmlzczsKKworCSAgICAgIHN3aXRjaCAoc2guc2MpCisJCXsKKwkJY2FzZSBzY1RleHQ6CisJCWNhc2Ugc2NSQ29uc3Q6CisJCSAgLyogVGhlIHZhbHVlIG9mIGEgc3RFbmQgc3ltYm9sIGlzIHRoZSBkaXNwbGFjZW1lbnQgZnJvbSB0aGUKKwkJICAgICBjb3JyZXNwb25kaW5nIHN0YXJ0IHN5bWJvbCB2YWx1ZSwgZG8gbm90IHJlbG9jYXRlIGl0LiAgKi8KKwkJICBpZiAoc2guc3QgIT0gc3RFbmQpCisJCSAgICBzaC52YWx1ZSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKTsKKwkJICBicmVhazsKKwkJY2FzZSBzY0RhdGE6CisJCWNhc2Ugc2NTRGF0YToKKwkJY2FzZSBzY1JEYXRhOgorCQljYXNlIHNjUERhdGE6CisJCWNhc2Ugc2NYRGF0YToKKwkJICBzaC52YWx1ZSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9EQVRBKTsKKwkJICBicmVhazsKKwkJY2FzZSBzY0JzczoKKwkJY2FzZSBzY1NCc3M6CisJCSAgc2gudmFsdWUgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfQlNTKTsKKwkJICBicmVhazsKKwkJfQorCisJICAgICAgc3dpdGNoIChzaC5zdCkKKwkJeworCQkgIENPUkVfQUREUiBoaWdoOworCQkgIENPUkVfQUREUiBwcm9jYWRkcjsKKwkJICBpbnQgbmV3X3NkeDsKKworCQljYXNlIHN0U3RhdGljUHJvYzoKKwkJICBwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbF9hbmRfaW5mbyAobmFtZSwgc2gudmFsdWUsCisJCQkJCQkgICAgICAgbXN0X2ZpbGVfdGV4dCwgTlVMTCwKKwkJCQkJCSAgICAgICBTRUNUX09GRl9URVhULCBOVUxMLAorCQkJCQkJICAgICAgIG9iamZpbGUpOworCisJCSAgLyogRkFMTFRIUk9VR0ggKi8KKworCQljYXNlIHN0UHJvYzoKKwkJICAvKiBVc3VhbGx5IHRoZXJlIGlzIGEgbG9jYWwgYW5kIGEgZ2xvYmFsIHN0UHJvYyBzeW1ib2wKKwkJICAgICBmb3IgYSBmdW5jdGlvbi4gVGhpcyBtZWFucyB0aGF0IHRoZSBmdW5jdGlvbiBuYW1lCisJCSAgICAgaGFzIGFscmVhZHkgYmVlbiBlbnRlcmVkIGludG8gdGhlIG1pbWltYWwgc3ltYm9sIHRhYmxlCisJCSAgICAgd2hpbGUgcHJvY2Vzc2luZyB0aGUgZ2xvYmFsIHN5bWJvbHMgaW4gcGFzcyAyIGFib3ZlLgorCQkgICAgIE9uZSBub3RhYmxlIGV4Y2VwdGlvbiBpcyB0aGUgUFJPR1JBTSBuYW1lIGZyb20KKwkJICAgICBmNzcgY29tcGlsZWQgZXhlY3V0YWJsZXMsIGl0IGlzIG9ubHkgcHV0IG91dCBhcworCQkgICAgIGxvY2FsIHN0UHJvYyBzeW1ib2wsIGFuZCBhIGdsb2JhbCBNQUlOX18gc3RQcm9jIHN5bWJvbAorCQkgICAgIHBvaW50cyB0byBpdC4gIEl0IGRvZXNuJ3QgbWF0dGVyIHRob3VnaCwgYXMgZ2RiIGlzCisJCSAgICAgc3RpbGwgYWJsZSB0byBmaW5kIHRoZSBQUk9HUkFNIG5hbWUgdmlhIHRoZSBwYXJ0aWFsCisJCSAgICAgc3ltYm9sIHRhYmxlLCBhbmQgdGhlIE1BSU5fXyBzeW1ib2wgdmlhIHRoZSBtaW5pbWFsCisJCSAgICAgc3ltYm9sIHRhYmxlLiAgKi8KKwkJICBpZiAoc2guc3QgPT0gc3RQcm9jKQorCQkgICAgYWRkX3BzeW1ib2xfdG9fbGlzdCAobmFtZSwgc3RybGVuIChuYW1lKSwKKwkJCQkJIFZBUl9OQU1FU1BBQ0UsIExPQ19CTE9DSywKKwkJCQkJICZvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMsCisJCQkJCSAwLCBzaC52YWx1ZSwgcHN5bXRhYl9sYW5ndWFnZSwgb2JqZmlsZSk7CisJCSAgZWxzZQorCQkgICAgYWRkX3BzeW1ib2xfdG9fbGlzdCAobmFtZSwgc3RybGVuIChuYW1lKSwKKwkJCQkJIFZBUl9OQU1FU1BBQ0UsIExPQ19CTE9DSywKKwkJCQkJICZvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMsCisJCQkJCSAwLCBzaC52YWx1ZSwgcHN5bXRhYl9sYW5ndWFnZSwgb2JqZmlsZSk7CisKKwkJICAvKiBTa2lwIG92ZXIgcHJvY2VkdXJlIHRvIG5leHQgb25lLiAqLworCQkgIGlmIChzaC5pbmRleCA+PSBoZHItPmlhdXhNYXgpCisJCSAgICB7CisJCSAgICAgIC8qIFNob3VsZCBub3QgaGFwcGVuLCBidXQgZG9lcyB3aGVuIGNyb3NzLWNvbXBpbGluZworCQkJICAgd2l0aCB0aGUgTUlQUyBjb21waWxlci4gIEZJWE1FIC0tIHB1bGwgbGF0ZXIuICAqLworCQkgICAgICBjb21wbGFpbiAoJmluZGV4X2NvbXBsYWludCwgbmFtZSk7CisJCSAgICAgIG5ld19zZHggPSBjdXJfc2R4ICsgMTsJLyogRG9uJ3Qgc2tpcCBhdCBhbGwgKi8KKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICBuZXdfc2R4ID0gQVVYX0dFVF9JU1lNIChmaC0+ZkJpZ2VuZGlhbiwKKwkJCQkJICAgIChkZWJ1Z19pbmZvLT5leHRlcm5hbF9hdXgKKwkJCQkJICAgICArIGZoLT5pYXV4QmFzZQorCQkJCQkgICAgICsgc2guaW5kZXgpKTsKKwkJICBwcm9jYWRkciA9IHNoLnZhbHVlOworCisJCSAgaWYgKG5ld19zZHggPD0gY3VyX3NkeCkKKwkJICAgIHsKKwkJICAgICAgLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiBlaXRoZXIuLi4gRklYTUUuICAqLworCQkgICAgICBjb21wbGFpbiAoJmF1eF9pbmRleF9jb21wbGFpbnQsIG5hbWUpOworCQkgICAgICBuZXdfc2R4ID0gY3VyX3NkeCArIDE7CS8qIERvbid0IHNraXAgYmFja3dhcmQgKi8KKwkJICAgIH0KKworCQkgIGN1cl9zZHggPSBuZXdfc2R4OworCQkgICgqc3dhcF9zeW1faW4pIChjdXJfYmZkLAorCQkJCSAgKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQorCQkJCSAgICsgKChmaC0+aXN5bUJhc2UgKyBjdXJfc2R4IC0gMSkKKwkJCQkgICAgICAqIGV4dGVybmFsX3N5bV9zaXplKSksCisJCQkJICAmc2gpOworCQkgIGlmIChzaC5zdCAhPSBzdEVuZCkKKwkJICAgIGNvbnRpbnVlOworCisJCSAgLyogS2x1ZGdlIGZvciBJcml4IDUuMiB6ZXJvIGZoLT5hZHIuICAqLworCQkgIGlmICghcmVsb2NhdGFibGUKKwkJICAgICAgJiYgKHBzdC0+dGV4dGxvdyA9PSAwIHx8IHByb2NhZGRyIDwgcHN0LT50ZXh0bG93KSkKKwkJICAgIHBzdC0+dGV4dGxvdyA9IHByb2NhZGRyOworCisJCSAgaGlnaCA9IHByb2NhZGRyICsgc2gudmFsdWU7CisJCSAgaWYgKGhpZ2ggPiBwc3QtPnRleHRoaWdoKQorCQkgICAgcHN0LT50ZXh0aGlnaCA9IGhpZ2g7CisJCSAgY29udGludWU7CisKKwkJY2FzZSBzdFN0YXRpYzoJLyogVmFyaWFibGUgKi8KKyAgICAgICAgICAJICBpZiAoU0NfSVNfREFUQSAoc2guc2MpKQorCQkgICAgcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2xfYW5kX2luZm8gKG5hbWUsIHNoLnZhbHVlLAorCQkJCQkJCSBtc3RfZmlsZV9kYXRhLCBOVUxMLAorCQkJCQkJCSBTRUNUX09GRl9EQVRBLAorCQkJCQkJCSBOVUxMLAorCQkJCQkJCSBvYmpmaWxlKTsKKwkJICBlbHNlCisJCSAgICBwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbF9hbmRfaW5mbyAobmFtZSwgc2gudmFsdWUsCisJCQkJCQkJIG1zdF9maWxlX2JzcywgTlVMTCwKKwkJCQkJCQkgU0VDVF9PRkZfQlNTLAorCQkJCQkJCSBOVUxMLAorCQkJCQkJCSBvYmpmaWxlKTsKKwkJICBjbGFzcyA9IExPQ19TVEFUSUM7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBzdEluZGlyZWN0Oi8qIElyaXg1IGZvcndhcmQgZGVjbGFyYXRpb24gKi8KKwkJICAvKiBTa2lwIGZvcndhcmQgZGVjbGFyYXRpb25zIGZyb20gSXJpeDUgY2MgKi8KKwkJICBnb3RvIHNraXA7CisKKwkJY2FzZSBzdFR5cGVkZWY6LyogVHlwZWRlZiAqLworCQkgIC8qIFNraXAgdHlwZWRlZnMgZm9yIGZvcndhcmQgZGVjbGFyYXRpb25zIGFuZCBvcGFxdWUKKwkJICAgICBzdHJ1Y3RzIGZyb20gYWxwaGEgYW5kIG1pcHMgY2MuICAqLworCQkgIGlmIChzaC5pc3MgPT0gMCB8fCBoYXNfb3BhcXVlX3hyZWYgKGZoLCAmc2gpKQorCQkgICAgZ290byBza2lwOworCQkgIGNsYXNzID0gTE9DX1RZUEVERUY7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBzdENvbnN0YW50OgkvKiBDb25zdGFudCBkZWNsICovCisJCSAgY2xhc3MgPSBMT0NfQ09OU1Q7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBzdFVuaW9uOgorCQljYXNlIHN0U3RydWN0OgorCQljYXNlIHN0RW51bToKKwkJY2FzZSBzdEJsb2NrOgkvKiB7IH0sIHN0ciwgdW4sIGVudW0qLworCQkgIC8qIERvIG5vdCBjcmVhdGUgYSBwYXJ0aWFsIHN5bWJvbCBmb3IgY2MgdW5uYW1lZCBhZ2dyZWdhdGVzCisJCSAgICAgYW5kIGdjYyBlbXB0eSBhZ2dyZWdhdGVzLiAqLworCQkgIGlmICgoc2guc2MgPT0gc2NJbmZvCisJCSAgICAgICB8fCBTQ19JU19DT01NT04oc2guc2MpKQorCQkgICAgICAmJiBzaC5pc3MgIT0gMAorCQkgICAgICAmJiBzaC5pbmRleCAhPSBjdXJfc2R4ICsgMikKKwkJICAgIHsKKwkJICAgICAgYWRkX3BzeW1ib2xfdG9fbGlzdCAobmFtZSwgc3RybGVuIChuYW1lKSwKKwkJCQkJICAgU1RSVUNUX05BTUVTUEFDRSwgTE9DX1RZUEVERUYsCisJCQkJCSAgICZvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMsCisJCQkJCSAgIDAsIChDT1JFX0FERFIpIDAsCisJCQkJCSAgIHBzeW10YWJfbGFuZ3VhZ2UsIG9iamZpbGUpOworCQkgICAgfQorCQkgIGhhbmRsZV9wc3ltYm9sX2VudW1lcmF0b3JzIChvYmpmaWxlLCBmaCwgc2guc3QsIHNoLnZhbHVlKTsKKworCQkgIC8qIFNraXAgb3ZlciB0aGUgYmxvY2sgKi8KKwkJICBuZXdfc2R4ID0gc2guaW5kZXg7CisJCSAgaWYgKG5ld19zZHggPD0gY3VyX3NkeCkKKwkJICAgIHsKKwkJICAgICAgLyogVGhpcyBoYXBwZW5zIHdpdGggdGhlIFVsdHJpeCBrZXJuZWwuICovCisJCSAgICAgIGNvbXBsYWluICgmYmxvY2tfaW5kZXhfY29tcGxhaW50LCBuYW1lKTsKKwkJICAgICAgbmV3X3NkeCA9IGN1cl9zZHggKyAxOwkvKiBEb24ndCBza2lwIGJhY2t3YXJkICovCisJCSAgICB9CisJCSAgY3VyX3NkeCA9IG5ld19zZHg7CisJCSAgY29udGludWU7CisKKwkJY2FzZSBzdEZpbGU6CS8qIEZpbGUgaGVhZGVycyAqLworCQljYXNlIHN0TGFiZWw6CS8qIExhYmVscyAqLworCQljYXNlIHN0RW5kOgkvKiBFbmRzIG9mIGZpbGVzICovCisJCSAgZ290byBza2lwOworCisJCWNhc2Ugc3RMb2NhbDoJLyogTG9jYWwgdmFyaWFibGVzICovCisJCSAgLyogTm9ybWFsbHkgdGhlc2UgYXJlIHNraXBwZWQgYmVjYXVzZSB3ZSBza2lwIG92ZXIKKwkJICAgICBhbGwgYmxvY2tzIHdlIHNlZS4gIEhvd2V2ZXIsIHRoZXNlIGNhbiBvY2N1cgorCQkgICAgIGFzIHZpc2libGUgc3ltYm9scyBpbiBhIC5oIGZpbGUgdGhhdCBjb250YWlucyBjb2RlLiAqLworCQkgIGdvdG8gc2tpcDsKKworCQlkZWZhdWx0OgorCQkgIC8qIEJvdGggY29tcGxhaW50cyBhcmUgdmFsaWQ6ICBvbmUgZ2l2ZXMgc3ltYm9sIG5hbWUsCisJCSAgICAgdGhlIG90aGVyIHRoZSBvZmZlbmRpbmcgc3ltYm9sIHR5cGUuICAqLworCQkgIGNvbXBsYWluICgmdW5rbm93bl9zeW1fY29tcGxhaW50LCBuYW1lKTsKKwkJICBjb21wbGFpbiAoJnVua25vd25fc3RfY29tcGxhaW50LCBzaC5zdCk7CisJCSAgY3VyX3NkeCsrOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgLyogVXNlIHRoaXMgZ2RiIHN5bWJvbCAqLworCSAgICAgIGFkZF9wc3ltYm9sX3RvX2xpc3QgKG5hbWUsIHN0cmxlbiAobmFtZSksCisJCQkJICAgVkFSX05BTUVTUEFDRSwgY2xhc3MsCisJCQkJICAgJm9iamZpbGUtPnN0YXRpY19wc3ltYm9scywKKwkJCQkgICAwLCBzaC52YWx1ZSwgcHN5bXRhYl9sYW5ndWFnZSwgb2JqZmlsZSk7CisJICAgIHNraXA6CisJICAgICAgY3VyX3NkeCsrOwkvKiBHbyB0byBuZXh0IGZpbGUgc3ltYm9sICovCisJICAgIH0KKworCSAgLyogTm93IGRvIGVudGVyIHRoZSBleHRlcm5hbCBzeW1ib2xzLiAqLworCSAgZXh0X3B0ciA9ICZleHRlcm5fdGFiW2Zkcl90b19wc3RbZl9pZHhdLmdsb2JhbHNfb2Zmc2V0XTsKKwkgIGN1cl9zZHggPSBmZHJfdG9fcHN0W2ZfaWR4XS5uX2dsb2JhbHM7CisJICBQU1RfUFJJVkFURSAoc2F2ZV9wc3QpLT5leHRlcm5fY291bnQgPSBjdXJfc2R4OworCSAgUFNUX1BSSVZBVEUgKHNhdmVfcHN0KS0+ZXh0ZXJuX3RhYiA9IGV4dF9wdHI7CisJICBmb3IgKDsgLS1jdXJfc2R4ID49IDA7IGV4dF9wdHIrKykKKwkgICAgeworCSAgICAgIGVudW0gYWRkcmVzc19jbGFzcyBjbGFzczsKKwkgICAgICBTWU1SICpwc2g7CisJICAgICAgY2hhciAqbmFtZTsKKwkgICAgICBDT1JFX0FERFIgc3ZhbHVlOworCisJICAgICAgaWYgKGV4dF9wdHItPmlmZCAhPSBmX2lkeCkKKwkJYWJvcnQgKCk7CisJICAgICAgcHNoID0gJmV4dF9wdHItPmFzeW07CisKKwkgICAgICAvKiBEbyBub3QgYWRkIHVuZGVmaW5lZCBzeW1ib2xzIHRvIHRoZSBwYXJ0aWFsIHN5bWJvbCB0YWJsZS4gICovCisJICAgICAgaWYgKFNDX0lTX1VOREVGKHBzaC0+c2MpIHx8IHBzaC0+c2MgPT0gc2NOaWwpCisJCWNvbnRpbnVlOworCisJICAgICAgc3ZhbHVlID0gcHNoLT52YWx1ZTsKKwkgICAgICBzd2l0Y2ggKHBzaC0+c2MpCisJCXsKKwkJY2FzZSBzY1RleHQ6CisJCWNhc2Ugc2NSQ29uc3Q6CisJCSAgc3ZhbHVlICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOworCQkgIGJyZWFrOworCQljYXNlIHNjRGF0YToKKwkJY2FzZSBzY1NEYXRhOgorCQljYXNlIHNjUkRhdGE6CisJCWNhc2Ugc2NQRGF0YToKKwkJY2FzZSBzY1hEYXRhOgorCQkgIHN2YWx1ZSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9EQVRBKTsKKwkJICBicmVhazsKKwkJY2FzZSBzY0JzczoKKwkJY2FzZSBzY1NCc3M6CisJCSAgc3ZhbHVlICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX0JTUyk7CisJCSAgYnJlYWs7CisJCX0KKworCSAgICAgIHN3aXRjaCAocHNoLT5zdCkKKwkJeworCQljYXNlIHN0TmlsOgorCQkgIC8qIFRoZXNlIGFyZSBnZW5lcmF0ZWQgZm9yIHN0YXRpYyBzeW1ib2xzIGluIC5vIGZpbGVzLAorCQkgICAgIGlnbm9yZSB0aGVtLiAgKi8KKwkJICBjb250aW51ZTsKKwkJY2FzZSBzdFByb2M6CisJCWNhc2Ugc3RTdGF0aWNQcm9jOgorCQkgIC8qIEV4dGVybmFsIHByb2NlZHVyZSBzeW1ib2xzIGhhdmUgYmVlbiBlbnRlcmVkCisJCSAgICAgaW50byB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGUgaW4gcGFzcyAyIGFib3ZlLgorCQkgICAgIElnbm9yZSB0aGVtLCBhcyBwYXJzZV9leHRlcm5hbCB3aWxsIGlnbm9yZSB0aGVtIHRvby4gICovCisJCSAgY29udGludWU7CisJCWNhc2Ugc3RMYWJlbDoKKwkJICBjbGFzcyA9IExPQ19MQUJFTDsKKwkJICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICBjb21wbGFpbiAoJnVua25vd25fZXh0X2NvbXBsYWludCwKKwkJCSAgICBkZWJ1Z19pbmZvLT5zc2V4dCArIHBzaC0+aXNzKTsKKwkJICAvKiBGYWxsIHRocm91Z2gsIHByZXRlbmQgaXQncyBnbG9iYWwuICAqLworCQljYXNlIHN0R2xvYmFsOgorCQkgIC8qIEdsb2JhbCBjb21tb24gc3ltYm9scyBhcmUgcmVzb2x2ZWQgYnkgdGhlIHJ1bnRpbWUgbG9hZGVyLAorCQkgICAgIGlnbm9yZSB0aGVtLiAgKi8KKwkJICBpZiAoU0NfSVNfQ09NTU9OKHBzaC0+c2MpKQorCQkgICAgY29udGludWU7CisKKwkJICBjbGFzcyA9IExPQ19TVEFUSUM7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBuYW1lID0gZGVidWdfaW5mby0+c3NleHQgKyBwc2gtPmlzczsKKwkgICAgICBhZGRfcHN5bWJvbF90b19saXN0IChuYW1lLCBzdHJsZW4gKG5hbWUpLAorCQkJCSAgIFZBUl9OQU1FU1BBQ0UsIGNsYXNzLAorCQkJCSAgICZvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMsCisJCQkJICAgMCwgc3ZhbHVlLAorCQkJCSAgIHBzeW10YWJfbGFuZ3VhZ2UsIG9iamZpbGUpOworCSAgICB9CisJfQorCisgICAgICAvKiBMaW5rIHBzdCB0byBGRFIuIGVuZF9wc3ltdGFiIHJldHVybnMgTlVMTCBpZiB0aGUgcHN5bXRhYiB3YXMKKwkgZW1wdHkgYW5kIHB1dCBvbiB0aGUgZnJlZSBsaXN0LiAgKi8KKyAgICAgIGZkcl90b19wc3RbZl9pZHhdLnBzdCA9IGVuZF9wc3ltdGFiIChzYXZlX3BzdCwKKwkJCQkJICAgcHN5bXRhYl9pbmNsdWRlX2xpc3QsIGluY2x1ZGVzX3VzZWQsCisJCQkJCSAgIC0xLCBzYXZlX3BzdC0+dGV4dGhpZ2gsCisJCQkJCSAgIGRlcGVuZGVuY3lfbGlzdCwgZGVwZW5kZW5jaWVzX3VzZWQsIHRleHRsb3dfbm90X3NldCk7CisgICAgICBpbmNsdWRlc191c2VkID0gMDsKKyAgICAgIGRlcGVuZGVuY2llc191c2VkID0gMDsKKworICAgICAgaWYgKG9iamZpbGUtPmVpLmVudHJ5X3BvaW50ID49IHNhdmVfcHN0LT50ZXh0bG93ICYmCisJICBvYmpmaWxlLT5laS5lbnRyeV9wb2ludCA8IHNhdmVfcHN0LT50ZXh0aGlnaCkKKwl7CisJICBvYmpmaWxlLT5laS5lbnRyeV9maWxlX2xvd3BjID0gc2F2ZV9wc3QtPnRleHRsb3c7CisJICBvYmpmaWxlLT5laS5lbnRyeV9maWxlX2hpZ2hwYyA9IHNhdmVfcHN0LT50ZXh0aGlnaDsKKwl9CisKKyAgICAgIC8qIFRoZSBvYmpmaWxlIGhhcyBpdHMgZnVuY3Rpb25zIHJlb3JkZXJlZCBpZiB0aGlzIHBhcnRpYWwgc3ltYm9sCisJIHRhYmxlIG92ZXJsYXBzIGFueSBvdGhlciBwYXJ0aWFsIHN5bWJvbCB0YWJsZS4KKwkgV2UgY2Fubm90IGFzc3VtZSBhIHJlb3JkZXJlZCBvYmpmaWxlIGlmIGEgcGFydGlhbCBzeW1ib2wgdGFibGUKKwkgaXMgY29udGFpbmVkIHdpdGhpbiBhbm90aGVyIHBhcnRpYWwgc3ltYm9sIHRhYmxlLCBhcyBwYXJ0aWFsIHN5bWJvbAorCSB0YWJsZXMgZm9yIGluY2x1ZGUgZmlsZXMgd2l0aCBleGVjdXRhYmxlIGNvZGUgYXJlIGNvbnRhaW5lZAorCSB3aXRoaW4gdGhlIHBhcnRpYWwgc3ltYm9sIHRhYmxlIGZvciB0aGUgaW5jbHVkaW5nIHNvdXJjZSBmaWxlLAorCSBhbmQgd2UgZG8gbm90IHdhbnQgdG8gZmxhZyB0aGUgb2JqZmlsZSByZW9yZGVyZWQgZm9yIHRoZXNlIGNhc2VzLgorCisJIFRoaXMgc3RyYXRlZ3kgd29ya3Mgd2VsbCBmb3IgSXJpeC01LjIgc2hhcmVkIGxpYnJhcmllcywgYnV0IHdlCisJIG1pZ2h0IGhhdmUgdG8gdXNlIGEgbW9yZSBlbGFib3JhdGUgKGFuZCBzbG93ZXIpIGFsZ29yaXRobSBmb3IKKwkgb3RoZXIgY2FzZXMuICAqLworICAgICAgc2F2ZV9wc3QgPSBmZHJfdG9fcHN0W2ZfaWR4XS5wc3Q7CisgICAgICBpZiAoc2F2ZV9wc3QgIT0gTlVMTAorCSAgJiYgc2F2ZV9wc3QtPnRleHRsb3cgIT0gMAorCSAgJiYgIShvYmpmaWxlLT5mbGFncyAmIE9CSkZfUkVPUkRFUkVEKSkKKwl7CisJICBBTExfT0JKRklMRV9QU1lNVEFCUyAob2JqZmlsZSwgcHN0KQorCSAgICB7CisJICAgICAgaWYgKHNhdmVfcHN0ICE9IHBzdAorCQkgICYmIHNhdmVfcHN0LT50ZXh0bG93ID49IHBzdC0+dGV4dGxvdworCQkgICYmIHNhdmVfcHN0LT50ZXh0bG93IDwgcHN0LT50ZXh0aGlnaAorCQkgICYmIHNhdmVfcHN0LT50ZXh0aGlnaCA+IHBzdC0+dGV4dGhpZ2gpCisJCXsKKwkJICBvYmpmaWxlLT5mbGFncyB8PSBPQkpGX1JFT1JERVJFRDsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICAvKiBOb3cgc2NhbiB0aGUgRkRScyBmb3IgZGVwZW5kZW5jaWVzICovCisgIGZvciAoZl9pZHggPSAwOyBmX2lkeCA8IGhkci0+aWZkTWF4OyBmX2lkeCsrKQorICAgIHsKKyAgICAgIGZoID0gZl9pZHggKyBkZWJ1Z19pbmZvLT5mZHI7CisgICAgICBwc3QgPSBmZHJfdG9fcHN0W2ZfaWR4XS5wc3Q7CisKKyAgICAgIGlmIChwc3QgPT0gKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKU5VTEwpCisJY29udGludWU7CisKKyAgICAgIC8qIFRoaXMgc2hvdWxkIGNhdGNoIHN0YWJzLWluLWVjb2ZmLiAqLworICAgICAgaWYgKGZoLT5jcmZkIDw9IDEpCisJY29udGludWU7CisKKyAgICAgIC8qIFNraXAgdGhlIGZpcnN0IGZpbGUgaW5kaXJlY3QgZW50cnkgYXMgaXQgaXMgYSBzZWxmIGRlcGVuZGVuY3kKKwkgZm9yIHNvdXJjZSBmaWxlcyBvciBhIHJldmVyc2UgLmggLT4gLmMgZGVwZW5kZW5jeSBmb3IgaGVhZGVyIGZpbGVzLiAgKi8KKyAgICAgIHBzdC0+bnVtYmVyX29mX2RlcGVuZGVuY2llcyA9IDA7CisgICAgICBwc3QtPmRlcGVuZGVuY2llcyA9CisJKChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKiopCisJIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5wc3ltYm9sX29ic3RhY2ssCisJCQkoKGZoLT5jcmZkIC0gMSkKKwkJCSAqIHNpemVvZiAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKSkpOworICAgICAgZm9yIChzX2lkeCA9IDE7IHNfaWR4IDwgZmgtPmNyZmQ7IHNfaWR4KyspCisJeworCSAgUkZEVCByaDsKKworCSAgKCpzd2FwX3JmZF9pbikgKGN1cl9iZmQsCisJCQkgICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9yZmQKKwkJCSAgICsgKGZoLT5yZmRCYXNlICsgc19pZHgpICogZXh0ZXJuYWxfcmZkX3NpemUpLAorCQkJICAmcmgpOworCSAgaWYgKHJoIDwgMCB8fCByaCA+PSBoZHItPmlmZE1heCkKKwkgICAgeworCSAgICAgIGNvbXBsYWluICgmYmFkX2ZpbGVfbnVtYmVyX2NvbXBsYWludCwgcmgpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIC8qIFNraXAgc2VsZiBkZXBlbmRlbmNpZXMgb2YgaGVhZGVyIGZpbGVzLiAgKi8KKwkgIGlmIChyaCA9PSBmX2lkeCkKKwkgICAgY29udGludWU7CisKKwkgIC8qIERvIG5vdCBhZGQgdG8gZGVwZW5kZW55IGxpc3QgaWYgcHN5bXRhYiB3YXMgZW1wdHkuICAqLworCSAgaWYgKGZkcl90b19wc3RbcmhdLnBzdCA9PSAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopTlVMTCkKKwkgICAgY29udGludWU7CisJICBwc3QtPmRlcGVuZGVuY2llc1twc3QtPm51bWJlcl9vZl9kZXBlbmRlbmNpZXMrK10gPSBmZHJfdG9fcHN0W3JoXS5wc3Q7CisJfQorICAgIH0KKworICAvKiBSZW1vdmUgdGhlIGR1bW15IHBzeW10YWIgY3JlYXRlZCBmb3IgLU8zIGltYWdlcyBhYm92ZSwgaWYgaXQgaXMKKyAgICAgc3RpbGwgZW1wdHksIHRvIGVuYWJsZSB0aGUgZGV0ZWN0aW9uIG9mIHN0cmlwcGVkIGV4ZWN1dGFibGVzLiAgKi8KKyAgaWYgKG9iamZpbGUtPnBzeW10YWJzLT5uZXh0ID09IE5VTEwKKyAgICAgICYmIG9iamZpbGUtPnBzeW10YWJzLT5udW1iZXJfb2ZfZGVwZW5kZW5jaWVzID09IDAKKyAgICAgICYmIG9iamZpbGUtPnBzeW10YWJzLT5uX2dsb2JhbF9zeW1zID09IDAKKyAgICAgICYmIG9iamZpbGUtPnBzeW10YWJzLT5uX3N0YXRpY19zeW1zID09IDApCisgICAgb2JqZmlsZS0+cHN5bXRhYnMgPSBOVUxMOworICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKK30KKworLyogSWYgdGhlIGN1cnJlbnQgcHN5bWJvbCBoYXMgYW4gZW51bWVyYXRlZCB0eXBlLCB3ZSBuZWVkIHRvIGFkZAorICAgYWxsIHRoZSB0aGUgZW51bSBjb25zdGFudHMgdG8gdGhlIHBhcnRpYWwgc3ltYm9sIHRhYmxlLiAgKi8KKworc3RhdGljIHZvaWQKK2hhbmRsZV9wc3ltYm9sX2VudW1lcmF0b3JzIChvYmpmaWxlLCBmaCwgc3R5cGUsIHN2YWx1ZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIEZEUiAqZmg7CisgICAgIGludCBzdHlwZTsKKyAgICAgQ09SRV9BRERSIHN2YWx1ZTsKK3sKKyAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fc2l6ZSA9IGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplOworICB2b2lkICgqIGNvbnN0IHN3YXBfc3ltX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBTWU1SICopKQorICAgID0gZGVidWdfc3dhcC0+c3dhcF9zeW1faW47CisgIGNoYXIgKmV4dF9zeW0gPSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfc3ltCisJCSAgKyAoKGZoLT5pc3ltQmFzZSArIGN1cl9zZHggKyAxKSAqIGV4dGVybmFsX3N5bV9zaXplKSk7CisgIFNZTVIgc2g7CisgIFRJUiB0aXI7CisKKyAgc3dpdGNoIChzdHlwZSkKKyAgICB7CisgICAgY2FzZSBzdEVudW06CisgICAgICBicmVhazsKKworICAgIGNhc2Ugc3RCbG9jazoKKyAgICAgIC8qIEl0IGlzIGFuIGVudW1lcmF0ZWQgdHlwZSBpZiB0aGUgbmV4dCBzeW1ib2wgZW50cnkgaXMgYSBzdE1lbWJlcgorCSBhbmQgaXRzIGF1eGlsaWFyeSBpbmRleCBpcyBpbmRleE5pbCBvciBpdHMgYXV4aWxpYXJ5IGVudHJ5CisJIGlzIGEgcGxhaW4gYnROaWwgb3IgYnRWb2lkLgorCSBBbHBoYSBjYyAtbWlncmF0ZSBlbnVtcyBhcmUgcmVjb2duaXplZCBieSBhIHplcm8gaW5kZXggYW5kCisJIGEgemVybyBzeW1ib2wgdmFsdWUuCisJIERVIDQuMCBjYyBlbnVtcyBhcmUgcmVjb2duaXplZCBieSBhIG1lbWJlciB0eXBlIG9mIGJ0RW51bSB3aXRob3V0CisJIHF1YWxpZmllcnMgYW5kIGEgemVybyBzeW1ib2wgdmFsdWUuICAqLworICAgICAgKCpzd2FwX3N5bV9pbikgKGN1cl9iZmQsIGV4dF9zeW0sICZzaCk7CisgICAgICBpZiAoc2guc3QgIT0gc3RNZW1iZXIpCisJcmV0dXJuOworCisgICAgICBpZiAoc2guaW5kZXggPT0gaW5kZXhOaWwKKwkgIHx8IChzaC5pbmRleCA9PSAwICYmIHN2YWx1ZSA9PSAwKSkKKwlicmVhazsKKyAgICAgICgqZGVidWdfc3dhcC0+c3dhcF90aXJfaW4pIChmaC0+ZkJpZ2VuZGlhbiwKKwkJCQkgICYoZGVidWdfaW5mby0+ZXh0ZXJuYWxfYXV4CisJCQkJICAgICsgZmgtPmlhdXhCYXNlICsgc2guaW5kZXgpLT5hX3RpLAorCQkJCSAgJnRpcik7CisgICAgICBpZiAoKHRpci5idCAhPSBidE5pbAorCSAgICYmIHRpci5idCAhPSBidFZvaWQKKwkgICAmJiAodGlyLmJ0ICE9IGJ0RW51bSB8fCBzdmFsdWUgIT0gMCkpCisJICB8fCB0aXIudHEwICE9IHRxTmlsKQorCXJldHVybjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBjaGFyICpuYW1lOworCisgICAgICAoKnN3YXBfc3ltX2luKSAoY3VyX2JmZCwgZXh0X3N5bSwgJnNoKTsKKyAgICAgIGlmIChzaC5zdCAhPSBzdE1lbWJlcikKKwlicmVhazsKKyAgICAgIG5hbWUgPSBkZWJ1Z19pbmZvLT5zcyArIGN1cl9mZHItPmlzc0Jhc2UgKyBzaC5pc3M7CisKKyAgICAgIC8qIE5vdGUgdGhhdCB0aGUgdmFsdWUgZG9lc24ndCBtYXR0ZXIgZm9yIGVudW0gY29uc3RhbnRzCisJIGluIHBzeW10YWJzLCBqdXN0IGluIHN5bXRhYnMuICAqLworICAgICAgYWRkX3BzeW1ib2xfdG9fbGlzdCAobmFtZSwgc3RybGVuIChuYW1lKSwKKwkJCSAgIFZBUl9OQU1FU1BBQ0UsIExPQ19DT05TVCwKKwkJCSAgICZvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMsIDAsCisJCQkgICAoQ09SRV9BRERSKSAwLCBwc3ltdGFiX2xhbmd1YWdlLCBvYmpmaWxlKTsKKyAgICAgIGV4dF9zeW0gKz0gZXh0ZXJuYWxfc3ltX3NpemU7CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqCittZGVidWdfbmV4dF9zeW1ib2xfdGV4dCAob2JqZmlsZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CS8qIGFyZ3VtZW50IG9iamZpbGUgaXMgY3VycmVudGx5IHVudXNlZCAqLworeworICBTWU1SIHNoOworCisgIGN1cl9zZHgrKzsKKyAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikgKGN1cl9iZmQsCisJCQkgICAgICAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfc3ltCisJCQkgICAgICAgKyAoKGN1cl9mZHItPmlzeW1CYXNlICsgY3VyX3NkeCkKKwkJCQkgICogZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpKSwKKwkJCSAgICAgICZzaCk7CisgIHJldHVybiBkZWJ1Z19pbmZvLT5zcyArIGN1cl9mZHItPmlzc0Jhc2UgKyBzaC5pc3M7Cit9CisKKy8qIEFuY2lsbGFyeSBmdW5jdGlvbiB0byBwc3ltdGFiX3RvX3N5bXRhYigpLiAgRG9lcyBhbGwgdGhlIHdvcmsKKyAgIGZvciB0dXJuaW5nIHRoZSBwYXJ0aWFsIHN5bXRhYiBQU1QgaW50byBhIHN5bXRhYiwgcmVjdXJyaW5nCisgICBmaXJzdCBvbiBhbGwgZGVwZW5kZW50IHBzeW10YWJzLiAgVGhlIGFyZ3VtZW50IEZJTEVOQU1FIGlzCisgICBvbmx5IHBhc3NlZCBzbyB3ZSBjYW4gc2VlIGluIGRlYnVnIHN0YWNrIHRyYWNlcyB3aGF0IGZpbGUKKyAgIGlzIGJlaW5nIHJlYWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaGFzIGEgc3BsaXQgcGVyc29uYWxpdHksIGJhc2VkIG9uIHdoZXRoZXIgdGhlCisgICBzeW1ib2wgdGFibGUgY29udGFpbnMgb3JkaW5hcnkgZWNvZmYgc3ltYm9scywgb3Igc3RhYnMtaW4tZWNvZmYuCisgICBUaGUgZmxvdyBvZiBjb250cm9sIGFuZCBldmVuIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBkaWZmZXJzLiAgRklYTUUuICAqLworCitzdGF0aWMgdm9pZAorcHN5bXRhYl90b19zeW10YWJfMSAocHN0LCBmaWxlbmFtZSkKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7CisgICAgIGNoYXIgKmZpbGVuYW1lOworeworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplOworICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3Bkcl9zaXplOworICB2b2lkICgqc3dhcF9zeW1faW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFNZTVIgKikpOworICB2b2lkICgqc3dhcF9wZHJfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBEUiAqKSk7CisgIGludCBpOworICBzdHJ1Y3Qgc3ltdGFiICpzdDsKKyAgRkRSICpmaDsKKyAgc3RydWN0IGxpbmV0YWJsZSAqbGluZXM7CisgIENPUkVfQUREUiBsb3dlc3RfcGRyX2FkZHIgPSAwOworCisgIGlmIChwc3QtPnJlYWRpbikKKyAgICByZXR1cm47CisgIHBzdC0+cmVhZGluID0gMTsKKworICAvKiBSZWFkIGluIGFsbCBwYXJ0aWFsIHN5bWJ0YWJzIG9uIHdoaWNoIHRoaXMgb25lIGlzIGRlcGVuZGVudC4KKyAgICAgTk9URSB0aGF0IHdlIGRvIGhhdmUgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLCBzaWdoLiAgV2Ugc29sdmVkCisgICAgIHRoYXQgYnkgc2V0dGluZyBwc3QtPnJlYWRpbiBiZWZvcmUgdGhpcyBwb2ludC4gICovCisKKyAgZm9yIChpID0gMDsgaSA8IHBzdC0+bnVtYmVyX29mX2RlcGVuZGVuY2llczsgaSsrKQorICAgIGlmICghcHN0LT5kZXBlbmRlbmNpZXNbaV0tPnJlYWRpbikKKyAgICAgIHsKKwkvKiBJbmZvcm0gYWJvdXQgYWRkaXRpb25hbCBmaWxlcyB0byBiZSByZWFkIGluLiAgKi8KKwlpZiAoaW5mb192ZXJib3NlKQorCSAgeworCSAgICBmcHV0c19maWx0ZXJlZCAoIiAiLCBnZGJfc3Rkb3V0KTsKKwkgICAgd3JhcF9oZXJlICgiIik7CisJICAgIGZwdXRzX2ZpbHRlcmVkICgiYW5kICIsIGdkYl9zdGRvdXQpOworCSAgICB3cmFwX2hlcmUgKCIiKTsKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgiJXMuLi4iLAorCQkJICAgICBwc3QtPmRlcGVuZGVuY2llc1tpXS0+ZmlsZW5hbWUpOworCSAgICB3cmFwX2hlcmUgKCIiKTsJLyogRmx1c2ggb3V0cHV0ICovCisJICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisJICB9CisJLyogV2Ugb25seSBwYXNzIHRoZSBmaWxlbmFtZSBmb3IgZGVidWcgcHVycG9zZXMgKi8KKwlwc3ltdGFiX3RvX3N5bXRhYl8xIChwc3QtPmRlcGVuZGVuY2llc1tpXSwKKwkJCSAgICAgcHN0LT5kZXBlbmRlbmNpZXNbaV0tPmZpbGVuYW1lKTsKKyAgICAgIH0KKworICAvKiBEbyBub3RoaW5nIGlmIHRoaXMgaXMgYSBkdW1teSBwc3ltdGFiLiAgKi8KKworICBpZiAocHN0LT5uX2dsb2JhbF9zeW1zID09IDAgJiYgcHN0LT5uX3N0YXRpY19zeW1zID09IDAKKyAgICAgICYmIHBzdC0+dGV4dGxvdyA9PSAwICYmIHBzdC0+dGV4dGhpZ2ggPT0gMCkKKyAgICByZXR1cm47CisKKyAgLyogTm93IHJlYWQgdGhlIHN5bWJvbHMgZm9yIHRoaXMgc3ltdGFiICovCisKKyAgY3VyX2JmZCA9IENVUl9CRkQgKHBzdCk7CisgIGRlYnVnX3N3YXAgPSBERUJVR19TV0FQIChwc3QpOworICBkZWJ1Z19pbmZvID0gREVCVUdfSU5GTyAocHN0KTsKKyAgcGVuZGluZ19saXN0ID0gUEVORElOR19MSVNUIChwc3QpOworICBleHRlcm5hbF9zeW1fc2l6ZSA9IGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplOworICBleHRlcm5hbF9wZHJfc2l6ZSA9IGRlYnVnX3N3YXAtPmV4dGVybmFsX3Bkcl9zaXplOworICBzd2FwX3N5bV9pbiA9IGRlYnVnX3N3YXAtPnN3YXBfc3ltX2luOworICBzd2FwX3Bkcl9pbiA9IGRlYnVnX3N3YXAtPnN3YXBfcGRyX2luOworICBjdXJyZW50X29iamZpbGUgPSBwc3QtPm9iamZpbGU7CisgIGN1cl9mZCA9IEZEUl9JRFggKHBzdCk7CisgIGZoID0gKChjdXJfZmQgPT0gLTEpCisJPyAoRkRSICopIE5VTEwKKwk6IGRlYnVnX2luZm8tPmZkciArIGN1cl9mZCk7CisgIGN1cl9mZHIgPSBmaDsKKworICAvKiBTZWUgY29tbWVudCBpbiBwYXJzZV9wYXJ0aWFsX3N5bWJvbHMgYWJvdXQgdGhlIEBzdGFicyBzZW50aW5lbC4gKi8KKyAgcHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24gPSAwOworICBpZiAoZmggIT0gKEZEUiAqKSBOVUxMICYmIGZoLT5jc3ltID49IDIpCisgICAgeworICAgICAgU1lNUiBzaDsKKworICAgICAgKCpzd2FwX3N5bV9pbikgKGN1cl9iZmQsCisJCSAgICAgICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0KKwkJICAgICAgICsgKGZoLT5pc3ltQmFzZSArIDEpICogZXh0ZXJuYWxfc3ltX3NpemUpLAorCQkgICAgICAmc2gpOworICAgICAgaWYgKFNUUkVRIChkZWJ1Z19pbmZvLT5zcyArIGZoLT5pc3NCYXNlICsgc2guaXNzLAorCQkgc3RhYnNfc3ltYm9sKSkKKwl7CisJICAvKiBXZSBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYSBHQ0MgY29tcGlsYXRpb24gc28gdGhhdCBjZXJ0YWluCisJICAgICBmZWF0dXJlcyB3aWxsIGJlIGVuYWJsZWQgaW4gc3RhYnNyZWFkL2RieHJlYWQuICAqLworCSAgcHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24gPSAyOworCX0KKyAgICB9CisKKyAgaWYgKHByb2Nlc3NpbmdfZ2NjX2NvbXBpbGF0aW9uICE9IDApCisgICAgeworCisgICAgICAvKiBUaGlzIHN5bWJvbCB0YWJsZSBjb250YWlucyBzdGFicy1pbi1lY29mZiBlbnRyaWVzLiAgKi8KKworICAgICAgLyogUGFyc2UgbG9jYWwgc3ltYm9scyBmaXJzdCAqLworCisgICAgICBpZiAoZmgtPmNzeW0gPD0gMikJLyogRklYTUUsIHRoaXMgYmxvd3MgcHN5bXRhYi0+c3ltdGFiIHB0ciAqLworCXsKKwkgIGN1cnJlbnRfb2JqZmlsZSA9IE5VTEw7CisJICByZXR1cm47CisJfQorICAgICAgZm9yIChjdXJfc2R4ID0gMjsgY3VyX3NkeCA8IGZoLT5jc3ltOyBjdXJfc2R4KyspCisJeworCSAgU1lNUiBzaDsKKwkgIGNoYXIgKm5hbWU7CisJICBDT1JFX0FERFIgdmFsdTsKKworCSAgKCpzd2FwX3N5bV9pbikgKGN1cl9iZmQsCisJCQkgICgoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfc3ltKQorCQkJICAgKyAoZmgtPmlzeW1CYXNlICsgY3VyX3NkeCkgKiBleHRlcm5hbF9zeW1fc2l6ZSksCisJCQkgICZzaCk7CisJICBuYW1lID0gZGVidWdfaW5mby0+c3MgKyBmaC0+aXNzQmFzZSArIHNoLmlzczsKKwkgIHZhbHUgPSBzaC52YWx1ZTsKKwkgIC8qIFhYWCBUaGlzIGlzIGEgaGFjay4gIEl0IHdpbGwgZ28gYXdheSEgICovCisJICBpZiAoRUNPRkZfSVNfU1RBQiAoJnNoKSB8fCAobmFtZVswXSA9PSAnIycpKQorCSAgICB7CisJICAgICAgaW50IHR5cGVfY29kZSA9IEVDT0ZGX1VOTUFSS19TVEFCIChzaC5pbmRleCk7CisKKwkgICAgICAvKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IG5vbiBOX1NUQUIgc3ltYm9scyBoZXJlLCBidXQgdGhleQorCQkgc2hvdWxkIGJlIGhhcm1sZXNzLCBzbyBrZWVwIHByb2Nlc3Nfb25lX3N5bWJvbCBmcm9tCisJCSBjb21wbGFpbmluZyBhYm91dCB0aGVtLiAgKi8KKwkgICAgICBpZiAodHlwZV9jb2RlICYgTl9TVEFCKQorCQl7CisJCSAgcHJvY2Vzc19vbmVfc3ltYm9sICh0eXBlX2NvZGUsIDAsIHZhbHUsIG5hbWUsCisJCQkJICAgICAgcHN0LT5zZWN0aW9uX29mZnNldHMsIHBzdC0+b2JqZmlsZSk7CisJCX0KKwkgICAgICAvKiBTaW1pbGFybHkgYSBoYWNrLiAgKi8KKwkgICAgICBlbHNlIGlmIChuYW1lWzBdID09ICcjJykKKwkJeworCQkgIHByb2Nlc3Nfb25lX3N5bWJvbCAoTl9TTElORSwgMCwgdmFsdSwgbmFtZSwKKwkJCQkgICAgICBwc3QtPnNlY3Rpb25fb2Zmc2V0cywgcHN0LT5vYmpmaWxlKTsKKwkJfQorCSAgICAgIGlmICh0eXBlX2NvZGUgPT0gTl9GVU4pCisJCXsKKwkJICAvKiBNYWtlIHVwIHNwZWNpYWwgc3ltYm9sIHRvIGNvbnRhaW4KKwkJICAgICBwcm9jZWR1cmUgc3BlY2lmaWMgaW5mbyAqLworCQkgIHN0cnVjdCBtaXBzX2V4dHJhX2Z1bmNfaW5mbyAqZSA9CisJCSAgICAoKHN0cnVjdCBtaXBzX2V4dHJhX2Z1bmNfaW5mbyAqKQorCQkgICAgIG9ic3RhY2tfYWxsb2MgKCZjdXJyZW50X29iamZpbGUtPnN5bWJvbF9vYnN0YWNrLAorCQkJCSAgICBzaXplb2YgKHN0cnVjdCBtaXBzX2V4dHJhX2Z1bmNfaW5mbykpKTsKKwkJICBzdHJ1Y3Qgc3ltYm9sICpzID0gbmV3X3N5bWJvbCAoTUlQU19FRklfU1lNQk9MX05BTUUpOworCisJCSAgbWVtc2V0ICgoUFRSKSBlLCAwLCBzaXplb2YgKHN0cnVjdCBtaXBzX2V4dHJhX2Z1bmNfaW5mbykpOworCQkgIFNZTUJPTF9OQU1FU1BBQ0UgKHMpID0gTEFCRUxfTkFNRVNQQUNFOworCQkgIFNZTUJPTF9DTEFTUyAocykgPSBMT0NfQ09OU1Q7CisJCSAgU1lNQk9MX1RZUEUgKHMpID0gbWRlYnVnX3R5cGVfdm9pZDsKKwkJICBTWU1CT0xfVkFMVUUgKHMpID0gKGxvbmcpIGU7CisJCSAgZS0+cGRyLmZyYW1lcmVnID0gLTE7CisJCSAgYWRkX3N5bWJvbF90b19saXN0IChzLCAmbG9jYWxfc3ltYm9scyk7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoc2guc3QgPT0gc3RMYWJlbCkKKwkgICAgeworCSAgICAgIGlmIChzaC5pbmRleCA9PSBpbmRleE5pbCkKKwkJeworCQkgIC8qIFRoaXMgaXMgd2hhdCB0aGUgZ2NjMl9jb21waWxlZCBhbmQgX19nbnVfY29tcGlsZWRfKgorCQkgICAgIHNob3cgdXAgYXMuICBTbyBkb24ndCBjb21wbGFpbi4gICovCisJCSAgOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogSGFuZGxlIGVuY29kZWQgc3RhYiBsaW5lIG51bWJlci4gKi8KKwkJICB2YWx1ICs9IEFOT0ZGU0VUIChwc3QtPnNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCk7CisJCSAgcmVjb3JkX2xpbmUgKGN1cnJlbnRfc3ViZmlsZSwgc2guaW5kZXgsIHZhbHUpOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKHNoLnN0ID09IHN0UHJvYyB8fCBzaC5zdCA9PSBzdFN0YXRpY1Byb2MKKwkJICAgfHwgc2guc3QgPT0gc3RTdGF0aWMgfHwgc2guc3QgPT0gc3RFbmQpCisJICAgIC8qIFRoZXNlIGFyZSBnZW5lcmF0ZWQgYnkgZ2NjLTIueCwgZG8gbm90IGNvbXBsYWluICovCisJICAgIDsKKwkgIGVsc2UKKwkgICAgY29tcGxhaW4gKCZzdGFiX3Vua25vd25fY29tcGxhaW50LCBuYW1lKTsKKwl9CisgICAgICBzdCA9IGVuZF9zeW10YWIgKHBzdC0+dGV4dGhpZ2gsIHBzdC0+b2JqZmlsZSwgU0VDVF9PRkZfVEVYVCk7CisgICAgICBlbmRfc3RhYnMgKCk7CisKKyAgICAgIC8qIFNvcnQgdGhlIHN5bWJvbCB0YWJsZSBub3csIHdlIGFyZSBkb25lIGFkZGluZyBzeW1ib2xzIHRvIGl0LgorCSBXZSBtdXN0IGRvIHRoaXMgYmVmb3JlIHBhcnNlX3Byb2NlZHVyZSBjYWxscyBsb29rdXBfc3ltYm9sLiAgKi8KKyAgICAgIHNvcnRfc3ltdGFiX3N5bXMgKHN0KTsKKworICAgICAgLyogVGhlcmUgdXNlZCB0byBiZSBhIGNhbGwgdG8gc29ydF9ibG9ja3MgaGVyZSwgYnV0IHRoaXMgc2hvdWxkIG5vdAorCSBiZSBuZWNlc3NhcnkgZm9yIHN0YWJzIHN5bXRhYnMuICBBbmQgYXMgc29ydF9ibG9ja3MgbW9kaWZpZXMgdGhlCisJIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIEdMT0JBTF9CTE9DSyB0byB0aGUgRklSU1RfTE9DQUxfQkxPQ0ssCisJIGl0IGRpZCB0aGUgd3JvbmcgdGhpbmcgaWYgdGhlIGZpcnN0IHByb2NlZHVyZSBpbiBhIGZpbGUgd2FzCisJIGdlbmVyYXRlZCB2aWEgYXNtIHN0YXRlbWVudHMuICAqLworCisgICAgICAvKiBGaWxsIGluIHByb2NlZHVyZSBpbmZvIG5leHQuICAqLworICAgICAgaWYgKGZoLT5jcGQgPiAwKQorCXsKKwkgIFBEUiAqcHJfYmxvY2s7CisJICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworCSAgY2hhciAqcGRyX3B0cjsKKwkgIGNoYXIgKnBkcl9lbmQ7CisJICBQRFIgKnBkcl9pbjsKKwkgIFBEUiAqcGRyX2luX2VuZDsKKworCSAgcHJfYmxvY2sgPSAoUERSICopIHhtYWxsb2MgKGZoLT5jcGQgKiBzaXplb2YgKFBEUikpOworCSAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwIChmcmVlLCBwcl9ibG9jayk7CisKKwkgIHBkcl9wdHIgPSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfcGRyCisJCSAgICAgKyBmaC0+aXBkRmlyc3QgKiBleHRlcm5hbF9wZHJfc2l6ZSk7CisJICBwZHJfZW5kID0gcGRyX3B0ciArIGZoLT5jcGQgKiBleHRlcm5hbF9wZHJfc2l6ZTsKKwkgIHBkcl9pbiA9IHByX2Jsb2NrOworCSAgZm9yICg7CisJICAgICAgIHBkcl9wdHIgPCBwZHJfZW5kOworCSAgICAgICBwZHJfcHRyICs9IGV4dGVybmFsX3Bkcl9zaXplLCBwZHJfaW4rKykKKwkgICAgeworCSAgICAgICgqc3dhcF9wZHJfaW4pIChjdXJfYmZkLCBwZHJfcHRyLCBwZHJfaW4pOworCisJICAgICAgLyogRGV0ZXJtaW5lIGxvd2VzdCBQRFIgYWRkcmVzcywgdGhlIFBEUnMgYXJlIG5vdCBhbHdheXMKKwkJIHNvcnRlZC4gICovCisJICAgICAgaWYgKHBkcl9pbiA9PSBwcl9ibG9jaykKKwkJbG93ZXN0X3Bkcl9hZGRyID0gcGRyX2luLT5hZHI7CisJICAgICAgZWxzZSBpZiAocGRyX2luLT5hZHIgPCBsb3dlc3RfcGRyX2FkZHIpCisJCWxvd2VzdF9wZHJfYWRkciA9IHBkcl9pbi0+YWRyOworCSAgICB9CisKKwkgIHBkcl9pbiA9IHByX2Jsb2NrOworCSAgcGRyX2luX2VuZCA9IHBkcl9pbiArIGZoLT5jcGQ7CisJICBmb3IgKDsgcGRyX2luIDwgcGRyX2luX2VuZDsgcGRyX2luKyspCisJICAgIHBhcnNlX3Byb2NlZHVyZSAocGRyX2luLCBzdCwgcHN0KTsKKworCSAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFRoaXMgc3ltYm9sIHRhYmxlIGNvbnRhaW5zIG9yZGluYXJ5IGVjb2ZmIGVudHJpZXMuICAqLworCisgICAgICBpbnQgZl9tYXg7CisgICAgICBpbnQgbWF4bGluZXM7CisgICAgICBFWFRSICpleHRfcHRyOworCisgICAgICAvKiBIb3cgbWFueSBzeW1ib2xzIHdpbGwgd2UgbmVlZCAqLworICAgICAgLyogRklYTUUsIHRoaXMgZG9lcyBub3QgY291bnQgZW51bSB2YWx1ZXMuICovCisgICAgICBmX21heCA9IHBzdC0+bl9nbG9iYWxfc3ltcyArIHBzdC0+bl9zdGF0aWNfc3ltczsKKyAgICAgIGlmIChmaCA9PSAwKQorCXsKKwkgIG1heGxpbmVzID0gMDsKKwkgIHN0ID0gbmV3X3N5bXRhYiAoInVua25vd24iLCBmX21heCwgMCwgcHN0LT5vYmpmaWxlKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZl9tYXggKz0gZmgtPmNzeW0gKyBmaC0+Y3BkOworCSAgbWF4bGluZXMgPSAyICogZmgtPmNsaW5lOworCSAgc3QgPSBuZXdfc3ltdGFiIChwc3QtPmZpbGVuYW1lLCAyICogZl9tYXgsIG1heGxpbmVzLCBwc3QtPm9iamZpbGUpOworCisJICAvKiBUaGUgcHJvcGVyIGxhbmd1YWdlIHdhcyBhbHJlYWR5IGRldGVybWluZWQgd2hlbiBidWlsZGluZworCSAgICAgdGhlIHBzeW10YWIsIHVzZSBpdC4gICovCisJICBzdC0+bGFuZ3VhZ2UgPSBQU1RfUFJJVkFURSAocHN0KS0+cHN0X2xhbmd1YWdlOworCX0KKworICAgICAgcHN5bXRhYl9sYW5ndWFnZSA9IHN0LT5sYW5ndWFnZTsKKworICAgICAgbGluZXMgPSBMSU5FVEFCTEUgKHN0KTsKKworICAgICAgLyogR2V0IGEgbmV3IGxleGljYWwgY29udGV4dCAqLworCisgICAgICBwdXNoX3BhcnNlX3N0YWNrICgpOworICAgICAgdG9wX3N0YWNrLT5jdXJfc3QgPSBzdDsKKyAgICAgIHRvcF9zdGFjay0+Y3VyX2Jsb2NrID0gQkxPQ0tWRUNUT1JfQkxPQ0sgKEJMT0NLVkVDVE9SIChzdCksCisJCQkJCQlTVEFUSUNfQkxPQ0spOworICAgICAgQkxPQ0tfU1RBUlQgKHRvcF9zdGFjay0+Y3VyX2Jsb2NrKSA9IHBzdC0+dGV4dGxvdzsKKyAgICAgIEJMT0NLX0VORCAodG9wX3N0YWNrLT5jdXJfYmxvY2spID0gMDsKKyAgICAgIHRvcF9zdGFjay0+YmxvY2t0eXBlID0gc3RGaWxlOworICAgICAgdG9wX3N0YWNrLT5tYXhzeW1zID0gMiAqIGZfbWF4OworICAgICAgdG9wX3N0YWNrLT5jdXJfdHlwZSA9IDA7CisgICAgICB0b3Bfc3RhY2stPnByb2NhZHIgPSAwOworICAgICAgdG9wX3N0YWNrLT5udW1hcmdzID0gMDsKKyAgICAgIGZvdW5kX2Vjb2ZmX2RlYnVnZ2luZ19pbmZvID0gMDsKKworICAgICAgaWYgKGZoKQorCXsKKwkgIGNoYXIgKnN5bV9wdHI7CisJICBjaGFyICpzeW1fZW5kOworCisJICAvKiBQYXJzZSBsb2NhbCBzeW1ib2xzIGZpcnN0ICovCisJICBzeW1fcHRyID0gKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQorCQkgICAgICsgZmgtPmlzeW1CYXNlICogZXh0ZXJuYWxfc3ltX3NpemUpOworCSAgc3ltX2VuZCA9IHN5bV9wdHIgKyBmaC0+Y3N5bSAqIGV4dGVybmFsX3N5bV9zaXplOworCSAgd2hpbGUgKHN5bV9wdHIgPCBzeW1fZW5kKQorCSAgICB7CisJICAgICAgU1lNUiBzaDsKKwkgICAgICBpbnQgYzsKKworCSAgICAgICgqc3dhcF9zeW1faW4pIChjdXJfYmZkLCBzeW1fcHRyLCAmc2gpOworCSAgICAgIGMgPSBwYXJzZV9zeW1ib2wgKCZzaCwKKwkJCQlkZWJ1Z19pbmZvLT5leHRlcm5hbF9hdXggKyBmaC0+aWF1eEJhc2UsCisJCQkJc3ltX3B0ciwgZmgtPmZCaWdlbmRpYW4sIHBzdC0+c2VjdGlvbl9vZmZzZXRzKTsKKwkgICAgICBzeW1fcHRyICs9IGMgKiBleHRlcm5hbF9zeW1fc2l6ZTsKKwkgICAgfQorCisJICAvKiBMaW5lbnVtYmVycy4gIEF0IHRoZSBlbmQsIGNoZWNrIGlmIHdlIGNhbiBzYXZlIG1lbW9yeS4KKwkgICAgIHBhcnNlX2xpbmVzIGhhcyB0byBsb29rIGFoZWFkIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgUERSCisJICAgICBzdHJ1Y3R1cmVzLCBzbyB3ZSBzd2FwIHRoZW0gYWxsIGZpcnN0LiAgKi8KKwkgIGlmIChmaC0+Y3BkID4gMCkKKwkgICAgeworCSAgICAgIFBEUiAqcHJfYmxvY2s7CisJICAgICAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKwkgICAgICBjaGFyICpwZHJfcHRyOworCSAgICAgIGNoYXIgKnBkcl9lbmQ7CisJICAgICAgUERSICpwZHJfaW47CisJICAgICAgUERSICpwZHJfaW5fZW5kOworCisJICAgICAgcHJfYmxvY2sgPSAoUERSICopIHhtYWxsb2MgKGZoLT5jcGQgKiBzaXplb2YgKFBEUikpOworCisJICAgICAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwIChmcmVlLCBwcl9ibG9jayk7CisKKwkgICAgICBwZHJfcHRyID0gKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3BkcgorCQkJICsgZmgtPmlwZEZpcnN0ICogZXh0ZXJuYWxfcGRyX3NpemUpOworCSAgICAgIHBkcl9lbmQgPSBwZHJfcHRyICsgZmgtPmNwZCAqIGV4dGVybmFsX3Bkcl9zaXplOworCSAgICAgIHBkcl9pbiA9IHByX2Jsb2NrOworCSAgICAgIGZvciAoOworCQkgICBwZHJfcHRyIDwgcGRyX2VuZDsKKwkJICAgcGRyX3B0ciArPSBleHRlcm5hbF9wZHJfc2l6ZSwgcGRyX2luKyspCisJCXsKKwkJICAoKnN3YXBfcGRyX2luKSAoY3VyX2JmZCwgcGRyX3B0ciwgcGRyX2luKTsKKworCQkgIC8qIERldGVybWluZSBsb3dlc3QgUERSIGFkZHJlc3MsIHRoZSBQRFJzIGFyZSBub3QgYWx3YXlzCisJCSAgICAgc29ydGVkLiAgKi8KKwkJICBpZiAocGRyX2luID09IHByX2Jsb2NrKQorCQkgICAgbG93ZXN0X3Bkcl9hZGRyID0gcGRyX2luLT5hZHI7CisJCSAgZWxzZSBpZiAocGRyX2luLT5hZHIgPCBsb3dlc3RfcGRyX2FkZHIpCisJCSAgICBsb3dlc3RfcGRyX2FkZHIgPSBwZHJfaW4tPmFkcjsKKwkJfQorCisJICAgICAgcGFyc2VfbGluZXMgKGZoLCBwcl9ibG9jaywgbGluZXMsIG1heGxpbmVzLCBwc3QsIGxvd2VzdF9wZHJfYWRkcik7CisJICAgICAgaWYgKGxpbmVzLT5uaXRlbXMgPCBmaC0+Y2xpbmUpCisJCWxpbmVzID0gc2hyaW5rX2xpbmV0YWJsZSAobGluZXMpOworCisJICAgICAgLyogRmlsbCBpbiBwcm9jZWR1cmUgaW5mbyBuZXh0LiAgKi8KKwkgICAgICBwZHJfaW4gPSBwcl9ibG9jazsKKwkgICAgICBwZHJfaW5fZW5kID0gcGRyX2luICsgZmgtPmNwZDsKKwkgICAgICBmb3IgKDsgcGRyX2luIDwgcGRyX2luX2VuZDsgcGRyX2luKyspCisJCXBhcnNlX3Byb2NlZHVyZSAocGRyX2luLCAwLCBwc3QpOworCisJICAgICAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisJICAgIH0KKwl9CisKKyAgICAgIExJTkVUQUJMRSAoc3QpID0gbGluZXM7CisKKyAgICAgIC8qIC4uIGFuZCBvdXIgc2hhcmUgb2YgZXh0ZXJuYWxzLgorCSBYWFggdXNlIHRoZSBnbG9iYWwgbGlzdCB0byBzcGVlZCB1cCB0aGluZ3MgaGVyZS4gaG93PworCSBGSVhNRSwgTWF5YmUgcXVpdCBvbmNlIHdlIGhhdmUgZm91bmQgdGhlIHJpZ2h0IG51bWJlciBvZiBleHQncz8gKi8KKyAgICAgIHRvcF9zdGFjay0+Y3VyX3N0ID0gc3Q7CisgICAgICB0b3Bfc3RhY2stPmN1cl9ibG9jayA9IEJMT0NLVkVDVE9SX0JMT0NLIChCTE9DS1ZFQ1RPUiAodG9wX3N0YWNrLT5jdXJfc3QpLAorCQkJCQkJR0xPQkFMX0JMT0NLKTsKKyAgICAgIHRvcF9zdGFjay0+YmxvY2t0eXBlID0gc3RGaWxlOworICAgICAgdG9wX3N0YWNrLT5tYXhzeW1zCisJPSAoZGVidWdfaW5mby0+c3ltYm9saWNfaGVhZGVyLmlzeW1NYXgKKwkgICArIGRlYnVnX2luZm8tPnN5bWJvbGljX2hlYWRlci5pcGRNYXgKKwkgICArIGRlYnVnX2luZm8tPnN5bWJvbGljX2hlYWRlci5pZXh0TWF4KTsKKworICAgICAgZXh0X3B0ciA9IFBTVF9QUklWQVRFIChwc3QpLT5leHRlcm5fdGFiOworICAgICAgZm9yIChpID0gUFNUX1BSSVZBVEUgKHBzdCktPmV4dGVybl9jb3VudDsgLS1pID49IDA7IGV4dF9wdHIrKykKKwlwYXJzZV9leHRlcm5hbCAoZXh0X3B0ciwgZmgtPmZCaWdlbmRpYW4sIHBzdC0+c2VjdGlvbl9vZmZzZXRzKTsKKworICAgICAgLyogSWYgdGhlcmUgYXJlIHVuZGVmaW5lZCBzeW1ib2xzLCB0ZWxsIHRoZSB1c2VyLgorCSBUaGUgYWxwaGEgaGFzIGFuIHVuZGVmaW5lZCBzeW1ib2wgZm9yIGV2ZXJ5IHN5bWJvbCB0aGF0IGlzCisJIGZyb20gYSBzaGFyZWQgbGlicmFyeSwgc28gdGVsbCB0aGUgdXNlciBvbmx5IGlmIHZlcmJvc2UgaXMgb24uICAqLworICAgICAgaWYgKGluZm9fdmVyYm9zZSAmJiBuX3VuZGVmX3N5bWJvbHMpCisJeworCSAgcHJpbnRmX2ZpbHRlcmVkICgiRmlsZSAlcyBjb250YWlucyAlZCB1bnJlc29sdmVkIHJlZmVyZW5jZXM6IiwKKwkJCSAgIHN0LT5maWxlbmFtZSwgbl91bmRlZl9zeW1ib2xzKTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlxuXHQlNGQgdmFyaWFibGVzXG5cdCU0ZCBwcm9jZWR1cmVzXG5cdCU0ZCBsYWJlbHNcbiIsCisJCQkgICBuX3VuZGVmX3ZhcnMsIG5fdW5kZWZfcHJvY3MsIG5fdW5kZWZfbGFiZWxzKTsKKwkgIG5fdW5kZWZfc3ltYm9scyA9IG5fdW5kZWZfbGFiZWxzID0gbl91bmRlZl92YXJzID0gbl91bmRlZl9wcm9jcyA9IDA7CisKKwl9CisgICAgICBwb3BfcGFyc2Vfc3RhY2sgKCk7CisKKyAgICAgIHN0LT5wcmltYXJ5ID0gMTsKKworICAgICAgLyogU29ydCB0aGUgc3ltYm9sIHRhYmxlIG5vdywgd2UgYXJlIGRvbmUgYWRkaW5nIHN5bWJvbHMgdG8gaXQuKi8KKyAgICAgIHNvcnRfc3ltdGFiX3N5bXMgKHN0KTsKKworICAgICAgc29ydF9ibG9ja3MgKHN0KTsKKyAgICB9CisKKyAgLyogTm93IGxpbmsgdGhlIHBzeW10YWIgYW5kIHRoZSBzeW10YWIuICAqLworICBwc3QtPnN5bXRhYiA9IHN0OworCisgIGN1cnJlbnRfb2JqZmlsZSA9IE5VTEw7Cit9CisMCisvKiBBbmNpbGxhcnkgcGFyc2luZyBwcm9jZWR1cmVzLiAqLworCisvKiBSZXR1cm4gMSBpZiB0aGUgc3ltYm9sIHBvaW50ZWQgdG8gYnkgU0ggaGFzIGEgY3Jvc3MgcmVmZXJlbmNlCisgICB0byBhbiBvcGFxdWUgYWdncmVnYXRlIHR5cGUsIGVsc2UgMC4gICovCisKK3N0YXRpYyBpbnQKK2hhc19vcGFxdWVfeHJlZiAoZmgsIHNoKQorICAgICBGRFIgKmZoOworICAgICBTWU1SICpzaDsKK3sKKyAgVElSIHRpcjsKKyAgdW5pb24gYXV4X2V4dCAqYXg7CisgIFJORFhSIHJuWzFdOworICB1bnNpZ25lZCBpbnQgcmY7CisKKyAgaWYgKHNoLT5pbmRleCA9PSBpbmRleE5pbCkKKyAgICByZXR1cm4gMDsKKworICBheCA9IGRlYnVnX2luZm8tPmV4dGVybmFsX2F1eCArIGZoLT5pYXV4QmFzZSArIHNoLT5pbmRleDsKKyAgKCpkZWJ1Z19zd2FwLT5zd2FwX3Rpcl9pbikgKGZoLT5mQmlnZW5kaWFuLCAmYXgtPmFfdGksICZ0aXIpOworICBpZiAodGlyLmJ0ICE9IGJ0U3RydWN0ICYmIHRpci5idCAhPSBidFVuaW9uICYmIHRpci5idCAhPSBidEVudW0pCisgICAgcmV0dXJuIDA7CisKKyAgYXgrKzsKKyAgKCpkZWJ1Z19zd2FwLT5zd2FwX3JuZHhfaW4pIChmaC0+ZkJpZ2VuZGlhbiwgJmF4LT5hX3JuZHgsIHJuKTsKKyAgaWYgKHJuLT5yZmQgPT0gMHhmZmYpCisgICAgcmYgPSBBVVhfR0VUX0lTWU0gKGZoLT5mQmlnZW5kaWFuLCBheCArIDEpOworICBlbHNlCisgICAgcmYgPSBybi0+cmZkOworICBpZiAocmYgIT0gLTEpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCisvKiBMb29rdXAgdGhlIHR5cGUgYXQgcmVsYXRpdmUgaW5kZXggUk4uICBSZXR1cm4gaXQgaW4gVFBQCisgICBpZiBmb3VuZCBhbmQgaW4gYW55IGV2ZW50IGNvbWUgdXAgd2l0aCBpdHMgbmFtZSBQTkFNRS4KKyAgIEJJR0VORCBzYXlzIHdoZXRoZXIgYXV4IHN5bWJvbHMgYXJlIGJpZy1lbmRpYW4gb3Igbm90IChmcm9tIGZoLT5mQmlnZW5kaWFuKS4KKyAgIFJldHVybiB2YWx1ZSBzYXlzIGhvdyBtYW55IGF1eCBzeW1ib2xzIHdlIGF0ZS4gKi8KKworc3RhdGljIGludAorY3Jvc3NfcmVmIChmZCwgYXgsIHRwcCwgdHlwZV9jb2RlLCBwbmFtZSwgYmlnZW5kLCBzeW1fbmFtZSkKKyAgICAgaW50IGZkOworICAgICB1bmlvbiBhdXhfZXh0ICpheDsKKyAgICAgc3RydWN0IHR5cGUgKip0cHA7CisgICAgIGVudW0gdHlwZV9jb2RlIHR5cGVfY29kZTsJLyogVXNlIHRvIGFsbG9jIG5ldyB0eXBlIGlmIG5vbmUgaXMgZm91bmQuICovCisgICAgIGNoYXIgKipwbmFtZTsKKyAgICAgaW50IGJpZ2VuZDsKKyAgICAgY2hhciAqc3ltX25hbWU7Cit7CisgIFJORFhSIHJuWzFdOworICB1bnNpZ25lZCBpbnQgcmY7CisgIGludCByZXN1bHQgPSAxOworICBGRFIgKmZoOworICBjaGFyICplc2g7CisgIFNZTVIgc2g7CisgIGludCB4cmVmX2ZkOworICBzdHJ1Y3QgbWRlYnVnX3BlbmRpbmcgKnBlbmQ7CisKKyAgKnRwcCA9IChzdHJ1Y3QgdHlwZSAqKU5VTEw7CisKKyAgKCpkZWJ1Z19zd2FwLT5zd2FwX3JuZHhfaW4pIChiaWdlbmQsICZheC0+YV9ybmR4LCBybik7CisKKyAgLyogRXNjYXBlIGluZGV4IG1lYW5zICd0aGUgbmV4dCBvbmUnICovCisgIGlmIChybi0+cmZkID09IDB4ZmZmKQorICAgIHsKKyAgICAgIHJlc3VsdCsrOworICAgICAgcmYgPSBBVVhfR0VUX0lTWU0gKGJpZ2VuZCwgYXggKyAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZiA9IHJuLT5yZmQ7CisgICAgfQorCisgIC8qIG1pcHMgY2MgdXNlcyBhIHJmIG9mIC0xIGZvciBvcGFxdWUgc3RydWN0IGRlZmluaXRpb25zLgorICAgICBTZXQgVFlQRV9GTEFHX1NUVUIgZm9yIHRoZXNlIHR5cGVzIHNvIHRoYXQgY2hlY2tfdHlwZWRlZiB3aWxsCisgICAgIHJlc29sdmUgdGhlbSBpZiB0aGUgc3RydWN0IGdldHMgZGVmaW5lZCBpbiBhbm90aGVyIGNvbXBpbGF0aW9uIHVuaXQuICAqLworICBpZiAocmYgPT0gLTEpCisgICAgeworICAgICAgKnBuYW1lID0gIjx1bmRlZmluZWQ+IjsKKyAgICAgICp0cHAgPSBpbml0X3R5cGUgKHR5cGVfY29kZSwgMCwgMCwgKGNoYXIgKikgTlVMTCwgY3VycmVudF9vYmpmaWxlKTsKKyAgICAgIFRZUEVfRkxBR1MgKCp0cHApIHw9IFRZUEVfRkxBR19TVFVCOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgLyogbWlwcyBjYyB1c2VzIGFuIGVzY2FwZWQgcm4tPmluZGV4IG9mIDAgZm9yIHN0cnVjdCByZXR1cm4gdHlwZXMKKyAgICAgb2YgcHJvY2VkdXJlcyB0aGF0IHdlcmUgY29tcGlsZWQgd2l0aG91dCAtZy4gVGhlc2Ugd2lsbCBhbHdheXMgcmVtYWluCisgICAgIHVuZGVmaW5lZC4gICovCisgIGlmIChybi0+cmZkID09IDB4ZmZmICYmIHJuLT5pbmRleCA9PSAwKQorICAgIHsKKyAgICAgICpwbmFtZSA9ICI8dW5kZWZpbmVkPiI7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAvKiBGaW5kIHRoZSByZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3IgYW5kIHRoZSBzeW1ib2wgaW4gaXQuICAqLworICBmaCA9IGdldF9yZmQgKGZkLCByZik7CisgIHhyZWZfZmQgPSBmaCAtIGRlYnVnX2luZm8tPmZkcjsKKworICBpZiAocm4tPmluZGV4ID49IGZoLT5jc3ltKQorICAgIHsKKyAgICAgIC8qIEZpbGUgaW5kaXJlY3QgZW50cnkgaXMgY29ycnVwdC4gICovCisgICAgICAqcG5hbWUgPSAiPGlsbGVnYWw+IjsKKyAgICAgIGNvbXBsYWluICgmYmFkX3JmZF9lbnRyeV9jb21wbGFpbnQsCisJCXN5bV9uYW1lLCB4cmVmX2ZkLCBybi0+aW5kZXgpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgLyogSWYgd2UgaGF2ZSBwcm9jZXNzZWQgdGhpcyBzeW1ib2wgdGhlbiB3ZSBsZWZ0IGEgZm9yd2FyZGluZworICAgICBwb2ludGVyIHRvIHRoZSB0eXBlIGluIHRoZSBwZW5kaW5nIGxpc3QuICBJZiBub3QsIHdlYGxsIHB1dAorICAgICBpdCBpbiBhIGxpc3Qgb2YgcGVuZGluZyB0eXBlcywgdG8gYmUgcHJvY2Vzc2VkIGxhdGVyIHdoZW4KKyAgICAgdGhlIGZpbGUgd2lsbCBiZS4gIEluIGFueSBldmVudCwgd2UgY29sbGVjdCB0aGUgbmFtZSBmb3IgdGhlCisgICAgIHR5cGUgaGVyZS4gICovCisKKyAgZXNoID0gKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQorCSArICgoZmgtPmlzeW1CYXNlICsgcm4tPmluZGV4KQorCSAgICAqIGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKSk7CisgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChjdXJfYmZkLCBlc2gsICZzaCk7CisKKyAgLyogTWFrZSBzdXJlIHRoYXQgdGhpcyB0eXBlIG9mIGNyb3NzIHJlZmVyZW5jZSBjYW4gYmUgaGFuZGxlZC4gICovCisgIGlmICgoc2guc2MgIT0gc2NJbmZvCisgICAgICAgfHwgKHNoLnN0ICE9IHN0QmxvY2sgJiYgc2guc3QgIT0gc3RUeXBlZGVmICYmIHNoLnN0ICE9IHN0SW5kaXJlY3QKKwkgICAmJiBzaC5zdCAhPSBzdFN0cnVjdCAmJiBzaC5zdCAhPSBzdFVuaW9uCisJICAgJiYgc2guc3QgIT0gc3RFbnVtKSkKKyAgICAgICYmIChzaC5zdCAhPSBzdEJsb2NrIHx8ICFTQ19JU19DT01NT04oc2guc2MpKSkKKyAgICB7CisgICAgICAvKiBGaWxlIGluZGlyZWN0IGVudHJ5IGlzIGNvcnJ1cHQuICAqLworICAgICAgKnBuYW1lID0gIjxpbGxlZ2FsPiI7CisgICAgICBjb21wbGFpbiAoJmJhZF9yZmRfZW50cnlfY29tcGxhaW50LAorCQlzeW1fbmFtZSwgeHJlZl9mZCwgcm4tPmluZGV4KTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICpwbmFtZSA9IGRlYnVnX2luZm8tPnNzICsgZmgtPmlzc0Jhc2UgKyBzaC5pc3M7CisKKyAgcGVuZCA9IGlzX3BlbmRpbmdfc3ltYm9sIChmaCwgZXNoKTsKKyAgaWYgKHBlbmQpCisgICAgKnRwcCA9IHBlbmQtPnQ7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBoYXZlIG5vdCB5ZXQgc2VlbiB0aGlzIHR5cGUuICAqLworCisgICAgICBpZiAoKHNoLmlzcyA9PSAwICYmIHNoLnN0ID09IHN0VHlwZWRlZikgfHwgc2guc3QgPT0gc3RJbmRpcmVjdCkKKwl7CisJICBUSVIgdGlyOworCisJICAvKiBhbHBoYSBjYyBwdXRzIG91dCBhIHN0VHlwZWRlZiB3aXRoIGEgc2guaXNzIG9mIHplcm8gZm9yCisJICAgICB0d28gY2FzZXM6CisJICAgICBhKSBmb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBzdHJ1Y3RzL3VuaW9ucy9lbnVtcyB3aGljaCBhcmUgbm90CisJCWRlZmluZWQgaW4gdGhpcyBjb21waWxhdGlvbiB1bml0LgorCQlGb3IgdGhlc2UgdGhlIHR5cGUgd2lsbCBiZSB2b2lkLiBUaGlzIGlzIGEgYmFkIGRlc2lnbiBkZWNpc2lvbgorCQlhcyBjcm9zcyByZWZlcmVuY2luZyBhY3Jvc3MgY29tcGlsYXRpb24gdW5pdHMgaXMgaW1wb3NzaWJsZQorCQlkdWUgdG8gdGhlIG1pc3NpbmcgbmFtZS4KKwkgICAgIGIpIGZvcndhcmQgZGVjbGFyYXRpb25zIG9mIHN0cnVjdHMvdW5pb25zL2VudW1zL3R5cGVkZWZzIHdoaWNoCisJCWFyZSBkZWZpbmVkIGxhdGVyIGluIHRoaXMgZmlsZSBvciBpbiBhbm90aGVyIGZpbGUgaW4gdGhlIHNhbWUKKwkJY29tcGlsYXRpb24gdW5pdC4gSXJpeDUgY2MgdXNlcyBhIHN0SW5kaXJlY3Qgc3ltYm9sIGZvciB0aGlzLgorCQlTaW1wbHkgY3Jvc3MgcmVmZXJlbmNlIHRob3NlIGFnYWluIHRvIGdldCB0aGUgdHJ1ZSB0eXBlLgorCSAgICAgVGhlIGZvcndhcmQgcmVmZXJlbmNlcyBhcmUgbm90IGVudGVyZWQgaW4gdGhlIHBlbmRpbmcgbGlzdCBhbmQKKwkgICAgIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLworCisJICAoKmRlYnVnX3N3YXAtPnN3YXBfdGlyX2luKSAoYmlnZW5kLAorCQkJCSAgICAgICYoZGVidWdfaW5mby0+ZXh0ZXJuYWxfYXV4CisJCQkJCSsgZmgtPmlhdXhCYXNlICsgc2guaW5kZXgpLT5hX3RpLAorCQkJCSAgICAgICZ0aXIpOworCSAgaWYgKHRpci50cTAgIT0gdHFOaWwpCisJICAgIGNvbXBsYWluICgmaWxsZWdhbF9mb3J3YXJkX3RxMF9jb21wbGFpbnQsIHN5bV9uYW1lKTsKKwkgIHN3aXRjaCAodGlyLmJ0KQorCSAgICB7CisJICAgIGNhc2UgYnRWb2lkOgorCSAgICAgICp0cHAgPSBpbml0X3R5cGUgKHR5cGVfY29kZSwgMCwgMCwgKGNoYXIgKikgTlVMTCwKKwkJCQljdXJyZW50X29iamZpbGUpOworICAgIAkgICAgICAqcG5hbWUgPSAiPHVuZGVmaW5lZD4iOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgYnRTdHJ1Y3Q6CisJICAgIGNhc2UgYnRVbmlvbjoKKwkgICAgY2FzZSBidEVudW06CisJICAgICAgY3Jvc3NfcmVmICh4cmVmX2ZkLAorCQkJIChkZWJ1Z19pbmZvLT5leHRlcm5hbF9hdXgKKwkJCSAgKyBmaC0+aWF1eEJhc2UgKyBzaC5pbmRleCArIDEpLAorCQkJIHRwcCwgdHlwZV9jb2RlLCBwbmFtZSwKKwkJCSBmaC0+ZkJpZ2VuZGlhbiwgc3ltX25hbWUpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgYnRUeXBlZGVmOgorCSAgICAgIC8qIEZvbGxvdyBhIGZvcndhcmQgdHlwZWRlZi4gVGhpcyBtaWdodCByZWN1cnNpdmVseQorCQkgY2FsbCBjcm9zc19yZWYgdGlsbCB3ZSBnZXQgYSBub24gdHlwZWRlZidlZCB0eXBlLgorCQkgRklYTUU6IFRoaXMgaXMgbm90IGNvcnJlY3QgYmVoYXZpb3VyLCBidXQgZ2RiIGN1cnJlbnRseQorCQkgY2Fubm90IGhhbmRsZSB0eXBlZGVmcyB3aXRob3V0IHR5cGUgY29weWluZy4gVHlwZQorCQkgY29weWluZyBpcyBpbXBvc3NpYmxlIGFzIHdlIG1pZ2h0IGhhdmUgbXV0dWFsIGZvcndhcmQKKwkJIHJlZmVyZW5jZXMgYmV0d2VlbiB0d28gZmlsZXMgYW5kIHRoZSBjb3BpZWQgdHlwZSB3b3VsZCBub3QKKwkJIGdldCBmaWxsZWQgaW4gd2hlbiB3ZSBsYXRlciBwYXJzZSBpdHMgZGVmaW5pdGlvbi4gICovCisJICAgICAgKnRwcCA9IHBhcnNlX3R5cGUgKHhyZWZfZmQsCisJCQkJIGRlYnVnX2luZm8tPmV4dGVybmFsX2F1eCArIGZoLT5pYXV4QmFzZSwKKwkJCQkgc2guaW5kZXgsCisJCQkJIChpbnQgKilOVUxMLAorCQkJCSBmaC0+ZkJpZ2VuZGlhbiwKKwkJCQkgZGVidWdfaW5mby0+c3MgKyBmaC0+aXNzQmFzZSArIHNoLmlzcyk7CisJICAgICAgYWRkX3BlbmRpbmcgKGZoLCBlc2gsICp0cHApOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgY29tcGxhaW4gKCZpbGxlZ2FsX2ZvcndhcmRfYnRfY29tcGxhaW50LCB0aXIuYnQsIHN5bV9uYW1lKTsKKwkgICAgICAqdHBwID0gaW5pdF90eXBlICh0eXBlX2NvZGUsIDAsIDAsIChjaGFyICopIE5VTEwsCisJCQkJY3VycmVudF9vYmpmaWxlKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgcmV0dXJuIHJlc3VsdDsKKwl9CisgICAgICBlbHNlIGlmIChzaC5zdCA9PSBzdFR5cGVkZWYpCisJeworCSAgLyogUGFyc2UgdGhlIHR5cGUgZm9yIGEgbm9ybWFsIHR5cGVkZWYuIFRoaXMgbWlnaHQgcmVjdXJzaXZlbHkgY2FsbAorCSAgICAgY3Jvc3NfcmVmIHRpbGwgd2UgZ2V0IGEgbm9uIHR5cGVkZWYnZWQgdHlwZS4KKwkgICAgIEZJWE1FOiBUaGlzIGlzIG5vdCBjb3JyZWN0IGJlaGF2aW91ciwgYnV0IGdkYiBjdXJyZW50bHkKKwkgICAgIGNhbm5vdCBoYW5kbGUgdHlwZWRlZnMgd2l0aG91dCB0eXBlIGNvcHlpbmcuIEJ1dCB0eXBlIGNvcHlpbmcgaXMKKwkgICAgIGltcG9zc2libGUgYXMgd2UgbWlnaHQgaGF2ZSBtdXR1YWwgZm9yd2FyZCByZWZlcmVuY2VzIGJldHdlZW4KKwkgICAgIHR3byBmaWxlcyBhbmQgdGhlIGNvcGllZCB0eXBlIHdvdWxkIG5vdCBnZXQgZmlsbGVkIGluIHdoZW4KKwkgICAgIHdlIGxhdGVyIHBhcnNlIGl0cyBkZWZpbml0aW9uLiAgICovCisJICAqdHBwID0gcGFyc2VfdHlwZSAoeHJlZl9mZCwKKwkJCSAgICAgZGVidWdfaW5mby0+ZXh0ZXJuYWxfYXV4ICsgZmgtPmlhdXhCYXNlLAorCQkJICAgICBzaC5pbmRleCwKKwkJCSAgICAgKGludCAqKU5VTEwsCisJCQkgICAgIGZoLT5mQmlnZW5kaWFuLAorCQkJICAgICBkZWJ1Z19pbmZvLT5zcyArIGZoLT5pc3NCYXNlICsgc2guaXNzKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogQ3Jvc3MgcmVmZXJlbmNlIHRvIGEgc3RydWN0L3VuaW9uL2VudW0gd2hpY2ggaXMgZGVmaW5lZAorCSAgICAgaW4gYW5vdGhlciBmaWxlIGluIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQgYnV0IHRoYXQgZmlsZQorCSAgICAgaGFzIG5vdCBiZWVuIHBhcnNlZCB5ZXQuCisJICAgICBJbml0aWFsaXplIHRoZSB0eXBlIG9ubHksIGl0IHdpbGwgYmUgZmlsbGVkIGluIHdoZW4KKwkgICAgIGl0J3MgZGVmaW5pdGlvbiBpcyBwYXJzZWQuICAqLworCSAgKnRwcCA9IGluaXRfdHlwZSAodHlwZV9jb2RlLCAwLCAwLCAoY2hhciAqKSBOVUxMLCBjdXJyZW50X29iamZpbGUpOworCX0KKyAgICAgIGFkZF9wZW5kaW5nIChmaCwgZXNoLCAqdHBwKTsKKyAgICB9CisKKyAgLyogV2UgdXNlZCBvbmUgYXV4ZW50IG5vcm1hbGx5LCB0d28gaWYgd2UgZ290IGEgIm5leHQgb25lIiByZi4gKi8KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBRdWljayZkaXJ0eSBsb29rdXAgcHJvY2VkdXJlLCB0byBhdm9pZCB0aGUgTUkgb25lcyB0aGF0IHJlcXVpcmUKKyAgIGtlZXBpbmcgdGhlIHN5bXRhYiBzb3J0ZWQgKi8KKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKgorbXlsb29rdXBfc3ltYm9sIChuYW1lLCBibG9jaywgbmFtZXNwYWNlLCBjbGFzcykKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgcmVnaXN0ZXIgc3RydWN0IGJsb2NrICpibG9jazsKKyAgICAgbmFtZXNwYWNlX2VudW0gbmFtZXNwYWNlOworICAgICBlbnVtIGFkZHJlc3NfY2xhc3MgY2xhc3M7Cit7CisgIHJlZ2lzdGVyIGludCBib3QsIHRvcCwgaW5jOworICByZWdpc3RlciBzdHJ1Y3Qgc3ltYm9sICpzeW07CisKKyAgYm90ID0gMDsKKyAgdG9wID0gQkxPQ0tfTlNZTVMgKGJsb2NrKTsKKyAgaW5jID0gbmFtZVswXTsKKyAgd2hpbGUgKGJvdCA8IHRvcCkKKyAgICB7CisgICAgICBzeW0gPSBCTE9DS19TWU0gKGJsb2NrLCBib3QpOworICAgICAgaWYgKFNZTUJPTF9OQU1FIChzeW0pWzBdID09IGluYworCSAgJiYgU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9PSBuYW1lc3BhY2UKKwkgICYmIFNZTUJPTF9DTEFTUyAoc3ltKSA9PSBjbGFzcworCSAgJiYgc3RyY21wIChTWU1CT0xfTkFNRSAoc3ltKSwgbmFtZSkgPT0gMCkKKwlyZXR1cm4gc3ltOworICAgICAgYm90Kys7CisgICAgfQorICBibG9jayA9IEJMT0NLX1NVUEVSQkxPQ0sgKGJsb2NrKTsKKyAgaWYgKGJsb2NrKQorICAgIHJldHVybiBteWxvb2t1cF9zeW1ib2wgKG5hbWUsIGJsb2NrLCBuYW1lc3BhY2UsIGNsYXNzKTsKKyAgcmV0dXJuIDA7Cit9CisKKworLyogQWRkIGEgbmV3IHN5bWJvbCBTIHRvIGEgYmxvY2sgQi4KKyAgIEluZnJlcXVlbnRseSwgd2Ugd2lsbCBuZWVkIHRvIHJlYWxsb2NhdGUgdGhlIGJsb2NrIHRvIG1ha2UgaXQgYmlnZ2VyLgorICAgV2Ugb25seSBkZXRlY3QgdGhpcyBjYXNlIHdoZW4gYWRkaW5nIHRvIHRvcF9zdGFjay0+Y3VyX2Jsb2NrLCBzaW5jZQorICAgdGhhdCdzIHRoZSBvbmx5IHRpbWUgd2Uga25vdyBob3cgYmlnIHRoZSBibG9jayBpcy4gIEZJWE1FLiAgKi8KKworc3RhdGljIHZvaWQKK2FkZF9zeW1ib2wgKHMsIGIpCisgICAgIHN0cnVjdCBzeW1ib2wgKnM7CisgICAgIHN0cnVjdCBibG9jayAqYjsKK3sKKyAgaW50IG5zeW1zID0gQkxPQ0tfTlNZTVMgKGIpKys7CisgIHN0cnVjdCBibG9jayAqb3JpZ2I7CisgIHN0cnVjdCBwYXJzZV9zdGFjayAqc3RhY2twOworCisgIGlmIChiID09IHRvcF9zdGFjay0+Y3VyX2Jsb2NrICYmCisgICAgICBuc3ltcyA+PSB0b3Bfc3RhY2stPm1heHN5bXMpCisgICAgeworICAgICAgY29tcGxhaW4gKCZibG9ja19vdmVyZmxvd19jb21wbGFpbnQsIFNZTUJPTF9OQU1FIChzKSk7CisgICAgICAvKiBJbiB0aGlzIGNhc2Ugc2hyaW5rX2Jsb2NrIGlzIGFjdHVhbGx5IGdyb3dfYmxvY2ssIHNpbmNlCisJCSAgIEJMT0NLX05TWU1TKGIpIGlzIGxhcmdlciB0aGFuIGl0cyBjdXJyZW50IHNpemUuICAqLworICAgICAgb3JpZ2IgPSBiOworICAgICAgYiA9IHNocmlua19ibG9jayAodG9wX3N0YWNrLT5jdXJfYmxvY2ssIHRvcF9zdGFjay0+Y3VyX3N0KTsKKworICAgICAgLyogTm93IHJ1biB0aHJvdWdoIHRoZSBzdGFjayByZXBsYWNpbmcgcG9pbnRlcnMgdG8gdGhlCisJIG9yaWdpbmFsIGJsb2NrLiAgc2hyaW5rX2Jsb2NrIGhhcyBhbHJlYWR5IGRvbmUgdGhpcworCSBmb3IgdGhlIGJsb2NrdmVjdG9yIGFuZCBCTE9DS19GVU5DVElPTi4gICovCisgICAgICBmb3IgKHN0YWNrcCA9IHRvcF9zdGFjazsgc3RhY2twOyBzdGFja3AgPSBzdGFja3AtPm5leHQpCisJeworCSAgaWYgKHN0YWNrcC0+Y3VyX2Jsb2NrID09IG9yaWdiKQorCSAgICB7CisJICAgICAgc3RhY2twLT5jdXJfYmxvY2sgPSBiOworCSAgICAgIHN0YWNrcC0+bWF4c3ltcyA9IEJMT0NLX05TWU1TIChiKTsKKwkgICAgfQorCX0KKyAgICB9CisgIEJMT0NLX1NZTSAoYiwgbnN5bXMpID0gczsKK30KKworLyogQWRkIGEgbmV3IGJsb2NrIEIgdG8gYSBzeW10YWIgUyAqLworCitzdGF0aWMgdm9pZAorYWRkX2Jsb2NrIChiLCBzKQorICAgICBzdHJ1Y3QgYmxvY2sgKmI7CisgICAgIHN0cnVjdCBzeW10YWIgKnM7Cit7CisgIHN0cnVjdCBibG9ja3ZlY3RvciAqYnYgPSBCTE9DS1ZFQ1RPUiAocyk7CisKKyAgYnYgPSAoc3RydWN0IGJsb2NrdmVjdG9yICopIHhyZWFsbG9jICgoUFRSKSBidiwKKwkJCQkJKHNpemVvZiAoc3RydWN0IGJsb2NrdmVjdG9yKQorCQkJCQkgKyBCTE9DS1ZFQ1RPUl9OQkxPQ0tTIChidikKKwkJCQkJICogc2l6ZW9mIChidi0+YmxvY2spKSk7CisgIGlmIChidiAhPSBCTE9DS1ZFQ1RPUiAocykpCisgICAgQkxPQ0tWRUNUT1IgKHMpID0gYnY7CisKKyAgQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBCTE9DS1ZFQ1RPUl9OQkxPQ0tTIChidikrKykgPSBiOworfQorCisvKiBBZGQgYSBuZXcgbGluZW51bWJlciBlbnRyeSAoTElORU5PLEFEUikgdG8gYSBsaW5ldmVjdG9yIExULgorICAgTUlQUycgbGluZW51bWJlciBlbmNvZGluZyBtaWdodCBuZWVkIG1vcmUgdGhhbiBvbmUgYnl0ZQorICAgdG8gZGVzY3JpYmUgaXQsIExBU1QgaXMgdXNlZCB0byBkZXRlY3QgdGhlc2UgY29udGludWF0aW9uIGxpbmVzLgorCisgICBDb21iaW5pbmcgbGluZXMgd2l0aCB0aGUgc2FtZSBsaW5lIG51bWJlciBzZWVtcyBsaWtlIGEgYmFkIGlkZWEuCisgICBFLmc6IFRoZXJlIGNvdWxkIGJlIGEgbGluZSBudW1iZXIgZW50cnkgd2l0aCB0aGUgc2FtZSBsaW5lIG51bWJlciBhZnRlciB0aGUKKyAgIHByb2xvZ3VlIGFuZCBHREIgc2hvdWxkIG5vdCBpZ25vcmUgaXQgKHRoaXMgaXMgYSBiZXR0ZXIgd2F5IHRvIGZpbmQKKyAgIGEgcHJvbG9ndWUgdGhhbiBtaXBzX3NraXBfcHJvbG9ndWUpLgorICAgQnV0IGR1ZSB0byB0aGUgY29tcHJlc3NlZCBsaW5lIHRhYmxlIGZvcm1hdCB0aGVyZSBhcmUgbGluZSBudW1iZXIgZW50cmllcworICAgZm9yIHRoZSBzYW1lIGxpbmUgd2hpY2ggYXJlIG5lZWRlZCB0byBicmlkZ2UgdGhlIGdhcCB0byB0aGUgbmV4dAorICAgbGluZSBudW1iZXIgZW50cnkuIFRoZXNlIGVudHJpZXMgaGF2ZSBhIGJvZ3VzIGFkZHJlc3MgaW5mbyB3aXRoIHRoZW0KKyAgIGFuZCB3ZSBhcmUgdW5hYmxlIHRvIHRlbGwgdGhlbSBmcm9tIGludGVuZGVkIGR1cGxpY2F0ZSBsaW5lIG51bWJlcgorICAgZW50cmllcy4KKyAgIFRoaXMgaXMgYW5vdGhlciByZWFzb24gd2h5IC1nZ2RiIGRlYnVnZ2luZyBmb3JtYXQgaXMgcHJlZmVyYWJsZS4gICovCisKK3N0YXRpYyBpbnQKK2FkZF9saW5lIChsdCwgbGluZW5vLCBhZHIsIGxhc3QpCisgICAgIHN0cnVjdCBsaW5ldGFibGUgKmx0OworICAgICBpbnQgbGluZW5vOworICAgICBDT1JFX0FERFIgYWRyOworICAgICBpbnQgbGFzdDsKK3sKKyAgLyogREVDIGM4OSBzb21ldGltZXMgcHJvZHVjZXMgemVybyBsaW5lbm9zIHdoaWNoIGNvbmZ1c2UgZ2RiLgorICAgICBDaGFuZ2UgdGhlbSB0byBzb21ldGhpbmcgc2Vuc2libGUuICovCisgIGlmIChsaW5lbm8gPT0gMCkKKyAgICBsaW5lbm8gPSAxOworICBpZiAobGFzdCA9PSAwKQorICAgIGxhc3QgPSAtMjsJCQkvKiBtYWtlIHN1cmUgd2UgcmVjb3JkIGZpcnN0IGxpbmUgKi8KKworICBpZiAobGFzdCA9PSBsaW5lbm8pCQkvKiBza2lwIGNvbnRpbnVhdGlvbiBsaW5lcyAqLworICAgIHJldHVybiBsaW5lbm87CisKKyAgbHQtPml0ZW1bbHQtPm5pdGVtc10ubGluZSA9IGxpbmVubzsKKyAgbHQtPml0ZW1bbHQtPm5pdGVtcysrXS5wYyA9IGFkciA8PCAyOworICByZXR1cm4gbGluZW5vOworfQorDAorLyogU29ydGluZyBhbmQgcmVvcmRlcmluZyBwcm9jZWR1cmVzICovCisKKy8qIEJsb2NrcyB3aXRoIGEgc21hbGxlciBsb3cgYm91bmQgc2hvdWxkIGNvbWUgZmlyc3QgKi8KKworc3RhdGljIGludAorY29tcGFyZV9ibG9ja3MgKGFyZzEsIGFyZzIpCisgICAgIGNvbnN0IFBUUiBhcmcxOworICAgICBjb25zdCBQVFIgYXJnMjsKK3sKKyAgcmVnaXN0ZXIgaW50IGFkZHJfZGlmZjsKKyAgc3RydWN0IGJsb2NrICoqYjEgPSAoc3RydWN0IGJsb2NrICoqKSBhcmcxOworICBzdHJ1Y3QgYmxvY2sgKipiMiA9IChzdHJ1Y3QgYmxvY2sgKiopIGFyZzI7CisKKyAgYWRkcl9kaWZmID0gKEJMT0NLX1NUQVJUICgoKmIxKSkpIC0gKEJMT0NLX1NUQVJUICgoKmIyKSkpOworICBpZiAoYWRkcl9kaWZmID09IDApCisgICAgcmV0dXJuIChCTE9DS19FTkQgKCgqYjIpKSkgLSAoQkxPQ0tfRU5EICgoKmIxKSkpOworICByZXR1cm4gYWRkcl9kaWZmOworfQorCisvKiBTb3J0IHRoZSBibG9ja3Mgb2YgYSBzeW10YWIgUy4KKyAgIFJlb3JkZXIgdGhlIGJsb2NrcyBpbiB0aGUgYmxvY2t2ZWN0b3IgYnkgY29kZS1hZGRyZXNzLAorICAgYXMgcmVxdWlyZWQgYnkgc29tZSBNSSBzZWFyY2ggcm91dGluZXMgKi8KKworc3RhdGljIHZvaWQKK3NvcnRfYmxvY2tzIChzKQorICAgICBzdHJ1Y3Qgc3ltdGFiICpzOworeworICBzdHJ1Y3QgYmxvY2t2ZWN0b3IgKmJ2ID0gQkxPQ0tWRUNUT1IgKHMpOworCisgIGlmIChCTE9DS1ZFQ1RPUl9OQkxPQ0tTIChidikgPD0gMikKKyAgICB7CisgICAgICAvKiBDb3NtZXRpYyAqLworICAgICAgaWYgKEJMT0NLX0VORCAoQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBHTE9CQUxfQkxPQ0spKSA9PSAwKQorCUJMT0NLX1NUQVJUIChCTE9DS1ZFQ1RPUl9CTE9DSyAoYnYsIEdMT0JBTF9CTE9DSykpID0gMDsKKyAgICAgIGlmIChCTE9DS19FTkQgKEJMT0NLVkVDVE9SX0JMT0NLIChidiwgU1RBVElDX0JMT0NLKSkgPT0gMCkKKwlCTE9DS19TVEFSVCAoQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBTVEFUSUNfQkxPQ0spKSA9IDA7CisgICAgICByZXR1cm47CisgICAgfQorICAvKgorICAgKiBUaGlzIGlzIHZlcnkgdW5mb3J0dW5hdGU6IG5vcm1hbGx5IGFsbCBmdW5jdGlvbnMgYXJlIGNvbXBpbGVkIGluCisgICAqIHRoZSBvcmRlciB0aGV5IGFyZSBmb3VuZCwgYnV0IGlmIHRoZSBmaWxlIGlzIGNvbXBpbGVkIC1PMyB0aGluZ3MKKyAgICogYXJlIHZlcnkgZGlmZmVyZW50LiAgSXQgd291bGQgYmUgbmljZSB0byBmaW5kIGEgcmVsaWFibGUgdGVzdAorICAgKiB0byBkZXRlY3QgLU8zIGltYWdlcyBpbiBhZHZhbmNlLgorICAgKi8KKyAgaWYgKEJMT0NLVkVDVE9SX05CTE9DS1MgKGJ2KSA+IDMpCisgICAgcXNvcnQgKCZCTE9DS1ZFQ1RPUl9CTE9DSyAoYnYsIEZJUlNUX0xPQ0FMX0JMT0NLKSwKKwkgICBCTE9DS1ZFQ1RPUl9OQkxPQ0tTIChidikgLSBGSVJTVF9MT0NBTF9CTE9DSywKKwkgICBzaXplb2YgKHN0cnVjdCBibG9jayAqKSwKKwkgICBjb21wYXJlX2Jsb2Nrcyk7CisKKyAgeworICAgIHJlZ2lzdGVyIENPUkVfQUREUiBoaWdoID0gMDsKKyAgICByZWdpc3RlciBpbnQgaSwgaiA9IEJMT0NLVkVDVE9SX05CTE9DS1MgKGJ2KTsKKworICAgIGZvciAoaSA9IEZJUlNUX0xPQ0FMX0JMT0NLOyBpIDwgajsgaSsrKQorICAgICAgaWYgKGhpZ2ggPCBCTE9DS19FTkQgKEJMT0NLVkVDVE9SX0JMT0NLIChidiwgaSkpKQorCWhpZ2ggPSBCTE9DS19FTkQgKEJMT0NLVkVDVE9SX0JMT0NLIChidiwgaSkpOworICAgIEJMT0NLX0VORCAoQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBHTE9CQUxfQkxPQ0spKSA9IGhpZ2g7CisgIH0KKworICBCTE9DS19TVEFSVCAoQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBHTE9CQUxfQkxPQ0spKSA9CisgICAgQkxPQ0tfU1RBUlQgKEJMT0NLVkVDVE9SX0JMT0NLIChidiwgRklSU1RfTE9DQUxfQkxPQ0spKTsKKworICBCTE9DS19TVEFSVCAoQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBTVEFUSUNfQkxPQ0spKSA9CisgICAgQkxPQ0tfU1RBUlQgKEJMT0NLVkVDVE9SX0JMT0NLIChidiwgR0xPQkFMX0JMT0NLKSk7CisgIEJMT0NLX0VORCAoQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBTVEFUSUNfQkxPQ0spKSA9CisgICAgQkxPQ0tfRU5EIChCTE9DS1ZFQ1RPUl9CTE9DSyAoYnYsIEdMT0JBTF9CTE9DSykpOworfQorDAorCisvKiBDb25zdHJ1Y3Rvci9yZXN0cnVjdG9yL2Rlc3RydWN0b3IgcHJvY2VkdXJlcyAqLworCisvKiBBbGxvY2F0ZSBhIG5ldyBzeW10YWIgZm9yIE5BTUUuICBOZWVkcyBhbiBlc3RpbWF0ZSBvZiBob3cgbWFueSBzeW1ib2xzCisgICBNQVhTWU1TIGFuZCBsaW5lbnVtYmVycyBNQVhMSU5FUyB3ZSdsbCBwdXQgaW4gaXQgKi8KKworc3RhdGljIHN0cnVjdCBzeW10YWIgKgorbmV3X3N5bXRhYiAobmFtZSwgbWF4c3ltcywgbWF4bGluZXMsIG9iamZpbGUpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIGludCBtYXhzeW1zOworICAgICBpbnQgbWF4bGluZXM7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBzdHJ1Y3Qgc3ltdGFiICpzID0gYWxsb2NhdGVfc3ltdGFiIChuYW1lLCBvYmpmaWxlKTsKKworICBMSU5FVEFCTEUgKHMpID0gbmV3X2xpbmV0YWJsZSAobWF4bGluZXMpOworCisgIC8qIEFsbCBzeW10YWJzIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gYmxvY2tzICovCisgIEJMT0NLVkVDVE9SIChzKSA9IG5ld19idmVjdCAoMik7CisgIEJMT0NLVkVDVE9SX0JMT0NLIChCTE9DS1ZFQ1RPUiAocyksIEdMT0JBTF9CTE9DSykgPSBuZXdfYmxvY2sgKG1heHN5bXMpOworICBCTE9DS1ZFQ1RPUl9CTE9DSyAoQkxPQ0tWRUNUT1IgKHMpLCBTVEFUSUNfQkxPQ0spID0gbmV3X2Jsb2NrIChtYXhzeW1zKTsKKyAgQkxPQ0tfU1VQRVJCTE9DSyAoQkxPQ0tWRUNUT1JfQkxPQ0sgKEJMT0NLVkVDVE9SIChzKSwgU1RBVElDX0JMT0NLKSkgPQorICAgIEJMT0NLVkVDVE9SX0JMT0NLIChCTE9DS1ZFQ1RPUiAocyksIEdMT0JBTF9CTE9DSyk7CisKKyAgcy0+ZnJlZV9jb2RlID0gZnJlZV9saW5ldGFibGU7CisgIHMtPmRlYnVnZm9ybWF0ID0gb2JzYXZlc3RyaW5nICgiRUNPRkYiLCA1LAorCQkJCSAmb2JqZmlsZSAtPiBzeW1ib2xfb2JzdGFjayk7CisgIHJldHVybiAocyk7Cit9CisKKy8qIEFsbG9jYXRlIGEgbmV3IHBhcnRpYWxfc3ltdGFiIE5BTUUgKi8KKworc3RhdGljIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqCituZXdfcHN5bXRhYiAobmFtZSwgb2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzKQorICAgICBjaGFyICpuYW1lOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworeworICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzeW10YWI7CisKKyAgcHN5bXRhYiA9IGFsbG9jYXRlX3BzeW10YWIgKG5hbWUsIG9iamZpbGUpOworICBwc3ltdGFiLT5zZWN0aW9uX29mZnNldHMgPSBzZWN0aW9uX29mZnNldHM7CisKKyAgLyogS2VlcCBhIGJhY2twb2ludGVyIHRvIHRoZSBmaWxlJ3Mgc3ltYm9scyAqLworCisgIHBzeW10YWItPnJlYWRfc3ltdGFiX3ByaXZhdGUgPSAoKGNoYXIgKikKKwkJCQkgIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5wc3ltYm9sX29ic3RhY2ssCisJCQkJCQkgc2l6ZW9mIChzdHJ1Y3Qgc3ltbG9jKSkpOworICBtZW1zZXQgKChQVFIpIHBzeW10YWItPnJlYWRfc3ltdGFiX3ByaXZhdGUsIDAsIHNpemVvZiAoc3RydWN0IHN5bWxvYykpOworICBDVVJfQkZEIChwc3ltdGFiKSA9IGN1cl9iZmQ7CisgIERFQlVHX1NXQVAgKHBzeW10YWIpID0gZGVidWdfc3dhcDsKKyAgREVCVUdfSU5GTyAocHN5bXRhYikgPSBkZWJ1Z19pbmZvOworICBQRU5ESU5HX0xJU1QgKHBzeW10YWIpID0gcGVuZGluZ19saXN0OworCisgIC8qIFRoZSB3YXkgdG8gdHVybiB0aGlzIGludG8gYSBzeW10YWIgaXMgdG8gY2FsbC4uLiAqLworICBwc3ltdGFiLT5yZWFkX3N5bXRhYiA9IG1kZWJ1Z19wc3ltdGFiX3RvX3N5bXRhYjsKKyAgcmV0dXJuIChwc3ltdGFiKTsKK30KKworCisvKiBBbGxvY2F0ZSBhIGxpbmV0YWJsZSBhcnJheSBvZiB0aGUgZ2l2ZW4gU0laRS4gIFNpbmNlIHRoZSBzdHJ1Y3QKKyAgIGFscmVhZHkgaW5jbHVkZXMgb25lIGl0ZW0sIHdlIHN1YnRyYWN0IG9uZSB3aGVuIGNhbGN1bGF0aW5nIHRoZQorICAgcHJvcGVyIHNpemUgdG8gYWxsb2NhdGUuICAqLworCitzdGF0aWMgc3RydWN0IGxpbmV0YWJsZSAqCituZXdfbGluZXRhYmxlIChzaXplKQorICAgICBpbnQgc2l6ZTsKK3sKKyAgc3RydWN0IGxpbmV0YWJsZSAqbDsKKworICBzaXplID0gKHNpemUgLSAxKSAqIHNpemVvZiAobC0+aXRlbSkgKyBzaXplb2YgKHN0cnVjdCBsaW5ldGFibGUpOworICBsID0gKHN0cnVjdCBsaW5ldGFibGUgKikgeG1hbGxvYyAoc2l6ZSk7CisgIGwtPm5pdGVtcyA9IDA7CisgIHJldHVybiBsOworfQorCisvKiBPb3BzLCB0b28gYmlnLiBTaHJpbmsgaXQuICBUaGlzIHdhcyBpbXBvcnRhbnQgd2l0aCB0aGUgMi40IGxpbmV0YWJsZXMsCisgICBJIGFtIG5vdCBzbyBzdXJlIGFib3V0IHRoZSAzLjQgb25lcy4KKworICAgU2luY2UgdGhlIHN0cnVjdCBsaW5ldGFibGUgYWxyZWFkeSBpbmNsdWRlcyBvbmUgaXRlbSwgd2Ugc3VidHJhY3Qgb25lIHdoZW4KKyAgIGNhbGN1bGF0aW5nIHRoZSBwcm9wZXIgc2l6ZSB0byBhbGxvY2F0ZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgbGluZXRhYmxlICoKK3Nocmlua19saW5ldGFibGUgKGx0KQorICAgICBzdHJ1Y3QgbGluZXRhYmxlICpsdDsKK3sKKworICByZXR1cm4gKHN0cnVjdCBsaW5ldGFibGUgKikgeHJlYWxsb2MgKChQVFIpIGx0LAorCQkJCQkoc2l6ZW9mIChzdHJ1Y3QgbGluZXRhYmxlKQorCQkJCQkgKyAoKGx0LT5uaXRlbXMgLSAxKQorCQkJCQkgICAgKiBzaXplb2YgKGx0LT5pdGVtKSkpKTsKK30KKworLyogQWxsb2NhdGUgYW5kIHplcm8gYSBuZXcgYmxvY2t2ZWN0b3Igb2YgTkJMT0NLUyBibG9ja3MuICovCisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2t2ZWN0b3IgKgorbmV3X2J2ZWN0IChuYmxvY2tzKQorICAgICBpbnQgbmJsb2NrczsKK3sKKyAgc3RydWN0IGJsb2NrdmVjdG9yICpidjsKKyAgaW50IHNpemU7CisKKyAgc2l6ZSA9IHNpemVvZiAoc3RydWN0IGJsb2NrdmVjdG9yKSArIG5ibG9ja3MgKiBzaXplb2YgKHN0cnVjdCBibG9jayAqKTsKKyAgYnYgPSAoc3RydWN0IGJsb2NrdmVjdG9yICopIHh6YWxsb2MgKHNpemUpOworCisgIEJMT0NLVkVDVE9SX05CTE9DS1MgKGJ2KSA9IG5ibG9ja3M7CisKKyAgcmV0dXJuIGJ2OworfQorCisvKiBBbGxvY2F0ZSBhbmQgemVybyBhIG5ldyBibG9jayBvZiBNQVhTWU1TIHN5bWJvbHMgKi8KKworc3RhdGljIHN0cnVjdCBibG9jayAqCituZXdfYmxvY2sgKG1heHN5bXMpCisgICAgIGludCBtYXhzeW1zOworeworICBpbnQgc2l6ZSA9IHNpemVvZiAoc3RydWN0IGJsb2NrKSArIChtYXhzeW1zIC0gMSkgKiBzaXplb2YgKHN0cnVjdCBzeW1ib2wgKik7CisKKyAgcmV0dXJuIChzdHJ1Y3QgYmxvY2sgKikgeHphbGxvYyAoc2l6ZSk7Cit9CisKKy8qIE9vb3BzLCB0b28gYmlnLiBTaHJpbmsgYmxvY2sgQiBpbiBzeW10YWIgUyB0byBpdHMgbWluaW1hbCBzaXplLgorICAgU2hyaW5rX2Jsb2NrIGNhbiBhbHNvIGJlIHVzZWQgYnkgYWRkX3N5bWJvbCB0byBncm93IGEgYmxvY2suICAqLworCitzdGF0aWMgc3RydWN0IGJsb2NrICoKK3Nocmlua19ibG9jayAoYiwgcykKKyAgICAgc3RydWN0IGJsb2NrICpiOworICAgICBzdHJ1Y3Qgc3ltdGFiICpzOworeworICBzdHJ1Y3QgYmxvY2sgKm5ldzsKKyAgc3RydWN0IGJsb2NrdmVjdG9yICpidiA9IEJMT0NLVkVDVE9SIChzKTsKKyAgaW50IGk7CisKKyAgLyogSnVzdCByZWFsbG9jYXRlIGl0IGFuZCBmaXggcmVmZXJlbmNlcyB0byB0aGUgb2xkIG9uZSAqLworCisgIG5ldyA9IChzdHJ1Y3QgYmxvY2sgKikgeHJlYWxsb2MgKChQVFIpIGIsCisJCQkJICAgKHNpemVvZiAoc3RydWN0IGJsb2NrKQorCQkJCSAgICArICgoQkxPQ0tfTlNZTVMgKGIpIC0gMSkKKwkJCQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBzeW1ib2wgKikpKSk7CisKKyAgLyogU2hvdWxkIGNoYXNlIHBvaW50ZXJzIHRvIG9sZCBvbmUuICBGb3J0dW5hdGVseSwgdGhhdGBzIGp1c3QKKwkgICB0aGUgYmxvY2tgcyBmdW5jdGlvbiBhbmQgaW5mZXJpb3IgYmxvY2tzICovCisgIGlmIChCTE9DS19GVU5DVElPTiAobmV3KSAmJiBTWU1CT0xfQkxPQ0tfVkFMVUUgKEJMT0NLX0ZVTkNUSU9OIChuZXcpKSA9PSBiKQorICAgIFNZTUJPTF9CTE9DS19WQUxVRSAoQkxPQ0tfRlVOQ1RJT04gKG5ldykpID0gbmV3OworICBmb3IgKGkgPSAwOyBpIDwgQkxPQ0tWRUNUT1JfTkJMT0NLUyAoYnYpOyBpKyspCisgICAgaWYgKEJMT0NLVkVDVE9SX0JMT0NLIChidiwgaSkgPT0gYikKKyAgICAgIEJMT0NLVkVDVE9SX0JMT0NLIChidiwgaSkgPSBuZXc7CisgICAgZWxzZSBpZiAoQkxPQ0tfU1VQRVJCTE9DSyAoQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBpKSkgPT0gYikKKyAgICAgIEJMT0NLX1NVUEVSQkxPQ0sgKEJMT0NLVkVDVE9SX0JMT0NLIChidiwgaSkpID0gbmV3OworICByZXR1cm4gbmV3OworfQorCisvKiBDcmVhdGUgYSBuZXcgc3ltYm9sIHdpdGggcHJpbnRuYW1lIE5BTUUgKi8KKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKgorbmV3X3N5bWJvbCAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgc3RydWN0IHN5bWJvbCAqcyA9ICgoc3RydWN0IHN5bWJvbCAqKQorCQkgICAgICBvYnN0YWNrX2FsbG9jICgmY3VycmVudF9vYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywKKwkJCQkgICAgIHNpemVvZiAoc3RydWN0IHN5bWJvbCkpKTsKKworICBtZW1zZXQgKChQVFIpIHMsIDAsIHNpemVvZiAoKnMpKTsKKyAgU1lNQk9MX05BTUUgKHMpID0gb2JzYXZlc3RyaW5nIChuYW1lLCBzdHJsZW4gKG5hbWUpLAorCQkJCSAgJmN1cnJlbnRfb2JqZmlsZS0+c3ltYm9sX29ic3RhY2spOworICBTWU1CT0xfTEFOR1VBR0UgKHMpID0gcHN5bXRhYl9sYW5ndWFnZTsKKyAgU1lNQk9MX0lOSVRfREVNQU5HTEVEX05BTUUgKHMsICZjdXJyZW50X29iamZpbGUtPnN5bWJvbF9vYnN0YWNrKTsKKyAgcmV0dXJuIHM7Cit9CisKKy8qIENyZWF0ZSBhIG5ldyB0eXBlIHdpdGggcHJpbnRuYW1lIE5BTUUgKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK25ld190eXBlIChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICBzdHJ1Y3QgdHlwZSAqdDsKKworICB0ID0gYWxsb2NfdHlwZSAoY3VycmVudF9vYmpmaWxlKTsKKyAgVFlQRV9OQU1FICh0KSA9IG5hbWU7CisgIFRZUEVfQ1BMVVNfU1BFQ0lGSUMgKHQpID0gKHN0cnVjdCBjcGx1c19zdHJ1Y3RfdHlwZSAqKSAmY3BsdXNfc3RydWN0X2RlZmF1bHQ7CisgIHJldHVybiB0OworfQorDAorLyogUmVhZCBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBhIEJGRCBzZWN0aW9uLiAgVGhpcyBpcworICAgY2FsbGVkIGZyb20gZWxmcmVhZC5jLiAgSXQgcGFyc2VzIHRoZSBzZWN0aW9uIGludG8gYQorICAgZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3QsIGFuZCB0aGVuIGxldHMgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgaGFuZGxlCisgICBpdCBhcyBub3JtYWwuICAqLworCit2b2lkCitlbGZtZGVidWdfYnVpbGRfcHN5bXRhYnMgKG9iamZpbGUsIHN3YXAsIHNlYywgc2VjdGlvbl9vZmZzZXRzKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7CisgICAgIGFzZWN0aW9uICpzZWM7CisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKK3sKKyAgYmZkICphYmZkID0gb2JqZmlsZS0+b2JmZDsKKyAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmluZm87CisKKyAgaW5mbyA9ICgoc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKikKKwkgIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5wc3ltYm9sX29ic3RhY2ssCisJCQkgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbykpKTsKKworICBpZiAoISgqc3dhcC0+cmVhZF9kZWJ1Z19pbmZvKSAoYWJmZCwgc2VjLCBpbmZvKSkKKyAgICBlcnJvciAoIkVycm9yIHJlYWRpbmcgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uOiAlcyIsCisJICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCisgIG1kZWJ1Z19idWlsZF9wc3ltdGFicyAob2JqZmlsZSwgc3dhcCwgaW5mbywgc2VjdGlvbl9vZmZzZXRzKTsKK30KKwwKKworLyogVGhpbmdzIHVzZWQgZm9yIGNhbGxpbmcgZnVuY3Rpb25zIGluIHRoZSBpbmZlcmlvci4KKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgdG8gb3VyIGNvbXBhbmlvbgorICAgbWlwcy10ZGVwLmMgZmlsZSBhbmQgYXJlIGhlcmUgYmVjYXVzZSB0aGV5IHBsYXkKKyAgIHdpdGggdGhlIHN5bWJvbC10YWJsZSBleHBsaWNpdGx5LiAqLworCisvKiBTaWd0cmFtcDogbWFrZSBzdXJlIHdlIGhhdmUgYWxsIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24KKyAgIGFib3V0IHRoZSBzaWduYWwgdHJhbXBvbGluZSBjb2RlLiBTaW5jZSB0aGUgb2ZmaWNpYWwgY29kZQorICAgZnJvbSBNSVBTIGRvZXMgbm90IGRvIHNvLCB3ZSBtYWtlIHVwIHRoYXQgaW5mb3JtYXRpb24gb3Vyc2VsdmVzLgorICAgSWYgdGhleSBmaXggdGhlIGxpYnJhcnkgKHVubGlrZWx5KSB0aGlzIGNvZGUgd2lsbCBuZXV0cmFsaXplIGl0c2VsZi4gKi8KKworLyogRklYTUU6IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgYnkgbWlwcy10ZGVwLmMuICBJdCBuZWVkcyB0byBiZQorICAgaGVyZSBiZWNhdXNlIGl0IGNhbGxzIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMgZmlsZSwgYnV0IHBlcmhhcHMKKyAgIHRoaXMgY291bGQgYmUgaGFuZGxlZCBpbiBhIGJldHRlciB3YXkuICBPbmx5IGNvbXBpbGUgaXQgaW4gd2hlbgorICAgdG0tbWlwcy5oIGlzIGluY2x1ZGVkLiAqLworCisjaWZkZWYgVE1fTUlQU19ICisKK3ZvaWQKK2ZpeHVwX3NpZ3RyYW1wICgpCit7CisgIHN0cnVjdCBzeW1ib2wgKnM7CisgIHN0cnVjdCBzeW10YWIgKnN0OworICBzdHJ1Y3QgYmxvY2sgKmIsICpiMCA9IE5VTEw7CisKKyAgc2lndHJhbXBfYWRkcmVzcyA9IC0xOworCisgIC8qIFdlIGhhdmUgdG8gaGFuZGxlIHRoZSBmb2xsb3dpbmcgY2FzZXMgaGVyZToKKyAgICAgYSkgVGhlIE1pcHMgbGlicmFyeSBoYXMgYSBzaWd0cmFtcCBsYWJlbCB3aXRoaW4gc2lndmVjLgorICAgICBiKSBJcml4IGhhcyBhIF9zaWd0cmFtcCB3aGljaCB3ZSB3YW50IHRvIHVzZSwgYnV0IGl0IGFsc28gaGFzIHNpZ3ZlYy4gICovCisgIHMgPSBsb29rdXBfc3ltYm9sICgic2lndmVjIiwgMCwgVkFSX05BTUVTUEFDRSwgMCwgTlVMTCk7CisgIGlmIChzICE9IDApCisgICAgeworICAgICAgYjAgPSBTWU1CT0xfQkxPQ0tfVkFMVUUgKHMpOworICAgICAgcyA9IGxvb2t1cF9zeW1ib2wgKCJzaWd0cmFtcCIsIGIwLCBWQVJfTkFNRVNQQUNFLCAwLCBOVUxMKTsKKyAgICB9CisgIGlmIChzID09IDApCisgICAgeworICAgICAgLyogTm8gc2lndmVjIG9yIG5vIHNpZ3RyYW1wIGluc2lkZSBzaWd2ZWMsIHRyeSBfc2lndHJhbXAuICAqLworICAgICAgcyA9IGxvb2t1cF9zeW1ib2wgKCJfc2lndHJhbXAiLCAwLCBWQVJfTkFNRVNQQUNFLCAwLCBOVUxMKTsKKyAgICB9CisKKyAgLyogQnV0IG1heWJlIHRoaXMgcHJvZ3JhbSB1c2VzIGl0cyBvd24gdmVyc2lvbiBvZiBzaWd2ZWMgKi8KKyAgaWYgKHMgPT0gMCkKKyAgICByZXR1cm47CisKKyAgLyogRGlkIHdlIG9yIE1JUFNjbyBmaXggdGhlIGxpYnJhcnkgPyAqLworICBpZiAoU1lNQk9MX0NMQVNTIChzKSA9PSBMT0NfQkxPQ0spCisgICAgeworICAgICAgc2lndHJhbXBfYWRkcmVzcyA9IEJMT0NLX1NUQVJUIChTWU1CT0xfQkxPQ0tfVkFMVUUgKHMpKTsKKyAgICAgIHNpZ3RyYW1wX2VuZCA9IEJMT0NLX0VORCAoU1lNQk9MX0JMT0NLX1ZBTFVFIChzKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHNpZ3RyYW1wX2FkZHJlc3MgPSBTWU1CT0xfVkFMVUUgKHMpOworICBzaWd0cmFtcF9lbmQgPSBzaWd0cmFtcF9hZGRyZXNzICsgMHg4ODsJLyogYmxhY2sgbWFnaWMgKi8KKworICAvKiBCdXQgd2hhdCBzeW10YWIgZG9lcyBpdCBsaXZlIGluID8gKi8KKyAgc3QgPSBmaW5kX3BjX3N5bXRhYiAoU1lNQk9MX1ZBTFVFIChzKSk7CisKKyAgLyoKKyAgICogT2ssIHRoZXJlIGdvZXMgdGhlIGZpeDogdHVybiBpdCBpbnRvIGEgcHJvY2VkdXJlLCB3aXRoIGFsbCB0aGUKKyAgICogbmVlZGVkIGluZm8uICBOb3RlIHdlIG1ha2UgaXQgYSBuZXN0ZWQgcHJvY2VkdXJlIG9mIHNpZ3ZlYywKKyAgICogd2hpY2ggaXMgdGhlIHdheSB0aGUgKGFzc2VtYmx5KSBjb2RlIGlzIGFjdHVhbGx5IHdyaXR0ZW4uCisgICAqLworICBTWU1CT0xfTkFNRVNQQUNFIChzKSA9IFZBUl9OQU1FU1BBQ0U7CisgIFNZTUJPTF9DTEFTUyAocykgPSBMT0NfQkxPQ0s7CisgIFNZTUJPTF9UWVBFIChzKSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0ZVTkMsIDQsIDAsIChjaGFyICopIE5VTEwsCisJCQkgICAgICAgc3QtPm9iamZpbGUpOworICBUWVBFX1RBUkdFVF9UWVBFIChTWU1CT0xfVFlQRSAocykpID0gbWRlYnVnX3R5cGVfdm9pZDsKKworICAvKiBOZWVkIGEgYmxvY2sgdG8gYWxsb2NhdGUgTUlQU19FRklfU1lNQk9MX05BTUUgaW4gKi8KKyAgYiA9IG5ld19ibG9jayAoMSk7CisgIFNZTUJPTF9CTE9DS19WQUxVRSAocykgPSBiOworICBCTE9DS19TVEFSVCAoYikgPSBzaWd0cmFtcF9hZGRyZXNzOworICBCTE9DS19FTkQgKGIpID0gc2lndHJhbXBfZW5kOworICBCTE9DS19GVU5DVElPTiAoYikgPSBzOworICBCTE9DS19TVVBFUkJMT0NLIChiKSA9IEJMT0NLX1NVUEVSQkxPQ0sgKGIwKTsKKyAgYWRkX2Jsb2NrIChiLCBzdCk7CisgIHNvcnRfYmxvY2tzIChzdCk7CisKKyAgLyogTWFrZSBhIE1JUFNfRUZJX1NZTUJPTF9OQU1FIGVudHJ5IGZvciBpdCAqLworICB7CisgICAgc3RydWN0IG1pcHNfZXh0cmFfZnVuY19pbmZvICplID0KKyAgICAgICgoc3RydWN0IG1pcHNfZXh0cmFfZnVuY19pbmZvICopCisgICAgICAgeHphbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbWlwc19leHRyYV9mdW5jX2luZm8pKSk7CisKKyAgICBlLT5udW1hcmdzID0gMDsJCS8qIHRoZSBrZXJuZWwgdGhpbmtzIG90aGVyd2lzZSAqLworICAgIGUtPnBkci5mcmFtZW9mZnNldCA9IDMyOworICAgIGUtPnBkci5mcmFtZXJlZyA9IFNQX1JFR05VTTsKKyAgICAvKiBOb3RlIHRoYXQgc2V0dGluZyBwY3JlZyBpcyBubyBsb25nZXIgc3RyaWN0bHkgbmVjZXNzYXJ5IGFzCisgICAgICAgbWlwc19mcmFtZV9zYXZlZF9wYyBpcyBub3cgYXdhcmUgb2Ygc2lnbmFsIGhhbmRsZXIgZnJhbWVzLiAgKi8KKyAgICBlLT5wZHIucGNyZWcgPSBQQ19SRUdOVU07CisgICAgZS0+cGRyLnJlZ21hc2sgPSAtMjsKKyAgICAvKiBPZmZzZXQgdG8gc2F2ZWQgcjMxLCBpbiB0aGUgc2lndHJhbXAgY2FzZSB0aGUgc2F2ZWQgcmVnaXN0ZXJzCisgICAgICAgYXJlIGFib3ZlIHRoZSBmcmFtZSBpbiB0aGUgc2lnY29udGV4dC4KKyAgICAgICBXZSBoYXZlIDQgYWxpZ25tZW50IGJ5dGVzLCAxMiBieXRlcyBmb3Igb25zdGFjaywgbWFzayBhbmQgcGMsCisgICAgICAgMzIgKiA0IGJ5dGVzIGZvciB0aGUgZ2VuZXJhbCByZWdpc3RlcnMsIDEyIGJ5dGVzIGZvciBtZGhpLCBtZGxvLCBvd25lZGZwCisgICAgICAgYW5kIDMyICogNCBieXRlcyBmb3IgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycy4gICovCisgICAgZS0+cGRyLnJlZ29mZnNldCA9IDQgKyAxMiArIDMxICogNDsKKyAgICBlLT5wZHIuZnJlZ21hc2sgPSAtMTsKKyAgICAvKiBPZmZzZXQgdG8gc2F2ZWQgZjMwIChmaXJzdCBzYXZlZCAqZG91YmxlKiByZWdpc3RlcikuICAqLworICAgIGUtPnBkci5mcmVnb2Zmc2V0ID0gNCArIDEyICsgMzIgKiA0ICsgMTIgKyAzMCAqIDQ7CisgICAgZS0+cGRyLmlzeW0gPSAobG9uZykgczsKKyAgICBlLT5wZHIuYWRyID0gc2lndHJhbXBfYWRkcmVzczsKKworICAgIGN1cnJlbnRfb2JqZmlsZSA9IHN0LT5vYmpmaWxlOwkvKiBLZWVwIG5ld19zeW1ib2wgaGFwcHkgKi8KKyAgICBzID0gbmV3X3N5bWJvbCAoTUlQU19FRklfU1lNQk9MX05BTUUpOworICAgIFNZTUJPTF9WQUxVRSAocykgPSAobG9uZykgZTsKKyAgICBTWU1CT0xfTkFNRVNQQUNFIChzKSA9IExBQkVMX05BTUVTUEFDRTsKKyAgICBTWU1CT0xfQ0xBU1MgKHMpID0gTE9DX0NPTlNUOworICAgIFNZTUJPTF9UWVBFIChzKSA9IG1kZWJ1Z190eXBlX3ZvaWQ7CisgICAgY3VycmVudF9vYmpmaWxlID0gTlVMTDsKKyAgfQorCisgIEJMT0NLX1NZTSAoYiwgQkxPQ0tfTlNZTVMgKGIpKyspID0gczsKK30KKworI2VuZGlmCS8qIFRNX01JUFNfSCAqLworCit2b2lkCitfaW5pdGlhbGl6ZV9tZGVidWdyZWFkICgpCit7CisgIG1kZWJ1Z190eXBlX3ZvaWQgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX1ZPSUQsIDEsCisJICAgICAgIDAsCisJICAgICAgICJ2b2lkIiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICBtZGVidWdfdHlwZV9jaGFyID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDEsCisJICAgICAgIDAsCisJICAgICAgICJjaGFyIiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICBtZGVidWdfdHlwZV91bnNpZ25lZF9jaGFyID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDEsCisJICAgICAgIFRZUEVfRkxBR19VTlNJR05FRCwKKwkgICAgICAgInVuc2lnbmVkIGNoYXIiLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIG1kZWJ1Z190eXBlX3Nob3J0ID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDIsCisJICAgICAgIDAsCisJICAgICAgICJzaG9ydCIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgbWRlYnVnX3R5cGVfdW5zaWduZWRfc2hvcnQgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgMiwKKwkgICAgICAgVFlQRV9GTEFHX1VOU0lHTkVELAorCSAgICAgICAidW5zaWduZWQgc2hvcnQiLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIG1kZWJ1Z190eXBlX2ludF8zMiA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCA0LAorCSAgICAgICAwLAorCSAgICAgICAiaW50IiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICBtZGVidWdfdHlwZV91bnNpZ25lZF9pbnRfMzIgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgNCwKKwkgICAgICAgVFlQRV9GTEFHX1VOU0lHTkVELAorCSAgICAgICAidW5zaWduZWQgaW50IiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICBtZGVidWdfdHlwZV9pbnRfNjQgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgOCwKKwkgICAgICAgMCwKKwkgICAgICAgImludCIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgbWRlYnVnX3R5cGVfdW5zaWduZWRfaW50XzY0ID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDgsCisJICAgICAgIFRZUEVfRkxBR19VTlNJR05FRCwKKwkgICAgICAgInVuc2lnbmVkIGludCIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgbWRlYnVnX3R5cGVfbG9uZ18zMiA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCA0LAorCSAgICAgICAwLAorCSAgICAgICAibG9uZyIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgbWRlYnVnX3R5cGVfdW5zaWduZWRfbG9uZ18zMiA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCA0LAorCSAgICAgICBUWVBFX0ZMQUdfVU5TSUdORUQsCisJICAgICAgICJ1bnNpZ25lZCBsb25nIiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICBtZGVidWdfdHlwZV9sb25nXzY0ID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDgsCisJICAgICAgIDAsCisJICAgICAgICJsb25nIiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICBtZGVidWdfdHlwZV91bnNpZ25lZF9sb25nXzY0ID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDgsCisJICAgICAgIFRZUEVfRkxBR19VTlNJR05FRCwKKwkgICAgICAgInVuc2lnbmVkIGxvbmciLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIG1kZWJ1Z190eXBlX2xvbmdfbG9uZ182NCA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCA4LAorCSAgICAgICAwLAorCSAgICAgICAibG9uZyBsb25nIiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICBtZGVidWdfdHlwZV91bnNpZ25lZF9sb25nX2xvbmdfNjQgPSAKKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDgsCisJICAgICAgIFRZUEVfRkxBR19VTlNJR05FRCwKKwkgICAgICAgInVuc2lnbmVkIGxvbmcgbG9uZyIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgbWRlYnVnX3R5cGVfYWRyXzMyID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9QVFIsIDQsCisJICAgICAgIFRZUEVfRkxBR19VTlNJR05FRCwKKwkgICAgICAgImFkcl8zMiIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgVFlQRV9UQVJHRVRfVFlQRSAobWRlYnVnX3R5cGVfYWRyXzMyKSA9IG1kZWJ1Z190eXBlX3ZvaWQ7CisgIG1kZWJ1Z190eXBlX2Fkcl82NCA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfUFRSLCA4LAorCSAgICAgICBUWVBFX0ZMQUdfVU5TSUdORUQsCisJICAgICAgICJhZHJfNjQiLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIFRZUEVfVEFSR0VUX1RZUEUgKG1kZWJ1Z190eXBlX2Fkcl82NCkgPSBtZGVidWdfdHlwZV92b2lkOworICBtZGVidWdfdHlwZV9mbG9hdCA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfRkxULCBUQVJHRVRfRkxPQVRfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCSAgICAgICAwLAorCSAgICAgICAiZmxvYXQiLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIG1kZWJ1Z190eXBlX2RvdWJsZSA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfRkxULCBUQVJHRVRfRE9VQkxFX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgMCwKKwkgICAgICAgImRvdWJsZSIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKKyAgbWRlYnVnX3R5cGVfY29tcGxleCA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfQ09NUExFWCwgMiAqIFRBUkdFVF9GTE9BVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJICAgICAgIDAsCisJICAgICAgICJjb21wbGV4IiwgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworICBUWVBFX1RBUkdFVF9UWVBFIChtZGVidWdfdHlwZV9jb21wbGV4KSA9IG1kZWJ1Z190eXBlX2Zsb2F0OworICBtZGVidWdfdHlwZV9kb3VibGVfY29tcGxleCA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfQ09NUExFWCwgMiAqIFRBUkdFVF9ET1VCTEVfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCSAgICAgICAwLAorCSAgICAgICAiZG91YmxlIGNvbXBsZXgiLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisgIFRZUEVfVEFSR0VUX1RZUEUgKG1kZWJ1Z190eXBlX2RvdWJsZV9jb21wbGV4KSA9IG1kZWJ1Z190eXBlX2RvdWJsZTsKKworICAvKiBJcyBhICJzdHJpbmciIHRoZSB3YXkgYnRTdHJpbmcgbWVhbnMgaXQgdGhlIHNhbWUgYXMgVFlQRV9DT0RFX1NUUklORz8KKyAgICAgRklYTUUuICAqLworICBtZGVidWdfdHlwZV9zdHJpbmcgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX1NUUklORywKKwkgICAgICAgVEFSR0VUX0NIQVJfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCSAgICAgICAwLCAic3RyaW5nIiwKKwkgICAgICAgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworCisgIC8qIFdlIHVzZSBUWVBFX0NPREVfSU5UIHRvIHByaW50IHRoZXNlIGFzIGludGVnZXJzLiAgRG9lcyB0aGlzIGRvIGFueQorICAgICBnb29kPyAgV291bGQgd2UgYmUgYmV0dGVyIG9mZiB3aXRoIFRZUEVfQ09ERV9FUlJPUj8gIFNob3VsZAorICAgICBUWVBFX0NPREVfRVJST1IgcHJpbnQgdGhpbmdzIGluIGhleCBpZiBpdCBrbm93cyB0aGUgc2l6ZT8gICovCisgIG1kZWJ1Z190eXBlX2ZpeGVkX2RlYyA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCSAgICAgICBUQVJHRVRfSU5UX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkgICAgICAgMCwgImZpeGVkIGRlY2ltYWwiLAorCSAgICAgICAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7CisKKyAgbWRlYnVnX3R5cGVfZmxvYXRfZGVjID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9FUlJPUiwKKwkgICAgICAgVEFSR0VUX0RPVUJMRV9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJICAgICAgIDAsICJmbG9hdGluZyBkZWNpbWFsIiwKKwkgICAgICAgKHN0cnVjdCBvYmpmaWxlICopIE5VTEwpOworCisgIG5vZGVidWdfZnVuY19zeW1ib2xfdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0ZVTkMsIDEsIDAsCisJCQkJCSI8ZnVuY3Rpb24sIG5vIGRlYnVnIGluZm8+IiwgTlVMTCk7CisgIFRZUEVfVEFSR0VUX1RZUEUgKG5vZGVidWdfZnVuY19zeW1ib2xfdHlwZSkgPSBtZGVidWdfdHlwZV9pbnQ7CisgIG5vZGVidWdfdmFyX3N5bWJvbF90eXBlID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIFRBUkdFVF9JTlRfQklUIC8gSE9TVF9DSEFSX0JJVCwgMCwKKwkgICAgICAgIjx2YXJpYWJsZSwgbm8gZGVidWcgaW5mbz4iLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9tZW0tYnJlYWsuYyBiL2dkYi9tZW0tYnJlYWsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGExYjRmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL21lbS1icmVhay5jCkBAIC0wLDAgKzEsMTI0IEBACisvKiBTaW11bGF0ZSBicmVha3BvaW50cyBieSBwYXRjaGluZyBsb2NhdGlvbnMgaW4gdGhlIHRhcmdldCBzeXN0ZW0sIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LiAgV3JpdHRlbiBieSBKb2huIEdpbG1vcmUuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKworLyogVGhpcyBmaWxlIGlzIG9ubHkgdXNlZnVsIGlmIEJSRUFLUE9JTlQgaXMgc2V0LiAgSWYgbm90LCB3ZSBwdW50LiAgKi8KKworI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImJyZWFrcG9pbnQuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorCisKKy8qIFVzZSB0aGUgcHJvZ3JhbSBjb3VudGVyIHRvIGRldGVybWluZSB0aGUgY29udGVudHMgYW5kIHNpemUKKyAgIG9mIGEgYnJlYWtwb2ludCBpbnN0cnVjdGlvbi4gIElmIG5vIHRhcmdldC1kZXBlbmRlbnQgbWFjcm8KKyAgIEJSRUFLUE9JTlRfRlJPTV9QQyBoYXMgYmVlbiBkZWZpbmVkIHRvIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLAorICAgYXNzdW1lIHRoYXQgdGhlIGJyZWFrcG9pbnQgZG9lc24ndCBkZXBlbmQgb24gdGhlIFBDLCBhbmQKKyAgIHVzZSB0aGUgdmFsdWVzIG9mIHRoZSBCSUdfQlJFQUtQT0lOVCBhbmQgTElUVExFX0JSRUFLUE9JTlQgbWFjcm9zLgorICAgUmV0dXJuIGEgcG9pbnRlciB0byBhIHN0cmluZyBvZiBieXRlcyB0aGF0IGVuY29kZSBhIGJyZWFrcG9pbnQKKyAgIGluc3RydWN0aW9uLCBzdG9yZXMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRvICpsZW5wdHIsCisgICBhbmQgb3B0aW9uYWxseSBhZGp1c3QgdGhlIHBjIHRvIHBvaW50IHRvIHRoZSBjb3JyZWN0IG1lbW9yeSBsb2NhdGlvbgorICAgZm9yIGluc2VydGluZyB0aGUgYnJlYWtwb2ludC4gICovCisKK3Vuc2lnbmVkIGNoYXIgKgorbWVtb3J5X2JyZWFrcG9pbnRfZnJvbV9wYyAocGNwdHIsIGxlbnB0cikKKyAgICAgQ09SRV9BRERSICpwY3B0cjsKKyAgICAgaW50ICpsZW5wdHI7Cit7CisgIC8qIHtCSUdfLExJVFRMRV99QlJFQUtQT0lOVCBpcyB0aGUgc2VxdWVuY2Ugb2YgYnl0ZXMgd2UgaW5zZXJ0IGZvciBhCisgICAgIGJyZWFrcG9pbnQuICBPbiBzb21lIG1hY2hpbmVzLCBicmVha3BvaW50cyBhcmUgaGFuZGxlZCBieSB0aGUKKyAgICAgdGFyZ2V0IGVudmlyb25tZW50IGFuZCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZW0gaGVyZS4gICovCisjaWZkZWYgQklHX0JSRUFLUE9JTlQKKyAgaWYgKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pCisgICAgeworICAgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgYmlnX2JyZWFrX2luc25bXSA9IEJJR19CUkVBS1BPSU5UOworICAgICAgKmxlbnB0ciA9IHNpemVvZiAoYmlnX2JyZWFrX2luc24pOworICAgICAgcmV0dXJuIGJpZ19icmVha19pbnNuOworICAgIH0KKyNlbmRpZgorI2lmZGVmIExJVFRMRV9CUkVBS1BPSU5UCisgIGlmIChUQVJHRVRfQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOKQorICAgIHsKKyAgICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGxpdHRsZV9icmVha19pbnNuW10gPSBMSVRUTEVfQlJFQUtQT0lOVDsKKyAgICAgICpsZW5wdHIgPSBzaXplb2YgKGxpdHRsZV9icmVha19pbnNuKTsKKyAgICAgIHJldHVybiBsaXR0bGVfYnJlYWtfaW5zbjsKKyAgICB9CisjZW5kaWYKKyNpZmRlZiBCUkVBS1BPSU5UCisgIHsKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBicmVha19pbnNuW10gPSBCUkVBS1BPSU5UOworICAgICpsZW5wdHIgPSBzaXplb2YgKGJyZWFrX2luc24pOworICAgIHJldHVybiBicmVha19pbnNuOworICB9CisjZW5kaWYKKyAgKmxlbnB0ciA9IDA7CisgIHJldHVybiBOVUxMOworfQorCisKKy8qIEluc2VydCBhIGJyZWFrcG9pbnQgb24gdGFyZ2V0cyB0aGF0IGRvbid0IGhhdmUgYW55IGJldHRlciBicmVha3BvaW50CisgICBzdXBwb3J0LiAgV2UgcmVhZCB0aGUgY29udGVudHMgb2YgdGhlIHRhcmdldCBsb2NhdGlvbiBhbmQgc3Rhc2ggaXQsCisgICB0aGVuIG92ZXJ3cml0ZSBpdCB3aXRoIGEgYnJlYWtwb2ludCBpbnN0cnVjdGlvbi4gIEFERFIgaXMgdGhlIHRhcmdldAorICAgbG9jYXRpb24gaW4gdGhlIHRhcmdldCBtYWNoaW5lLiAgQ09OVEVOVFNfQ0FDSEUgaXMgYSBwb2ludGVyIHRvIAorICAgbWVtb3J5IGFsbG9jYXRlZCBmb3Igc2F2aW5nIHRoZSB0YXJnZXQgY29udGVudHMuICBJdCBpcyBndWFyYW50ZWVkCisgICBieSB0aGUgY2FsbGVyIHRvIGJlIGxvbmcgZW5vdWdoIHRvIHNhdmUgQlJFQUtQT0lOVF9MRU4gYnl0ZXMgKHRoaXMKKyAgIGlzIGFjY29tcGxpc2hlZCB2aWEgQlJFQUtQT0lOVF9NQVgpLiAgKi8KKworaW50CittZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqY29udGVudHNfY2FjaGU7Cit7CisgIGludCB2YWw7CisgIHVuc2lnbmVkIGNoYXIgKmJwOworICBpbnQgYnBsZW47CisKKyAgLyogRGV0ZXJtaW5lIGFwcHJvcHJpYXRlIGJyZWFrcG9pbnQgY29udGVudHMgYW5kIHNpemUgZm9yIHRoaXMgYWRkcmVzcy4gICovCisgIGJwID0gQlJFQUtQT0lOVF9GUk9NX1BDICgmYWRkciwgJmJwbGVuKTsKKyAgaWYgKGJwID09IE5VTEwpCisgICAgZXJyb3IgKCJTb2Z0d2FyZSBicmVha3BvaW50cyBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgdGFyZ2V0LiIpOworCisgIC8qIFNhdmUgdGhlIG1lbW9yeSBjb250ZW50cy4gICovCisgIHZhbCA9IHRhcmdldF9yZWFkX21lbW9yeSAoYWRkciwgY29udGVudHNfY2FjaGUsIGJwbGVuKTsKKworICAvKiBXcml0ZSB0aGUgYnJlYWtwb2ludC4gICovCisgIGlmICh2YWwgPT0gMCkKKyAgICB2YWwgPSB0YXJnZXRfd3JpdGVfbWVtb3J5IChhZGRyLCAoY2hhciAqKWJwLCBicGxlbik7CisKKyAgcmV0dXJuIHZhbDsKK30KKworCitpbnQKK21lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCAoYWRkciwgY29udGVudHNfY2FjaGUpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpjb250ZW50c19jYWNoZTsKK3sKKyAgdW5zaWduZWQgY2hhciAqYnA7CisgIGludCBicGxlbjsKKworICAvKiBEZXRlcm1pbmUgYXBwcm9wcmlhdGUgYnJlYWtwb2ludCBjb250ZW50cyBhbmQgc2l6ZSBmb3IgdGhpcyBhZGRyZXNzLiAgKi8KKyAgYnAgPSBCUkVBS1BPSU5UX0ZST01fUEMgKCZhZGRyLCAmYnBsZW4pOworICBpZiAoYnAgPT0gTlVMTCkKKyAgICBlcnJvciAoIlNvZnR3YXJlIGJyZWFrcG9pbnRzIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyB0YXJnZXQuIik7CisKKyAgcmV0dXJuIHRhcmdldF93cml0ZV9tZW1vcnkgKGFkZHIsIGNvbnRlbnRzX2NhY2hlLCBicGxlbik7Cit9CmRpZmYgLS1naXQgYS9nZGIvbWluaW1vbi5oIGIvZ2RiL21pbmltb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjBjNDE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL21pbmltb24uaApAQCAtMCwwICsxLDU2MiBAQAorLyogRGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3Igc3VwcG9ydCBvZiBBTUQncyByZW1vdGUgZGVidWdnZXIsIE1pbmlNT04uCisgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKyAqIFNvbWUgYmFzaWMgdHlwZXMuICBGSVhNRSwgdGhpcyBzaG91bGQgYmUgZG9uZSBieSBkZWNsYXJpbmcgYml0ZmllbGQKKyAqIHNpemVzIGluIHRoZSBzdHJ1Y3RzLiAgV2UgY2FuJ3QgcG9ydGFibHkgZGVwZW5kIG9uIGEgImxvbmcgaW50IiBiZWluZworICogMzIgYml0cywgZXRjLgorICovCit0eXBlZGVmIGxvbmcgaW50IElOVDMyOyAgICAgICAgICAgIC8qIDMyIGJpdCBpbnRlZ2VyICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IFVJTlQzMjsgIC8qIDMyIGJpdCBpbnRlZ2VyICh1bnNpZ25lZCkgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgQUREUjMyOyAgLyogMzIgYml0IGFkZHJlc3MgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgSU5TVDMyOyAgLyogMzIgYml0IGluc3RydWN0aW9uICovCit0eXBlZGVmIGxvbmcgaW50IEJPT0xFQU47ICAgICAgICAgIC8qIEJvb2xlYW4gdmFsdWUgKDMyIGJpdCkgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBCWVRFOyAgICAgICAgLyogYnl0ZSAoOCBiaXQpICovCit0eXBlZGVmIHNob3J0IGludCBJTlQxNjsgICAgICAgICAgIC8qIDE2IGJpdCBpbnRlZ2VyICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBVSU5UMTY7IC8qIDE2IGJpdCBpbnRlZ2VyICh1bnNpZ25lZCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBNZXNzYWdlIEluZm9ybWF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRXJyb3IgY29kZXMgCisgKi8KKworLyogR2VuZXJhbCBlcnJvcnMgKi8KKyNkZWZpbmUgRU1VU0FHRSAgICAgMSAgLyogQmFkIGFyZ3MgLyBmbGFncyAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNRkFJTCAgICAgIDIgIC8qIFVucmVjb3ZlcmFibGUgZXJyb3IgICAgICAgICAgICAqLworI2RlZmluZSBFTUJBREFERFIgICAzICAvKiBJbGxlZ2FsIGFkZHJlc3MgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1CQURSRUcgICAgNCAgLyogSWxsZWdhbCByZWdpc3RlciAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNU1lOVEFYICAgIDUgIC8qIElsbGVnYWwgY29tbWFuZCBzeW50YXggICAgICAgICAqLworI2RlZmluZSBFTUFDQ0VTUyAgICA2ICAvKiBDb3VsZCBub3QgYWNjZXNzIG1lbW9yeSAgICAgICAgKi8KKyNkZWZpbmUgRU1BTExPQyAgICAgNyAgLyogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSAgICAgICovCisjZGVmaW5lIEVNVEFSR0VUICAgIDggIC8qIFVua25vd24gdGFyZ2V0IHR5cGUgICAgICAgICAgICAqLworI2RlZmluZSBFTUhJTklUICAgICA5ICAvKiBDb3VsZCBub3QgaW5pdGlhbGl6ZSBob3N0ICAgICAgKi8KKyNkZWZpbmUgRU1DT01NICAgICAxMCAgLyogQ291bGQgbm90IG9wZW4gY29tbXVuaWNhdGlvbiBjaGFubmVsICovCisKKy8qIE1lc3NhZ2UgZXJyb3JzICovCisjZGVmaW5lIEVNQkFETVNHICAgMTEgIC8qIFVua25vd24gbWVzc2FnZSB0eXBlICAgICAgICAgICAqLworI2RlZmluZSBFTU1TRzJCSUcgIDEyICAvKiBNZXNzYWdlIHRvIGxhcmdlIGZvciBidWZmZXIgICAgKi8KKyNkZWZpbmUgRU1OT1NFTkQgICAxMyAgLyogQ291bGQgbm90IHNlbmQgbWVzc2FnZSAgICAgICAgICovCisjZGVmaW5lIEVNTk9SRUNWICAgMTQgIC8qIENvdWxkIG5vdCByZWNlaXZlIG1lc3NhZ2UgICAgICAqLworCisjZGVmaW5lIEVNUkVTRVQgICAgMTUgIC8qIENvdWxkIG5vdCBSRVNFVCB0YXJnZXQgICAgICAgICAqLworI2RlZmluZSBFTUNPTkZJRyAgIDE2ICAvKiBDb3VsZCBub3QgZ2V0IHRhcmdldCBDT05GSUcgICAgKi8KKyNkZWZpbmUgRU1TVEFUVVMgICAxNyAgLyogQ291bGQgbm90IGdldCB0YXJnZXQgU1RBVFVTICAgICovCisjZGVmaW5lIEVNUkVBRCAgICAgMTggIC8qIENvdWxkIG5vdCBSRUFEIHRhcmdldCBtZW1vcnkgICAqLworI2RlZmluZSBFTVdSSVRFICAgIDE5ICAvKiBDb3VsZCBub3QgV1JJVEUgdGFyZ2V0IG1lbW9yeSAgKi8KKyNkZWZpbmUgRU1CS1BUU0VUICAyMCAgLyogQ291bGQgbm90IHNldCBicmVha3BvaW50ICAgICAgICovCisjZGVmaW5lIEVNQktQVFJNICAgMjEgIC8qIENvdWxkIG5vdCByZW1vdmUgYnJlYWtwb2ludCAgICAqLworI2RlZmluZSBFTUJLUFRTVEFUIDIyICAvKiBDb3VsZCBub3QgZ2V0IGJyZWFrcG9pbnQgc3RhdHVzICovCisjZGVmaW5lIEVNQktQVE5PTkUgMjMgIC8qIEFsbCBicmVha3BvaW50cyBpbiB1c2UgICAgICAgICAqLworI2RlZmluZSBFTUJLUFRVU0VEIDI0ICAvKiBCcmVha3BvaW50cyBhbHJlYWR5IGluIHVzZSAgICAgKi8KKyNkZWZpbmUgRU1DT1BZICAgICAyNSAgLyogQ291bGQgbm90IENPUFkgdGFyZ2V0IG1lbW9yeSAgICovCisjZGVmaW5lIEVNRklMTCAgICAgMjYgIC8qIENvdWxkIG5vdCBGSUxMIHRhcmdldCBtZW1vcnkgICAqLworI2RlZmluZSBFTUlOSVQgICAgIDI3ICAvKiBDb3VsZCBub3QgaW5pdGlhbGl6ZSB0YXJnZXQgbWVtb3J5ICovCisjZGVmaW5lIEVNR08gICAgICAgMjggIC8qIENvdWxkIG5vdCBzdGFydCBleGVjdXRpb24gICAgICAqLworI2RlZmluZSBFTVNURVAgICAgIDI5ICAvKiBDb3VsZCBub3Qgc2luZ2xlIHN0ZXAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1CUkVBSyAgICAzMCAgLyogQ291bGQgbm90IEJSRUFLICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNSElGICAgICAgMzEgIC8qIENvdWxkIG5vdCBwZXJmb3JtIEhJRiBzZXJ2aWNlICAqLworI2RlZmluZSBFTUNIQU5ORUwwIDMyICAvKiBDb3VsZCBub3QgcmVhZCBDSEFOTkVMMCAgICAgICAgKi8KKyNkZWZpbmUgRU1DSEFOTkVMMSAzMyAgLyogQ291bGQgbm90IHdyaXRlIENIQU5ORUwxICAgICAgICovCisKKy8qIENPRkYgZmlsZSBsb2FkZXIgZXJyb3JzICovCisjZGVmaW5lIEVNT1BFTiAgICAgMzQgIC8qIENvdWxkIG5vdCBvcGVuIENPRkYgZmlsZSAgICAgICAqLworI2RlZmluZSBFTUhEUiAgICAgIDM1ICAvKiBDb3VsZCBub3QgcmVhZCBDT0ZGIGhlYWRlciAgICAgKi8KKyNkZWZpbmUgRU1NQUdJQyAgICAzNiAgLyogQmFkIG1hZ2ljIG51bWJlciAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQU9VVCAgICAgMzcgIC8qIENvdWxkIG5vdCByZWFkIENPRkYgYS5vdXQgaGVhZGVyICovCisjZGVmaW5lIEVNU0NOSERSICAgMzggIC8qIENvdWxkIG5vdCByZWFkIENPRkYgc2VjdGlvbiBoZWFkZXIgKi8KKyNkZWZpbmUgRU1TQ04gICAgICAzOSAgLyogQ291bGQgbm90IHJlYWQgQ09GRiBzZWN0aW9uICAgICovCisjZGVmaW5lIEVNQ0xPU0UgICAgNDAgIC8qIENvdWxkIG5vdCBjbG9zZSBDT0ZGIGZpbGUgICAgICAqLworCisvKiBMb2cgZmlsZSBlcnJvcnMgKi8KKyNkZWZpbmUgRU1MT0dPUEVOICA0MSAgLyogQ291bGQgbm90IG9wZW4gbG9nIGZpbGUgICAgICAgICovCisjZGVmaW5lIEVNTE9HUkVBRCAgNDIgIC8qIENvdWxkIG5vdCByZWFkIGxvZyBmaWxlICAgICAgICAqLworI2RlZmluZSBFTUxPR1dSSVRFIDQzICAvKiBDb3VsZCBub3Qgd3JpdGUgdG8gbG9nIGZpbGUgICAgKi8KKyNkZWZpbmUgRU1MT0dDTE9TRSA0NCAgLyogQ291bGQgbm90IGNsb3NlIGxvZyBmaWxlICAgICAgICovCisKKy8qIENvbW1hbmQgZmlsZSBlcnJvcnMgKi8KKyNkZWZpbmUgRU1DTURPUEVOICA0NSAgLyogQ291bGQgbm90IG9wZW4gY29tbWFuZCBmaWxlICAgICovCisjZGVmaW5lIEVNQ01EUkVBRCAgNDYgIC8qIENvdWxkIG5vdCByZWFkIGNvbW1hbmQgZmlsZSAgICAqLworI2RlZmluZSBFTUNNRFdSSVRFIDQ3ICAvKiBDb3VsZCBub3Qgd3JpdGUgdG8gY29tbWFuZCBmaWxlICovCisjZGVmaW5lIEVNQ01EQ0xPU0UgNDggIC8qIENvdWxkIG5vdCBjbG9zZSBjb21hbmQgZmlsZSAgICAqLworCisjZGVmaW5lIEVNVElNRU9VVCAgNDkgIC8qIEhvc3QgdGltZWQgb3V0IHdhaXRpbmcgZm9yIGEgbWVzc2FnZSAqLworI2RlZmluZSBFTUNPTU1UWVBFIDUwICAvKiBBICctdCcgZmxhZyBtdXN0IGJlIHNwZWNpZmllZCAgKi8KKyNkZWZpbmUgRU1DT01NRVJSICA1MSAgLyogQ29tbXVuaWNhdGlvbiBlcnJvciAgICAgICAgICAgICovCisjZGVmaW5lIEVNQkFVRCAgICAgNTIgIC8qIEludmFsaWQgYmF1ZCByYXRlIHNwZWNpZmllZCAgICAqLworLyoKKyAqIE1lbW9yeSBTcGFjZXMKKyAqLworI2RlZmluZSBMT0NBTF9SRUcgICAgMCAgLyogTG9jYWwgcHJvY2Vzc29yIHJlZ2lzdGVyICAgICAqLworI2RlZmluZSBHTE9CQUxfUkVHICAgMSAgLyogR2xvYmFsIHByb2Nlc3NvciByZWdpc3RlciAgICAqLworI2RlZmluZSBTUEVDSUFMX1JFRyAgMiAgLyogU3BlY2lhbCBwcm9jZXNzb3IgcmVnaXN0ZXIgICAqLworI2RlZmluZSBUTEJfUkVHICAgICAgMyAgLyogVHJhbnNsYXRpb24gTG9va2FzaWRlIEJ1ZmZlciAqLworI2RlZmluZSBDT1BST0NfUkVHICAgNCAgLyogQ29wcm9jZXNzb3IgcmVnaXN0ZXIgICAgICAgICAqLworI2RlZmluZSBJX01FTSAgICAgICAgNSAgLyogSW5zdHJ1Y3Rpb24gTWVtb3J5ICAgICAgICAgICAqLworI2RlZmluZSBEX01FTSAgICAgICAgNiAgLyogRGF0YSBNZW1vcnkgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJX1JPTSAgICAgICAgNyAgLyogSW5zdHJ1Y3Rpb24gUk9NICAgICAgICAgICAgICAqLworI2RlZmluZSBEX1JPTSAgICAgICAgOCAgLyogRGF0YSBST00gICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJX08gICAgICAgICAgOSAgLyogSW5wdXQvT3V0cHV0ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJX0NBQ0hFICAgICAxMCAgLyogSW5zdHJ1Y3Rpb24gQ2FjaGUgICAgICAgICAgICAqLworI2RlZmluZSBEX0NBQ0hFICAgICAxMSAgLyogRGF0YSBDYWNoZSAgICAgICAgICAgICAgICAgICAqLworCisvKiBUbyBzdXByZXNzIHdhcm5pbmdzIGZvciB6ZXJvIGxlbmd0aCBhcnJheSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBEVU1NWSAxCisKKy8qCisqKiBIb3N0IHRvIHRhcmdldCBkZWZpbml0aW9ucworKi8KKworI2RlZmluZSBSRVNFVCAgICAgICAgICAwCisjZGVmaW5lIENPTkZJR19SRVEgICAgIDEKKyNkZWZpbmUgU1RBVFVTX1JFUSAgICAgMgorI2RlZmluZSBSRUFEX1JFUSAgICAgICAzCisjZGVmaW5lIFdSSVRFX1JFUSAgICAgIDQKKyNkZWZpbmUgQktQVF9TRVQgICAgICAgNQorI2RlZmluZSBCS1BUX1JNICAgICAgICA2CisjZGVmaW5lIEJLUFRfU1RBVCAgICAgIDcKKyNkZWZpbmUgQ09QWSAgICAgICAgICAgOAorI2RlZmluZSBGSUxMICAgICAgICAgICA5CisjZGVmaW5lIElOSVQgICAgICAgICAgMTAKKyNkZWZpbmUgR08gICAgICAgICAgICAxMQorI2RlZmluZSBTVEVQICAgICAgICAgIDEyCisjZGVmaW5lIEJSRUFLICAgICAgICAgMTMKKworI2RlZmluZSBISUZfQ0FMTF9SVE4gIDY0CisjZGVmaW5lIENIQU5ORUwwICAgICAgNjUKKyNkZWZpbmUgQ0hBTk5FTDFfQUNLICA2NgorCisKKy8qCisqKiBUYXJnZXQgdG8gaG9zdCBkZWZpbml0aW9ucworKi8KKworI2RlZmluZSBSRVNFVF9BQ0sgICAgIDMyCisjZGVmaW5lIENPTkZJRyAgICAgICAgMzMKKyNkZWZpbmUgU1RBVFVTICAgICAgICAzNAorI2RlZmluZSBSRUFEX0FDSyAgICAgIDM1CisjZGVmaW5lIFdSSVRFX0FDSyAgICAgMzYKKyNkZWZpbmUgQktQVF9TRVRfQUNLICAzNworI2RlZmluZSBCS1BUX1JNX0FDSyAgIDM4CisjZGVmaW5lIEJLUFRfU1RBVF9BQ0sgMzkKKyNkZWZpbmUgQ09QWV9BQ0sgICAgICA0MAorI2RlZmluZSBGSUxMX0FDSyAgICAgIDQxCisjZGVmaW5lIElOSVRfQUNLICAgICAgNDIKKyNkZWZpbmUgSEFMVCAgICAgICAgICA0MworCisjZGVmaW5lIEVSUk9SICAgICAgICAgNjMKKworI2RlZmluZSBISUZfQ0FMTCAgICAgIDk2CisjZGVmaW5lIENIQU5ORUwwX0FDSyAgOTcKKyNkZWZpbmUgQ0hBTk5FTDEgICAgICA5OAorCisKKy8qIEEgImdlbmVyaWMiIG1lc3NhZ2UgKi8KK3N0cnVjdCBnZW5lcmljX21zZ190IHsKKyAgICAgICAgICBJTlQzMiAgICBjb2RlOyAgLyogZ2VuZXJpYyAqLworICAgICAgICAgIElOVDMyICAgIGxlbmd0aDsKKyAgICAgICAgICBCWVRFICAgICBieXRlW0RVTU1ZXTsKK307CisKKworLyogQSAiZ2VuZXJpYyIgbWVzc2FnZSAod2l0aCBhbiBJTlQzMiBhcnJheSkgKi8KK3N0cnVjdCBnZW5lcmljX2ludDMyX21zZ190IHsKKyAgICAgICAgICBJTlQzMiAgICBjb2RlOyAgLyogZ2VuZXJpYyAqLworICAgICAgICAgIElOVDMyICAgIGxlbmd0aDsKKyAgICAgICAgICBJTlQzMiAgICBpbnQzMltEVU1NWV07Cit9OworCisKKy8qCisqKiBIb3N0IHRvIHRhcmdldCBtZXNzYWdlcworKi8KKworc3RydWN0IHJlc2V0X21zZ190IHsKKyAgICAgICAgICBJTlQzMiAgICBjb2RlOyAgLyogMCAqLworICAgICAgICAgIElOVDMyICAgIGxlbmd0aDsKK307CisKKworc3RydWN0IGNvbmZpZ19yZXFfbXNnX3QgeworICAgICAgICAgIElOVDMyICAgIGNvZGU7ICAvKiAxICovCisgICAgICAgICAgSU5UMzIgICAgbGVuZ3RoOworfTsKKworCitzdHJ1Y3Qgc3RhdHVzX3JlcV9tc2dfdCB7CisgICAgICAgICAgSU5UMzIgICAgY29kZTsgIC8qIDIgKi8KKyAgICAgICAgICBJTlQzMiAgICBsZW5ndGg7Cit9OworCisKK3N0cnVjdCByZWFkX3JlcV9tc2dfdCB7CisgICAgICAgICAgSU5UMzIgICAgY29kZTsgIC8qIDMgKi8KKyAgICAgICAgICBJTlQzMiAgICBsZW5ndGg7CisgICAgICAgICAgSU5UMzIgICAgbWVtb3J5X3NwYWNlOworICAgICAgICAgIEFERFIzMiAgIGFkZHJlc3M7CisgICAgICAgICAgSU5UMzIgICAgYnl0ZV9jb3VudDsKK307CisKKworc3RydWN0IHdyaXRlX3JlcV9tc2dfdCB7CisgICAgICAgICAgSU5UMzIgICAgY29kZTsgIC8qIDQgKi8KKyAgICAgICAgICBJTlQzMiAgICBsZW5ndGg7CisgICAgICAgICAgSU5UMzIgICAgbWVtb3J5X3NwYWNlOworICAgICAgICAgIEFERFIzMiAgIGFkZHJlc3M7CisgICAgICAgICAgSU5UMzIgICAgYnl0ZV9jb3VudDsKKyAgICAgICAgICBCWVRFICAgICBkYXRhW0RVTU1ZXTsKK307CisKKworc3RydWN0IHdyaXRlX3JfbXNnX3QgeworICAgICAgICAgIElOVDMyICAgIGNvZGU7ICAvKiA0ICovCisgICAgICAgICAgSU5UMzIgICAgbGVuZ3RoOworICAgICAgICAgIElOVDMyICAgIG1lbW9yeV9zcGFjZTsKKyAgICAgICAgICBBRERSMzIgICBhZGRyZXNzOworICAgICAgICAgIElOVDMyICAgIGJ5dGVfY291bnQ7CisgICAgICAgICAgSU5UMzIgICAgZGF0YVtEVU1NWV07Cit9OworCisKK3N0cnVjdCBia3B0X3NldF9tc2dfdCB7CisgICAgICAgICAgSU5UMzIgICAgY29kZTsgIC8qIDUgKi8KKyAgICAgICAgICBJTlQzMiAgICBsZW5ndGg7CisgICAgICAgICAgSU5UMzIgICAgbWVtb3J5X3NwYWNlOworICAgICAgICAgIEFERFIzMiAgIGJrcHRfYWRkcjsKKyAgICAgICAgICBJTlQzMiAgICBwYXNzX2NvdW50OworICAgICAgICAgIElOVDMyICAgIGJrcHRfdHlwZTsKK307CisKKworc3RydWN0IGJrcHRfcm1fbXNnX3QgeworICAgICAgICAgIElOVDMyICAgIGNvZGU7ICAvKiA2ICovCisgICAgICAgICAgSU5UMzIgICAgbGVuZ3RoOworICAgICAgICAgIElOVDMyICAgIG1lbW9yeV9zcGFjZTsKKyAgICAgICAgICBBRERSMzIgICBia3B0X2FkZHI7Cit9OworCisKK3N0cnVjdCBia3B0X3N0YXRfbXNnX3QgeworICAgICAgICAgIElOVDMyICAgIGNvZGU7ICAvKiA3ICovCisgICAgICAgICAgSU5UMzIgICAgbGVuZ3RoOworICAgICAgICAgIElOVDMyICAgIG1lbW9yeV9zcGFjZTsKKyAgICAgICAgICBBRERSMzIgICBia3B0X2FkZHI7Cit9OworCisKK3N0cnVjdCBjb3B5X21zZ190IHsKKyAgICAgICAgICBJTlQzMiAgICBjb2RlOyAgLyogOCAqLworICAgICAgICAgIElOVDMyICAgIGxlbmd0aDsKKyAgICAgICAgICBJTlQzMiAgICBzb3VyY2Vfc3BhY2U7CisgICAgICAgICAgQUREUjMyICAgc291cmNlX2FkZHI7CisgICAgICAgICAgSU5UMzIgICAgZGVzdF9zcGFjZTsKKyAgICAgICAgICBBRERSMzIgICBkZXN0X2FkZHI7CisgICAgICAgICAgSU5UMzIgICAgYnl0ZV9jb3VudDsKK307CisKKworc3RydWN0IGZpbGxfbXNnX3QgeworICAgICAgICAgIElOVDMyICAgIGNvZGU7ICAvKiA5ICovCisgICAgICAgICAgSU5UMzIgICAgbGVuZ3RoOworICAgICAgICAgIElOVDMyICAgIG1lbW9yeV9zcGFjZTsKKyAgICAgICAgICBBRERSMzIgICBzdGFydF9hZGRyOworICAgICAgICAgIElOVDMyICAgIGZpbGxfY291bnQ7CisgICAgICAgICAgSU5UMzIgICAgYnl0ZV9jb3VudDsKKyAgICAgICAgICBCWVRFICAgICBmaWxsX2RhdGFbRFVNTVldOworfTsKKworCitzdHJ1Y3QgaW5pdF9tc2dfdCB7CisgICAgICAgICAgSU5UMzIgICAgY29kZTsgIC8qIDEwICovCisgICAgICAgICAgSU5UMzIgICAgbGVuZ3RoOworICAgICAgICAgIEFERFIzMiAgIHRleHRfc3RhcnQ7CisgICAgICAgICAgQUREUjMyICAgdGV4dF9lbmQ7CisgICAgICAgICAgQUREUjMyICAgZGF0YV9zdGFydDsKKyAgICAgICAgICBBRERSMzIgICBkYXRhX2VuZDsKKyAgICAgICAgICBBRERSMzIgICBlbnRyeV9wb2ludDsKKyAgICAgICAgICBJTlQzMiAgICBtZW1fc3RhY2tfc2l6ZTsKKyAgICAgICAgICBJTlQzMiAgICByZWdfc3RhY2tfc2l6ZTsKKyAgICAgICAgICBBRERSMzIgICBhcmdfc3RhcnQ7CisgICAgICAgICAgSU5UMzIgICAgb3NfY29udHJvbDsKK307CisKKworc3RydWN0IGdvX21zZ190IHsKKyAgICAgICAgICBJTlQzMiAgICBjb2RlOyAgLyogMTEgKi8KKyAgICAgICAgICBJTlQzMiAgICBsZW5ndGg7Cit9OworCisKK3N0cnVjdCBzdGVwX21zZ190IHsKKyAgICAgICAgICBJTlQzMiAgICBjb2RlOyAgLyogMTIgKi8KKyAgICAgICAgICBJTlQzMiAgICBsZW5ndGg7CisgICAgICAgICAgSU5UMzIgICAgY291bnQ7Cit9OworCisKK3N0cnVjdCBicmVha19tc2dfdCB7CisgICAgICAgICAgSU5UMzIgICAgY29kZTsgIC8qIDEzICovCisgICAgICAgICAgSU5UMzIgICAgbGVuZ3RoOworfTsKKworCitzdHJ1Y3QgaGlmX2NhbGxfcnRuX21zZ190IHsKKyAgICAgICAgICBJTlQzMiAgICBjb2RlOyAgLyogNjQgKi8KKyAgICAgICAgICBJTlQzMiAgICBsZW5ndGg7CisgICAgICAgICAgSU5UMzIgICAgc2VydmljZV9udW1iZXI7CisgICAgICAgICAgSU5UMzIgICAgZ3IxMjE7CisgICAgICAgICAgSU5UMzIgICAgZ3I5NjsKKyAgICAgICAgICBJTlQzMiAgICBncjk3OworfTsKKworCitzdHJ1Y3QgY2hhbm5lbDBfbXNnX3QgeworICAgICAgICAgIElOVDMyICAgIGNvZGU7ICAvKiA2NSAqLworICAgICAgICAgIElOVDMyICAgIGxlbmd0aDsKKyAgICAgICAgICBCWVRFICAgICBkYXRhOworfTsKKworCitzdHJ1Y3QgY2hhbm5lbDFfYWNrX21zZ190IHsKKyAgICAgICAgICBJTlQzMiAgICBjb2RlOyAgLyogNjYgKi8KKyAgICAgICAgICBJTlQzMiAgICBsZW5ndGg7Cit9OworCisKKy8qCisqKiBUYXJnZXQgdG8gaG9zdCBtZXNzYWdlcworKi8KKworCitzdHJ1Y3QgcmVzZXRfYWNrX21zZ190IHsKKyAgICAgICAgICBJTlQzMiAgICBjb2RlOyAgLyogMzIgKi8KKyAgICAgICAgICBJTlQzMiAgICBsZW5ndGg7Cit9OworCisKK3N0cnVjdCBjb25maWdfbXNnX3QgeworICAgICAgICAgIElOVDMyICAgIGNvZGU7ICAvKiAzMyAqLworICAgICAgICAgIElOVDMyICAgIGxlbmd0aDsKKyAgICAgICAgICBJTlQzMiAgICBwcm9jZXNzb3JfaWQ7CisgICAgICAgICAgSU5UMzIgICAgdmVyc2lvbjsKKyAgICAgICAgICBBRERSMzIgICBJX21lbV9zdGFydDsKKyAgICAgICAgICBJTlQzMiAgICBJX21lbV9zaXplOworICAgICAgICAgIEFERFIzMiAgIERfbWVtX3N0YXJ0OworICAgICAgICAgIElOVDMyICAgIERfbWVtX3NpemU7CisgICAgICAgICAgQUREUjMyICAgUk9NX3N0YXJ0OworICAgICAgICAgIElOVDMyICAgIFJPTV9zaXplOworICAgICAgICAgIElOVDMyICAgIG1heF9tc2dfc2l6ZTsKKyAgICAgICAgICBJTlQzMiAgICBtYXhfYmtwdHM7CisgICAgICAgICAgSU5UMzIgICAgY29wcm9jZXNzb3I7CisgICAgICAgICAgSU5UMzIgICAgcmVzZXJ2ZWQ7Cit9OworCisKK3N0cnVjdCBzdGF0dXNfbXNnX3QgeworICAgICAgICAgIElOVDMyICAgIGNvZGU7ICAvKiAzNCAqLworICAgICAgICAgIElOVDMyICAgIGxlbmd0aDsKKyAgICAgICAgICBJTlQzMiAgICBtc2dzX3NlbnQ7CisgICAgICAgICAgSU5UMzIgICAgbXNnc19yZWNlaXZlZDsKKyAgICAgICAgICBJTlQzMiAgICBlcnJvcnM7CisgICAgICAgICAgSU5UMzIgICAgYmtwdHNfaGl0OworICAgICAgICAgIElOVDMyICAgIGJrcHRzX2ZyZWU7CisgICAgICAgICAgSU5UMzIgICAgdHJhcHM7CisgICAgICAgICAgSU5UMzIgICAgZmlsbHM7CisgICAgICAgICAgSU5UMzIgICAgc3BpbGxzOworICAgICAgICAgIElOVDMyICAgIGN5Y2xlczsKKyAgICAgICAgICBJTlQzMiAgICByZXNlcnZlZDsKK307CisKKworc3RydWN0IHJlYWRfYWNrX21zZ190IHsKKyAgICAgICAgICBJTlQzMiAgICBjb2RlOyAgLyogMzUgKi8KKyAgICAgICAgICBJTlQzMiAgICBsZW5ndGg7CisgICAgICAgICAgSU5UMzIgICAgbWVtb3J5X3NwYWNlOworICAgICAgICAgIEFERFIzMiAgIGFkZHJlc3M7CisgICAgICAgICAgSU5UMzIgICAgYnl0ZV9jb3VudDsKKyAgICAgICAgICBCWVRFICAgICBkYXRhW0RVTU1ZXTsKK307CisKK3N0cnVjdCByZWFkX3JfYWNrX21zZ190IHsKKyAgICAgICAgICBJTlQzMiAgICBjb2RlOyAgLyogMzUgKi8KKyAgICAgICAgICBJTlQzMiAgICBsZW5ndGg7CisgICAgICAgICAgSU5UMzIgICAgbWVtb3J5X3NwYWNlOworICAgICAgICAgIEFERFIzMiAgIGFkZHJlc3M7CisgICAgICAgICAgSU5UMzIgICAgYnl0ZV9jb3VudDsKKyAgICAgICAgICBJTlQzMiAgICBkYXRhW0RVTU1ZXTsKK307CisKKworc3RydWN0IHdyaXRlX2Fja19tc2dfdCB7CisgICAgICAgICAgSU5UMzIgICAgY29kZTsgIC8qIDM2ICovCisgICAgICAgICAgSU5UMzIgICAgbGVuZ3RoOworICAgICAgICAgIElOVDMyICAgIG1lbW9yeV9zcGFjZTsKKyAgICAgICAgICBBRERSMzIgICBhZGRyZXNzOworICAgICAgICAgIElOVDMyICAgIGJ5dGVfY291bnQ7Cit9OworCisKK3N0cnVjdCBia3B0X3NldF9hY2tfbXNnX3QgeworICAgICAgICAgIElOVDMyICAgIGNvZGU7ICAvKiAzNyAqLworICAgICAgICAgIElOVDMyICAgIGxlbmd0aDsKKyAgICAgICAgICBJTlQzMiAgICBtZW1vcnlfc3BhY2U7CisgICAgICAgICAgQUREUjMyICAgYWRkcmVzczsKKyAgICAgICAgICBJTlQzMiAgICBwYXNzX2NvdW50OworICAgICAgICAgIElOVDMyICAgIGJrcHRfdHlwZTsKK307CisKKworc3RydWN0IGJrcHRfcm1fYWNrX21zZ190IHsKKyAgICAgICAgICBJTlQzMiAgICBjb2RlOyAgLyogMzggKi8KKyAgICAgICAgICBJTlQzMiAgICBsZW5ndGg7CisgICAgICAgICAgSU5UMzIgICAgbWVtb3J5X3NwYWNlOworICAgICAgICAgIEFERFIzMiAgIGFkZHJlc3M7Cit9OworCisKK3N0cnVjdCBia3B0X3N0YXRfYWNrX21zZ190IHsKKyAgICAgICAgICBJTlQzMiAgICBjb2RlOyAgLyogMzkgKi8KKyAgICAgICAgICBJTlQzMiAgICBsZW5ndGg7IAorICAgICAgICAgIElOVDMyICAgIG1lbW9yeV9zcGFjZTsKKyAgICAgICAgICBBRERSMzIgICBhZGRyZXNzOworICAgICAgICAgIElOVDMyICAgIHBhc3NfY291bnQ7CisgICAgICAgICAgSU5UMzIgICAgYmtwdF90eXBlOworfTsKKworCitzdHJ1Y3QgY29weV9hY2tfbXNnX3QgeworICAgICAgICAgIElOVDMyICAgIGNvZGU7ICAvKiA0MCAqLworICAgICAgICAgIElOVDMyICAgIGxlbmd0aDsKKyAgICAgICAgICBJTlQzMiAgICBzb3VyY2Vfc3BhY2U7CisgICAgICAgICAgQUREUjMyICAgc291cmNlX2FkZHI7CisgICAgICAgICAgSU5UMzIgICAgZGVzdF9zcGFjZTsKKyAgICAgICAgICBBRERSMzIgICBkZXN0X2FkZHI7CisgICAgICAgICAgSU5UMzIgICAgYnl0ZV9jb3VudDsKK307CisKKworc3RydWN0IGZpbGxfYWNrX21zZ190IHsKKyAgICAgICAgICBJTlQzMiAgICBjb2RlOyAgLyogNDEgKi8KKyAgICAgICAgICBJTlQzMiAgICBsZW5ndGg7CisgICAgICAgICAgSU5UMzIgICAgbWVtb3J5X3NwYWNlOworICAgICAgICAgIEFERFIzMiAgIHN0YXJ0X2FkZHI7CisgICAgICAgICAgSU5UMzIgICAgZmlsbF9jb3VudDsKKyAgICAgICAgICBJTlQzMiAgICBieXRlX2NvdW50OworfTsKKworCitzdHJ1Y3QgaW5pdF9hY2tfbXNnX3QgeworICAgICAgICAgIElOVDMyICAgIGNvZGU7ICAvKiA0MiAqLworICAgICAgICAgIElOVDMyICAgIGxlbmd0aDsKK307CisKKworc3RydWN0IGhhbHRfbXNnX3QgeworICAgICAgICAgIElOVDMyICAgIGNvZGU7ICAvKiA0MyAqLworICAgICAgICAgIElOVDMyICAgIGxlbmd0aDsKKyAgICAgICAgICBJTlQzMiAgICBtZW1vcnlfc3BhY2U7CisgICAgICAgICAgQUREUjMyICAgcGMwOworICAgICAgICAgIEFERFIzMiAgIHBjMTsKKyAgICAgICAgICBJTlQzMiAgICB0cmFwX251bWJlcjsKK307CisKKworc3RydWN0IGVycm9yX21zZ190IHsKKyAgICAgICAgICBJTlQzMiAgICBjb2RlOyAgLyogNjMgKi8KKyAgICAgICAgICBJTlQzMiAgICBsZW5ndGg7CisgICAgICAgICAgSU5UMzIgICAgZXJyb3JfY29kZTsKKyAgICAgICAgICBJTlQzMiAgICBtZW1vcnlfc3BhY2U7CisgICAgICAgICAgQUREUjMyICAgYWRkcmVzczsKK307CisKKworc3RydWN0IGhpZl9jYWxsX21zZ190IHsKKyAgICAgICAgICBJTlQzMiAgICBjb2RlOyAgLyogOTYgKi8KKyAgICAgICAgICBJTlQzMiAgICBsZW5ndGg7CisgICAgICAgICAgSU5UMzIgICAgc2VydmljZV9udW1iZXI7CisgICAgICAgICAgSU5UMzIgICAgbHIyOworICAgICAgICAgIElOVDMyICAgIGxyMzsKKyAgICAgICAgICBJTlQzMiAgICBscjQ7Cit9OworCisKK3N0cnVjdCBjaGFubmVsMF9hY2tfbXNnX3QgeworICAgICAgICAgIElOVDMyICAgIGNvZGU7ICAvKiA5NyAqLworICAgICAgICAgIElOVDMyICAgIGxlbmd0aDsKK307CisKKworc3RydWN0IGNoYW5uZWwxX21zZ190IHsKKyAgICAgICAgICBJTlQzMiAgICBjb2RlOyAgLyogOTggKi8KKyAgICAgICAgICBJTlQzMiAgICBsZW5ndGg7CisgICAgICAgICAgQllURSAgICAgZGF0YVtEVU1NWV07Cit9OworCisKKworLyoKKyoqIFVuaW9uIGFsbCBvZiB0aGUgbWVzc2FnZSB0eXBlcyB0b2dldGhlcgorKi8KKwordW5pb24gbXNnX3QgeworICAgICAgICAgc3RydWN0IGdlbmVyaWNfbXNnX3QgICAgICAgIGdlbmVyaWNfbXNnOworICAgICAgICAgc3RydWN0IGdlbmVyaWNfaW50MzJfbXNnX3QgIGdlbmVyaWNfaW50MzJfbXNnOworCisgICAgICAgICBzdHJ1Y3QgcmVzZXRfbXNnX3QgICAgICAgICAgcmVzZXRfbXNnOworICAgICAgICAgc3RydWN0IGNvbmZpZ19yZXFfbXNnX3QgICAgIGNvbmZpZ19yZXFfbXNnOworICAgICAgICAgc3RydWN0IHN0YXR1c19yZXFfbXNnX3QgICAgIHN0YXR1c19yZXFfbXNnOworICAgICAgICAgc3RydWN0IHJlYWRfcmVxX21zZ190ICAgICAgIHJlYWRfcmVxX21zZzsKKyAgICAgICAgIHN0cnVjdCB3cml0ZV9yZXFfbXNnX3QgICAgICB3cml0ZV9yZXFfbXNnOworICAgICAgICAgc3RydWN0IHdyaXRlX3JfbXNnX3QgICAgICAgIHdyaXRlX3JfbXNnOworICAgICAgICAgc3RydWN0IGJrcHRfc2V0X21zZ190ICAgICAgIGJrcHRfc2V0X21zZzsKKyAgICAgICAgIHN0cnVjdCBia3B0X3JtX21zZ190ICAgICAgICBia3B0X3JtX21zZzsKKyAgICAgICAgIHN0cnVjdCBia3B0X3N0YXRfbXNnX3QgICAgICBia3B0X3N0YXRfbXNnOworICAgICAgICAgc3RydWN0IGNvcHlfbXNnX3QgICAgICAgICAgIGNvcHlfbXNnOworICAgICAgICAgc3RydWN0IGZpbGxfbXNnX3QgICAgICAgICAgIGZpbGxfbXNnOworICAgICAgICAgc3RydWN0IGluaXRfbXNnX3QgICAgICAgICAgIGluaXRfbXNnOworICAgICAgICAgc3RydWN0IGdvX21zZ190ICAgICAgICAgICAgIGdvX21zZzsKKyAgICAgICAgIHN0cnVjdCBzdGVwX21zZ190ICAgICAgICAgICBzdGVwX21zZzsKKyAgICAgICAgIHN0cnVjdCBicmVha19tc2dfdCAgICAgICAgICBicmVha19tc2c7CisKKyAgICAgICAgIHN0cnVjdCBoaWZfY2FsbF9ydG5fbXNnX3QgICBoaWZfY2FsbF9ydG5fbXNnOworICAgICAgICAgc3RydWN0IGNoYW5uZWwwX21zZ190ICAgICAgIGNoYW5uZWwwX21zZzsKKyAgICAgICAgIHN0cnVjdCBjaGFubmVsMV9hY2tfbXNnX3QgICBjaGFubmVsMV9hY2tfbXNnOworCisgICAgICAgICBzdHJ1Y3QgcmVzZXRfYWNrX21zZ190ICAgICAgcmVzZXRfYWNrX21zZzsKKyAgICAgICAgIHN0cnVjdCBjb25maWdfbXNnX3QgICAgICAgICBjb25maWdfbXNnOworICAgICAgICAgc3RydWN0IHN0YXR1c19tc2dfdCAgICAgICAgIHN0YXR1c19tc2c7CisgICAgICAgICBzdHJ1Y3QgcmVhZF9hY2tfbXNnX3QgICAgICAgcmVhZF9hY2tfbXNnOworICAgICAgICAgc3RydWN0IHJlYWRfcl9hY2tfbXNnX3QgICAgIHJlYWRfcl9hY2tfbXNnOworICAgICAgICAgc3RydWN0IHdyaXRlX2Fja19tc2dfdCAgICAgIHdyaXRlX2Fja19tc2c7CisgICAgICAgICBzdHJ1Y3QgYmtwdF9zZXRfYWNrX21zZ190ICAgYmtwdF9zZXRfYWNrX21zZzsKKyAgICAgICAgIHN0cnVjdCBia3B0X3JtX2Fja19tc2dfdCAgICBia3B0X3JtX2Fja19tc2c7CisgICAgICAgICBzdHJ1Y3QgYmtwdF9zdGF0X2Fja19tc2dfdCAgYmtwdF9zdGF0X2Fja19tc2c7CisgICAgICAgICBzdHJ1Y3QgY29weV9hY2tfbXNnX3QgICAgICAgY29weV9hY2tfbXNnOworICAgICAgICAgc3RydWN0IGZpbGxfYWNrX21zZ190ICAgICAgIGZpbGxfYWNrX21zZzsKKyAgICAgICAgIHN0cnVjdCBpbml0X2Fja19tc2dfdCAgICAgICBpbml0X2Fja19tc2c7CisgICAgICAgICBzdHJ1Y3QgaGFsdF9tc2dfdCAgICAgICAgICAgaGFsdF9tc2c7CisKKyAgICAgICAgIHN0cnVjdCBlcnJvcl9tc2dfdCAgICAgICAgICBlcnJvcl9tc2c7CisKKyAgICAgICAgIHN0cnVjdCBoaWZfY2FsbF9tc2dfdCAgICAgICBoaWZfY2FsbF9tc2c7CisgICAgICAgICBzdHJ1Y3QgY2hhbm5lbDBfYWNrX21zZ190ICAgY2hhbm5lbDBfYWNrX21zZzsKKyAgICAgICAgIHN0cnVjdCBjaGFubmVsMV9tc2dfdCAgICAgICBjaGFubmVsMV9tc2c7Cit9OwpkaWZmIC0tZ2l0IGEvZ2RiL21pbnN5bXMuYyBiL2dkYi9taW5zeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3MWM5MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9taW5zeW1zLmMKQEAgLTAsMCArMSw5MDQgQEAKKy8qIEdEQiByb3V0aW5lcyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZXMuCisgICBDb3B5cmlnaHQgMTk5MiwgOTMsIDk0LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydCwgdXNpbmcgcGllY2VzIGZyb20gb3RoZXIgR0RCIG1vZHVsZXMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgc3VwcG9ydCByb3V0aW5lcyBmb3IgY3JlYXRpbmcsIG1hbmlwdWxhdGluZywgYW5kCisgICBkZXN0cm95aW5nIG1pbmltYWwgc3ltYm9sIHRhYmxlcy4KKworICAgTWluaW1hbCBzeW1ib2wgdGFibGVzIGFyZSB1c2VkIHRvIGhvbGQgc29tZSB2ZXJ5IGJhc2ljIGluZm9ybWF0aW9uIGFib3V0CisgICBhbGwgZGVmaW5lZCBnbG9iYWwgc3ltYm9scyAodGV4dCwgZGF0YSwgYnNzLCBhYnMsIGV0YykuICBUaGUgb25seSB0d28KKyAgIHJlcXVpcmVkIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBhcmUgdGhlIHN5bWJvbCdzIG5hbWUgYW5kIHRoZSBhZGRyZXNzCisgICBhc3NvY2lhdGVkIHdpdGggdGhhdCBzeW1ib2wuCisKKyAgIEluIG1hbnkgY2FzZXMsIGV2ZW4gaWYgYSBmaWxlIHdhcyBjb21waWxlZCB3aXRoIG5vIHNwZWNpYWwgb3B0aW9ucyBmb3IKKyAgIGRlYnVnZ2luZyBhdCBhbGwsIGFzIGxvbmcgYXMgd2FzIG5vdCBzdHJpcHBlZCBpdCB3aWxsIGNvbnRhaW4gc3VmZmljaWVudAorICAgaW5mb3JtYXRpb24gdG8gYnVpbGQgdXNlZnVsIG1pbmltYWwgc3ltYm9sIHRhYmxlcyB1c2luZyB0aGlzIHN0cnVjdHVyZS4KKyAgIAorICAgRXZlbiB3aGVuIGEgZmlsZSBjb250YWlucyBlbm91Z2ggZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGJ1aWxkIGEgZnVsbAorICAgc3ltYm9sIHRhYmxlLCB0aGVzZSBtaW5pbWFsIHN5bWJvbHMgYXJlIHN0aWxsIHVzZWZ1bCBmb3IgcXVpY2tseSBtYXBwaW5nCisgICBiZXR3ZWVuIG5hbWVzIGFuZCBhZGRyZXNzZXMsIGFuZCB2aWNlIHZlcnNhLiAgVGhleSBhcmUgYWxzbyBzb21ldGltZXMgdXNlZAorICAgdG8gZmlndXJlIG91dCB3aGF0IGZ1bGwgc3ltYm9sIHRhYmxlIGVudHJpZXMgbmVlZCB0byBiZSByZWFkIGluLiAqLworCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIKKyNpbmNsdWRlICJvYmpmaWxlcy5oIgorI2luY2x1ZGUgImRlbWFuZ2xlLmgiCisjaW5jbHVkZSAiZ2RiLXN0YWJzLmgiCisKKy8qIEFjY3VtdWxhdGUgdGhlIG1pbmltYWwgc3ltYm9scyBmb3IgZWFjaCBvYmpmaWxlIGluIGJ1bmNoZXMgb2YgQlVOQ0hfU0laRS4KKyAgIEF0IHRoZSBlbmQsIGNvcHkgdGhlbSBhbGwgaW50byBvbmUgbmV3bHkgYWxsb2NhdGVkIGxvY2F0aW9uIG9uIGFuIG9iamZpbGUncworICAgc3ltYm9sIG9ic3RhY2suICAqLworCisjZGVmaW5lIEJVTkNIX1NJWkUgMTI3CisKK3N0cnVjdCBtc3ltX2J1bmNoCit7CisgIHN0cnVjdCBtc3ltX2J1bmNoICpuZXh0OworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgY29udGVudHNbQlVOQ0hfU0laRV07Cit9OworCisvKiBCdW5jaCBjdXJyZW50bHkgYmVpbmcgZmlsbGVkIHVwLgorICAgVGhlIG5leHQgZmllbGQgcG9pbnRzIHRvIGNoYWluIG9mIGZpbGxlZCBidW5jaGVzLiAgKi8KKworc3RhdGljIHN0cnVjdCBtc3ltX2J1bmNoICptc3ltX2J1bmNoOworCisvKiBOdW1iZXIgb2Ygc2xvdHMgZmlsbGVkIGluIGN1cnJlbnQgYnVuY2guICAqLworCitzdGF0aWMgaW50IG1zeW1fYnVuY2hfaW5kZXg7CisKKy8qIFRvdGFsIG51bWJlciBvZiBtaW5pbWFsIHN5bWJvbHMgcmVjb3JkZWQgc28gZmFyIGZvciB0aGUgb2JqZmlsZS4gICovCisKK3N0YXRpYyBpbnQgbXN5bV9jb3VudDsKKworLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAqLworCitzdGF0aWMgaW50Citjb21wYXJlX21pbmltYWxfc3ltYm9scyBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOworCitzdGF0aWMgaW50Citjb21wYWN0X21pbmltYWxfc3ltYm9scyBQQVJBTVMgKChzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKiwgaW50KSk7CisKKy8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIGN1cnJlbnQgbWluaW1hbCBzeW1ib2wgdGFibGVzIGFuZCBmaW5kIHRoZQorICAgZmlyc3QgbWluaW1hbCBzeW1ib2wgdGhhdCBtYXRjaGVzIE5BTUUuICBJZiBPQkpGIGlzIG5vbi1OVUxMLCBsaW1pdAorICAgdGhlIHNlYXJjaCB0byB0aGF0IG9iamZpbGUuICBJZiBTRklMRSBpcyBub24tTlVMTCwgbGltaXQgdGhlIHNlYXJjaAorICAgdG8gdGhhdCBzb3VyY2UgZmlsZS4gIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBtaW5pbWFsIHN5bWJvbCB0aGF0CisgICBtYXRjaGVzLCBvciBOVUxMIGlmIG5vIG1hdGNoIGlzIGZvdW5kLgorCisgICBOb3RlOiAgT25lIGluc3RhbmNlIHdoZXJlIHRoZXJlIG1heSBiZSBkdXBsaWNhdGUgbWluaW1hbCBzeW1ib2xzIHdpdGgKKyAgIHRoZSBzYW1lIG5hbWUgaXMgd2hlbiB0aGUgc3ltYm9sIHRhYmxlcyBmb3IgYSBzaGFyZWQgbGlicmFyeSBhbmQgdGhlCisgICBzeW1ib2wgdGFibGVzIGZvciBhbiBleGVjdXRhYmxlIGNvbnRhaW4gZ2xvYmFsIHN5bWJvbHMgd2l0aCB0aGUgc2FtZQorICAgbmFtZXMgKHRoZSBkeW5hbWljIGxpbmtlciBkZWFscyB3aXRoIHRoZSBkdXBsaWNhdGlvbikuICovCisKK3N0cnVjdCBtaW5pbWFsX3N5bWJvbCAqCitsb29rdXBfbWluaW1hbF9zeW1ib2wgKG5hbWUsIHNmaWxlLCBvYmpmKQorICAgICByZWdpc3RlciBjb25zdCBjaGFyICpuYW1lOworICAgICBjb25zdCBjaGFyICpzZmlsZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamY7Cit7CisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqZm91bmRfc3ltYm9sID0gTlVMTDsKKyAgc3RydWN0IG1pbmltYWxfc3ltYm9sICpmb3VuZF9maWxlX3N5bWJvbCA9IE5VTEw7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqdHJhbXBvbGluZV9zeW1ib2wgPSBOVUxMOworCisjaWZkZWYgU09GVU5fQUREUkVTU19NQVlCRV9NSVNTSU5HCisgIGlmIChzZmlsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNoYXIgKnAgPSBzdHJyY2hyIChzZmlsZSwgJy8nKTsKKyAgICAgIGlmIChwICE9IE5VTEwpCisJc2ZpbGUgPSBwICsgMTsKKyAgICB9CisjZW5kaWYKKworICBmb3IgKG9iamZpbGUgPSBvYmplY3RfZmlsZXM7CisgICAgICAgb2JqZmlsZSAhPSBOVUxMICYmIGZvdW5kX3N5bWJvbCA9PSBOVUxMOworICAgICAgIG9iamZpbGUgPSBvYmpmaWxlIC0+IG5leHQpCisgICAgeworICAgICAgaWYgKG9iamYgPT0gTlVMTCB8fCBvYmpmID09IG9iamZpbGUpCisJeworCSAgZm9yIChtc3ltYm9sID0gb2JqZmlsZSAtPiBtc3ltYm9sczsKKwkgICAgICAgbXN5bWJvbCAhPSBOVUxMICYmIFNZTUJPTF9OQU1FIChtc3ltYm9sKSAhPSBOVUxMICYmCisJICAgICAgIGZvdW5kX3N5bWJvbCA9PSBOVUxMOworCSAgICAgICBtc3ltYm9sKyspCisJICAgIHsKKwkgICAgICBpZiAoU1lNQk9MX01BVENIRVNfTkFNRSAobXN5bWJvbCwgbmFtZSkpCisJCXsKKwkJICBzd2l0Y2ggKE1TWU1CT0xfVFlQRSAobXN5bWJvbCkpCisJCSAgICB7CisJCSAgICBjYXNlIG1zdF9maWxlX3RleHQ6CisJCSAgICBjYXNlIG1zdF9maWxlX2RhdGE6CisJCSAgICBjYXNlIG1zdF9maWxlX2JzczoKKyNpZmRlZiBTT0ZVTl9BRERSRVNTX01BWUJFX01JU1NJTkcKKwkJICAgICAgaWYgKHNmaWxlID09IE5VTEwgfHwgU1RSRVEgKG1zeW1ib2wtPmZpbGVuYW1lLCBzZmlsZSkpCisJCQlmb3VuZF9maWxlX3N5bWJvbCA9IG1zeW1ib2w7CisjZWxzZQorCQkgICAgICAvKiBXZSBoYXZlIG5laXRoZXIgdGhlIGFiaWxpdHkgbm9yIHRoZSBuZWVkIHRvCisJCQkgZGVhbCB3aXRoIHRoZSBTRklMRSBwYXJhbWV0ZXIuICBJZiB3ZSBmaW5kCisJCQkgbW9yZSB0aGFuIG9uZSBzeW1ib2wsIGp1c3QgcmV0dXJuIHRoZSBsYXRlc3QKKwkJCSBvbmUgKHRoZSB1c2VyIGNhbid0IGV4cGVjdCB1c2VmdWwgYmVoYXZpb3IgaW4KKwkJCSB0aGF0IGNhc2UpLiAgKi8KKwkJICAgICAgZm91bmRfZmlsZV9zeW1ib2wgPSBtc3ltYm9sOworI2VuZGlmCisJCSAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgbXN0X3NvbGliX3RyYW1wb2xpbmU6CisKKwkJICAgICAgLyogSWYgYSB0cmFtcG9saW5lIHN5bWJvbCBpcyBmb3VuZCwgd2UgcHJlZmVyIHRvCisJCQkga2VlcCBsb29raW5nIGZvciB0aGUgKnJlYWwqIHN5bWJvbC4gSWYgdGhlCisJCQkgYWN0dWFsIHN5bWJvbCBpcyBub3QgZm91bmQsIHRoZW4gd2UnbGwgdXNlIHRoZQorCQkJIHRyYW1wb2xpbmUgZW50cnkuICovCisJCSAgICAgIGlmICh0cmFtcG9saW5lX3N5bWJvbCA9PSBOVUxMKQorCQkJdHJhbXBvbGluZV9zeW1ib2wgPSBtc3ltYm9sOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSBtc3RfdW5rbm93bjoKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIGZvdW5kX3N5bWJvbCA9IG1zeW1ib2w7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgfQorICAvKiBFeHRlcm5hbCBzeW1ib2xzIGFyZSBiZXN0LiAgKi8KKyAgaWYgKGZvdW5kX3N5bWJvbCkKKyAgICByZXR1cm4gZm91bmRfc3ltYm9sOworCisgIC8qIEZpbGUtbG9jYWwgc3ltYm9scyBhcmUgbmV4dCBiZXN0LiAgKi8KKyAgaWYgKGZvdW5kX2ZpbGVfc3ltYm9sKQorICAgIHJldHVybiBmb3VuZF9maWxlX3N5bWJvbDsKKworICAvKiBTeW1ib2xzIGZvciBzaGFyZWQgbGlicmFyeSB0cmFtcG9saW5lcyBhcmUgbmV4dCBiZXN0LiAgKi8KKyAgaWYgKHRyYW1wb2xpbmVfc3ltYm9sKQorICAgIHJldHVybiB0cmFtcG9saW5lX3N5bWJvbDsKKworICByZXR1cm4gTlVMTDsKK30KKworLyogTG9vayB0aHJvdWdoIGFsbCB0aGUgY3VycmVudCBtaW5pbWFsIHN5bWJvbCB0YWJsZXMgYW5kIGZpbmQgdGhlCisgICBmaXJzdCBtaW5pbWFsIHN5bWJvbCB0aGF0IG1hdGNoZXMgTkFNRSBhbmQgb2YgdGV4dCB0eXBlLiAgCisgICBJZiBPQkpGIGlzIG5vbi1OVUxMLCBsaW1pdAorICAgdGhlIHNlYXJjaCB0byB0aGF0IG9iamZpbGUuICBJZiBTRklMRSBpcyBub24tTlVMTCwgbGltaXQgdGhlIHNlYXJjaAorICAgdG8gdGhhdCBzb3VyY2UgZmlsZS4gIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBtaW5pbWFsIHN5bWJvbCB0aGF0CisgICBtYXRjaGVzLCBvciBOVUxMIGlmIG5vIG1hdGNoIGlzIGZvdW5kLgorKi8KKyAgIAorc3RydWN0IG1pbmltYWxfc3ltYm9sICoKK2xvb2t1cF9taW5pbWFsX3N5bWJvbF90ZXh0IChuYW1lLCBzZmlsZSwgb2JqZikKKyAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgY29uc3QgY2hhciAqc2ZpbGU7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmOworeworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sOworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKmZvdW5kX3N5bWJvbCA9IE5VTEw7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqZm91bmRfZmlsZV9zeW1ib2wgPSBOVUxMOworCisjaWZkZWYgU09GVU5fQUREUkVTU19NQVlCRV9NSVNTSU5HCisgIGlmIChzZmlsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNoYXIgKnAgPSBzdHJyY2hyIChzZmlsZSwgJy8nKTsKKyAgICAgIGlmIChwICE9IE5VTEwpCisJc2ZpbGUgPSBwICsgMTsKKyAgICB9CisjZW5kaWYKKworICBmb3IgKG9iamZpbGUgPSBvYmplY3RfZmlsZXM7CisgICAgICAgb2JqZmlsZSAhPSBOVUxMICYmIGZvdW5kX3N5bWJvbCA9PSBOVUxMOworICAgICAgIG9iamZpbGUgPSBvYmpmaWxlIC0+IG5leHQpCisgICAgeworICAgICAgaWYgKG9iamYgPT0gTlVMTCB8fCBvYmpmID09IG9iamZpbGUpCisJeworCSAgZm9yIChtc3ltYm9sID0gb2JqZmlsZSAtPiBtc3ltYm9sczsKKwkgICAgICAgbXN5bWJvbCAhPSBOVUxMICYmIFNZTUJPTF9OQU1FIChtc3ltYm9sKSAhPSBOVUxMICYmCisJICAgICAgIGZvdW5kX3N5bWJvbCA9PSBOVUxMOworCSAgICAgICBtc3ltYm9sKyspCisJICAgIHsKKwkgICAgICBpZiAoU1lNQk9MX01BVENIRVNfTkFNRSAobXN5bWJvbCwgbmFtZSkgJiYgCisJCSAgKE1TWU1CT0xfVFlQRSAobXN5bWJvbCkgPT0gbXN0X3RleHQgfHwKKwkJICAgTVNZTUJPTF9UWVBFIChtc3ltYm9sKSA9PSBtc3RfZmlsZV90ZXh0KSkKKwkJeworCQkgIHN3aXRjaCAoTVNZTUJPTF9UWVBFIChtc3ltYm9sKSkKKwkJICAgIHsKKwkJICAgIGNhc2UgbXN0X2ZpbGVfdGV4dDoKKyNpZmRlZiBTT0ZVTl9BRERSRVNTX01BWUJFX01JU1NJTkcKKwkJICAgICAgaWYgKHNmaWxlID09IE5VTEwgfHwgU1RSRVEgKG1zeW1ib2wtPmZpbGVuYW1lLCBzZmlsZSkpCisJCQlmb3VuZF9maWxlX3N5bWJvbCA9IG1zeW1ib2w7CisjZWxzZQorCQkgICAgICAvKiBXZSBoYXZlIG5laXRoZXIgdGhlIGFiaWxpdHkgbm9yIHRoZSBuZWVkIHRvCisJCQkgZGVhbCB3aXRoIHRoZSBTRklMRSBwYXJhbWV0ZXIuICBJZiB3ZSBmaW5kCisJCQkgbW9yZSB0aGFuIG9uZSBzeW1ib2wsIGp1c3QgcmV0dXJuIHRoZSBsYXRlc3QKKwkJCSBvbmUgKHRoZSB1c2VyIGNhbid0IGV4cGVjdCB1c2VmdWwgYmVoYXZpb3IgaW4KKwkJCSB0aGF0IGNhc2UpLiAgKi8KKwkJICAgICAgZm91bmRfZmlsZV9zeW1ib2wgPSBtc3ltYm9sOworI2VuZGlmCisJCSAgICAgIGJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgZm91bmRfc3ltYm9sID0gbXN5bWJvbDsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgIC8qIEV4dGVybmFsIHN5bWJvbHMgYXJlIGJlc3QuICAqLworICBpZiAoZm91bmRfc3ltYm9sKQorICAgIHJldHVybiBmb3VuZF9zeW1ib2w7CisKKyAgLyogRmlsZS1sb2NhbCBzeW1ib2xzIGFyZSBuZXh0IGJlc3QuICAqLworICBpZiAoZm91bmRfZmlsZV9zeW1ib2wpCisgICAgcmV0dXJuIGZvdW5kX2ZpbGVfc3ltYm9sOworCisgIHJldHVybiBOVUxMOworfQorCisvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBjdXJyZW50IG1pbmltYWwgc3ltYm9sIHRhYmxlcyBhbmQgZmluZCB0aGUKKyAgIGZpcnN0IG1pbmltYWwgc3ltYm9sIHRoYXQgbWF0Y2hlcyBOQU1FIGFuZCBvZiBzb2xpYiB0cmFtcG9saW5lIHR5cGUuICAKKyAgIElmIE9CSkYgaXMgbm9uLU5VTEwsIGxpbWl0CisgICB0aGUgc2VhcmNoIHRvIHRoYXQgb2JqZmlsZS4gIElmIFNGSUxFIGlzIG5vbi1OVUxMLCBsaW1pdCB0aGUgc2VhcmNoCisgICB0byB0aGF0IHNvdXJjZSBmaWxlLiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG1pbmltYWwgc3ltYm9sIHRoYXQKKyAgIG1hdGNoZXMsIG9yIE5VTEwgaWYgbm8gbWF0Y2ggaXMgZm91bmQuCisqLworICAgCitzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKgorbG9va3VwX21pbmltYWxfc3ltYm9sX3NvbGliX3RyYW1wb2xpbmUgKG5hbWUsIHNmaWxlLCBvYmpmKQorICAgICByZWdpc3RlciBjb25zdCBjaGFyICpuYW1lOworICAgICBjb25zdCBjaGFyICpzZmlsZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamY7Cit7CisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqZm91bmRfc3ltYm9sID0gTlVMTDsKKworI2lmZGVmIFNPRlVOX0FERFJFU1NfTUFZQkVfTUlTU0lORworICBpZiAoc2ZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBjaGFyICpwID0gc3RycmNociAoc2ZpbGUsICcvJyk7CisgICAgICBpZiAocCAhPSBOVUxMKQorCXNmaWxlID0gcCArIDE7CisgICAgfQorI2VuZGlmCisKKyAgZm9yIChvYmpmaWxlID0gb2JqZWN0X2ZpbGVzOworICAgICAgIG9iamZpbGUgIT0gTlVMTCAmJiBmb3VuZF9zeW1ib2wgPT0gTlVMTDsKKyAgICAgICBvYmpmaWxlID0gb2JqZmlsZSAtPiBuZXh0KQorICAgIHsKKyAgICAgIGlmIChvYmpmID09IE5VTEwgfHwgb2JqZiA9PSBvYmpmaWxlKQorCXsKKwkgIGZvciAobXN5bWJvbCA9IG9iamZpbGUgLT4gbXN5bWJvbHM7CisJICAgICAgIG1zeW1ib2wgIT0gTlVMTCAmJiBTWU1CT0xfTkFNRSAobXN5bWJvbCkgIT0gTlVMTCAmJgorCSAgICAgICBmb3VuZF9zeW1ib2wgPT0gTlVMTDsKKwkgICAgICAgbXN5bWJvbCsrKQorCSAgICB7CisJICAgICAgaWYgKFNZTUJPTF9NQVRDSEVTX05BTUUgKG1zeW1ib2wsIG5hbWUpICYmIAorCQkgIE1TWU1CT0xfVFlQRSAobXN5bWJvbCkgPT0gbXN0X3NvbGliX3RyYW1wb2xpbmUpCisJCXJldHVybiBtc3ltYm9sOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworCisvKiBTZWFyY2ggdGhyb3VnaCB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGUgZm9yIGVhY2ggb2JqZmlsZSBhbmQgZmluZAorICAgdGhlIHN5bWJvbCB3aG9zZSBhZGRyZXNzIGlzIHRoZSBsYXJnZXN0IGFkZHJlc3MgdGhhdCBpcyBzdGlsbCBsZXNzCisgICB0aGFuIG9yIGVxdWFsIHRvIFBDLCBhbmQgbWF0Y2hlcyBTRUNUSU9OIChpZiBub24tbnVsbCkuICBSZXR1cm5zIGEKKyAgIHBvaW50ZXIgdG8gdGhlIG1pbmltYWwgc3ltYm9sIGlmIHN1Y2ggYSBzeW1ib2wgaXMgZm91bmQsIG9yIE5VTEwgaWYKKyAgIFBDIGlzIG5vdCBpbiBhIHN1aXRhYmxlIHJhbmdlLiAgTm90ZSB0aGF0IHdlIG5lZWQgdG8gbG9vayB0aHJvdWdoCisgICBBTEwgdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlcyBiZWZvcmUgZGVjaWRpbmcgb24gdGhlIHN5bWJvbCB0aGF0CisgICBjb21lcyBjbG9zZXN0IHRvIHRoZSBzcGVjaWZpZWQgUEMuICBUaGlzIGlzIGJlY2F1c2Ugb2JqZmlsZXMgY2FuCisgICBvdmVybGFwLCBmb3IgZXhhbXBsZSBvYmpmaWxlIEEgaGFzIC50ZXh0IGF0IDB4MTAwIGFuZCAuZGF0YSBhdAorICAgMHg0MDAwMCBhbmQgb2JqZmlsZSBCIGhhcyAudGV4dCBhdCAweDIzNCBhbmQgLmRhdGEgYXQgMHg0MDA0OC4gICovCisKK3N0cnVjdCBtaW5pbWFsX3N5bWJvbCAqCitsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGNfc2VjdGlvbiAocGMsIHNlY3Rpb24pCisgICAgIENPUkVfQUREUiBwYzsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247Cit7CisgIGludCBsbzsKKyAgaW50IGhpOworICBpbnQgbmV3OworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sOworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKmJlc3Rfc3ltYm9sID0gTlVMTDsKKworICAvKiBwYyBoYXMgdG8gYmUgaW4gYSBrbm93biBzZWN0aW9uLiBUaGlzIGVuc3VyZXMgdGhhdCBhbnl0aGluZyBiZXlvbmQKKyAgICAgdGhlIGVuZCBvZiB0aGUgbGFzdCBzZWdtZW50IGRvZXNuJ3QgYXBwZWFyIHRvIGJlIHBhcnQgb2YgdGhlIGxhc3QKKyAgICAgZnVuY3Rpb24gaW4gdGhlIGxhc3Qgc2VnbWVudC4gICovCisgIGlmIChmaW5kX3BjX3NlY3Rpb24gKHBjKSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIGZvciAob2JqZmlsZSA9IG9iamVjdF9maWxlczsKKyAgICAgICBvYmpmaWxlICE9IE5VTEw7CisgICAgICAgb2JqZmlsZSA9IG9iamZpbGUgLT4gbmV4dCkKKyAgICB7CisgICAgICAvKiBJZiB0aGlzIG9iamZpbGUgaGFzIGEgbWluaW1hbCBzeW1ib2wgdGFibGUsIGdvIHNlYXJjaCBpdCB1c2luZworCSBhIGJpbmFyeSBzZWFyY2guICBOb3RlIHRoYXQgYSBtaW5pbWFsIHN5bWJvbCB0YWJsZSBhbHdheXMgY29uc2lzdHMKKwkgb2YgYXQgbGVhc3QgdHdvIHN5bWJvbHMsIGEgInJlYWwiIHN5bWJvbCBhbmQgdGhlIHRlcm1pbmF0aW5nCisJICJudWxsIHN5bWJvbCIuICBJZiB0aGVyZSBhcmUgbm8gcmVhbCBzeW1ib2xzLCB0aGVuIHRoZXJlIGlzIG5vCisJIG1pbmltYWwgc3ltYm9sIHRhYmxlIGF0IGFsbC4gKi8KKworICAgICAgaWYgKChtc3ltYm9sID0gb2JqZmlsZSAtPiBtc3ltYm9scykgIT0gTlVMTCkKKwl7CisJICBsbyA9IDA7CisJICBoaSA9IG9iamZpbGUgLT4gbWluaW1hbF9zeW1ib2xfY291bnQgLSAxOworCisJICAvKiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSBtaW5pbWFsIHN5bWJvbHMgYXJlIHNvcnRlZCBieQorCSAgICAgYXNjZW5kaW5nIGFkZHJlc3MgdmFsdWVzLiAgSWYgdGhlIHBjIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvcgorCSAgICAgZXF1YWwgdG8gdGhlIGZpcnN0IHN5bWJvbCdzIGFkZHJlc3MsIHRoZW4gc29tZSBzeW1ib2wgaW4gdGhpcworCSAgICAgbWluaW1hbCBzeW1ib2wgdGFibGUgaXMgYSBzdWl0YWJsZSBjYW5kaWRhdGUgZm9yIGJlaW5nIHRoZQorCSAgICAgImJlc3QiIHN5bWJvbC4gIFRoaXMgaW5jbHVkZXMgdGhlIGxhc3QgcmVhbCBzeW1ib2wsIGZvciBjYXNlcworCSAgICAgd2hlcmUgdGhlIHBjIHZhbHVlIGlzIGxhcmdlciB0aGFuIGFueSBhZGRyZXNzIGluIHRoaXMgdmVjdG9yLgorCisJICAgICBCeSBpdGVyYXRpbmcgdW50aWwgdGhlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50CisJICAgICBoaSBpbmRleCAodGhlIGVuZHBvaW50IG9mIHRoZSB0ZXN0IGludGVydmFsKSBpcyBsZXNzIHRoYW4KKwkgICAgIG9yIGVxdWFsIHRvIHRoZSBkZXNpcmVkIHBjIHZhbHVlLCB3ZSBhY2NvbXBsaXNoIHR3byB0aGluZ3M6CisJICAgICAoMSkgdGhlIGNhc2Ugd2hlcmUgdGhlIHBjIHZhbHVlIGlzIGxhcmdlciB0aGFuIGFueSBtaW5pbWFsCisJICAgICBzeW1ib2wgYWRkcmVzcyBpcyB0cml2aWFsbHkgc29sdmVkLCAoMikgdGhlIGFkZHJlc3MgYXNzb2NpYXRlZAorCSAgICAgd2l0aCB0aGUgaGkgaW5kZXggaXMgYWx3YXlzIHRoZSBvbmUgd2Ugd2FudCB3aGVuIHRoZSBpbnRlcmF0aW9uCisJICAgICB0ZXJtaW5hdGVzLiAgSW4gZXNzZW5jZSwgd2UgYXJlIGl0ZXJhdGluZyB0aGUgdGVzdCBpbnRlcnZhbAorCSAgICAgZG93biB1bnRpbCB0aGUgcGMgdmFsdWUgaXMgcHVzaGVkIG91dCBvZiBpdCBmcm9tIHRoZSBoaWdoIGVuZC4KKworCSAgICAgV2FybmluZzogdGhpcyBjb2RlIGlzIHRyaWNraWVyIHRoYW4gaXQgd291bGQgYXBwZWFyIGF0IGZpcnN0LiAqLworCisJICAvKiBTaG91bGQgYWxzbyByZXF1aXJlIHRoYXQgcGMgaXMgPD0gZW5kIG9mIG9iamZpbGUuICBGSVhNRSEgKi8KKwkgIGlmIChwYyA+PSBTWU1CT0xfVkFMVUVfQUREUkVTUyAoJm1zeW1ib2xbbG9dKSkKKwkgICAgeworCSAgICAgIHdoaWxlIChTWU1CT0xfVkFMVUVfQUREUkVTUyAoJm1zeW1ib2xbaGldKSA+IHBjKQorCQl7CisJCSAgLyogcGMgaXMgc3RpbGwgc3RyaWN0bHkgbGVzcyB0aGFuIGhpZ2hlc3QgYWRkcmVzcyAqLworCQkgIC8qIE5vdGUgIm5ldyIgd2lsbCBhbHdheXMgYmUgPj0gbG8gKi8KKwkJICBuZXcgPSAobG8gKyBoaSkgLyAyOworCQkgIGlmICgoU1lNQk9MX1ZBTFVFX0FERFJFU1MgKCZtc3ltYm9sW25ld10pID49IHBjKSB8fAorCQkgICAgICAobG8gPT0gbmV3KSkKKwkJICAgIHsKKwkJICAgICAgaGkgPSBuZXc7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBsbyA9IG5ldzsKKwkJICAgIH0KKwkJfQorCisJICAgICAgLyogSWYgd2UgaGF2ZSBtdWx0aXBsZSBzeW1ib2xzIGF0IHRoZSBzYW1lIGFkZHJlc3MsIHdlIHdhbnQKKwkJIGhpIHRvIHBvaW50IHRvIHRoZSBsYXN0IG9uZS4gIFRoYXQgd2F5IHdlIGNhbiBmaW5kIHRoZQorCQkgcmlnaHQgc3ltYm9sIGlmIGl0IGhhcyBhbiBpbmRleCBncmVhdGVyIHRoYW4gaGkuICAqLworCSAgICAgIHdoaWxlIChoaSA8IG9iamZpbGUgLT4gbWluaW1hbF9zeW1ib2xfY291bnQgLSAxCisJCSAgICAgJiYgKFNZTUJPTF9WQUxVRV9BRERSRVNTICgmbXN5bWJvbFtoaV0pCisJCQkgPT0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKCZtc3ltYm9sW2hpKzFdKSkpCisJCWhpKys7CisKKwkgICAgICAvKiBUaGUgbWluaW1hbCBzeW1ib2wgaW5kZXhlZCBieSBoaSBub3cgaXMgdGhlIGJlc3Qgb25lIGluIHRoaXMKKwkJIG9iamZpbGUncyBtaW5pbWFsIHN5bWJvbCB0YWJsZS4gIFNlZSBpZiBpdCBpcyB0aGUgYmVzdCBvbmUKKwkJIG92ZXJhbGwuICovCisKKwkgICAgICAvKiBTa2lwIGFueSBhYnNvbHV0ZSBzeW1ib2xzLiAgVGhpcyBpcyBhcHBhcmVudGx5IHdoYXQgYWRiCisJCSBhbmQgZGJ4IGRvLCBhbmQgaXMgbmVlZGVkIGZvciB0aGUgQ00tNS4gIFRoZXJlIGFyZSB0d28KKwkJIGtub3duIHBvc3NpYmxlIHByb2JsZW1zOiAoMSkgb24gRUxGLCBhcHBhcmVudGx5IGVuZCwgZWRhdGEsCisJCSBldGMuIGFyZSBhYnNvbHV0ZS4gIE5vdCBzdXJlIGlnbm9yaW5nIHRoZW0gaGVyZSBpcyBhIGJpZworCQkgZGVhbCwgYnV0IGlmIHdlIHdhbnQgdG8gdXNlIHRoZW0sIHRoZSBmaXggd291bGQgZ28gaW4KKwkJIGVsZnJlYWQuYy4gICgyKSBJIHRoaW5rIHNoYXJlZCBsaWJyYXJ5IGVudHJ5IHBvaW50cyBvbiB0aGUKKwkJIE5lWFQgYXJlIGFic29sdXRlLiAgSWYgd2Ugd2FudCBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGlzCisJCSBpdCBwcm9iYWJseSBzaG91bGQgYmUgdHJpZ2dlcmVkIGJ5IGEgc3BlY2lhbAorCQkgbXN0X2Fic19vcl9saWIgb3Igc29tZSBzdWNoLiAgKi8KKwkgICAgICB3aGlsZSAoaGkgPj0gMAorCQkgICAgICYmIG1zeW1ib2xbaGldLnR5cGUgPT0gbXN0X2FicykKKwkJLS1oaTsKKworCSAgICAgIC8qIElmICJzZWN0aW9uIiBzcGVjaWZpZWQsIHNraXAgYW55IHN5bWJvbCBmcm9tIHdyb25nIHNlY3Rpb24gKi8KKwkgICAgICAvKiBUaGlzIGlzIHRoZSBuZXcgY29kZSB0aGF0IGRpc3Rpbmd1aXNoZXMgaXQgZnJvbSB0aGUgb2xkIGZ1bmN0aW9uICovCisJICAgICAgaWYgKHNlY3Rpb24pCisJCXdoaWxlIChoaSA+PSAwCisJCSAgICAgICAmJiBTWU1CT0xfQkZEX1NFQ1RJT04gKCZtc3ltYm9sW2hpXSkgIT0gc2VjdGlvbikKKwkJICAtLWhpOworCisJICAgICAgaWYgKGhpID49IDAKKwkJICAmJiAoKGJlc3Rfc3ltYm9sID09IE5VTEwpIHx8CisJCSAgICAgIChTWU1CT0xfVkFMVUVfQUREUkVTUyAoYmVzdF9zeW1ib2wpIDwgCisJCSAgICAgICBTWU1CT0xfVkFMVUVfQUREUkVTUyAoJm1zeW1ib2xbaGldKSkpKQorCQl7CisJCSAgYmVzdF9zeW1ib2wgPSAmbXN5bWJvbFtoaV07CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybiAoYmVzdF9zeW1ib2wpOworfQorCisvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5OiBzZWFyY2ggdGhyb3VnaCB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGUgCisgICBmb3IgYSBtYXRjaGluZyBQQyAobm8gc2VjdGlvbiBnaXZlbikgKi8KKworc3RydWN0IG1pbmltYWxfc3ltYm9sICoKK2xvb2t1cF9taW5pbWFsX3N5bWJvbF9ieV9wYyAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgcmV0dXJuIGxvb2t1cF9taW5pbWFsX3N5bWJvbF9ieV9wY19zZWN0aW9uIChwYywgZmluZF9wY19tYXBwZWRfc2VjdGlvbiAocGMpKTsKK30KKworI2lmZGVmIFNPRlVOX0FERFJFU1NfTUFZQkVfTUlTU0lORworQ09SRV9BRERSCitmaW5kX3N0YWJfZnVuY3Rpb25fYWRkciAobmFtZXN0cmluZywgcHN0LCBvYmpmaWxlKQorICAgICBjaGFyICpuYW1lc3RyaW5nOworICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bTsKKyAgY2hhciAqcDsKKyAgaW50IG47CisKKyAgcCA9IHN0cmNociAobmFtZXN0cmluZywgJzonKTsKKyAgaWYgKHAgPT0gTlVMTCkKKyAgICBwID0gbmFtZXN0cmluZzsKKyAgbiA9IHAgLSBuYW1lc3RyaW5nOworICBwID0gYWxsb2NhIChuICsgMik7CisgIHN0cm5jcHkgKHAsIG5hbWVzdHJpbmcsIG4pOworICBwW25dID0gMDsKKworICBtc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sIChwLCBwc3QtPmZpbGVuYW1lLCBvYmpmaWxlKTsKKyAgaWYgKG1zeW0gPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBTdW4gRm9ydHJhbiBhcHBlbmRzIGFuIHVuZGVyc2NvcmUgdG8gdGhlIG1pbmltYWwgc3ltYm9sIG5hbWUsCisJIHRyeSBhZ2FpbiB3aXRoIGFuIGFwcGVuZGVkIHVuZGVyc2NvcmUgaWYgdGhlIG1pbmltYWwgc3ltYm9sCisJIHdhcyBub3QgZm91bmQuICAqLworICAgICAgcFtuXSA9ICdfJzsKKyAgICAgIHBbbiArIDFdID0gMDsKKyAgICAgIG1zeW0gPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKHAsIHBzdC0+ZmlsZW5hbWUsIG9iamZpbGUpOworICAgIH0KKyAgcmV0dXJuIG1zeW0gPT0gTlVMTCA/IDAgOiBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bSk7Cit9CisjZW5kaWYgLyogU09GVU5fQUREUkVTU19NQVlCRV9NSVNTSU5HICovCisKKwwKKy8qIFJldHVybiBsZWFkaW5nIHN5bWJvbCBjaGFyYWN0ZXIgZm9yIGEgQkZELiBJZiBCRkQgaXMgTlVMTCwKKyAgIHJldHVybiB0aGUgbGVhZGluZyBzeW1ib2wgY2hhcmFjdGVyIGZyb20gdGhlIG1haW4gb2JqZmlsZS4gICovCisKK3N0YXRpYyBpbnQgZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgUEFSQU1TICgoYmZkICopKTsKKworc3RhdGljIGludAorZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpCisgICAgIGJmZCAqIGFiZmQ7Cit7CisgIGlmIChhYmZkICE9IE5VTEwpCisgICAgcmV0dXJuIGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCk7CisgIGlmIChzeW1maWxlX29iamZpbGUgIT0gTlVMTCAmJiBzeW1maWxlX29iamZpbGUtPm9iZmQgIT0gTlVMTCkKKyAgICByZXR1cm4gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChzeW1maWxlX29iamZpbGUtPm9iZmQpOworICByZXR1cm4gMDsKK30KKworLyogUHJlcGFyZSB0byBzdGFydCBjb2xsZWN0aW5nIG1pbmltYWwgc3ltYm9scy4gIE5vdGUgdGhhdCBwcmVzZXR0aW5nCisgICBtc3ltX2J1bmNoX2luZGV4IHRvIEJVTkNIX1NJWkUgY2F1c2VzIHRoZSBmaXJzdCBjYWxsIHRvIHNhdmUgYSBtaW5pbWFsCisgICBzeW1ib2wgdG8gYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGhlIGZpcnN0IGJ1bmNoLiAqLworCit2b2lkCitpbml0X21pbmltYWxfc3ltYm9sX2NvbGxlY3Rpb24gKCkKK3sKKyAgbXN5bV9jb3VudCA9IDA7CisgIG1zeW1fYnVuY2ggPSBOVUxMOworICBtc3ltX2J1bmNoX2luZGV4ID0gQlVOQ0hfU0laRTsKK30KKwordm9pZAorcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2wgKG5hbWUsIGFkZHJlc3MsIG1zX3R5cGUsIG9iamZpbGUpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIENPUkVfQUREUiBhZGRyZXNzOworICAgICBlbnVtIG1pbmltYWxfc3ltYm9sX3R5cGUgbXNfdHlwZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIGludCBzZWN0aW9uOworCisgIHN3aXRjaCAobXNfdHlwZSkKKyAgICB7CisgICAgY2FzZSBtc3RfdGV4dDoKKyAgICBjYXNlIG1zdF9maWxlX3RleHQ6CisgICAgY2FzZSBtc3Rfc29saWJfdHJhbXBvbGluZToKKyAgICAgIHNlY3Rpb24gPSBTRUNUX09GRl9URVhUOworICAgICAgYnJlYWs7CisgICAgY2FzZSBtc3RfZGF0YToKKyAgICBjYXNlIG1zdF9maWxlX2RhdGE6CisgICAgICBzZWN0aW9uID0gU0VDVF9PRkZfREFUQTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgbXN0X2JzczoKKyAgICBjYXNlIG1zdF9maWxlX2JzczoKKyAgICAgIHNlY3Rpb24gPSBTRUNUX09GRl9CU1M7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgc2VjdGlvbiA9IC0xOworICAgIH0KKworICBwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbF9hbmRfaW5mbyAobmFtZSwgYWRkcmVzcywgbXNfdHlwZSwKKwkJCQkgICAgICAgTlVMTCwgc2VjdGlvbiwgTlVMTCwgb2JqZmlsZSk7Cit9CisKKy8qIFJlY29yZCBhIG1pbmltYWwgc3ltYm9sIGluIHRoZSBtc3ltIGJ1bmNoZXMuICBSZXR1cm5zIHRoZSBzeW1ib2wKKyAgIG5ld2x5IGNyZWF0ZWQuICAqLworCitzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKgorcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2xfYW5kX2luZm8gKG5hbWUsIGFkZHJlc3MsIG1zX3R5cGUsIGluZm8sIHNlY3Rpb24sCisJCQkJICAgICBiZmRfc2VjdGlvbiwgb2JqZmlsZSkKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgQ09SRV9BRERSIGFkZHJlc3M7CisgICAgIGVudW0gbWluaW1hbF9zeW1ib2xfdHlwZSBtc190eXBlOworICAgICBjaGFyICppbmZvOworICAgICBpbnQgc2VjdGlvbjsKKyAgICAgYXNlY3Rpb24gKmJmZF9zZWN0aW9uOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IG1zeW1fYnVuY2ggKm5ldzsKKyAgcmVnaXN0ZXIgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sOworCisgIGlmIChtc190eXBlID09IG1zdF9maWxlX3RleHQpCisgICAgeworICAgICAgLyogRG9uJ3QgcHV0IGdjY19jb21waWxlZCwgX19nbnVfY29tcGlsZWRfY3BsdXMsIGFuZCBmcmllbmRzIGludG8KKwkgdGhlIG1pbmltYWwgc3ltYm9scywgYmVjYXVzZSBpZiB0aGVyZSBpcyBhbHNvIGFub3RoZXIgc3ltYm9sCisJIGF0IHRoZSBzYW1lIGFkZHJlc3MgKGUuZy4gdGhlIGZpcnN0IGZ1bmN0aW9uIG9mIHRoZSBmaWxlKSwKKwkgbG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjIHdvdWxkIGhhdmUgbm8gd2F5IG9mIGdldHRpbmcgdGhlCisJIHJpZ2h0IG9uZS4gICovCisgICAgICBpZiAobmFtZVswXSA9PSAnZycKKwkgICYmIChzdHJjbXAgKG5hbWUsIEdDQ19DT01QSUxFRF9GTEFHX1NZTUJPTCkgPT0gMAorCSAgICAgIHx8IHN0cmNtcCAobmFtZSwgR0NDMl9DT01QSUxFRF9GTEFHX1NZTUJPTCkgPT0gMCkpCisJcmV0dXJuIChOVUxMKTsKKworICAgICAgeworCWNvbnN0IGNoYXIgKnRlbXBzdHJpbmcgPSBuYW1lOworCWlmICh0ZW1wc3RyaW5nWzBdID09IGdldF9zeW1ib2xfbGVhZGluZ19jaGFyIChvYmpmaWxlLT5vYmZkKSkKKwkgICsrdGVtcHN0cmluZzsKKwlpZiAoU1RSRVFOICh0ZW1wc3RyaW5nLCAiX19nbnVfY29tcGlsZWQiLCAxNCkpCisJICByZXR1cm4gKE5VTEwpOworICAgICAgfQorICAgIH0KKworICBpZiAobXN5bV9idW5jaF9pbmRleCA9PSBCVU5DSF9TSVpFKQorICAgIHsKKyAgICAgIG5ldyA9IChzdHJ1Y3QgbXN5bV9idW5jaCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBtc3ltX2J1bmNoKSk7CisgICAgICBtc3ltX2J1bmNoX2luZGV4ID0gMDsKKyAgICAgIG5ldyAtPiBuZXh0ID0gbXN5bV9idW5jaDsKKyAgICAgIG1zeW1fYnVuY2ggPSBuZXc7CisgICAgfQorICBtc3ltYm9sID0gJm1zeW1fYnVuY2ggLT4gY29udGVudHNbbXN5bV9idW5jaF9pbmRleF07CisgIFNZTUJPTF9OQU1FIChtc3ltYm9sKSA9IG9ic2F2ZXN0cmluZyAoKGNoYXIgKikgbmFtZSwgc3RybGVuIChuYW1lKSwKKwkJCQkJJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrKTsKKyAgU1lNQk9MX0lOSVRfTEFOR1VBR0VfU1BFQ0lGSUMgKG1zeW1ib2wsIGxhbmd1YWdlX3Vua25vd24pOworICBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCkgPSBhZGRyZXNzOworICBTWU1CT0xfU0VDVElPTiAobXN5bWJvbCkgPSBzZWN0aW9uOworICBTWU1CT0xfQkZEX1NFQ1RJT04gKG1zeW1ib2wpID0gYmZkX3NlY3Rpb247CisKKyAgTVNZTUJPTF9UWVBFIChtc3ltYm9sKSA9IG1zX3R5cGU7CisgIC8qIEZJWE1FOiAgVGhpcyBpbmZvLCBpZiBpdCByZW1haW5zLCBuZWVkcyBpdHMgb3duIGZpZWxkLiAgKi8KKyAgTVNZTUJPTF9JTkZPIChtc3ltYm9sKSA9IGluZm87IC8qIEZJWE1FISAqLworICBtc3ltX2J1bmNoX2luZGV4Kys7CisgIG1zeW1fY291bnQrKzsKKyAgT0JKU1RBVCAob2JqZmlsZSwgbl9taW5zeW1zKyspOworICByZXR1cm4gbXN5bWJvbDsKK30KKworLyogQ29tcGFyZSB0d28gbWluaW1hbCBzeW1ib2xzIGJ5IGFkZHJlc3MgYW5kIHJldHVybiBhIHNpZ25lZCByZXN1bHQgYmFzZWQKKyAgIG9uIHVuc2lnbmVkIGNvbXBhcmlzb25zLCBzbyB0aGF0IHdlIHNvcnQgaW50byB1bnNpZ25lZCBudW1lcmljIG9yZGVyLiAgCisgICBXaXRoaW4gZ3JvdXBzIHdpdGggdGhlIHNhbWUgYWRkcmVzcywgc29ydCBieSBuYW1lLiAgKi8KKworc3RhdGljIGludAorY29tcGFyZV9taW5pbWFsX3N5bWJvbHMgKGZuMXAsIGZuMnApCisgICAgIGNvbnN0IFBUUiBmbjFwOworICAgICBjb25zdCBQVFIgZm4ycDsKK3sKKyAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1pbmltYWxfc3ltYm9sICpmbjE7CisgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqZm4yOworCisgIGZuMSA9IChjb25zdCBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKikgZm4xcDsKKyAgZm4yID0gKGNvbnN0IHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqKSBmbjJwOworCisgIGlmIChTWU1CT0xfVkFMVUVfQUREUkVTUyAoZm4xKSA8IFNZTUJPTF9WQUxVRV9BRERSRVNTIChmbjIpKQorICAgIHsKKyAgICAgIHJldHVybiAoLTEpOwkvKiBhZGRyIDEgaXMgbGVzcyB0aGFuIGFkZHIgMiAqLworICAgIH0KKyAgZWxzZSBpZiAoU1lNQk9MX1ZBTFVFX0FERFJFU1MgKGZuMSkgPiBTWU1CT0xfVkFMVUVfQUREUkVTUyAoZm4yKSkKKyAgICB7CisgICAgICByZXR1cm4gKDEpOwkvKiBhZGRyIDEgaXMgZ3JlYXRlciB0aGFuIGFkZHIgMiAqLworICAgIH0KKyAgZWxzZQkJCS8qIGFkZHJzIGFyZSBlcXVhbDogc29ydCBieSBuYW1lICovCisgICAgeworICAgICAgY2hhciAqbmFtZTEgPSBTWU1CT0xfTkFNRSAoZm4xKTsKKyAgICAgIGNoYXIgKm5hbWUyID0gU1lNQk9MX05BTUUgKGZuMik7CisKKyAgICAgIGlmIChuYW1lMSAmJiBuYW1lMikJLyogYm90aCBoYXZlIG5hbWVzICovCisJcmV0dXJuIHN0cmNtcCAobmFtZTEsIG5hbWUyKTsKKyAgICAgIGVsc2UgaWYgKG5hbWUyKQorCXJldHVybiAxOwkvKiBmbjEgaGFzIG5vIG5hbWUsIHNvIGl0IGlzICJsZXNzIiAqLworICAgICAgZWxzZSBpZiAobmFtZTEpCS8qIGZuMiBoYXMgbm8gbmFtZSwgc28gaXQgaXMgImxlc3MiICovCisJcmV0dXJuIC0xOworICAgICAgZWxzZQorCXJldHVybiAoMCk7CS8qIG5laXRoZXIgaGFzIGEgbmFtZSwgc28gdGhleSdyZSBlcXVhbC4gKi8KKyAgICB9Cit9CisKKy8qIERpc2NhcmQgdGhlIGN1cnJlbnRseSBjb2xsZWN0ZWQgbWluaW1hbCBzeW1ib2xzLCBpZiBhbnkuICBJZiB3ZSB3aXNoCisgICB0byBzYXZlIHRoZW0gZm9yIGxhdGVyIHVzZSwgd2UgbXVzdCBoYXZlIGFscmVhZHkgY29waWVkIHRoZW0gc29tZXdoZXJlCisgICBlbHNlIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisKKyAgIEZJWE1FOiAgV2UgY291bGQgYWxsb2NhdGUgdGhlIG1pbmltYWwgc3ltYm9sIGJ1bmNoZXMgb24gdGhlaXIgb3duCisgICBvYnN0YWNrIGFuZCB0aGVuIHNpbXBseSBibG93IHRoZSBvYnN0YWNrIGF3YXkgd2hlbiB3ZSBhcmUgZG9uZSB3aXRoCisgICBpdC4gIElzIGl0IHdvcnRoIHRoZSBleHRyYSB0cm91YmxlIHRob3VnaD8gKi8KKworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK2Rpc2NhcmRfbWluaW1hbF9zeW1ib2xzIChmb28pCisgICAgIGludCBmb287Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBtc3ltX2J1bmNoICpuZXh0OworCisgIHdoaWxlIChtc3ltX2J1bmNoICE9IE5VTEwpCisgICAgeworICAgICAgbmV4dCA9IG1zeW1fYnVuY2ggLT4gbmV4dDsKKyAgICAgIGZyZWUgKChQVFIpbXN5bV9idW5jaCk7CisgICAgICBtc3ltX2J1bmNoID0gbmV4dDsKKyAgICB9Cit9CisKKy8qIENvbXBhY3QgZHVwbGljYXRlIGVudHJpZXMgb3V0IG9mIGEgbWluaW1hbCBzeW1ib2wgdGFibGUgYnkgd2Fsa2luZworICAgdGhyb3VnaCB0aGUgdGFibGUgYW5kIGNvbXBhY3Rpbmcgb3V0IGVudHJpZXMgd2l0aCBkdXBsaWNhdGUgYWRkcmVzc2VzCisgICBhbmQgbWF0Y2hpbmcgbmFtZXMuICBSZXR1cm4gdGhlIG51bWJlciBvZiBlbnRyaWVzIHJlbWFpbmluZy4KKworICAgT24gZW50cnksIHRoZSB0YWJsZSByZXNpZGVzIGJldHdlZW4gbXN5bWJvbFswXSBhbmQgbXN5bWJvbFttY291bnRdLgorICAgT24gZXhpdCwgaXQgcmVzaWRlcyBiZXR3ZWVuIG1zeW1ib2xbMF0gYW5kIG1zeW1ib2xbcmVzdWx0X2NvdW50XS4KKworICAgV2hlbiBmaWxlcyBjb250YWluIG11bHRpcGxlIHNvdXJjZXMgb2Ygc3ltYm9sIGluZm9ybWF0aW9uLCBpdCBpcworICAgcG9zc2libGUgZm9yIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZSB0byBjb250YWluIG1hbnkgZHVwbGljYXRlIGVudHJpZXMuCisgICBBcyBhbiBleGFtcGxlLCBTVlI0IHN5c3RlbXMgdXNlIEVMRiBmb3JtYXR0ZWQgb2JqZWN0IGZpbGVzLCB3aGljaAorICAgdXN1YWxseSBjb250YWluIGF0IGxlYXN0IHR3byBkaWZmZXJlbnQgdHlwZXMgb2Ygc3ltYm9sIHRhYmxlcyAoYQorICAgc3RhbmRhcmQgRUxGIG9uZSBhbmQgYSBzbWFsbGVyIGR5bmFtaWMgbGlua2luZyB0YWJsZSksIGFzIHdlbGwgYXMKKyAgIERXQVJGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgZmlsZXMgY29tcGlsZWQgd2l0aCAtZy4KKworICAgV2l0aG91dCBjb21wYWN0aW5nLCB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGUgZm9yIGdkYiBpdHNlbGYgY29udGFpbnMKKyAgIG92ZXIgYSAxMDAwIGR1cGxpY2F0ZXMsIGFib3V0IGEgdGhpcmQgb2YgdGhlIHRvdGFsIHRhYmxlIHNpemUuICBBc2lkZQorICAgZnJvbSB0aGUgcG90ZW50aWFsIHRyYXAgb2Ygbm90IG5vdGljaW5nIHRoYXQgdHdvIHN1Y2Nlc3NpdmUgZW50cmllcworICAgaWRlbnRpZnkgdGhlIHNhbWUgbG9jYXRpb24sIHRoaXMgZHVwbGljYXRpb24gaW1wYWN0cyB0aGUgdGltZSByZXF1aXJlZAorICAgdG8gbGluZWFybHkgc2NhbiB0aGUgdGFibGUsIHdoaWNoIGlzIGRvbmUgaW4gYSBudW1iZXIgb2YgcGxhY2VzLiAgU28gd2UKKyAgIGp1c3QgZG8gb25lIGxpbmVhciBzY2FuIGhlcmUgYW5kIHRvc3Mgb3V0IHRoZSBkdXBsaWNhdGVzLgorCisgICBOb3RlIHRoYXQgd2UgYXJlIG5vdCBjb25jZXJuZWQgaGVyZSBhYm91dCByZWNvdmVyaW5nIHRoZSBzcGFjZSB0aGF0CisgICBpcyBwb3RlbnRpYWxseSBmcmVlZCB1cCwgYmVjYXVzZSB0aGUgc3RyaW5ncyB0aGVtc2VsdmVzIGFyZSBhbGxvY2F0ZWQKKyAgIG9uIHRoZSBzeW1ib2xfb2JzdGFjaywgYW5kIHdpbGwgZ2V0IGF1dG9tYXRpY2FsbHkgZnJlZWQgd2hlbiB0aGUgc3ltYm9sCisgICB0YWJsZSBpcyBmcmVlZC4gIFRoZSBjYWxsZXIgY2FuIGZyZWUgdXAgdGhlIHVudXNlZCBtaW5pbWFsIHN5bWJvbHMgYXQKKyAgIHRoZSBlbmQgb2YgdGhlIGNvbXBhY3RlZCByZWdpb24gaWYgdGhlaXIgYWxsb2NhdGlvbiBzdHJhdGVneSBhbGxvd3MgaXQuCisKKyAgIEFsc28gbm90ZSB3ZSBvbmx5IGdvIHVwIHRvIHRoZSBuZXh0IHRvIGxhc3QgZW50cnkgd2l0aGluIHRoZSBsb29wCisgICBhbmQgdGhlbiBjb3B5IHRoZSBsYXN0IGVudHJ5IGV4cGxpY2l0bHkgYWZ0ZXIgdGhlIGxvb3AgdGVybWluYXRlcy4KKworICAgU2luY2UgdGhlIGRpZmZlcmVudCBzb3VyY2VzIG9mIGluZm9ybWF0aW9uIGZvciBlYWNoIHN5bWJvbCBtYXkKKyAgIGhhdmUgZGlmZmVyZW50IGxldmVscyBvZiAiY29tcGxldGVuZXNzIiwgd2UgbWF5IGhhdmUgZHVwbGljYXRlcworICAgdGhhdCBoYXZlIG9uZSBlbnRyeSB3aXRoIHR5cGUgIm1zdF91bmtub3duIiBhbmQgdGhlIG90aGVyIHdpdGggYQorICAga25vd24gdHlwZS4gIFNvIGlmIHRoZSBvbmUgd2UgYXJlIGxlYXZpbmcgYWxvbmUgaGFzIHR5cGUgbXN0X3Vua25vd24sCisgICBvdmVyd3JpdGUgaXRzIHR5cGUgd2l0aCB0aGUgdHlwZSBmcm9tIHRoZSBvbmUgd2UgYXJlIGNvbXBhY3Rpbmcgb3V0LiAgKi8KKworc3RhdGljIGludAorY29tcGFjdF9taW5pbWFsX3N5bWJvbHMgKG1zeW1ib2wsIG1jb3VudCkKKyAgICAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sOworICAgICBpbnQgbWNvdW50OworeworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKmNvcHlmcm9tOworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKmNvcHl0bzsKKworICBpZiAobWNvdW50ID4gMCkKKyAgICB7CisgICAgICBjb3B5ZnJvbSA9IGNvcHl0byA9IG1zeW1ib2w7CisgICAgICB3aGlsZSAoY29weWZyb20gPCBtc3ltYm9sICsgbWNvdW50IC0gMSkKKwl7CisJICBpZiAoU1lNQk9MX1ZBTFVFX0FERFJFU1MgKGNvcHlmcm9tKSA9PSAKKwkgICAgICBTWU1CT0xfVkFMVUVfQUREUkVTUyAoKGNvcHlmcm9tICsgMSkpICYmCisJICAgICAgKFNUUkVRIChTWU1CT0xfTkFNRSAoY29weWZyb20pLCBTWU1CT0xfTkFNRSAoKGNvcHlmcm9tICsgMSkpKSkpCisJICAgIHsKKwkgICAgICBpZiAoTVNZTUJPTF9UWVBFKChjb3B5ZnJvbSArIDEpKSA9PSBtc3RfdW5rbm93bikKKwkJeworCQkgIE1TWU1CT0xfVFlQRSAoKGNvcHlmcm9tICsgMSkpID0gTVNZTUJPTF9UWVBFIChjb3B5ZnJvbSk7CisJCX0KKwkgICAgICBjb3B5ZnJvbSsrOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAqY29weXRvKysgPSAqY29weWZyb20rKzsKKwkgICAgfQorCX0KKyAgICAgICpjb3B5dG8rKyA9ICpjb3B5ZnJvbSsrOworICAgICAgbWNvdW50ID0gY29weXRvIC0gbXN5bWJvbDsKKyAgICB9CisgIHJldHVybiAobWNvdW50KTsKK30KKworLyogQWRkIHRoZSBtaW5pbWFsIHN5bWJvbHMgaW4gdGhlIGV4aXN0aW5nIGJ1bmNoZXMgdG8gdGhlIG9iamZpbGUncyBvZmZpY2lhbAorICAgbWluaW1hbCBzeW1ib2wgdGFibGUuICBJbiBtb3N0IGNhc2VzIHRoZXJlIGlzIG5vIG1pbmltYWwgc3ltYm9sIHRhYmxlIHlldAorICAgZm9yIHRoaXMgb2JqZmlsZSwgYW5kIHRoZSBleGlzdGluZyBidW5jaGVzIGFyZSB1c2VkIHRvIGNyZWF0ZSBvbmUuICBPbmNlCisgICBpbiBhIHdoaWxlIChmb3Igc2hhcmVkIGxpYnJhcmllcyBmb3IgZXhhbXBsZSksIHdlIGFkZCBzeW1ib2xzIChlLmcuIGNvbW1vbgorICAgc3ltYm9scykgdG8gYW4gZXhpc3Rpbmcgb2JqZmlsZS4KKworICAgQmVjYXVzZSBvZiB0aGUgd2F5IG1pbmltYWwgc3ltYm9scyBhcmUgY29sbGVjdGVkLCB3ZSBnZW5lcmFsbHkgaGF2ZSBubyB3YXkKKyAgIG9mIGtub3dpbmcgd2hhdCBzb3VyY2UgbGFuZ3VhZ2UgYXBwbGllcyB0byBhbnkgcGFydGljdWxhciBtaW5pbWFsIHN5bWJvbC4KKyAgIFNwZWNpZmljYWxseSwgd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZyBpZiB0aGUgbWluaW1hbCBzeW1ib2wgY29tZXMgZnJvbSBhCisgICBDKysgY29tcGlsYXRpb24gdW5pdCBvciBub3QuICBTbyBmb3IgdGhlIHNha2Ugb2Ygc3VwcG9ydGluZyBjYWNoZWQKKyAgIGRlbWFuZ2xlZCBDKysgbmFtZXMsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byB0cnkgYW5kIGRlbWFuZ2xlIGVhY2ggbmV3IG9uZQorICAgdGhhdCBjb21lcyBpbi4gIElmIHRoZSBkZW1hbmdsaW5nIHN1Y2NlZWRzLCB0aGVuIHdlIGFzc3VtZSBpdCBpcyBhIEMrKworICAgc3ltYm9sIGFuZCBzZXQgdGhlIHN5bWJvbCdzIGxhbmd1YWdlIGFuZCBkZW1hbmdsZWQgbmFtZSBmaWVsZHMKKyAgIGFwcHJvcHJpYXRlbHkuICBOb3RlIHRoYXQgaW4gb3JkZXIgdG8gYXZvaWQgdW5uZWNlc3NhcnkgZGVtYW5nbGluZ3MsIGFuZAorICAgYWxsb2NhdGluZyBvYnN0YWNrIHNwYWNlIHRoYXQgc3Vic2VxdWVudGx5IGNhbid0IGJlIGZyZWVkIGZvciB0aGUgZGVtYW5nbGVkCisgICBuYW1lcywgd2UgbWFyayBhbGwgbmV3bHkgYWRkZWQgc3ltYm9scyB3aXRoIGxhbmd1YWdlX2F1dG8uICBBZnRlcgorICAgY29tcGFjdGlvbiBvZiB0aGUgbWluaW1hbCBzeW1ib2xzLCB3ZSBnbyBiYWNrIGFuZCBzY2FuIHRoZSBlbnRpcmUgbWluaW1hbAorICAgc3ltYm9sIHRhYmxlIGxvb2tpbmcgZm9yIHRoZXNlIG5ldyBzeW1ib2xzLiAgRm9yIGVhY2ggbmV3IHN5bWJvbCB3ZSBhdHRlbXB0CisgICB0byBkZW1hbmdsZSBpdCwgYW5kIGlmIHN1Y2Nlc3NmdWwsIHJlY29yZCBpdCBhcyBhIGxhbmd1YWdlX2NwbHVzIHN5bWJvbAorICAgYW5kIGNhY2hlIHRoZSBkZW1hbmdsZWQgZm9ybSBvbiB0aGUgc3ltYm9sIG9ic3RhY2suICBTeW1ib2xzIHdoaWNoIGRvbid0CisgICBkZW1hbmdsZSBhcmUgbWFya2VkIGFzIGxhbmd1YWdlX3Vua25vd24gc3ltYm9scywgd2hpY2ggaW5oaWJpdHMgZnV0dXJlCisgICBhdHRlbXB0cyB0byBkZW1hbmdsZSB0aGVtIGlmIHdlIGxhdGVyIGFkZCBtb3JlIG1pbmltYWwgc3ltYm9scy4gKi8KKwordm9pZAoraW5zdGFsbF9taW5pbWFsX3N5bWJvbHMgKG9iamZpbGUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICByZWdpc3RlciBpbnQgYmluZGV4OworICByZWdpc3RlciBpbnQgbWNvdW50OworICByZWdpc3RlciBzdHJ1Y3QgbXN5bV9idW5jaCAqYnVuY2g7CisgIHJlZ2lzdGVyIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbHM7CisgIGludCBhbGxvY19jb3VudDsKKyAgcmVnaXN0ZXIgY2hhciBsZWFkaW5nX2NoYXI7CisKKyAgaWYgKG1zeW1fY291bnQgPiAwKQorICAgIHsKKyAgICAgIC8qIEFsbG9jYXRlIGVub3VnaCBzcGFjZSBpbiB0aGUgb2JzdGFjaywgaW50byB3aGljaCB3ZSB3aWxsIGdhdGhlciB0aGUKKwkgYnVuY2hlcyBvZiBuZXcgYW5kIGV4aXN0aW5nIG1pbmltYWwgc3ltYm9scywgc29ydCB0aGVtLCBhbmQgdGhlbgorCSBjb21wYWN0IG91dCB0aGUgZHVwbGljYXRlIGVudHJpZXMuICBPbmNlIHdlIGhhdmUgYSBmaW5hbCB0YWJsZSwKKwkgd2Ugd2lsbCBnaXZlIGJhY2sgdGhlIGV4Y2VzcyBzcGFjZS4gICovCisKKyAgICAgIGFsbG9jX2NvdW50ID0gbXN5bV9jb3VudCArIG9iamZpbGUtPm1pbmltYWxfc3ltYm9sX2NvdW50ICsgMTsKKyAgICAgIG9ic3RhY2tfYmxhbmsgKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywKKwkJICAgICBhbGxvY19jb3VudCAqIHNpemVvZiAoc3RydWN0IG1pbmltYWxfc3ltYm9sKSk7CisgICAgICBtc3ltYm9scyA9IChzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKikKKwkJIG9ic3RhY2tfYmFzZSAoJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrKTsKKworICAgICAgLyogQ29weSBpbiB0aGUgZXhpc3RpbmcgbWluaW1hbCBzeW1ib2xzLCBpZiB0aGVyZSBhcmUgYW55LiAgKi8KKworICAgICAgaWYgKG9iamZpbGUtPm1pbmltYWxfc3ltYm9sX2NvdW50KQorICAgICAgICBtZW1jcHkgKChjaGFyICopbXN5bWJvbHMsIChjaGFyICopb2JqZmlsZS0+bXN5bWJvbHMsIAorCQlvYmpmaWxlLT5taW5pbWFsX3N5bWJvbF9jb3VudCAqIHNpemVvZiAoc3RydWN0IG1pbmltYWxfc3ltYm9sKSk7CisKKyAgICAgIC8qIFdhbGsgdGhyb3VnaCB0aGUgbGlzdCBvZiBtaW5pbWFsIHN5bWJvbCBidW5jaGVzLCBhZGRpbmcgZWFjaCBzeW1ib2wKKwkgdG8gdGhlIG5ldyBjb250aWd1b3VzIGFycmF5IG9mIHN5bWJvbHMuICBOb3RlIHRoYXQgd2Ugc3RhcnQgd2l0aCB0aGUKKwkgY3VycmVudCwgcG9zc2libHkgcGFydGlhbGx5IGZpbGxlZCBidW5jaCAodGh1cyB3ZSB1c2UgdGhlIGN1cnJlbnQKKwkgbXN5bV9idW5jaF9pbmRleCBmb3IgdGhlIGZpcnN0IGJ1bmNoIHdlIGNvcHkgb3ZlciksIGFuZCB0aGVyZWFmdGVyCisJIGVhY2ggYnVuY2ggaXMgZnVsbC4gKi8KKyAgICAgIAorICAgICAgbWNvdW50ID0gb2JqZmlsZS0+bWluaW1hbF9zeW1ib2xfY291bnQ7CisgICAgICBsZWFkaW5nX2NoYXIgPSBnZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAob2JqZmlsZS0+b2JmZCk7CisgICAgICAKKyAgICAgIGZvciAoYnVuY2ggPSBtc3ltX2J1bmNoOyBidW5jaCAhPSBOVUxMOyBidW5jaCA9IGJ1bmNoIC0+IG5leHQpCisJeworCSAgZm9yIChiaW5kZXggPSAwOyBiaW5kZXggPCBtc3ltX2J1bmNoX2luZGV4OyBiaW5kZXgrKywgbWNvdW50KyspCisJICAgIHsKKwkgICAgICBtc3ltYm9sc1ttY291bnRdID0gYnVuY2ggLT4gY29udGVudHNbYmluZGV4XTsKKwkgICAgICBTWU1CT0xfTEFOR1VBR0UgKCZtc3ltYm9sc1ttY291bnRdKSA9IGxhbmd1YWdlX2F1dG87CisJICAgICAgaWYgKFNZTUJPTF9OQU1FICgmbXN5bWJvbHNbbWNvdW50XSlbMF0gPT0gbGVhZGluZ19jaGFyKQorCQl7CisJCSAgU1lNQk9MX05BTUUoJm1zeW1ib2xzW21jb3VudF0pKys7CisJCX0KKwkgICAgfQorCSAgbXN5bV9idW5jaF9pbmRleCA9IEJVTkNIX1NJWkU7CisJfQorCisgICAgICAvKiBTb3J0IHRoZSBtaW5pbWFsIHN5bWJvbHMgYnkgYWRkcmVzcy4gICovCisgICAgICAKKyAgICAgIHFzb3J0IChtc3ltYm9scywgbWNvdW50LCBzaXplb2YgKHN0cnVjdCBtaW5pbWFsX3N5bWJvbCksCisJICAgICBjb21wYXJlX21pbmltYWxfc3ltYm9scyk7CisgICAgICAKKyAgICAgIC8qIENvbXBhY3Qgb3V0IGFueSBkdXBsaWNhdGVzLCBhbmQgZnJlZSB1cCB3aGF0ZXZlciBzcGFjZSB3ZSBhcmUKKwkgbm8gbG9uZ2VyIHVzaW5nLiAgKi8KKyAgICAgIAorICAgICAgbWNvdW50ID0gY29tcGFjdF9taW5pbWFsX3N5bWJvbHMgKG1zeW1ib2xzLCBtY291bnQpOworCisgICAgICBvYnN0YWNrX2JsYW5rICgmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssCisJKG1jb3VudCArIDEgLSBhbGxvY19jb3VudCkgKiBzaXplb2YgKHN0cnVjdCBtaW5pbWFsX3N5bWJvbCkpOworICAgICAgbXN5bWJvbHMgPSAoc3RydWN0IG1pbmltYWxfc3ltYm9sICopCisJb2JzdGFja19maW5pc2ggKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjayk7CisKKyAgICAgIC8qIFdlIGFsc28gdGVybWluYXRlIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZSB3aXRoIGEgIm51bGwgc3ltYm9sIiwKKwkgd2hpY2ggaXMgKm5vdCogaW5jbHVkZWQgaW4gdGhlIHNpemUgb2YgdGhlIHRhYmxlLiAgVGhpcyBtYWtlcyBpdAorCSBlYXNpZXIgdG8gZmluZCB0aGUgZW5kIG9mIHRoZSB0YWJsZSB3aGVuIHdlIGFyZSBoYW5kZWQgYSBwb2ludGVyCisJIHRvIHNvbWUgc3ltYm9sIGluIHRoZSBtaWRkbGUgb2YgaXQuICBaZXJvIG91dCB0aGUgZmllbGRzIGluIHRoZQorCSAibnVsbCBzeW1ib2wiIGFsbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheS4gIE5vdGUgdGhhdCB0aGUKKwkgc3ltYm9sIGNvdW50IGRvZXMgKm5vdCogaW5jbHVkZSB0aGlzIG51bGwgc3ltYm9sLCB3aGljaCBpcyB3aHkgaXQKKwkgaXMgaW5kZXhlZCBieSBtY291bnQgYW5kIG5vdCBtY291bnQtMS4gKi8KKworICAgICAgU1lNQk9MX05BTUUgKCZtc3ltYm9sc1ttY291bnRdKSA9IE5VTEw7CisgICAgICBTWU1CT0xfVkFMVUVfQUREUkVTUyAoJm1zeW1ib2xzW21jb3VudF0pID0gMDsKKyAgICAgIE1TWU1CT0xfSU5GTyAoJm1zeW1ib2xzW21jb3VudF0pID0gTlVMTDsKKyAgICAgIE1TWU1CT0xfVFlQRSAoJm1zeW1ib2xzW21jb3VudF0pID0gbXN0X3Vua25vd247CisgICAgICBTWU1CT0xfSU5JVF9MQU5HVUFHRV9TUEVDSUZJQyAoJm1zeW1ib2xzW21jb3VudF0sIGxhbmd1YWdlX3Vua25vd24pOworCisgICAgICAvKiBBdHRhY2ggdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlIHRvIHRoZSBzcGVjaWZpZWQgb2JqZmlsZS4KKwkgVGhlIHN0cmluZ3MgdGhlbXNlbHZlcyBhcmUgYWxzbyBsb2NhdGVkIGluIHRoZSBzeW1ib2xfb2JzdGFjaworCSBvZiB0aGlzIG9iamZpbGUuICAqLworCisgICAgICBvYmpmaWxlIC0+IG1pbmltYWxfc3ltYm9sX2NvdW50ID0gbWNvdW50OworICAgICAgb2JqZmlsZSAtPiBtc3ltYm9scyA9IG1zeW1ib2xzOworCisgICAgICAvKiBOb3cgd2FsayB0aHJvdWdoIGFsbCB0aGUgbWluaW1hbCBzeW1ib2xzLCBzZWxlY3RpbmcgdGhlIG5ld2x5IGFkZGVkCisJIG9uZXMgYW5kIGF0dGVtcHRpbmcgdG8gY2FjaGUgdGhlaXIgQysrIGRlbWFuZ2xlZCBuYW1lcy4gKi8KKworICAgICAgZm9yICggOyBtY291bnQtLSA+IDAgOyBtc3ltYm9scysrKQorCXsKKwkgIFNZTUJPTF9JTklUX0RFTUFOR0xFRF9OQU1FIChtc3ltYm9scywgJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrKTsKKwl9CisgICAgfQorfQorCisvKiBTb3J0IGFsbCB0aGUgbWluaW1hbCBzeW1ib2xzIGluIE9CSkZJTEUuICAqLworCit2b2lkCittc3ltYm9sc19zb3J0IChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgcXNvcnQgKG9iamZpbGUtPm1zeW1ib2xzLCBvYmpmaWxlLT5taW5pbWFsX3N5bWJvbF9jb3VudCwKKwkgc2l6ZW9mIChzdHJ1Y3QgbWluaW1hbF9zeW1ib2wpLCBjb21wYXJlX21pbmltYWxfc3ltYm9scyk7Cit9CisKKy8qIENoZWNrIGlmIFBDIGlzIGluIGEgc2hhcmVkIGxpYnJhcnkgdHJhbXBvbGluZSBjb2RlIHN0dWIuCisgICBSZXR1cm4gbWluaW1hbCBzeW1ib2wgZm9yIHRoZSB0cmFtcG9saW5lIGVudHJ5IG9yIE5VTEwgaWYgUEMgaXMgbm90CisgICBpbiBhIHRyYW1wb2xpbmUgY29kZSBzdHViLiAgKi8KKworc3RydWN0IG1pbmltYWxfc3ltYm9sICoKK2xvb2t1cF9zb2xpYl90cmFtcG9saW5lX3N5bWJvbF9ieV9wYyAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sID0gbG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjIChwYyk7CisKKyAgaWYgKG1zeW1ib2wgIT0gTlVMTCAmJiBNU1lNQk9MX1RZUEUgKG1zeW1ib2wpID09IG1zdF9zb2xpYl90cmFtcG9saW5lKQorICAgIHJldHVybiBtc3ltYm9sOworICByZXR1cm4gTlVMTDsKK30KKworLyogSWYgUEMgaXMgaW4gYSBzaGFyZWQgbGlicmFyeSB0cmFtcG9saW5lIGNvZGUgc3R1YiwgcmV0dXJuIHRoZQorICAgYWRkcmVzcyBvZiB0aGUgYHJlYWwnIGZ1bmN0aW9uIGJlbG9uZ2luZyB0byB0aGUgc3R1Yi4KKyAgIFJldHVybiAwIGlmIFBDIGlzIG5vdCBpbiBhIHRyYW1wb2xpbmUgY29kZSBzdHViIG9yIGlmIHRoZSByZWFsCisgICBmdW5jdGlvbiBpcyBub3QgZm91bmQgaW4gdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlLgorCisgICBXZSBtYXkgZmFpbCB0byBmaW5kIHRoZSByaWdodCBmdW5jdGlvbiBpZiBhIGZ1bmN0aW9uIHdpdGggdGhlCisgICBzYW1lIG5hbWUgaXMgZGVmaW5lZCBpbiBtb3JlIHRoYW4gb25lIHNoYXJlZCBsaWJyYXJ5LCBidXQgdGhpcworICAgaXMgY29uc2lkZXJlZCBiYWQgcHJvZ3JhbW1pbmcgc3R5bGUuIFdlIGNvdWxkIHJldHVybiAwIGlmIHdlIGZpbmQKKyAgIGEgZHVwbGljYXRlIGZ1bmN0aW9uIGluIGNhc2UgdGhpcyBtYXR0ZXJzIHNvbWVkYXkuICAqLworCitDT1JFX0FERFIKK2ZpbmRfc29saWJfdHJhbXBvbGluZV90YXJnZXQgKHBjKQorICAgICBDT1JFX0FERFIgcGM7Cit7CisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqdHN5bWJvbCA9IGxvb2t1cF9zb2xpYl90cmFtcG9saW5lX3N5bWJvbF9ieV9wYyAocGMpOworCisgIGlmICh0c3ltYm9sICE9IE5VTEwpCisgICAgeworICAgICAgQUxMX01TWU1CT0xTIChvYmpmaWxlLCBtc3ltYm9sKQorCXsKKwkgIGlmIChNU1lNQk9MX1RZUEUgKG1zeW1ib2wpID09IG1zdF90ZXh0CisJICAgICAgJiYgU1RSRVEgKFNZTUJPTF9OQU1FIChtc3ltYm9sKSwgU1lNQk9MX05BTUUgKHRzeW1ib2wpKSkKKwkgICAgcmV0dXJuIFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKTsKKwl9CisgICAgfQorICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZ2RiL21pcHMtbmF0LmMgYi9nZGIvbWlwcy1uYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjU3MTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL21pcHMtbmF0LmMKQEAgLTAsMCArMSwyNDQgQEAKKy8qIExvdyBsZXZlbCBERUNzdGF0aW9uIGludGVyZmFjZSB0byBwdHJhY2UsIGZvciBHREIgd2hlbiBydW5uaW5nIG5hdGl2ZS4KKyAgIENvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkxLCAxOTkyLCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQWxlc3NhbmRybyBGb3JpbihhZkBjcy5jbXUuZWR1KSBhdCBDTVUKKyAgIGFuZCBieSBQZXIgQm90aG5lcihib3RobmVyQGNzLndpc2MuZWR1KSBhdCBVLldpc2NvbnNpbi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvdXNlci5oPgorI3VuZGVmIEpCX1MwCisjdW5kZWYgSkJfUzEKKyN1bmRlZiBKQl9TMgorI3VuZGVmIEpCX1MzCisjdW5kZWYgSkJfUzQKKyN1bmRlZiBKQl9TNQorI3VuZGVmIEpCX1M2CisjdW5kZWYgSkJfUzcKKyN1bmRlZiBKQl9TUAorI3VuZGVmIEpCX1M4CisjdW5kZWYgSkJfUEMKKyN1bmRlZiBKQl9TUgorI3VuZGVmIE5KQlJFR1MKKyNpbmNsdWRlIDxzZXRqbXAuaD4JCS8qIEZvciBKQl9YWFguICAqLworCisvKiBTaXplIG9mIGVsZW1lbnRzIGluIGptcGJ1ZiAqLworCisjZGVmaW5lIEpCX0VMRU1FTlRfU0laRSA0CisKKy8qIE1hcCBnZGIgaW50ZXJuYWwgcmVnaXN0ZXIgbnVtYmVyIHRvIHB0cmFjZSBgYGFkZHJlc3MnJy4KKyAgIFRoZXNlIGBgYWRkcmVzc2VzJycgYXJlIGRlZmluZWQgaW4gREVDc3RhdGlvbiA8c3lzL3B0cmFjZS5oPiAqLworCisjZGVmaW5lIFJFR0lTVEVSX1BUUkFDRV9BRERSKHJlZ25vKSBcCisgICAocmVnbm8gPCAzMiA/IAkJR1BSX0JBU0UgKyByZWdubyBcCisgIDogcmVnbm8gPT0gUENfUkVHTlVNID8JUEMJXAorICA6IHJlZ25vID09IENBVVNFX1JFR05VTSA/CUNBVVNFCVwKKyAgOiByZWdubyA9PSBISV9SRUdOVU0gPwlNTUhJCVwKKyAgOiByZWdubyA9PSBMT19SRUdOVU0gPwlNTUxPCVwKKyAgOiByZWdubyA9PSBGQ1JDU19SRUdOVU0gPwlGUENfQ1NSCVwKKyAgOiByZWdubyA9PSBGQ1JJUl9SRUdOVU0gPwlGUENfRUlSCVwKKyAgOiByZWdubyA+PSBGUDBfUkVHTlVNID8JRlBSX0JBU0UgKyAocmVnbm8gLSBGUDBfUkVHTlVNKSBcCisgIDogMCkKKworc3RhdGljIGNoYXIgemVyb2J1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdID0gezB9OworCitzdGF0aWMgdm9pZCBmZXRjaF9jb3JlX3JlZ2lzdGVycyBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkLCBpbnQsIENPUkVfQUREUikpOworCisvKiBHZXQgYWxsIHJlZ2lzdGVycyBmcm9tIHRoZSBpbmZlcmlvciAqLworCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZWdhZGRyOworICBjaGFyIGJ1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworICByZWdpc3RlciBpbnQgaTsKKworICByZWdpc3RlcnNfZmV0Y2hlZCAoKTsKKworICBmb3IgKHJlZ25vID0gMTsgcmVnbm8gPCBOVU1fUkVHUzsgcmVnbm8rKykKKyAgICB7CisgICAgICByZWdhZGRyID0gUkVHSVNURVJfUFRSQUNFX0FERFIgKHJlZ25vKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pOyBpICs9IHNpemVvZiAoaW50KSkKKyAJeworIAkgICooaW50ICopICZidWZbaV0gPSBwdHJhY2UgKFBUX1JFQURfVSwgaW5mZXJpb3JfcGlkLAorCQkJCSAgICAgKFBUUkFDRV9BUkczX1RZUEUpIHJlZ2FkZHIsIDApOworIAkgIHJlZ2FkZHIgKz0gc2l6ZW9mIChpbnQpOworIAl9CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCBidWYpOworICAgIH0KKworICBzdXBwbHlfcmVnaXN0ZXIgKFpFUk9fUkVHTlVNLCB6ZXJvYnVmKTsKKyAgLyogRnJhbWUgcHRyIHJlZyBtdXN0IGFwcGVhciB0byBiZSAwOyBpdCBpcyBmYWtlZCBieSBzdGFjayBoYW5kbGluZyBjb2RlLiAqLworICBzdXBwbHlfcmVnaXN0ZXIgKEZQX1JFR05VTSwgemVyb2J1Zik7Cit9CisKKy8qIFN0b3JlIG91ciByZWdpc3RlciB2YWx1ZXMgYmFjayBpbnRvIHRoZSBpbmZlcmlvci4KKyAgIElmIFJFR05PIGlzIC0xLCBkbyB0aGlzIGZvciBhbGwgcmVnaXN0ZXJzLgorICAgT3RoZXJ3aXNlLCBSRUdOTyBzcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXIgKHNvIHdlIGNhbiBzYXZlIHRpbWUpLiAgKi8KKwordm9pZAorc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgcmVnYWRkcjsKKyAgY2hhciBidWZbODBdOworCisgIGlmIChyZWdubyA+IDApCisgICAgeworICAgICAgaWYgKHJlZ25vID09IFpFUk9fUkVHTlVNIHx8IHJlZ25vID09IFBTX1JFR05VTQorCSAgfHwgcmVnbm8gPT0gQkFEVkFERFJfUkVHTlVNIHx8IHJlZ25vID09IENBVVNFX1JFR05VTQorCSAgfHwgcmVnbm8gPT0gRkNSSVJfUkVHTlVNIHx8IHJlZ25vID09IEZQX1JFR05VTQorCSAgfHwgKHJlZ25vID49IEZJUlNUX0VNQkVEX1JFR05VTSAmJiByZWdubyA8PSBMQVNUX0VNQkVEX1JFR05VTSkpCisJcmV0dXJuOworICAgICAgcmVnYWRkciA9IFJFR0lTVEVSX1BUUkFDRV9BRERSIChyZWdubyk7CisgICAgICBlcnJubyA9IDA7CisgICAgICBwdHJhY2UgKFBUX1dSSVRFX1UsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIHJlZ2FkZHIsCisJICAgICAgcmVhZF9yZWdpc3RlciAocmVnbm8pKTsKKyAgICAgIGlmIChlcnJubyAhPSAwKQorCXsKKwkgIHNwcmludGYgKGJ1ZiwgIndyaXRpbmcgcmVnaXN0ZXIgbnVtYmVyICVkIiwgcmVnbm8pOworCSAgcGVycm9yX3dpdGhfbmFtZSAoYnVmKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgTlVNX1JFR1M7IHJlZ25vKyspCisJc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChyZWdubyk7CisgICAgfQorfQorCisKKy8qIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIGxvbmdqbXAgd2lsbCBsYW5kLgorICAgV2UgZXhwZWN0IHRoZSBmaXJzdCBhcmcgdG8gYmUgYSBwb2ludGVyIHRvIHRoZSBqbXBfYnVmIHN0cnVjdHVyZSBmcm9tIHdoaWNoCisgICB3ZSBleHRyYWN0IHRoZSBwYyAoSkJfUEMpIHRoYXQgd2Ugd2lsbCBsYW5kIGF0LiAgVGhlIHBjIGlzIGNvcGllZCBpbnRvIFBDLgorICAgVGhpcyByb3V0aW5lIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiAqLworCitpbnQKK2dldF9sb25nam1wX3RhcmdldChwYykKKyAgICAgQ09SRV9BRERSICpwYzsKK3sKKyAgQ09SRV9BRERSIGpiX2FkZHI7CisgIGNoYXIgYnVmW1RBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUXTsKKworICBqYl9hZGRyID0gcmVhZF9yZWdpc3RlciAoQTBfUkVHTlVNKTsKKworICBpZiAodGFyZ2V0X3JlYWRfbWVtb3J5IChqYl9hZGRyICsgSkJfUEMgKiBKQl9FTEVNRU5UX1NJWkUsIGJ1ZiwKKwkJCSAgVEFSR0VUX1BUUl9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQpKQorICAgIHJldHVybiAwOworCisgICpwYyA9IGV4dHJhY3RfYWRkcmVzcyAoYnVmLCBUQVJHRVRfUFRSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCk7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIEV4dHJhY3QgdGhlIHJlZ2lzdGVyIHZhbHVlcyBvdXQgb2YgdGhlIGNvcmUgZmlsZSBhbmQgc3RvcmUKKyAgIHRoZW0gd2hlcmUgYHJlYWRfcmVnaXN0ZXInIHdpbGwgZmluZCB0aGVtLgorCisgICBDT1JFX1JFR19TRUNUIHBvaW50cyB0byB0aGUgcmVnaXN0ZXIgdmFsdWVzIHRoZW1zZWx2ZXMsIHJlYWQgaW50byBtZW1vcnkuCisgICBDT1JFX1JFR19TSVpFIGlzIHRoZSBzaXplIG9mIHRoYXQgYXJlYS4KKyAgIFdISUNIIHNheXMgd2hpY2ggc2V0IG9mIHJlZ2lzdGVycyB3ZSBhcmUgaGFuZGxpbmcgKDAgPSBpbnQsIDIgPSBmbG9hdAorICAgICAgICAgb24gbWFjaGluZXMgd2hlcmUgdGhleSBhcmUgZGlzY29udGlndW91cykuCisgICBSRUdfQUREUiBpcyB0aGUgb2Zmc2V0IGZyb20gdS51X2FyMCB0byB0aGUgcmVnaXN0ZXIgdmFsdWVzIHJlbGF0aXZlIHRvCisgICAgICAgICAgICBjb3JlX3JlZ19zZWN0LiAgVGhpcyBpcyB1c2VkIHdpdGggb2xkLWZhc2hpb25lZCBjb3JlIGZpbGVzIHRvCisJICAgIGxvY2F0ZSB0aGUgcmVnaXN0ZXJzIGluIGEgbGFyZ2UgdXBhZ2UtcGx1cy1zdGFjayAiLnJlZyIgc2VjdGlvbi4KKwkgICAgT3JpZ2luYWwgdXBhZ2UgYWRkcmVzcyBYIGlzIGF0IGxvY2F0aW9uIGNvcmVfcmVnX3NlY3QreCtyZWdfYWRkci4KKyAqLworCitzdGF0aWMgdm9pZAorZmV0Y2hfY29yZV9yZWdpc3RlcnMgKGNvcmVfcmVnX3NlY3QsIGNvcmVfcmVnX3NpemUsIHdoaWNoLCByZWdfYWRkcikKKyAgICAgY2hhciAqY29yZV9yZWdfc2VjdDsKKyAgICAgdW5zaWduZWQgY29yZV9yZWdfc2l6ZTsKKyAgICAgaW50IHdoaWNoOworICAgICBDT1JFX0FERFIgcmVnX2FkZHI7Cit7CisgIHJlZ2lzdGVyIGludCByZWdubzsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGFkZHI7CisgIGludCBiYWRfcmVnID0gLTE7CisgIHJlZ2lzdGVyIHJlZ19wdHIgPSAtcmVnX2FkZHI7CQkvKiBPcmlnaW5hbCB1LnVfYXIwIGlzIC1yZWdfYWRkci4gKi8KKworICAvKiBJZiB1LnVfYXIwIHdhcyBhbiBhYnNvbHV0ZSBhZGRyZXNzIGluIHRoZSBjb3JlIGZpbGUsIHJlbGF0aXZpemUgaXQgbm93LAorICAgICBzbyB3ZSBjYW4gdXNlIGl0IGFzIGFuIG9mZnNldCBpbnRvIGNvcmVfcmVnX3NlY3QuICBXaGVuIHdlJ3JlIGRvbmUsCisgICAgICJyZWdpc3RlciAwIiB3aWxsIGJlIGF0IGNvcmVfcmVnX3NlY3QrcmVnX3B0ciwgYW5kIHdlIGNhbiB1c2UKKyAgICAgcmVnaXN0ZXJfYWRkciB0byBvZmZzZXQgdG8gdGhlIG90aGVyIHJlZ2lzdGVycy4gIElmIHRoaXMgaXMgYSBtb2Rlcm4KKyAgICAgY29yZSBmaWxlIHdpdGhvdXQgYSB1cGFnZSwgcmVnX3B0ciB3aWxsIGJlIHplcm8gYW5kIHRoaXMgaXMgYWxsIGEgYmlnCisgICAgIE5PUC4gICovCisgIGlmIChyZWdfcHRyID4gY29yZV9yZWdfc2l6ZSkKKyNpZmRlZiBLRVJORUxfVV9BRERSCisgICAgcmVnX3B0ciAtPSBLRVJORUxfVV9BRERSOworI2Vsc2UKKyAgICBlcnJvciAoIk9sZCBtaXBzIGNvcmUgZmlsZSBjYW4ndCBiZSBwcm9jZXNzZWQgb24gdGhpcyBtYWNoaW5lLiIpOworI2VuZGlmCisKKyAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgTlVNX1JFR1M7IHJlZ25vKyspCisgICAgeworICAgICAgYWRkciA9IHJlZ2lzdGVyX2FkZHIgKHJlZ25vLCByZWdfcHRyKTsKKyAgICAgIGlmIChhZGRyID49IGNvcmVfcmVnX3NpemUpIHsKKwlpZiAoYmFkX3JlZyA8IDApCisJICBiYWRfcmVnID0gcmVnbm87CisgICAgICB9IGVsc2UgeworCXN1cHBseV9yZWdpc3RlciAocmVnbm8sIGNvcmVfcmVnX3NlY3QgKyBhZGRyKTsKKyAgICAgIH0KKyAgICB9CisgIGlmIChiYWRfcmVnID49IDApCisgICAgeworICAgICAgZXJyb3IgKCJSZWdpc3RlciAlcyBub3QgZm91bmQgaW4gY29yZSBmaWxlLiIsIFJFR0lTVEVSX05BTUUgKGJhZF9yZWcpKTsKKyAgICB9CisgIHN1cHBseV9yZWdpc3RlciAoWkVST19SRUdOVU0sIHplcm9idWYpOworICAvKiBGcmFtZSBwdHIgcmVnIG11c3QgYXBwZWFyIHRvIGJlIDA7IGl0IGlzIGZha2VkIGJ5IHN0YWNrIGhhbmRsaW5nIGNvZGUuICovCisgIHN1cHBseV9yZWdpc3RlciAoRlBfUkVHTlVNLCB6ZXJvYnVmKTsKK30KKworLyogUmV0dXJuIHRoZSBhZGRyZXNzIGluIHRoZSBjb3JlIGR1bXAgb3IgaW5mZXJpb3Igb2YgcmVnaXN0ZXIgUkVHTk8uCisgICBCTE9DS0VORCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSB1c2VyIHN0cnVjdHVyZS4gICovCisKK0NPUkVfQUREUgorcmVnaXN0ZXJfYWRkciAocmVnbm8sIGJsb2NrZW5kKQorICAgICBpbnQgcmVnbm87CisgICAgIENPUkVfQUREUiBibG9ja2VuZDsKK3sKKyAgQ09SRV9BRERSIGFkZHI7CisKKyAgaWYgKHJlZ25vIDwgMCB8fCByZWdubyA+PSBOVU1fUkVHUykKKyAgICBlcnJvciAoIkludmFsaWQgcmVnaXN0ZXIgbnVtYmVyICVkLiIsIHJlZ25vKTsKKworICBSRUdJU1RFUl9VX0FERFIgKGFkZHIsIGJsb2NrZW5kLCByZWdubyk7CisKKyAgcmV0dXJuIGFkZHI7Cit9CisKKwwKKy8qIFJlZ2lzdGVyIHRoYXQgd2UgYXJlIGFibGUgdG8gaGFuZGxlIG1pcHMgY29yZSBmaWxlIGZvcm1hdHMuCisgICBGSVhNRTogaXMgdGhpcyByZWFsbHkgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXI/ICovCisKK3N0YXRpYyBzdHJ1Y3QgY29yZV9mbnMgbWlwc19jb3JlX2ZucyA9Cit7CisgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAorICBmZXRjaF9jb3JlX3JlZ2lzdGVycywKKyAgTlVMTAorfTsKKwordm9pZAorX2luaXRpYWxpemVfY29yZV9taXBzICgpCit7CisgIGFkZF9jb3JlX2ZucyAoJm1pcHNfY29yZV9mbnMpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL21pcHMtdGRlcC5jIGIvZ2RiL21pcHMtdGRlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YWEyYmIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbWlwcy10ZGVwLmMKQEAgLTAsMCArMSwzMjU5IEBACisvKiBUYXJnZXQtZGVwZW5kZW50IGNvZGUgZm9yIHRoZSBNSVBTIGFyY2hpdGVjdHVyZSwgZm9yIEdEQiwgdGhlIEdOVSBEZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEFsZXNzYW5kcm8gRm9yaW4oYWZAY3MuY211LmVkdSkgYXQgQ01VCisgICBhbmQgYnkgUGVyIEJvdGhuZXIoYm90aG5lckBjcy53aXNjLmVkdSkgYXQgVS5XaXNjb25zaW4uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgIm9iamZpbGVzLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKworI2luY2x1ZGUgIm9wY29kZS9taXBzLmgiCisKKy8qIFNvbWUgTUlQUyBib2FyZHMgZG9uJ3Qgc3VwcG9ydCBmbG9hdGluZyBwb2ludCwgc28gd2UgcGVybWl0IHRoZQorICAgdXNlciB0byB0dXJuIGl0IG9mZi4gICovCisKK2VudW0gbWlwc19mcHVfdHlwZQoreworICBNSVBTX0ZQVV9ET1VCTEUsCS8qIEZ1bGwgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludC4gICovCisgIE1JUFNfRlBVX1NJTkdMRSwJLyogU2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCAoUjQ2NTApLiAgKi8KKyAgTUlQU19GUFVfTk9ORQkJLyogTm8gZmxvYXRpbmcgcG9pbnQuICAqLworfTsKKworI2lmbmRlZiBNSVBTX0RFRkFVTFRfRlBVX1RZUEUKKyNkZWZpbmUgTUlQU19ERUZBVUxUX0ZQVV9UWVBFIE1JUFNfRlBVX0RPVUJMRQorI2VuZGlmCitzdGF0aWMgaW50IG1pcHNfZnB1X3R5cGVfYXV0byA9IDE7CitzdGF0aWMgZW51bSBtaXBzX2ZwdV90eXBlIG1pcHNfZnB1X3R5cGUgPSBNSVBTX0RFRkFVTFRfRlBVX1RZUEU7CisjZGVmaW5lIE1JUFNfRlBVX1RZUEUgbWlwc19mcHVfdHlwZQorCisKKyNkZWZpbmUgVk1fTUlOX0FERFJFU1MgKENPUkVfQUREUikweDQwMDAwMAorCisvKiBEbyBub3QgdXNlICJUQVJHRVRfSVNfTUlQUzY0IiB0byB0ZXN0IHRoZSBzaXplIG9mIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAqLworI2RlZmluZSBGUF9SRUdJU1RFUl9ET1VCTEUgKFJFR0lTVEVSX1ZJUlRVQUxfU0laRShGUDBfUkVHTlVNKSA9PSA4KQorCisjaWYgMAorc3RhdGljIGludCBtaXBzX2luX2xlbmllbnRfcHJvbG9ndWUgUEFSQU1TICgoQ09SRV9BRERSLCBDT1JFX0FERFIpKTsKKyNlbmRpZgorCitpbnQgZ2RiX3ByaW50X2luc25fbWlwcyBQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKKworc3RhdGljIHZvaWQgbWlwc19wcmludF9yZWdpc3RlciBQQVJBTVMgKChpbnQsIGludCkpOworCitzdGF0aWMgbWlwc19leHRyYV9mdW5jX2luZm9fdAoraGV1cmlzdGljX3Byb2NfZGVzYyBQQVJBTVMgKChDT1JFX0FERFIsIENPUkVfQUREUiwgc3RydWN0IGZyYW1lX2luZm8gKikpOworCitzdGF0aWMgQ09SRV9BRERSIGhldXJpc3RpY19wcm9jX3N0YXJ0IFBBUkFNUyAoKENPUkVfQUREUikpOworCitzdGF0aWMgQ09SRV9BRERSIHJlYWRfbmV4dF9mcmFtZV9yZWcgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKiwgaW50KSk7CisKK3ZvaWQgbWlwc19zZXRfcHJvY2Vzc29yX3R5cGVfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitpbnQgbWlwc19zZXRfcHJvY2Vzc29yX3R5cGUgUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyB2b2lkIG1pcHNfc2hvd19wcm9jZXNzb3JfdHlwZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHJlaW5pdF9mcmFtZV9jYWNoZV9zZnVuYyBQQVJBTVMgKChjaGFyICosIGludCwKKwkJCQkJICAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKikpOworCitzdGF0aWMgbWlwc19leHRyYV9mdW5jX2luZm9fdAorICBmaW5kX3Byb2NfZGVzYyBQQVJBTVMgKChDT1JFX0FERFIgcGMsIHN0cnVjdCBmcmFtZV9pbmZvICpuZXh0X2ZyYW1lKSk7CisKK3N0YXRpYyBDT1JFX0FERFIgYWZ0ZXJfcHJvbG9ndWUgUEFSQU1TICgoQ09SRV9BRERSIHBjLAorCQkJCQkgbWlwc19leHRyYV9mdW5jX2luZm9fdCBwcm9jX2Rlc2MpKTsKKworLyogVGhpcyB2YWx1ZSBpcyB0aGUgbW9kZWwgb2YgTUlQUyBpbiB1c2UuICBJdCBpcyBkZXJpdmVkIGZyb20gdGhlIHZhbHVlCisgICBvZiB0aGUgUHJJRCByZWdpc3Rlci4gICovCisKK2NoYXIgKm1pcHNfcHJvY2Vzc29yX3R5cGU7CisKK2NoYXIgKnRtcF9taXBzX3Byb2Nlc3Nvcl90eXBlOworCisvKiBBIHNldCBvZiBvcmlnaW5hbCBuYW1lcywgdG8gYmUgdXNlZCB3aGVuIHJlc3RvcmluZyBiYWNrIHRvIGdlbmVyaWMKKyAgIHJlZ2lzdGVycyBmcm9tIGEgc3BlY2lmaWMgc2V0LiAgKi8KKworY2hhciAqbWlwc19nZW5lcmljX3JlZ19uYW1lc1tdID0gUkVHSVNURVJfTkFNRVM7CisKKy8qIE5hbWVzIG9mIElEVCBSMzA0MSByZWdpc3RlcnMuICAqLworCitjaGFyICptaXBzX3IzMDQxX3JlZ19uYW1lc1tdID0geworCSJ6ZXJvIiwJImF0IiwJInYwIiwJInYxIiwJImEwIiwJImExIiwJImEyIiwJImEzIiwKKwkidDAiLAkidDEiLAkidDIiLAkidDMiLAkidDQiLAkidDUiLAkidDYiLAkidDciLAorCSJzMCIsCSJzMSIsCSJzMiIsCSJzMyIsCSJzNCIsCSJzNSIsCSJzNiIsCSJzNyIsCisJInQ4IiwJInQ5IiwJImswIiwJImsxIiwJImdwIiwJInNwIiwJInM4IiwJInJhIiwKKwkic3IiLAkibG8iLAkiaGkiLAkiYmFkIiwJImNhdXNlIiwicGMiLAorCSJmMCIsICAgImYxIiwgICAiZjIiLCAgICJmMyIsICAgImY0IiwgICAiZjUiLCAgICJmNiIsICAgImY3IiwKKwkiZjgiLCAgICJmOSIsICAgImYxMCIsICAiZjExIiwgICJmMTIiLCAgImYxMyIsICAiZjE0IiwgICJmMTUiLAorCSJmMTYiLCAgImYxNyIsICAiZjE4IiwgICJmMTkiLCAgImYyMCIsICAiZjIxIiwgICJmMjIiLCAgImYyMyIsCisJImYyNCIsICAiZjI1IiwgICJmMjYiLCAgImYyNyIsICAiZjI4IiwgICJmMjkiLCAgImYzMCIsICAiZjMxIiwKKwkiZnNyIiwgICJmaXIiLCAgImZwIiwJIiIsCisJIiIsCSIiLAkiYnVzIiwJImNjZmciLAkiIiwJIiIsCSIiLAkiIiwKKwkiIiwJIiIsCSJwb3J0IiwJImNtcCIsCSIiLAkiIiwJImVwYyIsCSJwcmlkIiwKK307CisKKy8qIE5hbWVzIG9mIElEVCBSMzA1MSByZWdpc3RlcnMuICAqLworCitjaGFyICptaXBzX3IzMDUxX3JlZ19uYW1lc1tdID0geworCSJ6ZXJvIiwJImF0IiwJInYwIiwJInYxIiwJImEwIiwJImExIiwJImEyIiwJImEzIiwKKwkidDAiLAkidDEiLAkidDIiLAkidDMiLAkidDQiLAkidDUiLAkidDYiLAkidDciLAorCSJzMCIsCSJzMSIsCSJzMiIsCSJzMyIsCSJzNCIsCSJzNSIsCSJzNiIsCSJzNyIsCisJInQ4IiwJInQ5IiwJImswIiwJImsxIiwJImdwIiwJInNwIiwJInM4IiwJInJhIiwKKwkic3IiLAkibG8iLAkiaGkiLAkiYmFkIiwJImNhdXNlIiwicGMiLAorCSJmMCIsICAgImYxIiwgICAiZjIiLCAgICJmMyIsICAgImY0IiwgICAiZjUiLCAgICJmNiIsICAgImY3IiwKKwkiZjgiLCAgICJmOSIsICAgImYxMCIsICAiZjExIiwgICJmMTIiLCAgImYxMyIsICAiZjE0IiwgICJmMTUiLAorCSJmMTYiLCAgImYxNyIsICAiZjE4IiwgICJmMTkiLCAgImYyMCIsICAiZjIxIiwgICJmMjIiLCAgImYyMyIsCisJImYyNCIsICAiZjI1IiwgICJmMjYiLCAgImYyNyIsICAiZjI4IiwgICJmMjkiLCAgImYzMCIsICAiZjMxIiwKKwkiZnNyIiwgICJmaXIiLCAgImZwIiwJIiIsCisJImlueCIsCSJyYW5kIiwJImVsbyIsCSIiLAkiY3R4dCIsCSIiLAkiIiwJIiIsCisJIiIsCSIiLAkiZWhpIiwJIiIsCSIiLAkiIiwJImVwYyIsCSJwcmlkIiwKK307CisKKy8qIE5hbWVzIG9mIElEVCBSMzA4MSByZWdpc3RlcnMuICAqLworCitjaGFyICptaXBzX3IzMDgxX3JlZ19uYW1lc1tdID0geworCSJ6ZXJvIiwJImF0IiwJInYwIiwJInYxIiwJImEwIiwJImExIiwJImEyIiwJImEzIiwKKwkidDAiLAkidDEiLAkidDIiLAkidDMiLAkidDQiLAkidDUiLAkidDYiLAkidDciLAorCSJzMCIsCSJzMSIsCSJzMiIsCSJzMyIsCSJzNCIsCSJzNSIsCSJzNiIsCSJzNyIsCisJInQ4IiwJInQ5IiwJImswIiwJImsxIiwJImdwIiwJInNwIiwJInM4IiwJInJhIiwKKwkic3IiLAkibG8iLAkiaGkiLAkiYmFkIiwJImNhdXNlIiwicGMiLAorCSJmMCIsICAgImYxIiwgICAiZjIiLCAgICJmMyIsICAgImY0IiwgICAiZjUiLCAgICJmNiIsICAgImY3IiwKKwkiZjgiLCAgICJmOSIsICAgImYxMCIsICAiZjExIiwgICJmMTIiLCAgImYxMyIsICAiZjE0IiwgICJmMTUiLAorCSJmMTYiLCAgImYxNyIsICAiZjE4IiwgICJmMTkiLCAgImYyMCIsICAiZjIxIiwgICJmMjIiLCAgImYyMyIsCisJImYyNCIsICAiZjI1IiwgICJmMjYiLCAgImYyNyIsICAiZjI4IiwgICJmMjkiLCAgImYzMCIsICAiZjMxIiwKKwkiZnNyIiwgICJmaXIiLCAgImZwIiwJIiIsCisJImlueCIsCSJyYW5kIiwJImVsbyIsCSJjZmciLAkiY3R4dCIsCSIiLAkiIiwJIiIsCisJIiIsCSIiLAkiZWhpIiwJIiIsCSIiLAkiIiwJImVwYyIsCSJwcmlkIiwKK307CisKKy8qIE5hbWVzIG9mIExTSSAzM2sgcmVnaXN0ZXJzLiAgKi8KKworY2hhciAqbWlwc19sc2kzM2tfcmVnX25hbWVzW10gPSB7CisJInplcm8iLAkiYXQiLAkidjAiLAkidjEiLAkiYTAiLAkiYTEiLAkiYTIiLAkiYTMiLAorCSJ0MCIsCSJ0MSIsCSJ0MiIsCSJ0MyIsCSJ0NCIsCSJ0NSIsCSJ0NiIsCSJ0NyIsCisJInMwIiwJInMxIiwJInMyIiwJInMzIiwJInM0IiwJInM1IiwJInM2IiwJInM3IiwKKwkidDgiLAkidDkiLAkiazAiLAkiazEiLAkiZ3AiLAkic3AiLAkiczgiLAkicmEiLAorCSJlcGMiLAkiaGkiLAkibG8iLAkic3IiLAkiY2F1c2UiLCJiYWR2YWRkciIsCisJImRjaWMiLCAiYnBjIiwgICJiZGEiLCAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAgIiIsCisJIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAgIiIsCisJIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAgIiIsCisJIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAgIiIsCisJIiIsICAgICAiIiwgICAgICIiLAkiIiwKKwkiIiwJIiIsCSIiLAkiIiwJIiIsCSIiLAkiIiwJICIiLAorCSIiLAkiIiwJIiIsCSIiLAkiIiwJIiIsCSIiLAkgIiIsCit9OworCitzdHJ1Y3QgeworICBjaGFyICpuYW1lOworICBjaGFyICoqcmVnbmFtZXM7Cit9IG1pcHNfcHJvY2Vzc29yX3R5cGVfdGFibGVbXSA9IHsKKyAgeyAiZ2VuZXJpYyIsIG1pcHNfZ2VuZXJpY19yZWdfbmFtZXMgfSwKKyAgeyAicjMwNDEiLCBtaXBzX3IzMDQxX3JlZ19uYW1lcyB9LAorICB7ICJyMzA1MSIsIG1pcHNfcjMwNTFfcmVnX25hbWVzIH0sCisgIHsgInIzMDcxIiwgbWlwc19yMzA4MV9yZWdfbmFtZXMgfSwKKyAgeyAicjMwODEiLCBtaXBzX3IzMDgxX3JlZ19uYW1lcyB9LAorICB7ICJsc2kzM2siLCBtaXBzX2xzaTMza19yZWdfbmFtZXMgfSwKKyAgeyBOVUxMLCBOVUxMIH0KK307CisKKy8qIFRhYmxlIHRvIHRyYW5zbGF0ZSBNSVBTMTYgcmVnaXN0ZXIgZmllbGQgdG8gYWN0dWFsIHJlZ2lzdGVyIG51bWJlci4gICovCitzdGF0aWMgaW50IG1pcHMxNl90b18zMl9yZWdbOF0gPSB7IDE2LCAxNywgMiwgMywgNCwgNSwgNiwgNyB9OworCisvKiBIZXVyaXN0aWNfcHJvY19zdGFydCBtYXkgaHVudCB0aHJvdWdoIHRoZSB0ZXh0IHNlY3Rpb24gZm9yIGEgbG9uZworICAgdGltZSBhY3Jvc3MgYSAyNDAwIGJhdWQgc2VyaWFsIGxpbmUuICBBbGxvd3MgdGhlIHVzZXIgdG8gbGltaXQgdGhpcworICAgc2VhcmNoLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBoZXVyaXN0aWNfZmVuY2VfcG9zdCA9IDA7CisKKyNkZWZpbmUgUFJPQ19MT1dfQUREUihwcm9jKSAoKHByb2MpLT5wZHIuYWRyKSAvKiBsZWFzdCBhZGRyZXNzICovCisjZGVmaW5lIFBST0NfSElHSF9BRERSKHByb2MpICgocHJvYyktPmhpZ2hfYWRkcikgLyogdXBwZXIgYWRkcmVzcyBib3VuZCAqLworI2RlZmluZSBQUk9DX0ZSQU1FX09GRlNFVChwcm9jKSAoKHByb2MpLT5wZHIuZnJhbWVvZmZzZXQpCisjZGVmaW5lIFBST0NfRlJBTUVfUkVHKHByb2MpICgocHJvYyktPnBkci5mcmFtZXJlZykKKyNkZWZpbmUgUFJPQ19GUkFNRV9BREpVU1QocHJvYykgICgocHJvYyktPmZyYW1lX2FkanVzdCkKKyNkZWZpbmUgUFJPQ19SRUdfTUFTSyhwcm9jKSAoKHByb2MpLT5wZHIucmVnbWFzaykKKyNkZWZpbmUgUFJPQ19GUkVHX01BU0socHJvYykgKChwcm9jKS0+cGRyLmZyZWdtYXNrKQorI2RlZmluZSBQUk9DX1JFR19PRkZTRVQocHJvYykgKChwcm9jKS0+cGRyLnJlZ29mZnNldCkKKyNkZWZpbmUgUFJPQ19GUkVHX09GRlNFVChwcm9jKSAoKHByb2MpLT5wZHIuZnJlZ29mZnNldCkKKyNkZWZpbmUgUFJPQ19QQ19SRUcocHJvYykgKChwcm9jKS0+cGRyLnBjcmVnKQorI2RlZmluZSBQUk9DX1NZTUJPTChwcm9jKSAoKihzdHJ1Y3Qgc3ltYm9sKiopJihwcm9jKS0+cGRyLmlzeW0pCisjZGVmaW5lIF9QUk9DX01BR0lDXyAweDBGMEYwRjBGCisjZGVmaW5lIFBST0NfREVTQ19JU19EVU1NWShwcm9jKSAoKHByb2MpLT5wZHIuaXN5bSA9PSBfUFJPQ19NQUdJQ18pCisjZGVmaW5lIFNFVF9QUk9DX0RFU0NfSVNfRFVNTVkocHJvYykgKChwcm9jKS0+cGRyLmlzeW0gPSBfUFJPQ19NQUdJQ18pCisKK3N0cnVjdCBsaW5rZWRfcHJvY19pbmZvCit7CisgIHN0cnVjdCBtaXBzX2V4dHJhX2Z1bmNfaW5mbyBpbmZvOworICBzdHJ1Y3QgbGlua2VkX3Byb2NfaW5mbyAqbmV4dDsKK30gKmxpbmtlZF9wcm9jX2Rlc2NfdGFibGUgPSBOVUxMOworCisKKy8qIFNob3VsZCB0aGUgdXBwZXIgd29yZCBvZiA2NC1iaXQgYWRkcmVzc2VzIGJlIHplcm9lZD8gKi8KK3N0YXRpYyBpbnQgbWFza19hZGRyZXNzX3AgPSAxOworCisvKiBTaG91bGQgY2FsbF9mdW5jdGlvbiBhbGxvY2F0ZSBzdGFjayBzcGFjZSBmb3IgYSBzdHJ1Y3QgcmV0dXJuPyAgKi8KK2ludAorbWlwc191c2Vfc3RydWN0X2NvbnZlbnRpb24gKGdjY19wLCB0eXBlKQorICAgICBpbnQgZ2NjX3A7CisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworeworICBpZiAoTUlQU19FQUJJKQorICAgIHJldHVybiAoVFlQRV9MRU5HVEggKHR5cGUpID4gMiAqIE1JUFNfUkVHU0laRSk7CisgIGVsc2UKKyAgICByZXR1cm4gMTsgLyogU3RydWN0dXJlcyBhcmUgcmV0dXJuZWQgYnkgcmVmIGluIGV4dHJhIGFyZzAgKi8KK30KKworLyogVGVsbCBpZiB0aGUgcHJvZ3JhbSBjb3VudGVyIHZhbHVlIGluIE1FTUFERFIgaXMgaW4gYSBNSVBTMTYgZnVuY3Rpb24uICAqLworCitzdGF0aWMgaW50CitwY19pc19taXBzMTYgKGJmZF92bWEgbWVtYWRkcikKK3sKKyAgc3RydWN0IG1pbmltYWxfc3ltYm9sICpzeW07CisKKyAgLyogSWYgYml0IDAgb2YgdGhlIGFkZHJlc3MgaXMgc2V0LCBhc3N1bWUgdGhpcyBpcyBhIE1JUFMxNiBhZGRyZXNzLiAqLworICBpZiAoSVNfTUlQUzE2X0FERFIgKG1lbWFkZHIpKQorICAgIHJldHVybiAxOworCisgIC8qIEEgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhpcyBpcyBhIE1JUFMxNiBmdW5jdGlvbiBpcyBzdG9yZWQgYnkgZWxmcmVhZC5jIGluCisgICAgIHRoZSBoaWdoIGJpdCBvZiB0aGUgaW5mbyBmaWVsZC4gIFVzZSB0aGlzIHRvIGRlY2lkZSBpZiB0aGUgZnVuY3Rpb24gaXMKKyAgICAgTUlQUzE2IG9yIG5vcm1hbCBNSVBTLiAgKi8KKyAgc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjIChtZW1hZGRyKTsKKyAgaWYgKHN5bSkKKyAgICByZXR1cm4gTVNZTUJPTF9JU19TUEVDSUFMIChzeW0pOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKworLyogVGhpcyByZXR1cm5zIHRoZSBQQyBvZiB0aGUgZmlyc3QgaW5zdCBhZnRlciB0aGUgcHJvbG9ndWUuICBJZiB3ZSBjYW4ndAorICAgZmluZCB0aGUgcHJvbG9ndWUsIHRoZW4gcmV0dXJuIDAuICAqLworCitzdGF0aWMgQ09SRV9BRERSCithZnRlcl9wcm9sb2d1ZSAocGMsIHByb2NfZGVzYykKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBtaXBzX2V4dHJhX2Z1bmNfaW5mb190IHByb2NfZGVzYzsKK3sKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CisgIENPUkVfQUREUiBmdW5jX2FkZHIsIGZ1bmNfZW5kOworCisgIGlmICghcHJvY19kZXNjKQorICAgIHByb2NfZGVzYyA9IGZpbmRfcHJvY19kZXNjIChwYywgTlVMTCk7CisKKyAgaWYgKHByb2NfZGVzYykKKyAgICB7CisgICAgICAvKiBJZiBmdW5jdGlvbiBpcyBmcmFtZWxlc3MsIHRoZW4gd2UgbmVlZCB0byBkbyBpdCB0aGUgaGFyZCB3YXkuICBJCisJIHN0cm9uZ2x5IHN1c3BlY3QgdGhhdCBmcmFtZWxlc3MgYWx3YXlzIG1lYW5zIHByb2xvZ3VlbGVzcy4uLiAqLworICAgICAgaWYgKFBST0NfRlJBTUVfUkVHIChwcm9jX2Rlc2MpID09IFNQX1JFR05VTQorCSAgJiYgUFJPQ19GUkFNRV9PRkZTRVQgKHByb2NfZGVzYykgPT0gMCkKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKCFmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gKHBjLCBOVUxMLCAmZnVuY19hZGRyLCAmZnVuY19lbmQpKQorICAgIHJldHVybiAwOwkJCS8qIFVua25vd24gKi8KKworICBzYWwgPSBmaW5kX3BjX2xpbmUgKGZ1bmNfYWRkciwgMCk7CisKKyAgaWYgKHNhbC5lbmQgPCBmdW5jX2VuZCkKKyAgICByZXR1cm4gc2FsLmVuZDsKKworICAvKiBUaGUgbGluZSBhZnRlciB0aGUgcHJvbG9ndWUgaXMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uICBJbiB0aGlzCisgICAgIGNhc2UsIHRlbGwgdGhlIGNhbGxlciB0byBmaW5kIHRoZSBwcm9sb2d1ZSB0aGUgaGFyZCB3YXkuICAqLworCisgIHJldHVybiAwOworfQorCisvKiBEZWNvZGUgYSBNSVBTMzIgaW5zdHJ1Y3Rpb24gdGhhdCBzYXZlcyBhIHJlZ2lzdGVyIGluIHRoZSBzdGFjaywgYW5kCisgICBzZXQgdGhlIGFwcHJvcHJpYXRlIGJpdCBpbiB0aGUgZ2VuZXJhbCByZWdpc3RlciBtYXNrIG9yIGZsb2F0IHJlZ2lzdGVyIG1hc2sKKyAgIHRvIGluZGljYXRlIHdoaWNoIHJlZ2lzdGVyIGlzIHNhdmVkLiAgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbgorICAgZm9yIG1pcHNfZmluZF9zYXZlZF9yZWdzLiAgKi8KKworc3RhdGljIHZvaWQKK21pcHMzMl9kZWNvZGVfcmVnX3NhdmUgKGluc3QsIGdlbl9tYXNrLCBmbG9hdF9tYXNrKQorICAgICB0X2luc3QgaW5zdDsKKyAgICAgdW5zaWduZWQgbG9uZyAqZ2VuX21hc2s7CisgICAgIHVuc2lnbmVkIGxvbmcgKmZsb2F0X21hc2s7Cit7CisgIGludCByZWc7CisKKyAgaWYgKChpbnN0ICYgMHhmZmUwMDAwMCkgPT0gMHhhZmEwMDAwMAkJLyogc3cgcmVnLG4oJHNwKSAqLworICAgICAgfHwgKGluc3QgJiAweGZmZTAwMDAwKSA9PSAweGFmYzAwMDAwCS8qIHN3IHJlZyxuKCRyMzApICovCisgICAgICB8fCAoaW5zdCAmIDB4ZmZlMDAwMDApID09IDB4ZmZhMDAwMDApCS8qIHNkIHJlZyxuKCRzcCkgKi8KKyAgICB7CisgICAgICAvKiBJdCBtaWdodCBiZSBwb3NzaWJsZSB0byB1c2UgdGhlIGluc3RydWN0aW9uIHRvCisJIGZpbmQgdGhlIG9mZnNldCwgcmF0aGVyIHRoYW4gdGhlIGNvZGUgYmVsb3cgd2hpY2gKKwkgaXMgYmFzZWQgb24gdGhpbmdzIGJlaW5nIGluIGEgY2VydGFpbiBvcmRlciBpbiB0aGUKKwkgZnJhbWUsIGJ1dCBmaWd1cmluZyBvdXQgd2hhdCB0aGUgaW5zdHJ1Y3Rpb24ncyBvZmZzZXQKKwkgaXMgcmVsYXRpdmUgdG8gbWlnaHQgYmUgYSBsaXR0bGUgdHJpY2t5LiAgKi8KKyAgICAgIHJlZyA9IChpbnN0ICYgMHgwMDFmMDAwMCkgPj4gMTY7CisgICAgICAqZ2VuX21hc2sgfD0gKDEgPDwgcmVnKTsKKyAgICB9CisgIGVsc2UgaWYgKChpbnN0ICYgMHhmZmUwMDAwMCkgPT0gMHhlN2EwMDAwMAkvKiBzd2MxIGZyZWcsbigkc3ApICovCisJICAgfHwgKGluc3QgJiAweGZmZTAwMDAwKSA9PSAweGU3YzAwMDAwCS8qIHN3YzEgZnJlZyxuKCRyMzApICovCisJICAgfHwgKGluc3QgJiAweGZmZTAwMDAwKSA9PSAweGY3YTAwMDAwKS8qIHNkYzEgZnJlZyxuKCRzcCkgKi8KKworICAgIHsKKyAgICAgIHJlZyA9ICgoaW5zdCAmIDB4MDAxZjAwMDApID4+IDE2KTsKKyAgICAgICpmbG9hdF9tYXNrIHw9ICgxIDw8IHJlZyk7CisgICAgfQorfQorCisvKiBEZWNvZGUgYSBNSVBTMTYgaW5zdHJ1Y3Rpb24gdGhhdCBzYXZlcyBhIHJlZ2lzdGVyIGluIHRoZSBzdGFjaywgYW5kCisgICBzZXQgdGhlIGFwcHJvcHJpYXRlIGJpdCBpbiB0aGUgZ2VuZXJhbCByZWdpc3RlciBvciBmbG9hdCByZWdpc3RlciBtYXNrCisgICB0byBpbmRpY2F0ZSB3aGljaCByZWdpc3RlciBpcyBzYXZlZC4gIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24KKyAgIGZvciBtaXBzX2ZpbmRfc2F2ZWRfcmVncy4gICovCisKK3N0YXRpYyB2b2lkCittaXBzMTZfZGVjb2RlX3JlZ19zYXZlIChpbnN0LCBnZW5fbWFzaykKKyAgICAgdF9pbnN0IGluc3Q7CisgICAgIHVuc2lnbmVkIGxvbmcgKmdlbl9tYXNrOworeworICBpZiAoKGluc3QgJiAweGY4MDApID09IDB4ZDAwMCkJCS8qIHN3IHJlZyxuKCRzcCkgKi8KKyAgICB7CisgICAgICBpbnQgcmVnID0gbWlwczE2X3RvXzMyX3JlZ1soaW5zdCAmIDB4NzAwKSA+PiA4XTsKKyAgICAgICpnZW5fbWFzayB8PSAoMSA8PCByZWcpOworICAgIH0KKyAgZWxzZSBpZiAoKGluc3QgJiAweGZmMDApID09IDB4ZjkwMCkJCS8qIHNkIHJlZyxuKCRzcCkgKi8KKyAgICB7CisgICAgICBpbnQgcmVnID0gbWlwczE2X3RvXzMyX3JlZ1soaW5zdCAmIDB4ZTApID4+IDVdOworICAgICAgKmdlbl9tYXNrIHw9ICgxIDw8IHJlZyk7CisgICAgfQorICBlbHNlIGlmICgoaW5zdCAmIDB4ZmYwMCkgPT0gMHg2MjAwCQkvKiBzdyAkcmEsbigkc3ApICovCisJICAgfHwgKGluc3QgJiAweGZmMDApID09IDB4ZmEwMCkJLyogc2QgJHJhLG4oJHNwKSAqLworICAgICpnZW5fbWFzayB8PSAoMSA8PCBSQV9SRUdOVU0pOworfQorCisKKy8qIEZldGNoIGFuZCByZXR1cm4gaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAgSWYgdGhlIFBDCisgICBpcyBvZGQsIGFzc3VtZSBpdCdzIGEgTUlQUzE2IGluc3RydWN0aW9uOyBvdGhlcndpc2UgTUlQUzMyLiAgKi8KKworc3RhdGljIHRfaW5zdAorbWlwc19mZXRjaF9pbnN0cnVjdGlvbiAoYWRkcikKKyAgICBDT1JFX0FERFIgYWRkcjsKK3sKKyAgY2hhciBidWZbTUlQU19JTlNUTEVOXTsKKyAgaW50IGluc3RsZW47CisgIGludCBzdGF0dXM7CisKKyAgaWYgKHBjX2lzX21pcHMxNiAoYWRkcikpCisgICAgeworICAgICAgaW5zdGxlbiA9IE1JUFMxNl9JTlNUTEVOOworICAgICAgYWRkciA9IFVOTUFLRV9NSVBTMTZfQUREUiAoYWRkcik7CisgICAgfQorICBlbHNlCisgICAgICBpbnN0bGVuID0gTUlQU19JTlNUTEVOOworICBzdGF0dXMgPSByZWFkX21lbW9yeV9ub2JwdCAoYWRkciwgYnVmLCBpbnN0bGVuKTsKKyAgaWYgKHN0YXR1cykKKyAgICBtZW1vcnlfZXJyb3IgKHN0YXR1cywgYWRkcik7CisgIHJldHVybiBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgaW5zdGxlbik7Cit9CisKKworLyogVGhlc2UgdGhlIGZpZWxkcyBvZiAzMiBiaXQgbWlwcyBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgbWlwczMyX29wKHgpICh4ID4+IDI1KQorI2RlZmluZSBpdHlwZV9vcCh4KSAoeCA+PiAyNSkKKyNkZWZpbmUgaXR5cGVfcnMoeCkgKCh4ID4+IDIxKSYgMHgxZikKKyNkZWZpbmUgaXR5cGVfcnQoeCkgKCh4ID4+IDE2KSAmIDB4MWYpCisjZGVmaW5lIGl0eXBlX2ltbWVkaWF0ZSh4KSAoIHggJiAweGZmZmYpCisKKyNkZWZpbmUganR5cGVfb3AoeCkgKHggPj4gMjUpCisjZGVmaW5lIGp0eXBlX3RhcmdldCh4KSAoIHggJiAweDAzZmZmZmYpCisKKyNkZWZpbmUgcnR5cGVfb3AoeCkgKHggPj4yNSkKKyNkZWZpbmUgcnR5cGVfcnMoeCkgKCh4Pj4yMSkgJiAweDFmKQorI2RlZmluZSBydHlwZV9ydCh4KSAoKHg+PjE2KSAgJiAweDFmKQorI2RlZmluZSBydHlwZV9yZCh4KSAoKHg+PjExKSAmIDB4MWYpIAorI2RlZmluZSBydHlwZV9zaGFtdCh4KSAoKHg+PjYpICYgMHgxZikKKyNkZWZpbmUgcnR5cGVfZnVuY3QoeCkgKHggJiAweDNmICkKKworc3RhdGljIENPUkVfQUREUgorbWlwczMyX3JlbGF0aXZlX29mZnNldCh1bnNpZ25lZCBsb25nIGluc3QpCit7IGxvbmcgeCA7CisgIHggPSBpdHlwZV9pbW1lZGlhdGUoaW5zdCkgOworICBpZiAoeCAmIDB4ODAwMCkgLyogc2lnbiBiaXQgc2V0ICovCisgICAgeworICAgICAgeCB8PSAweGZmZmYwMDAwIDsgLyogc2lnbiBleHRlbnNpb24gKi8KKyAgICB9CisgIHggPSB4IDw8IDIgOworICByZXR1cm4geCA7Cit9CisKKy8qIERldGVybWluZSB3aGF0ZSB0byBzZXQgYSBzaW5nbGUgc3RlcCBicmVha3BvaW50IHdoaWxlIGNvbnNpZGVyaW5nCisgICBicmFuY2ggcHJlZGljdGlvbiAqLworQ09SRV9BRERSCittaXBzMzJfbmV4dF9wYyhDT1JFX0FERFIgcGMpCit7CisgIHVuc2lnbmVkIGxvbmcgaW5zdCA7CisgIGludCBvcCA7CisgIGluc3QgPSBtaXBzX2ZldGNoX2luc3RydWN0aW9uKHBjKSA7CisgIGlmICgoaW5zdCAmIDB4ZTAwMDAwMDApICE9IDApIC8qIE5vdCBhIHNwZWNpYWwsIGp1bnAgb3IgYnJhbmNoIGluc3RydWN0aW9uICovCisgICAgeyBpZiAoKGluc3QgPj4gMjcpID09IDUpIC8qIEJFUUwgQk5FWiBCTEVaTCBCR1RaRSAsIGJpdHMgMDEwMXh4ICovCisJeyBvcCA9ICgoaW5zdCA+PiAyNSkgJiAweDAzKSA7CisJICBzd2l0Y2ggKG9wKQorCSAgICB7CisJICAgIGNhc2UgMCA6IGdvdG8gZXF1YWxfYnJhbmNoIDsgLyogQkVRTCAgICovCisJICAgIGNhc2UgMSA6IGdvdG8gbmVxX2JyYW5jaCA7ICAgLyogQk5FWiAgICovCisJICAgIGNhc2UgMiA6IGdvdG8gbGVzc19icmFuY2ggOyAgLyogQkxFWiAgICovCisJICAgIGNhc2UgMyA6IGdvdG8gZ3JlYXRlcl9icmFuY2ggOyAvKiBCR1RaICovCisJICAgIGRlZmF1bHQgOiBwYyArPSA0IDsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgcGMgKz0gNCA7IC8qIE5vdCBhIGJyYW5jaCwgbmV4dCBpbnN0cnVjdGlvbiBpcyBlYXN5ICovCisgICAgfQorICBlbHNlCisgICAgeyAvKiBUaGlzIGdldHMgd2F5IG1lc3N5ICovCisgICAgICAKKyAgICAgIC8qIEZ1cnRoZXIgc3ViZGl2aWRlIGludG8gU1BFQ0lBTCwgUkVHSU1NIGFuZCBvdGhlciAqLworICAgICAgc3dpdGNoIChvcCA9ICgoaW5zdCA+PiAyNikgJiAweDA3KSkgIC8qIGV4dHJhY3QgYml0cyAyOCwyNywyNiAqLworCXsKKwkgIGNhc2UgMCA6IC8qIFNQRUNJQUwgKi8KKwkgICAgb3AgPSBydHlwZV9mdW5jdChpbnN0KSA7CisJICAgIHN3aXRjaCAob3ApCisJICAgICAgeworCSAgICAgIGNhc2UgOCA6IC8qIEpSICovCisJICAgICAgY2FzZSA5IDogLyogSkFMUiAqLworCQlwYyA9IHJlYWRfcmVnaXN0ZXIocnR5cGVfcnMoaW5zdCkpIDsgLyogU2V0IFBDIHRvIHRoYXQgYWRkcmVzcyAqLworCQlicmVhayA7CisJICAgICAgZGVmYXVsdDogcGMgKz0gNCA7CisJICAgICAgfQorCSAgICAKKwkgICAgYnJlYWsgOyAvKiBlbmQgc3BlY2lhbCAqLworCWNhc2UgMSA6ICAvKiBSRUdJTU0gKi8KKwkgIHsKKwkgICAgb3AgPSBqdHlwZV9vcChpbnN0KSA7IC8qIGJyYW5jaCBjb25kaXRpb24gKi8KKwkgICAgc3dpdGNoIChqdHlwZV9vcChpbnN0KSkKKwkgICAgICB7CisJICAgICAgY2FzZSAwIDogLyogQkxUWiAqLworCSAgICAgIGNhc2UgMiA6IC8qIEJMVFhMICovCisJICAgICAgY2FzZSAxNiA6IC8qIEJMVFpBTEwgKi8KKwkgICAgICBjYXNlIDE4IDogLyogQkxUWkFMTCAqLworCSAgICAgIGxlc3NfYnJhbmNoOgorCQlpZiAocmVhZF9yZWdpc3RlcihpdHlwZV9ycyhpbnN0KSkgPCAwKQorCQkgIHBjICs9IG1pcHMzMl9yZWxhdGl2ZV9vZmZzZXQoaW5zdCkgKyA0IDsKKwkJZWxzZSBwYyArPSA4IDsgIC8qIGFmdGVyIHRoZSBkZWxheSBzbG90ICovCisJICAgICAgYnJlYWsgOworCSAgICAgIGNhc2UgMSA6IC8qIEdFWiAqLworCSAgICAgIGNhc2UgMyA6IC8qIEJHRVpMICovCisJICAgICAgY2FzZSAxNyA6IC8qIEJHRVpBTCAqLworCSAgICAgIGNhc2UgMTkgOiAvKiBCR0VaQUxMICovCisJICAgICAgZ3JlYXRlcl9lcXVhbF9icmFuY2g6CisJICAgICAgaWYgKHJlYWRfcmVnaXN0ZXIoaXR5cGVfcnMoaW5zdCkpID49IDApCisJCSAgcGMgKz0gbWlwczMyX3JlbGF0aXZlX29mZnNldChpbnN0KSArIDQgOworCSAgICAgIGVsc2UgcGMgKz0gOCA7IC8qIGFmdGVyIHRoZSBkZWxheSBzbG90ICovCisJICAgICAgYnJlYWsgOworCSAgICAgIC8qIEFsbCBvZiB0aGUgb3RoZXIgaW50cnVjdGlvbnMgaW4gdGhlIFJFR0lNTSBjYXRhZ29yeSAqLworCSAgICAgIGRlZmF1bHQ6IHBjICs9IDQgOworCSAgICAgIH0KKwkgIH0KKwkgIGJyZWFrIDsgLyogZW5kIFJFR0lNTSAqLworCWNhc2UgMiA6ICAvKiBKICovCisJY2FzZSAzIDogIC8qIEpBTCAqLworCSAgeyB1bnNpZ25lZCBsb25nIHJlZyA7CisJICAgIHJlZyA9IGp0eXBlX3RhcmdldChpbnN0KSA8PCAyIDsKKwkgICAgcGMgPSByZWcgKyAoKHBjKzQpICYgMHhmMDAwMDAwMCkgIDsKKwkgICAgLyogV2hhdHMgdGhpcyBteXN0ZXJpb3VzIDB4ZjAwMDAwMCBhZGp1c3RtZW50ID8/PyAqLworCSAgfQorCSAgYnJlYWsgOworCSAgLyogRklYTUUgY2FzZSBKQUxYIDoqLworCSAgeyB1bnNpZ25lZCBsb25nIHJlZyA7CisJICAgIHJlZyA9IGp0eXBlX3RhcmdldChpbnN0KSA8PCAyIDsKKwkgICAgcGMgPSByZWcgKyAoKHBjKzQpICYgMHhmMDAwMDAwMCkgKyAxIDsgLyogeWVzLCArMSAqLworCSAgICAvKiBBZGQgMSB0byBpbmRpY2F0ZSAxNiBiaXQgbW9kZSAtIEludmVydCBJU0EgbW9kZSAqLworCSAgfQorCSAgYnJlYWsgOyAvKiBUaGUgbmV3IFBDIHdpbGwgYmUgYWx0ZXJuYXRlIG1vZGUgKi8KKwljYXNlIDQgOiAgICAgLyogQkVRICwgQkVRTCAqLworCSAgZXF1YWxfYnJhbmNoIDoKKwkgICBpZiAocmVhZF9yZWdpc3RlcihpdHlwZV9ycyhpbnN0KSkgPT0KKwkgICAgICAgcmVhZF9yZWdpc3RlcihpdHlwZV9ydChpbnN0KSkpCisJICAgICBwYyArPSBtaXBzMzJfcmVsYXRpdmVfb2Zmc2V0KGluc3QpICsgNCA7CisJICAgZWxzZSBwYyArPSA4IDsKKwkgICBicmVhayA7CisJY2FzZSA1IDogLyogQk5FICwgQk5FTCAqLworCSAgbmVxX2JyYW5jaCA6CisJICBpZiAocmVhZF9yZWdpc3RlcihpdHlwZV9ycyhpbnN0KSkgIT0gCisJICAgICAgcmVhZF9yZWdpc3RlcihpdHlwZV9ycyhpbnN0KSkpCisJICAgIHBjICs9IG1pcHMzMl9yZWxhdGl2ZV9vZmZzZXQoaW5zdCkgKyA0IDsKKwkgIGVsc2UgcGMgKz0gOCA7CisJICBicmVhayA7CisJY2FzZSA2IDogLyogQkxFWiAsIEJMRVpMICovCisJbGVzc196ZXJvX2JyYW5jaDoKKwkgIGlmIChyZWFkX3JlZ2lzdGVyKGl0eXBlX3JzKGluc3QpIDw9IDApKQorCSAgICAgcGMgKz0gbWlwczMyX3JlbGF0aXZlX29mZnNldChpbnN0KSArIDQgOworCSAgZWxzZSBwYyArPSA4IDsKKwkgIGJyZWFrIDsKKwljYXNlIDcgOgorCWdyZWF0ZXJfYnJhbmNoIDogICAvKiBCR1RaIEJHVFpMICovCisJICBpZiAocmVhZF9yZWdpc3RlcihpdHlwZV9ycyhpbnN0KSA+IDApKQorCSAgICBwYyArPSBtaXBzMzJfcmVsYXRpdmVfb2Zmc2V0KGluc3QpICsgNCA7CisJICBlbHNlIHBjICs9IDggOworCWJyZWFrIDsKKwlkZWZhdWx0IDogcGMgKz0gOCA7CisJfSAvKiBzd2l0Y2ggKi8KKyAgICB9ICAvKiBlbHNlICovCisgIHJldHVybiBwYyA7Cit9IC8qIG1pcHMzMl9uZXh0X3BjICovCisKKy8qIERlY29kaW5nIHRoZSBuZXh0IHBsYWNlIHRvIHNldCBhIGJyZWFrcG9pbnQgaXMgaXJyZWd1bGFyIGZvciB0aGUKKyAgIG1pcHMgMTYgdmFyaWFudCwgYnV0IGZvcnR1bmF0bHksIHRoZXJlIGZld2VyIGluc3RydWN0aW9ucy4gV2UgaGF2ZSB0byBjb3BlCisgICBpdGggZXh0ZW5zaW9ucyBmb3IgMTYgYml0IGluc3RydWN0aW9ucyBhbmQgYSBwYWlyIG9mIGFjdHVhbCAzMiBiaXQgaW5zdHJ1Y3Rpb25zLgorICAgV2UgZG9udCB3YW50IHRvIHNldCBhIHNpbmdsZSBzdGVwIGluc3RydWN0aW9uIG9uIHRoZSBleHRlbmQgaW5zdHJ1Y3Rpb24KKyAgIGVpdGhlci4KKyAgICovCisKKy8qIExvdHMgb2YgbWlwczE2IGluc3RydWN0aW9uIGZvcm1hdHMgKi8KKy8qIFByZWRpY3RpbmcganVtcHMgcmVxdWlyZXMgaXR5cGUscml0eXBlLGk4dHlwZQorICAgYW5kIHRoZWlyIGV4dGVuc2lvbnMgICAgICBleHRJdHlwZSxleHRyaXR5cGUsZXh0STh0eXBlCisgICAqLworZW51bSBtaXBzMTZfaW5zdF9mbXRzCit7CisgIGl0eXBlLCAgICAgICAgICAvKiAwICBpbW1lZGlhdGUgNSwxMCAqLworICByaXR5cGUsICAgICAgICAgLyogMSAgIDUsMyw4ICovCisgIHJydHlwZSwgICAgICAgICAvKiAyICAgNSwzLDMsNSAqLworICBycml0eXBlLCAgICAgICAgLyogMyAgIDUsMywzLDUgKi8KKyAgcnJydHlwZSwgICAgICAgIC8qIDQgICA1LDMsMywzLDIgKi8gCisgIHJyaWF0eXBlLCAgICAgICAvKiA1ICAgNSwzLDMsMSw0ICovIAorICBzaGlmdHR5cGUsICAgICAgLyogNiAgIDUsMywzLDMsMiAqLworICBpOHR5cGUsICAgICAgICAgLyogNyAgIDUsMyw4ICovCisgIGk4bW92dHlwZSwgICAgICAvKiA4ICAgNSwzLDMsNSAqLworICBpOG1vdjMycnR5cGUsICAgLyogOSAgIDUsMyw1LDMgKi8KKyAgaTY0dHlwZSwgICAgICAgIC8qIDEwICA1LDMsOCAqLworICByaTY0dHlwZSwgICAgICAgLyogMTEgIDUsMywzLDUgKi8KKyAgamFseHR5cGUsICAgICAgIC8qIDEyICA1LDEsNSw1LDE2IC0gYSAzMiBiaXQgaW5zdHJ1Y3Rpb24gKi8KKyAgZXhpSXR5cGUsICAgICAgIC8qIDEzICA1LDYsNSw1LDEsMSwxLDEsMSwxLDUgKi8KKyAgZXh0Uml0eXBlLCAgICAgIC8qIDE0ICA1LDYsNSw1LDMsMSwxLDEsNSAqLworICBleHRSUkl0eXBlLCAgICAgLyogMTUgIDUsNSw1LDUsMywzLDUgKi8KKyAgZXh0UlJJQXR5cGUsICAgIC8qIDE2ICA1LDcsNCw1LDMsMywxLDQgKi8KKyAgRVhUc2hpZnR0eXBlLCAgIC8qIDE3ICA1LDUsMSwxLDEsMSwxLDEsNSwzLDMsMSwxLDEsMiAqLworICBleHRJOHR5cGUsICAgICAgLyogMTggIDUsNiw1LDUsMywxLDEsMSw1ICovCisgIGV4dEk2NHR5cGUsICAgICAvKiAxOSAgNSw2LDUsNSwzLDEsMSwxLDUgKi8KKyAgZXh0Umk2NHR5cGUsICAgIC8qIDIwICA1LDYsNSw1LDMsMyw1ICovCisgIGV4dHNoaWZ0NjR0eXBlICAvKiAyMSAgNSw1LDEsMSwxLDEsMSwxLDUsMSwxLDEsMyw1ICovCit9IDsKKy8qIEkgYW0gaGVhcGluZyBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgZm9ybWF0cyBpbnRvIG9uZSBzdHJ1Y3R1cmUgYW5kIHRoZW4sCisgICBvbmx5IHRoZSBmaWVsZHMgd2hpY2ggYXJlIGludm9sdmVkIGluIGluc3RydWN0aW9uIGV4dGVuc2lvbiAqLworc3RydWN0IHVwa19taXBzMTYKK3sKKyAgdW5zaWduZWQgc2hvcnQgaW5zdCA7CisgIGVudW0gbWlwczE2X2luc3RfZm10cyBmbXQgOworICB1bnNpZ25lZCBsb25nIG9mZnNldCA7CisgIHVuc2lnbmVkIGludCByZWd4IDsgLyogRnVuY3Rpb24gaW4gaTggdHlwZSAqLworICB1bnNpZ25lZCBpbnQgcmVneSA7Cit9IDsKKworCisKK3N0YXRpYyB2b2lkIHByaW50X3VucGFjayhjaGFyICogY29tbWVudCwKKwkJCSBzdHJ1Y3QgdXBrX21pcHMxNiAqIHUpCit7CisgIHByaW50ZigiJXMgJTA0eCAsZiglZCkgb2ZmKCUwOHgpICh4KCV4KSB5KCV4KVxuIiwKKwkgY29tbWVudCx1LT5pbnN0LHUtPmZtdCx1LT5vZmZzZXQsdS0+cmVneCx1LT5yZWd5KSA7Cit9CisKKy8qIFRoZSBFWFQtSSwgRVhULXJpIG5hZCBFWFQtSTggaW5zdHJ1Y3Rpb25zIGFsbCBoYXZlIHRoZSBzYW1lCisgICBmb3JtYXQgZm9yIHRoZSBiaXRzIHdoaWNoIG1ha2UgdXAgdGhlIGltbWVkaWF0YXRlIGV4dGVuc2lvbi4KKyAgICovCitzdGF0aWMgdW5zaWduZWQgbG9uZworZXh0ZW5kZWRfb2Zmc2V0KHVuc2lnbmVkIGxvbmcgZXh0ZW5zaW9uKQoreworICB1bnNpZ25lZCBsb25nIHZhbHVlICA7CisgIHZhbHVlID0gKGV4dGVuc2lvbiA+PiAyMSkgJiAweDNmIDsgLyogKiBleHRyYWN0IDE1OjExICovCisgIHZhbHVlID0gdmFsdWUgPDwgNiA7CisgIHZhbHVlIHw9IChleHRlbnNpb24gPj4gMTYpICYgMHgxZiA7IC8qIGV4dHJhY2UgMTA6NSAqLworICB2YWx1ZSA9IHZhbHVlIDw8IDUgOworICB2YWx1ZSB8PSBleHRlbnNpb24gJiAweDAxZiA7IAkvKiBleHRyYWN0IDQ6MCAqLworICByZXR1cm4gdmFsdWUgOworfQorCisvKiBPbmx5IGNhbGwgdGhpcyBmdW5jdGlvbiBpZiB5b3Uga25vdyB0aGF0IHRoaXMgaXMgYW4gZXh0ZW5kYWJsZQorICAgaW5zdHJ1Y3Rpb24sIEl0IHdvbnQgbWFsZnVuY3Rpb24sIGJ1dCB3aHkgbWFrZSBleGNlc3MgcmVtb3RlIG1lbW9yeSByZWZlcmVuY2VzPworICAgSWYgdGhlIGltbWVkaWF0ZSBvcGVyYW5kcyBnZXQgc2lnbiBleHRlbmRlZCBvciBzb210aGluZywgZG8gaXQgYWZ0ZXIKKyAgIHRoZSBleHRlbnNpb24gaXMgcGVyZm9ybWVkLgorICAgKi8KKy8qIEZJWE1FOiBFdmVyeSBvbmUgb2YgdGhlc2UgY2FzZXMgbmVlZHMgdG8gd29ycnkgYWJvdXQgc2lnbiBleHRlbnNpb24KKyAgIHdoZW4gdGhlIG9mZnNldCBpcyB0byBiZSB1c2VkIGluIHJlbGF0aXZlIGFkZHJlc3NpbmcgKi8KKworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZmV0Y2hfbWlwc18xNihDT1JFX0FERFIgcGMpCit7CisgIGNoYXIgYnVmWzhdIDsKKyAgcGMgJj0gMHhmZmZmZmZmZSA7IC8qIGNsZWFyIHRoZSBsb3cgb3JkZXIgYml0ICovCisgIHRhcmdldF9yZWFkX21lbW9yeShwYyxidWYsMikgOworICByZXR1cm4gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyKGJ1ZiwyKSA7Cit9CisKK3N0YXRpYyB2b2lkCit1bnBhY2tfbWlwczE2KENPUkVfQUREUiBwYywKKwkJICBzdHJ1Y3QgdXBrX21pcHMxNiAqIHVwaykKK3sKKyAgQ09SRV9BRERSIGV4dHBjIDsKKyAgdW5zaWduZWQgbG9uZyBleHRlbnNpb24gOworICBpbnQgZXh0ZW5kZWQgOworICBleHRwYyA9IChwYyAtIDQpICYgfjB4MDEgOyAvKiBFeHRlbnNpb25zIGFyZSAzMiBiaXQgaW5zdHJ1Y3Rpb25zICovCisgIC8qIERlY3JlbWVudCB0byBwcmV2aW91cyBhZGRyZXNzIGFuZCBsb29zZSB0aGUgMTZiaXQgbW9kZSBmbGFnICovCisgIC8qIHJldHVybiBpZiB0aGUgaW5zdHJ1Y3Rpb24gd2FzIGV4dGVuZGFibGUsIGJ1dCBub3QgYWN0dWFsbHkgZXh0ZW5kZWQgKi8KKyAgZXh0ZW5kZWQgPSAoKG1pcHMzMl9vcChleHRlbnNpb24pID09IDMwKSA/IDEgOiAwKSA7CisgIGlmIChleHRlbmRlZCkgeyBleHRlbnNpb24gPSBtaXBzX2ZldGNoX2luc3RydWN0aW9uKGV4dHBjKSA7fQorICBzd2l0Y2ggKHVway0+Zm10KQorICAgIHsKKyAgICBjYXNlIGl0eXBlIDoKKyAgICAgIHsKKwl1bnNpZ25lZCBsb25nIHZhbHVlICA7CisJaWYgKGV4dGVuZGVkKQorCSAgeyB2YWx1ZSA9IGV4dGVuZGVkX29mZnNldChleHRlbnNpb24pIDsKKwkgIHZhbHVlID0gdmFsdWUgPDwgMTEgOyAgICAgICAgICAgIC8qIHJvbSBmb3IgdGhlIG9yaWdpbmFsIHZhbHVlICovCisJICB2YWx1ZSB8PSB1cGstPmluc3QgJiAweDdmZiA7ICAgIC8qIGVsZXZlbiBiaXRzIGZyb20gaW5zdHJ1Y3Rpb24gKi8KKwkgIH0KKwllbHNlCisJICB7IHZhbHVlID0gdXBrLT5pbnN0ICYgMHg3ZmYgOworCSAgLyogRklYTUUgOiBDb25zaWRlciBzaWduIGV4dGVuc2lvbiAqLworCSAgfQorCXVway0+b2Zmc2V0ID0gdmFsdWUgOworICAgICAgfQorICAgICAgYnJlYWsgOworICAgIGNhc2Ugcml0eXBlIDoKKyAgICBjYXNlIGk4dHlwZSA6CisgICAgICB7IC8qIEEgcmVnaXN0ZXIgaWRlbnRpZmllciBhbmQgYW4gb2Zmc2V0ICovCisJLyogTW9zdCBvZiB0aGUgZmllbGRzIGFyZSB0aGUgc2FtZSBhcyBJIHR5cGUgYnV0IHRoZQorCSAgIGltbWVkaWF0ZSB2YWx1ZSBpcyBvZiBhIGRpZmZlcmVudCBsZW5ndGggKi8KKwl1bnNpZ25lZCBsb25nIHZhbHVlICA7CisJaWYgKGV4dGVuZGVkKQorCSAgeworCSAgICB2YWx1ZSA9IGV4dGVuZGVkX29mZnNldChleHRlbnNpb24pIDsKKwkgICAgdmFsdWUgPSB2YWx1ZSA8PCA4ICA7ICAgICAgICAgIC8qIGZyb20gdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uICovCisJICAgIHZhbHVlIHw9IHVway0+aW5zdCAmIDB4ZmYgOyAgICAvKiBlbGV2ZW4gYml0cyBmcm9tIGluc3RydWN0aW9uICovCisJICAgIHVway0+cmVneCA9IChleHRlbnNpb24gPj4gOCkgJiAweDA3IDsgLyogb3IgaTggZnVuY3QgKi8KKwkgICAgaWYgKHZhbHVlICYgMHg0MDAwKSAvKiB0ZXN0IHRoZSBzaWduIGJpdCAsIGJpdCAyNiAqLworCSAgICAgIHsJdmFsdWUgJj0gfiAweDNmZmYgOyAvKiByZW1vdmUgdGhlIHNpZ24gYml0ICovCisJCXZhbHVlID0gLXZhbHVlIDsKKwkgICAgICB9CisJICB9CisJZWxzZSB7CisJICB2YWx1ZSA9IHVway0+aW5zdCAmIDB4ZmYgOyAgLyogOCBiaXRzICovCisJICB1cGstPnJlZ3ggPSAodXBrLT5pbnN0ID4+IDgpICYgMHgwNyA7IC8qIG9yIGk4IGZ1bmN0ICovCisJICAvKiBGSVhNRTogRG8gc2lnbiBleHRlbnNpb24gLCB0aGlzIGZvcm1hdCBuZWVkcyBpdCAqLworCSAgaWYgKHZhbHVlICYgMHg4MCkgICAvKiBUSElTIENPTkZVU0VTIE1FICovCisJICAgIHsgdmFsdWUgJj0gMHhlZiA7IC8qIHJlbW92ZSB0aGUgc2lnbiBiaXQgKi8KKwkgICAgICB2YWx1ZSA9IC12YWx1ZSA7CisJICAgIH0KKwkgIAorCX0KKwl1cGstPm9mZnNldCA9IHZhbHVlIDsKKwlicmVhayA7CisgICAgICB9CisgICAgY2FzZSBqYWx4dHlwZSA6CisgICAgICB7CisJdW5zaWduZWQgbG9uZyB2YWx1ZSA7CisJdW5zaWduZWQgc2hvcnQgbmV4dGhhbGYgOworCXZhbHVlID0gKCh1cGstPmluc3QgJiAweDFmKSAgPDwgNSkgfCAoKHVway0+aW5zdCA+PiA1KSAmIDB4MWYpIDsKKwl2YWx1ZSA9IHZhbHVlIDw8IDE2IDsKKwluZXh0aGFsZiA9IG1pcHNfZmV0Y2hfaW5zdHJ1Y3Rpb24ocGMrMikgOyAvKiBsb3cgYml0IHN0aWxsIHNldCAqLworCXZhbHVlIHw9IG5leHRoYWxmIDsKKwl1cGstPm9mZnNldCA9IHZhbHVlIDsKKwlicmVhayA7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHByaW50Zl9maWx0ZXJlZCgiRGVjb2RpbmcgdW5pbXBsZW1lbnRlZCBpbnN0cnVjdGlvbiBmb3JtYXQgdHlwZVxuIikgOworICAgICAgYnJlYWsgOworICAgIH0KKyAgLyogcHJpbnRfdW5wYWNrKCJVUEsiLHVwaykgOyAqLworfQorCisKKyNkZWZpbmUgbWlwczE2X29wKHgpICh4ID4+IDExKQorCisvKiBUaGlzIGlzIGEgbWFwIG9mIHRoZSBvcGNvZGVzIHdoaWNoIGFlIGtub3duIHRvIHBlcmZvcm0gYnJhbmNoZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1hcDE2WzMyXSA9Cit7IDAsMCwxLDEsMSwxLDAsMCwKKyAgMCwwLDAsMCwxLDAsMCwwLAorICAwLDAsMCwwLDAsMCwwLDAsCisgIDAsMCwwLDAsMCwxLDEsMAorfSA7CisKK3N0YXRpYyBDT1JFX0FERFIgYWRkX29mZnNldF8xNihDT1JFX0FERFIgcGMsIGludCBvZmZzZXQpCit7CisgIHJldHVybiAoKG9mZnNldCA8PCAyKSB8ICgocGMgKyAyKSAmICgweGYwMDAwMDAwKSkpIDsKKyAgCit9CisKKworCitzdGF0aWMgc3RydWN0IHVwa19taXBzMTYgdXBrIDsKKworQ09SRV9BRERSIG1pcHMxNl9uZXh0X3BjKENPUkVfQUREUiBwYykKK3sKKyAgaW50IG9wIDsKKyAgdF9pbnN0IGluc3QgOworICAvKiBpbnN0ID0gbWlwc19mZXRjaF9pbnN0cnVjdGlvbihwYykgOyAtIFRoaXMgZG9lc250IGFsd2F5cyB3b3JrICovCisgIGluc3QgPSBmZXRjaF9taXBzXzE2KHBjKSA7CisgIHVway5pbnN0ID0gaW5zdCA7CisgIG9wID0gbWlwczE2X29wKHVway5pbnN0KSA7CisgIGlmIChtYXAxNltvcF0pCisgICAgeworICAgICAgaW50IHJlZyA7CisgICAgICBzd2l0Y2ggKG9wKQorCXsKKwljYXNlIDIgOiAvKiBCcmFuY2ggKi8KKwkgIHVway5mbXQgPSBpdHlwZSA7CisJICB1bnBhY2tfbWlwczE2KHBjLCZ1cGspIDsKKwkgIHsgbG9uZyBvZmZzZXQgOworCSAgICBvZmZzZXQgPSB1cGsub2Zmc2V0IDsKKwkgICAgaWYgKG9mZnNldCAmIDB4ODAwKQorCSAgICAgIHsgb2Zmc2V0ICY9IDB4ZWZmIDsKKwkJb2Zmc2V0ID0gLSBvZmZzZXQgOworCSAgICAgIH0KKwkgICAgcGMgKz0gKG9mZnNldCA8PCAxKSArIDIgOworCSAgfQorCSAgYnJlYWsgOworCWNhc2UgMyA6IC8qIEpBTCAsIEpBTFggLSBXYXRjaCBvdXQsIHRoZXNlIGFyZSAzMiBiaXQgaW5zdHJ1Y3Rpb24qLworCSAgIHVway5mbXQgPSBqYWx4dHlwZSA7CisJICAgdW5wYWNrX21pcHMxNihwYywmdXBrKSA7CisJICAgcGMgPSBhZGRfb2Zmc2V0XzE2KHBjLHVway5vZmZzZXQpIDsKKwkgICBpZiAoKHVway5pbnN0ID4+IDEwKSAmIDB4MDEpIC8qIEV4Y2hhbmdlIG1vZGUgKi8KKwkgICAgIHBjID0gcGMgJiB+IDB4MDEgOyAvKiBDbGVhciBsb3cgYml0LCBpbmRpY2F0ZSAzMiBiaXQgbW9kZSAqLworCSAgIGVsc2UgcGMgfD0gMHgwMSA7CisJICBicmVhayA7CisJY2FzZSA0IDogLyogYmVxeiAqLworCSAgICB1cGsuZm10ID0gcml0eXBlIDsKKwkgICAgdW5wYWNrX21pcHMxNihwYywmdXBrKSA7CisJICAgIHJlZyA9IHJlYWRfcmVnaXN0ZXIodXBrLnJlZ3gpIDsKKwkgICAgaWYgKHJlZyA9PSAwKSAKKwkJcGMgKz0gKHVway5vZmZzZXQgPDwgMSkgKyAyIDsKKwkgICAgZWxzZSBwYyArPSAyIDsKKwkgIGJyZWFrIDsKKwljYXNlIDUgOiAvKiBibmV6ICovCisJICAgIHVway5mbXQgPSByaXR5cGUgOworCSAgICB1bnBhY2tfbWlwczE2KHBjLCZ1cGspIDsKKwkgICAgcmVnID0gcmVhZF9yZWdpc3Rlcih1cGsucmVneCkgOworCSAgICBpZiAocmVnICE9IDApCisJICAgICAgIHBjICs9ICh1cGsub2Zmc2V0IDw8IDEpICsgMiA7CisJICAgIGVsc2UgcGMgKz0gMiA7CisJICBicmVhayA7CisJY2FzZSAxMiA6IC8qIEk4IEZvcm1hdHMgYnRleiBidG5leiAqLworCSAgICB1cGsuZm10ID0gaTh0eXBlIDsKKwkgICAgdW5wYWNrX21pcHMxNihwYywmdXBrKSA7CisJICAgIC8qIHVway5yZWd4IGNvbnRhaW5zIHRoZSBvcGNvZGUgKi8KKwkgICAgcmVnID0gcmVhZF9yZWdpc3RlcigyNCkgOyAvKiBUZXN0IHJlZ2lzdGVyIGlzIDI0ICovCisJICAgIGlmICgoKHVway5yZWd4ID09IDApICYmIChyZWcgPT0gMCkpICAgICAgICAvKiBCVEVaICovCisJCXx8ICgodXBrLnJlZ3ggPT0gMSApICYmIChyZWcgIT0gMCkpKSAvKiBCVE5FWiAqLworCSAgICAgIC8qIHBjID0gYWRkX29mZnNldF8xNihwYyx1cGsub2Zmc2V0KSA7ICovCisJICAgICAgcGMgKz0gKHVway5vZmZzZXQgPDwgMSkgKyAyIDsgCisJICAgIGVsc2UgcGMgKz0gMiA7CisJICBicmVhayA7CisJY2FzZSAyOSA6IC8qIFJSIEZvcm1hdHMgSlIsIEpBTFIsIEpBTFItUkEgKi8KKwkgIHVway5mbXQgPSBycnR5cGUgOworCSAgb3AgPSB1cGsuaW5zdCAmIDB4MWYgOworCSAgaWYgKG9wID09IDApCisJICAgIHsgCisJICAgICAgdXBrLnJlZ3ggPSAodXBrLmluc3QgPj4gOCkgJiAweDA3IDsKKwkgICAgICB1cGsucmVneSA9ICh1cGsuaW5zdCA+PiA1KSAmIDB4MDcgOworCSAgICAgIHN3aXRjaCAodXBrLnJlZ3kpCisJCXsKKwkJY2FzZSAwIDogcmVnID0gdXBrLnJlZ3ggOyAgIGJyZWFrIDsKKwkJY2FzZSAxIDogICByZWcgPSAzMSA7ICAgICAgIGJyZWFrIDsgLyogRnVuY3Rpb24gcmV0dXJuIGluc3RydWN0aW9uKi8KKwkJY2FzZSAyIDogICByZWcgPSB1cGsucmVneCA7IGJyZWFrIDsKKwkJZGVmYXVsdDogICByZWcgPSAzMSA7IGJyZWFrIDsgLyogQk9HVVMgR3Vlc3MgKi8KKwkJfQorCSAgICAgIHBjID0gcmVhZF9yZWdpc3RlcihyZWcpIDsKKwkgICAgfQorCSAgZWxzZSBwYyArPSAyIDsKKwkgIGJyZWFrIDsKKwljYXNlIDMwIDogLyogVGhpcyBpcyBhbiBleHRlbmQgaW5zdHJ1Y3Rpb24gKi8KKwkgIHBjICs9IDQgOyAvKiBEb250IGJlIHNldHRpbmcgYnJlYWtwaW50cyBvbiB0aGUgc2Vjb25kIGhhbGYgKi8KKwkgIGJyZWFrIDsKKwlkZWZhdWx0IDoKKwkgIHByaW50ZigiRmlsdGVyZWQgLSBuZXh0IFBDIHByb2JhYmx5IGluY29ycnJlY3QgZHVlIHRvIGp1bXAgaW5zdFxuIik7CisJICBwYyArPSAyIDsKKwkgIGJyZWFrIDsKKwl9CisgICAgfQorICBlbHNlIHBjKz0gMiA7IC8qIGp1c3QgYSBnb29kIG9sZCBpbnN0cnVjdGlvbiAqLworICAvKiBTZWUgaWYgd2UgQ0FOIGFjdHVhbGx5IGJyZWFrIG9uIHRoZSBuZXh0IGluc3RydWN0aW9uICovCisgIC8qIHByaW50ZigiTlhUbTE2UEMgJTA4eFxuIiwodW5zaWduZWQgbG9uZylwYykgOyAqLworICByZXR1cm4gcGMgOworfSAvKiBtaXBzMTZfbmV4dF9wYyAqLworCisvKiBUaGUgbWlwc19uZXh0X3BjIGZ1bmN0aW9uIHN1cHBvcnRzIHNpbmdsZV90ZXAgd2hlbiB0aGUgcmVtb3RlIHRhcmdldCBtb25pdG9yIG9yCisgICBzdHViIGlzIG5vdCBkZXZlbG9wZWQgZW5vdWdoIHRvIHNvIGEgc2luZ2xlX3N0ZXAuCisgICBJdCB3b3JrcyBieSBkZWNvZGluZyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBhbmQgcHJlZGljdGluZyB3aGVyZSBhIGJyYW5jaAorICAgd2lsbCBnby4gVGhpcyBpc250IGhhcmQgYmVjYXVzZSBhbGwgdGhlIGRhdGEgaXMgYXZhaWxhYmxlLgorICAgVGhlIE1JUFMzMiBhbmQgTUlQUzE2IHZhcmlhbnRzIGFyZSBxdWl0ZSBkaWZmZXJlbnQKKyAgICovCitDT1JFX0FERFIgbWlwc19uZXh0X3BjKENPUkVfQUREUiBwYykKK3sKKyAgdF9pbnN0IGluc3QgOworICAvKiBpbnN0ID0gbWlwc19mZXRjaF9pbnN0cnVjdGlvbihwYykgOyAqLworICAvKiBpZiAocGNfaXNfbWlwczE2KSA8LS0tLS0gVGhpcyBpcyBmYWlsaW5nICovCisgIGlmIChwYyAmIDB4MDEpIAorICAgIHJldHVybiBtaXBzMTZfbmV4dF9wYyhwYykgOworICBlbHNlIHJldHVybiBtaXBzMzJfbmV4dF9wYyhwYykgOworfSAvKiBtaXBzX25leHRfcGMgKi8KKworLyogR3VhcmFudGVlZCB0byBzZXQgZmNpLT5zYXZlZF9yZWdzIHRvIHNvbWUgdmFsdWVzIChpdCBuZXZlciBsZWF2ZXMgaXQKKyAgIE5VTEwpLiAgKi8KKwordm9pZAorbWlwc19maW5kX3NhdmVkX3JlZ3MgKGZjaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZjaTsKK3sKKyAgaW50IGlyZWc7CisgIENPUkVfQUREUiByZWdfcG9zaXRpb247CisgIC8qIHIwIGJpdCBtZWFucyBrZXJuZWwgdHJhcCAqLworICBpbnQga2VybmVsX3RyYXA7CisgIC8qIFdoYXQgcmVnaXN0ZXJzIGhhdmUgYmVlbiBzYXZlZD8gIEJpdG1hc2tzLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBnZW5fbWFzaywgZmxvYXRfbWFzazsKKyAgbWlwc19leHRyYV9mdW5jX2luZm9fdCBwcm9jX2Rlc2M7CisgIHRfaW5zdCBpbnN0OworCisgIGZyYW1lX3NhdmVkX3JlZ3NfemFsbG9jIChmY2kpOworCisgIC8qIElmIGl0IGlzIHRoZSBmcmFtZSBmb3Igc2lndHJhbXAsIHRoZSBzYXZlZCByZWdpc3RlcnMgYXJlIGxvY2F0ZWQKKyAgICAgaW4gYSBzaWdjb250ZXh0IHN0cnVjdHVyZSBzb21ld2hlcmUgb24gdGhlIHN0YWNrLgorICAgICBJZiB0aGUgc3RhY2sgbGF5b3V0IGZvciBzaWd0cmFtcCBjaGFuZ2VzIHdlIG1pZ2h0IGhhdmUgdG8gY2hhbmdlIHRoZXNlCisgICAgIGNvbnN0YW50cyBhbmQgdGhlIGNvbXBhbmlvbiBmaXh1cF9zaWd0cmFtcCBpbiBtZGVidWdyZWFkLmMgICovCisjaWZuZGVmIFNJR0ZSQU1FX0JBU0UKKy8qIFRvIHNhdGlzZnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucywgc2lnY29udGV4dCBpcyBsb2NhdGVkIDQgYnl0ZXMKKyAgIGFib3ZlIHRoZSBzaWd0cmFtcCBmcmFtZS4gICovCisjZGVmaW5lIFNJR0ZSQU1FX0JBU0UJCU1JUFNfUkVHU0laRQorLyogRklYTUUhICBBcmUgdGhlc2UgY29ycmVjdD8/ICovCisjZGVmaW5lIFNJR0ZSQU1FX1BDX09GRgkJKFNJR0ZSQU1FX0JBU0UgKyAyICogTUlQU19SRUdTSVpFKQorI2RlZmluZSBTSUdGUkFNRV9SRUdTQVZFX09GRgkoU0lHRlJBTUVfQkFTRSArIDMgKiBNSVBTX1JFR1NJWkUpCisjZGVmaW5lIFNJR0ZSQU1FX0ZQUkVHU0FWRV9PRkYJXAorICAgICAgICAoU0lHRlJBTUVfUkVHU0FWRV9PRkYgKyBNSVBTX05VTVJFR1MgKiBNSVBTX1JFR1NJWkUgKyAzICogTUlQU19SRUdTSVpFKQorI2VuZGlmCisjaWZuZGVmIFNJR0ZSQU1FX1JFR19TSVpFCisvKiBGSVhNRSEgIElzIHRoaXMgY29ycmVjdD8/ICovCisjZGVmaW5lIFNJR0ZSQU1FX1JFR19TSVpFCU1JUFNfUkVHU0laRQorI2VuZGlmCisgIGlmIChmY2ktPnNpZ25hbF9oYW5kbGVyX2NhbGxlcikKKyAgICB7CisgICAgICBmb3IgKGlyZWcgPSAwOyBpcmVnIDwgTUlQU19OVU1SRUdTOyBpcmVnKyspCisJeworIAkgIHJlZ19wb3NpdGlvbiA9IGZjaS0+ZnJhbWUgKyBTSUdGUkFNRV9SRUdTQVZFX09GRgorCQkJICsgaXJlZyAqIFNJR0ZSQU1FX1JFR19TSVpFOworIAkgIGZjaS0+c2F2ZWRfcmVnc1tpcmVnXSA9IHJlZ19wb3NpdGlvbjsKKwl9CisgICAgICBmb3IgKGlyZWcgPSAwOyBpcmVnIDwgTUlQU19OVU1SRUdTOyBpcmVnKyspCisJeworIAkgIHJlZ19wb3NpdGlvbiA9IGZjaS0+ZnJhbWUgKyBTSUdGUkFNRV9GUFJFR1NBVkVfT0ZGCisJCQkgKyBpcmVnICogU0lHRlJBTUVfUkVHX1NJWkU7CisgCSAgZmNpLT5zYXZlZF9yZWdzW0ZQMF9SRUdOVU0gKyBpcmVnXSA9IHJlZ19wb3NpdGlvbjsKKwl9CisgICAgICBmY2ktPnNhdmVkX3JlZ3NbUENfUkVHTlVNXSA9IGZjaS0+ZnJhbWUgKyBTSUdGUkFNRV9QQ19PRkY7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHByb2NfZGVzYyA9IGZjaS0+cHJvY19kZXNjOworICBpZiAocHJvY19kZXNjID09IE5VTEwpCisgICAgLyogSSdtIG5vdCBzdXJlIGhvdy93aGV0aGVyIHRoaXMgY2FuIGhhcHBlbi4gIE5vcm1hbGx5IHdoZW4gd2UgY2FuJ3QKKyAgICAgICBmaW5kIGEgcHJvY19kZXNjLCB3ZSAic3ludGhlc2l6ZSIgb25lIHVzaW5nIGhldXJpc3RpY19wcm9jX2Rlc2MKKyAgICAgICBhbmQgc2V0IHRoZSBzYXZlZF9yZWdzIHJpZ2h0IGF3YXkuICAqLworICAgIHJldHVybjsKKworICBrZXJuZWxfdHJhcCA9IFBST0NfUkVHX01BU0socHJvY19kZXNjKSAmIDE7CisgIGdlbl9tYXNrID0ga2VybmVsX3RyYXAgPyAweEZGRkZGRkZGIDogUFJPQ19SRUdfTUFTSyhwcm9jX2Rlc2MpOworICBmbG9hdF9tYXNrID0ga2VybmVsX3RyYXAgPyAweEZGRkZGRkZGIDogUFJPQ19GUkVHX01BU0socHJvY19kZXNjKTsKKworICBpZiAoLyogSW4gYW55IGZyYW1lIG90aGVyIHRoYW4gdGhlIGlubmVybW9zdCBvciBhIGZyYW1lIGludGVycnVwdGVkIGJ5CisJIGEgc2lnbmFsLCB3ZSBhc3N1bWUgdGhhdCBhbGwgcmVnaXN0ZXJzIGhhdmUgYmVlbiBzYXZlZC4KKwkgVGhpcyBhc3N1bWVzIHRoYXQgYWxsIHJlZ2lzdGVyIHNhdmVzIGluIGEgZnVuY3Rpb24gaGFwcGVuIGJlZm9yZQorCSB0aGUgZmlyc3QgZnVuY3Rpb24gY2FsbC4gICovCisgICAgICAoZmNpLT5uZXh0ID09IE5VTEwgfHwgZmNpLT5uZXh0LT5zaWduYWxfaGFuZGxlcl9jYWxsZXIpCisKKyAgICAgIC8qIEluIGEgZHVtbXkgZnJhbWUgd2Uga25vdyBleGFjdGx5IHdoZXJlIHRoaW5ncyBhcmUgc2F2ZWQuICAqLworICAgICAgJiYgIVBST0NfREVTQ19JU19EVU1NWSAocHJvY19kZXNjKQorCisgICAgICAvKiBEb24ndCBib3RoZXIgdW5sZXNzIHdlIGFyZSBpbnNpZGUgYSBmdW5jdGlvbiBwcm9sb2d1ZS4gIE91dHNpZGUgdGhlCisJIHByb2xvZ3VlLCB3ZSBrbm93IHdoZXJlIGV2ZXJ5dGhpbmcgaXMuICovCisKKyAgICAgICYmIGluX3Byb2xvZ3VlIChmY2ktPnBjLCBQUk9DX0xPV19BRERSIChwcm9jX2Rlc2MpKQorCisgICAgICAvKiBOb3Qgc3VyZSBleGFjdGx5IHdoYXQga2VybmVsX3RyYXAgbWVhbnMsIGJ1dCBpZiBpdCBtZWFucworCSB0aGUga2VybmVsIHNhdmVzIHRoZSByZWdpc3RlcnMgd2l0aG91dCBhIHByb2xvZ3VlIGRvaW5nIGl0LAorCSB3ZSBiZXR0ZXIgbm90IGV4YW1pbmUgdGhlIHByb2xvZ3VlIHRvIHNlZSB3aGV0aGVyIHJlZ2lzdGVycworCSBoYXZlIGJlZW4gc2F2ZWQgeWV0LiAgKi8KKyAgICAgICYmICFrZXJuZWxfdHJhcCkKKyAgICB7CisgICAgICAvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hldGhlciB0aGUgcmVnaXN0ZXJzIHRoYXQgdGhlIHByb2NfZGVzYworCSBjbGFpbXMgYXJlIHNhdmVkIGhhdmUgYmVlbiBzYXZlZCB5ZXQuICAqLworCisgICAgICBDT1JFX0FERFIgYWRkcjsKKworICAgICAgLyogQml0bWFza3M7IHNldCBpZiB3ZSBoYXZlIGZvdW5kIGEgc2F2ZSBmb3IgdGhlIHJlZ2lzdGVyLiAgKi8KKyAgICAgIHVuc2lnbmVkIGxvbmcgZ2VuX3NhdmVfZm91bmQgPSAwOworICAgICAgdW5zaWduZWQgbG9uZyBmbG9hdF9zYXZlX2ZvdW5kID0gMDsKKyAgICAgIGludCBpbnN0bGVuOworCisgICAgICAvKiBJZiB0aGUgYWRkcmVzcyBpcyBvZGQsIGFzc3VtZSB0aGlzIGlzIE1JUFMxNiBjb2RlLiAgKi8KKyAgICAgIGFkZHIgPSBQUk9DX0xPV19BRERSIChwcm9jX2Rlc2MpOworICAgICAgaW5zdGxlbiA9IHBjX2lzX21pcHMxNiAoYWRkcikgPyBNSVBTMTZfSU5TVExFTiA6IE1JUFNfSU5TVExFTjsKKworICAgICAgLyogU2NhbiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24ncyBpbnN0cnVjdGlvbnMgcHJlY2VkaW5nIHRoZSBjdXJyZW50CisgICAgICAgICBQQywgYW5kIGxvb2sgZm9yIHRob3NlIHRoYXQgc2F2ZSByZWdpc3RlcnMuICAqLworICAgICAgd2hpbGUgKGFkZHIgPCBmY2ktPnBjKQorCXsKKwkgIGluc3QgPSBtaXBzX2ZldGNoX2luc3RydWN0aW9uIChhZGRyKTsKKwkgIGlmIChwY19pc19taXBzMTYgKGFkZHIpKQorCSAgICBtaXBzMTZfZGVjb2RlX3JlZ19zYXZlIChpbnN0LCAmZ2VuX3NhdmVfZm91bmQpOworCSAgZWxzZQorCSAgICBtaXBzMzJfZGVjb2RlX3JlZ19zYXZlIChpbnN0LCAmZ2VuX3NhdmVfZm91bmQsICZmbG9hdF9zYXZlX2ZvdW5kKTsKKwkgIGFkZHIgKz0gaW5zdGxlbjsKKwl9CisgICAgICBnZW5fbWFzayA9IGdlbl9zYXZlX2ZvdW5kOworICAgICAgZmxvYXRfbWFzayA9IGZsb2F0X3NhdmVfZm91bmQ7CisgICAgfQorCisgIC8qIEZpbGwgaW4gdGhlIG9mZnNldHMgZm9yIHRoZSByZWdpc3RlcnMgd2hpY2ggZ2VuX21hc2sgc2F5cworICAgICB3ZXJlIHNhdmVkLiAgKi8KKyAgcmVnX3Bvc2l0aW9uID0gZmNpLT5mcmFtZSArIFBST0NfUkVHX09GRlNFVCAocHJvY19kZXNjKTsKKyAgZm9yIChpcmVnPSBNSVBTX05VTVJFR1MtMTsgZ2VuX21hc2s7IC0taXJlZywgZ2VuX21hc2sgPDw9IDEpCisgICAgaWYgKGdlbl9tYXNrICYgMHg4MDAwMDAwMCkKKyAgICAgIHsKKwlmY2ktPnNhdmVkX3JlZ3NbaXJlZ10gPSByZWdfcG9zaXRpb247CisJcmVnX3Bvc2l0aW9uIC09IE1JUFNfUkVHU0laRTsKKyAgICAgIH0KKworICAvKiBUaGUgTUlQUzE2IGVudHJ5IGluc3RydWN0aW9uIHNhdmVzICRzMCBhbmQgJHMxIGluIHRoZSByZXZlcnNlIG9yZGVyCisgICAgIG9mIHRoYXQgbm9ybWFsbHkgdXNlZCBieSBnY2MuICBUaGVyZWZvcmUsIHdlIGhhdmUgdG8gZmV0Y2ggdGhlIGZpcnN0CisgICAgIGluc3RydWN0aW9uIG9mIHRoZSBmdW5jdGlvbiwgYW5kIGlmIGl0J3MgYW4gZW50cnkgaW5zdHJ1Y3Rpb24gdGhhdAorICAgICBzYXZlcyAkczAgb3IgJHMxLCBjb3JyZWN0IHRoZWlyIHNhdmVkIGFkZHJlc3Nlcy4gICovCisgIGlmIChwY19pc19taXBzMTYgKFBST0NfTE9XX0FERFIgKHByb2NfZGVzYykpKQorICAgIHsKKyAgICAgIGluc3QgPSBtaXBzX2ZldGNoX2luc3RydWN0aW9uIChQUk9DX0xPV19BRERSIChwcm9jX2Rlc2MpKTsKKyAgICAgIGlmICgoaW5zdCAmIDB4ZjgxZikgPT0gMHhlODA5ICYmIChpbnN0ICYgMHg3MDApICE9IDB4NzAwKSAvKiBlbnRyeSAqLworCXsKKwkgIGludCByZWc7CisJICBpbnQgc3JlZ19jb3VudCA9IChpbnN0ID4+IDYpICYgMzsKKwkgIAorCSAgLyogQ2hlY2sgaWYgdGhlIHJhIHJlZ2lzdGVyIHdhcyBwdXNoZWQgb24gdGhlIHN0YWNrLiAgKi8KKwkgIHJlZ19wb3NpdGlvbiA9IGZjaS0+ZnJhbWUgKyBQUk9DX1JFR19PRkZTRVQgKHByb2NfZGVzYyk7CisJICBpZiAoaW5zdCAmIDB4MjApCisJICAgIHJlZ19wb3NpdGlvbiAtPSBNSVBTX1JFR1NJWkU7CisKKwkgIC8qIENoZWNrIGlmIHRoZSBzMCBhbmQgczEgcmVnaXN0ZXJzIHdlcmUgcHVzaGVkIG9uIHRoZSBzdGFjay4gICovCisJICBmb3IgKHJlZyA9IDE2OyByZWcgPCBzcmVnX2NvdW50KzE2OyByZWcrKykKKwkgICAgeworCSAgICAgIGZjaS0+c2F2ZWRfcmVnc1tyZWddID0gcmVnX3Bvc2l0aW9uOworCSAgICAgIHJlZ19wb3NpdGlvbiAtPSBNSVBTX1JFR1NJWkU7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIEZpbGwgaW4gdGhlIG9mZnNldHMgZm9yIHRoZSByZWdpc3RlcnMgd2hpY2ggZmxvYXRfbWFzayBzYXlzCisgICAgIHdlcmUgc2F2ZWQuICAqLworICByZWdfcG9zaXRpb24gPSBmY2ktPmZyYW1lICsgUFJPQ19GUkVHX09GRlNFVCAocHJvY19kZXNjKTsKKworICAvKiBUaGUgZnJlZ19vZmZzZXQgcG9pbnRzIHRvIHdoZXJlIHRoZSBmaXJzdCAqZG91YmxlKiByZWdpc3RlcgorICAgICBpcyBzYXZlZC4gIFNvIHNraXAgdG8gdGhlIGhpZ2gtb3JkZXIgd29yZC4gKi8KKyAgaWYgKCEgR0RCX1RBUkdFVF9JU19NSVBTNjQpCisgICAgcmVnX3Bvc2l0aW9uICs9IE1JUFNfUkVHU0laRTsKKworICAvKiBGaWxsIGluIHRoZSBvZmZzZXRzIGZvciB0aGUgZmxvYXQgcmVnaXN0ZXJzIHdoaWNoIGZsb2F0X21hc2sgc2F5cworICAgICB3ZXJlIHNhdmVkLiAgKi8KKyAgZm9yIChpcmVnID0gTUlQU19OVU1SRUdTLTE7IGZsb2F0X21hc2s7IC0taXJlZywgZmxvYXRfbWFzayA8PD0gMSkKKyAgICBpZiAoZmxvYXRfbWFzayAmIDB4ODAwMDAwMDApCisgICAgICB7CisJZmNpLT5zYXZlZF9yZWdzW0ZQMF9SRUdOVU0raXJlZ10gPSByZWdfcG9zaXRpb247CisJcmVnX3Bvc2l0aW9uIC09IE1JUFNfUkVHU0laRTsKKyAgICAgIH0KKworICBmY2ktPnNhdmVkX3JlZ3NbUENfUkVHTlVNXSA9IGZjaS0+c2F2ZWRfcmVnc1tSQV9SRUdOVU1dOworfQorCitzdGF0aWMgQ09SRV9BRERSCityZWFkX25leHRfZnJhbWVfcmVnKGZpLCByZWdubykKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworICAgICBpbnQgcmVnbm87Cit7CisgIGZvciAoOyBmaTsgZmkgPSBmaS0+bmV4dCkKKyAgICB7CisgICAgICAvKiBXZSBoYXZlIHRvIGdldCB0aGUgc2F2ZWQgc3AgZnJvbSB0aGUgc2lnY29udGV4dAorCSBpZiBpdCBpcyBhIHNpZ25hbCBoYW5kbGVyIGZyYW1lLiAgKi8KKyAgICAgIGlmIChyZWdubyA9PSBTUF9SRUdOVU0gJiYgIWZpLT5zaWduYWxfaGFuZGxlcl9jYWxsZXIpCisJcmV0dXJuIGZpLT5mcmFtZTsKKyAgICAgIGVsc2UKKwl7CisJICBpZiAoZmktPnNhdmVkX3JlZ3MgPT0gTlVMTCkKKwkgICAgbWlwc19maW5kX3NhdmVkX3JlZ3MgKGZpKTsKKwkgIGlmIChmaS0+c2F2ZWRfcmVnc1tyZWdub10pCisJICAgIHJldHVybiByZWFkX21lbW9yeV9pbnRlZ2VyKGZpLT5zYXZlZF9yZWdzW3JlZ25vXSwgTUlQU19SRUdTSVpFKTsKKwl9CisgICAgfQorICByZXR1cm4gcmVhZF9yZWdpc3RlciAocmVnbm8pOworfQorCisvKiBtaXBzX2FkZHJfYml0c19yZW1vdmUgLSByZW1vdmUgdXNlbGVzcyBhZGRyZXNzIGJpdHMgICovCisKK0NPUkVfQUREUgorbWlwc19hZGRyX2JpdHNfcmVtb3ZlIChhZGRyKQorICAgIENPUkVfQUREUiBhZGRyOworeworI2lmIEdEQl9UQVJHRVRfSVNfTUlQUzY0CisgIGlmIChtYXNrX2FkZHJlc3NfcCAmJiAoYWRkciA+PiAzMiA9PSAoQ09SRV9BRERSKTB4ZmZmZmZmZmYpKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaGFjayBpcyBhIHdvcmstYXJvdW5kIGZvciBleGlzdGluZyBib2FyZHMgdXNpbmcgUE1PTiwKKwkgdGhlIHNpbXVsYXRvciwgYW5kIGFueSBvdGhlciA2NC1iaXQgdGFyZ2V0cyB0aGF0IGRvZXNuJ3QgaGF2ZQorCSB0cnVlIDY0LWJpdCBhZGRyZXNzaW5nLiAgT24gdGhlc2UgdGFyZ2V0cywgdGhlIHVwcGVyIDMyIGJpdHMKKwkgb2YgYWRkcmVzc2VzIGFyZSBpZ25vcmVkIGJ5IHRoZSBoYXJkd2FyZS4gIFRodXMsIHRoZSBQQyBvciBTUAorCSBhcmUgbGlrZWx5IHRvIGhhdmUgYmVlbiBzaWduIGV4dGVuZGVkIHRvIGFsbCAxcyBieSBpbnN0cnVjdGlvbgorCSBzZXF1ZW5jZXMgdGhhdCBsb2FkIDMyLWJpdCBhZGRyZXNzZXMuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsCisJIHBpZWNlIG9mIGNvZGUgdGhhdCBsb2FkcyBhbiBhZGRyZXNzIGlzIHRoaXM6CisJCWx1aSAkcjIsIDx1cHBlciAxNiBiaXRzPgorCQlvcmkgJHIyLCA8bG93ZXIgMTYgYml0cz4KKwkgQnV0IHRoZSBsdWkgc2lnbi1leHRlbmRzIHRoZSB2YWx1ZSBzdWNoIHRoYXQgdGhlIHVwcGVyIDMyIGJpdHMKKwkgbWF5IGJlIGFsbCAxcy4gIFRoZSB3b3JrYXJvdW5kIGlzIHNpbXBseSB0byBtYXNrIG9mZiB0aGVzZSBiaXRzLgorCSBJbiB0aGUgZnV0dXJlLCBnY2MgbWF5IGJlIGNoYW5nZWQgdG8gc3VwcG9ydCB0cnVlIDY0LWJpdAorCSBhZGRyZXNzaW5nLCBhbmQgdGhpcyBtYXNraW5nIHdpbGwgaGF2ZSB0byBiZSBkaXNhYmxlZC4gICovCisgICAgICAgIGFkZHIgJj0gKENPUkVfQUREUikweGZmZmZmZmZmOworICAgIH0KKyNlbHNlCisgIC8qIEV2ZW4gd2hlbiBHREIgaXMgY29uZmlndXJlZCBmb3Igc29tZSAzMi1iaXQgdGFyZ2V0cyAoZS5nLiBtaXBzLWVsZiksCisgICAgIEJGRCBpcyBjb25maWd1cmVkIHRvIGhhbmRsZSA2NC1iaXQgdGFyZ2V0cywgc28gQ09SRV9BRERSIGlzIDY0IGJpdHMuCisgICAgIFNvIHdlIHN0aWxsIGhhdmUgdG8gbWFzayBvZmYgdXNlbGVzcyBiaXRzIGZyb20gYWRkcmVzc2VzLiAgKi8KKyAgYWRkciAmPSAoQ09SRV9BRERSKTB4ZmZmZmZmZmY7CisjZW5kaWYKKworICByZXR1cm4gYWRkcjsKK30KKwordm9pZAorbWlwc19pbml0X2ZyYW1lX3BjX2ZpcnN0IChmcm9tbGVhZiwgcHJldikKKyAgICAgaW50IGZyb21sZWFmOworICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqcHJldjsKK3sKKyAgQ09SRV9BRERSIHBjLCB0bXA7CisKKyAgcGMgPSAoKGZyb21sZWFmKSA/IFNBVkVEX1BDX0FGVEVSX0NBTEwgKHByZXYtPm5leHQpIDoKKyAgICAgICAgcHJldi0+bmV4dCA/IEZSQU1FX1NBVkVEX1BDIChwcmV2LT5uZXh0KSA6IHJlYWRfcGMgKCkpOworICB0bXAgPSBtaXBzX3NraXBfc3R1YiAocGMpOworICBwcmV2LT5wYyA9ICB0bXAgPyB0bXAgOiBwYzsKK30KKworCitDT1JFX0FERFIKK21pcHNfZnJhbWVfc2F2ZWRfcGMoZnJhbWUpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgQ09SRV9BRERSIHNhdmVkX3BjOworICBtaXBzX2V4dHJhX2Z1bmNfaW5mb190IHByb2NfZGVzYyA9IGZyYW1lLT5wcm9jX2Rlc2M7CisgIC8qIFdlIGhhdmUgdG8gZ2V0IHRoZSBzYXZlZCBwYyBmcm9tIHRoZSBzaWdjb250ZXh0CisgICAgIGlmIGl0IGlzIGEgc2lnbmFsIGhhbmRsZXIgZnJhbWUuICAqLworICBpbnQgcGNyZWcgPSBmcmFtZS0+c2lnbmFsX2hhbmRsZXJfY2FsbGVyID8gUENfUkVHTlVNCisJICAgICAgOiAocHJvY19kZXNjID8gUFJPQ19QQ19SRUcocHJvY19kZXNjKSA6IFJBX1JFR05VTSk7CisKKyAgaWYgKHByb2NfZGVzYyAmJiBQUk9DX0RFU0NfSVNfRFVNTVkocHJvY19kZXNjKSkKKyAgICBzYXZlZF9wYyA9IHJlYWRfbWVtb3J5X2ludGVnZXIoZnJhbWUtPmZyYW1lIC0gTUlQU19SRUdTSVpFLCBNSVBTX1JFR1NJWkUpOworICBlbHNlCisgICAgc2F2ZWRfcGMgPSByZWFkX25leHRfZnJhbWVfcmVnKGZyYW1lLCBwY3JlZyk7CisKKyAgcmV0dXJuIEFERFJfQklUU19SRU1PVkUgKHNhdmVkX3BjKTsKK30KKworc3RhdGljIHN0cnVjdCBtaXBzX2V4dHJhX2Z1bmNfaW5mbyB0ZW1wX3Byb2NfZGVzYzsKK3N0YXRpYyBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyB0ZW1wX3NhdmVkX3JlZ3M7CisKKy8qIFNldCBhIHJlZ2lzdGVyJ3Mgc2F2ZWQgc3RhY2sgYWRkcmVzcyBpbiB0ZW1wX3NhdmVkX3JlZ3MuICBJZiBhbiBhZGRyZXNzCisgICBoYXMgYWxyZWFkeSBiZWVuIHNldCBmb3IgdGhpcyByZWdpc3RlciwgZG8gbm90aGluZzsgdGhpcyB3YXkgd2Ugd2lsbAorICAgb25seSByZWNvZ25pemUgdGhlIGZpcnN0IHNhdmUgb2YgYSBnaXZlbiByZWdpc3RlciBpbiBhIGZ1bmN0aW9uIHByb2xvZ3VlLgorICAgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgbWlwc3sxNiwzMn1faGV1cmlzdGljX3Byb2NfZGVzYy4gICovCisKK3N0YXRpYyB2b2lkCitzZXRfcmVnX29mZnNldCAocmVnbm8sIG9mZnNldCkKKyAgICAgaW50IHJlZ25vOworICAgICBDT1JFX0FERFIgb2Zmc2V0OworeworICBpZiAodGVtcF9zYXZlZF9yZWdzLnJlZ3NbcmVnbm9dID09IDApCisgICAgdGVtcF9zYXZlZF9yZWdzLnJlZ3NbcmVnbm9dID0gb2Zmc2V0OworfQorCisKKy8qIFRlc3Qgd2hldGhlciB0aGUgUEMgcG9pbnRzIHRvIHRoZSByZXR1cm4gaW5zdHJ1Y3Rpb24gYXQgdGhlCisgICBlbmQgb2YgYSBmdW5jdGlvbi4gKi8KKworc3RhdGljIGludCAKK21pcHNfYWJvdXRfdG9fcmV0dXJuIChwYykKKyAgICAgQ09SRV9BRERSIHBjOworeworICBpZiAocGNfaXNfbWlwczE2IChwYykpCisgICAgLyogVGhpcyBtaXBzMTYgY2FzZSBpc24ndCBuZWNlc3NhcmlseSByZWxpYWJsZS4gIFNvbWV0aW1lcyB0aGUgY29tcGlsZXIKKyAgICAgICBnZW5lcmF0ZXMgYSAianIgJHJhIjsgb3RoZXIgdGltZXMgaXQgZ2VuZXJhdGVzIGNvZGUgdG8gbG9hZAorICAgICAgIHRoZSByZXR1cm4gYWRkcmVzcyBmcm9tIHRoZSBzdGFjayB0byBhbiBhY2Nlc3NpYmxlIHJlZ2lzdGVyIChzdWNoCisgICAgICAgYXMgJGEzKSwgdGhlbiBhICJqciIgdXNpbmcgdGhhdCByZWdpc3Rlci4gIFRoaXMgc2Vjb25kIGNhc2UKKyAgICAgICBpcyBhbG1vc3QgaW1wb3NzaWJsZSB0byBkaXN0aW5ndWlzaCBmcm9tIGFuIGluZGlyZWN0IGp1bXAKKyAgICAgICB1c2VkIGZvciBzd2l0Y2ggc3RhdGVtZW50cywgc28gd2UgZG9uJ3QgZXZlbiB0cnkuICAqLworICAgIHJldHVybiBtaXBzX2ZldGNoX2luc3RydWN0aW9uIChwYykgPT0gMHhlODIwOwkvKiBqciAkcmEgKi8KKyAgZWxzZQorICAgIHJldHVybiBtaXBzX2ZldGNoX2luc3RydWN0aW9uIChwYykgPT0gMHgzZTAwMDA4OwkvKiBqciAkcmEgKi8KK30KKworCisvKiBUaGlzIGZlbmNlcG9zdCBsb29rcyBoaWdobHkgc3VzcGljaW91cyB0byBtZS4gIFJlbW92aW5nIGl0IGFsc28KKyAgIHNlZW1zIHN1c3BpY2lvdXMgYXMgaXQgY291bGQgYWZmZWN0IHJlbW90ZSBkZWJ1Z2dpbmcgYWNyb3NzIHNlcmlhbAorICAgbGluZXMuICAqLworCitzdGF0aWMgQ09SRV9BRERSCitoZXVyaXN0aWNfcHJvY19zdGFydCAocGMpCisgICAgQ09SRV9BRERSIHBjOworeworICAgIENPUkVfQUREUiBzdGFydF9wYzsKKyAgICBDT1JFX0FERFIgZmVuY2U7CisgICAgaW50IGluc3RsZW47CisgICAgaW50IHNlZW5fYWRqc3AgPSAwOworCisgICAgcGMgPSBBRERSX0JJVFNfUkVNT1ZFIChwYyk7CisgICAgc3RhcnRfcGMgPSBwYzsKKyAgICBmZW5jZSA9IHN0YXJ0X3BjIC0gaGV1cmlzdGljX2ZlbmNlX3Bvc3Q7CisgICAgaWYgKHN0YXJ0X3BjID09IDApCXJldHVybiAwOworCisgICAgaWYgKGhldXJpc3RpY19mZW5jZV9wb3N0ID09IFVJTlRfTUFYCisJfHwgZmVuY2UgPCBWTV9NSU5fQUREUkVTUykKKyAgICAgIGZlbmNlID0gVk1fTUlOX0FERFJFU1M7CisKKyAgICBpbnN0bGVuID0gcGNfaXNfbWlwczE2IChwYykgPyBNSVBTMTZfSU5TVExFTiA6IE1JUFNfSU5TVExFTjsKKworICAgIC8qIHNlYXJjaCBiYWNrIGZvciBwcmV2aW91cyByZXR1cm4gKi8KKyAgICBmb3IgKHN0YXJ0X3BjIC09IGluc3RsZW47IDsgc3RhcnRfcGMgLT0gaW5zdGxlbikKKwlpZiAoc3RhcnRfcGMgPCBmZW5jZSkKKwkgIHsKKwkgICAgLyogSXQncyBub3QgY2xlYXIgdG8gbWUgd2h5IHdlIHJlYWNoIHRoaXMgcG9pbnQgd2hlbgorCSAgICAgICBzdG9wX3Nvb25fcXVpZXRseSwgYnV0IHdpdGggdGhpcyB0ZXN0LCBhdCBsZWFzdCB3ZQorCSAgICAgICBkb24ndCBwcmludCBvdXQgd2FybmluZ3MgZm9yIGV2ZXJ5IGNoaWxkIGZvcmtlZCAoZWcsIG9uCisJICAgICAgIGRlY3N0YXRpb24pLiAgMjJhcHI5MyByaWNoQGN5Z251cy5jb20uICAqLworCSAgICBpZiAoIXN0b3Bfc29vbl9xdWlldGx5KQorCSAgICAgIHsKKwkJc3RhdGljIGludCBibHVyYl9wcmludGVkID0gMDsKKworCQlpZiAoZmVuY2UgPT0gVk1fTUlOX0FERFJFU1MpCisJCSAgd2FybmluZygiSGl0IGJlZ2lubmluZyBvZiB0ZXh0IHNlY3Rpb24gd2l0aG91dCBmaW5kaW5nIik7CisJCWVsc2UKKwkJICB3YXJuaW5nKCJIaXQgaGV1cmlzdGljLWZlbmNlLXBvc3Qgd2l0aG91dCBmaW5kaW5nIik7CisJCQorCQl3YXJuaW5nKCJlbmNsb3NpbmcgZnVuY3Rpb24gZm9yIGFkZHJlc3MgMHglcyIsIHBhZGRyX256IChwYykpOworCQlpZiAoIWJsdXJiX3ByaW50ZWQpCisJCSAgeworCQkgICAgcHJpbnRmX2ZpbHRlcmVkICgiXAorVGhpcyB3YXJuaW5nIG9jY3VycyBpZiB5b3UgYXJlIGRlYnVnZ2luZyBhIGZ1bmN0aW9uIHdpdGhvdXQgYW55IHN5bWJvbHNcblwKKyhmb3IgZXhhbXBsZSwgaW4gYSBzdHJpcHBlZCBleGVjdXRhYmxlKS4gIEluIHRoYXQgY2FzZSwgeW91IG1heSB3aXNoIHRvXG5cCitpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgc2VhcmNoIHdpdGggdGhlIGBzZXQgaGV1cmlzdGljLWZlbmNlLXBvc3QnIGNvbW1hbmQuXG5cCitcblwKK090aGVyd2lzZSwgeW91IHRvbGQgR0RCIHRoZXJlIHdhcyBhIGZ1bmN0aW9uIHdoZXJlIHRoZXJlIGlzbid0IG9uZSwgb3JcblwKKyhtb3JlIGxpa2VseSkgeW91IGhhdmUgZW5jb3VudGVyZWQgYSBidWcgaW4gR0RCLlxuIik7CisJCSAgICBibHVyYl9wcmludGVkID0gMTsKKwkJICB9CisJICAgICAgfQorCisJICAgIHJldHVybiAwOyAKKwkgIH0KKwllbHNlIGlmIChwY19pc19taXBzMTYgKHN0YXJ0X3BjKSkKKwkgIHsKKwkgICAgdW5zaWduZWQgc2hvcnQgaW5zdDsKKworCSAgICAvKiBPbiBNSVBTMTYsIGFueSBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyBsaWtlbHkgdG8gYmUgdGhlCisJICAgICAgIHN0YXJ0IG9mIGEgZnVuY3Rpb246CisJCSBlbnRyeQorCQkgYWRkaXUgc3AsLW4KKwkJIGRhZGRpdSBzcCwtbgorCQkgZXh0ZW5kIC1uIGZvbGxvd2VkIGJ5ICdhZGRpdSBzcCwrbicgb3IgJ2RhZGRpdSBzcCwrbicgICovCisJICAgIGluc3QgPSBtaXBzX2ZldGNoX2luc3RydWN0aW9uIChzdGFydF9wYyk7CisJICAgIGlmICgoKGluc3QgJiAweGY4MWYpID09IDB4ZTgwOSAmJiAoaW5zdCAmIDB4NzAwKSAhPSAweDcwMCkgLyogZW50cnkgKi8KKwkJfHwgKGluc3QgJiAweGZmODApID09IDB4NjM4MAkvKiBhZGRpdSBzcCwtbiAqLworCQl8fCAoaW5zdCAmIDB4ZmY4MCkgPT0gMHhmYjgwCS8qIGRhZGRpdSBzcCwtbiAqLworCQl8fCAoKGluc3QgJiAweGY4MTApID09IDB4ZjAxMCAmJiBzZWVuX2FkanNwKSkJLyogZXh0ZW5kIC1uICovCisJICAgICAgYnJlYWs7CisJICAgIGVsc2UgaWYgKChpbnN0ICYgMHhmZjAwKSA9PSAweDYzMDAJCS8qIGFkZGl1IHNwICovCisJCSAgICAgfHwgKGluc3QgJiAweGZmMDApID09IDB4ZmIwMCkJLyogZGFkZGl1IHNwICovCisJICAgICAgc2Vlbl9hZGpzcCA9IDE7CisJICAgIGVsc2UKKwkgICAgICBzZWVuX2FkanNwID0gMDsKKwkgIH0KKwllbHNlIGlmIChtaXBzX2Fib3V0X3RvX3JldHVybiAoc3RhcnRfcGMpKQorCSAgeworCSAgICBzdGFydF9wYyArPSAyICogTUlQU19JTlNUTEVOOyAvKiBza2lwIHJldHVybiwgYW5kIGl0cyBkZWxheSBzbG90ICovCisJICAgIGJyZWFrOworCSAgfQorCisjaWYgMAorICAgIC8qIHNraXAgbm9wcyAodXN1YWxseSAxKSAwIC0gaXMgdGhpcyAqLworICAgIHdoaWxlIChzdGFydF9wYyA8IHBjICYmIHJlYWRfbWVtb3J5X2ludGVnZXIgKHN0YXJ0X3BjLCBNSVBTX0lOU1RMRU4pID09IDApCisJc3RhcnRfcGMgKz0gTUlQU19JTlNUTEVOOworI2VuZGlmCisgICAgcmV0dXJuIHN0YXJ0X3BjOworfQorCisvKiBGZXRjaCB0aGUgaW1tZWRpYXRlIHZhbHVlIGZyb20gYSBNSVBTMTYgaW5zdHJ1Y3Rpb24uCisgICBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGFuIEVYVEVORCwgdXNlIGl0IHRvIGV4dGVuZAorICAgdGhlIHVwcGVyIGJpdHMgb2YgdGhlIGltbWVkaWF0ZSB2YWx1ZS4gIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24KKyAgIGZvciBtaXBzMTZfaGV1cmlzdGljX3Byb2NfZGVzYy4gICovCisKK3N0YXRpYyBpbnQKK21pcHMxNl9nZXRfaW1tIChwcmV2X2luc3QsIGluc3QsIG5iaXRzLCBzY2FsZSwgaXNfc2lnbmVkKQorICAgIHVuc2lnbmVkIHNob3J0IHByZXZfaW5zdDsJLyogcHJldmlvdXMgaW5zdHJ1Y3Rpb24gKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnN0OwkvKiBjdXJyZW50IGluc3RydWN0aW9uICovCisgICAgaW50IG5iaXRzOwkJCS8qIG51bWJlciBvZiBiaXRzIGluIGltbSBmaWVsZCAqLworICAgIGludCBzY2FsZTsJCQkvKiBzY2FsZSBmYWN0b3IgdG8gYmUgYXBwbGllZCB0byBpbW0gKi8KKyAgICBpbnQgaXNfc2lnbmVkOwkJLyogaXMgdGhlIGltbSBmaWVsZCBzaWduZWQ/ICovCit7CisgIGludCBvZmZzZXQ7CisKKyAgaWYgKChwcmV2X2luc3QgJiAweGY4MDApID09IDB4ZjAwMCkJLyogcHJldiBpbnN0cnVjdGlvbiB3YXMgRVhURU5EPyAqLworICAgIHsKKyAgICAgIG9mZnNldCA9ICgocHJldl9pbnN0ICYgMHgxZikgPDwgMTEpIHwgKHByZXZfaW5zdCAmIDB4N2UwKTsKKyAgICAgIGlmIChvZmZzZXQgJiAweDgwMDApCQkvKiBjaGVjayBmb3IgbmVnYXRpdmUgZXh0ZW5kICovCisJb2Zmc2V0ID0gMCAtICgweDEwMDAwIC0gKG9mZnNldCAmIDB4ZmZmZikpOworICAgICAgcmV0dXJuIG9mZnNldCB8IChpbnN0ICYgMHgxZik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IG1heF9pbW0gPSAxIDw8IG5iaXRzOworICAgICAgaW50IG1hc2sgPSBtYXhfaW1tIC0gMTsKKyAgICAgIGludCBzaWduX2JpdCA9IG1heF9pbW0gPj4gMTsKKworICAgICAgb2Zmc2V0ID0gaW5zdCAmIG1hc2s7CisgICAgICBpZiAoaXNfc2lnbmVkICYmIChvZmZzZXQgJiBzaWduX2JpdCkpCisJb2Zmc2V0ID0gMCAtIChtYXhfaW1tIC0gb2Zmc2V0KTsKKyAgICAgIHJldHVybiBvZmZzZXQgKiBzY2FsZTsKKyAgICB9Cit9CisKKworLyogRmlsbCBpbiB2YWx1ZXMgaW4gdGVtcF9wcm9jX2Rlc2MgYmFzZWQgb24gdGhlIE1JUFMxNiBpbnN0cnVjdGlvbgorICAgc3RyZWFtIGZyb20gc3RhcnRfcGMgdG8gbGltaXRfcGMuICAqLworCitzdGF0aWMgdm9pZAorbWlwczE2X2hldXJpc3RpY19wcm9jX2Rlc2Moc3RhcnRfcGMsIGxpbWl0X3BjLCBuZXh0X2ZyYW1lLCBzcCkKKyAgICBDT1JFX0FERFIgc3RhcnRfcGMsIGxpbWl0X3BjOworICAgIHN0cnVjdCBmcmFtZV9pbmZvICpuZXh0X2ZyYW1lOworICAgIENPUkVfQUREUiBzcDsKK3sKKyAgQ09SRV9BRERSIGN1cl9wYzsKKyAgQ09SRV9BRERSIGZyYW1lX2FkZHIgPSAwOwkvKiBWYWx1ZSBvZiAkcjE3LCB1c2VkIGFzIGZyYW1lIHBvaW50ZXIgKi8KKyAgdW5zaWduZWQgc2hvcnQgcHJldl9pbnN0ID0gMDsJLyogc2F2ZWQgY29weSBvZiBwcmV2aW91cyBpbnN0cnVjdGlvbiAqLworICB1bnNpZ25lZCBpbnN0ID0gMDsJCS8qIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gKi8KKyAgdW5zaWduZWQgZW50cnlfaW5zdCA9IDA7CS8qIHRoZSBlbnRyeSBpbnN0cnVjdGlvbiAqLworICBpbnQgcmVnLCBvZmZzZXQ7CisKKyAgUFJPQ19GUkFNRV9PRkZTRVQoJnRlbXBfcHJvY19kZXNjKSA9IDA7CS8qIHNpemUgb2Ygc3RhY2sgZnJhbWUgKi8KKyAgUFJPQ19GUkFNRV9BREpVU1QoJnRlbXBfcHJvY19kZXNjKSA9IDA7CS8qIG9mZnNldCBvZiBGUCBmcm9tIFNQICovCisKKyAgZm9yIChjdXJfcGMgPSBzdGFydF9wYzsgY3VyX3BjIDwgbGltaXRfcGM7IGN1cl9wYyArPSBNSVBTMTZfSU5TVExFTikKKyAgICB7CisgICAgICAvKiBTYXZlIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4gIElmIGl0J3MgYW4gRVhURU5ELCB3ZSdsbCBleHRyYWN0CisgICAgICAgICB0aGUgaW1tZWRpYXRlIG9mZnNldCBleHRlbnNpb24gZnJvbSBpdCBpbiBtaXBzMTZfZ2V0X2ltbS4gICovCisgICAgICBwcmV2X2luc3QgPSBpbnN0OworCisgICAgICAvKiBGZXRjaCBhbmQgZGVjb2RlIHRoZSBpbnN0cnVjdGlvbi4gICAqLworICAgICAgaW5zdCA9ICh1bnNpZ25lZCBzaG9ydCkgbWlwc19mZXRjaF9pbnN0cnVjdGlvbiAoY3VyX3BjKTsKKyAgICAgIGlmICgoaW5zdCAmIDB4ZmYwMCkgPT0gMHg2MzAwCQkvKiBhZGRpdSBzcCAqLworCSAgfHwgKGluc3QgJiAweGZmMDApID09IDB4ZmIwMCkJCS8qIGRhZGRpdSBzcCAqLworCXsKKwkgIG9mZnNldCA9IG1pcHMxNl9nZXRfaW1tIChwcmV2X2luc3QsIGluc3QsIDgsIDgsIDEpOworCSAgaWYgKG9mZnNldCA8IDApCQkJLyogbmVnYXRpdmUgc3RhY2sgYWRqdXN0bWVudD8gKi8KKwkgICAgUFJPQ19GUkFNRV9PRkZTRVQoJnRlbXBfcHJvY19kZXNjKSAtPSBvZmZzZXQ7CisJICBlbHNlCisJICAgIC8qIEV4aXQgbG9vcCBpZiBhIHBvc2l0aXZlIHN0YWNrIGFkanVzdG1lbnQgaXMgZm91bmQsIHdoaWNoCisJICAgICAgIHVzdWFsbHkgbWVhbnMgdGhhdCB0aGUgc3RhY2sgY2xlYW51cCBjb2RlIGluIHRoZSBmdW5jdGlvbgorCSAgICAgICBlcGlsb2d1ZSBpcyByZWFjaGVkLiAgKi8KKwkgICAgYnJlYWs7CisJfQorICAgICAgZWxzZSBpZiAoKGluc3QgJiAweGY4MDApID09IDB4ZDAwMCkJLyogc3cgcmVnLG4oJHNwKSAqLworCXsKKwkgIG9mZnNldCA9IG1pcHMxNl9nZXRfaW1tIChwcmV2X2luc3QsIGluc3QsIDgsIDQsIDApOworCSAgcmVnID0gbWlwczE2X3RvXzMyX3JlZ1soaW5zdCAmIDB4NzAwKSA+PiA4XTsKKwkgIFBST0NfUkVHX01BU0soJnRlbXBfcHJvY19kZXNjKSB8PSAoMSA8PCByZWcpOworCSAgc2V0X3JlZ19vZmZzZXQgKHJlZywgc3AgKyBvZmZzZXQpOworCX0KKyAgICAgIGVsc2UgaWYgKChpbnN0ICYgMHhmZjAwKSA9PSAweGY5MDApCS8qIHNkIHJlZyxuKCRzcCkgKi8KKwl7CisJICBvZmZzZXQgPSBtaXBzMTZfZ2V0X2ltbSAocHJldl9pbnN0LCBpbnN0LCA1LCA4LCAwKTsKKwkgIHJlZyA9IG1pcHMxNl90b18zMl9yZWdbKGluc3QgJiAweGUwKSA+PiA1XTsKKwkgIFBST0NfUkVHX01BU0soJnRlbXBfcHJvY19kZXNjKSB8PSAoMSA8PCByZWcpOworCSAgc2V0X3JlZ19vZmZzZXQgKHJlZywgc3AgKyBvZmZzZXQpOworCX0KKyAgICAgIGVsc2UgaWYgKChpbnN0ICYgMHhmZjAwKSA9PSAweDYyMDApCS8qIHN3ICRyYSxuKCRzcCkgKi8KKwl7CisJICBvZmZzZXQgPSBtaXBzMTZfZ2V0X2ltbSAocHJldl9pbnN0LCBpbnN0LCA4LCA0LCAwKTsKKwkgIFBST0NfUkVHX01BU0soJnRlbXBfcHJvY19kZXNjKSB8PSAoMSA8PCBSQV9SRUdOVU0pOworCSAgc2V0X3JlZ19vZmZzZXQgKFJBX1JFR05VTSwgc3AgKyBvZmZzZXQpOworCX0KKyAgICAgIGVsc2UgaWYgKChpbnN0ICYgMHhmZjAwKSA9PSAweGZhMDApCS8qIHNkICRyYSxuKCRzcCkgKi8KKwl7CisJICBvZmZzZXQgPSBtaXBzMTZfZ2V0X2ltbSAocHJldl9pbnN0LCBpbnN0LCA4LCA4LCAwKTsKKwkgIFBST0NfUkVHX01BU0soJnRlbXBfcHJvY19kZXNjKSB8PSAoMSA8PCBSQV9SRUdOVU0pOworCSAgc2V0X3JlZ19vZmZzZXQgKFJBX1JFR05VTSwgc3AgKyBvZmZzZXQpOworCX0KKyAgICAgIGVsc2UgaWYgKGluc3QgPT0gMHg2NzNkKQkJCS8qIG1vdmUgJHMxLCAkc3AgKi8KKwl7CisJICBmcmFtZV9hZGRyID0gc3A7CisJICBQUk9DX0ZSQU1FX1JFRyAoJnRlbXBfcHJvY19kZXNjKSA9IDE3OworCX0KKyAgICAgIGVsc2UgaWYgKChpbnN0ICYgMHhmZjAwKSA9PSAweDAxMDApCS8qIGFkZGl1ICRzMSxzcCxuICovCisJeworCSAgb2Zmc2V0ID0gbWlwczE2X2dldF9pbW0gKHByZXZfaW5zdCwgaW5zdCwgOCwgNCwgMCk7CisJICBmcmFtZV9hZGRyID0gc3AgKyBvZmZzZXQ7CisJICBQUk9DX0ZSQU1FX1JFRyAoJnRlbXBfcHJvY19kZXNjKSA9IDE3OworCSAgUFJPQ19GUkFNRV9BREpVU1QgKCZ0ZW1wX3Byb2NfZGVzYykgPSBvZmZzZXQ7CisJfQorICAgICAgZWxzZSBpZiAoKGluc3QgJiAweEZGMDApID09IDB4ZDkwMCkJLyogc3cgcmVnLG9mZnNldCgkczEpICovCisJeworCSAgb2Zmc2V0ID0gbWlwczE2X2dldF9pbW0gKHByZXZfaW5zdCwgaW5zdCwgNSwgNCwgMCk7CisJICByZWcgPSBtaXBzMTZfdG9fMzJfcmVnWyhpbnN0ICYgMHhlMCkgPj4gNV07CisJICBQUk9DX1JFR19NQVNLKCZ0ZW1wX3Byb2NfZGVzYykgfD0gMSA8PCByZWc7CisJICBzZXRfcmVnX29mZnNldCAocmVnLCBmcmFtZV9hZGRyICsgb2Zmc2V0KTsKKwl9CisgICAgICBlbHNlIGlmICgoaW5zdCAmIDB4RkYwMCkgPT0gMHg3OTAwKQkvKiBzZCByZWcsb2Zmc2V0KCRzMSkgKi8KKwl7CisJICBvZmZzZXQgPSBtaXBzMTZfZ2V0X2ltbSAocHJldl9pbnN0LCBpbnN0LCA1LCA4LCAwKTsKKwkgIHJlZyA9IG1pcHMxNl90b18zMl9yZWdbKGluc3QgJiAweGUwKSA+PiA1XTsKKwkgIFBST0NfUkVHX01BU0soJnRlbXBfcHJvY19kZXNjKSB8PSAxIDw8IHJlZzsKKwkgIHNldF9yZWdfb2Zmc2V0IChyZWcsIGZyYW1lX2FkZHIgKyBvZmZzZXQpOworCX0KKyAgICAgIGVsc2UgaWYgKChpbnN0ICYgMHhmODFmKSA9PSAweGU4MDkgJiYgKGluc3QgJiAweDcwMCkgIT0gMHg3MDApIC8qIGVudHJ5ICovCisJZW50cnlfaW5zdCA9IGluc3Q7CQkJLyogc2F2ZSBmb3IgbGF0ZXIgcHJvY2Vzc2luZyAqLworICAgICAgZWxzZSBpZiAoKGluc3QgJiAweGY4MDApID09IDB4MTgwMCkJLyogamFsKHgpICovCisJY3VyX3BjICs9IE1JUFMxNl9JTlNUTEVOOwkJLyogMzItYml0IGluc3RydWN0aW9uICovCisgICAgfQorCisgICAgLyogVGhlIGVudHJ5IGluc3RydWN0aW9uIGlzIHR5cGljYWxseSB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gYSBmdW5jdGlvbiwKKyAgICAgICBhbmQgaXQgc3RvcmVzIHJlZ2lzdGVycyBhdCBvZmZzZXRzIHJlbGF0aXZlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgb2xkIFNQCisgICAgICAgKGJlZm9yZSB0aGUgcHJvbG9ndWUpLiAgQnV0IHRoZSB2YWx1ZSBvZiB0aGUgc3AgcGFyYW1ldGVyIHRvIHRoaXMKKyAgICAgICBmdW5jdGlvbiBpcyB0aGUgbmV3IFNQIChhZnRlciB0aGUgcHJvbG9ndWUgaGFzIGJlZW4gZXhlY3V0ZWQpLiAgU28gd2UKKyAgICAgICBjYW4ndCBjYWxjdWxhdGUgdGhvc2Ugb2Zmc2V0cyB1bnRpbCB3ZSd2ZSBzZWVuIHRoZSBlbnRpcmUgcHJvbG9ndWUsCisgICAgICAgYW5kIGNhbiBjYWxjdWxhdGUgd2hhdCB0aGUgb2xkIFNQIG11c3QgaGF2ZSBiZWVuLiAqLworICAgIGlmIChlbnRyeV9pbnN0ICE9IDApCisgICAgICB7CisJaW50IGFyZWdfY291bnQgPSAoZW50cnlfaW5zdCA+PiA4KSAmIDc7CisJaW50IHNyZWdfY291bnQgPSAoZW50cnlfaW5zdCA+PiA2KSAmIDM7CisKKwkvKiBUaGUgZW50cnkgaW5zdHJ1Y3Rpb24gYWx3YXlzIHN1YnRyYWN0cyAzMiBmcm9tIHRoZSBTUC4gICovCisJUFJPQ19GUkFNRV9PRkZTRVQoJnRlbXBfcHJvY19kZXNjKSArPSAzMjsKKworCS8qIE5vdyB3ZSBjYW4gY2FsY3VsYXRlIHdoYXQgdGhlIFNQIG11c3QgaGF2ZSBiZWVuIGF0IHRoZQorCSAgIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiBwcm9sb2d1ZS4gICovCisJc3AgKz0gUFJPQ19GUkFNRV9PRkZTRVQoJnRlbXBfcHJvY19kZXNjKTsKKworCS8qIENoZWNrIGlmIGEwLWEzIHdlcmUgc2F2ZWQgaW4gdGhlIGNhbGxlcidzIGFyZ3VtZW50IHNhdmUgYXJlYS4gICovCisJZm9yIChyZWcgPSA0LCBvZmZzZXQgPSAwOyByZWcgPCBhcmVnX2NvdW50KzQ7IHJlZysrKQorCSAgeworCSAgICBQUk9DX1JFR19NQVNLKCZ0ZW1wX3Byb2NfZGVzYykgfD0gMSA8PCByZWc7CisJICAgIHNldF9yZWdfb2Zmc2V0IChyZWcsIHNwICsgb2Zmc2V0KTsKKwkgICAgb2Zmc2V0ICs9IE1JUFNfUkVHU0laRTsKKwkgIH0KKworCS8qIENoZWNrIGlmIHRoZSByYSByZWdpc3RlciB3YXMgcHVzaGVkIG9uIHRoZSBzdGFjay4gICovCisJb2Zmc2V0ID0gLTQ7CisJaWYgKGVudHJ5X2luc3QgJiAweDIwKQorCSAgeworCSAgICBQUk9DX1JFR19NQVNLKCZ0ZW1wX3Byb2NfZGVzYykgfD0gMSA8PCBSQV9SRUdOVU07CisJICAgIHNldF9yZWdfb2Zmc2V0IChSQV9SRUdOVU0sIHNwICsgb2Zmc2V0KTsKKwkgICAgb2Zmc2V0IC09IE1JUFNfUkVHU0laRTsKKwkgIH0KKworCS8qIENoZWNrIGlmIHRoZSBzMCBhbmQgczEgcmVnaXN0ZXJzIHdlcmUgcHVzaGVkIG9uIHRoZSBzdGFjay4gICovCisJZm9yIChyZWcgPSAxNjsgcmVnIDwgc3JlZ19jb3VudCsxNjsgcmVnKyspCisJICB7CisJICAgIFBST0NfUkVHX01BU0soJnRlbXBfcHJvY19kZXNjKSB8PSAxIDw8IHJlZzsKKwkgICAgc2V0X3JlZ19vZmZzZXQgKHJlZywgc3AgKyBvZmZzZXQpOworCSAgICBvZmZzZXQgLT0gTUlQU19SRUdTSVpFOworCSAgfQorICAgICAgfQorfQorCitzdGF0aWMgdm9pZAorbWlwczMyX2hldXJpc3RpY19wcm9jX2Rlc2Moc3RhcnRfcGMsIGxpbWl0X3BjLCBuZXh0X2ZyYW1lLCBzcCkKKyAgICBDT1JFX0FERFIgc3RhcnRfcGMsIGxpbWl0X3BjOworICAgIHN0cnVjdCBmcmFtZV9pbmZvICpuZXh0X2ZyYW1lOworICAgIENPUkVfQUREUiBzcDsKK3sKKyAgQ09SRV9BRERSIGN1cl9wYzsKKyAgQ09SRV9BRERSIGZyYW1lX2FkZHIgPSAwOyAvKiBWYWx1ZSBvZiAkcjMwLiBVc2VkIGJ5IGdjYyBmb3IgZnJhbWUtcG9pbnRlciAqLworcmVzdGFydDoKKyAgbWVtc2V0ICgmdGVtcF9zYXZlZF9yZWdzLCAnXDAnLCBzaXplb2Yoc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MpKTsKKyAgUFJPQ19GUkFNRV9PRkZTRVQoJnRlbXBfcHJvY19kZXNjKSA9IDA7CisgIFBST0NfRlJBTUVfQURKVVNUICgmdGVtcF9wcm9jX2Rlc2MpID0gMDsJLyogb2Zmc2V0IG9mIEZQIGZyb20gU1AgKi8KKyAgZm9yIChjdXJfcGMgPSBzdGFydF9wYzsgY3VyX3BjIDwgbGltaXRfcGM7IGN1cl9wYyArPSBNSVBTX0lOU1RMRU4pCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBpbnN0LCBoaWdoX3dvcmQsIGxvd193b3JkOworICAgICAgaW50IHJlZzsKKworICAgICAgLyogRmV0Y2ggdGhlIGluc3RydWN0aW9uLiAgICovCisgICAgICBpbnN0ID0gKHVuc2lnbmVkIGxvbmcpIG1pcHNfZmV0Y2hfaW5zdHJ1Y3Rpb24gKGN1cl9wYyk7CisKKyAgICAgIC8qIFNhdmUgc29tZSBjb2RlIGJ5IHByZS1leHRyYWN0aW5nIHNvbWUgdXNlZnVsIGZpZWxkcy4gICovCisgICAgICBoaWdoX3dvcmQgPSAoaW5zdCA+PiAxNikgJiAweGZmZmY7CisgICAgICBsb3dfd29yZCA9IGluc3QgJiAweGZmZmY7CisgICAgICByZWcgPSBoaWdoX3dvcmQgJiAweDFmOworCisgICAgICBpZiAoaGlnaF93b3JkID09IDB4MjdiZAkJLyogYWRkaXUgJHNwLCRzcCwtaSAqLworCSAgfHwgaGlnaF93b3JkID09IDB4MjNiZAkvKiBhZGRpICRzcCwkc3AsLWkgKi8KKwkgIHx8IGhpZ2hfd29yZCA9PSAweDY3YmQpCS8qIGRhZGRpdSAkc3AsJHNwLC1pICovCisJeworCSAgaWYgKGxvd193b3JkICYgMHg4MDAwKQkvKiBuZWdhdGl2ZSBzdGFjayBhZGp1c3RtZW50PyAqLworCSAgICBQUk9DX0ZSQU1FX09GRlNFVCgmdGVtcF9wcm9jX2Rlc2MpICs9IDB4MTAwMDAgLSBsb3dfd29yZDsKKwkgIGVsc2UKKwkgICAgLyogRXhpdCBsb29wIGlmIGEgcG9zaXRpdmUgc3RhY2sgYWRqdXN0bWVudCBpcyBmb3VuZCwgd2hpY2gKKwkgICAgICAgdXN1YWxseSBtZWFucyB0aGF0IHRoZSBzdGFjayBjbGVhbnVwIGNvZGUgaW4gdGhlIGZ1bmN0aW9uCisJICAgICAgIGVwaWxvZ3VlIGlzIHJlYWNoZWQuICAqLworCSAgICBicmVhazsKKwl9CisgICAgICBlbHNlIGlmICgoaGlnaF93b3JkICYgMHhGRkUwKSA9PSAweGFmYTApCS8qIHN3IHJlZyxvZmZzZXQoJHNwKSAqLworCXsKKwkgIFBST0NfUkVHX01BU0soJnRlbXBfcHJvY19kZXNjKSB8PSAxIDw8IHJlZzsKKwkgIHNldF9yZWdfb2Zmc2V0IChyZWcsIHNwICsgbG93X3dvcmQpOworCX0KKyAgICAgIGVsc2UgaWYgKChoaWdoX3dvcmQgJiAweEZGRTApID09IDB4ZmZhMCkJLyogc2QgcmVnLG9mZnNldCgkc3ApICovCisJeworCSAgLyogSXJpeCA2LjIgTjMyIEFCSSB1c2VzIHNkIGluc3RydWN0aW9ucyBmb3Igc2F2aW5nICRncCBhbmQgJHJhLAorCSAgICAgYnV0IHRoZSByZWdpc3RlciBzaXplIHVzZWQgaXMgb25seSAzMiBiaXRzLiBNYWtlIHRoZSBhZGRyZXNzCisJICAgICBmb3IgdGhlIHNhdmVkIHJlZ2lzdGVyIHBvaW50IHRvIHRoZSBsb3dlciAzMiBiaXRzLiAgKi8KKwkgIFBST0NfUkVHX01BU0soJnRlbXBfcHJvY19kZXNjKSB8PSAxIDw8IHJlZzsKKwkgIHNldF9yZWdfb2Zmc2V0IChyZWcsIHNwICsgbG93X3dvcmQgKyA4IC0gTUlQU19SRUdTSVpFKTsKKwl9CisgICAgICBlbHNlIGlmIChoaWdoX3dvcmQgPT0gMHgyN2JlKQkJCS8qIGFkZGl1ICQzMCwkc3Asc2l6ZSAqLworCXsKKwkgIC8qIE9sZCBnY2MgZnJhbWUsIHIzMCBpcyB2aXJ0dWFsIGZyYW1lIHBvaW50ZXIuICAqLworCSAgaWYgKChsb25nKWxvd193b3JkICE9IFBST0NfRlJBTUVfT0ZGU0VUKCZ0ZW1wX3Byb2NfZGVzYykpCisJICAgICAgZnJhbWVfYWRkciA9IHNwICsgbG93X3dvcmQ7CisJICBlbHNlIGlmIChQUk9DX0ZSQU1FX1JFRyAoJnRlbXBfcHJvY19kZXNjKSA9PSBTUF9SRUdOVU0pCisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBhbGxvY2FfYWRqdXN0OworCSAgICAgIFBST0NfRlJBTUVfUkVHICgmdGVtcF9wcm9jX2Rlc2MpID0gMzA7CisJICAgICAgZnJhbWVfYWRkciA9IHJlYWRfbmV4dF9mcmFtZV9yZWcobmV4dF9mcmFtZSwgMzApOworCSAgICAgIGFsbG9jYV9hZGp1c3QgPSAodW5zaWduZWQpKGZyYW1lX2FkZHIgLSAoc3AgKyBsb3dfd29yZCkpOworCSAgICAgIGlmIChhbGxvY2FfYWRqdXN0ID4gMCkKKwkJeworCQkgIC8qIEZQID4gU1AgKyBmcmFtZV9zaXplLiBUaGlzIG1heSBiZSBiZWNhdXNlCisJCSAgICogb2YgYW4gYWxsb2NhIG9yIHNvbWV0aGluZ3Mgc2ltaWxhci4KKwkJICAgKiBGaXggc3AgdG8gInByZS1hbGxvY2EiIHZhbHVlLCBhbmQgdHJ5IGFnYWluLgorCQkgICAqLworCQkgIHNwICs9IGFsbG9jYV9hZGp1c3Q7CisJCSAgZ290byByZXN0YXJ0OworCQl9CisJICAgIH0KKwl9CisgICAgIC8qIG1vdmUgJDMwLCRzcC4gIFdpdGggZGlmZmVyZW50IHZlcnNpb25zIG9mIGdhcyB0aGlzIHdpbGwgYmUgZWl0aGVyCisgICAgICAgYGFkZHUgJDMwLCRzcCwkemVybycgb3IgYG9yICQzMCwkc3AsJHplcm8nIG9yIGBkYWRkdSAzMCxzcCwkMCcuCisJQWNjZXB0IGFueSBvbmUgb2YgdGhlc2UuICAqLworICAgICAgZWxzZSBpZiAoaW5zdCA9PSAweDAzQTBGMDIxIHx8IGluc3QgPT0gMHgwM2EwZjAyNSB8fCBpbnN0ID09IDB4MDNhMGYwMmQpCisJeworCSAgLyogTmV3IGdjYyBmcmFtZSwgdmlydHVhbCBmcmFtZSBwb2ludGVyIGlzIGF0IHIzMCArIGZyYW1lX3NpemUuICAqLworCSAgaWYgKFBST0NfRlJBTUVfUkVHICgmdGVtcF9wcm9jX2Rlc2MpID09IFNQX1JFR05VTSkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGFsbG9jYV9hZGp1c3Q7CisJICAgICAgUFJPQ19GUkFNRV9SRUcgKCZ0ZW1wX3Byb2NfZGVzYykgPSAzMDsKKwkgICAgICBmcmFtZV9hZGRyID0gcmVhZF9uZXh0X2ZyYW1lX3JlZyhuZXh0X2ZyYW1lLCAzMCk7CisJICAgICAgYWxsb2NhX2FkanVzdCA9ICh1bnNpZ25lZCkoZnJhbWVfYWRkciAtIHNwKTsKKwkgICAgICBpZiAoYWxsb2NhX2FkanVzdCA+IDApCisJCXsKKwkJICAvKiBGUCA+IFNQICsgZnJhbWVfc2l6ZS4gVGhpcyBtYXkgYmUgYmVjYXVzZQorCQkgICAqIG9mIGFuIGFsbG9jYSBvciBzb21ldGhpbmdzIHNpbWlsYXIuCisJCSAgICogRml4IHNwIHRvICJwcmUtYWxsb2NhIiB2YWx1ZSwgYW5kIHRyeSBhZ2Fpbi4KKwkJICAgKi8KKwkJICBzcCArPSBhbGxvY2FfYWRqdXN0OworCQkgIGdvdG8gcmVzdGFydDsKKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoKGhpZ2hfd29yZCAmIDB4RkZFMCkgPT0gMHhhZmMwKQkJLyogc3cgcmVnLG9mZnNldCgkMzApICovCisJeworCSAgUFJPQ19SRUdfTUFTSygmdGVtcF9wcm9jX2Rlc2MpIHw9IDEgPDwgcmVnOworCSAgc2V0X3JlZ19vZmZzZXQgKHJlZywgZnJhbWVfYWRkciArIGxvd193b3JkKTsKKwl9CisgICAgfQorfQorCitzdGF0aWMgbWlwc19leHRyYV9mdW5jX2luZm9fdAoraGV1cmlzdGljX3Byb2NfZGVzYyhzdGFydF9wYywgbGltaXRfcGMsIG5leHRfZnJhbWUpCisgICAgQ09SRV9BRERSIHN0YXJ0X3BjLCBsaW1pdF9wYzsKKyAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqbmV4dF9mcmFtZTsKK3sKKyAgQ09SRV9BRERSIHNwID0gcmVhZF9uZXh0X2ZyYW1lX3JlZyAobmV4dF9mcmFtZSwgU1BfUkVHTlVNKTsKKworICBpZiAoc3RhcnRfcGMgPT0gMCkgcmV0dXJuIE5VTEw7CisgIG1lbXNldCAoJnRlbXBfcHJvY19kZXNjLCAnXDAnLCBzaXplb2YodGVtcF9wcm9jX2Rlc2MpKTsKKyAgbWVtc2V0ICgmdGVtcF9zYXZlZF9yZWdzLCAnXDAnLCBzaXplb2Yoc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MpKTsKKyAgUFJPQ19MT1dfQUREUiAoJnRlbXBfcHJvY19kZXNjKSA9IHN0YXJ0X3BjOworICBQUk9DX0ZSQU1FX1JFRyAoJnRlbXBfcHJvY19kZXNjKSA9IFNQX1JFR05VTTsKKyAgUFJPQ19QQ19SRUcgKCZ0ZW1wX3Byb2NfZGVzYykgPSBSQV9SRUdOVU07CisKKyAgaWYgKHN0YXJ0X3BjICsgMjAwIDwgbGltaXRfcGMpCisgICAgbGltaXRfcGMgPSBzdGFydF9wYyArIDIwMDsKKyAgaWYgKHBjX2lzX21pcHMxNiAoc3RhcnRfcGMpKQorICAgIG1pcHMxNl9oZXVyaXN0aWNfcHJvY19kZXNjIChzdGFydF9wYywgbGltaXRfcGMsIG5leHRfZnJhbWUsIHNwKTsKKyAgZWxzZQorICAgIG1pcHMzMl9oZXVyaXN0aWNfcHJvY19kZXNjIChzdGFydF9wYywgbGltaXRfcGMsIG5leHRfZnJhbWUsIHNwKTsKKyAgcmV0dXJuICZ0ZW1wX3Byb2NfZGVzYzsKK30KKworc3RhdGljIG1pcHNfZXh0cmFfZnVuY19pbmZvX3QKK25vbl9oZXVyaXN0aWNfcHJvY19kZXNjIChwYywgYWRkcnB0cikKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBDT1JFX0FERFIgKmFkZHJwdHI7Cit7CisgIENPUkVfQUREUiBzdGFydGFkZHI7CisgIG1pcHNfZXh0cmFfZnVuY19pbmZvX3QgcHJvY19kZXNjOworICBzdHJ1Y3QgYmxvY2sgKmIgPSBibG9ja19mb3JfcGMocGMpOworICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisKKyAgZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIChwYywgTlVMTCwgJnN0YXJ0YWRkciwgTlVMTCk7CisgIGlmIChhZGRycHRyKQorICAgICphZGRycHRyID0gc3RhcnRhZGRyOworICBpZiAoYiA9PSBOVUxMIHx8IFBDX0lOX0NBTExfRFVNTVkgKHBjLCAwLCAwKSkKKyAgICBzeW0gPSBOVUxMOworICBlbHNlCisgICAgeworICAgICAgaWYgKHN0YXJ0YWRkciA+IEJMT0NLX1NUQVJUIChiKSkKKwkvKiBUaGlzIGlzIHRoZSAicGF0aG9sb2dpY2FsIiBjYXNlIHJlZmVycmVkIHRvIGluIGEgY29tbWVudCBpbgorCSAgIHByaW50X2ZyYW1lX2luZm8uICBJdCBtaWdodCBiZSBiZXR0ZXIgdG8gbW92ZSB0aGlzIGNoZWNrIGludG8KKwkgICBzeW1ib2wgcmVhZGluZy4gICovCisJc3ltID0gTlVMTDsKKyAgICAgIGVsc2UKKwlzeW0gPSBsb29rdXBfc3ltYm9sIChNSVBTX0VGSV9TWU1CT0xfTkFNRSwgYiwgTEFCRUxfTkFNRVNQQUNFLCAwLCBOVUxMKTsKKyAgICB9CisKKyAgLyogSWYgd2UgbmV2ZXIgZm91bmQgYSBQRFIgZm9yIHRoaXMgZnVuY3Rpb24gaW4gc3ltYm9sIHJlYWRpbmcsIHRoZW4KKyAgICAgZXhhbWluZSBwcm9sb2d1ZXMgdG8gZmluZCB0aGUgaW5mb3JtYXRpb24uICAqLworICBpZiAoc3ltKQorICAgIHsKKyAgICAgIHByb2NfZGVzYyA9IChtaXBzX2V4dHJhX2Z1bmNfaW5mb190KSBTWU1CT0xfVkFMVUUgKHN5bSk7CisgICAgICBpZiAoUFJPQ19GUkFNRV9SRUcgKHByb2NfZGVzYykgPT0gLTEpCisJcmV0dXJuIE5VTEw7CisgICAgICBlbHNlCisJcmV0dXJuIHByb2NfZGVzYzsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgbWlwc19leHRyYV9mdW5jX2luZm9fdAorZmluZF9wcm9jX2Rlc2MgKHBjLCBuZXh0X2ZyYW1lKQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpuZXh0X2ZyYW1lOworeworICBtaXBzX2V4dHJhX2Z1bmNfaW5mb190IHByb2NfZGVzYzsKKyAgQ09SRV9BRERSIHN0YXJ0YWRkcjsKKworICBwcm9jX2Rlc2MgPSBub25faGV1cmlzdGljX3Byb2NfZGVzYyAocGMsICZzdGFydGFkZHIpOworCisgIGlmIChwcm9jX2Rlc2MpCisgICAgeworICAgICAgLyogSUYgdGhpcyBpcyB0aGUgdG9wbW9zdCBmcmFtZSBBTkQKKyAgICAgICAqICh0aGlzIHByb2MgZG9lcyBub3QgaGF2ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gT1IKKyAgICAgICAqIHRoZSBQQyBpcyBpbiB0aGUgcHJvY2VkdXJlIHByb2xvZ3VlKQorICAgICAgICogVEhFTiBjcmVhdGUgYSAiaGV1cmlzdGljIiBwcm9jX2Rlc2MgKGJ5IGFuYWx5emluZworICAgICAgICogdGhlIGFjdHVhbCBjb2RlKSB0byByZXBsYWNlIHRoZSAib2ZmaWNpYWwiIHByb2NfZGVzYy4KKyAgICAgICAqLworICAgICAgaWYgKG5leHRfZnJhbWUgPT0gTlVMTCkKKwl7CisJICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHZhbDsKKwkgIHN0cnVjdCBzeW1ib2wgKnByb2Nfc3ltYm9sID0KKwkgICAgICBQUk9DX0RFU0NfSVNfRFVNTVkocHJvY19kZXNjKSA/IDAgOiBQUk9DX1NZTUJPTChwcm9jX2Rlc2MpOworCisJICBpZiAocHJvY19zeW1ib2wpCisJICAgIHsKKwkgICAgICB2YWwgPSBmaW5kX3BjX2xpbmUgKEJMT0NLX1NUQVJUCisJCQkJICAoU1lNQk9MX0JMT0NLX1ZBTFVFKHByb2Nfc3ltYm9sKSksCisJCQkJICAwKTsKKwkgICAgICB2YWwucGMgPSB2YWwuZW5kID8gdmFsLmVuZCA6IHBjOworCSAgICB9CisJICBpZiAoIXByb2Nfc3ltYm9sIHx8IHBjIDwgdmFsLnBjKQorCSAgICB7CisJICAgICAgbWlwc19leHRyYV9mdW5jX2luZm9fdCBmb3VuZF9oZXVyaXN0aWMgPQorCQloZXVyaXN0aWNfcHJvY19kZXNjIChQUk9DX0xPV19BRERSIChwcm9jX2Rlc2MpLAorCQkJCSAgICAgcGMsIG5leHRfZnJhbWUpOworCSAgICAgIGlmIChmb3VuZF9oZXVyaXN0aWMpCisJCXByb2NfZGVzYyA9IGZvdW5kX2hldXJpc3RpYzsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJcyBsaW5rZWRfcHJvY19kZXNjX3RhYmxlIHJlYWxseSBuZWNlc3Nhcnk/ICBJdCBvbmx5IHNlZW1zIHRvIGJlIHVzZWQKKwkgYnkgcHJvY2VkdXJlIGNhbGwgZHVtbXlzLiAgSG93ZXZlciwgdGhlIHByb2NlZHVyZXMgYmVpbmcgY2FsbGVkIG91Z2h0CisJIHRvIGhhdmUgdGhlaXIgb3duIHByb2NfZGVzY3MsIGFuZCBldmVuIGlmIHRoZXkgZG9uJ3QsCisJIGhldXJpc3RpY19wcm9jX2Rlc2Mga25vd3MgaG93IHRvIGNyZWF0ZSB0aGVtISAqLworCisgICAgICByZWdpc3RlciBzdHJ1Y3QgbGlua2VkX3Byb2NfaW5mbyAqbGluazsKKworICAgICAgZm9yIChsaW5rID0gbGlua2VkX3Byb2NfZGVzY190YWJsZTsgbGluazsgbGluayA9IGxpbmstPm5leHQpCisJaWYgKFBST0NfTE9XX0FERFIoJmxpbmstPmluZm8pIDw9IHBjCisJICAgICYmIFBST0NfSElHSF9BRERSKCZsaW5rLT5pbmZvKSA+IHBjKQorCSAgcmV0dXJuICZsaW5rLT5pbmZvOworCisgICAgICBpZiAoc3RhcnRhZGRyID09IDApCisJc3RhcnRhZGRyID0gaGV1cmlzdGljX3Byb2Nfc3RhcnQgKHBjKTsKKworICAgICAgcHJvY19kZXNjID0KKwloZXVyaXN0aWNfcHJvY19kZXNjIChzdGFydGFkZHIsIHBjLCBuZXh0X2ZyYW1lKTsKKyAgICB9CisgIHJldHVybiBwcm9jX2Rlc2M7Cit9CisKK3N0YXRpYyBDT1JFX0FERFIKK2dldF9mcmFtZV9wb2ludGVyKGZyYW1lLCBwcm9jX2Rlc2MpCisgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworICAgIG1pcHNfZXh0cmFfZnVuY19pbmZvX3QgcHJvY19kZXNjOworeworICByZXR1cm4gQUREUl9CSVRTX1JFTU9WRSAoCisgICAgcmVhZF9uZXh0X2ZyYW1lX3JlZyAoZnJhbWUsIFBST0NfRlJBTUVfUkVHIChwcm9jX2Rlc2MpKSArCisgICAgICBQUk9DX0ZSQU1FX09GRlNFVCAocHJvY19kZXNjKSAtIFBST0NfRlJBTUVfQURKVVNUIChwcm9jX2Rlc2MpKTsKK30KKworbWlwc19leHRyYV9mdW5jX2luZm9fdCBjYWNoZWRfcHJvY19kZXNjOworCitDT1JFX0FERFIKK21pcHNfZnJhbWVfY2hhaW4oZnJhbWUpCisgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworeworICBtaXBzX2V4dHJhX2Z1bmNfaW5mb190IHByb2NfZGVzYzsKKyAgQ09SRV9BRERSIHRtcDsKKyAgQ09SRV9BRERSIHNhdmVkX3BjID0gRlJBTUVfU0FWRURfUEMoZnJhbWUpOworCisgIGlmIChzYXZlZF9wYyA9PSAwIHx8IGluc2lkZV9lbnRyeV9maWxlIChzYXZlZF9wYykpCisgICAgcmV0dXJuIDA7CisKKyAgLyogQ2hlY2sgaWYgdGhlIFBDIGlzIGluc2lkZSBhIGNhbGwgc3R1Yi4gIElmIGl0IGlzLCBmZXRjaCB0aGUKKyAgICAgUEMgb2YgdGhlIGNhbGxlciBvZiB0aGF0IHN0dWIuICAqLworICBpZiAoKHRtcCA9IG1pcHNfc2tpcF9zdHViIChzYXZlZF9wYykpICE9IDApCisgICAgc2F2ZWRfcGMgPSB0bXA7CisKKyAgLyogTG9vayB1cCB0aGUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgZm9yIHRoaXMgUEMuICAqLworICBwcm9jX2Rlc2MgPSBmaW5kX3Byb2NfZGVzYyhzYXZlZF9wYywgZnJhbWUpOworICBpZiAoIXByb2NfZGVzYykKKyAgICByZXR1cm4gMDsKKworICBjYWNoZWRfcHJvY19kZXNjID0gcHJvY19kZXNjOworCisgIC8qIElmIG5vIGZyYW1lIHBvaW50ZXIgYW5kIGZyYW1lIHNpemUgaXMgemVybywgd2UgbXVzdCBiZSBhdCBlbmQKKyAgICAgb2Ygc3RhY2sgKG9yIG90aGVyd2lzZSBob3NlZCkuICBJZiB3ZSBkb24ndCBjaGVjayBmcmFtZSBzaXplLAorICAgICB3ZSBsb29wIGZvcmV2ZXIgaWYgd2Ugc2VlIGEgemVybyBzaXplIGZyYW1lLiAgKi8KKyAgaWYgKFBST0NfRlJBTUVfUkVHIChwcm9jX2Rlc2MpID09IFNQX1JFR05VTQorICAgICAgJiYgUFJPQ19GUkFNRV9PRkZTRVQgKHByb2NfZGVzYykgPT0gMAorICAgICAgLyogVGhlIHByZXZpb3VzIGZyYW1lIGZyb20gYSBzaWd0cmFtcCBmcmFtZSBtaWdodCBiZSBmcmFtZWxlc3MKKwkgYW5kIGhhdmUgZnJhbWUgc2l6ZSB6ZXJvLiAgKi8KKyAgICAgICYmICFmcmFtZS0+c2lnbmFsX2hhbmRsZXJfY2FsbGVyKQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgcmV0dXJuIGdldF9mcmFtZV9wb2ludGVyIChmcmFtZSwgcHJvY19kZXNjKTsKK30KKwordm9pZAoraW5pdF9leHRyYV9mcmFtZV9pbmZvKGZjaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZjaTsKK3sKKyAgaW50IHJlZ251bTsKKworICAvKiBVc2UgcHJvY19kZXNjIGNhbGN1bGF0ZWQgaW4gZnJhbWVfY2hhaW4gKi8KKyAgbWlwc19leHRyYV9mdW5jX2luZm9fdCBwcm9jX2Rlc2MgPQorICAgIGZjaS0+bmV4dCA/IGNhY2hlZF9wcm9jX2Rlc2MgOiBmaW5kX3Byb2NfZGVzYyhmY2ktPnBjLCBmY2ktPm5leHQpOworCisgIGZjaS0+c2F2ZWRfcmVncyA9IE5VTEw7CisgIGZjaS0+cHJvY19kZXNjID0KKyAgICBwcm9jX2Rlc2MgPT0gJnRlbXBfcHJvY19kZXNjID8gMCA6IHByb2NfZGVzYzsKKyAgaWYgKHByb2NfZGVzYykKKyAgICB7CisgICAgICAvKiBGaXh1cCBmcmFtZS1wb2ludGVyIC0gb25seSBuZWVkZWQgZm9yIHRvcCBmcmFtZSAqLworICAgICAgLyogVGhpcyBtYXkgbm90IGJlIHF1aXRlIHJpZ2h0LCBpZiBwcm9jIGhhcyBhIHJlYWwgZnJhbWUgcmVnaXN0ZXIuCisJIEdldCB0aGUgdmFsdWUgb2YgdGhlIGZyYW1lIHJlbGF0aXZlIHNwLCBwcm9jZWR1cmUgbWlnaHQgaGF2ZSBiZWVuCisJIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsIGF0IGl0J3MgdmVyeSBzdGFydC4gICovCisgICAgICBpZiAoZmNpLT5wYyA9PSBQUk9DX0xPV19BRERSIChwcm9jX2Rlc2MpCisJICAmJiAhUFJPQ19ERVNDX0lTX0RVTU1ZIChwcm9jX2Rlc2MpKQorCWZjaS0+ZnJhbWUgPSByZWFkX25leHRfZnJhbWVfcmVnIChmY2ktPm5leHQsIFNQX1JFR05VTSk7CisgICAgICBlbHNlCisJZmNpLT5mcmFtZSA9IGdldF9mcmFtZV9wb2ludGVyIChmY2ktPm5leHQsIHByb2NfZGVzYyk7CisKKyAgICAgIGlmIChwcm9jX2Rlc2MgPT0gJnRlbXBfcHJvY19kZXNjKQorCXsKKwkgIGNoYXIgKm5hbWU7CisKKwkgIC8qIERvIG5vdCBzZXQgdGhlIHNhdmVkIHJlZ2lzdGVycyBmb3IgYSBzaWd0cmFtcCBmcmFtZSwKKwkgICAgIG1pcHNfZmluZF9zYXZlZF9yZWdpc3RlcnMgd2lsbCBkbyB0aGF0IGZvciB1cy4KKwkgICAgIFdlIGNhbid0IHVzZSBmY2ktPnNpZ25hbF9oYW5kbGVyX2NhbGxlciwgaXQgaXMgbm90IHlldCBzZXQuICAqLworCSAgZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIChmY2ktPnBjLCAmbmFtZSwKKwkJCQkgICAgKENPUkVfQUREUiAqKU5VTEwsKENPUkVfQUREUiAqKU5VTEwpOworCSAgaWYgKCFJTl9TSUdUUkFNUCAoZmNpLT5wYywgbmFtZSkpCisJICAgIHsKKwkgICAgICBmY2ktPnNhdmVkX3JlZ3MgPSAoQ09SRV9BRERSKikKKwkJZnJhbWVfb2JzdGFja19hbGxvYyAoU0laRU9GX0ZSQU1FX1NBVkVEX1JFR1MpOworCSAgICAgIG1lbWNweSAoZmNpLT5zYXZlZF9yZWdzLCB0ZW1wX3NhdmVkX3JlZ3MucmVncywgU0laRU9GX0ZSQU1FX1NBVkVEX1JFR1MpOworCSAgICAgIGZjaS0+c2F2ZWRfcmVnc1tQQ19SRUdOVU1dCisJCT0gZmNpLT5zYXZlZF9yZWdzW1JBX1JFR05VTV07CisJICAgIH0KKwl9CisKKyAgICAgIC8qIGhhY2s6IGlmIGFyZ3VtZW50IHJlZ3MgYXJlIHNhdmVkLCBndWVzcyB0aGVzZSBjb250YWluIGFyZ3MgKi8KKyAgICAgIGZjaS0+bnVtX2FyZ3MgPSAtMTsJLyogYXNzdW1lIHdlIGNhbid0IHRlbGwgaG93IG1hbnkgYXJncyBmb3Igbm93ICovCisgICAgICBmb3IgKHJlZ251bSA9IE1JUFNfTEFTVF9BUkdfUkVHTlVNOyByZWdudW0gPj0gQTBfUkVHTlVNOyByZWdudW0tLSkKKwl7CisJICBpZiAoUFJPQ19SRUdfTUFTSyhwcm9jX2Rlc2MpICYgKDEgPDwgcmVnbnVtKSkKKwkgICAgeworCSAgICAgIGZjaS0+bnVtX2FyZ3MgPSByZWdudW0gLSBBMF9SRUdOVU0gKyAxOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfSAKKyAgICB9Cit9CisKKy8qIE1JUFMgc3RhY2sgZnJhbWVzIGFyZSBhbG1vc3QgaW1wZW5ldHJhYmxlLiAgV2hlbiBleGVjdXRpb24gc3RvcHMsCisgICB3ZSBiYXNpY2FsbHkgaGF2ZSB0byBsb29rIGF0IHN5bWJvbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGZ1bmN0aW9uCisgICB0aGF0IHdlIHN0b3BwZWQgaW4sIHdoaWNoIHRlbGxzIHVzICp3aGljaCogcmVnaXN0ZXIgKGlmIGFueSkgaXMKKyAgIHRoZSBiYXNlIG9mIHRoZSBmcmFtZSBwb2ludGVyLCBhbmQgd2hhdCBvZmZzZXQgZnJvbSB0aGF0IHJlZ2lzdGVyCisgICB0aGUgZnJhbWUgaXRzZWxmIGlzIGF0LiAgCisKKyAgIFRoaXMgcHJlc2VudHMgYSBwcm9ibGVtIHdoZW4gdHJ5aW5nIHRvIGV4YW1pbmUgYSBzdGFjayBpbiBtZW1vcnkKKyAgICh0aGF0IGlzbid0IGV4ZWN1dGluZyBhdCB0aGUgbW9tZW50KSwgdXNpbmcgdGhlICJmcmFtZSIgY29tbWFuZC4gIFdlCisgICBkb24ndCBoYXZlIGEgUEMsIG5vciBkbyB3ZSBoYXZlIGFueSByZWdpc3RlcnMgZXhjZXB0IFNQLgorCisgICBUaGlzIHJvdXRpbmUgdGFrZXMgdHdvIGFyZ3VtZW50cywgU1AgYW5kIFBDLCBhbmQgdHJpZXMgdG8gbWFrZSB0aGUKKyAgIGNhY2hlZCBmcmFtZXMgbG9vayBhcyBpZiB0aGVzZSB0d28gYXJndW1lbnRzIGRlZmluZWQgYSBmcmFtZSBvbiB0aGUKKyAgIGNhY2hlLiAgVGhpcyBhbGxvd3MgdGhlIHJlc3Qgb2YgaW5mbyBmcmFtZSB0byBleHRyYWN0IHRoZSBpbXBvcnRhbnQKKyAgIGFyZ3VtZW50cyB3aXRob3V0IGRpZmZpY3VsdHkuICAqLworCitzdHJ1Y3QgZnJhbWVfaW5mbyAqCitzZXR1cF9hcmJpdHJhcnlfZnJhbWUgKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBDT1JFX0FERFIgKmFyZ3Y7Cit7CisgIGlmIChhcmdjICE9IDIpCisgICAgZXJyb3IgKCJNSVBTIGZyYW1lIHNwZWNpZmljYXRpb25zIHJlcXVpcmUgdHdvIGFyZ3VtZW50czogc3AgYW5kIHBjIik7CisKKyAgcmV0dXJuIGNyZWF0ZV9uZXdfZnJhbWUgKGFyZ3ZbMF0sIGFyZ3ZbMV0pOworfQorCisvKgorICogU1RBQ0tfQVJHU0laRSAtLSBob3cgbWFueSBieXRlcyBkb2VzIGEgcHVzaGVkIGZ1bmN0aW9uIGFyZyB0YWtlIHVwIG9uIHRoZSBzdGFjaz8KKyAqCisgKiBGb3IgbjMyIEFCSSwgZWlnaHQuCisgKiBGb3IgYWxsIG90aGVycywgaGUgc2FtZSBhcyB0aGUgc2l6ZSBvZiBhIGdlbmVyYWwgcmVnaXN0ZXIuCisgKi8KKyNpZiBkZWZpbmVkIChfTUlQU19TSU1fTkFCSTMyKSAmJiBfTUlQU19TSU0gPT0gX01JUFNfU0lNX05BQkkzMgorI2RlZmluZSBNSVBTX05BQkkzMiAgIDEKKyNkZWZpbmUgU1RBQ0tfQVJHU0laRSA4CisjZWxzZQorI2RlZmluZSBNSVBTX05BQkkzMiAgIDAKKyNkZWZpbmUgU1RBQ0tfQVJHU0laRSBNSVBTX1JFR1NJWkUKKyNlbmRpZgorCitDT1JFX0FERFIKK21pcHNfcHVzaF9hcmd1bWVudHMobmFyZ3MsIGFyZ3MsIHNwLCBzdHJ1Y3RfcmV0dXJuLCBzdHJ1Y3RfYWRkcikKKyAgICAgaW50IG5hcmdzOworICAgICB2YWx1ZV9wdHIgKmFyZ3M7CisgICAgIENPUkVfQUREUiBzcDsKKyAgICAgaW50IHN0cnVjdF9yZXR1cm47CisgICAgIENPUkVfQUREUiBzdHJ1Y3RfYWRkcjsKK3sKKyAgaW50IGFyZ3JlZzsKKyAgaW50IGZsb2F0X2FyZ3JlZzsKKyAgaW50IGFyZ251bTsKKyAgaW50IGxlbiA9IDA7CisgIGludCBzdGFja19vZmZzZXQgPSAwOworCisgIC8qIE1hY3JvcyB0byByb3VuZCBOIHVwIG9yIGRvd24gdG8gdGhlIG5leHQgQSBib3VuZGFyeTsgQSBtdXN0IGJlCisgICAgIGEgcG93ZXIgb2YgdHdvLiAqLworI2RlZmluZSBST1VORF9ET1dOKG4sYSkgKChuKSAmIH4oKGEpLTEpKQorI2RlZmluZSBST1VORF9VUChuLGEpICgoKG4pKyhhKS0xKSAmIH4oKGEpLTEpKQorICAKKyAgLyogRmlyc3QgZW5zdXJlIHRoYXQgdGhlIHN0YWNrIGFuZCBzdHJ1Y3R1cmUgcmV0dXJuIGFkZHJlc3MgKGlmIGFueSkKKyAgICAgYXJlIHByb3Blcmx5IGFsaWduZWQuIFRoZSBzdGFjayBoYXMgdG8gYmUgYXQgbGVhc3QgNjQtYml0IGFsaWduZWQKKyAgICAgZXZlbiBvbiAzMi1iaXQgbWFjaGluZXMsIGJlY2F1c2UgZG91YmxlcyBtdXN0IGJlIDY0LWJpdCBhbGlnbmVkLgorICAgICBPbiBhdCBsZWFzdCBvbmUgTUlQUyB2YXJpYW50LCBzdGFjayBmcmFtZXMgbmVlZCB0byBiZSAxMjgtYml0CisgICAgIGFsaWduZWQsIHNvIHdlIHJvdW5kIHRvIHRoaXMgd2lkZXN0IGtub3duIGFsaWdubWVudC4gKi8KKyAgc3AgPSBST1VORF9ET1dOIChzcCwgMTYpOworICBzdHJ1Y3RfYWRkciA9IFJPVU5EX0RPV04gKHN0cnVjdF9hZGRyLCBNSVBTX1JFR1NJWkUpOworICAgICAgCisgIC8qIE5vdyBtYWtlIHNwYWNlIG9uIHRoZSBzdGFjayBmb3IgdGhlIGFyZ3MuIFdlIGFsbG9jYXRlIG1vcmUKKyAgICAgdGhhbiBuZWNlc3NhcnkgZm9yIEVBQkksIGJlY2F1c2UgdGhlIGZpcnN0IGZldyBhcmd1bWVudHMgYXJlCisgICAgIHBhc3NlZCBpbiByZWdpc3RlcnMsIGJ1dCB0aGF0J3MgT0suICovCisgIGZvciAoYXJnbnVtID0gMDsgYXJnbnVtIDwgbmFyZ3M7IGFyZ251bSsrKQorICAgIGxlbiArPSBST1VORF9VUCAoVFlQRV9MRU5HVEgoVkFMVUVfVFlQRShhcmdzW2FyZ251bV0pKSwgTUlQU19SRUdTSVpFKTsKKyAgc3AgLT0gUk9VTkRfVVAgKGxlbiwgMTYpOworCisgIC8qIEluaXRpYWxpemUgdGhlIGludGVnZXIgYW5kIGZsb2F0IHJlZ2lzdGVyIHBvaW50ZXJzLiAgKi8KKyAgYXJncmVnID0gQTBfUkVHTlVNOworICBmbG9hdF9hcmdyZWcgPSBGUEEwX1JFR05VTTsKKworICAvKiB0aGUgc3RydWN0X3JldHVybiBwb2ludGVyIG9jY3VwaWVzIHRoZSBmaXJzdCBwYXJhbWV0ZXItcGFzc2luZyByZWcgKi8KKyAgaWYgKHN0cnVjdF9yZXR1cm4pCisgICAgICB3cml0ZV9yZWdpc3RlciAoYXJncmVnKyssIHN0cnVjdF9hZGRyKTsKKworICAvKiBOb3cgbG9hZCBhcyBtYW55IGFzIHBvc3NpYmxlIG9mIHRoZSBmaXJzdCBhcmd1bWVudHMgaW50bworICAgICByZWdpc3RlcnMsIGFuZCBwdXNoIHRoZSByZXN0IG9udG8gdGhlIHN0YWNrLiAgTG9vcCB0aHJ1IGFyZ3MKKyAgICAgZnJvbSBmaXJzdCB0byBsYXN0LiAgKi8KKyAgZm9yIChhcmdudW0gPSAwOyBhcmdudW0gPCBuYXJnczsgYXJnbnVtKyspCisgICAgeworICAgICAgY2hhciAqdmFsOworICAgICAgY2hhciB2YWxidWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKyAgICAgIHZhbHVlX3B0ciBhcmcgPSBhcmdzW2FyZ251bV07CisgICAgICBzdHJ1Y3QgdHlwZSAqYXJnX3R5cGUgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFIChhcmcpKTsKKyAgICAgIGludCBsZW4gPSBUWVBFX0xFTkdUSCAoYXJnX3R5cGUpOworICAgICAgZW51bSB0eXBlX2NvZGUgdHlwZWNvZGUgPSBUWVBFX0NPREUgKGFyZ190eXBlKTsKKworICAgICAgLyogVGhlIEVBQkkgcGFzc2VzIHN0cnVjdHVyZXMgdGhhdCBkbyBub3QgZml0IGluIGEgcmVnaXN0ZXIgYnkKKwkgcmVmZXJlbmNlLiBJbiBhbGwgb3RoZXIgY2FzZXMsIHBhc3MgdGhlIHN0cnVjdHVyZSBieSB2YWx1ZS4gICovCisgICAgICBpZiAoTUlQU19FQUJJICYmIGxlbiA+IE1JUFNfUkVHU0laRSAmJgorCSAgKHR5cGVjb2RlID09IFRZUEVfQ09ERV9TVFJVQ1QgfHwgdHlwZWNvZGUgPT0gVFlQRV9DT0RFX1VOSU9OKSkKKwl7CisJICBzdG9yZV9hZGRyZXNzICh2YWxidWYsIE1JUFNfUkVHU0laRSwgVkFMVUVfQUREUkVTUyAoYXJnKSk7CisJICB0eXBlY29kZSA9IFRZUEVfQ09ERV9QVFI7CisJICBsZW4gPSBNSVBTX1JFR1NJWkU7CisJICB2YWwgPSB2YWxidWY7CisJfQorICAgICAgZWxzZQorCXZhbCA9IChjaGFyICopVkFMVUVfQ09OVEVOVFMgKGFyZyk7CisKKyAgICAgIC8qIDMyLWJpdCBBQklzIGFsd2F5cyBzdGFydCBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMgaW4gYW4KKyAgICAgICAgIGV2ZW4tbnVtYmVyZWQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICAgKi8KKyAgICAgIGlmICghRlBfUkVHSVNURVJfRE9VQkxFICYmIHR5cGVjb2RlID09IFRZUEVfQ09ERV9GTFQKKyAgICAgICAgICAmJiAoZmxvYXRfYXJncmVnICYgMSkpCisJZmxvYXRfYXJncmVnKys7CisKKyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IGFyZ3VtZW50cyBwYXNzZWQgaW4gcmVnaXN0ZXJzIGhhdmUgdG8gYmUKKyAgICAgICAgIHRyZWF0ZWQgc3BlY2lhbGx5LiAgT24gMzItYml0IGFyY2hpdGVjdHVyZXMsIGRvdWJsZXMKKwkgYXJlIHBhc3NlZCBpbiByZWdpc3RlciBwYWlyczsgdGhlIGV2ZW4gcmVnaXN0ZXIgZ2V0cworCSB0aGUgbG93IHdvcmQsIGFuZCB0aGUgb2RkIHJlZ2lzdGVyIGdldHMgdGhlIGhpZ2ggd29yZC4KKwkgT24gbm9uLUVBQkkgcHJvY2Vzc29ycywgdGhlIGZpcnN0IHR3byBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMgYXJlCisJIGFsc28gY29waWVkIHRvIGdlbmVyYWwgcmVnaXN0ZXJzLCBiZWNhdXNlIE1JUFMxNiBmdW5jdGlvbnMKKwkgZG9uJ3QgdXNlIGZsb2F0IHJlZ2lzdGVycyBmb3IgYXJndW1lbnRzLiAgVGhpcyBkdXBsaWNhdGlvbiBvZgorCSBhcmd1bWVudHMgaW4gZ2VuZXJhbCByZWdpc3RlcnMgY2FuJ3QgaHVydCBub24tTUlQUzE2IGZ1bmN0aW9ucworCSBiZWNhdXNlIHRob3NlIHJlZ2lzdGVycyBhcmUgbm9ybWFsbHkgc2tpcHBlZC4gICovCisgICAgICBpZiAodHlwZWNvZGUgPT0gVFlQRV9DT0RFX0ZMVAorCSAgJiYgZmxvYXRfYXJncmVnIDw9IE1JUFNfTEFTVF9GUF9BUkdfUkVHTlVNCisJICAmJiBNSVBTX0ZQVV9UWVBFICE9IE1JUFNfRlBVX05PTkUpCisJeworCSAgaWYgKCFGUF9SRUdJU1RFUl9ET1VCTEUgJiYgbGVuID09IDgpCisJICAgIHsKKwkgICAgICBpbnQgbG93X29mZnNldCA9IFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4gPyA0IDogMDsKKwkgICAgICB1bnNpZ25lZCBsb25nIHJlZ3ZhbDsKKworCSAgICAgIC8qIFdyaXRlIHRoZSBsb3cgd29yZCBvZiB0aGUgZG91YmxlIHRvIHRoZSBldmVuIHJlZ2lzdGVyKHMpLiAgKi8KKwkgICAgICByZWd2YWwgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKHZhbCtsb3dfb2Zmc2V0LCA0KTsKKwkgICAgICB3cml0ZV9yZWdpc3RlciAoZmxvYXRfYXJncmVnKyssIHJlZ3ZhbCk7CisJICAgICAgaWYgKCFNSVBTX0VBQkkpCisJCXdyaXRlX3JlZ2lzdGVyIChhcmdyZWcrMSwgcmVndmFsKTsKKworCSAgICAgIC8qIFdyaXRlIHRoZSBoaWdoIHdvcmQgb2YgdGhlIGRvdWJsZSB0byB0aGUgb2RkIHJlZ2lzdGVyKHMpLiAgKi8KKwkgICAgICByZWd2YWwgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKHZhbCs0LWxvd19vZmZzZXQsIDQpOworCSAgICAgIHdyaXRlX3JlZ2lzdGVyIChmbG9hdF9hcmdyZWcrKywgcmVndmFsKTsKKwkgICAgICBpZiAoIU1JUFNfRUFCSSkKKwkgICAgICAgIHsKKwkJICB3cml0ZV9yZWdpc3RlciAoYXJncmVnLCByZWd2YWwpOworCQkgIGFyZ3JlZyArPSAyOworCQl9CisKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogVGhpcyBpcyBhIGZsb2F0aW5nIHBvaW50IHZhbHVlIHRoYXQgZml0cyBlbnRpcmVseQorCSAgICAgICAgIGluIGEgc2luZ2xlIHJlZ2lzdGVyLiAgKi8KKwkgICAgICBDT1JFX0FERFIgcmVndmFsID0gZXh0cmFjdF9hZGRyZXNzICh2YWwsIGxlbik7CisJICAgICAgd3JpdGVfcmVnaXN0ZXIgKGZsb2F0X2FyZ3JlZysrLCByZWd2YWwpOworCSAgICAgIGlmICghTUlQU19FQUJJKQorCSAgICAgICAgeworCQkgIHdyaXRlX3JlZ2lzdGVyIChhcmdyZWcsIHJlZ3ZhbCk7CisJCSAgYXJncmVnICs9IEZQX1JFR0lTVEVSX0RPVUJMRSA/IDEgOiAyOworCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyogQ29weSB0aGUgYXJndW1lbnQgdG8gZ2VuZXJhbCByZWdpc3RlcnMgb3IgdGhlIHN0YWNrIGluCisJICAgICByZWdpc3Rlci1zaXplZCBwaWVjZXMuICBMYXJnZSBhcmd1bWVudHMgYXJlIHNwbGl0IGJldHdlZW4KKwkgICAgIHJlZ2lzdGVycyBhbmQgc3RhY2suICAqLworCSAgLyogTm90ZTogc3RydWN0cyB3aG9zZSBzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIE1JUFNfUkVHU0laRQorCSAgICAgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OiBJcml4IGNjIHBhc3NlcyB0aGVtIGluIHJlZ2lzdGVycworCSAgICAgd2hlcmUgZ2NjIHNvbWV0aW1lcyBwdXRzIHRoZW0gb24gdGhlIHN0YWNrLiAgRm9yIG1heGltdW0KKwkgICAgIGNvbXBhdGliaWxpdHksIHdlIHdpbGwgcHV0IHRoZW0gaW4gYm90aCBwbGFjZXMuICAqLworCisJICBpbnQgb2RkX3NpemVkX3N0cnVjdCA9ICgobGVuID4gTUlQU19SRUdTSVpFKSAmJiAKKwkJCQkgIChsZW4gJSBNSVBTX1JFR1NJWkUgIT0gMCkpOworCSAgd2hpbGUgKGxlbiA+IDApCisJICAgIHsKKwkgICAgICBpbnQgcGFydGlhbF9sZW4gPSBsZW4gPCBNSVBTX1JFR1NJWkUgPyBsZW4gOiBNSVBTX1JFR1NJWkU7CisKKwkgICAgICBpZiAoYXJncmVnID4gTUlQU19MQVNUX0FSR19SRUdOVU0gfHwgb2RkX3NpemVkX3N0cnVjdCkKKwkJeworCQkgIC8qIFdyaXRlIHRoaXMgcG9ydGlvbiBvZiB0aGUgYXJndW1lbnQgdG8gdGhlIHN0YWNrLiAgKi8KKwkJICAvKiBTaG91bGQgc2hvcnRlciB0aGFuIGludCBpbnRlZ2VyIHZhbHVlcyBiZQorCQkgICAgIHByb21vdGVkIHRvIGludCBiZWZvcmUgYmVpbmcgc3RvcmVkPyAqLworCisJCSAgaW50IGxvbmd3b3JkX29mZnNldCA9IDA7CisJCSAgaWYgKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pCisJCSAgICBpZiAoU1RBQ0tfQVJHU0laRSA9PSA4ICYmCisJCQkodHlwZWNvZGUgPT0gVFlQRV9DT0RFX0lOVCB8fAorCQkJIHR5cGVjb2RlID09IFRZUEVfQ09ERV9QVFIgfHwKKwkJCSB0eXBlY29kZSA9PSBUWVBFX0NPREVfRkxUKSAmJiBsZW4gPD0gNCkKKwkJICAgICAgbG9uZ3dvcmRfb2Zmc2V0ID0gU1RBQ0tfQVJHU0laRSAtIGxlbjsKKwkJICAgIGVsc2UgaWYgKCh0eXBlY29kZSA9PSBUWVBFX0NPREVfU1RSVUNUIHx8CisJCQkgICAgICB0eXBlY29kZSA9PSBUWVBFX0NPREVfVU5JT04pICYmCisJCQkgICAgIFRZUEVfTEVOR1RIIChhcmdfdHlwZSkgPCBTVEFDS19BUkdTSVpFKQorCQkgICAgICBsb25nd29yZF9vZmZzZXQgPSBTVEFDS19BUkdTSVpFIC0gbGVuOworCisJCSAgd3JpdGVfbWVtb3J5IChzcCArIHN0YWNrX29mZnNldCArIGxvbmd3b3JkX29mZnNldCwgCisJCQkJdmFsLCBwYXJ0aWFsX2xlbik7CisJCX0KKworCSAgICAgIC8qIE5vdGUhISEgVGhpcyBpcyBOT1QgYW4gZWxzZSBjbGF1c2UuCisJCSBPZGQgc2l6ZWQgc3RydWN0cyBtYXkgZ28gdGhydSBCT1RIIHBhdGhzLiAgKi8KKwkgICAgICBpZiAoYXJncmVnIDw9IE1JUFNfTEFTVF9BUkdfUkVHTlVNKQorCQl7CisJCSAgQ09SRV9BRERSIHJlZ3ZhbCA9IGV4dHJhY3RfYWRkcmVzcyAodmFsLCBwYXJ0aWFsX2xlbik7CisKKwkJICAvKiBBIG5vbi1mbG9hdGluZy1wb2ludCBhcmd1bWVudCBiZWluZyBwYXNzZWQgaW4gYSAKKwkJICAgICBnZW5lcmFsIHJlZ2lzdGVyLiAgSWYgYSBzdHJ1Y3Qgb3IgdW5pb24sIGFuZCBpZgorCQkgICAgIHRoZSByZW1haW5pbmcgbGVuZ3RoIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVnaXN0ZXIKKwkJICAgICBzaXplLCB3ZSBoYXZlIHRvIGFkanVzdCB0aGUgcmVnaXN0ZXIgdmFsdWUgb24KKwkJICAgICBiaWcgZW5kaWFuIHRhcmdldHMuCisKKwkJICAgICBJdCBkb2VzIG5vdCBzZWVtIHRvIGJlIG5lY2Vzc2FyeSB0byBkbyB0aGUKKwkJICAgICBzYW1lIGZvciBpbnRlZ3JhbCB0eXBlcy4KKworCQkgICAgIEFsc28gZG9uJ3QgZG8gdGhpcyBhZGp1c3RtZW50IG9uIEVBQkkgYW5kIE82NAorCQkgICAgIGJpbmFyaWVzLiAqLworCisJCSAgaWYgKCFNSVBTX0VBQkkKKwkJICAgICAgJiYgKE1JUFNfUkVHU0laRSA8IDgpCisJCSAgICAgICYmIFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4KKwkJICAgICAgJiYgKHBhcnRpYWxfbGVuIDwgTUlQU19SRUdTSVpFKQorCQkgICAgICAmJiAodHlwZWNvZGUgPT0gVFlQRV9DT0RFX1NUUlVDVCB8fAorCQkJICB0eXBlY29kZSA9PSBUWVBFX0NPREVfVU5JT04pKQorCQkgICAgcmVndmFsIDw8PSAoKE1JUFNfUkVHU0laRSAtIHBhcnRpYWxfbGVuKSAqIAorCQkJCVRBUkdFVF9DSEFSX0JJVCk7CisKKwkJICB3cml0ZV9yZWdpc3RlciAoYXJncmVnLCByZWd2YWwpOworCQkgIGFyZ3JlZysrOworICAgIAorCQkgIC8qIElmIHRoaXMgaXMgdGhlIG9sZCBBQkksIHByZXZlbnQgc3Vic2VxdWVudCBmbG9hdGluZworCQkgICAgIHBvaW50IGFyZ3VtZW50cyBmcm9tIGJlaW5nIHBhc3NlZCBpbiBmbG9hdGluZyBwb2ludAorCQkgICAgIHJlZ2lzdGVycy4gICovCisJCSAgaWYgKCFNSVBTX0VBQkkpCisJCSAgICBmbG9hdF9hcmdyZWcgPSBNSVBTX0xBU1RfRlBfQVJHX1JFR05VTSArIDE7CisJCX0KKyAgICAKKwkgICAgICBsZW4gLT0gcGFydGlhbF9sZW47CisJICAgICAgdmFsICs9IHBhcnRpYWxfbGVuOworCisJICAgICAgLyogVGhlIG9mZnNldCBvbnRvIHRoZSBzdGFjayBhdCB3aGljaCB3ZSB3aWxsIHN0YXJ0CisJCSBjb3B5aW5nIHBhcmFtZXRlcnMgKGFmdGVyIHRoZSByZWdpc3RlcnMgYXJlIHVzZWQgdXApIAorCQkgYmVnaW5zIGF0ICg0ICogTUlQU19SRUdTSVpFKSBpbiB0aGUgb2xkIEFCSS4gIFRoaXMgCisJCSBsZWF2ZXMgcm9vbSBmb3IgdGhlICJob21lIiBhcmVhIGZvciByZWdpc3RlciBwYXJhbWV0ZXJzLgorCisJCSBJbiB0aGUgbmV3IEVBQkkgKGFuZCB0aGUgTkFCSTMyKSwgdGhlIDggcmVnaXN0ZXIgcGFyYW1ldGVycyAKKwkJIGRvIG5vdCBoYXZlICJob21lIiBzdGFjayBzcGFjZSByZXNlcnZlZCBmb3IgdGhlbSwgc28gdGhlCisJCSBzdGFjayBvZmZzZXQgZG9lcyBub3QgZ2V0IGluY3JlbWVudGVkIHVudGlsIGFmdGVyCisJCSB3ZSBoYXZlIHVzZWQgdXAgdGhlIDggcGFyYW1ldGVyIHJlZ2lzdGVycy4gICovCisKKwkgICAgICBpZiAoIShNSVBTX0VBQkkgfHwgTUlQU19OQUJJMzIpIHx8CisJCSAgYXJnbnVtID49IDgpCisJCXN0YWNrX29mZnNldCArPSBST1VORF9VUCAocGFydGlhbF9sZW4sIFNUQUNLX0FSR1NJWkUpOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBTZXQgdGhlIHJldHVybiBhZGRyZXNzIHJlZ2lzdGVyIHRvIHBvaW50IHRvIHRoZSBlbnRyeQorICAgICBwb2ludCBvZiB0aGUgcHJvZ3JhbSwgd2hlcmUgYSBicmVha3BvaW50IGxpZXMgaW4gd2FpdC4gICovCisgIHdyaXRlX3JlZ2lzdGVyIChSQV9SRUdOVU0sIENBTExfRFVNTVlfQUREUkVTUygpKTsKKworICAvKiBSZXR1cm4gYWRqdXN0ZWQgc3RhY2sgcG9pbnRlci4gICovCisgIHJldHVybiBzcDsKK30KKworc3RhdGljIHZvaWQKK21pcHNfcHVzaF9yZWdpc3RlcihDT1JFX0FERFIgKnNwLCBpbnQgcmVnbm8pCit7CisgIGNoYXIgYnVmZmVyW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisgIGludCByZWdzaXplID0gUkVHSVNURVJfUkFXX1NJWkUgKHJlZ25vKTsKKworICAqc3AgLT0gcmVnc2l6ZTsKKyAgcmVhZF9yZWdpc3Rlcl9nZW4gKHJlZ25vLCBidWZmZXIpOworICB3cml0ZV9tZW1vcnkgKCpzcCwgYnVmZmVyLCByZWdzaXplKTsKK30KKworLyogTUFTSyhpLGopID09ICgxPDxpKSArICgxPDwoaSsxKSkgKyAuLi4gKyAoMTw8aikpLiBBc3N1bWUgaTw9ajwoTUlQU19OVU1SRUdTLTEpLiAqLworI2RlZmluZSBNQVNLKGksaikgKCgoMSA8PCAoKGopKzEpKS0xKSBeICgoMSA8PCAoaSkpLTEpKQorCit2b2lkCittaXBzX3B1c2hfZHVtbXlfZnJhbWUoKQoreworICBpbnQgaXJlZzsKKyAgc3RydWN0IGxpbmtlZF9wcm9jX2luZm8gKmxpbmsgPSAoc3RydWN0IGxpbmtlZF9wcm9jX2luZm8qKQorICAgICAgeG1hbGxvYyhzaXplb2Yoc3RydWN0IGxpbmtlZF9wcm9jX2luZm8pKTsKKyAgbWlwc19leHRyYV9mdW5jX2luZm9fdCBwcm9jX2Rlc2MgPSAmbGluay0+aW5mbzsKKyAgQ09SRV9BRERSIHNwID0gQUREUl9CSVRTX1JFTU9WRSAocmVhZF9yZWdpc3RlciAoU1BfUkVHTlVNKSk7CisgIENPUkVfQUREUiBvbGRfc3AgPSBzcDsKKyAgbGluay0+bmV4dCA9IGxpbmtlZF9wcm9jX2Rlc2NfdGFibGU7CisgIGxpbmtlZF9wcm9jX2Rlc2NfdGFibGUgPSBsaW5rOworCisvKiBGSVhNRSEgICBhcmUgdGhlc2UgY29ycmVjdCA/ICovCisjZGVmaW5lIFBVU0hfRlBfUkVHTlVNIDE2IC8qIG11c3QgYmUgYSByZWdpc3RlciBwcmVzZXJ2ZWQgYWNyb3NzIGNhbGxzICovCisjZGVmaW5lIEdFTl9SRUdfU0FWRV9NQVNLIE1BU0soMSwxNil8TUFTSygyNCwyOCl8KDE8PChNSVBTX05VTVJFR1MtMSkpCisjZGVmaW5lIEZMT0FUX1JFR19TQVZFX01BU0sgTUFTSygwLDE5KQorI2RlZmluZSBGTE9BVF9TSU5HTEVfUkVHX1NBVkVfTUFTSyBcCisgICgoMTw8MTgpfCgxPDwxNil8KDE8PDE0KXwoMTw8MTIpfCgxPDwxMCl8KDE8PDgpfCgxPDw2KXwoMTw8NCl8KDE8PDIpfCgxPDwwKSkKKyAgLyoKKyAgICogVGhlIHJlZ2lzdGVycyB3ZSBtdXN0IHNhdmUgYXJlIGFsbCB0aG9zZSBub3QgcHJlc2VydmVkIGFjcm9zcworICAgKiBwcm9jZWR1cmUgY2FsbHMuIERlc3RfUmVnIChzZWUgdG0tbWlwcy5oKSBtdXN0IGFsc28gYmUgc2F2ZWQuCisgICAqIEluIGFkZGl0aW9uLCB3ZSBtdXN0IHNhdmUgdGhlIFBDLCBQVVNIX0ZQX1JFR05VTSwgTU1MTy8tSEkKKyAgICogYW5kIEZQIENvbnRyb2wvU3RhdHVzIHJlZ2lzdGVycy4KKyAgICogCisgICAqCisgICAqIER1bW15IGZyYW1lIGxheW91dDoKKyAgICogIChoaWdoIG1lbW9yeSkKKyAgICogCVNhdmVkIFBDCisgICAqCVNhdmVkIE1NSEksIE1NTE8sIEZQQ19DU1IKKyAgICoJU2F2ZWQgUjMxCisgICAqCVNhdmVkIFIyOAorICAgKgkuLi4KKyAgICoJU2F2ZWQgUjEKKyAgICogICAgU2F2ZWQgRDE4IChpLmUuIEYxOSwgRjE4KQorICAgKiAgICAuLi4KKyAgICogICAgU2F2ZWQgRDAgKGkuZS4gRjEsIEYwKQorICAgKglBcmd1bWVudCBidWlsZCBhcmVhIGFuZCBzdGFjayBhcmd1bWVudHMgd3JpdHRlbiB2aWEgbWlwc19wdXNoX2FyZ3VtZW50cworICAgKiAgKGxvdyBtZW1vcnkpCisgICAqLworCisgIC8qIFNhdmUgc3BlY2lhbCByZWdpc3RlcnMgKFBDLCBNTUhJLCBNTUxPLCBGUENfQ1NSKSAqLworICBQUk9DX0ZSQU1FX1JFRyhwcm9jX2Rlc2MpID0gUFVTSF9GUF9SRUdOVU07CisgIFBST0NfRlJBTUVfT0ZGU0VUKHByb2NfZGVzYykgPSAwOworICBQUk9DX0ZSQU1FX0FESlVTVChwcm9jX2Rlc2MpID0gMDsKKyAgbWlwc19wdXNoX3JlZ2lzdGVyICgmc3AsIFBDX1JFR05VTSk7CisgIG1pcHNfcHVzaF9yZWdpc3RlciAoJnNwLCBISV9SRUdOVU0pOworICBtaXBzX3B1c2hfcmVnaXN0ZXIgKCZzcCwgTE9fUkVHTlVNKTsKKyAgbWlwc19wdXNoX3JlZ2lzdGVyICgmc3AsIE1JUFNfRlBVX1RZUEUgPT0gTUlQU19GUFVfTk9ORSA/IDAgOiBGQ1JDU19SRUdOVU0pOworCisgIC8qIFNhdmUgZ2VuZXJhbCBDUFUgcmVnaXN0ZXJzICovCisgIFBST0NfUkVHX01BU0socHJvY19kZXNjKSA9IEdFTl9SRUdfU0FWRV9NQVNLOworICAvKiBQUk9DX1JFR19PRkZTRVQgaXMgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3Qgc2F2ZWQgcmVnaXN0ZXIgZnJvbSBGUC4gICovCisgIFBST0NfUkVHX09GRlNFVChwcm9jX2Rlc2MpID0gc3AgLSBvbGRfc3AgLSBNSVBTX1JFR1NJWkU7CisgIGZvciAoaXJlZyA9IDMyOyAtLWlyZWcgPj0gMDsgKQorICAgIGlmIChQUk9DX1JFR19NQVNLKHByb2NfZGVzYykgJiAoMSA8PCBpcmVnKSkKKyAgICAgIG1pcHNfcHVzaF9yZWdpc3RlciAoJnNwLCBpcmVnKTsKKworICAvKiBTYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBzdGFydGluZyB3aXRoIGhpZ2ggb3JkZXIgd29yZCAqLworICBQUk9DX0ZSRUdfTUFTSyhwcm9jX2Rlc2MpID0gCisgICAgTUlQU19GUFVfVFlQRSA9PSBNSVBTX0ZQVV9ET1VCTEUgPyBGTE9BVF9SRUdfU0FWRV9NQVNLCisgICAgOiBNSVBTX0ZQVV9UWVBFID09IE1JUFNfRlBVX1NJTkdMRSA/IEZMT0FUX1NJTkdMRV9SRUdfU0FWRV9NQVNLIDogMDsKKyAgLyogUFJPQ19GUkVHX09GRlNFVCBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBzYXZlZCAqZG91YmxlKiByZWdpc3RlcgorICAgICBmcm9tIEZQLiAgKi8KKyAgUFJPQ19GUkVHX09GRlNFVChwcm9jX2Rlc2MpID0gc3AgLSBvbGRfc3AgLSA4OworICBmb3IgKGlyZWcgPSAzMjsgLS1pcmVnID49IDA7ICkKKyAgICBpZiAoUFJPQ19GUkVHX01BU0socHJvY19kZXNjKSAmICgxIDw8IGlyZWcpKQorICAgICAgbWlwc19wdXNoX3JlZ2lzdGVyICgmc3AsIGlyZWcgKyBGUDBfUkVHTlVNKTsKKworICAvKiBVcGRhdGUgdGhlIGZyYW1lIHBvaW50ZXIgZm9yIHRoZSBjYWxsIGR1bW15IGFuZCB0aGUgc3RhY2sgcG9pbnRlci4KKyAgICAgU2V0IHRoZSBwcm9jZWR1cmUncyBzdGFydGluZyBhbmQgZW5kaW5nIGFkZHJlc3NlcyB0byBwb2ludCB0byB0aGUKKyAgICAgY2FsbCBkdW1teSBhZGRyZXNzIGF0IHRoZSBlbnRyeSBwb2ludC4gICovCisgIHdyaXRlX3JlZ2lzdGVyIChQVVNIX0ZQX1JFR05VTSwgb2xkX3NwKTsKKyAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgc3ApOworICBQUk9DX0xPV19BRERSKHByb2NfZGVzYykgPSBDQUxMX0RVTU1ZX0FERFJFU1MoKTsKKyAgUFJPQ19ISUdIX0FERFIocHJvY19kZXNjKSA9ICBDQUxMX0RVTU1ZX0FERFJFU1MoKSArIDQ7CisgIFNFVF9QUk9DX0RFU0NfSVNfRFVNTVkocHJvY19kZXNjKTsKKyAgUFJPQ19QQ19SRUcocHJvY19kZXNjKSA9IFJBX1JFR05VTTsKK30KKwordm9pZAorbWlwc19wb3BfZnJhbWUoKQoreworICByZWdpc3RlciBpbnQgcmVnbnVtOworICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWUgPSBnZXRfY3VycmVudF9mcmFtZSAoKTsKKyAgQ09SRV9BRERSIG5ld19zcCA9IEZSQU1FX0ZQIChmcmFtZSk7CisKKyAgbWlwc19leHRyYV9mdW5jX2luZm9fdCBwcm9jX2Rlc2MgPSBmcmFtZS0+cHJvY19kZXNjOworCisgIHdyaXRlX3JlZ2lzdGVyIChQQ19SRUdOVU0sIEZSQU1FX1NBVkVEX1BDKGZyYW1lKSk7CisgIGlmIChmcmFtZS0+c2F2ZWRfcmVncyA9PSBOVUxMKQorICAgIG1pcHNfZmluZF9zYXZlZF9yZWdzIChmcmFtZSk7CisgIGZvciAocmVnbnVtID0gMDsgcmVnbnVtIDwgTlVNX1JFR1M7IHJlZ251bSsrKQorICAgIHsKKyAgICAgIGlmIChyZWdudW0gIT0gU1BfUkVHTlVNICYmIHJlZ251bSAhPSBQQ19SRUdOVU0KKwkgICYmIGZyYW1lLT5zYXZlZF9yZWdzW3JlZ251bV0pCisJd3JpdGVfcmVnaXN0ZXIgKHJlZ251bSwKKwkJCXJlYWRfbWVtb3J5X2ludGVnZXIgKGZyYW1lLT5zYXZlZF9yZWdzW3JlZ251bV0sCisJCQkJCSAgICAgTUlQU19SRUdTSVpFKSk7IAorICAgIH0KKyAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgbmV3X3NwKTsKKyAgZmx1c2hfY2FjaGVkX2ZyYW1lcyAoKTsKKworICBpZiAocHJvY19kZXNjICYmIFBST0NfREVTQ19JU19EVU1NWShwcm9jX2Rlc2MpKQorICAgIHsKKyAgICAgIHN0cnVjdCBsaW5rZWRfcHJvY19pbmZvICpwaV9wdHIsICpwcmV2X3B0cjsKKworICAgICAgZm9yIChwaV9wdHIgPSBsaW5rZWRfcHJvY19kZXNjX3RhYmxlLCBwcmV2X3B0ciA9IE5VTEw7CisJICAgcGlfcHRyICE9IE5VTEw7CisJICAgcHJldl9wdHIgPSBwaV9wdHIsIHBpX3B0ciA9IHBpX3B0ci0+bmV4dCkKKwl7CisJICBpZiAoJnBpX3B0ci0+aW5mbyA9PSBwcm9jX2Rlc2MpCisJICAgIGJyZWFrOworCX0KKworICAgICAgaWYgKHBpX3B0ciA9PSBOVUxMKQorCWVycm9yICgiQ2FuJ3QgbG9jYXRlIGR1bW15IGV4dHJhIGZyYW1lIGluZm9cbiIpOworCisgICAgICBpZiAocHJldl9wdHIgIT0gTlVMTCkKKwlwcmV2X3B0ci0+bmV4dCA9IHBpX3B0ci0+bmV4dDsKKyAgICAgIGVsc2UKKwlsaW5rZWRfcHJvY19kZXNjX3RhYmxlID0gcGlfcHRyLT5uZXh0OworCisgICAgICBmcmVlIChwaV9wdHIpOworCisgICAgICB3cml0ZV9yZWdpc3RlciAoSElfUkVHTlVNLAorCSAgICAgICAgcmVhZF9tZW1vcnlfaW50ZWdlciAobmV3X3NwIC0gMipNSVBTX1JFR1NJWkUsIE1JUFNfUkVHU0laRSkpOworICAgICAgd3JpdGVfcmVnaXN0ZXIgKExPX1JFR05VTSwKKwkgICAgICAgIHJlYWRfbWVtb3J5X2ludGVnZXIgKG5ld19zcCAtIDMqTUlQU19SRUdTSVpFLCBNSVBTX1JFR1NJWkUpKTsKKyAgICAgIGlmIChNSVBTX0ZQVV9UWVBFICE9IE1JUFNfRlBVX05PTkUpCisJd3JpdGVfcmVnaXN0ZXIgKEZDUkNTX1JFR05VTSwKKwkgICAgICAgIHJlYWRfbWVtb3J5X2ludGVnZXIgKG5ld19zcCAtIDQqTUlQU19SRUdTSVpFLCBNSVBTX1JFR1NJWkUpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCittaXBzX3ByaW50X3JlZ2lzdGVyIChyZWdudW0sIGFsbCkKKyAgICAgaW50IHJlZ251bSwgYWxsOworeworICBjaGFyIHJhd19idWZmZXJbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKworICAvKiBHZXQgdGhlIGRhdGEgaW4gcmF3IGZvcm1hdC4gICovCisgIGlmIChyZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyAocmVnbnVtLCByYXdfYnVmZmVyKSkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIlczogW0ludmFsaWRdIiwgUkVHSVNURVJfTkFNRSAocmVnbnVtKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIElmIGFuIGV2ZW4gZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIsIGFsc28gcHJpbnQgYXMgZG91YmxlLiAqLworICBpZiAoVFlQRV9DT0RFIChSRUdJU1RFUl9WSVJUVUFMX1RZUEUgKHJlZ251bSkpID09IFRZUEVfQ09ERV9GTFQKKyAgICAgICYmICEoKHJlZ251bS1GUDBfUkVHTlVNKSAmIDEpKQorICAgIGlmIChSRUdJU1RFUl9SQVdfU0laRShyZWdudW0pID09IDQpCS8qIHRoaXMgd291bGQgYmUgc2lsbHkgb24gTUlQUzY0IG9yIE4zMiAoSXJpeCA2KSAqLworICAgICAgeworCWNoYXIgZGJ1ZmZlclsyICogTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsgCisKKwlyZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyAocmVnbnVtLCBkYnVmZmVyKTsKKwlyZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyAocmVnbnVtKzEsIGRidWZmZXIrTUlQU19SRUdTSVpFKTsKKwlSRUdJU1RFUl9DT05WRVJUX1RPX1RZUEUgKHJlZ251bSwgYnVpbHRpbl90eXBlX2RvdWJsZSwgZGJ1ZmZlcik7CisKKwlwcmludGZfZmlsdGVyZWQgKCIoZCVkOiAiLCByZWdudW0tRlAwX1JFR05VTSk7CisJdmFsX3ByaW50IChidWlsdGluX3R5cGVfZG91YmxlLCBkYnVmZmVyLCAwLCAwLAorCQkgICBnZGJfc3Rkb3V0LCAwLCAxLCAwLCBWYWxfcHJldHR5X2RlZmF1bHQpOworCXByaW50Zl9maWx0ZXJlZCAoIik7ICIpOworICAgICAgfQorICBmcHV0c19maWx0ZXJlZCAoUkVHSVNURVJfTkFNRSAocmVnbnVtKSwgZ2RiX3N0ZG91dCk7CisKKyAgLyogVGhlIHByb2JsZW0gd2l0aCBwcmludGluZyBudW1lcmljIHJlZ2lzdGVyIG5hbWVzIChyMjYsIGV0Yy4pIGlzIHRoYXQKKyAgICAgdGhlIHVzZXIgY2FuJ3QgdXNlIHRoZW0gb24gaW5wdXQuICBQcm9iYWJseSB0aGUgYmVzdCBzb2x1dGlvbiBpcyB0bworICAgICBmaXggaXQgc28gdGhhdCBlaXRoZXIgdGhlIG51bWVyaWMgb3IgdGhlIGZ1bmt5IChhMiwgZXRjLikgbmFtZXMKKyAgICAgYXJlIGFjY2VwdGVkIG9uIGlucHV0LiAgKi8KKyAgaWYgKHJlZ251bSA8IE1JUFNfTlVNUkVHUykKKyAgICBwcmludGZfZmlsdGVyZWQgKCIociVkKTogIiwgcmVnbnVtKTsKKyAgZWxzZQorICAgIHByaW50Zl9maWx0ZXJlZCAoIjogIik7CisKKyAgLyogSWYgdmlydHVhbCBmb3JtYXQgaXMgZmxvYXRpbmcsIHByaW50IGl0IHRoYXQgd2F5LiAgKi8KKyAgaWYgKFRZUEVfQ09ERSAoUkVHSVNURVJfVklSVFVBTF9UWVBFIChyZWdudW0pKSA9PSBUWVBFX0NPREVfRkxUKQorICAgIGlmIChGUF9SRUdJU1RFUl9ET1VCTEUpCisgICAgICB7IC8qIHNob3cgOC1ieXRlIGZsb2F0cyBhcyBmbG9hdCBBTkQgZG91YmxlOiAqLworCWludCBvZmZzZXQgPSA0ICogKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pOworCisJcHJpbnRmX2ZpbHRlcmVkICgiIChmbG9hdCkgIik7CisJdmFsX3ByaW50IChidWlsdGluX3R5cGVfZmxvYXQsIHJhd19idWZmZXIgKyBvZmZzZXQsIDAsIDAsCisJCSAgIGdkYl9zdGRvdXQsIDAsIDEsIDAsIFZhbF9wcmV0dHlfZGVmYXVsdCk7CisJcHJpbnRmX2ZpbHRlcmVkICgiLCAoZG91YmxlKSAiKTsKKwl2YWxfcHJpbnQgKGJ1aWx0aW5fdHlwZV9kb3VibGUsIHJhd19idWZmZXIsIDAsIDAsCisJCSAgIGdkYl9zdGRvdXQsIDAsIDEsIDAsIFZhbF9wcmV0dHlfZGVmYXVsdCk7CisgICAgICB9CisgICAgZWxzZQorICAgICAgdmFsX3ByaW50IChSRUdJU1RFUl9WSVJUVUFMX1RZUEUgKHJlZ251bSksIHJhd19idWZmZXIsIDAsIDAsCisJCSBnZGJfc3Rkb3V0LCAwLCAxLCAwLCBWYWxfcHJldHR5X2RlZmF1bHQpOworICAvKiBFbHNlIHByaW50IGFzIGludGVnZXIgaW4gaGV4LiAgKi8KKyAgZWxzZQorICAgIHByaW50X3NjYWxhcl9mb3JtYXR0ZWQgKHJhd19idWZmZXIsIFJFR0lTVEVSX1ZJUlRVQUxfVFlQRSAocmVnbnVtKSwKKwkJCSAgICAneCcsIDAsIGdkYl9zdGRvdXQpOworfQorCisvKiBSZXBsYWNlbWVudCBmb3IgZ2VuZXJpYyBkb19yZWdpc3RlcnNfaW5mby4gIAorICAgUHJpbnQgcmVncyBpbiBwcmV0dHkgY29sdW1ucy4gICovCisKK3N0YXRpYyBpbnQKK2RvX2ZwX3JlZ2lzdGVyX3JvdyAocmVnbnVtKQorICAgICBpbnQgcmVnbnVtOworeyAvKiBkbyB2YWx1ZXMgZm9yIEZQIChmbG9hdCkgcmVncyAqLworICBjaGFyICpyYXdfYnVmZmVyWzJdOworICBjaGFyICpkYmxfYnVmZmVyOworICAvKiB1c2UgSEkgYW5kIExPIHRvIGNvbnRyb2wgdGhlIG9yZGVyIG9mIGNvbWJpbmluZyB0d28gZmx0IHJlZ3MgKi8KKyAgaW50IEhJID0gKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pOworICBpbnQgTE8gPSAoVEFSR0VUX0JZVEVfT1JERVIgIT0gQklHX0VORElBTik7CisgIGRvdWJsZSBkb3ViLCBmbHQxLCBmbHQyOwkvKiBkb3VibGVzIGV4dHJhY3RlZCBmcm9tIHJhdyBoZXggZGF0YSAqLworICBpbnQgaW52MSwgaW52MiwgaW52MzsKKyAgIAorICByYXdfYnVmZmVyWzBdID0gKGNoYXIgKikgYWxsb2NhIChSRUdJU1RFUl9SQVdfU0laRSAoRlAwX1JFR05VTSkpOworICByYXdfYnVmZmVyWzFdID0gKGNoYXIgKikgYWxsb2NhIChSRUdJU1RFUl9SQVdfU0laRSAoRlAwX1JFR05VTSkpOworICBkYmxfYnVmZmVyID0gKGNoYXIgKikgYWxsb2NhICgyICogUkVHSVNURVJfUkFXX1NJWkUgKEZQMF9SRUdOVU0pKTsKKworICAvKiBHZXQgdGhlIGRhdGEgaW4gcmF3IGZvcm1hdC4gICovCisgIGlmIChyZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyAocmVnbnVtLCByYXdfYnVmZmVyW0hJXSkpCisgICAgZXJyb3IgKCJjYW4ndCByZWFkIHJlZ2lzdGVyICVkICglcykiLCByZWdudW0sIFJFR0lTVEVSX05BTUUgKHJlZ251bSkpOworICBpZiAoUkVHSVNURVJfUkFXX1NJWkUocmVnbnVtKSA9PSA0KQorICAgIHsKKyAgICAgIC8qIDQtYnl0ZSByZWdpc3RlcnM6IHdlIGNhbiBmaXQgdHdvIHJlZ2lzdGVycyBwZXIgcm93LiAqLworICAgICAgLyogQWxzbyBwcmludCBldmVyeSBwYWlyIG9mIDQtYnl0ZSByZWdzIGFzIGFuIDgtYnl0ZSBkb3VibGUuICovCisgICAgICBpZiAocmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMgKHJlZ251bSArIDEsIHJhd19idWZmZXJbTE9dKSkKKwllcnJvciAoImNhbid0IHJlYWQgcmVnaXN0ZXIgJWQgKCVzKSIsIAorCSAgICAgICByZWdudW0gKyAxLCBSRUdJU1RFUl9OQU1FIChyZWdudW0gKyAxKSk7CisKKyAgICAgIC8qIGNvcHkgdGhlIHR3byBmbG9hdHMgaW50byBvbmUgZG91YmxlLCBhbmQgdW5wYWNrIGJvdGggKi8KKyAgICAgIG1lbWNweSAoZGJsX2J1ZmZlciwgcmF3X2J1ZmZlciwgc2l6ZW9mKGRibF9idWZmZXIpKTsKKyAgICAgIGZsdDEgPSB1bnBhY2tfZG91YmxlIChidWlsdGluX3R5cGVfZmxvYXQsICByYXdfYnVmZmVyW0hJXSwgJmludjEpOworICAgICAgZmx0MiA9IHVucGFja19kb3VibGUgKGJ1aWx0aW5fdHlwZV9mbG9hdCwgIHJhd19idWZmZXJbTE9dLCAmaW52Mik7CisgICAgICBkb3ViID0gdW5wYWNrX2RvdWJsZSAoYnVpbHRpbl90eXBlX2RvdWJsZSwgZGJsX2J1ZmZlciwgICAgICZpbnYzKTsKKworICAgICAgcHJpbnRmX2ZpbHRlcmVkIChpbnYxID8gIiAlLTVzOiA8aW52YWxpZCBmbG9hdD4iIDogCisJCSAgICAgICAiICUtNXMlLTE3LjlnIiwgUkVHSVNURVJfTkFNRSAocmVnbnVtKSwgICAgIGZsdDEpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkIChpbnYyID8gIiAlLTVzOiA8aW52YWxpZCBmbG9hdD4iIDogCisJCSAgICAgICAiICUtNXMlLTE3LjlnIiwgUkVHSVNURVJfTkFNRSAocmVnbnVtICsgMSksIGZsdDIpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkIChpbnYzID8gIiBkYmw6IDxpbnZhbGlkIGRvdWJsZT5cbiIgOiAKKwkJICAgICAgICIgZGJsOiAlLTI0LjE3Z1xuIiwgZG91Yik7CisgICAgICAvKiBtYXkgd2FudCB0byBkbyBoZXggZGlzcGxheSBoZXJlIChmdXR1cmUgZW5oYW5jZW1lbnQpICovCisgICAgICByZWdudW0gKz0yOworICAgIH0KKyAgZWxzZQorICAgIHsgLyogZWlnaHQgYnl0ZSByZWdpc3RlcnM6IHByaW50IGVhY2ggb25lIGFzIGZsb2F0IEFORCBhcyBkb3VibGUuICovCisgICAgICBpbnQgb2Zmc2V0ID0gNCAqIChUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKTsKKworICAgICAgbWVtY3B5IChkYmxfYnVmZmVyLCByYXdfYnVmZmVyW0hJXSwgc2l6ZW9mKGRibF9idWZmZXIpKTsKKyAgICAgIGZsdDEgPSB1bnBhY2tfZG91YmxlIChidWlsdGluX3R5cGVfZmxvYXQsIAorCQkJICAgICZyYXdfYnVmZmVyW0hJXVtvZmZzZXRdLCAmaW52MSk7CisgICAgICBkb3ViID0gdW5wYWNrX2RvdWJsZSAoYnVpbHRpbl90eXBlX2RvdWJsZSwgZGJsX2J1ZmZlciwgICAgJmludjMpOworCisgICAgICBwcmludGZfZmlsdGVyZWQgKGludjEgPyAiICUtNXM6IDxpbnZhbGlkIGZsb2F0PiIgOiAKKwkJICAgICAgICIgJS01cyBmbHQ6ICUtMTcuOWciLCBSRUdJU1RFUl9OQU1FIChyZWdudW0pLCBmbHQxKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoaW52MyA/ICIgZGJsOiA8aW52YWxpZCBkb3VibGU+XG4iIDogCisJCSAgICAgICAiIGRibDogJS0yNC4xN2dcbiIsIGRvdWIpOworICAgICAgLyogbWF5IHdhbnQgdG8gZG8gaGV4IGRpc3BsYXkgaGVyZSAoZnV0dXJlIGVuaGFuY2VtZW50KSAqLworICAgICAgcmVnbnVtKys7CisgICAgfQorICByZXR1cm4gcmVnbnVtOworfQorCisvKiBQcmludCBhIHJvdydzIHdvcnRoIG9mIEdQIChpbnQpIHJlZ2lzdGVycywgd2l0aCBuYW1lIGxhYmVscyBhYm92ZSAqLworCitzdGF0aWMgaW50Citkb19ncF9yZWdpc3Rlcl9yb3cgKHJlZ251bSkKKyAgICAgaW50IHJlZ251bTsKK3sKKyAgLyogZG8gdmFsdWVzIGZvciBHUCAoaW50KSByZWdzICovCisgIGNoYXIgcmF3X2J1ZmZlcltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworICBpbnQgbmNvbHMgPSAoTUlQU19SRUdTSVpFID09IDggPyA0IDogOCk7CS8qIGRpc3BsYXkgY29scyBwZXIgcm93ICovCisgIGludCBjb2wsIGJ5dGU7CisgIGludCBzdGFydF9yZWdudW0gPSByZWdudW07CisgIGludCBudW1yZWdzID0gTlVNX1JFR1M7CisKKworICAvKiBGb3IgR1AgcmVnaXN0ZXJzLCB3ZSBwcmludCBhIHNlcGFyYXRlIHJvdyBvZiBuYW1lcyBhYm92ZSB0aGUgdmFscyAqLworICBwcmludGZfZmlsdGVyZWQgKCIgICAgICIpOworICBmb3IgKGNvbCA9IDA7IGNvbCA8IG5jb2xzICYmIHJlZ251bSA8IG51bXJlZ3M7IHJlZ251bSsrKQorICAgIHsKKyAgICAgIGlmICgqUkVHSVNURVJfTkFNRSAocmVnbnVtKSA9PSAnXDAnKQorCWNvbnRpbnVlOwkvKiB1bnVzZWQgcmVnaXN0ZXIgKi8KKyAgICAgIGlmIChUWVBFX0NPREUgKFJFR0lTVEVSX1ZJUlRVQUxfVFlQRSAocmVnbnVtKSkgPT0gVFlQRV9DT0RFX0ZMVCkKKwlicmVhazsJLyogZW5kIHRoZSByb3c6IHJlYWNoZWQgRlAgcmVnaXN0ZXIgKi8KKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoTUlQU19SRUdTSVpFID09IDggPyAiJTE3cyIgOiAiJTlzIiwgCisJCSAgICAgICBSRUdJU1RFUl9OQU1FIChyZWdudW0pKTsKKyAgICAgIGNvbCsrOworICAgIH0KKyAgcHJpbnRmX2ZpbHRlcmVkIChzdGFydF9yZWdudW0gPCBNSVBTX05VTVJFR1MgPyAiXG4gUiUtNGQiIDogIlxuICAgICAgIiwgCisJCSAgIHN0YXJ0X3JlZ251bSk7CS8qIHByaW50IHRoZSBSMCB0byBSMzEgbmFtZXMgKi8KKworICByZWdudW0gPSBzdGFydF9yZWdudW07CS8qIGdvIGJhY2sgdG8gc3RhcnQgb2Ygcm93ICovCisgIC8qIG5vdyBwcmludCB0aGUgdmFsdWVzIGluIGhleCwgNCBvciA4IHRvIHRoZSByb3cgKi8KKyAgZm9yIChjb2wgPSAwOyBjb2wgPCBuY29scyAmJiByZWdudW0gPCBudW1yZWdzOyByZWdudW0rKykKKyAgICB7CisgICAgICBpZiAoKlJFR0lTVEVSX05BTUUgKHJlZ251bSkgPT0gJ1wwJykKKwljb250aW51ZTsJLyogdW51c2VkIHJlZ2lzdGVyICovCisgICAgICBpZiAoVFlQRV9DT0RFIChSRUdJU1RFUl9WSVJUVUFMX1RZUEUgKHJlZ251bSkpID09IFRZUEVfQ09ERV9GTFQpCisJYnJlYWs7CS8qIGVuZCByb3c6IHJlYWNoZWQgRlAgcmVnaXN0ZXIgKi8KKyAgICAgIC8qIE9LOiBnZXQgdGhlIGRhdGEgaW4gcmF3IGZvcm1hdC4gICovCisgICAgICBpZiAocmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMgKHJlZ251bSwgcmF3X2J1ZmZlcikpCisJZXJyb3IgKCJjYW4ndCByZWFkIHJlZ2lzdGVyICVkICglcykiLCByZWdudW0sIFJFR0lTVEVSX05BTUUgKHJlZ251bSkpOworICAgICAgLyogcGFkIHNtYWxsIHJlZ2lzdGVycyAqLworICAgICAgZm9yIChieXRlID0gMDsgYnl0ZSA8IChNSVBTX1JFR1NJWkUgLSBSRUdJU1RFUl9SQVdfU0laRSAocmVnbnVtKSk7IGJ5dGUrKykKKwlwcmludGZfZmlsdGVyZWQgKCIgICIpOworICAgICAgLyogTm93IHByaW50IHRoZSByZWdpc3RlciB2YWx1ZSBpbiBoZXgsIGVuZGlhbiBvcmRlci4gKi8KKyAgICAgIGlmIChUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQorCWZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbnVtKTsgYnl0ZSsrKQorCSAgcHJpbnRmX2ZpbHRlcmVkICgiJTAyeCIsICh1bnNpZ25lZCBjaGFyKSByYXdfYnVmZmVyW2J5dGVdKTsKKyAgICAgIGVsc2UKKwlmb3IgKGJ5dGUgPSBSRUdJU1RFUl9SQVdfU0laRSAocmVnbnVtKSAtIDE7IGJ5dGUgPj0gMDsgYnl0ZS0tKQorCSAgcHJpbnRmX2ZpbHRlcmVkICgiJTAyeCIsICh1bnNpZ25lZCBjaGFyKSByYXdfYnVmZmVyW2J5dGVdKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiAiKTsKKyAgICAgIGNvbCsrOworICAgIH0KKyAgaWYgKGNvbCA+IDApCS8qIGllLiBpZiB3ZSBhY3R1YWxseSBwcmludGVkIGFueXRoaW5nLi4uICovCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKworICByZXR1cm4gcmVnbnVtOworfQorCisvKiBNSVBTX0RPX1JFR0lTVEVSU19JTkZPKCk6IGNhbGxlZCBieSAiaW5mbyByZWdpc3RlciIgY29tbWFuZCAqLworCit2b2lkCittaXBzX2RvX3JlZ2lzdGVyc19pbmZvIChyZWdudW0sIGZwcmVncykKKyAgICAgaW50IHJlZ251bTsKKyAgICAgaW50IGZwcmVnczsKK3sKKyAgaWYgKHJlZ251bSAhPSAtMSkJLyogZG8gb25lIHNwZWNpZmllZCByZWdpc3RlciAqLworICAgIHsKKyAgICAgIGlmICgqKFJFR0lTVEVSX05BTUUgKHJlZ251bSkpID09ICdcMCcpCisJZXJyb3IgKCJOb3QgYSB2YWxpZCByZWdpc3RlciBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzc29yIHR5cGUiKTsKKworICAgICAgbWlwc19wcmludF9yZWdpc3RlciAocmVnbnVtLCAwKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgICAgfQorICBlbHNlCQkJLyogZG8gYWxsIChvciBtb3N0KSByZWdpc3RlcnMgKi8KKyAgICB7CisgICAgICByZWdudW0gPSAwOworICAgICAgd2hpbGUgKHJlZ251bSA8IE5VTV9SRUdTKQorCXsKKwkgIGlmIChUWVBFX0NPREUoUkVHSVNURVJfVklSVFVBTF9UWVBFIChyZWdudW0pKSA9PSBUWVBFX0NPREVfRkxUKQorCSAgICBpZiAoZnByZWdzKQkvKiB0cnVlIGZvciAiSU5GTyBBTEwtUkVHSVNURVJTIiBjb21tYW5kICovCisJICAgICAgcmVnbnVtID0gZG9fZnBfcmVnaXN0ZXJfcm93IChyZWdudW0pOwkvKiBGUCByZWdzICovCisJICAgIGVsc2UKKwkgICAgICByZWdudW0gKz0gTUlQU19OVU1SRUdTOwkvKiBza2lwIGZsb2F0aW5nIHBvaW50IHJlZ3MgKi8KKwkgIGVsc2UKKwkgICAgcmVnbnVtID0gZG9fZ3BfcmVnaXN0ZXJfcm93IChyZWdudW0pOwkvKiBHUCAoaW50KSByZWdzICovCisJfQorICAgIH0KK30KKworLyogUmV0dXJuIG51bWJlciBvZiBhcmdzIHBhc3NlZCB0byBhIGZyYW1lLiBkZXNjcmliZWQgYnkgRklQLgorICAgQ2FuIHJldHVybiAtMSwgbWVhbmluZyBubyB3YXkgdG8gdGVsbC4gICovCisKK2ludAorbWlwc19mcmFtZV9udW1fYXJncyAoZnJhbWUpCisJc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworeworI2lmIDAgLyogRklYTUUgVXNlIG9yIGxvc2UgdGhpcyEgKi8KKyAgc3RydWN0IGNoYWluX2luZm9fdCAqcDsKKworICBwID0gbWlwc19maW5kX2NhY2hlZF9mcmFtZSAoRlJBTUVfRlAgKGZyYW1lKSk7CisgIGlmIChwLT52YWxpZCkKKyAgICByZXR1cm4gcC0+dGhlX2luZm8ubnVtYXJnczsKKyNlbmRpZgorICByZXR1cm4gLTE7Cit9CisKKy8qIElzIHRoaXMgYSBicmFuY2ggd2l0aCBhIGRlbGF5IHNsb3Q/ICAqLworCitzdGF0aWMgaW50IGlzX2RlbGF5ZWQgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOworCitzdGF0aWMgaW50Citpc19kZWxheWVkIChpbnNuKQorICAgICB1bnNpZ25lZCBsb25nIGluc247Cit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgTlVNT1BDT0RFUzsgKytpKQorICAgIGlmIChtaXBzX29wY29kZXNbaV0ucGluZm8gIT0gSU5TTl9NQUNSTworCSYmIChpbnNuICYgbWlwc19vcGNvZGVzW2ldLm1hc2spID09IG1pcHNfb3Bjb2Rlc1tpXS5tYXRjaCkKKyAgICAgIGJyZWFrOworICByZXR1cm4gKGkgPCBOVU1PUENPREVTCisJICAmJiAobWlwc19vcGNvZGVzW2ldLnBpbmZvICYgKElOU05fVU5DT05EX0JSQU5DSF9ERUxBWQorCQkJCSAgICAgICB8IElOU05fQ09ORF9CUkFOQ0hfREVMQVkKKwkJCQkgICAgICAgfCBJTlNOX0NPTkRfQlJBTkNIX0xJS0VMWSkpKTsKK30KKworaW50CittaXBzX3N0ZXBfc2tpcHNfZGVsYXkgKHBjKQorICAgICBDT1JFX0FERFIgcGM7Cit7CisgIGNoYXIgYnVmW01JUFNfSU5TVExFTl07CisKKyAgLyogVGhlcmUgaXMgbm8gYnJhbmNoIGRlbGF5IHNsb3Qgb24gTUlQUzE2LiAgKi8KKyAgaWYgKHBjX2lzX21pcHMxNiAocGMpKQorICAgIHJldHVybiAwOworCisgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkgKHBjLCBidWYsIE1JUFNfSU5TVExFTikgIT0gMCkKKyAgICAvKiBJZiBlcnJvciByZWFkaW5nIG1lbW9yeSwgZ3Vlc3MgdGhhdCBpdCBpcyBub3QgYSBkZWxheWVkIGJyYW5jaC4gICovCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBpc19kZWxheWVkICgodW5zaWduZWQgbG9uZylleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgTUlQU19JTlNUTEVOKSk7Cit9CisKKworLyogU2tpcCB0aGUgUEMgcGFzdCBmdW5jdGlvbiBwcm9sb2d1ZSBpbnN0cnVjdGlvbnMgKDMyLWJpdCB2ZXJzaW9uKS4KKyAgIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIG1pcHNfc2tpcF9wcm9sb2d1ZS4gICovCisKK3N0YXRpYyBDT1JFX0FERFIKK21pcHMzMl9za2lwX3Byb2xvZ3VlIChwYywgbGVuaWVudCkKKyAgICAgQ09SRV9BRERSIHBjOwkvKiBzdGFydGluZyBQQyB0byBzZWFyY2ggZnJvbSAqLworICAgICBpbnQgbGVuaWVudDsKK3sKKyAgICB0X2luc3QgaW5zdDsKKyAgICBDT1JFX0FERFIgZW5kX3BjOworICAgIGludCBzZWVuX3NwX2FkanVzdCA9IDA7CisgICAgaW50IGxvYWRfaW1tZWRpYXRlX2J5dGVzID0gMDsKKworICAgIC8qIFNraXAgdGhlIHR5cGljYWwgcHJvbG9ndWUgaW5zdHJ1Y3Rpb25zLiBUaGVzZSBhcmUgdGhlIHN0YWNrIGFkanVzdG1lbnQKKyAgICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIGluc3RydWN0aW9ucyB0aGF0IHNhdmUgcmVnaXN0ZXJzIG9uIHRoZSBzdGFjaworICAgICAgIG9yIGluIHRoZSBnY2MgZnJhbWUuICAqLworICAgIGZvciAoZW5kX3BjID0gcGMgKyAxMDA7IHBjIDwgZW5kX3BjOyBwYyArPSBNSVBTX0lOU1RMRU4pCisgICAgICB7CisJdW5zaWduZWQgbG9uZyBoaWdoX3dvcmQ7CisKKwlpbnN0ID0gbWlwc19mZXRjaF9pbnN0cnVjdGlvbiAocGMpOworCWhpZ2hfd29yZCA9IChpbnN0ID4+IDE2KSAmIDB4ZmZmZjsKKworI2lmIDAKKwlpZiAobGVuaWVudCAmJiBpc19kZWxheWVkIChpbnN0KSkKKwkgIGNvbnRpbnVlOworI2VuZGlmCisKKwlpZiAoaGlnaF93b3JkID09IDB4MjdiZAkJCS8qIGFkZGl1ICRzcCwkc3Asb2Zmc2V0ICovCisJICAgIHx8IGhpZ2hfd29yZCA9PSAweDY3YmQpCQkvKiBkYWRkaXUgJHNwLCRzcCxvZmZzZXQgKi8KKwkgICAgc2Vlbl9zcF9hZGp1c3QgPSAxOworCWVsc2UgaWYgKGluc3QgPT0gMHgwM2ExZTgyMyB8fCAJICAgICAgICAvKiBzdWJ1ICRzcCwkc3AsJGF0ICovCisJCSBpbnN0ID09IDB4MDNhOGU4MjMpICAgCSAgICAgICAgLyogc3VidSAkc3AsJHNwLCR0MCAqLworCSAgICBzZWVuX3NwX2FkanVzdCA9IDE7CisJZWxzZSBpZiAoKChpbnN0ICYgMHhGRkUwMDAwMCkgPT0gMHhBRkEwMDAwMCAvKiBzdyByZWcsbigkc3ApICovCisJCSAgfHwgKGluc3QgJiAweEZGRTAwMDAwKSA9PSAweEZGQTAwMDAwKSAvKiBzZCByZWcsbigkc3ApICovCisJCSAmJiAoaW5zdCAmIDB4MDAxRjAwMDApKQkvKiByZWcgIT0gJHplcm8gKi8KKwkgICAgY29udGludWU7CisJCQkJCQkKKwllbHNlIGlmICgoaW5zdCAmIDB4RkZFMDAwMDApID09IDB4RTdBMDAwMDApIC8qIHN3YzEgZnJlZyxuKCRzcCkgKi8KKwkgICAgY29udGludWU7CisJZWxzZSBpZiAoKGluc3QgJiAweEYzRTAwMDAwKSA9PSAweEEzQzAwMDAwICYmIChpbnN0ICYgMHgwMDFGMDAwMCkpCisJCQkJCQkvKiBzeCByZWcsbigkczgpICovCisJICAgIGNvbnRpbnVlOwkJCQkvKiByZWcgIT0gJHplcm8gKi8KKyAKKyAgICAgICAgLyogbW92ZSAkczgsJHNwLiAgV2l0aCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgZ2FzIHRoaXMgd2lsbCBiZSBlaXRoZXIKKyAgICAgICAgICAgYGFkZHUgJHM4LCRzcCwkemVybycgb3IgYG9yICRzOCwkc3AsJHplcm8nIG9yIGBkYWRkdSBzOCxzcCwkMCcuCisJICAgIEFjY2VwdCBhbnkgb25lIG9mIHRoZXNlLiAgKi8KKyAgICAgICAgZWxzZSBpZiAoaW5zdCA9PSAweDAzQTBGMDIxIHx8IGluc3QgPT0gMHgwM2EwZjAyNSB8fCBpbnN0ID09IDB4MDNhMGYwMmQpCisJICAgIGNvbnRpbnVlOworCisJZWxzZSBpZiAoKGluc3QgJiAweEZGOUYwN0ZGKSA9PSAweDAwODAwMDIxKSAvKiBtb3ZlIHJlZywkYTAtJGEzICovCisJICAgIGNvbnRpbnVlOworCWVsc2UgaWYgKGhpZ2hfd29yZCA9PSAweDNjMWMpIAkJLyogbHVpICRncCxuICovCisJICAgIGNvbnRpbnVlOworCWVsc2UgaWYgKGhpZ2hfd29yZCA9PSAweDI3OWMpIAkJLyogYWRkaXUgJGdwLCRncCxuICovCisJICAgIGNvbnRpbnVlOworCWVsc2UgaWYgKGluc3QgPT0gMHgwMzk5ZTAyMQkJLyogYWRkdSAkZ3AsJGdwLCR0OSAqLworCQkgfHwgaW5zdCA9PSAweDAzM2NlMDIxKQkJLyogYWRkdSAkZ3AsJHQ5LCRncCAqLworCSAgY29udGludWU7CisJLyogVGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgbG9hZCAkYXQgb3IgJHQwIHdpdGggYW4gaW1tZWRpYXRlCisJICAgdmFsdWUgaW4gcHJlcGFyYXRpb24gZm9yIGEgc3RhY2sgYWRqdXN0bWVudCB2aWEKKwkgICBzdWJ1ICRzcCwkc3AsWyRhdCwkdDBdLiBUaGVzZSBpbnN0cnVjdGlvbnMgY291bGQgYWxzbyBpbml0aWFsaXplCisJICAgYSBsb2NhbCB2YXJpYWJsZSwgc28gd2UgYWNjZXB0IHRoZW0gb25seSBiZWZvcmUgYSBzdGFjayBhZGp1c3RtZW50CisJICAgaW5zdHJ1Y3Rpb24gd2FzIHNlZW4uICAqLworCWVsc2UgaWYgKCFzZWVuX3NwX2FkanVzdCkKKwkgIHsKKwkgICAgaWYgKGhpZ2hfd29yZCA9PSAweDNjMDEgfHwJIAkvKiBsdWkgJGF0LG4gKi8KKwkJaGlnaF93b3JkID09IDB4M2MwOCkJICAJLyogbHVpICR0MCxuICovCisJICAgICAgeworCQlsb2FkX2ltbWVkaWF0ZV9ieXRlcyArPSBNSVBTX0lOU1RMRU47IC8qIEZJWE1FISEgKi8KKwkJY29udGludWU7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChoaWdoX3dvcmQgPT0gMHgzNDIxIHx8IAkvKiBvcmkgJGF0LCRhdCxuICovCisJCSAgICAgaGlnaF93b3JkID09IDB4MzUwOCB8fCAJLyogb3JpICR0MCwkdDAsbiAqLworCQkgICAgIGhpZ2hfd29yZCA9PSAweDM0MDEgfHwgCS8qIG9yaSAkYXQsJHplcm8sbiAqLworCQkgICAgIGhpZ2hfd29yZCA9PSAweDM0MDgpICAgCS8qIG9yaSAkdDAsJHplcm8sbiAqLworCSAgICAgIHsKKwkJbG9hZF9pbW1lZGlhdGVfYnl0ZXMgKz0gTUlQU19JTlNUTEVOOyAvKiBGSVhNRSEhICovCisJCWNvbnRpbnVlOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIGJyZWFrOworCSAgfQorCWVsc2UKKwkgIGJyZWFrOworICAgIH0KKworICAgIC8qIEluIGEgZnJhbWVsZXNzIGZ1bmN0aW9uLCB3ZSBtaWdodCBoYXZlIGluY29ycmVjdGx5CisgICAgICAgc2tpcHBlZCBzb21lIGxvYWQgaW1tZWRpYXRlIGluc3RydWN0aW9ucy4gVW5kbyB0aGUgc2tpcHBpbmcKKyAgICAgICBpZiB0aGUgbG9hZCBpbW1lZGlhdGUgd2FzIG5vdCBmb2xsb3dlZCBieSBhIHN0YWNrIGFkanVzdG1lbnQuICAqLworICAgIGlmIChsb2FkX2ltbWVkaWF0ZV9ieXRlcyAmJiAhc2Vlbl9zcF9hZGp1c3QpCisgICAgICBwYyAtPSBsb2FkX2ltbWVkaWF0ZV9ieXRlczsKKyAgICByZXR1cm4gcGM7Cit9CisKKy8qIFNraXAgdGhlIFBDIHBhc3QgZnVuY3Rpb24gcHJvbG9ndWUgaW5zdHJ1Y3Rpb25zICgxNi1iaXQgdmVyc2lvbikuCisgICBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciBtaXBzX3NraXBfcHJvbG9ndWUuICAqLworCitzdGF0aWMgQ09SRV9BRERSCittaXBzMTZfc2tpcF9wcm9sb2d1ZSAocGMsIGxlbmllbnQpCisgICAgIENPUkVfQUREUiBwYzsJLyogc3RhcnRpbmcgUEMgdG8gc2VhcmNoIGZyb20gKi8KKyAgICAgaW50IGxlbmllbnQ7Cit7CisgICAgQ09SRV9BRERSIGVuZF9wYzsKKyAgICBpbnQgZXh0ZW5kX2J5dGVzID0gMDsKKyAgICBpbnQgcHJldl9leHRlbmRfYnl0ZXM7CisKKyAgICAvKiBUYWJsZSBvZiBpbnN0cnVjdGlvbnMgbGlrZWx5IHRvIGJlIGZvdW5kIGluIGEgZnVuY3Rpb24gcHJvbG9ndWUuICAqLworICAgIHN0YXRpYyBzdHJ1Y3QKKyAgICB7CisgICAgICB1bnNpZ25lZCBzaG9ydCBpbnN0OworICAgICAgdW5zaWduZWQgc2hvcnQgbWFzazsKKyAgICB9IHRhYmxlW10gPQorICAgIHsKKyAgICAgIHsgMHg2MzAwLCAweGZmMDAgfSwJLyogYWRkaXUgJHNwLG9mZnNldCAqLworICAgICAgeyAweGZiMDAsIDB4ZmYwMCB9LAkvKiBkYWRkaXUgJHNwLG9mZnNldCAqLworICAgICAgeyAweGQwMDAsIDB4ZjgwMCB9LAkvKiBzdyByZWcsbigkc3ApICovCisgICAgICB7IDB4ZjkwMCwgMHhmZjAwIH0sCS8qIHNkIHJlZyxuKCRzcCkgKi8KKyAgICAgIHsgMHg2MjAwLCAweGZmMDAgfSwJLyogc3cgJHJhLG4oJHNwKSAqLworICAgICAgeyAweGZhMDAsIDB4ZmYwMCB9LAkvKiBzZCAkcmEsbigkc3ApICovCisgICAgICB7IDB4NjczZCwgMHhmZmZmIH0sCS8qIG1vdmUgJHMxLHNwICovCisgICAgICB7IDB4ZDk4MCwgMHhmZjgwIH0sCS8qIHN3ICRhMC0kYTMsbigkczEpICovCisgICAgICB7IDB4NjcwNCwgMHhmZjFjIH0sCS8qIG1vdmUgcmVnLCRhMC0kYTMgKi8KKyAgICAgIHsgMHhlODA5LCAweGY4MWYgfSwJLyogZW50cnkgcHNldWRvLW9wICovCisgICAgICB7IDB4MDEwMCwgMHhmZjAwIH0sCS8qIGFkZGl1ICRzMSwkc3AsbiAqLworICAgICAgeyAwLCAwIH0JCQkvKiBlbmQgb2YgdGFibGUgbWFya2VyICovCisgICAgfTsKKworICAgIC8qIFNraXAgdGhlIHR5cGljYWwgcHJvbG9ndWUgaW5zdHJ1Y3Rpb25zLiBUaGVzZSBhcmUgdGhlIHN0YWNrIGFkanVzdG1lbnQKKyAgICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIGluc3RydWN0aW9ucyB0aGF0IHNhdmUgcmVnaXN0ZXJzIG9uIHRoZSBzdGFjaworICAgICAgIG9yIGluIHRoZSBnY2MgZnJhbWUuICAqLworICAgIGZvciAoZW5kX3BjID0gcGMgKyAxMDA7IHBjIDwgZW5kX3BjOyBwYyArPSBNSVBTMTZfSU5TVExFTikKKyAgICAgIHsKKwl1bnNpZ25lZCBzaG9ydCBpbnN0OworCWludCBpOworCisJaW5zdCA9IG1pcHNfZmV0Y2hfaW5zdHJ1Y3Rpb24gKHBjKTsKKworCS8qIE5vcm1hbGx5IHdlIGlnbm9yZSBhbiBleHRlbmQgaW5zdHJ1Y3Rpb24uICBIb3dldmVyLCBpZiBpdCBpcworCSAgIG5vdCBmb2xsb3dlZCBieSBhIHZhbGlkIHByb2xvZ3VlIGluc3RydWN0aW9uLCB3ZSBtdXN0IGFkanVzdAorCSAgIHRoZSBwYyBiYWNrIG92ZXIgdGhlIGV4dGVuZCBzbyB0aGF0IGl0IHdvbid0IGJlIGNvbnNpZGVyZWQKKwkgICBwYXJ0IG9mIHRoZSBwcm9sb2d1ZS4gICovCisJaWYgKChpbnN0ICYgMHhmODAwKSA9PSAweGYwMDApCQkvKiBleHRlbmQgKi8KKwkgIHsKKwkgICAgZXh0ZW5kX2J5dGVzID0gTUlQUzE2X0lOU1RMRU47CisJICAgIGNvbnRpbnVlOworCSAgfQorCXByZXZfZXh0ZW5kX2J5dGVzID0gZXh0ZW5kX2J5dGVzOworCWV4dGVuZF9ieXRlcyA9IDA7CisKKwkvKiBDaGVjayBmb3Igb3RoZXIgdmFsaWQgcHJvbG9ndWUgaW5zdHJ1Y3Rpb25zIGJlc2lkZXMgZXh0ZW5kLiAgKi8KKwlmb3IgKGkgPSAwOyB0YWJsZVtpXS5tYXNrICE9IDA7IGkrKykKKwkgIGlmICgoaW5zdCAmIHRhYmxlW2ldLm1hc2spID09IHRhYmxlW2ldLmluc3QpCS8qIGZvdW5kLCBnZXQgb3V0ICovCisJICAgIGJyZWFrOworCWlmICh0YWJsZVtpXS5tYXNrICE9IDApCQkJLyogaXQgd2FzIGluIHRhYmxlPyAqLworCSAgY29udGludWU7CQkJCS8qIGlnbm9yZSBpdCAqLworCWVsc2UJCQkJCS8qIG5vbi1wcm9sb2d1ZSAqLworCSAgeworCSAgICAvKiBSZXR1cm4gdGhlIGN1cnJlbnQgcGMsIGFkanVzdGVkIGJhY2t3YXJkcyBieSAyIGlmCisJICAgICAgIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgYW4gZXh0ZW5kLiAgKi8KKwkgICAgcmV0dXJuIHBjIC0gcHJldl9leHRlbmRfYnl0ZXM7CisJICB9CisgICAgfQorICByZXR1cm4gcGM7Cit9CisKKy8qIFRvIHNraXAgcHJvbG9ndWVzLCBJIHVzZSB0aGlzIHByZWRpY2F0ZS4gIFJldHVybnMgZWl0aGVyIFBDIGl0c2VsZgorICAgaWYgdGhlIGNvZGUgYXQgUEMgZG9lcyBub3QgbG9vayBsaWtlIGEgZnVuY3Rpb24gcHJvbG9ndWU7IG90aGVyd2lzZQorICAgcmV0dXJucyBhbiBhZGRyZXNzIHRoYXQgKGlmIHdlJ3JlIGx1Y2t5KSBmb2xsb3dzIHRoZSBwcm9sb2d1ZS4gIElmCisgICBMRU5JRU5ULCB0aGVuIHdlIG11c3Qgc2tpcCBldmVyeXRoaW5nIHdoaWNoIGlzIGludm9sdmVkIGluIHNldHRpbmcKKyAgIHVwIHRoZSBmcmFtZSAoaXQncyBPSyB0byBza2lwIG1vcmUsIGp1c3Qgc28gbG9uZyBhcyB3ZSBkb24ndCBza2lwCisgICBhbnl0aGluZyB3aGljaCBtaWdodCBjbG9iYmVyIHRoZSByZWdpc3RlcnMgd2hpY2ggYXJlIGJlaW5nIHNhdmVkLgorICAgV2UgbXVzdCBza2lwIG1vcmUgaW4gdGhlIGNhc2Ugd2hlcmUgcGFydCBvZiB0aGUgcHJvbG9ndWUgaXMgaW4gdGhlCisgICBkZWxheSBzbG90IG9mIGEgbm9uLXByb2xvZ3VlIGluc3RydWN0aW9uKS4gICovCisKK0NPUkVfQUREUgorbWlwc19za2lwX3Byb2xvZ3VlIChwYywgbGVuaWVudCkKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBpbnQgbGVuaWVudDsKK3sKKyAgLyogU2VlIGlmIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGVuZCBvZiB0aGUgcHJvbG9ndWUgdmlhIHRoZSBzeW1ib2wgdGFibGUuCisgICAgIElmIHNvLCB0aGVuIHJldHVybiBlaXRoZXIgUEMsIG9yIHRoZSBQQyBhZnRlciB0aGUgcHJvbG9ndWUsIHdoaWNoZXZlcgorICAgICBpcyBncmVhdGVyLiAgKi8KKworICBDT1JFX0FERFIgcG9zdF9wcm9sb2d1ZV9wYyA9IGFmdGVyX3Byb2xvZ3VlIChwYywgTlVMTCk7CisKKyAgaWYgKHBvc3RfcHJvbG9ndWVfcGMgIT0gMCkKKyAgICByZXR1cm4gbWF4IChwYywgcG9zdF9wcm9sb2d1ZV9wYyk7CisKKyAgLyogQ2FuJ3QgZGV0ZXJtaW5lIHByb2xvZ3VlIGZyb20gdGhlIHN5bWJvbCB0YWJsZSwgbmVlZCB0byBleGFtaW5lCisgICAgIGluc3RydWN0aW9ucy4gICovCisKKyAgaWYgKHBjX2lzX21pcHMxNiAocGMpKQorICAgIHJldHVybiBtaXBzMTZfc2tpcF9wcm9sb2d1ZSAocGMsIGxlbmllbnQpOworICBlbHNlCisgICAgcmV0dXJuIG1pcHMzMl9za2lwX3Byb2xvZ3VlIChwYywgbGVuaWVudCk7Cit9CisKKyNpZiAwCisvKiBUaGUgbGVuaWVudCBwcm9sb2d1ZSBzdHVmZiBzaG91bGQgYmUgc3VwZXJzZWRlZCBieSB0aGUgY29kZSBpbgorICAgaW5pdF9leHRyYV9mcmFtZV9pbmZvIHdoaWNoIGxvb2tzIHRvIHNlZSB3aGV0aGVyIHRoZSBzdG9yZXMgbWVudGlvbmVkCisgICBpbiB0aGUgcHJvY19kZXNjIGhhdmUgYWN0dWFsbHkgdGFrZW4gcGxhY2UuICAqLworCisvKiBJcyBhZGRyZXNzIFBDIGluIHRoZSBwcm9sb2d1ZSAobG9vc2VseSBkZWZpbmVkKSBmb3IgZnVuY3Rpb24gYXQKKyAgIFNUQVJUQUREUj8gICovCisKK3N0YXRpYyBpbnQKK21pcHNfaW5fbGVuaWVudF9wcm9sb2d1ZSAoc3RhcnRhZGRyLCBwYykKKyAgICAgQ09SRV9BRERSIHN0YXJ0YWRkcjsKKyAgICAgQ09SRV9BRERSIHBjOworeworICBDT1JFX0FERFIgZW5kX3Byb2xvZ3VlID0gbWlwc19za2lwX3Byb2xvZ3VlIChzdGFydGFkZHIsIDEpOworICByZXR1cm4gcGMgPj0gc3RhcnRhZGRyICYmIHBjIDwgZW5kX3Byb2xvZ3VlOworfQorI2VuZGlmCisKKy8qIEdpdmVuIGEgcmV0dXJuIHZhbHVlIGluIGByZWdidWYnIHdpdGggYSB0eXBlIGB2YWx0eXBlJywgCisgICBleHRyYWN0IGFuZCBjb3B5IGl0cyB2YWx1ZSBpbnRvIGB2YWxidWYnLiAgKi8KK3ZvaWQKK21pcHNfZXh0cmFjdF9yZXR1cm5fdmFsdWUgKHZhbHR5cGUsIHJlZ2J1ZiwgdmFsYnVmKQorICAgIHN0cnVjdCB0eXBlICp2YWx0eXBlOworICAgIGNoYXIgcmVnYnVmW1JFR0lTVEVSX0JZVEVTXTsKKyAgICBjaGFyICp2YWxidWY7Cit7CisgIGludCByZWdudW07CisgIGludCBvZmZzZXQgPSAwOworICBpbnQgbGVuID0gVFlQRV9MRU5HVEggKHZhbHR5cGUpOworICAKKyAgcmVnbnVtID0gMjsKKyAgaWYgKFRZUEVfQ09ERSAodmFsdHlwZSkgPT0gVFlQRV9DT0RFX0ZMVAorICAgICAgJiYgKE1JUFNfRlBVX1RZUEUgPT0gTUlQU19GUFVfRE9VQkxFCisJICB8fCAoTUlQU19GUFVfVFlQRSA9PSBNSVBTX0ZQVV9TSU5HTEUKKwkgICAgICAmJiBsZW4gPD0gTUlQU19GUFVfU0lOR0xFX1JFR1NJWkUpKSkKKyAgICByZWdudW0gPSBGUDBfUkVHTlVNOworCisgIGlmIChUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQorICAgIHsgLyogInVuLWxlZnQtanVzdGlmeSIgdGhlIHZhbHVlIGZyb20gdGhlIHJlZ2lzdGVyICovCisgICAgICBpZiAobGVuIDwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSkpCisJb2Zmc2V0ID0gUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSkgLSBsZW47CisgICAgICBpZiAobGVuID4gUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSkgICAgICYmCS8qIG9kZC1zaXplIHN0cnVjdHMgKi8KKwkgIGxlbiA8IFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pICogMiAmJgorCSAgKFRZUEVfQ09ERSAodmFsdHlwZSkgPT0gVFlQRV9DT0RFX1NUUlVDVCB8fAorCSAgIFRZUEVfQ09ERSAodmFsdHlwZSkgPT0gVFlQRV9DT0RFX1VOSU9OKSkKKwlvZmZzZXQgPSAyICogUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSkgLSBsZW47CisgICAgfQorICBtZW1jcHkgKHZhbGJ1ZiwgcmVnYnVmICsgUkVHSVNURVJfQllURSAocmVnbnVtKSArIG9mZnNldCwgbGVuKTsKKyAgUkVHSVNURVJfQ09OVkVSVF9UT19UWVBFIChyZWdudW0sIHZhbHR5cGUsIHZhbGJ1Zik7Cit9CisKKy8qIEdpdmVuIGEgcmV0dXJuIHZhbHVlIGluIGByZWdidWYnIHdpdGggYSB0eXBlIGB2YWx0eXBlJywgCisgICB3cml0ZSBpdCdzIHZhbHVlIGludG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyLiAgKi8KK3ZvaWQKK21pcHNfc3RvcmVfcmV0dXJuX3ZhbHVlICh2YWx0eXBlLCB2YWxidWYpCisgICAgc3RydWN0IHR5cGUgKnZhbHR5cGU7CisgICAgY2hhciAqdmFsYnVmOworeworICBpbnQgcmVnbnVtOworICBpbnQgb2Zmc2V0ID0gMDsKKyAgaW50IGxlbiA9IFRZUEVfTEVOR1RIICh2YWx0eXBlKTsKKyAgY2hhciByYXdfYnVmZmVyW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisgIAorICByZWdudW0gPSAyOworICBpZiAoVFlQRV9DT0RFICh2YWx0eXBlKSA9PSBUWVBFX0NPREVfRkxUCisgICAgICAmJiAoTUlQU19GUFVfVFlQRSA9PSBNSVBTX0ZQVV9ET1VCTEUKKwkgIHx8IChNSVBTX0ZQVV9UWVBFID09IE1JUFNfRlBVX1NJTkdMRQorCSAgICAgICYmIGxlbiA8PSBNSVBTX1JFR1NJWkUpKSkKKyAgICByZWdudW0gPSBGUDBfUkVHTlVNOworCisgIGlmIChUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQorICAgIHsgLyogImxlZnQtanVzdGlmeSIgdGhlIHZhbHVlIGluIHRoZSByZWdpc3RlciAqLworICAgICAgaWYgKGxlbiA8IFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pKQorCW9mZnNldCA9IFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pIC0gbGVuOworICAgICAgaWYgKGxlbiA+IFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pICAgICAmJgkvKiBvZGQtc2l6ZSBzdHJ1Y3RzICovCisJICBsZW4gPCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbnVtKSAqIDIgJiYKKwkgIChUWVBFX0NPREUgKHZhbHR5cGUpID09IFRZUEVfQ09ERV9TVFJVQ1QgfHwKKwkgICBUWVBFX0NPREUgKHZhbHR5cGUpID09IFRZUEVfQ09ERV9VTklPTikpCisJb2Zmc2V0ID0gMiAqIFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pIC0gbGVuOworICAgIH0KKyAgbWVtY3B5KHJhd19idWZmZXIgKyBvZmZzZXQsIHZhbGJ1ZiwgbGVuKTsKKyAgUkVHSVNURVJfQ09OVkVSVF9GUk9NX1RZUEUocmVnbnVtLCB2YWx0eXBlLCByYXdfYnVmZmVyKTsKKyAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMoUkVHSVNURVJfQllURSAocmVnbnVtKSwgcmF3X2J1ZmZlciwgCisJCSAgICAgICBsZW4gPiBSRUdJU1RFUl9SQVdfU0laRSAocmVnbnVtKSA/IAorCQkgICAgICAgbGVuIDogUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSkpOworfQorCisvKiBFeHBvcnRlZCBwcm9jZWR1cmU6IElzIFBDIGluIHRoZSBzaWduYWwgdHJhbXBvbGluZSBjb2RlICovCisKK2ludAoraW5fc2lndHJhbXAgKHBjLCBpZ25vcmUpCisgICAgIENPUkVfQUREUiBwYzsKKyAgICAgY2hhciAqaWdub3JlOwkJLyogZnVuY3Rpb24gbmFtZSAqLworeworICBpZiAoc2lndHJhbXBfYWRkcmVzcyA9PSAwKQorICAgIGZpeHVwX3NpZ3RyYW1wICgpOworICByZXR1cm4gKHBjID49IHNpZ3RyYW1wX2FkZHJlc3MgJiYgcGMgPCBzaWd0cmFtcF9lbmQpOworfQorCisvKiBDb21tYW5kcyB0byBzaG93L3NldCB0aGUgTUlQUyBGUFUgdHlwZS4gICovCisKK3N0YXRpYyB2b2lkIHNob3dfbWlwc2ZwdV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZAorc2hvd19taXBzZnB1X2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoYXIgKm1zZzsKKyAgY2hhciAqZnB1OworICBzd2l0Y2ggKE1JUFNfRlBVX1RZUEUpCisgICAgeworICAgIGNhc2UgTUlQU19GUFVfU0lOR0xFOgorICAgICAgZnB1ID0gInNpbmdsZS1wcmVjaXNpb24iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNSVBTX0ZQVV9ET1VCTEU6CisgICAgICBmcHUgPSAiZG91YmxlLXByZWNpc2lvbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1JUFNfRlBVX05PTkU6CisgICAgICBmcHUgPSAiYWJzZW50IChub25lKSI7CisgICAgICBicmVhazsKKyAgICB9CisgIGlmIChtaXBzX2ZwdV90eXBlX2F1dG8pCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJUaGUgTUlQUyBmbG9hdGluZy1wb2ludCBjb3Byb2Nlc3NvciBpcyBzZXQgYXV0b21hdGljYWxseSAoY3VycmVudGx5ICVzKVxuIiwKKwkJICAgICAgIGZwdSk7CisgIGVsc2UKKyAgICBwcmludGZfdW5maWx0ZXJlZCAoIlRoZSBNSVBTIGZsb2F0aW5nLXBvaW50IGNvcHJvY2Vzc29yIGlzIGFzc3VtZWQgdG8gYmUgJXNcbiIsCisJCSAgICAgICBmcHUpOworfQorCisKK3N0YXRpYyB2b2lkIHNldF9taXBzZnB1X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkCitzZXRfbWlwc2ZwdV9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBwcmludGZfdW5maWx0ZXJlZCAoIlwic2V0IG1pcHNmcHVcIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IFwiZG91YmxlXCIsIFwic2luZ2xlXCIsXCJub25lXCIgb3IgXCJhdXRvXCIuXG4iKTsKKyAgc2hvd19taXBzZnB1X2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KTsKK30KKworc3RhdGljIHZvaWQgc2V0X21pcHNmcHVfc2luZ2xlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkCitzZXRfbWlwc2ZwdV9zaW5nbGVfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgbWlwc19mcHVfdHlwZSA9IE1JUFNfRlBVX1NJTkdMRTsKKyAgbWlwc19mcHVfdHlwZV9hdXRvID0gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X21pcHNmcHVfZG91YmxlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkCitzZXRfbWlwc2ZwdV9kb3VibGVfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgbWlwc19mcHVfdHlwZSA9IE1JUFNfRlBVX0RPVUJMRTsKKyAgbWlwc19mcHVfdHlwZV9hdXRvID0gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X21pcHNmcHVfbm9uZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZAorc2V0X21pcHNmcHVfbm9uZV9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBtaXBzX2ZwdV90eXBlID0gTUlQU19GUFVfTk9ORTsKKyAgbWlwc19mcHVfdHlwZV9hdXRvID0gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X21pcHNmcHVfYXV0b19jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZAorc2V0X21pcHNmcHVfYXV0b19jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBtaXBzX2ZwdV90eXBlX2F1dG8gPSAxOworfQorCisvKiBDb21tYW5kIHRvIHNldCB0aGUgcHJvY2Vzc29yIHR5cGUuICAqLworCit2b2lkCittaXBzX3NldF9wcm9jZXNzb3JfdHlwZV9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpbnQgaTsKKworICBpZiAodG1wX21pcHNfcHJvY2Vzc29yX3R5cGUgPT0gTlVMTCB8fCAqdG1wX21pcHNfcHJvY2Vzc29yX3R5cGUgPT0gJ1wwJykKKyAgICB7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIlRoZSBrbm93biBNSVBTIHByb2Nlc3NvciB0eXBlcyBhcmUgYXMgZm9sbG93czpcblxuIik7CisgICAgICBmb3IgKGkgPSAwOyBtaXBzX3Byb2Nlc3Nvcl90eXBlX3RhYmxlW2ldLm5hbWUgIT0gTlVMTDsgKytpKQorCXByaW50Zl91bmZpbHRlcmVkICgiJXNcbiIsIG1pcHNfcHJvY2Vzc29yX3R5cGVfdGFibGVbaV0ubmFtZSk7CisKKyAgICAgIC8qIFJlc3RvcmUgdGhlIHZhbHVlLiAgKi8KKyAgICAgIHRtcF9taXBzX3Byb2Nlc3Nvcl90eXBlID0gc3Ryc2F2ZSAobWlwc19wcm9jZXNzb3JfdHlwZSk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisgIAorICBpZiAoIW1pcHNfc2V0X3Byb2Nlc3Nvcl90eXBlICh0bXBfbWlwc19wcm9jZXNzb3JfdHlwZSkpCisgICAgeworICAgICAgZXJyb3IgKCJVbmtub3duIHByb2Nlc3NvciB0eXBlIGAlcycuIiwgdG1wX21pcHNfcHJvY2Vzc29yX3R5cGUpOworICAgICAgLyogUmVzdG9yZSBpdHMgdmFsdWUuICAqLworICAgICAgdG1wX21pcHNfcHJvY2Vzc29yX3R5cGUgPSBzdHJzYXZlIChtaXBzX3Byb2Nlc3Nvcl90eXBlKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCittaXBzX3Nob3dfcHJvY2Vzc29yX3R5cGVfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKK30KKworLyogTW9kaWZ5IHRoZSBhY3R1YWwgcHJvY2Vzc29yIHR5cGUuICovCisKK2ludAorbWlwc19zZXRfcHJvY2Vzc29yX3R5cGUgKHN0cikKKyAgICAgY2hhciAqc3RyOworeworICBpbnQgaSwgajsKKworICBpZiAoc3RyID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgZm9yIChpID0gMDsgbWlwc19wcm9jZXNzb3JfdHlwZV90YWJsZVtpXS5uYW1lICE9IE5VTEw7ICsraSkKKyAgICB7CisgICAgICBpZiAoc3RyY2FzZWNtcCAoc3RyLCBtaXBzX3Byb2Nlc3Nvcl90eXBlX3RhYmxlW2ldLm5hbWUpID09IDApCisJeworCSAgbWlwc19wcm9jZXNzb3JfdHlwZSA9IHN0cjsKKworCSAgZm9yIChqID0gMDsgaiA8IE5VTV9SRUdTOyArK2opCisJICAgIC8qIEZJWE1FIC0gTUlQUyBzaG91bGQgYmUgZGVmaW5pbmcgUkVHSVNURVJfTkFNRSgpIGluc3RlYWQgKi8KKwkgICAgZ2RiX3JlZ2lzdGVyX25hbWVzW2pdID0gbWlwc19wcm9jZXNzb3JfdHlwZV90YWJsZVtpXS5yZWduYW1lc1tqXTsKKworCSAgcmV0dXJuIDE7CisKKwkgIC8qIEZJWE1FIHR3ZWFrIGZwdSBmbGFnIHRvbyAqLworCX0KKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEF0dGVtcHQgdG8gaWRlbnRpZnkgdGhlIHBhcnRpY3VsYXIgcHJvY2Vzc29yIG1vZGVsIGJ5IHJlYWRpbmcgdGhlCisgICBwcm9jZXNzb3IgaWQuICAqLworCitjaGFyICoKK21pcHNfcmVhZF9wcm9jZXNzb3JfdHlwZSAoKQoreworICBDT1JFX0FERFIgcHJpZDsKKworICBwcmlkID0gcmVhZF9yZWdpc3RlciAoUFJJRF9SRUdOVU0pOworCisgIGlmICgocHJpZCAmIH4weGYpID09IDB4NzAwKQorICAgIHJldHVybiBzYXZlc3RyaW5nICgicjMwNDEiLCBzdHJsZW4oInIzMDQxIikpOworCisgIHJldHVybiBOVUxMOworfQorCisvKiBKdXN0IGxpa2UgcmVpbml0X2ZyYW1lX2NhY2hlLCBidXQgd2l0aCB0aGUgcmlnaHQgYXJndW1lbnRzIHRvIGJlCisgICBjYWxsYWJsZSBhcyBhbiBzZnVuYy4gICovCisKK3N0YXRpYyB2b2lkCityZWluaXRfZnJhbWVfY2FjaGVfc2Z1bmMgKGFyZ3MsIGZyb21fdHR5LCBjKQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7CisgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjOworeworICByZWluaXRfZnJhbWVfY2FjaGUgKCk7Cit9CisKK2ludAorZ2RiX3ByaW50X2luc25fbWlwcyAobWVtYWRkciwgaW5mbykKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICBtaXBzX2V4dHJhX2Z1bmNfaW5mb190IHByb2NfZGVzYzsKKworICAvKiBTZWFyY2ggZm9yIHRoZSBmdW5jdGlvbiBjb250YWluaW5nIHRoaXMgYWRkcmVzcy4gIFNldCB0aGUgbG93IGJpdAorICAgICBvZiB0aGUgYWRkcmVzcyB3aGVuIHNlYXJjaGluZywgaW4gY2FzZSB3ZSB3ZXJlIGdpdmVuIGFuIGV2ZW4gYWRkcmVzcworICAgICB0aGF0IGlzIHRoZSBzdGFydCBvZiBhIDE2LWJpdCBmdW5jdGlvbi4gIElmIHdlIGRpZG4ndCBkbyB0aGlzLAorICAgICB0aGUgc2VhcmNoIHdvdWxkIGZhaWwgYmVjYXVzZSB0aGUgc3ltYm9sIHRhYmxlIHNheXMgdGhlIGZ1bmN0aW9uCisgICAgIHN0YXJ0cyBhdCBhbiBvZGQgYWRkcmVzcywgaS5lLiAxIGJ5dGUgcGFzdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gICovCisgIG1lbWFkZHIgPSBBRERSX0JJVFNfUkVNT1ZFIChtZW1hZGRyKTsKKyAgcHJvY19kZXNjID0gbm9uX2hldXJpc3RpY19wcm9jX2Rlc2MgKE1BS0VfTUlQUzE2X0FERFIgKG1lbWFkZHIpLCBOVUxMKTsKKworICAvKiBNYWtlIGFuIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSAxNi1iaXQgZnVuY3Rpb24uICBJZgorICAgICB0aGUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgZXhpc3RzIGFuZCB0aGUgYWRkcmVzcyB0aGVyZWluIGlzIG9kZCwKKyAgICAgaXQncyBkZWZpbml0ZWx5IGEgMTYtYml0IGZ1bmN0aW9uLiAgT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIGp1c3QKKyAgICAgZ3Vlc3MgdGhhdCBpZiB0aGUgYWRkcmVzcyBwYXNzZWQgaW4gaXMgb2RkLCBpdCdzIDE2LWJpdHMuICAqLworICBpZiAocHJvY19kZXNjKQorICAgIGluZm8tPm1hY2ggPSBwY19pc19taXBzMTYgKFBST0NfTE9XX0FERFIgKHByb2NfZGVzYykpID8gMTYgOiBUTV9QUklOVF9JTlNOX01BQ0g7CisgIGVsc2UKKyAgICBpbmZvLT5tYWNoID0gcGNfaXNfbWlwczE2IChtZW1hZGRyKSA/IDE2IDogVE1fUFJJTlRfSU5TTl9NQUNIOworCisgIC8qIFJvdW5kIGRvd24gdGhlIGluc3RydWN0aW9uIGFkZHJlc3MgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KKyAgbWVtYWRkciAmPSAoaW5mby0+bWFjaCA9PSAxNiA/IH4xIDogfjMpOworICAgICAgCisgIC8qIENhbGwgdGhlIGFwcHJvcHJpYXRlIGRpc2Fzc2VtYmxlciBiYXNlZCBvbiB0aGUgdGFyZ2V0IGVuZGlhbi1uZXNzLiAgKi8KKyAgaWYgKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pCisgICAgcmV0dXJuIHByaW50X2luc25fYmlnX21pcHMgKG1lbWFkZHIsIGluZm8pOworICBlbHNlCisgICAgcmV0dXJuIHByaW50X2luc25fbGl0dGxlX21pcHMgKG1lbWFkZHIsIGluZm8pOworfQorCisvKiBPbGQtc3R5bGUgYnJlYWtwb2ludCBtYWNyb3MuCisgICBUaGUgSURUIGJvYXJkIHVzZXMgYW4gdW51c3VhbCBicmVha3BvaW50IHZhbHVlLCBhbmQgc29tZXRpbWVzIGdldHMKKyAgIGNvbmZ1c2VkIHdoZW4gaXQgc2VlcyB0aGUgdXN1YWwgTUlQUyBicmVha3BvaW50IGluc3RydWN0aW9uLiAgKi8KKworI2RlZmluZSBCSUdfQlJFQUtQT0lOVCB7MCwgMHg1LCAwLCAweGR9CisjZGVmaW5lIExJVFRMRV9CUkVBS1BPSU5UIHsweGQsIDAsIDB4NSwgMH0KKyNkZWZpbmUgUE1PTl9CSUdfQlJFQUtQT0lOVCB7MCwgMCwgMCwgMHhkfQorI2RlZmluZSBQTU9OX0xJVFRMRV9CUkVBS1BPSU5UIHsweGQsIDAsIDAsIDB9CisjZGVmaW5lIElEVF9CSUdfQlJFQUtQT0lOVCB7MCwgMCwgMHgwYSwgMHhkfQorI2RlZmluZSBJRFRfTElUVExFX0JSRUFLUE9JTlQgezB4ZCwgMHgwYSwgMCwgMH0KKyNkZWZpbmUgTUlQUzE2X0JJR19CUkVBS1BPSU5UIHsweGU4LCAweGE1fQorI2RlZmluZSBNSVBTMTZfTElUVExFX0JSRUFLUE9JTlQgezB4YTUsIDB4ZTh9CisKKy8qIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgQlJFQUtQT0lOVF9GUk9NX1BDIG1hY3JvLiAgSXQgdXNlcyB0aGUgcHJvZ3JhbQorICAgY291bnRlciB2YWx1ZSB0byBkZXRlcm1pbmUgd2hldGhlciBhIDE2LSBvciAzMi1iaXQgYnJlYWtwb2ludCBzaG91bGQgYmUKKyAgIHVzZWQuICBJdCByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZyBvZiBieXRlcyB0aGF0IGVuY29kZSBhIGJyZWFrcG9pbnQKKyAgIGluc3RydWN0aW9uLCBzdG9yZXMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRvICpsZW5wdHIsIGFuZCBhZGp1c3RzIHBjCisgICAoaWYgbmVjZXNzYXJ5KSB0byBwb2ludCB0byB0aGUgYWN0dWFsIG1lbW9yeSBsb2NhdGlvbiB3aGVyZSB0aGUKKyAgIGJyZWFrcG9pbnQgc2hvdWxkIGJlIGluc2VydGVkLiAgKi8KKwordW5zaWduZWQgY2hhciAqbWlwc19icmVha3BvaW50X2Zyb21fcGMgKHBjcHRyLCBsZW5wdHIpCisgICAgIENPUkVfQUREUiAqcGNwdHI7CisgICAgIGludCAqbGVucHRyOworeworICBpZiAoVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKKyAgICB7CisgICAgICBpZiAocGNfaXNfbWlwczE2ICgqcGNwdHIpKQorCXsKKwkgIHN0YXRpYyBjaGFyIG1pcHMxNl9iaWdfYnJlYWtwb2ludFtdID0gTUlQUzE2X0JJR19CUkVBS1BPSU5UOworCSAgKnBjcHRyID0gVU5NQUtFX01JUFMxNl9BRERSICgqcGNwdHIpOworCSAgKmxlbnB0ciA9IHNpemVvZihtaXBzMTZfYmlnX2JyZWFrcG9pbnQpOworCSAgcmV0dXJuIG1pcHMxNl9iaWdfYnJlYWtwb2ludDsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3RhdGljIGNoYXIgYmlnX2JyZWFrcG9pbnRbXSA9IEJJR19CUkVBS1BPSU5UOworCSAgc3RhdGljIGNoYXIgcG1vbl9iaWdfYnJlYWtwb2ludFtdID0gUE1PTl9CSUdfQlJFQUtQT0lOVDsKKwkgIHN0YXRpYyBjaGFyIGlkdF9iaWdfYnJlYWtwb2ludFtdID0gSURUX0JJR19CUkVBS1BPSU5UOworCisJICAqbGVucHRyID0gc2l6ZW9mKGJpZ19icmVha3BvaW50KTsKKworCSAgaWYgKHN0cmNtcCAodGFyZ2V0X3Nob3J0bmFtZSwgIm1pcHMiKSA9PSAwKQorCSAgICByZXR1cm4gaWR0X2JpZ19icmVha3BvaW50OworCSAgZWxzZSBpZiAoc3RyY21wICh0YXJnZXRfc2hvcnRuYW1lLCAiZGRiIikgPT0gMAorCQkgICB8fCBzdHJjbXAgKHRhcmdldF9zaG9ydG5hbWUsICJwbW9uIikgPT0gMAorCQkgICB8fCBzdHJjbXAgKHRhcmdldF9zaG9ydG5hbWUsICJsc2kiKSA9PSAwKQorCSAgICByZXR1cm4gcG1vbl9iaWdfYnJlYWtwb2ludDsKKwkgIGVsc2UKKwkgICAgcmV0dXJuIGJpZ19icmVha3BvaW50OworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAocGNfaXNfbWlwczE2ICgqcGNwdHIpKQorCXsKKwkgIHN0YXRpYyBjaGFyIG1pcHMxNl9saXR0bGVfYnJlYWtwb2ludFtdID0gTUlQUzE2X0xJVFRMRV9CUkVBS1BPSU5UOworCSAgKnBjcHRyID0gVU5NQUtFX01JUFMxNl9BRERSICgqcGNwdHIpOworCSAgKmxlbnB0ciA9IHNpemVvZihtaXBzMTZfbGl0dGxlX2JyZWFrcG9pbnQpOworCSAgcmV0dXJuIG1pcHMxNl9saXR0bGVfYnJlYWtwb2ludDsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3RhdGljIGNoYXIgbGl0dGxlX2JyZWFrcG9pbnRbXSA9IExJVFRMRV9CUkVBS1BPSU5UOworCSAgc3RhdGljIGNoYXIgcG1vbl9saXR0bGVfYnJlYWtwb2ludFtdID0gUE1PTl9MSVRUTEVfQlJFQUtQT0lOVDsKKwkgIHN0YXRpYyBjaGFyIGlkdF9saXR0bGVfYnJlYWtwb2ludFtdID0gSURUX0xJVFRMRV9CUkVBS1BPSU5UOworCisJICAqbGVucHRyID0gc2l6ZW9mKGxpdHRsZV9icmVha3BvaW50KTsKKworCSAgaWYgKHN0cmNtcCAodGFyZ2V0X3Nob3J0bmFtZSwgIm1pcHMiKSA9PSAwKQorCSAgICByZXR1cm4gaWR0X2xpdHRsZV9icmVha3BvaW50OworCSAgZWxzZSBpZiAoc3RyY21wICh0YXJnZXRfc2hvcnRuYW1lLCAiZGRiIikgPT0gMAorCQkgICB8fCBzdHJjbXAgKHRhcmdldF9zaG9ydG5hbWUsICJwbW9uIikgPT0gMAorCQkgICB8fCBzdHJjbXAgKHRhcmdldF9zaG9ydG5hbWUsICJsc2kiKSA9PSAwKQorCSAgICByZXR1cm4gcG1vbl9saXR0bGVfYnJlYWtwb2ludDsKKwkgIGVsc2UKKwkgICAgcmV0dXJuIGxpdHRsZV9icmVha3BvaW50OworCX0KKyAgICB9Cit9CisKKy8qIElmIFBDIGlzIGluIGEgbWlwczE2IGNhbGwgb3IgcmV0dXJuIHN0dWIsIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0CisgICBQQywgd2hpY2ggaXMgZWl0aGVyIHRoZSBjYWxsZWUgb3IgdGhlIGNhbGxlci4gIFRoZXJlIGFyZSBzZXZlcmFsCisgICBjYXNlcyB3aGljaCBtdXN0IGJlIGhhbmRsZWQ6CisKKyAgICogSWYgdGhlIFBDIGlzIGluIF9fbWlwczE2X3JldF97ZCxzfWYsIHRoaXMgaXMgYSByZXR1cm4gc3R1YiBhbmQgdGhlCisgICAgIHRhcmdldCBQQyBpcyBpbiAkMzEgKCRyYSkuCisgICAqIElmIHRoZSBQQyBpcyBpbiBfX21pcHMxNl9jYWxsX3N0dWJfezEuLjEwfSwgdGhpcyBpcyBhIGNhbGwgc3R1YgorICAgICBhbmQgdGhlIHRhcmdldCBQQyBpcyBpbiAkMi4KKyAgICogSWYgdGhlIFBDIGF0IHRoZSBzdGFydCBvZiBfX21pcHMxNl9jYWxsX3N0dWJfe3MsZH1mX3swLi4xMH0sIGkuZS4KKyAgICAgYmVmb3JlIHRoZSBqYWwgaW5zdHJ1Y3Rpb24sIHRoaXMgaXMgZWZmZWN0aXZlbHkgYSBjYWxsIHN0dWIKKyAgICAgYW5kIHRoZSB0aGUgdGFyZ2V0IFBDIGlzIGluICQyLiAgT3RoZXJ3aXNlIHRoaXMgaXMgZWZmZWN0aXZlbHkKKyAgICAgYSByZXR1cm4gc3R1YiBhbmQgdGhlIHRhcmdldCBQQyBpcyBpbiAkMTguCisKKyAgIFNlZSB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBzdHVicyBpbiBnY2MvY29uZmlnL21pcHMvbWlwczE2LlMgZm9yCisgICBnb3J5IGRldGFpbHMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgU0tJUF9UUkFNUE9MSU5FX0NPREUgbWFjcm8uCisqLworCitDT1JFX0FERFIKK21pcHNfc2tpcF9zdHViIChwYykKKyAgICAgQ09SRV9BRERSIHBjOworeworICBjaGFyICpuYW1lOworICBDT1JFX0FERFIgc3RhcnRfYWRkcjsKKworICAvKiBGaW5kIHRoZSBzdGFydGluZyBhZGRyZXNzIGFuZCBuYW1lIG9mIHRoZSBmdW5jdGlvbiBjb250YWluaW5nIHRoZSBQQy4gICovCisgIGlmIChmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gKHBjLCAmbmFtZSwgJnN0YXJ0X2FkZHIsIE5VTEwpID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgLyogSWYgdGhlIFBDIGlzIGluIF9fbWlwczE2X3JldF97ZCxzfWYsIHRoaXMgaXMgYSByZXR1cm4gc3R1YiBhbmQgdGhlCisgICAgIHRhcmdldCBQQyBpcyBpbiAkMzEgKCRyYSkuICAqLworICBpZiAoc3RyY21wIChuYW1lLCAiX19taXBzMTZfcmV0X3NmIikgPT0gMAorICAgICAgfHwgc3RyY21wIChuYW1lLCAiX19taXBzMTZfcmV0X2RmIikgPT0gMCkKKyAgICByZXR1cm4gcmVhZF9yZWdpc3RlciAoUkFfUkVHTlVNKTsKKworICBpZiAoc3RybmNtcCAobmFtZSwgIl9fbWlwczE2X2NhbGxfc3R1Yl8iLCAxOSkgPT0gMCkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgUEMgaXMgaW4gX19taXBzMTZfY2FsbF9zdHViX3sxLi4xMH0sIHRoaXMgaXMgYSBjYWxsIHN0dWIKKyAgICAgICAgIGFuZCB0aGUgdGFyZ2V0IFBDIGlzIGluICQyLiAgKi8KKyAgICAgIGlmIChuYW1lWzE5XSA+PSAnMCcgJiYgbmFtZVsxOV0gPD0gJzknKQorCXJldHVybiByZWFkX3JlZ2lzdGVyICgyKTsKKworICAgICAgLyogSWYgdGhlIFBDIGF0IHRoZSBzdGFydCBvZiBfX21pcHMxNl9jYWxsX3N0dWJfe3MsZH1mX3swLi4xMH0sIGkuZS4KKwkgYmVmb3JlIHRoZSBqYWwgaW5zdHJ1Y3Rpb24sIHRoaXMgaXMgZWZmZWN0aXZlbHkgYSBjYWxsIHN0dWIKKwkgYW5kIHRoZSB0aGUgdGFyZ2V0IFBDIGlzIGluICQyLiAgT3RoZXJ3aXNlIHRoaXMgaXMgZWZmZWN0aXZlbHkKKwkgYSByZXR1cm4gc3R1YiBhbmQgdGhlIHRhcmdldCBQQyBpcyBpbiAkMTguICAqLworICAgICAgZWxzZSBpZiAobmFtZVsxOV0gPT0gJ3MnIHx8IG5hbWVbMTldID09ICdkJykKKwl7CisJICBpZiAocGMgPT0gc3RhcnRfYWRkcikKKwkgICAgeworCSAgICAgIC8qIENoZWNrIGlmIHRoZSB0YXJnZXQgb2YgdGhlIHN0dWIgaXMgYSBjb21waWxlci1nZW5lcmF0ZWQKKwkJIHN0dWIuICBTdWNoIGEgc3R1YiBmb3IgYSBmdW5jdGlvbiBiYXIgbWlnaHQgaGF2ZSBhIG5hbWUKKwkJIGxpa2UgX19mbl9zdHViX2JhciwgYW5kIG1pZ2h0IGxvb2sgbGlrZSB0aGlzOgorCQkgICAgICBtZmMxICAgICQ0LCRmMTMKKwkJICAgICAgbWZjMSAgICAkNSwkZjEyCisJCSAgICAgIG1mYzEgICAgJDYsJGYxNQorCQkgICAgICBtZmMxICAgICQ3LCRmMTQKKwkJICAgICAgbGEgICAgICAkMSxiYXIgICAoYmVjb21lcyBhIGx1aS9hZGRpdSBwYWlyKQorCQkgICAgICBqciAgICAgICQxCisJCSBTbyBzY2FuIGRvd24gdG8gdGhlIGx1aS9hZGRpIGFuZCBleHRyYWN0IHRoZSB0YXJnZXQKKwkJIGFkZHJlc3MgZnJvbSB0aG9zZSB0d28gaW5zdHJ1Y3Rpb25zLiAgKi8KKworCSAgICAgIENPUkVfQUREUiB0YXJnZXRfcGMgPSByZWFkX3JlZ2lzdGVyICgyKTsKKwkgICAgICB0X2luc3QgaW5zdDsKKwkgICAgICBpbnQgaTsKKworCSAgICAgIC8qIFNlZSBpZiB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGlzICBfX2ZuX3N0dWJfKi4gICovCisJICAgICAgaWYgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAodGFyZ2V0X3BjLCAmbmFtZSwgTlVMTCwgTlVMTCkgPT0gMCkKKwkJcmV0dXJuIHRhcmdldF9wYzsKKwkgICAgICBpZiAoc3RybmNtcCAobmFtZSwgIl9fZm5fc3R1Yl8iLCAxMCkgIT0gMAorCQkgICYmIHN0cmNtcCAobmFtZSwgImV0ZXh0IikgIT0gMAorCQkgICYmIHN0cmNtcCAobmFtZSwgIl9ldGV4dCIpICE9IDApCisJCXJldHVybiB0YXJnZXRfcGM7CisKKwkgICAgICAvKiBTY2FuIHRocm91Z2ggdGhpcyBfZm5fc3R1Yl8gY29kZSBmb3IgdGhlIGx1aS9hZGRpdSBwYWlyLgorCQkgVGhlIGxpbWl0IG9uIHRoZSBzZWFyY2ggaXMgYXJiaXRyYXJpbHkgc2V0IHRvIDIwCisJCSBpbnN0cnVjdGlvbnMuICBGSVhNRS4gICovCisJICAgICAgZm9yIChpID0gMCwgcGMgPSAwOyBpIDwgMjA7IGkrKywgdGFyZ2V0X3BjICs9IE1JUFNfSU5TVExFTikKKwkJeworCQkgICBpbnN0ID0gbWlwc19mZXRjaF9pbnN0cnVjdGlvbiAodGFyZ2V0X3BjKTsKKwkJICAgaWYgKChpbnN0ICYgMHhmZmZmMDAwMCkgPT0gMHgzYzAxMDAwMCkJLyogbHVpICRhdCAqLworCQkgICAgICBwYyA9IChpbnN0IDw8IDE2KSAmIDB4ZmZmZjAwMDA7CQkvKiBoaWdoIHdvcmQgKi8KKwkJICAgZWxzZSBpZiAoKGluc3QgJiAweGZmZmYwMDAwKSA9PSAweDI0MjEwMDAwKQkvKiBhZGRpdSAkYXQgKi8KKwkJICAgICAgcmV0dXJuIHBjIHwgKGluc3QgJiAweGZmZmYpOwkJLyogbG93IHdvcmQgKi8KKwkJfQorCisJICAgICAgLyogQ291bGRuJ3QgZmluZCB0aGUgbHVpL2FkZHVpIHBhaXIsIHNvIHJldHVybiBzdHViIGFkZHJlc3MuICAqLworCSAgICAgIHJldHVybiB0YXJnZXRfcGM7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgLyogVGhpcyBpcyB0aGUgJ3JldHVybicgcGFydCBvZiBhIGNhbGwgc3R1Yi4gIFRoZSByZXR1cm4KKwkgICAgICAgYWRkcmVzcyBpcyBpbiAkcjE4LiAgKi8KKwkgICAgcmV0dXJuIHJlYWRfcmVnaXN0ZXIgKDE4KTsKKwl9CisgICAgfQorICByZXR1cm4gMDsJLyogbm90IGEgc3R1YiAqLworfQorCisKKy8qIFJldHVybiBub24temVybyBpZiB0aGUgUEMgaXMgaW5zaWRlIGEgY2FsbCB0aHVuayAoYWthIHN0dWIgb3IgdHJhbXBvbGluZSkuCisgICBUaGlzIGltcGxlbWVudHMgdGhlIElOX1NPTElCX0NBTExfVFJBTVBPTElORSBtYWNyby4gICovCisKK2ludAorbWlwc19pbl9jYWxsX3N0dWIgKHBjLCBuYW1lKQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIGNoYXIgKm5hbWU7Cit7CisgIENPUkVfQUREUiBzdGFydF9hZGRyOworCisgIC8qIEZpbmQgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgdGhlIFBDLiAgSWYgdGhlCisgICAgIGNhbGxlciBkaWRuJ3QgZ2l2ZSB1cyBhIG5hbWUsIGxvb2sgaXQgdXAgYXQgdGhlIHNhbWUgdGltZS4gICovCisgIGlmIChmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gKHBjLCBuYW1lID8gTlVMTCA6ICZuYW1lLCAmc3RhcnRfYWRkciwgTlVMTCkgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBpZiAoc3RybmNtcCAobmFtZSwgIl9fbWlwczE2X2NhbGxfc3R1Yl8iLCAxOSkgPT0gMCkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgUEMgaXMgaW4gX19taXBzMTZfY2FsbF9zdHViX3sxLi4xMH0sIHRoaXMgaXMgYSBjYWxsIHN0dWIuICAqLworICAgICAgaWYgKG5hbWVbMTldID49ICcwJyAmJiBuYW1lWzE5XSA8PSAnOScpCisJcmV0dXJuIDE7CisgICAgICAvKiBJZiB0aGUgUEMgYXQgdGhlIHN0YXJ0IG9mIF9fbWlwczE2X2NhbGxfc3R1Yl97cyxkfWZfezAuLjEwfSwgaS5lLgorCSBiZWZvcmUgdGhlIGphbCBpbnN0cnVjdGlvbiwgdGhpcyBpcyBlZmZlY3RpdmVseSBhIGNhbGwgc3R1Yi4gICovCisgICAgICBlbHNlIGlmIChuYW1lWzE5XSA9PSAncycgfHwgbmFtZVsxOV0gPT0gJ2QnKQorCXJldHVybiBwYyA9PSBzdGFydF9hZGRyOworICAgIH0KKworICByZXR1cm4gMDsJLyogbm90IGEgc3R1YiAqLworfQorCisKKy8qIFJldHVybiBub24temVybyBpZiB0aGUgUEMgaXMgaW5zaWRlIGEgcmV0dXJuIHRodW5rIChha2Egc3R1YiBvciB0cmFtcG9saW5lKS4KKyAgIFRoaXMgaW1wbGVtZW50cyB0aGUgSU5fU09MSUJfUkVUVVJOX1RSQU1QT0xJTkUgbWFjcm8uICAqLworCitpbnQKK21pcHNfaW5fcmV0dXJuX3N0dWIgKHBjLCBuYW1lKQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIGNoYXIgKm5hbWU7Cit7CisgIENPUkVfQUREUiBzdGFydF9hZGRyOworCisgIC8qIEZpbmQgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgdGhlIFBDLiAgKi8KKyAgaWYgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAocGMsIE5VTEwsICZzdGFydF9hZGRyLCBOVUxMKSA9PSAwKQorICAgIHJldHVybiAwOworCisgIC8qIElmIHRoZSBQQyBpcyBpbiBfX21pcHMxNl9yZXRfe2Qsc31mLCB0aGlzIGlzIGEgcmV0dXJuIHN0dWIuICAqLworICBpZiAoc3RyY21wIChuYW1lLCAiX19taXBzMTZfcmV0X3NmIikgPT0gMAorICAgICAgfHwgc3RyY21wIChuYW1lLCAiX19taXBzMTZfcmV0X2RmIikgPT0gMCkKKyAgICByZXR1cm4gMTsKKworICAvKiBJZiB0aGUgUEMgaXMgaW4gX19taXBzMTZfY2FsbF9zdHViX3tzLGR9Zl97MC4uMTB9IGJ1dCBub3QgYXQgdGhlIHN0YXJ0LAorICAgICAgaS5lLiBhZnRlciB0aGUgamFsIGluc3RydWN0aW9uLCB0aGlzIGlzIGVmZmVjdGl2ZWx5IGEgcmV0dXJuIHN0dWIuICAqLworICBpZiAoc3RybmNtcCAobmFtZSwgIl9fbWlwczE2X2NhbGxfc3R1Yl8iLCAxOSkgPT0gMAorICAgICAgJiYgKG5hbWVbMTldID09ICdzJyB8fCBuYW1lWzE5XSA9PSAnZCcpCisgICAgICAmJiBwYyAhPSBzdGFydF9hZGRyKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOwkvKiBub3QgYSBzdHViICovCit9CisKKworLyogUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBQQyBpcyBpbiBhIGxpYnJhcnkgaGVscGVyIGZ1bmN0aW9uIHRoYXQgc2hvdWxkCisgICBiZSBpZ25vcmVkLiAgVGhpcyBpbXBsZW1lbnRzIHRoZSBJR05PUkVfSEVMUEVSX0NBTEwgbWFjcm8uICAqLworCitpbnQKK21pcHNfaWdub3JlX2hlbHBlciAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgY2hhciAqbmFtZTsKKworICAvKiBGaW5kIHRoZSBzdGFydGluZyBhZGRyZXNzIGFuZCBuYW1lIG9mIHRoZSBmdW5jdGlvbiBjb250YWluaW5nIHRoZSBQQy4gICovCisgIGlmIChmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gKHBjLCAmbmFtZSwgTlVMTCwgTlVMTCkgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICAvKiBJZiB0aGUgUEMgaXMgaW4gX19taXBzMTZfcmV0X3tkLHN9ZiwgdGhpcyBpcyBhIGxpYnJhcnkgaGVscGVyIGZ1bmN0aW9uCisgICAgIHRoYXQgd2Ugd2FudCB0byBpZ25vcmUuICAqLworICByZXR1cm4gKHN0cmNtcCAobmFtZSwgIl9fbWlwczE2X3JldF9zZiIpID09IDAKKwkgIHx8IHN0cmNtcCAobmFtZSwgIl9fbWlwczE2X3JldF9kZiIpID09IDApOworfQorCisKKy8qIFJldHVybiBhIGxvY2F0aW9uIHdoZXJlIHdlIGNhbiBzZXQgYSBicmVha3BvaW50IHRoYXQgd2lsbCBiZSBoaXQKKyAgIHdoZW4gYW4gaW5mZXJpb3IgZnVuY3Rpb24gY2FsbCByZXR1cm5zLiAgVGhpcyBpcyBub3JtYWxseSB0aGUKKyAgIHByb2dyYW0ncyBlbnRyeSBwb2ludC4gIEV4ZWN1dGFibGVzIHRoYXQgZG9uJ3QgaGF2ZSBhbiBlbnRyeQorICAgcG9pbnQgKGUuZy4gcHJvZ3JhbXMgaW4gUk9NKSBzaG91bGQgZGVmaW5lIGEgc3ltYm9sIF9fQ0FMTF9EVU1NWV9BRERSRVNTCisgICB3aG9zZSBhZGRyZXNzIGlzIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgYnJlYWtwb2ludCBzaG91bGQgYmUgcGxhY2VkLiAgKi8KKworQ09SRV9BRERSCittaXBzX2NhbGxfZHVtbXlfYWRkcmVzcyAoKQoreworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKnN5bTsKKworICBzeW0gPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKCJfX0NBTExfRFVNTVlfQUREUkVTUyIsIE5VTEwsIE5VTEwpOworICBpZiAoc3ltKQorICAgIHJldHVybiBTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltKTsKKyAgZWxzZQorICAgIHJldHVybiBlbnRyeV9wb2ludF9hZGRyZXNzICgpOworfQorCisKK3ZvaWQKK19pbml0aWFsaXplX21pcHNfdGRlcCAoKQoreworICBzdGF0aWMgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKm1pcHNmcHVsaXN0ID0gTlVMTDsKKyAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7CisKKyAgaWYgKCF0bV9wcmludF9pbnNuKSAvKiBTb21lb25lIG1heSBoYXZlIGFscmVhZHkgc2V0IGl0ICovCisgICAgdG1fcHJpbnRfaW5zbiA9IGdkYl9wcmludF9pbnNuX21pcHM7CisKKyAgLyogTGV0IHRoZSB1c2VyIHR1cm4gb2ZmIGZsb2F0aW5nIHBvaW50IGFuZCBzZXQgdGhlIGZlbmNlIHBvc3QgZm9yCisgICAgIGhldXJpc3RpY19wcm9jX3N0YXJ0LiAgKi8KKworICBhZGRfcHJlZml4X2NtZCAoIm1pcHNmcHUiLCBjbGFzc19zdXBwb3J0LCBzZXRfbWlwc2ZwdV9jb21tYW5kLAorCQkgICJTZXQgdXNlIG9mIE1JUFMgZmxvYXRpbmctcG9pbnQgY29wcm9jZXNzb3IuIiwKKwkJICAmbWlwc2ZwdWxpc3QsICJzZXQgbWlwc2ZwdSAiLCAwLCAmc2V0bGlzdCk7CisgIGFkZF9jbWQgKCJzaW5nbGUiLCBjbGFzc19zdXBwb3J0LCBzZXRfbWlwc2ZwdV9zaW5nbGVfY29tbWFuZCwKKwkgICAiU2VsZWN0IHNpbmdsZS1wcmVjaXNpb24gTUlQUyBmbG9hdGluZy1wb2ludCBjb3Byb2Nlc3Nvci4iLAorCSAgICZtaXBzZnB1bGlzdCk7CisgIGFkZF9jbWQgKCJkb3VibGUiLCBjbGFzc19zdXBwb3J0LCBzZXRfbWlwc2ZwdV9kb3VibGVfY29tbWFuZCwKKwkgICAiU2VsZWN0IGRvdWJsZS1wcmVjaXNpb24gTUlQUyBmbG9hdGluZy1wb2ludCBjb3Byb2Nlc3NvciAuIiwKKwkgICAmbWlwc2ZwdWxpc3QpOworICBhZGRfYWxpYXNfY21kICgib24iLCAiZG91YmxlIiwgY2xhc3Nfc3VwcG9ydCwgMSwgJm1pcHNmcHVsaXN0KTsKKyAgYWRkX2FsaWFzX2NtZCAoInllcyIsICJkb3VibGUiLCBjbGFzc19zdXBwb3J0LCAxLCAmbWlwc2ZwdWxpc3QpOworICBhZGRfYWxpYXNfY21kICgiMSIsICJkb3VibGUiLCBjbGFzc19zdXBwb3J0LCAxLCAmbWlwc2ZwdWxpc3QpOworICBhZGRfY21kICgibm9uZSIsIGNsYXNzX3N1cHBvcnQsIHNldF9taXBzZnB1X25vbmVfY29tbWFuZCwKKwkgICAiU2VsZWN0IG5vIE1JUFMgZmxvYXRpbmctcG9pbnQgY29wcm9jZXNzb3IuIiwKKwkgICAmbWlwc2ZwdWxpc3QpOworICBhZGRfYWxpYXNfY21kICgib2ZmIiwgIm5vbmUiLCBjbGFzc19zdXBwb3J0LCAxLCAmbWlwc2ZwdWxpc3QpOworICBhZGRfYWxpYXNfY21kICgibm8iLCAibm9uZSIsIGNsYXNzX3N1cHBvcnQsIDEsICZtaXBzZnB1bGlzdCk7CisgIGFkZF9hbGlhc19jbWQgKCIwIiwgIm5vbmUiLCBjbGFzc19zdXBwb3J0LCAxLCAmbWlwc2ZwdWxpc3QpOworICBhZGRfY21kICgiYXV0byIsIGNsYXNzX3N1cHBvcnQsIHNldF9taXBzZnB1X2F1dG9fY29tbWFuZCwKKwkgICAiU2VsZWN0IE1JUFMgZmxvYXRpbmctcG9pbnQgY29wcm9jZXNzb3IgYXV0b21hdGljYWxseS4iLAorCSAgICZtaXBzZnB1bGlzdCk7CisgIGFkZF9jbWQgKCJtaXBzZnB1IiwgY2xhc3Nfc3VwcG9ydCwgc2hvd19taXBzZnB1X2NvbW1hbmQsCisJICAgIlNob3cgY3VycmVudCB1c2Ugb2YgTUlQUyBmbG9hdGluZy1wb2ludCBjb3Byb2Nlc3NvciB0YXJnZXQuIiwKKwkgICAmc2hvd2xpc3QpOworCisgIGMgPSBhZGRfc2V0X2NtZCAoInByb2Nlc3NvciIsIGNsYXNzX3N1cHBvcnQsIHZhcl9zdHJpbmdfbm9lc2NhcGUsCisJCSAgIChjaGFyICopICZ0bXBfbWlwc19wcm9jZXNzb3JfdHlwZSwKKwkJICAgIlNldCB0aGUgdHlwZSBvZiBNSVBTIHByb2Nlc3NvciBpbiB1c2UuXG5cCitTZXQgdGhpcyB0byBiZSBhYmxlIHRvIGFjY2VzcyBwcm9jZXNzb3ItdHlwZS1zcGVjaWZpYyByZWdpc3RlcnMuXG5cCisiLAorCQkgICAmc2V0bGlzdCk7CisgIGMtPmZ1bmN0aW9uLmNmdW5jID0gbWlwc19zZXRfcHJvY2Vzc29yX3R5cGVfY29tbWFuZDsKKyAgYyA9IGFkZF9zaG93X2Zyb21fc2V0IChjLCAmc2hvd2xpc3QpOworICBjLT5mdW5jdGlvbi5jZnVuYyA9IG1pcHNfc2hvd19wcm9jZXNzb3JfdHlwZV9jb21tYW5kOworCisgIHRtcF9taXBzX3Byb2Nlc3Nvcl90eXBlID0gc3Ryc2F2ZSAoREVGQVVMVF9NSVBTX1RZUEUpOworICBtaXBzX3NldF9wcm9jZXNzb3JfdHlwZV9jb21tYW5kIChzdHJzYXZlIChERUZBVUxUX01JUFNfVFlQRSksIDApOworCisgIC8qIFdlIHJlYWxseSB3b3VsZCBsaWtlIHRvIGhhdmUgYm90aCAiMCIgYW5kICJ1bmxpbWl0ZWQiIHdvcmssIGJ1dAorICAgICBjb21tYW5kLmMgZG9lc24ndCBkZWFsIHdpdGggdGhhdC4gIFNvIG1ha2UgaXQgYSB2YXJfemludGVnZXIKKyAgICAgYmVjYXVzZSB0aGUgdXNlciBjYW4gYWx3YXlzIHVzZSAiOTk5OTk5IiBvciBzb21lIHN1Y2ggZm9yIHVubGltaXRlZC4gICovCisgIGMgPSBhZGRfc2V0X2NtZCAoImhldXJpc3RpYy1mZW5jZS1wb3N0IiwgY2xhc3Nfc3VwcG9ydCwgdmFyX3ppbnRlZ2VyLAorCQkgICAoY2hhciAqKSAmaGV1cmlzdGljX2ZlbmNlX3Bvc3QsCisJCSAgICJcCitTZXQgdGhlIGRpc3RhbmNlIHNlYXJjaGVkIGZvciB0aGUgc3RhcnQgb2YgYSBmdW5jdGlvbi5cblwKK0lmIHlvdSBhcmUgZGVidWdnaW5nIGEgc3RyaXBwZWQgZXhlY3V0YWJsZSwgR0RCIG5lZWRzIHRvIHNlYXJjaCB0aHJvdWdoIHRoZVxuXAorcHJvZ3JhbSBmb3IgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24uICBUaGlzIGNvbW1hbmQgc2V0cyB0aGUgZGlzdGFuY2Ugb2YgdGhlXG5cCitzZWFyY2guICBUaGUgb25seSBuZWVkIHRvIHNldCBpdCBpcyB3aGVuIGRlYnVnZ2luZyBhIHN0cmlwcGVkIGV4ZWN1dGFibGUuIiwKKwkJICAgJnNldGxpc3QpOworICAvKiBXZSBuZWVkIHRvIHRocm93IGF3YXkgdGhlIGZyYW1lIGNhY2hlIHdoZW4gd2Ugc2V0IHRoaXMsIHNpbmNlIGl0CisgICAgIG1pZ2h0IGNoYW5nZSBvdXIgYWJpbGl0eSB0byBnZXQgYmFja3RyYWNlcy4gICovCisgIGMtPmZ1bmN0aW9uLnNmdW5jID0gcmVpbml0X2ZyYW1lX2NhY2hlX3NmdW5jOworICBhZGRfc2hvd19mcm9tX3NldCAoYywgJnNob3dsaXN0KTsKKworICAvKiBBbGxvdyB0aGUgdXNlciB0byBjb250cm9sIHdoZXRoZXIgdGhlIHVwcGVyIGJpdHMgb2YgNjQtYml0CisgICAgIGFkZHJlc3NlcyBzaG91bGQgYmUgemVyb2VkLiAgKi8KKyAgYWRkX3Nob3dfZnJvbV9zZXQKKyAgICAoYWRkX3NldF9jbWQgKCJtYXNrLWFkZHJlc3MiLCBub19jbGFzcywgdmFyX2Jvb2xlYW4sIChjaGFyICopJm1hc2tfYWRkcmVzc19wLAorCSAgICJTZXQgemVyb2luZyBvZiB1cHBlciAzMiBiaXRzIG9mIDY0LWJpdCBhZGRyZXNzZXMuXG5cCitVc2UgXCJvblwiIHRvIGVuYWJsZSB0aGUgbWFza2luZywgYW5kIFwib2ZmXCIgdG8gZGlzYWJsZSBpdC5cblwKK1dpdGhvdXQgYW4gYXJndW1lbnQsIHplcm9pbmcgb2YgdXBwZXIgYWRkcmVzcyBiaXRzIGlzIGVuYWJsZWQuIiwgJnNldGxpc3QpLAorICAgICAmc2hvd2xpc3QpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL21pcHNtMy1uYXQuYyBiL2dkYi9taXBzbTMtbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg5ZWNkNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9taXBzbTMtbmF0LmMKQEAgLTAsMCArMSwzODYgQEAKKy8qIERlZmluaXRpb25zIHRvIG1ha2UgR0RCIHJ1biBvbiBhIG1pcHMgYm94IHVuZGVyIE1hY2ggMy4wCisgICBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogTWFjaCBzcGVjaWZpYyByb3V0aW5lcyBmb3IgbGl0dGxlIGVuZGlhbiBtaXBzIChlLmcuIHBtYXgpCisgKiBydW5uaW5nIE1hY2ggMy4wCisgKgorICogQXV0aG9yOiBKdWtrYSBWaXJ0YW5lbiA8anR2QGh1dC5maT4KKyAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8bWFjaC5oPgorI2luY2x1ZGUgPG1hY2gvbWVzc2FnZS5oPgorI2luY2x1ZGUgPG1hY2gvZXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8bWFjaF9lcnJvci5oPgorCisvKiBGaW5kIG9mZnNldHMgdG8gdGhyZWFkIHN0YXRlcyBhdCBjb21waWxlIHRpbWUuCisgKiBJZiB5b3VyIGNvbXBpbGVyIGRvZXMgbm90IGdyb2sgdGhpcywgY2hlY2sgdGhlIGhhbmQgY29kZWQKKyAqIG9mZnNldHMgYW5kIHVzZSB0aGVtLgorICovCisKKyNpZiAxCisKKyNkZWZpbmUgIFJFR19PRkZTRVQocmVnKSAoaW50KSgmKChzdHJ1Y3QgbWlwc190aHJlYWRfc3RhdGUgKikwKS0+cmVnKQorI2RlZmluZSBDUkVHX09GRlNFVChyZWcpIChpbnQpKCYoKHN0cnVjdCBtaXBzX2Zsb2F0X3N0YXRlICopMCktPnJlZykKKyNkZWZpbmUgRVJFR19PRkZTRVQocmVnKSAoaW50KSgmKChzdHJ1Y3QgbWlwc19leGNfc3RhdGUgKikwKS0+cmVnKQorCisvKiBhdCByZWdfb2Zmc2V0W2ldIGlzIHRoZSBvZmZzZXQgdG8gdGhlIG1pcHNfdGhyZWFkX3N0YXRlCisgKiBsb2NhdGlvbiB3aGVyZSB0aGUgZ2RiIHJlZ2lzdGVyc1tpXSBpcyBzdG9yZWQuCisgKgorICogLTEgbWVhbnMgbWFjaCBkb2VzIG5vdCBzYXZlIGl0IGFueXdoZXJlLgorICovCitzdGF0aWMgaW50IHJlZ19vZmZzZXRbXSA9IAoreworICAvKiAgemVybwkJYXQJCSAgdjAJCSAgICB2MSAgICAgICAqLworICAgICAgLTEsICAgICAgICAgICBSRUdfT0ZGU0VUKHIxKSwgICBSRUdfT0ZGU0VUKHIyKSwgICBSRUdfT0ZGU0VUKHIzKSwKKworICAvKiAgYTAJCWExCQkgIGEyCQkgICAgYTMgICAgICAgKi8KKyAgUkVHX09GRlNFVChyNCksICAgUkVHX09GRlNFVChyNSksICAgUkVHX09GRlNFVChyNiksICAgUkVHX09GRlNFVChyNyksCisKKyAgLyogIHQwCQl0MQkJICB0MgkJICAgIHQzICAgICAgICovCisgIFJFR19PRkZTRVQocjgpLCAgIFJFR19PRkZTRVQocjkpLCAgIFJFR19PRkZTRVQocjEwKSwgIFJFR19PRkZTRVQocjExKSwKKworICAvKiAgdDQJCXQ1CQkgIHQ2CQkgICAgdDcgICAgICAgKi8KKyAgUkVHX09GRlNFVChyMTIpLCAgUkVHX09GRlNFVChyMTMpLCAgUkVHX09GRlNFVChyMTQpLCAgUkVHX09GRlNFVChyMTUpLAorCisgIC8qICBzMAkJczEJCSAgczIJCSAgICBzMyAgICAgICAqLworICBSRUdfT0ZGU0VUKHIxNiksICBSRUdfT0ZGU0VUKHIxNyksICBSRUdfT0ZGU0VUKHIxOCksICBSRUdfT0ZGU0VUKHIxOSksCisKKyAgLyogIHM0CQlzNQkJICBzNgkJICAgIHM3ICAgICAgICovCisgIFJFR19PRkZTRVQocjIwKSwgIFJFR19PRkZTRVQocjIxKSwgIFJFR19PRkZTRVQocjIyKSwgIFJFR19PRkZTRVQocjIzKSwKKworICAvKiAgdDgJCXQ5CQkgIGswCQkgICAgazEgICAgICAgKi8KKyAgUkVHX09GRlNFVChyMjQpLCAgUkVHX09GRlNFVChyMjUpLCAgUkVHX09GRlNFVChyMjYpLCAgUkVHX09GRlNFVChyMjcpLAorCisgIC8qICBncAkJc3AJICAgICAgczgoMzApID09IGZwKDcyKQkgICAgcmEgICAgICAgKi8KKyAgUkVHX09GRlNFVChyMjgpLCAgUkVHX09GRlNFVChyMjkpLCAgUkVHX09GRlNFVChyMzApLCAgUkVHX09GRlNFVChyMzEpLAorCisgIC8qICBzcigzMikgUFNfUkVHTlVNICAgKi8KKyAgRVJFR19PRkZTRVQoY29wcm9jX3N0YXRlKSwKKworICAvKiAgbG8oMzMpCQloaSgzNCkgICAgKi8KKyAgUkVHX09GRlNFVChtZGxvKSwgUkVHX09GRlNFVChtZGhpKSwKKworICAvKiAgYmFkKDM1KSAgICAgICAgICAJICAgICAgY2F1c2UoMzYpCSAgICAgICAgIHBjKDM3KSAgKi8KKyAgRVJFR19PRkZTRVQoYWRkcmVzcyksICBFUkVHX09GRlNFVChjYXVzZSksIFJFR19PRkZTRVQocGMpLAorCisgIC8qICBmMCgzOCkJCSBmMSgzOSkJCSAgICBmMig0MCkJICAgICAgIGYzKDQxKSAgICovCisgIENSRUdfT0ZGU0VUKHIwKSwgICBDUkVHX09GRlNFVChyMSksICAgQ1JFR19PRkZTRVQocjIpLCAgIENSRUdfT0ZGU0VUKHIzKSwKKyAgQ1JFR19PRkZTRVQocjQpLCAgIENSRUdfT0ZGU0VUKHI1KSwgICBDUkVHX09GRlNFVChyNiksICAgQ1JFR19PRkZTRVQocjcpLAorICBDUkVHX09GRlNFVChyOCksICAgQ1JFR19PRkZTRVQocjkpLCAgIENSRUdfT0ZGU0VUKHIxMCksICBDUkVHX09GRlNFVChyMTEpLAorICBDUkVHX09GRlNFVChyMTIpLCAgQ1JFR19PRkZTRVQocjEzKSwgIENSRUdfT0ZGU0VUKHIxNCksICBDUkVHX09GRlNFVChyMTUpLAorICBDUkVHX09GRlNFVChyMTYpLCAgQ1JFR19PRkZTRVQocjE3KSwgIENSRUdfT0ZGU0VUKHIxOCksICBDUkVHX09GRlNFVChyMTkpLAorICBDUkVHX09GRlNFVChyMjApLCAgQ1JFR19PRkZTRVQocjIxKSwgIENSRUdfT0ZGU0VUKHIyMiksICBDUkVHX09GRlNFVChyMjMpLAorICBDUkVHX09GRlNFVChyMjQpLCAgQ1JFR19PRkZTRVQocjI1KSwgIENSRUdfT0ZGU0VUKHIyNiksICBDUkVHX09GRlNFVChyMjcpLAorICBDUkVHX09GRlNFVChyMjgpLCAgQ1JFR19PRkZTRVQocjI5KSwgIENSRUdfT0ZGU0VUKHIzMCksICBDUkVHX09GRlNFVChyMzEpLAorCisgIC8qICBmc3IoNzApCQlmaXIoNzEpCQlmcCg3MikgPT0gczgoMzApICovCisgIENSRUdfT0ZGU0VUKGNzciksICBDUkVHX09GRlNFVChlc3IpLCAgUkVHX09GRlNFVChyMzApCit9OworI2Vsc2UKKy8qIElmIHRoZSBjb21waWxlciBkb2VzIG5vdCBncm9rIHRoZSBhYm92ZSBkZWZpbmVzICovCitzdGF0aWMgaW50IHJlZ19vZmZzZXRbXSA9IAoreworLyogbWFjaF90aHJlYWRfc3RhdGUgb2Zmc2V0czogKi8KKyAgLTEsICAwLCAgNCwgIDgsICAxMiwgMTYsIDIwLCAyNCwgIDI4LCAzMiwgMzYsIDQwLCAgNDQsIDQ4LCA1MiwgNTYsCisgIDYwLCA2NCwgNjgsIDcyLCAgNzYsIDgwLCA4NCwgODgsICA5MiwgOTYsMTAwLDEwNCwgMTA4LDExMiwxMTYsMTIwLAorLypzciwgbG8sIGhpLGFkZHIsY2F1c2UscGMgICAqLworICAgOCwxMjQsMTI4LCAgNCwgICAwLDEzMiwKKy8qIG1hY2hfZmxvYXRfc3RhdGUgb2Zmc2V0czogKi8KKyAgIDAsICA0LCAgOCwgMTIsICAxNiwgMjAsIDI0LCAyOCwgIDMyLCAzNiwgNDAsIDQ0LCAgNDgsIDUyLCA1NiwgNjAsCisgIDY0LCA2OCwgNzIsIDc2LCAgODAsIDg0LCA4OCwgOTIsICA5NiwxMDAsMTA0LDEwOCwgMTEyLDExNiwxMjAsMTI0LAorLypmc3IsZmlyKi8KKyAxMjgsMTMyLAorLyogRlBfUkVHTlVNIHBzZXVkbyBtYXBzIHRvIHM4PT1yMzAgaW4gbWFjaF90aHJlYWRfc3RhdGUgKi8KKyAxMTYKK307CisjZW5kaWYKKworLyogRmV0Y2ggQ09VTlQgY29udGlndW91cyByZWdpc3RlcnMgZnJvbSB0aHJlYWQgU1RBVEUgc3RhcnRpbmcgZnJvbSBSRUdOVU0KKyAqIENhbGxlciBrbm93cyB0aGF0IHRoZSByZWdzIGhhbmRsZWQgaW4gb25lIHRyYW5zYWN0aW9uIGFyZSBvZiBzYW1lIHNpemUuCisgKi8KKyNkZWZpbmUgRkVUQ0hfUkVHUyhzdGF0ZSwgcmVnbnVtLCBjb3VudCkgXAorICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnbnVtKV0sIFwKKwkgIChjaGFyICopc3RhdGUrcmVnX29mZnNldFsgcmVnbnVtIF0sIFwKKwkgIGNvdW50KlJFR0lTVEVSX1NJWkUpCisKKy8qIFN0b3JlIENPVU5UIGNvbnRpZ3VvdXMgcmVnaXN0ZXJzIHRvIHRocmVhZCBTVEFURSBzdGFydGluZyBmcm9tIFJFR05VTSAqLworI2RlZmluZSBTVE9SRV9SRUdTKHN0YXRlLCByZWdudW0sIGNvdW50KSBcCisgIG1lbWNweSAoKGNoYXIgKilzdGF0ZStyZWdfb2Zmc2V0WyByZWdudW0gXSwgXAorCSAgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdudW0pXSwgXAorCSAgY291bnQqUkVHSVNURVJfU0laRSkKKworI2RlZmluZSBSRUdTX0FMTCAgICAtMQorI2RlZmluZSBSRUdTX05PUk1BTCAgMQorI2RlZmluZSBSRUdTX0VYQyAgICAgMgorI2RlZmluZSBSRUdTX0NPUDEgICAgNAorCisvKiBIYXJkd2FyZSByZWdzIHRoYXQgbWF0Y2hlcyBGUF9SRUdOVU0gKi8KKyNkZWZpbmUgTUFDSF9GUF9SRUdOVU0gMzAKKworLyogRmVjaCB0aHJlYWQncyByZWdpc3RlcnMuIGlmIHJlZ25vID09IC0xLCBmZXRjaCBhbGwgcmVncyAqLwordm9pZAorZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBrZXJuX3JldHVybl90IHJldDsgIAorCisgIHRocmVhZF9zdGF0ZV9kYXRhX3QgICAgICBzdGF0ZTsKKyAgc3RydWN0IG1pcHNfZXhjX3N0YXRlICAgIGV4Y19zdGF0ZTsKKworICBpbnQgc3RhdGVDbnQgICA9IE1JUFNfVEhSRUFEX1NUQVRFX0NPVU5UOworCisgIGludCB3aGljaF9yZWdzID0gMDsgLyogQSBiaXQgbWFzayAqLworCisgIGlmICghIE1BQ0hfUE9SVF9WQUxJRCAoY3VycmVudF90aHJlYWQpKQorICAgIGVycm9yICgiZmV0Y2ggaW5mZXJpb3IgcmVnaXN0ZXJzOiBJbnZhbGlkIHRocmVhZCIpOworICAKKyAgaWYgKHJlZ25vIDwgLTEgfHwgcmVnbm8gPj0gTlVNX1JFR1MpCisgICAgZXJyb3IgKCJpbnZhbGlkIHJlZ2lzdGVyICVkIHN1cHBsaWVkIHRvIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyIsIHJlZ25vKTsKKworICBpZiAocmVnbm8gPT0gLTEpCisgICAgd2hpY2hfcmVncyA9IFJFR1NfQUxMOworICBlbHNlIGlmIChyZWdubyA9PSBaRVJPX1JFR05VTSkKKyAgICB7CisgICAgICBpbnQgemVybyA9IDA7CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKFpFUk9fUkVHTlVNLCAmemVybyk7CisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlIGlmICgoWkVST19SRUdOVU0gPCByZWdubyAmJiByZWdubyA8IFBTX1JFR05VTSkKKwkgICB8fCByZWdubyA9PSBGUF9SRUdOVU0KKwkgICB8fCByZWdubyA9PSBMT19SRUdOVU0KKwkgICB8fCByZWdubyA9PSBISV9SRUdOVU0KKwkgICB8fCByZWdubyA9PSBQQ19SRUdOVU0pCisgICAgd2hpY2hfcmVncyA9IFJFR1NfTk9STUFMOworICBlbHNlIGlmIChGUDBfUkVHTlVNIDw9IHJlZ25vICYmIHJlZ25vIDw9IEZDUklSX1JFR05VTSkKKyAgICB3aGljaF9yZWdzID0gUkVHU19DT1AxIHwgUkVHU19FWEM7CisgIGVsc2UKKyAgICB3aGljaF9yZWdzID0gUkVHU19FWEM7CisKKyAgLyogZmV0Y2ggcmVncyBzYXZlZCB0byBtaXBzX3RocmVhZF9zdGF0ZSAqLworICBpZiAod2hpY2hfcmVncyAmIFJFR1NfTk9STUFMKQorICAgIHsKKyAgICAgIHJldCA9IHRocmVhZF9nZXRfc3RhdGUgKGN1cnJlbnRfdGhyZWFkLAorCQkJICAgICAgTUlQU19USFJFQURfU1RBVEUsCisJCQkgICAgICBzdGF0ZSwKKwkJCSAgICAgICZzdGF0ZUNudCk7CisgICAgICBDSEsgKCJmZXRjaCBpbmZlcmlvciByZWdpc3RlcnM6IHRocmVhZF9nZXRfc3RhdGUiLCByZXQpOworCisgICAgICBpZiAod2hpY2hfcmVncyA9PSBSRUdTX05PUk1BTCkKKwl7CisJICAvKiBGZXRjaCBhbHNvIEZQX1JFR05VTSBpZiBmZXRjaGluZyBNQUNIX0ZQX1JFR05VTSBhbmQgdmljZSB2ZXJzYSAqLworCSAgaWYgKHJlZ25vID09IE1BQ0hfRlBfUkVHTlVNIHx8IHJlZ25vID09IEZQX1JFR05VTSkKKwkgICAgeworCSAgICAgIHN1cHBseV9yZWdpc3RlciAoRlBfUkVHTlVNLAorCQkJICAgICAgIChjaGFyICopc3RhdGUrcmVnX29mZnNldFsgTUFDSF9GUF9SRUdOVU0gXSk7CisJICAgICAgc3VwcGx5X3JlZ2lzdGVyIChNQUNIX0ZQX1JFR05VTSwKKwkJCSAgICAgICAoY2hhciAqKXN0YXRlK3JlZ19vZmZzZXRbIE1BQ0hfRlBfUkVHTlVNIF0pOworCSAgICB9CisJICBlbHNlCisJICAgIHN1cHBseV9yZWdpc3RlciAocmVnbm8sCisJCQkgICAgIChjaGFyICopc3RhdGUrcmVnX29mZnNldFsgcmVnbm8gXSk7CisJICByZXR1cm47CisJfQorCQkJICAgCisgICAgICAvKiBaRVJPX1JFR05VTSBpcyBhbHdheXMgemVybyAqLworICAgICAgKihpbnQgKikgcmVnaXN0ZXJzID0gMDsKKyAgICAgIAorICAgICAgLyogQ29weSB0aHJlYWQgc2F2ZWQgcmVncyAxLi4zMSB0byBnZGIncyByZWcgdmFsdWUgYXJyYXkKKyAgICAgICAqIEx1Y2tpbHksIHRoZXkgYXJlIGNvbnRpcXVvdXMKKyAgICAgICAqLworICAgICAgRkVUQ0hfUkVHUyAoc3RhdGUsIDEsIDMxKTsKKyAgICAgIAorICAgICAgLyogQ29weSBtZGxvIGFuZCBtZGhpICovCisgICAgICBGRVRDSF9SRUdTIChzdGF0ZSwgTE9fUkVHTlVNLCAyKTsKKworICAgICAgLyogQ29weSBQQyAqLworICAgICAgRkVUQ0hfUkVHUyAoc3RhdGUsIFBDX1JFR05VTSwgMSk7CisKKyAgICAgIC8qIE1hY2ggMy4wIHNhdmVzIEZQIHRvIE1BQ0hfRlBfUkVHTlVNLgorICAgICAgICogRm9yIHNvbWUgcmVhc29uIGdkYiB3YW50cyB0byBhc3NpZ24gYSBwc2V1ZG8gcmVnaXN0ZXIgZm9yIGl0LgorICAgICAgICovCisgICAgICBGRVRDSF9SRUdTIChzdGF0ZSwgRlBfUkVHTlVNLCAxKTsKKyAgICB9CisKKyAgLyogUmVhZCBleGMgc3RhdGUuIEFsc28gcmVhZCBpZiBuZWVkIHRvIGZldGNoIGZsb2F0cyAqLworICBpZiAod2hpY2hfcmVncyAmIFJFR1NfRVhDKQorICAgIHsKKyAgICAgIHN0YXRlQ250ID0gTUlQU19FWENfU1RBVEVfQ09VTlQ7CisgICAgICByZXQgPSB0aHJlYWRfZ2V0X3N0YXRlIChjdXJyZW50X3RocmVhZCwKKwkJCSAgICAgIE1JUFNfRVhDX1NUQVRFLAorCQkJICAgICAgKHRocmVhZF9zdGF0ZV90KSAmZXhjX3N0YXRlLAorCQkJICAgICAgJnN0YXRlQ250KTsKKyAgICAgIENISyAoImZldGNoIGluZmVyaW9yIHJlZ3MgKGV4Yyk6IHRocmVhZF9nZXRfc3RhdGUiLCByZXQpOworCisgICAgICAvKiBXZSBuZWVkIHRvIGZldGNoIGV4Y19zdGF0ZSB0byBzZWUgaWYgdGhlIGZsb2F0aW5nCisgICAgICAgKiBzdGF0ZSBpcyB2YWxpZCBmb3IgdGhlIHRocmVhZC4KKyAgICAgICAqLworCisgICAgICAvKiBjcHJvY19zdGF0ZTogV2hpY2ggY29wcm9jZXNzb3JzIHRoZSB0aHJlYWQgdXNlcyAqLworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChQU19SRUdOVU0sCisJCSAgICAgICAoY2hhciAqKSZleGNfc3RhdGUrcmVnX29mZnNldFsgUFNfUkVHTlVNIF0pOworICAgICAgCisgICAgICBpZiAod2hpY2hfcmVncyA9PSBSRUdTX0VYQyB8fCB3aGljaF9yZWdzID09IFJFR1NfQUxMKQorCXsKKwkgIHN1cHBseV9yZWdpc3RlciAoQkFEVkFERFJfUkVHTlVNLAorCQkJICAgKGNoYXIgKikmZXhjX3N0YXRlK3JlZ19vZmZzZXRbIEJBRFZBRERSX1JFR05VTSBdKTsKKwkgIAorCSAgc3VwcGx5X3JlZ2lzdGVyIChDQVVTRV9SRUdOVU0sCisJCQkgICAoY2hhciAqKSZleGNfc3RhdGUrcmVnX29mZnNldFsgQ0FVU0VfUkVHTlVNIF0pOworCSAgaWYgKHdoaWNoX3JlZ3MgPT0gUkVHU19FWEMpCisJICAgIHJldHVybjsKKwl9CisgICAgfQorCisKKyAgaWYgKHdoaWNoX3JlZ3MgJiBSRUdTX0NPUDEpCisgICAgeworICAgICAgLyogSWYgdGhlIHRocmVhZCBkb2VzIG5vdCBoYXZlIHNhdmVkIENPUFJPQzEsIHNldCByZWdzIHRvIHplcm8gKi8KKyAgICAgIAorICAgICAgaWYgKCEgKGV4Y19zdGF0ZS5jb3Byb2Nfc3RhdGUgJiBNSVBTX1NUQVRVU19VU0VfQ09QMSkpCisJYnplcm8gKCZyZWdpc3RlcnNbIFJFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pIF0sCisJICAgICAgIHNpemVvZiAoc3RydWN0IG1pcHNfZmxvYXRfc3RhdGUpKTsKKyAgICAgIGVsc2UKKwl7CisJICBzdGF0ZUNudCA9IE1JUFNfRkxPQVRfU1RBVEVfQ09VTlQ7CisJICByZXQgPSB0aHJlYWRfZ2V0X3N0YXRlIChjdXJyZW50X3RocmVhZCwKKwkJCQkgIE1JUFNfRkxPQVRfU1RBVEUsCisJCQkJICBzdGF0ZSwKKwkJCQkgICZzdGF0ZUNudCk7CisJICBDSEsgKCJmZXRjaCBpbmZlcmlvciByZWdzIChmbG9hdHMpOiB0aHJlYWRfZ2V0X3N0YXRlIiwgcmV0KTsKKwkgIAorCSAgaWYgKHJlZ25vICE9IC0xKQorCSAgICB7CisJICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywKKwkJCSAgICAgICAoY2hhciAqKXN0YXRlK3JlZ19vZmZzZXRbIHJlZ25vIF0pOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgCisJICBGRVRDSF9SRUdTIChzdGF0ZSwgRlAwX1JFR05VTSwgMzQpOworCX0KKyAgICB9CisgIAorICAvKiBBbGwgcmVnaXN0ZXJzIGFyZSB2YWxpZCwgaWYgbm90IHJldHVybmVkIHlldCAqLworICByZWdpc3RlcnNfZmV0Y2hlZCAoKTsKK30KKworLyogU3RvcmUgZ2RiJ3MgdmlldyBvZiByZWdpc3RlcnMgdG8gdGhlIHRocmVhZC4KKyAqIEFsbCByZWdpc3RlcnMgYXJlIGFsd2F5cyB2YWxpZCB3aGVuIGVudGVyaW5nIGhlcmUuCisgKiBAQCBhaGVtLCBtYXliZSB0aGF0IGlzIHRvbyBzdHJpY3QsIHdlIGNvdWxkIHZhbGlkYXRlIHRoZSBuZWNlc3Nhcnkgb25lcworICogICAgaGVyZS4KKyAqCisgKiBIbW0uIEl0IHNlZW1zIHRoYXQgZ2RiIHNldCAkcmVnPXZhbHVlIGNvbW1hbmQgZmlyc3QgcmVhZHMgZXZlcnl0aGluZywKKyAqIHRoZW4gc2V0cyB0aGUgcmVnIGFuZCB0aGVuIHN0b3JlcyBldmVyeXRoaW5nLiAtPiB3ZSBtdXN0IG1ha2Ugc3VyZQorICogdGhhdCB0aGUgaW1tdXRhYmxlIHJlZ2lzdGVycyBhcmUgbm90IGNoYW5nZWQgYnkgcmVhZGluZyB0aGVtIGZpcnN0LgorICovCisKK3ZvaWQKK3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIHJlZ2lzdGVyIGludCByZWdubzsKK3sKKyAgdGhyZWFkX3N0YXRlX2RhdGFfdCBzdGF0ZTsKKyAga2Vybl9yZXR1cm5fdCByZXQ7CisgIAorICBpZiAoISBNQUNIX1BPUlRfVkFMSUQgKGN1cnJlbnRfdGhyZWFkKSkKKyAgICBlcnJvciAoInN0b3JlIGluZmVyaW9yIHJlZ2lzdGVyczogSW52YWxpZCB0aHJlYWQiKTsKKyAgCisgIC8qIENoZWNrIGZvciByZWFkIG9ubHkgcmVncy4KKyAgICogQEAgSWYgc29tZSBvZiB0aGVzZSBpcyBjYW4gYmUgY2hhbmdlZCwgZml4IHRoaXMKKyAgICovCisgIGlmIChyZWdubyA9PSBaRVJPX1JFR05VTQl8fAorICAgICAgcmVnbm8gPT0gUFNfUkVHTlVNCXx8CisgICAgICByZWdubyA9PSBCQURWQUREUl9SRUdOVU0JfHwKKyAgICAgIHJlZ25vID09IENBVVNFX1JFR05VTQl8fAorICAgICAgcmVnbm8gPT0gRkNSSVJfUkVHTlVNKQorICAgIHsKKyAgICAgIG1lc3NhZ2UgKCJZb3UgY2FuIG5vdCBhbHRlciByZWFkLW9ubHkgcmVnaXN0ZXIgYCVzJyIsCisJICAgICAgIFJFR0lTVEVSX05BTUUgKCByZWdubyApKTsKKyAgICAgIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAocmVnbm8gPT0gLTEpCisgICAgeworICAgICAgLyogRG9uJ3QgYWxsb3cgdGhlc2UgdG8gY2hhbmdlICovCisKKyAgICAgIC8qIFpFUk9fUkVHTlVNICovCisgICAgICAqKGludCAqKXJlZ2lzdGVycyA9IDA7CisgICAgICAKKyAgICAgIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoUFNfUkVHTlVNKTsKKyAgICAgIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoQkFEVkFERFJfUkVHTlVNKTsKKyAgICAgIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoQ0FVU0VfUkVHTlVNKTsKKyAgICAgIGZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoRkNSSVJfUkVHTlVNKTsKKyAgICB9CisKKyAgaWYgKHJlZ25vID09IC0xIHx8IChaRVJPX1JFR05VTSA8IHJlZ25vICYmIHJlZ25vIDw9IFBDX1JFR05VTSkpCisgICAgeworI2lmIDEKKyAgICAgIC8qIE1hY2ggMy4wIHNhdmVzIHRocmVhZCdzIEZQIHRvIE1BQ0hfRlBfUkVHTlVNLgorICAgICAgICogR0RCIHdhbnRzIGFzc2lnbnMgYSBwc2V1ZG8gcmVnaXN0ZXIgRlBfUkVHTlVNIGZvciBmcmFtZSBwb2ludGVyLgorICAgICAgICoKKyAgICAgICAqIEBAQCBIZXJlIEkgYXNzdW1lICghKSB0aGF0IGdkYidzIEZQIGhhcyB0aGUgdmFsdWUgdGhhdAorICAgICAgICogICAgIHNob3VsZCBnbyB0byB0aHJlYWRzIGZyYW1lIHBvaW50ZXIuIElmIG5vdCB0cnVlLCB0aGlzCisgICAgICAgKiAgICAgZmFpbHMgYmFkbHkhISEhIQorICAgICAgICovCisgICAgICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoTUFDSF9GUF9SRUdOVU0pXSwKKwkgICAgICAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQX1JFR05VTSldLAorCSAgICAgIFJFR0lTVEVSX1JBV19TSVpFIChGUF9SRUdOVU0pKTsKKyNlbmRpZgorICAgICAgCisgICAgICAvKiBTYXZlIGdkYidzIHJlZ3MgMS4uMzEgdG8gdGhyZWFkIHNhdmVkIHJlZ3MgMS4uMzEKKyAgICAgICAqIEx1Y2tpbHksIHRoZXkgYXJlIGNvbnRpcXVvdXMKKyAgICAgICAqLworICAgICAgU1RPUkVfUkVHUyAoc3RhdGUsIDEsIDMxKTsKKworICAgICAgLyogU2F2ZSBtZGxvLCBtZGhpICovCisgICAgICBTVE9SRV9SRUdTIChzdGF0ZSwgTE9fUkVHTlVNLCAyKTsKKworICAgICAvKiBTYXZlIFBDICovCisgICAgICBTVE9SRV9SRUdTIChzdGF0ZSwgUENfUkVHTlVNLCAxKTsKKworICAgICAgcmV0ID0gdGhyZWFkX3NldF9zdGF0ZSAoY3VycmVudF90aHJlYWQsCisJCQkgICAgICBNSVBTX1RIUkVBRF9TVEFURSwKKwkJCSAgICAgIHN0YXRlLAorCQkJICAgICAgTUlQU19GTE9BVF9TVEFURV9DT1VOVCk7CisgICAgICBDSEsgKCJzdG9yZSBpbmZlcmlvciByZWdzIDogdGhyZWFkX3NldF9zdGF0ZSIsIHJldCk7CisgICAgfQorICAKKyAgaWYgKHJlZ25vID09IC0xIHx8IHJlZ25vID49IEZQMF9SRUdOVU0pCisgICAgeworICAgICAgLyogSWYgdGhyZWFkIGhhcyBmbG9hdGluZyBzdGF0ZSwgc2F2ZSBpdCAqLworICAgICAgaWYgKHJlYWRfcmVnaXN0ZXIgKFBTX1JFR05VTSkgJiBNSVBTX1NUQVRVU19VU0VfQ09QMSkKKwl7CisJICAvKiBEbyBOT1Qgc2F2ZSBGQ1JJUl9SRUdOVU0gKi8KKwkgIFNUT1JFX1JFR1MgKHN0YXRlLCBGUDBfUkVHTlVNLCAzMyk7CisJCisJICByZXQgPSB0aHJlYWRfc2V0X3N0YXRlIChjdXJyZW50X3RocmVhZCwKKwkJCQkgIE1JUFNfRkxPQVRfU1RBVEUsCisJCQkJICBzdGF0ZSwKKwkJCQkgIE1JUFNfRkxPQVRfU1RBVEVfQ09VTlQpOworCSAgQ0hLICgic3RvcmUgaW5mZXJpb3IgcmVnaXN0ZXJzIChmbG9hdHMpOiB0aHJlYWRfc2V0X3N0YXRlIiwgcmV0KTsKKwl9CisgICAgICBlbHNlIGlmIChyZWdubyAhPSAtMSkKKwltZXNzYWdlCisJICAoIlRocmVhZCBkb2VzIG5vdCB1c2UgZmxvYXRpbmcgcG9pbnQgdW5pdCwgZmxvYXRpbmcgcmVncyBub3Qgc2F2ZWQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9nZGIvbWlwc3JlYWQuYyBiL2dkYi9taXBzcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNGMyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbWlwc3JlYWQuYwpAQCAtMCwwICsxLDQ0NiBAQAorLyogUmVhZCBhIHN5bWJvbCB0YWJsZSBpbiBNSVBTJyBmb3JtYXQgKFRoaXJkLUV5ZSkuCisgICBDb3B5cmlnaHQgMTk4NiwgODcsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBBbGVzc2FuZHJvIEZvcmluIChhZkBjcy5jbXUuZWR1KSBhdCBDTVUuICBNYWpvciB3b3JrCisgICBieSBQZXIgQm90aG5lciwgSm9obiBHaWxtb3JlIGFuZCBJYW4gTGFuY2UgVGF5bG9yIGF0IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFJlYWQgc3ltYm9scyBmcm9tIGFuIEVDT0ZGIGZpbGUuICBNb3N0IG9mIHRoZSB3b3JrIGlzIGRvbmUgaW4KKyAgIG1kZWJ1Z3JlYWQuYy4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIKKyNpbmNsdWRlICJvYmpmaWxlcy5oIgorI2luY2x1ZGUgImJ1aWxkc3ltLmgiCisjaW5jbHVkZSAic3RhYnNyZWFkLmgiCisjaW5jbHVkZSAiZ2RiLXN0YWJzLmgiCisKKyNpbmNsdWRlICJjb2ZmL3N5bS5oIgorI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCisjaW5jbHVkZSAibGliY29mZi5oIgkJLyogUHJpdmF0ZSBCRkQgQ09GRiBpbmZvcm1hdGlvbi4gICovCisjaW5jbHVkZSAibGliZWNvZmYuaCIJCS8qIFByaXZhdGUgQkZEIEVDT0ZGIGluZm9ybWF0aW9uLiAgKi8KKyNpbmNsdWRlICJlbGYvY29tbW9uLmgiCisjaW5jbHVkZSAiZWxmL21pcHMuaCIKKworc3RhdGljIHZvaWQKK21pcHNjb2ZmX25ld19pbml0IFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQKK21pcHNjb2ZmX3N5bWZpbGVfaW5pdCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCittaXBzY29mZl9zeW1maWxlX3JlYWQgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqLAorCQkJICAgICAgIGludCkpOworCitzdGF0aWMgdm9pZAorbWlwc2NvZmZfc3ltZmlsZV9maW5pc2ggUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZAorcmVhZF9hbHBoYWNvZmZfZHluYW1pY19zeW10YWIgUEFSQU1TICgoc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSkpOworCisvKiBJbml0aWFsaXplIGFueXRoaW5nIHRoYXQgbmVlZHMgaW5pdGlhbGl6aW5nIHdoZW4gYSBjb21wbGV0ZWx5IG5ldworICAgc3ltYm9sIGZpbGUgaXMgc3BlY2lmaWVkIChub3QganVzdCBhZGRpbmcgc29tZSBzeW1ib2xzIGZyb20gYW5vdGhlcgorICAgZmlsZSwgZS5nLiBhIHNoYXJlZCBsaWJyYXJ5KS4gICovCisKK2V4dGVybiBDT1JFX0FERFIgc2lndHJhbXBfYWRkcmVzczsKKworc3RhdGljIHZvaWQKK21pcHNjb2ZmX25ld19pbml0IChpZ25vcmUpCisgICAgIHN0cnVjdCBvYmpmaWxlICppZ25vcmU7Cit7CisgIHNpZ3RyYW1wX2FkZHJlc3MgPSAwOworICBzdGFic3JlYWRfbmV3X2luaXQgKCk7CisgIGJ1aWxkc3ltX25ld19pbml0ICgpOworfQorCisvKiBJbml0aWFsaXplIHRvIHJlYWQgYSBzeW1ib2wgZmlsZSAobm90aGluZyB0byBkbykuICAqLworCitzdGF0aWMgdm9pZAorbWlwc2NvZmZfc3ltZmlsZV9pbml0IChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKK30KKworLyogUmVhZCBhIHN5bWJvbCBmaWxlIGZyb20gYSBmaWxlLiAgKi8KKworc3RhdGljIHZvaWQKK21pcHNjb2ZmX3N5bWZpbGVfcmVhZCAob2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzLCBtYWlubGluZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKyAgICAgaW50IG1haW5saW5lOworeworICBiZmQgKmFiZmQgPSBvYmpmaWxlLT5vYmZkOworICBzdHJ1Y3QgY2xlYW51cCAqIGJhY2tfdG87CisKKyAgaW5pdF9taW5pbWFsX3N5bWJvbF9jb2xsZWN0aW9uICgpOworICBiYWNrX3RvID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGRpc2NhcmRfbWluaW1hbF9zeW1ib2xzLCAwKTsKKworICAvKiBOb3cgdGhhdCB0aGUgZXhlY3V0YWJsZSBmaWxlIGlzIHBvc2l0aW9uZWQgYXQgc3ltYm9sIHRhYmxlLAorICAgICBwcm9jZXNzIGl0IGFuZCBkZWZpbmUgc3ltYm9scyBhY2NvcmRpbmdseS4gICovCisKKyAgaWYgKCEoKCplY29mZl9iYWNrZW5kIChhYmZkKS0+ZGVidWdfc3dhcC5yZWFkX2RlYnVnX2luZm8pCisJKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLCAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8pKSkKKyAgICBlcnJvciAoIkVycm9yIHJlYWRpbmcgc3ltYm9sIHRhYmxlOiAlcyIsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKworICBtZGVidWdfYnVpbGRfcHN5bXRhYnMgKG9iamZpbGUsICZlY29mZl9iYWNrZW5kIChhYmZkKS0+ZGVidWdfc3dhcCwKKwkJCSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8sIHNlY3Rpb25fb2Zmc2V0cyk7CisKKyAgLyogQWRkIGFscGhhIGNvZmYgZHluYW1pYyBzeW1ib2xzLiAgKi8KKworICByZWFkX2FscGhhY29mZl9keW5hbWljX3N5bXRhYiAoc2VjdGlvbl9vZmZzZXRzLCBvYmpmaWxlKTsKKworICAvKiBJbnN0YWxsIGFueSBtaW5pbWFsIHN5bWJvbHMgdGhhdCBoYXZlIGJlZW4gY29sbGVjdGVkIGFzIHRoZSBjdXJyZW50CisgICAgIG1pbmltYWwgc3ltYm9scyBmb3IgdGhpcyBvYmpmaWxlLiAqLworCisgIGluc3RhbGxfbWluaW1hbF9zeW1ib2xzIChvYmpmaWxlKTsKKworICAvKiBJZiB0aGUgZW50cnlfZmlsZSBib3VuZHMgYXJlIHN0aWxsIHVua25vd24gYWZ0ZXIgcHJvY2Vzc2luZyB0aGUKKyAgICAgcGFydGlhbCBzeW1ib2xzLCB0aGVuIHRyeSB0byBzZXQgdGhlbSBmcm9tIHRoZSBtaW5pbWFsIHN5bWJvbHMKKyAgICAgc3Vycm91bmRpbmcgdGhlIGVudHJ5X3BvaW50LiAgKi8KKworICBpZiAobWFpbmxpbmUKKyAgICAgICYmIG9iamZpbGUtPmVpLmVudHJ5X3BvaW50ICE9IElOVkFMSURfRU5UUllfUE9JTlQKKyAgICAgICYmIG9iamZpbGUtPmVpLmVudHJ5X2ZpbGVfbG93cGMgPT0gSU5WQUxJRF9FTlRSWV9MT1dQQykKKyAgICB7CisgICAgICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm07CisKKyAgICAgIG0gPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGMgKG9iamZpbGUtPmVpLmVudHJ5X3BvaW50KTsKKyAgICAgIGlmIChtICYmIFNZTUJPTF9OQU1FIChtICsgMSkpCisJeworCSAgb2JqZmlsZS0+ZWkuZW50cnlfZmlsZV9sb3dwYyA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtKTsKKwkgIG9iamZpbGUtPmVpLmVudHJ5X2ZpbGVfaGlnaHBjID0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG0gKyAxKTsKKwl9CisgICAgfQorCisgIGRvX2NsZWFudXBzIChiYWNrX3RvKTsKK30KKworLyogUGVyZm9ybSBhbnkgbG9jYWwgY2xlYW51cHMgcmVxdWlyZWQgd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIGEKKyAgIHBhcnRpY3VsYXIgb2JqZmlsZS4gICovCisKK3N0YXRpYyB2b2lkCittaXBzY29mZl9zeW1maWxlX2ZpbmlzaCAob2JqZmlsZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7Cit9CisKKy8qIEFscGhhIE9TRi8xIGVuY2Fwc3VsYXRlcyB0aGUgZHluYW1pYyBzeW1ib2xzIGluIEVMRiBmb3JtYXQgaW4gYQorICAgc3RhbmRhcmQgY29mZiBzZWN0aW9uLiAgVGhlIEVMRiBmb3JtYXQgZm9yIHRoZSBzeW1ib2xzIGRpZmZlcnMgZnJvbQorICAgdGhlIGZvcm1hdCBkZWZpbmVkIGluIGVsZi9leHRlcm5hbC5oLiBJdCBzZWVtcyB0aGF0IGEgbm9ybWFsIEVMRiAzMiBiaXQKKyAgIGZvcm1hdCBpcyB1c2VkLCBhbmQgdGhlIHJlcHJlc2VudGF0aW9uIG9ubHkgY2hhbmdlcyBiZWNhdXNlIGxvbmdzIGFyZQorICAgNjQgYml0IG9uIHRoZSBhbHBoYS4gSW4gYWRkaXRpb24sIHRoZSBoYW5kbGluZyBvZiB0ZXh0L2RhdGEgc2VjdGlvbgorICAgaW5kaWNlcyBmb3Igc3ltYm9scyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgRUxGIEFCSS4KKyAgIEFzIHRoZSBCRkQgbGlua2VyIGN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IGR5bmFtaWMgbGlua2luZyBvbiB0aGUgYWxwaGEsCisgICB0aGVyZSBzZWVtcyB0byBiZSBubyByZWFzb24gdG8gcG9sbHV0ZSBCRkQgd2l0aCBhbm90aGVyIG1peHR1cmUgb2Ygb2JqZWN0CisgICBmaWxlIGZvcm1hdHMgZm9yIG5vdy4gICovCisKKy8qIEZvcm1hdCBvZiBhbiBhbHBoYSBleHRlcm5hbCBFTEYgc3ltYm9sLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBjaGFyCXN0X25hbWVbNF07CQkvKiBTeW1ib2wgbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLworICB1bnNpZ25lZCBjaGFyCXN0X3BhZFs0XTsJCS8qIFBhZCB0byBsb25nIHdvcmQgYm91bmRhcnkgKi8KKyAgdW5zaWduZWQgY2hhcglzdF92YWx1ZVs4XTsJCS8qIFZhbHVlIG9mIHRoZSBzeW1ib2wgKi8KKyAgdW5zaWduZWQgY2hhcglzdF9zaXplWzRdOwkJLyogQXNzb2NpYXRlZCBzeW1ib2wgc2l6ZSAqLworICB1bnNpZ25lZCBjaGFyCXN0X2luZm9bMV07CQkvKiBUeXBlIGFuZCBiaW5kaW5nIGF0dHJpYnV0ZXMgKi8KKyAgdW5zaWduZWQgY2hhcglzdF9vdGhlclsxXTsJCS8qIE5vIGRlZmluZWQgbWVhbmluZywgMCAqLworICB1bnNpZ25lZCBjaGFyCXN0X3NobmR4WzJdOwkJLyogQXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCit9IEVsZmFscGhhX0V4dGVybmFsX1N5bTsKKworLyogRm9ybWF0IG9mIGFuIGFscGhhIGV4dGVybmFsIEVMRiBkeW5hbWljIGluZm8gc3RydWN0dXJlLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBjaGFyCWRfdGFnWzRdOwkJLyogVGFnICovCisgIHVuc2lnbmVkIGNoYXIJZF9wYWRbNF07CQkvKiBQYWQgdG8gbG9uZyB3b3JkIGJvdW5kYXJ5ICovCisgIHVuaW9uIHsKKyAgICB1bnNpZ25lZCBjaGFyIGRfcHRyWzhdOwkJLyogUG9pbnRlciB2YWx1ZSAqLworICAgIHVuc2lnbmVkIGNoYXIgZF92YWxbNF07CQkvKiBJbnRlZ2VyIHZhbHVlICovCisgIH0gZF91bjsKK30gRWxmYWxwaGFfRXh0ZXJuYWxfRHluOworCisvKiBTdHJ1Y3QgdG8gb2J0YWluIHRoZSBzZWN0aW9uIHBvaW50ZXJzIGZvciBhbHBoYSBkeW5hbWljIHN5bWJvbCBpbmZvLiAgKi8KKworc3RydWN0IGFscGhhY29mZl9keW5zZWNpbmZvIHsKKyAgYXNlY3Rpb24gKnN5bV9zZWN0OwkJLyogU2VjdGlvbiBwb2ludGVyIGZvciAuZHluc3ltIHNlY3Rpb24gKi8KKyAgYXNlY3Rpb24gKnN0cl9zZWN0OwkJLyogU2VjdGlvbiBwb2ludGVyIGZvciAuZHluc3RyIHNlY3Rpb24gKi8KKyAgYXNlY3Rpb24gKmR5bmluZm9fc2VjdDsJLyogU2VjdGlvbiBwb2ludGVyIGZvciAuZHluYW1pYyBzZWN0aW9uICovCisgIGFzZWN0aW9uICpnb3Rfc2VjdDsJCS8qIFNlY3Rpb24gcG9pbnRlciBmb3IgLmdvdCBzZWN0aW9uICovCit9OworCitzdGF0aWMgdm9pZAorYWxwaGFjb2ZmX2xvY2F0ZV9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgdm9pZCAqKSk7CisKKy8qIFdlIGFyZSBjYWxsZWQgb25jZSBwZXIgc2VjdGlvbiBmcm9tIHJlYWRfYWxwaGFjb2ZmX2R5bmFtaWNfc3ltdGFiLgorICAgV2UgbmVlZCB0byBleGFtaW5lIGVhY2ggc2VjdGlvbiB3ZSBhcmUgcGFzc2VkLCBjaGVjayB0byBzZWUKKyAgIGlmIGl0IGlzIHNvbWV0aGluZyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBwcm9jZXNzaW5nLCBhbmQKKyAgIGlmIHNvLCBzdGFzaCBhd2F5IHNvbWUgYWNjZXNzIGluZm9ybWF0aW9uIGZvciB0aGUgc2VjdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCithbHBoYWNvZmZfbG9jYXRlX3NlY3Rpb25zIChpZ25vcmVfYWJmZCwgc2VjdHAsIHNpcCkKKyAgICAgYmZkICppZ25vcmVfYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3RwOworICAgICBQVFIgc2lwOworeworICByZWdpc3RlciBzdHJ1Y3QgYWxwaGFjb2ZmX2R5bnNlY2luZm8gKnNpOworCisgIHNpID0gKHN0cnVjdCBhbHBoYWNvZmZfZHluc2VjaW5mbyAqKSBzaXA7CisKKyAgaWYgKFNUUkVRIChzZWN0cC0+bmFtZSwgIi5keW5zeW0iKSkKKyAgICB7CisgICAgICBzaS0+c3ltX3NlY3QgPSBzZWN0cDsKKyAgICB9CisgIGVsc2UgaWYgKFNUUkVRIChzZWN0cC0+bmFtZSwgIi5keW5zdHIiKSkKKyAgICB7CisgICAgICBzaS0+c3RyX3NlY3QgPSBzZWN0cDsKKyAgICB9CisgIGVsc2UgaWYgKFNUUkVRIChzZWN0cC0+bmFtZSwgIi5keW5hbWljIikpCisgICAgeworICAgICAgc2ktPmR5bmluZm9fc2VjdCA9IHNlY3RwOworICAgIH0KKyAgZWxzZSBpZiAoU1RSRVEgKHNlY3RwLT5uYW1lLCAiLmdvdCIpKQorICAgIHsKKyAgICAgIHNpLT5nb3Rfc2VjdCA9IHNlY3RwOworICAgIH0KK30KKworLyogU2NhbiBhbiBhbHBoYSBkeW5hbWljIHN5bWJvbCB0YWJsZSBmb3Igc3ltYm9scyBvZiBpbnRlcmVzdCBhbmQKKyAgIGFkZCB0aGVtIHRvIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZS4gICovCisKK3N0YXRpYyB2b2lkCityZWFkX2FscGhhY29mZl9keW5hbWljX3N5bXRhYiAoc2VjdGlvbl9vZmZzZXRzLCBvYmpmaWxlKQorICAgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHM7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBiZmQgKmFiZmQgPSBvYmpmaWxlLT5vYmZkOworICBzdHJ1Y3QgYWxwaGFjb2ZmX2R5bnNlY2luZm8gc2k7CisgIGNoYXIgKnN5bV9zZWNwdHI7CisgIGNoYXIgKnN0cl9zZWNwdHI7CisgIGNoYXIgKmR5bmluZm9fc2VjcHRyOworICBjaGFyICpnb3Rfc2VjcHRyOworICBiZmRfc2l6ZV90eXBlIHN5bV9zZWNzaXplOworICBiZmRfc2l6ZV90eXBlIHN0cl9zZWNzaXplOworICBiZmRfc2l6ZV90eXBlIGR5bmluZm9fc2Vjc2l6ZTsKKyAgYmZkX3NpemVfdHlwZSBnb3Rfc2Vjc2l6ZTsKKyAgaW50IHN5bV9jb3VudDsKKyAgaW50IGk7CisgIGludCBzdHJpcHBlZDsKKyAgRWxmYWxwaGFfRXh0ZXJuYWxfU3ltICp4X3N5bXA7CisgIGNoYXIgKmR5bmluZm9fcDsKKyAgY2hhciAqZHluaW5mb19lbmQ7CisgIGludCBnb3RfZW50cnlfc2l6ZSA9IDg7CisgIGludCBkdF9taXBzX2xvY2FsX2dvdG5vID0gLTE7CisgIGludCBkdF9taXBzX2dvdHN5bSA9IC0xOworCisKKyAgLyogV2UgY3VycmVudGx5IG9ubHkga25vdyBob3cgdG8gaGFuZGxlIGFscGhhIGR5bmFtaWMgc3ltYm9scy4gICovCisgIGlmIChiZmRfZ2V0X2FyY2ggKGFiZmQpICE9IGJmZF9hcmNoX2FscGhhKQorICAgIHJldHVybjsKKworICAvKiBMb2NhdGUgdGhlIGR5bmFtaWMgc3ltYm9scyBzZWN0aW9ucyBhbmQgcmVhZCB0aGVtIGluLiAgKi8KKyAgbWVtc2V0ICgoY2hhciAqKSAmc2ksIDAsIHNpemVvZiAoc2kpKTsKKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBhbHBoYWNvZmZfbG9jYXRlX3NlY3Rpb25zLCAoUFRSKSAmc2kpOworICBpZiAoc2kuc3ltX3NlY3QgPT0gTlVMTAorICAgICAgfHwgc2kuc3RyX3NlY3QgPT0gTlVMTAorICAgICAgfHwgc2kuZHluaW5mb19zZWN0ID09IE5VTEwKKyAgICAgIHx8IHNpLmdvdF9zZWN0ID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIHN5bV9zZWNzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzaS5zeW1fc2VjdCk7CisgIHN0cl9zZWNzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzaS5zdHJfc2VjdCk7CisgIGR5bmluZm9fc2Vjc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2kuZHluaW5mb19zZWN0KTsKKyAgZ290X3NlY3NpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNpLmdvdF9zZWN0KTsKKyAgc3ltX3NlY3B0ciA9IGFsbG9jYSAoc3ltX3NlY3NpemUpOworICBzdHJfc2VjcHRyID0gYWxsb2NhIChzdHJfc2Vjc2l6ZSk7CisgIGR5bmluZm9fc2VjcHRyID0gYWxsb2NhIChkeW5pbmZvX3NlY3NpemUpOworICBnb3Rfc2VjcHRyID0gYWxsb2NhIChnb3Rfc2Vjc2l6ZSk7CisKKyAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNpLnN5bV9zZWN0LCBzeW1fc2VjcHRyLAorCQkJCSAoZmlsZV9wdHIpMCwgc3ltX3NlY3NpemUpKQorICAgIHJldHVybjsKKyAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNpLnN0cl9zZWN0LCBzdHJfc2VjcHRyLAorCQkJCSAoZmlsZV9wdHIpMCwgc3RyX3NlY3NpemUpKQorICAgIHJldHVybjsKKyAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNpLmR5bmluZm9fc2VjdCwgZHluaW5mb19zZWNwdHIsCisJCQkJIChmaWxlX3B0cikwLCBkeW5pbmZvX3NlY3NpemUpKQorICAgIHJldHVybjsKKyAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNpLmdvdF9zZWN0LCBnb3Rfc2VjcHRyLAorCQkJCSAoZmlsZV9wdHIpMCwgZ290X3NlY3NpemUpKQorICAgIHJldHVybjsKKworICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgbG9jYWwgR09UIGVudHJpZXMgYW5kIHRoZSBpbmRleCBmb3IgdGhlCisgICAgIHRoZSBmaXJzdCBkeW5hbWljIHN5bWJvbCBpbiB0aGUgR09ULiAqLworICBmb3IgKGR5bmluZm9fcCA9IGR5bmluZm9fc2VjcHRyLCBkeW5pbmZvX2VuZCA9IGR5bmluZm9fcCArIGR5bmluZm9fc2Vjc2l6ZTsKKyAgICAgICBkeW5pbmZvX3AgPCBkeW5pbmZvX2VuZDsKKyAgICAgICBkeW5pbmZvX3AgKz0gc2l6ZW9mIChFbGZhbHBoYV9FeHRlcm5hbF9EeW4pKQorICAgIHsKKyAgICAgIEVsZmFscGhhX0V4dGVybmFsX0R5biAqeF9keW5wID0gKEVsZmFscGhhX0V4dGVybmFsX0R5biAqKWR5bmluZm9fcDsKKyAgICAgIGxvbmcgZHluX3RhZzsKKworICAgICAgZHluX3RhZyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHhfZHlucC0+ZF90YWcpOworICAgICAgaWYgKGR5bl90YWcgPT0gRFRfTlVMTCkKKwlicmVhazsKKyAgICAgIGVsc2UgaWYgKGR5bl90YWcgPT0gRFRfTUlQU19MT0NBTF9HT1ROTykKKwl7CisJICBpZiAoZHRfbWlwc19sb2NhbF9nb3RubyA8IDApCisJICAgIGR0X21pcHNfbG9jYWxfZ290bm8KKwkgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHhfZHlucC0+ZF91bi5kX3ZhbCk7CisJfQorICAgICAgZWxzZSBpZiAoZHluX3RhZyA9PSBEVF9NSVBTX0dPVFNZTSkKKwl7CisJICBpZiAoZHRfbWlwc19nb3RzeW0gPCAwKQorCSAgICBkdF9taXBzX2dvdHN5bQorCSAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgeF9keW5wLT5kX3VuLmRfdmFsKTsKKwl9CisgICAgfQorICBpZiAoZHRfbWlwc19sb2NhbF9nb3RubyA8IDAgfHwgZHRfbWlwc19nb3RzeW0gPCAwKQorICAgIHJldHVybjsKKworICAvKiBTY2FuIGFsbCBkeW5hbWljIHN5bWJvbHMgYW5kIGVudGVyIHRoZW0gaW50byB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGUKKyAgICAgaWYgYXBwcm9wcmlhdGUuICAqLworICBzeW1fY291bnQgPSBzeW1fc2Vjc2l6ZSAvIHNpemVvZiAoRWxmYWxwaGFfRXh0ZXJuYWxfU3ltKTsKKyAgc3RyaXBwZWQgPSAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCk7CisKKyAgLyogU2tpcCBmaXJzdCBzeW1ib2wsIHdoaWNoIGlzIGEgbnVsbCBkdW1teS4gICovCisgIGZvciAoaSA9IDEsIHhfc3ltcCA9IChFbGZhbHBoYV9FeHRlcm5hbF9TeW0gKikgc3ltX3NlY3B0ciArIDE7CisgICAgICAgaSA8IHN5bV9jb3VudDsKKyAgICAgICBpKyssIHhfc3ltcCsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgc3RyeDsKKyAgICAgIGNoYXIgKm5hbWU7CisgICAgICBiZmRfdm1hIHN5bV92YWx1ZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgc3ltX2luZm87CisgICAgICB1bnNpZ25lZCBpbnQgc3ltX3NobmR4OworICAgICAgaW50IGlzZ2xvYmFsOworICAgICAgZW51bSBtaW5pbWFsX3N5bWJvbF90eXBlIG1zX3R5cGU7CisKKyAgICAgIHN0cnggPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSB4X3N5bXAtPnN0X25hbWUpOworICAgICAgaWYgKHN0cnggPj0gc3RyX3NlY3NpemUpCisJY29udGludWU7CisgICAgICBuYW1lID0gc3RyX3NlY3B0ciArIHN0cng7CisgICAgICBpZiAoKm5hbWUgPT0gJ1wwJyB8fCAqbmFtZSA9PSAnLicpCisJY29udGludWU7CisKKyAgICAgIHN5bV92YWx1ZSA9IGJmZF9oX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIHhfc3ltcC0+c3RfdmFsdWUpOworICAgICAgc3ltX2luZm8gPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHhfc3ltcC0+c3RfaW5mbyk7CisgICAgICBzeW1fc2huZHggPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSB4X3N5bXAtPnN0X3NobmR4KTsKKyAgICAgIGlzZ2xvYmFsID0gKEVMRl9TVF9CSU5EIChzeW1faW5mbykgPT0gU1RCX0dMT0JBTCk7CisKKyAgICAgIGlmIChzeW1fc2huZHggPT0gU0hOX1VOREVGKQorCXsKKwkgIC8qIEhhbmRsZSB1bmRlZmluZWQgZnVuY3Rpb25zIHdoaWNoIGFyZSBkZWZpbmVkIGluIGEgc2hhcmVkCisJICAgICBsaWJyYXJ5LiAgKi8KKwkgIGlmIChFTEZfU1RfVFlQRSAoc3ltX2luZm8pICE9IFNUVF9GVU5DCisJICAgICAgfHwgRUxGX1NUX0JJTkQgKHN5bV9pbmZvKSAhPSBTVEJfR0xPQkFMKQorCSAgICBjb250aW51ZTsKKworCSAgbXNfdHlwZSA9IG1zdF9zb2xpYl90cmFtcG9saW5lOworCisJICAvKiBJZiBzeW1fdmFsdWUgaXMgbm9uemVybywgaXQgcG9pbnRzIHRvIHRoZSBzaGFyZWQgbGlicmFyeQorCSAgICAgdHJhbXBvbGluZSBlbnRyeSwgd2hpY2ggaXMgd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IuCisKKwkgICAgIElmIHN5bV92YWx1ZSBpcyB6ZXJvLCB0aGVuIHdlIGhhdmUgdG8gZ2V0IHRoZSBHT1QgZW50cnkKKwkgICAgIGZvciB0aGUgc3ltYm9sLgorCSAgICAgSWYgdGhlIEdPVCBlbnRyeSBpcyBub256ZXJvLCBpdCByZXByZXNlbnRzIHRoZSBxdWlja3N0YXJ0CisJICAgICBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbiBhbmQgd2UgdXNlIHRoYXQgYXMgdGhlIHN5bWJvbCB2YWx1ZS4KKworCSAgICAgSWYgdGhlIEdPVCBlbnRyeSBpcyB6ZXJvLCB0aGUgZnVuY3Rpb24gYWRkcmVzcyBoYXMgdG8gYmUgcmVzb2x2ZWQKKwkgICAgIGJ5IHRoZSBydW50aW1lIGxvYWRlciBiZWZvcmUgdGhlIGV4ZWN1dGFibGUgaXMgc3RhcnRlZC4KKwkgICAgIFdlIGFyZSB1bmFibGUgdG8gZmluZCBhbnkgbWVhbmluZ2Z1bCBhZGRyZXNzIGZvciB0aGVzZQorCSAgICAgZnVuY3Rpb25zIGluIHRoZSBleGVjdXRhYmxlIGZpbGUsIHNvIHdlIHNraXAgdGhlbS4gICovCisJICBpZiAoc3ltX3ZhbHVlID09IDApCisJICAgIHsKKwkgICAgICBpbnQgZ290X2VudHJ5X29mZnNldCA9CisJCShpIC0gZHRfbWlwc19nb3RzeW0gKyBkdF9taXBzX2xvY2FsX2dvdG5vKSAqIGdvdF9lbnRyeV9zaXplOworCisJICAgICAgaWYgKGdvdF9lbnRyeV9vZmZzZXQgPCAwIHx8IGdvdF9lbnRyeV9vZmZzZXQgPj0gZ290X3NlY3NpemUpCisJCWNvbnRpbnVlOworCSAgICAgIHN5bV92YWx1ZSA9CisJCWJmZF9oX2dldF82NCAoYWJmZCwKKwkJCSAgICAgIChiZmRfYnl0ZSAqKSAoZ290X3NlY3B0ciArIGdvdF9lbnRyeV9vZmZzZXQpKTsKKwkgICAgICBpZiAoc3ltX3ZhbHVlID09IDApCisJCWNvbnRpbnVlOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFN5bWJvbHMgZGVmaW5lZCBpbiB0aGUgZXhlY3V0YWJsZSBpdHNlbGYuIFdlIG9ubHkgY2FyZSBhYm91dAorCSAgICAgdGhlbSBpZiB0aGlzIGlzIGEgc3RyaXBwZWQgZXhlY3V0YWJsZSwgb3RoZXJ3aXNlIHRoZXkgaGF2ZQorCSAgICAgYmVlbiByZXRyaWV2ZWQgZnJvbSB0aGUgbm9ybWFsIHN5bWJvbCB0YWJsZSBhbHJlYWR5LiAgKi8KKwkgIGlmICghc3RyaXBwZWQpCisJICAgIGNvbnRpbnVlOworCisJICBpZiAoc3ltX3NobmR4ID09IFNITl9NSVBTX1RFWFQpCisJICAgIHsKKwkgICAgICBpZiAoaXNnbG9iYWwpCisJCW1zX3R5cGUgPSBtc3RfdGV4dDsKKwkgICAgICBlbHNlCisJCW1zX3R5cGUgPSBtc3RfZmlsZV90ZXh0OworCSAgICAgIHN5bV92YWx1ZSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3ltX3NobmR4ID09IFNITl9NSVBTX0RBVEEpCisJICAgIHsKKwkgICAgICBpZiAoaXNnbG9iYWwpCisJCW1zX3R5cGUgPSBtc3RfZGF0YTsKKwkgICAgICBlbHNlCisJCW1zX3R5cGUgPSBtc3RfZmlsZV9kYXRhOworCSAgICAgIHN5bV92YWx1ZSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9EQVRBKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3ltX3NobmR4ID09IFNITl9NSVBTX0FDT01NT04pCisJICAgIHsKKwkgICAgICBpZiAoaXNnbG9iYWwpCisJCW1zX3R5cGUgPSBtc3RfYnNzOworCSAgICAgIGVsc2UKKwkJbXNfdHlwZSA9IG1zdF9maWxlX2JzczsKKwkgICAgICBzeW1fdmFsdWUgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfQlNTKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoc3ltX3NobmR4ID09IFNITl9BQlMpCisJICAgIHsKKwkgICAgICBtc190eXBlID0gbXN0X2FiczsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwl9CisKKyAgICAgIHByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9sIChuYW1lLCBzeW1fdmFsdWUsIG1zX3R5cGUsIG9iamZpbGUpOworICAgIH0KK30KKworLyogSW5pdGlhbGl6YXRpb24gKi8KKworc3RhdGljIHN0cnVjdCBzeW1fZm5zIGVjb2ZmX3N5bV9mbnMgPQoreworICBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIsCisgIG1pcHNjb2ZmX25ld19pbml0LAkJLyogc3ltX25ld19pbml0OiBpbml0IGFueXRoaW5nIGdibCB0byBlbnRpcmUgc3ltdGFiICovCisgIG1pcHNjb2ZmX3N5bWZpbGVfaW5pdCwJLyogc3ltX2luaXQ6IHJlYWQgaW5pdGlhbCBpbmZvLCBzZXR1cCBmb3Igc3ltX3JlYWQoKSAqLworICBtaXBzY29mZl9zeW1maWxlX3JlYWQsCS8qIHN5bV9yZWFkOiByZWFkIGEgc3ltYm9sIGZpbGUgaW50byBzeW10YWIgKi8KKyAgbWlwc2NvZmZfc3ltZmlsZV9maW5pc2gsCS8qIHN5bV9maW5pc2g6IGZpbmlzaGVkIHdpdGggZmlsZSwgY2xlYW51cCAqLworICBkZWZhdWx0X3N5bWZpbGVfb2Zmc2V0cywJLyogc3ltX29mZnNldHM6IGR1bW15IEZJWE1FIHRpbCBpbXBsZW0gc3ltIHJlbG9jICovCisgIE5VTEwJCQkJLyogbmV4dDogcG9pbnRlciB0byBuZXh0IHN0cnVjdCBzeW1fZm5zICovCit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9taXBzcmVhZCAoKQoreworICBhZGRfc3ltdGFiX2ZucyAoJmVjb2ZmX3N5bV9mbnMpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL21pcHN2NC1uYXQuYyBiL2dkYi9taXBzdjQtbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0YjZlOQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9taXBzdjQtbmF0LmMKQEAgLTAsMCArMSwxNTkgQEAKKy8qIE5hdGl2ZSBzdXBwb3J0IGZvciBNSVBTIHJ1bm5pbmcgU1ZSNCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4JCS8qIEZvciBKQl9YWFguICAqLworCisvKiBTaXplIG9mIGVsZW1lbnRzIGluIGptcGJ1ZiAqLworCisjZGVmaW5lIEpCX0VMRU1FTlRfU0laRSA0CisKKy8qCisgKiBTZWUgdGhlIGNvbW1lbnQgaW4gbTY4ay10ZGVwLmMgcmVnYXJkaW5nIHRoZSB1dGlsaXR5IG9mIHRoZXNlIGZ1bmN0aW9ucy4KKyAqCisgKiBUaGVzZSBkZWZpbml0aW9ucyBhcmUgZnJvbSB0aGUgTUlQUyBTVlI0IEFCSSwgc28gdGhleSBtYXkgd29yayBmb3IKKyAqIGFueSBNSVBTIFNWUjQgdGFyZ2V0LgorICovCisKK3ZvaWQgCitzdXBwbHlfZ3JlZ3NldCAoZ3JlZ3NldHApCisgICAgIGdyZWdzZXRfdCAqZ3JlZ3NldHA7Cit7CisgIHJlZ2lzdGVyIGludCByZWdpOworICByZWdpc3RlciBncmVnX3QgKnJlZ3AgPSAmKCpncmVnc2V0cClbMF07CisgIHN0YXRpYyBjaGFyIHplcm9idWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXSA9IHswfTsKKworICBmb3IgKHJlZ2kgPSAwOyByZWdpIDw9IENYVF9SQTsgcmVnaSsrKQorICAgIHN1cHBseV9yZWdpc3RlciAocmVnaSwgKGNoYXIgKikocmVncCArIHJlZ2kpKTsKKworICBzdXBwbHlfcmVnaXN0ZXIgKFBDX1JFR05VTSwgKGNoYXIgKikocmVncCArIENYVF9FUEMpKTsKKyAgc3VwcGx5X3JlZ2lzdGVyIChISV9SRUdOVU0sIChjaGFyICopKHJlZ3AgKyBDWFRfTURISSkpOworICBzdXBwbHlfcmVnaXN0ZXIgKExPX1JFR05VTSwgKGNoYXIgKikocmVncCArIENYVF9NRExPKSk7CisgIHN1cHBseV9yZWdpc3RlciAoQ0FVU0VfUkVHTlVNLCAoY2hhciAqKShyZWdwICsgQ1hUX0NBVVNFKSk7CisKKyAgLyogRmlsbCBpbmFjY2Vzc2libGUgcmVnaXN0ZXJzIHdpdGggemVyby4gICovCisgIHN1cHBseV9yZWdpc3RlciAoUFNfUkVHTlVNLCB6ZXJvYnVmKTsKKyAgc3VwcGx5X3JlZ2lzdGVyIChCQURWQUREUl9SRUdOVU0sIHplcm9idWYpOworICBzdXBwbHlfcmVnaXN0ZXIgKEZQX1JFR05VTSwgemVyb2J1Zik7CisgIHN1cHBseV9yZWdpc3RlciAoVU5VU0VEX1JFR05VTSwgemVyb2J1Zik7CisgIGZvciAocmVnaSA9IEZJUlNUX0VNQkVEX1JFR05VTTsgcmVnaSA8PSBMQVNUX0VNQkVEX1JFR05VTTsgcmVnaSsrKQorICAgIHN1cHBseV9yZWdpc3RlciAocmVnaSwgemVyb2J1Zik7Cit9CisKK3ZvaWQKK2ZpbGxfZ3JlZ3NldCAoZ3JlZ3NldHAsIHJlZ25vKQorICAgICBncmVnc2V0X3QgKmdyZWdzZXRwOworICAgICBpbnQgcmVnbm87Cit7CisgIGludCByZWdpOworICByZWdpc3RlciBncmVnX3QgKnJlZ3AgPSAmKCpncmVnc2V0cClbMF07CisKKyAgZm9yIChyZWdpID0gMDsgcmVnaSA8PSAzMjsgcmVnaSsrKQorICAgIGlmICgocmVnbm8gPT0gLTEpIHx8IChyZWdubyA9PSByZWdpKSkKKyAgICAgICoocmVncCArIHJlZ2kpID0gKihncmVnX3QgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdpKV07CisKKyAgaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IFBDX1JFR05VTSkpCisgICAgKihyZWdwICsgQ1hUX0VQQykgPSAqKGdyZWdfdCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKFBDX1JFR05VTSldOworCisgIGlmICgocmVnbm8gPT0gLTEpIHx8IChyZWdubyA9PSBDQVVTRV9SRUdOVU0pKQorICAgICoocmVncCArIENYVF9DQVVTRSkgPSAqKGdyZWdfdCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKENBVVNFX1JFR05VTSldOworCisgIGlmICgocmVnbm8gPT0gLTEpIHx8IChyZWdubyA9PSBISV9SRUdOVU0pKQorICAgICoocmVncCArIENYVF9NREhJKSA9ICooZ3JlZ190ICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoSElfUkVHTlVNKV07CisKKyAgaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IExPX1JFR05VTSkpCisgICAgKihyZWdwICsgQ1hUX01ETE8pID0gKihncmVnX3QgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChMT19SRUdOVU0pXTsKK30KKworLyoKKyAqIE5vdyB3ZSBkbyB0aGUgc2FtZSB0aGluZyBmb3IgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzLgorICogV2UgZG9uJ3QgYm90aGVyIHRvIGNvbmRpdGlvbiBvbiBGUDBfUkVHTlVNIHNpbmNlIGFueQorICogcmVhc29uYWJsZSBNSVBTIGNvbmZpZ3VyYXRpb24gaGFzIGFuIFIzMDEwIGluIGl0LgorICoKKyAqIEFnYWluLCBzZWUgdGhlIGNvbW1lbnRzIGluIG02OGstdGRlcC5jLgorICovCisKK3ZvaWQKK3N1cHBseV9mcHJlZ3NldCAoZnByZWdzZXRwKQorICAgICBmcHJlZ3NldF90ICpmcHJlZ3NldHA7Cit7CisgIHJlZ2lzdGVyIGludCByZWdpOworICBzdGF0aWMgY2hhciB6ZXJvYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV0gPSB7MH07CisKKyAgZm9yIChyZWdpID0gMDsgcmVnaSA8IDMyOyByZWdpKyspCisgICAgc3VwcGx5X3JlZ2lzdGVyIChGUDBfUkVHTlVNICsgcmVnaSwKKwkJICAgICAoY2hhciAqKSZmcHJlZ3NldHAtPmZwX3IuZnBfcmVnc1tyZWdpXSk7CisKKyAgc3VwcGx5X3JlZ2lzdGVyIChGQ1JDU19SRUdOVU0sIChjaGFyICopJmZwcmVnc2V0cC0+ZnBfY3NyKTsKKworICAvKiBGSVhNRTogaG93IGNhbiB3ZSBzdXBwbHkgRkNSSVJfUkVHTlVNPyAgVGhlIEFCSSBkb2Vzbid0IHRlbGwgdXMuICovCisgIHN1cHBseV9yZWdpc3RlciAoRkNSSVJfUkVHTlVNLCB6ZXJvYnVmKTsKK30KKwordm9pZAorZmlsbF9mcHJlZ3NldCAoZnByZWdzZXRwLCByZWdubykKKyAgICAgZnByZWdzZXRfdCAqZnByZWdzZXRwOworICAgICBpbnQgcmVnbm87Cit7CisgIGludCByZWdpOworICBjaGFyICpmcm9tLCAqdG87CisKKyAgZm9yIChyZWdpID0gRlAwX1JFR05VTTsgcmVnaSA8IEZQMF9SRUdOVU0gKyAzMjsgcmVnaSsrKQorICAgIHsKKyAgICAgIGlmICgocmVnbm8gPT0gLTEpIHx8IChyZWdubyA9PSByZWdpKSkKKwl7CisJICBmcm9tID0gKGNoYXIgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdpKV07CisJICB0byA9IChjaGFyICopICYoZnByZWdzZXRwLT5mcF9yLmZwX3JlZ3NbcmVnaSAtIEZQMF9SRUdOVU1dKTsKKwkgIG1lbWNweSh0bywgZnJvbSwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ2kpKTsKKwl9CisgICAgfQorCisgIGlmICgocmVnbm8gPT0gLTEpIHx8IChyZWdubyA9PSBGQ1JDU19SRUdOVU0pKQorICAgIGZwcmVnc2V0cC0+ZnBfY3NyID0gKih1bnNpZ25lZCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoRkNSQ1NfUkVHTlVNKV07Cit9CisKKworLyogRmlndXJlIG91dCB3aGVyZSB0aGUgbG9uZ2ptcCB3aWxsIGxhbmQuCisgICBXZSBleHBlY3QgdGhlIGZpcnN0IGFyZyB0byBiZSBhIHBvaW50ZXIgdG8gdGhlIGptcF9idWYgc3RydWN0dXJlIGZyb20gd2hpY2gKKyAgIHdlIGV4dHJhY3QgdGhlIHBjIChfSkJfUEMpIHRoYXQgd2Ugd2lsbCBsYW5kIGF0LiAgVGhlIHBjIGlzIGNvcGllZCBpbnRvIFBDLgorICAgVGhpcyByb3V0aW5lIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiAqLworCitpbnQKK2dldF9sb25nam1wX3RhcmdldCAocGMpCisgICAgIENPUkVfQUREUiAqcGM7Cit7CisgIGNoYXIgYnVmW1RBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUXTsKKyAgQ09SRV9BRERSIGpiX2FkZHI7CisKKyAgamJfYWRkciA9IHJlYWRfcmVnaXN0ZXIgKEEwX1JFR05VTSk7CisKKyAgaWYgKHRhcmdldF9yZWFkX21lbW9yeSAoamJfYWRkciArIF9KQl9QQyAqIEpCX0VMRU1FTlRfU0laRSwgYnVmLAorCQkJICBUQVJHRVRfUFRSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCkpCisgICAgcmV0dXJuIDA7CisKKyAgKnBjID0gZXh0cmFjdF9hZGRyZXNzIChidWYsIFRBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUKTsKKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2dkYi9tbjEwMjAwLXRkZXAuYyBiL2dkYi9tbjEwMjAwLXRkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjdlYWQwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL21uMTAyMDAtdGRlcC5jCkBAIC0wLDAgKzEsOTE5IEBACisvKiBUYXJnZXQtZGVwZW5kZW50IGNvZGUgZm9yIHRoZSBNYXRzdXNoaXRhIE1OMTAyMDAgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorCisgIAkKKy8qIFNob3VsZCBjYWxsX2Z1bmN0aW9uIGFsbG9jYXRlIHN0YWNrIHNwYWNlIGZvciBhIHN0cnVjdCByZXR1cm4/ICAqLworaW50CittbjEwMjAwX3VzZV9zdHJ1Y3RfY29udmVudGlvbiAoZ2NjX3AsIHR5cGUpCisgICAgIGludCBnY2NfcDsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIHJldHVybiAoVFlQRV9ORklFTERTICh0eXBlKSA+IDEgfHwgVFlQRV9MRU5HVEggKHR5cGUpID4gOCk7Cit9CisKKworCisvKiBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyBkZWFsaW5nIHdpdGggcHJvbG9ndWVzIHRvIGV4dHJhY3QKKyAgIGluZm9ybWF0aW9uIGFib3V0IHN0YWNrIGZyYW1lcyBhbmQgc2F2ZWQgcmVnaXN0ZXJzLgorCisgICBGb3IgcmVmZXJlbmNlIGhlcmUncyBob3cgcHJvbG9ndWVzIGxvb2sgb24gdGhlIG1uMTAyMDA6CisKKyAgICAgV2l0aCBmcmFtZSBwb2ludGVyOgorCW1vdiBmcCxhMAorCW1vdiBzcCxmcAorCWFkZCA8c2l6ZT4sc3AKKwlSZWdpc3RlciBzYXZlcyBmb3IgZDIsIGQzLCBhMSwgYTIgYXMgbmVlZGVkLiAgU2F2ZXMgc3RhcnQKKwlhdCBmcCAtIDxzaXplPiArIDxvdXRnb2luZ19hcmdzX3NpemU+IGFuZCB3b3JrIHRvd2FyZHMgaGlnaGVyCisJYWRkcmVzc2VzLiAgTm90ZSB0aGF0IHRoZSBzYXZlcyBhcmUgYWN0dWFsbHkgZG9uZSBvZmYgdGhlIHN0YWNrCisJcG9pbnRlciBpbiB0aGUgcHJvbG9ndWUhICBUaGlzIG1ha2VzIGZvciBzbWFsbGVyIGNvZGUgYW5kIGVhc2llcgorCXByb2xvZ3VlIHNjYW5uaW5nIGFzIHRoZSBkaXNwbGFjZW1lbnQgZmllbGRzIHdpbGwgdW5saWtlbHkKKyAgICAgICAgYmUgbW9yZSB0aGFuIDggYml0cyEKKworICAgICBXaXRob3V0IGZyYW1lIHBvaW50ZXI6CisgICAgICAgIGFkZCA8c2l6ZT4sc3AKKwlSZWdpc3RlciBzYXZlcyBmb3IgZDIsIGQzLCBhMSwgYTIgYXMgbmVlZGVkLiAgU2F2ZXMgc3RhcnQKKwlhdCBzcCArIDxvdXRnb2luZ19hcmdzX3NpemU+IGFuZCB3b3JrIHRvd2FyZHMgaGlnaGVyIGFkZHJlc3Nlcy4KKworICAgICBPdXQgb2YgbGluZSBwcm9sb2d1ZToKKwlhZGQgPGxvY2FsIHNpemU+LHNwICAtLSBvcHRpb25hbAorCWpzciBfX3Byb2xvZ3VlCisJYWRkIDxvdXRnb2luZ19zaXplPixzcCAtLSBvcHRpb25hbAorCisgICBUaGUgc3RhY2sgcG9pbnRlciByZW1haW5zIGNvbnN0YW50IHRocm91Z2hvdXQgdGhlIGxpZmUgb2YgbW9zdAorICAgZnVuY3Rpb25zLiAgQXMgYSByZXN1bHQgdGhlIGNvbXBpbGVyIHdpbGwgdXN1YWxseSBvbWl0IHRoZQorICAgZnJhbWUgcG9pbnRlciwgc28gd2UgbXVzdCBoYW5kbGUgZnJhbWUgcG9pbnRlcmxlc3MgZnVuY3Rpb25zLiAgKi8KKworLyogQW5hbHl6ZSB0aGUgcHJvbG9ndWUgdG8gZGV0ZXJtaW5lIHdoZXJlIHJlZ2lzdGVycyBhcmUgc2F2ZWQsCisgICB0aGUgZW5kIG9mIHRoZSBwcm9sb2d1ZSwgZXRjIGV0Yy4gIFJldHVybiB0aGUgZW5kIG9mIHRoZSBwcm9sb2d1ZQorICAgc2Nhbm5lZC4KKworICAgV2Ugc3RvcmUgaW50byBGSSAoaWYgbm9uLW51bGwpIHNldmVyYWwgdGlkYml0cyBvZiBpbmZvcm1hdGlvbjoKKworICAgICogc3RhY2tfc2l6ZSAtLSBzaXplIG9mIHRoaXMgc3RhY2sgZnJhbWUuICBOb3RlIHRoYXQgaWYgd2Ugc3RvcCBpbgorICAgIGNlcnRhaW4gcGFydHMgb2YgdGhlIHByb2xvZ3VlL2VwaWxvZ3VlIHdlIG1heSBjbGFpbSB0aGUgc2l6ZSBvZiB0aGUKKyAgICBjdXJyZW50IGZyYW1lIGlzIHplcm8uICBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgY3VycmVudCBmcmFtZSBoYXMKKyAgICBub3QgYmVlbiBhbGxvY2F0ZWQgeWV0IG9yIGhhcyBhbHJlYWR5IGJlZW4gZGVhbGxvY2F0ZWQuCisKKyAgICAqIGZzciAtLSBBZGRyZXNzZXMgb2YgcmVnaXN0ZXJzIHNhdmVkIGluIHRoZSBzdGFjayBieSB0aGlzIGZyYW1lLgorCisgICAgKiBzdGF0dXMgLS0gQSAocmVsYXRpdmVseSkgZ2VuZXJpYyBzdGF0dXMgaW5kaWNhdG9yLiAgSXQncyBhIGJpdG1hc2sKKyAgICB3aXRoIHRoZSBmb2xsb3dpbmcgYml0czogCisKKyAgICAgIE1ZX0ZSQU1FX0lOX1NQOiBUaGUgYmFzZSBvZiB0aGUgY3VycmVudCBmcmFtZSBpcyBhY3R1YWxseSBpbgorICAgICAgdGhlIHN0YWNrIHBvaW50ZXIuICBUaGlzIGNhbiBoYXBwZW4gZm9yIGZyYW1lIHBvaW50ZXJsZXNzCisgICAgICBmdW5jdGlvbnMsIG9yIGNhc2VzIHdoZXJlIHdlJ3JlIHN0b3BwZWQgaW4gdGhlIHByb2xvZ3VlL2VwaWxvZ3VlCisgICAgICBpdHNlbGYuICBGb3IgdGhlc2UgY2FzZXMgbW4xMDIwMF9hbmFseXplX3Byb2xvZ3VlIHdpbGwgbmVlZCB1cAorICAgICAgdXBkYXRlIGZpLT5mcmFtZSBiZWZvcmUgcmV0dXJuaW5nIG9yIGFuYWx5emluZyB0aGUgcmVnaXN0ZXIKKyAgICAgIHNhdmUgaW5zdHJ1Y3Rpb25zLgorCisgICAgICBNWV9GUkFNRV9JTl9GUDogVGhlIGJhc2Ugb2YgdGhlIGN1cnJlbnQgZnJhbWUgaXMgaW4gdGhlCisgICAgICBmcmFtZSBwb2ludGVyIHJlZ2lzdGVyICgkYTIpLgorCisgICAgICBDQUxMRVJfQTJfSU5fQTA6ICRhMiBmcm9tIHRoZSBjYWxsZXIncyBmcmFtZSBpcyB0ZW1wb3JhcmlseQorICAgICAgaW4gJGEwLiAgVGhpcyBjYW4gaGFwcGVuIGlmIHdlJ3JlIHN0b3BwZWQgaW4gdGhlIHByb2xvZ3VlLgorCisgICAgICBOT19NT1JFX0ZSQU1FUzogU2V0IHRoaXMgaWYgdGhlIGN1cnJlbnQgZnJhbWUgaXMgInN0YXJ0IiBvcgorICAgICAgaWYgdGhlIGZpcnN0IGluc3RydWN0aW9uIGxvb2tzIGxpa2UgbW92IDxpbW0+LHNwLiAgVGhpcyB0ZWxscworICAgICAgZnJhbWUgY2hhaW4gdG8gbm90IGJvdGhlciB0cnlpbmcgdG8gdW53aW5kIHBhc3QgdGhpcyBmcmFtZS4gICovCisKKyNkZWZpbmUgTVlfRlJBTUVfSU5fU1AgMHgxCisjZGVmaW5lIE1ZX0ZSQU1FX0lOX0ZQIDB4MgorI2RlZmluZSBDQUxMRVJfQTJfSU5fQTAgMHg0CisjZGVmaW5lIE5PX01PUkVfRlJBTUVTIDB4OAorIAorc3RhdGljIENPUkVfQUREUgorbW4xMDIwMF9hbmFseXplX3Byb2xvZ3VlIChmaSwgcGMpCisgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworICAgIENPUkVfQUREUiBwYzsKK3sKKyAgQ09SRV9BRERSIGZ1bmNfYWRkciwgZnVuY19lbmQsIGFkZHIsIHN0b3A7CisgIENPUkVfQUREUiBzdGFja19zaXplOworICB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKKyAgaW50IHN0YXR1czsKKyAgY2hhciAqbmFtZTsKKyAgaW50IG91dF9vZl9saW5lX3Byb2xvZ3VlID0gMDsKKworICAvKiBVc2UgdGhlIFBDIGluIHRoZSBmcmFtZSBpZiBpdCdzIHByb3ZpZGVkIHRvIGxvb2sgdXAgdGhlCisgICAgIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb24uICAqLworICBwYyA9IChmaSA/IGZpLT5wYyA6IHBjKTsKKworICAvKiBGaW5kIHRoZSBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uLiAgKi8KKyAgc3RhdHVzID0gZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIChwYywgJm5hbWUsICZmdW5jX2FkZHIsICZmdW5jX2VuZCk7CisKKyAgLyogRG8gbm90aGluZyBpZiB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uIG9yIGlmIHdlJ3JlCisgICAgIHN0b3BwZWQgYXQgdGhlIGZpcnN0IGluc3RydWN0aW9uIGluIHRoZSBwcm9sb2d1ZS4gICovCisgIGlmIChzdGF0dXMgPT0gMCkKKyAgICByZXR1cm4gcGM7CisKKyAgLyogSWYgd2UncmUgaW4gc3RhcnQsIHRoZW4gZ2l2ZSB1cC4gICovCisgIGlmIChzdHJjbXAgKG5hbWUsICJzdGFydCIpID09IDApCisgICAgeworICAgICAgaWYgKGZpKQorICAgICAgICBmaS0+c3RhdHVzID0gTk9fTU9SRV9GUkFNRVM7CisgICAgICByZXR1cm4gcGM7CisgICAgfQorCisgIC8qIEF0IHRoZSBzdGFydCBvZiBhIGZ1bmN0aW9uIG91ciBmcmFtZSBpcyBpbiB0aGUgc3RhY2sgcG9pbnRlci4gICovCisgIGlmIChmaSkKKyAgICBmaS0+c3RhdHVzID0gTVlfRlJBTUVfSU5fU1A7CisKKyAgLyogSWYgd2UncmUgcGh5c2ljYWxseSBvbiBhbiBSVFMgaW5zdHJ1Y3Rpb24sIHRoZW4gb3VyIGZyYW1lIGhhcyBhbHJlYWR5CisgICAgIGJlZW4gZGVhbGxvY2F0ZWQuCisKKyAgICAgZmktPmZyYW1lIGlzIGJvZ3VzLCB3ZSBuZWVkIHRvIGZpeCBpdC4gICovCisgIGlmIChmaSAmJiBmaS0+cGMgKyAxID09IGZ1bmNfZW5kKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAoZmktPnBjLCBidWYsIDEpOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXsKKwkgIGlmIChmaS0+bmV4dCA9PSBOVUxMKQorCSAgICBmaS0+ZnJhbWUgPSByZWFkX3NwICgpOworCSAgcmV0dXJuIGZpLT5wYzsKKwl9CisKKyAgICAgIGlmIChidWZbMF0gPT0gMHhmZSkKKwl7CisJICBpZiAoZmktPm5leHQgPT0gTlVMTCkKKwkgICAgZmktPmZyYW1lID0gcmVhZF9zcCAoKTsKKwkgIHJldHVybiBmaS0+cGM7CisJfQorICAgIH0KKworICAvKiBTaW1pbGFybHkgaWYgd2UncmUgc3RvcHBlZCBvbiB0aGUgZmlyc3QgaW5zbiBvZiBhIHByb2xvZ3VlIGFzIG91cgorICAgICBmcmFtZSBoYXNuJ3QgYmVlbiBhbGxvY2F0ZWQgeWV0LiAgKi8KKyAgaWYgKGZpICYmIGZpLT5wYyA9PSBmdW5jX2FkZHIpCisgICAgeworICAgICAgaWYgKGZpLT5uZXh0ID09IE5VTEwpCisJZmktPmZyYW1lID0gcmVhZF9zcCAoKTsKKyAgICAgIHJldHVybiBmaS0+cGM7CisgICAgfQorCisgIC8qIEZpZ3VyZSBvdXQgd2hlcmUgdG8gc3RvcCBzY2FubmluZy4gICovCisgIHN0b3AgPSBmaSA/IGZpLT5wYyA6IGZ1bmNfZW5kOworCisgIC8qIERvbid0IHdhbGsgb2ZmIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KKyAgc3RvcCA9IHN0b3AgPiBmdW5jX2VuZCA/IGZ1bmNfZW5kIDogc3RvcDsKKworICAvKiBTdGFydCBzY2FubmluZyBvbiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb2YgdGhpcyBmdW5jdGlvbi4gICovCisgIGFkZHIgPSBmdW5jX2FkZHI7CisKKyAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChhZGRyLCBidWYsIDIpOworICBpZiAoc3RhdHVzICE9IDApCisgICAgeworICAgICAgaWYgKGZpICYmIGZpLT5uZXh0ID09IE5VTEwgJiYgZmktPnN0YXR1cyAmIE1ZX0ZSQU1FX0lOX1NQKQorCWZpLT5mcmFtZSA9IHJlYWRfc3AgKCk7CisgICAgICByZXR1cm4gYWRkcjsKKyAgICB9CisKKyAgLyogRmlyc3Qgc2VlIGlmIHRoaXMgaW5zbiBzZXRzIHRoZSBzdGFjayBwb2ludGVyOyBpZiBzbywgaXQncyBzb21ldGhpbmcKKyAgICAgd2Ugd29uJ3QgdW5kZXJzdGFuZCwgc28gcXVpdCBub3cuICAgKi8KKyAgaWYgKGJ1ZlswXSA9PSAweGRmCisgICAgICB8fCAoYnVmWzBdID09IDB4ZjQgJiYgYnVmWzFdID09IDB4NzcpKQorICAgIHsKKyAgICAgIGlmIChmaSkKKwlmaS0+c3RhdHVzID0gTk9fTU9SRV9GUkFNRVM7CisgICAgICByZXR1cm4gYWRkcjsKKyAgICB9CisKKyAgLyogTm93IHNlZSBpZiB3ZSBoYXZlIGEgZnJhbWUgcG9pbnRlci4KKyAgICAgICAKKyAgICAgU2VhcmNoIGZvciBtb3YgYTIsYTAgKDB4ZjI3OCkKKyAgICAgICAgdGhlbgltb3YgYTMsYTIgKDB4ZjI3ZSkuICAqLworCisgIGlmIChidWZbMF0gPT0gMHhmMiAmJiBidWZbMV0gPT0gMHg3OCkKKyAgICB7CisgICAgICAvKiBPdXIgY2FsbGVyJ3MgJGEyIHdpbGwgYmUgZm91bmQgaW4gJGEwIG5vdy4gIE5vdGUgaXQgZm9yCisJIG91ciBjYWxsZXJzLiAgKi8KKyAgICAgIGlmIChmaSkKKwlmaS0+c3RhdHVzIHw9IENBTExFUl9BMl9JTl9BMDsKKyAgICAgIGFkZHIgKz0gMjsKKyAgICAgIGlmIChhZGRyID49IHN0b3ApCisJeworCSAgLyogV2Ugc3RpbGwgaGF2ZW4ndCBhbGxvY2F0ZWQgb3VyIGxvY2FsIHN0YWNrLiAgSGFuZGxlIHRoaXMKKwkgICAgIGFzIGlmIHdlIHN0b3BwZWQgb24gdGhlIGZpcnN0IG9yIGxhc3QgaW5zbiBvZiBhIGZ1bmN0aW9uLiAgICovCisJICBpZiAoZmkgJiYgZmktPm5leHQgPT0gTlVMTCkKKwkgICAgZmktPmZyYW1lID0gcmVhZF9zcCAoKTsKKwkgIHJldHVybiBhZGRyOworCX0KKworICAgICAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChhZGRyLCBidWYsIDIpOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXsKKwkgIGlmIChmaSAmJiBmaS0+bmV4dCA9PSBOVUxMKQorCSAgICBmaS0+ZnJhbWUgPSByZWFkX3NwICgpOworCSAgcmV0dXJuIGFkZHI7CisJfQorICAgICAgaWYgKGJ1ZlswXSA9PSAweGYyICYmIGJ1ZlsxXSA9PSAweDdlKQorCXsKKwkgIGFkZHIgKz0gMjsKKworCSAgLyogT3VyIGZyYW1lIHBvaW50ZXIgaXMgdmFsaWQgbm93LiAgKi8KKwkgIGlmIChmaSkKKwkgICAgeworCSAgICAgIGZpLT5zdGF0dXMgfD0gTVlfRlJBTUVfSU5fRlA7CisJICAgICAgZmktPnN0YXR1cyAmPSB+TVlfRlJBTUVfSU5fU1A7CisJICAgIH0KKwkgIGlmIChhZGRyID49IHN0b3ApCisJICAgIHJldHVybiBhZGRyOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoZmkgJiYgZmktPm5leHQgPT0gTlVMTCkKKwkgICAgZmktPmZyYW1lID0gcmVhZF9zcCAoKTsKKwkgIHJldHVybiBhZGRyOworCX0KKyAgICB9CisKKyAgLyogTmV4dCB3ZSBzaG91bGQgYWxsb2NhdGUgdGhlIGxvY2FsIGZyYW1lLgorICAgICAgIAorICAgICBTZWFyY2ggZm9yIGFkZCBpbW04LGEzICgweGQzWFgpCisgICAgICAgIG9yCWFkZCBpbW0xNixhMyAoMHhmNzBiWFhYWCkKKyAgICAgICAgb3IJYWRkIGltbTI0LGEzICgweGY0NjdYWFhYWFgpLgorICAgICAgIAorICAgICBJZiBub25lIG9mIHRoZSBhYm92ZSB3YXMgZm91bmQsIHRoZW4gdGhpcyBwcm9sb2d1ZSBoYXMKKyAgICAgbm8gc3RhY2ssIGFuZCB0aGVyZWZvcmUgY2FuJ3QgaGF2ZSBhbnkgcmVnaXN0ZXIgc2F2ZXMsCisgICAgIHNvIHF1aXQgbm93LiAgKi8KKyAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChhZGRyLCBidWYsIDIpOworICBpZiAoc3RhdHVzICE9IDApCisgICAgeworICAgICAgaWYgKGZpICYmIGZpLT5uZXh0ID09IE5VTEwgJiYgKGZpLT5zdGF0dXMgJiBNWV9GUkFNRV9JTl9TUCkpCisJZmktPmZyYW1lID0gcmVhZF9zcCAoKTsKKyAgICAgIHJldHVybiBhZGRyOworICAgIH0KKyAgaWYgKGJ1ZlswXSA9PSAweGQzKQorICAgIHsKKyAgICAgIHN0YWNrX3NpemUgPSBleHRyYWN0X3NpZ25lZF9pbnRlZ2VyICgmYnVmWzFdLCAxKTsKKyAgICAgIGlmIChmaSkKKwlmaS0+c3RhY2tfc2l6ZSA9IHN0YWNrX3NpemU7CisgICAgICBhZGRyICs9IDI7CisgICAgICBpZiAoYWRkciA+PSBzdG9wKQorCXsKKwkgIGlmIChmaSAmJiBmaS0+bmV4dCA9PSBOVUxMICYmIChmaS0+c3RhdHVzICYgTVlfRlJBTUVfSU5fU1ApKQorCSAgICBmaS0+ZnJhbWUgPSByZWFkX3NwICgpIC0gc3RhY2tfc2l6ZTsKKwkgIHJldHVybiBhZGRyOworCX0KKyAgICB9CisgIGVsc2UgaWYgKGJ1ZlswXSA9PSAweGY3ICYmIGJ1ZlsxXSA9PSAweDBiKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAoYWRkciArIDIsIGJ1ZiwgMik7CisgICAgICBpZiAoc3RhdHVzICE9IDApCisJeworCSAgaWYgKGZpICYmIGZpLT5uZXh0ID09IE5VTEwgJiYgKGZpLT5zdGF0dXMgJiBNWV9GUkFNRV9JTl9TUCkpCisJICAgIGZpLT5mcmFtZSA9IHJlYWRfc3AgKCk7CisJICByZXR1cm4gYWRkcjsKKwl9CisgICAgICBzdGFja19zaXplID0gZXh0cmFjdF9zaWduZWRfaW50ZWdlciAoYnVmLCAyKTsKKyAgICAgIGlmIChmaSkKKwlmaS0+c3RhY2tfc2l6ZSA9IHN0YWNrX3NpemU7CisgICAgICBhZGRyICs9IDQ7CisgICAgICBpZiAoYWRkciA+PSBzdG9wKQorCXsKKwkgIGlmIChmaSAmJiBmaS0+bmV4dCA9PSBOVUxMICYmIChmaS0+c3RhdHVzICYgTVlfRlJBTUVfSU5fU1ApKQorCSAgICBmaS0+ZnJhbWUgPSByZWFkX3NwICgpIC0gc3RhY2tfc2l6ZTsKKwkgIHJldHVybiBhZGRyOworCX0KKyAgICB9CisgIGVsc2UgaWYgKGJ1ZlswXSA9PSAweGY0ICYmIGJ1ZlsxXSA9PSAweDY3KQorICAgIHsKKyAgICAgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAoYWRkciArIDIsIGJ1ZiwgMyk7CisgICAgICBpZiAoc3RhdHVzICE9IDApCisJeworCSAgaWYgKGZpICYmIGZpLT5uZXh0ID09IE5VTEwgJiYgKGZpLT5zdGF0dXMgJiBNWV9GUkFNRV9JTl9TUCkpCisJICAgIGZpLT5mcmFtZSA9IHJlYWRfc3AgKCk7CisJICByZXR1cm4gYWRkcjsKKwl9CisgICAgICBzdGFja19zaXplID0gZXh0cmFjdF9zaWduZWRfaW50ZWdlciAoYnVmLCAzKTsKKyAgICAgIGlmIChmaSkKKwlmaS0+c3RhY2tfc2l6ZSA9IHN0YWNrX3NpemU7CisgICAgICBhZGRyICs9IDU7CisgICAgICBpZiAoYWRkciA+PSBzdG9wKQorCXsKKwkgIGlmIChmaSAmJiBmaS0+bmV4dCA9PSBOVUxMICYmIChmaS0+c3RhdHVzICYgTVlfRlJBTUVfSU5fU1ApKQorCSAgICBmaS0+ZnJhbWUgPSByZWFkX3NwICgpIC0gc3RhY2tfc2l6ZTsKKwkgIHJldHVybiBhZGRyOworCX0KKyAgICB9CisKKyAgLyogTm93IHNlZSBpZiB3ZSBoYXZlIGEgY2FsbCB0byBfX3Byb2xvZ3VlIGZvciBhbiBvdXQgb2YgbGluZQorICAgICBwcm9sb2d1ZS4gICovCisgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAoYWRkciwgYnVmLCAyKTsKKyAgaWYgKHN0YXR1cyAhPSAwKQorICAgIHJldHVybiBhZGRyOworCisgIC8qIEZpcnN0IGNoZWNrIGZvciAxNmJpdCBwYy1yZWxhdGl2ZSBjYWxsIHRvIF9fcHJvbG9ndWUuICAqLworICBpZiAoYnVmWzBdID09IDB4ZmQpCisgICAgeworICAgICAgQ09SRV9BRERSIHRlbXA7CisgICAgICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGFkZHIgKyAxLCBidWYsIDIpOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXsKKyAgCSAgaWYgKGZpICYmIGZpLT5uZXh0ID09IE5VTEwgJiYgKGZpLT5zdGF0dXMgJiBNWV9GUkFNRV9JTl9TUCkpCisgICAgCSAgICBmaS0+ZnJhbWUgPSByZWFkX3NwICgpOworCSAgcmV0dXJuIGFkZHI7CisJfQorICAgICAgCisgICAgICAvKiBHZXQgdGhlIFBDIHRoaXMgaW5zdHJ1Y3Rpb24gd2lsbCBicmFuY2ggdG8uICAqLworICAgICAgdGVtcCA9IChleHRyYWN0X3NpZ25lZF9pbnRlZ2VyIChidWYsIDIpICsgYWRkciArIDMpICYgMHhmZmZmZmY7CisKKyAgICAgIC8qIEdldCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYXQgdGhlIHRhcmdldCBhZGRyZXNzLiAgKi8KKyAgICAgIHN0YXR1cyA9IGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAodGVtcCwgJm5hbWUsIE5VTEwsIE5VTEwpOworICAgICAgaWYgKHN0YXR1cyA9PSAwKQorCXsKKyAgCSAgaWYgKGZpICYmIGZpLT5uZXh0ID09IE5VTEwgJiYgKGZpLT5zdGF0dXMgJiBNWV9GUkFNRV9JTl9TUCkpCisgICAgCSAgICBmaS0+ZnJhbWUgPSByZWFkX3NwICgpOworCSAgcmV0dXJuIGFkZHI7CisJfQorCisgICAgICAvKiBOb3RlIGlmIGl0IGlzIGFuIG91dCBvZiBsaW5lIHByb2xvZ3VlLiAgKi8KKyAgICAgIG91dF9vZl9saW5lX3Byb2xvZ3VlID0gKHN0cmNtcCAobmFtZSwgIl9fcHJvbG9ndWUiKSA9PSAwKTsKKworICAgICAgLyogVGhpcyBzdWNrcyB1cCAzIGJ5dGVzIG9mIGluc3RydWN0aW9uIHNwYWNlLiAgKi8KKyAgICAgIGlmIChvdXRfb2ZfbGluZV9wcm9sb2d1ZSkKKwlhZGRyICs9IDM7CisKKyAgICAgIGlmIChhZGRyID49IHN0b3ApCisJeworCSAgaWYgKGZpICYmIGZpLT5uZXh0ID09IE5VTEwpCisJICAgIHsKKwkgICAgICBmaS0+c3RhY2tfc2l6ZSAtPSAxNjsKKwkgICAgICBmaS0+ZnJhbWUgPSByZWFkX3NwICgpIC0gZmktPnN0YWNrX3NpemU7CisJICAgIH0KKwkgIHJldHVybiBhZGRyOworCX0KKyAgICB9CisgIC8qIE5vdyBjaGVjayBmb3IgdGhlIDI0Yml0IHBjLXJlbGF0aXZlIGNhbGwgdG8gX19wcm9sb2d1ZS4gICovCisgIGVsc2UgaWYgKGJ1ZlswXSA9PSAweGY0ICYmIGJ1ZlsxXSA9PSAweGUxKQorICAgIHsKKyAgICAgIENPUkVfQUREUiB0ZW1wOworICAgICAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChhZGRyICsgMiwgYnVmLCAzKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gMCkKKwl7CisgIAkgIGlmIChmaSAmJiBmaS0+bmV4dCA9PSBOVUxMICYmIChmaS0+c3RhdHVzICYgTVlfRlJBTUVfSU5fU1ApKQorICAgIAkgICAgZmktPmZyYW1lID0gcmVhZF9zcCAoKTsKKwkgIHJldHVybiBhZGRyOworCX0KKyAgICAgIAorICAgICAgLyogR2V0IHRoZSBQQyB0aGlzIGluc3RydWN0aW9uIHdpbGwgYnJhbmNoIHRvLiAgKi8KKyAgICAgIHRlbXAgPSAoZXh0cmFjdF9zaWduZWRfaW50ZWdlciAoYnVmLCAzKSArIGFkZHIgKyA1KSAmIDB4ZmZmZmZmOworCisgICAgICAvKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGF0IHRoZSB0YXJnZXQgYWRkcmVzcy4gICovCisgICAgICBzdGF0dXMgPSBmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gKHRlbXAsICZuYW1lLCBOVUxMLCBOVUxMKTsKKyAgICAgIGlmIChzdGF0dXMgPT0gMCkKKwl7CisgIAkgIGlmIChmaSAmJiBmaS0+bmV4dCA9PSBOVUxMICYmIChmaS0+c3RhdHVzICYgTVlfRlJBTUVfSU5fU1ApKQorICAgIAkgICAgZmktPmZyYW1lID0gcmVhZF9zcCAoKTsKKwkgIHJldHVybiBhZGRyOworCX0KKworICAgICAgLyogTm90ZSBpZiBpdCBpcyBhbiBvdXQgb2YgbGluZSBwcm9sb2d1ZS4gICovCisgICAgICBvdXRfb2ZfbGluZV9wcm9sb2d1ZSA9IChzdHJjbXAgKG5hbWUsICJfX3Byb2xvZ3VlIikgPT0gMCk7CisKKyAgICAgIC8qIFRoaXMgc3Vja3MgdXAgNSBieXRlcyBvZiBpbnN0cnVjdGlvbiBzcGFjZS4gICovCisgICAgICBpZiAob3V0X29mX2xpbmVfcHJvbG9ndWUpCisJYWRkciArPSA1OworCisgICAgICBpZiAoYWRkciA+PSBzdG9wKQorCXsKKwkgIGlmIChmaSAmJiBmaS0+bmV4dCA9PSBOVUxMICYmIChmaS0+c3RhdHVzICYgTVlfRlJBTUVfSU5fU1ApKQorCSAgICB7CisJICAgICAgZmktPnN0YWNrX3NpemUgLT0gMTY7CisJICAgICAgZmktPmZyYW1lID0gcmVhZF9zcCAoKSAtIGZpLT5zdGFja19zaXplOworCSAgICB9CisJICByZXR1cm4gYWRkcjsKKwl9CisgICAgfQorCisgIC8qIE5vdyBhY3R1YWxseSBoYW5kbGUgdGhlIG91dCBvZiBsaW5lIHByb2xvZ3VlLiAgKi8KKyAgaWYgKG91dF9vZl9saW5lX3Byb2xvZ3VlKQorICAgIHsKKyAgICAgIGludCBvdXRnb2luZ19hcmdzX3NpemUgPSAwOworCisgICAgICAvKiBGaXJzdCBhZGp1c3QgdGhlIHN0YWNrIHNpemUgZm9yIHRoaXMgZnVuY3Rpb24uICBUaGUgb3V0IG9mCisJIGxpbmUgcHJvbG9ndWUgc2F2ZXMgNCByZWdpc3RlcnMgKDE2Ynl0ZXMgb2YgZGF0YSkuICAqLworICAgICAgaWYgKGZpKQorCWZpLT5zdGFja19zaXplIC09IDE2OworCisgICAgICAvKiBVcGRhdGUgZmktPmZyYW1lIGlmIG5lY2Vzc2FyeS4gICovCisgICAgICBpZiAoZmkgJiYgZmktPm5leHQgPT0gTlVMTCkKKwlmaS0+ZnJhbWUgPSByZWFkX3NwICgpIC0gZmktPnN0YWNrX3NpemU7CisKKyAgICAgIC8qIEFmdGVyIHRoZSBvdXQgb2YgbGluZSBwcm9sb2d1ZSwgdGhlcmUgbWF5IGJlIGFub3RoZXIKKwkgc3RhY2sgYWRqdXN0bWVudCBmb3IgdGhlIG91dGdvaW5nIGFyZ3VtZW50cy4KKworCSBTZWFyY2ggZm9yIGFkZCBpbW04LGEzICgweGQzWFgpCisJICAgIG9yCWFkZCBpbW0xNixhMyAoMHhmNzBiWFhYWCkKKwkgICAgb3IJYWRkIGltbTI0LGEzICgweGY0NjdYWFhYWFgpLiAgKi8KKyAgICAgICAKKyAgICAgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAoYWRkciwgYnVmLCAyKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gMCkKKwl7CisJICBpZiAoZmkpCisJICAgIHsKKwkgICAgICBmaS0+ZnNyLnJlZ3NbMl0gPSBmaS0+ZnJhbWUgKyBmaS0+c3RhY2tfc2l6ZSArIDQ7CisJICAgICAgZmktPmZzci5yZWdzWzNdID0gZmktPmZyYW1lICsgZmktPnN0YWNrX3NpemUgKyA4OworCSAgICAgIGZpLT5mc3IucmVnc1s1XSA9IGZpLT5mcmFtZSArIGZpLT5zdGFja19zaXplICsgMTI7CisJICAgICAgZmktPmZzci5yZWdzWzZdID0gZmktPmZyYW1lICsgZmktPnN0YWNrX3NpemUgKyAxNjsKKwkgICAgfQorCSAgcmV0dXJuIGFkZHI7CisJfQorCisgICAgICBpZiAoYnVmWzBdID09IDB4ZDMpCisJeworCSAgb3V0Z29pbmdfYXJnc19zaXplID0gZXh0cmFjdF9zaWduZWRfaW50ZWdlciAoJmJ1ZlsxXSwgMSk7CisJICBhZGRyICs9IDI7CisJfQorICAgICAgZWxzZSBpZiAoYnVmWzBdID09IDB4ZjcgJiYgYnVmWzFdID09IDB4MGIpCisJeworCSAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChhZGRyICsgMiwgYnVmLCAyKTsKKwkgIGlmIChzdGF0dXMgIT0gMCkKKwkgICAgeworCSAgICAgIGlmIChmaSkKKwkJeworCQkgIGZpLT5mc3IucmVnc1syXSA9IGZpLT5mcmFtZSArIGZpLT5zdGFja19zaXplICsgNDsKKwkJICBmaS0+ZnNyLnJlZ3NbM10gPSBmaS0+ZnJhbWUgKyBmaS0+c3RhY2tfc2l6ZSArIDg7CisJCSAgZmktPmZzci5yZWdzWzVdID0gZmktPmZyYW1lICsgZmktPnN0YWNrX3NpemUgKyAxMjsKKwkJICBmaS0+ZnNyLnJlZ3NbNl0gPSBmaS0+ZnJhbWUgKyBmaS0+c3RhY2tfc2l6ZSArIDE2OworCQl9CisJICAgICAgcmV0dXJuIGFkZHI7CisJICAgIH0KKwkgIG91dGdvaW5nX2FyZ3Nfc2l6ZSA9IGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKGJ1ZiwgMik7CisJICBhZGRyICs9IDQ7CisJfQorICAgICAgZWxzZSBpZiAoYnVmWzBdID09IDB4ZjQgJiYgYnVmWzFdID09IDB4NjcpCisJeworCSAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChhZGRyICsgMiwgYnVmLCAzKTsKKwkgIGlmIChzdGF0dXMgIT0gMCkKKwkgICAgeworCSAgICAgIGlmIChmaSAmJiBmaS0+bmV4dCA9PSBOVUxMKQorCQl7CisJCSAgZmktPmZzci5yZWdzWzJdID0gZmktPmZyYW1lICsgZmktPnN0YWNrX3NpemUgKyA0OworCQkgIGZpLT5mc3IucmVnc1szXSA9IGZpLT5mcmFtZSArIGZpLT5zdGFja19zaXplICsgODsKKwkJICBmaS0+ZnNyLnJlZ3NbNV0gPSBmaS0+ZnJhbWUgKyBmaS0+c3RhY2tfc2l6ZSArIDEyOworCQkgIGZpLT5mc3IucmVnc1s2XSA9IGZpLT5mcmFtZSArIGZpLT5zdGFja19zaXplICsgMTY7CisJCX0KKwkgICAgICByZXR1cm4gYWRkcjsKKwkgICAgfQorCSAgb3V0Z29pbmdfYXJnc19zaXplID0gZXh0cmFjdF9zaWduZWRfaW50ZWdlciAoYnVmLCAzKTsKKwkgIGFkZHIgKz0gNTsKKwl9CisgICAgICBlbHNlCisJb3V0Z29pbmdfYXJnc19zaXplID0gMDsKKworICAgICAgLyogTm93IHRoYXQgd2Uga25vdyB0aGUgc2l6ZSBvZiB0aGUgb3V0Z29pbmcgYXJndW1lbnRzLCBmaXgKKwkgZmktPmZyYW1lIGFnYWluIGlmIHRoaXMgaXMgdGhlIGlubmVybW9zdCBmcmFtZS4gICovCisgICAgICBpZiAoZmkgJiYgZmktPm5leHQgPT0gTlVMTCkKKwlmaS0+ZnJhbWUgLT0gb3V0Z29pbmdfYXJnc19zaXplOworCisgICAgICAvKiBOb3RlIHRoZSByZWdpc3RlciBzYXZlIGluZm9ybWF0aW9uIGFuZCB1cGRhdGUgdGhlIHN0YWNrCisJIHNpemUgZm9yIHRoaXMgZnJhbWUgdG9vLiAgKi8KKyAgICAgIGlmIChmaSkKKwl7CisJICBmaS0+ZnNyLnJlZ3NbMl0gPSBmaS0+ZnJhbWUgKyBmaS0+c3RhY2tfc2l6ZSArIDQ7CisJICBmaS0+ZnNyLnJlZ3NbM10gPSBmaS0+ZnJhbWUgKyBmaS0+c3RhY2tfc2l6ZSArIDg7CisJICBmaS0+ZnNyLnJlZ3NbNV0gPSBmaS0+ZnJhbWUgKyBmaS0+c3RhY2tfc2l6ZSArIDEyOworCSAgZmktPmZzci5yZWdzWzZdID0gZmktPmZyYW1lICsgZmktPnN0YWNrX3NpemUgKyAxNjsKKwkgIGZpLT5zdGFja19zaXplICs9IG91dGdvaW5nX2FyZ3Nfc2l6ZTsKKwl9CisgICAgICAvKiBUaGVyZSBjYW4gYmUgbm8gbW9yZSBwcm9sb2d1ZSBpbnNucywgc28gcmV0dXJuIG5vdy4gICovCisgICAgICByZXR1cm4gYWRkcjsKKyAgICB9CisKKyAgLyogQXQgdGhpcyBwb2ludCBmaS0+ZnJhbWUgbmVlZHMgdG8gYmUgY29ycmVjdC4KKworICAgICBJZiBNWV9GUkFNRV9JTl9TUCBpcyBzZXQgYW5kIHdlJ3JlIHRoZSBpbm5lcm1vc3QgZnJhbWUsIHRoZW4gd2UKKyAgICAgbmVlZCB0byBmaXggZmktPmZyYW1lIHNvIHRoYXQgYmFja3RyYWNpbmcsIGZpbmRfZnJhbWVfc2F2ZWRfcmVncywKKyAgICAgZXRjIHdvcmsgY29ycmVjdGx5LiAgKi8KKyAgaWYgKGZpICYmIGZpLT5uZXh0ID09IE5VTEwgJiYgKGZpLT5zdGF0dXMgJiBNWV9GUkFNRV9JTl9TUCkgIT0gMCkKKyAgICBmaS0+ZnJhbWUgPSByZWFkX3NwICgpIC0gZmktPnN0YWNrX3NpemU7CisKKyAgLyogQW5kIGxhc3Qgd2UgaGF2ZSB0aGUgcmVnaXN0ZXIgc2F2ZXMuICBUaGVzZSBhcmUgcmVsYXRpdmVseQorICAgICBzaW1wbGUgYmVjYXVzZSB0aGV5J3JlIHBoeXNpY2FsbHkgZG9uZSBvZmYgdGhlIHN0YWNrIHBvaW50ZXIsCisgICAgIGFuZCB0aHVzIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGluc3RydWN0aW9ucyB3ZSBuZWVkIHRvCisgICAgIGNoZWNrIGlzIGdyZWF0bHkgcmVkdWNlZCBiZWNhdXNlIHdlIGtub3cgdGhlIGRpc3BsYWNlbWVudHMKKyAgICAgd2lsbCBiZSBzbWFsbC4KKyAgICAgICAKKyAgICAgU2VhcmNoIGZvciBtb3Z4IGQyLChYLGEzKSAoMHhmNTVlWFgpCisgICAgICAgIHRoZW4JbW92eCBkMywoWCxhMykgKDB4ZjU1ZlhYKQorICAgICAgICB0aGVuCW1vdiAgYTEsKFgsYTMpICgweDVkWFgpCSAgIE5vIGZyYW1lIHBvaW50ZXIgY2FzZQorICAgICAgICB0aGVuCW1vdiAgYTIsKFgsYTMpICgweDVlWFgpCSAgIE5vIGZyYW1lIHBvaW50ZXIgY2FzZQorICAgICAgICBvciAgbW92ICBhMCwoWCxhMykgKDB4NWNYWCkJICAgRnJhbWUgcG9pbnRlciBjYXNlLiAgKi8KKworICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGFkZHIsIGJ1ZiwgMik7CisgIGlmIChzdGF0dXMgIT0gMCkKKyAgICByZXR1cm4gYWRkcjsKKyAgaWYgKGJ1ZlswXSA9PSAweGY1ICYmIGJ1ZlsxXSA9PSAweDVlKQorICAgIHsKKyAgICAgIGlmIChmaSkKKwl7CisJICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGFkZHIgKyAyLCBidWYsIDEpOworCSAgaWYgKHN0YXR1cyAhPSAwKQorCSAgICByZXR1cm4gYWRkcjsKKwkgIGZpLT5mc3IucmVnc1syXSA9IChmaS0+ZnJhbWUgKyBzdGFja19zaXplCisJCQkgICAgICsgZXh0cmFjdF9zaWduZWRfaW50ZWdlciAoYnVmLCAxKSk7CisJfQorICAgICAgYWRkciArPSAzOworICAgICAgaWYgKGFkZHIgPj0gc3RvcCkKKwlyZXR1cm4gYWRkcjsKKyAgICAgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAoYWRkciwgYnVmLCAyKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gMCkKKwlyZXR1cm4gYWRkcjsKKyAgICB9CisgIGlmIChidWZbMF0gPT0gMHhmNSAmJiBidWZbMV0gPT0gMHg1ZikKKyAgICB7CisgICAgICBpZiAoZmkpCisJeworCSAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChhZGRyICsgMiwgYnVmLCAxKTsKKwkgIGlmIChzdGF0dXMgIT0gMCkKKwkgICAgcmV0dXJuIGFkZHI7CisJICBmaS0+ZnNyLnJlZ3NbM10gPSAoZmktPmZyYW1lICsgc3RhY2tfc2l6ZQorCQkJICAgICArIGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKGJ1ZiwgMSkpOworCX0KKyAgICAgIGFkZHIgKz0gMzsKKyAgICAgIGlmIChhZGRyID49IHN0b3ApCisJcmV0dXJuIGFkZHI7CisgICAgICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGFkZHIsIGJ1ZiwgMik7CisgICAgICBpZiAoc3RhdHVzICE9IDApCisJcmV0dXJuIGFkZHI7CisgICAgfQorICBpZiAoYnVmWzBdID09IDB4NWQpCisgICAgeworICAgICAgaWYgKGZpKQorCXsKKwkgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAoYWRkciArIDEsIGJ1ZiwgMSk7CisJICBpZiAoc3RhdHVzICE9IDApCisJICAgIHJldHVybiBhZGRyOworCSAgZmktPmZzci5yZWdzWzVdID0gKGZpLT5mcmFtZSArIHN0YWNrX3NpemUKKwkJCSAgICAgKyBleHRyYWN0X3NpZ25lZF9pbnRlZ2VyIChidWYsIDEpKTsKKwl9CisgICAgICBhZGRyICs9IDI7CisgICAgICBpZiAoYWRkciA+PSBzdG9wKQorCXJldHVybiBhZGRyOworICAgICAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChhZGRyLCBidWYsIDIpOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXJldHVybiBhZGRyOworICAgIH0KKyAgaWYgKGJ1ZlswXSA9PSAweDVlIHx8IGJ1ZlswXSA9PSAweDVjKQorICAgIHsKKyAgICAgIGlmIChmaSkKKwl7CisJICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGFkZHIgKyAxLCBidWYsIDEpOworCSAgaWYgKHN0YXR1cyAhPSAwKQorCSAgICByZXR1cm4gYWRkcjsKKwkgIGZpLT5mc3IucmVnc1s2XSA9IChmaS0+ZnJhbWUgKyBzdGFja19zaXplCisJCQkgICAgICsgZXh0cmFjdF9zaWduZWRfaW50ZWdlciAoYnVmLCAxKSk7CisJICBmaS0+c3RhdHVzICY9IH5DQUxMRVJfQTJfSU5fQTA7CisJfQorICAgICAgYWRkciArPSAyOworICAgICAgaWYgKGFkZHIgPj0gc3RvcCkKKwlyZXR1cm4gYWRkcjsKKyAgICAgIHJldHVybiBhZGRyOworICAgIH0KKyAgcmV0dXJuIGFkZHI7Cit9CisgIAorLyogRnVuY3Rpb246IGZyYW1lX2NoYWluCisgICBGaWd1cmUgb3V0IGFuZCByZXR1cm4gdGhlIGNhbGxlcidzIGZyYW1lIHBvaW50ZXIgZ2l2ZW4gY3VycmVudAorICAgZnJhbWVfaW5mbyBzdHJ1Y3QuCisKKyAgIFdlIGRvbid0IGhhbmRsZSBkdW1teSBmcmFtZXMgeWV0IGJ1dCB3ZSB3b3VsZCBwcm9iYWJseSBqdXN0IHJldHVybiB0aGUKKyAgIHN0YWNrIHBvaW50ZXIgdGhhdCB3YXMgaW4gdXNlIGF0IHRoZSB0aW1lIHRoZSBmdW5jdGlvbiBjYWxsIHdhcyBtYWRlPyAgKi8KKworQ09SRV9BRERSCittbjEwMjAwX2ZyYW1lX2NoYWluIChmaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworeworICBzdHJ1Y3QgZnJhbWVfaW5mbyBkdW1teV9mcmFtZTsKKworICAvKiBXYWxrIHRocm91Z2ggdGhlIHByb2xvZ3VlIHRvIGRldGVybWluZSB0aGUgc3RhY2sgc2l6ZSwKKyAgICAgbG9jYXRpb24gb2Ygc2F2ZWQgcmVnaXN0ZXJzLCBlbmQgb2YgdGhlIHByb2xvZ3VlLCBldGMuICAqLworICBpZiAoZmktPnN0YXR1cyA9PSAwKQorICAgIG1uMTAyMDBfYW5hbHl6ZV9wcm9sb2d1ZSAoZmksIChDT1JFX0FERFIpMCk7CisKKyAgLyogUXVpdCBub3cgaWYgbW4xMDIwMF9hbmFseXplX3Byb2xvZ3VlIHNldCBOT19NT1JFX0ZSQU1FUy4gICovCisgIGlmIChmaS0+c3RhdHVzICYgTk9fTU9SRV9GUkFNRVMpCisgICAgcmV0dXJuIDA7CisKKyAgLyogTm93IHRoYXQgd2UndmUgYW5hbHl6ZWQgb3VyIHByb2xvZ3VlLCBkZXRlcm1pbmUgdGhlIGZyYW1lCisgICAgIHBvaW50ZXIgZm9yIG91ciBjYWxsZXIuCisKKyAgICAgICBJZiBvdXIgY2FsbGVyIGhhcyBhIGZyYW1lIHBvaW50ZXIsIHRoZW4gd2UgbmVlZCB0bworICAgICAgIGZpbmQgdGhlIGVudHJ5IHZhbHVlIG9mICRhMiB0byBvdXIgZnVuY3Rpb24uCisKKwkgSWYgQ0FMTEVSX0EyX0lOX0EwLCB0aGVuIHRoZSBjaGFpbiBpcyBpbiAkYTAuCisKKwkgSWYgZnNyLnJlZ3NbNl0gaXMgbm9uemVybywgdGhlbiBpdCdzIGF0IHRoZSBtZW1vcnkKKwkgbG9jYXRpb24gcG9pbnRlZCB0byBieSBmc3IucmVnc1s2XS4KKworCSBFbHNlIGl0J3Mgc3RpbGwgaW4gJGEyLgorCisgICAgICAgSWYgb3VyIGNhbGxlciBkb2VzIG5vdCBoYXZlIGEgZnJhbWUgcG9pbnRlciwgdGhlbiBoaXMKKyAgICAgICBmcmFtZSBiYXNlIGlzIGZpLT5mcmFtZSArIC1jYWxsZXIncyBzdGFjayBzaXplICsgNC4gICovCisgICAgICAgCisgIC8qIFRoZSBlYXNpZXN0IHdheSB0byBnZXQgdGhhdCBpbmZvIGlzIHRvIGFuYWx5emUgb3VyIGNhbGxlcidzIGZyYW1lLgorCisgICAgIFNvIHdlIHNldCB1cCBhIGR1bW15IGZyYW1lIGFuZCBjYWxsIG1uMTAyMDBfYW5hbHl6ZV9wcm9sb2d1ZSB0bworICAgICBmaW5kIHN0dWZmIGZvciB1cy4gICovCisgIGR1bW15X2ZyYW1lLnBjID0gRlJBTUVfU0FWRURfUEMgKGZpKTsKKyAgZHVtbXlfZnJhbWUuZnJhbWUgPSBmaS0+ZnJhbWU7CisgIG1lbXNldCAoZHVtbXlfZnJhbWUuZnNyLnJlZ3MsICdcMDAwJywgc2l6ZW9mIGR1bW15X2ZyYW1lLmZzci5yZWdzKTsKKyAgZHVtbXlfZnJhbWUuc3RhdHVzID0gMDsKKyAgZHVtbXlfZnJhbWUuc3RhY2tfc2l6ZSA9IDA7CisgIG1uMTAyMDBfYW5hbHl6ZV9wcm9sb2d1ZSAoJmR1bW15X2ZyYW1lKTsKKworICBpZiAoZHVtbXlfZnJhbWUuc3RhdHVzICYgTVlfRlJBTUVfSU5fRlApCisgICAgeworICAgICAgLyogT3VyIGNhbGxlciBoYXMgYSBmcmFtZSBwb2ludGVyLiAgU28gZmluZCB0aGUgZnJhbWUgaW4gJGEyLCAkYTAsCisJIG9yIGluIHRoZSBzdGFjay4gICovCisgICAgICBpZiAoZmktPmZzci5yZWdzWzZdKQorCXJldHVybiAocmVhZF9tZW1vcnlfaW50ZWdlciAoZmktPmZzci5yZWdzW0ZQX1JFR05VTV0sIFJFR0lTVEVSX1NJWkUpCisJCSYgMHhmZmZmZmYpOworICAgICAgZWxzZSBpZiAoZmktPnN0YXR1cyAmIENBTExFUl9BMl9JTl9BMCkKKwlyZXR1cm4gcmVhZF9yZWdpc3RlciAoNCk7CisgICAgICBlbHNlCisJcmV0dXJuIHJlYWRfcmVnaXN0ZXIgKEZQX1JFR05VTSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogT3VyIGNhbGxlciBkb2VzIG5vdCBoYXZlIGEgZnJhbWUgcG9pbnRlci4gIFNvIGhpcyBmcmFtZSBzdGFydHMKKwkgYXQgdGhlIGJhc2Ugb2Ygb3VyIGZyYW1lIChmaS0+ZnJhbWUpICsgPGhpcyBzaXplPiArIDQgKHNhdmVkIHBjKS4gICovCisgICAgICByZXR1cm4gZmktPmZyYW1lICsgLWR1bW15X2ZyYW1lLnN0YWNrX3NpemUgKyA0OworICAgIH0KK30KKworLyogRnVuY3Rpb246IHNraXBfcHJvbG9ndWUKKyAgIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgaW5zdCBwYXN0IHRoZSBwcm9sb2d1ZSBvZiB0aGUgZnVuY3Rpb24uICAqLworCitDT1JFX0FERFIKK21uMTAyMDBfc2tpcF9wcm9sb2d1ZSAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgLyogV2UgdXNlZCB0byBjaGVjayB0aGUgZGVidWcgc3ltYm9scywgYnV0IHRoYXQgY2FuIGxvc2UgaWYKKyAgICAgd2UgaGF2ZSBhIG51bGwgcHJvbG9ndWUuICAqLworICByZXR1cm4gbW4xMDIwMF9hbmFseXplX3Byb2xvZ3VlIChOVUxMLCBwYyk7Cit9CisKKy8qIEZ1bmN0aW9uOiBwb3BfZnJhbWUKKyAgIFRoaXMgcm91dGluZSBnZXRzIGNhbGxlZCB3aGVuIGVpdGhlciB0aGUgdXNlciB1c2VzIHRoZSBgcmV0dXJuJworICAgY29tbWFuZCwgb3IgdGhlIGNhbGwgZHVtbXkgYnJlYWtwb2ludCBnZXRzIGhpdC4gICovCisKK3ZvaWQKK21uMTAyMDBfcG9wX2ZyYW1lIChmcmFtZSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworeworICBpbnQgcmVnbnVtOworCisgIGlmIChQQ19JTl9DQUxMX0RVTU1ZKGZyYW1lLT5wYywgZnJhbWUtPmZyYW1lLCBmcmFtZS0+ZnJhbWUpKQorICAgIGdlbmVyaWNfcG9wX2R1bW15X2ZyYW1lICgpOworICBlbHNlCisgICAgeworICAgICAgd3JpdGVfcmVnaXN0ZXIgKFBDX1JFR05VTSwgRlJBTUVfU0FWRURfUEMgKGZyYW1lKSk7CisKKyAgICAgIC8qIFJlc3RvcmUgYW55IHNhdmVkIHJlZ2lzdGVycy4gICovCisgICAgICBmb3IgKHJlZ251bSA9IDA7IHJlZ251bSA8IE5VTV9SRUdTOyByZWdudW0rKykKKwlpZiAoZnJhbWUtPmZzci5yZWdzW3JlZ251bV0gIT0gMCkKKwkgIHsKKwkgICAgVUxPTkdFU1QgdmFsdWU7CisKKwkgICAgdmFsdWUgPSByZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyIChmcmFtZS0+ZnNyLnJlZ3NbcmVnbnVtXSwKKwkJCQkJCSAgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSkpOworCSAgICB3cml0ZV9yZWdpc3RlciAocmVnbnVtLCB2YWx1ZSk7CisJICB9CisKKyAgICAgIC8qIEFjdHVhbGx5IGN1dCBiYWNrIHRoZSBzdGFjay4gICovCisgICAgICB3cml0ZV9yZWdpc3RlciAoU1BfUkVHTlVNLCBGUkFNRV9GUCAoZnJhbWUpKTsKKworICAgICAgLyogRG9uJ3Qgd2UgbmVlZCB0byBzZXQgdGhlIFBDPyE/ICBYWFggRklYTUUuICAqLworICAgIH0KKworICAvKiBUaHJvdyBhd2F5IGFueSBjYWNoZWQgZnJhbWUgaW5mb3JtYXRpb24uICAqLworICBmbHVzaF9jYWNoZWRfZnJhbWVzICgpOworfQorCisvKiBGdW5jdGlvbjogcHVzaF9hcmd1bWVudHMKKyAgIFNldHVwIGFyZ3VtZW50cyBmb3IgYSBjYWxsIHRvIHRoZSB0YXJnZXQuICBBcmd1bWVudHMgZ28gaW4KKyAgIG9yZGVyIG9uIHRoZSBzdGFjay4gICovCisKK0NPUkVfQUREUgorbW4xMDIwMF9wdXNoX2FyZ3VtZW50cyAobmFyZ3MsIGFyZ3MsIHNwLCBzdHJ1Y3RfcmV0dXJuLCBzdHJ1Y3RfYWRkcikKKyAgICAgaW50IG5hcmdzOworICAgICB2YWx1ZV9wdHIgKmFyZ3M7CisgICAgIENPUkVfQUREUiBzcDsKKyAgICAgdW5zaWduZWQgY2hhciBzdHJ1Y3RfcmV0dXJuOworICAgICBDT1JFX0FERFIgc3RydWN0X2FkZHI7Cit7CisgIGludCBhcmdudW0gPSAwOworICBpbnQgbGVuID0gMDsKKyAgaW50IHN0YWNrX29mZnNldCA9IDA7CisgIGludCByZWdzdXNlZCA9IHN0cnVjdF9yZXR1cm4gPyAxIDogMDsKKworICAvKiBUaGlzIHNob3VsZCBiZSBhIG5vcCwgYnV0IGFsaWduIHRoZSBzdGFjayBqdXN0IGluIGNhc2Ugc29tZXRoaW5nCisgICAgIHdlbnQgd3JvbmcuICBTdGFja3MgYXJlIHR3byBieXRlIGFsaWduZWQgb24gdGhlIG1uMTAyMDAuICAqLworICBzcCAmPSB+MTsKKworICAvKiBOb3cgbWFrZSBzcGFjZSBvbiB0aGUgc3RhY2sgZm9yIHRoZSBhcmdzLgorCisgICAgIFhYWCBUaGlzIGRvZXNuJ3QgYXBwZWFyIHRvIGhhbmRsZSBwYXNzLWJ5LWludmlzaWJsZSByZWZlcmVuY2UKKyAgICAgYXJndW1lbnRzLiAgKi8KKyAgZm9yIChhcmdudW0gPSAwOyBhcmdudW0gPCBuYXJnczsgYXJnbnVtKyspCisgICAgeworICAgICAgaW50IGFyZ19sZW5ndGggPSAoVFlQRV9MRU5HVEggKFZBTFVFX1RZUEUgKGFyZ3NbYXJnbnVtXSkpICsgMSkgJiB+MTsKKworICAgICAgLyogSWYgd2UndmUgdXNlZCBhbGwgYXJndW1lbnQgcmVnaXN0ZXJzLCB0aGVuIHRoaXMgYXJndW1lbnQgaXMKKwkgcHVzaGVkLiAgKi8KKyAgICAgIGlmIChyZWdzdXNlZCA+PSAyIHx8IGFyZ19sZW5ndGggPiA0KQorCXsKKwkgIHJlZ3N1c2VkID0gMjsKKwkgIGxlbiArPSBhcmdfbGVuZ3RoOworCX0KKyAgICAgIC8qIFdlIGtub3cgd2UndmUgZ290IHNvbWUgYXJnIHJlZ2lzdGVyIHNwYWNlIGxlZnQuICBJZiB0aGlzIGFyZ3VtZW50CisJIHdpbGwgZml0IGVudGlyZWx5IGluIHJlZ3MsIHRoZW4gcHV0IGl0IHRoZXJlLiAgKi8KKyAgICAgIGVsc2UgaWYgKGFyZ19sZW5ndGggPD0gMgorCSAgICAgICB8fCBUWVBFX0NPREUgKFZBTFVFX1RZUEUgKGFyZ3NbYXJnbnVtXSkpID09IFRZUEVfQ09ERV9QVFIpIAorCXsKKwkgIHJlZ3N1c2VkKys7CisJfQorICAgICAgZWxzZSBpZiAocmVnc3VzZWQgPT0gMCkKKwl7CisJICByZWdzdXNlZCA9IDI7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHJlZ3N1c2VkID0gMjsKKwkgIGxlbiArPSBhcmdfbGVuZ3RoOworCX0KKyAgICB9CisKKyAgLyogQWxsb2NhdGUgc3RhY2sgc3BhY2UuICAqLworICBzcCAtPSBsZW47CisKKyAgcmVnc3VzZWQgPSBzdHJ1Y3RfcmV0dXJuID8gMSA6IDA7CisgIC8qIFB1c2ggYWxsIGFyZ3VtZW50cyBvbnRvIHRoZSBzdGFjay4gKi8KKyAgZm9yIChhcmdudW0gPSAwOyBhcmdudW0gPCBuYXJnczsgYXJnbnVtKyspCisgICAgeworICAgICAgaW50IGxlbjsKKyAgICAgIGNoYXIgKnZhbDsKKworICAgICAgLyogWFhYIENoZWNrIHRoaXMuICBXaGF0IGFib3V0IFVOSU9OUz8gICovCisgICAgICBpZiAoVFlQRV9DT0RFIChWQUxVRV9UWVBFICgqYXJncykpID09IFRZUEVfQ09ERV9TVFJVQ1QKKwkgICYmIFRZUEVfTEVOR1RIIChWQUxVRV9UWVBFICgqYXJncykpID4gOCkKKwl7CisJICAvKiBYWFggV3JvbmcsIHdlIHdhbnQgYSBwb2ludGVyIHRvIHRoaXMgYXJndW1lbnQuICAqLworICAgICAgICAgIGxlbiA9IFRZUEVfTEVOR1RIIChWQUxVRV9UWVBFICgqYXJncykpOworICAgICAgICAgIHZhbCA9IChjaGFyICopVkFMVUVfQ09OVEVOVFMgKCphcmdzKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbGVuID0gVFlQRV9MRU5HVEggKFZBTFVFX1RZUEUgKCphcmdzKSk7CisJICB2YWwgPSAoY2hhciAqKVZBTFVFX0NPTlRFTlRTICgqYXJncyk7CisJfQorCisgICAgICBpZiAocmVnc3VzZWQgPCAyCisJICAmJiAobGVuIDw9IDIKKwkgICAgICB8fCBUWVBFX0NPREUgKFZBTFVFX1RZUEUgKCphcmdzKSkgPT0gVFlQRV9DT0RFX1BUUikpCisJeworCSAgd3JpdGVfcmVnaXN0ZXIgKHJlZ3N1c2VkLCBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKHZhbCwgNCkpOworCSAgcmVnc3VzZWQrKzsKKwl9CisgICAgICBlbHNlIGlmIChyZWdzdXNlZCA9PSAwICYmIGxlbiA9PSA0KQorCXsKKwkgIHdyaXRlX3JlZ2lzdGVyIChyZWdzdXNlZCwgZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyICh2YWwsIDIpKTsKKwkgIHdyaXRlX3JlZ2lzdGVyIChyZWdzdXNlZCArIDEsIGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAodmFsICsgMiwgMikpOworCSAgcmVnc3VzZWQgPSAyOworCX0KKyAgICAgIGVsc2UKKwl7CisJICByZWdzdXNlZCA9IDI7CisJICB3aGlsZSAobGVuID4gMCkKKwkgICAgeworCSAgICAgIHdyaXRlX21lbW9yeSAoc3AgKyBzdGFja19vZmZzZXQsIHZhbCwgMik7CisKKwkgICAgICBsZW4gLT0gMjsKKwkgICAgICB2YWwgKz0gMjsKKwkgICAgICBzdGFja19vZmZzZXQgKz0gMjsKKwkgICAgfQorCX0KKyAgICAgIGFyZ3MrKzsKKyAgICB9CisKKyAgcmV0dXJuIHNwOworfQorCisvKiBGdW5jdGlvbjogcHVzaF9yZXR1cm5fYWRkcmVzcyAocGMpCisgICBTZXQgdXAgdGhlIHJldHVybiBhZGRyZXNzIGZvciB0aGUgaW5mZXJpb3IgZnVuY3Rpb24gY2FsbC4KKyAgIE5lZWRlZCBmb3IgdGFyZ2V0cyB3aGVyZSB3ZSBkb24ndCBhY3R1YWxseSBleGVjdXRlIGEgSlNSL0JTUiBpbnN0cnVjdGlvbiAqLworIAorQ09SRV9BRERSCittbjEwMjAwX3B1c2hfcmV0dXJuX2FkZHJlc3MgKHBjLCBzcCkKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBDT1JFX0FERFIgc3A7Cit7CisgIHVuc2lnbmVkIGNoYXIgYnVmWzRdOworCisgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgNCwgQ0FMTF9EVU1NWV9BRERSRVNTICgpKTsKKyAgd3JpdGVfbWVtb3J5IChzcCAtIDQsIGJ1ZiwgNCk7CisgIHJldHVybiBzcCAtIDQ7Cit9CisKKy8qIEZ1bmN0aW9uOiBzdG9yZV9zdHJ1Y3RfcmV0dXJuIChhZGRyLHNwKQorICAgU3RvcmUgdGhlIHN0cnVjdHVyZSB2YWx1ZSByZXR1cm4gYWRkcmVzcyBmb3IgYW4gaW5mZXJpb3IgZnVuY3Rpb24KKyAgIGNhbGwuICAqLworIAorQ09SRV9BRERSCittbjEwMjAwX3N0b3JlX3N0cnVjdF9yZXR1cm4gKGFkZHIsIHNwKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgQ09SRV9BRERSIHNwOworeworICAvKiBUaGUgc3RydWN0dXJlIHJldHVybiBhZGRyZXNzIGlzIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQuICAqLworICB3cml0ZV9yZWdpc3RlciAoMCwgYWRkcik7CisgIHJldHVybiBzcDsKK30KKyAKKy8qIEZ1bmN0aW9uOiBmcmFtZV9zYXZlZF9wYyAKKyAgIEZpbmQgdGhlIGNhbGxlciBvZiB0aGlzIGZyYW1lLiAgV2UgZG8gdGhpcyBieSBzZWVpbmcgaWYgUlBfUkVHTlVNCisgICBpcyBzYXZlZCBpbiB0aGUgc3RhY2sgYW55d2hlcmUsIG90aGVyd2lzZSB3ZSBnZXQgaXQgZnJvbSB0aGUKKyAgIHJlZ2lzdGVycy4gIElmIHRoZSBpbm5lciBmcmFtZSBpcyBhIGR1bW15IGZyYW1lLCByZXR1cm4gaXRzIFBDCisgICBpbnN0ZWFkIG9mIFJQLCBiZWNhdXNlIHRoYXQncyB3aGVyZSAiY2FsbGVyIiBvZiB0aGUgZHVtbXktZnJhbWUKKyAgIHdpbGwgYmUgZm91bmQuICAqLworCitDT1JFX0FERFIKK21uMTAyMDBfZnJhbWVfc2F2ZWRfcGMgKGZpKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7Cit7CisgIC8qIFRoZSBzYXZlZCBQQyB3aWxsIGFsd2F5cyBiZSBhdCB0aGUgYmFzZSBvZiB0aGUgY3VycmVudCBmcmFtZS4gICovCisgIHJldHVybiAocmVhZF9tZW1vcnlfaW50ZWdlciAoZmktPmZyYW1lLCBSRUdJU1RFUl9TSVpFKSAmIDB4ZmZmZmZmKTsKK30KKwordm9pZAorZ2V0X3NhdmVkX3JlZ2lzdGVyIChyYXdfYnVmZmVyLCBvcHRpbWl6ZWQsIGFkZHJwLCBmcmFtZSwgcmVnbnVtLCBsdmFsKQorICAgICBjaGFyICpyYXdfYnVmZmVyOworICAgICBpbnQgKm9wdGltaXplZDsKKyAgICAgQ09SRV9BRERSICphZGRycDsKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworICAgICBpbnQgcmVnbnVtOworICAgICBlbnVtIGx2YWxfdHlwZSAqbHZhbDsKK3sKKyAgZ2VuZXJpY19nZXRfc2F2ZWRfcmVnaXN0ZXIgKHJhd19idWZmZXIsIG9wdGltaXplZCwgYWRkcnAsIAorCQkJICAgICAgZnJhbWUsIHJlZ251bSwgbHZhbCk7Cit9CisKKy8qIEZ1bmN0aW9uOiBpbml0X2V4dHJhX2ZyYW1lX2luZm8KKyAgIFNldHVwIHRoZSBmcmFtZSdzIGZyYW1lIHBvaW50ZXIsIHBjLCBhbmQgZnJhbWUgYWRkcmVzc2VzIGZvciBzYXZlZAorICAgcmVnaXN0ZXJzLiAgTW9zdCBvZiB0aGUgd29yayBpcyBkb25lIGluIG1uMTAyMDBfYW5hbHl6ZV9wcm9sb2d1ZSgpLgorCisgICBOb3RlIHRoYXQgd2hlbiB3ZSBhcmUgY2FsbGVkIGZvciB0aGUgbGFzdCBmcmFtZSAoY3VycmVudGx5IGFjdGl2ZSBmcmFtZSksCisgICB0aGF0IGZpLT5wYyBhbmQgZmktPmZyYW1lIHdpbGwgYWxyZWFkeSBiZSBzZXR1cC4gIEhvd2V2ZXIsIGZpLT5mcmFtZSB3aWxsCisgICBiZSB2YWxpZCBvbmx5IGlmIHRoaXMgcm91dGluZSB1c2VzIEZQLiAgRm9yIHByZXZpb3VzIGZyYW1lcywgZmktZnJhbWUgd2lsbAorICAgYWx3YXlzIGJlIGNvcnJlY3QuICBtbjEwMjAwX2FuYWx5emVfcHJvbG9ndWUgd2lsbCBmaXggZmktPmZyYW1lIGlmCisgICBpdCdzIG5vdCB2YWxpZC4KKworICAgV2UgY2FuIGJlIGNhbGxlZCB3aXRoIHRoZSBQQyBpbiB0aGUgY2FsbCBkdW1teSB1bmRlciB0d28gY2lyY3Vtc3RhbmNlcy4KKyAgIEZpcnN0LCBkdXJpbmcgbm9ybWFsIGJhY2t0cmFjaW5nLCBzZWNvbmQsIHdoaWxlIGZpZ3VyaW5nIG91dCB0aGUgZnJhbWUKKyAgIHBvaW50ZXIganVzdCBwcmlvciB0byBjYWxsaW5nIHRoZSB0YXJnZXQgZnVuY3Rpb24gKHNlZSBydW5fc3RhY2tfZHVtbXkpLiAgKi8KKwordm9pZAorbW4xMDIwMF9pbml0X2V4dHJhX2ZyYW1lX2luZm8gKGZpKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7Cit7CisgIGlmIChmaS0+bmV4dCkKKyAgICBmaS0+cGMgPSBGUkFNRV9TQVZFRF9QQyAoZmktPm5leHQpOworCisgIG1lbXNldCAoZmktPmZzci5yZWdzLCAnXDAwMCcsIHNpemVvZiBmaS0+ZnNyLnJlZ3MpOworICBmaS0+c3RhdHVzID0gMDsKKyAgZmktPnN0YWNrX3NpemUgPSAwOworCisgIG1uMTAyMDBfYW5hbHl6ZV9wcm9sb2d1ZSAoZmksIDApOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9tbjEwMjAwX3RkZXAgKCkKK3sKKyAgdG1fcHJpbnRfaW5zbiA9IHByaW50X2luc25fbW4xMDIwMDsKK30KKwpkaWZmIC0tZ2l0IGEvZ2RiL21uMTAzMDAtdGRlcC5jIGIvZ2RiL21uMTAzMDAtdGRlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDMxNzYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbW4xMDMwMC10ZGVwLmMKQEAgLTAsMCArMSw3OTEgQEAKKy8qIFRhcmdldC1kZXBlbmRlbnQgY29kZSBmb3IgdGhlIE1hdHN1c2hpdGEgTU4xMDMwMCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAib2JzdGFjay5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisKK3N0YXRpYyBjaGFyICptbjEwMzAwX2dlbmVyaWNfcmVnaXN0ZXJfbmFtZXNbXSA9IAoreyAiZDAiLCAiZDEiLCAiZDIiLCAiZDMiLCAiYTAiLCAiYTEiLCAiYTIiLCAiYTMiLAorICAic3AiLCAicGMiLCAibWRyIiwgInBzdyIsICJsaXIiLCAibGFyIiwgIiIsICIiLAorICAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsCisgICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiZnAiIH07CisKK2NoYXIgKiptbjEwMzAwX3JlZ2lzdGVyX25hbWVzID0gbW4xMDMwMF9nZW5lcmljX3JlZ2lzdGVyX25hbWVzOworCitzdGF0aWMgQ09SRV9BRERSIG1uMTAzMDBfYW5hbHl6ZV9wcm9sb2d1ZSBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqZmksCisJCQkJCQkgIENPUkVfQUREUiBwYykpOworCisvKiBBZGRpdGlvbmFsIGluZm8gdXNlZCBieSB0aGUgZnJhbWUgKi8KKworc3RydWN0IGZyYW1lX2V4dHJhX2luZm8KK3sKKyAgaW50IHN0YXR1czsKKyAgaW50IHN0YWNrX3NpemU7Cit9OworCitzdGF0aWMgc3RydWN0IGZyYW1lX2luZm8gKmFuYWx5emVfZHVtbXlfZnJhbWUgUEFSQU1TICgoQ09SRV9BRERSLCBDT1JFX0FERFIpKTsKK3N0YXRpYyBzdHJ1Y3QgZnJhbWVfaW5mbyAqCithbmFseXplX2R1bW15X2ZyYW1lIChwYywgZnJhbWUpCisgICAgIENPUkVfQUREUiBwYzsKKyAgICAgQ09SRV9BRERSIGZyYW1lOworeworICBzdGF0aWMgc3RydWN0IGZyYW1lX2luZm8gKmR1bW15ID0gTlVMTDsKKyAgaWYgKGR1bW15ID09IE5VTEwpCisgICAgeworICAgICAgZHVtbXkgPSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBmcmFtZV9pbmZvKSk7CisgICAgICBkdW1teS0+c2F2ZWRfcmVncyA9IHhtYWxsb2MgKFNJWkVPRl9GUkFNRV9TQVZFRF9SRUdTKTsKKyAgICAgIGR1bW15LT5leHRyYV9pbmZvID0geG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZnJhbWVfZXh0cmFfaW5mbykpOworICAgIH0KKyAgZHVtbXktPm5leHQgPSBOVUxMOworICBkdW1teS0+cHJldiA9IE5VTEw7CisgIGR1bW15LT5wYyA9IHBjOworICBkdW1teS0+ZnJhbWUgPSBmcmFtZTsKKyAgZHVtbXktPmV4dHJhX2luZm8tPnN0YXR1cyA9IDA7CisgIGR1bW15LT5leHRyYV9pbmZvLT5zdGFja19zaXplID0gMDsKKyAgbWVtc2V0IChkdW1teS0+c2F2ZWRfcmVncywgJ1wwMDAnLCBTSVpFT0ZfRlJBTUVfU0FWRURfUkVHUyk7CisgIG1uMTAzMDBfYW5hbHl6ZV9wcm9sb2d1ZSAoZHVtbXksIDApOworICByZXR1cm4gZHVtbXk7Cit9CisKKy8qIFZhbHVlcyBmb3IgZnJhbWVfaW5mby5zdGF0dXMgKi8KKworI2RlZmluZSBNWV9GUkFNRV9JTl9TUCAweDEKKyNkZWZpbmUgTVlfRlJBTUVfSU5fRlAgMHgyCisjZGVmaW5lIE5PX01PUkVfRlJBTUVTIDB4NAorCisKKy8qIFNob3VsZCBjYWxsX2Z1bmN0aW9uIGFsbG9jYXRlIHN0YWNrIHNwYWNlIGZvciBhIHN0cnVjdCByZXR1cm4/ICAqLworaW50CittbjEwMzAwX3VzZV9zdHJ1Y3RfY29udmVudGlvbiAoZ2NjX3AsIHR5cGUpCisgICAgIGludCBnY2NfcDsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIHJldHVybiAoVFlQRV9ORklFTERTICh0eXBlKSA+IDEgfHwgVFlQRV9MRU5HVEggKHR5cGUpID4gOCk7Cit9CisKKy8qIFRoZSBicmVha3BvaW50IGluc3RydWN0aW9uIG11c3QgYmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgc21hbGxlc3QKKyAgIGluc3RydWN0aW9uIGluIHRoZSBpbnN0cnVjdGlvbiBzZXQuCisKKyAgIFRoZSBNYXRzdXNoaXRhIG1uMTB4MDAgcHJvY2Vzc29ycyBoYXZlIHNpbmdsZSBieXRlIGluc3RydWN0aW9ucworICAgc28gd2UgbmVlZCBhIHNpbmdsZSBieXRlIGJyZWFrcG9pbnQuICBNYXRzdXNoaXRhIGhhc24ndCBkZWZpbmVkCisgICBvbmUsIHNvIHdlIGRlZmluZWQgaXQgb3Vyc2VsdmVzLiAgKi8KKwordW5zaWduZWQgY2hhciAqCittbjEwMzAwX2JyZWFrcG9pbnRfZnJvbV9wYyAoYnBfYWRkciwgYnBfc2l6ZSkKKyAgICAgQ09SRV9BRERSICpicF9hZGRyOworICAgICBpbnQgKmJwX3NpemU7Cit7CisgIHN0YXRpYyBjaGFyIGJyZWFrcG9pbnRbXSA9IHsweGZmfTsKKyAgKmJwX3NpemUgPSAxOworICByZXR1cm4gYnJlYWtwb2ludDsKK30KKworCisvKiBGaXggZmktPmZyYW1lIGlmIGl0J3MgYm9ndXMgYXQgdGhpcyBwb2ludC4gIFRoaXMgaXMgYSBoZWxwZXIKKyAgIGZ1bmN0aW9uIGZvciBtbjEwMzAwX2FuYWx5emVfcHJvbG9ndWUuICovCisKK3N0YXRpYyB2b2lkCitmaXhfZnJhbWVfcG9pbnRlciAoZmksIHN0YWNrX3NpemUpCisgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworICAgIGludCBzdGFja19zaXplOworeworICBpZiAoZmkgJiYgZmktPm5leHQgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZmktPmV4dHJhX2luZm8tPnN0YXR1cyAmIE1ZX0ZSQU1FX0lOX1NQKQorCWZpLT5mcmFtZSA9IHJlYWRfc3AgKCkgLSBzdGFja19zaXplOworICAgICAgZWxzZSBpZiAoZmktPmV4dHJhX2luZm8tPnN0YXR1cyAmIE1ZX0ZSQU1FX0lOX0ZQKQorCWZpLT5mcmFtZSA9IHJlYWRfcmVnaXN0ZXIgKEEzX1JFR05VTSk7CisgICAgfQorfQorCisKKy8qIFNldCBvZmZzZXRzIG9mIHJlZ2lzdGVycyBzYXZlZCBieSBtb3ZtIGluc3RydWN0aW9uLgorICAgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgbW4xMDMwMF9hbmFseXplX3Byb2xvZ3VlLiAgKi8KKworc3RhdGljIHZvaWQKK3NldF9tb3ZtX29mZnNldHMgKGZpLCBtb3ZtX2FyZ3MpCisgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworICAgIGludCBtb3ZtX2FyZ3M7Cit7CisgIGludCBvZmZzZXQgPSAwOworCisgIGlmIChmaSA9PSBOVUxMIHx8IG1vdm1fYXJncyA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAobW92bV9hcmdzICYgMHgxMCkKKyAgICB7CisgICAgICBmaS0+c2F2ZWRfcmVnc1tBM19SRUdOVU1dID0gZmktPmZyYW1lICsgb2Zmc2V0OworICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgfQorICBpZiAobW92bV9hcmdzICYgMHgyMCkKKyAgICB7CisgICAgICBmaS0+c2F2ZWRfcmVnc1tBMl9SRUdOVU1dID0gZmktPmZyYW1lICsgb2Zmc2V0OworICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgfQorICBpZiAobW92bV9hcmdzICYgMHg0MCkKKyAgICB7CisgICAgICBmaS0+c2F2ZWRfcmVnc1tEM19SRUdOVU1dID0gZmktPmZyYW1lICsgb2Zmc2V0OworICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgfQorICBpZiAobW92bV9hcmdzICYgMHg4MCkKKyAgICB7CisgICAgICBmaS0+c2F2ZWRfcmVnc1tEMl9SRUdOVU1dID0gZmktPmZyYW1lICsgb2Zmc2V0OworICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgfQorfQorCisKKy8qIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIGRlYWxpbmcgd2l0aCBwcm9sb2d1ZXMgdG8gZXh0cmFjdAorICAgaW5mb3JtYXRpb24gYWJvdXQgc3RhY2sgZnJhbWVzIGFuZCBzYXZlZCByZWdpc3RlcnMuCisKKyAgIEZvciByZWZlcmVuY2UgaGVyZSdzIGhvdyBwcm9sb2d1ZXMgbG9vayBvbiB0aGUgbW4xMDMwMDoKKworICAgICBXaXRoIGZyYW1lIHBvaW50ZXI6CisJbW92bSBbZDIsZDMsYTIsYTNdLHNwCisJbW92IHNwLGEzCisJYWRkIDxzaXplPixzcAorCisgICAgIFdpdGhvdXQgZnJhbWUgcG9pbnRlcjoKKwltb3ZtIFtkMixkMyxhMixhM10sc3AgKGlmIG5lZWRlZCkKKyAgICAgICAgYWRkIDxzaXplPixzcAorCisgICBPbmUgZGF5IHdlIG1pZ2h0IGtlZXAgdGhlIHN0YWNrIHBvaW50ZXIgY29uc3RhbnQsIHRoYXQgd29uJ3QKKyAgIGNoYW5nZSB0aGUgY29kZSBmb3IgcHJvbG9ndWVzLCBidXQgaXQgd2lsbCBtYWtlIHRoZSBmcmFtZQorICAgcG9pbnRlcmxlc3MgY2FzZSBtdWNoIG1vcmUgY29tbW9uLiAgKi8KKwkKKy8qIEFuYWx5emUgdGhlIHByb2xvZ3VlIHRvIGRldGVybWluZSB3aGVyZSByZWdpc3RlcnMgYXJlIHNhdmVkLAorICAgdGhlIGVuZCBvZiB0aGUgcHJvbG9ndWUsIGV0YyBldGMuICBSZXR1cm4gdGhlIGVuZCBvZiB0aGUgcHJvbG9ndWUKKyAgIHNjYW5uZWQuCisKKyAgIFdlIHN0b3JlIGludG8gRkkgKGlmIG5vbi1udWxsKSBzZXZlcmFsIHRpZGJpdHMgb2YgaW5mb3JtYXRpb246CisKKyAgICAqIHN0YWNrX3NpemUgLS0gc2l6ZSBvZiB0aGlzIHN0YWNrIGZyYW1lLiAgTm90ZSB0aGF0IGlmIHdlIHN0b3AgaW4KKyAgICBjZXJ0YWluIHBhcnRzIG9mIHRoZSBwcm9sb2d1ZS9lcGlsb2d1ZSB3ZSBtYXkgY2xhaW0gdGhlIHNpemUgb2YgdGhlCisgICAgY3VycmVudCBmcmFtZSBpcyB6ZXJvLiAgVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGN1cnJlbnQgZnJhbWUgaGFzCisgICAgbm90IGJlZW4gYWxsb2NhdGVkIHlldCBvciBoYXMgYWxyZWFkeSBiZWVuIGRlYWxsb2NhdGVkLgorCisgICAgKiBmc3IgLS0gQWRkcmVzc2VzIG9mIHJlZ2lzdGVycyBzYXZlZCBpbiB0aGUgc3RhY2sgYnkgdGhpcyBmcmFtZS4KKworICAgICogc3RhdHVzIC0tIEEgKHJlbGF0aXZlbHkpIGdlbmVyaWMgc3RhdHVzIGluZGljYXRvci4gIEl0J3MgYSBiaXRtYXNrCisgICAgd2l0aCB0aGUgZm9sbG93aW5nIGJpdHM6IAorCisgICAgICBNWV9GUkFNRV9JTl9TUDogVGhlIGJhc2Ugb2YgdGhlIGN1cnJlbnQgZnJhbWUgaXMgYWN0dWFsbHkgaW4KKyAgICAgIHRoZSBzdGFjayBwb2ludGVyLiAgVGhpcyBjYW4gaGFwcGVuIGZvciBmcmFtZSBwb2ludGVybGVzcworICAgICAgZnVuY3Rpb25zLCBvciBjYXNlcyB3aGVyZSB3ZSdyZSBzdG9wcGVkIGluIHRoZSBwcm9sb2d1ZS9lcGlsb2d1ZQorICAgICAgaXRzZWxmLiAgRm9yIHRoZXNlIGNhc2VzIG1uMTAzMDBfYW5hbHl6ZV9wcm9sb2d1ZSB3aWxsIG5lZWQgdXAKKyAgICAgIHVwZGF0ZSBmaS0+ZnJhbWUgYmVmb3JlIHJldHVybmluZyBvciBhbmFseXppbmcgdGhlIHJlZ2lzdGVyCisgICAgICBzYXZlIGluc3RydWN0aW9ucy4KKworICAgICAgTVlfRlJBTUVfSU5fRlA6IFRoZSBiYXNlIG9mIHRoZSBjdXJyZW50IGZyYW1lIGlzIGluIHRoZQorICAgICAgZnJhbWUgcG9pbnRlciByZWdpc3RlciAoJGEyKS4KKworICAgICAgTk9fTU9SRV9GUkFNRVM6IFNldCB0aGlzIGlmIHRoZSBjdXJyZW50IGZyYW1lIGlzICJzdGFydCIgb3IKKyAgICAgIGlmIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBsb29rcyBsaWtlIG1vdiA8aW1tPixzcC4gIFRoaXMgdGVsbHMKKyAgICAgIGZyYW1lIGNoYWluIHRvIG5vdCBib3RoZXIgdHJ5aW5nIHRvIHVud2luZCBwYXN0IHRoaXMgZnJhbWUuICAqLworCitzdGF0aWMgQ09SRV9BRERSCittbjEwMzAwX2FuYWx5emVfcHJvbG9ndWUgKGZpLCBwYykKKyAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7CisgICAgQ09SRV9BRERSIHBjOworeworICBDT1JFX0FERFIgZnVuY19hZGRyLCBmdW5jX2VuZCwgYWRkciwgc3RvcDsKKyAgQ09SRV9BRERSIHN0YWNrX3NpemU7CisgIGludCBpbW1fc2l6ZTsKKyAgdW5zaWduZWQgY2hhciBidWZbNF07CisgIGludCBzdGF0dXMsIG1vdm1fYXJncyA9IDA7CisgIGNoYXIgKm5hbWU7CisKKyAgLyogVXNlIHRoZSBQQyBpbiB0aGUgZnJhbWUgaWYgaXQncyBwcm92aWRlZCB0byBsb29rIHVwIHRoZQorICAgICBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uLiAgKi8KKyAgcGMgPSAoZmkgPyBmaS0+cGMgOiBwYyk7CisKKyAgLyogRmluZCB0aGUgc3RhcnQgb2YgdGhpcyBmdW5jdGlvbi4gICovCisgIHN0YXR1cyA9IGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAocGMsICZuYW1lLCAmZnVuY19hZGRyLCAmZnVuY19lbmQpOworCisgIC8qIERvIG5vdGhpbmcgaWYgd2UgY291bGRuJ3QgZmluZCB0aGUgc3RhcnQgb2YgdGhpcyBmdW5jdGlvbiBvciBpZiB3ZSdyZQorICAgICBzdG9wcGVkIGF0IHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpbiB0aGUgcHJvbG9ndWUuICAqLworICBpZiAoc3RhdHVzID09IDApCisgICAgcmV0dXJuIHBjOworCisgIC8qIElmIHdlJ3JlIGluIHN0YXJ0LCB0aGVuIGdpdmUgdXAuICAqLworICBpZiAoc3RyY21wIChuYW1lLCAic3RhcnQiKSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChmaSAhPSBOVUxMKQorCWZpLT5leHRyYV9pbmZvLT5zdGF0dXMgPSBOT19NT1JFX0ZSQU1FUzsKKyAgICAgIHJldHVybiBwYzsKKyAgICB9CisKKyAgLyogQXQgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24gb3VyIGZyYW1lIGlzIGluIHRoZSBzdGFjayBwb2ludGVyLiAgKi8KKyAgaWYgKGZpKQorICAgIGZpLT5leHRyYV9pbmZvLT5zdGF0dXMgPSBNWV9GUkFNRV9JTl9TUDsKKworICAvKiBHZXQgdGhlIG5leHQgdHdvIGJ5dGVzIGludG8gYnVmLCB3ZSBuZWVkIHR3byBiZWNhdXNlIHJldHMgaXMgYSB0d28KKyAgICAgYnl0ZSBpbnNuIGFuZCB0aGUgZmlyc3QgaXNuJ3QgZW5vdWdoIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGl0LiAgKi8KKyAgc3RhdHVzID0gcmVhZF9tZW1vcnlfbm9icHQgKHBjLCBidWYsIDIpOworICBpZiAoc3RhdHVzICE9IDApCisgICAgcmV0dXJuIHBjOworCisgIC8qIElmIHdlJ3JlIHBoeXNpY2FsbHkgb24gYW4gInJldHMiIGluc3RydWN0aW9uLCB0aGVuIG91ciBmcmFtZSBoYXMKKyAgICAgYWxyZWFkeSBiZWVuIGRlYWxsb2NhdGVkLiAgTm90ZSB0aGlzIGNhbiBhbHNvIGJlIHRydWUgZm9yIHJldGYKKyAgICAgYW5kIHJldCBpZiB0aGV5IHNwZWNpZnkgYSBzaXplIG9mIHplcm8uCisKKyAgICAgSW4gdGhpcyBjYXNlIGZpLT5mcmFtZSBpcyBib2d1cywgd2UgbmVlZCB0byBmaXggaXQuICAqLworICBpZiAoZmkgJiYgYnVmWzBdID09IDB4ZjAgJiYgYnVmWzFdID09IDB4ZmMpCisgICAgeworICAgICAgaWYgKGZpLT5uZXh0ID09IE5VTEwpCisJZmktPmZyYW1lID0gcmVhZF9zcCAoKTsKKyAgICAgIHJldHVybiBmaS0+cGM7CisgICAgfQorCisgIC8qIFNpbWlsYXJseSBpZiB3ZSdyZSBzdG9wcGVkIG9uIHRoZSBmaXJzdCBpbnNuIG9mIGEgcHJvbG9ndWUgYXMgb3VyCisgICAgIGZyYW1lIGhhc24ndCBiZWVuIGFsbG9jYXRlZCB5ZXQuICAqLworICBpZiAoZmkgJiYgZmktPnBjID09IGZ1bmNfYWRkcikKKyAgICB7CisgICAgICBpZiAoZmktPm5leHQgPT0gTlVMTCkKKwlmaS0+ZnJhbWUgPSByZWFkX3NwICgpOworICAgICAgcmV0dXJuIGZpLT5wYzsKKyAgICB9CisKKyAgLyogRmlndXJlIG91dCB3aGVyZSB0byBzdG9wIHNjYW5uaW5nLiAgKi8KKyAgc3RvcCA9IGZpID8gZmktPnBjIDogZnVuY19lbmQ7CisKKyAgLyogRG9uJ3Qgd2FsayBvZmYgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uICAqLworICBzdG9wID0gc3RvcCA+IGZ1bmNfZW5kID8gZnVuY19lbmQgOiBzdG9wOworCisgIC8qIFN0YXJ0IHNjYW5uaW5nIG9uIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLiAgKi8KKyAgYWRkciA9IGZ1bmNfYWRkcjsKKworICAvKiBTdWNrIGluIHR3byBieXRlcy4gICovCisgIHN0YXR1cyA9IHJlYWRfbWVtb3J5X25vYnB0IChhZGRyLCBidWYsIDIpOworICBpZiAoc3RhdHVzICE9IDApCisgICAgeworICAgICAgZml4X2ZyYW1lX3BvaW50ZXIgKGZpLCAwKTsKKyAgICAgIHJldHVybiBhZGRyOworICAgIH0KKworICAvKiBGaXJzdCBzZWUgaWYgdGhpcyBpbnNuIHNldHMgdGhlIHN0YWNrIHBvaW50ZXI7IGlmIHNvLCBpdCdzIHNvbWV0aGluZworICAgICB3ZSB3b24ndCB1bmRlcnN0YW5kLCBzbyBxdWl0IG5vdy4gICAqLworICBpZiAoYnVmWzBdID09IDB4ZjIgJiYgKGJ1ZlsxXSAmIDB4ZjMpID09IDB4ZjApCisgICAgeworICAgICAgaWYgKGZpKQorCWZpLT5leHRyYV9pbmZvLT5zdGF0dXMgPSBOT19NT1JFX0ZSQU1FUzsKKyAgICAgIHJldHVybiBhZGRyOworICAgIH0KKworICAvKiBOb3cgbG9vayBmb3IgbW92bSBbcmVnc10sc3AsIHdoaWNoIHNhdmVzIHRoZSBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzLgorCisgICAgIEF0IHRoaXMgdGltZSB3ZSBkb24ndCBrbm93IGlmIGZpLT5mcmFtZSBpcyB2YWxpZCwgc28gd2Ugb25seSBub3RlCisgICAgIHRoYXQgd2UgZW5jb3VudGVyZWQgYSBtb3ZtIGluc3RydWN0aW9uLiAgTGF0ZXIsIHdlJ2xsIHNldCB0aGUgZW50cmllcworICAgICBpbiBmc3IucmVncyBhcyBuZWVkZWQuICAqLworICBpZiAoYnVmWzBdID09IDB4Y2YpCisgICAgeworICAgICAgLyogRXh0cmFjdCB0aGUgcmVnaXN0ZXIgbGlzdCBmb3IgdGhlIG1vdm0gaW5zdHJ1Y3Rpb24uICAqLworICAgICAgc3RhdHVzID0gcmVhZF9tZW1vcnlfbm9icHQgKGFkZHIgKyAxLCBidWYsIDEpOworICAgICAgbW92bV9hcmdzID0gKmJ1ZjsKKworICAgICAgYWRkciArPSAyOworCisgICAgICAvKiBRdWl0IG5vdyBpZiB3ZSdyZSBiZXlvbmQgdGhlIHN0b3AgcG9pbnQuICAqLworICAgICAgaWYgKGFkZHIgPj0gc3RvcCkKKwl7CisJICAvKiBGaXggZmktPmZyYW1lIHNpbmNlIGl0J3MgYm9ndXMgYXQgdGhpcyBwb2ludC4gICovCisJICBpZiAoZmkgJiYgZmktPm5leHQgPT0gTlVMTCkKKwkgICAgZmktPmZyYW1lID0gcmVhZF9zcCAoKTsKKworCSAgLyogTm90ZSBpZi93aGVyZSBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzIHdlcmUgc2F2ZWQuICAqLworCSAgc2V0X21vdm1fb2Zmc2V0cyAoZmksIG1vdm1fYXJncyk7CisJICByZXR1cm4gYWRkcjsKKwl9CisKKyAgICAgIC8qIEdldCB0aGUgbmV4dCB0d28gYnl0ZXMgc28gdGhlIHByb2xvZ3VlIHNjYW4gY2FuIGNvbnRpbnVlLiAgKi8KKyAgICAgIHN0YXR1cyA9IHJlYWRfbWVtb3J5X25vYnB0IChhZGRyLCBidWYsIDIpOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXsKKwkgIC8qIEZpeCBmaS0+ZnJhbWUgc2luY2UgaXQncyBib2d1cyBhdCB0aGlzIHBvaW50LiAgKi8KKwkgIGlmIChmaSAmJiBmaS0+bmV4dCA9PSBOVUxMKQorCSAgICBmaS0+ZnJhbWUgPSByZWFkX3NwICgpOworCisJICAvKiBOb3RlIGlmL3doZXJlIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMgd2VyZSBzYXZlZC4gICovCisJICBzZXRfbW92bV9vZmZzZXRzIChmaSwgbW92bV9hcmdzKTsKKwkgIHJldHVybiBhZGRyOworCX0KKyAgICB9CisKKyAgLyogTm93IHNlZSBpZiB3ZSBzZXQgdXAgYSBmcmFtZSBwb2ludGVyIHZpYSAibW92IHNwLGEzIiAqLworICBpZiAoYnVmWzBdID09IDB4M2YpCisgICAgeworICAgICAgYWRkciArPSAxOworCisgICAgICAvKiBUaGUgZnJhbWUgcG9pbnRlciBpcyBub3cgdmFsaWQuICAqLworICAgICAgaWYgKGZpKQorCXsKKwkgIGZpLT5leHRyYV9pbmZvLT5zdGF0dXMgfD0gTVlfRlJBTUVfSU5fRlA7CisJICBmaS0+ZXh0cmFfaW5mby0+c3RhdHVzICY9IH5NWV9GUkFNRV9JTl9TUDsKKwl9CisKKyAgICAgIC8qIFF1aXQgbm93IGlmIHdlJ3JlIGJleW9uZCB0aGUgc3RvcCBwb2ludC4gICovCisgICAgICBpZiAoYWRkciA+PSBzdG9wKQorCXsKKwkgIC8qIEZpeCBmaS0+ZnJhbWUgaWYgaXQncyBib2d1cyBhdCB0aGlzIHBvaW50LiAgKi8KKwkgIGZpeF9mcmFtZV9wb2ludGVyIChmaSwgMCk7CisKKwkgIC8qIE5vdGUgaWYvd2hlcmUgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycyB3ZXJlIHNhdmVkLiAgKi8KKwkgIHNldF9tb3ZtX29mZnNldHMgKGZpLCBtb3ZtX2FyZ3MpOworCSAgcmV0dXJuIGFkZHI7CisJfQorCisgICAgICAvKiBHZXQgdHdvIG1vcmUgYnl0ZXMgc28gc2Nhbm5pbmcgY2FuIGNvbnRpbnVlLiAgKi8KKyAgICAgIHN0YXR1cyA9IHJlYWRfbWVtb3J5X25vYnB0IChhZGRyLCBidWYsIDIpOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXsKKwkgIC8qIEZpeCBmaS0+ZnJhbWUgaWYgaXQncyBib2d1cyBhdCB0aGlzIHBvaW50LiAgKi8KKwkgIGZpeF9mcmFtZV9wb2ludGVyIChmaSwgMCk7CisKKwkgIC8qIE5vdGUgaWYvd2hlcmUgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycyB3ZXJlIHNhdmVkLiAgKi8KKwkgIHNldF9tb3ZtX29mZnNldHMgKGZpLCBtb3ZtX2FyZ3MpOworCSAgcmV0dXJuIGFkZHI7CisJfQorICAgIH0KKyAgCisgIC8qIE5leHQgd2Ugc2hvdWxkIGFsbG9jYXRlIHRoZSBsb2NhbCBmcmFtZS4gIE5vIG1vcmUgcHJvbG9ndWUgaW5zbnMKKyAgICAgYXJlIGZvdW5kIGFmdGVyIGFsbG9jYXRpbmcgdGhlIGxvY2FsIGZyYW1lLgorICAgICAgIAorICAgICBTZWFyY2ggZm9yIGFkZCBpbW04LHNwICgweGY4ZmVYWCkKKyAgICAgICAgb3IJYWRkIGltbTE2LHNwICgweGZhZmVYWFhYKQorICAgICAgICBvcglhZGQgaW1tMzIsc3AgKDB4ZmNmZVhYWFhYWFhYKS4KKyAgICAgICAKKyAgICAgSWYgbm9uZSBvZiB0aGUgYWJvdmUgd2FzIGZvdW5kLCB0aGVuIHRoaXMgcHJvbG9ndWUgaGFzIG5vIAorICAgICBhZGRpdGlvbmFsIHN0YWNrLiAgKi8KKworICBzdGF0dXMgPSByZWFkX21lbW9yeV9ub2JwdCAoYWRkciwgYnVmLCAyKTsKKyAgaWYgKHN0YXR1cyAhPSAwKQorICAgIHsKKyAgICAgIC8qIEZpeCBmaS0+ZnJhbWUgaWYgaXQncyBib2d1cyBhdCB0aGlzIHBvaW50LiAgKi8KKyAgICAgIGZpeF9mcmFtZV9wb2ludGVyIChmaSwgMCk7CisKKyAgICAgIC8qIE5vdGUgaWYvd2hlcmUgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycyB3ZXJlIHNhdmVkLiAgKi8KKyAgICAgIHNldF9tb3ZtX29mZnNldHMgKGZpLCBtb3ZtX2FyZ3MpOworICAgICAgcmV0dXJuIGFkZHI7CisgICAgfQorCisgIGltbV9zaXplID0gMDsKKyAgaWYgKGJ1ZlswXSA9PSAweGY4ICYmIGJ1ZlsxXSA9PSAweGZlKQorICAgIGltbV9zaXplID0gMTsKKyAgZWxzZSBpZiAoYnVmWzBdID09IDB4ZmEgJiYgYnVmWzFdID09IDB4ZmUpCisgICAgaW1tX3NpemUgPSAyOworICBlbHNlIGlmIChidWZbMF0gPT0gMHhmYyAmJiBidWZbMV0gPT0gMHhmZSkKKyAgICBpbW1fc2l6ZSA9IDQ7CisKKyAgaWYgKGltbV9zaXplICE9IDApCisgICAgeworICAgICAgLyogU3VjayBpbiBpbW1fc2l6ZSBtb3JlIGJ5dGVzLCB0aGV5J2xsIGhvbGQgdGhlIHNpemUgb2YgdGhlCisgICAgICAgICBjdXJyZW50IGZyYW1lLiAgKi8KKyAgICAgIHN0YXR1cyA9IHJlYWRfbWVtb3J5X25vYnB0IChhZGRyICsgMiwgYnVmLCBpbW1fc2l6ZSk7CisgICAgICBpZiAoc3RhdHVzICE9IDApCisJeworCSAgLyogRml4IGZpLT5mcmFtZSBpZiBpdCdzIGJvZ3VzIGF0IHRoaXMgcG9pbnQuICAqLworCSAgZml4X2ZyYW1lX3BvaW50ZXIgKGZpLCAwKTsKKworCSAgLyogTm90ZSBpZi93aGVyZSBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzIHdlcmUgc2F2ZWQuICAqLworCSAgc2V0X21vdm1fb2Zmc2V0cyAoZmksIG1vdm1fYXJncyk7CisJICByZXR1cm4gYWRkcjsKKwl9CisKKyAgICAgIC8qIE5vdGUgdGhlIHNpemUgb2YgdGhlIHN0YWNrIGluIHRoZSBmcmFtZSBpbmZvIHN0cnVjdHVyZS4gICovCisgICAgICBzdGFja19zaXplID0gZXh0cmFjdF9zaWduZWRfaW50ZWdlciAoYnVmLCBpbW1fc2l6ZSk7CisgICAgICBpZiAoZmkpCisJZmktPmV4dHJhX2luZm8tPnN0YWNrX3NpemUgPSBzdGFja19zaXplOworCisgICAgICAvKiBXZSBqdXN0IGNvbnN1bWVkIDIgKyBpbW1fc2l6ZSBieXRlcy4gICovCisgICAgICBhZGRyICs9IDIgKyBpbW1fc2l6ZTsKKworICAgICAgLyogTm8gbW9yZSBwcm9sb2d1ZSBpbnNucyBmb2xsb3csIHNvIGJlZ2luIHByZXBhcmF0aW9uIHRvIHJldHVybi4gICovCisgICAgICAvKiBGaXggZmktPmZyYW1lIGlmIGl0J3MgYm9ndXMgYXQgdGhpcyBwb2ludC4gICovCisgICAgICBmaXhfZnJhbWVfcG9pbnRlciAoZmksIHN0YWNrX3NpemUpOworCisgICAgICAvKiBOb3RlIGlmL3doZXJlIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMgd2VyZSBzYXZlZC4gICovCisgICAgICBzZXRfbW92bV9vZmZzZXRzIChmaSwgbW92bV9hcmdzKTsKKyAgICAgIHJldHVybiBhZGRyOworICAgIH0KKworICAvKiBXZSBuZXZlciBmb3VuZCBhbiBpbnNuIHdoaWNoIGFsbG9jYXRlcyBsb2NhbCBzdGFjayBzcGFjZSwgcmVnYXJkbGVzcworICAgICB0aGlzIGlzIHRoZSBlbmQgb2YgdGhlIHByb2xvZ3VlLiAgKi8KKyAgLyogRml4IGZpLT5mcmFtZSBpZiBpdCdzIGJvZ3VzIGF0IHRoaXMgcG9pbnQuICAqLworICBmaXhfZnJhbWVfcG9pbnRlciAoZmksIDApOworCisgIC8qIE5vdGUgaWYvd2hlcmUgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycyB3ZXJlIHNhdmVkLiAgKi8KKyAgc2V0X21vdm1fb2Zmc2V0cyAoZmksIG1vdm1fYXJncyk7CisgIHJldHVybiBhZGRyOworfQorICAKKy8qIEZ1bmN0aW9uOiBmcmFtZV9jaGFpbgorICAgRmlndXJlIG91dCBhbmQgcmV0dXJuIHRoZSBjYWxsZXIncyBmcmFtZSBwb2ludGVyIGdpdmVuIGN1cnJlbnQKKyAgIGZyYW1lX2luZm8gc3RydWN0LgorCisgICBXZSBkb24ndCBoYW5kbGUgZHVtbXkgZnJhbWVzIHlldCBidXQgd2Ugd291bGQgcHJvYmFibHkganVzdCByZXR1cm4gdGhlCisgICBzdGFjayBwb2ludGVyIHRoYXQgd2FzIGluIHVzZSBhdCB0aGUgdGltZSB0aGUgZnVuY3Rpb24gY2FsbCB3YXMgbWFkZT8gICovCisKK0NPUkVfQUREUgorbW4xMDMwMF9mcmFtZV9jaGFpbiAoZmkpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKK3sKKyAgc3RydWN0IGZyYW1lX2luZm8gKmR1bW15OworICAvKiBXYWxrIHRocm91Z2ggdGhlIHByb2xvZ3VlIHRvIGRldGVybWluZSB0aGUgc3RhY2sgc2l6ZSwKKyAgICAgbG9jYXRpb24gb2Ygc2F2ZWQgcmVnaXN0ZXJzLCBlbmQgb2YgdGhlIHByb2xvZ3VlLCBldGMuICAqLworICBpZiAoZmktPmV4dHJhX2luZm8tPnN0YXR1cyA9PSAwKQorICAgIG1uMTAzMDBfYW5hbHl6ZV9wcm9sb2d1ZSAoZmksIChDT1JFX0FERFIpMCk7CisKKyAgLyogUXVpdCBub3cgaWYgbW4xMDMwMF9hbmFseXplX3Byb2xvZ3VlIHNldCBOT19NT1JFX0ZSQU1FUy4gICovCisgIGlmIChmaS0+ZXh0cmFfaW5mby0+c3RhdHVzICYgTk9fTU9SRV9GUkFNRVMpCisgICAgcmV0dXJuIDA7CisKKyAgLyogTm93IHRoYXQgd2UndmUgYW5hbHl6ZWQgb3VyIHByb2xvZ3VlLCBkZXRlcm1pbmUgdGhlIGZyYW1lCisgICAgIHBvaW50ZXIgZm9yIG91ciBjYWxsZXIuCisKKyAgICAgICBJZiBvdXIgY2FsbGVyIGhhcyBhIGZyYW1lIHBvaW50ZXIsIHRoZW4gd2UgbmVlZCB0bworICAgICAgIGZpbmQgdGhlIGVudHJ5IHZhbHVlIG9mICRhMyB0byBvdXIgZnVuY3Rpb24uCisKKwkgSWYgZnNyLnJlZ3NbQTNfUkVHTlVNXSBpcyBub256ZXJvLCB0aGVuIGl0J3MgYXQgdGhlIG1lbW9yeQorCSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IGZzci5yZWdzW0EzX1JFR05VTV0uCisKKwkgRWxzZSBpdCdzIHN0aWxsIGluICRhMy4KKworICAgICAgIElmIG91ciBjYWxsZXIgZG9lcyBub3QgaGF2ZSBhIGZyYW1lIHBvaW50ZXIsIHRoZW4gaGlzCisgICAgICAgZnJhbWUgYmFzZSBpcyBmaS0+ZnJhbWUgKyAtY2FsbGVyJ3Mgc3RhY2sgc2l6ZS4gICovCisgICAgICAgCisgIC8qIFRoZSBlYXNpZXN0IHdheSB0byBnZXQgdGhhdCBpbmZvIGlzIHRvIGFuYWx5emUgb3VyIGNhbGxlcidzIGZyYW1lLgorICAgICBTbyB3ZSBzZXQgdXAgYSBkdW1teSBmcmFtZSBhbmQgY2FsbCBtbjEwMzAwX2FuYWx5emVfcHJvbG9ndWUgdG8KKyAgICAgZmluZCBzdHVmZiBmb3IgdXMuICAqLworICBkdW1teSA9IGFuYWx5emVfZHVtbXlfZnJhbWUgKEZSQU1FX1NBVkVEX1BDIChmaSksIGZpLT5mcmFtZSk7CisKKyAgaWYgKGR1bW15LT5leHRyYV9pbmZvLT5zdGF0dXMgJiBNWV9GUkFNRV9JTl9GUCkKKyAgICB7CisgICAgICAvKiBPdXIgY2FsbGVyIGhhcyBhIGZyYW1lIHBvaW50ZXIuICBTbyBmaW5kIHRoZSBmcmFtZSBpbiAkYTMgb3IKKyAgICAgICAgIGluIHRoZSBzdGFjay4gICovCisgICAgICBpZiAoZmktPnNhdmVkX3JlZ3NbQTNfUkVHTlVNXSkKKwlyZXR1cm4gKHJlYWRfbWVtb3J5X2ludGVnZXIgKGZpLT5zYXZlZF9yZWdzW0EzX1JFR05VTV0sIFJFR0lTVEVSX1NJWkUpKTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gcmVhZF9yZWdpc3RlciAoQTNfUkVHTlVNKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgYWRqdXN0ID0gMDsKKworICAgICAgYWRqdXN0ICs9IChmaS0+c2F2ZWRfcmVnc1tEMl9SRUdOVU1dID8gNCA6IDApOworICAgICAgYWRqdXN0ICs9IChmaS0+c2F2ZWRfcmVnc1tEM19SRUdOVU1dID8gNCA6IDApOworICAgICAgYWRqdXN0ICs9IChmaS0+c2F2ZWRfcmVnc1tBMl9SRUdOVU1dID8gNCA6IDApOworICAgICAgYWRqdXN0ICs9IChmaS0+c2F2ZWRfcmVnc1tBM19SRUdOVU1dID8gNCA6IDApOworCisgICAgICAvKiBPdXIgY2FsbGVyIGRvZXMgbm90IGhhdmUgYSBmcmFtZSBwb2ludGVyLiAgU28gaGlzIGZyYW1lIHN0YXJ0cworCSBhdCB0aGUgYmFzZSBvZiBvdXIgZnJhbWUgKGZpLT5mcmFtZSkgKyByZWdpc3RlciBzYXZlIHNwYWNlCisJICsgPGhpcyBzaXplPi4gICovCisgICAgICByZXR1cm4gZmktPmZyYW1lICsgYWRqdXN0ICsgLWR1bW15LT5leHRyYV9pbmZvLT5zdGFja19zaXplOworICAgIH0KK30KKworLyogRnVuY3Rpb246IHNraXBfcHJvbG9ndWUKKyAgIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgaW5zdCBwYXN0IHRoZSBwcm9sb2d1ZSBvZiB0aGUgZnVuY3Rpb24uICAqLworCitDT1JFX0FERFIKK21uMTAzMDBfc2tpcF9wcm9sb2d1ZSAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgLyogV2UgdXNlZCB0byBjaGVjayB0aGUgZGVidWcgc3ltYm9scywgYnV0IHRoYXQgY2FuIGxvc2UgaWYKKyAgICAgd2UgaGF2ZSBhIG51bGwgcHJvbG9ndWUuICAqLworICByZXR1cm4gbW4xMDMwMF9hbmFseXplX3Byb2xvZ3VlIChOVUxMLCBwYyk7Cit9CisKKworLyogRnVuY3Rpb246IHBvcF9mcmFtZQorICAgVGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIHdoZW4gZWl0aGVyIHRoZSB1c2VyIHVzZXMgdGhlIGByZXR1cm4nCisgICBjb21tYW5kLCBvciB0aGUgY2FsbCBkdW1teSBicmVha3BvaW50IGdldHMgaGl0LiAgKi8KKwordm9pZAorbW4xMDMwMF9wb3BfZnJhbWUgKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIGludCByZWdudW07CisKKyAgaWYgKFBDX0lOX0NBTExfRFVNTVkoZnJhbWUtPnBjLCBmcmFtZS0+ZnJhbWUsIGZyYW1lLT5mcmFtZSkpCisgICAgZ2VuZXJpY19wb3BfZHVtbXlfZnJhbWUgKCk7CisgIGVsc2UKKyAgICB7CisgICAgICB3cml0ZV9yZWdpc3RlciAoUENfUkVHTlVNLCBGUkFNRV9TQVZFRF9QQyAoZnJhbWUpKTsKKworICAgICAgLyogUmVzdG9yZSBhbnkgc2F2ZWQgcmVnaXN0ZXJzLiAgKi8KKyAgICAgIGZvciAocmVnbnVtID0gMDsgcmVnbnVtIDwgTlVNX1JFR1M7IHJlZ251bSsrKQorCWlmIChmcmFtZS0+c2F2ZWRfcmVnc1tyZWdudW1dICE9IDApCisJICB7CisJICAgIFVMT05HRVNUIHZhbHVlOworCisJICAgIHZhbHVlID0gcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoZnJhbWUtPnNhdmVkX3JlZ3NbcmVnbnVtXSwKKwkJCQkJCSAgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSkpOworCSAgICB3cml0ZV9yZWdpc3RlciAocmVnbnVtLCB2YWx1ZSk7CisJICB9CisKKyAgICAgIC8qIEFjdHVhbGx5IGN1dCBiYWNrIHRoZSBzdGFjay4gICovCisgICAgICB3cml0ZV9yZWdpc3RlciAoU1BfUkVHTlVNLCBGUkFNRV9GUCAoZnJhbWUpKTsKKworICAgICAgLyogRG9uJ3Qgd2UgbmVlZCB0byBzZXQgdGhlIFBDPyE/ICBYWFggRklYTUUuICAqLworICAgIH0KKworICAvKiBUaHJvdyBhd2F5IGFueSBjYWNoZWQgZnJhbWUgaW5mb3JtYXRpb24uICAqLworICBmbHVzaF9jYWNoZWRfZnJhbWVzICgpOworfQorCisvKiBGdW5jdGlvbjogcHVzaF9hcmd1bWVudHMKKyAgIFNldHVwIGFyZ3VtZW50cyBmb3IgYSBjYWxsIHRvIHRoZSB0YXJnZXQuICBBcmd1bWVudHMgZ28gaW4KKyAgIG9yZGVyIG9uIHRoZSBzdGFjay4gICovCisKK0NPUkVfQUREUgorbW4xMDMwMF9wdXNoX2FyZ3VtZW50cyAobmFyZ3MsIGFyZ3MsIHNwLCBzdHJ1Y3RfcmV0dXJuLCBzdHJ1Y3RfYWRkcikKKyAgICAgaW50IG5hcmdzOworICAgICB2YWx1ZV9wdHIgKmFyZ3M7CisgICAgIENPUkVfQUREUiBzcDsKKyAgICAgdW5zaWduZWQgY2hhciBzdHJ1Y3RfcmV0dXJuOworICAgICBDT1JFX0FERFIgc3RydWN0X2FkZHI7Cit7CisgIGludCBhcmdudW0gPSAwOworICBpbnQgbGVuID0gMDsKKyAgaW50IHN0YWNrX29mZnNldCA9IDA7CisgIGludCByZWdzdXNlZCA9IHN0cnVjdF9yZXR1cm4gPyAxIDogMDsKKworICAvKiBUaGlzIHNob3VsZCBiZSBhIG5vcCwgYnV0IGFsaWduIHRoZSBzdGFjayBqdXN0IGluIGNhc2Ugc29tZXRoaW5nCisgICAgIHdlbnQgd3JvbmcuICBTdGFja3MgYXJlIGZvdXIgYnl0ZSBhbGlnbmVkIG9uIHRoZSBtbjEwMzAwLiAgKi8KKyAgc3AgJj0gfjM7CisKKyAgLyogTm93IG1ha2Ugc3BhY2Ugb24gdGhlIHN0YWNrIGZvciB0aGUgYXJncy4KKworICAgICBYWFggVGhpcyBkb2Vzbid0IGFwcGVhciB0byBoYW5kbGUgcGFzcy1ieS1pbnZpc2libGUgcmVmZXJlbmNlCisgICAgIGFyZ3VtZW50cy4gICovCisgIGZvciAoYXJnbnVtID0gMDsgYXJnbnVtIDwgbmFyZ3M7IGFyZ251bSsrKQorICAgIHsKKyAgICAgIGludCBhcmdfbGVuZ3RoID0gKFRZUEVfTEVOR1RIIChWQUxVRV9UWVBFIChhcmdzW2FyZ251bV0pKSArIDMpICYgfjM7CisKKyAgICAgIHdoaWxlIChyZWdzdXNlZCA8IDIgJiYgYXJnX2xlbmd0aCA+IDApCisJeworCSAgcmVnc3VzZWQrKzsKKwkgIGFyZ19sZW5ndGggLT0gNDsKKwl9CisgICAgICBsZW4gKz0gYXJnX2xlbmd0aDsKKyAgICB9CisKKyAgLyogQWxsb2NhdGUgc3RhY2sgc3BhY2UuICAqLworICBzcCAtPSBsZW47CisKKyAgcmVnc3VzZWQgPSBzdHJ1Y3RfcmV0dXJuID8gMSA6IDA7CisgIC8qIFB1c2ggYWxsIGFyZ3VtZW50cyBvbnRvIHRoZSBzdGFjay4gKi8KKyAgZm9yIChhcmdudW0gPSAwOyBhcmdudW0gPCBuYXJnczsgYXJnbnVtKyspCisgICAgeworICAgICAgaW50IGxlbjsKKyAgICAgIGNoYXIgKnZhbDsKKworICAgICAgLyogWFhYIENoZWNrIHRoaXMuICBXaGF0IGFib3V0IFVOSU9OUz8gICovCisgICAgICBpZiAoVFlQRV9DT0RFIChWQUxVRV9UWVBFICgqYXJncykpID09IFRZUEVfQ09ERV9TVFJVQ1QKKwkgICYmIFRZUEVfTEVOR1RIIChWQUxVRV9UWVBFICgqYXJncykpID4gOCkKKwl7CisJICAvKiBYWFggV3JvbmcsIHdlIHdhbnQgYSBwb2ludGVyIHRvIHRoaXMgYXJndW1lbnQuICAqLworICAgICAgICAgIGxlbiA9IFRZUEVfTEVOR1RIIChWQUxVRV9UWVBFICgqYXJncykpOworICAgICAgICAgIHZhbCA9IChjaGFyICopVkFMVUVfQ09OVEVOVFMgKCphcmdzKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbGVuID0gVFlQRV9MRU5HVEggKFZBTFVFX1RZUEUgKCphcmdzKSk7CisJICB2YWwgPSAoY2hhciAqKVZBTFVFX0NPTlRFTlRTICgqYXJncyk7CisJfQorCisgICAgICB3aGlsZSAocmVnc3VzZWQgPCAyICYmIGxlbiA+IDApCisJeworCSAgd3JpdGVfcmVnaXN0ZXIgKHJlZ3N1c2VkLCBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKHZhbCwgNCkpOworCSAgdmFsICs9IDQ7CisJICBsZW4gLT0gNDsKKwkgIHJlZ3N1c2VkKys7CisJfQorCisgICAgICB3aGlsZSAobGVuID4gMCkKKwl7CisJICB3cml0ZV9tZW1vcnkgKHNwICsgc3RhY2tfb2Zmc2V0LCB2YWwsIDQpOworCSAgbGVuIC09IDQ7CisJICB2YWwgKz0gNDsKKwkgIHN0YWNrX29mZnNldCArPSA0OworCX0KKworICAgICAgYXJncysrOworICAgIH0KKworICAvKiBNYWtlIHNwYWNlIGZvciB0aGUgZmx1c2hiYWNrIGFyZWEuICAqLworICBzcCAtPSA4OworICByZXR1cm4gc3A7Cit9CisKKy8qIEZ1bmN0aW9uOiBwdXNoX3JldHVybl9hZGRyZXNzIChwYykKKyAgIFNldCB1cCB0aGUgcmV0dXJuIGFkZHJlc3MgZm9yIHRoZSBpbmZlcmlvciBmdW5jdGlvbiBjYWxsLgorICAgTmVlZGVkIGZvciB0YXJnZXRzIHdoZXJlIHdlIGRvbid0IGFjdHVhbGx5IGV4ZWN1dGUgYSBKU1IvQlNSIGluc3RydWN0aW9uICovCisgCitDT1JFX0FERFIKK21uMTAzMDBfcHVzaF9yZXR1cm5fYWRkcmVzcyAocGMsIHNwKQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIENPUkVfQUREUiBzcDsKK3sKKyAgdW5zaWduZWQgY2hhciBidWZbNF07CisKKyAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0LCBDQUxMX0RVTU1ZX0FERFJFU1MgKCkpOworICB3cml0ZV9tZW1vcnkgKHNwIC0gNCwgYnVmLCA0KTsKKyAgcmV0dXJuIHNwIC0gNDsKK30KKworLyogRnVuY3Rpb246IHN0b3JlX3N0cnVjdF9yZXR1cm4gKGFkZHIsc3ApCisgICBTdG9yZSB0aGUgc3RydWN0dXJlIHZhbHVlIHJldHVybiBhZGRyZXNzIGZvciBhbiBpbmZlcmlvciBmdW5jdGlvbgorICAgY2FsbC4gICovCisgCitDT1JFX0FERFIKK21uMTAzMDBfc3RvcmVfc3RydWN0X3JldHVybiAoYWRkciwgc3ApCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBDT1JFX0FERFIgc3A7Cit7CisgIC8qIFRoZSBzdHJ1Y3R1cmUgcmV0dXJuIGFkZHJlc3MgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudC4gICovCisgIHdyaXRlX3JlZ2lzdGVyICgwLCBhZGRyKTsKKyAgcmV0dXJuIHNwOworfQorIAorLyogRnVuY3Rpb246IGZyYW1lX3NhdmVkX3BjIAorICAgRmluZCB0aGUgY2FsbGVyIG9mIHRoaXMgZnJhbWUuICBXZSBkbyB0aGlzIGJ5IHNlZWluZyBpZiBSUF9SRUdOVU0KKyAgIGlzIHNhdmVkIGluIHRoZSBzdGFjayBhbnl3aGVyZSwgb3RoZXJ3aXNlIHdlIGdldCBpdCBmcm9tIHRoZQorICAgcmVnaXN0ZXJzLiAgSWYgdGhlIGlubmVyIGZyYW1lIGlzIGEgZHVtbXkgZnJhbWUsIHJldHVybiBpdHMgUEMKKyAgIGluc3RlYWQgb2YgUlAsIGJlY2F1c2UgdGhhdCdzIHdoZXJlICJjYWxsZXIiIG9mIHRoZSBkdW1teS1mcmFtZQorICAgd2lsbCBiZSBmb3VuZC4gICovCisKK0NPUkVfQUREUgorbW4xMDMwMF9mcmFtZV9zYXZlZF9wYyAoZmkpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKK3sKKyAgaW50IGFkanVzdCA9IDA7CisKKyAgYWRqdXN0ICs9IChmaS0+c2F2ZWRfcmVnc1tEMl9SRUdOVU1dID8gNCA6IDApOworICBhZGp1c3QgKz0gKGZpLT5zYXZlZF9yZWdzW0QzX1JFR05VTV0gPyA0IDogMCk7CisgIGFkanVzdCArPSAoZmktPnNhdmVkX3JlZ3NbQTJfUkVHTlVNXSA/IDQgOiAwKTsKKyAgYWRqdXN0ICs9IChmaS0+c2F2ZWRfcmVnc1tBM19SRUdOVU1dID8gNCA6IDApOworCisgIHJldHVybiAocmVhZF9tZW1vcnlfaW50ZWdlciAoZmktPmZyYW1lICsgYWRqdXN0LCBSRUdJU1RFUl9TSVpFKSk7Cit9CisKK3ZvaWQKK2dldF9zYXZlZF9yZWdpc3RlciAocmF3X2J1ZmZlciwgb3B0aW1pemVkLCBhZGRycCwgZnJhbWUsIHJlZ251bSwgbHZhbCkKKyAgICAgY2hhciAqcmF3X2J1ZmZlcjsKKyAgICAgaW50ICpvcHRpbWl6ZWQ7CisgICAgIENPUkVfQUREUiAqYWRkcnA7CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKKyAgICAgaW50IHJlZ251bTsKKyAgICAgZW51bSBsdmFsX3R5cGUgKmx2YWw7Cit7CisgIGdlbmVyaWNfZ2V0X3NhdmVkX3JlZ2lzdGVyIChyYXdfYnVmZmVyLCBvcHRpbWl6ZWQsIGFkZHJwLCAKKwkJCSAgICAgIGZyYW1lLCByZWdudW0sIGx2YWwpOworfQorCisvKiBGdW5jdGlvbjogbW4xMDMwMF9pbml0X2V4dHJhX2ZyYW1lX2luZm8KKyAgIFNldHVwIHRoZSBmcmFtZSdzIGZyYW1lIHBvaW50ZXIsIHBjLCBhbmQgZnJhbWUgYWRkcmVzc2VzIGZvciBzYXZlZAorICAgcmVnaXN0ZXJzLiAgTW9zdCBvZiB0aGUgd29yayBpcyBkb25lIGluIG1uMTAzMDBfYW5hbHl6ZV9wcm9sb2d1ZSgpLgorCisgICBOb3RlIHRoYXQgd2hlbiB3ZSBhcmUgY2FsbGVkIGZvciB0aGUgbGFzdCBmcmFtZSAoY3VycmVudGx5IGFjdGl2ZSBmcmFtZSksCisgICB0aGF0IGZpLT5wYyBhbmQgZmktPmZyYW1lIHdpbGwgYWxyZWFkeSBiZSBzZXR1cC4gIEhvd2V2ZXIsIGZpLT5mcmFtZSB3aWxsCisgICBiZSB2YWxpZCBvbmx5IGlmIHRoaXMgcm91dGluZSB1c2VzIEZQLiAgRm9yIHByZXZpb3VzIGZyYW1lcywgZmktZnJhbWUgd2lsbAorICAgYWx3YXlzIGJlIGNvcnJlY3QuICBtbjEwMzAwX2FuYWx5emVfcHJvbG9ndWUgd2lsbCBmaXggZmktPmZyYW1lIGlmCisgICBpdCdzIG5vdCB2YWxpZC4KKworICAgV2UgY2FuIGJlIGNhbGxlZCB3aXRoIHRoZSBQQyBpbiB0aGUgY2FsbCBkdW1teSB1bmRlciB0d28gY2lyY3Vtc3RhbmNlcy4KKyAgIEZpcnN0LCBkdXJpbmcgbm9ybWFsIGJhY2t0cmFjaW5nLCBzZWNvbmQsIHdoaWxlIGZpZ3VyaW5nIG91dCB0aGUgZnJhbWUKKyAgIHBvaW50ZXIganVzdCBwcmlvciB0byBjYWxsaW5nIHRoZSB0YXJnZXQgZnVuY3Rpb24gKHNlZSBydW5fc3RhY2tfZHVtbXkpLiAgKi8KKwordm9pZAorbW4xMDMwMF9pbml0X2V4dHJhX2ZyYW1lX2luZm8gKGZpKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7Cit7CisgIGlmIChmaS0+bmV4dCkKKyAgICBmaS0+cGMgPSBGUkFNRV9TQVZFRF9QQyAoZmktPm5leHQpOworCisgIGZyYW1lX3NhdmVkX3JlZ3NfemFsbG9jIChmaSk7CisgIGZpLT5leHRyYV9pbmZvID0gKHN0cnVjdCBmcmFtZV9leHRyYV9pbmZvICopCisgICAgZnJhbWVfb2JzdGFja19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZnJhbWVfZXh0cmFfaW5mbykpOworCisgIGZpLT5leHRyYV9pbmZvLT5zdGF0dXMgPSAwOworICBmaS0+ZXh0cmFfaW5mby0+c3RhY2tfc2l6ZSA9IDA7CisKKyAgbW4xMDMwMF9hbmFseXplX3Byb2xvZ3VlIChmaSwgMCk7Cit9CisKKy8qIEZ1bmN0aW9uOiBtbjEwMzAwX3ZpcnR1YWxfZnJhbWVfcG9pbnRlcgorICAgUmV0dXJuIHRoZSByZWdpc3RlciB0aGF0IHRoZSBmdW5jdGlvbiB1c2VzIGZvciBhIGZyYW1lIHBvaW50ZXIsIAorICAgcGx1cyBhbnkgbmVjZXNzYXJ5IG9mZnNldCB0byBiZSBhcHBsaWVkIHRvIHRoZSByZWdpc3RlciBiZWZvcmUKKyAgIGFueSBmcmFtZSBwb2ludGVyIG9mZnNldHMuICAqLworCit2b2lkCittbjEwMzAwX3ZpcnR1YWxfZnJhbWVfcG9pbnRlciAocGMsIHJlZywgb2Zmc2V0KQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIGxvbmcgKnJlZzsKKyAgICAgbG9uZyAqb2Zmc2V0OworeworICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZHVtbXkgPSBhbmFseXplX2R1bW15X2ZyYW1lIChwYywgMCk7CisgIC8qIFNldCB1cCBhIGR1bW15IGZyYW1lX2luZm8sIEFuYWx5emUgdGhlIHByb2xvZyBhbmQgZmlsbCBpbiB0aGUKKyAgICAgZXh0cmEgaW5mby4gICovCisgIC8qIFJlc3VsdHMgd2lsbCB0ZWxsIHVzIHdoaWNoIHR5cGUgb2YgZnJhbWUgaXQgdXNlcy4gICovCisgIGlmIChkdW1teS0+ZXh0cmFfaW5mby0+c3RhdHVzICYgTVlfRlJBTUVfSU5fU1ApCisgICAgeworICAgICAgKnJlZyAgICA9IFNQX1JFR05VTTsKKyAgICAgICpvZmZzZXQgPSAtKGR1bW15LT5leHRyYV9pbmZvLT5zdGFja19zaXplKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqcmVnICAgID0gQTNfUkVHTlVNOworICAgICAgKm9mZnNldCA9IDA7CisgICAgfQorfQorICAKKy8qIFRoaXMgY2FuIGJlIG1hZGUgbW9yZSBnZW5lcmljIGxhdGVyLiAgKi8KK3N0YXRpYyB2b2lkCitzZXRfbWFjaGluZV9ob29rIChmaWxlbmFtZSkKKyAgICAgY2hhciAqZmlsZW5hbWU7Cit7CisgIGludCBpOworCisgIGlmIChiZmRfZ2V0X21hY2ggKGV4ZWNfYmZkKSA9PSBiZmRfbWFjaF9tbjEwMzAwCisgICAgICB8fCBiZmRfZ2V0X21hY2ggKGV4ZWNfYmZkKSA9PSAwKQorICAgIHsKKyAgICAgIG1uMTAzMDBfcmVnaXN0ZXJfbmFtZXMgPSBtbjEwMzAwX2dlbmVyaWNfcmVnaXN0ZXJfbmFtZXM7CisgICAgfQorCit9CisKK3ZvaWQKK19pbml0aWFsaXplX21uMTAzMDBfdGRlcCAoKQoreworLyogIHByaW50ZigiX2luaXRpYWxpemVfbW4xMDMwMF90ZGVwXG4iKTsgKi8KKworICB0bV9wcmludF9pbnNuID0gcHJpbnRfaW5zbl9tbjEwMzAwOworCisgIHNwZWNpZnlfZXhlY19maWxlX2hvb2sgKHNldF9tYWNoaW5lX2hvb2spOworfQorCmRpZmYgLS1naXQgYS9nZGIvbW9uOTYwLXJvbS5jIGIvZ2RiL21vbjk2MC1yb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmRjYWZmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL21vbjk2MC1yb20uYwpAQCAtMCwwICsxLDI2NCBAQAorLyogUmVtb3RlIHRhcmdldCBnbHVlIGZvciB0aGUgSW50ZWwgOTYwIE1PTjk2MCBST00gbW9uaXRvci4KKyAgIENvcHlyaWdodCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAibW9uaXRvci5oIgorI2luY2x1ZGUgInNlcmlhbC5oIgorI2luY2x1ZGUgInNyZWMuaCIKKyNpbmNsdWRlICJ4bW9kZW0uaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiIC8qIGZvciBnZW5lcmljX2xvYWQgKi8KKworCisjZGVmaW5lIFVTRV9HRU5FUklDX0xPQUQKKworc3RhdGljIHN0cnVjdCB0YXJnZXRfb3BzIG1vbjk2MF9vcHM7CisKK3N0YXRpYyB2b2lkIG1vbjk2MF9vcGVuIFBBUkFNUyAoKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkpOworCisjaWZkZWYgVVNFX0dFTkVSSUNfTE9BRAorCitzdGF0aWMgdm9pZAorbW9uOTYwX2xvYWRfZ2VuIChmaWxlbmFtZSwgZnJvbV90dHkpIAorICAgIGNoYXIgKmZpbGVuYW1lOworICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZXh0ZXJuIGludCBpbmZlcmlvcl9waWQ7CisKKyAgZ2VuZXJpY19sb2FkIChmaWxlbmFtZSwgZnJvbV90dHkpOworICAvKiBGaW5hbGx5LCBtYWtlIHRoZSBQQyBwb2ludCBhdCB0aGUgc3RhcnQgYWRkcmVzcyAqLworICBpZiAoZXhlY19iZmQpCisgICAgd3JpdGVfcGMgKGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoZXhlY19iZmQpKTsKKworICBpbmZlcmlvcl9waWQgPSAwOyAgICAgICAgICAgICAvKiBObyBwcm9jZXNzIG5vdyAqLworfQorCisjZWxzZQorCitzdGF0aWMgdm9pZAorbW9uOTYwX2xvYWQgKGRlc2MsIGZpbGUsIGhhc2htYXJrKQorICAgICBzZXJpYWxfdCBkZXNjOworICAgICBjaGFyICpmaWxlOworICAgICBpbnQgaGFzaG1hcms7Cit7CisgIGJmZCAqYWJmZDsKKyAgYXNlY3Rpb24gKnM7CisgIGNoYXIgKmJ1ZmZlcjsKKyAgaW50IGk7CisKKyAgYnVmZmVyID0gYWxsb2NhIChYTU9ERU1fUEFDS0VUU0laRSk7CisgIGFiZmQgPSBiZmRfb3BlbnIgKGZpbGUsIDApOworICBpZiAoIWFiZmQpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiVW5hYmxlIHRvIG9wZW4gZmlsZSAlc1xuIiwgZmlsZSk7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkgPT0gMCkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJGaWxlIGlzIG5vdCBhbiBvYmplY3QgZmlsZVxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCisgICAgaWYgKHMtPmZsYWdzICYgU0VDX0xPQUQpCisgICAgICB7CisJYmZkX3NpemVfdHlwZSBzZWN0aW9uX3NpemU7CisJcHJpbnRmX2ZpbHRlcmVkICgiJXNcdDogMHglNHggLi4gMHglNHggICIsIHMtPm5hbWUsIHMtPnZtYSwKKwkJCSBzLT52bWEgKyBzLT5fcmF3X3NpemUpOworCWdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisJbW9uaXRvcl9wcmludGYgKGN1cnJlbnRfbW9uaXRvci0+bG9hZCwgcy0+dm1hKTsKKwlpZiAoY3VycmVudF9tb25pdG9yLT5sb2FkcmVzcCkKKwkgIG1vbml0b3JfZXhwZWN0IChjdXJyZW50X21vbml0b3ItPmxvYWRyZXNwLCBOVUxMLCAwKTsKKwl4bW9kZW1faW5pdF94ZmVyIChkZXNjKTsKKwlzZWN0aW9uX3NpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2VjdGlvbl9zaXplOyBpICs9IFhNT0RFTV9EQVRBU0laRSkKKwkgIHsKKwkgICAgaW50IG51bWJ5dGVzOworCSAgICBudW1ieXRlcyA9IG1pbiAoWE1PREVNX0RBVEFTSVpFLCBzZWN0aW9uX3NpemUgLSBpKTsKKwkgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzLCBidWZmZXIgKyBYTU9ERU1fREFUQU9GRlNFVCwgaSwKKwkJCQkgICAgICBudW1ieXRlcyk7CisJICAgIHhtb2RlbV9zZW5kX3BhY2tldCAoZGVzYywgYnVmZmVyLCBudW1ieXRlcywgaGFzaG1hcmspOworCSAgICBpZiAoaGFzaG1hcmspCisJICAgICAgeworCQlwdXRjaGFyX3VuZmlsdGVyZWQgKCcjJyk7CisJCWdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisJICAgICAgfQorCSAgfQkJCS8qIFBlci1wYWNrZXQgKG9yIFMtcmVjb3JkKSBsb29wICovCisJeG1vZGVtX2ZpbmlzaF94ZmVyIChkZXNjKTsKKwltb25pdG9yX2V4cGVjdF9wcm9tcHQgKE5VTEwsIDApOworCXB1dGNoYXJfdW5maWx0ZXJlZCAoJ1xuJyk7CisgICAgICB9CQkJCS8qIExvYWRhYmxlIHNlY3Rpb25zICovCisgIGlmIChoYXNobWFyaykgCisgICAgcHV0Y2hhcl91bmZpbHRlcmVkICgnXG4nKTsKK30KKworI2VuZGlmIC8qIFVTRV9HRU5FUklDX0xPQUQgKi8KKworLyogVGhpcyBhcnJheSBvZiByZWdpc3RlcnMgbmVlZCB0byBtYXRjaCB0aGUgaW5kZXhlcyB1c2VkIGJ5IEdEQi4KKyAgIFRoaXMgZXhpc3RzIGJlY2F1c2UgdGhlIHZhcmlvdXMgUk9NIG1vbml0b3JzIHVzZSBkaWZmZXJlbnQgc3RyaW5ncworICAgdGhhbiBkb2VzIEdEQiwgYW5kIGRvbid0IG5lY2Vzc2FyaWx5IHN1cHBvcnQgYWxsIHRoZSByZWdpc3RlcnMKKyAgIGVpdGhlci4gU28sIHR5cGluZyAiaW5mbyByZWcgc3AiIGJlY29tZXMgYSAicjMwIi4gICovCisKKy8qIHRoZXNlIGNvcnJlc3BvbmQgdG8gdGhlIG9mZnNldHMgZnJvbSB0bS0qIGZpbGVzIGZyb20gY29uZmlnIGRpcmVjdG9yaWVzICovCisvKiBnMC1nMTQsIGZwLCBwZnAsIHNwLCByaXAscjMtMTUsIHBjLCBhYywgdGMsIGZwMC0zICovIAorLyogTk9URTogImlwIiBpcyBkb2N1bWVudGVkIGFzICJpciIgaW4gdGhlIE1vbjk2MCBVRy4gKi8KKy8qIE5PVEU6ICJpciIgY2FuJ3QgYmUgYWNjZXNzZWQuLi4gYnV0IHRoZXJlJ3MgYW4gaXAgYW5kIHJpcC4gKi8KK3N0YXRpYyBjaGFyICpmdWxsX3JlZ25hbWVzW05VTV9SRUdTXSA9IHsKKyAgLyogIDAgKi8gInBmcCIsICJzcCIsICAicmlwIiwgInIzIiwgICJyNCIsICAicjUiLCAgInI2IiwgICJyNyIsCisgIC8qICA4ICovICJyOCIsICAicjkiLCAgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IiwKKyAgLyogMTYgKi8gImcwIiwgICJnMSIsICAiZzIiLCAgImczIiwgICJnNCIsICAiZzUiLCAgImc2IiwgICJnNyIsCisgIC8qIDI0ICovICJnOCIsICAiZzkiLCAgImcxMCIsICJnMTEiLCAiZzEyIiwgImcxMyIsICJnMTQiLCAiZnAiLAorICAvKiAzMiAqLyAicGMiLCAgImFjIiwgICJ0YyIsICAiaXAiLCAgImZwMCIsICJmcDEiLCAiZnAyIiwgImZwMyIsCisgIH07CisKK3N0YXRpYyBjaGFyICptb245NjBfcmVnbmFtZXNbTlVNX1JFR1NdOworCisvKiBEZWZpbmUgdGhlIG1vbml0b3IgY29tbWFuZCBzdHJpbmdzLiBTaW5jZSB0aGVzZSBhcmUgcGFzc2VkIGRpcmVjdGx5CisgICB0aHJvdWdoIHRvIGEgcHJpbnRmIHN0eWxlIGZ1bmN0aW9uLCB3ZSBtYXkgaW5jbHVkZSBmb3JtYXR0aW5nCisgICBzdHJpbmdzLiBXZSBhbHNvIG5lZWQgYSBDUiBvciBMRiBvbiB0aGUgZW5kLiAgKi8KKworLyogbmVlZCB0byBwYXVzZSB0aGUgbW9uaXRvciBmb3IgdGltaW5nIHJlYXNvbnMsIHNvIHNsb3cgaXQgZG93biAqLworCisjaWYgMAorLyogRklYTUU6IHRoaXMgZXh0cmVtZWx5IGxvbmcgaW5pdCBzdHJpbmcgY2F1c2VzIE1PTjk2MCB0byByZXR1cm4gdHdvIE5BS1MKKyAgIGluc3RlYWQgb2YgcGVyZm9ybWluZyB0aGUgYXV0b2JhdWQgcmVjb2duaXRpb24sIGF0IGxlYXN0IHdoZW4gZ2RiCisgICBpcyBydW5uaW5nIG9uIEdOVS9MaW51eC4gIFRoZSBzaG9ydCBzdHJpbmcgYmVsb3cgd29ya3Mgb24gTGludXgsIGFuZCBvbgorICAgU3VuT1MgdXNpbmcgYSB0Y3Agc2VyaWFsIGNvbm5lY3Rpb24uICBNdXN0IHJldGVzdCBvbiBTdW5PUyB1c2luZyBhCisgICBkaXJlY3Qgc2VyaWFsIGNvbm5lY3Rpb247IGlmIHRoYXQgd29ya3MsIGdldCByaWQgb2YgdGhlIGxvbmcgc3RyaW5nLiAqLworc3RhdGljIGNoYXIgKm1vbjk2MF9pbml0c1tdID0geyJcblxyXHJcclxyXHJcclxyXHJcclxyXHJcclxyXHJcblxyXG5cclxuIiwgTlVMTH07CisjZWxzZQorc3RhdGljIGNoYXIgKm1vbjk2MF9pbml0c1tdID0geyAiXHIiLCBOVUxMfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG1vbml0b3Jfb3BzIG1vbjk2MF9jbWRzIDsKKworc3RhdGljIHZvaWQgCitpbml0X21vbjk2MF9jbWRzICh2b2lkKQoreworICBtb245NjBfY21kcy5mbGFncyA9ICAgTU9fQ0xSX0JSRUFLX1VTRVNfQUREUgorICAgIHwgTU9fTk9fRUNIT19PTl9PUEVOICAgfCBNT19TRU5EX0JSRUFLX09OX1NUT1AgICB8IE1PX0dFVE1FTV9SRUFEX1NJTkdMRSA7ICAgIC8qIGZsYWdzICovCisgIG1vbjk2MF9jbWRzLmluaXQgPSAgIG1vbjk2MF9pbml0czsJLyogSW5pdCBzdHJpbmdzICovCisgIG1vbjk2MF9jbWRzLmNvbnQgPSAgICJnb1xuXHIiOwkvKiBjb250aW51ZSBjb21tYW5kICovCisgIG1vbjk2MF9jbWRzLnN0ZXAgPSAgICJzdFxuXHIiOwkJLyogc2luZ2xlIHN0ZXAgKi8KKyAgbW9uOTYwX2NtZHMuc3RvcCA9ICAgTlVMTDsJCQkvKiBicmVhayBpbnRlcnJ1cHRzIHRoZSBwcm9ncmFtICovCisgIG1vbjk2MF9jbWRzLnNldF9icmVhayA9ICAgTlVMTDsJCS8qIHNldCBhIGJyZWFrcG9pbnQgKi8KKyAgbW9uOTYwX2NtZHMuY2xyX2JyZWFrID0gCQkJLyogY2FuJ3QgdXNlICJiciIgYmVjYXVzZSBvbmx5IDIgaHcgYnBzIGFyZSBzdXBwb3J0ZWQgKi8KKyAgICBtb245NjBfY21kcy5jbHJfYWxsX2JyZWFrID0gICBOVUxMOwkJLyogY2xlYXIgYSBicmVha3BvaW50IC0gImRlIiBpcyBmb3IgaHcgYnBzICovCisgIE5VTEwsCQkJCS8qIGNsZWFyIGFsbCBicmVha3BvaW50cyAqLworICAgIG1vbjk2MF9jbWRzLmZpbGwgPSAgIE5VTEw7CQkJLyogZmlsbCAoc3RhcnQgZW5kIHZhbCkgKi8KKyAgLyogY2FuJ3QgdXNlICJmaSIgYmVjYXVzZSBpdCB0YWtlcyB3b3Jkcywgbm90IGJ5dGVzICovCisgIC8qIGNhbid0IHVzZSAibWIiLCAibWQiIG9yICJtbyIgYmVjYXVzZSB0aGV5IHJlcXVpcmUgaW50ZXJhY3Rpb24gKi8KKyAgbW9uOTYwX2NtZHMuc2V0bWVtLmNtZGIgPSAgICAgTlVMTDsJCS8qIHNldG1lbS5jbWRiIChhZGRyLCB2YWx1ZSkgKi8KKyAgbW9uOTYwX2NtZHMuc2V0bWVtLmNtZHcgPSAgICAgTlVMTDsJCS8qIHNldG1lbS5jbWR3IChhZGRyLCB2YWx1ZSkgKi8KKyAgbW9uOTYwX2NtZHMuc2V0bWVtLmNtZGwgPSAgICAgIm1kICV4ICV4XG5cciI7CS8qIHNldG1lbS5jbWRsIChhZGRyLCB2YWx1ZSkgKi8KKyAgbW9uOTYwX2NtZHMuc2V0bWVtLmNtZGxsID0gICAgIE5VTEw7CQkvKiBzZXRtZW0uY21kbGwgKGFkZHIsIHZhbHVlKSAqLworICBtb245NjBfY21kcy5zZXRtZW0ucmVzcF9kZWxpbSA9ICAgICBOVUxMOwkvKiBzZXRtZW0ucmVzcF9kZWxpbSAqLworICBtb245NjBfY21kcy5zZXRtZW0udGVybSA9ICAgICBOVUxMOwkJLyogc2V0bWVtLnRlcm0gKi8KKyAgbW9uOTYwX2NtZHMuc2V0bWVtLnRlcm1fY21kID0gICAgIE5VTEw7CQkJLyogc2V0bWVtLnRlcm1fY21kICovCisgIC8qIHNpbmNlIHRoZSBwYXJzaW5nIG9mIG11bHRpcGxlIGJ5dGVzIGlzIGRpZmZpY3VsdCBkdWUgdG8KKyAgICAgaW50ZXJzcGVyc2VkIGFkZHJlc3Nlcywgd2UnbGwgb25seSByZWFkIDEgdmFsdWUgYXQgYSB0aW1lLAorICAgICBldmVuIHRobyB0aGVzZSBjYW4gaGFuZGxlIGEgY291bnQgKi8KKyAgbW9uOTYwX2NtZHMuZ2V0bWVtLmNtZGIgPSAgICAgImRiICV4XG5cciI7CS8qIGdldG1lbS5jbWRiIChhZGRyLCAjYnl0ZXMpICovCisgIG1vbjk2MF9jbWRzLmdldG1lbS5jbWR3ID0gICAgICJkcyAleFxuXHIiOwkvKiBnZXRtZW0uY21kdyAoYWRkciwgI3N3b3JkcykgKi8KKyAgbW9uOTYwX2NtZHMuZ2V0bWVtLmNtZGwgPSAgICAgImRpICV4XG5cciI7CS8qIGdldG1lbS5jbWRsIChhZGRyLCAjd29yZHMpICovCisgIG1vbjk2MF9jbWRzLmdldG1lbS5jbWRsbCA9ICAgICAiZGQgJXhcblxyIjsJLyogZ2V0bWVtLmNtZGxsIChhZGRyLCAjZHdvcmRzKSAqLworICBtb245NjBfY21kcy5nZXRtZW0ucmVzcF9kZWxpbSA9ICAgICAiIDogIjsJLyogZ2V0bWVtLnJlc3BfZGVsaW0gKi8KKyAgbW9uOTYwX2NtZHMuZ2V0bWVtLnRlcm0gPSAgICAgTlVMTDsJCS8qIGdldG1lbS50ZXJtICovCisgIG1vbjk2MF9jbWRzLmdldG1lbS50ZXJtX2NtZCA9ICAgICBOVUxMOwkvKiBnZXRtZW0udGVybV9jbWQgKi8KKyAgbW9uOTYwX2NtZHMuc2V0cmVnLmNtZCA9ICAgICAibWQgJXMgJXhcblxyIjsJLyogc2V0cmVnLmNtZCAobmFtZSwgdmFsdWUpICovCisgIG1vbjk2MF9jbWRzLnNldHJlZy5yZXNwX2RlbGltID0gICAgIE5VTEw7CS8qIHNldHJlZy5yZXNwX2RlbGltICovCisgIG1vbjk2MF9jbWRzLnNldHJlZy50ZXJtID0gICAgIE5VTEw7CQkvKiBzZXRyZWcudGVybSAqLworICBtb245NjBfY21kcy5zZXRyZWcudGVybV9jbWQgPSAgICAgTlVMTCwJLyogc2V0cmVnLnRlcm1fY21kICovCisgICAgbW9uOTYwX2NtZHMuZ2V0cmVnLmNtZCA9ICAgICAiZGkgJXNcblxyIjsJLyogZ2V0cmVnLmNtZCAobmFtZSkgKi8KKyAgbW9uOTYwX2NtZHMuZ2V0cmVnLnJlc3BfZGVsaW0gPSAgICAgIiA6ICI7CS8qIGdldHJlZy5yZXNwX2RlbGltICovCisgIG1vbjk2MF9jbWRzLmdldHJlZy50ZXJtID0gICAgIE5VTEw7CQkvKiBnZXRyZWcudGVybSAqLworICBtb245NjBfY21kcy5nZXRyZWcudGVybV9jbWQgPSAgICAgTlVMTDsJLyogZ2V0cmVnLnRlcm1fY21kICovCisgIG1vbjk2MF9jbWRzLmR1bXBfcmVnaXN0ZXJzID0gICAicmVcblxyIjsJLyogZHVtcF9yZWdpc3RlcnMgKi8KKyAgbW9uOTYwX2NtZHMucmVnaXN0ZXJfcGF0dGVybiA9ICAgIlxcKFxcdytcXCk9XFwoWzAtOWEtZkEtRl0rXFwpIjsJLyogcmVnaXN0ZXJfcGF0dGVybiAqLworICBtb245NjBfY21kcy5zdXBwbHlfcmVnaXN0ZXIgPSAgIE5VTEw7CQkvKiBzdXBwbHlfcmVnaXN0ZXIgKi8KKyNpZmRlZiBVU0VfR0VORVJJQ19MT0FECisgIG1vbjk2MF9jbWRzLmxvYWRfcm91dGluZSA9ICAgTlVMTDsJCS8qIGxvYWRfcm91dGluZSAoZGVmYXVsdHMgdG8gU1JFQ3MpICovCisgIG1vbjk2MF9jbWRzLmxvYWQgPSBOVUxMOwkJCS8qIGRvd25sb2FkIGNvbW1hbmQgKi8KKyAgbW9uOTYwX2NtZHMubG9hZHJlc3AgID0gTlVMTDsJCQkvKiBsb2FkIHJlc3BvbnNlICovCisjZWxzZQorICBtb245NjBfY21kcy5sb2FkX3JvdXRpbmUgPSAgIG1vbjk2MF9sb2FkIDsJLyogbG9hZF9yb3V0aW5lIChkZWZhdWx0cyB0byBTUkVDcykgKi8KKyAgbW9uOTYwX2NtZHMubG9hZCA9ICAiZG9cblxyIjsJCS8qIGRvd25sb2FkIGNvbW1hbmQgKi8KKyAgbW9uOTYwX2NtZHMubG9hZHJlc3AgPSAgIkRvd25sb2FkaW5nXG5cciIgOy8qIGxvYWQgcmVzcG9uc2UgKi8KKyNlbmRpZgorICBtb245NjBfY21kcy5wcm9tcHQgPSAgICI9PiI7CQkvKiBtb25pdG9yIGNvbW1hbmQgcHJvbXB0ICovCisgIG1vbjk2MF9jbWRzLmxpbmVfdGVybSA9ICAiXG5cciI7CQkvKiBlbmQtb2YtY29tbWFuZCBkZWxpbWl0b3IgKi8gIAorICBtb245NjBfY21kcy5jbWRfZW5kID0gTlVMTDsJCS8qIG9wdGlvbmFsIGNvbW1hbmQgdGVybWluYXRvciAqLworICBtb245NjBfY21kcy50YXJnZXQgPSAgICZtb245NjBfb3BzOwkJLyogdGFyZ2V0IG9wZXJhdGlvbnMgKi8KKyAgbW9uOTYwX2NtZHMuc3RvcGJpdHMgPSAgICAgU0VSSUFMXzFfU1RPUEJJVFM7CS8qIG51bWJlciBvZiBzdG9wIGJpdHMgKi8KKyAgbW9uOTYwX2NtZHMucmVnbmFtZXMgPSAgbW9uOTYwX3JlZ25hbWVzOwkvKiByZWdpc3RlcnMgbmFtZXMgKi8KKyAgbW9uOTYwX2NtZHMubWFnaWMgPSBNT05JVE9SX09QU19NQUdJQzsJLyogbWFnaWMgKi8KK307CisKK3N0YXRpYyB2b2lkCittb245NjBfb3BlbiAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgY2hhciBidWZbNjRdOworCisgIG1vbml0b3Jfb3BlbiAoYXJncywgJm1vbjk2MF9jbWRzLCBmcm9tX3R0eSk7CisKKyAgLyogQXR0ZW1wdCB0byBmZXRjaCB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIChmcDApLgorICAgICBJZiB0aGUgbW9uaXRvciByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHdvcmQgIkJhZCIgd2UnbGwgYXNzdW1lCisgICAgIHRoaXMgcHJvY2Vzc29yIGhhcyBubyBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMsIGFuZCBudWxsaWZ5IHRoZSAKKyAgICAgcmVnbmFtZXMgZW50cmllcyB0aGF0IHJlZmVyIHRvIEZQIHJlZ2lzdGVycy4gICovCisKKyAgbW9uaXRvcl9wcmludGYgKG1vbjk2MF9jbWRzLmdldHJlZy5jbWQsIGZ1bGxfcmVnbmFtZXNbRlAwX1JFR05VTV0pOyAvKiBkaSBmcDAgKi8KKyAgaWYgKG1vbml0b3JfZXhwZWN0X3Byb21wdCAoYnVmLCBzaXplb2YoYnVmKSkgIT0gLTEpCisgICAgaWYgKHN0cnN0cihidWYsICJCYWQiKSAhPSBOVUxMKQorICAgICAgeworCWludCBpOworCisJZm9yIChpID0gRlAwX1JFR05VTTsgaSA8IEZQMF9SRUdOVU0gKyA0OyBpKyspCisJICAgIG1vbjk2MF9yZWduYW1lc1tpXSA9IE5VTEw7CisgICAgICB9Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX21vbjk2MCAoKQoreworICBtZW1jcHkobW9uOTYwX3JlZ25hbWVzLCBmdWxsX3JlZ25hbWVzLCBzaXplb2YoZnVsbF9yZWduYW1lcykpOworCisgIGluaXRfbW9uOTYwX2NtZHMgKCk7CisKKyAgaW5pdF9tb25pdG9yX29wcyAoJm1vbjk2MF9vcHMpOworCisgIG1vbjk2MF9vcHMudG9fc2hvcnRuYW1lID0gIm1vbjk2MCI7IC8qIGZvciB0aGUgdGFyZ2V0IGNvbW1hbmQgKi8KKyAgbW9uOTYwX29wcy50b19sb25nbmFtZSA9ICJJbnRlbCA5NjAgTU9OOTYwIG1vbml0b3IiOworI2lmZGVmIFVTRV9HRU5FUklDX0xPQUQKKyAgbW9uOTYwX29wcy50b19sb2FkID0gbW9uOTYwX2xvYWRfZ2VuOyAvKiBGSVhNRSAtIHNob3VsZCBnbyBiYWNrIGFuZCB0cnkgImRvIiAqLworI2VuZGlmCisgIC8qIHVzZSBTVyBicmVha3M7IHRhcmdldCBvbmx5IHN1cHBvcnRzIDIgSFcgYnJlYWtwb2ludHMgKi8KKyAgbW9uOTYwX29wcy50b19pbnNlcnRfYnJlYWtwb2ludCA9IG1lbW9yeV9pbnNlcnRfYnJlYWtwb2ludDsgCisgIG1vbjk2MF9vcHMudG9fcmVtb3ZlX2JyZWFrcG9pbnQgPSBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQ7IAorCisgIG1vbjk2MF9vcHMudG9fZG9jID0gCisgICAgIlVzZSBhbiBJbnRlbCA5NjAgYm9hcmQgcnVubmluZyB0aGUgTU9OOTYwIGRlYnVnIG1vbml0b3IuXG5cCitTcGVjaWZ5IHRoZSBzZXJpYWwgZGV2aWNlIGl0IGlzIGNvbm5lY3RlZCB0byAoZS5nLiAvZGV2L3R0eWEpLiI7CisKKyAgbW9uOTYwX29wcy50b19vcGVuID0gbW9uOTYwX29wZW47CisgIGFkZF90YXJnZXQgKCZtb245NjBfb3BzKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9tb25pdG9yLmMgYi9nZGIvbW9uaXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNDdkOGMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbW9uaXRvci5jCkBAIC0wLDAgKzEsMjI5NiBAQAorLyogUmVtb3RlIGRlYnVnZ2luZyBpbnRlcmZhY2UgZm9yIGJvb3QgbW9uaXRvcnMsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NSwgMTk5NiwgMTk5NywgMTk5OQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4gIFdyaXR0ZW4gYnkgUm9iIFNhdm95ZSBmb3IgQ3lnbnVzLgorICAgUmVzdXJyZWN0ZWQgZnJvbSB0aGUgYXNoZXMgYnkgU3R1IEdyb3NzbWFuLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSB3YXMgZGVyaXZlZCBmcm9tIHZhcmlvdXMgcmVtb3RlLSogbW9kdWxlcy4gSXQgaXMgYSBjb2xsZWN0aW9uCisgICBvZiBnZW5lcmljIHN1cHBvcnQgZnVuY3Rpb25zIHNvIEdEQiBjYW4gdGFsayBkaXJlY3RseSB0byBhIFJPTSBiYXNlZAorICAgbW9uaXRvci4gVGhpcyBzYXZlcyB1c2UgZnJvbSBoYXZpbmcgdG8gaGFjayBhbiBleGNlcHRpb24gYmFzZWQgaGFuZGxlcgorICAgaW50byBleGlzdGFuY2UsIGFuZCBtYWtlcyBmb3IgcXVpY2sgcG9ydGluZy4KKworICAgVGhpcyBtb2R1bGUgdGFsa3MgdG8gYSBkZWJ1ZyBtb25pdG9yIGNhbGxlZCAnTU9OSVRPUicsIHdoaWNoCisgICBXZSBjb21tdW5pY2F0ZSB3aXRoIE1PTklUT1IgdmlhIGVpdGhlciBhIGRpcmVjdCBzZXJpYWwgbGluZSwgb3IgYSBUQ1AKKyAgIChvciBwb3NzaWJseSBURUxORVQpIHN0cmVhbSB0byBhIHRlcm1pbmFsIG11bHRpcGxleG9yLAorICAgd2hpY2ggaW4gdHVybiB0YWxrcyB0byB0aGUgdGFyZ2V0IGJvYXJkLiAgKi8KKworLyogRklYTUUgMzJ4NjQ6IFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgcmVnaXN0ZXJzIGFuZCBhZGRyZXNzZXMgYXJlIGF0CisgICBtb3N0IDMyIGJpdHMgbG9uZy4gIElmIHRoZXkgY2FuIGJlIGxhcmdlciwgeW91IHdpbGwgbmVlZCB0byBkZWNsYXJlCisgICB2YWx1ZXMgYXMgTE9OR0VTVCBhbmQgdXNlICVsbHggb3Igc29tZSBzdWNoIHRvIHByaW50IHZhbHVlcyB3aGVuCisgICBidWlsZGluZyBjb21tYW5kcyB0byBzZW5kIHRvIHRoZSBtb25pdG9yLiAgU2luY2Ugd2UgZG9uJ3Qga25vdyBvZgorICAgYW55IGFjdHVhbCA2NC1iaXQgdGFyZ2V0cyB3aXRoIFJPTSBtb25pdG9ycyB0aGF0IHVzZSB0aGlzIGNvZGUsCisgICBpdCdzIG5vdCBhbiBpc3N1ZSByaWdodCBub3cuICAtc3RzIDQvMTgvOTYgICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgIndhaXQuaCIKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8dmFyYXJncy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgInNlcmlhbC5oIgorI2luY2x1ZGUgIm1vbml0b3IuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgImdudS1yZWdleC5oIgorI2luY2x1ZGUgImRjYWNoZS5oIgorI2luY2x1ZGUgInNyZWMuaCIKKworc3RhdGljIGNoYXIgKmRldl9uYW1lOworc3RhdGljIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnX29wczsKKworc3RhdGljIHZvaWQgbW9uaXRvcl92c3ByaW50ZiBQQVJBTVMgKChjaGFyICpzbmRidWYsIGNoYXIgKnBhdHRlcm4sIHZhX2xpc3QgYXJncykpOworCitzdGF0aWMgaW50IHJlYWRjaGFyIFBBUkFNUyAoKGludCB0aW1lb3V0KSk7CisKK3N0YXRpYyB2b2lkIG1vbml0b3JfY29tbWFuZCBQQVJBTVMgKChjaGFyICphcmdzLCBpbnQgZnJvbXR0eSkpOworCitzdGF0aWMgdm9pZCBtb25pdG9yX2ZldGNoX3JlZ2lzdGVyIFBBUkFNUyAoKGludCByZWdubykpOworc3RhdGljIHZvaWQgbW9uaXRvcl9zdG9yZV9yZWdpc3RlciBQQVJBTVMgKChpbnQgcmVnbm8pKTsKKworc3RhdGljIGludCBtb25pdG9yX3ByaW50YWJsZV9zdHJpbmcgUEFSQU1TICgoY2hhciAqbmV3c3RyLCBjaGFyICpvbGRzdHIpKTsKK3N0YXRpYyB2b2lkIG1vbml0b3JfZXJyb3IgUEFSQU1TICgoY2hhciAqZm9ybWF0LCBDT1JFX0FERFIgbWVtYWRkciwgaW50IGxlbiwgY2hhciAqc3RyaW5nLCBpbnQgZmluYWxfY2hhcikpOworc3RhdGljIHZvaWQgbW9uaXRvcl9kZXRhY2ggUEFSQU1TICgoY2hhciAqYXJncywgaW50IGZyb21fdHR5KSk7CitzdGF0aWMgdm9pZCBtb25pdG9yX3Jlc3VtZSBQQVJBTVMgKChpbnQgcGlkLCBpbnQgc3RlcCwgZW51bSB0YXJnZXRfc2lnbmFsIHNpZykpOworc3RhdGljIHZvaWQgbW9uaXRvcl9pbnRlcnJ1cHQgUEFSQU1TICgoaW50IHNpZ25vKSk7CitzdGF0aWMgdm9pZCBtb25pdG9yX2ludGVycnVwdF90d2ljZSBQQVJBTVMgKChpbnQgc2lnbm8pKTsKK3N0YXRpYyB2b2lkIG1vbml0b3JfaW50ZXJydXB0X3F1ZXJ5IFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIG1vbml0b3Jfd2FpdF9jbGVhbnVwIFBBUkFNUyAoKHZvaWQgKm9sZF90aW1lb3V0KSk7CisKK3N0YXRpYyBpbnQgbW9uaXRvcl93YWl0IFBBUkFNUyAoKGludCBwaWQsIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqc3RhdHVzKSk7CitzdGF0aWMgdm9pZCBtb25pdG9yX2ZldGNoX3JlZ2lzdGVycyBQQVJBTVMgKChpbnQgcmVnbm8pKTsKK3N0YXRpYyB2b2lkIG1vbml0b3Jfc3RvcmVfcmVnaXN0ZXJzIFBBUkFNUyAoKGludCByZWdubykpOworc3RhdGljIHZvaWQgbW9uaXRvcl9wcmVwYXJlX3RvX3N0b3JlIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyBpbnQgbW9uaXRvcl94ZmVyX21lbW9yeSBQQVJBTVMgKChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLCBpbnQgbGVuLCBpbnQgd3JpdGUsIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQpKTsKK3N0YXRpYyB2b2lkIG1vbml0b3JfZmlsZXNfaW5mbyBQQVJBTVMgKChzdHJ1Y3QgdGFyZ2V0X29wcyAqb3BzKSk7CitzdGF0aWMgaW50IG1vbml0b3JfaW5zZXJ0X2JyZWFrcG9pbnQgUEFSQU1TICgoQ09SRV9BRERSIGFkZHIsIGNoYXIgKnNoYWRvdykpOworc3RhdGljIGludCBtb25pdG9yX3JlbW92ZV9icmVha3BvaW50IFBBUkFNUyAoKENPUkVfQUREUiBhZGRyLCBjaGFyICpzaGFkb3cpKTsKK3N0YXRpYyB2b2lkIG1vbml0b3Jfa2lsbCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBtb25pdG9yX2xvYWQgUEFSQU1TICgoY2hhciAqZmlsZSwgaW50IGZyb21fdHR5KSk7CitzdGF0aWMgdm9pZCBtb25pdG9yX21vdXJuX2luZmVyaW9yIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIG1vbml0b3Jfc3RvcCBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyBpbnQgbW9uaXRvcl9yZWFkX21lbW9yeSBQQVJBTVMgKChDT1JFX0FERFIgYWRkciwgY2hhciAqbXlhZGRyLGludCBsZW4pKTsKK3N0YXRpYyBpbnQgbW9uaXRvcl93cml0ZV9tZW1vcnkgUEFSQU1TICgoQ09SRV9BRERSIGFkZHIsIGNoYXIgKm15YWRkcixpbnQgbGVuKSk7CitzdGF0aWMgaW50IG1vbml0b3Jfd3JpdGVfbWVtb3J5X2J5dGVzIFBBUkFNUyAoKENPUkVfQUREUiBhZGRyLAorCQkJCQkgICAgICAgY2hhciAqbXlhZGRyLGludCBsZW4pKTsKK3N0YXRpYyBpbnQgbW9uaXRvcl93cml0ZV9tZW1vcnlfYmxvY2sgUEFSQU1TKCgKKwkJCQkJICAgICAgQ09SRV9BRERSIG1lbWFkZHIgLAorCQkJCQkgICAgICBjaGFyICogbXlhZGRyICwKKwkJCQkJICAgICAgaW50IGxlbikpIDsKK3N0YXRpYyBpbnQgbW9uaXRvcl9leHBlY3RfcmVnZXhwIFBBUkFNUyAoKHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqcGF0LAorCQkJCQkgIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikpOworc3RhdGljIHZvaWQgbW9uaXRvcl9kdW1wX3JlZ3MgUEFSQU1TKCh2b2lkKSkgOworI2lmIDAKK3N0YXRpYyBpbnQgZnJvbV9oZXggUEFSQU1TICgoaW50IGEpKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9oZXhfd29yZCBQQVJBTVMgKCh2b2lkKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHBhcnNlX3JlZ2lzdGVyX2R1bXAgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHN0cnVjdCBtb25pdG9yX29wcyAqY3VycmVudF9tb25pdG9yOworCitzdGF0aWMgaW50IGhhc2htYXJrOwkJLyogZmxhZyBzZXQgYnkgInNldCBoYXNoIiAqLworCitzdGF0aWMgaW50IHRpbWVvdXQgPSAzMDsKKworc3RhdGljIGludCBpbl9tb25pdG9yX3dhaXQgPSAwOwkvKiBOb24temVybyBtZWFucyB3ZSBhcmUgaW4gbW9uaXRvcl93YWl0KCkgKi8KKworc3RhdGljIHZvaWQgKCpvZnVuYykoKTsJCS8qIE9sZCBTSUdJTlQgc2lnbmFsIGhhbmRsZXIgKi8KKworLyogRXh0cmEgcmVtb3RlIGRlYnVnZ2luZyBmb3IgZGV2ZWxvcGluZyBhIG5ldyByb20gbW9uaXRvciB2YXJpYXRpb24gKi8KKyNpZiAhIGRlZmluZWQoRVhUUkFfUkRFQlVHKQorI2RlZmluZSBFWFRSQV9SREVCVUcgMAorI2VuZGlmCisjZGVmaW5lIFJERUJVRyhzdHVmZikgeyBpZiAoRVhUUkFfUkRFQlVHICYmIHJlbW90ZV9kZWJ1ZykgcHJpbnRmIHN0dWZmIDsgfQorCisvKiBEZXNjcmlwdG9yIGZvciBJL08gdG8gcmVtb3RlIG1hY2hpbmUuICBJbml0aWFsaXplIGl0IHRvIE5VTEwgc28KKyAgIHRoYXQgbW9uaXRvcl9vcGVuIGtub3dzIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIGZpbGUgb3BlbiB3aGVuIHRoZQorICAgcHJvZ3JhbSBzdGFydHMuICAqLworCitzdGF0aWMgc2VyaWFsX3QgbW9uaXRvcl9kZXNjID0gTlVMTDsKKworLyogUG9pbnRlciB0byByZWdleHAgcGF0dGVybiBtYXRjaGluZyBkYXRhICovCisKK3N0YXRpYyBzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgcmVnaXN0ZXJfcGF0dGVybjsKK3N0YXRpYyBjaGFyIHJlZ2lzdGVyX2Zhc3RtYXBbMjU2XTsKKworc3RhdGljIHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciBnZXRtZW1fcmVzcF9kZWxpbV9wYXR0ZXJuOworc3RhdGljIGNoYXIgZ2V0bWVtX3Jlc3BfZGVsaW1fZmFzdG1hcFsyNTZdOworCitzdGF0aWMgaW50IGR1bXBfcmVnX2ZsYWc7CS8qIE5vbi16ZXJvIG1lYW5zIGRvIGEgZHVtcF9yZWdpc3RlcnMgY21kIHdoZW4KKwkJCQkgICBtb25pdG9yX3dhaXQgd2FrZXMgdXAuICAqLworCitzdGF0aWMgRENBQ0hFICpyZW1vdGVfZGNhY2hlOworc3RhdGljIGludCBmaXJzdF90aW1lPTA7CS8qIGlzIHRoaXMgdGhlIGZpcnN0IHRpbWUgd2UncmUgZXhlY3V0aW5nIGFmdGVyIAorCQkJCQlnYXZpbmcgY3JlYXRlZCB0aGUgY2hpbGQgcHJvY2Nlc3M/ICovCisKKy8qIENvbnZlcnQgYSBzdHJpbmcgaW50byBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiwgUmV0dXJuICMgYnl0ZSBpbiB0aGUKKyAgIG5ldyBzdHJpbmcuICAqLworCitzdGF0aWMgaW50Cittb25pdG9yX3ByaW50YWJsZV9zdHJpbmcgKG5ld3N0ciwgb2xkc3RyKQorICAgICBjaGFyICpuZXdzdHI7CisgICAgIGNoYXIgKm9sZHN0cjsKK3sKKyAgY2hhciAqc2F2ZSA9IG5ld3N0cjsKKyAgaW50IGNoOworCisgIHdoaWxlICgoY2ggPSAqb2xkc3RyKyspICE9ICdcMCcpCisgICAgeworICAgICAgc3dpdGNoIChjaCkKKyAgICAgICAgeworCWRlZmF1bHQ6CisJICBpZiAoaXNwcmludCAoY2gpKQorCSAgICAqbmV3c3RyKysgPSBjaDsKKworCSAgZWxzZQorCSAgICB7CisJICAgICAgc3ByaW50ZiAobmV3c3RyLCAiXFx4JTAyeCIsIGNoICYgMHhmZik7CisJICAgICAgbmV3c3RyICs9IDQ7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSAnXFwnOiAqbmV3c3RyKysgPSAnXFwnOyAqbmV3c3RyKysgPSAnXFwnOwlicmVhazsKKwljYXNlICdcYic6ICpuZXdzdHIrKyA9ICdcXCc7ICpuZXdzdHIrKyA9ICdiJzsJYnJlYWs7CisJY2FzZSAnXGYnOiAqbmV3c3RyKysgPSAnXFwnOyAqbmV3c3RyKysgPSAndCc7CWJyZWFrOworCWNhc2UgJ1xuJzogKm5ld3N0cisrID0gJ1xcJzsgKm5ld3N0cisrID0gJ24nOwlicmVhazsKKwljYXNlICdccic6ICpuZXdzdHIrKyA9ICdcXCc7ICpuZXdzdHIrKyA9ICdyJzsJYnJlYWs7CisJY2FzZSAnXHQnOiAqbmV3c3RyKysgPSAnXFwnOyAqbmV3c3RyKysgPSAndCc7CWJyZWFrOworCWNhc2UgJ1x2JzogKm5ld3N0cisrID0gJ1xcJzsgKm5ld3N0cisrID0gJ3YnOwlicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAqbmV3c3RyKysgPSAnXDAnOworICByZXR1cm4gbmV3c3RyIC0gc2F2ZTsKK30KKworLyogUHJpbnQgbW9uaXRvciBlcnJvcnMgd2l0aCBhIHN0cmluZywgY29udmVydGluZyB0aGUgc3RyaW5nIHRvIHByaW50YWJsZQorICAgcmVwcmVzZW50YXRpb24uICAqLworCitzdGF0aWMgdm9pZAorbW9uaXRvcl9lcnJvciAoZm9ybWF0LCBtZW1hZGRyLCBsZW4sIHN0cmluZywgZmluYWxfY2hhcikKKyAgICAgY2hhciAqZm9ybWF0OworICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgY2hhciAqc3RyaW5nOworICAgICBpbnQgZmluYWxfY2hhcjsKK3sKKyAgaW50IHJlYWxfbGVuID0gKGxlbiA9PSAwICYmIHN0cmluZyAhPSAoY2hhciAqKTApID8gc3RybGVuIChzdHJpbmcpIDogbGVuOworICBjaGFyICpzYWZlX3N0cmluZyA9IGFsbG9jYSAoKHJlYWxfbGVuICogNCkgKyAxKTsKKyAgY2hhciAqcCwgKnE7CisgIGludCBjaDsKKyAgaW50IHNhZmVfbGVuID0gbW9uaXRvcl9wcmludGFibGVfc3RyaW5nIChzYWZlX3N0cmluZywgc3RyaW5nKTsKKworICBpZiAoZmluYWxfY2hhcikKKyAgICBlcnJvciAoZm9ybWF0LCAoaW50KW1lbWFkZHIsIHAgLSBzYWZlX3N0cmluZywgc2FmZV9zdHJpbmcsIGZpbmFsX2NoYXIpOworICBlbHNlCisgICAgZXJyb3IgKGZvcm1hdCwgKGludCltZW1hZGRyLCBwIC0gc2FmZV9zdHJpbmcsIHNhZmVfc3RyaW5nKTsKK30KKworLyogQ29udmVydCBoZXggZGlnaXQgQSB0byBhIG51bWJlci4gICovCisKK3N0YXRpYyBpbnQKK2Zyb21oZXggKGEpCisgICAgIGludCBhOworeworICBpZiAoYSA+PSAnMCcgJiYgYSA8PSAnOScpCisgICAgcmV0dXJuIGEgLSAnMCc7CisgIGVsc2UgaWYgKGEgPj0gJ2EnICYmIGEgPD0gJ2YnKQorICAgIHJldHVybiBhIC0gJ2EnICsgMTA7CisgIGVsc2UKKyAgICBpZiAoYSA+PSAnQScgJiYgYSA8PSAnRicpCisgICAgICByZXR1cm4gYSAtICdBJyArIDEwIDsKKyAgZWxzZSBlcnJvciAoIkludmFsaWQgaGV4IGRpZ2l0ICVkIiwgYSk7Cit9CisKKy8qIG1vbml0b3JfdnNwcmludGYgLSBzaW1pbGFyIHRvIHZzcHJpbnRmIGJ1dCBoYW5kbGVzIDY0LWJpdCBhZGRyZXNzZXMKKworICAgVGhpcyBmdW5jdGlvbiBleGlzdHMgdG8gZ2V0IGFyb3VuZCB0aGUgcHJvYmxlbSB0aGF0IG1hbnkgaG9zdCBwbGF0Zm9ybXMKKyAgIGRvbid0IGhhdmUgYSBwcmludGYgdGhhdCBjYW4gcHJpbnQgNjQtYml0IGFkZHJlc3Nlcy4gIFRoZSAlQSBmb3JtYXQKKyAgIHNwZWNpZmljYXRpb24gaXMgcmVjb2duaXplZCBhcyBhIHNwZWNpYWwgY2FzZSwgYW5kIGNhdXNlcyB0aGUgYXJndW1lbnQKKyAgIHRvIGJlIHByaW50ZWQgYXMgYSA2NC1iaXQgaGV4YWRlY2ltYWwgYWRkcmVzcy4KKworICAgT25seSBmb3JtYXQgc3BlY2lmaWVycyBvZiB0aGUgZm9ybSAiWzAtOV0qW2Etel0iIGFyZSByZWNvZ25pemVkLgorICAgSWYgaXQgaXMgYSAnJXMnIGZvcm1hdCwgdGhlIGFyZ3VtZW50IGlzIGEgc3RyaW5nOyBvdGhlcndpc2UgdGhlCisgICBhcmd1bWVudCBpcyBhc3N1bWVkIHRvIGJlIGEgbG9uZyBpbnRlZ2VyLgorCisgICAlJSBpcyBhbHNvIHR1cm5lZCBpbnRvIGEgc2luZ2xlICUuCisqLworICAKK3N0YXRpYyB2b2lkCittb25pdG9yX3ZzcHJpbnRmIChzbmRidWYsIHBhdHRlcm4sIGFyZ3MpCisgICAgIGNoYXIgKnNuZGJ1ZjsKKyAgICAgY2hhciAqcGF0dGVybjsKKyAgICAgdmFfbGlzdCBhcmdzOworeworICBjaGFyIGZvcm1hdFsxMF07CisgIGNoYXIgZm10OworICBjaGFyICpwOworICBpbnQgaTsKKyAgbG9uZyBhcmdfaW50OworICBDT1JFX0FERFIgYXJnX2FkZHI7CisgIGNoYXIgKmFyZ19zdHJpbmc7CisKKyAgZm9yIChwID0gcGF0dGVybjsgKnA7IHArKykKKyAgICB7CisgICAgICBpZiAoKnAgPT0gJyUnKQorCXsKKwkgIC8qIENvcHkgdGhlIGZvcm1hdCBzcGVjaWZpZXIgdG8gYSBzZXBhcmF0ZSBidWZmZXIuICAqLworCSAgZm9ybWF0WzBdID0gKnArKzsKKwkgIGZvciAoaSA9IDE7ICpwID49ICcwJyAmJiAqcCA8PSAnOScgJiYgaSA8IChpbnQpIHNpemVvZiAoZm9ybWF0KSAtIDI7CisJICAgICAgIGkrKywgcCsrKQorCSAgICBmb3JtYXRbaV0gPSAqcDsKKwkgIGZvcm1hdFtpXSA9IGZtdCA9ICpwOworCSAgZm9ybWF0W2krMV0gPSAnXDAnOworCisJICAvKiBGZXRjaCB0aGUgbmV4dCBhcmd1bWVudCBhbmQgcHJpbnQgaXQuICAqLworCSAgc3dpdGNoIChmbXQpCisJICAgIHsKKwkgICAgY2FzZSAnJSc6CisJICAgICAgc3RyY3B5IChzbmRidWYsICIlIik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ0EnOgorCSAgICAgIGFyZ19hZGRyID0gdmFfYXJnIChhcmdzLCBDT1JFX0FERFIpOworCSAgICAgIHN0cmNweSAoc25kYnVmLCBwYWRkcl9ueiAoYXJnX2FkZHIpKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAncyc6CisJICAgICAgYXJnX3N0cmluZyA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKKwkgICAgICBzcHJpbnRmIChzbmRidWYsIGZvcm1hdCwgYXJnX3N0cmluZyk7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgYXJnX2ludCA9IHZhX2FyZyAoYXJncywgbG9uZyk7CisJICAgICAgc3ByaW50ZiAoc25kYnVmLCBmb3JtYXQsIGFyZ19pbnQpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBzbmRidWYgKz0gc3RybGVuIChzbmRidWYpOworCX0KKyAgICAgIGVsc2UKKwkqc25kYnVmKysgPSAqcDsKKyAgICB9CisgICpzbmRidWYgPSAnXDAnOworfQorCisKKy8qIG1vbml0b3JfcHJpbnRmX25vZWNobyAtLSBTZW5kIGRhdGEgdG8gbW9uaXRvciwgYnV0IGRvbid0IGV4cGVjdCBhbiBlY2hvLgorICAgV29ya3MganVzdCBsaWtlIHByaW50Zi4gICovCisKK3ZvaWQKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKK21vbml0b3JfcHJpbnRmX25vZWNobyAoY2hhciAqcGF0dGVybiwgLi4uKQorI2Vsc2UKK21vbml0b3JfcHJpbnRmX25vZWNobyAodmFfYWxpc3QpCisgICAgIHZhX2RjbAorI2VuZGlmCit7CisgIHZhX2xpc3QgYXJnczsKKyAgY2hhciBzbmRidWZbMjAwMF07CisgIGludCBsZW47CisKKyNpZiBBTlNJX1BST1RPVFlQRVMKKyAgdmFfc3RhcnQgKGFyZ3MsIHBhdHRlcm4pOworI2Vsc2UKKyAgY2hhciAqcGF0dGVybjsKKyAgdmFfc3RhcnQgKGFyZ3MpOworICBwYXR0ZXJuID0gdmFfYXJnIChhcmdzLCBjaGFyICopOworI2VuZGlmCisKKyAgbW9uaXRvcl92c3ByaW50ZiAoc25kYnVmLCBwYXR0ZXJuLCBhcmdzKTsKKworICBsZW4gPSBzdHJsZW4gKHNuZGJ1Zik7CisgIGlmIChsZW4gKyAxID4gc2l6ZW9mIHNuZGJ1ZikKKyAgICBhYm9ydCAoKTsKKworI2lmIDAKKyAgaWYgKHJlbW90ZV9kZWJ1ZyA+IDApCisgICAgcHV0c19kZWJ1ZyAoInNlbnQgLS0+Iiwgc25kYnVmLCAiPC0tIik7CisjZW5kaWYKKyAgaWYgKEVYVFJBX1JERUJVRworICAgICAgJiYgcmVtb3RlX2RlYnVnKQorICAgIHsKKyAgICAgIGNoYXIgKnNhZmVfc3RyaW5nID0gKGNoYXIgKikgYWxsb2NhICgoc3RybGVuIChzbmRidWYpICogNCkgKyAxKTsKKyAgICAgIG1vbml0b3JfcHJpbnRhYmxlX3N0cmluZyAoc2FmZV9zdHJpbmcsIHNuZGJ1Zik7CisgICAgICBwcmludGYgKCJzZW50WyVzXVxuIiwgc2FmZV9zdHJpbmcpOworICAgIH0KKyAgCisgIG1vbml0b3Jfd3JpdGUgKHNuZGJ1ZiwgbGVuKTsKK30KKworLyogbW9uaXRvcl9wcmludGYgLS0gU2VuZCBkYXRhIHRvIG1vbml0b3IgYW5kIGNoZWNrIHRoZSBlY2hvLiAgV29ya3MganVzdCBsaWtlCisgICBwcmludGYuICAqLworCit2b2lkCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCittb25pdG9yX3ByaW50ZiAoY2hhciAqcGF0dGVybiwgLi4uKQorI2Vsc2UKK21vbml0b3JfcHJpbnRmICh2YV9hbGlzdCkKKyAgICAgdmFfZGNsCisjZW5kaWYKK3sKKyAgdmFfbGlzdCBhcmdzOworICBjaGFyIHNuZGJ1ZlsyMDAwXTsKKyAgaW50IGxlbjsKKworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworICB2YV9zdGFydCAoYXJncywgcGF0dGVybik7CisjZWxzZQorICBjaGFyICpwYXR0ZXJuOworICB2YV9zdGFydCAoYXJncyk7CisgIHBhdHRlcm4gPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7CisjZW5kaWYKKworICBtb25pdG9yX3ZzcHJpbnRmIChzbmRidWYsIHBhdHRlcm4sIGFyZ3MpOworCisgIGxlbiA9IHN0cmxlbiAoc25kYnVmKTsKKyAgaWYgKGxlbiArIDEgPiBzaXplb2Ygc25kYnVmKQorICAgIGFib3J0ICgpOworCisjaWYgMAorICBpZiAocmVtb3RlX2RlYnVnID4gMCkKKyAgICBwdXRzX2RlYnVnICgic2VudCAtLT4iLCBzbmRidWYsICI8LS0iKTsKKyNlbmRpZgorICBpZiAoRVhUUkFfUkRFQlVHCisgICAgICAmJiByZW1vdGVfZGVidWcpCisgICAgeworICAgICAgY2hhciAqc2FmZV9zdHJpbmcgPSAoY2hhciAqKSBhbGxvY2EgKChsZW4gKiA0KSArIDEpOworICAgICAgbW9uaXRvcl9wcmludGFibGVfc3RyaW5nIChzYWZlX3N0cmluZywgc25kYnVmKTsKKyAgICAgIHByaW50ZiAoInNlbnRbJXNdXG4iLCBzYWZlX3N0cmluZyk7CisgICAgfQorCisgIG1vbml0b3Jfd3JpdGUgKHNuZGJ1ZiwgbGVuKTsKKworICAvKiBXZSB1c2VkIHRvIGV4cGVjdCB0aGF0IHRoZSBuZXh0IGltbWVkaWF0ZSBvdXRwdXQgd2FzIHRoZSBjaGFyYWN0ZXJzIHdlCisgICAgIGp1c3Qgb3V0cHV0LCBidXQgc29tZXRpbWVzIHNvbWUgZXh0cmEganVuayBhcHBlYXJlZCBiZWZvcmUgdGhlIGNoYXJhY3RlcnMKKyAgICAgd2UgZXhwZWN0ZWQsIGxpa2UgYW4gZXh0cmEgcHJvbXB0LCBvciBhIHBvcnRtYXN0ZXIgc2VuZGluZyB0ZWxuZXQgbmVnb3RpYXRpb25zLgorICAgICBTbywganVzdCBzdGFydCBzZWFyY2hpbmcgZm9yIHdoYXQgd2Ugc2VudCwgYW5kIHNraXAgYW55dGhpbmcgdW5rbm93bi4gICovCisgIFJERUJVRygoIkV4cGVjdEVjaG9cbiIpKQorICBtb25pdG9yX2V4cGVjdCAoc25kYnVmLCAoY2hhciAqKTAsIDApOworfQorCisKKy8qIFdyaXRlIGNoYXJhY3RlcnMgdG8gdGhlIHJlbW90ZSBzeXN0ZW0uICAqLworCit2b2lkCittb25pdG9yX3dyaXRlIChidWYsIGJ1ZmxlbikKKyAgICAgY2hhciAqYnVmOworICAgICBpbnQgYnVmbGVuOworeworICBpZiAoU0VSSUFMX1dSSVRFKG1vbml0b3JfZGVzYywgYnVmLCBidWZsZW4pKQorICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlNFUklBTF9XUklURSBmYWlsZWQ6ICVzXG4iLAorCQkJc2FmZV9zdHJlcnJvciAoZXJybm8pKTsKK30KKworCisvKiBSZWFkIGEgYmluYXJ5IGNoYXJhY3RlciBmcm9tIHRoZSByZW1vdGUgc3lzdGVtLCBkb2luZyBhbGwgdGhlIGZhbmN5CisgICB0aW1lb3V0IHN0dWZmLCBidXQgd2l0aG91dCBpbnRlcnByZXRpbmcgdGhlIGNoYXJhY3RlciBpbiBhbnkgd2F5LAorICAgYW5kIHdpdGhvdXQgcHJpbnRpbmcgcmVtb3RlIGRlYnVnIGluZm9ybWF0aW9uLiAgKi8KKworaW50Cittb25pdG9yX3JlYWRjaGFyICgpCit7CisgIGludCBjOworICBpbnQgbG9vcGluZzsKKworICBkbworICAgIHsKKyAgICAgIGxvb3BpbmcgPSAwOworICAgICAgYyA9IFNFUklBTF9SRUFEQ0hBUiAobW9uaXRvcl9kZXNjLCB0aW1lb3V0KTsKKworICAgICAgaWYgKGMgPj0gMCkKKwljICY9IDB4ZmY7CQkJLyogZG9uJ3QgbG9zZSBiaXQgNyAqLworICAgIH0KKyAgd2hpbGUgKGxvb3BpbmcpOworCisgIGlmIChjID49IDApCisgICAgcmV0dXJuIGM7CisKKyAgaWYgKGMgPT0gU0VSSUFMX1RJTUVPVVQpCisgICAgICBlcnJvciAoIlRpbWVvdXQgcmVhZGluZyBmcm9tIHJlbW90ZSBzeXN0ZW0uIik7CisKKyAgcGVycm9yX3dpdGhfbmFtZSAoInJlbW90ZS1tb25pdG9yIik7Cit9CisKKworLyogUmVhZCBhIGNoYXJhY3RlciBmcm9tIHRoZSByZW1vdGUgc3lzdGVtLCBkb2luZyBhbGwgdGhlIGZhbmN5CisgICB0aW1lb3V0IHN0dWZmLiAgKi8KKworc3RhdGljIGludAorcmVhZGNoYXIgKHRpbWVvdXQpCisgICAgIGludCB0aW1lb3V0OworeworICBpbnQgYzsKKyAgc3RhdGljIGVudW0geyBsYXN0X3JhbmRvbSwgbGFzdF9ubCwgbGFzdF9jciwgbGFzdF9jcm5sIH0gc3RhdGUgPSBsYXN0X3JhbmRvbTsKKyAgaW50IGxvb3Bpbmc7CisKKyAgZG8KKyAgICB7CisgICAgICBsb29waW5nID0gMDsKKyAgICAgIGMgPSBTRVJJQUxfUkVBRENIQVIgKG1vbml0b3JfZGVzYywgdGltZW91dCk7CisKKyAgICAgIGlmIChjID49IDApCisJeworCSAgYyAmPSAweDdmOworI2lmIDAKKwkgIC8qIFRoaXMgc2VlbXMgdG8gaW50ZXJmZXJlIHdpdGggcHJvcGVyIGZ1bmN0aW9uIG9mIHRoZQorCSAgICAgaW5wdXQgc3RyZWFtICovCisJICBpZiAocmVtb3RlX2RlYnVnID4gMCkKKwkgICAgeworCSAgICAgIGNoYXIgYnVmWzJdOworCSAgICAgIGJ1ZlswXSA9IGM7CisJICAgICAgYnVmWzFdID0gJ1wwJzsKKwkgICAgICBwdXRzX2RlYnVnICgicmVhZCAtLT4iLCBidWYsICI8LS0iKTsKKwkgICAgfQorCSAgCisjZW5kaWYJICAKKwl9CisKKyAgICAgIC8qIENhbm9uaWNpYWxpemUgXG5cciBjb21iaW5hdGlvbnMgaW50byBvbmUgXHIgKi8KKyAgICAgIGlmICgoY3VycmVudF9tb25pdG9yLT5mbGFncyAmIE1PX0hBTkRMRV9OTCkgIT0gMCkKKwl7CisJICBpZiAoKGMgPT0gJ1xyJyAmJiBzdGF0ZSA9PSBsYXN0X25sKQorCSAgICAgIHx8IChjID09ICdcbicgJiYgc3RhdGUgPT0gbGFzdF9jcikpCisJICAgIHsKKwkgICAgICBzdGF0ZSA9IGxhc3RfY3JubDsKKwkgICAgICBsb29waW5nID0gMTsKKwkgICAgfQorCSAgZWxzZSBpZiAoYyA9PSAnXHInKQorCSAgICBzdGF0ZSA9IGxhc3RfY3I7CisJICBlbHNlIGlmIChjICE9ICdcbicpCisJICAgIHN0YXRlID0gbGFzdF9yYW5kb207CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzdGF0ZSA9IGxhc3Rfbmw7CisJICAgICAgYyA9ICdccic7CisJICAgIH0KKwl9CisgICAgfQorICB3aGlsZSAobG9vcGluZyk7CisKKyAgaWYgKGMgPj0gMCkKKyAgICByZXR1cm4gYzsKKworICBpZiAoYyA9PSBTRVJJQUxfVElNRU9VVCkKKyNpZiAwIC8qIE1BSU5URU5BTkNFX0NNRFMgKi8KKyAgICAvKiBJIGZhaWwgdG8gc2VlIGhvdyBkZXRhY2hpbmcgaGVyZSBjYW4gYmUgdXNlZnVsICovCisgICAgaWYgKGluX21vbml0b3Jfd2FpdCkJLyogV2F0Y2hkb2cgd2VudCBvZmYgKi8KKyAgICAgIHsKKwl0YXJnZXRfbW91cm5faW5mZXJpb3IgKCk7CisJZXJyb3IgKCJHREIgc2VyaWFsIHRpbWVvdXQgaGFzIGV4cGlyZWQuICBUYXJnZXQgZGV0YWNoZWQuXG4iKTsKKyAgICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIGVycm9yICgiVGltZW91dCByZWFkaW5nIGZyb20gcmVtb3RlIHN5c3RlbS4iKTsKKworICBwZXJyb3Jfd2l0aF9uYW1lICgicmVtb3RlLW1vbml0b3IiKTsKK30KKworLyogU2NhbiBpbnB1dCBmcm9tIHRoZSByZW1vdGUgc3lzdGVtLCB1bnRpbCBTVFJJTkcgaXMgZm91bmQuICBJZiBCVUYgaXMgbm9uLQorICAgemVybywgdGhlbiBjb2xsZWN0IGlucHV0IHVudGlsIHdlIGhhdmUgY29sbGVjdGVkIGVpdGhlciBTVFJJTkcgb3IgQlVGTEVOLTEKKyAgIGNoYXJzLiAgSW4gZWl0aGVyIGNhc2Ugd2UgdGVybWluYXRlIEJVRiB3aXRoIGEgMC4gIElmIGlucHV0IG92ZXJmbG93cyBCVUYKKyAgIGJlY2F1c2UgU1RSSU5HIGNhbid0IGJlIGZvdW5kLCByZXR1cm4gLTEsIGVsc2UgcmV0dXJuIG51bWJlciBvZiBjaGFycyBpbiBCVUYKKyAgIChtaW51cyB0aGUgdGVybWluYXRpbmcgTlVMKS4gIE5vdGUgdGhhdCBpbiB0aGUgbm9uLW92ZXJmbG93IGNhc2UsIFNUUklORworICAgd2lsbCBiZSBhdCB0aGUgZW5kIG9mIEJVRi4gICovCisKK2ludAorbW9uaXRvcl9leHBlY3QgKHN0cmluZywgYnVmLCBidWZsZW4pCisgICAgIGNoYXIgKnN0cmluZzsKKyAgICAgY2hhciAqYnVmOworICAgICBpbnQgYnVmbGVuOworeworICBjaGFyICpwID0gc3RyaW5nOworICBpbnQgb2J1ZmxlbiA9IGJ1ZmxlbjsKKyAgaW50IGM7CisgIGV4dGVybiBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ19vcHM7CisKKyAgaWYgKEVYVFJBX1JERUJVRworICAgICAgJiYgcmVtb3RlX2RlYnVnKQorICAgIHsKKyAgICAgIGNoYXIgKnNhZmVfc3RyaW5nID0gKGNoYXIgKikgYWxsb2NhICgoc3RybGVuIChzdHJpbmcpICogNCkgKyAxKTsKKyAgICAgIG1vbml0b3JfcHJpbnRhYmxlX3N0cmluZyAoc2FmZV9zdHJpbmcsIHN0cmluZyk7CisgICAgICBwcmludGYgKCJNT04gRXhwZWN0aW5nICclcydcbiIsIHNhZmVfc3RyaW5nKTsKKyAgICB9CisKKyAgaW1tZWRpYXRlX3F1aXQgPSAxOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAoYnVmKQorCXsKKwkgIGlmIChidWZsZW4gPCAyKQorCSAgICB7CisJICAgICAgKmJ1ZiA9ICdcMDAwJzsKKwkgICAgICBpbW1lZGlhdGVfcXVpdCA9IDA7CisJICAgICAgcmV0dXJuIC0xOworCSAgICB9CisKKwkgIGMgPSByZWFkY2hhciAodGltZW91dCk7CisJICBpZiAoYyA9PSAnXDAwMCcpCisJICAgIGNvbnRpbnVlOworCSAgKmJ1ZisrID0gYzsKKwkgIGJ1Zmxlbi0tOworCX0KKyAgICAgIGVsc2UKKwljID0gcmVhZGNoYXIgKHRpbWVvdXQpOworCisgICAgICAvKiBEb24ndCBleHBlY3QgYW55IF5DIHNlbnQgdG8gYmUgZWNob2VkICovCisJCisgICAgICBpZiAoKnAgPT0gJ1wwMDMnIHx8IGMgPT0gKnApCisJeworCSAgcCsrOworCSAgaWYgKCpwID09ICdcMCcpCisJICAgIHsKKwkgICAgICBpbW1lZGlhdGVfcXVpdCA9IDA7CisKKwkgICAgICBpZiAoYnVmKQorCQl7CisJCSAgKmJ1ZisrID0gJ1wwMDAnOworCQkgIHJldHVybiBvYnVmbGVuIC0gYnVmbGVuOworCQl9CisJICAgICAgZWxzZQorCQlyZXR1cm4gMDsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKChjID09ICdcMDIxJyB8fCBjID09ICdcMDIzJykgJiYKKwkgICAgICAgKFNUUkVRICh0YXJnX29wcy0+dG9fc2hvcnRuYW1lLCAibTMyciIpCisJCXx8IFNUUkVRICh0YXJnX29wcy0+dG9fc2hvcnRuYW1lLCAibW9uMjAwMCIpKSkKKwl7IC8qIG0zMnIgbW9uaXRvciBlbWl0cyByYW5kb20gREMxL0RDMyBjaGFycyAqLworCSAgY29udGludWU7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHAgPSBzdHJpbmc7CisJICBpZiAoYyA9PSAqcCkKKwkgICAgcCsrOworCX0KKyAgICB9Cit9CisKKy8qIFNlYXJjaCBmb3IgYSByZWdleHAuICAqLworCitzdGF0aWMgaW50Cittb25pdG9yX2V4cGVjdF9yZWdleHAgKHBhdCwgYnVmLCBidWZsZW4pCisgICAgIHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqcGF0OworICAgICBjaGFyICpidWY7CisgICAgIGludCBidWZsZW47Cit7CisgIGNoYXIgKm15YnVmOworICBjaGFyICpwOworICBSREVCVUcoKCJNT04gRXhwZWN0aW5nIHJlZ2V4cFxuIikpIDsKKyAgaWYgKGJ1ZikKKyAgICBteWJ1ZiA9IGJ1ZjsKKyAgZWxzZQorICAgIHsKKyAgICAgIG15YnVmID0gYWxsb2NhICgxMDI0KTsKKyAgICAgIGJ1ZmxlbiA9IDEwMjQ7CisgICAgfQorCisgIHAgPSBteWJ1ZjsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaW50IHJldHZhbDsKKworICAgICAgaWYgKHAgLSBteWJ1ZiA+PSBidWZsZW4pCisJewkJCS8qIEJ1ZmZlciBhYm91dCB0byBvdmVyZmxvdyAqLworCisvKiBPbiBvdmVyZmxvdywgd2UgY29weSB0aGUgdXBwZXIgaGFsZiBvZiB0aGUgYnVmZmVyIHRvIHRoZSBsb3dlciBoYWxmLiAgTm90CisgICBncmVhdCwgYnV0IGl0IHVzdWFsbHkgd29ya3MuLi4gKi8KKworCSAgbWVtY3B5IChteWJ1ZiwgbXlidWYgKyBidWZsZW4gLyAyLCBidWZsZW4gLyAyKTsKKwkgIHAgPSBteWJ1ZiArIGJ1ZmxlbiAvIDI7CisJfQorCisgICAgICAqcCsrID0gcmVhZGNoYXIgKHRpbWVvdXQpOworCisgICAgICByZXR2YWwgPSByZV9zZWFyY2ggKHBhdCwgbXlidWYsIHAgLSBteWJ1ZiwgMCwgcCAtIG15YnVmLCBOVUxMKTsKKyAgICAgIGlmIChyZXR2YWwgPj0gMCkKKwlyZXR1cm4gMTsKKyAgICB9Cit9CisKKy8qIEtlZXAgZGlzY2FyZGluZyBpbnB1dCB1bnRpbCB3ZSBzZWUgdGhlIE1PTklUT1IgcHJvbXB0LgorCisgICBUaGUgY29udmVudGlvbiBmb3IgZGVhbGluZyB3aXRoIHRoZSBwcm9tcHQgaXMgdGhhdCB5b3UKKyAgIG8gZ2l2ZSB5b3VyIGNvbW1hbmQKKyAgIG8gKnRoZW4qIHdhaXQgZm9yIHRoZSBwcm9tcHQuCisKKyAgIFRodXMgdGhlIGxhc3QgdGhpbmcgdGhhdCBhIHByb2NlZHVyZSBkb2VzIHdpdGggdGhlIHNlcmlhbCBsaW5lIHdpbGwKKyAgIGJlIGFuIG1vbml0b3JfZXhwZWN0X3Byb21wdCgpLiAgRXhjZXB0aW9uOiBtb25pdG9yX3Jlc3VtZSBkb2VzIG5vdAorICAgd2FpdCBmb3IgdGhlIHByb21wdCwgYmVjYXVzZSB0aGUgdGVybWluYWwgaXMgYmVpbmcgaGFuZGVkIG92ZXIgdG8KKyAgIHRoZSBpbmZlcmlvci4gIEhvd2V2ZXIsIHRoZSBuZXh0IHRoaW5nIHdoaWNoIGhhcHBlbnMgYWZ0ZXIgdGhhdCBpcworICAgYSBtb25pdG9yX3dhaXQgd2hpY2ggZG9lcyB3YWl0IGZvciB0aGUgcHJvbXB0LiAgTm90ZSB0aGF0IHRoaXMKKyAgIGluY2x1ZGVzIGFibm9ybWFsIGV4aXQsIGUuZy4gZXJyb3IoKS4gIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQKKyAgIGdldHRpbmcgaW50byBzdGF0ZXMgZnJvbSB3aGljaCB3ZSBjYW4ndCByZWNvdmVyLiAgKi8KKworaW50Cittb25pdG9yX2V4cGVjdF9wcm9tcHQgKGJ1ZiwgYnVmbGVuKQorICAgICBjaGFyICpidWY7CisgICAgIGludCBidWZsZW47Cit7CisgIFJERUJVRygoIk1PTiBFeHBlY3RpbmcgcHJvbXB0XG4iKSkKKyAgcmV0dXJuIG1vbml0b3JfZXhwZWN0IChjdXJyZW50X21vbml0b3ItPnByb21wdCwgYnVmLCBidWZsZW4pOworfQorCisvKiBHZXQgTiAzMi1iaXQgd29yZHMgZnJvbSByZW1vdGUsIGVhY2ggcHJlY2VkZWQgYnkgYSBzcGFjZSwgYW5kIHB1dAorICAgdGhlbSBpbiByZWdpc3RlcnMgc3RhcnRpbmcgYXQgUkVHTk8uICAqLworCisjaWYgMAorc3RhdGljIHVuc2lnbmVkIGxvbmcKK2dldF9oZXhfd29yZCAoKQoreworICB1bnNpZ25lZCBsb25nIHZhbDsKKyAgaW50IGk7CisgIGludCBjaDsKKworICBkbworICAgIGNoID0gcmVhZGNoYXIgKHRpbWVvdXQpOworICB3aGlsZSAoaXNzcGFjZShjaCkpOworCisgIHZhbCA9IGZyb21faGV4IChjaCk7CisKKyAgZm9yIChpID0gNzsgaSA+PSAxOyBpLS0pCisgICAgeworICAgICAgY2ggPSByZWFkY2hhciAodGltZW91dCk7CisgICAgICBpZiAoIWlzeGRpZ2l0IChjaCkpCisJYnJlYWs7CisgICAgICB2YWwgPSAodmFsIDw8IDQpIHwgZnJvbV9oZXggKGNoKTsKKyAgICB9CisKKyAgcmV0dXJuIHZhbDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorY29tcGlsZV9wYXR0ZXJuIChwYXR0ZXJuLCBjb21waWxlZF9wYXR0ZXJuLCBmYXN0bWFwKQorICAgICBjaGFyICpwYXR0ZXJuOworICAgICBzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgKmNvbXBpbGVkX3BhdHRlcm47CisgICAgIGNoYXIgKmZhc3RtYXA7Cit7CisgIGludCB0bXA7CisgIGNvbnN0IGNoYXIgKnZhbDsKKworICBjb21waWxlZF9wYXR0ZXJuLT5mYXN0bWFwID0gZmFzdG1hcDsKKworICB0bXAgPSByZV9zZXRfc3ludGF4IChSRV9TWU5UQVhfRU1BQ1MpOworICB2YWwgPSByZV9jb21waWxlX3BhdHRlcm4gKHBhdHRlcm4sCisJCQkgICAgc3RybGVuIChwYXR0ZXJuKSwKKwkJCSAgICBjb21waWxlZF9wYXR0ZXJuKTsKKyAgcmVfc2V0X3N5bnRheCAodG1wKTsKKworICBpZiAodmFsKQorICAgIGVycm9yICgiY29tcGlsZV9wYXR0ZXJuOiBDYW4ndCBjb21waWxlIHBhdHRlcm4gc3RyaW5nIGAlcyc6ICVzISIsIHBhdHRlcm4sIHZhbCk7CisKKyAgaWYgKGZhc3RtYXApCisgICAgcmVfY29tcGlsZV9mYXN0bWFwIChjb21waWxlZF9wYXR0ZXJuKTsKK30KKworLyogT3BlbiBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgZGVidWdnZXIuIE5BTUUgaXMgdGhlIGZpbGVuYW1lIHVzZWQKKyAgIGZvciBjb21tdW5pY2F0aW9uLiAgKi8KKwordm9pZAorbW9uaXRvcl9vcGVuIChhcmdzLCBtb25fb3BzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgc3RydWN0IG1vbml0b3Jfb3BzICptb25fb3BzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgKipwOworCisgIGlmIChtb25fb3BzLT5tYWdpYyAhPSBNT05JVE9SX09QU19NQUdJQykKKyAgICBlcnJvciAoIk1hZ2ljIG51bWJlciBvZiBtb25pdG9yX29wcyBzdHJ1Y3Qgd3JvbmcuIik7CisKKyAgdGFyZ19vcHMgPSBtb25fb3BzLT50YXJnZXQ7CisgIG5hbWUgPSB0YXJnX29wcy0+dG9fc2hvcnRuYW1lOworCisgIGlmICghYXJncykKKyAgICBlcnJvciAoIlVzZSBgdGFyZ2V0ICVzIERFVklDRS1OQU1FJyB0byB1c2UgYSBzZXJpYWwgcG9ydCwgb3IgXG5cCitgdGFyZ2V0ICVzIEhPU1QtTkFNRTpQT1JULU5VTUJFUicgdG8gdXNlIGEgbmV0d29yayBjb25uZWN0aW9uLiIsIG5hbWUsIG5hbWUpOworCisgIHRhcmdldF9wcmVvcGVuIChmcm9tX3R0eSk7CisKKyAgLyogU2V0dXAgcGF0dGVybiBmb3IgcmVnaXN0ZXIgZHVtcCAqLworCisgIGlmIChtb25fb3BzLT5yZWdpc3Rlcl9wYXR0ZXJuKQorICAgIGNvbXBpbGVfcGF0dGVybiAobW9uX29wcy0+cmVnaXN0ZXJfcGF0dGVybiwgJnJlZ2lzdGVyX3BhdHRlcm4sCisJCSAgICAgcmVnaXN0ZXJfZmFzdG1hcCk7CisKKyAgaWYgKG1vbl9vcHMtPmdldG1lbS5yZXNwX2RlbGltKQorICAgIGNvbXBpbGVfcGF0dGVybiAobW9uX29wcy0+Z2V0bWVtLnJlc3BfZGVsaW0sICZnZXRtZW1fcmVzcF9kZWxpbV9wYXR0ZXJuLAorCQkgICAgIGdldG1lbV9yZXNwX2RlbGltX2Zhc3RtYXApOworCisgIHVucHVzaF90YXJnZXQgKHRhcmdfb3BzKTsKKworICBpZiAoZGV2X25hbWUpCisgICAgZnJlZSAoZGV2X25hbWUpOworICBkZXZfbmFtZSA9IHN0cnNhdmUgKGFyZ3MpOworCisgIG1vbml0b3JfZGVzYyA9IFNFUklBTF9PUEVOIChkZXZfbmFtZSk7CisKKyAgaWYgKCFtb25pdG9yX2Rlc2MpCisgICAgcGVycm9yX3dpdGhfbmFtZSAoZGV2X25hbWUpOworCisgIGlmIChiYXVkX3JhdGUgIT0gLTEpCisgICAgeworICAgICAgaWYgKFNFUklBTF9TRVRCQVVEUkFURSAobW9uaXRvcl9kZXNjLCBiYXVkX3JhdGUpKQorCXsKKwkgIFNFUklBTF9DTE9TRSAobW9uaXRvcl9kZXNjKTsKKwkgIHBlcnJvcl93aXRoX25hbWUgKGRldl9uYW1lKTsKKwl9CisgICAgfQorICAKKyAgU0VSSUFMX1JBVyAobW9uaXRvcl9kZXNjKTsKKworICBTRVJJQUxfRkxVU0hfSU5QVVQgKG1vbml0b3JfZGVzYyk7CisKKyAgLyogc29tZSBzeXN0ZW1zIG9ubHkgd29yayB3aXRoIDIgc3RvcCBiaXRzICovCisKKyAgU0VSSUFMX1NFVFNUT1BCSVRTIChtb25pdG9yX2Rlc2MsIG1vbl9vcHMtPnN0b3BiaXRzKTsKKworICBjdXJyZW50X21vbml0b3IgPSBtb25fb3BzOworCisgIC8qIFNlZSBpZiB3ZSBjYW4gd2FrZSB1cCB0aGUgbW9uaXRvci4gIEZpcnN0LCB0cnkgc2VuZGluZyBhIHN0b3Agc2VxdWVuY2UsCisgICAgIHRoZW4gc2VuZCB0aGUgaW5pdCBzdHJpbmdzLiAgTGFzdCwgcmVtb3ZlIGFsbCBicmVha3BvaW50cy4gICovCisKKyAgaWYgKGN1cnJlbnRfbW9uaXRvci0+c3RvcCkKKyAgICB7CisgICAgICBtb25pdG9yX3N0b3AgKCk7CisgICAgICBpZiAoKGN1cnJlbnRfbW9uaXRvci0+ZmxhZ3MgJiBNT19OT19FQ0hPX09OX09QRU4pID09IDApCisgICAgICAgIHsKKwkgIFJERUJVRygoIkVYUCBPcGVuIGVjaG9cbiIpKSA7CisJICBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKE5VTEwsIDApOyAKKyAgICAgIH0KKyAgICB9CisKKyAgLyogd2FrZSB1cCB0aGUgbW9uaXRvciBhbmQgc2VlIGlmIGl0J3MgYWxpdmUgKi8KKyAgZm9yIChwID0gbW9uX29wcy0+aW5pdDsgKnAgIT0gTlVMTDsgcCsrKQorICAgIHsKKyAgICAgIC8qIFNvbWUgb2YgdGhlIGNoYXJhY3RlcnMgd2Ugc2VuZCBtYXkgbm90IGJlIGVjaG9lZCwKKwkgYnV0IHdlIGhvcGUgdG8gZ2V0IGEgcHJvbXB0IGF0IHRoZSBlbmQgb2YgaXQgYWxsLiAqLworCSAKKyAgICAgIGlmICgoY3VycmVudF9tb25pdG9yLT5mbGFncyAmIE1PX05PX0VDSE9fT05fT1BFTikgPT0gMCkKKyAgICAgICAgbW9uaXRvcl9wcmludGYoKnApOyAKKyAgICAgIGVsc2UKKyAgICAgICAgbW9uaXRvcl9wcmludGZfbm9lY2hvICgqcCk7CisgICAgICBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKE5VTEwsIDApOworICAgIH0KKworICBTRVJJQUxfRkxVU0hfSU5QVVQgKG1vbml0b3JfZGVzYyk7CisKKyAgLyogUmVtb3ZlIGFsbCBicmVha3BvaW50cyAqLworCisgIGlmIChtb25fb3BzLT5jbHJfYWxsX2JyZWFrKQorICAgIHsKKyAgICAgIG1vbml0b3JfcHJpbnRmIChtb25fb3BzLT5jbHJfYWxsX2JyZWFrKTsKKyAgICAgIG1vbml0b3JfZXhwZWN0X3Byb21wdCAoTlVMTCwgMCk7CisgICAgfQorCisgIGlmIChmcm9tX3R0eSkKKyAgICBwcmludGZfdW5maWx0ZXJlZCAoIlJlbW90ZSB0YXJnZXQgJXMgY29ubmVjdGVkIHRvICVzXG4iLCBuYW1lLCBkZXZfbmFtZSk7CisKKyAgcHVzaF90YXJnZXQgKHRhcmdfb3BzKTsKKworICBpbmZlcmlvcl9waWQgPSA0MjAwMDsJCS8qIE1ha2UgcnVuIGNvbW1hbmQgdGhpbmsgd2UgYXJlIGJ1c3kuLi4gKi8KKworICAvKiBHaXZlIG1vbml0b3Jfd2FpdCBzb21ldGhpbmcgdG8gcmVhZCAqLworCisgIG1vbml0b3JfcHJpbnRmIChjdXJyZW50X21vbml0b3ItPmxpbmVfdGVybSk7CisKKyAgaWYgKGN1cnJlbnRfbW9uaXRvci0+ZmxhZ3MgJiBNT19IQVNfQkxPQ0tXUklURVMpCisgICAgcmVtb3RlX2RjYWNoZSA9IGRjYWNoZV9pbml0IChtb25pdG9yX3JlYWRfbWVtb3J5LCBtb25pdG9yX3dyaXRlX21lbW9yeV9ibG9jayk7CisgIGVsc2UKKyAgICByZW1vdGVfZGNhY2hlID0gZGNhY2hlX2luaXQgKG1vbml0b3JfcmVhZF9tZW1vcnksIG1vbml0b3Jfd3JpdGVfbWVtb3J5KTsKKyAgc3RhcnRfcmVtb3RlICgpOworfQorCisvKiBDbG9zZSBvdXQgYWxsIGZpbGVzIGFuZCBsb2NhbCBzdGF0ZSBiZWZvcmUgdGhpcyB0YXJnZXQgbG9zZXMKKyAgIGNvbnRyb2wuICAqLworCit2b2lkCittb25pdG9yX2Nsb3NlIChxdWl0dGluZykKKyAgICAgaW50IHF1aXR0aW5nOworeworICBpZiAobW9uaXRvcl9kZXNjKQorICAgIFNFUklBTF9DTE9TRSAobW9uaXRvcl9kZXNjKTsKKyAgbW9uaXRvcl9kZXNjID0gTlVMTDsKK30KKworLyogVGVybWluYXRlIHRoZSBvcGVuIGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSBkZWJ1Z2dlci4gIFVzZSB0aGlzCisgICB3aGVuIHlvdSB3YW50IHRvIGRldGFjaCBhbmQgZG8gc29tZXRoaW5nIGVsc2Ugd2l0aCB5b3VyIGdkYi4gICovCisKK3N0YXRpYyB2b2lkCittb25pdG9yX2RldGFjaCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcG9wX3RhcmdldCAoKTsJCS8qIGNhbGxzIG1vbml0b3JfY2xvc2UgdG8gZG8gdGhlIHJlYWwgd29yayAqLworICBpZiAoZnJvbV90dHkpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJFbmRpbmcgcmVtb3RlICVzIGRlYnVnZ2luZ1xuIiwgdGFyZ2V0X3Nob3J0bmFtZSk7Cit9CisKKy8qIENvbnZlcnQgVkFMU1RSIGludG8gdGhlIHRhcmdldCBieXRlLW9yZGVyZWQgdmFsdWUgb2YgUkVHTk8gYW5kIHN0b3JlIGl0LiAgKi8KKworY2hhciAqCittb25pdG9yX3N1cHBseV9yZWdpc3RlciAocmVnbm8sIHZhbHN0cikKKyAgICAgaW50IHJlZ25vOworICAgICBjaGFyICp2YWxzdHI7Cit7CisgIHVuc2lnbmVkIGludCB2YWw7CisgIHVuc2lnbmVkIGNoYXIgcmVnYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisgIGNoYXIgKnA7CisKKyAgdmFsID0gc3RydG91bCAodmFsc3RyLCAmcCwgMTYpOworICBSREVCVUcoKCJTdXBwbHlpbmcgUmVnaXN0ZXIgJWQgJXNcbiIscmVnbm8sdmFsc3RyKSkgOworCisgIGlmICh2YWwgPT0gMCAmJiB2YWxzdHIgPT0gcCkKKyAgICBlcnJvciAoIm1vbml0b3Jfc3VwcGx5X3JlZ2lzdGVyICglZCk6ICBiYWQgdmFsdWUgZnJvbSBtb25pdG9yOiAlcy4iLAorCSAgIHJlZ25vLCB2YWxzdHIpOworCisgIC8qIHN1cHBseSByZWdpc3RlciBzdG9yZXMgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIsIHNvIHN3YXAgaGVyZSAqLworCisgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKHJlZ2J1ZiwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ25vKSwgdmFsKTsKKworICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCByZWdidWYpOworCisgIHJldHVybiBwOworfQorCisvKiBUZWxsIHRoZSByZW1vdGUgbWFjaGluZSB0byByZXN1bWUuICAqLworCit2b2lkCitmbHVzaF9tb25pdG9yX2RjYWNoZSAoKQoreworICBkY2FjaGVfZmx1c2ggKHJlbW90ZV9kY2FjaGUpOworfQorCitzdGF0aWMgdm9pZAorbW9uaXRvcl9yZXN1bWUgKHBpZCwgc3RlcCwgc2lnKQorICAgICBpbnQgcGlkLCBzdGVwOworICAgICBlbnVtIHRhcmdldF9zaWduYWwgc2lnOworeworICAvKiBTb21lIG1vbml0b3JzIHJlcXVpcmUgYSBkaWZmZXJlbnQgY29tbWFuZCB3aGVuIHN0YXJ0aW5nIGEgcHJvZ3JhbSAqLworICBSREVCVUcoKCJNT04gcmVzdW1lXG4iKSkgOworICBpZiAoY3VycmVudF9tb25pdG9yLT5mbGFncyAmIE1PX1JVTl9GSVJTVF9USU1FICYmIGZpcnN0X3RpbWUgPT0gMSkKKyAgICB7CisgICAgICBmaXJzdF90aW1lID0gMDsKKyAgICAgIG1vbml0b3JfcHJpbnRmICgicnVuXHIiKTsKKyAgICAgIGlmIChjdXJyZW50X21vbml0b3ItPmZsYWdzICYgTU9fTkVFRF9SRUdEVU1QX0FGVEVSX0NPTlQpCisJICAgIGR1bXBfcmVnX2ZsYWcgPSAxOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZGNhY2hlX2ZsdXNoIChyZW1vdGVfZGNhY2hlKTsKKyAgaWYgKHN0ZXApCisgICAgbW9uaXRvcl9wcmludGYgKGN1cnJlbnRfbW9uaXRvci0+c3RlcCk7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoY3VycmVudF9tb25pdG9yLT5jb250aW51ZV9ob29rKQorCSgqY3VycmVudF9tb25pdG9yLT5jb250aW51ZV9ob29rKSgpIDsKKyAgICAgIGVsc2UgbW9uaXRvcl9wcmludGYgKGN1cnJlbnRfbW9uaXRvci0+Y29udCk7CisgICAgICBpZiAoY3VycmVudF9tb25pdG9yLT5mbGFncyAmIE1PX05FRURfUkVHRFVNUF9BRlRFUl9DT05UKQorCWR1bXBfcmVnX2ZsYWcgPSAxOworICAgIH0KK30KKworLyogUGFyc2UgdGhlIG91dHB1dCBvZiBhIHJlZ2lzdGVyIGR1bXAgY29tbWFuZC4gIEEgbW9uaXRvciBzcGVjaWZpYworICAgcmVnZXhwIGlzIHVzZWQgdG8gZXh0cmFjdCBpbmRpdmlkdWFsIHJlZ2lzdGVyIGRlc2NyaXB0aW9ucyBvZiB0aGUKKyAgIGZvcm0gUkVHPVZBTC4gIEVhY2ggZGVzY3JpcHRpb24gaXMgc3BsaXQgdXAgaW50byBhIG5hbWUgYW5kIGEgdmFsdWUKKyAgIHN0cmluZyB3aGljaCBhcmUgcGFzc2VkIGRvd24gdG8gbW9uaXRvciBzcGVjaWZpYyBjb2RlLiAgKi8KKworc3RhdGljIHZvaWQKK3BhcnNlX3JlZ2lzdGVyX2R1bXAgKGJ1ZiwgbGVuKQorICAgICBjaGFyICpidWY7CisgICAgIGludCBsZW47Cit7CisgIFJERUJVRygoIk1PTiBQYXJzaW5nICByZWdpc3RlciBkdW1wXG4iKSkgCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGludCByZWduYW1lbGVuLCB2YWxsZW47CisgICAgICBjaGFyICpyZWduYW1lLCAqdmFsOworICAgICAgLyogRWxlbWVudCAwIHBvaW50cyB0byBzdGFydCBvZiByZWdpc3RlciBuYW1lLCBhbmQgZWxlbWVudCAxCisJIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lzdGVyIHZhbHVlLiAgKi8KKyAgICAgIHN0cnVjdCByZV9yZWdpc3RlcnMgcmVnaXN0ZXJfc3RyaW5nczsKKworICAgICAgbWVtc2V0ICgmcmVnaXN0ZXJfc3RyaW5ncywgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVfcmVnaXN0ZXJzKSk7CisKKyAgICAgIGlmIChyZV9zZWFyY2ggKCZyZWdpc3Rlcl9wYXR0ZXJuLCBidWYsIGxlbiwgMCwgbGVuLAorCQkgICAgICZyZWdpc3Rlcl9zdHJpbmdzKSA9PSAtMSkKKwlicmVhazsKKworICAgICAgcmVnbmFtZWxlbiA9IHJlZ2lzdGVyX3N0cmluZ3MuZW5kWzFdIC0gcmVnaXN0ZXJfc3RyaW5ncy5zdGFydFsxXTsKKyAgICAgIHJlZ25hbWUgPSBidWYgKyByZWdpc3Rlcl9zdHJpbmdzLnN0YXJ0WzFdOworICAgICAgdmFsbGVuID0gcmVnaXN0ZXJfc3RyaW5ncy5lbmRbMl0gLSByZWdpc3Rlcl9zdHJpbmdzLnN0YXJ0WzJdOworICAgICAgdmFsID0gYnVmICsgcmVnaXN0ZXJfc3RyaW5ncy5zdGFydFsyXTsKKworICAgICAgY3VycmVudF9tb25pdG9yLT5zdXBwbHlfcmVnaXN0ZXIgKHJlZ25hbWUsIHJlZ25hbWVsZW4sIHZhbCwgdmFsbGVuKTsKKworICAgICAgYnVmICs9IHJlZ2lzdGVyX3N0cmluZ3MuZW5kWzBdOworICAgICAgbGVuIC09IHJlZ2lzdGVyX3N0cmluZ3MuZW5kWzBdOworICAgIH0KK30KKworLyogU2VuZCBeQyB0byB0YXJnZXQgdG8gaGFsdCBpdC4gIFRhcmdldCB3aWxsIHJlc3BvbmQsIGFuZCBzZW5kIHVzIGEKKyAgIHBhY2tldC4gICovCisKK3N0YXRpYyB2b2lkCittb25pdG9yX2ludGVycnVwdCAoc2lnbm8pCisgICAgIGludCBzaWdubzsKK3sKKyAgLyogSWYgdGhpcyBkb2Vzbid0IHdvcmssIHRyeSBtb3JlIHNldmVyZSBzdGVwcy4gICovCisgIHNpZ25hbCAoc2lnbm8sIG1vbml0b3JfaW50ZXJydXB0X3R3aWNlKTsKKyAgCisgIGlmIChyZW1vdGVfZGVidWcpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJtb25pdG9yX2ludGVycnVwdCBjYWxsZWRcbiIpOworCisgIHRhcmdldF9zdG9wICgpOworfQorCisvKiBUaGUgdXNlciB0eXBlZCBeQyB0d2ljZS4gICovCisKK3N0YXRpYyB2b2lkCittb25pdG9yX2ludGVycnVwdF90d2ljZSAoc2lnbm8pCisgICAgIGludCBzaWdubzsKK3sKKyAgc2lnbmFsIChzaWdubywgb2Z1bmMpOworICAKKyAgbW9uaXRvcl9pbnRlcnJ1cHRfcXVlcnkgKCk7CisKKyAgc2lnbmFsIChzaWdubywgbW9uaXRvcl9pbnRlcnJ1cHQpOworfQorCisvKiBBc2sgdGhlIHVzZXIgd2hhdCB0byBkbyB3aGVuIGFuIGludGVycnVwdCBpcyByZWNlaXZlZC4gICovCisKK3N0YXRpYyB2b2lkCittb25pdG9yX2ludGVycnVwdF9xdWVyeSAoKQoreworICB0YXJnZXRfdGVybWluYWxfb3VycyAoKTsKKworICBpZiAocXVlcnkgKCJJbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgcHJvZ3JhbS5cblwKK0dpdmUgdXAgKGFuZCBzdG9wIGRlYnVnZ2luZyBpdCk/ICIpKQorICAgIHsKKyAgICAgIHRhcmdldF9tb3Vybl9pbmZlcmlvciAoKTsKKyAgICAgIHJldHVybl90b190b3BfbGV2ZWwgKFJFVFVSTl9RVUlUKTsKKyAgICB9CisKKyAgdGFyZ2V0X3Rlcm1pbmFsX2luZmVyaW9yICgpOworfQorCitzdGF0aWMgdm9pZAorbW9uaXRvcl93YWl0X2NsZWFudXAgKG9sZF90aW1lb3V0KQorICAgICB2b2lkICpvbGRfdGltZW91dDsKK3sKKyAgdGltZW91dCA9ICooaW50KilvbGRfdGltZW91dDsKKyAgc2lnbmFsIChTSUdJTlQsIG9mdW5jKTsKKyAgaW5fbW9uaXRvcl93YWl0ID0gMDsKK30KKworCisKK3ZvaWQgbW9uaXRvcl93YWl0X2ZpbHRlcihjaGFyICogYnVmLAorCQkJIGludCBidWZtYXgsCisJCQkgaW50ICogZXh0X3Jlc3BfbGVuLCAKKwkJCSBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKiBzdGF0dXMKKwkJCSApCit7CisgIGludCByZXNwX2xlbiA7CisgIGRvCisgICAgeworICAgICAgcmVzcF9sZW4gPSBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKGJ1ZiwgYnVmbWF4KTsKKyAgICAgICogZXh0X3Jlc3BfbGVuID1yZXNwX2xlbiA7CisKKyAgICAgIGlmIChyZXNwX2xlbiA8PSAwKQorCWZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIm1vbml0b3Jfd2FpdDogIGV4Y2Vzc2l2ZSByZXNwb25zZSBmcm9tIG1vbml0b3I6ICVzLiIsIGJ1Zik7CisgICAgfQorICB3aGlsZSAocmVzcF9sZW4gPCAwKTsKKworICAvKiBQcmludCBhbnkgb3V0cHV0IGNoYXJhY3RlcnMgdGhhdCB3ZXJlIHByZWNlZGVkIGJ5IF5PLiAgKi8KKyAgLyogRklYTUUgLSBUaGlzIHdvdWxkIGJlIGdyZWF0IGFzIGEgdXNlciBzZXR0YWJnbGUgZmxhZyAqLworICBpZiAocmVtb3RlX2RlYnVnIHx8CisgICAgICBjdXJyZW50X21vbml0b3ItPmZsYWdzICYgTU9fUFJJTlRfUFJPR1JBTV9PVVRQVVQpCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCByZXNwX2xlbiAtIDE7IGkrKykKKwlpZiAoYnVmW2ldID09IDB4MGYpCisJICBwdXRjaGFyX3VuZmlsdGVyZWQgKGJ1ZlsrK2ldKTsKKyAgICB9Cit9CisKKworCisvKiBXYWl0IHVudGlsIHRoZSByZW1vdGUgbWFjaGluZSBzdG9wcywgdGhlbiByZXR1cm4sIHN0b3Jpbmcgc3RhdHVzIGluCisgICBzdGF0dXMganVzdCBhcyBgd2FpdCcgd291bGQuICAqLworCitzdGF0aWMgaW50Cittb25pdG9yX3dhaXQgKHBpZCwgc3RhdHVzKQorICAgICBpbnQgcGlkOworICAgICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0YXR1czsKK3sKKyAgaW50IG9sZF90aW1lb3V0ID0gdGltZW91dDsKKyAgY2hhciBidWZbMTAyNF07CisgIGludCByZXNwX2xlbjsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKworICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVEOworICBzdGF0dXMtPnZhbHVlLmludGVnZXIgPSAwOworCisgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAobW9uaXRvcl93YWl0X2NsZWFudXAsICZvbGRfdGltZW91dCk7CisgIFJERUJVRygoIk1PTiB3YWl0XG4iKSkKKworI2lmIDAgLyogTUFJTlRFTkFOQ0VfQ01EUyAqLworICAgIC8qIFRoaXMgaXMgc29tdGhpbmcgb3RoZXIgdGhhbiBhIG1haW50ZW5hbmNlIGNvbW1hbmQgKi8KKyAgaW5fbW9uaXRvcl93YWl0ID0gMTsKKyAgdGltZW91dCA9IHdhdGNoZG9nID4gMCA/IHdhdGNoZG9nIDogLTE7CisjZWxzZQorICB0aW1lb3V0ID0gLTE7CQkvKiBEb24ndCB0aW1lIG91dCAtLSB1c2VyIHByb2dyYW0gaXMgcnVubmluZy4gKi8KKyNlbmRpZgorCisgIG9mdW5jID0gKHZvaWQgKCopKCkpIHNpZ25hbCAoU0lHSU5ULCBtb25pdG9yX2ludGVycnVwdCk7CisKKyAgaWYgKGN1cnJlbnRfbW9uaXRvci0+d2FpdF9maWx0ZXIpCisgICAgKCpjdXJyZW50X21vbml0b3ItPndhaXRfZmlsdGVyKShidWYsc2l6ZW9mIChidWYpLCZyZXNwX2xlbixzdGF0dXMpIDsKKyAgZWxzZSAgICAgICAgICBtb25pdG9yX3dhaXRfZmlsdGVyKGJ1ZixzaXplb2YgKGJ1ZiksJnJlc3BfbGVuLHN0YXR1cykgOworICAgICAgCisjaWYgMCAvKiBUcmFuc2ZlcnJlZCB0byBtb25pdG9yIHdhaXQgZmlsdGVyICovCisgIGRvCisgICAgeworICAgICAgcmVzcF9sZW4gPSBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKGJ1Ziwgc2l6ZW9mIChidWYpKTsKKworICAgICAgaWYgKHJlc3BfbGVuIDw9IDApCisJZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAibW9uaXRvcl93YWl0OiAgZXhjZXNzaXZlIHJlc3BvbnNlIGZyb20gbW9uaXRvcjogJXMuIiwgYnVmKTsKKyAgICB9CisgIHdoaWxlIChyZXNwX2xlbiA8IDApOworCisgIC8qIFByaW50IGFueSBvdXRwdXQgY2hhcmFjdGVycyB0aGF0IHdlcmUgcHJlY2VkZWQgYnkgXk8uICAqLworICAvKiBGSVhNRSAtIFRoaXMgd291bGQgYmUgZ3JlYXQgYXMgYSB1c2VyIHNldHRhYmdsZSBmbGFnICovCisgIGlmIChyZW1vdGVfZGVidWcgfHwKKyAgICAgIGN1cnJlbnRfbW9uaXRvci0+ZmxhZ3MgJiBNT19QUklOVF9QUk9HUkFNX09VVFBVVCkKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IHJlc3BfbGVuIC0gMTsgaSsrKQorCWlmIChidWZbaV0gPT0gMHgwZikKKwkgIHB1dGNoYXJfdW5maWx0ZXJlZCAoYnVmWysraV0pOworICAgIH0KKyNlbmRpZiAgCisKKyAgc2lnbmFsIChTSUdJTlQsIG9mdW5jKTsKKworICB0aW1lb3V0ID0gb2xkX3RpbWVvdXQ7CisjaWYgMAorICBpZiAoZHVtcF9yZWdfZmxhZyAmJiBjdXJyZW50X21vbml0b3ItPmR1bXBfcmVnaXN0ZXJzKQorICAgIHsKKyAgICAgIGR1bXBfcmVnX2ZsYWcgPSAwOworICAgICAgbW9uaXRvcl9wcmludGYgKGN1cnJlbnRfbW9uaXRvci0+ZHVtcF9yZWdpc3RlcnMpOworICAgICAgcmVzcF9sZW4gPSBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKGJ1Ziwgc2l6ZW9mIChidWYpKTsKKyAgICB9CisKKyAgaWYgKGN1cnJlbnRfbW9uaXRvci0+cmVnaXN0ZXJfcGF0dGVybikKKyAgICBwYXJzZV9yZWdpc3Rlcl9kdW1wIChidWYsIHJlc3BfbGVuKTsKKyNlbHNlCisgIFJERUJVRygoIldhaXQgZmV0Y2hpbmcgcmVnaXN0ZXJzIGFmdGVyIHN0b3BcbiIpKSA7CisgIG1vbml0b3JfZHVtcF9yZWdzKCkgOworI2VuZGlmICAKKworICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKyAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1RSQVA7CisKKyAgZGlzY2FyZF9jbGVhbnVwcyAob2xkX2NoYWluKTsKKworICBpbl9tb25pdG9yX3dhaXQgPSAwOworCisgIHJldHVybiBpbmZlcmlvcl9waWQ7Cit9CisKKy8qIEZldGNoIHJlZ2lzdGVyIFJFR05PLCBvciBhbGwgcmVnaXN0ZXJzIGlmIFJFR05PIGlzIC0xLiBSZXR1cm5zCisgICBlcnJubyB2YWx1ZS4gICovCisKK3N0YXRpYyB2b2lkCittb25pdG9yX2ZldGNoX3JlZ2lzdGVyIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBjaGFyICpuYW1lOworICBzdGF0aWMgY2hhciB6ZXJvYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV0gPSB7MH07CisgIGNoYXIgcmVnYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRSAqIDIgKyAxXTsKKyAgaW50IGk7CisKKyAgbmFtZSA9IGN1cnJlbnRfbW9uaXRvci0+cmVnbmFtZXNbcmVnbm9dOworICBSREVCVUcoKCJNT04gZmV0Y2hyZWcgJWQgJyVzJ1xuIixyZWdubyxuYW1lKSkgCisKKyAgaWYgKCFuYW1lIHx8ICgqbmFtZSA9PSAnXDAnKSkKKyAgICB7IFJERUJVRygoIk5vIHJlZ2lzdGVyIGtub3duIGZvciAlZFxuIixyZWdubykpCisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCB6ZXJvYnVmKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogc2VuZCB0aGUgcmVnaXN0ZXIgZXhhbWluZSBjb21tYW5kICovCisKKyAgbW9uaXRvcl9wcmludGYgKGN1cnJlbnRfbW9uaXRvci0+Z2V0cmVnLmNtZCwgbmFtZSk7CisKKyAgLyogSWYgUkVTUF9ERUxJTSBpcyBzcGVjaWZpZWQsIHdlIHNlYXJjaCBmb3IgdGhhdCBhcyBhIGxlYWRpbmcKKyAgICAgZGVsaW1pdGVyIGZvciB0aGUgcmVnaXN0ZXIgdmFsdWUuICBPdGhlcndpc2UsIHdlIGp1c3Qgc3RhcnQKKyAgICAgc2VhcmNoaW5nIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBidWYuICAqLworCisgIGlmIChjdXJyZW50X21vbml0b3ItPmdldHJlZy5yZXNwX2RlbGltKQorICAgIHsKKyAgICAgIFJERUJVRygoIkVYUCBnZXRyZWcucmVzcF9kZWxpbVxuIikpIAorICAgICAgbW9uaXRvcl9leHBlY3QgKGN1cnJlbnRfbW9uaXRvci0+Z2V0cmVnLnJlc3BfZGVsaW0sIE5VTEwsIDApOworICAgICAgLyogSGFuZGxlIGNhc2Ugb2YgZmlyc3QgMzIgcmVnaXN0ZXJzIGxpc3RlZCBpbiBwYWlycy4gICovCisgICAgICBpZiAoY3VycmVudF9tb25pdG9yLT5mbGFncyAmIE1PXzMyX1JFR1NfUEFJUkVECisJICAmJiByZWdubyAmIDEgPT0gMSAmJiByZWdubyA8IDMyKQorCXsgUkRFQlVHKCgiRVhQIGdldHJlZy5yZXNwX2RlbGltXG4iKSkgOworCSAgbW9uaXRvcl9leHBlY3QgKGN1cnJlbnRfbW9uaXRvci0+Z2V0cmVnLnJlc3BfZGVsaW0sIE5VTEwsIDApOworCX0KKyAgICB9CisKKyAgLyogU2tpcCBsZWFkaW5nIHNwYWNlcyBhbmQgIjB4IiBpZiBNT19IRVhfUFJFRklYIGZsYWcgaXMgc2V0ICovCisgIGlmIChjdXJyZW50X21vbml0b3ItPmZsYWdzICYgTU9fSEVYX1BSRUZJWCkgCisgICAgeworICAgICAgaW50IGM7CisgICAgICBjID0gcmVhZGNoYXIgKHRpbWVvdXQpOworICAgICAgd2hpbGUgKGMgPT0gJyAnKQorCWMgPSByZWFkY2hhciAodGltZW91dCk7CisgICAgICBpZiAoKGMgPT0gJzAnKSAmJiAoKGMgPSByZWFkY2hhciAodGltZW91dCkpID09ICd4JykpCisJOworICAgICAgZWxzZQorCSAgZXJyb3IgKCJCYWQgdmFsdWUgcmV0dXJuZWQgZnJvbSBtb25pdG9yIHdoaWxlIGZldGNoaW5nIHJlZ2lzdGVyICV4LiIsCisJCSByZWdubyk7CisgICAgfQorCisgIC8qIFJlYWQgdXB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgaGV4IGRpZ2l0cyBmb3IgdGhpcyByZWdpc3Rlciwgc2tpcHBpbmcKKyAgICAgc3BhY2VzLCBidXQgc3RvcCByZWFkaW5nIGlmIHNvbWV0aGluZyBlbHNlIGlzIHNlZW4uICBTb21lIG1vbml0b3JzCisgICAgIGxpa2UgdG8gZHJvcCBsZWFkaW5nIHplcm9zLiAgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ25vKSAqIDI7IGkrKykKKyAgICB7CisgICAgICBpbnQgYzsKKyAgICAgIGMgPSByZWFkY2hhciAodGltZW91dCk7CisgICAgICB3aGlsZSAoYyA9PSAnICcpCisJYyA9IHJlYWRjaGFyICh0aW1lb3V0KTsKKworICAgICAgaWYgKCFpc3hkaWdpdCAoYykpCisJYnJlYWs7CisKKyAgICAgIHJlZ2J1ZltpXSA9IGM7CisgICAgfQorCisgIHJlZ2J1ZltpXSA9ICdcMDAwJzsJCS8qIHRlcm1pbmF0ZSB0aGUgbnVtYmVyICovCisgIFJERUJVRygoIlJFR1ZBTCAnJXMnXG4iLHJlZ2J1ZikpIDsKKworICAvKiBJZiBURVJNIGlzIHByZXNlbnQsIHdlIHdhaXQgZm9yIHRoYXQgdG8gc2hvdyB1cC4gIEFsc28sIChpZiBURVJNCisgICAgIGlzIHByZXNlbnQpLCB3ZSB3aWxsIHNlbmQgVEVSTV9DTUQgaWYgdGhhdCBpcyBwcmVzZW50LiAgSW4gYW55CisgICAgIGNhc2UsIHdlIGNvbGxlY3QgYWxsIG9mIHRoZSBvdXRwdXQgaW50byBidWYsIGFuZCB0aGVuIHdhaXQgZm9yCisgICAgIHRoZSBub3JtYWwgcHJvbXB0LiAgKi8KKworICBpZiAoY3VycmVudF9tb25pdG9yLT5nZXRyZWcudGVybSkKKyAgICB7CisgICAgICBSREVCVUcoKCJFWFAgZ2V0cmVnLnRlcm1cbiIpKQorICAgICAgbW9uaXRvcl9leHBlY3QgKGN1cnJlbnRfbW9uaXRvci0+Z2V0cmVnLnRlcm0sIE5VTEwsIDApOyAvKiBnZXQgcmVzcG9uc2UgKi8KKyAgICB9CisKKyAgaWYgKGN1cnJlbnRfbW9uaXRvci0+Z2V0cmVnLnRlcm1fY21kKQorICAgIHsgUkRFQlVHKCgiRU1JVCBnZXRyZWcudGVybS5jbWRcbiIpKQorCW1vbml0b3JfcHJpbnRmIChjdXJyZW50X21vbml0b3ItPmdldHJlZy50ZXJtX2NtZCk7CisgICAgfQorICBpZiAoISBjdXJyZW50X21vbml0b3ItPmdldHJlZy50ZXJtIHx8ICAgIC8qIEFscmVhZHkgZXhwZWN0ZWQgb3IgKi8KKyAgICAgIGN1cnJlbnRfbW9uaXRvci0+Z2V0cmVnLnRlcm1fY21kKSAgICAvKiBhY2sgZXhwZWN0ZWQgKi8KKyAgICBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKE5VTEwsIDApOyAvKiBnZXQgcmVzcG9uc2UgKi8KKworICBtb25pdG9yX3N1cHBseV9yZWdpc3RlciAocmVnbm8sIHJlZ2J1Zik7Cit9CisKKy8qIFNvbWV0aW1lcywgaXQgdGFrZXMgc2V2ZXJhbCBjb21tYW5kcyB0byBkdW1wIHRoZSByZWdpc3RlcnMgKi8KKy8qIFRoaXMgaXMgYSBwcmltaXRpdmUgZm9yIHVzZSBieSB2YXJpYXRpb25zIG9mIG1vbml0b3IgaW50ZXJmYWNlcyBpbgorICAgY2FzZSB0aGV5IG5lZWQgdG8gY29tcG9zZSB0aGUgb3BlcmF0aW9uLgorICAgKi8KK2ludCBtb25pdG9yX2R1bXBfcmVnX2Jsb2NrKGNoYXIgKiBibG9ja19jbWQpCit7CisgIGNoYXIgYnVmWzEwMjRdOworICBpbnQgcmVzcF9sZW47CisgIG1vbml0b3JfcHJpbnRmIChibG9ja19jbWQpOworICByZXNwX2xlbiA9IG1vbml0b3JfZXhwZWN0X3Byb21wdCAoYnVmLCBzaXplb2YgKGJ1ZikpOworICBwYXJzZV9yZWdpc3Rlcl9kdW1wIChidWYsIHJlc3BfbGVuKTsKKyAgcmV0dXJuIDEgOworfQorCisKKy8qIFJlYWQgdGhlIHJlbW90ZSByZWdpc3RlcnMgaW50byB0aGUgYmxvY2sgcmVncy4gICovCisvKiBDYWxsIHRoZSBzcGVjaWZpYyBmdW5jdGlvbiBpZiBpdCBoYXMgYmVlbiBwcm92aWRlZCAqLworCitzdGF0aWMgdm9pZAorbW9uaXRvcl9kdW1wX3JlZ3MgKCkKK3sKKyAgY2hhciBidWZbMTAyNF07CisgIGludCByZXNwX2xlbjsKKyAgaWYgKGN1cnJlbnRfbW9uaXRvci0+ZHVtcHJlZ3MpCisgICAgICgqKGN1cnJlbnRfbW9uaXRvci0+ZHVtcHJlZ3MpKSgpIDsgLyogY2FsbCBzdXBwbGllZCBmdW5jdGlvbiAqLworICBlbHNlCisgICAgaWYgKGN1cnJlbnRfbW9uaXRvci0+ZHVtcF9yZWdpc3RlcnMpIC8qIGRlZmF1bHQgdmVyc2lvbiAqLworICAgIHsgbW9uaXRvcl9wcmludGYgKGN1cnJlbnRfbW9uaXRvci0+ZHVtcF9yZWdpc3RlcnMpOworICAgICAgcmVzcF9sZW4gPSBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKGJ1Ziwgc2l6ZW9mIChidWYpKTsKKyAgICAgIHBhcnNlX3JlZ2lzdGVyX2R1bXAgKGJ1ZiwgcmVzcF9sZW4pOworICAgIH0KKyAgZWxzZQorICAgIGFib3J0KCk7IC8qIE5lZWQgc29tZSB3YXkgdG8gcmVhZCByZWdpc3RlcnMgKi8KK30KKworc3RhdGljIHZvaWQKK21vbml0b3JfZmV0Y2hfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBSREVCVUcoKCJNT04gZmV0Y2hyZWdzXG4iKSkgOworICBpZiAoY3VycmVudF9tb25pdG9yLT5nZXRyZWcuY21kKSAKKyAgICB7CisgICAgICBpZiAocmVnbm8gPj0gMCkKKwl7CisJICBtb25pdG9yX2ZldGNoX3JlZ2lzdGVyIChyZWdubyk7CisJICByZXR1cm47CisJfQorCisgICAgICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCBOVU1fUkVHUzsgcmVnbm8rKykKKwltb25pdG9yX2ZldGNoX3JlZ2lzdGVyIChyZWdubyk7CisgICAgfQorICBlbHNlIHsKKyAgICBtb25pdG9yX2R1bXBfcmVncyAoKTsKKyAgfQorfQorCisvKiBTdG9yZSByZWdpc3RlciBSRUdOTywgb3IgYWxsIGlmIFJFR05PID09IDAuICBSZXR1cm4gZXJybm8gdmFsdWUuICAqLworCitzdGF0aWMgdm9pZAorbW9uaXRvcl9zdG9yZV9yZWdpc3RlciAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgY2hhciAqbmFtZTsKKyAgdW5zaWduZWQgaW50IHZhbDsKKworICBuYW1lID0gY3VycmVudF9tb25pdG9yLT5yZWduYW1lc1tyZWdub107CisgIGlmICghbmFtZSB8fCAoKm5hbWUgPT0gJ1wwJykpCisgICAgeyBSREVCVUcoKCJNT04gQ2Fubm90IHN0b3JlIHVua25vd24gcmVnaXN0ZXJcbiIpKQorICAgICAgcmV0dXJuOworICAgIH0KKworICB2YWwgPSByZWFkX3JlZ2lzdGVyIChyZWdubyk7CisgIFJERUJVRygoIk1PTiBzdG9yZWcgJWQgJTA4eFxuIixyZWdubywodW5zaWduZWQgaW50KXZhbCkpCisKKyAgLyogc2VuZCB0aGUgcmVnaXN0ZXIgZGVwb3NpdCBjb21tYW5kICovCisKKyAgaWYgKGN1cnJlbnRfbW9uaXRvci0+ZmxhZ3MgJiBNT19SRUdJU1RFUl9WQUxVRV9GSVJTVCkKKyAgICBtb25pdG9yX3ByaW50ZiAoY3VycmVudF9tb25pdG9yLT5zZXRyZWcuY21kLCB2YWwsIG5hbWUpOworICBlbHNlIGlmIChjdXJyZW50X21vbml0b3ItPmZsYWdzICYgTU9fU0VUUkVHX0lOVEVSQUNUSVZFKQorICAgIG1vbml0b3JfcHJpbnRmIChjdXJyZW50X21vbml0b3ItPnNldHJlZy5jbWQsIG5hbWUpOworICBlbHNlCisgICAgbW9uaXRvcl9wcmludGYgKGN1cnJlbnRfbW9uaXRvci0+c2V0cmVnLmNtZCwgbmFtZSwgdmFsKTsKKworICBpZiAoY3VycmVudF9tb25pdG9yLT5zZXRyZWcudGVybSkKKyAgICB7IFJERUJVRygoIkVYUCBzZXRyZWcudGVybVxuIikpCisgICAgICBtb25pdG9yX2V4cGVjdCAoY3VycmVudF9tb25pdG9yLT5zZXRyZWcudGVybSwgTlVMTCwgMCk7CisgICAgICBpZiAoY3VycmVudF9tb25pdG9yLT5mbGFncyAmIE1PX1NFVFJFR19JTlRFUkFDVElWRSkKKwltb25pdG9yX3ByaW50ZiAoIiV4XHIiLCB2YWwpOworICAgICAgbW9uaXRvcl9leHBlY3RfcHJvbXB0IChOVUxMLCAwKTsKKyAgICB9CisgIGVsc2UKKyAgICBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKE5VTEwsIDApOworICBpZiAoY3VycmVudF9tb25pdG9yLT5zZXRyZWcudGVybV9jbWQpIC8qIE1vZGUgZXhpdCByZXF1aXJlZCAqLworICAgIHsgUkRFQlVHKCgiRVhQIHNldHJlZ190ZXJtY21kXG4iKSkgOworICAgICAgbW9uaXRvcl9wcmludGYoIiVzIixjdXJyZW50X21vbml0b3ItPnNldHJlZy50ZXJtX2NtZCkgOworICAgICAgbW9uaXRvcl9leHBlY3RfcHJvbXB0KE5VTEwsMCkgOworICAgIH0KK30gLyogbW9uaXRvcl9zdG9yZV9yZWdpc3RlciAqLworCisvKiBTdG9yZSB0aGUgcmVtb3RlIHJlZ2lzdGVycy4gICovCisKK3N0YXRpYyB2b2lkCittb25pdG9yX3N0b3JlX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgaWYgKHJlZ25vID49IDApCisgICAgeworICAgICAgbW9uaXRvcl9zdG9yZV9yZWdpc3RlciAocmVnbm8pOworICAgICAgcmV0dXJuOworICAgIH0KKworICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCBOVU1fUkVHUzsgcmVnbm8rKykKKyAgICBtb25pdG9yX3N0b3JlX3JlZ2lzdGVyIChyZWdubyk7Cit9CisKKy8qIEdldCByZWFkeSB0byBtb2RpZnkgdGhlIHJlZ2lzdGVycyBhcnJheS4gIE9uIG1hY2hpbmVzIHdoaWNoIHN0b3JlCisgICBpbmRpdmlkdWFsIHJlZ2lzdGVycywgdGhpcyBkb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuICBPbiBtYWNoaW5lcworICAgd2hpY2ggc3RvcmUgYWxsIHRoZSByZWdpc3RlcnMgaW4gb25lIGZlbGwgc3dvb3AsIHRoaXMgbWFrZXMgc3VyZQorICAgdGhhdCByZWdpc3RlcnMgY29udGFpbnMgYWxsIHRoZSByZWdpc3RlcnMgZnJvbSB0aGUgcHJvZ3JhbSBiZWluZworICAgZGVidWdnZWQuICAqLworCitzdGF0aWMgdm9pZAorbW9uaXRvcl9wcmVwYXJlX3RvX3N0b3JlICgpCit7CisgIC8qIERvIG5vdGhpbmcsIHNpbmNlIHdlIGNhbiBzdG9yZSBpbmRpdmlkdWFsIHJlZ3MgKi8KK30KKworc3RhdGljIHZvaWQKK21vbml0b3JfZmlsZXNfaW5mbyAob3BzKQorICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqb3BzOworeworICBwcmludGZfdW5maWx0ZXJlZCAoIlx0QXR0YWNoZWQgdG8gJXMgYXQgJWQgYmF1ZC5cbiIsIGRldl9uYW1lLCBiYXVkX3JhdGUpOworfQorCitzdGF0aWMgaW50Cittb25pdG9yX3dyaXRlX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47Cit7CisgIHVuc2lnbmVkIGludCB2YWwsIGhvc3R2YWwgOworICBjaGFyICpjbWQ7CisgIGludCBpOworCisgIFJERUJVRygoIk1PTiB3cml0ZSAlZCAlMDh4XG4iLGxlbiwodW5zaWduZWQgbG9uZyltZW1hZGRyKSkKKworICBpZiAoY3VycmVudF9tb25pdG9yLT5mbGFncyAmIE1PX0FERFJfQklUU19SRU1PVkUpCisgICAgbWVtYWRkciA9IEFERFJfQklUU19SRU1PVkUgKG1lbWFkZHIpOworCisgIC8qIFVzZSBtZW1vcnkgZmlsbCBjb21tYW5kIGZvciBsZWFkaW5nIDAgYnl0ZXMuICAqLworCisgIGlmIChjdXJyZW50X21vbml0b3ItPmZpbGwpCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCWlmIChteWFkZHJbaV0gIT0gMCkKKwkgIGJyZWFrOworCisgICAgICBpZiAoaSA+IDQpCQkvKiBNb3JlIHRoYW4gNCB6ZXJvcyBpcyB3b3J0aCBkb2luZyAqLworCXsKKwkgIFJERUJVRygoIk1PTiBGSUxMICVkXG4iLGkpKQorCSAgICBpZiAoY3VycmVudF9tb25pdG9yLT5mbGFncyAmIE1PX0ZJTExfVVNFU19BRERSKQorCSAgICAgIG1vbml0b3JfcHJpbnRmIChjdXJyZW50X21vbml0b3ItPmZpbGwsIG1lbWFkZHIsIChtZW1hZGRyICsgaSktMSwgMCk7CisJICAgIGVsc2UKKwkgICAgICBtb25pdG9yX3ByaW50ZiAoY3VycmVudF9tb25pdG9yLT5maWxsLCBtZW1hZGRyLCBpLCAwKTsKKworCSAgbW9uaXRvcl9leHBlY3RfcHJvbXB0IChOVUxMLCAwKTsKKworCSAgcmV0dXJuIGk7CisJfQorICAgIH0KKworI2lmIDAKKyAgLyogQ2FuJ3QgYWN0dWFsbHkgdXNlIGxvbmcgbG9uZ3MgaWYgVkFMIGlzIGFuIGludCAobmljZSBpZGVhLCB0aG91Z2gpLiAgKi8KKyAgaWYgKChtZW1hZGRyICYgMHg3KSA9PSAwICYmIGxlbiA+PSA4ICYmIGN1cnJlbnRfbW9uaXRvci0+c2V0bWVtLmNtZGxsKQorICAgIHsKKyAgICAgIGxlbiA9IDg7CisgICAgICBjbWQgPSBjdXJyZW50X21vbml0b3ItPnNldG1lbS5jbWRsbDsKKyAgICB9CisgIGVsc2UKKyNlbmRpZgorICBpZiAoKG1lbWFkZHIgJiAweDMpID09IDAgJiYgbGVuID49IDQgJiYgY3VycmVudF9tb25pdG9yLT5zZXRtZW0uY21kbCkKKyAgICB7CisgICAgICBsZW4gPSA0OworICAgICAgY21kID0gY3VycmVudF9tb25pdG9yLT5zZXRtZW0uY21kbDsKKyAgICB9CisgIGVsc2UgaWYgKChtZW1hZGRyICYgMHgxKSA9PSAwICYmIGxlbiA+PSAyICYmIGN1cnJlbnRfbW9uaXRvci0+c2V0bWVtLmNtZHcpCisgICAgeworICAgICAgbGVuID0gMjsKKyAgICAgIGNtZCA9IGN1cnJlbnRfbW9uaXRvci0+c2V0bWVtLmNtZHc7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbGVuID0gMTsKKyAgICAgIGNtZCA9IGN1cnJlbnRfbW9uaXRvci0+c2V0bWVtLmNtZGI7CisgICAgfQorCisgIHZhbCA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAobXlhZGRyLCBsZW4pOworICAKKyAgaWYgKGxlbiA9PSA0KQorICAgIHsgaG9zdHZhbCA9ICogKHVuc2lnbmVkIGludCAqKSBteWFkZHIgOworICAgICAgUkRFQlVHKCgiSG9zdHZhbCglMDh4KSB2YWwoJTA4eClcbiIsaG9zdHZhbCx2YWwpKSA7CisgICAgfQorCisKKyAgaWYgKGN1cnJlbnRfbW9uaXRvci0+ZmxhZ3MgJiBNT19OT19FQ0hPX09OX1NFVE1FTSkKKyAgICBtb25pdG9yX3ByaW50Zl9ub2VjaG8gKGNtZCwgbWVtYWRkciwgdmFsKTsKKyAgZWxzZSBpZiAoY3VycmVudF9tb25pdG9yLT5mbGFncyAmIE1PX1NFVE1FTV9JTlRFUkFDVElWRSkKKyAgICB7CisKKyAgICAgIG1vbml0b3JfcHJpbnRmX25vZWNobyAoY21kLCBtZW1hZGRyKTsKKworICAgICAgaWYgKGN1cnJlbnRfbW9uaXRvci0+c2V0bWVtLnRlcm0pCisJeyBSREVCVUcoKCJFWFAgc2V0bWVtLnRlcm0iKSkgOworCSAgbW9uaXRvcl9leHBlY3QgKGN1cnJlbnRfbW9uaXRvci0+c2V0bWVtLnRlcm0sIE5VTEwsIDApOworCSAgbW9uaXRvcl9wcmludGYgKCIleFxyIiwgdmFsKTsKKwl9CisgICAgICBpZiAoY3VycmVudF9tb25pdG9yLT5zZXRtZW0udGVybV9jbWQpCisJeyAvKiBFbWl0IHRoaXMgdG8gZ2V0IG91dCBvZiB0aGUgbWVtb3J5IGVkaXRpbmcgc3RhdGUgKi8KKwkgIG1vbml0b3JfcHJpbnRmKCIlcyIsY3VycmVudF9tb25pdG9yLT5zZXRtZW0udGVybV9jbWQpIDsKKwkgIC8qIERyb3AgdGhyb3VnaCB0byBleHBlY3RpbmcgYSBwcm9tcHQgKi8KKwl9CisgICAgfQorICBlbHNlCisgICAgbW9uaXRvcl9wcmludGYgKGNtZCwgbWVtYWRkciwgdmFsKTsKKworICBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKE5VTEwsIDApOworCisgIHJldHVybiBsZW47Cit9CisKKworc3RhdGljIGludAorbW9uaXRvcl93cml0ZV9ldmVuX2Jsb2NrKG1lbWFkZHIsbXlhZGRyLGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHIgOworICAgICBjaGFyICogbXlhZGRyIDsKKyAgICAgaW50IGxlbiA7Cit7CisgIHVuc2lnbmVkIGludCB2YWwgOworICBpbnQgd3JpdHRlbiA9IDAgOzsKKyAgLyogRW50ZXIgdGhlIHN1YiBtb2RlICovCisgIG1vbml0b3JfcHJpbnRmKGN1cnJlbnRfbW9uaXRvci0+c2V0bWVtLmNtZGwsbWVtYWRkcikgOworICBtb25pdG9yX2V4cGVjdF9wcm9tcHQoTlVMTCwwKSA7CisgCisgIHdoaWxlIChsZW4pCisgICAgeworICAgICAgdmFsID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyKG15YWRkciw0KSA7IC8qIFJFQUxMWSAqLworICAgICAgbW9uaXRvcl9wcmludGYoIiV4XHIiLHZhbCkgOworICAgICAgbXlhZGRyICs9IDQgOworICAgICAgbWVtYWRkciArPSA0IDsKKyAgICAgIHdyaXR0ZW4gKz0gNCA7CisgICAgICBSREVCVUcoKCIgQCAlMDh4XG4iLG1lbWFkZHIpKQorICAgICAgLyogSWYgd2Ugd2FudGVkIHRvLCBoZXJlIHdlIGNvdWxkIHZhbGlkYXRlIHRoZSBhZGRyZXNzICovCisgICAgICBtb25pdG9yX2V4cGVjdF9wcm9tcHQoTlVMTCwwKSA7CisgICAgfQorICAvKiBOb3cgZXhpdCB0aGUgc3ViIG1vZGUgKi8KKyAgbW9uaXRvcl9wcmludGYgKGN1cnJlbnRfbW9uaXRvci0+Z2V0cmVnLnRlcm1fY21kKTsKKyAgbW9uaXRvcl9leHBlY3RfcHJvbXB0KE5VTEwsMCkgOworICByZXR1cm4gd3JpdHRlbiA7Cit9CisKKworc3RhdGljIGludCBtb25pdG9yX3dyaXRlX21lbW9yeV9ieXRlcyhtZW1hZGRyLG15YWRkcixsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyIDsKKyAgICAgY2hhciAqIG15YWRkciA7CisgICAgIGludCBsZW4gOworeworICB1bnNpZ25lZCBjaGFyIHZhbCA7CisgIGludCB3cml0dGVuID0gMCA7CisgIGlmIChsZW4gPT0gMCkgcmV0dXJuIDAgOworICAvKiBFbnRlciB0aGUgc3ViIG1vZGUgKi8KKyAgbW9uaXRvcl9wcmludGYoY3VycmVudF9tb25pdG9yLT5zZXRtZW0uY21kYixtZW1hZGRyKSA7CisgIG1vbml0b3JfZXhwZWN0X3Byb21wdChOVUxMLDApIDsKKyAgd2hpbGUgKGxlbikKKyAgICB7CisgICAgICB2YWwgPSAqbXlhZGRyIDsKKyAgICAgIG1vbml0b3JfcHJpbnRmKCIleFxyIix2YWwpIDsKKyAgICAgIG15YWRkcisrIDsKKyAgICAgIG1lbWFkZHIrKyA7CisgICAgICB3cml0dGVuKysgOworICAgICAgLyogSWYgd2Ugd2FudGVkIHRvLCBoZXJlIHdlIGNvdWxkIHZhbGlkYXRlIHRoZSBhZGRyZXNzICovCisgICAgICBtb25pdG9yX2V4cGVjdF9wcm9tcHQoTlVMTCwwKSA7CisgICAgICBsZW4tLSA7CisgICAgfQorICAvKiBOb3cgZXhpdCB0aGUgc3ViIG1vZGUgKi8KKyAgbW9uaXRvcl9wcmludGYgKGN1cnJlbnRfbW9uaXRvci0+Z2V0cmVnLnRlcm1fY21kKTsKKyAgbW9uaXRvcl9leHBlY3RfcHJvbXB0KE5VTEwsMCkgOworICByZXR1cm4gd3JpdHRlbiA7Cit9CisKKworc3RhdGljIHZvaWQKK2xvbmdsb25nZW5kc3dhcCAodW5zaWduZWQgY2hhciAqIGEpCit7CisgIGludCBpLGogOworICB1bnNpZ25lZCBjaGFyIHggOworICBpID0gMCA7IGogPSA3IDsKKyAgd2hpbGUgKGkgPCA0KQorICAgIHsgeCA9ICooYStpKSA7CisgICAgICAqKGEraSkgPSAqKGEraikgOworICAgICAgKihhK2opID0geCA7CisgICAgICBpKysgLCBqLS0gOworICAgIH0KK30KKy8qIEZvcm1hdCAzMiBjaGFycyBvZiBsb25nIGxvbmcgdmFsdWUsIGFkdmFuY2UgdGhlIHBvaW50ZXIgKi8KK3N0YXRpYyBjaGFyICogaGV4bGF0ZSA9ICIwMTIzNDU2Nzg5YWJjZGVmIiA7CitzdGF0aWMgY2hhciAqIGxvbmdsb25nX2hleGNoYXJzKHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSwKKwkJCQkgY2hhciAqIG91dGJ1ZmYgKQoreworICBpZiAodmFsdWUgPT0gMCkgeyAqb3V0YnVmZisrID0gJzAnIDsgcmV0dXJuIG91dGJ1ZmYgOyB9CisgIGVsc2UKKyAgICB7IHN0YXRpYyB1bnNpZ25lZCBjaGFyIGRpc2J1Zls4XSA7IC8qIGRpc2Fzc2VtYmx5IGJ1ZmZlciAqLworICAgICAgdW5zaWduZWQgY2hhciAqIHNjYW4gLCAqIGxpbWl0IDsgLyogbG9vcCBjb250cm9scyAqLworICAgICAgdW5zaWduZWQgY2hhciBjICwgbmliIDsKKyAgICAgIGludCBsZWFkemVybyA9IDEgOworICAgICAgc2NhbiA9IGRpc2J1ZiA7IGxpbWl0ID0gc2NhbiArIDggOworICAgICAgeyB1bnNpZ25lZCBsb25nIGxvbmcgKiBkcCA7CisJZHAgPSAodW5zaWduZWQgbG9uZyBsb25nICopIHNjYW4gOworCSpkcCA9IHZhbHVlIDsKKyAgICAgIH0KKyAgICAgIGxvbmdsb25nZW5kc3dhcChkaXNidWYpIDsgLyogRklYTUU6IE9ObHkgb24gYmlnIGVuZGlhbiBob3N0cyAqLworICAgICAgd2hpbGUgKHNjYW4gPCBsaW1pdCkKKwl7IGMgPSAqc2NhbisrIDsgLyogYSBieXRlIG9mIG91ciBsb25nIGxvbmcgdmFsdWUgKi8KKwkgIGlmIChsZWFkemVybykKKwkgICAgaWYgKGMgPT0gMCkgY29udGludWUgOworCSAgICBlbHNlIGxlYWR6ZXJvID0gMCA7IC8qIGhlbmNlZm9ydGggd2UgcHJpbnQgZXZlbiB6ZXJvZXMgKi8KKwkgIG5pYiA9IGMgPj4gNCA7ICAgICAgICAvKiBoaWdoIG5pYmJsZSBiaXRzICovCisJICAqb3V0YnVmZisrID0gaGV4bGF0ZVtuaWJdIDsKKwkgIG5pYiA9IGMgJiAweDBmIDsgICAgICAvKiBsb3cgbmliYmxlIGJpdHMgKi8KKwkgICpvdXRidWZmKysgPSBoZXhsYXRlW25pYl0gOworCX0KKyAgICAgIHJldHVybiBvdXRidWZmIDsKKyAgICB9Cit9IC8qIGxvbmdsb25nX2hleGNoYXJzICovCisKKworCisvKiBJIGFtIG9ubHkgZ29pbmcgdG8gY2FsbCB0aGlzIHdoZW4gd3JpdGluZyB2aXJ0dWFsIGJ5dGUgc3RyZWFtcy4KKyAgIFdoaWNoIHBvc3NhYmx5IGVudGFpbHMgZW5kaWFuIGNvbnZlcnNpb25zCisgICAqLworc3RhdGljIGludCBtb25pdG9yX3dyaXRlX21lbW9yeV9sb25nbG9uZ3MobWVtYWRkcixteWFkZHIsbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkciA7CisgICAgIGNoYXIgKiBteWFkZHIgOworICAgICBpbnQgbGVuIDsKK3sKKyAgc3RhdGljIGNoYXIgaGV4c3RhZ2VbMjBdIDsgLyogQXQgbGVhc3QgMTYgZGlnaXRzIHJlcXVpcmVkLCBwbHVzIG51bGwgKi8KKyAgY2hhciAqIGVuZHN0cmluZyA7CisgIGxvbmcgbG9uZyAqIGxscHRyIDsKKyAgbG9uZyBsb25nIHZhbHVlIDsKKyAgaW50IHdyaXR0ZW4gPSAwIDsKKyAgbGxwdHIgPSAodW5zaWduZWQgbG9uZyBsb25nICopIG15YWRkciA7CisgIGlmIChsZW4gPT0gMCApIHJldHVybiAwIDsKKyAgbW9uaXRvcl9wcmludGYoY3VycmVudF9tb25pdG9yLT5zZXRtZW0uY21kbGwsbWVtYWRkcikgOworICBtb25pdG9yX2V4cGVjdF9wcm9tcHQoTlVMTCwwKSA7CisgIHdoaWxlIChsZW4gPj0gOCApCisgICAgeworICAgICAgdmFsdWUgPSAqbGxwdHIgOworICAgICAgZW5kc3RyaW5nID0gbG9uZ2xvbmdfaGV4Y2hhcnMoKmxscHRyLGhleHN0YWdlKSA7CisgICAgICAqZW5kc3RyaW5nID0gJ1wwJyA7IC8qIE5VbGwgdGVybWluYXRlIGZvciBwcmludGYgKi8KKyAgICAgIG1vbml0b3JfcHJpbnRmKCIlc1xyIixoZXhzdGFnZSkgOworICAgICAgbGxwdHIrKyA7CisgICAgICBtZW1hZGRyICs9IDggOworICAgICAgd3JpdHRlbiArPSA4IDsKKyAgICAgIC8qIElmIHdlIHdhbnRlZCB0bywgaGVyZSB3ZSBjb3VsZCB2YWxpZGF0ZSB0aGUgYWRkcmVzcyAqLworICAgICAgbW9uaXRvcl9leHBlY3RfcHJvbXB0KE5VTEwsMCkgOworICAgICAgbGVuIC09IDggOworICAgIH0KKyAgLyogTm93IGV4aXQgdGhlIHN1YiBtb2RlICovCisgIG1vbml0b3JfcHJpbnRmIChjdXJyZW50X21vbml0b3ItPmdldHJlZy50ZXJtX2NtZCk7CisgIG1vbml0b3JfZXhwZWN0X3Byb21wdChOVUxMLDApIDsKKyAgcmV0dXJuIHdyaXR0ZW4gOworfSAvKiAqLworCisKKworLyogLS0tLS0gTU9OSVRPUl9XUklURV9NRU1PUllfQkxPQ0sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogVGhpcyBpcyBmb3IgdGhlIGxhcmdlIGJsb2NrcyBvZiBtZW1vcnkgd2hpY2ggbWF5IG9jY3VyIGluIGRvd25sb2FkaW5nLgorICAgQW5kIGZvciBtb25pdG9ycyB3aGljaCB1c2UgaW50ZXJhY3RpdmUgZW50cnksCisgICBBbmQgZm9yIG1vbml0b3JzIHdoaWNoIGRvIG5vdCBoYXZlIG90aGVyIGRvd25sb2FkaW5nIG1ldGhvZHMuCisgICBXaXRob3V0IHRoaXMsIHdlIHdpbGwgZW5kIHVwIGNhbGxpbmcgbW9uaXRvcl93cml0ZV9tZW1vcnkgbWFueSB0aW1lcworICAgYW5kIGRvIHRoZSBlbnRyeSBhbmQgZXhpdCBvZiB0aGUgc3ViIG1vZGUgbWFueSB0aW1lcworICAgVGhpcyBjdXJyZW50bHkgYXNzdW1lcy4uLgorICAgICBNT19TRVRNRU1fSU5URVJBQ1RJVkUKKyAgICAgISBNT19OT19FQ0hPX09OX1NFVE1FTQorICAgICBUbyB1c2UgdGhpcywgdGhlIHlvdSBoYXZlIHRvIHBhdGNoIHRoZSBtb25pdG9yX2NtZHMgYmxvY2sgd2l0aAorICAgICB0aGlzIGZ1bmN0aW9uLiBPdGhlcndpc2UsIGl0cyBub3QgdHVuZWQgdXAgZm9yIHVzZSBieSBhbGwKKyAgICAgbW9uaXRvciB2YXJpYXRpb25zLgorICAgKi8KKworc3RhdGljIGludCBtb25pdG9yX3dyaXRlX21lbW9yeV9ibG9jayhtZW1hZGRyLG15YWRkcixsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyIDsKKyAgICAgY2hhciAqIG15YWRkciA7CisgICAgIGludCBsZW4gOworeworICBpbnQgd3JpdHRlbiA7CisgIHdyaXR0ZW4gPSAwIDsKKyAgLyogRklYTUU6IFRoaXMgd291bGQgYmUgYSBnb29kIHBsYWNlIHRvIHB1dCB0aGUgemVybyB0ZXN0ICovCisjaWYgMSAKKyAgaWYgKChsZW4gPiA4KSAmJiAoKChsZW4gJiAweDA3KSkgPT0gMCkgJiYgY3VycmVudF9tb25pdG9yLT5zZXRtZW0uY21kbGwpCisgICAgICAgeworCSByZXR1cm4gbW9uaXRvcl93cml0ZV9tZW1vcnlfbG9uZ2xvbmdzKG1lbWFkZHIsbXlhZGRyLGxlbikgOworICAgICAgIH0KKyNlbmRpZiAgCisjaWYgMCAKKyAgaWYgKGxlbiA+IDQpCisgICAgeworICAgICAgaW50IHN1YmxlbiA7CisgICAgICB3cml0dGVuID0gbW9uaXRvcl93cml0ZV9ldmVuX2Jsb2NrKG1lbWFkZHIsbXlhZGRyLGxlbikgOworICAgICAgLyogQWRqdXN0IGNhbGxpbmcgcGFyYW1ldGVycyBieSB3cml0dGVuIGFtb3VudCAqLworICAgICAgbWVtYWRkciArPSB3cml0dGVuIDsKKyAgICAgIG15YWRkciArPSB3cml0dGVuIDsKKyAgICAgIGxlbiAtPSB3cml0dGVuIDsKKyAgICB9CisjZW5kaWYKKyAgd3JpdHRlbiA9IG1vbml0b3Jfd3JpdGVfbWVtb3J5X2J5dGVzKG1lbWFkZHIsbXlhZGRyLGxlbikgOworICByZXR1cm4gd3JpdHRlbiA7Cit9CisKKy8qIFRoaXMgaXMgYW4gYWx0ZXJuYXRlIGZvcm0gb2YgbW9uaXRvcl9yZWFkX21lbW9yeSB3aGljaCBpcyB1c2VkIGZvciBtb25pdG9ycworICAgd2hpY2ggY2FuIG9ubHkgcmVhZCBhIHNpbmdsZSBieXRlL3dvcmQvZXRjLiBhdCBhIHRpbWUuICAqLworCitzdGF0aWMgaW50Cittb25pdG9yX3JlYWRfbWVtb3J5X3NpbmdsZSAobWVtYWRkciwgbXlhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47Cit7CisgIHVuc2lnbmVkIGludCB2YWw7CisgIGNoYXIgbWVtYnVmW3NpemVvZihpbnQpICogMiArIDFdOworICBjaGFyICpwOworICBjaGFyICpjbWQ7CisgIGludCBpOworCisgIFJERUJVRygoIk1PTiByZWFkIHNpbmdsZVxuIikpIDsKKyNpZiAwCisgIC8qIENhbid0IGFjdHVhbGx5IHVzZSBsb25nIGxvbmdzIChuaWNlIGlkZWEsIHRob3VnaCkuICBJbiBmYWN0LCB0aGUKKyAgICAgY2FsbCB0byBzdHJ0b3VsIGJlbG93IHdpbGwgZmFpbCBpZiBpdCB0cmllcyB0byBjb252ZXJ0IGEgdmFsdWUKKyAgICAgdGhhdCdzIHRvbyBiaWcgdG8gZml0IGluIGEgbG9uZy4gICovCisgIGlmICgobWVtYWRkciAmIDB4NykgPT0gMCAmJiBsZW4gPj0gOCAmJiBjdXJyZW50X21vbml0b3ItPmdldG1lbS5jbWRsbCkKKyAgICB7CisgICAgICBsZW4gPSA4OworICAgICAgY21kID0gY3VycmVudF9tb25pdG9yLT5nZXRtZW0uY21kbGw7CisgICAgfQorICBlbHNlCisjZW5kaWYKKyAgaWYgKChtZW1hZGRyICYgMHgzKSA9PSAwICYmIGxlbiA+PSA0ICYmIGN1cnJlbnRfbW9uaXRvci0+Z2V0bWVtLmNtZGwpCisgICAgeworICAgICAgbGVuID0gNDsKKyAgICAgIGNtZCA9IGN1cnJlbnRfbW9uaXRvci0+Z2V0bWVtLmNtZGw7CisgICAgfQorICBlbHNlIGlmICgobWVtYWRkciAmIDB4MSkgPT0gMCAmJiBsZW4gPj0gMiAmJiBjdXJyZW50X21vbml0b3ItPmdldG1lbS5jbWR3KQorICAgIHsKKyAgICAgIGxlbiA9IDI7CisgICAgICBjbWQgPSBjdXJyZW50X21vbml0b3ItPmdldG1lbS5jbWR3OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxlbiA9IDE7CisgICAgICBjbWQgPSBjdXJyZW50X21vbml0b3ItPmdldG1lbS5jbWRiOworICAgIH0KKworICAvKiBTZW5kIHRoZSBleGFtaW5lIGNvbW1hbmQuICAqLworCisgIG1vbml0b3JfcHJpbnRmIChjbWQsIG1lbWFkZHIpOworCisgIC8qIElmIFJFU1BfREVMSU0gaXMgc3BlY2lmaWVkLCB3ZSBzZWFyY2ggZm9yIHRoYXQgYXMgYSBsZWFkaW5nCisgICAgIGRlbGltaXRlciBmb3IgdGhlIG1lbW9yeSB2YWx1ZS4gIE90aGVyd2lzZSwgd2UganVzdCBzdGFydAorICAgICBzZWFyY2hpbmcgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGJ1Zi4gICovCisKKyAgaWYgKGN1cnJlbnRfbW9uaXRvci0+Z2V0bWVtLnJlc3BfZGVsaW0pCisgICAgeyBSREVCVUcoKCJFWFAgZ2V0bWVtLnJlc3BfZGVsaW1cbiIpKSA7CisgICAgICBtb25pdG9yX2V4cGVjdF9yZWdleHAgKCZnZXRtZW1fcmVzcF9kZWxpbV9wYXR0ZXJuLCBOVUxMLCAwKTsKKyAgICB9CisKKyAgLyogTm93LCByZWFkIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgaGV4IGRpZ2l0cyBmb3IgdGhpcyBsb2MsCisgICAgIHNraXBwaW5nIHNwYWNlcy4gICovCisKKyAgLyogU2tpcCBsZWFkaW5nIHNwYWNlcyBhbmQgIjB4IiBpZiBNT19IRVhfUFJFRklYIGZsYWcgaXMgc2V0LiAqLworICBpZiAoY3VycmVudF9tb25pdG9yLT5mbGFncyAmIE1PX0hFWF9QUkVGSVgpIAorICAgIHsKKyAgICAgIGludCBjOworCisgICAgICBjID0gcmVhZGNoYXIgKHRpbWVvdXQpOworICAgICAgd2hpbGUgKGMgPT0gJyAnKQorCWMgPSByZWFkY2hhciAodGltZW91dCk7CisgICAgICBpZiAoKGMgPT0gJzAnKSAmJiAoKGMgPSByZWFkY2hhciAodGltZW91dCkpID09ICd4JykpCisJOworICAgICAgZWxzZQorCW1vbml0b3JfZXJyb3IgKCJtb25pdG9yX3JlYWRfbWVtb3J5X3NpbmdsZSAoMHgleCk6ICBiYWQgcmVzcG9uc2UgZnJvbSBtb25pdG9yOiAlLipzJWMuIiwKKwkJICAgICAgIG1lbWFkZHIsIGksIG1lbWJ1ZiwgYyk7CisgICAgfQorICBmb3IgKGkgPSAwOyBpIDwgbGVuICogMjsgaSsrKQorICAgIHsKKyAgICAgIGludCBjOworCisgICAgICB3aGlsZSAoMSkKKwl7CisJICBjID0gcmVhZGNoYXIgKHRpbWVvdXQpOworCSAgaWYgKGlzeGRpZ2l0IChjKSkKKwkgICAgYnJlYWs7CisJICBpZiAoYyA9PSAnICcpCisJICAgIGNvbnRpbnVlOworCisJICBtb25pdG9yX2Vycm9yICgibW9uaXRvcl9yZWFkX21lbW9yeV9zaW5nbGUgKDB4JXgpOiAgYmFkIHJlc3BvbnNlIGZyb20gbW9uaXRvcjogJS4qcyVjLiIsCisJCQkgbWVtYWRkciwgaSwgbWVtYnVmLCBjKTsKKwl9CisKKyAgICAgIG1lbWJ1ZltpXSA9IGM7CisgICAgfQorCisgIG1lbWJ1ZltpXSA9ICdcMDAwJzsJCS8qIHRlcm1pbmF0ZSB0aGUgbnVtYmVyICovCisKKy8qIElmIFRFUk0gaXMgcHJlc2VudCwgd2Ugd2FpdCBmb3IgdGhhdCB0byBzaG93IHVwLiAgQWxzbywgKGlmIFRFUk0gaXMKKyAgIHByZXNlbnQpLCB3ZSB3aWxsIHNlbmQgVEVSTV9DTUQgaWYgdGhhdCBpcyBwcmVzZW50LiAgSW4gYW55IGNhc2UsIHdlIGNvbGxlY3QKKyAgIGFsbCBvZiB0aGUgb3V0cHV0IGludG8gYnVmLCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgbm9ybWFsIHByb21wdC4gICovCisKKyAgaWYgKGN1cnJlbnRfbW9uaXRvci0+Z2V0bWVtLnRlcm0pCisgICAgeworICAgICAgbW9uaXRvcl9leHBlY3QgKGN1cnJlbnRfbW9uaXRvci0+Z2V0bWVtLnRlcm0sIE5VTEwsIDApOyAvKiBnZXQgcmVzcG9uc2UgKi8KKworICAgICAgaWYgKGN1cnJlbnRfbW9uaXRvci0+Z2V0bWVtLnRlcm1fY21kKQorCXsKKwkgIG1vbml0b3JfcHJpbnRmIChjdXJyZW50X21vbml0b3ItPmdldG1lbS50ZXJtX2NtZCk7CisJICBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKE5VTEwsIDApOworCX0KKyAgICB9CisgIGVsc2UKKyAgICBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKE5VTEwsIDApOyAvKiBnZXQgcmVzcG9uc2UgKi8KKworICBwID0gbWVtYnVmOworICB2YWwgPSBzdHJ0b3VsIChtZW1idWYsICZwLCAxNik7CisKKyAgaWYgKHZhbCA9PSAwICYmIG1lbWJ1ZiA9PSBwKQorICAgIG1vbml0b3JfZXJyb3IgKCJtb25pdG9yX3JlYWRfbWVtb3J5X3NpbmdsZSAoMHgleCk6ICBiYWQgdmFsdWUgZnJvbSBtb25pdG9yOiAlcy4iLAorCQkgICBtZW1hZGRyLCAwLCBtZW1idWYsIDApOworCisgIC8qIHN1cHBseSByZWdpc3RlciBzdG9yZXMgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIsIHNvIHN3YXAgaGVyZSAqLworCisgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKG15YWRkciwgbGVuLCB2YWwpOworCisgIHJldHVybiBsZW47Cit9CisKKy8qIENvcHkgTEVOIGJ5dGVzIG9mIGRhdGEgZnJvbSBkZWJ1Z2dlciBtZW1vcnkgYXQgTVlBRERSIHRvIGluZmVyaW9yJ3MKKyAgIG1lbW9yeSBhdCBNRU1BRERSLiAgUmV0dXJucyBsZW5ndGggbW92ZWQuICBDdXJyZW50bHksIHdlIGRvIG5vIG1vcmUKKyAgIHRoYW4gMTYgYnl0ZXMgYXQgYSB0aW1lLiAgKi8KKworc3RhdGljIGludAorbW9uaXRvcl9yZWFkX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47Cit7CisgIHVuc2lnbmVkIGludCB2YWw7CisgIGNoYXIgYnVmWzUxMl07CisgIGNoYXIgKnAsICpwMTsKKyAgaW50IHJlc3BfbGVuOworICBpbnQgaTsKKyAgQ09SRV9BRERSIGR1bXBhZGRyOworCisgIGlmIChsZW4gPD0gMCkKKyAgICB7CisgICAgICBSREVCVUcgKCgiWmVybyBsZW5ndGggY2FsbCB0byBtb25pdG9yX3JlYWRfbWVtb3J5XG4iKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKHJlbW90ZV9kZWJ1ZykgcHJpbnRmKCJNT04gcmVhZCBibG9jayB0YSglMDh4KSBoYSglMDh4KSAlZFxuIiwKKwkgICh1bnNpZ25lZCBsb25nKSBtZW1hZGRyICwgKHVuc2lnbmVkIGxvbmcpbXlhZGRyLCBsZW4pOworCisgIGlmIChjdXJyZW50X21vbml0b3ItPmZsYWdzICYgTU9fQUREUl9CSVRTX1JFTU9WRSkKKyAgICBtZW1hZGRyID0gQUREUl9CSVRTX1JFTU9WRSAobWVtYWRkcik7CisKKyAgaWYgKGN1cnJlbnRfbW9uaXRvci0+ZmxhZ3MgJiBNT19HRVRNRU1fUkVBRF9TSU5HTEUpCisgICAgcmV0dXJuIG1vbml0b3JfcmVhZF9tZW1vcnlfc2luZ2xlIChtZW1hZGRyLCBteWFkZHIsIGxlbik7CisKKyAgbGVuID0gbWluIChsZW4sIDE2KTsKKworICAvKiBTb21lIGR1bXBlcnMgYWxpZ24gdGhlIGZpcnN0IGRhdGEgd2l0aCB0aGUgcHJlY2VlZGluZyAxNgorICAgICBieXRlIGJvdW5kYXJ5LiBTb21lIHByaW50IGJsYW5rcyBhbmQgc3RhcnQgYXQgdGhlCisgICAgIHJlcXVlc3RlZCBib3VuZGFyeS4gRVhBQ1RfRFVNUEFERFIKKyAgICAgKi8KKworICBkdW1wYWRkciA9IChjdXJyZW50X21vbml0b3ItPmZsYWdzICYgTU9fRVhBQ1RfRFVNUEFERFIpCisgICAgPyBtZW1hZGRyIDogbWVtYWRkciAmIH4gMHgwZiA7CisKKyAgLyogU2VlIGlmIHhmZXIgd291bGQgY3Jvc3MgYSAxNiBieXRlIGJvdW5kYXJ5LiAgSWYgc28sIGNsaXAgaXQuICAqLworICBpZiAoKChtZW1hZGRyIF4gKG1lbWFkZHIgKyBsZW4gLSAxKSkgJiB+MHhmKSAhPSAwKQorICAgIGxlbiA9ICgobWVtYWRkciArIGxlbikgJiB+MHhmKSAtIG1lbWFkZHI7CisKKyAgLyogc2VuZCB0aGUgbWVtb3J5IGV4YW1pbmUgY29tbWFuZCAqLworCisgIGlmIChjdXJyZW50X21vbml0b3ItPmZsYWdzICYgTU9fR0VUTUVNX05FRURTX1JBTkdFKQorICAgIG1vbml0b3JfcHJpbnRmIChjdXJyZW50X21vbml0b3ItPmdldG1lbS5jbWRiLCBtZW1hZGRyLCBtZW1hZGRyICsgbGVuIC0gMSk7CisgIGVsc2UgaWYgKGN1cnJlbnRfbW9uaXRvci0+ZmxhZ3MgJiBNT19HRVRNRU1fMTZfQk9VTkRBUlkpCisgICAgbW9uaXRvcl9wcmludGYgKGN1cnJlbnRfbW9uaXRvci0+Z2V0bWVtLmNtZGIsIGR1bXBhZGRyKTsKKyAgZWxzZQorICAgIG1vbml0b3JfcHJpbnRmIChjdXJyZW50X21vbml0b3ItPmdldG1lbS5jbWRiLCBtZW1hZGRyLCBsZW4pOworCisgIC8qIElmIFRFUk0gaXMgcHJlc2VudCwgd2Ugd2FpdCBmb3IgdGhhdCB0byBzaG93IHVwLiAgQWxzbywgKGlmIFRFUk0KKyAgICAgaXMgcHJlc2VudCksIHdlIHdpbGwgc2VuZCBURVJNX0NNRCBpZiB0aGF0IGlzIHByZXNlbnQuICBJbiBhbnkKKyAgICAgY2FzZSwgd2UgY29sbGVjdCBhbGwgb2YgdGhlIG91dHB1dCBpbnRvIGJ1ZiwgYW5kIHRoZW4gd2FpdCBmb3IKKyAgICAgdGhlIG5vcm1hbCBwcm9tcHQuICAqLworCisgIGlmIChjdXJyZW50X21vbml0b3ItPmdldG1lbS50ZXJtKQorICAgIHsKKyAgICAgIHJlc3BfbGVuID0gbW9uaXRvcl9leHBlY3QgKGN1cnJlbnRfbW9uaXRvci0+Z2V0bWVtLnRlcm0sIGJ1Ziwgc2l6ZW9mIGJ1Zik7IC8qIGdldCByZXNwb25zZSAqLworCisgICAgICBpZiAocmVzcF9sZW4gPD0gMCkKKwltb25pdG9yX2Vycm9yICgibW9uaXRvcl9yZWFkX21lbW9yeSAoMHgleCk6ICBleGNlc3NpdmUgcmVzcG9uc2UgZnJvbSBtb25pdG9yOiAlLipzLiIsCisJCSAgICAgICBtZW1hZGRyLCByZXNwX2xlbiwgYnVmLCAwKTsKKworICAgICAgaWYgKGN1cnJlbnRfbW9uaXRvci0+Z2V0bWVtLnRlcm1fY21kKQorCXsKKwkgIFNFUklBTF9XUklURSAobW9uaXRvcl9kZXNjLCBjdXJyZW50X21vbml0b3ItPmdldG1lbS50ZXJtX2NtZCwKKwkJCXN0cmxlbiAoY3VycmVudF9tb25pdG9yLT5nZXRtZW0udGVybV9jbWQpKTsKKwkgIG1vbml0b3JfZXhwZWN0X3Byb21wdCAoTlVMTCwgMCk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHJlc3BfbGVuID0gbW9uaXRvcl9leHBlY3RfcHJvbXB0IChidWYsIHNpemVvZiBidWYpOyAvKiBnZXQgcmVzcG9uc2UgKi8KKworICBwID0gYnVmOworCisgIC8qIElmIFJFU1BfREVMSU0gaXMgc3BlY2lmaWVkLCB3ZSBzZWFyY2ggZm9yIHRoYXQgYXMgYSBsZWFkaW5nCisgICAgIGRlbGltaXRlciBmb3IgdGhlIHZhbHVlcy4gIE90aGVyd2lzZSwgd2UganVzdCBzdGFydCBzZWFyY2hpbmcKKyAgICAgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGJ1Zi4gICovCisKKyAgaWYgKGN1cnJlbnRfbW9uaXRvci0+Z2V0bWVtLnJlc3BfZGVsaW0pCisgICAgeworICAgICAgaW50IHJldHZhbCwgdG1wOworICAgICAgc3RydWN0IHJlX3JlZ2lzdGVycyByZXNwX3N0cmluZ3M7CisgICAgICBSREVCVUcoKCJNT04gZ2V0bWVtLnJlc3BfZGVsaW0gJXNcbiIsY3VycmVudF9tb25pdG9yLT5nZXRtZW0ucmVzcF9kZWxpbSkpIDsKKworICAgICAgbWVtc2V0ICgmcmVzcF9zdHJpbmdzLCAwLCBzaXplb2YgKHN0cnVjdCByZV9yZWdpc3RlcnMpKTsKKyAgICAgIHRtcCA9IHN0cmxlbiAocCk7CisgICAgICByZXR2YWwgPSByZV9zZWFyY2ggKCZnZXRtZW1fcmVzcF9kZWxpbV9wYXR0ZXJuLCBwLCB0bXAsIDAsIHRtcCwKKwkJCSAgJnJlc3Bfc3RyaW5ncyk7CisKKyAgICAgIGlmIChyZXR2YWwgPCAwKQorCW1vbml0b3JfZXJyb3IgKCJtb25pdG9yX3JlYWRfbWVtb3J5ICgweCV4KTogIGJhZCByZXNwb25zZSBmcm9tIG1vbml0b3I6ICUuKnMuIiwKKwkJICAgICAgIG1lbWFkZHIsIHJlc3BfbGVuLCBidWYsIDApOworCisgICAgICBwICs9IHJlc3Bfc3RyaW5ncy5lbmRbMF07CisjaWYgMAorICAgICAgcCA9IHN0cnN0ciAocCwgY3VycmVudF9tb25pdG9yLT5nZXRtZW0ucmVzcF9kZWxpbSk7CisgICAgICBpZiAoIXApCisJbW9uaXRvcl9lcnJvciAoIm1vbml0b3JfcmVhZF9tZW1vcnkgKDB4JXgpOiAgYmFkIHJlc3BvbnNlIGZyb20gbW9uaXRvcjogJS4qcy4iLAorCQkgICAgICAgbWVtYWRkciwgcmVzcF9sZW4sIGJ1ZiwgMCk7CisgICAgICBwICs9IHN0cmxlbiAoY3VycmVudF9tb25pdG9yLT5nZXRtZW0ucmVzcF9kZWxpbSk7CisjZW5kaWYKKyAgICB9CisgIGlmIChyZW1vdGVfZGVidWcpIHByaW50ZigiTU9OIHNjYW5uaW5nICAlZCAsJTA4eCAnJXMnXG4iLGxlbixwLHApIDsKKyAgaWYgKGN1cnJlbnRfbW9uaXRvci0+ZmxhZ3MgJiBNT19HRVRNRU1fMTZfQk9VTkRBUlkpCisgICAgeworICAgICAgY2hhciBjIDsKKyAgICAgIGludCBmZXRjaGVkID0gMCA7CisgICAgICBpID0gbGVuOworICAgICAgYyA9ICpwIDsKKworCQkJICAgIAorICAgICAgd2hpbGUgKCEoYyAgPT0gJ1wwMDAnIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdccicpICYmIGkgPiAwKQorCXsgaWYgKGlzeGRpZ2l0IChjKSkKKwkgICAgeyBpZiAoKGR1bXBhZGRyID49IG1lbWFkZHIpICYmIChpID4gMCkpCisJCXsgdmFsID0gZnJvbWhleCAoYykgKiAxNiArIGZyb21oZXggKCoocCsxKSk7CisJCSAgKm15YWRkcisrID0gdmFsOworCQkgIGlmIChyZW1vdGVfZGVidWcpIHByaW50ZigiWyUwMnhdIix2YWwpIDsKKwkJICAtLWk7CisJCSAgZmV0Y2hlZCsrIDsKKwkJfQorCSAgICAgICsrZHVtcGFkZHI7CisJICAgICAgKytwOworCSAgICB9CisJICArK3A7IC8qIHNraXAgYSBibGFuayBvciBvdGhlciBub24gaGV4IGNoYXIgKi8KKwkgIGMgPSAqcCA7CisJfQorICAgICAgaWYgKGZldGNoZWQgPT0gMCkgZXJyb3IoIkZhaWxlZCB0byByZWFkIHZpYSBtb25pdG9yIikgOworICAgICAgaWYgKHJlbW90ZV9kZWJ1ZykgcHJpbnRmKCJcbiIpIDsKKyAgICAgIHJldHVybiBmZXRjaGVkIDsgLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCAqLworICAgIH0KKyAgUkRFQlVHKCgiTU9OIHNjYW5uaW5nIGJ5dGVzXG4iKSkgOworCisgIGZvciAoaSA9IGxlbjsgaSA+IDA7IGktLSkKKyAgICB7CisgICAgICAvKiBTa2lwIG5vbi1oZXggY2hhcnMsIGJ1dCBib21iIG9uIGVuZCBvZiBzdHJpbmcgYW5kIG5ld2xpbmVzICovCisKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIGlmIChpc3hkaWdpdCAoKnApKQorCSAgICBicmVhazsKKworCSAgaWYgKCpwID09ICdcMDAwJyB8fCAqcCA9PSAnXG4nIHx8ICpwID09ICdccicpCisJICAgIG1vbml0b3JfZXJyb3IgKCJtb25pdG9yX3JlYWRfbWVtb3J5ICgweCV4KTogIGJhZGx5IHRlcm1pbmF0ZWQgcmVzcG9uc2UgZnJvbSBtb25pdG9yOiAlLipzIiwKKwkJCSAgIG1lbWFkZHIsIHJlc3BfbGVuLCBidWYsIDApOworCSAgcCsrOworCX0KKworICAgICAgdmFsID0gc3RydG91bCAocCwgJnAxLCAxNik7CisKKyAgICAgIGlmICh2YWwgPT0gMCAmJiBwID09IHAxKQorCW1vbml0b3JfZXJyb3IgKCJtb25pdG9yX3JlYWRfbWVtb3J5ICgweCV4KTogIGJhZCB2YWx1ZSBmcm9tIG1vbml0b3I6ICUuKnMuIiwKKwkJICAgICAgIG1lbWFkZHIsIHJlc3BfbGVuLCBidWYsIDApOworCisgICAgICAqbXlhZGRyKysgPSB2YWw7CisKKyAgICAgIGlmIChpID09IDEpCisJYnJlYWs7CisKKyAgICAgIHAgPSBwMTsKKyAgICB9CisKKyAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludAorbW9uaXRvcl94ZmVyX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4sIHdyaXRlLCB0YXJnZXQpCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47CisgICAgIGludCB3cml0ZTsKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldDsJCS8qIGlnbm9yZWQgKi8KK3sKKyAgcmV0dXJuIGRjYWNoZV94ZmVyX21lbW9yeSAocmVtb3RlX2RjYWNoZSwgbWVtYWRkciwgbXlhZGRyLCBsZW4sIHdyaXRlKTsKK30KKworc3RhdGljIHZvaWQKK21vbml0b3Jfa2lsbCAoKQoreworICByZXR1cm47CQkvKiBpZ25vcmUgYXR0ZW1wdHMgdG8ga2lsbCB0YXJnZXQgc3lzdGVtICovCit9CisKKy8qIEFsbCB3ZSBhY3R1YWxseSBkbyBpcyBzZXQgdGhlIFBDIHRvIHRoZSBzdGFydCBhZGRyZXNzIG9mIGV4ZWNfYmZkLCBhbmQgc3RhcnQKKyAgIHRoZSBwcm9ncmFtIGF0IHRoYXQgcG9pbnQuICAqLworCitzdGF0aWMgdm9pZAorbW9uaXRvcl9jcmVhdGVfaW5mZXJpb3IgKGV4ZWNfZmlsZSwgYXJncywgZW52KQorICAgICBjaGFyICpleGVjX2ZpbGU7CisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGlmIChhcmdzICYmICgqYXJncyAhPSAnXDAwMCcpKQorICAgIGVycm9yICgiQXJncyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgbW9uaXRvci4iKTsKKworICBmaXJzdF90aW1lID0gMTsKKyAgY2xlYXJfcHJvY2VlZF9zdGF0dXMgKCk7CisgIHByb2NlZWQgKGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoZXhlY19iZmQpLCBUQVJHRVRfU0lHTkFMXzAsIDApOworfQorCisvKiBDbGVhbiB1cCB3aGVuIGEgcHJvZ3JhbSBleGl0cy4KKyAgIFRoZSBwcm9ncmFtIGFjdHVhbGx5IGxpdmVzIG9uIGluIHRoZSByZW1vdGUgcHJvY2Vzc29yJ3MgUkFNLCBhbmQgbWF5IGJlCisgICBydW4gYWdhaW4gd2l0aG91dCBhIGRvd25sb2FkLiAgRG9uJ3QgbGVhdmUgaXQgZnVsbCBvZiBicmVha3BvaW50CisgICBpbnN0cnVjdGlvbnMuICAqLworCitzdGF0aWMgdm9pZAorbW9uaXRvcl9tb3Vybl9pbmZlcmlvciAoKQoreworICB1bnB1c2hfdGFyZ2V0ICh0YXJnX29wcyk7CisgIGdlbmVyaWNfbW91cm5faW5mZXJpb3IgKCk7CS8qIERvIGFsbCB0aGUgcHJvcGVyIHRoaW5ncyBub3cgKi8KK30KKworI2RlZmluZSBOVU1fTU9OSVRPUl9CUkVBS1BPSU5UUyA4CisKK3N0YXRpYyBDT1JFX0FERFIgYnJlYWthZGRyW05VTV9NT05JVE9SX0JSRUFLUE9JTlRTXSA9IHswfTsKKworLyogVGVsbCB0aGUgbW9uaXRvciB0byBhZGQgYSBicmVha3BvaW50LiAgKi8KKworc3RhdGljIGludAorbW9uaXRvcl9pbnNlcnRfYnJlYWtwb2ludCAoYWRkciwgc2hhZG93KQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqc2hhZG93OworeworICBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciAqYnA7CisgIGludCBicGxlbjsKKworICBSREVCVUcoKCJNT04gaW5zdCBia3B0ICUwOHhcbiIsYWRkcikpIAorICBpZiAoY3VycmVudF9tb25pdG9yLT5zZXRfYnJlYWsgPT0gTlVMTCkKKyAgICBlcnJvciAoIk5vIHNldF9icmVhayBkZWZpbmVkIGZvciB0aGlzIG1vbml0b3IiKTsKKworICBpZiAoY3VycmVudF9tb25pdG9yLT5mbGFncyAmIE1PX0FERFJfQklUU19SRU1PVkUpCisgICAgYWRkciA9IEFERFJfQklUU19SRU1PVkUgKGFkZHIpOworCisgIC8qIERldGVybWluZSBhcHByb3ByaWF0ZSBicmVha3BvaW50IHNpemUgZm9yIHRoaXMgYWRkcmVzcy4gICovCisgIGJwID0gbWVtb3J5X2JyZWFrcG9pbnRfZnJvbV9wYyAoJmFkZHIsICZicGxlbik7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9NT05JVE9SX0JSRUFLUE9JTlRTOyBpKyspCisgICAgeworICAgICAgaWYgKGJyZWFrYWRkcltpXSA9PSAwKQorCXsKKwkgIGJyZWFrYWRkcltpXSA9IGFkZHI7CisJICBtb25pdG9yX3JlYWRfbWVtb3J5IChhZGRyLCBzaGFkb3csIGJwbGVuKTsKKwkgIG1vbml0b3JfcHJpbnRmIChjdXJyZW50X21vbml0b3ItPnNldF9icmVhaywgYWRkcik7CisJICBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKE5VTEwsIDApOworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKworICBlcnJvciAoIlRvbyBtYW55IGJyZWFrcG9pbnRzICg+ICVkKSBmb3IgbW9uaXRvci4iLCBOVU1fTU9OSVRPUl9CUkVBS1BPSU5UUyk7Cit9CisKKy8qIFRlbGwgdGhlIG1vbml0b3IgdG8gcmVtb3ZlIGEgYnJlYWtwb2ludC4gICovCisKK3N0YXRpYyBpbnQKK21vbml0b3JfcmVtb3ZlX2JyZWFrcG9pbnQgKGFkZHIsIHNoYWRvdykKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGNoYXIgKnNoYWRvdzsKK3sKKyAgaW50IGk7CisKKyAgUkRFQlVHKCgiTU9OIHJtYmtwdCAlMDh4XG4iLGFkZHIpKQorICBpZiAoY3VycmVudF9tb25pdG9yLT5jbHJfYnJlYWsgPT0gTlVMTCkKKyAgICBlcnJvciAoIk5vIGNscl9icmVhayBkZWZpbmVkIGZvciB0aGlzIG1vbml0b3IiKTsKKworICBpZiAoY3VycmVudF9tb25pdG9yLT5mbGFncyAmIE1PX0FERFJfQklUU19SRU1PVkUpCisgICAgYWRkciA9IEFERFJfQklUU19SRU1PVkUgKGFkZHIpOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fTU9OSVRPUl9CUkVBS1BPSU5UUzsgaSsrKQorICAgIHsKKyAgICAgIGlmIChicmVha2FkZHJbaV0gPT0gYWRkcikKKwl7CisJICBicmVha2FkZHJbaV0gPSAwOworCSAgLyogc29tZSBtb25pdG9ycyByZW1vdmUgYnJlYWtwb2ludHMgYmFzZWQgb24gdGhlIGFkZHJlc3MgKi8KKwkgIGlmIChjdXJyZW50X21vbml0b3ItPmZsYWdzICYgTU9fQ0xSX0JSRUFLX1VTRVNfQUREUikKKwkgICAgbW9uaXRvcl9wcmludGYgKGN1cnJlbnRfbW9uaXRvci0+Y2xyX2JyZWFrLCBhZGRyKTsKKwkgIGVsc2UgaWYgKGN1cnJlbnRfbW9uaXRvci0+ZmxhZ3MgJiBNT19DTFJfQlJFQUtfMV9CQVNFRCkKKwkgICAgbW9uaXRvcl9wcmludGYgKGN1cnJlbnRfbW9uaXRvci0+Y2xyX2JyZWFrLCBpICsgMSk7CisJICBlbHNlCisJICAgIG1vbml0b3JfcHJpbnRmIChjdXJyZW50X21vbml0b3ItPmNscl9icmVhaywgaSk7CisJICBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKE5VTEwsIDApOworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLAorCQkgICAgICAiQ2FuJ3QgZmluZCBicmVha3BvaW50IGFzc29jaWF0ZWQgd2l0aCAweCV4XG4iLCBhZGRyKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIG1vbml0b3Jfd2FpdF9zcmVjX2FjayAtLSB3YWl0IGZvciB0aGUgdGFyZ2V0IHRvIHNlbmQgYW4gYWNrbm93bGVkZ2VtZW50IGZvcgorICAgYW4gUy1yZWNvcmQuICBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIEFDSyBpcyByZWNlaXZlZCBwcm9wZXJseS4gICovCisKK3N0YXRpYyBpbnQKK21vbml0b3Jfd2FpdF9zcmVjX2FjayAoKQoreworICBpbnQgaSwgY2g7CisKKyAgaWYgKGN1cnJlbnRfbW9uaXRvci0+ZmxhZ3MgJiBNT19TUkVDX0FDS19QTFVTKQorICAgIHsKKyAgICAgIHJldHVybiAocmVhZGNoYXIgKHRpbWVvdXQpID09ICcrJyk7CisgICAgfQorICBlbHNlIGlmIChjdXJyZW50X21vbml0b3ItPmZsYWdzICYgTU9fU1JFQ19BQ0tfUk9UQVRFKQorICAgIHsKKyAgICAgIC8qIEVhdCB0d28gYmFja3NwYWNlcywgYSAicm90YXRpbmciIGNoYXIgKHwvLVwpLCBhbmQgYSBzcGFjZS4gICovCisgICAgICBpZiAoKGNoID0gcmVhZGNoYXIgKDEpKSA8IDApCisJcmV0dXJuIDA7CisgICAgICBpZiAoKGNoID0gcmVhZGNoYXIgKDEpKSA8IDApCisJcmV0dXJuIDA7CisgICAgICBpZiAoKGNoID0gcmVhZGNoYXIgKDEpKSA8IDApCisJcmV0dXJuIDA7CisgICAgICBpZiAoKGNoID0gcmVhZGNoYXIgKDEpKSA8IDApCisJcmV0dXJuIDA7CisgICAgfQorICByZXR1cm4gMTsKK30KKworLyogbW9uaXRvcl9sb2FkIC0tIGRvd25sb2FkIGEgZmlsZS4gKi8KKworc3RhdGljIHZvaWQKK21vbml0b3JfbG9hZCAoZmlsZSwgZnJvbV90dHkpCisgICAgY2hhciAqZmlsZTsKKyAgICBpbnQgIGZyb21fdHR5OworeworICBkY2FjaGVfZmx1c2ggKHJlbW90ZV9kY2FjaGUpOworICBSREVCVUcoKCJNT04gbG9hZFxuIikpCisKKyAgaWYgKGN1cnJlbnRfbW9uaXRvci0+bG9hZF9yb3V0aW5lKQorICAgIGN1cnJlbnRfbW9uaXRvci0+bG9hZF9yb3V0aW5lIChtb25pdG9yX2Rlc2MsIGZpbGUsIGhhc2htYXJrKTsKKyAgZWxzZQorICAgIHsJCQkJLyogVGhlIGRlZmF1bHQgaXMgYXNjaWkgUy1yZWNvcmRzICovCisgICAgICBpbnQgbjsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9hZF9vZmZzZXQ7CisgICAgICBjaGFyIGJ1ZlsxMjhdOworCisgICAgICAvKiBlbmFibGUgdXNlciB0byBzcGVjaWZ5IGFkZHJlc3MgZm9yIGRvd25sb2FkaW5nIGFzIDJuZCBhcmcgdG8gbG9hZCAqLworICAgICAgbiA9IHNzY2FuZiAoZmlsZSwgIiVzIDB4JWx4IiwgYnVmLCAmbG9hZF9vZmZzZXQpOworICAgICAgaWYgKG4gPiAxKQorCWZpbGUgPSBidWY7CisgICAgICBlbHNlCisJbG9hZF9vZmZzZXQgPSAwOworCisgICAgICBtb25pdG9yX3ByaW50ZiAoY3VycmVudF9tb25pdG9yLT5sb2FkKTsKKyAgICAgIGlmIChjdXJyZW50X21vbml0b3ItPmxvYWRyZXNwKQorCW1vbml0b3JfZXhwZWN0IChjdXJyZW50X21vbml0b3ItPmxvYWRyZXNwLCBOVUxMLCAwKTsKKworICAgICAgbG9hZF9zcmVjIChtb25pdG9yX2Rlc2MsIGZpbGUsIChiZmRfdm1hKSBsb2FkX29mZnNldCwKKwkJIDMyLCBTUkVDX0FMTCwgaGFzaG1hcmssCisJCSBjdXJyZW50X21vbml0b3ItPmZsYWdzICYgTU9fU1JFQ19BQ0sgPworCQkgICBtb25pdG9yX3dhaXRfc3JlY19hY2sgOiBOVUxMKTsKKworICAgICAgbW9uaXRvcl9leHBlY3RfcHJvbXB0IChOVUxMLCAwKTsKKyAgICB9CisKKy8qIEZpbmFsbHksIG1ha2UgdGhlIFBDIHBvaW50IGF0IHRoZSBzdGFydCBhZGRyZXNzICovCisKKyAgaWYgKGV4ZWNfYmZkKQorICAgIHdyaXRlX3BjIChiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGV4ZWNfYmZkKSk7CisKKyAgaW5mZXJpb3JfcGlkID0gMDsJCS8qIE5vIHByb2Nlc3Mgbm93ICovCisKKy8qIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgbWFueSB0aGluZ3Mgd2VyZSBiYXNlZCBvbiB0aGUgUEMgYXQgdGhlIHRpbWUgdGhhdAorICAgd2UgYXR0YWNoZWQgdG8gdGhlIG1vbml0b3IsIHdoaWNoIGlzIG5vIGxvbmdlciB2YWxpZCBub3cgdGhhdCB3ZSBoYXZlIGxvYWRlZAorICAgbmV3IGNvZGUgKGFuZCBqdXN0IGNoYW5nZWQgdGhlIFBDKS4gIEFub3RoZXIgd2F5IHRvIGRvIHRoaXMgbWlnaHQgYmUgdG8gY2FsbAorICAgbm9ybWFsX3N0b3AsIGV4Y2VwdCB0aGF0IHRoZSBzdGFjayBtYXkgbm90IGJlIHZhbGlkLCBhbmQgdGhpbmdzIHdvdWxkIGdldAorICAgaG9ycmlibHkgY29uZnVzZWQuLi4gKi8KKworICBjbGVhcl9zeW10YWJfdXNlcnMgKCk7Cit9CisKK3N0YXRpYyB2b2lkCittb25pdG9yX3N0b3AgKCkKK3sKKyAgUkRFQlVHKCgiTU9OIHN0b3BcbiIpKSA7CisgIGlmICgoY3VycmVudF9tb25pdG9yLT5mbGFncyAmIE1PX1NFTkRfQlJFQUtfT05fU1RPUCkgIT0gMCkKKyAgICBTRVJJQUxfU0VORF9CUkVBSyAobW9uaXRvcl9kZXNjKTsKKyAgaWYgKGN1cnJlbnRfbW9uaXRvci0+c3RvcCkKKyAgICBtb25pdG9yX3ByaW50Zl9ub2VjaG8gKGN1cnJlbnRfbW9uaXRvci0+c3RvcCk7Cit9CisKKy8qIFB1dCBhIGNvbW1hbmQgc3RyaW5nLCBpbiBhcmdzLCBvdXQgdG8gTU9OSVRPUi4gIE91dHB1dCBmcm9tIE1PTklUT1IKKyAgIGlzIHBsYWNlZCBvbiB0aGUgdXNlcnMgdGVybWluYWwgdW50aWwgdGhlIHByb21wdCBpcyBzZWVuLiBGSVhNRTogV2UKKyAgIHJlYWQgdGhlIGNoYXJhY3RlcnMgb3Vyc2VsZXZlcyBoZXJlIGNhdXNlIG9mIGEgbmFzdHkgZWNoby4gICovCisKK3N0YXRpYyB2b2lkCittb25pdG9yX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoYXIgKnA7CisgIGludCByZXNwX2xlbjsKKyAgY2hhciBidWZbMTAwMF07CisKKyAgaWYgKG1vbml0b3JfZGVzYyA9PSBOVUxMKQorICAgIGVycm9yICgibW9uaXRvciB0YXJnZXQgbm90IG9wZW4uIik7CisKKyAgcCA9IGN1cnJlbnRfbW9uaXRvci0+cHJvbXB0OworCisgIC8qIFNlbmQgdGhlIGNvbW1hbmQuICBOb3RlIHRoYXQgaWYgbm8gYXJncyB3ZXJlIHN1cHBsaWVkLCB0aGVuIHdlJ3JlCisgICAgIGp1c3Qgc2VuZGluZyB0aGUgbW9uaXRvciBhIG5ld2xpbmUsIHdoaWNoIGlzIHNvbWV0aW1lcyB1c2VmdWwuICAqLworCisgIG1vbml0b3JfcHJpbnRmICgiJXNcciIsIChhcmdzID8gYXJncyA6ICIiKSk7CisKKyAgcmVzcF9sZW4gPSBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKGJ1Ziwgc2l6ZW9mIGJ1Zik7CisKKyAgZnB1dHNfdW5maWx0ZXJlZCAoYnVmLCBnZGJfc3Rkb3V0KTsgLyogT3V0cHV0IHRoZSByZXNwb25zZSAqLworfQorCisvKiBDb252ZXJ0IGhleCBkaWdpdCBBIHRvIGEgbnVtYmVyLiAgKi8KKworI2lmIDAKK3N0YXRpYyBpbnQKK2Zyb21faGV4IChhKQorICAgICBpbnQgYTsKK3sgIAorICBpZiAoYSA+PSAnMCcgJiYgYSA8PSAnOScpCisgICAgcmV0dXJuIGEgLSAnMCc7CisgIGlmIChhID49ICdhJyAmJiBhIDw9ICdmJykKKyAgICByZXR1cm4gYSAtICdhJyArIDEwOworICBpZiAoYSA+PSAnQScgJiYgYSA8PSAnRicpCisgICAgcmV0dXJuIGEgLSAnQScgKyAxMDsKKworICBlcnJvciAoIlJlcGx5IGNvbnRhaW5zIGludmFsaWQgaGV4IGRpZ2l0IDB4JXgiLCBhKTsKK30KKyNlbmRpZgorCitjaGFyICoKK21vbml0b3JfZ2V0X2Rldl9uYW1lICgpCit7CisgIHJldHVybiBkZXZfbmFtZTsKK30KKworc3RhdGljIHN0cnVjdCB0YXJnZXRfb3BzIG1vbml0b3Jfb3BzOworCitzdGF0aWMgdm9pZAoraW5pdF9iYXNlX21vbml0b3Jfb3BzICh2b2lkKQoreworICBtb25pdG9yX29wcy50b19zaG9ydG5hbWUgPSBOVUxMOworICBtb25pdG9yX29wcy50b19sb25nbmFtZSA9IE5VTEw7CisgIG1vbml0b3Jfb3BzLnRvX2RvYyA9IE5VTEw7CisgIG1vbml0b3Jfb3BzLnRvX29wZW4gPSBOVUxMOworICBtb25pdG9yX29wcy50b19jbG9zZSA9IG1vbml0b3JfY2xvc2U7CisgIG1vbml0b3Jfb3BzLnRvX2F0dGFjaCA9IE5VTEw7CisgIG1vbml0b3Jfb3BzLnRvX3Bvc3RfYXR0YWNoID0gTlVMTDsKKyAgbW9uaXRvcl9vcHMudG9fcmVxdWlyZV9hdHRhY2ggPSBOVUxMOworICBtb25pdG9yX29wcy50b19kZXRhY2ggPSBtb25pdG9yX2RldGFjaDsKKyAgbW9uaXRvcl9vcHMudG9fcmVxdWlyZV9kZXRhY2ggPSBOVUxMOworICBtb25pdG9yX29wcy50b19yZXN1bWUgPSBtb25pdG9yX3Jlc3VtZTsKKyAgbW9uaXRvcl9vcHMudG9fd2FpdCA9IG1vbml0b3Jfd2FpdDsKKyAgbW9uaXRvcl9vcHMudG9fcG9zdF93YWl0ID0gTlVMTDsKKyAgbW9uaXRvcl9vcHMudG9fZmV0Y2hfcmVnaXN0ZXJzID0gbW9uaXRvcl9mZXRjaF9yZWdpc3RlcnM7CisgIG1vbml0b3Jfb3BzLnRvX3N0b3JlX3JlZ2lzdGVycyA9IG1vbml0b3Jfc3RvcmVfcmVnaXN0ZXJzOworICBtb25pdG9yX29wcy50b19wcmVwYXJlX3RvX3N0b3JlID0gbW9uaXRvcl9wcmVwYXJlX3RvX3N0b3JlOworICBtb25pdG9yX29wcy50b194ZmVyX21lbW9yeSA9IG1vbml0b3JfeGZlcl9tZW1vcnk7CisgIG1vbml0b3Jfb3BzLnRvX2ZpbGVzX2luZm8gPSBtb25pdG9yX2ZpbGVzX2luZm87CisgIG1vbml0b3Jfb3BzLnRvX2luc2VydF9icmVha3BvaW50ID0gbW9uaXRvcl9pbnNlcnRfYnJlYWtwb2ludDsKKyAgbW9uaXRvcl9vcHMudG9fcmVtb3ZlX2JyZWFrcG9pbnQgPSBtb25pdG9yX3JlbW92ZV9icmVha3BvaW50OworICBtb25pdG9yX29wcy50b190ZXJtaW5hbF9pbml0ID0gMDsKKyAgbW9uaXRvcl9vcHMudG9fdGVybWluYWxfaW5mZXJpb3IgPSAwOworICBtb25pdG9yX29wcy50b190ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgPSAwOworICBtb25pdG9yX29wcy50b190ZXJtaW5hbF9vdXJzID0gMDsKKyAgbW9uaXRvcl9vcHMudG9fdGVybWluYWxfaW5mbyA9IDA7CisgIG1vbml0b3Jfb3BzLnRvX2tpbGwgPSBtb25pdG9yX2tpbGw7CisgIG1vbml0b3Jfb3BzLnRvX2xvYWQgPSBtb25pdG9yX2xvYWQ7CisgIG1vbml0b3Jfb3BzLnRvX2xvb2t1cF9zeW1ib2wgPSAwOworICBtb25pdG9yX29wcy50b19jcmVhdGVfaW5mZXJpb3IgPSBtb25pdG9yX2NyZWF0ZV9pbmZlcmlvcjsKKyAgbW9uaXRvcl9vcHMudG9fcG9zdF9zdGFydHVwX2luZmVyaW9yID0gTlVMTDsKKyAgbW9uaXRvcl9vcHMudG9fYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvciA9IE5VTEw7CisgIG1vbml0b3Jfb3BzLnRvX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IgPSBOVUxMOworICBtb25pdG9yX29wcy50b19wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSA9IE5VTEw7CisgIG1vbml0b3Jfb3BzLnRvX2luc2VydF9mb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBtb25pdG9yX29wcy50b19yZW1vdmVfZm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgbW9uaXRvcl9vcHMudG9faW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBtb25pdG9yX29wcy50b19yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIG1vbml0b3Jfb3BzLnRvX2hhc19mb3JrZWQgPSBOVUxMOworICBtb25pdG9yX29wcy50b19oYXNfdmZvcmtlZCA9IE5VTEw7CisgIG1vbml0b3Jfb3BzLnRvX2Nhbl9mb2xsb3dfdmZvcmtfcHJpb3JfdG9fZXhlYyA9IE5VTEw7CisgIG1vbml0b3Jfb3BzLnRvX3Bvc3RfZm9sbG93X3Zmb3JrID0gTlVMTDsKKyAgbW9uaXRvcl9vcHMudG9faW5zZXJ0X2V4ZWNfY2F0Y2hwb2ludCA9IE5VTEw7CisgIG1vbml0b3Jfb3BzLnRvX3JlbW92ZV9leGVjX2NhdGNocG9pbnQgPSBOVUxMOworICBtb25pdG9yX29wcy50b19oYXNfZXhlY2QgPSBOVUxMOworICBtb25pdG9yX29wcy50b19yZXBvcnRlZF9leGVjX2V2ZW50c19wZXJfZXhlY19jYWxsID0gTlVMTDsKKyAgbW9uaXRvcl9vcHMudG9faGFzX2V4aXRlZCA9IE5VTEw7CisgIG1vbml0b3Jfb3BzLnRvX21vdXJuX2luZmVyaW9yID0gbW9uaXRvcl9tb3Vybl9pbmZlcmlvcjsKKyAgbW9uaXRvcl9vcHMudG9fY2FuX3J1biA9IDA7CisgIG1vbml0b3Jfb3BzLnRvX25vdGljZV9zaWduYWxzID0gMDsKKyAgbW9uaXRvcl9vcHMudG9fdGhyZWFkX2FsaXZlID0gMDsKKyAgbW9uaXRvcl9vcHMudG9fc3RvcCA9IG1vbml0b3Jfc3RvcDsKKyAgbW9uaXRvcl9vcHMudG9fcGlkX3RvX2V4ZWNfZmlsZSA9IE5VTEw7CisgIG1vbml0b3Jfb3BzLnRvX2NvcmVfZmlsZV90b19zeW1fZmlsZSA9IE5VTEw7CisgIG1vbml0b3Jfb3BzLnRvX3N0cmF0dW0gPSBwcm9jZXNzX3N0cmF0dW07CisgIG1vbml0b3Jfb3BzLkRPTlRfVVNFID0gMDsKKyAgbW9uaXRvcl9vcHMudG9faGFzX2FsbF9tZW1vcnkgPSAxOworICBtb25pdG9yX29wcy50b19oYXNfbWVtb3J5ID0gMTsKKyAgbW9uaXRvcl9vcHMudG9faGFzX3N0YWNrID0gMTsKKyAgbW9uaXRvcl9vcHMudG9faGFzX3JlZ2lzdGVycyA9IDE7CisgIG1vbml0b3Jfb3BzLnRvX2hhc19leGVjdXRpb24gPSAxOworICBtb25pdG9yX29wcy50b19zZWN0aW9ucyA9IDA7CisgIG1vbml0b3Jfb3BzLnRvX3NlY3Rpb25zX2VuZCA9IDA7CisgIG1vbml0b3Jfb3BzLnRvX21hZ2ljID0gT1BTX01BR0lDOworfSAvKiBpbml0X2Jhc2VfbW9uaXRvcl9vcHMgKi8KKworLyogSW5pdCB0aGUgdGFyZ2V0X29wcyBzdHJ1Y3R1cmUgcG9pbnRlZCBhdCBieSBPUFMgKi8KKwordm9pZAoraW5pdF9tb25pdG9yX29wcyAob3BzKQorICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqb3BzOworeworICBpZiAobW9uaXRvcl9vcHMudG9fbWFnaWMgIT0gT1BTX01BR0lDKQorICAgIGluaXRfYmFzZV9tb25pdG9yX29wcyAoKTsKKworICBtZW1jcHkgKG9wcywgJm1vbml0b3Jfb3BzLCBzaXplb2YgbW9uaXRvcl9vcHMpOworfQorCisvKiBEZWZpbmUgYWRkaXRpb25hbCBjb21tYW5kcyB0aGF0IGFyZSB1c3VhbGx5IG9ubHkgdXNlZCBieSBtb25pdG9ycy4gICovCisKK3ZvaWQKK19pbml0aWFsaXplX3JlbW90ZV9tb25pdG9ycyAoKQoreworICBpbml0X2Jhc2VfbW9uaXRvcl9vcHMgKCk7CisgIGFkZF9zaG93X2Zyb21fc2V0IChhZGRfc2V0X2NtZCAoImhhc2giLCBub19jbGFzcywgdmFyX2Jvb2xlYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmaGFzaG1hcmssCisJCQkJICAiU2V0IGRpc3BsYXkgb2YgYWN0aXZpdHkgd2hpbGUgZG93bmxvYWRpbmcgYSBmaWxlLlxuXAorV2hlbiBlbmFibGVkLCBhIGhhc2htYXJrIFwnI1wnIGlzIGRpc3BsYXllZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXRsaXN0KSwKKwkJICAgICAmc2hvd2xpc3QpOworCisgIGFkZF9jb20gKCJtb25pdG9yIiwgY2xhc3Nfb2JzY3VyZSwgbW9uaXRvcl9jb21tYW5kLAorCSAgICJTZW5kIGEgY29tbWFuZCB0byB0aGUgZGVidWcgbW9uaXRvci4iKTsgCit9CisKKwpkaWZmIC0tZ2l0IGEvZ2RiL21vbml0b3IuaCBiL2dkYi9tb25pdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNjZGRkNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9tb25pdG9yLmgKQEAgLTAsMCArMSwyNDcgQEAKKy8qIERlZmluaXRpb25zIGZvciByZW1vdGUgZGVidWdnaW5nIGludGVyZmFjZSBmb3IgUk9NIG1vbml0b3JzLgorICAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LiBXcml0dGVuIGJ5IFJvYiBTYXZveWUgZm9yIEN5Z251cy4KKyAgCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgIAorICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqLworCisjaW5jbHVkZSAic2VyaWFsLmgiCisKKy8qIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgc3RyaW5ncyBuZWNlc3NhcnkgdG8gZ2l2ZSBzbWFsbCBjb21tYW5kCisgICBzZXF1ZW5jZXMgdG8gdGhlIG1vbml0b3IsIGFuZCBwYXJzZSB0aGUgcmVzcG9uc2UuCisKKyAgIENNRCBpcyB0aGUgYWN0dWFsIGNvbW1hbmQgdHlwZWQgYXQgdGhlIG1vbml0b3IuICBVc3VhbGx5IHRoaXMgaGFzCisgICBlbWJlZGRlZCBzZXF1ZW5jZXMgYWxhIHByaW50Ziwgd2hpY2ggYXJlIHN1YnN0aXR1dGVkIHdpdGggdGhlCisgICBhcmd1bWVudHMgYXBwcm9wcmlhdGUgdG8gdGhhdCB0eXBlIG9mIGNvbW1hbmQuICBJZTogdG8gZXhhbWluZSBhCisgICByZWdpc3Rlciwgd2Ugc3Vic3RpdHV0ZSB0aGUgcmVnaXN0ZXIgbmFtZSBmb3IgdGhlIGZpcnN0IGFyZy4gIFRvCisgICBtb2RpZnkgbWVtb3J5LCB3ZSBzdWJzdGl0dXRlIHRoZSBtZW1vcnkgbG9jYXRpb24gYW5kIHRoZSBuZXcKKyAgIGNvbnRlbnRzIGZvciB0aGUgZmlyc3QgYW5kIHNlY29uZCBhcmdzLCBldGMuLi4KKworICAgUkVTUF9ERUxJTSB1c2VkIHRvIGhvbWUgaW4gb24gdGhlIHJlc3BvbnNlIHN0cmluZywgYW5kIGlzIHVzZWQgdG8KKyAgIGRpc2FtYmlndWF0ZSB0aGUgYW5zd2VyIHdpdGhpbiB0aGUgcGlsZSBvZiB0ZXh0IHJldHVybmVkIGJ5IHRoZQorICAgbW9uaXRvci4gIFRoaXMgc2hvdWxkIGJlIGEgdW5pcXVlIHN0cmluZyB0aGF0IGltbWVkaWF0ZWx5IHByZWNlZGVzCisgICB0aGUgYW5zd2VyLiAgSWU6IGlmIHlvdXIgbW9uaXRvciBwcmludHMgb3V0IGBQQzogMDAwMDAwMDE9ICcgaW4KKyAgIHJlc3BvbnNlIHRvIGFza2luZyBmb3IgdGhlIFBDLCB5b3Ugc2hvdWxkIHVzZSBgOiAnIGFzIHRoZQorICAgUkVTUF9ERUxJTS4gIFJFU1BfREVMSU0gbWF5IGJlIE5VTEwgaWYgdGhlIHJlcy0gcG9uc2UgaXMgZ29pbmcgdG8KKyAgIGJlIGlnbm9yZWQsIG9yIGhhcyBubyBwYXJ0aWN1bGFyIGxlYWRpbmcgdGV4dC4KKworICAgVEVSTSBpcyB0aGUgc3RyaW5nIHRoYXQgdGhlIG1vbml0b3Igb3V0cHV0cyB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzCisgICBpZGxlLCBhbmQgd2FpdGluZyBmb3IgaW5wdXQuICBUaGlzIGlzIHVzdWFsbHkgYSBwcm9tcHQgb2Ygc29tZQorICAgc29ydC4gIEluIHRoZSBwcmV2aW91cyBleGFtcGxlLCBpdCB3b3VsZCBiZSBgPSAnLiAgSXQgaXMgaW1wb3J0YW50CisgICB0aGF0IFRFUk0gcmVhbGx5IG1lYW5zIHRoYXQgdGhlIG1vbml0b3IgaXMgaWRsZSwgb3RoZXJ3aXNlIEdEQiBtYXkKKyAgIHRyeSB0byB0eXBlIGF0IGl0IHdoZW4gaXQgaXNuJ3QgcmVhZHkgZm9yIGlucHV0LiAgVGhpcyBpcyBhIHByb2JsZW0KKyAgIGJlY2F1c2UgbWFueSBtb25pdG9ycyBjYW5ub3QgZGVhbCB3aXRoIHR5cGUtYWhlYWQuICBURVJNIG1heSBiZQorICAgTlVMTCBpZiB0aGUgbm9ybWFsIHByb21wdCBpcyBvdXRwdXQuCisKKyAgIFRFUk1fQ01EIGlzIHVzZWQgdG8gcXVpdCBvdXQgb2YgdGhlIHN1YmNvbW1hbmQgbW9kZSBhbmQgZ2V0IGJhY2sgdG8KKyAgIHRoZSBtYWluIHByb21wdC4gIFRFUk1fQ01EIG1heSBiZSBOVUxMIGlmIGl0IGlzbid0IG5lY2Vzc2FyeS4gIEl0CisgICB3aWxsIGFsc28gYmUgaWdub3JlZCBpZiBURVJNIGlzIE5VTEwuICAqLworCitzdHJ1Y3QgbWVtcndfY21kCit7CisgIGNoYXIgKmNtZGI7CQkJLyogQ29tbWFuZCB0byBzZW5kIGZvciBieXRlIHJlYWQvd3JpdGUgKi8KKyAgY2hhciAqY21kdzsJCQkvKiBDb21tYW5kIGZvciB3b3JkICgxNiBiaXQpIHJlYWQvd3JpdGUgKi8KKyAgY2hhciAqY21kbDsJCQkvKiBDb21tYW5kIGZvciBsb25nICgzMiBiaXQpIHJlYWQvd3JpdGUgKi8KKyAgY2hhciAqY21kbGw7CQkJLyogQ29tbWFuZCBmb3IgbG9uZyBsb25nICg2NCBiaXQpIHJlYWQvd3JpdGUgKi8KKyAgY2hhciAqcmVzcF9kZWxpbTsJCS8qIFN0cmluZyBqdXN0IHByaW9yIHRvIHRoZSBkZXNpcmVkIHZhbHVlICovCisgIGNoYXIgKnRlcm07CQkJLyogVGVybWluYXRpbmcgc3RyaW5nIHRvIHNlYXJjaCBmb3IgKi8KKyAgY2hhciAqdGVybV9jbWQ7CQkvKiBTdHJpbmcgdG8gZ2V0IG91dCBvZiBzdWItbW9kZSAoaWYgbmVjZXNzYXJ5KSAqLworfTsKKworc3RydWN0IHJlZ3J3X2NtZAoreworICBjaGFyICpjbWQ7CQkJLyogQ29tbWFuZCB0byBzZW5kIGZvciByZWcgcmVhZC93cml0ZSAqLworICBjaGFyICpyZXNwX2RlbGltOwkJLyogU3RyaW5nIChhY3R1YWxseSBhIHJlZ2V4cCBpZiBnZXRtZW0pIGp1c3QKKwkJCQkgICBwcmlvciB0byB0aGUgZGVzaXJlZCB2YWx1ZSAqLworICBjaGFyICp0ZXJtOwkJCS8qIFRlcm1pbmF0aW5nIHN0cmluZyB0byBzZWFyY2ggZm9yICovCisgIGNoYXIgKnRlcm1fY21kOwkJLyogU3RyaW5nIHRvIGdldCBvdXQgb2Ygc3ViLW1vZGUgKGlmIG5lY2Vzc2FyeSkgKi8KK307CisKK3N0cnVjdCBtb25pdG9yX29wcworeworICBpbnQgZmxhZ3M7CQkJLyogU2VlIGJlbG93ICovCisgIGNoYXIgKippbml0OwkJCS8qIExpc3Qgb2YgaW5pdCBjb21tYW5kcy4gIE5VTEwgdGVybWluYXRlZC4gKi8KKyAgY2hhciAqY29udDsJCQkvKiBjb250aW51ZSBjb21tYW5kICovCisgIGNoYXIgKnN0ZXA7CQkJLyogc2luZ2xlIHN0ZXAgKi8KKyAgY2hhciAqc3RvcDsJCQkvKiBJbnRlcnJ1cHQgcHJvZ3JhbSBzdHJpbmcgKi8KKyAgY2hhciAqc2V0X2JyZWFrOwkJLyogc2V0IGEgYnJlYWtwb2ludCAqLworICBjaGFyICpjbHJfYnJlYWs7CQkvKiBjbGVhciBhIGJyZWFrcG9pbnQgKi8KKyAgY2hhciAqY2xyX2FsbF9icmVhazsJCS8qIENsZWFyIGFsbCBicmVha3BvaW50cyAqLworICBjaGFyICpmaWxsOwkJCS8qIE1lbW9yeSBmaWxsIGNtZCAoYWRkciBsZW4gdmFsKSAqLworICBzdHJ1Y3QgbWVtcndfY21kIHNldG1lbTsJLyogc2V0IG1lbW9yeSB0byBhIHZhbHVlICovCisgIHN0cnVjdCBtZW1yd19jbWQgZ2V0bWVtOwkvKiBkaXNwbGF5IG1lbW9yeSAqLworICBzdHJ1Y3QgcmVncndfY21kIHNldHJlZzsJLyogc2V0IGEgcmVnaXN0ZXIgKi8KKyAgc3RydWN0IHJlZ3J3X2NtZCBnZXRyZWc7CS8qIGdldCBhIHJlZ2lzdGVyICovCisJCQkJLyogU29tZSBjb21tYW5kcyBjYW4gZHVtcCBhIGJ1bmNoIG9mIHJlZ2lzdGVycworCQkJCSAgIGF0IG9uY2UuICBUaGlzIGNvbWVzIGFzIGEgc2V0IG9mIFJFRz1WQUwKKwkJCQkgICBwYWlycy4gIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBwYWlyCisJCQkJICAgb2YgcmVnaXN0ZXJzIHRoYXQgd2UgY2FuIHBhcnNlIHRvIHN1cHBseQorCQkJCSAgIEdEQiB3aXRoIHRoZSB2YWx1ZSBvZiBhIHJlZ2lzdGVyLiAgKi8KKyAgY2hhciAqZHVtcF9yZWdpc3RlcnM7CQkvKiBDb21tYW5kIHRvIGR1bXAgYWxsIHJlZ3MgYXQgb25jZSAqLworICBjaGFyICpyZWdpc3Rlcl9wYXR0ZXJuOwkvKiBQYXR0ZXJuIHRoYXQgcGlja3Mgb3V0IHJlZ2lzdGVyIGZyb20gcmVnIGR1bXAgKi8KKyAgdm9pZCAoKnN1cHBseV9yZWdpc3RlcikgUEFSQU1TICgoY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCisJCQkJICAgY2hhciAqdmFsLCBpbnQgdmFsbGVuKSk7CisgIHZvaWQgKCpsb2FkX3JvdXRpbmUpIFBBUkFNUyAoKHNlcmlhbF90IGRlc2MsIGNoYXIgKmZpbGUsCisJCQkJaW50IGhhc2htYXJrKSk7IC8qIERvd25sb2FkIHJvdXRpbmUgKi8KKyAgaW50ICgqZHVtcHJlZ3MpIFBBUkFNUygodm9pZCkpIDsgICAgLyogcm91dGluZSB0byBkdW1wIGFsbCByZWdpc3RlcnMgKi8KKyAgaW50ICgqY29udGludWVfaG9vaykgUEFSQU1TKCh2b2lkKSkgOyAvKiBFbWl0IHRoZSBjb250aW51ZSBjb21tYW5kICovCisgIGludCAoKndhaXRfZmlsdGVyKSBQQVJBTVMoKGNoYXIgKiBidWYsIC8qIE1heWJlIGNvbnRhaW5zIHJlZ2lzdGVycyAqLworCQkJICAgIGludCBidWZtYXggLAorCQkJICAgIGludCAqIHJlc3BvbnNlX2xlbmd0aCwKKwkJCSAgICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKiBzdGF0dXMpKSA7CisgIGNoYXIgKmxvYWQ7CQkJLyogbG9hZCBjb21tYW5kICovCisgIGNoYXIgKmxvYWRyZXNwOwkJLyogUmVzcG9uc2UgdG8gbG9hZCBjb21tYW5kICovCisgIGNoYXIgKnByb21wdDsJCQkvKiBtb25pdG9yIGNvbW1hbmQgcHJvbXB0ICovCisgIGNoYXIgKmxpbmVfdGVybTsJCS8qIGVuZC1vZi1jb21tYW5kIGRlbGltaXRvciAqLworICBjaGFyICpjbWRfZW5kOwkJLyogb3B0aW9uYWwgY29tbWFuZCB0ZXJtaW5hdG9yICovCisgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQ7CS8qIHRhcmdldCBvcGVyYXRpb25zICovCisgIGludCBzdG9wYml0czsJCQkvKiBudW1iZXIgb2Ygc3RvcCBiaXRzICovCisgIGNoYXIgKipyZWduYW1lczsJCS8qIGFycmF5IG9mIHJlZ2lzdGVyIG5hbWVzIGluIGFzY2lpICovCisgIGludCBtYWdpYzsJCQkvKiBDaGVjayB2YWx1ZSAqLworfTsKKworLyogVGhlIG1vbml0b3Igb3BzIG1hZ2ljIG51bWJlciwgdXNlZCB0byBkZXRlY3QgaWYgYW4gb3BzIHN0cnVjdHVyZSBkb2Vzbid0CisgICBoYXZlIHRoZSByaWdodCBudW1iZXIgb2YgZW50cmllcyBmaWxsZWQgaW4uICovCisKKyNkZWZpbmUgTU9OSVRPUl9PUFNfTUFHSUMgNjAwOTI1CisKKy8qIEZsYWcgZGVmaW5pdGlvbnMuICovCisKKy8qIElmIHNldCwgdGhlbiBjbGVhciBicmVha3BvaW50IGNvbW1hbmQgdXNlcyBhZGRyZXNzLCBvdGhlcndpc2UgaXQKKyAgIHVzZXMgYW4gaW5kZXggcmV0dXJuZWQgYnkgdGhlIG1vbml0b3IuICAqLworCisjZGVmaW5lIE1PX0NMUl9CUkVBS19VU0VTX0FERFIgMHgxCisKKy8qIElmIHNldCwgdGhlbiBtZW1vcnkgZmlsbCBjb21tYW5kIHVzZXMgU1RBUlRBRERSLCBFTkRBRERSKzEsIFZBTFVFCisgICBhcyBhcmdzLCBlbHNlIGl0IHVzZXMgU1RBUlRBRERSLCBMRU5HVEgsIFZBTFVFIGFzIGFyZ3MuICovCisKKyNkZWZpbmUgTU9fRklMTF9VU0VTX0FERFIgMHgyCisKKy8qIElmIHNldCwgdGhlbiBtb25pdG9yIGRvZXNuJ3QgYXV0b21hdGljYWxseSBzdXBwbHkgcmVnaXN0ZXIgZHVtcAorICAgd2hlbiBjb21pbmcgYmFjayBhZnRlciBhIGNvbnRpbnVlLiAgKi8KKworI2RlZmluZSBNT19ORUVEX1JFR0RVTVBfQUZURVJfQ09OVCAweDQKKworLyogZ2V0bWVtIG5lZWRzIHN0YXJ0IGFkZHIgYW5kIGVuZCBhZGRyICovCisKKyNkZWZpbmUgTU9fR0VUTUVNX05FRURTX1JBTkdFIDB4OAorCisvKiBnZXRtZW0gY2FuIG9ubHkgcmVhZCBvbmUgbG9jIGF0IGEgdGltZSAqLworCisjZGVmaW5lIE1PX0dFVE1FTV9SRUFEX1NJTkdMRSAweDEwCisKKy8qIGhhbmRsZSBcclxuIGNvbWJpbmF0aW9ucyAqLworCisjZGVmaW5lIE1PX0hBTkRMRV9OTCAweDIwCisKKy8qIGRvbid0IGV4cGVjdCBlY2hvcyBpbiBtb25pdG9yX29wZW4gKi8KKworI2RlZmluZSBNT19OT19FQ0hPX09OX09QRU4gMHg0MAorCisvKiBJZiBzZXQsIHNlbmQgYnJlYWsgdG8gc3RvcCBtb25pdG9yICovCisKKyNkZWZpbmUgTU9fU0VORF9CUkVBS19PTl9TVE9QIDB4ODAKKworLyogSWYgc2V0LCB0YXJnZXQgc2VuZHMgYW4gQUNLIGFmdGVyIGVhY2ggUy1yZWNvcmQgKi8KKworI2RlZmluZSBNT19TUkVDX0FDSyAweDEwMAorCisvKiBBbGxvdyAweCBwcmVmaXggb24gYWRkcmVzc2VzIHJldHVyZWQgZnJvbSBtb25pdG9yICovCisKKyNkZWZpbmUgTU9fSEVYX1BSRUZJWCAweDIwMAorCisvKiBTb21lIG1vbml0b3JzIHJlcXVpcmUgYSBkaWZmZXJlbnQgY29tbWFuZCB3aGVuIHN0YXJ0aW5nIGEgcHJvZ3JhbSAqLworCisjZGVmaW5lIE1PX1JVTl9GSVJTVF9USU1FIDB4NDAwCisKKy8qIERvbid0IGV4cGVjdCBlY2hvcyB3aGVuIGdldHRpbmcgbWVtb3J5ICovCisKKyNkZWZpbmUgTU9fTk9fRUNIT19PTl9TRVRNRU0gMHg4MDAKKworLyogSWYgc2V0LCB0aGVuIHJlZ2lzdGVyIHN0b3JlIGNvbW1hbmQgZXhwZWN0cyB2YWx1ZSBCRUZPUkUgcmVnbmFtZSAqLworCisjZGVmaW5lIE1PX1JFR0lTVEVSX1ZBTFVFX0ZJUlNUIDB4MTAwMAorCisvKiBJZiBzZXQsIHRoZW4gdGhlIG1vbml0b3IgZGlzcGxheXMgcmVnaXN0ZXJzIGFzIHBhaXJzLiAgKi8KKworI2RlZmluZSBNT18zMl9SRUdTX1BBSVJFRCAweDIwMDAKKworLyogSWYgc2V0LCB0aGVuIHJlZ2lzdGVyIHNldHRpbmcgaGFwcGVucyBpbnRlcmFjdGl2ZWx5LiAgKi8KKworI2RlZmluZSBNT19TRVRSRUdfSU5URVJBQ1RJVkUgMHg0MDAwCisKKy8qIElmIHNldCwgdGhlbiBtZW1vcnkgc2V0dGluZyBoYXBwZW5zIGludGVyYWN0aXZlbHkuICAqLworCisjZGVmaW5lIE1PX1NFVE1FTV9JTlRFUkFDVElWRSAweDgwMDAKKworLyogSWYgc2V0LCB0aGVuIG1lbW9yeSBkdW1wcyBhcmUgYWx3YXlzIG9uIDE2LWJ5dGUgYm91bmRhcmllcywgZXZlbgorICAgd2hlbiBsZXNzIGlzIGRlc2lyZWQuICAqLworCisjZGVmaW5lIE1PX0dFVE1FTV8xNl9CT1VOREFSWSAweDEwMDAwCisKKy8qIElmIHNldCwgdGhlbiB0aGUgbW9uaXRvciBudW1iZXJzIGl0cyBicmVha3BvaW50cyBzdGFydGluZyBmcm9tIDEuICAqLworCisjZGVmaW5lIE1PX0NMUl9CUkVBS18xX0JBU0VEIDB4MjAwMDAKKworLyogSWYgc2V0LCB0aGVuIHRoZSBtb25pdG9yIGFja3Mgc3JlY29yZHMgd2l0aCBhIHBsdXMgc2lnbi4gICovCisKKyNkZWZpbmUgTU9fU1JFQ19BQ0tfUExVUyAweDQwMDAwCisKKy8qIElmIHNldCwgdGhlbiB0aGUgbW9uaXRvciAiYWNrcyIgc3JlY29yZHMgd2l0aCByb3RhdGluZyBsaW5lcy4gICovCisKKyNkZWZpbmUgTU9fU1JFQ19BQ0tfUk9UQVRFIDB4ODAwMDAKKworLyogSWYgc2V0LCB0aGVuIHJlbW92ZSB1c2VsZXNzIGFkZHJlc3MgYml0cyBmcm9tIG1lbW9yeSBhZGRyZXNzZXMuICAqLworCisjZGVmaW5lIE1PX0FERFJfQklUU19SRU1PVkUgMHgxMDAwMDAKKworLyogSWYgc2V0LCB0aGVuIGRpc3BsYXkgdGFyZ2V0IHByb2dyYW0gb3V0cHV0IGlmIHByZWZpeGVkIGJ5IF5PLiAgKi8KKworI2RlZmluZSBNT19QUklOVF9QUk9HUkFNX09VVFBVVCAweDIwMDAwMAorCisvKiBTb21lIGR1bXAgYnl0ZXMgY29tbWFuZHMgYWxpZ24gdGhlIGZpcnN0IGRhdGEgd2l0aCB0aGUgcHJlY2VlZGluZworMTYgYnl0ZSBib3VuZGFyeS4gU29tZSBwcmludCBibGFua3MgYW5kIHN0YXJ0IGF0IHRoZSBleGFjdGx5IHRoZQorcmVxdWVzdGVkIGJvdW5kYXJ5LiAqLworCisjZGVmaW5lIE1PX0VYQUNUX0RVTVBBRERSIDB4NDAwMDAwCisKKy8qIFJhdGhlciBlbnRlcmluZyBhbmQgZXhpdGluZyB0aGUgd3JpdGUgbWVtb3J5IGRpYWxvZyBmb3IgZWFjaCB3b3JkIGJ5dGUsCisgICB3ZSBjYW4gc2F2ZSB0aW1lIGJ5IHRyYW5zZmVycmluZyB0aGUgd2hvbGUgYmxvY2sgd2l0aG91dCBleGl0aW5nCisgICB0aGUgbWVtb3J5IGVkaXRpbmcgbW9kZS4gWW91IG9ubHkgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzCisgICBpZiB5b3UgYXJlIGRvaW5nIG1lbW9yeSBkb3dubG9hZGluZy4KKyAgIFRoaXMgZW5nYWdlcyBhIG5ldyB3cml0ZSBmdW5jdGlvbiByZWdpc3RlcmVkIHdpdGggZGNhY2hlLgorICAgKi8KKyNkZWZpbmUgTU9fSEFTX0JMT0NLV1JJVEVTIDB4ODAwMDAwCisKKyNkZWZpbmUgU1JFQ19TSVpFIDE2MAorCitleHRlcm4gdm9pZCBtb25pdG9yX29wZW4gUEFSQU1TICgoY2hhciAqYXJncywgc3RydWN0IG1vbml0b3Jfb3BzICpvcHMsCisJCQkJICBpbnQgZnJvbV90dHkpKTsKK2V4dGVybiB2b2lkIG1vbml0b3JfY2xvc2UgUEFSQU1TICgoaW50IHF1aXR0aW5nKSk7CitleHRlcm4gY2hhciAqbW9uaXRvcl9zdXBwbHlfcmVnaXN0ZXIgUEFSQU1TICgoaW50IHJlZ25vLCBjaGFyICp2YWxzdHIpKTsKK2V4dGVybiBpbnQgbW9uaXRvcl9leHBlY3QgUEFSQU1TICgoY2hhciAqcHJvbXB0LCBjaGFyICpidWYsIGludCBidWZsZW4pKTsKK2V4dGVybiBpbnQgbW9uaXRvcl9leHBlY3RfcHJvbXB0IFBBUkFNUyAoKGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikpOworZXh0ZXJuIHZvaWQgbW9uaXRvcl9wcmludGYgUEFSQU1TICgoY2hhciAqLCAuLi4pKQorICAgICBBVFRSX0ZPUk1BVChwcmludGYsIDEsIDIpOworZXh0ZXJuIHZvaWQgbW9uaXRvcl9wcmludGZfbm9lY2hvIFBBUkFNUyAoKGNoYXIgKiwgLi4uKSkKKyAgICAgQVRUUl9GT1JNQVQocHJpbnRmLCAxLCAyKTsKK2V4dGVybiB2b2lkIG1vbml0b3Jfd3JpdGUgUEFSQU1TICgoY2hhciAqYnVmLCBpbnQgYnVmbGVuKSk7CitleHRlcm4gaW50IG1vbml0b3JfcmVhZGNoYXIgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIGNoYXIgKm1vbml0b3JfZ2V0X2Rldl9uYW1lIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGluaXRfbW9uaXRvcl9vcHMgUEFSQU1TICgoc3RydWN0IHRhcmdldF9vcHMgKikpOworZXh0ZXJuIGludCBtb25pdG9yX2R1bXBfcmVnX2Jsb2NrIFBBUkFNUygoY2hhciAqIGR1bXBfY21kKSkgOworZXh0ZXJuIHZvaWQgZmx1c2hfbW9uaXRvcl9kY2FjaGUgUEFSQU1TICgodm9pZCkpOwpkaWZmIC0tZ2l0IGEvZ2RiL21wdy1jb25maWcuaW4gYi9nZGIvbXB3LWNvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDA3ODc4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL21wdy1jb25maWcuaW4KQEAgLTAsMCArMSw4MSBAQAorIyBDb25maWd1cmF0aW9uIGZyYWdtZW50IGZvciBHREIuCisKK0lmICJ7aG9zdF9jYW5vbmljYWx9IiA9fiAvbTY4ay1hcHBsZS1tcHcvCisJZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6bTY4azp4bS1tcHcuaCB4bS5oCisJU2V0IHNpb3dfbGliICcie0xpYnJhcmllc30iU0lPVy5vJworCitFbHNlIElmICJ7aG9zdF9jYW5vbmljYWx9IiA9fiAvcG93ZXJwYy1hcHBsZS1tcHcvCisJZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6cG93ZXJwYzp4bS1tcHcuaCB4bS5oCisJU2V0IHNpb3dfbGliICcie1BQQ0xpYnJhcmllc30iUFBDU0lPVy5vJworCitFbmQgSWYKKworU2V0IHhkZXBmaWxlcyAnIntvfSJtYWMteGRlcC5jLm8nCisKK1NldCBlbmFibGVfY2ZsYWdzICIiCisKKyMgTWFrZSBhIGNvcHkgb2YgdGhpcyBmaWxlIGFuZCBnaXZlIGl0IGEgZGlmZmVyZW50IG5hbWUsIHNvIGl0CisjIHdvbid0IGJlIGNvbmZ1c2VkIHdpdGggR0RCJ3Mgc2VyaWFsLmguCisKK0R1cGxpY2F0ZSAteSAie0NJbmNsdWRlc30iU2VyaWFsLmggTWFjU2VyaWFsLmgKKworRWNobyAiLyogZHVtbXkgKi8iID50ZXJtaW8uaAorCitJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbTY4ay1hcHBsZS1tYWNvcy8KKwlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzptNjhrOnRtLW1hYy5oIHRtLmgKKwlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzptNjhrOnRtLW02OGsuaCAnbTY4ay90bS1tNjhrLmgnCisJU2V0IHRkZXBmaWxlcyAnIntvfSJtNjhrLXRkZXAuYy5vJworCitFbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9wb3dlcnBjLWFwcGxlLW1hY29zLworCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOnBvd2VycGM6dG0tbWFjb3MuaCB0bS5oCisJZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6cnM2MDAwOnRtLXJzNjAwMC5oICdyczYwMDAvdG0tcnM2MDAwLmgnCisJU2V0IHRkZXBmaWxlcyAnIntvfSJyczYwMDAtdGRlcC5jLm8gIntvfSJ4Y29mZnJlYWQuYy5vJworCitFbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9pMzg2LXVua25vd24tZ28zMi8KKwlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzppMzg2OnRtLWkzODZ2LmggdG0uaAorCVNldCB0ZGVwZmlsZXMgJyJ7b30iaTM4Ni10ZGVwLmMubycKKworRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbWlwcy1pZHQtZWNvZmYvCisJZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6bWlwczp0bS1lbWJlZC5oIHRtLmgKKwlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzptaXBzOnRtLWJpZ21pcHMuaCAnbWlwcy90bS1iaWdtaXBzLmgnCisJZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6bWlwczp0bS1taXBzLmggJ21pcHMvdG0tbWlwcy5oJworCVNldCB0ZGVwZmlsZXMgJyJ7b30ibWlwcy10ZGVwLmMubyAie299InJlbW90ZS1taXBzLmMubycKKworRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvc2gtaGl0YWNoaS1obXMvCisJZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6c2g6dG0tc2guaCB0bS5oCisJU2V0IHRkZXBmaWxlcyAnIntvfSJzaC10ZGVwLmMubycKKworRW5kIElmCisKK0lmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9tNjhrLWFwcGxlLW1hY29zLworCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOm02OGs6bm0tbWFjb3MuaCBubS5oCisJU2V0IG5hdGRlcGZpbGVzICcie299Im1hYy1uYXQuYy5vJworCitFbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9wb3dlcnBjLWFwcGxlLW1hY29zLworCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOnBvd2VycGM6bm0tbWFjb3MuaCBubS5oCisJU2V0IG5hdGRlcGZpbGVzICcie299Im1hYy1uYXQuYy5vJworCitFbHNlCisJZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6bm0tZW1wdHkuaCBubS5oCisJU2V0IG5hdGRlcGZpbGVzICcgJworCitFbmQgSWYKKworRWNobyAnIyBGcm9tIG1wdy1jb25maWcuaW4nCQkJCSA+ICJ7b30ibWsudG1wCitFY2hvICJUREVQRklMRVMgPSAiIHt0ZGVwZmlsZXN9CQkJCT4+ICJ7b30ibWsudG1wCitFY2hvICJYREVQRklMRVMgPSAiIHt4ZGVwZmlsZXN9CQkJCT4+ICJ7b30ibWsudG1wCitFY2hvICJOQVRERVBGSUxFUyA9ICIge25hdGRlcGZpbGVzfQkJCT4+ICJ7b30ibWsudG1wCitFY2hvICJYTV9BRERfRklMRVMgPSAiCQkJCQk+PiAie299Im1rLnRtcAorRWNobyAiVE1fQUREX0ZJTEVTID0gIgkJCQkJPj4gIntvfSJtay50bXAKK0VjaG8gIk5BVF9BRERfRklMRVMgPSAiCQkJCQk+PiAie299Im1rLnRtcAorRWNobyAiWE1fQ0RFUFMgPSAiCQkJCQk+PiAie299Im1rLnRtcAorRWNobyAiVE1fQ0RFUFMgPSAiCQkJCQk+PiAie299Im1rLnRtcAorRWNobyAiTkFUX0NERVBTID0gIgkJCQkJPj4gIntvfSJtay50bXAKK0VjaG8gIlNJT1dfTElCID0gIiB7c2lvd19saWJ9CQkJCT4+ICJ7b30ibWsudG1wCitFY2hvICJFTkFCTEVfQ0ZMQUdTID0gIiB7ZW5hYmxlX2NmbGFnc30JCQk+PiAie299Im1rLnRtcAorRWNobyAnIyBFbmQgZnJvbSBtcHctY29uZmlnLmluJwkJCQk+PiAie299Im1rLnRtcAorCitFY2hvICcvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBtcHctY29uZmlndXJlLiAgKi8nCSA+ICJ7b30iY29uZmlnLm5ldworRWNobyAnI2luY2x1ZGUgIm1wdy5oIicJCQkJCT4+ICJ7b30iY29uZmlnLm5ldworCitNb3ZlSWZDaGFuZ2UgIntvfSJjb25maWcubmV3ICJ7b30iY29uZmlnLmgKZGlmZiAtLWdpdCBhL2dkYi9tcHctbWFrZS5zZWQgYi9nZGIvbXB3LW1ha2Uuc2VkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNmE5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbXB3LW1ha2Uuc2VkCkBAIC0wLDAgKzEsMTc4IEBACisjIFNlZCBjb21tYW5kcyB0aGF0IGZpbmlzaCB0cmFuc2xhdGluZyB0aGUgR0RCIFVuaXggTWFrZWZpbGUgdG8gTVBXIHN5bnRheC4KKworL15ob3N0X2FsaWFzID0vcy9eLyMvCisvXnRhcmdldF9hbGlhcyA9L3MvXi8jLworCisvXmhvc3RfbWFrZWZpbGVfZnJhZ0AkL2QKKy9edGFyZ2V0X21ha2VmaWxlX2ZyYWdAJC9kCisKKy9ARU5BQkxFX0NGTEFHU0Avcy9ARU5BQkxFX0NGTEFHU0Ave0VOQUJMRV9DRkxBR1N9L2cKKy9eRU5BQkxFX0NGTEFHUz0vcy9eLyMvCisKKyMgRWRpdCBhbGwgdGhlIHN5bWJvbGljIGRlZmluaXRpb25zIHBvaW50aW5nIHRvIHZhcmlvdXMgbGlicmFyaWVzIGFuZCBzdWNoLgorCisvXklOQ0xVREVfRElSID0gL3MvIntzcmNkaXJ9IjppbmNsdWRlLyJ7dG9wc3JjZGlyfSJpbmNsdWRlOi8KKworL15NTUFMTE9DX0RJUiA9IC9zLzo6bW1hbGxvYy9tbWFsbG9jOi8KKy9eTU1BTExPQ19TUkMgPSAvcy8ie3NyY2Rpcn0iLyJ7dG9wc3JjZGlyfSIvCisvXk1NQUxMT0MgPS9zLz0uKiQvPS8KKy9NTUFMTE9DX0NGTEFHUyA9L3MvPS4qJC89IC11IFVTRV9NTUFMTE9DLworCisvXkJGRF9ESVIgPSAvcy86OmJmZC9iZmQ6LworL15CRkQgPSAvcy97QkZEX0RJUn06bGliYmZkL3tCRkRfRElSfWxpYmJmZC8KKy9eQkZEX1NSQyA9IC9zLyJ7c3JjZGlyfSIvInt0b3BzcmNkaXJ9Ii8KKworL15SRUFETElORV9ESVIgPSAvcy86OnJlYWRsaW5lL3JlYWRsaW5lOi8KKy9eUkVBRExJTkUgPS9zLz0uKiQvPS8KKy9eUkVBRExJTkVfU1JDID0gL3MvIntzcmNkaXJ9Ii8ie3RvcHNyY2Rpcn0iLworCisvXklOQ0xVREVfQ0ZMQUdTID0gL3MvJC8gLWkgInt0b3BzcmNkaXJ9ImluY2x1ZGU6bXB3OiAtaSA6OmV4dHJhLWluY2x1ZGU6LworCisvXlNFUl9IQVJEV0lSRSA9L3Mvc2VyLXVuaXgvc2VyLW1hYy8KKworL15URVJNQ0FQID0vcy8gPS4qJC8gPS8KKworIyBXaGFjayBvdXQgdmFyaW91cyBhdXRvY29uZiB2YXJzIHRoYXQgd2UgZG9uJ3QgbmVlZC4KKy9AQ09ORklHX0xERkxBR1NAL3MvQENPTkZJR19MREZMQUdTQC8vZworL0BITERGTEFHU0Avcy9ASExERkxBR1NALy9nCisvQERFRlNAL3MvQERFRlNALy9nCisvQFlBQ0NAL3MvQFlBQ0NAL2J5YWNjL2cKKy9ARU5BQkxFX09CU0Avcy9ARU5BQkxFX09CU0AvL2cKKy9ARU5BQkxFX0NMSUJTQC9zL0BFTkFCTEVfQ0xJQlNALy9nCisvQExJQlNAL3MvQExJQlNALy9nCisKKyMgV2hhY2sgb3V0IGF1dG9jb25mIGhvb2sgZm9yIHRocmVhZCBkZWJ1Z2dpbmcuCisvQFRIUkVBRF9EQl9PQlNAL3MvQFRIUkVBRF9EQl9PQlNALy9nCisKKyMgRml4IHVwIHBhdGhzIHRvIGluY2x1ZGUgZGlyZWN0b3JpZXMuCisvSU5DTFVERV9ESVIvcy8ie3N9IntJTkNMVURFX0RJUn0ve0lOQ0xVREVfRElSfS9nCisvSU5DTFVERV9ESVIvcy97SU5DTFVERV9ESVJ9Oi97SU5DTFVERV9ESVJ9L2cKKy9JTkNMVURFX0RJUi9zLyJ7SU5DTFVERV9ESVJ9IjovIntJTkNMVURFX0RJUn0iL2cKKworL3tCRkRfRElSfS9zLyJ7QkZEX0RJUn0iOi8ie0JGRF9ESVJ9Ii9nCisve0JGRF9ESVJ9L3MvXChbIAldXCl7QkZEX0RJUn0vXDE6OntCRkRfRElSfS9nCisve0JGRF9ESVJ9L3MvXChbIAldXCkie0JGRF9ESVJ9Ii9cMTo6IntCRkRfRElSfSIvZworCisve0JGRF9TUkN9L3MvIntzfSJ7QkZEX1NSQ30ve0JGRF9TUkN9L2cKKy97QkZEX1NSQ30vcy97QkZEX1NSQ306L3tCRkRfU1JDfS9nCisKKy97UkVBRExJTkVfU1JDfS9zLyJ7c30ie1JFQURMSU5FX1NSQ30ve1JFQURMSU5FX1NSQ30vZworCisvXnJlYWRsaW5lX2hlYWRlcnMgPS8sL14kL2NcCityZWFkbGluZV9oZWFkZXJzID1cCisKKworIyBUaGlzIGlzbid0IHJlYWxseSB1c2VmdWwsIGFuZCBzZWVtcyB0byBjYXVzZSBub25zZW5zaWNhbCBjb21wbGFpbnRzLgorL3tBTExERVBGSUxFU30vcy97QUxMREVQRklMRVN9Ly9nCisKKy9eY29weWluZy5jIFxcT3B0aW9uLWYgLywvXiQvZAorCisjIEZpeCB0aGUgc3ludGF4IG9mIGJpdHMgb2YgQyBjb2RlIHRoYXQgZ28gaW50byB2ZXJzaW9uLmMuCisvY2hhciAvcy8nY2hhciAuT3B0aW9uLXgvJ2NoYXIgKi8KKworIyBQb2ludCBhdCBmaWxlcyBpbiB0aGUgb2JqIGRpciByYXRoZXIgdGhhbiBzcmMgZGlyLgorL3ZlcnNpb24vcy8ie3N9InZlcnNpb25cLmMvIntvfSJ2ZXJzaW9uLmMvZworL3ZlcnNpb24vcy9edmVyc2lvblwuYy8ie299InZlcnNpb24uYy8KKy9jb25maWcvcy8ie3N9ImNvbmZpZ1wuaC8ie299ImNvbmZpZy5oL2cKKy9jb25maWcvcy9eY29uZmlnXC5oLyJ7b30iY29uZmlnLmgvCisveG0vcy8ie3N9InhtXC5oLyJ7b30ieG0uaC9nCisveG0vcy9eeG1cLmgvIntvfSJ4bS5oLworL3RtL3MvIntzfSJ0bVwuaC8ie299InRtLmgvZworL3RtL3MvXnRtXC5oLyJ7b30idG0uaC8KKy9ubS9zLyJ7c30ibm1cLmgvIntvfSJubS5oL2cKKy9ubS9zL15ubVwuaC8ie299Im5tLmgvCisKKy9leHAudGFiLmMvcy8ie3N9IlwoW2EtejAtOV0qXCktZXhwXC50YWJcLmMvIntvfSJcMS1leHAudGFiLmMvZworL2V4cC50YWIuYy9zL15cKFthLXowLTldKlwpLWV4cFwudGFiXC5jLyJ7b30iXDEtZXhwLnRhYi5jLworCisveS50YWIvcy8ie3N9InkudGFiXC5jLyJ7b30ieS50YWIuYy9nCisveS50YWIvcy9eeS50YWJcLmMvIntvfSJ5LnRhYi5jLworCisvaW5pdC9zLyJ7c30iaW5pdFwuYy10bXAvIntvfSJpbml0LmMtdG1wL2cKKy9pbml0L3MvXmluaXRcLmMtdG1wLyJ7b30iaW5pdC5jLXRtcC8KKy9pbml0L3MvIntzfSJpbml0XC5jLyJ7b30iaW5pdC5jL2cKKy9pbml0L3MvXmluaXRcLmMvIntvfSJpbml0LmMvCisKKyMgRml4IHVwIHRoZSBnZW5lcmF0aW9uIG9mIHZlcnNpb24uYy4KKy8ie299InZlcnNpb24uYyBcXE9wdGlvbi1mIE1ha2VmaWxlLywvXiQvY1wKKyJ7b30idmVyc2lvbi5jIFxcT3B0aW9uLWYgTWFrZWZpbGVcCisJZWNobyAtbiAnY2hhciAqdmVyc2lvbiA9ICInCSA+IntvfSJ2ZXJzaW9uLmNcCisJZWNobyAtbiAie1ZFUlNJT059IgkJPj4ie299InZlcnNpb24uY1wKKwllY2hvICciOycJCQk+PiJ7b30idmVyc2lvbi5jXAorCWVjaG8gLW4gJ2NoYXIgKmhvc3RfbmFtZSA9ICInCT4+IntvfSJ2ZXJzaW9uLmNcCisJZWNobyAtbiAie2hvc3RfYWxpYXN9IgkJPj4ie299InZlcnNpb24uY1wKKwllY2hvICciOycJCQk+PiJ7b30idmVyc2lvbi5jXAorCWVjaG8gLW4gJ2NoYXIgKnRhcmdldF9uYW1lID0gIicJPj4ie299InZlcnNpb24uY1wKKwllY2hvIC1uICJ7dGFyZ2V0X2FsaWFzfSIJPj4ie299InZlcnNpb24uY1wKKwllY2hvICciOycJCQk+PiJ7b30idmVyc2lvbi5jXAorCisKKy9hbnNpZGVjbC9zL2luY2x1ZGUgIntzfSIiYW5zaWRlY2wuaCIvaW5jbHVkZSAiYW5zaWRlY2wuaCIvCisKKyMgT3Blbi1icmFjZSBpbiBhIGNvbW1hbmQgY2F1c2VzIG11Y2ggY29uZnVzaW9uOyByZXBsYWNlIHdpdGggdGhlCisjIHJlc3VsdCBmcm9tIGEgc2NyaXB0LgorL2luaXRpYWxpemVfYWxsX2ZpbGVzICgpL2NcCisJRWNobyAtbiAndm9pZCBpbml0aWFsaXplX2FsbF9maWxlcyAoKSAnID4+ICJ7b30iaW5pdC5jLXRtcFwKKwlvcGVuLWJyYWNlID4+ICJ7b30iaW5pdC5jLXRtcAorCisjIFJlcGxhY2UgdGhlIHdob2xlIHNlZCBiaXQgZm9yIGluaXQuYzsgaXQncyBzaW1wbGVyIHRoYXQgd2F5Li4uCisvZWNobyB7T0JTfSB7VFNPQlN9LywvZWNobyAnfScvY1wKKwlGb3IgaSBpbiB7T0JTfSB7VFNPQlN9XAorICAgICAgICAgIFNldCBmaWxlbmFtZSAiYEVjaG8ge2l9IHwgc2VkIFxcT3B0aW9uLWRcCisgICAgICAgICAgICAtZSAnL15PbmluZHkuYy5vL2QnIFxcT3B0aW9uLWRcCisgICAgICAgICAgICAtZSAnL15uaW5keS5jLm8vZCcgXFxPcHRpb24tZFwKKyAgICAgICAgICAgIC1lICcvdHR5Zmx1c2guYy5vL2QnIFxcT3B0aW9uLWRcCisgICAgICAgICAgICAtZSAnL3hkcl9sZC5jLm8vZCcgXFxPcHRpb24tZFwKKyAgICAgICAgICAgIC1lICcveGRyX3B0cmFjZS5jLm8vZCcgXFxPcHRpb24tZFwKKyAgICAgICAgICAgIC1lICcveGRyX3JkYi5jLm8vZCcgXFxPcHRpb24tZFwKKyAgICAgICAgICAgIC1lICcvdWRyLmMuby9kJyBcXE9wdGlvbi1kXAorICAgICAgICAgICAgLWUgJy91ZGlwMnNvYy5jLm8vZCcgXFxPcHRpb24tZFwKKyAgICAgICAgICAgIC1lICcvdWRpMmdvMzIuYy5vL2QnIFxcT3B0aW9uLWRcCisgICAgICAgICAgICAtZSAnL3ZlcnNpb24uYy5vL2QnIFxcT3B0aW9uLWRcCisgICAgICAgICAgICAtZSAnL1thLXowLTlBLVpfXSotZXhwLnRhYi5jLm8vZCcgXFxPcHRpb24tZFwKKyAgICAgICAgICAgIC1lICdzL1xcLmNcXC5vLy5jLycgXFxPcHRpb24tZFwKKyAgICAgICAgICAgIC1lICdzL146Ly8nYCJcCisgICAgICAgICAgSWYgIntmaWxlbmFtZX0iICE9ICIiXAorICAgICAgICAgICAgc2VkIDwie3N9IiJ7ZmlsZW5hbWV9IiA+PiJ7b30iaW5pdC5jLXRtcCAtbiBcXE9wdGlvbi1kXAorICAgICAgICAgICAgLWUgJy9eX2luaXRpYWxpemVfW2Etel8wLTlBLVpdKiAqKC9zL15cXChbYS16XzAtOUEtWl0qXFwpLiovICB7ZXh0ZXJuIHZvaWQgXFwxICgpOyBcXDEgKCk7fS9wJ1wKKyAgICAgICAgICBFbmQgSWZcCisJRW5kIEZvclwKKwlFY2hvICd9JyA+PiJ7b30iaW5pdC5jLXRtcAorCisjIEZpeCB0aGUgbWFpbiBjb21waWxlL2xpbmsgY29tbWFuZC4KKy97Q0NfTER9IHtJTlRFUk5BTF9MREZMQUdTfSAtbyBnZGIvLC8ie299ImluaXQuYy5vIHtPQlN9IHtUU09CU30ge0FERF9GSUxFU30ge0NMSUJTfSB7TE9BRExJQkVTfS9jXAorCXtDQ19MRH0ge0lOVEVSTkFMX0xERkxBR1N9IC1vIGdkYntQUk9HX0VYVH0gIntvfSJpbml0LmMubyB7T0JTfSB7VFNPQlN9IHtBRERfRklMRVN9IHtDTElCU30ge0xPQURMSUJFU30ge0VYVFJBTElCU31cCisJe01BS0VQRUZ9IGdkYntQUk9HX0VYVH0gLW8gZ2RiIHtNQUtFUEVGX1RPT0xfRkxBR1N9IHtNQUtFUEVGX0ZMQUdTfVwKKwl7UkVafSAie3N9Im1hYy1nZGIuciAtbyBnZGIgLWFwcGVuZCAtZCBQUk9HX05BTUU9JyInZ2RiJyInIC1kIFZFUlNJT05fU1RSSU5HPSciJ3t2ZXJzaW9ufSciJ1wKKworIyBSZXBsYWNlIHRoZSBpbnN0YWxsIGFjdGlvbnMgd2l0aCBNUFctZnJpZW5kbHkgc2NyaXB0LgorL15pbnN0YWxsIFxcT3B0aW9uLWYgLywvXiQvY1wKK2luc3RhbGwgXFxPcHRpb24tZiBhbGwgaW5zdGFsbC1vbmx5XAorXAoraW5zdGFsbC1vbmx5IFxcT3B0aW9uLWYgXAorCU5ld0ZvbGRlclJlY3Vyc2l2ZSAie2JpbmRpcn0iXAorCUR1cGxpY2F0ZSAteSBnZGIgIntiaW5kaXJ9ImdkYlwKKwlJZiAiYEV4aXN0cyBTaW93R0RCYCIgIT0gIiJcCisJCUR1cGxpY2F0ZSAteSBTaW93R0RCICJ7YmluZGlyfSJTaW93R0RCXAorCUVuZCBJZlwKKworCisjIERvbid0IGRvIGFueSByZWN1cnNpdmUgc3ViZGlyIHN0dWZmLgorLyBzdWJkaXJfZG8vcy97TUFLRX0vbnVsbC1jb21tYW5kLworCisjIEVkaXQgb3V0IGFjdGlvbnMgdGhhdCBvbmx5IGNvbmZ1c2UgTVBXIE1ha2UuCisvXmNvbmZpZy5zdGF0dXMgXFxPcHRpb24tZi8sL14kL2QKKy9eTWFrZWZpbGUgXFxPcHRpb24tZi8sL14kL2QKKworIyBEb24ndCB0ZXN0IGNvbmZpZy5oIGRlcGVuZGVuY2llcy4KKy9eIntvfSJjb25maWcuaCBcXE9wdGlvbi1mL3MvXi8jLworCisjIEFkZCBhbiBhY3Rpb24gdG8gYnVpbGQgU0lPV2dkYi4KKyRhXAorU0lPV2dkYiBcXE9wdGlvbi1mIHtPQlN9IHtUU09CU30ge0FERF9ERVBTfSB7Q0RFUFN9ICJ7b30iaW5pdC5jLm9cCisJRGVsZXRlIC1pIC15IFNJT1dnZGJcCisJe0NDX0xEfSB7SU5URVJOQUxfTERGTEFHU30gLXQgJ0FQUEwnIC1jICdnZGIgJyAtbyBTSU9XZ2Rie1BST0dfRVhUfSAie299ImluaXQuYy5vIHtPQlN9IHtUU09CU30ge0FERF9GSUxFU30ge0NMSUJTfSB7U0lPV19MSUJ9IHtMT0FETElCRVN9IHtFWFRSQUxJQlN9XAorCXtNQUtFUEVGfSBTSU9XZ2Rie1BST0dfRVhUfSAtbyBTSU9XZ2RiIC1mdCAnQVBQTCcgLWZjICdnZGIgJyB7TUFLRVBFRl9GTEFHU30gXAorCXtSRVp9IC1vIFNJT1dnZGIgIntSSW5jbHVkZXN9InNpb3cuciAtYXBwZW5kIC1kIF9fa1ByZWZTaXplPTUwMDAgLWQgX19rTWluU2l6ZT0yMDAwIC1kIEFQUE5BTUU9JyInU0lPV2dkYiciJyBcCisJe1JFWn0gIntzfSJtYWMtZ2RiLnIgLW8gU0lPV2dkYiAtYXBwZW5kIC1kIFZFUlNJT05fU1RSSU5HPSciJ3t2ZXJzaW9ufSciJ1wKKwpkaWZmIC0tZ2l0IGEvZ2RiL21zZy5kZWZzIGIvZ2RiL21zZy5kZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOWZjZDEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbXNnLmRlZnMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGh1cmQvbXNnLmRlZnM+CmRpZmYgLS1naXQgYS9nZGIvbXNnX3JlcGx5LmRlZnMgYi9nZGIvbXNnX3JlcGx5LmRlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5YmZhOAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9tc2dfcmVwbHkuZGVmcwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8aHVyZC9tc2dfcmVwbHkuZGVmcz4KZGlmZiAtLWdpdCBhL2dkYi9uZXdzLXhkZXAuYyBiL2dkYi9uZXdzLXhkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjU3YWViCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL25ld3MteGRlcC5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qIExvdyBsZXZlbCBpbnRlcmZhY2UgdG8gcHRyYWNlLCBmb3IgR0RCIHdoZW4gcnVubmluZyB1bmRlciBVbml4LgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZmRlZiBfX0dOVUNfXworLyogQmFkIGltcGxlbWVudCBleGVjbGUoMykuIEl0J3MgZGVwZW5kIGZvciAiL2Jpbi9jYyIuCisKKyAgIG1haW4oKQorICAgeworICAgICBwcmludGYoImV4ZWNsZTpcbiIpOworICAgICBleGVjbGUoRklMRSwgQVJHUywgZW52cCk7CisgICAgIGV4aXQoMSk7CisgICB9CisKKyAgIEdDQzoKKyAgIGxpbmsgYTYsIzAKKyAgIHBlYSBMQzUJOyBjYWxsIHByaW50ZgorICAgamJzciBfcHJpbnRmCisgICA7CQk7IChub3QgcG9wZCBzdGFjaykKKyAgIHBlYSBfZW52cAk7IGNhbGwgZXhlY2xlCisgICBjbHJsIHNwQC0KKyAgIHBlYSBMQzQKKyAgIHBlYSBMQzQKKyAgIHBlYSBMQzQKKyAgIHBlYSBMQzMKKyAgIHBlYSBMQzYKKyAgIGpic3IgX2V4ZWNsZQorICAgYWRkdyAjMzIsc3AJOyBkZWxheWVkIHBvcCAhIQorCisgICAvYmluL2NjOgorICAgbGluay5sCWZwLCNMMjMKKyAgIG1vdmVtLmwJI0wyNCwoc3ApCisgICBwZWEJTDI2CQk7IGNhbGwgcHJpbnRmCisgICBqYnNyCV9wcmludGYKKyAgIGFkZHEubAkjNCxzcAk7IDwtLS0gcG9wZCBzdGFjayAhIQorICAgcGVhCV9lbnZwCQk7IGNhbGwgZXhlY2xlCisgICBjbHIubAktKHNwKQorICAgcGVhCUwzMgorICAgCisgICAqLworCitleGVjbGUobmFtZSwgYXJncykKKyAgICAgY2hhciAqbmFtZSwgKmFyZ3M7Cit7CisgIHJlZ2lzdGVyIGNoYXIJKiplbnYgPSAmYXJnczsKKyAgd2hpbGUgKCplbnYrKykKKyAgICA7CisgIGV4ZWN2ZShuYW1lLCAoY2hhciAqKikmYXJncywgKGNoYXIgKiopKmVudik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2dkYi9uaW5keS1zaGFyZS9NYWtlZmlsZSBiL2dkYi9uaW5keS1zaGFyZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWM5OWJhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL25pbmR5LXNoYXJlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTE3IEBACisjQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1ha2VmaWxlIGZvciB0b29saWIuYSAtLSBob3N0IGNvZGUgc2hBcmVkIGJ5IG1vcmUgdGhhbiBvbmUgdG9vbAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JBTkxJQgk9IHJhbmxpYgorCisjIFRoZSBmb2xsb3dpbmcgbGluZXMgc2hvdWxkIGJlIHVuY29tbWVudGVkIGZvciBzeXN0ZW0gViAoaTM4NnYpLgorI19faTM4NnZfXyNVU0cgPSAtRFVTRworI19faTM4NnZfXyNTWVNWX0lOQ0wgPSAke0lQQVRIfS9zeXN2LmgKKyNfX2kzODZ2X18jUkFOTElCID0gZWNobyA+L2Rldi9udWxsCisKKyMgVGhlIGZvbGxvd2luZyBsaW5lIHNob3VsZCBiZSB1bmNvbW1lbnRlZCBmb3IgSFAtVVgKKyNfX2hwOTAwMF9fI1VTRyA9IC1EVVNHCisjX19ocDkwMDBfXyNTWVNWX0lOQ0wgPSAke0lQQVRIfS9zeXN2LmgKKyNfX2hwOTAwMF9fI1JBTkxJQiA9IGVjaG8gPi9kZXYvbnVsbAorCisjIEVzc2VudGlhbCB1bmRlciBTeXN0ZW0gViwgaGFybWxlc3MgZWxzZXdoZXJlCitTSEVMTCA9IC9iaW4vc2gKKworIydIT1NUJyB3aWxsIGJlIGRlZmluZWQgaW4gdGhlIGhvc3Qtc3BlY2lmaWMgbWFrZWZpbGUgYnkgJ21ha2UgbWFrZScKKworVEFSRwk9IHRvb2xpYi5hCitPUFQJPSAtZworSVBBVEgJPSAuLi8uLi9pbmNsdWRlCitDRkxBR1MgID0gJHtPUFR9ICR7VVNHfSAtSSR7SVBBVEh9IC1ESE9TVD1cIiR7SE9TVH1cIgorT0JKUwk9IGNvZmZzdHJpcC5vIG5pbmR5Lm8gdHR5YnJlYWsubyB0dHlmbHVzaC5vIE9uaW5keS5vCisKKyR7VEFSR306ICR7T0JKU30gVkVSU0lPTgorCW1ha2UgdmVyOTYwLm8KKwlybSAtZiAke1RBUkd9CisJYXIgY3ZyICR7VEFSR30gJHtPQkpTfSB2ZXI5NjAubworCSR7UkFOTElCfSAke1RBUkd9CisKK2NvZmZzdHJpcC5vOgkke0lQQVRIfS9iLm91dC5oICR7SVBBVEh9L2NvZmYuaCAke0lQQVRIfS9zeXN2LmgKK25pbmR5Lm86CSR7SVBBVEh9L2Jsb2NrX2lvLmggJHtJUEFUSH0vZW52LmggJHtJUEFUSH0vc3lzdi5oCituaW5keS5vOgkke0lQQVRIfS90dHljbnRsLmggJHtJUEFUSH0vd2FpdC5oCit0dHlicmVhay5vOgkke0lQQVRIfS90dHljbnRsLmgKK3R0eWZsdXNoLm86CSR7SVBBVEh9L3R0eWNudGwuaAorT25pbmR5Lm86CSR7SVBBVEh9L2Jsb2NrX2lvLmggJHtJUEFUSH0vZW52LmggJHtJUEFUSH0vc3lzdi5oCitPbmluZHkubzoJJHtJUEFUSH0vdHR5Y250bC5oICR7SVBBVEh9L3dhaXQuaAorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIwkJJ1NUQU5EQVJEJyBHTlUvOTYwIFRBUkdFVFMgQkVMT1cgVEhJUyBQT0lOVAorIworIyAnVkVSU0lPTicgZmlsZSBtdXN0IGJlIHByZXNlbnQgYW5kIGNvbnRhaW4gYSBzdHJpbmcgb2YgdGhlIGZvcm0gIngueSIKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2ZXI5NjAuYzogRk9SQ0UKKwlybSAtZiB2ZXI5NjAuYworCWVjaG8gImNoYXIgdG9vbGliX3ZlcltdPSBcIiR7VEFSR30gYGNhdCBWRVJTSU9OYCwgYGRhdGVgXCI7IiA+IHZlcjk2MC5jCisKKworIyBUaGlzIHRhcmdldCBzaG91bGQgYmUgaW52b2tlZCBiZWZvcmUgYnVpbGRpbmcgYSBuZXcgcmVsZWFzZS4KKyMgJ1ZFUlNJT04nIGZpbGUgbXVzdCBiZSBwcmVzZW50IGFuZCBjb250YWluIGEgc3RyaW5nIG9mIHRoZSBmb3JtICJ4LnkiCisjCityb2xsOgorCUBWPWBjYXQgVkVSU0lPTmAJCTsgXAorCU1BSj1gc2VkICdzL1wuLiovLycgVkVSU0lPTmAJOyBcCisJTUlOPWBzZWQgJ3MvLipcLi8vJyBWRVJTSU9OYAk7IFwKKwlWPSQkTUFKLmBleHByICQkTUlOICsgMWAJOyBcCisJcm0gLWYgVkVSU0lPTgkJCTsgXAorCWVjaG8gJCRWID5WRVJTSU9OCQk7IFwKKwllY2hvIFZlcnNpb24gJCRWCisKKyMgRHVtbXkgdGFyZ2V0IHRvIGZvcmNlIGV4ZWN1dGlvbiBvZiBkZXBlbmRlbnQgdGFyZ2V0cy4KKyMKK0ZPUkNFOgorCisjICdHOTYwQkFTRScgd2lsbCBiZSBkZWZpbmVkIGF0IGludm9jYXRpb24KKyMKK2luc3RhbGw6CisJbWFrZSAke1RBUkd9CisJbXYgLWYgJHtUQVJHfSAke0c5NjBCQVNFfS9saWIKKworY2xlYW46CisJcm0gLWYgJHtUQVJHfSAqLm8gY29yZQorCisjIFRhcmdldCB0byB1bmNvbW1lbnQgaG9zdC1zcGVjaWZpYyBsaW5lcyBpbiB0aGlzIG1ha2VmaWxlLiAgU3VjaCBsaW5lcyBtdXN0CisjIGhhdmUgdGhlIGZvbGxvd2luZyBzdHJpbmcgYmVnaW5uaW5nIGluIGNvbHVtbiAxOiAjX188aG9zdG5hbWU+X18jCisjIE9yaWdpbmFsIE1ha2VmaWxlIGlzIGJhY2tlZCB1cCBhcyAnTWFrZWZpbGUub2xkJy4KKyMKKyMgSW52b2tlIHdpdGg6ICBtYWtlIG1ha2UgSE9TVD14eHgKKyMKK21ha2U6CisJLUBpZiB0ZXN0ICQoSE9TVCl4ID0geCA7IHRoZW4gXAorCQllY2hvICcHU3BlY2lmeSAibWFrZSBtYWtlIEhPU1Q9Pz8/Iic7IFwKKwkJZXhpdCAxOyBcCisJZmkgOyBcCisJZ3JlcCAtcyAiXiNUaGUgbmV4dCBsaW5lIHdhcyBnZW5lcmF0ZWQgYnkgJ21ha2UgbWFrZSciIE1ha2VmaWxlOyBcCisJaWYgdGVzdCAkJD8gPSAwIDsgdGhlbglcCisJCWVjaG8gIgdNYWtlZmlsZSBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCB3aXRoICdtYWtlIG1ha2UnIjtcCisJCWV4aXQgMTsgXAorCWZpIDsgXAorCW12IC1mIE1ha2VmaWxlIE1ha2VmaWxlLm9sZDsgXAorCWVjaG8gIiNUaGUgbmV4dCBsaW5lIHdhcyBnZW5lcmF0ZWQgYnkgJ21ha2UgbWFrZSciCSA+TWFrZWZpbGUgOyBcCisJZWNobyAiSE9TVD0kKEhPU1QpIgkJCQkJPj5NYWtlZmlsZSA7IFwKKwllY2hvCQkJCQkJCT4+TWFrZWZpbGUgOyBcCisJc2VkICJzL14jX18kKEhPU1QpX18jLy8iIDwgTWFrZWZpbGUub2xkCQkJPj5NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvZ2RiL25pbmR5LXNoYXJlL09uaW5keS5jIGIvZ2RiL25pbmR5LXNoYXJlL09uaW5keS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNzI0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbmluZHktc2hhcmUvT25pbmR5LmMKQEAgLTAsMCArMSw3NDMgQEAKKy8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBzdGFydGVkIG91dCBsaWZlIGFzIGNvZGUgc2hhcmVkIGJldHdlZW4gdGhlIG5pbmR5IG1vbml0b3IgYW5kCisgICBHREIuICBGb3IgdmFyaW91cyByZWFzb25zLCB0aGlzIGlzIG5vIGxvbmdlciB0cnVlLiAgRXZlbnR1YWxseSwgaXQKKyAgIHByb2JhYmx5IHNob3VsZCBiZSBtZXJnZWQgaW50byByZW1vdGUtbmluZHkuYy4gICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkgCQlOSU5EWSBJTlRFUkZBQ0UgUk9VVElORVMKKyAqCisgKiBUaGlzIHZlcnNpb24gb2YgdGhlIE5JTkRZIGludGVyZmFjZSByb3V0aW5lcyBzdXBwb3J0cyBOSU5EWSB2ZXJzaW9ucworICogMi4xMyBhbmQgb2xkZXIuICBUaGUgb2xkZXIgdmVyc2lvbnMgdXNlZCBhIGhleCBjb21tdW5pY2F0aW9uIHByb3RvY29sLAorICogaW5zdGVhZCBvZiB0aGUgKGZhc3RlcikgY3VycmVudCBiaW5hcnkgcHJvdG9jb2wuICAgVGhlc2Ugcm91dGluZXMgaGF2ZQorICogYmVlbiByZW5hbWVkIGJ5IHByZXBlbmRpbmcgdGhlIGxldHRlciAnTycgdG8gdGhlaXIgbmFtZXMsIHRvIGF2b2lkCisgKiBjb25mbGljdCB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24uICBUaGUgb2xkIHZlcnNpb25zIGFyZSBrZXB0IG9ubHkgZm9yCisgKiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBhbmQgd2VsbCBkaXNhcHBlYXIgaW4gYSBmdXR1cmUgcmVsZWFzZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEhhdmluZyB0aGVzZSBpbiBhIHNlcGFyYXRlIGZpbGUgZnJvbSBuaW5keS5jIGlzIHJlYWxseSB1Z2x5LCBhbmQgc2hvdWxkCisgICBiZSBtZXJnZWQgd2l0aCBuaW5keS5jLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWYgMAorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgkvKiBOZWVkZWQgYnkgZmlsZS5oIG9uIFN5cyBWICovCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CS8qIE5lZWRlZCBvbiBTeXMgViAqLworI2luY2x1ZGUgInR0eWNudGwuaCIKKyNlbmRpZgorI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJzZXJpYWwuaCIKKworI2luY2x1ZGUgImJsb2NrX2lvLmgiCisjaW5jbHVkZSAid2FpdC5oIgorI2luY2x1ZGUgImVudi5oIgorCisvKiBOdW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZSBzZW5kIHRvIG5pbmR5LiAgSSBiZWxpZXZlIHRoaXMgaXMgZGVmaW5lZCBieQorICAgdGhlIHByb3RvY29sIChpdCBkb2VzIG5vdCBhZ3JlZSB3aXRoIFJFR0lTVEVSX0JZVEVTKS4gICovCisjZGVmaW5lIE9MRF9OSU5EWV9SRUdJU1RFUl9CWVRFUyAoKDM2KjQpICsgKDQqOCkpCisKK2V4dGVybiBpbnQgcXVpZXQ7CS8qIDEgPT4gc3RpZmxlIHVubmVjZXNzYXJ5IG1lc3NhZ2VzICovCisKKy8qIHR0eSBjb25uZWN0ZWQgdG8gOTYwL05JTkRZIGJvYXJkLiAgKi8KK2V4dGVybiBzZXJpYWxfdCBuaW5keV9zZXJpYWw7CisKK3N0YXRpYyBPbmluU3RyR2V0KCk7CisMCisJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAqCisJCSAqICBNSVNDRUxMQU5FT1VTIFVUSUxUSUVTICAqCisJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAqCisJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZyb21oZXg6CisgKglDb252ZXJ0IGEgaGV4IGFzY2lpIGRpZ2l0IGggdG8gYSBiaW5hcnkgaW50ZWdlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYworaW50Citmcm9taGV4KCBoICkKKyAgICBpbnQgaDsKK3sKKwlpZiAoaCA+PSAnMCcgJiYgaCA8PSAnOScpeworCQloIC09ICcwJzsKKwl9IGVsc2UgaWYgKGggPj0gJ2EnICYmIGggPD0gJ2YnKXsKKwkJaCAtPSAnYScgLSAxMDsKKwl9IGVsc2UgeworCQloID0gMDsKKwl9CisJcmV0dXJuIChoICYgMHhmZik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaGV4YmluOgorICoJQ29udmVydCBhIHN0cmluZyBvZiBBU0NJSSBoZXggZGlnaXRzIHRvIGEgc3RyaW5nIG9mIGJpbmFyeSBieXRlcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMKK2hleGJpbiggbiwgaGV4cCwgYmlucCApCisgICAgaW50IG47CQkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gY29udmVydCAodHdpY2UgdGhpcyBtYW55IGRpZ2l0cykqLworICAgIGNoYXIgKmhleHA7CQkvKiBHZXQgaGV4IGZyb20gaGVyZQkJKi8KKyAgICBjaGFyICpiaW5wOwkJLyogUHV0IGJpbmFyeSBoZXJlCQkqLworeworCXdoaWxlICggbi0tICl7CisJCSpiaW5wKysgPSAoZnJvbWhleCgqaGV4cCkgPDwgNCkgfCBmcm9taGV4KCooaGV4cCsxKSk7CisJCWhleHAgKz0gMjsKKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogYmluaGV4OgorICoJQ29udmVydCBhIHN0cmluZyBvZiBiaW5hcnkgYnl0ZXMgdG8gYSBzdHJpbmcgb2YgQVNDSUkgaGV4IGRpZ2l0cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYworYmluaGV4KCBuLCBiaW5wLCBoZXhwICkKKyAgICBpbnQgbjsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBieXRlcyB0byBjb252ZXJ0ICAgKi8KKyAgICBjaGFyICpiaW5wOyAgICAgICAgIC8qIEdldCBiaW5hcnkgZnJvbSBoZXJlICAgICAgICAgKi8KKyAgICBjaGFyICpoZXhwOyAgICAgICAgIC8qIFBsYWNlIGhleCBoZXJlICAgICAgICAgICAgICAgKi8KK3sKKwlzdGF0aWMgY2hhciB0b2hleFtdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCisgICAgICAgIHdoaWxlICggbi0tICl7CisgICAgICAgICAgICAgICAgKmhleHArKyA9IHRvaGV4WyAoKmJpbnAgPj4gNCkgJiAweGYgXTsKKyAgICAgICAgICAgICAgICAqaGV4cCsrID0gdG9oZXhbICpiaW5wICYgMHhmIF07CisgICAgICAgICAgICAgICAgYmlucCsrOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGJ5dGVfb3JkZXI6CisgKglJZiB0aGUgaG9zdCBieXRlIG9yZGVyIGlzIGRpZmZlcmVudCBmcm9tIDk2MCBieXRlIG9yZGVyIChpLmUuLCB0aGUKKyAqCWhvc3QgaXMgYmlnLWVuZGlhbiksIHJldmVyc2UgdGhlIGJ5dGVzIGluIHRoZSBwYXNzZWQgdmFsdWU7ICBvdGhlcndpc2UsCisgKglyZXR1cm4gdGhlIHBhc3NlZCB2YWx1ZSB1bmNoYW5nZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYworbG9uZworYnl0ZV9vcmRlciggbiApCisgICAgbG9uZyBuOworeworCWxvbmcgcmV2OworCWludCBpOworCXN0YXRpYyBzaG9ydCB0ZXN0ID0gMHgxMjM0OworCisJaWYgKCooKGNoYXIgKikgJnRlc3QpID09IDB4MTIpIHsKKwkJLyoKKwkJICogQmlnLWVuZGlhbiBob3N0LCBzd2FwIHRoZSBieXRlcy4KKwkJICovCisJCXJldiA9IDA7CisJCWZvciAoIGkgPSAwOyBpIDwgc2l6ZW9mKG4pOyBpKysgKXsKKwkJCXJldiA8PD0gODsKKwkJCXJldiB8PSBuICYgMHhmZjsKKwkJCW4gPj49IDg7CisJCX0KKwkJbiA9IHJldjsKKwl9CisJcmV0dXJuIG47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHNheToKKyAqCVRoaXMgaXMgYSBwcmludGYgdGhhdCB0YWtlcyBhdCBtb3N0IHR3byBhcmd1bWVudHMgKGluIGFkZGl0aW9uIHRvIHRoZQorICoJZm9ybWF0IHN0cmluZykgYW5kIHRoYXQgb3V0cHV0cyBub3RoaW5nIGlmIHZlcmJvc2Ugb3V0cHV0IGhhcyBiZWVuCisgKglzdXBwcmVzc2VkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYworc2F5KCBmbXQsIGFyZzEsIGFyZzIgKQorICAgIGNoYXIgKmZtdDsKKyAgICBpbnQgYXJnMSwgYXJnMjsKK3sKKwlpZiAoICFxdWlldCApeworCQlwcmludGYoIGZtdCwgYXJnMSwgYXJnMiApOworCQlmZmx1c2goIHN0ZG91dCApOworCX0KK30KKwwKKwkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCQkgKiAgTE9XLUxFVkVMIENPTU1VTklDQVRJT04gICoKKwkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAqCisJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmVhZCBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSB0aGUgcmVtb3RlIGVuZC4gICovCisKK3N0YXRpYyBpbnQKK3JlYWRjaGFyKCkKK3sKKyAgLyogRklYTUU6IERvIHdlIHJlYWxseSB3YW50IHRvIGJlIHJlYWRpbmcgd2l0aG91dCBhIHRpbWVvdXQ/ICAqLworICByZXR1cm4gU0VSSUFMX1JFQURDSEFSIChuaW5keV9zZXJpYWwsIC0xKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0cGt0OgorICoJUmVhZCBhIHBhY2tldCBmcm9tIGEgcmVtb3RlIE5JTkRZLCB3aXRoIGVycm9yIGNoZWNraW5nLCBhbmQgcmV0dXJuCisgKglpdCBpbiB0aGUgaW5kaWNhdGVkIGJ1ZmZlci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMKK2dldHBrdCAoYnVmKQorICAgICBjaGFyICpidWY7Cit7CisJdW5zaWduZWQgY2hhciByZWN2OwkvKiBDaGVja3N1bSByZWNlaXZlZAkJKi8KKwl1bnNpZ25lZCBjaGFyIGNzdW07CS8qIENoZWNrc3VtIGNhbGN1bGF0ZWQJCSovCisJY2hhciAqYnA7CQkvKiBQb29pbnRlciBpbnRvIHRoZSBidWZmZXIJKi8KKwlpbnQgYzsKKworCXdoaWxlICgxKXsKKwkJY3N1bSA9IDA7CisJCWJwID0gYnVmOworCQkvKiBGSVhNRTogY2hlY2sgZm9yIGVycm9yIGZyb20gcmVhZGNoYXIgKCkuICAqLworCQl3aGlsZSAoIChjID0gcmVhZGNoYXIoKSkgIT0gJyMnICl7CisJCQkqYnArKyA9IGM7CisJCQljc3VtICs9IGM7CisJCX0KKwkJKmJwID0gMDsKKworCQkvKiBGSVhNRTogY2hlY2sgZm9yIGVycm9yIGZyb20gcmVhZGNoYXIgKCkuICAqLworCQlyZWN2ID0gZnJvbWhleChyZWFkY2hhcigpKSA8PCA0OworCQlyZWN2IHw9IGZyb21oZXgocmVhZGNoYXIoKSk7CisJCWlmICggY3N1bSA9PSByZWN2ICl7CisJCQlicmVhazsKKwkJfQorCQorCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJCYWQgY2hlY2tzdW0gKHJlY3Y9MHglMDJ4OyBjYWxjPTB4JTAyeCk7IHJldHJ5aW5nXHJcbiIsCisJCQkJCQkJCXJlY3YsIGNzdW0gKTsKKwkJU0VSSUFMX1dSSVRFIChuaW5keV9zZXJpYWwsICItIiwgMSk7CisJfQorCisJU0VSSUFMX1dSSVRFIChuaW5keV9zZXJpYWwsICIrIiwgMSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcHV0cGt0OgorICoJQ2hlY2tzdW0gYW5kIHNlbmQgYSBnZGIgY29tbWFuZCB0byBhIHJlbW90ZSBOSU5EWSwgYW5kIHdhaXQgZm9yCisgKglwb3NpdGl2ZSBhY2tub3dsZWRnZW1lbnQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYworcHV0cGt0KCBjbWQgKQorICAgIGNoYXIgKmNtZDsJLyogQ29tbWFuZCB0byBiZSBzZW50LCB3aXRob3V0IGxlYWQgXlAgKFwwMjApCisJCSAqIG9yIHRyYWlsaW5nIGNoZWNrc3VtCisJCSAqLworeworCWNoYXIgYWNrOwkvKiBSZXNwb25zZSByZWNlaXZlZCBmcm9tIE5JTkRZCQkqLworCWNoYXIgY2hlY2tzdW1bNF07CisJY2hhciAqcDsKKwl1bnNpZ25lZCBpbnQgczsKKwljaGFyIHJlc2VuZDsKKworCWZvciAoIHM9J1wwMjAnLCBwPWNtZDsgKnA7IHArKyApeworCQlzICs9ICpwOworCX0KKwlzcHJpbnRmKCBjaGVja3N1bSwgIiMlMDJ4IiwgIHMgJiAweGZmICk7CisKKwkvKiBTZW5kIGNoZWNrc3VtbWVkIG1lc3NhZ2Ugb3ZlciBhbmQgb3ZlciB1bnRpbCB3ZSBnZXQgYSBwb3NpdGl2ZSBhY2sKKwkgKi8KKwlyZXNlbmQgPSAxOworCWRvIHsKKwkJaWYgKCByZXNlbmQgKSB7CisJCSAgU0VSSUFMX1dSSVRFICggbmluZHlfc2VyaWFsLCAiXDAyMCIsIDEgKTsKKwkJICBTRVJJQUxfV1JJVEUoIG5pbmR5X3NlcmlhbCwgY21kLCBzdHJsZW4oY21kKSApOworCQkgIFNFUklBTF9XUklURSggbmluZHlfc2VyaWFsLCBjaGVja3N1bSwgc3RybGVuKGNoZWNrc3VtKSApOworCQl9CisJCS8qIEZJWE1FOiBkbyB3ZSByZWFsbHkgd2FudCB0byBiZSByZWFkaW5nIHdpdGhvdXQgdGltZW91dD8gICovCisJCWFjayA9IFNFUklBTF9SRUFEQ0hBUiAobmluZHlfc2VyaWFsLCAtMSk7CisJCWlmIChhY2sgPCAwKQorCQkgIHsKKwkJICAgIGZwcmludGYgKHN0ZGVyciwgImVycm9yIHJlYWRpbmcgZnJvbSBzZXJpYWwgcG9ydFxuIik7CisJCSAgfQorCQlpZiAoIGFjayA9PSAnLScgKXsKKwkJCWZwcmludGYoIHN0ZGVyciwgIlJlbW90ZSBOQUssIHJlc2VuZGluZ1xyXG4iICk7CisJCQlyZXNlbmQgPSAxOworCQl9IGVsc2UgaWYgKCBhY2sgIT0gJysnICl7CisJCQlmcHJpbnRmKCBzdGRlcnIsICJCYWQgQUNLLCBpZ25vcmVkOiA8JWM+XHJcbiIsIGFjayApOworCQkJcmVzZW5kID0gMDsKKwkJfQorCX0gd2hpbGUgKCBhY2sgIT0gJysnICk7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzZW5kOgorICoJU2VuZCBhIG1lc3NhZ2UgdG8gYSByZW1vdGUgTklORFkgYW5kIHJldHVybiB0aGUgcmVwbHkgaW4gdGhlIHNhbWUKKyAqCWJ1ZmZlciAoY2xvYmJlcnMgdGhlIGlucHV0IG1lc3NhZ2UpLiAgQ2hlY2sgZm9yIGVycm9yIHJlc3BvbnNlcworICoJYXMgaW5kaWNhdGVkIGJ5IHRoZSBzZWNvbmQgYXJndW1lbnQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYworc2VuZCggYnVmLCBhY2tfcmVxdWlyZWQgKQorICAgIGNoYXIgKmJ1ZjsJCS8qIE1lc3NhZ2UgdG8gYmUgc2VudCB0byBOSU5EWTsgcmVwbGFjZWQgYnkKKwkJCSAqCU5JTkRZJ3MgcmVzcG9uc2UuCisJCQkgKi8KKyAgICBpbnQgYWNrX3JlcXVpcmVkOwkvKiAxIG1lYW5zIE5JTkRZJ3MgcmVzcG9uc2UgTVVTVCBiZSBlaXRoZXIgIlgwMCIgKG5vCisJCQkgKgllcnJvcikgb3IgYW4gZXJyb3IgY29kZSAiWG5uIi4KKwkJCSAqIDAgbWVhbnMgdGhlIGl0J3MgT0sgYXMgbG9uZyBhcyBpdCBkb2Vzbid0CisJCQkgKgliZWdpbiB3aXRoICJYbm4iLgorCQkJICovCit7CisJaW50IGVycm51bTsKKwlzdGF0aWMgY2hhciAqZXJybXNnW10gPSB7CisJCSIiLAkJCQkJCS8qIFgwMCAqLworCQkiQnVmZmVyIG92ZXJmbG93IiwJCQkJLyogWDAxICovCisJCSJVbmtub3duIGNvbW1hbmQiLAkJCQkvKiBYMDIgKi8KKwkJIldyb25nIGFtb3VudCBvZiBkYXRhIHRvIGxvYWQgcmVnaXN0ZXIocykiLAkvKiBYMDMgKi8KKwkJIk1pc3NpbmcgY29tbWFuZCBhcmd1bWVudChzKSIsCQkJLyogWDA0ICovCisJCSJPZGQgbnVtYmVyIG9mIGRpZ2l0cyBzZW50IHRvIGxvYWQgbWVtb3J5IiwJLyogWDA1ICovCisJCSJVbmtub3duIHJlZ2lzdGVyIG5hbWUiLAkJCS8qIFgwNiAqLworCQkiTm8gc3VjaCBtZW1vcnkgc2VnbWVudCIsCQkJLyogWDA3ICovCisJCSJObyBicmVha3BvaW50IGF2YWlsYWJsZSIsCQkJLyogWDA4ICovCisJCSJDYW4ndCBzZXQgcmVxdWVzdGVkIGJhdWQgcmF0ZSIsCQkvKiBYMDkgKi8KKwl9OworIwlkZWZpbmUgTlVNRVJSUwkoIHNpemVvZihlcnJtc2cpIC8gc2l6ZW9mKGVycm1zZ1swXSkgKQorCisJc3RhdGljIGNoYXIgZXJyMFtdID0gIk5JTkRZIGZhaWxlZCB0byBhY2tub3dsZWRnZSBjb21tYW5kOiA8JXM+XHJcbiI7CisJc3RhdGljIGNoYXIgZXJyMVtdID0gIlVua25vd24gZXJyb3IgcmVzcG9uc2UgZnJvbSBOSU5EWTogPCVzPlxyXG4iOworCXN0YXRpYyBjaGFyIGVycjJbXSA9ICJFcnJvciByZXNwb25zZSAlcyBmcm9tIE5JTkRZOiAlc1xyXG4iOworCisJcHV0cGt0IChidWYpOworCWdldHBrdCAoYnVmKTsKKworCWlmICggYnVmWzBdICE9ICdYJyApeworCQlpZiAoIGFja19yZXF1aXJlZCApeworCQkJZnByaW50Ziggc3RkZXJyLCBlcnIwLCBidWYgKTsKKwkJCWFib3J0KCk7CisJCX0KKworCX0gZWxzZSBpZiAoIHN0cmNtcChidWYsIlgwMCIpICl7CisJCXNzY2FuZiggJmJ1ZlsxXSwgIiV4IiwgJmVycm51bSApOworCQlpZiAoIGVycm51bSA+IE5VTUVSUlMgKXsKKwkJCWZwcmludGYoIHN0ZGVyciwgZXJyMSwgYnVmICk7CisJCX0gZWxzZXsKKwkJCWZwcmludGYoIHN0ZGVyciwgZXJyMiwgYnVmLCBlcnJtc2dbZXJybnVtXSApOworCQl9CisJCWFib3J0KCk7CisJfQorfQorDAorCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkgKgkJCQkgICoKKwkJICogICBOSU5EWSBJTlRFUkZBQ0UgUk9VVElORVMJICAqCisJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICoKKwkJICogbmluQ29ubmVjdCAqTVVTVCogYmUgdGhlIGZpcnN0ICoKKwkJICogb25lIG9mIHRoZXNlIHJvdXRpbmVzIGNhbGxlZC4gICoKKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG5pbkJwdERlbDoKKyAqCUFzayBOSU5EWSB0byBkZWxldGUgdGhlIHNwZWNpZmllZCB0eXBlIG9mICpoYXJkd2FyZSogYnJlYWtwb2ludCBhdAorICoJdGhlIHNwZWNpZmllZCBhZGRyZXNzLiAgSWYgdGhlICdhZGRyJyBpcyAtMSwgYWxsIGJyZWFrcG9pbnRzIG9mCisgKgl0aGUgc3BlY2lmaWVkIHR5cGUgYXJlIGRlbGV0ZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworT25pbkJwdERlbCggYWRkciwgZGF0YSApCisgICAgbG9uZyBhZGRyOwkvKiBBZGRyZXNzIGluIDk2MCBtZW1vcnkJKi8KKyAgICBpbnQgZGF0YTsJLyogJzEnID0+IGRhdGEgYmtwdCwgJzAnID0+IGluc3RydWN0aW9uIGJyZWFrcG9pbnQgKi8KK3sKKwljaGFyIGJ1ZlsxMDBdOworCisJaWYgKCBhZGRyID09IC0xICl7CisJCXNwcmludGYoIGJ1ZiwgImIlYyIsIGRhdGEgPyAnMScgOiAnMCcgKTsKKwl9IGVsc2UgeworCQlzcHJpbnRmKCBidWYsICJiJWMleCIsIGRhdGEgPyAnMScgOiAnMCcsIGFkZHIgKTsKKwl9CisJcmV0dXJuIHNlbmQoIGJ1ZiwgMCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG5pbkJwdFNldDoKKyAqCUFzayBOSU5EWSB0byBzZXQgdGhlIHNwZWNpZmllZCB0eXBlIG9mICpoYXJkd2FyZSogYnJlYWtwb2ludCBhdAorICoJdGhlIHNwZWNpZmllZCBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK09uaW5CcHRTZXQoIGFkZHIsIGRhdGEgKQorICAgIGxvbmcgYWRkcjsJLyogQWRkcmVzcyBpbiA5NjAgbWVtb3J5CSovCisgICAgaW50IGRhdGE7CS8qICcxJyA9PiBkYXRhIGJrcHQsICcwJyA9PiBpbnN0cnVjdGlvbiBicmVha3BvaW50ICovCit7CisJY2hhciBidWZbMTAwXTsKKworCXNwcmludGYoIGJ1ZiwgIkIlYyV4IiwgZGF0YSA/ICcxJyA6ICcwJywgYWRkciApOworCXJldHVybiBzZW5kKCBidWYsIDAgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbmluR2RiRXhpdDoKKyAqCUFzayBOSU5EWSB0byBsZWF2ZSBHREIgbW9kZSBhbmQgcHJpbnQgYSBOSU5EWSBwcm9tcHQuCisgKglTaW5jZSBpdCdsbCBubyBsb25nZXIgYmUgaW4gR0RCIG1vZGUsIGRvbid0IHdhaXQgZm9yIGEgcmVzcG9uc2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworT25pbkdkYkV4aXQoKQoreworICAgICAgICBwdXRwa3QoICJFIiApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBuaW5HbzoKKyAqCUFzayBOSU5EWSB0byBzdGFydCBvciBjb250aW51ZSBleGVjdXRpb24gb2YgYW4gYXBwbGljYXRpb24gcHJvZ3JhbQorICoJaW4gaXQncyBtZW1vcnkgYXQgdGhlIGN1cnJlbnQgaXAuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworT25pbkdvKCBzdGVwX2ZsYWcgKQorICAgIGludCBzdGVwX2ZsYWc7CS8qIDEgPT4gcnVuIGluIHNpbmdsZS1zdGVwIG1vZGUgKi8KK3sKKwlwdXRwa3QoIHN0ZXBfZmxhZyA/ICJzIiA6ICJjIiApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG5pbk1lbUdldDoKKyAqCVJlYWQgYSBzdHJpbmcgb2YgYnl0ZXMgZnJvbSBOSU5EWSdzIGFkZHJlc3Mgc3BhY2UgKDk2MCBtZW1vcnkpLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK09uaW5NZW1HZXQobmluYWRkciwgaG9zdGFkZHIsIGxlbikKKyAgICAgbG9uZyBuaW5hZGRyOwkvKiBTb3VyY2UgYWRkcmVzcywgaW4gdGhlIDk2MCBtZW1vcnkgc3BhY2UJKi8KKyAgICAgY2hhciAqaG9zdGFkZHI7CS8qIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIG91ciBtZW1vcnkgc3BhY2UJKi8KKyAgICAgaW50IGxlbjsJCS8qIE51bWJlciBvZiBieXRlcyB0byByZWFkCQkJKi8KK3sKKyAgLyogSG93IG11Y2ggZG8gd2Ugc2VuZCBhdCBhIHRpbWU/ICAqLworI2RlZmluZSBPTERfTklORFlfTUVNQllURVMgMTAyNAorCS8qIEJ1ZmZlcjogaGV4IGluLCBiaW5hcnkgb3V0CQkqLworCWNoYXIgYnVmWzIqT0xEX05JTkRZX01FTUJZVEVTKzIwXTsKKworCWludCBjbnQ7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gbmV4dCB0cmFuc2ZlcgkqLworCisJZm9yICggOyBsZW4gPiAwOyBsZW4gLT0gT0xEX05JTkRZX01FTUJZVEVTICl7CisJCWNudCA9IGxlbiA+IE9MRF9OSU5EWV9NRU1CWVRFUyA/IE9MRF9OSU5EWV9NRU1CWVRFUyA6IGxlbjsKKworCQlzcHJpbnRmKCBidWYsICJtJXgsJXgiLCBuaW5hZGRyLCBjbnQgKTsKKwkJc2VuZCggYnVmLCAwICk7CisJCWhleGJpbiggY250LCBidWYsIGhvc3RhZGRyICk7CisKKwkJbmluYWRkciArPSBjbnQ7CisJCWhvc3RhZGRyICs9IGNudDsKKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbmluTWVtUHV0OgorICoJV3JpdGUgYSBzdHJpbmcgb2YgYnl0ZXMgaW50byBOSU5EWSdzIGFkZHJlc3Mgc3BhY2UgKDk2MCBtZW1vcnkpLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK09uaW5NZW1QdXQoIGRlc3RhZGRyLCBzcmNhZGRyLCBsZW4gKQorICAgICBsb25nIGRlc3RhZGRyOwkvKiBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiBOSU5EWSBtZW1vcnkgc3BhY2UJKi8KKyAgICAgY2hhciAqc3JjYWRkcjsJLyogU291cmNlIGFkZHJlc3MsIGluIG91ciBtZW1vcnkgc3BhY2UJCSovCisgICAgIGludCBsZW47CQkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUJCQkqLworeworCWNoYXIgYnVmWzIqT0xEX05JTkRZX01FTUJZVEVTKzIwXTsJLyogQnVmZmVyOiBiaW5hcnkgaW4sIGhleCBvdXQJCSovCisJY2hhciAqcDsJCS8qIFBvaW50ZXIgaW50byBidWZmZXIJCQkqLworCWludCBjbnQ7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gbmV4dCB0cmFuc2ZlcgkqLworCisJZm9yICggOyBsZW4gPiAwOyBsZW4gLT0gT0xEX05JTkRZX01FTUJZVEVTICl7CisJCWNudCA9IGxlbiA+IE9MRF9OSU5EWV9NRU1CWVRFUyA/IE9MRF9OSU5EWV9NRU1CWVRFUyA6IGxlbjsKKworCQlzcHJpbnRmKCBidWYsICJNJXgsIiwgZGVzdGFkZHIgKTsKKwkJcCA9IGJ1ZiArIHN0cmxlbihidWYpOworCQliaW5oZXgoIGNudCwgc3JjYWRkciwgcCApOworCQkqKHArKDIqY250KSkgPSAnXDAnOworCQlzZW5kKCBidWYsIDEgKTsKKworCQlzcmNhZGRyICs9IGNudDsKKwkJZGVzdGFkZHIgKz0gY250OworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbmluUmVnR2V0OgorICoJUmV0cmlldmUgdGhlIGNvbnRlbnRzIG9mIGEgOTYwIHJlZ2lzdGVyLCBhbmQgcmV0dXJuIHRoZW0gYXMgYSBsb25nCisgKglpbiBob3N0IGJ5dGUgb3JkZXIuCisgKgorICoJVEhJUyBST1VUSU5FIENBTiBPTkxZIEJFIFVTRUQgVE8gUkVBRCBUSEUgTE9DQUwsIEdMT0JBTCwgQU5ECisgKglpcC9hYy9wYy90YyBSRUdJU1RFUlMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2xvbmcKK09uaW5SZWdHZXQoIHJlZ25hbWUgKQorICAgIGNoYXIgKnJlZ25hbWU7CS8qIFJlZ2lzdGVyIG5hbWUgcmVjb2duaXplZCBieSBOSU5EWSwgc3ViamVjdCB0byB0aGUKKwkJCSAqIGFib3ZlIGxpbWl0YXRpb25zLgorCQkJICovCit7CisJY2hhciBidWZbMjAwXTsKKwlsb25nIHZhbDsKKworCXNwcmludGYoIGJ1ZiwgInUlcyIsIHJlZ25hbWUgKTsKKwlzZW5kKCBidWYsIDAgKTsKKwloZXhiaW4oIDQsIGJ1ZiwgKGNoYXIgKikmdmFsICk7CisJcmV0dXJuIGJ5dGVfb3JkZXIodmFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbmluUmVnUHV0OgorICoJU2V0IHRoZSBjb250ZW50cyBvZiBhIDk2MCByZWdpc3Rlci4KKyAqCisgKglUSElTIFJPVVRJTkUgQ0FOIE9OTFkgQkUgVVNFRCBUTyBTRVQgVEhFIExPQ0FMLCBHTE9CQUwsIEFORAorICoJaXAvYWMvcGMvdGMgUkVHSVNURVJTLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitPbmluUmVnUHV0KCByZWduYW1lLCB2YWwgKQorICAgIGNoYXIgKnJlZ25hbWU7CS8qIFJlZ2lzdGVyIG5hbWUgcmVjb2duaXplZCBieSBOSU5EWSwgc3ViamVjdCB0byB0aGUKKwkJCSAqIGFib3ZlIGxpbWl0YXRpb25zLgorCQkJICovCisgICAgbG9uZyB2YWw7CQkvKiBOZXcgY29udGVudHMgb2YgcmVnaXN0ZXIsIGluIGhvc3QgYnl0ZS1vcmRlcgkqLworeworCWNoYXIgYnVmWzIwMF07CisKKwlzcHJpbnRmKCBidWYsICJVJXMsJTA4eCIsIHJlZ25hbWUsIGJ5dGVfb3JkZXIodmFsKSApOworCXNlbmQoIGJ1ZiwgMSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBuaW5SZWdzR2V0OgorICoJR2V0IGEgZHVtcCBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVudGlyZSA5NjAgcmVnaXN0ZXIgc2V0LiAgVGhlCisgKglpbmRpdmlkdWFsIHJlZ2lzdGVycyBhcHBlYXIgaW4gdGhlIGR1bXAgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKyAqCisgKgkJcGZwICBzcCAgIHJpcCAgcjMgICByNCAgIHI1ICAgcjYgICByNyAKKyAqCQlyOCAgIHI5ICAgcjEwICByMTEgIHIxMiAgcjEzICByMTQgIHIxNSAKKyAqCQlnMCAgIGcxICAgZzIgICBnMyAgIGc0ICAgZzUgICBnNiAgIGc3IAorICoJCWc4ICAgZzkgICBnMTAgIGcxMSAgZzEyICBnMTMgIGcxNCAgZnAgCisgKgkJcGMgICBhYyAgIGlwICAgdGMgICBmcDAgIGZwMSAgZnAyICBmcDMKKyAqCisgKglFYWNoIGluZGl2aWR1YWwgcmVnaXN0ZXIgY29tcHJpc2VzIGV4YWN0bHkgNCBieXRlcywgZXhjZXB0IGZvcgorICoJZnAwLWZwMywgd2hpY2ggYXJlIDggYnl0ZXMuCisgKgorICogV0FSTklORzoKKyAqCUVhY2ggcmVnaXN0ZXIgdmFsdWUgaXMgaW4gOTYwIChsaXR0bGUtZW5kaWFuKSBieXRlIG9yZGVyLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitPbmluUmVnc0dldCggcmVncCApCisgICAgY2hhciAqcmVncDsJCS8qIFdoZXJlIHRvIHBsYWNlIHRoZSByZWdpc3RlciBkdW1wICovCit7CisJY2hhciBidWZbKDIqT0xEX05JTkRZX1JFR0lTVEVSX0JZVEVTKSsxMF07ICAgLyogUmVnaXN0ZXJzIGluIEFTQ0lJIGhleCAqLworCisJc3RyY3B5KCBidWYsICJyIiApOworCXNlbmQoIGJ1ZiwgMCApOworCWhleGJpbiggT0xEX05JTkRZX1JFR0lTVEVSX0JZVEVTLCBidWYsIHJlZ3AgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbmluUmVnc1B1dDoKKyAqCUluaXRpYWxpemUgdGhlIGVudGlyZSA5NjAgcmVnaXN0ZXIgc2V0IHRvIGEgc3BlY2lmaWVkIHNldCBvZiB2YWx1ZXMuCisgKglUaGUgZm9ybWF0IG9mIHRoZSByZWdpc3RlciB2YWx1ZSBkYXRhIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGF0CisgKglyZXR1cm5lZCBieSBuaW5SZWdzR2V0LgorICoKKyAqIFdBUk5JTkc6CisgKglFYWNoIHJlZ2lzdGVyIHZhbHVlIHNob3VsZCBiZSBpbiA5NjAgKGxpdHRsZS1lbmRpYW4pIGJ5dGUgb3JkZXIuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK09uaW5SZWdzUHV0KCByZWdwICkKKyAgICBjaGFyICpyZWdwOwkJLyogUG9pbnRlciB0byBkZXNpcmVkIHZhbHVlcyBvZiByZWdpc3RlcnMgKi8KK3sKKwljaGFyIGJ1ZlsoMipPTERfTklORFlfUkVHSVNURVJfQllURVMpKzEwXTsgICAvKiBSZWdpc3RlcnMgaW4gQVNDSUkgaGV4ICovCisKKwlidWZbMF0gPSAnUic7CisJYmluaGV4KCBPTERfTklORFlfUkVHSVNURVJfQllURVMsIHJlZ3AsIGJ1ZisxICk7CisJYnVmWyAoMipPTERfTklORFlfUkVHSVNURVJfQllURVMpKzEgXSA9ICdcMCc7CisKKwlzZW5kKCBidWYsIDEgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBuaW5SZXNldDoKKyAqICAgICAgQXNrIE5JTkRZIHRvIHBlcmZvcm0gYSBzb2Z0IHJlc2V0OyB3YWl0IGZvciB0aGUgcmVzZXQgdG8gY29tcGxldGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworT25pblJlc2V0KCkKK3sKKworCXB1dHBrdCggIlgiICk7CisJLyogRklYTUU6IGNoZWNrIGZvciBlcnJvciBmcm9tIHJlYWRjaGFyICgpLiAgKi8KKwl3aGlsZSAoIHJlYWRjaGFyKCkgIT0gJysnICl7CisJCTsKKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbmluU3JxOgorICoJQXNzdW1lIE5JTkRZIGhhcyBzdG9wcGVkIGV4ZWN1dGlvbiBvZiB0aGUgOTYwIGFwcGxpY2F0aW9uIHByb2dyYW0gaW4KKyAqCW9yZGVyIHRvIHByb2Nlc3MgYSBob3N0IHNlcnZpY2UgcmVxdWVzdCAoc3JxKS4gIEFzayBOSU5EWSBmb3IgdGhlCisgKglzcnEgYXJndW1lbnRzLCBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgc2VydmljZSwgYW5kIHNlbmQgYW4gInNycQorICoJY29tcGxldGUiIG1lc3NhZ2Ugc28gTklORFkgd2lsbCByZXR1cm4gY29udHJvbCB0byB0aGUgYXBwbGljYXRpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK09uaW5TcnEoKQoreworICAvKiBGSVhNRTogSW1wb3NlcyBhcmJpdHJhcnkgbGltaXRzIG9uIGxlbmd0aHMgb2YgcGF0aG5hbWVzIGFuZCBzdWNoLiAgKi8KKwljaGFyIGJ1ZltCVUZTSVpFXTsKKwlpbnQgcmV0Y29kZTsKKwl1bnNpZ25lZCBjaGFyIHNycW51bTsKKwljaGFyICpwOworCWNoYXIgKmFyZ3A7CisJaW50IG5hcmdzOworCWludCBhcmdbTUFYX1NSUV9BUkdTXTsKKworCisJLyogR2V0IHNycSBudW1iZXIgYW5kIGFyZ3VtZW50cworCSAqLworCXN0cmNweSggYnVmLCAiISIgKTsKKwlzZW5kKCBidWYsIDAgKTsKKwloZXhiaW4oIDEsIGJ1ZiwgKGNoYXIgKikmc3JxbnVtICk7CisKKwkvKiBTZXQgdXAgYXJyYXkgb2YgcG9pbnRlcnMgdGhlIGVhY2ggb2YgdGhlIGluZGl2aWR1YWwKKwkgKiBjb21tYS1zZXBhcmF0ZWQgYXJncworCSAqLworCW5hcmdzPTA7CisJYXJncCA9IHAgPSBidWYrMjsKKyAgICAgICAgd2hpbGUgKCAxICl7CisgICAgICAgICAgICAgICAgd2hpbGUgKCAqcCAhPSAnLCcgJiYgKnAgIT0gJ1wwJyApeworICAgICAgICAgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzc2NhbmYoIGFyZ3AsICIleCIsICZhcmdbbmFyZ3MrK10gKTsKKyAgICAgICAgICAgICAgICBpZiAoICpwID09ICdcMCcgfHwgbmFyZ3MgPT0gTUFYX1NSUV9BUkdTICl7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXJncCA9ICsrcDsKKyAgICAgICAgfQorCisJLyogUHJvY2VzcyBTcnEKKwkgKi8KKwlzd2l0Y2goIHNycW51bSApeworCWNhc2UgQlNfQ0xPU0U6CisJCS8qIGFyZ3M6IGZpbGUgZGVzY3JpcHRvciAqLworCQlpZiAoIGFyZ1swXSA+IDIgKXsKKwkJCXJldGNvZGUgPSBjbG9zZSggYXJnWzBdICk7CisJCX0gZWxzZSB7CisJCQlyZXRjb2RlID0gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIEJTX0NSRUFUOgorCQkvKiBhcmdzOiBmaWxlbmFtZSwgbW9kZSAqLworCQlPbmluU3RyR2V0KCBhcmdbMF0sIGJ1ZiApOworCQlyZXRjb2RlID0gY3JlYXQoYnVmLGFyZ1sxXSk7CisJCWJyZWFrOworCWNhc2UgQlNfT1BFTjoKKwkJLyogYXJnczogZmlsZW5hbWUsIGZsYWdzLCBtb2RlICovCisJCU9uaW5TdHJHZXQoIGFyZ1swXSwgYnVmICk7CisJCXJldGNvZGUgPSBvcGVuKGJ1ZixhcmdbMV0sYXJnWzJdKTsKKwkJYnJlYWs7CisJY2FzZSBCU19SRUFEOgorCQkvKiBhcmdzOiBmaWxlIGRlc2NyaXB0b3IsIGJ1ZmZlciwgY291bnQgKi8KKwkJcmV0Y29kZSA9IHJlYWQoYXJnWzBdLGJ1ZixhcmdbMl0pOworCQlpZiAoIHJldGNvZGUgPiAwICl7CisJCQlPbmluTWVtUHV0KCBhcmdbMV0sIGJ1ZiwgcmV0Y29kZSApOworCQl9CisJCWJyZWFrOworCWNhc2UgQlNfU0VFSzoKKwkJLyogYXJnczogZmlsZSBkZXNjcmlwdG9yLCBvZmZzZXQsIHdoZW5jZSAqLworCQlyZXRjb2RlID0gbHNlZWsoYXJnWzBdLGFyZ1sxXSxhcmdbMl0pOworCQlicmVhazsKKwljYXNlIEJTX1dSSVRFOgorCQkvKiBhcmdzOiBmaWxlIGRlc2NyaXB0b3IsIGJ1ZmZlciwgY291bnQgKi8KKwkJT25pbk1lbUdldCggYXJnWzFdLCBidWYsIGFyZ1syXSApOworCQlyZXRjb2RlID0gd3JpdGUoYXJnWzBdLGJ1ZixhcmdbMl0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXRjb2RlID0gLTE7CisJCWJyZWFrOworCX0KKworCS8qIFRlbGwgTklORFkgdG8gY29udGludWUKKwkgKi8KKwlzcHJpbnRmKCBidWYsICJlJXgiLCByZXRjb2RlICk7CisJc2VuZCggYnVmLCAxICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbmluU3RvcFdoeToKKyAqCUFzc3VtZSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSBoYXMgc3RvcHBlZCAoaS5lLiwgYSBETEUgd2FzIHJlY2VpdmVkCisgKglmcm9tIE5JTkRZKS4gIEFzayBOSU5EWSBmb3Igc3RhdHVzIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhlCisgKglyZWFzb24gZm9yIHRoZSBoYWx0LgorICoKKyAqCVJldHVybnMgYSBub24temVybyB2YWx1ZSBpZiB0aGUgdXNlciBwcm9ncmFtIGhhcyBleGl0ZWQsIDAgb3RoZXJ3aXNlLgorICoJQWxzbyByZXR1cm5zIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24sIHRocm91Z2ggcGFzc2VkIHBvaW50ZXJzOgorICogICAgICAgICAgIC0gd2h5OiBhbiBleGl0IGNvZGUgaWYgcHJvZ3JhbSB0aGUgZXhpdGVkOyBvdGhlcndpc2UgdGhlIHJlYXNvbgorICoJCQl3aHkgdGhlIHByb2dyYW0gaGFsdGVkIChzZWUgc3RvcC5oIGZvciB2YWx1ZXMpLgorICoJICAgIC0gY29udGVudHMgb2YgcmVnaXN0ZXIgaXAgKGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlcikKKyAqCSAgICAtIGNvbnRlbnRzIG9mIHJlZ2lzdGVyIHNwIChsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIpCisgKgkgICAgLSBjb250ZW50cyBvZiByZWdpc3RlciBmcCAobGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NoYXIKK09uaW5TdG9wV2h5KCB3aHlwLCBpcHAsIGZwcCwgc3BwICkKKyAgICBjaGFyICp3aHlwOwkvKiBSZXR1cm4gdGhlICd3aHknIGNvZGUgdGhyb3VnaCB0aGlzIHBvaW50ZXIJKi8KKyAgICBjaGFyICppcHA7CS8qIFJldHVybiBjb250ZW50cyBvZiByZWdpc3RlciBpcCB0aHJvdWdoIHRoaXMgcG9pbnRlcgkqLworICAgIGNoYXIgKmZwcDsJLyogUmV0dXJuIGNvbnRlbnRzIG9mIHJlZ2lzdGVyIGZwIHRocm91Z2ggdGhpcyBwb2ludGVyCSovCisgICAgY2hhciAqc3BwOwkvKiBSZXR1cm4gY29udGVudHMgb2YgcmVnaXN0ZXIgc3AgdGhyb3VnaCB0aGlzIHBvaW50ZXIJKi8KK3sKKwljaGFyIGJ1ZlszMF07CisJY2hhciBzdG9wX2V4aXQ7CisKKwlzdHJjcHkoIGJ1ZiwgIj8iICk7CisJc2VuZCggYnVmLCAwICk7CisJaGV4YmluKCAxLCBidWYsICZzdG9wX2V4aXQgKTsKKwloZXhiaW4oIDEsIGJ1ZisyLCB3aHlwICk7CisJaGV4YmluKCA0LCBidWYrNCwgaXBwICk7CisJaGV4YmluKCA0LCBidWYrMTIsIGZwcCApOworCWhleGJpbiggNCwgYnVmKzIwLCBzcHAgKTsKKwlyZXR1cm4gc3RvcF9leGl0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBuaW5TdHJHZXQ6CisgKglSZWFkIGEgJ1wwJy10ZXJtaW5hdGVkIHN0cmluZyBvZiBkYXRhIG91dCBvZiB0aGUgOTYwIG1lbW9yeSBzcGFjZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljCitPbmluU3RyR2V0KCBuaW5hZGRyLCBob3N0YWRkciApCisgICAgIHVuc2lnbmVkIGxvbmcgbmluYWRkcjsJLyogQWRkcmVzcyBvZiBzdHJpbmcgaW4gTklORFkgbWVtb3J5IHNwYWNlICovCisgICAgIGNoYXIgKmhvc3RhZGRyOwkJLyogQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIHdoaWNoIHN0cmluZyBzaG91bGQKKwkJCQkgKgliZSBjb3BpZWQuCisJCQkJICovCit7CisgIC8qIEZJWE1FOiBzZWVtcyB0byBiZSBhbiBhcmJpdHJhcnkgbGltaXQgb24gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLiAgKi8KKwljaGFyIGJ1ZltCVUZTSVpFXTsJLyogU3RyaW5nIGFzIDIgQVNDSUkgaGV4IGRpZ2l0cyBwZXIgYnl0ZSAqLworCWludCBudW1jaGFyczsJCS8qIExlbmd0aCBvZiBzdHJpbmcgaW4gYnl0ZXMuCQkqLworCisJc3ByaW50ZiggYnVmLCAiXCIleCIsIG5pbmFkZHIgKTsKKwlzZW5kKCBidWYsIDAgKTsKKwludW1jaGFycyA9IHN0cmxlbihidWYpLzI7CisJaGV4YmluKCBudW1jaGFycywgYnVmLCBob3N0YWRkciApOworCWhvc3RhZGRyW251bWNoYXJzXSA9ICdcMCc7Cit9CisKKyNpZiAwCisvKiBuZXZlciB1c2VkLiAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbmluVmVyc2lvbjoKKyAqCUFzayBOSU5EWSBmb3IgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCBpdHNlbGYuCisgKglUaGUgaW5mb3JtYXRpb24gaXMgc2VudCBhcyBhbiBhc2NpaSBzdHJpbmcgaW4gdGhlIGZvcm0gIngueHgsPGFyY2g+IiwKKyAqCXdoZXJlLAorICoJCXgueHgJaXMgdGhlIHZlcnNpb24gbnVtYmVyCisgKgkJPGFyY2g+CWlzIHRoZSBwcm9jZXNzb3IgYXJjaGl0ZWN0dXJlOiAiS0EiLCAiS0IiLCAiTUMiLCAiQ0EiICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitPbmluVmVyc2lvbiggcCApCisgICAgIGNoYXIgKnA7CQkvKiBXaGVyZSB0byBwbGFjZSB2ZXJzaW9uIHN0cmluZyAqLworeworICAvKiBGSVhNRTogdGhpcyBpcyBhbiBhcmJpdHJhcnkgbGltaXQgb24gdGhlIGxlbmd0aCBvZiB2ZXJzaW9uIHN0cmluZy4gICovCisJY2hhciBidWZbQlVGU0laRV07CisKKwlzdHJjcHkoIGJ1ZiwgInYiICk7CisJc2VuZCggYnVmLCAwICk7CisJc3RyY3B5KCBwLCBidWYgKTsKKwlyZXR1cm4gc3RybGVuKCBidWYgKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2RiL25pbmR5LXNoYXJlL1JFQURNRSBiL2dkYi9uaW5keS1zaGFyZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YyMTdhZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9uaW5keS1zaGFyZS9SRUFETUUKQEAgLTAsMCArMSwzIEBACitUaGUgZmlsZXMgaW4gdGhpcyBkaXJlY3Rvcnkgc3RhcnRlZCBvdXQgbGlmZSBhcyBjb2RlIHNoYXJlZCBiZXR3ZWVuCit0aGUgbmluZHkgbW9uaXRvciBhbmQgR0RCLiAgRm9yIHZhcmlvdXMgcmVhc29ucywgdGhpcyBpcyBubyBsb25nZXIKK3RydWUuICBFdmVudHVhbGx5LCB0aGV5IHByb2JhYmx5IHNob3VsZCBiZSBtZXJnZWQgaW50byByZW1vdGUtbmluZHkuYy4KZGlmZiAtLWdpdCBhL2dkYi9uaW5keS1zaGFyZS9WRVJTSU9OIGIvZ2RiL25pbmR5LXNoYXJlL1ZFUlNJT04KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyNWU1OQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9uaW5keS1zaGFyZS9WRVJTSU9OCkBAIC0wLDAgKzEgQEAKKzEuMgpkaWZmIC0tZ2l0IGEvZ2RiL25pbmR5LXNoYXJlL2Iub3V0LmggYi9nZGIvbmluZHktc2hhcmUvYi5vdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODJjMjYxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL25pbmR5LXNoYXJlL2Iub3V0LmgKQEAgLTAsMCArMSwxNTggQEAKKy8qICBDb3B5cmlnaHQgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mICdhLm91dC5oJy4gIEl0IGlzIHRvIGJlIHVzZWQgaW4gYWxsCisgKiBhbGwgR05VIHRvb2xzIG1vZGlmaWVkIHRvIHN1cHBvcnQgdGhlIGk4MDk2MCAob3IgdG9vbHMgdGhhdCBvcGVyYXRlIG9uCisgKiBvYmplY3QgZmlsZXMgY3JlYXRlZCBieSBzdWNoIHRvb2xzKS4KKyAqCisgKiBBbGwgaTgwOTYwIGRldmVsb3BtZW50IGlzIGRvbmUgaW4gYSBDUk9TUy1ERVZFTE9QTUVOVCBlbnZpcm9ubWVudC4gIEkuZS4sCisgKiBvYmplY3QgY29kZSBpcyBnZW5lcmF0ZWQgb24sIGFuZCBleGVjdXRlZCB1bmRlciB0aGUgZGlyZWN0aW9uIG9mIGEgc3ltYm9saWMKKyAqIGRlYnVnZ2VyIHJ1bm5pbmcgb24sIGEgaG9zdCBzeXN0ZW0uICBXZSBkbyBub3Qgd2FudCB0byBiZSBzdWJqZWN0IHRvIHRoZQorICogdmFnYXJpZXMgb2Ygd2hpY2ggaG9zdCBpdCBpcyBvciB3aGV0aGVyIGl0IHN1cHBvcnRzIENPRkYgb3IgYS5vdXQgZm9ybWF0LAorICogb3IgYW55dGhpbmcgZWxzZS4gIFdlIERPIHdhbnQgdG86CisgKgorICoJbyBhbHdheXMgZ2VuZXJhdGUgdGhlIHNhbWUgZm9ybWF0IG9iamVjdCBmaWxlcywgcmVnYXJkbGVzcyBvZiBob3N0LgorICoKKyAqCW8gaGF2ZSBhbiAnYS5vdXQnIGhlYWRlciB0aGF0IHdlIGNhbiBtb2RpZnkgZm9yIG91ciBvd24gcHVycG9zZXMKKyAqCSAgKHRoZSA4MDk2MCBpcyB0eXBpY2FsbHkgYW4gZW1iZWRkZWQgcHJvY2Vzc29yIGFuZCBtYXkgcmVxdWlyZQorICoJICBlbmhhbmNlZCBsaW5rZXIgc3VwcG9ydCB0aGF0IHRoZSBub3JtYWwgYS5vdXQuaCBoZWFkZXIgY2FuJ3QKKyAqCSAgYWNjb21tb2RhdGUpLgorICoKKyAqIEFzIGZvciBieXRlLW9yZGVyaW5nLCB0aGUgZm9sbG93aW5nIHJ1bGVzIGFwcGx5OgorICoKKyAqCW8gVGV4dCBhbmQgZGF0YSB0aGF0IGlzIGFjdHVhbGx5IGRvd25sb2FkZWQgdG8gdGhlIHRhcmdldCBpcyBhbHdheXMKKyAqCSAgaW4gaTgwOTYwIChsaXR0bGUtZW5kaWFuKSBvcmRlci4KKyAqCisgKglvIEFsbCBvdGhlciBudW1iZXJzIChpbiB0aGUgaGVhZGVyLCBzeW1ib2xzLCByZWxvY2F0aW9uIGRpcmVjdGl2ZXMpCisgKgkgIGFyZSBpbiBob3N0IGJ5dGUtb3JkZXI6ICBvYmplY3QgZmlsZXMgQ0FOTk9UIGJlIGxpZnRlZCBmcm9tIGEKKyAqCSAgbGl0dGxlLWVuZCBob3N0IGFuZCB1c2VkIG9uIGEgYmlnLWVuZGlhbiAob3IgdmljZSB2ZXJzYSkgd2l0aG91dAorICoJICBtb2RpZmljYXRpb24uCisgKgorICoJbyBUaGUgZG93bmxvYWRlciAoJ2NvbW05NjAnKSB0YWtlcyBjYXJlIHRvIGdlbmVyYXRlIGEgcHNldWRvLWhlYWRlcgorICoJICB3aXRoIGNvcnJlY3QgKGk4MDk2MCkgYnl0ZS1vcmRlcmluZyBiZWZvcmUgc2hpcHBpbmcgdGV4dCBhbmQgZGF0YQorICoJICBvZmYgdG8gdGhlIE5JTkRZIG1vbml0b3IgaW4gdGhlIHRhcmdldCBzeXN0ZW1zLiAgU3ltYm9scyBhbmQKKyAqCSAgcmVsb2NhdGlvbiBpbmZvIGFyZSBuZXZlciBzZW50IHRvIHRoZSB0YXJnZXQuCisgKi8KKworCisjZGVmaW5lIEJNQUdJQwkwNDE1CisvKiBXZSBkb24ndCBhY2NlcHQgdGhlIGZvbGxvd2luZyAoc2VlIE5fQkFETUFHIG1hY3JvKS4KKyAqIFRoZXkncmUganVzdCBoZXJlIHNvIEdOVSBjb2RlIHdpbGwgY29tcGlsZS4KKyAqLworI2RlZmluZQlPTUFHSUMJMDQwNwkJLyogb2xkIGltcHVyZSBmb3JtYXQgKi8KKyNkZWZpbmUJTk1BR0lDCTA0MTAJCS8qIHJlYWQtb25seSB0ZXh0ICovCisjZGVmaW5lCVpNQUdJQwkwNDEzCQkvKiBkZW1hbmQgbG9hZCBmb3JtYXQgKi8KKworLyogRklMRSBIRUFERVIKKyAqCUFsbCAnbGVuZ3RocycgYXJlIGdpdmVuIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgorICoJQWxsICdhbGlnbm1lbnRzJyBhcmUgZm9yIHJlbGlua2FibGUgZmlsZXMgb25seTsgIGFuIGFsaWdubWVudCBvZgorICoJCSduJyBpbmRpY2F0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgc2VnbWVudCBtdXN0IGJlZ2luIGF0IGFuCisgKgkJYWRkcmVzcyB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgKDIqKm4pLgorICovCitzdHJ1Y3QgZXhlYyB7CisJLyogU3RhbmRhcmQgc3R1ZmYgKi8KKwl1bnNpZ25lZCBsb25nIGFfbWFnaWM7CS8qIElkZW50aWZpZXMgdGhpcyBhcyBhIGIub3V0IGZpbGUJKi8KKwl1bnNpZ25lZCBsb25nIGFfdGV4dDsJLyogTGVuZ3RoIG9mIHRleHQJCQkqLworCXVuc2lnbmVkIGxvbmcgYV9kYXRhOwkvKiBMZW5ndGggb2YgZGF0YQkJCSovCisJdW5zaWduZWQgbG9uZyBhX2JzczsJLyogTGVuZ3RoIG9mIHJ1bnRpbWUgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgKi8KKwl1bnNpZ25lZCBsb25nIGFfc3ltczsJLyogTGVuZ3RoIG9mIHN5bWJvbCB0YWJsZQkJKi8KKwl1bnNpZ25lZCBsb25nIGFfZW50cnk7CS8qIFJ1bnRpbWUgc3RhcnQgYWRkcmVzcwkJKi8KKwl1bnNpZ25lZCBsb25nIGFfdHJzaXplOwkvKiBMZW5ndGggb2YgdGV4dCByZWxvY2F0aW9uIGluZm8JKi8KKwl1bnNpZ25lZCBsb25nIGFfZHJzaXplOwkvKiBMZW5ndGggb2YgZGF0YSByZWxvY2F0aW9uIGluZm8JKi8KKworCS8qIEFkZGVkIGZvciBpOTYwICovCisJdW5zaWduZWQgbG9uZyBhX3Rsb2FkOwkvKiBUZXh0IHJ1bnRpbWUgbG9hZCBhZGRyZXNzCQkqLworCXVuc2lnbmVkIGxvbmcgYV9kbG9hZDsJLyogRGF0YSBydW50aW1lIGxvYWQgYWRkcmVzcwkJKi8KKwl1bnNpZ25lZCBjaGFyIGFfdGFsaWduOwkvKiBBbGlnbm1lbnQgb2YgdGV4dCBzZWdtZW50CQkqLworCXVuc2lnbmVkIGNoYXIgYV9kYWxpZ247CS8qIEFsaWdubWVudCBvZiBkYXRhIHNlZ21lbnQJCSovCisJdW5zaWduZWQgY2hhciBhX2JhbGlnbjsJLyogQWxpZ25tZW50IG9mIGJzcyBzZWdtZW50CQkqLworCXVuc2lnbmVkIGNoYXIgdW51c2VkOwkvKiAoSnVzdCB0byBtYWtlIHN0cnVjdCBzaXplIGEgbXVsdGlwbGUgb2YgNCkgKi8KK307CisKKyNkZWZpbmUgTl9CQURNQUcoeCkJKCgoeCkuYV9tYWdpYykhPUJNQUdJQykKKyNkZWZpbmUgTl9UWFRPRkYoeCkJKCBzaXplb2Yoc3RydWN0IGV4ZWMpICkKKyNkZWZpbmUgTl9EQVRPRkYoeCkJKCBOX1RYVE9GRih4KSArICh4KS5hX3RleHQgKQorI2RlZmluZSBOX1RST0ZGKHgpCSggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhICkKKyNkZWZpbmUgTl9EUk9GRih4KQkoIE5fVFJPRkYoeCkgKyAoeCkuYV90cnNpemUgKQorI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJPRkYoeCkgKyAoeCkuYV9kcnNpemUgKQorI2RlZmluZSBOX1NUUk9GRih4KQkoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCisKKy8qIEEgc2luZ2xlIGVudHJ5IGluIHRoZSBzeW1ib2wgdGFibGUKKyAqLworc3RydWN0IG5saXN0IHsKKwl1bmlvbiB7CisJCWNoYXIJKm5fbmFtZTsKKwkJc3RydWN0IG5saXN0ICpuX25leHQ7CisJCWxvbmcJbl9zdHJ4OwkJLyogSW5kZXggaW50byBzdHJpbmcgdGFibGUJKi8KKwl9IG5fdW47CisJdW5zaWduZWQgY2hhciBuX3R5cGU7CS8qIFNlZSBiZWxvdwkJCQkqLworCWNoYXIJbl9vdGhlcjsJLyogVXNlZCBpbiBpODA5NjAgc3VwcG9ydCAtLSBzZWUgYmVsb3cJKi8KKwlzaG9ydAluX2Rlc2M7CisJdW5zaWduZWQgbG9uZyBuX3ZhbHVlOworfTsKKworCisvKiBMZWdhbCB2YWx1ZXMgb2Ygbl90eXBlCisgKi8KKyNkZWZpbmUgTl9VTkRGCTAJLyogVW5kZWZpbmVkIHN5bWJvbAkqLworI2RlZmluZSBOX0FCUwkyCS8qIEFic29sdXRlIHN5bWJvbAkqLworI2RlZmluZSBOX1RFWFQJNAkvKiBUZXh0IHN5bWJvbAkJKi8KKyNkZWZpbmUgTl9EQVRBCTYJLyogRGF0YSBzeW1ib2wJCSovCisjZGVmaW5lIE5fQlNTCTgJLyogQlNTIHN5bWJvbAkJKi8KKyNkZWZpbmUgTl9GTgkzMQkvKiBGaWxlbmFtZSBzeW1ib2wJKi8KKworI2RlZmluZSBOX0VYVAkxCS8qIEV4dGVybmFsIHN5bWJvbCAoT1InZCBpbiB3aXRoIG9uZSBvZiBhYm92ZSkJKi8KKyNkZWZpbmUgTl9UWVBFCTAzNgkvKiBNYXNrIGZvciBhbGwgdGhlIHR5cGUgYml0cwkJCSovCisjZGVmaW5lIE5fU1RBQgkwMzQwCS8qIE1hc2sgZm9yIGFsbCBiaXRzIHVzZWQgZm9yIFNEQiBlbnRyaWVzIAkqLworCisvKiBNRUFOSU5HIE9GICduX290aGVyJworICoKKyAqIElmIG5vbi16ZXJvLCB0aGUgJ25fb3RoZXInIGZpZWxkcyBpbmRpY2F0ZXMgZWl0aGVyIGEgbGVhZiBwcm9jZWR1cmUgb3IKKyAqIGEgc3lzdGVtIHByb2NlZHVyZSwgYXMgZm9sbG93czoKKyAqCisgKgkxIDw9IG5fb3RoZXIgPD0gMzIgOgorICoJCVRoZSBzeW1ib2wgaXMgdGhlIGVudHJ5IHBvaW50IHRvIGEgc3lzdGVtIHByb2NlZHVyZS4KKyAqCQknbl92YWx1ZScgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGVudHJ5LCBhcyBmb3IgYW55IG90aGVyCisgKgkJcHJvY2VkdXJlLiAgVGhlIHN5c3RlbSBwcm9jZWR1cmUgbnVtYmVyICh3aGljaCBjYW4gYmUgdXNlZCBpbgorICoJCWEgJ2NhbGxzJyBpbnN0cnVjdGlvbikgaXMgKG5fb3RoZXItMSkuICBUaGVzZSBlbnRyaWVzIGNvbWUgZnJvbQorICoJCScuc3lzcHJvYycgZGlyZWN0aXZlcy4KKyAqCisgKgluX290aGVyID09IE5fQ0FMTE5BTUUKKyAqCQl0aGUgc3ltYm9sIGlzIHRoZSAnY2FsbCcgZW50cnkgcG9pbnQgdG8gYSBsZWFmIHByb2NlZHVyZS4KKyAqCQlUaGUgKm5leHQqIHN5bWJvbCBpbiB0aGUgc3ltYm9sIHRhYmxlIG11c3QgYmUgdGhlIGNvcnJlc3BvbmRpbmcKKyAqCQknYmFsJyBlbnRyeSBwb2ludCB0byB0aGUgcHJvY2VkdXJlIChzZWUgZm9sbG93aW5nKS4gIFRoZXNlCisgKgkJZW50cmllcyBjb21lIGZyb20gJy5sZWFmcHJvYycgZGlyZWN0aXZlcyBpbiB3aGljaCB0d28gZGlmZmVyZW50CisgKgkJc3ltYm9scyBhcmUgc3BlY2lmaWVkICh0aGUgZmlyc3Qgb25lIGlzIHJlcHJlc2VudGVkIGhlcmUpLgorICoJCisgKgorICoJbl9vdGhlciA9PSBOX0JBTE5BTUUKKyAqCQl0aGUgc3ltYm9sIGlzIHRoZSAnYmFsJyBlbnRyeSBwb2ludCB0byBhIGxlYWYgcHJvY2VkdXJlLgorICoJCVRoZXNlIGVudHJpZXMgcmVzdWx0IGZyb20gJy5sZWFmcHJvYycgZGlyZWN0aXZlcyBpbiB3aGljaCBvbmx5CisgKgkJb25lIHN5bWJvbCBpcyBzcGVjaWZpZWQsIG9yIGluIHdoaWNoIHRoZSBzYW1lIHN5bWJvbCBpcworICoJCXNwZWNpZmllZCB0d2ljZS4KKyAqCisgKiBOb3RlIHRoYXQgYW4gTl9DQUxMTkFNRSBlbnRyeSAqbXVzdCogaGF2ZSBhIGNvcnJlc3BvbmRpbmcgTl9CQUxOQU1FIGVudHJ5LAorICogYnV0IG5vdCBldmVyeSBOX0JBTE5BTUUgZW50cnkgbXVzdCBoYXZlIGFuIE5fQ0FMTE5BTUUgZW50cnkuCisgKi8KKyNkZWZpbmUJTl9DQUxMTkFNRQktMQorI2RlZmluZQlOX0JBTE5BTUUJLTIKKworCitzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvIHsKKwlpbnQJIHJfYWRkcmVzczsJLyogRmlsZSBhZGRyZXNzIG9mIGl0ZW0gdG8gYmUgcmVsb2NhdGVkCSovCisJdW5zaWduZWQKKwkJcl9zeW1ib2xudW06MjQsLyogSW5kZXggb2Ygc3ltYm9sIG9uIHdoaWNoIHJlbG9jYXRpb24gaXMgYmFzZWQqLworCQlyX3BjcmVsOjEsCS8qIDEgPT4gcmVsb2NhdGUgUEMtcmVsYXRpdmU7IGVsc2UgYWJzb2x1dGUKKwkJCQkgKglPbiBpOTYwLCBwYy1yZWxhdGl2ZSBpbXBsaWVzIDI0LWJpdAorCQkJCSAqCWFkZHJlc3MsIGFic29sdXRlIGltcGxpZXMgMzItYml0LgorCQkJCSAqLworCQlyX2xlbmd0aDoyLAkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVsb2NhdGU6CisJCQkJICoJMCA9PiAxIGJ5dGUKKwkJCQkgKgkxID0+IDIgYnl0ZXMKKwkJCQkgKgkyID0+IDQgYnl0ZXMgLS0gb25seSB2YWx1ZSB1c2VkIGZvciBpOTYwCisJCQkJICovCisJCXJfZXh0ZXJuOjEsCisJCXJfYnNyOjEsCS8qIFNvbWV0aGluZyBmb3IgdGhlIEdOVSBOUzMySyBhc3NlbWJsZXIgKi8KKwkJcl9kaXNwOjEsCS8qIFNvbWV0aGluZyBmb3IgdGhlIEdOVSBOUzMySyBhc3NlbWJsZXIgKi8KKwkJcl9jYWxsajoxLAkvKiAxIGlmIHJlbG9jYXRpb24gdGFyZ2V0IGlzIGFuIGk5NjAgJ2NhbGxqJyAqLworCQludXRoaW46MTsJLyogVW51c2VkCQkJCSovCit9OwpkaWZmIC0tZ2l0IGEvZ2RiL25pbmR5LXNoYXJlL2Jsb2NrX2lvLmggYi9nZGIvbmluZHktc2hhcmUvYmxvY2tfaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTIxY2RiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL25pbmR5LXNoYXJlL2Jsb2NrX2lvLmgKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCUNvcHlyaWdodCAxOTkwLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisJVGhpcyBjb2RlIHdhcyBkb25hdGVkIGJ5IEludGVsIENvcnAuCisKKyAgIEludGVsIGhlcmVieSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5LCBhbmQgCisgICBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uLiAgSW50ZWwgZ3JhbnRzCisgICB0aGlzIHBlcm1pc3Npb24gcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSAKKyAgIGFwcGVhcnMgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICAgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSW4KKyAgIGFkZGl0aW9uLCBJbnRlbCBncmFudHMgdGhpcyBwZXJtaXNzaW9uIHByb3ZpZGVkIHRoYXQgeW91CisgICBwcm9taW5lbnRseSBtYXJrIGFzIG5vdCBwYXJ0IG9mIHRoZSBvcmlnaW5hbCBhbnkgbW9kaWZpY2F0aW9ucworICAgbWFkZSB0byB0aGlzIHNvZnR3YXJlIG9yIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIAorICAgSW50ZWwgQ29ycG9yYXRpb24gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IAorICAgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIG9yIHRoZSBkb2N1bWVudGF0aW9uIAorICAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgCisKKyAgIEludGVsIENvcnBvcmF0aW9uIGRvZXMgbm90IHdhcnJhbnQsIGd1YXJhbnRlZSBvciBtYWtlIGFueSAKKyAgIHJlcHJlc2VudGF0aW9ucyByZWdhcmRpbmcgdGhlIHVzZSBvZiwgb3IgdGhlIHJlc3VsdHMgb2YgdGhlIHVzZQorICAgb2YsIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBpbiB0ZXJtcyBvZiBjb3JyZWN0bmVzcywgCisgICBhY2N1cmFjeSwgcmVsaWFiaWxpdHksIGN1cnJlbnRuZXNzLCBvciBvdGhlcndpc2U7IGFuZCB5b3UgcmVseQorICAgb24gdGhlIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uIGFuZCByZXN1bHRzIHNvbGVseSBhdCB5b3VyIG93biAKKyAgIHJpc2suCQkJCQkJCSAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMgc3VwcG9ydGluZyBOSU5EWSByZXF1ZXN0cyBmb3Igc2VydmljZXMgYnkgYQorICogcmVtb3RlIGhvc3QuICBVc2VkIGJ5IE5JTkRZIG1vbml0b3IsIGxpYnJhcnkgbGlibmluLCBjb21tOTYwLCBnZGI5NjAsCisgKiBldGMuICBBbHNvIGNvbnRhaW5zIHNvbWUgZGVmaW5lcyBmb3IgTklORFkgY29uc29sZSBJL08gcmVxdWVzdHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHRoZSBmb2xsb3dpbmcgZm91ciBhcmUgaGFyZHdhcmUgZGVwZW5kZW50ICovCisjZGVmaW5lCUJJVF8xNgkJc2hvcnQKKyNkZWZpbmUJQklUXzMyCQlpbnQKKyNkZWZpbmUJVUJJVF8xNgkJdW5zaWduZWQgc2hvcnQKKyNkZWZpbmUJVUJJVF8zMgkJdW5zaWduZWQgaW50CisKKy8qIFNlcnZpY2UgcmVxdWVzdCBudW1iZXJzIC0tIHRoZXNlIGFyZSB0aGUgc2VydmljZXMgdGhhdCBjYW4gYmUgYXNrZWQgb2YgdGhlCisgKiBob3N0LgorICovCisjZGVmaW5lIEJTX0FDQ0VTUwkweDEwCisjZGVmaW5lIEJTX0NMT1NFCTB4MjAKKyNkZWZpbmUgQlNfQ1JFQVQJMHgzMAorI2RlZmluZSBCU19TRUVLCQkweDQwCisjZGVmaW5lIEJTX09QRU4JCTB4NTAKKyNkZWZpbmUgQlNfUkVBRAkJMHg2MAorI2RlZmluZSBCU19TVEFUCQkweDcwCisjZGVmaW5lIEJTX1NZU1RFTUQJMHg4MAorI2RlZmluZSBCU19USU1FCQkweDkwCisjZGVmaW5lIEJTX1VOTUFTSwkweGEwCisjZGVmaW5lIEJTX1VOTElOSwkweGIwCisjZGVmaW5lIEJTX1dSSVRFCTB4YzAKKworCisvKiBNYXhpbXVtIG51bWJlciBvZiBhcmd1bWVudHMgdG8gYW55IG9mIHRoZSBhYm92ZSBzZXJ2aWNlIHJlcXVlc3RzCisgKiAoaW4gYWRkaXRpb24gdG8gdGhlIHJlcXVlc3QgbnVtYmVyKS4KKyAqLworI2RlZmluZSBNQVhfU1JRX0FSR1MgICAgMworCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0aGF0IGNhbiBiZSByZWFkIG9yIHdyaXR0ZW4gYnkgYSBzaW5nbGUgSS9PIHJlcXVlc3QKKyAqLworI2RlZmluZSBCVUZTSVpFCQkxMDI0CisKKy8qIE5JTkRZIGNvbnNvbGUgSS9PIHJlcXVlc3RzOiAgQ08gc2VuZHMgYSBzaW5nbGUgY2hhcmFjdGVyIHRvIHN0ZG91dCwKKyAqIENJIHJlYWRzIG9uZS4KKyAqLworI2RlZmluZSBDSSAJCTAKKyNkZWZpbmUgQ08gCQkxCmRpZmYgLS1naXQgYS9nZGIvbmluZHktc2hhcmUvY29mZi5oIGIvZ2RiL25pbmR5LXNoYXJlL2NvZmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTY5YjcxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL25pbmR5LXNoYXJlL2NvZmYuaApAQCAtMCwwICsxLDMzNiBAQAorLyogIENvcHlyaWdodCAxOTkwLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqICAgVGhpcyBjb2RlIHdhcyBkb25hdGVkIGJ5IEludGVsIENvcnAuCisgKgorICogVGhpcyBpcyBhIGNvZmYgdmVyc2lvbiBvZiBhLm91dC5oIHRvIHN1cHBvcnQgODA5NjAgZGVidWdnaW5nIGZyb20KKyAqIGEgVW5peCAocG9zc2libHkgQlNEKSBob3N0LiAgSXQncyB1c2VkIGJ5OgorICoJbyBnZGI5NjAgdG8gc3ltYm9scyBpbiBjb2RlIGdlbmVyYXRlZCB3aXRoIEludGVsIChub24tR05VKSB0b29scy4KKyAqCW8gY29tbTk2MCB0byBjb252ZXJ0IGEgYi5vdXQgZmlsZSB0byBhIGNvZmYgZmlsZSBmb3IgZG93bmxvYWQuCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZmlsZWhkciB7CisJdW5zaWduZWQgc2hvcnQJZl9tYWdpYzsJLyogbWFnaWMgbnVtYmVyCQkJKi8KKwl1bnNpZ25lZCBzaG9ydAlmX25zY25zOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCisJbG9uZwkJZl90aW1kYXQ7CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLworCWxvbmcJCWZfc3ltcHRyOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCisJbG9uZwkJZl9uc3ltczsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCisJdW5zaWduZWQgc2hvcnQJZl9vcHRoZHI7CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLworCXVuc2lnbmVkIHNob3J0CWZfZmxhZ3M7CS8qIGZsYWdzCQkJKi8KK307CisKKworLyogQml0cyBmb3IgZl9mbGFnczoKKyAqCUZfUkVMRkxHCXJlbG9jYXRpb24gaW5mbyBzdHJpcHBlZCBmcm9tIGZpbGUKKyAqCUZfRVhFQwkJZmlsZSBpcyBleGVjdXRhYmxlIChubyB1bnJlc29sdmVkIGV4dGVybmVsIHJlZmVyZW5jZXMpCisgKglGX0xOTk8JCWxpbmUgbnVuYmVycyBzdHJpcHBlZCBmcm9tIGZpbGUKKyAqCUZfTFNZTVMJCWxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgZnJvbSBmaWxlCisgKglGX0FSMzJXUglmaWxlIGhhcyBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXUiBtYWNoaW5lIChlLmcuIHZheCkKKyAqLworI2RlZmluZSBGX1JFTEZMRwkwMDAwMDAxCisjZGVmaW5lIEZfRVhFQwkJMDAwMDAwMgorI2RlZmluZSBGX0xOTk8JCTAwMDAwMDQKKyNkZWZpbmUgRl9MU1lNUwkwMDAwMDEwCisjZGVmaW5lIEZfQVIzMldSCTAwMDA0MDAKKworCisvKgorICoJSW50ZWwgODA5NjAgKEk5NjApIHByb2Nlc3NvciBmbGFncy4KKyAqCUZfSTk2MFRZUEUgPT0gbWFzayBmb3IgcHJvY2Vzc29yIHR5cGUgZmllbGQuIAorICovCisjZGVmaW5lCUZfSTk2MFRZUEUJCTAxNzAwMDAKKyNkZWZpbmUJRl9JOTYwQ0EJCTAwMTAwMDAKKyNkZWZpbmUgRl9JOTYwRkxPQVQJCTAwMjAwMDAKKyNkZWZpbmUgRl9JOTYwQkEJCTAwMzAwMDAKKyNkZWZpbmUgRl9JOTYwWEEJCTAwNDAwMDAKKworLyoKKyAqIGk4MDk2MCBNYWdpYyBOdW1iZXJzCisgKi8KKyNkZWZpbmUgSTk2MFJPTUFHSUMJMDU0MAkvKiByZWFkLW9ubHkgdGV4dCBzZWdtZW50cwkqLworI2RlZmluZSBJOTYwUldNQUdJQwkwNTQxCS8qIHJlYWQtd3JpdGUgdGV4dCBzZWdtZW50cwkqLworCisjZGVmaW5lIEk5NjBCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9STk2MFJPTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9STk2MFJXTUFHSUMpKQorCisjZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZmlsZWhkcgorI2RlZmluZQlGSUxIU1oJc2l6ZW9mKEZJTEhEUikKKworCisvKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nCXBoeXNfYWRkcjsKKwl1bnNpZ25lZCBsb25nCWJpdGFycmF5OworfSBUQUdCSVRTOworCit0eXBlZGVmCXN0cnVjdCBhb3V0aGRyIHsKKwlzaG9ydAkJbWFnaWM7CS8qIHR5cGUgb2YgZmlsZQkJCQkqLworCXNob3J0CQl2c3RhbXA7CS8qIHZlcnNpb24gc3RhbXAJCQkqLworCXVuc2lnbmVkIGxvbmcJdHNpemU7CS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLworCXVuc2lnbmVkIGxvbmcJZHNpemU7CS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KKwl1bnNpZ25lZCBsb25nCWJzaXplOwkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCisjaWYgVTNCCisJdW5zaWduZWQgbG9uZwlkdW0xOworCXVuc2lnbmVkIGxvbmcJZHVtMjsJLyogcGFkIHRvIGVudHJ5IHBvaW50CSovCisjZW5kaWYKKwl1bnNpZ25lZCBsb25nCWVudHJ5OwkvKiBlbnRyeSBwdC4JCQkJKi8KKwl1bnNpZ25lZCBsb25nCXRleHRfc3RhcnQ7CS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KKwl1bnNpZ25lZCBsb25nCWRhdGFfc3RhcnQ7CS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KKwl1bnNpZ25lZCBsb25nCXRhZ2VudHJpZXM7CS8qIG51bWJlciBvZiB0YWcgZW50cmllcyB0byBmb2xsb3cgKi8KK30gQU9VVEhEUjsKKworLyogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgdGFnIGJpdHMgYXJyYXkgKi8KKworI2RlZmluZSBUQUdQVFIoYW91dCkgKChUQUdCSVRTICopICgmKGFvdXQudGFnZW50cmllcykrMSkpCisKKy8qIGNvbXB1dGUgc2l6ZSBvZiBhIGhlYWRlciAqLworCisjZGVmaW5lIEFPVVRTWihhb3V0KSAoc2l6ZW9mKEFPVVRIRFIpKyhhb3V0LnRhZ2VudHJpZXMqc2l6ZW9mKFRBR0JJVFMpKSkKKworLyoqKioqKioqKioqKioqKioqKioqKiogU1RPUkFHRSBDTEFTU0VTICoqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ19FRkNOCQktMQkvKiBwaHlzaWNhbCBlbmQgb2YgZnVuY3Rpb24JKi8KKyNkZWZpbmUgQ19OVUxMCQkwCisjZGVmaW5lIENfQVVUTwkJMQkvKiBhdXRvbWF0aWMgdmFyaWFibGUJCSovCisjZGVmaW5lIENfRVhUCQkyCS8qIGV4dGVybmFsIHN5bWJvbAkJKi8KKyNkZWZpbmUgQ19TVEFUCQkzCS8qIHN0YXRpYwkJCSovCisjZGVmaW5lIENfUkVHCQk0CS8qIHJlZ2lzdGVyIHZhcmlhYmxlCQkqLworI2RlZmluZSBDX0VYVERFRgk1CS8qIGV4dGVybmFsIGRlZmluaXRpb24JCSovCisjZGVmaW5lIENfTEFCRUwJCTYJLyogbGFiZWwJCQkqLworI2RlZmluZSBDX1VMQUJFTAk3CS8qIHVuZGVmaW5lZCBsYWJlbAkJKi8KKyNkZWZpbmUgQ19NT1MJCTgJLyogbWVtYmVyIG9mIHN0cnVjdHVyZQkJKi8KKyNkZWZpbmUgQ19BUkcJCTkJLyogZnVuY3Rpb24gYXJndW1lbnQJCSovCisjZGVmaW5lIENfU1RSVEFHCTEwCS8qIHN0cnVjdHVyZSB0YWcJCSovCisjZGVmaW5lIENfTU9VCQkxMQkvKiBtZW1iZXIgb2YgdW5pb24JCSovCisjZGVmaW5lIENfVU5UQUcJCTEyCS8qIHVuaW9uIHRhZwkJCSovCisjZGVmaW5lIENfVFBERUYJCTEzCS8qIHR5cGUgZGVmaW5pdGlvbgkJKi8KKyNkZWZpbmUgQ19VU1RBVElDCTE0CS8qIHVuZGVmaW5lZCBzdGF0aWMJCSovCisjZGVmaW5lIENfRU5UQUcJCTE1CS8qIGVudW1lcmF0aW9uIHRhZwkJKi8KKyNkZWZpbmUgQ19NT0UJCTE2CS8qIG1lbWJlciBvZiBlbnVtZXJhdGlvbgkqLworI2RlZmluZSBDX1JFR1BBUk0JMTcJLyogcmVnaXN0ZXIgcGFyYW1ldGVyCQkqLworI2RlZmluZSBDX0ZJRUxECQkxOAkvKiBiaXQgZmllbGQJCQkqLworI2RlZmluZSBDX0JMT0NLCQkxMDAJLyogIi5iYiIgb3IgIi5lYiIJCSovCisjZGVmaW5lIENfRkNOCQkxMDEJLyogIi5iZiIgb3IgIi5lZiIJCSovCisjZGVmaW5lIENfRU9TCQkxMDIJLyogZW5kIG9mIHN0cnVjdHVyZQkJKi8KKyNkZWZpbmUgQ19GSUxFCQkxMDMJLyogZmlsZSBuYW1lCQkJKi8KKyNkZWZpbmUgQ19MSU5FCQkxMDQJLyogbGluZSAjIHJlZm9ybWF0dGVkIGFzIHN5bWJvbCB0YWJsZSBlbnRyeSAqLworI2RlZmluZSBDX0FMSUFTCSAJMTA1CS8qIGR1cGxpY2F0ZSB0YWcJCSovCisjZGVmaW5lIENfSElEREVOCTEwNgkvKiBleHQgc3ltYm9sIGluIGRtZXJ0IHB1YmxpYyBsaWIgKi8KKworCS8qIE5ldyBzdG9yYWdlIGNsYXNzZXMgZm9yIDgwOTYwICovCisgCisjZGVmaW5lIENfU0NBTEwJCTEwNwkvKiBQcm9jZWR1cmUgcmVhY2hhYmxlIHZpYSBzeXN0ZW0gY2FsbAkqLworI2RlZmluZSBDX0xFQUZQUk9DCTEwOAkvKiBMZWFmIHByb2NlZHVyZSwgImNhbGwiIHZpYSBCQUwJKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3Qgc2NuaGRyIHsKKwljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCisJbG9uZwkJc19wYWRkcjsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KKwlsb25nCQlzX3ZhZGRyOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCisJbG9uZwkJc19zaXplOwkJLyogc2VjdGlvbiBzaXplCQkJKi8KKwlsb25nCQlzX3NjbnB0cjsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KKwlsb25nCQlzX3JlbHB0cjsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLworCWxvbmcJCXNfbG5ub3B0cjsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCisJdW5zaWduZWQgc2hvcnQJc19ucmVsb2M7CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KKwl1bnNpZ25lZCBzaG9ydAlzX25sbm5vOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCisJbG9uZwkJc19mbGFnczsJLyogZmxhZ3MJCQkqLworCXVuc2lnbmVkIGxvbmcJc19hbGlnbjsJLyogc2VjdGlvbiBhbGlnbm1lbnQJCSovCit9OworCisvKgorICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCisgKi8KKyNkZWZpbmUgX1RFWFQJIi50ZXh0IgorI2RlZmluZSBfREFUQQkiLmRhdGEiCisjZGVmaW5lIF9CU1MJIi5ic3MiCisKKy8qCisgKiBzX2ZsYWdzICJ0eXBlIgorICovCisjZGVmaW5lCVNUWVBfVEVYVAkweDIwCQkvKiBzZWN0aW9uIGNvbnRhaW5zIHRleHQgb25seQkqLworI2RlZmluZSBTVFlQX0RBVEEJMHg0MAkJLyogc2VjdGlvbiBjb250YWlucyBkYXRhIG9ubHkJKi8KKyNkZWZpbmUgU1RZUF9CU1MJMHg4MAkJLyogc2VjdGlvbiBjb250YWlucyBic3Mgb25seQkqLworCisjZGVmaW5lCVNDTkhEUglzdHJ1Y3Qgc2NuaGRyCisjZGVmaW5lCVNDTkhTWglzaXplb2YoU0NOSERSKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KKyAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgorICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKKyAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KKyAqLworc3RydWN0IGxpbmVub3sKKwl1bmlvbiB7CisJCWxvbmcgbF9zeW1uZHg7CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLworCQlsb25nIGxfcGFkZHI7CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLworCX0gbF9hZGRyOworCXVuc2lnbmVkIHNob3J0CWxfbG5ubzsJLyogbGluZSBudW1iZXIJCSovCisJY2hhciBwYWRkaW5nWzJdOwkvKiBmb3JjZSBhbGlnbm1lbnQJKi8KK307CisKKyNkZWZpbmUJTElORU5PCXN0cnVjdCBsaW5lbm8KKyNkZWZpbmUJTElORVNaCXNpemVvZihMSU5FTk8pIAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCisjZGVmaW5lIEZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KKyNkZWZpbmUgRElNTlVNCQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KKworCitzdHJ1Y3Qgc3ltZW50IHsKKwl1bmlvbiB7CisJCWNoYXIJX25fbmFtZVtTWU1OTUxFTl07CS8qIG9sZCBDT0ZGIHZlcnNpb24JKi8KKwkJc3RydWN0IHsKKwkJCWxvbmcJX25femVyb2VzOwkvKiBuZXcgPT0gMAkJKi8KKwkJCWxvbmcJX25fb2Zmc2V0OwkvKiBvZmZzZXQgaW50byBzdHJpbmcgdGFibGUgKi8KKwkJfSBfbl9uOworCQljaGFyCSpfbl9ucHRyWzJdOwkvKiBhbGxvd3MgZm9yIG92ZXJsYXlpbmcJKi8KKwl9IF9uOworCWxvbmcJCW5fdmFsdWU7CS8qIHZhbHVlIG9mIHN5bWJvbAkJKi8KKwlzaG9ydAkJbl9zY251bTsJLyogc2VjdGlvbiBudW1iZXIJCSovCisJY2hhcgkJcGFkMVsyXTsJLyogZm9yY2UgYWxpZ25tZW50CQkqLworCXVuc2lnbmVkIGxvbmcJbl90eXBlOwkJLyogdHlwZSBhbmQgZGVyaXZlZCB0eXBlCSovCisJY2hhcgkJbl9zY2xhc3M7CS8qIHN0b3JhZ2UgY2xhc3MJCSovCisJY2hhcgkJbl9udW1hdXg7CS8qIG51bWJlciBvZiBhdXguIGVudHJpZXMJKi8KKwljaGFyCQlwYWQyWzJdOwkvKiBmb3JjZSBhbGlnbm1lbnQJCSovCit9OworCisjZGVmaW5lIG5fbmFtZQkJX24uX25fbmFtZQorI2RlZmluZSBuX3plcm9lcwlfbi5fbl9uLl9uX3plcm9lcworI2RlZmluZSBuX29mZnNldAlfbi5fbl9uLl9uX29mZnNldAorCisvKgorICogUmVsb2NhdGFibGUgc3ltYm9scyBoYXZlIG51bWJlciBvZiB0aGUgc2VjdGlvbiBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkLAorICogb3Igb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKi8KKyNkZWZpbmUgTl9VTkRFRgkwCS8qIHVuZGVmaW5lZCBzeW1ib2wJCQkJKi8KKyNkZWZpbmUgTl9BQlMJLTEJLyogdmFsdWUgb2Ygc3ltYm9sIGlzIGFic29sdXRlCQkJKi8KKyNkZWZpbmUgTl9ERUJVRwktMgkvKiBkZWJ1Z2dpbmcgc3ltYm9sIC0tIHN5bWJvbCB2YWx1ZSBpcyBtZWFuaW5nbGVzcyAqLworCisvKgorICogVHlwZSBvZiBhIHN5bWJvbCwgaW4gbG93IDQgYml0cyBvZiB0aGUgd29yZAorICovCisjZGVmaW5lIFRfTlVMTAkJMAorI2RlZmluZSBUX1ZPSUQJCTEJLyogZnVuY3Rpb24gYXJndW1lbnQgKG9ubHkgdXNlZCBieSBjb21waWxlcikgKi8KKyNkZWZpbmUgVF9DSEFSCQkyCS8qIGNoYXJhY3RlcgkJKi8KKyNkZWZpbmUgVF9TSE9SVAkJMwkvKiBzaG9ydCBpbnRlZ2VyCSovCisjZGVmaW5lIFRfSU5UCQk0CS8qIGludGVnZXIJCSovCisjZGVmaW5lIFRfTE9ORwkJNQkvKiBsb25nIGludGVnZXIJCSovCisjZGVmaW5lIFRfRkxPQVQJCTYJLyogZmxvYXRpbmcgcG9pbnQJKi8KKyNkZWZpbmUgVF9ET1VCTEUJNwkvKiBkb3VibGUgd29yZAkJKi8KKyNkZWZpbmUgVF9TVFJVQ1QJOAkvKiBzdHJ1Y3R1cmUgCQkqLworI2RlZmluZSBUX1VOSU9OCQk5CS8qIHVuaW9uIAkJKi8KKyNkZWZpbmUgVF9FTlVNCQkxMAkvKiBlbnVtZXJhdGlvbiAJCSovCisjZGVmaW5lIFRfTU9FCQkxMQkvKiBtZW1iZXIgb2YgZW51bWVyYXRpb24qLworI2RlZmluZSBUX1VDSEFSCQkxMgkvKiB1bnNpZ25lZCBjaGFyYWN0ZXIJKi8KKyNkZWZpbmUgVF9VU0hPUlQJMTMJLyogdW5zaWduZWQgc2hvcnQJKi8KKyNkZWZpbmUgVF9VSU5UCQkxNAkvKiB1bnNpZ25lZCBpbnRlZ2VyCSovCisjZGVmaW5lIFRfVUxPTkcJCTE1CS8qIHVuc2lnbmVkIGxvbmcJKi8KKyNkZWZpbmUgVF9MTkdEQkwJMTYJLyogbG9uZyBkb3VibGUJCSovCisKKworLyoKKyAqIGRlcml2ZWQgdHlwZXMKKyAqLworI2RlZmluZSBEVF9QVFIJCTEJLyogcG9pbnRlcgkqLworI2RlZmluZSBEVF9GQ04JCTIJLyogZnVuY3Rpb24JKi8KKyNkZWZpbmUgRFRfQVJZCQkzCS8qIGFycmF5CSovCisKKyNkZWZpbmUgTl9CVE1BU0sJMDM3CisjZGVmaW5lIE5fVE1BU0sJCTAxNDAKKyNkZWZpbmUgTl9CVFNIRlQJNQorI2RlZmluZSBOX1RTSElGVAkyCisKKyNkZWZpbmUgQlRZUEUoeCkJKCh4KSAmIE5fQlRNQVNLKQorCisKKyNkZWZpbmUgSVNQVFIoeCkJKCgoeCkgJiBOX1RNQVNLKSA9PSAoRFRfUFRSIDw8IE5fQlRTSEZUKSkKKyNkZWZpbmUgSVNGQ04oeCkJKCgoeCkgJiBOX1RNQVNLKSA9PSAoRFRfRkNOIDw8IE5fQlRTSEZUKSkKKyNkZWZpbmUgSVNBUlkoeCkJKCgoeCkgJiBOX1RNQVNLKSA9PSAoRFRfQVJZIDw8IE5fQlRTSEZUKSkKKworI2RlZmluZSBERUNSRUYoeCkgKCgoKHgpPj5OX1RTSElGVCkmfk5fQlRNQVNLKXwoKHgpJk5fQlRNQVNLKSkKKwordW5pb24gYXV4ZW50IHsKKwlzdHJ1Y3QgeworCQlsb25nIHhfdGFnbmR4OwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCisJCXVuaW9uIHsKKwkJCXN0cnVjdCB7CisJCQkgICAgdW5zaWduZWQgc2hvcnQgeF9sbm5vOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLworCQkJICAgIHVuc2lnbmVkIHNob3J0IHhfc2l6ZTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KKwkJCX0geF9sbnN6OworCQkJbG9uZyB4X2ZzaXplOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCisJCX0geF9taXNjOworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCisJCQkgICAgbG9uZyB4X2xubm9wdHI7CS8qIHB0ciB0byBmY24gbGluZSAjICovCisJCQkgICAgbG9uZyB4X2VuZG5keDsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCisJCQl9IHhfZmNuOworCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLworCQkJICAgIHVuc2lnbmVkIHNob3J0IHhfZGltZW5bRElNTlVNXTsKKwkJCX0geF9hcnk7CisJCX0geF9mY25hcnk7CisJCXVuc2lnbmVkIHNob3J0IHhfdHZuZHg7CQkvKiB0diBpbmRleCAqLworCX0geF9zeW07CisKKwl1bmlvbiB7CisJCWNoYXIgeF9mbmFtZVtGSUxOTUxFTl07CisJCXN0cnVjdCB7CisJCQlsb25nIHhfemVyb2VzOworCQkJbG9uZyB4X29mZnNldDsKKwkJfSB4X247CisJfSB4X2ZpbGU7CisKKwlzdHJ1Y3QgeworCQlsb25nIHhfc2NubGVuOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCisJCXVuc2lnbmVkIHNob3J0IHhfbnJlbG9jOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLworCQl1bnNpZ25lZCBzaG9ydCB4X25saW5ubzsJLyogIyBsaW5lIG51bWJlcnMgKi8KKwl9IHhfc2NuOworCisJc3RydWN0IHsKKwkJbG9uZyB4X3N0ZGluZHg7CisJfSB4X3NjOworCisJc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZyB4X2JhbG50cnk7CisJfSB4X2JhbDsKKworCWNoYXIgYVtzaXplb2Yoc3RydWN0IHN5bWVudCldOwkvKiBmb3JjZSBhdXhlbnQvc3ltZW50IHNpemVzIHRvIG1hdGNoICovCit9OworCisjZGVmaW5lCVNZTUVOVAlzdHJ1Y3Qgc3ltZW50CisjZGVmaW5lCVNZTUVTWglzaXplb2YoU1lNRU5UKQkKKyNkZWZpbmUJQVVYRU5UCXVuaW9uIGF1eGVudAorI2RlZmluZQlBVVhFU1oJc2l6ZW9mKEFVWEVOVCkKKworI2lmIFZBWCB8fCBJOTYwCisjCWRlZmluZSBfRVRFWFQJIl9ldGV4dCIKKyNlbHNlCisjCWRlZmluZSBfRVRFWFQJImV0ZXh0IgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgcmVsb2MgeworCWxvbmcgcl92YWRkcjsJCS8qIFZpcnR1YWwgYWRkcmVzcyBvZiByZWZlcmVuY2UgKi8KKwlsb25nIHJfc3ltbmR4OwkJLyogSW5kZXggaW50byBzeW1ib2wgdGFibGUJKi8KKwl1bnNpZ25lZCBzaG9ydCByX3R5cGU7CS8qIFJlbG9jYXRpb24gdHlwZQkJKi8KKwljaGFyIHBhZFsyXTsJCS8qIFVudXNlZAkJCSovCit9OworCisvKiBPbmx5IHZhbHVlcyBvZiByX3R5cGUgR05VLzk2MCBjYXJlcyBhYm91dCAqLworI2RlZmluZSBSX1JFTExPTkcJMTcJLyogRGlyZWN0IDMyLWJpdCByZWxvY2F0aW9uCQkqLworI2RlZmluZSBSX0lQUk1FRAkyNQkvKiAyNC1iaXQgaXAtcmVsYXRpdmUgcmVsb2NhdGlvbgkqLworI2RlZmluZSBSX09QVENBTEwJMjcJLyogMzItYml0IG9wdGltaXphYmxlIGNhbGwgKGxlYWZwcm9jL3N5c3Byb2MpICovCisKKworI2RlZmluZSBSRUxPQyBzdHJ1Y3QgcmVsb2MKKyNkZWZpbmUgUkVMU1ogc2l6ZW9mKFJFTE9DKQpkaWZmIC0tZ2l0IGEvZ2RiL25pbmR5LXNoYXJlL2Vudi5oIGIvZ2RiL25pbmR5LXNoYXJlL2Vudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMWNlZWYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbmluZHktc2hhcmUvZW52LmgKQEAgLTAsMCArMSwxMiBAQAorLyogQ29weXJpZ2h0IDE5OTAsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBjb2RlIHdhcyBkb25hdGVkIGJ5IEludGVsIENvcnAuCisgKiAKKyAqIEdOVS85NjAgdG9vbCBydW50aW1lIGVudmlyb25tZW50CisgKi8KKworCisvKiBCYXNlIGRpcmVjdG9yeSBhdCB3aGljaCBHTlUvOTYwIHRvb2xzIGFyZSBhc3N1bWVkIHRvIGJlIGluc3RhbGxlZCwgaWYKKyAqIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBHOTYwQkFTRSBpcyBub3QgZGVmaW5lZC4KKyAqLworI2RlZmluZSBERUZBVUxUX0JBU0UJIi91c3IvbG9jYWwvZzk2MCIKZGlmZiAtLWdpdCBhL2dkYi9uaW5keS1zaGFyZS9uaW5keS5jIGIvZ2RiL25pbmR5LXNoYXJlL25pbmR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI3NWU0OQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9uaW5keS1zaGFyZS9uaW5keS5jCkBAIC0wLDAgKzEsMTE1NCBAQAorLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIHN0YXJ0ZWQgb3V0IGxpZmUgYXMgY29kZSBzaGFyZWQgYmV0d2VlbiB0aGUgbmluZHkgbW9uaXRvciBhbmQKKyAgIEdEQi4gIEZvciB2YXJpb3VzIHJlYXNvbnMsIHRoaXMgaXMgbm8gbG9uZ2VyIHRydWUuICBFdmVudHVhbGx5LCBpdAorICAgcHJvYmFibHkgc2hvdWxkIGJlIG1lcmdlZCBpbnRvIHJlbW90ZS1uaW5keS5jLiAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCSAJCU5JTkRZIElOVEVSRkFDRSBST1VUSU5FUworICoKKyAqIFRoZSBjYWxsZXIgb2YgdGhlc2Ugcm91dGluZXMgc2hvdWxkIGJlIGF3YXJlIHRoYXQ6CisgKgorICogKDEpIG5pbkNvbm5lY3QoKSBzaG91bGQgYmUgY2FsbGVkIHRvIG9wZW4gY29tbXVuaWNhdGlvbnMgd2l0aCB0aGUKKyAqICAgICByZW1vdGUgTklORFkgYm9hcmQgYmVmb3JlIGFueSBvZiB0aGUgb3RoZXIgcm91dGluZXMgYXJlIGludm9rZWQuCisgKgorICogKDIpIGFsbW9zdCBhbGwgaW50ZXJhY3Rpb25zIGFyZSBkcml2ZW4gYnkgdGhlIGhvc3Q6IG5pbmR5IHNlbmRzIGluZm9ybWF0aW9uCisgKiAgICAgaW4gcmVzcG9uc2UgdG8gaG9zdCBjb21tYW5kcy4KKyAqCisgKiAoMykgdGhlIGxvbmUgZXhjZXB0aW9uIHRvICgyKSBpcyB0aGUgc2luZ2xlIGNoYXJhY3RlciBETEUgKF5QLCAweDEwKS4KKyAqICAgICBSZWNlaXB0IG9mIGEgRExFIGZyb20gTklORFkgaW5kaWNhdGVzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0KKyAqICAgICBydW5uaW5nIHVuZGVyIE5JTkRZIGhhcyBzdG9wcGVkIGV4ZWN1dGlvbiBhbmQgdGhhdCBOSU5EWSBpcyBub3cKKyAqICAgICBhdmFpbGFibGUgdG8gdGFsayB0byB0aGUgaG9zdCAoYWxsIG90aGVyIGNvbW11bmljYXRpb24gcmVjZWl2ZWQgYWZ0ZXIKKyAqICAgICB0aGUgYXBwbGljYXRpb24gaGFzIGJlZW4gc3RhcnRlZCBzaG91bGQgYmUgcHJlc3VtZWQgdG8gY29tZSBmcm9tIHRoZQorICogICAgIGFwcGxpY2F0aW9uIGFuZCBzaG91bGQgYmUgcGFzc2VkIG9uIGJ5IHRoZSBob3N0IHRvIHN0ZG91dCkuCisgKgorICogKDQpIHRoZSByZWFzb24gdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gc3RvcHBlZCBjYW4gYmUgZGV0ZXJtaW5lZCB3aXRoIHRoZQorICogICAgIG5pblN0b3BXaHkoKSBmdW5jdGlvbi4gIFRoZXJlIGFyZSB0aHJlZSBjbGFzc2VzIG9mIHN0b3AgcmVhc29uczoKKyAqCisgKgkoYSkgdGhlIGFwcGxpY2F0aW9uIGhhcyB0ZXJtaW5hdGVkIGV4ZWN1dGlvbi4KKyAqCSAgICBUaGUgaG9zdCBzaG91bGQgdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24uCisgKgorICoJKGIpIHRoZSBhcHBsaWNhdGlvbiBoYWQgYSBmYXVsdCBvciB0cmFjZSBldmVudC4KKyAqCSAgICBUaGUgaG9zdCBzaG91bGQgdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24uCisgKgorICoJKGMpIHRoZSBhcHBsaWNhdGlvbiB3aXNoZXMgdG8gbWFrZSBhIHNlcnZpY2UgcmVxdWVzdCAoc3JxKSBvZiB0aGUgaG9zdDsKKyAqCSAgICBlLmcuLCB0byBvcGVuL2Nsb3NlIGEgZmlsZSwgcmVhZC93cml0ZSBhIGZpbGUsIGV0Yy4gIFRoZSBuaW5TcnEoKQorICoJICAgIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lIHRoZSBuYXR1cmUgb2YgdGhlIHJlcXVlc3QKKyAqCSAgICBhbmQgcHJvY2VzcyBpdC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic2VyaWFsLmgiCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjZWxzZQorI2luY2x1ZGUgPHZhcmFyZ3MuaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKEhBVkVfVEVSTUlPUykgJiYgIWRlZmluZWQgKEhBVkVfVEVSTUlPKSAmJiAhZGVmaW5lZCAoSEFWRV9TR1RUWSkKKyNkZWZpbmUgSEFWRV9TR1RUWQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NHVFRZCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgkvKiBOZWVkZWQgYnkgZmlsZS5oIG9uIFN5cyBWICovCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaWYgMAorI2luY2x1ZGUgInR0eWNudGwuaCIKKyNlbmRpZgorI2luY2x1ZGUgImJsb2NrX2lvLmgiCisjaW5jbHVkZSAid2FpdC5oIgorI2luY2x1ZGUgImVudi5oIgorCisjZGVmaW5lIERMRQkweDEwCS8qIF5QICovCisjZGVmaW5lIFhPTgkweDExCS8qIF5RICovCisjZGVmaW5lIFhPRkYJMHgxMwkvKiBeUyAqLworI2RlZmluZSBFU0MJMHgxYgorCisjZGVmaW5lIFRJTUVPVVQJCS0xCisKK2ludCBxdWlldCA9IDA7CS8qIDEgPT4gc3RpZmxlIHVubmVjZXNzYXJ5IG1lc3NhZ2VzICovCitzZXJpYWxfdCBuaW5keV9zZXJpYWw7CisKK3N0YXRpYyBpbnQgb2xkX25pbmR5ID0gMDsgLyogMSA9PiB1c2Ugb2xkIChoZXgpIGNvbW11bmljYXRpb24gcHJvdG9jb2wgKi8KK3N0YXRpYyBuaW5TdHJHZXQoKTsKKwwKKwkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJICogICAgICAgICAgICAgICAgICAgICAgICAgICoKKwkJICogIE1JU0NFTExBTkVPVVMgVVRJTFRJRVMgICoKKwkJICogICAgICAgICAgICAgICAgICAgICAgICAgICoKKwkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHNheToKKyAqCVRoaXMgaXMgYSBwcmludGYgdGhhdCB0YWtlcyBhdCBtb3N0IHR3byBhcmd1bWVudHMgKGluIGFkZGl0aW9uIHRvIHRoZQorICoJZm9ybWF0IHN0cmluZykgYW5kIHRoYXQgb3V0cHV0cyBub3RoaW5nIGlmIHZlcmJvc2Ugb3V0cHV0IGhhcyBiZWVuCisgKglzdXBwcmVzc2VkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBWQVJBUkdTICovCitzdGF0aWMgdm9pZAorI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworc2F5IChjaGFyICpmbXQsIC4uLikKKyNlbHNlCitzYXkgKHZhX2FsaXN0KQorICAgICB2YV9kY2wKKyNlbmRpZgoreworICB2YV9saXN0IGFyZ3M7CisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisjZWxzZQorICBjaGFyICpmbXQ7CisKKyAgdmFfc3RhcnQgKGFyZ3MpOworICBmbXQgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7CisjZW5kaWYKKworICBpZiAoIXF1aWV0KQorICAgIHsKKyAgICAgIHZmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRvdXQsIGZtdCwgYXJncyk7CisgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworICAgIH0KKyAgdmFfZW5kIChhcmdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXhpc3RzOgorICoJQ3JlYXRlcyBhIGZ1bGwgcGF0aG5hbWUgYnkgY29uY2F0ZW5hdGluZyB1cCB0byB0aHJlZSBuYW1lIGNvbXBvbmVudHMKKyAqCW9udG8gYSBzcGVjaWZpZWQgYmFzZSBuYW1lOyBvcHRpb25hbGx5IGxvb2tzIHVwIHRoZSBiYXNlIG5hbWUgYXMgYQorICoJcnVudGltZSBlbnZpcm9ubWVudCB2YXJpYWJsZTsgIGFuZCBjaGVja3MgdG8gc2VlIGlmIHRoZSBmaWxlIG9yCisgKglkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IHRoZSBwYXRobmFtZSBhY3R1YWxseSBleGlzdHMuCisgKgorICoJUmV0dXJuczogIHRoZSBmdWxsIHBhdGhuYW1lIGlmIGl0IGV4aXN0cywgTlVMTCBvdGhlcndpc2UuCisgKgkJKHJldHVybmVkIHBhdGhuYW1lIGlzIGluIG1hbGxvYydkIG1lbW9yeSBhbmQgbXVzdCBiZSBmcmVlZAorICoJCWJ5IGNhbGxlcikuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY2hhciAqCitleGlzdHMoIGJhc2UsIGMxLCBjMiwgYzMsIGVudiApCisgICAgY2hhciAqYmFzZTsJCS8qIEJhc2UgZGlyZWN0b3J5IG9mIHBhdGggKi8KKyAgICBjaGFyICpjMSwgKmMyLCAqYzM7CS8qIENvbXBvbmVudHMgKHN1YmRpcmVjdG9yaWVzIGFuZC9vciBmaWxlIG5hbWUpIHRvIGJlCisJCQkgKglhcHBlbmRlZCBvbnRvIHRoZSBiYXNlIGRpcmVjdG9yeSBuYW1lLiAgT25lIG9yCisJCQkgKgltb3JlIG1heSBiZSBvbWl0dGVkIGJ5IHBhc3NpbmcgTlVMTCBwb2ludGVycy4KKwkJCSAqLworICAgIGludCBlbnY7CQkvKiBJZiAxLCAnKmJhc2UnIGlzIHRoZSBuYW1lIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlCisJCQkgKgl0byBiZSBleGFtaW5lZCBmb3IgdGhlIGJhc2UgZGlyZWN0b3J5IG5hbWU7CisJCQkgKglvdGhlcndpc2UsICcqYmFzZScgaXMgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZQorCQkJICoJYmFzZSBkaXJlY3RvcnkuCisJCQkgKi8KK3sKKwlzdHJ1Y3Qgc3RhdCBidWY7LyogRm9yIGNhbGwgdG8gJ3N0YXQnIC0tIG5ldmVyIGV4YW1pbmVkICovCisJY2hhciAqcGF0aDsJLyogUG9pbnRlciB0byBmdWxsIHBhdGhuYW1lIChtYWxsb2MnZCBtZW1vcnkpICovCisJaW50IGxlbjsJLyogTGVuZ3RoIG9mIGZ1bGwgcGF0aG5hbWUgKGluY2wuIHRlcm1pbmF0b3IpICovCisJZXh0ZXJuIGNoYXIgKmdldGVudigpOworCisKKwlpZiAoIGVudiApeworCQliYXNlID0gZ2V0ZW52KCBiYXNlICk7CisJCWlmICggYmFzZSA9PSBOVUxMICl7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCWxlbiA9IHN0cmxlbihiYXNlKSArIDQ7CisJCQkvKiArNCBmb3IgdGVybWluYXRvciBhbmQgIi8iIGJlZm9yZSBlYWNoIGNvbXBvbmVudCAqLworCWlmICggYzEgIT0gTlVMTCApeworCQlsZW4gKz0gc3RybGVuKGMxKTsKKwl9CisJaWYgKCBjMiAhPSBOVUxMICl7CisJCWxlbiArPSBzdHJsZW4oYzIpOworCX0KKwlpZiAoIGMzICE9IE5VTEwgKXsKKwkJbGVuICs9IHN0cmxlbihjMyk7CisJfQorCisJcGF0aCA9IHhtYWxsb2MgKGxlbik7CisKKwlzdHJjcHkoIHBhdGgsIGJhc2UgKTsKKwlpZiAoIGMxICE9IE5VTEwgKXsKKwkJc3RyY2F0KCBwYXRoLCAiLyIgKTsKKwkJc3RyY2F0KCBwYXRoLCBjMSApOworCQlpZiAoIGMyICE9IE5VTEwgKXsKKwkJCXN0cmNhdCggcGF0aCwgIi8iICk7CisJCQlzdHJjYXQoIHBhdGgsIGMyICk7CisJCQlpZiAoIGMzICE9IE5VTEwgKXsKKwkJCQlzdHJjYXQoIHBhdGgsICIvIiApOworCQkJCXN0cmNhdCggcGF0aCwgYzMgKTsKKwkJCX0KKwkJfQorCX0KKworCWlmICggc3RhdChwYXRoLCZidWYpICE9IDAgKXsKKwkJZnJlZSggcGF0aCApOworCQlwYXRoID0gTlVMTDsKKwl9CisJcmV0dXJuIHBhdGg7Cit9CisMCisJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKwkJICogIExPVy1MRVZFTCBDT01NVU5JQ0FUSU9OICAqCisJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJlYWQgKmV4YWN0bHkqIE4gY2hhcmFjdGVycyBmcm9tIHRoZSBOSU5EWSB0dHksIGFuZCBwdXQgdGhlbSBpbgorICAgKkJVRi4gIFRyYW5zbGF0ZSBlc2NhcGUgc2VxdWVuY2VzIGludG8gc2luZ2xlIGNoYXJhY3RlcnMsIGNvdW50aW5nCisgICBlYWNoIHN1Y2ggc2VxdWVuY2UgYXMgMSBjaGFyYWN0ZXIuCisKKyAgIEFuIGVzY2FwZSBzZXF1ZW5jZSBjb25zaXN0cyBvZiBFU0MgYW5kIGEgZm9sbG93aW5nIGNoYXJhY3Rlci4gIFRoZQorICAgRVNDIGlzIGRpc2NhcmRlZCBhbmQgdGhlIG90aGVyIGNoYXJhY3RlciBnZXRzIGJpdCAweDQwIGNsZWFyZWQgLS0KKyAgIHRodXMgRVNDIFAgPT0gXlAsIEVTQyBTID09IF5TLCBFU0MgWyA9PSBFU0MsIGV0Yy4KKworICAgUmV0dXJuIDEgaWYgc3VjY2Vzc2Z1bCwgMCBpZiBtb3JlIHRoYW4gVElNRU9VVCBzZWNvbmRzIHBhc3Mgd2l0aG91dAorICAgYW55IGlucHV0LiAgKi8KKworc3RhdGljIGludAorcmRuaW4gKGJ1ZixuLHRpbWVvdXQpCisgICAgdW5zaWduZWQgY2hhciAqIGJ1ZjsJLyogV2hlcmUgdG8gcGxhY2UgY2hhcmFjdGVycyByZWFkCSovCisgICAgaW50IG47CQkJLyogTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZAkJKi8KKyAgICBpbnQgdGltZW91dDsJCS8qIFRpbWVvdXQsIGluIHNlY29uZHMJCQkqLworeworICBpbnQgZXNjYXBlX3NlZW47CS8qIDEgPT4gbGFzdCBjaGFyYWN0ZXIgb2YgYSByZWFkIHdhcyBhbiBFU0MgKi8KKyAgaW50IGM7CisKKyAgZXNjYXBlX3NlZW4gPSAwOworICB3aGlsZSAobikKKyAgICB7CisgICAgICBjID0gU0VSSUFMX1JFQURDSEFSIChuaW5keV9zZXJpYWwsIHRpbWVvdXQpOworICAgICAgc3dpdGNoIChjKQorCXsKKwljYXNlIFNFUklBTF9FUlJPUjoKKwljYXNlIFNFUklBTF9USU1FT1VUOgorCWNhc2UgU0VSSUFMX0VPRjoKKwkgIHJldHVybiAwOworCisJY2FzZSBFU0M6CisJICBlc2NhcGVfc2VlbiA9IDE7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBpZiAoZXNjYXBlX3NlZW4pCisJICAgIHsKKwkgICAgICBlc2NhcGVfc2VlbiA9IDA7CisJICAgICAgYyAmPSB+MHg0MDsKKwkgICAgfQorCSAgKmJ1ZisrID0gYzsKKwkgIC0tbjsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIHJldHVybiAxOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldHBrdDoKKyAqCVJlYWQgYSBwYWNrZXQgZnJvbSBhIHJlbW90ZSBOSU5EWSwgd2l0aCBlcnJvciBjaGVja2luZywgaW50byB0aGUKKyAqCWluZGljYXRlZCBidWZmZXIuCisgKgorICoJUmV0dXJuIHBhY2tldCBzdGF0dXMgYnl0ZSBvbiBzdWNjZXNzLCBUSU1FT1VUIG9uIGZhaWx1cmUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljCitpbnQKK2dldHBrdChidWYpCisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGhkclszXTsJLyogUGFja2V0IGhlYWRlcjoKKwkJCQkgKgloZHJbMF0gPSBsb3cgYnl0ZSBvZiBtZXNzYWdlIGxlbmd0aAorCQkJCSAqCWhkclsxXSA9IGhpZ2ggYnl0ZSBvZiBtZXNzYWdlIGxlbmd0aAorCQkJCSAqCWhkclsyXSA9IG1lc3NhZ2Ugc3RhdHVzCisJCQkJICovCisJaW50IGNudDsJCS8qIE1lc3NhZ2UgbGVuZ3RoIChzdGF0dXMgYnl0ZSArIGRhdGEpCSovCisJdW5zaWduZWQgY2hhciBjc19jYWxjOwkvKiBDaGVja3N1bSBjYWxjdWxhdGVkCQkJKi8KKwl1bnNpZ25lZCBjaGFyIGNzX3JlY3Y7CS8qIENoZWNrc3VtIHJlY2VpdmVkCQkJKi8KKwlzdGF0aWMgY2hhciBlcnJmbXRbXSA9CisJCQkiQmFkIGNoZWNrc3VtIChyZWN2PTB4JTAyeDsgY2FsYz0weCUwMngpOyByZXRyeWluZ1xyXG4iOworCisJd2hpbGUgKDEpeworCQlpZiAoICFyZG5pbihoZHIsMyw1KSApeworCQkJcmV0dXJuIFRJTUVPVVQ7CisJCX0KKwkJY250ID0gKGhkclsxXTw8OCkgKyBoZHJbMF0gLSAxOworCQkJCQkvKiAtMSBmb3Igc3RhdHVzIGJ5dGUgKGFscmVhZHkgcmVhZCkgKi8KKworCQkvKiBDYWxsZXIncyBidWZmZXIgbWF5IG9ubHkgYmUgYmlnIGVub3VnaCBmb3IgbWVzc2FnZSBib2R5LAorCQkgKiB3aXRob3V0IHN0YXR1cyBieXRlIGFuZCBjaGVja3N1bSwgc28gbWFrZSBzdXJlIHRvIHJlYWQKKwkJICogY2hlY2tzdW0gaW50byBhIHNlcGFyYXRlIGJ1ZmZlci4KKwkJICovCisJCWlmICggIXJkbmluKGJ1ZixjbnQsNSkgfHwgIXJkbmluKCZjc19yZWN2LDEsNSkgKXsKKwkJCXJldHVybiBUSU1FT1VUOworCQl9CisKKwkJLyogQ2FsY3VsYXRlIGNoZWNrc3VtCisJCSAqLworCQljc19jYWxjID0gaGRyWzBdICsgaGRyWzFdICsgaGRyWzJdOworCQlmb3IgKCBpID0gMDsgaSA8IGNudDsgaSsrICl7CisJCQljc19jYWxjICs9IGJ1ZltpXTsKKwkJfQorCQlpZiAoIGNzX2NhbGMgPT0gY3NfcmVjdiApeworCQkJU0VSSUFMX1dSSVRFIChuaW5keV9zZXJpYWwsICIrIiwgMSk7CisJCQlyZXR1cm4gaGRyWzJdOworCQl9CisJCisJCS8qIEJhZCBjaGVja3N1bTogcmVwb3J0LCBzZW5kIE5BSywgYW5kIHJlLXJlY2VpdmUKKwkJICovCisJCWZwcmludGYoc3RkZXJyLCBlcnJmbXQsIGNzX3JlY3YsIGNzX2NhbGMgKTsKKwkJU0VSSUFMX1dSSVRFIChuaW5keV9zZXJpYWwsICItIiwgMSk7CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHB1dHBrdDoKKyAqCVNlbmQgYSBwYWNrZXQgdG8gTklORFksIGNoZWNrc3VtbWluZyBpdCBhbmQgY29udmVydGluZyBzcGVjaWFsCisgKgljaGFyYWN0ZXJzIHRvIGVzY2FwZSBzZXF1ZW5jZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIG1hY3JvIHB1dHMgdGhlIGNoYXJhY3RlciAnYycgaW50byB0aGUgYnVmZmVyIHBvaW50ZWQgYXQgYnkgJ3AnLAorICogYW5kIGluY3JlbWVudHMgdGhlIHBvaW50ZXIuICBJZiAnYycgaXMgb25lIG9mIHRoZSA0IHNwZWNpYWwgY2hhcmFjdGVycworICogaW4gdGhlIHRyYW5zbWlzc2lvbiBwcm90b2NvbCwgaXQgaXMgY29udmVydGVkIGludG8gYSAyLWNoYXJhY3RlcgorICogZXNjYXBlIHNlcXVlbmNlLgorICovCisjZGVmaW5lIFBVVEJVRihjLHApCQkJCQkJXAorCWlmICggYyA9PSBETEUgfHwgYyA9PSBFU0MgfHwgYyA9PSBYT04gfHwgYyA9PSBYT0ZGICl7CVwKKwkJKnArKyA9IEVTQzsJCQkJCVwKKwkJKnArKyA9IGMgfCAweDQwOwkJCQlcCisJfSBlbHNlIHsJCQkJCQlcCisJCSpwKysgPSBjOwkJCQkJXAorCX0KKworc3RhdGljCitwdXRwa3QoIG1zZywgbGVuICkKKyAgICB1bnNpZ25lZCBjaGFyICptc2c7CS8qIENvbW1hbmQgdG8gYmUgc2VudCwgd2l0aG91dCBsZWFkIF5QIChcMDIwKSBvciBjaGVja3N1bSAqLworICAgIGludCBsZW47CS8qIE51bWJlciBvZiBieXRlcyBpbiBtZXNzYWdlCQkJKi8KK3sKKwlzdGF0aWMgY2hhciAqYnVmID0gTlVMTDsvKiBMb2NhbCBidWZmZXIgLS0gYnVpbGQgcGFja2V0IGhlcmUJKi8KKwlzdGF0aWMgaW50IG1heGJ1ZiA9IDA7CS8qIEN1cnJlbnQgbGVuZ3RoIG9mIGJ1ZmZlcgkJKi8KKwl1bnNpZ25lZCBjaGFyIGFjazsJLyogUmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBOSU5EWQkJKi8KKwl1bnNpZ25lZCBjaGFyIGNoZWNrc3VtOwkvKiBQYWNrZXQgY2hlY2tzdW0JCQkqLworCWNoYXIgKnA7CQkvKiBQb2ludGVyIGludG8gYnVmZmVyCQkJKi8KKwlpbnQgbGVuaGksIGxlbmxvOyAJLyogSGlnaCBhbmQgbG93IGJ5dGVzIG9mIG1lc3NhZ2UgbGVuZ3RoCSovCisJaW50IGk7CisKKworCS8qIE1ha2Ugc3VyZSBsb2NhbCBidWZmZXIgaXMgYmlnIGVub3VnaC4gIE11c3QgaW5jbHVkZSBzcGFjZSBmb3IKKwkgKiBwYWNrZXQgbGVuZ3RoLCBtZXNzYWdlIGJvZHksIGFuZCBjaGVja3N1bS4gIEFuZCBpbiB0aGUgd29yc3QKKwkgKiBjYXNlLCBlYWNoIGNoYXJhY3RlciB3b3VsZCBleHBhbmQgaW50byBhIDItY2hhcmFjdGVyIGVzY2FwZQorCSAqIHNlcXVlbmNlLgorCSAqLworCWlmICggbWF4YnVmIDwgKCgyKmxlbikrMTApICl7CisJCWlmICggYnVmICl7CisJCQlmcmVlKCBidWYgKTsKKwkJfQorCQlidWYgPSB4bWFsbG9jKCBtYXhidWY9KCgyKmxlbikrMTApICk7CisJfQorCisJLyogQXR0ZW50aW9uLCBOSU5EWSEKKwkgKi8KKwlTRVJJQUxfV1JJVEUgKG5pbmR5X3NlcmlhbCwgIlwwMjAiLCAxKTsKKworCisJbGVubG8gPSBsZW4gJiAweGZmOworCWxlbmhpID0gKGxlbj4+OCkgJiAweGZmOworCWNoZWNrc3VtID0gbGVubG8gKyBsZW5oaTsKKwlwID0gYnVmOworCisJUFVUQlVGKCBsZW5sbywgcCApOworCVBVVEJVRiggbGVuaGksIHAgKTsKKworCWZvciAoIGk9MDsgaTxsZW47IGkrKyApeworCQlQVVRCVUYoIG1zZ1tpXSwgcCApOworCQljaGVja3N1bSArPSBtc2dbaV07CisJfQorCisJUFVUQlVGKCBjaGVja3N1bSwgcCApOworCisJLyogU2VuZCBjaGVja3N1bW1lZCBtZXNzYWdlIG92ZXIgYW5kIG92ZXIgdW50aWwgd2UgZ2V0IGEgcG9zaXRpdmUgYWNrCisJICovCisJU0VSSUFMX1dSSVRFIChuaW5keV9zZXJpYWwsIGJ1ZiwgcCAtIGJ1Zik7CisJd2hpbGUgKDEpeworCQlpZiAoICFyZG5pbigmYWNrLDEsNSkgKXsKKwkJCS8qIHRpbWVkIG91dCAqLworCQkJZnByaW50ZihzdGRlcnIsIkFDSyB0aW1lZCBvdXQ7IHJlc2VuZGluZ1xyXG4iKTsKKwkJCS8qIEF0dGVudGlvbiwgTklORFkhICovCisJCQlTRVJJQUxfV1JJVEUgKG5pbmR5X3NlcmlhbCwgIlwwMjAiLCAxKTsKKwkJCVNFUklBTF9XUklURSAobmluZHlfc2VyaWFsLCBidWYsIHAgLSBidWYpOworCQl9IGVsc2UgaWYgKCBhY2sgPT0gJysnICl7CisJCQlyZXR1cm47CisJCX0gZWxzZSBpZiAoIGFjayA9PSAnLScgKXsKKwkJCWZwcmludGYoIHN0ZGVyciwgIlJlbW90ZSBOQUs7IHJlc2VuZGluZ1xyXG4iICk7CisJCQlTRVJJQUxfV1JJVEUgKG5pbmR5X3NlcmlhbCwgYnVmLCBwIC0gYnVmKTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoIHN0ZGVyciwgIkJhZCBBQ0ssIGlnbm9yZWQ6IDwlYz5cclxuIiwgYWNrICk7CisJCX0KKwl9Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzZW5kOgorICoJU2VuZCBhIG1lc3NhZ2UgdG8gYSByZW1vdGUgTklORFkuICBDaGVjayBtZXNzYWdlIHN0YXR1cyBieXRlCisgKglmb3IgZXJyb3IgcmVzcG9uc2VzLiAgSWYgbm8gZXJyb3IsIHJldHVybiBOSU5EWSByZXBvbnNlIChpZiBhbnkpLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYworc2VuZCggb3V0LCBsZW4sIGluICkKKyAgICB1bnNpZ25lZCBjaGFyICpvdXQ7CS8qIE1lc3NhZ2UgdG8gYmUgc2VudCB0byBOSU5EWQkJCSovCisgICAgaW50IGxlbjsJCS8qIE51bWJlciBvZiBtZWFuaW5nZnVsIGJ5dGVzIGluIG91dCBidWZmZXIJKi8KKyAgICB1bnNpZ25lZCBjaGFyICppbjsJLyogV2hlcmUgdG8gcHV0IHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gTklORFkJKi8KK3sKKwljaGFyICpmbXQ7CisJaW50IHN0YXR1czsKKwlzdGF0aWMgY2hhciAqZXJybXNnW10gPSB7CisJCSIiLAkJCQkJCS8qIDAgKi8KKwkJIkJ1ZmZlciBvdmVyZmxvdyIsCQkJCS8qIDEgKi8KKwkJIlVua25vd24gY29tbWFuZCIsCQkJCS8qIDIgKi8KKwkJIldyb25nIGFtb3VudCBvZiBkYXRhIHRvIGxvYWQgcmVnaXN0ZXIocykiLAkvKiAzICovCisJCSJNaXNzaW5nIGNvbW1hbmQgYXJndW1lbnQocykiLAkJCS8qIDQgKi8KKwkJIk9kZCBudW1iZXIgb2YgZGlnaXRzIHNlbnQgdG8gbG9hZCBtZW1vcnkiLAkvKiA1ICovCisJCSJVbmtub3duIHJlZ2lzdGVyIG5hbWUiLAkJCS8qIDYgKi8KKwkJIk5vIHN1Y2ggbWVtb3J5IHNlZ21lbnQiLAkJCS8qIDcgKi8KKwkJIk5vIGJyZWFrcG9pbnQgYXZhaWxhYmxlIiwJCQkvKiA4ICovCisJCSJDYW4ndCBzZXQgcmVxdWVzdGVkIGJhdWQgcmF0ZSIsCQkvKiA5ICovCisJfTsKKyMJZGVmaW5lIE5VTUVSUlMJKCBzaXplb2YoZXJybXNnKSAvIHNpemVvZihlcnJtc2dbMF0pICkKKworCXN0YXRpYyBjaGFyIGVycjFbXSA9ICJVbmtub3duIGVycm9yIHJlc3BvbnNlIGZyb20gTklORFk6ICMlZFxyXG4iOworCXN0YXRpYyBjaGFyIGVycjJbXSA9ICJFcnJvciByZXNwb25zZSAjJWQgZnJvbSBOSU5EWTogJXNcclxuIjsKKworCXdoaWxlICgxKXsKKwkJcHV0cGt0KG91dCxsZW4pOworCQlzdGF0dXMgPSBnZXRwa3QoaW4pOworCQlpZiAoIHN0YXR1cyA9PSBUSU1FT1VUICl7CisJCQlmcHJpbnRmKCBzdGRlcnIsICJSZXNwb25zZSB0aW1lZCBvdXQ7IHJlc2VuZGluZ1xyXG4iICk7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICggc3RhdHVzICl7CisJCWZtdCA9ICBzdGF0dXMgPiBOVU1FUlJTID8gZXJyMSA6IGVycjI7CisJCWZwcmludGYoIHN0ZGVyciwgZm10LCBzdGF0dXMsIGVycm1zZ1tzdGF0dXNdICk7CisJCWFib3J0KCk7CisJfQorfQorDAorCQkvKioqKioqKioqKioqKioqKioqKioqKioqCisJCSAqICAgICAgICAgICAgICAgICAgICAgICoKKwkJICogIEJBVUQgUkFURSBST1VUSU5FUyAgKgorCQkgKiAgICAgICAgICAgICAgICAgICAgICAqCisJCSAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRhYmxlIG9mIGJhdWRyYXRlcyBrbm93biB0byBiZSBhY2NlcHRhYmxlIHRvIE5JTkRZLiAgRWFjaCBiYXVkIHJhdGUKKyAqIGFwcGVhcnMgYm90aCBhcyBjaGFyYWN0ZXIgc3RyaW5nIGFuZCBhcyBhIFVuaXggYmF1ZCByYXRlIGNvbnN0YW50LgorICovCitzdHJ1Y3QgYmF1ZHJhdGUgeworCWNoYXIgKnN0cmluZzsKKwlpbnQgcmF0ZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmF1ZHJhdGUgYmF1ZHRhYltdID0geworCSAiMTIwMCIsIDEyMDAsCisJICIyNDAwIiwgMjQwMCwKKwkgIjQ4MDAiLCA0ODAwLAorCSAiOTYwMCIsIDk2MDAsCisJIjE5MjAwIiwgMTkyMDAsCisJIjM4NDAwIiwgMzg0MDAsCisJTlVMTCwgICAgMAkJLyogRW5kIG9mIHRhYmxlICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwYXJzZV9iYXVkcmF0ZToKKyAqCUxvb2sgdXAgdGhlIHBhc3NlZCBiYXVkIHJhdGUgaW4gdGhlIGJhdWRyYXRlIHRhYmxlLiAgSWYgZm91bmQsIGNoYW5nZQorICoJb3VyIGludGVybmFsIHJlY29yZCBvZiB0aGUgY3VycmVudCBiYXVkIHJhdGUsIGJ1dCBkb24ndCBkbyBhbnl0aGluZworICoJYWJvdXQgdGhlIHR0eSBqdXN0IG5vdy4KKyAqCisgKglSZXR1cm4gcG9pbnRlciB0byBiYXVkcmF0ZSBzdHJ1Y3R1cmUgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYworc3RydWN0IGJhdWRyYXRlICoKK3BhcnNlX2JhdWRyYXRlKHMpCisgICAgY2hhciAqczsJLyogRGVzaXJlZCBiYXVkIHJhdGUsIGFzIGFuIEFTQ0lJIChkZWNpbWFsKSBzdHJpbmcgKi8KK3sKKwlpbnQgaTsKKworCWZvciAoIGk9MDsgYmF1ZHRhYltpXS5zdHJpbmcgIT0gTlVMTDsgaSsrICl7CisJCWlmICggIXN0cmNtcChiYXVkdGFiW2ldLnN0cmluZyxzKSApeworCQkJcmV0dXJuICZiYXVkdGFiW2ldOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB0cnlfYmF1ZHJhdGU6CisgKglUcnkgc3BlYWtpbmcgdG8gTklORFkgdmlhIHRoZSBzcGVjaWZpZWQgZmlsZSBkZXNjcmlwdG9yIGF0IHRoZQorICoJc3BlY2lmaWVkIGJhdWRyYXRlLiAgQXNzdW1lIHN1Y2Nlc3MgaWYgd2UgY2FuIHNlbmQgYW4gZW1wdHkgY29tbWFuZAorICoJd2l0aCBhIGJvZ3VzIGNoZWNrc3VtIGFuZCByZWNlaXZlIGEgTkFLIChyZXNwb25zZSBvZiAnLScpIGJhY2sgd2l0aGluCisgKglvbmUgc2Vjb25kLgorICoKKyAqCVJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK3RyeV9iYXVkcmF0ZSAoc2VyaWFsLCBicnApCisgICAgIHNlcmlhbF90IHNlcmlhbDsKKyAgICAgc3RydWN0IGJhdWRyYXRlICpicnA7Cit7CisgIHVuc2lnbmVkIGNoYXIgYzsKKworICAvKiBTZXQgc3BlY2lmaWVkIGJhdWQgcmF0ZSBhbmQgZmx1c2ggYWxsIHBlbmRpbmcgaW5wdXQgKi8KKyAgU0VSSUFMX1NFVEJBVURSQVRFIChzZXJpYWwsIGJycC0+cmF0ZSk7CisgIHR0eV9mbHVzaCAoc2VyaWFsKTsKKworICAvKiBTZW5kIGVtcHR5IGNvbW1hbmQgd2l0aCBiYWQgY2hlY2tzdW0sIGhvcGUgZm9yIE5BSyAoJy0nKSByZXNwb25zZSAqLworICBTRVJJQUxfV1JJVEUgKHNlcmlhbCwgIlwwMjBcMFwwXDAwMSIsIDQpOworCisgIC8qIEFueXRoaW5nIGJ1dCBhIHF1aWNrICctJywgaW5jbHVkaW5nIGVycm9yLCBlb2YsIG9yIHRpbWVvdXQsIG1lYW5zIHRoYXQKKyAgICAgdGhpcyBiYXVkcmF0ZSBkb2Vzbid0IHdvcmsuICAqLworICByZXR1cm4gU0VSSUFMX1JFQURDSEFSIChzZXJpYWwsIDEpID09ICctJzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogYXV0b2JhdWQ6CisgKglHZXQgTklORFkgdGFsa2luZyBvdmVyIHRoZSBzcGVjaWZpZWQgZmlsZSBkZXNjcmlwdG9yIGF0IHRoZSBzcGVjaWZpZWQKKyAqCWJhdWQgcmF0ZS4gIEZpcnN0IHNlZSBpZiBOSU5EWSdzIGFscmVhZHkgdGFsa2luZyBhdCAnYmF1ZHJhdGUnLiAgSWYKKyAqCW5vdCwgcnVuIHRocm91Z2ggYWxsIHRoZSBsZWdhbCBiYXVkcmF0ZXMgaW4gJ2JhdWR0YWInIHVudGlsIG9uZSB3b3JrcywKKyAqCWFuZCB0aGVuIHRlbGwgTklORFkgdG8gdGFsayBhdCAnYmF1ZHJhdGUnIGluc3RlYWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljCithdXRvYmF1ZCggc2VyaWFsLCBicnAgKQorICAgICBzZXJpYWxfdCBzZXJpYWw7CisgICAgIHN0cnVjdCBiYXVkcmF0ZSAqYnJwOworeworICBpbnQgaTsKKyAgaW50IGZhaWx1cmVzOworCisgIHNheSgiTklORFkgYXQgd3JvbmcgYmF1ZCByYXRlPyBUcnlpbmcgdG8gYXV0b2JhdWQuLi5cbiIpOworICBmYWlsdXJlcyA9IGkgPSAwOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBzYXkoICJcciVzLi4uICAgIiwgYmF1ZHRhYltpXS5zdHJpbmcgKTsKKyAgICAgIGlmICh0cnlfYmF1ZHJhdGUoc2VyaWFsLCAmYmF1ZHRhYltpXSkpCisJeworCSAgYnJlYWs7CisJfQorICAgICAgaWYgKGJhdWR0YWJbKytpXS5zdHJpbmcgPT0gTlVMTCkKKwl7CisJICAvKiBFbmQgb2YgdGFibGUgLS0gd3JhcGFyb3VuZCAqLworCSAgaSA9IDA7CisJICBpZiAoIGZhaWx1cmVzKysgKQorCSAgICB7CisJICAgICAgc2F5KCJcbkF1dG9iYXVkIGZhaWxlZCBhZ2Fpbi4gIEdpdmluZyB1cC5cbiIpOworCSAgICAgIGV4aXQoMSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHNheSgiXG5BdXRvYmF1ZCBmYWlsZWQuIFRyeWluZyBhZ2Fpbi4uLlxuIik7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIEZvdW5kIE5JTkRZJ3MgY3VycmVudCBiYXVkIHJhdGU7IG5vdyBjaGFuZ2UgaXQuICAqLworICBzYXkoIkNoYW5naW5nIE5JTkRZIGJhdWRyYXRlIHRvICVzXG4iLCBicnAtPnN0cmluZyk7CisgIG5pbkJhdWQgKGJycC0+c3RyaW5nKTsKKworICAvKiBDaGFuZ2Ugb3VyIGJhdWQgcmF0ZSBiYWNrIHRvIHJhdGUgdG8gd2hpY2ggd2UganVzdCBzZXQgTklORFkuICAqLworICBTRVJJQUxfU0VUQkFVRFJBVEUgKHNlcmlhbCwgYnJwLT5yYXRlKTsKK30KKwwKKwkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJICoJCQkJICAqCisJCSAqICAgTklORFkgSU5URVJGQUNFIFJPVVRJTkVTCSAgKgorCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAqCisJCSAqIG5pbkNvbm5lY3QgKk1VU1QqIGJlIHRoZSBmaXJzdCAqCisJCSAqIG9uZSBvZiB0aGVzZSByb3V0aW5lcyBjYWxsZWQuICAqCisJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG5pbkJhdWQ6CisgKglBc2sgTklORFkgdG8gY2hhbmdlIHRoZSBiYXVkIHJhdGUgb24gaXRzIHNlcmlhbCBwb3J0LgorICoJQXNzdW1lcyB3ZSBrbm93IHRoZSBiYXVkIHJhdGUgYXQgd2hpY2ggTklORFkncyBjdXJyZW50bHkgdGFsa2luZy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCituaW5CYXVkKCBiYXVkcmF0ZSApCisgICAgY2hhciAqYmF1ZHJhdGU7CS8qIERlc2lyZWQgYmF1ZCByYXRlLCBhcyBhIHN0cmluZyBvZiBBU0NJSSBkZWNpbWFsCisJCQkgKiBkaWdpdHMuCisJCQkgKi8KK3sKKyAgdW5zaWduZWQgY2hhciBtc2dbMTAwXTsKKworICB0dHlfZmx1c2ggKG5pbmR5X3NlcmlhbCk7CisKKyAgaWYgKG9sZF9uaW5keSkKKyAgICB7CisgICAgICBjaGFyICpwOwkJLyogUG9pbnRlciBpbnRvIGJ1ZmZlcgkqLworICAgICAgdW5zaWduZWQgY2hhciBjc3VtOwkvKiBDYWxjdWxhdGVkIGNoZWNrc3VtCSovCisKKyAgICAgIC8qIENhbid0IHVzZSBwdXRwa3QoKSBiZWNhdXNlIGFmdGVyIHRoZSBiYXVkcmF0ZSBjaGFuZ2UgTklORFkncworCSBhY2svbmFrIHdpbGwgbG9vayBsaWtlIGdpYmJlcmlzaC4gICovCisKKyAgICAgIGZvciAocD1iYXVkcmF0ZSwgY3N1bT0wMjArJ3onOyAqcDsgcCsrKQorCXsKKwkgIGNzdW0gKz0gKnA7CisJfQorICAgICAgc3ByaW50ZiAobXNnLCAiXDAyMHolcyMlMDJ4IiwgYmF1ZHJhdGUsIGNzdW0pOworICAgICAgU0VSSUFMX1dSSVRFIChuaW5keV9zZXJpYWwsIG1zZywgc3RybGVuIChtc2cpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBDYW4ndCB1c2UgInNlbmQiIGJlY2F1c2UgTklORFkgcmVwbHkgd2lsbCBiZSB1bnJlYWRhYmxlIGFmdGVyCisJIGJhdWQgcmF0ZSBjaGFuZ2UuICAqLworICAgICAgc3ByaW50ZiggbXNnLCAieiVzIiwgYmF1ZHJhdGUgKTsKKyAgICAgIHB1dHBrdCggbXNnLCBzdHJsZW4obXNnKSsxICk7CS8qICIrMSIgdG8gc2VuZCB0ZXJtaW5hdG9yIHRvbyAqLworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbmluQnB0RGVsOgorICoJQXNrIE5JTkRZIHRvIGRlbGV0ZSB0aGUgc3BlY2lmaWVkIHR5cGUgb2YgKmhhcmR3YXJlKiBicmVha3BvaW50IGF0CisgKgl0aGUgc3BlY2lmaWVkIGFkZHJlc3MuICBJZiB0aGUgJ2FkZHInIGlzIC0xLCBhbGwgYnJlYWtwb2ludHMgb2YKKyAqCXRoZSBzcGVjaWZpZWQgdHlwZSBhcmUgZGVsZXRlZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCituaW5CcHREZWwoIGFkZHIsIHR5cGUgKQorICAgIGxvbmcgYWRkcjsJLyogQWRkcmVzcyBpbiA5NjAgbWVtb3J5CSovCisgICAgY2hhciB0eXBlOwkvKiAnZCcgPT4gZGF0YSBia3B0LCAnaScgPT4gaW5zdHJ1Y3Rpb24gYnJlYWtwb2ludCAqLworeworCXVuc2lnbmVkIGNoYXIgYnVmWzEwXTsKKworCWlmICggb2xkX25pbmR5ICl7CisJCU9uaW5CcHREZWwoIGFkZHIsIHR5cGUgPT0gJ2QnID8gMSA6IDAgKTsKKwkJcmV0dXJuOworCX0KKworCWJ1ZlswXSA9ICdiJzsKKwlidWZbMV0gPSB0eXBlOworCisJaWYgKCBhZGRyID09IC0xICl7CisJCXNlbmQoIGJ1ZiwgMiwgTlVMTCApOworCX0gZWxzZSB7CisJCXN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKCZidWZbMl0sIDQsIGFkZHIpOworCQlzZW5kKCBidWYsIDYsIE5VTEwgKTsKKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbmluQnB0U2V0OgorICoJQXNrIE5JTkRZIHRvIHNldCB0aGUgc3BlY2lmaWVkIHR5cGUgb2YgKmhhcmR3YXJlKiBicmVha3BvaW50IGF0CisgKgl0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbmluQnB0U2V0KCBhZGRyLCB0eXBlICkKKyAgICBsb25nIGFkZHI7CS8qIEFkZHJlc3MgaW4gOTYwIG1lbW9yeQkqLworICAgIGNoYXIgdHlwZTsJLyogJ2QnID0+IGRhdGEgYmtwdCwgJ2knID0+IGluc3RydWN0aW9uIGJyZWFrcG9pbnQgKi8KK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxMF07CisKKwlpZiAoIG9sZF9uaW5keSApeworCQlPbmluQnB0U2V0KCBhZGRyLCB0eXBlID09ICdkJyA/IDEgOiAwICk7CisJCXJldHVybjsKKwl9CisKKworCWJ1ZlswXSA9ICdCJzsKKwlidWZbMV0gPSB0eXBlOworCXN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKCZidWZbMl0sIDQsIGFkZHIpOworCXNlbmQoIGJ1ZiwgNiwgTlVMTCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG5pbkNvbm5lY3Q6CisgKglPcGVuIHRoZSBzcGVjaWZpZWQgdHR5LiAgR2V0IGNvbW11bmljYXRpb25zIHdvcmtpbmcgYXQgdGhlIHNwZWNpZmllZAorICoJYmF1ZCByYXRlLiAgRmx1c2ggYW55IHBlbmRpbmcgSS9PIG9uIHRoZSB0dHkuCisgKgorICoJUmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3IsIG9yIC0xIG9uIGZhaWx1cmUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CituaW5Db25uZWN0KCBuYW1lLCBiYXVkcmF0ZSwgYnJrLCBzaWxlbnQsIG9sZF9wcm90b2NvbCApCisgICAgY2hhciAqbmFtZTsJCS8qICIvZGV2L3R0eVhYIiB0byBiZSBvcGVuZWQJCQkqLworICAgIGNoYXIgKmJhdWRyYXRlOy8qIGJhdWQgcmF0ZTogYSBzdHJpbmcgb2YgYXNjaWkgZGVjaW1hbCBkaWdpdHMgKGVnLCI5NjAwIikqLworICAgIGludCBicms7CQkvKiAxID0+IHNlbmQgYnJlYWsgdG8gdHR5IGZpcnN0IHRoaW5nIGFmdGVyIG9wZW5pbmcgaXQqLworICAgIGludCBzaWxlbnQ7CQkvKiAxID0+IHN0aWZsZSB1bm5lY2Vzc2FyeSBtZXNzYWdlcyB3aGVuIHRhbGtpbmcgdG8gCisJCQkgKgl0aGlzIHR0eS4KKwkJCSAqLworICAgIGludCBvbGRfcHJvdG9jb2w7Cit7CisJaW50IGk7CisJY2hhciAqcDsKKwlzdHJ1Y3QgYmF1ZHJhdGUgKmJycDsKKworCS8qIFdlIHdpbGwgdHJ5IGVhY2ggb2YgdGhlIGZvbGxvd2luZyBwYXRocyB3aGVuIHRyeWluZyB0byBvcGVuIHRoZSB0dHkKKwkgKi8KKwlzdGF0aWMgY2hhciAqcHJlZml4W10gPSB7ICIiLCAiL2Rldi8iLCAiL2Rldi90dHkiLCBOVUxMIH07CisKKwlpZiAoIG9sZF9wcm90b2NvbCApeworCQlvbGRfbmluZHkgPSAxOworCX0KKworCXF1aWV0ID0gc2lsZW50OwkJLyogTWFrZSBnbG9iYWwgdG8gdGhpcyBmaWxlICovCisKKwlmb3IgKCBpPTA7IHByZWZpeFtpXSAhPSBOVUxMOyBpKysgKXsKKwkJcCA9IHhtYWxsb2Moc3RybGVuKHByZWZpeFtpXSkgKyBzdHJsZW4obmFtZSkgKyAxICk7CisJCXN0cmNweSggcCwgcHJlZml4W2ldICk7CisJCXN0cmNhdCggcCwgbmFtZSApOworCQluaW5keV9zZXJpYWwgPSBTRVJJQUxfT1BFTiAocCk7CisJCWlmIChuaW5keV9zZXJpYWwgIT0gTlVMTCkgeworI2lmZGVmIFRJT0NFWENMCisJCQkvKiBFeGNsdXNpdmUgdXNlIG1vZGUgKGhwOTAwMCBkb2VzIG5vdCBzdXBwb3J0IGl0KSAqLworCQkJaW9jdGwobmluZHlfc2VyaWFsLT5mZCxUSU9DRVhDTCxOVUxMKTsKKyNlbmRpZgorCQkJU0VSSUFMX1JBVyAobmluZHlfc2VyaWFsKTsKKworCQkJaWYgKGJyaykKKwkJCSAgeworCQkJICAgIFNFUklBTF9TRU5EX0JSRUFLIChuaW5keV9zZXJpYWwpOworCQkJICB9CisKKwkJCWJycCA9IHBhcnNlX2JhdWRyYXRlKCBiYXVkcmF0ZSApOworCQkJaWYgKCBicnAgPT0gTlVMTCApeworCQkJCXNheSgiSWxsZWdhbCBiYXVkcmF0ZSAlcyBpZ25vcmVkOyB1c2luZyA5NjAwXG4iLAorCQkJCQkJCQliYXVkcmF0ZSk7CisJCQkJYnJwID0gcGFyc2VfYmF1ZHJhdGUoICI5NjAwIiApOworCQkJfQorCisJCQlpZiAoICF0cnlfYmF1ZHJhdGUobmluZHlfc2VyaWFsLCBicnApICl7CisJCQkJYXV0b2JhdWQobmluZHlfc2VyaWFsLCBicnApOworCQkJfQorCQkJdHR5X2ZsdXNoIChuaW5keV9zZXJpYWwpOworCQkJc2F5KCAiQ29ubmVjdGVkIHRvICVzXG4iLCBwICk7CisJCQlmcmVlKHApOworCQkJYnJlYWs7CisJCX0KKwkJZnJlZShwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZiAwCisKKy8qIEN1cnJlbnRseSB1bnVzZWQ7IHNob3VsZG4ndCB3ZSBiZSBkb2luZyB0aGlzIG9uIHRhcmdldF9raWxsIGFuZAorcGVyaGFwcyB0YXJnZXRfbW91cm4/ICBGSVhNRS4gICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG5pbkdkYkV4aXQ6CisgKglBc2sgTklORFkgdG8gbGVhdmUgR0RCIG1vZGUgYW5kIHByaW50IGEgTklORFkgcHJvbXB0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCituaW5HZGJFeGl0KCkKK3sKKwlpZiAoIG9sZF9uaW5keSApeworCQlPbmluR2RiRXhpdCgpOworCQlyZXR1cm47CisJfQorICAgICAgICBwdXRwa3QoKHVuc2lnbmVkIGNoYXIgKikgIkUiLCAxICk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbmluR286CisgKglBc2sgTklORFkgdG8gc3RhcnQgb3IgY29udGludWUgZXhlY3V0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHByb2dyYW0KKyAqCWluIGl0J3MgbWVtb3J5IGF0IHRoZSBjdXJyZW50IGlwLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK25pbkdvKCBzdGVwX2ZsYWcgKQorICAgIGludCBzdGVwX2ZsYWc7CS8qIDEgPT4gcnVuIGluIHNpbmdsZS1zdGVwIG1vZGUgKi8KK3sKKwlpZiAoIG9sZF9uaW5keSApeworCQlPbmluR28oIHN0ZXBfZmxhZyApOworCQlyZXR1cm47CisJfQorCXB1dHBrdCgodW5zaWduZWQgY2hhciAqKSAoc3RlcF9mbGFnID8gInMiIDogImMiKSwgMSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG5pbk1lbUdldDoKKyAqCVJlYWQgYSBzdHJpbmcgb2YgYnl0ZXMgZnJvbSBOSU5EWSdzIGFkZHJlc3Mgc3BhY2UgKDk2MCBtZW1vcnkpLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorbmluTWVtR2V0KG5pbmFkZHIsIGhvc3RhZGRyLCBsZW4pCisgICAgIGxvbmcgbmluYWRkcjsJLyogU291cmNlIGFkZHJlc3MsIGluIHRoZSA5NjAgbWVtb3J5IHNwYWNlCSovCisgICAgIHVuc2lnbmVkIGNoYXIgKmhvc3RhZGRyOwkvKiBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiBvdXIgbWVtb3J5IHNwYWNlICovCisgICAgIGludCBsZW47CQkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAkJCSovCit7CisJdW5zaWduZWQgY2hhciBidWZbQlVGU0laRSsyMF07CisJaW50IGNudDsJCS8qIE51bWJlciBvZiBieXRlcyBpbiBuZXh0IHRyYW5zZmVyCSovCisJaW50IG9yaWdsZW4gPSBsZW47CisKKwlpZiAoIG9sZF9uaW5keSApeworCQlPbmluTWVtR2V0KG5pbmFkZHIsIGhvc3RhZGRyLCBsZW4pOworCQlyZXR1cm47CisJfQorCisJZm9yICggOyBsZW4gPiAwOyBsZW4gLT0gQlVGU0laRSApeworCQljbnQgPSBsZW4gPiBCVUZTSVpFID8gQlVGU0laRSA6IGxlbjsKKworCQlidWZbMF0gPSAnbSc7CisJCXN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKCZidWZbMV0sIDQsIG5pbmFkZHIpOworCQlidWZbNV0gPSBjbnQgJiAweGZmOworCQlidWZbNl0gPSAoY250Pj44KSAmIDB4ZmY7CisKKwkJc2VuZCggYnVmLCA3LCBob3N0YWRkciApOworCisJCW5pbmFkZHIgKz0gY250OworCQlob3N0YWRkciArPSBjbnQ7CisJfQorCXJldHVybiBvcmlnbGVuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG5pbk1lbVB1dDoKKyAqCVdyaXRlIGEgc3RyaW5nIG9mIGJ5dGVzIGludG8gTklORFkncyBhZGRyZXNzIHNwYWNlICg5NjAgbWVtb3J5KS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK25pbk1lbVB1dCggbmluYWRkciwgaG9zdGFkZHIsIGxlbiApCisgICAgIGxvbmcgbmluYWRkcjsJLyogRGVzdGluYXRpb24gYWRkcmVzcywgaW4gTklORFkgbWVtb3J5IHNwYWNlCSovCisgICAgIHVuc2lnbmVkIGNoYXIgKmhvc3RhZGRyOwkvKiBTb3VyY2UgYWRkcmVzcywgaW4gb3VyIG1lbW9yeSBzcGFjZQkqLworICAgICBpbnQgbGVuOwkJLyogTnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCQkJKi8KK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZltCVUZTSVpFKzIwXTsKKwlpbnQgY250OwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIG5leHQgdHJhbnNmZXIJKi8KKwlpbnQgb3JpZ2xlbiA9IGxlbjsKKworCWlmICggb2xkX25pbmR5ICl7CisJCU9uaW5NZW1QdXQoIG5pbmFkZHIsIGhvc3RhZGRyLCBsZW4gKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKCA7IGxlbiA+IDA7IGxlbiAtPSBCVUZTSVpFICl7CisJCWNudCA9IGxlbiA+IEJVRlNJWkUgPyBCVUZTSVpFIDogbGVuOworCisJCWJ1ZlswXSA9ICdNJzsKKwkJc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoJmJ1ZlsxXSwgNCwgbmluYWRkcik7CisJCW1lbWNweShidWYgKyA1LCBob3N0YWRkciwgY250KTsKKwkJc2VuZCggYnVmLCBjbnQrNSwgTlVMTCApOworCisJCW5pbmFkZHIgKz0gY250OworCQlob3N0YWRkciArPSBjbnQ7CisJfQorCXJldHVybiBvcmlnbGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBuaW5SZWdHZXQ6CisgKglSZXRyaWV2ZSB0aGUgY29udGVudHMgb2YgYSA5NjAgcmVnaXN0ZXIsIGFuZCByZXR1cm4gdGhlbSBhcyBhIGxvbmcKKyAqCWluIGhvc3QgYnl0ZSBvcmRlci4KKyAqCisgKglUSElTIFJPVVRJTkUgQ0FOIE9OTFkgQkUgVVNFRCBUTyBSRUFEIFRIRSBMT0NBTCwgR0xPQkFMLCBBTkQKKyAqCWlwL2FjL3BjL3RjIFJFR0lTVEVSUy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbG9uZworbmluUmVnR2V0KCByZWduYW1lICkKKyAgICBjaGFyICpyZWduYW1lOwkvKiBSZWdpc3RlciBuYW1lIHJlY29nbml6ZWQgYnkgTklORFksIHN1YmplY3QgdG8gdGhlCisJCQkgKiBhYm92ZSBsaW1pdGF0aW9ucy4KKwkJCSAqLworeworCXVuc2lnbmVkIGNoYXIgb3V0YnVmWzEwXTsKKwl1bnNpZ25lZCBjaGFyIGluYnVmWzIwXTsKKworCWlmICggb2xkX25pbmR5ICl7CisJCXJldHVybiBPbmluUmVnR2V0KCByZWduYW1lICk7CisJfQorCisJc3ByaW50Ziggb3V0YnVmLCAidSVzOiIsIHJlZ25hbWUgKTsKKwlzZW5kKCBvdXRidWYsIHN0cmxlbihvdXRidWYpLCBpbmJ1ZiApOworCXJldHVybiBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGluYnVmLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbmluUmVnUHV0OgorICoJU2V0IHRoZSBjb250ZW50cyBvZiBhIDk2MCByZWdpc3Rlci4KKyAqCisgKglUSElTIFJPVVRJTkUgQ0FOIE9OTFkgQkUgVVNFRCBUTyBTRVQgVEhFIExPQ0FMLCBHTE9CQUwsIEFORAorICoJaXAvYWMvcGMvdGMgUkVHSVNURVJTLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCituaW5SZWdQdXQoIHJlZ25hbWUsIHZhbCApCisgICAgY2hhciAqcmVnbmFtZTsJLyogUmVnaXN0ZXIgbmFtZSByZWNvZ25pemVkIGJ5IE5JTkRZLCBzdWJqZWN0IHRvIHRoZQorCQkJICogYWJvdmUgbGltaXRhdGlvbnMuCisJCQkgKi8KKyAgICBsb25nIHZhbDsJCS8qIE5ldyBjb250ZW50cyBvZiByZWdpc3RlciwgaW4gaG9zdCBieXRlLW9yZGVyCSovCit7CisJdW5zaWduZWQgY2hhciBidWZbMjBdOworCWludCBsZW47CisKKwlpZiAoIG9sZF9uaW5keSApeworCQlPbmluUmVnUHV0KCByZWduYW1lLCB2YWwgKTsKKwkJcmV0dXJuOworCX0KKworCXNwcmludGYoIGJ1ZiwgIlUlczoiLCByZWduYW1lICk7CisJbGVuID0gc3RybGVuKGJ1Zik7CisJc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoJmJ1ZltsZW5dLCA0LCB2YWwpOworCXNlbmQoIGJ1ZiwgbGVuKzQsIE5VTEwgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbmluUmVnc0dldDoKKyAqCUdldCBhIGR1bXAgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnRpcmUgOTYwIHJlZ2lzdGVyIHNldC4gIFRoZQorICoJaW5kaXZpZHVhbCByZWdpc3RlcnMgYXBwZWFyIGluIHRoZSBkdW1wIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisgKgorICoJCXBmcCAgc3AgICByaXAgIHIzICAgcjQgICByNSAgIHI2ICAgcjcgCisgKgkJcjggICByOSAgIHIxMCAgcjExICByMTIgIHIxMyAgcjE0ICByMTUgCisgKgkJZzAgICBnMSAgIGcyICAgZzMgICBnNCAgIGc1ICAgZzYgICBnNyAKKyAqCQlnOCAgIGc5ICAgZzEwICBnMTEgIGcxMiAgZzEzICBnMTQgIGZwIAorICoJCXBjICAgYWMgICBpcCAgIHRjICAgZnAwICBmcDEgIGZwMiAgZnAzCisgKgorICoJRWFjaCBpbmRpdmlkdWFsIHJlZ2lzdGVyIGNvbXByaXNlcyBleGFjdGx5IDQgYnl0ZXMsIGV4Y2VwdCBmb3IKKyAqCWZwMC1mcDMsIHdoaWNoIGFyZSA4IGJ5dGVzLiAgQWxsIHJlZ2lzdGVyIHZhbHVlcyBhcmUgaW4gOTYwCisgKgkobGl0dGxlLWVuZGlhbikgYnl0ZSBvcmRlci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbmluUmVnc0dldCggcmVncCApCisgICAgdW5zaWduZWQgY2hhciAqcmVncDsJCS8qIFdoZXJlIHRvIHBsYWNlIHRoZSByZWdpc3RlciBkdW1wICovCit7CisJaWYgKCBvbGRfbmluZHkgKXsKKwkJT25pblJlZ3NHZXQoIHJlZ3AgKTsKKwkJcmV0dXJuOworCX0KKwlzZW5kKCAodW5zaWduZWQgY2hhciAqKSAiciIsIDEsIHJlZ3AgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBuaW5SZWdzUHV0OgorICoJSW5pdGlhbGl6ZSB0aGUgZW50aXJlIDk2MCByZWdpc3RlciBzZXQgdG8gYSBzcGVjaWZpZWQgc2V0IG9mIHZhbHVlcy4KKyAqCVRoZSBmb3JtYXQgb2YgdGhlIHJlZ2lzdGVyIHZhbHVlIGRhdGEgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoYXQKKyAqCXJldHVybmVkIGJ5IG5pblJlZ3NHZXQuCisgKgorICogV0FSTklORzoKKyAqCUFsbCByZWdpc3RlciB2YWx1ZXMgbXVzdCBiZSBpbiA5NjAgKGxpdHRsZS1lbmRpYW4pIGJ5dGUgb3JkZXIuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK25pblJlZ3NQdXQoIHJlZ3AgKQorICAgIGNoYXIgKnJlZ3A7CQkvKiBQb2ludGVyIHRvIGRlc2lyZWQgdmFsdWVzIG9mIHJlZ2lzdGVycyAqLworeworLyogTnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2Ugc2VuZCB0byBuaW5keS4gIEkgYmVsaWV2ZSB0aGlzIGlzIGRlZmluZWQgYnkKKyAgIHRoZSBwcm90b2NvbCAoaXQgZG9lcyBub3QgYWdyZWUgd2l0aCBSRUdJU1RFUl9CWVRFUykuICAqLworI2RlZmluZSBOSU5EWV9SRUdJU1RFUl9CWVRFUwkoKDM2KjQpICsgKDQqOCkpCisJdW5zaWduZWQgY2hhciBidWZbTklORFlfUkVHSVNURVJfQllURVMrMTBdOworCisJaWYgKCBvbGRfbmluZHkgKXsKKwkJT25pblJlZ3NQdXQoIHJlZ3AgKTsKKwkJcmV0dXJuOworCX0KKworCWJ1ZlswXSA9ICdSJzsKKwltZW1jcHkoYnVmKzEsICByZWdwLCBOSU5EWV9SRUdJU1RFUl9CWVRFUyApOworCXNlbmQoIGJ1ZiwgTklORFlfUkVHSVNURVJfQllURVMrMSwgTlVMTCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG5pblJlc2V0OgorICogICAgICBBc2sgTklORFkgdG8gcGVyZm9ybSBhIHNvZnQgcmVzZXQ7IHdhaXQgZm9yIHRoZSByZXNldCB0byBjb21wbGV0ZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbmluUmVzZXQoKQoreworCXVuc2lnbmVkIGNoYXIgYWNrOworCisJaWYgKCBvbGRfbmluZHkgKXsKKwkJT25pblJlc2V0KCk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoMSl7CisJCXB1dHBrdCgodW5zaWduZWQgY2hhciAqKSAiWCIsIDEgKTsKKwkJd2hpbGUgKDEpeworCQkJaWYgKCAhcmRuaW4oJmFjaywxLDUpICl7CisJCQkJLyogVGltZWQgb3V0ICovCisJCQkJYnJlYWs7CQkvKiBSZXNlbmQgKi8KKwkJCX0KKwkJCWlmICggYWNrID09ICcrJyApeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBuaW5TcnE6CisgKglBc3N1bWUgTklORFkgaGFzIHN0b3BwZWQgZXhlY3V0aW9uIG9mIHRoZSA5NjAgYXBwbGljYXRpb24gcHJvZ3JhbSBpbgorICoJb3JkZXIgdG8gcHJvY2VzcyBhIGhvc3Qgc2VydmljZSByZXF1ZXN0IChzcnEpLiAgQXNrIE5JTkRZIGZvciB0aGUKKyAqCXNycSBhcmd1bWVudHMsIHBlcmZvcm0gdGhlIHJlcXVlc3RlZCBzZXJ2aWNlLCBhbmQgc2VuZCBhbiAic3JxCisgKgljb21wbGV0ZSIgbWVzc2FnZSBzbyBOSU5EWSB3aWxsIHJldHVybiBjb250cm9sIHRvIHRoZSBhcHBsaWNhdGlvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbmluU3JxKCkKK3sKKyAgLyogRklYTUU6IEltcG9zZXMgYXJiaXRyYXJ5IGxpbWl0cyBvbiBsZW5ndGhzIG9mIHBhdGhuYW1lcyBhbmQgc3VjaC4gICovCisJdW5zaWduZWQgY2hhciBidWZbQlVGU0laRV07CisJaW50IHJldGNvZGU7CisJdW5zaWduZWQgY2hhciBzcnFudW07CisJaW50IGk7CisJaW50IG9mZnNldDsKKwlpbnQgYXJnW01BWF9TUlFfQVJHU107CisKKwlpZiAoIG9sZF9uaW5keSApeworCQlPbmluU3JxKCk7CisJCXJldHVybjsKKwl9CisKKworCS8qIEdldCBzcnEgbnVtYmVyIGFuZCBhcmd1bWVudHMKKwkgKi8KKwlzZW5kKCh1bnNpZ25lZCBjaGFyICopICIhIiwgMSwgYnVmICk7CisKKwlzcnFudW0gPSBidWZbMF07CisJZm9yICAoIGk9MCwgb2Zmc2V0PTE7IGkgPCBNQVhfU1JRX0FSR1M7IGkrKywgb2Zmc2V0Kz00ICl7CisJCWFyZ1tpXSA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoJmJ1ZltvZmZzZXRdLCA0KTsKKwl9CisKKwkvKiBQcm9jZXNzIFNycQorCSAqLworCXN3aXRjaCggc3JxbnVtICl7CisJY2FzZSBCU19DTE9TRToKKwkJLyogYXJnczogZmlsZSBkZXNjcmlwdG9yICovCisJCWlmICggYXJnWzBdID4gMiApeworCQkJcmV0Y29kZSA9IGNsb3NlKCBhcmdbMF0gKTsKKwkJfSBlbHNlIHsKKwkJCXJldGNvZGUgPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgQlNfQ1JFQVQ6CisJCS8qIGFyZ3M6IGZpbGVuYW1lLCBtb2RlICovCisJCW5pblN0ckdldCggYXJnWzBdLCBidWYgKTsKKwkJcmV0Y29kZSA9IGNyZWF0KGJ1ZixhcmdbMV0pOworCQlicmVhazsKKwljYXNlIEJTX09QRU46CisJCS8qIGFyZ3M6IGZpbGVuYW1lLCBmbGFncywgbW9kZSAqLworCQluaW5TdHJHZXQoIGFyZ1swXSwgYnVmICk7CisJCXJldGNvZGUgPSBvcGVuKGJ1ZixhcmdbMV0sYXJnWzJdKTsKKwkJYnJlYWs7CisJY2FzZSBCU19SRUFEOgorCQkvKiBhcmdzOiBmaWxlIGRlc2NyaXB0b3IsIGJ1ZmZlciwgY291bnQgKi8KKwkJcmV0Y29kZSA9IHJlYWQoYXJnWzBdLGJ1ZixhcmdbMl0pOworCQlpZiAoIHJldGNvZGUgPiAwICl7CisJCQluaW5NZW1QdXQoIGFyZ1sxXSwgYnVmLCByZXRjb2RlICk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCU19TRUVLOgorCQkvKiBhcmdzOiBmaWxlIGRlc2NyaXB0b3IsIG9mZnNldCwgd2hlbmNlICovCisJCXJldGNvZGUgPSBsc2VlayhhcmdbMF0sYXJnWzFdLGFyZ1syXSk7CisJCWJyZWFrOworCWNhc2UgQlNfV1JJVEU6CisJCS8qIGFyZ3M6IGZpbGUgZGVzY3JpcHRvciwgYnVmZmVyLCBjb3VudCAqLworCQluaW5NZW1HZXQoIGFyZ1sxXSwgYnVmLCBhcmdbMl0gKTsKKwkJcmV0Y29kZSA9IHdyaXRlKGFyZ1swXSxidWYsYXJnWzJdKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0Y29kZSA9IC0xOworCQlicmVhazsKKwl9CisKKwkvKiBTZW5kIHJlcXVlc3QgdGVybWluYXRpb24gc3RhdHVzIHRvIE5JTkRZCisJICovCisJYnVmWzBdID0gJ2UnOworCXN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKCZidWZbMV0sIDQsIHJldGNvZGUpOworCXNlbmQoIGJ1ZiwgNSwgTlVMTCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG5pblN0b3BXaHk6CisgKglBc3N1bWUgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gaGFzIHN0b3BwZWQgKGkuZS4sIGEgRExFIHdhcyByZWNlaXZlZAorICoJZnJvbSBOSU5EWSkuICBBc2sgTklORFkgZm9yIHN0YXR1cyBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZQorICoJcmVhc29uIGZvciB0aGUgaGFsdC4KKyAqCisgKglSZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUgaWYgdGhlIHVzZXIgcHJvZ3JhbSBoYXMgZXhpdGVkLCAwIG90aGVyd2lzZS4KKyAqCUFsc28gcmV0dXJucyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uLCB0aHJvdWdoIHBhc3NlZCBwb2ludGVyczoKKyAqICAgICAgICAgICAtIHdoeTogYW4gZXhpdCBjb2RlIGlmIHByb2dyYW0gdGhlIGV4aXRlZDsgb3RoZXJ3aXNlIHRoZSByZWFzb24KKyAqCQkJd2h5IHRoZSBwcm9ncmFtIGhhbHRlZCAoc2VlIHN0b3AuaCBmb3IgdmFsdWVzKS4KKyAqCSAgICAtIGNvbnRlbnRzIG9mIHJlZ2lzdGVyIGlwIChsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIpCisgKgkgICAgLSBjb250ZW50cyBvZiByZWdpc3RlciBzcCAobGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyKQorICoJICAgIC0gY29udGVudHMgb2YgcmVnaXN0ZXIgZnAgKGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjaGFyCituaW5TdG9wV2h5KCB3aHlwLCBpcHAsIGZwcCwgc3BwICkKKyAgICB1bnNpZ25lZCBjaGFyICp3aHlwOyAvKiBSZXR1cm4gdGhlICd3aHknIGNvZGUgdGhyb3VnaCB0aGlzIHBvaW50ZXIJKi8KKyAgICBsb25nICppcHA7CS8qIFJldHVybiBjb250ZW50cyBvZiByZWdpc3RlciBpcCB0aHJvdWdoIHRoaXMgcG9pbnRlcgkqLworICAgIGxvbmcgKmZwcDsJLyogUmV0dXJuIGNvbnRlbnRzIG9mIHJlZ2lzdGVyIGZwIHRocm91Z2ggdGhpcyBwb2ludGVyCSovCisgICAgbG9uZyAqc3BwOwkvKiBSZXR1cm4gY29udGVudHMgb2YgcmVnaXN0ZXIgc3AgdGhyb3VnaCB0aGlzIHBvaW50ZXIJKi8KK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlszMF07CisJZXh0ZXJuIGNoYXIgT25pblN0b3BXaHkgKCk7CisKKwlpZiAoIG9sZF9uaW5keSApeworCQlyZXR1cm4gT25pblN0b3BXaHkoIHdoeXAsIGlwcCwgZnBwLCBzcHAgKTsKKwl9CisJc2VuZCgodW5zaWduZWQgY2hhciAqKSAiPyIsIDEsIGJ1ZiApOworCisJKndoeXAgPSBidWZbMV07CisJbWVtY3B5ICgoY2hhciAqKWlwcCwgJmJ1ZlsyXSwgIHNpemVvZiAoKmlwcCkpOworCW1lbWNweSAoKGNoYXIgKilmcHAsICZidWZbNl0sICBzaXplb2YgKCppcHApKTsKKwltZW1jcHkgKChjaGFyICopc3BwLCAmYnVmWzEwXSwgc2l6ZW9mICgqaXBwKSk7CisJcmV0dXJuIGJ1ZlswXTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbmluU3RyR2V0OgorICoJUmVhZCBhICdcMCctdGVybWluYXRlZCBzdHJpbmcgb2YgZGF0YSBvdXQgb2YgdGhlIDk2MCBtZW1vcnkgc3BhY2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYworbmluU3RyR2V0KCBuaW5hZGRyLCBob3N0YWRkciApCisgICAgIHVuc2lnbmVkIGxvbmcgbmluYWRkcjsJLyogQWRkcmVzcyBvZiBzdHJpbmcgaW4gTklORFkgbWVtb3J5IHNwYWNlICovCisgICAgIHVuc2lnbmVkIGNoYXIgKmhvc3RhZGRyOwkvKiBBZGRyZXNzIG9mIHRoZSBidWZmZXIgdG8gd2hpY2ggc3RyaW5nIHNob3VsZAorCQkJCSAqCWJlIGNvcGllZC4KKwkJCQkgKi8KK3sKKwl1bnNpZ25lZCBjaGFyIGNtZFs1XTsKKworCWNtZFswXSA9ICciJzsKKwlzdG9yZV91bnNpZ25lZF9pbnRlZ2VyICgmY21kWzFdLCA0LCBuaW5hZGRyKTsKKwlzZW5kKCBjbWQsIDUsIGhvc3RhZGRyICk7Cit9CisKKyNpZiAwCisvKiBOb3QgdXNlZC4gICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG5pblZlcnNpb246CisgKglBc2sgTklORFkgZm9yIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgaXRzZWxmLgorICoJVGhlIGluZm9ybWF0aW9uIGlzIHNlbnQgYXMgYW4gYXNjaWkgc3RyaW5nIGluIHRoZSBmb3JtICJ4Lnh4LDxhcmNoPiIsCisgKgl3aGVyZSwKKyAqCQl4Lnh4CWlzIHRoZSB2ZXJzaW9uIG51bWJlcgorICoJCTxhcmNoPglpcyB0aGUgcHJvY2Vzc29yIGFyY2hpdGVjdHVyZTogIktBIiwgIktCIiwgIk1DIiwgIkNBIiAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorbmluVmVyc2lvbiggcCApCisgICAgIHVuc2lnbmVkIGNoYXIgKnA7CQkvKiBXaGVyZSB0byBwbGFjZSB2ZXJzaW9uIHN0cmluZyAqLworeworCisJaWYgKCBvbGRfbmluZHkgKXsKKwkJcmV0dXJuIE9uaW5WZXJzaW9uKCBwICk7CisJfQorCXNlbmQoKHVuc2lnbmVkIGNoYXIgKikgInYiLCAxLCBwICk7CisJcmV0dXJuIHN0cmxlbihwKTsKK30KKyNlbmRpZiAvKiAwICovCmRpZmYgLS1naXQgYS9nZGIvbmluZHktc2hhcmUvc3RvcC5oIGIvZ2RiL25pbmR5LXNoYXJlL3N0b3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmE5MGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL25pbmR5LXNoYXJlL3N0b3AuaApAQCAtMCwwICsxLDg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBDb3B5cmlnaHQgMTk5MCwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBjb2RlIHdhcyBkb25hdGVkIGJ5IEludGVsIENvcnAuCisKKyAgIEludGVsIGhlcmVieSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5LCBhbmQKKyAgIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24uICBJbnRlbCBncmFudHMKKyAgIHRoaXMgcGVybWlzc2lvbiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlCisgICBhcHBlYXJzIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAgIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEluCisgICBhZGRpdGlvbiwgSW50ZWwgZ3JhbnRzIHRoaXMgcGVybWlzc2lvbiBwcm92aWRlZCB0aGF0IHlvdQorICAgcHJvbWluZW50bHkgbWFyayBhcyBub3QgcGFydCBvZiB0aGUgb3JpZ2luYWwgYW55IG1vZGlmaWNhdGlvbnMKKyAgIG1hZGUgdG8gdGhpcyBzb2Z0d2FyZSBvciBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZgorICAgSW50ZWwgQ29ycG9yYXRpb24gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5CisgICBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgb3IgdGhlIGRvY3VtZW50YXRpb24KKyAgIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKworICAgSW50ZWwgQ29ycG9yYXRpb24gZG9lcyBub3Qgd2FycmFudCwgZ3VhcmFudGVlIG9yIG1ha2UgYW55CisgICByZXByZXNlbnRhdGlvbnMgcmVnYXJkaW5nIHRoZSB1c2Ugb2YsIG9yIHRoZSByZXN1bHRzIG9mIHRoZSB1c2UKKyAgIG9mLCB0aGUgc29mdHdhcmUgYW5kIGRvY3VtZW50YXRpb24gaW4gdGVybXMgb2YgY29ycmVjdG5lc3MsCisgICBhY2N1cmFjeSwgcmVsaWFiaWxpdHksIGN1cnJlbnRuZXNzLCBvciBvdGhlcndpc2U7IGFuZCB5b3UgcmVseQorICAgb24gdGhlIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uIGFuZCByZXN1bHRzIHNvbGVseSBhdCB5b3VyIG93bgorICAgcmlzay4JCQkJCQkJICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICBSRUFTT05TIFdIWSBOSU5EWSBDQU4gU1RPUCBFWEVDVVRJTkcgQU4gQVBQTElDQVRJT04gUFJPR1JBTQorICoKKyAqIFdoZW4gTklORFkgc3RvcHMgZXhlY3V0aW5nIGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB3YXMgcnVubmluZworICogdW5kZXIgcmVtb3RlIGhvc3QgKCJnZGIiKSBjb250cm9sLCBpdCBzaWduYWxzIHRoZSBob3N0IGJ5IHNlbmRpbmcKKyAqIGEgc2luZ2xlIF5QLiAgVGhlIGhvc3QgY2FuIHRoZW4gcXVlcnkgYXMgdG8gdGhlIHJlYXNvbiBmb3IgdGhlIGhhbHQuCisgKiBOSU5EWSByZXNwb25kcyB3aXRoIHR3byBieXRlcyBvZiBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGUgZmlyc3QgYnl0ZSBpcyBhIGJvb2xlYW4gZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdAorICogdGhlIGFwcGxpY2F0aW9uIGhhcyBleGl0ZWQuCisgKgorICogSWYgdGhlIGZsYWcgaXMgdHJ1ZSwgdGhlIHNlY29uZCBieXRlIGNvbnRhaW5zIHRoZSBleGl0IGNvZGUuCisgKgorICogSWYgdGhlIGZsYWcgaXMgZmFsc2UsIHRoZSBzZWNvbmQgYnl0ZSBjb250YWlucyBhICJyZWFzb24gZm9yCisgKiBzdG9wcGluZyIgY29kZS4gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhhdAorICogY29kZS4KKyAqCisgKiBUaGVyZSBhcmUgdGhyZWUgY2F0ZWdvcmllcyBvZiByZWFzb25zIHdoeSB0aGUgaGFsdCBtYXkgaGF2ZSBvY2N1cnJlZDoKKyAqIGZhdWx0cywgdHJhY2VzLCBhbmQgc29mdHdhcmUgaW50ZXJhY3Rpb25zLiAgVGhlIGZpcnN0IHR3byBjYXRlZ29yaWVzCisgKiBhcmUgcHJvY2Vzc29yLWRlcGVuZGVudDsgdGhlIHZhbHVlcyBvZiB0aGVzZSBjb2RlcyBhcmUgdGlnaHRseSBjb3VwbGVkCisgKiB0byB0aGUgaGFyZHdhcmUgYW5kIHNob3VsZCBub3QgYmUgY2hhbmdlZCB3aXRob3V0IGZpcnN0IGV4YW1pbmluZworICogc3JjL25pbmR5L2NvbW1vbi9mYXVsdC5jLiAgVGhlIHNvZnR3YXJlIGludGVyYWN0aW9ucyBpbnZvbHZlCisgKiBjb21tdW5pY2F0aW9uIGJldHdlZW4gTklORFkgYW5kIHRoZSBob3N0IGRlYnVnZ2VyOyAgdGhlaXIgY29kZXMgYXJlCisgKiBhcmJpdHJhcnkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBGQVVMVF9QQVJBTExFTAkweDAwCisjZGVmaW5lIEZBVUxUX1VOS05PV04JMHgwMQorI2RlZmluZSBGQVVMVF9PUEVSQVRJT04JMHgwMgorI2RlZmluZSBGQVVMVF9BUklUSAkweDAzCisjZGVmaW5lIEZBVUxUX0ZQCTB4MDQKKyNkZWZpbmUgRkFVTFRfQ09OU1RSCTB4MDUKKyNkZWZpbmUgRkFVTFRfVk0JMHgwNgorI2RlZmluZSBGQVVMVF9QUk9URUNUCTB4MDcKKyNkZWZpbmUgRkFVTFRfTUFDSElORQkweDA4CisjZGVmaW5lIEZBVUxUX1NUUlVDVAkweDA5CisjZGVmaW5lIEZBVUxUX1RZUEUJMHgwYQorCS8qIDB4MGIgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRkFVTFRfUFJPQ0VTUwkweDBjCisjZGVmaW5lIEZBVUxUX0RFU0MJMHgwZAorI2RlZmluZSBGQVVMVF9FVkVOVAkweDBlCisJLyogMHgwZiByZXNlcnZlZCAqLworCisjZGVmaW5lIExBU1RfRkFVTFQgICAgICAweDBmCisKKyNkZWZpbmUgVFJBQ0VfU1RFUAkweDEwCisjZGVmaW5lIFRSQUNFX0JSQU5DSAkweDExCisjZGVmaW5lIFRSQUNFX0NBTEwJMHgxMgorI2RlZmluZSBUUkFDRV9SRVQJMHgxMworI2RlZmluZSBUUkFDRV9QUkVSRVQJMHgxNAorI2RlZmluZSBUUkFDRV9TVkMJMHgxNQorI2RlZmluZSBUUkFDRV9CS1BUCTB4MTYKKworI2RlZmluZSBTVE9QX1NSUQkweGZlCisJLyogQXBwbGljYXRpb24gcHJvZ3JhbSBoYXMgc2VydmljZSByZXF1ZXN0IHRvIG1ha2Ugb2YgaG9zdCAqLworCisjZGVmaW5lIFNUT1BfR0RCX0JQVCAgICAweGZmCisJLyogQXBwbGljYXRpb24gcHJvZ3JhbSBoYXMgcmVhY2hlZCBicmVha3BvaW50IChmbWFyaykgc2V0IGJ5IGhvc3QgKi8KZGlmZiAtLWdpdCBhL2dkYi9uaW5keS1zaGFyZS90dHlmbHVzaC5jIGIvZ2RiL25pbmR5LXNoYXJlL3R0eWZsdXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1NDQ3MgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9uaW5keS1zaGFyZS90dHlmbHVzaC5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBzdGFydGVkIG91dCBsaWZlIGFzIGNvZGUgc2hhcmVkIGJldHdlZW4gdGhlIG5pbmR5IG1vbml0b3IgYW5kCisgICBHREIuICBGb3IgdmFyaW91cyByZWFzb25zLCB0aGlzIGlzIG5vIGxvbmdlciB0cnVlLiAgRXZlbnR1YWxseSwgaXQKKyAgIHByb2JhYmx5IHNob3VsZCBiZSBtZXJnZWQgaW50byByZW1vdGUtbmluZHkuYy4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJzZXJpYWwuaCIKKworI2lmZGVmIF9NU0NfVkVSCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBkZWZpbmUgc2xlZXAgX3NsZWVwCisjZW5kaWYKKworLyogRmx1c2ggYWxsIHBlbmRpbmcgaW5wdXQgYW5kIG91dHB1dCBmb3IgU0VSSUFMLCB3YWl0IGZvciBhIHNlY29uZCwgYW5kCisgICB0aGVuIGlmIHRoZXJlIGlzIGEgY2hhcmFjdGVyIHBlbmRpbmcsIGRpc2NhcmQgaXQgYW5kIGZsdXNoIGFnYWluLiAgKi8KKworaW50Cit0dHlfZmx1c2ggKHNlcmlhbCkKKyAgICAgc2VyaWFsX3Qgc2VyaWFsOworeworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBTRVJJQUxfRkxVU0hfSU5QVVQgKHNlcmlhbCk7CisgICAgICBTRVJJQUxfRkxVU0hfT1VUUFVUIChzZXJpYWwpOworICAgICAgc2xlZXAoMSk7CisgICAgICBzd2l0Y2ggKFNFUklBTF9SRUFEQ0hBUiAoc2VyaWFsLCAwKSkKKwl7CisJY2FzZSBTRVJJQUxfVElNRU9VVDoKKwljYXNlIFNFUklBTF9FUlJPUjoKKwljYXNlIFNFUklBTF9FT0Y6CisJICByZXR1cm4gMDsKKwlkZWZhdWx0OgorCSAgLyogV2UgcmVhZCBzb21ldGhpbmcuICBFZWVrLiAgVHJ5IGFnYWluLiAgKi8KKwkgIGJyZWFrOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9nZGIvbmluZHktdGRlcC5jIGIvZ2RiL25pbmR5LXRkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTBiMTBjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL25pbmR5LXRkZXAuYwpAQCAtMCwwICsxLDc0IEBACisvKiBUYXJnZXQtbWFjaGluZSBkZXBlbmRlbnQgY29kZSBmb3IgdGhlIE5JTkRZIG1vbml0b3IgcnVubmluZyBvbiB0aGUgSW50ZWwgOTYwCisgICBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBJbnRlbCBDb3Jwb3JhdGlvbi4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBNaXNjZWxsYW5lb3VzIE5JTkRZLWRlcGVuZGVudCByb3V0aW5lcy4KKyAgIFNvbWUgcmVwbGFjZSBtYWNyb3Mgbm9ybWFsbHkgZGVmaW5lZCBpbiAidG0uaCIuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorCisvKiAnc3RhcnRfZnJhbWUnIGlzIGEgdmFyaWFibGUgaW4gdGhlIE5JTkRZIHJ1bnRpbWUgc3RhcnR1cCByb3V0aW5lCisgICB0aGF0IGNvbnRhaW5zIHRoZSBmcmFtZSBwb2ludGVyIG9mIHRoZSAnc3RhcnQnIHJvdXRpbmUgKHRoZSByb3V0aW5lCisgICB0aGF0IGNhbGxzICdtYWluJykuICBCeSByZWFkaW5nIGl0cyBjb250ZW50cyBvdXQgb2YgcmVtb3RlIG1lbW9yeSwKKyAgIHdlIGNhbiB0ZWxsIHdoZXJlIHRoZSBmcmFtZSBjaGFpbiBlbmRzOiAgYmFja3RyYWNlcyBzaG91bGQgaGFsdCBiZWZvcmUKKyAgIHRoZXkgZGlzcGxheSB0aGlzIGZyYW1lLiAgKi8KKworaW50CituaW5keV9mcmFtZV9jaGFpbl92YWxpZCAoY2hhaW4sIGN1cmZyYW1lKQorICAgIENPUkVfQUREUiBjaGFpbjsKKyAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqY3VyZnJhbWU7Cit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbDsKKworCS8qIGNydG5pbmR5Lm8gaXMgYW4gYXNzZW1ibGVyIG1vZHVsZSB0aGF0IGlzIGFzc3VtZWQgdG8gYmUgbGlua2VkCisJICogZmlyc3QgaW4gYW4gaTgwOTYwIGV4ZWN1dGFibGUuICBJdCBjb250YWlucyB0aGUgdHJ1ZSBlbnRyeSBwb2ludDsKKwkgKiBpdCBwZXJmb3JtcyBzdGFydHVwIHVwIGluaXRpYWxpemF0aW9uIGFuZCB0aGVuIGNhbGxzICdtYWluJy4KKwkgKgorCSAqICdzZicgaXMgdGhlIG5hbWUgb2YgYSB2YXJpYWJsZSBpbiBjcnRuaW5keS5vIHRoYXQgaXMgc2V0CisJICoJZHVyaW5nIHN0YXJ0dXAgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGZyYW1lLgorCSAqCisJICogJ2EnIGlzIHRoZSBhZGRyZXNzIG9mIHRoYXQgdmFyaWFibGUgaW4gODA5NjAgbWVtb3J5LgorCSAqLworCXN0YXRpYyBjaGFyIHNmW10gPSAic3RhcnRfZnJhbWUiOworCUNPUkVfQUREUiBhOworCisKKwljaGFpbiAmPSB+MHgzZjsgLyogWmVybyBsb3cgNiBiaXRzIGJlY2F1c2UgcHJldmlvdXMgZnJhbWUgcG9pbnRlcnMKKwkJCSAgIGNvbnRhaW4gcmV0dXJuIHN0YXR1cyBpbmZvIGluIHRoZW0uICAqLworCWlmICggY2hhaW4gPT0gMCApeworCQlyZXR1cm4gMDsKKwl9CisKKwlzeW0gPSBsb29rdXBfc3ltYm9sKHNmLCAwLCBWQVJfTkFNRVNQQUNFLCAoaW50ICopTlVMTCwgCisJCQkJICAoc3RydWN0IHN5bXRhYiAqKilOVUxMKTsKKwlpZiAoIHN5bSAhPSAwICl7CisJCWEgPSBTWU1CT0xfVkFMVUUgKHN5bSk7CisJfSBlbHNlIHsKKwkJbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoc2YsIE5VTEwsIE5VTEwpOworCQlpZiAobXN5bWJvbCA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWEgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCk7CisJfQorCisJcmV0dXJuICggY2hhaW4gIT0gcmVhZF9tZW1vcnlfaW50ZWdlcihhLDQpICk7Cit9CmRpZmYgLS1naXQgYS9nZGIvbmxtL01ha2VmaWxlLmluIGIvZ2RiL25sbS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDUxMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL25sbS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDE3MiBAQAorI0NvcHlyaWdodCAxOTg5LCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworc3JjZGlyID0gQHNyY2RpckAKK1ZQQVRIID0gQHNyY2RpckAKKworcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorCitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorYmluZGlyID0gQGJpbmRpckAKK2xpYmRpciA9IEBsaWJkaXJACit0b29sZGlyID0gJChsaWJkaXIpLyQodGFyZ2V0X2FsaWFzKQorCitkYXRhZGlyID0gQGRhdGFkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCittYW4yZGlyID0gJChtYW5kaXIpL21hbjIKK21hbjNkaXIgPSAkKG1hbmRpcikvbWFuMworbWFuNGRpciA9ICQobWFuZGlyKS9tYW40CittYW41ZGlyID0gJChtYW5kaXIpL21hbjUKK21hbjZkaXIgPSAkKG1hbmRpcikvbWFuNgorbWFuN2RpciA9ICQobWFuZGlyKS9tYW43CittYW44ZGlyID0gJChtYW5kaXIpL21hbjgKK21hbjlkaXIgPSAkKG1hbmRpcikvbWFuOQoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAorCitTSEVMTCA9IEBTSEVMTEAKKworSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACisKK0NDX0ZPUl9UQVJHRVQgPSBgIFwKKyAgaWYgWyAtZiAuLi8uLi9nY2MveGdjYyBdIDsgdGhlbiBcCisgICAgZWNobyAuLi8uLi9nY2MveGdjYyAtQi4uLy4uL2djYy87IFwKKyAgZWxzZSBcCisgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gZ2NjIHwgc2VkIC1lICcnICQkdDsgXAorICBmaWAKKworTkxNQ09OVl9GT1JfVEFSR0VUID0gYCBcCisgIGlmIFsgLWYgLi4vLi4vYmludXRpbHMvbmxtY29udiBdIDsgdGhlbiBcCisgICAgZWNobyAuLi8uLi9iaW51dGlscy9ubG1jb252OyBcCisgIGVsc2UgXAorICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIG5sbWNvbnYgfCBzZWQgLWUgJycgJCR0OyBcCisgIGZpYAorCisjIEFsbCB0aGUgaW5jbHVkZXMgdXNlZCBmb3IgQ0ZMQUdTIGFuZCBmb3IgbGludC4KK0lOQ0xVREVfQ0ZMQUdTID0gLUkuIC1JJHtzcmNkaXJ9CisKKyMgQ0ZMQUdTIGlzIHNwZWNpZmljYWxseSByZXNlcnZlZCBmb3Igc2V0dGluZyBmcm9tIHRoZSBjb21tYW5kIGxpbmUKKyMgd2hlbiBydW5uaW5nIG1ha2UuICBJLkUuICAibWFrZSBDRkxBR1M9LVdtaXNzaW5nLXByb3RvdHlwZXMiLgorQ0ZMQUdTID0gLWcKKyMgSU5URVJOQUxfQ0ZMQUdTIGlzIHRoZSBhZ2dyZWdhdGUgb2YgYWxsIG90aGVyICpDRkxBR1MgbWFjcm9zLgorSU5URVJOQUxfQ0ZMQUdTID0gJHtDRkxBR1N9ICR7SU5DTFVERV9DRkxBR1N9ICR7VVNFUl9DRkxBR1N9IAorTERGTEFHUyA9ICQoQ0ZMQUdTKQorCisjIFBlcmhhcHMgc2hvdWxkIGNvbWUgZnJvbSBwYXJlbnQgTWFrZWZpbGUKK1ZFUlNJT04gPSBnZGJzZXJ2ZS00LjEyCitESVNUPWdkYgorCisjIHRhcmdldC1kZXBlbmRlbnQgbWFrZWZpbGUgZnJhZ21lbnQgY29tZSBpbiBoZXJlLgorQHRhcmdldF9tYWtlZmlsZV9mcmFnQAorIyBFbmQgdGFyZ2V0LWRlcGVuZGVudCBtYWtlZmlsZSBmcmFnbWVudAorCisjIEFsbCBzb3VyY2UgZmlsZXMgdGhhdCBnbyBpbnRvIGxpbmtpbmcgR0RCIHJlbW90ZSBzZXJ2ZXIuCisKK0RFUEZJTEVTID0gJChHREJTRVJWRV9ERVBGSUxFUykKKworU09VUkNFUyA9ICQoQUxMREVQRklMRVMpCitUQUdGSUxFUyA9ICQoU09VUkNFUykgJHtIRklMRVN9ICR7QUxMUEFSQU19ICR7UE9TU0xJQlN9IAorCisjIFByZXZlbnQgU3VuIG1ha2UgZnJvbSBwdXR0aW5nIGluIHRoZSBtYWNoaW5lIHR5cGUuICBTZXR0aW5nCisjIFRBUkdFVF9BUkNIIHRvIG5vdGhpbmcgd29ya3MgZm9yIFN1bk9TIDMsIDQuMCwgYnV0IG5vdCBmb3IgNC4xLgorLmMubzoKKwkke0NDX0ZPUl9UQVJHRVR9IC1jICR7SU5URVJOQUxfQ0ZMQUdTfSAkPAorCisuUy5vOgorCSR7Q0NfRk9SX1RBUkdFVH0gLWMgJHtJTlRFUk5BTF9DRkxBR1N9ICQ8CisKK2FsbDogZ2Ric2VydmUubmxtCisKKyMgVHJhZGl0aW9uYWxseSAiaW5zdGFsbCIgZGVwZW5kcyBvbiAiYWxsIi4gIEJ1dCBpdCBtYXkgYmUgdXNlZnVsCisjIG5vdCB0bzsgZm9yIGV4YW1wbGUsIGlmIHRoZSB1c2VyIGhhcyBtYWRlIHNvbWUgdHJpdmlhbCBjaGFuZ2UgdG8gYSAKKyMgc291cmNlIGZpbGUgYW5kIGRvZXNuJ3QgY2FyZSBhYm91dCByZWJ1aWxkaW5nIG9yIGp1c3Qgd2FudHMgdG8gc2F2ZSB0aGUKKyMgdGltZSBpdCB0YWtlcyBmb3IgbWFrZSB0byBjaGVjayB0aGF0IGFsbCBpcyB1cCB0byBkYXRlLgorIyBpbnN0YWxsLW9ubHkgaXMgaW50ZW5kZWQgdG8gYWRkcmVzcyB0aGF0IG5lZWQuCitpbnN0YWxsOiBhbGwgaW5zdGFsbC1vbmx5CitpbnN0YWxsLW9ubHk6IAorCSQoSU5TVEFMTCkgZ2Ric2VydmUubmxtICQoYmluZGlyKS9nZGJzZXJ2ZS5ubG0KKwordW5pbnN0YWxsOiBmb3JjZQorCXJtIC1mICQoYmluZGlyKS9nZGJzZXJ2ZS5ubG0KKworaW5zdGFsbGNoZWNrOgorY2hlY2s6CitpbmZvIGR2aToKK2luc3RhbGwtaW5mbzoKK2NsZWFuLWluZm86CisKK2dkYnNlcnZlLm5sbToJZ2Ric2VydmUuTyAkKHNyY2RpcikvZ2Ric2VydmUuZGVmCisJJHtOTE1DT05WX0ZPUl9UQVJHRVR9IC1UICQoc3JjZGlyKS9nZGJzZXJ2ZS5kZWYKKworZ2Ric2VydmUuTzogcHJlbHVkZS5vIGdkYnNlcnZlLm8gJChUREVQRklMRVMpCisJJHtDQ19GT1JfVEFSR0VUfSAkKExERkxBR1MpIC1yIC1vIGdkYnNlcnZlLk8gcHJlbHVkZS5vIGdkYnNlcnZlLm8gJHtUREVQRklMRVN9CisKKyMgUHV0IHRoZSBwcm9wZXIgbWFjaGluZS1zcGVjaWZpYyBmaWxlcyBmaXJzdCwgc28gTS0uIG9uIGEgbWFjaGluZQorIyBzcGVjaWZpYyByb3V0aW5lIGdldHMgdGhlIG9uZSBmb3IgdGhlIGNvcnJlY3QgbWFjaGluZS4KKyMgVGhlIHh5enp5IHN0dWZmIGJlbG93IGRlYWxzIHdpdGggZW1wdHkgREVQRklMRVMKK1RBR1M6CSR7VEFHRklMRVN9CisJZXRhZ3MgYGZpbmQgJHtzcmNkaXJ9Ly4uL2NvbmZpZyAtbmFtZSAkKFRNX0ZJTEUpIC1wcmludGAgXAorCSAgYGZpbmQgJHtzcmNkaXJ9Ly4uL2NvbmZpZyAtbmFtZSAke1hNX0ZJTEV9IC1wcmludGAgXAorCSAgYGZpbmQgJHtzcmNkaXJ9Ly4uL2NvbmZpZyAtbmFtZSAke05BVF9GSUxFfSAtcHJpbnRgIFwKKwkgIGBmb3IgaSBpbiB5enp5ICR7REVQRklMRVN9OyBkbyBcCisJICAgICBpZiBbIHgkJGkgIT0geHl6enkgXTsgdGhlbiBcCisJICAgICAgIGVjaG8gJHtzcmNkaXJ9LyQkaSB8IHNlZCAtZSAncy9cLm8kJC9cLmMvJyA7IFwKKwkgICAgIGZpOyBcCisJICAgZG9uZWAgXAorCSAgJHtUQUdGSUxFU30KK3RhZ3M6IFRBR1MKKworY2xlYW46CisJcm0gLWYgKi5vICR7QUREX0ZJTEVTfSAqfgorCXJtIC1mIGdkYnNlcnZlLk8gZ2Ric2VydmUubmxtIGNvcmUgbWFrZS5sb2cKKworZGlzdGNsZWFuOiBjbGVhbiBUQUdTCisJcm0gLWYgY29uZmlnLmxvZyBjb25maWcuY2FjaGUgY29uZmlnLnN0YXR1cworCXJtIC1mIE1ha2VmaWxlCisKK21haW50YWluZXItY2xlYW4gcmVhbGNsZWFuOiBjbGVhbgorCXJtIC1mIFRBR1MKKwlybSAtZiBjb25maWcubG9nIGNvbmZpZy5jYWNoZSBjb25maWcuc3RhdHVzCisJcm0gLWYgTWFrZWZpbGUKKworTWFrZWZpbGU6IE1ha2VmaWxlLmluIGNvbmZpZy5zdGF0dXMgQHRhcmdldF9tYWtlZmlsZV9mcmFnX3BhdGhACisJJChTSEVMTCkgY29uZmlnLnN0YXR1cworCitjb25maWcuc3RhdHVzOiBjb25maWd1cmUKKwkkKFNIRUxMKSBjb25maWcuc3RhdHVzIC0tcmVjaGVjaworCitmb3JjZToKKworIyBHTlUgTWFrZSBoYXMgYW4gYW5ub3lpbmcgaGFiaXQgb2YgcHV0dGluZyAqYWxsKiB0aGUgTWFrZWZpbGUgdmFyaWFibGVzCisjIGludG8gdGhlIGVudmlyb25tZW50LCB1bmxlc3MgeW91IGluY2x1ZGUgdGhpcyB0YXJnZXQgYXMgYSBjaXJjdW12ZW50aW9uLgorIyBSdW1vciBpcyB0aGF0IHRoaXMgd2lsbCBiZSBmaXhlZCAoYW5kIHRoaXMgdGFyZ2V0IGNhbiBiZSByZW1vdmVkKQorIyBpbiBHTlUgTWFrZSA0LjAuCisuTk9FWFBPUlQ6CisKKyMgR05VIE1ha2UgMy42MyBoYXMgYSBkaWZmZXJlbnQgcHJvYmxlbTogaXQga2VlcHMgdGFja2luZyBjb21tYW5kIGxpbmUKKyMgb3ZlcnJpZGVzIG9udG8gdGhlIGRlZmluaXRpb24gb2YgJChNQUtFKS4gIFRoaXMgdmFyaWFibGUgc2V0dGluZworIyB3aWxsIHJlbW92ZSB0aGVtLgorTUFLRU9WRVJSSURFUz0KKworIyBUaGlzIGlzIHRoZSBlbmQgb2YgIk1ha2VmaWxlLmluIi4KZGlmZiAtLWdpdCBhL2dkYi9ubG0vY29uZmlndXJlIGIvZ2RiL25sbS9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzkxOGZlZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9ubG0vY29uZmlndXJlCkBAIC0wLDAgKzEsMTA3NCBAQAorIyEgL2Jpbi9zaAorCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorYWNfbWF4X2hlcmVfbGluZXM9MTIKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPWdkYnNlcnZlLmMKKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCithY19leGVleHQ9CithY19vYmpleHQ9bworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworCisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTczOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKKworaG9zdF9hbGlhcz0kaG9zdAorY2FzZSAiJGhvc3RfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkKKyAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6CisgICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkgOzsKKyAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCitob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkaG9zdCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU5NDogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKwordGFyZ2V0X2FsaWFzPSR0YXJnZXQKK2Nhc2UgIiR0YXJnZXRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKwordGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAordGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK3RhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCit0YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjEyOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9CitlbHNlCisgICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KKyAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAorcyxcXCxcXFxcLGc7IHMsXCQsJCQsZworRU9GX1NFRAorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgorICBybSAtZiBjb25mdGVzdHNlZAorZmkKK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorCisjIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCit0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCisKKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2NjY6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisKKyMgTWFwIHRhcmdldCBjcHUgaW50byB0aGUgY29uZmlnIGNwdSBzdWJkaXJlY3RvcnkgbmFtZS4KKyMgVGhlIGRlZmF1bHQgaXMgJHRhcmdldF9jcHUuCitjYXNlICIke3RhcmdldF9jcHV9IiBpbgorYWxwaGEpCQkJZ2RiX3RhcmdldF9jcHU9YWxwaGEgOzsKK2NbMTJdKQkJCWdkYl90YXJnZXRfY3B1PWNvbnZleCA7OworaHBwYSopCQkJZ2RiX3RhcmdldF9jcHU9cGEgOzsKK2lbMzQ1Nl04NikJCWdkYl90YXJnZXRfY3B1PWkzODYgOzsKK202OCopCQkJZ2RiX3RhcmdldF9jcHU9bTY4ayA7OworbnAxKQkJCWdkYl90YXJnZXRfY3B1PWdvdWxkIDs7CitwbikJCQlnZGJfdGFyZ2V0X2NwdT1nb3VsZCA7OworcHlyYW1pZCkJCWdkYl90YXJnZXRfY3B1PXB5ciA7Oworc3BhcmMqKQkJCWdkYl90YXJnZXRfY3B1PXNwYXJjIDs7CisqKQkJCWdkYl90YXJnZXRfY3B1PSR0YXJnZXRfY3B1IDs7Citlc2FjCisKK3RhcmdldF9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS8uLi9jb25maWcvJHtnZGJfdGFyZ2V0X2NwdX0vZ2Ric2VydmUubXQKK2lmICAhIC1mICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IDsgdGhlbgorCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIioqKiBHREJTRVJWRSBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldCAke3RhcmdldH0iIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RhcmdldF9tYWtlZmlsZV9mcmFnX3BhdGg9JHRhcmdldF9tYWtlZmlsZV9mcmFnCisKKworCitjcHVmaWxlPWBzZWQgLW4gJworcy9DUFVfRklMRSAJKj0gCSpcKF4gCSpcKS9cMS9wCisnICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9CisKK2ZpbGVzPQorbGlua3M9CitybSAtZiBjcHUuaAoraWYgICIke2NwdWZpbGV9IiAhPSAiIiA7IHRoZW4KKwlmaWxlcz0iJHtmaWxlc30gJHtjcHVmaWxlfS5oIgorCWxpbmtzPSIke2xpbmtzfSBjcHUuaCIKK2ZpCisKKwordHJhcCAnJyAxIDIgMTUKK2NhdCA+IGNvbmZjYWNoZSA8PFxFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgorIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAorIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCisjIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgorIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCisjIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgorIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCisjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworRU9GCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKyhzZXQpIDI+JjEgfAorICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjEgfCBncmVwIGFjX3NwYWNlYCBpbgorICAqYWNfc3BhY2U9XCAqKQorICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCisgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICBzZWQgLW4gXAorICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKKyAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKyAgICA7OworICAqKQorICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJworICAgIDs7CisgIGVzYWMgPj4gY29uZmNhY2hlCitpZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKyMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCitmaQorCit0cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBERUZTLgorIyBQcm90ZWN0IGFnYWluc3Qgc2hlbGwgZXhwYW5zaW9uIHdoaWxlIGV4ZWN1dGluZyBNYWtlZmlsZSBydWxlcy4KKyMgUHJvdGVjdCBhZ2FpbnN0IE1ha2VmaWxlIG1hY3JvIGV4cGFuc2lvbi4KK2NhdCA+IGNvbmZ0ZXN0LmRlZnMgPDxcRU9GCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUtRFwxPVwyJWcKK3MlWyAJYH4jJF4mKigpe31cXHw7JyI8Pj9dJVxcJiVnCitzJVxbJVxcJiVnCitzJVxdJVxcJiVnCitzJVwkJSQkJWcKK0VPRgorREVGUz1gc2VkIC1mIGNvbmZ0ZXN0LmRlZnMgY29uZmRlZnMuaCB8IHRyICdcMDEyJyAnICdgCitybSAtZiBjb25mdGVzdC5kZWZzCisKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCithY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KK3NlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Cisgcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKKyRhY192cHN1YgorJGV4dHJhc3ViCitzJUBTSEVMTEAlJFNIRUxMJWcKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBob3N0QCUkaG9zdCVnCitzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCitzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKK3MlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZworcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKK3MlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCitzJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCitzJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCitzJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZworcyVAYnVpbGRAJSRidWlsZCVnCitzJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKK3MlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCitzJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZworcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCitzJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZworcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKK3MlQHRhcmdldF9tYWtlZmlsZV9mcmFnX3BhdGhAJSR0YXJnZXRfbWFrZWZpbGVfZnJhZ19wYXRoJWcKKy9AdGFyZ2V0X21ha2VmaWxlX2ZyYWdAL3IgJHRhcmdldF9tYWtlZmlsZV9mcmFnCitzJUB0YXJnZXRfbWFrZWZpbGVfZnJhZ0AlJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KKyAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OworICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKK3MlQElOU1RBTExAJSRJTlNUQUxMJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCithY19zb3VyY2VzPSIkZmlsZXMiCithY19kZXN0cz0iJGxpbmtzIgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK3NyY2Rpcj0kYWNfZ2l2ZW5fc3JjZGlyCit3aGlsZSB0ZXN0IC1uICIkYWNfc291cmNlcyI7IGRvCisgIHNldCAkYWNfZGVzdHM7IGFjX2Rlc3Q9JDE7IHNoaWZ0OyBhY19kZXN0cz0kKgorICBzZXQgJGFjX3NvdXJjZXM7IGFjX3NvdXJjZT0kMTsgc2hpZnQ7IGFjX3NvdXJjZXM9JCoKKworICBlY2hvICJsaW5raW5nICRzcmNkaXIvJGFjX3NvdXJjZSB0byAkYWNfZGVzdCIKKworICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfc291cmNlOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkc3JjZGlyLyRhY19zb3VyY2U6IEZpbGUgbm90IGZvdW5kIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKKyAgcm0gLWYgJGFjX2Rlc3QKKworICAjIE1ha2UgcmVsYXRpdmUgc3ltbGlua3MuCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kZXN0X2Rpcj1gZWNobyAkYWNfZGVzdHxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gIiRhY19kZXN0IiAmJiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBkZXN0IGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGVzdF9kaXIiICYmIG1rZGlyICIkYWNfZGVzdF9kaXIiCisgICAgYWNfZGVzdF9kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2Rlc3RfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kZXN0X2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGVzdF9kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGVzdF9kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRzcmNkaXIiIGluCisgIFsvJF0qKSBhY19yZWxfc291cmNlPSIkc3JjZGlyLyRhY19zb3VyY2UiIDs7CisgICopIGFjX3JlbF9zb3VyY2U9IiRhY19kb3RzJHNyY2Rpci8kYWNfc291cmNlIiA7OworICBlc2FjCisKKyAgIyBNYWtlIGEgc3ltbGluayBpZiBwb3NzaWJsZTsgb3RoZXJ3aXNlIHRyeSBhIGhhcmQgbGluay4KKyAgaWYgbG4gLXMgJGFjX3JlbF9zb3VyY2UgJGFjX2Rlc3QgMj4vZGV2L251bGwgfHwKKyAgICBsbiAkc3JjZGlyLyRhY19zb3VyY2UgJGFjX2Rlc3Q7IHRoZW4gOgorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGxpbmsgJGFjX2Rlc3QgdG8gJHNyY2Rpci8kYWNfc291cmNlIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2RvbmUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKworCmRpZmYgLS1naXQgYS9nZGIvbmxtL2NvbmZpZ3VyZS5pbiBiL2dkYi9ubG0vY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NWI0ODYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbmxtL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDU1IEBACitkbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK0FDX1BSRVJFUSgyLjEyLjEpZG5sCitBQ19JTklUKGdkYnNlcnZlLmMpCisKK0FDX0NPTkZJR19BVVhfRElSKGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4pCitBQ19DQU5PTklDQUxfU1lTVEVNCitBQ19BUkdfUFJPR1JBTQorCitBQ19QUk9HX0lOU1RBTEwKKworIyBNYXAgdGFyZ2V0IGNwdSBpbnRvIHRoZSBjb25maWcgY3B1IHN1YmRpcmVjdG9yeSBuYW1lLgorIyBUaGUgZGVmYXVsdCBpcyAkdGFyZ2V0X2NwdS4KK2NoYW5nZXF1b3RlKCwpZG5sCitjYXNlICIke3RhcmdldF9jcHV9IiBpbgorYWxwaGEpCQkJZ2RiX3RhcmdldF9jcHU9YWxwaGEgOzsKK2NbMTJdKQkJCWdkYl90YXJnZXRfY3B1PWNvbnZleCA7OworaHBwYSopCQkJZ2RiX3RhcmdldF9jcHU9cGEgOzsKK2lbMzQ1Nl04NikJCWdkYl90YXJnZXRfY3B1PWkzODYgOzsKK202OCopCQkJZ2RiX3RhcmdldF9jcHU9bTY4ayA7OworbnAxKQkJCWdkYl90YXJnZXRfY3B1PWdvdWxkIDs7CitwbikJCQlnZGJfdGFyZ2V0X2NwdT1nb3VsZCA7OworcHlyYW1pZCkJCWdkYl90YXJnZXRfY3B1PXB5ciA7Oworc3BhcmMqKQkJCWdkYl90YXJnZXRfY3B1PXNwYXJjIDs7CisqKQkJCWdkYl90YXJnZXRfY3B1PSR0YXJnZXRfY3B1IDs7Citlc2FjCitjaGFuZ2VxdW90ZShbLF0pZG5sCisKK3RhcmdldF9tYWtlZmlsZV9mcmFnPSR7c3JjZGlyfS8uLi9jb25maWcvJHtnZGJfdGFyZ2V0X2NwdX0vZ2Ric2VydmUubXQKK2lmIFsgISAtZiAke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBdOyB0aGVuCisJQUNfTVNHX0VSUk9SKCIqKiogR0RCU0VSVkUgZG9lcyBub3Qgc3VwcG9ydCB0YXJnZXQgJHt0YXJnZXR9IikKK2ZpCisKK2RubCBXZSBoYXZlIHRvIGFzc2lnbiB0aGUgc2FtZSB2YWx1ZSB0byBvdGhlciB2YXJpYWJsZXMgYmVjYXVzZSBhdXRvY29uZgorZG5sIGRvZXNuJ3QgcHJvdmlkZSBhIG1lY2hhbmlzbSB0byBzdWJzdGl0dXRlIGEgcmVwbGFjZW1lbnQga2V5d29yZCB3aXRoCitkbmwgYXJiaXRyYXJ5IGRhdGEgb3IgcGF0aG5hbWVzLgorZG5sCit0YXJnZXRfbWFrZWZpbGVfZnJhZ19wYXRoPSR0YXJnZXRfbWFrZWZpbGVfZnJhZworQUNfU1VCU1QodGFyZ2V0X21ha2VmaWxlX2ZyYWdfcGF0aCkKK0FDX1NVQlNUX0ZJTEUodGFyZ2V0X21ha2VmaWxlX2ZyYWcpCisKK2NwdWZpbGU9YHNlZCAtbiAnCitzL0NQVV9GSUxFWyAJXSo9WyAJXSpcKFteIAldKlwpL1wxL3AKKycgJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30KKworZmlsZXM9CitsaW5rcz0KK3JtIC1mIGNwdS5oCitpZiBbICIke2NwdWZpbGV9IiAhPSAiIiBdOyB0aGVuCisJZmlsZXM9IiR7ZmlsZXN9ICR7Y3B1ZmlsZX0uaCIKKwlsaW5rcz0iJHtsaW5rc30gY3B1LmgiCitmaQorCitBQ19MSU5LX0ZJTEVTKCRmaWxlcywgJGxpbmtzKQorQUNfT1VUUFVUKE1ha2VmaWxlKQorCmRpZmYgLS1naXQgYS9nZGIvbmxtL2dkYnNlcnZlLmMgYi9nZGIvbmxtL2dkYnNlcnZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJhZGYzYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9ubG0vZ2Ric2VydmUuYwpAQCAtMCwwICsxLDEwNTYgQEAKKy8qIGdkYnNlcnZlLmMgLS0gTkxNIGRlYnVnZ2luZyBzdHViIGZvciBOb3ZlbGwgTmV0V2FyZS4KKworICAgVGhpcyBpcyBvcmlnaW5hbGx5IGJhc2VkIG9uIGFuIG02OGsgc29mdHdhcmUgc3R1YiB3cml0dGVuIGJ5IEdsZW5uCisgICBFbmdlbCBhdCBIUCwgYnV0IGhhcyBjaGFuZ2VkIHF1aXRlIGEgYml0LiAgSXQgd2FzIG1vZGlmaWVkIGZvciB0aGUKKyAgIGkzODYgYnkgSmltIEtpbmdkb24sIEN5Z251cyBTdXBwb3J0LiAgSXQgd2FzIG1vZGlmaWVkIHRvIHJ1biB1bmRlcgorICAgTmV0V2FyZSBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KKworICAgVGhpcyBjb2RlIGlzIGludGVuZGVkIHRvIHByb2R1Y2UgYW4gTkxNIChhIE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKQorICAgdG8gcnVuIHVuZGVyIE5vdmVsbCBOZXRXYXJlLiAgVG8gY3JlYXRlIHRoZSBOTE0sIGNvbXBpbGUgdGhpcyBjb2RlCisgICBpbnRvIGFuIG9iamVjdCBmaWxlIHVzaW5nIHRoZSBOTE0gU0RLIG9uIGFueSBpMzg2IGhvc3QsIGFuZCB1c2UgdGhlCisgICBubG1jb252IHByb2dyYW0gKGF2YWlsYWJsZSBpbiB0aGUgR05VIGJpbnV0aWxzKSB0byB0cmFuc2Zvcm0gdGhlCisgICByZXN1bHRpbmcgb2JqZWN0IGZpbGUgaW50byBhbiBOTE0uICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJCVRISVMgU09GVFdBUkUgSVMgTk9UIENPUFlSSUdIVEVECisKKyAgIEhQIG9mZmVycyB0aGUgZm9sbG93aW5nIGZvciB1c2UgaW4gdGhlIHB1YmxpYyBkb21haW4uICBIUCBtYWtlcyBubworICAgd2FycmFudHkgd2l0aCByZWdhcmQgdG8gdGhlIHNvZnR3YXJlIG9yIGl0J3MgcGVyZm9ybWFuY2UgYW5kIHRoZQorICAgdXNlciBhY2NlcHRzIHRoZSBzb2Z0d2FyZSAiQVMgSVMiIHdpdGggYWxsIGZhdWx0cy4KKworICAgSFAgRElTQ0xBSU1TIEFOWSBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIFdJVEggUkVHQVJECisgICBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAgIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgVGhlIGZvbGxvd2luZyBnZGIgY29tbWFuZHMgYXJlIHN1cHBvcnRlZDoKKyAqCisgKiBjb21tYW5kICAgICAgICAgIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybiB2YWx1ZQorICoKKyAqICAgIGcgICAgICAgICAgICAgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgQ1BVIHJlZ2lzdGVycyAgaGV4IGRhdGEgb3IgRU5OCisgKiAgICBHICAgICAgICAgICAgIHNldCB0aGUgdmFsdWUgb2YgdGhlIENQVSByZWdpc3RlcnMgICAgIE9LIG9yIEVOTgorICoKKyAqICAgIG1BQS4uQUEsTExMTCAgUmVhZCBMTExMIGJ5dGVzIGF0IGFkZHJlc3MgQUEuLkFBICAgICAgaGV4IGRhdGEgb3IgRU5OCisgKiAgICBNQUEuLkFBLExMTEw6IFdyaXRlIExMTEwgYnl0ZXMgYXQgYWRkcmVzcyBBQS5BQSAgICAgIE9LIG9yIEVOTgorICoKKyAqICAgIGMgICAgICAgICAgICAgUmVzdW1lIGF0IGN1cnJlbnQgYWRkcmVzcyAgICAgICAgICAgICAgU05OICAgKCBzaWduYWwgTk4pCisgKiAgICBjQUEuLkFBICAgICAgIENvbnRpbnVlIGF0IGFkZHJlc3MgQUEuLkFBICAgICAgICAgICAgIFNOTgorICoKKyAqICAgIHMgICAgICAgICAgICAgU3RlcCBvbmUgaW5zdHJ1Y3Rpb24gICAgICAgICAgICAgICAgICAgU05OCisgKiAgICBzQUEuLkFBICAgICAgIFN0ZXAgb25lIGluc3RydWN0aW9uIGZyb20gQUEuLkFBICAgICAgIFNOTgorICoKKyAqICAgIGsgICAgICAgICAgICAga2lsbAorICoKKyAqICAgID8gICAgICAgICAgICAgV2hhdCB3YXMgdGhlIGxhc3Qgc2lndmFsID8gICAgICAgICAgICAgU05OICAgKHNpZ25hbCBOTikKKyAqCisgKiBBbGwgY29tbWFuZHMgYW5kIHJlc3BvbnNlcyBhcmUgc2VudCB3aXRoIGEgcGFja2V0IHdoaWNoIGluY2x1ZGVzIGEKKyAqIGNoZWNrc3VtLiAgQSBwYWNrZXQgY29uc2lzdHMgb2YKKyAqCisgKiAkPHBhY2tldCBpbmZvPiM8Y2hlY2tzdW0+LgorICoKKyAqIHdoZXJlCisgKiA8cGFja2V0IGluZm8+IDo6IDxjaGFyYWN0ZXJzIHJlcHJlc2VudGluZyB0aGUgY29tbWFuZCBvciByZXNwb25zZT4KKyAqIDxjaGVja3N1bT4gICAgOjogPCB0d28gaGV4IGRpZ2l0cyBjb21wdXRlZCBhcyBtb2R1bG8gMjU2IHN1bSBvZiA8cGFja2V0aW5mbz4+CisgKgorICogV2hlbiBhIHBhY2tldCBpcyByZWNlaXZlZCwgaXQgaXMgZmlyc3QgYWNrbm93bGVkZ2VkIHdpdGggZWl0aGVyICcrJyBvciAnLScuCisgKiAnKycgaW5kaWNhdGVzIGEgc3VjY2Vzc2Z1bCB0cmFuc2Zlci4gICctJyBpbmRpY2F0ZXMgYSBmYWlsZWQgdHJhbnNmZXIuCisgKgorICogRXhhbXBsZToKKyAqCisgKiBIb3N0OiAgICAgICAgICAgICAgICAgIFJlcGx5OgorICogJG0wLDEwIzJhICAgICAgICAgICAgICAgKyQwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNSM0MgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZkZWYgX19pMzg2X18KKyNpbmNsdWRlIDxkZnMuaD4KKyNpbmNsdWRlIDxjb25pby5oPgorI2luY2x1ZGUgPGFkdmFuY2VkLmg+CisjaW5jbHVkZSA8ZGVidWdhcGkuaD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjZWxzZQorI2luY2x1ZGUgPG53dHlwZXMuaD4KKyNpbmNsdWRlIDxud2Rmcy5oPgorI2luY2x1ZGUgPG53Y29uaW8uaD4KKyNpbmNsdWRlIDxud2Fkdi5oPgorI2luY2x1ZGUgPG53ZGJnYXBpLmg+CisjaW5jbHVkZSA8bnd0aHJlYWQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YWlvLmg+CisjaW5jbHVkZSAiY3B1LmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGlzIGluZm9ybWF0aW9uIGlzIGZyb20gTm92ZWxsLiAgSXQgaXMgbm90IGluIGFueSBvZiB0aGUgc3RhbmRhcmQKKyAgIE5ldFdhcmUgaGVhZGVyIGZpbGVzLiAgKi8KKworc3RydWN0IERCR19Mb2FkRGVmaW5pdGlvblN0cnVjdHVyZQoreworCXZvaWQgKnJlc2VydmVkMVs0XTsKKwlMT05HIHJlc2VydmVkNTsKKwlMT05HIExEQ29kZUltYWdlT2Zmc2V0OworCUxPTkcgTERDb2RlSW1hZ2VMZW5ndGg7CisJTE9ORyBMRERhdGFJbWFnZU9mZnNldDsKKwlMT05HIExERGF0YUltYWdlTGVuZ3RoOworCUxPTkcgTERVbmluaXRpYWxpemVkRGF0YUxlbmd0aDsKKwlMT05HIExEQ3VzdG9tRGF0YU9mZnNldDsKKwlMT05HIExEQ3VzdG9tRGF0YVNpemU7CisJTE9ORyByZXNlcnZlZDZbMl07CisJTE9ORyAoKkxESW5pdGlhbGl6YXRpb25Qcm9jZWR1cmUpKHZvaWQpOworfTsKKworI2RlZmluZSBMT19OT1JNQUwJCTB4MDAwMAorI2RlZmluZSBMT19TVEFSVFVQCQkweDAwMDEKKyNkZWZpbmUgTE9fUFJPVEVDVAkJMHgwMDAyCisjZGVmaW5lIExPX0RFQlVHCQkweDAwMDQKKyNkZWZpbmUgTE9fQVVUT19MT0FEICAJCTB4MDAwOAorCisvKiBMb2FkZXIgcmV0dXJuZWQgZXJyb3IgY29kZXMgKi8KKyNkZWZpbmUgTE9BRF9DT1VMRF9OT1RfRklORF9GSUxFCQkxCisjZGVmaW5lIExPQURfRVJST1JfUkVBRElOR19GSUxFCQkJMgorI2RlZmluZSBMT0FEX05PVF9OTE1fRklMRV9GT1JNQVQJCTMKKyNkZWZpbmUgTE9BRF9XUk9OR19OTE1fRklMRV9WRVJTSU9OCQk0CisjZGVmaW5lIExPQURfUkVFTlRSQU5UX0lOSVRJQUxJWkVfRkFJTFVSRQk1CisjZGVmaW5lIExPQURfQ0FOX05PVF9MT0FEX01VTFRJUExFX0NPUElFUwk2CisjZGVmaW5lIExPQURfQUxSRUFEWV9JTl9QUk9HUkVTUwkJNworI2RlZmluZSBMT0FEX05PVF9FTk9VR0hfTUVNT1JZCQkJOAorI2RlZmluZSBMT0FEX0lOSVRJQUxJWkVfRkFJTFVSRQkJCTkKKyNkZWZpbmUgTE9BRF9JTkNPTlNJU1RFTlRfRklMRV9GT1JNQVQJCTEwCisjZGVmaW5lIExPQURfQ0FOX05PVF9MT0FEX0FUX1NUQVJUVVAJCTExCisjZGVmaW5lIExPQURfQVVUT19MT0FEX01PRFVMRVNfTk9UX0xPQURFRAkxMgorI2RlZmluZSBMT0FEX1VOUkVTT0xWRURfRVhURVJOQUwJCTEzCisjZGVmaW5lIExPQURfUFVCTElDX0FMUkVBRFlfREVGSU5FRAkJMTQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgbWFpbiB0aHJlYWQgSUQuICAqLworc3RhdGljIGludCBtYWludGhyZWFkOworCisvKiBBbiBlcnJvciBtZXNzYWdlIGZvciB0aGUgbWFpbiB0aHJlYWQgdG8gcHJpbnQuICAqLworc3RhdGljIGNoYXIgKmVycm9yX21lc3NhZ2U7CisKKy8qIFRoZSBBSU8gcG9ydCBoYW5kbGUuICAqLworc3RhdGljIGludCBBSU9oYW5kbGU7CisKKy8qIEJVRk1BWCBkZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGluYm91bmQvb3V0Ym91bmQKKyAgIGJ1ZmZlcnMuICBBdCBsZWFzdCBOVU1SRUdCWVRFUyoyIGFyZSBuZWVkZWQgZm9yIHJlZ2lzdGVyIHBhY2tldHMgKi8KKyNkZWZpbmUgQlVGTUFYIChSRUdJU1RFUl9CWVRFUyAqIDIgKyAxNikKKworLyogcmVtb3RlX2RlYnVnID4gMCBwcmludHMgaWxsLWZvcm1lZCBjb21tYW5kcyBpbiB2YWxpZCBwYWNrZXRzIGFuZAorICAgY2hlY2tzdW0gZXJyb3JzLiAqLworc3RhdGljIGludCByZW1vdGVfZGVidWcgPSAxOworCitzdGF0aWMgY29uc3QgY2hhciBoZXhjaGFyc1tdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCit1bnNpZ25lZCBjaGFyIGJyZWFrcG9pbnRfaW5zbltdID0gQlJFQUtQT0lOVDsKKworY2hhciAqbWVtMmhleCAodm9pZCAqbWVtLCBjaGFyICpidWYsIGludCBjb3VudCwgaW50IG1heV9mYXVsdCk7CitjaGFyICpoZXgybWVtIChjaGFyICpidWYsIHZvaWQgKm1lbSwgaW50IGNvdW50LCBpbnQgbWF5X2ZhdWx0KTsKK2V4dGVybiB2b2lkIHNldF9zdGVwX3RyYXBzIChzdHJ1Y3QgU3RhY2tGcmFtZSAqKTsKK2V4dGVybiB2b2lkIGNsZWFyX3N0ZXBfdHJhcHMgKHN0cnVjdCBTdGFja0ZyYW1lICopOworCitzdGF0aWMgaW50IF9fbWFpbigpIHt9OworCisvKiBSZWFkIGEgY2hhcmFjdGVyIGZyb20gdGhlIHNlcmlhbCBwb3J0LiAgVGhpcyBtdXN0IGJ1c3kgd2FpdCwgYnV0CisgICB0aGF0J3MgT0sgYmVjYXVzZSB3ZSB3aWxsIGJlIHRoZSBvbmx5IHRocmVhZCBydW5uaW5nIGFueWhvdy4gICovCisKK3N0YXRpYyBpbnQKK2dldERlYnVnQ2hhciAoKQoreworICBpbnQgZXJyOworICBMT05HIGdvdDsKKyAgdW5zaWduZWQgY2hhciByZXQ7CisKKyAgZG8KKyAgICB7CisgICAgICBlcnIgPSBBSU9SZWFkRGF0YSAoQUlPaGFuZGxlLCAoY2hhciAqKSAmcmV0LCAxLCAmZ290KTsKKyAgICAgIGlmIChlcnIgIT0gMCkKKwl7CisJICBlcnJvcl9tZXNzYWdlID0gIkFJT1JlYWREYXRhIGZhaWxlZCI7CisJICBSZXN1bWVUaHJlYWQgKG1haW50aHJlYWQpOworCSAgcmV0dXJuIC0xOworCX0KKyAgICB9CisgIHdoaWxlIChnb3QgPT0gMCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogV3JpdGUgYSBjaGFyYWN0ZXIgdG8gdGhlIHNlcmlhbCBwb3J0LiAgUmV0dXJucyAwIG9uIGZhaWx1cmUsCisgICBub24temVybyBvbiBzdWNjZXNzLiAgKi8KKworc3RhdGljIGludAorcHV0RGVidWdDaGFyIChjKQorICAgICB1bnNpZ25lZCBjaGFyIGM7Cit7CisgIGludCBlcnI7CisgIExPTkcgcHV0OworCisgIHB1dCA9IDA7CisgIHdoaWxlIChwdXQgPCAxKQorICAgIHsKKyAgICAgIGVyciA9IEFJT1dyaXRlRGF0YSAoQUlPaGFuZGxlLCAoY2hhciAqKSAmYywgMSwgJnB1dCk7CisgICAgICBpZiAoZXJyICE9IDApCisJQ29uc29sZVByaW50ZiAoIkFJT1dyaXRlRGF0YTogZXJyID0gJWQsIHB1dCA9ICVkXHJcbiIsIGVyciwgcHV0KTsKKyAgICB9CisgIHJldHVybiAxOworfQorCisvKiBUdXJuIGEgaGV4IGNoYXJhY3RlciBpbnRvIGEgbnVtYmVyLiAgKi8KKworc3RhdGljIGludAoraGV4IChjaCkKKyAgICAgY2hhciBjaDsKK3sKKyAgaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKQorICAgIHJldHVybiAoY2gtJ2EnKzEwKTsKKyAgaWYgKChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpKQorICAgIHJldHVybiAoY2gtJzAnKTsKKyAgaWYgKChjaCA+PSAnQScpICYmIChjaCA8PSAnRicpKQorICAgIHJldHVybiAoY2gtJ0EnKzEwKTsKKyAgcmV0dXJuICgtMSk7Cit9CisKKy8qIFNjYW4gZm9yIHRoZSBzZXF1ZW5jZSAkPGRhdGE+IzxjaGVja3N1bT4uICBSZXR1cm5zIDAgb24gZmFpbHVyZSwKKyAgIG5vbi16ZXJvIG9uIHN1Y2Nlc3MuICAqLworCitzdGF0aWMgaW50CitnZXRwYWNrZXQgKGJ1ZmZlcikKKyAgICAgY2hhciAqIGJ1ZmZlcjsKK3sKKyAgdW5zaWduZWQgY2hhciBjaGVja3N1bTsKKyAgdW5zaWduZWQgY2hhciB4bWl0Y3N1bTsKKyAgaW50IGk7CisgIGludCBjb3VudDsKKyAgaW50IGNoOworCisgIGRvCisgICAgeworICAgICAgLyogd2FpdCBhcm91bmQgZm9yIHRoZSBzdGFydCBjaGFyYWN0ZXIsIGlnbm9yZSBhbGwgb3RoZXIgY2hhcmFjdGVycyAqLworICAgICAgd2hpbGUgKChjaCA9IGdldERlYnVnQ2hhcigpKSAhPSAnJCcpCisJaWYgKGNoID09IC0xKQorCSAgcmV0dXJuIDA7CisgICAgICBjaGVja3N1bSA9IDA7CisgICAgICB4bWl0Y3N1bSA9IC0xOworCisgICAgICBjb3VudCA9IDA7CisKKyAgICAgIC8qIG5vdywgcmVhZCB1bnRpbCBhICMgb3IgZW5kIG9mIGJ1ZmZlciBpcyBmb3VuZCAqLworICAgICAgd2hpbGUgKGNvdW50IDwgQlVGTUFYKQorCXsKKwkgIGNoID0gZ2V0RGVidWdDaGFyKCk7CisJICBpZiAoY2ggPT0gLTEpCisJICAgIHJldHVybiAwOworCSAgaWYgKGNoID09ICcjJykKKwkgICAgYnJlYWs7CisJICBjaGVja3N1bSA9IGNoZWNrc3VtICsgY2g7CisJICBidWZmZXJbY291bnRdID0gY2g7CisJICBjb3VudCA9IGNvdW50ICsgMTsKKwl9CisgICAgICBidWZmZXJbY291bnRdID0gMDsKKworICAgICAgaWYgKGNoID09ICcjJykKKwl7CisJICBjaCA9IGdldERlYnVnQ2hhciAoKTsKKwkgIGlmIChjaCA9PSAtMSkKKwkgICAgcmV0dXJuIDA7CisJICB4bWl0Y3N1bSA9IGhleChjaCkgPDwgNDsKKwkgIGNoID0gZ2V0RGVidWdDaGFyICgpOworCSAgaWYgKGNoID09IC0xKQorCSAgICByZXR1cm4gMDsKKwkgIHhtaXRjc3VtICs9IGhleChjaCk7CisKKwkgIGlmIChjaGVja3N1bSAhPSB4bWl0Y3N1bSkKKwkgICAgeworCSAgICAgIGlmIChyZW1vdGVfZGVidWcpCisJCUNvbnNvbGVQcmludGYgKCJiYWQgY2hlY2tzdW0uICBNeSBjb3VudCA9IDB4JXgsIHNlbnQ9MHgleC4gYnVmPSVzXG4iLAorCQkJICAgICAgIGNoZWNrc3VtLHhtaXRjc3VtLGJ1ZmZlcik7CisJICAgICAgLyogZmFpbGVkIGNoZWNrc3VtICovCisJICAgICAgaWYgKCEgcHV0RGVidWdDaGFyKCctJykpCisJCXJldHVybiAwOworCSAgICAgIHJldHVybiAxOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBzdWNjZXNzZnVsIHRyYW5zZmVyICovCisJICAgICAgaWYgKCEgcHV0RGVidWdDaGFyKCcrJykpCisJCXJldHVybiAwOworCSAgICAgIC8qIGlmIGEgc2VxdWVuY2UgY2hhciBpcyBwcmVzZW50LCByZXBseSB0aGUgc2VxdWVuY2UgSUQgKi8KKwkgICAgICBpZiAoYnVmZmVyWzJdID09ICc6JykKKwkJeworCQkgIGlmICghIHB1dERlYnVnQ2hhciAoYnVmZmVyWzBdKQorCQkgICAgICB8fCAhIHB1dERlYnVnQ2hhciAoYnVmZmVyWzFdKSkKKwkJICAgIHJldHVybiAwOworCQkgIC8qIHJlbW92ZSBzZXF1ZW5jZSBjaGFycyBmcm9tIGJ1ZmZlciAqLworCQkgIGNvdW50ID0gc3RybGVuKGJ1ZmZlcik7CisJCSAgZm9yIChpPTM7IGkgPD0gY291bnQ7IGkrKykKKwkJICAgIGJ1ZmZlcltpLTNdID0gYnVmZmVyW2ldOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICB3aGlsZSAoY2hlY2tzdW0gIT0geG1pdGNzdW0pOworCisgIGlmIChyZW1vdGVfZGVidWcpCisgICAgQ29uc29sZVByaW50ZiAoIlJlY2VpdmVkIHBhY2tldCBcIiVzXCJcclxuIiwgYnVmZmVyKTsKKworICByZXR1cm4gMTsKK30KKworLyogU2VuZCB0aGUgcGFja2V0IGluIGJ1ZmZlci4gIFJldHVybnMgMCBvbiBmYWlsdXJlLCBub24temVybyBvbgorICAgc3VjY2Vzcy4gICovCisKK3N0YXRpYyBpbnQKK3B1dHBhY2tldCAoYnVmZmVyKQorICAgICBjaGFyICogYnVmZmVyOworeworICB1bnNpZ25lZCBjaGFyIGNoZWNrc3VtOworICBpbnQgY291bnQ7CisgIGludCBjaDsKKworICBpZiAocmVtb3RlX2RlYnVnKQorICAgIENvbnNvbGVQcmludGYgKCJTZW5kaW5nIHBhY2tldCBcIiVzXCJcclxuIiwgYnVmZmVyKTsKKworICAvKiAgJDxwYWNrZXQgaW5mbz4jPGNoZWNrc3VtPi4gKi8KKyAgZG8KKyAgICB7CisgICAgICBpZiAoISBwdXREZWJ1Z0NoYXIoJyQnKSkKKwlyZXR1cm4gMDsKKyAgICAgIGNoZWNrc3VtID0gMDsKKyAgICAgIGNvdW50ID0gMDsKKworICAgICAgd2hpbGUgKGNoPWJ1ZmZlcltjb3VudF0pCisJeworCSAgaWYgKCEgcHV0RGVidWdDaGFyKGNoKSkKKwkgICAgcmV0dXJuIDA7CisJICBjaGVja3N1bSArPSBjaDsKKwkgIGNvdW50ICs9IDE7CisJfQorCisgICAgICBpZiAoISBwdXREZWJ1Z0NoYXIoJyMnKQorCSAgfHwgISBwdXREZWJ1Z0NoYXIoaGV4Y2hhcnNbY2hlY2tzdW0gPj4gNF0pCisJICB8fCAhIHB1dERlYnVnQ2hhcihoZXhjaGFyc1tjaGVja3N1bSAlIDE2XSkpCisJcmV0dXJuIDA7CisKKyAgICAgIGNoID0gZ2V0RGVidWdDaGFyICgpOworICAgICAgaWYgKGNoID09IC0xKQorCXJldHVybiAwOworICAgIH0KKyAgd2hpbGUgKGNoICE9ICcrJyk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjaGFyIHJlbWNvbUluQnVmZmVyW0JVRk1BWF07CitzdGF0aWMgY2hhciByZW1jb21PdXRCdWZmZXJbQlVGTUFYXTsKK3N0YXRpYyBzaG9ydCBlcnJvcjsKKworc3RhdGljIHZvaWQKK2RlYnVnX2Vycm9yIChmb3JtYXQsIHBhcm0pCisgICAgIGNoYXIgKmZvcm1hdDsKKyAgICAgY2hhciAqcGFybTsKK3sKKyAgaWYgKHJlbW90ZV9kZWJ1ZykKKyAgICB7CisgICAgICBDb25zb2xlUHJpbnRmIChmb3JtYXQsIHBhcm0pOworICAgICAgQ29uc29sZVByaW50ZiAoIlxuIik7CisgICAgfQorfQorCisvKiBUaGlzIGlzIHNldCBpZiB3ZSBjb3VsZCBnZXQgYSBtZW1vcnkgYWNjZXNzIGZhdWx0LiAgKi8KK3N0YXRpYyBpbnQgbWVtX21heV9mYXVsdDsKKworLyogSW5kaWNhdGUgdG8gY2FsbGVyIG9mIG1lbTJoZXggb3IgaGV4Mm1lbSB0aGF0IHRoZXJlIGhhcyBiZWVuIGFuCisgICBlcnJvci4gICovCit2b2xhdGlsZSBpbnQgbWVtX2VyciA9IDA7CisKKyNpZm5kZWYgQUxURVJOQVRFX01FTV9GVU5DUworLyogVGhlc2UgYXJlIHNlcGFyYXRlIGZ1bmN0aW9ucyBzbyB0aGF0IHRoZXkgYXJlIHNvIHNob3J0IGFuZCBzd2VldAorICAgdGhhdCB0aGUgY29tcGlsZXIgd29uJ3Qgc2F2ZSBhbnkgcmVnaXN0ZXJzIChpZiB0aGVyZSBpcyBhIGZhdWx0CisgICB0byBtZW1fZmF1bHQsIHRoZXkgd29uJ3QgZ2V0IHJlc3RvcmVkLCBzbyB0aGVyZSBiZXR0ZXIgbm90IGJlIGFueQorICAgc2F2ZWQpLiAgKi8KKworaW50CitnZXRfY2hhciAoYWRkcikKKyAgICAgY2hhciAqYWRkcjsKK3sKKyAgcmV0dXJuICphZGRyOworfQorCit2b2lkCitzZXRfY2hhciAoYWRkciwgdmFsKQorICAgICBjaGFyICphZGRyOworICAgICBpbnQgdmFsOworeworICAqYWRkciA9IHZhbDsKK30KKyNlbmRpZiAvKiBBTFRFUk5BVEVfTUVNX0ZVTkNTICovCisKKy8qIGNvbnZlcnQgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IG1lbSBpbnRvIGhleCwgcGxhY2luZyByZXN1bHQgaW4gYnVmICovCisvKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBsYXN0IGNoYXIgcHV0IGluIGJ1ZiAobnVsbCkgKi8KKy8qIElmIE1BWV9GQVVMVCBpcyBub24temVybywgdGhlbiB3ZSBzaG91bGQgc2V0IG1lbV9lcnIgaW4gcmVzcG9uc2UgdG8KKyAgIGEgZmF1bHQ7IGlmIHplcm8gdHJlYXQgYSBmYXVsdCBsaWtlIGFueSBvdGhlciBmYXVsdCBpbiB0aGUgc3R1Yi4gICovCisKK2NoYXIgKgorbWVtMmhleCAobWVtLCBidWYsIGNvdW50LCBtYXlfZmF1bHQpCisgICAgIHZvaWQgKm1lbTsKKyAgICAgY2hhciAqYnVmOworICAgICBpbnQgY291bnQ7CisgICAgIGludCBtYXlfZmF1bHQ7Cit7CisgIGludCBpOworICB1bnNpZ25lZCBjaGFyIGNoOworICBjaGFyICpwdHIgPSBtZW07CisKKyAgbWVtX21heV9mYXVsdCA9IG1heV9mYXVsdDsKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgY2ggPSBnZXRfY2hhciAocHRyKyspOworICAgICAgaWYgKG1heV9mYXVsdCAmJiBtZW1fZXJyKQorCXJldHVybiAoYnVmKTsKKyAgICAgICpidWYrKyA9IGhleGNoYXJzW2NoID4+IDRdOworICAgICAgKmJ1ZisrID0gaGV4Y2hhcnNbY2ggJSAxNl07CisgICAgfQorICAqYnVmID0gMDsKKyAgbWVtX21heV9mYXVsdCA9IDA7CisgIHJldHVybihidWYpOworfQorCisvKiBjb252ZXJ0IHRoZSBoZXggYXJyYXkgcG9pbnRlZCB0byBieSBidWYgaW50byBiaW5hcnkgdG8gYmUgcGxhY2VkIGluIG1lbSAqLworLyogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIEFGVEVSIHRoZSBsYXN0IGJ5dGUgd3JpdHRlbiAqLworCitjaGFyICoKK2hleDJtZW0gKGJ1ZiwgbWVtLCBjb3VudCwgbWF5X2ZhdWx0KQorICAgICBjaGFyICpidWY7CisgICAgIHZvaWQgKm1lbTsKKyAgICAgaW50IGNvdW50OworICAgICBpbnQgbWF5X2ZhdWx0OworeworICBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciBjaDsKKyAgY2hhciAqcHRyID0gbWVtOworCisgIG1lbV9tYXlfZmF1bHQgPSBtYXlfZmF1bHQ7CisgIGZvciAoaT0wO2k8Y291bnQ7aSsrKQorICAgIHsKKyAgICAgIGNoID0gaGV4KCpidWYrKykgPDwgNDsKKyAgICAgIGNoID0gY2ggKyBoZXgoKmJ1ZisrKTsKKyAgICAgIHNldF9jaGFyIChwdHIrKywgY2gpOworICAgICAgaWYgKG1heV9mYXVsdCAmJiBtZW1fZXJyKQorCXJldHVybiAocHRyKTsKKyAgICB9CisgIG1lbV9tYXlfZmF1bHQgPSAwOworICByZXR1cm4obWVtKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgMzg2IGV4Y2VwdGlvbiB2ZWN0b3IgYW5kIGF0dGVtcHRzIHRvCisgICB0cmFuc2xhdGUgdGhpcyBudW1iZXIgaW50byBhIHVuaXggY29tcGF0aWJsZSBzaWduYWwgdmFsdWUuICAqLworCitpbnQKK2NvbXB1dGVTaWduYWwgKGV4Y2VwdGlvblZlY3RvcikKKyAgICAgaW50IGV4Y2VwdGlvblZlY3RvcjsKK3sKKyAgaW50IHNpZ3ZhbDsKKyAgc3dpdGNoIChleGNlcHRpb25WZWN0b3IpCisgICAgeworICAgIGNhc2UgMCA6IHNpZ3ZhbCA9IDg7IGJyZWFrOyAvKiBkaXZpZGUgYnkgemVybyAqLworICAgIGNhc2UgMSA6IHNpZ3ZhbCA9IDU7IGJyZWFrOyAvKiBkZWJ1ZyBleGNlcHRpb24gKi8KKyAgICBjYXNlIDMgOiBzaWd2YWwgPSA1OyBicmVhazsgLyogYnJlYWtwb2ludCAqLworICAgIGNhc2UgNCA6IHNpZ3ZhbCA9IDE2OyBicmVhazsgLyogaW50byBpbnN0cnVjdGlvbiAob3ZlcmZsb3cpICovCisgICAgY2FzZSA1IDogc2lndmFsID0gMTY7IGJyZWFrOyAvKiBib3VuZCBpbnN0cnVjdGlvbiAqLworICAgIGNhc2UgNiA6IHNpZ3ZhbCA9IDQ7IGJyZWFrOyAvKiBJbnZhbGlkIG9wY29kZSAqLworICAgIGNhc2UgNyA6IHNpZ3ZhbCA9IDg7IGJyZWFrOyAvKiBjb3Byb2Nlc3NvciBub3QgYXZhaWxhYmxlICovCisgICAgY2FzZSA4IDogc2lndmFsID0gNzsgYnJlYWs7IC8qIGRvdWJsZSBmYXVsdCAqLworICAgIGNhc2UgOSA6IHNpZ3ZhbCA9IDExOyBicmVhazsgLyogY29wcm9jZXNzb3Igc2VnbWVudCBvdmVycnVuICovCisgICAgY2FzZSAxMCA6IHNpZ3ZhbCA9IDExOyBicmVhazsgLyogSW52YWxpZCBUU1MgKi8KKyAgICBjYXNlIDExIDogc2lndmFsID0gMTE7IGJyZWFrOyAvKiBTZWdtZW50IG5vdCBwcmVzZW50ICovCisgICAgY2FzZSAxMiA6IHNpZ3ZhbCA9IDExOyBicmVhazsgLyogc3RhY2sgZXhjZXB0aW9uICovCisgICAgY2FzZSAxMyA6IHNpZ3ZhbCA9IDExOyBicmVhazsgLyogZ2VuZXJhbCBwcm90ZWN0aW9uICovCisgICAgY2FzZSAxNCA6IHNpZ3ZhbCA9IDExOyBicmVhazsgLyogcGFnZSBmYXVsdCAqLworICAgIGNhc2UgMTYgOiBzaWd2YWwgPSA3OyBicmVhazsgLyogY29wcm9jZXNzb3IgZXJyb3IgKi8KKyAgICBkZWZhdWx0OgorICAgICAgc2lndmFsID0gNzsJCS8qICJzb2Z0d2FyZSBnZW5lcmF0ZWQiKi8KKyAgICB9CisgIHJldHVybiAoc2lndmFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBXSElMRSBXRSBGSU5EIE5JQ0UgSEVYIENIQVJTLCBCVUlMRCBBTiBJTlQgKi8KKy8qIFJFVFVSTiBOVU1CRVIgT0YgQ0hBUlMgUFJPQ0VTU0VEICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CitoZXhUb0ludChwdHIsIGludFZhbHVlKQorICAgICBjaGFyICoqcHRyOworICAgICBpbnQgKmludFZhbHVlOworeworICBpbnQgbnVtQ2hhcnMgPSAwOworICBpbnQgaGV4VmFsdWU7CisKKyAgKmludFZhbHVlID0gMDsKKworICB3aGlsZSAoKipwdHIpCisgICAgeworICAgICAgaGV4VmFsdWUgPSBoZXgoKipwdHIpOworICAgICAgaWYgKGhleFZhbHVlID49MCkKKwl7CisJICAqaW50VmFsdWUgPSAoKmludFZhbHVlIDw8NCkgfCBoZXhWYWx1ZTsKKwkgIG51bUNoYXJzICsrOworCX0KKyAgICAgIGVsc2UKKwlicmVhazsKKworICAgICAgKCpwdHIpKys7CisgICAgfQorCisgIHJldHVybiAobnVtQ2hhcnMpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGRvZXMgYWxsIGNvbW1hbmQgcHJvY2Vzc2luZyBmb3IgaW50ZXJmYWNpbmcgdG8gZ2RiLgorICAgSXQgaXMgY2FsbGVkIHdoZW5ldmVyIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlIG1vZHVsZSBiZWluZworICAgZGVidWdnZWQuICAqLworCitzdGF0aWMgTE9ORworaGFuZGxlX2V4Y2VwdGlvbiAoZnJhbWUpCisgICAgIHN0cnVjdCBTdGFja0ZyYW1lICpmcmFtZTsKK3sKKyAgaW50IGFkZHIsIGxlbmd0aDsKKyAgY2hhciAqcHRyOworICBzdGF0aWMgc3RydWN0IERCR19Mb2FkRGVmaW5pdGlvblN0cnVjdHVyZSAqbGRpbmZvID0gMDsKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgZmlyc3RfaW5zbltCUkVBS1BPSU5UX1NJWkVdOyAvKiBUaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlIHByb2dyYW0uICAqLworCisjaWYgMAorICAvKiBBY2NvcmRpbmcgdG8gc29tZSBkb2N1bWVudGF0aW9uIGZyb20gTm92ZWxsLCB0aGUgYmVsbCBzb21ldGltZXMKKyAgICAgbWF5IGJlIHJpbmdpbmcgYXQgdGhpcyBwb2ludC4gIFRoaXMgY2FuIGJlIHN0b3BwZWQgb24gTmV0d2FyZSA0CisgICAgIHN5c3RlbXMgYnkgY2FsbGluZyB0aGUgdW5kb2N1bWVudGVkIFN0b3BCZWxsKCkgZnVuY3Rpb24uICovCisKKyAgU3RvcEJlbGwgKCk7CisjZW5kaWYKKworICBpZiAocmVtb3RlX2RlYnVnKQorICAgIHsKKyAgICAgIENvbnNvbGVQcmludGYgKCJ2ZWN0b3I9JWQ6ICVzLCBwYz0lMDh4LCB0aHJlYWQ9JTA4eFxyXG4iLAorCQkgICAgIGZyYW1lLT5FeGNlcHRpb25OdW1iZXIsCisJCSAgICAgZnJhbWUtPkV4Y2VwdGlvbkRlc2NyaXB0aW9uLAorCQkgICAgIGZyYW1lLT5FeGNlcHRpb25QQywKKwkJICAgICBHZXRUaHJlYWRJRCAoKSk7CisgICAgfQorCisgIHN3aXRjaCAoZnJhbWUtPkV4Y2VwdGlvbk51bWJlcikKKyAgICB7CisgICAgY2FzZSBTVEFSVF9OTE1fRVZFTlQ6CisgICAgICAvKiBJZiB0aGUgTkxNIGp1c3Qgc3RhcnRlZCwgd2UgcmVjb3JkIHRoZSBtb2R1bGUgbG9hZCBpbmZvcm1hdGlvbgorCSBhbmQgdGhlIHRocmVhZCBJRCwgYW5kIHNldCBhIGJyZWFrcG9pbnQgYXQgdGhlIGZpcnN0IGluc3RydWN0aW9uCisJIGluIHRoZSBwcm9ncmFtLiAgKi8KKworICAgICAgbGRpbmZvID0gKChzdHJ1Y3QgREJHX0xvYWREZWZpbml0aW9uU3RydWN0dXJlICopCisJCWZyYW1lLT5FeGNlcHRpb25FcnJvckNvZGUpOworICAgICAgbWVtY3B5IChmaXJzdF9pbnNuLCBsZGluZm8tPkxESW5pdGlhbGl6YXRpb25Qcm9jZWR1cmUsCisJICAgICAgQlJFQUtQT0lOVF9TSVpFKTsKKyAgICAgIG1lbWNweSAobGRpbmZvLT5MREluaXRpYWxpemF0aW9uUHJvY2VkdXJlLCBicmVha3BvaW50X2luc24sCisJICAgICAgQlJFQUtQT0lOVF9TSVpFKTsKKyAgICAgIGZsdXNoX2lfY2FjaGUgKCk7CisgICAgICByZXR1cm4gUkVUVVJOX1RPX1BST0dSQU07CisKKyAgICBjYXNlIEVOVEVSX0RFQlVHR0VSX0VWRU5UOgorICAgIGNhc2UgS0VZQk9BUkRfQlJFQUtfRVZFTlQ6CisgICAgICAvKiBQYXNzIHNvbWUgZXZlbnRzIG9uIHRvIHRoZSBuZXh0IGRlYnVnZ2VyLCBpbiBjYXNlIGl0IHdpbGwgaGFuZGxlCisJIHRoZW0uICAqLworICAgICAgcmV0dXJuIFJFVFVSTl9UT19ORVhUX0RFQlVHR0VSOworCisgICAgY2FzZSAzOgkJCS8qIEJyZWFrcG9pbnQgKi8KKyAgICAgIC8qIEFmdGVyIHdlJ3ZlIHJlYWNoZWQgdGhlIGluaXRpYWwgYnJlYWtwb2ludCwgcmVzZXQgaXQuICAqLworICAgICAgaWYgKGZyYW1lLT5FeGNlcHRpb25QQyAtIERFQ1JfUENfQUZURVJfQlJFQUsgPT0gKExPTkcpIGxkaW5mby0+TERJbml0aWFsaXphdGlvblByb2NlZHVyZQorCSAgJiYgbWVtY21wIChsZGluZm8tPkxESW5pdGlhbGl6YXRpb25Qcm9jZWR1cmUsIGJyZWFrcG9pbnRfaW5zbiwKKwkJICAgICBCUkVBS1BPSU5UX1NJWkUpID09IDApCisJeworCSAgbWVtY3B5IChsZGluZm8tPkxESW5pdGlhbGl6YXRpb25Qcm9jZWR1cmUsIGZpcnN0X2luc24sCisJCSAgQlJFQUtQT0lOVF9TSVpFKTsKKwkgIGZyYW1lLT5FeGNlcHRpb25QQyAtPSBERUNSX1BDX0FGVEVSX0JSRUFLOworCSAgZmx1c2hfaV9jYWNoZSAoKTsKKwl9CisgICAgICAvKiBOb3JtYWwgYnJlYWtwb2ludHMgZW5kIHVwIGhlcmUgKi8KKyAgICAgIGRvX3N0YXR1cyAocmVtY29tT3V0QnVmZmVyLCBmcmFtZSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBBdCB0aGUgbW9tZW50LCB3ZSBkb24ndCBjYXJlIGFib3V0IG1vc3Qgb2YgdGhlIHVudXN1YWwgTmV0V2FyZQorCSBleGNlcHRpb25zLiAgKi8KKyAgICAgIGlmIChmcmFtZS0+RXhjZXB0aW9uTnVtYmVyID4gMzEpCisJcmV0dXJuIFJFVFVSTl9UT19QUk9HUkFNOworCisgICAgICAvKiBNb3N0IG1hY2hpbmUgbGV2ZWwgZXhjZXB0aW9ucyBlbmQgdXAgaGVyZSAqLworICAgICAgZG9fc3RhdHVzIChyZW1jb21PdXRCdWZmZXIsIGZyYW1lKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAxMToJCQkvKiBTZWdtZW50IG5vdCBwcmVzZW50ICovCisgICAgY2FzZSAxMzoJCQkvKiBHZW5lcmFsIHByb3RlY3Rpb24gKi8KKyAgICBjYXNlIDE0OgkJCS8qIFBhZ2UgZmF1bHQgKi8KKyAgICAgIC8qIElmIHdlIGdldCBhIEdQIGZhdWx0LCBhbmQgbWVtX21heV9mYXVsdCBpcyBzZXQsIGFuZCB0aGUKKwkgaW5zdHJ1Y3Rpb24gcG9pbnRlciBpcyBuZWFyIHNldF9jaGFyIG9yIGdldF9jaGFyLCB0aGVuIHdlIGNhdXNlZAorCSB0aGUgZmF1bHQgb3Vyc2VsdmVzIGFjY2Vzc2luZyBhbiBpbGxlZ2FsIG1lbW9yeSBsb2NhdGlvbi4gICovCisgICAgICBpZiAobWVtX21heV9mYXVsdAorCSAgJiYgKChmcmFtZS0+RXhjZXB0aW9uUEMgPj0gKGxvbmcpICZzZXRfY2hhcgorCSAgICAgICAmJiBmcmFtZS0+RXhjZXB0aW9uUEMgPCAobG9uZykgJnNldF9jaGFyICsgNTApCisJICAgICAgfHwgKGZyYW1lLT5FeGNlcHRpb25QQyA+PSAobG9uZykgJmdldF9jaGFyCisJCSAgJiYgZnJhbWUtPkV4Y2VwdGlvblBDIDwgKGxvbmcpICZnZXRfY2hhciArIDUwKSkpCisJeworCSAgbWVtX2VyciA9IDE7CisJICAvKiBQb2ludCB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciBhdCBhbiBhc3NlbWJseSBsYW5ndWFnZSBzdHViCisJICAgICB3aGljaCBqdXN0IHJldHVybnMgZnJvbSB0aGUgZnVuY3Rpb24uICAqLworCisJICBmcmFtZS0+RXhjZXB0aW9uUEMgKz0gNDsgLyogU2tpcCB0aGUgbG9hZCBvciBzdG9yZSAqLworCisJICAvKiBLZWVwIGdvaW5nLiAgVGhpcyB3aWxsIGFjdCBhcyB0aG91Z2ggaXQgcmV0dXJuZWQgZnJvbQorCSAgICAgc2V0X2NoYXIgb3IgZ2V0X2NoYXIuICBUaGUgY2FsbGluZyByb3V0aW5lIHdpbGwgY2hlY2sKKwkgICAgIG1lbV9lcnIsIGFuZCBkbyB0aGUgcmlnaHQgdGhpbmcuICAqLworCSAgcmV0dXJuIFJFVFVSTl9UT19QUk9HUkFNOworCX0KKyAgICAgIC8qIFJhbmRvbSBtZW0gZmF1bHQsIHJlcG9ydCBpdCAqLworICAgICAgZG9fc3RhdHVzIChyZW1jb21PdXRCdWZmZXIsIGZyYW1lKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBURVJNSU5BVEVfTkxNX0VWRU5UOgorICAgICAgLyogVGhlcmUgaXMgbm8gd2F5IHRvIGdldCB0aGUgZXhpdCBzdGF0dXMuICAqLworICAgICAgc3ByaW50ZiAocmVtY29tT3V0QnVmZmVyLCAiVyUwMngiLCAwKTsKKyAgICAgIGJyZWFrOwkJCS8qIFdlIGdlbmVyYXRlIG91ciBvd24gc3RhdHVzICovCisgICAgfQorCisgIC8qIEZJWE1FOiBIb3cgZG8gd2Uga25vdyB0aGF0IHRoaXMgZXhjZXB0aW9uIGhhcyBhbnl0aGluZyB0byBkbyB3aXRoCisgICAgIHRoZSBwcm9ncmFtIHdlIGFyZSBkZWJ1Z2dpbmc/ICBXZSBjYW4gY2hlY2sgd2hldGhlciB0aGUgUEMgaXMgaW4KKyAgICAgdGhlIHJhbmdlIG9mIHRoZSBtb2R1bGUgd2UgYXJlIGRlYnVnZ2luZywgYnV0IHRoYXQgZG9lc24ndCBoZWxwCisgICAgIG11Y2ggc2luY2UgYW4gZXJyb3IgY291bGQgb2NjdXIgaW4gYSBsaWJyYXJ5IHJvdXRpbmUuICAqLworCisgIGNsZWFyX3N0ZXBfdHJhcHMgKGZyYW1lKTsKKworICBpZiAoISBwdXRwYWNrZXQocmVtY29tT3V0QnVmZmVyKSkKKyAgICByZXR1cm4gUkVUVVJOX1RPX05FWFRfREVCVUdHRVI7CisKKyAgaWYgKGZyYW1lLT5FeGNlcHRpb25OdW1iZXIgPT0gVEVSTUlOQVRFX05MTV9FVkVOVCkKKyAgICB7CisgICAgICBSZXN1bWVUaHJlYWQgKG1haW50aHJlYWQpOworICAgICAgcmV0dXJuIFJFVFVSTl9UT19QUk9HUkFNOworICAgIH0KKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBlcnJvciA9IDA7CisgICAgICByZW1jb21PdXRCdWZmZXJbMF0gPSAwOworICAgICAgaWYgKCEgZ2V0cGFja2V0IChyZW1jb21JbkJ1ZmZlcikpCisJcmV0dXJuIFJFVFVSTl9UT19ORVhUX0RFQlVHR0VSOworICAgICAgc3dpdGNoIChyZW1jb21JbkJ1ZmZlclswXSkKKwl7CisJY2FzZSAnPyc6CisJICBkb19zdGF0dXMgKHJlbWNvbU91dEJ1ZmZlciwgZnJhbWUpOworCSAgYnJlYWs7CisJY2FzZSAnZCc6CisJICByZW1vdGVfZGVidWcgPSAhKHJlbW90ZV9kZWJ1Zyk7IC8qIHRvZ2dsZSBkZWJ1ZyBmbGFnICovCisJICBicmVhazsKKwljYXNlICdnJzoKKwkgIC8qIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIENQVSByZWdpc3RlcnMgKi8KKwkgIGZyYW1lX3RvX3JlZ2lzdGVycyAoZnJhbWUsIHJlbWNvbU91dEJ1ZmZlcik7CisJICBicmVhazsKKwljYXNlICdHJzoKKwkgIC8qIHNldCB0aGUgdmFsdWUgb2YgdGhlIENQVSByZWdpc3RlcnMgLSByZXR1cm4gT0sgKi8KKwkgIHJlZ2lzdGVyc190b19mcmFtZSAoJnJlbWNvbUluQnVmZmVyWzFdLCBmcmFtZSk7CisJICBzdHJjcHkocmVtY29tT3V0QnVmZmVyLCJPSyIpOworCSAgYnJlYWs7CisKKwljYXNlICdtJzoKKwkgIC8qIG1BQS4uQUEsTExMTCAgUmVhZCBMTExMIGJ5dGVzIGF0IGFkZHJlc3MgQUEuLkFBICovCisJICAvKiBUUlkgVE8gUkVBRCAleCwleC4gIElGIFNVQ0NFRUQsIFNFVCBQVFIgPSAwICovCisJICBwdHIgPSAmcmVtY29tSW5CdWZmZXJbMV07CisJICBpZiAoaGV4VG9JbnQoJnB0ciwmYWRkcikpCisJICAgIGlmICgqKHB0cisrKSA9PSAnLCcpCisJICAgICAgaWYgKGhleFRvSW50KCZwdHIsJmxlbmd0aCkpCisJCXsKKwkJICBwdHIgPSAwOworCQkgIG1lbV9lcnIgPSAwOworCQkgIG1lbTJoZXgoKGNoYXIqKSBhZGRyLCByZW1jb21PdXRCdWZmZXIsIGxlbmd0aCwgMSk7CisJCSAgaWYgKG1lbV9lcnIpCisJCSAgICB7CisJCSAgICAgIHN0cmNweSAocmVtY29tT3V0QnVmZmVyLCAiRTAzIik7CisJCSAgICAgIGRlYnVnX2Vycm9yICgibWVtb3J5IGZhdWx0Iik7CisJCSAgICB9CisJCX0KKworCSAgaWYgKHB0cikKKwkgICAgeworCSAgICAgIHN0cmNweShyZW1jb21PdXRCdWZmZXIsIkUwMSIpOworCSAgICAgIGRlYnVnX2Vycm9yKCJtYWxmb3JtZWQgcmVhZCBtZW1vcnkgY29tbWFuZDogJXMiLHJlbWNvbUluQnVmZmVyKTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlICdNJzoKKwkgIC8qIE1BQS4uQUEsTExMTDogV3JpdGUgTExMTCBieXRlcyBhdCBhZGRyZXNzIEFBLkFBIHJldHVybiBPSyAqLworCSAgLyogVFJZIFRPIFJFQUQgJyV4LCV4OicuICBJRiBTVUNDRUVELCBTRVQgUFRSID0gMCAqLworCSAgcHRyID0gJnJlbWNvbUluQnVmZmVyWzFdOworCSAgaWYgKGhleFRvSW50KCZwdHIsJmFkZHIpKQorCSAgICBpZiAoKihwdHIrKykgPT0gJywnKQorCSAgICAgIGlmIChoZXhUb0ludCgmcHRyLCZsZW5ndGgpKQorCQlpZiAoKihwdHIrKykgPT0gJzonKQorCQkgIHsKKwkJICAgIG1lbV9lcnIgPSAwOworCQkgICAgaGV4Mm1lbShwdHIsIChjaGFyKikgYWRkciwgbGVuZ3RoLCAxKTsKKworCQkgICAgaWYgKG1lbV9lcnIpCisJCSAgICAgIHsKKwkJCXN0cmNweSAocmVtY29tT3V0QnVmZmVyLCAiRTAzIik7CisJCQlkZWJ1Z19lcnJvciAoIm1lbW9yeSBmYXVsdCIpOworCQkgICAgICB9CisJCSAgICBlbHNlCisJCSAgICAgIHsKKwkJCXN0cmNweShyZW1jb21PdXRCdWZmZXIsIk9LIik7CisJCSAgICAgIH0KKworCQkgICAgcHRyID0gMDsKKwkJICB9CisJICBpZiAocHRyKQorCSAgICB7CisJICAgICAgc3RyY3B5KHJlbWNvbU91dEJ1ZmZlciwiRTAyIik7CisJICAgICAgZGVidWdfZXJyb3IoIm1hbGZvcm1lZCB3cml0ZSBtZW1vcnkgY29tbWFuZDogJXMiLHJlbWNvbUluQnVmZmVyKTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwljYXNlICdjJzoKKwljYXNlICdzJzoKKwkgIC8qIGNBQS4uQUEgICAgQ29udGludWUgYXQgYWRkcmVzcyBBQS4uQUEob3B0aW9uYWwpICovCisJICAvKiBzQUEuLkFBICAgU3RlcCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBBQS4uQUEob3B0aW9uYWwpICovCisJICAvKiB0cnkgdG8gcmVhZCBvcHRpb25hbCBwYXJhbWV0ZXIsIHBjIHVuY2hhbmdlZCBpZiBubyBwYXJtICovCisJICBwdHIgPSAmcmVtY29tSW5CdWZmZXJbMV07CisJICBpZiAoaGV4VG9JbnQoJnB0ciwmYWRkcikpCisJICAgIHsKKy8qCSAgICAgIHJlZ2lzdGVyc1tQQ19SRUdOVU1dLmxvID0gYWRkcjsqLworCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlNldHRpbmcgUEMgdG8gMHgleFxuIiwgYWRkcik7CisJICAgICAgd2hpbGUgKDEpOworCSAgICB9CisKKwkgIGlmIChyZW1jb21JbkJ1ZmZlclswXSA9PSAncycpCisJICAgIHNldF9zdGVwX3RyYXBzIChmcmFtZSk7CisKKwkgIGZsdXNoX2lfY2FjaGUgKCk7CisJICByZXR1cm4gUkVUVVJOX1RPX1BST0dSQU07CisKKwljYXNlICdrJzoKKwkgIC8qIGtpbGwgdGhlIHByb2dyYW0gKi8KKwkgIEtpbGxNZSAobGRpbmZvKTsKKwkgIFJlc3VtZVRocmVhZCAobWFpbnRocmVhZCk7CisJICByZXR1cm4gUkVUVVJOX1RPX1BST0dSQU07CisKKwljYXNlICdxJzoJCS8qIFF1ZXJ5IG1lc3NhZ2UgKi8KKwkgIGlmIChzdHJjbXAgKCZyZW1jb21JbkJ1ZmZlclsxXSwgIk9mZnNldHMiKSA9PSAwKQorCSAgICB7CisJICAgICAgc3ByaW50ZiAocmVtY29tT3V0QnVmZmVyLCAiVGV4dD0leDtEYXRhPSV4O0Jzcz0leCIsCisJCSAgICAgICBsZGluZm8tPkxEQ29kZUltYWdlT2Zmc2V0LAorCQkgICAgICAgbGRpbmZvLT5MRERhdGFJbWFnZU9mZnNldCwKKwkJICAgICAgIGxkaW5mby0+TEREYXRhSW1hZ2VPZmZzZXQgKyBsZGluZm8tPkxERGF0YUltYWdlTGVuZ3RoKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBzcHJpbnRmIChyZW1jb21PdXRCdWZmZXIsICJFMDQsIFVua25vd24gcXVlcnkgJXMiLCAmcmVtY29tSW5CdWZmZXJbMV0pOworCSAgYnJlYWs7CisJfQorCisgICAgICAvKiByZXBseSB0byB0aGUgcmVxdWVzdCAqLworICAgICAgaWYgKCEgcHV0cGFja2V0KHJlbWNvbU91dEJ1ZmZlcikpCisJcmV0dXJuIFJFVFVSTl9UT19ORVhUX0RFQlVHR0VSOworICAgIH0KK30KKworY2hhciAqcHJvZ25hbWU7CisKK3N0cnVjdCBiaXRSYXRlIHsKKyAgQllURSBiaXRSYXRlOworICBjb25zdCBjaGFyICpiaXRSYXRlU3RyaW5nOworfTsKKworc3RydWN0IGJpdFJhdGUgYml0UmF0ZVRhYmxlW10gPSAKK3sKKyAgeyBBSU9fQkFVRF81MCAgICAsICAgICAgIjUwIiB9LAorICB7IEFJT19CQVVEXzc1ICAgICwgICAgICAiNzUiIH0sCisgIHsgQUlPX0JBVURfMTEwICAgLCAgICAgIjExMCIgfSwKKyAgeyBBSU9fQkFVRF8xMzRwNSAsICAgIjEzNC41IiB9LAorICB7IEFJT19CQVVEXzE1MCAgICwgICAgICIxNTAiIH0sCisgIHsgQUlPX0JBVURfMzAwICAgLCAgICAgIjMwMCIgfSwKKyAgeyBBSU9fQkFVRF82MDAgICAsICAgICAiNjAwIiB9LAorICB7IEFJT19CQVVEXzEyMDAgICwgICAgIjEyMDAiIH0sCisgIHsgQUlPX0JBVURfMTgwMCAgLCAgICAiMTgwMCIgfSwKKyAgeyBBSU9fQkFVRF8yMDAwICAsICAgICIyMDAwIiB9LAorICB7IEFJT19CQVVEXzI0MDAgICwgICAgIjI0MDAiIH0sCisgIHsgQUlPX0JBVURfMzYwMCAgLCAgICAiMzYwMCIgfSwKKyAgeyBBSU9fQkFVRF80ODAwICAsICAgICI0ODAwIiB9LAorICB7IEFJT19CQVVEXzcyMDAgICwgICAgIjcyMDAiIH0sCisgIHsgQUlPX0JBVURfOTYwMCAgLCAgICAiOTYwMCIgfSwKKyAgeyBBSU9fQkFVRF8xOTIwMCAsICAgIjE5MjAwIiB9LAorICB7IEFJT19CQVVEXzM4NDAwICwgICAiMzg0MDAiIH0sCisgIHsgQUlPX0JBVURfNTc2MDAgLCAgICI1NzYwMCIgfSwKKyAgeyBBSU9fQkFVRF8xMTUyMDAsICAiMTE1MjAwIiB9LAorICB7IC0xLCBOVUxMIH0KK307CisKK2NoYXIgZGF0YUJpdHNUYWJsZVtdID0gIjU2NzgiOworCitjaGFyICpzdG9wQml0c1RhYmxlW10gPSB7ICIxIiwgIjEuNSIsICIyIiB9OworCitjaGFyIHBhcml0eVtdID0gIk5PRU1TIjsKKworLyogU3RhcnQgdXAuICBUaGUgbWFpbiB0aHJlYWQgb3BlbnMgdGhlIG5hbWVkIHNlcmlhbCBJL08gcG9ydCwgbG9hZHMKKyAgIHRoZSBuYW1lZCBOTE0gbW9kdWxlIGFuZCB0aGVuIGdvZXMgdG8gc2xlZXAuICBUaGUgc2VyaWFsIEkvTyBwb3J0CisgICBpcyBuYW1lZCBhcyBhIGJvYXJkIG51bWJlciBhbmQgYSBwb3J0IG51bWJlci4gIEl0IHdvdWxkIGJlIG1vcmUgRE9TCisgICBsaWtlIHRvIHByb3ZpZGUgYSBtZW51IG9mIGF2YWlsYWJsZSBzZXJpYWwgcG9ydHMsIGJ1dCBJIGRvbid0IHdhbnQKKyAgIHRvIGhhdmUgdG8gZmlndXJlIG91dCBob3cgdG8gZG8gdGhhdC4gICovCisKK2ludAorbWFpbiAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKiphcmd2OworeworICBpbnQgaGFyZHdhcmUsIGJvYXJkLCBwb3J0OworICBCWVRFIGJpdFJhdGU7CisgIEJZVEUgZGF0YUJpdHM7CisgIEJZVEUgc3RvcEJpdHM7CisgIEJZVEUgcGFyaXR5TW9kZTsKKyAgTE9ORyBlcnI7CisgIHN0cnVjdCBkZWJ1Z2dlclN0cnVjdHVyZSBzOworICBpbnQgY21kaW5keDsKKyAgY2hhciAqY21kbGluOworICBpbnQgaTsKKworICAvKiBzZXQgcHJvZ25hbWUgKi8KKyAgcHJvZ25hbWUgPSAiZ2Ric2VydmUiOworCisgIC8qIHNldCBkZWZhdWx0IHNlcmlhbCBsaW5lICovCisgIGhhcmR3YXJlID0gLTE7CisgIGJvYXJkID0gMDsKKyAgcG9ydCA9IDA7CisKKyAgLyogc2V0IGRlZmF1bHQgc2VyaWFsIGxpbmUgY2hhcmFjdGVyaXN0aWNzICovCisgIGJpdFJhdGUgID0gQUlPX0JBVURfOTYwMDsKKyAgZGF0YUJpdHMgPSBBSU9fREFUQV9CSVRTXzg7CisgIHN0b3BCaXRzID0gQUlPX1NUT1BfQklUU18xOworICBwYXJpdHlNb2RlID0gQUlPX1BBUklUWV9OT05FOworCisgIGNtZGluZHggPSAwOworICBmb3IgKGFyZ2MtLSwgYXJndisrOyAqYXJndjsgYXJnYy0tLCBhcmd2KyspIAorICAgIHsKKyAgICAgIGNoYXIgKmJwOworICAgICAgY2hhciAqZXA7CisKKyAgICAgIGlmIChzdHJuaWNtcCgqYXJndiwgIkJBVUQ9IiwgNSkgPT0gMCkgCisJeworCSAgc3RydWN0IGJpdFJhdGUgKmJycDsKKworCSAgYnAgPSAqYXJndiArIDU7CisJICBmb3IgKGJycCA9IGJpdFJhdGVUYWJsZTsgYnJwLT5iaXRSYXRlICE9IChCWVRFKSAtMTsgYnJwKyspIAorCSAgICB7CisJICAgICAgaWYgKHN0cmNtcChicnAtPmJpdFJhdGVTdHJpbmcsIGJwKSA9PSAwKSAKKwkJeworCQkgIGJpdFJhdGUgPSBicnAtPmJpdFJhdGU7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCisJICBpZiAoYnJwLT5iaXRSYXRlU3RyaW5nID09IE5VTEwpIAorCSAgICB7CisJICAgICAgZnByaW50ZihzdGRlcnIsICIlczogJXM6IHVua25vd24gb3IgdW5zdXBwb3J0ZWQgYml0IHJhdGUiLAorCQkgICAgICBwcm9nbmFtZSwgYnApOworCSAgICAgIGV4aXQgKDEpOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoc3RybmljbXAoKmFyZ3YsICJCT0FSRD0iLCA2KSA9PSAwKSAKKyAgICAgICAgeworCSAgYnAgPSAqYXJndiArIDY7CisJICBib2FyZCA9IHN0cnRvbCAoYnAsICZlcCwgMCk7CisJICBpZiAoZXAgPT0gYnAgfHwgKmVwICE9ICdcMCcpIAorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiBleHBlY3RlZCBpbnRlZ2VyIGFyZ3VtZW50XG4iLCAKKwkJICAgICAgIHByb2duYW1lLCBicCk7CisJICAgICAgZXhpdCgxKTsKKwkgICAgfQorCX0KKyNpZiAxCQkJCS8qIEZJWE1FOiB0aGlzIG9wdGlvbiBoYXMgYmVlbiBkZXByaWNhdGVkICovCisgICAgICBlbHNlIGlmIChzdHJuaWNtcCgqYXJndiwgIk5PREU9IiwgNSkgPT0gMCkKKwl7CisJICBicCA9ICphcmd2ICsgNTsKKwkgIGJvYXJkID0gc3RydG9sIChicCwgJmVwLCAwKTsKKwkgIGlmIChlcCA9PSBicCB8fCAqZXAgIT0gJ1wwJykgCisJICAgIHsKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6IGV4cGVjdGVkIGludGVnZXIgYXJndW1lbnRcbiIsIAorCQkgICAgICAgcHJvZ25hbWUsIGJwKTsKKwkgICAgICBleGl0KDEpOworCSAgICB9CisJfQorI2VuZGlmCisgICAgICBlbHNlIGlmIChzdHJuaWNtcCgqYXJndiwgIlBPUlQ9IiwgNSkgPT0gMCkKKwl7CisJICBicCA9ICphcmd2ICsgNTsKKwkgIHBvcnQgPSBzdHJ0b2wgKGJwLCAmZXAsIDApOworCSAgaWYgKGVwID09IGJwIHx8ICplcCAhPSAnXDAnKQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiBleHBlY3RlZCBpbnRlZ2VyIGFyZ3VtZW50XG4iLCAKKwkJICAgICAgIHByb2duYW1lLCBicCk7CisJICAgICAgZXhpdCgxKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBicmVhazsKKwl9CisKKyAgICAgIGNtZGluZHgrKzsKKyAgICB9CisKKyAgaWYgKGFyZ2MgPT0gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsCisJICAgICAgICJVc2FnZTogbG9hZCAlcyBbb3B0aW9uc10gcHJvZ3JhbSBbYXJndW1lbnRzXVxuIiwgcHJvZ25hbWUpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGVyciA9IEFJT0FjcXVpcmVQb3J0ICgmaGFyZHdhcmUsICZib2FyZCwgJnBvcnQsICZBSU9oYW5kbGUpOworICBpZiAoZXJyICE9IEFJT19TVUNDRVNTKQorICAgIHsKKyAgICAgIHN3aXRjaCAoZXJyKQorCXsKKwljYXNlIEFJT19QT1JUX05PVF9BVkFJTEFCTEU6CisJICBmcHJpbnRmIChzdGRlcnIsICJQb3J0IG5vdCBhdmFpbGFibGVcbiIpOworCSAgYnJlYWs7CisKKwljYXNlIEFJT19CT0FSRF9OVU1CRVJfSU5WQUxJRDoKKwljYXNlIEFJT19QT1JUX05VTUJFUl9JTlZBTElEOgorCSAgZnByaW50ZiAoc3RkZXJyLCAiTm8gc3VjaCBwb3J0XG4iKTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIGZwcmludGYgKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIHBvcnQ6ICVkXG4iLCBlcnIpOworCSAgYnJlYWs7CisJfQorCisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgZXJyID0gQUlPQ29uZmlndXJlUG9ydCAoQUlPaGFuZGxlLCBiaXRSYXRlLCBkYXRhQml0cywgc3RvcEJpdHMsIHBhcml0eU1vZGUsCisJCQkgIEFJT19IQVJEV0FSRV9GTE9XX0NPTlRST0xfT0ZGKTsKKworICBpZiAoZXJyID09IEFJT19RVUFMSUZJRURfU1VDQ0VTUykKKyAgICB7CisgICAgICBBSU9QT1JUQ09ORklHIHBvcnRDb25maWc7CisKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlBvcnQgY29uZmlndXJhdGlvbiBjaGFuZ2VkIVxuIik7CisKKyAgICAgIHBvcnRDb25maWcucmV0dXJuTGVuZ3RoID0gc2l6ZW9mKHBvcnRDb25maWcpOworICAgICAgQUlPR2V0UG9ydENvbmZpZ3VyYXRpb24gKEFJT2hhbmRsZSwgJnBvcnRDb25maWcsIE5VTEwpOworCisgICAgICBmcHJpbnRmIChzdGRlcnIsCisJICAgICAgICIgIEJpdCBSYXRlOiAlcywgRGF0YSBCaXRzOiAlYywgU3RvcCBCaXRzOiAlcywgUGFyaXR5OiAlYyxcCisgRmxvdzolc1xuIiwKKwkgICAgICAgYml0UmF0ZVRhYmxlW3BvcnRDb25maWcuYml0UmF0ZV0uYml0UmF0ZVN0cmluZywKKwkgICAgICAgZGF0YUJpdHNUYWJsZVtwb3J0Q29uZmlnLmRhdGFCaXRzXSwKKwkgICAgICAgc3RvcEJpdHNUYWJsZVtwb3J0Q29uZmlnLnN0b3BCaXRzXSwKKwkgICAgICAgcGFyaXR5W3BvcnRDb25maWcucGFyaXR5TW9kZV0sCisJICAgICAgIHBvcnRDb25maWcuZmxvd0N0cmxNb2RlID8gIk9OIiA6ICJPRkYiKTsKKyAgICB9CisgIGVsc2UgaWYgKGVyciAhPSBBSU9fU1VDQ0VTUykKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJDb3VsZCBub3QgY29uZmlndXJlIHBvcnQ6ICVkXG4iLCBlcnIpOworICAgICAgQUlPUmVsZWFzZVBvcnQgKEFJT2hhbmRsZSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKEFJT1NldEV4dGVybmFsQ29udHJvbChBSU9oYW5kbGUsIEFJT19FWFRFUk5BTF9DT05UUk9MLAorCQkJICAgIChBSU9fRVhUQ1RSTF9EVFIgfCBBSU9fRVhUQ1RSTF9SVFMpKQorICAgICAgIT0gQUlPX1NVQ0NFU1MpCisgICAgeworICAgICAgTE9ORyBleHRTdGF0dXMsIGNoZ2RFeHRTdGF0dXM7CisKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNvdWxkIG5vdCBzZXQgZGVzaXJlZCBwb3J0IGNvbnRyb2xzIVxuIik7CisgICAgICBBSU9HZXRFeHRlcm5hbFN0YXR1cyAoQUlPaGFuZGxlLCAmZXh0U3RhdHVzLCAmY2hnZEV4dFN0YXR1cyk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJQb3J0IGNvbnRyb2xzIG5vdzogJWQsICVkXG4iLCBleHRTdGF0dXMsIAorCSAgICAgICBjaGdkRXh0U3RhdHVzKTsKKyAgICB9CisKKyAgLyogUmVnaXN0ZXIgb3Vyc2VsdmVzIGFzIGFuIGFsdGVybmF0ZSBkZWJ1Z2dlci4gICovCisgIG1lbXNldCAoJnMsIDAsIHNpemVvZiBzKTsKKyAgcy5ERFNSZXNvdXJjZVRhZyA9ICgoc3RydWN0IFJlc291cmNlVGFnU3RydWN0dXJlICopCisJCSAgICAgIEFsbG9jYXRlUmVzb3VyY2VUYWcgKEdldE5MTUhhbmRsZSAoKSwKKwkJCQkJICAgKEJZVEUgKikiZ2Ric2VydmVyIiwKKwkJCQkJICAgRGVidWdnZXJTaWduYXR1cmUpKTsKKyAgaWYgKHMuRERTUmVzb3VyY2VUYWcgPT0gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJBbGxvY2F0ZVJlc291cmNlVGFnIGZhaWxlZFxuIik7CisgICAgICBBSU9SZWxlYXNlUG9ydCAoQUlPaGFuZGxlKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgcy5ERFNkZWJ1Z2dlckVudHJ5ID0gaGFuZGxlX2V4Y2VwdGlvbjsKKyAgcy5ERFNGbGFncyA9IFRTU19GUkFNRV9CSVQ7CisKKyAgZXJyID0gUmVnaXN0ZXJEZWJ1Z2dlclJUYWcgKCZzLCBBVF9GSVJTVCk7CisgIGlmIChlcnIgIT0gMCkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJSZWdpc3RlckRlYnVnZ2VyUlRhZyBmYWlsZWRcbiIpOworICAgICAgQUlPUmVsZWFzZVBvcnQgKEFJT2hhbmRsZSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgLyogR2V0IHRoZSBjb21tYW5kIGxpbmUgd2Ugd2VyZSBpbnZva2VkIHdpdGgsIGFuZCBhZHZhbmNlIGl0IHBhc3QKKyAgICAgb3VyIG5hbWUgYW5kIHRoZSBib2FyZCBhbmQgcG9ydCBhcmd1bWVudHMuICAqLworICBjbWRsaW4gPSBnZXRjbWQgKChjaGFyICopIE5VTEwpOworICBmb3IgKGkgPSAwOyBpIDwgY21kaW5keDsgaSsrKQorICAgIHsKKyAgICAgIHdoaWxlICghIGlzc3BhY2UgKCpjbWRsaW4pKQorCSsrY21kbGluOworICAgICAgd2hpbGUgKGlzc3BhY2UgKCpjbWRsaW4pKQorCSsrY21kbGluOworICAgIH0KKyAgCisgIC8qIEluIGNhc2UgR0RCIGlzIHN0YXJ0ZWQgYmVmb3JlIHVzLCBhY2sgYW55IHBhY2tldHMgKHByZXN1bWFibHkKKyAgICAgIiQ/I3h4Iikgc2l0dGluZyB0aGVyZS4gICovCisgIGlmICghIHB1dERlYnVnQ2hhciAoJysnKSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJwdXREZWJ1Z0NoYXIgZmFpbGVkXG4iKTsKKyAgICAgIFVuUmVnaXN0ZXJEZWJ1Z2dlciAoJnMpOworICAgICAgQUlPUmVsZWFzZVBvcnQgKEFJT2hhbmRsZSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgbWFpbnRocmVhZCA9IEdldFRocmVhZElEICgpOworCisgIGlmIChyZW1vdGVfZGVidWcgPiAwKQorICAgIENvbnNvbGVQcmludGYgKCJBYm91dCB0byBjYWxsIExvYWRNb2R1bGUgd2l0aCBcIiVzXCIgJTA4eFxyXG4iLAorCQkgICBjbWRsaW4sIF9fR2V0U2NyZWVuSUQgKEdldEN1cnJlbnRTY3JlZW4oKSkpOworCisgIC8qIFN0YXJ0IHVwIHRoZSBtb2R1bGUgdG8gYmUgZGVidWdnZWQuICAqLworICBlcnIgPSBMb2FkTW9kdWxlICgoc3RydWN0IFNjcmVlblN0cnVjdCAqKSBfX0dldFNjcmVlbklEIChHZXRDdXJyZW50U2NyZWVuKCkpLAorCQkgICAgKEJZVEUgKiljbWRsaW4sIExPX0RFQlVHKTsKKyAgaWYgKGVyciAhPSAwKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkxvYWRNb2R1bGUgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKyAgICAgIFVuUmVnaXN0ZXJEZWJ1Z2dlciAoJnMpOworICAgICAgQUlPUmVsZWFzZVBvcnQgKEFJT2hhbmRsZSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgLyogV2FpdCBmb3IgdGhlIGRlYnVnZ2VyIHRvIHdha2UgdXMgdXAuICAqLworICBpZiAocmVtb3RlX2RlYnVnID4gMCkKKyAgICBDb25zb2xlUHJpbnRmICgiU3VzcGVuZGluZyBtYWluIHRocmVhZCAoJTA4eClcclxuIiwgbWFpbnRocmVhZCk7CisgIFN1c3BlbmRUaHJlYWQgKG1haW50aHJlYWQpOworICBpZiAocmVtb3RlX2RlYnVnID4gMCkKKyAgICBDb25zb2xlUHJpbnRmICgiUmVzdW1pbmcgbWFpbiB0aHJlYWQgKCUwOHgpXHJcbiIsIG1haW50aHJlYWQpOworCisgIC8qIElmIHdlIGFyZSB3b2tlbiB1cCwgcHJpbnQgYW4gb3B0aW9uYWwgZXJyb3IgbWVzc2FnZSwgZGVyZWdpc3RlcgorICAgICBvdXJzZWx2ZXMgYW5kIGV4aXQuICAqLworICBpZiAoZXJyb3JfbWVzc2FnZSAhPSBOVUxMKQorICAgIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBlcnJvcl9tZXNzYWdlKTsKKyAgVW5SZWdpc3RlckRlYnVnZ2VyICgmcyk7CisgIEFJT1JlbGVhc2VQb3J0IChBSU9oYW5kbGUpOworICBleGl0ICgwKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9ubG0vZ2Ric2VydmUuZGVmIGIvZ2RiL25sbS9nZGJzZXJ2ZS5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4MDI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9ubG0vZ2Ric2VydmUuZGVmCkBAIC0wLDAgKzEsNDIgQEAKK2Rlc2NyaXB0aW9uICJHREIgZGVidWdnZXIgc3R1YiIKK3ZlcnNpb24gMSwyCitkZWJ1ZworbW9kdWxlIGNsaWIKK3NjcmVlbm5hbWUgIlN5c3RlbSBDb25zb2xlIgoraW5wdXQgZ2Ric2VydmUuTworb3V0cHV0IGdkYnNlcnZlLm5sbQorc3RhcnQgX1ByZWx1ZGUKK2V4aXQgX1N0b3AKK2ltcG9ydAorCUFsbG9jYXRlUmVzb3VyY2VUYWcKKwlDb25zb2xlUHJpbnRmCisJR2V0Q3VycmVudFNjcmVlbgorCUdldE5MTUhhbmRsZQorCUdldFRocmVhZElECisJS2lsbE1lCisJTG9hZE1vZHVsZQorCVJlYWRCeXRlQWx0RGVidWdnZXIKKwlSZWdpc3RlckRlYnVnZ2VyUlRhZworCVJlc3VtZVRocmVhZAorCVN1c3BlbmRUaHJlYWQKKwlVblJlZ2lzdGVyRGVidWdnZXIKKwlXcml0ZUJ5dGVBbHREZWJ1Z2dlcgorCV9HZXRDTGliTkxNTGliSGFuZGxlCisJX05XUmVnaXN0ZXJOTE1MaWJyYXJ5VXNlcgorCV9TZXR1cEFyZ3YKKwlfU3RhcnROTE0KKwlfVGVybWluYXRlTkxNCisJX19HZXRTY3JlZW5JRAorCV9fZ2V0X2Vycm5vX3B0cgorCWV4aXQKKwlmcHJpbnRmCisJZ2V0Y21kCisJbWVtY21wCisJbWVtY3B5CisJbWVtc2V0CisJc3ByaW50ZgorCXN0cmNtcAorCXN0cmNweQorCXN0cmxlbgorCXN0cm5pY21wCisJc3RydG9sCmRpZmYgLS1naXQgYS9nZGIvbmxtL2kzODYuYyBiL2dkYi9ubG0vaTM4Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDE5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbmxtL2kzODYuYwpAQCAtMCwwICsxLDEwOCBAQAorI2luY2x1ZGUgPGRmcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8Y29uaW8uaD4KKyNpbmNsdWRlIDxhZHZhbmNlZC5oPgorI2luY2x1ZGUgPGRlYnVnYXBpLmg+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAiaTM4Ni5oIgorCitleHRlcm4gY2hhciAqbWVtMmhleCAodm9pZCAqbWVtLCBjaGFyICpidWYsIGludCBjb3VudCwgaW50IG1heV9mYXVsdCk7CitleHRlcm4gY2hhciAqaGV4Mm1lbSAoY2hhciAqYnVmLCB2b2lkICptZW0sIGludCBjb3VudCwgaW50IG1heV9mYXVsdCk7CitleHRlcm4gaW50IGNvbXB1dGVTaWduYWwgKGludCBleGNlcHRpb25WZWN0b3IpOworCit2b2lkCitmbHVzaF9pX2NhY2hlKCkKK3sKK30KKworLyogR2V0IHRoZSByZWdpc3RlcnMgb3V0IG9mIHRoZSBmcmFtZSBpbmZvcm1hdGlvbi4gICovCisKK3ZvaWQKK2ZyYW1lX3RvX3JlZ2lzdGVycyAoZnJhbWUsIHJlZ3MpCisgICAgIHN0cnVjdCBTdGFja0ZyYW1lICpmcmFtZTsKKyAgICAgY2hhciAqcmVnczsKK3sKKyAgLyogQ29weSBFQVggLT4gRURJICovCisgIG1lbTJoZXggKCZmcmFtZS0+RXhjZXB0aW9uRUFYLCAmcmVnc1swICogNCAqIDJdLCA0ICogOCwgMCk7CisKKyAgLyogQ29weSBFSVAgJiBQUyAqLworICBtZW0yaGV4ICgmZnJhbWUtPkV4Y2VwdGlvblBDLCAmcmVnc1s4ICogNCAqIDJdLCA0ICogMiwgMCk7CisKKyAgLyogQ29weSBDUywgU1MsIERTICovCisgIG1lbTJoZXggKCZmcmFtZS0+RXhjZXB0aW9uQ1MsICZyZWdzWzEwICogNCAqIDJdLCA0ICogMywgMCk7CisKKyAgLyogQ29weSBFUyAqLworICBtZW0yaGV4ICgmZnJhbWUtPkV4Y2VwdGlvbkVTLCAmcmVnc1sxMyAqIDQgKiAyXSwgNCAqIDEsIDApOworCisgIC8qIENvcHkgRlMgJiBHUyAqLworICBtZW0yaGV4ICgmZnJhbWUtPkV4Y2VwdGlvbkZTLCAmcmVnc1sxNCAqIDQgKiAyXSwgNCAqIDIsIDApOworfQorCisvKiBQdXQgdGhlIHJlZ2lzdGVycyBiYWNrIGludG8gdGhlIGZyYW1lIGluZm9ybWF0aW9uLiAgKi8KKwordm9pZAorcmVnaXN0ZXJzX3RvX2ZyYW1lIChyZWdzLCBmcmFtZSkKKyAgICAgY2hhciAqcmVnczsKKyAgICAgc3RydWN0IFN0YWNrRnJhbWUgKmZyYW1lOworeworICAvKiBDb3B5IEVBWCAtPiBFREkgKi8KKyAgaGV4Mm1lbSAoJnJlZ3NbMCAqIDQgKiAyXSwgJmZyYW1lLT5FeGNlcHRpb25FQVgsIDQgKiA4LCAwKTsKKworICAvKiBDb3B5IEVJUCAmIFBTICovCisgIGhleDJtZW0gKCZyZWdzWzggKiA0ICogMl0sICZmcmFtZS0+RXhjZXB0aW9uUEMsIDQgKiAyLCAwKTsKKworICAvKiBDb3B5IENTLCBTUywgRFMgKi8KKyAgaGV4Mm1lbSAoJnJlZ3NbMTAgKiA0ICogMl0sICZmcmFtZS0+RXhjZXB0aW9uQ1MsIDQgKiAzLCAwKTsKKworICAvKiBDb3B5IEVTICovCisgIGhleDJtZW0gKCZyZWdzWzEzICogNCAqIDJdLCAmZnJhbWUtPkV4Y2VwdGlvbkVTLCA0ICogMSwgMCk7CisKKyAgLyogQ29weSBGUyAmIEdTICovCisgIGhleDJtZW0gKCZyZWdzWzE0ICogNCAqIDJdLCAmZnJhbWUtPkV4Y2VwdGlvbkZTLCA0ICogMiwgMCk7Cit9CisKK3ZvaWQKK3NldF9zdGVwX3RyYXBzIChmcmFtZSkKKyAgICAgc3RydWN0IFN0YWNrRnJhbWUgKmZyYW1lOworeworICBmcmFtZS0+RXhjZXB0aW9uU3lzdGVtRmxhZ3MgfD0gMHgxMDA7Cit9CisKK3ZvaWQKK2NsZWFyX3N0ZXBfdHJhcHMgKGZyYW1lKQorICAgICBzdHJ1Y3QgU3RhY2tGcmFtZSAqZnJhbWU7Cit7CisgIGZyYW1lLT5FeGNlcHRpb25TeXN0ZW1GbGFncyAmPSB+MHgxMDA7Cit9CisKK3ZvaWQKK2RvX3N0YXR1cyAocHRyLCBmcmFtZSkKKyAgICAgY2hhciAqcHRyOworICAgICBzdHJ1Y3QgU3RhY2tGcmFtZSAqZnJhbWU7Cit7CisgIGludCBzaWd2YWw7CisKKyAgc2lndmFsID0gY29tcHV0ZVNpZ25hbCAoZnJhbWUtPkV4Y2VwdGlvbk51bWJlcik7CisKKyAgc3ByaW50ZiAocHRyLCAiVCUwMngiLCBzaWd2YWwpOworICBwdHIgKz0gMzsKKworICBzcHJpbnRmIChwdHIsICIlMDJ4OiIsIFBDX1JFR05VTSk7CisgIHB0ciA9IG1lbTJoZXggKCZmcmFtZS0+RXhjZXB0aW9uUEMsIHB0ciArIDMsIDQsIDApOworICAqcHRyKysgPSAnOyc7CisKKyAgc3ByaW50ZiAocHRyLCAiJTAyeDoiLCBTUF9SRUdOVU0pOworICBwdHIgPSBtZW0yaGV4ICgmZnJhbWUtPkV4Y2VwdGlvbkVTUCwgcHRyICsgMywgNCwgMCk7CisgICpwdHIrKyA9ICc7JzsKKworICBzcHJpbnRmIChwdHIsICIlMDJ4OiIsIEZQX1JFR05VTSk7CisgIHB0ciA9IG1lbTJoZXggKCZmcmFtZS0+RXhjZXB0aW9uRUJQLCBwdHIgKyAzLCA0LCAwKTsKKyAgKnB0cisrID0gJzsnOworCisgICpwdHIgPSAnXDAwMCc7Cit9CmRpZmYgLS1naXQgYS9nZGIvbmxtL2kzODYuaCBiL2dkYi9ubG0vaTM4Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NTcwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbmxtL2kzODYuaApAQCAtMCwwICsxLDEzIEBACisvKiBSZWdpc3RlciB2YWx1ZXMuICBBbGwgb2YgdGhlc2UgdmFsdWVzICpNVVNUKiBhZ3JlZSB3aXRoIHRtLmggKi8KKyNkZWZpbmUgU1BfUkVHTlVNIDQJCS8qIENvbnRhaW5zIGFkZHJlc3Mgb2YgdG9wIG9mIHN0YWNrICovCisjZGVmaW5lIFBDX1JFR05VTSA4CQkvKiBDb250YWlucyBwcm9ncmFtIGNvdW50ZXIgKi8KKyNkZWZpbmUgRlBfUkVHTlVNIDUJCS8qIFZpcnR1YWwgZnJhbWUgcG9pbnRlciAqLworI2RlZmluZSBOVU1fUkVHUyAxNgkJLyogTnVtYmVyIG9mIG1hY2hpbmUgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTIChOVU1fUkVHUyAqIDQpIC8qIFRvdGFsIHNpemUgb2YgcmVnaXN0ZXJzIGFycmF5ICovCisKKyNkZWZpbmUgRXhjZXB0aW9uUEMgRXhjZXB0aW9uRUlQCisjZGVmaW5lIERFQ1JfUENfQUZURVJfQlJFQUsgMQkvKiBpbnQgMyBsZWF2ZXMgUEMgcG9pbnRpbmcgYWZ0ZXIgaW5zbiAqLworI2RlZmluZSBCUkVBS1BPSU5UIHsweGNjfQorI2RlZmluZSBCUkVBS1BPSU5UX1NJWkUgKHNpemVvZiBicmVha3BvaW50X2luc24pCisKKyNkZWZpbmUgU3RhY2tGcmFtZSBUX1RTU19TdGFja0ZyYW1lCmRpZmYgLS1naXQgYS9nZGIvbmxtL3BwYy5jIGIvZ2RiL25sbS9wcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjgzOTdiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL25sbS9wcGMuYwpAQCAtMCwwICsxLDI1NyBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxud3R5cGVzLmg+CisjaW5jbHVkZSA8bndkZnMuaD4KKyNpbmNsdWRlIDxud2NvbmlvLmg+CisjaW5jbHVkZSA8bndhZHYuaD4KKyNpbmNsdWRlIDxud2RiZ2FwaS5oPgorI2luY2x1ZGUgPG53dGhyZWFkLmg+CisjaW5jbHVkZSAicHBjLmgiCisKK2V4dGVybiBjaGFyICptZW0yaGV4ICh2b2lkICptZW0sIGNoYXIgKmJ1ZiwgaW50IGNvdW50LCBpbnQgbWF5X2ZhdWx0KTsKK2V4dGVybiBjaGFyICpoZXgybWVtIChjaGFyICpidWYsIHZvaWQgKm1lbSwgaW50IGNvdW50LCBpbnQgbWF5X2ZhdWx0KTsKK2V4dGVybiBpbnQgY29tcHV0ZVNpZ25hbCAoaW50IGV4Y2VwdGlvblZlY3Rvcik7CisKK3ZvaWQKK2ZsdXNoX2lfY2FjaGUgKHZvaWQpCit7Cit9CisKKy8qIEdldCB0aGUgcmVnaXN0ZXJzIG91dCBvZiB0aGUgZnJhbWUgaW5mb3JtYXRpb24uICAqLworCit2b2lkCitmcmFtZV90b19yZWdpc3RlcnMgKGZyYW1lLCByZWdzKQorICAgICBzdHJ1Y3QgU3RhY2tGcmFtZSAqZnJhbWU7CisgICAgIGNoYXIgKnJlZ3M7Cit7CisgIG1lbTJoZXggKCZmcmFtZS0+RXhjZXB0aW9uU3RhdGUuQ3NhdmVkUmVncywgJnJlZ3NbR1AwX1JFR05VTSAqIDQgKiAyXSwgNCAqIDMyLCAwKTsKKworICBtZW0yaGV4ICgmZnJhbWUtPkV4Y2VwdGlvblN0YXRlLkNTYXZlZEZQUmVncywgJnJlZ3NbRlAwX1JFR05VTSAqIDQgKiAyXSwgNCAqIDMyLCAwKTsKKworICBtZW0yaGV4ICgmZnJhbWUtPkV4Y2VwdGlvblBDLCAmcmVnc1tQQ19SRUdOVU0gKiA0ICogMl0sIDQgKiAxLCAwKTsKKworICBtZW0yaGV4ICgmZnJhbWUtPkV4Y2VwdGlvblN0YXRlLnUuU3BlY2lhbFJlZ2lzdGVyc0VudW1lcmF0ZWQuQ3NhdmVkU1JSMSwgJnJlZ3NbQ1JfUkVHTlVNICogNCAqIDJdLCA0ICogMSwgMCk7CisgIG1lbTJoZXggKCZmcmFtZS0+RXhjZXB0aW9uU3RhdGUudS5TcGVjaWFsUmVnaXN0ZXJzRW51bWVyYXRlZC5Dc2F2ZWRMUiwgJnJlZ3NbTFJfUkVHTlVNICogNCAqIDJdLCA0ICogMSwgMCk7CisgIG1lbTJoZXggKCZmcmFtZS0+RXhjZXB0aW9uU3RhdGUudS5TcGVjaWFsUmVnaXN0ZXJzRW51bWVyYXRlZC5Dc2F2ZWRDVFIsICZyZWdzW0NUUl9SRUdOVU0gKiA0ICogMl0sIDQgKiAxLCAwKTsKKyAgbWVtMmhleCAoJmZyYW1lLT5FeGNlcHRpb25TdGF0ZS51LlNwZWNpYWxSZWdpc3RlcnNFbnVtZXJhdGVkLkNzYXZlZFhFUiwgJnJlZ3NbWEVSX1JFR05VTSAqIDQgKiAyXSwgNCAqIDEsIDApOworICBtZW0yaGV4ICgmZnJhbWUtPkV4Y2VwdGlvblN0YXRlLnUuU3BlY2lhbFJlZ2lzdGVyc0VudW1lcmF0ZWQuQ3NhdmVkTVEsICZyZWdzW01RX1JFR05VTSAqIDQgKiAyXSwgNCAqIDEsIDApOworfQorCisvKiBQdXQgdGhlIHJlZ2lzdGVycyBiYWNrIGludG8gdGhlIGZyYW1lIGluZm9ybWF0aW9uLiAgKi8KKwordm9pZAorcmVnaXN0ZXJzX3RvX2ZyYW1lIChyZWdzLCBmcmFtZSkKKyAgICAgY2hhciAqcmVnczsKKyAgICAgc3RydWN0IFN0YWNrRnJhbWUgKmZyYW1lOworeworICBoZXgybWVtICgmcmVnc1tHUDBfUkVHTlVNICogNCAqIDJdLCAmZnJhbWUtPkV4Y2VwdGlvblN0YXRlLkNzYXZlZFJlZ3MsIDQgKiAzMiwgMCk7CisKKyAgaGV4Mm1lbSAoJnJlZ3NbRlAwX1JFR05VTSAqIDQgKiAyXSwgJmZyYW1lLT5FeGNlcHRpb25TdGF0ZS5DU2F2ZWRGUFJlZ3MsIDQgKiAzMiwgMCk7CisKKyAgaGV4Mm1lbSAoJnJlZ3NbUENfUkVHTlVNICogNCAqIDJdLCAmZnJhbWUtPkV4Y2VwdGlvblBDLCA0ICogMSwgMCk7CisKKyAgaGV4Mm1lbSAoJnJlZ3NbQ1JfUkVHTlVNICogNCAqIDJdLCAmZnJhbWUtPkV4Y2VwdGlvblN0YXRlLnUuU3BlY2lhbFJlZ2lzdGVyc0VudW1lcmF0ZWQuQ3NhdmVkU1JSMSwgNCAqIDEsIDApOworICBoZXgybWVtICgmcmVnc1tMUl9SRUdOVU0gKiA0ICogMl0sICZmcmFtZS0+RXhjZXB0aW9uU3RhdGUudS5TcGVjaWFsUmVnaXN0ZXJzRW51bWVyYXRlZC5Dc2F2ZWRMUiwgNCAqIDEsIDApOworICBoZXgybWVtICgmcmVnc1tDVFJfUkVHTlVNICogNCAqIDJdLCAmZnJhbWUtPkV4Y2VwdGlvblN0YXRlLnUuU3BlY2lhbFJlZ2lzdGVyc0VudW1lcmF0ZWQuQ3NhdmVkQ1RSLCA0ICogMSwgMCk7CisgIGhleDJtZW0gKCZyZWdzW1hFUl9SRUdOVU0gKiA0ICogMl0sICZmcmFtZS0+RXhjZXB0aW9uU3RhdGUudS5TcGVjaWFsUmVnaXN0ZXJzRW51bWVyYXRlZC5Dc2F2ZWRYRVIsIDQgKiAxLCAwKTsKKyAgaGV4Mm1lbSAoJnJlZ3NbTVFfUkVHTlVNICogNCAqIDJdLCAmZnJhbWUtPkV4Y2VwdGlvblN0YXRlLnUuU3BlY2lhbFJlZ2lzdGVyc0VudW1lcmF0ZWQuQ3NhdmVkTVEsIDQgKiAxLCAwKTsKK30KKworCitleHRlcm4gdm9sYXRpbGUgaW50IG1lbV9lcnI7CisKKyNpZmRlZiBBTFRFUk5BVEVfTUVNX0ZVTkNTCitleHRlcm4gaW50IFJlYWRCeXRlQWx0RGVidWdnZXIgKGNoYXIqIGFkZHIsIGNoYXIgKnRoZUJ5dGUpOworZXh0ZXJuIGludCBXcml0ZUJ5dGVBbHREZWJ1Z2dlciAoY2hhciogYWRkciwgY2hhciB0aGVCeXRlKTsKK2ludAorZ2V0X2NoYXIgKGFkZHIpCisgICAgIGNoYXIgKmFkZHI7Cit7CisgIGNoYXIgYzsKKworICBpZiAoIVJlYWRCeXRlQWx0RGVidWdnZXIgKGFkZHIsICZjKSkKKyAgICBtZW1fZXJyID0gMTsKKworICByZXR1cm4gYzsKK30KKwordm9pZAorc2V0X2NoYXIgKGFkZHIsIHZhbCkKKyAgICAgY2hhciAqYWRkcjsKKyAgICAgaW50IHZhbDsKK3sKKyAgaWYgKCFXcml0ZUJ5dGVBbHREZWJ1Z2dlciAoYWRkciwgdmFsKSkKKyAgICBtZW1fZXJyID0gMTsKK30KKyNlbmRpZgorCitpbnQKK21lbV93cml0ZSAoZHN0LCBzcmMsIGxlbikKKyAgICAgY2hhciAqZHN0LCAqc3JjOworICAgICBpbnQgbGVuOworeworICB3aGlsZSAobGVuLS0gJiYgIW1lbV9lcnIpCisgICAgc2V0X2NoYXIgKGRzdCsrLCAqc3JjKyspOworCisgIHJldHVybiBtZW1fZXJyOworfQorCit1bmlvbiBpbnN0Cit7CisgIExPTkcgbDsKKworICBzdHJ1Y3QKKyAgICB7CisgICAgICB1bmlvbgorCXsKKwkgIHN0cnVjdAkJLyogVW5jb25kaXRpb25hbCBicmFuY2ggKi8KKwkgICAgeworCSAgICAgIHVuc2lnbmVkIG9wY29kZSA6IDY7IC8qIDE4ICovCisJICAgICAgc2lnbmVkIGxpIDogMjQ7CisJICAgICAgdW5zaWduZWQgYWEgOiAxOworCSAgICAgIHVuc2lnbmVkIGxrIDogMTsKKwkgICAgfSBiOworCSAgc3RydWN0CQkvKiBDb25kaXRpb25hbCBicmFuY2ggKi8KKwkgICAgeworCSAgICAgIHVuc2lnbmVkIG9wY29kZSA6IDY7IC8qIDE2ICovCisJICAgICAgdW5zaWduZWQgYm8gOiA1OworCSAgICAgIHVuc2lnbmVkIGJpIDogNTsKKwkgICAgICBzaWduZWQgYmQgOiAxNDsKKwkgICAgICB1bnNpZ25lZCBhYSA6IDE7CisJICAgICAgdW5zaWduZWQgbGsgOiAxOworCSAgICB9IGJjOworCSAgc3RydWN0CQkvKiBDb25kaXRpb25hbCBicmFuY2ggdG8gY3RyIG9yIGxyIHJlZyAqLworCSAgICB7CisJICAgICAgdW5zaWduZWQgb3Bjb2RlIDogNjsgLyogMTkgKi8KKwkgICAgICB1bnNpZ25lZCBibyA6IDU7CisJICAgICAgdW5zaWduZWQgYmkgOiA1OworCSAgICAgIHVuc2lnbmVkIHR5cGUgOiAxNTsgLyogNTI4ID0gY3RyLCAxNiA9IGxyICovCisJICAgICAgdW5zaWduZWQgbGsgOiAxOworCSAgICB9IGJjbHI7CisJfSB2YXJpYW50OworICAgIH0gaW5zdDsKK307CisKK3N0YXRpYyBMT05HIHNhdmVkX2luc3Q7CitzdGF0aWMgTE9ORyAqc2F2ZWRfaW5zdF9wYyA9IDA7CitzdGF0aWMgTE9ORyBzYXZlZF90YXJnZXRfaW5zdDsKK3N0YXRpYyBMT05HICpzYXZlZF90YXJnZXRfaW5zdF9wYyA9IDA7CisKK3ZvaWQKK3NldF9zdGVwX3RyYXBzIChmcmFtZSkKKyAgICAgc3RydWN0IFN0YWNrRnJhbWUgKmZyYW1lOworeworICB1bmlvbiBpbnN0IGluc3Q7CisgIExPTkcgKnRhcmdldDsKKyAgaW50IG9wY29kZTsKKyAgaW50IHJhLCByYjsKKyAgTE9ORyAqcGMgPSAoTE9ORyAqKWZyYW1lLT5FeGNlcHRpb25QQzsKKworICBpbnN0LmwgPSAqcGMrKzsKKworICBvcGNvZGUgPSBpbnN0Lmluc3QudmFyaWFudC5iLm9wY29kZTsKKworICB0YXJnZXQgPSBwYzsKKworICBzd2l0Y2ggKG9wY29kZSkKKyAgICB7CisgICAgY2FzZSAxODoJCQkvKiBVbmNvbmRpdGlvbmFsIGJyYW5jaCAqLworCisgICAgICBpZiAoaW5zdC5pbnN0LnZhcmlhbnQuYi5hYSkgLyogQWJzb2x1dGU/ICovCisJdGFyZ2V0ID0gMDsKKyAgICAgIHRhcmdldCArPSBpbnN0Lmluc3QudmFyaWFudC5iLmxpOworCisgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgkJCS8qIENvbmRpdGlvbmFsIGJyYW5jaCAqLworCisgICAgICBpZiAoIWluc3QuaW5zdC52YXJpYW50LmJjLmFhKSAvKiBBYnNvbHV0ZT8gKi8KKwl0YXJnZXQgPSAwOworICAgICAgdGFyZ2V0ICs9IGluc3QuaW5zdC52YXJpYW50LmJjLmJkOworCisgICAgICBicmVhazsKKyAgICBjYXNlIDE5OgkJCS8qIENvbmQuIGJyYW5jaCB2aWEgY3RyIG9yIGxyIHJlZyAqLworICAgICAgc3dpdGNoIChpbnN0Lmluc3QudmFyaWFudC5iY2xyLnR5cGUpCisJeworCWNhc2UgNTI4OgkJLyogY3RyICovCisJICB0YXJnZXQgPSAoTE9ORyAqKWZyYW1lLT5FeGNlcHRpb25TdGF0ZS51LlNwZWNpYWxSZWdpc3RlcnNFbnVtZXJhdGVkLkNzYXZlZENUUjsKKwkgIGJyZWFrOworCWNhc2UgMTY6CQkvKiBsciAqLworCSAgdGFyZ2V0ID0gKExPTkcgKilmcmFtZS0+RXhjZXB0aW9uU3RhdGUudS5TcGVjaWFsUmVnaXN0ZXJzRW51bWVyYXRlZC5Dc2F2ZWRMUjsKKwkgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworICAgIH0KKworICBzYXZlZF9pbnN0ID0gKnBjOworICBtZW1fd3JpdGUgKHBjLCBicmVha3BvaW50X2luc24sIEJSRUFLUE9JTlRfU0laRSk7CisgIHNhdmVkX2luc3RfcGMgPSBwYzsKKworICBpZiAodGFyZ2V0ICE9IHBjKQorICAgIHsKKyAgICAgIHNhdmVkX3RhcmdldF9pbnN0ID0gKnRhcmdldDsKKyAgICAgIG1lbV93cml0ZSAodGFyZ2V0LCBicmVha3BvaW50X2luc24sIEJSRUFLUE9JTlRfU0laRSk7CisgICAgICBzYXZlZF90YXJnZXRfaW5zdF9wYyA9IHRhcmdldDsKKyAgICB9Cit9CisKKy8qIFJlbW92ZSBzdGVwIGJyZWFrcG9pbnRzLiAgUmV0dXJucyBub24temVybyBpZiBwYyB3YXMgYXQgYSBzdGVwIGJyZWFrcG9pbnQsCisgICB6ZXJvIG90aGVyd2lzZS4gIFRoaXMgcm91dGluZSB3b3JrcyBldmVuIGlmIHRoZXJlIHdlcmUgbm8gc3RlcCBicmVha3BvaW50cworICAgc2V0LiAgKi8KKworaW50CitjbGVhcl9zdGVwX3RyYXBzIChmcmFtZSkKKyAgICAgc3RydWN0IFN0YWNrRnJhbWUgKmZyYW1lOworeworICBpbnQgcmV0Y29kZTsKKyAgTE9ORyAqcGMgPSAoTE9ORyAqKWZyYW1lLT5FeGNlcHRpb25QQzsKKworICBpZiAoc2F2ZWRfaW5zdF9wYyA9PSBwYyB8fCBzYXZlZF90YXJnZXRfaW5zdF9wYyA9PSBwYykKKyAgICByZXRjb2RlID0gMTsKKyAgZWxzZQorICAgIHJldGNvZGUgPSAwOworCisgIGlmIChzYXZlZF9pbnN0X3BjKQorICAgIHsKKyAgICAgIG1lbV93cml0ZSAoc2F2ZWRfaW5zdF9wYywgc2F2ZWRfaW5zdCwgQlJFQUtQT0lOVF9TSVpFKTsKKyAgICAgIHNhdmVkX2luc3RfcGMgPSAwOworICAgIH0KKworICBpZiAoc2F2ZWRfdGFyZ2V0X2luc3RfcGMpCisgICAgeworICAgICAgbWVtX3dyaXRlIChzYXZlZF90YXJnZXRfaW5zdF9wYywgc2F2ZWRfdGFyZ2V0X2luc3QsIEJSRUFLUE9JTlRfU0laRSk7CisgICAgICBzYXZlZF90YXJnZXRfaW5zdF9wYyA9IDA7CisgICAgfQorCisgIHJldHVybiByZXRjb2RlOworfQorCit2b2lkCitkb19zdGF0dXMgKHB0ciwgZnJhbWUpCisgICAgIGNoYXIgKnB0cjsKKyAgICAgc3RydWN0IFN0YWNrRnJhbWUgKmZyYW1lOworeworICBpbnQgc2lndmFsOworCisgIHNpZ3ZhbCA9IGNvbXB1dGVTaWduYWwgKGZyYW1lLT5FeGNlcHRpb25OdW1iZXIpOworCisgIHNwcmludGYgKHB0ciwgIlQlMDJ4Iiwgc2lndmFsKTsKKyAgcHRyICs9IDM7CisKKyAgc3ByaW50ZiAocHRyLCAiJTAyeDoiLCBQQ19SRUdOVU0pOworICBwdHIgPSBtZW0yaGV4ICgmZnJhbWUtPkV4Y2VwdGlvblBDLCBwdHIgKyAzLCA0LCAwKTsKKyAgKnB0cisrID0gJzsnOworCisgIHNwcmludGYgKHB0ciwgIiUwMng6IiwgU1BfUkVHTlVNKTsKKyAgcHRyID0gbWVtMmhleCAoJmZyYW1lLT5FeGNlcHRpb25TdGF0ZS5Dc2F2ZWRSZWdzW1NQX1JFR05VTV0sIHB0ciArIDMsIDQsIDApOworICAqcHRyKysgPSAnOyc7CisKKyAgc3ByaW50ZiAocHRyLCAiJTAyeDoiLCBMUl9SRUdOVU0pOworICBwdHIgPSBtZW0yaGV4ICgmZnJhbWUtPkV4Y2VwdGlvblN0YXRlLkNzYXZlZFJlZ3NbTFJfUkVHTlVNXSwgcHRyICsgMywgNCwgMCk7CisgICpwdHIrKyA9ICc7JzsKKworICAqcHRyID0gJ1wwMDAnOworfQpkaWZmIC0tZ2l0IGEvZ2RiL25sbS9wcGMuaCBiL2dkYi9ubG0vcHBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjZWU2YgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9ubG0vcHBjLmgKQEAgLTAsMCArMSwxNjUgQEAKK3R5cGVkZWYgbG9uZyBMb25nOworCisvKiBUaGUgZm9sbG93aW5nIGVudW0gaXMgdXNlZCB0byBhY2Nlc3MgdGhlIHNwZWNpYWwgcmVnaXN0ZXJzIGluIAorICAgdGhlIHNhdmVkIG1hY2hpbmUgc3RhdGUuICAqLworCit0eXBlZGVmIGVudW0KK3sKKyAga0RjX1NhdmVkUEMgPQkwLAkJLyogcmVhbGx5IFNSUjAgKi8KKyAga0RjX1NhdmVkTVNSID0gMSwJCS8qIHJlYWxseSBTUlIxICovCisgIGtEY19TYXZlZENSID0JMiwKKyAga0RjX1NhdmVkTFIgPQkzLAorICBrRGNfU2F2ZWREU0lTUiA9IDQsCisgIGtEY19TYXZlZERBUiA9IDUsCisgIGtEY19TYXZlZFhFUiA9IDYsCisgIGtEY19TYXZlZENUUiA9IDcsCisgIGtEY19TYXZlZFNEUjEgPSA4LAorICBrRGNfU2F2ZWRSVENVID0gOSwKKyAga0RjX1NhdmVkUlRDTCA9IDEwLAorICBrRGNfU2F2ZWRERUMgPSAxMSwKKyAga0RjX1NhdmVkU1IwMCA9IDEyLAkJLyogVGhlIFNlZ2VtZW50IFJlZ2lzdGVycyBhcmUgY29uc2VjdXRpdmUgKi8KKyAga0RjX1NhdmVkU1IwMSA9IDEzLAkJLyoga0RjX1NhdmVkU1IwMCArIG4gaXMgc3VwcG9ydGVkICovCisgIGtEY19TYXZlZFNSMDIgPSAxNCwKKyAga0RjX1NhdmVkU1IwMyA9IDE1LAorICBrRGNfU2F2ZWRTUjA0ID0gMTYsCisgIGtEY19TYXZlZFNSMDUgPSAxNywKKyAga0RjX1NhdmVkU1IwNiA9IDE4LAorICBrRGNfU2F2ZWRTUjA3ID0gMTksCisgIGtEY19TYXZlZFNSMDggPSAyMCwKKyAga0RjX1NhdmVkU1IwOSA9IDIxLAorICBrRGNfU2F2ZWRTUjEwID0gMjIsCisgIGtEY19TYXZlZFNSMTEgPSAyMywKKyAga0RjX1NhdmVkU1IxMiA9IDI0LAorICBrRGNfU2F2ZWRTUjEzID0gMjUsCisgIGtEY19TYXZlZFNSMTQgPSAyNiwKKyAga0RjX1NhdmVkU1IxNSA9IDI3LAorICBrRGNfU2F2ZWRGUFNDUiA9IDI5LAorICBrRGNfU2F2ZWRNUSA9IDMwLAorICBrRGNfU2F2ZWRCQVQwVSA9IDMxLAorICBrRGNfU2F2ZWRCQVQwTCA9IDMyLAorICBrRGNfU2F2ZWRCQVQxVSA9IDMzLAorICBrRGNfU2F2ZWRCQVQxTCA9IDM0LAorICBrRGNfU2F2ZWRCQVQyVSA9IDM1LAorICBrRGNfU2F2ZWRCQVQyTCA9IDM2LAorICBrRGNfU2F2ZWRCQVQzVSA9IDM3LAorICBrRGNfU2F2ZWRCQVQzTCA9IDM4LAorCisgIGtOdW1iZXJTcGVjaWFsUmVnaXN0ZXJzID0gMzkKK30gRGNfU2F2ZWRSZWdpc3Rlck5hbWU7CisKKy8qIEFjY2VzcyB0byBmbG9hdGluZyBwb2ludHMgaXMgbm90IHZlcnkgZWFzeS4gIFRoaXMgYWxsb3dzIHRoZSBudW1iZXIgdG8gYmUKKyAgIGFjY2Vzc2VkIGJvdGggYXMgYSBmbG9hdGluZyBudW1iZXIgYW5kIGFzIGEgcGFpciBvZiBMb25ncy4gICovCisKK3R5cGVkZWYgdW5pb24KK3sKKyAgZG91YmxlIGFzZmxvYXQ7CQkvKiBhY2Nlc3MgdGhlIHZhcmlhYmxlIGFzIGEgZmxvYXRpbmcgbnVtYmVyICovCisgIHN0cnVjdAorICAgIHsKKyAgICAgIExvbmcgaGlnaDsKKyAgICAgIExvbmcgbG93OworICAgIH0KKyAgYXNMT05HOwkJCS8qIGFjY2VzcyB0aGUgdmFyaWFibGUgYXMgdHdvIExvbmdzICovCit9IEZsb2F0aW5nUG9pbnRzOworCisvKiBUaGUgZm9sbG93aW5nIGlzIHRoZSBzdGFuZGFyZCByZWNvcmQgZm9yIFNhdmluZyBhIG1hY2hpbmUgc3RhdGUgKi8KKworc3RydWN0IFNhdmVkTWFjaGluZVN0YXRlCit7CisgIEZsb2F0aW5nUG9pbnRzIENTYXZlZEZQUmVnc1szMl07IC8qIFRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgWzAtPjMxXSAqLworCQkJCS8qICoqKjMyYml0IGFzc3VtcHRpb24qKiogKi8KKyAgTG9uZyBDc2F2ZWRSZWdzWzMyXTsJCS8qIHNwYWNlIHRvIHNhdmUgdGhlIEdlbmVyYWwgUmVnaXN0ZXJzICovCisJCQkJLyogVGhlc2UgYXJlIHNhdmVkIDAtPjMxICovCisgIExvbmcgQ2V4UmVhc29uOworICBMb25nIFNhdmVkRG9tYWluSUQ7CisgIHVuaW9uCisgICAgewkJCQkvKiBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLCBzbyBkb3VibGVGUFNDUiBpcyA4LWJ5dGUgYWxpZ25lZCAqLworICAgICAgc3RydWN0CisJeworCSAgTG9uZyBDc2F2ZWRTUlIwOwkvKiBJbmRleCAwIC0gVGhlIHNhdmVkIFBDICovCisJICBMb25nIENzYXZlZFNSUjE7CS8qIDEgc2F2ZWQgTVNSICovCisJICBMb25nIENzYXZlZENSOwkvKiAyICovCisJICBMb25nIENzYXZlZExSOwkvKiAzICovCisJICBMb25nIENzYXZlZERTSVNSOwkvKiA0ICovCisJICBMb25nIENzYXZlZERBUjsJLyogNSAqLworCisJICBMb25nIENzYXZlZFhFUjsJLyogNiAqLworCSAgTG9uZyBDc2F2ZWRDVFI7CS8qIDcgKi8KKwkgIExvbmcgQ3NhdmVkU0RSMTsJLyogOCAqLworCSAgTG9uZyBDc2F2ZWRSVENVOwkvKiA5ICovCisJICBMb25nIENzYXZlZFJUQ0w7CS8qIDEwICovCisJICBMb25nIENzYXZlZERFQzsJLyogMTEgKi8KKwkgIExvbmcgQ3NhdmVkU1IwOwkvKiAxMiAqLworCSAgTG9uZyBDc2F2ZWRTUjE7CS8qIDEzICovCisJICBMb25nIENzYXZlZFNSMjsJLyogMTQgKi8KKwkgIExvbmcgQ3NhdmVkU1IzOwkvKiAxNSAqLworCSAgTG9uZyBDc2F2ZWRTUjQ7CS8qIDE2ICovCisJICBMb25nIENzYXZlZFNSNTsJLyogMTcgKi8KKwkgIExvbmcgQ3NhdmVkU1I2OwkvKiAxOCAqLworCSAgTG9uZyBDc2F2ZWRTUjc7CS8qIDE5ICovCisJICBMb25nIENzYXZlZFNSODsJLyogMjAgKi8KKwkgIExvbmcgQ3NhdmVkU1I5OwkvKiAyMSAqLworCSAgTG9uZyBDc2F2ZWRTUjEwOwkvKiAyMiAqLworCSAgTG9uZyBDc2F2ZWRTUjExOwkvKiAyMyAqLworCSAgTG9uZyBDc2F2ZWRTUjEyOwkvKiAyNCAqLworCSAgTG9uZyBDc2F2ZWRTUjEzOwkvKiAyNSAqLworCSAgTG9uZyBDc2F2ZWRTUjE0OwkvKiAyNiAqLworCSAgTG9uZyBDc2F2ZWRTUjE1OwkvKiAyNyAqLworCQkJCS8qIENkb3VibGVGUFNDUiBtdXN0IGJlIGRvdWJsZSB3b3JkIGFsaWduZWQgKi8KKwkgIExvbmcgQ2RvdWJsZUZQU0NSOwkvKiAyOCB0aGlzIGlzIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSBzdG9yZSBhbmQgaGFzCisJCQkJICAgICAgbm8gbWVhbmluZyAqLworCSAgTG9uZyBDc2F2ZWRGUFNDUjsJLyogMjkgKi8KKwkgIExvbmcgQ3NhdmVkTVE7CS8qIDMwICovCisJICBMb25nIENzYXZlZEJBVDBVOwkvKiAzMSAqLworCSAgTG9uZyBDc2F2ZWRCQVQwTDsJLyogMzIgKi8KKwkgIExvbmcgQ3NhdmVkQkFUMVU7CS8qIDMzICovCisJICBMb25nIENzYXZlZEJBVDFMOwkvKiAzNCAqLworCSAgTG9uZyBDc2F2ZWRCQVQyVTsJLyogMzUgKi8KKwkgIExvbmcgQ3NhdmVkQkFUMkw7CS8qIDM2ICovCisJICBMb25nIENzYXZlZEJBVDNVOwkvKiAzNyAqLworCSAgTG9uZyBDc2F2ZWRCQVQzTDsJLyogMzggKi8KKwl9CisgICAgICBTcGVjaWFsUmVnaXN0ZXJzRW51bWVyYXRlZDsKKworICAgICAgTG9uZyBTcGVjaWFsUmVnaXN0ZXJzSW5kZXhlZFtrTnVtYmVyU3BlY2lhbFJlZ2lzdGVyc107CisgICAgfSB1OworCisgIExvbmcgUGFkZGluZ1szXTsJCS8qIE5lZWRlZCBmb3IgcXVhZC13b3JkIGFsaWdubWVudCAqLworfTsKKworc3RydWN0IFN0YWNrRnJhbWUKK3sKKyAgTE9ORyAqRXhjZXB0aW9uRG9tYWluSUQ7CisgIC8qUHJvY2Vzc29yU3RydWN0dXJlKi8gaW50ICpFeGNlcHRpb25Qcm9jZXNzb3JJRDsKKyAgQllURSAqRXhjZXB0aW9uRGVzY3JpcHRpb247CisgIExPTkcgRXhjZXB0aW9uRmxhZ3M7CisgIExPTkcgRXhjZXB0aW9uRXJyb3JDb2RlOworICBMT05HIEV4Y2VwdGlvbk51bWJlcjsKKyAgc3RydWN0IFNhdmVkTWFjaGluZVN0YXRlIEV4Y2VwdGlvblN0YXRlOworfTsKKworLyogUmVnaXN0ZXIgdmFsdWVzLiAgQWxsIG9mIHRoZXNlIHZhbHVlcyAqTVVTVCogYWdyZWUgd2l0aCB0bS5oICovCisjZGVmaW5lCUdQMF9SRUdOVU0gMAkJLyogR1BSIHJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgU1BfUkVHTlVNIDEJCS8qIENvbnRhaW5zIGFkZHJlc3Mgb2YgdG9wIG9mIHN0YWNrICovCisjZGVmaW5lIEZQMF9SRUdOVU0gMzIJCS8qIEZQUiAoRmxvYXRpbmcgcG9pbnQpIHJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgUENfUkVHTlVNIDY0CQkvKiBDb250YWlucyBwcm9ncmFtIGNvdW50ZXIgKi8KKyNkZWZpbmUgUFNfUkVHTlVNIDY1CQkvKiBQcm9jZXNzb3IgKG9yIG1hY2hpbmUpIHN0YXR1cyAoJW1zcikgKi8KKyNkZWZpbmUJQ1JfUkVHTlVNIDY2CQkvKiBDb25kaXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUJTFJfUkVHTlVNIDY3CQkvKiBMaW5rIHJlZ2lzdGVyICovCisjZGVmaW5lCUNUUl9SRUdOVU0gNjgJCS8qIENvdW50IHJlZ2lzdGVyICovCisjZGVmaW5lCVhFUl9SRUdOVU0gNjkJCS8qIEZpeGVkIHBvaW50IGV4Y2VwdGlvbiByZWdpc3RlcnMgKi8KKyNkZWZpbmUJTVFfUkVHTlVNIDcwCQkvKiBNdWx0aXBseS9xdW90aWVudCByZWdpc3RlciAqLworI2RlZmluZSBOVU1fUkVHUyA3MQkJLyogTnVtYmVyIG9mIG1hY2hpbmUgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJFR0lTVEVSX0JZVEVTICg0MjApCS8qIFRvdGFsIHNpemUgb2YgcmVnaXN0ZXJzIGFycmF5ICovCisKKyNkZWZpbmUgRXhjZXB0aW9uUEMgRXhjZXB0aW9uU3RhdGUudS5TcGVjaWFsUmVnaXN0ZXJzRW51bWVyYXRlZC5Dc2F2ZWRTUlIwCisjZGVmaW5lIERFQ1JfUENfQUZURVJfQlJFQUsgMAkvKiBQUENzIGdldCB0aGlzIHJpZ2h0ISAqLworI2RlZmluZSBCUkVBS1BPSU5UIHsweDdkLCAweDgyLCAweDEwLCAweDA4fQorZXh0ZXJuIHVuc2lnbmVkIGNoYXIgYnJlYWtwb2ludF9pbnNuW107CisjZGVmaW5lIEJSRUFLUE9JTlRfU0laRSA0CisKKyNpZiAwCisjZGVmaW5lIEFMVEVSTkFURV9NRU1fRlVOQ1MJLyogV2UgbmVlZCBvdXIgb3duIGdldF9jaGFyL3NldF9jaGFyICovCisjZW5kaWYKKworZXh0ZXJuIGludCBnZXRfY2hhciAoY2hhciAqYWRkcik7CitleHRlcm4gdm9pZCBzZXRfY2hhciAoY2hhciAqYWRkciwgaW50IHZhbCk7CmRpZmYgLS1naXQgYS9nZGIvbmxtL3ByZWx1ZGUuYyBiL2dkYi9ubG0vcHJlbHVkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZTEyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbmxtL3ByZWx1ZGUuYwpAQCAtMCwwICsxLDY3IEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorPQlOb3ZlbGwgU3RhbmRhcmQgQyBMaWJyYXJ5IGZvciBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZXMKKz0KKz0JVW5wdWJsaXNoZWQgQ29weXJpZ2h0IChDKSAxOTkzIGJ5IE5vdmVsbCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorPQorPQlObyBwYXJ0IG9mIHRoaXMgZmlsZSBtYXkgYmUgZHVwbGljYXRlZCwgcmV2aXNlZCwgdHJhbnNsYXRlZCwgbG9jYWxpemVkIG9yCis9CW1vZGlmaWVkIGluIGFueSBtYW5uZXIgb3IgY29tcGlsZWQsIGxpbmtlZCBvciB1cGxvYWRlZCBvciBkb3dubG9hZGVkIHRvIG9yCis9CWZyb20gYW55IGNvbXB1dGVyIHN5c3RlbSB3aXRob3V0IHRoZSBwcmlvciB3cml0dGVuIGNvbnNlbnQgb2YgTm92ZWxsLCBJbmMuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKz0JVGhlIG9iamVjdCBwcm9kdWNlZCBieSBjb21waWxpbmcgdGhpcyBmaWxlIGlzIGZvciB1c2UgYnkgdGhlIGNsaWVudCBvZiB0aGlzCis9CWxpYnJhcnkgYW5kIGlzIG5vdCBsaW5rZWQgaW47ICBQcmVsdWRlLk9iaiBpcyB0aGVyZWZvcmUgb25lIG9mIHRoZSBmaWxlcyB0bworPQliZSBkaXN0cmlidXRlZCB3aXRoIENMaWIuTkxNIGFuZCBpdHMgaGVhZGVycy4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2lmIGRlZmluZWQoX19uZXR3YXJlX18pICYmIGRlZmluZWQoX19pMzg2X18pCisjZGVmaW5lIFRFUk1JTkFURV9CWV9VTkxPQUQJNQorI2Vsc2UKKyNpbmNsdWRlIDxud3ByZS5oPgorI2VuZGlmCisvKiNpbmNsdWRlICJsaWJob29rcy5oIiovCisKK2V4dGVybiBpbnQgbWFpbiAoaW50LCBjaGFyICoqKTsKKworc3RhdGljIGludAlOTE1JRDsKKworCit2b2lkIF9TdG9wKCB2b2lkICkKK3sKKwlfVGVybWluYXRlTkxNKE5MTUlELCBOVUxMLCBURVJNSU5BVEVfQllfVU5MT0FEKTsKK30KKworaW50IF9jc3RhcnRfKCB2b2lkICkKK3sKKyAgIHJldHVybiBfU2V0dXBBcmd2KG1haW4pOworfQorCitpbnQgX1ByZWx1ZGUKKygKKwlpbnQJTkxNSGFuZGxlLAorCWludAlpbml0RXJyb3JTY3JlZW5JRCwKKwljaGFyCSpjb21tYW5kTGluZSwKKwljaGFyCSpsb2FkRGlyZWN0b3J5UGF0aCwKKwlpbnQJdW5pbml0aWFsaXplZERhdGFMZW5ndGgsCisJaW50CU5MTUZpbGVIYW5kbGUsCisJaW50CSgqcmVhZFJvdXRpbmVQKSgpLAorCWludAljdXN0b21EYXRhT2Zmc2V0LAorCWludAljdXN0b21EYXRhU2l6ZQorKQoreworCWludAlyYzsKKworICAgcmMgPSBfU3RhcnROTE0oTkxNSGFuZGxlLAorCQkJCQlpbml0RXJyb3JTY3JlZW5JRCwKKwkJCQkJY29tbWFuZExpbmUsCisJCQkJCWxvYWREaXJlY3RvcnlQYXRoLAorCQkJCQl1bmluaXRpYWxpemVkRGF0YUxlbmd0aCwKKwkJCQkJTkxNRmlsZUhhbmRsZSwKKwkJCQkJcmVhZFJvdXRpbmVQLAorCQkJCQljdXN0b21EYXRhT2Zmc2V0LAorCQkJCQljdXN0b21EYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICZOTE1JRCwKKwkJCQkJX2NzdGFydF8pOworCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvZ2RiL25sbXJlYWQuYyBiL2dkYi9ubG1yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZkZWE0MwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9ubG1yZWFkLmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qIFJlYWQgTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgZm9ybWF0IGV4ZWN1dGFibGUgZmlsZXMgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggYXQgQ3lnbnVzIFN1cHBvcnQgKGZuZkBjeWdudXMuY29tKS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJnZGItc3RhYnMuaCIKKyNpbmNsdWRlICJidWlsZHN5bS5oIgorI2luY2x1ZGUgInN0YWJzcmVhZC5oIgorCitzdGF0aWMgdm9pZAorbmxtX25ld19pbml0IFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQKK25sbV9zeW1maWxlX2luaXQgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZAorbmxtX3N5bWZpbGVfcmVhZCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICosIGludCkpOworCitzdGF0aWMgdm9pZAorbmxtX3N5bWZpbGVfZmluaXNoIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQKK25sbV9zeW10YWJfcmVhZCBQQVJBTVMgKChiZmQgKiwgIENPUkVfQUREUiwgc3RydWN0IG9iamZpbGUgKikpOworCisvKiBJbml0aWFsaXplIGFueXRoaW5nIHRoYXQgbmVlZHMgaW5pdGlhbGl6aW5nIHdoZW4gYSBjb21wbGV0ZWx5IG5ldyBzeW1ib2wKKyAgIGZpbGUgaXMgc3BlY2lmaWVkIChub3QganVzdCBhZGRpbmcgc29tZSBzeW1ib2xzIGZyb20gYW5vdGhlciBmaWxlLCBlLmcuIGEKKyAgIHNoYXJlZCBsaWJyYXJ5KS4KKworICAgV2UgcmVpbml0aWFsaXplIGJ1aWxkc3ltLCBzaW5jZSBnZGIgd2lsbCBiZSBhYmxlIHRvIHJlYWQgc3RhYnMgZnJvbSBhbiBOTE0KKyAgIGZpbGUgYXQgc29tZSBwb2ludCBpbiB0aGUgbmVhciBmdXR1cmUuICAqLworCitzdGF0aWMgdm9pZAorbmxtX25ld19pbml0IChpZ25vcmUpCisgICAgIHN0cnVjdCBvYmpmaWxlICppZ25vcmU7Cit7CisgIHN0YWJzcmVhZF9uZXdfaW5pdCAoKTsKKyAgYnVpbGRzeW1fbmV3X2luaXQgKCk7Cit9CisKKworLyogTkxNIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIHJlYWRpbmcgc3ltYm9scy4KKworICAgSXQgaXMgcGFzc2VkIGEgcG9pbnRlciB0byBhIHN0cnVjdCBzeW1fZm5zIHdoaWNoIGNvbnRhaW5zLCBhbW9uZyBvdGhlcgorICAgdGhpbmdzLCB0aGUgQkZEIGZvciB0aGUgZmlsZSB3aG9zZSBzeW1ib2xzIGFyZSBiZWluZyByZWFkLCBhbmQgYSBzbG90IGZvcgorICAgYSBwb2ludGVyIHRvICJwcml2YXRlIGRhdGEiIHdoaWNoIHdlIGNhbiBmaWxsIHdpdGggZ29vZGllcy4KKworICAgRm9yIG5vdyBhdCBsZWFzdCwgd2UgaGF2ZSBub3RoaW5nIGluIHBhcnRpY3VsYXIgdG8gZG8sIHNvIHRoaXMgZnVuY3Rpb24gaXMKKyAgIGp1c3QgYSBzdHViLiAqLworCitzdGF0aWMgdm9pZAorbmxtX3N5bWZpbGVfaW5pdCAoaWdub3JlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqaWdub3JlOworeworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJbmxtX3N5bXRhYl9yZWFkIC0tIHJlYWQgdGhlIHN5bWJvbCB0YWJsZSBvZiBhbiBOTE0gZmlsZQorCitTWU5PUFNJUworCisJdm9pZCBubG1fc3ltdGFiX3JlYWQgKGJmZCAqYWJmZCwgQ09SRV9BRERSIGFkZHIsCisJCQkgICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSkKKworREVTQ1JJUFRJT04KKworCUdpdmVuIGFuIG9wZW4gYmZkLCBhIGJhc2UgYWRkcmVzcyB0byByZWxvY2F0ZSBzeW1ib2xzIHRvLCBhbmQgYQorCWZsYWcgdGhhdCBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBiZmQgaXMgZm9yIGFuIGV4ZWN1dGFibGUKKwlvciBub3QgKG1heSBiZSBzaGFyZWQgbGlicmFyeSBmb3IgZXhhbXBsZSksIGFkZCBhbGwgdGhlIGdsb2JhbAorCWZ1bmN0aW9uIGFuZCBkYXRhIHN5bWJvbHMgdG8gdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlLgorKi8KKworc3RhdGljIHZvaWQKK25sbV9zeW10YWJfcmVhZCAoYWJmZCwgYWRkciwgb2JqZmlsZSkKKyAgICAgYmZkICphYmZkOworICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIGxvbmcgc3RvcmFnZV9uZWVkZWQ7CisgIGFzeW1ib2wgKnN5bTsKKyAgYXN5bWJvbCAqKnN5bWJvbF90YWJsZTsKKyAgbG9uZyBudW1iZXJfb2Zfc3ltYm9sczsKKyAgbG9uZyBpOworICBzdHJ1Y3QgY2xlYW51cCAqYmFja190bzsKKyAgQ09SRV9BRERSIHN5bWFkZHI7CisgIGVudW0gbWluaW1hbF9zeW1ib2xfdHlwZSBtc190eXBlOworICAKKyAgc3RvcmFnZV9uZWVkZWQgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7CisgIGlmIChzdG9yYWdlX25lZWRlZCA8IDApCisgICAgZXJyb3IgKCJDYW4ndCByZWFkIHN5bWJvbHMgZnJvbSAlczogJXMiLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKKwkgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgIGlmIChzdG9yYWdlX25lZWRlZCA+IDApCisgICAgeworICAgICAgc3ltYm9sX3RhYmxlID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN0b3JhZ2VfbmVlZGVkKTsKKyAgICAgIGJhY2tfdG8gPSBtYWtlX2NsZWFudXAgKGZyZWUsIHN5bWJvbF90YWJsZSk7CisgICAgICBudW1iZXJfb2Zfc3ltYm9scyA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChhYmZkLCBzeW1ib2xfdGFibGUpOyAKKyAgICAgIGlmIChudW1iZXJfb2Zfc3ltYm9scyA8IDApCisJZXJyb3IgKCJDYW4ndCByZWFkIHN5bWJvbHMgZnJvbSAlczogJXMiLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKKwkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICAKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2Zfc3ltYm9sczsgaSsrKQorCXsKKwkgIHN5bSA9IHN5bWJvbF90YWJsZVtpXTsKKwkgIGlmICgvKnN5bSAtPiBmbGFncyAmIEJTRl9HTE9CQUwqLyAxKQorCSAgICB7CisJICAgICAgLyogQmZkIHN5bWJvbHMgYXJlIHNlY3Rpb24gcmVsYXRpdmUuICovCisJICAgICAgc3ltYWRkciA9IHN5bSAtPiB2YWx1ZSArIHN5bSAtPiBzZWN0aW9uIC0+IHZtYTsKKwkgICAgICAvKiBSZWxvY2F0ZSBhbGwgbm9uLWFic29sdXRlIHN5bWJvbHMgYnkgYmFzZSBhZGRyZXNzLiAgKi8KKwkgICAgICBpZiAoc3ltIC0+IHNlY3Rpb24gIT0gJmJmZF9hYnNfc2VjdGlvbikKKwkJc3ltYWRkciArPSBhZGRyOworCisJICAgICAgLyogRm9yIG5vbi1hYnNvbHV0ZSBzeW1ib2xzLCB1c2UgdGhlIHR5cGUgb2YgdGhlIHNlY3Rpb24KKwkJIHRoZXkgYXJlIHJlbGF0aXZlIHRvLCB0byBpbnR1aXQgdGV4dC9kYXRhLiAgQkZEIHByb3ZpZGVzCisJCSBubyB3YXkgb2YgZmlndXJpbmcgdGhpcyBvdXQgZm9yIGFic29sdXRlIHN5bWJvbHMuICovCisJICAgICAgaWYgKHN5bSAtPiBzZWN0aW9uIC0+IGZsYWdzICYgU0VDX0NPREUpCisJCW1zX3R5cGUgPSBtc3RfdGV4dDsKKwkgICAgICBlbHNlIGlmIChzeW0gLT4gc2VjdGlvbiAtPiBmbGFncyAmIFNFQ19EQVRBKQorCQltc190eXBlID0gbXN0X2RhdGE7CisJICAgICAgZWxzZQorCQltc190eXBlID0gbXN0X3Vua25vd247CisKKwkgICAgICBwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbCAoc3ltIC0+IG5hbWUsIHN5bWFkZHIsIG1zX3R5cGUsCisJCQkJCSAgb2JqZmlsZSk7CisJICAgIH0KKwl9CisgICAgICBkb19jbGVhbnVwcyAoYmFja190byk7CisgICAgfQorfQorCisKKy8qIFNjYW4gYW5kIGJ1aWxkIHBhcnRpYWwgc3ltYm9scyBmb3IgYSBzeW1ib2wgZmlsZS4KKyAgIFdlIGhhdmUgYmVlbiBpbml0aWFsaXplZCBieSBhIGNhbGwgdG8gbmxtX3N5bWZpbGVfaW5pdCwgd2hpY2ggCisgICBjdXJyZW50bHkgZG9lcyBub3RoaW5nLgorCisgICBTRUNUSU9OX09GRlNFVFMgaXMgYSBzZXQgb2Ygb2Zmc2V0cyB0byBhcHBseSB0byByZWxvY2F0ZSB0aGUgc3ltYm9scworICAgaW4gZWFjaCBzZWN0aW9uLiAgV2Ugc2ltcGxpZnkgaXQgZG93biB0byBhIHNpbmdsZSBvZmZzZXQgZm9yIGFsbAorICAgc3ltYm9scy4gIEZJWE1FLgorCisgICBNQUlOTElORSBpcyB0cnVlIGlmIHdlIGFyZSByZWFkaW5nIHRoZSBtYWluIHN5bWJvbAorICAgdGFibGUgKGFzIG9wcG9zZWQgdG8gYSBzaGFyZWQgbGliIG9yIGR5bmFtaWNhbGx5IGxvYWRlZCBmaWxlKS4KKworICAgVGhpcyBmdW5jdGlvbiBvbmx5IGRvZXMgdGhlIG1pbmltdW0gd29yayBuZWNlc3NhcnkgZm9yIGxldHRpbmcgdGhlCisgICB1c2VyICJuYW1lIiB0aGluZ3Mgc3ltYm9saWNhbGx5OyBpdCBkb2VzIG5vdCByZWFkIHRoZSBlbnRpcmUgc3ltdGFiLgorICAgSW5zdGVhZCwgaXQgcmVhZHMgdGhlIGV4dGVybmFsIGFuZCBzdGF0aWMgc3ltYm9scyBhbmQgcHV0cyB0aGVtIGluIHBhcnRpYWwKKyAgIHN5bWJvbCB0YWJsZXMuICBXaGVuIG1vcmUgZXh0ZW5zaXZlIGluZm9ybWF0aW9uIGlzIHJlcXVlc3RlZCBvZiBhCisgICBmaWxlLCB0aGUgY29ycmVzcG9uZGluZyBwYXJ0aWFsIHN5bWJvbCB0YWJsZSBpcyBtdXRhdGVkIGludG8gYSBmdWxsCisgICBmbGVkZ2VkIHN5bWJvbCB0YWJsZSBieSBnb2luZyBiYWNrIGFuZCByZWFkaW5nIHRoZSBzeW1ib2xzCisgICBmb3IgcmVhbC4KKworICAgTm90ZSB0aGF0IE5MTSBmaWxlcyBoYXZlIHR3byBzZXRzIG9mIGluZm9ybWF0aW9uIHRoYXQgaXMgcG90ZW50aWFsbHkKKyAgIHVzZWZ1bCBmb3IgYnVpbGRpbmcgZ2RiJ3MgbWluaW1hbCBzeW1ib2wgdGFibGUuICBUaGUgZmlyc3QgaXMgYSBsaXN0CisgICBvZiB0aGUgcHVibGljYWxseSBleHBvcnRlZCBzeW1ib2xzLCBhbmQgaXMgY3VycmVudGx5IHVzZWQgdG8gYnVpbGQKKyAgIGJmZCdzIGNhbm9uaWNhbCBzeW1ib2wgdGFibGUuICBUaGUgc2Vjb25kIGlzIGFuIG9wdGlvbmFsIG5hdGl2ZSBkZWJ1Z2dpbmcKKyAgIGZvcm1hdCB3aGljaCBjb250YWlucyBhZGRpdGlvbmFsIHN5bWJvbHMgKGFuZCBwb3NzaWJseSBkdXBsaWNhdGVzIG9mCisgICB0aGUgcHVibGljYWxseSBleHBvcnRlZCBzeW1ib2xzKS4gIFRoZSBvcHRpb25hbCBuYXRpdmUgZGVidWdnaW5nIGZvcm1hdAorICAgaXMgbm90IGN1cnJlbnRseSB1c2VkLiAqLworCitzdGF0aWMgdm9pZAorbmxtX3N5bWZpbGVfcmVhZCAob2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzLCBtYWlubGluZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKyAgICAgaW50IG1haW5saW5lOworeworICBiZmQgKmFiZmQgPSBvYmpmaWxlIC0+IG9iZmQ7CisgIHN0cnVjdCBjbGVhbnVwICpiYWNrX3RvOworICBDT1JFX0FERFIgb2Zmc2V0OworICBzdHJ1Y3Qgc3ltYm9sICptYWluc3ltOworCisgIGluaXRfbWluaW1hbF9zeW1ib2xfY29sbGVjdGlvbiAoKTsKKyAgYmFja190byA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBkaXNjYXJkX21pbmltYWxfc3ltYm9scywgMCk7CisKKyAgLyogRklYTUUsIHNob3VsZCB0YWtlIGEgc2VjdGlvbl9vZmZzZXRzIHBhcmFtLCBub3QganVzdCBhbiBvZmZzZXQuICAqLworCisgIG9mZnNldCA9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIDApOworCisgIC8qIFByb2Nlc3MgdGhlIE5MTSBleHBvcnQgcmVjb3Jkcywgd2hpY2ggYmVjb21lIHRoZSBiZmQncyBjYW5vbmljYWwgc3ltYm9sCisgICAgIHRhYmxlLiAqLworCisgIG5sbV9zeW10YWJfcmVhZCAoYWJmZCwgb2Zmc2V0LCBvYmpmaWxlKTsKKworICBzdGFic2VjdF9idWlsZF9wc3ltdGFicyAob2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzLCBtYWlubGluZSwgIi5zdGFiIiwKKwkJCSAgICIuc3RhYnN0ciIsICIudGV4dCIpOworCisgIG1haW5zeW0gPSBsb29rdXBfc3ltYm9sICgibWFpbiIsIE5VTEwsIFZBUl9OQU1FU1BBQ0UsIE5VTEwsIE5VTEwpOworCisgIGlmIChtYWluc3ltCisgICAgICAmJiBTWU1CT0xfQ0xBU1MobWFpbnN5bSkgPT0gTE9DX0JMT0NLKQorICAgIHsKKyAgICAgIG9iamZpbGUtPmVpLm1haW5fZnVuY19sb3dwYyA9IEJMT0NLX1NUQVJUIChTWU1CT0xfQkxPQ0tfVkFMVUUgKG1haW5zeW0pKTsKKyAgICAgIG9iamZpbGUtPmVpLm1haW5fZnVuY19oaWdocGMgPSBCTE9DS19FTkQgKFNZTUJPTF9CTE9DS19WQUxVRSAobWFpbnN5bSkpOworICAgIH0KKworICAvKiBGSVhNRTogIFdlIGNvdWxkIGxvY2F0ZSBhbmQgcmVhZCB0aGUgb3B0aW9uYWwgbmF0aXZlIGRlYnVnZ2luZyBmb3JtYXQKKyAgICAgaGVyZSBhbmQgYWRkIHRoZSBzeW1ib2xzIHRvIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZS4gKi8KKworICAvKiBJbnN0YWxsIGFueSBtaW5pbWFsIHN5bWJvbHMgdGhhdCBoYXZlIGJlZW4gY29sbGVjdGVkIGFzIHRoZSBjdXJyZW50CisgICAgIG1pbmltYWwgc3ltYm9scyBmb3IgdGhpcyBvYmpmaWxlLiAqLworCisgIGluc3RhbGxfbWluaW1hbF9zeW1ib2xzIChvYmpmaWxlKTsKKworICBkb19jbGVhbnVwcyAoYmFja190byk7Cit9CisKKworLyogUGVyZm9ybSBhbnkgbG9jYWwgY2xlYW51cHMgcmVxdWlyZWQgd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIGEgcGFydGljdWxhcgorICAgb2JqZmlsZS4gIEkuRSwgd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGRpc2NhcmRpbmcgYWxsIHN5bWJvbCBpbmZvcm1hdGlvbgorICAgZm9yIGFuIG9iamZpbGUsIGZyZWVpbmcgdXAgYWxsIG1lbW9yeSBoZWxkIGZvciBpdCwgYW5kIHVubGlua2luZyB0aGUKKyAgIG9iamZpbGUgc3RydWN0IGZyb20gdGhlIGdsb2JhbCBsaXN0IG9mIGtub3duIG9iamZpbGVzLiAqLworCitzdGF0aWMgdm9pZAorbmxtX3N5bWZpbGVfZmluaXNoIChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaWYgKG9iamZpbGUgLT4gc3ltX3ByaXZhdGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBtZnJlZSAob2JqZmlsZSAtPiBtZCwgb2JqZmlsZSAtPiBzeW1fcHJpdmF0ZSk7CisgICAgfQorfQorCisvKiBSZWdpc3RlciB0aGF0IHdlIGFyZSBhYmxlIHRvIGhhbmRsZSBOTE0gZmlsZSBmb3JtYXQuICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3ltX2ZucyBubG1fc3ltX2ZucyA9Cit7CisgIGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIsCisgIG5sbV9uZXdfaW5pdCwJCS8qIHN5bV9uZXdfaW5pdDogaW5pdCBhbnl0aGluZyBnYmwgdG8gZW50aXJlIHN5bXRhYiAqLworICBubG1fc3ltZmlsZV9pbml0LAkvKiBzeW1faW5pdDogcmVhZCBpbml0aWFsIGluZm8sIHNldHVwIGZvciBzeW1fcmVhZCgpICovCisgIG5sbV9zeW1maWxlX3JlYWQsCS8qIHN5bV9yZWFkOiByZWFkIGEgc3ltYm9sIGZpbGUgaW50byBzeW10YWIgKi8KKyAgbmxtX3N5bWZpbGVfZmluaXNoLAkvKiBzeW1fZmluaXNoOiBmaW5pc2hlZCB3aXRoIGZpbGUsIGNsZWFudXAgKi8KKyAgZGVmYXVsdF9zeW1maWxlX29mZnNldHMsCisJCQkvKiBzeW1fb2Zmc2V0czogIFRyYW5zbGF0ZSBleHQuIHRvIGludC4gcmVsb2NhdGlvbiAqLworICBOVUxMCQkJLyogbmV4dDogcG9pbnRlciB0byBuZXh0IHN0cnVjdCBzeW1fZm5zICovCit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9ubG1yZWFkICgpCit7CisgIGFkZF9zeW10YWJfZm5zICgmbmxtX3N5bV9mbnMpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL25vdGlmeS5kZWZzIGIvZ2RiL25vdGlmeS5kZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMTRiZTUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvbm90aWZ5LmRlZnMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPG1hY2gvbm90aWZ5LmRlZnM+CmRpZmYgLS1naXQgYS9nZGIvbnMzMmstdGRlcC5jIGIvZ2RiL25zMzJrLXRkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWRiN2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL25zMzJrLXRkZXAuYwpAQCAtMCwwICsxLDEyMiBAQAorLyogUHJpbnQgTlMgMzIwMDAgaW5zdHJ1Y3Rpb25zIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4OCwgMTk5MSwgMTk5MiwgMTk5NCwgMTk5NQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKwordm9pZAorX2luaXRpYWxpemVfbnMzMmtfdGRlcCAoKQoreworICB0bV9wcmludF9pbnNuID0gcHJpbnRfaW5zbl9uczMyazsKK30KKworc2lnbl9leHRlbmQgKHZhbHVlLCBiaXRzKQoreworICB2YWx1ZSA9IHZhbHVlICYgKCgxIDw8IGJpdHMpIC0gMSk7CisgIHJldHVybiAodmFsdWUgJiAoMSA8PCAoYml0cy0xKSkKKwkgID8gdmFsdWUgfCAofigoMSA8PCBiaXRzKSAtIDEpKQorCSAgOiB2YWx1ZSk7Cit9CisKK3ZvaWQKK2ZsaXBfYnl0ZXMgKHB0ciwgY291bnQpCisgICAgIGNoYXIgKnB0cjsKKyAgICAgaW50IGNvdW50OworeworICBjaGFyIHRtcDsKKworICB3aGlsZSAoY291bnQgPiAwKQorICAgIHsKKyAgICAgIHRtcCA9ICpwdHI7CisgICAgICBwdHJbMF0gPSBwdHJbY291bnQtMV07CisgICAgICBwdHJbY291bnQtMV0gPSB0bXA7CisgICAgICBwdHIrKzsKKyAgICAgIGNvdW50IC09IDI7CisgICAgfQorfQorCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBsb2NhbHMgaW4gdGhlIGN1cnJlbnQgZnJhbWUgZ2l2ZW4gYSBwYworICAgcG9pbnRpbmcgdG8gdGhlIGVudGVyIGluc3RydWN0aW9uLiAgVGhpcyBpcyB1c2VkIGluIHRoZSBtYWNybworICAgRlJBTUVfRklORF9TQVZFRF9SRUdTLiAgKi8KKworaW50CituczMya19sb2NhbGNvdW50IChlbnRlcl9wYykKKyAgICAgQ09SRV9BRERSIGVudGVyX3BjOworeworICB1bnNpZ25lZCBjaGFyIGxvY2FsdHlwZTsKKyAgaW50IGxvY2FsY291bnQ7CisKKyAgbG9jYWx0eXBlID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoZW50ZXJfcGMrMiwgMSk7CisgIGlmICgobG9jYWx0eXBlICYgMHg4MCkgPT0gMCkKKyAgICBsb2NhbGNvdW50ID0gbG9jYWx0eXBlOworICBlbHNlIGlmICgobG9jYWx0eXBlICYgMHhjMCkgPT0gMHg4MCkKKyAgICBsb2NhbGNvdW50ID0gKCgobG9jYWx0eXBlICYgMHgzZikgPDwgOCkKKwkJICB8IChyZWFkX21lbW9yeV9pbnRlZ2VyIChlbnRlcl9wYyszLCAxKSAmIDB4ZmYpKTsKKyAgZWxzZQorICAgIGxvY2FsY291bnQgPSAoKChsb2NhbHR5cGUgJiAweDNmKSA8PCAyNCkKKwkJICB8ICgocmVhZF9tZW1vcnlfaW50ZWdlciAoZW50ZXJfcGMrMywgMSkgJiAweGZmKSA8PCAxNikKKwkJICB8ICgocmVhZF9tZW1vcnlfaW50ZWdlciAoZW50ZXJfcGMrNCwgMSkgJiAweGZmKSA8PCA4ICkKKwkJICB8IChyZWFkX21lbW9yeV9pbnRlZ2VyIChlbnRlcl9wYys1LCAxKSAmIDB4ZmYpKTsKKyAgcmV0dXJuIGxvY2FsY291bnQ7Cit9CisKKworLyogTm9uemVybyBpZiBpbnN0cnVjdGlvbiBhdCBQQyBpcyBhIHJldHVybiBpbnN0cnVjdGlvbi4gICovCisKK3N0YXRpYyBpbnQKK25zMzJrX2Fib3V0X3RvX3JldHVybiAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgcmV0dXJuIChyZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgMSkgPT0gMHgxMik7Cit9CisKKworLyoKKyAqIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZW50ZXIgb3Bjb2RlIGZvciB0aGUgZnVuY3Rpb24KKyAqIGNvbnRhaW5pbmcgUEMsIGlmIHRoZXJlIGlzIGFuIGVudGVyIGZvciB0aGUgZnVuY3Rpb24sCisgKiBhbmQgaWYgdGhlIHBjIGlzIGJldHdlZW4gdGhlIGVudGVyIGFuZCBleGl0LgorICogUmV0dXJucyBwb3NpdGl2ZSBhZGRyZXNzIGlmIHBjIGlzIGJldHdlZW4gZW50ZXIvZXhpdCwKKyAqIDEgaWYgcGMgYmVmb3JlIGVudGVyIG9yIGFmdGVyIGV4aXQsIDAgb3RoZXJ3aXNlLgorICovCisKK0NPUkVfQUREUgorbnMzMmtfZ2V0X2VudGVyX2FkZHIgKHBjKQorICAgICBDT1JFX0FERFIgcGM7Cit7CisgIENPUkVfQUREUiBlbnRlcl9hZGRyOworICB1bnNpZ25lZCBjaGFyIG9wOworCisgIGlmIChwYyA9PSAwKQorICAgIHJldHVybiAwOworCisgIGlmIChuczMya19hYm91dF90b19yZXR1cm4gKHBjKSkKKyAgICByZXR1cm4gMTsJCS8qIGFmdGVyIGV4aXQgKi8KKworICBlbnRlcl9hZGRyID0gZ2V0X3BjX2Z1bmN0aW9uX3N0YXJ0IChwYyk7CisKKyAgaWYgKHBjID09IGVudGVyX2FkZHIpIAorICAgIHJldHVybiAxOwkJLyogYmVmb3JlIGVudGVyICovCisKKyAgb3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChlbnRlcl9hZGRyLCAxKTsKKworICBpZiAob3AgIT0gMHg4MikKKyAgICByZXR1cm4gMDsJCS8qIGZ1bmN0aW9uIGhhcyBubyBlbnRlci9leGl0ICovCisKKyAgcmV0dXJuIGVudGVyX2FkZHI7CS8qIHBjIGlzIGJldHdlZW4gZW50ZXIgYW5kIGV4aXQgKi8KK30KZGlmZiAtLWdpdCBhL2dkYi9uczMya20zLW5hdC5jIGIvZ2RiL25zMzJrbTMtbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhZmI5YwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9uczMya20zLW5hdC5jCkBAIC0wLDAgKzEsMTgzIEBACisvKiBMb3cgbGV2ZWwgaW50ZXJmYWNlIHRvIG5zNTMyIHJ1bm5pbmcgbWFjaCAzLjAuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG1hY2guaD4KKyNpbmNsdWRlIDxtYWNoL21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtYWNoL2V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPG1hY2hfZXJyb3IuaD4KKworI2RlZmluZSBwcml2YXRlIHN0YXRpYworCisMCisvKiBGaW5kIG9mZnNldHMgdG8gdGhyZWFkIHN0YXRlcyBhdCBjb21waWxlIHRpbWUuCisgKiBJZiB5b3VyIGNvbXBpbGVyIGRvZXMgbm90IGdyb2sgdGhpcywgY2FsY3VsYXRlIG9mZnNldHMKKyAqIG9mZnNldHMgeW91cnNlbGYgYW5kIHVzZSB0aGVtIChvciBnZXQgYSBjb21wYXRpYmxlIGNvbXBpbGVyIDotKQorICovCisKKyNkZWZpbmUgIFJFR19OX09GRlNFVChyZWcpIChpbnQpKCYoKHN0cnVjdCBuczUzMl9jb21iaW5lZF9zdGF0ZSAqKTApLT50cy5yZWcpCisjZGVmaW5lICBSRUdfRl9PRkZTRVQocmVnKSAoaW50KSgmKChzdHJ1Y3QgbnM1MzJfY29tYmluZWRfc3RhdGUgKikwKS0+ZnMucmVnKQorCisvKiBhdCByZWdfb2Zmc2V0W2ldIGlzIHRoZSBvZmZzZXQgdG8gdGhlIG5zNTMyX2NvbWJpbmVkX3N0YXRlCisgKiBsb2NhdGlvbiB3aGVyZSB0aGUgZ2RiIHJlZ2lzdGVyc1tpXSBpcyBzdG9yZWQuCisgKi8KKworc3RhdGljIGludCByZWdfb2Zmc2V0W10gPSAKK3sKKyAgUkVHX05fT0ZGU0VUKHIwKSwgIFJFR19OX09GRlNFVChyMSksIFJFR19OX09GRlNFVChyMiksIFJFR19OX09GRlNFVChyMyksCisgIFJFR19OX09GRlNFVChyNCksICBSRUdfTl9PRkZTRVQocjUpLCBSRUdfTl9PRkZTRVQocjYpLCBSRUdfTl9PRkZTRVQocjcpLAorICBSRUdfRl9PRkZTRVQobDBhKSwgUkVHX0ZfT0ZGU0VUKGwwYiksUkVHX0ZfT0ZGU0VUKGwyYSksUkVHX0ZfT0ZGU0VUKGwyYiksCisgIFJFR19GX09GRlNFVChsNGEpLCBSRUdfRl9PRkZTRVQobDRiKSxSRUdfRl9PRkZTRVQobDZhKSxSRUdfRl9PRkZTRVQobDZiKSwKKyAgUkVHX05fT0ZGU0VUKHNwKSwgIFJFR19OX09GRlNFVChmcCksIFJFR19OX09GRlNFVChwYyksIFJFR19OX09GRlNFVChwc3IpLAorICBSRUdfRl9PRkZTRVQoZnNyKSwKKyAgUkVHX0ZfT0ZGU0VUKGwwYSksIFJFR19GX09GRlNFVChsMWEpLFJFR19GX09GRlNFVChsMmEpLFJFR19GX09GRlNFVChsM2EpLAorICBSRUdfRl9PRkZTRVQobDRhKSwgUkVHX0ZfT0ZGU0VUKGw1YSksUkVHX0ZfT0ZGU0VUKGw2YSksUkVHX0ZfT0ZGU0VUKGw3YSksCit9OworCisjZGVmaW5lIFJFR19BRERSRVNTKHN0YXRlLHJlZ251bSkgKChjaGFyICopKHN0YXRlKStyZWdfb2Zmc2V0W3JlZ251bV0pCisKKy8qIEZldGNoIENPVU5UIGNvbnRpZ3VvdXMgcmVnaXN0ZXJzIGZyb20gdGhyZWFkIFNUQVRFIHN0YXJ0aW5nIGZyb20gUkVHTlVNCisgKiBDYWxsZXIga25vd3MgdGhhdCB0aGUgcmVncyBoYW5kbGVkIGluIG9uZSB0cmFuc2FjdGlvbiBhcmUgb2Ygc2FtZSBzaXplLgorICovCisjZGVmaW5lIEZFVENIX1JFR1Moc3RhdGUsIHJlZ251bSwgY291bnQpIFwKKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ251bSldLCBcCisJICAoY2hhciAqKXN0YXRlK3JlZ19vZmZzZXRbIHJlZ251bSBdLCBcCisJICBjb3VudCpSRUdJU1RFUl9TSVpFKQorCisvKiBTdG9yZSBDT1VOVCBjb250aWd1b3VzIHJlZ2lzdGVycyB0byB0aHJlYWQgU1RBVEUgc3RhcnRpbmcgZnJvbSBSRUdOVU0gKi8KKyNkZWZpbmUgU1RPUkVfUkVHUyhzdGF0ZSwgcmVnbnVtLCBjb3VudCkgXAorICBtZW1jcHkgKChjaGFyICopc3RhdGUrcmVnX29mZnNldFsgcmVnbnVtIF0sIFwKKwkgICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnbnVtKV0sIFwKKwkgIGNvdW50KlJFR0lTVEVSX1NJWkUpCisMCisvKgorICogRmV0Y2ggaW5mZXJpb3JzIHJlZ2lzdGVycyBmb3IgZ2RiLgorICogUkVHTk8gc3BlY2lmaWVzIHdoaWNoIChhcyBnZGIgdmlld3MgaXQpIHJlZ2lzdGVyLCAtMSBmb3IgYWxsLgorICovCisKK3ZvaWQKK2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAga2Vybl9yZXR1cm5fdCByZXQ7CisgIHRocmVhZF9zdGF0ZV9kYXRhX3Qgc3RhdGU7CisgIHVuc2lnbmVkIGludCBzdGF0ZUNudCA9IE5TNTMyX0NPTUJJTkVEX1NUQVRFX0NPVU5UOworICBpbnQgaW5kZXg7CisgIAorICBpZiAoISBNQUNIX1BPUlRfVkFMSUQgKGN1cnJlbnRfdGhyZWFkKSkKKyAgICBlcnJvciAoImZldGNoIGluZmVyaW9yIHJlZ2lzdGVyczogSW52YWxpZCB0aHJlYWQiKTsKKworICBpZiAobXVzdF9zdXNwZW5kX3RocmVhZCkKKyAgICBzZXR1cF90aHJlYWQgKGN1cnJlbnRfdGhyZWFkLCAxKTsKKworICByZXQgPSB0aHJlYWRfZ2V0X3N0YXRlIChjdXJyZW50X3RocmVhZCwKKwkJCSAgTlM1MzJfQ09NQklORURfU1RBVEUsCisJCQkgIHN0YXRlLAorCQkJICAmc3RhdGVDbnQpOworCisgIGlmIChyZXQgIT0gS0VSTl9TVUNDRVNTKQorICAgIHdhcm5pbmcgKCJmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnM6ICVzICIsCisJICAgICBtYWNoX2Vycm9yX3N0cmluZyAocmV0KSk7CisjaWYgMAorICAvKiBJdCBtYXkgYmUgbW9yZSBlZmZlY3RpdmUgdG8gc3RvcmUgdmFsaWRhdGUgYWxsIG9mIHRoZW0sCisgICAqIHNpbmNlIHdlIGZldGNoZWQgdGhlbSBhbGwgYW55d2F5CisgICAqLworICBlbHNlIGlmIChyZWdubyAhPSAtMSkKKyAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCAoY2hhciAqKXN0YXRlK3JlZ19vZmZzZXRbcmVnbm9dKTsKKyNlbmRpZgorICBlbHNlCisgICAgeworICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX1JFR1M7IGluZGV4KyspIAorCXN1cHBseV9yZWdpc3RlciAoaW5kZXgsIChjaGFyICopc3RhdGUrcmVnX29mZnNldFtpbmRleF0pOworICAgIH0KKworICBpZiAobXVzdF9zdXNwZW5kX3RocmVhZCkKKyAgICBzZXR1cF90aHJlYWQgKGN1cnJlbnRfdGhyZWFkLCAwKTsKK30KKwwKKy8qIFN0b3JlIG91ciByZWdpc3RlciB2YWx1ZXMgYmFjayBpbnRvIHRoZSBpbmZlcmlvci4KKyAqIElmIFJFR05PIGlzIC0xLCBkbyB0aGlzIGZvciBhbGwgcmVnaXN0ZXJzLgorICogT3RoZXJ3aXNlLCBSRUdOTyBzcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXIKKyAqCisgKiBPbiBtYWNoMyBhbGwgcmVnaXN0ZXJzIGFyZSBhbHdheXMgc2F2ZWQgaW4gb25lIGNhbGwuCisgKi8KK3ZvaWQKK3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAga2Vybl9yZXR1cm5fdCByZXQ7CisgIHRocmVhZF9zdGF0ZV9kYXRhX3Qgc3RhdGU7CisgIHVuc2lnbmVkIGludCBzdGF0ZUNudCA9IE5TNTMyX0NPTUJJTkVEX1NUQVRFX0NPVU5UOworICByZWdpc3RlciBpbnQgaW5kZXg7CisKKyAgaWYgKCEgTUFDSF9QT1JUX1ZBTElEIChjdXJyZW50X3RocmVhZCkpCisgICAgZXJyb3IgKCJzdG9yZSBpbmZlcmlvciByZWdpc3RlcnM6IEludmFsaWQgdGhyZWFkIik7CisKKyAgaWYgKG11c3Rfc3VzcGVuZF90aHJlYWQpCisgICAgc2V0dXBfdGhyZWFkIChjdXJyZW50X3RocmVhZCwgMSk7CisKKyAgLyogRmV0Y2ggdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IHRocmVhZCAqLworICByZXQgPSB0aHJlYWRfZ2V0X3N0YXRlIChjdXJyZW50X3RocmVhZCwKKwkJCSAgTlM1MzJfQ09NQklORURfU1RBVEUsCisJCQkgIHN0YXRlLAorCQkJICAmc3RhdGVDbnQpOworCisgICBpZiAocmV0ICE9IEtFUk5fU1VDQ0VTUykgCisgICAgeworICAgICAgd2FybmluZyAoInN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAoZ2V0KTogJXMiLAorCSAgICAgICBtYWNoX2Vycm9yX3N0cmluZyAocmV0KSk7CisgICAgICBpZiAobXVzdF9zdXNwZW5kX3RocmVhZCkKKwlzZXR1cF90aHJlYWQgKGN1cnJlbnRfdGhyZWFkLCAwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogbW92ZSBnZGIncyByZWdpc3RlcnMgdG8gdGhyZWFkJ3Mgc3RhdGUKKyAgICoKKyAgICogU2luY2Ugd2Ugc2F2ZSBhbGwgcmVnaXN0ZXJzIGFueXdheSwgc2F2ZSB0aGUgb25lcworICAgKiB0aGF0IGdkYiB0aGlua3MgYXJlIHZhbGlkIChlLmcuIGlnbm9yZSB0aGUgcmVnbm8KKyAgICogcGFyYW1ldGVyKQorICAgKi8KKyNpZiAwCisgIGlmIChyZWdubyAhPSAtMSkKKyAgICBTVE9SRV9SRUdTIChzdGF0ZSwgcmVnbm8sIDEpOworICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fUkVHUzsgaW5kZXgrKykgCisJU1RPUkVfUkVHUyAoc3RhdGUsIGluZGV4LCAxKTsKKyAgICB9CisgIAorICAvKiBXcml0ZSBnZGIncyBjdXJyZW50IHZpZXcgb2YgcmVnaXN0ZXIgdG8gdGhlIHRocmVhZAorICAgKi8KKyAgcmV0ID0gdGhyZWFkX3NldF9zdGF0ZSAoY3VycmVudF90aHJlYWQsCisJCQkgIE5TNTMyX0NPTUJJTkVEX1NUQVRFLAorCQkJICBzdGF0ZSwKKwkJCSAgTlM1MzJfQ09NQklORURfU1RBVEVfQ09VTlQpOworICAKKyAgaWYgKHJldCAhPSBLRVJOX1NVQ0NFU1MpCisgICAgd2FybmluZyAoInN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAoc2V0KTogJXMiLAorCSAgICAgbWFjaF9lcnJvcl9zdHJpbmcgKHJldCkpOworCisgIGlmIChtdXN0X3N1c3BlbmRfdGhyZWFkKQorICAgIHNldHVwX3RocmVhZCAoY3VycmVudF90aHJlYWQsIDApOworfQpkaWZmIC0tZ2l0IGEvZ2RiL25zMzJrbmJzZC1uYXQuYyBiL2dkYi9uczMya25ic2QtbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlmNzVjYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9uczMya25ic2QtbmF0LmMKQEAgLTAsMCArMSwzNTMgQEAKKy8qIEZ1bmN0aW9ucyBzcGVjaWZpYyB0byBydW5uaW5nIGdkYiBuYXRpdmUgb24gYW4gbnMzMmsgcnVubmluZyBOZXRCU0QKKyAgIENvcHlyaWdodCAxOTg5LCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisjaW5jbHVkZSA8bWFjaGluZS9yZWcuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL2ZyYW1lLmg+CisjaW5jbHVkZSA8bWFjaGluZS9wY2IuaD4KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKworI2RlZmluZSBSRihkc3QsIHNyYykgXAorCW1lbWNweSgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoZHN0KV0sICZzcmMsIHNpemVvZihzcmMpKQorCisjZGVmaW5lIFJTKHNyYywgZHN0KSBcCisJbWVtY3B5KCZkc3QsICZyZWdpc3RlcnNbUkVHSVNURVJfQllURShzcmMpXSwgc2l6ZW9mKGRzdCkpCisKK3ZvaWQKK2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgc3RydWN0IHJlZyBpbmZlcmlvcl9yZWdpc3RlcnM7CisgIHN0cnVjdCBmcHJlZyBpbmZlcmlvcl9mcHJlZ2lzdGVyczsKKworICBwdHJhY2UgKFBUX0dFVFJFR1MsIGluZmVyaW9yX3BpZCwKKwkgIChQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfcmVnaXN0ZXJzLCAwKTsKKyAgcHRyYWNlIChQVF9HRVRGUFJFR1MsIGluZmVyaW9yX3BpZCwKKwkgIChQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfZnByZWdpc3RlcnMsIDApOworCisgIFJGKFIwX1JFR05VTSArIDAsIGluZmVyaW9yX3JlZ2lzdGVycy5yX3IwKTsKKyAgUkYoUjBfUkVHTlVNICsgMSwgaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcjEpOworICBSRihSMF9SRUdOVU0gKyAyLCBpbmZlcmlvcl9yZWdpc3RlcnMucl9yMik7CisgIFJGKFIwX1JFR05VTSArIDMsIGluZmVyaW9yX3JlZ2lzdGVycy5yX3IzKTsKKyAgUkYoUjBfUkVHTlVNICsgNCwgaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcjQpOworICBSRihSMF9SRUdOVU0gKyA1LCBpbmZlcmlvcl9yZWdpc3RlcnMucl9yNSk7CisgIFJGKFIwX1JFR05VTSArIDYsIGluZmVyaW9yX3JlZ2lzdGVycy5yX3I2KTsKKyAgUkYoUjBfUkVHTlVNICsgNywgaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcjcpOworCisgIFJGKFNQX1JFR05VTQkgICwgaW5mZXJpb3JfcmVnaXN0ZXJzLnJfc3ApOworICBSRihGUF9SRUdOVU0JICAsIGluZmVyaW9yX3JlZ2lzdGVycy5yX2ZwKTsKKyAgUkYoUENfUkVHTlVNCSAgLCBpbmZlcmlvcl9yZWdpc3RlcnMucl9wYyk7CisgIFJGKFBTX1JFR05VTQkgICwgaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcHNyKTsKKworICBSRihGUFNfUkVHTlVNICAgLCBpbmZlcmlvcl9mcHJlZ2lzdGVycy5yX2Zzcik7CisgIFJGKEZQMF9SRUdOVU0gKzAsIGluZmVyaW9yX2ZwcmVnaXN0ZXJzLnJfZnJlZ1swXSk7CisgIFJGKEZQMF9SRUdOVU0gKzIsIGluZmVyaW9yX2ZwcmVnaXN0ZXJzLnJfZnJlZ1syXSk7CisgIFJGKEZQMF9SRUdOVU0gKzQsIGluZmVyaW9yX2ZwcmVnaXN0ZXJzLnJfZnJlZ1s0XSk7CisgIFJGKEZQMF9SRUdOVU0gKzYsIGluZmVyaW9yX2ZwcmVnaXN0ZXJzLnJfZnJlZ1s2XSk7CisgIFJGKExQMF9SRUdOVU0gKyAxLCBpbmZlcmlvcl9mcHJlZ2lzdGVycy5yX2ZyZWdbMV0pOworICBSRihMUDBfUkVHTlVNICsgMywgaW5mZXJpb3JfZnByZWdpc3RlcnMucl9mcmVnWzNdKTsKKyAgUkYoTFAwX1JFR05VTSArIDUsIGluZmVyaW9yX2ZwcmVnaXN0ZXJzLnJfZnJlZ1s1XSk7CisgIFJGKExQMF9SRUdOVU0gKyA3LCBpbmZlcmlvcl9mcHJlZ2lzdGVycy5yX2ZyZWdbN10pOworICAgcmVnaXN0ZXJzX2ZldGNoZWQgKCk7Cit9CisKK3ZvaWQKK3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgc3RydWN0IHJlZyBpbmZlcmlvcl9yZWdpc3RlcnM7CisgIHN0cnVjdCBmcHJlZyBpbmZlcmlvcl9mcHJlZ2lzdGVyczsKKworICBSUyhSMF9SRUdOVU0gKyAwLCBpbmZlcmlvcl9yZWdpc3RlcnMucl9yMCk7CisgIFJTKFIwX1JFR05VTSArIDEsIGluZmVyaW9yX3JlZ2lzdGVycy5yX3IxKTsKKyAgUlMoUjBfUkVHTlVNICsgMiwgaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcjIpOworICBSUyhSMF9SRUdOVU0gKyAzLCBpbmZlcmlvcl9yZWdpc3RlcnMucl9yMyk7CisgIFJTKFIwX1JFR05VTSArIDQsIGluZmVyaW9yX3JlZ2lzdGVycy5yX3I0KTsKKyAgUlMoUjBfUkVHTlVNICsgNSwgaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcjUpOworICBSUyhSMF9SRUdOVU0gKyA2LCBpbmZlcmlvcl9yZWdpc3RlcnMucl9yNik7CisgIFJTKFIwX1JFR05VTSArIDcsIGluZmVyaW9yX3JlZ2lzdGVycy5yX3I3KTsKKworICBSUyhTUF9SRUdOVU0JICAsIGluZmVyaW9yX3JlZ2lzdGVycy5yX3NwKTsKKyAgUlMoRlBfUkVHTlVNCSAgLCBpbmZlcmlvcl9yZWdpc3RlcnMucl9mcCk7CisgIFJTKFBDX1JFR05VTQkgICwgaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcGMpOworICBSUyhQU19SRUdOVU0JICAsIGluZmVyaW9yX3JlZ2lzdGVycy5yX3Bzcik7CisKKyAgUlMoRlBTX1JFR05VTSAgICwgaW5mZXJpb3JfZnByZWdpc3RlcnMucl9mc3IpOworICBSUyhGUDBfUkVHTlVNICswLCBpbmZlcmlvcl9mcHJlZ2lzdGVycy5yX2ZyZWdbMF0pOworICBSUyhGUDBfUkVHTlVNICsyLCBpbmZlcmlvcl9mcHJlZ2lzdGVycy5yX2ZyZWdbMl0pOworICBSUyhGUDBfUkVHTlVNICs0LCBpbmZlcmlvcl9mcHJlZ2lzdGVycy5yX2ZyZWdbNF0pOworICBSUyhGUDBfUkVHTlVNICs2LCBpbmZlcmlvcl9mcHJlZ2lzdGVycy5yX2ZyZWdbNl0pOworICBSUyhMUDBfUkVHTlVNICsgMSwgaW5mZXJpb3JfZnByZWdpc3RlcnMucl9mcmVnWzFdKTsKKyAgUlMoTFAwX1JFR05VTSArIDMsIGluZmVyaW9yX2ZwcmVnaXN0ZXJzLnJfZnJlZ1szXSk7CisgIFJTKExQMF9SRUdOVU0gKyA1LCBpbmZlcmlvcl9mcHJlZ2lzdGVycy5yX2ZyZWdbNV0pOworICBSUyhMUDBfUkVHTlVNICsgNywgaW5mZXJpb3JfZnByZWdpc3RlcnMucl9mcmVnWzddKTsKKworICBwdHJhY2UgKFBUX1NFVFJFR1MsIGluZmVyaW9yX3BpZCwKKwkgIChQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfcmVnaXN0ZXJzLCAwKTsKKyAgcHRyYWNlIChQVF9TRVRGUFJFR1MsIGluZmVyaW9yX3BpZCwKKwkgIChQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfZnByZWdpc3RlcnMsIDApOworfQorDAorCisvKiBYWFggLSBBZGQgdGhpcyB0byBtYWNoaW5lL3JlZ3MuaCBpbnN0ZWFkPyAqLworc3RydWN0IGNvcmVyZWdzIHsKKyAgc3RydWN0IHJlZyBpbnRyZWc7CisgIHN0cnVjdCBmcHJlZyBmcmVnOworfTsKKworLyogR2V0IHJlZ2lzdGVycyBmcm9tIGEgY29yZSBmaWxlLiAqLworc3RhdGljIHZvaWQKK2ZldGNoX2NvcmVfcmVnaXN0ZXJzIChjb3JlX3JlZ19zZWN0LCBjb3JlX3JlZ19zaXplLCB3aGljaCwgcmVnX2FkZHIpCisgICAgIGNoYXIgKmNvcmVfcmVnX3NlY3Q7CisgICAgIHVuc2lnbmVkIGNvcmVfcmVnX3NpemU7CisgICAgIGludCB3aGljaDsKKyAgICAgdW5zaWduZWQgaW50IHJlZ19hZGRyOwkvKiBVbnVzZWQgaW4gdGhpcyB2ZXJzaW9uICovCit7CisgIHN0cnVjdCBjb3JlcmVncyAqY29yZV9yZWc7CisKKyAgY29yZV9yZWcgPSAoc3RydWN0IGNvcmVyZWdzICopY29yZV9yZWdfc2VjdDsKKworICAvKgorICAgKiBXZSBoYXZlICphbGwqIHJlZ2lzdGVycworICAgKiBpbiB0aGUgZmlyc3QgY29yZSBzZWN0aW9uLgorICAgKiBJZ25vcmUgd2hpY2guCisgICAqLworCisgIGlmIChjb3JlX3JlZ19zaXplIDwgc2l6ZW9mKCpjb3JlX3JlZykpIHsKKyAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJDb3VsZG4ndCByZWFkIHJlZ3MgZnJvbSBjb3JlIGZpbGVcbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIEludGVnZXIgcmVnaXN0ZXJzICovCisgIFJGKFIwX1JFR05VTSArIDAsIGNvcmVfcmVnLT5pbnRyZWcucl9yMCk7CisgIFJGKFIwX1JFR05VTSArIDEsIGNvcmVfcmVnLT5pbnRyZWcucl9yMSk7CisgIFJGKFIwX1JFR05VTSArIDIsIGNvcmVfcmVnLT5pbnRyZWcucl9yMik7CisgIFJGKFIwX1JFR05VTSArIDMsIGNvcmVfcmVnLT5pbnRyZWcucl9yMyk7CisgIFJGKFIwX1JFR05VTSArIDQsIGNvcmVfcmVnLT5pbnRyZWcucl9yNCk7CisgIFJGKFIwX1JFR05VTSArIDUsIGNvcmVfcmVnLT5pbnRyZWcucl9yNSk7CisgIFJGKFIwX1JFR05VTSArIDYsIGNvcmVfcmVnLT5pbnRyZWcucl9yNik7CisgIFJGKFIwX1JFR05VTSArIDcsIGNvcmVfcmVnLT5pbnRyZWcucl9yNyk7CisKKyAgUkYoU1BfUkVHTlVNCSAgLCBjb3JlX3JlZy0+aW50cmVnLnJfc3ApOworICBSRihGUF9SRUdOVU0JICAsIGNvcmVfcmVnLT5pbnRyZWcucl9mcCk7CisgIFJGKFBDX1JFR05VTQkgICwgY29yZV9yZWctPmludHJlZy5yX3BjKTsKKyAgUkYoUFNfUkVHTlVNCSAgLCBjb3JlX3JlZy0+aW50cmVnLnJfcHNyKTsKKworICAvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KKyAgUkYoRlBTX1JFR05VTSAgICwgY29yZV9yZWctPmZyZWcucl9mc3IpOworICBSRihGUDBfUkVHTlVNICswLCBjb3JlX3JlZy0+ZnJlZy5yX2ZyZWdbMF0pOworICBSRihGUDBfUkVHTlVNICsyLCBjb3JlX3JlZy0+ZnJlZy5yX2ZyZWdbMl0pOworICBSRihGUDBfUkVHTlVNICs0LCBjb3JlX3JlZy0+ZnJlZy5yX2ZyZWdbNF0pOworICBSRihGUDBfUkVHTlVNICs2LCBjb3JlX3JlZy0+ZnJlZy5yX2ZyZWdbNl0pOworICBSRihMUDBfUkVHTlVNICsgMSwgY29yZV9yZWctPmZyZWcucl9mcmVnWzFdKTsKKyAgUkYoTFAwX1JFR05VTSArIDMsIGNvcmVfcmVnLT5mcmVnLnJfZnJlZ1szXSk7CisgIFJGKExQMF9SRUdOVU0gKyA1LCBjb3JlX3JlZy0+ZnJlZy5yX2ZyZWdbNV0pOworICBSRihMUDBfUkVHTlVNICsgNywgY29yZV9yZWctPmZyZWcucl9mcmVnWzddKTsKKyAgcmVnaXN0ZXJzX2ZldGNoZWQgKCk7Cit9CisKKy8qIFJlZ2lzdGVyIHRoYXQgd2UgYXJlIGFibGUgdG8gaGFuZGxlIG5zMzJrbmJzZCBjb3JlIGZpbGUgZm9ybWF0cy4KKyAgIEZJWE1FOiBpcyB0aGlzIHJlYWxseSBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91cj8gKi8KKworc3RhdGljIHN0cnVjdCBjb3JlX2ZucyBuYXRfY29yZV9mbnMgPQoreworICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKKyAgZmV0Y2hfY29yZV9yZWdpc3RlcnMsCisgIE5VTEwKK307CisKK3ZvaWQKK19pbml0aWFsaXplX25zMzJrbmJzZF9uYXQgKCkKK3sKKyAgYWRkX2NvcmVfZm5zICgmbmF0X2NvcmVfZm5zKTsKK30KKwwKKworLyoKKyAqIGtlcm5lbF91X3NpemUoKSBpcyBub3QgaGVscGZ1bCBvbiBOZXRCU0QgYmVjYXVzZQorICogdGhlICJ1IiBzdHJ1Y3QgaXMgTk9UIGluIHRoZSBjb3JlIGR1bXAgZmlsZS4KKyAqLworCisjaWZkZWYJRkVUQ0hfS0NPUkVfUkVHSVNURVJTCisvKgorICogR2V0IHJlZ2lzdGVycyBmcm9tIGEga2VybmVsIGNyYXNoIGR1bXAgb3IgbGl2ZSBrZXJuZWwuCisgKiBDYWxsZWQgYnkga2NvcmUtbmJzZC5jOmdldF9rY29yZV9yZWdpc3RlcnMoKS4KKyAqLwordm9pZAorZmV0Y2hfa2NvcmVfcmVnaXN0ZXJzIChwY2IpCisgICAgIHN0cnVjdCBwY2IgKnBjYjsKK3sKKyAgc3RydWN0IHN3aXRjaGZyYW1lIHNmOworICBzdHJ1Y3QgcmVnIGludHJlZzsKKyAgaW50IGR1bW15OworCisgIC8qIEludGVnZXIgcmVnaXN0ZXJzICovCisgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkoKENPUkVfQUREUilwY2ItPnBjYl9rc3AsIChjaGFyICopJnNmLCBzaXplb2Ygc2YpKQorICAgICBlcnJvcigiQ2Fubm90IHJlYWQgaW50ZWdlciByZWdpc3RlcnMuIik7CisKKyAgLyogV2UgdXNlIHRoZSBwc3IgYXQga2VybmVsIGVudHJ5ICovCisgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkoKENPUkVfQUREUilwY2ItPnBjYl9vbnN0YWNrLCAoY2hhciAqKSZpbnRyZWcsIHNpemVvZiBpbnRyZWcpKQorICAgICBlcnJvcigiQ2Fubm90IHJlYWQgcHJvY2Vzc29yIHN0YXR1cyByZWdpc3Rlci4iKTsKKworICBkdW1teSA9IDA7CisgIFJGKFIwX1JFR05VTSArIDAsIGR1bW15KTsKKyAgUkYoUjBfUkVHTlVNICsgMSwgZHVtbXkpOworICBSRihSMF9SRUdOVU0gKyAyLCBkdW1teSk7CisgIFJGKFIwX1JFR05VTSArIDMsIHNmLnNmX3IzKTsKKyAgUkYoUjBfUkVHTlVNICsgNCwgc2Yuc2ZfcjQpOworICBSRihSMF9SRUdOVU0gKyA1LCBzZi5zZl9yNSk7CisgIFJGKFIwX1JFR05VTSArIDYsIHNmLnNmX3I2KTsKKyAgUkYoUjBfUkVHTlVNICsgNywgc2Yuc2ZfcjcpOworCisgIGR1bW15ID0gcGNiLT5wY2Jfa2ZwICsgODsKKyAgUkYoU1BfUkVHTlVNCSAgLCBkdW1teSk7CisgIFJGKEZQX1JFR05VTQkgICwgc2Yuc2ZfZnApOworICBSRihQQ19SRUdOVU0JICAsIHNmLnNmX3BjKTsKKyAgUkYoUFNfUkVHTlVNCSAgLCBpbnRyZWcucl9wc3IpOworCisgIC8qIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAqLworICBSRihGUFNfUkVHTlVNICAgLCBwY2ItPnBjYl9mc3IpOworICBSRihGUDBfUkVHTlVNICswLCBwY2ItPnBjYl9mcmVnWzBdKTsKKyAgUkYoRlAwX1JFR05VTSArMiwgcGNiLT5wY2JfZnJlZ1syXSk7CisgIFJGKEZQMF9SRUdOVU0gKzQsIHBjYi0+cGNiX2ZyZWdbNF0pOworICBSRihGUDBfUkVHTlVNICs2LCBwY2ItPnBjYl9mcmVnWzZdKTsKKyAgUkYoTFAwX1JFR05VTSArIDEsIHBjYi0+cGNiX2ZyZWdbMV0pOworICBSRihMUDBfUkVHTlVNICsgMywgcGNiLT5wY2JfZnJlZ1szXSk7CisgIFJGKExQMF9SRUdOVU0gKyA1LCBwY2ItPnBjYl9mcmVnWzVdKTsKKyAgUkYoTFAwX1JFR05VTSArIDcsIHBjYi0+cGNiX2ZyZWdbN10pOworICByZWdpc3RlcnNfZmV0Y2hlZCAoKTsKK30KKyNlbmRpZgkvKiBGRVRDSF9LQ09SRV9SRUdJU1RFUlMgKi8KKwordm9pZAorY2xlYXJfcmVncygpCit7CisgIGRvdWJsZSB6ZXJvID0gMC4wOworICBpbnQgbnVsbCA9IDA7CisgIAorICAvKiBJbnRlZ2VyIHJlZ2lzdGVycyAqLworICBSRihSMF9SRUdOVU0gKyAwLCBudWxsKTsKKyAgUkYoUjBfUkVHTlVNICsgMSwgbnVsbCk7CisgIFJGKFIwX1JFR05VTSArIDIsIG51bGwpOworICBSRihSMF9SRUdOVU0gKyAzLCBudWxsKTsKKyAgUkYoUjBfUkVHTlVNICsgNCwgbnVsbCk7CisgIFJGKFIwX1JFR05VTSArIDUsIG51bGwpOworICBSRihSMF9SRUdOVU0gKyA2LCBudWxsKTsKKyAgUkYoUjBfUkVHTlVNICsgNywgbnVsbCk7CisKKyAgUkYoU1BfUkVHTlVNCSAgLCBudWxsKTsKKyAgUkYoRlBfUkVHTlVNCSAgLCBudWxsKTsKKyAgUkYoUENfUkVHTlVNCSAgLCBudWxsKTsKKyAgUkYoUFNfUkVHTlVNCSAgLCBudWxsKTsKKworICAvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KKyAgUkYoRlBTX1JFR05VTSAgICwgemVybyk7CisgIFJGKEZQMF9SRUdOVU0gKzAsIHplcm8pOworICBSRihGUDBfUkVHTlVNICsyLCB6ZXJvKTsKKyAgUkYoRlAwX1JFR05VTSArNCwgemVybyk7CisgIFJGKEZQMF9SRUdOVU0gKzYsIHplcm8pOworICBSRihMUDBfUkVHTlVNICsgMCwgemVybyk7CisgIFJGKExQMF9SRUdOVU0gKyAxLCB6ZXJvKTsKKyAgUkYoTFAwX1JFR05VTSArIDIsIHplcm8pOworICBSRihMUDBfUkVHTlVNICsgMywgemVybyk7CisgIHJldHVybjsKK30KKworLyogUmV0dXJuIG51bWJlciBvZiBhcmdzIHBhc3NlZCB0byBhIGZyYW1lLgorICAgQ2FuIHJldHVybiAtMSwgbWVhbmluZyBubyB3YXkgdG8gdGVsbC4gKi8KKworaW50CitmcmFtZV9udW1fYXJncyhmaSkKK3N0cnVjdCBmcmFtZV9pbmZvICpmaTsKK3sKKwlDT1JFX0FERFIJZW50ZXJfYWRkcjsKKwlDT1JFX0FERFIJYXJncDsKKwlpbnQJCWluc3Q7CisJaW50CQlhcmdzOworCWludAkJaTsKKworCWlmIChyZWFkX21lbW9yeV9pbnRlZ2VyIChmaS0+ZnJhbWUsIDQpID09IDAgJiYgZmktPnBjIDwgMHgxMDAwMCkgeworCQkvKiBtYWluIGlzIGFsd2F5cyBjYWxsZWQgd2l0aCB0aHJlZSBhcmdzICovCisJCXJldHVybigzKTsKKwl9CisJZW50ZXJfYWRkciA9IG5zMzJrX2dldF9lbnRlcl9hZGRyKGZpLT5wYyk7CisJaWYgKGVudGVyX2FkZHIgPSAwKQorCQlyZXR1cm4oLTEpOworCWFyZ3AgPSBlbnRlcl9hZGRyID09IDEgPyBTQVZFRF9QQ19BRlRFUl9DQUxMKGZpKSA6IEZSQU1FX1NBVkVEX1BDKGZpKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkvKgorCQkgKiBBZnRlciBhIGJzciBnY2MgbWF5IGVtaXQgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMKKwkJICogdG8gcmVtb3ZlIHRoZSBhcmd1bWVudHMgZnJvbSB0aGUgc3RhY2s6CisJCSAqICAgY21wcWQgMCx0b3MgCS0gdG8gcmVtb3ZlIDQgYnl0ZXMgZnJvbSB0aGUgc3RhY2sKKwkJICogICBjbXBkIHRvcyx0b3MJLSB0byByZW1vdmUgOCBieXRlcyBmcm9tIHRoZSBzdGFjaworCQkgKiAgIGFkanNwW2J3ZF0gLW4JLSB0byByZW1vdmUgbiBieXRlcyBmcm9tIHRoZSBzdGFjaworCQkgKiBHY2Mgc29tZXRpbWVzIGRlbGF5cyBlbWl0dGluZyB0aGVzZSBpbnN0cnVjdGlvbnMgYW5kCisJCSAqIG1heSBldmVuIHRocm93IGEgYnJhbmNoIGJldHdlZW4gb3VyIGZlZXQuCisJCSAqLwkJIAorCQlpbnN0ID0gcmVhZF9tZW1vcnlfaW50ZWdlcihhcmdwICAgICwgNCk7CisJCWFyZ3MgPSByZWFkX21lbW9yeV9pbnRlZ2VyKGFyZ3AgKyAyLCA0KTsKKwkJaWYgKChpbnN0ICYgMHhmZikgPT0gMHhlYSkgewkJLyogYnIgKi8KKwkJCWFyZ3MgPSAoKGluc3QgPj4gOCkgJiAweGZmZmZmZikgfCAoYXJncyA8PCAyNCk7CisJCQlpZiAoYXJncyAmIDB4ODApIHsKKwkJCQlpZiAoYXJncyAmIDB4NDApIHsKKwkJCQkJYXJncyA9IG50b2hsKGFyZ3MpOworCQkJCX0gZWxzZSB7CisJCQkJCWFyZ3MgPSBudG9ocyhhcmdzICYgMHhmZmZmKTsKKwkJCQkJaWYgKGFyZ3MgJiAweDIwMDApCisJCQkJCQlhcmdzIHw9IDB4YzAwMDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWFyZ3MgPSBhcmdzICYgMHhmZjsKKwkJCQlpZiAoYXJncyAmIDB4NDApCisJCQkJCWFyZ3MgfD0gMHg4MDsKKwkJCX0KKwkJCWFyZ3AgKz0gYXJnczsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgoaW5zdCAmIDB4ZmZmZikgPT0gMHhiODFmKQkJLyogY21wcWQgMCx0b3MgKi8KKwkJCXJldHVybigxKTsKKwkJZWxzZSBpZiAoKGluc3QgJiAweGZmZmYpID09IDB4YmRjNykJLyogY21wZCB0b3MsdG9zICovCisJCQlyZXR1cm4oMik7CisJCWVsc2UgaWYgKChpbnN0ICYgMHhmZmZjKSA9PSAweGE1N2MpIHsJLyogYWRqc3BbYndkXSAqLworCQkJc3dpdGNoIChpbnN0ICYgMykgeworCQkJY2FzZSAwOgorCQkJCWFyZ3MgPSAoKGFyZ3MgJiAweGZmKSArIDB4ODApOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCWFyZ3MgPSAoKG50b2hzKGFyZ3MpICYgMHhmZmZmKSArIDB4ODAwMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJYXJncyA9IC1udG9obChhcmdzKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJCWlmIChhcmdzIC8gNCA+IDEwIHx8IChhcmdzICYgMykgIT0gMCkKKwkJCQljb250aW51ZTsKKwkJCXJldHVybihhcmdzIC8gNCk7CisJCX0KKwkJYXJncCArPSAxOworCX0KKwlyZXR1cm4oLTEpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL29iamZpbGVzLmMgYi9nZGIvb2JqZmlsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzFhN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL29iamZpbGVzLmMKQEAgLTAsMCArMSw5ODggQEAKKy8qIEdEQiByb3V0aW5lcyBmb3IgbWFuaXB1bGF0aW5nIG9iamZpbGVzLgorICAgQ29weXJpZ2h0IDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydCwgdXNpbmcgcGllY2VzIGZyb20gb3RoZXIgR0RCIG1vZHVsZXMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIHN1cHBvcnQgcm91dGluZXMgZm9yIGNyZWF0aW5nLCBtYW5pcHVsYXRpbmcsIGFuZAorICAgZGVzdHJveWluZyBvYmpmaWxlIHN0cnVjdHVyZXMuICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiYmZkLmgiCQkvKiBCaW5hcnkgRmlsZSBEZXNjcmlwdGlvbiAqLworI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIKKyNpbmNsdWRlICJvYmpmaWxlcy5oIgorI2luY2x1ZGUgImdkYi1zdGFicy5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAiZ2RiX3N0YXQuaCIKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucyAqLworCisjaWYgZGVmaW5lZChVU0VfTU1BTExPQykgJiYgZGVmaW5lZChIQVZFX01NQVApCisKK3N0YXRpYyBpbnQKK29wZW5fZXhpc3RpbmdfbWFwcGVkX2ZpbGUgUEFSQU1TICgoY2hhciAqLCBsb25nLCBpbnQpKTsKKworc3RhdGljIGludAorb3Blbl9tYXBwZWRfZmlsZSBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSwgbG9uZyBtdGltZSwgaW50IG1hcHBlZCkpOworCitzdGF0aWMgUFRSCittYXBfdG9fZmlsZSBQQVJBTVMgKChpbnQpKTsKKworI2VuZGlmICAvKiBkZWZpbmVkKFVTRV9NTUFMTE9DKSAmJiBkZWZpbmVkKEhBVkVfTU1BUCkgKi8KKworc3RhdGljIHZvaWQKK2FkZF90b19vYmpmaWxlX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIpKTsKKworLyogRXh0ZXJuYWxseSB2aXNpYmxlIHZhcmlhYmxlcyB0aGF0IGFyZSBvd25lZCBieSB0aGlzIG1vZHVsZS4KKyAgIFNlZSBkZWNsYXJhdGlvbnMgaW4gb2JqZmlsZS5oIGZvciBtb3JlIGluZm8uICovCisKK3N0cnVjdCBvYmpmaWxlICpvYmplY3RfZmlsZXM7CQkvKiBMaW5rZWQgbGlzdCBvZiBhbGwgb2JqZmlsZXMgKi8KK3N0cnVjdCBvYmpmaWxlICpjdXJyZW50X29iamZpbGU7CS8qIEZvciBzeW1ib2wgZmlsZSBiZWluZyByZWFkIGluICovCitzdHJ1Y3Qgb2JqZmlsZSAqc3ltZmlsZV9vYmpmaWxlOwkvKiBNYWluIHN5bWJvbCB0YWJsZSBsb2FkZWQgZnJvbSAqLworc3RydWN0IG9iamZpbGUgKnJ0X2NvbW1vbl9vYmpmaWxlOwkvKiBGb3IgcnVudGltZSBjb21tb24gc3ltYm9scyAqLworCitpbnQgbWFwcGVkX3N5bWJvbF9maWxlczsJCS8qIFRyeSB0byB1c2UgbWFwcGVkIHN5bWJvbCBmaWxlcyAqLworCisvKiBMb2NhdGUgYWxsIG1hcHBhYmxlIHNlY3Rpb25zIG9mIGEgQkZEIGZpbGUuIAorICAgb2JqZmlsZV9wX2NoYXIgaXMgYSBjaGFyICogdG8gZ2V0IGl0IHRocm91Z2gKKyAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9uczsgd2UgY2FzdCBpdCBiYWNrIHRvIGl0cyBwcm9wZXIgdHlwZS4gICovCisKKyNpZm5kZWYgVEFSR0VUX0tFRVBfU0VDVElPTgorI2RlZmluZSBUQVJHRVRfS0VFUF9TRUNUSU9OKEFTRUNUKQkwCisjZW5kaWYKKworc3RhdGljIHZvaWQKK2FkZF90b19vYmpmaWxlX3NlY3Rpb25zIChhYmZkLCBhc2VjdCwgb2JqZmlsZV9wX2NoYXIpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VjX3B0ciBhc2VjdDsKKyAgICAgUFRSIG9iamZpbGVfcF9jaGFyOworeworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSA9IChzdHJ1Y3Qgb2JqZmlsZSAqKSBvYmpmaWxlX3BfY2hhcjsKKyAgc3RydWN0IG9ial9zZWN0aW9uIHNlY3Rpb247CisgIGZsYWd3b3JkIGFmbGFnOworCisgIGFmbGFnID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBhc2VjdCk7CisKKyAgaWYgKCEoYWZsYWcgJiBTRUNfQUxMT0MpICYmICEoVEFSR0VUX0tFRVBfU0VDVElPTihhc2VjdCkpKQorICAgIHJldHVybjsKKworICBpZiAoMCA9PSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBhc2VjdCkpCisgICAgcmV0dXJuOworICBzZWN0aW9uLm9mZnNldCA9IDA7CisgIHNlY3Rpb24ub2JqZmlsZSA9IG9iamZpbGU7CisgIHNlY3Rpb24udGhlX2JmZF9zZWN0aW9uID0gYXNlY3Q7CisgIHNlY3Rpb24ub3ZseV9tYXBwZWQgPSAwOworICBzZWN0aW9uLmFkZHIgPSBiZmRfc2VjdGlvbl92bWEgKGFiZmQsIGFzZWN0KTsKKyAgc2VjdGlvbi5lbmRhZGRyID0gc2VjdGlvbi5hZGRyICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgYXNlY3QpOworICBvYnN0YWNrX2dyb3cgKCZvYmpmaWxlLT5wc3ltYm9sX29ic3RhY2ssIChjaGFyICopICZzZWN0aW9uLCBzaXplb2Yoc2VjdGlvbikpOworICBvYmpmaWxlLT5zZWN0aW9uc19lbmQgPSAoc3RydWN0IG9ial9zZWN0aW9uICopICgoKHVuc2lnbmVkIGxvbmcpIG9iamZpbGUtPnNlY3Rpb25zX2VuZCkgKyAxKTsKK30KKworLyogQnVpbGRzIGEgc2VjdGlvbiB0YWJsZSBmb3IgT0JKRklMRS4KKyAgIFJldHVybnMgMCBpZiBPSywgMSBvbiBlcnJvciAoaW4gd2hpY2ggY2FzZSBiZmRfZXJyb3IgY29udGFpbnMgdGhlCisgICBlcnJvcikuICAqLworCitpbnQKK2J1aWxkX29iamZpbGVfc2VjdGlvbl90YWJsZSAob2JqZmlsZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIC8qIG9iamZpbGUtPnNlY3Rpb25zIGNhbiBiZSBhbHJlYWR5IHNldCB3aGVuIHJlYWRpbmcgYSBtYXBwZWQgc3ltYm9sCisgICAgIGZpbGUuICBJIGJlbGlldmUgdGhhdCB3ZSBkbyBuZWVkIHRvIHJlYnVpbGQgdGhlIHNlY3Rpb24gdGFibGUgaW4KKyAgICAgdGhpcyBjYXNlICh3ZSByZWJ1aWxkIG90aGVyIHRoaW5ncyBkZXJpdmVkIGZyb20gdGhlIGJmZCksIGJ1dCB3ZQorICAgICBjYW4ndCBmcmVlIHRoZSBvbGQgb25lIChpdCdzIGluIHRoZSBwc3ltYm9sX29ic3RhY2spLiAgU28gd2UganVzdAorICAgICB3YXN0ZSBzb21lIG1lbW9yeS4gICovCisKKyAgb2JqZmlsZS0+c2VjdGlvbnNfZW5kID0gMDsKKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChvYmpmaWxlLT5vYmZkLCBhZGRfdG9fb2JqZmlsZV9zZWN0aW9ucywgKGNoYXIgKilvYmpmaWxlKTsKKyAgb2JqZmlsZS0+c2VjdGlvbnMgPSAoc3RydWN0IG9ial9zZWN0aW9uICopCisgICAgb2JzdGFja19maW5pc2ggKCZvYmpmaWxlLT5wc3ltYm9sX29ic3RhY2spOworICBvYmpmaWxlLT5zZWN0aW9uc19lbmQgPSBvYmpmaWxlLT5zZWN0aW9ucyArICh1bnNpZ25lZCBsb25nKSBvYmpmaWxlLT5zZWN0aW9uc19lbmQ7CisgIHJldHVybigwKTsKK30KKworLyogR2l2ZW4gYSBwb2ludGVyIHRvIGFuIGluaXRpYWxpemVkIGJmZCAoQUJGRCkgYW5kIGEgZmxhZyB0aGF0IGluZGljYXRlcworICAgd2hldGhlciBvciBub3QgYW4gb2JqZmlsZSBpcyB0byBiZSBtYXBwZWQgKE1BUFBFRCksIGFsbG9jYXRlIGEgbmV3IG9iamZpbGUKKyAgIHN0cnVjdCwgZmlsbCBpdCBpbiBhcyBiZXN0IHdlIGNhbiwgbGluayBpdCBpbnRvIHRoZSBsaXN0IG9mIGFsbCBrbm93bgorICAgb2JqZmlsZXMsIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXcgb2JqZmlsZSBzdHJ1Y3QuCisKKyAgIFVTRVJfTE9BREVEIGlzIHNpbXBseSByZWNvcmRlZCBpbiB0aGUgb2JqZmlsZS4gIFRoaXMgcmVjb3JkIG9mZmVycyBhIHdheSBmb3IKKyAgIHJ1bl9jb21tYW5kIHRvIHJlbW92ZSBvbGQgb2JqZmlsZSBlbnRyaWVzIHdoaWNoIGFyZSBubyBsb25nZXIgdmFsaWQgKGkuZS4sCisgICBhcmUgYXNzb2NpYXRlZCB3aXRoIGFuIG9sZCBpbmZlcmlvciksIGJ1dCB0byBwcmVzZXJ2ZSBvbmVzIHRoYXQgdGhlIHVzZXIKKyAgIGV4cGxpY2l0bHkgbG9hZGVkIHZpYSB0aGUgYWRkLXN5bWJvbC1maWxlIGNvbW1hbmQuCisKKyAgIElTX1NPTElCIGlzIGFsc28gc2ltcGx5IHJlY29yZGVkIGluIHRoZSBvYmpmaWxlLiAqLworCitzdHJ1Y3Qgb2JqZmlsZSAqCithbGxvY2F0ZV9vYmpmaWxlIChhYmZkLCBtYXBwZWQsIHVzZXJfbG9hZGVkLCBpc19zb2xpYikKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgbWFwcGVkOworICAgICBpbnQgIHVzZXJfbG9hZGVkOworICAgICBpbnQgIGlzX3NvbGliOworeworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSA9IE5VTEw7CisgIHN0cnVjdCBvYmpmaWxlICpsYXN0X29uZSA9IE5VTEw7CisKKyAgbWFwcGVkIHw9IG1hcHBlZF9zeW1ib2xfZmlsZXM7CisKKyNpZiBkZWZpbmVkKFVTRV9NTUFMTE9DKSAmJiBkZWZpbmVkKEhBVkVfTU1BUCkKKyAgaWYgKGFiZmQgIT0gTlVMTCkKKyAgeworCisgICAgLyogSWYgd2UgY2FuIHN1cHBvcnQgbWFwcGVkIHN5bWJvbCBmaWxlcywgdHJ5IHRvIG9wZW4vcmVvcGVuIHRoZQorICAgICAgIG1hcHBlZCBmaWxlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGZpbGUgZnJvbSB3aGljaCB3ZSB3aXNoIHRvCisgICAgICAgcmVhZCBzeW1ib2xzLiAgSWYgdGhlIG9iamZpbGUgaXMgdG8gYmUgbWFwcGVkLCB3ZSBtdXN0IG1hbGxvYworICAgICAgIHRoZSBzdHJ1Y3R1cmUgaXRzZWxmIHVzaW5nIHRoZSBtbWFwIHZlcnNpb24sIGFuZCBhcnJhbmdlIHRoYXQKKyAgICAgICBhbGwgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSBvYmpmaWxlIHVzZXMgdGhlIG1tYXAgcm91dGluZXMuCisgICAgICAgSWYgd2UgYXJlIHJldXNpbmcgYW4gZXhpc3RpbmcgbWFwcGVkIGZpbGUsIGZyb20gd2hpY2ggd2UgZ2V0CisgICAgICAgb3VyIG9iamZpbGUgcG9pbnRlciwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB3ZSB1cGRhdGUgdGhlCisgICAgICAgcG9pbnRlcnMgdG8gdGhlIGFsbG9jL2ZyZWUgZnVuY3Rpb25zIGluIHRoZSBvYnN0YWNrLCBpbiBjYXNlCisgICAgICAgdGhlc2UgZnVuY3Rpb25zIGhhdmUgbW92ZWQgd2l0aGluIHRoZSBjdXJyZW50IGdkYi4gICovCisKKyAgICBpbnQgZmQ7CisKKyAgICBmZCA9IG9wZW5fbWFwcGVkX2ZpbGUgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBiZmRfZ2V0X210aW1lIChhYmZkKSwKKwkJCSAgIG1hcHBlZCk7CisgICAgaWYgKGZkID49IDApCisgICAgICB7CisJUFRSIG1kOworCisJaWYgKChtZCA9IG1hcF90b19maWxlIChmZCkpID09IE5VTEwpCisJICB7CisJICAgIGNsb3NlIChmZCk7CisJICB9CisJZWxzZSBpZiAoKG9iamZpbGUgPSAoc3RydWN0IG9iamZpbGUgKikgbW1hbGxvY19nZXRrZXkgKG1kLCAwKSkgIT0gTlVMTCkKKwkgIHsKKwkgICAgLyogVXBkYXRlIG1lbW9yeSBjb3JydXB0aW9uIGhhbmRsZXIgZnVuY3Rpb24gYWRkcmVzc2VzLiAqLworCSAgICBpbml0X21hbGxvYyAobWQpOworCSAgICBvYmpmaWxlIC0+IG1kID0gbWQ7CisJICAgIG9iamZpbGUgLT4gbW1mZCA9IGZkOworCSAgICAvKiBVcGRhdGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHRvICpvdXIqIGNvcGllcyAqLworCSAgICBvYnN0YWNrX2NodW5rZnVuICgmb2JqZmlsZSAtPiBwc3ltYm9sX2NhY2hlLmNhY2hlLCB4bW1hbGxvYyk7CisJICAgIG9ic3RhY2tfZnJlZWZ1biAoJm9iamZpbGUgLT4gcHN5bWJvbF9jYWNoZS5jYWNoZSwgbWZyZWUpOworCSAgICBvYnN0YWNrX2NodW5rZnVuICgmb2JqZmlsZSAtPiBwc3ltYm9sX29ic3RhY2ssIHhtbWFsbG9jKTsKKwkgICAgb2JzdGFja19mcmVlZnVuICgmb2JqZmlsZSAtPiBwc3ltYm9sX29ic3RhY2ssIG1mcmVlKTsKKwkgICAgb2JzdGFja19jaHVua2Z1biAoJm9iamZpbGUgLT4gc3ltYm9sX29ic3RhY2ssIHhtbWFsbG9jKTsKKwkgICAgb2JzdGFja19mcmVlZnVuICgmb2JqZmlsZSAtPiBzeW1ib2xfb2JzdGFjaywgbWZyZWUpOworCSAgICBvYnN0YWNrX2NodW5rZnVuICgmb2JqZmlsZSAtPiB0eXBlX29ic3RhY2ssIHhtbWFsbG9jKTsKKwkgICAgb2JzdGFja19mcmVlZnVuICgmb2JqZmlsZSAtPiB0eXBlX29ic3RhY2ssIG1mcmVlKTsKKwkgICAgLyogSWYgYWxyZWFkeSBpbiBvYmpmaWxlIGxpc3QsIHVubGluayBpdC4gKi8KKwkgICAgdW5saW5rX29iamZpbGUgKG9iamZpbGUpOworCSAgICAvKiBGb3JnZXQgdGhpbmdzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBnZGIsIG1heSBoYXZlIGNoYW5nZWQuICovCisJICAgIG9iamZpbGUgLT4gc2YgPSBOVUxMOworCSAgfQorCWVsc2UKKwkgIHsKKworCSAgICAvKiBTZXQgdXAgdG8gZGV0ZWN0IGludGVybmFsIG1lbW9yeSBjb3JydXB0aW9uLiAgTVVTVCBiZQorCSAgICAgICBkb25lIGJlZm9yZSB0aGUgZmlyc3QgbWFsbG9jLiAgU2VlIGNvbW1lbnRzIGluCisJICAgICAgIGluaXRfbWFsbG9jKCkgYW5kIG1tY2hlY2soKS4gICovCisKKwkgICAgaW5pdF9tYWxsb2MgKG1kKTsKKworCSAgICBvYmpmaWxlID0gKHN0cnVjdCBvYmpmaWxlICopCisJICAgICAgeG1tYWxsb2MgKG1kLCBzaXplb2YgKHN0cnVjdCBvYmpmaWxlKSk7CisJICAgIG1lbXNldCAob2JqZmlsZSwgMCwgc2l6ZW9mIChzdHJ1Y3Qgb2JqZmlsZSkpOworCSAgICBvYmpmaWxlIC0+IG1kID0gbWQ7CisJICAgIG9iamZpbGUgLT4gbW1mZCA9IGZkOworCSAgICBvYmpmaWxlIC0+IGZsYWdzIHw9IE9CSkZfTUFQUEVEOworCSAgICBtbWFsbG9jX3NldGtleSAob2JqZmlsZSAtPiBtZCwgMCwgb2JqZmlsZSk7CisJICAgIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uX3dpdGhfYXJnICgmb2JqZmlsZSAtPiBwc3ltYm9sX2NhY2hlLmNhY2hlLAorCQkJCQkJIDAsIDAsIHhtbWFsbG9jLCBtZnJlZSwKKwkJCQkJCSBvYmpmaWxlIC0+IG1kKTsKKwkgICAgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb25fd2l0aF9hcmcgKCZvYmpmaWxlIC0+IHBzeW1ib2xfb2JzdGFjaywKKwkJCQkJCSAwLCAwLCB4bW1hbGxvYywgbWZyZWUsCisJCQkJCQkgb2JqZmlsZSAtPiBtZCk7CisJICAgIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uX3dpdGhfYXJnICgmb2JqZmlsZSAtPiBzeW1ib2xfb2JzdGFjaywKKwkJCQkJCSAwLCAwLCB4bW1hbGxvYywgbWZyZWUsCisJCQkJCQkgb2JqZmlsZSAtPiBtZCk7CisJICAgIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uX3dpdGhfYXJnICgmb2JqZmlsZSAtPiB0eXBlX29ic3RhY2ssCisJCQkJCQkgMCwgMCwgeG1tYWxsb2MsIG1mcmVlLAorCQkJCQkJIG9iamZpbGUgLT4gbWQpOworCSAgfQorICAgICAgfQorCisgICAgaWYgKG1hcHBlZCAmJiAob2JqZmlsZSA9PSBOVUxMKSkKKyAgICAgIHsKKwl3YXJuaW5nICgic3ltYm9sIHRhYmxlIGZvciAnJXMnIHdpbGwgbm90IGJlIG1hcHBlZCIsCisJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisgICAgICB9CisgIH0KKyNlbHNlCS8qICFkZWZpbmVkKFVTRV9NTUFMTE9DKSB8fCAhZGVmaW5lZChIQVZFX01NQVApICovCisKKyAgaWYgKG1hcHBlZCkKKyAgICB7CisgICAgICB3YXJuaW5nICgibWFwcGVkIHN5bWJvbCB0YWJsZXMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBtYWNoaW5lOyBtaXNzaW5nIG9yIGJyb2tlbiBtbWFwKCkuIik7CisKKyAgICAgIC8qIFR1cm4gb2ZmIHRoZSBnbG9iYWwgZmxhZyBzbyB3ZSBkb24ndCB0cnkgdG8gZG8gbWFwcGVkIHN5bWJvbCB0YWJsZXMKKwkgYW55IG1vcmUsIHdoaWNoIHNodXRzIHVwIGdkYiB1bmxlc3MgdGhlIHVzZXIgc3BlY2lmaWNhbGx5IGdpdmVzIHRoZQorCSAibWFwcGVkIiBrZXl3b3JkIGFnYWluLiAqLworCisgICAgICBtYXBwZWRfc3ltYm9sX2ZpbGVzID0gMDsKKyAgICB9CisKKyNlbmRpZgkvKiBkZWZpbmVkKFVTRV9NTUFMTE9DKSAmJiBkZWZpbmVkKEhBVkVfTU1BUCkgKi8KKworICAvKiBJZiB3ZSBkb24ndCBzdXBwb3J0IG1hcHBlZCBzeW1ib2wgZmlsZXMsIGRpZG4ndCBhc2sgZm9yIHRoZSBmaWxlIHRvIGJlCisgICAgIG1hcHBlZCwgb3IgZmFpbGVkIHRvIG9wZW4gdGhlIG1hcHBlZCBmaWxlIGZvciBzb21lIHJlYXNvbiwgdGhlbiByZXZlcnQKKyAgICAgYmFjayB0byBhbiB1bm1hcHBlZCBvYmpmaWxlLiAqLworCisgIGlmIChvYmpmaWxlID09IE5VTEwpCisgICAgeworICAgICAgb2JqZmlsZSA9IChzdHJ1Y3Qgb2JqZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBvYmpmaWxlKSk7CisgICAgICBtZW1zZXQgKG9iamZpbGUsIDAsIHNpemVvZiAoc3RydWN0IG9iamZpbGUpKTsKKyAgICAgIG9iamZpbGUgLT4gbWQgPSBOVUxMOworICAgICAgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb24gKCZvYmpmaWxlIC0+IHBzeW1ib2xfY2FjaGUuY2FjaGUsIDAsIDAsCisJCQkJICB4bWFsbG9jLCBmcmVlKTsKKyAgICAgIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uICgmb2JqZmlsZSAtPiBwc3ltYm9sX29ic3RhY2ssIDAsIDAsIHhtYWxsb2MsCisJCQkJICBmcmVlKTsKKyAgICAgIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uICgmb2JqZmlsZSAtPiBzeW1ib2xfb2JzdGFjaywgMCwgMCwgeG1hbGxvYywKKwkJCQkgIGZyZWUpOworICAgICAgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb24gKCZvYmpmaWxlIC0+IHR5cGVfb2JzdGFjaywgMCwgMCwgeG1hbGxvYywKKwkJCQkgIGZyZWUpOworICAgIH0KKworICAvKiBVcGRhdGUgdGhlIHBlci1vYmpmaWxlIGluZm9ybWF0aW9uIHRoYXQgY29tZXMgZnJvbSB0aGUgYmZkLCBlbnN1cmluZworICAgICB0aGF0IGFueSBkYXRhIHRoYXQgaXMgcmVmZXJlbmNlIGlzIHNhdmVkIGluIHRoZSBwZXItb2JqZmlsZSBkYXRhCisgICAgIHJlZ2lvbi4gKi8KKworICBvYmpmaWxlIC0+IG9iZmQgPSBhYmZkOworICBpZiAob2JqZmlsZSAtPiBuYW1lICE9IE5VTEwpCisgICAgeworICAgICAgbWZyZWUgKG9iamZpbGUgLT4gbWQsIG9iamZpbGUgLT4gbmFtZSk7CisgICAgfQorICBpZiAoYWJmZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIG9iamZpbGUgLT4gbmFtZSA9IG1zdHJzYXZlIChvYmpmaWxlIC0+IG1kLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7CisgICAgICBvYmpmaWxlIC0+IG10aW1lID0gYmZkX2dldF9tdGltZSAoYWJmZCk7CisKKyAgICAgIC8qIEJ1aWxkIHNlY3Rpb24gdGFibGUuICAqLworCisgICAgICBpZiAoYnVpbGRfb2JqZmlsZV9zZWN0aW9uX3RhYmxlIChvYmpmaWxlKSkKKwl7CisJICBlcnJvciAoIkNhbid0IGZpbmQgdGhlIGZpbGUgc2VjdGlvbnMgaW4gYCVzJzogJXMiLCAKKwkJIG9iamZpbGUgLT4gbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCX0KKyAgICB9CisKKyAgLyogQWRkIHRoaXMgZmlsZSBvbnRvIHRoZSB0YWlsIG9mIHRoZSBsaW5rZWQgbGlzdCBvZiBvdGhlciBzdWNoIGZpbGVzLiAqLworCisgIG9iamZpbGUgLT4gbmV4dCA9IE5VTEw7CisgIGlmIChvYmplY3RfZmlsZXMgPT0gTlVMTCkKKyAgICBvYmplY3RfZmlsZXMgPSBvYmpmaWxlOworICBlbHNlCisgICAgeworICAgICAgZm9yIChsYXN0X29uZSA9IG9iamVjdF9maWxlczsKKwkgICBsYXN0X29uZSAtPiBuZXh0OworCSAgIGxhc3Rfb25lID0gbGFzdF9vbmUgLT4gbmV4dCk7CisgICAgICBsYXN0X29uZSAtPiBuZXh0ID0gb2JqZmlsZTsKKyAgICB9CisKKyAgLyogUmVjb3JkIHdoZXRoZXIgdGhpcyBvYmpmaWxlIHdhcyBjcmVhdGVkIGJlY2F1c2UgdGhlIHVzZXIgZXhwbGljaXRseQorICAgICBjYXVzZWQgaXQgKGUuZy4sIHVzZWQgdGhlIGFkZC1zeW1ib2wtZmlsZSBjb21tYW5kKS4KKyAgICAgKi8KKyAgb2JqZmlsZSAtPiB1c2VyX2xvYWRlZCA9IHVzZXJfbG9hZGVkOworCisgIC8qIFJlY29yZCB3aGV0aGVyIHRoaXMgb2JqZmlsZSBkZWZpbml0ZWx5IHJlcHJlc2VudHMgYSBzb2xpYi4gKi8KKyAgb2JqZmlsZSAtPiBpc19zb2xpYiA9IGlzX3NvbGliOworCisgIHJldHVybiAob2JqZmlsZSk7Cit9CisKKy8qIFB1dCBPQkpGSUxFIGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdC4gICovCisKK3ZvaWQKK29iamZpbGVfdG9fZnJvbnQgKG9iamZpbGUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBzdHJ1Y3Qgb2JqZmlsZSAqKm9ianA7CisgIGZvciAob2JqcCA9ICZvYmplY3RfZmlsZXM7ICpvYmpwICE9IE5VTEw7IG9ianAgPSAmKCgqb2JqcCktPm5leHQpKQorICAgIHsKKyAgICAgIGlmICgqb2JqcCA9PSBvYmpmaWxlKQorCXsKKwkgIC8qIFVuaG9vayBpdCBmcm9tIHdoZXJlIGl0IGlzLiAgKi8KKwkgICpvYmpwID0gb2JqZmlsZS0+bmV4dDsKKwkgIC8qIFB1dCBpdCBpbiB0aGUgZnJvbnQuICAqLworCSAgb2JqZmlsZS0+bmV4dCA9IG9iamVjdF9maWxlczsKKwkgIG9iamVjdF9maWxlcyA9IG9iamZpbGU7CisJICBicmVhazsKKwl9CisgICAgfQorfQorCisvKiBVbmxpbmsgT0JKRklMRSBmcm9tIHRoZSBsaXN0IG9mIGtub3duIG9iamZpbGVzLCBpZiBpdCBpcyBmb3VuZCBpbiB0aGUKKyAgIGxpc3QuCisKKyAgIEl0IGlzIG5vdCBhIGJ1Zywgb3IgZXJyb3IsIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBpZiBPQkpGSUxFIGlzIG5vdCBrbm93bgorICAgdG8gYmUgaW4gdGhlIGN1cnJlbnQgbGlzdC4gIFRoaXMgaXMgZG9uZSBpbiB0aGUgY2FzZSBvZiBtYXBwZWQgb2JqZmlsZXMsCisgICBmb3IgZXhhbXBsZSwganVzdCB0byBlbnN1cmUgdGhhdCB0aGUgbWFwcGVkIG9iamZpbGUgZG9lc24ndCBhcHBlYXIgdHdpY2UKKyAgIGluIHRoZSBsaXN0LiAgU2luY2UgdGhlIGxpc3QgaXMgdGhyZWFkZWQsIGxpbmtpbmcgaW4gYSBtYXBwZWQgb2JqZmlsZQorICAgdHdpY2Ugd291bGQgY3JlYXRlIGEgY2lyY3VsYXIgbGlzdC4KKworICAgSWYgT0JKRklMRSB0dXJucyBvdXQgdG8gYmUgaW4gdGhlIGxpc3QsIHdlIHphcCBpdCdzIE5FWFQgcG9pbnRlciBhZnRlcgorICAgdW5saW5raW5nIGl0LCBqdXN0IHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUgY29tcGxldGVseSBzZXZlcmVkIGFueSBsaW5rYWdlcworICAgYmV0d2VlbiB0aGUgT0JKRklMRSBhbmQgdGhlIGxpc3QuICovCisKK3ZvaWQKK3VubGlua19vYmpmaWxlIChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IG9iamZpbGUqKiBvYmpwcDsKKworICBmb3IgKG9ianBwID0gJm9iamVjdF9maWxlczsgKm9ianBwICE9IE5VTEw7IG9ianBwID0gJigoKm9ianBwKSAtPiBuZXh0KSkKKyAgICB7CisgICAgICBpZiAoKm9ianBwID09IG9iamZpbGUpIAorCXsKKwkgICpvYmpwcCA9ICgqb2JqcHApIC0+IG5leHQ7CisJICBvYmpmaWxlIC0+IG5leHQgPSBOVUxMOworCSAgYnJlYWs7CisJfQorICAgIH0KK30KKworCisvKiBEZXN0cm95IGFuIG9iamZpbGUgYW5kIGFsbCB0aGUgc3ltdGFicyBhbmQgcHN5bXRhYnMgdW5kZXIgaXQuICBOb3RlCisgICB0aGF0IGFzIG11Y2ggYXMgcG9zc2libGUgaXMgYWxsb2NhdGVkIG9uIHRoZSBzeW1ib2xfb2JzdGFjayBhbmQKKyAgIHBzeW1ib2xfb2JzdGFjaywgc28gdGhhdCB0aGUgbWVtb3J5IGNhbiBiZSBlZmZpY2llbnRseSBmcmVlZC4KKworICAgVGhpbmdzIHdoaWNoIHdlIGRvIE5PVCBmcmVlIGJlY2F1c2UgdGhleSBhcmUgbm90IGluIG1hbGxvYydkIG1lbW9yeQorICAgb3Igbm90IGluIG1lbW9yeSBzcGVjaWZpYyB0byB0aGUgb2JqZmlsZSBpbmNsdWRlOgorCisgICAJb2JqZmlsZSAtPiBzZgorCisgICBGSVhNRTogIElmIHRoZSBvYmpmaWxlIGlzIHVzaW5nIHJldXNhYmxlIHN5bWJvbCBpbmZvcm1hdGlvbiAodmlhIG1tYWxsb2MpLAorICAgdGhlbiB3ZSBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBmYWN0IHRoYXQgbW9yZSB0aGFuIG9uZSBwcm9jZXNzCisgICBtYXkgYmUgdXNpbmcgdGhlIHN5bWJvbCBpbmZvcm1hdGlvbiBhdCB0aGUgc2FtZSB0aW1lICh3aGVuIG1tYWxsb2MgaXMKKyAgIGV4dGVuZGVkIHRvIHN1cHBvcnQgY29vcGVyYXRpdmUgbG9ja2luZykuICBXaGVuIG1vcmUgdGhhbiBvbmUgcHJvY2VzcworICAgaXMgdXNpbmcgdGhlIG1hcHBlZCBzeW1ib2wgaW5mbywgd2UgbmVlZCB0byBiZSBtb3JlIGNhcmVmdWwgYWJvdXQgd2hlbgorICAgd2UgZnJlZSBvYmplY3RzIGluIHRoZSByZXVzYWJsZSBhcmVhLiAqLworCit2b2lkCitmcmVlX29iamZpbGUgKG9iamZpbGUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICAvKiBGaXJzdCBkbyBhbnkgc3ltYm9sIGZpbGUgc3BlY2lmaWMgYWN0aW9ucyByZXF1aXJlZCB3aGVuIHdlIGFyZQorICAgICBmaW5pc2hlZCB3aXRoIGEgcGFydGljdWxhciBzeW1ib2wgZmlsZS4gIE5vdGUgdGhhdCBpZiB0aGUgb2JqZmlsZQorICAgICBpcyB1c2luZyByZXVzYWJsZSBzeW1ib2wgaW5mb3JtYXRpb24gKHZpYSBtbWFsbG9jKSB0aGVuIGVhY2ggb2YKKyAgICAgdGhlc2Ugcm91dGluZXMgaXMgcmVzcG9uc2libGUgZm9yIGRvaW5nIHRoZSBjb3JyZWN0IHRoaW5nLCBlaXRoZXIKKyAgICAgZnJlZWluZyB0aGluZ3Mgd2hpY2ggYXJlIHZhbGlkIG9ubHkgZHVyaW5nIHRoaXMgcGFydGljdWxhciBnZGIKKyAgICAgZXhlY3V0aW9uLCBvciBsZWF2aW5nIHRoZW0gdG8gYmUgcmV1c2VkIGR1cmluZyB0aGUgbmV4dCBvbmUuICovCisKKyAgaWYgKG9iamZpbGUgLT4gc2YgIT0gTlVMTCkKKyAgICB7CisgICAgICAoKm9iamZpbGUgLT4gc2YgLT4gc3ltX2ZpbmlzaCkgKG9iamZpbGUpOworICAgIH0KKworICAvKiBXZSBhbHdheXMgY2xvc2UgdGhlIGJmZC4gKi8KKworICBpZiAob2JqZmlsZSAtPiBvYmZkICE9IE5VTEwpCisgICAgeworICAgICAgY2hhciAqbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKG9iamZpbGUtPm9iZmQpOworICAgICAgaWYgKCFiZmRfY2xvc2UgKG9iamZpbGUgLT4gb2JmZCkpCisJd2FybmluZyAoImNhbm5vdCBjbG9zZSBcIiVzXCI6ICVzIiwKKwkJIG5hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKyAgICAgIGZyZWUgKG5hbWUpOworICAgIH0KKworICAvKiBSZW1vdmUgaXQgZnJvbSB0aGUgY2hhaW4gb2YgYWxsIG9iamZpbGVzLiAqLworCisgIHVubGlua19vYmpmaWxlIChvYmpmaWxlKTsKKworICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gZnJlZSB0aGUgcnVudGltZSBjb21tb24gb2JqZmlsZSwgbWFyayBpdAorICAgICBhcyB1bmFsbG9jYXRlZC4gICovCisKKyAgaWYgKG9iamZpbGUgPT0gcnRfY29tbW9uX29iamZpbGUpCisgICAgcnRfY29tbW9uX29iamZpbGUgPSBOVUxMOworCisgIC8qIEJlZm9yZSB0aGUgc3ltYm9sIHRhYmxlIGNvZGUgd2FzIHJlZG9uZSB0byBtYWtlIGl0IGVhc2llciB0bworICAgICBzZWxlY3RpdmVseSBsb2FkIGFuZCByZW1vdmUgaW5mb3JtYXRpb24gcGFydGljdWxhciB0byBhIHNwZWNpZmljCisgICAgIGxpbmthZ2UgdW5pdCwgZ2RiIHVzZWQgdG8gZG8gdGhlc2UgdGhpbmdzIHdoZW5ldmVyIHRoZSBtb25vbGl0aGljCisgICAgIHN5bWJvbCB0YWJsZSB3YXMgYmxvd24gYXdheS4gIEhvdyBtdWNoIHN0aWxsIG5lZWRzIHRvIGJlIGRvbmUKKyAgICAgaXMgdW5rbm93biwgYnV0IHdlIHBsYXkgaXQgc2FmZSBmb3Igbm93IGFuZCBrZWVwIGVhY2ggYWN0aW9uIHVudGlsCisgICAgIGl0IGlzIHNob3duIHRvIGJlIG5vIGxvbmdlciBuZWVkZWQuICovCisgICAgIAorI2lmIGRlZmluZWQgKENMRUFSX1NPTElCKQorICBDTEVBUl9TT0xJQiAoKTsKKyAgLyogQ0xFQVJfU09MSUIgY2xvc2VzIHRoZSBiZmQncyBmb3IgYW55IHNoYXJlZCBsaWJyYXJpZXMuICBCdXQKKyAgICAgdGhlIHRvX3NlY3Rpb25zIGZvciBhIGNvcmUgZmlsZSBtaWdodCByZWZlciB0byB0aG9zZSBiZmQncy4gIFNvCisgICAgIGRldGFjaCBhbnkgY29yZSBmaWxlLiAgKi8KKyAgeworICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0ID0gZmluZF9jb3JlX3RhcmdldCAoKTsKKyAgICBpZiAodCAhPSBOVUxMKQorICAgICAgKHQtPnRvX2RldGFjaCkgKE5VTEwsIDApOworICB9CisjZW5kaWYKKyAgLyogSSAqdGhpbmsqIGFsbCBvdXIgY2FsbGVycyBjYWxsIGNsZWFyX3N5bXRhYl91c2Vycy4gIElmIHNvLCBubyBuZWVkCisgICAgIHRvIGNhbGwgdGhpcyBoZXJlLiAgKi8KKyAgY2xlYXJfcGNfZnVuY3Rpb25fY2FjaGUgKCk7CisKKyAgLyogVGhlIGxhc3QgdGhpbmcgd2UgZG8gaXMgZnJlZSB0aGUgb2JqZmlsZSBzdHJ1Y3QgaXRzZWxmIGZvciB0aGUKKyAgICAgbm9uLXJldXNhYmxlIGNhc2UsIG9yIGRldGFjaCBmcm9tIHRoZSBtYXBwZWQgZmlsZSBmb3IgdGhlIHJldXNhYmxlCisgICAgIGNhc2UuICBOb3RlIHRoYXQgdGhlIG1tYWxsb2NfZGV0YWNoIG9yIHRoZSBtZnJlZSBpcyB0aGUgbGFzdCB0aGluZworICAgICB3ZSBjYW4gZG8gd2l0aCB0aGlzIG9iamZpbGUuICovCisKKyNpZiBkZWZpbmVkKFVTRV9NTUFMTE9DKSAmJiBkZWZpbmVkKEhBVkVfTU1BUCkKKworICBpZiAob2JqZmlsZSAtPiBmbGFncyAmIE9CSkZfTUFQUEVEKQorICAgIHsKKyAgICAgIC8qIFJlbWVtYmVyIHRoZSBmZCBzbyB3ZSBjYW4gY2xvc2UgaXQuICBXZSBjYW4ndCBjbG9zZSBpdCBiZWZvcmUKKwkgZG9pbmcgdGhlIGRldGFjaCwgYW5kIGFmdGVyIHRoZSBkZXRhY2ggdGhlIG9iamZpbGUgaXMgZ29uZS4gKi8KKyAgICAgIGludCBtbWZkOworCisgICAgICBtbWZkID0gb2JqZmlsZSAtPiBtbWZkOworICAgICAgbW1hbGxvY19kZXRhY2ggKG9iamZpbGUgLT4gbWQpOworICAgICAgb2JqZmlsZSA9IE5VTEw7CisgICAgICBjbG9zZSAobW1mZCk7CisgICAgfQorCisjZW5kaWYJLyogZGVmaW5lZChVU0VfTU1BTExPQykgJiYgZGVmaW5lZChIQVZFX01NQVApICovCisKKyAgLyogSWYgd2Ugc3RpbGwgaGF2ZSBhbiBvYmpmaWxlLCB0aGVuIGVpdGhlciB3ZSBkb24ndCBzdXBwb3J0IHJldXNhYmxlCisgICAgIG9iamZpbGVzIG9yIHRoaXMgb25lIHdhcyBub3QgcmV1c2FibGUuICBTbyBmcmVlIGl0IG5vcm1hbGx5LiAqLworCisgIGlmIChvYmpmaWxlICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKG9iamZpbGUgLT4gbmFtZSAhPSBOVUxMKQorCXsKKwkgIG1mcmVlIChvYmpmaWxlIC0+IG1kLCBvYmpmaWxlIC0+IG5hbWUpOworCX0KKyAgICAgIGlmIChvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMubGlzdCkKKwltZnJlZSAob2JqZmlsZS0+bWQsIG9iamZpbGUtPmdsb2JhbF9wc3ltYm9scy5saXN0KTsKKyAgICAgIGlmIChvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMubGlzdCkKKwltZnJlZSAob2JqZmlsZS0+bWQsIG9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5saXN0KTsKKyAgICAgIC8qIEZyZWUgdGhlIG9ic3RhY2tzIGZvciBub24tcmV1c2FibGUgb2JqZmlsZXMgKi8KKyAgICAgIG9ic3RhY2tfZnJlZSAoJm9iamZpbGUgLT4gcHN5bWJvbF9jYWNoZS5jYWNoZSwgMCk7CisgICAgICBvYnN0YWNrX2ZyZWUgKCZvYmpmaWxlIC0+IHBzeW1ib2xfb2JzdGFjaywgMCk7CisgICAgICBvYnN0YWNrX2ZyZWUgKCZvYmpmaWxlIC0+IHN5bWJvbF9vYnN0YWNrLCAwKTsKKyAgICAgIG9ic3RhY2tfZnJlZSAoJm9iamZpbGUgLT4gdHlwZV9vYnN0YWNrLCAwKTsKKyAgICAgIG1mcmVlIChvYmpmaWxlIC0+IG1kLCBvYmpmaWxlKTsKKyAgICAgIG9iamZpbGUgPSBOVUxMOworICAgIH0KK30KKworCisvKiBGcmVlIGFsbCB0aGUgb2JqZWN0IGZpbGVzIGF0IG9uY2UgYW5kIGNsZWFuIHVwIHRoZWlyIHVzZXJzLiAgKi8KKwordm9pZAorZnJlZV9hbGxfb2JqZmlsZXMgKCkKK3sKKyAgc3RydWN0IG9iamZpbGUgKm9iamZpbGUsICp0ZW1wOworCisgIEFMTF9PQkpGSUxFU19TQUZFIChvYmpmaWxlLCB0ZW1wKQorICAgIHsKKyAgICAgIGZyZWVfb2JqZmlsZSAob2JqZmlsZSk7CisgICAgfQorICBjbGVhcl9zeW10YWJfdXNlcnMgKCk7Cit9CisMCisvKiBSZWxvY2F0ZSBPQkpGSUxFIHRvIE5FV19PRkZTRVRTLiAgVGhlcmUgc2hvdWxkIGJlIE9CSkZJTEUtPk5VTV9TRUNUSU9OUworICAgZW50cmllcyBpbiBuZXdfb2Zmc2V0cy4gICovCit2b2lkCitvYmpmaWxlX3JlbG9jYXRlIChvYmpmaWxlLCBuZXdfb2Zmc2V0cykKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKm5ld19vZmZzZXRzOworeworICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpkZWx0YSA9IChzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICopIAorICAgIGFsbG9jYSAoc2l6ZW9mIChzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzKQorCSAgICArIG9iamZpbGUtPm51bV9zZWN0aW9ucyAqIHNpemVvZiAoZGVsdGEtPm9mZnNldHMpKTsKKworICB7CisgICAgaW50IGk7CisgICAgaW50IHNvbWV0aGluZ19jaGFuZ2VkID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgb2JqZmlsZS0+bnVtX3NlY3Rpb25zOyArK2kpCisgICAgICB7CisJQU5PRkZTRVQgKGRlbHRhLCBpKSA9CisJICBBTk9GRlNFVCAobmV3X29mZnNldHMsIGkpIC0gQU5PRkZTRVQgKG9iamZpbGUtPnNlY3Rpb25fb2Zmc2V0cywgaSk7CisJaWYgKEFOT0ZGU0VUIChkZWx0YSwgaSkgIT0gMCkKKwkgIHNvbWV0aGluZ19jaGFuZ2VkID0gMTsKKyAgICAgIH0KKyAgICBpZiAoIXNvbWV0aGluZ19jaGFuZ2VkKQorICAgICAgcmV0dXJuOworICB9CisKKyAgLyogT0ssIGdldCBhbGwgdGhlIHN5bXRhYnMuICAqLworICB7CisgICAgc3RydWN0IHN5bXRhYiAqczsKKworICAgIEFMTF9PQkpGSUxFX1NZTVRBQlMgKG9iamZpbGUsIHMpCisgICAgICB7CisJc3RydWN0IGxpbmV0YWJsZSAqbDsKKwlzdHJ1Y3QgYmxvY2t2ZWN0b3IgKmJ2OworCWludCBpOworCQorCS8qIEZpcnN0IHRoZSBsaW5lIHRhYmxlLiAgKi8KKwlsID0gTElORVRBQkxFIChzKTsKKwlpZiAobCkKKwkgIHsKKwkgICAgZm9yIChpID0gMDsgaSA8IGwtPm5pdGVtczsgKytpKQorCSAgICAgIGwtPml0ZW1baV0ucGMgKz0gQU5PRkZTRVQgKGRlbHRhLCBzLT5ibG9ja19saW5lX3NlY3Rpb24pOworCSAgfQorCisJLyogRG9uJ3QgcmVsb2NhdGUgYSBzaGFyZWQgYmxvY2t2ZWN0b3IgbW9yZSB0aGFuIG9uY2UuICAqLworCWlmICghcy0+cHJpbWFyeSkKKwkgIGNvbnRpbnVlOworCisJYnYgPSBCTE9DS1ZFQ1RPUiAocyk7CisJZm9yIChpID0gMDsgaSA8IEJMT0NLVkVDVE9SX05CTE9DS1MgKGJ2KTsgKytpKQorCSAgeworCSAgICBzdHJ1Y3QgYmxvY2sgKmI7CisJICAgIGludCBqOworCSAgICAKKwkgICAgYiA9IEJMT0NLVkVDVE9SX0JMT0NLIChidiwgaSk7CisJICAgIEJMT0NLX1NUQVJUIChiKSArPSBBTk9GRlNFVCAoZGVsdGEsIHMtPmJsb2NrX2xpbmVfc2VjdGlvbik7CisJICAgIEJMT0NLX0VORCAoYikgICArPSBBTk9GRlNFVCAoZGVsdGEsIHMtPmJsb2NrX2xpbmVfc2VjdGlvbik7CisKKwkgICAgZm9yIChqID0gMDsgaiA8IEJMT0NLX05TWU1TIChiKTsgKytqKQorCSAgICAgIHsKKwkJc3RydWN0IHN5bWJvbCAqc3ltID0gQkxPQ0tfU1lNIChiLCBqKTsKKwkJLyogVGhlIFJTNjAwMCBjb2RlIGZyb20gd2hpY2ggdGhpcyB3YXMgdGFrZW4gc2tpcHBlZAorCQkgICBhbnkgc3ltYm9scyBpbiBTVFJVQ1RfTkFNRVNQQUNFIG9yIFVOREVGX05BTUVTUEFDRS4KKwkJICAgQnV0IEknbSBsZWF2aW5nIG91dCB0aGF0IHRlc3QsIG9uIHRoZSB0aGVvcnkgdGhhdAorCQkgICB0aGV5IGNhbid0IHBvc3NpYmx5IHBhc3MgdGhlIHRlc3RzIGJlbG93LiAgKi8KKwkJaWYgKChTWU1CT0xfQ0xBU1MgKHN5bSkgPT0gTE9DX0xBQkVMCisJCSAgICAgfHwgU1lNQk9MX0NMQVNTIChzeW0pID09IExPQ19TVEFUSUMgCisgICAgICAgICAgICAgICAgICAgICB8fCBTWU1CT0xfQ0xBU1MgKHN5bSkgPT0gTE9DX0lORElSRUNUKQorCQkgICAgJiYgU1lNQk9MX1NFQ1RJT04gKHN5bSkgPj0gMCkKKwkJICB7CisJCSAgICBTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltKSArPSAKKwkJICAgICAgQU5PRkZTRVQgKGRlbHRhLCBTWU1CT0xfU0VDVElPTiAoc3ltKSk7CisJCSAgfQorI2lmZGVmIE1JUFNfRUZJX1NZTUJPTF9OQU1FCisJCS8qIFJlbG9jYXRlIEV4dHJhIEZ1bmN0aW9uIEluZm8gZm9yIGVjb2ZmLiAgKi8KKworCQllbHNlCisJCSAgaWYgKFNZTUJPTF9DTEFTUyAoc3ltKSA9PSBMT0NfQ09OU1QKKwkJICAgICAgJiYgU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9PSBMQUJFTF9OQU1FU1BBQ0UKKwkJICAgICAgJiYgU1RSQ01QIChTWU1CT0xfTkFNRSAoc3ltKSwgTUlQU19FRklfU1lNQk9MX05BTUUpID09IDApCisJCWVjb2ZmX3JlbG9jYXRlX2VmaSAoc3ltLCBBTk9GRlNFVCAoZGVsdGEsIAorCQkJCQkJICAgcy0+YmxvY2tfbGluZV9zZWN0aW9uKSk7CisjZW5kaWYKKwkgICAgICB9CisJICB9CisgICAgICB9CisgIH0KKworICB7CisgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwOworCisgICAgQUxMX09CSkZJTEVfUFNZTVRBQlMgKG9iamZpbGUsIHApCisgICAgICB7CisJcC0+dGV4dGxvdyArPSBBTk9GRlNFVCAoZGVsdGEsIFNFQ1RfT0ZGX1RFWFQpOworCXAtPnRleHRoaWdoICs9IEFOT0ZGU0VUIChkZWx0YSwgU0VDVF9PRkZfVEVYVCk7CisgICAgICB9CisgIH0KKworICB7CisgICAgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqcHN5bTsKKworICAgIGZvciAocHN5bSA9IG9iamZpbGUtPmdsb2JhbF9wc3ltYm9scy5saXN0OworCSBwc3ltIDwgb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLm5leHQ7CisJIHBzeW0rKykKKyAgICAgIGlmIChTWU1CT0xfU0VDVElPTiAoKnBzeW0pID49IDApCisJU1lNQk9MX1ZBTFVFX0FERFJFU1MgKCpwc3ltKSArPSBBTk9GRlNFVCAoZGVsdGEsIAorCQkJCQkJICBTWU1CT0xfU0VDVElPTiAoKnBzeW0pKTsKKyAgICBmb3IgKHBzeW0gPSBvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMubGlzdDsKKwkgcHN5bSA8IG9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5uZXh0OworCSBwc3ltKyspCisgICAgICBpZiAoU1lNQk9MX1NFQ1RJT04gKCpwc3ltKSA+PSAwKQorCVNZTUJPTF9WQUxVRV9BRERSRVNTICgqcHN5bSkgKz0gQU5PRkZTRVQgKGRlbHRhLCAKKwkJCQkJCSAgU1lNQk9MX1NFQ1RJT04gKCpwc3ltKSk7CisgIH0KKworICB7CisgICAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltOworICAgIEFMTF9PQkpGSUxFX01TWU1CT0xTIChvYmpmaWxlLCBtc3ltKQorICAgICAgaWYgKFNZTUJPTF9TRUNUSU9OIChtc3ltKSA+PSAwKQorCVNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltKSArPSBBTk9GRlNFVCAoZGVsdGEsIFNZTUJPTF9TRUNUSU9OIChtc3ltKSk7CisgIH0KKyAgLyogUmVsb2NhdGluZyBkaWZmZXJlbnQgc2VjdGlvbnMgYnkgZGlmZmVyZW50IGFtb3VudHMgbWF5IGNhdXNlIHRoZSBzeW1ib2xzCisgICAgIHRvIGJlIG91dCBvZiBvcmRlci4gICovCisgIG1zeW1ib2xzX3NvcnQgKG9iamZpbGUpOworCisgIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgb2JqZmlsZS0+bnVtX3NlY3Rpb25zOyArK2kpCisgICAgICBBTk9GRlNFVCAob2JqZmlsZS0+c2VjdGlvbl9vZmZzZXRzLCBpKSA9IEFOT0ZGU0VUIChuZXdfb2Zmc2V0cywgaSk7CisgIH0KKworICB7CisgICAgc3RydWN0IG9ial9zZWN0aW9uICpzOworICAgIGJmZCAqYWJmZDsKKworICAgIGFiZmQgPSBvYmpmaWxlLT5vYmZkOworCisgICAgZm9yIChzID0gb2JqZmlsZS0+c2VjdGlvbnM7CisJIHMgPCBvYmpmaWxlLT5zZWN0aW9uc19lbmQ7ICsrcykKKyAgICAgIHsKKwlmbGFnd29yZCBmbGFnczsKKworCWZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLT50aGVfYmZkX3NlY3Rpb24pOworCisJaWYgKGZsYWdzICYgU0VDX0NPREUpCisJICB7CisJICAgIHMtPmFkZHIgICAgKz0gQU5PRkZTRVQgKGRlbHRhLCBTRUNUX09GRl9URVhUKTsKKwkgICAgcy0+ZW5kYWRkciArPSBBTk9GRlNFVCAoZGVsdGEsIFNFQ1RfT0ZGX1RFWFQpOworCSAgfQorCWVsc2UgaWYgKGZsYWdzICYgKFNFQ19EQVRBIHwgU0VDX0xPQUQpKQorCSAgeworCSAgICBzLT5hZGRyICAgICs9IEFOT0ZGU0VUIChkZWx0YSwgU0VDVF9PRkZfREFUQSk7CisJICAgIHMtPmVuZGFkZHIgKz0gQU5PRkZTRVQgKGRlbHRhLCBTRUNUX09GRl9EQVRBKTsKKwkgIH0KKwllbHNlIGlmIChmbGFncyAmIFNFQ19BTExPQykKKwkgIHsKKwkgICAgcy0+YWRkciAgICArPSBBTk9GRlNFVCAoZGVsdGEsIFNFQ1RfT0ZGX0JTUyk7CisJICAgIHMtPmVuZGFkZHIgKz0gQU5PRkZTRVQgKGRlbHRhLCBTRUNUX09GRl9CU1MpOworCSAgfQorICAgICAgfQorICB9CisKKyAgaWYgKG9iamZpbGUtPmVpLmVudHJ5X3BvaW50ICE9IH4oQ09SRV9BRERSKTApCisgICAgb2JqZmlsZS0+ZWkuZW50cnlfcG9pbnQgKz0gQU5PRkZTRVQgKGRlbHRhLCBTRUNUX09GRl9URVhUKTsKKworICBpZiAob2JqZmlsZS0+ZWkuZW50cnlfZnVuY19sb3dwYyAhPSBJTlZBTElEX0VOVFJZX0xPV1BDKQorICAgIHsKKyAgICAgIG9iamZpbGUtPmVpLmVudHJ5X2Z1bmNfbG93cGMgICs9IEFOT0ZGU0VUIChkZWx0YSwgU0VDVF9PRkZfVEVYVCk7CisgICAgICBvYmpmaWxlLT5laS5lbnRyeV9mdW5jX2hpZ2hwYyArPSBBTk9GRlNFVCAoZGVsdGEsIFNFQ1RfT0ZGX1RFWFQpOworICAgIH0KKworICBpZiAob2JqZmlsZS0+ZWkuZW50cnlfZmlsZV9sb3dwYyAhPSBJTlZBTElEX0VOVFJZX0xPV1BDKQorICAgIHsKKyAgICAgIG9iamZpbGUtPmVpLmVudHJ5X2ZpbGVfbG93cGMgICs9IEFOT0ZGU0VUIChkZWx0YSwgU0VDVF9PRkZfVEVYVCk7CisgICAgICBvYmpmaWxlLT5laS5lbnRyeV9maWxlX2hpZ2hwYyArPSBBTk9GRlNFVCAoZGVsdGEsIFNFQ1RfT0ZGX1RFWFQpOworICAgIH0KKworICBpZiAob2JqZmlsZS0+ZWkubWFpbl9mdW5jX2xvd3BjICE9IElOVkFMSURfRU5UUllfTE9XUEMpCisgICAgeworICAgICAgb2JqZmlsZS0+ZWkubWFpbl9mdW5jX2xvd3BjICArPSBBTk9GRlNFVCAoZGVsdGEsIFNFQ1RfT0ZGX1RFWFQpOworICAgICAgb2JqZmlsZS0+ZWkubWFpbl9mdW5jX2hpZ2hwYyArPSBBTk9GRlNFVCAoZGVsdGEsIFNFQ1RfT0ZGX1RFWFQpOworICAgIH0KKworICAvKiBSZWxvY2F0ZSBicmVha3BvaW50cyBhcyBuZWNlc3NhcnksIGFmdGVyIHRoaW5ncyBhcmUgcmVsb2NhdGVkLiAqLworICBicmVha3BvaW50X3JlX3NldCAoKTsKK30KKwwKKy8qIE1hbnkgcGxhY2VzIGluIGdkYiB3YW50IHRvIHRlc3QganVzdCB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgcGFydGlhbAorICAgc3ltYm9scyBhdmFpbGFibGUuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpZiBub25lIGFyZSBjdXJyZW50bHkKKyAgIGF2YWlsYWJsZSwgbm9uemVybyBvdGhlcndpc2UuICovCisKK2ludAoraGF2ZV9wYXJ0aWFsX3N5bWJvbHMgKCkKK3sKKyAgc3RydWN0IG9iamZpbGUgKm9mcDsKKworICBBTExfT0JKRklMRVMgKG9mcCkKKyAgICB7CisgICAgICBpZiAob2ZwIC0+IHBzeW10YWJzICE9IE5VTEwpCisJeworCSAgcmV0dXJuIDE7CisJfQorICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIE1hbnkgcGxhY2VzIGluIGdkYiB3YW50IHRvIHRlc3QganVzdCB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgZnVsbAorICAgc3ltYm9scyBhdmFpbGFibGUuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpZiBub25lIGFyZSBjdXJyZW50bHkKKyAgIGF2YWlsYWJsZSwgbm9uemVybyBvdGhlcndpc2UuICovCisKK2ludAoraGF2ZV9mdWxsX3N5bWJvbHMgKCkKK3sKKyAgc3RydWN0IG9iamZpbGUgKm9mcDsKKworICBBTExfT0JKRklMRVMgKG9mcCkKKyAgICB7CisgICAgICBpZiAob2ZwIC0+IHN5bXRhYnMgIT0gTlVMTCkKKwl7CisJICByZXR1cm4gMTsKKwl9CisgICAgfQorICByZXR1cm4gMDsKK30KKworCisvKiBUaGlzIG9wZXJhdGlvbnMgZGVsZXRlcyBhbGwgb2JqZmlsZSBlbnRyaWVzIHRoYXQgcmVwcmVzZW50IHNvbGlicyB0aGF0CisgICB3ZXJlbid0IGV4cGxpY2l0bHkgbG9hZGVkIGJ5IHRoZSB1c2VyLCB2aWEgZS5nLiwgdGhlIGFkZC1zeW1ib2wtZmlsZQorICAgY29tbWFuZC4KKyAgICovCit2b2lkCitvYmpmaWxlX3B1cmdlX3NvbGlicyAoKQoreworICBzdHJ1Y3Qgb2JqZmlsZSAqICBvYmpmOworICBzdHJ1Y3Qgb2JqZmlsZSAqICB0ZW1wOworCisgIEFMTF9PQkpGSUxFU19TQUZFIChvYmpmLCB0ZW1wKQorICB7CisgICAgLyogV2UgYXNzdW1lIHRoYXQgdGhlIHNvbGliIHBhY2thZ2UgaGFzIGJlZW4gcHVyZ2VkIGFscmVhZHksIG9yIHdpbGwKKyAgICAgICBiZSBzb29uLgorICAgICAgICovCisgICAgaWYgKCEgb2JqZi0+dXNlcl9sb2FkZWQgJiYgb2JqZi0+aXNfc29saWIpCisgICAgICBmcmVlX29iamZpbGUgKG9iamYpOworICB9Cit9CisKKworLyogTWFueSBwbGFjZXMgaW4gZ2RiIHdhbnQgdG8gdGVzdCBqdXN0IHRvIHNlZSBpZiB3ZSBoYXZlIGFueSBtaW5pbWFsCisgICBzeW1ib2xzIGF2YWlsYWJsZS4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGlmIG5vbmUgYXJlIGN1cnJlbnRseQorICAgYXZhaWxhYmxlLCBub256ZXJvIG90aGVyd2lzZS4gKi8KKworaW50CitoYXZlX21pbmltYWxfc3ltYm9scyAoKQoreworICBzdHJ1Y3Qgb2JqZmlsZSAqb2ZwOworCisgIEFMTF9PQkpGSUxFUyAob2ZwKQorICAgIHsKKyAgICAgIGlmIChvZnAgLT4gbXN5bWJvbHMgIT0gTlVMTCkKKwl7CisJICByZXR1cm4gMTsKKwl9CisgICAgfQorICByZXR1cm4gMDsKK30KKworI2lmIGRlZmluZWQoVVNFX01NQUxMT0MpICYmIGRlZmluZWQoSEFWRV9NTUFQKQorCisvKiBHaXZlbiB0aGUgbmFtZSBvZiBhIG1hcHBlZCBzeW1ib2wgZmlsZSBpbiBTWU1TRklMRU5BTUUsIGFuZCB0aGUgdGltZXN0YW1wCisgICBvZiB0aGUgY29ycmVzcG9uZGluZyBzeW1ib2wgZmlsZSBpbiBNVElNRSwgdHJ5IHRvIG9wZW4gYW4gZXhpc3RpbmcgZmlsZQorICAgd2l0aCB0aGUgbmFtZSBTWU1TRklMRU5BTUUgYW5kIHZlcmlmeSBpdCBpcyBtb3JlIHJlY2VudCB0aGFuIHRoZSBiYXNlCisgICBmaWxlIGJ5IGNoZWNraW5nIGl0J3MgdGltZXN0YW1wIGFnYWluc3QgTVRJTUUuCisKKyAgIElmIFNZTVNGSUxFTkFNRSBkb2VzIG5vdCBleGlzdCAob3IgY2FuJ3QgYmUgc3RhdCdkKSwgc2ltcGx5IHJldHVybnMgLTEuCisKKyAgIElmIFNZTVNGSUxFTkFNRSBkb2VzIGV4aXN0LCBidXQgaXMgb3V0IG9mIGRhdGUsIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUKKyAgIHVzZXIgaGFzIHNwZWNpZmllZCBjcmVhdGlvbiBvZiBhIG1hcHBlZCBmaWxlLiAgSWYgc28sIHdlIGRvbid0IGlzc3VlCisgICBhbnkgd2FybmluZyBtZXNzYWdlIGJlY2F1c2Ugd2Ugd2lsbCBiZSBjcmVhdGluZyBhIG5ldyBtYXBwZWQgZmlsZSBhbnl3YXksCisgICBvdmVyd3JpdGluZyB0aGUgb2xkIG9uZS4gIElmIG5vdCwgdGhlbiB3ZSBpc3N1ZSBhIHdhcm5pbmcgbWVzc2FnZSBzbyB0aGF0CisgICB0aGUgdXNlciB3aWxsIGtub3cgd2h5IHdlIGFyZW4ndCB1c2luZyB0aGlzIGV4aXN0aW5nIG1hcHBlZCBzeW1ib2wgZmlsZS4KKyAgIEluIGVpdGhlciBjYXNlLCB3ZSByZXR1cm4gLTEuCisKKyAgIElmIFNZTVNGSUxFTkFNRSBkb2VzIGV4aXN0IGFuZCBpcyBub3Qgb3V0IG9mIGRhdGUsIGJ1dCBjYW4ndCBiZSBvcGVuZWQgZm9yCisgICBzb21lIHJlYXNvbiwgdGhlbiBwcmludHMgYW4gYXBwcm9wcmlhdGUgc3lzdGVtIGVycm9yIG1lc3NhZ2UgYW5kIHJldHVybnMgLTEuCisKKyAgIE90aGVyd2lzZSwgcmV0dXJucyB0aGUgb3BlbiBmaWxlIGRlc2NyaXB0b3IuICAqLworCitzdGF0aWMgaW50CitvcGVuX2V4aXN0aW5nX21hcHBlZF9maWxlIChzeW1zZmlsZW5hbWUsIG10aW1lLCBtYXBwZWQpCisgICAgIGNoYXIgKnN5bXNmaWxlbmFtZTsKKyAgICAgbG9uZyBtdGltZTsKKyAgICAgaW50IG1hcHBlZDsKK3sKKyAgaW50IGZkID0gLTE7CisgIHN0cnVjdCBzdGF0IHNidWY7CisKKyAgaWYgKHN0YXQgKHN5bXNmaWxlbmFtZSwgJnNidWYpID09IDApCisgICAgeworICAgICAgaWYgKHNidWYuc3RfbXRpbWUgPCBtdGltZSkKKwl7CisJICBpZiAoIW1hcHBlZCkKKwkgICAgeworCSAgICAgIHdhcm5pbmcgKCJtYXBwZWQgc3ltYm9sIGZpbGUgYCVzJyBpcyBvdXQgb2YgZGF0ZSwgaWdub3JlZCBpdCIsCisJCSAgICAgICBzeW1zZmlsZW5hbWUpOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoKGZkID0gb3BlbiAoc3ltc2ZpbGVuYW1lLCBPX1JEV1IpKSA8IDApCisJeworCSAgaWYgKGVycm9yX3ByZV9wcmludCkKKwkgICAgeworCSAgICAgIHByaW50Zl91bmZpbHRlcmVkIChlcnJvcl9wcmVfcHJpbnQpOworCSAgICB9CisJICBwcmludF9zeXNfZXJybXNnIChzeW1zZmlsZW5hbWUsIGVycm5vKTsKKwl9CisgICAgfQorICByZXR1cm4gKGZkKTsKK30KKworLyogTG9vayBmb3IgYSBtYXBwZWQgc3ltYm9sIGZpbGUgdGhhdCBjb3JyZXNwb25kcyB0byBGSUxFTkFNRSBhbmQgaXMgbW9yZQorICAgcmVjZW50IHRoYW4gTVRJTUUuICBJZiBNQVBQRUQgaXMgbm9uemVybywgdGhlIHVzZXIgaGFzIGFza2VkIHRoYXQgZ2RiCisgICB1c2UgYSBtYXBwZWQgc3ltYm9sIGZpbGUgZm9yIHRoaXMgZmlsZSwgc28gY3JlYXRlIGEgbmV3IG9uZSBpZiBvbmUgZG9lcworICAgbm90IGN1cnJlbnRseSBleGlzdC4KKworICAgSWYgZm91bmQsIHRoZW4gcmV0dXJuIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZSwgb3RoZXJ3aXNlCisgICByZXR1cm4gLTEuCisKKyAgIFRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBwb2xpY3kgdGhhdCBnZW5lcmF0ZXMKKyAgIHRoZSBuYW1lIG9mIHRoZSBtYXBwZWQgc3ltYm9sIGZpbGUgZnJvbSB0aGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZworICAgc3ltYm9scyB0aGF0IGdkYiB3b3VsZCBsaWtlIHRvIHJlYWQuICBDdXJyZW50bHkgdGhpcyBwb2xpY3kgaXMgdG8gYXBwZW5kCisgICAiLnN5bXMiIHRvIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorCisgICBUaGlzIHJvdXRpbmUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBwb2xpY3kgdGhhdAorICAgZGV0ZXJtaW5lcyB3aGVyZSB0aGUgbWFwcGVkIHN5bWJvbCBmaWxlIGlzIGZvdW5kICh0aGUgc2VhcmNoIHBhdGgpLgorICAgVGhpcyBwb2xpY3kgaXMgdGhhdCB3aGVuIHJlYWRpbmcgYW4gZXhpc3RpbmcgbWFwcGVkIGZpbGUsIGEgZmlsZSBvZgorICAgdGhlIGNvcnJlY3QgbmFtZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGEKKyAgIGZpbGUgb2YgdGhlIGNvcnJlY3QgbmFtZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIHN5bWJvbCBmaWxlLgorICAgV2hlbiBjcmVhdGluZyBhIG5ldyBtYXBwZWQgZmlsZSwgaXQgaXMgYWx3YXlzIGNyZWF0ZWQgaW4gdGhlIGN1cnJlbnQKKyAgIGRpcmVjdG9yeS4gIFRoaXMgaGVscHMgdG8gbWluaW1pemUgdGhlIGNoYW5jZXMgb2YgYSB1c2VyIHVua25vd2luZ2x5CisgICBjcmVhdGluZyBiaWcgbWFwcGVkIGZpbGVzIGluIHBsYWNlcyBsaWtlIC9iaW4gYW5kIC91c3IvbG9jYWwvYmluLCBhbmQKKyAgIGFsbG93cyBhIGxvY2FsIGNvcHkgdG8gb3ZlcnJpZGUgYSBtYW51YWxseSBpbnN0YWxsZWQgZ2xvYmFsIGNvcHkgKGluCisgICAvYmluIGZvciBleGFtcGxlKS4gICovCisKK3N0YXRpYyBpbnQKK29wZW5fbWFwcGVkX2ZpbGUgKGZpbGVuYW1lLCBtdGltZSwgbWFwcGVkKQorICAgICBjaGFyICpmaWxlbmFtZTsKKyAgICAgbG9uZyBtdGltZTsKKyAgICAgaW50IG1hcHBlZDsKK3sKKyAgaW50IGZkOworICBjaGFyICpzeW1zZmlsZW5hbWU7CisKKyAgLyogRmlyc3QgdHJ5IHRvIG9wZW4gYW4gZXhpc3RpbmcgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIGFuZAorICAgICB0aGVuIHRyeSB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBzeW1ib2wgZmlsZSBpcyBsb2NhdGVkLiAqLworCisgIHN5bXNmaWxlbmFtZSA9IGNvbmNhdCAoIi4vIiwgYmFzZW5hbWUgKGZpbGVuYW1lKSwgIi5zeW1zIiwgKGNoYXIgKikgTlVMTCk7CisgIGlmICgoZmQgPSBvcGVuX2V4aXN0aW5nX21hcHBlZF9maWxlIChzeW1zZmlsZW5hbWUsIG10aW1lLCBtYXBwZWQpKSA8IDApCisgICAgeworICAgICAgZnJlZSAoc3ltc2ZpbGVuYW1lKTsKKyAgICAgIHN5bXNmaWxlbmFtZSA9IGNvbmNhdCAoZmlsZW5hbWUsICIuc3ltcyIsIChjaGFyICopIE5VTEwpOworICAgICAgZmQgPSBvcGVuX2V4aXN0aW5nX21hcHBlZF9maWxlIChzeW1zZmlsZW5hbWUsIG10aW1lLCBtYXBwZWQpOworICAgIH0KKworICAvKiBJZiB3ZSBkb24ndCBoYXZlIGFuIG9wZW4gZmlsZSBieSBub3csIHRoZW4gZWl0aGVyIHRoZSBmaWxlIGRvZXMgbm90CisgICAgIGFscmVhZHkgZXhpc3QsIG9yIHRoZSBiYXNlIGZpbGUgaGFzIGNoYW5nZWQgc2luY2UgaXQgd2FzIGNyZWF0ZWQuICBJbgorICAgICBlaXRoZXIgY2FzZSwgaWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCB1c2Ugb2YgYSBtYXBwZWQgZmlsZSwgdGhlbgorICAgICBjcmVhdGUgYSBuZXcgbWFwcGVkIGZpbGUsIHRydW5jYXRpbmcgYW55IGV4aXN0aW5nIG9uZS4gIElmIHdlIGNhbid0CisgICAgIGNyZWF0ZSBvbmUsIHByaW50IGEgc3lzdGVtIGVycm9yIG1lc3NhZ2Ugc2F5aW5nIHdoeSB3ZSBjYW4ndC4KKworICAgICBCeSBkZWZhdWx0IHRoZSBmaWxlIGlzIHJ3IGZvciBldmVyeW9uZSwgd2l0aCB0aGUgdXNlcidzIHVtYXNrIHRha2luZworICAgICBjYXJlIG9mIHR1cm5pbmcgb2ZmIHRoZSBwZXJtaXNzaW9ucyB0aGUgdXNlciB3YW50cyBvZmYuICovCisKKyAgaWYgKChmZCA8IDApICYmIG1hcHBlZCkKKyAgICB7CisgICAgICBmcmVlIChzeW1zZmlsZW5hbWUpOworICAgICAgc3ltc2ZpbGVuYW1lID0gY29uY2F0ICgiLi8iLCBiYXNlbmFtZSAoZmlsZW5hbWUpLCAiLnN5bXMiLAorCQkJICAgICAoY2hhciAqKSBOVUxMKTsKKyAgICAgIGlmICgoZmQgPSBvcGVuIChzeW1zZmlsZW5hbWUsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjY2KSkgPCAwKQorCXsKKwkgIGlmIChlcnJvcl9wcmVfcHJpbnQpCisJICAgIHsKKwkgICAgICBwcmludGZfdW5maWx0ZXJlZCAoZXJyb3JfcHJlX3ByaW50KTsKKwkgICAgfQorCSAgcHJpbnRfc3lzX2Vycm1zZyAoc3ltc2ZpbGVuYW1lLCBlcnJubyk7CisJfQorICAgIH0KKworICBmcmVlIChzeW1zZmlsZW5hbWUpOworICByZXR1cm4gKGZkKTsKK30KKworc3RhdGljIFBUUgorbWFwX3RvX2ZpbGUgKGZkKQorICAgICBpbnQgZmQ7Cit7CisgIFBUUiBtZDsKKyAgQ09SRV9BRERSIG1hcHRvOworCisgIG1kID0gbW1hbGxvY19hdHRhY2ggKGZkLCAoUFRSKSAwKTsKKyAgaWYgKG1kICE9IE5VTEwpCisgICAgeworICAgICAgbWFwdG8gPSAoQ09SRV9BRERSKSBtbWFsbG9jX2dldGtleSAobWQsIDEpOworICAgICAgbWQgPSBtbWFsbG9jX2RldGFjaCAobWQpOworICAgICAgaWYgKG1kICE9IE5VTEwpCisJeworCSAgLyogRklYTUU6IHNob3VsZCBmaWd1cmUgb3V0IHdoeSBkZXRhY2ggZmFpbGVkICovCisJICBtZCA9IE5VTEw7CisJfQorICAgICAgZWxzZSBpZiAobWFwdG8gIT0gKENPUkVfQUREUikgTlVMTCkKKwl7CisJICAvKiBUaGlzIG1hcHBpbmcgZmlsZSBuZWVkcyB0byBiZSByZW1hcHBlZCBhdCAibWFwdG8iICovCisJICBtZCA9IG1tYWxsb2NfYXR0YWNoIChmZCwgKFBUUikgbWFwdG8pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBUaGlzIGlzIGEgZnJlc2hseSBjcmVhdGVkIG1hcHBpbmcgZmlsZS4gKi8KKwkgIG1hcHRvID0gKENPUkVfQUREUikgbW1hbGxvY19maW5kYmFzZSAoMjAgKiAxMDI0ICogMTAyNCk7CisJICBpZiAobWFwdG8gIT0gMCkKKwkgICAgeworCSAgICAgIC8qIFRvIGF2b2lkIHJldXNpbmcgdGhlIGZyZXNobHkgY3JlYXRlZCBtYXBwaW5nIGZpbGUsIGF0IHRoZSAKKwkJIGFkZHJlc3Mgc2VsZWN0ZWQgYnkgbW1hcCwgd2UgbXVzdCB0cnVuY2F0ZSBpdCBiZWZvcmUgdHJ5aW5nCisJCSB0byBkbyBhbiBhdHRhY2ggYXQgdGhlIGFkZHJlc3Mgd2Ugd2FudC4gKi8KKwkgICAgICBmdHJ1bmNhdGUgKGZkLCAwKTsKKwkgICAgICBtZCA9IG1tYWxsb2NfYXR0YWNoIChmZCwgKFBUUikgbWFwdG8pOworCSAgICAgIGlmIChtZCAhPSBOVUxMKQorCQl7CisJCSAgbW1hbGxvY19zZXRrZXkgKG1kLCAxLCAoUFRSKSBtYXB0byk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybiAobWQpOworfQorCisjZW5kaWYJLyogZGVmaW5lZChVU0VfTU1BTExPQykgJiYgZGVmaW5lZChIQVZFX01NQVApICovCisKKy8qIFJldHVybnMgYSBzZWN0aW9uIHdob3NlIHJhbmdlIGluY2x1ZGVzIFBDIGFuZCBTRUNUSU9OLCAKKyAgIG9yIE5VTEwgaWYgbm9uZSBmb3VuZC4gIE5vdGUgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gdGhlIHJldHVybiB0eXBlLCAKKyAgIHN0cnVjdCBvYmpfc2VjdGlvbiAod2hpY2ggaXMgZGVmaW5lZCBpbiBnZGIpLCBhbmQgdGhlIGlucHV0IHR5cGUKKyAgIHN0cnVjdCBzZWMgKHdoaWNoIGlzIGEgYmZkLWRlZmluZWQgZGF0YSB0eXBlKS4gIFRoZSBvYmpfc2VjdGlvbgorICAgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBiZmQgc3RydWN0IHNlYyBzZWN0aW9uLiAgKi8KKworc3RydWN0IG9ial9zZWN0aW9uICoKK2ZpbmRfcGNfc2VjdF9zZWN0aW9uIChwYywgc2VjdGlvbikKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBzdHJ1Y3Qgc2VjICpzZWN0aW9uOworeworICBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnM7CisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAKKyAgQUxMX09CSkZJTEVTIChvYmpmaWxlKQorICAgIGZvciAocyA9IG9iamZpbGUtPnNlY3Rpb25zOyBzIDwgb2JqZmlsZS0+c2VjdGlvbnNfZW5kOyArK3MpCisjaWYgZGVmaW5lZChIUFVYSFBQQSkKKyAgICAgIGlmICgoc2VjdGlvbiA9PSAwIHx8IHNlY3Rpb24gPT0gcy0+dGhlX2JmZF9zZWN0aW9uKSAmJiAKKwkgIHMtPmFkZHIgPD0gcGMgJiYgcGMgPD0gcy0+ZW5kYWRkcikKKyNlbHNlCisgICAgICBpZiAoKHNlY3Rpb24gPT0gMCB8fCBzZWN0aW9uID09IHMtPnRoZV9iZmRfc2VjdGlvbikgJiYgCisJICBzLT5hZGRyIDw9IHBjICYmIHBjIDwgcy0+ZW5kYWRkcikKKyNlbmRpZgorCXJldHVybihzKTsKKworICByZXR1cm4oTlVMTCk7Cit9CisKKy8qIFJldHVybnMgYSBzZWN0aW9uIHdob3NlIHJhbmdlIGluY2x1ZGVzIFBDIG9yIE5VTEwgaWYgbm9uZSBmb3VuZC4gCisgICBCYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBubyBzZWN0aW9uLiAgKi8KKworc3RydWN0IG9ial9zZWN0aW9uICoKK2ZpbmRfcGNfc2VjdGlvbihwYykKKyAgICAgQ09SRV9BRERSIHBjOworeworICByZXR1cm4gZmluZF9wY19zZWN0X3NlY3Rpb24gKHBjLCBmaW5kX3BjX21hcHBlZF9zZWN0aW9uIChwYykpOworfQorICAKKworLyogSW4gU1ZSNCwgd2UgcmVjb2duaXplIGEgdHJhbXBvbGluZSBieSBpdCdzIHNlY3Rpb24gbmFtZS4gCisgICBUaGF0IGlzLCBpZiB0aGUgcGMgaXMgaW4gYSBzZWN0aW9uIG5hbWVkICIucGx0IiB0aGVuIHdlIGFyZSBpbgorICAgYSB0cmFtcG9saW5lLiAgKi8KKworaW50Citpbl9wbHRfc2VjdGlvbihwYywgbmFtZSkKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBjaGFyICpuYW1lOworeworICBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnM7CisgIGludCByZXR2YWwgPSAwOworICAKKyAgcyA9IGZpbmRfcGNfc2VjdGlvbihwYyk7CisgIAorICByZXR2YWwgPSAocyAhPSBOVUxMCisJICAgICYmIHMtPnRoZV9iZmRfc2VjdGlvbi0+bmFtZSAhPSBOVUxMCisJICAgICYmIFNUUkVRIChzLT50aGVfYmZkX3NlY3Rpb24tPm5hbWUsICIucGx0IikpOworICByZXR1cm4ocmV0dmFsKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9vYmpmaWxlcy5oIGIvZ2RiL29iamZpbGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1ZGYwNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9vYmpmaWxlcy5oCkBAIC0wLDAgKzEsNTcyIEBACisvKiBEZWZpbml0aW9ucyBmb3Igc3ltYm9sIGZpbGUgbWFuYWdlbWVudCBpbiBHREIuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIChPQkpGSUxFU19IKQorI2RlZmluZSBPQkpGSUxFU19ICisKKy8qIFRoaXMgc3RydWN0dXJlIG1haW50YWlucyBpbmZvcm1hdGlvbiBvbiBhIHBlci1vYmpmaWxlIGJhc2lzIGFib3V0IHRoZQorICAgImVudHJ5IHBvaW50IiBvZiB0aGUgb2JqZmlsZSwgYW5kIHRoZSBzY29wZSB3aXRoaW4gd2hpY2ggdGhlIGVudHJ5IHBvaW50CisgICBleGlzdHMuICBJdCBpcyBwb3NzaWJsZSB0aGF0IGdkYiB3aWxsIHNlZSBtb3JlIHRoYW4gb25lIG9iamZpbGUgdGhhdCBpcworICAgZXhlY3V0YWJsZSwgZWFjaCB3aXRoIGl0cyBvd24gZW50cnkgcG9pbnQuCisKKyAgIEZvciBleGFtcGxlLCBmb3IgZHluYW1pY2FsbHkgbGlua2VkIGV4ZWN1dGFibGVzIGluIFNWUjQsIHRoZSBkeW5hbWljIGxpbmtlcgorICAgY29kZSBpcyBjb250YWluZWQgd2l0aGluIHRoZSBzaGFyZWQgQyBsaWJyYXJ5LCB3aGljaCBpcyBhY3R1YWxseSBleGVjdXRhYmxlCisgICBhbmQgaXMgcnVuIGJ5IHRoZSBrZXJuZWwgZmlyc3Qgd2hlbiBhbiBleGVjIGlzIGRvbmUgb2YgYSB1c2VyIGV4ZWN1dGFibGUKKyAgIHRoYXQgaXMgZHluYW1pY2FsbHkgbGlua2VkLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpdGhpbiB0aGUgc2hhcmVkIEMgbGlicmFyeQorICAgdGhlbiBtYXBzIGluIHRoZSB2YXJpb3VzIHByb2dyYW0gc2VnbWVudHMgaW4gdGhlIHVzZXIgZXhlY3V0YWJsZSBhbmQganVtcHMKKyAgIHRvIHRoZSB1c2VyIGV4ZWN1dGFibGUncyByZWNvcmRlZCBlbnRyeSBwb2ludCwgYXMgaWYgdGhlIGNhbGwgaGFkIGJlZW4gbWFkZQorICAgZGlyZWN0bHkgYnkgdGhlIGtlcm5lbC4KKworICAgVGhlIHRyYWRpdGlvbmFsIGdkYiBtZXRob2Qgb2YgdXNpbmcgdGhpcyBpbmZvIGlzIHRvIHVzZSB0aGUgcmVjb3JkZWQgZW50cnkKKyAgIHBvaW50IHRvIHNldCB0aGUgdmFyaWFibGVzIGVudHJ5X2ZpbGVfbG93cGMgYW5kIGVudHJ5X2ZpbGVfaGlnaHBjIGZyb20KKyAgIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHdoZXJlIHRoZXNlIHZhbHVlcyBhcmUgdGhlIHN0YXJ0aW5nIGFkZHJlc3MKKyAgIChpbmNsdXNpdmUpIGFuZCBlbmRpbmcgYWRkcmVzcyAoZXhjbHVzaXZlKSBvZiB0aGUgaW5zdHJ1Y3Rpb24gc3BhY2UgaW4gdGhlCisgICBleGVjdXRhYmxlIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlICJzdGFydHVwIGZpbGUiLCBJLkUuIGNydDAubyBpbiBtb3N0CisgICBjYXNlcy4gIFRoaXMgZmlsZSBpcyBhc3N1bWVkIHRvIGJlIGEgc3RhcnR1cCBmaWxlIGFuZCBmcmFtZXMgd2l0aCBwYydzCisgICBpbnNpZGUgaXQgYXJlIHRyZWF0ZWQgYXMgbm9uZXhpc3RlbnQuICBTZXR0aW5nIHRoZXNlIHZhcmlhYmxlcyBpcyBuZWNlc3NhcnkKKyAgIHNvIHRoYXQgYmFja3RyYWNlcyBkbyBub3QgZmx5IG9mZiB0aGUgYm90dG9tIG9mIHRoZSBzdGFjay4KKworICAgR2RiIGFsc28gc3VwcG9ydHMgYW4gYWx0ZXJuYXRlIG1ldGhvZCB0byBhdm9pZCBydW5uaW5nIG9mZiB0aGUgYm90dG9tCisgICBvZiB0aGUgc3RhY2suCisKKyAgIFRoZXJlIGFyZSB0d28gZnJhbWVzIHRoYXQgYXJlICJzcGVjaWFsIiwgdGhlIGZyYW1lIGZvciB0aGUgZnVuY3Rpb24KKyAgIGNvbnRhaW5pbmcgdGhlIHByb2Nlc3MgZW50cnkgcG9pbnQsIHNpbmNlIGl0IGhhcyBubyBwcmVkZWNlc3NvciBmcmFtZSwKKyAgIGFuZCB0aGUgZnJhbWUgZm9yIHRoZSBmdW5jdGlvbiBjb250YWluaW5nIHRoZSB1c2VyIGNvZGUgZW50cnkgcG9pbnQKKyAgICh0aGUgbWFpbigpIGZ1bmN0aW9uKSwgc2luY2UgYWxsIHRoZSBwcmVkZWNlc3NvciBmcmFtZXMgYXJlIGZvciB0aGUKKyAgIHByb2Nlc3Mgc3RhcnR1cCBjb2RlLiAgU2luY2Ugd2UgaGF2ZSBubyBndWFyYW50ZWUgdGhhdCB0aGUgbGlua2VkCisgICBpbiBzdGFydHVwIG1vZHVsZXMgaGF2ZSBhbnkgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRoYXQgZ2RiIGNhbiB1c2UsCisgICB3ZSBuZWVkIHRvIGF2b2lkIGZvbGxvd2luZyBmcmFtZSBwb2ludGVycyBiYWNrIGludG8gZnJhbWVzIHRoYXQgbWlnaHQKKyAgIGhhdmUgYmVlbiBidWlsdCBpbiB0aGUgc3RhcnR1cCBjb2RlLCBhcyB3ZSBtaWdodCBnZXQgaG9wZWxlc3NseSAKKyAgIGNvbmZ1c2VkLiAgSG93ZXZlciwgd2UgYWxtb3N0IGFsd2F5cyBoYXZlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorICAgYXZhaWxhYmxlIGZvciBtYWluKCkuCisKKyAgIFRoZXNlIHZhcmlhYmxlcyBhcmUgdXNlZCB0byBzYXZlIHRoZSByYW5nZSBvZiBQQyB2YWx1ZXMgd2hpY2ggYXJlIHZhbGlkCisgICB3aXRoaW4gdGhlIG1haW4oKSBmdW5jdGlvbiBhbmQgd2l0aGluIHRoZSBmdW5jdGlvbiBjb250YWluaW5nIHRoZSBwcm9jZXNzCisgICBlbnRyeSBwb2ludC4gIElmIHdlIGFsd2F5cyBjb25zaWRlciB0aGUgZnJhbWUgZm9yIG1haW4oKSBhcyB0aGUgb3V0ZXJtb3N0CisgICBmcmFtZSB3aGVuIGRlYnVnZ2luZyB1c2VyIGNvZGUsIGFuZCB0aGUgZnJhbWUgZm9yIHRoZSBwcm9jZXNzIGVudHJ5CisgICBwb2ludCBmdW5jdGlvbiBhcyB0aGUgb3V0ZXJtb3N0IGZyYW1lIHdoZW4gZGVidWdnaW5nIHN0YXJ0dXAgY29kZSwgdGhlbgorICAgYWxsIHdlIGhhdmUgdG8gZG8gaXMgaGF2ZSBGUkFNRV9DSEFJTl9WQUxJRCByZXR1cm4gZmFsc2Ugd2hlbmV2ZXIgYQorICAgZnJhbWUncyBjdXJyZW50IFBDIGlzIHdpdGhpbiB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5IHRoZXNlIHZhcmlhYmxlcy4KKyAgIEluIGVzc2VuY2UsIHdlIHNldCAiY2VpbGluZ3MiIGluIHRoZSBmcmFtZSBjaGFpbiBiZXlvbmQgd2hpY2ggd2Ugd2lsbAorICAgbm90IHByb2NlZWQgd2hlbiBmb2xsb3dpbmcgdGhlIGZyYW1lIGNoYWluIGJhY2sgdXAgdGhlIHN0YWNrLgorCisgICBBIG5pY2Ugc2lkZSBlZmZlY3QgaXMgdGhhdCB3ZSBjYW4gc3RpbGwgZGVidWcgc3RhcnR1cCBjb2RlIHdpdGhvdXQKKyAgIHJ1bm5pbmcgb2ZmIHRoZSBlbmQgb2YgdGhlIGZyYW1lIGNoYWluLCBhc3N1bWluZyB0aGF0IHdlIGhhdmUgdXNhYmxlCisgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIHN0YXJ0dXAgbW9kdWxlcywgYW5kIGlmIHdlIGNob29zZSB0byBub3QKKyAgIHVzZSB0aGUgYmxvY2sgYXQgbWFpbiwgb3IgY2FuJ3QgZmluZCBpdCBmb3Igc29tZSByZWFzb24sIGV2ZXJ5dGhpbmcKKyAgIHN0aWxsIHdvcmtzIGFzIGJlZm9yZS4gIEFuZCBpZiB3ZSBoYXZlIG5vIHN0YXJ0dXAgY29kZSBkZWJ1Z2dpbmcKKyAgIGluZm9ybWF0aW9uIGJ1dCB3ZSBkbyBoYXZlIHVzYWJsZSBpbmZvcm1hdGlvbiBmb3IgbWFpbigpLCBiYWNrdHJhY2VzCisgICBmcm9tIHVzZXIgY29kZSBkb24ndCBnbyB3YW5kZXJpbmcgb2ZmIGludG8gdGhlIHN0YXJ0dXAgY29kZS4KKworICAgVG8gdXNlIHRoaXMgbWV0aG9kLCBkZWZpbmUgeW91ciBGUkFNRV9DSEFJTl9WQUxJRCBtYWNybyBsaWtlOgorCisJI2RlZmluZSBGUkFNRV9DSEFJTl9WQUxJRChjaGFpbiwgdGhpc2ZyYW1lKSAgICAgXAorCSAgKGNoYWluICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAmJiAhKGluc2lkZV9tYWluX2Z1bmMgKCh0aGlzZnJhbWUpLT5wYykpICAgICBcCisJICAgJiYgIShpbnNpZGVfZW50cnlfZnVuYyAoKHRoaXNmcmFtZSktPnBjKSkpCisKKyAgIGFuZCBhZGQgaW5pdGlhbGl6YXRpb25zIG9mIHRoZSBmb3VyIHNjb3BlIGNvbnRyb2xsaW5nIHZhcmlhYmxlcyBpbnNpZGUKKyAgIHRoZSBvYmplY3QgZmlsZSAvIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBwcm9jZXNzaW5nIG1vZHVsZXMuICAqLworCitzdHJ1Y3QgZW50cnlfaW5mbworeworICAKKyAgLyogVGhlIHZhbHVlIHdlIHNob3VsZCB1c2UgZm9yIHRoaXMgb2JqZWN0cyBlbnRyeSBwb2ludC4KKyAgICAgVGhlIGlsbGVnYWwvdW5rbm93biB2YWx1ZSBuZWVkcyB0byBiZSBzb21ldGhpbmcgb3RoZXIgdGhhbiAwLCB+MAorICAgICBmb3IgaW5zdGFuY2UsIHdoaWNoIGlzIG11Y2ggbGVzcyBsaWtlbHkgdGhhbiAwLiAqLworCisgIENPUkVfQUREUiBlbnRyeV9wb2ludDsKKworI2RlZmluZSBJTlZBTElEX0VOVFJZX1BPSU5UICh+MCkgLyogfjAgd2lsbCBub3QgYmUgaW4gYW55IGZpbGUsIHdlIGhvcGUuICAqLworCisgIC8qIFN0YXJ0IChpbmNsdXNpdmUpIGFuZCBlbmQgKGV4Y2x1c2l2ZSkgb2YgZnVuY3Rpb24gY29udGFpbmluZyB0aGUKKyAgICAgZW50cnkgcG9pbnQuICovCisKKyAgQ09SRV9BRERSIGVudHJ5X2Z1bmNfbG93cGM7CisgIENPUkVfQUREUiBlbnRyeV9mdW5jX2hpZ2hwYzsKKworICAvKiBTdGFydCAoaW5jbHVzaXZlKSBhbmQgZW5kIChleGNsdXNpdmUpIG9mIG9iamVjdCBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAgIGVudHJ5IHBvaW50LiAqLworICAKKyAgQ09SRV9BRERSIGVudHJ5X2ZpbGVfbG93cGM7CisgIENPUkVfQUREUiBlbnRyeV9maWxlX2hpZ2hwYzsKKworICAvKiBTdGFydCAoaW5jbHVzaXZlKSBhbmQgZW5kIChleGNsdXNpdmUpIG9mIHRoZSB1c2VyIGNvZGUgbWFpbigpIGZ1bmN0aW9uLiAqLworCisgIENPUkVfQUREUiBtYWluX2Z1bmNfbG93cGM7CisgIENPUkVfQUREUiBtYWluX2Z1bmNfaGlnaHBjOworCisvKiBVc2UgdGhlc2UgdmFsdWVzIHdoZW4gYW55IG9mIHRoZSBhYm92ZSByYW5nZXMgaXMgaW52YWxpZC4gICovCisKKy8qIFdlIHVzZSB0aGVzZSB2YWx1ZXMgYmVjYXVzZSBpdCBndWFyYW50ZWVzIHRoYXQgdGhlcmUgaXMgbm8gbnVtYmVyIHRoYXQgaXMKKyAgIGJvdGggPj0gTE9XUEMgJiYgPCBISUdIUEMuICBJdCBpcyBhbHNvIGhpZ2hseSB1bmxpa2VseSB0aGF0IDMgaXMgYSB2YWxpZAorICAgbW9kdWxlIG9yIGZ1bmN0aW9uIHN0YXJ0IGFkZHJlc3MgKGFzIG9wcG9zZWQgdG8gMCkuICAqLworCisjZGVmaW5lIElOVkFMSURfRU5UUllfTE9XUEMgKDMpCisjZGVmaW5lIElOVkFMSURfRU5UUllfSElHSFBDICgxKQorCit9OworCisvKiBTZWN0aW9ucyBpbiBhbiBvYmpmaWxlLgorCisgICBJdCBpcyBzdHJhbmdlIHRoYXQgd2UgaGF2ZSBib3RoIHRoaXMgbm90aW9uIG9mICJzZWN0aW9ucyIKKyAgIGFuZCB0aGUgb25lIHVzZWQgYnkgc2VjdGlvbl9vZmZzZXRzLiAgU2VjdGlvbiBhcyB1c2VkCisgICBoZXJlLCAoY3VycmVudGx5IGF0IGxlYXN0KSBtZWFucyBhIEJGRCBzZWN0aW9uLCBhbmQgdGhlIHNlY3Rpb25zCisgICBhcmUgc2V0IHVwIGZyb20gdGhlIEJGRCBzZWN0aW9ucyBpbiBhbGxvY2F0ZV9vYmpmaWxlLgorCisgICBUaGUgc2VjdGlvbnMgaW4gc2VjdGlvbl9vZmZzZXRzIGhhdmUgdGhlaXIgbWVhbmluZyBkZXRlcm1pbmVkIGJ5CisgICB0aGUgc3ltYm9sIGZvcm1hdCwgYW5kIHRoZXkgYXJlIHNldCB1cCBieSB0aGUgc3ltX29mZnNldHMgZnVuY3Rpb24KKyAgIGZvciB0aGF0IHN5bWJvbCBmaWxlIGZvcm1hdC4KKworICAgSSdtIG5vdCBzdXJlIHRoaXMgY291bGQgb3Igc2hvdWxkIGJlIGNoYW5nZWQsIGhvd2V2ZXIuICAqLworCitzdHJ1Y3Qgb2JqX3NlY3Rpb24geworICBDT1JFX0FERFIJYWRkcjsJIC8qIGxvd2VzdCBhZGRyZXNzIGluIHNlY3Rpb24gKi8KKyAgQ09SRV9BRERSCWVuZGFkZHI7IC8qIDEraGlnaGVzdCBhZGRyZXNzIGluIHNlY3Rpb24gKi8KKworICAvKiBUaGlzIGZpZWxkIGlzIGJlaW5nIHVzZWQgZm9yIG5lZmFyaW91cyBwdXJwb3NlcyBieSBzeW1zX2Zyb21fb2JqZmlsZS4KKyAgICAgSXQgaXMgc2FpZCB0byBiZSByZWR1bmRhbnQgd2l0aCBzZWN0aW9uX29mZnNldHM7IGl0J3Mgbm90IHJlYWxseSBiZWluZworICAgICB1c2VkIHRoYXQgd2F5LCBob3dldmVyLCBpdCdzIHNvbWUgc29ydCBvZiBoYWNrIEkgZG9uJ3QgdW5kZXJzdGFuZAorICAgICBhbmQgYW0gbm90IGdvaW5nIHRvIHRyeSB0byBlbGltaW5hdGUgKHlldCwgYW55d2F5KS4gIEZJWE1FLgorCisgICAgIEl0IHdhcyBkb2N1bWVudGVkIGFzICJvZmZzZXQgYmV0d2VlbiAoZW5kKWFkZHIgYW5kIGFjdHVhbCBtZW1vcnkKKyAgICAgYWRkcmVzc2VzIiwgYnV0IHRoYXQncyBub3QgdHJ1ZTsgYWRkciAmIGVuZGFkZHIgYXJlIGFjdHVhbCBtZW1vcnkKKyAgICAgYWRkcmVzc2VzLiAgKi8KKyAgQ09SRV9BRERSIG9mZnNldDsKKworICBzZWNfcHRyIHRoZV9iZmRfc2VjdGlvbjsgLyogQkZEIHNlY3Rpb24gcG9pbnRlciAqLworCisgIC8qIE9iamZpbGUgdGhpcyBzZWN0aW9uIGlzIHBhcnQgb2YuICAqLworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKworICAvKiBUcnVlIGlmIHRoaXMgIm92ZXJsYXkgc2VjdGlvbiIgaXMgbWFwcGVkIGludG8gYW4gIm92ZXJsYXkgcmVnaW9uIi4gKi8KKyAgaW50IG92bHlfbWFwcGVkOworfTsKKworLyogQW4gaW1wb3J0IGVudHJ5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sIHRoYXQKKyAgIGlzIHVzZWQgaW4gdGhpcyBvYmpmaWxlIGJ1dCBub3QgZGVmaW5lZCBpbiBpdCwgYW5kIHNvIG5lZWRzCisgICB0byBiZSBpbXBvcnRlZCBmcm9tIHNvbWUgb3RoZXIgb2JqZmlsZSAqLworLyogQ3VycmVudGx5IHdlIGp1c3Qgc3RvcmUgdGhlIG5hbWU7IG5vIGF0dHJpYnV0ZXMuIDE5OTctMDgtMDUgKi8gCit0eXBlZGVmIGNoYXIgKiBJbXBvcnRFbnRyeTsKKworCisvKiBBbiBleHBvcnQgZW50cnkgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBzeW1ib2wgdGhhdAorICAgaXMgZGVmaW5lZCBpbiB0aGlzIG9iamZpbGUgYW5kIGF2YWlsYWJsZSBmb3IgdXNlIGluIG90aGVyCisgICBvYmpmaWxlcyAqLyAKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciAqIG5hbWU7IC8qIG5hbWUgb2YgZXhwb3J0ZWQgc3ltYm9sICovIAorICBpbnQgYWRkcmVzczsgLyogb2Zmc2V0IHN1YmplY3QgdG8gcmVsb2NhdGlvbiAqLyAKKyAgLyogQ3VycmVudGx5IG5vIG90aGVyIGF0dHJpYnV0ZXMgMTk5Ny0wOC0wNSAqLyAKK30gRXhwb3J0RW50cnk7CisKKworCisvKiBUaGUgIm9ianN0YXRzIiBzdHJ1Y3R1cmUgcHJvdmlkZXMgYSBwbGFjZSBmb3IgZ2RiIHRvIHJlY29yZCBzb21lCisgICBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiBhYm91dCBpdHMgaW50ZXJuYWwgc3RhdGUgYXQgcnVudGltZSwgb24gYQorICAgcGVyIG9iamZpbGUgYmFzaXMsIHN1Y2ggYXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG51bWJlciBvZiBzeW1ib2xzCisgICByZWFkLCBzaXplIG9mIHN0cmluZyB0YWJsZSAoaWYgYW55KSwgZXRjLiAqLworCisjaWYgTUFJTlRFTkFOQ0VfQ01EUworCitzdHJ1Y3Qgb2Jqc3RhdHMgeworICBpbnQgbl9taW5zeW1zOwkvKiBOdW1iZXIgb2YgbWluaW1hbCBzeW1ib2xzIHJlYWQgKi8KKyAgaW50IG5fcHN5bXM7CQkvKiBOdW1iZXIgb2YgcGFydGlhbCBzeW1ib2xzIHJlYWQgKi8KKyAgaW50IG5fc3ltczsJCS8qIE51bWJlciBvZiBmdWxsIHN5bWJvbHMgcmVhZCAqLworICBpbnQgbl9zdGFiczsJCS8qIE51bWJlciBvZiAiLnN0YWJzIiByZWFkIChpZiBhcHBsaWNhYmxlKSAqLworICBpbnQgbl90eXBlczsJCS8qIE51bWJlciBvZiB0eXBlcyAqLworICBpbnQgc3pfc3RydGFiOwkvKiBTaXplIG9mIHN0cmluZ3RhYmxlLCAoaWYgYXBwbGljYWJsZSkgKi8KK307CisKKyNkZWZpbmUgT0JKU1RBVChvYmpmaWxlLCBleHByKSAob2JqZmlsZSAtPiBzdGF0cy5leHByKQorI2RlZmluZSBPQkpTVEFUUyBzdHJ1Y3Qgb2Jqc3RhdHMgc3RhdHMKK2V4dGVybiB2b2lkIHByaW50X29iamZpbGVfc3RhdGlzdGljcyBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBwcmludF9zeW1ib2xfYmNhY2hlX3N0YXRpc3RpY3MgUEFSQU1TICgodm9pZCkpOworCisjZWxzZQorCisjZGVmaW5lIE9CSlNUQVQob2JqZmlsZSwgZXhwcikJLyogTm90aGluZyAqLworI2RlZmluZSBPQkpTVEFUUwkJLyogTm90aGluZyAqLworCisjZW5kaWYJLyogTUFJTlRFTkFOQ0VfQ01EUyAqLworCisvKiBNYXN0ZXIgc3RydWN0dXJlIGZvciBrZWVwaW5nIHRyYWNrIG9mIGVhY2ggZmlsZSBmcm9tIHdoaWNoCisgICBnZGIgcmVhZHMgc3ltYm9scy4gIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdGhlc2UgZ2V0IGFsbG9jYXRlZDogMS4KKyAgIFRoZSBtYWluIHN5bWJvbCBmaWxlLCBzeW1maWxlX29iamZpbGUsIHNldCBieSB0aGUgc3ltYm9sLWZpbGUgY29tbWFuZCwKKyAgIDIuICBBZGRpdGlvbmFsIHN5bWJvbCBmaWxlcyBhZGRlZCBieSB0aGUgYWRkLXN5bWJvbC1maWxlIGNvbW1hbmQsCisgICAzLiAgU2hhcmVkIGxpYnJhcnkgb2JqZmlsZXMsIGFkZGVkIGJ5IEFERF9TT0xJQiwgIDQuICBzeW1ib2wgZmlsZXMKKyAgIGZvciBtb2R1bGVzIHRoYXQgd2VyZSBsb2FkZWQgd2hlbiBHREIgYXR0YWNoZWQgdG8gYSByZW1vdGUgc3lzdGVtCisgICAoc2VlIHJlbW90ZS12eC5jKS4gICovCisKK3N0cnVjdCBvYmpmaWxlCit7CisKKyAgLyogQWxsIHN0cnVjdCBvYmpmaWxlJ3MgYXJlIGNoYWluZWQgdG9nZXRoZXIgYnkgdGhlaXIgbmV4dCBwb2ludGVycy4KKyAgICAgVGhlIGdsb2JhbCB2YXJpYWJsZSAib2JqZWN0X2ZpbGVzIiBwb2ludHMgdG8gdGhlIGZpcnN0IGxpbmsgaW4gdGhpcworICAgICBjaGFpbi4KKworICAgICBGSVhNRTogIFRoZXJlIGlzIGEgcHJvYmxlbSBoZXJlIGlmIHRoZSBvYmpmaWxlIGlzIHJldXNhYmxlLCBhbmQgaWYKKyAgICAgbXVsdGlwbGUgdXNlcnMgYXJlIHRvIGJlIHN1cHBvcnRlZC4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgdGhlIG9iamZpbGUKKyAgICAgbGlzdCBpcyBsaW5rZWQgdGhyb3VnaCBhIG1lbWJlciBvZiB0aGUgb2JqZmlsZSBzdHJ1Y3QgaXRzZWxmLCB3aGljaAorICAgICBpcyBvbmx5IHZhbGlkIGZvciBvbmUgZ2RiIHByb2Nlc3MuICBUaGUgbGlzdCBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0bworICAgICBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBsaWtlOgorCisgICAgIHN0cnVjdCBsaXN0IHtzdHJ1Y3QgbGlzdCAqbmV4dDsgc3RydWN0IG9iamZpbGUgKm9iamZpbGV9OworCisgICAgIHdoZXJlIHRoZSBsaXN0IHN0cnVjdHVyZSBpcyBjb21wbGV0ZWx5IG1haW50YWluZWQgc2VwYXJhdGVseSB3aXRoaW4KKyAgICAgZWFjaCBnZGIgcHJvY2Vzcy4gKi8KKworICBzdHJ1Y3Qgb2JqZmlsZSAqbmV4dDsKKworICAvKiBUaGUgb2JqZWN0IGZpbGUncyBuYW1lLiAgTWFsbG9jJ2Q7IGZyZWUgaXQgaWYgeW91IGZyZWUgdGhpcyBzdHJ1Y3QuICAqLworCisgIGNoYXIgKm5hbWU7CisKKyAgLyogVFJVRSBpZiB0aGlzIG9iamZpbGUgd2FzIGNyZWF0ZWQgYmVjYXVzZSB0aGUgdXNlciBleHBsaWNpdGx5IGNhdXNlZAorICAgICBpdCAoZS5nLiwgdXNlZCB0aGUgYWRkLXN5bWJvbC1maWxlIGNvbW1hbmQpLgorICAgICAqLworICBpbnQgIHVzZXJfbG9hZGVkOworCisgIC8qIFRSVUUgaWYgdGhpcyBvYmpmaWxlIHdhcyBleHBsaWNpdGx5IGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgc29saWIuCisKKyAgICAgKElmIEZBTFNFLCB0aGUgb2JqZmlsZSBtYXkgYWN0dWFsbHkgYmUgYSBzb2xpYi4gIFRoaXMgY2FuIGhhcHBlbiBpZgorICAgICB0aGUgdXNlciBjcmVhdGVkIHRoZSBvYmpmaWxlIGJ5IHVzaW5nIHRoZSBhZGQtc3ltYm9sLWZpbGUgY29tbWFuZC4KKyAgICAgR0RCIGRvZXNuJ3QgaW4gdGhhdCBzaXR1YXRpb24gYWN0dWFsbHkgY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBhCisgICAgIHNvbGliLiAgUmF0aGVyLCB0aGUgdGFyZ2V0J3MgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNvbGliIGludGVyZmFjZQorICAgICBpcyByZXNwb25zaWJsZSBmb3Igc2V0dGluZyB0aGlzIGZsYWcgd2hlbiBub3RpY2luZyBzb2xpYnMgdXNlZCBieQorICAgICBhbiBpbmZlcmlvci4pCisgICAgICovCisgIGludCAgaXNfc29saWI7CisKKyAgLyogU29tZSBmbGFnIGJpdHMgZm9yIHRoaXMgb2JqZmlsZS4gKi8KKworICB1bnNpZ25lZCBzaG9ydCBmbGFnczsKKworICAvKiBFYWNoIG9iamZpbGUgcG9pbnRzIHRvIGEgbGlua2VkIGxpc3Qgb2Ygc3ltdGFicyBkZXJpdmVkIGZyb20gdGhpcyBmaWxlLAorICAgICBvbmUgc3ltdGFiIHN0cnVjdHVyZSBmb3IgZWFjaCBjb21waWxhdGlvbiB1bml0IChzb3VyY2UgZmlsZSkuICBFYWNoIGxpbmsKKyAgICAgaW4gdGhlIHN5bXRhYiBsaXN0IGNvbnRhaW5zIGEgYmFja3BvaW50ZXIgdG8gdGhpcyBvYmpmaWxlLiAqLworCisgIHN0cnVjdCBzeW10YWIgKnN5bXRhYnM7CisKKyAgLyogRWFjaCBvYmpmaWxlIHBvaW50cyB0byBhIGxpbmtlZCBsaXN0IG9mIHBhcnRpYWwgc3ltdGFicyBkZXJpdmVkIGZyb20KKyAgICAgdGhpcyBmaWxlLCBvbmUgcGFydGlhbCBzeW10YWIgc3RydWN0dXJlIGZvciBlYWNoIGNvbXBpbGF0aW9uIHVuaXQKKyAgICAgKHNvdXJjZSBmaWxlKS4gKi8KKworICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzeW10YWJzOworCisgIC8qIExpc3Qgb2YgZnJlZWQgcGFydGlhbCBzeW10YWJzLCBhdmFpbGFibGUgZm9yIHJlLXVzZSAqLworCisgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqZnJlZV9wc3ltdGFiczsKKworICAvKiBUaGUgb2JqZWN0IGZpbGUncyBCRkQuICBDYW4gYmUgbnVsbCBpZiB0aGUgb2JqZmlsZSBjb250YWlucyBvbmx5CisgICAgIG1pbmltYWwgc3ltYm9scywgZS5nLiB0aGUgcnVuIHRpbWUgY29tbW9uIHN5bWJvbHMgZm9yIFN1bk9TNC4gICovCisKKyAgYmZkICpvYmZkOworCisgIC8qIFRoZSBtb2RpZmljYXRpb24gdGltZXN0YW1wIG9mIHRoZSBvYmplY3QgZmlsZSwgYXMgb2YgdGhlIGxhc3QgdGltZQorICAgICB3ZSByZWFkIGl0cyBzeW1ib2xzLiAgKi8KKworICBsb25nIG10aW1lOworCisgIC8qIE9ic3RhY2tzIHRvIGhvbGQgb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBmcmVlZCB3aGVuIHdlIGxvYWQgYSBuZXcgc3ltYm9sCisgICAgIHRhYmxlIGZyb20gdGhpcyBvYmplY3QgZmlsZS4gKi8KKworICBzdHJ1Y3Qgb2JzdGFjayBwc3ltYm9sX29ic3RhY2s7CS8qIFBhcnRpYWwgc3ltYm9scyAqLworICBzdHJ1Y3Qgb2JzdGFjayBzeW1ib2xfb2JzdGFjazsJLyogRnVsbCBzeW1ib2xzICovCisgIHN0cnVjdCBvYnN0YWNrIHR5cGVfb2JzdGFjazsJCS8qIFR5cGVzICovCisKKyAgLyogQSBieXRlIGNhY2hlIHdoZXJlIHdlIGNhbiBzdGFzaCBhcmJpdHJhcnkgImNodW5rcyIgb2YgYnl0ZXMgdGhhdAorICAgICB3aWxsIG5vdCBjaGFuZ2UuICovCisKKyAgc3RydWN0IGJjYWNoZSBwc3ltYm9sX2NhY2hlOwkJLyogQnl0ZSBjYWNoZSBmb3IgcGFydGlhbCBzeW1zICovCisKKyAgLyogVmVjdG9ycyBvZiBhbGwgcGFydGlhbCBzeW1ib2xzIHJlYWQgaW4gZnJvbSBmaWxlLiAgVGhlIGFjdHVhbCBkYXRhCisgICAgIGlzIHN0b3JlZCBpbiB0aGUgcHN5bWJvbF9vYnN0YWNrLiAqLworCisgIHN0cnVjdCBwc3ltYm9sX2FsbG9jYXRpb25fbGlzdCBnbG9iYWxfcHN5bWJvbHM7CisgIHN0cnVjdCBwc3ltYm9sX2FsbG9jYXRpb25fbGlzdCBzdGF0aWNfcHN5bWJvbHM7CisKKyAgLyogRWFjaCBmaWxlIGNvbnRhaW5zIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBtaW5pbWFsIHN5bWJvbHMgZm9yIGFsbAorICAgICBnbG9iYWwgc3ltYm9scyB0aGF0IGFyZSBkZWZpbmVkIHdpdGhpbiB0aGUgZmlsZS4gIFRoZSBhcnJheSBpcyB0ZXJtaW5hdGVkCisgICAgIGJ5IGEgIm51bGwgc3ltYm9sIiwgb25lIHRoYXQgaGFzIGEgTlVMTCBwb2ludGVyIGZvciB0aGUgbmFtZSBhbmQgYSB6ZXJvCisgICAgIHZhbHVlIGZvciB0aGUgYWRkcmVzcy4gIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB3YWxrIHRocm91Z2ggdGhlIGFycmF5CisgICAgIHdoZW4gcGFzc2VkIGEgcG9pbnRlciB0byBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiBpdC4gIFRoZXJlIGlzIGFsc28KKyAgICAgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIHN5bWJvbHMsIHdoaWNoIGRvZXMgbm90IGluY2x1ZGUgdGhlIHRlcm1pbmF0aW5nCisgICAgIG51bGwgc3ltYm9sLiAgVGhlIGFycmF5IGl0c2VsZiwgYXMgd2VsbCBhcyBhbGwgdGhlIGRhdGEgdGhhdCBpdCBwb2ludHMKKyAgICAgdG8sIHNob3VsZCBiZSBhbGxvY2F0ZWQgb24gdGhlIHN5bWJvbF9vYnN0YWNrIGZvciB0aGlzIGZpbGUuICovCisKKyAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sczsKKyAgaW50IG1pbmltYWxfc3ltYm9sX2NvdW50OworCisgIC8qIEZvciBvYmplY3QgZmlsZSBmb3JtYXRzIHdoaWNoIGRvbid0IHNwZWNpZnkgZnVuZGFtZW50YWwgdHlwZXMsIGdkYgorICAgICBjYW4gY3JlYXRlIHN1Y2ggdHlwZXMuICBGb3Igbm93LCBpdCBtYWludGFpbnMgYSB2ZWN0b3Igb2YgcG9pbnRlcnMKKyAgICAgdG8gdGhlc2UgaW50ZXJuYWxseSBjcmVhdGVkIGZ1bmRhbWVudGFsIHR5cGVzIG9uIGEgcGVyIG9iamZpbGUgYmFzaXMsCisgICAgIGhvd2V2ZXIgaXQgcmVhbGx5IHNob3VsZCB1bHRpbWF0ZWx5IGtlZXAgdGhlbSBvbiBhIHBlci1jb21waWxhdGlvbi11bml0CisgICAgIGJhc2lzLCB0byBhY2NvdW50IGZvciBsaW5rYWdlLXVuaXRzIHRoYXQgY29uc2lzdCBvZiBhIG51bWJlciBvZgorICAgICBjb21waWxhdGlvbiB1bml0cyB0aGF0IG1heSBoYXZlIGRpZmZlcmVudCBmdW5kYW1lbnRhbCB0eXBlcywgc3VjaCBhcworICAgICBsaW5raW5nIEMgbW9kdWxlcyB3aXRoIEFEQSBtb2R1bGVzLCBvciBsaW5raW5nIEMgbW9kdWxlcyB0aGF0IGFyZQorICAgICBjb21waWxlZCB3aXRoIDMyLWJpdCBpbnRzIHdpdGggQyBtb2R1bGVzIHRoYXQgYXJlIGNvbXBpbGVkIHdpdGggNjQtYml0CisgICAgIGludHMgKG5vdCBpbmhlcmVudGx5IGV2aWwgd2l0aCBhIHNtYXJ0ZXIgbGlua2VyKS4gKi8KKworICBzdHJ1Y3QgdHlwZSAqKmZ1bmRhbWVudGFsX3R5cGVzOworCisgIC8qIFRoZSBtbWFsbG9jKCkgbWFsbG9jLWRlc2NyaXB0b3IgZm9yIHRoaXMgb2JqZmlsZSBpZiB3ZSBhcmUgdXNpbmcKKyAgICAgdGhlIG1lbW9yeSBtYXBwZWQgbWFsbG9jKCkgcGFja2FnZSB0byBtYW5hZ2Ugc3RvcmFnZSBmb3IgdGhpcyBvYmpmaWxlJ3MKKyAgICAgZGF0YS4gIE5VTEwgaWYgd2UgYXJlIG5vdC4gKi8KKworICBQVFIgbWQ7CisKKyAgLyogVGhlIGZpbGUgZGVzY3JpcHRvciB0aGF0IHdhcyB1c2VkIHRvIG9idGFpbiB0aGUgbW1hbGxvYyBkZXNjcmlwdG9yCisgICAgIGZvciB0aGlzIG9iamZpbGUuICBJZiB3ZSBjYWxsIG1tYWxsb2NfZGV0YWNoIHdpdGggdGhlIG1hbGxvYyBkZXNjcmlwdG9yCisgICAgIHdlIHNob3VsZCB0aGVuIGNsb3NlIHRoaXMgZmlsZSBkZXNjcmlwdG9yLiAqLworCisgIGludCBtbWZkOworCisgIC8qIFN0cnVjdHVyZSB3aGljaCBrZWVwcyB0cmFjayBvZiBmdW5jdGlvbnMgdGhhdCBtYW5pcHVsYXRlIG9iamZpbGUncworICAgICBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoaXMgb2JqZmlsZS4gIEkuRS4gdGhlIGZ1bmN0aW9uIHRvIHJlYWQgcGFydGlhbAorICAgICBzeW1ib2xzIGZvciBleGFtcGxlLiAgTm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlIGlzIGluIHN0YXRpY2FsbHkKKyAgICAgYWxsb2NhdGVkIG1lbW9yeSwgYW5kIGlzIHNoYXJlZCBieSBhbGwgb2JqZmlsZXMgdGhhdCB1c2UgdGhlCisgICAgIG9iamVjdCBtb2R1bGUgcmVhZGVyIG9mIHRoaXMgdHlwZS4gKi8KKworICBzdHJ1Y3Qgc3ltX2ZucyAqc2Y7CisKKyAgLyogVGhlIHBlci1vYmpmaWxlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbnRyeSBwb2ludCwgdGhlIHNjb3BlIChmaWxlL2Z1bmMpCisgICAgIGNvbnRhaW5pbmcgdGhlIGVudHJ5IHBvaW50LCBhbmQgdGhlIHNjb3BlIG9mIHRoZSB1c2VyJ3MgbWFpbigpIGZ1bmMuICovCisKKyAgc3RydWN0IGVudHJ5X2luZm8gZWk7CisKKyAgLyogSW5mb3JtYXRpb24gYWJvdXQgc3RhYnMuICBXaWxsIGJlIGZpbGxlZCBpbiB3aXRoIGEgZGJ4X3N5bWZpbGVfaW5mbworICAgICBzdHJ1Y3QgYnkgdGhvc2UgcmVhZGVycyB0aGF0IG5lZWQgaXQuICovCisKKyAgc3RydWN0IGRieF9zeW1maWxlX2luZm8gKnN5bV9zdGFiX2luZm87CisKKyAgLyogSG9vayBmb3IgaW5mb3JtYXRpb24gZm9yIHVzZSBieSB0aGUgc3ltYm9sIHJlYWRlciAoY3VycmVudGx5IHVzZWQKKyAgICAgZm9yIGluZm9ybWF0aW9uIHNoYXJlZCBieSBzeW1faW5pdCBhbmQgc3ltX3JlYWQpLiAgSXQgaXMKKyAgICAgdHlwaWNhbGx5IGEgcG9pbnRlciB0byBtYWxsb2MnZCBtZW1vcnkuICBUaGUgc3ltYm9sIHJlYWRlcidzIGZpbmlzaAorICAgICBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUgbWVtb3J5IHRodXNseSBhbGxvY2F0ZWQuICAqLworCisgIFBUUiBzeW1fcHJpdmF0ZTsKKworICAvKiBIb29rIGZvciB0YXJnZXQtYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGluZm9ybWF0aW9uLiAgVGhpcyBtdXN0CisgICAgIHBvaW50IHRvIG1lbW9yeSBhbGxvY2F0ZWQgb24gb25lIG9mIHRoZSBvYnN0YWNrcyBpbiB0aGlzIG9iamZpbGUsCisgICAgIHNvIHRoYXQgaXQgZ2V0cyBmcmVlZCBhdXRvbWF0aWNhbGx5IHdoZW4gcmVhZGluZyBhIG5ldyBvYmplY3QKKyAgICAgZmlsZS4gKi8KKworICBQVFIgb2JqX3ByaXZhdGU7CisKKyAgLyogU2V0IG9mIHJlbG9jYXRpb24gb2Zmc2V0cyB0byBhcHBseSB0byBlYWNoIHNlY3Rpb24uCisgICAgIEN1cnJlbnRseSBvbiB0aGUgcHN5bWJvbF9vYnN0YWNrICh3aGljaCBtYWtlcyBubyBzZW5zZSwgYnV0IEknbQorICAgICBub3Qgc3VyZSBpdCdzIGhhcm1pbmcgYW55dGhpbmcpLgorCisgICAgIFRoZXNlIG9mZnNldHMgaW5kaWNhdGUgdGhhdCBhbGwgc3ltYm9scyAoaW5jbHVkaW5nIHBhcnRpYWwgYW5kCisgICAgIG1pbmltYWwgc3ltYm9scykgd2hpY2ggaGF2ZSBiZWVuIHJlYWQgaGF2ZSBiZWVuIHJlbG9jYXRlZCBieSB0aGlzCisgICAgIG11Y2guICBTeW1ib2xzIHdoaWNoIGFyZSB5ZXQgdG8gYmUgcmVhZCBuZWVkIHRvIGJlIHJlbG9jYXRlZCBieQorICAgICBpdC4gICovCisKKyAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworICBpbnQgbnVtX3NlY3Rpb25zOworCisgIC8qIHNldCBvZiBzZWN0aW9uIGJlZ2luIGFuZCBlbmQgYWRkcmVzc2VzIHVzZWQgdG8gbWFwIHBjIGFkZHJlc3NlcworICAgICBpbnRvIHNlY3Rpb25zLiAgQ3VycmVudGx5IG9uIHRoZSBwc3ltYm9sX29ic3RhY2sgKHdoaWNoIG1ha2VzIG5vCisgICAgIHNlbnNlLCBidXQgSSdtIG5vdCBzdXJlIGl0J3MgaGFybWluZyBhbnl0aGluZykuICAqLworCisgIHN0cnVjdCBvYmpfc2VjdGlvbgorICAgICpzZWN0aW9ucywKKyAgICAqc2VjdGlvbnNfZW5kOworCisgIC8qIHR3byBhdXhpbGlhcnkgZmllbGRzLCB1c2VkIHRvIGhvbGQgdGhlIGZwIG9mIHNlcGFyYXRlIHN5bWJvbCBmaWxlcyAqLworICBGSUxFICphdXhmMSwgKmF1eGYyOworCisgIC8qIEltcG9ydGVkIHN5bWJvbHMgKi8KKyAgSW1wb3J0RW50cnkgKiBpbXBvcnRfbGlzdDsKKyAgaW50IGltcG9ydF9saXN0X3NpemU7CisKKyAgLyogRXhwb3J0ZWQgc3ltYm9scyAqLworICBFeHBvcnRFbnRyeSAqIGV4cG9ydF9saXN0OworICBpbnQgZXhwb3J0X2xpc3Rfc2l6ZTsKKworICAvKiBQbGFjZSB0byBzdGFzaCB2YXJpb3VzIHN0YXRpc3RpY3MgYWJvdXQgdGhpcyBvYmpmaWxlICovCisgIE9CSlNUQVRTOworfTsKKworLyogRGVmaW5lcyBmb3IgdGhlIG9iamZpbGUgZmxhZyB3b3JkLiAqLworCisvKiBHZGIgY2FuIGFycmFuZ2UgdG8gYWxsb2NhdGUgc3RvcmFnZSBmb3IgYWxsIG9iamVjdHMgcmVsYXRlZCB0byBhCisgICBwYXJ0aWN1bGFyIG9iamZpbGUgaW4gYSBkZXNpZ25hdGVkIHNlY3Rpb24gb2YgaXRzIGFkZHJlc3Mgc3BhY2UsCisgICBtYW5hZ2VkIGF0IGEgbG93IGxldmVsIGJ5IG1tYXAoKSBhbmQgdXNpbmcgYSBzcGVjaWFsIHZlcnNpb24gb2YKKyAgIG1hbGxvYyB0aGF0IGhhbmRsZXMgbWFsbG9jL2ZyZWUvcmVhbGxvYyBvbiB0b3Agb2YgdGhlIG1tYXAoKSBpbnRlcmZhY2UuCisgICBUaGlzIGFsbG93cyB0aGUgImludGVybmFsIGdkYiBzdGF0ZSIgZm9yIGEgcGFydGljdWxhciBvYmpmaWxlIHRvIGJlCisgICBkdW1wZWQgdG8gYSBnZGIgc3RhdGUgZmlsZSBhbmQgc3Vic2VxdWVudGx5IHJlbG9hZGVkIGF0IGEgbGF0ZXIgdGltZS4gKi8KKworI2RlZmluZSBPQkpGX01BUFBFRAkoMSA8PCAwKQkvKiBPYmpmaWxlIGRhdGEgaXMgbW1hcCdkICovCisKKy8qIFdoZW4gdXNpbmcgbWFwcGVkL3JlbWFwcGVkIHByZWRpZ2VzdGVkIGdkYiBzeW1ib2wgaW5mb3JtYXRpb24sIHdlIG5lZWQKKyAgIGEgZmxhZyB0aGF0IGluZGljYXRlcyB0aGF0IHdlIGhhdmUgcHJldmlvdXNseSBkb25lIGFuIGluaXRpYWwgc3ltYm9sCisgICB0YWJsZSByZWFkIGZyb20gdGhpcyBwYXJ0aWN1bGFyIG9iamZpbGUuICBXZSBjYW4ndCBqdXN0IGxvb2sgZm9yIHRoZQorICAgYWJzZW5jZSBvZiBhbnkgb2YgdGhlIHRocmVlIHN5bWJvbCB0YWJsZXMgKG1zeW1ib2xzLCBwc3ltdGFiLCBzeW10YWIpCisgICBiZWNhdXNlIGlmIHRoZSBmaWxlIGhhcyBubyBzeW1ib2xzIGZvciBleGFtcGxlLCBub25lIG9mIHRoZXNlIHdpbGwKKyAgIGV4aXN0LiAqLworCisjZGVmaW5lIE9CSkZfU1lNUwkoMSA8PCAxKQkvKiBIYXZlIHRyaWVkIHRvIHJlYWQgc3ltYm9scyAqLworCisvKiBXaGVuIGFuIG9iamVjdCBmaWxlIGhhcyBpdHMgZnVuY3Rpb25zIHJlb3JkZXJlZCAoY3VycmVudGx5IElyaXgtNS4yCisgICBzaGFyZWQgbGlicmFyaWVzIGV4aGliaXQgdGhpcyBiZWhhdmlvdXIpLCB3ZSB3aWxsIG5lZWQgYW4gZXhwZW5zaXZlCisgICBhbGdvcml0aG0gdG8gbG9jYXRlIGEgcGFydGlhbCBzeW10YWIgb3Igc3ltdGFiIHZpYSBhbiBhZGRyZXNzLgorICAgVG8gYXZvaWQgdGhpcyBwZW5hbHR5IGZvciBub3JtYWwgb2JqZWN0IGZpbGVzLCB3ZSB1c2UgdGhpcyBmbGFnLAorICAgd2hvc2Ugc2V0dGluZyBpcyBkZXRlcm1pbmVkIHVwb24gc3ltYm9sIHRhYmxlIHJlYWQgaW4uICAqLworCisjZGVmaW5lIE9CSkZfUkVPUkRFUkVECSgxIDw8IDIpCS8qIEZ1bmN0aW9ucyBhcmUgcmVvcmRlcmVkICovCisgICAgICAgICAgICAgICAgICAgICAgIAorLyogRGlzdGluZ3Vpc2ggYmV0d2VlbiBhbiBvYmpmaWxlIGZvciBhIHNoYXJlZCBsaWJyYXJ5IGFuZCBhCisgICAidmFuaWxsYSIgb2JqZmlsZS4gKi8KKworI2RlZmluZSBPQkpGX1NIQVJFRCAgICAgKDEgPDwgMykgICAgICAgIC8qIEZyb20gYSBzaGFyZWQgbGlicmFyeSAqLworCisvKiBUaGUgb2JqZWN0IGZpbGUgdGhhdCB0aGUgbWFpbiBzeW1ib2wgdGFibGUgd2FzIGxvYWRlZCBmcm9tIChlLmcuIHRoZQorICAgYXJndW1lbnQgdG8gdGhlICJzeW1ib2wtZmlsZSIgb3IgImZpbGUiIGNvbW1hbmQpLiAgKi8KKworZXh0ZXJuIHN0cnVjdCBvYmpmaWxlICpzeW1maWxlX29iamZpbGU7CisKKy8qIFRoZSBvYmplY3QgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBydW50aW1lIGNvbW1vbiBtaW5pbWFsIHN5bWJvbHMKKyAgIGZvciBTdW5PUzQuIE5vdGUgdGhhdCB0aGlzIG9iamZpbGUgaGFzIG5vIGFzc29jaWF0ZWQgQkZELiAgKi8KKworZXh0ZXJuIHN0cnVjdCBvYmpmaWxlICpydF9jb21tb25fb2JqZmlsZTsKKworLyogV2hlbiB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IHR5cGUsIHdlIG5lZWQgdG8ga25vdyB3aGljaCB0eXBlX29ic3RhY2sKKyAgIHRvIGFsbG9jYXRlIHRoZSB0eXBlIG9uLCBzaW5jZSB0aGVyZSBpcyBvbmUgZm9yIGVhY2ggb2JqZmlsZS4gIFRoZSBwbGFjZXMKKyAgIHdoZXJlIHR5cGVzIGFyZSBhbGxvY2F0ZWQgYXJlIGRlZXBseSBidXJpZWQgaW4gZnVuY3Rpb24gY2FsbCBoaWVyYXJjaGllcworICAgd2hpY2gga25vdyBub3RoaW5nIGFib3V0IG9iamZpbGVzLCBzbyByYXRoZXIgdGhhbiB0cnlpbmcgdG8gcGFzcyBhCisgICBwYXJ0aWN1bGFyIG9iamZpbGUgZG93biB0byB0aGVtLCB3ZSBqdXN0IGRvIGFuIGVuZCBydW4gYXJvdW5kIHRoZW0gYW5kCisgICBzZXQgY3VycmVudF9vYmpmaWxlIHRvIGJlIHdoYXRldmVyIG9iamZpbGUgd2UgZXhwZWN0IHRvIGJlIHVzaW5nIGF0IHRoZQorICAgdGltZSB0eXBlcyBhcmUgYmVpbmcgYWxsb2NhdGVkLiAgRm9yIGluc3RhbmNlLCB3aGVuIHdlIHN0YXJ0IHJlYWRpbmcKKyAgIHN5bWJvbHMgZm9yIGEgcGFydGljdWxhciBvYmpmaWxlLCB3ZSBzZXQgY3VycmVudF9vYmpmaWxlIHRvIHBvaW50IHRvIHRoYXQKKyAgIG9iamZpbGUsIGFuZCB3aGVuIHdlIGFyZSBkb25lLCB3ZSBzZXQgaXQgYmFjayB0byBOVUxMLCB0byBlbnN1cmUgdGhhdCB3ZQorICAgbmV2ZXIgcHV0IGEgdHlwZSBzb21lcGxhY2Ugb3RoZXIgdGhhbiB3aGVyZSB3ZSBhcmUgZXhwZWN0aW5nIHRvIHB1dCBpdC4KKyAgIEZJWE1FOiAgTWF5YmUgd2Ugc2hvdWxkIHJldmlldyB0aGUgZW50aXJlIHR5cGUgaGFuZGxpbmcgc3lzdGVtIGFuZAorICAgc2VlIGlmIHRoZXJlIGlzIGEgYmV0dGVyIHdheSB0byBhdm9pZCB0aGlzIHByb2JsZW0uICovCisKK2V4dGVybiBzdHJ1Y3Qgb2JqZmlsZSAqY3VycmVudF9vYmpmaWxlOworCisvKiBBbGwga25vd24gb2JqZmlsZXMgYXJlIGtlcHQgaW4gYSBsaW5rZWQgbGlzdC4gIFRoaXMgcG9pbnRzIHRvIHRoZQorICAgcm9vdCBvZiB0aGlzIGxpc3QuICovCisKK2V4dGVybiBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZWN0X2ZpbGVzOworCisvKiBEZWNsYXJhdGlvbnMgZm9yIGZ1bmN0aW9ucyBkZWZpbmVkIGluIG9iamZpbGVzLmMgKi8KKworZXh0ZXJuIHN0cnVjdCBvYmpmaWxlICoKK2FsbG9jYXRlX29iamZpbGUgUEFSQU1TICgoYmZkICosIGludCwgaW50LCBpbnQpKTsKKworZXh0ZXJuIGludAorYnVpbGRfb2JqZmlsZV9zZWN0aW9uX3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICopKTsKKworZXh0ZXJuIHZvaWQgb2JqZmlsZV90b19mcm9udCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK2V4dGVybiB2b2lkCit1bmxpbmtfb2JqZmlsZSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK2V4dGVybiB2b2lkCitmcmVlX29iamZpbGUgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOworCitleHRlcm4gdm9pZAorZnJlZV9hbGxfb2JqZmlsZXMgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZAorb2JqZmlsZV9yZWxvY2F0ZSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICopKTsKKworZXh0ZXJuIGludAoraGF2ZV9wYXJ0aWFsX3N5bWJvbHMgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gaW50CitoYXZlX2Z1bGxfc3ltYm9scyBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIFRoaXMgb3BlcmF0aW9uIGRlbGV0ZXMgYWxsIG9iamZpbGUgZW50cmllcyB0aGF0IHJlcHJlc2VudCBzb2xpYnMgdGhhdAorICAgd2VyZW4ndCBleHBsaWNpdGx5IGxvYWRlZCBieSB0aGUgdXNlciwgdmlhIGUuZy4sIHRoZSBhZGQtc3ltYm9sLWZpbGUKKyAgIGNvbW1hbmQuCisgICAqLworZXh0ZXJuIHZvaWQKK29iamZpbGVfcHVyZ2Vfc29saWJzIFBBUkFNUyAoKHZvaWQpKTsKKworLyogRnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlLCByZWFsbHkgYSBtaXNjCisgICBhZGRyZXNzPC0+c3ltYm9sIG1hcHBpbmcgZm9yIHRoaW5ncyB3ZSBkb24ndCBoYXZlIGRlYnVnIHN5bWJvbHMgZm9yLiAgKi8KKworZXh0ZXJuIGludAoraGF2ZV9taW5pbWFsX3N5bWJvbHMgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gc3RydWN0IG9ial9zZWN0aW9uICoKK2ZpbmRfcGNfc2VjdGlvbiBQQVJBTVMoKENPUkVfQUREUiBwYykpOworCitleHRlcm4gc3RydWN0IG9ial9zZWN0aW9uICoKK2ZpbmRfcGNfc2VjdF9zZWN0aW9uIFBBUkFNUygoQ09SRV9BRERSIHBjLCBhc2VjdGlvbiAqc2VjdGlvbikpOworCitleHRlcm4gaW50Citpbl9wbHRfc2VjdGlvbiBQQVJBTVMgKChDT1JFX0FERFIsIGNoYXIgKikpOworCisvKiBUcmF2ZXJzZSBhbGwgb2JqZWN0IGZpbGVzLiAgQUxMX09CSkZJTEVTX1NBRkUgd29ya3MgZXZlbiBpZiB5b3UgZGVsZXRlCisgICB0aGUgb2JqZmlsZSBkdXJpbmcgdGhlIHRyYXZlcnNhbC4gICovCisKKyNkZWZpbmUJQUxMX09CSkZJTEVTKG9iaikgXAorICBmb3IgKChvYmopID0gb2JqZWN0X2ZpbGVzOyAob2JqKSAhPSBOVUxMOyAob2JqKSA9IChvYmopLT5uZXh0KQorCisjZGVmaW5lCUFMTF9PQkpGSUxFU19TQUZFKG9iaixueHQpIFwKKyAgZm9yICgob2JqKSA9IG9iamVjdF9maWxlczsgCSAgIFwKKyAgICAgICAob2JqKSAhPSBOVUxMPyAoKG54dCk9KG9iaiktPm5leHQsMSkgOjA7CVwKKyAgICAgICAob2JqKSA9IChueHQpKQorCisvKiBUcmF2ZXJzZSBhbGwgc3ltdGFicyBpbiBvbmUgb2JqZmlsZS4gICovCisKKyNkZWZpbmUJQUxMX09CSkZJTEVfU1lNVEFCUyhvYmpmaWxlLCBzKSBcCisgICAgZm9yICgocykgPSAob2JqZmlsZSkgLT4gc3ltdGFiczsgKHMpICE9IE5VTEw7IChzKSA9IChzKSAtPiBuZXh0KQorCisvKiBUcmF2ZXJzZSBhbGwgcHN5bXRhYnMgaW4gb25lIG9iamZpbGUuICAqLworCisjZGVmaW5lCUFMTF9PQkpGSUxFX1BTWU1UQUJTKG9iamZpbGUsIHApIFwKKyAgICBmb3IgKChwKSA9IChvYmpmaWxlKSAtPiBwc3ltdGFiczsgKHApICE9IE5VTEw7IChwKSA9IChwKSAtPiBuZXh0KQorCisvKiBUcmF2ZXJzZSBhbGwgbWluaW1hbCBzeW1ib2xzIGluIG9uZSBvYmpmaWxlLiAgKi8KKworI2RlZmluZQlBTExfT0JKRklMRV9NU1lNQk9MUyhvYmpmaWxlLCBtKSBcCisgICAgZm9yICgobSkgPSAob2JqZmlsZSkgLT4gbXN5bWJvbHM7IFNZTUJPTF9OQU1FKG0pICE9IE5VTEw7IChtKSsrKQorCisvKiBUcmF2ZXJzZSBhbGwgc3ltdGFicyBpbiBhbGwgb2JqZmlsZXMuICAqLworCisjZGVmaW5lCUFMTF9TWU1UQUJTKG9iamZpbGUsIHMpIFwKKyAgQUxMX09CSkZJTEVTIChvYmpmaWxlKQkgXAorICAgIEFMTF9PQkpGSUxFX1NZTVRBQlMgKG9iamZpbGUsIHMpCisKKy8qIFRyYXZlcnNlIGFsbCBwc3ltdGFicyBpbiBhbGwgb2JqZmlsZXMuICAqLworCisjZGVmaW5lCUFMTF9QU1lNVEFCUyhvYmpmaWxlLCBwKSBcCisgIEFMTF9PQkpGSUxFUyAob2JqZmlsZSkJIFwKKyAgICBBTExfT0JKRklMRV9QU1lNVEFCUyAob2JqZmlsZSwgcCkKKworLyogVHJhdmVyc2UgYWxsIG1pbmltYWwgc3ltYm9scyBpbiBhbGwgb2JqZmlsZXMuICAqLworCisjZGVmaW5lCUFMTF9NU1lNQk9MUyhvYmpmaWxlLCBtKSBcCisgIEFMTF9PQkpGSUxFUyAob2JqZmlsZSkJIFwKKyAgICBpZiAoKG9iamZpbGUpLT5tc3ltYm9scykJIFwKKyAgICAgIEFMTF9PQkpGSUxFX01TWU1CT0xTIChvYmpmaWxlLCBtKQorCisjZGVmaW5lIEFMTF9PQkpGSUxFX09TRUNUSU9OUyhvYmpmaWxlLCBvc2VjdCkJXAorICBmb3IgKG9zZWN0ID0gb2JqZmlsZS0+c2VjdGlvbnM7IG9zZWN0IDwgb2JqZmlsZS0+c2VjdGlvbnNfZW5kOyBvc2VjdCsrKQorCisjZGVmaW5lIEFMTF9PQkpTRUNUSU9OUyhvYmpmaWxlLCBvc2VjdCkJCVwKKyAgQUxMX09CSkZJTEVTIChvYmpmaWxlKQkJCVwKKyAgICBBTExfT0JKRklMRV9PU0VDVElPTlMgKG9iamZpbGUsIG9zZWN0KQorCisjZW5kaWYJLyogIWRlZmluZWQgKE9CSkZJTEVTX0gpICovCmRpZmYgLS1naXQgYS9nZGIvb2NkLmMgYi9nZGIvb2NkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzZmE2MgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9vY2QuYwpAQCAtMCwwICsxLDE0NDQgQEAKKy8qIFRhcmdldCBjb21tdW5pY2F0aW9ucyBzdXBwb3J0IGZvciBNYWNyYWlnb3IgU3lzdGVtcycgT24tQ2hpcCBEZWJ1Z2dpbmcKKyAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAid2FpdC5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgIm9iamZpbGVzLmgiCisjaW5jbHVkZSAiZ2RiLXN0YWJzLmgiCisjaW5jbHVkZSAiZGNhY2hlLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAic2VyaWFsLmgiCisjaW5jbHVkZSAib2NkLmgiCisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IG9jZF9yZWFkX2J5dGVzIFBBUkFNUyAoKENPUkVfQUREUiBtZW1hZGRyLAorCQkJCSAgICAgIGNoYXIgKm15YWRkciwgaW50IGxlbikpOworCitzdGF0aWMgaW50IG9jZF9zdGFydF9yZW1vdGUgUEFSQU1TICgoUFRSIGR1bW15KSk7CisKK3N0YXRpYyBpbnQgcmVhZGNoYXIgUEFSQU1TICgoaW50IHRpbWVvdXQpKTsKKworc3RhdGljIHZvaWQgcmVzZXRfcGFja2V0IFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQgb3V0cHV0X3BhY2tldCBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyBpbnQgZ2V0X3F1b3RlZF9jaGFyIFBBUkFNUyAoKGludCB0aW1lb3V0KSk7CisKK3N0YXRpYyB2b2lkIHB1dF9xdW90ZWRfY2hhciBQQVJBTVMgKChpbnQgYykpOworCitzdGF0aWMgdm9pZCBvY2RfaW50ZXJydXB0IFBBUkFNUyAoKGludCBzaWdubykpOworCitzdGF0aWMgdm9pZCBvY2RfaW50ZXJydXB0X3R3aWNlIFBBUkFNUyAoKGludCBzaWdubykpOworCitzdGF0aWMgdm9pZCBpbnRlcnJ1cHRfcXVlcnkgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqIG9jZF9kb19jb21tYW5kIFBBUkFNUyAoKGludCBjbWQsIGludCAqc3RhdHVzcCwgaW50ICpsZW5wKSk7CisKK3N0YXRpYyB2b2lkIG9jZF9wdXRfcGFja2V0IFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKnBhY2tldCwgaW50IHBrdGxlbikpOworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqIG9jZF9nZXRfcGFja2V0IFBBUkFNUyAoKGludCBjbWQsIGludCAqcGt0bGVuLCBpbnQgdGltZW91dCkpOworCitzdGF0aWMgc3RydWN0IHRhcmdldF9vcHMgKmN1cnJlbnRfb3BzID0gTlVMTDsKKworc3RhdGljIGludCBsYXN0X3J1bl9zdGF0dXM7CisKKy8qIFRoaXMgd2FzIDUgc2Vjb25kcywgd2hpY2ggaXMgYSBsb25nIHRpbWUgdG8gc2l0IGFuZCB3YWl0LgorICAgVW5sZXNzIHRoaXMgaXMgZ29pbmcgdGhvdWdoIHNvbWUgdGVybWluYWwgc2VydmVyIG9yIG11bHRpcGxleGVyIG9yCisgICBvdGhlciBmb3JtIG9mIGhhaXJ5IHNlcmlhbCBjb25uZWN0aW9uLCBJIHdvdWxkIHRoaW5rIDIgc2Vjb25kcyB3b3VsZAorICAgYmUgcGxlbnR5LiAgKi8KKworI2lmIDAKKy8qIEZJWE1FOiBDaGFuZ2UgdG8gYWxsb3cgb3B0aW9uIHRvIHNldCB0aW1lb3V0IHZhbHVlIG9uIGEgcGVyIHRhcmdldAorICAgYmFzaXMuICovCitzdGF0aWMgaW50IHJlbW90ZV90aW1lb3V0ID0gMjsKKyNlbmRpZgorCisvKiBEZXNjcmlwdG9yIGZvciBJL08gdG8gcmVtb3RlIG1hY2hpbmUuICBJbml0aWFsaXplIGl0IHRvIE5VTEwgc28gdGhhdAorICAgb2NkX29wZW4ga25vd3MgdGhhdCB3ZSBkb24ndCBoYXZlIGEgZmlsZSBvcGVuIHdoZW4gdGhlIHByb2dyYW0KKyAgIHN0YXJ0cy4gICovCitzdGF0aWMgc2VyaWFsX3Qgb2NkX2Rlc2MgPSBOVUxMOworDAordm9pZAorb2NkX2Vycm9yIChzLCBlcnJvcl9jb2RlKQorICAgICBjaGFyICpzOworICAgICBpbnQgZXJyb3JfY29kZTsKK3sKKyAgY2hhciBidWZbMTAwXTsKKworICBmcHV0c19maWx0ZXJlZCAocywgZ2RiX3N0ZGVycik7CisgIGZwdXRzX2ZpbHRlcmVkICgiICIsIGdkYl9zdGRlcnIpOworCisgIHN3aXRjaCAoZXJyb3JfY29kZSkKKyAgICB7CisgICAgY2FzZSAweDE6IHMgPSAiVW5rbm93biBmYXVsdCI7IGJyZWFrOworICAgIGNhc2UgMHgyOiBzID0gIlBvd2VyIGZhaWxlZCI7IGJyZWFrOworICAgIGNhc2UgMHgzOiBzID0gIkNhYmxlIGRpc2Nvbm5lY3RlZCI7IGJyZWFrOworICAgIGNhc2UgMHg0OiBzID0gIkNvdWxkbid0IGVudGVyIE9DRCBtb2RlIjsgYnJlYWs7CisgICAgY2FzZSAweDU6IHMgPSAiVGFyZ2V0IHN0dWNrIGluIHJlc2V0IjsgYnJlYWs7CisgICAgY2FzZSAweDY6IHMgPSAiT0NEIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIjsgYnJlYWs7CisgICAgY2FzZSAweDc6IHMgPSAiV3JpdGUgdmVyaWZ5IGZhaWxlZCI7IGJyZWFrOworICAgIGNhc2UgMHg4OiBzID0gIlJlZyBidWZmIGVycm9yIChkdXJpbmcgTVBDNXh4IGZwIHJlZyByZWFkL3dyaXRlKSI7IGJyZWFrOworICAgIGNhc2UgMHg5OiBzID0gIkludmFsaWQgQ1BVIHJlZ2lzdGVyIGFjY2VzcyBhdHRlbXB0IGZhaWxlZCI7IGJyZWFrOworICAgIGNhc2UgMHgxMTogcyA9ICJCdXMgZXJyb3IiOyBicmVhazsKKyAgICBjYXNlIDB4MTI6IHMgPSAiQ2hlY2tzdW0gZXJyb3IiOyBicmVhazsKKyAgICBjYXNlIDB4MTM6IHMgPSAiSWxsZWdhbCBjb21tYW5kIjsgYnJlYWs7CisgICAgY2FzZSAweDE0OiBzID0gIlBhcmFtZXRlciBlcnJvciI7IGJyZWFrOworICAgIGNhc2UgMHgxNTogcyA9ICJJbnRlcm5hbCBlcnJvciI7IGJyZWFrOworICAgIGNhc2UgMHg4MDogcyA9ICJGbGFzaCBlcmFzZSBlcnJvciI7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzcHJpbnRmIChidWYsICJVbmtub3duIGVycm9yIGNvZGUgJWQiLCBlcnJvcl9jb2RlKTsKKyAgICAgIHMgPSBidWY7CisgICAgfQorCisgIGVycm9yIChzKTsKK30KKworLyogIFJldHVybiBub256ZXJvIGlmIHRoZSB0aHJlYWQgVEggaXMgc3RpbGwgYWxpdmUgb24gdGhlIHJlbW90ZSBzeXN0ZW0uICAqLworCitpbnQKK29jZF90aHJlYWRfYWxpdmUgKHRoKQorICAgICBpbnQgdGg7Cit7CisgIHJldHVybiAxOworfQorDAorLyogQ2xlYW4gdXAgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBkZWJ1Z2dlci4gICovCisKKy8qIEFSR1NVU0VEICovCit2b2lkCitvY2RfY2xvc2UgKHF1aXR0aW5nKQorICAgICBpbnQgcXVpdHRpbmc7Cit7CisgIGlmIChvY2RfZGVzYykKKyAgICBTRVJJQUxfQ0xPU0UgKG9jZF9kZXNjKTsKKyAgb2NkX2Rlc2MgPSBOVUxMOworfQorCisvKiBTdHViIGZvciBjYXRjaF9lcnJvcnMuICAqLworCitzdGF0aWMgaW50CitvY2Rfc3RhcnRfcmVtb3RlIChkdW1teSkKKyAgICAgUFRSIGR1bW15OworeworICB1bnNpZ25lZCBjaGFyIGJ1ZlsxMF0sICpwOworICBpbnQgcGt0bGVuOworICBpbnQgc3RhdHVzOworICBpbnQgZXJyb3JfY29kZTsKKyAgaW50IHNwZWVkOworICBlbnVtIG9jZF90YXJnZXRfdHlwZSB0YXJnZXRfdHlwZTsKKworICB0YXJnZXRfdHlwZSA9ICooZW51bSBvY2RfdGFyZ2V0X3R5cGUqKWR1bW15OworCisgIGltbWVkaWF0ZV9xdWl0ID0gMTsJCS8qIEFsbG93IHVzZXIgdG8gaW50ZXJydXB0IGl0ICovCisKKyAgU0VSSUFMX1NFTkRfQlJFQUsgKG9jZF9kZXNjKTsgLyogV2FrZSB1cCB0aGUgd2lnZ2xlciAqLworCisgIHNwZWVkID0gODA7CQkJLyogRGl2aWRlIGNsb2NrIGJ5IDQwMDAgKi8KKworICBidWZbMF0gPSBPQ0RfSU5JVDsKKyAgYnVmWzFdID0gc3BlZWQgPj4gODsKKyAgYnVmWzJdID0gc3BlZWQgJiAweGZmOworICBidWZbM10gPSB0YXJnZXRfdHlwZTsKKyAgb2NkX3B1dF9wYWNrZXQgKGJ1ZiwgNCk7CS8qIEluaXQgT0NEIHBhcmFtcyAqLworICBwID0gb2NkX2dldF9wYWNrZXQgKGJ1ZlswXSwgJnBrdGxlbiwgcmVtb3RlX3RpbWVvdXQpOworCisgIGlmIChwa3RsZW4gPCAyKQorICAgIGVycm9yICgiVHJ1bmNhdGVkIHJlc3BvbnNlIHBhY2tldCBmcm9tIE9DRCBkZXZpY2UiKTsKKworICBzdGF0dXMgPSBwWzFdOworICBlcnJvcl9jb2RlID0gcFsyXTsKKworICBpZiAoZXJyb3JfY29kZSAhPSAwKQorICAgIG9jZF9lcnJvciAoIk9DRF9JTklUOiIsIGVycm9yX2NvZGUpOworCisgIG9jZF9kb19jb21tYW5kIChPQ0RfQVlULCAmc3RhdHVzLCAmcGt0bGVuKTsKKworICBwID0gb2NkX2RvX2NvbW1hbmQgKE9DRF9HRVRfVkVSU0lPTiwgJnN0YXR1cywgJnBrdGxlbik7CisKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJbV2lnZ2xlciB2ZXJzaW9uICV4LiV4LCBjYXBhYmlsaXR5IDB4JXhdXG4iLAorCQkgICAgIHBbMF0sIHBbMV0sIChwWzJdIDw8IDE2KSB8IHBbM10pOworCisjaWYgMAorICAvKiBSZXNldCB0aGUgdGFyZ2V0ICovCisKKyAgb2NkX2RvX2NvbW1hbmQgKE9DRF9SRVNFVF9SVU4sICZzdGF0dXMsICZwa3RsZW4pOworLyogIG9jZF9kb19jb21tYW5kIChPQ0RfUkVTRVQsICZzdGF0dXMsICZwa3RsZW4pOyovCisjZW5kaWYKKworICAvKiBJZiBwcm9jZXNzb3IgaXMgc3RpbGwgcnVubmluZywgc3RvcCBpdC4gICovCisKKyAgaWYgKCEoc3RhdHVzICYgT0NEX0ZMQUdfQkRNKSkKKyAgICBvY2Rfc3RvcCAoKTsKKworI2lmIDEKKyAgLyogV2hlbiB1c2luZyBhIHRhcmdldCBib3gsIHdlIHdhbnQgdG8gYXN5bmNocm9ub3VzbHkgcmV0dXJuIHN0YXR1cyB3aGVuCisgICAgIHRhcmdldCBzdG9wcy4gIFRoZSBPQ0RfU0VUX0NUTF9GTEFHUyBjb21tYW5kIGlzIGlnbm9yZWQgYnkgV2lnZ2xlcnMuZGxsCisgICAgIHdoZW4gdXNpbmcgYSBwYXJhbGxlbCBXaWdnbGVyICovCisgIGJ1ZlswXSA9IE9DRF9TRVRfQ1RMX0ZMQUdTOworICBidWZbMV0gPSAwOworICBidWZbMl0gPSAxOworICBvY2RfcHV0X3BhY2tldCAoYnVmLCAzKTsKKworICBwID0gb2NkX2dldF9wYWNrZXQgKGJ1ZlswXSwgJnBrdGxlbiwgcmVtb3RlX3RpbWVvdXQpOworCisgIGlmIChwa3RsZW4gPCAyKQorICAgIGVycm9yICgiVHJ1bmNhdGVkIHJlc3BvbnNlIHBhY2tldCBmcm9tIE9DRCBkZXZpY2UiKTsKKworICBzdGF0dXMgPSBwWzFdOworICBlcnJvcl9jb2RlID0gcFsyXTsKKworICBpZiAoZXJyb3JfY29kZSAhPSAwKQorICAgIG9jZF9lcnJvciAoIk9DRF9TRVRfQ1RMX0ZMQUdTOiIsIGVycm9yX2NvZGUpOworI2VuZGlmCisKKyAgaW1tZWRpYXRlX3F1aXQgPSAwOworCisvKiBUaGlzIGlzIHJlYWxseSB0aGUgam9iIG9mIHN0YXJ0X3JlbW90ZSBob3dldmVyLCB0aGF0IG1ha2VzIGFuIGFzc3VtcHRpb24KKyAgIHRoYXQgdGhlIHRhcmdldCBpcyBhYm91dCB0byBwcmludCBvdXQgYSBzdGF0dXMgbWVzc2FnZSBvZiBzb21lIHNvcnQuICBUaGF0CisgICBkb2Vzbid0IGhhcHBlbiBoZXJlIChpbiBmYWN0LCBpdCBtYXkgbm90IGJlIHBvc3NpYmxlIHRvIGdldCB0aGUgbW9uaXRvciB0bworICAgc2VuZCB0aGUgYXBwcm9wcmlhdGUgcGFja2V0KS4gICovCisKKyAgZmx1c2hfY2FjaGVkX2ZyYW1lcyAoKTsKKyAgcmVnaXN0ZXJzX2NoYW5nZWQgKCk7CisgIHN0b3BfcGMgPSByZWFkX3BjICgpOworICBzZXRfY3VycmVudF9mcmFtZSAoY3JlYXRlX25ld19mcmFtZSAocmVhZF9mcCAoKSwgc3RvcF9wYykpOworICBzZWxlY3RfZnJhbWUgKGdldF9jdXJyZW50X2ZyYW1lICgpLCAwKTsKKyAgcHJpbnRfc3RhY2tfZnJhbWUgKHNlbGVjdGVkX2ZyYW1lLCAtMSwgMSk7CisKKyAgYnVmWzBdID0gT0NEX0xPR19GSUxFOworICBidWZbMV0gPSAzOyAgIC8qIGNsb3NlIGV4aXN0aW5nIFdJR0dMRVJTLkxPRyAqLworICBvY2RfcHV0X3BhY2tldCAoYnVmLCAyKTsKKyAgcCA9IG9jZF9nZXRfcGFja2V0IChidWZbMF0sICZwa3RsZW4sIHJlbW90ZV90aW1lb3V0KTsKKworICBidWZbMF0gPSBPQ0RfTE9HX0ZJTEU7CisgIGJ1ZlsxXSA9IDI7ICAgLyogYXBwZW5kIHRvIGV4aXN0aW5nIFdJR0dMRVJTLkxPRyAqLworICBvY2RfcHV0X3BhY2tldCAoYnVmLCAyKTsKKyAgcCA9IG9jZF9nZXRfcGFja2V0IChidWZbMF0sICZwa3RsZW4sIHJlbW90ZV90aW1lb3V0KTsKKworICByZXR1cm4gMTsKK30KKworLyogT3BlbiBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgZGVidWdnZXIuCisgICBOQU1FIGlzIHRoZSBmaWxlbmFtZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uLiAgKi8KKworc3RhdGljIERDQUNIRSAqb2NkX2RjYWNoZTsKKwordm9pZAorb2NkX29wZW4gKG5hbWUsIGZyb21fdHR5LCB0YXJnZXRfdHlwZSwgb3BzKQorICAgICBjaGFyICpuYW1lOworICAgICBpbnQgZnJvbV90dHk7CisgICAgIGVudW0gb2NkX3RhcmdldF90eXBlIHRhcmdldF90eXBlOworICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqb3BzOworeworICB1bnNpZ25lZCBjaGFyIGJ1ZlsxMF0sICpwOworICBpbnQgc3RhdHVzOworICBpbnQgcGt0bGVuOworCisgIGlmIChuYW1lID09IDApCisgICAgZXJyb3IgKCJUbyBvcGVuIGFuIE9DRCBjb25uZWN0aW9uLCB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZVxuXAorZGV2aWNlIHRoZSBPQ0QgZGV2aWNlIGlzIGF0dGFjaGVkIHRvIChlLmcuIC9kZXYvdHR5YSkuIik7CisKKyAgdGFyZ2V0X3ByZW9wZW4gKGZyb21fdHR5KTsKKworICBjdXJyZW50X29wcyA9IG9wczsKKworICB1bnB1c2hfdGFyZ2V0IChjdXJyZW50X29wcyk7CisKKyAgb2NkX2RjYWNoZSA9IGRjYWNoZV9pbml0IChvY2RfcmVhZF9ieXRlcywgb2NkX3dyaXRlX2J5dGVzKTsKKworICBpZiAoc3RybmNtcChuYW1lLCJ3aWdnbGVyIiw3KSA9PSAwKQorICAgICAgeworCSAgb2NkX2Rlc2MgPSBTRVJJQUxfT1BFTiAoIm9jZCIpOworICAgICAgICAgIGlmICghb2NkX2Rlc2MpCisgICAgICAgICAgICBwZXJyb3Jfd2l0aF9uYW1lIChuYW1lKTsKKworCSAgYnVmWzBdID0gT0NEX0xPR19GSUxFOworCSAgYnVmWzFdID0gMTsJLyogb3BlbiBuZXcgb3Igb3ZlcndyaXRlIGV4aXN0aW5nIFdJR0dMRVJTLkxPRyAqLworCSAgb2NkX3B1dF9wYWNrZXQgKGJ1ZiwgMik7CisJICBwID0gb2NkX2dldF9wYWNrZXQgKGJ1ZlswXSwgJnBrdGxlbiwgcmVtb3RlX3RpbWVvdXQpOworCisJICBidWZbMF0gPSBPQ0RfU0VUX0NPTk5FQ1RJT047CisJICBidWZbMV0gPSAweDAxOwkvKiBhdG9pIChuYW1lWzExXSk7ICovCisJICBvY2RfcHV0X3BhY2tldCAoYnVmLCAyKTsKKwkgIHAgPSBvY2RfZ2V0X3BhY2tldCAoYnVmWzBdLCAmcGt0bGVuLCByZW1vdGVfdGltZW91dCk7CisgICAgICB9CisgIGVsc2UJLyogbm90IHVzaW5nIFdpZ2dsZXJzLmRsbCAqLworICAgICAgeworICAgICAgICAgIG9jZF9kZXNjID0gU0VSSUFMX09QRU4gKG5hbWUpOworCSAgaWYgKCFvY2RfZGVzYykKKwkgICAgICBwZXJyb3Jfd2l0aF9uYW1lIChuYW1lKTsKKyAgICAgIH0KKworICBpZiAoYmF1ZF9yYXRlICE9IC0xKQorICAgIHsKKyAgICAgIGlmIChTRVJJQUxfU0VUQkFVRFJBVEUgKG9jZF9kZXNjLCBiYXVkX3JhdGUpKQorCXsKKwkgIFNFUklBTF9DTE9TRSAob2NkX2Rlc2MpOworCSAgcGVycm9yX3dpdGhfbmFtZSAobmFtZSk7CisJfQorICAgIH0KKworICBTRVJJQUxfUkFXIChvY2RfZGVzYyk7CisKKyAgLyogSWYgdGhlcmUgaXMgc29tZXRoaW5nIHNpdHRpbmcgaW4gdGhlIGJ1ZmZlciB3ZSBtaWdodCB0YWtlIGl0IGFzIGEKKyAgICAgcmVzcG9uc2UgdG8gYSBjb21tYW5kLCB3aGljaCB3b3VsZCBiZSBiYWQuICAqLworICBTRVJJQUxfRkxVU0hfSU5QVVQgKG9jZF9kZXNjKTsKKworICBpZiAoZnJvbV90dHkpCisgICAgeworICAgICAgcHV0c19maWx0ZXJlZCAoIlJlbW90ZSB0YXJnZXQgd2lnZ2xlciBjb25uZWN0ZWQgdG8gIik7CisgICAgICBwdXRzX2ZpbHRlcmVkIChuYW1lKTsKKyAgICAgIHB1dHNfZmlsdGVyZWQgKCJcbiIpOworICAgIH0KKyAgcHVzaF90YXJnZXQgKGN1cnJlbnRfb3BzKTsJLyogU3dpdGNoIHRvIHVzaW5nIHJlbW90ZSB0YXJnZXQgbm93ICovCisKKyAgLyogV2l0aG91dCB0aGlzLCBzb21lIGNvbW1hbmRzIHdoaWNoIHJlcXVpcmUgYW4gYWN0aXZlIHRhcmdldCAoc3VjaCBhcyBraWxsKQorICAgICB3b24ndCB3b3JrLiAgVGhpcyB2YXJpYWJsZSBzZXJ2ZXMgKGF0IGxlYXN0KSBkb3VibGUgZHV0eSBhcyBib3RoIHRoZSBwaWQKKyAgICAgb2YgdGhlIHRhcmdldCBwcm9jZXNzIChpZiBpdCBoYXMgc3VjaCksIGFuZCBhcyBhIGZsYWcgaW5kaWNhdGluZyB0aGF0IGEKKyAgICAgdGFyZ2V0IGlzIGFjdGl2ZS4gIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgc3BsaXQgb3V0IGludG8gc2VwZXJhdGUKKyAgICAgdmFyaWFibGVzLCBlc3BlY2lhbGx5IHNpbmNlIEdEQiB3aWxsIHNvbWVkYXkgaGF2ZSBhIG5vdGlvbiBvZiBkZWJ1Z2dpbmcKKyAgICAgc2V2ZXJhbCBwcm9jZXNzZXMuICAqLworCisgIGluZmVyaW9yX3BpZCA9IDQyMDAwOworICAvKiBTdGFydCB0aGUgcmVtb3RlIGNvbm5lY3Rpb247IGlmIGVycm9yICgwKSwgZGlzY2FyZCB0aGlzIHRhcmdldC4KKyAgICAgSW4gcGFydGljdWxhciwgaWYgdGhlIHVzZXIgcXVpdHMsIGJlIHN1cmUgdG8gZGlzY2FyZCBpdAorICAgICAod2UnZCBiZSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUgb3RoZXJ3aXNlKS4gICovCisgIGlmICghY2F0Y2hfZXJyb3JzIChvY2Rfc3RhcnRfcmVtb3RlLCAmdGFyZ2V0X3R5cGUsCisJCSAgICAgIkNvdWxkbid0IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHJlbW90ZSB0YXJnZXRcbiIsCisJCSAgICAgUkVUVVJOX01BU0tfQUxMKSkKKyAgICB7CisgICAgICBwb3BfdGFyZ2V0KCk7CisgICAgICBlcnJvciAoIkZhaWxlZCB0byBjb25uZWN0IHRvIE9DRC4iKTsKKyAgICB9Cit9CisKKy8qIFRoaXMgdGFrZXMgYSBwcm9ncmFtIHByZXZpb3VzbHkgYXR0YWNoZWQgdG8gYW5kIGRldGFjaGVzIGl0LiAgQWZ0ZXIKKyAgIHRoaXMgaXMgZG9uZSwgR0RCIGNhbiBiZSB1c2VkIHRvIGRlYnVnIHNvbWUgb3RoZXIgcHJvZ3JhbS4gIFdlCisgICBiZXR0ZXIgbm90IGhhdmUgbGVmdCBhbnkgYnJlYWtwb2ludHMgaW4gdGhlIHRhcmdldCBwcm9ncmFtIG9yIGl0J2xsCisgICBkaWUgd2hlbiBpdCBoaXRzIG9uZS4gICovCisKK3ZvaWQKK29jZF9kZXRhY2ggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGlmIChhcmdzKQorICAgIGVycm9yICgiQXJndW1lbnQgZ2l2ZW4gdG8gXCJkZXRhY2hcIiB3aGVuIHJlbW90ZWx5IGRlYnVnZ2luZy4iKTsKKworICBwb3BfdGFyZ2V0ICgpOworICBpZiAoZnJvbV90dHkpCisgICAgcHV0c19maWx0ZXJlZCAoIkVuZGluZyByZW1vdGUgZGVidWdnaW5nLlxuIik7Cit9CisMCisvKiBUZWxsIHRoZSByZW1vdGUgbWFjaGluZSB0byByZXN1bWUuICAqLworCit2b2lkCitvY2RfcmVzdW1lIChwaWQsIHN0ZXAsIHNpZ2duYWwpCisgICAgIGludCBwaWQsIHN0ZXA7CisgICAgIGVudW0gdGFyZ2V0X3NpZ25hbCBzaWdnbmFsOworeworICBpbnQgcGt0bGVuOworCisgIGRjYWNoZV9mbHVzaCAob2NkX2RjYWNoZSk7CisKKyAgaWYgKHN0ZXApCisgICAgb2NkX2RvX2NvbW1hbmQgKE9DRF9TVEVQLCAmbGFzdF9ydW5fc3RhdHVzLCAmcGt0bGVuKTsKKyAgZWxzZQorICAgIG9jZF9kb19jb21tYW5kIChPQ0RfUlVOLCAmbGFzdF9ydW5fc3RhdHVzLCAmcGt0bGVuKTsKK30KKwwKK3ZvaWQKK29jZF9zdG9wICgpCit7CisgIGludCBzdGF0dXM7CisgIGludCBwa3RsZW47CisKKyAgb2NkX2RvX2NvbW1hbmQgKE9DRF9TVE9QLCAmc3RhdHVzLCAmcGt0bGVuKTsKKworICBpZiAoIShzdGF0dXMgJiBPQ0RfRkxBR19CRE0pKQorICAgIGVycm9yICgiQ2FuJ3Qgc3RvcCB0YXJnZXQgdmlhIEJETSIpOworfQorCitzdGF0aWMgdm9sYXRpbGUgaW50IG9jZF9pbnRlcnJ1cHRfZmxhZzsKKworLyogU2VuZCBeQyB0byB0YXJnZXQgdG8gaGFsdCBpdC4gIFRhcmdldCB3aWxsIHJlc3BvbmQsIGFuZCBzZW5kIHVzIGEKKyAgIHBhY2tldC4gICovCisKK3N0YXRpYyB2b2lkCitvY2RfaW50ZXJydXB0IChzaWdubykKKyAgICAgaW50IHNpZ25vOworeworICAvKiBJZiB0aGlzIGRvZXNuJ3Qgd29yaywgdHJ5IG1vcmUgc2V2ZXJlIHN0ZXBzLiAgKi8KKyAgc2lnbmFsIChzaWdubywgb2NkX2ludGVycnVwdF90d2ljZSk7CisgIAorICBpZiAocmVtb3RlX2RlYnVnKQorICAgIHByaW50Zl91bmZpbHRlcmVkICgib2NkX2ludGVycnVwdCBjYWxsZWRcbiIpOworCisgIHsKKyAgICBjaGFyIGJ1ZlsxXTsKKworICAgIG9jZF9zdG9wICgpOworICAgIGJ1ZlswXSA9IE9DRF9BWVQ7CisgICAgb2NkX3B1dF9wYWNrZXQgKGJ1ZiwgMSk7CisgICAgb2NkX2ludGVycnVwdF9mbGFnID0gMTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCAoKm9mdW5jKSgpOworCisvKiBUaGUgdXNlciB0eXBlZCBeQyB0d2ljZS4gICovCitzdGF0aWMgdm9pZAorb2NkX2ludGVycnVwdF90d2ljZSAoc2lnbm8pCisgICAgIGludCBzaWdubzsKK3sKKyAgc2lnbmFsIChzaWdubywgb2Z1bmMpOworICAKKyAgaW50ZXJydXB0X3F1ZXJ5ICgpOworCisgIHNpZ25hbCAoc2lnbm8sIG9jZF9pbnRlcnJ1cHQpOworfQorCisvKiBBc2sgdGhlIHVzZXIgd2hhdCB0byBkbyB3aGVuIGFuIGludGVycnVwdCBpcyByZWNlaXZlZC4gICovCisKK3N0YXRpYyB2b2lkCitpbnRlcnJ1cHRfcXVlcnkgKCkKK3sKKyAgdGFyZ2V0X3Rlcm1pbmFsX291cnMgKCk7CisKKyAgaWYgKHF1ZXJ5ICgiSW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIHByb2dyYW0uXG5cCitHaXZlIHVwIChhbmQgc3RvcCBkZWJ1Z2dpbmcgaXQpPyAiKSkKKyAgICB7CisgICAgICB0YXJnZXRfbW91cm5faW5mZXJpb3IgKCk7CisgICAgICByZXR1cm5fdG9fdG9wX2xldmVsIChSRVRVUk5fUVVJVCk7CisgICAgfQorCisgIHRhcmdldF90ZXJtaW5hbF9pbmZlcmlvciAoKTsKK30KKworLyogSWYgbm9uemVybywgaWdub3JlIHRoZSBuZXh0IGtpbGwuICAqLworc3RhdGljIGludCBraWxsX2tsdWRnZTsKKworLyogV2FpdCB1bnRpbCB0aGUgcmVtb3RlIG1hY2hpbmUgc3RvcHMsIHRoZW4gcmV0dXJuLAorICAgc3RvcmluZyBzdGF0dXMgaW4gU1RBVFVTIGp1c3QgYXMgYHdhaXQnIHdvdWxkLgorICAgUmV0dXJucyAicGlkIiAodGhvdWdoIGl0J3Mgbm90IGNsZWFyIHdoYXQsIGlmIGFueXRoaW5nLCB0aGF0CisgICBtZWFucyBpbiB0aGUgY2FzZSBvZiB0aGlzIHRhcmdldCkuICAqLworCitpbnQKK29jZF93YWl0ICgpCit7CisgIHVuc2lnbmVkIGNoYXIgKnA7CisgIGludCBlcnJvcl9jb2RlOworICBpbnQgcGt0bGVuOworICBjaGFyIGJ1ZlsxXTsKKworICBvY2RfaW50ZXJydXB0X2ZsYWcgPSAwOworCisgIC8qIFRhcmdldCBtaWdodCBhbHJlYWR5IGJlIHN0b3BwZWQgYnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUuICovCisgIC8qIElmIHdlIGFyZW4ndCBhbHJlYWR5IHN0b3BwZWQsIHdlIG5lZWQgdG8gbG9vcCB1bnRpbCB3ZSd2ZSBkcm9wcGVkCisgICAgIGJhY2sgaW50byBCRE0gbW9kZSAqLworCisgIHdoaWxlICghKGxhc3RfcnVuX3N0YXR1cyAmIE9DRF9GTEFHX0JETSkpCisgICAgeworICAgICAgYnVmWzBdID0gT0NEX0FZVDsKKyAgICAgIG9jZF9wdXRfcGFja2V0IChidWYsIDEpOworICAgICAgcCA9IG9jZF9nZXRfcGFja2V0IChPQ0RfQVlULCAmcGt0bGVuLCAtMSk7CisKKyAgICAgIG9mdW5jID0gKHZvaWQgKCopKCkpIHNpZ25hbCAoU0lHSU5ULCBvY2RfaW50ZXJydXB0KTsKKyAgICAgIHNpZ25hbCAoU0lHSU5ULCBvZnVuYyk7CisKKyAgICAgIGlmIChwa3RsZW4gPCAyKQorCWVycm9yICgiVHJ1bmNhdGVkIHJlc3BvbnNlIHBhY2tldCBmcm9tIE9DRCBkZXZpY2UiKTsKKworICAgICAgbGFzdF9ydW5fc3RhdHVzID0gcFsxXTsKKyAgICAgIGVycm9yX2NvZGUgPSBwWzJdOworCisgICAgICBpZiAoZXJyb3JfY29kZSAhPSAwKQorCW9jZF9lcnJvciAoInRhcmdldF93YWl0OiIsIGVycm9yX2NvZGUpOworCisgICAgICBpZiAobGFzdF9ydW5fc3RhdHVzICYgT0NEX0ZMQUdfUFdGKQorCWVycm9yICgiT0NEIGRldmljZSBsb3N0IFZDQyBhdCBCRE0gaW50ZXJmYWNlLiIpOworICAgICAgZWxzZSBpZiAobGFzdF9ydW5fc3RhdHVzICYgT0NEX0ZMQUdfQ0FCTEVfRElTQykKKwllcnJvciAoIk9DRCBkZXZpY2UgY2FibGUgYXBwZWFycyB0byBoYXZlIGJlZW4gZGlzY29ubmVjdGVkLiIpOworICAgIH0KKworICBpZiAob2NkX2ludGVycnVwdF9mbGFnKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFJlYWQgcmVnaXN0ZXJzIGZyb20gdGhlIE9DRCBkZXZpY2UuICBTcGVjaWZ5IHRoZSBzdGFydGluZyBhbmQgZW5kaW5nCisgICByZWdpc3RlciBudW1iZXIuICBSZXR1cm4gdGhlIG51bWJlciBvZiByZWdzIGFjdHVhbGx5IHJlYWQgaW4gKk5VTVJFR1MuCisgICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0YXRpYyBhcnJheSBjb250YWluaW5nIHRoZSByZWdpc3RlciBjb250ZW50cy4gICovCisKK3Vuc2lnbmVkIGNoYXIgKgorb2NkX3JlYWRfYmRtX3JlZ2lzdGVycyAoZmlyc3RfYmRtX3JlZ25vLCBsYXN0X2JkbV9yZWdubywgcmVnbGVuKQorICAgICBpbnQgZmlyc3RfYmRtX3JlZ25vOworICAgICBpbnQgbGFzdF9iZG1fcmVnbm87CisgICAgIGludCAqcmVnbGVuOworeworICB1bnNpZ25lZCBjaGFyIGJ1ZlsxMF07CisgIGludCBpOworICB1bnNpZ25lZCBjaGFyICpwOworICB1bnNpZ25lZCBjaGFyICpyZWdzOworICBpbnQgZXJyb3JfY29kZSwgc3RhdHVzOworICBpbnQgcGt0bGVuOworCisgIGJ1ZlswXSA9IE9DRF9SRUFEX1JFR1M7CisgIGJ1ZlsxXSA9IGZpcnN0X2JkbV9yZWdubyA+PiA4OworICBidWZbMl0gPSBmaXJzdF9iZG1fcmVnbm8gJiAweGZmOworICBidWZbM10gPSBsYXN0X2JkbV9yZWdubyA+PiA4OworICBidWZbNF0gPSBsYXN0X2JkbV9yZWdubyAmIDB4ZmY7CisKKyAgb2NkX3B1dF9wYWNrZXQgKGJ1ZiwgNSk7CisgIHAgPSBvY2RfZ2V0X3BhY2tldCAoT0NEX1JFQURfUkVHUywgJnBrdGxlbiwgcmVtb3RlX3RpbWVvdXQpOworCisgIHN0YXR1cyA9IHBbMV07CisgIGVycm9yX2NvZGUgPSBwWzJdOworCisgIGlmIChlcnJvcl9jb2RlICE9IDApCisgICAgb2NkX2Vycm9yICgicmVhZF9iZG1fcmVnaXN0ZXJzOiIsIGVycm9yX2NvZGUpOworCisgIGkgPSBwWzNdOworICBpZiAoaSA9PSAwKQorICAgIGkgPSAyNTY7CisKKyAgaWYgKGkgPiBwa3RsZW4gLSA0CisgICAgICB8fCAoKGkgJiAzKSAhPSAwKSkKKyAgICBlcnJvciAoIlJlZ2lzdGVyIGJsb2NrIHNpemUgYmFkOiAgJWQiLCBpKTsKKworICAqcmVnbGVuID0gaTsKKworICByZWdzID0gcCArIDQ7CisKKyAgcmV0dXJuIHJlZ3M7Cit9CisKKy8qIFJlYWQgcmVnaXN0ZXIgQkRNX1JFR05PIGFuZCByZXR1cm5zIGl0cyB2YWx1ZSBhbGEgcmVhZF9yZWdpc3RlcigpICovCisKK0NPUkVfQUREUgorb2NkX3JlYWRfYmRtX3JlZ2lzdGVyIChiZG1fcmVnbm8pCisgICAgIGludCBiZG1fcmVnbm87Cit7CisgIGludCByZWdsZW47CisgIHVuc2lnbmVkIGNoYXIgKnA7CisgIENPUkVfQUREUiByZWd2YWw7CisKKyAgcCA9IG9jZF9yZWFkX2JkbV9yZWdpc3RlcnMgKGJkbV9yZWdubywgYmRtX3JlZ25vLCAmcmVnbGVuKTsKKyAgcmVndmFsID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChwLCByZWdsZW4pOworCisgIHJldHVybiByZWd2YWw7Cit9CisKK3ZvaWQKK29jZF93cml0ZV9iZG1fcmVnaXN0ZXJzIChmaXJzdF9iZG1fcmVnbm8sIHJlZ3B0ciwgcmVnbGVuKQorICAgICBpbnQgZmlyc3RfYmRtX3JlZ25vOworICAgICB1bnNpZ25lZCBjaGFyICpyZWdwdHI7CisgICAgIGludCByZWdsZW47Cit7CisgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgaW50IGVycm9yX2NvZGUsIHN0YXR1czsKKyAgaW50IHBrdGxlbjsKKworICBidWYgPSBhbGxvY2EgKDQgKyByZWdsZW4pOworCisgIGJ1ZlswXSA9IE9DRF9XUklURV9SRUdTOworICBidWZbMV0gPSBmaXJzdF9iZG1fcmVnbm8gPj4gODsKKyAgYnVmWzJdID0gZmlyc3RfYmRtX3JlZ25vICYgMHhmZjsKKyAgYnVmWzNdID0gcmVnbGVuOworICBtZW1jcHkgKGJ1ZiArIDQsIHJlZ3B0ciwgcmVnbGVuKTsKKworICBvY2RfcHV0X3BhY2tldCAoYnVmLCA0ICsgcmVnbGVuKTsKKyAgcCA9IG9jZF9nZXRfcGFja2V0IChPQ0RfV1JJVEVfUkVHUywgJnBrdGxlbiwgcmVtb3RlX3RpbWVvdXQpOworCisgIGlmIChwa3RsZW4gPCAzKQorICAgIGVycm9yICgiVHJ1bmNhdGVkIHJlc3BvbnNlIHBhY2tldCBmcm9tIE9DRCBkZXZpY2UiKTsKKworICBzdGF0dXMgPSBwWzFdOworICBlcnJvcl9jb2RlID0gcFsyXTsKKworICBpZiAoZXJyb3JfY29kZSAhPSAwKQorICAgIG9jZF9lcnJvciAoIm9jZF93cml0ZV9iZG1fcmVnaXN0ZXJzOiIsIGVycm9yX2NvZGUpOworfQorCit2b2lkCitvY2Rfd3JpdGVfYmRtX3JlZ2lzdGVyIChiZG1fcmVnbm8sIHJlZykKKyAgICAgaW50IGJkbV9yZWdubzsKKyAgICAgQ09SRV9BRERSIHJlZzsKK3sKKyAgdW5zaWduZWQgY2hhciBidWZbNF07CisKKyAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0LCByZWcpOworCisgIG9jZF93cml0ZV9iZG1fcmVnaXN0ZXJzIChiZG1fcmVnbm8sIGJ1ZiwgNCk7Cit9CisMCit2b2lkIAorb2NkX3ByZXBhcmVfdG9fc3RvcmUgKCkKK3sKK30KKwwKKy8qIFdyaXRlIG1lbW9yeSBkYXRhIGRpcmVjdGx5IHRvIHRoZSByZW1vdGUgbWFjaGluZS4KKyAgIFRoaXMgZG9lcyBub3QgaW5mb3JtIHRoZSBkYXRhIGNhY2hlOyB0aGUgZGF0YSBjYWNoZSB1c2VzIHRoaXMuCisgICBNRU1BRERSIGlzIHRoZSBhZGRyZXNzIGluIHRoZSByZW1vdGUgbWVtb3J5IHNwYWNlLgorICAgTVlBRERSIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBidWZmZXIgaW4gb3VyIHNwYWNlLgorICAgTEVOIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMuCisKKyAgIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkLCBvciAwIGZvciBlcnJvci4gICovCisKK3N0YXRpYyBpbnQgd3JpdGVfbWVtX2NvbW1hbmQgPSBPQ0RfV1JJVEVfTUVNOworCitpbnQKK29jZF93cml0ZV9ieXRlcyAobWVtYWRkciwgbXlhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47Cit7CisgIGNoYXIgYnVmWzI1NiArIDEwXTsKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgaW50IG9yaWdsZW47CisKKyAgb3JpZ2xlbiA9IGxlbjsKKworICBidWZbMF0gPSB3cml0ZV9tZW1fY29tbWFuZDsKKyAgYnVmWzVdID0gMTsJCQkvKiBXcml0ZSBhcyBieXRlcyAqLworICBidWZbNl0gPSAwOwkJCS8qIERvbid0IHZlcmlmeSAqLworCisgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgIGludCBudW1ieXRlczsKKyAgICAgIGludCBwa3RsZW47CisgICAgICBpbnQgc3RhdHVzLCBlcnJvcl9jb2RlOworCisgICAgICBudW1ieXRlcyA9IG1pbiAobGVuLCAyNTYgLSA4KTsKKworICAgICAgYnVmWzFdID0gbWVtYWRkciA+PiAyNDsKKyAgICAgIGJ1ZlsyXSA9IG1lbWFkZHIgPj4gMTY7CisgICAgICBidWZbM10gPSBtZW1hZGRyID4+IDg7CisgICAgICBidWZbNF0gPSBtZW1hZGRyOworCisgICAgICBidWZbN10gPSBudW1ieXRlczsKKworICAgICAgbWVtY3B5ICgmYnVmWzhdLCBteWFkZHIsIG51bWJ5dGVzKTsKKyAgICAgIG9jZF9wdXRfcGFja2V0IChidWYsIDggKyBudW1ieXRlcyk7CisgICAgICBwID0gb2NkX2dldF9wYWNrZXQgKE9DRF9XUklURV9NRU0sICZwa3RsZW4sIHJlbW90ZV90aW1lb3V0KTsKKyAgICAgIGlmIChwa3RsZW4gPCAzKQorCWVycm9yICgiVHJ1bmNhdGVkIHJlc3BvbnNlIHBhY2tldCBmcm9tIE9DRCBkZXZpY2UiKTsKKworICAgICAgc3RhdHVzID0gcFsxXTsKKyAgICAgIGVycm9yX2NvZGUgPSBwWzJdOworCisgICAgICBpZiAoZXJyb3JfY29kZSA9PSAweDExKQkvKiBHb3QgYSBidXMgZXJyb3I/ICovCisJeworCSAgQ09SRV9BRERSIGVycm9yX2FkZHJlc3M7CisKKwkgIGVycm9yX2FkZHJlc3MgPSBwWzNdIDw8IDI0OworCSAgZXJyb3JfYWRkcmVzcyB8PSBwWzRdIDw8IDE2OworCSAgZXJyb3JfYWRkcmVzcyB8PSBwWzVdIDw8IDg7CisJICBlcnJvcl9hZGRyZXNzIHw9IHBbNl07CisJICBudW1ieXRlcyA9IGVycm9yX2FkZHJlc3MgLSBtZW1hZGRyOworCisJICBsZW4gLT0gbnVtYnl0ZXM7CisKKwkgIGVycm5vID0gRUlPOworCisJICBicmVhazsKKwl9CisgICAgICBlbHNlIGlmIChlcnJvcl9jb2RlICE9IDApCisJb2NkX2Vycm9yICgib2NkX3dyaXRlX2J5dGVzOiIsIGVycm9yX2NvZGUpOworCisgICAgICBsZW4gLT0gbnVtYnl0ZXM7CisgICAgICBtZW1hZGRyICs9IG51bWJ5dGVzOworICAgICAgbXlhZGRyICs9IG51bWJ5dGVzOworICAgIH0KKworICByZXR1cm4gb3JpZ2xlbiAtIGxlbjsKK30KKworLyogUmVhZCBtZW1vcnkgZGF0YSBkaXJlY3RseSBmcm9tIHRoZSByZW1vdGUgbWFjaGluZS4KKyAgIFRoaXMgZG9lcyBub3QgdXNlIHRoZSBkYXRhIGNhY2hlOyB0aGUgZGF0YSBjYWNoZSB1c2VzIHRoaXMuCisgICBNRU1BRERSIGlzIHRoZSBhZGRyZXNzIGluIHRoZSByZW1vdGUgbWVtb3J5IHNwYWNlLgorICAgTVlBRERSIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBidWZmZXIgaW4gb3VyIHNwYWNlLgorICAgTEVOIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMuCisKKyAgIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkLCBvciAwIGZvciBlcnJvci4gICovCisKK3N0YXRpYyBpbnQKK29jZF9yZWFkX2J5dGVzIChtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgY2hhciBidWZbMjU2ICsgMTBdOworICB1bnNpZ25lZCBjaGFyICpwOworICBpbnQgb3JpZ2xlbjsKKworICBvcmlnbGVuID0gbGVuOworCisgIGJ1ZlswXSA9IE9DRF9SRUFEX01FTTsKKyAgYnVmWzVdID0gMTsJCQkvKiBSZWFkIGFzIGJ5dGVzICovCisKKyAgd2hpbGUgKGxlbiA+IDApCisgICAgeworICAgICAgaW50IG51bWJ5dGVzOworICAgICAgaW50IHBrdGxlbjsKKyAgICAgIGludCBzdGF0dXMsIGVycm9yX2NvZGU7CisKKyAgICAgIG51bWJ5dGVzID0gbWluIChsZW4sIDI1NiAtIDcpOworCisgICAgICBidWZbMV0gPSBtZW1hZGRyID4+IDI0OworICAgICAgYnVmWzJdID0gbWVtYWRkciA+PiAxNjsKKyAgICAgIGJ1ZlszXSA9IG1lbWFkZHIgPj4gODsKKyAgICAgIGJ1Zls0XSA9IG1lbWFkZHI7CisKKyAgICAgIGJ1Zls2XSA9IG51bWJ5dGVzOworCisgICAgICBvY2RfcHV0X3BhY2tldCAoYnVmLCA3KTsKKyAgICAgIHAgPSBvY2RfZ2V0X3BhY2tldCAoT0NEX1JFQURfTUVNLCAmcGt0bGVuLCByZW1vdGVfdGltZW91dCk7CisgICAgICBpZiAocGt0bGVuIDwgNCkKKwllcnJvciAoIlRydW5jYXRlZCByZXNwb25zZSBwYWNrZXQgZnJvbSBPQ0QgZGV2aWNlIik7CisKKyAgICAgIHN0YXR1cyA9IHBbMV07CisgICAgICBlcnJvcl9jb2RlID0gcFsyXTsKKworICAgICAgaWYgKGVycm9yX2NvZGUgPT0gMHgxMSkJLyogR290IGEgYnVzIGVycm9yPyAqLworCXsKKwkgIENPUkVfQUREUiBlcnJvcl9hZGRyZXNzOworCisJICBlcnJvcl9hZGRyZXNzID0gcFszXSA8PCAyNDsKKwkgIGVycm9yX2FkZHJlc3MgfD0gcFs0XSA8PCAxNjsKKwkgIGVycm9yX2FkZHJlc3MgfD0gcFs1XSA8PCA4OworCSAgZXJyb3JfYWRkcmVzcyB8PSBwWzZdOworCSAgbnVtYnl0ZXMgPSBlcnJvcl9hZGRyZXNzIC0gbWVtYWRkcjsKKworCSAgbGVuIC09IG51bWJ5dGVzOworCisJICBlcnJubyA9IEVJTzsKKworCSAgYnJlYWs7CisJfQorICAgICAgZWxzZSBpZiAoZXJyb3JfY29kZSAhPSAwKQorCW9jZF9lcnJvciAoIm9jZF9yZWFkX2J5dGVzOiIsIGVycm9yX2NvZGUpOworCisgICAgICBtZW1jcHkgKG15YWRkciwgJnBbNF0sIG51bWJ5dGVzKTsKKworICAgICAgbGVuIC09IG51bWJ5dGVzOworICAgICAgbWVtYWRkciArPSBudW1ieXRlczsKKyAgICAgIG15YWRkciArPSBudW1ieXRlczsKKyAgICB9CisKKyAgcmV0dXJuIG9yaWdsZW4gLSBsZW47Cit9CisMCisvKiBSZWFkIG9yIHdyaXRlIExFTiBieXRlcyBmcm9tIGluZmVyaW9yIG1lbW9yeSBhdCBNRU1BRERSLCB0cmFuc2ZlcnJpbmcKKyAgIHRvIG9yIGZyb20gZGVidWdnZXIgYWRkcmVzcyBNWUFERFIuICBXcml0ZSB0byBpbmZlcmlvciBpZiBTSE9VTERfV1JJVEUgaXMKKyAgIG5vbnplcm8uICBSZXR1cm5zIGxlbmd0aCBvZiBkYXRhIHdyaXR0ZW4gb3IgcmVhZDsgMCBmb3IgZXJyb3IuICAqLworCisvKiBBUkdTVVNFRCAqLworaW50CitvY2RfeGZlcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuLCBzaG91bGRfd3JpdGUsIHRhcmdldCkKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IHNob3VsZF93cml0ZTsKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldDsJCQkvKiBpZ25vcmVkICovCit7CisgIHJldHVybiBkY2FjaGVfeGZlcl9tZW1vcnkgKG9jZF9kY2FjaGUsIG1lbWFkZHIsIG15YWRkciwgbGVuLCBzaG91bGRfd3JpdGUpOworfQorDAordm9pZAorb2NkX2ZpbGVzX2luZm8gKGlnbm9yZSkKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKmlnbm9yZTsKK3sKKyAgcHV0c19maWx0ZXJlZCAoIkRlYnVnZ2luZyBhIHRhcmdldCBvdmVyIGEgc2VyaWFsIGxpbmUuXG4iKTsKK30KKwwKKy8qIFN0dWZmIGZvciBkZWFsaW5nIHdpdGggdGhlIHBhY2tldHMgd2hpY2ggYXJlIHBhcnQgb2YgdGhpcyBwcm90b2NvbC4KKyAgIFNlZSBjb21tZW50IGF0IHRvcCBvZiBmaWxlIGZvciBkZXRhaWxzLiAgKi8KKworLyogUmVhZCBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSB0aGUgcmVtb3RlIHNpZGUsIGhhbmRsaW5nIHdpZXJkIGVycm9ycy4gKi8KKworc3RhdGljIGludAorcmVhZGNoYXIgKHRpbWVvdXQpCisgICAgIGludCB0aW1lb3V0OworeworICBpbnQgY2g7CisKKyAgY2ggPSBTRVJJQUxfUkVBRENIQVIgKG9jZF9kZXNjLCB0aW1lb3V0KTsKKworICBzd2l0Y2ggKGNoKQorICAgIHsKKyAgICBjYXNlIFNFUklBTF9FT0Y6CisgICAgICBlcnJvciAoIlJlbW90ZSBjb25uZWN0aW9uIGNsb3NlZCIpOworICAgIGNhc2UgU0VSSUFMX0VSUk9SOgorICAgICAgcGVycm9yX3dpdGhfbmFtZSAoIlJlbW90ZSBjb21tdW5pY2F0aW9uIGVycm9yIik7CisgICAgY2FzZSBTRVJJQUxfVElNRU9VVDoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGNoOworICAgIH0KK30KKworI2lmIDAKKy8qIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgZGF0YSBzdHJlYW0sIGRlcXVvdGluZyBhcyBuZWNlc3NhcnkuICBTWU4gaXMKKyAgIHRyZWF0ZWQgc3BlY2lhbC4gIEFueSBTWU5zIGFwcGVhcmluZyBpbiB0aGUgZGF0YSBzdHJlYW0gYXJlIHJldHVybmVkIGFzIHRoZQorICAgZGlzdGluY3QgdmFsdWUgUkFXX1NZTiAod2hpY2ggaGFzIGEgdmFsdWUgPiA4IGJpdHMgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUKKyAgIG1pc3Rha2VuIGZvciByZWFsIGRhdGEpLiAgKi8KKworc3RhdGljIGludAorZ2V0X3F1b3RlZF9jaGFyICh0aW1lb3V0KQorICAgICBpbnQgdGltZW91dDsKK3sKKyAgaW50IGNoOworCisgIGNoID0gcmVhZGNoYXIgKHRpbWVvdXQpOworCisgIHN3aXRjaCAoY2gpCisgICAgeworICAgIGNhc2UgU0VSSUFMX1RJTUVPVVQ6CisgICAgICBlcnJvciAoIlRpbWVvdXQgaW4gbWlkLXBhY2tldCwgYWJvcnRpbmciKTsKKyAgICBjYXNlIFNZTjoKKyAgICAgIHJldHVybiBSQVdfU1lOOworICAgIGNhc2UgRExFOgorICAgICAgY2ggPSByZWFkY2hhciAodGltZW91dCk7CisgICAgICBpZiAoY2ggPT0gU1lOKQorCXJldHVybiBSQVdfU1lOOworICAgICAgcmV0dXJuIGNoICYgfjAxMDA7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBjaDsKKyAgICB9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBrdFsyNTYgKiAyICsgMTBdLCAqcGt0cDsgLyogV29yc3QgY2FzZSAqLworCitzdGF0aWMgdm9pZAorcmVzZXRfcGFja2V0ICgpCit7CisgIHBrdHAgPSBwa3Q7Cit9CisKK3N0YXRpYyB2b2lkCitvdXRwdXRfcGFja2V0ICgpCit7CisgIGlmIChTRVJJQUxfV1JJVEUgKG9jZF9kZXNjLCBwa3QsIHBrdHAgLSBwa3QpKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJvdXRwdXRfcGFja2V0OiB3cml0ZSBmYWlsZWQiKTsKKworICByZXNldF9wYWNrZXQgKCk7Cit9CisKKy8qIE91dHB1dCBhIHF1b3RlZCBjaGFyYWN0ZXIuICBTWU5zIGFuZCBETEVzIGFyZSBxdW90ZWQuICBFdmVyeXRoaW5nIGVsc2UgZ29lcworICAgdGhyb3VnaCB1bnRvdWNoZWQuICAqLworCitzdGF0aWMgdm9pZAorcHV0X3F1b3RlZF9jaGFyIChjKQorICAgICBpbnQgYzsKK3sKKyAgc3dpdGNoIChjKQorICAgIHsKKyAgICBjYXNlIFNZTjoKKyAgICBjYXNlIERMRToKKyAgICAgICpwa3RwKysgPSBETEU7CisgICAgICBjIHw9IDAxMDA7CisgICAgfQorCisgICpwa3RwKysgPSBjOworfQorCisvKiBTZW5kIGEgcGFja2V0IHRvIHRoZSBPQ0QgZGV2aWNlLiAgVGhlIHBhY2tldCBmcmFtZWQgYnkgYSBTWU4gY2hhcmFjdGVyLAorICAgYSBieXRlIGNvdW50IGFuZCBhIGNoZWNrc3VtLiAgVGhlIGJ5dGUgY291bnQgb25seSBjb3VudHMgdGhlIG51bWJlciBvZgorICAgYnl0ZXMgYmV0d2VlbiB0aGUgY291bnQgYW5kIHRoZSBjaGVja3N1bS4gIEEgY291bnQgb2YgemVybyBhY3R1YWxseQorICAgbWVhbnMgMjU2LiAgQW55IFNZTnMgd2l0aGluIHRoZSBwYWNrZXQgKGluY2x1ZGluZyB0aGUgY2hlY2tzdW0gYW5kCisgICBjb3VudCkgbXVzdCBiZSBxdW90ZWQuICBUaGUgcXVvdGUgY2hhcmFjdGVyIG11c3QgYmUgcXVvdGVkIGFzIHdlbGwuCisgICBRdW90aW5nIGlzIGRvbmUgYnkgcmVwbGFjaW5nIHRoZSBjaGFyYWN0ZXIgd2l0aCB0aGUgdHdvLWNoYXJhY3RlciBzZXF1ZW5jZQorICAgRExFLCB7Y2hhcn0gfCAwMTAwLiAgTm90ZSB0aGF0IHRoZSBxdW90aW5nIG1lY2hhbmlzbSBoYXMgbm8gZWZmZWN0IG9uIHRoZQorICAgYnl0ZSBjb3VudC4gKi8KKworc3RhdGljIHZvaWQKK3N0dV9wdXRfcGFja2V0IChidWYsIGxlbikKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgICBpbnQgbGVuOworeworICB1bnNpZ25lZCBjaGFyIGNoZWNrc3VtOworICB1bnNpZ25lZCBjaGFyIGM7CisKKyAgaWYgKGxlbiA9PSAwIHx8IGxlbiA+IDI1NikKKyAgICBhYm9ydCAoKTsJCQkvKiBDYW4ndCByZXByZXNlbnQgMCBsZW5ndGggcGFja2V0ICovCisKKyAgcmVzZXRfcGFja2V0ICgpOworCisgIGNoZWNrc3VtID0gMDsKKworICBwdXRfcXVvdGVkX2NoYXIgKFJBV19TWU4pOworCisgIGMgPSBsZW47CisKKyAgZG8KKyAgICB7CisgICAgICBjaGVja3N1bSArPSBjOworCisgICAgICBwdXRfcXVvdGVkX2NoYXIgKGMpOworCisgICAgICBjID0gKmJ1ZisrOworICAgIH0KKyAgd2hpbGUgKGxlbi0tID4gMCk7CisKKyAgcHV0X3F1b3RlZF9jaGFyICgtY2hlY2tzdW0gJiAweGZmKTsKKworICBvdXRwdXRfcGFja2V0ICgpOworfQorCisjZWxzZQorCisvKiBTZW5kIGEgcGFja2V0IHRvIHRoZSBPQ0QgZGV2aWNlLiAgVGhlIHBhY2tldCBmcmFtZWQgYnkgYSBTWU4gY2hhcmFjdGVyLAorICAgYSBieXRlIGNvdW50IGFuZCBhIGNoZWNrc3VtLiAgVGhlIGJ5dGUgY291bnQgb25seSBjb3VudHMgdGhlIG51bWJlciBvZgorICAgYnl0ZXMgYmV0d2VlbiB0aGUgY291bnQgYW5kIHRoZSBjaGVja3N1bS4gIEEgY291bnQgb2YgemVybyBhY3R1YWxseQorICAgbWVhbnMgMjU2LiAgQW55IFNZTnMgd2l0aGluIHRoZSBwYWNrZXQgKGluY2x1ZGluZyB0aGUgY2hlY2tzdW0gYW5kCisgICBjb3VudCkgbXVzdCBiZSBxdW90ZWQuICBUaGUgcXVvdGUgY2hhcmFjdGVyIG11c3QgYmUgcXVvdGVkIGFzIHdlbGwuCisgICBRdW90aW5nIGlzIGRvbmUgYnkgcmVwbGFjaW5nIHRoZSBjaGFyYWN0ZXIgd2l0aCB0aGUgdHdvLWNoYXJhY3RlciBzZXF1ZW5jZQorICAgRExFLCB7Y2hhcn0gfCAwMTAwLiAgTm90ZSB0aGF0IHRoZSBxdW90aW5nIG1lY2hhbmlzbSBoYXMgbm8gZWZmZWN0IG9uIHRoZQorICAgYnl0ZSBjb3VudC4gICovCisKK3N0YXRpYyB2b2lkCitvY2RfcHV0X3BhY2tldCAoYnVmLCBsZW4pCisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICAgaW50IGxlbjsKK3sKKyAgdW5zaWduZWQgY2hhciBjaGVja3N1bTsKKyAgdW5zaWduZWQgY2hhciBjOworICB1bnNpZ25lZCBjaGFyICpwYWNrZXQsICpwYWNrZXRfcHRyOworCisgIHBhY2tldCA9IGFsbG9jYSAobGVuICsgMSArIDEpOyAvKiBwYWNrZXQgKyBTWU4gKyBjaGVja3N1bSAqLworICBwYWNrZXRfcHRyID0gcGFja2V0OworCisgIGNoZWNrc3VtID0gMDsKKworICAqcGFja2V0X3B0cisrID0gMHg1NTsKKworICB3aGlsZSAobGVuLS0gPiAwKQorICAgIHsKKyAgICAgIGMgPSAqYnVmKys7CisKKyAgICAgIGNoZWNrc3VtICs9IGM7CisgICAgICAqcGFja2V0X3B0cisrID0gYzsKKyAgICB9CisKKyAgKnBhY2tldF9wdHIrKyA9IC1jaGVja3N1bTsKKyAgaWYgKFNFUklBTF9XUklURSAob2NkX2Rlc2MsIHBhY2tldCwgcGFja2V0X3B0ciAtIHBhY2tldCkpCisgICAgcGVycm9yX3dpdGhfbmFtZSAoIm91dHB1dF9wYWNrZXQ6IHdyaXRlIGZhaWxlZCIpOworfQorI2VuZGlmCisKKyNpZiAwCisvKiBHZXQgYSBwYWNrZXQgZnJvbSB0aGUgT0NEIGRldmljZS4gIFRpbWVvdXQgaXMgb25seSBlbmZvcmNlZCBmb3IgdGhlCisgICBmaXJzdCBieXRlIG9mIHRoZSBwYWNrZXQuICBTdWJzZXF1ZW50IGJ5dGVzIGFyZSBleHBlY3RlZCB0byBhcnJpdmUgaW4KKyAgIHRpbWUgPD0gcmVtb3RlX3RpbWVvdXQuICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0YXRpYyBidWZmZXIgY29udGFpbmluZworICAgdGhlIHBheWxvYWQgb2YgdGhlIHBhY2tldC4gICpMRU5QIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldC4KKyovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK3N0dV9nZXRfcGFja2V0IChjbWQsIGxlbnAsIHRpbWVvdXQpCisgICAgIHVuc2lnbmVkIGNoYXIgY21kOworICAgICBpbnQgKmxlbnA7Cit7CisgIGludCBjaDsKKyAgaW50IGxlbjsKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgYnVmWzI1NiArIDEwXSwgKnA7CisgIHVuc2lnbmVkIGNoYXIgY2hlY2tzdW07CisKKyBmaW5kX3BhY2tldDoKKworICBjaCA9IGdldF9xdW90ZWRfY2hhciAodGltZW91dCk7CisKKyAgaWYgKGNoIDwgMCkKKyAgICBlcnJvciAoImdldF9wYWNrZXQgKHJlYWRjaGFyKTogJWQiLCBjaCk7CisKKyAgaWYgKGNoICE9IFJBV19TWU4pCisgICAgZ290byBmaW5kX3BhY2tldDsKKworIGZvdW5kX3N5bjoJCQkvKiBGb3VuZCB0aGUgc3RhcnQgb2YgYSBwYWNrZXQgKi8KKworICBwID0gYnVmOworICBjaGVja3N1bSA9IDA7CisKKyAgbGVuID0gZ2V0X3F1b3RlZF9jaGFyIChyZW1vdGVfdGltZW91dCk7CisKKyAgaWYgKGxlbiA9PSBSQVdfU1lOKQorICAgIGdvdG8gZm91bmRfc3luOworCisgIGNoZWNrc3VtICs9IGxlbjsKKworICBpZiAobGVuID09IDApCisgICAgbGVuID0gMjU2OworCisgIGxlbisrOwkJCS8qIEluY2x1ZGUgY2hlY2tzdW0gKi8KKworICB3aGlsZSAobGVuLS0gPiAwKQorICAgIHsKKyAgICAgIGNoID0gZ2V0X3F1b3RlZF9jaGFyIChyZW1vdGVfdGltZW91dCk7CisgICAgICBpZiAoY2ggPT0gUkFXX1NZTikKKwlnb3RvIGZvdW5kX3N5bjsKKworICAgICAgKnArKyA9IGNoOworICAgICAgY2hlY2tzdW0gKz0gY2g7CisgICAgfQorCisgIGlmIChjaGVja3N1bSAhPSAwKQorICAgIGdvdG8gZmluZF9wYWNrZXQ7CisKKyAgaWYgKGNtZCAhPSBidWZbMF0pCisgICAgZXJyb3IgKCJSZXNwb25zZSBwaGFzZSBlcnJvci4gIEdvdCAweCV4LCBleHBlY3RlZCAweCV4IiwgYnVmWzBdLCBjbWQpOworCisgICpsZW5wID0gcCAtIGJ1ZiAtIDE7CisgIHJldHVybiBidWY7Cit9CisKKyNlbHNlCisKKy8qIEdldCBhIHBhY2tldCBmcm9tIHRoZSBPQ0QgZGV2aWNlLiAgVGltZW91dCBpcyBvbmx5IGVuZm9yY2VkIGZvciB0aGUKKyAgIGZpcnN0IGJ5dGUgb2YgdGhlIHBhY2tldC4gIFN1YnNlcXVlbnQgYnl0ZXMgYXJlIGV4cGVjdGVkIHRvIGFycml2ZSBpbgorICAgdGltZSA8PSByZW1vdGVfdGltZW91dC4gIFJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RhdGljIGJ1ZmZlciBjb250YWluaW5nCisgICB0aGUgcGF5bG9hZCBvZiB0aGUgcGFja2V0LiAgKkxFTlAgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0LgorKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgorb2NkX2dldF9wYWNrZXQgKGNtZCwgbGVucCwgdGltZW91dCkKKyAgICAgaW50IGNtZDsKKyAgICAgaW50ICpsZW5wOworeworICBpbnQgY2g7CisgIGludCBsZW47CisgIGludCBpOworICBzdGF0aWMgdW5zaWduZWQgY2hhciBwYWNrZXRbNTEyXTsKKyAgdW5zaWduZWQgY2hhciAqcGFja2V0X3B0cjsKKyAgdW5zaWduZWQgY2hhciBjaGVja3N1bTsKKworICBjaCA9IHJlYWRjaGFyICh0aW1lb3V0KTsKKworICBpZiAoY2ggPCAwKQorICAgIGVycm9yICgib2NkX2dldF9wYWNrZXQgKHJlYWRjaGFyKTogJWQiLCBjaCk7CisKKyAgaWYgKGNoICE9IDB4NTUpCisgICAgZXJyb3IgKCJvY2RfZ2V0X3BhY2tldCAocmVhZGNoYXIpOiAlZCIsIGNoKTsKKworLyogRm91bmQgdGhlIHN0YXJ0IG9mIGEgcGFja2V0ICovCisKKyAgcGFja2V0X3B0ciA9IHBhY2tldDsKKyAgY2hlY2tzdW0gPSAwOworCisvKiBSZWFkIGNvbW1hbmQgY2hhci4gIFRoYXQgc29ydCBvZiB0ZWxscyB1cyBob3cgbG9uZyB0aGUgcGFja2V0IGlzLiAqLworCisgIGNoID0gcmVhZGNoYXIgKHRpbWVvdXQpOworCisgIGlmIChjaCA8IDApCisgICAgZXJyb3IgKCJvY2RfZ2V0X3BhY2tldCAocmVhZGNoYXIpOiAlZCIsIGNoKTsKKworICAqcGFja2V0X3B0cisrID0gY2g7CisgIGNoZWNrc3VtICs9IGNoOworCisvKiBHZXQgc3RhdHVzLiAqLworCisgIGNoID0gcmVhZGNoYXIgKHRpbWVvdXQpOworCisgIGlmIChjaCA8IDApCisgICAgZXJyb3IgKCJvY2RfZ2V0X3BhY2tldCAocmVhZGNoYXIpOiAlZCIsIGNoKTsKKyAgKnBhY2tldF9wdHIrKyA9IGNoOworICBjaGVja3N1bSArPSBjaDsKKworLyogR2V0IGVycm9yIGNvZGUuICovCisKKyAgY2ggPSByZWFkY2hhciAodGltZW91dCk7CisKKyAgaWYgKGNoIDwgMCkKKyAgICBlcnJvciAoIm9jZF9nZXRfcGFja2V0IChyZWFkY2hhcik6ICVkIiwgY2gpOworICAqcGFja2V0X3B0cisrID0gY2g7CisgIGNoZWNrc3VtICs9IGNoOworCisgIHN3aXRjaCAoY2gpCQkJLyogRmlndXJlIG91dCBsZW5ndGggb2YgcGFja2V0ICovCisgICAgeworICAgIGNhc2UgMHg3OgkJCS8qIFdyaXRlIHZlcmlmeSBlcnJvcj8gKi8KKyAgICAgIGxlbiA9IDg7CQkJLyogd3JpdGUgYWRkcmVzcywgdmFsdWUgcmVhZCBiYWNrICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTE6CQkJLyogQnVzIGVycm9yPyAqLworCQkJCS8qIHdyaXRlIGFkZHJlc3MsIHJlYWQgZmxhZyAqLworICAgIGNhc2UgMHgxNToJCQkvKiBJbnRlcm5hbCBlcnJvciAqLworICAgICAgbGVuID0gNTsJCQkvKiBlcnJvciBjb2RlLCB2ZWN0b3IgKi8KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CQkJLyogRXJyb3Igdy9ubyBwYXJhbXMgKi8KKyAgICAgIGxlbiA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDoJCQkvKiBOb3JtYWwgcmVzdWx0ICovCisgICAgICBzd2l0Y2ggKHBhY2tldFswXSkKKwl7CisJY2FzZSBPQ0RfQVlUOgkvKiBBcmUgWW91IFRoZXJlPyAqLworCWNhc2UgT0NEX1NFVF9CQVVEX1JBVEU6IC8qIFNldCBCYXVkIFJhdGUgKi8KKwljYXNlIE9DRF9JTklUOgkvKiBJbml0aWFsaXplIE9DRCBkZXZpY2UgKi8KKwljYXNlIE9DRF9TRVRfU1BFRUQ6CS8qIFNldCBTcGVlZCAqLworCWNhc2UgT0NEX1NFVF9GVU5DX0NPREU6IC8qIFNldCBGdW5jdGlvbiBDb2RlICovCisJY2FzZSBPQ0RfU0VUX0NUTF9GTEFHUzogLyogU2V0IENvbnRyb2wgRmxhZ3MgKi8KKwljYXNlIE9DRF9TRVRfQlVGX0FERFI6IC8qIFNldCBSZWdpc3RlciBCdWZmZXIgQWRkcmVzcyAqLworCWNhc2UgT0NEX1JVTjoJLyogUnVuIFRhcmdldCBmcm9tIFBDICAqLworCWNhc2UgT0NEX1JVTl9BRERSOgkvKiBSdW4gVGFyZ2V0IGZyb20gU3BlY2lmaWVkIEFkZHJlc3MgICovCisJY2FzZSBPQ0RfU1RPUDoJLyogU3RvcCBUYXJnZXQgKi8KKwljYXNlIE9DRF9SRVNFVF9SVU46CS8qIFJlc2V0IFRhcmdldCBhbmQgUnVuICovCisJY2FzZSBPQ0RfUkVTRVQ6CS8qIFJlc2V0IFRhcmdldCBhbmQgSGFsdCAqLworCWNhc2UgT0NEX1NURVA6CS8qIFNpbmdsZSBTdGVwICovCisJY2FzZSBPQ0RfV1JJVEVfUkVHUzogLyogV3JpdGUgUmVnaXN0ZXIgKi8KKwljYXNlIE9DRF9XUklURV9NRU06CS8qIFdyaXRlIE1lbW9yeSAqLworCWNhc2UgT0NEX0ZJTExfTUVNOgkvKiBGaWxsIE1lbW9yeSAqLworCWNhc2UgT0NEX01PVkVfTUVNOgkvKiBNb3ZlIE1lbW9yeSAqLworCWNhc2UgT0NEX1dSSVRFX0lOVF9NRU06IC8qIFdyaXRlIEludGVybmFsIE1lbW9yeSAqLworCWNhc2UgT0NEX0pVTVA6CS8qIEp1bXAgdG8gU3Vicm91dGluZSAqLworCWNhc2UgT0NEX0VSQVNFX0ZMQVNIOiAvKiBFcmFzZSBmbGFzaCBtZW1vcnkgKi8KKwljYXNlIE9DRF9QUk9HUkFNX0ZMQVNIOiAvKiBXcml0ZSBmbGFzaCBtZW1vcnkgKi8KKwljYXNlIE9DRF9FWElUX01PTjoJLyogRXhpdCB0aGUgZmxhc2ggcHJvZ3JhbW1pbmcgbW9uaXRvciAgKi8KKwljYXNlIE9DRF9FTlRFUl9NT046CS8qIEVudGVyIHRoZSBmbGFzaCBwcm9ncmFtbWluZyBtb25pdG9yICAqLworCWNhc2UgT0NEX0xPR19GSUxFOgkvKiBNYWtlIFdpZ2dsZXJzLmRsbCBzYXZlIFdpZ2dsZXJzLmxvZyAqLworCWNhc2UgT0NEX1NFVF9DT05ORUNUSU9OOiAvKiBTZXQgdHlwZSBvZiBjb25uZWN0aW9uIGluIFdpZ2dsZXJzLmRsbCAqLworCSAgbGVuID0gMDsKKwkgIGJyZWFrOworCWNhc2UgT0NEX0dFVF9WRVJTSU9OOiAvKiBHZXQgVmVyc2lvbiAqLworCSAgbGVuID0gMTA7CisJICBicmVhazsKKwljYXNlIE9DRF9HRVRfU1RBVFVTX01BU0s6IC8qIEdldCBTdGF0dXMgTWFzayAqLworCSAgbGVuID0gMTsKKwkgIGJyZWFrOworCWNhc2UgT0NEX0dFVF9DVFJTOgkvKiBHZXQgRXJyb3IgQ291bnRlcnMgKi8KKwljYXNlIE9DRF9SRUFEX1JFR1M6CS8qIFJlYWQgUmVnaXN0ZXIgKi8KKwljYXNlIE9DRF9SRUFEX01FTToJLyogUmVhZCBNZW1vcnkgKi8KKwljYXNlIE9DRF9SRUFEX0lOVF9NRU06IC8qIFJlYWQgSW50ZXJuYWwgTWVtb3J5ICovCisJICBsZW4gPSAyNTc7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgZXJyb3IgKCJvY2RfZ2V0X3BhY2tldDogdW5rbm93biBwYWNrZXQgdHlwZSAweCV4XG4iLCBjaCk7CisJfQorICAgIH0KKworICBpZiAobGVuID09IDI1NykJCS8qIEJ5dGUgc3RyZWFtPyAqLworICAgIHsJCQkJLyogWWVzLCBieXRlIHN0cmVhbXMgY29udGFpbiB0aGUgbGVuZ3RoICovCisgICAgICBjaCA9IHJlYWRjaGFyICh0aW1lb3V0KTsKKworICAgICAgaWYgKGNoIDwgMCkKKwllcnJvciAoIm9jZF9nZXRfcGFja2V0IChyZWFkY2hhcik6ICVkIiwgY2gpOworICAgICAgKnBhY2tldF9wdHIrKyA9IGNoOworICAgICAgY2hlY2tzdW0gKz0gY2g7CisgICAgICBsZW4gPSBjaDsKKyAgICAgIGlmIChsZW4gPT0gMCkKKwlsZW4gPSAyNTY7CisgICAgfQorCisgIHdoaWxlIChsZW4tLSA+PSAwKQkJLyogRG8gcmVzdCBvZiBwYWNrZXQgYW5kIGNoZWNrc3VtICovCisgICAgeworICAgICAgY2ggPSByZWFkY2hhciAodGltZW91dCk7CisKKyAgICAgIGlmIChjaCA8IDApCisJZXJyb3IgKCJvY2RfZ2V0X3BhY2tldCAocmVhZGNoYXIpOiAlZCIsIGNoKTsKKyAgICAgICpwYWNrZXRfcHRyKysgPSBjaDsKKyAgICAgIGNoZWNrc3VtICs9IGNoOworICAgIH0KKworICBpZiAoY2hlY2tzdW0gIT0gMCkKKyAgICBlcnJvciAoIm9jZF9nZXRfcGFja2V0OiBiYWQgcGFja2V0IGNoZWNrc3VtIik7CisKKyAgaWYgKGNtZCAhPSAtMSAmJiBjbWQgIT0gcGFja2V0WzBdKQorICAgIGVycm9yICgiUmVzcG9uc2UgcGhhc2UgZXJyb3IuICBHb3QgMHgleCwgZXhwZWN0ZWQgMHgleCIsIHBhY2tldFswXSwgY21kKTsKKworICAqbGVucCA9IHBhY2tldF9wdHIgLSBwYWNrZXQgLSAxOyAvKiBTdWJ0cmFjdCBjaGVja3N1bSBieXRlICovCisgIHJldHVybiBwYWNrZXQ7Cit9CisjZW5kaWYKKworLyogRXhlY3V0ZSBhIHNpbXBsZSAob25lLWJ5dGUpIGNvbW1hbmQuICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZGF0YQorICAgZm9sbG93aW5nIHRoZSBlcnJvciBjb2RlLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgorb2NkX2RvX2NvbW1hbmQgKGNtZCwgc3RhdHVzcCwgbGVucCkKKyAgICAgaW50IGNtZDsKKyAgICAgaW50ICpzdGF0dXNwOworICAgICBpbnQgKmxlbnA7Cit7CisgIHVuc2lnbmVkIGNoYXIgYnVmWzEwMF0sICpwOworICBpbnQgc3RhdHVzLCBlcnJvcl9jb2RlOworICBjaGFyIGVycmJ1ZlsxMDBdOworCisgIHVuc2lnbmVkIGNoYXIgbG9nYnVmWzEwMF07CisgIGludCBsb2dwa3RsZW47CisKKyAgYnVmWzBdID0gY21kOworICBvY2RfcHV0X3BhY2tldCAoYnVmLCAxKTsJCS8qIFNlbmQgY29tbWFuZCAqLworICBwID0gb2NkX2dldF9wYWNrZXQgKCpidWYsIGxlbnAsIHJlbW90ZV90aW1lb3V0KTsKKworICBpZiAoKmxlbnAgPCAzKQorICAgIGVycm9yICgiVHJ1bmNhdGVkIHJlc3BvbnNlIHBhY2tldCBmcm9tIE9DRCBkZXZpY2UiKTsKKworICBzdGF0dXMgPSBwWzFdOworICBlcnJvcl9jb2RlID0gcFsyXTsKKworICBpZiAoZXJyb3JfY29kZSAhPSAwKQorICAgIHsKKyAgICAgIHNwcmludGYgKGVycmJ1ZiwgIm9jZF9kb19jb21tYW5kICgweCV4KToiLCBjbWQpOworICAgICAgb2NkX2Vycm9yIChlcnJidWYsIGVycm9yX2NvZGUpOworICAgIH0KKworICBpZiAoc3RhdHVzICYgT0NEX0ZMQUdfUFdGKQorICAgIGVycm9yICgiT0NEIGRldmljZSBjYW4ndCBkZXRlY3QgVkNDIGF0IEJETSBpbnRlcmZhY2UuIik7CisgIGVsc2UgaWYgKHN0YXR1cyAmIE9DRF9GTEFHX0NBQkxFX0RJU0MpCisgICAgZXJyb3IgKCJCRE0gY2FibGUgYXBwZWFycyB0byBiZSBkaXNjb25uZWN0ZWQuIik7CisKKyAgKnN0YXR1c3AgPSBzdGF0dXM7CisKKyAgbG9nYnVmWzBdID0gT0NEX0xPR19GSUxFOworICBsb2didWZbMV0gPSAzOyAgIC8qIGNsb3NlIGV4aXN0aW5nIFdJR0dMRVJTLkxPRyAqLworICBvY2RfcHV0X3BhY2tldCAobG9nYnVmLCAyKTsKKyAgb2NkX2dldF9wYWNrZXQgKGxvZ2J1ZlswXSwgJmxvZ3BrdGxlbiwgcmVtb3RlX3RpbWVvdXQpOworCisgIGxvZ2J1ZlswXSA9IE9DRF9MT0dfRklMRTsKKyAgbG9nYnVmWzFdID0gMjsgICAvKiBhcHBlbmQgdG8gZXhpc3RpbmcgV0lHR0xFUlMuTE9HICovCisgIG9jZF9wdXRfcGFja2V0IChsb2didWYsIDIpOworICBvY2RfZ2V0X3BhY2tldCAobG9nYnVmWzBdLCAmbG9ncGt0bGVuLCByZW1vdGVfdGltZW91dCk7CisKKyAgcmV0dXJuIHAgKyAzOworfQorDAordm9pZAorb2NkX2tpbGwgKCkKK3sKKyAgLyogRm9yIHNvbWUgbXlzdGVyaW91cyByZWFzb24sIHdhaXRfZm9yX2luZmVyaW9yIGNhbGxzIGtpbGwgaW5zdGVhZCBvZgorICAgICBtb3VybiBhZnRlciBpdCBnZXRzIFRBUkdFVF9XQUlUS0lORF9TSUdOQUxMRUQuICBXb3JrIGFyb3VuZCBpdC4gICovCisgIGlmIChraWxsX2tsdWRnZSkKKyAgICB7CisgICAgICBraWxsX2tsdWRnZSA9IDA7CisgICAgICB0YXJnZXRfbW91cm5faW5mZXJpb3IgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIERvbid0IHdhaXQgZm9yIGl0IHRvIGRpZS4gIEknbSBub3QgcmVhbGx5IHN1cmUgaXQgbWF0dGVycyB3aGV0aGVyCisgICAgIHdlIGRvIG9yIG5vdC4gICovCisgIHRhcmdldF9tb3Vybl9pbmZlcmlvciAoKTsKK30KKwordm9pZAorb2NkX21vdXJuICgpCit7CisgIHVucHVzaF90YXJnZXQgKGN1cnJlbnRfb3BzKTsKKyAgZ2VuZXJpY19tb3Vybl9pbmZlcmlvciAoKTsKK30KKworLyogQWxsIHdlIGFjdHVhbGx5IGRvIGlzIHNldCB0aGUgUEMgdG8gdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgZXhlY19iZmQsIGFuZCBzdGFydAorICAgdGhlIHByb2dyYW0gYXQgdGhhdCBwb2ludC4gICovCisKK3ZvaWQKK29jZF9jcmVhdGVfaW5mZXJpb3IgKGV4ZWNfZmlsZSwgYXJncywgZW52KQorICAgICBjaGFyICpleGVjX2ZpbGU7CisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGlmIChhcmdzICYmICgqYXJncyAhPSAnXDAwMCcpKQorICAgIGVycm9yICgiQXJncyBhcmUgbm90IHN1cHBvcnRlZCBieSBCRE0uIik7CisKKyAgY2xlYXJfcHJvY2VlZF9zdGF0dXMgKCk7CisgIHByb2NlZWQgKGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoZXhlY19iZmQpLCBUQVJHRVRfU0lHTkFMXzAsIDApOworfQorCit2b2lkCitvY2RfbG9hZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZ2VuZXJpY19sb2FkIChhcmdzLCBmcm9tX3R0eSk7CisKKyAgaW5mZXJpb3JfcGlkID0gMDsKKworLyogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBtYW55IHRoaW5ncyB3ZXJlIGJhc2VkIG9uIHRoZSBQQyBhdCB0aGUgdGltZSB0aGF0CisgICB3ZSBhdHRhY2hlZCB0byB0aGUgbW9uaXRvciwgd2hpY2ggaXMgbm8gbG9uZ2VyIHZhbGlkIG5vdyB0aGF0IHdlIGhhdmUgbG9hZGVkCisgICBuZXcgY29kZSAoYW5kIGp1c3QgY2hhbmdlZCB0aGUgUEMpLiAgQW5vdGhlciB3YXkgdG8gZG8gdGhpcyBtaWdodCBiZSB0byBjYWxsCisgICBub3JtYWxfc3RvcCwgZXhjZXB0IHRoYXQgdGhlIHN0YWNrIG1heSBub3QgYmUgdmFsaWQsIGFuZCB0aGluZ3Mgd291bGQgZ2V0CisgICBob3JyaWJseSBjb25mdXNlZC4uLiAqLworCisgIGNsZWFyX3N5bXRhYl91c2VycyAoKTsKK30KKworLyogVGhpcyBzaG91bGQgYmUgZGVmaW5lZCBmb3IgZWFjaCB0YXJnZXQgKi8KKy8qIEJ1dCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gY29tcGlsZSB0aGlzIGZpbGUgZm9yIHNvbWUgY29uZmlndXJhdGlvbnMKKyAgIG5vdCB5ZXQgc3VwcG9ydGVkIGZ1bGx5ICovCisgICAKKyNkZWZpbmUgQkRNX0JSRUFLUE9JTlQgezB4MCwweDAsMHgwLDB4MH0gLyogRm9yIHBwYyA4eHggKi8KKyNpZiAwCisjZGVmaW5lIEJETV9CUkVBS1BPSU5UIHsweDRhLDB4ZmF9IC8qIEJHTkQgaW5zbiB1c2VkIGZvciBDUFUzMiAqLworI2VuZGlmCisKKy8qIEJETSAoYXQgbGVhc3Qgb24gQ1BVMzIpIHVzZXMgYSBkaWZmZXJlbnQgYnJlYWtwb2ludCAqLworCitpbnQKK29jZF9pbnNlcnRfYnJlYWtwb2ludCAoYWRkciwgY29udGVudHNfY2FjaGUpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpjb250ZW50c19jYWNoZTsKK3sKKyAgc3RhdGljIGNoYXIgYnJlYWtfaW5zbltdID0gQkRNX0JSRUFLUE9JTlQ7CisgIGludCB2YWw7CisKKyAgdmFsID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChhZGRyLCBjb250ZW50c19jYWNoZSwgc2l6ZW9mIChicmVha19pbnNuKSk7CisKKyAgaWYgKHZhbCA9PSAwKQorICAgIHZhbCA9IHRhcmdldF93cml0ZV9tZW1vcnkgKGFkZHIsIGJyZWFrX2luc24sIHNpemVvZiAoYnJlYWtfaW5zbikpOworCisgIHJldHVybiB2YWw7Cit9CisKK2ludAorb2NkX3JlbW92ZV9icmVha3BvaW50IChhZGRyLCBjb250ZW50c19jYWNoZSkKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGNoYXIgKmNvbnRlbnRzX2NhY2hlOworeworICBzdGF0aWMgY2hhciBicmVha19pbnNuW10gPSBCRE1fQlJFQUtQT0lOVDsKKyAgaW50IHZhbDsKKworICB2YWwgPSB0YXJnZXRfd3JpdGVfbWVtb3J5IChhZGRyLCBjb250ZW50c19jYWNoZSwgc2l6ZW9mIChicmVha19pbnNuKSk7CisKKyAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQKK2JkbV9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBlcnJvciAoImJkbSBjb21tYW5kIG11c3QgYmUgZm9sbG93ZWQgYnkgYHJlc2V0JyIpOworfQorCitzdGF0aWMgdm9pZAorYmRtX3Jlc2V0X2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGludCBzdGF0dXMsIHBrdGxlbjsKKworICBpZiAoIW9jZF9kZXNjKQorICAgIGVycm9yICgiTm90IGNvbm5lY3RlZCB0byBPQ0QgZGV2aWNlLiIpOworCisgIG9jZF9kb19jb21tYW5kIChPQ0RfUkVTRVQsICZzdGF0dXMsICZwa3RsZW4pOworICBkY2FjaGVfZmx1c2ggKG9jZF9kY2FjaGUpOworICByZWdpc3RlcnNfY2hhbmdlZCAoKTsKK30KKworc3RhdGljIHZvaWQKK2JkbV9yZXN0YXJ0X2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGludCBzdGF0dXMsIHBrdGxlbjsKKworICBpZiAoIW9jZF9kZXNjKQorICAgIGVycm9yICgiTm90IGNvbm5lY3RlZCB0byBPQ0QgZGV2aWNlLiIpOworCisgIG9jZF9kb19jb21tYW5kIChPQ0RfUkVTRVRfUlVOLCAmc3RhdHVzLCAmcGt0bGVuKTsKKyAgbGFzdF9ydW5fc3RhdHVzID0gc3RhdHVzOworICBjbGVhcl9wcm9jZWVkX3N0YXR1cyAoKTsKKyAgd2FpdF9mb3JfaW5mZXJpb3IgKCk7CisgIG5vcm1hbF9zdG9wICgpOworfQorCisvKiBUZW1wb3JhcnkgcmVwbGFjZW1lbnQgZm9yIHRhcmdldF9zdG9yZV9yZWdpc3RlcnMoKS4gIFRoaXMgcHJldmVudHMKKyAgIGdlbmVyaWNfbG9hZCBmcm9tIHRyeWluZyB0byBzZXQgdGhlIFBDLiAgKi8KKworc3RhdGljIHZvaWQKK25vb3Bfc3RvcmVfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworfQorCitzdGF0aWMgdm9pZAorYmRtX3VwZGF0ZV9mbGFzaF9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpbnQgc3RhdHVzLCBwa3RsZW47CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisgIHZvaWQgKCpzdG9yZV9yZWdpc3RlcnNfdG1wKSBQQVJBTVMgKChpbnQpKTsKKworICBpZiAoIW9jZF9kZXNjKQorICAgIGVycm9yICgiTm90IGNvbm5lY3RlZCB0byBPQ0QgZGV2aWNlLiIpOworCisgIGlmICghYXJncykKKyAgICBlcnJvciAoIk11c3Qgc3BlY2lmeSBmaWxlIGNvbnRhaW5pbmcgbmV3IE9DRCBjb2RlLiIpOworCisvKiAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwIChmbGFzaF9jbGVhbnVwLCAwKTsqLworCisgIG9jZF9kb19jb21tYW5kIChPQ0RfRU5URVJfTU9OLCAmc3RhdHVzLCAmcGt0bGVuKTsKKworICBvY2RfZG9fY29tbWFuZCAoT0NEX0VSQVNFX0ZMQVNILCAmc3RhdHVzLCAmcGt0bGVuKTsKKworICB3cml0ZV9tZW1fY29tbWFuZCA9IE9DRF9QUk9HUkFNX0ZMQVNIOworICBzdG9yZV9yZWdpc3RlcnNfdG1wID0gY3VycmVudF90YXJnZXQudG9fc3RvcmVfcmVnaXN0ZXJzOworICBjdXJyZW50X3RhcmdldC50b19zdG9yZV9yZWdpc3RlcnMgPSBub29wX3N0b3JlX3JlZ2lzdGVyczsKKworICBnZW5lcmljX2xvYWQgKGFyZ3MsIGZyb21fdHR5KTsKKworICBjdXJyZW50X3RhcmdldC50b19zdG9yZV9yZWdpc3RlcnMgPSBzdG9yZV9yZWdpc3RlcnNfdG1wOworICB3cml0ZV9tZW1fY29tbWFuZCA9IE9DRF9XUklURV9NRU07CisKKyAgb2NkX2RvX2NvbW1hbmQgKE9DRF9FWElUX01PTiwgJnN0YXR1cywgJnBrdGxlbik7CisKKy8qICBkaXNjYXJkX2NsZWFudXBzIChvbGRfY2hhaW4pOyovCit9CisKK3N0YXRpYyB2b2lkCitiZG1fcmVhZF9yZWdpc3Rlcl9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICAvKiBYWFggcmVwZWF0IHNob3VsZCBnbyBvbiB0byB0aGUgbmV4dCByZWdpc3RlciAqLworCisgIGlmICghb2NkX2Rlc2MpCisgICAgZXJyb3IgKCJOb3QgY29ubmVjdGVkIHRvIE9DRCBkZXZpY2UuIik7CisKKyAgaWYgKCFhcmdzKQorICAgIGVycm9yICgiTXVzdCBzcGVjaWZ5IEJETSByZWdpc3RlciBudW1iZXIuIik7CisKK30KKwwKK3ZvaWQKK19pbml0aWFsaXplX3JlbW90ZV9vY2QgKCkKK3sKKyAgZXh0ZXJuIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjbWRsaXN0OworICBzdGF0aWMgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKm9jZF9jbWRfbGlzdCA9IE5VTEw7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQgKGFkZF9zZXRfY21kICgicmVtb3RldGltZW91dCIsIG5vX2NsYXNzLAorCQkJCSAgdmFyX2ludGVnZXIsIChjaGFyICopJnJlbW90ZV90aW1lb3V0LAorCQkJCSAgIlNldCB0aW1lb3V0IHZhbHVlIGZvciByZW1vdGUgcmVhZC5cbiIsICZzZXRsaXN0KSwKKwkJICAgICAmc2hvd2xpc3QpOworCisgIGFkZF9wcmVmaXhfY21kICgib2NkIiwgY2xhc3Nfb2JzY3VyZSwgYmRtX2NvbW1hbmQsICIiLCAmb2NkX2NtZF9saXN0LCAib2NkICIsCisJCSAgMCwgJmNtZGxpc3QpOworCisgIGFkZF9jbWQgKCJyZXNldCIsIGNsYXNzX29ic2N1cmUsIGJkbV9yZXNldF9jb21tYW5kLCAiIiwgJm9jZF9jbWRfbGlzdCk7CisgIGFkZF9jbWQgKCJyZXN0YXJ0IiwgY2xhc3Nfb2JzY3VyZSwgYmRtX3Jlc3RhcnRfY29tbWFuZCwgIiIsICZvY2RfY21kX2xpc3QpOworICBhZGRfY21kICgidXBkYXRlLWZsYXNoIiwgY2xhc3Nfb2JzY3VyZSwgYmRtX3VwZGF0ZV9mbGFzaF9jb21tYW5kLCAiIiwgJm9jZF9jbWRfbGlzdCk7CisgIC8qICBhZGRfY21kICgicmVhZC1yZWdpc3RlciIsIGNsYXNzX29ic2N1cmUsIGJkbV9yZWFkX3JlZ2lzdGVyX2NvbW1hbmQsICIiLCAmb2NkX2NtZF9saXN0KTsqLworfQpkaWZmIC0tZ2l0IGEvZ2RiL29jZC5oIGIvZ2RiL29jZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMGQzZTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvb2NkLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qIERlZmluaXRpb25zIGZvciB0aGUgTWFjcmFpZ29yIFN5c3RlbXMgQkRNIFdpZ2dsZXIKKyAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgT0NEX0gKKyNkZWZpbmUgT0NEX0gKKworLyogV2lnZ2xlciBzZXJpYWwgcHJvdG9jb2wgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBETEUgMDIwCQkJLyogUXVvdGUgY2hhciAqLworI2RlZmluZSBTWU4gMDI2CQkJLyogU3RhcnQgb2YgcGFja2V0ICovCisjZGVmaW5lIFJBV19TWU4gKCgwMjYgPDwgOCkgfCAwMjYpIC8qIGdldF9xdW90ZWRfY2hhciBmb3VuZCBhIG5ha2VkIFNZTiAqLworCisvKiBTdGF0dXMgZmxhZ3MgKi8KKworI2RlZmluZSBPQ0RfRkxBR19SRVNFVCAweDAxCS8qIFRhcmdldCBpcyBiZWluZyByZXNldCAqLworI2RlZmluZSBPQ0RfRkxBR19TVE9QUEVEIDB4MDIJLyogVGFyZ2V0IGlzIGhhbHRlZCAqLworI2RlZmluZSBPQ0RfRkxBR19CRE0gMHgwNAkvKiBUYXJnZXQgaXMgaW4gQkRNICovCisjZGVmaW5lIE9DRF9GTEFHX1BXRiAweDA4CS8qIFBvd2VyIGZhaWxlZCAqLworI2RlZmluZSBPQ0RfRkxBR19DQUJMRV9ESVNDIDB4MTAgLyogQkRNIGNhYmxlIGRpc2Nvbm5lY3RlZCAqLworCisvKiBDb21tYW5kcyAqLworCisjZGVmaW5lIE9DRF9BWVQgMHgwCQkvKiBBcmUgeW91IHRoZXJlPyAqLworI2RlZmluZSBPQ0RfR0VUX1ZFUlNJT04gMHgxCS8qIEdldCBWZXJzaW9uICovCisjZGVmaW5lIE9DRF9TRVRfQkFVRF9SQVRFIDB4MgkvKiBTZXQgQmF1ZCBSYXRlICovCisjZGVmaW5lIE9DRF9JTklUIDB4MTAJCS8qIEluaXRpYWxpemUgV2lnZ2xlciAqLworI2RlZmluZSBPQ0RfU0VUX1NQRUVEIDB4MTEJLyogU2V0IFNwZWVkICovCisjZGVmaW5lIE9DRF9HRVRfU1RBVFVTX01BU0sgMHgxMiAvKiBHZXQgU3RhdHVzIE1hc2sgKi8KKyNkZWZpbmUgT0NEX0dFVF9DVFJTIDB4MTMJLyogR2V0IEVycm9yIENvdW50ZXJzICovCisjZGVmaW5lIE9DRF9TRVRfRlVOQ19DT0RFIDB4MTQJLyogU2V0IEZ1bmN0aW9uIENvZGUgKi8KKyNkZWZpbmUgT0NEX1NFVF9DVExfRkxBR1MgMHgxNQkvKiBTZXQgQ29udHJvbCBGbGFncyAqLworI2RlZmluZSBPQ0RfU0VUX0JVRl9BRERSIDB4MTYJLyogU2V0IFJlZ2lzdGVyIEJ1ZmZlciBBZGRyZXNzICovCisjZGVmaW5lIE9DRF9SVU4gMHgyMAkJLyogUnVuIFRhcmdldCBmcm9tIFBDICovCisjZGVmaW5lIE9DRF9SVU5fQUREUiAweDIxCS8qIFJ1biBUYXJnZXQgZnJvbSBTcGVjaWZpZWQgQWRkcmVzcyAqLworI2RlZmluZSBPQ0RfU1RPUCAweDIyCQkvKiBTdG9wIFRhcmdldCAqLworI2RlZmluZSBPQ0RfUkVTRVRfUlVOIDB4MjMJLyogUmVzZXQgVGFyZ2V0IGFuZCBSdW4gKi8KKyNkZWZpbmUgT0NEX1JFU0VUIDB4MjQJCS8qIFJlc2V0IFRhcmdldCBhbmQgSGFsdCAqLworI2RlZmluZSBPQ0RfU1RFUCAweDI1CQkvKiBTaW5nbGUgc3RlcCAqLworI2RlZmluZSBPQ0RfUkVBRF9SRUdTIDB4MzAJLyogUmVhZCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgT0NEX1dSSVRFX1JFR1MgMHgzMQkvKiBXcml0ZSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgT0NEX1JFQURfTUVNIDB4MzIJLyogUmVhZCBNZW1vcnkgKi8KKyNkZWZpbmUgT0NEX1dSSVRFX01FTSAweDMzCS8qIFdyaXRlIE1lbW9yeSAqLworI2RlZmluZSBPQ0RfRklMTF9NRU0gMHgzNAkvKiBGaWxsIE1lbW9yeSAqLworI2RlZmluZSBPQ0RfTU9WRV9NRU0gMHgzNQkvKiBNb3ZlIE1lbW9yeSAqLworCisjZGVmaW5lIE9DRF9SRUFEX0lOVF9NRU0gMHg4MAkvKiBSZWFkIEludGVybmFsIE1lbW9yeSAqLworI2RlZmluZSBPQ0RfV1JJVEVfSU5UX01FTSAweDgxCS8qIFdyaXRlIEludGVybmFsIE1lbW9yeSAqLworI2RlZmluZSBPQ0RfSlVNUCAweDgyCQkvKiBKdW1wIHRvIFN1YnJvdXRpbmUgKi8KKworI2RlZmluZSBPQ0RfRVJBU0VfRkxBU0ggMHg5MAkvKiBFcmFzZSBmbGFzaCBtZW1vcnkgKi8KKyNkZWZpbmUgT0NEX1BST0dSQU1fRkxBU0ggMHg5MQkvKiBXcml0ZSBmbGFzaCBtZW1vcnkgKi8KKyNkZWZpbmUgT0NEX0VYSVRfTU9OIDB4OTMJLyogRXhpdCB0aGUgZmxhc2ggcHJvZ3JhbW1pbmcgbW9uaXRvciAgKi8KKyNkZWZpbmUgT0NEX0VOVEVSX01PTiAweDk0CS8qIEVudGVyIHRoZSBmbGFzaCBwcm9ncmFtbWluZyBtb25pdG9yICAqLworCisjZGVmaW5lIE9DRF9TRVRfU1RBVFVTIDB4MGEJLyogU2V0IHN0YXR1cyAqLworI2RlZmluZSBPQ0RfU0VUX0NPTk5FQ1RJT04gMHhmMAkvKiBTZXQgY29ubmVjdGlvbiAoaW5pdCBXaWdnbGVycy5kbGwpICovCisjZGVmaW5lIE9DRF9MT0dfRklMRSAweGYxCS8qIENtZCB0byBnZXQgV2lnZ2xlcnMuZGxsIHRvIGxvZyBjbWRzICovCisjZGVmaW5lIE9DRF9GTEFHX1NUT1AgMHgwCS8qIFN0b3AgdGhlIHRhcmdldCwgZW50ZXIgQkRNICovCisjZGVmaW5lIE9DRF9GTEFHX1NUQVJUIDB4MDEJLyogU3RhcnQgdGhlIHRhcmdldCBhdCBQQyAqLworI2RlZmluZSBPQ0RfRkxBR19SRVRVUk5fU1RBVFVTIDB4MDQgLyogUmV0dXJuIGFzeW5jIHN0YXR1cyAqLworCisvKiBUYXJnZXQgdHlwZSAoZm9yIE9DRF9JTklUIGNvbW1hbmQpICovCisKK2VudW0gb2NkX3RhcmdldF90eXBlIHsKKyAgT0NEX1RBUkdFVF9DUFUzMj0weDAsCQkvKiBNb3RvIGNwdTMyIGZhbWlseSAqLworICBPQ0RfVEFSR0VUX0NQVTE2PTB4MSwKKyAgT0NEX1RBUkdFVF9NT1RPX1BQQz0weDIsCS8qIE1vdG9yb2xhIFBQQyA1eHgvOHh4ICovCisgIE9DRF9UQVJHRVRfSUJNX1BQQz0weDN9OwkvKiBJQk0gUFBDIDR4eCAqLworCit2b2lkIG9jZF9vcGVuIFBBUkFNUyAoKGNoYXIgKm5hbWUsIGludCBmcm9tX3R0eSwgZW51bSBvY2RfdGFyZ2V0X3R5cGUsCisJCQkgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqb3BzKSk7CisKK3ZvaWQgb2NkX2Nsb3NlIFBBUkFNUyAoKGludCBxdWl0dGluZykpOworCit2b2lkIG9jZF9kZXRhY2ggUEFSQU1TICgoY2hhciAqYXJncywgaW50IGZyb21fdHR5KSk7CisKK3ZvaWQgb2NkX3Jlc3VtZSBQQVJBTVMgKChpbnQgcGlkLCBpbnQgc3RlcCwgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ2duYWwpKTsKKwordm9pZCBvY2RfcHJlcGFyZV90b19zdG9yZSBQQVJBTVMgKCh2b2lkKSk7CisKK3ZvaWQgb2NkX3N0b3AgUEFSQU1TICgodm9pZCkpOworCit2b2lkIG9jZF9maWxlc19pbmZvIFBBUkFNUyAoKHN0cnVjdCB0YXJnZXRfb3BzICppZ25vcmUpKTsKKworCitpbnQgb2NkX3hmZXJfbWVtb3J5IFBBUkFNUyAoKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsCisJCQkJIGludCBsZW4sIGludCBzaG91bGRfd3JpdGUsCisJCQkJIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQpKTsKKwordm9pZCBvY2RfbW91cm4gUEFSQU1TICgodm9pZCkpOworCit2b2lkIG9jZF9jcmVhdGVfaW5mZXJpb3IgUEFSQU1TICgoY2hhciAqZXhlY19maWxlLAorCQkJCSAgICAgIGNoYXIgKmFyZ3MsCisJCQkJICAgICAgY2hhciAqKmVudikpOworCitpbnQgb2NkX3RocmVhZF9hbGl2ZSBQQVJBTVMgKChpbnQgdGgpKTsKKwordm9pZCBvY2RfZXJyb3IgUEFSQU1TICgoY2hhciAqcywgaW50IGVycm9yX2NvZGUpKTsKKwordm9pZCBvY2Rfa2lsbCBQQVJBTVMgKCh2b2lkKSk7CisKK3ZvaWQgb2NkX2xvYWQgUEFSQU1TKChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpKTsKKwordW5zaWduZWQgY2hhciAqIG9jZF9yZWFkX2JkbV9yZWdpc3RlcnMgUEFSQU1TICgoaW50IGZpcnN0X2JkbV9yZWdubywKKwkJCQkJCSAgICBpbnQgbGFzdF9iZG1fcmVnbm8sCisJCQkJCQkgICAgaW50ICpyZWdsZW4pKTsKKworQ09SRV9BRERSIG9jZF9yZWFkX2JkbV9yZWdpc3RlciBQQVJBTVMgKChpbnQgYmRtX3JlZ25vKSk7CisKK3ZvaWQgb2NkX3dyaXRlX2JkbV9yZWdpc3RlcnMgUEFSQU1TICgoaW50IGZpcnN0X2JkbV9yZWdubywKKwkJCQkJICB1bnNpZ25lZCBjaGFyICpyZWdwdHIsCisJCQkJCSAgaW50IHJlZ2xlbikpOworCit2b2lkIG9jZF93cml0ZV9iZG1fcmVnaXN0ZXIgUEFSQU1TICgoaW50IGJkbV9yZWdubywgQ09SRV9BRERSIHJlZykpOworCitpbnQgb2NkX3dhaXQgUEFSQU1TICgodm9pZCkpOworCitpbnQgb2NkX2luc2VydF9icmVha3BvaW50IFBBUkFNUyAoKENPUkVfQUREUiBhZGRyLCBjaGFyICpjb250ZW50c19jYWNoZSkpOworaW50IG9jZF9yZW1vdmVfYnJlYWtwb2ludCBQQVJBTVMgKChDT1JFX0FERFIgYWRkciwgY2hhciAqY29udGVudHNfY2FjaGUpKTsKKworaW50IG9jZF93cml0ZV9ieXRlcyBQQVJBTVMgKChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLCBpbnQgbGVuKSk7CisKKyNlbmRpZiAvKiBPQ0RfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL29wNTAtcm9tLmMgYi9nZGIvb3A1MC1yb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjYyMDkxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL29wNTAtcm9tLmMKQEAgLTAsMCArMSwxNDIgQEAKKy8qIFJlbW90ZSB0YXJnZXQgZ2x1ZSBmb3IgdGhlIE9raSBvcDUwbiBiYXNlZCBldmFsIGJvYXJkLgorCisgICBDb3B5cmlnaHQgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJtb25pdG9yLmgiCisjaW5jbHVkZSAic2VyaWFsLmgiCisKK3N0YXRpYyB2b2lkIG9wNTBuX29wZW4gUEFSQU1TICgoY2hhciAqYXJncywgaW50IGZyb21fdHR5KSk7CisKKy8qCisgKiB0aGlzIGFycmF5IG9mIHJlZ2lzdGVycyBuZWVkIHRvIG1hdGNoIHRoZSBpbmRleGVzIHVzZWQgYnkgR0RCLiBUaGUKKyAqIHdob2xlIHJlYXNvbiB0aGlzIGV4aXN0cyBpcyBjYXVzZSB0aGUgdmFyaW91cyBST00gbW9uaXRvcnMgdXNlCisgKiBkaWZmZXJlbnQgc3RyaW5ncyB0aGFuIEdEQiBkb2VzLCBhbmQgZG9lc24ndCBzdXBwb3J0IGFsbCB0aGUKKyAqIHJlZ2lzdGVycyBlaXRoZXIuIFNvLCB0eXBpbmcgImluZm8gcmVnIHNwIiBiZWNvbWVzIGEgInIzMCIuCisgKi8KKworc3RhdGljIGNoYXIgKm9wNTBuX3JlZ25hbWVzW05VTV9SRUdTXSA9Cit7CisgICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsCisgICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIsCisgICJyMTYiLCAicjE3IiwgInIxOCIsICJyMTkiLCAicjIwIiwgInIyMSIsICJyMjIiLCAicjIzIiwKKyAgInIyNCIsICJyMjUiLCAicjI2IiwgInIyNyIsICJyMjgiLCAicjI5IiwgInIzMCIsICJyMzEiLAorICAiY3IxMSIsICJwIiwgTlVMTCwgTlVMTCwgTlVMTCwgImNyMTUiLCAiY3IxOSIsICJjcjIwIiwKKyAgImNyMjEiLCAiY3IyMiIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgIE5VTEwsIE5VTEwsIE5VTEwsICJjcjAiLCAiY3I4IiwgImNyOSIsICJjcjEwIiwiY3IxMiIsCisgICJjcjEzIiwgImNyMjQiLCAiY3IyNSIsICJjcjI2IiwKK307CisKKy8qCisgKiBEZWZpbmUgdGhlIG1vbml0b3IgY29tbWFuZCBzdHJpbmdzLiBTaW5jZSB0aGVzZSBhcmUgcGFzc2VkIGRpcmVjdGx5CisgKiB0aHJvdWdoIHRvIGEgcHJpbnRmIHN0eWxlIGZ1bmN0aW9uLCB3ZSBuZWVkIGNhbiBpbmNsdWRlIGZvcm1hdHRpbmcKKyAqIHN0cmluZ3MuIFdlIGFsc28gbmVlZCBhIENSIG9yIExGIG9uIHRoZSBlbmQuCisgKi8KKworc3RhdGljIHN0cnVjdCB0YXJnZXRfb3BzIG9wNTBuX29wczsKKworc3RhdGljIGNoYXIgKm9wNTBuX2luaXRzW10gPSB7Ii5cciIsIE5VTEx9OworCitzdGF0aWMgc3RydWN0IG1vbml0b3Jfb3BzIG9wNTBuX2NtZHMgOworCitzdGF0aWMgdm9pZCAKK2luaXRfb3A1MG5fY21kcyh2b2lkKQoreworICBvcDUwbl9jbWRzLmZsYWdzID0gICBNT19DTFJfQlJFQUtfVVNFU19BRERSIC8qfCBNT19HRVRNRU1fUkVBRF9TSU5HTEUqLzsgLyogZmxhZ3MgKi8KKyAgb3A1MG5fY21kcy5pbml0ID0gICBvcDUwbl9pbml0czsJCQkvKiBJbml0IHN0cmluZ3MgKi8KKyAgb3A1MG5fY21kcy5jb250ID0gICAiZ1xyIjsJCQkvKiBjb250aW51ZSBjb21tYW5kICovCisgIG9wNTBuX2NtZHMuc3RlcCA9ICAgInRcciI7CQkJLyogc2luZ2xlIHN0ZXAgKi8KKyAgb3A1MG5fY21kcy5zdG9wID0gICAiXDAwMy5cciI7CQkJLyogSW50ZXJydXB0IGNoYXIgKi8KKyAgb3A1MG5fY21kcy5zZXRfYnJlYWsgPSAgICJiICV4XHIiOwkJCS8qIHNldCBhIGJyZWFrcG9pbnQgKi8KKyAgb3A1MG5fY21kcy5jbHJfYnJlYWsgPSAgICJiICV4OzBcciI7CQkJLyogY2xlYXIgYnJlYWtwb2ludCBhdCBhZGRyICovCisgIG9wNTBuX2NtZHMuY2xyX2FsbF9icmVhayA9ICAgImJ4XHIiOwkJCS8qIGNsZWFyIGFsbCBicmVha3BvaW50cyAqLworICBvcDUwbl9jbWRzLmZpbGwgPSAgICJmeCAleCBzJXggJXhcciI7CQkvKiBtZW1vcnkgZmlsbCBjbWQgKGFkZHIsIGxlbiwgdmFsKSAqLworICBvcDUwbl9jbWRzLnNldG1lbS5jbWRiID0gICAgICJzeCAleCAleFxyIjsJCS8qIHNldG1lbS5jbWRiIChhZGRyLCB2YWx1ZSkgKi8KKyAgb3A1MG5fY21kcy5zZXRtZW0uY21kdyA9ICAgICAic2ggJXggJXhcciI7CQkvKiBzZXRtZW0uY21kdyAoYWRkciwgdmFsdWUpICovCisgIG9wNTBuX2NtZHMuc2V0bWVtLmNtZGwgPSAgICAgInMgJXggJXhcciI7CQkvKiBzZXRtZW0uY21kbCAoYWRkciwgdmFsdWUpICovCisgIG9wNTBuX2NtZHMuc2V0bWVtLmNtZGxsID0gICAgIE5VTEw7CQkJLyogc2V0bWVtLmNtZGxsIChhZGRyLCB2YWx1ZSkgKi8KKyAgb3A1MG5fY21kcy5zZXRtZW0ucmVzcF9kZWxpbSA9ICAgICBOVUxMOwkJCS8qIHNldG1lbS5yZXNwX2RlbGltICovCisgIG9wNTBuX2NtZHMuc2V0bWVtLnRlcm0gPSAgICAgTlVMTDsJCQkvKiBzZXRtZW0udGVybSAqLworICBvcDUwbl9jbWRzLnNldG1lbS50ZXJtX2NtZCA9ICAgICBOVUxMOwkJCS8qIHNldG1lbS50ZXJtX2NtZCAqLworI2lmIDAKKyAgeworICAgICJzeCAleFxyIiwJCQkvKiBnZXRtZW0uY21kYiAoYWRkciwgbGVuKSAqLworICAgICAgInNoICV4XHIiLAkJCS8qIGdldG1lbS5jbWR3IChhZGRyLCBsZW4pICovCisgICAgICAicyAleFxyIiwJCQkvKiBnZXRtZW0uY21kbCAoYWRkciwgbGVuKSAqLworICAgICAgTlVMTCwJCQkvKiBnZXRtZW0uY21kbGwgKGFkZHIsIGxlbikgKi8KKyAgICAgICIgOiAiLAkJCS8qIGdldG1lbS5yZXNwX2RlbGltICovCisgICAgICAiICIsCQkJLyogZ2V0bWVtLnRlcm0gKi8KKyAgICAgICIuXHIiLAkJCS8qIGdldG1lbS50ZXJtX2NtZCAqLworICAgICAgfSA7CisjZWxzZQorICBvcDUwbl9jbWRzLmdldG1lbS5jbWRiID0gICAgICJkeCAleCBzJXhcciI7CQkvKiBnZXRtZW0uY21kYiAoYWRkciwgbGVuKSAqLworICBvcDUwbl9jbWRzLmdldG1lbS5jbWR3ID0gICAgIE5VTEw7CQkJLyogZ2V0bWVtLmNtZHcgKGFkZHIsIGxlbikgKi8KKyAgb3A1MG5fY21kcy5nZXRtZW0uY21kbCA9ICAgICBOVUxMOwkJCS8qIGdldG1lbS5jbWRsIChhZGRyLCBsZW4pICovCisgIG9wNTBuX2NtZHMuZ2V0bWVtLmNtZGxsID0gICAgIE5VTEw7CQkJLyogZ2V0bWVtLmNtZGxsIChhZGRyLCBsZW4pICovCisgIG9wNTBuX2NtZHMuZ2V0bWVtLnJlc3BfZGVsaW0gPSAgICAgIiA6ICI7CQkJLyogZ2V0bWVtLnJlc3BfZGVsaW0gKi8KKyAgb3A1MG5fY21kcy5nZXRtZW0udGVybSA9ICAgICBOVUxMOwkJCS8qIGdldG1lbS50ZXJtICovCisgIG9wNTBuX2NtZHMuZ2V0bWVtLnRlcm1fY21kID0gICAgIE5VTEw7CQkJLyogZ2V0bWVtLnRlcm1fY21kICovCisjZW5kaWYKKyAgb3A1MG5fY21kcy5zZXRyZWcuY21kID0gICAgICJ4ICVzICV4XHIiOwkJLyogc2V0cmVnLmNtZCAobmFtZSwgdmFsdWUpICovCisgIG9wNTBuX2NtZHMuc2V0cmVnLnJlc3BfZGVsaW0gPSAgICAgTlVMTDsJCQkvKiBzZXRyZWcucmVzcF9kZWxpbSAqLworICBvcDUwbl9jbWRzLnNldHJlZy50ZXJtID0gICAgIE5VTEw7CQkJLyogc2V0cmVnLnRlcm0gKi8KKyAgb3A1MG5fY21kcy5zZXRyZWcudGVybV9jbWQgPSAgICAgTlVMTDsJCQkvKiBzZXRyZWcudGVybV9jbWQgKi8KKyAgb3A1MG5fY21kcy5nZXRyZWcuY21kID0gICAgICJ4ICVzXHIiOwkJCS8qIGdldHJlZy5jbWQgKG5hbWUpICovCisgIG9wNTBuX2NtZHMuZ2V0cmVnLnJlc3BfZGVsaW0gPSAgICAgIj0iOwkJCS8qIGdldHJlZy5yZXNwX2RlbGltICovCisgIG9wNTBuX2NtZHMuZ2V0cmVnLnRlcm0gPSAgICAgIiAiOwkJCS8qIGdldHJlZy50ZXJtICovCisgIG9wNTBuX2NtZHMuZ2V0cmVnLnRlcm1fY21kID0gICAgICIuXHIiOwkJCS8qIGdldHJlZy50ZXJtX2NtZCAqLworICBvcDUwbl9jbWRzLmR1bXBfcmVnaXN0ZXJzID0gICBOVUxMOwkJCQkvKiBkdW1wX3JlZ2lzdGVycyAqLworICBvcDUwbl9jbWRzLnJlZ2lzdGVyX3BhdHRlcm4gPSAgIE5VTEw7CQkJCS8qIHJlZ2lzdGVyX3BhdHRlcm4gKi8KKyAgb3A1MG5fY21kcy5zdXBwbHlfcmVnaXN0ZXIgPSAgIE5VTEw7CQkJCS8qIHN1cHBseV9yZWdpc3RlciAqLworICBvcDUwbl9jbWRzLmxvYWRfcm91dGluZSA9ICAgTlVMTDsJCQkJLyogbG9hZCByb3V0aW5lICovCisgIG9wNTBuX2NtZHMubG9hZCA9ICAgInIgMFxyIjsJCQkvKiBkb3dubG9hZCBjb21tYW5kICovCisgIG9wNTBuX2NtZHMubG9hZHJlc3AgPSAgIE5VTEw7CQkJCS8qIGxvYWQgcmVzcG9uc2UgKi8KKyAgb3A1MG5fY21kcy5wcm9tcHQgPSAgICJcbiMiOwkJCS8qIG1vbml0b3IgY29tbWFuZCBwcm9tcHQgKi8KKyAgb3A1MG5fY21kcy5saW5lX3Rlcm0gPSAgICJcciI7CQkJCS8qIGVuZC1vZi1jb21tYW5kIGRlbGltaXRvciAqLworICBvcDUwbl9jbWRzLmNtZF9lbmQgPSAgIE5VTEw7CQkJCS8qIG9wdGlvbmFsIGNvbW1hbmQgdGVybWluYXRvciAqLworICBvcDUwbl9jbWRzLnRhcmdldCA9ICAgJm9wNTBuX29wczsJCQkvKiB0YXJnZXQgb3BlcmF0aW9ucyAqLworICBvcDUwbl9jbWRzLnN0b3BiaXRzID0gICBTRVJJQUxfMV9TVE9QQklUUzsJCS8qIG51bWJlciBvZiBzdG9wIGJpdHMgKi8KKyAgb3A1MG5fY21kcy5yZWduYW1lcyA9ICAgb3A1MG5fcmVnbmFtZXM7CQkvKiByZWdpc3RlciBuYW1lcyAqLworICBvcDUwbl9jbWRzLm1hZ2ljID0gICBNT05JVE9SX09QU19NQUdJQzsJCS8qIG1hZ2ljICovCit9OworCitzdGF0aWMgdm9pZAorb3A1MG5fb3BlbiAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgbW9uaXRvcl9vcGVuIChhcmdzLCAmb3A1MG5fY21kcywgZnJvbV90dHkpOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9vcDUwbiAoKQoreworICBpbml0X29wNTBuX2NtZHMoKSA7CisgIGluaXRfbW9uaXRvcl9vcHMgKCZvcDUwbl9vcHMpOworCisgIG9wNTBuX29wcy50b19zaG9ydG5hbWUgPSAib3A1MG4iOworICBvcDUwbl9vcHMudG9fbG9uZ25hbWUgPSAiT2tpJ3MgZGVidWcgbW9uaXRvciBmb3IgdGhlIE9wNTBuIEV2YWwgYm9hcmQiOworICBvcDUwbl9vcHMudG9fZG9jID0gIkRlYnVnIG9uIGEgT2tpIE9QNTBOIGV2YWwgYm9hcmQuXG5cCitTcGVjaWZ5IHRoZSBzZXJpYWwgZGV2aWNlIGl0IGlzIGNvbm5lY3RlZCB0byAoZS5nLiAvZGV2L3R0eWEpLiI7CisgIG9wNTBuX29wcy50b19vcGVuID0gb3A1MG5fb3BlbjsKKworICBhZGRfdGFyZ2V0ICgmb3A1MG5fb3BzKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9vczlrcmVhZC5jIGIvZ2RiL29zOWtyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczZDQxNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9vczlrcmVhZC5jCkBAIC0wLDAgKzEsMTYyNCBAQAorLyogUmVhZCBvczkvb3M5ayBzeW1ib2wgdGFibGVzIGFuZCBjb252ZXJ0IHRvIGludGVybmFsIGZvcm1hdCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk2LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB0aHJlZSBmdW5jdGlvbnM6IG9zOWtfc3ltZmlsZV9pbml0LAorICAgd2hpY2ggaW5pdGlhbGl6ZXMgdG8gcmVhZCBhIHN5bWJvbCBmaWxlOyBvczlrX25ld19pbml0LCB3aGljaCAKKyAgIGRpc2NhcmRzIGV4aXN0aW5nIGNhY2hlZCBpbmZvcm1hdGlvbiB3aGVuIGFsbCBzeW1ib2xzIGFyZSBiZWluZworICAgZGlzY2FyZGVkOyBhbmQgb3M5a19zeW1maWxlX3JlYWQsIHdoaWNoIHJlYWRzIGEgc3ltYm9sIHRhYmxlCisgICBmcm9tIGEgZmlsZS4KKworICAgb3M5a19zeW1maWxlX3JlYWQgb25seSBkb2VzIHRoZSBtaW5pbXVtIHdvcmsgbmVjZXNzYXJ5IGZvciBsZXR0aW5nIHRoZQorICAgdXNlciAibmFtZSIgdGhpbmdzIHN5bWJvbGljYWxseTsgaXQgZG9lcyBub3QgcmVhZCB0aGUgZW50aXJlIHN5bXRhYi4KKyAgIEluc3RlYWQsIGl0IHJlYWRzIHRoZSBleHRlcm5hbCBhbmQgc3RhdGljIHN5bWJvbHMgYW5kIHB1dHMgdGhlbSBpbiBwYXJ0aWFsCisgICBzeW1ib2wgdGFibGVzLiAgV2hlbiBtb3JlIGV4dGVuc2l2ZSBpbmZvcm1hdGlvbiBpcyByZXF1ZXN0ZWQgb2YgYQorICAgZmlsZSwgdGhlIGNvcnJlc3BvbmRpbmcgcGFydGlhbCBzeW1ib2wgdGFibGUgaXMgbXV0YXRlZCBpbnRvIGEgZnVsbAorICAgZmxlZGdlZCBzeW1ib2wgdGFibGUgYnkgZ29pbmcgYmFjayBhbmQgcmVhZGluZyB0aGUgc3ltYm9scworICAgZm9yIHJlYWwuICBvczlrX3BzeW10YWJfdG9fc3ltdGFiKCkgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGlzICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZiBkZWZpbmVkKFVTRykgfHwgZGVmaW5lZChfX0NZR05VU0NMSUJfXykKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJvYnN0YWNrLmgiCisjaW5jbHVkZSAiZ2RiX3N0YXQuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImJyZWFrcG9pbnQuaCIKKyNpbmNsdWRlICJjb21tYW5kLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgkJLyogZm9yIGJmZCBzdHVmZiAqLworI2luY2x1ZGUgImxpYmFvdXQuaCIJIAkvKiBGSVhNRSBTZWNyZXQgaW50ZXJuYWwgQkZEIHN0dWZmIGZvciBhLm91dCAqLworI2luY2x1ZGUgInN5bWZpbGUuaCIKKyNpbmNsdWRlICJvYmpmaWxlcy5oIgorI2luY2x1ZGUgImJ1aWxkc3ltLmgiCisjaW5jbHVkZSAiZ2RiLXN0YWJzLmgiCisjaW5jbHVkZSAiZGVtYW5nbGUuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgkJLyogTmVlZGVkIGluc2lkZSBwYXJ0aWFsLXN0YWIuaCAqLworI2luY2x1ZGUgImNvbXBsYWludHMuaCIKKyNpbmNsdWRlICJvczlrLmgiCisjaW5jbHVkZSAic3RhYnNyZWFkLmgiCisKKy8qIEVhY2ggcGFydGlhbCBzeW1ib2wgdGFibGUgZW50cnkgY29udGFpbnMgYSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBmb3IgdGhlCisgICByZWFkX3N5bXRhYigpIGZ1bmN0aW9uIHRvIHVzZSB3aGVuIGV4cGFuZGluZyBhIHBhcnRpYWwgc3ltYm9sIHRhYmxlIGVudHJ5CisgICB0byBhIGZ1bGwgc3ltYm9sIHRhYmxlIGVudHJ5LgorCisgICBGb3IgZGJ4cmVhZCB0aGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgZmlsZSBzeW1ib2wgdGFibGUKKyAgIG9mIGZpcnN0IGxvY2FsIHN5bWJvbCBmb3IgdGhpcyBmaWxlLCBhbmQgY291bnQgb2YgdGhlIHNlY3Rpb24KKyAgIG9mIHRoZSBzeW1ib2wgdGFibGUgZGV2b3RlZCB0byB0aGlzIGZpbGUncyBzeW1ib2xzIChhY3R1YWxseSwgdGhlIHNlY3Rpb24KKyAgIGJyYWNrZXRlZCBtYXkgY29udGFpbiBtb3JlIHRoYW4ganVzdCB0aGlzIGZpbGUncyBzeW1ib2xzKS4gIEl0IGFsc28gY29udGFpbnMKKyAgIGZ1cnRoZXIgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGxvY2F0ZSB0aGUgc3ltYm9scyBpZiB0aGV5IGFyZSBpbiBhbiBFTEYgZmlsZS4KKworICAgSWYgbGRzeW1jbnQgaXMgMCwgdGhlIG9ubHkgcmVhc29uIGZvciB0aGlzIHRoaW5nJ3MgZXhpc3RlbmNlIGlzIHRoZQorICAgZGVwZW5kZW5jeSBsaXN0LiAgTm90aGluZyBlbHNlIHdpbGwgaGFwcGVuIHdoZW4gaXQgaXMgcmVhZCBpbi4gICovCisKKyNkZWZpbmUgTERTWU1PRkYocCkgKCgoc3RydWN0IHN5bWxvYyAqKSgocCktPnJlYWRfc3ltdGFiX3ByaXZhdGUpKS0+bGRzeW1vZmYpCisjZGVmaW5lIExEU1lNQ05UKHApICgoKHN0cnVjdCBzeW1sb2MgKikoKHApLT5yZWFkX3N5bXRhYl9wcml2YXRlKSktPmxkc3ltbnVtKQorCitzdHJ1Y3Qgc3ltbG9jIHsKKyAgaW50IGxkc3ltb2ZmOworICBpbnQgbGRzeW1udW07Cit9OworCisvKiBSZW1lbWJlciB3aGF0IHdlIGRlZHVjZWQgdG8gYmUgdGhlIHNvdXJjZSBsYW5ndWFnZSBvZiB0aGlzIHBzeW10YWIuICovCitzdGF0aWMgZW51bSBsYW5ndWFnZSBwc3ltdGFiX2xhbmd1YWdlID0gbGFuZ3VhZ2VfdW5rbm93bjsKKworLyoga2VlcCBwYXJ0aWFsIHN5bWJvbCB0YWJsZSBmaWxlIG5lc3RlZCBkZXB0aCAqLworc3RhdGljIGludCBwc3ltZmlsZV9kZXB0aCA9IDA7CisKKy8qIGtlZXAgc3ltYm9sIHRhYmxlIGZpbGUgbmVzdGVkIGRlcHRoICovCitzdGF0aWMgaW50IHN5bWZpbGVfZGVwdGggPSAwOworCisvKiBOb256ZXJvIG1lYW5zIGdpdmUgdmVyYm9zZSBpbmZvIG9uIGdkYiBhY3Rpb24uICBGcm9tIG1haW4uYy4gICovCitleHRlcm4gaW50IGluZm9fdmVyYm9zZTsKKworZXh0ZXJuIGludCBwcmV2aW91c19zdGFiX2NvZGU7CisKKy8qIE5hbWUgb2YgbGFzdCBmdW5jdGlvbiBlbmNvdW50ZXJlZC4gIFVzZWQgaW4gU29sYXJpcyB0byBhcHByb3hpbWF0ZQorICAgb2JqZWN0IGZpbGUgYm91bmRhcmllcy4gICovCitzdGF0aWMgY2hhciAqbGFzdF9mdW5jdGlvbl9uYW1lOworCisvKiBDb21wbGFpbnRzIGFib3V0IHRoZSBzeW1ib2xzIHdlIGhhdmUgZW5jb3VudGVyZWQuICAqLworZXh0ZXJuIHN0cnVjdCBjb21wbGFpbnQgbGJyYWNfY29tcGxhaW50OworCitleHRlcm4gc3RydWN0IGNvbXBsYWludCB1bmtub3duX3N5bXR5cGVfY29tcGxhaW50OworCitleHRlcm4gc3RydWN0IGNvbXBsYWludCB1bmtub3duX3N5bWNoYXJfY29tcGxhaW50OworCitleHRlcm4gc3RydWN0IGNvbXBsYWludCBsYnJhY19yYnJhY19jb21wbGFpbnQ7CisKK2V4dGVybiBzdHJ1Y3QgY29tcGxhaW50IHJlcGVhdGVkX2hlYWRlcl9jb21wbGFpbnQ7CisKK2V4dGVybiBzdHJ1Y3QgY29tcGxhaW50IHJlcGVhdGVkX2hlYWRlcl9uYW1lX2NvbXBsYWludDsKKworI2lmIDAKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGxicmFjX3VubWF0Y2hlZF9jb21wbGFpbnQgPQorICB7InVubWF0Y2hlZCBJbmNyZW1lbnQgQmxvY2sgRW50cnkgYmVmb3JlIHN5bXRhYiBwb3MgJWQiLCAwLCAwfTsKKworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgbGJyYWNfbWlzbWF0Y2hfY29tcGxhaW50ID0KKyAgeyJJQkUvSURFIHN5bWJvbCBtaXNtYXRjaCBhdCBzeW10YWIgcG9zICVkIiwgMCwgMH07CisjZW5kaWYKKwwKKy8qIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQKK3JlYWRfbWluaW1hbF9zeW1ib2xzIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKikpOworCitzdGF0aWMgdm9pZAorb3M5a19yZWFkX29maWxlX3N5bXRhYiBQQVJBTVMgKChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworCitzdGF0aWMgdm9pZAorb3M5a19wc3ltdGFiX3RvX3N5bXRhYiBQQVJBTVMgKChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworCitzdGF0aWMgdm9pZAorb3M5a19wc3ltdGFiX3RvX3N5bXRhYl8xIFBBUkFNUyAoKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSk7CisKK3N0YXRpYyB2b2lkCityZWFkX29zOWtfcHN5bXRhYiBQQVJBTVMgKChzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICosIHN0cnVjdCBvYmpmaWxlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgQ09SRV9BRERSLCBpbnQpKTsKKworc3RhdGljIGludAorZmlsbF9zeW0gUEFSQU1TICgoRklMRSAqLCBiZmQgKikpOworCitzdGF0aWMgdm9pZAorb3M5a19zeW1maWxlX2luaXQgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZAorb3M5a19uZXdfaW5pdCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCitvczlrX3N5bWZpbGVfcmVhZCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICosIGludCkpOworCitzdGF0aWMgdm9pZAorb3M5a19zeW1maWxlX2ZpbmlzaCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCitvczlrX3Byb2Nlc3Nfb25lX3N5bWJvbCBQQVJBTVMgKChpbnQsIGludCwgQ09SRV9BRERSLCBjaGFyICosIAorICAgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqCitvczlrX3N0YXJ0X3BzeW10YWIgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqLCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgIENPUkVfQUREUiwgaW50LCBpbnQsIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKgorb3M5a19lbmRfcHN5bXRhYiBQQVJBTVMgKChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKiwgY2hhciAqKiwgaW50LCBpbnQsIENPUkVfQUREUiwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCityZWNvcmRfbWluaW1hbF9zeW1ib2wgUEFSQU1TICgoY2hhciAqLCBDT1JFX0FERFIsIGludCwgc3RydWN0IG9iamZpbGUgKiwgCisJICAgICAgICAgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKikpOworDAorI2RlZmluZSBIQU5ETEVfUkJSQUModmFsKSBcCisgIGlmICgodmFsKSA+IHBzdC0+dGV4dGhpZ2gpIHBzdC0+dGV4dGhpZ2ggPSAodmFsKTsKKworI2RlZmluZSBTV0FQX1NUQkhEUihoZHJwLCBhYmZkKSBcCisgIHsgXAorICAgIChoZHJwKS0+Zm10bm8gPSBiZmRfZ2V0XzE2KGFiZmQsICh1bnNpZ25lZCBjaGFyICopJihoZHJwKS0+Zm10bm8pOyBcCisgICAgKGhkcnApLT5jcmMgPSBiZmRfZ2V0XzMyKGFiZmQsICh1bnNpZ25lZCBjaGFyICopJihoZHJwKS0+Y3JjKTsgXAorICAgIChoZHJwKS0+b2Zmc2V0ID0gYmZkX2dldF8zMihhYmZkLCAodW5zaWduZWQgY2hhciAqKSYoaGRycCktPm9mZnNldCk7IFwKKyAgICAoaGRycCktPm5zeW0gPSBiZmRfZ2V0XzMyKGFiZmQsICh1bnNpZ25lZCBjaGFyICopJihoZHJwKS0+bnN5bSk7IFwKKyAgfQorI2RlZmluZSBTV0FQX1NUQlNZTShzeW1wLCBhYmZkKSBcCisgIHsgXAorICAgIChzeW1wKS0+dmFsdWUgPSBiZmRfZ2V0XzMyKGFiZmQsICh1bnNpZ25lZCBjaGFyICopJihzeW1wKS0+dmFsdWUpOyBcCisgICAgKHN5bXApLT50eXBlID0gYmZkX2dldF8xNihhYmZkLCAodW5zaWduZWQgY2hhciAqKSYoc3ltcCktPnR5cGUpOyBcCisgICAgKHN5bXApLT5zdHJvZmYgPSBiZmRfZ2V0XzMyKGFiZmQsICh1bnNpZ25lZCBjaGFyICopJihzeW1wKS0+c3Ryb2ZmKTsgXAorICB9CisjZGVmaW5lIE5fREFUQSAwCisjZGVmaW5lIE5fQlNTIDEKKyNkZWZpbmUgTl9SREFUQSAyCisjZGVmaW5lIE5fSURBVEEgMworI2RlZmluZSBOX1RFWFQgNAorI2RlZmluZSBOX0FCUyA2CisKK3N0YXRpYyB2b2lkCityZWNvcmRfbWluaW1hbF9zeW1ib2wgKG5hbWUsIGFkZHJlc3MsIHR5cGUsIG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cykKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgQ09SRV9BRERSIGFkZHJlc3M7CisgICAgIGludCB0eXBlOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworeworICBlbnVtIG1pbmltYWxfc3ltYm9sX3R5cGUgbXNfdHlwZTsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgTl9URVhUOgorCSAgbXNfdHlwZSA9IG1zdF90ZXh0OworCSAgYWRkcmVzcyArPSBBTk9GRlNFVChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOworCSAgYnJlYWs7CisgICAgY2FzZSBOX0RBVEE6CisJICBtc190eXBlID0gbXN0X2RhdGE7CisJICBicmVhazsKKyAgICBjYXNlIE5fQlNTOgorICAgICAgICAgIG1zX3R5cGUgPSBtc3RfYnNzOworCSAgYnJlYWs7CisgICAgY2FzZSBOX1JEQVRBOgorCSAgbXNfdHlwZSA9IG1zdF9ic3M7CisJICBicmVhazsKKyAgICBjYXNlIE5fSURBVEE6CQorCSAgbXNfdHlwZSA9IG1zdF9kYXRhOworCSAgYnJlYWs7CisgICAgY2FzZSBOX0FCUzoKKwkgIG1zX3R5cGUgPSBtc3RfYWJzOworCSAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgICBtc190eXBlID0gbXN0X3Vua25vd247IGJyZWFrOworICB9CisKKyAgcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2wgKG5hbWUsIGFkZHJlc3MsIG1zX3R5cGUsIG9iamZpbGUpOworfQorCisvKiByZWFkIGFuZCBwcm9jZXNzIC5zdGIgZmlsZSBhbmQgc3RvcmUgaW4gbWluaW1hbCBzeW1ib2wgdGFibGUgKi8KK3R5cGVkZWYgY2hhciBtaGhkcls4MF07CitzdHJ1Y3Qgc3RiaGRyIHsKKwltaGhkciBjb21oZHI7CisJY2hhciAqIG5hbWU7CisJc2hvcnQgZm10bm87CisJaW50IGNyYzsKKwlpbnQgb2Zmc2V0OworCWludCBuc3ltOworCWNoYXIgKnBhZDsKK307CitzdHJ1Y3Qgc3Ric3ltYm9sIHsKKwlpbnQgdmFsdWU7CisJc2hvcnQgdHlwZTsKKwlpbnQgc3Ryb2ZmOworfTsKKyNkZWZpbmUgU1RCU1lNU0laRSAxMAorCitzdGF0aWMgdm9pZAorcmVhZF9taW5pbWFsX3N5bWJvbHMob2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworeworRklMRSAqZnA7CitiZmQgKmFiZmQ7CitzdHJ1Y3Qgc3RiaGRyIGhkcjsKK3N0cnVjdCBzdGJzeW1ib2wgc3ltOworaW50IGNoLCBpLCBqLCBvZmY7CitjaGFyIGJ1Zls2NF0sIGJ1ZjFbMTI4XTsKKwkJCisgIGZwID0gb2JqZmlsZS0+YXV4ZjE7CisgIGlmIChmcCA9PSBOVUxMKSByZXR1cm47CisgIGFiZmQgPSBvYmpmaWxlLT5vYmZkOworICBmcmVhZCgmaGRyLmNvbWhkclswXSwgc2l6ZW9mKG1oaGRyKSwgMSwgZnApOworICBpID0gMDsKKyAgY2ggPSBnZXRjKGZwKTsKKyAgd2hpbGUgKGNoICE9IC0xKSB7CisgICAgYnVmW2ldID0gKGNoYXIpY2g7CisgICAgaSsrOworICAgIGlmIChjaCA9PSAwKSBicmVhazsKKyAgICBjaCA9IGdldGMoZnApOworICB9OworICBpZiAoaSUyKSBjaD1nZXRjKGZwKTsKKyAgaGRyLm5hbWUgPSAmYnVmWzBdOworCisgIGZyZWFkKCZoZHIuZm10bm8sIHNpemVvZihoZHIuZm10bm8pLCAxLCBmcCk7CisgIGZyZWFkKCZoZHIuY3JjLCBzaXplb2YoaGRyLmNyYyksIDEsIGZwKTsKKyAgZnJlYWQoJmhkci5vZmZzZXQsIHNpemVvZihoZHIub2Zmc2V0KSwgMSwgZnApOworICBmcmVhZCgmaGRyLm5zeW0sIHNpemVvZihoZHIubnN5bSksIDEsIGZwKTsKKyAgU1dBUF9TVEJIRFIoJmhkciwgYWJmZCk7ICAgICAgCisJCisgIC8qIHJlYWQgc3ltYm9scyAqLworICBpbml0X21pbmltYWxfc3ltYm9sX2NvbGxlY3Rpb24oKTsKKyAgb2ZmID0gaGRyLm9mZnNldDsKKyAgZm9yIChpID0gaGRyLm5zeW07IGkgPiAwOyBpLS0pIHsKKyAgICBmc2VlayhmcCwgKGxvbmcpb2ZmLCAwKTsKKyAgICBmcmVhZCgmc3ltLnZhbHVlLCBzaXplb2Yoc3ltLnZhbHVlKSwgMSwgZnApOworICAgIGZyZWFkKCZzeW0udHlwZSwgc2l6ZW9mKHN5bS50eXBlKSwgMSwgZnApOworICAgIGZyZWFkKCZzeW0uc3Ryb2ZmLCBzaXplb2Yoc3ltLnN0cm9mZiksIDEsIGZwKTsKKyAgICBTV0FQX1NUQlNZTSAoJnN5bSwgYWJmZCk7CisgICAgZnNlZWsoZnAsIChsb25nKXN5bS5zdHJvZmYsIDApOworICAgIGogPSAwOworICAgIGNoID0gZ2V0YyhmcCk7CisgICAgd2hpbGUgKGNoICE9IC0xKSB7CisJYnVmMVtqXSA9IChjaGFyKWNoOworCWorKzsKKwlpZiAoY2ggPT0gMCkgYnJlYWs7CisJY2ggPSBnZXRjKGZwKTsKKyAgICB9OworICAgIHJlY29yZF9taW5pbWFsX3N5bWJvbChidWYxLCBzeW0udmFsdWUsIHN5bS50eXBlJjcsIG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cyk7CisgICAgb2ZmICs9IFNUQlNZTVNJWkU7CisgIH07CisgIGluc3RhbGxfbWluaW1hbF9zeW1ib2xzIChvYmpmaWxlKTsKKyAgcmV0dXJuOworfQorDAorLyogU2NhbiBhbmQgYnVpbGQgcGFydGlhbCBzeW1ib2xzIGZvciBhIHN5bWJvbCBmaWxlLgorICAgV2UgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJ5IGEgY2FsbCB0byBvczlrX3N5bWZpbGVfaW5pdCwgd2hpY2ggCisgICBwdXQgYWxsIHRoZSByZWxldmFudCBpbmZvIGludG8gYSAic3RydWN0IG9zOWtfc3ltZmlsZV9pbmZvIiwKKyAgIGh1bmcgb2ZmIHRoZSBvYmpmaWxlIHN0cnVjdHVyZS4KKworICAgU0VDVElPTl9PRkZTRVRTIGNvbnRhaW5zIG9mZnNldHMgcmVsYXRpdmUgdG8gd2hpY2ggdGhlIHN5bWJvbHMgaW4gdGhlCisgICB2YXJpb3VzIHNlY3Rpb25zIGFyZSAoZGVwZW5kaW5nIHdoZXJlIHRoZSBzZWN0aW9ucyB3ZXJlIGFjdHVhbGx5IGxvYWRlZCkuCisgICBNQUlOTElORSBpcyB0cnVlIGlmIHdlIGFyZSByZWFkaW5nIHRoZSBtYWluIHN5bWJvbAorICAgdGFibGUgKGFzIG9wcG9zZWQgdG8gYSBzaGFyZWQgbGliIG9yIGR5bmFtaWNhbGx5IGxvYWRlZCBmaWxlKS4gICovCisKK3N0YXRpYyB2b2lkCitvczlrX3N5bWZpbGVfcmVhZCAob2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzLCBtYWlubGluZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKyAgICAgaW50IG1haW5saW5lOwkvKiBGSVhNRSBjb21tZW50cyBhYm92ZSAqLworeworICBiZmQgKnN5bV9iZmQ7CisgIHN0cnVjdCBjbGVhbnVwICpiYWNrX3RvOworCisgIHN5bV9iZmQgPSBvYmpmaWxlLT5vYmZkOworICAvKiBJZiB3ZSBhcmUgcmVpbml0aWFsaXppbmcsIG9yIGlmIHdlIGhhdmUgbmV2ZXIgbG9hZGVkIHN5bXMgeWV0LCBpbml0ICovCisgIGlmIChtYWlubGluZSB8fCBvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMuc2l6ZSA9PSAwIHx8IAorICAgIG9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5zaXplID09IDApCisgICAgaW5pdF9wc3ltYm9sX2xpc3QgKG9iamZpbGUsIERCWF9TWU1DT1VOVCAob2JqZmlsZSkpOworCisgIGZyZWVfcGVuZGluZ19ibG9ja3MgKCk7CisgIGJhY2tfdG8gPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgcmVhbGx5X2ZyZWVfcGVuZGluZ3MsIDApOworCisgIG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBkaXNjYXJkX21pbmltYWxfc3ltYm9scywgMCk7CisgIHJlYWRfbWluaW1hbF9zeW1ib2xzIChvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMpOworCisgIC8qIE5vdyB0aGF0IHRoZSBzeW1ib2wgdGFibGUgZGF0YSBvZiB0aGUgZXhlY3V0YWJsZSBmaWxlIGFyZSBhbGwgaW4gY29yZSwKKyAgICAgcHJvY2VzcyB0aGVtIGFuZCBkZWZpbmUgc3ltYm9scyBhY2NvcmRpbmdseS4gICovCisgIHJlYWRfb3M5a19wc3ltdGFiIChzZWN0aW9uX29mZnNldHMsIG9iamZpbGUsCisJCSAgICAgREJYX1RFWFRfQUREUiAob2JqZmlsZSksCisJCSAgICAgREJYX1RFWFRfU0laRSAob2JqZmlsZSkpOworCisgIGRvX2NsZWFudXBzIChiYWNrX3RvKTsKK30KKworLyogSW5pdGlhbGl6ZSBhbnl0aGluZyB0aGF0IG5lZWRzIGluaXRpYWxpemluZyB3aGVuIGEgY29tcGxldGVseSBuZXcKKyAgIHN5bWJvbCBmaWxlIGlzIHNwZWNpZmllZCAobm90IGp1c3QgYWRkaW5nIHNvbWUgc3ltYm9scyBmcm9tIGFub3RoZXIKKyAgIGZpbGUsIGUuZy4gYSBzaGFyZWQgbGlicmFyeSkuICAqLworCitzdGF0aWMgdm9pZAorb3M5a19uZXdfaW5pdCAoaWdub3JlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqaWdub3JlOworeworICBzdGFic3JlYWRfbmV3X2luaXQgKCk7CisgIGJ1aWxkc3ltX25ld19pbml0ICgpOworICBwc3ltZmlsZV9kZXB0aCA9IDA7CisvKgorICBpbml0X2hlYWRlcl9maWxlcyAoKTsKKyovCit9CisKKy8qIG9zOWtfc3ltZmlsZV9pbml0ICgpCisgICBJdCBpcyBwYXNzZWQgYSBzdHJ1Y3Qgb2JqZmlsZSB3aGljaCBjb250YWlucywgYW1vbmcgb3RoZXIgdGhpbmdzLAorICAgdGhlIEJGRCBmb3IgdGhlIGZpbGUgd2hvc2Ugc3ltYm9scyBhcmUgYmVpbmcgcmVhZCwgYW5kIGEgc2xvdCBmb3IgYSBwb2ludGVyCisgICB0byAicHJpdmF0ZSBkYXRhIiB3aGljaCB3ZSBmaWxsIHdpdGggZ29vZGllcy4KKworICAgU2luY2UgQkZEIGRvZXNuJ3Qga25vdyBob3cgdG8gcmVhZCBkZWJ1ZyBzeW1ib2xzIGluIGEgZm9ybWF0LWluZGVwZW5kZW50CisgICB3YXkgKGFuZCBtYXkgbmV2ZXIgZG8gc28uLi4pLCB3ZSBoYXZlIHRvIGRvIGl0IG91cnNlbHZlcy4gIFdlIHdpbGwgbmV2ZXIKKyAgIGJlIGNhbGxlZCB1bmxlc3MgdGhpcyBpcyBhbiBhLm91dCAob3IgdmVyeSBzaW1pbGFyKSBmaWxlLiAKKyAgIEZJWE1FLCB0aGVyZSBzaG91bGQgYmUgYSBjbGVhbmVyIHBlZXBob2xlIGludG8gdGhlIEJGRCBlbnZpcm9ubWVudCBoZXJlLiAgKi8KKworc3RhdGljIHZvaWQKK29zOWtfc3ltZmlsZV9pbml0IChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgYmZkICpzeW1fYmZkID0gb2JqZmlsZS0+b2JmZDsKKyAgY2hhciAqbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKHN5bV9iZmQpOworICBjaGFyIGRiZ25hbWVbNTEyXSwgc3RibmFtZVs1MTJdOworICBGSUxFICpzeW1maWxlID0gMDsKKyAgRklMRSAqbWluZmlsZSA9IDA7CisgIGFzZWN0aW9uICp0ZXh0X3NlY3Q7CisKKyAgc3RyY3B5KGRiZ25hbWUsIG5hbWUpOworICBzdHJjYXQoZGJnbmFtZSwgIi5kYmciKTsKKyAgc3RyY3B5KHN0Ym5hbWUsIG5hbWUpOworICBzdHJjYXQoc3RibmFtZSwgIi5zdGIiKTsKKworICBpZiAoKHN5bWZpbGUgPSBmb3BlbihkYmduYW1lLCAiciIpKSA9PSBOVUxMKSB7CisgICAgd2FybmluZygiU3ltYm9sIGZpbGUgJXMgbm90IGZvdW5kIiwgZGJnbmFtZSk7CisgIH0KKyAgb2JqZmlsZS0+YXV4ZjIgPSBzeW1maWxlOworCisgIGlmICgobWluZmlsZSA9IGZvcGVuKHN0Ym5hbWUsICJyIikpID09IE5VTEwpIHsKKyAgICB3YXJuaW5nKCJTeW1ib2wgZmlsZSAlcyBub3QgZm91bmQiLCBzdGJuYW1lKTsKKyAgfQorICBvYmpmaWxlLT5hdXhmMSA9IG1pbmZpbGU7CisKKyAgLyogQWxsb2NhdGUgc3RydWN0IHRvIGtlZXAgdHJhY2sgb2YgdGhlIHN5bWZpbGUgKi8KKyAgb2JqZmlsZS0+c3ltX3N0YWJfaW5mbyA9IChzdHJ1Y3QgZGJ4X3N5bWZpbGVfaW5mbyAqKQorICAgIHhtbWFsbG9jIChvYmpmaWxlIC0+IG1kLCBzaXplb2YgKHN0cnVjdCBkYnhfc3ltZmlsZV9pbmZvKSk7CisgIERCWF9TWU1GSUxFX0lORk8gKG9iamZpbGUpLT5zdGFiX3NlY3Rpb25faW5mbyA9IE5VTEw7CisKKyAgdGV4dF9zZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN5bV9iZmQsICIudGV4dCIpOworICBpZiAoIXRleHRfc2VjdCkKKyAgICBlcnJvciAoIkNhbid0IGZpbmQgLnRleHQgc2VjdGlvbiBpbiBmaWxlIik7CisgIERCWF9URVhUX0FERFIgKG9iamZpbGUpID0gYmZkX3NlY3Rpb25fdm1hIChzeW1fYmZkLCB0ZXh0X3NlY3QpOworICBEQlhfVEVYVF9TSVpFIChvYmpmaWxlKSA9IGJmZF9zZWN0aW9uX3NpemUgKHN5bV9iZmQsIHRleHRfc2VjdCk7CisKKyAgREJYX1NZTUJPTF9TSVpFIChvYmpmaWxlKSA9IDA7ICAgICAvKiB2YXJpYWJsZSBzaXplIHN5bWJvbCAqLworICBEQlhfU1lNQ09VTlQgKG9iamZpbGUpID0gIDA7ICAvKiB1c2VkIHRvIGJlIGJmZF9nZXRfc3ltY291bnQoc3ltX2JmZCkgKi8KKyAgREJYX1NZTVRBQl9PRkZTRVQgKG9iamZpbGUpID0gMDsgIC8qIHVzZWQgdG8gYmUgU1lNQk9MX1RBQkxFX09GRlNFVCAqLworfQorCisvKiBQZXJmb3JtIGFueSBsb2NhbCBjbGVhbnVwcyByZXF1aXJlZCB3aGVuIHdlIGFyZSBkb25lIHdpdGggYSBwYXJ0aWN1bGFyCisgICBvYmpmaWxlLiAgSS5FLCB3ZSBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgZGlzY2FyZGluZyBhbGwgc3ltYm9sIGluZm9ybWF0aW9uCisgICBmb3IgYW4gb2JqZmlsZSwgZnJlZWluZyB1cCBhbGwgbWVtb3J5IGhlbGQgZm9yIGl0LCBhbmQgdW5saW5raW5nIHRoZQorICAgb2JqZmlsZSBzdHJ1Y3QgZnJvbSB0aGUgZ2xvYmFsIGxpc3Qgb2Yga25vd24gb2JqZmlsZXMuICovCisKK3N0YXRpYyB2b2lkCitvczlrX3N5bWZpbGVfZmluaXNoIChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaWYgKG9iamZpbGUtPnN5bV9zdGFiX2luZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICBtZnJlZSAob2JqZmlsZSAtPiBtZCwgb2JqZmlsZS0+c3ltX3N0YWJfaW5mbyk7CisgICAgfQorLyoKKyAgZnJlZV9oZWFkZXJfZmlsZXMgKCk7CisqLworfQorCisMCitzdHJ1Y3Qgc3RfZGJnaGRyIHsKKyAgaW50IHN5bmM7CisgIHNob3J0IHJldjsKKyAgaW50IGNyYzsKKyAgc2hvcnQgb3M7CisgIHNob3J0IGNwdTsKK307CisjZGVmaW5lIFNZTkMgCQkoaW50KTB4ZWZiZWZlY2EKKworI2RlZmluZSBTV0FQX0RCR0hEUihoZHJwLCBhYmZkKSBcCisgIHsgXAorICAgIChoZHJwKS0+c3luYyA9IGJmZF9nZXRfMzIoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikmKGhkcnApLT5zeW5jKTsgXAorICAgIChoZHJwKS0+cmV2ID0gYmZkX2dldF8xNihhYmZkLCAodW5zaWduZWQgY2hhciAqKSYoaGRycCktPnJldik7IFwKKyAgICAoaGRycCktPmNyYyA9IGJmZF9nZXRfMzIoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikmKGhkcnApLT5jcmMpOyBcCisgICAgKGhkcnApLT5vcyA9IGJmZF9nZXRfMTYoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikmKGhkcnApLT5vcyk7IFwKKyAgICAoaGRycCktPmNwdSA9IGJmZF9nZXRfMTYoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikmKGhkcnApLT5jcHUpOyBcCisgIH0KKworI2RlZmluZSBOX1NZTV9DTVBMUiAgICAgMAorI2RlZmluZSBOX1NZTV9TTElORSAgICAgMQorI2RlZmluZSBOX1NZTV9TWU0gICAgICAgMgorI2RlZmluZSBOX1NZTV9MQlJBQyAgICAgMworI2RlZmluZSBOX1NZTV9SQlJBQyAgICAgNAorI2RlZmluZSBOX1NZTV9TRSAgICAgICAgNQorCitzdHJ1Y3QgaW50ZXJuYWxfc3ltc3RydWN0IHsKKyAgc2hvcnQgbl90eXBlOworICBzaG9ydCBuX2Rlc2M7CisgIGxvbmcgbl92YWx1ZTsKKyAgY2hhciAqIG5fc3RyeDsKK307CitzdGF0aWMgc3RydWN0IGludGVybmFsX3N5bXN0cnVjdCBzeW1ib2w7CitzdGF0aWMgc3RydWN0IGludGVybmFsX3N5bXN0cnVjdCAqc3ltYnVmID0gJnN5bWJvbDsKK3N0YXRpYyBjaGFyIHN0cmJ1Zls0MDk2XTsKK3N0YXRpYyBzdHJ1Y3Qgc3RfZGJnaGRyIGRiZ2hkcjsKK3N0YXRpYyBzaG9ydCBjbXBscmlkOworCisjZGVmaW5lIFZFUl9QUkVfVUxUUkFDCSgoc2hvcnQpNCkKKyNkZWZpbmUgVkVSX1VMVFJBQwkoKHNob3J0KTUpCisKK3N0YXRpYyBpbnQKK2ZpbGxfc3ltIChkYmdfZmlsZSwgYWJmZCkKKyAgICAgRklMRSAqZGJnX2ZpbGU7CisgICAgIGJmZCAqYWJmZDsKK3sKK3Nob3J0IHNpLCBubWFzazsKK2xvbmcgbGk7CitpbnQgaWk7CitjaGFyICpwOworCisgIGludCBuYnl0ZXMgPSBmcmVhZCgmc2ksIHNpemVvZihzaSksIDEsIGRiZ19maWxlKTsKKyAgaWYgKG5ieXRlcyA9PSAwKQorICAgIHJldHVybiAwOworICBpZiAobmJ5dGVzIDwgMCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgicmVhZGluZyAuZGJnIGZpbGUuIik7CisgIHN5bWJ1Zi0+bl9kZXNjID0gMDsKKyAgc3ltYnVmLT5uX3ZhbHVlID0gMDsKKyAgc3ltYnVmLT5uX3N0cnggPSBOVUxMOworICBzeW1idWYtPm5fdHlwZSA9IGJmZF9nZXRfMTYgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopJnNpKTsKKyAgc3ltYnVmLT5uX3R5cGUgPSAweGYgJiBzeW1idWYtPm5fdHlwZTsKKyAgc3dpdGNoIChzeW1idWYtPm5fdHlwZSkKKyAgICB7CisgICAgY2FzZSBOX1NZTV9DTVBMUjoKKyAgICAgIGZyZWFkKCZzaSwgc2l6ZW9mKHNpKSwgMSwgZGJnX2ZpbGUpOworICAgICAgc3ltYnVmLT5uX2Rlc2MgPSBiZmRfZ2V0XzE2KGFiZmQsICh1bnNpZ25lZCBjaGFyICopJnNpKTsKKyAgICAgIGNtcGxyaWQgPSBzeW1idWYtPm5fZGVzYyAmIDB4ZmY7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5fU1lNX1NMSU5FOgorICAgICAgZnJlYWQoJmxpLCBzaXplb2YobGkpLCAxLCBkYmdfZmlsZSk7CisgICAgICBzeW1idWYtPm5fdmFsdWUgPSBiZmRfZ2V0XzMyKGFiZmQsICh1bnNpZ25lZCBjaGFyICopJmxpKTsKKyAgICAgIGZyZWFkKCZsaSwgc2l6ZW9mKGxpKSwgMSwgZGJnX2ZpbGUpOworICAgICAgbGkgPSBiZmRfZ2V0XzMyKGFiZmQsICh1bnNpZ25lZCBjaGFyICopJmxpKTsKKyAgICAgIHN5bWJ1Zi0+bl9zdHJ4ID0gKGNoYXIgKikobGkgPj4gMTIpOworICAgICAgc3ltYnVmLT5uX2Rlc2MgPSBsaSAmIDB4ZmZmOworICAgICAgYnJlYWs7CisgICAgY2FzZSBOX1NZTV9TWU06CisgICAgICBmcmVhZCgmbGksIHNpemVvZihsaSksIDEsIGRiZ19maWxlKTsKKyAgICAgIHN5bWJ1Zi0+bl92YWx1ZSA9IGJmZF9nZXRfMzIoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikmbGkpOworICAgICAgc2kgPSAwOworICAgICAgZG8geworCWlpID0gZ2V0YyhkYmdfZmlsZSk7CisJc3RyYnVmW3NpKytdID0gKGNoYXIpIGlpOworICAgICAgfSB3aGlsZSAoaWkgIT0gMCB8fCBzaSAlIDIgIT0gMCk7CisgICAgICBzeW1idWYtPm5fc3RyeCA9IHN0cmJ1ZjsKKyAgICAgIHAgPSAoY2hhciAqKSBzdHJjaHIgKHN0cmJ1ZiwgJzonKTsKKyAgICAgIGlmICghcCkgYnJlYWs7CisgICAgICBpZiAoKHBbMV0gPT0gJ0YnIHx8IHBbMV0gPT0gJ2YnKSAmJiBjbXBscmlkID09IFZFUl9QUkVfVUxUUkFDKQorCXsKKwkgIGZyZWFkKCZzaSwgc2l6ZW9mKHNpKSwgMSwgZGJnX2ZpbGUpOworCSAgbm1hc2sgPSBiZmRfZ2V0XzE2KGFiZmQsICh1bnNpZ25lZCBjaGFyICopJnNpKTsKKwkgIGZvciAoaWk9MDsgaWk8bm1hc2s7IGlpKyspCisJICAgIGZyZWFkKCZzaSwgc2l6ZW9mKHNpKSwgMSwgZGJnX2ZpbGUpOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgTl9TWU1fTEJSQUM6CisgICAgICBmcmVhZCgmbGksIHNpemVvZihsaSksIDEsIGRiZ19maWxlKTsKKyAgICAgIHN5bWJ1Zi0+bl92YWx1ZSA9IGJmZF9nZXRfMzIoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikmbGkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBOX1NZTV9SQlJBQzoKKyAgICAgIGZyZWFkKCZsaSwgc2l6ZW9mKGxpKSwgMSwgZGJnX2ZpbGUpOworICAgICAgc3ltYnVmLT5uX3ZhbHVlID0gYmZkX2dldF8zMihhYmZkLCAodW5zaWduZWQgY2hhciAqKSZsaSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5fU1lNX1NFOgorICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAxOworfQorDAorLyogR2l2ZW4gcG9pbnRlcnMgdG8gYW4gYS5vdXQgc3ltYm9sIHRhYmxlIGluIGNvcmUgY29udGFpbmluZyBkYngKKyAgIHN0eWxlIGRhdGEsIHNldHVwIHBhcnRpYWxfc3ltdGFiJ3MgZGVzY3JpYmluZyBlYWNoIHNvdXJjZSBmaWxlIGZvcgorICAgd2hpY2ggZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KKyAgIFNZTUZJTEVfTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB3ZSBhcmUgcmVhZGluZyBmcm9tCisgICBhbmQgU0VDVElPTl9PRkZTRVRTIGlzIHRoZSBzZXQgb2Ygb2Zmc2V0cyBmb3IgdGhlIHZhcmlvdXMgc2VjdGlvbnMKKyAgIG9mIHRoZSBmaWxlIChhIHNldCBvZiB6ZXJvcyBpZiB0aGUgbWFpbmxpbmUgcHJvZ3JhbSkuICAqLworCitzdGF0aWMgdm9pZAorcmVhZF9vczlrX3BzeW10YWIgKHNlY3Rpb25fb2Zmc2V0cywgb2JqZmlsZSwgdGV4dF9hZGRyLCB0ZXh0X3NpemUpCisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIENPUkVfQUREUiB0ZXh0X2FkZHI7CisgICAgIGludCB0ZXh0X3NpemU7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBpbnRlcm5hbF9zeW1zdHJ1Y3QgKmJ1ZnAgPSAwOwkvKiA9MCBhdm9pZHMgZ2NjIC1XYWxsIGdsaXRjaCovCisgIHJlZ2lzdGVyIGNoYXIgKm5hbWVzdHJpbmc7CisgIGludCBwYXN0X2ZpcnN0X3NvdXJjZV9maWxlID0gMDsKKyAgQ09SRV9BRERSIGxhc3Rfb19maWxlX3N0YXJ0ID0gMDsKKyNpZiAwCisgIHN0cnVjdCBjbGVhbnVwICpiYWNrX3RvOworI2VuZGlmCisgIGJmZCAqYWJmZDsKKyAgRklMRSAqZnA7CisKKyAgLyogRW5kIG9mIHRoZSB0ZXh0IHNlZ21lbnQgb2YgdGhlIGV4ZWN1dGFibGUgZmlsZS4gICovCisgIHN0YXRpYyBDT1JFX0FERFIgZW5kX29mX3RleHRfYWRkcjsKKworICAvKiBDdXJyZW50IHBhcnRpYWwgc3ltdGFiICovCisgIHN0YXRpYyBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdCA9IDA7CisKKyAgLyogTGlzdCBvZiBjdXJyZW50IHBzeW10YWIncyBpbmNsdWRlIGZpbGVzICovCisgIGNoYXIgKipwc3ltdGFiX2luY2x1ZGVfbGlzdDsKKyAgaW50IGluY2x1ZGVzX2FsbG9jYXRlZDsKKyAgaW50IGluY2x1ZGVzX3VzZWQ7CisKKyAgLyogSW5kZXggd2l0aGluIGN1cnJlbnQgcHN5bXRhYiBkZXBlbmRlbmN5IGxpc3QgKi8KKyAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICoqZGVwZW5kZW5jeV9saXN0OworICBpbnQgZGVwZW5kZW5jaWVzX3VzZWQsIGRlcGVuZGVuY2llc19hbGxvY2F0ZWQ7CisKKyAgaW5jbHVkZXNfYWxsb2NhdGVkID0gMzA7CisgIGluY2x1ZGVzX3VzZWQgPSAwOworICBwc3ltdGFiX2luY2x1ZGVfbGlzdCA9IChjaGFyICoqKSBhbGxvY2EgKGluY2x1ZGVzX2FsbG9jYXRlZCAqCisJCQkJCSAgIHNpemVvZiAoY2hhciAqKSk7CisKKyAgZGVwZW5kZW5jaWVzX2FsbG9jYXRlZCA9IDMwOworICBkZXBlbmRlbmNpZXNfdXNlZCA9IDA7CisgIGRlcGVuZGVuY3lfbGlzdCA9CisgICAgKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKikgYWxsb2NhIChkZXBlbmRlbmNpZXNfYWxsb2NhdGVkICoKKwkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworCisgIGxhc3Rfc291cmNlX2ZpbGUgPSBOVUxMOworCisjaWZkZWYgRU5EX09GX1RFWFRfREVGQVVMVAorICBlbmRfb2ZfdGV4dF9hZGRyID0gRU5EX09GX1RFWFRfREVGQVVMVDsKKyNlbHNlCisgIGVuZF9vZl90ZXh0X2FkZHIgPSB0ZXh0X2FkZHIgKyBzZWN0aW9uX29mZnNldHMtPm9mZnNldHNbU0VDVF9PRkZfVEVYVF0KKwkJCSAgICAgICArIHRleHRfc2l6ZTsJLyogUmVsb2NhdGUgKi8KKyNlbmRpZgorCisgIGFiZmQgPSBvYmpmaWxlLT5vYmZkOworICBmcCA9IG9iamZpbGUtPmF1eGYyOyAKKyAgaWYgKCFmcCkgcmV0dXJuOworCQkKKyAgZnJlYWQoJmRiZ2hkci5zeW5jLCBzaXplb2YoZGJnaGRyLnN5bmMpLCAxLCBmcCk7CisgIGZyZWFkKCZkYmdoZHIucmV2LCBzaXplb2YoZGJnaGRyLnJldiksIDEsIGZwKTsKKyAgZnJlYWQoJmRiZ2hkci5jcmMsIHNpemVvZihkYmdoZHIuY3JjKSwgMSwgZnApOworICBmcmVhZCgmZGJnaGRyLm9zLCBzaXplb2YoZGJnaGRyLm9zKSwgMSwgZnApOworICBmcmVhZCgmZGJnaGRyLmNwdSwgc2l6ZW9mKGRiZ2hkci5jcHUpLCAxLCBmcCk7CisgIFNXQVBfREJHSERSKCZkYmdoZHIsIGFiZmQpOyAgICAgIAorCisgIHN5bW51bSA9IDA7CisgIHdoaWxlKDEpCisgICAgeworICAgIGludCByZXQ7CisgICAgbG9uZyBjdXJzeW1vZmZzZXQ7CisKKyAgICAgIC8qIEdldCB0aGUgc3ltYm9sIGZvciB0aGlzIHJ1biBhbmQgcHVsbCBvdXQgc29tZSBpbmZvICovCisgICAgICBRVUlUOwkvKiBhbGxvdyB0aGlzIHRvIGJlIGludGVycnVwdGFibGUgKi8KKyAgICAgIGN1cnN5bW9mZnNldCA9IGZ0ZWxsKG9iamZpbGUtPmF1eGYyKTsKKyAgICAgIHJldCA9IGZpbGxfc3ltKG9iamZpbGUtPmF1eGYyLCBhYmZkKTsKKyAgICAgIGlmIChyZXQgPD0gMCkgYnJlYWs7CisgICAgICBlbHNlIHN5bW51bSsrOworICAgICAgYnVmcCA9IHN5bWJ1ZjsKKworICAgICAgLyogU3BlY2lhbCBjYXNlIHRvIHNwZWVkIHVwIHJlYWRpbi4gKi8KKyAgICAgIGlmIChidWZwLT5uX3R5cGUgPT0gKHNob3J0KU5fU1lNX1NMSU5FKSBjb250aW51ZTsKKworI2RlZmluZSBDVVJfU1lNQk9MX1ZBTFVFIGJ1ZnAtPm5fdmFsdWUKKyAgICAgIC8qIHBhcnRpYWwtc3RhYi5oICovCisKKyAgICAgIHN3aXRjaCAoYnVmcC0+bl90eXBlKQorCXsKKwljaGFyICpwOworCisJY2FzZSBOX1NZTV9DTVBMUjoKKwkgIGNvbnRpbnVlOworCisJY2FzZSBOX1NZTV9TRToKKyAgICAgICAgICBDVVJfU1lNQk9MX1ZBTFVFICs9IEFOT0ZGU0VUKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCk7CisJICBpZiAocHN5bWZpbGVfZGVwdGggPT0gMSAmJiBwc3QpCisJICAgIHsKKwkgICAgICBvczlrX2VuZF9wc3ltdGFiIChwc3QsIHBzeW10YWJfaW5jbHVkZV9saXN0LCBpbmNsdWRlc191c2VkLAorCQkgICAgICAgc3ltbnVtLCBDVVJfU1lNQk9MX1ZBTFVFLAorCQkgICAgICAgZGVwZW5kZW5jeV9saXN0LCBkZXBlbmRlbmNpZXNfdXNlZCk7CisJICAgICAgcHN0ID0gKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSAwOworCSAgICAgIGluY2x1ZGVzX3VzZWQgPSAwOworCSAgICAgIGRlcGVuZGVuY2llc191c2VkID0gMDsKKwkgICAgfQorICAJICBwc3ltZmlsZV9kZXB0aC0tOworCSAgY29udGludWU7CisKKwljYXNlIE5fU1lNX1NZTToJCS8qIFR5cGVkZWYgb3IgYXV0b21hdGljIHZhcmlhYmxlLiAqLworCSAgbmFtZXN0cmluZyA9IGJ1ZnAtPm5fc3RyeDsKKyAgICAgICAgICBwID0gKGNoYXIgKikgc3RyY2hyIChuYW1lc3RyaW5nLCAnOicpOworICAgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgLyogTm90IGEgZGVidWdnaW5nIHN5bWJvbC4gICAqLworCisJICAvKiBNYWluIHByb2Nlc3Npbmcgc2VjdGlvbiBmb3IgZGVidWdnaW5nIHN5bWJvbHMgd2hpY2gKKwkgICAgIHRoZSBpbml0aWFsIHJlYWQgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlcyBuZWVkcyB0byB3b3JyeQorCSAgICAgYWJvdXQuICBJZiB3ZSByZWFjaCB0aGlzIHBvaW50LCB0aGUgc3ltYm9sIHdoaWNoIHdlIGFyZQorCSAgICAgY29uc2lkZXJpbmcgaXMgZGVmaW5pdGVseSBvbmUgd2UgYXJlIGludGVyZXN0ZWQgaW4uCisJICAgICBwIG11c3QgYWxzbyBjb250YWluIHRoZSAodmFsaWQpIGluZGV4IGludG8gdGhlIG5hbWVzdHJpbmcKKwkgICAgIHdoaWNoIGluZGljYXRlcyB0aGUgZGVidWdnaW5nIHR5cGUgc3ltYm9sLiAgKi8KKworCSAgc3dpdGNoIChwWzFdKQorCSAgICB7CisJICAgIGNhc2UgJ1MnIDoKKwkgICAgICB7CisJCXVuc2lnbmVkIGxvbmcgdmFsdTsKKyAgICAgICAgICAgIAllbnVtIGxhbmd1YWdlIHRtcF9sYW5ndWFnZTsKKwkJY2hhciAqc3RyLCAqcDsKKwkJaW50IG47CisJCQorCQl2YWx1ID0gQ1VSX1NZTUJPTF9WQUxVRTsKKwkJaWYgKHZhbHUpCisJCSAgdmFsdSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKTsKKwkJcGFzdF9maXJzdF9zb3VyY2VfZmlsZSA9IDE7CisKKyAgICAgICAgICAgICAgICBwID0gc3RyY2hyKG5hbWVzdHJpbmcsICc6Jyk7CisgICAgICAgICAgICAgICAgaWYgKHApIG4gPSBwLW5hbWVzdHJpbmc7CisgICAgICAgICAgICAgICAgZWxzZSBuID0gc3RybGVuKG5hbWVzdHJpbmcpOworICAgICAgICAgICAgICAgIHN0ciA9IGFsbG9jYShuKzEpOworICAgICAgICAgICAgICAgIHN0cm5jcHkoc3RyLCBuYW1lc3RyaW5nLCBuKTsKKyAgICAgICAgICAgICAgICBzdHJbbl0gPSAnXDAnOworCisJCWlmIChwc3ltZmlsZV9kZXB0aCA9PSAwKSB7CisJCSAgaWYgKCFwc3QpCisJCSAgICBwc3QgPSBvczlrX3N0YXJ0X3BzeW10YWIgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywKKwkJCQkgc3RyLCB2YWx1LAorCQkJCSBjdXJzeW1vZmZzZXQsCisJCQkJIHN5bW51bS0xLAorCQkJCSBvYmpmaWxlIC0+IGdsb2JhbF9wc3ltYm9scy5uZXh0LAorCQkJCSBvYmpmaWxlIC0+IHN0YXRpY19wc3ltYm9scy5uZXh0KTsKKwkJfSBlbHNlIHsgLyogdGhpcyBpcyBhIGluY2x1ZGUgZmlsZSAqLworICAgICAgICAgICAgCSAgdG1wX2xhbmd1YWdlID0gZGVkdWNlX2xhbmd1YWdlX2Zyb21fZmlsZW5hbWUgKHN0cik7CisgICAgICAgICAgICAJICBpZiAodG1wX2xhbmd1YWdlICE9IGxhbmd1YWdlX3Vua25vd24KKyAgICAgICAgICAgICAgICAJJiYgKHRtcF9sYW5ndWFnZSAhPSBsYW5ndWFnZV9jCisgICAgICAgICAgICAgICAgICAgIAl8fCBwc3ltdGFiX2xhbmd1YWdlICE9IGxhbmd1YWdlX2NwbHVzKSkKKyAgICAgICAgICAgICAgCQlwc3ltdGFiX2xhbmd1YWdlID0gdG1wX2xhbmd1YWdlOworCisvKgorCQkgIGlmIChwc3QgJiYgU1RSRVEgKHN0ciwgcHN0LT5maWxlbmFtZSkpCisJCSAgICBjb250aW51ZTsKKwkJICB7CisJCSAgICByZWdpc3RlciBpbnQgaTsKKwkJICAgIGZvciAoaSA9IDA7IGkgPCBpbmNsdWRlc191c2VkOyBpKyspCisJCSAgICAgIGlmIChTVFJFUSAoc3RyLCBwc3ltdGFiX2luY2x1ZGVfbGlzdFtpXSkpCisJCQl7CisJCQkgIGkgPSAtMTsgCisJCQkgIGJyZWFrOworCQkJfQorCQkgICAgaWYgKGkgPT0gLTEpCisJCSAgICAgIGNvbnRpbnVlOworCQkgIH0KKyovCisKKyAgICAgICAgICAgICAgICAgIHBzeW10YWJfaW5jbHVkZV9saXN0W2luY2x1ZGVzX3VzZWQrK10gPSBzdHI7CisgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZXNfdXNlZCA+PSBpbmNsdWRlc19hbGxvY2F0ZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqb3JpZyA9IHBzeW10YWJfaW5jbHVkZV9saXN0OworCisgICAgICAgICAgICAgICAgICAgICAgcHN5bXRhYl9pbmNsdWRlX2xpc3QgPSAoY2hhciAqKikKKyAgICAgICAgICAgICAgICAJICBhbGxvY2EgKChpbmNsdWRlc19hbGxvY2F0ZWQgKj0gMikgKiBzaXplb2YgKGNoYXIgKikpOworICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSAoKFBUUilwc3ltdGFiX2luY2x1ZGVfbGlzdCwgKFBUUilvcmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlc191c2VkICogc2l6ZW9mIChjaGFyICopKTsKKyAgICAgICAgICAgICAgCSAgICB9CisKKwkJfQorICAJCXBzeW1maWxlX2RlcHRoKys7CisJCWNvbnRpbnVlOworCSAgICAgIH0KKworCSAgICBjYXNlICd2JzoKKwkgICAgICBhZGRfcHN5bWJvbF90b19saXN0IChuYW1lc3RyaW5nLCBwIC0gbmFtZXN0cmluZywKKwkJCQkgICBWQVJfTkFNRVNQQUNFLCBMT0NfU1RBVElDLAorCQkJCSAgICZvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMsCisJCQkJICAgMCwgQ1VSX1NZTUJPTF9WQUxVRSwKKwkJCQkgICBwc3ltdGFiX2xhbmd1YWdlLCBvYmpmaWxlKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgY2FzZSAnVic6CisJICAgICAgYWRkX3BzeW1ib2xfdG9fbGlzdCAobmFtZXN0cmluZywgcCAtIG5hbWVzdHJpbmcsCisJCQkJICAgVkFSX05BTUVTUEFDRSwgTE9DX1NUQVRJQywKKwkJCQkgICAmb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLAorCQkJCSAgIDAsIENVUl9TWU1CT0xfVkFMVUUsCisJCQkJICAgcHN5bXRhYl9sYW5ndWFnZSwgb2JqZmlsZSk7CisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAnVCc6CisJICAgICAgaWYgKHAgIT0gbmFtZXN0cmluZykJLyogYSBuYW1lIGlzIHRoZXJlLCBub3QganVzdCA6VC4uLiAqLworCQl7CisJCSAgYWRkX3BzeW1ib2xfdG9fbGlzdCAobmFtZXN0cmluZywgcCAtIG5hbWVzdHJpbmcsCisJCQkJICAgICAgIFNUUlVDVF9OQU1FU1BBQ0UsIExPQ19UWVBFREVGLAorCQkJCSAgICAgICAmb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLAorCQkJCSAgICAgICBDVVJfU1lNQk9MX1ZBTFVFLCAwLAorCQkJCSAgICAgICBwc3ltdGFiX2xhbmd1YWdlLCBvYmpmaWxlKTsKKwkJICBpZiAocFsyXSA9PSAndCcpCisJCSAgICB7CisJCSAgICAgIC8qIEFsc28gYSB0eXBlZGVmIHdpdGggdGhlIHNhbWUgbmFtZS4gICovCisJCSAgICAgIGFkZF9wc3ltYm9sX3RvX2xpc3QgKG5hbWVzdHJpbmcsIHAgLSBuYW1lc3RyaW5nLAorCQkJCQkgICBWQVJfTkFNRVNQQUNFLCBMT0NfVFlQRURFRiwKKwkJCQkJICAgJm9iamZpbGUtPnN0YXRpY19wc3ltYm9scywKKwkJCQkJICAgQ1VSX1NZTUJPTF9WQUxVRSwgMCwgcHN5bXRhYl9sYW5ndWFnZSwKKwkJCQkJICAgb2JqZmlsZSk7CisJCSAgICAgIHAgKz0gMTsKKwkJICAgIH0KKwkJICAvKiBUaGUgc2VtYW50aWNzIG9mIEMrKyBzdGF0ZSB0aGF0ICJzdHJ1Y3QgZm9vIHsgLi4uIH0iCisJCSAgICAgYWxzbyBkZWZpbmVzIGEgdHlwZWRlZiBmb3IgImZvbyIuICBVbmZvcnR1YW50ZWx5LCBjZnJvbnQKKwkJICAgICBuZXZlciBtYWtlcyB0aGUgdHlwZWRlZiB3aGVuIHRyYW5zbGF0aW5nIGZyb20gQysrIHRvIEMuCisJCSAgICAgV2UgbWFrZSB0aGUgdHlwZWRlZiBoZXJlIHNvIHRoYXQgInB0eXBlIGZvbyIgd29ya3MgYXMKKwkJICAgICBleHBlY3RlZCBmb3IgY2Zyb250IHRyYW5zbGF0ZWQgY29kZS4gICovCisJCSAgZWxzZSBpZiAocHN5bXRhYl9sYW5ndWFnZSA9PSBsYW5ndWFnZV9jcGx1cykKKwkJICAgeworCQkgICAgICAvKiBBbHNvIGEgdHlwZWRlZiB3aXRoIHRoZSBzYW1lIG5hbWUuICAqLworCQkgICAgICBhZGRfcHN5bWJvbF90b19saXN0IChuYW1lc3RyaW5nLCBwIC0gbmFtZXN0cmluZywKKwkJCQkJICAgVkFSX05BTUVTUEFDRSwgTE9DX1RZUEVERUYsCisJCQkJCSAgICZvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMsCisJCQkJCSAgIENVUl9TWU1CT0xfVkFMVUUsIDAsIHBzeW10YWJfbGFuZ3VhZ2UsCisJCQkJCSAgIG9iamZpbGUpOworCQkgICB9CisJCX0KKwkgICAgICBnb3RvIGNoZWNrX2VudW07CisJICAgIGNhc2UgJ3QnOgorCSAgICAgIGlmIChwICE9IG5hbWVzdHJpbmcpCS8qIGEgbmFtZSBpcyB0aGVyZSwgbm90IGp1c3QgOlQuLi4gKi8KKwkJeworCQkgIGFkZF9wc3ltYm9sX3RvX2xpc3QgKG5hbWVzdHJpbmcsIHAgLSBuYW1lc3RyaW5nLAorCQkJCSAgICAgICBWQVJfTkFNRVNQQUNFLCBMT0NfVFlQRURFRiwKKwkJCQkgICAgICAgJm9iamZpbGUtPnN0YXRpY19wc3ltYm9scywKKwkJCQkgICAgICAgQ1VSX1NZTUJPTF9WQUxVRSwgMCwKKwkJCQkgICAgICAgcHN5bXRhYl9sYW5ndWFnZSwgb2JqZmlsZSk7CisJCX0KKwkgICAgY2hlY2tfZW51bToKKwkgICAgICAvKiBJZiB0aGlzIGlzIGFuIGVudW1lcmF0ZWQgdHlwZSwgd2UgbmVlZCB0bworCQkgYWRkIGFsbCB0aGUgZW51bSBjb25zdGFudHMgdG8gdGhlIHBhcnRpYWwgc3ltYm9sCisJCSB0YWJsZS4gIFRoaXMgZG9lcyBub3QgY292ZXIgZW51bXMgd2l0aG91dCBuYW1lcywgZS5nLgorCQkgImVudW0ge2EsIGJ9IGM7IiBpbiBDLCBidXQgZm9ydHVuYXRlbHkgdGhvc2UgYXJlCisJCSByYXJlLiAgVGhlcmUgaXMgbm8gd2F5IGZvciBHREIgdG8gZmluZCB0aG9zZSBmcm9tIHRoZQorCQkgZW51bSB0eXBlIHdpdGhvdXQgc3BlbmRpbmcgdG9vIG11Y2ggdGltZSBvbiBpdC4gIFRodXMKKwkJIHRvIHNvbHZlIHRoaXMgcHJvYmxlbSwgdGhlIGNvbXBpbGVyIG5lZWRzIHRvIHB1dCBvdXQgdGhlCisJCSBlbnVtIGluIGEgbmFtZWxlc3MgdHlwZS4gIEdDQzIgZG9lcyB0aGlzLiAgKi8KKworCSAgICAgIC8qIFdlIGFyZSBsb29raW5nIGZvciBzb21ldGhpbmcgb2YgdGhlIGZvcm0KKwkJIDxuYW1lPiAiOiIgKCJ0IiB8ICJUIikgWzxudW1iZXI+ICI9Il0gImUiIDxzaXplPgorCQkgezxjb25zdGFudD4gIjoiIDx2YWx1ZT4gIiwifSAiOyIuICAqLworCisJICAgICAgLyogU2tpcCBvdmVyIHRoZSBjb2xvbiBhbmQgdGhlICd0JyBvciAnVCcuICAqLworCSAgICAgIHAgKz0gMjsKKwkgICAgICAvKiBUaGlzIHR5cGUgbWF5IGJlIGdpdmVuIGEgbnVtYmVyLiAgQWxzbywgbnVtYmVycyBjYW4gY29tZQorCQkgaW4gcGFpcnMgbGlrZSAoMCwyNikuICBTa2lwIG92ZXIgaXQuICAqLworCSAgICAgIHdoaWxlICgoKnAgPj0gJzAnICYmICpwIDw9ICc5JykKKwkJICAgICB8fCAqcCA9PSAnKCcgfHwgKnAgPT0gJywnIHx8ICpwID09ICcpJworCQkgICAgIHx8ICpwID09ICc9JykKKwkJcCsrOworCisJICAgICAgaWYgKCpwKysgPT0gJ2UnKQorCQl7CisJCSAgLyogV2UgaGF2ZSBmb3VuZCBhbiBlbnVtZXJhdGVkIHR5cGUuIHNraXAgc2l6ZSAqLworCSAgICAgICAgICB3aGlsZSAoKnAgPj0gJzAnICYmICpwIDw9ICc5JykgcCsrOworCQkgIC8qIEFjY29yZGluZyB0byBjb21tZW50cyBpbiByZWFkX2VudW1fdHlwZQorCQkgICAgIGEgY29tbWEgY291bGQgZW5kIGl0IGluc3RlYWQgb2YgYSBzZW1pY29sb24uCisJCSAgICAgSSBkb24ndCBrbm93IHdoZXJlIHRoYXQgaGFwcGVucy4KKwkJICAgICBBY2NlcHQgZWl0aGVyLiAgKi8KKwkJICB3aGlsZSAoKnAgJiYgKnAgIT0gJzsnICYmICpwICE9ICcsJykKKwkJICAgIHsKKwkJICAgICAgY2hhciAqcTsKKworCQkgICAgICAvKiBDaGVjayBmb3IgYW5kIGhhbmRsZSBjcmV0aW5vdXMgZGJ4IHN5bWJvbCBuYW1lCisJCQkgY29udGludWF0aW9uISAKKwkJICAgICAgaWYgKCpwID09ICdcXCcpCisJCQlwID0gbmV4dF9zeW1ib2xfdGV4dCAob2JqZmlsZSk7CisJCSAgICAgICovCisKKwkJICAgICAgLyogUG9pbnQgdG8gdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgbmFtZQorCQkJIG9mIHRoZSBlbnVtIGNvbnN0YW50LiAgKi8KKwkJICAgICAgZm9yIChxID0gcDsgKnEgJiYgKnEgIT0gJzonOyBxKyspCisJCQk7CisJCSAgICAgIC8qIE5vdGUgdGhhdCB0aGUgdmFsdWUgZG9lc24ndCBtYXR0ZXIgZm9yCisJCQkgZW51bSBjb25zdGFudHMgaW4gcHN5bXRhYnMsIGp1c3QgaW4gc3ltdGFicy4gICovCisJCSAgICAgIGFkZF9wc3ltYm9sX3RvX2xpc3QgKHAsIHEgLSBwLAorCQkJCQkgICBWQVJfTkFNRVNQQUNFLCBMT0NfQ09OU1QsCisJCQkJCSAgICZvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMsIDAsCisJCQkJCSAgIDAsIHBzeW10YWJfbGFuZ3VhZ2UsIG9iamZpbGUpOworCQkgICAgICAvKiBQb2ludCBwYXN0IHRoZSBuYW1lLiAgKi8KKwkJICAgICAgcCA9IHE7CisJCSAgICAgIC8qIFNraXAgb3ZlciB0aGUgdmFsdWUuICAqLworCQkgICAgICB3aGlsZSAoKnAgJiYgKnAgIT0gJywnKQorCQkJcCsrOworCQkgICAgICAvKiBBZHZhbmNlIHBhc3QgdGhlIGNvbW1hLiAgKi8KKwkJICAgICAgaWYgKCpwKQorCQkJcCsrOworCQkgICAgfQorCQl9CisJICAgICAgY29udGludWU7CisJICAgIGNhc2UgJ2MnOgorCSAgICAgIC8qIENvbnN0YW50LCBlLmcuIGZyb20gImNvbnN0IiBpbiBQYXNjYWwuICAqLworCSAgICAgIGFkZF9wc3ltYm9sX3RvX2xpc3QgKG5hbWVzdHJpbmcsIHAgLSBuYW1lc3RyaW5nLAorCQkJCSAgIFZBUl9OQU1FU1BBQ0UsIExPQ19DT05TVCwKKwkJCQkgICAmb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLCBDVVJfU1lNQk9MX1ZBTFVFLAorCQkJCSAgIDAsIHBzeW10YWJfbGFuZ3VhZ2UsIG9iamZpbGUpOworCSAgICAgIGNvbnRpbnVlOworCisJICAgIGNhc2UgJ2YnOgorCSAgICAgIENVUl9TWU1CT0xfVkFMVUUgKz0gQU5PRkZTRVQoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKTsKKyAgICAgICAgICAgICAgaWYgKHBzdCAmJiBwc3QtPnRleHRsb3cgPT0gMCkKKyAgICAgICAgICAgICAgICBwc3QtPnRleHRsb3cgPSBDVVJfU1lNQk9MX1ZBTFVFOworCisJICAgICAgYWRkX3BzeW1ib2xfdG9fbGlzdCAobmFtZXN0cmluZywgcCAtIG5hbWVzdHJpbmcsCisJCQkJICAgVkFSX05BTUVTUEFDRSwgTE9DX0JMT0NLLAorCQkJCSAgICZvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMsIENVUl9TWU1CT0xfVkFMVUUsCisJCQkJICAgMCwgcHN5bXRhYl9sYW5ndWFnZSwgb2JqZmlsZSk7CisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAnRic6CisJICAgICAgQ1VSX1NZTUJPTF9WQUxVRSArPSBBTk9GRlNFVChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOworICAgICAgICAgICAgICBpZiAocHN0ICYmIHBzdC0+dGV4dGxvdyA9PSAwKQorICAgICAgICAgICAgICAgIHBzdC0+dGV4dGxvdyA9IENVUl9TWU1CT0xfVkFMVUU7CisKKwkgICAgICBhZGRfcHN5bWJvbF90b19saXN0IChuYW1lc3RyaW5nLCBwIC0gbmFtZXN0cmluZywKKwkJCQkgICBWQVJfTkFNRVNQQUNFLCBMT0NfQkxPQ0ssCisJCQkJICAgJm9iamZpbGUtPmdsb2JhbF9wc3ltYm9scywgQ1VSX1NZTUJPTF9WQUxVRSwKKwkJCQkgICAwLCBwc3ltdGFiX2xhbmd1YWdlLCBvYmpmaWxlKTsKKwkgICAgICBjb250aW51ZTsKKworCSAgICBjYXNlICdwJzoKKwkgICAgY2FzZSAnbCc6CisgICAgICAgICAgICBjYXNlICdzJzoKKwkgICAgICBjb250aW51ZTsKKworCSAgICBjYXNlICc6JzoKKwkgICAgICAvKiBJdCBpcyBhIEMrKyBuZXN0ZWQgc3ltYm9sLiAgV2UgZG9uJ3QgbmVlZCB0byByZWNvcmQgaXQKKwkJIChJIGRvbid0IHRoaW5rKTsgaWYgd2UgdHJ5IHRvIGxvb2sgdXAgZm9vOjpiYXI6OmJheiwKKwkJIHRoZW4gc3ltYm9scyBmb3IgdGhlIHN5bXRhYiBjb250YWluaW5nIGZvbyBzaG91bGQgZ2V0CisJCSByZWFkIGluLCBJIHRoaW5rLiAgKi8KKwkgICAgICAvKiBTb21lb25lIHNheXMgc3VuIGNjIHB1dHMgb3V0IHN5bWJvbHMgbGlrZQorCQkgL2Zvby9iYXovbWFjbGliOjovdXNyL2xvY2FsL2Jpbi9tYWNsaWIsCisJCSB3aGljaCB3b3VsZCBnZXQgaGVyZSB3aXRoIGEgc3ltYm9sIHR5cGUgb2YgJzonLiAgKi8KKwkgICAgICBjb250aW51ZTsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIC8qIFVuZXhwZWN0ZWQgc3ltYm9sIGRlc2NyaXB0b3IuICBUaGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IHN0YWJzCisJCSBvZiBhIGNvbnRpbnVlZCBzdGFiIGNhbiBzaG93IHVwIGhlcmUuICBUaGUgcXVlc3Rpb24gaXMKKwkJIHdoZXRoZXIgdGhleSBldmVyIGNhbiBtaW1pYyBhIG5vcm1hbCBzdGFiLS1pdCB3b3VsZCBiZQorCQkgbmljZSBpZiBub3QsIHNpbmNlIHdlIGNlcnRhaW5seSBkb24ndCB3YW50IHRvIHNwZW5kIHRoZQorCQkgdGltZSBzZWFyY2hpbmcgdG8gdGhlIGVuZCBvZiBldmVyeSBzdHJpbmcgbG9va2luZyBmb3IKKwkJIGEgYmFja3NsYXNoLiAgKi8KKworCSAgICAgIGNvbXBsYWluICgmdW5rbm93bl9zeW1jaGFyX2NvbXBsYWludCwgcFsxXSk7CisJICAgICAgY29udGludWU7CisJICAgIH0KKworCWNhc2UgTl9TWU1fUkJSQUM6CisJICBDVVJfU1lNQk9MX1ZBTFVFICs9IEFOT0ZGU0VUKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCk7CisjaWZkZWYgSEFORExFX1JCUkFDCisJICBIQU5ETEVfUkJSQUMoQ1VSX1NZTUJPTF9WQUxVRSk7CisJICBjb250aW51ZTsKKyNlbmRpZgorCWNhc2UgTl9TWU1fTEJSQUM6CisJICBjb250aW51ZTsKKworCWRlZmF1bHQ6CisJICAvKiBJZiB3ZSBoYXZlbid0IGZvdW5kIGl0IHlldCwgaWdub3JlIGl0LiAgSXQncyBwcm9iYWJseSBzb21lCisJICAgICBuZXcgdHlwZSB3ZSBkb24ndCBrbm93IGFib3V0IHlldC4gICovCisJICBjb21wbGFpbiAoJnVua25vd25fc3ltdHlwZV9jb21wbGFpbnQsCisJCSAgICBsb2NhbF9oZXhfc3RyaW5nICgodW5zaWduZWQgbG9uZykgYnVmcC0+bl90eXBlKSk7CisJICBjb250aW51ZTsKKwl9CisgICAgfQorCisgIERCWF9TWU1DT1VOVCAob2JqZmlsZSkgPSBzeW1udW07CisKKyAgLyogSWYgdGhlcmUncyBzdHVmZiB0byBiZSBjbGVhbmVkIHVwLCBjbGVhbiBpdCB1cC4gICovCisgIGlmIChEQlhfU1lNQ09VTlQgKG9iamZpbGUpID4gMAorLypGSVhNRSwgZG9lcyB0aGlzIGhhdmUgYSBidWcgYXQgc3RhcnQgYWRkcmVzcyAwPyAqLworICAgICAgJiYgbGFzdF9vX2ZpbGVfc3RhcnQKKyAgICAgICYmIG9iamZpbGUgLT4gZWkuZW50cnlfcG9pbnQgPCBidWZwLT5uX3ZhbHVlCisgICAgICAmJiBvYmpmaWxlIC0+IGVpLmVudHJ5X3BvaW50ID49IGxhc3Rfb19maWxlX3N0YXJ0KQorICAgIHsKKyAgICAgIG9iamZpbGUgLT4gZWkuZW50cnlfZmlsZV9sb3dwYyA9IGxhc3Rfb19maWxlX3N0YXJ0OworICAgICAgb2JqZmlsZSAtPiBlaS5lbnRyeV9maWxlX2hpZ2hwYyA9IGJ1ZnAtPm5fdmFsdWU7CisgICAgfQorCisgIGlmIChwc3QpCisgICAgeworICAgICAgb3M5a19lbmRfcHN5bXRhYiAocHN0LCBwc3ltdGFiX2luY2x1ZGVfbGlzdCwgaW5jbHVkZXNfdXNlZCwKKwkJICAgc3ltbnVtLCBlbmRfb2ZfdGV4dF9hZGRyLAorCQkgICBkZXBlbmRlbmN5X2xpc3QsIGRlcGVuZGVuY2llc191c2VkKTsKKyAgICB9CisvKgorICBkb19jbGVhbnVwcyAoYmFja190byk7CisqLworfQorCisvKiBBbGxvY2F0ZSBhbmQgcGFydGlhbGx5IGZpbGwgYSBwYXJ0aWFsIHN5bXRhYi4gIEl0IHdpbGwgYmUKKyAgIGNvbXBsZXRlbHkgZmlsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIHN5bWJvbCBsaXN0LgorCisgICBTWU1GSUxFX05BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbC1maWxlIHdlIGFyZSByZWFkaW5nIGZyb20sIGFuZCBBRERSCisgICBpcyB0aGUgYWRkcmVzcyByZWxhdGl2ZSB0byB3aGljaCBpdHMgc3ltYm9scyBhcmUgKGluY3JlbWVudGFsKSBvciAwCisgICAobm9ybWFsKS4gKi8KKworCitzdGF0aWMgc3RydWN0IHBhcnRpYWxfc3ltdGFiICoKK29zOWtfc3RhcnRfcHN5bXRhYiAob2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzLAorCSAgICAgICBmaWxlbmFtZSwgdGV4dGxvdywgbGRzeW1vZmYsbGRzeW1jbnQsICBnbG9iYWxfc3ltcywgc3RhdGljX3N5bXMpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHM7CisgICAgIGNoYXIgKmZpbGVuYW1lOworICAgICBDT1JFX0FERFIgdGV4dGxvdzsKKyAgICAgaW50IGxkc3ltb2ZmOworICAgICBpbnQgbGRzeW1jbnQ7CisgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKmdsb2JhbF9zeW1zOworICAgICBzdHJ1Y3QgcGFydGlhbF9zeW1ib2wgKipzdGF0aWNfc3ltczsKK3sKKyAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpyZXN1bHQgPQorICAgICAgc3RhcnRfcHN5bXRhYl9jb21tb24ob2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzLAorCQkJICAgZmlsZW5hbWUsIHRleHRsb3csIGdsb2JhbF9zeW1zLCBzdGF0aWNfc3ltcyk7CisKKyAgcmVzdWx0LT5yZWFkX3N5bXRhYl9wcml2YXRlID0gKGNoYXIgKikKKyAgICBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZSAtPiBwc3ltYm9sX29ic3RhY2ssIHNpemVvZiAoc3RydWN0IHN5bWxvYykpOworCisgIExEU1lNT0ZGKHJlc3VsdCkgPSBsZHN5bW9mZjsKKyAgTERTWU1DTlQocmVzdWx0KSA9IGxkc3ltY250OworICByZXN1bHQtPnJlYWRfc3ltdGFiID0gb3M5a19wc3ltdGFiX3RvX3N5bXRhYjsKKworICAvKiBEZWR1Y2UgdGhlIHNvdXJjZSBsYW5ndWFnZSBmcm9tIHRoZSBmaWxlbmFtZSBmb3IgdGhpcyBwc3ltdGFiLiAqLworICBwc3ltdGFiX2xhbmd1YWdlID0gZGVkdWNlX2xhbmd1YWdlX2Zyb21fZmlsZW5hbWUgKGZpbGVuYW1lKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogQ2xvc2Ugb2ZmIHRoZSBjdXJyZW50IHVzYWdlIG9mIFBTVC4gIAorICAgUmV0dXJucyBQU1Qgb3IgTlVMTCBpZiB0aGUgcGFydGlhbCBzeW10YWIgd2FzIGVtcHR5IGFuZCB0aHJvd24gYXdheS4KKyAgIEZJWE1FOiAgTGlzdCB2YXJpYWJsZXMgYW5kIHBlY3VsaWFyaXRpZXMgb2Ygc2FtZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKgorb3M5a19lbmRfcHN5bXRhYiAocHN0LCBpbmNsdWRlX2xpc3QsIG51bV9pbmNsdWRlcywgY2FwcGluZ19zeW1ib2xfY250LAorCSAgICAgY2FwcGluZ190ZXh0LCBkZXBlbmRlbmN5X2xpc3QsIG51bWJlcl9kZXBlbmRlbmNpZXMpCisgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN0OworICAgICBjaGFyICoqaW5jbHVkZV9saXN0OworICAgICBpbnQgbnVtX2luY2x1ZGVzOworICAgICBpbnQgY2FwcGluZ19zeW1ib2xfY250OworICAgICBDT1JFX0FERFIgY2FwcGluZ190ZXh0OworICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKipkZXBlbmRlbmN5X2xpc3Q7CisgICAgIGludCBudW1iZXJfZGVwZW5kZW5jaWVzOworICAgICAvKiBzdHJ1Y3QgcGFydGlhbF9zeW1ib2wgKmNhcHBpbmdfZ2xvYmFsLCAqY2FwcGluZ19zdGF0aWM7ICovCit7CisgIGludCBpOworICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnAxOworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSA9IHBzdCAtPiBvYmpmaWxlOworCisgIGlmIChjYXBwaW5nX3N5bWJvbF9jbnQgIT0gLTEpCisgICAgICBMRFNZTUNOVChwc3QpID0gY2FwcGluZ19zeW1ib2xfY250IC0gTERTWU1DTlQocHN0KTsKKworICAvKiBVbmRlciBTb2xhcmlzLCB0aGUgTl9TTyBzeW1ib2xzIGFsd2F5cyBoYXZlIGEgdmFsdWUgb2YgMCwKKyAgICAgaW5zdGVhZCBvZiB0aGUgdXN1YWwgYWRkcmVzcyBvZiB0aGUgLm8gZmlsZS4gIFRoZXJlZm9yZSwKKyAgICAgd2UgaGF2ZSB0byBkbyBzb21lIHRyaWNrcyB0byBmaWxsIGluIHRleHRoaWdoIGFuZCB0ZXh0bG93LgorICAgICBUaGUgZmlyc3QgdHJpY2sgaXMgaW4gcGFydGlhbC1zdGFiLmg6IGlmIHdlIHNlZSBhIHN0YXRpYworICAgICBvciBnbG9iYWwgZnVuY3Rpb24sIGFuZCB0aGUgdGV4dGxvdyBmb3IgdGhlIGN1cnJlbnQgcHN0CisgICAgIGlzIHN0aWxsIDAsIHRoZW4gd2UgdXNlIHRoYXQgZnVuY3Rpb24ncyBhZGRyZXNzIGZvciAKKyAgICAgdGhlIHRleHRsb3cgb2YgdGhlIHBzdC4KKworICAgICBOb3csIHRvIGZpbGwgaW4gdGV4dGhpZ2gsIHdlIHJlbWVtYmVyIHRoZSBsYXN0IGZ1bmN0aW9uIHNlZW4KKyAgICAgaW4gdGhlIC5vIGZpbGUgKGFsc28gaW4gcGFydGlhbC1zdGFiLmgpLiAgQWxzbywgdGhlcmUncyBhIGhhY2sgaW4KKyAgICAgYmZkL2VsZi5jIGFuZCBnZGIvZWxmcmVhZC5jIHRvIHBhc3MgdGhlIEVMRiBzdF9zaXplIGZpZWxkCisgICAgIHRvIGhlcmUgdmlhIHRoZSBtaXNjX2luZm8gZmllbGQuICBUaGVyZWZvcmUsIHdlIGNhbiBmaWxsIGluCisgICAgIGEgcmVsaWFibGUgdGV4dGhpZ2ggYnkgdGFraW5nIHRoZSBhZGRyZXNzIHBsdXMgc2l6ZSBvZiB0aGUKKyAgICAgbGFzdCBmdW5jdGlvbiBpbiB0aGUgZmlsZS4KKworICAgICBVbmZvcnR1bmF0ZWx5LCB0aGF0IGRvZXMgbm90IGNvdmVyIHRoZSBjYXNlIHdoZXJlIHRoZSBsYXN0IGZ1bmN0aW9uCisgICAgIGluIHRoZSBmaWxlIGlzIHN0YXRpYy4gIFNlZSB0aGUgcGFyYWdyYXBoIGJlbG93IGZvciBtb3JlIGNvbW1lbnRzCisgICAgIG9uIHRoaXMgc2l0dWF0aW9uLgorCisgICAgIEZpbmFsbHksIGlmIHdlIGhhdmUgYSB2YWxpZCB0ZXh0bG93IGZvciB0aGUgY3VycmVudCBmaWxlLCB3ZSBydW4KKyAgICAgZG93biB0aGUgcGFydGlhbF9zeW10YWJfbGlzdCBmaWxsaW5nIGluIHByZXZpb3VzIHRleHRoaWdocyB0aGF0CisgICAgIGFyZSBzdGlsbCB1bmtub3duLiAgKi8KKworICBpZiAocHN0LT50ZXh0aGlnaCA9PSAwICYmIGxhc3RfZnVuY3Rpb25fbmFtZSkgeworICAgIGNoYXIgKnA7CisgICAgaW50IG47CisgICAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptaW5zeW07CisKKyAgICBwID0gc3RyY2hyIChsYXN0X2Z1bmN0aW9uX25hbWUsICc6Jyk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgIHAgPSBsYXN0X2Z1bmN0aW9uX25hbWU7CisgICAgbiA9IHAgLSBsYXN0X2Z1bmN0aW9uX25hbWU7CisgICAgcCA9IGFsbG9jYSAobiArIDEpOworICAgIHN0cm5jcHkgKHAsIGxhc3RfZnVuY3Rpb25fbmFtZSwgbik7CisgICAgcFtuXSA9IDA7CisgICAgCisgICAgbWluc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sIChwLCBOVUxMLCBvYmpmaWxlKTsKKworICAgIGlmIChtaW5zeW0pIHsKKyAgICAgIHBzdC0+dGV4dGhpZ2ggPSBTWU1CT0xfVkFMVUVfQUREUkVTUyhtaW5zeW0pKyhsb25nKU1TWU1CT0xfSU5GTyhtaW5zeW0pOworICAgIH0gZWxzZSB7CisgICAgICAvKiBUaGlzIGZpbGUgZW5kcyB3aXRoIGEgc3RhdGljIGZ1bmN0aW9uLCBhbmQgaXQncworCSBkaWZmaWN1bHQgdG8gaW1hZ2luZSBob3cgaGFyZCBpdCB3b3VsZCBiZSB0byB0cmFjayBkb3duCisJIHRoZSBlbGYgc3ltYm9sLiAgTHVja2lseSwgbW9zdCBvZiB0aGUgdGltZSBubyBvbmUgd2lsbCBub3RpY2UsCisJIHNpbmNlIHRoZSBuZXh0IGZpbGUgd2lsbCBsaWtlbHkgYmUgY29tcGlsZWQgd2l0aCAtZywgc28KKwkgdGhlIGNvZGUgYmVsb3cgd2lsbCBjb3B5IHRoZSBmaXJzdCBmdWN0aW9uJ3Mgc3RhcnQgYWRkcmVzcyAKKwkgYmFjayB0byBvdXIgdGV4dGhpZ2ggdmFyaWFibGUuICAoQWxzbywgaWYgdGhpcyBmaWxlIGlzIHRoZQorCSBsYXN0IG9uZSBpbiBhIGR5bmFtaWNhbGx5IGxpbmtlZCBwcm9ncmFtLCB0ZXh0aGlnaCBhbHJlYWR5CisJIGhhcyB0aGUgcmlnaHQgdmFsdWUuKSAgSWYgdGhlIG5leHQgZmlsZSBpc24ndCBjb21waWxlZAorCSB3aXRoIC1nLCB0aGVuIHRoZSBsYXN0IGZ1bmN0aW9uIGluIHRoaXMgZmlsZSB3aW5kcyB1cCBvd25pbmcKKwkgYWxsIG9mIHRoZSB0ZXh0IHNwYWNlIHVwIHRvIHRoZSBuZXh0IC1nIGZpbGUsIG9yIHRoZSBlbmQgKG1pbnVzCisJIHNoYXJlZCBsaWJyYXJpZXMpLiAgVGhpcyBvbmx5IG1hdHRlcnMgZm9yIHNpbmdsZSBzdGVwcGluZywKKwkgYW5kIGV2ZW4gdGhlbiBpdCB3aWxsIHN0aWxsIHdvcmssIGV4Y2VwdCB0aGF0IGl0IHdpbGwgc2luZ2xlCisJIHN0ZXAgdGhyb3VnaCBhbGwgb2YgdGhlIGNvdmVyZWQgZnVuY3Rpb25zLCBpbnN0ZWFkIG9mIHNldHRpbmcKKwkgYnJlYWtwb2ludHMgYXJvdW5kIHRoZW0gYXMgaXQgdXN1YWx5IGRvZXMuICBUaGlzIG1ha2VzIGl0CisJIHByZXR0eSBzbG93LCBidXQgYXQgbGVhc3QgaXQgZG9lc24ndCBmYWlsLgorCisJIFdlIGNhbiBmaXggdGhpcyB3aXRoIGEgZmFpcmx5IGJpZyBjaGFuZ2UgdG8gYmZkLCBidXQgd2UgbmVlZAorCSB0byBjb29yZGluYXRlIGJldHRlciB3aXRoIEN5Z251cyBpZiB3ZSB3YW50IHRvIGRvIHRoYXQuICBGSVhNRS4gICovCisgICAgfQorICAgIGxhc3RfZnVuY3Rpb25fbmFtZSA9IE5VTEw7CisgIH0KKworICAvKiB0aGlzIHRlc3Qgd2lsbCBiZSB0cnVlIGlmIHRoZSBsYXN0IC5vIGZpbGUgaXMgb25seSBkYXRhICovCisgIGlmIChwc3QtPnRleHRsb3cgPT0gMCkKKyAgICBwc3QtPnRleHRsb3cgPSBwc3QtPnRleHRoaWdoOworCisgIC8qIElmIHdlIGtub3cgb3VyIG93biBzdGFydGluZyB0ZXh0IGFkZHJlc3MsIHRoZW4gd2FsayB0aHJvdWdoIGFsbCBvdGhlcgorICAgICBwc3ltdGFicyBmb3IgdGhpcyBvYmpmaWxlLCBhbmQgaWYgYW55IGRpZG4ndCBrbm93IHRoZWlyIGVuZGluZyB0ZXh0CisgICAgIGFkZHJlc3MsIHNldCBpdCB0byBvdXIgc3RhcnRpbmcgYWRkcmVzcy4gIFRha2UgY2FyZSB0byBub3Qgc2V0IG91cgorICAgICBvd24gZW5kaW5nIGFkZHJlc3MgdG8gb3VyIHN0YXJ0aW5nIGFkZHJlc3MsIG5vciB0byBzZXQgYWRkcmVzc2VzIG9uCisgICAgIGBkZXBlbmRlbmN5JyBmaWxlcyB0aGF0IGhhdmUgYm90aCB0ZXh0bG93IGFuZCB0ZXh0aGlnaCB6ZXJvLiAgKi8KKyAgaWYgKHBzdC0+dGV4dGxvdykgeworICAgIEFMTF9PQkpGSUxFX1BTWU1UQUJTIChvYmpmaWxlLCBwMSkgeworICAgICAgaWYgKHAxLT50ZXh0aGlnaCA9PSAwICAmJiBwMS0+dGV4dGxvdyAhPSAwICYmIHAxICE9IHBzdCkgeworCXAxLT50ZXh0aGlnaCA9IHBzdC0+dGV4dGxvdzsKKwkvKiBpZiB0aGlzIGZpbGUgaGFzIG9ubHkgZGF0YSwgdGhlbiBtYWtlIHRleHRsb3cgbWF0Y2ggdGV4dGhpZ2ggKi8KKwlpZiAocDEtPnRleHRsb3cgPT0gMCkKKwkgIHAxLT50ZXh0bG93ID0gcDEtPnRleHRoaWdoOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIEVuZCBvZiBrbHVkZ2UgZm9yIHBhdGNoaW5nIFNvbGFyaXMgdGV4dGxvdyBhbmQgdGV4dGhpZ2guICAqLworCisgIHBzdC0+bl9nbG9iYWxfc3ltcyA9CisgICAgb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLm5leHQgLSAob2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLmxpc3QgKyBwc3QtPmdsb2JhbHNfb2Zmc2V0KTsKKyAgcHN0LT5uX3N0YXRpY19zeW1zID0KKyAgICBvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMubmV4dCAtIChvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMubGlzdCArIHBzdC0+c3RhdGljc19vZmZzZXQpOworCisgIHBzdC0+bnVtYmVyX29mX2RlcGVuZGVuY2llcyA9IG51bWJlcl9kZXBlbmRlbmNpZXM7CisgIGlmIChudW1iZXJfZGVwZW5kZW5jaWVzKQorICAgIHsKKyAgICAgIHBzdC0+ZGVwZW5kZW5jaWVzID0gKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKikKKwlvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+cHN5bWJvbF9vYnN0YWNrLAorCQkgICAgICAgbnVtYmVyX2RlcGVuZGVuY2llcyAqIHNpemVvZiAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKKyAgICAgIG1lbWNweSAocHN0LT5kZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3lfbGlzdCwKKwkgICAgIG51bWJlcl9kZXBlbmRlbmNpZXMgKiBzaXplb2YgKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSk7CisgICAgfQorICBlbHNlCisgICAgcHN0LT5kZXBlbmRlbmNpZXMgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1faW5jbHVkZXM7IGkrKykKKyAgICB7CisgICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnN1YnBzdCA9CisJYWxsb2NhdGVfcHN5bXRhYiAoaW5jbHVkZV9saXN0W2ldLCBvYmpmaWxlKTsKKworICAgICAgc3VicHN0LT5zZWN0aW9uX29mZnNldHMgPSBwc3QtPnNlY3Rpb25fb2Zmc2V0czsKKyAgICAgIHN1YnBzdC0+cmVhZF9zeW10YWJfcHJpdmF0ZSA9CisJICAoY2hhciAqKSBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+cHN5bWJvbF9vYnN0YWNrLAorCQkJCSAgc2l6ZW9mIChzdHJ1Y3Qgc3ltbG9jKSk7CisgICAgICBMRFNZTU9GRihzdWJwc3QpID0KKwlMRFNZTUNOVChzdWJwc3QpID0KKwkgIHN1YnBzdC0+dGV4dGxvdyA9CisJICAgIHN1YnBzdC0+dGV4dGhpZ2ggPSAwOworCisgICAgICAvKiBXZSBjb3VsZCBzYXZlIHNsaWdodCBiaXRzIG9mIHNwYWNlIGJ5IG9ubHkgbWFraW5nIG9uZSBvZiB0aGVzZSwKKwkgc2hhcmVkIGJ5IHRoZSBlbnRpcmUgc2V0IG9mIGluY2x1ZGUgZmlsZXMuICBGSVhNRS1zb21lZGF5LiAgKi8KKyAgICAgIHN1YnBzdC0+ZGVwZW5kZW5jaWVzID0gKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKikKKwlvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+cHN5bWJvbF9vYnN0YWNrLAorCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworICAgICAgc3VicHN0LT5kZXBlbmRlbmNpZXNbMF0gPSBwc3Q7CisgICAgICBzdWJwc3QtPm51bWJlcl9vZl9kZXBlbmRlbmNpZXMgPSAxOworCisgICAgICBzdWJwc3QtPmdsb2JhbHNfb2Zmc2V0ID0KKwlzdWJwc3QtPm5fZ2xvYmFsX3N5bXMgPQorCSAgc3VicHN0LT5zdGF0aWNzX29mZnNldCA9CisJICAgIHN1YnBzdC0+bl9zdGF0aWNfc3ltcyA9IDA7CisKKyAgICAgIHN1YnBzdC0+cmVhZGluID0gMDsKKyAgICAgIHN1YnBzdC0+c3ltdGFiID0gMDsKKyAgICAgIHN1YnBzdC0+cmVhZF9zeW10YWIgPSBwc3QtPnJlYWRfc3ltdGFiOworICAgIH0KKworICBzb3J0X3BzdF9zeW1ib2xzIChwc3QpOworCisgIC8qIElmIHRoZXJlIGlzIGFscmVhZHkgYSBwc3ltdGFiIG9yIHN5bXRhYiBmb3IgYSBmaWxlIG9mIHRoaXMgbmFtZSwgCisgICAgIHJlbW92ZSBpdC4KKyAgICAgKElmIHRoZXJlIGlzIGEgc3ltdGFiLCBtb3JlIGRyYXN0aWMgdGhpbmdzIGFsc28gaGFwcGVuLikKKyAgICAgVGhpcyBoYXBwZW5zIGluIFZ4V29ya3MuICAqLworICBmcmVlX25hbWVkX3N5bXRhYnMgKHBzdC0+ZmlsZW5hbWUpOworCisgIGlmIChudW1faW5jbHVkZXMgPT0gMAorICAgJiYgbnVtYmVyX2RlcGVuZGVuY2llcyA9PSAwCisgICAmJiBwc3QtPm5fZ2xvYmFsX3N5bXMgPT0gMAorICAgJiYgcHN0LT5uX3N0YXRpY19zeW1zID09IDApIHsKKyAgICAvKiBUaHJvdyBhd2F5IHRoaXMgcHN5bXRhYiwgaXQncyBlbXB0eS4gIFdlIGNhbid0IGRlYWxsb2NhdGUgaXQsIHNpbmNlCisgICAgICAgaXQgaXMgb24gdGhlIG9ic3RhY2ssIGJ1dCB3ZSBjYW4gZm9yZ2V0IHRvIGNoYWluIGl0IG9uIHRoZSBsaXN0LiAgKi8KKyAgICAvKiBJbmRpY2F0ZSB0aGF0IHBzeW10YWIgd2FzIHRocm93biBhd2F5LiAgKi8KKworICAgIGRpc2NhcmRfcHN5bXRhYiAocHN0KTsKKworICAgIHBzdCA9IChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKilOVUxMOworICB9CisgIHJldHVybiBwc3Q7Cit9CisMCitzdGF0aWMgdm9pZAorb3M5a19wc3ltdGFiX3RvX3N5bXRhYl8xIChwc3QpCisgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN0OworeworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworICBpbnQgaTsKKyAgCisgIGlmICghcHN0KQorICAgIHJldHVybjsKKworICBpZiAocHN0LT5yZWFkaW4pCisgICAgeworICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiUHN5bXRhYiBmb3IgJXMgYWxyZWFkeSByZWFkIGluLiAgU2hvdWxkbid0IGhhcHBlbi5cbiIsCisJICAgICAgIHBzdC0+ZmlsZW5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBSZWFkIGluIGFsbCBwYXJ0aWFsIHN5bXRhYnMgb24gd2hpY2ggdGhpcyBvbmUgaXMgZGVwZW5kZW50ICovCisgIGZvciAoaSA9IDA7IGkgPCBwc3QtPm51bWJlcl9vZl9kZXBlbmRlbmNpZXM7IGkrKykKKyAgICBpZiAoIXBzdC0+ZGVwZW5kZW5jaWVzW2ldLT5yZWFkaW4pCisgICAgICB7CisJLyogSW5mb3JtIGFib3V0IGFkZGl0aW9uYWwgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIHJlYWQgaW4uICAqLworCWlmIChpbmZvX3ZlcmJvc2UpCisJICB7CisJICAgIGZwdXRzX2ZpbHRlcmVkICgiICIsIGdkYl9zdGRvdXQpOworCSAgICB3cmFwX2hlcmUgKCIiKTsKKwkgICAgZnB1dHNfZmlsdGVyZWQgKCJhbmQgIiwgZ2RiX3N0ZG91dCk7CisJICAgIHdyYXBfaGVyZSAoIiIpOworCSAgICBwcmludGZfZmlsdGVyZWQgKCIlcy4uLiIsIHBzdC0+ZGVwZW5kZW5jaWVzW2ldLT5maWxlbmFtZSk7CisJICAgIHdyYXBfaGVyZSAoIiIpOwkJLyogRmx1c2ggb3V0cHV0ICovCisJICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisJICB9CisJb3M5a19wc3ltdGFiX3RvX3N5bXRhYl8xIChwc3QtPmRlcGVuZGVuY2llc1tpXSk7CisgICAgICB9CisKKyAgaWYgKExEU1lNQ05UKHBzdCkpCQkvKiBPdGhlcndpc2UgaXQncyBhIGR1bW15ICovCisgICAgeworICAgICAgLyogSW5pdCBzdHVmZiBuZWNlc3NhcnkgZm9yIHJlYWRpbmcgaW4gc3ltYm9scyAqLworICAgICAgc3RhYnNyZWFkX2luaXQgKCk7CisgICAgICBidWlsZHN5bV9pbml0ICgpOworICAgICAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIHJlYWxseV9mcmVlX3BlbmRpbmdzLCAwKTsKKworICAgICAgLyogUmVhZCBpbiB0aGlzIGZpbGUncyBzeW1ib2xzICovCisgICAgICBvczlrX3JlYWRfb2ZpbGVfc3ltdGFiIChwc3QpOworICAgICAgc29ydF9zeW10YWJfc3ltcyAocHN0LT5zeW10YWIpOworICAgICAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisgICAgfQorCisgIHBzdC0+cmVhZGluID0gMTsKK30KKworLyogUmVhZCBpbiBhbGwgb2YgdGhlIHN5bWJvbHMgZm9yIGEgZ2l2ZW4gcHN5bXRhYiBmb3IgcmVhbC4KKyAgIEJlIHZlcmJvc2UgYWJvdXQgaXQgaWYgdGhlIHVzZXIgd2FudHMgdGhhdC4gICovCisKK3N0YXRpYyB2b2lkCitvczlrX3BzeW10YWJfdG9fc3ltdGFiIChwc3QpCisgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN0OworeworICBiZmQgKnN5bV9iZmQ7CisKKyAgaWYgKCFwc3QpCisgICAgcmV0dXJuOworCisgIGlmIChwc3QtPnJlYWRpbikKKyAgICB7CisgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJQc3ltdGFiIGZvciAlcyBhbHJlYWR5IHJlYWQgaW4uICBTaG91bGRuJ3QgaGFwcGVuLlxuIiwKKwkgICAgICAgcHN0LT5maWxlbmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChMRFNZTUNOVChwc3QpIHx8IHBzdC0+bnVtYmVyX29mX2RlcGVuZGVuY2llcykKKyAgICB7CisgICAgICAvKiBQcmludCB0aGUgbWVzc2FnZSBub3csIGJlZm9yZSByZWFkaW5nIHRoZSBzdHJpbmcgdGFibGUsCisJIHRvIGF2b2lkIGRpc2NvbmNlcnRpbmcgcGF1c2VzLiAgKi8KKyAgICAgIGlmIChpbmZvX3ZlcmJvc2UpCisJeworCSAgcHJpbnRmX2ZpbHRlcmVkICgiUmVhZGluZyBpbiBzeW1ib2xzIGZvciAlcy4uLiIsIHBzdC0+ZmlsZW5hbWUpOworCSAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwl9CisKKyAgICAgIHN5bV9iZmQgPSBwc3QtPm9iamZpbGUtPm9iZmQ7CisgICAgICBvczlrX3BzeW10YWJfdG9fc3ltdGFiXzEgKHBzdCk7CisKKyAgICAgIC8qIE1hdGNoIHdpdGggZ2xvYmFsIHN5bWJvbHMuICBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBvbmNlLAorICAgICAgICAgYWZ0ZXIgYWxsIG9mIHRoZSBzeW10YWJzIGFuZCBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIHJlYWQgaW4uICAgKi8KKyAgICAgIHNjYW5fZmlsZV9nbG9iYWxzIChwc3QtPm9iamZpbGUpOworCisgICAgICAvKiBGaW5pc2ggdXAgdGhlIGRlYnVnIGVycm9yIG1lc3NhZ2UuICAqLworICAgICAgaWYgKGluZm9fdmVyYm9zZSkKKwlwcmludGZfZmlsdGVyZWQgKCJkb25lLlxuIik7CisgICAgfQorfQorCisvKiBSZWFkIGluIGEgZGVmaW5lZCBzZWN0aW9uIG9mIGEgc3BlY2lmaWMgb2JqZWN0IGZpbGUncyBzeW1ib2xzLiAqLworc3RhdGljIHZvaWQKK29zOWtfcmVhZF9vZmlsZV9zeW10YWIgKHBzdCkKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBpbnRlcm5hbF9zeW1zdHJ1Y3QgKmJ1ZnA7CisgIHVuc2lnbmVkIGNoYXIgdHlwZTsKKyAgdW5zaWduZWQgbWF4X3N5bW51bTsKKyAgcmVnaXN0ZXIgYmZkICphYmZkOworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgaW50IHN5bV9vZmZzZXQ7CQkvKiBPZmZzZXQgdG8gc3RhcnQgb2Ygc3ltYm9scyB0byByZWFkICovCisgIENPUkVfQUREUiB0ZXh0X29mZnNldDsJLyogU3RhcnQgb2YgdGV4dCBzZWdtZW50IGZvciBzeW1ib2xzICovCisgIGludCB0ZXh0X3NpemU7CQkvKiBTaXplIG9mIHRleHQgc2VnbWVudCBmb3Igc3ltYm9scyAqLworICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHM7CisgIEZJTEUgKmRiZ19maWxlOworCisgIG9iamZpbGUgPSBwc3QtPm9iamZpbGU7CisgIHN5bV9vZmZzZXQgPSBMRFNZTU9GRihwc3QpOworICBtYXhfc3ltbnVtID0gTERTWU1DTlQocHN0KTsKKyAgdGV4dF9vZmZzZXQgPSBwc3QtPnRleHRsb3c7CisgIHRleHRfc2l6ZSA9IHBzdC0+dGV4dGhpZ2ggLSBwc3QtPnRleHRsb3c7CisgIHNlY3Rpb25fb2Zmc2V0cyA9IHBzdC0+c2VjdGlvbl9vZmZzZXRzOworCisgIGN1cnJlbnRfb2JqZmlsZSA9IG9iamZpbGU7CisgIHN1YmZpbGVfc3RhY2sgPSBOVUxMOworICBsYXN0X3NvdXJjZV9maWxlID0gTlVMTDsKKworICBhYmZkID0gb2JqZmlsZS0+b2JmZDsKKyAgZGJnX2ZpbGUgPSBvYmpmaWxlLT5hdXhmMjsKKworI2lmIDAKKyAgLyogSXQgaXMgbmVjZXNzYXJ5IHRvIGFjdHVhbGx5IHJlYWQgb25lIHN5bWJvbCAqYmVmb3JlKiB0aGUgc3RhcnQKKyAgICAgb2YgdGhpcyBzeW10YWIncyBzeW1ib2xzLCBiZWNhdXNlIHRoZSBHQ0NfQ09NUElMRURfRkxBR19TWU1CT0wKKyAgICAgb2NjdXJzIGJlZm9yZSB0aGUgTl9TTyBzeW1ib2wuCisgICAgIERldGVjdGluZyB0aGlzIGluIHJlYWRfZGJ4X3N5bXRhYgorICAgICB3b3VsZCBzbG93IGRvd24gaW5pdGlhbCByZWFkaW4sIHNvIHdlIGxvb2sgZm9yIGl0IGhlcmUgaW5zdGVhZC4gKi8KKyAgaWYgKCFwcm9jZXNzaW5nX2FjY19jb21waWxhdGlvbiAmJiBzeW1fb2Zmc2V0ID49IChpbnQpc3ltYm9sX3NpemUpCisgICAgeworICAgICAgZnNlZWsgKG9iamVmaWxlLT5hdXhmMiwgc3ltX29mZnNldCwgU0VFS19DVVIpOworICAgICAgZmlsbF9zeW0ob2JqZmlsZS0+YXV4ZjIsIGFiZmQpOworICAgICAgYnVmcCA9IHN5bWJ1ZjsKKworICAgICAgcHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24gPSAwOworICAgICAgaWYgKGJ1ZnAtPm5fdHlwZSA9PSBOX1RFWFQpCisJeworCSAgaWYgKFNUUkVRIChuYW1lc3RyaW5nLCBHQ0NfQ09NUElMRURfRkxBR19TWU1CT0wpKQorCSAgICBwcm9jZXNzaW5nX2djY19jb21waWxhdGlvbiA9IDE7CisJICBlbHNlIGlmIChTVFJFUSAobmFtZXN0cmluZywgR0NDMl9DT01QSUxFRF9GTEFHX1NZTUJPTCkpCisJICAgIHByb2Nlc3NpbmdfZ2NjX2NvbXBpbGF0aW9uID0gMjsKKwl9CisKKyAgICAgIC8qIFRyeSB0byBzZWxlY3QgYSBDKysgZGVtYW5nbGluZyBiYXNlZCBvbiB0aGUgY29tcGlsYXRpb24gdW5pdAorCSBwcm9kdWNlci4gKi8KKworICAgICAgaWYgKHByb2Nlc3NpbmdfZ2NjX2NvbXBpbGF0aW9uKQorCXsKKwkgIGlmIChBVVRPX0RFTUFOR0xJTkcpCisJICAgIHsKKwkgICAgICBzZXRfZGVtYW5nbGluZ19zdHlsZSAoR05VX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HKTsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGUgTl9TTyBzdGFydGluZyB0aGlzIHN5bXRhYiBpcyB0aGUgZmlyc3Qgc3ltYm9sLCBzbyB3ZQorCSBiZXR0ZXIgbm90IGNoZWNrIHRoZSBzeW1ib2wgYmVmb3JlIGl0LiAgSSdtIG5vdCB0aGlzIGNhbgorCSBoYXBwZW4sIGJ1dCBpdCBkb2Vzbid0IGh1cnQgdG8gY2hlY2sgZm9yIGl0LiAgKi8KKyAgICAgIGJmZF9zZWVrIChzeW1maWxlX2JmZCwgc3ltX29mZnNldCwgU0VFS19DVVIpOworICAgICAgcHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24gPSAwOworICAgIH0KKyNlbmRpZiAvKiAwICovCisKKyAgZnNlZWsoZGJnX2ZpbGUsIChsb25nKXN5bV9vZmZzZXQsIDApOworLyoKKyAgaWYgKGJ1ZnAtPm5fdHlwZSAhPSAodW5zaWduZWQgY2hhcilOX1NZTV9TWU0pCisgICAgZXJyb3IoIkZpcnN0IHN5bWJvbCBpbiBzZWdtZW50IG9mIGV4ZWN1dGFibGUgbm90IGEgc291cmNlIHN5bWJvbCIpOworKi8KKworICBmb3IgKHN5bW51bSA9IDA7IHN5bW51bSA8IG1heF9zeW1udW07IHN5bW51bSsrKQorICAgIHsKKyAgICAgIFFVSVQ7CQkJLyogQWxsb3cgdGhpcyB0byBiZSBpbnRlcnJ1cHRhYmxlICovCisgICAgICBmaWxsX3N5bShkYmdfZmlsZSwgYWJmZCk7CisgICAgICBidWZwID0gc3ltYnVmOworICAgICAgdHlwZSA9IGJ1ZnAtPm5fdHlwZTsKKworICAgICAgb3M5a19wcm9jZXNzX29uZV9zeW1ib2wgKChpbnQpdHlwZSwgKGludClidWZwLT5uX2Rlc2MsIAorICAgICAgKENPUkVfQUREUilidWZwLT5uX3ZhbHVlLCBidWZwLT5uX3N0cngsIHNlY3Rpb25fb2Zmc2V0cywgb2JqZmlsZSk7CisKKyAgICAgIC8qIFdlIHNraXAgY2hlY2tpbmcgZm9yIGEgbmV3IC5vIG9yIC1sIGZpbGU7IHRoYXQgc2hvdWxkIG5ldmVyCisgICAgICAgICBoYXBwZW4gaW4gdGhpcyByb3V0aW5lLiAqLworI2lmIDAKKyAgICAgIGVsc2UgaWYgKHR5cGUgPT0gTl9URVhUKQorCXsKKwkgIC8qIEkgZG9uJ3QgdGhpbmsgdGhpcyBjb2RlIHdpbGwgZXZlciBiZSBleGVjdXRlZCwgYmVjYXVzZQorCSAgICAgdGhlIEdDQ19DT01QSUxFRF9GTEFHX1NZTUJPTCB1c3VhbGx5IGlzIHJpZ2h0IGJlZm9yZQorCSAgICAgdGhlIE5fU08gc3ltYm9sIHdoaWNoIHN0YXJ0cyB0aGlzIHNvdXJjZSBmaWxlLgorCSAgICAgSG93ZXZlciwgdGhlcmUgaXMgbm8gcmVhc29uIG5vdCB0byBhY2NlcHQKKwkgICAgIHRoZSBHQ0NfQ09NUElMRURfRkxBR19TWU1CT0wgYW55d2hlcmUuICAqLworCisJICBpZiAoU1RSRVEgKG5hbWVzdHJpbmcsIEdDQ19DT01QSUxFRF9GTEFHX1NZTUJPTCkpCisJICAgIHByb2Nlc3NpbmdfZ2NjX2NvbXBpbGF0aW9uID0gMTsKKwkgIGVsc2UgaWYgKFNUUkVRIChuYW1lc3RyaW5nLCBHQ0MyX0NPTVBJTEVEX0ZMQUdfU1lNQk9MKSkKKwkgICAgcHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24gPSAyOworCisJICBpZiAoQVVUT19ERU1BTkdMSU5HKQorCSAgICB7CisJICAgICAgc2V0X2RlbWFuZ2xpbmdfc3R5bGUgKEdOVV9ERU1BTkdMSU5HX1NUWUxFX1NUUklORyk7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmICh0eXBlICYgTl9FWFQgfHwgdHlwZSA9PSAodW5zaWduZWQgY2hhcilOX1RFWFQKKwkgICAgICAgfHwgdHlwZSA9PSAodW5zaWduZWQgY2hhcilOX05CVEVYVAorCSAgICAgICApIHsKKwkgIC8qIEdsb2JhbCBzeW1ib2w6IHNlZSBpZiB3ZSBjYW1lIGFjcm9zcyBhIGRieCBkZWZpbnRpb24gZm9yCisJICAgICBhIGNvcnJlc3BvbmRpbmcgc3ltYm9sLiAgSWYgc28sIHN0b3JlIHRoZSB2YWx1ZS4gIFJlbW92ZQorCSAgICAgc3ltcyBmcm9tIHRoZSBjaGFpbiB3aGVuIHRoZWlyIHZhbHVlcyBhcmUgc3RvcmVkLCBidXQKKwkgICAgIHNlYXJjaCB0aGUgd2hvbGUgY2hhaW4sIGFzIHRoZXJlIG1heSBiZSBzZXZlcmFsIHN5bXMgZnJvbQorCSAgICAgZGlmZmVyZW50IGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZS4gKi8KKwkgIC8qIFRoaXMgaXMgcHJvYmFibHkgbm90IHRydWUuICBTaW5jZSB0aGUgZmlsZXMgd2lsbCBiZSByZWFkCisJICAgICBpbiBvbmUgYXQgYSB0aW1lLCBlYWNoIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBzeW1ib2wgd2lsbAorCSAgICAgYmUgc2F0aXNmaWVkIGluIGVhY2ggZmlsZSBhcyBpdCBhcHBlYXJzLiBTbyB3ZSBza2lwIHRoaXMKKwkgICAgIHNlY3Rpb24uICovCisJICA7CisgICAgICAgIH0KKyNlbmRpZiAvKiAwICovCisgICAgfQorCisgIGN1cnJlbnRfb2JqZmlsZSA9IE5VTEw7CisKKyAgLyogSW4gYSBTb2xhcmlzIGVsZiBmaWxlLCB0aGlzIHZhcmlhYmxlLCB3aGljaCBjb21lcyBmcm9tIHRoZQorICAgICB2YWx1ZSBvZiB0aGUgTl9TTyBzeW1ib2wsIHdpbGwgc3RpbGwgYmUgMC4gIEx1Y2tpbHksIHRleHRfb2Zmc2V0LAorICAgICB3aGljaCBjb21lcyBmcm9tIHBzdC0+dGV4dGxvdyBpcyBjb3JyZWN0LiAqLworICBpZiAobGFzdF9zb3VyY2Vfc3RhcnRfYWRkciA9PSAwKQorICAgIGxhc3Rfc291cmNlX3N0YXJ0X2FkZHIgPSB0ZXh0X29mZnNldDsKKyAgcHN0LT5zeW10YWIgPSBlbmRfc3ltdGFiICh0ZXh0X29mZnNldCArIHRleHRfc2l6ZSwgb2JqZmlsZSwgU0VDVF9PRkZfVEVYVCk7CisgIGVuZF9zdGFicyAoKTsKK30KKworDAorLyogVGhpcyBoYW5kbGVzIGEgc2luZ2xlIHN5bWJvbCBmcm9tIHRoZSBzeW1ib2wtZmlsZSwgYnVpbGRpbmcgc3ltYm9scworICAgaW50byBhIEdEQiBzeW10YWIuICBJdCB0YWtlcyB0aGVzZSBhcmd1bWVudHMgYW5kIGFuIGltcGxpY2l0IGFyZ3VtZW50LgorCisgICBUWVBFIGlzIHRoZSB0eXBlIGZpZWxkIG9mIHRoZSAiLnN0YWIiIHN5bWJvbCBlbnRyeS4KKyAgIERFU0MgaXMgdGhlIGRlc2MgZmllbGQgb2YgdGhlICIuc3RhYiIgZW50cnkuCisgICBWQUxVIGlzIHRoZSB2YWx1ZSBmaWVsZCBvZiB0aGUgIi5zdGFiIiBlbnRyeS4KKyAgIE5BTUUgaXMgdGhlIHN5bWJvbCBuYW1lLCBpbiBvdXIgYWRkcmVzcyBzcGFjZS4KKyAgIFNFQ1RJT05fT0ZGU0VUUyBpcyBhIHNldCBvZiBhbW91bnRzIGJ5IHdoaWNoIHRoZSBzZWN0aW9ucyBvZiB0aGlzIG9iamVjdAorICAgICAgICAgIGZpbGUgd2VyZSByZWxvY2F0ZWQgd2hlbiBpdCB3YXMgbG9hZGVkIGludG8gbWVtb3J5LgorICAgICAgICAgIEFsbCBzeW1ib2xzIHRoYXQgcmVmZXIKKwkgIHRvIG1lbW9yeSBsb2NhdGlvbnMgbmVlZCB0byBiZSBvZmZzZXQgYnkgdGhlc2UgYW1vdW50cy4KKyAgIE9CSkZJTEUgaXMgdGhlIG9iamVjdCBmaWxlIGZyb20gd2hpY2ggd2UgYXJlIHJlYWRpbmcgc3ltYm9scy4KKyAJICAgICAgIEl0IGlzIHVzZWQgaW4gZW5kX3N5bXRhYi4gICovCisKK3N0YXRpYyB2b2lkCitvczlrX3Byb2Nlc3Nfb25lX3N5bWJvbCAodHlwZSwgZGVzYywgdmFsdSwgbmFtZSwgc2VjdGlvbl9vZmZzZXRzLCBvYmpmaWxlKQorICAgICBpbnQgdHlwZSwgZGVzYzsKKyAgICAgQ09SRV9BRERSIHZhbHU7CisgICAgIGNoYXIgKm5hbWU7CisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBjb250ZXh0X3N0YWNrICpuZXc7CisgIC8qIFRoZSBzdGFiIHR5cGUgdXNlZCBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlIGxhc3QgZnVuY3Rpb24uCisgICAgIE5fU1RTWU0gb3IgTl9HU1lNIGZvciBTdW5PUzQgYWNjOyBOX0ZVTiBmb3Igb3RoZXIgY29tcGlsZXJzLiAgKi8KKyAgc3RhdGljIGludCBmdW5jdGlvbl9zdGFiX3R5cGUgPSAwOworCisjaWYgMAorICAvKiBTb21ldGhpbmcgaXMgd3JvbmcgaWYgd2Ugc2VlIHJlYWwgZGF0YSBiZWZvcmUKKyAgICAgc2VlaW5nIGEgc291cmNlIGZpbGUgbmFtZS4gICovCisgIGlmIChsYXN0X3NvdXJjZV9maWxlID09IE5VTEwgJiYgdHlwZSAhPSAodW5zaWduZWQgY2hhcilOX1NPKQorICAgIHsKKyAgICAgIC8qIElnbm9yZSBhbnkgc3ltYm9scyB3aGljaCBhcHBlYXIgYmVmb3JlIGFuIE5fU08gc3ltYm9sLgorCSBDdXJyZW50bHkgbm8gb25lIHB1dHMgc3ltYm9scyB0aGVyZSwgYnV0IHdlIHNob3VsZCBkZWFsCisJIGdyYWNlZnVsbHkgd2l0aCB0aGUgY2FzZS4gIEEgY29tcGxhaW4oKXQgbWlnaHQgYmUgaW4gb3JkZXIsCisJIGJ1dCB0aGlzIHNob3VsZCBub3QgYmUgYW4gZXJyb3IgKCkuICAqLworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiAwICovCisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIE5fU1lNX0xCUkFDOgorICAgICAgLyogT24gbW9zdCBtYWNoaW5lcywgdGhlIGJsb2NrIGFkZHJlc3NlcyBhcmUgcmVsYXRpdmUgdG8gdGhlCisJIE5fU08sIHRoZSBsaW5rZXIgZGlkIG5vdCByZWxvY2F0ZSB0aGVtIChzaWdoKS4gICovCisgICAgICB2YWx1ICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOyAKKyAgICAgIG5ldyA9IHB1c2hfY29udGV4dCAoZGVzYywgdmFsdSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTl9TWU1fUkJSQUM6CisgICAgICB2YWx1ICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOyAKKyAgICAgIG5ldyA9IHBvcF9jb250ZXh0KCk7CisKKyNpZiAhZGVmaW5lZCAoT1M5S19WQVJJQUJMRVNfSU5TSURFX0JMT0NLKQorI2RlZmluZSBPUzlLX1ZBUklBQkxFU19JTlNJREVfQkxPQ0soZGVzYywgZ2NjX3ApIDEKKyNlbmRpZgorCisgICAgICBpZiAoIU9TOUtfVkFSSUFCTEVTX0lOU0lERV9CTE9DSyhkZXNjLCBwcm9jZXNzaW5nX2djY19jb21waWxhdGlvbikpCisJbG9jYWxfc3ltYm9scyA9IG5ldy0+bG9jYWxzOworCisgICAgICBpZiAoY29udGV4dF9zdGFja19kZXB0aCA+IDEpCisJeworCSAgLyogVGhpcyBpcyBub3QgdGhlIG91dGVybW9zdCBMQlJBQy4uLlJCUkFDIHBhaXIgaW4gdGhlIGZ1bmN0aW9uLAorCSAgICAgaXRzIGxvY2FsIHN5bWJvbHMgcHJlY2VkZWQgaXQsIGFuZCBhcmUgdGhlIG9uZXMganVzdCByZWNvdmVyZWQKKwkgICAgIGZyb20gdGhlIGNvbnRleHQgc3RhY2suICBEZWZpbmUgdGhlIGJsb2NrIGZvciB0aGVtIChidXQgZG9uJ3QKKwkgICAgIGJvdGhlciBpZiB0aGUgYmxvY2sgY29udGFpbnMgbm8gc3ltYm9scy4gIFNob3VsZCB3ZSBjb21wbGFpbgorCSAgICAgb24gYmxvY2tzIHdpdGhvdXQgc3ltYm9scz8gIEkgY2FuJ3QgdGhpbmsgb2YgYW55IHVzZWZ1bCBwdXJwb3NlCisJICAgICBmb3IgdGhlbSkuICAqLworCSAgaWYgKGxvY2FsX3N5bWJvbHMgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIC8qIE11enpsZSBhIGNvbXBpbGVyIGJ1ZyB0aGF0IG1ha2VzIGVuZCA8IHN0YXJ0LiAgKHdoaWNoCisJCSBjb21waWxlcnM/ICBJcyB0aGlzIGV2ZXIgaGFybWZ1bD8pLiAgKi8KKwkgICAgICBpZiAobmV3LT5zdGFydF9hZGRyID4gdmFsdSkKKwkJeworCQkgIGNvbXBsYWluICgmbGJyYWNfcmJyYWNfY29tcGxhaW50KTsKKwkJICBuZXctPnN0YXJ0X2FkZHIgPSB2YWx1OworCQl9CisJICAgICAgLyogTWFrZSBhIGJsb2NrIGZvciB0aGUgbG9jYWwgc3ltYm9scyB3aXRoaW4uICAqLworCSAgICAgIGZpbmlzaF9ibG9jayAoMCwgJmxvY2FsX3N5bWJvbHMsIG5ldy0+b2xkX2Jsb2NrcywKKwkJCSAgICBuZXctPnN0YXJ0X2FkZHIsIHZhbHUsIG9iamZpbGUpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChjb250ZXh0X3N0YWNrX2RlcHRoID09IDApCisJICAgIHsKKwkgICAgICB3aXRoaW5fZnVuY3Rpb24gPSAwOworCSAgICAgIC8qIE1ha2UgYSBibG9jayBmb3IgdGhlIGxvY2FsIHN5bWJvbHMgd2l0aGluLiAgKi8KKwkgICAgICBmaW5pc2hfYmxvY2sgKG5ldy0+bmFtZSwgJmxvY2FsX3N5bWJvbHMsIG5ldy0+b2xkX2Jsb2NrcywKKwkJCW5ldy0+c3RhcnRfYWRkciwgdmFsdSwgb2JqZmlsZSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIGF0dGFjaCBsb2NhbF9zeW1ib2xzIHRvIHRoZSBlbmQgb2YgbmV3LT5sb2NhbHMgKi8KKwkgICAgICBpZiAoIW5ldy0+bG9jYWxzKSBuZXctPmxvY2FscyA9IGxvY2FsX3N5bWJvbHM7CisJICAgICAgZWxzZSB7CisJCXN0cnVjdCBwZW5kaW5nICpwOworCisJICAgICAgICBwID0gbmV3LT5sb2NhbHM7CisJICAgICAgICB3aGlsZSAocC0+bmV4dCkgcCA9IHAtPm5leHQ7IAorCSAgICAgICAgcC0+bmV4dCA9IGxvY2FsX3N5bWJvbHM7CisJICAgICAgfQorCSAgICB9CisJfQorCisgICAgICBpZiAoT1M5S19WQVJJQUJMRVNfSU5TSURFX0JMT0NLKGRlc2MsIHByb2Nlc3NpbmdfZ2NjX2NvbXBpbGF0aW9uKSkKKwkvKiBOb3cgcG9wIGxvY2FscyBvZiBibG9jayBqdXN0IGZpbmlzaGVkLiAgKi8KKwlsb2NhbF9zeW1ib2xzID0gbmV3LT5sb2NhbHM7CisgICAgICBicmVhazsKKworCisgICAgY2FzZSBOX1NZTV9TTElORToKKyAgICAgIC8qIFRoaXMgdHlwZSBvZiAic3ltYm9sIiByZWFsbHkganVzdCByZWNvcmRzCisJIG9uZSBsaW5lLW51bWJlciAtLSBjb3JlLWFkZHJlc3MgY29ycmVzcG9uZGVuY2UuCisJIEVudGVyIGl0IGluIHRoZSBsaW5lIGxpc3QgZm9yIHRoaXMgc3ltYm9sIHRhYmxlLiAqLworICAgICAgLyogUmVsb2NhdGUgZm9yIGR5bmFtaWMgbG9hZGluZyBhbmQgZm9yIEVMRiBhY2MgZm4tcmVsYXRpdmUgc3ltcy4gICovCisgICAgICB2YWx1ICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOyAKKyAgICAgIC8qIEZJWE1FOiBsb3NlcyBpZiBzaXplb2YgKGNoYXIgKikgPiBzaXplb2YgKGludCkgKi8KKyAgICAgIHJlY29yZF9saW5lIChjdXJyZW50X3N1YmZpbGUsIChpbnQpbmFtZSwgdmFsdSk7CisgICAgICBicmVhazsKKworICAgIC8qIFRoZSBmb2xsb3dpbmcgc3ltYm9sIHR5cGVzIG5lZWQgdG8gaGF2ZSB0aGUgYXBwcm9wcmlhdGUgb2Zmc2V0IGFkZGVkCisgICAgICAgdG8gdGhlaXIgdmFsdWU7IHRoZW4gd2UgcHJvY2VzcyBzeW1ib2wgZGVmaW5pdGlvbnMgaW4gdGhlIG5hbWUuICAqLworICAgIGNhc2UgTl9TWU1fU1lNOgorCisgICAgICBpZiAobmFtZSkKKwl7CisJICBjaGFyIGRlZnR5cGU7CisJICBjaGFyICpkaXJuLCAqbjsKKwkgIGNoYXIgKnAgPSBzdHJjaHIgKG5hbWUsICc6Jyk7CisJICBpZiAocCA9PSBOVUxMKQorCSAgICBkZWZ0eXBlID0gJ1wwJzsKKwkgIGVsc2UKKwkgICAgZGVmdHlwZSA9IHBbMV07CisKKworCSAgc3dpdGNoIChkZWZ0eXBlKQorCSAgICB7CisJICAgIGNhc2UgJ1MnOgorICAgICAgCSAgICAgIHZhbHUgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCk7CisJICAgICAgbiA9IHN0cnJjaHIobmFtZSwgJy8nKTsKKwkgICAgICBpZiAobiAhPSBOVUxMKSB7CisJCSpuID0gJ1wwJzsKKwkJbisrOworCQlkaXJuID0gbmFtZTsKKwkgICAgICB9IGVsc2UgeworCQluID0gbmFtZTsKKwkJZGlybiA9IE5VTEw7CisJICAgICAgfQorCSAgICAgICpwID0gJ1wwJzsKKwkgICAgICBpZiAoc3ltZmlsZV9kZXB0aCsrID09IDApIHsKKwkJaWYgKGxhc3Rfc291cmNlX2ZpbGUpIHsKKyAgICAgICAgICAJICBlbmRfc3ltdGFiICh2YWx1LCBvYmpmaWxlLCBTRUNUX09GRl9URVhUKTsKKwkJICBlbmRfc3RhYnMgKCk7CisJCX0KKwkJc3RhcnRfc3RhYnMgKCk7CisJCW9zOWtfc3RhYnMgPSAxOworCQlzdGFydF9zeW10YWIgKG4sIGRpcm4sIHZhbHUpOworCQlyZWNvcmRfZGVidWdmb3JtYXQgKCJPUzkiKTsKKwkgICAgICB9IGVsc2UgeworCQlwdXNoX3N1YmZpbGUoKTsKKwkJc3RhcnRfc3ViZmlsZSAobiwgZGlybiE9TlVMTCA/IGRpcm4gOiBjdXJyZW50X3N1YmZpbGUtPmRpcm5hbWUpOworCSAgICAgIH0KKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdmJzoKKwkgICAgY2FzZSAnRic6CisgICAgICAgICAgICAgIHZhbHUgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCk7CisJICAgICAgZnVuY3Rpb25fc3RhYl90eXBlID0gdHlwZTsKKworCSAgICAgIHdpdGhpbl9mdW5jdGlvbiA9IDE7CisJICAgICAgbmV3ID0gcHVzaF9jb250ZXh0ICgwLCB2YWx1KTsKKwkgICAgICBuZXctPm5hbWUgPSBkZWZpbmVfc3ltYm9sICh2YWx1LCBuYW1lLCBkZXNjLCB0eXBlLCBvYmpmaWxlKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdWJzoKKwkgICAgY2FzZSAndic6CisgICAgICAgICAgICAgIHZhbHUgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfREFUQSk7CisJICAgICAgZGVmaW5lX3N5bWJvbCAodmFsdSwgbmFtZSwgZGVzYywgdHlwZSwgb2JqZmlsZSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBkZWZpbmVfc3ltYm9sICh2YWx1LCBuYW1lLCBkZXNjLCB0eXBlLCBvYmpmaWxlKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOX1NZTV9TRToKKwlpZiAoLS1zeW1maWxlX2RlcHRoICE9IDApCisJICBzdGFydF9zdWJmaWxlKHBvcF9zdWJmaWxlKCksIGN1cnJlbnRfc3ViZmlsZS0+ZGlybmFtZSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBjb21wbGFpbiAoJnVua25vd25fc3ltdHlwZV9jb21wbGFpbnQsCisJCWxvY2FsX2hleF9zdHJpbmcoKHVuc2lnbmVkIGxvbmcpIHR5cGUpKTsKKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgTl9TWU1fQ01QTFI6CisgICAgICBicmVhazsKKyAgICB9CisgIHByZXZpb3VzX3N0YWJfY29kZSA9IHR5cGU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3ltX2ZucyBvczlrX3N5bV9mbnMgPQoreworICBiZmRfdGFyZ2V0X29zOWtfZmxhdm91ciwKKyAgb3M5a19uZXdfaW5pdCwJLyogc3ltX25ld19pbml0OiBpbml0IGFueXRoaW5nIGdibCB0byBlbnRpcmUgc3ltdGFiICovCisgIG9zOWtfc3ltZmlsZV9pbml0LAkvKiBzeW1faW5pdDogcmVhZCBpbml0aWFsIGluZm8sIHNldHVwIGZvciBzeW1fcmVhZCgpICovCisgIG9zOWtfc3ltZmlsZV9yZWFkLAkvKiBzeW1fcmVhZDogcmVhZCBhIHN5bWJvbCBmaWxlIGludG8gc3ltdGFiICovCisgIG9zOWtfc3ltZmlsZV9maW5pc2gsCS8qIHN5bV9maW5pc2g6IGZpbmlzaGVkIHdpdGggZmlsZSwgY2xlYW51cCAqLworICBkZWZhdWx0X3N5bWZpbGVfb2Zmc2V0cywKKwkJCS8qIHN5bV9vZmZzZXRzOiBwYXJzZSB1c2VyJ3Mgb2Zmc2V0cyB0byBpbnRlcm5hbCBmb3JtKi8KKyAgTlVMTAkJCS8qIG5leHQ6IHBvaW50ZXIgdG8gbmV4dCBzdHJ1Y3Qgc3ltX2ZucyAqLworfTsKKwordm9pZAorX2luaXRpYWxpemVfb3M5a3JlYWQgKCkKK3sKKyAgYWRkX3N5bXRhYl9mbnMoJm9zOWtfc3ltX2Zucyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvb3NmLXNoYXJlL0FUMzg2L2NtYV90aHJlYWRfaW8uaCBiL2dkYi9vc2Ytc2hhcmUvQVQzODYvY21hX3RocmVhZF9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MGRiYTEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvb3NmLXNoYXJlL0FUMzg2L2NtYV90aHJlYWRfaW8uaApAQCAtMCwwICsxLDQ1NyBAQAorLyogCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBPUEVOIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQy4KKyAqIChjKSBDb3B5cmlnaHQgMTk5MC0xOTk2IEhFV0xFVFQtUEFDS0FSRCBDT01QQU5ZCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBESUdJVEFMIEVRVUlQTUVOVCBDT1JQT1JBVElPTgorICogKGMpIENvcHlyaWdodCAxOTkxLCAxOTkyIFNpZW1lbnMtTml4ZG9yZiBJbmZvcm1hdGlvbiBTeXN0ZW1zCisgKiBUbyBhbnlvbmUgd2hvIGFja25vd2xlZGdlcyB0aGF0IHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQKKyAqIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHk6IHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGlzIGZpbGUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgbm90aWNlIGFwcGVhcnMgaW4KKyAqIGFsbCBzb3VyY2UgY29kZSBjb3BpZXMsIGFuZCB0aGF0IG5vbmUgb2YgdGhlIG5hbWVzIGxpc3RlZCBhYm92ZSBiZSB1c2VkCisgKiBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBOb25lIG9mIHRoZXNlIG9yZ2FuaXphdGlvbnMKKyAqIG1ha2VzIGFueSByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZS4KKyAqLworLyoKKyAqCUhlYWRlciBmaWxlIGZvciB0aHJlYWQgc3luY2hyb3Vub3VzIEkvTworICovCisKKyNpZm5kZWYgQ01BX1RIUkVBRF9JTworI2RlZmluZSBDTUFfVEhSRUFEX0lPCisKKy8qCisgKiAgSU5DTFVERSBGSUxFUworICovCisKKyNpbmNsdWRlIDxjbWFfY29uZmlnLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxjbWEuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGNtYV9pbml0Lmg+CisjaW5jbHVkZSA8Y21hX2Vycm9ycy5oPgorCisvKgorICogQ09OU1RBTlRTCisgKi8KKworLyoKKyAqIERlZmluZSBzeW1ib2xzIHdoaWNoIGluZGljYXRlIHdoZXRoZXIgdG8gY29tcGlsZSBjb2RlIGZvciBvYnNvbGV0ZSAKKyAqICJub24tYmxvY2tpbmcgbW9kZSIgZmxhZ3M6ICBGTkRFTEFZIGFuZCBGTkJMT0NLLiAgSWYgdGhlIG9ic29sZXRlCisgKiBzeW1ib2xzIGFyZSBkZWZpbmVkLCBhbmQgaWYgdGhlaXIgcmVwbGFjZW1lbnQgc3ltYm9scyBhcmUgZGVmaW5lZCAKKyAqIGFuZCBhcmUgZGlmZmVyZW50IG9yIGlmIHRoZXkgYXJlIHVuZGVmaW5lZCwgdGhlbiBkZWZpbmUgYSBzeW1ib2wKKyAqIHRoYXQgc2F5cyB0byBjb21waWxlIHRoZSBjb2RlIGluOyBvdGhlcndpc2Ugbm8gY29kZSB3aWxsIGJlIGNvbXBpbGVkCisgKiBmb3IgdGhlc2Ugb2Jzb2xldGUgc3ltYm9scy4KKyAqLworI2lmZGVmIEZOREVMQVkKKyMgaWZkZWYgT19OREVMQVkKKyMgIGlmIE9fTkRFTEFZICE9IEZOREVMQVkKKyMgICBkZWZpbmUgX0NNQV9GTkRFTEFZXworIyAgZW5kaWYKKyMgZWxzZQorIyAgZGVmaW5lIF9DTUFfRk5ERUxBWV8KKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRk5CTE9DSworIyBpZmRlZiBPX05PTkJMT0NLCisjICBpZiBPX05PTkJMT0NLICE9IEZOQkxPQ0sKKyMgICBkZWZpbmUgX0NNQV9GTkJMT0NLXworIyAgZW5kaWYKKyMgZWxzZQorIyAgZGVmaW5lIF9DTUFfRk5CTE9DS18KKyMgZW5kaWYKKyNlbmRpZgorCisKK2V4dGVybiBjbWFfdF9ib29sZWFuIGNtYV9pc19vcGVuKGludCk7CisvKgorICogTWF4aW11bSBudW1iZXIgb2YgZmlsZXMgKGllLCBtYXhfZmQrMSkKKyAqLworI2RlZmluZSBjbWFfX2NfbXhfZmlsZQlGRF9TRVRTSVpFCisKKy8qCisgKiBOdW1iZXIgb2YgYml0cyBwZXIgZmlsZSBkZXNjcmlwdG9yIGJpdCBtYXNrIChpZSBudW1iZXIgb2YgYnl0ZXMgKiBiaXRzL2J5dGUpCisgKi8KKyNkZWZpbmUgY21hX19jX25icG0JTkZEQklUUworCisvKgorICogVFlQRSBERUZJTklUSU9OUworICovCisKK3R5cGVkZWYgZW51bSBDTUFfX1RfSU9fVFlQRSB7CisgICAgY21hX19jX2lvX3JlYWQgICA9IDAsCisgICAgY21hX19jX2lvX3dyaXRlICA9IDEsCisgICAgY21hX19jX2lvX2V4Y2VwdCA9IDIKKyAgICB9IGNtYV9fdF9pb190eXBlOworI2RlZmluZSBjbWFfX2NfbWF4X2lvX3R5cGUJMgorCisvKgorICogRnJvbSBvdXIgbG9jYWwgPHN5cy90eXBlcy5oPjoKKyAqCisgKiAgdHlwZWRlZiBsb25nICAgIGZkX21hc2s7CisgKgorICogIHR5cGVkZWYgc3RydWN0IGZkX3NldCB7CisgKiAgICAgICAgICBmZF9tYXNrIGZkc19iaXRzW2hvd21hbnkoRkRfU0VUU0laRSwgTkZEQklUUyldOworICogIH0gZmRfc2V0OworICoKKyAqLwordHlwZWRlZiBmZF9tYXNrIGNtYV9fdF9tYXNrOwordHlwZWRlZiBmZF9zZXQgIGNtYV9fdF9maWxlX21hc2s7CisKKworLyoKKyAqICBHTE9CQUwgREFUQQorICovCisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBmaWxlcyAoaWUsIG1heF9mZCsxKSBhcyBkZXRlcm1pbmVkIGJ5IGdldGR0YWJsZXNpemUoKS4KKyAqLworZXh0ZXJuIGludAljbWFfX2dfbXhfZmlsZTsKKworLyoKKyAqIE51bWJlciBvZiBzdWJtYXNrcyAoaWUgImludCIgc2l6ZWQgY2h1bmtzKSBwZXIgZmlsZSBkZXNjcmlwdG9yIG1hc2sgYXMKKyAqIGRldGVybWluZWQgYnkgZ2V0ZHRhYmxlc2l6ZSgpLgorICovCitleHRlcm4gaW50CWNtYV9fZ19uc3BtOworCisvKgorICogTUFDUk9TCisgKi8KKworLyoKKyAqIERlZmluZSBhIGNvbnN0YW50IGZvciB0aGUgZXJybm8gdmFsdWUgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVlc3RlZAorICogb3BlcmF0aW9uIHdhcyBub3QgcGVyZm9ybWVkIGJlY2F1c2UgaXQgd291bGQgYmxvY2sgdGhlIHByb2Nlc3MuCisgKi8KKyMgZGVmaW5lIGNtYV9faXNfYmxvY2tpbmcocykgXAorICAgICgocyA9PSBFQUdBSU4pIHx8IChzID09IEVXT1VMREJMT0NLKSB8fCAocyA9PSBFSU5QUk9HUkVTUykgfHwgXAorICAgICAocyA9PSBFQUxSRUFEWSkgfHwgKHMgPT0gRURFQURMSykpCisKKy8qCisqCUl0IGlzIG5lY2Vzc2FyeSB0byBpc3N1ZSBhbiBJL08gZnVuY3Rpb24sIGJlZm9yZSBjYWxsaW5nIGNtYV9faW9fd2FpdCgpCisqCWluIHRoZSBmb2xsb3dpbmcgY2FzZXM6CisqCisqCQkqCVRoaXMgZmlsZSBkZXNjcmlwdG9yIGhhcyBiZWVuIHNldCBub24tYmxvY2tpbmcgYnkgQ01BCisqCQkqCVRoaXMgZmlsZSBkZXNjcmlwdG9yIGhhcyBiZWVuIHNldCBub24tYmxvY2tpbmcgYnkgdGhlIHVzZXIuCisqLworCisjZGVmaW5lIGNtYV9faXNzdWVfaW9fY2FsbChmZCkJCQkJCVwKKwkoIChjbWFfX2dfZmlsZVtmZF0tPm5vbl9ibG9ja2luZykgfHwgXAorCSAgKGNtYV9fZ19maWxlW2ZkXS0+dXNlcl9mbC51c2VyX25vbl9ibG9ja2luZykgKQorCisKKyNkZWZpbmUgY21hX19zZXRfdXNlcl9ub25ibG9ja2luZyhmbGFncykgXAorCisvKgorICogRGV0ZXJtaW5lIGlmIHRoZSBmaWxlIGlzIG9wZW4KKyAqLworLyoKKyAqIElmIHRoZSBmaWxlIGdldHMgY2xvc2VkIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBtdXRleCBjbWFfX2dfZmlsZVtyZmRdCisgKiBnZXRzIHNldCB0byBudWxsLiBUaGlzIHJlc3VsdHMgaW4gYSBjcmFzaCBpZiBOREVCVUcgaXMgc2V0IHRvIDAgCisgKiBzaW5jZSBjbWFfX2ludF9sb2NrIHRyaWVzIHRvIGRlcmVmZXJlbmNlIGl0IHRvIHNldCB0aGUgbXV0ZXggb3duZXJzaGlwIAorICogYWZ0ZXIgaXQgZ2V0cyB0aGUgbXV0ZXguIFRoZSBmb2xsb3dpbmcgd2lsbCBzdGlsbCBzZXQgdGhlIG93bmVyc2hpcAorICogaW4gY21hX19pbnRfbG9jayBzbyB3ZSdsbCBzZXQgaXQgYmFjayB0byBub29uZSBpZiBjbWFfX2dfZmlsZSBpcyBudWxsCisgKiB3aGVuIHdlIGNvbWUgYmFjayBqdXN0IGluIGNhc2UgaXQgbWF0dGVycy4gSXQgc2hvdWxkbid0IHNpbmNlIGl0cyBubworICogbG9uZ2VyIGluIHVzZSBidXQuLi4uLiAKKyAqIENhbGxlcnMgb2YgdGhpcyBzaG91bGQgcmVjaGVjayBjbWFfX2dfZmlsZSBhZnRlciB0aGUgcmVzZXJ2YXRpb24gdG8KKyAqIG1ha2Ugc3VyZSBjb250aW51ZWluZyBtYWtlcyBzZW5zZS4KKyAqLworI2RlZmluZSBjbWFfX2ZkX3Jlc2VydmUocmZkKSAJXAorCQl7IFwKKwkJY21hX190X2ludF9tdXRleCAqX19tdXRleF9fOyBcCisJCV9fbXV0ZXhfXyA9IGNtYV9fZ19maWxlW3JmZF0tPm11dGV4OyBcCisJCWNtYV9faW50X2xvY2sgKF9fbXV0ZXhfXyk7IFwKKwkJaWYoY21hX19nX2ZpbGVbcmZkXSA9PSAoY21hX190X2ZpbGVfb2JqICopY21hX2NfbnVsbF9wdHIpIFwKKwkJCWNtYV9faW50X3VubG9jayhfX211dGV4X18pOyBcCisJCX0KKwkJCisKKy8qCisgKiBVbnJlc2VydmUgYSBmaWxlIGRlc2NyaXB0b3IKKyAqLworI2RlZmluZSBjbWFfX2ZkX3VucmVzZXJ2ZSh1ZmQpCWNtYV9faW50X3VubG9jayAoY21hX19nX2ZpbGVbdWZkXS0+bXV0ZXgpCisKKy8qCisgKiBBTkQgdG9nZXRoZXIgdHdvIHNlbGVjdCBmaWxlIGRlc2NyaXB0b3IgbWFza3MKKyAqLworI2RlZmluZSBjbWFfX2ZkbV9hbmQodGFyZ2V0LGEsYikJCQkJCVwKKwl7CQkJCQkJCQlcCisJaW50IF9faV9fID0gY21hX19nX25zcG07CQkJCQlcCisJd2hpbGUgKF9faV9fLS0pCQkJCQkJCVwKKwkgICAgKHRhcmdldCktPmZkc19iaXRzW19faV9fXSA9CQkJCQlcCisJCShhKS0+ZmRzX2JpdHNbX19pX19dICYgKGIpLT5mZHNfYml0c1tfX2lfX107CQlcCisJfQorCisvKgorICogQ2xlYXIgYSBiaXQgaW4gYSBzZWxlY3QgZmlsZSBkZXNjcmlwdG9yIG1hc2sKKyAqCisgKiBGRF9DTFIobiwgcCkgIDo9ICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJj0gfigxIDw8ICgobikgJSBORkRCSVRTKSkpCisgKi8KKyNkZWZpbmUgY21hX19mZG1fY2xyX2JpdChuLHApCUZEX0NMUiAobiwgcCkKKworLyoKKyAqIENvcHkgdGhlIGNvbnRlbnRzIG9mIG9uZSBmaWxlIGRlc2NyaXB0b3IgbWFzayBpbnRvIGFub3RoZXIuICBJZiB0aGUgCisgKiBkZXN0aW5hdGlvbiBvcGVyYW5kIGlzIG51bGwsIGRvIG5vdGhpbmc7IGlmIHRoZSBzb3VyY2Ugb3BlcmFuZCBpcyBudWxsLCAKKyAqIHNpbXBseSB6ZXJvIHRoZSBkZXN0aW5hdGlvbi4KKyAqLworI2RlZmluZSBjbWFfX2ZkbV9jb3B5KHNyYyxkc3QsbmZkcykgewkJCQkJXAorCWlmIChkc3QpCQkJCQkJCVwKKwkgICAgaWYgKHNyYykgewkJCQkJCQlcCisJCWNtYV9fdF9tYXNrICpfX3NfXyA9IChjbWFfX3RfbWFzayAqKShzcmMpOwkJXAorCQljbWFfX3RfbWFzayAqX19kX18gPSAoY21hX190X21hc2sgKikoZHN0KTsJCVwKKwkJaW50IF9faV9fOwkJCQkJCVwKKwkJZm9yIChfX2lfXyA9IDA7IF9faV9fIDwgKG5mZHMpOyBfX2lfXyArPSBjbWFfX2NfbmJwbSkJXAorCQkgICAgKl9fZF9fKysgPSAqX19zX18rKzsJCQkJXAorCQl9CQkJCQkJCVwKKwkgICAgZWxzZQkJCQkJCQlcCisJCWNtYV9fZmRtX3plcm8gKGRzdCk7CQkJCQlcCisJICAgIH0KKworLyoKKyAqIFRvIGluY3JlbWVudCBjb3VudCBmb3IgZWFjaCBiaXQgc2V0IGluIGZkIC0gbWFzaworICovCisjZGVmaW5lIGNtYV9fZmRtX2NvdW50X2JpdHMobWFwLGNvdW50KQkJCQkJXAorCXsJCQkJCQkJCVwKKwlpbnQJX19pX18gPSBjbWFfX2dfbnNwbTsJCQkJCVwKKwl3aGlsZSAoX19pX18tLSkgewkJCQkJCVwKKwkgICAgY21hX190X21hc2sgICAgX190bV9fOwkJCQkgICAgICAgIFwKKwkgICAgX190bV9fID0gKG1hcCktPmZkc19iaXRzW19faV9fXTsJCQkJXAorCSAgICB3aGlsZShfX3RtX18pIHsJCQkJCQlcCisJCShjb3VudCkrKzsJCQkJCQlcCisJCV9fdG1fXyAmPSB+KF9fdG1fXyAmICgtX190bV9fKSk7IC8qIEFzc3VtZXMgMidzIGNvbXAgKi8JXAorCQl9CQkJCQkJCVwKKwkgICAgfQkJCQkJCQkJXAorCX0KKworLyoKKyAqIFRlc3QgaWYgYSBiaXQgaXMgc2V0IGluIGEgc2VsZWN0IGZpbGUgZGVzY3JpcHRvciBtYXNrCisgKgorICogRkRfSVNTRVQobixwKSAgOj0gICgocCktPmZkc19iaXRzWyhuKS9ORkRCSVRTXSAmICgxIDw8ICgobikgJSBORkRCSVRTKSkpCisgKi8KKyNkZWZpbmUgY21hX19mZG1faXNfc2V0KG4scCkJRkRfSVNTRVQgKG4sIHApCisKKy8qCisgKiBPUiB0b2dldGhlciB0d28gc2VsZWN0IGZpbGUgZGVzY3JpcHRvciBtYXNrcworICovCisjZGVmaW5lIGNtYV9fZmRtX29yKHRhcmdldCxhLGIpCQkJCQkJXAorCXsJCQkJCQkJCVwKKwlpbnQgX19pX18gPSBjbWFfX2dfbnNwbTsJCQkJCVwKKwl3aGlsZSAoX19pX18tLSkJCQkJCQkJXAorCSAgICAodGFyZ2V0KS0+ZmRzX2JpdHNbX19pX19dID0JCQkJCVwKKwkJKGEpLT5mZHNfYml0c1tfX2lfX10gfCAoYiktPmZkc19iaXRzW19faV9fXTsJCVwKKwl9CisKKy8qCisgKiBTZXQgYSBiaXQgaW4gYSBzZWxlY3QgZmlsZSBkZXNjcmlwdG9yIG1hc2sKKyAqIAorICogRkRfU0VUKG4scCkgIDo9ICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gfD0gKDEgPDwgKChuKSAlIE5GREJJVFMpKSkKKyAqLworI2RlZmluZSBjbWFfX2ZkbV9zZXRfYml0KG4scCkJRkRfU0VUIChuLCBwKQorCisvKgorICogQ2xlYXIgYSBzZWxlY3QgZmlsZSBkZXNjcmlwdG9yIG1hc2suCisgKi8KKyNkZWZpbmUgY21hX19mZG1femVybyhuKQkJCQkJCVwKKwljbWFfX21lbXNldCAoKGNoYXIgKikgbiwgMCwgY21hX19nX25zcG0gKiBzaXplb2YoY21hX190X21hc2spKQorCisKKwwKKy8qCisgKiBDTUEgInRocmVhZC1zeW5jaHJvbm91cyIgSS9PIHJlYWQvd3JpdGUgb3BlcmF0aW9ucworICovCisKKyAgICAvKgorICAgICAqIFNpbmNlIGFsbCBDTUEgInRocmVhZC1zeW5jaHJvbm91cyIgSS9PIChyZWFkIG9yIHdyaXRlKSBvcGVyYXRpb25zIG9uIAorICAgICAqIFUqaXggZm9sbG93IHRoZSBleGFjdCBzYW1lIHN0cnVjdHVyZSwgdGhlIHdyYXBwZXIgcm91dGluZXMgaGF2ZSBiZWVuCisgICAgICogY29uZGVuc2VkIGludG8gYSBtYWNyby4KKyAgICAgKgorICAgICAqIFRoZSBzdGVwcyBwZXJmb3JtZWQgYXJlIGFzIGZvbGxvd3M6CisgICAgICoJMS4gQ2hlY2sgdGhhdCB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGEgbGVnaXRpbWF0ZSB2YWx1ZS4KKyAgICAgKgkyLiBDaGVjayB0aGF0IHRoZSBlbnRyeSBpbiB0aGUgQ01BIGZpbGUgImRhdGFiYXNlIiB3aGljaCBjb3JyZXNwb25kcyB0byAKKyAgICAgKgkgICAgdGhlIGZpbGUgZGVzY3JpcHRvciBpbmRpY2F0ZXMgdGhhdCB0aGUgImZpbGUiIHdhcyAib3BlbmVkIiBieSBDTUEuCisgICAgICogIDMuIFJlc2VydmUgdGhlIGZpbGUsIHRvIHNlcmlhbGl6ZWQgYWNjZXNzIHRvIGZpbGVzLiAgVGhpcyBub3Qgb25seSAKKyAgICAgKgkgICAgc2ltcGxpZmllcyB0aGluZ3MsIGJ1dCBhbHNvIGRlZmVuZHMgYWdhaW5zdCBub24tcmVlbnRyYW5jeS4KKyAgICAgKiAgNC4gSWYgdGhlICJmaWxlIiBpcyAic2V0IiBmb3Igbm9uLWJsb2NraW5nIEkvTywgY2hlY2sgaWYgd2UKKyAgICAgKiAgICAgIGhhdmUgYWN0dWFsbHkgc2V0IHRoZSBmaWxlIG5vbi1ibG9ja2luZyB5ZXQsIGFuZCBpZiBub3QgZG8gc28uCisgICAgICoJICAgIFRoZW4sIGlzc3VlIHRoZSBJL08gb3BlcmFudGlvbi4KKyAgICAgKgkgICAgU3VjY2VzcyBvciBmYWlsdXJlIGlzIHJldHVybmVkIGltbWVkaWF0ZWx5LCBhZnRlciB1bnJlc2VydmluZyB0aGUgCisgICAgICoJICAgIGZpbGUuICBJZiB0aGUgZXJyb3IgaW5kaWNhdGVzIHRoYXQgdGhlIG9wZXJhdGlvbiB3b3VsZCBoYXZlIGNhdXNlZAorICAgICAqCSAgICB0aGUgcHJvY2VzcyB0byBibG9jaywgY29udGludWUgdG8gdGhlIG5leHQgc3RlcC4KKyAgICAgKgk1LiBUaGUgSS9PIHByb2xvZyBhZGRzIHRoaXMgImZpbGUiIHRvIHRoZSBnbG9iYWwgYml0IG1hc2ssIHdoaWNoIAorICAgICAqCSAgICByZXByZXNlbnRzIGFsbCAiZmlsZXMiIHdoaWNoIGhhdmUgdGhyZWFkcyB3YWl0aW5nIHRvIHBlcmZvcm0gSS9PIG9uIAorICAgICAqCSAgICB0aGVtLCBhbmQgY2F1c2VzIHRoZSB0aHJlYWQgdG8gYmxvY2sgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBmb3IKKyAgICAgKgkgICAgdGhpcyAiZmlsZSIuICBQZXJpb2RpY2FsbHksIGEgc2VsZWN0IGlzIGRvbmUgb24gdGhpcyBnbG9iYWwgYml0IAorICAgICAqCSAgICBtYXNrLCBhbmQgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZXMgY29ycmVzcG9uZGluZyB0byAiZmlsZXMiIHdoaWNoIAorICAgICAqCSAgICBhcmUgcmVhZHkgZm9yIEkvTyBhcmUgc2lnbmFsZWQsIHJlbGVhc2luZyB0aG9zZSB3YWl0aW5nIHRocmVhZHMgdG8KKyAgICAgKgkgICAgcGVyZm9ybSB0aGVpciBJL08uCisgICAgICogIDYuIFdoZW4gdGhlIHRocmVhZCByZXR1cm5zIGZyb20gdGhlIEkvTyBwcm9sb2csIGl0IGNhbiAoaG9wZWZ1bGx5KSAKKyAgICAgKgkgICAgcGVyZm9ybSBpdHMgb3BlcmF0aW9uIHdpdGhvdXQgYmxvY2tpbmcgdGhlIHByb2Nlc3MuCisgICAgICoJNy4gVGhlIEkvTyBlcGlsb2cgY2xlYXJzIHRoZSBiaXQgaW4gdGhlIGdsb2JhbCBtYXNrIGFuZC9vciBzaWduYWxzIHRoZSAKKyAgICAgKgkgICAgdGhlIG5leHQgdGhyZWFkIHdhaXRpbmcgZm9yIHRoaXMgImZpbGUiLCBhcyBhcHByb3ByaWF0ZS4KKyAgICAgKiAgOC4gSWYgdGhlIEkvTyBmYWlsZWQsIGNvbnRpbnVlIHRvIGxvb3AuCisgICAgICoJOS4gRmluYWxseSwgdGhlICJmaWxlIiBpcyB1bnJlc2VydmVkLCBhcyB3ZSdyZSBkb25lIHdpdGggaXQsIGFuZCB0aGUKKyAgICAgKgkgICAgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKgorICAgICAqIE5vdGU6ICBjdXJyZW50bHksIHdlIGJlbGlldmUgdGhhdCB0aW1lc2xpY2luZyB3aGljaCBpcyBiYXNlZCBvbiB0aGUKKyAgICAgKgkgICAgdmlydHVhbC10aW1lIHRpbWVyIGRvZXMgbm90IGNhdXNlIHN5c3RlbSBjYWxscyB0byByZXR1cm4gRUlOVFIuICAKKyAgICAgKgkgICAgVGhyZWZvcmUsIGFueSBFSU5UUiByZXR1cm5zIGFyZSByZWxheWVkIGRpcmVjdGx5IHRvIHRoZSBjYWxsZXIuCisgICAgICoJICAgIE9uIHBsYXRmb3JtcyB3aGljaCBkbyBub3Qgc3VwcG9ydCBhIHZpcnR1YWwtdGltZSB0aW1lciwgdGhlIGNvZGUKKyAgICAgKgkgICAgc2hvdWxkIHByb2JhYmx5IGNhdGNoIEVJTlRSIHJldHVybnMgYW5kIHJlc3RhcnQgdGhlIHN5c3RlbSBjYWxsLgorICAgICAqLworCisvKgorICogVGhpcyBtYWNybyBpcyB1c2VkIGZvciBib3RoIHJlYWQtdHlwZSBhbmQgd3JpdGUtdHlwZSBmdW5jdGlvbnMuCisgKgorICogTm90ZTogIHRoZSBzZWNvbmQgY2FsbCB0byAiZnVuYyIgbWF5IHJlcXVpcmUgYmVpbmcgYnJhY2tldGVkIGluIGEKKyAqCSAgY21hX19pbnRlcnJ1cHRfZGlzYWJsZS9jbWFfX2ludGVycnVwdF9lbmFibGUgcGFpciwgYnV0IHdlJ2xsIAorICoJICB3YWl0IGFuZCBzZWUgaWYgdGhpcyBpcyBuZWNlc3NhcnkuCisgKi8KKyNkZWZpbmUgY21hX190c19mdW5jKGZ1bmMsZmQsYXJnbGlzdCx0eXBlLHBvc3RfcHJvY2VzcykJeyBcCisgICAgY21hX3RfaW50ZWdlciAgIF9fcmVzX187IFwKKyAgICBjbWFfdF9ib29sZWFuICAgX19kb25lX18gPSBjbWFfY19mYWxzZTsgXAorICAgIGlmICgoZmQgPCAwKSB8fCAoZmQgPj0gY21hX19nX214X2ZpbGUpKSByZXR1cm4gKGNtYV9fc2V0X2Vycm5vIChFQkFERiksIC0xKTsgXAorICAgIGlmICghY21hX19pc19vcGVuKGZkKSkgcmV0dXJuIChjbWFfX3NldF9lcnJubyAoRUJBREYpLCAtMSk7IFwKKyAgICBjbWFfX2ZkX3Jlc2VydmUgKGZkKTsgXAorICAgIGlmICghY21hX19pc19vcGVuKGZkKSkgcmV0dXJuIChjbWFfX3NldF9lcnJubyAoRUJBREYpLCAtMSk7IFwKKyAgICBpZiAoY21hX19pc3N1ZV9pb19jYWxsKGZkKSkge1wKKwlpZiAoKCFjbWFfX2dfZmlsZVtmZF0tPnNldF9ub25fYmxvY2tpbmcpICYmIFwKKwkJKGNtYV9fZ19maWxlW2ZkXS0+bm9uX2Jsb2NraW5nID09IGNtYV9jX3RydWUpKSBcCisJICAgIGNtYV9fc2V0X25vbmJsb2NraW5nKGZkKTsgXAorICAgICAgICBjbWFfX2ludGVycnVwdF9kaXNhYmxlICgwKTsgXAorCVRSWSB7IFwKKwkgICAgX19yZXNfXyA9IGZ1bmMgYXJnbGlzdDsgXAorCSAgICB9IFwKKwlDQVRDSF9BTEwgeyBcCisJICAgIGNtYV9faW50ZXJydXB0X2VuYWJsZSAoMCk7IFwKKwkgICAgY21hX19mZF91bnJlc2VydmUgKGZkKTsgXAorCSAgICBSRVJBSVNFOyBcCisJICAgIH0gXAorCUVORFRSWSBcCisgICAgICAgIGNtYV9faW50ZXJydXB0X2VuYWJsZSAoMCk7IFwKKwlpZiAoKF9fcmVzX18gIT0gLTEpIFwKKwkJfHwgKCFjbWFfX2lzX2Jsb2NraW5nIChlcnJubykpIFwKKwkJfHwgKGNtYV9fZ19maWxlW2ZkXS0+dXNlcl9mbC51c2VyX25vbl9ibG9ja2luZykpIFwKKwkgICAgX19kb25lX18gPSBjbWFfY190cnVlOyBcCisJfSBcCisgICAgaWYgKF9fZG9uZV9fKSB7IFwKKwljbWFfX2ZkX3VucmVzZXJ2ZSAoZmQpOyBcCisJfSBcCisgICAgZWxzZSB7IFwKKwlUUlkgeyBcCisJICAgIGNtYV9faW9fcHJvbG9nICh0eXBlLCBmZCk7IFwKKwkgICAgd2hpbGUgKCFfX2RvbmVfXykgeyBcCisJCWNtYV9faW9fd2FpdCAodHlwZSwgZmQpOyBcCisJCV9fcmVzX18gPSBmdW5jIGFyZ2xpc3Q7IFwKKwkJaWYgKChfX3Jlc19fICE9IC0xKSBcCisJCQl8fCAoIWNtYV9faXNfYmxvY2tpbmcgKGVycm5vKSkgXAorCQkJfHwgKGNtYV9fZ19maWxlW2ZkXS0+dXNlcl9mbC51c2VyX25vbl9ibG9ja2luZykpIFwKKwkJICAgIF9fZG9uZV9fID0gY21hX2NfdHJ1ZTsgXAorCQl9IFwKKwkgICAgfSBcCisJRklOQUxMWSB7IFwKKwkgICAgY21hX19pb19lcGlsb2cgKHR5cGUsIGZkKTsgXAorCSAgICBjbWFfX2ZkX3VucmVzZXJ2ZSAoZmQpOyBcCisJICAgIH0gXAorCUVORFRSWSBcCisJfSBcCisgICAgaWYgKF9fcmVzX18gIT0gLTEpICBwb3N0X3Byb2Nlc3M7IFwKKyAgICByZXR1cm4gX19yZXNfXzsgIFwKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNpbmNlIG1vc3QgQ01BICJ0aHJlYWQtc3luY2hyb25vdXMiIEkvTyAoIm9wZW4iLXR5cGUpIG9wZXJhdGlvbnMgb24gCisgICAgICogVSppeCBmb2xsb3cgdGhlIGV4YWN0IHNhbWUgc3RydWN0dXJlLCB0aGUgd3JhcHBlciByb3V0aW5lcyBoYXZlIGJlZW4KKyAgICAgKiBjb25kZW5zZWQgaW50byBhIG1hY3JvLgorICAgICAqCisgICAgICogVGhlIHN0ZXBzIHBlcmZvcm1lZCBhcmUgYXMgZm9sbG93czoKKyAgICAgKgkxLiBJc3N1ZSB0aGUgb3BlbiBmdW5jdGlvbi4KKyAgICAgKgkyLiBJZiB0aGUgdmFsdWUgcmV0dXJuZWQgaW5kaWNhdGVzIGFuIGVycm9yLCByZXR1cm4gaXQgdG8gdGhlIGNhbGxlci4KKyAgICAgKiAgMy4gSWYgdGhlIGZpbGUgZGVzY3JpcHRvciByZXR1cm5lZCBpcyBsYXJnZXIgdGhhbiB3aGF0IHdlIHRoaW5rIGlzIHRoZQorICAgICAqCSAgICBtYXhpbXVtIHZhbHVlIChpZSBpZiBpdCBpcyB0b28gYmlnIGZvciBvdXIgZGF0YWJhc2UpIHRoZW4gYnVnY2hlY2suCisgICAgICogIDQuICJPcGVuIiB0aGUgImZpbGUiIGluIHRoZSBDTUEgZmlsZSBkYXRhYmFzZS4KKyAgICAgKgk1LiBSZXR1cm4gdGhlIGZpbGUgZGVzY3JpcHRvciB2YWx1ZSB0byB0aGUgY2FsbGVyLgorICAgICAqCisgICAgICogRklYLU1FOiBmb3IgdGhlIHRpbWUgYmVpbmcsIGlmIHRoZSBJL08gb3BlcmF0aW9uIHJldHVybnMgRUlOVFIsIHdlIAorICAgICAqCSAgICBzaW1wbHkgcmV0dXJuIGl0IHRvIHRoZSBjYWxsZXI7IGV2ZW50dWFsbHksIHdlIHNob3VsZCBjYXRjaCB0aGlzIAorICAgICAqCSAgICBhbmQgImRvIHRoZSByaWdodCB0aGluZyIgKGlmIHdlIGNhbiBmaWd1cmUgb3V0IHdoYXQgdGhhdCBpcykuCisgICAgICovCisKKy8qCisgKiBUaGlzIG1hY3JvIGlzIHVzZWQgZm9yIGFsbCAib3BlbiItdHlwZSBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIGEgc2luZ2xlIGZpbGUKKyAqIGRlc2NpcHRvciBieSBpbW1lZGlhdGUgdmFsdWUuCisgKi8KKyNkZWZpbmUgY21hX190c19vcGVuKGZ1bmMsYXJnbGlzdCxwb3N0X3Byb2Nlc3MpICB7CQlcCisgICAgaW50CV9fZmRfXzsJCQkJCQkJXAorICAgIFRSWSB7CQkJCQkJCVwKKwljbWFfX2ludF9pbml0ICgpOwkJCQkJXAorCWNtYV9faW50X2xvY2sgKGNtYV9fZ19pb19kYXRhX211dGV4KTsJCQlcCisJX19mZF9fID0gZnVuYyBhcmdsaXN0OwkJCQkJXAorCWNtYV9faW50X3VubG9jayAoY21hX19nX2lvX2RhdGFfbXV0ZXgpOwkJCVwKKwlpZiAoX19mZF9fID49IDAgJiYgX19mZF9fIDwgY21hX19nX214X2ZpbGUpCQlcCisJICAgIHBvc3RfcHJvY2VzczsJCQkJCVwKKwl9CQkJCQkJCVwKKyAgICBDQVRDSF9BTEwJCQkJCQkJXAorCXsJCQkJCQkJXAorCWNtYV9fc2V0X2Vycm5vIChFQkFERik7CQkJCQlcCisJX19mZF9fID0gLTE7CQkJCQkJXAorCX0JCQkJCQkJXAorICAgIEVORFRSWQkJCQkJCQlcCisgICAgaWYgKF9fZmRfXyA+PSBjbWFfX2dfbXhfZmlsZSkJCQkJXAorCWNtYV9fYnVnY2hlY2sgKCJjbWFfX3RzX29wZW46ICBmZCBpcyB0b28gbGFyZ2UiKTsJXAorICAgIHJldHVybiBfX2ZkX187CQkJCQkJXAorICAgIH0KKy8qCisgKiBUaGlzIG1hY3JvIGlzIHVzZWQgZm9yIGFsbCAib3BlbiItdHlwZSBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIGEgcGFpciBvZiBmaWxlCisgKiBkZXNjaXB0b3JzIGJ5IHJlZmVyZW5jZSBwYXJhbWV0ZXIuCisgKi8KKyNkZWZpbmUgY21hX190c19vcGVuMihmdW5jLGZkcGFpcixhcmdsaXN0LHBvc3RfcHJvY2VzcykgIHsJCVwKKyAgICBpbnQJICAgIF9fcmVzX187CQkJCQkJCVwKKyAgICBUUlkgewkJCQkJCQkJXAorCWNtYV9faW50X2luaXQgKCk7CQkJCQkJXAorCWNtYV9faW50X2xvY2sgKGNtYV9fZ19pb19kYXRhX211dGV4KTsJCQkJXAorCV9fcmVzX18gPSBmdW5jIGFyZ2xpc3Q7CQkJCQkJXAorCWNtYV9faW50X3VubG9jayAoY21hX19nX2lvX2RhdGFfbXV0ZXgpOwkJCQlcCisJaWYgKF9fcmVzX18gPj0gMCAmJiBmZHBhaXJbMF0gPCBjbWFfX2dfbXhfZmlsZQkJCVwKKwkJJiYgZmRwYWlyWzFdIDwgY21hX19nX214X2ZpbGUpCQkJCVwKKwkgICAgcG9zdF9wcm9jZXNzOwkJCQkJCVwKKwl9CQkJCQkJCQlcCisgICAgQ0FUQ0hfQUxMCQkJCQkJCQlcCisJewkJCQkJCQkJXAorCWNtYV9fc2V0X2Vycm5vIChFQkFERik7CQkJCQkJXAorCV9fcmVzX18gPSAtMTsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKyAgICBFTkRUUlkJCQkJCQkJCVwKKyAgICBpZiAoKGZkcGFpclswXSA+PSBjbWFfX2dfbXhfZmlsZSkgfHwgKGZkcGFpclsxXSA+PSBjbWFfX2dfbXhfZmlsZSkpIFwKKwljbWFfX2J1Z2NoZWNrICgiY21hX190c19vcGVuMjogIG9uZSBvZiBmZCdzIGlzIHRvbyBsYXJnZSIpOyBcCisgICAgcmV0dXJuIF9fcmVzX187CQkJCQkJCVwKKyAgICB9CisKKy8qCisgKiBJTlRFUk5BTCBJTlRFUkZBQ0VTCisgKi8KK2V4dGVybiB2b2lkIGNtYV9fY2xvc2VfZ2VuZXJhbCAoaW50KTsKKworZXh0ZXJuIHZvaWQgY21hX19pbml0X3RocmVhZF9pbyAodm9pZCk7CisKK2V4dGVybiBjbWFfdF9ib29sZWFuIGNtYV9faW9fYXZhaWxhYmxlIChjbWFfX3RfaW9fdHlwZSxpbnQsc3RydWN0IHRpbWV2YWwgKik7CisKK2V4dGVybiB2b2lkIGNtYV9faW9fZXBpbG9nIChjbWFfX3RfaW9fdHlwZSxpbnQpOworCitleHRlcm4gdm9pZCBjbWFfX2lvX3Byb2xvZyAoY21hX190X2lvX3R5cGUsaW50KTsKKworZXh0ZXJuIHZvaWQgY21hX19pb193YWl0IChjbWFfX3RfaW9fdHlwZSxpbnQpOworCitleHRlcm4gdm9pZCBjbWFfX29wZW5fZ2VuZXJhbCAoaW50KTsKKworZXh0ZXJuIHZvaWQgY21hX19yZWluaXRfdGhyZWFkX2lvIChpbnQpOworCitleHRlcm4gdm9pZCBjbWFfX3NldF9ub25ibG9ja2luZyAoaW50KTsKKworZXh0ZXJuIHZvaWQgY21hX19zZXRfdXNlcl9ub25ibG9ja19mbGFncyAoaW50LGludCk7CisKK2V4dGVybiBjbWFfdF9ib29sZWFuIGNtYV9faXNfb3BlbiAoaW50KTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dkYi9vc2Ytc2hhcmUvSFA4MDAvY21hX3RocmVhZF9pby5oIGIvZ2RiL29zZi1zaGFyZS9IUDgwMC9jbWFfdGhyZWFkX2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTliZWYzYgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9vc2Ytc2hhcmUvSFA4MDAvY21hX3RocmVhZF9pby5oCkBAIC0wLDAgKzEsNDMyIEBACisvKiAKKyAqIChjKSBDb3B5cmlnaHQgMTk5MC0xOTk2IE9QRU4gU09GVFdBUkUgRk9VTkRBVElPTiwgSU5DLgorICogKGMpIENvcHlyaWdodCAxOTkwLTE5OTYgSEVXTEVUVC1QQUNLQVJEIENPTVBBTlkKKyAqIChjKSBDb3B5cmlnaHQgMTk5MC0xOTk2IERJR0lUQUwgRVFVSVBNRU5UIENPUlBPUkFUSU9OCisgKiAoYykgQ29weXJpZ2h0IDE5OTEsIDE5OTIgU2llbWVucy1OaXhkb3JmIEluZm9ybWF0aW9uIFN5c3RlbXMKKyAqIFRvIGFueW9uZSB3aG8gYWNrbm93bGVkZ2VzIHRoYXQgdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dAorICogYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eTogcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoaXMgZmlsZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBub3RpY2UgYXBwZWFycyBpbgorICogYWxsIHNvdXJjZSBjb2RlIGNvcGllcywgYW5kIHRoYXQgbm9uZSBvZiB0aGUgbmFtZXMgbGlzdGVkIGFib3ZlIGJlIHVzZWQKKyAqIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE5vbmUgb2YgdGhlc2Ugb3JnYW5pemF0aW9ucworICogbWFrZXMgYW55IHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlLgorICovCisvKgorICoKKyAqCUhlYWRlciBmaWxlIGZvciB0aHJlYWQgc3luY2hyb3Vub3VzIEkvTworICovCisKKyNpZm5kZWYgQ01BX1RIUkVBRF9JTworI2RlZmluZSBDTUFfVEhSRUFEX0lPCisKKy8qCisgKiAgSU5DTFVERSBGSUxFUworICovCisKKyNpbmNsdWRlIDxjbWFfY29uZmlnLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxjbWEuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGNtYV9pbml0Lmg+CisjaW5jbHVkZSA8Y21hX2Vycm9ycy5oPgorCisvKgorICogQ09OU1RBTlRTCisgKi8KKworCisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBmaWxlcyAoaWUsIG1heF9mZCsxKQorICovCisjZGVmaW5lIGNtYV9fY19teF9maWxlCUZEX1NFVFNJWkUKKworLyoKKyAqIE51bWJlciBvZiBiaXRzIHBlciBmaWxlIGRlc2NyaXB0b3IgYml0IG1hc2sgKGllIG51bWJlciBvZiBieXRlcyAqIGJpdHMvYnl0ZSkKKyAqLworI2RlZmluZSBjbWFfX2NfbmJwbQlORkRCSVRTCisKKy8qCisgKiBUWVBFIERFRklOSVRJT05TCisgKi8KKwordHlwZWRlZiBlbnVtIENNQV9fVF9JT19UWVBFIHsKKyAgICBjbWFfX2NfaW9fcmVhZCAgID0gMCwKKyAgICBjbWFfX2NfaW9fd3JpdGUgID0gMSwKKyAgICBjbWFfX2NfaW9fZXhjZXB0ID0gMgorICAgIH0gY21hX190X2lvX3R5cGU7CisjZGVmaW5lIGNtYV9fY19tYXhfaW9fdHlwZQkyCisKKy8qCisgKiBGcm9tIG91ciBsb2NhbCA8c3lzL3R5cGVzLmg+OgorICoKKyAqICB0eXBlZGVmIGxvbmcgICAgZmRfbWFzazsKKyAqCisgKiAgdHlwZWRlZiBzdHJ1Y3QgZmRfc2V0IHsKKyAqICAgICAgICAgIGZkX21hc2sgZmRzX2JpdHNbaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKV07CisgKiAgfSBmZF9zZXQ7CisgKgorICovCit0eXBlZGVmIGZkX21hc2sgY21hX190X21hc2s7Cit0eXBlZGVmIGZkX3NldCAgY21hX190X2ZpbGVfbWFzazsKKworCisKKy8qCisgKiAgR0xPQkFMIERBVEEKKyAqLworCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgZmlsZXMgKGllLCBtYXhfZmQrMSkgYXMgZGV0ZXJtaW5lZCBieSBnZXRkdGFibGVzaXplKCkuCisgKi8KK2V4dGVybiBpbnQJY21hX19nX214X2ZpbGU7CisKKy8qCisgKiBOdW1iZXIgb2Ygc3VibWFza3MgKGllICJpbnQiIHNpemVkIGNodW5rcykgcGVyIGZpbGUgZGVzY3JpcHRvciBtYXNrIGFzCisgKiBkZXRlcm1pbmVkIGJ5IGdldGR0YWJsZXNpemUoKS4KKyAqLworZXh0ZXJuIGludAljbWFfX2dfbnNwbTsKKworLyoKKyAqIE1BQ1JPUworICovCisKKy8qCisgKiBEZWZpbmUgYSBjb25zdGFudCBmb3IgdGhlIGVycm5vIHZhbHVlIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSByZXF1ZXN0ZWQKKyAqIG9wZXJhdGlvbiB3YXMgbm90IHBlcmZvcm1lZCBiZWNhdXNlIGl0IHdvdWxkIGJsb2NrIHRoZSBwcm9jZXNzLgorICovCisjIGRlZmluZSBjbWFfX2lzX2Jsb2NraW5nKHMpIFwKKyAgICAoKHMgPT0gRUFHQUlOKSB8fCAocyA9PSBFV09VTERCTE9DSykgfHwgKHMgPT0gRUlOUFJPR1JFU1MpIHx8IFwKKyAgICAgKHMgPT0gRUFMUkVBRFkpIHx8IChzID09IEVERUFETEspKQorCisvKgorKglJdCBpcyBuZWNlc3NhcnkgdG8gaXNzdWUgYW4gSS9PIGZ1bmN0aW9uLCBiZWZvcmUgY2FsbGluZyBjbWFfX2lvX3dhaXQoKQorKglpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgorKgorKgkJKglUaGlzIGZpbGUgZGVzY3JpcHRvciBoYXMgYmVlbiBzZXQgbm9uLWJsb2NraW5nIGJ5IENNQQorKgkJKglUaGlzIGZpbGUgZGVzY3JpcHRvciBoYXMgYmVlbiBzZXQgbm9uLWJsb2NraW5nIGJ5IHRoZSB1c2VyLgorKi8KKworI2RlZmluZSBjbWFfX2lzc3VlX2lvX2NhbGwoZmQpCQkJCQlcCisJKCAoY21hX19nX2ZpbGVbZmRdLT5ub25fYmxvY2tpbmcpIHx8IFwKKwkgIChjbWFfX2dfZmlsZVtmZF0tPnVzZXJfZmwudXNlcl9ub25fYmxvY2tpbmcpICkKKworCisjZGVmaW5lIGNtYV9fc2V0X3VzZXJfbm9uYmxvY2tpbmcoZmxhZ3MpIFwKKworLyoKKyAqIERldGVybWluZSBpZiB0aGUgZmlsZSBpcyBvcGVuCisgKi8KKy8qCisgKiBJZiB0aGUgZmlsZSBnZXRzIGNsb3NlZCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgbXV0ZXggY21hX19nX2ZpbGVbcmZkXQorICogZ2V0cyBzZXQgdG8gbnVsbC4gVGhpcyByZXN1bHRzIGluIGEgY3Jhc2ggaWYgTkRFQlVHIGlzIHNldCB0byAwIAorICogc2luY2UgY21hX19pbnRfbG9jayB0cmllcyB0byBkZXJlZmVyZW5jZSBpdCB0byBzZXQgdGhlIG11dGV4IG93bmVyc2hpcCAKKyAqIGFmdGVyIGl0IGdldHMgdGhlIG11dGV4LiBUaGUgZm9sbG93aW5nIHdpbGwgc3RpbGwgc2V0IHRoZSBvd25lcnNoaXAKKyAqIGluIGNtYV9faW50X2xvY2sgc28gd2UnbGwgc2V0IGl0IGJhY2sgdG8gbm9vbmUgaWYgY21hX19nX2ZpbGUgaXMgbnVsbAorICogd2hlbiB3ZSBjb21lIGJhY2sganVzdCBpbiBjYXNlIGl0IG1hdHRlcnMuIEl0IHNob3VsZG4ndCBzaW5jZSBpdHMgbm8KKyAqIGxvbmdlciBpbiB1c2UgYnV0Li4uLi4gCisgKiBDYWxsZXJzIG9mIHRoaXMgc2hvdWxkIHJlY2hlY2sgY21hX19nX2ZpbGUgYWZ0ZXIgdGhlIHJlc2VydmF0aW9uIHRvCisgKiBtYWtlIHN1cmUgY29udGludWVpbmcgbWFrZXMgc2Vuc2UuCisgKi8KKyNkZWZpbmUgY21hX19mZF9yZXNlcnZlKHJmZCkgCVwKKwkJeyBcCisJCWNtYV9fdF9pbnRfbXV0ZXggKl9fbXV0ZXhfXzsgXAorCQlfX211dGV4X18gPSBjbWFfX2dfZmlsZVtyZmRdLT5tdXRleDsgXAorCQljbWFfX2ludF9sb2NrIChfX211dGV4X18pOyBcCisJCWlmKGNtYV9fZ19maWxlW3JmZF0gPT0gKGNtYV9fdF9maWxlX29iaiAqKWNtYV9jX251bGxfcHRyKSBcCisJCQljbWFfX2ludF91bmxvY2soX19tdXRleF9fKTsgXAorCQl9CisJCQorCisvKgorICogVW5yZXNlcnZlIGEgZmlsZSBkZXNjcmlwdG9yCisgKi8KKyNkZWZpbmUgY21hX19mZF91bnJlc2VydmUodWZkKQljbWFfX2ludF91bmxvY2sgKGNtYV9fZ19maWxlW3VmZF0tPm11dGV4KQorCisvKgorICogQU5EIHRvZ2V0aGVyIHR3byBzZWxlY3QgZmlsZSBkZXNjcmlwdG9yIG1hc2tzCisgKi8KKyNkZWZpbmUgY21hX19mZG1fYW5kKHRhcmdldCxhLGIpCQkJCQlcCisJewkJCQkJCQkJXAorCWludCBfX2lfXyA9IGNtYV9fZ19uc3BtOwkJCQkJXAorCXdoaWxlIChfX2lfXy0tKQkJCQkJCQlcCisJICAgICh0YXJnZXQpLT5mZHNfYml0c1tfX2lfX10gPQkJCQkJXAorCQkoYSktPmZkc19iaXRzW19faV9fXSAmIChiKS0+ZmRzX2JpdHNbX19pX19dOwkJXAorCX0KKworLyoKKyAqIENsZWFyIGEgYml0IGluIGEgc2VsZWN0IGZpbGUgZGVzY3JpcHRvciBtYXNrCisgKgorICogRkRfQ0xSKG4sIHApICA6PSAgKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdICY9IH4oMSA8PCAoKG4pICUgTkZEQklUUykpKQorICovCisjZGVmaW5lIGNtYV9fZmRtX2Nscl9iaXQobixwKQlGRF9DTFIgKG4sIHApCisKKy8qCisgKiBDb3B5IHRoZSBjb250ZW50cyBvZiBvbmUgZmlsZSBkZXNjcmlwdG9yIG1hc2sgaW50byBhbm90aGVyLiAgSWYgdGhlIAorICogZGVzdGluYXRpb24gb3BlcmFuZCBpcyBudWxsLCBkbyBub3RoaW5nOyBpZiB0aGUgc291cmNlIG9wZXJhbmQgaXMgbnVsbCwgCisgKiBzaW1wbHkgemVybyB0aGUgZGVzdGluYXRpb24uCisgKi8KKyNkZWZpbmUgY21hX19mZG1fY29weShzcmMsZHN0LG5mZHMpIHsJCQkJCVwKKwlpZiAoZHN0KQkJCQkJCQlcCisJICAgIGlmIChzcmMpIHsJCQkJCQkJXAorCQljbWFfX3RfbWFzayAqX19zX18gPSAoY21hX190X21hc2sgKikoc3JjKTsJCVwKKwkJY21hX190X21hc2sgKl9fZF9fID0gKGNtYV9fdF9tYXNrICopKGRzdCk7CQlcCisJCWludCBfX2lfXzsJCQkJCQlcCisJCWZvciAoX19pX18gPSAwOyBfX2lfXyA8IChuZmRzKTsgX19pX18gKz0gY21hX19jX25icG0pCVwKKwkJICAgICpfX2RfXysrID0gKl9fc19fKys7CQkJCVwKKwkJfQkJCQkJCQlcCisJICAgIGVsc2UJCQkJCQkJXAorCQljbWFfX2ZkbV96ZXJvIChkc3QpOwkJCQkJXAorCSAgICB9CisKKy8qCisgKiBUbyBpbmNyZW1lbnQgY291bnQgZm9yIGVhY2ggYml0IHNldCBpbiBmZCAtIG1hc2sKKyAqLworI2RlZmluZSBjbWFfX2ZkbV9jb3VudF9iaXRzKG1hcCxjb3VudCkJCQkJCVwKKwl7CQkJCQkJCQlcCisJaW50CV9faV9fID0gY21hX19nX25zcG07CQkJCQlcCisJd2hpbGUgKF9faV9fLS0pIHsJCQkJCQlcCisJICAgIGNtYV9fdF9tYXNrICAgIF9fdG1fXzsJCQkJICAgICAgICBcCisJICAgIF9fdG1fXyA9IChtYXApLT5mZHNfYml0c1tfX2lfX107CQkJCVwKKwkgICAgd2hpbGUoX190bV9fKSB7CQkJCQkJXAorCQkoY291bnQpKys7CQkJCQkJXAorCQlfX3RtX18gJj0gfihfX3RtX18gJiAoLV9fdG1fXykpOyAvKiBBc3N1bWVzIDIncyBjb21wICovCVwKKwkJfQkJCQkJCQlcCisJICAgIH0JCQkJCQkJCVwKKwl9CisKKy8qCisgKiBUZXN0IGlmIGEgYml0IGlzIHNldCBpbiBhIHNlbGVjdCBmaWxlIGRlc2NyaXB0b3IgbWFzaworICoKKyAqIEZEX0lTU0VUKG4scCkgIDo9ICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJiAoMSA8PCAoKG4pICUgTkZEQklUUykpKQorICovCisjZGVmaW5lIGNtYV9fZmRtX2lzX3NldChuLHApCUZEX0lTU0VUIChuLCBwKQorCisvKgorICogT1IgdG9nZXRoZXIgdHdvIHNlbGVjdCBmaWxlIGRlc2NyaXB0b3IgbWFza3MKKyAqLworI2RlZmluZSBjbWFfX2ZkbV9vcih0YXJnZXQsYSxiKQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJaW50IF9faV9fID0gY21hX19nX25zcG07CQkJCQlcCisJd2hpbGUgKF9faV9fLS0pCQkJCQkJCVwKKwkgICAgKHRhcmdldCktPmZkc19iaXRzW19faV9fXSA9CQkJCQlcCisJCShhKS0+ZmRzX2JpdHNbX19pX19dIHwgKGIpLT5mZHNfYml0c1tfX2lfX107CQlcCisJfQorCisvKgorICogU2V0IGEgYml0IGluIGEgc2VsZWN0IGZpbGUgZGVzY3JpcHRvciBtYXNrCisgKiAKKyAqIEZEX1NFVChuLHApICA6PSAgKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdIHw9ICgxIDw8ICgobikgJSBORkRCSVRTKSkpCisgKi8KKyNkZWZpbmUgY21hX19mZG1fc2V0X2JpdChuLHApCUZEX1NFVCAobiwgcCkKKworLyoKKyAqIENsZWFyIGEgc2VsZWN0IGZpbGUgZGVzY3JpcHRvciBtYXNrLgorICovCisjZGVmaW5lIGNtYV9fZmRtX3plcm8obikJCQkJCQlcCisJY21hX19tZW1zZXQgKChjaGFyICopIG4sIDAsIGNtYV9fZ19uc3BtICogc2l6ZW9mKGNtYV9fdF9tYXNrKSkKKworCisKKworDAorLyoKKyAqIENNQSAidGhyZWFkLXN5bmNocm9ub3VzIiBJL08gcmVhZC93cml0ZSBvcGVyYXRpb25zCisgKi8KKworICAgIC8qCisgICAgICogU2luY2UgYWxsIENNQSAidGhyZWFkLXN5bmNocm9ub3VzIiBJL08gKHJlYWQgb3Igd3JpdGUpIG9wZXJhdGlvbnMgb24gCisgICAgICogVSppeCBmb2xsb3cgdGhlIGV4YWN0IHNhbWUgc3RydWN0dXJlLCB0aGUgd3JhcHBlciByb3V0aW5lcyBoYXZlIGJlZW4KKyAgICAgKiBjb25kZW5zZWQgaW50byBhIG1hY3JvLgorICAgICAqCisgICAgICogVGhlIHN0ZXBzIHBlcmZvcm1lZCBhcmUgYXMgZm9sbG93czoKKyAgICAgKgkxLiBDaGVjayB0aGF0IHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgYSBsZWdpdGltYXRlIHZhbHVlLgorICAgICAqCTIuIENoZWNrIHRoYXQgdGhlIGVudHJ5IGluIHRoZSBDTUEgZmlsZSAiZGF0YWJhc2UiIHdoaWNoIGNvcnJlc3BvbmRzIHRvIAorICAgICAqCSAgICB0aGUgZmlsZSBkZXNjcmlwdG9yIGluZGljYXRlcyB0aGF0IHRoZSAiZmlsZSIgd2FzICJvcGVuZWQiIGJ5IENNQS4KKyAgICAgKiAgMy4gUmVzZXJ2ZSB0aGUgZmlsZSwgdG8gc2VyaWFsaXplZCBhY2Nlc3MgdG8gZmlsZXMuICBUaGlzIG5vdCBvbmx5IAorICAgICAqCSAgICBzaW1wbGlmaWVzIHRoaW5ncywgYnV0IGFsc28gZGVmZW5kcyBhZ2FpbnN0IG5vbi1yZWVudHJhbmN5LgorICAgICAqICA0LiBJZiB0aGUgImZpbGUiIGlzICJzZXQiIGZvciBub24tYmxvY2tpbmcgSS9PLCBjaGVjayBpZiB3ZQorICAgICAqICAgICAgaGF2ZSBhY3R1YWxseSBzZXQgdGhlIGZpbGUgbm9uLWJsb2NraW5nIHlldCwgYW5kIGlmIG5vdCBkbyBzby4KKyAgICAgKgkgICAgVGhlbiwgaXNzdWUgdGhlIEkvTyBvcGVyYW50aW9uLgorICAgICAqCSAgICBTdWNjZXNzIG9yIGZhaWx1cmUgaXMgcmV0dXJuZWQgaW1tZWRpYXRlbHksIGFmdGVyIHVucmVzZXJ2aW5nIHRoZSAKKyAgICAgKgkgICAgZmlsZS4gIElmIHRoZSBlcnJvciBpbmRpY2F0ZXMgdGhhdCB0aGUgb3BlcmF0aW9uIHdvdWxkIGhhdmUgY2F1c2VkCisgICAgICoJICAgIHRoZSBwcm9jZXNzIHRvIGJsb2NrLCBjb250aW51ZSB0byB0aGUgbmV4dCBzdGVwLgorICAgICAqCTUuIFRoZSBJL08gcHJvbG9nIGFkZHMgdGhpcyAiZmlsZSIgdG8gdGhlIGdsb2JhbCBiaXQgbWFzaywgd2hpY2ggCisgICAgICoJICAgIHJlcHJlc2VudHMgYWxsICJmaWxlcyIgd2hpY2ggaGF2ZSB0aHJlYWRzIHdhaXRpbmcgdG8gcGVyZm9ybSBJL08gb24gCisgICAgICoJICAgIHRoZW0sIGFuZCBjYXVzZXMgdGhlIHRocmVhZCB0byBibG9jayBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIGZvcgorICAgICAqCSAgICB0aGlzICJmaWxlIi4gIFBlcmlvZGljYWxseSwgYSBzZWxlY3QgaXMgZG9uZSBvbiB0aGlzIGdsb2JhbCBiaXQgCisgICAgICoJICAgIG1hc2ssIGFuZCB0aGUgY29uZGl0aW9uIHZhcmlhYmxlcyBjb3JyZXNwb25kaW5nIHRvICJmaWxlcyIgd2hpY2ggCisgICAgICoJICAgIGFyZSByZWFkeSBmb3IgSS9PIGFyZSBzaWduYWxlZCwgcmVsZWFzaW5nIHRob3NlIHdhaXRpbmcgdGhyZWFkcyB0bworICAgICAqCSAgICBwZXJmb3JtIHRoZWlyIEkvTy4KKyAgICAgKiAgNi4gV2hlbiB0aGUgdGhyZWFkIHJldHVybnMgZnJvbSB0aGUgSS9PIHByb2xvZywgaXQgY2FuIChob3BlZnVsbHkpIAorICAgICAqCSAgICBwZXJmb3JtIGl0cyBvcGVyYXRpb24gd2l0aG91dCBibG9ja2luZyB0aGUgcHJvY2Vzcy4KKyAgICAgKgk3LiBUaGUgSS9PIGVwaWxvZyBjbGVhcnMgdGhlIGJpdCBpbiB0aGUgZ2xvYmFsIG1hc2sgYW5kL29yIHNpZ25hbHMgdGhlIAorICAgICAqCSAgICB0aGUgbmV4dCB0aHJlYWQgd2FpdGluZyBmb3IgdGhpcyAiZmlsZSIsIGFzIGFwcHJvcHJpYXRlLgorICAgICAqICA4LiBJZiB0aGUgSS9PIGZhaWxlZCwgY29udGludWUgdG8gbG9vcC4KKyAgICAgKgk5LiBGaW5hbGx5LCB0aGUgImZpbGUiIGlzIHVucmVzZXJ2ZWQsIGFzIHdlJ3JlIGRvbmUgd2l0aCBpdCwgYW5kIHRoZQorICAgICAqCSAgICByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqCisgICAgICogTm90ZTogIGN1cnJlbnRseSwgd2UgYmVsaWV2ZSB0aGF0IHRpbWVzbGljaW5nIHdoaWNoIGlzIGJhc2VkIG9uIHRoZQorICAgICAqCSAgICB2aXJ0dWFsLXRpbWUgdGltZXIgZG9lcyBub3QgY2F1c2Ugc3lzdGVtIGNhbGxzIHRvIHJldHVybiBFSU5UUi4gIAorICAgICAqCSAgICBUaHJlZm9yZSwgYW55IEVJTlRSIHJldHVybnMgYXJlIHJlbGF5ZWQgZGlyZWN0bHkgdG8gdGhlIGNhbGxlci4KKyAgICAgKgkgICAgT24gcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IGEgdmlydHVhbC10aW1lIHRpbWVyLCB0aGUgY29kZQorICAgICAqCSAgICBzaG91bGQgcHJvYmFibHkgY2F0Y2ggRUlOVFIgcmV0dXJucyBhbmQgcmVzdGFydCB0aGUgc3lzdGVtIGNhbGwuCisgICAgICovCisKKy8qCisgKiBUaGlzIG1hY3JvIGlzIHVzZWQgZm9yIGJvdGggcmVhZC10eXBlIGFuZCB3cml0ZS10eXBlIGZ1bmN0aW9ucy4KKyAqCisgKiBOb3RlOiAgdGhlIHNlY29uZCBjYWxsIHRvICJmdW5jIiBtYXkgcmVxdWlyZSBiZWluZyBicmFja2V0ZWQgaW4gYQorICoJICBjbWFfX2ludGVycnVwdF9kaXNhYmxlL2NtYV9faW50ZXJydXB0X2VuYWJsZSBwYWlyLCBidXQgd2UnbGwgCisgKgkgIHdhaXQgYW5kIHNlZSBpZiB0aGlzIGlzIG5lY2Vzc2FyeS4KKyAqLworI2RlZmluZSBjbWFfX3RzX2Z1bmMoZnVuYyxmZCxhcmdsaXN0LHR5cGUscG9zdF9wcm9jZXNzKQl7IFwKKyAgICBjbWFfdF9pbnRlZ2VyICAgX19yZXNfXzsgXAorICAgIGNtYV90X2Jvb2xlYW4gICBfX2RvbmVfXyA9IGNtYV9jX2ZhbHNlOyBcCisgICAgaWYgKChmZCA8IDApIHx8IChmZCA+PSBjbWFfX2dfbXhfZmlsZSkpIHJldHVybiAoY21hX19zZXRfZXJybm8gKEVCQURGKSwgLTEpOyBcCisgICAgaWYgKCFjbWFfX2lzX29wZW4oZmQpKSByZXR1cm4gKGNtYV9fc2V0X2Vycm5vIChFQkFERiksIC0xKTsgXAorICAgIGNtYV9fZmRfcmVzZXJ2ZSAoZmQpOyBcCisgICAgaWYgKCFjbWFfX2lzX29wZW4oZmQpKSByZXR1cm4gKGNtYV9fc2V0X2Vycm5vIChFQkFERiksIC0xKTsgXAorICAgIGlmIChjbWFfX2lzc3VlX2lvX2NhbGwoZmQpKSB7XAorCWlmICgoIWNtYV9fZ19maWxlW2ZkXS0+c2V0X25vbl9ibG9ja2luZykgJiYgXAorCQkoY21hX19nX2ZpbGVbZmRdLT5ub25fYmxvY2tpbmcgPT0gY21hX2NfdHJ1ZSkpIFwKKwkgICAgY21hX19zZXRfbm9uYmxvY2tpbmcoZmQpOyBcCisgICAgICAgIGNtYV9faW50ZXJydXB0X2Rpc2FibGUgKDApOyBcCisJVFJZIHsgXAorCSAgICBfX3Jlc19fID0gZnVuYyBhcmdsaXN0OyBcCisJICAgIH0gXAorCUNBVENIX0FMTCB7IFwKKwkgICAgY21hX19pbnRlcnJ1cHRfZW5hYmxlICgwKTsgXAorCSAgICBjbWFfX2ZkX3VucmVzZXJ2ZSAoZmQpOyBcCisJICAgIFJFUkFJU0U7IFwKKwkgICAgfSBcCisJRU5EVFJZIFwKKyAgICAgICAgY21hX19pbnRlcnJ1cHRfZW5hYmxlICgwKTsgXAorCWlmICgoX19yZXNfXyAhPSAtMSkgXAorCQl8fCAoIWNtYV9faXNfYmxvY2tpbmcgKGVycm5vKSkgXAorCQl8fCAoY21hX19nX2ZpbGVbZmRdLT51c2VyX2ZsLnVzZXJfbm9uX2Jsb2NraW5nKSkgXAorCSAgICBfX2RvbmVfXyA9IGNtYV9jX3RydWU7IFwKKwl9IFwKKyAgICBpZiAoX19kb25lX18pIHsgXAorCWNtYV9fZmRfdW5yZXNlcnZlIChmZCk7IFwKKwl9IFwKKyAgICBlbHNlIHsgXAorCVRSWSB7IFwKKwkgICAgY21hX19pb19wcm9sb2cgKHR5cGUsIGZkKTsgXAorCSAgICB3aGlsZSAoIV9fZG9uZV9fKSB7IFwKKwkJY21hX19pb193YWl0ICh0eXBlLCBmZCk7IFwKKwkJX19yZXNfXyA9IGZ1bmMgYXJnbGlzdDsgXAorCQlpZiAoKF9fcmVzX18gIT0gLTEpIFwKKwkJCXx8ICghY21hX19pc19ibG9ja2luZyAoZXJybm8pKSBcCisJCQl8fCAoY21hX19nX2ZpbGVbZmRdLT51c2VyX2ZsLnVzZXJfbm9uX2Jsb2NraW5nKSkgXAorCQkgICAgX19kb25lX18gPSBjbWFfY190cnVlOyBcCisJCX0gXAorCSAgICB9IFwKKwlGSU5BTExZIHsgXAorCSAgICBjbWFfX2lvX2VwaWxvZyAodHlwZSwgZmQpOyBcCisJICAgIGNtYV9fZmRfdW5yZXNlcnZlIChmZCk7IFwKKwkgICAgfSBcCisJRU5EVFJZIFwKKwl9IFwKKyAgICBpZiAoX19yZXNfXyAhPSAtMSkgIHBvc3RfcHJvY2VzczsgXAorICAgIHJldHVybiBfX3Jlc19fOyAgXAorICAgIH0KKworICAgIC8qCisgICAgICogU2luY2UgbW9zdCBDTUEgInRocmVhZC1zeW5jaHJvbm91cyIgSS9PICgib3BlbiItdHlwZSkgb3BlcmF0aW9ucyBvbiAKKyAgICAgKiBVKml4IGZvbGxvdyB0aGUgZXhhY3Qgc2FtZSBzdHJ1Y3R1cmUsIHRoZSB3cmFwcGVyIHJvdXRpbmVzIGhhdmUgYmVlbgorICAgICAqIGNvbmRlbnNlZCBpbnRvIGEgbWFjcm8uCisgICAgICoKKyAgICAgKiBUaGUgc3RlcHMgcGVyZm9ybWVkIGFyZSBhcyBmb2xsb3dzOgorICAgICAqCTEuIElzc3VlIHRoZSBvcGVuIGZ1bmN0aW9uLgorICAgICAqCTIuIElmIHRoZSB2YWx1ZSByZXR1cm5lZCBpbmRpY2F0ZXMgYW4gZXJyb3IsIHJldHVybiBpdCB0byB0aGUgY2FsbGVyLgorICAgICAqICAzLiBJZiB0aGUgZmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGlzIGxhcmdlciB0aGFuIHdoYXQgd2UgdGhpbmsgaXMgdGhlCisgICAgICoJICAgIG1heGltdW0gdmFsdWUgKGllIGlmIGl0IGlzIHRvbyBiaWcgZm9yIG91ciBkYXRhYmFzZSkgdGhlbiBidWdjaGVjay4KKyAgICAgKiAgNC4gIk9wZW4iIHRoZSAiZmlsZSIgaW4gdGhlIENNQSBmaWxlIGRhdGFiYXNlLgorICAgICAqCTUuIFJldHVybiB0aGUgZmlsZSBkZXNjcmlwdG9yIHZhbHVlIHRvIHRoZSBjYWxsZXIuCisgICAgICoKKyAgICAgKiBGSVgtTUU6IGZvciB0aGUgdGltZSBiZWluZywgaWYgdGhlIEkvTyBvcGVyYXRpb24gcmV0dXJucyBFSU5UUiwgd2UgCisgICAgICoJICAgIHNpbXBseSByZXR1cm4gaXQgdG8gdGhlIGNhbGxlcjsgZXZlbnR1YWxseSwgd2Ugc2hvdWxkIGNhdGNoIHRoaXMgCisgICAgICoJICAgIGFuZCAiZG8gdGhlIHJpZ2h0IHRoaW5nIiAoaWYgd2UgY2FuIGZpZ3VyZSBvdXQgd2hhdCB0aGF0IGlzKS4KKyAgICAgKi8KKworLyoKKyAqIFRoaXMgbWFjcm8gaXMgdXNlZCBmb3IgYWxsICJvcGVuIi10eXBlIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYSBzaW5nbGUgZmlsZQorICogZGVzY2lwdG9yIGJ5IGltbWVkaWF0ZSB2YWx1ZS4KKyAqLworI2RlZmluZSBjbWFfX3RzX29wZW4oZnVuYyxhcmdsaXN0LHBvc3RfcHJvY2VzcykgIHsJCVwKKyAgICBpbnQJX19mZF9fOwkJCQkJCQlcCisgICAgVFJZIHsJCQkJCQkJXAorCWNtYV9faW50X2luaXQgKCk7CQkJCQlcCisJY21hX19pbnRfbG9jayAoY21hX19nX2lvX2RhdGFfbXV0ZXgpOwkJCVwKKwlfX2ZkX18gPSBmdW5jIGFyZ2xpc3Q7CQkJCQlcCisJY21hX19pbnRfdW5sb2NrIChjbWFfX2dfaW9fZGF0YV9tdXRleCk7CQkJXAorCWlmIChfX2ZkX18gPj0gMCAmJiBfX2ZkX18gPCBjbWFfX2dfbXhfZmlsZSkJCVwKKwkgICAgcG9zdF9wcm9jZXNzOwkJCQkJXAorCX0JCQkJCQkJXAorICAgIENBVENIX0FMTAkJCQkJCQlcCisJewkJCQkJCQlcCisJY21hX19zZXRfZXJybm8gKEVCQURGKTsJCQkJCVwKKwlfX2ZkX18gPSAtMTsJCQkJCQlcCisJfQkJCQkJCQlcCisgICAgRU5EVFJZCQkJCQkJCVwKKyAgICBpZiAoX19mZF9fID49IGNtYV9fZ19teF9maWxlKQkJCQlcCisJY21hX19idWdjaGVjayAoImNtYV9fdHNfb3BlbjogIGZkIGlzIHRvbyBsYXJnZSIpOwlcCisgICAgcmV0dXJuIF9fZmRfXzsJCQkJCQlcCisgICAgfQorLyoKKyAqIFRoaXMgbWFjcm8gaXMgdXNlZCBmb3IgYWxsICJvcGVuIi10eXBlIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYSBwYWlyIG9mIGZpbGUKKyAqIGRlc2NpcHRvcnMgYnkgcmVmZXJlbmNlIHBhcmFtZXRlci4KKyAqLworI2RlZmluZSBjbWFfX3RzX29wZW4yKGZ1bmMsZmRwYWlyLGFyZ2xpc3QscG9zdF9wcm9jZXNzKSAgewkJXAorICAgIGludAkgICAgX19yZXNfXzsJCQkJCQkJXAorICAgIFRSWSB7CQkJCQkJCQlcCisJY21hX19pbnRfaW5pdCAoKTsJCQkJCQlcCisJY21hX19pbnRfbG9jayAoY21hX19nX2lvX2RhdGFfbXV0ZXgpOwkJCQlcCisJX19yZXNfXyA9IGZ1bmMgYXJnbGlzdDsJCQkJCQlcCisJY21hX19pbnRfdW5sb2NrIChjbWFfX2dfaW9fZGF0YV9tdXRleCk7CQkJCVwKKwlpZiAoX19yZXNfXyA+PSAwICYmIGZkcGFpclswXSA8IGNtYV9fZ19teF9maWxlCQkJXAorCQkmJiBmZHBhaXJbMV0gPCBjbWFfX2dfbXhfZmlsZSkJCQkJXAorCSAgICBwb3N0X3Byb2Nlc3M7CQkJCQkJXAorCX0JCQkJCQkJCVwKKyAgICBDQVRDSF9BTEwJCQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJY21hX19zZXRfZXJybm8gKEVCQURGKTsJCQkJCQlcCisJX19yZXNfXyA9IC0xOwkJCQkJCQlcCisJfQkJCQkJCQkJXAorICAgIEVORFRSWQkJCQkJCQkJXAorICAgIGlmICgoZmRwYWlyWzBdID49IGNtYV9fZ19teF9maWxlKSB8fCAoZmRwYWlyWzFdID49IGNtYV9fZ19teF9maWxlKSkgXAorCWNtYV9fYnVnY2hlY2sgKCJjbWFfX3RzX29wZW4yOiAgb25lIG9mIGZkJ3MgaXMgdG9vIGxhcmdlIik7IFwKKyAgICByZXR1cm4gX19yZXNfXzsJCQkJCQkJXAorICAgIH0KKworLyoKKyAqIElOVEVSTkFMIElOVEVSRkFDRVMKKyAqLworZXh0ZXJuIHZvaWQgY21hX19jbG9zZV9nZW5lcmFsICAoaW50KTsKKworZXh0ZXJuIHZvaWQgY21hX19pbml0X3RocmVhZF9pbyAgKHZvaWQpOworCitleHRlcm4gY21hX3RfYm9vbGVhbiBjbWFfX2lvX2F2YWlsYWJsZSAgKGNtYV9fdF9pb190eXBlLGludCxzdHJ1Y3QgdGltZXZhbCAqKTsKKworZXh0ZXJuIHZvaWQgY21hX19pb19lcGlsb2cgIChjbWFfX3RfaW9fdHlwZSxpbnQpOworCitleHRlcm4gdm9pZCBjbWFfX2lvX3Byb2xvZyAgKGNtYV9fdF9pb190eXBlLGludCk7CisKK2V4dGVybiB2b2lkIGNtYV9faW9fd2FpdCAgKGNtYV9fdF9pb190eXBlLGludCk7CisKK2V4dGVybiB2b2lkIGNtYV9fb3Blbl9nZW5lcmFsICAoaW50KTsKKworZXh0ZXJuIHZvaWQgY21hX19yZWluaXRfdGhyZWFkX2lvICAoaW50KTsKKworZXh0ZXJuIHZvaWQgY21hX19zZXRfbm9uYmxvY2tpbmcgIChpbnQpOworCitleHRlcm4gdm9pZCBjbWFfX3NldF91c2VyX25vbmJsb2NrX2ZsYWdzICAoaW50LGludCk7CisKK2V4dGVybiBjbWFfdF9ib29sZWFuIGNtYV9faXNfb3BlbiAoaW50KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvb3NmLXNoYXJlL1JFQURNRSBiL2dkYi9vc2Ytc2hhcmUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZDJlMGYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvb3NmLXNoYXJlL1JFQURNRQpAQCAtMCwwICsxLDggQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGhlYWRlciBmaWxlcyBuZWNlc3NhcnkgdG8gYnVpbGQgYSB0aHJlYWQtYXdhcmUgR0RCIG9uCitzeXN0ZW1zIGJhc2VkIG9uIE9TRidzIENNQSB0aHJlYWRzIHBhY2thZ2UuCisKK1RoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGVzZSBoZWFkZXIgZmlsZXMgYXJlIGF2YWlsYWJsZSBmb3IgZnJlZSBmcm9tOgorCisJaHR0cDovL3d3dy5vc2Yub3JnL21hbGwvZGNlL1NXLWNvZGUKKworQ3VycmVudGx5LCB0aGUgb25seSBwb3J0IG9mIEdEQiB3aGljaCBzdXBwb3J0cyBDTUEgdGhyZWFkcyBpcyBIUC9VWC0xMC4xMC4KZGlmZiAtLWdpdCBhL2dkYi9vc2Ytc2hhcmUvUklPUy9jbWFfdGhyZWFkX2lvLmggYi9nZGIvb3NmLXNoYXJlL1JJT1MvY21hX3RocmVhZF9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MTE3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvb3NmLXNoYXJlL1JJT1MvY21hX3RocmVhZF9pby5oCkBAIC0wLDAgKzEsNDM0IEBACisvKiAKKyAqIChjKSBDb3B5cmlnaHQgMTk5MC0xOTk2IE9QRU4gU09GVFdBUkUgRk9VTkRBVElPTiwgSU5DLgorICogKGMpIENvcHlyaWdodCAxOTkwLTE5OTYgSEVXTEVUVC1QQUNLQVJEIENPTVBBTlkKKyAqIChjKSBDb3B5cmlnaHQgMTk5MC0xOTk2IERJR0lUQUwgRVFVSVBNRU5UIENPUlBPUkFUSU9OCisgKiAoYykgQ29weXJpZ2h0IDE5OTEsIDE5OTIgU2llbWVucy1OaXhkb3JmIEluZm9ybWF0aW9uIFN5c3RlbXMKKyAqIFRvIGFueW9uZSB3aG8gYWNrbm93bGVkZ2VzIHRoYXQgdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dAorICogYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eTogcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoaXMgZmlsZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBub3RpY2UgYXBwZWFycyBpbgorICogYWxsIHNvdXJjZSBjb2RlIGNvcGllcywgYW5kIHRoYXQgbm9uZSBvZiB0aGUgbmFtZXMgbGlzdGVkIGFib3ZlIGJlIHVzZWQKKyAqIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE5vbmUgb2YgdGhlc2Ugb3JnYW5pemF0aW9ucworICogbWFrZXMgYW55IHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlLgorICovCisvKgorICoJSGVhZGVyIGZpbGUgZm9yIHRocmVhZCBzeW5jaHJvdW5vdXMgSS9PCisgKi8KKworI2lmbmRlZiBDTUFfVEhSRUFEX0lPCisjZGVmaW5lIENNQV9USFJFQURfSU8KKworLyoKKyAqICBJTkNMVURFIEZJTEVTCisgKi8KKworI2luY2x1ZGUgPGNtYV9jb25maWcuaD4KKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjaW5jbHVkZSA8Y21hLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxjbWFfaW5pdC5oPgorI2luY2x1ZGUgPGNtYV9lcnJvcnMuaD4KKworLyoKKyAqIENPTlNUQU5UUworICovCisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBmaWxlcyAoaWUsIG1heF9mZCsxKQorICovCisjZGVmaW5lIGNtYV9fY19teF9maWxlCUZEX1NFVFNJWkUKKworLyoKKyAqIE51bWJlciBvZiBiaXRzIHBlciBmaWxlIGRlc2NyaXB0b3IgYml0IG1hc2sgKGllIG51bWJlciBvZiBieXRlcyAqIGJpdHMvYnl0ZSkKKyAqLworI2RlZmluZSBjbWFfX2NfbmJwbQlORkRCSVRTCisKKy8qCisgKiBUWVBFIERFRklOSVRJT05TCisgKi8KKwordHlwZWRlZiBlbnVtIENNQV9fVF9JT19UWVBFIHsKKyAgICBjbWFfX2NfaW9fcmVhZCAgID0gMCwKKyAgICBjbWFfX2NfaW9fd3JpdGUgID0gMSwKKyAgICBjbWFfX2NfaW9fZXhjZXB0ID0gMgorICAgIH0gY21hX190X2lvX3R5cGU7CisjZGVmaW5lIGNtYV9fY19tYXhfaW9fdHlwZQkyCisKKy8qCisgKiBGcm9tIG91ciBsb2NhbCA8c3lzL3R5cGVzLmg+OgorICoKKyAqICB0eXBlZGVmIGxvbmcgICAgZmRfbWFzazsKKyAqCisgKiAgdHlwZWRlZiBzdHJ1Y3QgZmRfc2V0IHsKKyAqICAgICAgICAgIGZkX21hc2sgZmRzX2JpdHNbaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKV07CisgKiAgfSBmZF9zZXQ7CisgKgorICovCit0eXBlZGVmIGZkX21hc2sgY21hX190X21hc2s7Cit0eXBlZGVmIGZkX3NldCAgY21hX190X2ZpbGVfbWFzazsKKworCisKKy8qCisgKiAgR0xPQkFMIERBVEEKKyAqLworCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgZmlsZXMgKGllLCBtYXhfZmQrMSkgYXMgZGV0ZXJtaW5lZCBieSBnZXRkdGFibGVzaXplKCkuCisgKi8KK2V4dGVybiBpbnQJY21hX19nX214X2ZpbGU7CisKKy8qCisgKiBOdW1iZXIgb2Ygc3VibWFza3MgKGllICJpbnQiIHNpemVkIGNodW5rcykgcGVyIGZpbGUgZGVzY3JpcHRvciBtYXNrIGFzCisgKiBkZXRlcm1pbmVkIGJ5IGdldGR0YWJsZXNpemUoKS4KKyAqLworZXh0ZXJuIGludAljbWFfX2dfbnNwbTsKKworLyoKKyAqIE1BQ1JPUworICovCisKKy8qCisgKiBEZWZpbmUgYSBjb25zdGFudCBmb3IgdGhlIGVycm5vIHZhbHVlIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSByZXF1ZXN0ZWQKKyAqIG9wZXJhdGlvbiB3YXMgbm90IHBlcmZvcm1lZCBiZWNhdXNlIGl0IHdvdWxkIGJsb2NrIHRoZSBwcm9jZXNzLgorICovCisjIGRlZmluZSBjbWFfX2lzX2Jsb2NraW5nKHMpIFwKKyAgICAoKHMgPT0gRUFHQUlOKSB8fCAocyA9PSBFV09VTERCTE9DSykgfHwgKHMgPT0gRUlOUFJPR1JFU1MpIHx8IFwKKyAgICAgKHMgPT0gRUFMUkVBRFkpIHx8IChzID09IEVERUFETEspKQorCisvKgorKglJdCBpcyBuZWNlc3NhcnkgdG8gaXNzdWUgYW4gSS9PIGZ1bmN0aW9uLCBiZWZvcmUgY2FsbGluZyBjbWFfX2lvX3dhaXQoKQorKglpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgorKgorKgkJKglUaGlzIGZpbGUgZGVzY3JpcHRvciBoYXMgYmVlbiBzZXQgbm9uLWJsb2NraW5nIGJ5IENNQQorKgkJKglUaGlzIGZpbGUgZGVzY3JpcHRvciBoYXMgYmVlbiBzZXQgbm9uLWJsb2NraW5nIGJ5IHRoZSB1c2VyLgorKi8KKworI2RlZmluZSBjbWFfX2lzc3VlX2lvX2NhbGwoZmQpCQkJCQlcCisJKCAoY21hX19nX2ZpbGVbZmRdLT5ub25fYmxvY2tpbmcpIHx8IFwKKwkgIChjbWFfX2dfZmlsZVtmZF0tPnVzZXJfZmwudXNlcl9ub25fYmxvY2tpbmcpICkKKworCisjZGVmaW5lIGNtYV9fc2V0X3VzZXJfbm9uYmxvY2tpbmcoZmxhZ3MpIFwKKworLyoKKyAqIERldGVybWluZSBpZiB0aGUgZmlsZSBpcyBvcGVuCisgKi8KKy8qCisgKiBJZiB0aGUgZmlsZSBnZXRzIGNsb3NlZCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgbXV0ZXggY21hX19nX2ZpbGVbcmZkXQorICogZ2V0cyBzZXQgdG8gbnVsbC4gVGhpcyByZXN1bHRzIGluIGEgY3Jhc2ggaWYgTkRFQlVHIGlzIHNldCB0byAwIAorICogc2luY2UgY21hX19pbnRfbG9jayB0cmllcyB0byBkZXJlZmVyZW5jZSBpdCB0byBzZXQgdGhlIG11dGV4IG93bmVyc2hpcCAKKyAqIGFmdGVyIGl0IGdldHMgdGhlIG11dGV4LiBUaGUgZm9sbG93aW5nIHdpbGwgc3RpbGwgc2V0IHRoZSBvd25lcnNoaXAKKyAqIGluIGNtYV9faW50X2xvY2sgc28gd2UnbGwgc2V0IGl0IGJhY2sgdG8gbm9vbmUgaWYgY21hX19nX2ZpbGUgaXMgbnVsbAorICogd2hlbiB3ZSBjb21lIGJhY2sganVzdCBpbiBjYXNlIGl0IG1hdHRlcnMuIEl0IHNob3VsZG4ndCBzaW5jZSBpdHMgbm8KKyAqIGxvbmdlciBpbiB1c2UgYnV0Li4uLi4gCisgKiBDYWxsZXJzIG9mIHRoaXMgc2hvdWxkIHJlY2hlY2sgY21hX19nX2ZpbGUgYWZ0ZXIgdGhlIHJlc2VydmF0aW9uIHRvCisgKiBtYWtlIHN1cmUgY29udGludWVpbmcgbWFrZXMgc2Vuc2UuCisgKi8KKyNkZWZpbmUgY21hX19mZF9yZXNlcnZlKHJmZCkgCVwKKwkJeyBcCisJCWNtYV9fdF9pbnRfbXV0ZXggKl9fbXV0ZXhfXzsgXAorCQlfX211dGV4X18gPSBjbWFfX2dfZmlsZVtyZmRdLT5tdXRleDsgXAorCQljbWFfX2ludF9sb2NrIChfX211dGV4X18pOyBcCisJCWlmKGNtYV9fZ19maWxlW3JmZF0gPT0gKGNtYV9fdF9maWxlX29iaiAqKWNtYV9jX251bGxfcHRyKSBcCisJCQljbWFfX2ludF91bmxvY2soX19tdXRleF9fKTsgXAorCQl9CisJCQorCisvKgorICogVW5yZXNlcnZlIGEgZmlsZSBkZXNjcmlwdG9yCisgKi8KKyNkZWZpbmUgY21hX19mZF91bnJlc2VydmUodWZkKQljbWFfX2ludF91bmxvY2sgKGNtYV9fZ19maWxlW3VmZF0tPm11dGV4KQorCisvKgorICogQU5EIHRvZ2V0aGVyIHR3byBzZWxlY3QgZmlsZSBkZXNjcmlwdG9yIG1hc2tzCisgKi8KKyNkZWZpbmUgY21hX19mZG1fYW5kKHRhcmdldCxhLGIpCQkJCQlcCisJewkJCQkJCQkJXAorCWludCBfX2lfXyA9IGNtYV9fZ19uc3BtOwkJCQkJXAorCXdoaWxlIChfX2lfXy0tKQkJCQkJCQlcCisJICAgICh0YXJnZXQpLT5mZHNfYml0c1tfX2lfX10gPQkJCQkJXAorCQkoYSktPmZkc19iaXRzW19faV9fXSAmIChiKS0+ZmRzX2JpdHNbX19pX19dOwkJXAorCX0KKworLyoKKyAqIENsZWFyIGEgYml0IGluIGEgc2VsZWN0IGZpbGUgZGVzY3JpcHRvciBtYXNrCisgKgorICogRkRfQ0xSKG4sIHApICA6PSAgKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdICY9IH4oMSA8PCAoKG4pICUgTkZEQklUUykpKQorICovCisjZGVmaW5lIGNtYV9fZmRtX2Nscl9iaXQobixwKQlGRF9DTFIgKG4sIHApCisKKy8qCisgKiBDb3B5IHRoZSBjb250ZW50cyBvZiBvbmUgZmlsZSBkZXNjcmlwdG9yIG1hc2sgaW50byBhbm90aGVyLiAgSWYgdGhlIAorICogZGVzdGluYXRpb24gb3BlcmFuZCBpcyBudWxsLCBkbyBub3RoaW5nOyBpZiB0aGUgc291cmNlIG9wZXJhbmQgaXMgbnVsbCwgCisgKiBzaW1wbHkgemVybyB0aGUgZGVzdGluYXRpb24uCisgKi8KKyNkZWZpbmUgY21hX19mZG1fY29weShzcmMsZHN0LG5mZHMpIHsJCQkJCVwKKwlpZiAoZHN0KQkJCQkJCQlcCisJICAgIGlmIChzcmMpIHsJCQkJCQkJXAorCQljbWFfX3RfbWFzayAqX19zX18gPSAoY21hX190X21hc2sgKikoc3JjKTsJCVwKKwkJY21hX190X21hc2sgKl9fZF9fID0gKGNtYV9fdF9tYXNrICopKGRzdCk7CQlcCisJCWludCBfX2lfXzsJCQkJCQlcCisJCWZvciAoX19pX18gPSAwOyBfX2lfXyA8IChuZmRzKTsgX19pX18gKz0gY21hX19jX25icG0pCVwKKwkJICAgICpfX2RfXysrID0gKl9fc19fKys7CQkJCVwKKwkJfQkJCQkJCQlcCisJICAgIGVsc2UJCQkJCQkJXAorCQljbWFfX2ZkbV96ZXJvIChkc3QpOwkJCQkJXAorCSAgICB9CisKKy8qCisgKiBUbyBpbmNyZW1lbnQgY291bnQgZm9yIGVhY2ggYml0IHNldCBpbiBmZCAtIG1hc2sKKyAqLworI2RlZmluZSBjbWFfX2ZkbV9jb3VudF9iaXRzKG1hcCxjb3VudCkJCQkJCVwKKwl7CQkJCQkJCQlcCisJaW50CV9faV9fID0gY21hX19nX25zcG07CQkJCQlcCisJd2hpbGUgKF9faV9fLS0pIHsJCQkJCQlcCisJICAgIGNtYV9fdF9tYXNrICAgIF9fdG1fXzsJCQkJICAgICAgICBcCisJICAgIF9fdG1fXyA9IChtYXApLT5mZHNfYml0c1tfX2lfX107CQkJCVwKKwkgICAgd2hpbGUoX190bV9fKSB7CQkJCQkJXAorCQkoY291bnQpKys7CQkJCQkJXAorCQlfX3RtX18gJj0gfihfX3RtX18gJiAoLV9fdG1fXykpOyAvKiBBc3N1bWVzIDIncyBjb21wICovCVwKKwkJfQkJCQkJCQlcCisJICAgIH0JCQkJCQkJCVwKKwl9CisKKy8qCisgKiBUZXN0IGlmIGEgYml0IGlzIHNldCBpbiBhIHNlbGVjdCBmaWxlIGRlc2NyaXB0b3IgbWFzaworICoKKyAqIEZEX0lTU0VUKG4scCkgIDo9ICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJiAoMSA8PCAoKG4pICUgTkZEQklUUykpKQorICovCisjZGVmaW5lIGNtYV9fZmRtX2lzX3NldChuLHApCUZEX0lTU0VUIChuLCBwKQorCisvKgorICogT1IgdG9nZXRoZXIgdHdvIHNlbGVjdCBmaWxlIGRlc2NyaXB0b3IgbWFza3MKKyAqLworI2RlZmluZSBjbWFfX2ZkbV9vcih0YXJnZXQsYSxiKQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJaW50IF9faV9fID0gY21hX19nX25zcG07CQkJCQlcCisJd2hpbGUgKF9faV9fLS0pCQkJCQkJCVwKKwkgICAgKHRhcmdldCktPmZkc19iaXRzW19faV9fXSA9CQkJCQlcCisJCShhKS0+ZmRzX2JpdHNbX19pX19dIHwgKGIpLT5mZHNfYml0c1tfX2lfX107CQlcCisJfQorCisvKgorICogU2V0IGEgYml0IGluIGEgc2VsZWN0IGZpbGUgZGVzY3JpcHRvciBtYXNrCisgKiAKKyAqIEZEX1NFVChuLHApICA6PSAgKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdIHw9ICgxIDw8ICgobikgJSBORkRCSVRTKSkpCisgKi8KKyNkZWZpbmUgY21hX19mZG1fc2V0X2JpdChuLHApCUZEX1NFVCAobiwgcCkKKworLyoKKyAqIENsZWFyIGEgc2VsZWN0IGZpbGUgZGVzY3JpcHRvciBtYXNrLgorICovCisjZGVmaW5lIGNtYV9fZmRtX3plcm8obikJCQkJCQlcCisJY21hX19tZW1zZXQgKChjaGFyICopIG4sIDAsIGNtYV9fZ19uc3BtICogc2l6ZW9mKGNtYV9fdF9tYXNrKSkKKworCisKKworDAorLyoKKyAqIENNQSAidGhyZWFkLXN5bmNocm9ub3VzIiBJL08gcmVhZC93cml0ZSBvcGVyYXRpb25zCisgKi8KKworICAgIC8qCisgICAgICogU2luY2UgYWxsIENNQSAidGhyZWFkLXN5bmNocm9ub3VzIiBJL08gKHJlYWQgb3Igd3JpdGUpIG9wZXJhdGlvbnMgb24gCisgICAgICogVSppeCBmb2xsb3cgdGhlIGV4YWN0IHNhbWUgc3RydWN0dXJlLCB0aGUgd3JhcHBlciByb3V0aW5lcyBoYXZlIGJlZW4KKyAgICAgKiBjb25kZW5zZWQgaW50byBhIG1hY3JvLgorICAgICAqCisgICAgICogVGhlIHN0ZXBzIHBlcmZvcm1lZCBhcmUgYXMgZm9sbG93czoKKyAgICAgKgkxLiBDaGVjayB0aGF0IHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgYSBsZWdpdGltYXRlIHZhbHVlLgorICAgICAqCTIuIENoZWNrIHRoYXQgdGhlIGVudHJ5IGluIHRoZSBDTUEgZmlsZSAiZGF0YWJhc2UiIHdoaWNoIGNvcnJlc3BvbmRzIHRvIAorICAgICAqCSAgICB0aGUgZmlsZSBkZXNjcmlwdG9yIGluZGljYXRlcyB0aGF0IHRoZSAiZmlsZSIgd2FzICJvcGVuZWQiIGJ5IENNQS4KKyAgICAgKiAgMy4gUmVzZXJ2ZSB0aGUgZmlsZSwgdG8gc2VyaWFsaXplZCBhY2Nlc3MgdG8gZmlsZXMuICBUaGlzIG5vdCBvbmx5IAorICAgICAqCSAgICBzaW1wbGlmaWVzIHRoaW5ncywgYnV0IGFsc28gZGVmZW5kcyBhZ2FpbnN0IG5vbi1yZWVudHJhbmN5LgorICAgICAqICA0LiBJZiB0aGUgImZpbGUiIGlzICJzZXQiIGZvciBub24tYmxvY2tpbmcgSS9PLCBjaGVjayBpZiB3ZQorICAgICAqICAgICAgaGF2ZSBhY3R1YWxseSBzZXQgdGhlIGZpbGUgbm9uLWJsb2NraW5nIHlldCwgYW5kIGlmIG5vdCBkbyBzby4KKyAgICAgKgkgICAgVGhlbiwgaXNzdWUgdGhlIEkvTyBvcGVyYW50aW9uLgorICAgICAqCSAgICBTdWNjZXNzIG9yIGZhaWx1cmUgaXMgcmV0dXJuZWQgaW1tZWRpYXRlbHksIGFmdGVyIHVucmVzZXJ2aW5nIHRoZSAKKyAgICAgKgkgICAgZmlsZS4gIElmIHRoZSBlcnJvciBpbmRpY2F0ZXMgdGhhdCB0aGUgb3BlcmF0aW9uIHdvdWxkIGhhdmUgY2F1c2VkCisgICAgICoJICAgIHRoZSBwcm9jZXNzIHRvIGJsb2NrLCBjb250aW51ZSB0byB0aGUgbmV4dCBzdGVwLgorICAgICAqCTUuIFRoZSBJL08gcHJvbG9nIGFkZHMgdGhpcyAiZmlsZSIgdG8gdGhlIGdsb2JhbCBiaXQgbWFzaywgd2hpY2ggCisgICAgICoJICAgIHJlcHJlc2VudHMgYWxsICJmaWxlcyIgd2hpY2ggaGF2ZSB0aHJlYWRzIHdhaXRpbmcgdG8gcGVyZm9ybSBJL08gb24gCisgICAgICoJICAgIHRoZW0sIGFuZCBjYXVzZXMgdGhlIHRocmVhZCB0byBibG9jayBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIGZvcgorICAgICAqCSAgICB0aGlzICJmaWxlIi4gIFBlcmlvZGljYWxseSwgYSBzZWxlY3QgaXMgZG9uZSBvbiB0aGlzIGdsb2JhbCBiaXQgCisgICAgICoJICAgIG1hc2ssIGFuZCB0aGUgY29uZGl0aW9uIHZhcmlhYmxlcyBjb3JyZXNwb25kaW5nIHRvICJmaWxlcyIgd2hpY2ggCisgICAgICoJICAgIGFyZSByZWFkeSBmb3IgSS9PIGFyZSBzaWduYWxlZCwgcmVsZWFzaW5nIHRob3NlIHdhaXRpbmcgdGhyZWFkcyB0bworICAgICAqCSAgICBwZXJmb3JtIHRoZWlyIEkvTy4KKyAgICAgKiAgNi4gV2hlbiB0aGUgdGhyZWFkIHJldHVybnMgZnJvbSB0aGUgSS9PIHByb2xvZywgaXQgY2FuIChob3BlZnVsbHkpIAorICAgICAqCSAgICBwZXJmb3JtIGl0cyBvcGVyYXRpb24gd2l0aG91dCBibG9ja2luZyB0aGUgcHJvY2Vzcy4KKyAgICAgKgk3LiBUaGUgSS9PIGVwaWxvZyBjbGVhcnMgdGhlIGJpdCBpbiB0aGUgZ2xvYmFsIG1hc2sgYW5kL29yIHNpZ25hbHMgdGhlIAorICAgICAqCSAgICB0aGUgbmV4dCB0aHJlYWQgd2FpdGluZyBmb3IgdGhpcyAiZmlsZSIsIGFzIGFwcHJvcHJpYXRlLgorICAgICAqICA4LiBJZiB0aGUgSS9PIGZhaWxlZCwgY29udGludWUgdG8gbG9vcC4KKyAgICAgKgk5LiBGaW5hbGx5LCB0aGUgImZpbGUiIGlzIHVucmVzZXJ2ZWQsIGFzIHdlJ3JlIGRvbmUgd2l0aCBpdCwgYW5kIHRoZQorICAgICAqCSAgICByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqCisgICAgICogTm90ZTogIGN1cnJlbnRseSwgd2UgYmVsaWV2ZSB0aGF0IHRpbWVzbGljaW5nIHdoaWNoIGlzIGJhc2VkIG9uIHRoZQorICAgICAqCSAgICB2aXJ0dWFsLXRpbWUgdGltZXIgZG9lcyBub3QgY2F1c2Ugc3lzdGVtIGNhbGxzIHRvIHJldHVybiBFSU5UUi4gIAorICAgICAqCSAgICBUaHJlZm9yZSwgYW55IEVJTlRSIHJldHVybnMgYXJlIHJlbGF5ZWQgZGlyZWN0bHkgdG8gdGhlIGNhbGxlci4KKyAgICAgKgkgICAgT24gcGxhdGZvcm1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IGEgdmlydHVhbC10aW1lIHRpbWVyLCB0aGUgY29kZQorICAgICAqCSAgICBzaG91bGQgcHJvYmFibHkgY2F0Y2ggRUlOVFIgcmV0dXJucyBhbmQgcmVzdGFydCB0aGUgc3lzdGVtIGNhbGwuCisgICAgICovCisKKy8qCisgKiBUaGlzIG1hY3JvIGlzIHVzZWQgZm9yIGJvdGggcmVhZC10eXBlIGFuZCB3cml0ZS10eXBlIGZ1bmN0aW9ucy4KKyAqCisgKiBOb3RlOiAgdGhlIHNlY29uZCBjYWxsIHRvICJmdW5jIiBtYXkgcmVxdWlyZSBiZWluZyBicmFja2V0ZWQgaW4gYQorICoJICBjbWFfX2ludGVycnVwdF9kaXNhYmxlL2NtYV9faW50ZXJydXB0X2VuYWJsZSBwYWlyLCBidXQgd2UnbGwgCisgKgkgIHdhaXQgYW5kIHNlZSBpZiB0aGlzIGlzIG5lY2Vzc2FyeS4KKyAqLworI2RlZmluZSBjbWFfX3RzX2Z1bmMoZnVuYyxmZCxhcmdsaXN0LHR5cGUscG9zdF9wcm9jZXNzKQl7IFwKKyAgICBjbWFfdF9pbnRlZ2VyICAgX19yZXNfXzsgXAorICAgIGNtYV90X2Jvb2xlYW4gICBfX2RvbmVfXyA9IGNtYV9jX2ZhbHNlOyBcCisgICAgaWYgKChmZCA8IDApIHx8IChmZCA+PSBjbWFfX2dfbXhfZmlsZSkpIHJldHVybiAoY21hX19zZXRfZXJybm8gKEVCQURGKSwgLTEpOyBcCisgICAgaWYgKCFjbWFfX2lzX29wZW4oZmQpKSByZXR1cm4gKGNtYV9fc2V0X2Vycm5vIChFQkFERiksIC0xKTsgXAorICAgIGNtYV9fZmRfcmVzZXJ2ZSAoZmQpOyBcCisgICAgaWYgKCFjbWFfX2lzX29wZW4oZmQpKSByZXR1cm4gKGNtYV9fc2V0X2Vycm5vIChFQkFERiksIC0xKTsgXAorICAgIGlmIChjbWFfX2lzc3VlX2lvX2NhbGwoZmQpKSB7XAorCWlmICgoIWNtYV9fZ19maWxlW2ZkXS0+c2V0X25vbl9ibG9ja2luZykgJiYgXAorCQkoY21hX19nX2ZpbGVbZmRdLT5ub25fYmxvY2tpbmcgPT0gY21hX2NfdHJ1ZSkpIFwKKwkgICAgY21hX19zZXRfbm9uYmxvY2tpbmcoZmQpOyBcCisgICAgICAgIGNtYV9faW50ZXJydXB0X2Rpc2FibGUgKDApOyBcCisJVFJZIHsgXAorCSAgICBfX3Jlc19fID0gZnVuYyBhcmdsaXN0OyBcCisJICAgIH0gXAorCUNBVENIX0FMTCB7IFwKKwkgICAgY21hX19pbnRlcnJ1cHRfZW5hYmxlICgwKTsgXAorCSAgICBjbWFfX2ZkX3VucmVzZXJ2ZSAoZmQpOyBcCisJICAgIFJFUkFJU0U7IFwKKwkgICAgfSBcCisJRU5EVFJZIFwKKyAgICAgICAgY21hX19pbnRlcnJ1cHRfZW5hYmxlICgwKTsgXAorCWlmICgoX19yZXNfXyAhPSAtMSkgXAorCQl8fCAoIWNtYV9faXNfYmxvY2tpbmcgKGVycm5vKSkgXAorCQl8fCAoY21hX19nX2ZpbGVbZmRdLT51c2VyX2ZsLnVzZXJfbm9uX2Jsb2NraW5nKSkgXAorCSAgICBfX2RvbmVfXyA9IGNtYV9jX3RydWU7IFwKKwl9IFwKKyAgICBpZiAoX19kb25lX18pIHsgXAorCWNtYV9fZmRfdW5yZXNlcnZlIChmZCk7IFwKKwl9IFwKKyAgICBlbHNlIHsgXAorCVRSWSB7IFwKKwkgICAgY21hX19pb19wcm9sb2cgKHR5cGUsIGZkKTsgXAorCSAgICB3aGlsZSAoIV9fZG9uZV9fKSB7IFwKKwkJY21hX19pb193YWl0ICh0eXBlLCBmZCk7IFwKKwkJX19yZXNfXyA9IGZ1bmMgYXJnbGlzdDsgXAorCQlpZiAoKF9fcmVzX18gIT0gLTEpIFwKKwkJCXx8ICghY21hX19pc19ibG9ja2luZyAoZXJybm8pKSBcCisJCQl8fCAoY21hX19nX2ZpbGVbZmRdLT51c2VyX2ZsLnVzZXJfbm9uX2Jsb2NraW5nKSkgXAorCQkgICAgX19kb25lX18gPSBjbWFfY190cnVlOyBcCisJCX0gXAorCSAgICB9IFwKKwlGSU5BTExZIHsgXAorCSAgICBjbWFfX2lvX2VwaWxvZyAodHlwZSwgZmQpOyBcCisJICAgIGNtYV9fZmRfdW5yZXNlcnZlIChmZCk7IFwKKwkgICAgfSBcCisJRU5EVFJZIFwKKwl9IFwKKyAgICBpZiAoX19yZXNfXyAhPSAtMSkgIHBvc3RfcHJvY2VzczsgXAorICAgIHJldHVybiBfX3Jlc19fOyAgXAorICAgIH0KKworICAgIC8qCisgICAgICogU2luY2UgbW9zdCBDTUEgInRocmVhZC1zeW5jaHJvbm91cyIgSS9PICgib3BlbiItdHlwZSkgb3BlcmF0aW9ucyBvbiAKKyAgICAgKiBVKml4IGZvbGxvdyB0aGUgZXhhY3Qgc2FtZSBzdHJ1Y3R1cmUsIHRoZSB3cmFwcGVyIHJvdXRpbmVzIGhhdmUgYmVlbgorICAgICAqIGNvbmRlbnNlZCBpbnRvIGEgbWFjcm8uCisgICAgICoKKyAgICAgKiBUaGUgc3RlcHMgcGVyZm9ybWVkIGFyZSBhcyBmb2xsb3dzOgorICAgICAqCTEuIElzc3VlIHRoZSBvcGVuIGZ1bmN0aW9uLgorICAgICAqCTIuIElmIHRoZSB2YWx1ZSByZXR1cm5lZCBpbmRpY2F0ZXMgYW4gZXJyb3IsIHJldHVybiBpdCB0byB0aGUgY2FsbGVyLgorICAgICAqICAzLiBJZiB0aGUgZmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGlzIGxhcmdlciB0aGFuIHdoYXQgd2UgdGhpbmsgaXMgdGhlCisgICAgICoJICAgIG1heGltdW0gdmFsdWUgKGllIGlmIGl0IGlzIHRvbyBiaWcgZm9yIG91ciBkYXRhYmFzZSkgdGhlbiBidWdjaGVjay4KKyAgICAgKiAgNC4gIk9wZW4iIHRoZSAiZmlsZSIgaW4gdGhlIENNQSBmaWxlIGRhdGFiYXNlLgorICAgICAqCTUuIFJldHVybiB0aGUgZmlsZSBkZXNjcmlwdG9yIHZhbHVlIHRvIHRoZSBjYWxsZXIuCisgICAgICoKKyAgICAgKiBGSVgtTUU6IGZvciB0aGUgdGltZSBiZWluZywgaWYgdGhlIEkvTyBvcGVyYXRpb24gcmV0dXJucyBFSU5UUiwgd2UgCisgICAgICoJICAgIHNpbXBseSByZXR1cm4gaXQgdG8gdGhlIGNhbGxlcjsgZXZlbnR1YWxseSwgd2Ugc2hvdWxkIGNhdGNoIHRoaXMgCisgICAgICoJICAgIGFuZCAiZG8gdGhlIHJpZ2h0IHRoaW5nIiAoaWYgd2UgY2FuIGZpZ3VyZSBvdXQgd2hhdCB0aGF0IGlzKS4KKyAgICAgKi8KKworLyoKKyAqIFRoaXMgbWFjcm8gaXMgdXNlZCBmb3IgYWxsICJvcGVuIi10eXBlIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYSBzaW5nbGUgZmlsZQorICogZGVzY2lwdG9yIGJ5IGltbWVkaWF0ZSB2YWx1ZS4KKyAqLworI2RlZmluZSBjbWFfX3RzX29wZW4oZnVuYyxhcmdsaXN0LHBvc3RfcHJvY2VzcykgIHsJCVwKKyAgICBpbnQJX19mZF9fOwkJCQkJCQlcCisgICAgVFJZIHsJCQkJCQkJXAorCWNtYV9faW50X2luaXQgKCk7CQkJCQlcCisJY21hX19pbnRfbG9jayAoY21hX19nX2lvX2RhdGFfbXV0ZXgpOwkJCVwKKwlfX2ZkX18gPSBmdW5jIGFyZ2xpc3Q7CQkJCQlcCisJY21hX19pbnRfdW5sb2NrIChjbWFfX2dfaW9fZGF0YV9tdXRleCk7CQkJXAorCWlmIChfX2ZkX18gPj0gMCAmJiBfX2ZkX18gPCBjbWFfX2dfbXhfZmlsZSkJCVwKKwkgICAgcG9zdF9wcm9jZXNzOwkJCQkJXAorCX0JCQkJCQkJXAorICAgIENBVENIX0FMTAkJCQkJCQlcCisJewkJCQkJCQlcCisJY21hX19zZXRfZXJybm8gKEVCQURGKTsJCQkJCVwKKwlfX2ZkX18gPSAtMTsJCQkJCQlcCisJfQkJCQkJCQlcCisgICAgRU5EVFJZCQkJCQkJCVwKKyAgICBpZiAoX19mZF9fID49IGNtYV9fZ19teF9maWxlKQkJCQlcCisJY21hX19idWdjaGVjayAoImNtYV9fdHNfb3BlbjogIGZkIGlzIHRvbyBsYXJnZSIpOwlcCisgICAgcmV0dXJuIF9fZmRfXzsJCQkJCQlcCisgICAgfQorLyoKKyAqIFRoaXMgbWFjcm8gaXMgdXNlZCBmb3IgYWxsICJvcGVuIi10eXBlIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYSBwYWlyIG9mIGZpbGUKKyAqIGRlc2NpcHRvcnMgYnkgcmVmZXJlbmNlIHBhcmFtZXRlci4KKyAqLworI2RlZmluZSBjbWFfX3RzX29wZW4yKGZ1bmMsZmRwYWlyLGFyZ2xpc3QscG9zdF9wcm9jZXNzKSAgewkJXAorICAgIGludAkgICAgX19yZXNfXzsJCQkJCQkJXAorICAgIFRSWSB7CQkJCQkJCQlcCisJY21hX19pbnRfaW5pdCAoKTsJCQkJCQlcCisJY21hX19pbnRfbG9jayAoY21hX19nX2lvX2RhdGFfbXV0ZXgpOwkJCQlcCisJX19yZXNfXyA9IGZ1bmMgYXJnbGlzdDsJCQkJCQlcCisJY21hX19pbnRfdW5sb2NrIChjbWFfX2dfaW9fZGF0YV9tdXRleCk7CQkJCVwKKwlpZiAoX19yZXNfXyA+PSAwICYmIGZkcGFpclswXSA8IGNtYV9fZ19teF9maWxlCQkJXAorCQkmJiBmZHBhaXJbMV0gPCBjbWFfX2dfbXhfZmlsZSkJCQkJXAorCSAgICBwb3N0X3Byb2Nlc3M7CQkJCQkJXAorCX0JCQkJCQkJCVwKKyAgICBDQVRDSF9BTEwJCQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJY21hX19zZXRfZXJybm8gKEVCQURGKTsJCQkJCQlcCisJX19yZXNfXyA9IC0xOwkJCQkJCQlcCisJfQkJCQkJCQkJXAorICAgIEVORFRSWQkJCQkJCQkJXAorICAgIGlmICgoZmRwYWlyWzBdID49IGNtYV9fZ19teF9maWxlKSB8fCAoZmRwYWlyWzFdID49IGNtYV9fZ19teF9maWxlKSkgXAorCWNtYV9fYnVnY2hlY2sgKCJjbWFfX3RzX29wZW4yOiAgb25lIG9mIGZkJ3MgaXMgdG9vIGxhcmdlIik7IFwKKyAgICByZXR1cm4gX19yZXNfXzsJCQkJCQkJXAorICAgIH0KKworLyoKKyAqIElOVEVSTkFMIElOVEVSRkFDRVMKKyAqLworZXh0ZXJuIHZvaWQgY21hX19jbG9zZV9nZW5lcmFsIChpbnQpOworCitleHRlcm4gdm9pZAorY21hX19pbml0X3RocmVhZF9pbyAodm9pZCk7CisKK2V4dGVybiBjbWFfdF9ib29sZWFuIGNtYV9faW9fYXZhaWxhYmxlICAoY21hX190X2lvX3R5cGUsaW50LHN0cnVjdCB0aW1ldmFsICopOworCitleHRlcm4gdm9pZCBjbWFfX2lvX2VwaWxvZyAgKGNtYV9fdF9pb190eXBlLGludCk7CisKK2V4dGVybiB2b2lkIGNtYV9faW9fcHJvbG9nICAoY21hX190X2lvX3R5cGUsaW50KTsKKworZXh0ZXJuIHZvaWQgY21hX19pb193YWl0ICAoY21hX190X2lvX3R5cGUsaW50KTsKKworZXh0ZXJuIHZvaWQgY21hX19vcGVuX2dlbmVyYWwgIChpbnQpOworCitleHRlcm4gdm9pZCBjbWFfX3JlaW5pdF90aHJlYWRfaW8gIChpbnQpOworCitleHRlcm4gdm9pZCBjbWFfX3NldF9ub25ibG9ja2luZyAgKGludCk7CisKK2V4dGVybiB2b2lkIGNtYV9fc2V0X3VzZXJfbm9uYmxvY2tfZmxhZ3MgIChpbnQsaW50KTsKKworZXh0ZXJuIGNtYV90X2Jvb2xlYW4KK2NtYV9faXNfb3BlbiAoaW50IGZkKTsKKworCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9nZGIvb3NmLXNoYXJlL2NtYV9hdHRyLmggYi9nZGIvb3NmLXNoYXJlL2NtYV9hdHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg5ZmQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9vc2Ytc2hhcmUvY21hX2F0dHIuaApAQCAtMCwwICsxLDM0MSBAQAorLyogCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBPUEVOIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQy4KKyAqIChjKSBDb3B5cmlnaHQgMTk5MC0xOTk2IEhFV0xFVFQtUEFDS0FSRCBDT01QQU5ZCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBESUdJVEFMIEVRVUlQTUVOVCBDT1JQT1JBVElPTgorICogKGMpIENvcHlyaWdodCAxOTkxLCAxOTkyIFNpZW1lbnMtTml4ZG9yZiBJbmZvcm1hdGlvbiBTeXN0ZW1zCisgKiBUbyBhbnlvbmUgd2hvIGFja25vd2xlZGdlcyB0aGF0IHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQKKyAqIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHk6IHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGlzIGZpbGUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgbm90aWNlIGFwcGVhcnMgaW4KKyAqIGFsbCBzb3VyY2UgY29kZSBjb3BpZXMsIGFuZCB0aGF0IG5vbmUgb2YgdGhlIG5hbWVzIGxpc3RlZCBhYm92ZSBiZSB1c2VkCisgKiBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBOb25lIG9mIHRoZXNlIG9yZ2FuaXphdGlvbnMKKyAqIG1ha2VzIGFueSByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZS4KKyAqLworLyoKKyAqCUhlYWRlciBmaWxlIGZvciBhdHRyaWJ1dGVzIG9iamVjdAorICovCisKKyNpZm5kZWYgQ01BX0FUVFIKKyNkZWZpbmUgQ01BX0FUVFIKKworLyoKKyAqICBJTkNMVURFIEZJTEVTCisgKi8KKworI2luY2x1ZGUgPGNtYV9kZWZzLmg+CisjaW5jbHVkZSA8Y21hX3F1ZXVlLmg+CisjaWZkZWYgX19ocHV4CisjIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2VuZGlmCisjaWYgX0NNQV9VTklYX1RZUEUgPT0gX0NNQV9fU1ZSNAorI2luY2x1ZGUgPHN5cy91bmlzdGQuaD4KKyNlbmRpZgorLyoKKyAqIENPTlNUQU5UUyBBTkQgTUFDUk9TCisgKi8KKworDAorLyoKKyAqICBGVU5DVElPTkFMIERFU0NSSVBUSU9OOgorICoKKyAqCWNtYV9faW50X2F0dHJfZ2V0X3ByaW9yaXR5IC0gIFBlcmZvcm1zIHRoZSB3b3JrIG9mIGNtYV9hdHRyX2dldF9wcmlvcml0eQorICoKKyAqICBGT1JNQUwgUEFSQU1FVEVSUzoKKyAqCisgKgljbWFfdF9hdHRyCSAgICAqX2F0dF8JLSBBdHRyaWJ1dGUgb2JqZWN0IHRvIGdldCBmcm9tCisgKgljbWFfdF9wcmlvcml0eQkgICAgKl9zZXR0aW5nXwktIEN1cnJlbnQgc2V0dGluZworICoKKyAqICBJTVBMSUNJVCBJTlBVVFM6CisgKgorICoJbm9uZQorICoKKyAqICBJTVBMSUNJVCBPVVRQVVRTOgorICoKKyAqCXByaW9yaXR5CisgKgorICogIEZVTkNUSU9OIFZBTFVFOgorICoKKyAqCW5vbmUKKyAqCisgKiAgU0lERSBFRkZFQ1RTOgorICoKKyAqCW5vbmUKKyAqLworI2RlZmluZSBjbWFfX2ludF9hdHRyX2dldF9wcmlvcml0eShfYXR0Xyxfc2V0dGluZ18pIHsgXAorICAgIGNtYV9fdF9pbnRfYXR0ciAgICAgKl9pbnRfYXR0XzsgXAorICAgIChfaW50X2F0dF8pID0gY21hX192YWxpZGF0ZV9kZWZhdWx0X2F0dHIgKF9hdHRfKTsgXAorICAgIGNtYV9faW50X2xvY2sgKChfaW50X2F0dF8pLT5tdXRleCk7IFwKKyAgICAoKihfc2V0dGluZ18pKSA9IChfaW50X2F0dF8pLT5wcmlvcml0eTsgXAorICAgIGNtYV9faW50X3VubG9jayAoKF9pbnRfYXR0XyktPm11dGV4KTsgXAorICAgIH0KKworDAorLyoKKyAqICBGVU5DVElPTkFMIERFU0NSSVBUSU9OOgorICoKKyAqCWNtYV9faW50X2F0dHJfZ2V0X3NjaGVkIC0gUGVyZm9ybXMgd29yayBvZiBjbWFfYXR0cl9nZXRfc2NoZWQKKyAqCisgKiAgRk9STUFMIFBBUkFNRVRFUlM6CisgKgorICoJY21hX3RfYXR0cgkgICAgKl9hdHRfCV8gQXR0cmlidXRlcyBvYmplY3QgdXNlZAorICoJY21hX3Rfc2NoZWRfcG9saWN5ICAqX3NldHRpbmdfCS0gQ3VycmVudCBzZXR0aW5nCisgKgorICogIElNUExJQ0lUIElOUFVUUzoKKyAqCisgKglub25lCisgKgorICogIElNUExJQ0lUIE9VVFBVVFM6CisgKgorICoJc2NoZWR1bGluZyBwb2xpY3kKKyAqCisgKiAgRlVOQ1RJT04gVkFMVUU6CisgKgorICoJbm9uZQorICoKKyAqICBTSURFIEVGRkVDVFM6CisgKgorICoJbm9uZQorICovCisjZGVmaW5lIGNtYV9faW50X2F0dHJfZ2V0X3NjaGVkKF9hdHRfLF9zZXR0aW5nXykgeyBcCisgICAgY21hX190X2ludF9hdHRyICAgICAqX2ludF9hdHRfOyBcCisgICAgKF9pbnRfYXR0XykgPSBjbWFfX3ZhbGlkYXRlX2RlZmF1bHRfYXR0ciAoX2F0dF8pOyBcCisgICAgY21hX19pbnRfbG9jayAoKF9pbnRfYXR0XyktPm11dGV4KTsgXAorICAgICgqKF9zZXR0aW5nXykpID0gKF9pbnRfYXR0XyktPnBvbGljeTsgXAorICAgIGNtYV9faW50X3VubG9jayAoKF9pbnRfYXR0XyktPm11dGV4KTsgXAorICAgIH0KKworDAorLyoKKyAqICBGVU5DVElPTkFMIERFU0NSSVBUSU9OOgorICoKKyAqCWNtYV9faW50X2F0dHJfZ2V0X2luaGVyaXRfc2NoZWQgLSBQZXJmb3JtcyB3b3JrIG9mIAorICoJY21hX2F0dHJfZ2V0X2luaGVyaXRfc2NoZWQKKyAqCisgKiAgRk9STUFMIFBBUkFNRVRFUlM6CisgKgorICoJY21hX3RfYXR0cgkgICAgKl9hdHRfCS0gQXR0cmlidXRlcyBvYmplY3QgdG8gdXNlCisgKgljbWFfdF9zY2hlZF9pbmhlcml0ICpfc2V0dGluZ18JLSBDdXJyZW50IHNldHRpbmcKKyAqCisgKiAgSU1QTElDSVQgSU5QVVRTOgorICoKKyAqCW5vbmUKKyAqCisgKiAgSU1QTElDSVQgT1VUUFVUUzoKKyAqCisgKglJbmhlcml0YWJsZSBzY2hlZHVsaW5nIHBvbGljeQorICoKKyAqICBGVU5DVElPTiBWQUxVRToKKyAqCisgKglub25lCisgKgorICogIFNJREUgRUZGRUNUUzoKKyAqCisgKglub25lCisgKi8KKyNkZWZpbmUgY21hX19pbnRfYXR0cl9nZXRfaW5oZXJpdF9zY2hlZChfYXR0Xyxfc2V0dGluZ18pIHsgXAorICAgIGNtYV9fdF9pbnRfYXR0cgkqX2ludF9hdHRfOyBcCisgICAgKF9pbnRfYXR0XykgPSBjbWFfX3ZhbGlkYXRlX2RlZmF1bHRfYXR0ciAoX2F0dF8pOyBcCisgICAgY21hX19pbnRfbG9jayAoKF9pbnRfYXR0XyktPm11dGV4KTsgXAorICAgICgqKF9zZXR0aW5nXykpIFwKKyAgICAgICAgPSAoKF9pbnRfYXR0XyktPmluaGVyaXRfc2NoZWQgPyBjbWFfY19zY2hlZF9pbmhlcml0IDogY21hX2Nfc2NoZWRfdXNlX2RlZmF1bHQpOyBcCisgICAgY21hX19pbnRfdW5sb2NrICgoX2ludF9hdHRfKS0+bXV0ZXgpOyBcCisgICAgfQorDAorLyoKKyAqICBGVU5DVElPTkFMIERFU0NSSVBUSU9OOgorICoKKyAqCWNtYV9faW50X2F0dHJfc2V0X3N0YWNrc2l6ZSAtIFBlcmZvcm1zIHdvcmsgZm9yIGNtYV9hdHRyX3NldF9zdGFja3NpemUKKyAqCisgKiAgRk9STUFMIFBBUkFNRVRFUlM6CisgKgorICogICAgICBjbWFfdF9hdHRyICAgICAgICAgICpfYXR0XyAgICAgIC0gQXR0cmlidXRlcyBvYmplY3QgdG8gdXNlCisgKgljbWFfdF9uYXR1cmFsCSAgICBfc2V0dGluZ18JLSBTZXR0aW5nCisgKgorICogIElNUExJQ0lUIElOUFVUUzoKKyAqCisgKglub25lCisgKgorICogIElNUExJQ0lUIE9VVFBVVFM6CisgKgorICoJbm9uZQorICoKKyAqICBGVU5DVElPTiBWQUxVRToKKyAqCisgKglub25lCisgKgorICogIFNJREUgRUZGRUNUUzoKKyAqCisgKglDaGFuZ2UgYXR0cmlidXRlIG9iamVjdHMgc3RhY2sgc2l6ZSBzZXR0aW5nCisgKi8KKyNkZWZpbmUgY21hX19pbnRfYXR0cl9zZXRfc3RhY2tzaXplKF9hdHRfLF9zZXR0aW5nXykgeyBcCisgICAgY21hX190X2ludF9hdHRyICAgICAqX2ludF9hdHRfOyBcCisgICAgaWYgKChfc2V0dGluZ18pIDw9IDApIFwKKyAgICAgICAgY21hX19lcnJvciAoY21hX3NfYmFkcGFyYW0pOyBcCisgICAgX2ludF9hdHRfID0gY21hX192YWxpZGF0ZV9hdHRyIChfYXR0Xyk7IFwKKyAgICBjbWFfX2ludF9sb2NrICgoX2ludF9hdHRfKS0+bXV0ZXgpOyBcCisgICAgX2ludF9hdHRfLT5zdGFja19zaXplID0gY21hX19yb3VuZHVwX2NodW5rc2l6ZShfc2V0dGluZ18pOyBcCisgICAgY21hX19mcmVlX2NhY2hlIChfaW50X2F0dF8sIGNtYV9fY19vYmpfdGNiKTsgXAorICAgIF9pbnRfYXR0Xy0+Y2FjaGVbY21hX19jX29ial90Y2JdLnJldmlzaW9uKys7IFwKKyAgICBfaW50X2F0dF8tPmNhY2hlW2NtYV9fY19vYmpfc3RhY2tdLnJldmlzaW9uKys7IFwKKyAgICBjbWFfX2ludF91bmxvY2sgKF9pbnRfYXR0Xy0+bXV0ZXgpOyBcCisgICAgfQorDAorLyoKKyAqICBGVU5DVElPTkFMIERFU0NSSVBUSU9OOgorICoKKyAqCWNtYV9faW50X2F0dHJfZ2V0X3N0YWNrc2l6ZSAtIFBlcmZvcm1zIHdvcmsgb2YgY21hX2F0dHJfZ2V0X3N0YWNrc2l6ZQorICoKKyAqICBGT1JNQUwgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGNtYV90X2F0dHIgICAgICAgICAgKl9hdHRfICAgICAgLSBBdHRyaWJ1dGVzIG9iamVjdCB0byB1c2UKKyAqCWNtYV90X25hdHVyYWwJICAgICpfc2V0dGluZ18JLSBDdXJyZW50IHNldHRpbmcKKyAqCisgKiAgSU1QTElDSVQgSU5QVVRTOgorICoKKyAqCW5vbmUKKyAqCisgKiAgSU1QTElDSVQgT1VUUFVUUzoKKyAqCisgKglBdHRyaWJ1dGUgb2JqZWN0cyBzdGFjayBzaXplIHNldHRpbmcKKyAqCisgKiAgRlVOQ1RJT04gVkFMVUU6CisgKgorICoJbm9uZQorICoKKyAqICBTSURFIEVGRkVDVFM6CisgKgorICoJbm9uZQorICovCisjZGVmaW5lIGNtYV9faW50X2F0dHJfZ2V0X3N0YWNrc2l6ZShfYXR0Xyxfc2V0dGluZ18pIHsgXAorICAgIGNtYV9fdF9pbnRfYXR0ciAgICAgKl9pbnRfYXR0XzsgXAorICAgIChfaW50X2F0dF8pID0gY21hX192YWxpZGF0ZV9kZWZhdWx0X2F0dHIgKF9hdHRfKTsgXAorICAgIGNtYV9faW50X2xvY2sgKChfaW50X2F0dF8pLT5tdXRleCk7IFwKKyAgICAoKihfc2V0dGluZ18pKSA9IChfaW50X2F0dF8pLT5zdGFja19zaXplOyBcCisgICAgY21hX19pbnRfdW5sb2NrICgoX2ludF9hdHRfKS0+bXV0ZXgpOyBcCisgICAgfQorCisMCisvKgorICogIEZVTkNUSU9OQUwgREVTQ1JJUFRJT046CisgKgorICoJY21hX19pbnRfYXR0cl9zZXRfZ3VhcmRzaXplIC0gUGVyZm9ybXMgd29yayBmb3IgY21hX2F0dHJfc2V0X2d1YXJkc2l6ZQorICoKKyAqICBGT1JNQUwgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGNtYV90X2F0dHIgICAgICAgICAgKl9hdHRfICAgICAgLSBBdHRyaWJ1dGVzIG9iamVjdCB0byB1c2UKKyAqCWNtYV90X25hdHVyYWwJICAgIF9zZXR0aW5nXwktIFNldHRpbmcKKyAqCisgKiAgSU1QTElDSVQgSU5QVVRTOgorICoKKyAqCW5vbmUKKyAqCisgKiAgSU1QTElDSVQgT1VUUFVUUzoKKyAqCisgKglub25lCisgKgorICogIEZVTkNUSU9OIFZBTFVFOgorICoKKyAqCW5vbmUKKyAqCisgKiAgU0lERSBFRkZFQ1RTOgorICoKKyAqCUNoYW5nZSBhdHRyaWJ1dGUgb2JqZWN0cyBndWFyZCBzaXplIHNldHRpbmcKKyAqLworI2RlZmluZSBjbWFfX2ludF9hdHRyX3NldF9ndWFyZHNpemUoX2F0dF8sX3NldHRpbmdfKSB7IFwKKyAgICBjbWFfX3RfaW50X2F0dHIgICAgICpfaW50X2F0dF87IFwKKyAgICBfaW50X2F0dF8gPSBjbWFfX3ZhbGlkYXRlX2F0dHIgKF9hdHRfKTsgXAorICAgIGNtYV9faW50X2xvY2sgKChfaW50X2F0dF8pLT5tdXRleCk7IFwKKyAgICBfaW50X2F0dF8tPmd1YXJkX3NpemUgPSBjbWFfX3JvdW5kdXBfY2h1bmtzaXplKF9zZXR0aW5nXyk7IFwKKyAgICBjbWFfX2ZyZWVfY2FjaGUgKF9pbnRfYXR0XywgY21hX19jX29ial90Y2IpOyBcCisgICAgX2ludF9hdHRfLT5jYWNoZVtjbWFfX2Nfb2JqX3RjYl0ucmV2aXNpb24rKzsgXAorICAgIF9pbnRfYXR0Xy0+Y2FjaGVbY21hX19jX29ial9zdGFja10ucmV2aXNpb24rKzsgXAorICAgIGNtYV9faW50X3VubG9jayAoX2ludF9hdHRfLT5tdXRleCk7IFwKKyAgICB9CisMCisvKgorICogIEZVTkNUSU9OQUwgREVTQ1JJUFRJT046CisgKgorICoJY21hX19pbnRfYXR0cl9nZXRfZ3VhcmRzaXplIC0gUGVyZm9ybXMgd29yayBvZiBjbWFfYXR0cl9nZXRfZ3VhcmRzaXplCisgKgorICogIEZPUk1BTCBQQVJBTUVURVJTOgorICoKKyAqICAgICAgY21hX3RfYXR0ciAgICAgICAgICAqX2F0dF8gICAgICAtIEF0dHJpYnV0ZXMgb2JqZWN0IHRvIHVzZQorICoJY21hX3RfbmF0dXJhbAkgICAgKl9zZXR0aW5nXwktIEN1cnJlbnQgc2V0dGluZworICoKKyAqICBJTVBMSUNJVCBJTlBVVFM6CisgKgorICoJbm9uZQorICoKKyAqICBJTVBMSUNJVCBPVVRQVVRTOgorICoKKyAqCUF0dHJpYnV0ZSBvYmplY3RzIGd1YXJkIHNpemUgc2V0dGluZworICoKKyAqICBGVU5DVElPTiBWQUxVRToKKyAqCisgKglub25lCisgKgorICogIFNJREUgRUZGRUNUUzoKKyAqCisgKglub25lCisgKi8KKyNkZWZpbmUgY21hX19pbnRfYXR0cl9nZXRfZ3VhcmRzaXplKF9hdHRfLF9zZXR0aW5nXykgeyBcCisgICAgY21hX190X2ludF9hdHRyICAgICAqX2ludF9hdHRfOyBcCisgICAgKF9pbnRfYXR0XykgPSBjbWFfX3ZhbGlkYXRlX2RlZmF1bHRfYXR0ciAoX2F0dF8pOyBcCisgICAgY21hX19pbnRfbG9jayAoKF9pbnRfYXR0XyktPm11dGV4KTsgXAorICAgICgqKF9zZXR0aW5nXykpID0gKF9pbnRfYXR0XyktPmd1YXJkX3NpemU7IFwKKyAgICBjbWFfX2ludF91bmxvY2sgKChfaW50X2F0dF8pLT5tdXRleCk7IFwKKyAgICB9CisKKy8qCisgKiBUWVBFREVGUworICovCisjaWZuZGVmIF9fU1REQ19fCitzdHJ1Y3QgQ01BX19UX0lOVF9NVVRFWDsJCS8qIEF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kgKi8KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBDTUFfX1RfQ0FDSEUgeworICAgIGNtYV90X25hdHVyYWwJCXJldmlzaW9uOwkvKiBSZXZpc2lvbnMgKi8KKyAgICBjbWFfdF9uYXR1cmFsCQljb3VudDsKKyAgICBjbWFfX3RfcXVldWUJCXF1ZXVlOwkvKiBDYWNoZSBoZWFkZXJzICovCisgICAgfSBjbWFfX3RfY2FjaGU7CisKK3R5cGVkZWYgc3RydWN0IENNQV9fVF9JTlRfQVRUUiB7CisgICAgY21hX190X29iamVjdAkJaGVhZGVyOwkJLyogQ29tbW9uIGhlYWRlciAqLworICAgIHN0cnVjdCBDTUFfX1RfSU5UX0FUVFIJKmF0dHJpYnV0ZXM7CS8qIFBvaW50IHRvIGNvbnRyb2xsaW5nIGF0dHIgKi8KKyAgICBzdHJ1Y3QgQ01BX19UX0lOVF9NVVRFWAkqbXV0ZXg7CQkvKiBTZXJpYWxpemUgYWNjZXNzIHRvIG9iamVjdCAqLworICAgIGNtYV90X3ByaW9yaXR5CQlwcmlvcml0eTsJLyogUHJpb3JpdHkgb2YgbmV3IHRocmVhZCAqLworICAgIGNtYV90X3NjaGVkX3BvbGljeQkJcG9saWN5OwkJLyogU2NoZWQgcG9saWN5IG9mIHRocmVhZCAqLworICAgIGNtYV90X2Jvb2xlYW4JCWluaGVyaXRfc2NoZWQ7CS8qIElzIHNjaGVkdWxpbmcgaW5oZXJpdGVkPyAqLworICAgIGNtYV90X25hdHVyYWwJCXN0YWNrX3NpemU7CS8qIFNpemUgb2Ygc3RhY2sgKGJ5dGVzKSAqLworICAgIGNtYV90X25hdHVyYWwJCWd1YXJkX3NpemU7CS8qIFNpemUgb2YgZ3VhcmQgKGJ5dGVzKSAqLworICAgIGNtYV90X211dGV4X2tpbmQJCW11dGV4X2tpbmQ7CS8qIE11dGV4IGtpbmQgKi8KKyAgICBjbWFfX3RfY2FjaGUJCWNhY2hlW2NtYV9fY19vYmpfbnVtXTsJLyogQ2FjaGUgaW5mb3JtYXRpb24gKi8KKyAgICBjbWFfdF9ib29sZWFuCQlkZWxldGVfcGVuZGluZzsJLyogYXR0ci4gb2JqLiBpcyBkZWxldGVkICovCisgICAgY21hX3RfbmF0dXJhbAkJcmVmY250OwkvKiBOdW1iZXIgb2Ygb2JqZWN0cyB1c2luZyBhdHRyLiBvYmogKi8KKyAgICB9IGNtYV9fdF9pbnRfYXR0cjsKKworLyoKKyAqICBHTE9CQUwgREFUQQorICovCisKK2V4dGVybiBjbWFfX3RfaW50X2F0dHIJY21hX19nX2RlZl9hdHRyOworCisvKgorICogSU5URVJOQUwgSU5URVJGQUNFUworICovCisKK2V4dGVybiB2b2lkIGNtYV9fZGVzdHJveV9hdHRyaWJ1dGVzICAoY21hX190X2ludF9hdHRyICopOworCitleHRlcm4gdm9pZCBjbWFfX2ZyZWVfYXR0cmlidXRlcyAgKGNtYV9fdF9pbnRfYXR0cgkqKTsKKworZXh0ZXJuIHZvaWQgY21hX19mcmVlX2NhY2hlICAoY21hX190X2ludF9hdHRyICosY21hX3RfbmF0dXJhbCApOworCitleHRlcm4gY21hX190X2ludF9hdHRyICpjbWFfX2dldF9hdHRyaWJ1dGVzICAoY21hX190X2ludF9hdHRyCSopOworCitleHRlcm4gdm9pZCBjbWFfX2luaXRfYXR0ciAgKHZvaWQpOworCitleHRlcm4gdm9pZCBjbWFfX3JlaW5pdF9hdHRyICAoY21hX3RfaW50ZWdlcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2RiL29zZi1zaGFyZS9jbWFfZGViX2NvcmUuaCBiL2dkYi9vc2Ytc2hhcmUvY21hX2RlYl9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhOWMzNAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9vc2Ytc2hhcmUvY21hX2RlYl9jb3JlLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qIAorICogKGMpIENvcHlyaWdodCAxOTkwLTE5OTYgT1BFTiBTT0ZUV0FSRSBGT1VOREFUSU9OLCBJTkMuCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBIRVdMRVRULVBBQ0tBUkQgQ09NUEFOWQorICogKGMpIENvcHlyaWdodCAxOTkwLTE5OTYgRElHSVRBTCBFUVVJUE1FTlQgQ09SUE9SQVRJT04KKyAqIChjKSBDb3B5cmlnaHQgMTk5MSwgMTk5MiBTaWVtZW5zLU5peGRvcmYgSW5mb3JtYXRpb24gU3lzdGVtcworICogVG8gYW55b25lIHdobyBhY2tub3dsZWRnZXMgdGhhdCB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0CisgKiBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5OiBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIG5vdGljZSBhcHBlYXJzIGluCisgKiBhbGwgc291cmNlIGNvZGUgY29waWVzLCBhbmQgdGhhdCBub25lIG9mIHRoZSBuYW1lcyBsaXN0ZWQgYWJvdmUgYmUgdXNlZAorICogaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorICogd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTm9uZSBvZiB0aGVzZSBvcmdhbml6YXRpb25zCisgKiBtYWtlcyBhbnkgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2UuCisgKi8KKy8qCisgKglUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJuYWwgaW50ZXJmYWNlIHRvIHRoZSBjb3JlIG9mIENNQSAKKyAqIAlkZWJ1Z2dpbmcgc2VydmljZXMuIChUaGUgY2xpZW50IGludGVyZmFjZSB0byBkZWJ1Z2dpbmcgc2VydmljZXMKKyAqCWlzIHByb3ZpZGVkIGJ5IGNtYV9kZWJ1Z19jbGllbnQuaCkuCisgKi8KKworI2lmbmRlZiBDTUFfREVCX0NPUkUKKyNkZWZpbmUgQ01BX0RFQl9DT1JFCisKKy8qCisgKiAgSU5DTFVERSBGSUxFUworICovCisjaW5jbHVkZSA8Y21hLmg+CisjaW5jbHVkZSA8Y21hX211dGV4Lmg+CisjaW5jbHVkZSA8Y21hX3F1ZXVlLmg+CisjaW5jbHVkZSA8Y21hX3RjYl9kZWZzLmg+CisjaW5jbHVkZSA8Y21hX3V0aWwuaD4KKworLyoKKyAqIENPTlNUQU5UUyBBTkQgTUFDUk9TCisgKi8KKworCisvKgorICogVFlQRURFRlMKKyAqLworCisvKkZJWC1NRSogTmVlZCB0byB1c2Ugc2l6ZXMgdGhhdCBhcmUgcGxhdGZvcm0gc3BlY2lmaWMgKi8KK3R5cGVkZWYgbG9uZyBpbnQgY21hX19fdF9kZWJ1Z19jdHhbMTddOworCisvKgorICogVHlwZSBkZWZpbmcgdGhlIGZvcm1hdCBvZiBrbm93biBvYmplY3QgbGlzdHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ01BX19UX0tOT1dOX09CSkVDVCB7CisgICAgY21hX190X3F1ZXVlCXF1ZXVlOwkJLyogUXVldWUgaGVhZGVyIGZvciBrbm93biBvYmplY3RzICovCisgICAgY21hX190X2ludF9tdXRleAkqbXV0ZXg7CQkvKiBNdXRleCB0byBjb250cm9sIGFjY2VzcyB0byBxdWV1ZSAqLworICAgIH0gY21hX190X2tub3duX29iamVjdDsKKworCisvKgorICogVHlwZSBkZWZpbmluZyB0aGUgcmVnaXN0cmF0aW9uIGZvciBvbmUgZGVidWcgY2xpZW50IChlLmcuIEFkYSkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ01BX19UX0RFQl9SRUdJU1RSWSB7CisgICAgY21hX3RfYWRkcmVzcwllbnRyeTsJCS8qIENsaWVudCdzIGRlYnVnIGVudHJ5IHBvaW50ICovCisgICAgY21hX3Rfa2V5CQlrZXk7CQkvKiBDbGllbnQncyBjb250ZXh0IGtleSAqLworICAgIGNtYV90X2ludGVnZXIJZmFjOwkJLyogQ2xpZW50J3MgZGVidWcgZmFjaWxpdHkgbnVtYmVyICovCisgICAgY21hX3RfYm9vbGVhbiAJaGFzX3Byb2xvZzsJLyogQ2xpZW50J3MgVENCcyBoYXZlIHN0ZCBwcm9sb2cgKi8KKyAgICB9IGNtYV9fdF9kZWJfcmVnaXN0cnk7CisKKyNkZWZpbmUgY21hX19jX2RlYl9tYXhfY2xpZW50cwkxMAorCisvKiAKKyAqIFR5cGUgZGVmaW5pbmcgdGhlIGdsb2JhbCBkZWJ1Z2dpbmcgc3RhdGUgZm9yIGFsbCB0aHJlYWRzLgorICovCit0eXBlZGVmIHN0cnVjdCBDTUFfX1RfREVCVUdfU1RBVEUgeworICAgIC8qIAorICAgICAqIFRoZSBmb2xsb3dpbmcgZmxhZyBpcyBzZXQgaWYgY2hhbmdlcyB3ZXJlIG1hZGUgd2hpbGUgaW4gdGhlCisgICAgICogZGVidWdnZXIgdGhhdCBtYXkgbWFrZSB0aGUgcmVhZHkgbGlzdHMgaW5jb25zaXN0ZW50LiAgRm9yIAorICAgICAqIGV4YW1wbGUsIGlmIGEgdGhyZWFkIHByaW9yaXR5IGlzIGNoYW5nZWQgaW4gdGhlIGRlYnVnZ2VyLCB0aGUKKyAgICAgKiB0aHJlYWQgaXMgbm90IG1vdmVkIGJldHdlZW4gcXVldWVzLiAgTWFraW5nIHRoaW5ncyBjb25zaXN0ZW50CisgICAgICogaXMgZGVmZXJyZWQgdG8gd2hlbiB0aGUgZGlzcGF0Y2hlciBpcyBuZXh0IGludm9rZWQgLS0gd2hpY2ggd2UKKyAgICAgKiB0cnkgdG8gbWFrZSB2ZXJ5IHNvb24uCisgICAgICovCisgICAgY21hX3RfYm9vbGVhbiAJaXNfaW5jb25zaXN0ZW5jeTsgICAvKiBSZWFkeSBsaXN0cyBhcmUgaW5jb25zaXN0ZW50ICovCisKKworICAgIGNtYV90X2Jvb2xlYW4gCWV2ZW50c19lbmFibGVkOwkgICAgLyogU2V0IGlmIF9hbnlfIGV2ZW50IGlzIGVuYWJsZWQgKi8KKyAgICBjbWFfdF9ib29sZWFuCWZsYWdzW2NtYV9fY19kZWJldnRfX2RpbV07IAkKKwkJCQkJICAgIC8qIFdoaWNoIGV2ZW50cyBhcmUgZW5hYmxlZCAqLworICAgIGNtYV9fdF9pbnRfdGNiCSpuZXh0X3RvX3J1bjsJICAgIC8qIFRDQiBvZiB0aHJlYWQgdG8gcnVuIG5leHQgKi8gCisKKyAgICBjbWFfX3RfaW50X211dGV4CSptdXRleDsJCSAgICAvKiBNdXRleCBmb3IgcmVnaXN0ZXJpbmcgY2xpZW50cyAqLworICAgIGNtYV90X2ludGVnZXIJY2xpZW50X2NvdW50OwkgICAgLyogQ291bnQgb2YgZGVidWcgY2xpZW50cyAqLworICAgIGNtYV9fdF9kZWJfcmVnaXN0cnkJY2xpZW50c1tjbWFfX2NfZGViX21heF9jbGllbnRzKzFdOworCQkJCQkgICAgLyogQXJyYXkgb2YgY3VycmVudCBkZWJ1ZyBjbGllbnRzICovCisgICAgfSBjbWFfX3RfZGVidWdfc3RhdGU7CisKKworLyogCisgKiBSb3V0aW5lIHRoYXQgd2lsbCBzeW1ib2xpemUgYW5kIGFkZHJlc3MgYW5kIHByaW50IGl0LgorICovCit0eXBlZGVmIHZvaWQJKCpjbWFfX3RfcHJpbnRfc3ltYm9sKSAoY21hX3RfYWRkcmVzcyk7CisKKworLyoKKyAqICBHTE9CQUwgREFUQQorICovCisKKy8qIAorICogVmFyaWFibGUgaG9sZGluZyB0aGUgZ2xvYmFsIGRlYnVnZ2luZyBzdGF0ZSAKKyAqCisgKiAoVGhpcyBpcyBwcmltYXJpbHkgd3JpdHRlbiBieSB0aGUgZGVidWdnZXIgaW50ZXJmYWNlIGFuZCByZWFkCisgKiBieSB0aGUgdGhyZWFkIGRpc3BhdGNoZXIpLgorICovCitleHRlcm4gY21hX190X2RlYnVnX3N0YXRlCWNtYV9fZ19kZWJ1Z19zdGF0ZTsKKworLyogCisgKiBLbm93biBvYmplY3QgcXVldWVzCisgKi8KK2V4dGVybiBjbWFfX3Rfa25vd25fb2JqZWN0CWNtYV9fZ19rbm93bl9hdHRzOworZXh0ZXJuIGNtYV9fdF9rbm93bl9vYmplY3QJY21hX19nX2tub3duX2N2czsKK2V4dGVybiBjbWFfX3Rfa25vd25fb2JqZWN0CWNtYV9fZ19rbm93bl9tdXRleGVzOworZXh0ZXJuIGNtYV9fdF9rbm93bl9vYmplY3QJY21hX19nX2tub3duX3RocmVhZHM7CisKKy8qCisgKiBJTlRFUk5BTCBJTlRFUkZBQ0VTCisgKi8KKworLyogR2V0IGluZm9ybWF0aW9uIHdoaWxlIGluIGRlYnVnZ2VyIGNvbnRleHQgKi8KK2V4dGVybiB2b2lkIGNtYV9fZGViX2dldCAKKyAgICAgICAgICAgKGNtYV9fdF9pbnRfdGNiICosY21hX3RfZGVidWdfZ2V0LGNtYV90X2FkZHJlc3MsY21hX3RfaW50ZWdlcixjbWFfdF9pbnRlZ2VyKTsKKworLyogU2V0IGluZm9ybWF0aW9uIHdoaWxlIGluIGRlYnVnZ2VyIGNvbnRleHQgKi8KK2V4dGVybiB2b2lkIGNtYV9fZGViX3NldCAoY21hX190X2ludF90Y2IgKixjbWFfdF9kZWJ1Z19zZXQsY21hX3RfYWRkcmVzcyxjbWFfdF9pbnRlZ2VyKTsKKworZXh0ZXJuIHZvaWQgY21hX19pbml0X2RlYnVnICh2b2lkKTsKKworZXh0ZXJuIHZvaWQgY21hX19yZWluaXRfZGVidWcgKGNtYV90X2ludGVnZXIpOworCitleHRlcm4gdm9pZCBjbWFfX2RlYl9hbnl0Y2JfdG9fdGNiIChjbWFfdF90Y2JfaGVhZGVyICosY21hX190X2ludF90Y2IgKiopOworCitleHRlcm4gdm9pZCBjbWFfX2RlYl9mYWNfdG9fY2xpZW50IChjbWFfdF9pbnRlZ2VyLGNtYV90X2tleSAqKTsKKworZXh0ZXJuIHZvaWQgY21hX19kZWJfZ2V0X2NsaWVudF9pbmZvIChjbWFfdF9rZXksY21hX3RfYWRkcmVzcyAqLGNtYV90X2Jvb2xlYW4gKik7CisKK2V4dGVybiB2b2lkIGNtYV9fZGViX2dldF9jb250ZXh0IChjbWFfX3RfaW50X3RjYiAqLGNtYV90X2tleSxjbWFfdF9hZGRyZXNzICopOworCitleHRlcm4gY21hX190X2ludF90Y2IgKmNtYV9fZGViX2dldF9zZWxmX3RjYiAodm9pZCk7CisKK2V4dGVybiB2b2lkIGNtYV9fZGViX2dldF90aW1lX3NsaWNlIChjbWFfdF9pbnRlcnZhbCAqKTsKKworZXh0ZXJuIGNtYV9fdF9pbnRfdGNiICpjbWFfX2RlYl9uZXh0X3RjYiAKKyAgICAgICAgICAgIChjbWFfX3RfaW50X3RjYiAqLGNtYV90X2ludGVnZXIgKixjbWFfdF9pbnRlZ2VyICosY21hX3RfYm9vbGVhbiAqKTsKKworZXh0ZXJuIGNtYV90X2Jvb2xlYW4gY21hX19kZWJfc2V0X2FsZXJ0IChjbWFfX3RfaW50X3RjYiAqKTsKKworZXh0ZXJuIHZvaWQgY21hX19kZWJfc2V0X25leHRfdGhyZWFkIChjbWFfX3RfaW50X3RjYiAqKTsKKwkKK2V4dGVybiB2b2lkIGNtYV9fZGViX3NldF9mb3JjZV9kaXNwYXRjaCAoY21hX3RfYWRkcmVzcyApOworCitleHRlcm4gdm9pZCBjbWFfX2RlYl9zZXRfdGltZV9zbGljZSAoY21hX3RfaW50ZXJ2YWwpOworCitleHRlcm4gdm9pZCBjbWFfX2RlYl9zaG93X3RocmVhZCAKKyAgICAgKGNtYV9fdF9pbnRfdGNiICosY21hX3RfYm9vbGVhbixjbWFfdF9ib29sZWFuLGNtYV9fX3RfZGVidWdfY3R4LGNtYV9fdF9lb2xfcm91dGluZSwKKyAgICAgICAgICAgICAgICBjbWFfX3RfZW9sX3JvdXRpbmUsY21hX190X3ByaW50X3N5bWJvbCk7CisKK2V4dGVybiB2b2lkCitjbWFfX2RlYl9zaG93X3N0YXRzIChjbWFfX3RfaW50X3RjYiAqLGNtYV90X2Jvb2xlYW4sY21hX3RfYm9vbGVhbixjbWFfX3RfZW9sX3JvdXRpbmUsY21hX190X2VvbF9yb3V0aW5lLGNtYV9fdF9wcmludF9zeW1ib2wpOworI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvb3NmLXNoYXJlL2NtYV9kZWJ1Z19jbGllbnQuaCBiL2dkYi9vc2Ytc2hhcmUvY21hX2RlYnVnX2NsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYjA5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvb3NmLXNoYXJlL2NtYV9kZWJ1Z19jbGllbnQuaApAQCAtMCwwICsxLDE5NSBAQAorLyogCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBPUEVOIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQy4KKyAqIChjKSBDb3B5cmlnaHQgMTk5MC0xOTk2IEhFV0xFVFQtUEFDS0FSRCBDT01QQU5ZCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBESUdJVEFMIEVRVUlQTUVOVCBDT1JQT1JBVElPTgorICogKGMpIENvcHlyaWdodCAxOTkxLCAxOTkyIFNpZW1lbnMtTml4ZG9yZiBJbmZvcm1hdGlvbiBTeXN0ZW1zCisgKiBUbyBhbnlvbmUgd2hvIGFja25vd2xlZGdlcyB0aGF0IHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQKKyAqIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHk6IHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGlzIGZpbGUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgbm90aWNlIGFwcGVhcnMgaW4KKyAqIGFsbCBzb3VyY2UgY29kZSBjb3BpZXMsIGFuZCB0aGF0IG5vbmUgb2YgdGhlIG5hbWVzIGxpc3RlZCBhYm92ZSBiZSB1c2VkCisgKiBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBOb25lIG9mIHRoZXNlIG9yZ2FuaXphdGlvbnMKKyAqIG1ha2VzIGFueSByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZS4KKyAqLworLyoKKyAqCUhlYWRlciBmaWxlIHByb3ZpZGluZyBhY2Nlc3MgdG8gQ01BIGNsaWVudHMgdGhhdCBpbXBsZW1lbnQKKyAqIAlsYW5ndWFnZSBydW4tdGltZXMgdG8gdGhlIENNQSBkZWJ1Z2dlciBjYXBhYmlsaXRpZXMuCisgKgorICoJTk9URTogdGhlIGNsaWVudHMgdGhhdCBhcmUgYWJsZSB0byB1c2UgdGhpcyBpbnRlcmZhY2UgaXMKKyAqCXZlcnkgbGltaXRlZCBiZWNhdXNlIGNsaWVudHMgbmVlZGluZyB0YXNrIGRlYnVnZ2luZyBtdXN0IGhhdmUgCisgKglzdXBwb3J0IGluIHRoZSBzeXN0ZW0gZGVidWdnZXIgYXMgd2VsbCBhcyBoZXJlIChhdCBwcmVzZW50KS4KKyAqCVRoZSBmb2xsb3dpbmcgYXJlIHRoZSBvbmx5IGxlZ2l0aW1hdGUgY2xpZW50cyBvZiB0aGlzIGludGVyZmFjZToKKyAqCUFEQSBydW50aW1lLCBDKysgdGFza2luZyBsaWJyYXJ5LCBhbmQgQ01BLgorICoKKyAqRklYLU1FKiBXZSBzaGFsbCBlbmRlYXZvciB0byBleHRlbmQgdGhlc2UgY2FwYWJpbGl0aWVzIHNvIHRoYXQgdGhlCisgKiAJYWxsLXBsYXRmb3JtIENNQSBkZWJ1Z2dlciBDTUFfREVCVUcgYW5kIGFueSBjbGllbnQgY2FuIGxheWVyCisgKiAJb24gdGhyZWFkIGRlYnVnZ2luZy4gIEJ1dCB0aGF0IGlzIHN0aWxsIGFuIG9wZW4gZGVzaWduIHByb2JsZW0uCisgKglUaGUgZGVzaWduIGhlcmUgZG9lcyBub3QgcHJlY2x1ZGUgdGhhdCBleHRlbnNpb24gKGZvciBleGFtcGxlLAorICoJdGhlIGlkZW50aXR5IG9mIHRoZSBkZWJ1Zy1jbGllbnQgaXMgaW5kaWNhdGVkIGluIGFuICJvcGVuIgorICoJbWFubmVyIGJ5IHVzaW5nIHRoZSBDTUEgY29udGV4dCBrZXkgYXMgdGhlIGlkZW50aWZpZXIuCisgKi8KKworI2lmbmRlZiBDTUFfREVCVUdfQ0xJRU5UCisjZGVmaW5lIENNQV9ERUJVR19DTElFTlQKKworLyoKKyAqICBJTkNMVURFIEZJTEVTCisgKi8KKyNpbmNsdWRlIDxjbWEuaD4KKworLyoKKyAqIENPTlNUQU5UUyBBTkQgTUFDUk9TCisgKi8KKworLyoKKyAqIFRZUEVERUZTCisgKi8KKworLyoKKyAqIFR5cGUgZGVzY3JpYmluZyBjb25zdGFudHMgZm9yIGEgdmFsaWQgVENCIHNlbnRpbmVsLgorICogRXhhY3RseSBvbmUgdmFsdWUgaXMgdmFsaWQsIGJ1dCB3ZSBwcm92aWRlIGEgc3ltYm9saWMgbmFtZSBmb3IKKyAqIGF0IGxlYXN0IG9uZSBpbnZhbGlkIHNlbnRpbmVsIGFzIGEgY29udmVuaWVuY2UuCisgKi8KK3R5cGVkZWYgZW51bSBDTUFfVF9UQ0JfU0VOVElORUwgeworCWNtYV9jX3RjYl9zZW50aW5lbF9ub2dvb2QgPSAwLAkvKiBJbnZhbGlkIHNlbnRpbmVsIGNvbnN0YW50ICovCisJY21hX2NfdGNiX3NlbnRpbmVsID0gMHgwQUNFRkFDRSAvKiBWYWxpZCBUQ0Igc2VudGluZWwgKi8KKwl9IGNtYV90X3RjYl9zZW50aW5lbDsKKworLyoKKyAqIFR5cGUgZGVzY3JpYmluZyBwYWQgZmllbGRzIG5lZWRlZCB0byBhbGlnbiB0aGUgInN0YW5kYXJkIHByb2xvZyIKKyAqIHRvIHRoZSByaWdodCBieXRlIGF0IHRoZSBmcm9udCBvZiBlYWNoIFRDQi4gIFRoZXNlIGZpZWxkcyBhcmUKKyAqIGZyZWUgdG8gYmUgcHV0IHRvIGFueSB1c2UgYnkgdGhlIGNsaWVudC4KKyAqCisgKiBUaGlzIGlzIDMyIGJ5dGVzIGxvbmcgYW5kIGlzIGZpeGVkIGF0IHRoaXMgc2l6ZSBmb3IgYWxsIGNsaWVudHMKKyAqIGFuZCBDTUEsIGZvciBhbGwgdGltZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ01BX1RfVENCX1BSSVZBVEUgeworICAgIGNtYV90X2ludGVnZXIJcGFkMTsJCQorICAgIGNtYV90X2ludGVnZXIJcGFkMjsJCisgICAgY21hX3RfaW50ZWdlcglwYWQzOworICAgIGNtYV90X2ludGVnZXIJcGFkNDsKKyAgICBjbWFfdF9pbnRlZ2VyCXBhZDU7CisgICAgY21hX3RfaW50ZWdlcglwYWQ2OworICAgIGNtYV90X2ludGVnZXIJcGFkNzsKKyAgICBjbWFfdF9pbnRlZ2VyCXBhZDg7CisgICAgfSBjbWFfdF90Y2JfcHJpdmF0ZTsKKworLyoKKyAqIFR5cGUgZGVzY3JpYmluZyB0aGUgInN0YW5kYXJkIHByb2xvZyIgdGhhdCBjbGllbnRzIHNob3VsZCB1c2UgCisgKiB3aXRoaW4gdGhlaXIgdGFzayBjb250cm9sIGJsb2Nrcy4gIFdlIGFzc3VtZSB0aGF0IHRoZSBjbGllbnQgd2lsbAorICogc3RvcmUgdGhlaXIgInRhc2sgY29udHJvbCBibG9jayIgYXMgYSBwZXItdGhyZWFkIGNvbnRleHQgdW5kZXIKKyAqIHRoZSBjb250ZXh0IGtleSBzcGVjaWZpZWQgaGVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ01BX1RfVENCX1BST0xPRyB7CisgICAgY21hX3RfdGNiX3NlbnRpbmVsCXNlbnRpbmVsOwkvKiBWYWxpZGl0eSBzZW50aW5lbCAqLworICAgIGNtYV90X3RocmVhZAljbGllbnRfdGhyZWFkOwkvKiBUaHJlYWQgY29ycmVzb25kaW5nIHRvIHRhc2sgKi8KKyAgICBjbWFfdF9rZXkJCWNsaWVudF9rZXk7CS8qIENvbnRleHQga2V5IHRoaXMgaXMgc3RvcmVkIHVuZGVyICovCisgICAgY21hX3RfYWRkcmVzcwlyZXNlcnZlZDE7CS8qIE11c3QgYmUgemVybywgcmVzZXJ2ZWQgdG8gQ01BICovCisgICAgfSBjbWFfdF90Y2JfcHJvbG9nOworCisvKgorICogVHlwZSBkZWZpbmluZyB0aGUgbGF5b3V0IG9mIGFsbCBUQ0JzIGFuZCBUQVNLUy4gIFRoaXMgZm9ybWF0CisgKiBlbnN1cmVzIHRoYXQgdGFza3Mgd2lsbCBiZSBzZWxmLWlkZW50aWZ5aW5nIHRvIHRoZSBkZWJ1Z2dlci4KKyAqIHRoaXMgbGF5b3V0IG11c3QgbmV2ZXIgY2hhbmdlIGFzIHRoZSBDTUEgREVCVUcgQ2xpZW50cyBjYW5ub3QKKyAqIGJlIGNoYW5nZWQgYWZ0ZXIgQ01BIHNoaXBzLgorICovCit0eXBlZGVmIHN0cnVjdCBDTUFfVF9UQ0JfSEVBREVSIHsKKyAgICBjbWFfdF90Y2JfcHJpdmF0ZQlJR05PUkVEOyAJLyogVENCIGZpZWxkcyBwcml2YXRlIHRvIHRoZSBjbGllbnQgKi8KKyAgICBjbWFfdF90Y2JfcHJvbG9nCXByb2xvZzsgCS8qIFRoZSBzdGFuZGFyZCBwcm9sb2cgZ29lcyBoZXJlICovCisgICAgfSBjbWFfdF90Y2JfaGVhZGVyOworCisKKy8qCisgKiBUeXBlIGRlc2NyaWJpbmcgdGhlIGtpbmRzIG9mIGluZm9ybWF0aW9uIHRoYXQgYSBDTUEgZGVidWcKKyAqIGNsaWVudCBjYW4gR0VUIGFib3V0IGEgdGhyZWFkLgorICovCit0eXBlZGVmIGVudW0gQ01BX1RfREVCVUdfR0VUIHsKKwkvKiAKKwkgKiBBbGwgb2YgdGhlIGZvbGxvd2luZyBpdGVtcyB1c2UgYSBidWZmZXIgd2hvc2Ugc2l6ZSBpcworCSAqIGZvdXIgYnl0ZXMuICAoVGhhdCBpcyBmb3VyIG11c3QgYmUgcGFzc2VkIGFzIHRoZSBidWZmZXJfc2l6ZQorCSAqIHBhcmFtZXRlciB0byBjbWFfZGVidWdfZ2V0LikKKwkgKi8KKwljbWFfY19kZWJnZXRfZ3VhcmRzaXplID0gMSwJLyogQ3VycmVudCBndWFyZCBzaXplIChieXRlcykgKi8KKwljbWFfY19kZWJnZXRfaXNfaGVsZCA9IDIsIAkvKiBJcyBpdCBvbiBob2xkPyAqLworCWNtYV9jX2RlYmdldF9pc19pbml0aWFsID0gMywgCS8qIElzIGl0IHRoZSBpbml0aWFsIHRocmVhZD8gKi8KKwljbWFfY19kZWJnZXRfbnVtYmVyID0gNCwgCS8qIFRocmVhZCdzIG51bWJlciAqLworCWNtYV9jX2RlYmdldF9zdGFja19wdHIgPSA1LCAJLyogQ3VycmVudCBzdGFjayBwb2ludGVyICovCisJY21hX2NfZGViZ2V0X3N0YWNrX2Jhc2UgPSA2LCAJLyogU3RhY2sgYmFzZSBhZGRyZXNzICovCisJY21hX2NfZGViZ2V0X3N0YWNrX3RvcCAJPSA3LCAJLyogU3RhY2sgdG9wIGFkZHJlc3MgKi8KKwljbWFfY19kZWJnZXRfc2NoZWRfc3RhdGUgPSA4LAkvKiBTY2hlZHVsZXIgc3RhdGUgCisJCQkJCSAqCTAgLSBydW4KKwkJCQkJICoJMSAtIHJlYWR5CisJCQkJCSAqIAkyIC0gYmxvY2tlZAorCQkJCQkgKiAJMyAtIHRlcm1pbmF0ZWQKKwkJCQkJICovCisJY21hX2NfZGViZ2V0X3Jlc2VydmVfc2l6ZSA9IDksIAkvKiBTaXplIG9mIHN0YWNrIHJlc2VydmUgKGJ5dGVzKSAqLworCWNtYV9jX2RlYmdldF9iYXNlX3ByaW8gPSAxMCwgCS8qIEJhc2UgcHJpb3JpdHkgKi8KKwljbWFfY19kZWJnZXRfcHJpb3JpdHkgPSAxMSwgCS8qIEN1cnJlbnQgcHJpb3JpdHkgKi8KKwljbWFfY19kZWJnZXRfcmVncyA9IDEyLAkJLyogUmVnaXN0ZXIgc2V0IChhbmQgcHJvYy4gc3RhdGUpICovCisJY21hX2NfZGViZ2V0X2FsdF9wZW5kaW5nID0gMTMsCS8qIEFsZXJ0IGlzIHBlbmRpbmcgKi8KKwljbWFfY19kZWJnZXRfYWx0X2FfZW5hYmxlID0gMTQsCS8qIEFzeW5jaCBhbGVydCBkZWxpdmVyeSBlbmFibGVkICovCisJY21hX2NfZGViZ2V0X2FsdF9nX2VuYWJsZSA9IDE1LAkvKiBHZW5lcmFsIGFsZXJ0IGRlbGl2ZXJ5IGVuYWJsZWQgKi8KKwljbWFfY19kZWJnZXRfc3Vic3RhdGUgPSAxNiwJLyogU3Vic3RhdGUgKG9yIHdhaXQgc3RhdGUpICovCisJY21hX2NfZGViZ2V0X29iamVjdF9hZGRyID0gMTcsCS8qIEFkZHJlc3Mgb2YgdGhyZWFkIG9iamVjdCAqLworCWNtYV9jX2RlYmdldF90aGtpbmQgPSAxOCwJLyogS2luZCBvZiB0aHJlYWQgKi8KKwljbWFfY19kZWJnZXRfZGV0YWNoZWQJPSAxOSwJLyogVGhyZWFkIGlzIGRldGFjaGVkICovCisJY21hX2NfZGViZ2V0X3RjYl9zaXplCT0gMjAsCS8qIFRDQiBzaXplICovCisJY21hX2NfZGViZ2V0X3N0YXJ0X3BjCT0gMjEsCS8qIFN0YXJ0IGFkZHJlc3MgKi8KKwljbWFfY19kZWJnZXRfbmV4dF9wYwk9IDIyLAkvKiBOZXh0IGluc3RydWN0aW9uICovCisJY21hX2NfZGViZ2V0X3BvbGljeQk9IDIzLAkvKiBTY2hlZCBwb2xpY3kgKi8KKwljbWFfY19kZWJnZXRfc3RhY2tfeWVsbG93ID0gMjQsCS8qIEFkZHIgb2Ygc3RhcnQgb2YgZ3VhcmQgYXJlYSAqLworCWNtYV9jX2RlYmdldF9zdGFja19kZWZhdWx0ID0gMjUJLyogVHJ1ZSBpZiBvbiBkZWZhdWx0IHN0YWNrICovCisKKwl9IGNtYV90X2RlYnVnX2dldDsKKworLyoKKyAqIFR5cGUgZGVzY3JpYmluZyB0aGUga2luZHMgb2YgaW5mb3JtYXRpb24gdGhhdCBhIENNQSBkZWJ1ZworICogY2xpZW50IGNhbiBTRVQgKG9yIGNoYW5nZSkgYWJvdXQgYSB0aHJlYWQgdXNpbmcgY21hX2RlYnVnX3NldC4KKyAqLwordHlwZWRlZiBlbnVtIENNQV9UX0RFQlVHX1NFVCB7CisJLyogCisJICogQWxsIG9mIHRoZSBmb2xsb3dpbmcgaXRlbXMgdXNlIGEgYnVmZmVyIHdob3NlIHNpemUgaXMKKwkgKiBmb3VyIGJ5dGVzLiAgKFRoYXQgaXMgZm91ciBtdXN0IGJlIHBhc3NlZCBhcyB0aGUgYnVmZmVyX3NpemUKKwkgKiBwYXJhbWV0ZXIgdG8gY21hX2RlYnVnX3NldC4pCisJICovCisJY21hX2NfZGVic2V0X3ByaW9yaXR5CT0gMSwgCS8qIFNldCB0aGUgcHJpb3JpdHkgKi8KKwljbWFfY19kZWJzZXRfcG9saWN5CT0gMiwJLyogU2V0IHRoZSBzY2hlZCBwb2xpY3kgKi8KKwljbWFfY19kZWJzZXRfaG9sZAk9IDMsCS8qIFB1dCB0aHJlYWQgb24gaG9sZCAqLworCWNtYV9jX2RlYnNldF9yZWdzCT0gNAkvKiBTZXQgdGhlIHJlZ3MgYW5kIHByb2MuIHN0YXRlICovCisKKwl9IGNtYV90X2RlYnVnX3NldDsKKworCisvKgorICogIEdMT0JBTCBEQVRBCisgKiAKKyAqIAlub25lCisgKi8KKworLyoKKyAqIEVYVEVSTkFMIElOVEVSRkFDRVMKKyAqLworCisvKiAKKyAqIFJvdXRpbmUgdG8gcmVnaXN0ZXIgd2l0aCB0aGUgQ01BIGRlYnVnIGRpc3BhdGNoZXIuCisgKi8KK2V4dGVybiB2b2lkICAgICBjbWFfZGVidWdfcmVnaXN0ZXIgKGNtYV90X2FkZHJlc3MsY21hX3Rfa2V5LGNtYV90X2ludGVnZXIsY21hX3RfYm9vbGVhbik7CisKKy8qIAorICogUm91dGluZSB0byBnZXQgZ2V0IHRocmVhZCBzdGF0ZSBuZWVkZWQgYnkgdGhlIENNQSBkZWJ1ZyBjbGllbnQuCisgKi8KK2V4dGVybiB2b2lkICAgICBjbWFfZGVidWdfZ2V0IChjbWFfdF90aHJlYWQgKixjbWFfdF9kZWJ1Z19nZXQsY21hX3RfYWRkcmVzcyxjbWFfdF9pbnRlZ2VyKTsKKworLyogCisgKiBHZXQgdGhyZWFkIGNvbnRleHQgZ2l2ZW4gYW4gc3AgYW5kIGEga2V5IAorICovCitleHRlcm4gdm9pZCBjbWFfZGVidWdfZ2V0X3NwX2NvbnRleHQgICAgKGNtYV90X2FkZHJlc3MsY21hX3Rfa2V5LGNtYV90X2FkZHJlc3MgKik7CisKKy8qIAorICogUm91dGluZSB0byBzZXQgdGhyZWFkIHN0YXRlIGFzIG5lZWRlZCBieSB0aGUgQ01BIGRlYnVnIGNsaWVudC4KKyAqLworZXh0ZXJuIHZvaWQgICAgIGNtYV9kZWJ1Z19zZXQgKGNtYV90X3RocmVhZCAqLGNtYV90X2RlYnVnX3NldCxjbWFfdF9hZGRyZXNzLGNtYV90X2ludGVnZXIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dkYi9vc2Ytc2hhcmUvY21hX2Vycm9ycy5oIGIvZ2RiL29zZi1zaGFyZS9jbWFfZXJyb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjMTc5NQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9vc2Ytc2hhcmUvY21hX2Vycm9ycy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIAorICogKGMpIENvcHlyaWdodCAxOTkwLTE5OTYgT1BFTiBTT0ZUV0FSRSBGT1VOREFUSU9OLCBJTkMuCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBIRVdMRVRULVBBQ0tBUkQgQ09NUEFOWQorICogKGMpIENvcHlyaWdodCAxOTkwLTE5OTYgRElHSVRBTCBFUVVJUE1FTlQgQ09SUE9SQVRJT04KKyAqIChjKSBDb3B5cmlnaHQgMTk5MSwgMTk5MiBTaWVtZW5zLU5peGRvcmYgSW5mb3JtYXRpb24gU3lzdGVtcworICogVG8gYW55b25lIHdobyBhY2tub3dsZWRnZXMgdGhhdCB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0CisgKiBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5OiBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIG5vdGljZSBhcHBlYXJzIGluCisgKiBhbGwgc291cmNlIGNvZGUgY29waWVzLCBhbmQgdGhhdCBub25lIG9mIHRoZSBuYW1lcyBsaXN0ZWQgYWJvdmUgYmUgdXNlZAorICogaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorICogd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTm9uZSBvZiB0aGVzZSBvcmdhbml6YXRpb25zCisgKiBtYWtlcyBhbnkgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2UuCisgKi8KKy8qCisgKglUaGlzIG1vZHVsZSBpcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gQ01BIHNlcnZpY2VzIGFuZCAKKyAqIAl0aGUgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3IgcmVwb3J0aW5nIG1lY2hhbmlzbS4KKyAqLworCisjaWZuZGVmIENNQV9FUlJPUlMKKyNkZWZpbmUgQ01BX0VSUk9SUworCisvKgorICogIElOQ0xVREUgRklMRVMKKyAqLworCisvKgorICogQ09OU1RBTlRTIEFORCBNQUNST1MKKyAqLworCisvKgorICogVFlQRURFRlMKKyAqLworCisvKgorICogIEdMT0JBTCBEQVRBCisgKi8KKworLyoKKyAqIElOVEVSTkFMIElOVEVSRkFDRVMKKyAqLworCisvKgorICogVGhlIGNtYV9fYnVnY2hlY2sgZnVuY3Rpb24gd2lsbCBwcmludCBpbmZvcm1hdGlvbiB0byBzdGRlcnIgKG9yIHN5cyRlcnJvcgorICogb24gVk1TKSwgYW5kIG1vcmUgZXh0ZW5zaXZlIGluZm9ybWF0aW9uIHRvIHRoZSBmaWxlIGNtYV9kdW1wLmxvZyBpbiB0aGUKKyAqIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisgKi8KK2V4dGVybiB2b2lkIGNtYV9fYnVnY2hlY2sgIChjaGFyICosLi4uKTsKKworZXh0ZXJuIHZvaWQgY21hX19lcnJvciAgKGludCk7CisKK2V4dGVybiB2b2lkIGNtYV9fdW5pbXBsZW1lbnRlZCAodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2RiL29zZi1zaGFyZS9jbWFfaGFuZGxlLmggYi9nZGIvb3NmLXNoYXJlL2NtYV9oYW5kbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjNkZTAxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL29zZi1zaGFyZS9jbWFfaGFuZGxlLmgKQEAgLTAsMCArMSwxODIgQEAKKy8qIAorICogKGMpIENvcHlyaWdodCAxOTkwLTE5OTYgT1BFTiBTT0ZUV0FSRSBGT1VOREFUSU9OLCBJTkMuCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBIRVdMRVRULVBBQ0tBUkQgQ09NUEFOWQorICogKGMpIENvcHlyaWdodCAxOTkwLTE5OTYgRElHSVRBTCBFUVVJUE1FTlQgQ09SUE9SQVRJT04KKyAqIChjKSBDb3B5cmlnaHQgMTk5MSwgMTk5MiBTaWVtZW5zLU5peGRvcmYgSW5mb3JtYXRpb24gU3lzdGVtcworICogVG8gYW55b25lIHdobyBhY2tub3dsZWRnZXMgdGhhdCB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0CisgKiBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5OiBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIG5vdGljZSBhcHBlYXJzIGluCisgKiBhbGwgc291cmNlIGNvZGUgY29waWVzLCBhbmQgdGhhdCBub25lIG9mIHRoZSBuYW1lcyBsaXN0ZWQgYWJvdmUgYmUgdXNlZAorICogaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorICogd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTm9uZSBvZiB0aGVzZSBvcmdhbml6YXRpb25zCisgKiBtYWtlcyBhbnkgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2UuCisgKi8KKy8qCisgKglIZWFkZXIgZmlsZSBmb3IgaGFuZGxlcworICovCisKKyNpZm5kZWYgQ01BX0hBTkRMRQorI2RlZmluZSBDTUFfSEFORExFCisKKy8qCisgKiAgSU5DTFVERSBGSUxFUworICovCisKKyNpbmNsdWRlIDxjbWFfZGVmcy5oPgorI2luY2x1ZGUgPGNtYV9hdHRyLmg+CisKKy8qCisgKiBDT05TVEFOVFMgQU5EIE1BQ1JPUworICovCisKKyNkZWZpbmUgY21hX192YWxpZGF0ZV9hdHRyKGhhbmRsZSkgXAorICAgICgoY21hX190X2ludF9hdHRyICopY21hX192YWxpZGF0ZV9oYW5kbGUgKCBcCisJICAgIChjbWFfdF9oYW5kbGUgKikoaGFuZGxlKSwgXAorCSAgICBjbWFfX2Nfb2JqX2F0dHIpKQorCisjZGVmaW5lIGNtYV9fdmFsaWRhdGVfY3YoaGFuZGxlKSBcCisgICAgKChjbWFfX3RfaW50X2N2ICopY21hX192YWxpZGF0ZV9oYW5kbGUgKCBcCisJICAgIChjbWFfdF9oYW5kbGUgKikoaGFuZGxlKSwgXAorCSAgICBjbWFfX2Nfb2JqX2N2KSkKKworI2RlZmluZSBjbWFfX3ZhbGlkYXRlX211dGV4KGhhbmRsZSkgXAorICAgICgoY21hX190X2ludF9tdXRleCAqKWNtYV9fdmFsaWRhdGVfaGFuZGxlICggXAorCSAgICAoY21hX3RfaGFuZGxlICopKGhhbmRsZSksIFwKKwkgICAgY21hX19jX29ial9tdXRleCkpCisKKyNkZWZpbmUgY21hX192YWxpZGF0ZV90Y2IoaGFuZGxlKSBcCisgICAgKChjbWFfX3RfaW50X3RjYiAqKWNtYV9fdmFsaWRhdGVfaGFuZGxlICggXAorCSAgICAoY21hX3RfaGFuZGxlICopKGhhbmRsZSksIFwKKwkgICAgY21hX19jX29ial90Y2IpKQorCisjZGVmaW5lIGNtYV9fdmFsaWRhdGVfc3RhY2soaGFuZGxlKSBcCisgICAgKChjbWFfX3RfaW50X3N0YWNrICopY21hX192YWxpZGF0ZV9oYW5kbGUgKCBcCisJICAgIChjbWFfdF9oYW5kbGUgKikoaGFuZGxlKSwgXAorCSAgICBjbWFfX2Nfb2JqX3N0YWNrKSkKKworI2RlZmluZSBjbWFfX3ZhbGlkYXRlX251bGxfYXR0cihoYW5kbGUpIFwKKyAgICAoKGNtYV9fdF9pbnRfYXR0ciAqKWNtYV9fdmFsaWRhdGVfaGFuZGxlX251bGwgKCBcCisJICAgIChjbWFfdF9oYW5kbGUgKikoaGFuZGxlKSwgXAorCSAgICBjbWFfX2Nfb2JqX2F0dHIpKQorCisjZGVmaW5lIGNtYV9fdmFsaWRhdGVfbnVsbF9jdihoYW5kbGUpIFwKKyAgICAoKGNtYV9fdF9pbnRfY3YgKiljbWFfX3ZhbGlkYXRlX2hhbmRsZV9udWxsICggXAorCSAgICAoY21hX3RfaGFuZGxlICopKGhhbmRsZSksIFwKKwkgICAgY21hX19jX29ial9jdikpCisKKyNkZWZpbmUgY21hX192YWxpZGF0ZV9udWxsX211dGV4KGhhbmRsZSkgXAorICAgICgoY21hX190X2ludF9tdXRleCAqKWNtYV9fdmFsaWRhdGVfaGFuZGxlX251bGwgKCBcCisJICAgIChjbWFfdF9oYW5kbGUgKikoaGFuZGxlKSwgXAorCSAgICBjbWFfX2Nfb2JqX211dGV4KSkKKworI2RlZmluZSBjbWFfX3ZhbGlkYXRlX251bGxfdGNiKGhhbmRsZSkgXAorICAgICgoY21hX190X2ludF90Y2IgKiljbWFfX3ZhbGlkYXRlX2hhbmRsZV9udWxsICggXAorCSAgICAoY21hX3RfaGFuZGxlICopKGhhbmRsZSksIFwKKwkgICAgY21hX19jX29ial90Y2IpKQorCisjZGVmaW5lIGNtYV9fdmFsaWRhdGVfbnVsbF9zdGFjayhoYW5kbGUpIFwKKyAgICAoKGNtYV9fdF9pbnRfc3RhY2sgKiljbWFfX3ZhbGlkYXRlX2hhbmRsZV9udWxsICggXAorCSAgICAoY21hX3RfaGFuZGxlICopKGhhbmRsZSksIFwKKwkgICAgY21hX19jX29ial9zdGFjaykpCisKKyNkZWZpbmUgY21hX192YWxfYXR0cl9zdGF0KGhhbmRsZSxvYmopIFwKKyAgICBjbWFfX3ZhbF9oYW5kX3N0YXQgKCBcCisJICAgIChjbWFfdF9oYW5kbGUgKikoaGFuZGxlKSwgXAorCSAgICBjbWFfX2Nfb2JqX2F0dHIsIFwKKwkgICAgKGNtYV9fdF9vYmplY3QgKiopb2JqKQorCisjZGVmaW5lIGNtYV9fdmFsX2N2X3N0YXQoaGFuZGxlLG9iaikgXAorICAgIGNtYV9fdmFsX2hhbmRfc3RhdCAoIFwKKwkgICAgKGNtYV90X2hhbmRsZSAqKShoYW5kbGUpLCBcCisJICAgIGNtYV9fY19vYmpfY3YsIFwKKwkgICAgKGNtYV9fdF9vYmplY3QgKiopb2JqKQorCisjZGVmaW5lIGNtYV9fdmFsX211dGV4X3N0YXQoaGFuZGxlLG9iaikgXAorICAgIGNtYV9fdmFsX2hhbmRfc3RhdCAoIFwKKwkgICAgKGNtYV90X2hhbmRsZSAqKShoYW5kbGUpLCBcCisJICAgIGNtYV9fY19vYmpfbXV0ZXgsIFwKKwkgICAgKGNtYV9fdF9vYmplY3QgKiopb2JqKQorCisjZGVmaW5lIGNtYV9fdmFsX3RjYl9zdGF0KGhhbmRsZSkgXAorICAgIGNtYV9fdmFsX2hhbmRfc3RhdCAoIFwKKwkgICAgKGNtYV90X2hhbmRsZSAqKShoYW5kbGUpLCBcCisJICAgIGNtYV9fY19vYmpfdGNiLCBcCisJICAgIChjbWFfX3Rfb2JqZWN0ICoqKW9iaikKKworI2RlZmluZSBjbWFfX3ZhbF9zdGFja19zdGF0KGhhbmRsZSxvYmopIFwKKyAgICBjbWFfX3ZhbF9oYW5kX3N0YXQgKCBcCisJICAgIChjbWFfdF9oYW5kbGUgKikoaGFuZGxlKSwgXAorCSAgICBjbWFfX2Nfb2JqX3N0YWNrLCBcCisJICAgIChjbWFfX3Rfb2JqZWN0ICoqKW9iaikKKworI2RlZmluZSBjbWFfX3ZhbF9udWxsYXR0cl9zdGF0KGhhbmRsZSxvYmopIFwKKyAgICBjbWFfX3ZhbF9oYW5kbnVsbF9zdGF0ICggXAorCSAgICAoY21hX3RfaGFuZGxlICopKGhhbmRsZSksIFwKKwkgICAgY21hX19jX29ial9hdHRyLCBcCisJICAgIChjbWFfX3Rfb2JqZWN0ICoqKW9iaikKKworI2RlZmluZSBjbWFfX3ZhbF9udWxsY3Zfc3RhdChoYW5kbGUsb2JqKSBcCisgICAgY21hX192YWxfaGFuZG51bGxfc3RhdCAoIFwKKwkgICAgKGNtYV90X2hhbmRsZSAqKShoYW5kbGUpLCBcCisJICAgIGNtYV9fY19vYmpfY3YsIFwKKwkgICAgKGNtYV9fdF9vYmplY3QgKiopb2JqKQorCisjZGVmaW5lIGNtYV9fdmFsX251bGxtdXRleF9zdGF0KGhhbmRsZSxvYmopIFwKKyAgICBjbWFfX3ZhbF9oYW5kbnVsbF9zdGF0ICggXAorCSAgICAoY21hX3RfaGFuZGxlICopKGhhbmRsZSksIFwKKwkgICAgY21hX19jX29ial9tdXRleCwgXAorCSAgICAoY21hX190X29iamVjdCAqKilvYmopCisKKyNkZWZpbmUgY21hX192YWxfbnVsbHRjYl9zdGF0KGhhbmRsZSxvYmopIFwKKyAgICBjbWFfX3ZhbF9oYW5kbnVsbF9zdGF0ICggXAorCSAgICAoY21hX3RfaGFuZGxlICopKGhhbmRsZSksIFwKKwkgICAgY21hX19jX29ial90Y2IsIFwKKwkgICAgKGNtYV9fdF9vYmplY3QgKiopb2JqKQorCisjZGVmaW5lIGNtYV9fdmFsX251bGxzdGFja19zdGF0KGhhbmRsZSkgXAorICAgIGNtYV9fdmFsX2hhbmRudWxsX3N0YXQgKCBcCisJICAgIChjbWFfdF9oYW5kbGUgKikoaGFuZGxlKSwgXAorCSAgICBjbWFfX2Nfb2JqX3N0YWNrLCBcCisJICAgIChjbWFfX3Rfb2JqZWN0ICoqKW9iaikKKworLyoKKyAqIFRZUEVERUZTCisgKi8KKworLyoKKyAqIEludGVybmFsIGZvcm1hdCBvZiBhIGhhbmRsZSAodG8gdGhlIG91dHNpZGUgd29ybGQgaXQncyBhbiBhcnJheSBvZiB0d28KKyAqIGFkZHJlc3NlcywgYnV0IHdlIGtub3cgYmV0dGVyKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ01BX19UX0lOVF9IQU5ETEUgeworICAgIGNtYV9fdF9vYmplY3QJKnBvaW50ZXI7CS8qIEFkZHJlc3Mgb2YgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgY21hX190X3Nob3J0CXNlcXVlbmNlOwkvKiBTZXF1ZW5jZSBudW1iZXIgb2Ygb2JqZWN0ICovCisgICAgY21hX190X3Nob3J0CXR5cGU7CQkvKiBUeXBlIGNvZGUgb2Ygb2JqZWN0ICovCisgICAgfSBjbWFfX3RfaW50X2hhbmRsZTsKKworLyoKKyAqICBHTE9CQUwgREFUQQorICovCisKKy8qCisgKiBJTlRFUk5BTCBJTlRFUkZBQ0VTCisgKi8KKworZXh0ZXJuIHZvaWQgY21hX19jbGVhcl9oYW5kbGUgKGNtYV90X2hhbmRsZSAqKTsKKworZXh0ZXJuIHZvaWQgY21hX19vYmplY3RfdG9faGFuZGxlIChjbWFfX3Rfb2JqZWN0ICosY21hX3RfaGFuZGxlICopOworCitleHRlcm4gY21hX190X2ludF9hdHRyICogY21hX192YWxpZGF0ZV9kZWZhdWx0X2F0dHIgKGNtYV90X2hhbmRsZSAqKTsKKworZXh0ZXJuIGNtYV90X3N0YXR1cyBjbWFfX3ZhbF9kZWZhdHRyX3N0YXQgKGNtYV90X2hhbmRsZSAqLGNtYV9fdF9pbnRfYXR0ciAqKik7CisKK2V4dGVybiBjbWFfX3Rfb2JqZWN0ICogY21hX192YWxpZGF0ZV9oYW5kbGUgKGNtYV90X2hhbmRsZSAqLGNtYV90X25hdHVyYWwgKTsKKworZXh0ZXJuIGNtYV90X3N0YXR1cyBjbWFfX3ZhbF9oYW5kX3N0YXQgKGNtYV90X2hhbmRsZSAqLGNtYV90X25hdHVyYWwsY21hX190X29iamVjdCAqKik7CisKK2V4dGVybiAJY21hX190X29iamVjdAkqY21hX192YWxpZGF0ZV9oYW5kbGVfbnVsbCAoY21hX3RfaGFuZGxlICosY21hX3RfbmF0dXJhbCk7CisKK2V4dGVybiBjbWFfdF9zdGF0dXMgY21hX192YWxfaGFuZG51bGxfc3RhdCAoY21hX3RfaGFuZGxlICosY21hX3RfbmF0dXJhbCxjbWFfX3Rfb2JqZWN0ICoqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvb3NmLXNoYXJlL2NtYV9pbml0LmggYi9nZGIvb3NmLXNoYXJlL2NtYV9pbml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwOTczNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9vc2Ytc2hhcmUvY21hX2luaXQuaApAQCAtMCwwICsxLDExNCBAQAorLyogCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBPUEVOIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQy4KKyAqIChjKSBDb3B5cmlnaHQgMTk5MC0xOTk2IEhFV0xFVFQtUEFDS0FSRCBDT01QQU5ZCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBESUdJVEFMIEVRVUlQTUVOVCBDT1JQT1JBVElPTgorICogKGMpIENvcHlyaWdodCAxOTkxLCAxOTkyIFNpZW1lbnMtTml4ZG9yZiBJbmZvcm1hdGlvbiBTeXN0ZW1zCisgKiBUbyBhbnlvbmUgd2hvIGFja25vd2xlZGdlcyB0aGF0IHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQKKyAqIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHk6IHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGlzIGZpbGUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgbm90aWNlIGFwcGVhcnMgaW4KKyAqIGFsbCBzb3VyY2UgY29kZSBjb3BpZXMsIGFuZCB0aGF0IG5vbmUgb2YgdGhlIG5hbWVzIGxpc3RlZCBhYm92ZSBiZSB1c2VkCisgKiBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBOb25lIG9mIHRoZXNlIG9yZ2FuaXphdGlvbnMKKyAqIG1ha2VzIGFueSByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZS4KKyAqLworLyoKKyAqCUhlYWRlciBmaWxlIGZvciBDTUEgaW5pdGlhbGl6YXRpb24KKyAqLworCisjaWZuZGVmIENNQV9JTklUCisjZGVmaW5lIENNQV9JTklUCisKKy8qCisgKiAgSU5DTFVERSBGSUxFUworICovCisjaW5jbHVkZSA8ZGNlL2NtYV9ob3N0Lmg+CisjaW5jbHVkZSA8Y21hX2Vycm9ycy5oPgorCisvKgorICogQ09OU1RBTlRTIEFORCBNQUNST1MKKyAqLworCisjZGVmaW5lIGNtYV9fY19lbnZfbWF4YXR0cgkwCisjZGVmaW5lIGNtYV9fY19lbnZfbWluYXR0cgkxCisjZGVmaW5lIGNtYV9fY19lbnZfbWF4Y29uZAkyCisjZGVmaW5lCWNtYV9fY19lbnZfbWluY29uZAkzCisjZGVmaW5lIGNtYV9fY19lbnZfbWF4bXV0ZXgJNAorI2RlZmluZSBjbWFfX2NfZW52X21pbm11dGV4CTUKKyNkZWZpbmUgY21hX19jX2Vudl9tYXh0aHJlYWQJNgorI2RlZmluZSBjbWFfX2NfZW52X21pbnRocmVhZAk3CisjZGVmaW5lIGNtYV9fY19lbnZfbWF4Y2x1c3Rlcgk4CisjZGVmaW5lIGNtYV9fY19lbnZfbWluY2x1c3Rlcgk5CisjZGVmaW5lIGNtYV9fY19lbnZfbWF4dnAJMTAKKyNkZWZpbmUgY21hX19jX2Vudl9tdWx0aXBsZXgJMTEKKyNkZWZpbmUgY21hX19jX2Vudl90cmFjZQkxMgorI2RlZmluZSBjbWFfX2NfZW52X3RyYWNlX2ZpbGUJMTMKKworI2RlZmluZSBjbWFfX2NfZW52X2NvdW50CTEzCisKKworLyoKKyAqIGNtYV9faW50X2luaXQKKyAqCisgKiBJbml0aWFsaXplIHRoZSBtYWluIGJvZHkgb2YgQ01BIGV4YWN0bHkgb25jZS4KKyAqCisgKiBXZSByYWlzZSBhbiBleGNlcHRpb24gaWYsIGZvciBzb21lIG9kZCByZWFzb24sIHRoZXJlIGFyZSBhbHJlYWR5IHRocmVhZHMKKyAqIGluIHRoZSBlbnZpcm9ubWVudCAoZS5nLiBrZXJuZWwgdGhyZWFkcyksIGFuZCBvbmUgb2YgdGhlbSBpcyB0cnlpbmcgdG8KKyAqIGluaXRpYWxpemUgQ01BIGJlZm9yZSB0aGUgIGZpcnN0IHRocmVhZCBnb3QgYWxsIHRoZSB3YXkgdGhyb3VnaCB0aGUgYWN0dWFsCisgKiBpbml0aWFsaXphdGlvbi4gVGhpcyBjb2RlIG1haW50YWlucyB0aGUgaW52YXJpYW50czogImFmdGVyIHN1Y2Nlc3NmdWxseQorICogY2FsbGluZyBDTUFfSU5JVCwgeW91IGNhbiBjYWxsIGFueSBDTUEgZnVuY3Rpb24iLCBhbmQgICJDTUEgaXMgYWN0dWFsbHkKKyAqIGluaXRpYWxpemVkIGF0IG1vc3Qgb25jZSIuCisgKi8KKy8qI2lmbmRlZiBfSFBfTElCQ19SICovCisKKyNpZiAgZGVmaW5lZCBfSFBfTElCQ19SICB8fChkZWZpbmVkKFNOSV9TVlI0KSAmJiAhZGVmaW5lZChDTUFfSU5JVF9ORUVERUQpKQorIyBkZWZpbmUgY21hX19pbnRfaW5pdCgpCisjZWxzZQorIyBkZWZpbmUgY21hX19pbnRfaW5pdCgpIHsgXAorICAgIGlmICghY21hX190YWNfaXNzZXQoJmNtYV9fZ19pbml0X3N0YXJ0ZWQpKSB7IFwKKwlpZiAoIWNtYV9fdGVzdF9hbmRfc2V0ICgmY21hX19nX2luaXRfc3RhcnRlZCkpIHsgXAorCSAgICBjbWFfX2luaXRfc3RhdGljICgpOyBcCisJICAgIGNtYV9fdGVzdF9hbmRfc2V0ICgmY21hX19nX2luaXRfZG9uZSk7IFwKKwkgICAgfSBcCisJZWxzZSBpZiAoIWNtYV9fdGFjX2lzc2V0ICgmY21hX19nX2luaXRfZG9uZSkpIHsgXAorCSAgICBjbWFfX2Vycm9yIChjbWFfc19pbmlhbHJwcm8pOyBcCisgICAgfX19CisjZW5kaWYKKworLyoKKyAqIFRZUEVERUZTCisgKi8KKwordHlwZWRlZiBlbnVtIENNQV9fVF9FTlZfVFlQRSB7CisgICAgY21hX19jX2Vudl90eXBlX2ludCwKKyAgICBjbWFfX2NfZW52X3R5cGVfZmlsZQorICAgIH0gY21hX190X2Vudl90eXBlOworCit0eXBlZGVmIHN0cnVjdCBDTUFfX1RfRU5WIHsKKyAgICBjaGFyCQkqbmFtZTsJCS8qIE5hbWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICBjbWFfX3RfZW52X3R5cGUJdHlwZTsJCS8qIFR5cGUgb2YgdmFyaWFibGUgKi8KKyAgICBjbWFfdF9pbnRlZ2VyCXZhbHVlOwkJLyogTnVtZXJpYyB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgKi8KKyAgICB9IGNtYV9fdF9lbnY7CisKKy8qCisgKiAgR0xPQkFMIERBVEEKKyAqLworCitleHRlcm4gY21hX190X2VudgkJY21hX19nX2VudltjbWFfX2NfZW52X2NvdW50XTsKK2V4dGVybiBjbWFfX3RfYXRvbWljX2JpdAljbWFfX2dfaW5pdF9zdGFydGVkOworZXh0ZXJuIGNtYV9fdF9hdG9taWNfYml0CWNtYV9fZ19pbml0X2RvbmU7CitleHRlcm4gY2hhcgkJCSpjbWFfX2dfdmVyc2lvbjsKKworLyoKKyAqIElOVEVSTkFMIElOVEVSRkFDRVMKKyAqLworCitleHRlcm4gdm9pZAorY21hX19pbml0X3N0YXRpYyAodm9pZCk7CS8qIEluaXRpYWxpemUgc3RhdGljIGRhdGEgKi8KKworI2lmIF9DTUFfT1NfICE9IF9DTUFfX1ZNUworZXh0ZXJuIHZvaWQgY21hX19pbml0X2F0Zm9yayAodm9pZCk7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvb3NmLXNoYXJlL2NtYV9saXN0LmggYi9nZGIvb3NmLXNoYXJlL2NtYV9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYzZmE0OQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9vc2Ytc2hhcmUvY21hX2xpc3QuaApAQCAtMCwwICsxLDg0IEBACisvKiAKKyAqIChjKSBDb3B5cmlnaHQgMTk5MC0xOTk2IE9QRU4gU09GVFdBUkUgRk9VTkRBVElPTiwgSU5DLgorICogKGMpIENvcHlyaWdodCAxOTkwLTE5OTYgSEVXTEVUVC1QQUNLQVJEIENPTVBBTlkKKyAqIChjKSBDb3B5cmlnaHQgMTk5MC0xOTk2IERJR0lUQUwgRVFVSVBNRU5UIENPUlBPUkFUSU9OCisgKiAoYykgQ29weXJpZ2h0IDE5OTEsIDE5OTIgU2llbWVucy1OaXhkb3JmIEluZm9ybWF0aW9uIFN5c3RlbXMKKyAqIFRvIGFueW9uZSB3aG8gYWNrbm93bGVkZ2VzIHRoYXQgdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dAorICogYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eTogcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoaXMgZmlsZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBub3RpY2UgYXBwZWFycyBpbgorICogYWxsIHNvdXJjZSBjb2RlIGNvcGllcywgYW5kIHRoYXQgbm9uZSBvZiB0aGUgbmFtZXMgbGlzdGVkIGFib3ZlIGJlIHVzZWQKKyAqIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE5vbmUgb2YgdGhlc2Ugb3JnYW5pemF0aW9ucworICogbWFrZXMgYW55IHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlLgorICovCisvKgorICoJSGVhZGVyIGZpbGUgZm9yIGdlbmVyaWMgbGlzdCBmdW5jdGlvbnMgb3BlcmF0aW5nIG9uIHNpbmdseSBsaW5rZWQKKyAqCW51bGwtdGVybWluYXRlZCBsaXN0cy4gIEl0ZW1zIG1heSBub3QgYmUgUkVNT1ZFRCBmcm9tIHRoZSBsaXN0ISAgVGhlCisgKglpbnRlbnQgaXMgdGhhdCB0aGUgbGlzdCBjYW4gYmUgdHJhdmVyc2VkIChmb3IgcmVhZC1vbmx5IG9wZXJhdGlvbnMpCisgKgl3aXRob3V0IGxvY2tpbmcsIHNpbmNlIGluc2VydGlvbiBpcyAic2FmZSIgKHRob3VnaCBub3QgdHJ1ZWx5CisgKglhdG9taWMpLiAgVEhJUyBBU1NVTUVTIFRIQVQgVEhFIEhBUkRXQVJFIE1BS0VTIFdSSVRFUyBWSVNJQkxFIFRPIFJFQURTCisgKglJTiBUSEUgT1JERVIgSU4gV0hJQ0ggVEhFWSBPQ0NVUlJFRCEgIFdJVEhPVVQgU1VDSCBSRUFEL1dSSVRFCisgKglPUkRFUklORywgSVQgTUFZIEJFIE5FQ0VTU0FSWSBUTyBJTlNFUlQgIkJBUlJJRVJTIiBUTyBQUk9EVUNFIFRIRQorICoJUkVRVUlSRUQgVklTSUJJTElUWSEKKyAqLworCisjaWZuZGVmIENNQV9MSVNUCisjZGVmaW5lIENNQV9MSVNUCisKKy8qCisgKiAgSU5DTFVERSBGSUxFUworICovCisKKyNpbmNsdWRlIDxjbWEuaD4KKworLyoKKyAqIENPTlNUQU5UUyBBTkQgTUFDUk9TCisgKi8KKworI2RlZmluZSBjbWFfX2NfbnVsbF9saXN0CSgoY21hX190X2xpc3QgKiljbWFfY19udWxsX3B0cikKKworLyoKKyAqIFRlc3Qgd2hldGhlciBhIGxpc3QgaXMgZW1wdHkuICBSZXR1cm4gY21hX2NfdHJ1ZSBpZiBzbywgZWxzZQorICogY21hX2NfZmFsc2UuCisgKi8KKyNkZWZpbmUgY21hX19saXN0X2VtcHR5KGhlYWQpCSgoaGVhZCktPmxpbmsgPT0gY21hX19jX251bGxfbGlzdCkKKworLyoKKyAqIEluaXRpYWxpemUgYSBxdWV1ZSBoZWFkZXIgdG8gZW1wdHkuCisgKi8KKyNkZWZpbmUgY21hX19saXN0X2luaXQoaGVhZCkJKHZvaWQpKChoZWFkKS0+bGluayA9IGNtYV9fY19udWxsX2xpc3QpCisKKy8qCisgKiBJbnNlcnQgYW4gZWxlbWVudCBpbiBhIGxpc3QgZm9sbG93aW5nIHRoZSBzcGVjaWZpZWQgaXRlbSAob3IgYXQgdGhlCisgKiBiZWdpbm5pbmcgb2YgdGhlIGxpc3QgaWYgImxpc3QiIGlzIHRoZSBsaXN0IGhlYWQpLiAgTk9URTogaW5zZXJ0aW9uCisgKiBvcGVyYXRpb25zIHNob3VsZCBiZSBpbnRlcmxvY2tlZCBieSB0aGUgY2FsbGVyIQorICovCisjZGVmaW5lIGNtYV9fbGlzdF9pbnNlcnQoZWxlbWVudCxsaXN0KSAgICAodm9pZCkoCVwKKyAgICAoZWxlbWVudCktPmxpbmsJCT0gKGxpc3QpLT5saW5rLAkJXAorICAgIChsaXN0KS0+bGluawkJPSAoZWxlbWVudCkpCisKKy8qCisgKiBSZXR1cm4gdGhlIG5leHQgaXRlbSBpbiBhIGxpc3QgKG9yIHRoZSBmaXJzdCwgaWYgdGhlIGFkZHJlc3MgaXMgb2YgdGhlCisgKiBsaXN0IGhlYWRlcikKKyAqLworI2RlZmluZSBjbWFfX2xpc3RfbmV4dChlbGVtZW50KSAgICAoKGVsZW1lbnQpLT5saW5rKQorCisvKgorICogVFlQRURFRlMKKyAqLworCit0eXBlZGVmIHN0cnVjdCBDTUFfX1RfTElTVCB7CisgICAgc3RydWN0IENNQV9fVF9MSVNUCSpsaW5rOwkJLyogRm9yd2FyZCBsaW5rICovCisgICAgfSBjbWFfX3RfbGlzdDsKKworLyoKKyAqICBHTE9CQUwgREFUQQorICovCisKKy8qCisgKiBJTlRFUk5BTCBJTlRFUkZBQ0VTCisgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvb3NmLXNoYXJlL2NtYV9tdXRleC5oIGIvZ2RiL29zZi1zaGFyZS9jbWFfbXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTc4NjMwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL29zZi1zaGFyZS9jbWFfbXV0ZXguaApAQCAtMCwwICsxLDIzMCBAQAorLyogCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBPUEVOIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQy4KKyAqIChjKSBDb3B5cmlnaHQgMTk5MC0xOTk2IEhFV0xFVFQtUEFDS0FSRCBDT01QQU5ZCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBESUdJVEFMIEVRVUlQTUVOVCBDT1JQT1JBVElPTgorICogKGMpIENvcHlyaWdodCAxOTkxLCAxOTkyIFNpZW1lbnMtTml4ZG9yZiBJbmZvcm1hdGlvbiBTeXN0ZW1zCisgKiBUbyBhbnlvbmUgd2hvIGFja25vd2xlZGdlcyB0aGF0IHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQKKyAqIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHk6IHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGlzIGZpbGUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgbm90aWNlIGFwcGVhcnMgaW4KKyAqIGFsbCBzb3VyY2UgY29kZSBjb3BpZXMsIGFuZCB0aGF0IG5vbmUgb2YgdGhlIG5hbWVzIGxpc3RlZCBhYm92ZSBiZSB1c2VkCisgKiBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBOb25lIG9mIHRoZXNlIG9yZ2FuaXphdGlvbnMKKyAqIG1ha2VzIGFueSByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZS4KKyAqLworLyoKKyAqCUhlYWRlciBmaWxlIGZvciBtdXRleCBvcGVyYXRpb25zCisgKi8KKworI2lmbmRlZiBDTUFfTVVURVgKKyNkZWZpbmUgQ01BX01VVEVYCisKKy8qCisgKiAgSU5DTFVERSBGSUxFUworICovCisKKyNpbmNsdWRlIDxjbWEuaD4KKyNpbmNsdWRlIDxjbWFfYXR0ci5oPgorI2luY2x1ZGUgPGNtYV9kZWZzLmg+CisjaW5jbHVkZSA8Y21hX3NlbWFwaG9yZV9kZWZzLmg+CisjaW5jbHVkZSA8Y21hX3NlcXVlbmNlLmg+CisjaW5jbHVkZSA8Y21hX3RjYl9kZWZzLmg+CisjaW5jbHVkZSA8Y21hX3N0YWNrLmg+CisKKy8qCisgKiBDT05TVEFOVFMgQU5EIE1BQ1JPUworICovCisKKy8qCisgKiBUWVBFREVGUworICovCisKK3R5cGVkZWYgc3RydWN0IENNQV9fVF9JTlRfTVVURVggeworICAgIGNtYV9fdF9vYmplY3QJaGVhZGVyOwkJLyogQ29tbW9uIGhlYWRlciAoc2VxdWVuY2UsIHR5cGUpICovCisgICAgY21hX190X2ludF9hdHRyCSphdHRyaWJ1dGVzOwkvKiBCYWNrIGxpbmsgKi8KKyAgICBjbWFfX3RfaW50X3RjYgkqb3duZXI7CQkvKiBDdXJyZW50IG93bmVyIChpZiBhbnkpICovCisgICAgY21hX3RfaW50ZWdlcgluZXN0X2NvdW50OwkvKiBOZXN0aW5nIGxldmVsIGZvciByZWN1cnNpdmUgbXV0ZXggKi8KKyAgICBjbWFfX3RfYXRvbWljX2JpdAkqdW5sb2NrOwkvKiBQb2ludGVyIHVzZWQgZm9yIHVubG9jayBvcGVyYXRpb24gKi8KKyAgICBjbWFfX3RfYXRvbWljX2JpdAlsb2NrOwkJLyogU2V0IGlmIGN1cnJlbnRseSBsb2NrZWQgKi8KKyAgICBzdHJ1Y3QgQ01BX19UX0lOVF9NVVRFWCAqaW50X2xvY2s7CS8qIEludGVybmFsIHByb3RlY3Rpb24gZm9yIG11dGV4ICovCisgICAgY21hX190X2F0b21pY19iaXQJZXZlbnQ7CQkvKiBDbGVhciB3aGVuIHVubG9jayByZXF1aXJlcyBhY3Rpb24gKi8KKyAgICBjbWFfX3RfYXRvbWljX2JpdAl3YWl0ZXJzOwkvKiBDbGVhciB3aGVuIHRocmVhZHMgYXJlIHdhaXRpbmcgKi8KKyAgICBjbWFfX3RfYXRvbWljX2JpdAliaXRidWNrZXQ7CS8qIEZha2UgYml0IHRvIGtlZXAgZnJpZW5kbGllcyBsb2NrZWQgKi8KKyAgICBjbWFfdF9tdXRleF9raW5kCW11dGV4X2tpbmQ7CS8qIEtpbmQgb2YgbXV0ZXggKi8KKyAgICBjbWFfX3Rfc2VtYXBob3JlCXNlbWFwaG9yZTsJLyogU2VtYXBob3JlIGZvciBsb3ctbGV2ZWwgd2FpdCAqLworICAgIH0gY21hX190X2ludF9tdXRleDsKKworDAorLyoKKyAqICBGVU5DVElPTkFMIERFU0NSSVBUSU9OOgorICoKKyAqCUxvY2sgYSBtdXRleCAoaW50ZXJuYWwpCisgKgorICogIEZPUk1BTCBQQVJBTUVURVJTOgorICoKKyAqCW11dGV4CQlQb2ludGVyIHRvIG11dGV4IG9iamVjdCB0byBsb2NrCisgKgorICogIElNUExJQ0lUIElOUFVUUzoKKyAqCisgKglub25lCisgKgorICogIElNUExJQ0lUIE9VVFBVVFM6CisgKgorICoJbm9uZQorICoKKyAqICBGVU5DVElPTiBWQUxVRToKKyAqCisgKglub25lCisgKgorICogIFNJREUgRUZGRUNUUzoKKyAqCisgKglub25lCisgKi8KKyNpZmRlZiBOREVCVUcKKyMgZGVmaW5lIGNtYV9faW50X2xvY2sobXV0ZXgpIHsgXAorICAgIGlmIChjbWFfX3Rlc3RfYW5kX3NldCAoJigoY21hX190X2ludF9tdXRleCAqKW11dGV4KS0+bG9jaykpIHsgXAorCWNtYV90X3N0YXR1cwlyZXM7XAorCXJlcyA9IGNtYV9faW50X211dGV4X2Jsb2NrICgoY21hX190X2ludF9tdXRleCAqKW11dGV4KTsgXAorCWlmIChyZXMgIT0gY21hX3Nfbm9ybWFsKSBjbWFfX2Vycm9yIChyZXMpOyBcCisJfSBcCisgICAgfQorI2Vsc2UKKyMgZGVmaW5lIGNtYV9faW50X2xvY2sobXV0ZXgpIHsgXAorICAgIGNtYV9fdF9pbnRfdGNiICpfX2x0Y2JfXzsgXAorICAgIF9fbHRjYl9fID0gY21hX19nZXRfc2VsZl90Y2IgKCk7IFwKKyAgICBpZiAoY21hX190ZXN0X2FuZF9zZXQgKCYoKGNtYV9fdF9pbnRfbXV0ZXggKiltdXRleCktPmxvY2spKSB7IFwKKwljbWFfdF9zdGF0dXMJcmVzO1wKKwlyZXMgPSBjbWFfX2ludF9tdXRleF9ibG9jayAoKGNtYV9fdF9pbnRfbXV0ZXggKiltdXRleCk7IFwKKwlpZiAocmVzICE9IGNtYV9zX25vcm1hbCkgY21hX19lcnJvciAocmVzKTsgXAorCX0gXAorICAgICgoY21hX190X2ludF9tdXRleCAqKW11dGV4KS0+b3duZXIgPSBfX2x0Y2JfXzsgXAorICAgIH0KKyNlbmRpZgorDAorLyoKKyAqICBGVU5DVElPTkFMIERFU0NSSVBUSU9OOgorICoKKyAqCVVubG9jayBhIG11dGV4IChpbnRlcm5hbCkKKyAqCisgKiAgRk9STUFMIFBBUkFNRVRFUlM6CisgKgorICoJbXV0ZXgJCVBvaW50ZXIgdG8gbXV0ZXggb2JqZWN0IHRvIHVubG9jaworICoKKyAqICBJTVBMSUNJVCBJTlBVVFM6CisgKgorICoJbm9uZQorICoKKyAqICBJTVBMSUNJVCBPVVRQVVRTOgorICoKKyAqCW5vbmUKKyAqCisgKiAgRlVOQ1RJT04gVkFMVUU6CisgKgorICoJbm9uZQorICoKKyAqICBTSURFIEVGRkVDVFM6CisgKgorICoJbm9uZQorICovCisjaWZkZWYgTkRFQlVHCisjIGRlZmluZSBjbWFfX2ludF91bmxvY2sobXV0ZXgpIHsgXAorICAgIGNtYV9fdW5zZXQgKCgoY21hX190X2ludF9tdXRleCAqKW11dGV4KS0+dW5sb2NrKTsgXAorICAgIGlmICghY21hX190ZXN0X2FuZF9zZXQgKCYoKGNtYV9fdF9pbnRfbXV0ZXggKiltdXRleCktPmV2ZW50KSkgeyBcCisJY21hX3Rfc3RhdHVzCXJlcztcCisJcmVzID0gY21hX19pbnRfbXV0ZXhfdW5ibG9jayAoKGNtYV9fdF9pbnRfbXV0ZXggKiltdXRleCk7IFwKKwlpZiAocmVzICE9IGNtYV9zX25vcm1hbCkgY21hX19lcnJvciAocmVzKTsgXAorCX0gXAorICAgIH0KKyNlbHNlCisjIGRlZmluZSBjbWFfX2ludF91bmxvY2sobXV0ZXgpIHsgXAorICAgIGNtYV9fdF9pbnRfdGNiCSpfX3V0Y2JfXzsgXAorICAgIF9fdXRjYl9fID0gY21hX19nZXRfc2VsZl90Y2IgKCk7IFwKKyAgICBpZiAoKChjbWFfX3RfaW50X211dGV4ICopbXV0ZXgpLT5tdXRleF9raW5kID09IGNtYV9jX211dGV4X2Zhc3QpIHsgXAorCWNtYV9fYXNzZXJ0X3dhcm4gKCBcCisJCShfX3V0Y2JfXyA9PSAoKGNtYV9fdF9pbnRfbXV0ZXggKiltdXRleCktPm93bmVyKSwgXAorCQkiYXR0ZW1wdCB0byByZWxlYXNlIG11dHggb3duZWQgYnkgYW5vdGhlciB0aHJlYWQiKTsgXAorCSgoY21hX190X2ludF9tdXRleCAqKW11dGV4KS0+b3duZXIgPSAoY21hX190X2ludF90Y2IgKiljbWFfY19udWxsX3B0cjsgXAorCX0gXAorICAgIGNtYV9fdW5zZXQgKCgoY21hX190X2ludF9tdXRleCAqKW11dGV4KS0+dW5sb2NrKTsgXAorICAgIGlmICghY21hX190ZXN0X2FuZF9zZXQgKCYoKGNtYV9fdF9pbnRfbXV0ZXggKiltdXRleCktPmV2ZW50KSkgeyBcCisJY21hX3Rfc3RhdHVzCXJlcztcCisJcmVzID0gY21hX19pbnRfbXV0ZXhfdW5ibG9jayAoKGNtYV9fdF9pbnRfbXV0ZXggKiltdXRleCk7IFwKKwlpZiAocmVzICE9IGNtYV9zX25vcm1hbCkgY21hX19lcnJvciAocmVzKTsgXAorCX0gXAorICAgIH0KKyNlbmRpZgorDAorLyoKKyAqICBGVU5DVElPTkFMIERFU0NSSVBUSU9OOgorICoKKyAqCWNtYV9faW50X211dGV4X2RlbGV0ZSAtIFBlcmZvcm1zIHdvcmsgZm9yIGNtYV9tdXRleF9kZWxldGUKKyAqCisgKiAgRk9STUFMIFBBUkFNRVRFUlM6CisgKgorICoJY21hX190X211dGV4CSAgICBfbXV0ZXhfCS0gTXV0ZXggdG8gYmUgZGVsZXRlZAorICoKKyAqICBJTVBMSUNJVCBJTlBVVFM6CisgKgorICoJbm9uZQorICoKKyAqICBJTVBMSUNJVCBPVVRQVVRTOgorICoKKyAqCW5vbmUKKyAqCisgKiAgRlVOQ1RJT04gVkFMVUU6CisgKgorICoJbm9uZQorICoKKyAqICBTSURFIEVGRkVDVFM6CisgKgorICoJbm9uZQorICovCisjZGVmaW5lIGNtYV9faW50X211dGV4X2RlbGV0ZShfbXV0ZXhfKSB7IFwKKyAgICBjbWFfX3RfaW50X211dGV4ICAgICpfaW50X211dGV4XzsgXAorICAgIF9pbnRfbXV0ZXhfID0gY21hX192YWxpZGF0ZV9udWxsX211dGV4IChfbXV0ZXhfKTsgXAorICAgIGlmIChfaW50X211dGV4XyA9PSAoY21hX190X2ludF9tdXRleCAqKWNtYV9jX251bGxfcHRyKSBcCisgICAgICAgIHJldHVybjsgXAorICAgIGlmIChjbWFfX2ludF9tdXRleF9sb2NrZWQgKF9pbnRfbXV0ZXhfKSkgXAorICAgICAgICBjbWFfX2Vycm9yIChjbWFfc19pbl91c2UpOyBcCisgICAgY21hX19mcmVlX211dGV4IChfaW50X211dGV4Xyk7IFwKKyAgICBjbWFfX2NsZWFyX2hhbmRsZSAoX211dGV4Xyk7IFwKKyAgICB9CisKKworLyoKKyAqICBHTE9CQUwgREFUQQorICovCisKK2V4dGVybiBjbWFfX3Rfc2VxdWVuY2UJY21hX19nX211dGV4X3NlcTsKK2V4dGVybiBjbWFfX3RfaW50X211dGV4CSpjbWFfX2dfZ2xvYmFsX2xvY2s7CisKKy8qCisgKiBJTlRFUk5BTCBJTlRFUkZBQ0VTCisgKi8KKworZXh0ZXJuIHZvaWQgY21hX19kZXN0cm95X211dGV4ICAoY21hX190X2ludF9tdXRleCAqKTsKKworZXh0ZXJuIHZvaWQgY21hX19mcmVlX211dGV4ICAoY21hX190X2ludF9tdXRleCAqKTsKKworZXh0ZXJuIHZvaWQgY21hX19mcmVlX211dGV4X25vbG9jayAgKGNtYV9fdF9pbnRfbXV0ZXggKik7CisKK2V4dGVybiBjbWFfX3RfaW50X211dGV4ICogY21hX19nZXRfZmlyc3RfbXV0ZXggIChjbWFfX3RfaW50X2F0dHIgKik7CisKK2V4dGVybiBjbWFfX3RfaW50X211dGV4ICogY21hX19nZXRfbXV0ZXggIChjbWFfX3RfaW50X2F0dHIgKik7CisKK2V4dGVybiB2b2lkIGNtYV9faW5pdF9tdXRleCAgKHZvaWQpOworCitleHRlcm4gY21hX3Rfc3RhdHVzIGNtYV9faW50X211dGV4X2Jsb2NrICAoY21hX190X2ludF9tdXRleCAqKTsKKworZXh0ZXJuIGNtYV90X2Jvb2xlYW4gY21hX19pbnRfbXV0ZXhfbG9ja2VkICAoY21hX190X2ludF9tdXRleCAqKTsKKworZXh0ZXJuIGNtYV90X2Jvb2xlYW4gY21hX19pbnRfdHJ5X2xvY2sgIChjbWFfX3RfaW50X211dGV4ICopOworCitleHRlcm4gY21hX3Rfc3RhdHVzIGNtYV9faW50X211dGV4X3VuYmxvY2sgIChjbWFfX3RfaW50X211dGV4ICopOworCitleHRlcm4gY21hX3RfYm9vbGVhbiBjbWFfX211dGV4X2xvY2tlZCAgKGNtYV90X211dGV4KTsKKworZXh0ZXJuIHZvaWQgY21hX19yZWluaXRfbXV0ZXggIChjbWFfdF9pbnRlZ2VyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvb3NmLXNoYXJlL2NtYV9zY2hlZC5oIGIvZ2RiL29zZi1zaGFyZS9jbWFfc2NoZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWI3ODc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL29zZi1zaGFyZS9jbWFfc2NoZWQuaApAQCAtMCwwICsxLDI3OSBAQAorLyogCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBPUEVOIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQy4KKyAqIChjKSBDb3B5cmlnaHQgMTk5MC0xOTk2IEhFV0xFVFQtUEFDS0FSRCBDT01QQU5ZCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBESUdJVEFMIEVRVUlQTUVOVCBDT1JQT1JBVElPTgorICogKGMpIENvcHlyaWdodCAxOTkxLCAxOTkyIFNpZW1lbnMtTml4ZG9yZiBJbmZvcm1hdGlvbiBTeXN0ZW1zCisgKiBUbyBhbnlvbmUgd2hvIGFja25vd2xlZGdlcyB0aGF0IHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQKKyAqIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHk6IHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGlzIGZpbGUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgbm90aWNlIGFwcGVhcnMgaW4KKyAqIGFsbCBzb3VyY2UgY29kZSBjb3BpZXMsIGFuZCB0aGF0IG5vbmUgb2YgdGhlIG5hbWVzIGxpc3RlZCBhYm92ZSBiZSB1c2VkCisgKiBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBOb25lIG9mIHRoZXNlIG9yZ2FuaXphdGlvbnMKKyAqIG1ha2VzIGFueSByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZS4KKyAqLworLyoKKyAqCUhlYWRlciBmaWxlIGZvciBwcmlvcml0eSBzY2hlZHVsaW5nCisgKi8KKworDAorI2lmbmRlZiBDTUFfU0NIRUQKKyNkZWZpbmUgQ01BX1NDSEVECisKKy8qCisgKiAgSU5DTFVERSBGSUxFUworICovCisKKy8qCisgKiBDT05TVEFOVFMgQU5EIE1BQ1JPUworICovCisKKy8qCisgKiBTY2FsaW5nIGZhY3RvciBmb3IgaW50ZWdlciBwcmlvcml0eSBjYWxjdWxhdGlvbnMKKyAqLworI2RlZmluZSBjbWFfX2NfcHJpb19zY2FsZSAgIDgKKworI2lmIF9DTUFfVkVORE9SXyA9PSBfQ01BX19BUE9MTE8KKy8qCisgKiBGSVgtTUU6IEFwb2xsbyBjYyA2LjggYmxvd3MgY29udGFudCBmb2xkZWQgIjw8IiBhbmQgIj4+IgorICovCisjIGRlZmluZSBjbWFfX3NjYWxlX3VwKGV4cCkgICgoZXhwKSAqIDI1NikKKyMgZGVmaW5lIGNtYV9fc2NhbGVfZG4oZXhwKSAgKChleHApIC8gMjU2KQorI2Vsc2UKKyMgZGVmaW5lIGNtYV9fc2NhbGVfdXAoZXhwKSAgKChleHApIDw8IGNtYV9fY19wcmlvX3NjYWxlKQorIyBkZWZpbmUgY21hX19zY2FsZV9kbihleHApICAoKGV4cCkgPj4gY21hX19jX3ByaW9fc2NhbGUpCisjZW5kaWYKKworCisvKgorICogTWluLiBudW0uIG9mIHRpY2tzIGJldHdlZW4gc2VsZi1hZGp1c3RtZW50cyBmb3IgcHJpb3JpdHkgYWRqdXN0aW5nIHBvbGljaWVzLgorICovCisjZGVmaW5lIGNtYV9fY19wcmlvX2ludGVydmFsCTEwCisKKworLyoKKyAqIE51bWJlciBvZiBxdWV1ZXMgaW4gZWFjaCBjbGFzcyBvZiBxdWV1ZXMKKyAqLworI2RlZmluZSBjbWFfX2NfcHJpb19uX2lkICAgIDEJICAgIC8qIFZlcnktbG93LXByaW9yaXR5IGNsYXNzIHRocmVhZHMgKi8KKyNkZWZpbmUgY21hX19jX3ByaW9fbl9iZyAgICA4CSAgICAvKiBCYWNrZ3JvdW5kIGNsYXNzIHRocmVhZHMgKi8KKyNkZWZpbmUgY21hX19jX3ByaW9fbl8wCSAgICAxCSAgICAvKiBWZXJ5IGxvdyBwcmlvcml0eSB0aHJvdWdocHV0IHF1YXJ0aWxlICovCisjZGVmaW5lIGNtYV9fY19wcmlvX25fMQkgICAgMgkgICAgLyogTG93IHByaW9yaXR5IHRocm91Z2hwdXQgcXVhcnRpbGUgKi8KKyNkZWZpbmUgY21hX19jX3ByaW9fbl8yCSAgICAzCSAgICAvKiBNZWRpdW0gcHJpb3JpdHkgdGhyb3VnaHB1dCBxdWFydGlsZSAqLworI2RlZmluZSBjbWFfX2NfcHJpb19uXzMJICAgIDQJICAgIC8qIEhpZ2ggcHJpb3JpdHkgdGhyb3VnaHB1dCBxdWFydGlsZSAqLworI2RlZmluZSBjbWFfX2NfcHJpb19uX3J0ICAgIDEJICAgIC8qIFJlYWwgVGltZSBwcmlvcml0eSBxdWV1ZXMgKi8KKworLyoKKyAqIE51bWJlciBvZiBxdWV1ZXMgdG8gc2tpcCAob2Zmc2V0KSB0byBnZXQgdG8gdGhlIHF1ZXVlcyBpbiB0aGlzIHNlY3Rpb24gb2YgTEEKKyAqLworI2RlZmluZSBjbWFfX2NfcHJpb19vX2lkIDAKKyNkZWZpbmUgY21hX19jX3ByaW9fb19iZyBjbWFfX2NfcHJpb19vX2lkICsgY21hX19jX3ByaW9fbl9pZAorI2RlZmluZSBjbWFfX2NfcHJpb19vXzAgIGNtYV9fY19wcmlvX29fYmcgKyBjbWFfX2NfcHJpb19uX2JnCisjZGVmaW5lIGNtYV9fY19wcmlvX29fMSAgY21hX19jX3ByaW9fb18wICArIGNtYV9fY19wcmlvX25fMAorI2RlZmluZSBjbWFfX2NfcHJpb19vXzIgIGNtYV9fY19wcmlvX29fMSAgKyBjbWFfX2NfcHJpb19uXzEKKyNkZWZpbmUgY21hX19jX3ByaW9fb18zICBjbWFfX2NfcHJpb19vXzIgICsgY21hX19jX3ByaW9fbl8yCisjZGVmaW5lIGNtYV9fY19wcmlvX29fcnQgY21hX19jX3ByaW9fb18zICArIGNtYV9fY19wcmlvX25fMworCisvKgorICogQWRhX2xvdzogIFRoZXNlIHRocmVhZHMgYXJlIHF1ZXVlZCBpbiB0aGUgYmFja2dyb3VuZCBxdWV1ZXMsIHRodXMgdGhlcmUKKyAqIG11c3QgYmUgZW5vdWdoIHF1ZXVlcyB0byBhbGxvdyBvbmUgcXVldWUgZm9yIGVhY2ggQWRhIHByaW9yaXR5IGJlbG93IHRoZQorICogQWRhIGRlZmF1bHQuCisgKi8gIAorI2RlZmluZSBjbWFfX2NfcHJpb19vX2FsIGNtYV9fY19wcmlvX29fYmcKKworLyoKKyAqIFRvdGFsIG51bWJlciBvZiByZWFkeSBxdWV1ZXMsIGZvciBkZWNsYXJhdGlvbiBwdXJwb3NlcworICovCisjZGVmaW5lIGNtYV9fY19wcmlvX25fdG90ICBcCisJY21hX19jX3ByaW9fbl9pZCArIGNtYV9fY19wcmlvX25fYmcgKyBjbWFfX2NfcHJpb19uX3J0IFwKKwkrIGNtYV9fY19wcmlvX25fMCArIGNtYV9fY19wcmlvX25fMSArIGNtYV9fY19wcmlvX25fMiArIGNtYV9fY19wcmlvX25fMworCisvKgorICogRm9ybXVsYWUgZm9yIGRldGVybWluaW5nIGEgdGhyZWFkJ3MgcHJpb3JpdHkuICBWYXJpYWJsZSBwcmlvcml0aWVzIChzdWNoCisgKiBhcyBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kKSBhcmUgc2NhbGVkIHZhbHVlcy4KKyAqLworI2RlZmluZSBjbWFfX3NjaGVkX3ByaW9yaXR5KHRjYikJXAorICAgICgodGNiKS0+c2NoZWQuY2xhc3MgPT0gY21hX19jX2NsYXNzX2ZvcmUgID8gY21hX19zY2hlZF9wcmlvX2ZvcmUgKHRjYikgIFwKKyAgICA6KCh0Y2IpLT5zY2hlZC5jbGFzcyA9PSBjbWFfX2NfY2xhc3NfYmFjayA/IGNtYV9fc2NoZWRfcHJpb19iYWNrICh0Y2IpICBcCisgICAgOigodGNiKS0+c2NoZWQuY2xhc3MgPT0gY21hX19jX2NsYXNzX3J0ICAgPyBjbWFfX3NjaGVkX3ByaW9fcnQgKHRjYikgICAgXAorICAgIDooKHRjYiktPnNjaGVkLmNsYXNzID09IGNtYV9fY19jbGFzc19pZGxlID8gY21hX19zY2hlZF9wcmlvX2lkbGUgKHRjYikgIFwKKyAgICA6KGNtYV9fYnVnY2hlY2sgKCJjbWFfX3NjaGVkX3ByaW9yaXR5OiB1bnJlY29nbml6ZWQgY2xhc3MiKSwgMCkgKSkpKQorCisjZGVmaW5lIGNtYV9fc2NoZWRfcHJpb19mb3JlKHRjYikJY21hX19zY2hlZF9wcmlvX2ZvcmVfdmFyICh0Y2IpCisjZGVmaW5lIGNtYV9fc2NoZWRfcHJpb19iYWNrKHRjYikJKCh0Y2IpLT5zY2hlZC5maXhlZF9wcmlvCVwKKwk/IGNtYV9fc2NoZWRfcHJpb19iYWNrX2ZpeCAodGNiKSA6IGNtYV9fc2NoZWRfcHJpb19iYWNrX3ZhciAodGNiKSApCisjZGVmaW5lIGNtYV9fc2NoZWRfcHJpb19ydCh0Y2IpCQkoKHRjYiktPnNjaGVkLnByaW9yaXR5KQorI2RlZmluZSBjbWFfX3NjaGVkX3ByaW9faWRsZSh0Y2IpCSgodGNiKS0+c2NoZWQucHJpb3JpdHkpCisKKyNkZWZpbmUgY21hX19zY2hlZF9wcmlvX2JhY2tfZml4KHRjYikJXAorCShjbWFfX2dfcHJpb19iZ19taW4gKyAoY21hX19nX3ByaW9fYmdfbWF4IC0gY21hX19nX3ByaW9fYmdfbWluKSBcCisJKiAoKHRjYiktPnNjaGVkLnByaW9yaXR5ICsgY21hX19jX3ByaW9fb19hbCAtIGNtYV9fY19wcmlvX29fYmcpIFwKKwkvIGNtYV9fY19wcmlvX25fYmcpCisKKy8qCisgKiBGSVgtTUU6IEVuYWJsZSBhZnRlciBtb2RlbGluZyAoaWYgd2UgbGlrZSBpdCkKKyAqLworI2lmIDEKKyMgZGVmaW5lIGNtYV9fc2NoZWRfcHJpb19mb3JlX3Zhcih0Y2IpICBcCisJKChjbWFfX2dfcHJpb19mZ19tYXggKyBjbWFfX2dfcHJpb19mZ19taW4pLzIpCisjIGRlZmluZSBjbWFfX3NjaGVkX3ByaW9fYmFja192YXIodGNiKSAgXAorCSgoY21hX19nX3ByaW9fYmdfbWF4ICsgY21hX19nX3ByaW9fYmdfbWluKS8yKQorI2Vsc2UKKyMgZGVmaW5lIGNtYV9fc2NoZWRfcHJpb19iYWNrX3Zhcih0Y2IpICBjbWFfX3NjaGVkX3ByaW9fZm9yZV92YXIgKHRjYikKKworIyBpZiAxCisvKgorICogUmUtc2NhbGUsIHNpbmNlIHRoZSBkaXZpc2lvbiByZW1vdmVzIHRoZSBzY2FsZSBmYWN0b3IuCisgKiBTY2FsZSBhbmQgbXVsdGlwbHkgYmVmb3JlIGRpdmlkaW5nIHRvIGF2b2lkIGxvc3Mgb2YgcHJlY2lzaW9uLgorICovCisjICBkZWZpbmUgY21hX19zY2hlZF9wcmlvX2ZvcmVfdmFyKHRjYikgIFwKKwkoKGNtYV9fZ192cF9jb3VudCAqIGNtYV9fc2NhbGVfdXAoKHRjYiktPnNjaGVkLnRvdF90aW1lKSkgXAorCS8gKHRjYiktPnNjaGVkLmNwdV90aW1lKQorIyBlbHNlCisvKgorICogUmUtc2NhbGUsIHNpbmNlIHRoZSBkaXZpc2lvbiByZW1vdmVzIHRoZSBzY2FsZSBmYWN0b3IuCisgKiBTY2FsZSBhbmQgbXVsdGlwbHkgYmVmb3JlIGRpdmlkaW5nIHRvIGF2b2lkIGxvc3Mgb2YgcHJlY2lzaW9uLgorICogTGVmdCBzaGlmdCB0aGUgbnVtZXJhdG9yIHRvIG11bHRpcGx5IGJ5IHR3by4KKyAqLworIyAgZGVmaW5lIGNtYV9fc2NoZWRfcHJpb19mb3JlX3Zhcih0Y2IpICBcCisgICAgKCgoY21hX19nX3ZwX2NvdW50ICogY21hX19zY2FsZV91cCgodGNiKS0+c2NoZWQudG90X3RpbWUpICBcCisgICAgKiAodGNiKS0+c2NoZWQucHJpb3JpdHkgKiBjbWFfX2dfaW5pdF9mcmFjX3N1bSkgPDwgMSkgIFwKKyAgICAvICgodGNiKS0+c2NoZWQuY3B1X3RpbWUgKiAodGNiKS0+c2NoZWQucHJpb3JpdHkgKiBjbWFfX2dfaW5pdF9mcmFjX3N1bSAgXAorCSsgKHRjYiktPnNjaGVkLnRvdF90aW1lKSkKKyMgZW5kaWYKKyNlbmRpZgorCisvKgorICogVXBkYXRlIHdlaWdodGVkLWF2ZXJhZ2VkLCBzY2FsZWQgdGljayBjb3VudGVycworICovCisjZGVmaW5lIGNtYV9fc2NoZWRfdXBkYXRlX3RpbWUoYXZlLCBuZXcpIFwKKyAgICAoYXZlKSA9IChhdmUpIC0gKChjbWFfX3NjYWxlX2RuKChhdmUpKSAtIChuZXcpKSA8PCAoY21hX19jX3ByaW9fc2NhbGUgLSA0KSkKKworI2RlZmluZSBjbWFfX3NjaGVkX3BhcmFtZXRlcml6ZSh0Y2IsIHBvbGljeSkgeyBcCisgICAgc3dpdGNoIChwb2xpY3kpIHsgXAorCWNhc2UgY21hX2Nfc2NoZWRfZmlmbyA6IHsgXAorCSAgICAodGNiKS0+c2NoZWQucnRiID0JCWNtYV9jX3RydWU7IFwKKwkgICAgKHRjYiktPnNjaGVkLnNwcCA9CQljbWFfY190cnVlOyBcCisJICAgICh0Y2IpLT5zY2hlZC5maXhlZF9wcmlvID0JY21hX2NfdHJ1ZTsgXAorCSAgICAodGNiKS0+c2NoZWQuY2xhc3MgPQljbWFfX2NfY2xhc3NfcnQ7IFwKKwkgICAgYnJlYWs7IFwKKwkgICAgfSBcCisJY2FzZSBjbWFfY19zY2hlZF9yciA6IHsgXAorCSAgICAodGNiKS0+c2NoZWQucnRiID0JCWNtYV9jX2ZhbHNlOyBcCisJICAgICh0Y2IpLT5zY2hlZC5zcHAgPQkJY21hX2NfdHJ1ZTsgXAorCSAgICAodGNiKS0+c2NoZWQuZml4ZWRfcHJpbyA9CWNtYV9jX3RydWU7IFwKKwkgICAgKHRjYiktPnNjaGVkLmNsYXNzID0JY21hX19jX2NsYXNzX3J0OyBcCisJICAgIGJyZWFrOyBcCisJICAgIH0gXAorCWNhc2UgY21hX2Nfc2NoZWRfdGhyb3VnaHB1dCA6IHsgXAorCSAgICAodGNiKS0+c2NoZWQucnRiID0JCWNtYV9jX2ZhbHNlOyBcCisJICAgICh0Y2IpLT5zY2hlZC5zcHAgPQkJY21hX2NfZmFsc2U7IFwKKwkgICAgKHRjYiktPnNjaGVkLmZpeGVkX3ByaW8gPQljbWFfY19mYWxzZTsgXAorCSAgICAodGNiKS0+c2NoZWQuY2xhc3MgPQljbWFfX2NfY2xhc3NfZm9yZTsgXAorCSAgICBicmVhazsgXAorCSAgICB9IFwKKwljYXNlIGNtYV9jX3NjaGVkX2JhY2tncm91bmQgOiB7IFwKKwkgICAgKHRjYiktPnNjaGVkLnJ0YiA9CQljbWFfY19mYWxzZTsgXAorCSAgICAodGNiKS0+c2NoZWQuc3BwID0JCWNtYV9jX2ZhbHNlOyBcCisJICAgICh0Y2IpLT5zY2hlZC5maXhlZF9wcmlvID0JY21hX2NfZmFsc2U7IFwKKwkgICAgKHRjYiktPnNjaGVkLmNsYXNzID0JY21hX19jX2NsYXNzX2JhY2s7IFwKKwkgICAgYnJlYWs7IFwKKwkgICAgfSBcCisJY2FzZSBjbWFfY19zY2hlZF9hZGFfbG93IDogeyBcCisJICAgICh0Y2IpLT5zY2hlZC5ydGIgPQkJY21hX2NfZmFsc2U7IFwKKwkgICAgKHRjYiktPnNjaGVkLnNwcCA9CQljbWFfY190cnVlOyBcCisJICAgICh0Y2IpLT5zY2hlZC5maXhlZF9wcmlvID0JY21hX2NfdHJ1ZTsgXAorCSAgICAodGNiKS0+c2NoZWQuY2xhc3MgPQljbWFfX2NfY2xhc3NfYmFjazsgXAorCSAgICBicmVhazsgXAorCSAgICB9IFwKKwljYXNlIGNtYV9jX3NjaGVkX2lkbGUgOiB7IFwKKwkgICAgKHRjYiktPnNjaGVkLnJ0YiA9CQljbWFfY19mYWxzZTsgXAorCSAgICAodGNiKS0+c2NoZWQuc3BwID0JCWNtYV9jX2ZhbHNlOyBcCisJICAgICh0Y2IpLT5zY2hlZC5maXhlZF9wcmlvID0JY21hX2NfZmFsc2U7IFwKKwkgICAgKHRjYiktPnNjaGVkLmNsYXNzID0JY21hX19jX2NsYXNzX2lkbGU7IFwKKwkgICAgYnJlYWs7IFwKKwkgICAgfSBcCisJZGVmYXVsdCA6IHsgXAorCSAgICBjbWFfX2J1Z2NoZWNrICgiY21hX19zY2hlZF9wYXJhbWV0ZXJpemU6IGJhZCBzY2hlZHVsaW5nIFBvbGljeSIpOyBcCisJICAgIGJyZWFrOyBcCisJICAgIH0gXAorCX0gXAorICAgIH0KKworLyoKKyAqIFRZUEVERUZTCisgKi8KKworLyoKKyAqIFNjaGVkdWxpbmcgY2xhc3NlcworICovCit0eXBlZGVmIGVudW0gQ01BX19UX1NDSEVEX0NMQVNTIHsKKyAgICBjbWFfX2NfY2xhc3NfcnQsCisgICAgY21hX19jX2NsYXNzX2ZvcmUsCisgICAgY21hX19jX2NsYXNzX2JhY2ssCisgICAgY21hX19jX2NsYXNzX2lkbGUKKyAgICB9IGNtYV9fdF9zY2hlZF9jbGFzczsKKworLyoKKyAqICBHTE9CQUwgREFUQQorICovCisKKy8qCisgKiBNaW5pbXVtYSBhbmQgbWF4aW11bSBwcmlvaXJpdGllcywgZm9yIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgdGhyZWFkcywKKyAqIGFzIG9mIHRoZSBsYXN0IHRpbWUgdGhlIHNjaGVkdWxlciByYW4uICAoU2NhbGVkIG9uY2UuKQorICovCitleHRlcm4gY21hX3RfaW50ZWdlcgljbWFfX2dfcHJpb19mZ19taW47CitleHRlcm4gY21hX3RfaW50ZWdlcgljbWFfX2dfcHJpb19mZ19tYXg7CitleHRlcm4gY21hX3RfaW50ZWdlcgljbWFfX2dfcHJpb19iZ19taW47CitleHRlcm4gY21hX3RfaW50ZWdlcgljbWFfX2dfcHJpb19iZ19tYXg7CisKKy8qCisgKiBUaGUgIm0iIHZhbHVlcyBhcmUgdGhlIHNsb3BlcyBvZiB0aGUgZm91ciBzZWN0aW9ucyBvZiBsaW5lYXIgYXBwcm94aW1hdGlvbi4KKyAqCisgKiBjbWFfX2dfcHJpb19tX0kgPSA0Kk4oSSkvY21hX19nX3ByaW9fcmFuZ2UJICAgIChTY2FsZWQgb25jZS4pCisgKi8KK2V4dGVybiBjbWFfdF9pbnRlZ2VyCWNtYV9fZ19wcmlvX21fMCwKKwkJICAgIAljbWFfX2dfcHJpb19tXzEsCisJCSAgICAJY21hX19nX3ByaW9fbV8yLAorCQkgICAgCWNtYV9fZ19wcmlvX21fMzsKKworLyogCisgKiBUaGUgImIiIHZhbHVlcyBhcmUgdGhlIGludGVyY2VwdHMgb2YgdGhlIGZvdXIgc2VjdGlvbnMgb2YgbGluZWFyIGFwcHJveC4KKyAqICAoTm90IHNjYWxlZC4pCisgKgorICogY21hX19nX3ByaW9fYl9JID0gLU4oSSkqKEkqcHJpb19tYXggKyAoNC1JKSpwcmlvX21pbikvcHJpb19yYW5nZSArIHByaW9fb19JCisgKi8KK2V4dGVybiBjbWFfdF9pbnRlZ2VyCWNtYV9fZ19wcmlvX2JfMCwKKwkJICAgIAljbWFfX2dfcHJpb19iXzEsCisJCSAgICAJY21hX19nX3ByaW9fYl8yLAorCQkgICAgCWNtYV9fZ19wcmlvX2JfMzsKKworLyogCisgKiBUaGUgInAiIHZhbHVlcyBhcmUgdGhlIGVuZCBwb2ludHMgb2YgdGhlIGZvdXIgc2VjdGlvbnMgb2YgbGluZWFyIGFwcHJveC4KKyAqCisgKiBjbWFfX2dfcHJpb19wX0kgPSBjbWFfX2dfcHJpb19mZ19taW4gKyAoSS80KSpjbWFfX2dfcHJpb19yYW5nZQorICoKKyAqIFtjbWFfX2dfcHJpb19wXzAgaXMgbm90IGRlZmluZWQgc2luY2UgaXQgaXMgbm90IHVzZWQgKGFsc28sIGl0IGlzIHRoZSBzYW1lCisgKiAgYXMgY21hX19nX3ByaW9fZmdfbWluKS5dCSAgICAoU2NhbGVkIG9uY2UuKQorICovCitleHRlcm4gY21hX3RfaW50ZWdlcgljbWFfX2dfcHJpb19wXzEsCisJCSAgICAJY21hX19nX3ByaW9fcF8yLAorCQkgICAgCWNtYV9fZ19wcmlvX3BfMzsKKworLyoKKyAqIFBvaW50cyB0byB0aGUgbmV4dCBxdWV1ZSBmb3IgdGhlIGRpc3BhdGNoZXIgdG8gY2hlY2sgZm9yIHJlYWR5IHRocmVhZHMuCisgKi8KK2V4dGVybiBjbWFfdF9pbnRlZ2VyCWNtYV9fZ19uZXh0X3JlYWR5X3F1ZXVlOworCisvKgorICogUG9pbnRzIHRvIHRoZSBxdWV1ZXMgb2YgdmlydHVhbCBwcm9jZXNzb3JzIChmb3IgcHJlZW1wdCB2aWN0aW0gc2VhcmNoKQorICovCitleHRlcm4gY21hX190X3F1ZXVlCWNtYV9fZ19ydW5fdnBzOworZXh0ZXJuIGNtYV9fdF9xdWV1ZQljbWFfX2dfc3VzcF92cHM7CitleHRlcm4gY21hX3RfaW50ZWdlcgljbWFfX2dfdnBfY291bnQ7CisKKy8qCisgKiBJTlRFUk5BTCBJTlRFUkZBQ0VTCisgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvb3NmLXNoYXJlL2NtYV9zZW1hcGhvcmVfZGVmcy5oIGIvZ2RiL29zZi1zaGFyZS9jbWFfc2VtYXBob3JlX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTYwZGUzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL29zZi1zaGFyZS9jbWFfc2VtYXBob3JlX2RlZnMuaApAQCAtMCwwICsxLDQ2IEBACisvKiAKKyAqIChjKSBDb3B5cmlnaHQgMTk5MC0xOTk2IE9QRU4gU09GVFdBUkUgRk9VTkRBVElPTiwgSU5DLgorICogKGMpIENvcHlyaWdodCAxOTkwLTE5OTYgSEVXTEVUVC1QQUNLQVJEIENPTVBBTlkKKyAqIChjKSBDb3B5cmlnaHQgMTk5MC0xOTk2IERJR0lUQUwgRVFVSVBNRU5UIENPUlBPUkFUSU9OCisgKiAoYykgQ29weXJpZ2h0IDE5OTEsIDE5OTIgU2llbWVucy1OaXhkb3JmIEluZm9ybWF0aW9uIFN5c3RlbXMKKyAqIFRvIGFueW9uZSB3aG8gYWNrbm93bGVkZ2VzIHRoYXQgdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dAorICogYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eTogcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoaXMgZmlsZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBub3RpY2UgYXBwZWFycyBpbgorICogYWxsIHNvdXJjZSBjb2RlIGNvcGllcywgYW5kIHRoYXQgbm9uZSBvZiB0aGUgbmFtZXMgbGlzdGVkIGFib3ZlIGJlIHVzZWQKKyAqIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE5vbmUgb2YgdGhlc2Ugb3JnYW5pemF0aW9ucworICogbWFrZXMgYW55IHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlLgorICovCisvKgorICoJSGVhZGVyIGZpbGUgZm9yIHNlbWFwaG9yZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyAqLworI2lmbmRlZiBDTUFfU0VNQVBIT1JFX0RFRlMKKyNkZWZpbmUgQ01BX1NFTUFQSE9SRV9ERUZTCisKKy8qCisgKiAgSU5DTFVERSBGSUxFUworICovCisjaW5jbHVkZSA8Y21hLmg+CisjaW5jbHVkZSA8Y21hX3F1ZXVlLmg+CisjaW5jbHVkZSA8Y21hX2RlZnMuaD4KKworLyoKKyAqIENPTlNUQU5UUyBBTkQgTUFDUk9TCisgKi8KKworI2RlZmluZSBjbWFfX2Nfc2VtYXBob3JlX3RpbWVvdXQgMQorI2RlZmluZSBjbWFfX2Nfc2VtYXBob3JlX2V2ZW50CSAwCisjZGVmaW5lIGNtYV9fY19zZWxlY3RfdGltZW91dAkgMgorCisvKgorICogVFlQRURFRlMKKyAqLworCit0eXBlZGVmIHN0cnVjdCBDTUFfX1RfU0VNQVBIT1JFIHsKKyAgICBjbWFfX3RfcXVldWUJcXVldWU7CisgICAgY21hX190X2F0b21pY19iaXQJbm9wZW5kaW5nOworICAgIH0gY21hX190X3NlbWFwaG9yZTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvb3NmLXNoYXJlL2NtYV9zZXF1ZW5jZS5oIGIvZ2RiL29zZi1zaGFyZS9jbWFfc2VxdWVuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDM2MmVkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL29zZi1zaGFyZS9jbWFfc2VxdWVuY2UuaApAQCAtMCwwICsxLDU2IEBACisvKiAKKyAqIChjKSBDb3B5cmlnaHQgMTk5MC0xOTk2IE9QRU4gU09GVFdBUkUgRk9VTkRBVElPTiwgSU5DLgorICogKGMpIENvcHlyaWdodCAxOTkwLTE5OTYgSEVXTEVUVC1QQUNLQVJEIENPTVBBTlkKKyAqIChjKSBDb3B5cmlnaHQgMTk5MC0xOTk2IERJR0lUQUwgRVFVSVBNRU5UIENPUlBPUkFUSU9OCisgKiAoYykgQ29weXJpZ2h0IDE5OTEsIDE5OTIgU2llbWVucy1OaXhkb3JmIEluZm9ybWF0aW9uIFN5c3RlbXMKKyAqIFRvIGFueW9uZSB3aG8gYWNrbm93bGVkZ2VzIHRoYXQgdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dAorICogYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eTogcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kCisgKiBkaXN0cmlidXRlIHRoaXMgZmlsZSBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBub3RpY2UgYXBwZWFycyBpbgorICogYWxsIHNvdXJjZSBjb2RlIGNvcGllcywgYW5kIHRoYXQgbm9uZSBvZiB0aGUgbmFtZXMgbGlzdGVkIGFib3ZlIGJlIHVzZWQKKyAqIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE5vbmUgb2YgdGhlc2Ugb3JnYW5pemF0aW9ucworICogbWFrZXMgYW55IHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IKKyAqIGFueSBwdXJwb3NlLgorICovCisvKgorICoJSGVhZGVyIGZpbGUgZm9yIHNlcXVlbmNlIGdlbmVyYXRvciBmdW5jdGlvbnMKKyAqLworCisjaWZuZGVmIENNQV9TRVFVRU5DRQorI2RlZmluZSBDTUFfU0VRVUVOQ0UKKworLyoKKyAqICBJTkNMVURFIEZJTEVTCisgKi8KKworLyoKKyAqIENPTlNUQU5UUyBBTkQgTUFDUk9TCisgKi8KKworLyoKKyAqIFRZUEVERUZTCisgKi8KKworI2lmbmRlZiBfX1NURENfXworc3RydWN0IENNQV9fVF9JTlRfTVVURVg7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgQ01BX19UX1NFUVVFTkNFIHsKKyAgICBzdHJ1Y3QgQ01BX19UX0lOVF9NVVRFWAkqbXV0ZXg7CS8qIFNlcmlhbGl6ZSBhY2Nlc3MgdG8gY291bnRlciAqLworICAgIGNtYV90X25hdHVyYWwJCXNlcTsJLyogU2VxdWVuY2UgbnVtYmVyIGZvciBvYmplY3QgKi8KKyAgICB9IGNtYV9fdF9zZXF1ZW5jZTsKKworLyoKKyAqICBHTE9CQUwgREFUQQorICovCisKKy8qCisgKiBJTlRFUk5BTCBJTlRFUkZBQ0VTCisgKi8KKworZXh0ZXJuIGNtYV90X25hdHVyYWwgY21hX19hc3NpZ25fc2VxdWVuY2UgKGNtYV9fdF9zZXF1ZW5jZSAqKTsKKworZXh0ZXJuIHZvaWQgY21hX19pbml0X3NlcXVlbmNlIChjbWFfX3Rfc2VxdWVuY2UgKik7CQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dkYi9vc2Ytc2hhcmUvY21hX3N0YWNrLmggYi9nZGIvb3NmLXNoYXJlL2NtYV9zdGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTQxZmQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvb3NmLXNoYXJlL2NtYV9zdGFjay5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIAorICogKGMpIENvcHlyaWdodCAxOTkwLTE5OTYgT1BFTiBTT0ZUV0FSRSBGT1VOREFUSU9OLCBJTkMuCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBIRVdMRVRULVBBQ0tBUkQgQ09NUEFOWQorICogKGMpIENvcHlyaWdodCAxOTkwLTE5OTYgRElHSVRBTCBFUVVJUE1FTlQgQ09SUE9SQVRJT04KKyAqIChjKSBDb3B5cmlnaHQgMTk5MSwgMTk5MiBTaWVtZW5zLU5peGRvcmYgSW5mb3JtYXRpb24gU3lzdGVtcworICogVG8gYW55b25lIHdobyBhY2tub3dsZWRnZXMgdGhhdCB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0CisgKiBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5OiBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIG5vdGljZSBhcHBlYXJzIGluCisgKiBhbGwgc291cmNlIGNvZGUgY29waWVzLCBhbmQgdGhhdCBub25lIG9mIHRoZSBuYW1lcyBsaXN0ZWQgYWJvdmUgYmUgdXNlZAorICogaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorICogd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTm9uZSBvZiB0aGVzZSBvcmdhbml6YXRpb25zCisgKiBtYWtlcyBhbnkgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2UuCisgKi8KKy8qCisgKglIZWFkZXIgZmlsZSBmb3Igc3RhY2sgbWFuYWdlbWVudAorICovCisjaWZuZGVmIENNQV9TVEFDSworI2RlZmluZSBDTUFfU1RBQ0sKKworLyoKKyAqICBJTkNMVURFIEZJTEVTCisgKi8KKworI2luY2x1ZGUgPGNtYV90Y2JfZGVmcy5oPgorI2luY2x1ZGUgPGNtYS5oPgorI2luY2x1ZGUgPGNtYV9hdHRyLmg+CisjaW5jbHVkZSA8Y21hX3F1ZXVlLmg+CisjaW5jbHVkZSA8Y21hX3N0YWNrX2ludC5oPgorCisvKgorICogQ09OU1RBTlRTIEFORCBNQUNST1MKKyAqLworCisjaWYgX0NNQV9VTklQUk9DRVNTT1JfCisjIGRlZmluZSBjbWFfX2dldF9zZWxmX3RjYigpCShjbWFfX2dfY3VycmVudF90aHJlYWQpCisjZW5kaWYKKworLyoKKyAqIFJvdW5kIHRoZSBnaXZlbiB2YWx1ZSAoYSkgdXB0byBjbWFfX2dfY2h1bmtfc2l6ZQorICovCisjZGVmaW5lIGNtYV9fcm91bmR1cF9jaHVua3NpemUoYSkgICAoY21hX19yb3VuZHVwKGEsY21hX19nX2NodW5rX3NpemUpKQorCisvKgorICogVFlQRURFRlMKKyAqLworCisvKgorICogIEdMT0JBTCBEQVRBCisgKi8KKworZXh0ZXJuIGNtYV9fdF9saXN0CWNtYV9fZ19zdGFja19jbHVzdGVyczsKK2V4dGVybiBjbWFfX3RfaW50X3RjYgkqY21hX19nX2N1cnJlbnRfdGhyZWFkOworZXh0ZXJuIGNtYV90X2ludGVnZXIJY21hX19nX2NodW5rX3NpemU7CisKKy8qCisgKiBJTlRFUk5BTCBJTlRFUkZBQ0VTCisgKi8KKworZXh0ZXJuIHZvaWQgY21hX19hc3NpZ25fc3RhY2sgIChjbWFfX3RfaW50X3N0YWNrICosY21hX190X2ludF90Y2IgKik7CisKK2V4dGVybiB2b2lkIGNtYV9fZnJlZV9zdGFjayAgKGNtYV9fdF9pbnRfc3RhY2sgKik7CisKK2V4dGVybiB2b2lkIGNtYV9fZnJlZV9zdGFja19saXN0ICAoY21hX190X3F1ZXVlICopOworCisjaWYgIV9DTUFfVU5JUFJPQ0VTU09SXworZXh0ZXJuIGNtYV9fdF9pbnRfdGNiICogY21hX19nZXRfc2VsZl90Y2IgICh2b2lkKTsKKyNlbmRpZgorCitleHRlcm4gY21hX190X2ludF90Y2IgKiBjbWFfX2dldF9zcF90Y2IgIChjbWFfdF9hZGRyZXNzKTsKKworZXh0ZXJuIGNtYV9fdF9pbnRfc3RhY2sgKiBjbWFfX2dldF9zdGFjayAgKGNtYV9fdF9pbnRfYXR0ciAqKTsKKworZXh0ZXJuIHZvaWQgY21hX19pbml0X3N0YWNrICAodm9pZCk7CisKK2V4dGVybiB2b2lkIGNtYV9fcmVpbml0X3N0YWNrICAoY21hX3RfaW50ZWdlcik7CisKKyNpZiBfQ01BX1BST1RFQ1RfTUVNT1JZXworZXh0ZXJuIHZvaWQgY21hX19yZW1hcF9zdGFja19ob2xlcyAgKHZvaWQpOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2RiL29zZi1zaGFyZS9jbWFfc3RhY2tfaW50LmggYi9nZGIvb3NmLXNoYXJlL2NtYV9zdGFja19pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjc2ZjYwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL29zZi1zaGFyZS9jbWFfc3RhY2tfaW50LmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qIAorICogKGMpIENvcHlyaWdodCAxOTkwLTE5OTYgT1BFTiBTT0ZUV0FSRSBGT1VOREFUSU9OLCBJTkMuCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBIRVdMRVRULVBBQ0tBUkQgQ09NUEFOWQorICogKGMpIENvcHlyaWdodCAxOTkwLTE5OTYgRElHSVRBTCBFUVVJUE1FTlQgQ09SUE9SQVRJT04KKyAqIChjKSBDb3B5cmlnaHQgMTk5MSwgMTk5MiBTaWVtZW5zLU5peGRvcmYgSW5mb3JtYXRpb24gU3lzdGVtcworICogVG8gYW55b25lIHdobyBhY2tub3dsZWRnZXMgdGhhdCB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0CisgKiBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5OiBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIG5vdGljZSBhcHBlYXJzIGluCisgKiBhbGwgc291cmNlIGNvZGUgY29waWVzLCBhbmQgdGhhdCBub25lIG9mIHRoZSBuYW1lcyBsaXN0ZWQgYWJvdmUgYmUgdXNlZAorICogaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorICogd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTm9uZSBvZiB0aGVzZSBvcmdhbml6YXRpb25zCisgKiBtYWtlcyBhbnkgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2UuCisgKi8KKy8qCisgKglIZWFkZXIgZmlsZSBmb3Igc3RhY2sgbWFuYWdlbWVudCAoaW50ZXJuYWwgdG8gY21hX3N0YWNrLmMsIGJ1dAorICoJc2VwYXJhdGUgZm9yIGNvbnZlbmllbmNlLCBhbmQgdW5pdCB0ZXN0aW5nKS4KKyAqLworDAorI2lmbmRlZiBDTUFfU1RBQ0tfSU5UCisjZGVmaW5lIENNQV9TVEFDS19JTlQKKworLyoKKyAqICBJTkNMVURFIEZJTEVTCisgKi8KKworI2luY2x1ZGUgPGNtYS5oPgorI2luY2x1ZGUgPGNtYV9xdWV1ZS5oPgorI2luY2x1ZGUgPGNtYV9saXN0Lmg+CisjaW5jbHVkZSA8Y21hX3RjYl9kZWZzLmg+CisKKy8qCisgKiBDT05TVEFOVFMgQU5EIE1BQ1JPUworICovCisKKyNkZWZpbmUgY21hX19fY19maXJzdF9mcmVlX2NodW5rCTAKKyNkZWZpbmUgY21hX19fY19taW5fY291bnQJMgkvKiBTbWFsbGVzdCBudW1iZXIgb2YgY2h1bmtzIHRvIGxlYXZlICovCisjZGVmaW5lIGNtYV9fX2NfZW5kCQkoLTEpCS8qIEVuZCBvZiBmcmVlIGxpc3QgKGZsYWcpICovCisjZGVmaW5lIGNtYV9fY195ZWxsb3dfc2l6ZQkwCisKKy8qIAorICogQ2x1c3RlciB0eXBlcworICovCisjZGVmaW5lIGNtYV9fX2NfY2x1c3RlciAgMAkvKiBEZWZhdWx0IGNsdXN0ZXIgKi8KKyNkZWZpbmUgY21hX19fY19iaWdzdGFjayAxCS8qIExvb2tzIGxpa2UgYSBjbHVzdGVyLCBidXQgaXQncyBhIHN0YWNrICovCisKKworI2RlZmluZSBjbWFfX19jX251bGxfY2x1c3RlcgkoY21hX19fdF9jbHVzdGVyICopY21hX2NfbnVsbF9wdHIKKworCisvKgorICogVFlQRURFRlMKKyAqLworCisjaWZuZGVmIF9fU1REQ19fCitzdHJ1Y3QgQ01BX19UX0lOVF9TVEFDSzsKKyNlbmRpZgorCit0eXBlZGVmIGNtYV90X25hdHVyYWwJY21hX19fdF9pbmRleDsJLyogVHlwZSBmb3IgY2h1bmsgaW5kZXggKi8KKwordHlwZWRlZiBzdHJ1Y3QgQ01BX19fVF9DTFVfREVTQyB7CisgICAgY21hX190X2xpc3QJCWxpc3Q7CQkvKiBRdWV1ZSBlbGVtZW50IGZvciBjbHVzdGVyIGxpc3QgKi8KKyAgICBjbWFfdF9pbnRlZ2VyCXR5cGU7CQkvKiBUeXBlIG9mIGNsdXN0ZXIgKi8KKyAgICBjbWFfdF9hZGRyZXNzCXN0YWNrczsKKyAgICBjbWFfdF9hZGRyZXNzCWxpbWl0OworICAgIH0gY21hX19fdF9jbHVfZGVzYzsKKwordHlwZWRlZiB1bmlvbiBDTUFfX19UX01BUF9FTlRSWSB7CisgICAgc3RydWN0IHsKKwljbWFfX3RfaW50X3RjYgkqdGNiOwkJLyogVENCIGFzc29jaWF0ZWQgd2l0aCBzdGFjayBjaHVuayAqLworCXN0cnVjdCBDTUFfX1RfSU5UX1NUQUNLCSpzdGFjazsJLyogU3RhY2sgZGVzYy4gYXNzLiB3aXRoIHN0YWNrIGNodW5rICovCisJfSBtYXBwZWQ7CisgICAgc3RydWN0IHsKKwljbWFfX190X2luZGV4CQlzaXplOwkvKiBOdW1iZXIgb2YgY2h1bmtzIGluIGJsb2NrICovCisJY21hX19fdF9pbmRleAkJbmV4dDsJLyogTmV4dCBmcmVlIGJsb2NrICovCisJfSBmcmVlOworICAgIH0gY21hX19fdF9tYXBfZW50cnk7CisKKy8qCisgKiBOT1RFOiBJdCBpcyBWRVJZIElNUE9SVEFOVCB0aGF0IGJvdGggY21hX19fdF9jbHVzdGVyIGFuZCBjbWFfX190X2JpZ3N0YWNrCisgKiBiZWdpbiB3aXRoIHRoZSBjbWFfX190X2NsdV9kZXNjIHN0cnVjdHVyZSwgYXMgdGhlcmUgaXMgc29tZSBjb2RlIGluIHRoZQorICogc3RhY2sgbWFuYWdlciB0aGF0IHJlbGllcyBvbiBiZWluZyBhYmxlIHRvIHRyZWF0IGJvdGggYXMgZXF1aXZhbGVudCEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ01BX19fVF9DTFVTVEVSIHsKKyAgICBjbWFfX190X2NsdV9kZXNjCWRlc2M7CQkvKiBEZXNjcmliZSB0aGlzIGNsdXN0ZXIgKi8KKyAgICBjbWFfX190X21hcF9lbnRyeQltYXBbY21hX19jX2NodW5rX2NvdW50XTsJLyogdGhyZWFkIG1hcCAqLworICAgIGNtYV9fX3RfaW5kZXgJZnJlZTsJCS8qIEZpcnN0IGZyZWUgY2h1bmsgaW5kZXggKi8KKyAgICB9IGNtYV9fX3RfY2x1c3RlcjsKKworLyoKKyAqIE5PVEU6IEl0IGlzIFZFUlkgSU1QT1JUQU5UIHRoYXQgYm90aCBjbWFfX190X2NsdXN0ZXIgYW5kIGNtYV9fX3RfYmlnc3RhY2sKKyAqIGJlZ2luIHdpdGggdGhlIGNtYV9fX3RfY2x1X2Rlc2Mgc3RydWN0dXJlLCBhcyB0aGVyZSBpcyBzb21lIGNvZGUgaW4gdGhlCisgKiBzdGFjayBtYW5hZ2VyIHRoYXQgcmVsaWVzIG9uIGJlaW5nIGFibGUgdG8gdHJlYXQgYm90aCBhcyBlcXVpdmFsZW50IQorICovCit0eXBlZGVmIHN0cnVjdCBDTUFfX19UX0JJR1NUQUNLIHsKKyAgICBjbWFfX190X2NsdV9kZXNjCWRlc2M7CQkvKiBEZXNjcmliZSB0aGlzIGNsdXN0ZXIgKi8KKyAgICBjbWFfX3RfaW50X3RjYgkqdGNiOwkJLyogVENCIGFzc29jaWF0ZWQgd2l0aCBzdGFjayAqLworICAgIHN0cnVjdCBDTUFfX1RfSU5UX1NUQUNLCSpzdGFjazsJLyogU3RhY2sgZGVzYy4gYXNzLiB3aXRoIHN0YWNrICovCisgICAgY21hX3RfbmF0dXJhbAlzaXplOwkJLyogU2l6ZSBvZiBiaWcgc3RhY2sgKi8KKyAgICBjbWFfdF9ib29sZWFuCWluX3VzZTsJCS8qIFNldCBpZiBhbGxvY2F0ZWQgKi8KKyAgICB9IGNtYV9fX3RfYmlnc3RhY2s7CisKKyNpZiBfQ01BX1BST1RFQ1RfTUVNT1JZXwordHlwZWRlZiBzdHJ1Y3QgQ01BX19fVF9JTlRfSE9MRSB7CisgICAgY21hX190X3F1ZXVlCWxpbms7CQkvKiBMaW5rIGhvbGVzIHRvZ2V0aGVyICovCisgICAgY21hX3RfYm9vbGVhbglwcm90ZWN0ZWQ7CS8qIFNldCB3aGVuIHBhZ2VzIGFyZSBwcm90ZWN0ZWQgKi8KKyAgICBjbWFfdF9hZGRyZXNzCWZpcnN0OwkJLyogRmlyc3QgcHJvdGVjdGVkIGJ5dGUgKi8KKyAgICBjbWFfdF9hZGRyZXNzCWxhc3Q7CQkvKiBMYXN0IHByb3RlY3RlZCBieXRlICovCisgICAgfSBjbWFfX190X2ludF9ob2xlOworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IENNQV9fVF9JTlRfU1RBQ0sgeworICAgIGNtYV9fdF9vYmplY3QJaGVhZGVyOwkJLyogQ29tbW9uIGhlYWRlciAoc2VxdWVuY2UsIHR5cGUgaW5mbyAqLworICAgIGNtYV9fdF9pbnRfYXR0cgkqYXR0cmlidXRlczsJLyogQmFja3BvaW50ZXIgdG8gYXR0ciBvYmogKi8KKyAgICBjbWFfX190X2NsdXN0ZXIJKmNsdXN0ZXI7CS8qIFN0YWNrJ3MgY2x1c3RlciAqLworICAgIGNtYV90X2FkZHJlc3MJc3RhY2tfYmFzZTsJLyogYmFzZSBhZGRyZXNzIG9mIHN0YWNrICovCisgICAgY21hX3RfYWRkcmVzcwl5ZWxsb3dfem9uZTsJLyogZmlyc3QgYWRkcmVzcyBvZiB5ZWxsb3cgem9uZSAqLworICAgIGNtYV90X2FkZHJlc3MJbGFzdF9ndWFyZDsJLyogbGFzdCBhZGRyZXNzIG9mIGd1YXJkIHBhZ2VzICovCisgICAgY21hX3RfbmF0dXJhbAlmaXJzdF9jaHVuazsJLyogRmlyc3QgY2h1bmsgYWxsb2NhdGVkICovCisgICAgY21hX3RfbmF0dXJhbAljaHVua19jb3VudDsJLyogQ291bnQgb2YgY2h1bmtzIGFsbG9jYXRlZCAqLworICAgIGNtYV9fdF9pbnRfdGNiCSp0Y2I7CQkvKiBUQ0IgYmFja3BvaW50ZXIgKi8KKyNpZiBfQ01BX1BST1RFQ1RfTUVNT1JZXworICAgIGNtYV9fX3RfaW50X2hvbGUJaG9sZTsJCS8qIERlc2NyaXB0aW9uIG9mIGhvbGUgKi8KKyNlbmRpZgorICAgIH0gY21hX190X2ludF9zdGFjazsKKworLyoKKyAqICBHTE9CQUwgREFUQQorICovCisKKy8qCisgKiBJTlRFUk5BTCBJTlRFUkZBQ0VTCisgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvb3NmLXNoYXJlL2NtYV90Y2JfZGVmcy5oIGIvZ2RiL29zZi1zaGFyZS9jbWFfdGNiX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjIyMDUwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL29zZi1zaGFyZS9jbWFfdGNiX2RlZnMuaApAQCAtMCwwICsxLDI2OSBAQAorLyogCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBPUEVOIFNPRlRXQVJFIEZPVU5EQVRJT04sIElOQy4KKyAqIChjKSBDb3B5cmlnaHQgMTk5MC0xOTk2IEhFV0xFVFQtUEFDS0FSRCBDT01QQU5ZCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBESUdJVEFMIEVRVUlQTUVOVCBDT1JQT1JBVElPTgorICogKGMpIENvcHlyaWdodCAxOTkxLCAxOTkyIFNpZW1lbnMtTml4ZG9yZiBJbmZvcm1hdGlvbiBTeXN0ZW1zCisgKiBUbyBhbnlvbmUgd2hvIGFja25vd2xlZGdlcyB0aGF0IHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQKKyAqIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHk6IHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGlzIGZpbGUgZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgbm90aWNlIGFwcGVhcnMgaW4KKyAqIGFsbCBzb3VyY2UgY29kZSBjb3BpZXMsIGFuZCB0aGF0IG5vbmUgb2YgdGhlIG5hbWVzIGxpc3RlZCBhYm92ZSBiZSB1c2VkCisgKiBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBOb25lIG9mIHRoZXNlIG9yZ2FuaXphdGlvbnMKKyAqIG1ha2VzIGFueSByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZS4KKyAqLworLyoKKyAqCVRDQi1yZWxhdGVkIHR5cGUgZGVmaW5pdGlvbnMuCisgKi8KKworI2lmbmRlZiBDTUFfVENCX0RFRlMKKyNkZWZpbmUgQ01BX1RDQl9ERUZTCisKKy8qCisgKiAgSU5DTFVERSBGSUxFUworICovCisjIGlmICFfQ01BX1RIUkVBRF9TWU5DX0lPXworIyAgaW5jbHVkZSA8Y21hX3RocmVhZF9pby5oPgorIyBlbmRpZgorI2luY2x1ZGUgPGNtYS5oPgorI2luY2x1ZGUgPGNtYV9kZWJ1Z19jbGllbnQuaD4KKyNpbmNsdWRlIDxjbWFfYXR0ci5oPgorI2luY2x1ZGUgPGNtYV9kZWZzLmg+CisjaW5jbHVkZSA8Y21hX2hhbmRsZS5oPgorI2luY2x1ZGUgPGNtYV9xdWV1ZS5oPgorI2lmIF9DTUFfT1NfID09IF9DTUFfX1VOSVgKKyMgaWYgZGVmaW5lZChTTklfRENPU1gpCisjICAgaW5jbHVkZSA8c3lzL3Vjb250ZXh0Lmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisjaW5jbHVkZSA8Y21hX3NjaGVkLmg+CisKKy8qCisgKiBDT05TVEFOVFMgQU5EIE1BQ1JPUworICovCisKKyNpZiBfQ01BX1BMQVRGT1JNXyA9PSBfQ01BX19JQk1SMl9VTklYCisjIGRlZmluZSBjbWFfX2NfaWJtcjJfY3R4X3N0YWNrX3NpemUJMjA0OAorIyBkZWZpbmUgY21hX19jX2libXIyX2N0eF9zdGFja190b3AJKGNtYV9fY19pYm1yMl9jdHhfc3RhY2tfc2l6ZSAtIDEpCisjZW5kaWYKKworLyoKKyAqIFRZUEVERUZTCisgKi8KKworI2lmbmRlZiBfX1NURENfXworIyBpZiBfQ01BX0hBUkRXQVJFXyAhPSBfQ01BX19IUFBBCitzdHJ1Y3QgQ01BX19UX1NFTUFQSE9SRTsKKyMgZW5kaWYKK3N0cnVjdCBDTUFfX1RfSU5UX0NWOworc3RydWN0IENNQV9fVF9JTlRfTVVURVg7CitzdHJ1Y3QgQ01BX19UX0lOVF9UQ0I7CisjZW5kaWYKKwordHlwZWRlZiBjbWFfdF9hZGRyZXNzCQkqY21hX190X2NvbnRleHRfbGlzdDsKKwordHlwZWRlZiBzdHJ1Y3QgQ01BX19UX1RDQl9QQUQgeworICAgIC8qIAorICAgICAqIEFkanVzdCB0byBhbGlnbiB0aGUgdGNiIHByb2xvZyBhdCBieXRlIDMyLgorICAgICAqIDEyIGJ5dGVzIGFyZSByZXF1aXJlZCBhcyBvYmplY3QgaGVhZGVyIGlzIGN1cnJlbnRseSAKKyAgICAgKiAyMCBieXRlcyBsb25nLgorICAgICAqLworICAgIGNtYV90X2ludGVnZXIJcGFkMTsJCS8qIHBhZCBieXRlcyAqLworICAgIGNtYV90X2ludGVnZXIJcGFkMjsJCS8qIHBhZCBieXRlcyAqLworICAgIGNtYV90X2ludGVnZXIJcGFkMzsJCS8qIHBhZCBieXRlcyAqLworICAgIH0gY21hX190X3RjYl9wYWQ7CisKKyNpZiAoX0NNQV9PU18gPT0gX0NNQV9fVU5JWCkgJiYgIV9DTUFfVEhSRUFEX1NZTkNfSU9fCit0eXBlZGVmIHN0cnVjdCBDTUFfX1RfVENCX1NFTEVDVCB7CisgICAgY21hX190X3F1ZXVlCXF1ZXVlOworI2lmIChfQ01BX1VOSVhfVFlQRSAhPSAgX0NNQV9fU1ZSNCkKKwljbWFfX3RfZmlsZV9tYXNrICAgICpyZmRzOworCWNtYV9fdF9maWxlX21hc2sgICAgKndmZHM7CisJY21hX190X2ZpbGVfbWFzayAgICAqZWZkczsKKyNlbHNlCisJY21hX190X3BvbGxfaW5mbyAJcG9sbF9pbmZvOworI2VuZGlmIC8qIChfQ01BX1VOSVhfVFlQRSAhPSAgX0NNQV9fU1ZSNCkgKi8KKyAgICBjbWFfdF9pbnRlZ2VyCW5mb3VuZDsKKyAgICB9IGNtYV9fdF90Y2Jfc2VsZWN0OworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IENNQV9fVF9UQ0JfVElNRSB7CisgICAgY21hX190X3F1ZXVlCXF1ZXVlOwkJLyogbXVzdCBiZSBmaXJzdCBlbnRyeSEgKi8KKyAgICBjbWFfdF9pbnRlZ2VyCW1vZGU7CisgICAgc3RydWN0IENNQV9fVF9TRU1BUEhPUkUgKnNlbWFwaG9yZTsJLyogdXNlZCBmb3IgdGltZWQgc2VtYXBob3JlcyAqLworICAgIGNtYV90X2RhdGVfdGltZQl3YWtldXBfdGltZTsKKyAgICBjbWFfdF9pbnRlZ2VyCXF1YW50YV9yZW1haW5pbmc7CisgICAgfSBjbWFfX3RfdGNiX3RpbWU7CisKK3R5cGVkZWYgZW51bSBDTUFfX1RfREVCRVZUIHsKKwljbWFfX2NfZGViZXZ0X2FjdGl2YXRpbmcgPSAxLAkvKiBGaXJzdCB0cmFuc2l0aW9uIHRvIHJ1bm5pbmcgKi8KKwljbWFfX2NfZGViZXZ0X3J1bm5pbmcgPSAyLAkvKiBBbnkgdHJhbnNpdGlvbiB0byBydW5uaW5nICovCisJY21hX19jX2RlYmV2dF9wcmVlbXB0aW5nID0gMywJLyogUHJlZW10ZWQgKHJlcGxhY2VkKSBhbm90aGVyIHRocmVhZCAqLworCWNtYV9fY19kZWJldnRfYmxvY2tpbmcgPSA0LAkvKiBBbnkgdHJhbnNpdGlvbiB0byBibG9ja2VkICovCisJY21hX19jX2RlYmV2dF90ZXJtaW5hdGluZyA9IDUsCS8qIEZpbmFsIHN0YXRlIHRyYW5zaXRpb24gKi8KKwljbWFfX2NfZGViZXZ0X3Rlcm1fYWxlcnQgPSA2LAkvKiBUZXJtaW5hdGVkIGR1ZSB0byBhbGVydC9jYW5jZWwgKi8KKwljbWFfX2NfZGViZXZ0X3Rlcm1fZXhjID0gNywJLyogVGVybWluYXRlZCBkdWUgdG8gZXhjZXB0aW9uICovCisJY21hX19jX2RlYmV2dF9leGNfaGFuZGxlZCA9IDgJLyogRXhjZXB0aW9uIGlzIGJlaW5nIGhhbmRsZWQgKi8KKwl9IGNtYV9fdF9kZWJldnQ7CisKKyNkZWZpbmUgY21hX19jX2RlYmV2dF9fZmlyc3QgKChjbWFfdF9pbnRlZ2VyKWNtYV9fY19kZWJldnRfYWN0aXZhdGluZykKKyNkZWZpbmUgY21hX19jX2RlYmV2dF9fbGFzdCAgKChjbWFfdF9pbnRlZ2VyKWNtYV9fY19kZWJldnRfZXhjX2hhbmRsZWQpCisjZGVmaW5lIGNtYV9fY19kZWJldnRfX2RpbSAoY21hX19jX2RlYmV2dF9fbGFzdCArIDEpCisKKy8qIAorICogVHlwZSBkZWZpbmluZyB0aHJlYWQgc3Vic3RhdGUsIHdoaWNoIGlzIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLgorICogSWYgdGhlIHN0YXRlIGlzIGJsb2NrZWQsIHN1YnN0YXRlIGluZGljYXRlcyBXSFkgdGhlIHRocmVhZCBpcyBibG9ja2VkLgorICovCit0eXBlZGVmIGVudW0gQ01BX19UX1NVQlNUQVRFIHsKKyAgICBjbWFfX2Nfc3Vic3RhX25vcm1hbCA9IDAsCisgICAgY21hX19jX3N1YnN0YV9tdXRleCA9IDEsCisgICAgY21hX19jX3N1YnN0YV9jdiA9IDIsCisgICAgY21hX19jX3N1YnN0YV90aW1lZF9jdiA9IDMsCisgICAgY21hX19jX3N1YnN0YV90ZXJtX2FsdCA9IDQsCisgICAgY21hX19jX3N1YnN0YV90ZXJtX2V4YyA9IDUsCisgICAgY21hX19jX3N1YnN0YV9kZWxheSA9NiwKKyAgICBjbWFfX2Nfc3Vic3RhX25vdF95ZXRfcnVuID0gNworICAgIH0gY21hX190X3N1YnN0YXRlOworI2RlZmluZSBjbWFfX2Nfc3Vic3RhX19maXJzdCAoKGNtYV90X2ludGVnZXIpY21hX19jX3N1YnN0YV9ub3JtYWwpCisjZGVmaW5lIGNtYV9fY19zdWJzdGFfX2xhc3QgICgoY21hX3RfaW50ZWdlciljbWFfX2Nfc3Vic3RhX25vdF95ZXRfcnVuKQorI2RlZmluZSBjbWFfX2Nfc3Vic3RhX19kaW0gKGNtYV9fY19zdWJzdGFfX2xhc3QgKyAxKQorCisKKy8qCisgKiBQZXItdGhyZWFkIHN0YXRlIGZvciB0aGUgZGVidWdnZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ01BX19UX1RDQl9ERUJVRyB7CisgICAgY21hX3RfYm9vbGVhbglvbl9ob2xkOwkvKiBUaHJlYWQgd2FzIHB1dCBvbiBob2xkIGJ5IGRlYnVnZ2VyICovCisgICAgY21hX3RfYm9vbGVhbglhY3RpdmF0ZWQ7CS8qIEFjdGl2YXRpb24gZXZlbnQgd2FzIHJlcG9ydGVkICovCisgICAgY21hX3RfYm9vbGVhbglkaWRfcHJlZW1wdDsJLyogVGhyZWFkIHByZWVtcHRlZCBwcmlvciBvbmUgKi8KKyAgICBjbWFfdF9hZGRyZXNzCXN0YXJ0X3BjOwkvKiBTdGFydCByb3V0aW5lIGFkZHJlc3MgKi8KKyAgICBjbWFfdF9hZGRyZXNzCW9iamVjdF9hZGRyOwkvKiBBZGRyIG9mIHRocmVhZCBvYmplY3QgKi8KKyAgICBjbWFfX3Rfc3Vic3RhdGUJc3Vic3RhdGU7CS8qIFJlYXNvbiBibG9ja2VkLCB0ZXJtaW5hdGVkLCBldGMuKi8KKyAgICBjbWFfdF9ib29sZWFuCW5vdGlmeV9kZWJ1Z2dlcjsvKiBOb3RpZnkgZGVidWdnZXIgdGhyZWFkIGlzIHJ1bm5pbmcgKi8KKyAgICBjbWFfdF9hZGRyZXNzCVNQQVJFMjsJCS8qIFNQQVJFICovCisgICAgY21hX3RfYWRkcmVzcwlTUEFSRTM7CQkvKiBTUEFSRSAqLworICAgIHN0cnVjdCBDTUFfX1RfSU5UX1RDQgkKKwkJCSpwcmVlbXB0ZWRfdGNiOwkvKiBUQ0Igb2YgdGhyZWFkIHRoYXQgZ290IHByZWVtcHRlZCAqLworICAgIGNtYV90X2Jvb2xlYW4JZmxhZ3NbY21hX19jX2RlYmV2dF9fZGltXTsgCQorCQkJCQkvKiBFdmVudHMgZW5hYmxlZCBmb3IgdGhpcyB0aHJlYWQgKi8KKyAgICB9IGNtYV9fdF90Y2JfZGVidWc7CisKK3R5cGVkZWYgc3RydWN0IENNQV9fVF9UQ0JfU0NIRUQgeworICAgIGNtYV90X2ludGVnZXIJYWRqX3RpbWU7CS8qIEFicy4gdGltZSBpbiB0aWNrcyBvZiBsYXN0IHByaW8gYWRqICovCisgICAgY21hX3RfaW50ZWdlcgl0b3RfdGltZTsJLyogV2VpZ2h0ZWQgYXZlIGluIHRpY2tzIChzY2FsZWQpICovCisgICAgY21hX3RfaW50ZWdlcgl0aW1lX3N0YW1wOwkvKiBBYnMuIHRpbWUgaW4gdGlja3Mgb2YgbGFzdCB1cGRhdGUgKi8KKyAgICBjbWFfdF9pbnRlZ2VyCWNwdV90aW1lOwkvKiBXZWlnaHRlZCBhdmVyYWdlIGluIHRpY2tzICovCisgICAgY21hX3RfaW50ZWdlcgljcHVfdGlja3M7CS8qICMgb2YgdGlja3Mgd2hpbGUgY29tcC4gKHNjYWxlZCkgKi8KKyAgICBjbWFfdF9pbnRlZ2VyCXFfbnVtOwkJLyogTnVtYmVyIG9mIGxhc3QgcmVhZHkgcXVldWUgb24gKi8KKyAgICBjbWFfdF9wcmlvcml0eQlwcmlvcml0eTsJLyogVGhyZWFkIHByaW9yaXR5ICovCisgICAgY21hX3Rfc2NoZWRfcG9saWN5ICBwb2xpY3k7ICAgICAgICAgLyogU2NoZWR1bGluZyBwb2xpY3kgb2YgdGhyZWFkICovCisgICAgY21hX3RfYm9vbGVhbglydGI7CQkvKiAiUnVuICdUaWxsIEJsb2NrIiBzY2hlZHVsaW5nICovCisgICAgY21hX3RfYm9vbGVhbglzcHA7CQkvKiAiU3RyaWN0IFByaW9yaXR5IFByZWVtcHRpb24iIHNjaGVkICovCisgICAgY21hX3RfYm9vbGVhbglmaXhlZF9wcmlvOwkvKiBGaXhlZCBwcmlvcml0eSAqLworICAgIGNtYV9fdF9zY2hlZF9jbGFzcwljbGFzczsJCS8qIFNjaGVkdWxpbmcgY2xhc3MgKi8KKyAgICBzdHJ1Y3QgQ01BX19UX1ZQCSpwcm9jZXNzb3I7CS8qIEN1cnJlbnQgcHJvY2Vzc29yIChpZiBydW5uaW5nKSAqLworICAgIH0gY21hX190X3RjYl9zY2hlZDsKKwordHlwZWRlZiBzdHJ1Y3QgQ01BX19UX0lOVF9BTEVSVCB7CisgICAgY21hX3RfYm9vbGVhbglwZW5kaW5nIDogMTsJLyogYWxlcnRfcGVuZGluZyBiaXQgKi8KKyAgICBjbWFfdF9ib29sZWFuCWdfZW5hYmxlIDogMTsJLyogZ2VuZXJhbCBkZWxpdmVyeSBzdGF0ZSAqLworICAgIGNtYV90X2Jvb2xlYW4JYV9lbmFibGUgOiAxOwkvKiBhc3luY2hyb25vdXMgZGVsaXZlcnkgc3RhdGUgKi8KKyAgICBjbWFfdF9pbnRlZ2VyCXNwYXJlIDogMjk7CS8qIFBhZCB0byBsb25nd29yZCAqLworICAgIGNtYV90X25hdHVyYWwJY291bnQ7CQkvKiBBbGVydCBzY29wZSBuZXN0aW5nIGNvdW50ICovCisgICAgfSBjbWFfX3RfaW50X2FsZXJ0OworCit0eXBlZGVmIGVudW0gQ01BX19UX1NUQVRFIHsKKyAgICBjbWFfX2Nfc3RhdGVfcnVubmluZyA9IDAsCQkvKiBGb3IgY29uc2lzdGVuY3kgd2l0aCBpbml0aWFsIFRDQiAqLworICAgIGNtYV9fY19zdGF0ZV9yZWFkeQk9IDEsCisgICAgY21hX19jX3N0YXRlX2Jsb2NrZWQgPSAyLAorICAgIGNtYV9fY19zdGF0ZV90ZXJtaW5hdGVkID0gMworICAgIH0gY21hX190X3N0YXRlOworI2RlZmluZSBjbWFfX2Nfc3RhdGVfX2ZpcnN0ICgoY21hX3RfaW50ZWdlciljbWFfX2Nfc3RhdGVfcnVubmluZykKKyNkZWZpbmUgY21hX19jX3N0YXRlX19sYXN0ICAoKGNtYV90X2ludGVnZXIpY21hX19jX3N0YXRlX3Rlcm1pbmF0ZWQpCisjZGVmaW5lIGNtYV9fY19zdGF0ZV9fZGltIChjbWFfX2Nfc3RhdGVfX2xhc3QgKyAxKQorCit0eXBlZGVmIGVudW0gQ01BX19UX1RIS0lORCB7CisgICAgY21hX19jX3Roa2luZF9pbml0aWFsID0gMCwJCS8qIEluaXRpYWwgdGhyZWFkICovCisgICAgY21hX19jX3Roa2luZF9ub3JtYWwgPSAxLAkJLyogTm9ybWFsIHRocmVhZCAqLworICAgIGNtYV9fY190aGtpbmRfbnVsbAk9IDIJCS8qIEEgbnVsbCB0aHJlYWQgKi8KKyAgICB9IGNtYV9fdF90aGtpbmQ7CisjZGVmaW5lIGNtYV9fY190aGtpbmRfX2ZpcnN0ICgoY21hX3RfaW50ZWdlciljbWFfX2NfdGhraW5kX2luaXRpYWwpCisjZGVmaW5lIGNtYV9fY190aGtpbmRfX2xhc3QgICgoY21hX3RfaW50ZWdlciljbWFfX2NfdGhraW5kX251bGwpCisjZGVmaW5lIGNtYV9fY190aGtpbmRfX2RpbSAoY21hX19jX3Roa2luZF9fbGFzdCArIDEpCisKK3R5cGVkZWYgZW51bSBDTUFfX1RfU1lTQ0FMTF9TVEFURSB7CisJY21hX19jX3N5c2NhbGxfb2sgPSAxLCAgICAgICAgICAgICAgICAgICAgICAvKiBzeXNjYWxsIHdhcyBub3QgaW50ZXJydXB0ZWQgKi8KKwljbWFfX2Nfc3lzY2FsbF9pbnRpbnRycHQgPSAxLCAgICAgICAvKiBzeXNjYWxsIHdhcyBpbnRlcnJ1cHRlZCBieSBWVEFMUk0gKi8KKwljbWFfX2Nfc3lzY2FsbF9leHRpbnRycHQgPSAyICAgICAgICAvKiBzeXNjYWxsIHdhcyBpbnRlcnJ1cHRlZCBieSBleHRlcm5hbCBzaWduYWwgKi8KKwl9IGNtYV9fdF9zeXNjYWxsX3N0YXRlOworCisKK3R5cGVkZWYgc3RydWN0IENNQV9fVF9JTlRfVENCIHsKKyAgICAvKiAKKyAgICAgKiBGaXhlZCBwYXJ0IG9mIFRDQi4KKyAgICAgKiAgIE1vZGlmaWNhdGlvbnMgdG8gdGhlIGZvbGxvd2luZyB0aHJlZSBmaWVsZHMgbXVzdCBiZSBjb29yZGluYXRlZC4gIAorICAgICAqICAgVGhlIG9iamVjdCBoZWFkZXIgbXVzdCBhbHdheXMgYmUgZmlyc3QsIGFuZCB0aGUgcHJvbG9nIG11c3QgYWx3YXlzIAorICAgICAqICAgcmVtYWluIGF0IHRoZSBzYW1lIG9mZnNldCAoMzIpIGZvciBhbGwgdGltZS4gVGh1cyB0aGUgb2JqZWN0IGhlYWRlcgorICAgICAqICAgbXVzdCBuZXZlciBncm93IGJleW9uZCBhIG1heGltdW0gb2YgMzIgYnl0ZXMuCisgICAgICovCisgICAgY21hX190X29iamVjdAloZWFkZXI7CQkvKiBDb21tb24gb2JqZWN0IGhlYWRlciAqLworICAgIGNtYV9fdF90Y2JfcGFkCXBhZDE7CQkvKiBQYWQgcmVxdWlyZWQgdG8gYWxpZ24gcHJvbG9nICovCisgICAgY21hX3RfdGNiX3Byb2xvZwlwcm9sb2c7CQkvKiBTdGFuZGFyZCBwcm9sb2cgZm9yIHRhc2tzLCB0aHJlYWRzICovCisKKyAgICAvKiAKKyAgICAgKiBGbG9hdGluZyBwYXJ0IG9mIFRDQiAoZmllbGRzIGhlcmUgb24gYXJlIGZyZWUgdG8gYmUgbW92ZWQgYW5kIHJlc2l6ZWQpLgorICAgICAqLworICAgIGNtYV9fdF9xdWV1ZQl0aHJlYWRzOwkvKiBMaXN0IG9mIGFsbCBrbm93biB0aHJlYWRzICovCisgICAgY21hX190X2ludF9hdHRyCSphdHRyaWJ1dGVzOwkvKiBCYWNrcG9pbnRlciB0byBhdHRyIG9iaiAqLworICAgIGNtYV9fdF9zdGF0ZQlzdGF0ZTsJCS8qIEN1cnJlbnQgc3RhdGUgb2YgdGhyZWFkICovCisgICAgY21hX190X3Roa2luZAlraW5kOwkJLyogV2hpY2gga2luZCBvZiB0aHJlYWQgKi8KKyAgICBzdHJ1Y3QgQ01BX19UX0lOVF9NVVRFWCAKKwkJCSptdXRleDsJCS8qIE11dGV4IHRvIGNvbnRyb2wgVENCIGFjY2VzcyAqLworICAgIHN0cnVjdCBDTUFfX1RfSU5UX0NWIAorCQkJKnRlcm1fY3Y7CS8qIENWIGZvciBqb2luICovCisgICAgc3RydWN0IENNQV9fVF9JTlRfTVVURVggCisJCQkqdHN3YWl0X211dGV4OwkvKiBNdXRleCBmb3IgdGhyZWFkLXN5bmNocm9ub3VzIHdhaXRzICovCisgICAgc3RydWN0IENNQV9fVF9JTlRfQ1YgCisJCQkqdHN3YWl0X2N2OwkvKiBDViBmb3IgdGhyZWFkLXN5bmNocm9ub3VzIHdhaXRzICovCisgICAgY21hX3Rfc3RhcnRfcm91dGluZQlzdGFydF9jb2RlOwkvKiBBZGRyZXNzIG9mIHN0YXJ0IHJvdXRpbmUgKi8KKyAgICBjbWFfdF9hZGRyZXNzCXN0YXJ0X2FyZzsJLyogQXJndW1lbnQgdG8gcGFzcyB0byBzdGFydF9jb2RlICovCisgICAgY21hX190X3F1ZXVlCXN0YWNrOwkJLyogUXVldWUgaGVhZGVyIGZvciBzdGFjayBkZXNjci4gKi8KKyAgICBjbWFfdF9uYXR1cmFsCWNvbnRleHRfY291bnQ7CS8qIFNpemUgb2YgY29udGV4dCBhcnJheSAqLworICAgIGNtYV9fdF9jb250ZXh0X2xpc3QJY29udGV4dHM7CS8qIENvbnRleHQgdmFsdWUgYXJyYXkgcG9pbnRlciAqLworICAgIGNtYV90X2V4aXRfc3RhdHVzCWV4aXRfc3RhdHVzOwkvKiBFeGl0IHN0YXR1cyBvZiB0aHJlYWQgKi8KKyAgICBjbWFfdF9hZGRyZXNzCXJldHVybl92YWx1ZTsJLyogVGhyZWFkJ3MgcmV0dXJuIHZhbHVlICovCisgICAgY21hX190X2FzeW5jX2N0eAlhc3luY19jdHg7CS8qIEFzeW5jaHJvbm91cyBjb250ZXh0IHN3aXRjaCBpbmZvICovCisgICAgY21hX190X3N0YXRpY19jdHgJc3RhdGljX2N0eDsJLyogU3RhdGljIGNvbnRleHQgc3dpdGNoIGluZm9ybWF0aW9uICovCisgICAgY21hX3RfaW50ZWdlcglldmVudF9zdGF0dXM7CS8qIFN0YXR1cyBvZiBzZW1hcGhvcmUgb3BlcmF0aW9uICovCisgICAgY21hX190X3RjYl90aW1lCXRpbWVyOwkJLyogVGltZSBpbmZvIGZvciBkaXNwYXRjaGVyICovCisgICAgY21hX190X3RjYl9zY2hlZAlzY2hlZDsJCS8qIFNjaGVkdWxlciBpbmZvICovCisgICAgY21hX190X3RjYl9kZWJ1ZwlkZWJ1ZzsJCS8qIERlYnVnZ2VyIGluZm8gKi8KKyNpZiBfQ01BX09TXyA9PSBfQ01BX19VTklYCisjIGlmICFfQ01BX1RIUkVBRF9TWU5DX0lPXworICAgIGNtYV9fdF90Y2Jfc2VsZWN0CXNlbGVjdDsJCS8qIFNlbGVjdCBpbmZvIGZvciB0aW1lZCBzZWxlY3RzICovCisjIGVuZGlmCisgICAgc3RydWN0IHNpZ2FjdGlvbglzaWdhY3Rpb25fZGF0YVtOU0lHXTsKKyNlbmRpZgorICAgIGNtYV90X25hdHVyYWwgICAgICAgc3lzY2FsbF9zdGF0ZTsgLyogc2V0IGlmIG9uZSBvZiB0aGUgY21hIHdyYXBwZWQgc3lzY2FsbHMgd2FzIGludGVycnVwdGVkLiAqLworICAgIGNtYV90X2Jvb2xlYW4JZGV0YWNoZWQ7CS8qIFNldCBpZiBhbHJlYWR5IGRldGFjaGVkICovCisgICAgY21hX3RfYm9vbGVhbgl0ZXJtaW5hdGVkOwkvKiBTZXQgaWYgdGVybWluYXRlZCAqLworICAgIGNtYV90X2ludGVnZXIJam9pbmVyczsJLyogQ291bnQgb2Ygam9pbmVycywgZm9yIHpvbWJpZSBmcmVlcyAqLworICAgIGNtYV9fdF9pbnRfYWxlcnQJYWxlcnQ7CQkvKiBDdXJyZW50IGFsZXJ0IHN0YXRlIGluZm8gKi8KKyAgICBzdHJ1Y3QgQ01BX19UX0lOVF9DViAKKwkJCSp3YWl0X2N2OwkvKiBDViB0aHJlYWQgaXMgY3VycmVudGx5IHdhaXRpbmcgb24gKi8KKyAgICBzdHJ1Y3QgQ01BX19UX0lOVF9NVVRFWCAKKwkJCSp3YWl0X211dGV4OwkvKiBNdXRleCB0aHJlYWQgaXMgd2FpdGluZyBvbiAqLworICAgIHN0cnVjdCBFWENfQ09OVEVYVF9UCisJCQkqZXhjX3N0YWNrOwkvKiBUb3Agb2YgZXhjZXB0aW9uIHN0YWNrICovCisjaWYgX0NNQV9QTEFURk9STV8gPT0gX0NNQV9fSUJNUjJfVU5JWAorICAgIGNoYXIJCWN0eF9zdGFja1tjbWFfX2NfaWJtcjJfY3R4X3N0YWNrX3NpemVdOworI2VuZGlmCisgICAgY21hX3RfaW50ZWdlcgl0aGRfZXJybm87CS8qIFBlci10aHJlYWQgZXJybm8gdmFsdWUgKi8KKyNpZiBfQ01BX09TXyA9PSBfQ01BX19WTVMKKyAgICBjbWFfdF9pbnRlZ2VyCXRoZF92bXNlcnJubzsJLyogUGVyLXRocmVhZCBWTVMgZXJybm8gdmFsdWUgKi8KKyNlbmRpZgorICAgIH0gY21hX190X2ludF90Y2I7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2RiL29zZi1zaGFyZS9jbWFfdXRpbC5oIGIvZ2RiL29zZi1zaGFyZS9jbWFfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNDUxYzQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvb3NmLXNoYXJlL2NtYV91dGlsLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qIAorICogKGMpIENvcHlyaWdodCAxOTkwLTE5OTYgT1BFTiBTT0ZUV0FSRSBGT1VOREFUSU9OLCBJTkMuCisgKiAoYykgQ29weXJpZ2h0IDE5OTAtMTk5NiBIRVdMRVRULVBBQ0tBUkQgQ09NUEFOWQorICogKGMpIENvcHlyaWdodCAxOTkwLTE5OTYgRElHSVRBTCBFUVVJUE1FTlQgQ09SUE9SQVRJT04KKyAqIChjKSBDb3B5cmlnaHQgMTk5MSwgMTk5MiBTaWVtZW5zLU5peGRvcmYgSW5mb3JtYXRpb24gU3lzdGVtcworICogVG8gYW55b25lIHdobyBhY2tub3dsZWRnZXMgdGhhdCB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0CisgKiBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5OiBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQKKyAqIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIG5vdGljZSBhcHBlYXJzIGluCisgKiBhbGwgc291cmNlIGNvZGUgY29waWVzLCBhbmQgdGhhdCBub25lIG9mIHRoZSBuYW1lcyBsaXN0ZWQgYWJvdmUgYmUgdXNlZAorICogaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorICogd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTm9uZSBvZiB0aGVzZSBvcmdhbml6YXRpb25zCisgKiBtYWtlcyBhbnkgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2UuCisgKi8KKy8qCisgKglIZWFkZXIgZmlsZSBmb3IgQ01BIGludGVybmFsIFVUSUwgb3BlcmF0aW9ucworICovCisKKyNpZm5kZWYJQ01BX1VUSUwKKyNkZWZpbmUgQ01BX1VUSUwKKworLyoKKyAqICBJTkNMVURFIEZJTEVTCisgKi8KKworI2luY2x1ZGUgPGNtYS5oPgorI2luY2x1ZGUgPGNtYV9hdHRyLmg+CisjaW5jbHVkZSA8Y21hX2RlZnMuaD4KKworI2lmIF9DTUFfT1NfID09IF9DTUFfX1ZNUworIyBpbmNsdWRlIDxjbWFfcm1zLmg+CisjZW5kaWYKKworI2lmIF9DTUFfVkVORE9SXyA9PSBfQ01BX19TVU4KKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbHNlCisjIGluY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorCisjaWYgX0NNQV9PU18gPT0gX0NNQV9fVU5JWAorIyBpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisKKy8qCisgKiBDT05TVEFOVFMgQU5EIE1BQ1JPUworICovCisKKyNkZWZpbmUgY21hX19jX2J1ZmZlcl9zaXplICAyNTYJCSAgICAvKiBTaXplIG9mIG91dHB1dCBidWZmZXIJICAgICovCisKKy8qCisgKiBUWVBFREVGUworICovCisKKy8qIAorICogQWx0ZXJuYXRlIGVvbCByb3V0aW5lCisgKi8KK3R5cGVkZWYgdm9pZCAoKmNtYV9fdF9lb2xfcm91dGluZSkgKGNoYXIgKik7CisKKyNpZiBfQ01BX09TXyA9PSBfQ01BX19WTVMKKyB0eXBlZGVmIHN0cnVjdCBDTUFfX1RfVk1TRklMRSB7CisgICAgc3RydWN0IFJBQglyYWI7CisgICAgc3RydWN0IEZBQglmYWI7CisgICAgfSBjbWFfX3Rfdm1zZmlsZSwgCSpjbWFfX3RfZmlsZTsKKyNlbGlmICAoIF9DTUFfVU5JWF9UWVBFID09IF9DTUFfX1NWUjQgKQorIHR5cGVkZWYgaW50ICAgICAgICAgICBjbWFfX3RfZmlsZTsKKyNlbHNlCisgdHlwZWRlZiBGSUxFCQkqY21hX190X2ZpbGU7CisjZW5kaWYKKworLyoKKyAqICBHTE9CQUwgREFUQQorICovCisKKy8qCisgKiBJTlRFUk5BTCBJTlRFUkZBQ0VTCisgKi8KKworZXh0ZXJuIHZvaWQgY21hX19hYm9ydCAgKHZvaWQpOworCitleHRlcm4gY21hX3RfaW50ZWdlciBjbWFfX2F0b2wgIChjaGFyICopOworCitleHRlcm4gY21hX3RfaW50ZWdlciBjbWFfX2F0b2kgIChjaGFyICopOworCitleHRlcm4gY2hhciAqIGNtYV9fZ2V0ZW52ICAoY2hhciAqLGNoYXIgKixpbnQpOworCitleHRlcm4gaW50IGNtYV9fZ2V0dGltZXNwZWMgIChzdHJ1Y3QgdGltZXNwZWMgKik7CisKK2V4dGVybiBjbWFfX3RfZmlsZSBjbWFfX2ludF9mb3BlbiAgKGNoYXIgKixjaGFyICopOworCisjaWZuZGVmIE5ERUJVRworZXh0ZXJuIHZvaWQgY21hX19pbml0X3RyYWNlICAoY2hhciAqX2Vudik7CisjZW5kaWYKKworZXh0ZXJuIGNoYXIgKiBjbWFfX21lbWNweSAgKGNoYXIgKixjaGFyICosY21hX3RfaW50ZWdlcik7CisJCisjaWZuZGVmIGNtYV9fbWVtc2V0CitleHRlcm4gY2hhciAqIGNtYV9fbWVtc2V0ICAoY2hhciAqLGNtYV90X2ludGVnZXIsY21hX3RfaW50ZWdlcik7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgY21hX19wdXRmb3JtYXQgIChjaGFyICosY2hhciAqLC4uLik7CisKK2V4dGVybiB2b2lkIGNtYV9fcHV0c3RyaW5nICAoY2hhciAqLGNoYXIgKik7CisKK2V4dGVybiB2b2lkIGNtYV9fcHV0aW50ICAoY2hhciAqLGNtYV90X2ludGVnZXIpOworCitleHRlcm4gdm9pZCBjbWFfX3B1dGludF81ICAoY2hhciAqLGNtYV90X2ludGVnZXIpOworCitleHRlcm4gdm9pZCBjbWFfX3B1dGludF8xMCAgKGNoYXIgKixjbWFfdF9pbnRlZ2VyKTsKKworZXh0ZXJuIHZvaWQgY21hX19wdXRoZXggIChjaGFyICosY21hX3RfaW50ZWdlcik7CisKK2V4dGVybiB2b2lkIGNtYV9fcHV0aGV4XzggIChjaGFyICosY21hX3RfaW50ZWdlcik7CisKK2V4dGVybiB2b2lkIGNtYV9fcHV0ZW9sICAoY2hhciAqKTsKKworZXh0ZXJuIHZvaWQgY21hX19zZXRfZW9sX3JvdXRpbmUgIChjbWFfX3RfZW9sX3JvdXRpbmUsY21hX190X2VvbF9yb3V0aW5lICopOworCitleHRlcm4gY21hX3RfaW50ZWdlciBjbWFfX3N0cmxlbiAgKGNoYXIgKik7CisKK2V4dGVybiBpbnQgY21hX19zdHJuY21wICAoY2hhciAqLGNoYXIgKixjbWFfdF9pbnRlZ2VyKTsKKworZXh0ZXJuIGNoYXIgKmNtYV9fZ2V0cyAoY2hhciAqLGNoYXIgKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2RiL29zZnNvbGliLmMgYi9nZGIvb3Nmc29saWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWM5YmY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL29zZnNvbGliLmMKQEAgLTAsMCArMSw5ODAgQEAKKy8qIEhhbmRsZSBPU0YvMSBzaGFyZWQgbGlicmFyaWVzIGZvciBHREIsIHRoZSBHTlUgRGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogRklYTUU6IE1vc3Qgb2YgdGhpcyBjb2RlIGNvdWxkIGJlIG1lcmdlZCB3aXRoIHNvbGliLmMgYnkgdXNpbmcKKyAgIG5leHRfbGlua19tYXBfbWVtYmVyIGFuZCB4ZmVyX2xpbmtfbWFwX21lbWJlciBpbiBzb2xpYi5jLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgIm9iamZpbGVzLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImdudS1yZWdleC5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKworI2RlZmluZSBNQVhfUEFUSF9TSVpFIDEwMjQJCS8qIEZJWE1FOiBTaG91bGQgYmUgZHluYW1pYyAqLworCisvKiBXaGVuIGhhbmRsaW5nIHNoYXJlZCBsaWJyYXJpZXMsIEdEQiBoYXMgdG8gZmluZCBvdXQgdGhlIHBhdGhuYW1lcworICAgb2YgYWxsIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCBhcmUgY3VycmVudGx5IGxvYWRlZCAodG8gcmVhZCBpbiB0aGVpcgorICAgc3ltYm9scykgYW5kIHdoZXJlIHRoZSBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgaW4gbWVtb3J5CisgICAodG8gcmVsb2NhdGUgdGhlbSBwcm9wZXJseSBmcm9tIHRoZWlyIHByZWxpbmtlZCBhZGRyZXNzZXMgdG8gdGhlCisgICBjdXJyZW50IGxvYWQgYWRkcmVzcykuCisKKyAgIFVuZGVyIE9TRi8xIHRoZXJlIGFyZSB0d28gcG9zc2liaWxpdGllcyB0byBnZXQgYXQgdGhpcyBpbmZvcm1hdGlvbjoKKyAgIDEpIFBlZWsgYXJvdW5kIGluIHRoZSBydW50aW1lIGxvYWRlciBzdHJ1Y3R1cmVzLgorICAgICAgVGhlc2UgYXJlIG5vdCBkb2N1bWVudGVkLCBhbmQgdGhleSBhcmUgbm90IGRlZmluZWQgaW4gdGhlIHN5c3RlbQorICAgICAgaGVhZGVyIGZpbGVzLiBUaGUgZGVmaW5pdGlvbnMgYmVsb3cgd2VyZSBvYnRhaW5lZCBieSBleHBlcmltZW50YXRpb24sCisgICAgICBidXQgdGhleSBzZWVtIHN0YWJsZSBlbm91Z2guCisgICAyKSBVc2UgdGhlIHVuZG9jdW1lbnRlZCBsaWJ4cHJvYy5hIGxpYnJhcnksIHdoaWNoIGNvbnRhaW5zIHRoZQorICAgICAgZXF1aXZhbGVudCBsZHJfKiByb3V0aW5lcy4KKyAgICAgIFRoaXMgYXBwcm9hY2ggaXMgc29tZXdoYXQgY2xlYW5lciwgYnV0IGl0IHJlcXVpcmVzIHRoYXQgdGhlIEdEQgorICAgICAgZXhlY3V0YWJsZSBpcyBkeW5hbWljYWxseSBsaW5rZWQuIEluIGFkZGl0aW9uIGl0IHJlcXVpcmVzIGEKKyAgICAgIE5BVF9DTElCUz0gLWx4cHJvYyAtV2wsLWV4cGVjdF91bnJlc29sdmVkLGxkcl9wcm9jZXNzX2NvbnRleHQKKyAgICAgIGxpbmtlciBzcGVjaWZpY2F0aW9uIGZvciBHREIgYW5kIGFsbCBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgdXNpbmcKKyAgICAgIGxpYmdkYi4KKyAgIFdlIHdpbGwgdXNlIHRoZSBwZWVraW5nIGFwcHJvYWNoIHVudGlsIGl0IGJlY29tZXMgdW53aWVsZHkuICAqLworCisjaWZuZGVmIFVTRV9MRFJfUk9VVElORVMKKworLyogRGVmaW5pdGlvbiBvZiBydW50aW1lIGxvYWRlciBzdHJ1Y3R1cmVzLCBmb3VuZCBieSBleHBlcmltZW50YXRpb24uICAqLworI2RlZmluZSBSTERfQ09OVEVYVF9BRERSRVNTCTB4M2ZmYzAwMDAwMDAKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKwlDT1JFX0FERFIgbmV4dDsKKwlDT1JFX0FERFIgcHJldmlvdXM7CisJQ09SRV9BRERSIHVua25vd24xOworCWNoYXIgKm1vZHVsZV9uYW1lOworCUNPUkVfQUREUiBtb2RpbmZvX2FkZHI7CisJbG9uZyBtb2R1bGVfaWQ7CisJQ09SRV9BRERSIHVua25vd24yOworCUNPUkVfQUREUiB1bmtub3duMzsKKwlsb25nIHJlZ2lvbl9jb3VudDsKKwlDT1JFX0FERFIgcmVnaW9uaW5mb19hZGRyOworfSBsZHJfbW9kdWxlX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKwlsb25nIHVua25vd24xOworCUNPUkVfQUREUiByZWdpb25uYW1lX2FkZHI7CisJbG9uZyBwcm90ZWN0aW9uOworCUNPUkVfQUREUiB2YWRkcjsKKwlDT1JFX0FERFIgbWFwYWRkcjsKKwlsb25nIHNpemU7CisJbG9uZyB1bmtub3duMls1XTsKK30gbGRyX3JlZ2lvbl9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisJQ09SRV9BRERSIHVua25vd24xOworCUNPUkVfQUREUiB1bmtub3duMjsKKwlDT1JFX0FERFIgaGVhZDsKKwlDT1JFX0FERFIgdGFpbDsKK30gbGRyX2NvbnRleHRfdDsKKworc3RhdGljIGxkcl9jb250ZXh0X3QgbGRyX2NvbnRleHQ7CisKKyNlbHNlCisKKyNpbmNsdWRlIDxsb2FkZXIuaD4KK3N0YXRpYyBsZHJfcHJvY2Vzc190IGZha2VfbGRyX3Byb2Nlc3M7CisKKy8qIENhbGxlZCBieSBsZHJfKiByb3V0aW5lcyB0byByZWFkIG1lbW9yeSBmcm9tIHRoZSBjdXJyZW50IHRhcmdldC4gICovCisKK3N0YXRpYyBpbnQgbGRyX3JlYWRfbWVtb3J5IFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqLCBpbnQsIGludCkpOworCitzdGF0aWMgaW50CitsZHJfcmVhZF9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuLCByZWFkc3RyaW5nKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworICAgICBpbnQgcmVhZHN0cmluZzsKK3sKKyAgaW50IHJlc3VsdDsKKyAgY2hhciAqYnVmZmVyOworCisgIGlmIChyZWFkc3RyaW5nKQorICAgIHsKKyAgICAgIHRhcmdldF9yZWFkX3N0cmluZyAobWVtYWRkciwgJmJ1ZmZlciwgbGVuLCAmcmVzdWx0KTsKKyAgICAgIGlmIChyZXN1bHQgPT0gMCkKKyAgICAgICAgc3RyY3B5IChteWFkZHIsIGJ1ZmZlcik7CisgICAgICBmcmVlIChidWZmZXIpOworICAgIH0KKyAgZWxzZQorICAgIHJlc3VsdCA9IHRhcmdldF9yZWFkX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4pOworCisgIGlmIChyZXN1bHQgIT0gMCkKKyAgICByZXN1bHQgPSAtcmVzdWx0OworICByZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYKKworLyogRGVmaW5lIG91ciBvd24gbGlua19tYXAgc3RydWN0dXJlLgorICAgVGhpcyB3aWxsIGhlbHAgdG8gc2hhcmUgY29kZSB3aXRoIHNvbGliLmMuICAqLworCitzdHJ1Y3QgbGlua19tYXAgeworICBDT1JFX0FERFIgbF9vZmZzZXQ7CQkJLyogcHJlbGluayB0byBsb2FkIGFkZHJlc3Mgb2Zmc2V0ICovCisgIGNoYXIgKmxfbmFtZTsJCQkJLyogZnVsbCBuYW1lIG9mIGxvYWRlZCBvYmplY3QgKi8KKyAgbGRyX21vZHVsZV9pbmZvX3QgbW9kdWxlX2luZm87CS8qIGNvcnJlc3BvbmRpbmcgbW9kdWxlIGluZm8gKi8KK307CisKKyNkZWZpbmUgTE1fT0ZGU0VUKHNvKSAoKHNvKSAtPiBsbS5sX29mZnNldCkKKyNkZWZpbmUgTE1fTkFNRShzbykgKChzbykgLT4gbG0ubF9uYW1lKQorCitzdHJ1Y3Qgc29fbGlzdCB7CisgIHN0cnVjdCBzb19saXN0ICpuZXh0OwkJCS8qIG5leHQgc3RydWN0dXJlIGluIGxpbmtlZCBsaXN0ICovCisgIHN0cnVjdCBsaW5rX21hcCBsbTsJCQkvKiBjb3B5IG9mIGxpbmsgbWFwIGZyb20gaW5mZXJpb3IgKi8KKyAgc3RydWN0IGxpbmtfbWFwICpsbWFkZHI7CQkvKiBhZGRyIGluIGluZmVyaW9yIGxtIHdhcyByZWFkIGZyb20gKi8KKyAgQ09SRV9BRERSIGxtZW5kOwkJCS8qIHVwcGVyIGFkZHIgYm91bmQgb2YgbWFwcGVkIG9iamVjdCAqLworICBjaGFyIHNvX25hbWVbTUFYX1BBVEhfU0laRV07CQkvKiBzaGFyZWQgb2JqZWN0IGxpYiBuYW1lIChGSVhNRSkgKi8KKyAgY2hhciBzeW1ib2xzX2xvYWRlZDsJCQkvKiBmbGFnOiBzeW1ib2xzIHJlYWQgaW4geWV0PyAqLworICBjaGFyIGZyb21fdHR5OwkJCS8qIGZsYWc6IHByaW50IG1zZ3M/ICovCisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOwkJLyogb2JqZmlsZSBmb3IgbG9hZGVkIGxpYiAqLworICBzdHJ1Y3Qgc2VjdGlvbl90YWJsZSAqc2VjdGlvbnM7CisgIHN0cnVjdCBzZWN0aW9uX3RhYmxlICpzZWN0aW9uc19lbmQ7CisgIHN0cnVjdCBzZWN0aW9uX3RhYmxlICp0ZXh0c2VjdGlvbjsKKyAgYmZkICphYmZkOworfTsKKworc3RhdGljIHN0cnVjdCBzb19saXN0ICpzb19saXN0X2hlYWQ7CS8qIExpc3Qgb2Yga25vd24gc2hhcmVkIG9iamVjdHMgKi8KKworZXh0ZXJuIGludAorZmRtYXRjaCBQQVJBTVMgKChpbnQsIGludCkpOwkJLyogSW4gbGliaWJlcnR5ICovCisKKy8qIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQKK3NoYXJlZGxpYnJhcnlfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZAoraW5mb19zaGFyZWRsaWJyYXJ5X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIGludAorc3ltYm9sX2FkZF9zdHViIFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgc3RydWN0IHNvX2xpc3QgKgorZmluZF9zb2xpYiBQQVJBTVMgKChzdHJ1Y3Qgc29fbGlzdCAqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgbGlua19tYXAgKgorZmlyc3RfbGlua19tYXBfbWVtYmVyIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHN0cnVjdCBsaW5rX21hcCAqCituZXh0X2xpbmtfbWFwX21lbWJlciBQQVJBTVMgKChzdHJ1Y3Qgc29fbGlzdCAqKSk7CisKK3N0YXRpYyB2b2lkCit4ZmVyX2xpbmtfbWFwX21lbWJlciBQQVJBTVMgKChzdHJ1Y3Qgc29fbGlzdCAqLCBzdHJ1Y3QgbGlua19tYXAgKikpOworCitzdGF0aWMgaW50Citzb2xpYl9tYXBfc2VjdGlvbnMgUEFSQU1TICgoY2hhciAqKSk7CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlzb2xpYl9tYXBfc2VjdGlvbnMgLS0gb3BlbiBiZmQgYW5kIGJ1aWxkIHNlY3Rpb25zIGZvciBzaGFyZWQgbGliCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgaW50IHNvbGliX21hcF9zZWN0aW9ucyAoc3RydWN0IHNvX2xpc3QgKnNvKQorCitERVNDUklQVElPTgorCisJR2l2ZW4gYSBwb2ludGVyIHRvIG9uZSBvZiB0aGUgc2hhcmVkIG9iamVjdHMgaW4gb3VyIGxpc3QKKwlvZiBtYXBwZWQgb2JqZWN0cywgdXNlIHRoZSByZWNvcmRlZCBuYW1lIHRvIG9wZW4gYSBiZmQKKwlkZXNjcmlwdG9yIGZvciB0aGUgb2JqZWN0LCBidWlsZCBhIHNlY3Rpb24gdGFibGUsIGFuZCB0aGVuCisJcmVsb2NhdGUgYWxsIHRoZSBzZWN0aW9uIGFkZHJlc3NlcyBieSB0aGUgYmFzZSBhZGRyZXNzIGF0CisJd2hpY2ggdGhlIHNoYXJlZCBvYmplY3Qgd2FzIG1hcHBlZC4KKworRklYTUVTCisKKwlJbiBtb3N0IChhbGw/KSBjYXNlcyB0aGUgc2hhcmVkIG9iamVjdCBmaWxlIG5hbWUgcmVjb3JkZWQgaW4gdGhlCisJZHluYW1pYyBsaW5rYWdlIHRhYmxlcyB3aWxsIGJlIGEgZnVsbHkgcXVhbGlmaWVkIHBhdGhuYW1lLiAgRm9yCisJY2FzZXMgd2hlcmUgaXQgaXNuJ3QsIGRvIHdlIHJlYWxseSBtaW1pYyB0aGUgc3lzdGVtcyBzZWFyY2gKKwltZWNoYW5pc20gY29ycmVjdGx5IGluIHRoZSBiZWxvdyBjb2RlIChwYXJ0aWN1bGFybHkgdGhlIHRpbGRlCisJZXhwYW5zaW9uIHN0dWZmPykuCisgKi8KKworc3RhdGljIGludAorc29saWJfbWFwX3NlY3Rpb25zIChhcmcpCisgICAgIGNoYXIgKmFyZzsKK3sKKyAgc3RydWN0IHNvX2xpc3QgKnNvID0gKHN0cnVjdCBzb19saXN0ICopIGFyZzsJLyogY2F0Y2hfZXJyb3JzIGJvZ29uICovCisgIGNoYXIgKmZpbGVuYW1lOworICBjaGFyICpzY3JhdGNoX3BhdGhuYW1lOworICBpbnQgc2NyYXRjaF9jaGFuOworICBzdHJ1Y3Qgc2VjdGlvbl90YWJsZSAqcDsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKyAgYmZkICphYmZkOworICAKKyAgZmlsZW5hbWUgPSB0aWxkZV9leHBhbmQgKHNvIC0+IHNvX25hbWUpOworICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKGZyZWUsIGZpbGVuYW1lKTsKKyAgCisgIHNjcmF0Y2hfY2hhbiA9IG9wZW5wIChnZXRlbnYgKCJQQVRIIiksIDEsIGZpbGVuYW1lLCBPX1JET05MWSwgMCwKKwkJCSZzY3JhdGNoX3BhdGhuYW1lKTsKKyAgaWYgKHNjcmF0Y2hfY2hhbiA8IDApCisgICAgeworICAgICAgc2NyYXRjaF9jaGFuID0gb3BlbnAgKGdldGVudiAoIkxEX0xJQlJBUllfUEFUSCIpLCAxLCBmaWxlbmFtZSwKKwkJCSAgICBPX1JET05MWSwgMCwgJnNjcmF0Y2hfcGF0aG5hbWUpOworICAgIH0KKyAgaWYgKHNjcmF0Y2hfY2hhbiA8IDApCisgICAgeworICAgICAgcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworICAgIH0KKyAgLyogTGVhdmUgc2NyYXRjaF9wYXRobmFtZSBhbGxvY2F0ZWQuICBiZmQtPm5hbWUgd2lsbCBwb2ludCB0byBpdC4gICovCisKKyAgYWJmZCA9IGJmZF9mZG9wZW5yIChzY3JhdGNoX3BhdGhuYW1lLCBnbnV0YXJnZXQsIHNjcmF0Y2hfY2hhbik7CisgIGlmICghYWJmZCkKKyAgICB7CisgICAgICBjbG9zZSAoc2NyYXRjaF9jaGFuKTsKKyAgICAgIGVycm9yICgiQ291bGQgbm90IG9wZW4gYCVzJyBhcyBhbiBleGVjdXRhYmxlIGZpbGU6ICVzIiwKKwkgICAgIHNjcmF0Y2hfcGF0aG5hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKyAgICB9CisgIC8qIExlYXZlIGJmZCBvcGVuLCBjb3JlX3hmZXJfbWVtb3J5IGFuZCAiaW5mbyBmaWxlcyIgbmVlZCBpdC4gICovCisgIHNvIC0+IGFiZmQgPSBhYmZkOworICBhYmZkIC0+IGNhY2hlYWJsZSA9IHRydWU7CisKKyAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKKyAgICB7CisgICAgICBlcnJvciAoIlwiJXNcIjogbm90IGluIGV4ZWN1dGFibGUgZm9ybWF0OiAlcy4iLAorCSAgICAgc2NyYXRjaF9wYXRobmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICAgIH0KKyAgaWYgKGJ1aWxkX3NlY3Rpb25fdGFibGUgKGFiZmQsICZzbyAtPiBzZWN0aW9ucywgJnNvIC0+IHNlY3Rpb25zX2VuZCkpCisgICAgeworICAgICAgZXJyb3IgKCJDYW4ndCBmaW5kIHRoZSBmaWxlIHNlY3Rpb25zIGluIGAlcyc6ICVzIiwgCisJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChleGVjX2JmZCksIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKyAgICB9CisKKyAgZm9yIChwID0gc28gLT4gc2VjdGlvbnM7IHAgPCBzbyAtPiBzZWN0aW9uc19lbmQ7IHArKykKKyAgICB7CisgICAgICAvKiBSZWxvY2F0ZSB0aGUgc2VjdGlvbiBiaW5kaW5nIGFkZHJlc3NlcyBhcyByZWNvcmRlZCBpbiB0aGUgc2hhcmVkCisJIG9iamVjdCdzIGZpbGUgYnkgdGhlIG9mZnNldCB0byBnZXQgdGhlIGFkZHJlc3MgdG8gd2hpY2ggdGhlCisJIG9iamVjdCB3YXMgYWN0dWFsbHkgbWFwcGVkLiAgKi8KKyAgICAgIHAgLT4gYWRkciArPSBMTV9PRkZTRVQgKHNvKTsKKyAgICAgIHAgLT4gZW5kYWRkciArPSBMTV9PRkZTRVQgKHNvKTsKKyAgICAgIHNvIC0+IGxtZW5kID0gKENPUkVfQUREUikgbWF4IChwIC0+IGVuZGFkZHIsIHNvIC0+IGxtZW5kKTsKKyAgICAgIGlmIChTVFJFUSAocCAtPiB0aGVfYmZkX3NlY3Rpb24gLT4gbmFtZSwgIi50ZXh0IikpCisJeworCSAgc28gLT4gdGV4dHNlY3Rpb24gPSBwOworCX0KKyAgICB9CisKKyAgLyogRnJlZSB0aGUgZmlsZSBuYW1lcywgY2xvc2UgdGhlIGZpbGUgbm93LiAgKi8KKyAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisKKyAgcmV0dXJuICgxKTsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWZpcnN0X2xpbmtfbWFwX21lbWJlciAtLSBsb2NhdGUgZmlyc3QgbWVtYmVyIGluIGR5bmFtaWMgbGlua2VyJ3MgbWFwCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgc3RydWN0IGxpbmtfbWFwICpmaXJzdF9saW5rX21hcF9tZW1iZXIgKHZvaWQpCisKK0RFU0NSSVBUSU9OCisKKwlSZWFkIGluIGEgY29weSBvZiB0aGUgZmlyc3QgbWVtYmVyIGluIHRoZSBpbmZlcmlvcidzIGR5bmFtaWMKKwlsaW5rIG1hcCBmcm9tIHRoZSBpbmZlcmlvcidzIGR5bmFtaWMgbGlua2VyIHN0cnVjdHVyZXMsIGFuZCByZXR1cm4KKwlhIHBvaW50ZXIgdG8gdGhlIGNvcHkgaW4gb3VyIGFkZHJlc3Mgc3BhY2UuCisqLworCitzdGF0aWMgc3RydWN0IGxpbmtfbWFwICoKK2ZpcnN0X2xpbmtfbWFwX21lbWJlciAoKQoreworICBzdHJ1Y3QgbGlua19tYXAgKmxtID0gTlVMTDsKKyAgc3RhdGljIHN0cnVjdCBsaW5rX21hcCBmaXJzdF9sbTsKKworI2lmZGVmIFVTRV9MRFJfUk9VVElORVMKKyAgbGRyX21vZHVsZV90IG1vZF9pZCA9IExEUl9OVUxMX01PRFVMRTsKKyAgc2l6ZV90IHJldHNpemU7CisKKyAgZmFrZV9sZHJfcHJvY2VzcyA9IGxkcl9jb3JlX3Byb2Nlc3MgKCk7CisgIGxkcl9zZXRfY29yZV9yZWFkZXIgKGxkcl9yZWFkX21lbW9yeSk7CisgIGxkcl94ZGV0YWNoIChmYWtlX2xkcl9wcm9jZXNzKTsKKyAgaWYgKGxkcl94YXR0YWNoIChmYWtlX2xkcl9wcm9jZXNzKSAhPSAwCisgICAgICB8fCBsZHJfbmV4dF9tb2R1bGUoZmFrZV9sZHJfcHJvY2VzcywgJm1vZF9pZCkgIT0gMAorICAgICAgfHwgbW9kX2lkID09IExEUl9OVUxMX01PRFVMRQorICAgICAgfHwgbGRyX2lucV9tb2R1bGUoZmFrZV9sZHJfcHJvY2VzcywgbW9kX2lkLAorCQkJJmZpcnN0X2xtLm1vZHVsZV9pbmZvLCBzaXplb2YobGRyX21vZHVsZV9pbmZvX3QpLAorCQkJJnJldHNpemUpICE9IDApCisgICAgcmV0dXJuIGxtOworI2Vsc2UKKyAgQ09SRV9BRERSIGxkcl9jb250ZXh0X2FkZHI7CisKKyAgaWYgKHRhcmdldF9yZWFkX21lbW9yeSAoKENPUkVfQUREUikgUkxEX0NPTlRFWFRfQUREUkVTUywKKwkJCSAgKGNoYXIgKikgJmxkcl9jb250ZXh0X2FkZHIsCisJCQkgIHNpemVvZiAoQ09SRV9BRERSKSkgIT0gMAorICAgICAgfHwgdGFyZ2V0X3JlYWRfbWVtb3J5IChsZHJfY29udGV4dF9hZGRyLAorCQkJICAgICAoY2hhciAqKSAmbGRyX2NvbnRleHQsCisJCQkgICAgIHNpemVvZiAobGRyX2NvbnRleHRfdCkpICE9IDAKKyAgICAgIHx8IHRhcmdldF9yZWFkX21lbW9yeSAoKENPUkVfQUREUikgbGRyX2NvbnRleHQuaGVhZCwKKwkJCSAgICAgKGNoYXIgKikgJmZpcnN0X2xtLm1vZHVsZV9pbmZvLAorCQkJICAgICBzaXplb2YgKGxkcl9tb2R1bGVfaW5mb190KSkgIT0gMCkKKyAgICByZXR1cm4gbG07CisjZW5kaWYKKworICBsbSA9ICZmaXJzdF9sbTsKKworICAvKiBUaGUgZmlyc3QgZW50cnkgaXMgZm9yIHRoZSBtYWluIHByb2dyYW0gYW5kIHNob3VsZCBiZSBza2lwcGVkLiAgKi8KKyAgbG0tPmxfbmFtZSA9IE5VTEw7CisKKyAgcmV0dXJuIGxtOworfQorCitzdGF0aWMgc3RydWN0IGxpbmtfbWFwICoKK25leHRfbGlua19tYXBfbWVtYmVyIChzb19saXN0X3B0cikKKyAgICAgc3RydWN0IHNvX2xpc3QgKnNvX2xpc3RfcHRyOworeworICBzdHJ1Y3QgbGlua19tYXAgKmxtID0gTlVMTDsKKyAgc3RhdGljIHN0cnVjdCBsaW5rX21hcCBuZXh0X2xtOworI2lmZGVmIFVTRV9MRFJfUk9VVElORVMKKyAgbGRyX21vZHVsZV90IG1vZF9pZCA9IHNvX2xpc3RfcHRyLT5sbS5tb2R1bGVfaW5mby5sbWlfbW9kaWQ7CisgIHNpemVfdCByZXRzaXplOworCisgIGlmIChsZHJfbmV4dF9tb2R1bGUoZmFrZV9sZHJfcHJvY2VzcywgJm1vZF9pZCkgIT0gMAorICAgICAgfHwgbW9kX2lkID09IExEUl9OVUxMX01PRFVMRQorICAgICAgfHwgbGRyX2lucV9tb2R1bGUoZmFrZV9sZHJfcHJvY2VzcywgbW9kX2lkLAorCQkJJm5leHRfbG0ubW9kdWxlX2luZm8sIHNpemVvZihsZHJfbW9kdWxlX2luZm9fdCksCisJCQkmcmV0c2l6ZSkgIT0gMCkKKyAgICByZXR1cm4gbG07CisKKyAgbG0gPSAmbmV4dF9sbTsKKyAgbG0tPmxfbmFtZSA9IGxtLT5tb2R1bGVfaW5mby5sbWlfbmFtZTsKKyNlbHNlCisgIENPUkVfQUREUiBsZHJfY29udGV4dF9hZGRyOworCisgIC8qIFJlcmVhZCBjb250ZXh0IGluIGNhc2UgbGRyX2NvbnRleHQudGFpbCB3YXMgdXBkYXRlZC4gICovCisKKyAgaWYgKHRhcmdldF9yZWFkX21lbW9yeSAoKENPUkVfQUREUikgUkxEX0NPTlRFWFRfQUREUkVTUywKKwkJCSAgKGNoYXIgKikgJmxkcl9jb250ZXh0X2FkZHIsCisJCQkgIHNpemVvZiAoQ09SRV9BRERSKSkgIT0gMAorICAgICAgfHwgdGFyZ2V0X3JlYWRfbWVtb3J5IChsZHJfY29udGV4dF9hZGRyLAorCQkJICAgICAoY2hhciAqKSAmbGRyX2NvbnRleHQsCisJCQkgICAgIHNpemVvZiAobGRyX2NvbnRleHRfdCkpICE9IDAKKyAgICAgIHx8IHNvX2xpc3RfcHRyLT5sbS5tb2R1bGVfaW5mby5tb2RpbmZvX2FkZHIgPT0gbGRyX2NvbnRleHQudGFpbAorICAgICAgfHwgdGFyZ2V0X3JlYWRfbWVtb3J5IChzb19saXN0X3B0ci0+bG0ubW9kdWxlX2luZm8ubmV4dCwKKwkJCSAgICAgKGNoYXIgKikgJm5leHRfbG0ubW9kdWxlX2luZm8sCisJCQkgICAgIHNpemVvZiAobGRyX21vZHVsZV9pbmZvX3QpKSAhPSAwKQorICAgIHJldHVybiBsbTsKKworICBsbSA9ICZuZXh0X2xtOworICBsbS0+bF9uYW1lID0gbG0tPm1vZHVsZV9pbmZvLm1vZHVsZV9uYW1lOworI2VuZGlmCisgIHJldHVybiBsbTsKK30KKworc3RhdGljIHZvaWQKK3hmZXJfbGlua19tYXBfbWVtYmVyIChzb19saXN0X3B0ciwgbG0pCisgICAgIHN0cnVjdCBzb19saXN0ICpzb19saXN0X3B0cjsKKyAgICAgc3RydWN0IGxpbmtfbWFwICpsbTsKK3sKKyAgaW50IGk7CisgIHNvX2xpc3RfcHRyLT5sbSA9ICpsbTsKKworICAvKiBPU0YvMSBzaGFyZWQgbGlicmFyaWVzIGFyZSBwcmUtbGlua2VkIHRvIHBhcnRpY3VsYXIgYWRkcmVzc2VzLAorICAgICBidXQgdGhlIHJ1bnRpbWUgbG9hZGVyIG1heSBoYXZlIHRvIHJlbG9jYXRlIHRoZW0gaWYgdGhlCisgICAgIGFkZHJlc3MgcmFuZ2VzIG9mIHRoZSBsaWJyYXJpZXMgdXNlZCBieSB0aGUgdGFyZ2V0IGV4ZWN1dGFibGUgY2xhc2gsCisgICAgIG9yIGlmIHRoZSB0YXJnZXQgZXhlY3V0YWJsZSBpcyBsaW5rZWQgd2l0aCB0aGUgLXRhc28gb3B0aW9uLgorICAgICBUaGUgb2Zmc2V0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHNoYXJlZAorICAgICBsaWJyYXJ5IGlzIG1hcHBlZCBhbmQgdGhlIHByZS1saW5rZWQgYWRkcmVzcyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuCisKKyAgICAgRklYTUU6ICBHREIgaXMgY3VycmVudGx5IHVuYWJsZSB0byByZWxvY2F0ZSB0aGUgc2hhcmVkIGxpYnJhcnkKKyAgICAgc2VjdGlvbnMgYnkgZGlmZmVyZW50IG9mZnNldHMuIElmIHNlY3Rpb25zIGFyZSByZWxvY2F0ZWQgYnkKKyAgICAgZGlmZmVyZW50IG9mZnNldHMsIHB1dCBvdXQgYSB3YXJuaW5nIGFuZCB1c2UgdGhlIG9mZnNldCBvZiB0aGUKKyAgICAgZmlyc3Qgc2VjdGlvbiBmb3IgYWxsIHJlbWFpbmluZyBzZWN0aW9ucy4gICovCisgIExNX09GRlNFVCAoc29fbGlzdF9wdHIpID0gMDsKKworICAvKiBUaGVyZSBpcyBvbmUgZW50cnkgdGhhdCBoYXMgbm8gbmFtZSAoZm9yIHRoZSBpbmZlcmlvciBleGVjdXRhYmxlKQorICAgICBzaW5jZSBpdCBpcyBub3QgYSBzaGFyZWQgb2JqZWN0LiAqLworICBpZiAoTE1fTkFNRSAoc29fbGlzdF9wdHIpICE9IDApCisgICAgeworCisjaWZkZWYgVVNFX0xEUl9ST1VUSU5FUworICAgICAgaW50IGxlbiA9IHN0cmxlbiAoTE1fTkFNRSAoc29fbGlzdF9wdHIpICsgMSk7CisKKyAgICAgIGlmIChsZW4gPiBNQVhfUEFUSF9TSVpFKQorCWxlbiA9IE1BWF9QQVRIX1NJWkU7CisgICAgICBzdHJuY3B5IChzb19saXN0X3B0ci0+c29fbmFtZSwgTE1fTkFNRSAoc29fbGlzdF9wdHIpLCBNQVhfUEFUSF9TSVpFKTsKKyAgICAgIHNvX2xpc3RfcHRyLT5zb19uYW1lW01BWF9QQVRIX1NJWkUgLSAxXSA9ICdcMCc7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsbS0+bW9kdWxlX2luZm8ubG1pX25yZWdpb247IGkrKykKKwl7CisJICBsZHJfcmVnaW9uX2luZm9fdCByZWdpb25faW5mbzsKKwkgIHNpemVfdCByZXRzaXplOworCSAgQ09SRV9BRERSIHJlZ2lvbl9vZmZzZXQ7CisKKwkgIGlmIChsZHJfaW5xX3JlZ2lvbiAoZmFrZV9sZHJfcHJvY2VzcywgbG0tPm1vZHVsZV9pbmZvLmxtaV9tb2RpZCwKKwkJCSAgICAgIGksICZyZWdpb25faW5mbywgc2l6ZW9mIChyZWdpb25faW5mbyksCisJCQkgICAgICAmcmV0c2l6ZSkgIT0gMCkKKwkgICAgYnJlYWs7CisJICByZWdpb25fb2Zmc2V0ID0gKENPUkVfQUREUikgcmVnaW9uX2luZm8ubHJpX21hcGFkZHIKKwkJCSAgLSAoQ09SRV9BRERSKSByZWdpb25faW5mby5scmlfdmFkZHI7CisJICBpZiAoaSA9PSAwKQorCSAgICBMTV9PRkZTRVQgKHNvX2xpc3RfcHRyKSA9IHJlZ2lvbl9vZmZzZXQ7CisJICBlbHNlIGlmIChMTV9PRkZTRVQgKHNvX2xpc3RfcHRyKSAhPSByZWdpb25fb2Zmc2V0KQorCSAgICB3YXJuaW5nICgiY2Fubm90IGhhbmRsZSBzaGFyZWQgbGlicmFyeSByZWxvY2F0aW9uIGZvciAlcyAoJXMpIiwKKwkJICAgICBzb19saXN0X3B0ci0+c29fbmFtZSwgcmVnaW9uX2luZm8ubHJpX25hbWUpOworCX0KKyNlbHNlCisgICAgICBpbnQgZXJyY29kZTsKKyAgICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICAgIHRhcmdldF9yZWFkX3N0cmluZyAoKENPUkVfQUREUikgTE1fTkFNRSAoc29fbGlzdF9wdHIpLCAmYnVmZmVyLAorCQkJICBNQVhfUEFUSF9TSVpFIC0gMSwgJmVycmNvZGUpOworICAgICAgaWYgKGVycmNvZGUgIT0gMCkKKwllcnJvciAoInhmZXJfbGlua19tYXBfbWVtYmVyOiBDYW4ndCByZWFkIHBhdGhuYW1lIGZvciBsb2FkIG1hcDogJXNcbiIsCisJICAgICAgIHNhZmVfc3RyZXJyb3IgKGVycmNvZGUpKTsKKyAgICAgIHN0cm5jcHkgKHNvX2xpc3RfcHRyLT5zb19uYW1lLCBidWZmZXIsIE1BWF9QQVRIX1NJWkUgLSAxKTsKKyAgICAgIGZyZWUgKGJ1ZmZlcik7CisgICAgICBzb19saXN0X3B0ci0+c29fbmFtZVtNQVhfUEFUSF9TSVpFIC0gMV0gPSAnXDAnOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbG0tPm1vZHVsZV9pbmZvLnJlZ2lvbl9jb3VudDsgaSsrKQorCXsKKwkgIGxkcl9yZWdpb25faW5mb190IHJlZ2lvbl9pbmZvOworCSAgQ09SRV9BRERSIHJlZ2lvbl9vZmZzZXQ7CisKKwkgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkgKGxtLT5tb2R1bGVfaW5mby5yZWdpb25pbmZvX2FkZHIKKwkJCQkgICArIGkgKiBzaXplb2YgKHJlZ2lvbl9pbmZvKSwKKwkJCQkgIChjaGFyICopICZyZWdpb25faW5mbywKKwkJCQkgIHNpemVvZiAocmVnaW9uX2luZm8pKSAhPSAwKQorCSAgICBicmVhazsKKwkgIHJlZ2lvbl9vZmZzZXQgPSByZWdpb25faW5mby5tYXBhZGRyIC0gcmVnaW9uX2luZm8udmFkZHI7CisJICBpZiAoaSA9PSAwKQorCSAgICBMTV9PRkZTRVQgKHNvX2xpc3RfcHRyKSA9IHJlZ2lvbl9vZmZzZXQ7CisJICBlbHNlIGlmIChMTV9PRkZTRVQgKHNvX2xpc3RfcHRyKSAhPSByZWdpb25fb2Zmc2V0KQorCSAgICB7CisJICAgICAgY2hhciAqcmVnaW9uX25hbWU7CisJICAgICAgdGFyZ2V0X3JlYWRfc3RyaW5nIChyZWdpb25faW5mby5yZWdpb25uYW1lX2FkZHIsICZidWZmZXIsCisJCQkJICBNQVhfUEFUSF9TSVpFIC0gMSwgJmVycmNvZGUpOworCSAgICAgIGlmIChlcnJjb2RlID09IDApCisJCXJlZ2lvbl9uYW1lID0gYnVmZmVyOworCSAgICAgIGVsc2UKKwkJcmVnaW9uX25hbWUgPSAiPz8iOworCSAgICAgIHdhcm5pbmcgKCJjYW5ub3QgaGFuZGxlIHNoYXJlZCBsaWJyYXJ5IHJlbG9jYXRpb24gZm9yICVzICglcykiLAorCQkgICAgICAgIHNvX2xpc3RfcHRyLT5zb19uYW1lLCByZWdpb25fbmFtZSk7CisJICAgICAgZnJlZSAoYnVmZmVyKTsKKwkgICAgfQorCX0KKyNlbmRpZgorCisgICAgICBjYXRjaF9lcnJvcnMgKHNvbGliX21hcF9zZWN0aW9ucywgKGNoYXIgKikgc29fbGlzdF9wdHIsCisJCSAgICAiRXJyb3Igd2hpbGUgbWFwcGluZyBzaGFyZWQgbGlicmFyeSBzZWN0aW9uczpcbiIsCisJCSAgICBSRVRVUk5fTUFTS19BTEwpOworICAgIH0KK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWZpbmRfc29saWIgLS0gc3RlcCB0aHJvdWdoIGxpc3Qgb2Ygc2hhcmVkIG9iamVjdHMKKworU1lOT1BTSVMKKworCXN0cnVjdCBzb19saXN0ICpmaW5kX3NvbGliIChzdHJ1Y3Qgc29fbGlzdCAqc29fbGlzdF9wdHIpCisKK0RFU0NSSVBUSU9OCisKKwlUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgcm91dGluZSB3aGljaCBmaW5kcyB0aGUgbmFtZXMgb2YgYW55CisJbG9hZGVkICJpbWFnZXMiIGluIHRoZSBjdXJyZW50IHByb2Nlc3MuIFRoZSBhcmd1bWVudCBpbiBtdXN0IGJlCisJTlVMTCBvbiB0aGUgZmlyc3QgY2FsbCwgYW5kIHRoZW4gdGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgcGFzc2VkCisJaW4gb24gc3Vic2VxdWVudCBjYWxscy4gVGhpcyBwcm92aWRlcyB0aGUgY2FwYWJpbGl0eSB0byAic3RlcCIgZG93bgorCXRoZSBsaXN0IG9mIGxvYWRlZCBvYmplY3RzLiBPbiB0aGUgbGFzdCBvYmplY3QsIGEgTlVMTCB2YWx1ZSBpcworCXJldHVybmVkLgorCisJVGhlIGFyZyBhbmQgcmV0dXJuIHZhbHVlIGFyZSAic3RydWN0IGxpbmtfbWFwIiBwb2ludGVycywgYXMgZGVmaW5lZAorCWluIDxsaW5rLmg+LgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc29fbGlzdCAqCitmaW5kX3NvbGliIChzb19saXN0X3B0cikKKyAgICAgc3RydWN0IHNvX2xpc3QgKnNvX2xpc3RfcHRyOwkvKiBMYXN0IGxtIG9yIE5VTEwgZm9yIGZpcnN0IG9uZSAqLworeworICBzdHJ1Y3Qgc29fbGlzdCAqc29fbGlzdF9uZXh0ID0gTlVMTDsKKyAgc3RydWN0IGxpbmtfbWFwICpsbSA9IE5VTEw7CisgIHN0cnVjdCBzb19saXN0ICpuZXc7CisgIAorICBpZiAoc29fbGlzdF9wdHIgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBXZSBhcmUgc2V0dGluZyB1cCBmb3IgYSBuZXcgc2NhbiB0aHJvdWdoIHRoZSBsb2FkZWQgaW1hZ2VzLiAqLworICAgICAgaWYgKChzb19saXN0X25leHQgPSBzb19saXN0X2hlYWQpID09IE5VTEwpCisJeworCSAgLyogRmluZCB0aGUgZmlyc3QgbGluayBtYXAgbGlzdCBtZW1iZXIuICovCisJICBsbSA9IGZpcnN0X2xpbmtfbWFwX21lbWJlciAoKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogV2UgaGF2ZSBiZWVuIGNhbGxlZCBiZWZvcmUsIGFuZCBhcmUgaW4gdGhlIHByb2Nlc3Mgb2Ygd2Fsa2luZworCSB0aGUgc2hhcmVkIGxpYnJhcnkgbGlzdC4gIEFkdmFuY2UgdG8gdGhlIG5leHQgc2hhcmVkIG9iamVjdC4gKi8KKyAgICAgIGxtID0gbmV4dF9saW5rX21hcF9tZW1iZXIgKHNvX2xpc3RfcHRyKTsKKyAgICAgIHNvX2xpc3RfbmV4dCA9IHNvX2xpc3RfcHRyIC0+IG5leHQ7CisgICAgfQorICBpZiAoKHNvX2xpc3RfbmV4dCA9PSBOVUxMKSAmJiAobG0gIT0gTlVMTCkpCisgICAgeworICAgICAgLyogR2V0IG5leHQgbGluayBtYXAgc3RydWN0dXJlIGZyb20gaW5mZXJpb3IgaW1hZ2UgYW5kIGJ1aWxkIGEgbG9jYWwKKwkgYWJicmV2aWF0ZWQgbG9hZF9tYXAgc3RydWN0dXJlICovCisgICAgICBuZXcgPSAoc3RydWN0IHNvX2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc29fbGlzdCkpOworICAgICAgbWVtc2V0ICgoY2hhciAqKSBuZXcsIDAsIHNpemVvZiAoc3RydWN0IHNvX2xpc3QpKTsKKyAgICAgIG5ldyAtPiBsbWFkZHIgPSBsbTsKKyAgICAgIC8qIEFkZCB0aGUgbmV3IG5vZGUgYXMgdGhlIG5leHQgbm9kZSBpbiB0aGUgbGlzdCwgb3IgYXMgdGhlIHJvb3QKKwkgbm9kZSBpZiB0aGlzIGlzIHRoZSBmaXJzdCBvbmUuICovCisgICAgICBpZiAoc29fbGlzdF9wdHIgIT0gTlVMTCkKKwl7CisJICBzb19saXN0X3B0ciAtPiBuZXh0ID0gbmV3OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzb19saXN0X2hlYWQgPSBuZXc7CisJfSAgICAgIAorICAgICAgc29fbGlzdF9uZXh0ID0gbmV3OworICAgICAgeGZlcl9saW5rX21hcF9tZW1iZXIgKG5ldywgbG0pOworICAgIH0KKyAgcmV0dXJuIChzb19saXN0X25leHQpOworfQorCisvKiBBIHNtYWxsIHN0dWIgdG8gZ2V0IHVzIHBhc3QgdGhlIGFyZy1wYXNzaW5nIHBpbmhvbGUgb2YgY2F0Y2hfZXJyb3JzLiAgKi8KKworc3RhdGljIGludAorc3ltYm9sX2FkZF9zdHViIChhcmcpCisgICAgIGNoYXIgKmFyZzsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHNvX2xpc3QgKnNvID0gKHN0cnVjdCBzb19saXN0ICopIGFyZzsJLyogY2F0Y2hfZXJycyBib2dvbiAqLworICBDT1JFX0FERFIgdGV4dF9hZGRyID0gMDsKKworICBpZiAoc28gLT4gdGV4dHNlY3Rpb24pCisgICAgdGV4dF9hZGRyID0gc28gLT4gdGV4dHNlY3Rpb24gLT4gYWRkcjsKKyAgZWxzZSBpZiAoc28gLT4gYWJmZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGFzZWN0aW9uICpsb3dlc3Rfc2VjdDsKKworICAgICAgLyogSWYgd2UgZGlkbid0IGZpbmQgYSBtYXBwZWQgbm9uIHplcm8gc2l6ZWQgLnRleHQgc2VjdGlvbiwgc2V0IHVwCisJIHRleHRfYWRkciBzbyB0aGF0IHRoZSByZWxvY2F0aW9uIGluIHN5bWJvbF9maWxlX2FkZCBkb2VzIG5vIGhhcm0uICAqLworCisgICAgICBsb3dlc3Rfc2VjdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzbyAtPiBhYmZkLCAiLnRleHQiKTsKKyAgICAgIGlmIChsb3dlc3Rfc2VjdCA9PSBOVUxMKQorCWJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc28gLT4gYWJmZCwgZmluZF9sb3dlc3Rfc2VjdGlvbiwKKwkJCSAgICAgICAoUFRSKSAmbG93ZXN0X3NlY3QpOworICAgICAgaWYgKGxvd2VzdF9zZWN0KQorCXRleHRfYWRkciA9IGJmZF9zZWN0aW9uX3ZtYSAoc28gLT4gYWJmZCwgbG93ZXN0X3NlY3QpICsgTE1fT0ZGU0VUIChzbyk7CisgICAgfQorICAKKyAgc28gLT4gb2JqZmlsZSA9IHN5bWJvbF9maWxlX2FkZCAoc28gLT4gc29fbmFtZSwgc28gLT4gZnJvbV90dHksCisJCQkJICAgdGV4dF9hZGRyLAorCQkJCSAgIDAsIDAsIDAsIDAsIDEpOworICByZXR1cm4gKDEpOworfQorCisvKgorCitHTE9CQUwgRlVOQ1RJT04KKworCXNvbGliX2FkZCAtLSBhZGQgYSBzaGFyZWQgbGlicmFyeSBmaWxlIHRvIHRoZSBzeW10YWIgYW5kIHNlY3Rpb24gbGlzdAorCitTWU5PUFNJUworCisJdm9pZCBzb2xpYl9hZGQgKGNoYXIgKmFyZ19zdHJpbmcsIGludCBmcm9tX3R0eSwKKwkJCXN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQpCisKK0RFU0NSSVBUSU9OCisKKyovCisKK3ZvaWQKK3NvbGliX2FkZCAoYXJnX3N0cmluZywgZnJvbV90dHksIHRhcmdldCkKKyAgICAgY2hhciAqYXJnX3N0cmluZzsKKyAgICAgaW50IGZyb21fdHR5OworICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0OworewkKKyAgcmVnaXN0ZXIgc3RydWN0IHNvX2xpc3QgKnNvID0gTlVMTDsgICAJLyogbGluayBtYXAgc3RhdGUgdmFyaWFibGUgKi8KKworICAvKiBMYXN0IHNoYXJlZCBsaWJyYXJ5IHRoYXQgd2UgcmVhZC4gICovCisgIHN0cnVjdCBzb19saXN0ICpzb19sYXN0ID0gTlVMTDsKKworICBjaGFyICpyZV9lcnI7CisgIGludCBjb3VudDsKKyAgaW50IG9sZDsKKyAgCisgIGlmICgocmVfZXJyID0gcmVfY29tcCAoYXJnX3N0cmluZyA/IGFyZ19zdHJpbmcgOiAiLiIpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGVycm9yICgiSW52YWxpZCByZWdleHA6ICVzIiwgcmVfZXJyKTsKKyAgICB9CisgIAorICAKKyAgLyogQWRkIHRoZSBzaGFyZWQgbGlicmFyeSBzZWN0aW9ucyB0byB0aGUgc2VjdGlvbiB0YWJsZSBvZiB0aGUKKyAgICAgc3BlY2lmaWVkIHRhcmdldCwgaWYgYW55LiAgKi8KKyAgaWYgKHRhcmdldCkKKyAgICB7CisgICAgICAvKiBDb3VudCBob3cgbWFueSBuZXcgc2VjdGlvbl90YWJsZSBlbnRyaWVzIHRoZXJlIGFyZS4gICovCisgICAgICBzbyA9IE5VTEw7CisgICAgICBjb3VudCA9IDA7CisgICAgICB3aGlsZSAoKHNvID0gZmluZF9zb2xpYiAoc28pKSAhPSBOVUxMKQorCXsKKwkgIGlmIChzbyAtPiBzb19uYW1lWzBdKQorCSAgICB7CisJICAgICAgY291bnQgKz0gc28gLT4gc2VjdGlvbnNfZW5kIC0gc28gLT4gc2VjdGlvbnM7CisJICAgIH0KKwl9CisgICAgICAKKyAgICAgIGlmIChjb3VudCkKKwl7CisJICBpbnQgdXBkYXRlX2NvcmVvcHM7CisKKwkgIC8qIFdlIG11c3QgdXBkYXRlIHRoZSB0b19zZWN0aW9ucyBmaWVsZCBpbiB0aGUgY29yZV9vcHMgc3RydWN0dXJlCisJICAgICBoZXJlLCBvdGhlcndpc2Ugd2UgZGVyZWZlcmVuY2UgYSBwb3RlbnRpYWwgZGFuZ2xpbmcgcG9pbnRlcgorCSAgICAgZm9yIGVhY2ggY2FsbCB0byB0YXJnZXRfcmVhZC93cml0ZV9tZW1vcnkgd2l0aGluIHRoaXMgcm91dGluZS4gICovCisJICB1cGRhdGVfY29yZW9wcyA9IGNvcmVfb3BzLnRvX3NlY3Rpb25zID09IHRhcmdldC0+dG9fc2VjdGlvbnM7CisJICAgICAKKwkgIC8qIFJlYWxsb2NhdGUgdGhlIHRhcmdldCdzIHNlY3Rpb24gdGFibGUgaW5jbHVkaW5nIHRoZSBuZXcgc2l6ZS4gICovCisJICBpZiAodGFyZ2V0IC0+IHRvX3NlY3Rpb25zKQorCSAgICB7CisJICAgICAgb2xkID0gdGFyZ2V0IC0+IHRvX3NlY3Rpb25zX2VuZCAtIHRhcmdldCAtPiB0b19zZWN0aW9uczsKKwkgICAgICB0YXJnZXQgLT4gdG9fc2VjdGlvbnMgPSAoc3RydWN0IHNlY3Rpb25fdGFibGUgKikKKwkJeHJlYWxsb2MgKChjaGFyICopdGFyZ2V0IC0+IHRvX3NlY3Rpb25zLAorCQkJIChzaXplb2YgKHN0cnVjdCBzZWN0aW9uX3RhYmxlKSkgKiAoY291bnQgKyBvbGQpKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgb2xkID0gMDsKKwkgICAgICB0YXJnZXQgLT4gdG9fc2VjdGlvbnMgPSAoc3RydWN0IHNlY3Rpb25fdGFibGUgKikKKwkJeG1hbGxvYyAoKHNpemVvZiAoc3RydWN0IHNlY3Rpb25fdGFibGUpKSAqIGNvdW50KTsKKwkgICAgfQorCSAgdGFyZ2V0IC0+IHRvX3NlY3Rpb25zX2VuZCA9IHRhcmdldCAtPiB0b19zZWN0aW9ucyArIChjb3VudCArIG9sZCk7CisJICAKKwkgIC8qIFVwZGF0ZSB0aGUgdG9fc2VjdGlvbnMgZmllbGQgaW4gdGhlIGNvcmVfb3BzIHN0cnVjdHVyZQorCSAgICAgaWYgbmVlZGVkLiAgKi8KKwkgIGlmICh1cGRhdGVfY29yZW9wcykKKwkgICAgeworCSAgICAgIGNvcmVfb3BzLnRvX3NlY3Rpb25zID0gdGFyZ2V0LT50b19zZWN0aW9uczsKKwkgICAgICBjb3JlX29wcy50b19zZWN0aW9uc19lbmQgPSB0YXJnZXQtPnRvX3NlY3Rpb25zX2VuZDsKKwkgICAgfQorCisJICAvKiBBZGQgdGhlc2Ugc2VjdGlvbiB0YWJsZSBlbnRyaWVzIHRvIHRoZSB0YXJnZXQncyB0YWJsZS4gICovCisJICB3aGlsZSAoKHNvID0gZmluZF9zb2xpYiAoc28pKSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgaWYgKHNvIC0+IHNvX25hbWVbMF0pCisJCXsKKwkJICBjb3VudCA9IHNvIC0+IHNlY3Rpb25zX2VuZCAtIHNvIC0+IHNlY3Rpb25zOworCQkgIG1lbWNweSAoKGNoYXIgKikgKHRhcmdldCAtPiB0b19zZWN0aW9ucyArIG9sZCksCisJCQkgIHNvIC0+IHNlY3Rpb25zLCAKKwkJCSAgKHNpemVvZiAoc3RydWN0IHNlY3Rpb25fdGFibGUpKSAqIGNvdW50KTsKKwkJICBvbGQgKz0gY291bnQ7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgIAorICAvKiBOb3cgYWRkIHRoZSBzeW1ib2wgZmlsZXMuICAqLworICBzbyA9IE5VTEw7CisgIHdoaWxlICgoc28gPSBmaW5kX3NvbGliIChzbykpICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHNvIC0+IHNvX25hbWVbMF0gJiYgcmVfZXhlYyAoc28gLT4gc29fbmFtZSkpCisJeworCSAgc28gLT4gZnJvbV90dHkgPSBmcm9tX3R0eTsKKwkgIGlmIChzbyAtPiBzeW1ib2xzX2xvYWRlZCkKKwkgICAgeworCSAgICAgIGlmIChmcm9tX3R0eSkKKwkJeworCQkgIHByaW50Zl91bmZpbHRlcmVkICgiU3ltYm9scyBhbHJlYWR5IGxvYWRlZCBmb3IgJXNcbiIsIHNvIC0+IHNvX25hbWUpOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKGNhdGNoX2Vycm9ycworCQkgICAoc3ltYm9sX2FkZF9zdHViLCAoY2hhciAqKSBzbywKKwkJICAgICJFcnJvciB3aGlsZSByZWFkaW5nIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbHM6XG4iLAorCQkgICAgUkVUVVJOX01BU0tfQUxMKSkKKwkgICAgeworCSAgICAgIHNvX2xhc3QgPSBzbzsKKwkgICAgICBzbyAtPiBzeW1ib2xzX2xvYWRlZCA9IDE7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIEdldHRpbmcgbmV3IHN5bWJvbHMgbWF5IGNoYW5nZSBvdXIgb3BpbmlvbiBhYm91dCB3aGF0IGlzCisgICAgIGZyYW1lbGVzcy4gICovCisgIGlmIChzb19sYXN0KQorICAgIHJlaW5pdF9mcmFtZV9jYWNoZSAoKTsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWluZm9fc2hhcmVkbGlicmFyeV9jb21tYW5kIC0tIGNvZGUgZm9yICJpbmZvIHNoYXJlZGxpYnJhcnkiCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgdm9pZCBpbmZvX3NoYXJlZGxpYnJhcnlfY29tbWFuZCAoKQorCitERVNDUklQVElPTgorCisJV2FsayB0aHJvdWdoIHRoZSBzaGFyZWQgbGlicmFyeSBsaXN0IGFuZCBwcmludCBpbmZvcm1hdGlvbgorCWFib3V0IGVhY2ggYXR0YWNoZWQgbGlicmFyeS4KKyovCisKK3N0YXRpYyB2b2lkCitpbmZvX3NoYXJlZGxpYnJhcnlfY29tbWFuZCAoaWdub3JlLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqaWdub3JlOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb19saXN0ICpzbyA9IE5VTEw7ICAJLyogbGluayBtYXAgc3RhdGUgdmFyaWFibGUgKi8KKyAgaW50IGhlYWRlcl9kb25lID0gMDsKKyAgCisgIGlmIChleGVjX2JmZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiTm8gZXhlYyBmaWxlLlxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICB3aGlsZSAoKHNvID0gZmluZF9zb2xpYiAoc28pKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChzbyAtPiBzb19uYW1lWzBdKQorCXsKKwkgIHVuc2lnbmVkIGxvbmcgdHh0X3N0YXJ0ID0gMDsKKwkgIHVuc2lnbmVkIGxvbmcgdHh0X2VuZCA9IDA7CisKKwkgIGlmICghaGVhZGVyX2RvbmUpCisJICAgIHsKKwkgICAgICBwcmludGZfdW5maWx0ZXJlZCgiJS0yMHMlLTIwcyUtMTJzJXNcbiIsICJGcm9tIiwgIlRvIiwgIlN5bXMgUmVhZCIsCisJCSAgICAgIlNoYXJlZCBPYmplY3QgTGlicmFyeSIpOworCSAgICAgIGhlYWRlcl9kb25lKys7CisJICAgIH0KKwkgIGlmIChzbyAtPiB0ZXh0c2VjdGlvbikKKwkgICAgeworCSAgICAgIHR4dF9zdGFydCA9ICh1bnNpZ25lZCBsb25nKSBzbyAtPiB0ZXh0c2VjdGlvbiAtPiBhZGRyOworCSAgICAgIHR4dF9lbmQgPSAodW5zaWduZWQgbG9uZykgc28gLT4gdGV4dHNlY3Rpb24gLT4gZW5kYWRkcjsKKwkgICAgfQorCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlLTIwcyIsIGxvY2FsX2hleF9zdHJpbmdfY3VzdG9tICh0eHRfc3RhcnQsICIwOGwiKSk7CisJICBwcmludGZfdW5maWx0ZXJlZCAoIiUtMjBzIiwgbG9jYWxfaGV4X3N0cmluZ19jdXN0b20gKHR4dF9lbmQsICIwOGwiKSk7CisJICBwcmludGZfdW5maWx0ZXJlZCAoIiUtMTJzIiwgc28gLT4gc3ltYm9sc19sb2FkZWQgPyAiWWVzIiA6ICJObyIpOworCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlc1xuIiwgIHNvIC0+IHNvX25hbWUpOworCX0KKyAgICB9CisgIGlmIChzb19saXN0X2hlYWQgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIk5vIHNoYXJlZCBsaWJyYXJpZXMgbG9hZGVkIGF0IHRoaXMgdGltZS5cbiIpOwkKKyAgICB9Cit9CisKKy8qCisKK0dMT0JBTCBGVU5DVElPTgorCisJc29saWJfYWRkcmVzcyAtLSBjaGVjayB0byBzZWUgaWYgYW4gYWRkcmVzcyBpcyBpbiBhIHNoYXJlZCBsaWIKKworU1lOT1BTSVMKKworCWNoYXIgKnNvbGliX2FkZHJlc3MgKENPUkVfQUREUiBhZGRyZXNzKQorCitERVNDUklQVElPTgorCisJUHJvdmlkZXMgYSBob29rIGZvciBvdGhlciBnZGIgcm91dGluZXMgdG8gZGlzY292ZXIgd2hldGhlciBvcgorCW5vdCBhIHBhcnRpY3VsYXIgYWRkcmVzcyBpcyB3aXRoaW4gdGhlIG1hcHBlZCBhZGRyZXNzIHNwYWNlIG9mCisJYSBzaGFyZWQgbGlicmFyeS4gIEFueSBhZGRyZXNzIGJldHdlZW4gdGhlIGJhc2UgbWFwcGluZyBhZGRyZXNzCisJYW5kIHRoZSBmaXJzdCBhZGRyZXNzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBsYXN0IG1hcHBpbmcsIGlzCisJY29uc2lkZXJlZCB0byBiZSB3aXRoaW4gdGhlIHNoYXJlZCBsaWJyYXJ5IGFkZHJlc3Mgc3BhY2UsIGZvcgorCW91ciBwdXJwb3Nlcy4KKworCUZvciBleGFtcGxlLCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGF0IG9uZSBwb2ludCB0byBkaXNhYmxlCisJYnJlYWtwb2ludHMgd2hpY2ggYXJlIGluIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGN1cnJlbnRseQorCW1hcHBlZCBpbi4KKyAqLworCitjaGFyICoKK3NvbGliX2FkZHJlc3MgKGFkZHJlc3MpCisgICAgIENPUkVfQUREUiBhZGRyZXNzOworeworICByZWdpc3RlciBzdHJ1Y3Qgc29fbGlzdCAqc28gPSAwOyAgIAkvKiBsaW5rIG1hcCBzdGF0ZSB2YXJpYWJsZSAqLworICAKKyAgd2hpbGUgKChzbyA9IGZpbmRfc29saWIgKHNvKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoc28gLT4gc29fbmFtZVswXSAmJiBzbyAtPiB0ZXh0c2VjdGlvbikKKwl7CisJICBpZiAoKGFkZHJlc3MgPj0gKENPUkVfQUREUikgc28gLT4gdGV4dHNlY3Rpb24gLT4gYWRkcikgJiYKKwkgICAgICAoYWRkcmVzcyA8IChDT1JFX0FERFIpIHNvIC0+IHRleHRzZWN0aW9uIC0+IGVuZGFkZHIpKQorCSAgICByZXR1cm4gKHNvLT5zb19uYW1lKTsKKwl9CisgICAgfQorICByZXR1cm4gKDApOworfQorCisvKiBDYWxsZWQgYnkgZnJlZV9hbGxfc3ltdGFicyAqLworCit2b2lkIAorY2xlYXJfc29saWIoKQoreworICBzdHJ1Y3Qgc29fbGlzdCAqbmV4dDsKKyAgY2hhciAqYmZkX2ZpbGVuYW1lOworICAKKyAgZGlzYWJsZV9icmVha3BvaW50c19pbl9zaGxpYnMgKDEpOworCisgIHdoaWxlIChzb19saXN0X2hlYWQpCisgICAgeworICAgICAgaWYgKHNvX2xpc3RfaGVhZCAtPiBzZWN0aW9ucykKKwl7CisJICBmcmVlICgoUFRSKXNvX2xpc3RfaGVhZCAtPiBzZWN0aW9ucyk7CisJfQorICAgICAgaWYgKHNvX2xpc3RfaGVhZCAtPiBhYmZkKQorCXsKKwkgIGJmZF9maWxlbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKHNvX2xpc3RfaGVhZCAtPiBhYmZkKTsKKwkgIGlmICghYmZkX2Nsb3NlIChzb19saXN0X2hlYWQgLT4gYWJmZCkpCisJICAgIHdhcm5pbmcgKCJjYW5ub3QgY2xvc2UgXCIlc1wiOiAlcyIsCisJCSAgICAgYmZkX2ZpbGVuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisJfQorICAgICAgZWxzZQorCS8qIFRoaXMgaGFwcGVucyBmb3IgdGhlIGV4ZWN1dGFibGUgb24gU1ZSNC4gICovCisJYmZkX2ZpbGVuYW1lID0gTlVMTDsKKworICAgICAgbmV4dCA9IHNvX2xpc3RfaGVhZCAtPiBuZXh0OworICAgICAgaWYgKGJmZF9maWxlbmFtZSkKKwlmcmVlICgoUFRSKWJmZF9maWxlbmFtZSk7CisgICAgICBmcmVlICgoUFRSKXNvX2xpc3RfaGVhZCk7CisgICAgICBzb19saXN0X2hlYWQgPSBuZXh0OworICAgIH0KK30KKyAgCisvKgorICAKK0dMT0JBTCBGVU5DVElPTgorICAKKwlzb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vayAtLSBzaGFyZWQgbGlicmFyeSBzdGFydHVwIHN1cHBvcnQKKyAgCitTWU5PUFNJUworICAKKwl2b2lkIHNvbGliX2NyZWF0ZV9pbmZlcmlvcl9ob29rKCkKKyAgCitERVNDUklQVElPTgorCisJV2hlbiBnZGIgc3RhcnRzIHVwIHRoZSBpbmZlcmlvciwgaXQgbnVyc2VzIGl0IGFsb25nICh0aHJvdWdoIHRoZQorCXNoZWxsKSB1bnRpbCBpdCBpcyByZWFkeSB0byBleGVjdXRlIGl0J3MgZmlyc3QgaW5zdHJ1Y3Rpb24uICBBdCB0aGlzCisJcG9pbnQsIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgdmlhIGV4cGFuc2lvbiBvZiB0aGUgbWFjcm8KKwlTT0xJQl9DUkVBVEVfSU5GRVJJT1JfSE9PSy4KKwlGb3IgYSBzdGF0aWNhbGx5IGJvdW5kIGV4ZWN1dGFibGUsIHRoaXMgZmlyc3QgaW5zdHJ1Y3Rpb24gaXMgdGhlCisJb25lIGF0ICJfc3RhcnQiLCBvciBhIHNpbWlsYXIgdGV4dCBsYWJlbC4gTm8gZnVydGhlciBwcm9jZXNzaW5nIGlzCisJbmVlZGVkIGluIHRoYXQgY2FzZS4KKwlGb3IgYSBkeW5hbWljYWxseSBib3VuZCBleGVjdXRhYmxlLCB0aGlzIGZpcnN0IGluc3RydWN0aW9uIGlzIHNvbWV3aGVyZQorCWluIHRoZSBybGQsIGFuZCB0aGUgYWN0dWFsIHVzZXIgZXhlY3V0YWJsZSBpcyBub3QgeWV0IG1hcHBlZCBpbi4KKwlXZSBjb250aW51ZSB0aGUgaW5mZXJpb3IgYWdhaW4sIHJsZCB0aGVuIG1hcHMgaW4gdGhlIGFjdHVhbCB1c2VyCisJZXhlY3V0YWJsZSBhbmQgYW55IG5lZWRlZCBzaGFyZWQgbGlicmFyaWVzIGFuZCB0aGVuIHNlbmRzCisJaXRzZWxmIGEgU0lHVFJBUC4KKwlBdCB0aGF0IHBvaW50IHdlIGRpc2NvdmVyIHRoZSBuYW1lcyBvZiBhbGwgc2hhcmVkIGxpYnJhcmllcyBhbmQKKwlyZWFkIHRoZWlyIHN5bWJvbHMgaW4uCisKK0ZJWE1FCisKKwlUaGlzIGNvZGUgZG9lcyBub3QgcHJvcGVybHkgaGFuZGxlIGhpdHRpbmcgYnJlYWtwb2ludHMgd2hpY2ggdGhlCisJdXNlciBtaWdodCBoYXZlIHNldCBpbiB0aGUgcmxkIGl0c2VsZi4gIFByb3BlciBoYW5kbGluZyB3b3VsZCBoYXZlCisJdG8gY2hlY2sgaWYgdGhlIFNJR1RSQVAgaGFwcGVuZWQgZHVlIHRvIGEga2lsbCBjYWxsLgorCisJQWxzbywgd2hhdCBpZiBjaGlsZCBoYXMgZXhpdCgpZWQ/ICBNdXN0IGV4aXQgbG9vcCBzb21laG93LgorICAqLworCit2b2lkCitzb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vaygpCit7CisKKyAgLyogTm90aGluZyB0byBkbyBmb3Igc3RhdGljYWxseSBib3VuZCBleGVjdXRhYmxlcy4gICovCisKKyAgaWYgKHN5bWZpbGVfb2JqZmlsZSA9PSBOVUxMCisgICAgICB8fCBzeW1maWxlX29iamZpbGUtPm9iZmQgPT0gTlVMTAorICAgICAgfHwgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKHN5bWZpbGVfb2JqZmlsZS0+b2JmZCkgJiBEWU5BTUlDKSA9PSAwKSkKKyAgICByZXR1cm47CisKKyAgLyogTm93IHJ1biB0aGUgdGFyZ2V0LiAgSXQgd2lsbCBldmVudHVhbGx5IGdldCBhIFNJR1RSQVAsIGF0CisgICAgIHdoaWNoIHBvaW50IGFsbCBvZiB0aGUgbGlicmFyaWVzIHdpbGwgaGF2ZSBiZWVuIG1hcHBlZCBpbiBhbmQgd2UKKyAgICAgY2FuIGdvIGdyb3ZlbGluZyBhcm91bmQgaW4gdGhlIHJsZCBzdHJ1Y3R1cmVzIHRvIGZpbmQKKyAgICAgb3V0IHdoYXQgd2UgbmVlZCB0byBrbm93IGFib3V0IHRoZW0uICovCisgCisgIGNsZWFyX3Byb2NlZWRfc3RhdHVzICgpOworICBzdG9wX3Nvb25fcXVpZXRseSA9IDE7CisgIHN0b3Bfc2lnbmFsID0gVEFSR0VUX1NJR05BTF8wOworICBkbworICAgIHsKKyAgICAgIHRhcmdldF9yZXN1bWUgKC0xLCAwLCBzdG9wX3NpZ25hbCk7CisgICAgICB3YWl0X2Zvcl9pbmZlcmlvciAoKTsKKyAgICB9CisgIHdoaWxlIChzdG9wX3NpZ25hbCAhPSBUQVJHRVRfU0lHTkFMX1RSQVApOworCisgIC8qICBzb2xpYl9hZGQgd2lsbCBjYWxsIHJlaW5pdF9mcmFtZV9jYWNoZS4KKyAgICAgIEJ1dCB3ZSBhcmUgc3RvcHBlZCBpbiB0aGUgcnVudGltZSBsb2FkZXIgYW5kIHdlIGRvIG5vdCBoYXZlIHN5bWJvbHMKKyAgICAgIGZvciB0aGUgcnVudGltZSBsb2FkZXIuIFNvIGhldXJpc3RpY19wcm9jX3N0YXJ0IHdpbGwgYmUgY2FsbGVkCisgICAgICBhbmQgd2lsbCBwdXQgb3V0IGFuIGFubm95aW5nIHdhcm5pbmcuCisgICAgICBEZWxheWluZyB0aGUgcmVzZXR0aW5nIG9mIHN0b3Bfc29vbl9xdWlldGx5IHVudGlsIGFmdGVyIHN5bWJvbCBsb2FkaW5nCisgICAgICBzdXBwcmVzc2VzIHRoZSB3YXJuaW5nLiAgKi8KKyAgaWYgKGF1dG9fc29saWJfYWRkKQorICAgIHNvbGliX2FkZCAoKGNoYXIgKikgMCwgMCwgKHN0cnVjdCB0YXJnZXRfb3BzICopIDApOworICBzdG9wX3Nvb25fcXVpZXRseSA9IDA7Cit9CisKKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCXNoYXJlZGxpYnJhcnlfY29tbWFuZCAtLSBoYW5kbGUgY29tbWFuZCB0byBleHBsaWNpdGx5IGFkZCBsaWJyYXJ5CisKK1NZTk9QU0lTCisKKwlzdGF0aWMgdm9pZCBzaGFyZWRsaWJyYXJ5X2NvbW1hbmQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkKKworREVTQ1JJUFRJT04KKworKi8KKworc3RhdGljIHZvaWQKK3NoYXJlZGxpYnJhcnlfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCitjaGFyICphcmdzOworaW50IGZyb21fdHR5OworeworICBkb250X3JlcGVhdCAoKTsKKyAgc29saWJfYWRkIChhcmdzLCBmcm9tX3R0eSwgKHN0cnVjdCB0YXJnZXRfb3BzICopIDApOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9zb2xpYigpCit7CisgIGFkZF9jb20gKCJzaGFyZWRsaWJyYXJ5IiwgY2xhc3NfZmlsZXMsIHNoYXJlZGxpYnJhcnlfY29tbWFuZCwKKwkgICAiTG9hZCBzaGFyZWQgb2JqZWN0IGxpYnJhcnkgc3ltYm9scyBmb3IgZmlsZXMgbWF0Y2hpbmcgUkVHRVhQLiIpOworICBhZGRfaW5mbyAoInNoYXJlZGxpYnJhcnkiLCBpbmZvX3NoYXJlZGxpYnJhcnlfY29tbWFuZCwgCisJICAgICJTdGF0dXMgb2YgbG9hZGVkIHNoYXJlZCBvYmplY3QgbGlicmFyaWVzLiIpOworCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgiYXV0by1zb2xpYi1hZGQiLCBjbGFzc19zdXBwb3J0LCB2YXJfemludGVnZXIsCisJCSAgKGNoYXIgKikgJmF1dG9fc29saWJfYWRkLAorCQkgICJTZXQgYXV0b2xvYWRpbmcgb2Ygc2hhcmVkIGxpYnJhcnkgc3ltYm9scy5cblwKK0lmIG5vbnplcm8sIHN5bWJvbHMgZnJvbSBhbGwgc2hhcmVkIG9iamVjdCBsaWJyYXJpZXMgd2lsbCBiZSBsb2FkZWRcblwKK2F1dG9tYXRpY2FsbHkgd2hlbiB0aGUgaW5mZXJpb3IgYmVnaW5zIGV4ZWN1dGlvbiBvciB3aGVuIHRoZSBkeW5hbWljIGxpbmtlclxuXAoraW5mb3JtcyBnZGIgdGhhdCBhIG5ldyBsaWJyYXJ5IGhhcyBiZWVuIGxvYWRlZC4gIE90aGVyd2lzZSwgc3ltYm9sc1xuXAorbXVzdCBiZSBsb2FkZWQgbWFudWFsbHksIHVzaW5nIGBzaGFyZWRsaWJyYXJ5Jy4iLAorCQkgICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKK30KZGlmZiAtLWdpdCBhL2dkYi9wYXJzZS5jIGIvZ2RiL3BhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY2OGZiZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9wYXJzZS5jCkBAIC0wLDAgKzEsMTM1MSBAQAorLyogUGFyc2UgZXhwcmVzc2lvbnMgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgODksIDkwLCA5MSwgOTQsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBNb2RpZmllZCBmcm9tIGV4cHJlYWQueSBieSB0aGUgRGVwYXJ0bWVudCBvZiBDb21wdXRlciBTY2llbmNlIGF0IHRoZQorICAgU3RhdGUgVW5pdmVyc2l0eSBvZiBOZXcgWW9yayBhdCBCdWZmYWxvLCAxOTkxLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFBhcnNlIGFuIGV4cHJlc3Npb24gZnJvbSB0ZXh0IGluIGEgc3RyaW5nLAorICAgYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIGEgIHN0cnVjdCBleHByZXNzaW9uICBwb2ludGVyLgorICAgVGhhdCBzdHJ1Y3R1cmUgY29udGFpbnMgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGluIHJldmVyc2UgcG9saXNoLAorICAgd2l0aCBjb25zdGFudHMgcmVwcmVzZW50ZWQgYnkgb3BlcmF0aW9ucyB0aGF0IGFyZSBmb2xsb3dlZCBieSBzcGVjaWFsIGRhdGEuCisgICBTZWUgZXhwcmVzc2lvbi5oIGZvciB0aGUgZGV0YWlscyBvZiB0aGUgZm9ybWF0LgorICAgV2hhdCBpcyBpbXBvcnRhbnQgaGVyZSBpcyB0aGF0IGl0IGNhbiBiZSBidWlsdCB1cCBzZXF1ZW50aWFsbHkKKyAgIGR1cmluZyB0aGUgcHJvY2VzcyBvZiBwYXJzaW5nOyB0aGUgbG93ZXIgbGV2ZWxzIG9mIHRoZSB0cmVlIGFsd2F5cworICAgY29tZSBmaXJzdCBpbiB0aGUgcmVzdWx0LiAgKi8KKyAgIAorI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAicGFyc2VyLWRlZnMuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCS8qIGZvciBvdmVybGF5IGZ1bmN0aW9ucyAqLworDAorLyogR2xvYmFsIHZhcmlhYmxlcyBkZWNsYXJlZCBpbiBwYXJzZXItZGVmcy5oIChhbmQgY29tbWVudGVkIHRoZXJlKS4gICovCitzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwb3V0OworaW50IGV4cG91dF9zaXplOworaW50IGV4cG91dF9wdHI7CitzdHJ1Y3QgYmxvY2sgKmV4cHJlc3Npb25fY29udGV4dF9ibG9jazsKK3N0cnVjdCBibG9jayAqaW5uZXJtb3N0X2Jsb2NrOworaW50IGFyZ2xpc3RfbGVuOwordW5pb24gdHlwZV9zdGFja19lbHQgKnR5cGVfc3RhY2s7CitpbnQgdHlwZV9zdGFja19kZXB0aCwgdHlwZV9zdGFja19zaXplOworY2hhciAqbGV4cHRyOworY2hhciAqbmFtZWNvcHk7CitpbnQgcGFyZW5fZGVwdGg7CitpbnQgY29tbWFfdGVybWluYXRlczsKKwwKKyNpZmRlZiBNQUlOVEVOQU5DRV9DTURTCitzdGF0aWMgaW50IGV4cHJlc3Npb25kZWJ1ZyA9IDA7CisjZW5kaWYKKworZXh0ZXJuIGludCBocF9zb21fc29tX29iamVjdF9wcmVzZW50OworCitzdGF0aWMgdm9pZAorZnJlZV9mdW5jYWxscyBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkCitwcmVmaXhpZnlfZXhwcmVzc2lvbiBQQVJBTVMgKChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSk7CisKK3N0YXRpYyB2b2lkCitwcmVmaXhpZnlfc3ViZXhwIFBBUkFNUyAoKHN0cnVjdCBleHByZXNzaW9uICosIHN0cnVjdCBleHByZXNzaW9uICosIGludCwgaW50KSk7CisKKy8qIERhdGEgc3RydWN0dXJlIGZvciBzYXZpbmcgdmFsdWVzIG9mIGFyZ2xpc3RfbGVuIGZvciBmdW5jdGlvbiBjYWxscyB3aG9zZQorICAgYXJndW1lbnRzIGNvbnRhaW4gb3RoZXIgZnVuY3Rpb24gY2FsbHMuICAqLworCitzdHJ1Y3QgZnVuY2FsbAorICB7CisgICAgc3RydWN0IGZ1bmNhbGwgKm5leHQ7CisgICAgaW50IGFyZ2xpc3RfbGVuOworICB9OworCitzdGF0aWMgc3RydWN0IGZ1bmNhbGwgKmZ1bmNhbGxfY2hhaW47CisKKy8qIEFzc2lnbiBtYWNoaW5lLWluZGVwZW5kZW50IG5hbWVzIHRvIGNlcnRhaW4gcmVnaXN0ZXJzIAorICAgKHVubGVzcyBvdmVycmlkZGVuIGJ5IHRoZSBSRUdJU1RFUl9OQU1FUyB0YWJsZSkgKi8KKworI2lmZGVmIE5PX1NURF9SRUdTCit1bnNpZ25lZCBudW1fc3RkX3JlZ3MgPSAwOworc3RydWN0IHN0ZF9yZWdzIHN0ZF9yZWdzWzFdOworI2Vsc2UKK3N0cnVjdCBzdGRfcmVncyBzdGRfcmVnc1tdID0geworCisjaWZkZWYgUENfUkVHTlVNCisJeyAicGMiLCBQQ19SRUdOVU0gfSwKKyNlbmRpZgorI2lmZGVmIEZQX1JFR05VTQorCXsgImZwIiwgRlBfUkVHTlVNIH0sCisjZW5kaWYKKyNpZmRlZiBTUF9SRUdOVU0KKwl7ICJzcCIsIFNQX1JFR05VTSB9LAorI2VuZGlmCisjaWZkZWYgUFNfUkVHTlVNCisJeyAicHMiLCBQU19SRUdOVU0gfSwKKyNlbmRpZgorCit9OworCit1bnNpZ25lZCBudW1fc3RkX3JlZ3MgPSAoc2l6ZW9mIHN0ZF9yZWdzIC8gc2l6ZW9mIHN0ZF9yZWdzWzBdKTsKKworI2VuZGlmCisKKy8qIFRoZSBnZW5lcmljIG1ldGhvZCBmb3IgdGFyZ2V0cyB0byBzcGVjaWZ5IGhvdyB0aGVpciByZWdpc3RlcnMgYXJlCisgICBuYW1lZC4gIFRoZSBtYXBwaW5nIGNhbiBiZSBkZXJpdmVkIGZyb20gdGhyZWUgc291cmNlczoKKyAgIFJFR0lTVEVSX05BTUU7IHN0ZF9yZWdzOyBvciBhIHRhcmdldCBzcGVjaWZpYyBhbGlhcyBob29rLiAqLworCitpbnQKK3RhcmdldF9tYXBfbmFtZV90b19yZWdpc3RlciAoc3RyLCBsZW4pCisgICAgIGNoYXIgKnN0cjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaW50IGk7CisKKyAgLyogRmlyc3QgdHJ5IHRhcmdldCBzcGVjaWZpYyBhbGlhc2VzLiBXZSB0cnkgdGhlc2UgZmlyc3QgYmVjYXVzZSBvbiBzb21lIAorICAgICBzeXN0ZW1zIHN0YW5kYXJkIG5hbWVzIGNhbiBiZSBjb250ZXh0IGRlcGVuZGVudCAoZWcuICRwYyBvbiBhIAorICAgICBtdWx0aXByb2Nlc3NvciBjYW4gYmUgY291bGQgYmUgYW55IG9mIHNldmVyYWwgUENzKS4gICovCisjaWZkZWYgUkVHSVNURVJfTkFNRV9BTElBU19IT09LCisgIGkgPSAgUkVHSVNURVJfTkFNRV9BTElBU19IT09LIChzdHIsIGxlbik7CisgIGlmIChpID49IDApCisgICAgcmV0dXJuIGk7CisjZW5kaWYKKworICAvKiBTZWFyY2ggYXJjaGl0ZWN0dXJhbCByZWdpc3RlciBuYW1lIHNwYWNlLiAqLworICBmb3IgKGkgPSAwOyBpIDwgTlVNX1JFR1M7IGkrKykKKyAgICBpZiAoUkVHSVNURVJfTkFNRSAoaSkgJiYgbGVuID09IHN0cmxlbiAoUkVHSVNURVJfTkFNRSAoaSkpCisJJiYgU1RSRVFOIChzdHIsIFJFR0lTVEVSX05BTUUgKGkpLCBsZW4pKQorICAgICAgeworCXJldHVybiBpOworICAgICAgfQorCisgIC8qIFRyeSBzdGFuZGFyZCBhbGlhc2VzICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1fc3RkX3JlZ3M7IGkrKykKKyAgICBpZiAoc3RkX3JlZ3NbaV0ubmFtZSAmJiBsZW4gPT0gc3RybGVuIChzdGRfcmVnc1tpXS5uYW1lKQorCSYmIFNUUkVRTiAoc3RyLCBzdGRfcmVnc1tpXS5uYW1lLCBsZW4pKQorICAgICAgeworCXJldHVybiBzdGRfcmVnc1tpXS5yZWdudW07CisgICAgICB9CisKKyAgcmV0dXJuIC0xOworfQorCisvKiBCZWdpbiBjb3VudGluZyBhcmd1bWVudHMgZm9yIGEgZnVuY3Rpb24gY2FsbCwKKyAgIHNhdmluZyB0aGUgZGF0YSBhYm91dCBhbnkgY29udGFpbmluZyBjYWxsLiAgKi8KKwordm9pZAorc3RhcnRfYXJnbGlzdCAoKQoreworICByZWdpc3RlciBzdHJ1Y3QgZnVuY2FsbCAqbmV3OworCisgIG5ldyA9IChzdHJ1Y3QgZnVuY2FsbCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBmdW5jYWxsKSk7CisgIG5ldy0+bmV4dCA9IGZ1bmNhbGxfY2hhaW47CisgIG5ldy0+YXJnbGlzdF9sZW4gPSBhcmdsaXN0X2xlbjsKKyAgYXJnbGlzdF9sZW4gPSAwOworICBmdW5jYWxsX2NoYWluID0gbmV3OworfQorCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBhcmd1bWVudHMgaW4gYSBmdW5jdGlvbiBjYWxsIGp1c3QgdGVybWluYXRlZCwKKyAgIGFuZCByZXN0b3JlIHRoZSBkYXRhIGZvciB0aGUgY29udGFpbmluZyBmdW5jdGlvbiBjYWxsLiAgKi8KKworaW50CitlbmRfYXJnbGlzdCAoKQoreworICByZWdpc3RlciBpbnQgdmFsID0gYXJnbGlzdF9sZW47CisgIHJlZ2lzdGVyIHN0cnVjdCBmdW5jYWxsICpjYWxsID0gZnVuY2FsbF9jaGFpbjsKKyAgZnVuY2FsbF9jaGFpbiA9IGNhbGwtPm5leHQ7CisgIGFyZ2xpc3RfbGVuID0gY2FsbC0+YXJnbGlzdF9sZW47CisgIGZyZWUgKChQVFIpY2FsbCk7CisgIHJldHVybiB2YWw7Cit9CisKKy8qIEZyZWUgZXZlcnl0aGluZyBpbiB0aGUgZnVuY2FsbCBjaGFpbi4KKyAgIFVzZWQgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbnNpZGUgcGFyc2luZy4gICovCisKK3N0YXRpYyB2b2lkCitmcmVlX2Z1bmNhbGxzICgpCit7CisgIHJlZ2lzdGVyIHN0cnVjdCBmdW5jYWxsICpjYWxsLCAqbmV4dDsKKworICBmb3IgKGNhbGwgPSBmdW5jYWxsX2NoYWluOyBjYWxsOyBjYWxsID0gbmV4dCkKKyAgICB7CisgICAgICBuZXh0ID0gY2FsbC0+bmV4dDsKKyAgICAgIGZyZWUgKChQVFIpY2FsbCk7CisgICAgfQorfQorDAorLyogVGhpcyBwYWdlIGNvbnRhaW5zIHRoZSBmdW5jdGlvbnMgZm9yIGFkZGluZyBkYXRhIHRvIHRoZSAgc3RydWN0IGV4cHJlc3Npb24KKyAgIGJlaW5nIGNvbnN0cnVjdGVkLiAgKi8KKworLyogQWRkIG9uZSBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIGV4cHJlc3Npb24uICAqLworCisvKiBUbyBhdm9pZCBhIGJ1ZyBpbiB0aGUgU3VuIDQgY29tcGlsZXIsIHdlIHBhc3MgdGhpbmdzIHRoYXQgY2FuIGZpdCBpbnRvCisgICBhIHJlZ2lzdGVyIHRocm91Z2ggaGVyZSAqLworCit2b2lkCit3cml0ZV9leHBfZWx0IChleHBlbHQpCisgICAgIHVuaW9uIGV4cF9lbGVtZW50IGV4cGVsdDsKK3sKKyAgaWYgKGV4cG91dF9wdHIgPj0gZXhwb3V0X3NpemUpCisgICAgeworICAgICAgZXhwb3V0X3NpemUgKj0gMjsKKyAgICAgIGV4cG91dCA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKQorCXhyZWFsbG9jICgoY2hhciAqKSBleHBvdXQsIHNpemVvZiAoc3RydWN0IGV4cHJlc3Npb24pCisJCSAgKyBFWFBfRUxFTV9UT19CWVRFUyAoZXhwb3V0X3NpemUpKTsKKyAgICB9CisgIGV4cG91dC0+ZWx0c1tleHBvdXRfcHRyKytdID0gZXhwZWx0OworfQorCit2b2lkCit3cml0ZV9leHBfZWx0X29wY29kZSAoZXhwZWx0KQorICAgICBlbnVtIGV4cF9vcGNvZGUgZXhwZWx0OworeworICB1bmlvbiBleHBfZWxlbWVudCB0bXA7CisKKyAgdG1wLm9wY29kZSA9IGV4cGVsdDsKKworICB3cml0ZV9leHBfZWx0ICh0bXApOworfQorCit2b2lkCit3cml0ZV9leHBfZWx0X3N5bSAoZXhwZWx0KQorICAgICBzdHJ1Y3Qgc3ltYm9sICpleHBlbHQ7Cit7CisgIHVuaW9uIGV4cF9lbGVtZW50IHRtcDsKKworICB0bXAuc3ltYm9sID0gZXhwZWx0OworCisgIHdyaXRlX2V4cF9lbHQgKHRtcCk7Cit9CisKK3ZvaWQKK3dyaXRlX2V4cF9lbHRfYmxvY2sgKGIpCisgICAgIHN0cnVjdCBibG9jayAqYjsKK3sKKyAgdW5pb24gZXhwX2VsZW1lbnQgdG1wOworICB0bXAuYmxvY2sgPSBiOworICB3cml0ZV9leHBfZWx0ICh0bXApOworfQorCit2b2lkCit3cml0ZV9leHBfZWx0X2xvbmdjc3QgKGV4cGVsdCkKKyAgICAgTE9OR0VTVCBleHBlbHQ7Cit7CisgIHVuaW9uIGV4cF9lbGVtZW50IHRtcDsKKworICB0bXAubG9uZ2NvbnN0ID0gZXhwZWx0OworCisgIHdyaXRlX2V4cF9lbHQgKHRtcCk7Cit9CisKK3ZvaWQKK3dyaXRlX2V4cF9lbHRfZGJsY3N0IChleHBlbHQpCisgICAgIERPVUJMRVNUIGV4cGVsdDsKK3sKKyAgdW5pb24gZXhwX2VsZW1lbnQgdG1wOworCisgIHRtcC5kb3VibGVjb25zdCA9IGV4cGVsdDsKKworICB3cml0ZV9leHBfZWx0ICh0bXApOworfQorCit2b2lkCit3cml0ZV9leHBfZWx0X3R5cGUgKGV4cGVsdCkKKyAgICAgc3RydWN0IHR5cGUgKmV4cGVsdDsKK3sKKyAgdW5pb24gZXhwX2VsZW1lbnQgdG1wOworCisgIHRtcC50eXBlID0gZXhwZWx0OworCisgIHdyaXRlX2V4cF9lbHQgKHRtcCk7Cit9CisKK3ZvaWQKK3dyaXRlX2V4cF9lbHRfaW50ZXJuIChleHBlbHQpCisgICAgIHN0cnVjdCBpbnRlcm5hbHZhciAqZXhwZWx0OworeworICB1bmlvbiBleHBfZWxlbWVudCB0bXA7CisKKyAgdG1wLmludGVybmFsdmFyID0gZXhwZWx0OworCisgIHdyaXRlX2V4cF9lbHQgKHRtcCk7Cit9CisKKy8qIEFkZCBhIHN0cmluZyBjb25zdGFudCB0byB0aGUgZW5kIG9mIHRoZSBleHByZXNzaW9uLgorCisgICBTdHJpbmcgY29uc3RhbnRzIGFyZSBzdG9yZWQgYnkgZmlyc3Qgd3JpdGluZyBhbiBleHByZXNzaW9uIGVsZW1lbnQKKyAgIHRoYXQgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLCB0aGVuIHN0dWZmaW5nIHRoZSBzdHJpbmcKKyAgIGNvbnN0YW50IGl0c2VsZiBpbnRvIGhvd2V2ZXIgbWFueSBleHByZXNzaW9uIGVsZW1lbnRzIGFyZSBuZWVkZWQKKyAgIHRvIGhvbGQgaXQsIGFuZCB0aGVuIHdyaXRpbmcgYW5vdGhlciBleHByZXNzaW9uIGVsZW1lbnQgdGhhdCBjb250YWlucworICAgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLiAgSS5FLiBhbiBleHByZXNzaW9uIGVsZW1lbnQgYXQgZWFjaCBlbmQgb2YKKyAgIHRoZSBzdHJpbmcgcmVjb3JkcyB0aGUgc3RyaW5nIGxlbmd0aCwgc28geW91IGNhbiBza2lwIG92ZXIgdGhlIAorICAgZXhwcmVzc2lvbiBlbGVtZW50cyBjb250YWluaW5nIHRoZSBhY3R1YWwgc3RyaW5nIGJ5dGVzIGZyb20gZWl0aGVyCisgICBlbmQgb2YgdGhlIHN0cmluZy4gIE5vdGUgdGhhdCB0aGlzIGFsc28gYWxsb3dzIGdkYiB0byBoYW5kbGUKKyAgIHN0cmluZ3Mgd2l0aCBlbWJlZGRlZCBudWxsIGJ5dGVzLCBhcyBpcyByZXF1aXJlZCBmb3Igc29tZSBsYW5ndWFnZXMuCisKKyAgIERvbid0IGJlIGZvb2xlZCBieSB0aGUgZmFjdCB0aGF0IHRoZSBzdHJpbmcgaXMgbnVsbCBieXRlIHRlcm1pbmF0ZWQsCisgICB0aGlzIGlzIHN0cmljdGx5IGZvciB0aGUgY29udmVuaWVuY2Ugb2YgZGVidWdnaW5nIGdkYiBpdHNlbGYuICBHZGIKKyAgIEdkYiBkb2VzIG5vdCBkZXBlbmQgdXAgdGhlIHN0cmluZyBiZWluZyBudWxsIHRlcm1pbmF0ZWQsIHNpbmNlIHRoZQorICAgYWN0dWFsIGxlbmd0aCBpcyByZWNvcmRlZCBpbiBleHByZXNzaW9uIGVsZW1lbnRzIGF0IGVhY2ggZW5kIG9mIHRoZQorICAgc3RyaW5nLiAgVGhlIG51bGwgYnl0ZSBpcyB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24gd2hlbiBjb21wdXRpbmcgaG93CisgICBtYW55IGV4cHJlc3Npb24gZWxlbWVudHMgYXJlIHJlcXVpcmVkIHRvIGhvbGQgdGhlIHN0cmluZyBjb25zdGFudCwgb2YKKyAgIGNvdXJzZS4gKi8KKworCit2b2lkCit3cml0ZV9leHBfc3RyaW5nIChzdHIpCisgICAgIHN0cnVjdCBzdG9rZW4gc3RyOworeworICByZWdpc3RlciBpbnQgbGVuID0gc3RyLmxlbmd0aDsKKyAgcmVnaXN0ZXIgaW50IGxlbmVsdDsKKyAgcmVnaXN0ZXIgY2hhciAqc3RyZGF0YTsKKworICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgZXhwcmVzc2lvbiBlbGVtZW50cyByZXF1aXJlZCB0byBob2xkIHRoZSBzdHJpbmcKKyAgICAgKGluY2x1ZGluZyBhIG51bGwgYnl0ZSB0ZXJtaW5hdG9yKSwgYWxvbmcgd2l0aCBvbmUgZXhwcmVzc2lvbiBlbGVtZW50CisgICAgIGF0IGVhY2ggZW5kIHRvIHJlY29yZCB0aGUgYWN0dWFsIHN0cmluZyBsZW5ndGggKG5vdCBpbmNsdWRpbmcgdGhlCisgICAgIG51bGwgYnl0ZSB0ZXJtaW5hdG9yKS4gKi8KKworICBsZW5lbHQgPSAyICsgQllURVNfVE9fRVhQX0VMRU0gKGxlbiArIDEpOworCisgIC8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgZW5vdWdoIGF2YWlsYWJsZSBleHByZXNzaW9uIGVsZW1lbnRzIHRvIHN0b3JlCisgICAgIGV2ZXJ5dGhpbmcuICovCisKKyAgaWYgKChleHBvdXRfcHRyICsgbGVuZWx0KSA+PSBleHBvdXRfc2l6ZSkKKyAgICB7CisgICAgICBleHBvdXRfc2l6ZSA9IG1heCAoZXhwb3V0X3NpemUgKiAyLCBleHBvdXRfcHRyICsgbGVuZWx0ICsgMTApOworICAgICAgZXhwb3V0ID0gKHN0cnVjdCBleHByZXNzaW9uICopCisJeHJlYWxsb2MgKChjaGFyICopIGV4cG91dCwgKHNpemVvZiAoc3RydWN0IGV4cHJlc3Npb24pCisJCQkJICAgICsgRVhQX0VMRU1fVE9fQllURVMgKGV4cG91dF9zaXplKSkpOworICAgIH0KKworICAvKiBXcml0ZSB0aGUgbGVhZGluZyBsZW5ndGggZXhwcmVzc2lvbiBlbGVtZW50ICh3aGljaCBhZHZhbmNlcyB0aGUgY3VycmVudAorICAgICBleHByZXNzaW9uIGVsZW1lbnQgaW5kZXgpLCB0aGVuIHdyaXRlIHRoZSBzdHJpbmcgY29uc3RhbnQgZm9sbG93ZWQgYnkgYQorICAgICB0ZXJtaW5hdGluZyBudWxsIGJ5dGUsIGFuZCB0aGVuIHdyaXRlIHRoZSB0cmFpbGluZyBsZW5ndGggZXhwcmVzc2lvbgorICAgICBlbGVtZW50LiAqLworCisgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIGxlbik7CisgIHN0cmRhdGEgPSAoY2hhciAqKSAmZXhwb3V0LT5lbHRzW2V4cG91dF9wdHJdOworICBtZW1jcHkgKHN0cmRhdGEsIHN0ci5wdHIsIGxlbik7CisgICooc3RyZGF0YSArIGxlbikgPSAnXDAnOworICBleHBvdXRfcHRyICs9IGxlbmVsdCAtIDI7CisgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIGxlbik7Cit9CisKKy8qIEFkZCBhIGJpdHN0cmluZyBjb25zdGFudCB0byB0aGUgZW5kIG9mIHRoZSBleHByZXNzaW9uLgorCisgICBCaXRzdHJpbmcgY29uc3RhbnRzIGFyZSBzdG9yZWQgYnkgZmlyc3Qgd3JpdGluZyBhbiBleHByZXNzaW9uIGVsZW1lbnQKKyAgIHRoYXQgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgYml0c3RyaW5nIChpbiBiaXRzKSwgdGhlbiBzdHVmZmluZyB0aGUKKyAgIGJpdHN0cmluZyBjb25zdGFudCBpdHNlbGYgaW50byBob3dldmVyIG1hbnkgZXhwcmVzc2lvbiBlbGVtZW50cyBhcmUKKyAgIG5lZWRlZCB0byBob2xkIGl0LCBhbmQgdGhlbiB3cml0aW5nIGFub3RoZXIgZXhwcmVzc2lvbiBlbGVtZW50IHRoYXQKKyAgIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIGJpdHN0cmluZy4gIEkuRS4gYW4gZXhwcmVzc2lvbiBlbGVtZW50IGF0CisgICBlYWNoIGVuZCBvZiB0aGUgYml0c3RyaW5nIHJlY29yZHMgdGhlIGJpdHN0cmluZyBsZW5ndGgsIHNvIHlvdSBjYW4gc2tpcAorICAgb3ZlciB0aGUgZXhwcmVzc2lvbiBlbGVtZW50cyBjb250YWluaW5nIHRoZSBhY3R1YWwgYml0c3RyaW5nIGJ5dGVzIGZyb20KKyAgIGVpdGhlciBlbmQgb2YgdGhlIGJpdHN0cmluZy4gKi8KKwordm9pZAord3JpdGVfZXhwX2JpdHN0cmluZyAoc3RyKQorICAgICBzdHJ1Y3Qgc3Rva2VuIHN0cjsKK3sKKyAgcmVnaXN0ZXIgaW50IGJpdHMgPSBzdHIubGVuZ3RoOwkvKiBsZW5ndGggaW4gYml0cyAqLworICByZWdpc3RlciBpbnQgbGVuID0gKGJpdHMgKyBIT1NUX0NIQVJfQklUIC0gMSkgLyBIT1NUX0NIQVJfQklUOworICByZWdpc3RlciBpbnQgbGVuZWx0OworICByZWdpc3RlciBjaGFyICpzdHJkYXRhOworCisgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBleHByZXNzaW9uIGVsZW1lbnRzIHJlcXVpcmVkIHRvIGhvbGQgdGhlIGJpdHN0cmluZywKKyAgICAgYWxvbmcgd2l0aCBvbmUgZXhwcmVzc2lvbiBlbGVtZW50IGF0IGVhY2ggZW5kIHRvIHJlY29yZCB0aGUgYWN0dWFsCisgICAgIGJpdHN0cmluZyBsZW5ndGggaW4gYml0cy4gKi8KKworICBsZW5lbHQgPSAyICsgQllURVNfVE9fRVhQX0VMRU0gKGxlbik7CisKKyAgLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBlbm91Z2ggYXZhaWxhYmxlIGV4cHJlc3Npb24gZWxlbWVudHMgdG8gc3RvcmUKKyAgICAgZXZlcnl0aGluZy4gKi8KKworICBpZiAoKGV4cG91dF9wdHIgKyBsZW5lbHQpID49IGV4cG91dF9zaXplKQorICAgIHsKKyAgICAgIGV4cG91dF9zaXplID0gbWF4IChleHBvdXRfc2l6ZSAqIDIsIGV4cG91dF9wdHIgKyBsZW5lbHQgKyAxMCk7CisgICAgICBleHBvdXQgPSAoc3RydWN0IGV4cHJlc3Npb24gKikKKwl4cmVhbGxvYyAoKGNoYXIgKikgZXhwb3V0LCAoc2l6ZW9mIChzdHJ1Y3QgZXhwcmVzc2lvbikKKwkJCQkgICAgKyBFWFBfRUxFTV9UT19CWVRFUyAoZXhwb3V0X3NpemUpKSk7CisgICAgfQorCisgIC8qIFdyaXRlIHRoZSBsZWFkaW5nIGxlbmd0aCBleHByZXNzaW9uIGVsZW1lbnQgKHdoaWNoIGFkdmFuY2VzIHRoZSBjdXJyZW50CisgICAgIGV4cHJlc3Npb24gZWxlbWVudCBpbmRleCksIHRoZW4gd3JpdGUgdGhlIGJpdHN0cmluZyBjb25zdGFudCwgYW5kIHRoZW4KKyAgICAgd3JpdGUgdGhlIHRyYWlsaW5nIGxlbmd0aCBleHByZXNzaW9uIGVsZW1lbnQuICovCisKKyAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgYml0cyk7CisgIHN0cmRhdGEgPSAoY2hhciAqKSAmZXhwb3V0LT5lbHRzW2V4cG91dF9wdHJdOworICBtZW1jcHkgKHN0cmRhdGEsIHN0ci5wdHIsIGxlbik7CisgIGV4cG91dF9wdHIgKz0gbGVuZWx0IC0gMjsKKyAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgYml0cyk7Cit9CisKKy8qIEFkZCB0aGUgYXBwcm9wcmlhdGUgZWxlbWVudHMgZm9yIGEgbWluaW1hbCBzeW1ib2wgdG8gdGhlIGVuZCBvZgorICAgdGhlIGV4cHJlc3Npb24uICBUaGUgcmF0aW9uYWxlIGJlaGluZCBwYXNzaW5nIGluIHRleHRfc3ltYm9sX3R5cGUgYW5kCisgICBkYXRhX3N5bWJvbF90eXBlIHdhcyBzbyB0aGF0IE1vZHVsYS0yIGNvdWxkIHBhc3MgaW4gV09SRCBmb3IKKyAgIGRhdGFfc3ltYm9sX3R5cGUuICBQZXJoYXBzIGl0IHN0aWxsIGlzIHVzZWZ1bCB0byBoYXZlIHRob3NlIHR5cGVzIHZhcnkKKyAgIGJhc2VkIG9uIHRoZSBsYW5ndWFnZSwgYnV0IHRoZXkgbm8gbG9uZ2VyIGhhdmUgbmFtZXMgbGlrZSAiaW50Iiwgc28KKyAgIHRoZSBpbml0aWFsIHJhdGlvbmFsZSBpcyBnb25lLiAgKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICptc3ltX3RleHRfc3ltYm9sX3R5cGU7CitzdGF0aWMgc3RydWN0IHR5cGUgKm1zeW1fZGF0YV9zeW1ib2xfdHlwZTsKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqbXN5bV91bmtub3duX3N5bWJvbF90eXBlOworCit2b2lkCit3cml0ZV9leHBfbXN5bWJvbCAobXN5bWJvbCwgdGV4dF9zeW1ib2xfdHlwZSwgZGF0YV9zeW1ib2xfdHlwZSkKKyAgICAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sOworICAgICBzdHJ1Y3QgdHlwZSAqdGV4dF9zeW1ib2xfdHlwZTsKKyAgICAgc3RydWN0IHR5cGUgKmRhdGFfc3ltYm9sX3R5cGU7Cit7CisgIENPUkVfQUREUiBhZGRyOworCisgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKKyAgd3JpdGVfZXhwX2VsdF90eXBlIChsb29rdXBfcG9pbnRlcl90eXBlIChidWlsdGluX3R5cGVfdm9pZCkpOworCisgIGFkZHIgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCk7CisgIGlmIChvdmVybGF5X2RlYnVnZ2luZykKKyAgICBhZGRyID0gc3ltYm9sX292ZXJsYXllZF9hZGRyZXNzIChhZGRyLCBTWU1CT0xfQkZEX1NFQ1RJT04gKG1zeW1ib2wpKTsKKyAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgYWRkcik7CisJCQkJCQkKKyAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOworCisgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX01FTVZBTCk7CisgIHN3aXRjaCAobXN5bWJvbCAtPiB0eXBlKQorICAgIHsKKyAgICBjYXNlIG1zdF90ZXh0OgorICAgIGNhc2UgbXN0X2ZpbGVfdGV4dDoKKyAgICBjYXNlIG1zdF9zb2xpYl90cmFtcG9saW5lOgorICAgICAgd3JpdGVfZXhwX2VsdF90eXBlIChtc3ltX3RleHRfc3ltYm9sX3R5cGUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIG1zdF9kYXRhOgorICAgIGNhc2UgbXN0X2ZpbGVfZGF0YToKKyAgICBjYXNlIG1zdF9ic3M6CisgICAgY2FzZSBtc3RfZmlsZV9ic3M6CisgICAgICB3cml0ZV9leHBfZWx0X3R5cGUgKG1zeW1fZGF0YV9zeW1ib2xfdHlwZSk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICB3cml0ZV9leHBfZWx0X3R5cGUgKG1zeW1fdW5rbm93bl9zeW1ib2xfdHlwZSk7CisgICAgICBicmVhazsKKyAgICB9CisgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX01FTVZBTCk7Cit9CisMCisvKiBSZWNvZ25pemUgdG9rZW5zIHRoYXQgc3RhcnQgd2l0aCAnJCcuICBUaGVzZSBpbmNsdWRlOgorCisJJHJlZ25hbWUJQSBuYXRpdmUgcmVnaXN0ZXIgbmFtZSBvciBhICJzdGFuZGFyZAorCQkJcmVnaXN0ZXIgbmFtZSIuCisKKwkkdmFyaWFibGUJQSBjb252ZW5pZW5jZSB2YXJpYWJsZSB3aXRoIGEgbmFtZSBjaG9zZW4KKwkJCWJ5IHRoZSB1c2VyLgorCisJJGRpZ2l0cwkJVmFsdWUgaGlzdG9yeSB3aXRoIGluZGV4IDxkaWdpdHM+LCBzdGFydGluZworCQkJZnJvbSB0aGUgZmlyc3QgdmFsdWUgd2hpY2ggaGFzIGluZGV4IDEuCisKKwkkJGRpZ2l0cwlWYWx1ZSBoaXN0b3J5IHdpdGggaW5kZXggPGRpZ2l0cz4gcmVsYXRpdmUKKwkJCXRvIHRoZSBsYXN0IHZhbHVlLiAgSS5FLiAkJDAgaXMgdGhlIGxhc3QKKwkJCXZhbHVlLCAkJDEgaXMgdGhlIG9uZSBwcmV2aW91cyB0byB0aGF0LCAkJDIKKwkJCWlzIHRoZSBvbmUgcHJldmlvdXMgdG8gJCQxLCBldGMuCisKKwkkIHwgJDAgfCAkJDAJVGhlIGxhc3QgdmFsdWUgaW4gdGhlIHZhbHVlIGhpc3RvcnkuCisKKwkkJAkJQW4gYWJicmV2aWF0aW9uIGZvciB0aGUgc2Vjb25kIHRvIHRoZSBsYXN0CisJCQl2YWx1ZSBpbiB0aGUgdmFsdWUgaGlzdG9yeSwgSS5FLiAkJDEKKworICAgKi8KKwordm9pZAord3JpdGVfZG9sbGFyX3ZhcmlhYmxlIChzdHIpCisgICAgIHN0cnVjdCBzdG9rZW4gc3RyOworeworICAvKiBIYW5kbGUgdGhlIHRva2VucyAkZGlnaXRzOyBhbHNvICQgKHNob3J0IGZvciAkMCkgYW5kICQkIChzaG9ydCBmb3IgJCQxKQorICAgICBhbmQgJCRkaWdpdHMgKGVxdWl2YWxlbnQgdG8gJDwtZGlnaXRzPiBpZiB5b3UgY291bGQgdHlwZSB0aGF0KS4gKi8KKworICBzdHJ1Y3Qgc3ltYm9sICogc3ltID0gTlVMTDsKKyAgc3RydWN0IG1pbmltYWxfc3ltYm9sICogbXN5bSA9IE5VTEw7CisKKyAgaW50IG5lZ2F0ZSA9IDA7CisgIGludCBpID0gMTsKKyAgLyogRG91YmxlIGRvbGxhciBtZWFucyBuZWdhdGUgdGhlIG51bWJlciBhbmQgYWRkIC0xIGFzIHdlbGwuCisgICAgIFRodXMgJCQgYWxvbmUgbWVhbnMgLTEuICAqLworICBpZiAoc3RyLmxlbmd0aCA+PSAyICYmIHN0ci5wdHJbMV0gPT0gJyQnKQorICAgIHsKKyAgICAgIG5lZ2F0ZSA9IDE7CisgICAgICBpID0gMjsKKyAgICB9CisgIGlmIChpID09IHN0ci5sZW5ndGgpCisgICAgeworICAgICAgLyogSnVzdCBkb2xsYXJzIChvbmUgb3IgdHdvKSAqLworICAgICAgaSA9IC0gbmVnYXRlOworICAgICAgZ290byBoYW5kbGVfbGFzdDsKKyAgICB9CisgIC8qIElzIHRoZSByZXN0IG9mIHRoZSB0b2tlbiBkaWdpdHM/ICAqLworICBmb3IgKDsgaSA8IHN0ci5sZW5ndGg7IGkrKykKKyAgICBpZiAoIShzdHIucHRyW2ldID49ICcwJyAmJiBzdHIucHRyW2ldIDw9ICc5JykpCisgICAgICBicmVhazsKKyAgaWYgKGkgPT0gc3RyLmxlbmd0aCkKKyAgICB7CisgICAgICBpID0gYXRvaSAoc3RyLnB0ciArIDEgKyBuZWdhdGUpOworICAgICAgaWYgKG5lZ2F0ZSkKKwlpID0gLSBpOworICAgICAgZ290byBoYW5kbGVfbGFzdDsKKyAgICB9CisgIAorICAvKiBIYW5kbGUgdG9rZW5zIHRoYXQgcmVmZXIgdG8gbWFjaGluZSByZWdpc3RlcnM6CisgICAgICQgZm9sbG93ZWQgYnkgYSByZWdpc3RlciBuYW1lLiAgKi8KKyAgaSA9IHRhcmdldF9tYXBfbmFtZV90b19yZWdpc3Rlciggc3RyLnB0ciArIDEsIHN0ci5sZW5ndGggLSAxICk7CisgIGlmKCBpID49IDAgKQorICAgIGdvdG8gaGFuZGxlX3JlZ2lzdGVyOworCisgIC8qIE9uIEhQLVVYLCBjZXJ0YWluIHN5c3RlbSByb3V0aW5lcyAobWlsbGljb2RlKSBoYXZlIG5hbWVzIGJlZ2lubmluZworICAgICB3aXRoICQgb3IgJCQsIGUuZy4gJCRkeW5jYWxsLCB3aGljaCBoYW5kbGVzIGludGVyLXNwYWNlIHByb2NlZHVyZQorICAgICBjYWxscyBvbiBQQS1SSVNDLiBDaGVjayBmb3IgdGhvc2UsIGZpcnN0LiAqLworCisgIHN5bSA9IGxvb2t1cF9zeW1ib2wgKGNvcHlfbmFtZSAoc3RyKSwgKHN0cnVjdCBibG9jayAqKSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBWQVJfTkFNRVNQQUNFLCAoaW50ICopIE5VTEwsIChzdHJ1Y3Qgc3ltdGFiICoqKSBOVUxMKTsKKyAgaWYgKHN5bSkKKyAgICB7CisgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfYmxvY2sgKGJsb2NrX2ZvdW5kKTsgLyogc2V0IGJ5IGxvb2t1cF9zeW1ib2wgKi8KKyAgICAgIHdyaXRlX2V4cF9lbHRfc3ltIChzeW0pOworICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7CisgICAgICByZXR1cm47CisgICAgfQorICBtc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sIChjb3B5X25hbWUgKHN0ciksIE5VTEwsIE5VTEwpOworICBpZiAobXN5bSkKKyAgICB7CisgICAgICB3cml0ZV9leHBfbXN5bWJvbCAobXN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBfZnVuY3Rpb25fdHlwZSAoYnVpbHRpbl90eXBlX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl90eXBlX2ludCk7CisgICAgICByZXR1cm47CisgICAgfQorICAKKyAgLyogQW55IG90aGVyIG5hbWVzIHN0YXJ0aW5nIGluICQgYXJlIGRlYnVnZ2VyIGludGVybmFsIHZhcmlhYmxlcy4gICovCisKKyAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0lOVEVSTkFMVkFSKTsKKyAgd3JpdGVfZXhwX2VsdF9pbnRlcm4gKGxvb2t1cF9pbnRlcm5hbHZhciAoY29weV9uYW1lIChzdHIpICsgMSkpOworICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfSU5URVJOQUxWQVIpOyAKKyAgcmV0dXJuOworIGhhbmRsZV9sYXN0OgorICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTEFTVCk7CisgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIGkpOworICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTEFTVCk7CisgIHJldHVybjsKKyBoYW5kbGVfcmVnaXN0ZXI6CisgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9SRUdJU1RFUik7CisgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoaSk7CisgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9SRUdJU1RFUik7IAorICByZXR1cm47Cit9CisKKworLyogUGFyc2UgYSBzdHJpbmcgdGhhdCBpcyBwb3NzaWJseSBhIG5hbWVzcGFjZSAvIG5lc3RlZCBjbGFzcworICAgc3BlY2lmaWNhdGlvbiwgaS5lLiwgc29tZXRoaW5nIG9mIHRoZSBmb3JtIEE6OkI6OkM6OnguICBJbnB1dAorICAgKE5BTUUpIGlzIHRoZSBlbnRpcmUgc3RyaW5nOyBMRU4gaXMgdGhlIGN1cnJlbnQgdmFsaWQgbGVuZ3RoOyB0aGUKKyAgIG91dHB1dCBpcyBhIHN0cmluZywgVE9LRU4sIHdoaWNoIHBvaW50cyB0byB0aGUgbGFyZ2VzdCByZWNvZ25pemVkCisgICBwcmVmaXggd2hpY2ggaXMgYSBzZXJpZXMgb2YgbmFtZXNwYWNlcyBvciBjbGFzc2VzLiAgQ0xBU1NfUFJFRklYIGlzCisgICBhbm90aGVyIG91dHB1dCwgd2hpY2ggcmVjb3JkcyB3aGV0aGVyIGEgbmVzdGVkIGNsYXNzIHNwZWMgd2FzCisgICByZWNvZ25pemVkICg9IDEpIG9yIGEgZnVsbHkgcXVhbGlmaWVkIHZhcmlhYmxlIG5hbWUgd2FzIGZvdW5kICg9CisgICAwKS4gIEFSR1BUUiBpcyBzaWRlLWVmZmVjdGVkIChpZiBub24tTlVMTCkgdG8gcG9pbnQgdG8gYmV5b25kIHRoZQorICAgc3RyaW5nIHJlY29nbml6ZWQgYW5kIGNvbnN1bWVkIGJ5IHRoaXMgcm91dGluZS4KKworICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIHN5bWJvbCBmb3IgdGhlIGJhc2UgY2xhc3Mgb3IKKyAgIHZhcmlhYmxlIGlmIGZvdW5kLCBvciBOVUxMIGlmIG5vdCBmb3VuZC4gIENhbGxlcnMgbXVzdCBjaGVjayB0aGlzCisgICBmaXJzdCAtLSBpZiBOVUxMLCB0aGUgb3V0cHV0cyBtYXkgbm90IGJlIGNvcnJlY3QuIAorCisgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYy1leHAueS4gIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgdG8gZ2V0CisgICBhcm91bmQgSFAgYUNDIChhbmQgcG9zc2libHkgb3RoZXIgY29tcGlsZXJzKSwgd2hpY2ggaW5zaXN0cyBvbgorICAgZ2VuZXJhdGluZyBuYW1lcyB3aXRoIGVtYmVkZGVkIGNvbG9ucyBmb3IgbmFtZXNwYWNlIG9yIG5lc3RlZCBjbGFzcworICAgbWVtYmVycy4KKworICAgKEFyZ3VtZW50IExFTiBpcyBjdXJyZW50bHkgdW51c2VkLiAxOTk3LTA4LTI3KQorCisgICBDYWxsZXJzIG11c3QgZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgb3V0cHV0IHN0cmluZyBUT0tFTi4gICovCisKK3N0YXRpYyBjb25zdCBjaGFyIGNvbG9uY29sb25bMl0gPSB7JzonLCc6J307CisKK3N0cnVjdCBzeW1ib2wgKgorcGFyc2VfbmVzdGVkX2NsYXNzZXNfZm9yX2hwYWNjIChuYW1lLCBsZW4sIHRva2VuLCBjbGFzc19wcmVmaXgsIGFyZ3B0cikKKyAgY2hhciAqIG5hbWU7CisgIGludCBsZW47CisgIGNoYXIgKiogdG9rZW47CisgIGludCAqIGNsYXNzX3ByZWZpeDsKKyAgY2hhciAqKiBhcmdwdHI7Cit7CisgICAvKiBDb21tZW50IGJlbG93IGNvbWVzIGZyb20gZGVjb2RlX2xpbmVfMSB3aGljaCBoYXMgdmVyeSBzaW1pbGFyCisgICAgICBjb2RlLCB3aGljaCBpcyBjYWxsZWQgZm9yICJicmVhayIgY29tbWFuZCBwYXJzaW5nLiAqLworICAKKyAgIC8qIFdlIGhhdmUgd2hhdCBsb29rcyBsaWtlIGEgY2xhc3Mgb3IgbmFtZXNwYWNlCisgICAgIHNjb3BlIHNwZWNpZmljYXRpb24gKEE6OkIpLCBwb3NzaWJseSB3aXRoIG1hbnkKKyAgICAgbGV2ZWxzIG9mIG5hbWVzcGFjZXMgb3IgY2xhc3NlcyAoQTo6Qjo6Qzo6RCkuCisKKyAgICAgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFAgQU5TSSBDKysgY29tcGlsZXIgKGFzIGFsc28gcG9zc2libHkKKyAgICAgb3RoZXIgY29tcGlsZXJzKSBnZW5lcmF0ZSBjbGFzcy9mdW5jdGlvbi9tZW1iZXIgbmFtZXMgd2l0aAorICAgICBlbWJlZGRlZCBkb3VibGUtY29sb25zIGlmIHRoZXkgYXJlIGluc2lkZSBuYW1lc3BhY2VzLiBUbworICAgICBoYW5kbGUgdGhpcywgd2UgbG9vcCBhIGZldyB0aW1lcywgY29uc2lkZXJpbmcgbGFyZ2VyIGFuZAorICAgICBsYXJnZXIgcHJlZml4ZXMgb2YgdGhlIHN0cmluZyBhcyB0aG91Z2ggdGhleSB3ZXJlIHNpbmdsZQorICAgICBzeW1ib2xzLiAgU28sIGlmIHRoZSBpbml0aWFsbHkgc3VwcGxpZWQgc3RyaW5nIGlzCisgICAgIEE6OkI6OkM6OkQ6OmZvbywgd2UgaGF2ZSB0byBsb29rIHVwICJBIiwgdGhlbiAiQTo6QiIsCisgICAgIHRoZW4gIkE6OkI6OkMiLCB0aGVuICJBOjpCOjpDOjpEIiwgYW5kIGZpbmFsbHkKKyAgICAgIkE6OkI6OkM6OkQ6OmZvbyIgYXMgc2luZ2xlLCBtb25vbGl0aGljIHN5bWJvbHMsIGJlY2F1c2UKKyAgICAgQSwgQiwgQyBvciBEIG1heSBiZSBuYW1lc3BhY2VzLgorCisgICAgIE5vdGUgdGhhdCBuYW1lc3BhY2VzIGNhbiBuZXN0IG9ubHkgaW5zaWRlIG90aGVyCisgICAgIG5hbWVzcGFjZXMsIGFuZCBub3QgaW5zaWRlIGNsYXNzZXMuICBTbyB3ZSBuZWVkIG9ubHkKKyAgICAgY29uc2lkZXIgKnByZWZpeGVzKiBvZiB0aGUgc3RyaW5nOyB0aGVyZSBpcyBubyBuZWVkIHRvIGxvb2sgdXAKKyAgICAgIkI6OkMiIHNlcGFyYXRlbHkgYXMgYSBzeW1ib2wgaW4gdGhlIHByZXZpb3VzIGV4YW1wbGUuICovCisKKyAgcmVnaXN0ZXIgY2hhciAqIHA7CisgIGNoYXIgKiBzdGFydCwgKiBlbmQ7CisgIGNoYXIgKiBwcmVmaXggPSBOVUxMOworICBjaGFyICogdG1wOworICBzdHJ1Y3Qgc3ltYm9sICogc3ltX2NsYXNzID0gTlVMTDsKKyAgc3RydWN0IHN5bWJvbCAqIHN5bV92YXIgPSBOVUxMOworICBzdHJ1Y3QgdHlwZSAqIHQ7CisgIHJlZ2lzdGVyIGludCBpOworICBpbnQgY29sb25zX2ZvdW5kID0gMDsKKyAgaW50IHByZWZpeF9sZW4gPSAwOworICBpbnQgZG9uZSA9IDA7CisgIGNoYXIgKiBxOyAKKworICAvKiBDaGVjayBmb3IgSFAtY29tcGlsZWQgZXhlY3V0YWJsZSAtLSBpbiBvdGhlciBjYXNlcworICAgICByZXR1cm4gTlVMTCwgYW5kIGNhbGxlciBtdXN0IGRlZmF1bHQgdG8gc3RhbmRhcmQgR0RCCisgICAgIGJlaGF2aW91ci4gKi8KKworICBpZiAoIWhwX3NvbV9zb21fb2JqZWN0X3ByZXNlbnQpCisgICAgcmV0dXJuIChzdHJ1Y3Qgc3ltYm9sICopIE5VTEw7CisKKyAgcCA9IG5hbWU7CisKKyAgLyogU2tpcCBvdmVyIHdoaXRlc3BhY2UgYW5kIHBvc3NpYmxlIGdsb2JhbCAiOjoiICovIAorICB3aGlsZSAoKnAgJiYgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKSkgcCsrOworICBpZiAocFswXSA9PSAnOicgJiYgcFsxXSA9PSAnOicpCisgICAgcCArPSAyOworICB3aGlsZSAoKnAgJiYgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKSkgcCsrOworICAKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgLyogR2V0IHRvIHRoZSBlbmQgb2YgdGhlIG5leHQgbmFtZXNwYWNlIG9yIGNsYXNzIHNwZWMuICovCisgICAgICAvKiBJZiB3ZSdyZSBsb29raW5nIGF0IHNvbWUgbm9uLXRva2VuLCBmYWlsIGltbWVkaWF0ZWx5ICovCisgICAgICBzdGFydCA9IHA7CisgICAgICBpZiAoIShpc2FscGhhICgqcCkgfHwgKnAgPT0gJyQnIHx8ICpwID09ICdfJykpCisgICAgICAgIHJldHVybiAoc3RydWN0IHN5bWJvbCAqKSBOVUxMOworICAgICAgcCsrOworICAgICAgd2hpbGUgKCpwICYmIChpc2FsbnVtICgqcCkgfHwgKnAgPT0gJyQnIHx8ICpwID09ICdfJykpIHArKzsKKworICAgICAgaWYgKCpwID09ICc8JykgCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJZiB3ZSBoYXZlIHRoZSBzdGFydCBvZiBhIHRlbXBsYXRlIHNwZWNpZmljYXRpb24sCisgICAgICAgICAgICAgc2NhbiByaWdodCBhaGVhZCB0byBpdHMgZW5kICovIAorICAgICAgICAgIHEgPSBmaW5kX3RlbXBsYXRlX25hbWVfZW5kIChwKTsKKyAgICAgICAgICBpZiAocSkKKyAgICAgICAgICAgIHAgPSBxOworICAgICAgICB9CisgICAgICAgIAorICAgICAgZW5kID0gcDsKKworICAgICAgLyogU2tpcCBvdmVyICI6OiIgYW5kIHdoaXRlc3BhY2UgZm9yIG5leHQgdGltZSBhcm91bmQgKi8gCisgICAgICB3aGlsZSAoKnAgJiYgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKSkgcCsrOworICAgICAgaWYgKHBbMF0gPT0gJzonICYmIHBbMV0gPT0gJzonKQorICAgICAgICBwICs9IDI7CisgICAgICB3aGlsZSAoKnAgJiYgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKSkgcCsrOworCisgICAgICAvKiBEb25lIHdpdGggdG9rZW5zPyAqLyAKKyAgICAgIGlmICghKnAgfHwgIShpc2FscGhhICgqcCkgfHwgKnAgPT0gJyQnIHx8ICpwID09ICdfJykpCisgICAgICAgIGRvbmUgPSAxOworCisgICAgICB0bXAgPSAoY2hhciAqKSBhbGxvY2EgKHByZWZpeF9sZW4gKyBlbmQgLSBzdGFydCArIDMpOworICAgICAgaWYgKHByZWZpeCkKKyAgICAgICAgeworICAgICAgICAgIG1lbWNweSAodG1wLCBwcmVmaXgsIHByZWZpeF9sZW4pOworICAgICAgICAgIG1lbWNweSAodG1wICsgcHJlZml4X2xlbiwgY29sb25jb2xvbiwgMik7CisgICAgICAgICAgbWVtY3B5ICh0bXAgKyBwcmVmaXhfbGVuICsgMiwgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKyAgICAgICAgICB0bXBbcHJlZml4X2xlbiArIDIgKyBlbmQgLSBzdGFydF0gPSAnXDAwMCc7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIG1lbWNweSAodG1wLCBzdGFydCwgZW5kIC0gc3RhcnQpOworICAgICAgICAgIHRtcFtlbmQgLSBzdGFydF0gPSAnXDAwMCc7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgcHJlZml4ID0gdG1wOworICAgICAgcHJlZml4X2xlbiA9IHN0cmxlbiAocHJlZml4KTsKKyAgICAgIAorI2lmIDAgLyogREVCVUdHSU5HICovIAorICAgICAgcHJpbnRmICgiU2VhcmNoaW5nIGZvciBuZXN0ZWQgY2xhc3Mgc3BlYzogUHJlZml4IGlzICVzXG4iLCBwcmVmaXgpOworI2VuZGlmICAgICAgCisKKyAgICAgIC8qIFNlZSBpZiB0aGUgcHJlZml4IHdlIGhhdmUgbm93IGlzIHNvbWV0aGluZyB3ZSBrbm93IGFib3V0ICovCisKKyAgICAgIGlmICghZG9uZSkgCisgICAgICAgIHsKKyAgICAgICAgICAvKiBNb3JlIHRva2VucyB0byBwcm9jZXNzLCBzbyB0aGlzIG11c3QgYmUgYSBjbGFzcy9uYW1lc3BhY2UgKi8KKyAgICAgICAgICBzeW1fY2xhc3MgPSBsb29rdXBfc3ltYm9sIChwcmVmaXgsIDAsIFNUUlVDVF9OQU1FU1BBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBObyBtb3JlIHRva2Vucywgc28gdHJ5IGFzIGEgdmFyaWFibGUgZmlyc3QgKi8gCisgICAgICAgICAgc3ltX3ZhciA9IGxvb2t1cF9zeW1ib2wgKHByZWZpeCwgMCwgVkFSX05BTUVTUEFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCk7CisgICAgICAgICAgLyogSWYgZmFpbGVkLCB0cnkgYXMgY2xhc3MvbmFtZXNwYWNlICovIAorICAgICAgICAgIGlmICghc3ltX3ZhcikKKyAgICAgICAgICAgIHN5bV9jbGFzcyA9IGxvb2t1cF9zeW1ib2wgKHByZWZpeCwgMCwgU1RSVUNUX05BTUVTUEFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIChzdHJ1Y3Qgc3ltdGFiICoqKSBOVUxMKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoc3ltX3ZhciB8fAorICAgICAgICAgIChzeW1fY2xhc3MgJiYKKyAgICAgICAgICAgKHQgPSBjaGVja190eXBlZGVmIChTWU1CT0xfVFlQRSAoc3ltX2NsYXNzKSksCisgICAgICAgICAgICAoVFlQRV9DT0RFICh0KSA9PSBUWVBFX0NPREVfU1RSVUNUCisgICAgICAgICAgICAgfHwgVFlQRV9DT0RFICh0KSA9PSBUWVBFX0NPREVfVU5JT04pKSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBXZSBmb3VuZCBhIHZhbGlkIHRva2VuICovCisgICAgICAgICAgKnRva2VuID0gKGNoYXIgKikgeG1hbGxvYyAocHJlZml4X2xlbiArIDEgKTsKKyAgICAgICAgICBtZW1jcHkgKCp0b2tlbiwgcHJlZml4LCBwcmVmaXhfbGVuKTsKKyAgICAgICAgICAoKnRva2VuKVtwcmVmaXhfbGVuXSA9ICdcMDAwJzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAvKiBObyB2YXJpYWJsZSBvciBjbGFzcy9uYW1lc3BhY2UgZm91bmQsIG5vIG1vcmUgdG9rZW5zICovIAorICAgICAgaWYgKGRvbmUpCisgICAgICAgIHJldHVybiAoc3RydWN0IHN5bWJvbCAqKSBOVUxMOworICAgIH0KKworICAvKiBPdXQgb2YgbG9vcCwgc28gd2UgbXVzdCBoYXZlIGZvdW5kIGEgdmFsaWQgdG9rZW4gKi8KKyAgaWYgKHN5bV92YXIpCisgICAgKmNsYXNzX3ByZWZpeCA9IDA7CisgIGVsc2UKKyAgICAqY2xhc3NfcHJlZml4ID0gMTsKKworICBpZiAoYXJncHRyKQorICAgICphcmdwdHIgPSBkb25lID8gcCA6IGVuZDsKKworI2lmIDAgLyogREVCVUdHSU5HICovIAorICBwcmludGYgKCJTZWFyY2hpbmcgZm9yIG5lc3RlZCBjbGFzcyBzcGVjOiBUb2tlbiBpcyAlcywgY2xhc3NfcHJlZml4ICVkXG4iLCAqdG9rZW4sICpjbGFzc19wcmVmaXgpOworI2VuZGlmCisKKyAgcmV0dXJuIHN5bV92YXIgPyBzeW1fdmFyIDogc3ltX2NsYXNzOyAvKiBmb3VuZCAqLyAKK30KKworY2hhciAqCitmaW5kX3RlbXBsYXRlX25hbWVfZW5kIChwKQorICBjaGFyICogcDsKK3sKKyAgaW50IGRlcHRoID0gMTsKKyAgaW50IGp1c3Rfc2Vlbl9yaWdodCA9IDA7CisgIGludCBqdXN0X3NlZW5fY29sb24gPSAwOworICBpbnQganVzdF9zZWVuX3NwYWNlID0gMDsKKyAgCisgIGlmICghcCB8fCAoKnAgIT0gJzwnKSkKKyAgICByZXR1cm4gMDsKKworICB3aGlsZSAoKisrcCkKKyAgICB7CisgICAgICBzd2l0Y2ggKCpwKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSAnXCcnOiBjYXNlICdcIic6CisgICAgICAgICAgY2FzZSAneyc6IGNhc2UgJ30nOgorICAgICAgICAgICAgLyogSW4gZnV0dXJlLCBtYXkgd2FudCB0byBhbGxvdyB0aGVzZT8/ICovIAorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgICBkZXB0aCsrOyAgICAgICAgICAgICAgICAvKiBzdGFydCBuZXN0ZWQgdGVtcGxhdGUgKi8gCisgICAgICAgICAgICBpZiAoanVzdF9zZWVuX2NvbG9uIHx8IGp1c3Rfc2Vlbl9yaWdodCB8fCBqdXN0X3NlZW5fc3BhY2UpICAgIAorICAgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgLyogYnV0IG5vdCBhZnRlciA6IG9yIDo6IG9yID4gb3Igc3BhY2UgKi8gCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICc+JzogCisgICAgICAgICAgICBpZiAoanVzdF9zZWVuX2NvbG9uIHx8IGp1c3Rfc2Vlbl9yaWdodCkKKyAgICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgIC8qIGVuZCBhIChuZXN0ZWQ/KSB0ZW1wbGF0ZSAqLworICAgICAgICAgICAganVzdF9zZWVuX3JpZ2h0ID0gMTsgICAgLyogYnV0IG5vdCBhZnRlciA6IG9yIDo6ICovIAorICAgICAgICAgICAgaWYgKC0tZGVwdGggPT0gMCkgICAgICAgLyogYWxzbyBkaXNhbGxvdyA+PiwgaW5zaXN0IG9uID4gPiAqLyAKKyAgICAgICAgICAgICAgcmV0dXJuICsrcDsgICAgICAgICAgIC8qIGlmIG91dGVybW9zdCBlbmRlZCwgcmV0dXJuICovIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAnOic6CisgICAgICAgICAgICBpZiAoanVzdF9zZWVuX3NwYWNlIHx8IChqdXN0X3NlZW5fY29sb24gPiAxKSkKKyAgICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgIC8qIG5lc3RlZCBjbGFzcyBzcGVjIGNvbWluZyB1cCAqLyAKKyAgICAgICAgICAgIGp1c3Rfc2Vlbl9jb2xvbisrOyAgICAgIC8qIHdlIGFsbG93IDo6IGJ1dCBub3QgOjo6OiAqLyAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICghKCgqcCA+PSAnYScgJiYgKnAgPD0gJ3onKSB8fCAgIC8qIGFsbG93IHRva2VuIGNoYXJzICovIAorICAgICAgICAgICAgICAgICAgKCpwID49ICdBJyAmJiAqcCA8PSAnWicpIHx8CisgICAgICAgICAgICAgICAgICAoKnAgPj0gJzAnICYmICpwIDw9ICc5JykgfHwKKyAgICAgICAgICAgICAgICAgICgqcCA9PSAnXycpIHx8ICgqcCA9PSAnLCcpIHx8IC8qIGNvbW1hcyBmb3IgdGVtcGxhdGUgYXJncyAqLworICAgICAgICAgICAgICAgICAgKCpwID09ICcmJykgfHwgKCpwID09ICcqJykgfHwgLyogcG9pbnRlciBhbmQgcmVmIHR5cGVzICovCisgICAgICAgICAgICAgICAgICAoKnAgPT0gJygnKSB8fCAoKnAgPT0gJyknKSB8fCAvKiBmdW5jdGlvbiB0eXBlcyAqLyAKKyAgICAgICAgICAgICAgICAgICgqcCA9PSAnWycpIHx8ICgqcCA9PSAnXScpICkpIC8qIGFycmF5IHR5cGVzICovICAKKyAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIGlmICgqcCAhPSAnICcpCisgICAgICAgIGp1c3Rfc2Vlbl9zcGFjZSA9IDA7CisgICAgICBpZiAoKnAgIT0gJzonKQorICAgICAgICBqdXN0X3NlZW5fY29sb24gPSAwOworICAgICAgaWYgKCpwICE9ICc+JykKKyAgICAgICAganVzdF9zZWVuX3JpZ2h0ID0gMDsKKyAgICB9CisgIHJldHVybiAwOworfQorCisKKwwKKy8qIFJldHVybiBhIG51bGwtdGVybWluYXRlZCB0ZW1wb3JhcnkgY29weSBvZiB0aGUgbmFtZQorICAgb2YgYSBzdHJpbmcgdG9rZW4uICAqLworCitjaGFyICoKK2NvcHlfbmFtZSAodG9rZW4pCisgICAgIHN0cnVjdCBzdG9rZW4gdG9rZW47Cit7CisgIG1lbWNweSAobmFtZWNvcHksIHRva2VuLnB0ciwgdG9rZW4ubGVuZ3RoKTsKKyAgbmFtZWNvcHlbdG9rZW4ubGVuZ3RoXSA9IDA7CisgIHJldHVybiBuYW1lY29weTsKK30KKwwKKy8qIFJldmVyc2UgYW4gZXhwcmVzc2lvbiBmcm9tIHN1ZmZpeCBmb3JtIChpbiB3aGljaCBpdCBpcyBjb25zdHJ1Y3RlZCkKKyAgIHRvIHByZWZpeCBmb3JtIChpbiB3aGljaCB3ZSBjYW4gY29udmVuaWVudGx5IHByaW50IG9yIGV4ZWN1dGUgaXQpLiAgKi8KKworc3RhdGljIHZvaWQKK3ByZWZpeGlmeV9leHByZXNzaW9uIChleHByKQorICAgICByZWdpc3RlciBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwcjsKK3sKKyAgcmVnaXN0ZXIgaW50IGxlbiA9CisgICAgc2l6ZW9mIChzdHJ1Y3QgZXhwcmVzc2lvbikgKyBFWFBfRUxFTV9UT19CWVRFUyAoZXhwci0+bmVsdHMpOworICByZWdpc3RlciBzdHJ1Y3QgZXhwcmVzc2lvbiAqdGVtcDsKKyAgcmVnaXN0ZXIgaW50IGlucG9zID0gZXhwci0+bmVsdHMsIG91dHBvcyA9IDA7CisKKyAgdGVtcCA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSBhbGxvY2EgKGxlbik7CisKKyAgLyogQ29weSB0aGUgb3JpZ2luYWwgZXhwcmVzc2lvbiBpbnRvIHRlbXAuICAqLworICBtZW1jcHkgKHRlbXAsIGV4cHIsIGxlbik7CisKKyAgcHJlZml4aWZ5X3N1YmV4cCAodGVtcCwgZXhwciwgaW5wb3MsIG91dHBvcyk7Cit9CisKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGV4cF9lbGVtZW50cyBpbiB0aGUgc3ViZXhwcmVzc2lvbiBvZiBFWFBSCisgICB3aG9zZSBsYXN0IGV4cF9lbGVtZW50IGlzIGF0IGluZGV4IEVORFBPUyAtIDEgaW4gRVhQUi4gICovCisKK2ludAorbGVuZ3RoX29mX3N1YmV4cCAoZXhwciwgZW5kcG9zKQorICAgICByZWdpc3RlciBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwcjsKKyAgICAgcmVnaXN0ZXIgaW50IGVuZHBvczsKK3sKKyAgcmVnaXN0ZXIgaW50IG9wbGVuID0gMTsKKyAgcmVnaXN0ZXIgaW50IGFyZ3MgPSAwOworICByZWdpc3RlciBpbnQgaTsKKworICBpZiAoZW5kcG9zIDwgMSkKKyAgICBlcnJvciAoIj9lcnJvciBpbiBsZW5ndGhfb2Zfc3ViZXhwIik7CisKKyAgaSA9IChpbnQpIGV4cHItPmVsdHNbZW5kcG9zIC0gMV0ub3Bjb2RlOworCisgIHN3aXRjaCAoaSkKKyAgICB7CisgICAgICAvKiBDKysgICovCisgICAgY2FzZSBPUF9TQ09QRToKKyAgICAgIG9wbGVuID0gbG9uZ2VzdF90b19pbnQgKGV4cHItPmVsdHNbZW5kcG9zIC0gMl0ubG9uZ2NvbnN0KTsKKyAgICAgIG9wbGVuID0gNSArIEJZVEVTX1RPX0VYUF9FTEVNIChvcGxlbiArIDEpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QX0xPTkc6CisgICAgY2FzZSBPUF9ET1VCTEU6CisgICAgY2FzZSBPUF9WQVJfVkFMVUU6CisgICAgICBvcGxlbiA9IDQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BfVFlQRToKKyAgICBjYXNlIE9QX0JPT0w6CisgICAgY2FzZSBPUF9MQVNUOgorICAgIGNhc2UgT1BfUkVHSVNURVI6CisgICAgY2FzZSBPUF9JTlRFUk5BTFZBUjoKKyAgICAgIG9wbGVuID0gMzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUF9DT01QTEVYOgorICAgICAgb3BsZW4gPSAxOyAKKyAgICAgIGFyZ3MgPSAyOworICAgICAgYnJlYWs7IAorCisgICAgY2FzZSBPUF9GVU5DQUxMOgorICAgIGNhc2UgT1BfRjc3X1VOREVURVJNSU5FRF9BUkdMSVNUOgorICAgICAgb3BsZW4gPSAzOworICAgICAgYXJncyA9IDEgKyBsb25nZXN0X3RvX2ludCAoZXhwci0+ZWx0c1tlbmRwb3MgLSAyXS5sb25nY29uc3QpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFVOT1BfTUFYOgorICAgIGNhc2UgVU5PUF9NSU46CisgICAgICBvcGxlbiA9IDM7CisgICAgICBicmVhazsKKworICAgY2FzZSBCSU5PUF9WQUw6CisgICBjYXNlIFVOT1BfQ0FTVDoKKyAgIGNhc2UgVU5PUF9NRU1WQUw6CisgICAgICBvcGxlbiA9IDM7CisgICAgICBhcmdzID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBVTk9QX0FCUzoKKyAgICBjYXNlIFVOT1BfQ0FQOgorICAgIGNhc2UgVU5PUF9DSFI6CisgICAgY2FzZSBVTk9QX0ZMT0FUOgorICAgIGNhc2UgVU5PUF9ISUdIOgorICAgIGNhc2UgVU5PUF9PREQ6CisgICAgY2FzZSBVTk9QX09SRDoKKyAgICBjYXNlIFVOT1BfVFJVTkM6CisgICAgICBvcGxlbiA9IDE7CisgICAgICBhcmdzID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUF9MQUJFTEVEOgorICAgIGNhc2UgU1RSVUNUT1BfU1RSVUNUOgorICAgIGNhc2UgU1RSVUNUT1BfUFRSOgorICAgICAgYXJncyA9IDE7CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIE9QX00yX1NUUklORzoKKyAgICBjYXNlIE9QX1NUUklORzoKKyAgICBjYXNlIE9QX05BTUU6CisgICAgY2FzZSBPUF9FWFBSU1RSSU5HOgorICAgICAgb3BsZW4gPSBsb25nZXN0X3RvX2ludCAoZXhwci0+ZWx0c1tlbmRwb3MgLSAyXS5sb25nY29uc3QpOworICAgICAgb3BsZW4gPSA0ICsgQllURVNfVE9fRVhQX0VMRU0gKG9wbGVuICsgMSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BfQklUU1RSSU5HOgorICAgICAgb3BsZW4gPSBsb25nZXN0X3RvX2ludCAoZXhwci0+ZWx0c1tlbmRwb3MgLSAyXS5sb25nY29uc3QpOworICAgICAgb3BsZW4gPSAob3BsZW4gKyBIT1NUX0NIQVJfQklUIC0gMSkgLyBIT1NUX0NIQVJfQklUOworICAgICAgb3BsZW4gPSA0ICsgQllURVNfVE9fRVhQX0VMRU0gKG9wbGVuKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUF9BUlJBWToKKyAgICAgIG9wbGVuID0gNDsKKyAgICAgIGFyZ3MgPSBsb25nZXN0X3RvX2ludCAoZXhwci0+ZWx0c1tlbmRwb3MgLSAyXS5sb25nY29uc3QpOworICAgICAgYXJncyAtPSBsb25nZXN0X3RvX2ludCAoZXhwci0+ZWx0c1tlbmRwb3MgLSAzXS5sb25nY29uc3QpOworICAgICAgYXJncyArPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRFUk5PUF9DT05EOgorICAgIGNhc2UgVEVSTk9QX1NMSUNFOgorICAgIGNhc2UgVEVSTk9QX1NMSUNFX0NPVU5UOgorICAgICAgYXJncyA9IDM7CisgICAgICBicmVhazsKKworICAgICAgLyogTW9kdWxhLTIgKi8KKyAgIGNhc2UgTVVMVElfU1VCU0NSSVBUOgorICAgICAgb3BsZW4gPSAzOworICAgICAgYXJncyA9IDEgKyBsb25nZXN0X3RvX2ludCAoZXhwci0+ZWx0c1tlbmRwb3MtIDJdLmxvbmdjb25zdCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgQklOT1BfQVNTSUdOX01PRElGWToKKyAgICAgIG9wbGVuID0gMzsKKyAgICAgIGFyZ3MgPSAyOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEMrKyAqLworICAgIGNhc2UgT1BfVEhJUzoKKyAgICAgIG9wbGVuID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFyZ3MgPSAxICsgKGkgPCAoaW50KSBCSU5PUF9FTkQpOworICAgIH0KKworICB3aGlsZSAoYXJncyA+IDApCisgICAgeworICAgICAgb3BsZW4gKz0gbGVuZ3RoX29mX3N1YmV4cCAoZXhwciwgZW5kcG9zIC0gb3BsZW4pOworICAgICAgYXJncy0tOworICAgIH0KKworICByZXR1cm4gb3BsZW47Cit9CisKKy8qIENvcHkgdGhlIHN1YmV4cHJlc3Npb24gZW5kaW5nIGp1c3QgYmVmb3JlIGluZGV4IElORU5EIGluIElORVhQUgorICAgaW50byBPVVRFWFBSLCBzdGFydGluZyBhdCBpbmRleCBPVVRCRUcuCisgICBJbiB0aGUgcHJvY2VzcywgY29udmVydCBpdCBmcm9tIHN1ZmZpeCB0byBwcmVmaXggZm9ybS4gICovCisKK3N0YXRpYyB2b2lkCitwcmVmaXhpZnlfc3ViZXhwIChpbmV4cHIsIG91dGV4cHIsIGluZW5kLCBvdXRiZWcpCisgICAgIHJlZ2lzdGVyIHN0cnVjdCBleHByZXNzaW9uICppbmV4cHI7CisgICAgIHN0cnVjdCBleHByZXNzaW9uICpvdXRleHByOworICAgICByZWdpc3RlciBpbnQgaW5lbmQ7CisgICAgIGludCBvdXRiZWc7Cit7CisgIHJlZ2lzdGVyIGludCBvcGxlbiA9IDE7CisgIHJlZ2lzdGVyIGludCBhcmdzID0gMDsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIGludCAqYXJnbGVuczsKKyAgZW51bSBleHBfb3Bjb2RlIG9wY29kZTsKKworICAvKiBDb21wdXRlIGhvdyBsb25nIHRoZSBsYXN0IG9wZXJhdGlvbiBpcyAoaW4gT1BMRU4pLAorICAgICBhbmQgYWxzbyBob3cgbWFueSBwcmVjZWRpbmcgc3ViZXhwcmVzc2lvbnMgc2VydmUgYXMKKyAgICAgYXJndW1lbnRzIGZvciBpdCAoaW4gQVJHUykuICAqLworCisgIG9wY29kZSA9IGluZXhwci0+ZWx0c1tpbmVuZCAtIDFdLm9wY29kZTsKKyAgc3dpdGNoIChvcGNvZGUpCisgICAgeworICAgICAgLyogQysrICAqLworICAgIGNhc2UgT1BfU0NPUEU6CisgICAgICBvcGxlbiA9IGxvbmdlc3RfdG9faW50IChpbmV4cHItPmVsdHNbaW5lbmQgLSAyXS5sb25nY29uc3QpOworICAgICAgb3BsZW4gPSA1ICsgQllURVNfVE9fRVhQX0VMRU0gKG9wbGVuICsgMSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BfTE9ORzoKKyAgICBjYXNlIE9QX0RPVUJMRToKKyAgICBjYXNlIE9QX1ZBUl9WQUxVRToKKyAgICAgIG9wbGVuID0gNDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUF9UWVBFOgorICAgIGNhc2UgT1BfQk9PTDoKKyAgICBjYXNlIE9QX0xBU1Q6CisgICAgY2FzZSBPUF9SRUdJU1RFUjoKKyAgICBjYXNlIE9QX0lOVEVSTkFMVkFSOgorICAgICAgb3BsZW4gPSAzOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QX0NPTVBMRVg6CisgICAgICBvcGxlbiA9IDE7IAorICAgICAgYXJncyA9IDI7IAorICAgICAgYnJlYWs7IAorCisgICAgY2FzZSBPUF9GVU5DQUxMOgorICAgIGNhc2UgT1BfRjc3X1VOREVURVJNSU5FRF9BUkdMSVNUOgorICAgICAgb3BsZW4gPSAzOworICAgICAgYXJncyA9IDEgKyBsb25nZXN0X3RvX2ludCAoaW5leHByLT5lbHRzW2luZW5kIC0gMl0ubG9uZ2NvbnN0KTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBVTk9QX01JTjoKKyAgICBjYXNlIFVOT1BfTUFYOgorICAgICAgb3BsZW4gPSAzOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFVOT1BfQ0FTVDoKKyAgICBjYXNlIFVOT1BfTUVNVkFMOgorICAgICAgb3BsZW4gPSAzOworICAgICAgYXJncyA9IDE7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVU5PUF9BQlM6CisgICAgY2FzZSBVTk9QX0NBUDoKKyAgICBjYXNlIFVOT1BfQ0hSOgorICAgIGNhc2UgVU5PUF9GTE9BVDoKKyAgICBjYXNlIFVOT1BfSElHSDoKKyAgICBjYXNlIFVOT1BfT0REOgorICAgIGNhc2UgVU5PUF9PUkQ6CisgICAgY2FzZSBVTk9QX1RSVU5DOgorICAgICAgb3BsZW49MTsKKyAgICAgIGFyZ3M9MTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTVFJVQ1RPUF9TVFJVQ1Q6CisgICAgY2FzZSBTVFJVQ1RPUF9QVFI6CisgICAgY2FzZSBPUF9MQUJFTEVEOgorICAgICAgYXJncyA9IDE7CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIE9QX00yX1NUUklORzoKKyAgICBjYXNlIE9QX1NUUklORzoKKyAgICBjYXNlIE9QX05BTUU6CisgICAgY2FzZSBPUF9FWFBSU1RSSU5HOgorICAgICAgb3BsZW4gPSBsb25nZXN0X3RvX2ludCAoaW5leHByLT5lbHRzW2luZW5kIC0gMl0ubG9uZ2NvbnN0KTsKKyAgICAgIG9wbGVuID0gNCArIEJZVEVTX1RPX0VYUF9FTEVNIChvcGxlbiArIDEpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QX0JJVFNUUklORzoKKyAgICAgIG9wbGVuID0gbG9uZ2VzdF90b19pbnQgKGluZXhwci0+ZWx0c1tpbmVuZCAtIDJdLmxvbmdjb25zdCk7CisgICAgICBvcGxlbiA9IChvcGxlbiArIEhPU1RfQ0hBUl9CSVQgLSAxKSAvIEhPU1RfQ0hBUl9CSVQ7CisgICAgICBvcGxlbiA9IDQgKyBCWVRFU19UT19FWFBfRUxFTSAob3BsZW4pOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QX0FSUkFZOgorICAgICAgb3BsZW4gPSA0OworICAgICAgYXJncyA9IGxvbmdlc3RfdG9faW50IChpbmV4cHItPmVsdHNbaW5lbmQgLSAyXS5sb25nY29uc3QpOworICAgICAgYXJncyAtPSBsb25nZXN0X3RvX2ludCAoaW5leHByLT5lbHRzW2luZW5kIC0gM10ubG9uZ2NvbnN0KTsKKyAgICAgIGFyZ3MgKz0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBURVJOT1BfQ09ORDoKKyAgICBjYXNlIFRFUk5PUF9TTElDRToKKyAgICBjYXNlIFRFUk5PUF9TTElDRV9DT1VOVDoKKyAgICAgIGFyZ3MgPSAzOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJJTk9QX0FTU0lHTl9NT0RJRlk6CisgICAgICBvcGxlbiA9IDM7CisgICAgICBhcmdzID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBNb2R1bGEtMiAqLworICAgY2FzZSBNVUxUSV9TVUJTQ1JJUFQ6CisgICAgICBvcGxlbiA9IDM7CisgICAgICBhcmdzID0gMSArIGxvbmdlc3RfdG9faW50IChpbmV4cHItPmVsdHNbaW5lbmQgLSAyXS5sb25nY29uc3QpOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEMrKyAqLworICAgIGNhc2UgT1BfVEhJUzoKKyAgICAgIG9wbGVuID0gMjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGFyZ3MgPSAxICsgKChpbnQpIG9wY29kZSA8IChpbnQpIEJJTk9QX0VORCk7CisgICAgfQorCisgIC8qIENvcHkgdGhlIGZpbmFsIG9wZXJhdG9yIGl0c2VsZiwgZnJvbSB0aGUgZW5kIG9mIHRoZSBpbnB1dAorICAgICB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQuICAqLworICBpbmVuZCAtPSBvcGxlbjsKKyAgbWVtY3B5ICgmb3V0ZXhwci0+ZWx0c1tvdXRiZWddLCAmaW5leHByLT5lbHRzW2luZW5kXSwKKwkgIEVYUF9FTEVNX1RPX0JZVEVTIChvcGxlbikpOworICBvdXRiZWcgKz0gb3BsZW47CisKKyAgLyogRmluZCB0aGUgbGVuZ3RocyBvZiB0aGUgYXJnIHN1YmV4cHJlc3Npb25zLiAgKi8KKyAgYXJnbGVucyA9IChpbnQgKikgYWxsb2NhIChhcmdzICogc2l6ZW9mIChpbnQpKTsKKyAgZm9yIChpID0gYXJncyAtIDE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIG9wbGVuID0gbGVuZ3RoX29mX3N1YmV4cCAoaW5leHByLCBpbmVuZCk7CisgICAgICBhcmdsZW5zW2ldID0gb3BsZW47CisgICAgICBpbmVuZCAtPSBvcGxlbjsKKyAgICB9CisKKyAgLyogTm93IGNvcHkgZWFjaCBzdWJleHByZXNzaW9uLCBwcmVzZXJ2aW5nIHRoZSBvcmRlciBvZgorICAgICB0aGUgc3ViZXhwcmVzc2lvbnMsIGJ1dCBwcmVmaXhpZnlpbmcgZWFjaCBvbmUuCisgICAgIEluIHRoaXMgbG9vcCwgaW5lbmQgc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgICAgdGhlIGV4cHJlc3Npb24gdGhpcyBsZXZlbCBpcyB3b3JraW5nIG9uCisgICAgIGFuZCBtYXJjaGVzIGZvcndhcmQgb3ZlciB0aGUgYXJndW1lbnRzLgorICAgICBvdXRiZWcgZG9lcyBzaW1pbGFybHkgaW4gdGhlIG91dHB1dC4gICovCisgIGZvciAoaSA9IDA7IGkgPCBhcmdzOyBpKyspCisgICAgeworICAgICAgb3BsZW4gPSBhcmdsZW5zW2ldOworICAgICAgaW5lbmQgKz0gb3BsZW47CisgICAgICBwcmVmaXhpZnlfc3ViZXhwIChpbmV4cHIsIG91dGV4cHIsIGluZW5kLCBvdXRiZWcpOworICAgICAgb3V0YmVnICs9IG9wbGVuOworICAgIH0KK30KKwwKKy8qIFRoaXMgcGFnZSBjb250YWlucyB0aGUgdHdvIGVudHJ5IHBvaW50cyB0byB0aGlzIGZpbGUuICAqLworCisvKiBSZWFkIGFuIGV4cHJlc3Npb24gZnJvbSB0aGUgc3RyaW5nICpTVFJJTkdQVFIgcG9pbnRzIHRvLAorICAgcGFyc2UgaXQsIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGEgIHN0cnVjdCBleHByZXNzaW9uICB0aGF0IHdlIG1hbGxvYy4KKyAgIFVzZSBibG9jayBCTE9DSyBhcyB0aGUgbGV4aWNhbCBjb250ZXh0IGZvciB2YXJpYWJsZSBuYW1lczsKKyAgIGlmIEJMT0NLIGlzIHplcm8sIHVzZSB0aGUgYmxvY2sgb2YgdGhlIHNlbGVjdGVkIHN0YWNrIGZyYW1lLgorICAgTWVhbndoaWxlLCBhZHZhbmNlICpTVFJJTkdQVFIgdG8gcG9pbnQgYWZ0ZXIgdGhlIGV4cHJlc3Npb24sCisgICBhdCB0aGUgZmlyc3Qgbm9ud2hpdGUgY2hhcmFjdGVyIHRoYXQgaXMgbm90IHBhcnQgb2YgdGhlIGV4cHJlc3Npb24KKyAgIChwb3NzaWJseSBhIG51bGwgY2hhcmFjdGVyKS4KKworICAgSWYgQ09NTUEgaXMgbm9uemVybywgc3RvcCBpZiBhIGNvbW1hIGlzIHJlYWNoZWQuICAqLworCitzdHJ1Y3QgZXhwcmVzc2lvbiAqCitwYXJzZV9leHBfMSAoc3RyaW5ncHRyLCBibG9jaywgY29tbWEpCisgICAgIGNoYXIgKipzdHJpbmdwdHI7CisgICAgIHN0cnVjdCBibG9jayAqYmxvY2s7CisgICAgIGludCBjb21tYTsKK3sKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKworICBsZXhwdHIgPSAqc3RyaW5ncHRyOworCisgIHBhcmVuX2RlcHRoID0gMDsKKyAgdHlwZV9zdGFja19kZXB0aCA9IDA7CisKKyAgY29tbWFfdGVybWluYXRlcyA9IGNvbW1hOworCisgIGlmIChsZXhwdHIgPT0gMCB8fCAqbGV4cHRyID09IDApCisgICAgZXJyb3Jfbm9fYXJnICgiZXhwcmVzc2lvbiB0byBjb21wdXRlIik7CisKKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfZnVuY2FsbHMsIDApOworICBmdW5jYWxsX2NoYWluID0gMDsKKworICBleHByZXNzaW9uX2NvbnRleHRfYmxvY2sgPSBibG9jayA/IGJsb2NrIDogZ2V0X3NlbGVjdGVkX2Jsb2NrICgpOworCisgIG5hbWVjb3B5ID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGxleHB0cikgKyAxKTsKKyAgZXhwb3V0X3NpemUgPSAxMDsKKyAgZXhwb3V0X3B0ciA9IDA7CisgIGV4cG91dCA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKQorICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGV4cHJlc3Npb24pICsgRVhQX0VMRU1fVE9fQllURVMgKGV4cG91dF9zaXplKSk7CisgIGV4cG91dC0+bGFuZ3VhZ2VfZGVmbiA9IGN1cnJlbnRfbGFuZ3VhZ2U7CisgIG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlX2N1cnJlbnRfY29udGVudHMsICZleHBvdXQpOworCisgIGlmIChjdXJyZW50X2xhbmd1YWdlLT5sYV9wYXJzZXIgKCkpCisgICAgY3VycmVudF9sYW5ndWFnZS0+bGFfZXJyb3IgKE5VTEwpOworCisgIGRpc2NhcmRfY2xlYW51cHMgKG9sZF9jaGFpbik7CisKKyAgLyogUmVjb3JkIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGV4cHJlc3Npb24gZWxlbWVudHMsIGFuZCB0aGVuCisgICAgIHJlYWxsb2NhdGUgdGhlIGV4cHJlc3Npb24gbWVtb3J5IHNvIHRoYXQgd2UgZnJlZSB1cCBhbnkKKyAgICAgZXhjZXNzIGVsZW1lbnRzLiAqLworCisgIGV4cG91dC0+bmVsdHMgPSBleHBvdXRfcHRyOworICBleHBvdXQgPSAoc3RydWN0IGV4cHJlc3Npb24gKikKKyAgICB4cmVhbGxvYyAoKGNoYXIgKikgZXhwb3V0LAorCSAgICAgIHNpemVvZiAoc3RydWN0IGV4cHJlc3Npb24pICsgRVhQX0VMRU1fVE9fQllURVMgKGV4cG91dF9wdHIpKTs7CisKKyAgLyogQ29udmVydCBleHByZXNzaW9uIGZyb20gcG9zdGZpeCBmb3JtIGFzIGdlbmVyYXRlZCBieSB5YWNjCisgICAgIHBhcnNlciwgdG8gYSBwcmVmaXggZm9ybS4gKi8KKworI2lmZGVmIE1BSU5URU5BTkNFX0NNRFMKKyAgaWYgKGV4cHJlc3Npb25kZWJ1ZykKKyAgICBkdW1wX3ByZWZpeF9leHByZXNzaW9uIChleHBvdXQsIGdkYl9zdGRvdXQsCisJCQkgICAgImJlZm9yZSBjb252ZXJzaW9uIHRvIHByZWZpeCBmb3JtIik7CisjZW5kaWYgLyogTUFJTlRFTkFOQ0VfQ01EUyAqLworCisgIHByZWZpeGlmeV9leHByZXNzaW9uIChleHBvdXQpOworCisjaWZkZWYgTUFJTlRFTkFOQ0VfQ01EUworICBpZiAoZXhwcmVzc2lvbmRlYnVnKQorICAgIGR1bXBfcG9zdGZpeF9leHByZXNzaW9uIChleHBvdXQsIGdkYl9zdGRvdXQsCisJCQkgICAgICJhZnRlciBjb252ZXJzaW9uIHRvIHByZWZpeCBmb3JtIik7CisjZW5kaWYgLyogTUFJTlRFTkFOQ0VfQ01EUyAqLworCisgICpzdHJpbmdwdHIgPSBsZXhwdHI7CisgIHJldHVybiBleHBvdXQ7Cit9CisKKy8qIFBhcnNlIFNUUklORyBhcyBhbiBleHByZXNzaW9uLCBhbmQgY29tcGxhaW4gaWYgdGhpcyBmYWlscworICAgdG8gdXNlIHVwIGFsbCBvZiB0aGUgY29udGVudHMgb2YgU1RSSU5HLiAgKi8KKworc3RydWN0IGV4cHJlc3Npb24gKgorcGFyc2VfZXhwcmVzc2lvbiAoc3RyaW5nKQorICAgICBjaGFyICpzdHJpbmc7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBleHByZXNzaW9uICpleHA7CisgIGV4cCA9IHBhcnNlX2V4cF8xICgmc3RyaW5nLCAwLCAwKTsKKyAgaWYgKCpzdHJpbmcpCisgICAgZXJyb3IgKCJKdW5rIGFmdGVyIGVuZCBvZiBleHByZXNzaW9uLiIpOworICByZXR1cm4gZXhwOworfQorDAorLyogU3R1ZmYgZm9yIG1haW50YWluaW5nIGEgc3RhY2sgb2YgdHlwZXMuICBDdXJyZW50bHkganVzdCB1c2VkIGJ5IEMsIGJ1dAorICAgcHJvYmFibHkgdXNlZnVsIGZvciBhbnkgbGFuZ3VhZ2Ugd2hpY2ggZGVjbGFyZXMgaXRzIHR5cGVzICJiYWNrd2FyZHMiLiAgKi8KKwordm9pZCAKK3B1c2hfdHlwZSAodHApCisgICAgIGVudW0gdHlwZV9waWVjZXMgdHA7Cit7CisgIGlmICh0eXBlX3N0YWNrX2RlcHRoID09IHR5cGVfc3RhY2tfc2l6ZSkKKyAgICB7CisgICAgICB0eXBlX3N0YWNrX3NpemUgKj0gMjsKKyAgICAgIHR5cGVfc3RhY2sgPSAodW5pb24gdHlwZV9zdGFja19lbHQgKikKKwl4cmVhbGxvYyAoKGNoYXIgKikgdHlwZV9zdGFjaywgdHlwZV9zdGFja19zaXplICogc2l6ZW9mICgqdHlwZV9zdGFjaykpOworICAgIH0KKyAgdHlwZV9zdGFja1t0eXBlX3N0YWNrX2RlcHRoKytdLnBpZWNlID0gdHA7Cit9CisKK3ZvaWQKK3B1c2hfdHlwZV9pbnQgKG4pCisgICAgIGludCBuOworeworICBpZiAodHlwZV9zdGFja19kZXB0aCA9PSB0eXBlX3N0YWNrX3NpemUpCisgICAgeworICAgICAgdHlwZV9zdGFja19zaXplICo9IDI7CisgICAgICB0eXBlX3N0YWNrID0gKHVuaW9uIHR5cGVfc3RhY2tfZWx0ICopCisJeHJlYWxsb2MgKChjaGFyICopIHR5cGVfc3RhY2ssIHR5cGVfc3RhY2tfc2l6ZSAqIHNpemVvZiAoKnR5cGVfc3RhY2spKTsKKyAgICB9CisgIHR5cGVfc3RhY2tbdHlwZV9zdGFja19kZXB0aCsrXS5pbnRfdmFsID0gbjsKK30KKworZW51bSB0eXBlX3BpZWNlcyAKK3BvcF90eXBlICgpCit7CisgIGlmICh0eXBlX3N0YWNrX2RlcHRoKQorICAgIHJldHVybiB0eXBlX3N0YWNrWy0tdHlwZV9zdGFja19kZXB0aF0ucGllY2U7CisgIHJldHVybiB0cF9lbmQ7Cit9CisKK2ludAorcG9wX3R5cGVfaW50ICgpCit7CisgIGlmICh0eXBlX3N0YWNrX2RlcHRoKQorICAgIHJldHVybiB0eXBlX3N0YWNrWy0tdHlwZV9zdGFja19kZXB0aF0uaW50X3ZhbDsKKyAgLyogIkNhbid0IGhhcHBlbiIuICAqLworICByZXR1cm4gMDsKK30KKworLyogUG9wIHRoZSB0eXBlIHN0YWNrIGFuZCByZXR1cm4gdGhlIHR5cGUgd2hpY2ggY29ycmVzcG9uZHMgdG8gRk9MTE9XX1RZUEUKKyAgIGFzIG1vZGlmaWVkIGJ5IGFsbCB0aGUgc3R1ZmYgb24gdGhlIHN0YWNrLiAgKi8KK3N0cnVjdCB0eXBlICoKK2ZvbGxvd190eXBlcyAoZm9sbG93X3R5cGUpCisgICAgIHN0cnVjdCB0eXBlICpmb2xsb3dfdHlwZTsKK3sKKyAgaW50IGRvbmUgPSAwOworICBpbnQgYXJyYXlfc2l6ZTsKKyAgc3RydWN0IHR5cGUgKnJhbmdlX3R5cGU7CisKKyAgd2hpbGUgKCFkb25lKQorICAgIHN3aXRjaCAocG9wX3R5cGUgKCkpCisgICAgICB7CisgICAgICBjYXNlIHRwX2VuZDoKKwlkb25lID0gMTsKKwlicmVhazsKKyAgICAgIGNhc2UgdHBfcG9pbnRlcjoKKwlmb2xsb3dfdHlwZSA9IGxvb2t1cF9wb2ludGVyX3R5cGUgKGZvbGxvd190eXBlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgdHBfcmVmZXJlbmNlOgorCWZvbGxvd190eXBlID0gbG9va3VwX3JlZmVyZW5jZV90eXBlIChmb2xsb3dfdHlwZSk7CisJYnJlYWs7CisgICAgICBjYXNlIHRwX2FycmF5OgorCWFycmF5X3NpemUgPSBwb3BfdHlwZV9pbnQgKCk7CisJLyogRklYTUUtdHlwZS1hbGxvY2F0aW9uOiBuZWVkIGEgd2F5IHRvIGZyZWUgdGhpcyB0eXBlIHdoZW4gd2UgYXJlCisJICAgZG9uZSB3aXRoIGl0LiAgKi8KKwlyYW5nZV90eXBlID0KKwkgIGNyZWF0ZV9yYW5nZV90eXBlICgoc3RydWN0IHR5cGUgKikgTlVMTCwKKwkJCSAgICAgYnVpbHRpbl90eXBlX2ludCwgMCwKKwkJCSAgICAgYXJyYXlfc2l6ZSA+PSAwID8gYXJyYXlfc2l6ZSAtIDEgOiAwKTsKKwlmb2xsb3dfdHlwZSA9CisJICBjcmVhdGVfYXJyYXlfdHlwZSAoKHN0cnVjdCB0eXBlICopIE5VTEwsCisJCQkgICAgIGZvbGxvd190eXBlLCByYW5nZV90eXBlKTsKKwlpZiAoYXJyYXlfc2l6ZSA8IDApCisJICBUWVBFX0FSUkFZX1VQUEVSX0JPVU5EX1RZUEUoZm9sbG93X3R5cGUpCisJICAgID0gQk9VTkRfQ0FOTk9UX0JFX0RFVEVSTUlORUQ7CisJYnJlYWs7CisgICAgICBjYXNlIHRwX2Z1bmN0aW9uOgorCS8qIEZJWE1FLXR5cGUtYWxsb2NhdGlvbjogbmVlZCBhIHdheSB0byBmcmVlIHRoaXMgdHlwZSB3aGVuIHdlIGFyZQorCSAgIGRvbmUgd2l0aCBpdC4gICovCisJZm9sbG93X3R5cGUgPSBsb29rdXBfZnVuY3Rpb25fdHlwZSAoZm9sbG93X3R5cGUpOworCWJyZWFrOworICAgICAgfQorICByZXR1cm4gZm9sbG93X3R5cGU7Cit9CisMCit2b2lkCitfaW5pdGlhbGl6ZV9wYXJzZSAoKQoreworICB0eXBlX3N0YWNrX3NpemUgPSA4MDsKKyAgdHlwZV9zdGFja19kZXB0aCA9IDA7CisgIHR5cGVfc3RhY2sgPSAodW5pb24gdHlwZV9zdGFja19lbHQgKikKKyAgICB4bWFsbG9jICh0eXBlX3N0YWNrX3NpemUgKiBzaXplb2YgKCp0eXBlX3N0YWNrKSk7CisKKyAgbXN5bV90ZXh0X3N5bWJvbF90eXBlID0KKyAgICBpbml0X3R5cGUgKFRZUEVfQ09ERV9GVU5DLCAxLCAwLCAiPHRleHQgdmFyaWFibGUsIG5vIGRlYnVnIGluZm8+IiwgTlVMTCk7CisgIFRZUEVfVEFSR0VUX1RZUEUgKG1zeW1fdGV4dF9zeW1ib2xfdHlwZSkgPSBidWlsdGluX3R5cGVfaW50OworICBtc3ltX2RhdGFfc3ltYm9sX3R5cGUgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgVEFSR0VUX0lOVF9CSVQgLyBIT1NUX0NIQVJfQklULCAwLAorCSAgICAgICAiPGRhdGEgdmFyaWFibGUsIG5vIGRlYnVnIGluZm8+IiwgTlVMTCk7CisgIG1zeW1fdW5rbm93bl9zeW1ib2xfdHlwZSA9CisgICAgaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCAxLCAwLAorCSAgICAgICAiPHZhcmlhYmxlIChub3QgdGV4dCBvciBkYXRhKSwgbm8gZGVidWcgaW5mbz4iLAorCSAgICAgICBOVUxMKTsKKworI2lmZGVmIE1BSU5URU5BTkNFX0NNRFMKKyAgYWRkX3Nob3dfZnJvbV9zZXQgKAorICAgICBhZGRfc2V0X2NtZCAoImV4cHJlc3Npb25kZWJ1ZyIsIGNsYXNzX21haW50ZW5hbmNlLCB2YXJfemludGVnZXIsCisJCSAgKGNoYXIgKikmZXhwcmVzc2lvbmRlYnVnLAorCQkgIlNldCBleHByZXNzaW9uIGRlYnVnZ2luZy5cblwKK1doZW4gbm9uLXplcm8sIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBleHByZXNzaW9ucyB3aWxsIGJlIHByaW50ZWQuIiwKKwkJICAmc2V0bGlzdCksCisgICAgICZzaG93bGlzdCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2dkYi9wYXJzZXItZGVmcy5oIGIvZ2RiL3BhcnNlci1kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyNmZkZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9wYXJzZXItZGVmcy5oCkBAIC0wLDAgKzEsMTk4IEBACisvKiBQYXJzZXIgZGVmaW5pdGlvbnMgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4OSwgMTk5MCwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIE1vZGlmaWVkIGZyb20gZXhwcmVhZC55IGJ5IHRoZSBEZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UgYXQgdGhlCisgICBTdGF0ZSBVbml2ZXJzaXR5IG9mIE5ldyBZb3JrIGF0IEJ1ZmZhbG8uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIChQQVJTRVJfREVGU19IKQorI2RlZmluZSBQQVJTRVJfREVGU19IIDEKKworc3RydWN0IHN0ZF9yZWdzIHsKKwljaGFyICpuYW1lOworCWludCByZWdudW07Cit9OworCitleHRlcm4gc3RydWN0IHN0ZF9yZWdzIHN0ZF9yZWdzW107CitleHRlcm4gdW5zaWduZWQgbnVtX3N0ZF9yZWdzOworCitleHRlcm4gc3RydWN0IGV4cHJlc3Npb24gKmV4cG91dDsKK2V4dGVybiBpbnQgZXhwb3V0X3NpemU7CitleHRlcm4gaW50IGV4cG91dF9wdHI7CisKKy8qIElmIHRoaXMgaXMgbm9uemVybywgdGhpcyBibG9jayBpcyB1c2VkIGFzIHRoZSBsZXhpY2FsIGNvbnRleHQKKyAgIGZvciBzeW1ib2wgbmFtZXMuICAqLworCitleHRlcm4gc3RydWN0IGJsb2NrICpleHByZXNzaW9uX2NvbnRleHRfYmxvY2s7CisKKy8qIFRoZSBpbm5lcm1vc3QgY29udGV4dCByZXF1aXJlZCBieSB0aGUgc3RhY2sgYW5kIHJlZ2lzdGVyIHZhcmlhYmxlcworICAgd2UndmUgZW5jb3VudGVyZWQgc28gZmFyLiAqLworZXh0ZXJuIHN0cnVjdCBibG9jayAqaW5uZXJtb3N0X2Jsb2NrOworCisvKiBUaGUgYmxvY2sgaW4gd2hpY2ggdGhlIG1vc3QgcmVjZW50bHkgZGlzY292ZXJlZCBzeW1ib2wgd2FzIGZvdW5kLgorICAgRklYTUU6IFNob3VsZCBiZSBkZWNsYXJlZCBhbG9uZyB3aXRoIGxvb2t1cF9zeW1ib2wgaW4gc3ltdGFiLmg7IGlzIG5vdAorICAgcmVsYXRlZCBzcGVjaWZpY2FsbHkgdG8gcGFyc2luZy4gICovCitleHRlcm4gc3RydWN0IGJsb2NrICpibG9ja19mb3VuZDsKKworLyogTnVtYmVyIG9mIGFyZ3VtZW50cyBzZWVuIHNvIGZhciBpbiBpbm5lcm1vc3QgZnVuY3Rpb24gY2FsbC4gICovCitleHRlcm4gaW50IGFyZ2xpc3RfbGVuOworCisvKiBBIHN0cmluZyB0b2tlbiwgZWl0aGVyIGEgY2hhci1zdHJpbmcgb3IgYml0LXN0cmluZy4gIENoYXItc3RyaW5ncyBhcmUKKyAgIHVzZWQsIGZvciBleGFtcGxlLCBmb3IgdGhlIG5hbWVzIG9mIHN5bWJvbHMuICovCisKK3N0cnVjdCBzdG9rZW4KKyAgeworICAgIC8qIFBvaW50ZXIgdG8gZmlyc3QgYnl0ZSBvZiBjaGFyLXN0cmluZyBvciBmaXJzdCBiaXQgb2YgYml0LXN0cmluZyAqLworICAgIGNoYXIgKnB0cjsKKyAgICAvKiBMZW5ndGggb2Ygc3RyaW5nIGluIGJ5dGVzIGZvciBjaGFyLXN0cmluZyBvciBiaXRzIGZvciBiaXQtc3RyaW5nICovCisgICAgaW50IGxlbmd0aDsKKyAgfTsKKworc3RydWN0IHR0eXBlCisgIHsKKyAgICBzdHJ1Y3Qgc3Rva2VuIHN0b2tlbjsKKyAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgfTsKKworc3RydWN0IHN5bXRva2VuCisgIHsKKyAgICBzdHJ1Y3Qgc3Rva2VuIHN0b2tlbjsKKyAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgICAgaW50IGlzX2FfZmllbGRfb2ZfdGhpczsKKyAgfTsKKworLyogRm9yIHBhcnNpbmcgb2YgY29tcGxpY2F0ZWQgdHlwZXMuCisgICBBbiBhcnJheSBzaG91bGQgYmUgcHJlY2VkZWQgaW4gdGhlIGxpc3QgYnkgdGhlIHNpemUgb2YgdGhlIGFycmF5LiAgKi8KK2VudW0gdHlwZV9waWVjZXMKKyAge3RwX2VuZCA9IC0xLCB0cF9wb2ludGVyLCB0cF9yZWZlcmVuY2UsIHRwX2FycmF5LCB0cF9mdW5jdGlvbn07CisvKiBUaGUgc3RhY2sgY2FuIGNvbnRhaW4gZWl0aGVyIGFuIGVudW0gdHlwZV9waWVjZXMgb3IgYW4gaW50LiAgKi8KK3VuaW9uIHR5cGVfc3RhY2tfZWx0IHsKKyAgZW51bSB0eXBlX3BpZWNlcyBwaWVjZTsKKyAgaW50IGludF92YWw7Cit9OworZXh0ZXJuIHVuaW9uIHR5cGVfc3RhY2tfZWx0ICp0eXBlX3N0YWNrOworZXh0ZXJuIGludCB0eXBlX3N0YWNrX2RlcHRoLCB0eXBlX3N0YWNrX3NpemU7CisKK2V4dGVybiB2b2lkIHdyaXRlX2V4cF9lbHQgUEFSQU1TICgodW5pb24gZXhwX2VsZW1lbnQpKTsKKworZXh0ZXJuIHZvaWQgd3JpdGVfZXhwX2VsdF9vcGNvZGUgUEFSQU1TICgoZW51bSBleHBfb3Bjb2RlKSk7CisKK2V4dGVybiB2b2lkIHdyaXRlX2V4cF9lbHRfc3ltIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOworCitleHRlcm4gdm9pZCB3cml0ZV9leHBfZWx0X2xvbmdjc3QgUEFSQU1TICgoTE9OR0VTVCkpOworCitleHRlcm4gdm9pZCB3cml0ZV9leHBfZWx0X2RibGNzdCBQQVJBTVMgKChET1VCTEVTVCkpOworCitleHRlcm4gdm9pZCB3cml0ZV9leHBfZWx0X3R5cGUgUEFSQU1TICgoc3RydWN0IHR5cGUgKikpOworCitleHRlcm4gdm9pZCB3cml0ZV9leHBfZWx0X2ludGVybiBQQVJBTVMgKChzdHJ1Y3QgaW50ZXJuYWx2YXIgKikpOworCitleHRlcm4gdm9pZCB3cml0ZV9leHBfc3RyaW5nIFBBUkFNUyAoKHN0cnVjdCBzdG9rZW4pKTsKKworZXh0ZXJuIHZvaWQgd3JpdGVfZXhwX2JpdHN0cmluZyBQQVJBTVMgKChzdHJ1Y3Qgc3Rva2VuKSk7CisKK2V4dGVybiB2b2lkIHdyaXRlX2V4cF9lbHRfYmxvY2sgUEFSQU1TICgoc3RydWN0IGJsb2NrICopKTsKKworZXh0ZXJuIHZvaWQgd3JpdGVfZXhwX21zeW1ib2wgUEFSQU1TICgoc3RydWN0IG1pbmltYWxfc3ltYm9sICosCisJCQkJICAgICAgIHN0cnVjdCB0eXBlICosIHN0cnVjdCB0eXBlICopKTsKKworZXh0ZXJuIHZvaWQgd3JpdGVfZG9sbGFyX3ZhcmlhYmxlIFBBUkFNUyAoKHN0cnVjdCBzdG9rZW4gc3RyKSk7CisKK2V4dGVybiBzdHJ1Y3Qgc3ltYm9sICogcGFyc2VfbmVzdGVkX2NsYXNzZXNfZm9yX2hwYWNjIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBjaGFyICoqLCBpbnQgKiwgY2hhciAqKikpOworCitleHRlcm4gY2hhciAqIGZpbmRfdGVtcGxhdGVfbmFtZV9lbmQgUEFSQU1TICgoY2hhciAqKSk7CisKK2V4dGVybiB2b2lkCitzdGFydF9hcmdsaXN0IFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIGludAorZW5kX2FyZ2xpc3QgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gY2hhciAqCitjb3B5X25hbWUgUEFSQU1TICgoc3RydWN0IHN0b2tlbikpOworCitleHRlcm4gdm9pZCAKK3B1c2hfdHlwZSBQQVJBTVMgKChlbnVtIHR5cGVfcGllY2VzKSk7CisKK2V4dGVybiB2b2lkCitwdXNoX3R5cGVfaW50IFBBUkFNUyAoKGludCkpOworCitleHRlcm4gZW51bSB0eXBlX3BpZWNlcyAKK3BvcF90eXBlIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIGludAorcG9wX3R5cGVfaW50IFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIGludAorbGVuZ3RoX29mX3N1YmV4cCBQQVJBTVMgKChzdHJ1Y3QgZXhwcmVzc2lvbiAqLCBpbnQpKTsKKworZXh0ZXJuIHN0cnVjdCB0eXBlICpmb2xsb3dfdHlwZXMgUEFSQU1TICgoc3RydWN0IHR5cGUgKikpOworCisvKiBEdXJpbmcgcGFyc2luZyBvZiBhIEMgZXhwcmVzc2lvbiwgdGhlIHBvaW50ZXIgdG8gdGhlIG5leHQgY2hhcmFjdGVyCisgICBpcyBpbiB0aGlzIHZhcmlhYmxlLiAgKi8KKworZXh0ZXJuIGNoYXIgKmxleHB0cjsKKworLyogVG9rZW5zIHRoYXQgcmVmZXIgdG8gbmFtZXMgZG8gc28gd2l0aCBleHBsaWNpdCBwb2ludGVyIGFuZCBsZW5ndGgsCisgICBzbyB0aGV5IGNhbiBzaGFyZSB0aGUgc3RvcmFnZSB0aGF0IGxleHB0ciBpcyBwYXJzaW5nLgorCisgICBXaGVuIGl0IGlzIG5lY2Vzc2FyeSB0byBwYXNzIGEgbmFtZSB0byBhIGZ1bmN0aW9uIHRoYXQgZXhwZWN0cworICAgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLCB0aGUgc3Vic3RyaW5nIGlzIGNvcGllZCBvdXQKKyAgIGludG8gYSBibG9jayBvZiBzdG9yYWdlIHRoYXQgbmFtZWNvcHkgcG9pbnRzIHRvLgorCisgICBuYW1lY29weSBpcyBhbGxvY2F0ZWQgb25jZSwgZ3VhcmFudGVlZCBiaWcgZW5vdWdoLCBmb3IgZWFjaCBwYXJzaW5nLiAgKi8KKworZXh0ZXJuIGNoYXIgKm5hbWVjb3B5OworCisvKiBDdXJyZW50IGRlcHRoIGluIHBhcmVudGhlc2VzIHdpdGhpbiB0aGUgZXhwcmVzc2lvbi4gICovCisKK2V4dGVybiBpbnQgcGFyZW5fZGVwdGg7CisKKy8qIE5vbnplcm8gbWVhbnMgc3RvcCBwYXJzaW5nIG9uIGZpcnN0IGNvbW1hIChpZiBub3Qgd2l0aGluIHBhcmVudGhlc2VzKS4gICovCisKK2V4dGVybiBpbnQgY29tbWFfdGVybWluYXRlczsKKwwKKy8qIFRoZXNlIGNvZGVzIGluZGljYXRlIG9wZXJhdG9yIHByZWNlZGVuY2VzIGZvciBleHByZXNzaW9uIHByaW50aW5nLAorICAgbGVhc3QgdGlnaHRseSBiaW5kaW5nIGZpcnN0LiAgKi8KKy8qIEFkZGluZyAxIHRvIGEgcHJlY2VkZW5jZSB2YWx1ZSBpcyBkb25lIGZvciBiaW5hcnkgb3BlcmF0b3JzLAorICAgb24gdGhlIG9wZXJhbmQgd2hpY2ggaXMgbW9yZSB0aWdodGx5IGJvdW5kLCBzbyB0aGF0IG9wZXJhdG9ycworICAgb2YgZXF1YWwgcHJlY2VkZW5jZSB3aXRoaW4gdGhhdCBvcGVyYW5kIHdpbGwgZ2V0IHBhcmVudGhlc2VzLiAgKi8KKy8qIFBSRUNfSFlQRVIgYW5kIFBSRUNfQUJPVkVfQ09NTUEgYXJlIG5vdCB0aGUgcHJlY2VkZW5jZSBvZiBhbnkgb3BlcmF0b3I7CisgICB0aGV5IGFyZSB1c2VkIGFzIHRoZSAic3Vycm91bmRpbmcgcHJlY2VkZW5jZSIgdG8gZm9yY2UKKyAgIHZhcmlvdXMga2luZHMgb2YgdGhpbmdzIHRvIGJlIHBhcmVudGhlc2l6ZWQuICAqLworZW51bSBwcmVjZWRlbmNlCit7IFBSRUNfTlVMTCwgUFJFQ19DT01NQSwgUFJFQ19BQk9WRV9DT01NQSwgUFJFQ19BU1NJR04sIFBSRUNfTE9HSUNBTF9PUiwKKyAgUFJFQ19MT0dJQ0FMX0FORCwgUFJFQ19CSVRXSVNFX0lPUiwgUFJFQ19CSVRXSVNFX0FORCwgUFJFQ19CSVRXSVNFX1hPUiwKKyAgUFJFQ19FUVVBTCwgUFJFQ19PUkRFUiwgUFJFQ19TSElGVCwgUFJFQ19BREQsIFBSRUNfTVVMLCBQUkVDX1JFUEVBVCwKKyAgUFJFQ19IWVBFUiwgUFJFQ19QUkVGSVgsIFBSRUNfU1VGRklYLCBQUkVDX0JVSUxUSU5fRlVOQ1RJT04gfTsKKworLyogVGFibGUgbWFwcGluZyBvcGNvZGVzIGludG8gc3RyaW5ncyBmb3IgcHJpbnRpbmcgb3BlcmF0b3JzCisgICBhbmQgcHJlY2VkZW5jZXMgb2YgdGhlIG9wZXJhdG9ycy4gICovCisKK3N0cnVjdCBvcF9wcmludAoreworICBjaGFyICpzdHJpbmc7CisgIGVudW0gZXhwX29wY29kZSBvcGNvZGU7CisgIC8qIFByZWNlZGVuY2Ugb2Ygb3BlcmF0b3IuICBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgb25seSBieSBjb21wYXJpc29ucy4gICovCisgIGVudW0gcHJlY2VkZW5jZSBwcmVjZWRlbmNlOworCisgIC8qIEZvciBhIGJpbmFyeSBvcGVyYXRvcjogIDEgaWZmIHJpZ2h0IGFzc29jaWF0ZS4KKyAgICAgRm9yIGEgdW5hcnkgb3BlcmF0b3I6ICAxIGlmZiBwb3N0Zml4LiAqLworICBpbnQgcmlnaHRfYXNzb2M7Cit9OworCisjZW5kaWYJLyogUEFSU0VSX0RFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3BhcnRpYWwtc3RhYi5oIGIvZ2RiL3BhcnRpYWwtc3RhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NGMxYzkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcGFydGlhbC1zdGFiLmgKQEAgLTAsMCArMSw4MTIgQEAKKy8qIFNoYXJlZCBjb2RlIHRvIHByZS1yZWFkIGEgc3RhYiAoZGJ4LXN0eWxlKSwgd2hlbiBidWlsZGluZyBhIHBzeW10YWIuCisgICBDb3B5cmlnaHQgMTk4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGUgZm9sbG93aW5nIG5lZWQgdG8gYmUgZGVmaW5lZDoKKyAgIFNFVF9OQU1FU1RSSU5HKCkgLS1TZXQgbmFtZXN0cmluZyB0byBuYW1lIG9mIHN5bWJvbC4KKyAgIENVUl9TWU1CT0xfVFlQRSAtLVR5cGUgY29kZSBvZiBjdXJyZW50IHN5bWJvbC4KKyAgIENVUl9TWU1CT0xfVkFMVUUgLS1WYWx1ZSBmaWVsZCBvZiBjdXJyZW50IHN5bWJvbC4gIE1heSBiZSBhZGp1c3RlZCBoZXJlLgorICAgbmFtZXN0cmluZyAtIHZhcmlhYmxlIHBvaW50aW5nIHRvIHRoZSBuYW1lIG9mIHRoZSBzdGFiLgorICAgc2VjdGlvbl9vZmZzZXRzIC0gdmFyaWFibGUgcG9pbnRpbmcgdG8gdGhlIHNlY3Rpb24gb2Zmc2V0cy4KKyAgIHBzdCAtIHRoZSBwYXJ0aWFsIHN5bWJvbCB0YWJsZSBiZWluZyBidWlsdC4KKworICAgcHN5bXRhYl9pbmNsdWRlX2xpc3QsIGluY2x1ZGVzX3VzZWQsIGluY2x1ZGVzX2FsbG9jYXRlZCAtIGxpc3Qgb2YgaW5jbHVkZQorICAgICBmaWxlIG5hbWVzIChOX1NPTCkgc2VlbiBzbyBmYXIuCisgICBkZXBlbmRlbmN5X2xpc3QsIGRlcGVuZGVuY2llc191c2VkLCBkZXBlbmRlbmNpZXNfYWxsb2NhdGVkIC0gbGlzdCBvZgorICAgICBOX0VYQ0wgc3RhYnMgc2VlbiBzbyBmYXIuCisKKyAgIEVORF9QU1lNVEFCIC0tIGVuZCBhIHBhcnRpYWwgc3ltYm9sIHRhYmxlLgorICAgU1RBUlRfUFNZTVRBQiAtLSBzdGFydCBhIHBhcnRpYWwgc3ltYm9sIHRhYmxlLgorICovCisKKy8qIEVuZCBvZiBtYWNybyBkZWZpbml0aW9ucywgbm93IGxldCdzIGhhbmRsZSB0aGVtIHN5bWJvbHMhICAqLworCisgICAgICBzd2l0Y2ggKENVUl9TWU1CT0xfVFlQRSkKKwl7CisJICBjaGFyICpwOworCSAgLyoKKwkgICAqIFN0YW5kYXJkLCBleHRlcm5hbCwgbm9uLWRlYnVnZ2VyLCBzeW1ib2xzCisJICAgKi8KKworCWNhc2UgTl9URVhUIHwgTl9FWFQ6CisJY2FzZSBOX05CVEVYVCB8IE5fRVhUOgorCSAgQ1VSX1NZTUJPTF9WQUxVRSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKTsKKwkgIGdvdG8gcmVjb3JkX2l0OworCisJY2FzZSBOX0RBVEEgfCBOX0VYVDoKKwljYXNlIE5fTkJEQVRBIHwgTl9FWFQ6CisJICBDVVJfU1lNQk9MX1ZBTFVFICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX0RBVEEpOworCSAgZ290byByZWNvcmRfaXQ7CisKKwljYXNlIE5fQlNTOgorCWNhc2UgTl9CU1MgfCBOX0VYVDoKKwljYXNlIE5fTkJCU1MgfCBOX0VYVDoKKyAgICAgICAgY2FzZSBOX1NFVFYgfCBOX0VYVDoJCS8qIEZJWE1FLCBpcyB0aGlzIGluIEJTUz8gKi8KKwkgIENVUl9TWU1CT0xfVkFMVUUgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfQlNTKTsKKwkgIGdvdG8gcmVjb3JkX2l0OworCisJY2FzZSBOX0FCUyB8IE5fRVhUOgorCXJlY29yZF9pdDoKKyNpZmRlZiBEQlhSRUFEX09OTFkKKwkgIFNFVF9OQU1FU1RSSU5HKCk7CisKKwlic3NfZXh0X3N5bWJvbDoKKwkgIHJlY29yZF9taW5pbWFsX3N5bWJvbCAobmFtZXN0cmluZywgQ1VSX1NZTUJPTF9WQUxVRSwKKwkJCQkgQ1VSX1NZTUJPTF9UWVBFLCBvYmpmaWxlKTsgLyogQWx3YXlzICovCisjZW5kaWYgLyogREJYUkVBRF9PTkxZICovCisJICBjb250aW51ZTsKKworCSAgLyogU3RhbmRhcmQsIGxvY2FsLCBub24tZGVidWdnZXIsIHN5bWJvbHMgKi8KKworCWNhc2UgTl9OQlRFWFQ6CisKKwkgIC8qIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBkZWFsIHdpdGggYm90aCBOX0ZOIG9yIE5fVEVYVCwKKwkgICAgIGJlY2F1c2Ugd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZSBzeXMtc3VwcGxpZWQgbGQKKwkgICAgIG9yIEdOVSBsZCB3YXMgdXNlZCB0byBtYWtlIHRoZSBleGVjdXRhYmxlLiAgU2VxdWVudHMgdGhyb3cKKwkgICAgIGluIGFub3RoZXIgd3JpbmtsZSAtLSB0aGV5IHJlbnVtYmVyZWQgTl9GTi4gICovCisKKwljYXNlIE5fRk46CisJY2FzZSBOX0ZOX1NFUToKKwljYXNlIE5fVEVYVDoKKyNpZmRlZiBEQlhSRUFEX09OTFkKKwkgIENVUl9TWU1CT0xfVkFMVUUgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCk7CisJICBTRVRfTkFNRVNUUklORygpOworCSAgaWYgKChuYW1lc3RyaW5nWzBdID09ICctJyAmJiBuYW1lc3RyaW5nWzFdID09ICdsJykKKwkgICAgICB8fCAobmFtZXN0cmluZyBbKG5zbCA9IHN0cmxlbiAobmFtZXN0cmluZykpIC0gMV0gPT0gJ28nCisJCSAgJiYgbmFtZXN0cmluZyBbbnNsIC0gMl0gPT0gJy4nKSkKKwkgICAgeworCSAgICAgIGlmIChvYmpmaWxlIC0+IGVpLmVudHJ5X3BvaW50IDwgIENVUl9TWU1CT0xfVkFMVUUgJiYKKwkJICBvYmpmaWxlIC0+IGVpLmVudHJ5X3BvaW50ID49IGxhc3Rfb19maWxlX3N0YXJ0KQorCQl7CisJCSAgb2JqZmlsZSAtPiBlaS5lbnRyeV9maWxlX2xvd3BjID0gbGFzdF9vX2ZpbGVfc3RhcnQ7CisJCSAgb2JqZmlsZSAtPiBlaS5lbnRyeV9maWxlX2hpZ2hwYyA9IENVUl9TWU1CT0xfVkFMVUU7CisJCX0KKwkgICAgICBpZiAocGFzdF9maXJzdF9zb3VyY2VfZmlsZSAmJiBwc3QKKwkJICAvKiBUaGUgZ291bGQgTlAxIHVzZXMgbG93IHZhbHVlcyBmb3IgLm8gYW5kIC1sIHN5bWJvbHMKKwkJICAgICB3aGljaCBhcmUgbm90IHRoZSBhZGRyZXNzLiAgKi8KKwkJICAmJiBDVVJfU1lNQk9MX1ZBTFVFID49IHBzdC0+dGV4dGxvdykKKwkJeworCQkgIEVORF9QU1lNVEFCIChwc3QsIHBzeW10YWJfaW5jbHVkZV9saXN0LCBpbmNsdWRlc191c2VkLAorCQkJICAgICAgIHN5bW51bSAqIHN5bWJvbF9zaXplLAorCQkJICAgICAgIENVUl9TWU1CT0xfVkFMVUUgPiBwc3QtPnRleHRoaWdoCisJCQkJID8gQ1VSX1NZTUJPTF9WQUxVRSA6IHBzdC0+dGV4dGhpZ2gsIAorCQkJICAgICAgIGRlcGVuZGVuY3lfbGlzdCwgZGVwZW5kZW5jaWVzX3VzZWQsIHRleHRsb3dfbm90X3NldCk7CisJCSAgcHN0ID0gKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSAwOworCQkgIGluY2x1ZGVzX3VzZWQgPSAwOworCQkgIGRlcGVuZGVuY2llc191c2VkID0gMDsKKwkJfQorCSAgICAgIGVsc2UKKwkJcGFzdF9maXJzdF9zb3VyY2VfZmlsZSA9IDE7CisJICAgICAgbGFzdF9vX2ZpbGVfc3RhcnQgPSBDVVJfU1lNQk9MX1ZBTFVFOworCSAgICB9CisJICBlbHNlCisJICAgIGdvdG8gcmVjb3JkX2l0OworI2VuZGlmIC8qIERCWFJFQURfT05MWSAqLworCSAgY29udGludWU7CisKKwljYXNlIE5fREFUQToKKwkgIENVUl9TWU1CT0xfVkFMVUUgKz0gQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfREFUQSk7CisJICBnb3RvIHJlY29yZF9pdDsKKworCWNhc2UgTl9VTkRGIHwgTl9FWFQ6CisjaWZkZWYgREJYUkVBRF9PTkxZCisJICBpZiAoQ1VSX1NZTUJPTF9WQUxVRSAhPSAwKSB7CisJICAgIC8qIFRoaXMgaXMgYSAiRm9ydHJhbiBDT01NT04iIHN5bWJvbC4gIFNlZSBpZiB0aGUgdGFyZ2V0CisJICAgICAgIGVudmlyb25tZW50IGtub3dzIHdoZXJlIGl0IGhhcyBiZWVuIHJlbG9jYXRlZCB0by4gICovCisKKwkgICAgQ09SRV9BRERSIHJlbGFkZHI7CisKKwkgICAgU0VUX05BTUVTVFJJTkcoKTsKKwkgICAgaWYgKHRhcmdldF9sb29rdXBfc3ltYm9sIChuYW1lc3RyaW5nLCAmcmVsYWRkcikpIHsKKwkgICAgICBjb250aW51ZTsJCS8qIEVycm9yIGluIGxvb2t1cDsgaWdub3JlIHN5bWJvbCBmb3Igbm93LiAgKi8KKwkgICAgfQorCSAgICBDVVJfU1lNQk9MX1RZUEUgXj0gKE5fQlNTXk5fVU5ERik7CS8qIERlZmluZSBpdCBhcyBhIGJzcy1zeW1ib2wgKi8KKwkgICAgQ1VSX1NZTUJPTF9WQUxVRSA9IHJlbGFkZHI7CisJICAgIGdvdG8gYnNzX2V4dF9zeW1ib2w7CisJICB9CisjZW5kaWYgLyogREJYUkVBRF9PTkxZICovCisJICBjb250aW51ZTsJLyogSnVzdCB1bmRlZmluZWQsIG5vdCBDT01NT04gKi8KKworCWNhc2UgTl9VTkRGOgorI2lmZGVmIERCWFJFQURfT05MWQorCSAgaWYgKHByb2Nlc3NpbmdfYWNjX2NvbXBpbGF0aW9uICYmIENVUl9TWU1CT0xfU1RSWCA9PSAxKSB7CisJICAgIC8qIERlYWwgd2l0aCByZWxhdGl2ZSBvZmZzZXRzIGluIHRoZSBzdHJpbmcgdGFibGUKKwkgICAgICAgdXNlZCBpbiBFTEYrU1RBQiB1bmRlciBTb2xhcmlzLiAgSWYgd2Ugd2FudCB0byB1c2UgdGhlCisJICAgICAgIG5fc3RyeCBmaWVsZCwgd2hpY2ggY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGZpbGUsCisJICAgICAgIHdlIG11c3QgYWRqdXN0IGZpbGVfc3RyaW5nX3RhYmxlX29mZnNldCAqYmVmb3JlKiBjYWxsaW5nCisJICAgICAgIFNFVF9OQU1FU1RSSU5HKCkuICAqLworCSAgICBwYXN0X2ZpcnN0X3NvdXJjZV9maWxlID0gMTsKKwkgICAgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0ID0gbmV4dF9maWxlX3N0cmluZ190YWJsZV9vZmZzZXQ7CisJICAgIG5leHRfZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0ID0KKwkgICAgICBmaWxlX3N0cmluZ190YWJsZV9vZmZzZXQgKyBDVVJfU1lNQk9MX1ZBTFVFOworCSAgICBpZiAobmV4dF9maWxlX3N0cmluZ190YWJsZV9vZmZzZXQgPCBmaWxlX3N0cmluZ190YWJsZV9vZmZzZXQpCisJICAgICAgZXJyb3IgKCJzdHJpbmcgdGFibGUgb2Zmc2V0IGJhY2tzIHVwIGF0ICVkIiwgc3ltbnVtKTsKKyAgLyogRklYTUUgLS0gcmVwbGFjZSBlcnJvcigpIHdpdGggY29tcGxhaW50LiAgKi8KKwkgICAgY29udGludWU7CisJICB9CisjZW5kaWYgLyogREJYUkVBRF9PTkxZICovCisJICBjb250aW51ZTsKKworCSAgICAvKiBMb3RzIG9mIHN5bWJvbCB0eXBlcyB3ZSBjYW4ganVzdCBpZ25vcmUuICAqLworCisJY2FzZSBOX0FCUzoKKwljYXNlIE5fTkJEQVRBOgorCWNhc2UgTl9OQkJTUzoKKwkgIGNvbnRpbnVlOworCisJICAvKiBLZWVwIGdvaW5nIC4gLiAuKi8KKworCSAgLyoKKwkgICAqIFNwZWNpYWwgc3ltYm9sIHR5cGVzIGZvciBHTlUKKwkgICAqLworCWNhc2UgTl9JTkRSOgorCWNhc2UgTl9JTkRSIHwgTl9FWFQ6CisJY2FzZSBOX1NFVEE6CisJY2FzZSBOX1NFVEEgfCBOX0VYVDoKKwljYXNlIE5fU0VUVDoKKwljYXNlIE5fU0VUVCB8IE5fRVhUOgorCWNhc2UgTl9TRVREOgorCWNhc2UgTl9TRVREIHwgTl9FWFQ6CisJY2FzZSBOX1NFVEI6CisJY2FzZSBOX1NFVEIgfCBOX0VYVDoKKwljYXNlIE5fU0VUVjoKKwkgIGNvbnRpbnVlOworCisJICAvKgorCSAgICogRGVidWdnZXIgc3ltYm9scworCSAgICovCisKKwljYXNlIE5fU086IHsKKwkgIHVuc2lnbmVkIGxvbmcgdmFsdTsKKwkgIHN0YXRpYyBpbnQgcHJldl9zb19zeW1udW0gPSAtMTA7CisJICBzdGF0aWMgaW50IGZpcnN0X3NvX3N5bW51bTsKKwkgIGNoYXIgKnA7CisJICBpbnQgcHJldl90ZXh0bG93X25vdF9zZXQ7CisKKwkgIHZhbHUgPSBDVVJfU1lNQk9MX1ZBTFVFICsgQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgU0VDVF9PRkZfVEVYVCk7CisKKwkgIHByZXZfdGV4dGxvd19ub3Rfc2V0ID0gdGV4dGxvd19ub3Rfc2V0OworCisjaWZkZWYgU09GVU5fQUREUkVTU19NQVlCRV9NSVNTSU5HCisJICAvKiBBIHplcm8gdmFsdWUgaXMgcHJvYmFibHkgYW4gaW5kaWNhdGlvbiBmb3IgdGhlIFN1blBSTyAzLjAKKwkgICAgIGNvbXBpbGVyLiBlbmRfcHN5bXRhYiBleHBsaWNpdGx5IHRlc3RzIGZvciB6ZXJvLCBzbworCSAgICAgZG9uJ3QgcmVsb2NhdGUgaXQuICAqLworCisJICBpZiAoQ1VSX1NZTUJPTF9WQUxVRSA9PSAwKQorCSAgICB7CisJICAgICAgdGV4dGxvd19ub3Rfc2V0ID0gMTsKKwkgICAgICB2YWx1ID0gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB0ZXh0bG93X25vdF9zZXQgPSAwOworI2Vsc2UKKwkgIHRleHRsb3dfbm90X3NldCA9IDA7CisjZW5kaWYKKwkgIHBhc3RfZmlyc3Rfc291cmNlX2ZpbGUgPSAxOworCisJICBpZiAocHJldl9zb19zeW1udW0gIT0gc3ltbnVtIC0gMSkKKwkgICAgewkJCS8qIEhlcmUgaWYgcHJldiBzdGFiIHdhc24ndCBOX1NPICovCisJICAgICAgZmlyc3Rfc29fc3ltbnVtID0gc3ltbnVtOworCisJICAgICAgaWYgKHBzdCkKKwkJeworCQkgIEVORF9QU1lNVEFCIChwc3QsIHBzeW10YWJfaW5jbHVkZV9saXN0LCBpbmNsdWRlc191c2VkLAorCQkJICAgICAgIHN5bW51bSAqIHN5bWJvbF9zaXplLAorCQkJICAgICAgIHZhbHUgPiBwc3QtPnRleHRoaWdoID8gdmFsdSA6IHBzdC0+dGV4dGhpZ2gsCisJCQkgICAgICAgZGVwZW5kZW5jeV9saXN0LCBkZXBlbmRlbmNpZXNfdXNlZCwKKwkJCSAgICAgICBwcmV2X3RleHRsb3dfbm90X3NldCk7CisJCSAgcHN0ID0gKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSAwOworCQkgIGluY2x1ZGVzX3VzZWQgPSAwOworCQkgIGRlcGVuZGVuY2llc191c2VkID0gMDsKKwkJfQorCSAgICB9CisKKwkgIHByZXZfc29fc3ltbnVtID0gc3ltbnVtOworCisJICAvKiBFbmQgdGhlIGN1cnJlbnQgcGFydGlhbCBzeW10YWIgYW5kIHN0YXJ0IGEgbmV3IG9uZSAqLworCisJICBTRVRfTkFNRVNUUklORygpOworCisJICAvKiBOdWxsIG5hbWUgbWVhbnMgZW5kIG9mIC5vIGZpbGUuICBEb24ndCBzdGFydCBhIG5ldyBvbmUuICovCisJICBpZiAoKm5hbWVzdHJpbmcgPT0gJ1wwMDAnKQorCSAgICBjb250aW51ZTsKKworCSAgLyogU29tZSBjb21waWxlcnMgKGluY2x1ZGluZyBnY2MpIGVtaXQgYSBwYWlyIG9mIGluaXRpYWwgTl9TT3MuCisJICAgICBUaGUgZmlyc3Qgb25lIGlzIGEgZGlyZWN0b3J5IG5hbWU7IHRoZSBzZWNvbmQgdGhlIGZpbGUgbmFtZS4KKwkgICAgIElmIHBzdCBleGlzdHMsIGlzIGVtcHR5LCBhbmQgaGFzIGEgZmlsZW5hbWUgZW5kaW5nIGluICcvJywKKwkgICAgIHdlIGFzc3VtZSB0aGUgcHJldmlvdXMgTl9TTyB3YXMgYSBkaXJlY3RvcnkgbmFtZS4gKi8KKworCSAgcCA9IHN0cnJjaHIgKG5hbWVzdHJpbmcsICcvJyk7CisJICBpZiAocCAmJiAqKHArMSkgPT0gJ1wwMDAnKQorCSAgICBjb250aW51ZTsJCS8qIFNpbXBseSBpZ25vcmUgZGlyZWN0b3J5IG5hbWUgU09zICovCisKKwkgIC8qIFNvbWUgb3RoZXIgY29tcGlsZXJzIChDKysgb25lcyBpbiBwYXJ0aWN1bGFyKSBlbWl0IHVzZWxlc3MKKwkgICAgIFNPcyBmb3Igbm9uLWV4aXN0YW50IC5jIGZpbGVzLiAgV2UgaWdub3JlIGFsbCBzdWJzZXF1ZW50IFNPcyB0aGF0CisJICAgICBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIGZpcnN0LiAgKi8KKworCSAgaWYgKCFwc3QpCisJICAgIHBzdCA9IFNUQVJUX1BTWU1UQUIgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywKKwkJCQkgbmFtZXN0cmluZywgdmFsdSwKKwkJCQkgZmlyc3Rfc29fc3ltbnVtICogc3ltYm9sX3NpemUsCisJCQkJIG9iamZpbGUgLT4gZ2xvYmFsX3BzeW1ib2xzLm5leHQsCisJCQkJIG9iamZpbGUgLT4gc3RhdGljX3BzeW1ib2xzLm5leHQpOworCSAgY29udGludWU7CisJfQorCisJY2FzZSBOX0JJTkNMOgorCSAgeworI2lmZGVmIERCWFJFQURfT05MWQorCSAgICBlbnVtIGxhbmd1YWdlIHRtcF9sYW5ndWFnZTsKKwkgICAgLyogQWRkIHRoaXMgYmluY2wgdG8gdGhlIGJpbmNsX2xpc3QgZm9yIGZ1dHVyZSBFWENMcy4gIE5vCisJICAgICAgIG5lZWQgdG8gc2F2ZSB0aGUgc3RyaW5nOyBpdCdsbCBiZSBhcm91bmQgdW50aWwKKwkgICAgICAgcmVhZF9kYnhfc3ltdGFiIGZ1bmN0aW9uIHJldHVybnMgKi8KKworCSAgICBTRVRfTkFNRVNUUklORygpOworCisJICAgIHRtcF9sYW5ndWFnZSA9IGRlZHVjZV9sYW5ndWFnZV9mcm9tX2ZpbGVuYW1lIChuYW1lc3RyaW5nKTsKKworCSAgICAvKiBPbmx5IGNoYW5nZSB0aGUgcHN5bXRhYidzIGxhbmd1YWdlIGlmIHdlJ3ZlIGxlYXJuZWQKKwkgICAgICAgc29tZXRoaW5nIHVzZWZ1bCAoZWcuIHRtcF9sYW5ndWFnZSBpcyBub3QgbGFuZ3VhZ2VfdW5rbm93bikuCisJICAgICAgIEluIGFkZGl0aW9uLCB0byBtYXRjaCB3aGF0IHN0YXJ0X3N1YmZpbGUgZG9lcywgbmV2ZXIgY2hhbmdlCisJICAgICAgIGZyb20gQysrIHRvIEMuICAqLworCSAgICBpZiAodG1wX2xhbmd1YWdlICE9IGxhbmd1YWdlX3Vua25vd24KKwkJJiYgKHRtcF9sYW5ndWFnZSAhPSBsYW5ndWFnZV9jCisJCSAgICB8fCBwc3ltdGFiX2xhbmd1YWdlICE9IGxhbmd1YWdlX2NwbHVzKSkKKwkgICAgICBwc3ltdGFiX2xhbmd1YWdlID0gdG1wX2xhbmd1YWdlOworCisJICAgIGlmIChwc3QgPT0gTlVMTCkKKwkgICAgICB7CisJCS8qIEZJWE1FOiB3ZSBzaG91bGQgbm90IGdldCBoZXJlIHdpdGhvdXQgYSBQU1QgdG8gd29yayBvbi4KKwkJICAgQXR0ZW1wdCB0byByZWNvdmVyLiAgKi8KKwkJY29tcGxhaW4gKCZ1bmNsYWltZWRfYmluY2xfY29tcGxhaW50LCBuYW1lc3RyaW5nLCBzeW1udW0pOworCQljb250aW51ZTsKKwkgICAgICB9CisJICAgIGFkZF9iaW5jbF90b19saXN0IChwc3QsIG5hbWVzdHJpbmcsIENVUl9TWU1CT0xfVkFMVUUpOworCisJICAgIC8qIE1hcmsgZG93biBhbiBpbmNsdWRlIGZpbGUgaW4gdGhlIGN1cnJlbnQgcHN5bXRhYiAqLworCisJICAgIGdvdG8gcmVjb3JkX2luY2x1ZGVfZmlsZTsKKworI2Vsc2UgLyogREJYUkVBRF9PTkxZICovCisJICAgIGNvbnRpbnVlOworI2VuZGlmCisJICB9CisKKwljYXNlIE5fU09MOgorCSAgeworCSAgICBlbnVtIGxhbmd1YWdlIHRtcF9sYW5ndWFnZTsKKwkgICAgLyogTWFyayBkb3duIGFuIGluY2x1ZGUgZmlsZSBpbiB0aGUgY3VycmVudCBwc3ltdGFiICovCisJICAgIAorCSAgICBTRVRfTkFNRVNUUklORygpOworICAKKwkgICAgdG1wX2xhbmd1YWdlID0gZGVkdWNlX2xhbmd1YWdlX2Zyb21fZmlsZW5hbWUgKG5hbWVzdHJpbmcpOworICAKKwkgICAgLyogT25seSBjaGFuZ2UgdGhlIHBzeW10YWIncyBsYW5ndWFnZSBpZiB3ZSd2ZSBsZWFybmVkCisJICAgICAgIHNvbWV0aGluZyB1c2VmdWwgKGVnLiB0bXBfbGFuZ3VhZ2UgaXMgbm90IGxhbmd1YWdlX3Vua25vd24pLgorCSAgICAgICBJbiBhZGRpdGlvbiwgdG8gbWF0Y2ggd2hhdCBzdGFydF9zdWJmaWxlIGRvZXMsIG5ldmVyIGNoYW5nZQorCSAgICAgICBmcm9tIEMrKyB0byBDLiAgKi8KKwkgICAgaWYgKHRtcF9sYW5ndWFnZSAhPSBsYW5ndWFnZV91bmtub3duCisJCSYmICh0bXBfbGFuZ3VhZ2UgIT0gbGFuZ3VhZ2VfYworCQkgICAgfHwgcHN5bXRhYl9sYW5ndWFnZSAhPSBsYW5ndWFnZV9jcGx1cykpCisJICAgICAgcHN5bXRhYl9sYW5ndWFnZSA9IHRtcF9sYW5ndWFnZTsKKwkgICAgCisJICAgIC8qIEluIEMrKywgb25lIG1heSBleHBlY3QgdGhlIHNhbWUgZmlsZW5hbWUgdG8gY29tZSByb3VuZCBtYW55CisJICAgICAgIHRpbWVzLCB3aGVuIGNvZGUgaXMgY29taW5nIGFsdGVybmF0ZWx5IGZyb20gdGhlIG1haW4gZmlsZQorCSAgICAgICBhbmQgZnJvbSBpbmxpbmUgZnVuY3Rpb25zIGluIG90aGVyIGZpbGVzLiBTbyBJIGNoZWNrIHRvIHNlZQorCSAgICAgICBpZiB0aGlzIGlzIGEgZmlsZSB3ZSd2ZSBzZWVuIGJlZm9yZSAtLSBlaXRoZXIgdGhlIG1haW4KKwkgICAgICAgc291cmNlIGZpbGUsIG9yIGEgcHJldmlvdXNseSBpbmNsdWRlZCBmaWxlLgorCSAgICAgICAKKwkgICAgICAgVGhpcyBzZWVtcyB0byBiZSBhIGxvdCBvZiB0aW1lIHRvIGJlIHNwZW5kaW5nIG9uIE5fU09MLCBidXQKKwkgICAgICAgdGhpbmdzIGxpa2UgImJyZWFrIGMtZXhwLnk6NDM1IiBuZWVkIHRvIHdvcmsgKEkKKwkgICAgICAgc3VwcG9zZSB0aGUgcHN5bXRhYl9pbmNsdWRlX2xpc3QgY291bGQgYmUgaGFzaGVkIG9yIHB1dAorCSAgICAgICBpbiBhIGJpbmFyeSB0cmVlLCBpZiBwcm9maWxpbmcgc2hvd3MgdGhpcyBpcyBhIG1ham9yIGhvZykuICAqLworCSAgICBpZiAocHN0ICYmIFNUUkVRIChuYW1lc3RyaW5nLCBwc3QtPmZpbGVuYW1lKSkKKwkgICAgICBjb250aW51ZTsKKwkgICAgeworCSAgICAgIHJlZ2lzdGVyIGludCBpOworCSAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmNsdWRlc191c2VkOyBpKyspCisJCWlmIChTVFJFUSAobmFtZXN0cmluZywgcHN5bXRhYl9pbmNsdWRlX2xpc3RbaV0pKQorCQkgIHsKKwkJICAgIGkgPSAtMTsgCisJCSAgICBicmVhazsKKwkJICB9CisJICAgICAgaWYgKGkgPT0gLTEpCisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIAorI2lmZGVmIERCWFJFQURfT05MWQorCSAgcmVjb3JkX2luY2x1ZGVfZmlsZToKKyNlbmRpZgorCSAgICAKKwkgICAgcHN5bXRhYl9pbmNsdWRlX2xpc3RbaW5jbHVkZXNfdXNlZCsrXSA9IG5hbWVzdHJpbmc7CisJICAgIGlmIChpbmNsdWRlc191c2VkID49IGluY2x1ZGVzX2FsbG9jYXRlZCkKKwkgICAgICB7CisJCWNoYXIgKipvcmlnID0gcHN5bXRhYl9pbmNsdWRlX2xpc3Q7CisJCQorCQlwc3ltdGFiX2luY2x1ZGVfbGlzdCA9IChjaGFyICoqKQorCQkgIGFsbG9jYSAoKGluY2x1ZGVzX2FsbG9jYXRlZCAqPSAyKSAqCisJCQkgIHNpemVvZiAoY2hhciAqKSk7CisJCW1lbWNweSAoKFBUUilwc3ltdGFiX2luY2x1ZGVfbGlzdCwgKFBUUilvcmlnLAorCQkJaW5jbHVkZXNfdXNlZCAqIHNpemVvZiAoY2hhciAqKSk7CisJICAgICAgfQorCSAgICBjb250aW51ZTsKKwkgIH0KKwljYXNlIE5fTFNZTToJCS8qIFR5cGVkZWYgb3IgYXV0b21hdGljIHZhcmlhYmxlLiAqLworCWNhc2UgTl9TVFNZTToJCS8qIERhdGEgc2VnIHZhciAtLSBzdGF0aWMgICovCisJY2FzZSBOX0xDU1lNOgkJLyogQlNTICAgICAgIiAgKi8KKwljYXNlIE5fUk9TWU06CQkvKiBSZWFkLW9ubHkgZGF0YSBzZWcgdmFyIC0tIHN0YXRpYy4gICovCisJY2FzZSBOX05CU1RTOiAgICAgICAgICAgLyogR291bGQgbm9iYXNlLiAgKi8KKwljYXNlIE5fTkJMQ1M6ICAgICAgICAgICAvKiBzeW1ib2xzLiAgKi8KKwljYXNlIE5fRlVOOgorCWNhc2UgTl9HU1lNOgkJLyogR2xvYmFsIChleHRlcm4pIHZhcmlhYmxlOyBjYW4gYmUKKwkJCQkgICBkYXRhIG9yIGJzcyAoc2lnaCBGSVhNRSkuICAqLworCisJLyogRm9sbG93aW5nIG1heSBwcm9iYWJseSBiZSBpZ25vcmVkOyBJJ2xsIGxlYXZlIHRoZW0gaGVyZQorCSAgIGZvciBub3cgKHVudGlsIEkgZG8gUGFzY2FsIGFuZCBNb2R1bGEgMiBleHRlbnNpb25zKS4gICovCisKKwljYXNlIE5fUEM6CQkvKiBJIG1heSBvciBtYXkgbm90IG5lZWQgdGhpczsgSQorCQkJCSAgIHN1c3BlY3Qgbm90LiAgKi8KKwljYXNlIE5fTTJDOgkJLyogSSBzdXNwZWN0IHRoYXQgSSBjYW4gaWdub3JlIHRoaXMgaGVyZS4gKi8KKwljYXNlIE5fU0NPUEU6CQkvKiBTYW1lLiAgICovCisKKwkgIFNFVF9OQU1FU1RSSU5HKCk7CisKKyNpZmRlZiBEQlhSRUFEX09OTFkKKwkgIC8qIFNlZSBpZiB0aGlzIGlzIGFuIGVuZCBvZiBmdW5jdGlvbiBzdGFiLiAgKi8KKwkgIGlmIChDVVJfU1lNQk9MX1RZUEUgPT0gTl9GVU4gJiYgKm5hbWVzdHJpbmcgPT0gJ1wwMDAnKQorCSAgICB7CisJICAgICAgdW5zaWduZWQgbG9uZyB2YWx1OworCisJICAgICAgLyogSXQncyB2YWx1ZSBpcyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBmdW5jdGlvbiBmb3IKKwkJIGZ1bmN0aW9uIHJlbGF0aXZlIHN0YWJzLCBvciB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24ncworCQkgZW5kIGZvciBvbGQgc3R5bGUgc3RhYnMuICAqLworCSAgICAgIHZhbHUgPSBDVVJfU1lNQk9MX1ZBTFVFICsgbGFzdF9mdW5jdGlvbl9zdGFydDsKKwkgICAgICBpZiAocHN0LT50ZXh0aGlnaCA9PSAwIHx8IHZhbHUgPiBwc3QtPnRleHRoaWdoKQorCQlwc3QtPnRleHRoaWdoID0gdmFsdTsKKwkgICAgICBicmVhazsKKwkgICAgIH0KKyNlbmRpZgorCisJICBwID0gKGNoYXIgKikgc3RyY2hyIChuYW1lc3RyaW5nLCAnOicpOworCSAgaWYgKCFwKQorCSAgICBjb250aW51ZTsJCS8qIE5vdCBhIGRlYnVnZ2luZyBzeW1ib2wuICAgKi8KKworCisKKwkgIC8qIE1haW4gcHJvY2Vzc2luZyBzZWN0aW9uIGZvciBkZWJ1Z2dpbmcgc3ltYm9scyB3aGljaAorCSAgICAgdGhlIGluaXRpYWwgcmVhZCB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGVzIG5lZWRzIHRvIHdvcnJ5CisJICAgICBhYm91dC4gIElmIHdlIHJlYWNoIHRoaXMgcG9pbnQsIHRoZSBzeW1ib2wgd2hpY2ggd2UgYXJlCisJICAgICBjb25zaWRlcmluZyBpcyBkZWZpbml0ZWx5IG9uZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4KKwkgICAgIHAgbXVzdCBhbHNvIGNvbnRhaW4gdGhlICh2YWxpZCkgaW5kZXggaW50byB0aGUgbmFtZXN0cmluZworCSAgICAgd2hpY2ggaW5kaWNhdGVzIHRoZSBkZWJ1Z2dpbmcgdHlwZSBzeW1ib2wuICAqLworCisJICBzd2l0Y2ggKHBbMV0pCisJICAgIHsKKwkgICAgY2FzZSAnUyc6CisJICAgICAgQ1VSX1NZTUJPTF9WQUxVRSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9EQVRBKTsKKyNpZmRlZiBTVEFUSUNfVFJBTlNGT1JNX05BTUUKKwkgICAgICBuYW1lc3RyaW5nID0gU1RBVElDX1RSQU5TRk9STV9OQU1FIChuYW1lc3RyaW5nKTsKKyNlbmRpZgorCSAgICAgIGFkZF9wc3ltYm9sX3RvX2xpc3QgKG5hbWVzdHJpbmcsIHAgLSBuYW1lc3RyaW5nLAorCQkJCSAgIFZBUl9OQU1FU1BBQ0UsIExPQ19TVEFUSUMsCisJCQkJICAgJm9iamZpbGUtPnN0YXRpY19wc3ltYm9scywKKwkJCQkgICAwLCBDVVJfU1lNQk9MX1ZBTFVFLAorCQkJCSAgIHBzeW10YWJfbGFuZ3VhZ2UsIG9iamZpbGUpOworCSAgICAgIGNvbnRpbnVlOworCSAgICBjYXNlICdHJzoKKwkgICAgICBDVVJfU1lNQk9MX1ZBTFVFICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX0RBVEEpOworCSAgICAgIC8qIFRoZSBhZGRyZXNzZXMgaW4gdGhlc2UgZW50cmllcyBhcmUgcmVwb3J0ZWQgdG8gYmUKKwkJIHdyb25nLiAgU2VlIHRoZSBjb2RlIHRoYXQgcmVhZHMgJ0cncyBmb3Igc3ltdGFicy4gKi8KKwkgICAgICBhZGRfcHN5bWJvbF90b19saXN0IChuYW1lc3RyaW5nLCBwIC0gbmFtZXN0cmluZywKKwkJCQkgICBWQVJfTkFNRVNQQUNFLCBMT0NfU1RBVElDLAorCQkJCSAgICZvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMsCisJCQkJICAgMCwgQ1VSX1NZTUJPTF9WQUxVRSwKKwkJCQkgICBwc3ltdGFiX2xhbmd1YWdlLCBvYmpmaWxlKTsKKwkgICAgICBjb250aW51ZTsKKworCSAgICBjYXNlICdUJzoKKwkgICAgICBpZiAocCAhPSBuYW1lc3RyaW5nKQkvKiBhIG5hbWUgaXMgdGhlcmUsIG5vdCBqdXN0IDpULi4uICovCisJCXsKKwkJICBhZGRfcHN5bWJvbF90b19saXN0IChuYW1lc3RyaW5nLCBwIC0gbmFtZXN0cmluZywKKwkJCQkgICAgICAgU1RSVUNUX05BTUVTUEFDRSwgTE9DX1RZUEVERUYsCisJCQkJICAgICAgICZvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMsCisJCQkJICAgICAgIENVUl9TWU1CT0xfVkFMVUUsIDAsCisJCQkJICAgICAgIHBzeW10YWJfbGFuZ3VhZ2UsIG9iamZpbGUpOworCQkgIGlmIChwWzJdID09ICd0JykKKwkJICAgIHsKKwkJICAgICAgLyogQWxzbyBhIHR5cGVkZWYgd2l0aCB0aGUgc2FtZSBuYW1lLiAgKi8KKwkJICAgICAgYWRkX3BzeW1ib2xfdG9fbGlzdCAobmFtZXN0cmluZywgcCAtIG5hbWVzdHJpbmcsCisJCQkJCSAgIFZBUl9OQU1FU1BBQ0UsIExPQ19UWVBFREVGLAorCQkJCQkgICAmb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLAorCQkJCQkgICBDVVJfU1lNQk9MX1ZBTFVFLCAwLAorCQkJCQkgICBwc3ltdGFiX2xhbmd1YWdlLCBvYmpmaWxlKTsKKwkJICAgICAgcCArPSAxOworCQkgICAgfQorCQkgIC8qIFRoZSBzZW1hbnRpY3Mgb2YgQysrIHN0YXRlIHRoYXQgInN0cnVjdCBmb28geyAuLi4gfSIKKwkJICAgICBhbHNvIGRlZmluZXMgYSB0eXBlZGVmIGZvciAiZm9vIi4gIFVuZm9ydHVhbnRlbHksIGNmcm9udAorCQkgICAgIG5ldmVyIG1ha2VzIHRoZSB0eXBlZGVmIHdoZW4gdHJhbnNsYXRpbmcgZnJvbSBDKysgdG8gQy4KKwkJICAgICBXZSBtYWtlIHRoZSB0eXBlZGVmIGhlcmUgc28gdGhhdCAicHR5cGUgZm9vIiB3b3JrcyBhcworCQkgICAgIGV4cGVjdGVkIGZvciBjZnJvbnQgdHJhbnNsYXRlZCBjb2RlLiAgKi8KKwkJICBlbHNlIGlmIChwc3ltdGFiX2xhbmd1YWdlID09IGxhbmd1YWdlX2NwbHVzKQorCQkgICB7CisJCSAgICAgIC8qIEFsc28gYSB0eXBlZGVmIHdpdGggdGhlIHNhbWUgbmFtZS4gICovCisJCSAgICAgIGFkZF9wc3ltYm9sX3RvX2xpc3QgKG5hbWVzdHJpbmcsIHAgLSBuYW1lc3RyaW5nLAorCQkJCQkgICBWQVJfTkFNRVNQQUNFLCBMT0NfVFlQRURFRiwKKwkJCQkJICAgJm9iamZpbGUtPnN0YXRpY19wc3ltYm9scywKKwkJCQkJICAgQ1VSX1NZTUJPTF9WQUxVRSwgMCwKKwkJCQkJICAgcHN5bXRhYl9sYW5ndWFnZSwgb2JqZmlsZSk7CisJCSAgIH0KKwkJfQorCSAgICAgIGdvdG8gY2hlY2tfZW51bTsKKwkgICAgY2FzZSAndCc6CisJICAgICAgaWYgKHAgIT0gbmFtZXN0cmluZykJLyogYSBuYW1lIGlzIHRoZXJlLCBub3QganVzdCA6VC4uLiAqLworCQl7CisJCSAgYWRkX3BzeW1ib2xfdG9fbGlzdCAobmFtZXN0cmluZywgcCAtIG5hbWVzdHJpbmcsCisJCQkJICAgICAgIFZBUl9OQU1FU1BBQ0UsIExPQ19UWVBFREVGLAorCQkJCSAgICAgICAmb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLAorCQkJCSAgICAgICBDVVJfU1lNQk9MX1ZBTFVFLCAwLAorCQkJCSAgICAgICBwc3ltdGFiX2xhbmd1YWdlLCBvYmpmaWxlKTsKKwkJfQorCSAgICBjaGVja19lbnVtOgorCSAgICAgIC8qIElmIHRoaXMgaXMgYW4gZW51bWVyYXRlZCB0eXBlLCB3ZSBuZWVkIHRvCisJCSBhZGQgYWxsIHRoZSBlbnVtIGNvbnN0YW50cyB0byB0aGUgcGFydGlhbCBzeW1ib2wKKwkJIHRhYmxlLiAgVGhpcyBkb2VzIG5vdCBjb3ZlciBlbnVtcyB3aXRob3V0IG5hbWVzLCBlLmcuCisJCSAiZW51bSB7YSwgYn0gYzsiIGluIEMsIGJ1dCBmb3J0dW5hdGVseSB0aG9zZSBhcmUKKwkJIHJhcmUuICBUaGVyZSBpcyBubyB3YXkgZm9yIEdEQiB0byBmaW5kIHRob3NlIGZyb20gdGhlCisJCSBlbnVtIHR5cGUgd2l0aG91dCBzcGVuZGluZyB0b28gbXVjaCB0aW1lIG9uIGl0LiAgVGh1cworCQkgdG8gc29sdmUgdGhpcyBwcm9ibGVtLCB0aGUgY29tcGlsZXIgbmVlZHMgdG8gcHV0IG91dCB0aGUKKwkJIGVudW0gaW4gYSBuYW1lbGVzcyB0eXBlLiAgR0NDMiBkb2VzIHRoaXMuICAqLworCisJICAgICAgLyogV2UgYXJlIGxvb2tpbmcgZm9yIHNvbWV0aGluZyBvZiB0aGUgZm9ybQorCQkgPG5hbWU+ICI6IiAoInQiIHwgIlQiKSBbPG51bWJlcj4gIj0iXSAiZSIKKwkJIHs8Y29uc3RhbnQ+ICI6IiA8dmFsdWU+ICIsIn0gIjsiLiAgKi8KKworCSAgICAgIC8qIFNraXAgb3ZlciB0aGUgY29sb24gYW5kIHRoZSAndCcgb3IgJ1QnLiAgKi8KKwkgICAgICBwICs9IDI7CisJICAgICAgLyogVGhpcyB0eXBlIG1heSBiZSBnaXZlbiBhIG51bWJlci4gIEFsc28sIG51bWJlcnMgY2FuIGNvbWUKKwkJIGluIHBhaXJzIGxpa2UgKDAsMjYpLiAgU2tpcCBvdmVyIGl0LiAgKi8KKwkgICAgICB3aGlsZSAoKCpwID49ICcwJyAmJiAqcCA8PSAnOScpCisJCSAgICAgfHwgKnAgPT0gJygnIHx8ICpwID09ICcsJyB8fCAqcCA9PSAnKScKKwkJICAgICB8fCAqcCA9PSAnPScpCisJCXArKzsKKworCSAgICAgIGlmICgqcCsrID09ICdlJykKKwkJeworCQkgIC8qIFRoZSBhaXg0IGNvbXBpbGVyIGVtaXRzIGV4dHJhIGNydWQgYmVmb3JlIHRoZSBtZW1iZXJzLiAgKi8KKwkJICBpZiAoKnAgPT0gJy0nKQorCQkgICAgeworCQkgICAgICAvKiBTa2lwIG92ZXIgdGhlIHR5cGUgKD8pLiAgKi8KKwkJICAgICAgd2hpbGUgKCpwICE9ICc6JykKKwkJCXArKzsKKworCQkgICAgICAvKiBTa2lwIG92ZXIgdGhlIGNvbG9uLiAgKi8KKwkJICAgICAgcCsrOworCQkgICAgfQorCisJCSAgLyogV2UgaGF2ZSBmb3VuZCBhbiBlbnVtZXJhdGVkIHR5cGUuICAqLworCQkgIC8qIEFjY29yZGluZyB0byBjb21tZW50cyBpbiByZWFkX2VudW1fdHlwZQorCQkgICAgIGEgY29tbWEgY291bGQgZW5kIGl0IGluc3RlYWQgb2YgYSBzZW1pY29sb24uCisJCSAgICAgSSBkb24ndCBrbm93IHdoZXJlIHRoYXQgaGFwcGVucy4KKwkJICAgICBBY2NlcHQgZWl0aGVyLiAgKi8KKwkJICB3aGlsZSAoKnAgJiYgKnAgIT0gJzsnICYmICpwICE9ICcsJykKKwkJICAgIHsKKwkJICAgICAgY2hhciAqcTsKKworCQkgICAgICAvKiBDaGVjayBmb3IgYW5kIGhhbmRsZSBjcmV0aW5vdXMgZGJ4IHN5bWJvbCBuYW1lCisJCQkgY29udGludWF0aW9uISAgKi8KKwkJICAgICAgaWYgKCpwID09ICdcXCcgfHwgKCpwID09ICc/JyAmJiBwWzFdID09ICdcMCcpKQorCQkJcCA9IG5leHRfc3ltYm9sX3RleHQgKG9iamZpbGUpOworCisJCSAgICAgIC8qIFBvaW50IHRvIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIG5hbWUKKwkJCSBvZiB0aGUgZW51bSBjb25zdGFudC4gICovCisJCSAgICAgIGZvciAocSA9IHA7ICpxICYmICpxICE9ICc6JzsgcSsrKQorCQkJOworCQkgICAgICAvKiBOb3RlIHRoYXQgdGhlIHZhbHVlIGRvZXNuJ3QgbWF0dGVyIGZvcgorCQkJIGVudW0gY29uc3RhbnRzIGluIHBzeW10YWJzLCBqdXN0IGluIHN5bXRhYnMuICAqLworCQkgICAgICBhZGRfcHN5bWJvbF90b19saXN0IChwLCBxIC0gcCwKKwkJCQkJICAgVkFSX05BTUVTUEFDRSwgTE9DX0NPTlNULAorCQkJCQkgICAmb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLCAwLAorCQkJCQkgICAwLCBwc3ltdGFiX2xhbmd1YWdlLCBvYmpmaWxlKTsKKwkJICAgICAgLyogUG9pbnQgcGFzdCB0aGUgbmFtZS4gICovCisJCSAgICAgIHAgPSBxOworCQkgICAgICAvKiBTa2lwIG92ZXIgdGhlIHZhbHVlLiAgKi8KKwkJICAgICAgd2hpbGUgKCpwICYmICpwICE9ICcsJykKKwkJCXArKzsKKwkJICAgICAgLyogQWR2YW5jZSBwYXN0IHRoZSBjb21tYS4gICovCisJCSAgICAgIGlmICgqcCkKKwkJCXArKzsKKwkJICAgIH0KKwkJfQorCSAgICAgIGNvbnRpbnVlOworCSAgICBjYXNlICdjJzoKKwkgICAgICAvKiBDb25zdGFudCwgZS5nLiBmcm9tICJjb25zdCIgaW4gUGFzY2FsLiAgKi8KKwkgICAgICBhZGRfcHN5bWJvbF90b19saXN0IChuYW1lc3RyaW5nLCBwIC0gbmFtZXN0cmluZywKKwkJCQkgICBWQVJfTkFNRVNQQUNFLCBMT0NfQ09OU1QsCisJCQkJICAgJm9iamZpbGUtPnN0YXRpY19wc3ltYm9scywgQ1VSX1NZTUJPTF9WQUxVRSwKKwkJCQkgICAwLCBwc3ltdGFiX2xhbmd1YWdlLCBvYmpmaWxlKTsKKwkgICAgICBjb250aW51ZTsKKworCSAgICBjYXNlICdmJzoKKwkgICAgICBDVVJfU1lNQk9MX1ZBTFVFICs9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOworI2lmZGVmIERCWFJFQURfT05MWQorCSAgICAgIC8qIEtlZXAgdHJhY2sgb2YgdGhlIHN0YXJ0IG9mIHRoZSBsYXN0IGZ1bmN0aW9uIHNvIHdlCisJCSBjYW4gaGFuZGxlIGVuZCBvZiBmdW5jdGlvbiBzeW1ib2xzLiAgKi8KKwkgICAgICBsYXN0X2Z1bmN0aW9uX3N0YXJ0ID0gQ1VSX1NZTUJPTF9WQUxVRTsKKwkgICAgICAvKiBLbHVkZ2VzIGZvciBFTEYvU1RBQlMgd2l0aCBTdW4gQUNDICovCisJICAgICAgbGFzdF9mdW5jdGlvbl9uYW1lID0gbmFtZXN0cmluZzsKKyNpZmRlZiBTT0ZVTl9BRERSRVNTX01BWUJFX01JU1NJTkcKKwkgICAgICAvKiBEbyBub3QgZml4IHRleHRsb3c9PTAgZm9yIC5vIG9yIE5MTSBmaWxlcywgYXMgMCBpcyBhIGxlZ2l0CisJCSB2YWx1ZSBmb3IgdGhlIGJvdHRvbSBvZiB0aGUgdGV4dCBzZWcgaW4gdGhvc2UgY2FzZXMuICovCisJICAgICAgaWYgKHBzdCAmJiB0ZXh0bG93X25vdF9zZXQpCisJCXsKKwkJICBwc3QtPnRleHRsb3cgPQorCQkgICAgZmluZF9zdGFiX2Z1bmN0aW9uX2FkZHIgKG5hbWVzdHJpbmcsIHBzdCwgb2JqZmlsZSk7CisJCSAgdGV4dGxvd19ub3Rfc2V0ID0gMDsKKwkJfQorI2VuZGlmCisjaWYgMAorCSAgICAgIGlmIChzdGFydHVwX2ZpbGVfZW5kID09IDApCisJCXN0YXJ0dXBfZmlsZV9lbmQgPSBDVVJfU1lNQk9MX1ZBTFVFOworI2VuZGlmCisJICAgICAgLyogRW5kIGtsdWRnZS4gICovCisKKwkgICAgICAvKiBJbiByZW9yZGVyZWQgZXhlY3V0YWJsZXMgdGhpcyBmdW5jdGlvbiBtYXkgbGllIG91dHNpZGUKKwkJIHRoZSBib3VuZHMgY3JlYXRlZCBieSBOX1NPIHN5bWJvbHMuICBJZiB0aGF0J3MgdGhlIGNhc2UKKwkJIHVzZSB0aGUgYWRkcmVzcyBvZiB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBsb3cgYm91bmQgZm9yCisJCSB0aGUgcGFydGlhbCBzeW1ib2wgdGFibGUuICAqLworCSAgICAgIGlmICh0ZXh0bG93X25vdF9zZXQKKwkJICB8fCAoQ1VSX1NZTUJPTF9WQUxVRSA8IHBzdC0+dGV4dGxvdworCQkgICAgICAmJiBDVVJfU1lNQk9MX1ZBTFVFCisJCQkgICAhPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKSkpCisJCXsKKwkJICBwc3QtPnRleHRsb3cgPSBDVVJfU1lNQk9MX1ZBTFVFOworCQkgIHRleHRsb3dfbm90X3NldCA9IDA7CisJCX0KKyNlbmRpZiAvKiBEQlhSRUFEX09OTFkgKi8KKwkgICAgICBhZGRfcHN5bWJvbF90b19saXN0IChuYW1lc3RyaW5nLCBwIC0gbmFtZXN0cmluZywKKwkJCQkgICBWQVJfTkFNRVNQQUNFLCBMT0NfQkxPQ0ssCisJCQkJICAgJm9iamZpbGUtPnN0YXRpY19wc3ltYm9scywKKwkJCQkgICAwLCBDVVJfU1lNQk9MX1ZBTFVFLAorCQkJCSAgIHBzeW10YWJfbGFuZ3VhZ2UsIG9iamZpbGUpOworCSAgICAgIGNvbnRpbnVlOworCisJICAgICAgLyogR2xvYmFsIGZ1bmN0aW9ucyB3ZXJlIGlnbm9yZWQgaGVyZSwgYnV0IG5vdyB0aGV5CisJICAgICAgICAgYXJlIHB1dCBpbnRvIHRoZSBnbG9iYWwgcHN5bXRhYiBsaWtlIG9uZSB3b3VsZCBleHBlY3QuCisJCSBUaGV5J3JlIGFsc28gaW4gdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlLiAgKi8KKwkgICAgY2FzZSAnRic6CisJICAgICAgQ1VSX1NZTUJPTF9WQUxVRSArPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9URVhUKTsKKyNpZmRlZiBEQlhSRUFEX09OTFkKKwkgICAgICAvKiBLZWVwIHRyYWNrIG9mIHRoZSBzdGFydCBvZiB0aGUgbGFzdCBmdW5jdGlvbiBzbyB3ZQorCQkgY2FuIGhhbmRsZSBlbmQgb2YgZnVuY3Rpb24gc3ltYm9scy4gICovCisJICAgICAgbGFzdF9mdW5jdGlvbl9zdGFydCA9IENVUl9TWU1CT0xfVkFMVUU7CisJICAgICAgLyogS2x1ZGdlcyBmb3IgRUxGL1NUQUJTIHdpdGggU3VuIEFDQyAqLworCSAgICAgIGxhc3RfZnVuY3Rpb25fbmFtZSA9IG5hbWVzdHJpbmc7CisjaWZkZWYgU09GVU5fQUREUkVTU19NQVlCRV9NSVNTSU5HCisJICAgICAgLyogRG8gbm90IGZpeCB0ZXh0bG93PT0wIGZvciAubyBvciBOTE0gZmlsZXMsIGFzIDAgaXMgYSBsZWdpdAorCQkgdmFsdWUgZm9yIHRoZSBib3R0b20gb2YgdGhlIHRleHQgc2VnIGluIHRob3NlIGNhc2VzLiAqLworCSAgICAgIGlmIChwc3QgJiYgdGV4dGxvd19ub3Rfc2V0KQorCQl7CisJCSAgcHN0LT50ZXh0bG93ID0KKwkJICAgIGZpbmRfc3RhYl9mdW5jdGlvbl9hZGRyIChuYW1lc3RyaW5nLCBwc3QsIG9iamZpbGUpOworCQkgIHRleHRsb3dfbm90X3NldCA9IDA7CisJCX0KKyNlbmRpZgorI2lmIDAKKwkgICAgICBpZiAoc3RhcnR1cF9maWxlX2VuZCA9PSAwKQorCQlzdGFydHVwX2ZpbGVfZW5kID0gQ1VSX1NZTUJPTF9WQUxVRTsKKyNlbmRpZgorCSAgICAgIC8qIEVuZCBrbHVkZ2UuICAqLworCSAgICAgIC8qIEluIHJlb3JkZXJlZCBleGVjdXRhYmxlcyB0aGlzIGZ1bmN0aW9uIG1heSBsaWUgb3V0c2lkZQorCQkgdGhlIGJvdW5kcyBjcmVhdGVkIGJ5IE5fU08gc3ltYm9scy4gIElmIHRoYXQncyB0aGUgY2FzZQorCQkgdXNlIHRoZSBhZGRyZXNzIG9mIHRoaXMgZnVuY3Rpb24gYXMgdGhlIGxvdyBib3VuZCBmb3IKKwkJIHRoZSBwYXJ0aWFsIHN5bWJvbCB0YWJsZS4gICovCisJICAgICAgaWYgKHRleHRsb3dfbm90X3NldAorCQkgIHx8IChDVVJfU1lNQk9MX1ZBTFVFIDwgcHN0LT50ZXh0bG93CisJCSAgICAgICYmIENVUl9TWU1CT0xfVkFMVUUKKwkJCSAgICE9IEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpKSkKKwkJeworCQkgIHBzdC0+dGV4dGxvdyA9IENVUl9TWU1CT0xfVkFMVUU7CisJCSAgdGV4dGxvd19ub3Rfc2V0ID0gMDsKKwkJfQorI2VuZGlmIC8qIERCWFJFQURfT05MWSAqLworCSAgICAgIGFkZF9wc3ltYm9sX3RvX2xpc3QgKG5hbWVzdHJpbmcsIHAgLSBuYW1lc3RyaW5nLAorCQkJCSAgIFZBUl9OQU1FU1BBQ0UsIExPQ19CTE9DSywKKwkJCQkgICAmb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLAorCQkJCSAgIDAsIENVUl9TWU1CT0xfVkFMVUUsCisJCQkJICAgcHN5bXRhYl9sYW5ndWFnZSwgb2JqZmlsZSk7CisJICAgICAgY29udGludWU7CisKKwkgICAgICAvKiBUd28gdGhpbmdzIHNob3cgdXAgaGVyZSAoaG9wZWZ1bGx5KTsgc3RhdGljIHN5bWJvbHMgb2YKKwkJIGxvY2FsIHNjb3BlIChzdGF0aWMgdXNlZCBpbnNpZGUgYnJhY2VzKSBvciBleHRlbnNpb25zCisJCSBvZiBzdHJ1Y3R1cmUgc3ltYm9scy4gIFdlIGNhbiBpZ25vcmUgYm90aC4gICovCisJICAgIGNhc2UgJ1YnOgorCSAgICBjYXNlICcoJzoKKwkgICAgY2FzZSAnMCc6CisJICAgIGNhc2UgJzEnOgorCSAgICBjYXNlICcyJzoKKwkgICAgY2FzZSAnMyc6CisJICAgIGNhc2UgJzQnOgorCSAgICBjYXNlICc1JzoKKwkgICAgY2FzZSAnNic6CisJICAgIGNhc2UgJzcnOgorCSAgICBjYXNlICc4JzoKKwkgICAgY2FzZSAnOSc6CisJICAgIGNhc2UgJy0nOgorCSAgICBjYXNlICcjJzogICAvKiBmb3Igc3ltYm9sIGlkZW50aWZpY2F0aW9uICh1c2VkIGluIGxpdmUgcmFuZ2VzKSAqLworCSAgIC8qIGFkZGVkIHRvIHN1cHBvcnQgY2Zyb250IHN0YWJzIHN0cmluZ3MgKi8KKwkgICAgY2FzZSAnWic6CS8qIGZvciBkZWZpbml0aW9uIGNvbnRpbnVhdGlvbnMgKi8KKwkgICAgY2FzZSAnUCc6CS8qIGZvciBwcm90b3R5cGVzICovCisJICAgICAgY29udGludWU7CisKKwkgICAgY2FzZSAnOic6CisJICAgICAgLyogSXQgaXMgYSBDKysgbmVzdGVkIHN5bWJvbC4gIFdlIGRvbid0IG5lZWQgdG8gcmVjb3JkIGl0CisJCSAoSSBkb24ndCB0aGluayk7IGlmIHdlIHRyeSB0byBsb29rIHVwIGZvbzo6YmFyOjpiYXosCisJCSB0aGVuIHN5bWJvbHMgZm9yIHRoZSBzeW10YWIgY29udGFpbmluZyBmb28gc2hvdWxkIGdldAorCQkgcmVhZCBpbiwgSSB0aGluay4gICovCisJICAgICAgLyogU29tZW9uZSBzYXlzIHN1biBjYyBwdXRzIG91dCBzeW1ib2xzIGxpa2UKKwkJIC9mb28vYmF6L21hY2xpYjo6L3Vzci9sb2NhbC9iaW4vbWFjbGliLAorCQkgd2hpY2ggd291bGQgZ2V0IGhlcmUgd2l0aCBhIHN5bWJvbCB0eXBlIG9mICc6Jy4gICovCisJICAgICAgY29udGludWU7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICAvKiBVbmV4cGVjdGVkIHN5bWJvbCBkZXNjcmlwdG9yLiAgVGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudCBzdGFicworCQkgb2YgYSBjb250aW51ZWQgc3RhYiBjYW4gc2hvdyB1cCBoZXJlLiAgVGhlIHF1ZXN0aW9uIGlzCisJCSB3aGV0aGVyIHRoZXkgZXZlciBjYW4gbWltaWMgYSBub3JtYWwgc3RhYi0taXQgd291bGQgYmUKKwkJIG5pY2UgaWYgbm90LCBzaW5jZSB3ZSBjZXJ0YWlubHkgZG9uJ3Qgd2FudCB0byBzcGVuZCB0aGUKKwkJIHRpbWUgc2VhcmNoaW5nIHRvIHRoZSBlbmQgb2YgZXZlcnkgc3RyaW5nIGxvb2tpbmcgZm9yCisJCSBhIGJhY2tzbGFzaC4gICovCisKKwkgICAgICBjb21wbGFpbiAoJnVua25vd25fc3ltY2hhcl9jb21wbGFpbnQsIHBbMV0pOworCisJICAgICAgLyogSWdub3JlIGl0OyBwZXJoYXBzIGl0IGlzIGFuIGV4dGVuc2lvbiB0aGF0IHdlIGRvbid0CisJCSBrbm93IGFib3V0LiAgKi8KKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCisJY2FzZSBOX0VYQ0w6CisjaWZkZWYgREJYUkVBRF9PTkxZCisKKwkgIFNFVF9OQU1FU1RSSU5HKCk7CisKKwkgIC8qIEZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgYmluY2wgYW5kIG1hcmsgdGhhdCBwc3ltdGFiIG9uIHRoZQorCSAgICAgcHN5bXRhYiBkZXBlbmRlbmN5IGxpc3QgKi8KKwkgIHsKKwkgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpuZWVkZWRfcHN0ID0KKwkgICAgICBmaW5kX2NvcnJlc3BvbmRpbmdfYmluY2xfcHN5bXRhYiAobmFtZXN0cmluZywgQ1VSX1NZTUJPTF9WQUxVRSk7CisKKwkgICAgLyogSWYgdGhpcyBpbmNsdWRlIGZpbGUgd2FzIGRlZmluZWQgZWFybGllciBpbiB0aGlzIGZpbGUsCisJICAgICAgIGxlYXZlIGl0IGFsb25lLiAgKi8KKwkgICAgaWYgKG5lZWRlZF9wc3QgPT0gcHN0KSBjb250aW51ZTsKKworCSAgICBpZiAobmVlZGVkX3BzdCkKKwkgICAgICB7CisJCWludCBpOworCQlpbnQgZm91bmQgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBkZXBlbmRlbmNpZXNfdXNlZDsgaSsrKQorCQkgIGlmIChkZXBlbmRlbmN5X2xpc3RbaV0gPT0gbmVlZGVkX3BzdCkKKwkJICAgIHsKKwkJICAgICAgZm91bmQgPSAxOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKworCQkvKiBJZiBpdCdzIGFscmVhZHkgaW4gdGhlIGxpc3QsIHNraXAgdGhlIHJlc3QuICAqLworCQlpZiAoZm91bmQpIGNvbnRpbnVlOworCisJCWRlcGVuZGVuY3lfbGlzdFtkZXBlbmRlbmNpZXNfdXNlZCsrXSA9IG5lZWRlZF9wc3Q7CisJCWlmIChkZXBlbmRlbmNpZXNfdXNlZCA+PSBkZXBlbmRlbmNpZXNfYWxsb2NhdGVkKQorCQkgIHsKKwkJICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKm9yaWcgPSBkZXBlbmRlbmN5X2xpc3Q7CisJCSAgICBkZXBlbmRlbmN5X2xpc3QgPQorCQkgICAgICAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICoqKQorCQkJYWxsb2NhICgoZGVwZW5kZW5jaWVzX2FsbG9jYXRlZCAqPSAyKQorCQkJCSogc2l6ZW9mIChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworCQkgICAgbWVtY3B5ICgoUFRSKWRlcGVuZGVuY3lfbGlzdCwgKFBUUilvcmlnLAorCQkJICAgKGRlcGVuZGVuY2llc191c2VkCisJCQkgICAgKiBzaXplb2YgKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSkpOworI2lmZGVmIERFQlVHX0lORk8KKwkJICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIkhhZCB0byByZWFsbG9jYXRlIGRlcGVuZGVuY3kgbGlzdC5cbiIpOworCQkgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiTmV3IGRlcGVuZGVuY2llcyBhbGxvY2F0ZWQ6ICVkXG4iLAorCQkJICAgICBkZXBlbmRlbmNpZXNfYWxsb2NhdGVkKTsKKyNlbmRpZgorCQkgIH0KKwkgICAgICB9CisJICB9CisjZW5kaWYgLyogREJYUkVBRF9PTkxZICovCisJICBjb250aW51ZTsKKworCWNhc2UgTl9FTkRNOgorI2lmZGVmIFNPRlVOX0FERFJFU1NfTUFZQkVfTUlTU0lORworCSAgLyogU29sYXJpcyAyIGVuZCBvZiBtb2R1bGUsIGZpbmlzaCBjdXJyZW50IHBhcnRpYWwgc3ltYm9sIHRhYmxlLgorCSAgICAgRU5EX1BTWU1UQUIgd2lsbCBzZXQgcHN0LT50ZXh0aGlnaCB0byB0aGUgcHJvcGVyIHZhbHVlLCB3aGljaAorCSAgICAgaXMgbmVjZXNzYXJ5IGlmIGEgbW9kdWxlIGNvbXBpbGVkIHdpdGhvdXQgZGVidWdnaW5nIGluZm8KKwkgICAgIGZvbGxvd3MgdGhpcyBtb2R1bGUuICAqLworCSAgaWYgKHBzdCkKKwkgICAgeworCSAgICAgIEVORF9QU1lNVEFCIChwc3QsIHBzeW10YWJfaW5jbHVkZV9saXN0LCBpbmNsdWRlc191c2VkLAorCQkJICAgc3ltbnVtICogc3ltYm9sX3NpemUsCisJCQkgICAoQ09SRV9BRERSKSAwLAorCQkJICAgZGVwZW5kZW5jeV9saXN0LCBkZXBlbmRlbmNpZXNfdXNlZCwgdGV4dGxvd19ub3Rfc2V0KTsKKwkgICAgICBwc3QgPSAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopIDA7CisJICAgICAgaW5jbHVkZXNfdXNlZCA9IDA7CisJICAgICAgZGVwZW5kZW5jaWVzX3VzZWQgPSAwOworCSAgICB9CisjZW5kaWYKKwkgIGNvbnRpbnVlOworCisJY2FzZSBOX1JCUkFDOgorI2lmZGVmIEhBTkRMRV9SQlJBQworCSAgSEFORExFX1JCUkFDKENVUl9TWU1CT0xfVkFMVUUpOworCSAgY29udGludWU7CisjZW5kaWYKKwljYXNlIE5fRUlOQ0w6CisJY2FzZSBOX0RTTElORToKKwljYXNlIE5fQlNMSU5FOgorCWNhc2UgTl9TU1lNOgkJLyogQ2xhaW06IFN0cnVjdHVyZSBvciB1bmlvbiBlbGVtZW50LgorCQkJCSAgIEhvcGVmdWxseSwgSSBjYW4gaWdub3JlIHRoaXMuICAqLworCWNhc2UgTl9FTlRSWToJCS8qIEFsdGVybmF0ZSBlbnRyeSBwb2ludDsgY2FuIGlnbm9yZS4gKi8KKwljYXNlIE5fTUFJTjoJCS8qIENhbiBkZWZpbml0ZWx5IGlnbm9yZSB0aGlzLiAgICovCisJY2FzZSBOX0NBVENIOgkJLyogVGhlc2UgYXJlIEdOVSBDKysgZXh0ZW5zaW9ucyAqLworCWNhc2UgTl9FSERFQ0w6CQkvKiB0aGF0IGNhbiBzYWZlbHkgYmUgaWdub3JlZCBoZXJlLiAqLworCWNhc2UgTl9MRU5HOgorCWNhc2UgTl9CQ09NTToKKwljYXNlIE5fRUNPTU06CisJY2FzZSBOX0VDT01MOgorCWNhc2UgTl9GTkFNRToKKwljYXNlIE5fU0xJTkU6CisJY2FzZSBOX1JTWU06CisJY2FzZSBOX1BTWU06CisJY2FzZSBOX0xCUkFDOgorCWNhc2UgTl9OU1lNUzoJCS8qIFVsdHJpeCA0LjA6IHN5bWJvbCBjb3VudCAqLworCWNhc2UgTl9ERUZEOgkJLyogR05VIE1vZHVsYS0yICovCisJY2FzZSBOX0FMSUFTOgkJLyogU3VuUHJvIEY3NzogYWxpYXMgbmFtZSwgaWdub3JlIGZvciBub3cuICAqLworCisJY2FzZSBOX09CSjoJCS8qIHVzZWxlc3MgdHlwZXMgZnJvbSBTb2xhcmlzICovCisJY2FzZSBOX09QVDoKKwkgIC8qIFRoZXNlIHN5bWJvbHMgYXJlbid0IGludGVyZXN0aW5nOyBkb24ndCB3b3JyeSBhYm91dCB0aGVtICovCisKKwkgIGNvbnRpbnVlOworCisJZGVmYXVsdDoKKwkgIC8qIElmIHdlIGhhdmVuJ3QgZm91bmQgaXQgeWV0LCBpZ25vcmUgaXQuICBJdCdzIHByb2JhYmx5IHNvbWUKKwkgICAgIG5ldyB0eXBlIHdlIGRvbid0IGtub3cgYWJvdXQgeWV0LiAgKi8KKwkgIGNvbXBsYWluICgmdW5rbm93bl9zeW10eXBlX2NvbXBsYWludCwKKwkJICAgIGxvY2FsX2hleF9zdHJpbmcgKENVUl9TWU1CT0xfVFlQRSkpOworCSAgY29udGludWU7CisJfQpkaWZmIC0tZ2l0IGEvZ2RiL3BwYy1iZG0uYyBiL2dkYi9wcGMtYmRtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiNmFkZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9wcGMtYmRtLmMKQEAgLTAsMCArMSwzODcgQEAKKy8qIFJlbW90ZSB0YXJnZXQgY29tbXVuaWNhdGlvbnMgZm9yIHRoZSBNYWNyYWlnb3IgU3lzdGVtcyBCRE0gV2lnZ2xlcgorICAgdGFsa2luZyB0byBhIE1vdG9yb2xhIFBQQyA4eHggQURTIGJvYXJkCisgICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgIndhaXQuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJvYmpmaWxlcy5oIgorI2luY2x1ZGUgImdkYi1zdGFicy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgInNlcmlhbC5oIgorI2luY2x1ZGUgIm9jZC5oIgorCitzdGF0aWMgdm9pZCBiZG1fcHBjX29wZW4gUEFSQU1TICgoY2hhciAqbmFtZSwgaW50IGZyb21fdHR5KSk7CisKK3N0YXRpYyBpbnQgYmRtX3BwY193YWl0IFBBUkFNUyAoKGludCBwaWQsCisJCQkJIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqdGFyZ2V0X3N0YXR1cykpOworCitzdGF0aWMgdm9pZCBiZG1fcHBjX2ZldGNoX3JlZ2lzdGVycyBQQVJBTVMgKChpbnQgcmVnbm8pKTsKKworc3RhdGljIHZvaWQgYmRtX3BwY19zdG9yZV9yZWdpc3RlcnMgUEFSQU1TICgoaW50IHJlZ25vKSk7CisKK2V4dGVybiBzdHJ1Y3QgdGFyZ2V0X29wcyBiZG1fcHBjX29wczsJLyogRm9yd2FyZCBkZWNsICovCisMCisvKiNkZWZpbmUgQkRNX05VTV9SRUdTIDcxKi8KKyNkZWZpbmUgQkRNX05VTV9SRUdTIDI0CisKKyNkZWZpbmUgQkRNX1JFR01BUCBcCisJMjA0OCwgMjA0OSwgMjA1MCwgMjA1MSwgMjA1MiwgMjA1MywgMjA1NCwgMjA1NSwgLyogcjAtcjcgKi8gXAorCTIwNTYsIDIwNTcsIDIwNTgsIDIwNTksIDIwNjAsIDIwNjEsIDIwNjIsIDIwNjMsIC8qIHI4LXIxNSAqLyBcCisJMjA2NCwgMjA2NSwgMjA2NiwgMjA2NywgMjA2OCwgMjA2OSwgMjA3MCwgMjA3MSwgLyogcjE2LXIyMyAqLyBcCisJMjA3MiwgMjA3MywgMjA3NCwgMjA3NSwgMjA3NiwgMjA3NywgMjA3OCwgMjA3OSwgLyogcjI0LXIzMSAqLyBcCitcCisJMjA4MCwgMjA4MiwgMjA4NCwgMjA4NiwgMjA4OCwgMjA5MCwgMjA5MiwgMjA5NCwgLyogZnAwLT5mcDggKi8gXAorCTIwOTYsIDIwOTgsIDIxMDAsIDIxMDIsIDIxMDQsIDIxMDYsIDIxMDgsIDIxMTAsIC8qIGZwMC0+ZnA4ICovIFwKKwkyMTEyLCAyMTE0LCAyMTE2LCAyMTE4LCAyMTIwLCAyMTIyLCAyMTI0LCAyMTI2LCAvKiBmcDAtPmZwOCAqLyBcCisJMjEyOCwgMjEzMCwgMjEzMiwgMjEzNCwgMjEzNiwgMjEzOCwgMjE0MCwgMjE0MiwgLyogZnAwLT5mcDggKi8gXAorXAorCTI2LCAgICAgICAgLyogcGMgKFNSUjAgKFNQUiAyNikpICovIFwKKwkyMTQ2LCAgICAgIC8qIHBzIChNU1IpICovIFwKKwkyMTQ0LCAgICAgIC8qIGNuZCAoQ1IpICovIFwKKwk4LCAgICAgICAgIC8qIGxyIChTUFIgOCkgKi8gXAorCTksICAgICAgICAgLyogY250IChDVFIgKFNQUiA5KSkgKi8gXAorCTEsICAgICAgICAgLyogeGVyIChTUFIgMSkgKi8gXAorCTAsICAgICAgICAgLyogbXEgKFNQUiAwKSAqLworCisMCitjaGFyIG5vd2F0Y2hkb2dbNF0gPSB7MHhmZiwweGZmLDB4ZmYsMHg4OH07CisKKy8qIE9wZW4gYSBjb25uZWN0aW9uIHRvIGEgcmVtb3RlIGRlYnVnZ2VyLgorICAgTkFNRSBpcyB0aGUgZmlsZW5hbWUgdXNlZCBmb3IgY29tbXVuaWNhdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCitiZG1fcHBjX29wZW4gKG5hbWUsIGZyb21fdHR5KQorICAgICBjaGFyICpuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIENPUkVfQUREUiB3YXRjaGRvZ2FkZHIgPSAweGZmMDAwMDA0OworCisgIG9jZF9vcGVuIChuYW1lLCBmcm9tX3R0eSwgT0NEX1RBUkdFVF9NT1RPX1BQQywgJmJkbV9wcGNfb3BzKTsKKworICAvKiBXZSB3YW50IGludGVycnVwdHMgdG8gZHJvcCB1cyBpbnRvIGRlYnVnZ2luZyBtb2RlLiAqLworICAvKiBNb2RpZnkgdGhlIERFUiByZWdpc3RlciB0byBhY2NvbXBsaXNoIHRoaXMuICovCisgIG9jZF93cml0ZV9iZG1fcmVnaXN0ZXIgKDE0OSwgMHgyMDAyNDAwMCk7CisKKyAgLyogRGlzYWJsZSB3YXRjaGRvZyB0aW1lciBvbiB0aGUgYm9hcmQgKi8KKyAgb2NkX3dyaXRlX2J5dGVzICh3YXRjaGRvZ2FkZHIsIG5vd2F0Y2hkb2csIDQpOworfQorCisvKiBXYWl0IHVudGlsIHRoZSByZW1vdGUgbWFjaGluZSBzdG9wcywgdGhlbiByZXR1cm4sCisgICBzdG9yaW5nIHN0YXR1cyBpbiBTVEFUVVMganVzdCBhcyBgd2FpdCcgd291bGQuCisgICBSZXR1cm5zICJwaWQiICh0aG91Z2ggaXQncyBub3QgY2xlYXIgd2hhdCwgaWYgYW55dGhpbmcsIHRoYXQKKyAgIG1lYW5zIGluIHRoZSBjYXNlIG9mIHRoaXMgdGFyZ2V0KS4gICovCisKK3N0YXRpYyBpbnQKK2JkbV9wcGNfd2FpdCAocGlkLCB0YXJnZXRfc3RhdHVzKQorICAgICBpbnQgcGlkOworICAgICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKnRhcmdldF9zdGF0dXM7Cit7CisgIGludCBzdG9wX3JlYXNvbjsKKworICB0YXJnZXRfc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisKKyAgc3RvcF9yZWFzb24gPSBvY2Rfd2FpdCAoKTsKKworICBpZiAoc3RvcF9yZWFzb24pCisgICAgeworICAgICAgdGFyZ2V0X3N0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9JTlQ7CisgICAgICByZXR1cm4gaW5mZXJpb3JfcGlkOworICAgIH0KKworICB0YXJnZXRfc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1RSQVA7IC8qIFhYWCBmb3Igbm93ICovCisKKyNpZiAwCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGVjciwgZGVyOworCisgICAgZWNyID0gb2NkX3JlYWRfYmRtX3JlZ2lzdGVyICgxNDgpOyAvKiBSZWFkIHRoZSBleGNlcHRpb24gY2F1c2UgcmVnaXN0ZXIgKi8KKyAgICBkZXIgPSBvY2RfcmVhZF9iZG1fcmVnaXN0ZXIgKDE0OSk7IC8qIFJlYWQgdGhlIGRlYnVnIGVuYWJsZXMgcmVnaXN0ZXIgKi8KKyAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRvdXQsICJlY3IgPSAweCV4LCBkZXIgPSAweCV4XG4iLCBlY3IsIGRlcik7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBpbmZlcmlvcl9waWQ7Cit9CisMCitzdGF0aWMgaW50IGJkbV9yZWdtYXBbXSA9IHtCRE1fUkVHTUFQfTsKKworLyogUmVhZCB0aGUgcmVtb3RlIHJlZ2lzdGVycyBpbnRvIHJlZ3MuCisgICBGZXRjaCByZWdpc3RlciBSRUdOTywgb3IgYWxsIHJlZ2lzdGVycyBpZiBSRUdOTyA9PSAtMQorCisgICBUaGUgV2lnZ2xlciB1c2VzIHRoZSBmb2xsb3dpbmcgY29kZXMgdG8gYWNjZXNzIHRoZSByZWdpc3RlcnM6CisKKyAgIDAgLT4gMTAyMwkJU1BSIDAgLT4gMTAyMworCTAgLSBTUFIgMCAtIE1RCisJMSAtIFNQUiAxIC0gWEVSCisJOCAtIFNQUiA4IC0gTFIKKwk5IC0gU1BSIDkgLSBDVFIgKGtub3duIGFzIGNudCBpbiBHREIpCisJMjYgLSBTUFIgMjYgLSBTUlIwIC0gcGMKKyAgIDEwMjQgLT4gMjA0NwkJRENSIDAgLT4gRENSIDEwMjMgKElCTSBQUEMgNHh4IG9ubHkpCisgICAyMDQ4IC0+IDIwNzkJCVIwIC0+IFIzMQorICAgMjA4MCAtPiAyMTQzCQlGUDAgLT4gRlAzMSAoNjQgYml0IHJlZ3MpIChJQk0gUFBDIDV4eCBvbmx5KQorICAgMjE0NAkJCUNSIChrbm93biBhcyBjbmQgaW4gR0RCKQorICAgMjE0NQkJCUZQQ1NSCisgICAyMTQ2CQkJTVNSIChrbm93biBhcyBwcyBpbiBHREIpCisgKi8KKworc3RhdGljIHZvaWQKK2JkbV9wcGNfZmV0Y2hfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciAqcmVncywgKmJlZ2lucmVncywgKmVuZHJlZ3MsICphbG1vc3RyZWdzOworICB1bnNpZ25lZCBjaGFyIG1pZHJlZ3NbMzJdOworICB1bnNpZ25lZCBjaGFyIG1xcmVnWzFdOworICBpbnQgZmlyc3RfcmVnbm8sIGxhc3RfcmVnbm87CisgIGludCBmaXJzdF9iZG1fcmVnbm8sIGxhc3RfYmRtX3JlZ25vOworICBpbnQgcmVnbGVuLCBiZWdpbnJlZ2xlbiwgZW5kcmVnbGVuOworCisjaWYgMQorICBmb3IgKGkgPSAwOyBpIDwgKEZQTEFTVF9SRUdOVU0gLSBGUDBfUkVHTlVNICsgMSk7IGkrKykKKyAgICB7CisgICAgICBtaWRyZWdzW2ldID0gLTE7CisgICAgfQorICBtcXJlZ1swXSA9IC0xOworI2VuZGlmCisKKyAgaWYgKHJlZ25vID09IC0xKQorICAgIHsKKyAgICAgIGZpcnN0X3JlZ25vID0gMDsKKyAgICAgIGxhc3RfcmVnbm8gPSBOVU1fUkVHUyAtIDE7CisKKyAgICAgIGZpcnN0X2JkbV9yZWdubyA9IDA7CisgICAgICBsYXN0X2JkbV9yZWdubyA9IEJETV9OVU1fUkVHUyAtIDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZmlyc3RfcmVnbm8gPSByZWdubzsKKyAgICAgIGxhc3RfcmVnbm8gPSByZWdubzsKKworICAgICAgZmlyc3RfYmRtX3JlZ25vID0gYmRtX3JlZ21hcCBbcmVnbm9dOworICAgICAgbGFzdF9iZG1fcmVnbm8gPSBiZG1fcmVnbWFwIFtyZWdub107CisgICAgfQorCisgIGlmIChmaXJzdF9iZG1fcmVnbm8gPT0gLTEpCisgICAgeworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChmaXJzdF9yZWdubywgTlVMTCk7CisgICAgICByZXR1cm47CQkJLyogVW5zdXBwb3J0ZWQgcmVnaXN0ZXIgKi8KKyAgICB9CisKKyNpZiAxCisgIC8qIENhbid0IGFzayBmb3IgZmxvYXRpbmcgcG9pbnQgcmVncyBvbiBwcGMgOHh4LCBhbHNvIG5lZWQgdG8KKyAgICAgYXZvaWQgYXNraW5nIGZvciB0aGUgbXEgcmVnaXN0ZXIuICovCisgIGlmIChmaXJzdF9yZWdubyA9PSBsYXN0X3JlZ25vKQkvKiBvbmx5IHdhbnQgb25lIHJlZyAqLworICAgIHsKKy8qICAgICAgcHJpbnRmKCJBc2tpbmcgZm9yIHJlZ2lzdGVyICVkXG4iLCBmaXJzdF9yZWdubyk7ICovCisKKyAgICAgIC8qIGlmIGFza2luZyBmb3IgYW4gaW52YWxpZCByZWdpc3RlciAqLworICAgICAgaWYgKChmaXJzdF9yZWdubyA9PSBNUV9SRUdOVU0pIHx8CisgICAgICAgICAgKChmaXJzdF9yZWdubyA+PSBGUDBfUkVHTlVNKSAmJiAoZmlyc3RfcmVnbm8gPD0gRlBMQVNUX1JFR05VTSkpKQorCXsKKy8qICAgICAgICAgIHByaW50ZigiaW52YWxpZCByZWcgcmVxdWVzdCFcbiIpOyAqLworICAgICAgICAgIHN1cHBseV9yZWdpc3RlciAoZmlyc3RfcmVnbm8sIE5VTEwpOworICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgLyogVW5zdXBwb3J0ZWQgcmVnaXN0ZXIgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorCXsKKyAgICAgICAgICByZWdzID0gb2NkX3JlYWRfYmRtX3JlZ2lzdGVycyAoZmlyc3RfYmRtX3JlZ25vLAorCQkJCQkJbGFzdF9iZG1fcmVnbm8sICZyZWdsZW4pOworICAgICAgICB9CisgICAgfQorICBlbHNlCQkvKiB3YW50IGFsbCByZWdzICovCisgICAgeworLyogICAgICBwcmludGYoIkFza2luZyBmb3IgcmVnaXN0ZXJzICVkIHRvICVkXG4iLCBmaXJzdF9yZWdubywgbGFzdF9yZWdubyk7ICovCisgICAgICBiZWdpbnJlZ3MgPSBvY2RfcmVhZF9iZG1fcmVnaXN0ZXJzIChmaXJzdF9iZG1fcmVnbm8sCisJCQkJCUZQMF9SRUdOVU0gLSAxLCAmYmVnaW5yZWdsZW4pOworICAgICAgZW5kcmVncyA9IChzdHJjYXQgKG1pZHJlZ3MsIAorCQkJCW9jZF9yZWFkX2JkbV9yZWdpc3RlcnMgKEZQTEFTVF9SRUdOVU0gKyAxLAorCQkJCQlsYXN0X2JkbV9yZWdubyAtIDEsICZlbmRyZWdsZW4pKSk7CisgICAgICBhbG1vc3RyZWdzID0gKHN0cmNhdCAoYmVnaW5yZWdzLCBlbmRyZWdzKSk7CisgICAgICByZWdzID0gKHN0cmNhdCAoYWxtb3N0cmVncywgbXFyZWcpKTsKKyAgICAgIHJlZ2xlbiA9IGJlZ2lucmVnbGVuICsgMzIgKyBlbmRyZWdsZW4gKyAxOworICAgIH0KKworI2VuZGlmCisjaWYgMAorICByZWdzID0gb2NkX3JlYWRfYmRtX3JlZ2lzdGVycyAoZmlyc3RfYmRtX3JlZ25vLCBsYXN0X2JkbV9yZWdubywgJnJlZ2xlbik7CisjZW5kaWYKKworICBmb3IgKGkgPSBmaXJzdF9yZWdubzsgaSA8PSBsYXN0X3JlZ25vOyBpKyspCisgICAgeworICAgICAgaW50IGJkbV9yZWdubywgcmVnb2Zmc2V0OworCisgICAgICBiZG1fcmVnbm8gPSBiZG1fcmVnbWFwIFtpXTsKKyAgICAgIGlmIChiZG1fcmVnbm8gIT0gLTEpCisJeworCSAgcmVnb2Zmc2V0ID0gYmRtX3JlZ25vIC0gZmlyc3RfYmRtX3JlZ25vOworCisJICBpZiAocmVnb2Zmc2V0ID49IHJlZ2xlbiAvIDQpCisJICAgIGNvbnRpbnVlOworCisJICBzdXBwbHlfcmVnaXN0ZXIgKGksIHJlZ3MgKyA0ICogcmVnb2Zmc2V0KTsKKwl9CisgICAgICBlbHNlCisJc3VwcGx5X3JlZ2lzdGVyIChpLCBOVUxMKTsgLyogVW5zdXBwb3J0ZWQgcmVnaXN0ZXIgKi8KKyAgICB9Cit9CisKKy8qIFN0b3JlIHJlZ2lzdGVyIFJFR05PLCBvciBhbGwgcmVnaXN0ZXJzIGlmIFJFR05PID09IC0xLCBmcm9tIHRoZSBjb250ZW50cworICAgb2YgUkVHSVNURVJTLiAgRklYTUU6IGlnbm9yZXMgZXJyb3JzLiAgKi8KKworc3RhdGljIHZvaWQKK2JkbV9wcGNfc3RvcmVfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBpbnQgaTsKKyAgaW50IGZpcnN0X3JlZ25vLCBsYXN0X3JlZ25vOworICBpbnQgZmlyc3RfYmRtX3JlZ25vLCBsYXN0X2JkbV9yZWdubzsKKworICBpZiAocmVnbm8gPT0gLTEpCisgICAgeworICAgICAgZmlyc3RfcmVnbm8gPSAwOworICAgICAgbGFzdF9yZWdubyA9IE5VTV9SRUdTIC0gMTsKKworICAgICAgZmlyc3RfYmRtX3JlZ25vID0gMDsKKyAgICAgIGxhc3RfYmRtX3JlZ25vID0gQkRNX05VTV9SRUdTIC0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmaXJzdF9yZWdubyA9IHJlZ25vOworICAgICAgbGFzdF9yZWdubyA9IHJlZ25vOworCisgICAgICBmaXJzdF9iZG1fcmVnbm8gPSBiZG1fcmVnbWFwIFtyZWdub107CisgICAgICBsYXN0X2JkbV9yZWdubyA9IGJkbV9yZWdtYXAgW3JlZ25vXTsKKyAgICB9CisKKyAgaWYgKGZpcnN0X2JkbV9yZWdubyA9PSAtMSkKKyAgICByZXR1cm47CQkJLyogVW5zdXBwb3J0ZWQgcmVnaXN0ZXIgKi8KKworICBmb3IgKGkgPSBmaXJzdF9yZWdubzsgaSA8PSBsYXN0X3JlZ25vOyBpKyspCisgICAgeworICAgICAgaW50IGJkbV9yZWdubzsKKworICAgICAgYmRtX3JlZ25vID0gYmRtX3JlZ21hcCBbaV07CisKKyAgICAgIC8qIG9ubHkgYXR0ZW1wdCB0byB3cml0ZSBpZiBpdCdzIGEgdmFsaWQgcHBjIDh4eCByZWdpc3RlciAqLworICAgICAgLyogKG5lZWQgdG8gYXZvaWQgRlAgcmVncyBhbmQgTVEgcmVnKSAqLworICAgICAgaWYgKChpICE9IE1RX1JFR05VTSkgJiYgKChpIDwgRlAwX1JFR05VTSkgfHwgKGkgPiBGUExBU1RfUkVHTlVNKSkpCisJeworLyogICAgICAgICAgcHJpbnRmKCJ3cml0ZSB2YWxpZCByZWcgJWRcbiIsIGJkbV9yZWdubyk7ICovCisgICAgICAgICAgb2NkX3dyaXRlX2JkbV9yZWdpc3RlcnMgKGJkbV9yZWdubywgcmVnaXN0ZXJzICsgUkVHSVNURVJfQllURSAoaSksIDQpOworICAgICAgICB9CisvKgorICAgICAgZWxzZSBpZiAoaSA9PSBNUV9SRUdOVU0pCisgICAgICAgIHByaW50ZigiZG9uJ3Qgd3JpdGUgaW52YWxpZCByZWcgJWQgKE1RX1JFR05VTSlcbiIsIGJkbV9yZWdubyk7CisgICAgICBlbHNlCisgICAgICAgIHByaW50ZigiZG9uJ3Qgd3JpdGUgaW52YWxpZCByZWcgJWRcbiIsIGJkbV9yZWdubyk7CisqLworICAgIH0KK30KKwwKKy8qIERlZmluZSB0aGUgdGFyZ2V0IHN1YnJvdXRpbmUgbmFtZXMgKi8KKworc3RydWN0IHRhcmdldF9vcHMgYmRtX3BwY19vcHMgOworCitzdGF0aWMgdm9pZCAKK2luaXRfYmRtX3BwY19vcHModm9pZCkKK3sKKyAgYmRtX3BwY19vcHMudG9fc2hvcnRuYW1lID0gICAib2NkIjsJCQorICBiZG1fcHBjX29wcy50b19sb25nbmFtZSA9ICAgIlJlbW90ZSB0YXJnZXQgd2l0aCBPbi1DaGlwIERlYnVnZ2luZyI7CisgIGJkbV9wcGNfb3BzLnRvX2RvYyA9ICAgIlVzZSBhIHJlbW90ZSB0YXJnZXQgd2l0aCBPbi1DaGlwIERlYnVnZ2luZy4gIFRvIHVzZSBhIHRhcmdldCBib3g7XG5cCitzcGVjaWZ5IHRoZSBzZXJpYWwgZGV2aWNlIGl0IGlzIGNvbm5lY3RlZCB0byAoZS5nLiAvZGV2L3R0eWEpLiAgVG8gdXNlXG5cCithIHdpZ2dsZXIsIHNwZWNpZnkgd2lnZ2xlciBhbmQgdGhlbiB0aGUgcG9ydCBpdCBpcyBjb25uZWN0ZWQgdG9cblwKKyhlLmcuIHdpZ2dsZXIgbHB0MSkuIiA7CS8qIHRvX2RvYyAqLworICBiZG1fcHBjX29wcy50b19vcGVuID0gICBiZG1fcHBjX29wZW47CQorICBiZG1fcHBjX29wcy50b19jbG9zZSA9ICAgb2NkX2Nsb3NlOwkKKyAgYmRtX3BwY19vcHMudG9fYXR0YWNoID0gICBOVUxMOworICBiZG1fcHBjX29wcy50b19wb3N0X2F0dGFjaCA9IE5VTEw7CisgIGJkbV9wcGNfb3BzLnRvX3JlcXVpcmVfYXR0YWNoID0gTlVMTDsKKyAgYmRtX3BwY19vcHMudG9fZGV0YWNoID0gICBvY2RfZGV0YWNoOworICBiZG1fcHBjX29wcy50b19yZXF1aXJlX2RldGFjaCA9IE5VTEw7CisgIGJkbV9wcGNfb3BzLnRvX3Jlc3VtZSA9ICAgb2NkX3Jlc3VtZTsJCisgIGJkbV9wcGNfb3BzLnRvX3dhaXQgID0gICBiZG1fcHBjX3dhaXQ7CisgIGJkbV9wcGNfb3BzLnRvX3Bvc3Rfd2FpdCA9IE5VTEw7CisgIGJkbV9wcGNfb3BzLnRvX2ZldGNoX3JlZ2lzdGVycyAgPSAgIGJkbV9wcGNfZmV0Y2hfcmVnaXN0ZXJzOworICBiZG1fcHBjX29wcy50b19zdG9yZV9yZWdpc3RlcnMgID0gICBiZG1fcHBjX3N0b3JlX3JlZ2lzdGVyczsKKyAgYmRtX3BwY19vcHMudG9fcHJlcGFyZV90b19zdG9yZSA9ICAgb2NkX3ByZXBhcmVfdG9fc3RvcmU7CQorICBiZG1fcHBjX29wcy50b194ZmVyX21lbW9yeSAgPSAgIG9jZF94ZmVyX21lbW9yeTsJCQorICBiZG1fcHBjX29wcy50b19maWxlc19pbmZvICA9ICAgb2NkX2ZpbGVzX2luZm87CQkKKyAgYmRtX3BwY19vcHMudG9faW5zZXJ0X2JyZWFrcG9pbnQgPSAgIG9jZF9pbnNlcnRfYnJlYWtwb2ludDsJCisgIGJkbV9wcGNfb3BzLnRvX3JlbW92ZV9icmVha3BvaW50ID0gICBvY2RfcmVtb3ZlX2JyZWFrcG9pbnQ7CQorICBiZG1fcHBjX29wcy50b190ZXJtaW5hbF9pbml0ICA9ICAgTlVMTDsJCQkKKyAgYmRtX3BwY19vcHMudG9fdGVybWluYWxfaW5mZXJpb3IgPSAgIE5VTEw7CQkJCisgIGJkbV9wcGNfb3BzLnRvX3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCA9ICAgTlVMTDsJCQorICBiZG1fcHBjX29wcy50b190ZXJtaW5hbF9vdXJzICA9ICAgTlVMTDsJCQkKKyAgYmRtX3BwY19vcHMudG9fdGVybWluYWxfaW5mbyAgPSAgIE5VTEw7CQkJCisgIGJkbV9wcGNfb3BzLnRvX2tpbGwgID0gICBvY2Rfa2lsbDsJCQorICBiZG1fcHBjX29wcy50b19sb2FkICA9ICAgb2NkX2xvYWQ7CQkKKyAgYmRtX3BwY19vcHMudG9fbG9va3VwX3N5bWJvbCA9ICAgTlVMTDsJCisgIGJkbV9wcGNfb3BzLnRvX2NyZWF0ZV9pbmZlcmlvciA9ICAgb2NkX2NyZWF0ZV9pbmZlcmlvcjsKKyAgYmRtX3BwY19vcHMudG9fcG9zdF9zdGFydHVwX2luZmVyaW9yID0gTlVMTDsKKyAgYmRtX3BwY19vcHMudG9fYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvciA9IE5VTEw7CisgIGJkbV9wcGNfb3BzLnRvX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IgPSBOVUxMOyAgICAgICAgICAKKyAgYmRtX3BwY19vcHMudG9fcG9zdF9mb2xsb3dfaW5mZXJpb3JfYnlfY2xvbmUgPSBOVUxMOyAgCisgIGJkbV9wcGNfb3BzLnRvX2luc2VydF9mb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBiZG1fcHBjX29wcy50b19yZW1vdmVfZm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgYmRtX3BwY19vcHMudG9faW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBiZG1fcHBjX29wcy50b19yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgIAorICBiZG1fcHBjX29wcy50b19oYXNfZm9ya2VkID0gTlVMTDsKKyAgYmRtX3BwY19vcHMudG9faGFzX3Zmb3JrZWQgPSBOVUxMOyAgICAgICAgICAgIAorICBiZG1fcHBjX29wcy50b19jYW5fZm9sbG93X3Zmb3JrX3ByaW9yX3RvX2V4ZWMgPSBOVUxMOyAgICAgICAgICAgIAorICBiZG1fcHBjX29wcy50b19wb3N0X2ZvbGxvd192Zm9yayA9IE5VTEw7CisgIGJkbV9wcGNfb3BzLnRvX2luc2VydF9leGVjX2NhdGNocG9pbnQgPSBOVUxMOworICBiZG1fcHBjX29wcy50b19yZW1vdmVfZXhlY19jYXRjaHBvaW50ID0gTlVMTDsKKyAgYmRtX3BwY19vcHMudG9faGFzX2V4ZWNkID0gTlVMTDsKKyAgYmRtX3BwY19vcHMudG9fcmVwb3J0ZWRfZXhlY19ldmVudHNfcGVyX2V4ZWNfY2FsbCA9IE5VTEw7CisgIGJkbV9wcGNfb3BzLnRvX2hhc19leGl0ZWQgPSBOVUxMOworICBiZG1fcHBjX29wcy50b19tb3Vybl9pbmZlcmlvciA9ICAgb2NkX21vdXJuOwkKKyAgYmRtX3BwY19vcHMudG9fY2FuX3J1biAgPSAgIDA7CQkKKyAgYmRtX3BwY19vcHMudG9fbm90aWNlX3NpZ25hbHMgPSAgIDA7CQkKKyAgYmRtX3BwY19vcHMudG9fdGhyZWFkX2FsaXZlICA9ICAgb2NkX3RocmVhZF9hbGl2ZTsKKyAgYmRtX3BwY19vcHMudG9fc3RvcCAgPSAgIG9jZF9zdG9wOworICBiZG1fcHBjX29wcy50b19waWRfdG9fZXhlY19maWxlID0gTlVMTDsKKyAgYmRtX3BwY19vcHMudG9fY29yZV9maWxlX3RvX3N5bV9maWxlID0gTlVMTDsgCQkKKyAgYmRtX3BwY19vcHMudG9fc3RyYXR1bSA9ICAgcHJvY2Vzc19zdHJhdHVtOwkJCisgIGJkbV9wcGNfb3BzLkRPTlRfVVNFID0gICBOVUxMOwkJCQorICBiZG1fcHBjX29wcy50b19oYXNfYWxsX21lbW9yeSA9ICAgMTsJCQkKKyAgYmRtX3BwY19vcHMudG9faGFzX21lbW9yeSA9ICAgMTsJCQkKKyAgYmRtX3BwY19vcHMudG9faGFzX3N0YWNrID0gICAxOwkJCQorICBiZG1fcHBjX29wcy50b19oYXNfcmVnaXN0ZXJzID0gICAxOwkJCQorICBiZG1fcHBjX29wcy50b19oYXNfZXhlY3V0aW9uID0gICAxOwkJCQorICBiZG1fcHBjX29wcy50b19zZWN0aW9ucyA9ICAgTlVMTDsJCQkKKyAgYmRtX3BwY19vcHMudG9fc2VjdGlvbnNfZW5kID0gICBOVUxMOwkJCQorICBiZG1fcHBjX29wcy50b19tYWdpYyA9ICAgT1BTX01BR0lDIDsJCQkKK30gLyogaW5pdF9iZG1fcHBjX29wcyAqLworCit2b2lkCitfaW5pdGlhbGl6ZV9iZG1fcHBjICgpCit7CisgIGluaXRfYmRtX3BwY19vcHMoKSA7CisgIGFkZF90YXJnZXQgKCZiZG1fcHBjX29wcyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvcHBjYnVnLXJvbS5jIGIvZ2RiL3BwY2J1Zy1yb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDk2OTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3BwY2J1Zy1yb20uYwpAQCAtMCwwICsxLDIzMCBAQAorLyogUmVtb3RlIGRlYnVnZ2luZyBpbnRlcmZhY2UgZm9yIFBQQ2J1ZyAoUG93ZXJQQykgUm9tIG1vbml0b3IKKyAgIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgV3JpdHRlbiBieSBTdHUgR3Jvc3NtYW4gb2YgQ3lnbnVzIFN1cHBvcnQKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJtb25pdG9yLmgiCisjaW5jbHVkZSAic2VyaWFsLmgiCisKK3N0YXRpYyB2b2lkIHBwY2J1Z19vcGVuIFBBUkFNUyAoKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkpOworCitzdGF0aWMgdm9pZAorcHBjYnVnX3N1cHBseV9yZWdpc3RlciAocmVnbmFtZSwgcmVnbmFtZWxlbiwgdmFsLCB2YWxsZW4pCisgICAgIGNoYXIgKnJlZ25hbWU7CisgICAgIGludCByZWduYW1lbGVuOworICAgICBjaGFyICp2YWw7CisgICAgIGludCB2YWxsZW47Cit7CisgIGludCByZWdubyA9IDAsIGJhc2UgPSAwOworCisgIGlmIChyZWduYW1lbGVuIDwgMiB8fCByZWduYW1lbGVuID4gNCkKKyAgICByZXR1cm47CisKKyAgc3dpdGNoIChyZWduYW1lWzBdKQorICAgIHsKKyAgICBjYXNlICdSJzoKKyAgICAgIGlmIChyZWduYW1lWzFdIDwgJzAnIHx8IHJlZ25hbWVbMV0gPiAnOScpCisJcmV0dXJuOworICAgICAgaWYgKHJlZ25hbWVsZW4gPT0gMikKKwlyZWdubyA9IHJlZ25hbWVbMV0gLSAnMCc7CisgICAgICBlbHNlIGlmIChyZWduYW1lbGVuID09IDMgJiYgcmVnbmFtZVsyXSA+PSAnMCcgJiYgcmVnbmFtZVsyXSA8PSAnOScpCisJcmVnbm8gPSAocmVnbmFtZVsxXSAtICcwJykgKiAxMCArIChyZWduYW1lWzJdIC0gJzAnKTsKKyAgICAgIGVsc2UKKwlyZXR1cm47CisgICAgICBicmVhazsKKyAgICBjYXNlICdGJzoKKyAgICAgIGlmIChyZWduYW1lWzFdICE9ICdSJyB8fCByZWduYW1lWzJdIDwgJzAnIHx8IHJlZ25hbWVbMl0gPiAnOScpCisJcmV0dXJuOworICAgICAgaWYgKHJlZ25hbWVsZW4gPT0gMykKKwlyZWdubyA9IDMyICsgcmVnbmFtZVsyXSAtICcwJzsKKyAgICAgIGVsc2UgaWYgKHJlZ25hbWVsZW4gPT0gNCAmJiByZWduYW1lWzNdID49ICcwJyAmJiByZWduYW1lWzNdIDw9ICc5JykKKwlyZWdubyA9IDMyICsgKHJlZ25hbWVbMl0gLSAnMCcpICogMTAgKyAocmVnbmFtZVszXSAtICcwJyk7CisgICAgICBlbHNlCisJcmV0dXJuOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnSSc6CisgICAgICBpZiAocmVnbmFtZWxlbiAhPSAyIHx8IHJlZ25hbWVbMV0gIT0gJ1AnKQorCXJldHVybjsKKyAgICAgIHJlZ25vID0gNjQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICdNJzoKKyAgICAgIGlmIChyZWduYW1lbGVuICE9IDMgfHwgcmVnbmFtZVsxXSAhPSAnUycgfHwgcmVnbmFtZVsyXSAhPSAnUicpCisJcmV0dXJuOworICAgICAgcmVnbm8gPSA2NTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0MnOgorICAgICAgaWYgKHJlZ25hbWVsZW4gIT0gMiB8fCByZWduYW1lWzFdICE9ICdSJykKKwlyZXR1cm47CisgICAgICByZWdubyA9IDY2OworICAgICAgYnJlYWs7CisgICAgY2FzZSAnUyc6CisgICAgICBpZiAocmVnbmFtZWxlbiAhPSA0IHx8IHJlZ25hbWVbMV0gIT0gJ1AnIHx8IHJlZ25hbWVbMl0gIT0gJ1InKQorCXJldHVybjsKKyAgICAgIGVsc2UgaWYgKHJlZ25hbWVbM10gPT0gJzgnKQorCXJlZ25vID0gNjc7CisgICAgICBlbHNlIGlmIChyZWduYW1lWzNdID09ICc5JykKKwlyZWdubyA9IDY4OworICAgICAgZWxzZSBpZiAocmVnbmFtZVszXSA9PSAnMScpCisJcmVnbm8gPSA2OTsKKyAgICAgIGVsc2UgaWYgKHJlZ25hbWVbM10gPT0gJzAnKQorCXJlZ25vID0gNzA7CisgICAgICBlbHNlCisJcmV0dXJuOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbW9uaXRvcl9zdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCB2YWwpOworfQorCisvKgorICogVGhpcyBhcnJheSBvZiByZWdpc3RlcnMgbmVlZHMgdG8gbWF0Y2ggdGhlIGluZGV4ZXMgdXNlZCBieSBHREIuIFRoZQorICogd2hvbGUgcmVhc29uIHRoaXMgZXhpc3RzIGlzIGJlY2F1c2UgdGhlIHZhcmlvdXMgUk9NIG1vbml0b3JzIHVzZQorICogZGlmZmVyZW50IG5hbWVzIHRoYW4gR0RCIGRvZXMsIGFuZCBkb24ndCBzdXBwb3J0IGFsbCB0aGUKKyAqIHJlZ2lzdGVycyBlaXRoZXIuIFNvLCB0eXBpbmcgImluZm8gcmVnIHNwIiBiZWNvbWVzIGFuICJBNyIuCisgKi8KKworc3RhdGljIGNoYXIgKnBwY2J1Z19yZWduYW1lc1tOVU1fUkVHU10gPQoreworICAicjAiLCAgICJyMSIsICAgInIyIiwgICAicjMiLCAgICJyNCIsICAgInI1IiwgICAicjYiLCAgICJyNyIsCisgICJyOCIsICAgInI5IiwgICAicjEwIiwgICJyMTEiLCAgInIxMiIsICAicjEzIiwgICJyMTQiLCAgInIxNSIsCisgICJyMTYiLCAgInIxNyIsICAicjE4IiwgICJyMTkiLCAgInIyMCIsICAicjIxIiwgICJyMjIiLCAgInIyMyIsCisgICJyMjQiLCAgInIyNSIsICAicjI2IiwgICJyMjciLCAgInIyOCIsICAicjI5IiwgICJyMzAiLCAgInIzMSIsCisKKyAgImZyMCIsICAiZnIxIiwgICJmcjIiLCAgImZyMyIsICAiZnI0IiwgICJmcjUiLCAgImZyNiIsICAiZnI3IiwKKyAgImZyOCIsICAiZnI5IiwgICJmcjEwIiwgImZyMTEiLCAiZnIxMiIsICJmcjEzIiwgImZyMTQiLCAiZnIxNSIsCisgICJmcjE2IiwgImZyMTciLCAiZnIxOCIsICJmcjE5IiwgImZyMjAiLCAiZnIyMSIsICJmcjIyIiwgImZyMjMiLAorICAiZnIyNCIsICJmcjI1IiwgImZyMjYiLCAiZnIyNyIsICJmcjI4IiwgImZyMjkiLCAiZnIzMCIsICJmcjMxIiwKKworLyogcGMgICAgICBwcyAgICAgIGNuZCAgICAgbHIgICAgICBjbnQgICAgIHhlciAgICAgbXEgKi8KKyAgImlwIiwgICAibXNyIiwgICJjciIsICAgInNwcjgiLCAic3ByOSIsICJzcHIxIiwgInNwcjAiCit9OworCisvKgorICogRGVmaW5lIHRoZSBtb25pdG9yIGNvbW1hbmQgc3RyaW5ncy4gU2luY2UgdGhlc2UgYXJlIHBhc3NlZCBkaXJlY3RseQorICogdGhyb3VnaCB0byBhIHByaW50ZiBzdHlsZSBmdW5jdGlvbiwgd2UgbmVlZCBjYW4gaW5jbHVkZSBmb3JtYXR0aW5nCisgKiBzdHJpbmdzLiBXZSBhbHNvIG5lZWQgYSBDUiBvciBMRiBvbiB0aGUgZW5kLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgdGFyZ2V0X29wcyBwcGNidWdfb3BzMDsKK3N0YXRpYyBzdHJ1Y3QgdGFyZ2V0X29wcyBwcGNidWdfb3BzMTsKKworc3RhdGljIGNoYXIgKnBwY2J1Z19pbml0c1tdID0geyJcciIsIE5VTEx9OworCitzdGF0aWMgdm9pZAoraW5pdF9wcGNfY21kcyAoY2hhciAgKiBMT0FEX0NNRCwKKwkgICAgICAgc3RydWN0IG1vbml0b3Jfb3BzICogT1BTLAorCSAgICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqIHRhcmdvcHMpCit7CisgIE9QUy0+ZmxhZ3MgPSBNT19DTFJfQlJFQUtfVVNFU19BRERSIHwgTU9fSEFORExFX05MOwkKKyAgT1BTLT5pbml0ID0gcHBjYnVnX2luaXRzOwkJLyogSW5pdCBzdHJpbmdzICovCisgIE9QUy0+Y29udCA9ICJnXHIiOwkJCS8qIGNvbnRpbnVlIGNvbW1hbmQgKi8JCQorICBPUFMtPnN0ZXAgPSAidFxyIjsJCQkvKiBzaW5nbGUgc3RlcCAqLwkJCisgIE9QUy0+c3RvcCA9IE5VTEw7CQkJLyogaW50ZXJydXB0IGNvbW1hbmQgKi8JCisgIE9QUy0+c2V0X2JyZWFrID0gImJyICV4XHIiOwkJLyogc2V0IGEgYnJlYWtwb2ludCAqLwkKKyAgT1BTLT5jbHJfYnJlYWsgPSAibm9iciAleFxyIjsJCS8qIGNsZWFyIGEgYnJlYWtwb2ludCAqLworICBPUFMtPmNscl9hbGxfYnJlYWsgPSAibm9iclxyIjsJLyogY2xlYXIgYWxsIGJyZWFrcG9pbnRzICovCisgIE9QUy0+ZmlsbCA9ICJiZiAleDoleCAleDtiXHIiOwkvKiBmaWxsIChzdGFydCBjb3VudCB2YWwpICovCQkKKyAgT1BTLT5zZXRtZW0uY21kYiA9ICJtcyAleCAlMDJ4XHIiOwkvKiBzZXRtZW0uY21kYiAoYWRkciwgdmFsdWUpICovCQkKKyAgT1BTLT5zZXRtZW0uY21kdyA9ICJtcyAleCAlMDR4XHIiOwkvKiBzZXRtZW0uY21kdyAoYWRkciwgdmFsdWUpICovCQkKKyAgT1BTLT5zZXRtZW0uY21kbCA9ICJtcyAleCAlMDh4XHIiOwkvKiBzZXRtZW0uY21kbCAoYWRkciwgdmFsdWUpICovCQkKKyAgT1BTLT5zZXRtZW0uY21kbGwgPSBOVUxMOwkJLyogc2V0bWVtLmNtZGxsIChhZGRyLCB2YWx1ZSkgKi8JCisgIE9QUy0+c2V0bWVtLnJlc3BfZGVsaW0gPSBOVUxMOwkvKiBzZXRyZWcucmVzcF9kZWxpbSAqLwkJCisgIE9QUy0+c2V0bWVtLnRlcm0gPSBOVUxMOwkJLyogc2V0cmVnLnRlcm0gKi8JCQkKKyAgT1BTLT5zZXRtZW0udGVybV9jbWQgPSBOVUxMOwkJLyogc2V0cmVnLnRlcm1fY21kICovCQkKKyAgT1BTLT5nZXRtZW0uY21kYiA9ICJtZCAleDoleDtiXHIiOwkvKiBnZXRtZW0uY21kYiAoYWRkciwgbGVuKSAqLwkJCisgIE9QUy0+Z2V0bWVtLmNtZHcgPSAibWQgJXg6JXg7YlxyIjsJLyogZ2V0bWVtLmNtZHcgKGFkZHIsIGxlbikgKi8JCQorICBPUFMtPmdldG1lbS5jbWRsID0gIm1kICV4OiV4O2JcciI7CS8qIGdldG1lbS5jbWRsIChhZGRyLCBsZW4pICovCQkKKyAgT1BTLT5nZXRtZW0uY21kbGwgPSBOVUxMOwkJLyogZ2V0bWVtLmNtZGxsIChhZGRyLCBsZW4pICovCQkKKyAgT1BTLT5nZXRtZW0ucmVzcF9kZWxpbSA9ICIgIjsJCS8qIGdldG1lbS5yZXNwX2RlbGltICovCQkKKyAgT1BTLT5nZXRtZW0udGVybSA9IE5VTEw7CQkvKiBnZXRtZW0udGVybSAqLwkJCQorICBPUFMtPmdldG1lbS50ZXJtX2NtZCA9IE5VTEw7CQkvKiBnZXRtZW0udGVybV9jbWQgKi8JCQorICBPUFMtPnNldHJlZy5jbWQgPSAicnMgJXMgJXhcciI7CS8qIHNldHJlZy5jbWQgKG5hbWUsIHZhbHVlKSAqLwkJCisgIE9QUy0+c2V0cmVnLnJlc3BfZGVsaW0gPSBOVUxMOwkvKiBzZXRyZWcucmVzcF9kZWxpbSAqLwkJCisgIE9QUy0+c2V0cmVnLnRlcm0gPSBOVUxMOwkJLyogc2V0cmVnLnRlcm0gKi8JCQkKKyAgT1BTLT5zZXRyZWcudGVybV9jbWQgPSBOVUxMCTsJLyogc2V0cmVnLnRlcm1fY21kICovCQkJCisgIE9QUy0+Z2V0cmVnLmNtZCA9ICJycyAlc1xyIjsJCS8qIGdldHJlZy5jbWQgKG5hbWUpICovCQkKKyAgT1BTLT5nZXRyZWcucmVzcF9kZWxpbSA9ICI9IjsJCS8qIGdldHJlZy5yZXNwX2RlbGltICovCQkKKyAgT1BTLT5nZXRyZWcudGVybSA9IE5VTEw7CQkvKiBnZXRyZWcudGVybSAqLwkJCQorICBPUFMtPmdldHJlZy50ZXJtX2NtZCA9IE5VTEwJOwkvKiBnZXRyZWcudGVybV9jbWQgKi8JCQkKKyAgT1BTLT5yZWdpc3Rlcl9wYXR0ZXJuID0gIlxcKFxcdytcXCkgKz1cXChbMC05YS1mQS1GXStcXGJcXCkiOyAvKiByZWdpc3Rlcl9wYXR0ZXJuICovCQorICBPUFMtPnN1cHBseV9yZWdpc3RlciA9IHBwY2J1Z19zdXBwbHlfcmVnaXN0ZXI7CS8qIHN1cHBseV9yZWdpc3RlciAqLwkJCisgIE9QUy0+ZHVtcF9yZWdpc3RlcnMgPSAicmRcciI7CQkvKiBkdW1wIGFsbCByZWdpc3RlcnMgKi8KKyAgT1BTLT5sb2FkX3JvdXRpbmUgPSBOVUxMOwkJLyogbG9hZF9yb3V0aW5lIChkZWZhdWx0cyB0byBTUkVDcykgKi8JCisgIE9QUy0+bG9hZCA9IExPQURfQ01EOwkJCS8qIGRvd25sb2FkIGNvbW1hbmQgKi8JCSAgICAgICAgCQorICBPUFMtPmxvYWRyZXNwID0gTlVMTDsJCQkvKiBsb2FkIHJlc3BvbnNlICovCQkJCisgIE9QUy0+cHJvbXB0ID0gIlBQQzEtQnVnPiI7CQkvKiBtb25pdG9yIGNvbW1hbmQgcHJvbXB0ICovCQkKKyAgT1BTLT5saW5lX3Rlcm0gPSAiXHIiOwkJLyogZW5kLW9mLWxpbmUgdGVybWluYXRvciAqLwkKKyAgT1BTLT5jbWRfZW5kID0gTlVMTDsJCQkvKiBvcHRpb25hbCBjb21tYW5kIHRlcm1pbmF0b3IgKi8JCisgIE9QUy0+dGFyZ2V0ID0gdGFyZ29wcyA7CQkvKiB0YXJnZXQgb3BlcmF0aW9ucyAqLwkJCQorICBPUFMtPnN0b3BiaXRzID0gU0VSSUFMXzFfU1RPUEJJVFM7CS8qIG51bWJlciBvZiBzdG9wIGJpdHMgKi8JCQorICBPUFMtPnJlZ25hbWVzID0gcHBjYnVnX3JlZ25hbWVzOwkvKiByZWdpc3RlcnMgbmFtZXMgKi8JCQkKKyAgT1BTLT5tYWdpYyA9IE1PTklUT1JfT1BTX01BR0lDOwkvKiBtYWdpYyAqLwkJCQkKK30KKworCitzdGF0aWMgc3RydWN0IG1vbml0b3Jfb3BzIHBwY2J1Z19jbWRzMCA7CitzdGF0aWMgc3RydWN0IG1vbml0b3Jfb3BzIHBwY2J1Z19jbWRzMSA7CisKK3N0YXRpYyB2b2lkCitwcGNidWdfb3BlbjAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgbW9uaXRvcl9vcGVuIChhcmdzLCAmcHBjYnVnX2NtZHMwLCBmcm9tX3R0eSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcGNidWdfb3BlbjEoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgbW9uaXRvcl9vcGVuIChhcmdzLCAmcHBjYnVnX2NtZHMxLCBmcm9tX3R0eSk7Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX3BwY2J1Z19yb20gKCkKK3sKKyAgaW5pdF9wcGNfY21kcygibG8gMFxyIiwgJnBwY2J1Z19jbWRzMCwgJnBwY2J1Z19vcHMwKSA7CisgIGluaXRfcHBjX2NtZHMoImxvIDFcciIsICZwcGNidWdfY21kczEsICZwcGNidWdfb3BzMSk7CisgIGluaXRfbW9uaXRvcl9vcHMgKCZwcGNidWdfb3BzMCk7CisKKyAgcHBjYnVnX29wczAudG9fc2hvcnRuYW1lID0gInBwY2J1ZyI7CisgIHBwY2J1Z19vcHMwLnRvX2xvbmduYW1lID0gIlBvd2VyUEMgUFBDQnVnIG1vbml0b3Igb24gcG9ydCAwIjsKKyAgcHBjYnVnX29wczAudG9fZG9jID0gIkRlYnVnIHZpYSB0aGUgUG93ZXJQQyBQUENCdWcgbW9uaXRvciB1c2luZyBwb3J0IDAuXG5cCitTcGVjaWZ5IHRoZSBzZXJpYWwgZGV2aWNlIGl0IGlzIGNvbm5lY3RlZCB0byAoZS5nLiAvZGV2L3R0eWEpLiI7CisgIHBwY2J1Z19vcHMwLnRvX29wZW4gPSBwcGNidWdfb3BlbjA7CisKKyAgYWRkX3RhcmdldCAoJnBwY2J1Z19vcHMwKTsKKworICBpbml0X21vbml0b3Jfb3BzICgmcHBjYnVnX29wczEpOworCisgIHBwY2J1Z19vcHMxLnRvX3Nob3J0bmFtZSA9ICJwcGNidWcxIjsKKyAgcHBjYnVnX29wczEudG9fbG9uZ25hbWUgPSAiUG93ZXJQQyBQUENCdWcgbW9uaXRvciBvbiBwb3J0IDEiOworICBwcGNidWdfb3BzMS50b19kb2MgPSAiRGVidWcgdmlhIHRoZSBQb3dlclBDIFBQQ0J1ZyBtb25pdG9yIHVzaW5nIHBvcnQgMS5cblwKK1NwZWNpZnkgdGhlIHNlcmlhbCBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvIChlLmcuIC9kZXYvdHR5YSkuIjsKKyAgcHBjYnVnX29wczEudG9fb3BlbiA9IHBwY2J1Z19vcGVuMTsKKworICBhZGRfdGFyZ2V0ICgmcHBjYnVnX29wczEpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3ByaW50Y21kLmMgYi9nZGIvcHJpbnRjbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjBiOGFiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3ByaW50Y21kLmMKQEAgLTAsMCArMSwyNTc1IEBACisvKiBQcmludCB2YWx1ZXMgZm9yIEdOVSBkZWJ1Z2dlciBHREIuCisgICBDb3B5cmlnaHQgMTk4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MywgOTQsIDk1LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiYnJlYWtwb2ludC5oIgorI2luY2x1ZGUgImRlbWFuZ2xlLmgiCisjaW5jbHVkZSAidmFscHJpbnQuaCIKKyNpbmNsdWRlICJhbm5vdGF0ZS5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIJLyogZm9yIG92ZXJsYXkgZnVuY3Rpb25zICovCisjaW5jbHVkZSAib2JqZmlsZXMuaCIJLyogZGl0dG8gKi8KKworZXh0ZXJuIGludCBhc21fZGVtYW5nbGU7CS8qIFdoZXRoZXIgdG8gZGVtYW5nbGUgc3ltcyBpbiBhc20gcHJpbnRvdXRzICovCitleHRlcm4gaW50IGFkZHJlc3NwcmludDsJLyogV2hldGhlciB0byBwcmludCBoZXggYWRkcmVzc2VzIGluIEhMTCAiICovCisKK3N0cnVjdCBmb3JtYXRfZGF0YQoreworICBpbnQgY291bnQ7CisgIGNoYXIgZm9ybWF0OworICBjaGFyIHNpemU7Cit9OworCisvKiBMYXN0IHNwZWNpZmllZCBvdXRwdXQgZm9ybWF0LiAgKi8KKworc3RhdGljIGNoYXIgbGFzdF9mb3JtYXQgPSAneCc7CisKKy8qIExhc3Qgc3BlY2lmaWVkIGV4YW1pbmF0aW9uIHNpemUuICAnYicsICdoJywgJ3cnIG9yIGBxJy4gICovCisKK3N0YXRpYyBjaGFyIGxhc3Rfc2l6ZSA9ICd3JzsKKworLyogRGVmYXVsdCBhZGRyZXNzIHRvIGV4YW1pbmUgbmV4dC4gICovCisKK3N0YXRpYyBDT1JFX0FERFIgbmV4dF9hZGRyZXNzOworCisvKiBEZWZhdWx0IHNlY3Rpb24gdG8gZXhhbWluZSBuZXh0LiAqLworCitzdGF0aWMgYXNlY3Rpb24gKm5leHRfc2VjdGlvbjsKKworLyogTGFzdCBhZGRyZXNzIGV4YW1pbmVkLiAgKi8KKworc3RhdGljIENPUkVfQUREUiBsYXN0X2V4YW1pbmVfYWRkcmVzczsKKworLyogQ29udGVudHMgb2YgbGFzdCBhZGRyZXNzIGV4YW1pbmVkLgorICAgVGhpcyBpcyBub3QgdmFsaWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBgeCcgY29tbWFuZCEgICovCisKK3N0YXRpYyB2YWx1ZV9wdHIgbGFzdF9leGFtaW5lX3ZhbHVlOworCisvKiBMYXJnZXN0IG9mZnNldCBiZXR3ZWVuIGEgc3ltYm9saWMgdmFsdWUgYW5kIGFuIGFkZHJlc3MsIHRoYXQgd2lsbCBiZQorICAgcHJpbnRlZCBhcyBgMHgxMjM0IDxzeW1ib2wrb2Zmc2V0PicuICAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IG1heF9zeW1ib2xpY19vZmZzZXQgPSBVSU5UX01BWDsKKworLyogQXBwZW5kIHRoZSBzb3VyY2UgZmlsZW5hbWUgYW5kIGxpbmVudW1iZXIgb2YgdGhlIHN5bWJvbCB3aGVuCisgICBwcmludGluZyBhIHN5bWJvbGljIHZhbHVlIGFzIGA8c3ltYm9sIGF0IGZpbGVuYW1lOmxpbmVudW0+JyBpZiBzZXQuICAqLworc3RhdGljIGludCBwcmludF9zeW1ib2xfZmlsZW5hbWUgPSAwOworCisvKiBOdW1iZXIgb2YgYXV0by1kaXNwbGF5IGV4cHJlc3Npb24gY3VycmVudGx5IGJlaW5nIGRpc3BsYXllZC4KKyAgIFNvIHRoYXQgd2UgY2FuIGRpc2FibGUgaXQgaWYgd2UgZ2V0IGFuIGVycm9yIG9yIGEgc2lnbmFsIHdpdGhpbiBpdC4KKyAgIC0xIHdoZW4gbm90IGRvaW5nIG9uZS4gICovCisKK2ludCBjdXJyZW50X2Rpc3BsYXlfbnVtYmVyOworCisvKiBGbGFnIHRvIGxvdy1sZXZlbCBwcmludCByb3V0aW5lcyB0aGF0IHRoaXMgdmFsdWUgaXMgYmVpbmcgcHJpbnRlZAorICAgaW4gYW4gZXBvY2ggd2luZG93LiAgV2UnZCBsaWtlIHRvIHBhc3MgdGhpcyBhcyBhIHBhcmFtZXRlciwgYnV0CisgICBldmVyeSByb3V0aW5lIHdvdWxkIG5lZWQgdG8gdGFrZSBpdC4gIFBlcmhhcHMgd2UgY2FuIGVuY2Fwc3VsYXRlCisgICB0aGlzIGluIHRoZSBJL08gc3RyZWFtIG9uY2Ugd2UgaGF2ZSBHTlUgc3RkaW8uICovCisKK2ludCBpbnNwZWN0X2l0ID0gMDsKKworc3RydWN0IGRpc3BsYXkKK3sKKyAgLyogQ2hhaW4gbGluayB0byBuZXh0IGF1dG8tZGlzcGxheSBpdGVtLiAgKi8KKyAgc3RydWN0IGRpc3BsYXkgKm5leHQ7CisgIC8qIEV4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkIGFuZCBkaXNwbGF5ZWQuICAqLworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwOworICAvKiBJdGVtIG51bWJlciBvZiB0aGlzIGF1dG8tZGlzcGxheSBpdGVtLiAgKi8KKyAgaW50IG51bWJlcjsKKyAgLyogRGlzcGxheSBmb3JtYXQgc3BlY2lmaWVkLiAgKi8KKyAgc3RydWN0IGZvcm1hdF9kYXRhIGZvcm1hdDsKKyAgLyogSW5uZXJtb3N0IGJsb2NrIHJlcXVpcmVkIGJ5IHRoaXMgZXhwcmVzc2lvbiB3aGVuIGV2YWx1YXRlZCAqLworICBzdHJ1Y3QgYmxvY2sgKmJsb2NrOworICAvKiBTdGF0dXMgb2YgdGhpcyBkaXNwbGF5IChlbmFibGVkIG9yIGRpc2FibGVkKSAqLworICBlbnVtIGVuYWJsZSBzdGF0dXM7Cit9OworCisvKiBDaGFpbiBvZiBleHByZXNzaW9ucyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIGRpc3BsYXllZAorICAgYXV0b21hdGljYWxseSBlYWNoIHRpbWUgdGhlIHByb2dyYW0gc3RvcHMuICAqLworCitzdGF0aWMgc3RydWN0IGRpc3BsYXkgKmRpc3BsYXlfY2hhaW47CisKK3N0YXRpYyBpbnQgZGlzcGxheV9udW1iZXI7CisKKy8qIFByb3RvdHlwZXMgZm9yIGV4cG9ydGVkIGZ1bmN0aW9ucy4gKi8KKwordm9pZCBvdXRwdXRfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCit2b2lkIF9pbml0aWFsaXplX3ByaW50Y21kIFBBUkFNUyAoKHZvaWQpKTsKKworLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAqLworCitzdGF0aWMgdm9pZCBkZWxldGVfZGlzcGxheSBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIHZvaWQgZW5hYmxlX2Rpc3BsYXkgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgZGlzYWJsZV9kaXNwbGF5X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgZGlzYXNzZW1ibGVfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBwcmludGZfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBwcmludF9mcmFtZV9uYW1lbGVzc19hcmdzIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICosIGxvbmcsCisJCQkJCSAgICAgICBpbnQsIGludCwgR0RCX0ZJTEUgKikpOworCitzdGF0aWMgdm9pZCBkaXNwbGF5X2luZm8gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgZG9fb25lX2Rpc3BsYXkgUEFSQU1TICgoc3RydWN0IGRpc3BsYXkgKikpOworCitzdGF0aWMgdm9pZCB1bmRpc3BsYXlfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBmcmVlX2Rpc3BsYXkgUEFSQU1TICgoc3RydWN0IGRpc3BsYXkgKikpOworCitzdGF0aWMgdm9pZCBkaXNwbGF5X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKwordm9pZCB4X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgYWRkcmVzc19pbmZvIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHNldF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGNhbGxfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBpbnNwZWN0X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgcHJpbnRfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBwcmludF9jb21tYW5kXzEgUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCkpOworCitzdGF0aWMgdm9pZCB2YWxpZGF0ZV9mb3JtYXQgUEFSQU1TICgoc3RydWN0IGZvcm1hdF9kYXRhLCBjaGFyICopKTsKKworc3RhdGljIHZvaWQgZG9fZXhhbWluZSBQQVJBTVMgKChzdHJ1Y3QgZm9ybWF0X2RhdGEsIENPUkVfQUREUiBhZGRyLCBhc2VjdGlvbiAqc2VjdGlvbikpOworCitzdGF0aWMgdm9pZCBwcmludF9mb3JtYXR0ZWQgUEFSQU1TICgodmFsdWVfcHRyLCBpbnQsIGludCkpOworCitzdGF0aWMgc3RydWN0IGZvcm1hdF9kYXRhIGRlY29kZV9mb3JtYXQgUEFSQU1TICgoY2hhciAqKiwgaW50LCBpbnQpKTsKKworc3RhdGljIGludCBwcmludF9pbnNuIFBBUkFNUyAoKENPUkVfQUREUiwgR0RCX0ZJTEUgKikpOworCitzdGF0aWMgdm9pZCBzeW1faW5mbyBQQVJBTVMgKChjaGFyICosIGludCkpOworCisMCisvKiBEZWNvZGUgYSBmb3JtYXQgc3BlY2lmaWNhdGlvbi4gICpTVFJJTkdfUFRSIHNob3VsZCBwb2ludCB0byBpdC4KKyAgIE9GT1JNQVQgYW5kIE9TSVpFIGFyZSB1c2VkIGFzIGRlZmF1bHRzIGZvciB0aGUgZm9ybWF0IGFuZCBzaXplCisgICBpZiBub25lIGFyZSBnaXZlbiBpbiB0aGUgZm9ybWF0IHNwZWNpZmljYXRpb24uCisgICBJZiBPU0laRSBpcyB6ZXJvLCB0aGVuIHRoZSBzaXplIGZpZWxkIG9mIHRoZSByZXR1cm5lZCB2YWx1ZQorICAgc2hvdWxkIGJlIHNldCBvbmx5IGlmIGEgc2l6ZSBpcyBleHBsaWNpdGx5IHNwZWNpZmllZCBieSB0aGUKKyAgIHVzZXIuCisgICBUaGUgc3RydWN0dXJlIHJldHVybmVkIGRlc2NyaWJlcyBhbGwgdGhlIGRhdGEKKyAgIGZvdW5kIGluIHRoZSBzcGVjaWZpY2F0aW9uLiAgSW4gYWRkaXRpb24sICpTVFJJTkdfUFRSIGlzIGFkdmFuY2VkCisgICBwYXN0IHRoZSBzcGVjaWZpY2F0aW9uIGFuZCBwYXN0IGFsbCB3aGl0ZXNwYWNlIGZvbGxvd2luZyBpdC4gICovCisKK3N0YXRpYyBzdHJ1Y3QgZm9ybWF0X2RhdGEKK2RlY29kZV9mb3JtYXQgKHN0cmluZ19wdHIsIG9mb3JtYXQsIG9zaXplKQorICAgICBjaGFyICoqc3RyaW5nX3B0cjsKKyAgICAgaW50IG9mb3JtYXQ7CisgICAgIGludCBvc2l6ZTsKK3sKKyAgc3RydWN0IGZvcm1hdF9kYXRhIHZhbDsKKyAgcmVnaXN0ZXIgY2hhciAqcCA9ICpzdHJpbmdfcHRyOworCisgIHZhbC5mb3JtYXQgPSAnPyc7CisgIHZhbC5zaXplID0gJz8nOworICB2YWwuY291bnQgPSAxOworCisgIGlmICgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKQorICAgIHZhbC5jb3VudCA9IGF0b2kgKHApOworICB3aGlsZSAoKnAgPj0gJzAnICYmICpwIDw9ICc5JykgcCsrOworCisgIC8qIE5vdyBwcm9jZXNzIHNpemUgb3IgZm9ybWF0IGxldHRlcnMgdGhhdCBmb2xsb3cuICAqLworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGlmICgqcCA9PSAnYicgfHwgKnAgPT0gJ2gnIHx8ICpwID09ICd3JyB8fCAqcCA9PSAnZycpCisJdmFsLnNpemUgPSAqcCsrOworICAgICAgZWxzZSBpZiAoKnAgPj0gJ2EnICYmICpwIDw9ICd6JykKKwl2YWwuZm9ybWF0ID0gKnArKzsKKyAgICAgIGVsc2UKKwlicmVhazsKKyAgICB9CisKKyAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKSBwKys7CisgICpzdHJpbmdfcHRyID0gcDsKKworICAvKiBTZXQgZGVmYXVsdHMgZm9yIGZvcm1hdCBhbmQgc2l6ZSBpZiBub3Qgc3BlY2lmaWVkLiAgKi8KKyAgaWYgKHZhbC5mb3JtYXQgPT0gJz8nKQorICAgIHsKKyAgICAgIGlmICh2YWwuc2l6ZSA9PSAnPycpCisJeworCSAgLyogTmVpdGhlciBoYXMgYmVlbiBzcGVjaWZpZWQuICAqLworCSAgdmFsLmZvcm1hdCA9IG9mb3JtYXQ7CisJICB2YWwuc2l6ZSA9IG9zaXplOworCX0KKyAgICAgIGVsc2UKKwkvKiBJZiBhIHNpemUgaXMgc3BlY2lmaWVkLCBhbnkgZm9ybWF0IG1ha2VzIGEgcmVhc29uYWJsZQorCSAgIGRlZmF1bHQgZXhjZXB0ICdpJy4gICovCisJdmFsLmZvcm1hdCA9IG9mb3JtYXQgPT0gJ2knID8gJ3gnIDogb2Zvcm1hdDsKKyAgICB9CisgIGVsc2UgaWYgKHZhbC5zaXplID09ICc/JykKKyAgICBzd2l0Y2ggKHZhbC5mb3JtYXQpCisgICAgICB7CisgICAgICBjYXNlICdhJzoKKyAgICAgIGNhc2UgJ3MnOgorCS8qIFBpY2sgdGhlIGFwcHJvcHJpYXRlIHNpemUgZm9yIGFuIGFkZHJlc3MuICAqLworCWlmIChUQVJHRVRfUFRSX0JJVCA9PSA2NCkKKwkgIHZhbC5zaXplID0gb3NpemUgPyAnZycgOiBvc2l6ZTsKKwllbHNlIGlmIChUQVJHRVRfUFRSX0JJVCA9PSAzMikKKwkgIHZhbC5zaXplID0gb3NpemUgPyAndycgOiBvc2l6ZTsKKwllbHNlIGlmIChUQVJHRVRfUFRSX0JJVCA9PSAxNikKKwkgIHZhbC5zaXplID0gb3NpemUgPyAnaCcgOiBvc2l6ZTsKKwllbHNlCisJICAvKiBCYWQgdmFsdWUgZm9yIFRBUkdFVF9QVFJfQklUICovCisJICBhYm9ydCAoKTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ2YnOgorCS8qIEZsb2F0aW5nIHBvaW50IGhhcyB0byBiZSB3b3JkIG9yIGdpYW50d29yZC4gICovCisJaWYgKG9zaXplID09ICd3JyB8fCBvc2l6ZSA9PSAnZycpCisJICB2YWwuc2l6ZSA9IG9zaXplOworCWVsc2UKKwkgIC8qIERlZmF1bHQgaXQgdG8gZ2lhbnR3b3JkIGlmIHRoZSBsYXN0IHVzZWQgc2l6ZSBpcyBub3QKKwkgICAgIGFwcHJvcHJpYXRlLiAgKi8KKwkgIHZhbC5zaXplID0gb3NpemUgPyAnZycgOiBvc2l6ZTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ2MnOgorCS8qIENoYXJhY3RlcnMgZGVmYXVsdCB0byBvbmUgYnl0ZS4gICovCisJdmFsLnNpemUgPSBvc2l6ZSA/ICdiJyA6IG9zaXplOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwkvKiBUaGUgZGVmYXVsdCBpcyB0aGUgc2l6ZSBtb3N0IHJlY2VudGx5IHNwZWNpZmllZC4gICovCisJdmFsLnNpemUgPSBvc2l6ZTsKKyAgICAgIH0KKworICByZXR1cm4gdmFsOworfQorDAorLyogUHJpbnQgdmFsdWUgVkFMIG9uIGdkYl9zdGRvdXQgYWNjb3JkaW5nIHRvIEZPUk1BVCwgYSBsZXR0ZXIgb3IgMC4KKyAgIERvIG5vdCBlbmQgd2l0aCBhIG5ld2xpbmUuCisgICAwIG1lYW5zIHByaW50IFZBTCBhY2NvcmRpbmcgdG8gaXRzIG93biB0eXBlLgorICAgU0laRSBpcyB0aGUgbGV0dGVyIGZvciB0aGUgc2l6ZSBvZiBkYXR1bSBiZWluZyBwcmludGVkLgorICAgVGhpcyBpcyB1c2VkIHRvIHBhZCBoZXggbnVtYmVycyBzbyB0aGV5IGxpbmUgdXAuICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfZm9ybWF0dGVkICh2YWwsIGZvcm1hdCwgc2l6ZSkKKyAgICAgcmVnaXN0ZXIgdmFsdWVfcHRyIHZhbDsKKyAgICAgcmVnaXN0ZXIgaW50IGZvcm1hdDsKKyAgICAgaW50IHNpemU7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAodmFsKSk7CisgIGludCBsZW4gPSBUWVBFX0xFTkdUSCAodHlwZSk7CisKKyAgaWYgKFZBTFVFX0xWQUwgKHZhbCkgPT0gbHZhbF9tZW1vcnkpCisgICAgeworICAgICAgbmV4dF9hZGRyZXNzID0gVkFMVUVfQUREUkVTUyAodmFsKSArIGxlbjsKKyAgICAgIG5leHRfc2VjdGlvbiA9IFZBTFVFX0JGRF9TRUNUSU9OICh2YWwpOworICAgIH0KKworICBzd2l0Y2ggKGZvcm1hdCkKKyAgICB7CisgICAgY2FzZSAncyc6CisgICAgICAvKiBGSVhNRTogTmVlZCB0byBoYW5kbGUgd2NoYXJfdCdzIGhlcmUuLi4gKi8KKyAgICAgIG5leHRfYWRkcmVzcyA9IFZBTFVFX0FERFJFU1MgKHZhbCkKKwkrIHZhbF9wcmludF9zdHJpbmcgKFZBTFVFX0FERFJFU1MgKHZhbCksIC0xLCAxLCBnZGJfc3Rkb3V0KTsKKyAgICAgIG5leHRfc2VjdGlvbiA9IFZBTFVFX0JGRF9TRUNUSU9OICh2YWwpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdpJzoKKyAgICAgIC8qIFRoZSBvbGQgY29tbWVudCBzYXlzCisJICJGb3JjZSBvdXRwdXQgb3V0LCBwcmludF9pbnNuIG5vdCB1c2luZyBfZmlsdGVyZWQiLgorCSBJJ20gbm90IGNvbXBsZXRlbHkgc3VyZSB3aGF0IHRoYXQgbWVhbnMsIEkgc3VzcGVjdCBtb3N0IHByaW50X2luc24KKwkgbm93IGRvIHVzZSBfZmlsdGVyZWQsIHNvIEkgZ3Vlc3MgaXQncyBvYnNvbGV0ZS4KKwkgICAtLVllcywgaXQgZG9lcyBmaWx0ZXIgbm93LCBhbmQgc28gdGhpcyBpcyBvYnNvbGV0ZS4gIC1KQiAgKi8KKworICAgICAgLyogV2Ugb2Z0ZW4gd3JhcCBoZXJlIGlmIHRoZXJlIGFyZSBsb25nIHN5bWJvbGljIG5hbWVzLiAgKi8KKyAgICAgIHdyYXBfaGVyZSAoIiAgICAiKTsKKyAgICAgIG5leHRfYWRkcmVzcyA9IFZBTFVFX0FERFJFU1MgKHZhbCkKKwkrIHByaW50X2luc24gKFZBTFVFX0FERFJFU1MgKHZhbCksIGdkYl9zdGRvdXQpOworICAgICAgbmV4dF9zZWN0aW9uID0gVkFMVUVfQkZEX1NFQ1RJT04gKHZhbCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBpZiAoZm9ybWF0ID09IDAKKwkgIHx8IFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX0FSUkFZCisJICB8fCBUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9TVFJJTkcKKwkgIHx8IFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1NUUlVDVAorCSAgfHwgVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfVU5JT04pCisgICAgICAgIC8qIElmIGZvcm1hdCBpcyAwLCB1c2UgdGhlICduYXR1cmFsJyBmb3JtYXQgZm9yCisgICAgICAgICAqIHRoYXQgdHlwZSBvZiB2YWx1ZS4gIElmIHRoZSB0eXBlIGlzIG5vbi1zY2FsYXIsCisgICAgICAgICAqIHdlIGhhdmUgdG8gdXNlIGxhbmd1YWdlIHJ1bGVzIHRvIHByaW50IGl0IGFzCisgICAgICAgICAqIGEgc2VyaWVzIG9mIHNjYWxhcnMuCisgICAgICAgICAqLworCXZhbHVlX3ByaW50ICh2YWwsIGdkYl9zdGRvdXQsIGZvcm1hdCwgVmFsX3ByZXR0eV9kZWZhdWx0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgLyogVXNlciBzcGVjaWZpZWQgZm9ybWF0LCBzbyBkb24ndCBsb29rIHRvIHRoZQorICAgICAgICAgKiB0aGUgdHlwZSB0byB0ZWxsIHVzIHdoYXQgdG8gZG8uCisgICAgICAgICAqLworCXByaW50X3NjYWxhcl9mb3JtYXR0ZWQgKFZBTFVFX0NPTlRFTlRTICh2YWwpLCB0eXBlLAorCQkJCWZvcm1hdCwgc2l6ZSwgZ2RiX3N0ZG91dCk7CisgICAgfQorfQorCisvKiBQcmludCBhIHNjYWxhciBvZiBkYXRhIG9mIHR5cGUgVFlQRSwgcG9pbnRlZCB0byBpbiBHREIgYnkgVkFMQUREUiwKKyAgIGFjY29yZGluZyB0byBsZXR0ZXJzIEZPUk1BVCBhbmQgU0laRSBvbiBTVFJFQU0uCisgICBGT1JNQVQgbWF5IG5vdCBiZSB6ZXJvLiAgRm9ybWF0cyBzIGFuZCBpIGFyZSBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgbGV2ZWwuCisKKyAgIFRoaXMgaXMgaG93IHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheSBvciBzdHJ1Y3R1cmUgYXJlIHByaW50ZWQKKyAgIHdpdGggYSBmb3JtYXQuICAqLworCit2b2lkCitwcmludF9zY2FsYXJfZm9ybWF0dGVkICh2YWxhZGRyLCB0eXBlLCBmb3JtYXQsIHNpemUsIHN0cmVhbSkKKyAgICAgY2hhciAqdmFsYWRkcjsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGludCBmb3JtYXQ7CisgICAgIGludCBzaXplOworICAgICBHREJfRklMRSAqc3RyZWFtOworeworICBMT05HRVNUIHZhbF9sb25nOworICB1bnNpZ25lZCBpbnQgbGVuID0gVFlQRV9MRU5HVEggKHR5cGUpOworCisgIGlmIChsZW4gPiBzaXplb2YgKExPTkdFU1QpCisgICAgICAmJiAoZm9ybWF0ID09ICd0JworCSAgfHwgZm9ybWF0ID09ICdjJworCSAgfHwgZm9ybWF0ID09ICdvJworCSAgfHwgZm9ybWF0ID09ICd1JworCSAgfHwgZm9ybWF0ID09ICdkJworCSAgfHwgZm9ybWF0ID09ICd4JykpCisgICAgeworICAgICAgaWYgKCEgVFlQRV9VTlNJR05FRCAodHlwZSkKKwkgIHx8ICEgZXh0cmFjdF9sb25nX3Vuc2lnbmVkX2ludGVnZXIgKHZhbGFkZHIsIGxlbiwgJnZhbF9sb25nKSkKKwl7CisJICAvKiBXZSBjYW4ndCBwcmludCBpdCBub3JtYWxseSwgYnV0IHdlIGNhbiBwcmludCBpdCBpbiBoZXguCisJICAgICBQcmludGluZyBpdCBpbiB0aGUgd3JvbmcgcmFkaXggaXMgbW9yZSB1c2VmdWwgdGhhbiBzYXlpbmcKKwkgICAgICJ1c2UgL3gsIHlvdSBkdW1teSIuICAqLworCSAgLyogRklYTUU6ICB3ZSBjb3VsZCBhbHNvIGRvIG9jdGFsIG9yIGJpbmFyeSBpZiB0aGF0IHdhcyB0aGUKKwkgICAgIGRlc2lyZWQgZm9ybWF0LiAgKi8KKwkgIC8qIEZJWE1FOiAgd2Ugc2hvdWxkIGJlIHVzaW5nIHRoZSBzaXplIGZpZWxkIHRvIGdpdmUgdXMgYQorCSAgICAgbWluaW11bSBmaWVsZCB3aWR0aCB0byBwcmludC4gICovCisKKyAgICAgICAgICBpZiggZm9ybWF0ID09ICdvJyApCisgICAgICAgICAgICAgIHByaW50X29jdGFsX2NoYXJzIChzdHJlYW0sIHZhbGFkZHIsIGxlbik7CisgICAgICAgICAgZWxzZSBpZiggZm9ybWF0ID09ICdkJyApCisgICAgICAgICAgICAgIHByaW50X2RlY2ltYWxfY2hhcnMgKHN0cmVhbSwgdmFsYWRkciwgbGVuICk7CisgICAgICAgICAgZWxzZSBpZiggZm9ybWF0ID09ICd0JyApCisgICAgICAgICAgICAgIHByaW50X2JpbmFyeV9jaGFycyAoc3RyZWFtLCB2YWxhZGRyLCBsZW4pOworICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgICAvKiByZXBsYWNlIHdpdGggY2FsbCB0byBwcmludF9oZXhfY2hhcnM/IExvb2tzCisgICAgICAgICAgICAgICAgIGxpa2UgdmFsX3ByaW50X3R5cGVfY29kZV9pbnQgaXMgcmVkb2luZworICAgICAgICAgICAgICAgICB3b3JrLiAgLSBlZGllICovCisKKwkgICAgICB2YWxfcHJpbnRfdHlwZV9jb2RlX2ludCAodHlwZSwgdmFsYWRkciwgc3RyZWFtKTsKKworCSAgcmV0dXJuOworCX0KKworICAgICAgLyogSWYgd2UgZ2V0IGhlcmUsIGV4dHJhY3RfbG9uZ191bnNpZ25lZF9pbnRlZ2VyIHNldCB2YWxfbG9uZy4gICovCisgICAgfQorICBlbHNlIGlmIChmb3JtYXQgIT0gJ2YnKQorICAgIHZhbF9sb25nID0gdW5wYWNrX2xvbmcgKHR5cGUsIHZhbGFkZHIpOworCisgIC8qIElmIHdlIGFyZSBwcmludGluZyBpdCBhcyB1bnNpZ25lZCwgdHJ1bmNhdGUgaXQgaW4gY2FzZSBpdCBpcyBhY3R1YWxseQorICAgICBhIG5lZ2F0aXZlIHNpZ25lZCB2YWx1ZSAoZS5nLiAicHJpbnQvdSAoc2hvcnQpLTEiIHNob3VsZCBwcmludCA2NTUzNQorICAgICAoaWYgc2hvcnRzIGFyZSAxNiBiaXRzKSBpbnN0ZWFkIG9mIDQyOTQ5NjcyOTUpLiAgKi8KKyAgaWYgKGZvcm1hdCAhPSAnZCcpCisgICAgeworICAgICAgaWYgKGxlbiA8IHNpemVvZiAoTE9OR0VTVCkpCisJdmFsX2xvbmcgJj0gKChMT05HRVNUKSAxIDw8IEhPU1RfQ0hBUl9CSVQgKiBsZW4pIC0gMTsKKyAgICB9CisKKyAgc3dpdGNoIChmb3JtYXQpCisgICAgeworICAgIGNhc2UgJ3gnOgorICAgICAgaWYgKCFzaXplKQorCXsKKwkgIC8qIG5vIHNpemUgc3BlY2lmaWVkLCBsaWtlIGluIHByaW50LiAgUHJpbnQgdmFyeWluZyAjIG9mIGRpZ2l0cy4gKi8KKwkgIHByaW50X2xvbmdlc3QgKHN0cmVhbSwgJ3gnLCAxLCB2YWxfbG9uZyk7CisJfQorICAgICAgZWxzZQorCXN3aXRjaCAoc2l6ZSkKKwkgIHsKKwkgIGNhc2UgJ2InOgorCSAgY2FzZSAnaCc6CisJICBjYXNlICd3JzoKKwkgIGNhc2UgJ2cnOgorCSAgICBwcmludF9sb25nZXN0IChzdHJlYW0sIHNpemUsIDEsIHZhbF9sb25nKTsKKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICBlcnJvciAoIlVuZGVmaW5lZCBvdXRwdXQgc2l6ZSBcIiVjXCIuIiwgc2l6ZSk7CisJICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2QnOgorICAgICAgcHJpbnRfbG9uZ2VzdCAoc3RyZWFtLCAnZCcsIDEsIHZhbF9sb25nKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAndSc6CisgICAgICBwcmludF9sb25nZXN0IChzdHJlYW0sICd1JywgMCwgdmFsX2xvbmcpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdvJzoKKyAgICAgIGlmICh2YWxfbG9uZykKKwlwcmludF9sb25nZXN0IChzdHJlYW0sICdvJywgMSwgdmFsX2xvbmcpOworICAgICAgZWxzZQorCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjAiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnYSc6CisgICAgICBwcmludF9hZGRyZXNzICh1bnBhY2tfcG9pbnRlciAodHlwZSwgdmFsYWRkciksIHN0cmVhbSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2MnOgorICAgICAgdmFsdWVfcHJpbnQgKHZhbHVlX2Zyb21fbG9uZ2VzdCAoYnVpbHRpbl90eXBlX2NoYXIsIHZhbF9sb25nKSwgc3RyZWFtLCAwLAorCQkgICBWYWxfcHJldHR5X2RlZmF1bHQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdmJzoKKyAgICAgIGlmIChsZW4gPT0gc2l6ZW9mIChmbG9hdCkpCisJdHlwZSA9IGJ1aWx0aW5fdHlwZV9mbG9hdDsKKyAgICAgIGVsc2UgaWYgKGxlbiA9PSBzaXplb2YgKGRvdWJsZSkpCisJdHlwZSA9IGJ1aWx0aW5fdHlwZV9kb3VibGU7CisgICAgICBwcmludF9mbG9hdGluZyAodmFsYWRkciwgdHlwZSwgc3RyZWFtKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAwOgorICAgICAgYWJvcnQgKCk7CisKKyAgICBjYXNlICd0JzoKKyAgICAgIC8qIEJpbmFyeTsgJ3QnIHN0YW5kcyBmb3IgInR3byIuICAqLworICAgICAgeworICAgICAgICBjaGFyIGJpdHNbOCooc2l6ZW9mIHZhbF9sb25nKSArIDFdOworICAgICAgICBjaGFyIGJ1Zls4KihzaXplb2YgdmFsX2xvbmcpICsgMzJdOworCWNoYXIgKmNwID0gYml0czsKKwlpbnQgd2lkdGg7CisKKyAgICAgICAgaWYgKCFzaXplKQorCSAgd2lkdGggPSA4KihzaXplb2YgdmFsX2xvbmcpOworICAgICAgICBlbHNlCisgICAgICAgICAgc3dpdGNoIChzaXplKQorCSAgICB7CisJICAgIGNhc2UgJ2InOgorCSAgICAgIHdpZHRoID0gODsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnaCc6CisJICAgICAgd2lkdGggPSAxNjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAndyc6CisJICAgICAgd2lkdGggPSAzMjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnZyc6CisJICAgICAgd2lkdGggPSA2NDsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBlcnJvciAoIlVuZGVmaW5lZCBvdXRwdXQgc2l6ZSBcIiVjXCIuIiwgc2l6ZSk7CisJICAgIH0KKworICAgICAgICBiaXRzW3dpZHRoXSA9ICdcMCc7CisgICAgICAgIHdoaWxlICh3aWR0aC0tID4gMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBiaXRzW3dpZHRoXSA9ICh2YWxfbG9uZyAmIDEpID8gJzEnIDogJzAnOworICAgICAgICAgICAgdmFsX2xvbmcgPj49IDE7CisgICAgICAgICAgfQorCWlmICghc2l6ZSkKKwkgIHsKKwkgICAgd2hpbGUgKCpjcCAmJiAqY3AgPT0gJzAnKQorCSAgICAgIGNwKys7CisJICAgIGlmICgqY3AgPT0gJ1wwJykKKwkgICAgICBjcC0tOworCSAgfQorCXN0cmNweSAoYnVmLCBsb2NhbF9iaW5hcnlfZm9ybWF0X3ByZWZpeCgpKTsKKwlzdHJjYXQgKGJ1ZiwgY3ApOworCXN0cmNhdCAoYnVmLCBsb2NhbF9iaW5hcnlfZm9ybWF0X3N1ZmZpeCgpKTsJCisgICAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgYnVmKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yICgiVW5kZWZpbmVkIG91dHB1dCBmb3JtYXQgXCIlY1wiLiIsIGZvcm1hdCk7CisgICAgfQorfQorCisvKiBTcGVjaWZ5IGRlZmF1bHQgYWRkcmVzcyBmb3IgYHgnIGNvbW1hbmQuCisgICBgaW5mbyBsaW5lcycgdXNlcyB0aGlzLiAgKi8KKwordm9pZAorc2V0X25leHRfYWRkcmVzcyAoYWRkcikKKyAgICAgQ09SRV9BRERSIGFkZHI7Cit7CisgIG5leHRfYWRkcmVzcyA9IGFkZHI7CisKKyAgLyogTWFrZSBhZGRyZXNzIGF2YWlsYWJsZSB0byB0aGUgdXNlciBhcyAkXy4gICovCisgIHNldF9pbnRlcm5hbHZhciAobG9va3VwX2ludGVybmFsdmFyICgiXyIpLAorCQkgICB2YWx1ZV9mcm9tX2xvbmdlc3QgKGxvb2t1cF9wb2ludGVyX3R5cGUgKGJ1aWx0aW5fdHlwZV92b2lkKSwKKwkJCQkgICAgKExPTkdFU1QpIGFkZHIpKTsKK30KKworLyogT3B0aW9uYWxseSBwcmludCBhZGRyZXNzIEFERFIgc3ltYm9saWNhbGx5IGFzIDxTWU1CT0wrT0ZGU0VUPiBvbiBTVFJFQU0sCisgICBhZnRlciBMRUFESU4uICBQcmludCBub3RoaW5nIGlmIG5vIHN5bWJvbGljIG5hbWUgaXMgZm91bmQgbmVhcmJ5LgorICAgT3B0aW9uYWxseSBhbHNvIHByaW50IHNvdXJjZSBmaWxlIGFuZCBsaW5lIG51bWJlciwgaWYgYXZhaWxhYmxlLgorICAgRE9fREVNQU5HTEUgY29udHJvbHMgd2hldGhlciB0byBwcmludCBhIHN5bWJvbCBpbiBpdHMgbmF0aXZlICJyYXciIGZvcm0sCisgICBvciB0byBpbnRlcnByZXQgaXQgYXMgYSBwb3NzaWJsZSBDKysgbmFtZSBhbmQgY29udmVydCBpdCBiYWNrIHRvIHNvdXJjZQorICAgZm9ybS4gIEhvd2V2ZXIgbm90ZSB0aGF0IERPX0RFTUFOR0xFIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBzcGVjaWZpYworICAgc2V0dGluZ3Mgb2YgdGhlIGRlbWFuZ2xlIGFuZCBhc21fZGVtYW5nbGUgdmFyaWFibGVzLiAgKi8KKwordm9pZAorcHJpbnRfYWRkcmVzc19zeW1ib2xpYyAoYWRkciwgc3RyZWFtLCBkb19kZW1hbmdsZSwgbGVhZGluKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgaW50IGRvX2RlbWFuZ2xlOworICAgICBjaGFyICpsZWFkaW47Cit7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbDsKKyAgc3RydWN0IHN5bWJvbCAqc3ltYm9sOworICBzdHJ1Y3Qgc3ltdGFiICpzeW10YWIgPSAwOworICBDT1JFX0FERFIgbmFtZV9sb2NhdGlvbiA9IDA7CisgIGNoYXIgKm5hbWUgPSAiIjsKKyAgYXNlY3Rpb24gKnNlY3Rpb24gPSAwOworICBpbnQgdW5tYXBwZWQgPSAwOworCisgIC8qIERldGVybWluZSBpZiB0aGUgYWRkcmVzcyBpcyBpbiBhbiBvdmVybGF5LCBhbmQgd2hldGhlciBpdCBpcyBtYXBwZWQuICovCisgIGlmIChvdmVybGF5X2RlYnVnZ2luZykKKyAgICB7CisgICAgICBzZWN0aW9uID0gZmluZF9wY19vdmVybGF5IChhZGRyKTsKKyAgICAgIGlmIChwY19pbl91bm1hcHBlZF9yYW5nZSAoYWRkciwgc2VjdGlvbikpCisJeworCSAgdW5tYXBwZWQgPSAxOworCSAgYWRkciA9IG92ZXJsYXlfbWFwcGVkX2FkZHJlc3MgKGFkZHIsIHNlY3Rpb24pOworCX0KKyAgICB9CisKKyAgLyogT24gc29tZSB0YXJnZXRzLCBhZGQgaW4gZXh0cmEgImZsYWciIGJpdHMgdG8gUEMgZm9yCisgICAgIGRpc2Fzc2VtYmx5LiAgVGhpcyBzaG91bGQgZW5zdXJlIHRoYXQgInJvdW5kaW5nIGVycm9ycyIgaW4KKyAgICAgc3ltYm9sIGFkZHJlc3NlcyB0aGF0IGFyZSBtYXNrZWQgZm9yIGRpc2Fzc2VtYmx5IGZhdm91ciB0aGUKKyAgICAgdGhlIGNvcnJlY3Qgc3ltYm9sLiAqLworCisjaWZkZWYgR0RCX1RBUkdFVF9VTk1BU0tfRElTQVNfUEMKKyAgYWRkciA9IEdEQl9UQVJHRVRfVU5NQVNLX0RJU0FTX1BDIChhZGRyKTsKKyNlbmRpZgorCisgIC8qIEZpcnN0IHRyeSB0byBmaW5kIHRoZSBhZGRyZXNzIGluIHRoZSBzeW1ib2wgdGFibGUsIHRoZW4KKyAgICAgaW4gdGhlIG1pbnN5bXMuICBUYWtlIHRoZSBjbG9zZXN0IG9uZS4gICovCisKKyAgLyogVGhpcyBpcyBkZWZlY3RpdmUgaW4gdGhlIHNlbnNlIHRoYXQgaXQgb25seSBmaW5kcyB0ZXh0IHN5bWJvbHMuICBTbworICAgICByZWFsbHkgdGhpcyBpcyBraW5kIG9mIHBvaW50bGVzcy0td2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHRoZQorICAgICBtaW5pbWFsIHN5bWJvbHMgaGF2ZSBldmVyeXRoaW5nIHdlIG5lZWQgKGJ5IGNoYW5naW5nIHRoYXQgd2UgY291bGQKKyAgICAgc2F2ZSBzb21lIG1lbW9yeSwgYnV0IGZvciBtYW55IGRlYnVnIGZvcm1hdC0tRUxGL0RXQVJGIG9yCisgICAgIGFueXRoaW5nL3N0YWJzLS1pdCB3b3VsZCBiZSBpbmNvbnZlbmllbnQgdG8gZWxpbWluYXRlIHRob3NlIG1pbmltYWwKKyAgICAgc3ltYm9scyBhbnl3YXkpLiAgKi8KKyAgbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbF9ieV9wY19zZWN0aW9uIChhZGRyLCBzZWN0aW9uKTsKKyAgc3ltYm9sID0gZmluZF9wY19zZWN0X2Z1bmN0aW9uIChhZGRyLCBzZWN0aW9uKTsKKworICBpZiAoc3ltYm9sKQorICAgIHsKKyAgICAgIG5hbWVfbG9jYXRpb24gPSBCTE9DS19TVEFSVCAoU1lNQk9MX0JMT0NLX1ZBTFVFIChzeW1ib2wpKTsKKyAgICAgIGlmIChkb19kZW1hbmdsZSkKKwluYW1lID0gU1lNQk9MX1NPVVJDRV9OQU1FIChzeW1ib2wpOworICAgICAgZWxzZQorCW5hbWUgPSBTWU1CT0xfTElOS0FHRV9OQU1FIChzeW1ib2wpOworICAgIH0KKworICBpZiAobXN5bWJvbCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCkgPiBuYW1lX2xvY2F0aW9uIHx8IHN5bWJvbCA9PSBOVUxMKQorCXsKKwkgIC8qIFRoZSBtc3ltYm9sIGlzIGNsb3NlciB0byB0aGUgYWRkcmVzcyB0aGFuIHRoZSBzeW1ib2w7CisJICAgICB1c2UgdGhlIG1zeW1ib2wgaW5zdGVhZC4gICovCisJICBzeW1ib2wgPSAwOworCSAgc3ltdGFiID0gMDsKKwkgIG5hbWVfbG9jYXRpb24gPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCk7CisJICBpZiAoZG9fZGVtYW5nbGUpCisJICAgIG5hbWUgPSBTWU1CT0xfU09VUkNFX05BTUUgKG1zeW1ib2wpOworCSAgZWxzZQorCSAgICBuYW1lID0gU1lNQk9MX0xJTktBR0VfTkFNRSAobXN5bWJvbCk7CisJfQorICAgIH0KKyAgaWYgKHN5bWJvbCA9PSBOVUxMICYmIG1zeW1ib2wgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogT24gc29tZSB0YXJnZXRzLCBtYXNrIG91dCBleHRyYSAiZmxhZyIgYml0cyBmcm9tIFBDIGZvciBoYW5kc29tZQorICAgICBkaXNhc3NlbWJseS4gKi8KKworI2lmZGVmIEdEQl9UQVJHRVRfTUFTS19ESVNBU19QQworICBuYW1lX2xvY2F0aW9uID0gR0RCX1RBUkdFVF9NQVNLX0RJU0FTX1BDIChuYW1lX2xvY2F0aW9uKTsKKyAgYWRkciA9IEdEQl9UQVJHRVRfTUFTS19ESVNBU19QQyAoYWRkcik7CisjZW5kaWYKKworICAvKiBJZiB0aGUgbmVhcmVzdCBzeW1ib2wgaXMgdG9vIGZhciBhd2F5LCBkb24ndCBwcmludCBhbnl0aGluZyBzeW1ib2xpYy4gICovCisKKyAgLyogRm9yIHdoZW4gQ09SRV9BRERSIGlzIGxhcmdlciB0aGFuIHVuc2lnbmVkIGludCwgd2UgZG8gbWF0aCBpbgorICAgICBDT1JFX0FERFIuICBCdXQgd2hlbiB3ZSBkZXRlY3QgdW5zaWduZWQgd3JhcGFyb3VuZCBpbiB0aGUKKyAgICAgQ09SRV9BRERSIG1hdGgsIHdlIGlnbm9yZSB0aGlzIHRlc3QgYW5kIHByaW50IHRoZSBvZmZzZXQsCisgICAgIGJlY2F1c2UgYWRkcittYXhfc3ltYm9saWNfb2Zmc2V0IGhhcyB3cmFwcGVkIHRocm91Z2ggdGhlIGVuZAorICAgICBvZiB0aGUgYWRkcmVzcyBzcGFjZSBiYWNrIHRvIHRoZSBiZWdpbm5pbmcsIGdpdmluZyBib2d1cyBjb21wYXJpc29uLiAgKi8KKyAgaWYgKGFkZHIgPiBuYW1lX2xvY2F0aW9uICsgbWF4X3N5bWJvbGljX29mZnNldAorICAgICAgJiYgbmFtZV9sb2NhdGlvbiArIG1heF9zeW1ib2xpY19vZmZzZXQgPiBuYW1lX2xvY2F0aW9uKQorICAgIHJldHVybjsKKworICBmcHV0c19maWx0ZXJlZCAobGVhZGluLCBzdHJlYW0pOworICBpZiAodW5tYXBwZWQpCisgICAgZnB1dHNfZmlsdGVyZWQgKCI8KiIsIHN0cmVhbSk7CisgIGVsc2UKKyAgICBmcHV0c19maWx0ZXJlZCAoIjwiLCBzdHJlYW0pOworICBmcHV0c19maWx0ZXJlZCAobmFtZSwgc3RyZWFtKTsKKyAgaWYgKGFkZHIgIT0gbmFtZV9sb2NhdGlvbikKKyAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIrJXUiLCAodW5zaWduZWQgaW50KShhZGRyIC0gbmFtZV9sb2NhdGlvbikpOworCisgIC8qIEFwcGVuZCBzb3VyY2UgZmlsZW5hbWUgYW5kIGxpbmUgbnVtYmVyIGlmIGRlc2lyZWQuICBHaXZlIHNwZWNpZmljCisgICAgIGxpbmUgIyBvZiB0aGlzIGFkZHIsIGlmIHdlIGhhdmUgaXQ7IGVsc2UgbGluZSAjIG9mIHRoZSBuZWFyZXN0IHN5bWJvbC4gICovCisgIGlmIChwcmludF9zeW1ib2xfZmlsZW5hbWUpCisgICAgeworICAgICAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CisKKyAgICAgIHNhbCA9IGZpbmRfcGNfc2VjdF9saW5lIChhZGRyLCBzZWN0aW9uLCAwKTsKKworICAgICAgaWYgKHNhbC5zeW10YWIpCisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiIGF0ICVzOiVkIiwgc2FsLnN5bXRhYi0+ZmlsZW5hbWUsIHNhbC5saW5lKTsKKyAgICAgIGVsc2UgaWYgKHN5bXRhYiAmJiBzeW1ib2wgJiYgc3ltYm9sLT5saW5lKQorCWZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiBhdCAlczolZCIsIHN5bXRhYi0+ZmlsZW5hbWUsIHN5bWJvbC0+bGluZSk7CisgICAgICBlbHNlIGlmIChzeW10YWIpCisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiIGluICVzIiwgc3ltdGFiLT5maWxlbmFtZSk7CisgICAgfQorICBpZiAodW5tYXBwZWQpCisgICAgZnB1dHNfZmlsdGVyZWQgKCIqPiIsIHN0cmVhbSk7CisgIGVsc2UKKyAgICBmcHV0c19maWx0ZXJlZCAoIj4iLCBzdHJlYW0pOworfQorCisKKy8qIFByaW50IGFkZHJlc3MgQUREUiBvbiBTVFJFQU0uICBVU0VfTE9DQUwgbWVhbnMgdGhlIHNhbWUgdGhpbmcgYXMgZm9yCisgICBwcmludF9sb25nZXN0LiAgKi8KK3ZvaWQKK3ByaW50X2FkZHJlc3NfbnVtZXJpYyAoYWRkciwgdXNlX2xvY2FsLCBzdHJlYW0pCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBpbnQgdXNlX2xvY2FsOworICAgICBHREJfRklMRSAqc3RyZWFtOworeworICAvKiBUaGlzIGFzc3VtZXMgYSBDT1JFX0FERFIgY2FuIGZpdCBpbiBhIExPTkdFU1QuICBQcm9iYWJseSBhIHNhZmUKKyAgICAgYXNzdW1wdGlvbi4gICovCisgIHByaW50X2xvbmdlc3QgKHN0cmVhbSwgJ3gnLCB1c2VfbG9jYWwsIChVTE9OR0VTVCkgYWRkcik7Cit9CisKKy8qIFByaW50IGFkZHJlc3MgQUREUiBzeW1ib2xpY2FsbHkgb24gU1RSRUFNLgorICAgRmlyc3QgcHJpbnQgaXQgYXMgYSBudW1iZXIuICBUaGVuIHBlcmhhcHMgcHJpbnQKKyAgIDxTWU1CT0wgKyBPRkZTRVQ+IGFmdGVyIHRoZSBudW1iZXIuICAqLworCit2b2lkCitwcmludF9hZGRyZXNzIChhZGRyLCBzdHJlYW0pCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBHREJfRklMRSAqc3RyZWFtOworeworICBwcmludF9hZGRyZXNzX251bWVyaWMgKGFkZHIsIDEsIHN0cmVhbSk7CisgIHByaW50X2FkZHJlc3Nfc3ltYm9saWMgKGFkZHIsIHN0cmVhbSwgYXNtX2RlbWFuZ2xlLCAiICIpOworfQorCisvKiBQcmludCBhZGRyZXNzIEFERFIgc3ltYm9saWNhbGx5IG9uIFNUUkVBTS4gIFBhcmFtZXRlciBERU1BTkdMRQorICAgY29udHJvbHMgd2hldGhlciB0byBwcmludCB0aGUgc3ltYm9saWMgbmFtZSAicmF3IiBvciBkZW1hbmdsZWQuCisgICBHbG9iYWwgc2V0dGluZyAiYWRkcmVzc3ByaW50IiBjb250cm9scyB3aGV0aGVyIHRvIHByaW50IGhleCBhZGRyZXNzCisgICBvciBub3QuICAqLworCit2b2lkCitwcmludF9hZGRyZXNzX2RlbWFuZ2xlIChhZGRyLCBzdHJlYW0sIGRvX2RlbWFuZ2xlKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgaW50IGRvX2RlbWFuZ2xlOworeworICBpZiAoYWRkciA9PSAwKQorICAgIHsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjAiKTsKKyAgICB9CisgIGVsc2UgaWYgKGFkZHJlc3NwcmludCkKKyAgICB7CisgICAgICBwcmludF9hZGRyZXNzX251bWVyaWMgKGFkZHIsIDEsIHN0cmVhbSk7CisgICAgICBwcmludF9hZGRyZXNzX3N5bWJvbGljIChhZGRyLCBzdHJlYW0sIGRvX2RlbWFuZ2xlLCAiICIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50X2FkZHJlc3Nfc3ltYm9saWMgKGFkZHIsIHN0cmVhbSwgZG9fZGVtYW5nbGUsICIiKTsKKyAgICB9Cit9CisMCisKKy8qIFRoZXNlIGFyZSB0aGUgdHlwZXMgdGhhdCAkX18gd2lsbCBnZXQgYWZ0ZXIgYW4gZXhhbWluZSBjb21tYW5kIG9mIG9uZQorICAgb2YgdGhlc2Ugc2l6ZXMuICAqLworCitzdGF0aWMgc3RydWN0IHR5cGUgKmV4YW1pbmVfaV90eXBlOworCitzdGF0aWMgc3RydWN0IHR5cGUgKmV4YW1pbmVfYl90eXBlOworc3RhdGljIHN0cnVjdCB0eXBlICpleGFtaW5lX2hfdHlwZTsKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqZXhhbWluZV93X3R5cGU7CitzdGF0aWMgc3RydWN0IHR5cGUgKmV4YW1pbmVfZ190eXBlOworCisvKiBFeGFtaW5lIGRhdGEgYXQgYWRkcmVzcyBBRERSIGluIGZvcm1hdCBGTVQuCisgICBGZXRjaCBpdCBmcm9tIG1lbW9yeSBhbmQgcHJpbnQgb24gZ2RiX3N0ZG91dC4gICovCisKK3N0YXRpYyB2b2lkCitkb19leGFtaW5lIChmbXQsIGFkZHIsIHNlY3QpCisgICAgIHN0cnVjdCBmb3JtYXRfZGF0YSBmbXQ7CisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBhc2VjdGlvbiAqc2VjdDsKK3sKKyAgcmVnaXN0ZXIgY2hhciBmb3JtYXQgPSAwOworICByZWdpc3RlciBjaGFyIHNpemU7CisgIHJlZ2lzdGVyIGludCBjb3VudCA9IDE7CisgIHN0cnVjdCB0eXBlICp2YWxfdHlwZSA9IE5VTEw7CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBpbnQgbWF4ZWx0czsKKworICBmb3JtYXQgPSBmbXQuZm9ybWF0OworICBzaXplID0gZm10LnNpemU7CisgIGNvdW50ID0gZm10LmNvdW50OworICBuZXh0X2FkZHJlc3MgPSBhZGRyOworICBuZXh0X3NlY3Rpb24gPSBzZWN0OworCisgIC8qIFN0cmluZyBvciBpbnN0cnVjdGlvbiBmb3JtYXQgaW1wbGllcyBmZXRjaCBzaW5nbGUgYnl0ZXMKKyAgICAgcmVnYXJkbGVzcyBvZiB0aGUgc3BlY2lmaWVkIHNpemUuICAqLworICBpZiAoZm9ybWF0ID09ICdzJyB8fCBmb3JtYXQgPT0gJ2knKQorICAgIHNpemUgPSAnYic7CisKKyAgaWYgKGZvcm1hdCA9PSAnaScpCisgICAgdmFsX3R5cGUgPSBleGFtaW5lX2lfdHlwZTsKKyAgZWxzZSBpZiAoc2l6ZSA9PSAnYicpCisgICAgdmFsX3R5cGUgPSBleGFtaW5lX2JfdHlwZTsKKyAgZWxzZSBpZiAoc2l6ZSA9PSAnaCcpCisgICAgdmFsX3R5cGUgPSBleGFtaW5lX2hfdHlwZTsKKyAgZWxzZSBpZiAoc2l6ZSA9PSAndycpCisgICAgdmFsX3R5cGUgPSBleGFtaW5lX3dfdHlwZTsKKyAgZWxzZSBpZiAoc2l6ZSA9PSAnZycpCisgICAgdmFsX3R5cGUgPSBleGFtaW5lX2dfdHlwZTsKKworICBtYXhlbHRzID0gODsKKyAgaWYgKHNpemUgPT0gJ3cnKQorICAgIG1heGVsdHMgPSA0OworICBpZiAoc2l6ZSA9PSAnZycpCisgICAgbWF4ZWx0cyA9IDI7CisgIGlmIChmb3JtYXQgPT0gJ3MnIHx8IGZvcm1hdCA9PSAnaScpCisgICAgbWF4ZWx0cyA9IDE7CisKKyAgLyogUHJpbnQgYXMgbWFueSBvYmplY3RzIGFzIHNwZWNpZmllZCBpbiBDT1VOVCwgYXQgbW9zdCBtYXhlbHRzIHBlciBsaW5lLAorICAgICB3aXRoIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IG9uZSBhdCB0aGUgc3RhcnQgb2YgZWFjaCBsaW5lLiAgKi8KKworICB3aGlsZSAoY291bnQgPiAwKQorICAgIHsKKyAgICAgIFFVSVQ7CisgICAgICBwcmludF9hZGRyZXNzIChuZXh0X2FkZHJlc3MsIGdkYl9zdGRvdXQpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiOiIpOworICAgICAgZm9yIChpID0gbWF4ZWx0czsKKwkgICBpID4gMCAmJiBjb3VudCA+IDA7CisJICAgaS0tLCBjb3VudC0tKQorCXsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlx0Iik7CisJICAvKiBOb3RlIHRoYXQgcHJpbnRfZm9ybWF0dGVkIHNldHMgbmV4dF9hZGRyZXNzIGZvciB0aGUgbmV4dAorCSAgICAgb2JqZWN0LiAgKi8KKwkgIGxhc3RfZXhhbWluZV9hZGRyZXNzID0gbmV4dF9hZGRyZXNzOworCisJICBpZiAobGFzdF9leGFtaW5lX3ZhbHVlKQorCSAgICB2YWx1ZV9mcmVlIChsYXN0X2V4YW1pbmVfdmFsdWUpOworCisJICAvKiBUaGUgdmFsdWUgdG8gYmUgZGlzcGxheWVkIGlzIG5vdCBmZXRjaGVkIGdyZWVkaWx5LgorICAgICAgICAgICAgIEluc3RlYWQsIHRvIGF2b2lkIHRoZSBwb3NpYmlsaXR5IG9mIGEgZmV0Y2hlZCB2YWx1ZSBub3QKKyAgICAgICAgICAgICBiZWluZyB1c2VkLCBpdHMgcmV0cmV2YWwgaXMgZGVsYXllZCB1bnRpbCB0aGUgcHJpbnQgY29kZQorICAgICAgICAgICAgIHVzZXMgaXQuICBXaGVuIGV4YW1pbmluZyBhbiBpbnN0cnVjdGlvbiBzdHJlYW0sIHRoZQorICAgICAgICAgICAgIGRpc2Fzc2VtYmxlciB3aWxsIHBlcmZvcm0gaXRzIG93biBtZW1vcnkgZmV0Y2ggdXNpbmcganVzdAorICAgICAgICAgICAgIHRoZSBhZGRyZXNzIHN0b3JlZCBpbiBMQVNUX0VYQU1JTkVfVkFMVUUuICBGSVhNRTogU2hvdWxkCisgICAgICAgICAgICAgdGhlIGRpc2Fzc2VtYmxlciBiZSBtb2RpZmllZCBzbyB0aGF0IExBU1RfRVhBTUlORV9WQUxVRQorICAgICAgICAgICAgIGlzIGxlZnQgd2l0aCB0aGUgYnl0ZSBzZXF1ZW5jZSBmcm9tIHRoZSBsYXN0IGNvbXBsZXRlCisgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gZmV0Y2hlZCBmcm9tIG1lbW9yeT8gKi8KKwkgIGxhc3RfZXhhbWluZV92YWx1ZSA9IHZhbHVlX2F0X2xhenkgKHZhbF90eXBlLCBuZXh0X2FkZHJlc3MsIHNlY3QpOworCisJICBpZiAobGFzdF9leGFtaW5lX3ZhbHVlKQorCSAgICByZWxlYXNlX3ZhbHVlIChsYXN0X2V4YW1pbmVfdmFsdWUpOworCisJICBwcmludF9mb3JtYXR0ZWQgKGxhc3RfZXhhbWluZV92YWx1ZSwgZm9ybWF0LCBzaXplKTsKKwl9CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgICB9Cit9CisMCitzdGF0aWMgdm9pZAordmFsaWRhdGVfZm9ybWF0IChmbXQsIGNtZG5hbWUpCisgICAgIHN0cnVjdCBmb3JtYXRfZGF0YSBmbXQ7CisgICAgIGNoYXIgKmNtZG5hbWU7Cit7CisgIGlmIChmbXQuc2l6ZSAhPSAwKQorICAgIGVycm9yICgiU2l6ZSBsZXR0ZXJzIGFyZSBtZWFuaW5nbGVzcyBpbiBcIiVzXCIgY29tbWFuZC4iLCBjbWRuYW1lKTsKKyAgaWYgKGZtdC5jb3VudCAhPSAxKQorICAgIGVycm9yICgiSXRlbSBjb3VudCBvdGhlciB0aGFuIDEgaXMgbWVhbmluZ2xlc3MgaW4gXCIlc1wiIGNvbW1hbmQuIiwKKwkgICBjbWRuYW1lKTsKKyAgaWYgKGZtdC5mb3JtYXQgPT0gJ2knIHx8IGZtdC5mb3JtYXQgPT0gJ3MnKQorICAgIGVycm9yICgiRm9ybWF0IGxldHRlciBcIiVjXCIgaXMgbWVhbmluZ2xlc3MgaW4gXCIlc1wiIGNvbW1hbmQuIiwKKwkgICBmbXQuZm9ybWF0LCBjbWRuYW1lKTsKK30KKworLyogIEV2YWx1YXRlIHN0cmluZyBFWFAgYXMgYW4gZXhwcmVzc2lvbiBpbiB0aGUgY3VycmVudCBsYW5ndWFnZSBhbmQKKyAgICBwcmludCB0aGUgcmVzdWx0aW5nIHZhbHVlLiAgRVhQIG1heSBjb250YWluIGEgZm9ybWF0IHNwZWNpZmllciBhcyB0aGUKKyAgICBmaXJzdCBhcmd1bWVudCAoIi94IG15dmFyIiBmb3IgZXhhbXBsZSwgdG8gcHJpbnQgbXl2YXIgaW4gaGV4KS4KKyAgICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfY29tbWFuZF8xIChleHAsIGluc3BlY3QsIHZvaWRwcmludCkKKyAgICAgY2hhciAqZXhwOworICAgICBpbnQgaW5zcGVjdDsKKyAgICAgaW50IHZvaWRwcmludDsKK3sKKyAgc3RydWN0IGV4cHJlc3Npb24gKmV4cHI7CisgIHJlZ2lzdGVyIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW4gPSAwOworICByZWdpc3RlciBjaGFyIGZvcm1hdCA9IDA7CisgIHJlZ2lzdGVyIHZhbHVlX3B0ciB2YWw7CisgIHN0cnVjdCBmb3JtYXRfZGF0YSBmbXQ7CisgIGludCBjbGVhbnVwID0gMDsKKworICAvKiBQYXNzIGluc3BlY3QgZmxhZyB0byB0aGUgcmVzdCBvZiB0aGUgcHJpbnQgcm91dGluZXMgaW4gYSBnbG9iYWwgKHNpZ2gpLiAqLworICBpbnNwZWN0X2l0ID0gaW5zcGVjdDsKKworICBpZiAoZXhwICYmICpleHAgPT0gJy8nKQorICAgIHsKKyAgICAgIGV4cCsrOworICAgICAgZm10ID0gZGVjb2RlX2Zvcm1hdCAoJmV4cCwgbGFzdF9mb3JtYXQsIDApOworICAgICAgdmFsaWRhdGVfZm9ybWF0IChmbXQsICJwcmludCIpOworICAgICAgbGFzdF9mb3JtYXQgPSBmb3JtYXQgPSBmbXQuZm9ybWF0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZtdC5jb3VudCA9IDE7CisgICAgICBmbXQuZm9ybWF0ID0gMDsKKyAgICAgIGZtdC5zaXplID0gMDsKKyAgICB9CisKKyAgaWYgKGV4cCAmJiAqZXhwKQorICAgIHsKKyAgICAgIGV4dGVybiBpbnQgb2JqZWN0cHJpbnQ7CisgICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgIGV4cHIgPSBwYXJzZV9leHByZXNzaW9uIChleHApOworICAgICAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfY3VycmVudF9jb250ZW50cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHByKTsKKyAgICAgIGNsZWFudXAgPSAxOworICAgICAgdmFsID0gZXZhbHVhdGVfZXhwcmVzc2lvbiAoZXhwcik7CisKKyAgICAgIC8qIEMrKzogZmlndXJlIG91dCB3aGF0IHR5cGUgd2UgYWN0dWFsbHkgd2FudCB0byBwcmludCBpdCBhcy4gICovCisgICAgICB0eXBlID0gVkFMVUVfVFlQRSAodmFsKTsKKworICAgICAgaWYgKG9iamVjdHByaW50CisJICAmJiAoICAgVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfUFRSCisJICAgICAgfHwgVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfUkVGKQorCSAgJiYgKCAgIFRZUEVfQ09ERSAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpID09IFRZUEVfQ09ERV9TVFJVQ1QKKwkgICAgICB8fCBUWVBFX0NPREUgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKSA9PSBUWVBFX0NPREVfVU5JT04pKQorCXsKKwkgIHZhbHVlX3B0ciB2OworCisJICB2ID0gdmFsdWVfZnJvbV92dGFibGVfaW5mbyAodmFsLCBUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSk7CisJICBpZiAodiAhPSAwKQorCSAgICB7CisJICAgICAgdmFsID0gdjsKKwkgICAgICB0eXBlID0gVkFMVUVfVFlQRSAodmFsKTsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB2YWwgPSBhY2Nlc3NfdmFsdWVfaGlzdG9yeSAoMCk7CisKKyAgaWYgKHZvaWRwcmludCB8fCAodmFsICYmIFZBTFVFX1RZUEUgKHZhbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgVFlQRV9DT0RFIChWQUxVRV9UWVBFICh2YWwpKSAhPSBUWVBFX0NPREVfVk9JRCkpCisgICAgeworICAgICAgaW50IGhpc3RpbmRleCA9IHJlY29yZF9sYXRlc3RfdmFsdWUgKHZhbCk7CisKKyAgICAgIGlmIChoaXN0aW5kZXggPj0gMCkKKwlhbm5vdGF0ZV92YWx1ZV9oaXN0b3J5X2JlZ2luIChoaXN0aW5kZXgsIFZBTFVFX1RZUEUgKHZhbCkpOworICAgICAgZWxzZQorCWFubm90YXRlX3ZhbHVlX2JlZ2luIChWQUxVRV9UWVBFICh2YWwpKTsKKworICAgICAgaWYgKGluc3BlY3QpCisJcHJpbnRmX3VuZmlsdGVyZWQgKCJcMDMxKGdkYi1tYWtlYnVmZmVyIFwiJXNcIiAgJWQgJyhcIiIsIGV4cCwgaGlzdGluZGV4KTsKKyAgICAgIGVsc2UKKwlpZiAoaGlzdGluZGV4ID49IDApIHByaW50Zl9maWx0ZXJlZCAoIiQlZCA9ICIsIGhpc3RpbmRleCk7CisKKyAgICAgIGlmIChoaXN0aW5kZXggPj0gMCkKKwlhbm5vdGF0ZV92YWx1ZV9oaXN0b3J5X3ZhbHVlICgpOworCisgICAgICBwcmludF9mb3JtYXR0ZWQgKHZhbCwgZm9ybWF0LCBmbXQuc2l6ZSk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworCisgICAgICBpZiAoaGlzdGluZGV4ID49IDApCisJYW5ub3RhdGVfdmFsdWVfaGlzdG9yeV9lbmQgKCk7CisgICAgICBlbHNlCisJYW5ub3RhdGVfdmFsdWVfZW5kICgpOworCisgICAgICBpZiAoaW5zcGVjdCkKKwlwcmludGZfdW5maWx0ZXJlZCgiXCIpIClcMDMwIik7CisgICAgfQorCisgIGlmIChjbGVhbnVwKQorICAgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworICBpbnNwZWN0X2l0ID0gMDsJLyogUmVzZXQgcHJpbnQgcm91dGluZXMgdG8gbm9ybWFsICovCit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorcHJpbnRfY29tbWFuZCAoZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHByaW50X2NvbW1hbmRfMSAoZXhwLCAwLCAxKTsKK30KKworLyogU2FtZSBhcyBwcmludCwgZXhjZXB0IGluIGVwb2NoLCBpdCBnZXRzIGl0cyBvd24gd2luZG93ICovCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2luc3BlY3RfY29tbWFuZCAoZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGV4dGVybiBpbnQgZXBvY2hfaW50ZXJmYWNlOworCisgIHByaW50X2NvbW1hbmRfMSAoZXhwLCBlcG9jaF9pbnRlcmZhY2UsIDEpOworfQorCisvKiBTYW1lIGFzIHByaW50LCBleGNlcHQgaXQgZG9lc24ndCBwcmludCB2b2lkIHJlc3VsdHMuICovCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2NhbGxfY29tbWFuZCAoZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHByaW50X2NvbW1hbmRfMSAoZXhwLCAwLCAwKTsKK30KKworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK291dHB1dF9jb21tYW5kIChleHAsIGZyb21fdHR5KQorICAgICBjaGFyICpleHA7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgc3RydWN0IGV4cHJlc3Npb24gKmV4cHI7CisgIHJlZ2lzdGVyIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisgIHJlZ2lzdGVyIGNoYXIgZm9ybWF0ID0gMDsKKyAgcmVnaXN0ZXIgdmFsdWVfcHRyIHZhbDsKKyAgc3RydWN0IGZvcm1hdF9kYXRhIGZtdDsKKworICBpZiAoZXhwICYmICpleHAgPT0gJy8nKQorICAgIHsKKyAgICAgIGV4cCsrOworICAgICAgZm10ID0gZGVjb2RlX2Zvcm1hdCAoJmV4cCwgMCwgMCk7CisgICAgICB2YWxpZGF0ZV9mb3JtYXQgKGZtdCwgIm91dHB1dCIpOworICAgICAgZm9ybWF0ID0gZm10LmZvcm1hdDsKKyAgICB9CisKKyAgZXhwciA9IHBhcnNlX2V4cHJlc3Npb24gKGV4cCk7CisgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlX2N1cnJlbnRfY29udGVudHMsICZleHByKTsKKworICB2YWwgPSBldmFsdWF0ZV9leHByZXNzaW9uIChleHByKTsKKworICBhbm5vdGF0ZV92YWx1ZV9iZWdpbiAoVkFMVUVfVFlQRSAodmFsKSk7CisKKyAgcHJpbnRfZm9ybWF0dGVkICh2YWwsIGZvcm1hdCwgZm10LnNpemUpOworCisgIGFubm90YXRlX3ZhbHVlX2VuZCAoKTsKKworICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitzZXRfY29tbWFuZCAoZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCBleHByZXNzaW9uICpleHByID0gcGFyc2VfZXhwcmVzc2lvbiAoZXhwKTsKKyAgcmVnaXN0ZXIgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbgorICAgID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfY3VycmVudF9jb250ZW50cywgJmV4cHIpOworICBldmFsdWF0ZV9leHByZXNzaW9uIChleHByKTsKKyAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorc3ltX2luZm8gKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50ICAgZnJvbV90dHk7Cit7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbDsKKyAgc3RydWN0IG9iamZpbGUgICAgICAgICpvYmpmaWxlOworICBzdHJ1Y3Qgb2JqX3NlY3Rpb24gICAgKm9zZWN0OworICBhc2VjdGlvbiAgICAgICAgICAgICAgKnNlY3Q7CisgIENPUkVfQUREUiAgICAgICAgICAgICAgYWRkciwgc2VjdF9hZGRyOworICBpbnQgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgPSAwOworICB1bnNpZ25lZCBpbnQgICAgICAgICAgIG9mZnNldDsKKworICBpZiAoIWFyZykKKyAgICBlcnJvcl9ub19hcmcgKCJhZGRyZXNzIik7CisKKyAgYWRkciA9IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgKGFyZyk7CisgIEFMTF9PQkpTRUNUSU9OUyAob2JqZmlsZSwgb3NlY3QpCisgICAgeworICAgICAgc2VjdCA9IG9zZWN0LT50aGVfYmZkX3NlY3Rpb247CisgICAgICBzZWN0X2FkZHIgPSBvdmVybGF5X21hcHBlZF9hZGRyZXNzIChhZGRyLCBzZWN0KTsKKworICAgICAgaWYgKG9zZWN0LT5hZGRyIDw9IHNlY3RfYWRkciAmJiBzZWN0X2FkZHIgPCBvc2VjdC0+ZW5kYWRkciAmJgorCSAgKG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGNfc2VjdGlvbiAoc2VjdF9hZGRyLCBzZWN0KSkpCisJeworCSAgbWF0Y2hlcyA9IDE7CisJICBvZmZzZXQgPSBzZWN0X2FkZHIgLSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCk7CisJICBpZiAob2Zmc2V0KQorCSAgICBwcmludGZfZmlsdGVyZWQgKCIlcyArICV1IGluICIsIAorCQkJICAgICBTWU1CT0xfU09VUkNFX05BTUUgKG1zeW1ib2wpLCBvZmZzZXQpOworCSAgZWxzZQorCSAgICBwcmludGZfZmlsdGVyZWQgKCIlcyBpbiAiLCAKKwkJCSAgICAgU1lNQk9MX1NPVVJDRV9OQU1FIChtc3ltYm9sKSk7CisJICBpZiAocGNfaW5fdW5tYXBwZWRfcmFuZ2UgKGFkZHIsIHNlY3QpKQorCSAgICBwcmludGZfZmlsdGVyZWQgKCJsb2FkIGFkZHJlc3MgcmFuZ2Ugb2YgIik7CisJICBpZiAoc2VjdGlvbl9pc19vdmVybGF5IChzZWN0KSkKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgiJXMgb3ZlcmxheSAiLCAKKwkJCSAgICAgc2VjdGlvbl9pc19tYXBwZWQgKHNlY3QpID8gIm1hcHBlZCIgOiAidW5tYXBwZWQiKTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoInNlY3Rpb24gJXMiLCBzZWN0LT5uYW1lKTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisJfQorICAgIH0KKyAgaWYgKG1hdGNoZXMgPT0gMCkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJObyBzeW1ib2wgbWF0Y2hlcyAlcy5cbiIsIGFyZyk7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorYWRkcmVzc19pbmZvIChleHAsIGZyb21fdHR5KQorICAgICBjaGFyICpleHA7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bWJvbCAqc3ltOworICByZWdpc3RlciBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisgIHJlZ2lzdGVyIGxvbmcgdmFsOworICByZWdpc3RlciBsb25nIGJhc2VyZWc7CisgIGFzZWN0aW9uICpzZWN0aW9uOworICBDT1JFX0FERFIgbG9hZF9hZGRyOworICBpbnQgaXNfYV9maWVsZF9vZl90aGlzOwkvKiBDKys6IGxvb2t1cF9zeW1ib2wgc2V0cyB0aGlzIHRvIG5vbnplcm8KKwkJCQkgICBpZiBleHAgaXMgYSBmaWVsZCBvZiBgdGhpcycuICovCisKKyAgaWYgKGV4cCA9PSAwKQorICAgIGVycm9yICgiQXJndW1lbnQgcmVxdWlyZWQuIik7CisKKyAgc3ltID0gbG9va3VwX3N5bWJvbCAoZXhwLCBnZXRfc2VsZWN0ZWRfYmxvY2sgKCksIFZBUl9OQU1FU1BBQ0UsIAorCQkgICAgICAgJmlzX2FfZmllbGRfb2ZfdGhpcywgKHN0cnVjdCBzeW10YWIgKiopTlVMTCk7CisgIGlmIChzeW0gPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoaXNfYV9maWVsZF9vZl90aGlzKQorCXsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlN5bWJvbCBcIiIpOworCSAgZnByaW50Zl9zeW1ib2xfZmlsdGVyZWQgKGdkYl9zdGRvdXQsIGV4cCwKKwkJCQkgICBjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSwgRE1HTF9BTlNJKTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlwiIGlzIGEgZmllbGQgb2YgdGhlIGxvY2FsIGNsYXNzIHZhcmlhYmxlIGB0aGlzJ1xuIik7CisJICByZXR1cm47CisJfQorCisgICAgICBtc3ltYm9sID0gbG9va3VwX21pbmltYWxfc3ltYm9sIChleHAsIE5VTEwsIE5VTEwpOworCisgICAgICBpZiAobXN5bWJvbCAhPSBOVUxMKQorCXsKKwkgIGxvYWRfYWRkciA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKTsKKworCSAgcHJpbnRmX2ZpbHRlcmVkICgiU3ltYm9sIFwiIik7CisJICBmcHJpbnRmX3N5bWJvbF9maWx0ZXJlZCAoZ2RiX3N0ZG91dCwgZXhwLAorCQkJCSAgIGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2xhbmd1YWdlLCBETUdMX0FOU0kpOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiXCIgaXMgYXQgIik7CisJICBwcmludF9hZGRyZXNzX251bWVyaWMgKGxvYWRfYWRkciwgMSwgZ2RiX3N0ZG91dCk7CisJICBwcmludGZfZmlsdGVyZWQgKCIgaW4gYSBmaWxlIGNvbXBpbGVkIHdpdGhvdXQgZGVidWdnaW5nIik7CisJICBzZWN0aW9uID0gU1lNQk9MX0JGRF9TRUNUSU9OIChtc3ltYm9sKTsKKwkgIGlmIChzZWN0aW9uX2lzX292ZXJsYXkgKHNlY3Rpb24pKQorCSAgICB7CisJICAgICAgbG9hZF9hZGRyID0gb3ZlcmxheV91bm1hcHBlZF9hZGRyZXNzIChsb2FkX2FkZHIsIHNlY3Rpb24pOworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIixcbiAtLSBsb2FkZWQgYXQgIik7CisJICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChsb2FkX2FkZHIsIDEsIGdkYl9zdGRvdXQpOworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiBpbiBvdmVybGF5IHNlY3Rpb24gJXMiLCBzZWN0aW9uLT5uYW1lKTsKKwkgICAgfQorCSAgcHJpbnRmX2ZpbHRlcmVkICgiLlxuIik7CisJfQorICAgICAgZWxzZQorCWVycm9yICgiTm8gc3ltYm9sIFwiJXNcIiBpbiBjdXJyZW50IGNvbnRleHQuIiwgZXhwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiU3ltYm9sIFwiIik7CisgIGZwcmludGZfc3ltYm9sX2ZpbHRlcmVkIChnZGJfc3Rkb3V0LCBTWU1CT0xfTkFNRSAoc3ltKSwKKwkJCSAgIGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2xhbmd1YWdlLCBETUdMX0FOU0kpOworICBwcmludGZfZmlsdGVyZWQgKCJcIiBpcyAiKTsKKyAgdmFsICAgICA9IFNZTUJPTF9WQUxVRSAoc3ltKTsKKyAgYmFzZXJlZyA9IFNZTUJPTF9CQVNFUkVHIChzeW0pOworICBzZWN0aW9uID0gU1lNQk9MX0JGRF9TRUNUSU9OIChzeW0pOworCisgIHN3aXRjaCAoU1lNQk9MX0NMQVNTIChzeW0pKQorICAgIHsKKyAgICBjYXNlIExPQ19DT05TVDoKKyAgICBjYXNlIExPQ19DT05TVF9CWVRFUzoKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoImNvbnN0YW50Iik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTE9DX0xBQkVMOgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiYSBsYWJlbCBhdCBhZGRyZXNzICIpOworICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChsb2FkX2FkZHIgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltKSwgCisJCQkgICAgIDEsIGdkYl9zdGRvdXQpOworICAgICAgaWYgKHNlY3Rpb25faXNfb3ZlcmxheSAoc2VjdGlvbikpCisJeworCSAgbG9hZF9hZGRyID0gb3ZlcmxheV91bm1hcHBlZF9hZGRyZXNzIChsb2FkX2FkZHIsIHNlY3Rpb24pOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiLFxuIC0tIGxvYWRlZCBhdCAiKTsKKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAobG9hZF9hZGRyLCAxLCBnZGJfc3Rkb3V0KTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIiBpbiBvdmVybGF5IHNlY3Rpb24gJXMiLCBzZWN0aW9uLT5uYW1lKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTE9DX1JFR0lTVEVSOgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiYSB2YXJpYWJsZSBpbiByZWdpc3RlciAlcyIsIFJFR0lTVEVSX05BTUUgKHZhbCkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExPQ19TVEFUSUM6CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJzdGF0aWMgc3RvcmFnZSBhdCBhZGRyZXNzICIpOworICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChsb2FkX2FkZHIgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltKSwgCisJCQkgICAgIDEsIGdkYl9zdGRvdXQpOworICAgICAgaWYgKHNlY3Rpb25faXNfb3ZlcmxheSAoc2VjdGlvbikpCisJeworCSAgbG9hZF9hZGRyID0gb3ZlcmxheV91bm1hcHBlZF9hZGRyZXNzIChsb2FkX2FkZHIsIHNlY3Rpb24pOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiLFxuIC0tIGxvYWRlZCBhdCAiKTsKKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAobG9hZF9hZGRyLCAxLCBnZGJfc3Rkb3V0KTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIiBpbiBvdmVybGF5IHNlY3Rpb24gJXMiLCBzZWN0aW9uLT5uYW1lKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTE9DX0lORElSRUNUOgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiZXh0ZXJuYWwgZ2xvYmFsIChpbmRpcmVjdCBhZGRyZXNzaW5nKSwgYXQgYWRkcmVzcyAqKCIpOworICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChsb2FkX2FkZHIgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltKSwKKwkJCSAgICAgMSwgZ2RiX3N0ZG91dCk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIpIik7CisgICAgICBpZiAoc2VjdGlvbl9pc19vdmVybGF5IChzZWN0aW9uKSkKKwl7CisJICBsb2FkX2FkZHIgPSBvdmVybGF5X3VubWFwcGVkX2FkZHJlc3MgKGxvYWRfYWRkciwgc2VjdGlvbik7CisJICBwcmludGZfZmlsdGVyZWQgKCIsXG4gLS0gbG9hZGVkIGF0ICIpOworCSAgcHJpbnRfYWRkcmVzc19udW1lcmljIChsb2FkX2FkZHIsIDEsIGdkYl9zdGRvdXQpOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiIGluIG92ZXJsYXkgc2VjdGlvbiAlcyIsIHNlY3Rpb24tPm5hbWUpOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMT0NfUkVHUEFSTToKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoImFuIGFyZ3VtZW50IGluIHJlZ2lzdGVyICVzIiwgUkVHSVNURVJfTkFNRSAodmFsKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTE9DX1JFR1BBUk1fQUREUjoKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoImFkZHJlc3Mgb2YgYW4gYXJndW1lbnQgaW4gcmVnaXN0ZXIgJXMiLCBSRUdJU1RFUl9OQU1FICh2YWwpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMT0NfQVJHOgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiYW4gYXJndW1lbnQgYXQgb2Zmc2V0ICVsZCIsIHZhbCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTE9DX0xPQ0FMX0FSRzoKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoImFuIGFyZ3VtZW50IGF0IGZyYW1lIG9mZnNldCAlbGQiLCB2YWwpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExPQ19MT0NBTDoKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoImEgbG9jYWwgdmFyaWFibGUgYXQgZnJhbWUgb2Zmc2V0ICVsZCIsIHZhbCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTE9DX1JFRl9BUkc6CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJhIHJlZmVyZW5jZSBhcmd1bWVudCBhdCBvZmZzZXQgJWxkIiwgdmFsKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMT0NfQkFTRVJFRzoKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoImEgdmFyaWFibGUgYXQgb2Zmc2V0ICVsZCBmcm9tIHJlZ2lzdGVyICVzIiwKKwkgICAgICB2YWwsIFJFR0lTVEVSX05BTUUgKGJhc2VyZWcpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBMT0NfQkFTRVJFR19BUkc6CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJhbiBhcmd1bWVudCBhdCBvZmZzZXQgJWxkIGZyb20gcmVnaXN0ZXIgJXMiLAorCSAgICAgIHZhbCwgUkVHSVNURVJfTkFNRSAoYmFzZXJlZykpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExPQ19UWVBFREVGOgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiYSB0eXBlZGVmIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTE9DX0JMT0NLOgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiYSBmdW5jdGlvbiBhdCBhZGRyZXNzICIpOworI2lmZGVmIEdEQl9UQVJHRVRfTUFTS19ESVNBU19QQworICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljCisJKGxvYWRfYWRkcj0gR0RCX1RBUkdFVF9NQVNLX0RJU0FTX1BDIChCTE9DS19TVEFSVCAoU1lNQk9MX0JMT0NLX1ZBTFVFIChzeW0pKSksCisJIDEsIGdkYl9zdGRvdXQpOworI2Vsc2UKKyAgICAgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAobG9hZF9hZGRyPUJMT0NLX1NUQVJUIChTWU1CT0xfQkxPQ0tfVkFMVUUgKHN5bSkpLAorCQkJICAgICAxLCBnZGJfc3Rkb3V0KTsKKyNlbmRpZgorICAgICAgaWYgKHNlY3Rpb25faXNfb3ZlcmxheSAoc2VjdGlvbikpCisJeworCSAgbG9hZF9hZGRyID0gb3ZlcmxheV91bm1hcHBlZF9hZGRyZXNzIChsb2FkX2FkZHIsIHNlY3Rpb24pOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiLFxuIC0tIGxvYWRlZCBhdCAiKTsKKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAobG9hZF9hZGRyLCAxLCBnZGJfc3Rkb3V0KTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIiBpbiBvdmVybGF5IHNlY3Rpb24gJXMiLCBzZWN0aW9uLT5uYW1lKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTE9DX1VOUkVTT0xWRUQ6CisgICAgICB7CisJc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltOworCisJbXN5bSA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoU1lNQk9MX05BTUUgKHN5bSksIE5VTEwsIE5VTEwpOworCWlmIChtc3ltID09IE5VTEwpCisJICBwcmludGZfZmlsdGVyZWQgKCJ1bnJlc29sdmVkIik7CisJZWxzZQorCSAgeworCSAgICBzZWN0aW9uID0gU1lNQk9MX0JGRF9TRUNUSU9OIChtc3ltKTsKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgic3RhdGljIHN0b3JhZ2UgYXQgYWRkcmVzcyAiKTsKKwkgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChsb2FkX2FkZHIgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bSksIAorCQkJCSAgIDEsIGdkYl9zdGRvdXQpOworCSAgICBpZiAoc2VjdGlvbl9pc19vdmVybGF5IChzZWN0aW9uKSkKKwkgICAgICB7CisJCWxvYWRfYWRkciA9IG92ZXJsYXlfdW5tYXBwZWRfYWRkcmVzcyAobG9hZF9hZGRyLCBzZWN0aW9uKTsKKwkJcHJpbnRmX2ZpbHRlcmVkICgiLFxuIC0tIGxvYWRlZCBhdCAiKTsKKwkJcHJpbnRfYWRkcmVzc19udW1lcmljIChsb2FkX2FkZHIsIDEsIGdkYl9zdGRvdXQpOworCQlwcmludGZfZmlsdGVyZWQgKCIgaW4gb3ZlcmxheSBzZWN0aW9uICVzIiwgc2VjdGlvbi0+bmFtZSk7CisJICAgICAgfQorCSAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExPQ19USFJFQURfTE9DQUxfU1RBVElDOgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgKKyAgICAgICAgICAgICAgImEgdGhyZWFkLWxvY2FsIHZhcmlhYmxlIGF0IG9mZnNldCAlbGQgZnJvbSB0aGUgdGhyZWFkIGJhc2UgcmVnaXN0ZXIgJXMiLAorCSAgICAgIHZhbCwgUkVHSVNURVJfTkFNRSAoYmFzZXJlZykpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExPQ19PUFRJTUlaRURfT1VUOgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgib3B0aW1pemVkIG91dCIpOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBkZWZhdWx0OgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgib2YgdW5rbm93biAoYm90Y2hlZCkgdHlwZSIpOworICAgICAgYnJlYWs7CisgICAgfQorICBwcmludGZfZmlsdGVyZWQgKCIuXG4iKTsKK30KKwwKK3ZvaWQKK3hfY29tbWFuZCAoZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCBleHByZXNzaW9uICpleHByOworICBzdHJ1Y3QgZm9ybWF0X2RhdGEgZm10OworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworICBzdHJ1Y3QgdmFsdWUgKnZhbDsKKworICBmbXQuZm9ybWF0ID0gbGFzdF9mb3JtYXQ7CisgIGZtdC5zaXplID0gbGFzdF9zaXplOworICBmbXQuY291bnQgPSAxOworCisgIGlmIChleHAgJiYgKmV4cCA9PSAnLycpCisgICAgeworICAgICAgZXhwKys7CisgICAgICBmbXQgPSBkZWNvZGVfZm9ybWF0ICgmZXhwLCBsYXN0X2Zvcm1hdCwgbGFzdF9zaXplKTsKKyAgICB9CisKKyAgLyogSWYgd2UgaGF2ZSBhbiBleHByZXNzaW9uLCBldmFsdWF0ZSBpdCBhbmQgdXNlIGl0IGFzIHRoZSBhZGRyZXNzLiAgKi8KKworICBpZiAoZXhwICE9IDAgJiYgKmV4cCAhPSAwKQorICAgIHsKKyAgICAgIGV4cHIgPSBwYXJzZV9leHByZXNzaW9uIChleHApOworICAgICAgLyogQ2F1c2UgZXhwcmVzc2lvbiBub3QgdG8gYmUgdGhlcmUgYW55IG1vcmUKKwkgaWYgdGhpcyBjb21tYW5kIGlzIHJlcGVhdGVkIHdpdGggTmV3bGluZS4KKwkgQnV0IGRvbid0IGNsb2JiZXIgYSB1c2VyLWRlZmluZWQgY29tbWFuZCdzIGRlZmluaXRpb24uICAqLworICAgICAgaWYgKGZyb21fdHR5KQorCSpleHAgPSAwOworICAgICAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfY3VycmVudF9jb250ZW50cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHByKTsKKyAgICAgIHZhbCA9IGV2YWx1YXRlX2V4cHJlc3Npb24gKGV4cHIpOworICAgICAgaWYgKFRZUEVfQ09ERSAoVkFMVUVfVFlQRSAodmFsKSkgPT0gVFlQRV9DT0RFX1JFRikKKwl2YWwgPSB2YWx1ZV9pbmQgKHZhbCk7CisgICAgICAvKiBJbiBydmFsdWUgY29udGV4dHMsIHN1Y2ggYXMgdGhpcywgZnVuY3Rpb25zIGFyZSBjb2VyY2VkIGludG8KKwkgcG9pbnRlcnMgdG8gZnVuY3Rpb25zLiAgVGhpcyBtYWtlcyAieC9pIG1haW4iIHdvcmsuICAqLworICAgICAgaWYgKC8qIGxhc3RfZm9ybWF0ID09ICdpJworCSAgJiYgKi8gVFlQRV9DT0RFIChWQUxVRV9UWVBFICh2YWwpKSA9PSBUWVBFX0NPREVfRlVOQworCSAgJiYgVkFMVUVfTFZBTCAodmFsKSA9PSBsdmFsX21lbW9yeSkKKwluZXh0X2FkZHJlc3MgPSBWQUxVRV9BRERSRVNTICh2YWwpOworICAgICAgZWxzZQorCW5leHRfYWRkcmVzcyA9IHZhbHVlX2FzX3BvaW50ZXIgKHZhbCk7CisgICAgICBpZiAoVkFMVUVfQkZEX1NFQ1RJT04gKHZhbCkpCisJbmV4dF9zZWN0aW9uID0gVkFMVUVfQkZEX1NFQ1RJT04gKHZhbCk7CisgICAgICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKKyAgICB9CisKKyAgZG9fZXhhbWluZSAoZm10LCBuZXh0X2FkZHJlc3MsIG5leHRfc2VjdGlvbik7CisKKyAgLyogSWYgdGhlIGV4YW1pbmUgc3VjY2VlZHMsIHdlIHJlbWVtYmVyIGl0cyBzaXplIGFuZCBmb3JtYXQgZm9yIG5leHQgdGltZS4gICovCisgIGxhc3Rfc2l6ZSA9IGZtdC5zaXplOworICBsYXN0X2Zvcm1hdCA9IGZtdC5mb3JtYXQ7CisKKyAgLyogU2V0IGEgY291cGxlIG9mIGludGVybmFsIHZhcmlhYmxlcyBpZiBhcHByb3ByaWF0ZS4gKi8KKyAgaWYgKGxhc3RfZXhhbWluZV92YWx1ZSkKKyAgICB7CisgICAgICAvKiBNYWtlIGxhc3QgYWRkcmVzcyBleGFtaW5lZCBhdmFpbGFibGUgdG8gdGhlIHVzZXIgYXMgJF8uICBVc2UKKwkgdGhlIGNvcnJlY3QgcG9pbnRlciB0eXBlLiAgKi8KKyAgICAgIHNldF9pbnRlcm5hbHZhciAobG9va3VwX2ludGVybmFsdmFyICgiXyIpLAorCSAgICAgICB2YWx1ZV9mcm9tX2xvbmdlc3QgKAorCQkgbG9va3VwX3BvaW50ZXJfdHlwZSAoVkFMVUVfVFlQRSAobGFzdF9leGFtaW5lX3ZhbHVlKSksCisJCQkJICAgKExPTkdFU1QpIGxhc3RfZXhhbWluZV9hZGRyZXNzKSk7CisgICAgICAKKyAgICAgIC8qIE1ha2UgY29udGVudHMgb2YgbGFzdCBhZGRyZXNzIGV4YW1pbmVkIGF2YWlsYWJsZSB0byB0aGUgdXNlciBhcyAkX18uKi8KKyAgICAgIC8qIElmIHRoZSBsYXN0IHZhbHVlIGhhcyBub3QgYmVlbiBmZXRjaGVkIGZyb20gbWVtb3J5IHRoZW4gZG9uJ3QKKyAgICAgICAgIGZldGNoIGl0IG5vdyAtIGluc3RlYWQgbWFyayBpdCBieSB2b2lkaW5nIHRoZSAkX18gdmFyaWFibGUuICovCisgICAgICBpZiAoVkFMVUVfTEFaWSAobGFzdF9leGFtaW5lX3ZhbHVlKSkKKwlzZXRfaW50ZXJuYWx2YXIgKGxvb2t1cF9pbnRlcm5hbHZhciAoIl9fIiksCisJCQkgYWxsb2NhdGVfdmFsdWUgKGJ1aWx0aW5fdHlwZV92b2lkKSk7CisgICAgICBlbHNlCisJc2V0X2ludGVybmFsdmFyIChsb29rdXBfaW50ZXJuYWx2YXIgKCJfXyIpLCBsYXN0X2V4YW1pbmVfdmFsdWUpOworICAgIH0KK30KKworDAorLyogQWRkIGFuIGV4cHJlc3Npb24gdG8gdGhlIGF1dG8tZGlzcGxheSBjaGFpbi4KKyAgIFNwZWNpZnkgdGhlIGV4cHJlc3Npb24uICAqLworCitzdGF0aWMgdm9pZAorZGlzcGxheV9jb21tYW5kIChleHAsIGZyb21fdHR5KQorICAgICBjaGFyICpleHA7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgc3RydWN0IGZvcm1hdF9kYXRhIGZtdDsKKyAgcmVnaXN0ZXIgc3RydWN0IGV4cHJlc3Npb24gKmV4cHI7CisgIHJlZ2lzdGVyIHN0cnVjdCBkaXNwbGF5ICpuZXc7CisgIGludCBkaXNwbGF5X2l0ID0gMTsKKworI2lmIGRlZmluZWQoVFVJKQorICBpZiAodHVpX3ZlcnNpb24gJiYgKmV4cCA9PSAnJCcpCisgICAgZGlzcGxheV9pdCA9ICgoVHVpU3RhdHVzKXR1aURvKAorCQkgIChUdWlPcGFxdWVGdW5jUHRyKXR1aV92U2V0TGF5b3V0VG8sIGV4cCkgPT0gVFVJX0ZBSUxVUkUpOworI2VuZGlmCisKKyAgaWYgKGRpc3BsYXlfaXQpCisgICAgeworICAgICAgaWYgKGV4cCA9PSAwKQorCXsKKwkgIGRvX2Rpc3BsYXlzICgpOworCSAgcmV0dXJuOworCX0KKworICAgICAgaWYgKCpleHAgPT0gJy8nKQorCXsKKwkgIGV4cCsrOworCSAgZm10ID0gZGVjb2RlX2Zvcm1hdCAoJmV4cCwgMCwgMCk7CisJICBpZiAoZm10LnNpemUgJiYgZm10LmZvcm1hdCA9PSAwKQorCSAgICBmbXQuZm9ybWF0ID0gJ3gnOworCSAgaWYgKGZtdC5mb3JtYXQgPT0gJ2knIHx8IGZtdC5mb3JtYXQgPT0gJ3MnKQorCSAgICBmbXQuc2l6ZSA9ICdiJzsKKwl9CisgICAgICBlbHNlCisJeworCSAgZm10LmZvcm1hdCA9IDA7CisJICBmbXQuc2l6ZSA9IDA7CisJICBmbXQuY291bnQgPSAwOworCX0KKworICAgICAgaW5uZXJtb3N0X2Jsb2NrID0gMDsKKyAgICAgIGV4cHIgPSBwYXJzZV9leHByZXNzaW9uIChleHApOworCisgICAgICBuZXcgPSAoc3RydWN0IGRpc3BsYXkgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZGlzcGxheSkpOworCisgICAgICBuZXctPmV4cCA9IGV4cHI7CisgICAgICBuZXctPmJsb2NrID0gaW5uZXJtb3N0X2Jsb2NrOworICAgICAgbmV3LT5uZXh0ID0gZGlzcGxheV9jaGFpbjsKKyAgICAgIG5ldy0+bnVtYmVyID0gKytkaXNwbGF5X251bWJlcjsKKyAgICAgIG5ldy0+Zm9ybWF0ID0gZm10OworICAgICAgbmV3LT5zdGF0dXMgPSBlbmFibGVkOworICAgICAgZGlzcGxheV9jaGFpbiA9IG5ldzsKKworICAgICAgaWYgKGZyb21fdHR5ICYmIHRhcmdldF9oYXNfZXhlY3V0aW9uKQorCWRvX29uZV9kaXNwbGF5IChuZXcpOworCisgICAgICBkb250X3JlcGVhdCAoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2Rpc3BsYXkgKGQpCisgICAgIHN0cnVjdCBkaXNwbGF5ICpkOworeworICBmcmVlICgoUFRSKWQtPmV4cCk7CisgIGZyZWUgKChQVFIpZCk7Cit9CisKKy8qIENsZWFyIG91dCB0aGUgZGlzcGxheV9jaGFpbi4KKyAgIERvbmUgd2hlbiBuZXcgc3ltdGFicyBhcmUgbG9hZGVkLCBzaW5jZSB0aGlzIGludmFsaWRhdGVzCisgICB0aGUgdHlwZXMgc3RvcmVkIGluIG1hbnkgZXhwcmVzc2lvbnMuICAqLworCit2b2lkCitjbGVhcl9kaXNwbGF5cyAoKQoreworICByZWdpc3RlciBzdHJ1Y3QgZGlzcGxheSAqZDsKKworICB3aGlsZSAoKGQgPSBkaXNwbGF5X2NoYWluKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZyZWUgKChQVFIpZC0+ZXhwKTsKKyAgICAgIGRpc3BsYXlfY2hhaW4gPSBkLT5uZXh0OworICAgICAgZnJlZSAoKFBUUilkKTsKKyAgICB9Cit9CisKKy8qIERlbGV0ZSB0aGUgYXV0by1kaXNwbGF5IG51bWJlciBOVU0uICAqLworCitzdGF0aWMgdm9pZAorZGVsZXRlX2Rpc3BsYXkgKG51bSkKKyAgICAgaW50IG51bTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGRpc3BsYXkgKmQxLCAqZDsKKworICBpZiAoIWRpc3BsYXlfY2hhaW4pCisgICAgZXJyb3IgKCJObyBkaXNwbGF5IG51bWJlciAlZC4iLCBudW0pOworCisgIGlmIChkaXNwbGF5X2NoYWluLT5udW1iZXIgPT0gbnVtKQorICAgIHsKKyAgICAgIGQxID0gZGlzcGxheV9jaGFpbjsKKyAgICAgIGRpc3BsYXlfY2hhaW4gPSBkMS0+bmV4dDsKKyAgICAgIGZyZWVfZGlzcGxheSAoZDEpOworICAgIH0KKyAgZWxzZQorICAgIGZvciAoZCA9IGRpc3BsYXlfY2hhaW47IDsgZCA9IGQtPm5leHQpCisgICAgICB7CisJaWYgKGQtPm5leHQgPT0gMCkKKwkgIGVycm9yICgiTm8gZGlzcGxheSBudW1iZXIgJWQuIiwgbnVtKTsKKwlpZiAoZC0+bmV4dC0+bnVtYmVyID09IG51bSkKKwkgIHsKKwkgICAgZDEgPSBkLT5uZXh0OworCSAgICBkLT5uZXh0ID0gZDEtPm5leHQ7CisJICAgIGZyZWVfZGlzcGxheSAoZDEpOworCSAgICBicmVhazsKKwkgIH0KKyAgICAgIH0KK30KKworLyogRGVsZXRlIHNvbWUgdmFsdWVzIGZyb20gdGhlIGF1dG8tZGlzcGxheSBjaGFpbi4KKyAgIFNwZWNpZnkgdGhlIGVsZW1lbnQgbnVtYmVycy4gICovCisKK3N0YXRpYyB2b2lkCit1bmRpc3BsYXlfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqcCA9IGFyZ3M7CisgIHJlZ2lzdGVyIGNoYXIgKnAxOworICByZWdpc3RlciBpbnQgbnVtOworCisgIGlmIChhcmdzID09IDApCisgICAgeworICAgICAgaWYgKHF1ZXJ5ICgiRGVsZXRlIGFsbCBhdXRvLWRpc3BsYXkgZXhwcmVzc2lvbnM/ICIpKQorCWNsZWFyX2Rpc3BsYXlzICgpOworICAgICAgZG9udF9yZXBlYXQgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHdoaWxlICgqcCkKKyAgICB7CisgICAgICBwMSA9IHA7CisgICAgICB3aGlsZSAoKnAxID49ICcwJyAmJiAqcDEgPD0gJzknKSBwMSsrOworICAgICAgaWYgKCpwMSAmJiAqcDEgIT0gJyAnICYmICpwMSAhPSAnXHQnKQorCWVycm9yICgiQXJndW1lbnRzIG11c3QgYmUgZGlzcGxheSBudW1iZXJzLiIpOworCisgICAgICBudW0gPSBhdG9pIChwKTsKKworICAgICAgZGVsZXRlX2Rpc3BsYXkgKG51bSk7CisKKyAgICAgIHAgPSBwMTsKKyAgICAgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykgcCsrOworICAgIH0KKyAgZG9udF9yZXBlYXQgKCk7Cit9CisKKy8qIERpc3BsYXkgYSBzaW5nbGUgYXV0by1kaXNwbGF5LiAgCisgICBEbyBub3RoaW5nIGlmIHRoZSBkaXNwbGF5IGNhbm5vdCBiZSBwcmludGVkIGluIHRoZSBjdXJyZW50IGNvbnRleHQsCisgICBvciBpZiB0aGUgZGlzcGxheSBpcyBkaXNhYmxlZC4gKi8KKworc3RhdGljIHZvaWQKK2RvX29uZV9kaXNwbGF5IChkKQorICAgICBzdHJ1Y3QgZGlzcGxheSAqZDsKK3sKKyAgaW50IHdpdGhpbl9jdXJyZW50X3Njb3BlOworCisgIGlmIChkLT5zdGF0dXMgPT0gZGlzYWJsZWQpCisgICAgcmV0dXJuOworCisgIGlmIChkLT5ibG9jaykKKyAgICB3aXRoaW5fY3VycmVudF9zY29wZSA9IGNvbnRhaW5lZF9pbiAoZ2V0X3NlbGVjdGVkX2Jsb2NrICgpLCBkLT5ibG9jayk7CisgIGVsc2UKKyAgICB3aXRoaW5fY3VycmVudF9zY29wZSA9IDE7CisgIGlmICghd2l0aGluX2N1cnJlbnRfc2NvcGUpCisgICAgcmV0dXJuOworCisgIGN1cnJlbnRfZGlzcGxheV9udW1iZXIgPSBkLT5udW1iZXI7CisKKyAgYW5ub3RhdGVfZGlzcGxheV9iZWdpbiAoKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiJWQiLCBkLT5udW1iZXIpOworICBhbm5vdGF0ZV9kaXNwbGF5X251bWJlcl9lbmQgKCk7CisgIHByaW50Zl9maWx0ZXJlZCAoIjogIik7CisgIGlmIChkLT5mb3JtYXQuc2l6ZSkKKyAgICB7CisgICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgIHZhbHVlX3B0ciB2YWw7CisKKyAgICAgIGFubm90YXRlX2Rpc3BsYXlfZm9ybWF0ICgpOworCisgICAgICBwcmludGZfZmlsdGVyZWQgKCJ4LyIpOworICAgICAgaWYgKGQtPmZvcm1hdC5jb3VudCAhPSAxKQorCXByaW50Zl9maWx0ZXJlZCAoIiVkIiwgZC0+Zm9ybWF0LmNvdW50KTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiVjIiwgZC0+Zm9ybWF0LmZvcm1hdCk7CisgICAgICBpZiAoZC0+Zm9ybWF0LmZvcm1hdCAhPSAnaScgJiYgZC0+Zm9ybWF0LmZvcm1hdCAhPSAncycpCisJcHJpbnRmX2ZpbHRlcmVkICgiJWMiLCBkLT5mb3JtYXQuc2l6ZSk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIgIik7CisKKyAgICAgIGFubm90YXRlX2Rpc3BsYXlfZXhwcmVzc2lvbiAoKTsKKworICAgICAgcHJpbnRfZXhwcmVzc2lvbiAoZC0+ZXhwLCBnZGJfc3Rkb3V0KTsKKyAgICAgIGFubm90YXRlX2Rpc3BsYXlfZXhwcmVzc2lvbl9lbmQgKCk7CisKKyAgICAgIGlmIChkLT5mb3JtYXQuY291bnQgIT0gMSkKKwlwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICAgICAgZWxzZQorCXByaW50Zl9maWx0ZXJlZCAoIiAgIik7CisgICAgICAKKyAgICAgIHZhbCA9IGV2YWx1YXRlX2V4cHJlc3Npb24gKGQtPmV4cCk7CisgICAgICBhZGRyID0gdmFsdWVfYXNfcG9pbnRlciAodmFsKTsKKyAgICAgIGlmIChkLT5mb3JtYXQuZm9ybWF0ID09ICdpJykKKwlhZGRyID0gQUREUl9CSVRTX1JFTU9WRSAoYWRkcik7CisKKyAgICAgIGFubm90YXRlX2Rpc3BsYXlfdmFsdWUgKCk7CisKKyAgICAgIGRvX2V4YW1pbmUgKGQtPmZvcm1hdCwgYWRkciwgVkFMVUVfQkZEX1NFQ1RJT04gKHZhbCkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFubm90YXRlX2Rpc3BsYXlfZm9ybWF0ICgpOworCisgICAgICBpZiAoZC0+Zm9ybWF0LmZvcm1hdCkKKwlwcmludGZfZmlsdGVyZWQgKCIvJWMgIiwgZC0+Zm9ybWF0LmZvcm1hdCk7CisKKyAgICAgIGFubm90YXRlX2Rpc3BsYXlfZXhwcmVzc2lvbiAoKTsKKworICAgICAgcHJpbnRfZXhwcmVzc2lvbiAoZC0+ZXhwLCBnZGJfc3Rkb3V0KTsKKyAgICAgIGFubm90YXRlX2Rpc3BsYXlfZXhwcmVzc2lvbl9lbmQgKCk7CisKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiA9ICIpOworCisgICAgICBhbm5vdGF0ZV9kaXNwbGF5X2V4cHJlc3Npb24gKCk7CisKKyAgICAgIHByaW50X2Zvcm1hdHRlZCAoZXZhbHVhdGVfZXhwcmVzc2lvbiAoZC0+ZXhwKSwKKwkJICAgICAgIGQtPmZvcm1hdC5mb3JtYXQsIGQtPmZvcm1hdC5zaXplKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgICAgfQorCisgIGFubm90YXRlX2Rpc3BsYXlfZW5kICgpOworCisgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisgIGN1cnJlbnRfZGlzcGxheV9udW1iZXIgPSAtMTsKK30KKworLyogRGlzcGxheSBhbGwgb2YgdGhlIHZhbHVlcyBvbiB0aGUgYXV0by1kaXNwbGF5IGNoYWluIHdoaWNoIGNhbiBiZQorICAgZXZhbHVhdGVkIGluIHRoZSBjdXJyZW50IHNjb3BlLiAgKi8KKwordm9pZAorZG9fZGlzcGxheXMgKCkKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGRpc3BsYXkgKmQ7CisKKyAgZm9yIChkID0gZGlzcGxheV9jaGFpbjsgZDsgZCA9IGQtPm5leHQpCisgICAgZG9fb25lX2Rpc3BsYXkgKGQpOworfQorCisvKiBEZWxldGUgdGhlIGF1dG8tZGlzcGxheSB3aGljaCB3ZSB3ZXJlIGluIHRoZSBwcm9jZXNzIG9mIGRpc3BsYXlpbmcuCisgICBUaGlzIGlzIGRvbmUgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBvciBhIHNpZ25hbC4gICovCisKK3ZvaWQKK2Rpc2FibGVfZGlzcGxheSAobnVtKQorICAgICBpbnQgbnVtOworeworICByZWdpc3RlciBzdHJ1Y3QgZGlzcGxheSAqZDsKKworICBmb3IgKGQgPSBkaXNwbGF5X2NoYWluOyBkOyBkID0gZC0+bmV4dCkKKyAgICBpZiAoZC0+bnVtYmVyID09IG51bSkKKyAgICAgIHsKKwlkLT5zdGF0dXMgPSBkaXNhYmxlZDsKKwlyZXR1cm47CisgICAgICB9CisgIHByaW50Zl91bmZpbHRlcmVkICgiTm8gZGlzcGxheSBudW1iZXIgJWQuXG4iLCBudW0pOworfQorICAKK3ZvaWQKK2Rpc2FibGVfY3VycmVudF9kaXNwbGF5ICgpCit7CisgIGlmIChjdXJyZW50X2Rpc3BsYXlfbnVtYmVyID49IDApCisgICAgeworICAgICAgZGlzYWJsZV9kaXNwbGF5IChjdXJyZW50X2Rpc3BsYXlfbnVtYmVyKTsKKyAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIkRpc2FibGluZyBkaXNwbGF5ICVkIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbi5cbiIsCisJICAgICAgIGN1cnJlbnRfZGlzcGxheV9udW1iZXIpOworICAgIH0KKyAgY3VycmVudF9kaXNwbGF5X251bWJlciA9IC0xOworfQorCitzdGF0aWMgdm9pZAorZGlzcGxheV9pbmZvIChpZ25vcmUsIGZyb21fdHR5KQorICAgICBjaGFyICppZ25vcmU7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGRpc3BsYXkgKmQ7CisKKyAgaWYgKCFkaXNwbGF5X2NoYWluKQorICAgIHByaW50Zl91bmZpbHRlcmVkICgiVGhlcmUgYXJlIG5vIGF1dG8tZGlzcGxheSBleHByZXNzaW9ucyBub3cuXG4iKTsKKyAgZWxzZQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiQXV0by1kaXNwbGF5IGV4cHJlc3Npb25zIG5vdyBpbiBlZmZlY3Q6XG5cCitOdW0gRW5iIEV4cHJlc3Npb25cbiIpOworCisgIGZvciAoZCA9IGRpc3BsYXlfY2hhaW47IGQ7IGQgPSBkLT5uZXh0KQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkOiAgICVjICAiLCBkLT5udW1iZXIsICJueSJbKGludClkLT5zdGF0dXNdKTsKKyAgICAgIGlmIChkLT5mb3JtYXQuc2l6ZSkKKwlwcmludGZfZmlsdGVyZWQgKCIvJWQlYyVjICIsIGQtPmZvcm1hdC5jb3VudCwgZC0+Zm9ybWF0LnNpemUsCisJCWQtPmZvcm1hdC5mb3JtYXQpOworICAgICAgZWxzZSBpZiAoZC0+Zm9ybWF0LmZvcm1hdCkKKwlwcmludGZfZmlsdGVyZWQgKCIvJWMgIiwgZC0+Zm9ybWF0LmZvcm1hdCk7CisgICAgICBwcmludF9leHByZXNzaW9uIChkLT5leHAsIGdkYl9zdGRvdXQpOworICAgICAgaWYgKGQtPmJsb2NrICYmICFjb250YWluZWRfaW4gKGdldF9zZWxlY3RlZF9ibG9jayAoKSwgZC0+YmxvY2spKQorCXByaW50Zl9maWx0ZXJlZCAoIiAoY2Fubm90IGJlIGV2YWx1YXRlZCBpbiB0aGUgY3VycmVudCBjb250ZXh0KSIpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZW5hYmxlX2Rpc3BsYXkgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKnAgPSBhcmdzOworICByZWdpc3RlciBjaGFyICpwMTsKKyAgcmVnaXN0ZXIgaW50IG51bTsKKyAgcmVnaXN0ZXIgc3RydWN0IGRpc3BsYXkgKmQ7CisKKyAgaWYgKHAgPT0gMCkKKyAgICB7CisgICAgICBmb3IgKGQgPSBkaXNwbGF5X2NoYWluOyBkOyBkID0gZC0+bmV4dCkKKwlkLT5zdGF0dXMgPSBlbmFibGVkOworICAgIH0KKyAgZWxzZQorICAgIHdoaWxlICgqcCkKKyAgICAgIHsKKwlwMSA9IHA7CisJd2hpbGUgKCpwMSA+PSAnMCcgJiYgKnAxIDw9ICc5JykKKwkgIHAxKys7CisJaWYgKCpwMSAmJiAqcDEgIT0gJyAnICYmICpwMSAhPSAnXHQnKQorCSAgZXJyb3IgKCJBcmd1bWVudHMgbXVzdCBiZSBkaXNwbGF5IG51bWJlcnMuIik7CisJCisJbnVtID0gYXRvaSAocCk7CisJCisJZm9yIChkID0gZGlzcGxheV9jaGFpbjsgZDsgZCA9IGQtPm5leHQpCisJICBpZiAoZC0+bnVtYmVyID09IG51bSkKKwkgICAgeworCSAgICAgIGQtPnN0YXR1cyA9IGVuYWJsZWQ7CisJICAgICAgZ290byB3aW47CisJICAgIH0KKwlwcmludGZfdW5maWx0ZXJlZCAoIk5vIGRpc3BsYXkgbnVtYmVyICVkLlxuIiwgbnVtKTsKKyAgICAgIHdpbjoKKwlwID0gcDE7CisJd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorCSAgcCsrOworICAgICAgfQorfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2Rpc2FibGVfZGlzcGxheV9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICByZWdpc3RlciBjaGFyICpwID0gYXJnczsKKyAgcmVnaXN0ZXIgY2hhciAqcDE7CisgIHJlZ2lzdGVyIHN0cnVjdCBkaXNwbGF5ICpkOworCisgIGlmIChwID09IDApCisgICAgeworICAgICAgZm9yIChkID0gZGlzcGxheV9jaGFpbjsgZDsgZCA9IGQtPm5leHQpCisJZC0+c3RhdHVzID0gZGlzYWJsZWQ7CisgICAgfQorICBlbHNlCisgICAgd2hpbGUgKCpwKQorICAgICAgeworCXAxID0gcDsKKwl3aGlsZSAoKnAxID49ICcwJyAmJiAqcDEgPD0gJzknKQorCSAgcDErKzsKKwlpZiAoKnAxICYmICpwMSAhPSAnICcgJiYgKnAxICE9ICdcdCcpCisJICBlcnJvciAoIkFyZ3VtZW50cyBtdXN0IGJlIGRpc3BsYXkgbnVtYmVycy4iKTsKKwkKKwlkaXNhYmxlX2Rpc3BsYXkgKGF0b2kgKHApKTsKKworCXAgPSBwMTsKKwl3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcpCisJICBwKys7CisgICAgICB9Cit9CisKKwwKKy8qIFByaW50IHRoZSB2YWx1ZSBpbiBzdGFjayBmcmFtZSBGUkFNRSBvZiBhIHZhcmlhYmxlCisgICBzcGVjaWZpZWQgYnkgYSBzdHJ1Y3Qgc3ltYm9sLiAgKi8KKwordm9pZAorcHJpbnRfdmFyaWFibGVfdmFsdWUgKHZhciwgZnJhbWUsIHN0cmVhbSkKKyAgICAgc3RydWN0IHN5bWJvbCAqdmFyOworICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7CisgICAgIEdEQl9GSUxFICpzdHJlYW07Cit7CisgIHZhbHVlX3B0ciB2YWwgPSByZWFkX3Zhcl92YWx1ZSAodmFyLCBmcmFtZSk7CisKKyAgdmFsdWVfcHJpbnQgKHZhbCwgc3RyZWFtLCAwLCBWYWxfcHJldHR5X2RlZmF1bHQpOworfQorCisvKiBQcmludCB0aGUgYXJndW1lbnRzIG9mIGEgc3RhY2sgZnJhbWUsIGdpdmVuIHRoZSBmdW5jdGlvbiBGVU5DCisgICBydW5uaW5nIGluIHRoYXQgZnJhbWUgKGFzIGEgc3ltYm9sKSwgdGhlIGluZm8gb24gdGhlIGZyYW1lLAorICAgYW5kIHRoZSBudW1iZXIgb2YgYXJncyBhY2NvcmRpbmcgdG8gdGhlIHN0YWNrIGZyYW1lIChvciAtMSBpZiB1bmtub3duKS4gICovCisKKy8qIFJlZmVyZW5jZXMgaGVyZSBhbmQgZWxzZXdoZXJlIHRvICJudW1iZXIgb2YgYXJncyBhY2NvcmRpbmcgdG8gdGhlCisgICBzdGFjayBmcmFtZSIgYXBwZWFyIGluIGFsbCBjYXNlcyB0byByZWZlciB0byAibnVtYmVyIG9mIGludHMgb2YgYXJncworICAgYWNjb3JkaW5nIHRvIHRoZSBzdGFjayBmcmFtZSIuICBBdCBsZWFzdCBmb3IgVkFYLCBpMzg2LCBpc2kuICAqLworCit2b2lkCitwcmludF9mcmFtZV9hcmdzIChmdW5jLCBmaSwgbnVtLCBzdHJlYW0pCisgICAgIHN0cnVjdCBzeW1ib2wgKmZ1bmM7CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKKyAgICAgaW50IG51bTsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgc3RydWN0IGJsb2NrICpiID0gTlVMTDsKKyAgaW50IG5zeW1zID0gMDsKKyAgaW50IGZpcnN0ID0gMTsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgcmVnaXN0ZXIgdmFsdWVfcHRyIHZhbDsKKyAgLyogT2Zmc2V0IG9mIG5leHQgc3RhY2sgYXJndW1lbnQgYmV5b25kIHRoZSBvbmUgd2UgaGF2ZSBzZWVuIHRoYXQgaXMKKyAgICAgYXQgdGhlIGhpZ2hlc3Qgb2Zmc2V0LgorICAgICAtMSBpZiB3ZSBoYXZlbid0IGNvbWUgdG8gYSBzdGFjayBhcmd1bWVudCB5ZXQuICAqLworICBsb25nIGhpZ2hlc3Rfb2Zmc2V0ID0gLTE7CisgIGludCBhcmdfc2l6ZTsKKyAgLyogTnVtYmVyIG9mIGludHMgb2YgYXJndW1lbnRzIHRoYXQgd2UgaGF2ZSBwcmludGVkIHNvIGZhci4gICovCisgIGludCBhcmdzX3ByaW50ZWQgPSAwOworCisgIGlmIChmdW5jKQorICAgIHsKKyAgICAgIGIgPSBTWU1CT0xfQkxPQ0tfVkFMVUUgKGZ1bmMpOworICAgICAgbnN5bXMgPSBCTE9DS19OU1lNUyAoYik7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBuc3ltczsgaSsrKQorICAgIHsKKyAgICAgIFFVSVQ7CisgICAgICBzeW0gPSBCTE9DS19TWU0gKGIsIGkpOworCisgICAgICAvKiBLZWVwIHRyYWNrIG9mIHRoZSBoaWdoZXN0IHN0YWNrIGFyZ3VtZW50IG9mZnNldCBzZWVuLCBhbmQKKwkgc2tpcCBvdmVyIGFueSBraW5kcyBvZiBzeW1ib2xzIHdlIGRvbid0IGNhcmUgYWJvdXQuICAqLworCisgICAgICBzd2l0Y2ggKFNZTUJPTF9DTEFTUyAoc3ltKSkgeworICAgICAgY2FzZSBMT0NfQVJHOgorICAgICAgY2FzZSBMT0NfUkVGX0FSRzoKKwl7CisJICBsb25nIGN1cnJlbnRfb2Zmc2V0ID0gU1lNQk9MX1ZBTFVFIChzeW0pOworCSAgYXJnX3NpemUgPSBUWVBFX0xFTkdUSCAoU1lNQk9MX1RZUEUgKHN5bSkpOworCSAgCisJICAvKiBDb21wdXRlIGFkZHJlc3Mgb2YgbmV4dCBhcmd1bWVudCBieSBhZGRpbmcgdGhlIHNpemUgb2YKKwkgICAgIHRoaXMgYXJndW1lbnQgYW5kIHJvdW5kaW5nIHRvIGFuIGludCBib3VuZGFyeS4gICovCisJICBjdXJyZW50X29mZnNldAorCSAgICA9ICgoY3VycmVudF9vZmZzZXQgKyBhcmdfc2l6ZSArIHNpemVvZiAoaW50KSAtIDEpCisJICAgICAgICYgfihzaXplb2YgKGludCkgLSAxKSk7CisKKwkgIC8qIElmIHRoaXMgaXMgdGhlIGhpZ2hlc3Qgb2Zmc2V0IHNlZW4geWV0LCBzZXQgaGlnaGVzdF9vZmZzZXQuICAqLworCSAgaWYgKGhpZ2hlc3Rfb2Zmc2V0ID09IC0xCisJICAgICAgfHwgKGN1cnJlbnRfb2Zmc2V0ID4gaGlnaGVzdF9vZmZzZXQpKQorCSAgICBoaWdoZXN0X29mZnNldCA9IGN1cnJlbnRfb2Zmc2V0OworCisJICAvKiBBZGQgdGhlIG51bWJlciBvZiBpbnRzIHdlJ3JlIGFib3V0IHRvIHByaW50IHRvIGFyZ3NfcHJpbnRlZC4gICovCisJICBhcmdzX3ByaW50ZWQgKz0gKGFyZ19zaXplICsgc2l6ZW9mIChpbnQpIC0gMSkgLyBzaXplb2YgKGludCk7CisJfQorCisgICAgICAvKiBXZSBjYXJlIGFib3V0IHR5cGVzIG9mIHN5bWJvbHMsIGJ1dCBkb24ndCBuZWVkIHRvIGtlZXAgdHJhY2sgb2YKKwkgc3RhY2sgb2Zmc2V0cyBpbiB0aGVtLiAgKi8KKyAgICAgIGNhc2UgTE9DX1JFR1BBUk06CisgICAgICBjYXNlIExPQ19SRUdQQVJNX0FERFI6CisgICAgICBjYXNlIExPQ19MT0NBTF9BUkc6CisgICAgICBjYXNlIExPQ19CQVNFUkVHX0FSRzoKKwlicmVhazsKKworICAgICAgLyogT3RoZXIgdHlwZXMgb2Ygc3ltYm9scyB3ZSBqdXN0IHNraXAgb3Zlci4gICovCisgICAgICBkZWZhdWx0OgorCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKiBXZSBoYXZlIHRvIGxvb2sgdXAgdGhlIHN5bWJvbCBiZWNhdXNlIGFyZ3VtZW50cyBjYW4gaGF2ZQorCSB0d28gZW50cmllcyAob25lIGEgcGFyYW1ldGVyLCBvbmUgYSBsb2NhbCkgYW5kIHRoZSBvbmUgd2UKKwkgd2FudCBpcyB0aGUgbG9jYWwsIHdoaWNoIGxvb2t1cF9zeW1ib2wgd2lsbCBmaW5kIGZvciB1cy4KKwkgVGhpcyBpbmNsdWRlcyBnY2MxIChub3QgZ2NjMikgb24gdGhlIHNwYXJjIHdoZW4gcGFzc2luZyBhCisJIHNtYWxsIHN0cnVjdHVyZSBhbmQgZ2NjMiB3aGVuIHRoZSBhcmd1bWVudCB0eXBlIGlzIGZsb2F0CisJIGFuZCBpdCBpcyBwYXNzZWQgYXMgYSBkb3VibGUgYW5kIGNvbnZlcnRlZCB0byBmbG9hdCBieQorCSB0aGUgcHJvbG9ndWUgKGluIHRoZSBsYXR0ZXIgY2FzZSB0aGUgdHlwZSBvZiB0aGUgTE9DX0FSRworCSBzeW1ib2wgaXMgZG91YmxlIGFuZCB0aGUgdHlwZSBvZiB0aGUgTE9DX0xPQ0FMIHN5bWJvbCBpcworCSBmbG9hdCkuICAqLworICAgICAgLyogQnV0IGlmIHRoZSBwYXJhbWV0ZXIgbmFtZSBpcyBudWxsLCBkb24ndCB0cnkgaXQuCisJIE51bGwgcGFyYW1ldGVyIG5hbWVzIG9jY3VyIG9uIHRoZSBSUy82MDAwLCBmb3IgdHJhY2ViYWNrIHRhYmxlcy4KKwkgRklYTUUsIHNob3VsZCB3ZSBldmVuIHByaW50IHRoZW0/ICAqLworCisgICAgICBpZiAoKlNZTUJPTF9OQU1FIChzeW0pKQorCXsKKwkgIHN0cnVjdCBzeW1ib2wgKm5zeW07CisJICBuc3ltID0gbG9va3VwX3N5bWJvbAorCSAgICAoU1lNQk9MX05BTUUgKHN5bSksCisJICAgICBiLCBWQVJfTkFNRVNQQUNFLCAoaW50ICopTlVMTCwgKHN0cnVjdCBzeW10YWIgKiopTlVMTCk7CisJICBpZiAoU1lNQk9MX0NMQVNTIChuc3ltKSA9PSBMT0NfUkVHSVNURVIpCisJICAgIHsKKwkgICAgICAvKiBUaGVyZSBpcyBhIExPQ19BUkcvTE9DX1JFR0lTVEVSIHBhaXIuICBUaGlzIG1lYW5zIHRoYXQKKwkJIGl0IHdhcyBwYXNzZWQgb24gdGhlIHN0YWNrIGFuZCBsb2FkZWQgaW50byBhIHJlZ2lzdGVyLAorCQkgb3IgcGFzc2VkIGluIGEgcmVnaXN0ZXIgYW5kIHN0b3JlZCBpbiBhIHN0YWNrIHNsb3QuCisJCSBHREIgMy54IHVzZWQgdGhlIExPQ19BUkc7IEdEQiA0LjAtNC4xMSB1c2VkIHRoZSBMT0NfUkVHSVNURVIuCisKKwkJIFJlYXNvbnMgZm9yIHVzaW5nIHRoZSBMT0NfQVJHOgorCQkgKDEpIGJlY2F1c2UgZmluZF9zYXZlZF9yZWdpc3RlcnMgbWF5IGJlIHNsb3cgZm9yIHJlbW90ZQorCQkgZGVidWdnaW5nLAorCQkgKDIpIGJlY2F1c2UgcmVnaXN0ZXJzIGFyZSBvZnRlbiByZS11c2VkIGFuZCBzdGFjayBzbG90cworCQkgcmFyZWx5IChuZXZlcj8pIGFyZS4gIFRoZXJlZm9yZSB1c2luZyB0aGUgc3RhY2sgc2xvdCBpcworCQkgbXVjaCBsZXNzIGxpa2VseSB0byBwcmludCBnYXJiYWdlLgorCisJCSBSZWFzb25zIHdoeSB3ZSBtaWdodCB3YW50IHRvIHVzZSB0aGUgTE9DX1JFR0lTVEVSOgorCQkgKDEpIFNvIHRoYXQgdGhlIGJhY2t0cmFjZSBwcmludHMgdGhlIHNhbWUgdmFsdWUgYXMKKwkJICJwcmludCBmb28iLiAgSSBzZWUgbm8gY29tcGVsbGluZyByZWFzb24gd2h5IHRoaXMgbmVlZHMKKwkJIHRvIGJlIHRoZSBjYXNlOyBoYXZpbmcgdGhlIGJhY2t0cmFjZSBwcmludCB0aGUgdmFsdWUgd2hpY2gKKwkJIHdhcyBwYXNzZWQgaW4sIGFuZCAicHJpbnQgZm9vIiBwcmludCB0aGUgdmFsdWUgYXMgbW9kaWZpZWQKKwkJIHdpdGhpbiB0aGUgY2FsbGVkIGZ1bmN0aW9uLCBtYWtlcyBwZXJmZWN0IHNlbnNlIHRvIG1lLgorCisJCSBBZGRpdGlvbmFsIG5vdGU6ICBJdCBtaWdodCBiZSBuaWNlIGlmICJpbmZvIGFyZ3MiIGRpc3BsYXllZAorCQkgYm90aCB2YWx1ZXMuCisJCSBPbmUgbW9yZSBub3RlOiAgVGhlcmUgaXMgYSBjYXNlIHdpdGggc3BhcmMgc3RydWN0dXJlIHBhc3NpbmcKKwkJIHdoZXJlIHdlIG5lZWQgdG8gdXNlIHRoZSBMT0NfUkVHSVNURVIsIGJ1dCB0aGlzIGlzIGRlYWx0IHdpdGgKKwkJIGJ5IGNyZWF0aW5nIGEgc2luZ2xlIExPQ19SRUdQQVJNIGluIHN5bWJvbCByZWFkaW5nLiAgKi8KKworCSAgICAgIC8qIExlYXZlIHN5bSAodGhlIExPQ19BUkcpIGFsb25lLiAgKi8KKwkgICAgICA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgc3ltID0gbnN5bTsKKwl9CisKKyAgICAgIC8qIFByaW50IHRoZSBjdXJyZW50IGFyZy4gICovCisgICAgICBpZiAoISBmaXJzdCkKKwlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIsICIpOworICAgICAgd3JhcF9oZXJlICgiICAgICIpOworCisgICAgICBhbm5vdGF0ZV9hcmdfYmVnaW4gKCk7CisKKyAgICAgIGZwcmludGZfc3ltYm9sX2ZpbHRlcmVkIChzdHJlYW0sIFNZTUJPTF9TT1VSQ0VfTkFNRSAoc3ltKSwKKwkJCSAgICAgICBTWU1CT0xfTEFOR1VBR0UgKHN5bSksIERNR0xfUEFSQU1TIHwgRE1HTF9BTlNJKTsKKyAgICAgIGFubm90YXRlX2FyZ19uYW1lX2VuZCAoKTsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiPSIsIHN0cmVhbSk7CisKKyAgICAgIC8qIEF2b2lkIHZhbHVlX3ByaW50IGJlY2F1c2UgaXQgd2lsbCBkZXJlZiByZWYgcGFyYW1ldGVycy4gIFdlIGp1c3QKKwkgd2FudCB0byBwcmludCB0aGVpciBhZGRyZXNzZXMuICBQcmludCA/Pz8gZm9yIGFyZ3Mgd2hvc2UgYWRkcmVzcworCSB3ZSBkbyBub3Qga25vdy4gIFdlIHBhc3MgMiBhcyAicmVjdXJzZSIgdG8gdmFsX3ByaW50IGJlY2F1c2Ugb3VyCisJIHN0YW5kYXJkIGluZGVudGF0aW9uIGhlcmUgaXMgNCBzcGFjZXMsIGFuZCB2YWxfcHJpbnQgaW5kZW50cworCSAyIGZvciBlYWNoIHJlY3Vyc2UuICAqLworICAgICAgdmFsID0gcmVhZF92YXJfdmFsdWUgKHN5bSwgZmkpOworCisgICAgICBhbm5vdGF0ZV9hcmdfdmFsdWUgKHZhbCA9PSBOVUxMID8gTlVMTCA6IFZBTFVFX1RZUEUgKHZhbCkpOworCisgICAgICBpZiAodmFsKQorCXsKKyNpZmRlZiBHREJfVEFSR0VUX0lTX0QxMFYKKwkgIGlmIChTWU1CT0xfQ0xBU1Moc3ltKSA9PSBMT0NfUkVHUEFSTSAmJiBUWVBFX0NPREUoVkFMVUVfVFlQRSh2YWwpKSA9PSBUWVBFX0NPREVfUFRSKQorCSAgICBUWVBFX0xFTkdUSChWQUxVRV9UWVBFKHZhbCkpID0gMjsKKyNlbmRpZgorCSAgdmFsX3ByaW50IChWQUxVRV9UWVBFICh2YWwpLCBWQUxVRV9DT05URU5UUyAodmFsKSwgMCwKKwkgICAgICAgICAgICAgVkFMVUVfQUREUkVTUyAodmFsKSwKKyAgICAgICAgICAgICAgICAgICBzdHJlYW0sIDAsIDAsIDIsIFZhbF9ub19wcmV0dHlwcmludCk7CisJfQorICAgICAgZWxzZQorCWZwdXRzX2ZpbHRlcmVkICgiPz8/Iiwgc3RyZWFtKTsKKworICAgICAgYW5ub3RhdGVfYXJnX2VuZCAoKTsKKworICAgICAgZmlyc3QgPSAwOworICAgIH0KKworICAvKiBEb24ndCBwcmludCBuYW1lbGVzcyBhcmdzIGluIHNpdHVhdGlvbnMgd2hlcmUgd2UgZG9uJ3Qga25vdworICAgICBlbm91Z2ggYWJvdXQgdGhlIHN0YWNrIHRvIGZpbmQgdGhlbS4gICovCisgIGlmIChudW0gIT0gLTEpCisgICAgeworICAgICAgbG9uZyBzdGFydDsKKworICAgICAgaWYgKGhpZ2hlc3Rfb2Zmc2V0ID09IC0xKQorCXN0YXJ0ID0gRlJBTUVfQVJHU19TS0lQOworICAgICAgZWxzZQorCXN0YXJ0ID0gaGlnaGVzdF9vZmZzZXQ7CisKKyAgICAgIHByaW50X2ZyYW1lX25hbWVsZXNzX2FyZ3MgKGZpLCBzdGFydCwgbnVtIC0gYXJnc19wcmludGVkLAorCQkJCSBmaXJzdCwgc3RyZWFtKTsKKyAgICB9Cit9CisKKy8qIFByaW50IG5hbWVsZXNzIGFyZ3Mgb24gU1RSRUFNLgorICAgRkkgaXMgdGhlIGZyYW1laW5mbyBmb3IgdGhpcyBmcmFtZSwgU1RBUlQgaXMgdGhlIG9mZnNldAorICAgb2YgdGhlIGZpcnN0IG5hbWVsZXNzIGFyZywgYW5kIE5VTSBpcyB0aGUgbnVtYmVyIG9mIG5hbWVsZXNzIGFyZ3MgdG8KKyAgIHByaW50LiAgRklSU1QgaXMgbm9uemVybyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBhcmd1bWVudCAobm90IGp1c3QKKyAgIHRoZSBmaXJzdCBuYW1lbGVzcyBhcmcpLiAgKi8KKworc3RhdGljIHZvaWQKK3ByaW50X2ZyYW1lX25hbWVsZXNzX2FyZ3MgKGZpLCBzdGFydCwgbnVtLCBmaXJzdCwgc3RyZWFtKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7CisgICAgIGxvbmcgc3RhcnQ7CisgICAgIGludCBudW07CisgICAgIGludCBmaXJzdDsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgaW50IGk7CisgIENPUkVfQUREUiBhcmdzYWRkcjsKKyAgbG9uZyBhcmdfdmFsdWU7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorICAgIHsKKyAgICAgIFFVSVQ7CisjaWZkZWYgTkFNRUxFU1NfQVJHX1ZBTFVFCisgICAgICBOQU1FTEVTU19BUkdfVkFMVUUgKGZpLCBzdGFydCwgJmFyZ192YWx1ZSk7CisjZWxzZQorICAgICAgYXJnc2FkZHIgPSBGUkFNRV9BUkdTX0FERFJFU1MgKGZpKTsKKyAgICAgIGlmICghYXJnc2FkZHIpCisJcmV0dXJuOworCisgICAgICBhcmdfdmFsdWUgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChhcmdzYWRkciArIHN0YXJ0LCBzaXplb2YgKGludCkpOworI2VuZGlmCisKKyAgICAgIGlmICghZmlyc3QpCisJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiLCAiKTsKKworI2lmZGVmCVBSSU5UX05BTUVMRVNTX0lOVEVHRVIKKyAgICAgIFBSSU5UX05BTUVMRVNTX0lOVEVHRVIgKHN0cmVhbSwgYXJnX3ZhbHVlKTsKKyNlbHNlCisjaWZkZWYgUFJJTlRfVFlQRUxFU1NfSU5URUdFUgorICAgICAgUFJJTlRfVFlQRUxFU1NfSU5URUdFUiAoc3RyZWFtLCBidWlsdGluX3R5cGVfaW50LCAoTE9OR0VTVCkgYXJnX3ZhbHVlKTsKKyNlbHNlCisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlbGQiLCBhcmdfdmFsdWUpOworI2VuZGlmIC8qIFBSSU5UX1RZUEVMRVNTX0lOVEVHRVIgKi8KKyNlbmRpZiAvKiBQUklOVF9OQU1FTEVTU19JTlRFR0VSICovCisgICAgICBmaXJzdCA9IDA7CisgICAgICBzdGFydCArPSBzaXplb2YgKGludCk7CisgICAgfQorfQorDAorLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitwcmludGZfY29tbWFuZCAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKmYgPSBOVUxMOworICByZWdpc3RlciBjaGFyICpzID0gYXJnOworICBjaGFyICpzdHJpbmcgPSBOVUxMOworICB2YWx1ZV9wdHIgKnZhbF9hcmdzOworICBjaGFyICpzdWJzdHJpbmdzOworICBjaGFyICpjdXJyZW50X3N1YnN0cmluZzsKKyAgaW50IG5hcmdzID0gMDsKKyAgaW50IGFsbG9jYXRlZF9hcmdzID0gMjA7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2xlYW51cHM7CisKKyAgdmFsX2FyZ3MgPSAodmFsdWVfcHRyICopIHhtYWxsb2MgKGFsbG9jYXRlZF9hcmdzICogc2l6ZW9mICh2YWx1ZV9wdHIpKTsKKyAgb2xkX2NsZWFudXBzID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfY3VycmVudF9jb250ZW50cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbF9hcmdzKTsKKworICBpZiAocyA9PSAwKQorICAgIGVycm9yX25vX2FyZyAoImZvcm1hdC1jb250cm9sIHN0cmluZyBhbmQgdmFsdWVzIHRvIHByaW50Iik7CisKKyAgLyogU2tpcCB3aGl0ZSBzcGFjZSBiZWZvcmUgZm9ybWF0IHN0cmluZyAqLworICB3aGlsZSAoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcpIHMrKzsKKworICAvKiBBIGZvcm1hdCBzdHJpbmcgc2hvdWxkIGZvbGxvdywgZW52ZWxvcGVkIGluIGRvdWJsZSBxdW90ZXMgKi8KKyAgaWYgKCpzKysgIT0gJyInKQorICAgIGVycm9yICgiQmFkIGZvcm1hdCBzdHJpbmcsIG1pc3NpbmcgJ1wiJy4iKTsKKworICAvKiBQYXJzZSB0aGUgZm9ybWF0LWNvbnRyb2wgc3RyaW5nIGFuZCBjb3B5IGl0IGludG8gdGhlIHN0cmluZyBTVFJJTkcsCisgICAgIHByb2Nlc3Npbmcgc29tZSBraW5kcyBvZiBlc2NhcGUgc2VxdWVuY2UuICAqLworCisgIGYgPSBzdHJpbmcgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAocykgKyAxKTsKKworICB3aGlsZSAoKnMgIT0gJyInKQorICAgIHsKKyAgICAgIGludCBjID0gKnMrKzsKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAnXDAnOgorCSAgZXJyb3IgKCJCYWQgZm9ybWF0IHN0cmluZywgbm9uLXRlcm1pbmF0ZWQgJ1wiJy4iKTsKKworCWNhc2UgJ1xcJzoKKwkgIHN3aXRjaCAoYyA9ICpzKyspCisJICAgIHsKKwkgICAgY2FzZSAnXFwnOgorCSAgICAgICpmKysgPSAnXFwnOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdhJzoKKyNpZmRlZiBfX1NURENfXworCSAgICAgICpmKysgPSAnXGEnOworI2Vsc2UKKwkgICAgICAqZisrID0gJ1wwMDcnOyAgLyogQmVsbCAqLworI2VuZGlmCisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ2InOgorCSAgICAgICpmKysgPSAnXGInOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdmJzoKKwkgICAgICAqZisrID0gJ1xmJzsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnbic6CisJICAgICAgKmYrKyA9ICdcbic7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ3InOgorCSAgICAgICpmKysgPSAnXHInOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICd0JzoKKwkgICAgICAqZisrID0gJ1x0JzsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAndic6CisJICAgICAgKmYrKyA9ICdcdic7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJyInOgorCSAgICAgICpmKysgPSAnIic7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgLyogPz8/IFRPRE86IGhhbmRsZSBvdGhlciBlc2NhcGUgc2VxdWVuY2VzICovCisJICAgICAgZXJyb3IgKCJVbnJlY29nbml6ZWQgZXNjYXBlIGNoYXJhY3RlciBcXCVjIGluIGZvcm1hdCBzdHJpbmcuIiwKKwkJICAgICBjKTsKKwkgICAgfQorCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgKmYrKyA9IGM7CisJfQorICAgIH0KKworICAvKiBTa2lwIG92ZXIgIiBhbmQgZm9sbG93aW5nIHNwYWNlIGFuZCBjb21tYS4gICovCisgIHMrKzsKKyAgKmYrKyA9ICdcMCc7CisgIHdoaWxlICgqcyA9PSAnICcgfHwgKnMgPT0gJ1x0JykgcysrOworCisgIGlmICgqcyAhPSAnLCcgJiYgKnMgIT0gMCkKKyAgICBlcnJvciAoIkludmFsaWQgYXJndW1lbnQgc3ludGF4Iik7CisKKyAgaWYgKCpzID09ICcsJykgcysrOworICB3aGlsZSAoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcpIHMrKzsKKworICAvKiBOZWVkIGV4dHJhIHNwYWNlIGZvciB0aGUgJ1wwJ3MuICBEb3VibGluZyB0aGUgc2l6ZSBpcyBzdWZmaWNpZW50LiAgKi8KKyAgc3Vic3RyaW5ncyA9IGFsbG9jYSAoc3RybGVuIChzdHJpbmcpICogMik7CisgIGN1cnJlbnRfc3Vic3RyaW5nID0gc3Vic3RyaW5nczsKKworICB7CisgICAgLyogTm93IHNjYW4gdGhlIHN0cmluZyBmb3IgJS1zcGVjcyBhbmQgc2VlIHdoYXQga2luZHMgb2YgYXJncyB0aGV5IHdhbnQuCisgICAgICAgYXJnY2xhc3NbSV0gY2xhc3NpZmllcyB0aGUgJS1zcGVjcyBzbyB3ZSBjYW4gZ2l2ZSBwcmludGZfZmlsdGVyZWQKKyAgICAgICBzb21ldGhpbmcgb2YgdGhlIHJpZ2h0IHNpemUuICAqLworCisgICAgZW51bSBhcmdjbGFzcyB7bm9fYXJnLCBpbnRfYXJnLCBzdHJpbmdfYXJnLCBkb3VibGVfYXJnLCBsb25nX2xvbmdfYXJnfTsKKyAgICBlbnVtIGFyZ2NsYXNzICphcmdjbGFzczsKKyAgICBlbnVtIGFyZ2NsYXNzIHRoaXNfYXJnY2xhc3M7CisgICAgY2hhciAqbGFzdF9hcmc7CisgICAgaW50IG5hcmdzX3dhbnRlZDsKKyAgICBpbnQgbGNvdW50OworICAgIGludCBpOworCisgICAgYXJnY2xhc3MgPSAoZW51bSBhcmdjbGFzcyAqKSBhbGxvY2EgKHN0cmxlbiAocykgKiBzaXplb2YgKmFyZ2NsYXNzKTsKKyAgICBuYXJnc193YW50ZWQgPSAwOworICAgIGYgPSBzdHJpbmc7CisgICAgbGFzdF9hcmcgPSBzdHJpbmc7CisgICAgd2hpbGUgKCpmKQorICAgICAgaWYgKCpmKysgPT0gJyUnKQorCXsKKwkgIGxjb3VudCA9IDA7CisJICB3aGlsZSAoc3RyY2hyICgiMDEyMzQ1Njc4OS5obEwtKyAjIiwgKmYpKSAKKwkgICAgeworCSAgICAgIGlmICgqZiA9PSAnbCcgfHwgKmYgPT0gJ0wnKQorCQlsY291bnQrKzsKKwkgICAgICBmKys7CisJICAgIH0KKwkgIHN3aXRjaCAoKmYpCisJICAgIHsKKwkgICAgY2FzZSAncyc6CisJICAgICAgdGhpc19hcmdjbGFzcyA9IHN0cmluZ19hcmc7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnZSc6CisJICAgIGNhc2UgJ2YnOgorCSAgICBjYXNlICdnJzoKKwkgICAgICB0aGlzX2FyZ2NsYXNzID0gZG91YmxlX2FyZzsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICcqJzoKKwkgICAgICBlcnJvciAoImAqJyBub3Qgc3VwcG9ydGVkIGZvciBwcmVjaXNpb24gb3Igd2lkdGggaW4gcHJpbnRmIik7CisKKwkgICAgY2FzZSAnbic6CisJICAgICAgZXJyb3IgKCJGb3JtYXQgc3BlY2lmaWVyIGBuJyBub3Qgc3VwcG9ydGVkIGluIHByaW50ZiIpOworCisJICAgIGNhc2UgJyUnOgorCSAgICAgIHRoaXNfYXJnY2xhc3MgPSBub19hcmc7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBpZiAobGNvdW50ID4gMSkKKwkJdGhpc19hcmdjbGFzcyA9IGxvbmdfbG9uZ19hcmc7CisJICAgICAgZWxzZQorCQl0aGlzX2FyZ2NsYXNzID0gaW50X2FyZzsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgZisrOworCSAgaWYgKHRoaXNfYXJnY2xhc3MgIT0gbm9fYXJnKQorCSAgICB7CisJICAgICAgc3RybmNweSAoY3VycmVudF9zdWJzdHJpbmcsIGxhc3RfYXJnLCBmIC0gbGFzdF9hcmcpOworCSAgICAgIGN1cnJlbnRfc3Vic3RyaW5nICs9IGYgLSBsYXN0X2FyZzsKKwkgICAgICAqY3VycmVudF9zdWJzdHJpbmcrKyA9ICdcMCc7CisJICAgICAgbGFzdF9hcmcgPSBmOworCSAgICAgIGFyZ2NsYXNzW25hcmdzX3dhbnRlZCsrXSA9IHRoaXNfYXJnY2xhc3M7CisJICAgIH0KKwl9CisKKyAgICAvKiBOb3csIHBhcnNlIGFsbCBhcmd1bWVudHMgYW5kIGV2YWx1YXRlIHRoZW0uCisgICAgICAgU3RvcmUgdGhlIFZBTFVFcyBpbiBWQUxfQVJHUy4gICovCisKKyAgICB3aGlsZSAoKnMgIT0gJ1wwJykKKyAgICAgIHsKKwljaGFyICpzMTsKKwlpZiAobmFyZ3MgPT0gYWxsb2NhdGVkX2FyZ3MpCisJICB2YWxfYXJncyA9ICh2YWx1ZV9wdHIgKikgeHJlYWxsb2MgKChjaGFyICopIHZhbF9hcmdzLAorCQkJCQkgICAgIChhbGxvY2F0ZWRfYXJncyAqPSAyKQorCQkJCQkgICAgICogc2l6ZW9mICh2YWx1ZV9wdHIpKTsKKwlzMSA9IHM7CisJdmFsX2FyZ3NbbmFyZ3NdID0gcGFyc2VfdG9fY29tbWFfYW5kX2V2YWwgKCZzMSk7CisgCisJLyogSWYgZm9ybWF0IHN0cmluZyB3YW50cyBhIGZsb2F0LCB1bmNoZWNrZWQtY29udmVydCB0aGUgdmFsdWUgdG8KKwkgICBmbG9hdGluZyBwb2ludCBvZiB0aGUgc2FtZSBzaXplICovCisgCisJaWYgKGFyZ2NsYXNzW25hcmdzXSA9PSBkb3VibGVfYXJnKQorCSAgeworCSAgICBzdHJ1Y3QgdHlwZSAqdHlwZSA9IFZBTFVFX1RZUEUgKHZhbF9hcmdzW25hcmdzXSk7CisJICAgIGlmIChUWVBFX0xFTkdUSCAodHlwZSkgPT0gc2l6ZW9mIChmbG9hdCkpCisJICAgICAgVkFMVUVfVFlQRSAodmFsX2FyZ3NbbmFyZ3NdKSA9IGJ1aWx0aW5fdHlwZV9mbG9hdDsKKwkgICAgaWYgKFRZUEVfTEVOR1RIICh0eXBlKSA9PSBzaXplb2YgKGRvdWJsZSkpCisJICAgICAgVkFMVUVfVFlQRSAodmFsX2FyZ3NbbmFyZ3NdKSA9IGJ1aWx0aW5fdHlwZV9kb3VibGU7CisJICB9CisJbmFyZ3MrKzsKKwlzID0gczE7CisJaWYgKCpzID09ICcsJykKKwkgIHMrKzsKKyAgICAgIH0KKyAKKyAgICBpZiAobmFyZ3MgIT0gbmFyZ3Nfd2FudGVkKQorICAgICAgZXJyb3IgKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBzcGVjaWZpZWQgZm9ybWF0LXN0cmluZyIpOworCisgICAgLyogTm93IGFjdHVhbGx5IHByaW50IHRoZW0uICAqLworICAgIGN1cnJlbnRfc3Vic3RyaW5nID0gc3Vic3RyaW5nczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKKyAgICAgIHsKKwlzd2l0Y2ggKGFyZ2NsYXNzW2ldKQorCSAgeworCSAgY2FzZSBzdHJpbmdfYXJnOgorCSAgICB7CisJICAgICAgY2hhciAqc3RyOworCSAgICAgIENPUkVfQUREUiB0ZW07CisJICAgICAgaW50IGo7CisJICAgICAgdGVtID0gdmFsdWVfYXNfcG9pbnRlciAodmFsX2FyZ3NbaV0pOworCisJICAgICAgLyogVGhpcyBpcyBhICVzIGFyZ3VtZW50LiAgRmluZCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuICAqLworCSAgICAgIGZvciAoaiA9IDA7IDsgaisrKQorCQl7CisJCSAgY2hhciBjOworCQkgIFFVSVQ7CisJCSAgcmVhZF9tZW1vcnlfc2VjdGlvbiAodGVtICsgaiwgJmMsIDEsCisJCQkJICAgICAgIFZBTFVFX0JGRF9TRUNUSU9OICh2YWxfYXJnc1tpXSkpOworCQkgIGlmIChjID09IDApCisJCSAgICBicmVhazsKKwkJfQorCisJICAgICAgLyogQ29weSB0aGUgc3RyaW5nIGNvbnRlbnRzIGludG8gYSBzdHJpbmcgaW5zaWRlIEdEQi4gICovCisJICAgICAgc3RyID0gKGNoYXIgKikgYWxsb2NhIChqICsgMSk7CisJICAgICAgcmVhZF9tZW1vcnlfc2VjdGlvbiAodGVtLCBzdHIsIGosIFZBTFVFX0JGRF9TRUNUSU9OICh2YWxfYXJnc1tpXSkpOworCSAgICAgIHN0cltqXSA9IDA7CisKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKGN1cnJlbnRfc3Vic3RyaW5nLCBzdHIpOworCSAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSBkb3VibGVfYXJnOgorCSAgICB7CisJICAgICAgZG91YmxlIHZhbCA9IHZhbHVlX2FzX2RvdWJsZSAodmFsX2FyZ3NbaV0pOworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoY3VycmVudF9zdWJzdHJpbmcsIHZhbCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGNhc2UgbG9uZ19sb25nX2FyZzoKKyNpZiBkZWZpbmVkIChDQ19IQVNfTE9OR19MT05HKSAmJiBkZWZpbmVkIChQUklOVEZfSEFTX0xPTkdfTE9ORykKKwkgICAgeworCSAgICAgIGxvbmcgbG9uZyB2YWwgPSB2YWx1ZV9hc19sb25nICh2YWxfYXJnc1tpXSk7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkIChjdXJyZW50X3N1YnN0cmluZywgdmFsKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorI2Vsc2UKKwkgICAgZXJyb3IgKCJsb25nIGxvbmcgbm90IHN1cHBvcnRlZCBpbiBwcmludGYiKTsKKyNlbmRpZgorCSAgY2FzZSBpbnRfYXJnOgorCSAgICB7CisJICAgICAgLyogRklYTUU6IHRoZXJlIHNob3VsZCBiZSBzZXBhcmF0ZSBpbnRfYXJnIGFuZCBsb25nX2FyZy4gICovCisJICAgICAgbG9uZyB2YWwgPSB2YWx1ZV9hc19sb25nICh2YWxfYXJnc1tpXSk7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkIChjdXJyZW50X3N1YnN0cmluZywgdmFsKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgZGVmYXVsdDogLyogcHVyZWNvdjogZGVhZGNvZGUgKi8KKwkgICAgZXJyb3IgKCJpbnRlcm5hbCBlcnJvciBpbiBwcmludGZfY29tbWFuZCIpOyAvKiBwdXJlY292OiBkZWFkY29kZSAqLworCSAgfQorCS8qIFNraXAgdG8gdGhlIG5leHQgc3Vic3RyaW5nLiAgKi8KKwljdXJyZW50X3N1YnN0cmluZyArPSBzdHJsZW4gKGN1cnJlbnRfc3Vic3RyaW5nKSArIDE7CisgICAgICB9CisgICAgLyogUHJpbnQgdGhlIHBvcnRpb24gb2YgdGhlIGZvcm1hdCBzdHJpbmcgYWZ0ZXIgdGhlIGxhc3QgYXJndW1lbnQuICAqLworICAgIHByaW50Zl9maWx0ZXJlZCAobGFzdF9hcmcpOworICB9CisgIGRvX2NsZWFudXBzIChvbGRfY2xlYW51cHMpOworfQorDAorLyogRHVtcCBhIHNwZWNpZmllZCBzZWN0aW9uIG9mIGFzc2VtYmx5IGNvZGUuICBXaXRoIG5vIGNvbW1hbmQgbGluZQorICAgYXJndW1lbnRzLCB0aGlzIGNvbW1hbmQgd2lsbCBkdW1wIHRoZSBhc3NlbWJseSBjb2RlIGZvciB0aGUKKyAgIGZ1bmN0aW9uIHN1cnJvdW5kaW5nIHRoZSBwYyB2YWx1ZSBpbiB0aGUgc2VsZWN0ZWQgZnJhbWUuICBXaXRoIG9uZQorICAgYXJndW1lbnQsIGl0IHdpbGwgZHVtcCB0aGUgYXNzZW1ibHkgY29kZSBzdXJyb3VuZGluZyB0aGF0IHBjIHZhbHVlLgorICAgVHdvIGFyZ3VtZW50cyBhcmUgaW50ZXJwZXRlZCBhcyBib3VuZHMgd2l0aGluIHdoaWNoIHRvIGR1bXAKKyAgIGFzc2VtYmx5LiAgKi8KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitkaXNhc3NlbWJsZV9jb21tYW5kIChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgQ09SRV9BRERSIGxvdywgaGlnaDsKKyAgY2hhciAqbmFtZTsKKyAgQ09SRV9BRERSIHBjLCBwY19tYXNrZWQ7CisgIGNoYXIgKnNwYWNlX2luZGV4OworI2lmIDAKKyAgYXNlY3Rpb24gKnNlY3Rpb247CisjZW5kaWYKKworICBuYW1lID0gTlVMTDsKKyAgaWYgKCFhcmcpCisgICAgeworICAgICAgaWYgKCFzZWxlY3RlZF9mcmFtZSkKKwllcnJvciAoIk5vIGZyYW1lIHNlbGVjdGVkLlxuIik7CisKKyAgICAgIHBjID0gZ2V0X2ZyYW1lX3BjIChzZWxlY3RlZF9mcmFtZSk7CisgICAgICBpZiAoZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIChwYywgJm5hbWUsICZsb3csICZoaWdoKSA9PSAwKQorCWVycm9yICgiTm8gZnVuY3Rpb24gY29udGFpbnMgcHJvZ3JhbSBjb3VudGVyIGZvciBzZWxlY3RlZCBmcmFtZS5cbiIpOworI2lmIGRlZmluZWQoVFVJKQorICAgICAgZWxzZSBpZiAodHVpX3ZlcnNpb24pCisgICAgICAgIGxvdyA9IChDT1JFX0FERFIpdHVpRG8oKFR1aU9wYXF1ZUZ1bmNQdHIpdHVpX3ZHZXRMb3dEaXNhc3NlbWJseUFkZHJlc3MsIAorCQkJICAgICAgIChPcGFxdWUpbG93LCAKKwkJCSAgICAgICAoT3BhcXVlKXBjKTsKKyNlbmRpZgorICAgICAgbG93ICs9IEZVTkNUSU9OX1NUQVJUX09GRlNFVDsKKyAgICB9CisgIGVsc2UgaWYgKCEoc3BhY2VfaW5kZXggPSAoY2hhciAqKSBzdHJjaHIgKGFyZywgJyAnKSkpCisgICAgeworICAgICAgLyogT25lIGFyZ3VtZW50LiAgKi8KKyAgICAgIHBjID0gcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAoYXJnKTsKKyAgICAgIGlmIChmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gKHBjLCAmbmFtZSwgJmxvdywgJmhpZ2gpID09IDApCisJZXJyb3IgKCJObyBmdW5jdGlvbiBjb250YWlucyBzcGVjaWZpZWQgYWRkcmVzcy5cbiIpOworI2lmIGRlZmluZWQoVFVJKQorICAgICAgZWxzZSBpZiAodHVpX3ZlcnNpb24pCisgICAgICAgIGxvdyA9IChDT1JFX0FERFIpdHVpRG8oKFR1aU9wYXF1ZUZ1bmNQdHIpdHVpX3ZHZXRMb3dEaXNhc3NlbWJseUFkZHJlc3MsIAorCQkJICAgICAgIChPcGFxdWUpbG93LCAKKwkJCSAgICAgICAoT3BhcXVlKXBjKTsKKyNlbmRpZgorI2lmIDAKKyAgICAgIGlmIChvdmVybGF5X2RlYnVnZ2luZykKKwl7CisJICBzZWN0aW9uID0gZmluZF9wY19vdmVybGF5IChwYyk7CisJICBpZiAocGNfaW5fdW5tYXBwZWRfcmFuZ2UgKHBjLCBzZWN0aW9uKSkKKwkgICAgeworCSAgICAgIC8qIGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiB3aWxsIGhhdmUgcmV0dXJuZWQgbG93IGFuZCBoaWdoCisJCSByZWxhdGl2ZSB0byB0aGUgc3ltYm9saWMgKG1hcHBlZCkgYWRkcmVzcyByYW5nZS4gIE5lZWQgdG8KKwkJIHRyYW5zbGF0ZSB0aGVtIGJhY2sgdG8gdGhlIHVubWFwcGVkIHJhbmdlIHdoZXJlIFBDIGlzLiAgKi8KKwkgICAgICBsb3cgID0gb3ZlcmxheV91bm1hcHBlZF9hZGRyZXNzIChsb3csIHNlY3Rpb24pOworCSAgICAgIGhpZ2ggPSBvdmVybGF5X3VubWFwcGVkX2FkZHJlc3MgKGhpZ2gsIHNlY3Rpb24pOworCSAgICB9CisJfQorI2VuZGlmCisgICAgICBsb3cgKz0gRlVOQ1RJT05fU1RBUlRfT0ZGU0VUOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFR3byBhcmd1bWVudHMuICAqLworICAgICAgKnNwYWNlX2luZGV4ID0gJ1wwJzsKKyAgICAgIGxvdyA9IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgKGFyZyk7CisgICAgICBoaWdoID0gcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAoc3BhY2VfaW5kZXggKyAxKTsKKyAgICB9CisKKyNpZiBkZWZpbmVkKFRVSSkKKyAgaWYgKCF0dWlfdmVyc2lvbiB8fAorICAgICAgbV93aW5QdHJJc051bGwoZGlzYXNzZW1XaW4pIHx8ICFkaXNhc3NlbVdpbi0+Z2VuZXJpYy5pc1Zpc2libGUpCisjZW5kaWYKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJEdW1wIG9mIGFzc2VtYmxlciBjb2RlICIpOworICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCJmb3IgZnVuY3Rpb24gJXM6XG4iLCBuYW1lKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcHJpbnRmX2ZpbHRlcmVkICgiZnJvbSAiKTsKKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAobG93LCAxLCBnZGJfc3Rkb3V0KTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIiB0byAiKTsKKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoaGlnaCwgMSwgZ2RiX3N0ZG91dCk7CisJICBwcmludGZfZmlsdGVyZWQgKCI6XG4iKTsKKwl9CisKKyAgICAgIC8qIER1bXAgdGhlIHNwZWNpZmllZCByYW5nZS4gICovCisgICAgICBwYyA9IGxvdzsKKworI2lmZGVmIEdEQl9UQVJHRVRfTUFTS19ESVNBU19QQworICAgICAgcGNfbWFza2VkID0gR0RCX1RBUkdFVF9NQVNLX0RJU0FTX1BDIChwYyk7CisjZWxzZQorICAgICAgcGNfbWFza2VkID0gcGM7CisjZW5kaWYKKworICAgICAgd2hpbGUgKHBjX21hc2tlZCA8IGhpZ2gpCisJeworCSAgUVVJVDsKKwkgIHByaW50X2FkZHJlc3MgKHBjX21hc2tlZCwgZ2RiX3N0ZG91dCk7CisJICBwcmludGZfZmlsdGVyZWQgKCI6XHQiKTsKKwkgIC8qIFdlIG9mdGVuIHdyYXAgaGVyZSBpZiB0aGVyZSBhcmUgbG9uZyBzeW1ib2xpYyBuYW1lcy4gICovCisJICB3cmFwX2hlcmUgKCIgICAgIik7CisJICBwYyArPSBwcmludF9pbnNuIChwYywgZ2RiX3N0ZG91dCk7CisJICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworCisjaWZkZWYgR0RCX1RBUkdFVF9NQVNLX0RJU0FTX1BDCisJICBwY19tYXNrZWQgPSBHREJfVEFSR0VUX01BU0tfRElTQVNfUEMgKHBjKTsKKyNlbHNlCisJICBwY19tYXNrZWQgPSBwYzsKKyNlbmRpZgorCX0KKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkVuZCBvZiBhc3NlbWJsZXIgZHVtcC5cbiIpOworICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgICB9CisjaWYgZGVmaW5lZChUVUkpCisgIGVsc2UKKyAgICB7CisgICAgICB0dWlEbygoVHVpT3BhcXVlRnVuY1B0cil0dWlfdkFkZFdpblRvTGF5b3V0LCBESVNBU1NFTV9XSU4pOworICAgICAgdHVpRG8oKFR1aU9wYXF1ZUZ1bmNQdHIpdHVpX3ZVcGRhdGVTb3VyY2VXaW5kb3dzV2l0aEFkZHIsIGxvdyk7CisgICAgfQorI2VuZGlmCit9CisKKy8qIFByaW50IHRoZSBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzIE1FTUFERFIgaW4gZGVidWdnZWQgbWVtb3J5LAorICAgb24gU1RSRUFNLiAgUmV0dXJucyBsZW5ndGggb2YgdGhlIGluc3RydWN0aW9uLCBpbiBieXRlcy4gICovCisKK3N0YXRpYyBpbnQKK3ByaW50X2luc24gKG1lbWFkZHIsIHN0cmVhbSkKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIEdEQl9GSUxFICpzdHJlYW07Cit7CisgIGlmIChUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQorICAgIFRBUkdFVF9QUklOVF9JTlNOX0lORk8tPmVuZGlhbiA9IEJGRF9FTkRJQU5fQklHOworICBlbHNlCisgICAgVEFSR0VUX1BSSU5UX0lOU05fSU5GTy0+ZW5kaWFuID0gQkZEX0VORElBTl9MSVRUTEU7CisKKyAgaWYgKFRBUkdFVF9BUkNISVRFQ1RVUkUgIT0gTlVMTCkKKyAgICBUQVJHRVRfUFJJTlRfSU5TTl9JTkZPLT5tYWNoID0gVEFSR0VUX0FSQ0hJVEVDVFVSRS0+bWFjaDsKKyAgLyogZWxzZTogc2hvdWxkIHNldCAubWFjaD0wIGJ1dCBzb21lIGRpc2Fzc2VtYmxlcnMgZG9uJ3QgZ3JvayB0aGlzICovCisKKyAgcmV0dXJuIFRBUkdFVF9QUklOVF9JTlNOIChtZW1hZGRyLCBUQVJHRVRfUFJJTlRfSU5TTl9JTkZPKTsKK30KKworDAordm9pZAorX2luaXRpYWxpemVfcHJpbnRjbWQgKCkKK3sKKyAgY3VycmVudF9kaXNwbGF5X251bWJlciA9IC0xOworCisgIGFkZF9pbmZvICgiYWRkcmVzcyIsIGFkZHJlc3NfaW5mbywKKwkgICAiRGVzY3JpYmUgd2hlcmUgc3ltYm9sIFNZTSBpcyBzdG9yZWQuIik7CisKKyAgYWRkX2luZm8gKCJzeW1ib2wiLCBzeW1faW5mbywgCisJICAgICJEZXNjcmliZSB3aGF0IHN5bWJvbCBpcyBhdCBsb2NhdGlvbiBBRERSLlxuXAorT25seSBmb3Igc3ltYm9scyB3aXRoIGZpeGVkIGxvY2F0aW9ucyAoZ2xvYmFsIG9yIHN0YXRpYyBzY29wZSkuIik7CisKKyAgYWRkX2NvbSAoIngiLCBjbGFzc192YXJzLCB4X2NvbW1hbmQsCisJICAgY29uY2F0ICgiRXhhbWluZSBtZW1vcnk6IHgvRk1UIEFERFJFU1MuXG5cCitBRERSRVNTIGlzIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBtZW1vcnkgYWRkcmVzcyB0byBleGFtaW5lLlxuXAorRk1UIGlzIGEgcmVwZWF0IGNvdW50IGZvbGxvd2VkIGJ5IGEgZm9ybWF0IGxldHRlciBhbmQgYSBzaXplIGxldHRlci5cblwKK0Zvcm1hdCBsZXR0ZXJzIGFyZSBvKG9jdGFsKSwgeChoZXgpLCBkKGRlY2ltYWwpLCB1KHVuc2lnbmVkIGRlY2ltYWwpLFxuXAorICB0KGJpbmFyeSksIGYoZmxvYXQpLCBhKGFkZHJlc3MpLCBpKGluc3RydWN0aW9uKSwgYyhjaGFyKSBhbmQgcyhzdHJpbmcpLlxuIiwKKyJTaXplIGxldHRlcnMgYXJlIGIoYnl0ZSksIGgoaGFsZndvcmQpLCB3KHdvcmQpLCBnKGdpYW50LCA4IGJ5dGVzKS5cblwKK1RoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG9iamVjdHMgb2YgdGhlIHNwZWNpZmllZCBzaXplIGFyZSBwcmludGVkXG5cCithY2NvcmRpbmcgdG8gdGhlIGZvcm1hdC5cblxuXAorRGVmYXVsdHMgZm9yIGZvcm1hdCBhbmQgc2l6ZSBsZXR0ZXJzIGFyZSB0aG9zZSBwcmV2aW91c2x5IHVzZWQuXG5cCitEZWZhdWx0IGNvdW50IGlzIDEuICBEZWZhdWx0IGFkZHJlc3MgaXMgZm9sbG93aW5nIGxhc3QgdGhpbmcgcHJpbnRlZFxuXAord2l0aCB0aGlzIGNvbW1hbmQgb3IgXCJwcmludFwiLiIsIE5VTEwpKTsKKworICBhZGRfY29tICgiZGlzYXNzZW1ibGUiLCBjbGFzc192YXJzLCBkaXNhc3NlbWJsZV9jb21tYW5kLAorCSAgICJEaXNhc3NlbWJsZSBhIHNwZWNpZmllZCBzZWN0aW9uIG9mIG1lbW9yeS5cblwKK0RlZmF1bHQgaXMgdGhlIGZ1bmN0aW9uIHN1cnJvdW5kaW5nIHRoZSBwYyBvZiB0aGUgc2VsZWN0ZWQgZnJhbWUuXG5cCitXaXRoIGEgc2luZ2xlIGFyZ3VtZW50LCB0aGUgZnVuY3Rpb24gc3Vycm91bmRpbmcgdGhhdCBhZGRyZXNzIGlzIGR1bXBlZC5cblwKK1R3byBhcmd1bWVudHMgYXJlIHRha2VuIGFzIGEgcmFuZ2Ugb2YgbWVtb3J5IHRvIGR1bXAuIik7CisgIGlmICh4ZGJfY29tbWFuZHMpCisgIAlhZGRfY29tX2FsaWFzICgidmEiLCAiZGlzYXNzZW1ibGUiLCBjbGFzc194ZGIsIDApOworCisjaWYgMAorICBhZGRfY29tICgid2hlcmVpcyIsIGNsYXNzX3ZhcnMsIHdoZXJlaXNfY29tbWFuZCwKKwkgICAiUHJpbnQgbGluZSBudW1iZXIgYW5kIGZpbGUgb2YgZGVmaW5pdGlvbiBvZiB2YXJpYWJsZS4iKTsKKyNlbmRpZgorICAKKyAgYWRkX2luZm8gKCJkaXNwbGF5IiwgZGlzcGxheV9pbmZvLAorCSAgICAiRXhwcmVzc2lvbnMgdG8gZGlzcGxheSB3aGVuIHByb2dyYW0gc3RvcHMsIHdpdGggY29kZSBudW1iZXJzLiIpOworCisgIGFkZF9jbWQgKCJ1bmRpc3BsYXkiLCBjbGFzc192YXJzLCB1bmRpc3BsYXlfY29tbWFuZCwKKwkgICAiQ2FuY2VsIHNvbWUgZXhwcmVzc2lvbnMgdG8gYmUgZGlzcGxheWVkIHdoZW4gcHJvZ3JhbSBzdG9wcy5cblwKK0FyZ3VtZW50cyBhcmUgdGhlIGNvZGUgbnVtYmVycyBvZiB0aGUgZXhwcmVzc2lvbnMgdG8gc3RvcCBkaXNwbGF5aW5nLlxuXAorTm8gYXJndW1lbnQgbWVhbnMgY2FuY2VsIGFsbCBhdXRvbWF0aWMtZGlzcGxheSBleHByZXNzaW9ucy5cblwKK1wiZGVsZXRlIGRpc3BsYXlcIiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIHRoaXMgY29tbWFuZC5cblwKK0RvIFwiaW5mbyBkaXNwbGF5XCIgdG8gc2VlIGN1cnJlbnQgbGlzdCBvZiBjb2RlIG51bWJlcnMuIiwKKwkJICAmY21kbGlzdCk7CisKKyAgYWRkX2NvbSAoImRpc3BsYXkiLCBjbGFzc192YXJzLCBkaXNwbGF5X2NvbW1hbmQsCisJICAgIlByaW50IHZhbHVlIG9mIGV4cHJlc3Npb24gRVhQIGVhY2ggdGltZSB0aGUgcHJvZ3JhbSBzdG9wcy5cblwKKy9GTVQgbWF5IGJlIHVzZWQgYmVmb3JlIEVYUCBhcyBpbiB0aGUgXCJwcmludFwiIGNvbW1hbmQuXG5cCisvRk1UIFwiaVwiIG9yIFwic1wiIG9yIGluY2x1ZGluZyBhIHNpemUtbGV0dGVyIGlzIGFsbG93ZWQsXG5cCithcyBpbiB0aGUgXCJ4XCIgY29tbWFuZCwgYW5kIHRoZW4gRVhQIGlzIHVzZWQgdG8gZ2V0IHRoZSBhZGRyZXNzIHRvIGV4YW1pbmVcblwKK2FuZCBleGFtaW5pbmcgaXMgZG9uZSBhcyBpbiB0aGUgXCJ4XCIgY29tbWFuZC5cblxuXAorV2l0aCBubyBhcmd1bWVudCwgZGlzcGxheSBhbGwgY3VycmVudGx5IHJlcXVlc3RlZCBhdXRvLWRpc3BsYXkgZXhwcmVzc2lvbnMuXG5cCitVc2UgXCJ1bmRpc3BsYXlcIiB0byBjYW5jZWwgZGlzcGxheSByZXF1ZXN0cyBwcmV2aW91c2x5IG1hZGUuIgorKTsKKworICBhZGRfY21kICgiZGlzcGxheSIsIGNsYXNzX3ZhcnMsIGVuYWJsZV9kaXNwbGF5LCAKKwkgICAiRW5hYmxlIHNvbWUgZXhwcmVzc2lvbnMgdG8gYmUgZGlzcGxheWVkIHdoZW4gcHJvZ3JhbSBzdG9wcy5cblwKK0FyZ3VtZW50cyBhcmUgdGhlIGNvZGUgbnVtYmVycyBvZiB0aGUgZXhwcmVzc2lvbnMgdG8gcmVzdW1lIGRpc3BsYXlpbmcuXG5cCitObyBhcmd1bWVudCBtZWFucyBlbmFibGUgYWxsIGF1dG9tYXRpYy1kaXNwbGF5IGV4cHJlc3Npb25zLlxuXAorRG8gXCJpbmZvIGRpc3BsYXlcIiB0byBzZWUgY3VycmVudCBsaXN0IG9mIGNvZGUgbnVtYmVycy4iLCAmZW5hYmxlbGlzdCk7CisKKyAgYWRkX2NtZCAoImRpc3BsYXkiLCBjbGFzc192YXJzLCBkaXNhYmxlX2Rpc3BsYXlfY29tbWFuZCwgCisJICAgIkRpc2FibGUgc29tZSBleHByZXNzaW9ucyB0byBiZSBkaXNwbGF5ZWQgd2hlbiBwcm9ncmFtIHN0b3BzLlxuXAorQXJndW1lbnRzIGFyZSB0aGUgY29kZSBudW1iZXJzIG9mIHRoZSBleHByZXNzaW9ucyB0byBzdG9wIGRpc3BsYXlpbmcuXG5cCitObyBhcmd1bWVudCBtZWFucyBkaXNhYmxlIGFsbCBhdXRvbWF0aWMtZGlzcGxheSBleHByZXNzaW9ucy5cblwKK0RvIFwiaW5mbyBkaXNwbGF5XCIgdG8gc2VlIGN1cnJlbnQgbGlzdCBvZiBjb2RlIG51bWJlcnMuIiwgJmRpc2FibGVsaXN0KTsKKworICBhZGRfY21kICgiZGlzcGxheSIsIGNsYXNzX3ZhcnMsIHVuZGlzcGxheV9jb21tYW5kLCAKKwkgICAiQ2FuY2VsIHNvbWUgZXhwcmVzc2lvbnMgdG8gYmUgZGlzcGxheWVkIHdoZW4gcHJvZ3JhbSBzdG9wcy5cblwKK0FyZ3VtZW50cyBhcmUgdGhlIGNvZGUgbnVtYmVycyBvZiB0aGUgZXhwcmVzc2lvbnMgdG8gc3RvcCBkaXNwbGF5aW5nLlxuXAorTm8gYXJndW1lbnQgbWVhbnMgY2FuY2VsIGFsbCBhdXRvbWF0aWMtZGlzcGxheSBleHByZXNzaW9ucy5cblwKK0RvIFwiaW5mbyBkaXNwbGF5XCIgdG8gc2VlIGN1cnJlbnQgbGlzdCBvZiBjb2RlIG51bWJlcnMuIiwgJmRlbGV0ZWxpc3QpOworCisgIGFkZF9jb20gKCJwcmludGYiLCBjbGFzc192YXJzLCBwcmludGZfY29tbWFuZCwKKwkicHJpbnRmIFwicHJpbnRmIGZvcm1hdCBzdHJpbmdcIiwgYXJnMSwgYXJnMiwgYXJnMywgLi4uLCBhcmduXG5cCitUaGlzIGlzIHVzZWZ1bCBmb3IgZm9ybWF0dGVkIG91dHB1dCBpbiB1c2VyLWRlZmluZWQgY29tbWFuZHMuIik7CisKKyAgYWRkX2NvbSAoIm91dHB1dCIsIGNsYXNzX3ZhcnMsIG91dHB1dF9jb21tYW5kLAorCSAgICJMaWtlIFwicHJpbnRcIiBidXQgZG9uJ3QgcHV0IGluIHZhbHVlIGhpc3RvcnkgYW5kIGRvbid0IHByaW50IG5ld2xpbmUuXG5cCitUaGlzIGlzIHVzZWZ1bCBpbiB1c2VyLWRlZmluZWQgY29tbWFuZHMuIik7CisKKyAgYWRkX3ByZWZpeF9jbWQgKCJzZXQiLCBjbGFzc192YXJzLCBzZXRfY29tbWFuZCwKK2NvbmNhdCAoIkV2YWx1YXRlIGV4cHJlc3Npb24gRVhQIGFuZCBhc3NpZ24gcmVzdWx0IHRvIHZhcmlhYmxlIFZBUiwgdXNpbmcgYXNzaWdubWVudFxuXAorc3ludGF4IGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsYW5ndWFnZSAoVkFSID0gRVhQIG9yIFZBUiA6PSBFWFAgZm9yXG5cCitleGFtcGxlKS4gIFZBUiBtYXkgYmUgYSBkZWJ1Z2dlciBcImNvbnZlbmllbmNlXCIgdmFyaWFibGUgKG5hbWVzIHN0YXJ0aW5nXG5cCit3aXRoICQpLCBhIHJlZ2lzdGVyIChhIGZldyBzdGFuZGFyZCBuYW1lcyBzdGFydGluZyB3aXRoICQpLCBvciBhbiBhY3R1YWxcblwKK3ZhcmlhYmxlIGluIHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkLiAgRVhQIGlzIGFueSB2YWxpZCBleHByZXNzaW9uLlxuIiwKKyJVc2UgXCJzZXQgdmFyaWFibGVcIiBmb3IgdmFyaWFibGVzIHdpdGggbmFtZXMgaWRlbnRpY2FsIHRvIHNldCBzdWJjb21tYW5kcy5cblwKK1xuV2l0aCBhIHN1YmNvbW1hbmQsIHRoaXMgY29tbWFuZCBtb2RpZmllcyBwYXJ0cyBvZiB0aGUgZ2RiIGVudmlyb25tZW50LlxuXAorWW91IGNhbiBzZWUgdGhlc2UgZW52aXJvbm1lbnQgc2V0dGluZ3Mgd2l0aCB0aGUgXCJzaG93XCIgY29tbWFuZC4iLCBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICZzZXRsaXN0LCAic2V0ICIsIDEsICZjbWRsaXN0KTsKKyAgaWYgKGRieF9jb21tYW5kcykKKyAgICBhZGRfY29tKCJhc3NpZ24iLCBjbGFzc192YXJzLCBzZXRfY29tbWFuZCwgY29uY2F0ICgiRXZhbHVhdGUgZXhwcmVzc2lvbiBcCitFWFAgYW5kIGFzc2lnbiByZXN1bHQgdG8gdmFyaWFibGUgVkFSLCB1c2luZyBhc3NpZ25tZW50XG5cCitzeW50YXggYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlIChWQVIgPSBFWFAgb3IgVkFSIDo9IEVYUCBmb3JcblwKK2V4YW1wbGUpLiAgVkFSIG1heSBiZSBhIGRlYnVnZ2VyIFwiY29udmVuaWVuY2VcIiB2YXJpYWJsZSAobmFtZXMgc3RhcnRpbmdcblwKK3dpdGggJCksIGEgcmVnaXN0ZXIgKGEgZmV3IHN0YW5kYXJkIG5hbWVzIHN0YXJ0aW5nIHdpdGggJCksIG9yIGFuIGFjdHVhbFxuXAordmFyaWFibGUgaW4gdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQuICBFWFAgaXMgYW55IHZhbGlkIGV4cHJlc3Npb24uXG4iLAorIlVzZSBcInNldCB2YXJpYWJsZVwiIGZvciB2YXJpYWJsZXMgd2l0aCBuYW1lcyBpZGVudGljYWwgdG8gc2V0IHN1YmNvbW1hbmRzLlxuXAorXG5XaXRoIGEgc3ViY29tbWFuZCwgdGhpcyBjb21tYW5kIG1vZGlmaWVzIHBhcnRzIG9mIHRoZSBnZGIgZW52aXJvbm1lbnQuXG5cCitZb3UgY2FuIHNlZSB0aGVzZSBlbnZpcm9ubWVudCBzZXR0aW5ncyB3aXRoIHRoZSBcInNob3dcIiBjb21tYW5kLiIsIE5VTEwpKTsKKworICAvKiAiY2FsbCIgaXMgdGhlIHNhbWUgYXMgInNldCIsIGJ1dCBoYW5keSBmb3IgZGJ4IHVzZXJzIHRvIGNhbGwgZm5zLiAqLworICBhZGRfY29tICgiY2FsbCIsIGNsYXNzX3ZhcnMsIGNhbGxfY29tbWFuZCwKKwkgICAiQ2FsbCBhIGZ1bmN0aW9uIGluIHRoZSBwcm9ncmFtLlxuXAorVGhlIGFyZ3VtZW50IGlzIHRoZSBmdW5jdGlvbiBuYW1lIGFuZCBhcmd1bWVudHMsIGluIHRoZSBub3RhdGlvbiBvZiB0aGVcblwKK2N1cnJlbnQgd29ya2luZyBsYW5ndWFnZS4gIFRoZSByZXN1bHQgaXMgcHJpbnRlZCBhbmQgc2F2ZWQgaW4gdGhlIHZhbHVlXG5cCitoaXN0b3J5LCBpZiBpdCBpcyBub3Qgdm9pZC4iKTsKKworICBhZGRfY21kICgidmFyaWFibGUiLCBjbGFzc192YXJzLCBzZXRfY29tbWFuZCwKKyJFdmFsdWF0ZSBleHByZXNzaW9uIEVYUCBhbmQgYXNzaWduIHJlc3VsdCB0byB2YXJpYWJsZSBWQVIsIHVzaW5nIGFzc2lnbm1lbnRcblwKK3N5bnRheCBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgKFZBUiA9IEVYUCBvciBWQVIgOj0gRVhQIGZvclxuXAorZXhhbXBsZSkuICBWQVIgbWF5IGJlIGEgZGVidWdnZXIgXCJjb252ZW5pZW5jZVwiIHZhcmlhYmxlIChuYW1lcyBzdGFydGluZ1xuXAord2l0aCAkKSwgYSByZWdpc3RlciAoYSBmZXcgc3RhbmRhcmQgbmFtZXMgc3RhcnRpbmcgd2l0aCAkKSwgb3IgYW4gYWN0dWFsXG5cCit2YXJpYWJsZSBpbiB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZC4gIEVYUCBpcyBhbnkgdmFsaWQgZXhwcmVzc2lvbi5cblwKK1RoaXMgbWF5IHVzdWFsbHkgYmUgYWJicmV2aWF0ZWQgdG8gc2ltcGx5IFwic2V0XCIuIiwKKyAgICAgICAgICAgJnNldGxpc3QpOworCisgIGFkZF9jb20gKCJwcmludCIsIGNsYXNzX3ZhcnMsIHByaW50X2NvbW1hbmQsCisJICAgY29uY2F0ICgiUHJpbnQgdmFsdWUgb2YgZXhwcmVzc2lvbiBFWFAuXG5cCitWYXJpYWJsZXMgYWNjZXNzaWJsZSBhcmUgdGhvc2Ugb2YgdGhlIGxleGljYWwgZW52aXJvbm1lbnQgb2YgdGhlIHNlbGVjdGVkXG5cCitzdGFjayBmcmFtZSwgcGx1cyBhbGwgdGhvc2Ugd2hvc2Ugc2NvcGUgaXMgZ2xvYmFsIG9yIGFuIGVudGlyZSBmaWxlLlxuXAorXG5cCiskTlVNIGdldHMgcHJldmlvdXMgdmFsdWUgbnVtYmVyIE5VTS4gICQgYW5kICQkIGFyZSB0aGUgbGFzdCB0d28gdmFsdWVzLlxuXAorJCROVU0gcmVmZXJzIHRvIE5VTSd0aCB2YWx1ZSBiYWNrIGZyb20gdGhlIGxhc3Qgb25lLlxuXAorTmFtZXMgc3RhcnRpbmcgd2l0aCAkIHJlZmVyIHRvIHJlZ2lzdGVycyAod2l0aCB0aGUgdmFsdWVzIHRoZXkgd291bGQgaGF2ZVxuIiwKKyJpZiB0aGUgcHJvZ3JhbSB3ZXJlIHRvIHJldHVybiB0byB0aGUgc3RhY2sgZnJhbWUgbm93IHNlbGVjdGVkLCByZXN0b3JpbmdcblwKK2FsbCByZWdpc3RlcnMgc2F2ZWQgYnkgZnJhbWVzIGZhcnRoZXIgaW4pIG9yIGVsc2UgdG8gZGVidWdnZXJcblwKK1wiY29udmVuaWVuY2VcIiB2YXJpYWJsZXMgKGFueSBzdWNoIG5hbWUgbm90IGEga25vd24gcmVnaXN0ZXIpLlxuXAorVXNlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbnMgdG8gZ2l2ZSB2YWx1ZXMgdG8gY29udmVuaWVuY2UgdmFyaWFibGVzLlxuIiwKKwkJICAgIlxuXAore1RZUEV9QURSRVhQIHJlZmVycyB0byBhIGRhdHVtIG9mIGRhdGEgdHlwZSBUWVBFLCBsb2NhdGVkIGF0IGFkZHJlc3MgQURSRVhQLlxuXAorQCBpcyBhIGJpbmFyeSBvcGVyYXRvciBmb3IgdHJlYXRpbmcgY29uc2VjdXRpdmUgZGF0YSBvYmplY3RzXG5cCithbnl3aGVyZSBpbiBtZW1vcnkgYXMgYW4gYXJyYXkuICBGT09ATlVNIGdpdmVzIGFuIGFycmF5IHdob3NlIGZpcnN0XG5cCitlbGVtZW50IGlzIEZPTywgd2hvc2Ugc2Vjb25kIGVsZW1lbnQgaXMgc3RvcmVkIGluIHRoZSBzcGFjZSBmb2xsb3dpbmdcblwKK3doZXJlIEZPTyBpcyBzdG9yZWQsIGV0Yy4gIEZPTyBtdXN0IGJlIGFuIGV4cHJlc3Npb24gd2hvc2UgdmFsdWVcblwKK3Jlc2lkZXMgaW4gbWVtb3J5LlxuIiwKKwkJICAgIlxuXAorRVhQIG1heSBiZSBwcmVjZWRlZCB3aXRoIC9GTVQsIHdoZXJlIEZNVCBpcyBhIGZvcm1hdCBsZXR0ZXJcblwKK2J1dCBubyBjb3VudCBvciBzaXplIGxldHRlciAoc2VlIFwieFwiIGNvbW1hbmQpLiIsIE5VTEwpKTsKKyAgYWRkX2NvbV9hbGlhcyAoInAiLCAicHJpbnQiLCBjbGFzc192YXJzLCAxKTsKKworICBhZGRfY29tICgiaW5zcGVjdCIsIGNsYXNzX3ZhcnMsIGluc3BlY3RfY29tbWFuZCwKKyJTYW1lIGFzIFwicHJpbnRcIiBjb21tYW5kLCBleGNlcHQgdGhhdCBpZiB5b3UgYXJlIHJ1bm5pbmcgaW4gdGhlIGVwb2NoXG5cCitlbnZpcm9ubWVudCwgdGhlIHZhbHVlIGlzIHByaW50ZWQgaW4gaXRzIG93biB3aW5kb3cuIik7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQgKAorICAgICAgYWRkX3NldF9jbWQgKCJtYXgtc3ltYm9saWMtb2Zmc2V0Iiwgbm9fY2xhc3MsIHZhcl91aW50ZWdlciwKKwkJICAgKGNoYXIgKikmbWF4X3N5bWJvbGljX29mZnNldCwKKwkiU2V0IHRoZSBsYXJnZXN0IG9mZnNldCB0aGF0IHdpbGwgYmUgcHJpbnRlZCBpbiA8c3ltYm9sKzEyMzQ+IGZvcm0uIiwKKwkJICAgJnNldHByaW50bGlzdCksCisgICAgICAmc2hvd3ByaW50bGlzdCk7CisgIGFkZF9zaG93X2Zyb21fc2V0ICgKKyAgICAgIGFkZF9zZXRfY21kICgic3ltYm9sLWZpbGVuYW1lIiwgbm9fY2xhc3MsIHZhcl9ib29sZWFuLAorCQkgICAoY2hhciAqKSZwcmludF9zeW1ib2xfZmlsZW5hbWUsCisJIlNldCBwcmludGluZyBvZiBzb3VyY2UgZmlsZW5hbWUgYW5kIGxpbmUgbnVtYmVyIHdpdGggPHN5bWJvbD4uIiwKKwkJICAgJnNldHByaW50bGlzdCksCisgICAgICAmc2hvd3ByaW50bGlzdCk7CisKKyAgLyogRm9yIGV4YW1pbmUvaW5zdHJ1Y3Rpb24gYSBzaW5nbGUgYnl0ZSBxdWFudGl0eSBpcyBzcGVjaWZpZWQgYXMKKyAgICAgdGhlIGRhdGEuICBUaGlzIGF2b2lkcyBwcm9ibGVtcyB3aXRoIHZhbHVlX2F0X2xhenkoKSByZXF1aXJpbmcgYQorICAgICB2YWxpZCBkYXRhIHR5cGUgKGFuZCByZWplY3RpbmcgVk9JRCkuICovCisgIGV4YW1pbmVfaV90eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCAxLCAwLCAiZXhhbWluZV9pX3R5cGUiLCBOVUxMKTsKKworICBleGFtaW5lX2JfdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgMSwgMCwgImV4YW1pbmVfYl90eXBlIiwgTlVMTCk7CisgIGV4YW1pbmVfaF90eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCAyLCAwLCAiZXhhbWluZV9oX3R5cGUiLCBOVUxMKTsKKyAgZXhhbWluZV93X3R5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDQsIDAsICJleGFtaW5lX3dfdHlwZSIsIE5VTEwpOworICBleGFtaW5lX2dfdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgOCwgMCwgImV4YW1pbmVfZ190eXBlIiwgTlVMTCk7CisKK30KZGlmZiAtLWdpdCBhL2dkYi9wcm9jZXNzX3JlcGx5LmRlZnMgYi9nZGIvcHJvY2Vzc19yZXBseS5kZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNGI1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcHJvY2Vzc19yZXBseS5kZWZzCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxodXJkL3Byb2Nlc3NfcmVwbHkuZGVmcz4KZGlmZiAtLWdpdCBhL2dkYi9wcm9jZnMuYyBiL2dkYi9wcm9jZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjIwMjQwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Byb2Nmcy5jCkBAIC0wLDAgKzEsNTc2NCBAQAorLyogTWFjaGluZSBpbmRlcGVuZGVudCBzdXBwb3J0IGZvciBTVlI0IC9wcm9jIChwcm9jZXNzIGZpbGUgc3lzdGVtKSBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5OTEsIDE5OTItOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBhdCBDeWdudXMgU3VwcG9ydC4gIENoYW5nZXMgZm9yIHN5c3Y0LjJtcCBwcm9jZnMKKyAgIGNvbXBhdGliaWxpdHkgYnkgR2VvZmZyZXkgTm9lciBhdCBDeWdudXMgU29sdXRpb25zLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworLyoJCQlOICBPICBUICBFICBTCisKK0ZvciBpbmZvcm1hdGlvbiBvbiB0aGUgZGV0YWlscyBvZiB1c2luZyAvcHJvYyBjb25zdWx0IHNlY3Rpb24gcHJvYyg0KQoraW4gdGhlIFVOSVggU3lzdGVtIFYgUmVsZWFzZSA0IFN5c3RlbSBBZG1pbmlzdHJhdG9yJ3MgUmVmZXJlbmNlIE1hbnVhbC4KKworVGhlIGdlbmVyYWwgcmVnaXN0ZXIgYW5kIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHNldHMgYXJlIG1hbmlwdWxhdGVkCitzZXBhcmF0ZWx5LiAgVGhpcyBmaWxlIG1ha2VzIHRoZSBhc3N1bXB0aW9uIHRoYXQgaWYgRlAwX1JFR05VTSBpcworZGVmaW5lZCwgdGhlbiBzdXBwb3J0IGZvciB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgc2V0IGlzIGRlc2lyZWQsCityZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IHRoZSBhY3R1YWwgdGFyZ2V0IGhhcyBmbG9hdGluZyBwb2ludCBoYXJkd2FyZS4KKworICovCisKKworI2luY2x1ZGUgImRlZnMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvZmF1bHQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgPHN0cm9wdHMuaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiZ2RiX3N0YXQuaCIKKworI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJnZGJ0aHJlYWQuaCIKKworI2lmICFkZWZpbmVkKFNZU19sd3BfY3JlYXRlKSAmJiBkZWZpbmVkKFNZU19sd3BjcmVhdGUpCisjIGRlZmluZSBTWVNfbHdwX2NyZWF0ZSBTWVNfbHdwY3JlYXRlCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFNZU19sd3BfZXhpdCkgJiYgZGVmaW5lZChTWVNfbHdwZXhpdCkKKyMgZGVmaW5lIFNZU19sd3BfZXhpdCBTWVNfbHdwZXhpdAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChTWVNfbHdwX3dhaXQpICYmIGRlZmluZWQoU1lTX2x3cHdhaXQpCisjIGRlZmluZSBTWVNfbHdwX3dhaXQgU1lTX2x3cHdhaXQKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoU1lTX2x3cF9zZWxmKSAmJiBkZWZpbmVkKFNZU19sd3BzZWxmKQorIyBkZWZpbmUgU1lTX2x3cF9zZWxmIFNZU19sd3BzZWxmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFNZU19sd3BfaW5mbykgJiYgZGVmaW5lZChTWVNfbHdwaW5mbykKKyMgZGVmaW5lIFNZU19sd3BfaW5mbyBTWVNfbHdwaW5mbworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChTWVNfbHdwX3ByaXZhdGUpICYmIGRlZmluZWQoU1lTX2x3cHByaXZhdGUpCisjIGRlZmluZSBTWVNfbHdwX3ByaXZhdGUgU1lTX2x3cHByaXZhdGUKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoU1lTX2x3cF9raWxsKSAmJiBkZWZpbmVkKFNZU19sd3BraWxsKQorIyBkZWZpbmUgU1lTX2x3cF9raWxsIFNZU19sd3BraWxsCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFNZU19sd3Bfc3VzcGVuZCkgJiYgZGVmaW5lZChTWVNfbHdwc3VzcGVuZCkKKyMgZGVmaW5lIFNZU19sd3Bfc3VzcGVuZCBTWVNfbHdwc3VzcGVuZAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChTWVNfbHdwX2NvbnRpbnVlKSAmJiBkZWZpbmVkKFNZU19sd3Bjb250aW51ZSkKKyMgZGVmaW5lIFNZU19sd3BfY29udGludWUgU1lTX2x3cGNvbnRpbnVlCisjZW5kaWYKKworLyogdGhlIG5hbWUgb2YgdGhlIHByb2Mgc3RhdHVzIHN0cnVjdCBkZXBlbmRzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiAqLworLyogV3JhcCBMaWdodCBXZWlnaHQgUHJvY2VzcyBtZW1iZXIgaW4gVEhFX1BSX0xXUCBtYWNybyBmb3IgY2xlYXJlciBjb2RlICovCisjaWZuZGVmIEhBVkVfUFNUQVRVU19UCisgIHR5cGVkZWYgcHJzdGF0dXNfdCBnZGJfcHJzdGF0dXNfdDsKKyNkZWZpbmUgVEhFX1BSX0xXUChhKQlhCisjZWxzZQkvKiBIQVZFX1BTVEFUVVNfVCAqLworICB0eXBlZGVmIHBzdGF0dXNfdCBnZGJfcHJzdGF0dXNfdDsKKyNkZWZpbmUgVEhFX1BSX0xXUChhKQlhLnByX2x3cAorI2lmICFkZWZpbmVkKEhBVkVfUFJSVU5fVCkgJiYgZGVmaW5lZChIQVZFX01VTFRJUExFX1BST0NfRkRTKQorICAvKiBGYWxsYmFjayBkZWZpbml0aW9ucyAtIGZvciB1c2luZyBjb25maWd1cmUgaW5mb3JtYXRpb24gZGlyZWN0bHkgKi8KKyNpZm5kZWYgVU5JWFdBUkUKKyNkZWZpbmUgVU5JWFdBUkUJMQorI2VuZGlmCisjaWYgIWRlZmluZWQoUFJPQ0ZTX1VTRV9SRUFEX1dSSVRFKSAmJiAhZGVmaW5lZChIQVZFX1BST0NGU19QSU9DU0VUKQorI2RlZmluZSBQUk9DRlNfVVNFX1JFQURfV1JJVEUJMQorI2VuZGlmCisjZW5kaWYJLyogIUhBVkVfUFJSVU5fVCAmJiBIQVZFX01VTFRJUExFX1BST0NfRkRTICovCisjZW5kaWYJLyogSEFWRV9QU1RBVFVTX1QgKi8KKworI2RlZmluZSBNQVhfU1lTQ0FMTFMJMjU2CS8qIE1heGltdW0gbnVtYmVyIG9mIHN5c2NhbGxzIGZvciB0YWJsZSAqLworCisvKiBwcm9jIG5hbWUgZm9ybWF0cyBtYXkgdmFyeSBkZXBlbmRpbmcgb24gdGhlIHByb2MgaW1wbGVtZW50YXRpb24gKi8KKyNpZmRlZiBIQVZFX01VTFRJUExFX1BST0NfRkRTCisjICBpZm5kZWYgQ1RMX1BST0NfTkFNRV9GTVQKKyMgIGRlZmluZSBDVExfUFJPQ19OQU1FX0ZNVCAiL3Byb2MvJWQvY3RsIgorIyAgZGVmaW5lIEFTX1BST0NfTkFNRV9GTVQgIi9wcm9jLyVkL2FzIgorIyAgZGVmaW5lIE1BUF9QUk9DX05BTUVfRk1UICIvcHJvYy8lZC9tYXAiCisjICBkZWZpbmUgU1RBVFVTX1BST0NfTkFNRV9GTVQgIi9wcm9jLyVkL3N0YXR1cyIKKyMgIGVuZGlmCisjZWxzZSAvKiBIQVZFX01VTFRJUExFX1BST0NfRkRTICovCisjICBpZm5kZWYgQ1RMX1BST0NfTkFNRV9GTVQKKyMgIGRlZmluZSBDVExfUFJPQ19OQU1FX0ZNVCAiL3Byb2MvJTA1ZCIKKyMgIGRlZmluZSBBU19QUk9DX05BTUVfRk1UICIvcHJvYy8lMDVkIgorIyAgZGVmaW5lIE1BUF9QUk9DX05BTUVfRk1UICIvcHJvYy8lMDVkIgorIyAgZGVmaW5lIFNUQVRVU19QUk9DX05BTUVfRk1UICIvcHJvYy8lMDVkIgorIyAgZW5kaWYKKyNlbmRpZiAvKiBIQVZFX01VTFRJUExFX1BST0NfRkRTICovCisKKworLyogVGhlc2UgI2lmZGVmcyBhcmUgZm9yIHNvbDIueCBpbiBwYXJ0aWN1bGFyLiAgc29sMi54IGhhcworICAgYm90aCBhICJncmVnc2V0X3QiIGFuZCBhICJwcmdyZWdzZXRfdCIsIHdoaWNoIGhhdmUKKyAgIHNpbWlsYXIgdXNlcyBidXQgZGlmZmVyZW50IGxheW91dHMuICBzb2wyLnggZ2RiIHRyaWVzIHRvCisgICB1c2UgcHJncmVnc2V0X3QgKGFuZCBwcmZwcmVnc2V0X3QpIGV2ZXJ5d2hlcmUuICovCisKKyNpZmRlZiBHREJfR1JFR1NFVF9UWVBFCisgIHR5cGVkZWYgR0RCX0dSRUdTRVRfVFlQRSBnZGJfZ3JlZ3NldF90OworI2Vsc2UKKyAgdHlwZWRlZiBncmVnc2V0X3QgZ2RiX2dyZWdzZXRfdDsKKyNlbmRpZgorCisjaWZkZWYgR0RCX0ZQUkVHU0VUX1RZUEUKKyAgdHlwZWRlZiBHREJfRlBSRUdTRVRfVFlQRSBnZGJfZnByZWdzZXRfdDsKKyNlbHNlCisgIHR5cGVkZWYgZnByZWdzZXRfdCBnZGJfZnByZWdzZXRfdDsKKyNlbmRpZgorCisKKyNkZWZpbmUgTUFYX1BST0NfTkFNRV9TSVpFIHNpemVvZigiL3Byb2MvMTIzNDU2Nzg5MC9zdGF0dXMiKQorCitzdHJ1Y3QgdGFyZ2V0X29wcyBwcm9jZnNfb3BzOworCitpbnQgcHJvY2ZzX3N1cHByZXNzX3J1biA9IDA7CS8qIE5vbi16ZXJvIGlmIHByb2NmcyBzaG91bGQgcHJldGVuZCBub3QgdG8KKwkJCQkgICBiZSBhIHJ1bm5hYmxlIHRhcmdldC4gIFVzZWQgYnkgdGFyZ2V0cworCQkJCSAgIHRoYXQgY2FuIHNpdCBhdG9wIHByb2Nmcywgc3VjaCBhcyBzb2xhcmlzCisJCQkJICAgdGhyZWFkIHN1cHBvcnQuICAqLworCisjaWYgMQkvKiBGSVhNRTogR3Jvc3MgYW5kIHVnbHkgaGFjayB0byByZXNvbHZlIGNvcmVkZXAuYyBnbG9iYWwgKi8KK0NPUkVfQUREUiBrZXJuZWxfdV9hZGRyOworI2VuZGlmCisKKyNpZmRlZiBCUk9LRU5fU0lHSU5GT19ICQkvKiBXb3JrYXJvdW5kIGJyb2tlbiBTR1MgPHN5cy9zaWdpbmZvLmg+ICovCisjdW5kZWYgc2lfcGlkCisjZGVmaW5lIHNpX3BpZCBfZGF0YS5fcHJvYy5waWQKKyN1bmRlZiBzaV91aWQKKyNkZWZpbmUgc2lfdWlkIF9kYXRhLl9wcm9jLl9wZGF0YS5fa2lsbC51aWQKKyNlbmRpZiAvKiBCUk9LRU5fU0lHSU5GT19IICovCisKKy8qIERlZmluZSBzdHJ1Y3R1cmVzIGZvciBwYXNzaW5nIGNvbW1hbmRzIHRvIC9wcm9jL3BpZC9jdGwgZmlsZS4gIE5vdGUgdGhhdAorICAgd2hpbGUgd2UgY3JlYXRlIHRoZXNlIGZvciB0aGUgUFJPQ0ZTX1VTRV9SRUFEX1dSSVRFIHdvcmxkLCB3ZSB1c2UgdGhlbQorICAgYW5kIGlnbm9yZSB0aGUgZXh0cmEgY21kIGludCBpbiBvdGhlciBwcm9jIHNjaGVtZXMuCisqLworLyogZ2VuZXJpYyBjdGwgbXNnICovCitzdHJ1Y3QgcHJvY19jdGwgeworICAgICAgICBpbnQgICAgIGNtZDsKKyAgICAgICAgbG9uZyAgICBkYXRhOworfTsKKworLyogc2V0IGdlbmVyYWwgcmVnaXN0ZXJzICovCitzdHJ1Y3QgZ3JlZ19jdGwgeworICAgICAgICBpbnQgICAgICAgICAgICAgY21kOworICAgICAgICBnZGJfZ3JlZ3NldF90CWdyZWdzZXQ7Cit9OworCisvKiBzZXQgZnAgcmVnaXN0ZXJzICovCitzdHJ1Y3QgZnByZWdfY3RsIHsKKyAgICAgICAgaW50ICAgICAgICAgICAgIGNtZDsKKyAgICAgICAgZ2RiX2ZwcmVnc2V0X3QJZnByZWdzZXQ7Cit9OworCisvKiBzZXQgc2lnbmFscyB0byBiZSB0cmFjZWQgKi8KK3N0cnVjdCBzaWdfY3RsIHsKKyAgICAgICAgaW50ICAgICAgICAgICAgIGNtZDsKKyAgICAgICAgc2lnc2V0X3QgICAgICAgIHNpZ3NldDsKK307CisKKy8qIHNldCBmYXVsdHMgdG8gYmUgdHJhY2VkICovCitzdHJ1Y3QgZmx0X2N0bCB7CisgICAgICAgIGludCAgICAgICAgICAgICBjbWQ7CisgICAgICAgIGZsdHNldF90ICAgICAgICBmbHRzZXQ7Cit9OworCisvKiBzZXQgc3lzdGVtIGNhbGxzIHRvIGJlIHRyYWNlZCAqLworc3RydWN0IHN5c19jdGwgeworICAgICAgICBpbnQgICAgICAgICAgICAgY21kOworICAgICAgICBzeXNzZXRfdCAgICAgICAgc3lzc2V0OworfTsKKworLyogc2V0IGN1cnJlbnQgc2lnbmFsIHRvIGJlIHRyYWNlZCAqLworc3RydWN0IHNpZ2lfY3RsIHsKKyAgICAgICAgaW50ICAgICAgICAgICAgIGNtZDsKKyAgICAgICAgc2lnaW5mb190ICAgICAgIHNpZ2luZm87Cit9OworCisvKiAgQWxsIGFjY2VzcyB0byB0aGUgaW5mZXJpb3IsIGVpdGhlciBvbmUgc3RhcnRlZCBieSBnZGIgb3Igb25lIHRoYXQgaGFzCisgICAgYmVlbiBhdHRhY2hlZCB0bywgaXMgY29udHJvbGxlZCBieSBhbiBpbnN0YW5jZSBvZiBhIHByb2NpbmZvIHN0cnVjdHVyZSwKKyAgICBkZWZpbmVkIGJlbG93LiAgU2luY2UgZ2RiIGN1cnJlbnRseSBvbmx5IGhhbmRsZXMgb25lIGluZmVyaW9yIGF0IGEgdGltZSwKKyAgICB0aGUgcHJvY2luZm8gc3RydWN0dXJlIGZvciB0aGUgaW5mZXJpb3IgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgYW5kCisgICAgb25seSBvbmUgZXhpc3RzIGF0IGFueSBnaXZlbiB0aW1lLiAgVGhlcmUgaXMgYSBzZXBhcmF0ZSBwcm9jaW5mbworICAgIHN0cnVjdHVyZSBmb3IgdXNlIGJ5IHRoZSAiaW5mbyBwcm9jIiBjb21tYW5kLCBzbyB0aGF0IHdlIGNhbiBwcmludAorICAgIHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCBhbnkgcmFuZG9tIHByb2Nlc3Mgd2l0aG91dCBpbnRlcmZlcmluZyB3aXRoCisgICAgdGhlIGluZmVyaW9yJ3MgcHJvY2luZm8gaW5mb3JtYXRpb24uICovCisKK3N0cnVjdCBwcm9jaW5mbyB7CisgIHN0cnVjdCBwcm9jaW5mbyAqbmV4dDsKKyAgaW50IHBpZDsJCQkvKiBQcm9jZXNzIElEIG9mIGluZmVyaW9yICovCisgIGludCBjdGxfZmQ7CQkJLyogRmlsZSBkZXNjcmlwdG9yIGZvciAvcHJvYyBjdGwgZmlsZSAqLworICBpbnQgc3RhdHVzX2ZkOwkJLyogRmlsZSBkZXNjcmlwdG9yIGZvciAvcHJvYyBzdGF0dXMgZmlsZSAqLworICBpbnQgYXNfZmQ7CQkJLyogRmlsZSBkZXNjcmlwdG9yIGZvciAvcHJvYyBhcyBmaWxlICovCisgIGludCBtYXBfZmQ7CQkJLyogRmlsZSBkZXNjcmlwdG9yIGZvciAvcHJvYyBtYXAgZmlsZSAqLworICBjaGFyICpwYXRobmFtZTsJCS8qIFBhdGhuYW1lIHRvIC9wcm9jIGVudHJ5ICovCisgIGludCBoYWRfZXZlbnQ7CQkvKiBwb2xsL3NlbGVjdCBzYXlzIHNvbWV0aGluZyBoYXBwZW5lZCAqLworICBpbnQgd2FzX3N0b3BwZWQ7CQkvKiBOb256ZXJvIGlmIHdhcyBzdG9wcGVkIHByaW9yIHRvIGF0dGFjaCAqLworICBpbnQgbm9wYXNzX25leHRfc2lnc3RvcDsJLyogRG9uJ3QgcGFzcyBhIHNpZ3N0b3Agb24gbmV4dCByZXN1bWUgKi8KKyNpZmRlZiBIQVZFX1BSUlVOX1QKKyAgcHJydW5fdCBwcnJ1bjsJCS8qIENvbnRyb2wgc3RhdGUgd2hlbiBpdCBpcyBydW4gKi8KKyNlbmRpZgorICBnZGJfcHJzdGF0dXNfdCBwcnN0YXR1czsJLyogQ3VycmVudCBwcm9jZXNzIHN0YXR1cyBpbmZvICovCisgIHN0cnVjdCBncmVnX2N0bCBncmVnc2V0OwkvKiBHZW5lcmFsIHJlZ2lzdGVyIHNldCAqLworICBzdHJ1Y3QgZnByZWdfY3RsIGZwcmVnc2V0OwkvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlciBzZXQgKi8KKyAgc3RydWN0IGZsdF9jdGwgZmx0c2V0OwkvKiBDdXJyZW50IHRyYWNlZCBoYXJkd2FyZSBmYXVsdCBzZXQgKi8KKyAgc3RydWN0IHNpZ19jdGwgdHJhY2U7CQkvKiBDdXJyZW50IHRyYWNlZCBzaWduYWwgc2V0ICovCisgIHN0cnVjdCBzeXNfY3RsIGV4aXRzZXQ7CS8qIEN1cnJlbnQgdHJhY2VkIHN5c3RlbSBjYWxsIGV4aXQgc2V0ICovCisgIHN0cnVjdCBzeXNfY3RsIGVudHJ5c2V0OwkvKiBDdXJyZW50IHRyYWNlZCBzeXN0ZW0gY2FsbCBlbnRyeSBzZXQgKi8KKyAgc3RydWN0IHNpZ19jdGwgc2F2ZWRfc2lnaG9sZDsJLyogU2F2ZWQgaGVsZCBzaWduYWwgc2V0ICovCisgIHN0cnVjdCBmbHRfY3RsIHNhdmVkX2ZsdHNldDsgIC8qIFNhdmVkIHRyYWNlZCBoYXJkd2FyZSBmYXVsdCBzZXQgKi8KKyAgc3RydWN0IHNpZ19jdGwgc2F2ZWRfdHJhY2U7ICAgLyogU2F2ZWQgdHJhY2VkIHNpZ25hbCBzZXQgKi8KKyAgc3RydWN0IHN5c19jdGwgc2F2ZWRfZXhpdHNldDsgLyogU2F2ZWQgdHJhY2VkIHN5c3RlbSBjYWxsIGV4aXQgc2V0ICovCisgIHN0cnVjdCBzeXNfY3RsIHNhdmVkX2VudHJ5c2V0Oy8qIFNhdmVkIHRyYWNlZCBzeXN0ZW0gY2FsbCBlbnRyeSBzZXQgKi8KKyAgaW50IG51bV9zeXNjYWxsX2hhbmRsZXJzOwkvKiBOdW1iZXIgb2Ygc3lzY2FsbCB0cmFwIGhhbmRsZXJzCisJCQkJICAgY3VycmVudGx5IGluc3RhbGxlZCAqLworCQkJCS8qIFBvaW50ZXIgdG8gbGlzdCBvZiBzeXNjYWxsIHRyYXAgaGFuZGxlcnMgKi8KKyAgc3RydWN0IHByb2Nmc19zeXNjYWxsX2hhbmRsZXIgKnN5c2NhbGxfaGFuZGxlcnM7IAorICBpbnQgc2F2ZWRfcnRudmFsOwkJLyogcmV0dXJuIHZhbHVlIGFuZCBzdGF0dXMgZm9yIHdhaXQoKSwgKi8KKyAgaW50IHNhdmVkX3N0YXR2YWw7CQkvKiAgYXMgc3VwcGxpZWQgYnkgYSBzeXNjYWxsIGhhbmRsZXIuICovCisgIGludCBuZXdfY2hpbGQ7CQkvKiBOb24temVybyBpZiBpdCdzIGEgbmV3IHRocmVhZCAqLworfTsKKworLyogTGlzdCBvZiBpbmZlcmlvciBwcm9jZXNzIGluZm9ybWF0aW9uICovCitzdGF0aWMgc3RydWN0IHByb2NpbmZvICpwcm9jaW5mb19saXN0ID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgcG9sbGZkICpwb2xsX2xpc3Q7IC8qIHBvbGxmZHMgdXNlZCBmb3Igd2FpdGluZyBvbiAvcHJvYyAqLworCitzdGF0aWMgaW50IG51bV9wb2xsX2xpc3QgPSAwOwkvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBwb2xsX2xpc3QgKi8KKworLyogIE11Y2ggb2YgdGhlIGluZm9ybWF0aW9uIHVzZWQgaW4gdGhlIC9wcm9jIGludGVyZmFjZSwgcGFydGljdWxhcmx5IGZvcgorICAgIHByaW50aW5nIHN0YXR1cyBpbmZvcm1hdGlvbiwgaXMga2VwdCBhcyB0YWJsZXMgb2Ygc3RydWN0dXJlcyBvZiB0aGUKKyAgICBmb2xsb3dpbmcgZm9ybS4gIFRoZXNlIHRhYmxlcyBjYW4gYmUgdXNlZCB0byBtYXAgbnVtZXJpYyB2YWx1ZXMgdG8KKyAgICB0aGVpciBzeW1ib2xpYyBuYW1lcyBhbmQgdG8gYSBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhlaXIgc3BlY2lmaWMgdXNlLiAqLworCitzdHJ1Y3QgdHJhbnMgeworICBpbnQgdmFsdWU7CQkJLyogVGhlIG51bWVyaWMgdmFsdWUgKi8KKyAgY2hhciAqbmFtZTsJCQkvKiBUaGUgZXF1aXZhbGVudCBzeW1ib2xpYyB2YWx1ZSAqLworICBjaGFyICpkZXNjOwkJCS8qIFNob3J0IGRlc2NyaXB0aW9uIG9mIHZhbHVlICovCit9OworCisvKiAgVHJhbnNsYXRlIGJpdHMgaW4gdGhlIHByX2ZsYWdzIG1lbWJlciBvZiB0aGUgcHJzdGF0dXMgc3RydWN0dXJlLCBpbnRvIHRoZQorICAgIG5hbWVzIGFuZCBkZXNjIGluZm9ybWF0aW9uLiAqLworCitzdGF0aWMgc3RydWN0IHRyYW5zIHByX2ZsYWdfdGFibGVbXSA9Cit7CisjaWYgZGVmaW5lZCAoUFJfU1RPUFBFRCkKKyAgeyBQUl9TVE9QUEVELCAiUFJfU1RPUFBFRCIsICJQcm9jZXNzIGlzIHN0b3BwZWQiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChQUl9JU1RPUCkKKyAgeyBQUl9JU1RPUCwgIlBSX0lTVE9QIiwgIlN0b3BwZWQgb24gYW4gZXZlbnQgb2YgaW50ZXJlc3QiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChQUl9EU1RPUCkKKyAgeyBQUl9EU1RPUCwgIlBSX0RTVE9QIiwgIkEgc3RvcCBkaXJlY3RpdmUgaXMgaW4gZWZmZWN0IiB9LAorI2VuZGlmCisjaWYgZGVmaW5lZCAoUFJfQVNMRUVQKQorICB7IFBSX0FTTEVFUCwgIlBSX0FTTEVFUCIsICJTbGVlcGluZyBpbiBhbiBpbnRlcnJ1cHRpYmxlIHN5c3RlbSBjYWxsIiB9LAorI2VuZGlmCisjaWYgZGVmaW5lZCAoUFJfRk9SSykKKyAgeyBQUl9GT1JLLCAiUFJfRk9SSyIsICJJbmhlcml0LW9uLWZvcmsgaXMgaW4gZWZmZWN0IiB9LAorI2VuZGlmCisjaWYgZGVmaW5lZCAoUFJfUkxDKQorICB7IFBSX1JMQywgIlBSX1JMQyIsICJSdW4tb24tbGFzdC1jbG9zZSBpcyBpbiBlZmZlY3QiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChQUl9QVFJBQ0UpCisgIHsgUFJfUFRSQUNFLCAiUFJfUFRSQUNFIiwgIlByb2Nlc3MgaXMgYmVpbmcgY29udHJvbGxlZCBieSBwdHJhY2UiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChQUl9QQ0lOVkFMKQorICB7IFBSX1BDSU5WQUwsICJQUl9QQ0lOVkFMIiwgIlBDIHJlZmVycyB0byBhbiBpbnZhbGlkIHZpcnR1YWwgYWRkcmVzcyIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFBSX0lTU1lTKQorICB7IFBSX0lTU1lTLCAiUFJfSVNTWVMiLCAiSXMgYSBzeXN0ZW0gcHJvY2VzcyIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFBSX1NURVApCisgIHsgUFJfU1RFUCwgIlBSX1NURVAiLCAiUHJvY2VzcyBoYXMgc2luZ2xlIHN0ZXAgcGVuZGluZyIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFBSX0tMQykKKyAgeyBQUl9LTEMsICJQUl9LTEMiLCAiS2lsbC1vbi1sYXN0LWNsb3NlIGlzIGluIGVmZmVjdCIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFBSX0FTWU5DKQorICB7IFBSX0FTWU5DLCAiUFJfQVNZTkMiLCAiQXN5bmNocm9ub3VzIHN0b3AgaXMgaW4gZWZmZWN0IiB9LAorI2VuZGlmCisjaWYgZGVmaW5lZCAoUFJfUENPTVBBVCkKKyAgeyBQUl9QQ09NUEFULCAiUFJfUENPTVBBVCIsICJQdHJhY2UgY29tcGF0aWJpbGl0eSBtb2RlIGluIGVmZmVjdCIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFBSX01TQUNDVCkKKyAgeyBQUl9NU0FDQ1QsICJQUl9NU0FDQ1QiLCAiTWljcm9zdGF0ZSBhY2NvdW50aW5nIGVuYWJsZWQiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChQUl9CUFRBREopCisgIHsgUFJfQlBUQURKLCAiUFJfQlBUQURKIiwgIkJyZWFrcG9pbnQgUEMgYWRqdXN0bWVudCBpbiBlZmZlY3QiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChQUl9BU0xXUCkKKyAgeyBQUl9BU0xXUCwgIlBSX0FTTFdQIiwgIkFzeW5jaHJvbnVzIHNpZ25hbCBMV1AiIH0sCisjZW5kaWYKKyAgeyAwLCBOVUxMLCBOVUxMIH0KK307CisKKy8qICBUcmFuc2xhdGUgdmFsdWVzIGluIHRoZSBwcl93aHkgZmllbGQgb2YgdGhlIHByc3RhdHVzIHN0cnVjdC4gKi8KKworc3RhdGljIHN0cnVjdCB0cmFucyBwcl93aHlfdGFibGVbXSA9Cit7CisjaWYgZGVmaW5lZCAoUFJfUkVRVUVTVEVEKQorICB7IFBSX1JFUVVFU1RFRCwgIlBSX1JFUVVFU1RFRCIsICJEaXJlY3RlZCB0byBzdG9wIHZpYSBQSU9DU1RPUC9QSU9DV1NUT1AiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChQUl9TSUdOQUxMRUQpCisgIHsgUFJfU0lHTkFMTEVELCAiUFJfU0lHTkFMTEVEIiwgIlJlY2VpcHQgb2YgYSB0cmFjZWQgc2lnbmFsIiB9LAorI2VuZGlmCisjaWYgZGVmaW5lZCAoUFJfU1lTRU5UUlkpCisgIHsgUFJfU1lTRU5UUlksICJQUl9TWVNFTlRSWSIsICJFbnRyeSB0byBhIHRyYWNlZCBzeXN0ZW0gY2FsbCIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFBSX1NZU0VYSVQpCisgIHsgUFJfU1lTRVhJVCwgIlBSX1NZU0VYSVQiLCAiRXhpdCBmcm9tIGEgdHJhY2VkIHN5c3RlbSBjYWxsIiB9LAorI2VuZGlmCisjaWYgZGVmaW5lZCAoUFJfSk9CQ09OVFJPTCkKKyAgeyBQUl9KT0JDT05UUk9MLCAiUFJfSk9CQ09OVFJPTCIsICJEZWZhdWx0IGpvYiBjb250cm9sIHN0b3Agc2lnbmFsIGFjdGlvbiIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFBSX0ZBVUxURUQpCisgIHsgUFJfRkFVTFRFRCwgIlBSX0ZBVUxURUQiLCAiSW5jdXJyZWQgYSB0cmFjZWQgaGFyZHdhcmUgZmF1bHQiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChQUl9TVVNQRU5ERUQpCisgIHsgUFJfU1VTUEVOREVELCAiUFJfU1VTUEVOREVEIiwgIlByb2Nlc3Mgc3VzcGVuZGVkIiB9LAorI2VuZGlmCisjaWYgZGVmaW5lZCAoUFJfQ0hFQ0tQT0lOVCkKKyAgeyBQUl9DSEVDS1BPSU5ULCAiUFJfQ0hFQ0tQT0lOVCIsICIoPz8/KSIgfSwKKyNlbmRpZgorICB7IDAsIE5VTEwsIE5VTEwgfQorfTsKKworLyogIEhhcmR3YXJlIGZhdWx0IHRyYW5zbGF0aW9uIHRhYmxlLiAqLworCitzdGF0aWMgc3RydWN0IHRyYW5zIGZhdWx0c190YWJsZVtdID0KK3sKKyNpZiBkZWZpbmVkIChGTFRJTEwpCisgIHsgRkxUSUxMLCAiRkxUSUxMIiwgIklsbGVnYWwgaW5zdHJ1Y3Rpb24iIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChGTFRQUklWKQorICB7IEZMVFBSSVYsICJGTFRQUklWIiwgIlByaXZpbGVnZWQgaW5zdHJ1Y3Rpb24iIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChGTFRCUFQpCisgIHsgRkxUQlBULCAiRkxUQlBUIiwgIkJyZWFrcG9pbnQgdHJhcCIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEZMVFRSQUNFKQorICB7IEZMVFRSQUNFLCAiRkxUVFJBQ0UiLCAiVHJhY2UgdHJhcCIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEZMVEFDQ0VTUykKKyAgeyBGTFRBQ0NFU1MsICJGTFRBQ0NFU1MiLCAiTWVtb3J5IGFjY2VzcyBmYXVsdCIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEZMVEJPVU5EUykKKyAgeyBGTFRCT1VORFMsICJGTFRCT1VORFMiLCAiTWVtb3J5IGJvdW5kcyB2aW9sYXRpb24iIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChGTFRJT1ZGKQorICB7IEZMVElPVkYsICJGTFRJT1ZGIiwgIkludGVnZXIgb3ZlcmZsb3ciIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChGTFRJWkRJVikKKyAgeyBGTFRJWkRJViwgIkZMVElaRElWIiwgIkludGVnZXIgemVybyBkaXZpZGUiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChGTFRGUEUpCisgIHsgRkxURlBFLCAiRkxURlBFIiwgIkZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEZMVFNUQUNLKQorICB7IEZMVFNUQUNLLCAiRkxUU1RBQ0siLCAiVW5yZWNvdmVyYWJsZSBzdGFjayBmYXVsdCIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKEZMVFBBR0UpCisgIHsgRkxUUEFHRSwgIkZMVFBBR0UiLCAiUmVjb3ZlcmFibGUgcGFnZSBmYXVsdCIgfSwKKyNlbmRpZgorICB7IDAsIE5VTEwsIE5VTEwgfQorfTsKKworLyogVHJhbnNsYXRpb24gdGFibGUgZm9yIHNpZ25hbCBnZW5lcmF0aW9uIGluZm9ybWF0aW9uLiAgU2VlIFVOSVggU3lzdGVtCisgICBWIFJlbGVhc2UgNCBQcm9ncmFtbWVyJ3MgUmVmZXJlbmNlIE1hbnVhbCwgc2lnaW5mbyg1KS4gICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2lnY29kZSB7CisgIGludCBzaWdubzsKKyAgaW50IGNvZGU7CisgIGNoYXIgKmNvZGVuYW1lOworICBjaGFyICpkZXNjOworfSBzaWdpbmZvX3RhYmxlW10gPSB7CisjaWYgZGVmaW5lZCAoU0lHSUxMKSAmJiBkZWZpbmVkIChJTExfSUxMT1BDKQorICB7IFNJR0lMTCwgSUxMX0lMTE9QQywgIklMTF9JTExPUEMiLCAiSWxsZWdhbCBvcGNvZGUiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdJTEwpICYmIGRlZmluZWQgKElMTF9JTExPUE4pCisgIHsgU0lHSUxMLCBJTExfSUxMT1BOLCAiSUxMX0lMTE9QTiIsICJJbGxlZ2FsIG9wZXJhbmQiLCB9LAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHSUxMKSAmJiBkZWZpbmVkIChJTExfSUxMQURSKQorICB7IFNJR0lMTCwgSUxMX0lMTEFEUiwgIklMTF9JTExBRFIiLCAiSWxsZWdhbCBhZGRyZXNzaW5nIG1vZGUiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdJTEwpICYmIGRlZmluZWQgKElMTF9JTExUUlApCisgIHsgU0lHSUxMLCBJTExfSUxMVFJQLCAiSUxMX0lMTFRSUCIsICJJbGxlZ2FsIHRyYXAiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdJTEwpICYmIGRlZmluZWQgKElMTF9QUlZPUEMpCisgIHsgU0lHSUxMLCBJTExfUFJWT1BDLCAiSUxMX1BSVk9QQyIsICJQcml2aWxlZ2VkIG9wY29kZSIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0lMTCkgJiYgZGVmaW5lZCAoSUxMX1BSVlJFRykKKyAgeyBTSUdJTEwsIElMTF9QUlZSRUcsICJJTExfUFJWUkVHIiwgIlByaXZpbGVnZWQgcmVnaXN0ZXIiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdJTEwpICYmIGRlZmluZWQgKElMTF9DT1BST0MpCisgIHsgU0lHSUxMLCBJTExfQ09QUk9DLCAiSUxMX0NPUFJPQyIsICJDb3Byb2Nlc3NvciBlcnJvciIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0lMTCkgJiYgZGVmaW5lZCAoSUxMX0JBRFNUSykKKyAgeyBTSUdJTEwsIElMTF9CQURTVEssICJJTExfQkFEU1RLIiwgIkludGVybmFsIHN0YWNrIGVycm9yIiB9LAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHRlBFKSAmJiBkZWZpbmVkIChGUEVfSU5URElWKQorICB7IFNJR0ZQRSwgRlBFX0lOVERJViwgIkZQRV9JTlRESVYiLCAiSW50ZWdlciBkaXZpZGUgYnkgemVybyIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0ZQRSkgJiYgZGVmaW5lZCAoRlBFX0lOVE9WRikKKyAgeyBTSUdGUEUsIEZQRV9JTlRPVkYsICJGUEVfSU5UT1ZGIiwgIkludGVnZXIgb3ZlcmZsb3ciIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdGUEUpICYmIGRlZmluZWQgKEZQRV9GTFRESVYpCisgIHsgU0lHRlBFLCBGUEVfRkxURElWLCAiRlBFX0ZMVERJViIsICJGbG9hdGluZyBwb2ludCBkaXZpZGUgYnkgemVybyIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0ZQRSkgJiYgZGVmaW5lZCAoRlBFX0ZMVE9WRikKKyAgeyBTSUdGUEUsIEZQRV9GTFRPVkYsICJGUEVfRkxUT1ZGIiwgIkZsb2F0aW5nIHBvaW50IG92ZXJmbG93IiB9LAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHRlBFKSAmJiBkZWZpbmVkIChGUEVfRkxUVU5EKQorICB7IFNJR0ZQRSwgRlBFX0ZMVFVORCwgIkZQRV9GTFRVTkQiLCAiRmxvYXRpbmcgcG9pbnQgdW5kZXJmbG93IiB9LAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHRlBFKSAmJiBkZWZpbmVkIChGUEVfRkxUUkVTKQorICB7IFNJR0ZQRSwgRlBFX0ZMVFJFUywgIkZQRV9GTFRSRVMiLCAiRmxvYXRpbmcgcG9pbnQgaW5leGFjdCByZXN1bHQiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdGUEUpICYmIGRlZmluZWQgKEZQRV9GTFRJTlYpCisgIHsgU0lHRlBFLCBGUEVfRkxUSU5WLCAiRlBFX0ZMVElOViIsICJJbnZhbGlkIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbiIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0ZQRSkgJiYgZGVmaW5lZCAoRlBFX0ZMVFNVQikKKyAgeyBTSUdGUEUsIEZQRV9GTFRTVUIsICJGUEVfRkxUU1VCIiwgIlN1YnNjcmlwdCBvdXQgb2YgcmFuZ2UiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdTRUdWKSAmJiBkZWZpbmVkIChTRUdWX01BUEVSUikKKyAgeyBTSUdTRUdWLCBTRUdWX01BUEVSUiwgIlNFR1ZfTUFQRVJSIiwgIkFkZHJlc3Mgbm90IG1hcHBlZCB0byBvYmplY3QiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdTRUdWKSAmJiBkZWZpbmVkIChTRUdWX0FDQ0VSUikKKyAgeyBTSUdTRUdWLCBTRUdWX0FDQ0VSUiwgIlNFR1ZfQUNDRVJSIiwgIkludmFsaWQgcGVybWlzc2lvbnMgZm9yIG9iamVjdCIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0JVUykgJiYgZGVmaW5lZCAoQlVTX0FEUkFMTikKKyAgeyBTSUdCVVMsIEJVU19BRFJBTE4sICJCVVNfQURSQUxOIiwgIkludmFsaWQgYWRkcmVzcyBhbGlnbm1lbnQiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdCVVMpICYmIGRlZmluZWQgKEJVU19BRFJFUlIpCisgIHsgU0lHQlVTLCBCVVNfQURSRVJSLCAiQlVTX0FEUkVSUiIsICJOb24tZXhpc3RlbnQgcGh5c2ljYWwgYWRkcmVzcyIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0JVUykgJiYgZGVmaW5lZCAoQlVTX09CSkVSUikKKyAgeyBTSUdCVVMsIEJVU19PQkpFUlIsICJCVVNfT0JKRVJSIiwgIk9iamVjdCBzcGVjaWZpYyBoYXJkd2FyZSBlcnJvciIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1RSQVApICYmIGRlZmluZWQgKFRSQVBfQlJLUFQpCisgIHsgU0lHVFJBUCwgVFJBUF9CUktQVCwgIlRSQVBfQlJLUFQiLCAiUHJvY2VzcyBicmVha3BvaW50IiB9LAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHVFJBUCkgJiYgZGVmaW5lZCAoVFJBUF9UUkFDRSkKKyAgeyBTSUdUUkFQLCBUUkFQX1RSQUNFLCAiVFJBUF9UUkFDRSIsICJQcm9jZXNzIHRyYWNlIHRyYXAiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdDTEQpICYmIGRlZmluZWQgKENMRF9FWElURUQpCisgIHsgU0lHQ0xELCBDTERfRVhJVEVELCAiQ0xEX0VYSVRFRCIsICJDaGlsZCBoYXMgZXhpdGVkIiB9LAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHQ0xEKSAmJiBkZWZpbmVkIChDTERfS0lMTEVEKQorICB7IFNJR0NMRCwgQ0xEX0tJTExFRCwgIkNMRF9LSUxMRUQiLCAiQ2hpbGQgd2FzIGtpbGxlZCIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0NMRCkgJiYgZGVmaW5lZCAoQ0xEX0RVTVBFRCkKKyAgeyBTSUdDTEQsIENMRF9EVU1QRUQsICJDTERfRFVNUEVEIiwgIkNoaWxkIGhhcyB0ZXJtaW5hdGVkIGFibm9ybWFsbHkiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdDTEQpICYmIGRlZmluZWQgKENMRF9UUkFQUEVEKQorICB7IFNJR0NMRCwgQ0xEX1RSQVBQRUQsICJDTERfVFJBUFBFRCIsICJUcmFjZWQgY2hpbGQgaGFzIHRyYXBwZWQiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdDTEQpICYmIGRlZmluZWQgKENMRF9TVE9QUEVEKQorICB7IFNJR0NMRCwgQ0xEX1NUT1BQRUQsICJDTERfU1RPUFBFRCIsICJDaGlsZCBoYXMgc3RvcHBlZCIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0NMRCkgJiYgZGVmaW5lZCAoQ0xEX0NPTlRJTlVFRCkKKyAgeyBTSUdDTEQsIENMRF9DT05USU5VRUQsICJDTERfQ09OVElOVUVEIiwgIlN0b3BwZWQgY2hpbGQgaGFkIGNvbnRpbnVlZCIgfSwKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1BPTEwpICYmIGRlZmluZWQgKFBPTExfSU4pCisgIHsgU0lHUE9MTCwgUE9MTF9JTiwgIlBPTExfSU4iLCAiSW5wdXQgaW5wdXQgYXZhaWxhYmxlIiB9LAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHUE9MTCkgJiYgZGVmaW5lZCAoUE9MTF9PVVQpCisgIHsgU0lHUE9MTCwgUE9MTF9PVVQsICJQT0xMX09VVCIsICJPdXRwdXQgYnVmZmVycyBhdmFpbGFibGUiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdQT0xMKSAmJiBkZWZpbmVkIChQT0xMX01TRykKKyAgeyBTSUdQT0xMLCBQT0xMX01TRywgIlBPTExfTVNHIiwgIklucHV0IG1lc3NhZ2UgYXZhaWxhYmxlIiB9LAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHUE9MTCkgJiYgZGVmaW5lZCAoUE9MTF9FUlIpCisgIHsgU0lHUE9MTCwgUE9MTF9FUlIsICJQT0xMX0VSUiIsICJJL08gZXJyb3IiIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdQT0xMKSAmJiBkZWZpbmVkIChQT0xMX1BSSSkKKyAgeyBTSUdQT0xMLCBQT0xMX1BSSSwgIlBPTExfUFJJIiwgIkhpZ2ggcHJpb3JpdHkgaW5wdXQgYXZhaWxhYmxlIiB9LAorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHUE9MTCkgJiYgZGVmaW5lZCAoUE9MTF9IVVApCisgIHsgU0lHUE9MTCwgUE9MTF9IVVAsICJQT0xMX0hVUCIsICJEZXZpY2UgZGlzY29ubmVjdGVkIiB9LAorI2VuZGlmCisgIHsgMCwgMCwgTlVMTCwgTlVMTCB9Cit9OworCitzdGF0aWMgY2hhciAqc3lzY2FsbF90YWJsZVtNQVhfU1lTQ0FMTFNdOworCisvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMgKi8KKworc3RhdGljIHZvaWQgcHJvY2ZzX3N0b3AgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgaW50IHByb2Nmc190aHJlYWRfYWxpdmUgUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyBpbnQgcHJvY2ZzX2Nhbl9ydW4gUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZCBwcm9jZnNfbW91cm5faW5mZXJpb3IgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZCBwcm9jZnNfZmV0Y2hfcmVnaXN0ZXJzIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgaW50IHByb2Nmc193YWl0IFBBUkFNUyAoKGludCwgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICopKTsKKworc3RhdGljIHZvaWQgcHJvY2ZzX29wZW4gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgcHJvY2ZzX2ZpbGVzX2luZm8gUEFSQU1TICgoc3RydWN0IHRhcmdldF9vcHMgKikpOworCitzdGF0aWMgdm9pZCBwcm9jZnNfcHJlcGFyZV90b19zdG9yZSBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIHByb2Nmc19kZXRhY2ggUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgcHJvY2ZzX2F0dGFjaCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBwcm9jX3NldF9leGVjX3RyYXAgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZCAgcHJvY2ZzX2luaXRfaW5mZXJpb3IgUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY2luZm8gKmNyZWF0ZV9wcm9jaW5mbyBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIHZvaWQgcHJvY2ZzX3N0b3JlX3JlZ2lzdGVycyBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIGludCBwcm9jZnNfeGZlcl9tZW1vcnkgUEFSQU1TICgoQ09SRV9BRERSLCBjaGFyICosIGludCwgaW50LCBzdHJ1Y3QgdGFyZ2V0X29wcyAqKSk7CisKK3N0YXRpYyB2b2lkIHByb2Nmc19raWxsX2luZmVyaW9yIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIGNoYXIgKnNpZ2NvZGVkZXNjIFBBUkFNUyAoKHNpZ2luZm9fdCAqKSk7CisKK3N0YXRpYyBjaGFyICpzaWdjb2RlbmFtZSBQQVJBTVMgKChzaWdpbmZvX3QgKikpOworCitzdGF0aWMgc3RydWN0IHByb2NpbmZvICp3YWl0X2ZkIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQgcmVtb3ZlX2ZkIFBBUkFNUyAoKHN0cnVjdCBwcm9jaW5mbyAqKSk7CisKK3N0YXRpYyB2b2lkIGFkZF9mZCBQQVJBTVMgKChzdHJ1Y3QgcHJvY2luZm8gKikpOworCitzdGF0aWMgdm9pZCBzZXRfcHJvY19zaWdpbmZvIFBBUkFNUyAoKHN0cnVjdCBwcm9jaW5mbyAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgaW5pdF9zeXNjYWxsX3RhYmxlIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIGNoYXIgKnN5c2NhbGxuYW1lIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgY2hhciAqc2lnbmFsbmFtZSBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIGNoYXIgKmVycm5vbmFtZSBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIGludCBwcm9jX2FkZHJlc3NfdG9fZmQgUEFSQU1TICgoc3RydWN0IHByb2NpbmZvICosIENPUkVfQUREUiwgaW50KSk7CisKK3N0YXRpYyBpbnQgb3Blbl9wcm9jX2ZpbGUgUEFSQU1TICgoaW50LCBzdHJ1Y3QgcHJvY2luZm8gKiwgaW50LCBpbnQpKTsKKworc3RhdGljIHZvaWQgY2xvc2VfcHJvY19maWxlIFBBUkFNUyAoKHN0cnVjdCBwcm9jaW5mbyAqKSk7CisKK3N0YXRpYyB2b2lkIHVuY29uZGl0aW9uYWxseV9raWxsX2luZmVyaW9yIFBBUkFNUyAoKHN0cnVjdCBwcm9jaW5mbyAqKSk7CisKK3N0YXRpYyBOT1JFVFVSTiB2b2lkIHByb2NfaW5pdF9mYWlsZWQgUEFSQU1TICgoc3RydWN0IHByb2NpbmZvICosIGNoYXIgKiwgaW50KSkgQVRUUl9OT1JFVFVSTjsKKworc3RhdGljIHZvaWQgaW5mb19wcm9jIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGluZm9fcHJvY19mbGFncyBQQVJBTVMgKChzdHJ1Y3QgcHJvY2luZm8gKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGluZm9fcHJvY19zdG9wIFBBUkFNUyAoKHN0cnVjdCBwcm9jaW5mbyAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgaW5mb19wcm9jX3NpZ2luZm8gUEFSQU1TICgoc3RydWN0IHByb2NpbmZvICosIGludCkpOworCitzdGF0aWMgdm9pZCBpbmZvX3Byb2Nfc3lzY2FsbHMgUEFSQU1TICgoc3RydWN0IHByb2NpbmZvICosIGludCkpOworCitzdGF0aWMgdm9pZCBpbmZvX3Byb2NfbWFwcGluZ3MgUEFSQU1TICgoc3RydWN0IHByb2NpbmZvICosIGludCkpOworCitzdGF0aWMgdm9pZCBpbmZvX3Byb2Nfc2lnbmFscyBQQVJBTVMgKChzdHJ1Y3QgcHJvY2luZm8gKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGluZm9fcHJvY19mYXVsdHMgUEFSQU1TICgoc3RydWN0IHByb2NpbmZvICosIGludCkpOworCitzdGF0aWMgY2hhciAqbWFwcGluZ2ZsYWdzIFBBUkFNUyAoKGxvbmcpKTsKKworc3RhdGljIGNoYXIgKmxvb2t1cG5hbWUgUEFSQU1TICgoc3RydWN0IHRyYW5zICosIHVuc2lnbmVkIGludCwgY2hhciAqKSk7CisKK3N0YXRpYyBjaGFyICpsb29rdXBkZXNjIFBBUkFNUyAoKHN0cnVjdCB0cmFucyAqLCB1bnNpZ25lZCBpbnQpKTsKKworc3RhdGljIGludCBkb19hdHRhY2ggUEFSQU1TICgoaW50IHBpZCkpOworCitzdGF0aWMgdm9pZCBkb19kZXRhY2ggUEFSQU1TICgoaW50IHNpZ2duYWwpKTsKKworc3RhdGljIHZvaWQgcHJvY2ZzX2NyZWF0ZV9pbmZlcmlvciBQQVJBTVMgKChjaGFyICosIGNoYXIgKiwgY2hhciAqKikpOworCitzdGF0aWMgdm9pZCBwcm9jZnNfbm90aWNlX3NpZ25hbHMgUEFSQU1TICgoaW50IHBpZCkpOworCitzdGF0aWMgdm9pZCBub3RpY2Vfc2lnbmFscyBQQVJBTVMgKChzdHJ1Y3QgcHJvY2luZm8gKiwgc3RydWN0IHNpZ19jdGwgKikpOworCitzdGF0aWMgc3RydWN0IHByb2NpbmZvICpmaW5kX3Byb2NpbmZvIFBBUkFNUyAoKHBpZF90IHBpZCwgaW50IG9rZmFpbCkpOworCitzdGF0aWMgaW50IHByb2Nmc193cml0ZV9wY3dzdG9wIFBBUkFNUyAoKHN0cnVjdCBwcm9jaW5mbyAqKSk7CitzdGF0aWMgaW50IHByb2Nmc19yZWFkX3N0YXR1cyBQQVJBTVMgKChzdHJ1Y3QgcHJvY2luZm8gKikpOworc3RhdGljIHZvaWQgcHJvY2ZzX3dyaXRlX3Bja2lsbCBQQVJBTVMgKChzdHJ1Y3QgcHJvY2luZm8gKikpOworCit0eXBlZGVmIGludCBzeXNjYWxsX2Z1bmNfdCBQQVJBTVMgKChzdHJ1Y3QgcHJvY2luZm8gKnBpLCBpbnQgc3lzY2FsbF9udW0sCisJCQkJICAgIGludCB3aHksIGludCAqcnRudmFsLCBpbnQgKnN0YXR2YWwpKTsKKworc3RhdGljIHZvaWQgcHJvY2ZzX3NldF9zeXNjYWxsX3RyYXAgUEFSQU1TICgoc3RydWN0IHByb2NpbmZvICpwaSwKKwkJCQkJICAgICBpbnQgc3lzY2FsbF9udW0sIGludCBmbGFncywKKwkJCQkJICAgICBzeXNjYWxsX2Z1bmNfdCAqZnVuYykpOworCitzdGF0aWMgdm9pZCBwcm9jZnNfY2xlYXJfc3lzY2FsbF90cmFwIFBBUkFNUyAoKHN0cnVjdCBwcm9jaW5mbyAqcGksCisJCQkJCSAgICAgICBpbnQgc3lzY2FsbF9udW0sIGludCBlcnJvaykpOworCisjZGVmaW5lIFBST0NGU19TWVNDQUxMX0VOVFJZIDB4MSAvKiBUcmFwIG9uIGVudHJ5IHRvIHN5cyBjYWxsICovCisjZGVmaW5lIFBST0NGU19TWVNDQUxMX0VYSVQgMHgyCS8qIFRyYXAgb24gZXhpdCBmcm9tIHN5cyBjYWxsICovCisKK3N0YXRpYyBzeXNjYWxsX2Z1bmNfdCBwcm9jZnNfZXhpdF9oYW5kbGVyOworCitzdGF0aWMgc3lzY2FsbF9mdW5jX3QgcHJvY2ZzX2V4ZWNfaGFuZGxlcjsKKworI2lmZGVmIFNZU19zcHJvYworc3RhdGljIHN5c2NhbGxfZnVuY190IHByb2Nmc19zcHJvY19oYW5kbGVyOworc3RhdGljIHN5c2NhbGxfZnVuY190IHByb2Nmc19mb3JrX2hhbmRsZXI7CisjZW5kaWYKKworI2lmZGVmIFNZU19sd3BfY3JlYXRlCitzdGF0aWMgc3lzY2FsbF9mdW5jX3QgcHJvY2ZzX2x3cF9jcmVhdGlvbl9oYW5kbGVyOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIG1vZGlmeV9pbmhlcml0X29uX2ZvcmtfZmxhZyBQQVJBTVMgKChpbnQgZmQsIGludCBmbGFnKSk7CitzdGF0aWMgdm9pZCBtb2RpZnlfcnVuX29uX2xhc3RfY2xvc2VfZmxhZyBQQVJBTVMgKChpbnQgZmQsIGludCBmbGFnKSk7CisKKy8qICovCisKK3N0cnVjdCBwcm9jZnNfc3lzY2FsbF9oYW5kbGVyCit7CisgIGludCBzeXNjYWxsX251bTsJCS8qIFRoZSBudW1iZXIgb2YgdGhlIHN5c3RlbSBjYWxsIGJlaW5nIGhhbmRsZWQgKi8KKwkJCQkvKiBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkICovCisgIHN5c2NhbGxfZnVuY190ICpmdW5jOworfTsKKworc3RhdGljIHZvaWQgcHJvY2ZzX3Jlc3VtZSBQQVJBTVMgKChpbnQgcGlkLCBpbnQgc3RlcCwKKwkJCQkgICBlbnVtIHRhcmdldF9zaWduYWwgc2lnbm8pKTsKKworc3RhdGljIHZvaWQgaW5pdF9wcm9jZnNfb3BzIFBBUkFNUyAoKHZvaWQpKTsKKworLyogRXh0ZXJuYWwgZnVuY3Rpb24gcHJvdG90eXBlcyB0aGF0IGNhbid0IGJlIGVhc2lseSBpbmNsdWRlZCBpbiBhbnkKKyAgIGhlYWRlciBmaWxlIGJlY2F1c2UgdGhlIGFyZ3MgYXJlIHR5cGVkZWZzIGluIHN5c3RlbSBpbmNsdWRlIGZpbGVzLiAqLworCitleHRlcm4gdm9pZCBzdXBwbHlfZ3JlZ3NldCBQQVJBTVMgKChnZGJfZ3JlZ3NldF90ICopKTsKKworZXh0ZXJuIHZvaWQgZmlsbF9ncmVnc2V0IFBBUkFNUyAoKGdkYl9ncmVnc2V0X3QgKiwgaW50KSk7CisKKyNpZmRlZiBGUDBfUkVHTlVNCitleHRlcm4gdm9pZCBzdXBwbHlfZnByZWdzZXQgUEFSQU1TICgoZ2RiX2ZwcmVnc2V0X3QgKikpOworCitleHRlcm4gdm9pZCBmaWxsX2ZwcmVnc2V0IFBBUkFNUyAoKGdkYl9mcHJlZ3NldF90ICosIGludCkpOworI2VuZGlmCisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlmaW5kX3Byb2NpbmZvIC0tIGNvbnZlcnQgYSBwcm9jZXNzIGlkIHRvIGEgc3RydWN0IHByb2NpbmZvCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgc3RydWN0IHByb2NpbmZvICogZmluZF9wcm9jaW5mbyAocGlkX3QgcGlkLCBpbnQgb2tmYWlsKTsKKworREVTQ1JJUFRJT04KKwkKKwlHaXZlbiBhIHByb2Nlc3MgaWQsIGxvb2sgaXQgdXAgaW4gdGhlIHByb2NpbmZvIGNoYWluLiAgUmV0dXJucworCWEgc3RydWN0IHByb2NpbmZvICouICBJZiBjYW4ndCBmaW5kIHBpZCwgdGhlbiBjYWxsIGVycm9yKCksCisJdW5sZXNzIG9rZmFpbCBpcyBzZXQsIGluIHdoaWNoIGNhc2UsIHJldHVybiBOVUxMOworICovCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY2luZm8gKgorZmluZF9wcm9jaW5mbyAocGlkLCBva2ZhaWwpCisgICAgIHBpZF90IHBpZDsKKyAgICAgaW50IG9rZmFpbDsKK3sKKyAgc3RydWN0IHByb2NpbmZvICpwcm9jaW5mbzsKKworICBmb3IgKHByb2NpbmZvID0gcHJvY2luZm9fbGlzdDsgcHJvY2luZm87IHByb2NpbmZvID0gcHJvY2luZm8tPm5leHQpCisgICAgaWYgKHByb2NpbmZvLT5waWQgPT0gcGlkKQorICAgICAgcmV0dXJuIHByb2NpbmZvOworCisgIGlmIChva2ZhaWwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZXJyb3IgKCJwcm9jZnMgKGZpbmRfcHJvY2luZm8pOiAgQ291bGRuJ3QgbG9jYXRlIHBpZCAlZCIsIHBpZCk7Cit9CisKKy8qCisKK0xPQ0FMIE1BQ1JPCisKKwljdXJyZW50X3Byb2NpbmZvIC0tIGNvbnZlcnQgaW5mZXJpb3JfcGlkIHRvIGEgc3RydWN0IHByb2NpbmZvCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgc3RydWN0IHByb2NpbmZvICogY3VycmVudF9wcm9jaW5mbzsKKworREVTQ1JJUFRJT04KKwkKKwlMb29rcyB1cCBpbmZlcmlvcl9waWQgaW4gdGhlIHByb2NpbmZvIGNoYWluLiAgQWx3YXlzIHJldHVybnMgYQorCXN0cnVjdCBwcm9jaW5mbyAqLiAgSWYgcHJvY2VzcyBjYW4ndCBiZSBmb3VuZCwgd2UgZXJyb3IoKSBvdXQuCisgKi8KKworI2RlZmluZSBjdXJyZW50X3Byb2NpbmZvIGZpbmRfcHJvY2luZm8gKGluZmVyaW9yX3BpZCwgMCkKKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWFkZF9mZCAtLSBBZGQgdGhlIGZkIHRvIHRoZSBwb2xsL3NlbGVjdCBsaXN0CisKK1NZTk9QU0lTCisKKwlzdGF0aWMgdm9pZCBhZGRfZmQgKHN0cnVjdCBwcm9jaW5mbyAqKTsKKworREVTQ1JJUFRJT04KKwkKKwlBZGQgdGhlIGZkIG9mIHRoZSBzdXBwbGllZCBwcm9jaW5mbyB0byB0aGUgbGlzdCBvZiBmZHMgdXNlZCBmb3IKKwlwb2xsL3NlbGVjdCBvcGVyYXRpb25zLgorICovCisKK3N0YXRpYyB2b2lkCithZGRfZmQgKHBpKQorICAgICBzdHJ1Y3QgcHJvY2luZm8gKnBpOworeworICBpZiAobnVtX3BvbGxfbGlzdCA8PSAwKQorICAgIHBvbGxfbGlzdCA9IChzdHJ1Y3QgcG9sbGZkICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHBvbGxmZCkpOworICBlbHNlCisgICAgcG9sbF9saXN0ID0gKHN0cnVjdCBwb2xsZmQgKikgeHJlYWxsb2MgKHBvbGxfbGlzdCwKKwkJCQkJICAgIChudW1fcG9sbF9saXN0ICsgMSkKKwkJCQkJICAgICogc2l6ZW9mIChzdHJ1Y3QgcG9sbGZkKSk7CisgIHBvbGxfbGlzdFtudW1fcG9sbF9saXN0XS5mZCA9IHBpLT5jdGxfZmQ7CisjaWZkZWYgVU5JWFdBUkUKKyAgcG9sbF9saXN0W251bV9wb2xsX2xpc3RdLmV2ZW50cyA9IFBPTExXUk5PUk07CisjZWxzZQorICBwb2xsX2xpc3RbbnVtX3BvbGxfbGlzdF0uZXZlbnRzID0gUE9MTFBSSTsKKyNlbmRpZgorCisgIG51bV9wb2xsX2xpc3QrKzsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCXJlbW92ZV9mZCAtLSBSZW1vdmUgdGhlIGZkIGZyb20gdGhlIHBvbGwvc2VsZWN0IGxpc3QKKworU1lOT1BTSVMKKworCXN0YXRpYyB2b2lkIHJlbW92ZV9mZCAoc3RydWN0IHByb2NpbmZvICopOworCitERVNDUklQVElPTgorCQorCVJlbW92ZSB0aGUgZmQgb2YgdGhlIHN1cHBsaWVkIHByb2NpbmZvIGZyb20gdGhlIGxpc3Qgb2YgZmRzIHVzZWQgCisJZm9yIHBvbGwvc2VsZWN0IG9wZXJhdGlvbnMuCisgKi8KKworc3RhdGljIHZvaWQKK3JlbW92ZV9mZCAocGkpCisgICAgIHN0cnVjdCBwcm9jaW5mbyAqcGk7Cit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fcG9sbF9saXN0OyBpKyspCisgICAgeworICAgICAgaWYgKHBvbGxfbGlzdFtpXS5mZCA9PSBwaS0+Y3RsX2ZkKQorCXsKKwkgIGlmIChpICE9IG51bV9wb2xsX2xpc3QgLSAxKQorCSAgICBtZW1jcHkgKHBvbGxfbGlzdCArIGksIHBvbGxfbGlzdCArIGkgKyAxLAorCQkgICAgKG51bV9wb2xsX2xpc3QgLSBpIC0gMSkgKiBzaXplb2YgKHN0cnVjdCBwb2xsZmQpKTsKKworCSAgbnVtX3BvbGxfbGlzdC0tOworCisJICBpZiAobnVtX3BvbGxfbGlzdCA9PSAwKQorCSAgICBmcmVlIChwb2xsX2xpc3QpOworCSAgZWxzZQorCSAgICBwb2xsX2xpc3QgPSAoc3RydWN0IHBvbGxmZCAqKSB4cmVhbGxvYyAocG9sbF9saXN0LAorCQkJCQkJICAgIG51bV9wb2xsX2xpc3QKKwkJCQkJCSAgICAqIHNpemVvZiAoc3RydWN0IHBvbGxmZCkpOworCSAgcmV0dXJuOworCX0KKyAgICB9Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlwcm9jZnNfcmVhZF9zdGF0dXMgLSBnZXQgcHJvY2ZzIGZkIHN0YXR1cworCitTWU5PUFNJUworCisJc3RhdGljIGludCBwcm9jZnNfcmVhZF9zdGF0dXMgKHBpKSBzdHJ1Y3QgcHJvY2luZm8gKnBpOworCitERVNDUklQVElPTgorCQorCUdpdmVuIGEgcG9pbnRlciB0byBhIHByb2NpbmZvIHN0cnVjdCwgZ2V0IHRoZSBzdGF0dXMgb2YKKwl0aGUgc3RhdHVzX2ZkIGluIHRoZSBhcHByb3ByaWF0ZSB3YXkuICBSZXR1cm5zIDAgb24gZmFpbHVyZSwKKwkxIG9uIHN1Y2Nlc3MuCisgKi8KKworc3RhdGljIGludAorcHJvY2ZzX3JlYWRfc3RhdHVzIChwaSkKKyAgc3RydWN0IHByb2NpbmZvICpwaTsKK3sKKyNpZmRlZiBQUk9DRlNfVVNFX1JFQURfV1JJVEUKKyAgIGlmICgobHNlZWsgKHBpLT5zdGF0dXNfZmQsIDAsIFNFRUtfU0VUKSA8IDApIHx8CisgICAgICAgICAgIChyZWFkIChwaS0+c3RhdHVzX2ZkLCAoY2hhciAqKSAmcGktPnByc3RhdHVzLCAKKyAgICAgICAgICAgICBzaXplb2YgKGdkYl9wcnN0YXR1c190KSkgIT0gc2l6ZW9mIChnZGJfcHJzdGF0dXNfdCkpKQorI2Vsc2UKKyAgaWYgKGlvY3RsIChwaS0+c3RhdHVzX2ZkLCBQSU9DU1RBVFVTLCAmcGktPnByc3RhdHVzKSA8IDApCisjZW5kaWYKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHJldHVybiAxOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJcHJvY2ZzX3dyaXRlX3Bjd3N0b3AgLSBzZW5kIGEgUENXU1RPUCB0byBwcm9jZnMgZmQKKworU1lOT1BTSVMKKworCXN0YXRpYyBpbnQgcHJvY2ZzX3dyaXRlX3Bjd3N0b3AgKHBpKSBzdHJ1Y3QgcHJvY2luZm8gKnBpOworCitERVNDUklQVElPTgorCQorCUdpdmVuIGEgcG9pbnRlciB0byBhIHByb2NpbmZvIHN0cnVjdCwgc2VuZCBhIFBDV1NUT1AgdG8KKwl0aGUgY3RsX2ZkIGluIHRoZSBhcHByb3ByaWF0ZSB3YXkuICBSZXR1cm5zIDAgb24gZmFpbHVyZSwKKwkxIG9uIHN1Y2Nlc3MuCisgKi8KKworc3RhdGljIGludAorcHJvY2ZzX3dyaXRlX3Bjd3N0b3AgKHBpKQorICBzdHJ1Y3QgcHJvY2luZm8gKnBpOworeworI2lmZGVmIFBST0NGU19VU0VfUkVBRF9XUklURQorICBsb25nIGNtZCA9IFBDV1NUT1A7CisgIGlmICh3cml0ZSAocGktPmN0bF9mZCwgKGNoYXIgKikgJmNtZCwgc2l6ZW9mIChsb25nKSkgPCAwKQorI2Vsc2UKKyAgaWYgKGlvY3RsIChwaS0+Y3RsX2ZkLCBQSU9DV1NUT1AsICZwaS0+cHJzdGF0dXMpIDwgMCkKKyNlbmRpZgorICAgIHJldHVybiAwOworICBlbHNlCisgICAgcmV0dXJuIDE7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlwcm9jZnNfd3JpdGVfcGNraWxsIC0gc2VuZCBhIGtpbGwgdG8gcHJvY2ZzIGZkCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgdm9pZCBwcm9jZnNfd3JpdGVfcGNraWxsIChwaSkgc3RydWN0IHByb2NpbmZvICpwaTsKKworREVTQ1JJUFRJT04KKwkKKwlHaXZlbiBhIHBvaW50ZXIgdG8gYSBwcm9jaW5mbyBzdHJ1Y3QsIHNlbmQgYSBraWxsIHRvCisJdGhlIGN0bF9mZCBpbiB0aGUgYXBwcm9wcmlhdGUgd2F5LiAgUmV0dXJucyAwIG9uIGZhaWx1cmUsCisJMSBvbiBzdWNjZXNzLgorICovCisKK3N0YXRpYyB2b2lkCitwcm9jZnNfd3JpdGVfcGNraWxsIChwaSkKKyAgc3RydWN0IHByb2NpbmZvICpwaTsKK3sKKyNpZmRlZiBQUk9DRlNfVVNFX1JFQURfV1JJVEUKKyAgc3RydWN0IHByb2NfY3RsIHBjdGw7CisgIHBjdGwuY21kID0gUENLSUxMOworICBwY3RsLmRhdGEgPSBTSUdLSUxMOworICB3cml0ZSAocGktPmN0bF9mZCwgJnBjdGwsIHNpemVvZiAoc3RydWN0IHByb2NfY3RsKSk7CisjZWxzZQorICBpbnQgc2lnbm8gPSBTSUdLSUxMOworICBpb2N0bCAocGktPmN0bF9mZCwgUElPQ0tJTEwsICZzaWdubyk7CisjZW5kaWYKK30KKworc3RhdGljIHN0cnVjdCBwcm9jaW5mbyAqCit3YWl0X2ZkICgpCit7CisgIHN0cnVjdCBwcm9jaW5mbyAqcGksICpuZXh0X3BpOworI2lmbmRlZiBMT1NJTkdfUE9MTAorICBpbnQgbnVtX2ZkczsKKyAgaW50IGk7CisjZW5kaWYKKworICBzZXRfc2lnaW50X3RyYXAgKCk7CS8qIENhdXNlcyBTSUdJTlQgdG8gYmUgcGFzc2VkIG9uIHRvIHRoZQorCQkJICAgYXR0YWNoZWQgcHJvY2Vzcy4gKi8KKyAgc2V0X3NpZ2lvX3RyYXAgKCk7CisKKyB3YWl0X2FnYWluOgorI2lmbmRlZiBMT1NJTkdfUE9MTAorICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBudW1fZmRzID0gcG9sbCAocG9sbF9saXN0LCBudW1fcG9sbF9saXN0LCAtMSk7CisgICAgICBpZiAobnVtX2ZkcyA+IDApCisJYnJlYWs7CisgICAgICBpZiAobnVtX2ZkcyA8IDAgJiYgZXJybm8gPT0gRUlOVFIpCisJY29udGludWU7CisgICAgICBwcmludF9zeXNfZXJybXNnICgicG9sbCBmYWlsZWQiLCBlcnJubyk7CisgICAgICBlcnJvciAoIlBvbGwgZmFpbGVkLCByZXR1cm5lZCAlZCIsIG51bV9mZHMpOworICAgIH0KKyNlbHNlIC8qIExPU0lOR19QT0xMICovCisgIHBpID0gY3VycmVudF9wcm9jaW5mbzsKKworICB3aGlsZSAoIXByb2Nmc193cml0ZV9wY3dzdG9wIChwaSkpCisgICAgeworICAgICAgaWYgKGVycm5vID09IEVOT0VOVCkKKwl7CisJICAvKiBQcm9jZXNzIGV4aXRlZC4gICovCisJICBwaS0+cHJzdGF0dXMucHJfZmxhZ3MgPSAwOworCSAgYnJlYWs7CisJfQorICAgICAgZWxzZSBpZiAoZXJybm8gIT0gRUlOVFIpCisJeworCSAgcHJpbnRfc3lzX2Vycm1zZyAocGktPnBhdGhuYW1lLCBlcnJubyk7CisJICBlcnJvciAoInByb2Nmc193cml0ZV9wY3dzdG9wIGZhaWxlZCIpOworCX0KKyAgICB9CisgIHBpLT5oYWRfZXZlbnQgPSAxOworI2VuZGlmIC8qIExPU0lOR19QT0xMICovCisgIAorICBjbGVhcl9zaWdpbnRfdHJhcCAoKTsKKyAgY2xlYXJfc2lnaW9fdHJhcCAoKTsKKworI2lmbmRlZiBMT1NJTkdfUE9MTAorCisgIGZvciAoaSA9IDA7IGkgPCBudW1fcG9sbF9saXN0ICYmIG51bV9mZHMgPiAwOyBpKyspCisgICAgeworICAgICAgaWYgKDAgPT0gKHBvbGxfbGlzdFtpXS5yZXZlbnRzICYgCisJCShQT0xMV1JOT1JNIHwgUE9MTFBSSSB8IFBPTExFUlIgfCBQT0xMSFVQIHwgUE9MTE5WQUwpKSkKKwljb250aW51ZTsKKyAgICAgIGZvciAocGkgPSBwcm9jaW5mb19saXN0OyBwaTsgcGkgPSBuZXh0X3BpKQorCXsKKwkgIG5leHRfcGkgPSBwaS0+bmV4dDsKKwkgIGlmIChwb2xsX2xpc3RbaV0uZmQgPT0gcGktPmN0bF9mZCkKKwkgICAgeworCSAgICAgIG51bV9mZHMtLTsKKwkgICAgICBpZiAoKHBvbGxfbGlzdFtpXS5yZXZlbnRzICYgUE9MTEhVUCkgIT0gMAl8fAorCQkgICFwcm9jZnNfcmVhZF9zdGF0dXMocGkpKQorCQl7IC8qIFRoZSBMV1AgaGFzIGFwcGFyZW50bHkgdGVybWluYXRlZC4gICovCisJCSAgaWYgKG51bV9wb2xsX2xpc3QgPD0gMSkKKwkJICAgIHsKKwkJICAgICAgcGktPnByc3RhdHVzLnByX2ZsYWdzID0gMDsKKwkJICAgICAgcGktPmhhZF9ldmVudCA9IDE7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQkgIGlmIChpbmZvX3ZlcmJvc2UpCisJCSAgICBwcmludGZfZmlsdGVyZWQgKCJMV1AgJWQgZXhpdGVkLlxuIiwgCisJCQkJICAgICAocGktPnBpZCA+PiAxNikgJiAweGZmZmYpOworCQkgIGNsb3NlX3Byb2NfZmlsZSAocGkpOworCQkgIGktLTsJCQkvKiBkb24ndCBza2lwIGRlbGV0ZWQgZW50cnkgKi8KKwkJICBpZiAobnVtX2ZkcyAhPSAwKQorCQkgICAgYnJlYWs7CQkvKiBhbHJlYWR5IGFub3RoZXIgZXZlbnQgdG8gcHJvY2VzcyAqLworCQkgIGVsc2UKKwkJICAgIGdvdG8gd2FpdF9hZ2FpbjsgCS8qIHdhaXQgZm9yIGFub3RoZXIgZXZlbnQgKi8KKwkJfQorCSAgICAgIHBpLT5oYWRfZXZlbnQgPSAxOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgaWYgKCFwaSkKKwllcnJvciAoIndhaXRfZmQ6IENvdWxkbid0IGZpbmQgcHJvY2luZm8gZm9yIGZkICVkXG4iLAorCSAgICAgICBwb2xsX2xpc3RbaV0uZmQpOworICAgIH0KKyNlbmRpZiAvKiBMT1NJTkdfUE9MTCAqLworCisgIHJldHVybiBwaTsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWxvb2t1cGRlc2MgLS0gdHJhbnNsYXRlIGEgdmFsdWUgdG8gYSBzdW1tYXJ5IGRlc2Mgc3RyaW5nCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgY2hhciAqbG9va3VwZGVzYyAoc3RydWN0IHRyYW5zICp0cmFuc3AsIHVuc2lnbmVkIGludCB2YWwpOworCitERVNDUklQVElPTgorCQorCUdpdmVuIGEgcG9pbnRlciB0byBhIHRyYW5zbGF0aW9uIHRhYmxlIGFuZCBhIHZhbHVlIHRvIGJlIHRyYW5zbGF0ZWQsCisJbG9va3VwIHRoZSBkZXNjIHN0cmluZyBhbmQgcmV0dXJuIGl0LgorICovCisKK3N0YXRpYyBjaGFyICoKK2xvb2t1cGRlc2MgKHRyYW5zcCwgdmFsKQorICAgICBzdHJ1Y3QgdHJhbnMgKnRyYW5zcDsKKyAgICAgdW5zaWduZWQgaW50IHZhbDsKK3sKKyAgY2hhciAqZGVzYzsKKyAgCisgIGZvciAoZGVzYyA9IE5VTEw7IHRyYW5zcCAtPiBuYW1lICE9IE5VTEw7IHRyYW5zcCsrKQorICAgIHsKKyAgICAgIGlmICh0cmFuc3AgLT4gdmFsdWUgPT0gdmFsKQorCXsKKwkgIGRlc2MgPSB0cmFuc3AgLT4gZGVzYzsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgLyogRGlkbid0IGZpbmQgYSB0cmFuc2xhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSwgc2V0IGEgZGVmYXVsdCBvbmUuICovCisKKyAgaWYgKGRlc2MgPT0gTlVMTCkKKyAgICB7CisgICAgICBkZXNjID0gIlVua25vd24iOworICAgIH0KKyAgcmV0dXJuIChkZXNjKTsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWxvb2t1cG5hbWUgLS0gdHJhbnNsYXRlIGEgdmFsdWUgdG8gc3ltYm9saWMgbmFtZQorCitTWU5PUFNJUworCisJc3RhdGljIGNoYXIgKmxvb2t1cG5hbWUgKHN0cnVjdCB0cmFucyAqdHJhbnNwLCB1bnNpZ25lZCBpbnQgdmFsLAorCQkJCSBjaGFyICpwcmVmaXgpOworCitERVNDUklQVElPTgorCQorCUdpdmVuIGEgcG9pbnRlciB0byBhIHRyYW5zbGF0aW9uIHRhYmxlLCBhIHZhbHVlIHRvIGJlIHRyYW5zbGF0ZWQsCisJYW5kIGEgZGVmYXVsdCBwcmVmaXggdG8gcmV0dXJuIGlmIHRoZSB2YWx1ZSBjYW4ndCBiZSB0cmFuc2xhdGVkLAorCW1hdGNoIHRoZSB2YWx1ZSB3aXRoIG9uZSBvZiB0aGUgdHJhbnNsYXRpb24gdGFibGUgZW50cmllcyBhbmQKKwlyZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzeW1ib2xpYyBuYW1lLgorCisJSWYgbm8gbWF0Y2ggaXMgZm91bmQgaXQganVzdCByZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHByaW50YWJsZSBzdHJpbmcsCisJd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LiAgVGhlIHByZXZpb3VzIHN1Y2ggdmFsdWUsIGlmIGFueSwgaXMgZnJlZWQKKwlhdCB0aGlzIHRpbWUuCisgKi8KKworc3RhdGljIGNoYXIgKgorbG9va3VwbmFtZSAodHJhbnNwLCB2YWwsIHByZWZpeCkKKyAgICAgc3RydWN0IHRyYW5zICp0cmFuc3A7CisgICAgIHVuc2lnbmVkIGludCB2YWw7CisgICAgIGNoYXIgKnByZWZpeDsKK3sKKyAgc3RhdGljIGNoYXIgKmxvY2J1ZjsKKyAgY2hhciAqbmFtZTsKKyAgCisgIGZvciAobmFtZSA9IE5VTEw7IHRyYW5zcCAtPiBuYW1lICE9IE5VTEw7IHRyYW5zcCsrKQorICAgIHsKKyAgICAgIGlmICh0cmFuc3AgLT4gdmFsdWUgPT0gdmFsKQorCXsKKwkgIG5hbWUgPSB0cmFuc3AgLT4gbmFtZTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgLyogRGlkbid0IGZpbmQgYSB0cmFuc2xhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSwgYnVpbGQgYSBkZWZhdWx0CisgICAgIG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIHByZWZpeCBhbmQgcmV0dXJuIGl0LiAgVGhlIGxpZmV0aW1lIG9mCisgICAgIHRoZSB2YWx1ZSBpcyBvbmx5IHVudGlsIHRoZSBuZXh0IG9uZSBpcyBuZWVkZWQuICovCisKKyAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobG9jYnVmICE9IE5VTEwpCisJeworCSAgZnJlZSAobG9jYnVmKTsKKwl9CisgICAgICBsb2NidWYgPSB4bWFsbG9jIChzdHJsZW4gKHByZWZpeCkgKyAxNik7CisgICAgICBzcHJpbnRmIChsb2NidWYsICIlcyAldSIsIHByZWZpeCwgdmFsKTsKKyAgICAgIG5hbWUgPSBsb2NidWY7CisgICAgfQorICByZXR1cm4gKG5hbWUpOworfQorCitzdGF0aWMgY2hhciAqCitzaWdjb2RlbmFtZSAoc2lwKQorICAgICBzaWdpbmZvX3QgKnNpcDsKK3sKKyAgc3RydWN0IHNpZ2NvZGUgKnNjcDsKKyAgY2hhciAqbmFtZSA9IE5VTEw7CisgIHN0YXRpYyBjaGFyIGxvY2J1ZlszMl07CisgIAorICBmb3IgKHNjcCA9IHNpZ2luZm9fdGFibGU7IHNjcCAtPiBjb2RlbmFtZSAhPSBOVUxMOyBzY3ArKykKKyAgICB7CisgICAgICBpZiAoKHNjcCAtPiBzaWdubyA9PSBzaXAgLT4gc2lfc2lnbm8pICYmCisJICAoc2NwIC0+IGNvZGUgPT0gc2lwIC0+IHNpX2NvZGUpKQorCXsKKwkgIG5hbWUgPSBzY3AgLT4gY29kZW5hbWU7CisJICBicmVhazsKKwl9CisgICAgfQorICBpZiAobmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHNwcmludGYgKGxvY2J1ZiwgInNpZ2NvZGUgJXUiLCBzaXAgLT4gc2lfc2lnbm8pOworICAgICAgbmFtZSA9IGxvY2J1ZjsKKyAgICB9CisgIHJldHVybiAobmFtZSk7Cit9CisKK3N0YXRpYyBjaGFyICoKK3NpZ2NvZGVkZXNjIChzaXApCisgICAgIHNpZ2luZm9fdCAqc2lwOworeworICBzdHJ1Y3Qgc2lnY29kZSAqc2NwOworICBjaGFyICpkZXNjID0gTlVMTDsKKyAgCisgIGZvciAoc2NwID0gc2lnaW5mb190YWJsZTsgc2NwIC0+IGNvZGVuYW1lICE9IE5VTEw7IHNjcCsrKQorICAgIHsKKyAgICAgIGlmICgoc2NwIC0+IHNpZ25vID09IHNpcCAtPiBzaV9zaWdubykgJiYKKwkgIChzY3AgLT4gY29kZSA9PSBzaXAgLT4gc2lfY29kZSkpCisJeworCSAgZGVzYyA9IHNjcCAtPiBkZXNjOworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgaWYgKGRlc2MgPT0gTlVMTCkKKyAgICB7CisgICAgICBkZXNjID0gIlVucmVjb2duaXplZCBzaWduYWwgb3IgdHJhcCB1c2UiOworICAgIH0KKyAgcmV0dXJuIChkZXNjKTsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCXN5c2NhbGxuYW1lIC0gdHJhbnNsYXRlIGEgc3lzdGVtIGNhbGwgbnVtYmVyIGludG8gYSBzeXN0ZW0gY2FsbCBuYW1lCisKK1NZTk9QU0lTCisKKwljaGFyICpzeXNjYWxsbmFtZSAoaW50IHN5c2NhbGxudW0pCisKK0RFU0NSSVBUSU9OCisKKwlHaXZlbiBhIHN5c3RlbSBjYWxsIG51bWJlciwgdHJhbnNsYXRlIGl0IGludG8gdGhlIHByaW50YWJsZSBuYW1lCisJb2YgYSBzeXN0ZW0gY2FsbCwgb3IgaW50byAic3lzY2FsbCA8bnVtPiIgaWYgaXQgaXMgYW4gdW5rbm93bgorCW51bWJlci4KKyAqLworCitzdGF0aWMgY2hhciAqCitzeXNjYWxsbmFtZSAoc3lzY2FsbG51bSkKKyAgICAgaW50IHN5c2NhbGxudW07Cit7CisgIHN0YXRpYyBjaGFyIGxvY2J1ZlszMl07CisgIAorICBpZiAoc3lzY2FsbG51bSA+PSAwICYmIHN5c2NhbGxudW0gPCBNQVhfU1lTQ0FMTFMKKyAgICAgICYmIHN5c2NhbGxfdGFibGVbc3lzY2FsbG51bV0gIT0gTlVMTCkKKyAgICByZXR1cm4gc3lzY2FsbF90YWJsZVtzeXNjYWxsbnVtXTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHNwcmludGYgKGxvY2J1ZiwgInN5c2NhbGwgJXUiLCBzeXNjYWxsbnVtKTsKKyAgICAgIHJldHVybiBsb2NidWY7CisgICAgfQorfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJaW5pdF9zeXNjYWxsX3RhYmxlIC0gaW5pdGlhbGl6ZSBzeXNjYWxsIHRyYW5zbGF0aW9uIHRhYmxlCisKK1NZTk9QU0lTCisKKwl2b2lkIGluaXRfc3lzY2FsbF90YWJsZSAodm9pZCkKKworREVTQ1JJUFRJT04KKworCUR5bmFtaWNhbGx5IGluaXRpYWxpemUgdGhlIHRyYW5zbGF0aW9uIHRhYmxlIHRvIGNvbnZlcnQgc3lzdGVtCisJY2FsbCBudW1iZXJzIGludG8gcHJpbnRhYmxlIHN5c3RlbSBjYWxsIG5hbWVzLiAgRG9uZSBvbmNlIHBlcgorCWdkYiBydW4sIG9uIGluaXRpYWxpemF0aW9uLgorCitOT1RFUworCisJVGhpcyBpcyBhd2Z1bGx5IHVnbHksIGJ1dCBwcmVwcm9jZXNzb3IgdHJpY2tzIHRvIG1ha2UgaXQgcHJldHRpZXIKKwl0ZW5kIHRvIGJlIG5vbnBvcnRhYmxlLgorICovCisKK3N0YXRpYyB2b2lkCitpbml0X3N5c2NhbGxfdGFibGUgKCkKK3sKKyNpZiBkZWZpbmVkIChTWVNfZXhpdCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfZXhpdF0gPSAiZXhpdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZm9yaykKKyAgc3lzY2FsbF90YWJsZVtTWVNfZm9ya10gPSAiZm9yayI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcmVhZCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfcmVhZF0gPSAicmVhZCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfd3JpdGUpCisgIHN5c2NhbGxfdGFibGVbU1lTX3dyaXRlXSA9ICJ3cml0ZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfb3BlbikKKyAgc3lzY2FsbF90YWJsZVtTWVNfb3Blbl0gPSAib3BlbiI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfY2xvc2UpCisgIHN5c2NhbGxfdGFibGVbU1lTX2Nsb3NlXSA9ICJjbG9zZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfd2FpdCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfd2FpdF0gPSAid2FpdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfY3JlYXQpCisgIHN5c2NhbGxfdGFibGVbU1lTX2NyZWF0XSA9ICJjcmVhdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbGluaykKKyAgc3lzY2FsbF90YWJsZVtTWVNfbGlua10gPSAibGluayI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfdW5saW5rKQorICBzeXNjYWxsX3RhYmxlW1NZU191bmxpbmtdID0gInVubGluayI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZXhlYykKKyAgc3lzY2FsbF90YWJsZVtTWVNfZXhlY10gPSAiZXhlYyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZXhlY3YpCisgIHN5c2NhbGxfdGFibGVbU1lTX2V4ZWN2XSA9ICJleGVjdiI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZXhlY3ZlKQorICBzeXNjYWxsX3RhYmxlW1NZU19leGVjdmVdID0gImV4ZWN2ZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfY2hkaXIpCisgIHN5c2NhbGxfdGFibGVbU1lTX2NoZGlyXSA9ICJjaGRpciI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfdGltZSkKKyAgc3lzY2FsbF90YWJsZVtTWVNfdGltZV0gPSAidGltZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbWtub2QpCisgIHN5c2NhbGxfdGFibGVbU1lTX21rbm9kXSA9ICJta25vZCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfY2htb2QpCisgIHN5c2NhbGxfdGFibGVbU1lTX2NobW9kXSA9ICJjaG1vZCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfY2hvd24pCisgIHN5c2NhbGxfdGFibGVbU1lTX2Nob3duXSA9ICJjaG93biI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfYnJrKQorICBzeXNjYWxsX3RhYmxlW1NZU19icmtdID0gImJyayI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc3RhdCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfc3RhdF0gPSAic3RhdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbHNlZWspCisgIHN5c2NhbGxfdGFibGVbU1lTX2xzZWVrXSA9ICJsc2VlayI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZ2V0cGlkKQorICBzeXNjYWxsX3RhYmxlW1NZU19nZXRwaWRdID0gImdldHBpZCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbW91bnQpCisgIHN5c2NhbGxfdGFibGVbU1lTX21vdW50XSA9ICJtb3VudCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfdW1vdW50KQorICBzeXNjYWxsX3RhYmxlW1NZU191bW91bnRdID0gInVtb3VudCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2V0dWlkKQorICBzeXNjYWxsX3RhYmxlW1NZU19zZXR1aWRdID0gInNldHVpZCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZ2V0dWlkKQorICBzeXNjYWxsX3RhYmxlW1NZU19nZXR1aWRdID0gImdldHVpZCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc3RpbWUpCisgIHN5c2NhbGxfdGFibGVbU1lTX3N0aW1lXSA9ICJzdGltZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcHRyYWNlKQorICBzeXNjYWxsX3RhYmxlW1NZU19wdHJhY2VdID0gInB0cmFjZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfYWxhcm0pCisgIHN5c2NhbGxfdGFibGVbU1lTX2FsYXJtXSA9ICJhbGFybSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZnN0YXQpCisgIHN5c2NhbGxfdGFibGVbU1lTX2ZzdGF0XSA9ICJmc3RhdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcGF1c2UpCisgIHN5c2NhbGxfdGFibGVbU1lTX3BhdXNlXSA9ICJwYXVzZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfdXRpbWUpCisgIHN5c2NhbGxfdGFibGVbU1lTX3V0aW1lXSA9ICJ1dGltZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc3R0eSkKKyAgc3lzY2FsbF90YWJsZVtTWVNfc3R0eV0gPSAic3R0eSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZ3R0eSkKKyAgc3lzY2FsbF90YWJsZVtTWVNfZ3R0eV0gPSAiZ3R0eSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfYWNjZXNzKQorICBzeXNjYWxsX3RhYmxlW1NZU19hY2Nlc3NdID0gImFjY2VzcyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbmljZSkKKyAgc3lzY2FsbF90YWJsZVtTWVNfbmljZV0gPSAibmljZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc3RhdGZzKQorICBzeXNjYWxsX3RhYmxlW1NZU19zdGF0ZnNdID0gInN0YXRmcyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc3luYykKKyAgc3lzY2FsbF90YWJsZVtTWVNfc3luY10gPSAic3luYyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfa2lsbCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfa2lsbF0gPSAia2lsbCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZnN0YXRmcykKKyAgc3lzY2FsbF90YWJsZVtTWVNfZnN0YXRmc10gPSAiZnN0YXRmcyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcGdycHN5cykKKyAgc3lzY2FsbF90YWJsZVtTWVNfcGdycHN5c10gPSAicGdycHN5cyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfeGVuaXgpCisgIHN5c2NhbGxfdGFibGVbU1lTX3hlbml4XSA9ICJ4ZW5peCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZHVwKQorICBzeXNjYWxsX3RhYmxlW1NZU19kdXBdID0gImR1cCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcGlwZSkKKyAgc3lzY2FsbF90YWJsZVtTWVNfcGlwZV0gPSAicGlwZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfdGltZXMpCisgIHN5c2NhbGxfdGFibGVbU1lTX3RpbWVzXSA9ICJ0aW1lcyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcHJvZmlsKQorICBzeXNjYWxsX3RhYmxlW1NZU19wcm9maWxdID0gInByb2ZpbCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcGxvY2spCisgIHN5c2NhbGxfdGFibGVbU1lTX3Bsb2NrXSA9ICJwbG9jayI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2V0Z2lkKQorICBzeXNjYWxsX3RhYmxlW1NZU19zZXRnaWRdID0gInNldGdpZCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZ2V0Z2lkKQorICBzeXNjYWxsX3RhYmxlW1NZU19nZXRnaWRdID0gImdldGdpZCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2lnbmFsKQorICBzeXNjYWxsX3RhYmxlW1NZU19zaWduYWxdID0gInNpZ25hbCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbXNnc3lzKQorICBzeXNjYWxsX3RhYmxlW1NZU19tc2dzeXNdID0gIm1zZ3N5cyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc3lzM2IpCisgIHN5c2NhbGxfdGFibGVbU1lTX3N5czNiXSA9ICJzeXMzYiI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc3lzaTg2KQorICBzeXNjYWxsX3RhYmxlW1NZU19zeXNpODZdID0gInN5c2k4NiI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfYWNjdCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfYWNjdF0gPSAiYWNjdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2htc3lzKQorICBzeXNjYWxsX3RhYmxlW1NZU19zaG1zeXNdID0gInNobXN5cyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2Vtc3lzKQorICBzeXNjYWxsX3RhYmxlW1NZU19zZW1zeXNdID0gInNlbXN5cyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfaW9jdGwpCisgIHN5c2NhbGxfdGFibGVbU1lTX2lvY3RsXSA9ICJpb2N0bCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfdWFkbWluKQorICBzeXNjYWxsX3RhYmxlW1NZU191YWRtaW5dID0gInVhZG1pbiI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfdXRzc3lzKQorICBzeXNjYWxsX3RhYmxlW1NZU191dHNzeXNdID0gInV0c3N5cyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZnN5bmMpCisgIHN5c2NhbGxfdGFibGVbU1lTX2ZzeW5jXSA9ICJmc3luYyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfdW1hc2spCisgIHN5c2NhbGxfdGFibGVbU1lTX3VtYXNrXSA9ICJ1bWFzayI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfY2hyb290KQorICBzeXNjYWxsX3RhYmxlW1NZU19jaHJvb3RdID0gImNocm9vdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZmNudGwpCisgIHN5c2NhbGxfdGFibGVbU1lTX2ZjbnRsXSA9ICJmY250bCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfdWxpbWl0KQorICBzeXNjYWxsX3RhYmxlW1NZU191bGltaXRdID0gInVsaW1pdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcmZzeXMpCisgIHN5c2NhbGxfdGFibGVbU1lTX3Jmc3lzXSA9ICJyZnN5cyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcm1kaXIpCisgIHN5c2NhbGxfdGFibGVbU1lTX3JtZGlyXSA9ICJybWRpciI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbWtkaXIpCisgIHN5c2NhbGxfdGFibGVbU1lTX21rZGlyXSA9ICJta2RpciI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZ2V0ZGVudHMpCisgIHN5c2NhbGxfdGFibGVbU1lTX2dldGRlbnRzXSA9ICJnZXRkZW50cyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc3lzZnMpCisgIHN5c2NhbGxfdGFibGVbU1lTX3N5c2ZzXSA9ICJzeXNmcyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZ2V0bXNnKQorICBzeXNjYWxsX3RhYmxlW1NZU19nZXRtc2ddID0gImdldG1zZyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcHV0bXNnKQorICBzeXNjYWxsX3RhYmxlW1NZU19wdXRtc2ddID0gInB1dG1zZyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcG9sbCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfcG9sbF0gPSAicG9sbCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbHN0YXQpCisgIHN5c2NhbGxfdGFibGVbU1lTX2xzdGF0XSA9ICJsc3RhdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc3ltbGluaykKKyAgc3lzY2FsbF90YWJsZVtTWVNfc3ltbGlua10gPSAic3ltbGluayI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcmVhZGxpbmspCisgIHN5c2NhbGxfdGFibGVbU1lTX3JlYWRsaW5rXSA9ICJyZWFkbGluayI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2V0Z3JvdXBzKQorICBzeXNjYWxsX3RhYmxlW1NZU19zZXRncm91cHNdID0gInNldGdyb3VwcyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZ2V0Z3JvdXBzKQorICBzeXNjYWxsX3RhYmxlW1NZU19nZXRncm91cHNdID0gImdldGdyb3VwcyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZmNobW9kKQorICBzeXNjYWxsX3RhYmxlW1NZU19mY2htb2RdID0gImZjaG1vZCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZmNob3duKQorICBzeXNjYWxsX3RhYmxlW1NZU19mY2hvd25dID0gImZjaG93biI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2lncHJvY21hc2spCisgIHN5c2NhbGxfdGFibGVbU1lTX3NpZ3Byb2NtYXNrXSA9ICJzaWdwcm9jbWFzayI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2lnc3VzcGVuZCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfc2lnc3VzcGVuZF0gPSAic2lnc3VzcGVuZCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2lnYWx0c3RhY2spCisgIHN5c2NhbGxfdGFibGVbU1lTX3NpZ2FsdHN0YWNrXSA9ICJzaWdhbHRzdGFjayI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2lnYWN0aW9uKQorICBzeXNjYWxsX3RhYmxlW1NZU19zaWdhY3Rpb25dID0gInNpZ2FjdGlvbiI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2lncGVuZGluZykKKyAgc3lzY2FsbF90YWJsZVtTWVNfc2lncGVuZGluZ10gPSAic2lncGVuZGluZyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfY29udGV4dCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfY29udGV4dF0gPSAiY29udGV4dCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZXZzeXMpCisgIHN5c2NhbGxfdGFibGVbU1lTX2V2c3lzXSA9ICJldnN5cyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZXZ0cmFwcmV0KQorICBzeXNjYWxsX3RhYmxlW1NZU19ldnRyYXByZXRdID0gImV2dHJhcHJldCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc3RhdHZmcykKKyAgc3lzY2FsbF90YWJsZVtTWVNfc3RhdHZmc10gPSAic3RhdHZmcyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZnN0YXR2ZnMpCisgIHN5c2NhbGxfdGFibGVbU1lTX2ZzdGF0dmZzXSA9ICJmc3RhdHZmcyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbmZzc3lzKQorICBzeXNjYWxsX3RhYmxlW1NZU19uZnNzeXNdID0gIm5mc3N5cyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfd2FpdHN5cykKKyAgc3lzY2FsbF90YWJsZVtTWVNfd2FpdHN5c10gPSAid2FpdHN5cyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2lnc2VuZHN5cykKKyAgc3lzY2FsbF90YWJsZVtTWVNfc2lnc2VuZHN5c10gPSAic2lnc2VuZHN5cyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfaHJ0c3lzKQorICBzeXNjYWxsX3RhYmxlW1NZU19ocnRzeXNdID0gImhydHN5cyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfYWNhbmNlbCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfYWNhbmNlbF0gPSAiYWNhbmNlbCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfYXN5bmMpCisgIHN5c2NhbGxfdGFibGVbU1lTX2FzeW5jXSA9ICJhc3luYyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcHJpb2NudGxzeXMpCisgIHN5c2NhbGxfdGFibGVbU1lTX3ByaW9jbnRsc3lzXSA9ICJwcmlvY250bHN5cyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcGF0aGNvbmYpCisgIHN5c2NhbGxfdGFibGVbU1lTX3BhdGhjb25mXSA9ICJwYXRoY29uZiI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbWluY29yZSkKKyAgc3lzY2FsbF90YWJsZVtTWVNfbWluY29yZV0gPSAibWluY29yZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbW1hcCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfbW1hcF0gPSAibW1hcCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbXByb3RlY3QpCisgIHN5c2NhbGxfdGFibGVbU1lTX21wcm90ZWN0XSA9ICJtcHJvdGVjdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbXVubWFwKQorICBzeXNjYWxsX3RhYmxlW1NZU19tdW5tYXBdID0gIm11bm1hcCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZnBhdGhjb25mKQorICBzeXNjYWxsX3RhYmxlW1NZU19mcGF0aGNvbmZdID0gImZwYXRoY29uZiI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfdmZvcmspCisgIHN5c2NhbGxfdGFibGVbU1lTX3Zmb3JrXSA9ICJ2Zm9yayI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZmNoZGlyKQorICBzeXNjYWxsX3RhYmxlW1NZU19mY2hkaXJdID0gImZjaGRpciI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcmVhZHYpCisgIHN5c2NhbGxfdGFibGVbU1lTX3JlYWR2XSA9ICJyZWFkdiI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfd3JpdGV2KQorICBzeXNjYWxsX3RhYmxlW1NZU193cml0ZXZdID0gIndyaXRldiI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfeHN0YXQpCisgIHN5c2NhbGxfdGFibGVbU1lTX3hzdGF0XSA9ICJ4c3RhdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbHhzdGF0KQorICBzeXNjYWxsX3RhYmxlW1NZU19seHN0YXRdID0gImx4c3RhdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZnhzdGF0KQorICBzeXNjYWxsX3RhYmxlW1NZU19meHN0YXRdID0gImZ4c3RhdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfeG1rbm9kKQorICBzeXNjYWxsX3RhYmxlW1NZU194bWtub2RdID0gInhta25vZCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfY2xvY2FsKQorICBzeXNjYWxsX3RhYmxlW1NZU19jbG9jYWxdID0gImNsb2NhbCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2V0cmxpbWl0KQorICBzeXNjYWxsX3RhYmxlW1NZU19zZXRybGltaXRdID0gInNldHJsaW1pdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZ2V0cmxpbWl0KQorICBzeXNjYWxsX3RhYmxlW1NZU19nZXRybGltaXRdID0gImdldHJsaW1pdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbGNob3duKQorICBzeXNjYWxsX3RhYmxlW1NZU19sY2hvd25dID0gImxjaG93biI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbWVtY250bCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfbWVtY250bF0gPSAibWVtY250bCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZ2V0cG1zZykKKyAgc3lzY2FsbF90YWJsZVtTWVNfZ2V0cG1zZ10gPSAiZ2V0cG1zZyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcHV0cG1zZykKKyAgc3lzY2FsbF90YWJsZVtTWVNfcHV0cG1zZ10gPSAicHV0cG1zZyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcmVuYW1lKQorICBzeXNjYWxsX3RhYmxlW1NZU19yZW5hbWVdID0gInJlbmFtZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfdW5hbWUpCisgIHN5c2NhbGxfdGFibGVbU1lTX3VuYW1lXSA9ICJ1bmFtZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2V0ZWdpZCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfc2V0ZWdpZF0gPSAic2V0ZWdpZCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc3lzY29uZmlnKQorICBzeXNjYWxsX3RhYmxlW1NZU19zeXNjb25maWddID0gInN5c2NvbmZpZyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfYWRqdGltZSkKKyAgc3lzY2FsbF90YWJsZVtTWVNfYWRqdGltZV0gPSAiYWRqdGltZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc3lzdGVtaW5mbykKKyAgc3lzY2FsbF90YWJsZVtTWVNfc3lzdGVtaW5mb10gPSAic3lzdGVtaW5mbyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2V0ZXVpZCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfc2V0ZXVpZF0gPSAic2V0ZXVpZCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc3Byb2MpCisgIHN5c2NhbGxfdGFibGVbU1lTX3Nwcm9jXSA9ICJzcHJvYyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfa2V5Y3RsKQorICBzeXNjYWxsX3RhYmxlW1NZU19rZXljdGxdID0gImtleWN0bCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2Vjc3lzKQorICBzeXNjYWxsX3RhYmxlW1NZU19zZWNzeXNdID0gInNlY3N5cyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZmlsZXByaXYpCisgIHN5c2NhbGxfdGFibGVbU1lTX2ZpbGVwcml2XSA9ICJmaWxlcHJpdiI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcHJvY3ByaXYpCisgIHN5c2NhbGxfdGFibGVbU1lTX3Byb2Nwcml2XSA9ICJwcm9jcHJpdiI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZGV2c3RhdCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfZGV2c3RhdF0gPSAiZGV2c3RhdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfYWNsaXBjKQorICBzeXNjYWxsX3RhYmxlW1NZU19hY2xpcGNdID0gImFjbGlwYyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZmRldnN0YXQpCisgIHN5c2NhbGxfdGFibGVbU1lTX2ZkZXZzdGF0XSA9ICJmZGV2c3RhdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZmx2bGZpbGUpCisgIHN5c2NhbGxfdGFibGVbU1lTX2ZsdmxmaWxlXSA9ICJmbHZsZmlsZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbHZsZmlsZSkKKyAgc3lzY2FsbF90YWJsZVtTWVNfbHZsZmlsZV0gPSAibHZsZmlsZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbHZsZXF1YWwpCisgIHN5c2NhbGxfdGFibGVbU1lTX2x2bGVxdWFsXSA9ICJsdmxlcXVhbCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbHZscHJvYykKKyAgc3lzY2FsbF90YWJsZVtTWVNfbHZscHJvY10gPSAibHZscHJvYyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbHZsaXBjKQorICBzeXNjYWxsX3RhYmxlW1NZU19sdmxpcGNdID0gImx2bGlwYyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfYWNsKQorICBzeXNjYWxsX3RhYmxlW1NZU19hY2xdID0gImFjbCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfYXVkaXRldnQpCisgIHN5c2NhbGxfdGFibGVbU1lTX2F1ZGl0ZXZ0XSA9ICJhdWRpdGV2dCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfYXVkaXRjdGwpCisgIHN5c2NhbGxfdGFibGVbU1lTX2F1ZGl0Y3RsXSA9ICJhdWRpdGN0bCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfYXVkaXRkbXApCisgIHN5c2NhbGxfdGFibGVbU1lTX2F1ZGl0ZG1wXSA9ICJhdWRpdGRtcCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfYXVkaXRsb2cpCisgIHN5c2NhbGxfdGFibGVbU1lTX2F1ZGl0bG9nXSA9ICJhdWRpdGxvZyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfYXVkaXRidWYpCisgIHN5c2NhbGxfdGFibGVbU1lTX2F1ZGl0YnVmXSA9ICJhdWRpdGJ1ZiI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbHZsZG9tKQorICBzeXNjYWxsX3RhYmxlW1NZU19sdmxkb21dID0gImx2bGRvbSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbHZsdmZzKQorICBzeXNjYWxsX3RhYmxlW1NZU19sdmx2ZnNdID0gImx2bHZmcyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbWttbGQpCisgIHN5c2NhbGxfdGFibGVbU1lTX21rbWxkXSA9ICJta21sZCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbWxkbW9kZSkKKyAgc3lzY2FsbF90YWJsZVtTWVNfbWxkbW9kZV0gPSAibWxkbW9kZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2VjYWR2aXNlKQorICBzeXNjYWxsX3RhYmxlW1NZU19zZWNhZHZpc2VdID0gInNlY2FkdmlzZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfb25saW5lKQorICBzeXNjYWxsX3RhYmxlW1NZU19vbmxpbmVdID0gIm9ubGluZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2V0aXRpbWVyKQorICBzeXNjYWxsX3RhYmxlW1NZU19zZXRpdGltZXJdID0gInNldGl0aW1lciI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZ2V0aXRpbWVyKQorICBzeXNjYWxsX3RhYmxlW1NZU19nZXRpdGltZXJdID0gImdldGl0aW1lciI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZ2V0dGltZW9mZGF5KQorICBzeXNjYWxsX3RhYmxlW1NZU19nZXR0aW1lb2ZkYXldID0gImdldHRpbWVvZmRheSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2V0dGltZW9mZGF5KQorICBzeXNjYWxsX3RhYmxlW1NZU19zZXR0aW1lb2ZkYXldID0gInNldHRpbWVvZmRheSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbHdwX2NyZWF0ZSkKKyAgc3lzY2FsbF90YWJsZVtTWVNfbHdwX2NyZWF0ZV0gPSAiX2x3cF9jcmVhdGUiOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU1lTX2x3cF9leGl0KQorICBzeXNjYWxsX3RhYmxlW1NZU19sd3BfZXhpdF0gPSAiX2x3cF9leGl0IjsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNZU19sd3Bfd2FpdCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfbHdwX3dhaXRdID0gIl9sd3Bfd2FpdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbHdwX3NlbGYpCisgIHN5c2NhbGxfdGFibGVbU1lTX2x3cF9zZWxmXSA9ICJfbHdwX3NlbGYiOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU1lTX2x3cF9pbmZvKQorICBzeXNjYWxsX3RhYmxlW1NZU19sd3BfaW5mb10gPSAiX2x3cF9pbmZvIjsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNZU19sd3BfcHJpdmF0ZSkKKyAgc3lzY2FsbF90YWJsZVtTWVNfbHdwX3ByaXZhdGVdID0gIl9sd3BfcHJpdmF0ZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcHJvY2Vzc29yX2JpbmQpCisgIHN5c2NhbGxfdGFibGVbU1lTX3Byb2Nlc3Nvcl9iaW5kXSA9ICJwcm9jZXNzb3JfYmluZCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcHJvY2Vzc29yX2V4YmluZCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfcHJvY2Vzc29yX2V4YmluZF0gPSAicHJvY2Vzc29yX2V4YmluZCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcHJlcGJsb2NrKQorICBzeXNjYWxsX3RhYmxlW1NZU19wcmVwYmxvY2tdID0gInByZXBibG9jayI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfYmxvY2spCisgIHN5c2NhbGxfdGFibGVbU1lTX2Jsb2NrXSA9ICJibG9jayI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcmRibG9jaykKKyAgc3lzY2FsbF90YWJsZVtTWVNfcmRibG9ja10gPSAicmRibG9jayI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfdW5ibG9jaykKKyAgc3lzY2FsbF90YWJsZVtTWVNfdW5ibG9ja10gPSAidW5ibG9jayI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfY2FuY2VsYmxvY2spCisgIHN5c2NhbGxfdGFibGVbU1lTX2NhbmNlbGJsb2NrXSA9ICJjYW5jZWxibG9jayI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcHJlYWQpCisgIHN5c2NhbGxfdGFibGVbU1lTX3ByZWFkXSA9ICJwcmVhZCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcHdyaXRlKQorICBzeXNjYWxsX3RhYmxlW1NZU19wd3JpdGVdID0gInB3cml0ZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfdHJ1bmNhdGUpCisgIHN5c2NhbGxfdGFibGVbU1lTX3RydW5jYXRlXSA9ICJ0cnVuY2F0ZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfZnRydW5jYXRlKQorICBzeXNjYWxsX3RhYmxlW1NZU19mdHJ1bmNhdGVdID0gImZ0cnVuY2F0ZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbHdwX2tpbGwpCisgIHN5c2NhbGxfdGFibGVbU1lTX2x3cF9raWxsXSA9ICJfbHdwX2tpbGwiOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU1lTX3NpZ3dhaXQpCisgIHN5c2NhbGxfdGFibGVbU1lTX3NpZ3dhaXRdID0gInNpZ3dhaXQiOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU1lTX2ZvcmsxKQorICBzeXNjYWxsX3RhYmxlW1NZU19mb3JrMV0gPSAiZm9yazEiOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU1lTX2ZvcmthbGwpCisgIHN5c2NhbGxfdGFibGVbU1lTX2ZvcmthbGxdID0gImZvcmthbGwiOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU1lTX21vZGxvYWQpCisgIHN5c2NhbGxfdGFibGVbU1lTX21vZGxvYWRdID0gIm1vZGxvYWQiOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU1lTX21vZHVsb2FkKQorICBzeXNjYWxsX3RhYmxlW1NZU19tb2R1bG9hZF0gPSAibW9kdWxvYWQiOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU1lTX21vZHBhdGgpCisgIHN5c2NhbGxfdGFibGVbU1lTX21vZHBhdGhdID0gIm1vZHBhdGgiOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU1lTX21vZHN0YXQpCisgIHN5c2NhbGxfdGFibGVbU1lTX21vZHN0YXRdID0gIm1vZHN0YXQiOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU1lTX21vZGFkbSkKKyAgc3lzY2FsbF90YWJsZVtTWVNfbW9kYWRtXSA9ICJtb2RhZG0iOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU1lTX2dldGtzeW0pCisgIHN5c2NhbGxfdGFibGVbU1lTX2dldGtzeW1dID0gImdldGtzeW0iOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU1lTX2x3cF9zdXNwZW5kKQorICBzeXNjYWxsX3RhYmxlW1NZU19sd3Bfc3VzcGVuZF0gPSAiX2x3cF9zdXNwZW5kIjsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNZU19sd3BfY29udGludWUpCisgIHN5c2NhbGxfdGFibGVbU1lTX2x3cF9jb250aW51ZV0gPSAiX2x3cF9jb250aW51ZSI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfcHJpb2NudGxsc3QpCisgIHN5c2NhbGxfdGFibGVbU1lTX3ByaW9jbnRsbHN0XSA9ICJwcmlvY250bGxzdCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfc2xlZXApCisgIHN5c2NhbGxfdGFibGVbU1lTX3NsZWVwXSA9ICJzbGVlcCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTWVNfbHdwX3NlbWFfd2FpdCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfbHdwX3NlbWFfd2FpdF0gPSAiX2x3cF9zZW1hX3dhaXQiOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU1lTX2x3cF9zZW1hX3Bvc3QpCisgIHN5c2NhbGxfdGFibGVbU1lTX2x3cF9zZW1hX3Bvc3RdID0gIl9sd3Bfc2VtYV9wb3N0IjsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNZU19sd3Bfc2VtYV90cnl3YWl0KQorICBzeXNjYWxsX3RhYmxlW1NZU19sd3Bfc2VtYV90cnl3YWl0XSA9ICJsd3Bfc2VtYV90cnl3YWl0IjsKKyNlbmRpZgorI2lmIGRlZmluZWQoU1lTX2ZzdGF0dmZzNjQpCisgIHN5c2NhbGxfdGFibGVbU1lTX2ZzdGF0dmZzNjRdID0gImZzdGF0dmZzNjQiOworI2VuZGlmCisjaWYgZGVmaW5lZChTWVNfc3RhdHZmczY0KQorICBzeXNjYWxsX3RhYmxlW1NZU19zdGF0dmZzNjRdID0gInN0YXR2ZnM2NCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFNZU19mdHJ1bmNhdGU2NCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfZnRydW5jYXRlNjRdID0gImZ0cnVuY2F0ZTY0IjsKKyNlbmRpZgorI2lmIGRlZmluZWQoU1lTX3RydW5jYXRlNjQpCisgIHN5c2NhbGxfdGFibGVbU1lTX3RydW5jYXRlNjRdID0gInRydW5jYXRlNjQiOworI2VuZGlmCisjaWYgZGVmaW5lZChTWVNfZ2V0cmxpbWl0NjQpCisgIHN5c2NhbGxfdGFibGVbU1lTX2dldHJsaW1pdDY0XSA9ICJnZXRybGltaXQ2NCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFNZU19zZXRybGltaXQ2NCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfc2V0cmxpbWl0NjRdID0gInNldHJsaW1pdDY0IjsKKyNlbmRpZgorI2lmIGRlZmluZWQoU1lTX2xzZWVrNjQpCisgIHN5c2NhbGxfdGFibGVbU1lTX2xzZWVrNjRdID0gImxzZWVrNjQiOworI2VuZGlmCisjaWYgZGVmaW5lZChTWVNfbW1hcDY0KQorICBzeXNjYWxsX3RhYmxlW1NZU19tbWFwNjRdID0gIm1tYXA2NCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFNZU19wcmVhZDY0KQorICBzeXNjYWxsX3RhYmxlW1NZU19wcmVhZDY0XSA9ICJwcmVhZDY0IjsKKyNlbmRpZgorI2lmIGRlZmluZWQoU1lTX2NyZWF0NjQpCisgIHN5c2NhbGxfdGFibGVbU1lTX2NyZWF0NjRdID0gImNyZWF0NjQiOworI2VuZGlmCisjaWYgZGVmaW5lZChTWVNfZHNobXN5cykKKyAgc3lzY2FsbF90YWJsZVtTWVNfZHNobXN5c10gPSAiZHNobXN5cyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFNZU19pbnZscGcpCisgIHN5c2NhbGxfdGFibGVbU1lTX2ludmxwZ10gPSAiaW52bHBnIjsKKyNlbmRpZgorI2lmIGRlZmluZWQoU1lTX2NnX2lkcykKKyAgc3lzY2FsbF90YWJsZVtTWVNfY2dfaWRzXSA9ICJjZ19pZHMiOworI2VuZGlmCisjaWYgZGVmaW5lZChTWVNfY2dfcHJvY2Vzc29ycykKKyAgc3lzY2FsbF90YWJsZVtTWVNfY2dfcHJvY2Vzc29yc10gPSAiY2dfcHJvY2Vzc29ycyI7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFNZU19jZ19pbmZvKQorICBzeXNjYWxsX3RhYmxlW1NZU19jZ19pbmZvXSA9ICJjZ19pbmZvIjsKKyNlbmRpZgorI2lmIGRlZmluZWQoU1lTX2NnX2JpbmQpCisgIHN5c2NhbGxfdGFibGVbU1lTX2NnX2JpbmRdID0gImNnX2JpbmQiOworI2VuZGlmCisjaWYgZGVmaW5lZChTWVNfY2dfY3VycmVudCkKKyAgc3lzY2FsbF90YWJsZVtTWVNfY2dfY3VycmVudF0gPSAiY2dfY3VycmVudCI7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFNZU19jZ19tZW1sb2MpCisgIHN5c2NhbGxfdGFibGVbU1lTX2NnX21lbWxvY10gPSAiY2dfbWVtbG9jIjsKKyNlbmRpZgorfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJcHJvY2ZzX2tpbGxfaW5mZXJpb3IgLSBraWxsIGFueSBjdXJyZW50bHkgaW5mZXJpb3IKKworU1lOT1BTSVMKKworCXZvaWQgcHJvY2ZzX2tpbGxfaW5mZXJpb3IgKHZvaWQpCisKK0RFU0NSSVBUSU9OCisKKwlLaWxsIGFueSBjdXJyZW50IGluZmVyaW9yLgorCitOT1RFUworCisJS2lsbHMgZXZlbiBhdHRhY2hlZCBpbmZlcmlvcnMuICBQcmVzdW1hYmx5IHRoZSB1c2VyIGhhcyBhbHJlYWR5CisJYmVlbiBwcm9tcHRlZCB0aGF0IHRoZSBpbmZlcmlvciBpcyBhbiBhdHRhY2hlZCBvbmUgcmF0aGVyIHRoYW4KKwlvbmUgc3RhcnRlZCBieSBnZGIuICAoRklYTUU/KQorCisqLworCitzdGF0aWMgdm9pZAorcHJvY2ZzX2tpbGxfaW5mZXJpb3IgKCkKK3sKKyAgdGFyZ2V0X21vdXJuX2luZmVyaW9yICgpOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJdW5jb25kaXRpb25hbGx5X2tpbGxfaW5mZXJpb3IgLSB0ZXJtaW5hdGUgdGhlIGluZmVyaW9yCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgdm9pZCB1bmNvbmRpdGlvbmFsbHlfa2lsbF9pbmZlcmlvciAoc3RydWN0IHByb2NpbmZvICopCisKK0RFU0NSSVBUSU9OCisKKwlLaWxsIHRoZSBzcGVjaWZpZWQgaW5mZXJpb3IuCisKK05PVEUKKworCUEgcG9zc2libHkgdXNlZnVsIGVuaGFuY2VtZW50IHdvdWxkIGJlIHRvIGZpcnN0IHRyeSBzZW5kaW5nCisJdGhlIGluZmVyaW9yIGEgdGVybWluYXRlIHNpZ25hbCwgcG9saXRlbHkgYXNraW5nIGl0IHRvIGNvbW1pdAorCXN1aWNpZGUsIGJlZm9yZSB3ZSBtdXJkZXIgaXQgKHdlIGNvdWxkIGNhbGwgdGhhdAorCXBvbGl0ZWx5X2tpbGxfaW5mZXJpb3IoKSkuCisKKyovCisKK3N0YXRpYyB2b2lkCit1bmNvbmRpdGlvbmFsbHlfa2lsbF9pbmZlcmlvciAocGkpCisgICAgIHN0cnVjdCBwcm9jaW5mbyAqcGk7Cit7CisgIGludCBwcGlkOworICBzdHJ1Y3QgcHJvY19jdGwgcGN0bDsKKyAgCisgIHBwaWQgPSBwaS0+cHJzdGF0dXMucHJfcHBpZDsKKworI2lmZGVmIFBST0NGU19ORUVEX0NMRUFSX0NVUlNJR19GT1JfS0lMTAorICAvKiBBbHBoYSBPU0YvMS0zLnggcHJvY2ZzIG5lZWRzIGEgY2xlYXIgb2YgdGhlIGN1cnJlbnQgc2lnbmFsCisgICAgIGJlZm9yZSB0aGUgUElPQ0tJTEwsIG90aGVyd2lzZSBpdCBtaWdodCBnZW5lcmF0ZSBhIGNvcnJ1cHRlZCBjb3JlCisgICAgIGZpbGUgZm9yIHRoZSBpbmZlcmlvci4gICovCisgIGlvY3RsIChwaS0+Y3RsX2ZkLCBQSU9DU1NJRywgTlVMTCk7CisjZW5kaWYKKyNpZmRlZiBQUk9DRlNfTkVFRF9QSU9DU1NJR19GT1JfS0lMTAorICAvKiBBbHBoYSBPU0YvMS0yLnggcHJvY2ZzIG5lZWRzIGEgUElPQ1NTSUcgY2FsbCB3aXRoIGEgU0lHS0lMTCBzaWduYWwKKyAgICAgdG8ga2lsbCB0aGUgaW5mZXJpb3IsIG90aGVyd2lzZSBpdCBtaWdodCByZW1haW4gc3RvcHBlZCB3aXRoIGEKKyAgICAgcGVuZGluZyBTSUdLSUxMLgorICAgICBXZSBkbyBub3QgY2hlY2sgdGhlIHJlc3VsdCBvZiB0aGUgUElPQ1NTSUcsIHRoZSBpbmZlcmlvciBtaWdodCBoYXZlCisgICAgIGRpZWQgYWxyZWFkeS4gICovCisgIHsKKyAgICBzdHJ1Y3Qgc2lnaW5mbyBuZXdzaWdpbmZvOworCisgICAgbWVtc2V0ICgoY2hhciAqKSAmbmV3c2lnaW5mbywgMCwgc2l6ZW9mIChuZXdzaWdpbmZvKSk7CisgICAgbmV3c2lnaW5mby5zaV9zaWdubyA9IFNJR0tJTEw7CisgICAgbmV3c2lnaW5mby5zaV9jb2RlID0gMDsKKyAgICBuZXdzaWdpbmZvLnNpX2Vycm5vID0gMDsKKyAgICBuZXdzaWdpbmZvLnNpX3BpZCA9IGdldHBpZCAoKTsKKyAgICBuZXdzaWdpbmZvLnNpX3VpZCA9IGdldHVpZCAoKTsKKyAgICBpb2N0bCAocGktPmN0bF9mZCwgUElPQ1NTSUcsICZuZXdzaWdpbmZvKTsKKyAgfQorI2Vsc2UgLyogUFJPQ0ZTX05FRURfUElPQ1NTSUdfRk9SX0tJTEwgKi8KKyAgcHJvY2ZzX3dyaXRlX3Bja2lsbCAocGkpOworI2VuZGlmIC8qIFBST0NGU19ORUVEX1BJT0NTU0lHX0ZPUl9LSUxMICovCisKKyAgY2xvc2VfcHJvY19maWxlIChwaSk7CisKKy8qIE9ubHkgd2FpdCgpIGZvciBvdXIgZGlyZWN0IGNoaWxkcmVuLiAgT3VyIGdyYW5kY2hpbGRyZW4gem9tYmllcyBhcmUga2lsbGVkCisgICBieSB0aGUgZGVhdGggb2YgdGhlaXIgcGFyZW50cy4gICovCisKKyAgaWYgKHBwaWQgPT0gZ2V0cGlkKCkpCisgICAgd2FpdCAoKGludCAqKSAwKTsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCXByb2Nmc194ZmVyX21lbW9yeSAtLSBjb3B5IGRhdGEgdG8gb3IgZnJvbSBpbmZlcmlvciBtZW1vcnkgc3BhY2UKKworU1lOT1BTSVMKKworCWludCBwcm9jZnNfeGZlcl9tZW1vcnkgKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsIGludCBsZW4sCisJCWludCBkb3dyaXRlLCBzdHJ1Y3QgdGFyZ2V0X29wcyB0YXJnZXQpCisKK0RFU0NSSVBUSU9OCisKKwlDb3B5IExFTiBieXRlcyB0by9mcm9tIGluZmVyaW9yJ3MgbWVtb3J5IHN0YXJ0aW5nIGF0IE1FTUFERFIKKwlmcm9tL3RvIGRlYnVnZ2VyIG1lbW9yeSBzdGFydGluZyBhdCBNWUFERFIuICBDb3B5IGZyb20gaW5mZXJpb3IKKwlpZiBET1dSSVRFIGlzIHplcm8gb3IgdG8gaW5mZXJpb3IgaWYgRE9XUklURSBpcyBub256ZXJvLgorICAKKwlSZXR1cm5zIHRoZSBsZW5ndGggY29waWVkLCB3aGljaCBpcyBlaXRoZXIgdGhlIExFTiBhcmd1bWVudCBvcgorCXplcm8uICBUaGlzIHhmZXIgZnVuY3Rpb24gZG9lcyBub3QgZG8gcGFydGlhbCBtb3Zlcywgc2luY2UgcHJvY2ZzX29wcworCWRvZXNuJ3QgYWxsb3cgbWVtb3J5IG9wZXJhdGlvbnMgdG8gY3Jvc3MgYmVsb3cgdXMgaW4gdGhlIHRhcmdldCBzdGFjaworCWFueXdheS4KKworTk9URVMKKworCVRoZSAvcHJvYyBpbnRlcmZhY2UgbWFrZXMgdGhpcyBhbiBhbG1vc3QgdHJpdmlhbCB0YXNrLgorICovCisKK3N0YXRpYyBpbnQKK3Byb2Nmc194ZmVyX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4sIGRvd3JpdGUsIHRhcmdldCkKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IGRvd3JpdGU7CisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQ7IC8qIGlnbm9yZWQgKi8KK3sKKyAgaW50IG5ieXRlcyA9IDA7CisgIHN0cnVjdCBwcm9jaW5mbyAqcGk7CisKKyAgcGkgPSBjdXJyZW50X3Byb2NpbmZvOworCisgIGlmIChsc2VlayhwaS0+YXNfZmQsIChvZmZfdCkgbWVtYWRkciwgU0VFS19TRVQpID09IChvZmZfdCkgbWVtYWRkcikKKyAgICB7CisgICAgICBpZiAoZG93cml0ZSkKKwl7CisJICBuYnl0ZXMgPSB3cml0ZSAocGktPmFzX2ZkLCBteWFkZHIsIGxlbik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG5ieXRlcyA9IHJlYWQgKHBpLT5hc19mZCwgbXlhZGRyLCBsZW4pOworCX0KKyAgICAgIGlmIChuYnl0ZXMgPCAwKQorCXsKKwkgIG5ieXRlcyA9IDA7CisJfQorICAgIH0KKyAgcmV0dXJuIChuYnl0ZXMpOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJcHJvY2ZzX3N0b3JlX3JlZ2lzdGVycyAtLSBjb3B5IHJlZ2lzdGVyIHZhbHVlcyBiYWNrIHRvIGluZmVyaW9yCisKK1NZTk9QU0lTCisKKwl2b2lkIHByb2Nmc19zdG9yZV9yZWdpc3RlcnMgKGludCByZWdubykKKworREVTQ1JJUFRJT04KKworCVN0b3JlIG91ciBjdXJyZW50IHJlZ2lzdGVyIHZhbHVlcyBiYWNrIGludG8gdGhlIGluZmVyaW9yLiAgSWYKKwlSRUdOTyBpcyAtMSB0aGVuIHN0b3JlIGFsbCB0aGUgcmVnaXN0ZXIsIG90aGVyd2lzZSBzdG9yZSBqdXN0CisJdGhlIHZhbHVlIHNwZWNpZmllZCBieSBSRUdOTy4KKworTk9URVMKKworCUlmIHdlIGFyZSBzdG9yaW5nIG9ubHkgYSBzaW5nbGUgcmVnaXN0ZXIsIHdlIGZpcnN0IGhhdmUgdG8gZ2V0IGFsbAorCXRoZSBjdXJyZW50IHZhbHVlcyBmcm9tIHRoZSBwcm9jZXNzLCBvdmVyd3JpdGUgdGhlIGRlc2lyZWQgcmVnaXN0ZXIKKwlpbiB0aGUgZ3JlZ3NldCB3aXRoIHRoZSBvbmUgd2Ugd2FudCBmcm9tIGdkYidzIHJlZ2lzdGVycywgYW5kIHRoZW4KKwlzZW5kIHRoZSB3aG9sZSBzZXQgYmFjayB0byB0aGUgcHJvY2Vzcy4gIEZvciB3cml0aW5nIGFsbCB0aGUKKwlyZWdpc3RlcnMsIGFsbCB3ZSBoYXZlIHRvIGRvIGlzIGdlbmVyYXRlIHRoZSBncmVnc2V0IGFuZCBzZW5kIGl0IHRvCisJdGhlIHByb2Nlc3MuCisKKwlBbHNvIG5vdGUgdGhhdCB0aGUgcHJvY2VzcyBoYXMgdG8gYmUgc3RvcHBlZCBvbiBhbiBldmVudCBvZiBpbnRlcmVzdAorCWZvciB0aGlzIHRvIHdvcmssIHdoaWNoIGJhc2ljYWxseSBtZWFucyB0aGF0IGl0IGhhcyB0byBoYXZlIGJlZW4KKwlydW4gdW5kZXIgdGhlIGNvbnRyb2wgb2Ygb25lIG9mIHRoZSBvdGhlciAvcHJvYyBpb2N0bCBjYWxscyBhbmQgbm90CisJcHRyYWNlLiAgU2luY2Ugd2UgZG9uJ3QgdXNlIHB0cmFjZSBhbnl3YXksIHdlIGRvbid0IHdvcnJ5IGFib3V0IHRoaXMKKwlmaW5lIHBvaW50LCBidXQgaXQgaXMgd29ydGggbm90aW5nIGZvciBmdXR1cmUgcmVmZXJlbmNlLgorCisJR2RiIGlzIGNvbmZ1c2VkIGFib3V0IHdoYXQgdGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byByZXR1cm4uCisJU29tZSB2ZXJzaW9ucyByZXR1cm4gYSB2YWx1ZSwgb3RoZXJzIHJldHVybiBub3RoaW5nLiAgU29tZSBhcmUKKwlkZWNsYXJlZCB0byByZXR1cm4gYSB2YWx1ZSBhbmQgYWN0dWFsbHkgcmV0dXJuIG5vdGhpbmcuICBHZGIgaWdub3JlcworCWFueXRoaW5nIHJldHVybmVkLiAgKEZJWE1FKQorCisgKi8KKworc3RhdGljIHZvaWQKK3Byb2Nmc19zdG9yZV9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHN0cnVjdCBwcm9jaW5mbyAqcGk7CisjaWZkZWYgUFJPQ0ZTX1VTRV9SRUFEX1dSSVRFCisgIHN0cnVjdCBncmVnX2N0bCBncmVnOworICBzdHJ1Y3QgZnByZWdfY3RsIGZwcmVnOworI2VuZGlmCisKKyAgcGkgPSBjdXJyZW50X3Byb2NpbmZvOworCisjaWZkZWYgUFJPQ0ZTX1VTRV9SRUFEX1dSSVRFCisgIGlmIChyZWdubyAhPSAtMSkKKyAgICB7CisgICAgICBwcm9jZnNfcmVhZF9zdGF0dXMgKHBpKTsKKyAgICAgIG1lbWNweSAoKGNoYXIgKikgJmdyZWcuZ3JlZ3NldCwKKyAgICAgICAgIChjaGFyICopICZwaS0+cHJzdGF0dXMucHJfbHdwLnByX2NvbnRleHQudWNfbWNvbnRleHQuZ3JlZ3MsCisgICAgICAgICBzaXplb2YgKGdkYl9ncmVnc2V0X3QpKTsKKyAgICB9CisgIGZpbGxfZ3JlZ3NldCAoJmdyZWcuZ3JlZ3NldCwgcmVnbm8pOworICBncmVnLmNtZCA9IFBDU1JFRzsKKyAgd3JpdGUgKHBpLT5jdGxfZmQsICZncmVnLCBzaXplb2YgKGdyZWcpKTsKKyNlbHNlIC8qIFBST0NGU19VU0VfUkVBRF9XUklURSAqLworICBpZiAocmVnbm8gIT0gLTEpCisgICAgeworICAgICAgaW9jdGwgKHBpLT5jdGxfZmQsIFBJT0NHUkVHLCAmcGktPmdyZWdzZXQuZ3JlZ3NldCk7CisgICAgfQorICBmaWxsX2dyZWdzZXQgKCZwaS0+Z3JlZ3NldC5ncmVnc2V0LCByZWdubyk7CisgIGlvY3RsIChwaS0+Y3RsX2ZkLCBQSU9DU1JFRywgJnBpLT5ncmVnc2V0LmdyZWdzZXQpOworI2VuZGlmIC8qIFBST0NGU19VU0VfUkVBRF9XUklURSAqLworCisjaWYgZGVmaW5lZCAoRlAwX1JFR05VTSkKKworICAvKiBOb3cgcmVwZWF0IGV2ZXJ5dGhpbmcgdXNpbmcgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHNldCwgaWYgdGhlCisgICAgIHRhcmdldCBoYXMgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUuIFNpbmNlIHdlIGlnbm9yZSB0aGUgcmV0dXJuZWQgdmFsdWUsCisgICAgIHdlJ2xsIG5ldmVyIGtub3cgd2hldGhlciBpdCB3b3JrZWQgb3Igbm90IGFueXdheS4gKi8KKworI2lmZGVmIFBST0NGU19VU0VfUkVBRF9XUklURQorICBpZiAocmVnbm8gIT0gLTEpCisgICAgeworICAgICAgcHJvY2ZzX3JlYWRfc3RhdHVzIChwaSk7CisgICAgICBtZW1jcHkgKChjaGFyICopICZmcHJlZy5mcHJlZ3NldCwKKyAgICAgICAgICAoY2hhciAqKSAmcGktPnByc3RhdHVzLnByX2x3cC5wcl9jb250ZXh0LnVjX21jb250ZXh0LmZwcmVncywKKyAgICAgICAgICBzaXplb2YgKGdkYl9mcHJlZ3NldF90KSk7CisgICAgfQorICBmaWxsX2ZwcmVnc2V0ICgmZnByZWcuZnByZWdzZXQsIHJlZ25vKTsKKyAgZnByZWcuY21kID0gUENTRlBSRUc7CisgIHdyaXRlIChwaS0+Y3RsX2ZkLCAmZnByZWcsIHNpemVvZiAoZnByZWcpKTsKKyNlbHNlIC8qIFBST0NGU19VU0VfUkVBRF9XUklURSAqLworICBpZiAocmVnbm8gIT0gLTEpCisgICAgeworICAgICAgaW9jdGwgKHBpLT5jdGxfZmQsIFBJT0NHRlBSRUcsICZwaS0+ZnByZWdzZXQuZnByZWdzZXQpOworICAgIH0KKyAgZmlsbF9mcHJlZ3NldCAoJnBpLT5mcHJlZ3NldC5mcHJlZ3NldCwgcmVnbm8pOworICBpb2N0bCAocGktPmN0bF9mZCwgUElPQ1NGUFJFRywgJnBpLT5mcHJlZ3NldC5mcHJlZ3NldCk7CisjZW5kaWYgLyogUFJPQ0ZTX1VTRV9SRUFEX1dSSVRFICovCisKKyNlbmRpZgkvKiBGUDBfUkVHTlVNICovCisKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWluaXRfcHJvY2luZm8gLSBzZXR1cCBhIHByb2NpbmZvIHN0cnVjdCBhbmQgY29ubmVjdCBpdCB0byBhIHByb2Nlc3MKKworU1lOT1BTSVMKKworCXN0cnVjdCBwcm9jaW5mbyAqIGluaXRfcHJvY2luZm8gKGludCBwaWQpCisKK0RFU0NSSVBUSU9OCisKKwlBbGxvY2F0ZSBhIHByb2NpbmZvIHN0cnVjdHVyZSwgb3BlbiB0aGUgL3Byb2MgZmlsZSBhbmQgdGhlbiBzZXQgdXAgdGhlCisJc2V0IG9mIHNpZ25hbHMgYW5kIGZhdWx0cyB0aGF0IGFyZSB0byBiZSB0cmFjZWQuICBSZXR1cm5zIGEgcG9pbnRlciB0bworCXRoZSBuZXcgcHJvY2luZm8gc3RydWN0dXJlLiAgCisKK05PVEVTCisKKwlJZiBwcm9jX2luaXRfZmFpbGVkIGV2ZXIgZ2V0cyBjYWxsZWQsIGNvbnRyb2wgcmV0dXJucyB0byB0aGUgY29tbWFuZAorCXByb2Nlc3NpbmcgbG9vcCB2aWEgdGhlIHN0YW5kYXJkIGVycm9yIGhhbmRsaW5nIGNvZGUuCisKKyAqLworCitzdGF0aWMgc3RydWN0IHByb2NpbmZvICoKK2luaXRfcHJvY2luZm8gKHBpZCwga2lsbCkKKyAgICAgaW50IHBpZDsKKyAgICAgaW50IGtpbGw7Cit7CisgIHN0cnVjdCBwcm9jaW5mbyAqcGkgPSAoc3RydWN0IHByb2NpbmZvICopIAorICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHByb2NpbmZvKSk7CisgIHN0cnVjdCBzaWdfY3RsICBzY3RsOworICBzdHJ1Y3QgZmx0X2N0bCAgZmN0bDsKKworICBtZW1zZXQgKChjaGFyICopIHBpLCAwLCBzaXplb2YgKCpwaSkpOworICBpZiAoIW9wZW5fcHJvY19maWxlIChwaWQsIHBpLCBPX1JEV1IsIDEpKQorICAgIHByb2NfaW5pdF9mYWlsZWQgKHBpLCAiY2FuJ3Qgb3BlbiBwcm9jZXNzIGZpbGUiLCBraWxsKTsKKworICAvKiBvcGVuX3Byb2NfZmlsZSBtYXkgbW9kaWZ5IHBpZC4gICovCisKKyAgcGlkID0gcGkgLT4gcGlkOworCisgIC8qIEFkZCBuZXcgcHJvY2VzcyB0byBwcm9jZXNzIGluZm8gbGlzdCAqLworCisgIHBpLT5uZXh0ID0gcHJvY2luZm9fbGlzdDsKKyAgcHJvY2luZm9fbGlzdCA9IHBpOworCisgIGFkZF9mZCAocGkpOwkJCS8qIEFkZCB0byBsaXN0IGZvciBwb2xsL3NlbGVjdCAqLworCisgIC8qICBSZW1lbWJlciBzb21lIHRoaW5ncyBhYm91dCB0aGUgaW5mZXJpb3IgdGhhdCB3ZSB3aWxsLCBvciBtaWdodCwgY2hhbmdlCisgICAgICBzbyB0aGF0IHdlIGNhbiByZXN0b3JlIHRoZW0gd2hlbiB3ZSBkZXRhY2guICovCisjaWZkZWYgVU5JWFdBUkUKKyAgbWVtY3B5ICgoY2hhciAqKSAmcGktPnNhdmVkX3RyYWNlLnNpZ3NldCwKKwkgIChjaGFyICopICZwaS0+cHJzdGF0dXMucHJfc2lndHJhY2UsIHNpemVvZiAoc2lnc2V0X3QpKTsKKyAgbWVtY3B5ICgoY2hhciAqKSAmcGktPnNhdmVkX2ZsdHNldC5mbHRzZXQsCisJICAoY2hhciAqKSAmcGktPnByc3RhdHVzLnByX2ZsdHRyYWNlLCBzaXplb2YgKGZsdHNldF90KSk7CisgIG1lbWNweSAoKGNoYXIgKikgJnBpLT5zYXZlZF9lbnRyeXNldC5zeXNzZXQsCisJICAoY2hhciAqKSAmcGktPnByc3RhdHVzLnByX3N5c2VudHJ5LCBzaXplb2YgKHN5c3NldF90KSk7CisgIG1lbWNweSAoKGNoYXIgKikgJnBpLT5zYXZlZF9leGl0c2V0LnN5c3NldCwKKwkgIChjaGFyICopICZwaS0+cHJzdGF0dXMucHJfc3lzZXhpdCwgc2l6ZW9mIChzeXNzZXRfdCkpOworCisgIC8qIFNldCB1cCB0cmFjZSBhbmQgZmF1bHQgc2V0cywgYXMgZ2RiIGV4cGVjdHMgdGhlbS4gKi8KKworICBwcmZpbGxzZXQgKCZzY3RsLnNpZ3NldCk7CisgIG5vdGljZV9zaWduYWxzIChwaSwgJnNjdGwpOworICBwcmZpbGxzZXQgKCZmY3RsLmZsdHNldCk7CisgIHByZGVsc2V0ICgmZmN0bC5mbHRzZXQsIEZMVFBBR0UpOworCisjZWxzZSAvKiAhIFVOSVhXQVJFICovCisgIGlvY3RsIChwaS0+Y3RsX2ZkLCBQSU9DR1RSQUNFLCAmcGktPnNhdmVkX3RyYWNlLnNpZ3NldCk7CisgIGlvY3RsIChwaS0+Y3RsX2ZkLCBQSU9DR0hPTEQsICZwaS0+c2F2ZWRfc2lnaG9sZC5zaWdzZXQpOworICBpb2N0bCAocGktPmN0bF9mZCwgUElPQ0dGQVVMVCwgJnBpLT5zYXZlZF9mbHRzZXQuZmx0c2V0KTsKKyAgaW9jdGwgKHBpLT5jdGxfZmQsIFBJT0NHRU5UUlksICZwaS0+c2F2ZWRfZW50cnlzZXQuc3lzc2V0KTsKKyAgaW9jdGwgKHBpLT5jdGxfZmQsIFBJT0NHRVhJVCwgJnBpLT5zYXZlZF9leGl0c2V0LnN5c3NldCk7CisgIAorICAvKiBTZXQgdXAgdHJhY2UgYW5kIGZhdWx0IHNldHMsIGFzIGdkYiBleHBlY3RzIHRoZW0uICovCisgIAorICBtZW1zZXQgKChjaGFyICopICZwaS0+cHJydW4sIDAsIHNpemVvZiAocGktPnBycnVuKSk7CisgIHByZmlsbHNldCAoJnBpLT5wcnJ1bi5wcl90cmFjZSk7CisgIHByb2Nmc19ub3RpY2Vfc2lnbmFscyAocGlkKTsKKyAgcHJmaWxsc2V0ICgmcGktPnBycnVuLnByX2ZhdWx0KTsKKyAgcHJkZWxzZXQgKCZwaS0+cHJydW4ucHJfZmF1bHQsIEZMVFBBR0UpOworI2lmZGVmIFBST0NGU19ET05UX1RSQUNFX0ZBVUxUUworICBwcmVtcHR5c2V0ICgmcGktPnBycnVuLnByX2ZhdWx0KTsKKyNlbmRpZgorI2VuZGlmIC8qIFVOSVhXQVJFICovCisKKyAgaWYgKCFwcm9jZnNfcmVhZF9zdGF0dXMgKHBpKSkKKyAgICBwcm9jX2luaXRfZmFpbGVkIChwaSwgInByb2Nmc19yZWFkX3N0YXR1cyBmYWlsZWQiLCBraWxsKTsKKworICByZXR1cm4gcGk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwljcmVhdGVfcHJvY2luZm8gLSBpbml0aWFsaXplIGFjY2VzcyB0byBhIC9wcm9jIGVudHJ5CisKK1NZTk9QU0lTCisKKwlzdHJ1Y3QgcHJvY2luZm8gKiBjcmVhdGVfcHJvY2luZm8gKGludCBwaWQpCisKK0RFU0NSSVBUSU9OCisKKwlBbGxvY2F0ZSBhIHByb2NpbmZvIHN0cnVjdHVyZSwgb3BlbiB0aGUgL3Byb2MgZmlsZSBhbmQgdGhlbiBzZXQgdXAgdGhlCisJc2V0IG9mIHNpZ25hbHMgYW5kIGZhdWx0cyB0aGF0IGFyZSB0byBiZSB0cmFjZWQuICBSZXR1cm5zIGEgcG9pbnRlciB0bworCXRoZSBuZXcgcHJvY2luZm8gc3RydWN0dXJlLgorCitOT1RFUworCisJSWYgcHJvY19pbml0X2ZhaWxlZCBldmVyIGdldHMgY2FsbGVkLCBjb250cm9sIHJldHVybnMgdG8gdGhlIGNvbW1hbmQKKwlwcm9jZXNzaW5nIGxvb3AgdmlhIHRoZSBzdGFuZGFyZCBlcnJvciBoYW5kbGluZyBjb2RlLgorCisgKi8KKworc3RhdGljIHN0cnVjdCBwcm9jaW5mbyAqCitjcmVhdGVfcHJvY2luZm8gKHBpZCkKKyAgICAgaW50IHBpZDsKK3sKKyAgc3RydWN0IHByb2NpbmZvICpwaTsKKyAgc3RydWN0IHNpZ19jdGwgIHNjdGw7CisgIHN0cnVjdCBmbHRfY3RsICBmY3RsOworCisgIHBpID0gZmluZF9wcm9jaW5mbyAocGlkLCAxKTsKKyAgaWYgKHBpICE9IE5VTEwpCisgICAgcmV0dXJuIHBpOwkJCS8qIEFsbCBkb25lISAgSXQgYWxyZWFkeSBleGlzdHMgKi8KKworICBwaSA9IGluaXRfcHJvY2luZm8gKHBpZCwgMSk7CisKKyNpZm5kZWYgVU5JWFdBUkUKKy8qIEEgYnVnIGluIFNvbGFyaXMgKDIuNSBhdCBsZWFzdCkgY2F1c2VzIFBJT0NXU1RPUCB0byBoYW5nIG9uIExXUHMgdGhhdCBhcmUKKyAgIGFscmVhZHkgc3RvcHBlZCwgZXZlbiBpZiB0aGV5IGFsbCBoYXZlIFBSX0FTWU5DIHNldC4gICovCisgIGlmICghKHBpLT5wcnN0YXR1cy5wcl9mbGFncyAmIFBSX1NUT1BQRUQpKQorI2VuZGlmCisgICAgaWYgKCFwcm9jZnNfd3JpdGVfcGN3c3RvcCAocGkpKQorICAgICAgcHJvY19pbml0X2ZhaWxlZCAocGksICJwcm9jZnNfd3JpdGVfcGN3c3RvcCBmYWlsZWQiLCAxKTsKKworI2lmZGVmIFBST0NGU19VU0VfUkVBRF9XUklURQorICBmY3RsLmNtZCA9IFBDU0ZBVUxUOworICBpZiAod3JpdGUgKHBpLT5jdGxfZmQsIChjaGFyICopICZmY3RsLCBzaXplb2YgKHN0cnVjdCBmbHRfY3RsKSkgPCAwKQorICAgIHByb2NfaW5pdF9mYWlsZWQgKHBpLCAiUENTRkFVTFQgZmFpbGVkIiwgMSk7CisjZWxzZQorICBpZiAoaW9jdGwgKHBpLT5jdGxfZmQsIFBJT0NTRkFVTFQsICZwaS0+cHJydW4ucHJfZmF1bHQpIDwgMCkKKyAgICBwcm9jX2luaXRfZmFpbGVkIChwaSwgIlBJT0NTRkFVTFQgZmFpbGVkIiwgMSk7CisjZW5kaWYKKworICByZXR1cm4gcGk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlwcm9jZnNfZXhpdF9oYW5kbGVyIC0gaGFuZGxlIGVudHJ5IGludG8gdGhlIF9leGl0IHN5c2NhbGwKKworU1lOT1BTSVMKKworCWludCBwcm9jZnNfZXhpdF9oYW5kbGVyIChwaSwgc3lzY2FsbF9udW0sIHdoeSwgcnRudmFscCwgc3RhdHZhbHApCisKK0RFU0NSSVBUSU9OCisKKwlUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYW4gaW5mZXJpb3IgcHJvY2VzcyBlbnRlcnMgdGhlIF9leGl0KCkKKwlzeXN0ZW0gY2FsbC4gIEl0IGNvbnRpbnVlcyB0aGUgcHJvY2VzcywgYW5kIHRoZW4gY29sbGVjdHMgdGhlIGV4aXQKKwlzdGF0dXMgYW5kIHBpZCB3aGljaCBhcmUgcmV0dXJuZWQgaW4gKnN0YXR2YWxwIGFuZCAqcnRudmFscC4gIEFmdGVyCisJdGhhdCBpdCByZXR1cm5zIG5vbi16ZXJvIHRvIGluZGljYXRlIHRoYXQgcHJvY2ZzX3dhaXQgc2hvdWxkIHdha2UgdXAuCisKK05PVEVTCisJVGhlcmUgaXMgcHJvYmFibHkgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMuCisKKyAqLworCitzdGF0aWMgaW50Citwcm9jZnNfZXhpdF9oYW5kbGVyIChwaSwgc3lzY2FsbF9udW0sIHdoeSwgcnRudmFscCwgc3RhdHZhbHApCisgICAgIHN0cnVjdCBwcm9jaW5mbyAqcGk7CisgICAgIGludCBzeXNjYWxsX251bTsKKyAgICAgaW50IHdoeTsKKyAgICAgaW50ICpydG52YWxwOworICAgICBpbnQgKnN0YXR2YWxwOworeworICBzdHJ1Y3QgcHJvY2luZm8gKnRlbXBfcGksICpuZXh0X3BpOworICBzdHJ1Y3QgcHJvY19jdGwgcGN0bDsKKworI2lmZGVmIFVOSVhXQVJFCisgIHBjdGwuY21kID0gUENSVU47CisgIHBjdGwuZGF0YSA9IFBSQ0ZBVUxUOworI2Vsc2UKKyAgcGktPnBycnVuLnByX2ZsYWdzID0gUFJDRkFVTFQ7CisjZW5kaWYKKworI2lmZGVmIFBST0NGU19VU0VfUkVBRF9XUklURQorICBpZiAod3JpdGUgKHBpLT5jdGxfZmQsIChjaGFyICopJnBjdGwsIHNpemVvZiAoc3RydWN0IHByb2NfY3RsKSkgPCAwKQorI2Vsc2UKKyAgaWYgKGlvY3RsIChwaS0+Y3RsX2ZkLCBQSU9DUlVOLCAmcGktPnBycnVuKSAhPSAwKQorI2VuZGlmCisgICAgcGVycm9yX3dpdGhfbmFtZSAocGktPnBhdGhuYW1lKTsKKworICBpZiAoYXR0YWNoX2ZsYWcpCisgICAgeworICAgICAgLyogQ2xhaW0gaXQgZXhpdGVkIChkb24ndCBjYWxsIHdhaXQpLiAqLworICAgICAgaWYgKGluZm9fdmVyYm9zZSkKKwlwcmludGZfZmlsdGVyZWQgKCIoYXR0YWNoZWQgcHJvY2VzcyBoYXMgZXhpdGVkKVxuIik7CisgICAgICAqc3RhdHZhbHAgPSAwOworICAgICAgKnJ0bnZhbHAgID0gaW5mZXJpb3JfcGlkOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICpydG52YWxwID0gd2FpdCAoc3RhdHZhbHApOworICAgICAgaWYgKCpydG52YWxwID49IDApCisJKnJ0bnZhbHAgPSBwaS0+cGlkOworICAgIH0KKworICAvKiBDbG9zZSBBTEwgb3BlbiBwcm9jIGZpbGUgaGFuZGxlcywKKyAgICAgZXhjZXB0IHRoZSBvbmUgdGhhdCBjYWxsZWQgU1lTX2V4aXQuICovCisgIGZvciAodGVtcF9waSA9IHByb2NpbmZvX2xpc3Q7IHRlbXBfcGk7IHRlbXBfcGkgPSBuZXh0X3BpKQorICAgIHsKKyAgICAgIG5leHRfcGkgPSB0ZW1wX3BpLT5uZXh0OworICAgICAgaWYgKHRlbXBfcGkgPT0gcGkpCisJY29udGludWU7CQkvKiBIYW5kbGVkIGJlbG93ICovCisgICAgICBjbG9zZV9wcm9jX2ZpbGUgKHRlbXBfcGkpOworICAgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlwcm9jZnNfZXhlY19oYW5kbGVyIC0gaGFuZGxlIGV4aXQgZnJvbSB0aGUgZXhlYyBmYW1pbHkgb2Ygc3lzY2FsbHMKKworU1lOT1BTSVMKKworCWludCBwcm9jZnNfZXhlY19oYW5kbGVyIChwaSwgc3lzY2FsbF9udW0sIHdoeSwgcnRudmFscCwgc3RhdHZhbHApCisKK0RFU0NSSVBUSU9OCisKKwlUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYW4gaW5mZXJpb3IgcHJvY2VzcyBpcyBhYm91dCB0byBmaW5pc2ggYW55CisJb2YgdGhlIGV4ZWMoKSBmYW1pbHkgb2YJc3lzdGVtIGNhbGxzLiAgSXQgcHJldGVuZHMgdGhhdCB3ZSBnb3QgYQorCVNJR1RSQVAgKGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHRyYWNlIGJlaGF2aW9yKSwgYW5kIHJldHVybnMgbm9uLXplcm8KKwl0byB0ZWxsIHByb2Nmc193YWl0IHRvIHdha2UgdXAuCisKK05PVEVTCisJVGhpcyBuZWVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHRyYWNlIGlzIHF1ZXN0aW9uYWJsZS4gIEluIHRoZQorCWZ1dHVyZSwgaXQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeS4KKworICovCisKK3N0YXRpYyBpbnQKK3Byb2Nmc19leGVjX2hhbmRsZXIgKHBpLCBzeXNjYWxsX251bSwgd2h5LCBydG52YWxwLCBzdGF0dmFscCkKKyAgICAgc3RydWN0IHByb2NpbmZvICpwaTsKKyAgICAgaW50IHN5c2NhbGxfbnVtOworICAgICBpbnQgd2h5OworICAgICBpbnQgKnJ0bnZhbHA7CisgICAgIGludCAqc3RhdHZhbHA7Cit7CisgICpzdGF0dmFscCA9IChTSUdUUkFQIDw8IDgpIHwgMDE3NzsKKworICByZXR1cm4gMTsKK30KKworI2lmIGRlZmluZWQoU1lTX3Nwcm9jKSAmJiAhZGVmaW5lZChVTklYV0FSRSkKKy8qIElSSVggbHdwIGNyZWF0aW9uIHN5c3RlbSBjYWxsICovCisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlwcm9jZnNfc3Byb2NfaGFuZGxlciAtIGhhbmRsZSBleGl0IGZyb20gdGhlIHNwcm9jIHN5c2NhbGwKKworU1lOT1BTSVMKKworCWludCBwcm9jZnNfc3Byb2NfaGFuZGxlciAocGksIHN5c2NhbGxfbnVtLCB3aHksIHJ0bnZhbHAsIHN0YXR2YWxwKQorCitERVNDUklQVElPTgorCisJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIGFuIGluZmVyaW9yIHByb2Nlc3MgaXMgYWJvdXQgdG8gZmluaXNoIGFuCisJc3Byb2MoKSBzeXN0ZW0gY2FsbC4gIFRoaXMgaXMgdGhlIHN5c3RlbSBjYWxsIHRoYXQgSVJJWCB1c2VzIHRvIGNyZWF0ZQorCWEgbGlnaHR3ZWlnaHQgcHJvY2Vzcy4gIFdoZW4gdGhlIHRhcmdldCBwcm9jZXNzIGdldHMgdGhpcyBldmVudCwgd2UgY2FuCisJbG9vayBhdCBydmFsMSB0byBmaW5kIHRoZSBuZXcgY2hpbGQgcHJvY2Vzc2VzIElELCBhbmQgY3JlYXRlIGEgbmV3CisJcHJvY2luZm8gc3RydWN0IGZyb20gdGhhdC4KKworCUFmdGVyIHRoYXQsIGl0IHByZXRlbmRzIHRoYXQgd2UgZ290IGEgU0lHVFJBUCwgYW5kIHJldHVybnMgbm9uLXplcm8KKwl0byB0ZWxsIHByb2Nmc193YWl0IHRvIHdha2UgdXAuICBTdWJzZXF1ZW50bHksIHdhaXRfZm9yX2luZmVyaW9yIGdldHMKKwl3b2tlbiB1cCwgc2VlcyB0aGUgbmV3IHByb2Nlc3MgYW5kIGNvbnRpbnVlcyBpdC4KKworTk9URVMKKwlXZSBhY3R1YWxseSBuZXZlciBzZWUgdGhlIGNoaWxkIGV4aXRpbmcgZnJvbSBzcHJvYyBiZWNhdXNlIHdlIHdpbGwKKwlzaG9ydGx5IHN0b3AgdGhlIGNoaWxkIHdpdGggUElPQ1NUT1AsIHdoaWNoIGlzIHRoZW4gcmVnaXN0ZXJlZCBhcyB0aGUKKwlldmVudCBvZiBpbnRlcmVzdC4KKyAqLworCitzdGF0aWMgaW50Citwcm9jZnNfc3Byb2NfaGFuZGxlciAocGksIHN5c2NhbGxfbnVtLCB3aHksIHJ0bnZhbHAsIHN0YXR2YWxwKQorICAgICBzdHJ1Y3QgcHJvY2luZm8gKnBpOworICAgICBpbnQgc3lzY2FsbF9udW07CisgICAgIGludCB3aHk7CisgICAgIGludCAqcnRudmFscDsKKyAgICAgaW50ICpzdGF0dmFscDsKK3sKKy8qIFdlJ3ZlIGp1c3QgZGV0ZWN0ZWQgdGhlIGNvbXBsZXRpb24gb2YgYW4gc3Byb2Mgc3lzdGVtIGNhbGwuICBOb3cgd2UgbmVlZCB0bworICAgc2V0dXAgYSBwcm9jaW5mbyBzdHJ1Y3QgZm9yIHRoaXMgdGhyZWFkLCBhbmQgbm90aWZ5IHRoZSB0aHJlYWQgc3lzdGVtIG9mIHRoZQorICAgbmV3IGFycml2YWwuICAqLworCisvKiBJZiBzcHJvYyBmYWlsZWQsIHRoZW4gbm90aGluZyBpbnRlcmVzdGluZyBoYXBwZW5lZC4gIENvbnRpbnVlIHRoZSBwcm9jZXNzCisgICBhbmQgZ28gYmFjayB0byBzbGVlcC4gKi8KKworICBpZiAocGktPnByc3RhdHVzLnByX2Vycm5vICE9IDApCisgICAgeworICAgICAgcGktPnBycnVuLnByX2ZsYWdzICY9IFBSU1RFUDsKKyAgICAgIHBpLT5wcnJ1bi5wcl9mbGFncyB8PSBQUkNGQVVMVDsKKworICAgICAgaWYgKGlvY3RsIChwaS0+Y3RsX2ZkLCBQSU9DUlVOLCAmcGktPnBycnVuKSAhPSAwKQorCXBlcnJvcl93aXRoX25hbWUgKHBpLT5wYXRobmFtZSk7CisKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBBdCB0aGlzIHBvaW50LCB0aGUgbmV3IHRocmVhZCBpcyBzdG9wcGVkIGF0IGl0J3MgZmlyc3QgaW5zdHJ1Y3Rpb24sIGFuZAorICAgICB0aGUgcGFyZW50IGlzIHN0b3BwZWQgYXQgdGhlIGV4aXQgZnJvbSBzcHJvYy4gICovCisKKyAgLyogTm90aWZ5IHRoZSBjYWxsZXIgb2YgdGhlIGFycml2YWwgb2YgYSBuZXcgdGhyZWFkLiAqLworICBjcmVhdGVfcHJvY2luZm8gKHBpLT5wcnN0YXR1cy5wcl9ydmFsMSk7CisKKyAgKnJ0bnZhbHAgPSBwaS0+cHJzdGF0dXMucHJfcnZhbDE7CisgICpzdGF0dmFscCA9IChTSUdUUkFQIDw8IDgpIHwgMDE3NzsKKworICByZXR1cm4gMTsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCXByb2Nmc19mb3JrX2hhbmRsZXIgLSBoYW5kbGUgZXhpdCBmcm9tIHRoZSBmb3JrIHN5c2NhbGwKKworU1lOT1BTSVMKKworCWludCBwcm9jZnNfZm9ya19oYW5kbGVyIChwaSwgc3lzY2FsbF9udW0sIHdoeSwgcnRudmFscCwgc3RhdHZhbHApCisKK0RFU0NSSVBUSU9OCisKKwlUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYW4gaW5mZXJpb3IgcHJvY2VzcyBpcyBhYm91dCB0byBmaW5pc2ggYQorCWZvcmsoKSBzeXN0ZW0gY2FsbC4gIFdlIHdpbGwgb3BlbiB1cCB0aGUgbmV3IHByb2Nlc3MsIGFuZCB0aGVuIGNsb3NlCisJaXQsIHdoaWNoIHJlbGVhc2VzIGl0IGZyb20gdGhlIGNsdXRjaGVzIG9mIHRoZSBkZWJ1Z2dlci4KKworCUFmdGVyIHRoYXQsIHdlIGNvbnRpbnVlIHRoZSB0YXJnZXQgcHJvY2VzcyBhcyB0aG91Z2ggbm90aGluZyBoYWQKKwloYXBwZW5lZC4KKworTk9URVMKKwlUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgSVJJWCBiZWNhdXNlIHdlIGhhdmUgdG8gc2V0IFBSX0ZPUksgaW4gb3JkZXIKKwl0byBjYXRjaCB0aGUgY3JlYXRpb24gb2YgbHdwcyAodmlhIHNwcm9jKCkpLiAgV2hlbiBhbiBhY3R1YWwgZm9yaworCW9jY3VycywgaXQgYmVjb21lcyBuZWNlc3NhcnkgdG8gcmVzZXQgdGhlIGZvcmtzIGRlYnVnZ2VyIGZsYWdzIGFuZAorCWNvbnRpbnVlIGl0IGJlY2F1c2Ugd2UgY2FuJ3QgaGFjayBtdWx0aXBsZSBwcm9jZXNzZXMgeWV0LgorICovCisKK3N0YXRpYyBpbnQKK3Byb2Nmc19mb3JrX2hhbmRsZXIgKHBpLCBzeXNjYWxsX251bSwgd2h5LCBydG52YWxwLCBzdGF0dmFscCkKKyAgICAgc3RydWN0IHByb2NpbmZvICpwaTsKKyAgICAgaW50IHN5c2NhbGxfbnVtOworICAgICBpbnQgd2h5OworICAgICBpbnQgKnJ0bnZhbHA7CisgICAgIGludCAqc3RhdHZhbHA7Cit7CisgIHN0cnVjdCBwcm9jaW5mbyAqcGl0ZW1wOworCisvKiBBdCB0aGlzIHBvaW50LCB3ZSd2ZSBkZXRlY3RlZCB0aGUgY29tcGxldGlvbiBvZiBhIGZvcmsgKG9yIHZmb3JrKSBjYWxsIGluCisgICBvdXIgY2hpbGQuICBUaGUgZ3JhbmRjaGlsZCBpcyBhbHNvIHN0b3BwZWQgYmVjYXVzZSB3ZSBzZXQgaW5oZXJpdC1vbi1mb3JrCisgICBlYXJsaWVyLiAgKE5vdGUgdGhhdCBub2JvZHkgaGFzIHRoZSBncmFuZGNoaWxkcycgL3Byb2MgZmlsZSBvcGVuIGF0IHRoaXMKKyAgIHBvaW50LikgIFdlIHdpbGwgcmVsZWFzZSB0aGUgZ3JhbmRjaGlsZCBmcm9tIHRoZSBkZWJ1Z2dlciBieSBvcGVuaW5nIGl0J3MKKyAgIC9wcm9jIGZpbGUgYW5kIHRoZW4gY2xvc2luZyBpdC4gIFNpbmNlIHJ1bi1vbi1sYXN0LWNsb3NlIGlzIHNldCwgdGhlCisgICBncmFuZGNoaWxkIGNvbnRpbnVlcyBvbiBpdHMnIG1lcnJ5IHdheS4gICovCisKKworICBwaXRlbXAgPSBjcmVhdGVfcHJvY2luZm8gKHBpLT5wcnN0YXR1cy5wcl9ydmFsMSk7CisgIGlmIChwaXRlbXApCisgICAgY2xvc2VfcHJvY19maWxlIChwaXRlbXApOworCisgIGlmIChpb2N0bCAocGktPmN0bF9mZCwgUElPQ1JVTiwgJnBpLT5wcnJ1bikgIT0gMCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lIChwaS0+cGF0aG5hbWUpOworCisgIHJldHVybiAwOworfQorI2VuZGlmIC8qIFNZU19zcHJvYyAmJiAhVU5JWFdBUkUgKi8KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCXByb2Nmc19zZXRfaW5mZXJpb3Jfc3lzY2FsbF90cmFwcyAtIHNldHVwIHRoZSBzeXNjYWxsIHRyYXBzIAorCitTWU5PUFNJUworCisJdm9pZCBwcm9jZnNfc2V0X2luZmVyaW9yX3N5c2NhbGxfdHJhcHMgKHN0cnVjdCBwcm9jaW5mbyAqcGlwKQorCitERVNDUklQVElPTgorCisJQ2FsbGVkIGZvciBlYWNoICJwcm9jaW5mbyIgKHByb2Nlc3MsIHRocmVhZCwgb3IgTFdQKSBpbiB0aGUKKwlpbmZlcmlvciwgdG8gcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiBvZiBhbmQgaGFuZGxlcnMgZm9yCisJc3lzY2FsbCB0cmFwcyBpbiB0aGUgaW5mZXJpb3IuCisKKyAqLworCitzdGF0aWMgdm9pZAorcHJvY2ZzX3NldF9pbmZlcmlvcl9zeXNjYWxsX3RyYXBzIChwaXApCisgICAgIHN0cnVjdCBwcm9jaW5mbyAqcGlwOworeworICBwcm9jZnNfc2V0X3N5c2NhbGxfdHJhcCAocGlwLCBTWVNfZXhpdCwgUFJPQ0ZTX1NZU0NBTExfRU5UUlksCisJCQkgICBwcm9jZnNfZXhpdF9oYW5kbGVyKTsKKworI2lmbmRlZiBQUkZTX1NUT1BFWEVDCisjaWZkZWYgU1lTX2V4ZWMKKyAgcHJvY2ZzX3NldF9zeXNjYWxsX3RyYXAgKHBpcCwgU1lTX2V4ZWMsIFBST0NGU19TWVNDQUxMX0VYSVQsCisJCQkgICBwcm9jZnNfZXhlY19oYW5kbGVyKTsKKyNlbmRpZgorI2lmZGVmIFNZU19leGVjdgorICBwcm9jZnNfc2V0X3N5c2NhbGxfdHJhcCAocGlwLCBTWVNfZXhlY3YsIFBST0NGU19TWVNDQUxMX0VYSVQsCisJCQkgICBwcm9jZnNfZXhlY19oYW5kbGVyKTsKKyNlbmRpZgorI2lmZGVmIFNZU19leGVjdmUKKyAgcHJvY2ZzX3NldF9zeXNjYWxsX3RyYXAgKHBpcCwgU1lTX2V4ZWN2ZSwgUFJPQ0ZTX1NZU0NBTExfRVhJVCwKKwkJCSAgIHByb2Nmc19leGVjX2hhbmRsZXIpOworI2VuZGlmCisjZW5kaWYgIC8qIFBSRlNfU1RPUEVYRUMgKi8KKworICAvKiBTZXR1cCB0cmFwcyBvbiBleGl0IGZyb20gc3Byb2MoKSAqLworCisjaWZkZWYgU1lTX3Nwcm9jCisgIHByb2Nmc19zZXRfc3lzY2FsbF90cmFwIChwaXAsIFNZU19zcHJvYywgUFJPQ0ZTX1NZU0NBTExfRVhJVCwKKwkJCSAgIHByb2Nmc19zcHJvY19oYW5kbGVyKTsKKyAgcHJvY2ZzX3NldF9zeXNjYWxsX3RyYXAgKHBpcCwgU1lTX2ZvcmssIFBST0NGU19TWVNDQUxMX0VYSVQsCisJCQkgICBwcm9jZnNfZm9ya19oYW5kbGVyKTsKKyNpZmRlZiBTWVNfdmZvcmsKKyAgcHJvY2ZzX3NldF9zeXNjYWxsX3RyYXAgKHBpcCwgU1lTX3Zmb3JrLCBQUk9DRlNfU1lTQ0FMTF9FWElULAorCQkJICAgcHJvY2ZzX2ZvcmtfaGFuZGxlcik7CisjZW5kaWYKKy8qIFR1cm4gb24gaW5oZXJpdC1vbi1mb3JrIGZsYWcgc28gdGhhdCBhbGwgY2hpbGRyZW4gb2YgdGhlIHRhcmdldCBwcm9jZXNzCisgICBzdGFydCB3aXRoIHRyYWNpbmcgZmxhZ3Mgc2V0LiAgVGhpcyBhbGxvd3MgdXMgdG8gdHJhcCBsd3AgY3JlYXRpb24uICBOb3RlCisgICB0aGF0IHdlIGFsc28gaGF2ZSB0byB0cmFwIG9uIGZvcmsgYW5kIHZmb3JrIGluIG9yZGVyIHRvIGRpc2FibGUgYWxsIHRyYWNpbmcKKyAgIGluIHRoZSB0YXJnZXRzIGNoaWxkIHByb2Nlc3Nlcy4gICovCisKKyAgbW9kaWZ5X2luaGVyaXRfb25fZm9ya19mbGFnIChwaXAtPmN0bF9mZCwgMSk7CisjZW5kaWYKKworI2lmZGVmIFNZU19sd3BfY3JlYXRlCisgIHByb2Nmc19zZXRfc3lzY2FsbF90cmFwIChwaXAsIFNZU19sd3BfY3JlYXRlLCBQUk9DRlNfU1lTQ0FMTF9FWElULAorCQkJICAgcHJvY2ZzX2x3cF9jcmVhdGlvbl9oYW5kbGVyKTsKKyNlbmRpZgorfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJcHJvY2ZzX2luaXRfaW5mZXJpb3IgLSBpbml0aWFsaXplIHRhcmdldCB2ZWN0b3IgYW5kIGFjY2VzcyB0byBhCisJL3Byb2MgZW50cnkKKworU1lOT1BTSVMKKworCXZvaWQgcHJvY2ZzX2luaXRfaW5mZXJpb3IgKGludCBwaWQpCisKK0RFU0NSSVBUSU9OCisKKwlXaGVuIGdkYiBzdGFydHMgYW4gaW5mZXJpb3IsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBwYXJlbnQKKwlwcm9jZXNzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmb3JrLiAgSXQgd2FpdHMgZm9yIHRoZSBjaGlsZCB0byBzdG9wCisJb24gdGhlIHJldHVybiBmcm9tIHRoZSBleGVjIHN5c3RlbSBjYWxsICh0aGUgY2hpbGQgaXRzZWxmIHRha2VzIGNhcmUKKwlvZiBlbnN1cmluZyB0aGF0IHRoaXMgaXMgc2V0IHVwKSwgdGhlbiBzZXRzIHVwIHRoZSBzZXQgb2Ygc2lnbmFscworCWFuZCBmYXVsdHMgdGhhdCBhcmUgdG8gYmUgdHJhY2VkLiAgUmV0dXJucyB0aGUgcGlkLCB3aGljaCBtYXkgaGF2ZSBoYWQKKwl0aGUgdGhyZWFkLWlkIGFkZGVkIHRvIGl0LgorCitOT1RFUworCisJSWYgcHJvY19pbml0X2ZhaWxlZCBldmVyIGdldHMgY2FsbGVkLCBjb250cm9sIHJldHVybnMgdG8gdGhlIGNvbW1hbmQKKwlwcm9jZXNzaW5nIGxvb3AgdmlhIHRoZSBzdGFuZGFyZCBlcnJvciBoYW5kbGluZyBjb2RlLgorCisgKi8KKworc3RhdGljIHZvaWQgCitwcm9jZnNfaW5pdF9pbmZlcmlvciAocGlkKQorICAgICBpbnQgcGlkOworeworICBzdHJ1Y3QgcHJvY2luZm8gKnBpcDsKKworICBwdXNoX3RhcmdldCAoJnByb2Nmc19vcHMpOworCisgIHBpcCA9IGNyZWF0ZV9wcm9jaW5mbyAocGlkKTsKKworICBwcm9jZnNfc2V0X2luZmVyaW9yX3N5c2NhbGxfdHJhcHMgKHBpcCk7CisKKyAgLyogY3JlYXRlX3Byb2NpbmZvIG1heSBjaGFuZ2UgdGhlIHBpZCwgc28gd2UgaGF2ZSB0byB1cGRhdGUgaW5mZXJpb3JfcGlkCisgICAgIGhlcmUgYmVmb3JlIGNhbGxpbmcgb3RoZXIgZ2RiIHJvdXRpbmVzIHRoYXQgbmVlZCB0aGUgcmlnaHQgcGlkLiAgKi8KKworICBwaWQgPSBwaXAgLT4gcGlkOworICBpbmZlcmlvcl9waWQgPSBwaWQ7CisKKyAgYWRkX3RocmVhZCAocGlwIC0+IHBpZCk7CS8qIFNldHVwIGluaXRpYWwgdGhyZWFkICovCisKKyNpZmRlZiBTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRAorICBzdGFydHVwX2luZmVyaW9yIChTVEFSVF9JTkZFUklPUl9UUkFQU19FWFBFQ1RFRCk7CisjZWxzZQorICAvKiBPbmUgdHJhcCB0byBleGVjIHRoZSBzaGVsbCwgb25lIHRvIGV4ZWMgdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQuICAqLworICBzdGFydHVwX2luZmVyaW9yICgyKTsKKyNlbmRpZgorfQorCisvKgorCitHTE9CQUwgRlVOQ1RJT04KKworCXByb2Nmc19ub3RpY2Vfc2lnbmFscworCitTWU5PUFNJUworCisJc3RhdGljIHZvaWQgcHJvY2ZzX25vdGljZV9zaWduYWxzIChpbnQgcGlkKTsKKworREVTQ1JJUFRJT04KKworCVdoZW4gdGhlIHVzZXIgY2hhbmdlcyB0aGUgc3RhdGUgb2YgZ2RiJ3Mgc2lnbmFsIGhhbmRsaW5nIHZpYSB0aGUKKwkiaGFuZGxlIiBjb21tYW5kLCB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHRvIHNlZSBpZiBhbnkgY2hhbmdlCisJaW4gdGhlIC9wcm9jIGludGVyZmFjZSBpcyByZXF1aXJlZC4gIEl0IGlzIGFsc28gY2FsbGVkIGludGVybmFsbHkKKwlieSBvdGhlciAvcHJvYyBpbnRlcmZhY2UgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgdGhlIHN0YXRlIG9mCisJdGhlIHRyYWNlZCBzaWduYWwgc2V0LgorCisJT25lIHRoaW5nIGl0IGRvZXMgaXMgdGhhdCBzaWduYWxzIGZvciB3aGljaCB0aGUgc3RhdGUgaXMgIm5vc3RvcCIsCisJIm5vcHJpbnQiLCBhbmQgInBhc3MiLCBoYXZlIHRoZWlyIHRyYWNlIGJpdHMgcmVzZXQgaW4gdGhlIHByX3RyYWNlCisJZmllbGQsIHNvIHRoYXQgdGhleSBhcmUgbm8gbG9uZ2VyIHRyYWNlZC4gIFRoaXMgYWxsb3dzIHRoZW0gdG8gYmUKKwlkZWxpdmVyZWQgZGlyZWN0bHkgdG8gdGhlIGluZmVyaW9yIHdpdGhvdXQgdGhlIGRlYnVnZ2VyIGV2ZXIgYmVpbmcKKwlpbnZvbHZlZC4KKyAqLworCitzdGF0aWMgdm9pZAorcHJvY2ZzX25vdGljZV9zaWduYWxzIChwaWQpCisgICAgIGludCBwaWQ7Cit7CisgIHN0cnVjdCBwcm9jaW5mbyAqcGk7CisgIHN0cnVjdCBzaWdfY3RsICBzY3RsOworCisgIHBpID0gZmluZF9wcm9jaW5mbyAocGlkLCAwKTsKKworI2lmbmRlZiBIQVZFX1BSUlVOX1QKKyAgcHJlbXB0eXNldCAoJnNjdGwuc2lnc2V0KTsKKyNlbHNlCisgIHNjdGwuc2lnc2V0ID0gcGktPnBycnVuLnByX3RyYWNlOworI2VuZGlmCisKKyAgbm90aWNlX3NpZ25hbHMgKHBpLCAmc2N0bCk7CisKKyNpZmRlZiBIQVZFX1BSUlVOX1QKKyAgcGktPnBycnVuLnByX3RyYWNlID0gc2N0bC5zaWdzZXQ7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK25vdGljZV9zaWduYWxzIChwaSwgc2N0bCkKKwlzdHJ1Y3QgcHJvY2luZm8gKnBpOworCXN0cnVjdCBzaWdfY3RsICpzY3RsOworeworICBpbnQgc2lnbm87CisKKyAgZm9yIChzaWdubyA9IDA7IHNpZ25vIDwgTlNJRzsgc2lnbm8rKykKKyAgICB7CisgICAgICBpZiAoc2lnbmFsX3N0b3Bfc3RhdGUgKHRhcmdldF9zaWduYWxfZnJvbV9ob3N0IChzaWdubykpID09IDAgJiYKKwkgIHNpZ25hbF9wcmludF9zdGF0ZSAodGFyZ2V0X3NpZ25hbF9mcm9tX2hvc3QgKHNpZ25vKSkgPT0gMCAmJgorCSAgc2lnbmFsX3Bhc3Nfc3RhdGUgKHRhcmdldF9zaWduYWxfZnJvbV9ob3N0IChzaWdubykpID09IDEpCisJeworCSAgcHJkZWxzZXQgKCZzY3RsLT5zaWdzZXQsIHNpZ25vKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcHJhZGRzZXQgKCZzY3RsLT5zaWdzZXQsIHNpZ25vKTsKKwl9CisgICAgfQorI2lmZGVmIFBST0NGU19VU0VfUkVBRF9XUklURQorICBzY3RsLT5jbWQgPSBQQ1NUUkFDRTsKKyAgaWYgKHdyaXRlIChwaS0+Y3RsX2ZkLCAoY2hhciAqKSBzY3RsLCBzaXplb2YgKHN0cnVjdCBzaWdfY3RsKSkgPCAwKQorI2Vsc2UKKyAgaWYgKGlvY3RsIChwaS0+Y3RsX2ZkLCBQSU9DU1RSQUNFLCAmc2N0bC0+c2lnc2V0KSkKKyNlbmRpZgorICAgIHsKKyAgICAgIHByaW50X3N5c19lcnJtc2cgKCJQSU9DU1RSQUNFIGZhaWxlZCIsIGVycm5vKTsKKyAgICB9Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlwcm9jX3NldF9leGVjX3RyYXAgLS0gYXJyYW5nZSBmb3IgZXhlYydkIGNoaWxkIHRvIGhhbHQgYXQgc3RhcnR1cAorCitTWU5PUFNJUworCisJdm9pZCBwcm9jX3NldF9leGVjX3RyYXAgKHZvaWQpCisKK0RFU0NSSVBUSU9OCisKKwlUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgY2hpbGQgcHJvY2VzcyB3aGVuIHN0YXJ0aW5nIHVwCisJYW4gaW5mZXJpb3IsIHByaW9yIHRvIGRvaW5nIHRoZSBleGVjIG9mIHRoZSBhY3R1YWwgaW5mZXJpb3IuCisJSXQgc2V0cyB0aGUgY2hpbGQgcHJvY2VzcydzIGV4aXRzZXQgdG8gbWFrZSBleGl0IGZyb20gdGhlIGV4ZWMKKwlzeXN0ZW0gY2FsbCBhbiBldmVudCBvZiBpbnRlcmVzdCB0byBzdG9wIG9uLCBhbmQgdGhlbiBzaW1wbHkKKwlyZXR1cm5zLiAgVGhlIGNoaWxkIGRvZXMgdGhlIGV4ZWMsIHRoZSBzeXN0ZW0gY2FsbCByZXR1cm5zLCBhbmQKKwl0aGUgY2hpbGQgc3RvcHMgYXQgdGhlIGZpcnN0IGluc3RydWN0aW9uLCByZWFkeSBmb3IgdGhlIGdkYgorCXBhcmVudCBwcm9jZXNzIHRvIHRha2UgY29udHJvbCBvZiBpdC4KKworTk9URQorCisJV2UgbmVlZCB0byB1c2UgYWxsIGxvY2FsIHZhcmlhYmxlcyBzaW5jZSB0aGUgY2hpbGQgbWF5IGJlIHNoYXJpbmcKKwlpdCdzIGRhdGEgc3BhY2Ugd2l0aCB0aGUgcGFyZW50LCBpZiB2Zm9yayB3YXMgdXNlZCByYXRoZXIgdGhhbgorCWZvcmsuCisKKwlBbHNvIG5vdGUgdGhhdCB3ZSB3YW50IHRvIHR1cm4gb2ZmIHRoZSBpbmhlcml0LW9uLWZvcmsgZmxhZyBpbgorCXRoZSBjaGlsZCBwcm9jZXNzIHNvIHRoYXQgYW55IGdyYW5kLWNoaWxkcmVuIHN0YXJ0IHdpdGggYWxsCisJdHJhY2luZyBmbGFncyBjbGVhcmVkLgorICovCisKK3N0YXRpYyB2b2lkCitwcm9jX3NldF9leGVjX3RyYXAgKCkKK3sKKyAgc3RydWN0IHN5c19jdGwgZXhpdHNldDsKKyAgc3RydWN0IHN5c19jdGwgZW50cnlzZXQ7CisgIGNoYXIgcHJvY25hbWVbTUFYX1BST0NfTkFNRV9TSVpFXTsKKyAgaW50IGZkOworICAKKyAgc3ByaW50ZiAocHJvY25hbWUsIENUTF9QUk9DX05BTUVfRk1ULCBnZXRwaWQgKCkpOworI2lmZGVmIFVOSVhXQVJFCisgIGlmICgoZmQgPSBvcGVuIChwcm9jbmFtZSwgT19XUk9OTFkpKSA8IDApCisjZWxzZQorICBpZiAoKGZkID0gb3BlbiAocHJvY25hbWUsIE9fUkRXUikpIDwgMCkKKyNlbmRpZgorICAgIHsKKyAgICAgIHBlcnJvciAocHJvY25hbWUpOworICAgICAgZ2RiX2ZsdXNoIChnZGJfc3RkZXJyKTsKKyAgICAgIF9leGl0ICgxMjcpOworICAgIH0KKyAgcHJlbXB0eXNldCAoJmV4aXRzZXQuc3lzc2V0KTsKKyAgcHJlbXB0eXNldCAoJmVudHJ5c2V0LnN5c3NldCk7CisKKyNpZmRlZiBQUkZTX1NUT1BFWEVDCisgIC8qIFVuZGVyIEFscGhhIE9TRi8xIHdlIGhhdmUgdG8gdXNlIGEgUElPQ1NTUENBQ1QgaW9jdGwgdG8gdHJhY2UKKyAgICAgZXhpdHMgZnJvbSBleGVjIHN5c3RlbSBjYWxscyBiZWNhdXNlIG9mIHRoZSB1c2VyIGxldmVsIGxvYWRlci4gICovCisgIHsKKyAgICBpbnQgcHJmc19mbGFnczsKKworICAgIGlmIChpb2N0bCAoZmQsIFBJT0NHU1BDQUNULCAmcHJmc19mbGFncykgPCAwKQorICAgICAgeworCXBlcnJvciAocHJvY25hbWUpOworCWdkYl9mbHVzaCAoZ2RiX3N0ZGVycik7CisJX2V4aXQgKDEyNyk7CisgICAgICB9CisgICAgcHJmc19mbGFncyB8PSBQUkZTX1NUT1BFWEVDOworICAgIGlmIChpb2N0bCAoZmQsIFBJT0NTU1BDQUNULCAmcHJmc19mbGFncykgPCAwKQorICAgICAgeworCXBlcnJvciAocHJvY25hbWUpOworCWdkYl9mbHVzaCAoZ2RiX3N0ZGVycik7CisJX2V4aXQgKDEyNyk7CisgICAgICB9CisgIH0KKyNlbHNlIC8qIFBSRlNfU1RPUEVYRUMgKi8KKyAgLyogR1c6IFJhdGlvbmFsZS4uLgorICAgICBOb3QgYWxsIHN5c3RlbXMgd2l0aCAvcHJvYyBoYXZlIGFsbCB0aGUgZXhlYyogc3lzY2FsbHMgd2l0aCB0aGUgc2FtZQorICAgICBuYW1lcy4gIE9uIHRoZSBTR0ksIGZvciBleGFtcGxlLCB0aGVyZSBpcyBubyBTWVNfZXhlYywgYnV0IHRoZXJlCisgICAgICppcyogYSBTWVNfZXhlY3YuICBTbywgd2UgdHJ5IHRvIGFjY291bnQgZm9yIHRoYXQuICovCisKKyNpZmRlZiBTWVNfZXhlYworICBwcmFkZHNldCAoJmV4aXRzZXQuc3lzc2V0LCBTWVNfZXhlYyk7CisjZW5kaWYKKyNpZmRlZiBTWVNfZXhlY3ZlCisgIHByYWRkc2V0ICgmZXhpdHNldC5zeXNzZXQsIFNZU19leGVjdmUpOworI2VuZGlmCisjaWZkZWYgU1lTX2V4ZWN2CisgIHByYWRkc2V0ICgmZXhpdHNldC5zeXNzZXQsIFNZU19leGVjdik7CisjZW5kaWYKKworI2lmZGVmIFBST0NGU19VU0VfUkVBRF9XUklURQorICBleGl0c2V0LmNtZCA9IFBDU0VYSVQ7CisgIGlmICh3cml0ZSAoZmQsIChjaGFyICopICZleGl0c2V0LCBzaXplb2YgKHN0cnVjdCBzeXNfY3RsKSkgPCAwKQorI2Vsc2UKKyAgaWYgKGlvY3RsIChmZCwgUElPQ1NFWElULCAmZXhpdHNldC5zeXNzZXQpIDwgMCkKKyNlbmRpZgorICAgIHsKKyAgICAgIHBlcnJvciAocHJvY25hbWUpOworICAgICAgZ2RiX2ZsdXNoIChnZGJfc3RkZXJyKTsKKyAgICAgIF9leGl0ICgxMjcpOworICAgIH0KKyNlbmRpZiAvKiBQUkZTX1NUT1BFWEVDICovCisKKyAgcHJhZGRzZXQgKCZlbnRyeXNldC5zeXNzZXQsIFNZU19leGl0KTsKKworI2lmZGVmIFBST0NGU19VU0VfUkVBRF9XUklURQorICBlbnRyeXNldC5jbWQgPSBQQ1NFTlRSWTsKKyAgaWYgKHdyaXRlIChmZCwgKGNoYXIgKikgJmVudHJ5c2V0LCBzaXplb2YgKHN0cnVjdCBzeXNfY3RsKSkgPCAwKQorI2Vsc2UKKyAgaWYgKGlvY3RsIChmZCwgUElPQ1NFTlRSWSwgJmVudHJ5c2V0LnN5c3NldCkgPCAwKQorI2VuZGlmCisgICAgeworICAgICAgcGVycm9yIChwcm9jbmFtZSk7CisgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRlcnIpOworICAgICAgX2V4aXQgKDEyNik7CisgICAgfQorCisgIC8qIFR1cm4gb2ZmIGluaGVyaXQtb24tZm9yayBmbGFnIHNvIHRoYXQgYWxsIGdyYW5kLWNoaWxkcmVuIG9mIGdkYgorICAgICBzdGFydCB3aXRoIHRyYWNpbmcgZmxhZ3MgY2xlYXJlZC4gKi8KKworICBtb2RpZnlfaW5oZXJpdF9vbl9mb3JrX2ZsYWcgKGZkLCAwKTsKKworICAvKiBUdXJuIG9uIHJ1bi1vbi1sYXN0LWNsb3NlIGZsYWcgc28gdGhhdCB0aGlzIHByb2Nlc3Mgd2lsbCBub3QgaGFuZworICAgICBpZiBHREIgZ29lcyBhd2F5IGZvciBzb21lIHJlYXNvbi4gICovCisKKyAgbW9kaWZ5X3J1bl9vbl9sYXN0X2Nsb3NlX2ZsYWcgKGZkLCAxKTsKKworI2lmbmRlZiBVTklYV0FSRQkvKiBzaW5jZSB0aGlzIGlzIGEgc29sYXJpcy1pc20sIHdlIGRvbid0IHdhbnQgaXQgKi8KKwkJCS8qIE5PVEU6IHJldmlzaXQgd2hlbiBkb2luZyB0aHJlYWQgc3VwcG9ydCBmb3IgVVcgKi8KKyNpZmRlZiBQUl9BU1lOQworICB7CisgICAgbG9uZyBwcl9mbGFnczsKKyAgICBzdHJ1Y3QgcHJvY19jdGwgcGN0bDsKKworLyogU29sYXJpcyBuZWVkcyB0aGlzIHRvIG1ha2UgcHJvY2ZzIHRyZWF0IGFsbCB0aHJlYWRzIHNlcGVyYXRlbHkuICBXaXRob3V0CisgICB0aGlzLCBhbGwgdGhyZWFkcyBoYWx0IHdoZW5ldmVyIHNvbWV0aGluZyBoYXBwZW5zIHRvIGFueSB0aHJlYWQuICBTaW5jZQorICAgR0RCIHdhbnRzIHRvIGNvbnRyb2wgYWxsIHRoaXMgaXRzZWxmLCBpdCBuZWVkcyB0byBzZXQgUFJfQVNZTkMuICAqLworCisgICAgcHJfZmxhZ3MgPSBQUl9BU1lOQzsKKyNpZmRlZiBQUk9DRlNfVVNFX1JFQURfV1JJVEUKKyAgICBwY3RsLmNtZCA9IFBDU0VUOworICAgIHBjdGwuZGF0YSA9IFBSX0ZPUkt8UFJfQVNZTkM7CisgICAgd3JpdGUgKGZkLCAoY2hhciAqKSAmcGN0bCwgc2l6ZW9mIChzdHJ1Y3QgcHJvY19jdGwpKTsKKyNlbHNlCisgICAgaW9jdGwgKGZkLCBQSU9DU0VULCAmcHJfZmxhZ3MpOworI2VuZGlmCisgIH0KKyNlbmRpZgkvKiBQUl9BU1lOQyAqLworI2VuZGlmCS8qICFVTklYV0FSRSAqLworfQorCisvKgorCitHTE9CQUwgRlVOQ1RJT04KKworCXByb2NfaXRlcmF0ZV9vdmVyX21hcHBpbmdzIC0tIGNhbGwgZnVuY3Rpb24gZm9yIGV2ZXJ5IG1hcHBlZCBzcGFjZQorCitTWU5PUFNJUworCisJaW50IHByb2NfaXRlcmF0ZV9vdmVyX21hcHBpbmdzIChpbnQgKCpmdW5jKSgpKQorCitERVNDUklQVElPTgorCisJR2l2ZW4gYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24sIGNhbGwgdGhhdCBmdW5jdGlvbiBmb3IgZXZlcnkKKwltYXBwZWQgYWRkcmVzcyBzcGFjZSwgcGFzc2luZyBpdCBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciBmb3IKKwl0aGUgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoYXQgbWFwcGVkIGFkZHJlc3Mgc3BhY2UgKGlmIGFueSkKKwlhbmQgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgbWFwcGVkIHNwYWNlLiAgUXVpdCB3aGVuIHdlIGhpdAorCXRoZSBlbmQgb2YgdGhlIG1hcHBpbmdzIG9yIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vbnplcm8uCisgKi8KKworI2lmZGVmIFVOSVhXQVJFCitpbnQKK3Byb2NfaXRlcmF0ZV9vdmVyX21hcHBpbmdzIChmdW5jKQorICAgICBpbnQgKCpmdW5jKSBQQVJBTVMgKChpbnQsIENPUkVfQUREUikpOworeworICBpbnQgbm1hcDsKKyAgaW50IGZkOworICBpbnQgZnVuY3N0YXQgPSAwOworICBwcm1hcF90ICpwcm1hcHM7CisgIHBybWFwX3QgKnBybWFwOworICBzdHJ1Y3QgcHJvY2luZm8gKnBpOworICBzdHJ1Y3Qgc3RhdCBzYnVmOworCisgIHBpID0gY3VycmVudF9wcm9jaW5mbzsKKworICBpZiAoZnN0YXQgKHBpLT5tYXBfZmQsICZzYnVmKSA8IDApCisgICAgcmV0dXJuIDA7CisKKyAgbm1hcCA9IHNidWYuc3Rfc2l6ZSAvIHNpemVvZiAocHJtYXBfdCk7CisgIHBybWFwcyA9IChwcm1hcF90ICopIGFsbG9jYSAobm1hcCAqIHNpemVvZihwcm1hcF90KSk7CisgIGlmICgobHNlZWsgKHBpLT5tYXBfZmQsIDAsIFNFRUtfU0VUKSA9PSAwKSAmJgorCShyZWFkIChwaS0+bWFwX2ZkLCAoY2hhciAqKSBwcm1hcHMsIG5tYXAgKiBzaXplb2YgKHBybWFwX3QpKSA9PQorCShubWFwICogc2l6ZW9mIChwcm1hcF90KSkpKQorICAgIHsKKyAgICAgIGludCBpID0gMDsKKyAgICAgIGZvciAocHJtYXAgPSBwcm1hcHM7IGkgPCBubWFwICYmIGZ1bmNzdGF0ID09IDA7ICsrcHJtYXAsICsraSkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgbmFtZVtzaXplb2YgKCIvcHJvYy8xMjM0NTY3ODkwL29iamVjdCIpICsKKwkJc2l6ZW9mIChwcm1hcC0+cHJfbWFwbmFtZSldOworICAgICAgICAgIHNwcmludGYgKG5hbWUsICIvcHJvYy8lZC9vYmplY3QvJXMiLCBwaS0+cGlkLCBwcm1hcC0+cHJfbWFwbmFtZSk7CisgICAgICAgICAgaWYgKChmZCA9IG9wZW4gKG5hbWUsIE9fUkRPTkxZKSkgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZ1bmNzdGF0ID0gMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgZnVuY3N0YXQgPSAoKmZ1bmMpIChmZCwgKENPUkVfQUREUikgcHJtYXAtPnByX3ZhZGRyKTsKKyAgICAgICAgICBjbG9zZSAoZmQpOworICAgICAgICB9CisgICAgfQorICByZXR1cm4gKGZ1bmNzdGF0KTsKK30KKyNlbHNlIC8qIFVOSVhXQVJFICovCitpbnQKK3Byb2NfaXRlcmF0ZV9vdmVyX21hcHBpbmdzIChmdW5jKQorICAgICBpbnQgKCpmdW5jKSBQQVJBTVMgKChpbnQsIENPUkVfQUREUikpOworeworICBpbnQgbm1hcDsKKyAgaW50IGZkOworICBpbnQgZnVuY3N0YXQgPSAwOworICBzdHJ1Y3QgcHJtYXAgKnBybWFwczsKKyAgc3RydWN0IHBybWFwICpwcm1hcDsKKyAgc3RydWN0IHByb2NpbmZvICpwaTsKKworICBwaSA9IGN1cnJlbnRfcHJvY2luZm87CisKKyAgaWYgKGlvY3RsIChwaS0+bWFwX2ZkLCBQSU9DTk1BUCwgJm5tYXApID09IDApCisgICAgeworICAgICAgcHJtYXBzID0gKHN0cnVjdCBwcm1hcCAqKSBhbGxvY2EgKChubWFwICsgMSkgKiBzaXplb2YgKCpwcm1hcHMpKTsKKyAgICAgIGlmIChpb2N0bCAocGktPm1hcF9mZCwgUElPQ01BUCwgcHJtYXBzKSA9PSAwKQorCXsKKwkgIGZvciAocHJtYXAgPSBwcm1hcHM7IHBybWFwIC0+IHByX3NpemUgJiYgZnVuY3N0YXQgPT0gMDsgKytwcm1hcCkKKwkgICAgeworCSAgICAgIGZkID0gcHJvY19hZGRyZXNzX3RvX2ZkIChwaSwgKENPUkVfQUREUikgcHJtYXAgLT4gcHJfdmFkZHIsIDApOworCSAgICAgIGZ1bmNzdGF0ID0gKCpmdW5jKSAoZmQsIChDT1JFX0FERFIpIHBybWFwIC0+IHByX3ZhZGRyKTsKKwkgICAgICBjbG9zZSAoZmQpOworCSAgICB9CisJfQorICAgIH0KKyAgcmV0dXJuIChmdW5jc3RhdCk7Cit9CisjZW5kaWYgLyogVU5JWFdBUkUgKi8KKworI2lmIDAJLyogQ3VycmVudGx5IHVudXNlZCAqLworLyoKKworR0xPQkFMIEZVTkNUSU9OCisKKwlwcm9jX2Jhc2VfYWRkcmVzcyAtLSBmaW5kIGJhc2UgYWRkcmVzcyBmb3Igc2VnbWVudCBjb250YWluaW5nIGFkZHJlc3MKKworU1lOT1BTSVMKKworCUNPUkVfQUREUiBwcm9jX2Jhc2VfYWRkcmVzcyAoQ09SRV9BRERSIGFkZHIpCisKK0RFU0NSSVBUSU9OCisKKwlHaXZlbiBhbiBhZGRyZXNzIG9mIGEgbG9jYXRpb24gaW4gdGhlIGluZmVyaW9yLCBmaW5kIGFuZCByZXR1cm4KKwl0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBtYXBwZWQgc2VnbWVudCBjb250YWluaW5nIHRoYXQgYWRkcmVzcy4KKworCVRoaXMgaXMgdXNlZCBmb3IgZXhhbXBsZSwgYnkgdGhlIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgY29kZSwKKwl3aGVyZSB3ZSBoYXZlIHRoZSBwYyB2YWx1ZSBmb3Igc29tZSBsb2NhdGlvbiBpbiB0aGUgc2hhcmVkIGxpYnJhcnkKKwl3aGVyZSB3ZSBhcmUgc3RvcHBlZCwgYW5kIG5lZWQgdG8ga25vdyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZQorCXNlZ21lbnQgY29udGFpbmluZyB0aGF0IGFkZHJlc3MuCisqLworCitDT1JFX0FERFIKK3Byb2NfYmFzZV9hZGRyZXNzIChhZGRyKQorICAgICBDT1JFX0FERFIgYWRkcjsKK3sKKyAgaW50IG5tYXA7CisgIHN0cnVjdCBwcm1hcCAqcHJtYXBzOworICBzdHJ1Y3QgcHJtYXAgKnBybWFwOworICBDT1JFX0FERFIgYmFzZWFkZHIgPSAwOworICBzdHJ1Y3QgcHJvY2luZm8gKnBpOworCisgIHBpID0gY3VycmVudF9wcm9jaW5mbzsKKworICBpZiAoaW9jdGwgKHBpLT5tYXBfZmQsIFBJT0NOTUFQLCAmbm1hcCkgPT0gMCkKKyAgICB7CisgICAgICBwcm1hcHMgPSAoc3RydWN0IHBybWFwICopIGFsbG9jYSAoKG5tYXAgKyAxKSAqIHNpemVvZiAoKnBybWFwcykpOworICAgICAgaWYgKGlvY3RsIChwaS0+bWFwX2ZkLCBQSU9DTUFQLCBwcm1hcHMpID09IDApCisJeworCSAgZm9yIChwcm1hcCA9IHBybWFwczsgcHJtYXAgLT4gcHJfc2l6ZTsgKytwcm1hcCkKKwkgICAgeworCSAgICAgIGlmICgocHJtYXAgLT4gcHJfdmFkZHIgPD0gKGNhZGRyX3QpIGFkZHIpICYmCisJCSAgKHBybWFwIC0+IHByX3ZhZGRyICsgcHJtYXAgLT4gcHJfc2l6ZSA+IChjYWRkcl90KSBhZGRyKSkKKwkJeworCQkgIGJhc2VhZGRyID0gKENPUkVfQUREUikgcHJtYXAgLT4gcHJfdmFkZHI7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybiAoYmFzZWFkZHIpOworfQorCisjZW5kaWYJLyogMCAqLworCisjaWZuZGVmIFVOSVhXQVJFCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJcHJvY19hZGRyZXNzX3RvX2ZkIC0tIHJldHVybiBvcGVuIGZkIGZvciBmaWxlIG1hcHBlZCB0byBhZGRyZXNzCisKK1NZTk9QU0lTCisKKwlpbnQgcHJvY19hZGRyZXNzX3RvX2ZkIChzdHJ1Y3QgcHJvY2luZm8gKnBpLCBDT1JFX0FERFIgYWRkciwgY29tcGxhaW4pCisKK0RFU0NSSVBUSU9OCisKKwlHaXZlbiBhbiBhZGRyZXNzIGluIHRoZSBjdXJyZW50IGluZmVyaW9yJ3MgYWRkcmVzcyBzcGFjZSwgdXNlIHRoZQorCS9wcm9jIGludGVyZmFjZSB0byBmaW5kIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZSB0aGF0CisJdGhpcyBhZGRyZXNzIHdhcyBtYXBwZWQgaW4gZnJvbS4gIFJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBjdXJyZW50CisJaW5mZXJpb3IuICBQcmludCBhIHdhcm5pbmcgbWVzc2FnZSBpZiB0aGVyZSBpcyBhbiBpbmZlcmlvciBidXQKKwl0aGUgYWRkcmVzcyBjb3JyZXNwb25kcyB0byBubyBmaWxlIChJRSBhIGJvZ3VzIGFkZHJlc3MpLgorCisqLworCitzdGF0aWMgaW50Citwcm9jX2FkZHJlc3NfdG9fZmQgKHBpLCBhZGRyLCBjb21wbGFpbikKKyAgICAgc3RydWN0IHByb2NpbmZvICpwaTsKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGludCBjb21wbGFpbjsKK3sKKyAgaW50IGZkID0gLTE7CisKKyAgaWYgKChmZCA9IGlvY3RsIChwaS0+Y3RsX2ZkLCBQSU9DT1BFTk0sIChjYWRkcl90ICopICZhZGRyKSkgPCAwKQorICAgIHsKKyAgICAgIGlmIChjb21wbGFpbikKKwl7CisJICBwcmludF9zeXNfZXJybXNnIChwaS0+cGF0aG5hbWUsIGVycm5vKTsKKwkgIHdhcm5pbmcgKCJjYW4ndCBmaW5kIG1hcHBlZCBmaWxlIGZvciBhZGRyZXNzIDB4JXgiLCBhZGRyKTsKKwl9CisgICAgfQorICByZXR1cm4gKGZkKTsKK30KKyNlbmRpZiAvKiAhVU5JWFdBUkUgKi8KKworLyogQXR0YWNoIHRvIHByb2Nlc3MgUElELCB0aGVuIGluaXRpYWxpemUgZm9yIGRlYnVnZ2luZyBpdAorICAgYW5kIHdhaXQgZm9yIHRoZSB0cmFjZS10cmFwIHRoYXQgcmVzdWx0cyBmcm9tIGF0dGFjaGluZy4gICovCisKK3N0YXRpYyB2b2lkCitwcm9jZnNfYXR0YWNoIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjaGFyICpleGVjX2ZpbGU7CisgIGludCBwaWQ7CisKKyAgaWYgKCFhcmdzKQorICAgIGVycm9yX25vX2FyZyAoInByb2Nlc3MtaWQgdG8gYXR0YWNoIik7CisKKyAgcGlkID0gYXRvaSAoYXJncyk7CisKKyAgaWYgKHBpZCA9PSBnZXRwaWQoKSkJCS8qIFRyeWluZyB0byBtYXN0dXJiYXRlPyAqLworICAgIGVycm9yICgiSSByZWZ1c2UgdG8gZGVidWcgbXlzZWxmISIpOworCisgIGlmIChmcm9tX3R0eSkKKyAgICB7CisgICAgICBleGVjX2ZpbGUgPSAoY2hhciAqKSBnZXRfZXhlY19maWxlICgwKTsKKworICAgICAgaWYgKGV4ZWNfZmlsZSkKKwlwcmludGZfdW5maWx0ZXJlZCAoIkF0dGFjaGluZyB0byBwcm9ncmFtIGAlcycsICVzXG4iLCBleGVjX2ZpbGUsIHRhcmdldF9waWRfdG9fc3RyIChwaWQpKTsKKyAgICAgIGVsc2UKKwlwcmludGZfdW5maWx0ZXJlZCAoIkF0dGFjaGluZyB0byAlc1xuIiwgdGFyZ2V0X3BpZF90b19zdHIgKHBpZCkpOworCisgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworICAgIH0KKworICBpbmZlcmlvcl9waWQgPSBwaWQgPSBkb19hdHRhY2ggKHBpZCk7CisgIHB1c2hfdGFyZ2V0ICgmcHJvY2ZzX29wcyk7Cit9CisKKworLyogVGFrZSBhIHByb2dyYW0gcHJldmlvdXNseSBhdHRhY2hlZCB0byBhbmQgZGV0YWNoZXMgaXQuCisgICBUaGUgcHJvZ3JhbSByZXN1bWVzIGV4ZWN1dGlvbiBhbmQgd2lsbCBubyBsb25nZXIgc3RvcAorICAgb24gc2lnbmFscywgZXRjLiAgV2UnZCBiZXR0ZXIgbm90IGhhdmUgbGVmdCBhbnkgYnJlYWtwb2ludHMKKyAgIGluIHRoZSBwcm9ncmFtIG9yIGl0J2xsIGRpZSB3aGVuIGl0IGhpdHMgb25lLiAgRm9yIHRoaXMKKyAgIHRvIHdvcmssIGl0IG1heSBiZSBuZWNlc3NhcnkgZm9yIHRoZSBwcm9jZXNzIHRvIGhhdmUgYmVlbgorICAgcHJldmlvdXNseSBhdHRhY2hlZC4gIEl0ICptaWdodCogd29yayBpZiB0aGUgcHJvZ3JhbSB3YXMKKyAgIHN0YXJ0ZWQgdmlhIHRoZSBub3JtYWwgcHRyYWNlIChQVFJBQ0VfVFJBQ0VNRSkuICAqLworCitzdGF0aWMgdm9pZAorcHJvY2ZzX2RldGFjaCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IHNpZ2duYWwgPSAwOworCisgIGlmIChmcm9tX3R0eSkKKyAgICB7CisgICAgICBjaGFyICpleGVjX2ZpbGUgPSBnZXRfZXhlY19maWxlICgwKTsKKyAgICAgIGlmIChleGVjX2ZpbGUgPT0gMCkKKwlleGVjX2ZpbGUgPSAiIjsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiRGV0YWNoaW5nIGZyb20gcHJvZ3JhbTogJXMgJXNcbiIsCisJICAgICAgZXhlY19maWxlLCB0YXJnZXRfcGlkX3RvX3N0ciAoaW5mZXJpb3JfcGlkKSk7CisgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworICAgIH0KKyAgaWYgKGFyZ3MpCisgICAgc2lnZ25hbCA9IGF0b2kgKGFyZ3MpOworICAKKyAgZG9fZGV0YWNoIChzaWdnbmFsKTsKKyAgaW5mZXJpb3JfcGlkID0gMDsKKyAgdW5wdXNoX3RhcmdldCAoJnByb2Nmc19vcHMpOwkJLyogUG9wIG91dCBvZiBoYW5kbGluZyBhbiBpbmZlcmlvciAqLworfQorCisvKiBHZXQgcmVhZHkgdG8gbW9kaWZ5IHRoZSByZWdpc3RlcnMgYXJyYXkuICBPbiBtYWNoaW5lcyB3aGljaCBzdG9yZQorICAgaW5kaXZpZHVhbCByZWdpc3RlcnMsIHRoaXMgZG9lc24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLiAgT24gbWFjaGluZXMKKyAgIHdoaWNoIHN0b3JlIGFsbCB0aGUgcmVnaXN0ZXJzIGluIG9uZSBmZWxsIHN3b29wLCB0aGlzIG1ha2VzIHN1cmUKKyAgIHRoYXQgcmVnaXN0ZXJzIGNvbnRhaW5zIGFsbCB0aGUgcmVnaXN0ZXJzIGZyb20gdGhlIHByb2dyYW0gYmVpbmcKKyAgIGRlYnVnZ2VkLiAgKi8KKworc3RhdGljIHZvaWQKK3Byb2Nmc19wcmVwYXJlX3RvX3N0b3JlICgpCit7CisjaWZkZWYgQ0hJTERfUFJFUEFSRV9UT19TVE9SRQorICBDSElMRF9QUkVQQVJFX1RPX1NUT1JFICgpOworI2VuZGlmCit9CisKKy8qIFByaW50IHN0YXR1cyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHdlJ3JlIGFjY2Vzc2luZy4gICovCisKK3N0YXRpYyB2b2lkCitwcm9jZnNfZmlsZXNfaW5mbyAoaWdub3JlKQorICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqaWdub3JlOworeworICBwcmludGZfdW5maWx0ZXJlZCAoIlx0VXNpbmcgdGhlIHJ1bm5pbmcgaW1hZ2Ugb2YgJXMgJXMgdmlhIC9wcm9jLlxuIiwKKwkgIGF0dGFjaF9mbGFnPyAiYXR0YWNoZWQiOiAiY2hpbGQiLCB0YXJnZXRfcGlkX3RvX3N0ciAoaW5mZXJpb3JfcGlkKSk7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorcHJvY2ZzX29wZW4gKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBlcnJvciAoIlVzZSB0aGUgXCJydW5cIiBjb21tYW5kIHRvIHN0YXJ0IGEgVW5peCBjaGlsZCBwcm9jZXNzLiIpOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJZG9fYXR0YWNoIC0tIGF0dGFjaCB0byBhbiBhbHJlYWR5IGV4aXN0aW5nIHByb2Nlc3MKKworU1lOT1BTSVMKKworCWludCBkb19hdHRhY2ggKGludCBwaWQpCisKK0RFU0NSSVBUSU9OCisKKwlBdHRhY2ggdG8gYW4gYWxyZWFkeSBleGlzdGluZyBwcm9jZXNzIHdpdGggdGhlIHNwZWNpZmllZCBwcm9jZXNzCisJaWQuICBJZiB0aGUgcHJvY2VzcyBpcyBub3QgYWxyZWFkeSBzdG9wcGVkLCBxdWVyeSB3aGV0aGVyIHRvCisJc3RvcCBpdCBvciBub3QuCisKK05PVEVTCisKKwlUaGUgb3B0aW9uIG9mIHN0b3BwaW5nIGF0IGF0dGFjaCB0aW1lIGlzIHNwZWNpZmljIHRvIHRoZSAvcHJvYworCXZlcnNpb25zIG9mIGdkYi4gIFZlcnNpb25zIHVzaW5nIHB0cmFjZSBmb3JjZSB0aGUgYXR0YWNoZWUKKwl0byBzdG9wLiAgKEkgaGF2ZSBjaGFuZ2VkIHRoaXMgdmVyc2lvbiB0byBkbyBzbywgdG9vLiAgQWxsIHlvdQorCWhhdmUgdG8gZG8gaXMgImNvbnRpbnVlIiB0byBtYWtlIGl0IGdvIG9uLiAtLSBnbnVAY3lnbnVzLmNvbSkKKworKi8KKworc3RhdGljIGludAorZG9fYXR0YWNoIChwaWQpCisgICAgIGludCBwaWQ7Cit7CisgIHN0cnVjdCBwcm9jaW5mbyAqcGk7CisgIHN0cnVjdCBzaWdfY3RsIHNjdGw7CisgIHN0cnVjdCBmbHRfY3RsIGZjdGw7CisgIGludCBubHdwLCAqbHdwczsKKworICBwaSAgPSBpbml0X3Byb2NpbmZvIChwaWQsIDApOworCisjaWZkZWYgUElPQ0xXUElEUworICBubHdwID0gcGktPnByc3RhdHVzLnByX25sd3A7CisgIGx3cHMgPSBhbGxvY2EgKCgyICogbmx3cCArIDIpICogc2l6ZW9mIChpZF90KSk7CisKKyAgaWYgKGlvY3RsIChwaS0+Y3RsX2ZkLCBQSU9DTFdQSURTLCBsd3BzKSkKKyAgICB7CisgICAgICBwcmludF9zeXNfZXJybXNnIChwaSAtPiBwYXRobmFtZSwgZXJybm8pOworICAgICAgZXJyb3IgKCJQSU9DTFdQSURTIGZhaWxlZCIpOworICAgIH0KKyNlbHNlIC8qIFBJT0NMV1BJRFMgKi8KKyAgbmx3cCA9IDE7CisgIGx3cHMgPSBhbGxvY2EgKCgyICogbmx3cCArIDIpICogc2l6ZW9mICpsd3BzKTsKKyAgbHdwc1swXSA9IDA7CisjZW5kaWYKKyAgZm9yICg7IG5sd3AgPiAwOyBubHdwLS0sIGx3cHMrKykKKyAgICB7CisgICAgICAvKiBGaXJzdCBvbmUgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGFib3ZlLiAgKi8KKyAgICAgIGlmICgocGkgPSBmaW5kX3Byb2NpbmZvICgoKmx3cHMgPDwgMTYpIHwgcGlkLCAxKSkgPT0gMCkKKwlwaSA9IGluaXRfcHJvY2luZm8gKCgqbHdwcyA8PCAxNikgfCBwaWQsIDApOworCisgICAgICBpZiAoVEhFX1BSX0xXUChwaS0+cHJzdGF0dXMpLnByX2ZsYWdzICYgKFBSX1NUT1BQRUQgfCBQUl9JU1RPUCkpCisJeworCSAgcGktPndhc19zdG9wcGVkID0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcGktPndhc19zdG9wcGVkID0gMDsKKwkgIGlmICgxIHx8IHF1ZXJ5ICgiUHJvY2VzcyBpcyBjdXJyZW50bHkgcnVubmluZywgc3RvcCBpdD8gIikpCisJICAgIHsKKwkgICAgICBsb25nIGNtZDsKKwkgICAgICAvKiBNYWtlIGl0IHJ1biBhZ2FpbiB3aGVuIHdlIGNsb3NlIGl0LiAgKi8KKwkgICAgICBtb2RpZnlfcnVuX29uX2xhc3RfY2xvc2VfZmxhZyAocGktPmN0bF9mZCwgMSk7CisjaWZkZWYgUFJPQ0ZTX1VTRV9SRUFEX1dSSVRFCisJICAgICAgY21kID0gUENTVE9QOworCSAgICAgIGlmICh3cml0ZSAocGktPmN0bF9mZCwgKGNoYXIgKikgJmNtZCwgc2l6ZW9mIChsb25nKSkgPCAwKQorI2Vsc2UKKwkgICAgICBpZiAoaW9jdGwgKHBpLT5jdGxfZmQsIFBJT0NTVE9QLCAmcGktPnByc3RhdHVzKSA8IDApCisjZW5kaWYKKwkJeworCQkgIHByaW50X3N5c19lcnJtc2cgKHBpLT5wYXRobmFtZSwgZXJybm8pOworCQkgIGNsb3NlX3Byb2NfZmlsZSAocGkpOworCQkgIGVycm9yICgiUElPQ1NUT1AgZmFpbGVkIik7CisJCX0KKyNpZmRlZiBVTklYV0FSRQorCSAgICAgIGlmICghcHJvY2ZzX3JlYWRfc3RhdHVzIChwaSkpCisJCXsKKwkJICBwcmludF9zeXNfZXJybXNnIChwaS0+cGF0aG5hbWUsIGVycm5vKTsKKwkJICBjbG9zZV9wcm9jX2ZpbGUgKHBpKTsKKwkJICBlcnJvciAoInByb2Nmc19yZWFkX3N0YXR1cyBmYWlsZWQiKTsKKwkJfSAKKyNlbmRpZgorCSAgICAgIHBpLT5ub3Bhc3NfbmV4dF9zaWdzdG9wID0gMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJPaywgZ2RiIHdpbGwgd2FpdCBmb3IgJXMgdG8gc3RvcC5cbiIsIAorCQkJCSB0YXJnZXRfcGlkX3RvX3N0ciAocGktPnBpZCkpOworCSAgICB9CisJfQorCisjaWZkZWYgUFJPQ0ZTX1VTRV9SRUFEX1dSSVRFCisgICAgICBmY3RsLmNtZCA9IFBDU0ZBVUxUOworICAgICAgaWYgKHdyaXRlIChwaS0+Y3RsX2ZkLCAoY2hhciAqKSAmZmN0bCwgc2l6ZW9mIChzdHJ1Y3QgZmx0X2N0bCkpIDwgMCkKKwlwcmludF9zeXNfZXJybXNnICgiUENTRkFVTFQgZmFpbGVkIiwgZXJybm8pOworI2Vsc2UgLyogUFJPQ0ZTX1VTRV9SRUFEX1dSSVRFICovCisgICAgICBpZiAoaW9jdGwgKHBpLT5jdGxfZmQsIFBJT0NTRkFVTFQsICZwaS0+cHJydW4ucHJfZmF1bHQpKQorCXsKKwkgIHByaW50X3N5c19lcnJtc2cgKCJQSU9DU0ZBVUxUIGZhaWxlZCIsIGVycm5vKTsKKwl9CisgICAgICBpZiAoaW9jdGwgKHBpLT5jdGxfZmQsIFBJT0NTVFJBQ0UsICZwaS0+cHJydW4ucHJfdHJhY2UpKQorCXsKKwkgIHByaW50X3N5c19lcnJtc2cgKCJQSU9DU1RSQUNFIGZhaWxlZCIsIGVycm5vKTsKKwl9CisgICAgICBhZGRfdGhyZWFkIChwaS0+cGlkKTsKKyAgICAgIHByb2Nmc19zZXRfaW5mZXJpb3Jfc3lzY2FsbF90cmFwcyAocGkpOworI2VuZGlmIC8qIFBST0NGU19VU0VfUkVBRF9XUklURSAqLworICAgIH0KKyAgYXR0YWNoX2ZsYWcgPSAxOworICByZXR1cm4gKHBpLT5waWQpOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJZG9fZGV0YWNoIC0tIGRldGFjaCBmcm9tIGFuIGF0dGFjaGVkLXRvIHByb2Nlc3MKKworU1lOT1BTSVMKKworCXZvaWQgZG9fZGV0YWNoIChpbnQgc2lnbmFsKQorCitERVNDUklQVElPTgorCisJRGV0YWNoIGZyb20gdGhlIGN1cnJlbnQgYXR0YWNoZWUuCisKKwlJZiBzaWduYWwgaXMgbm9uLXplcm8sIHRoZSBhdHRhY2hlZSBpcyBzdGFydGVkIHJ1bm5pbmcgYWdhaW4gYW5kIHNlbnQKKwl0aGUgc3BlY2lmaWVkIHNpZ25hbC4KKworCUlmIHNpZ25hbCBpcyB6ZXJvIGFuZCB0aGUgYXR0YWNoZWUgd2FzIG5vdCBhbHJlYWR5IHN0b3BwZWQgd2hlbiB3ZQorCWF0dGFjaGVkIHRvIGl0LCB0aGVuIHdlIG1ha2UgaXQgcnVubmFibGUgYWdhaW4gd2hlbiB3ZSBkZXRhY2guCisKKwlPdGhlcndpc2UsIHdlIHF1ZXJ5IHdoZXRoZXIgb3Igbm90IHRvIG1ha2UgdGhlIGF0dGFjaGVlIHJ1bm5hYmxlCisJYWdhaW4sIHNpbmNlIHdlIG1heSBzaW1wbHkgd2FudCB0byBsZWF2ZSBpdCBpbiB0aGUgc3RhdGUgaXQgd2FzIGluCisJd2hlbiB3ZSBhdHRhY2hlZC4KKworCVdlIHJlcG9ydCBhbnkgcHJvYmxlbXMsIGJ1dCBkbyBub3QgY29uc2lkZXIgdGhlbSBlcnJvcnMsIHNpbmNlIHdlCisJTVVTVCBkZXRhY2ggZXZlbiBpZiBzb21lIHRoaW5ncyBkb24ndCBzZWVtIHRvIGdvIHJpZ2h0LiAgVGhpcyBtYXkgbm90CisJYmUgdGhlIGlkZWFsIHNpdHVhdGlvbi4gIChGSVhNRSkuCisgKi8KKworc3RhdGljIHZvaWQKK2RvX2RldGFjaCAoc2lnbmFsKQorICAgICBpbnQgc2lnbmFsOworeworICBzdHJ1Y3QgcHJvY2luZm8gKnBpOworCisgIGZvciAocGkgPSBwcm9jaW5mb19saXN0OyBwaTsgcGkgPSBwaS0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoc2lnbmFsKQorCXsKKwkgIHNldF9wcm9jX3NpZ2luZm8gKHBpLCBzaWduYWwpOworCX0KKyNpZmRlZiBQUk9DRlNfVVNFX1JFQURfV1JJVEUKKyAgICAgIHBpLT5zYXZlZF9leGl0c2V0LmNtZCA9IFBDU0VYSVQ7CisgICAgICBpZiAod3JpdGUgKHBpLT5jdGxfZmQsIChjaGFyICopICZwaS0+c2F2ZWRfZXhpdHNldCwKKwkJIHNpemVvZiAoc3RydWN0IHN5c19jdGwpKSA8IDApCisjZWxzZQorCWlmIChpb2N0bCAocGktPmN0bF9mZCwgUElPQ1NFWElULCAmcGktPnNhdmVkX2V4aXRzZXQuc3lzc2V0KSA8IDApCisjZW5kaWYKKwkgIHsKKwkgICAgcHJpbnRfc3lzX2Vycm1zZyAocGktPnBhdGhuYW1lLCBlcnJubyk7CisJICAgIHByaW50Zl91bmZpbHRlcmVkICgiUElPQ1NFWElUIGZhaWxlZC5cbiIpOworCSAgfQorI2lmZGVmIFBST0NGU19VU0VfUkVBRF9XUklURQorICAgICAgcGktPnNhdmVkX2VudHJ5c2V0LmNtZCA9IFBDU0VOVFJZOworICAgICAgaWYgKHdyaXRlIChwaS0+Y3RsX2ZkLCAoY2hhciAqKSAmcGktPnNhdmVkX2VudHJ5c2V0LAorCQkgc2l6ZW9mIChzdHJ1Y3Qgc3lzX2N0bCkpIDwgMCkKKyNlbHNlCisJaWYgKGlvY3RsIChwaS0+Y3RsX2ZkLCBQSU9DU0VOVFJZLCAmcGktPnNhdmVkX2VudHJ5c2V0LnN5c3NldCkgPCAwKQorI2VuZGlmCisJICB7CisJICAgIHByaW50X3N5c19lcnJtc2cgKHBpLT5wYXRobmFtZSwgZXJybm8pOworCSAgICBwcmludGZfdW5maWx0ZXJlZCAoIlBJT0NTRU5UUlkgZmFpbGVkLlxuIik7CisJICB9CisjaWZkZWYgUFJPQ0ZTX1VTRV9SRUFEX1dSSVRFCisgICAgICBwaS0+c2F2ZWRfdHJhY2UuY21kID0gUENTVFJBQ0U7CisgICAgICBpZiAod3JpdGUgKHBpLT5jdGxfZmQsIChjaGFyICopICZwaS0+c2F2ZWRfdHJhY2UsCisJCSBzaXplb2YgKHN0cnVjdCBzaWdfY3RsKSkgPCAwKQorI2Vsc2UKKwlpZiAoaW9jdGwgKHBpLT5jdGxfZmQsIFBJT0NTVFJBQ0UsICZwaS0+c2F2ZWRfdHJhY2Uuc2lnc2V0KSA8IDApCisjZW5kaWYKKwkgIHsKKwkgICAgcHJpbnRfc3lzX2Vycm1zZyAocGktPnBhdGhuYW1lLCBlcnJubyk7CisJICAgIHByaW50Zl91bmZpbHRlcmVkICgiUElPQ1NUUkFDRSBmYWlsZWQuXG4iKTsKKwkgIH0KKyNpZm5kZWYgVU5JWFdBUkUKKyAgICAgIGlmIChpb2N0bCAocGktPmN0bF9mZCwgUElPQ1NIT0xELCAmcGktPnNhdmVkX3NpZ2hvbGQuc2lnc2V0KSA8IDApCisJeworCSAgcHJpbnRfc3lzX2Vycm1zZyAocGktPnBhdGhuYW1lLCBlcnJubyk7CisJICBwcmludGZfdW5maWx0ZXJlZCAoIlBJT1NDSE9MRCBmYWlsZWQuXG4iKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBQUk9DRlNfVVNFX1JFQURfV1JJVEUKKyAgICAgIHBpLT5zYXZlZF9mbHRzZXQuY21kID0gUENTRkFVTFQ7CisgICAgICBpZiAod3JpdGUgKHBpLT5jdGxfZmQsIChjaGFyICopICZwaS0+c2F2ZWRfZmx0c2V0LAorCQkgc2l6ZW9mIChzdHJ1Y3QgZmx0X2N0bCkpIDwgMCkKKyNlbHNlCisgICAgICBpZiAoaW9jdGwgKHBpLT5jdGxfZmQsIFBJT0NTRkFVTFQsICZwaS0+c2F2ZWRfZmx0c2V0LmZsdHNldCkgPCAwKQorI2VuZGlmCisJeworCSAgcHJpbnRfc3lzX2Vycm1zZyAocGktPnBhdGhuYW1lLCBlcnJubyk7CisJICBwcmludGZfdW5maWx0ZXJlZCAoIlBJT0NTRkFVTFQgZmFpbGVkLlxuIik7CisJfQorICAgICAgaWYgKCFwcm9jZnNfcmVhZF9zdGF0dXMgKHBpKSkKKwl7CisJICBwcmludF9zeXNfZXJybXNnIChwaS0+cGF0aG5hbWUsIGVycm5vKTsKKwkgIHByaW50Zl91bmZpbHRlcmVkICgicHJvY2ZzX3JlYWRfc3RhdHVzIGZhaWxlZC5cbiIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoc2lnbmFsCisJICB8fCAoVEhFX1BSX0xXUChwaS0+cHJzdGF0dXMpLnByX2ZsYWdzICYgKFBSX1NUT1BQRUQgfCBQUl9JU1RPUCkpKQorCSAgICB7CisJICAgICAgbG9uZyBjbWQ7CisJICAgICAgc3RydWN0IHByb2NfY3RsIHBjdGw7CisKKwkgICAgICBpZiAoc2lnbmFsIHx8ICFwaS0+d2FzX3N0b3BwZWQgfHwKKwkJICBxdWVyeSAoIldhcyBzdG9wcGVkIHdoZW4gYXR0YWNoZWQsIG1ha2UgaXQgcnVubmFibGUgYWdhaW4/ICIpKQorCQl7CisJCSAgLyogQ2xlYXIgYW55IHBlbmRpbmcgc2lnbmFsIGlmIHdlIHdhbnQgdG8gZGV0YWNoIHdpdGhvdXQKKwkJICAgICBhIHNpZ25hbC4gICovCisJCSAgaWYgKHNpZ25hbCA9PSAwKQorCQkgICAgc2V0X3Byb2Nfc2lnaW5mbyAocGksIHNpZ25hbCk7CisKKwkJICAvKiBDbGVhciBhbnkgZmF1bHQgdGhhdCBtaWdodCBoYXZlIHN0b3BwZWQgaXQuICAqLworI2lmZGVmIFBST0NGU19VU0VfUkVBRF9XUklURQorCQkgIGNtZCA9IFBDQ0ZBVUxUOworCQkgIGlmICh3cml0ZSAocGktPmN0bF9mZCwgKGNoYXIgKikgJmNtZCwgc2l6ZW9mIChsb25nKSkgPCAwKQorI2Vsc2UKKwkJICBpZiAoaW9jdGwgKHBpLT5jdGxfZmQsIFBJT0NDRkFVTFQsIDApKQorI2VuZGlmCisJCSAgICB7CisJCSAgICAgIHByaW50X3N5c19lcnJtc2cgKHBpLT5wYXRobmFtZSwgZXJybm8pOworCQkgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIlBJT0NDRkFVTFQgZmFpbGVkLlxuIik7CisJCSAgICB9CisKKwkJICAvKiBNYWtlIGl0IHJ1biBhZ2FpbiB3aGVuIHdlIGNsb3NlIGl0LiAgKi8KKworCQkgIG1vZGlmeV9ydW5fb25fbGFzdF9jbG9zZV9mbGFnIChwaS0+Y3RsX2ZkLCAxKTsKKwkJfQorCSAgICB9CisJfQorICAgICAgY2xvc2VfcHJvY19maWxlIChwaSk7CisgICAgfQorICBhdHRhY2hfZmxhZyA9IDA7Cit9CisKKy8qICBlbXVsYXRlIHdhaXQoKSBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICAgIFdhaXQgZm9yIGNoaWxkIHRvIGRvIHNvbWV0aGluZy4gIFJldHVybiBwaWQgb2YgY2hpbGQsIG9yIC0xIGluIGNhc2UKKyAgICBvZiBlcnJvcjsgc3RvcmUgc3RhdHVzIGluICpPVVJTVEFUVVMuCisKKyAgICBOb3Qgc3VyZSB3aHkgd2UgY2FuJ3QKKyAgICBqdXN0IHVzZSB3YWl0KCksIGJ1dCBpdCBzZWVtcyB0byBoYXZlIHByb2JsZW1zIHdoZW4gYXBwbGllZCB0byBhCisgICAgcHJvY2VzcyBiZWluZyBjb250cm9sbGVkIHdpdGggdGhlIC9wcm9jIGludGVyZmFjZS4KKworICAgIFdlIGhhdmUgYSByYWNlIHByb2JsZW0gaGVyZSB3aXRoIG5vIG9idmlvdXMgc29sdXRpb24uICBXZSBuZWVkIHRvIGxldAorICAgIHRoZSBpbmZlcmlvciBydW4gdW50aWwgaXQgc3RvcHMgb24gYW4gZXZlbnQgb2YgaW50ZXJlc3QsIHdoaWNoIG1lYW5zCisgICAgdGhhdCB3ZSBuZWVkIHRvIHVzZSB0aGUgUElPQ1dTVE9QIGlvY3RsLiAgSG93ZXZlciwgd2UgY2Fubm90IHVzZSB0aGlzCisgICAgaW9jdGwgaWYgdGhlIHByb2Nlc3MgaXMgYWxyZWFkeSBzdG9wcGVkIG9uIHNvbWV0aGluZyB0aGF0IGlzIG5vdCBhbgorICAgIGV2ZW50IG9mIGludGVyZXN0LCBvciB0aGUgY2FsbCB3aWxsIGhhbmcgaW5kZWZpbml0ZWx5LiAgVGh1cyB3ZSBmaXJzdAorICAgIHVzZSBQSU9DU1RBVFVTIHRvIHNlZSBpZiB0aGUgcHJvY2VzcyBpcyBub3Qgc3RvcHBlZC4gIElmIG5vdCwgdGhlbiB3ZQorICAgIHVzZSBQSU9DV1NUT1AuICBCdXQgZHVyaW5nIHRoZSB3aW5kb3cgYmV0d2VlbiB0aGUgdHdvLCBpZiB0aGUgcHJvY2VzcworICAgIHN0b3BzIGZvciBhbnkgcmVhc29uIHRoYXQgaXMgbm90IGFuIGV2ZW50IG9mIGludGVyZXN0IChzdWNoIGFzIGEgam9iCisgICAgY29udHJvbCBzaWduYWwpIHRoZW4gZ2RiIHdpbGwgaGFuZy4gIE9uZSBwb3NzaWJsZSB3b3JrYXJvdW5kIGlzIHRvIHNldAorICAgIGFuIGFsYXJtIHRvIHdha2UgdXAgZXZlcnkgbWludXRlIG9mIHNvIGFuZCBjaGVjayB0byBzZWUgaWYgdGhlIHByb2Nlc3MKKyAgICBpcyBzdGlsbCBydW5uaW5nLCBhbmQgaWYgc28sIHRoZW4gcmVpc3N1ZSB0aGUgUElPQ1dTVE9QLiAgQnV0IHRoaXMgaXMKKyAgICBhIHJlYWwga2x1ZGdlLCBzbyBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQuICBGSVhNRTogaW52ZXN0aWdhdGUKKyAgICBhbHRlcm5hdGl2ZXMuCisKKyAgICBGSVhNRTogIEludmVzdGlnYXRlIHdoeSB3YWl0KCkgc2VlbXMgdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIHByb2dyYW1zCisgICAgYmVpbmcgY29udHJvbCBieSAvcHJvYyByb3V0aW5lcy4gICovCitzdGF0aWMgaW50Citwcm9jZnNfd2FpdCAocGlkLCBvdXJzdGF0dXMpCisgICAgIGludCBwaWQ7CisgICAgIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqb3Vyc3RhdHVzOworeworICBzaG9ydCB3aGF0OworICBzaG9ydCB3aHk7CisgIGludCBzdGF0dmFsID0gMDsKKyAgaW50IGNoZWNrZXJyID0gMDsKKyAgaW50IHJ0bnZhbCA9IC0xOworICBzdHJ1Y3QgcHJvY2luZm8gKnBpOworICBzdHJ1Y3QgcHJvY19jdGwgcGN0bDsKKworc2Nhbl9hZ2FpbjoKKworICAvKiBoYW5kbGUgYWxsIHN5c2NhbGwgZXZlbnRzIGZpcnN0LCBvdGhlcndpc2Ugd2UgbWlnaHQgbm90CisgICAgIG5vdGljZSBhIHRocmVhZCB3YXMgY3JlYXRlZCB1bnRpbCB0b28gbGF0ZS4gKi8KKworICBmb3IgKHBpID0gcHJvY2luZm9fbGlzdDsgcGk7IHBpID0gcGktPm5leHQpCisgICAgeworICAgICAgaWYgKCFwaS0+aGFkX2V2ZW50KQorCWNvbnRpbnVlOworCisgICAgICBpZiAoISAoVEhFX1BSX0xXUChwaS0+cHJzdGF0dXMpLnByX2ZsYWdzICYgKFBSX1NUT1BQRUQgfCBQUl9JU1RPUCkpICkKKwljb250aW51ZTsKKworICAgICAgd2h5ID0gVEhFX1BSX0xXUChwaS0+cHJzdGF0dXMpLnByX3doeTsKKyAgICAgIHdoYXQgPSBUSEVfUFJfTFdQKHBpLT5wcnN0YXR1cykucHJfd2hhdDsKKyAgICAgIGlmICh3aHkgPT0gUFJfU1lTRU5UUlkgfHwgd2h5ID09IFBSX1NZU0VYSVQpCisJeworCSAgaW50IGk7CisJICBpbnQgZm91bmRfaGFuZGxlciA9IDA7CisKKwkgIGZvciAoaSA9IDA7IGkgPCBwaS0+bnVtX3N5c2NhbGxfaGFuZGxlcnM7IGkrKykKKwkgICAgaWYgKHBpLT5zeXNjYWxsX2hhbmRsZXJzW2ldLnN5c2NhbGxfbnVtID09IHdoYXQpCisJICAgICAgeworCQlmb3VuZF9oYW5kbGVyID0gMTsKKwkJcGktPnNhdmVkX3J0bnZhbCA9IHBpLT5waWQ7CisJCXBpLT5zYXZlZF9zdGF0dmFsID0gMDsKKwkJaWYgKCFwaS0+c3lzY2FsbF9oYW5kbGVyc1tpXS5mdW5jCisJCSAgICAocGksIHdoYXQsIHdoeSwgJnBpLT5zYXZlZF9ydG52YWwsICZwaS0+c2F2ZWRfc3RhdHZhbCkpCisJCSAgcGktPmhhZF9ldmVudCA9IDA7CisJCWJyZWFrOworCSAgICAgIH0KKworCSAgaWYgKCFmb3VuZF9oYW5kbGVyKQorCSAgICB7CisJICAgICAgaWYgKHdoeSA9PSBQUl9TWVNFTlRSWSkKKwkJZXJyb3IgKCJQUl9TWVNFTlRSWSwgdW5oYW5kbGVkIHN5c3RlbSBjYWxsICVkIiwgd2hhdCk7CisJICAgICAgZWxzZQorCQllcnJvciAoIlBSX1NZU0VYSVQsIHVuaGFuZGxlZCBzeXN0ZW0gY2FsbCAlZCIsIHdoYXQpOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBmaW5kIGEgcmVsZXZhbnQgcHJvY2VzcyB3aXRoIGFuIGV2ZW50ICovCisKKyAgZm9yIChwaSA9IHByb2NpbmZvX2xpc3Q7IHBpOyBwaSA9IHBpLT5uZXh0KQorICAgIGlmIChwaS0+aGFkX2V2ZW50ICYmIChwaWQgPT0gLTEgfHwgcGktPnBpZCA9PSBwaWQpKQorICAgICAgYnJlYWs7CisKKyAgaWYgKCFwaSkKKyAgICB7CisgICAgICB3YWl0X2ZkICgpOworICAgICAgZ290byBzY2FuX2FnYWluOworICAgIH0KKworICBpZiAoIWNoZWNrZXJyCisgICYmICEoVEhFX1BSX0xXUChwaS0+cHJzdGF0dXMpLnByX2ZsYWdzICYgKFBSX1NUT1BQRUQgfCBQUl9JU1RPUCkpKQorICAgIHsKKyAgICAgIGlmICghcHJvY2ZzX3dyaXRlX3Bjd3N0b3AgKHBpKSkKKwl7CisJICBjaGVja2VycisrOworCX0KKyAgICB9CisgIGlmIChjaGVja2VycikKKyAgICB7CisgICAgICBpZiAoZXJybm8gPT0gRU5PRU5UKQorCXsKKwkgIC8qIFhYWCBGaXhtZSAtLSB3aGF0IHRvIGRvIGlmIGF0dGFjaGVkPyAgQ2FuJ3QgY2FsbCB3YWl0Li4uICovCisJICBydG52YWwgPSB3YWl0ICgmc3RhdHZhbCk7CisJICBpZiAoKHJ0bnZhbCkgIT0gKFBJREdFVCAoaW5mZXJpb3JfcGlkKSkpCisJICAgIHsKKwkgICAgICBwcmludF9zeXNfZXJybXNnIChwaS0+cGF0aG5hbWUsIGVycm5vKTsKKwkgICAgICBlcnJvciAoInByb2Nmc193YWl0OiB3YWl0IGZhaWxlZCwgcmV0dXJuZWQgJWQiLCBydG52YWwpOworCSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBwcmludF9zeXNfZXJybXNnIChwaS0+cGF0aG5hbWUsIGVycm5vKTsKKwkgIGVycm9yICgiUElPQ1NUQVRVUyBvciBQSU9DV1NUT1AgZmFpbGVkLiIpOworCSAgLyogTk9UUkVBQ0hFRCAqLworCX0KKyAgICB9CisgIGVsc2UgaWYgKFRIRV9QUl9MV1AocGktPnByc3RhdHVzKS5wcl9mbGFncyAmIChQUl9TVE9QUEVEIHwgUFJfSVNUT1ApKQorICAgIHsKKyNpZmRlZiBVTklYV0FSRQorICAgICAgcnRudmFsID0gcGktPnByc3RhdHVzLnByX3BpZDsKKyNlbHNlCisgICAgICBydG52YWwgPSBwaS0+cGlkOworI2VuZGlmCisgICAgICB3aHkgPSBUSEVfUFJfTFdQKHBpLT5wcnN0YXR1cykucHJfd2h5OworICAgICAgd2hhdCA9IFRIRV9QUl9MV1AocGktPnByc3RhdHVzKS5wcl93aGF0OworCisgICAgICBzd2l0Y2ggKHdoeSkKKwl7CisJY2FzZSBQUl9TSUdOQUxMRUQ6CisJICBzdGF0dmFsID0gKHdoYXQgPDwgOCkgfCAwMTc3OworCSAgYnJlYWs7CisJY2FzZSBQUl9TWVNFTlRSWToKKwljYXNlIFBSX1NZU0VYSVQ6CisJICBydG52YWwgPSBwaS0+c2F2ZWRfcnRudmFsOworCSAgc3RhdHZhbCA9IHBpLT5zYXZlZF9zdGF0dmFsOworCSAgYnJlYWs7CisJY2FzZSBQUl9SRVFVRVNURUQ6CisJICBzdGF0dmFsID0gKFNJR1NUT1AgPDwgOCkgfCAwMTc3OworCSAgYnJlYWs7CisJY2FzZSBQUl9KT0JDT05UUk9MOgorCSAgc3RhdHZhbCA9ICh3aGF0IDw8IDgpIHwgMDE3NzsKKwkgIGJyZWFrOworCWNhc2UgUFJfRkFVTFRFRDoKKwkgIHN3aXRjaCAod2hhdCkKKwkgICAgeworI2lmZGVmIEZMVFdBVENICisJICAgIGNhc2UgRkxUV0FUQ0g6CisJICAgICAgc3RhdHZhbCA9IChTSUdUUkFQIDw8IDgpIHwgMDE3NzsKKwkgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIEZMVEtXQVRDSAorCSAgICBjYXNlIEZMVEtXQVRDSDoKKwkgICAgICBzdGF0dmFsID0gKFNJR1RSQVAgPDwgOCkgfCAwMTc3OworCSAgICAgIGJyZWFrOworI2VuZGlmCisjaWZuZGVmIEZBVUxURURfVVNFX1NJR0lORk8KKwkgICAgICAvKiBJcml4LCBjb250cmFyeSB0byB0aGUgZG9jdW1lbnRhdGlvbiwgZmlsbHMgaW4gMCBmb3Igc2lfc2lnbm8uCisJCSBTb2xhcmlzIGZpbGxzIGluIHNpX3NpZ25vLiAgSSdtIG5vdCBzdXJlIGFib3V0IG90aGVycy4gICovCisJICAgIGNhc2UgRkxUUFJJVjoKKwkgICAgY2FzZSBGTFRJTEw6CisJICAgICAgc3RhdHZhbCA9IChTSUdJTEwgPDwgOCkgfCAwMTc3OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEZMVEJQVDoKKwkgICAgY2FzZSBGTFRUUkFDRToKKwkgICAgICBzdGF0dmFsID0gKFNJR1RSQVAgPDwgOCkgfCAwMTc3OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEZMVFNUQUNLOgorCSAgICBjYXNlIEZMVEFDQ0VTUzoKKwkgICAgY2FzZSBGTFRCT1VORFM6CisJICAgICAgc3RhdHZhbCA9IChTSUdTRUdWIDw8IDgpIHwgMDE3NzsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBGTFRJT1ZGOgorCSAgICBjYXNlIEZMVElaRElWOgorCSAgICBjYXNlIEZMVEZQRToKKwkgICAgICBzdGF0dmFsID0gKFNJR0ZQRSA8PCA4KSB8IDAxNzc7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRkxUUEFHRToJCS8qIFJlY292ZXJhYmxlIHBhZ2UgZmF1bHQgKi8KKyNlbmRpZiAvKiBub3QgRkFVTFRFRF9VU0VfU0lHSU5GTyAqLworCSAgICBkZWZhdWx0OgorCSAgICAgIC8qIFVzZSB0aGUgc2lnbmFsIHdoaWNoIHRoZSBrZXJuZWwgYXNzaWducy4gIFRoaXMgaXMgYmV0dGVyIHRoYW4KKwkJIHRyeWluZyB0byBzZWNvbmQtZ3Vlc3MgaXQgZnJvbSB0aGUgZmF1bHQuICBJbiBmYWN0LCBJIHN1c3BlY3QKKwkJIHRoYXQgRkxUQUNDRVNTIGNhbiBiZSBlaXRoZXIgU0lHU0VHViBvciBTSUdCVVMuICAqLworICAgICAgICAgICAgICBzdGF0dmFsID0KKwkJICgoVEhFX1BSX0xXUChwaS0+cHJzdGF0dXMpLnByX2luZm8uc2lfc2lnbm8pIDw8IDgpIHwgMDE3NzsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGVycm9yICgiUElPQ1dTVE9QLCB1bmtub3duIHdoeSAlZCwgd2hhdCAlZCIsIHdoeSwgd2hhdCk7CisJfQorICAgICAgLyogU3RvcCBhbGwgdGhlIG90aGVyIHRocmVhZHMgd2hlbiBhbnkgb2YgdGhlbSBzdG9wcy4gICovCisKKyAgICAgIHsKKwlzdHJ1Y3QgcHJvY2luZm8gKnByb2NpbmZvLCAqbmV4dF9waTsKKworCWZvciAocHJvY2luZm8gPSBwcm9jaW5mb19saXN0OyBwcm9jaW5mbzsgcHJvY2luZm8gPSBuZXh0X3BpKQorCSAgeworCSAgICBuZXh0X3BpID0gcHJvY2luZm8tPm5leHQ7CisJICAgIGlmICghcHJvY2luZm8tPmhhZF9ldmVudCkKKwkgICAgICB7CisjaWZkZWYgUFJPQ0ZTX1VTRV9SRUFEX1dSSVRFCisJCWxvbmcgY21kID0gUENTVE9QOworCQlpZiAod3JpdGUgKHBpLT5jdGxfZmQsIChjaGFyICopICZjbWQsIHNpemVvZiAobG9uZykpIDwgMCkKKwkJICB7CisJCSAgICBwcmludF9zeXNfZXJybXNnIChwcm9jaW5mby0+cGF0aG5hbWUsIGVycm5vKTsKKwkJICAgIGVycm9yICgiUENTVE9QIGZhaWxlZCIpOworCQkgIH0KKyNlbHNlCisJCS8qIEEgYnVnIGluIFNvbGFyaXMgKDIuNSkgY2F1c2VzIHVzIHRvIGhhbmcgd2hlbiB0cnlpbmcgdG8KKwkJICAgc3RvcCBhIHN0b3BwZWQgcHJvY2Vzcy4gIFNvLCB3ZSBoYXZlIHRvIGNoZWNrIGZpcnN0IGluCisJCSAgIG9yZGVyIHRvIGF2b2lkIHRoZSBoYW5nLiAqLworCQlpZiAoIXByb2Nmc19yZWFkX3N0YXR1cyAocHJvY2luZm8pKQorCQkgIHsKKwkJICAgIC8qIFRoZSBMV1AgaGFzIGFwcGFyZW50bHkgdGVybWluYXRlZC4gICovCisJCSAgICBpZiAoaW5mb192ZXJib3NlKQorCQkgICAgICBwcmludGZfZmlsdGVyZWQgKCJMV1AgJWQgZG9lc24ndCByZXNwb25kLlxuIiwgCisJCQkJICAgICAgIChwcm9jaW5mby0+cGlkID4+IDE2KSAmIDB4ZmZmZik7CisJCSAgICBjbG9zZV9wcm9jX2ZpbGUgKHByb2NpbmZvKTsKKwkJICAgIGNvbnRpbnVlOworCQkgIH0KKworCQlpZiAoIShwcm9jaW5mby0+cHJzdGF0dXMucHJfZmxhZ3MgJiBQUl9TVE9QUEVEKSkKKwkJICBpZiAoaW9jdGwgKHByb2NpbmZvLT5jdGxfZmQsIFBJT0NTVE9QLCAmcHJvY2luZm8tPnByc3RhdHVzKQorCQkgICAgICA8IDApCisJCSAgICB7CisJCSAgICAgIHByaW50X3N5c19lcnJtc2cgKHByb2NpbmZvLT5wYXRobmFtZSwgZXJybm8pOworCQkgICAgICB3YXJuaW5nICgiUElPQ1NUT1AgZmFpbGVkIik7CisJCSAgICB9CisjZW5kaWYKKwkgICAgICB9CisJICB9CisgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZXJyb3IgKCJQSU9DV1NUT1AsIHN0b3BwZWQgZm9yIHVua25vd24vdW5oYW5kbGVkIHJlYXNvbiwgZmxhZ3MgJSN4IiwKKwkgICAgIFRIRV9QUl9MV1AocGktPnByc3RhdHVzKS5wcl9mbGFncyk7CisgICAgfQorCisgIHN0b3JlX3dhaXRzdGF0dXMgKG91cnN0YXR1cywgc3RhdHZhbCk7CisKKyAgaWYgKHJ0bnZhbCA9PSAtMSkJCS8qIE5vIG1vcmUgY2hpbGRyZW4gdG8gd2FpdCBmb3IgKi8KKyAgICB7CisgICAgICB3YXJuaW5nICgiQ2hpbGQgcHJvY2VzcyB1bmV4cGVjdGVkbHkgbWlzc2luZyIpOworICAgICAgLyogQ2xhaW0gaXQgZXhpdGVkIHdpdGggdW5rbm93biBzaWduYWwuICAqLworICAgICAgb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NJR05BTExFRDsKKyAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9VTktOT1dOOworICAgICAgcmV0dXJuIHJ0bnZhbDsKKyAgICB9CisKKyAgcGktPmhhZF9ldmVudCA9IDA7CQkvKiBJbmRpY2F0ZSB0aGF0IHdlJ3ZlIHNlZW4gdGhpcyBvbmUgKi8KKyAgcmV0dXJuIChydG52YWwpOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJc2V0X3Byb2Nfc2lnaW5mbyAtIHNldCBhIHByb2Nlc3MncyBjdXJyZW50IHNpZ25hbCBpbmZvCisKK1NZTk9QU0lTCisKKwl2b2lkIHNldF9wcm9jX3NpZ2luZm8gKHN0cnVjdCBwcm9jaW5mbyAqcGlwLCBpbnQgc2lnbm8pOworCitERVNDUklQVElPTgorCisJR2l2ZW4gYSBwb2ludGVyIHRvIGEgcHJvY2VzcyBpbmZvIHN0cnVjdCBpbiBQSVAgYW5kIGEgc2lnbmFsIG51bWJlcgorCWluIFNJR05PLCBzZXQgdGhlIHByb2Nlc3MncyBjdXJyZW50IHNpZ25hbCBhbmQgaXRzIGFzc29jaWF0ZWQgc2lnbmFsCisJaW5mb3JtYXRpb24uICBUaGUgc2lnbmFsIHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZSBwcm9jZXNzIGltbWVkaWF0ZWx5CisJYWZ0ZXIgZXhlY3V0aW9uIGlzIHJlc3VtZWQsIGV2ZW4gaWYgaXQgaXMgYmVpbmcgaGVsZC4gIEluIGFkZGl0aW9uLAorCXRoaXMgcGFydGljdWxhciBkZWxpdmVyeSB3aWxsIG5vdCBjYXVzZSBhbm90aGVyIFBSX1NJR05BTExFRCBzdG9wCisJZXZlbiBpZiB0aGUgc2lnbmFsIGlzIGJlaW5nIHRyYWNlZC4KKworCUlmIHdlIGFyZSBub3QgZGVsaXZlcmluZyB0aGUgc2FtZSBzaWduYWwgdGhhdCB0aGUgcHJzdGF0dXMgc2lnaW5mbworCXN0cnVjdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCwgdGhlbiBzeW50aGVzaXplIGEgc2lnaW5mbyBzdHJ1Y3QKKwl0byBtYXRjaCB0aGUgc2lnbmFsIHdlIGFyZSBkb2luZyB0byBkZWxpdmVyLCBtYWtlIGl0IG9mIHRoZSB0eXBlCisJImdlbmVyYXRlZCBieSBhIHVzZXIgcHJvY2VzcyIsIGFuZCBzZW5kIHRoaXMgc3ludGhlc2l6ZWQgY29weS4gIFdoZW4KKwl1c2VkIHRvIHNldCB0aGUgaW5mZXJpb3IncyBzaWduYWwgc3RhdGUsIHRoaXMgd2lsbCBiZSByZXF1aXJlZCBpZiB3ZQorCWFyZSBub3QgY3VycmVudGx5IHN0b3BwZWQgYmVjYXVzZSBvZiBhIHRyYWNlZCBzaWduYWwsIG9yIGlmIHdlIGRlY2lkZQorCXRvIGNvbnRpbnVlIHdpdGggYSBkaWZmZXJlbnQgc2lnbmFsLgorCisJTm90ZSB0aGF0IHdoZW4gY29udGludWluZyB0aGUgaW5mZXJpb3IgZnJvbSBhIHN0b3AgZHVlIHRvIHJlY2VpcHQKKwlvZiBhIHRyYWNlZCBzaWduYWwsIHdlIGVpdGhlciBoYXZlIHNldCBQUkNTSUcgdG8gY2xlYXIgdGhlIGV4aXN0aW5nCisJc2lnbmFsLCBvciB3ZSBoYXZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBkbyBhIFBJT0NTU0lHIHdpdGggZWl0aGVyCisJdGhlIGV4aXN0aW5nIHNpZ2luZm8gc3RydWN0IGZyb20gcHJfaW5mbywgb3Igb25lIHdlIGhhdmUgc3ludGhlc2l6ZWQKKwlhcHByb3ByaWF0ZWx5IGZvciB0aGUgc2lnbmFsIHdlIHdhbnQgdG8gZGVsaXZlci4gIE90aGVyd2lzZSBpZiB0aGUKKwlzaWduYWwgaXMgc3RpbGwgYmVpbmcgdHJhY2VkLCB0aGUgaW5mZXJpb3Igd2lsbCBpbW1lZGlhdGVseSBzdG9wCisJYWdhaW4uCisKKwlTZWUgc2lnaW5mbyg1KSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworc3RhdGljIHZvaWQKK3NldF9wcm9jX3NpZ2luZm8gKHBpcCwgc2lnbm8pCisgICAgIHN0cnVjdCBwcm9jaW5mbyAqcGlwOworICAgICBpbnQgc2lnbm87Cit7CisgIHN0cnVjdCBzaWdpbmZvIG5ld3NpZ2luZm87CisgIHN0cnVjdCBzaWdpbmZvICpzaXA7CisgIHN0cnVjdCBzaWdpX2N0bCBzaWN0bDsKKworI2lmZGVmIFBST0NGU19ET05UX1BJT0NTU0lHX0NVUlNJRworICAvKiBXaXRoIEFscGhhIE9TRi8xIHByb2NmcywgdGhlIGtlcm5lbCBnZXRzIHJlYWxseSBjb25mdXNlZCBpZiBpdAorICAgICByZWNlaXZlcyBhIFBJT0NTU0lHIHdpdGggYSBzaWduYWwgaWRlbnRpY2FsIHRvIHRoZSBjdXJyZW50IHNpZ25hbCwKKyAgICAgaXQgbWVzc2VzIHVwIHRoZSBjdXJyZW50IHNpZ25hbC4gV29yayBhcm91bmQgdGhlIGtlcm5lbCBidWcuICAqLworICBpZiAoc2lnbm8gPT0gVEhFX1BSX0xXUChwaXAtPnByc3RhdHVzKS5wcl9jdXJzaWcpCisgICAgcmV0dXJuOworI2VuZGlmCisKKyNpZmRlZiBVTklYV0FSRQorICBpZiAoc2lnbm8gPT0gVEhFX1BSX0xXUChwaXAtPnByc3RhdHVzKS5wcl9pbmZvLnNpX3NpZ25vKQorICAgIHsKKyAgICAgIG1lbWNweSAoKGNoYXIgKikgJnNpY3RsLnNpZ2luZm8sIChjaGFyICopICZwaXAtPnByc3RhdHVzLnByX2x3cC5wcl9pbmZvLAorCQlzaXplb2YgKHNpZ2luZm9fdCkpOworICAgIH0KKyNlbHNlCisgIGlmIChzaWdubyA9PSBUSEVfUFJfTFdQKHBpcC0+cHJzdGF0dXMpLnByX2luZm8uc2lfc2lnbm8pCisgICAgeworICAgICAgc2lwID0gJnBpcCAtPiBwcnN0YXR1cy5wcl9pbmZvOworICAgIH0KKyNlbmRpZgorICBlbHNlCisgICAgeworI2lmZGVmIFVOSVhXQVJFCisgICAgICBzaWdpbmZvX3QgKnNpcCA9ICZzaWN0bC5zaWdpbmZvOworICAgICAgbWVtc2V0ICgoY2hhciAqKSBzaXAsIDAsIHNpemVvZiAoc2lnaW5mb190KSk7CisjZWxzZQorICAgICAgbWVtc2V0ICgoY2hhciAqKSAmbmV3c2lnaW5mbywgMCwgc2l6ZW9mIChuZXdzaWdpbmZvKSk7CisgICAgICBzaXAgPSAmbmV3c2lnaW5mbzsKKyNlbmRpZgorICAgICAgc2lwIC0+IHNpX3NpZ25vID0gc2lnbm87CisgICAgICBzaXAgLT4gc2lfY29kZSA9IDA7CisgICAgICBzaXAgLT4gc2lfZXJybm8gPSAwOworICAgICAgc2lwIC0+IHNpX3BpZCA9IGdldHBpZCAoKTsKKyAgICAgIHNpcCAtPiBzaV91aWQgPSBnZXR1aWQgKCk7CisgICAgfQorI2lmZGVmIFBST0NGU19VU0VfUkVBRF9XUklURQorICBzaWN0bC5jbWQgPSBQQ1NTSUc7CisgIGlmICh3cml0ZSAocGlwLT5jdGxfZmQsIChjaGFyICopICZzaWN0bCwgc2l6ZW9mIChzdHJ1Y3Qgc2lnaV9jdGwpKSA8IDApCisjZWxzZQorICBpZiAoaW9jdGwgKHBpcC0+Y3RsX2ZkLCBQSU9DU1NJRywgc2lwKSA8IDApCisjZW5kaWYKKyAgICB7CisgICAgICBwcmludF9zeXNfZXJybXNnIChwaXAgLT4gcGF0aG5hbWUsIGVycm5vKTsKKyAgICAgIHdhcm5pbmcgKCJQSU9DU1NJRyBmYWlsZWQiKTsKKyAgICB9Cit9CisKKy8qIFJlc3VtZSBleGVjdXRpb24gb2YgcHJvY2VzcyBQSUQuICBJZiBTVEVQIGlzIG5vemVybywgdGhlbgorICAganVzdCBzaW5nbGUgc3RlcCBpdC4gIElmIFNJR05BTCBpcyBub256ZXJvLCByZXN0YXJ0IGl0IHdpdGggdGhhdAorICAgc2lnbmFsIGFjdGl2YXRlZC4gICovCisKK3N0YXRpYyB2b2lkCitwcm9jZnNfcmVzdW1lIChwaWQsIHN0ZXAsIHNpZ25vKQorICAgICBpbnQgcGlkOworICAgICBpbnQgc3RlcDsKKyAgICAgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ25vOworeworICBpbnQgc2lnbmFsX3RvX3Bhc3M7CisgIHN0cnVjdCBwcm9jaW5mbyAqcGksICpwcm9jaW5mbywgKm5leHRfcGk7CisgIHN0cnVjdCBwcm9jX2N0bCBwY3RsOworCisgIHBpID0gZmluZF9wcm9jaW5mbyAocGlkID09IC0xID8gaW5mZXJpb3JfcGlkIDogcGlkLCAwKTsKKworICBlcnJubyA9IDA7CisjaWZkZWYgVU5JWFdBUkUKKyAgcGN0bC5jbWQgPSBQQ1JVTjsKKyAgcGN0bC5kYXRhID0gUFJDRkFVTFQ7CisjZWxzZQorICBwaS0+cHJydW4ucHJfZmxhZ3MgPSBQUlNUUkFDRSB8IFBSU0ZBVUxUIHwgUFJDRkFVTFQ7CisjZW5kaWYKKworI2lmIDAKKyAgLyogSXQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkuICBJZiB0aGUgdXNlciBleHBsaWNpdGx5IGNoYW5nZXMgdGhlIHZhbHVlLAorICAgICB2YWx1ZV9hc3NpZ24gY2FsbHMgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMsIHdoaWNoIHdyaXRlcyBpdC4gICovCisvKglJdCBtYXkgbm90IGJlIGFic29sdXRlbHkgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgdGhlIFBDIHZhbHVlIGZvcgorCXJlc3RhcnRpbmcsIGJ1dCB0byBiZSBzYWZlIHdlIHVzZSB0aGUgdmFsdWUgdGhhdCBnZGIgY29uc2lkZXJzCisJdG8gYmUgY3VycmVudC4gIE9uZSBjYXNlIHdoZXJlIHRoaXMgbWlnaHQgYmUgbmVjZXNzYXJ5IGlzIGlmIHRoZQorCXVzZXIgZXhwbGljaXRseSBjaGFuZ2VzIHRoZSBQQyB2YWx1ZSB0aGF0IGdkYiBjb25zaWRlcnMgdG8gYmUKKwljdXJyZW50LiAgRklYTUU6ICBJbnZlc3RpZ2F0ZSBpZiB0aGlzIGlzIG5lY2Vzc2FyeSBvciBub3QuICAqLworCisjaWZkZWYgUFJTVkFERFJfQlJPS0VOCisvKiBDYW4ndCBkbyB0aGlzIHVuZGVyIFNvbGFyaXMgcnVubmluZyBvbiBhIFNwYXJjLCBhcyB0aGVyZSBzZWVtcyB0byBiZSBubworICAgcGxhY2UgdG8gcHV0IG5QQy4gIEluIGZhY3QsIGlmIHlvdSB1c2UgdGhpcywgblBDIHNlZW1zIHRvIGJlIHNldCB0byBzb21lCisgICByYW5kb20gZ2FyYmFnZS4gIFdlIGhhdmUgdG8gcmVseSBvbiB0aGUgZmFjdCB0aGF0IFBDIGFuZCBuUEMgaGF2ZSBiZWVuCisgICB3cml0dGVuIHByZXZpb3VzbHkgdmlhIFBJT0NTUkVHIGR1cmluZyBhIHJlZ2lzdGVyIGZsdXNoLiAqLworCisgIHBpLT5wcnJ1bi5wcl92YWRkciA9IChjYWRkcl90KSAqKGludCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKFBDX1JFR05VTSldOworICBwaS0+cHJydW4ucHJfZmxhZ3MgIT0gUFJTVkFERFI7CisjZW5kaWYKKyNlbmRpZgorCisgIGlmIChzaWdubyA9PSBUQVJHRVRfU0lHTkFMX1NUT1AgJiYgcGktPm5vcGFzc19uZXh0X3NpZ3N0b3ApCisgICAgLyogV2hlbiBhdHRhY2hpbmcgdG8gYSBjaGlsZCBwcm9jZXNzLCBpZiB3ZSBmb3JjZWQgaXQgdG8gc3RvcCB3aXRoCisgICAgICAgYSBQSU9DU1RPUCwgdGhlbiB3ZSB3aWxsIGhhdmUgc2V0IHRoZSBub3Bhc3NfbmV4dF9zaWdzdG9wIGZsYWcuCisgICAgICAgVXBvbiByZXN1bWluZyB0aGUgZmlyc3QgdGltZSBhZnRlciBzdWNoIGEgc3RvcCwgd2UgZXhwbGljaXRseQorICAgICAgIGluaGliaXQgc2VuZGluZyBpdCBhbm90aGVyIFNJR1NUT1AsIHdoaWNoIHdvdWxkIGJlIHRoZSBub3JtYWwKKyAgICAgICByZXN1bHQgb2YgZGVmYXVsdCBzaWduYWwgaGFuZGxpbmcuICBPbmUgcG90ZW50aWFsIGRyYXdiYWNrIHRvCisgICAgICAgdGhpcyBpcyB0aGF0IHdlIHdpbGwgYWxzbyBpZ25vcmUgYW55IGF0dGVtcHQgdG8gYnkgdGhlIHVzZXIKKyAgICAgICB0byBleHBsaWNpdGx5IGNvbnRpbnVlIGFmdGVyIHRoZSBhdHRhY2ggd2l0aCBhIFNJR1NUT1AuICBVbHRpbWF0ZWx5CisgICAgICAgdGhpcyBwcm9ibGVtIHNob3VsZCBiZSBkZWFsdCB3aXRoIGJ5IG1ha2luZyB0aGUgcm91dGluZXMgdGhhdAorICAgICAgIGRlYWwgd2l0aCB0aGUgaW5mZXJpb3IgYSBsaXR0bGUgc21hcnRlciwgYW5kIHBvc3NpYmx5IGV2ZW4gYWxsb3cKKyAgICAgICBhbiBpbmZlcmlvciB0byBjb250aW51ZSBydW5uaW5nIGF0IHRoZSBzYW1lIHRpbWUgYXMgZ2RiLiAgKEZJWE1FPykgICovCisgICAgc2lnbmFsX3RvX3Bhc3MgPSAwOworICBlbHNlIGlmIChzaWdubyA9PSBUQVJHRVRfU0lHTkFMX1RTVFAKKwkgICAmJiBUSEVfUFJfTFdQKHBpLT5wcnN0YXR1cykucHJfY3Vyc2lnID09IFNJR1RTVFAKKwkgICAmJiBUSEVfUFJfTFdQKHBpLT5wcnN0YXR1cykucHJfYWN0aW9uLnNhX2hhbmRsZXIgPT0gU0lHX0RGTAorCSAgICkKKworICAgIC8qIFdlIGFyZSBhYm91dCB0byBwYXNzIHRoZSBpbmZlcmlvciBhIFNJR1RTVFAgd2hvc2UgYWN0aW9uIGlzCisgICAgICAgU0lHX0RGTC4gIFRoZSBTSUdfREZMIGFjdGlvbiBmb3IgYSBTSUdUU1RQIGlzIHRvIHN0b3AKKyAgICAgICAobm90aWZ5aW5nIHRoZSBwYXJlbnQgdmlhIHdhaXQoKSksIGFuZCB0aGVuIGtlZXAgZ29pbmcgZnJvbSB0aGUKKyAgICAgICBzYW1lIHBsYWNlIHdoZW4gdGhlIHBhcmVudCBpcyByZWFkeSBmb3IgeW91IHRvIGtlZXAgZ29pbmcuICBTbworICAgICAgIHVuZGVyIHRoZSBkZWJ1Z2dlciwgaXQgc2hvdWxkIGRvIG5vdGhpbmcgKGFzIGlmIHRoZSBwcm9ncmFtIGhhZAorICAgICAgIGJlZW4gc3RvcHBlZCBhbmQgdGhlbiBsYXRlciByZXN1bWVkLiAgVW5kZXIgcHRyYWNlLCB0aGlzCisgICAgICAgaGFwcGVucyBmb3IgdXMsIGJ1dCB1bmRlciAvcHJvYywgdGhlIHN5c3RlbSBvYmxpZ2luZ2x5IHN0b3BzCisgICAgICAgdGhlIHByb2Nlc3MsIGFuZCB3YWl0X2Zvcl9pbmZlcmlvciB3b3VsZCBoYXZlIG5vIHdheSBvZgorICAgICAgIGRpc3Rpbmd1aXNoaW5nIHRoYXQgdHlwZSBvZiBzdG9wICh3aGljaCBpbmRpY2F0ZXMgdGhhdCB3ZQorICAgICAgIHNob3VsZCBqdXN0IHN0YXJ0IGl0IGFnYWluKSwgd2l0aCBhIHN0b3AgZHVlIHRvIHRoZSBwcl90cmFjZQorICAgICAgIGZpZWxkIG9mIHRoZSBwcnJ1bl90IHN0cnVjdC4KKworICAgICAgIE5vdGUgdGhhdCBpZiB0aGUgU0lHVFNUUCBpcyBiZWluZyBjYXVnaHQsIHdlICpkbyogbmVlZCB0byBwYXNzIGl0LAorICAgICAgIGJlY2F1c2UgdGhlIGhhbmRsZXIgbmVlZHMgdG8gZ2V0IGV4ZWN1dGVkLiAgKi8KKyAgICBzaWduYWxfdG9fcGFzcyA9IDA7CisgIGVsc2UKKyAgICBzaWduYWxfdG9fcGFzcyA9IHRhcmdldF9zaWduYWxfdG9faG9zdCAoc2lnbm8pOworCisgIGlmIChzaWduYWxfdG9fcGFzcykKKyAgICB7CisgICAgICBzZXRfcHJvY19zaWdpbmZvIChwaSwgc2lnbmFsX3RvX3Bhc3MpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZmRlZiBVTklYV0FSRQorICAgICAgcGN0bC5kYXRhIHw9IFBSQ1NJRzsKKyNlbHNlCisgICAgICBwaS0+cHJydW4ucHJfZmxhZ3MgfD0gUFJDU0lHOworI2VuZGlmCisgICAgfQorICBwaS0+bm9wYXNzX25leHRfc2lnc3RvcCA9IDA7CisgIGlmIChzdGVwKQorICAgIHsKKyNpZmRlZiBVTklYV0FSRQorICAgICAgcGN0bC5kYXRhIHw9IFBSU1RFUDsKKyNlbHNlCisgICAgICBwaS0+cHJydW4ucHJfZmxhZ3MgfD0gUFJTVEVQOworI2VuZGlmCisgICAgfQorICBwaS0+aGFkX2V2ZW50ID0gMDsKKyAgLyogRG9uJ3QgdHJ5IHRvIHN0YXJ0IGEgcHJvY2VzcyB1bmxlc3MgaXQncyBzdG9wcGVkIG9uIGFuCisgICAgIGBldmVudCBvZiBpbnRlcmVzdCcuICBEb2luZyBzbyB3aWxsIGNhdXNlIGVycm9ycy4gICovCisKKyAgaWYgKCFwcm9jZnNfcmVhZF9zdGF0dXMgKHBpKSkKKyAgICB7CisgICAgICAvKiBUaGUgTFdQIGhhcyBhcHBhcmVudGx5IHRlcm1pbmF0ZWQuICAqLworICAgICAgaWYgKGluZm9fdmVyYm9zZSkKKwlwcmludGZfZmlsdGVyZWQgKCJMV1AgJWQgZG9lc24ndCByZXNwb25kLlxuIiwgCisJCQkgKHBpLT5waWQgPj4gMTYpICYgMHhmZmZmKTsKKyAgICAgIGNsb3NlX3Byb2NfZmlsZSAocGkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZmRlZiBQUk9DRlNfVVNFX1JFQURfV1JJVEUKKyAgICAgIGlmICh3cml0ZSAocGktPmN0bF9mZCwgKGNoYXIgKikgJnBjdGwsIHNpemVvZiAoc3RydWN0IHByb2NfY3RsKSkgPCAwKQorI2Vsc2UKKyAgICAgIGlmICgocGktPnByc3RhdHVzLnByX2ZsYWdzICYgUFJfSVNUT1ApCisJICAmJiBpb2N0bCAocGktPmN0bF9mZCwgUElPQ1JVTiwgJnBpLT5wcnJ1bikgIT0gMCkKKyNlbmRpZgorCXsKKwkgIC8qIFRoZSBMV1AgaGFzIGFwcGFyZW50bHkgdGVybWluYXRlZC4gICovCisJICBpZiAoaW5mb192ZXJib3NlKQorCSAgICBwcmludGZfZmlsdGVyZWQgKCJMV1AgJWQgZG9lc24ndCByZXNwb25kLlxuIiwgCisJCQkgICAgIChwaS0+cGlkID4+IDE2KSAmIDB4ZmZmZik7CisJICBjbG9zZV9wcm9jX2ZpbGUgKHBpKTsKKwl9CisgICAgfQorCisgIC8qIENvbnRpbnVlIGFsbCB0aGUgb3RoZXIgdGhyZWFkcyB0aGF0IGhhdmVuJ3QgaGFkIGFuIGV2ZW50IG9mIGludGVyZXN0LgorICAgICBBbHNvIGNvbnRpbnVlIHRoZW0gaWYgdGhleSBoYXZlIE5PUEFTU19ORVhUX1NJR1NUT1Agc2V0OyB0aGlzIGlzIG9ubHkKKyAgICAgc2V0IGJ5IGRvX2F0dGFjaCwgYW5kIG1lYW5zIHRoaXMgaXMgdGhlIGZpcnN0IHJlc3VtZSBhZnRlciBhbiBhdHRhY2guICAKKyAgICAgQWxsIHRocmVhZHMgd2VyZSBDU1RPUCdkIGJ5IGRvX2F0dGFjaCwgYW5kIHNob3VsZCBiZSByZXN1bWVkIG5vdy4gICovCisKKyAgaWYgKHBpZCA9PSAtMSkKKyAgICBmb3IgKHByb2NpbmZvID0gcHJvY2luZm9fbGlzdDsgcHJvY2luZm87IHByb2NpbmZvID0gbmV4dF9waSkKKyAgICAgIHsKKwluZXh0X3BpID0gcHJvY2luZm8tPm5leHQ7CisJaWYgKHBpICE9IHByb2NpbmZvKQorCSAgaWYgKCFwcm9jaW5mby0+aGFkX2V2ZW50IHx8IAorCSAgICAgIChwcm9jaW5mby0+bm9wYXNzX25leHRfc2lnc3RvcCAmJiBzaWdubyA9PSBUQVJHRVRfU0lHTkFMX1NUT1ApKQorCSAgICB7CisJICAgICAgcHJvY2luZm8tPmhhZF9ldmVudCA9IHByb2NpbmZvLT5ub3Bhc3NfbmV4dF9zaWdzdG9wID0gMDsKKyNpZmRlZiBQUk9DRlNfVVNFX1JFQURfV1JJVEUKKwkgICAgICBwY3RsLmRhdGEgPSBQUkNGQVVMVCB8IFBSQ1NJRzsKKwkgICAgICBpZiAod3JpdGUgKHByb2NpbmZvLT5jdGxfZmQsIChjaGFyICopICZwY3RsLAorCQkJIHNpemVvZiAoc3RydWN0IHByb2NfY3RsKSkgPCAwKQorCQl7CisJCSAgaWYgKCFwcm9jZnNfcmVhZF9zdGF0dXMgKHByb2NpbmZvKSkKKwkJICAgIGZwcmludGZfdW5maWx0ZXJlZChnZGJfc3RkZXJyLCAKKwkJCQkgICAgICAgInByb2Nmc19yZWFkX3N0YXR1cyBmYWlsZWQsIGVycm5vPSVkXG4iLAorCQkJCSAgICAgICBlcnJubyk7CisJCSAgcHJpbnRfc3lzX2Vycm1zZyAocHJvY2luZm8tPnBhdGhuYW1lLCBlcnJubyk7CisJCSAgZXJyb3IgKCJQQ1JVTiBmYWlsZWQiKTsKKwkJfQorI2Vsc2UKKwkgICAgICBwcm9jaW5mby0+cHJydW4ucHJfZmxhZ3MgJj0gUFJTVEVQOworCSAgICAgIHByb2NpbmZvLT5wcnJ1bi5wcl9mbGFncyB8PSBQUkNGQVVMVCB8IFBSQ1NJRzsKKwkgICAgICBpZiAoIXByb2Nmc19yZWFkX3N0YXR1cyAocHJvY2luZm8pKQorCQl7CisJCSAgLyogVGhlIExXUCBoYXMgYXBwYXJlbnRseSB0ZXJtaW5hdGVkLiAgKi8KKwkJICBpZiAoaW5mb192ZXJib3NlKQorCQkgICAgcHJpbnRmX2ZpbHRlcmVkICgiTFdQICVkIGRvZXNuJ3QgcmVzcG9uZC5cbiIsIAorCQkJCSAgICAgKHByb2NpbmZvLT5waWQgPj4gMTYpICYgMHhmZmZmKTsKKwkJICBjbG9zZV9wcm9jX2ZpbGUgKHByb2NpbmZvKTsKKwkJICBjb250aW51ZTsKKwkJfQorCisJICAgICAgLyogRG9uJ3QgdHJ5IHRvIHN0YXJ0IGEgcHJvY2VzcyB1bmxlc3MgaXQncyBzdG9wcGVkIG9uIGFuCisJCSBgZXZlbnQgb2YgaW50ZXJlc3QnLiAgRG9pbmcgc28gd2lsbCBjYXVzZSBlcnJvcnMuICAqLworCisJICAgICAgaWYgKChwcm9jaW5mby0+cHJzdGF0dXMucHJfZmxhZ3MgJiBQUl9JU1RPUCkKKwkJICAmJiBpb2N0bCAocHJvY2luZm8tPmN0bF9mZCwgUElPQ1JVTiwgJnByb2NpbmZvLT5wcnJ1bikgPCAwKQorCQl7CisJCSAgaWYgKCFwcm9jZnNfcmVhZF9zdGF0dXMgKHByb2NpbmZvKSkKKwkJICAgIGZwcmludGZfdW5maWx0ZXJlZChnZGJfc3RkZXJyLCAKKwkJCQkgICAgICAgInByb2Nmc19yZWFkX3N0YXR1cyBmYWlsZWQsIGVycm5vPSVkXG4iLAorCQkJCSAgICAgICBlcnJubyk7CisJCSAgcHJpbnRfc3lzX2Vycm1zZyAocHJvY2luZm8tPnBhdGhuYW1lLCBlcnJubyk7CisJCSAgd2FybmluZyAoIlBJT0NSVU4gZmFpbGVkIik7CisJCX0KKyNlbmRpZgorCSAgICB9CisJcHJvY2ZzX3JlYWRfc3RhdHVzIChwcm9jaW5mbyk7CisgICAgICB9Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlwcm9jZnNfZmV0Y2hfcmVnaXN0ZXJzIC0tIGZldGNoIGN1cnJlbnQgcmVnaXN0ZXJzIGZyb20gaW5mZXJpb3IKKworU1lOT1BTSVMKKworCXZvaWQgcHJvY2ZzX2ZldGNoX3JlZ2lzdGVycyAoaW50IHJlZ25vKQorCitERVNDUklQVElPTgorCisJUmVhZCB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIGluZmVyaW9yJ3MgcmVnaXN0ZXJzLCBib3RoIHRoZQorCWdlbmVyYWwgcmVnaXN0ZXIgc2V0IGFuZCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKGlmIHN1cHBvcnRlZCkKKwlhbmQgdXBkYXRlIGdkYidzIGlkZWEgb2YgdGhlaXIgY3VycmVudCB2YWx1ZXMuCisKKyovCisKK3N0YXRpYyB2b2lkCitwcm9jZnNfZmV0Y2hfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBzdHJ1Y3QgcHJvY2luZm8gKnBpOworCisgIHBpID0gY3VycmVudF9wcm9jaW5mbzsKKworI2lmZGVmIFVOSVhXQVJFCisgIGlmIChwcm9jZnNfcmVhZF9zdGF0dXMgKHBpKSkKKyAgICB7CisgICAgICBzdXBwbHlfZ3JlZ3NldCAoJnBpLT5wcnN0YXR1cy5wcl9sd3AucHJfY29udGV4dC51Y19tY29udGV4dC5ncmVncyk7CisjaWYgZGVmaW5lZCAoRlAwX1JFR05VTSkKKyAgICAgIHN1cHBseV9mcHJlZ3NldCAoJnBpLT5wcnN0YXR1cy5wcl9sd3AucHJfY29udGV4dC51Y19tY29udGV4dC5mcHJlZ3MpOyAKKyNlbmRpZgorICAgIH0KKyNlbHNlIC8qIFVOSVhXQVJFICovCisgIGlmIChpb2N0bCAocGktPmN0bF9mZCwgUElPQ0dSRUcsICZwaS0+Z3JlZ3NldC5ncmVnc2V0KSAhPSAtMSkKKyAgICB7CisgICAgICBzdXBwbHlfZ3JlZ3NldCAoJnBpLT5ncmVnc2V0LmdyZWdzZXQpOworICAgIH0KKyNpZiBkZWZpbmVkIChGUDBfUkVHTlVNKQorICBpZiAoaW9jdGwgKHBpLT5jdGxfZmQsIFBJT0NHRlBSRUcsICZwaS0+ZnByZWdzZXQuZnByZWdzZXQpICE9IC0xKQorICAgIHsKKyAgICAgIHN1cHBseV9mcHJlZ3NldCAoJnBpLT5mcHJlZ3NldC5mcHJlZ3NldCk7CisgICAgfQorI2VuZGlmCisjZW5kaWYgLyogVU5JWFdBUkUgKi8KK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCXByb2NfaW5pdF9mYWlsZWQgLSBjYWxsZWQgd2hlbiAvcHJvYyBhY2Nlc3MgaW5pdGlhbGl6YXRpb24gZmFpbHMKK2ZhaWxzCisKK1NZTk9QU0lTCisKKwlzdGF0aWMgdm9pZCBwcm9jX2luaXRfZmFpbGVkIChzdHJ1Y3QgcHJvY2luZm8gKnBpLCAKKwkJCQkgICAgICBjaGFyICp3aHksIGludCBraWxsX3ApCisKK0RFU0NSSVBUSU9OCisKKwlUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBpbml0aWFsaXphdGlvbiBvZiBhY2Nlc3MgdG8gYSAvcHJvYworCWVudHJ5IGZhaWxzLiAgSXQgcHJpbnRzIGEgc3VpdGFibGUgZXJyb3IgbWVzc2FnZSwgZG9lcyBzb21lIGNsZWFudXAsCisJYW5kIHRoZW4gaW52b2tlcyB0aGUgc3RhbmRhcmQgZXJyb3IgcHJvY2Vzc2luZyByb3V0aW5lIHdoaWNoIGR1bXBzCisJdXMgYmFjayBpbnRvIHRoZSBjb21tYW5kIGxvb3AuICBJZiBLSUxMX1AgaXMgdHJ1ZSwgc2VuZHMgU0lHS0lMTC4KKyAqLworCitzdGF0aWMgdm9pZAorcHJvY19pbml0X2ZhaWxlZCAocGksIHdoeSwga2lsbF9wKQorICAgICBzdHJ1Y3QgcHJvY2luZm8gKnBpOworICAgICBjaGFyICp3aHk7CisgICAgIGludCAga2lsbF9wOworeworICBwcmludF9zeXNfZXJybXNnIChwaS0+cGF0aG5hbWUsIGVycm5vKTsKKyAgaWYgKGtpbGxfcCkKKyAgICBraWxsIChwaS0+cGlkLCBTSUdLSUxMKTsKKyAgY2xvc2VfcHJvY19maWxlIChwaSk7CisgIGVycm9yICh3aHkpOworICAvKiBOT1RSRUFDSEVEICovCit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwljbG9zZV9wcm9jX2ZpbGUgLSBjbG9zZSBhbnkgY3VycmVudGx5IG9wZW4gL3Byb2MgZW50cnkKKworU1lOT1BTSVMKKworCXN0YXRpYyB2b2lkIGNsb3NlX3Byb2NfZmlsZSAoc3RydWN0IHByb2NpbmZvICpwaXApCisKK0RFU0NSSVBUSU9OCisKKwlDbG9zZSBhbnkgY3VycmVudGx5IG9wZW4gL3Byb2MgZW50cnkgYW5kIG1hcmsgdGhlIHByb2Nlc3MgaW5mb3JtYXRpb24KKwllbnRyeSBhcyBpbnZhbGlkLiAgSW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgdHJ5IHRvIHJldXNlIGFueQorCXN0YWxlIGluZm9ybWF0aW9uLCB0aGUgcGlkLCBmZCwgYW5kIHBhdGhuYW1lcyBhcmUgZXhwbGljaXRseQorCWludmFsaWRhdGVkLCB3aGljaCBtYXkgYmUgb3ZlcmtpbGwuCisKKyAqLworCitzdGF0aWMgdm9pZAorY2xvc2VfcHJvY19maWxlIChwaXApCisgICAgIHN0cnVjdCBwcm9jaW5mbyAqcGlwOworeworICBzdHJ1Y3QgcHJvY2luZm8gKnByb2NpbmZvOworCisgIGRlbGV0ZV90aHJlYWQgKHBpcC0+cGlkKTsJLyogcmVtb3ZlIHRocmVhZCBmcm9tIEdEQidzIHRocmVhZCBsaXN0ICovCisgIHJlbW92ZV9mZCAocGlwKTsJCS8qIFJlbW92ZSBmZCBmcm9tIHBvbGwvc2VsZWN0IGxpc3QgKi8KKworICBjbG9zZSAocGlwLT5jdGxfZmQpOworI2lmZGVmIEhBVkVfTVVMVElQTEVfUFJPQ19GRFMKKyAgY2xvc2UgKHBpcC0+YXNfZmQpOworICBjbG9zZSAocGlwLT5zdGF0dXNfZmQpOworICBjbG9zZSAocGlwLT5tYXBfZmQpOworI2VuZGlmCisKKyAgZnJlZSAocGlwIC0+IHBhdGhuYW1lKTsKKworICAvKiBVbmxpbmsgcGlwIGZyb20gdGhlIHByb2NpbmZvIGNoYWluLiAgTm90ZSBwaXAgbWlnaHQgbm90IGJlIG9uIHRoZSBsaXN0LiAqLworCisgIGlmIChwcm9jaW5mb19saXN0ID09IHBpcCkKKyAgICBwcm9jaW5mb19saXN0ID0gcGlwLT5uZXh0OworICBlbHNlCisgICAgeworICAgICAgZm9yIChwcm9jaW5mbyA9IHByb2NpbmZvX2xpc3Q7IHByb2NpbmZvOyBwcm9jaW5mbyA9IHByb2NpbmZvLT5uZXh0KQorICAgICAgICB7CisgICAgICAgICAgaWYgKHByb2NpbmZvLT5uZXh0ID09IHBpcCkKKwkgICAgeworCSAgICAgIHByb2NpbmZvLT5uZXh0ID0gcGlwLT5uZXh0OworCSAgICAgIGJyZWFrOworCSAgICB9CisgICAgICAgIH0KKyAgICAgIGZyZWUgKHBpcCk7CisgICAgfQorfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJb3Blbl9wcm9jX2ZpbGUgLSBvcGVuIGEgL3Byb2MgZW50cnkgZm9yIGEgZ2l2ZW4gcHJvY2VzcyBpZAorCitTWU5PUFNJUworCisJc3RhdGljIGludCBvcGVuX3Byb2NfZmlsZSAoaW50IHBpZCwgc3RydWN0IHByb2NpbmZvICpwaXAsIGludCBtb2RlKQorCitERVNDUklQVElPTgorCisJR2l2ZW4gYSBwcm9jZXNzIGlkIGFuZCBhIG1vZGUsIGNsb3NlIHRoZSBleGlzdGluZyBvcGVuIC9wcm9jCisJZW50cnkgKGlmIGFueSkgYW5kIG9wZW4gb25lIGZvciB0aGUgbmV3IHByb2Nlc3MgaWQsIGluIHRoZQorCXNwZWNpZmllZCBtb2RlLiAgT25jZSBpdCBpcyBvcGVuLCB0aGVuIG1hcmsgdGhlIGxvY2FsIHByb2Nlc3MKKwlpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgYXMgdmFsaWQsIHdoaWNoIGd1YXJhbnRlZXMgdGhhdCB0aGUgcGlkLAorCWZkLCBhbmQgcGF0aG5hbWUgZmllbGRzIG1hdGNoIGFuIG9wZW4gL3Byb2MgZW50cnkuICBSZXR1cm5zCisJemVybyBpZiB0aGUgb3BlbiBmYWlscywgbm9uemVybyBvdGhlcndpc2UuCisKKwlOb3RlIHRoYXQgdGhlIHBhdGhuYW1lIGlzIGxlZnQgaW50YWN0LCBldmVuIHdoZW4gdGhlIG9wZW4gZmFpbHMsCisJc28gdGhhdCBjYWxsZXJzIGNhbiB1c2UgaXQgdG8gY29uc3RydWN0IG1lYW5pbmdmdWwgZXJyb3IgbWVzc2FnZXMKKwlyYXRoZXIgdGhhbiBqdXN0ICJmaWxlIG9wZW4gZmFpbGVkIi4KKworCU5vdGUgdGhhdCBmb3IgU29sYXJpcywgdGhlIHByb2Nlc3MtaWQgYWxzbyBpbmNsdWRlcyBhbiBMV1AtaWQsIHNvIHdlCisJYWN0dWFsbHkgYXR0ZW1wdCB0byBvcGVuIHRoYXQuICBJZiB3ZSBhcmUgaGFuZGVkIGEgcGlkIHdpdGggYSAwIExXUC1pZCwKKwl0aGVuIHdlIHdpbGwgYXNrIHRoZSBrZXJuZWwgd2hhdCBpdCBpcyBhbmQgYWRkIGl0IHRvIHRoZSBwaWQuICBIZW5jZSwKKwl0aGUgcGlkIGNhbiBiZSBjaGFuZ2VkIGJ5IHVzLgorICovCisKK3N0YXRpYyBpbnQKK29wZW5fcHJvY19maWxlIChwaWQsIHBpcCwgbW9kZSwgY29udHJvbCkKKyAgICAgaW50IHBpZDsKKyAgICAgc3RydWN0IHByb2NpbmZvICpwaXA7CisgICAgIGludCBtb2RlOworICAgICBpbnQgY29udHJvbDsKK3sKKyAgaW50IHRtcCwgdG1wZmQ7CisKKyAgcGlwIC0+IG5leHQgPSBOVUxMOworICBwaXAgLT4gaGFkX2V2ZW50ID0gMDsKKyAgcGlwIC0+IHBhdGhuYW1lID0geG1hbGxvYyAoTUFYX1BST0NfTkFNRV9TSVpFKTsKKyAgcGlwIC0+IHBpZCA9IHBpZDsKKworI2lmbmRlZiBQSU9DT1BFTkxXUAorICB0bXAgPSBwaWQ7CisjZWxzZQorICB0bXAgPSBwaWQgJiAweGZmZmY7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfTVVMVElQTEVfUFJPQ19GRFMKKyAgc3ByaW50ZiAocGlwLT5wYXRobmFtZSwgU1RBVFVTX1BST0NfTkFNRV9GTVQsIHRtcCk7CisgIGlmICgocGlwLT5zdGF0dXNfZmQgPSBvcGVuIChwaXAtPnBhdGhuYW1lLCBPX1JET05MWSkpIDwgMCkKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgc3ByaW50ZiAocGlwLT5wYXRobmFtZSwgQVNfUFJPQ19OQU1FX0ZNVCwgdG1wKTsKKyAgaWYgKChwaXAtPmFzX2ZkID0gb3BlbiAocGlwLT5wYXRobmFtZSwgT19SRFdSKSkgPCAwKQorICAgIHsKKyAgICAgIGNsb3NlIChwaXAtPnN0YXR1c19mZCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgc3ByaW50ZiAocGlwLT5wYXRobmFtZSwgTUFQX1BST0NfTkFNRV9GTVQsIHRtcCk7CisgIGlmICgocGlwLT5tYXBfZmQgPSBvcGVuIChwaXAtPnBhdGhuYW1lLCBPX1JET05MWSkpIDwgMCkKKyAgICB7CisgICAgICBjbG9zZSAocGlwLT5zdGF0dXNfZmQpOworICAgICAgY2xvc2UgKHBpcC0+YXNfZmQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChjb250cm9sKQorICAgIHsKKyAgICAgIHNwcmludGYgKHBpcC0+cGF0aG5hbWUsIENUTF9QUk9DX05BTUVfRk1ULCB0bXApOworICAgICAgaWYgKChwaXAtPmN0bF9mZCA9IG9wZW4gKHBpcC0+cGF0aG5hbWUsIE9fV1JPTkxZKSkgPCAwKQorCXsKKwkgIGNsb3NlIChwaXAtPnN0YXR1c19mZCk7CisgICAgICAgICAgY2xvc2UgKHBpcC0+YXNfZmQpOworICAgICAgICAgIGNsb3NlIChwaXAtPm1hcF9mZCk7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyNlbHNlIC8qIEhBVkVfTVVMVElQTEVfUFJPQ19GRFMgKi8KKyAgc3ByaW50ZiAocGlwIC0+IHBhdGhuYW1lLCBDVExfUFJPQ19OQU1FX0ZNVCwgdG1wKTsKKworICBpZiAoKHRtcGZkID0gb3BlbiAocGlwIC0+IHBhdGhuYW1lLCBtb2RlKSkgPCAwKQorICAgIHJldHVybiAwOworCisjaWZuZGVmIFBJT0NPUEVOTFdQCisgICAgcGlwIC0+IGN0bF9mZCA9IHRtcGZkOworICAgIHBpcCAtPiBhc19mZCA9IHRtcGZkOworICAgIHBpcCAtPiBtYXBfZmQgPSB0bXBmZDsKKyAgICBwaXAgLT4gc3RhdHVzX2ZkID0gdG1wZmQ7CisjZWxzZQorICB0bXAgPSAocGlkID4+IDE2KSAmIDB4ZmZmZjsJLyogRXh0cmFjdCB0aHJlYWQgaWQgKi8KKworICBpZiAodG1wID09IDApCisgICAgewkJCQkvKiBEb24ndCBrbm93IHRocmVhZCBpZCB5ZXQgKi8KKyAgICAgIGlmIChpb2N0bCAodG1wZmQsIFBJT0NTVEFUVVMsICZwaXAgLT4gcHJzdGF0dXMpIDwgMCkKKwl7CisJICBwcmludF9zeXNfZXJybXNnIChwaXAgLT4gcGF0aG5hbWUsIGVycm5vKTsKKwkgIGNsb3NlICh0bXBmZCk7CisJICBlcnJvciAoIm9wZW5fcHJvY19maWxlOiBQSU9DU1RBVFVTIGZhaWxlZCIpOworCX0KKworICAgICAgdG1wID0gcGlwIC0+IHByc3RhdHVzLnByX3dobzsgLyogR2V0IHRocmVhZCBpZCBmcm9tIHByc3RhdHVzX3QgKi8KKyAgICAgIHBpcCAtPiBwaWQgPSAodG1wIDw8IDE2KSB8IHBpZDsgLyogVXBkYXRlIHBpcCAqLworICAgIH0KKworICBpZiAoKHBpcCAtPiBjdGxfZmQgPSBpb2N0bCAodG1wZmQsIFBJT0NPUEVOTFdQLCAmdG1wKSkgPCAwKQorICAgIHsKKyAgICAgIGNsb3NlICh0bXBmZCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyNpZmRlZiBQSU9DU0VUCQkJLyogTmV3IG1ldGhvZCAqLworICB7CisgICAgICBsb25nIHByX2ZsYWdzOworICAgICAgcHJfZmxhZ3MgPSBQUl9BU1lOQzsKKyAgICAgIGlvY3RsIChwaXAgLT4gY3RsX2ZkLCBQSU9DU0VULCAmcHJfZmxhZ3MpOworICB9CisjZW5kaWYKKworICAvKiBrZWVwIGV4dHJhIGZkcyBpbiBzeW5jICovCisgIHBpcC0+YXNfZmQgPSBwaXAtPmN0bF9mZDsKKyAgcGlwLT5tYXBfZmQgPSBwaXAtPmN0bF9mZDsKKyAgcGlwLT5zdGF0dXNfZmQgPSBwaXAtPmN0bF9mZDsKKworICBjbG9zZSAodG1wZmQpOwkJLyogQWxsIGRvbmUgd2l0aCBtYWluIHBpZCAqLworI2VuZGlmCS8qIFBJT0NPUEVOTFdQICovCisKKyNlbmRpZiAvKiBIQVZFX01VTFRJUExFX1BST0NfRkRTICovCisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjaGFyICoKK21hcHBpbmdmbGFncyAoZmxhZ3MpCisgICAgIGxvbmcgZmxhZ3M7Cit7CisgIHN0YXRpYyBjaGFyIGFzY2lpZmxhZ3NbOF07CisgIAorICBzdHJjcHkgKGFzY2lpZmxhZ3MsICItLS0tLS0tIik7CisjaWYgZGVmaW5lZCAoTUFfUEhZUykKKyAgaWYgKGZsYWdzICYgTUFfUEhZUykgICBhc2NpaWZsYWdzWzBdID0gJ2QnOworI2VuZGlmCisgIGlmIChmbGFncyAmIE1BX1NUQUNLKSAgYXNjaWlmbGFnc1sxXSA9ICdzJzsKKyAgaWYgKGZsYWdzICYgTUFfQlJFQUspICBhc2NpaWZsYWdzWzJdID0gJ2InOworICBpZiAoZmxhZ3MgJiBNQV9TSEFSRUQpIGFzY2lpZmxhZ3NbM10gPSAncyc7CisgIGlmIChmbGFncyAmIE1BX1JFQUQpICAgYXNjaWlmbGFnc1s0XSA9ICdyJzsKKyAgaWYgKGZsYWdzICYgTUFfV1JJVEUpICBhc2NpaWZsYWdzWzVdID0gJ3cnOworICBpZiAoZmxhZ3MgJiBNQV9FWEVDKSAgIGFzY2lpZmxhZ3NbNl0gPSAneCc7CisgIHJldHVybiAoYXNjaWlmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitpbmZvX3Byb2NfZmxhZ3MgKHBpcCwgc3VtbWFyeSkKKyAgICAgc3RydWN0IHByb2NpbmZvICpwaXA7CisgICAgIGludCBzdW1tYXJ5OworeworICBzdHJ1Y3QgdHJhbnMgKnRyYW5zcDsKKyNpZmRlZiBVTklYV0FSRQorICBsb25nIGZsYWdzID0gcGlwLT5wcnN0YXR1cy5wcl9mbGFncyB8IHBpcC0+cHJzdGF0dXMucHJfbHdwLnByX2ZsYWdzOworI2Vsc2UKKyAgbG9uZyBmbGFncyA9IHBpcC0+cHJzdGF0dXMucHJfZmxhZ3M7CisjZW5kaWYKKworICBwcmludGZfZmlsdGVyZWQgKCIlLTMycyIsICJQcm9jZXNzIHN0YXR1cyBmbGFnczoiKTsKKyAgaWYgKCFzdW1tYXJ5KQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuXG4iKTsKKyAgICB9CisgIGZvciAodHJhbnNwID0gcHJfZmxhZ190YWJsZTsgdHJhbnNwIC0+IG5hbWUgIT0gTlVMTDsgdHJhbnNwKyspCisgICAgeworICAgICAgaWYgKGZsYWdzICYgdHJhbnNwIC0+IHZhbHVlKQorCXsKKwkgIGlmIChzdW1tYXJ5KQorCSAgICB7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiJXMgIiwgdHJhbnNwIC0+IG5hbWUpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCJcdCUtMTZzICVzLlxuIiwgdHJhbnNwIC0+IG5hbWUsIHRyYW5zcCAtPiBkZXNjKTsKKwkgICAgfQorCX0KKyAgICB9CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitpbmZvX3Byb2Nfc3RvcCAocGlwLCBzdW1tYXJ5KQorICAgICBzdHJ1Y3QgcHJvY2luZm8gKnBpcDsKKyAgICAgaW50IHN1bW1hcnk7Cit7CisgIHN0cnVjdCB0cmFucyAqdHJhbnNwOworICBpbnQgd2h5OworICBpbnQgd2hhdDsKKworICB3aHkgPSBUSEVfUFJfTFdQKHBpcC0+cHJzdGF0dXMpLnByX3doeTsKKyAgd2hhdCA9IFRIRV9QUl9MV1AocGlwLT5wcnN0YXR1cykucHJfd2hhdDsKKworICBpZiAoVEhFX1BSX0xXUChwaXAtPnByc3RhdHVzKS5wcl9mbGFncyAmIFBSX1NUT1BQRUQpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiJS0zMnMiLCAiUmVhc29uIGZvciBzdG9wcGluZzoiKTsKKyAgICAgIGlmICghc3VtbWFyeSkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCJcblxuIik7CisJfQorICAgICAgZm9yICh0cmFuc3AgPSBwcl93aHlfdGFibGU7IHRyYW5zcCAtPiBuYW1lICE9IE5VTEw7IHRyYW5zcCsrKQorCXsKKwkgIGlmICh3aHkgPT0gdHJhbnNwIC0+IHZhbHVlKQorCSAgICB7CisJICAgICAgaWYgKHN1bW1hcnkpCisJCXsKKwkJICBwcmludGZfZmlsdGVyZWQgKCIlcyAiLCB0cmFuc3AgLT4gbmFtZSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBwcmludGZfZmlsdGVyZWQgKCJcdCUtMTZzICVzLlxuIiwKKwkJCQkgICB0cmFuc3AgLT4gbmFtZSwgdHJhbnNwIC0+IGRlc2MpOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgICAKKyAgICAgIC8qIFVzZSB0aGUgcHJfd2h5IGZpZWxkIHRvIGRldGVybWluZSB3aGF0IHRoZSBwcl93aGF0IGZpZWxkIG1lYW5zLCBhbmQKKwkgcHJpbnQgbW9yZSBpbmZvcm1hdGlvbi4gKi8KKyAgICAgIAorICAgICAgc3dpdGNoICh3aHkpCisJeworCSAgY2FzZSBQUl9SRVFVRVNURUQ6CisJICAgIC8qIHByX3doYXQgaXMgdW51c2VkIGZvciB0aGlzIGNhc2UgKi8KKwkgICAgYnJlYWs7CisJICBjYXNlIFBSX0pPQkNPTlRST0w6CisJICBjYXNlIFBSX1NJR05BTExFRDoKKwkgICAgaWYgKHN1bW1hcnkpCisJICAgICAgeworCQlwcmludGZfZmlsdGVyZWQgKCIlcyAiLCBzaWduYWxuYW1lICh3aGF0KSk7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlwcmludGZfZmlsdGVyZWQgKCJcdCUtMTZzICVzLlxuIiwgc2lnbmFsbmFtZSAod2hhdCksCisJCQkJIHNhZmVfc3Ryc2lnbmFsICh3aGF0KSk7CisJICAgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgUFJfU1lTRU5UUlk6CisJICAgIGlmIChzdW1tYXJ5KQorCSAgICAgIHsKKwkJcHJpbnRmX2ZpbHRlcmVkICgiJXMgIiwgc3lzY2FsbG5hbWUgKHdoYXQpKTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCXByaW50Zl9maWx0ZXJlZCAoIlx0JS0xNnMgJXMuXG4iLCBzeXNjYWxsbmFtZSAod2hhdCksCisJCQkJICJFbnRlcmVkIHRoaXMgc3lzdGVtIGNhbGwiKTsKKwkgICAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSBQUl9TWVNFWElUOgorCSAgICBpZiAoc3VtbWFyeSkKKwkgICAgICB7CisJCXByaW50Zl9maWx0ZXJlZCAoIiVzICIsIHN5c2NhbGxuYW1lICh3aGF0KSk7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlwcmludGZfZmlsdGVyZWQgKCJcdCUtMTZzICVzLlxuIiwgc3lzY2FsbG5hbWUgKHdoYXQpLAorCQkJCSAiUmV0dXJuZWQgZnJvbSB0aGlzIHN5c3RlbSBjYWxsIik7CisJICAgICAgfQorCSAgICBicmVhazsKKwkgIGNhc2UgUFJfRkFVTFRFRDoKKwkgICAgaWYgKHN1bW1hcnkpCisJICAgICAgeworCQlwcmludGZfZmlsdGVyZWQgKCIlcyAiLAorCQkJCSBsb29rdXBuYW1lIChmYXVsdHNfdGFibGUsIHdoYXQsICJmYXVsdCIpKTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCXByaW50Zl9maWx0ZXJlZCAoIlx0JS0xNnMgJXMuXG4iLAorCQkJCSBsb29rdXBuYW1lIChmYXVsdHNfdGFibGUsIHdoYXQsICJmYXVsdCIpLAorCQkJCSBsb29rdXBkZXNjIChmYXVsdHNfdGFibGUsIHdoYXQpKTsKKwkgICAgICB9CisJICAgIGJyZWFrOworCSAgfQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitpbmZvX3Byb2Nfc2lnaW5mbyAocGlwLCBzdW1tYXJ5KQorICAgICBzdHJ1Y3QgcHJvY2luZm8gKnBpcDsKKyAgICAgaW50IHN1bW1hcnk7Cit7CisgIHN0cnVjdCBzaWdpbmZvICpzaXA7CisKKyAgaWYgKChUSEVfUFJfTFdQKHBpcC0+cHJzdGF0dXMpLnByX2ZsYWdzICYgUFJfU1RPUFBFRCkgJiYKKyAgICAgIChUSEVfUFJfTFdQKHBpcC0+cHJzdGF0dXMpLnByX3doeSA9PSBQUl9TSUdOQUxMRUQgfHwKKyAgICAgICBUSEVfUFJfTFdQKHBpcC0+cHJzdGF0dXMpLnByX3doeSA9PSBQUl9GQVVMVEVEKSkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIlLTMycyIsICJBZGRpdGlvbmFsIHNpZ25hbC9mYXVsdCBpbmZvOiIpOworICAgICAgc2lwID0gJihUSEVfUFJfTFdQKHBpcC0+cHJzdGF0dXMpLnByX2luZm8pOworICAgICAgaWYgKHN1bW1hcnkpCisJeworCSAgcHJpbnRmX2ZpbHRlcmVkICgiJXMgIiwgc2lnbmFsbmFtZSAoc2lwIC0+IHNpX3NpZ25vKSk7CisJICBpZiAoc2lwIC0+IHNpX2Vycm5vID4gMCkKKwkgICAgeworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiVzICIsIGVycm5vbmFtZSAoc2lwIC0+IHNpX2Vycm5vKSk7CisJICAgIH0KKwkgIGlmIChzaXAgLT4gc2lfY29kZSA8PSAwKQorCSAgICB7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgic2VudCBieSAlcywgdWlkICVkICIsCisJCQkgICAgICAgdGFyZ2V0X3BpZF90b19zdHIgKHNpcCAtPiBzaV9waWQpLAorCQkJICAgICAgIHNpcCAtPiBzaV91aWQpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCIlcyAiLCBzaWdjb2RlbmFtZSAoc2lwKSk7CisJICAgICAgaWYgKChzaXAgLT4gc2lfc2lnbm8gPT0gU0lHSUxMKSB8fAorCQkgIChzaXAgLT4gc2lfc2lnbm8gPT0gU0lHRlBFKSB8fAorCQkgIChzaXAgLT4gc2lfc2lnbm8gPT0gU0lHU0VHVikgfHwKKwkJICAoc2lwIC0+IHNpX3NpZ25vID09IFNJR0JVUykpCisJCXsKKwkJICBwcmludGZfZmlsdGVyZWQgKCJhZGRyPSUjbHggIiwKKwkJCQkgICAodW5zaWduZWQgbG9uZykgc2lwIC0+IHNpX2FkZHIpOworCQl9CisJICAgICAgZWxzZSBpZiAoKHNpcCAtPiBzaV9zaWdubyA9PSBTSUdDSExEKSkKKwkJeworCQkgIHByaW50Zl9maWx0ZXJlZCAoImNoaWxkICVzLCBzdGF0dXMgJXUgIiwKKwkJCQkgICB0YXJnZXRfcGlkX3RvX3N0ciAoc2lwIC0+IHNpX3BpZCksCisJCQkJICAgc2lwIC0+IHNpX3N0YXR1cyk7CisJCX0KKwkgICAgICBlbHNlIGlmICgoc2lwIC0+IHNpX3NpZ25vID09IFNJR1BPTEwpKQorCQl7CisJCSAgcHJpbnRmX2ZpbHRlcmVkICgiYmFuZCAldSAiLCBzaXAgLT4gc2lfYmFuZCk7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCJcblxuIik7CisJICBwcmludGZfZmlsdGVyZWQgKCJcdCUtMTZzICVzLlxuIiwgc2lnbmFsbmFtZSAoc2lwIC0+IHNpX3NpZ25vKSwKKwkJCSAgIHNhZmVfc3Ryc2lnbmFsIChzaXAgLT4gc2lfc2lnbm8pKTsKKwkgIGlmIChzaXAgLT4gc2lfZXJybm8gPiAwKQorCSAgICB7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXHQlLTE2cyAlcy5cbiIsCisJCQkgICAgICAgZXJybm9uYW1lIChzaXAgLT4gc2lfZXJybm8pLAorCQkJICAgICAgIHNhZmVfc3RyZXJyb3IgKHNpcCAtPiBzaV9lcnJubykpOworCSAgICB9CisJICBpZiAoc2lwIC0+IHNpX2NvZGUgPD0gMCkKKwkgICAgeworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlx0JS0xNnUgJXNcbiIsIHNpcCAtPiBzaV9waWQsIC8qIFhYWCBuZWVkIHRhcmdldF9waWRfdG9fc3RyKCkgKi8KKwkJCSAgICAgICAiUElEIG9mIHByb2Nlc3Mgc2VuZGluZyBzaWduYWwiKTsKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCJcdCUtMTZ1ICVzXG4iLCBzaXAgLT4gc2lfdWlkLAorCQkJICAgICAgICJVSUQgb2YgcHJvY2VzcyBzZW5kaW5nIHNpZ25hbCIpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCJcdCUtMTZzICVzLlxuIiwgc2lnY29kZW5hbWUgKHNpcCksCisJCQkgICAgICAgc2lnY29kZWRlc2MgKHNpcCkpOworCSAgICAgIGlmICgoc2lwIC0+IHNpX3NpZ25vID09IFNJR0lMTCkgfHwKKwkJICAoc2lwIC0+IHNpX3NpZ25vID09IFNJR0ZQRSkpCisJCXsKKwkJICBwcmludGZfZmlsdGVyZWQgKCJcdCUjLTE2bHggJXMuXG4iLAorCQkJCSAgICh1bnNpZ25lZCBsb25nKSBzaXAgLT4gc2lfYWRkciwKKwkJCQkgICAiQWRkcmVzcyBvZiBmYXVsdGluZyBpbnN0cnVjdGlvbiIpOworCQl9CisJICAgICAgZWxzZSBpZiAoKHNpcCAtPiBzaV9zaWdubyA9PSBTSUdTRUdWKSB8fAorCQkgICAgICAgKHNpcCAtPiBzaV9zaWdubyA9PSBTSUdCVVMpKQorCQl7CisJCSAgcHJpbnRmX2ZpbHRlcmVkICgiXHQlIy0xNmx4ICVzLlxuIiwKKwkJCQkgICAodW5zaWduZWQgbG9uZykgc2lwIC0+IHNpX2FkZHIsCisJCQkJICAgIkFkZHJlc3Mgb2YgZmF1bHRpbmcgbWVtb3J5IHJlZmVyZW5jZSIpOworCQl9CisJICAgICAgZWxzZSBpZiAoKHNpcCAtPiBzaV9zaWdubyA9PSBTSUdDSExEKSkKKwkJeworCQkgIHByaW50Zl9maWx0ZXJlZCAoIlx0JS0xNnUgJXMuXG4iLCBzaXAgLT4gc2lfcGlkLCAvKiBYWFggbmVlZCB0YXJnZXRfcGlkX3RvX3N0cigpICovCisJCQkJICAgIkNoaWxkIHByb2Nlc3MgSUQiKTsKKwkJICBwcmludGZfZmlsdGVyZWQgKCJcdCUtMTZ1ICVzLlxuIiwgc2lwIC0+IHNpX3N0YXR1cywKKwkJCQkgICAiQ2hpbGQgcHJvY2VzcyBleGl0IHZhbHVlIG9yIHNpZ25hbCIpOworCQl9CisJICAgICAgZWxzZSBpZiAoKHNpcCAtPiBzaV9zaWdubyA9PSBTSUdQT0xMKSkKKwkJeworCQkgIHByaW50Zl9maWx0ZXJlZCAoIlx0JS0xNnUgJXMuXG4iLCBzaXAgLT4gc2lfYmFuZCwKKwkJCQkgICAiQmFuZCBldmVudCBmb3IgUE9MTF97SU4sT1VULE1TR30iKTsKKwkJfQorCSAgICB9CisJfQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitpbmZvX3Byb2Nfc3lzY2FsbHMgKHBpcCwgc3VtbWFyeSkKKyAgICAgc3RydWN0IHByb2NpbmZvICpwaXA7CisgICAgIGludCBzdW1tYXJ5OworeworICBpbnQgc3lzY2FsbG51bTsKKworICBpZiAoIXN1bW1hcnkpCisgICAgeworCisjaWYgMAkvKiBGSVhNRTogIE5lZWRzIHRvIHVzZSBnZGItd2lkZSBjb25maWd1cmVkIGluZm8gYWJvdXQgc3lzdGVtIGNhbGxzLiAqLworICAgICAgaWYgKHBpcCAtPiBwcnN0YXR1cy5wcl9mbGFncyAmIFBSX0FTTEVFUCkKKwl7CisJICBpbnQgc3lzY2FsbG51bSA9IHBpcCAtPiBwcnN0YXR1cy5wcl9yZWdbUl9EMF07CisJICBpZiAoc3VtbWFyeSkKKwkgICAgeworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiUtMzJzIiwgIlNsZWVwaW5nIGluIHN5c3RlbSBjYWxsOiIpOworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiVzIiwgc3lzY2FsbG5hbWUgKHN5c2NhbGxudW0pKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiU2xlZXBpbmcgaW4gc3lzdGVtIGNhbGwgJyVzJy5cbiIsCisJCQkgICAgICAgc3lzY2FsbG5hbWUgKHN5c2NhbGxudW0pKTsKKwkgICAgfQorCX0KKyNlbmRpZgorCisjaWZuZGVmIFVOSVhXQVJFCisgICAgICBpZiAoaW9jdGwgKHBpcCAtPiBjdGxfZmQsIFBJT0NHRU5UUlksICZwaXAgLT4gZW50cnlzZXQpIDwgMCkKKwl7CisJICBwcmludF9zeXNfZXJybXNnIChwaXAgLT4gcGF0aG5hbWUsIGVycm5vKTsKKwkgIGVycm9yICgiUElPQ0dFTlRSWSBmYWlsZWQiKTsKKwl9CisgICAgICAKKyAgICAgIGlmIChpb2N0bCAocGlwIC0+IGN0bF9mZCwgUElPQ0dFWElULCAmcGlwIC0+IGV4aXRzZXQpIDwgMCkKKwl7CisJICBwcmludF9zeXNfZXJybXNnIChwaXAgLT4gcGF0aG5hbWUsIGVycm5vKTsKKwkgIGVycm9yICgiUElPQ0dFWElUIGZhaWxlZCIpOworCX0KKyNlbmRpZgorICAgICAgCisgICAgICBwcmludGZfZmlsdGVyZWQgKCJTeXN0ZW0gY2FsbCB0cmFjaW5nIGluZm9ybWF0aW9uOlxuXG4iKTsKKyAgICAgIAorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXHQlLTEycyAlLThzICUtOHNcbiIsCisJCSAgICAgICAiU3lzdGVtIGNhbGwiLAorCQkgICAgICAgIkVudHJ5IiwKKwkJICAgICAgICJFeGl0Iik7CisgICAgICBmb3IgKHN5c2NhbGxudW0gPSAwOyBzeXNjYWxsbnVtIDwgTUFYX1NZU0NBTExTOyBzeXNjYWxsbnVtKyspCisJeworCSAgUVVJVDsKKwkgIGlmIChzeXNjYWxsX3RhYmxlW3N5c2NhbGxudW1dICE9IE5VTEwpCisJICAgIHByaW50Zl9maWx0ZXJlZCAoIlx0JS0xMnMgIiwgc3lzY2FsbF90YWJsZVtzeXNjYWxsbnVtXSk7CisJICBlbHNlCisJICAgIHByaW50Zl9maWx0ZXJlZCAoIlx0JS0xMmQgIiwgc3lzY2FsbG51bSk7CisKKyNpZmRlZiBVTklYV0FSRQorCSAgcHJpbnRmX2ZpbHRlcmVkICgiJS04cyAiLAorCQkJICAgcHJpc21lbWJlciAoJnBpcC0+cHJzdGF0dXMucHJfc3lzZW50cnksIHN5c2NhbGxudW0pCisJCQkgICA/ICJvbiIgOiAib2ZmIik7CisJICBwcmludGZfZmlsdGVyZWQgKCIlLThzICIsCisJCQkgICBwcmlzbWVtYmVyICgmcGlwLT5wcnN0YXR1cy5wcl9zeXNleGl0LCBzeXNjYWxsbnVtKQorCQkJICAgPyAib24iIDogIm9mZiIpOworI2Vsc2UKKwkgIHByaW50Zl9maWx0ZXJlZCAoIiUtOHMgIiwKKwkJCSAgIHByaXNtZW1iZXIgKCZwaXAgLT4gZW50cnlzZXQsIHN5c2NhbGxudW0pCisJCQkgICA/ICJvbiIgOiAib2ZmIik7CisJICBwcmludGZfZmlsdGVyZWQgKCIlLThzICIsCisJCQkgICBwcmlzbWVtYmVyICgmcGlwIC0+IGV4aXRzZXQsIHN5c2NhbGxudW0pCisJCQkgICA/ICJvbiIgOiAib2ZmIik7CisjZW5kaWYKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisJfQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICoKK3NpZ25hbG5hbWUgKHNpZ25vKQorICAgICBpbnQgc2lnbm87Cit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIHN0YXRpYyBjaGFyIGxvY2J1ZlszMl07CisKKyAgbmFtZSA9IHN0cnNpZ25vIChzaWdubyk7CisgIGlmIChuYW1lID09IE5VTEwpCisgICAgeworICAgICAgc3ByaW50ZiAobG9jYnVmLCAiU2lnbmFsICVkIiwgc2lnbm8pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNwcmludGYgKGxvY2J1ZiwgIiVzICglZCkiLCBuYW1lLCBzaWdubyk7CisgICAgfQorICByZXR1cm4gKGxvY2J1Zik7Cit9CisKK3N0YXRpYyBjaGFyICoKK2Vycm5vbmFtZSAoZXJybnVtKQorICAgICBpbnQgZXJybnVtOworeworICBjb25zdCBjaGFyICpuYW1lOworICBzdGF0aWMgY2hhciBsb2NidWZbMzJdOworCisgIG5hbWUgPSBzdHJlcnJubyAoZXJybnVtKTsKKyAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBzcHJpbnRmIChsb2NidWYsICJFcnJubyAlZCIsIGVycm51bSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3ByaW50ZiAobG9jYnVmLCAiJXMgKCVkKSIsIG5hbWUsIGVycm51bSk7CisgICAgfQorICByZXR1cm4gKGxvY2J1Zik7Cit9CisKK3N0YXRpYyB2b2lkCitpbmZvX3Byb2Nfc2lnbmFscyAocGlwLCBzdW1tYXJ5KQorICAgICBzdHJ1Y3QgcHJvY2luZm8gKnBpcDsKKyAgICAgaW50IHN1bW1hcnk7Cit7CisgIGludCBzaWdubzsKKworICBpZiAoIXN1bW1hcnkpCisgICAgeworI2lmbmRlZiBQUk9DRlNfVVNFX1JFQURfV1JJVEUKKyAgICAgIGlmIChpb2N0bCAocGlwIC0+IGN0bF9mZCwgUElPQ0dUUkFDRSwgJnBpcCAtPiB0cmFjZSkgPCAwKQorCXsKKwkgIHByaW50X3N5c19lcnJtc2cgKHBpcCAtPiBwYXRobmFtZSwgZXJybm8pOworCSAgZXJyb3IgKCJQSU9DR1RSQUNFIGZhaWxlZCIpOworCX0KKyNlbmRpZgorICAgICAgCisgICAgICBwcmludGZfZmlsdGVyZWQgKCJEaXNwb3NpdGlvbiBvZiBzaWduYWxzOlxuXG4iKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlx0JS0xNXMgJS04cyAlLThzICUtOHMgICVzXG5cbiIsCisJCSAgICAgICAiU2lnbmFsIiwgIlRyYWNlIiwgIkhvbGQiLCAiUGVuZGluZyIsICJEZXNjcmlwdGlvbiIpOworICAgICAgZm9yIChzaWdubyA9IDA7IHNpZ25vIDwgTlNJRzsgc2lnbm8rKykKKwl7CisJICBRVUlUOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiXHQlLTE1cyAiLCBzaWduYWxuYW1lIChzaWdubykpOworI2lmZGVmIFVOSVhXQVJFCisJICBwcmludGZfZmlsdGVyZWQgKCIlLThzICIsCisJCQkgICBwcmlzbWVtYmVyICgmcGlwIC0+IHByc3RhdHVzLnByX3NpZ3RyYWNlLCBzaWdubykKKwkJCSAgID8gIm9uIiA6ICJvZmYiKTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIiUtOHMgIiwKKwkJCSAgIHByaXNtZW1iZXIgKCZwaXAgLT4gcHJzdGF0dXMucHJfbHdwLnByX2NvbnRleHQudWNfc2lnbWFzaywgc2lnbm8pCisJCQkgICA/ICJvbiIgOiAib2ZmIik7CisjZWxzZQorCSAgcHJpbnRmX2ZpbHRlcmVkICgiJS04cyAiLAorCQkJICAgcHJpc21lbWJlciAoJnBpcCAtPiB0cmFjZSwgc2lnbm8pCisJCQkgICA/ICJvbiIgOiAib2ZmIik7CisJICBwcmludGZfZmlsdGVyZWQgKCIlLThzICIsCisJCQkgICBwcmlzbWVtYmVyICgmcGlwIC0+IHByc3RhdHVzLnByX3NpZ2hvbGQsIHNpZ25vKQorCQkJICAgPyAib24iIDogIm9mZiIpOworI2VuZGlmCisKKyNpZmRlZiBVTklYV0FSRQorCSAgaWYgKHByaXNtZW1iZXIgKCZwaXAtPnByc3RhdHVzLnByX3NpZ3BlbmQsIHNpZ25vKSB8fAorCQlwcmlzbWVtYmVyICgmcGlwLT5wcnN0YXR1cy5wcl9sd3AucHJfbHdwcGVuZCwgc2lnbm8pKQorCSAgICBwcmludGZfZmlsdGVyZWQoIiUtOHMgIiwgInllcyIpOworCSAgZWxzZQorCSAgICBwcmludGZfZmlsdGVyZWQoIiUtOHMgIiwgIm5vIik7CisjZWxzZSAvKiBVTklYV0FSRSAqLworI2lmZGVmIFBST0NGU19TSUdQRU5EX09GRlNFVAorCSAgLyogQWxwaGEgT1NGLzEgbnVtYmVycyB0aGUgcGVuZGluZyBzaWduYWxzIGZyb20gMS4gICovCisJICBwcmludGZfZmlsdGVyZWQgKCIlLThzICIsCisJCQkgICAoc2lnbm8gPyBwcmlzbWVtYmVyICgmcGlwIC0+IHByc3RhdHVzLnByX3NpZ3BlbmQsCisJCQkJCQlzaWdubyAtIDEpCisJCQkJICA6IDApCisJCQkgICA/ICJ5ZXMiIDogIm5vIik7CisjZWxzZQorCSAgcHJpbnRmX2ZpbHRlcmVkICgiJS04cyAiLAorCQkJICAgcHJpc21lbWJlciAoJnBpcCAtPiBwcnN0YXR1cy5wcl9zaWdwZW5kLCBzaWdubykKKwkJCSAgID8gInllcyIgOiAibm8iKTsKKyNlbmRpZgorI2VuZGlmIC8qIFVOSVhXQVJFICovCisJICBwcmludGZfZmlsdGVyZWQgKCIgJXNcbiIsIHNhZmVfc3Ryc2lnbmFsIChzaWdubykpOworCX0KKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAoraW5mb19wcm9jX2ZhdWx0cyAocGlwLCBzdW1tYXJ5KQorICAgICBzdHJ1Y3QgcHJvY2luZm8gKnBpcDsKKyAgICAgaW50IHN1bW1hcnk7Cit7CisgIHN0cnVjdCB0cmFucyAqdHJhbnNwOworCisgIGlmICghc3VtbWFyeSkKKyAgICB7CisjaWZuZGVmIFVOSVhXQVJFCisgICAgICBpZiAoaW9jdGwgKHBpcCAtPiBjdGxfZmQsIFBJT0NHRkFVTFQsICZwaXAtPmZsdHNldC5mbHRzZXQpIDwgMCkKKwl7CisJICBwcmludF9zeXNfZXJybXNnIChwaXAgLT4gcGF0aG5hbWUsIGVycm5vKTsKKwkgIGVycm9yICgiUElPQ0dGQVVMVCBmYWlsZWQiKTsKKwl9CisjZW5kaWYKKyAgICAgIAorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiQ3VycmVudCB0cmFjZWQgaGFyZHdhcmUgZmF1bHQgc2V0OlxuXG4iKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlx0JS0xMnMgJS04c1xuIiwgIkZhdWx0IiwgIlRyYWNlIik7CisKKyAgICAgIGZvciAodHJhbnNwID0gZmF1bHRzX3RhYmxlOyB0cmFuc3AgLT4gbmFtZSAhPSBOVUxMOyB0cmFuc3ArKykKKwl7CisJICBRVUlUOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiXHQlLTEycyAiLCB0cmFuc3AgLT4gbmFtZSk7CisjaWZkZWYgVU5JWFdBUkUKKwkgIHByaW50Zl9maWx0ZXJlZCAoIiUtOHMiLCBwcmlzbWVtYmVyICgmcGlwLT5wcnN0YXR1cy5wcl9mbHR0cmFjZSwgdHJhbnNwIC0+IHZhbHVlKQorCQkJICAgPyAib24iIDogIm9mZiIpOworI2Vsc2UKKwkgIHByaW50Zl9maWx0ZXJlZCAoIiUtOHMiLCBwcmlzbWVtYmVyICgmcGlwLT5mbHRzZXQuZmx0c2V0LCB0cmFuc3AgLT4gdmFsdWUpCisJCQkgICA/ICJvbiIgOiAib2ZmIik7CisjZW5kaWYKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisJfQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitpbmZvX3Byb2NfbWFwcGluZ3MgKHBpcCwgc3VtbWFyeSkKKyAgICAgc3RydWN0IHByb2NpbmZvICpwaXA7CisgICAgIGludCBzdW1tYXJ5OworeworICBpbnQgbm1hcDsKKyAgc3RydWN0IHBybWFwICpwcm1hcHM7CisgIHN0cnVjdCBwcm1hcCAqcHJtYXA7CisgIHN0cnVjdCBzdGF0IHNidWY7CisKKyAgaWYgKCFzdW1tYXJ5KQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIk1hcHBlZCBhZGRyZXNzIHNwYWNlczpcblxuIik7CisjaWZkZWYgQkZEX0hPU1RfNjRfQklUCisgICAgICBwcmludGZfZmlsdGVyZWQgKCIgICUxOHMgJTE4cyAlMTBzICUxMHMgJTdzXG4iLAorI2Vsc2UKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlx0JTEwcyAlMTBzICUxMHMgJTEwcyAlN3NcbiIsCisjZW5kaWYKKwkJICAgICAgICJTdGFydCBBZGRyIiwKKwkJICAgICAgICIgIEVuZCBBZGRyIiwKKwkJICAgICAgICIgICAgICBTaXplIiwKKwkJICAgICAgICIgICAgT2Zmc2V0IiwKKwkJICAgICAgICJGbGFncyIpOworI2lmZGVmIFBST0NGU19VU0VfUkVBRF9XUklURQorICAgICAgaWYgKGZzdGF0IChwaXAtPm1hcF9mZCwgJnNidWYpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBubWFwID0gc2J1Zi5zdF9zaXplIC8gc2l6ZW9mIChwcm1hcF90KTsKKwkgIHBybWFwcyA9IChzdHJ1Y3QgcHJtYXAgKikgYWxsb2NhICgobm1hcCArIDEpICogc2l6ZW9mICgqcHJtYXBzKSk7CisgICAgICAgICAgaWYgKChsc2VlayAocGlwLT5tYXBfZmQsIDAsIFNFRUtfU0VUKSA9PSAwKSAmJgorCQkocmVhZCAocGlwLT5tYXBfZmQsIChjaGFyICopIHBybWFwcywKKwkJbm1hcCAqIHNpemVvZiAoKnBybWFwcykpID09IChubWFwICogc2l6ZW9mICgqcHJtYXBzKSkpKQorCSAgICB7CisJICAgICAgaW50IGkgPSAwOworCSAgICAgIGZvciAocHJtYXAgPSBwcm1hcHM7IGkgPCBubWFwOyArK3BybWFwLCArK2kpCisjZWxzZQorICAgICAgaWYgKGlvY3RsIChwaXAgLT4gY3RsX2ZkLCBQSU9DTk1BUCwgJm5tYXApID09IDApCisJeworCSAgcHJtYXBzID0gKHN0cnVjdCBwcm1hcCAqKSBhbGxvY2EgKChubWFwICsgMSkgKiBzaXplb2YgKCpwcm1hcHMpKTsKKwkgIGlmIChpb2N0bCAocGlwIC0+IGN0bF9mZCwgUElPQ01BUCwgcHJtYXBzKSA9PSAwKQorCSAgICB7CisJICAgICAgZm9yIChwcm1hcCA9IHBybWFwczsgcHJtYXAgLT4gcHJfc2l6ZTsgKytwcm1hcCkKKyNlbmRpZiAvKiBQUk9DRlNfVVNFX1JFQURfV1JJVEUgKi8KKwkJeworI2lmZGVmIEJGRF9IT1NUXzY0X0JJVAorCQkgIHByaW50Zl9maWx0ZXJlZCAoIiAgJSMxOGx4ICUjMThseCAlIzEweCAlIzEweCAlN3NcbiIsCisjZWxzZQorCQkgIHByaW50Zl9maWx0ZXJlZCAoIlx0JSMxMGx4ICUjMTBseCAlIzEweCAlIzEweCAlN3NcbiIsCisjZW5kaWYKKwkJCQkgICAodW5zaWduZWQgbG9uZylwcm1hcCAtPiBwcl92YWRkciwKKwkJCQkgICAodW5zaWduZWQgbG9uZylwcm1hcCAtPiBwcl92YWRkcgorCQkJCSAgICAgKyBwcm1hcCAtPiBwcl9zaXplIC0gMSwKKwkJCQkgICBwcm1hcCAtPiBwcl9zaXplLAorCQkJCSAgIHBybWFwIC0+IHByX29mZiwKKwkJCQkgICBtYXBwaW5nZmxhZ3MgKHBybWFwIC0+IHByX21mbGFncykpOworCQl9CisJICAgIH0KKwl9CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICAgIH0KK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWluZm9fcHJvYyAtLSBpbXBsZW1lbnQgdGhlICJpbmZvIHByb2MiIGNvbW1hbmQKKworU1lOT1BTSVMKKworCXZvaWQgaW5mb19wcm9jIChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpCisKK0RFU0NSSVBUSU9OCisKKwlJbXBsZW1lbnQgZ2RiJ3MgImluZm8gcHJvYyIgY29tbWFuZCBieSB1c2luZyB0aGUgL3Byb2MgaW50ZXJmYWNlCisJdG8gcHJpbnQgc3RhdHVzIGluZm9ybWF0aW9uIGFib3V0IGFueSBjdXJyZW50bHkgcnVubmluZyBwcm9jZXNzLgorCisJRXhhbXBsZXMgb2YgdGhlIHVzZSBvZiAiaW5mbyBwcm9jIiBhcmU6CisKKwlpbmZvIHByb2MJCShwcmludHMgc3VtbWFyeSBpbmZvIGZvciBjdXJyZW50IGluZmVyaW9yKQorCWluZm8gcHJvYyAxMjMJCShwcmludHMgc3VtbWFyeSBpbmZvIGZvciBwcm9jZXNzIHdpdGggcGlkIDEyMykKKwlpbmZvIHByb2MgbWFwcGluZ3MJKHByaW50cyBhZGRyZXNzIG1hcHBpbmdzKQorCWluZm8gcHJvYyB0aW1lcwkJKHByaW50cyBwcm9jZXNzL2NoaWxkcmVuIHRpbWVzKQorCWluZm8gcHJvYyBpZAkJKHByaW50cyBwaWQsIHBwaWQsIGdpZCwgc2lkLCBldGMpCisJCUZJWE1FOiAgaSBwcm9jIGlkIG5vdCBpbXBsZW1lbnRlZC4KKwlpbmZvIHByb2Mgc3RhdHVzCShwcmludHMgZ2VuZXJhbCBwcm9jZXNzIHN0YXRlIGluZm8pCisJCUZJWE1FOiAgaSBwcm9jIHN0YXR1cyBub3QgaW1wbGVtZW50ZWQuCisJaW5mbyBwcm9jIHNpZ25hbHMJKHByaW50cyBpbmZvIGFib3V0IHNpZ25hbCBoYW5kbGluZykKKwlpbmZvIHByb2MgYWxsCQkocHJpbnRzIGFsbCBpbmZvKQorCisgKi8KKworc3RhdGljIHZvaWQKK2luZm9fcHJvYyAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IHBpZDsKKyAgc3RydWN0IHByb2NpbmZvICpwaXA7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisgIGNoYXIgKiphcmd2OworICBpbnQgYXJnc2l6ZTsKKyAgaW50IHN1bW1hcnkgPSAxOworICBpbnQgZmxhZ3MgPSAwOworICBpbnQgc3lzY2FsbHMgPSAwOworICBpbnQgc2lnbmFscyA9IDA7CisgIGludCBmYXVsdHMgPSAwOworICBpbnQgbWFwcGluZ3MgPSAwOworICBpbnQgdGltZXMgPSAwOworICBpbnQgaWQgPSAwOworICBpbnQgc3RhdHVzID0gMDsKKyAgaW50IGFsbCA9IDA7CisgIGludCBubHdwOworICBpbnQgKmx3cHM7CisKKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwIChudWxsX2NsZWFudXAsIDApOworCisgIC8qIERlZmF1bHQgdG8gdXNpbmcgdGhlIGN1cnJlbnQgaW5mZXJpb3IgaWYgbm8gcGlkIHNwZWNpZmllZC4gIE5vdGUKKyAgICAgdGhhdCBpbmZlcmlvcl9waWQgbWF5IGJlIDAsIGhlbmNlIHdlIHNldCBva2Vyci4gICovCisKKyAgcGlkID0gaW5mZXJpb3JfcGlkICYgMHg3ZmZmZmZmZjsJCS8qIHN0cmlwIG9mZiBzb2wtdGhyZWFkIGJpdCAqLworICBpZiAoIShwaXAgPSBmaW5kX3Byb2NpbmZvIChwaWQsIDEpKSkJCS8qIGluZmVyaW9yX3BpZCBubyBnb29kPyAgKi8KKyAgICBwaXAgPSBwcm9jaW5mb19saXN0OwkJCS8qIHRha2UgZmlyc3QgYXZhaWxhYmxlICovCisgIHBpZCA9IHBpZCAmIDB4ZmZmZjsJCQkJLyogZXh0cmFjdCAicmVhbCIgcGlkICovCisKKyAgaWYgKGFyZ3MgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoKGFyZ3YgPSBidWlsZGFyZ3YgKGFyZ3MpKSA9PSBOVUxMKQorCXsKKwkgIG5vbWVtICgwKTsKKwl9CisgICAgICBtYWtlX2NsZWFudXAgKGZyZWVhcmd2LCAoY2hhciAqKSBhcmd2KTsKKworICAgICAgd2hpbGUgKCphcmd2ICE9IE5VTEwpCisJeworCSAgYXJnc2l6ZSA9IHN0cmxlbiAoKmFyZ3YpOworCSAgaWYgKGFyZ3NpemUgPj0gMSAmJiBzdHJuY21wICgqYXJndiwgImFsbCIsIGFyZ3NpemUpID09IDApCisJICAgIHsKKwkgICAgICBzdW1tYXJ5ID0gMDsKKwkgICAgICBhbGwgPSAxOworCSAgICB9CisJICBlbHNlIGlmIChhcmdzaXplID49IDIgJiYgc3RybmNtcCAoKmFyZ3YsICJmYXVsdHMiLCBhcmdzaXplKSA9PSAwKQorCSAgICB7CisJICAgICAgc3VtbWFyeSA9IDA7CisJICAgICAgZmF1bHRzID0gMTsKKwkgICAgfQorCSAgZWxzZSBpZiAoYXJnc2l6ZSA+PSAyICYmIHN0cm5jbXAgKCphcmd2LCAiZmxhZ3MiLCBhcmdzaXplKSA9PSAwKQorCSAgICB7CisJICAgICAgc3VtbWFyeSA9IDA7CisJICAgICAgZmxhZ3MgPSAxOworCSAgICB9CisJICBlbHNlIGlmIChhcmdzaXplID49IDEgJiYgc3RybmNtcCAoKmFyZ3YsICJpZCIsIGFyZ3NpemUpID09IDApCisJICAgIHsKKwkgICAgICBzdW1tYXJ5ID0gMDsKKwkgICAgICBpZCA9IDE7CisJICAgIH0KKwkgIGVsc2UgaWYgKGFyZ3NpemUgPj0gMSAmJiBzdHJuY21wICgqYXJndiwgIm1hcHBpbmdzIiwgYXJnc2l6ZSkgPT0gMCkKKwkgICAgeworCSAgICAgIHN1bW1hcnkgPSAwOworCSAgICAgIG1hcHBpbmdzID0gMTsKKwkgICAgfQorCSAgZWxzZSBpZiAoYXJnc2l6ZSA+PSAyICYmIHN0cm5jbXAgKCphcmd2LCAic2lnbmFscyIsIGFyZ3NpemUpID09IDApCisJICAgIHsKKwkgICAgICBzdW1tYXJ5ID0gMDsKKwkgICAgICBzaWduYWxzID0gMTsKKwkgICAgfQorCSAgZWxzZSBpZiAoYXJnc2l6ZSA+PSAyICYmIHN0cm5jbXAgKCphcmd2LCAic3RhdHVzIiwgYXJnc2l6ZSkgPT0gMCkKKwkgICAgeworCSAgICAgIHN1bW1hcnkgPSAwOworCSAgICAgIHN0YXR1cyA9IDE7CisJICAgIH0KKwkgIGVsc2UgaWYgKGFyZ3NpemUgPj0gMiAmJiBzdHJuY21wICgqYXJndiwgInN5c2NhbGxzIiwgYXJnc2l6ZSkgPT0gMCkKKwkgICAgeworCSAgICAgIHN1bW1hcnkgPSAwOworCSAgICAgIHN5c2NhbGxzID0gMTsKKwkgICAgfQorCSAgZWxzZSBpZiAoYXJnc2l6ZSA+PSAxICYmIHN0cm5jbXAgKCphcmd2LCAidGltZXMiLCBhcmdzaXplKSA9PSAwKQorCSAgICB7CisJICAgICAgc3VtbWFyeSA9IDA7CisJICAgICAgdGltZXMgPSAxOworCSAgICB9CisJICBlbHNlIGlmICgocGlkID0gYXRvaSAoKmFyZ3YpKSA+IDApCisJICAgIHsKKwkgICAgICBwaXAgPSAoc3RydWN0IHByb2NpbmZvICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHByb2NpbmZvKSk7CisJICAgICAgbWVtc2V0IChwaXAsIDAsIHNpemVvZiAoKnBpcCkpOworCisJICAgICAgcGlwLT5waWQgPSBwaWQ7CisJICAgICAgaWYgKCFvcGVuX3Byb2NfZmlsZSAocGlkLCBwaXAsIE9fUkRPTkxZLCAwKSkKKwkJeworCQkgIHBlcnJvcl93aXRoX25hbWUgKHBpcCAtPiBwYXRobmFtZSk7CisJCSAgLyogTk9UUkVBQ0hFRCAqLworCQl9CisJICAgICAgcGlkID0gcGlwLT5waWQ7CisJICAgICAgbWFrZV9jbGVhbnVwIChjbG9zZV9wcm9jX2ZpbGUsIHBpcCk7CisJICAgIH0KKwkgIGVsc2UgaWYgKCoqYXJndiAhPSAnXDAwMCcpCisJICAgIHsKKwkgICAgICBlcnJvciAoIlVucmVjb2duaXplZCBvciBhbWJpZ3VvdXMga2V5d29yZCBgJXMnLiIsICphcmd2KTsKKwkgICAgfQorCSAgYXJndisrOworCX0KKyAgICB9CisKKyAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIHZhbGlkIG9wZW4gcHJvY2VzcyBhdCB0aGlzIHBvaW50LCB0aGVuIHdlIGhhdmUgbm8KKyAgICAgaW5mZXJpb3Igb3IgZGlkbid0IHNwZWNpZnkgYSBzcGVjaWZpYyBwaWQuICovCisKKyAgaWYgKCFwaXApCisgICAgeworICAgICAgZXJyb3IgKCJcCitObyBwcm9jZXNzLiAgU3RhcnQgZGVidWdnaW5nIGEgcHJvZ3JhbSBvciBzcGVjaWZ5IGFuIGV4cGxpY2l0IHByb2Nlc3MgSUQuIik7CisgICAgfQorCisgIGlmICghcHJvY2ZzX3JlYWRfc3RhdHVzIChwaXApKQorICAgIHsKKyAgICAgIHByaW50X3N5c19lcnJtc2cgKHBpcCAtPiBwYXRobmFtZSwgZXJybm8pOworICAgICAgZXJyb3IgKCJwcm9jZnNfcmVhZF9zdGF0dXMgZmFpbGVkIik7CisgICAgfQorCisjaWZuZGVmIFBST0NGU19VU0VfUkVBRF9XUklURQorI2lmZGVmIFBJT0NMV1BJRFMKKyAgbmx3cCA9IHBpcC0+cHJzdGF0dXMucHJfbmx3cDsKKyAgbHdwcyA9IGFsbG9jYSAoKDIgKiBubHdwICsgMikgKiBzaXplb2YgKCpsd3BzKSk7CisKKyAgaWYgKGlvY3RsIChwaXAtPmN0bF9mZCwgUElPQ0xXUElEUywgbHdwcykpCisgICAgeworICAgICAgcHJpbnRfc3lzX2Vycm1zZyAocGlwIC0+IHBhdGhuYW1lLCBlcnJubyk7CisgICAgICBlcnJvciAoIlBJT0NMV1BJRFMgZmFpbGVkIik7CisgICAgfQorI2Vsc2UgLyogUElPQ0xXUElEUyAqLworICBubHdwID0gMTsKKyAgbHdwcyA9IGFsbG9jYSAoKDIgKiBubHdwICsgMikgKiBzaXplb2YgKmx3cHMpOworICBsd3BzWzBdID0gMDsKKyNlbmRpZiAvKiBQSU9DTFdQSURTICovCisKKyAgZm9yICg7IG5sd3AgPiAwOyBubHdwLS0sIGx3cHMrKykKKyAgICB7CisgICAgICBwaXAgPSBmaW5kX3Byb2NpbmZvICgoKmx3cHMgPDwgMTYpIHwgcGlkLCAxKTsKKworICAgICAgaWYgKCFwaXApCisJeworCSAgcGlwID0gKHN0cnVjdCBwcm9jaW5mbyAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBwcm9jaW5mbykpOworCSAgbWVtc2V0IChwaXAsIDAsIHNpemVvZiAoKnBpcCkpOworCSAgaWYgKCFvcGVuX3Byb2NfZmlsZSAoKCpsd3BzIDw8IDE2KSB8IHBpZCwgcGlwLCBPX1JET05MWSwgMCkpCisJICAgIGNvbnRpbnVlOworCisJICBtYWtlX2NsZWFudXAgKGNsb3NlX3Byb2NfZmlsZSwgcGlwKTsKKworCSAgaWYgKCFwcm9jZnNfcmVhZF9zdGF0dXMgKHBpcCkpCisJICAgIHsKKwkgICAgICBwcmludF9zeXNfZXJybXNnIChwaXAgLT4gcGF0aG5hbWUsIGVycm5vKTsKKwkgICAgICBlcnJvciAoInByb2Nmc19yZWFkX3N0YXR1cyBmYWlsZWQiKTsKKwkgICAgfQorCX0KKworI2VuZGlmIC8qIFBST0NGU19VU0VfUkVBRF9XUklURSAqLworCisgICAgICAvKiBQcmludCB2ZXJib3NlIGluZm9ybWF0aW9uIG9mIHRoZSByZXF1ZXN0ZWQgdHlwZShzKSwgb3IganVzdCBhIHN1bW1hcnkKKwkgb2YgdGhlIGluZm9ybWF0aW9uIGZvciBhbGwgdHlwZXMuICovCisKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuSW5mb3JtYXRpb24gZm9yICVzLiVkOlxuXG4iLCBwaXAgLT4gcGF0aG5hbWUsICpsd3BzKTsKKyAgICAgIGlmIChzdW1tYXJ5IHx8IGFsbCB8fCBmbGFncykKKwl7CisJICBpbmZvX3Byb2NfZmxhZ3MgKHBpcCwgc3VtbWFyeSk7CisJfQorICAgICAgaWYgKHN1bW1hcnkgfHwgYWxsKQorCXsKKwkgIGluZm9fcHJvY19zdG9wIChwaXAsIHN1bW1hcnkpOworI2lmZGVmIFVOSVhXQVJFCisJICBzdXBwbHlfZ3JlZ3NldCAoJnBpcC0+cHJzdGF0dXMucHJfbHdwLnByX2NvbnRleHQudWNfbWNvbnRleHQuZ3JlZ3MpOworI2Vsc2UKKwkgIHN1cHBseV9ncmVnc2V0ICgmcGlwLT5wcnN0YXR1cy5wcl9yZWcpOworI2VuZGlmCisJICBwcmludGZfZmlsdGVyZWQgKCJQQzogIik7CisJICBwcmludF9hZGRyZXNzIChyZWFkX3BjICgpLCBnZGJfc3Rkb3V0KTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisJfQorICAgICAgaWYgKHN1bW1hcnkgfHwgYWxsIHx8IHNpZ25hbHMgfHwgZmF1bHRzKQorCXsKKwkgIGluZm9fcHJvY19zaWdpbmZvIChwaXAsIHN1bW1hcnkpOworCX0KKyAgICAgIGlmIChzdW1tYXJ5IHx8IGFsbCB8fCBzeXNjYWxscykKKwl7CisJICBpbmZvX3Byb2Nfc3lzY2FsbHMgKHBpcCwgc3VtbWFyeSk7CisJfQorICAgICAgaWYgKHN1bW1hcnkgfHwgYWxsIHx8IG1hcHBpbmdzKQorCXsKKwkgIGluZm9fcHJvY19tYXBwaW5ncyAocGlwLCBzdW1tYXJ5KTsKKwl9CisgICAgICBpZiAoc3VtbWFyeSB8fCBhbGwgfHwgc2lnbmFscykKKwl7CisJICBpbmZvX3Byb2Nfc2lnbmFscyAocGlwLCBzdW1tYXJ5KTsKKwl9CisgICAgICBpZiAoc3VtbWFyeSB8fCBhbGwgfHwgZmF1bHRzKQorCXsKKwkgIGluZm9fcHJvY19mYXVsdHMgKHBpcCwgc3VtbWFyeSk7CisJfQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKworICAgICAgLyogQWxsIGRvbmUsIGRlYWwgd2l0aCBjbG9zaW5nIGFueSB0ZW1wb3JhcnkgcHJvY2VzcyBpbmZvIHN0cnVjdHVyZSwKKwkgZnJlZWluZyB0ZW1wb3JhcnkgbWVtb3J5ICwgZXRjLiAqLworCisgICAgICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKKyNpZm5kZWYgUFJPQ0ZTX1VTRV9SRUFEX1dSSVRFCisgICAgfQorI2VuZGlmCit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwltb2RpZnlfaW5oZXJpdF9vbl9mb3JrX2ZsYWcgLSBDaGFuZ2UgdGhlIGluaGVyaXQtb24tZm9yayBmbGFnCisKK1NZTk9QU0lTCisKKwl2b2lkIG1vZGlmeV9pbmhlcml0X29uX2ZvcmtfZmxhZyAoZmQsIGZsYWcpCisKK0RFU0NSSVBUSU9OCisKKwlDYWxsIHRoaXMgcm91dGluZSB0byBtb2RpZnkgdGhlIGluaGVyaXQtb24tZm9yayBmbGFnLiAgVGhpcyByb3V0aW5lIGlzCisJanVzdCBhIG5pY2Ugd3JhcHBlciB0byBoaWRlIHRoZSAjaWZkZWZzIG5lZWRlZCBieSB2YXJpb3VzIHN5c3RlbXMgdG8KKwljb250cm9sIHRoaXMgZmxhZy4KKworICovCisKK3N0YXRpYyB2b2lkCittb2RpZnlfaW5oZXJpdF9vbl9mb3JrX2ZsYWcgKGZkLCBmbGFnKQorICAgICBpbnQgZmQ7CisgICAgIGludCBmbGFnOworeworI2lmIGRlZmluZWQgKFBJT0NTRVQpIHx8IGRlZmluZWQgKFBDU0VUKQorICBsb25nIHByX2ZsYWdzOworI2VuZGlmCisgIGludCByZXR2YWwgPSAwOworICBzdHJ1Y3QgcHJvY19jdGwgcGN0bDsKKworI2lmIGRlZmluZWQgKFBJT0NTRVQpIHx8IGRlZmluZWQgKFBDU0VUKQkvKiBOZXcgbWV0aG9kICovCisgIHByX2ZsYWdzID0gUFJfRk9SSzsKKyAgaWYgKGZsYWcpCisgICAgeworI2lmZGVmIFBST0NGU19VU0VfUkVBRF9XUklURQorICAgICAgcGN0bC5jbWQgPSBQQ1NFVDsKKyAgICAgIHBjdGwuZGF0YSA9IFBSX0ZPUks7CisgICAgICBpZiAod3JpdGUgKGZkLCAoY2hhciAqKSAmcGN0bCwgc2l6ZW9mIChzdHJ1Y3QgcHJvY19jdGwpKSA8IDApCisJcmV0dmFsID0gLTE7CisjZWxzZQorICAgICAgcmV0dmFsID0gaW9jdGwgKGZkLCBQSU9DU0VULCAmcHJfZmxhZ3MpOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgeworI2lmZGVmIFBST0NGU19VU0VfUkVBRF9XUklURQorICAgICAgcGN0bC5jbWQgPSBQQ1JFU0VUOworICAgICAgcGN0bC5kYXRhID0gUFJfRk9SSzsKKyAgICAgIGlmICh3cml0ZSAoZmQsIChjaGFyICopICZwY3RsLCBzaXplb2YgKHN0cnVjdCBwcm9jX2N0bCkpIDwgMCkKKwlyZXR2YWwgPSAtMTsKKyNlbHNlCisgICAgICByZXR2YWwgPSBpb2N0bCAoZmQsIFBJT0NSRVNFVCwgJnByX2ZsYWdzKTsKKyNlbmRpZgorICAgIH0KKworI2Vsc2UKKyNpZmRlZiBQSU9DU0ZPUksJCS8qIE9yaWdpbmFsIG1ldGhvZCAqLworICBpZiAoZmxhZykKKyAgICB7CisgICAgICByZXR2YWwgPSBpb2N0bCAoZmQsIFBJT0NTRk9SSywgTlVMTCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0dmFsID0gaW9jdGwgKGZkLCBQSU9DUkZPUkssIE5VTEwpOworICAgIH0KKyNlbHNlCisgIE5laXRoZXIgUFJfRk9SSyBub3IgUElPQ1NGT1JLIGV4aXN0ISEhCisjZW5kaWYKKyNlbmRpZgorCisgIGlmICghcmV0dmFsKQorICAgIHJldHVybjsKKworICBwcmludF9zeXNfZXJybXNnICgibW9kaWZ5X2luaGVyaXRfb25fZm9ya19mbGFnIiwgZXJybm8pOworICBlcnJvciAoIlBJT0NTRk9SSyBvciBQUl9GT1JLIG1vZGlmaWNhdGlvbiBmYWlsZWQiKTsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCW1vZGlmeV9ydW5fb25fbGFzdF9jbG9zZV9mbGFnIC0gQ2hhbmdlIHRoZSBydW4tb24tbGFzdC1jbG9zZSBmbGFnCisKK1NZTk9QU0lTCisKKwl2b2lkIG1vZGlmeV9ydW5fb25fbGFzdF9jbG9zZV9mbGFnIChmZCwgZmxhZykKKworREVTQ1JJUFRJT04KKworCUNhbGwgdGhpcyByb3V0aW5lIHRvIG1vZGlmeSB0aGUgcnVuLW9uLWxhc3QtY2xvc2UgZmxhZy4gIFRoaXMgcm91dGluZQorCWlzIGp1c3QgYSBuaWNlIHdyYXBwZXIgdG8gaGlkZSB0aGUgI2lmZGVmcyBuZWVkZWQgYnkgdmFyaW91cyBzeXN0ZW1zIHRvCisJY29udHJvbCB0aGlzIGZsYWcuCisKKyAqLworCitzdGF0aWMgdm9pZAorbW9kaWZ5X3J1bl9vbl9sYXN0X2Nsb3NlX2ZsYWcgKGZkLCBmbGFnKQorICAgICBpbnQgZmQ7CisgICAgIGludCBmbGFnOworeworI2lmIGRlZmluZWQgKFBJT0NTRVQpIHx8IGRlZmluZWQgKFBDU0VUKQorICBsb25nIHByX2ZsYWdzOworI2VuZGlmCisgIGludCByZXR2YWwgPSAwOworICBzdHJ1Y3QgcHJvY19jdGwgcGN0bDsKKworI2lmIGRlZmluZWQgKFBJT0NTRVQpIHx8IGRlZmluZWQgKFBDU0VUKQkvKiBOZXcgbWV0aG9kICovCisgIHByX2ZsYWdzID0gUFJfUkxDOworICBpZiAoZmxhZykKKyAgICB7CisjaWZkZWYgUFJPQ0ZTX1VTRV9SRUFEX1dSSVRFCisgICAgICBwY3RsLmNtZCA9IFBDU0VUOworICAgICAgcGN0bC5kYXRhID0gUFJfUkxDOworICAgICAgaWYgKHdyaXRlIChmZCwgKGNoYXIgKikgJnBjdGwsIHNpemVvZiAoc3RydWN0IHByb2NfY3RsKSkgPCAwKQorCXJldHZhbCA9IC0xOworI2Vsc2UKKyAgICAgIHJldHZhbCA9IGlvY3RsIChmZCwgUElPQ1NFVCwgJnByX2ZsYWdzKTsKKyNlbmRpZgorICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZmRlZiBQUk9DRlNfVVNFX1JFQURfV1JJVEUKKyAgICAgIHBjdGwuY21kID0gUENSRVNFVDsKKyAgICAgIHBjdGwuZGF0YSA9IFBSX1JMQzsKKyAgICAgIGlmICh3cml0ZSAoZmQsIChjaGFyICopICZwY3RsLCBzaXplb2YgKHN0cnVjdCBwcm9jX2N0bCkpIDwgMCkKKwlyZXR2YWwgPSAtMTsKKyNlbHNlCisgICAgICByZXR2YWwgPSBpb2N0bCAoZmQsIFBJT0NSRVNFVCwgJnByX2ZsYWdzKTsKKyNlbmRpZgorICAgIH0KKworI2Vsc2UKKyNpZmRlZiBQSU9DU1JMQwkJCS8qIE9yaWdpbmFsIG1ldGhvZCAqLworICBpZiAoZmxhZykKKyAgICByZXR2YWwgPSBpb2N0bCAoZmQsIFBJT0NTUkxDLCBOVUxMKTsKKyAgZWxzZQorICAgIHJldHZhbCA9IGlvY3RsIChmZCwgUElPQ1JSTEMsIE5VTEwpOworI2Vsc2UKKyAgTmVpdGhlciBQUl9STEMgbm9yIFBJT0NTUkxDIGV4aXN0ISEhCisjZW5kaWYKKyNlbmRpZgorCisgIGlmICghcmV0dmFsKQorICAgIHJldHVybjsKKworICBwcmludF9zeXNfZXJybXNnICgibW9kaWZ5X3J1bl9vbl9sYXN0X2Nsb3NlX2ZsYWciLCBlcnJubyk7CisgIGVycm9yICgiUElPQ1NSTEMgb3IgUFJfUkxDIG1vZGlmaWNhdGlvbiBmYWlsZWQiKTsKK30KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCXByb2Nmc19jbGVhcl9zeXNjYWxsX3RyYXAgLS0gRGVsZXRlcyB0aGUgdHJhcCBmb3IgdGhlIHNwZWNpZmllZCBzeXN0ZW0gY2FsbC4KKworU1lOT1BTSVMKKworCXZvaWQgcHJvY2ZzX2NsZWFyX3N5c2NhbGxfdHJhcCAoc3RydWN0IHByb2NpbmZvICosIGludCBzeXNjYWxsX251bSwgaW50IGVycm9rKQorCitERVNDUklQVElPTgorCisJVGhpcyBmdW5jdGlvbiBmdW5jdGlvbiBkaXNhYmxlcyB0cmFwcyBmb3IgdGhlIHNwZWNpZmllZCBzeXN0ZW0gY2FsbC4KKwllcnJvayBpcyBub24temVybyBpZiBlcnJvcnMgc2hvdWxkIGJlIGlnbm9yZWQuCisgKi8KKworc3RhdGljIHZvaWQKK3Byb2Nmc19jbGVhcl9zeXNjYWxsX3RyYXAgKHBpLCBzeXNjYWxsX251bSwgZXJyb2spCisgICAgIHN0cnVjdCBwcm9jaW5mbyAqcGk7CisgICAgIGludCBzeXNjYWxsX251bTsKKyAgICAgaW50IGVycm9rOworeworICBzeXNzZXRfdCBzeXNzZXQ7CisgIGludCBnb3RlcnIsIGk7CisKKyNpZm5kZWYgVU5JWFdBUkUKKyAgZ290ZXJyID0gaW9jdGwgKHBpLT5jdGxfZmQsIFBJT0NHRU5UUlksICZzeXNzZXQpIDwgMDsKKworICBpZiAoZ290ZXJyICYmICFlcnJvaykKKyAgICB7CisgICAgICBwcmludF9zeXNfZXJybXNnIChwaS0+cGF0aG5hbWUsIGVycm5vKTsKKyAgICAgIGVycm9yICgiUElPQ0dFTlRSWSBmYWlsZWQiKTsKKyAgICB9CisKKyAgaWYgKCFnb3RlcnIpCisgICAgeworICAgICAgcHJkZWxzZXQgKCZzeXNzZXQsIHN5c2NhbGxfbnVtKTsKKworICAgICAgaWYgKChpb2N0bCAocGktPmN0bF9mZCwgUElPQ1NFTlRSWSwgJnN5c3NldCkgPCAwKSAmJiAhZXJyb2spCisJeworCSAgcHJpbnRfc3lzX2Vycm1zZyAocGktPnBhdGhuYW1lLCBlcnJubyk7CisJICBlcnJvciAoIlBJT0NTRU5UUlkgZmFpbGVkIik7CisJfQorICAgIH0KKworICBnb3RlcnIgPSBpb2N0bCAocGktPmN0bF9mZCwgUElPQ0dFWElULCAmc3lzc2V0KSA8IDA7CisKKyAgaWYgKGdvdGVyciAmJiAhZXJyb2spCisgICAgeworICAgICAgcHJvY2ZzX2NsZWFyX3N5c2NhbGxfdHJhcCAocGksIHN5c2NhbGxfbnVtLCAxKTsKKyAgICAgIHByaW50X3N5c19lcnJtc2cgKHBpLT5wYXRobmFtZSwgZXJybm8pOworICAgICAgZXJyb3IgKCJQSU9DR0VYSVQgZmFpbGVkIik7CisgICAgfQorCisgIGlmICghZ290ZXJyKQorICAgIHsKKyAgICAgIHByYWRkc2V0ICgmc3lzc2V0LCBzeXNjYWxsX251bSk7CisKKyAgICAgIGlmICgoaW9jdGwgKHBpLT5jdGxfZmQsIFBJT0NTRVhJVCwgJnN5c3NldCkgPCAwKSAmJiAhZXJyb2spCisJeworCSAgcHJvY2ZzX2NsZWFyX3N5c2NhbGxfdHJhcCAocGksIHN5c2NhbGxfbnVtLCAxKTsKKwkgIHByaW50X3N5c19lcnJtc2cgKHBpLT5wYXRobmFtZSwgZXJybm8pOworCSAgZXJyb3IgKCJQSU9DU0VYSVQgZmFpbGVkIik7CisJfQorICAgIH0KKyNlbmRpZgorCisgIGlmICghcGktPnN5c2NhbGxfaGFuZGxlcnMpCisgICAgeworICAgICAgaWYgKCFlcnJvaykKKwllcnJvciAoInByb2Nmc19jbGVhcl9zeXNjYWxsX3RyYXA6ICBzeXNjYWxsX2hhbmRsZXJzIGlzIGVtcHR5Iik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFJlbW92ZSBoYW5kbGVyIGZ1bmMgZnJvbSB0aGUgaGFuZGxlciBsaXN0ICovCisKKyAgZm9yIChpID0gMDsgaSA8IHBpLT5udW1fc3lzY2FsbF9oYW5kbGVyczsgaSsrKQorICAgIGlmIChwaS0+c3lzY2FsbF9oYW5kbGVyc1tpXS5zeXNjYWxsX251bSA9PSBzeXNjYWxsX251bSkKKyAgICAgIHsKKwlpZiAoaSArIDEgIT0gcGktPm51bV9zeXNjYWxsX2hhbmRsZXJzKQorCSAgewkJCS8qIE5vdCB0aGUgbGFzdCBlbnRyeS4KKwkJCQkgICBNb3ZlIHN1YnNlcXVlbnQgZW50cmllcyBmd2QuICovCisJICAgIG1lbWNweSAoJnBpLT5zeXNjYWxsX2hhbmRsZXJzW2ldLCAmcGktPnN5c2NhbGxfaGFuZGxlcnNbaSArIDFdLAorCQkgICAgKHBpLT5udW1fc3lzY2FsbF9oYW5kbGVycyAtIGkgLSAxKQorCQkgICAgKiBzaXplb2YgKHN0cnVjdCBwcm9jZnNfc3lzY2FsbF9oYW5kbGVyKSk7CisJICB9CisKKwlwaS0+c3lzY2FsbF9oYW5kbGVycyA9IHhyZWFsbG9jIChwaS0+c3lzY2FsbF9oYW5kbGVycywKKwkJCQkJIChwaS0+bnVtX3N5c2NhbGxfaGFuZGxlcnMgLSAxKQorCQkJCQkgKiBzaXplb2YgKHN0cnVjdCBwcm9jZnNfc3lzY2FsbF9oYW5kbGVyKSk7CisJcGktPm51bV9zeXNjYWxsX2hhbmRsZXJzLS07CisJcmV0dXJuOworICAgICAgfQorCisgIGlmICghZXJyb2spCisgICAgZXJyb3IgKCJwcm9jZnNfY2xlYXJfc3lzY2FsbF90cmFwOiAgQ291bGRuJ3QgZmluZCBoYW5kbGVyIGZvciBzeXMgY2FsbCAlZCIsCisJICAgc3lzY2FsbF9udW0pOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJcHJvY2ZzX3NldF9zeXNjYWxsX3RyYXAgLS0gYXJyYW5nZSBmb3IgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUKKwkJCQkgICBjaGlsZCBleGVjdXRlcyB0aGUgc3BlY2lmaWVkIHN5c3RlbSBjYWxsLgorCitTWU5PUFNJUworCisJdm9pZCBwcm9jZnNfc2V0X3N5c2NhbGxfdHJhcCAoc3RydWN0IHByb2NpbmZvICosIGludCBzeXNjYWxsX251bSwgaW50IGZsYWdzLAorCQkJCSAgICAgIHN5c2NhbGxfZnVuY190ICpmdW5jdGlvbikKKworREVTQ1JJUFRJT04KKworCVRoaXMgZnVuY3Rpb24gc2V0cyB1cCBhbiBlbnRyeSBhbmQvb3IgZXhpdCB0cmFwIGZvciB0aGUgc3BlY2lmaWVkIHN5c3RlbQorCWNhbGwuICBXaGVuIHRoZSBjaGlsZCBleGVjdXRlcyB0aGUgc3BlY2lmaWVkIHN5c3RlbSBjYWxsLCB5b3VyIGZ1bmN0aW9uCisJd2lsbCBiZQljYWxsZWQgd2l0aCB0aGUgY2FsbCAjLCBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgZW50cnkgb3IgZXhpdCwgYW5kCisJcG9pbnRlcnMgdG8gcnRudmFsIGFuZCBzdGF0dmFsICh3aGljaCBhcmUgdXNlZCBieSBwcm9jZnNfd2FpdCkuICBUaGUKKwlmdW5jdGlvbiBzaG91bGQgcmV0dXJuIG5vbi16ZXJvIGlmIHNvbWV0aGluZyBpbnRlcmVzdGluZyBoYXBwZW5lZCwgemVybworCW90aGVyd2lzZS4KKyAqLworCitzdGF0aWMgdm9pZAorcHJvY2ZzX3NldF9zeXNjYWxsX3RyYXAgKHBpLCBzeXNjYWxsX251bSwgZmxhZ3MsIGZ1bmMpCisgICAgIHN0cnVjdCBwcm9jaW5mbyAqcGk7CisgICAgIGludCBzeXNjYWxsX251bTsKKyAgICAgaW50IGZsYWdzOworICAgICBzeXNjYWxsX2Z1bmNfdCAqZnVuYzsKK3sKKyAgc3lzc2V0X3Qgc3lzc2V0OworCisjaWZuZGVmIFVOSVhXQVJFCisgIGlmIChmbGFncyAmIFBST0NGU19TWVNDQUxMX0VOVFJZKQorICAgIHsKKyAgICAgIGlmIChpb2N0bCAocGktPmN0bF9mZCwgUElPQ0dFTlRSWSwgJnN5c3NldCkgPCAwKQorCXsKKwkgIHByaW50X3N5c19lcnJtc2cgKHBpLT5wYXRobmFtZSwgZXJybm8pOworCSAgZXJyb3IgKCJQSU9DR0VOVFJZIGZhaWxlZCIpOworCX0KKworICAgICAgcHJhZGRzZXQgKCZzeXNzZXQsIHN5c2NhbGxfbnVtKTsKKworICAgICAgaWYgKGlvY3RsIChwaS0+Y3RsX2ZkLCBQSU9DU0VOVFJZLCAmc3lzc2V0KSA8IDApCisJeworCSAgcHJpbnRfc3lzX2Vycm1zZyAocGktPnBhdGhuYW1lLCBlcnJubyk7CisJICBlcnJvciAoIlBJT0NTRU5UUlkgZmFpbGVkIik7CisJfQorICAgIH0KKworICBpZiAoZmxhZ3MgJiBQUk9DRlNfU1lTQ0FMTF9FWElUKQorICAgIHsKKyAgICAgIGlmIChpb2N0bCAocGktPmN0bF9mZCwgUElPQ0dFWElULCAmc3lzc2V0KSA8IDApCisJeworCSAgcHJvY2ZzX2NsZWFyX3N5c2NhbGxfdHJhcCAocGksIHN5c2NhbGxfbnVtLCAxKTsKKwkgIHByaW50X3N5c19lcnJtc2cgKHBpLT5wYXRobmFtZSwgZXJybm8pOworCSAgZXJyb3IgKCJQSU9DR0VYSVQgZmFpbGVkIik7CisJfQorCisgICAgICBwcmFkZHNldCAoJnN5c3NldCwgc3lzY2FsbF9udW0pOworCisgICAgICBpZiAoaW9jdGwgKHBpLT5jdGxfZmQsIFBJT0NTRVhJVCwgJnN5c3NldCkgPCAwKQorCXsKKwkgIHByb2Nmc19jbGVhcl9zeXNjYWxsX3RyYXAgKHBpLCBzeXNjYWxsX251bSwgMSk7CisJICBwcmludF9zeXNfZXJybXNnIChwaS0+cGF0aG5hbWUsIGVycm5vKTsKKwkgIGVycm9yICgiUElPQ1NFWElUIGZhaWxlZCIpOworCX0KKyAgICB9CisjZW5kaWYKKworICBpZiAoIXBpLT5zeXNjYWxsX2hhbmRsZXJzKQorICAgIHsKKyAgICAgIHBpLT5zeXNjYWxsX2hhbmRsZXJzID0geG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcHJvY2ZzX3N5c2NhbGxfaGFuZGxlcikpOworICAgICAgcGktPnN5c2NhbGxfaGFuZGxlcnNbMF0uc3lzY2FsbF9udW0gPSBzeXNjYWxsX251bTsKKyAgICAgIHBpLT5zeXNjYWxsX2hhbmRsZXJzWzBdLmZ1bmMgPSBmdW5jOworICAgICAgcGktPm51bV9zeXNjYWxsX2hhbmRsZXJzID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IHBpLT5udW1fc3lzY2FsbF9oYW5kbGVyczsgaSsrKQorCWlmIChwaS0+c3lzY2FsbF9oYW5kbGVyc1tpXS5zeXNjYWxsX251bSA9PSBzeXNjYWxsX251bSkKKwkgIHsKKwkgICAgcGktPnN5c2NhbGxfaGFuZGxlcnNbaV0uZnVuYyA9IGZ1bmM7CisJICAgIHJldHVybjsKKwkgIH0KKworICAgICAgcGktPnN5c2NhbGxfaGFuZGxlcnMgPSB4cmVhbGxvYyAocGktPnN5c2NhbGxfaGFuZGxlcnMsIChpICsgMSkKKwkJCQkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBwcm9jZnNfc3lzY2FsbF9oYW5kbGVyKSk7CisgICAgICBwaS0+c3lzY2FsbF9oYW5kbGVyc1tpXS5zeXNjYWxsX251bSA9IHN5c2NhbGxfbnVtOworICAgICAgcGktPnN5c2NhbGxfaGFuZGxlcnNbaV0uZnVuYyA9IGZ1bmM7CisgICAgICBwaS0+bnVtX3N5c2NhbGxfaGFuZGxlcnMrKzsKKyAgICB9Cit9CisKKyNpZmRlZiBTWVNfbHdwX2NyZWF0ZQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJcHJvY2ZzX2x3cF9jcmVhdGlvbl9oYW5kbGVyIC0gaGFuZGxlIGV4aXQgZnJvbSB0aGUgX2x3cF9jcmVhdGUgc3lzY2FsbAorCitTWU5PUFNJUworCisJaW50IHByb2Nmc19sd3BfY3JlYXRpb25faGFuZGxlciAocGksIHN5c2NhbGxfbnVtLCB3aHksIHJ0bnZhbHAsIHN0YXR2YWxwKQorCitERVNDUklQVElPTgorCisJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBib3RoIHdoZW4gYW4gaW5mZXJpb3IgcHJvY2VzcyBhbmQgaXQncyBuZXcgbHdwCisJYXJlIGFib3V0IHRvIGZpbmlzaCBhIF9sd3BfY3JlYXRlKCkgc3lzdGVtIGNhbGwuICBUaGlzIGlzIHRoZSBzeXN0ZW0KKwljYWxsIHRoYXQgU29sYXJpcyB1c2VzIHRvIGNyZWF0ZSBhIGxpZ2h0d2VpZ2h0IHByb2Nlc3MuICBXaGVuIHRoZQorCXRhcmdldCBwcm9jZXNzIGdldHMgdGhpcyBldmVudCwgd2UgY2FuIGxvb2sgYXQgc3lzYXJnWzJdIHRvIGZpbmQgdGhlCisJbmV3IGNoaWxkcyBsd3AgSUQsIGFuZCBjcmVhdGUgYSBwcm9jaW5mbyBzdHJ1Y3QgZnJvbSB0aGF0LiAgQWZ0ZXIgdGhhdCwKKwl3ZSBwcmV0ZW5kIHRoYXQgd2UgZ290IGEgU0lHVFJBUCwgYW5kIHJldHVybiBub24temVybyB0byB0ZWxsCisJcHJvY2ZzX3dhaXQgdG8gd2FrZSB1cC4gIFN1YnNlcXVlbnRseSwgd2FpdF9mb3JfaW5mZXJpb3IgZ2V0cyB3b2tlbiB1cCwKKwlzZWVzIHRoZSBuZXcgcHJvY2VzcyBhbmQgY29udGludWVzIGl0LgorCisJV2hlbiB3ZSBzZWUgdGhlIGNoaWxkIGV4aXRpbmcgZnJvbSBsd3BfY3JlYXRlLCB3ZSBqdXN0IGNvbnRpbmUgaXQsCisJc2luY2UgZXZlcnl0aGluZyB3YXMgaGFuZGxlZCB3aGVuIHRoZSBwYXJlbnQgdHJhcHBlZC4KKworTk9URVMKKwlJbiBlZmZlY3QsIHdlIGFyZSBvbmx5IHBheWluZyBhdHRlbnRpb24gdG8gdGhlIHBhcmVudCdzIGNvbXBsZXRpb24gb2YKKwl0aGUgbHdwX2NyZWF0ZSBzeXNjYWxsLiAgSWYgd2Ugb25seSBwYWlkIGF0dGVudGlvbiB0byB0aGUgY2hpbGQKKwlpbnN0ZWFkLCB0aGVuIHdlIHdvdWxkbid0IGRldGVjdCB0aGUgY3JlYXRpb24gb2YgYSBzdXNwZW5kZWQgdGhyZWFkLgorICovCisKK3N0YXRpYyBpbnQKK3Byb2Nmc19sd3BfY3JlYXRpb25faGFuZGxlciAocGksIHN5c2NhbGxfbnVtLCB3aHksIHJ0bnZhbHAsIHN0YXR2YWxwKQorICAgICBzdHJ1Y3QgcHJvY2luZm8gKnBpOworICAgICBpbnQgc3lzY2FsbF9udW07CisgICAgIGludCB3aHk7CisgICAgIGludCAqcnRudmFscDsKKyAgICAgaW50ICpzdGF0dmFscDsKK3sKKyAgaW50IGx3cF9pZDsKKyAgc3RydWN0IHByb2NpbmZvICpjaGlsZHBpOworICBzdHJ1Y3QgcHJvY19jdGwgcGN0bDsKKworICAvKiBXZSd2ZSBqdXN0IGRldGVjdGVkIHRoZSBjb21wbGV0aW9uIG9mIGFuIGx3cF9jcmVhdGUgc3lzdGVtIGNhbGwuICBOb3cgd2UKKyAgICAgbmVlZCB0byBzZXR1cCBhIHByb2NpbmZvIHN0cnVjdCBmb3IgdGhpcyB0aHJlYWQsIGFuZCBub3RpZnkgdGhlIHRocmVhZAorICAgICBzeXN0ZW0gb2YgdGhlIG5ldyBhcnJpdmFsLiAgKi8KKworICAvKiBJZiBsd3BfY3JlYXRlIGZhaWxlZCwgdGhlbiBub3RoaW5nIGludGVyZXN0aW5nIGhhcHBlbmVkLiAgQ29udGludWUgdGhlCisgICAgIHByb2Nlc3MgYW5kIGdvIGJhY2sgdG8gc2xlZXAuICovCisKKyNpZmRlZiBVTklYV0FSRQorICAvKiBKb2VsIC4uLiBjYW4geW91IGNoZWNrIHRoaXMgbG9naWMgb3V0IHBsZWFzZT8gSktKICovCisgIGlmIChwaS0+cHJzdGF0dXMucHJfbHdwLnByX2NvbnRleHQudWNfbWNvbnRleHQuZ3JlZ3NbUl9FRkxdICYgMSkKKyAgICB7IC8qIF9sd3BfY3JlYXRlIGZhaWxlZCAqLworICAgICAgcGN0bC5jbWQgPSBQQ1JVTjsKKyAgICAgIHBjdGwuZGF0YSA9IFBSQ0ZBVUxUOworCisgICAgICBpZiAod3JpdGUgKHBpLT5jdGxfZmQsIChjaGFyICopICZwY3RsLCBzaXplb2YgKHN0cnVjdCBwcm9jX2N0bCkpIDwgMCkKKwlwZXJyb3Jfd2l0aF9uYW1lIChwaS0+cGF0aG5hbWUpOworCisgICAgICByZXR1cm4gMDsKKyAgICB9CisjZWxzZSAvKiBVTklYV0FSRSAqLworICBpZiAoUFJPQ0ZTX0dFVF9DQVJSWSAocGktPnByc3RhdHVzLnByX3JlZykpCisgICAgewkJCQkvKiBfbHdwX2NyZWF0ZSBmYWlsZWQgKi8KKyAgICAgIHBpLT5wcnJ1bi5wcl9mbGFncyAmPSBQUlNURVA7CisgICAgICBwaS0+cHJydW4ucHJfZmxhZ3MgfD0gUFJDRkFVTFQ7CisKKyAgICAgIGlmIChpb2N0bCAocGktPmN0bF9mZCwgUElPQ1JVTiwgJnBpLT5wcnJ1bikgIT0gMCkKKwlwZXJyb3Jfd2l0aF9uYW1lIChwaS0+cGF0aG5hbWUpOworCisgICAgICByZXR1cm4gMDsKKyAgICB9CisjZW5kaWYKKworICAvKiBBdCB0aGlzIHBvaW50LCB0aGUgbmV3IHRocmVhZCBpcyBzdG9wcGVkIGF0IGl0J3MgZmlyc3QgaW5zdHJ1Y3Rpb24sIGFuZAorICAgICB0aGUgcGFyZW50IGlzIHN0b3BwZWQgYXQgdGhlIGV4aXQgZnJvbSBsd3BfY3JlYXRlLiAgKi8KKworICBpZiAocGktPm5ld19jaGlsZCkJCS8qIENoaWxkPyAqLworICAgIHsJCQkJLyogWWVzLCBqdXN0IGNvbnRpbnVlIGl0ICovCisjaWZkZWYgVU5JWFdBUkUKKyAgICAgIHBjdGwuY21kID0gUENSVU47CisgICAgICBwY3RsLmRhdGEgPSBQUkNGQVVMVDsKKworICAgICAgaWYgKHdyaXRlKHBpLT5jdGxfZmQsIChjaGFyICopJnBjdGwsIHNpemVvZiAoc3RydWN0IHByb2NfY3RsKSkgPCAwKQorI2Vsc2UgLyogIVVOSVhXQVJFICovCisgICAgICBwaS0+cHJydW4ucHJfZmxhZ3MgJj0gUFJTVEVQOworICAgICAgcGktPnBycnVuLnByX2ZsYWdzIHw9IFBSQ0ZBVUxUOworCisgICAgICBpZiAoKHBpLT5wcnN0YXR1cy5wcl9mbGFncyAmIFBSX0lTVE9QKQorCSAgJiYgaW9jdGwgKHBpLT5jdGxfZmQsIFBJT0NSVU4sICZwaS0+cHJydW4pICE9IDApCisjZW5kaWYgLyogIVVOSVhXQVJFICovCisJcGVycm9yX3dpdGhfbmFtZSAocGktPnBhdGhuYW1lKTsKKworICAgICAgcGktPm5ld19jaGlsZCA9IDA7CS8qIE5vIGxvbmdlciBuZXcgKi8KKworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIFdlJ3JlIHRoZSBwcm91ZCBwYXJlbnQgb2YgYSBuZXcgdGhyZWFkLiAgU2V0dXAgYW4gZXhpdCB0cmFwIGZvciBsd3BfY3JlYXRlCisgICAgIGluIHRoZSBjaGlsZCBhbmQgY29udGludWUgdGhlIHBhcmVudC4gICovCisKKyAgLyogVGhpcmQgYXJnIGlzIHBvaW50ZXIgdG8gbmV3IHRocmVhZCBpZC4gKi8KKyAgbHdwX2lkID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoCisgICAgIFRIRV9QUl9MV1AocGktPnByc3RhdHVzKS5wcl9zeXNhcmdbMl0sIHNpemVvZiAoaW50KSk7CisKKyAgbHdwX2lkID0gKGx3cF9pZCA8PCAxNikgfCBQSURHRVQgKHBpLT5waWQpOworCisgIGNoaWxkcGkgPSBjcmVhdGVfcHJvY2luZm8gKGx3cF9pZCk7CisKKyAgLyogVGhlIG5ldyBwcm9jZXNzIGhhcyBhY3R1YWxseSBpbmhlcml0ZWQgdGhlIGx3cF9jcmVhdGUgc3lzY2FsbCB0cmFwIGZyb20KKyAgICAgaXQncyBwYXJlbnQsIGJ1dCB3ZSBzdGlsbCBoYXZlIHRvIGNhbGwgdGhpcyB0byByZWdpc3RlciBoYW5kbGVycyBmb3IKKyAgICAgdGhhdCBjaGlsZC4gICovCisKKyAgcHJvY2ZzX3NldF9pbmZlcmlvcl9zeXNjYWxsX3RyYXBzIChjaGlsZHBpKTsKKyAgYWRkX3RocmVhZCAobHdwX2lkKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiW05ldyAlc11cbiIsIHRhcmdldF9waWRfdG9fc3RyIChsd3BfaWQpKTsKKworICAvKiBDb250aW51ZSB0aGUgcGFyZW50ICovCisjaWZkZWYgVU5JWFdBUkUKKyAgcGN0bC5jbWQgPSBQQ1JVTjsKKyAgcGN0bC5kYXRhID0gUFJDRkFVTFQ7CisKKyAgaWYgKHdyaXRlKHBpLT5jdGxfZmQsIChjaGFyICopJnBjdGwsIHNpemVvZiAoc3RydWN0IHByb2NfY3RsKSkgPCAwKQorI2Vsc2UKKyAgcGktPnBycnVuLnByX2ZsYWdzICY9IFBSU1RFUDsKKyAgcGktPnBycnVuLnByX2ZsYWdzIHw9IFBSQ0ZBVUxUOworICBpZiAoaW9jdGwgKHBpLT5jdGxfZmQsIFBJT0NSVU4sICZwaS0+cHJydW4pICE9IDApCisjZW5kaWYKKyAgICBwZXJyb3Jfd2l0aF9uYW1lIChwaS0+cGF0aG5hbWUpOworCisgIC8qIFRoZSBuZXcgY2hpbGQgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIGluIG9uZSBvZiB0d28gc3RhdGVzOiAKKyAgICAgU1VTUEVOREVEIG9yIFJVTk5BQkxFLiAgSWYgcnVubmFibGUsIHdlIHdpbGwgc2ltcGx5IHNpZ25hbCBpdCB0byBydW4uCisgICAgIElmIHN1c3BlbmRlZCwgd2UgZmxhZyBpdCB0byBiZSBjb250aW51ZWQgbGF0ZXIsIHdoZW4gaXQgaGFzIGFuIGV2ZW50LiAgKi8KKworICBpZiAoVEhFX1BSX0xXUChjaGlsZHBpLT5wcnN0YXR1cykucHJfd2h5ID09IFBSX1NVU1BFTkRFRCkKKyAgICBjaGlsZHBpLT5uZXdfY2hpbGQgPSAxOwkvKiBGbGFnIHRoaXMgYXMgYW4gdW5zZWVuIGNoaWxkIHByb2Nlc3MgKi8KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIENvbnRpbnVlIHRoZSBjaGlsZCAqLworI2lmZGVmIFVOSVhXQVJFCisgICAgICBwY3RsLmNtZCA9IFBDUlVOOworICAgICAgcGN0bC5kYXRhID0gUFJDRkFVTFQ7CisKKyAgICAgIGlmICh3cml0ZShwaS0+Y3RsX2ZkLCAoY2hhciAqKSZwY3RsLCBzaXplb2YgKHN0cnVjdCBwcm9jX2N0bCkpIDwgMCkKKyNlbHNlCisgICAgICBjaGlsZHBpLT5wcnJ1bi5wcl9mbGFncyAmPSBQUlNURVA7CisgICAgICBjaGlsZHBpLT5wcnJ1bi5wcl9mbGFncyB8PSBQUkNGQVVMVDsKKworICAgICAgaWYgKGlvY3RsIChjaGlsZHBpLT5jdGxfZmQsIFBJT0NSVU4sICZjaGlsZHBpLT5wcnJ1bikgIT0gMCkKKyNlbmRpZgorCXBlcnJvcl93aXRoX25hbWUgKGNoaWxkcGktPnBhdGhuYW1lKTsKKyAgICB9CisgIHJldHVybiAwOworfQorI2VuZGlmIC8qIFNZU19sd3BfY3JlYXRlICovCisKKy8qIEZvcmsgYW4gaW5mZXJpb3IgcHJvY2VzcywgYW5kIHN0YXJ0IGRlYnVnZ2luZyBpdCB3aXRoIC9wcm9jLiAgKi8KKworc3RhdGljIHZvaWQKK3Byb2Nmc19jcmVhdGVfaW5mZXJpb3IgKGV4ZWNfZmlsZSwgYWxsYXJncywgZW52KQorICAgICBjaGFyICpleGVjX2ZpbGU7CisgICAgIGNoYXIgKmFsbGFyZ3M7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGNoYXIgKnNoZWxsX2ZpbGUgPSBnZXRlbnYgKCJTSEVMTCIpOworICBjaGFyICp0cnluYW1lOworICBpZiAoc2hlbGxfZmlsZSAhPSBOVUxMICYmIHN0cmNociAoc2hlbGxfZmlsZSwgJy8nKSA9PSBOVUxMKQorICAgIHsKKworICAgICAgLyogV2Ugd2lsbCBiZSBsb29raW5nIGRvd24gdGhlIFBBVEggdG8gZmluZCBzaGVsbF9maWxlLiAgSWYgd2UKKwkganVzdCBkbyB0aGlzIHRoZSBub3JtYWwgd2F5ICh2aWEgZXhlY2xwLCB3aGljaCBvcGVyYXRlcyBieQorCSBhdHRlbXB0aW5nIGFuIGV4ZWMgZm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgUEFUSCB1bnRpbCBpdAorCSBmaW5kcyBvbmUgd2hpY2ggc3VjY2VlZHMpLCB0aGVuIHRoZXJlIHdpbGwgYmUgYW4gZXhlYyBmb3IKKwkgZWFjaCBmYWlsZWQgYXR0ZW1wdCwgZWFjaCBvZiB3aGljaCB3aWxsIGNhdXNlIGEgUFJfU1lTRVhJVAorCSBzdG9wLCBhbmQgd2Ugd29uJ3Qga25vdyBob3cgdG8gZGlzdGluZ3Vpc2ggdGhlIFBSX1NZU0VYSVQncworCSBmb3IgdGhlc2UgZmFpbGVkIGV4ZWNzIHdpdGggdGhlIG9uZXMgZm9yIHN1Y2Nlc3NmdWwgZXhlY3MKKwkgKHdoZXRoZXIgdGhlIGV4ZWMgaGFzIHN1Y2NlZWRlZCBpcyBzdG9yZWQgYXQgdGhhdCB0aW1lIGluIHRoZQorCSBjYXJyeSBiaXQgb3Igc29tZSBzdWNoIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBhbmQKKwkgbm9uLUFCSS1zcGVjaWZpZWQgcGxhY2UpLgorCisJIFNvIEkgY2FuJ3QgdGhpbmsgb2YgYW55dGhpbmcgYmV0dGVyIHRoYW4gdG8gc2VhcmNoIHRoZSBQQVRICisJIG5vdy4gIFRoaXMgaGFzIHNldmVyYWwgZGlzYWR2YW50YWdlczogKDEpIFRoZXJlIGlzIGEgcmFjZQorCSBjb25kaXRpb247IGlmIHdlIGZpbmQgYSBmaWxlIG5vdyBhbmQgaXQgaXMgZGVsZXRlZCBiZWZvcmUgd2UKKwkgZXhlYyBpdCwgd2UgbG9zZSwgZXZlbiBpZiB0aGUgZGVsZXRpb24gbGVhdmVzIGEgdmFsaWQgZmlsZQorCSBmdXJ0aGVyIGRvd24gaW4gdGhlIFBBVEgsICgyKSB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyBleGFjdGx5CisJIHdoYXQgYW4gZXhlY3V0YWJsZSAoaW4gdGhlIHNlbnNlIG9mICJjYXBhYmxlIG9mIGJlaW5nCisJIGV4ZWMnZCIpIGZpbGUgaXMuICBVc2luZyBhY2Nlc3MoKSBsb3NlcyBiZWNhdXNlIGl0IG1heSBsb3NlCisJIGlmIHRoZSBjYWxsZXIgaXMgdGhlIHN1cGVydXNlcjsgZmFpbGluZyB0byB1c2UgaXQgbG9zZXMgaWYKKwkgdGhlcmUgYXJlIEFDTHMgb3Igc29tZSBzdWNoLiAgKi8KKworICAgICAgY2hhciAqcDsKKyAgICAgIGNoYXIgKnAxOworICAgICAgLyogRklYTUUtbWF5YmU6IG1pZ2h0IHdhbnQgInNldCBwYXRoIiBjb21tYW5kIHNvIHVzZXIgY2FuIGNoYW5nZSB3aGF0CisJIHBhdGggaXMgdXNlZCBmcm9tIHdpdGhpbiBHREIuICAqLworICAgICAgY2hhciAqcGF0aCA9IGdldGVudiAoIlBBVEgiKTsKKyAgICAgIGludCBsZW47CisgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCisgICAgICBpZiAocGF0aCA9PSBOVUxMKQorCXBhdGggPSAiL2JpbjovdXNyL2JpbiI7CisKKyAgICAgIHRyeW5hbWUgPSBhbGxvY2EgKHN0cmxlbiAocGF0aCkgKyBzdHJsZW4gKHNoZWxsX2ZpbGUpICsgMik7CisgICAgICBmb3IgKHAgPSBwYXRoOyBwICE9IE5VTEw7IHAgPSBwMSA/IHAxICsgMTogTlVMTCkKKwl7CisJICBwMSA9IHN0cmNociAocCwgJzonKTsKKwkgIGlmIChwMSAhPSBOVUxMKQorCSAgICBsZW4gPSBwMSAtIHA7CisJICBlbHNlCisJICAgIGxlbiA9IHN0cmxlbiAocCk7CisJICBzdHJuY3B5ICh0cnluYW1lLCBwLCBsZW4pOworCSAgdHJ5bmFtZVtsZW5dID0gJ1wwJzsKKwkgIHN0cmNhdCAodHJ5bmFtZSwgIi8iKTsKKwkgIHN0cmNhdCAodHJ5bmFtZSwgc2hlbGxfZmlsZSk7CisJICBpZiAoYWNjZXNzICh0cnluYW1lLCBYX09LKSA8IDApCisJICAgIGNvbnRpbnVlOworCSAgaWYgKHN0YXQgKHRyeW5hbWUsICZzdGF0YnVmKSA8IDApCisJICAgIGNvbnRpbnVlOworCSAgaWYgKCFTX0lTUkVHIChzdGF0YnVmLnN0X21vZGUpKQorCSAgICAvKiBXZSBjZXJ0YWlubHkgbmVlZCB0byByZWplY3QgZGlyZWN0b3JpZXMuICBJJ20gbm90IHF1aXRlCisJICAgICAgIGFzIHN1cmUgYWJvdXQgRklGT3MsIHNvY2tldHMsIGV0Yy4sIGJ1dCBJIGtpbmQgb2YgZG91YnQKKwkgICAgICAgdGhhdCBwZW9wbGUgd2FudCB0byBleGVjKCkgdGhlc2UgdGhpbmdzLiAgKi8KKwkgICAgY29udGludWU7CisJICBicmVhazsKKwl9CisgICAgICBpZiAocCA9PSBOVUxMKQorCS8qIE5vdCBmb3VuZC4gIFRoaXMgbXVzdCBiZSBhbiBlcnJvciByYXRoZXIgdGhhbiBtZXJlbHkgcGFzc2luZworCSAgIHRoZSBmaWxlIHRvIGV4ZWNscCgpLCBiZWNhdXNlIGV4ZWNscCgpIHdvdWxkIHRyeSBhbGwgdGhlCisJICAgZXhlYygpcywgY2F1c2luZyBHREIgdG8gZ2V0IGNvbmZ1c2VkLiAgKi8KKwllcnJvciAoIkNhbid0IGZpbmQgc2hlbGwgJXMgaW4gUEFUSCIsIHNoZWxsX2ZpbGUpOworCisgICAgICBzaGVsbF9maWxlID0gdHJ5bmFtZTsKKyAgICB9CisKKyAgZm9ya19pbmZlcmlvciAoZXhlY19maWxlLCBhbGxhcmdzLCBlbnYsCisJCSBwcm9jX3NldF9leGVjX3RyYXAsIHByb2Nmc19pbml0X2luZmVyaW9yLCBOVUxMLCBzaGVsbF9maWxlKTsKKworICAvKiBXZSBhcmUgYXQgdGhlIGZpcnN0IGluc3RydWN0aW9uIHdlIGNhcmUgYWJvdXQuICAqLworICAvKiBQZWRhbCB0byB0aGUgbWV0YWwuLi4gKi8KKworICBwcm9jZWVkICgoQ09SRV9BRERSKSAtMSwgVEFSR0VUX1NJR05BTF8wLCAwKTsKK30KKworLyogQ2xlYW4gdXAgYWZ0ZXIgdGhlIGluZmVyaW9yIGRpZXMuICAqLworCitzdGF0aWMgdm9pZAorcHJvY2ZzX21vdXJuX2luZmVyaW9yICgpCit7CisgIHN0cnVjdCBwcm9jaW5mbyAqcGk7CisgIHN0cnVjdCBwcm9jaW5mbyAqbmV4dF9waTsKKworICBmb3IgKHBpID0gcHJvY2luZm9fbGlzdDsgcGk7IHBpID0gbmV4dF9waSkKKyAgICB7CisgICAgICBuZXh0X3BpID0gcGktPm5leHQ7CisgICAgICB1bmNvbmRpdGlvbmFsbHlfa2lsbF9pbmZlcmlvciAocGkpOworICAgIH0KKworICB1bnB1c2hfdGFyZ2V0ICgmcHJvY2ZzX29wcyk7CisgIGdlbmVyaWNfbW91cm5faW5mZXJpb3IgKCk7Cit9CisKKworLyogTWFyayBvdXIgdGFyZ2V0LXN0cnVjdCBhcyBlbGlnaWJsZSBmb3Igc3RyYXkgInJ1biIgYW5kICJhdHRhY2giIGNvbW1hbmRzLiAgKi8KK3N0YXRpYyBpbnQKK3Byb2Nmc19jYW5fcnVuICgpCit7CisgIC8qIFRoaXMgdmFyaWFibGUgaXMgY29udHJvbGxlZCBieSBtb2R1bGVzIHRoYXQgc2l0IGF0b3AgcHJvY2ZzIHRoYXQgbWF5IGxheWVyCisgICAgIHRoZWlyIG93biBwcm9jZXNzIHN0cnVjdHVyZSBhdG9wIHRoYXQgcHJvdmlkZWQgaGVyZS4gIHNvbC10aHJlYWQuYyBkb2VzCisgICAgIHRoaXMgYmVjYXVzZSBvZiB0aGUgU29sYXJpcyB0d28tbGV2ZWwgdGhyZWFkIG1vZGVsLiAgKi8KKworICByZXR1cm4gIXByb2Nmc19zdXBwcmVzc19ydW47Cit9CisjaWZkZWYgVEFSR0VUX0hBU19IQVJEV0FSRV9XQVRDSFBPSU5UUworI2lmbmRlZiBVTklYV0FSRQorDAorLyogSW5zZXJ0IGEgd2F0Y2hwb2ludCAqLworaW50Citwcm9jZnNfc2V0X3dhdGNocG9pbnQocGlkLCBhZGRyLCBsZW4sIHJ3KQorICAgICBpbnQJCXBpZDsKKyAgICAgQ09SRV9BRERSCQlhZGRyOworICAgICBpbnQJCWxlbjsKKyAgICAgaW50CQlydzsKK3sKKyAgc3RydWN0IHByb2NpbmZvCSpwaTsKKyAgcHJ3YXRjaF90CQl3cHQ7CisKKyAgcGkgPSBmaW5kX3Byb2NpbmZvIChwaWQgPT0gLTEgPyBpbmZlcmlvcl9waWQgOiBwaWQsIDApOworICB3cHQucHJfdmFkZHIgPSAoY2FkZHJfdClhZGRyOworICB3cHQucHJfc2l6ZSA9IGxlbjsKKyAgd3B0LnByX3dmbGFncyA9ICgocncgJiAxKSA/IE1BX1JFQUQgOiAwKSB8ICgocncgJiAyKSA/IE1BX1dSSVRFIDogMCk7CisgIGlmIChpb2N0bCAocGktPmN0bF9mZCwgUElPQ1NXQVRDSCwgJndwdCkgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFMkJJRykKKwlyZXR1cm4gLTE7CisgICAgICAvKiBDdXJyZW50bHkgaXQgc29tZXRpbWVzIGhhcHBlbnMgdGhhdCB0aGUgc2FtZSB3YXRjaHBvaW50IGdldHMKKwkgZGVsZXRlZCB0d2ljZSAtIGRvbid0IGRpZSBpbiB0aGlzIGNhc2UgKEZJWE1FIHBsZWFzZSkgKi8KKyAgICAgIGlmIChlcnJubyA9PSBFU1JDSCAmJiBsZW4gPT0gMCkKKwlyZXR1cm4gMDsKKyAgICAgIHByaW50X3N5c19lcnJtc2cgKHBpLT5wYXRobmFtZSwgZXJybm8pOworICAgICAgZXJyb3IgKCJQSU9DU1dBVENIIGZhaWxlZCIpOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludAorcHJvY2ZzX3N0b3BwZWRfYnlfd2F0Y2hwb2ludChwaWQpCisgICAgaW50CQkJcGlkOworeworICBzdHJ1Y3QgcHJvY2luZm8JKnBpOworICBzaG9ydCAJCXdoYXQ7CisgIHNob3J0IAkJd2h5OworCisgIHBpID0gZmluZF9wcm9jaW5mbyAocGlkID09IC0xID8gaW5mZXJpb3JfcGlkIDogcGlkLCAwKTsKKyAgaWYgKHBpLT5wcnN0YXR1cy5wcl9mbGFncyAmIChQUl9TVE9QUEVEIHwgUFJfSVNUT1ApKQorICAgIHsKKyAgICAgIHdoeSA9IHBpLT5wcnN0YXR1cy5wcl93aHk7CisgICAgICB3aGF0ID0gcGktPnByc3RhdHVzLnByX3doYXQ7CisgICAgICBpZiAod2h5ID09IFBSX0ZBVUxURUQgCisjaWYgZGVmaW5lZCAoRkxUV0FUQ0gpICYmIGRlZmluZWQgKEZMVEtXQVRDSCkKKwkgICYmICh3aGF0ID09IEZMVFdBVENIIHx8IHdoYXQgPT0gRkxUS1dBVENIKQorI2Vsc2UKKyNpZmRlZiBGTFRXQVRDSAorCSAgJiYgKHdoYXQgPT0gRkxUV0FUQ0gpIAorI2VuZGlmCisjaWZkZWYgRkxUS1dBVENICisJICAmJiAod2hhdCA9PSBGTFRLV0FUQ0gpCisjZW5kaWYKKyNlbmRpZgorCSAgKQorCXJldHVybiB3aGF0OworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogIVVOSVhXQVJFICovCisjZW5kaWYgLyogVEFSR0VUX0hBU19IQVJEV0FSRV9XQVRDSFBPSU5UUyAqLworCisvKiBXaHkgaXMgdGhpcyBuZWNlc3Nhcnk/ICBTaG91bGRuJ3QgZGVhZCB0aHJlYWRzIGp1c3QgYmUgcmVtb3ZlZCBmcm9tIHRoZQorICAgdGhyZWFkIGRhdGFiYXNlPyAgKi8KKworc3RhdGljIGludAorcHJvY2ZzX3RocmVhZF9hbGl2ZSAocGlkKQorICAgICBpbnQgcGlkOworeworICBzdHJ1Y3QgcHJvY2luZm8gKnBpLCAqbmV4dF9waTsKKworICBmb3IgKHBpID0gcHJvY2luZm9fbGlzdDsgcGk7IHBpID0gbmV4dF9waSkKKyAgICB7CisgICAgICBuZXh0X3BpID0gcGktPm5leHQ7CisgICAgICBpZiAocGkgLT4gcGlkID09IHBpZCkKKwlpZiAocHJvY2ZzX3JlYWRfc3RhdHVzIChwaSkpCS8qIGFsaXZlICovCisJICByZXR1cm4gMTsKKwllbHNlCQkJCS8qIGRlZnVuY3QgKGV4aXRlZCkgKi8KKwkgIHsKKwkgICAgY2xvc2VfcHJvY19maWxlIChwaSk7CisJICAgIHJldHVybiAwOworCSAgfQorICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludAorcHJvY2ZzX2ZpcnN0X2F2YWlsYWJsZSAoKQoreworICBzdHJ1Y3QgcHJvY2luZm8gKnBpOworCisgIGZvciAocGkgPSBwcm9jaW5mb19saXN0OyBwaTsgcGkgPSBwaS0+bmV4dCkKKyAgICB7CisgICAgICBpZiAocHJvY2ZzX3JlYWRfc3RhdHVzIChwaSkpCisJcmV0dXJuIHBpLT5waWQ7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKK2ludAorcHJvY2ZzX2dldF9waWRfZmQgKHBpZCkKKyAgICAgaW50IHBpZDsKK3sKKyAgc3RydWN0IHByb2NpbmZvICpwaSA9IGZpbmRfcHJvY2luZm8gKHBpZCwgMSk7CisKKyAgaWYgKHBpID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiBwaS0+Y3RsX2ZkOworfQorCisvKiBTZW5kIGEgU0lHSU5UIHRvIHRoZSBwcm9jZXNzIGdyb3VwLiAgVGhpcyBhY3RzIGp1c3QgbGlrZSB0aGUgdXNlciB0eXBlZCBhCisgICBeQyBvbiB0aGUgY29udHJvbGxpbmcgdGVybWluYWwuCisKKyAgIFhYWCAtIFRoaXMgbWF5IG5vdCBiZSBjb3JyZWN0IGZvciBhbGwgc3lzdGVtcy4gIFNvbWUgbWF5IHdhbnQgdG8gdXNlCisgICBraWxscGcoKSBpbnN0ZWFkIG9mIGtpbGwgKC1wZ3JwKS4gKi8KKworc3RhdGljIHZvaWQKK3Byb2Nmc19zdG9wICgpCit7CisgIGV4dGVybiBwaWRfdCBpbmZlcmlvcl9wcm9jZXNzX2dyb3VwOworCisgIGtpbGwgKC1pbmZlcmlvcl9wcm9jZXNzX2dyb3VwLCBTSUdJTlQpOworfQorDAorLyogQ29udmVydCBhIHBpZCB0byBwcmludGFibGUgZm9ybS4gKi8KKworI2lmZGVmIFRJREdFVAorY2hhciAqCitwcm9jZnNfcGlkX3RvX3N0ciAocGlkKQorICAgICBpbnQgcGlkOworeworICBzdGF0aWMgY2hhciBidWZbMTAwXTsKKworICBzcHJpbnRmIChidWYsICJLZXJuZWwgdGhyZWFkICVkIiwgVElER0VUIChwaWQpKTsKKworICByZXR1cm4gYnVmOworfQorI2VuZGlmIC8qIFRJREdFVCAqLworCisMCitzdGF0aWMgdm9pZAoraW5pdF9wcm9jZnNfb3BzICgpCit7CisgIHByb2Nmc19vcHMudG9fc2hvcnRuYW1lID0gInByb2NmcyI7CisgIHByb2Nmc19vcHMudG9fbG9uZ25hbWUgPSAiVW5peCAvcHJvYyBjaGlsZCBwcm9jZXNzIjsKKyAgcHJvY2ZzX29wcy50b19kb2MgPSAiVW5peCAvcHJvYyBjaGlsZCBwcm9jZXNzIChzdGFydGVkIGJ5IHRoZSBcInJ1blwiIGNvbW1hbmQpLiI7CisgIHByb2Nmc19vcHMudG9fb3BlbiA9IHByb2Nmc19vcGVuOworICBwcm9jZnNfb3BzLnRvX2F0dGFjaCA9IHByb2Nmc19hdHRhY2g7CisgIHByb2Nmc19vcHMudG9fZGV0YWNoID0gcHJvY2ZzX2RldGFjaDsKKyAgcHJvY2ZzX29wcy50b19yZXN1bWUgPSBwcm9jZnNfcmVzdW1lOworICBwcm9jZnNfb3BzLnRvX3dhaXQgPSBwcm9jZnNfd2FpdDsKKyAgcHJvY2ZzX29wcy50b19mZXRjaF9yZWdpc3RlcnMgPSBwcm9jZnNfZmV0Y2hfcmVnaXN0ZXJzOworICBwcm9jZnNfb3BzLnRvX3N0b3JlX3JlZ2lzdGVycyA9IHByb2Nmc19zdG9yZV9yZWdpc3RlcnM7CisgIHByb2Nmc19vcHMudG9fcHJlcGFyZV90b19zdG9yZSA9IHByb2Nmc19wcmVwYXJlX3RvX3N0b3JlOworICBwcm9jZnNfb3BzLnRvX3hmZXJfbWVtb3J5ID0gcHJvY2ZzX3hmZXJfbWVtb3J5OworICBwcm9jZnNfb3BzLnRvX2ZpbGVzX2luZm8gPSBwcm9jZnNfZmlsZXNfaW5mbzsKKyAgcHJvY2ZzX29wcy50b19pbnNlcnRfYnJlYWtwb2ludCA9IG1lbW9yeV9pbnNlcnRfYnJlYWtwb2ludDsKKyAgcHJvY2ZzX29wcy50b19yZW1vdmVfYnJlYWtwb2ludCA9IG1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludDsKKyAgcHJvY2ZzX29wcy50b190ZXJtaW5hbF9pbml0ID0gdGVybWluYWxfaW5pdF9pbmZlcmlvcjsKKyAgcHJvY2ZzX29wcy50b190ZXJtaW5hbF9pbmZlcmlvciA9IHRlcm1pbmFsX2luZmVyaW9yOworICBwcm9jZnNfb3BzLnRvX3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCA9IHRlcm1pbmFsX291cnNfZm9yX291dHB1dDsKKyAgcHJvY2ZzX29wcy50b190ZXJtaW5hbF9vdXJzID0gdGVybWluYWxfb3VyczsKKyAgcHJvY2ZzX29wcy50b190ZXJtaW5hbF9pbmZvID0gY2hpbGRfdGVybWluYWxfaW5mbzsKKyAgcHJvY2ZzX29wcy50b19raWxsID0gcHJvY2ZzX2tpbGxfaW5mZXJpb3I7CisgIHByb2Nmc19vcHMudG9fY3JlYXRlX2luZmVyaW9yID0gcHJvY2ZzX2NyZWF0ZV9pbmZlcmlvcjsKKyAgcHJvY2ZzX29wcy50b19tb3Vybl9pbmZlcmlvciA9IHByb2Nmc19tb3Vybl9pbmZlcmlvcjsKKyAgcHJvY2ZzX29wcy50b19jYW5fcnVuID0gcHJvY2ZzX2Nhbl9ydW47CisgIHByb2Nmc19vcHMudG9fbm90aWNlX3NpZ25hbHMgPSBwcm9jZnNfbm90aWNlX3NpZ25hbHM7CisgIHByb2Nmc19vcHMudG9fdGhyZWFkX2FsaXZlID0gcHJvY2ZzX3RocmVhZF9hbGl2ZTsKKyAgcHJvY2ZzX29wcy50b19zdG9wID0gcHJvY2ZzX3N0b3A7CisgIHByb2Nmc19vcHMudG9fc3RyYXR1bSA9IHByb2Nlc3Nfc3RyYXR1bTsKKyAgcHJvY2ZzX29wcy50b19oYXNfYWxsX21lbW9yeSA9IDE7CisgIHByb2Nmc19vcHMudG9faGFzX21lbW9yeSA9IDE7CisgIHByb2Nmc19vcHMudG9faGFzX3N0YWNrID0gMTsKKyAgcHJvY2ZzX29wcy50b19oYXNfcmVnaXN0ZXJzID0gMTsKKyAgcHJvY2ZzX29wcy50b19oYXNfZXhlY3V0aW9uID0gMTsKKyAgcHJvY2ZzX29wcy50b19tYWdpYyA9IE9QU19NQUdJQzsKK30KKwordm9pZAorX2luaXRpYWxpemVfcHJvY2ZzICgpCit7CisjaWZkZWYgSEFWRV9PUFRJT05BTF9QUk9DX0ZTCisgIGNoYXIgcHJvY25hbWVbTUFYX1BST0NfTkFNRV9TSVpFXTsKKyAgaW50IGZkOworCisgIC8qIElmIHdlIGhhdmUgYW4gb3B0aW9uYWwgL3Byb2MgZmlsZXN5c3RlbSAoZS5nLiB1bmRlciBPU0YvMSksCisgICAgIGRvbid0IGFkZCBwcm9jZnMgc3VwcG9ydCBpZiB3ZSBjYW5ub3QgYWNjZXNzIHRoZSBydW5uaW5nCisgICAgIEdEQiB2aWEgL3Byb2MuICAqLworICBzcHJpbnRmIChwcm9jbmFtZSwgU1RBVFVTX1BST0NfTkFNRV9GTVQsIGdldHBpZCAoKSk7CisgIGlmICgoZmQgPSBvcGVuIChwcm9jbmFtZSwgT19SRE9OTFkpKSA8IDApCisgICAgcmV0dXJuOworICBjbG9zZSAoZmQpOworI2VuZGlmCisKKyAgaW5pdF9wcm9jZnNfb3BzICgpOworICBhZGRfdGFyZ2V0ICgmcHJvY2ZzX29wcyk7CisKKyAgYWRkX2luZm8gKCJwcm9jZXNzZXMiLCBpbmZvX3Byb2MsIAorIlNob3cgcHJvY2VzcyBzdGF0dXMgaW5mb3JtYXRpb24gdXNpbmcgL3Byb2MgZW50cnkuXG5cCitTcGVjaWZ5IHByb2Nlc3MgaWQgb3IgdXNlIGN1cnJlbnQgaW5mZXJpb3IgYnkgZGVmYXVsdC5cblwKK1NwZWNpZnkga2V5d29yZHMgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uOyBkZWZhdWx0IGlzIHN1bW1hcnkuXG5cCitLZXl3b3JkcyBhcmU6IGBhbGwnLCBgZmF1bHRzJywgYGZsYWdzJywgYGlkJywgYG1hcHBpbmdzJywgYHNpZ25hbHMnLFxuXAorYHN0YXR1cycsIGBzeXNjYWxscycsIGFuZCBgdGltZXMnLlxuXAorVW5hbWJpZ3VvdXMgYWJicmV2aWF0aW9ucyBtYXkgYmUgdXNlZC4iKTsKKworICBpbml0X3N5c2NhbGxfdGFibGUgKCk7Cit9CmRpZmYgLS1naXQgYS9nZGIvcHR4NC1uYXQuYyBiL2dkYi9wdHg0LW5hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NGI3OTkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcHR4NC1uYXQuYwpAQCAtMCwwICsxLDIwOSBAQAorLyogTmF0aXZlLWRlcGVuZGVudCBjb2RlIGZvciBwdHggNC4wCisgICBDb3B5cmlnaHQgMTk4OCwgMTk4OSwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworLyogIEdpdmVuIGEgcG9pbnRlciB0byBhIGdlbmVyYWwgcmVnaXN0ZXIgc2V0IGluIC9wcm9jIGZvcm1hdCAoZ3JlZ3NldF90ICopLAorICAgIHVucGFjayB0aGUgcmVnaXN0ZXIgY29udGVudHMgYW5kIHN1cHBseSB0aGVtIGFzIGdkYidzIGlkZWEgb2YgdGhlIGN1cnJlbnQKKyAgICByZWdpc3RlciB2YWx1ZXMuICovCisKK3ZvaWQKK3N1cHBseV9ncmVnc2V0IChncmVnc2V0cCkKKyAgICAgZ3JlZ3NldF90ICpncmVnc2V0cDsKK3sKKwlzdXBwbHlfcmVnaXN0ZXIoRUFYX1JFR05VTSwgKGNoYXIgKikmKCpncmVnc2V0cClbRUFYXSk7CisJc3VwcGx5X3JlZ2lzdGVyKEVEWF9SRUdOVU0sIChjaGFyICopJigqZ3JlZ3NldHApW0VEWF0pOworCXN1cHBseV9yZWdpc3RlcihFQ1hfUkVHTlVNLCAoY2hhciAqKSYoKmdyZWdzZXRwKVtFQ1hdKTsKKwlzdXBwbHlfcmVnaXN0ZXIoRUJYX1JFR05VTSwgKGNoYXIgKikmKCpncmVnc2V0cClbRUJYXSk7CisJc3VwcGx5X3JlZ2lzdGVyKEVTSV9SRUdOVU0sIChjaGFyICopJigqZ3JlZ3NldHApW0VTSV0pOworCXN1cHBseV9yZWdpc3RlcihFRElfUkVHTlVNLCAoY2hhciAqKSYoKmdyZWdzZXRwKVtFREldKTsKKwlzdXBwbHlfcmVnaXN0ZXIoRVNQX1JFR05VTSwgKGNoYXIgKikmKCpncmVnc2V0cClbVUVTUF0pOworCXN1cHBseV9yZWdpc3RlcihFQlBfUkVHTlVNLCAoY2hhciAqKSYoKmdyZWdzZXRwKVtFQlBdKTsKKwlzdXBwbHlfcmVnaXN0ZXIoRUlQX1JFR05VTSwgKGNoYXIgKikmKCpncmVnc2V0cClbRUlQXSk7CisJc3VwcGx5X3JlZ2lzdGVyKEVGTEFHU19SRUdOVU0sIChjaGFyICopJigqZ3JlZ3NldHApW0VGTF0pOworfQorCit2b2lkCitmaWxsX2dyZWdzZXQgKGdyZWdzZXRwLCByZWdubykKKyAgICAgZ3JlZ3NldF90ICpncmVnc2V0cDsKKyAgICAgaW50IHJlZ25vOworeworICBpbnQgcmVnaTsKKyAgZXh0ZXJuIGNoYXIgcmVnaXN0ZXJzW107CisKKyAgZm9yIChyZWdpID0gMCA7IHJlZ2kgPCBOVU1fUkVHUyA7IHJlZ2krKykKKyAgICB7CisgICAgICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gcmVnaSkpCisJeworCSAgKCpncmVnc2V0cClbcmVnaV0gPSAqKGdyZWdfdCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnaSldOworCX0KKyAgICB9Cit9CisKKyNpZiBkZWZpbmVkIChGUDBfUkVHTlVNKQorCisvKiAgR2l2ZW4gYSBwb2ludGVyIHRvIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgc2V0IGluIC9wcm9jIGZvcm1hdAorICAgIChmcHJlZ3NldF90ICopLCB1bnBhY2sgdGhlIHJlZ2lzdGVyIGNvbnRlbnRzIGFuZCBzdXBwbHkgdGhlbSBhcyBnZGIncworICAgIGlkZWEgb2YgdGhlIGN1cnJlbnQgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgdmFsdWVzLiAqLworCit2b2lkIAorc3VwcGx5X2ZwcmVnc2V0IChmcHJlZ3NldHApCisgICAgIGZwcmVnc2V0X3QgKmZwcmVnc2V0cDsKK3sKKyAgc3VwcGx5X2ZwdV9yZWdpc3RlcnMoKHN0cnVjdCBmcHVzYXZlICopJmZwcmVnc2V0cC0+ZnBfcmVnX3NldCk7CisgIHN1cHBseV9mcGFfcmVnaXN0ZXJzKChzdHJ1Y3QgZnBhc2F2ZSAqKSZmcHJlZ3NldHAtPmZfd3JlZ3MpOworfQorCisvKiAgR2l2ZW4gYSBwb2ludGVyIHRvIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgc2V0IGluIC9wcm9jIGZvcm1hdAorICAgIChmcHJlZ3NldF90ICopLCB1cGRhdGUgdGhlIHJlZ2lzdGVyIHNwZWNpZmllZCBieSBSRUdOTyBmcm9tIGdkYidzIGlkZWEKKyAgICBvZiB0aGUgY3VycmVudCBmbG9hdGluZyBwb2ludCByZWdpc3RlciBzZXQuICBJZiBSRUdOTyBpcyAtMSwgdXBkYXRlCisgICAgdGhlbSBhbGwuICovCisKK3ZvaWQKK2ZpbGxfZnByZWdzZXQgKGZwcmVnc2V0cCwgcmVnbm8pCisgICAgIGZwcmVnc2V0X3QgKmZwcmVnc2V0cDsKKyAgICAgaW50IHJlZ25vOworeworICBpbnQgcmVnaTsKKyAgY2hhciAqdG87CisgIGNoYXIgKmZyb207CisgIGV4dGVybiBjaGFyIHJlZ2lzdGVyc1tdOworCisgIC8qIEZJWE1FOiBzZWUgbTY4ay10ZGVwLmMgZm9yIGFuIGV4YW1wbGUsIGZvciB0aGUgbTY4ay4gKi8KK30KKworI2VuZGlmCS8qIGRlZmluZWQgKEZQMF9SRUdOVU0pICovCisKKy8qCisgKiBUaGlzIGRvZXNuJ3QgcXVpdGUgZG8gdGhlIHNhbWUgdGhpbmcgYXMgdGhlIHByb2Nmcy5jIHZlcnNpb24sIGJ1dCBnaXZlCisgKiBpdCB0aGUgc2FtZSBuYW1lIHNvIHdlIGRvbid0IGhhdmUgdG8gcHV0IGFuIGlmZGVmIGluIHNvbGliLmMuCisgKi8KKy8qIHRoaXMgY291bGQgdXNlIGVsZl9pbnRlcnByZXRlcigpIGZyb20gZWxmcmVhZC5jICovCitpbnQKK3Byb2NfaXRlcmF0ZV9vdmVyX21hcHBpbmdzKGZ1bmMpCisJaW50ICgqZnVuYykgUEFSQU1TICgoaW50LCBDT1JFX0FERFIpKTsKK3sKKwl2YWRkcl90IGN1cnNlZywgbWVtcHRyOworCXB0X3ZzZWdfdCBwdjsKKwlpbnQgcnYsIGNtcGVycjsKKwlzZWNfcHRyIGludGVycF9zZWM7CisJY2hhciAqaW50ZXJwX2NvbnRlbnQ7CisJaW50IGludGVycF9mZCwgZnVuY3N0YXQ7CisJdW5zaWduZWQgaW50IHNpemU7CisJY2hhciBidWYxW05CUEddLCBidWYyW05CUEddOworCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGlzIHJlYWxseSB2aWxlLiAgV2UgY2FuIGdldCB0aGUgbmFtZSBvZiB0aGUKKwkgKiBzaGFyZWQgbGlicmFyeSBmcm9tIHRoZSBleGVjX2JmZCwgYW5kIHdlIGNhbiBnZXQgYSBsaXN0IG9mCisJICogZWFjaCB2aXJ0dWFsIG1lbW9yeSBzZWdtZW50LCBidXQgdGhlcmUgaXMgbm8gc2ltcGxlIHdheSB0bworCSAqIGZpbmQgdGhlIG1hcHBlZCBzZWdtZW50IGZyb20gdGhlIHNoYXJlZCBsaWJyYXJ5IChhbGEKKwkgKiBwcm9jZnMncyBQSU9DT1BFTk1FTSkuICBBcyBhIHByZXR0eSBuYXN0eSBrbHVkZ2UsIHdlCisJICogY29tcGFyZSB0aGUgdmlydHVhbCBtZW1vcnkgc2VnbWVudCB0byB0aGUgY29udGVudHMgb2YgdGhlCisJICogLmludGVycCBmaWxlLiAgSWYgdGhleSBtYXRjaCwgd2UgYXNzdW1lIHRoYXQgd2UndmUgZ290IHRoZQorCSAqIHJpZ2h0IG9uZS4KKwkgKi8KKworCS8qCisJICogVE9ETzogZm9yIGF0dGFjaCwgdXNlIFhQVF9PUEVOVCB0byBnZXQgdGhlIGV4ZWN1dGFibGUsIGluCisJICogY2FzZSB3ZSdyZSBhdHRhY2hlZCB3aXRob3V0IGtub3duaW5nIHRoZSBleGVjdXRhYmxlJ3MKKwkgKiBmaWxlbmFtZS4KKwkgKi8KKworI2lmZGVmIFZFUkJPU0VfREVCVUcKKwlwcmludGYoInByb2NfaXRlclxuIik7CisjZW5kaWYKKwlpbnRlcnBfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUoZXhlY19iZmQsICIuaW50ZXJwIik7CisJaWYgKCFpbnRlcnBfc2VjKSB7CisJCXJldHVybiAwOworCX0KKworCXNpemUgPSBiZmRfc2VjdGlvbl9zaXplKGV4ZWNfYmZkLCBpbnRlcnBfc2VjKTsKKwlpbnRlcnBfY29udGVudCA9IGFsbG9jYShzaXplKTsKKwlpZiAoMCA9PSBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMoZXhlY19iZmQsIGludGVycF9zZWMsCisJCWludGVycF9jb250ZW50LCAoZmlsZV9wdHIpMCwgc2l6ZSkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisjaWZkZWYgVkVSQk9TRV9ERUJVRworCXByaW50ZigicHJvY19pdGVyOiBcIiVzXCJcbiIsIGludGVycF9jb250ZW50KTsKKyNlbmRpZgorCWludGVycF9mZCA9IG9wZW4oaW50ZXJwX2NvbnRlbnQsIE9fUkRPTkxZLCAwKTsKKwlpZiAoLTEgPT0gaW50ZXJwX2ZkKSB7CisJCXJldHVybiAwOworCX0KKworCWN1cnNlZyA9IDA7CisJd2hpbGUgKDEpIHsKKwkJcnYgPSBwdHJhY2UoUFRfTkVYVF9WU0VHLCBpbmZlcmlvcl9waWQsICZwdiwgY3Vyc2VnKTsKKyNpZmRlZiBWRVJCT1NFX0RFQlVHCisJCXByaW50ZigiUFRfTkVYVF9WU0VHOiBydiAlZCBlcnJubyAlZFxuIiwgcnYsIGVycm5vKTsKKyNlbmRpZgorCQlpZiAoLTEgPT0gcnYpCisJCQlicmVhazsKKwkJaWYgKDAgPT0gcnYpCisJCQlicmVhazsKKyNpZmRlZiBWRVJCT1NFX0RFQlVHCisJCXByaW50ZigicHYucHZfc3RhcnQgMHgleCBwdl9zaXplIDB4JXggcHZfcHJvdCAweCV4XG4iLAorCQkgICAgICAgcHYucHZfc3RhcnQsIHB2LnB2X3NpemUsIHB2LnB2X3Byb3QpOworI2VuZGlmCisJCWN1cnNlZyA9IHB2LnB2X3N0YXJ0ICsgcHYucHZfc2l6ZTsKKworCQlydiA9IGxzZWVrKGludGVycF9mZCwgMCwgU0VFS19TRVQpOworCQlpZiAoLTEgPT0gcnYpIHsKKwkJCXBlcnJvcigibHNlZWsiKTsKKwkJCWNsb3NlKGludGVycF9mZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlmb3IgKG1lbXB0ciA9IHB2LnB2X3N0YXJ0OyBtZW1wdHIgPCBwdi5wdl9zdGFydCArIHB2LnB2X3NpemU7CisJCSAgICAgbWVtcHRyICs9IE5CUEcpIHsKKyNpZmRlZiBWRVJCT1NFX0RFQlVHCisJCQlwcmludGYoIm1lbXB0ciAweCV4XG4iLCBtZW1wdHIpOworI2VuZGlmCisJCQlydiA9IHJlYWQoaW50ZXJwX2ZkLCBidWYxLCBOQlBHKTsKKwkJCWlmICgtMSA9PSBydikgeworCQkJCXBlcnJvcigicmVhZCIpOworCQkJCWNsb3NlKGludGVycF9mZCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlydiA9IHB0cmFjZShQVF9SREFUQV9QQUdFLCBpbmZlcmlvcl9waWQsIGJ1ZjIsCisJCQkJICAgIG1lbXB0cik7CisJCQlpZiAoLTEgPT0gcnYpIHsKKwkJCQlwZXJyb3IoInB0cmFjZSIpOworCQkJCWNsb3NlKGludGVycF9mZCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQljbXBlcnIgPSBtZW1jbXAoYnVmMSwgYnVmMiwgTkJQRyk7CisJCQlpZiAoY21wZXJyKQorCQkJCWJyZWFrOworCQl9CisJCWlmICgwID09IGNtcGVycikgeworCQkJLyogdGhpcyBpcyBpdCAqLworCQkJZnVuY3N0YXQgPSAoKmZ1bmMpKGludGVycF9mZCwgcHYucHZfc3RhcnQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJY2xvc2UoaW50ZXJwX2ZkKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dkYi9weXItdGRlcC5jIGIvZ2RiL3B5ci10ZGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVlOWEwNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9weXItdGRlcC5jCkBAIC0wLDAgKzEsNDUyIEBACisvKiBQeXJhbWlkIHRhcmdldC1kZXBlbmRlbnQgY29kZSBmb3IgR0RCLgorICAgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisKKy8qKiogUHJldHRpZXIgcmVnaXN0ZXIgcHJpbnRpbmcuICoqKi8KKworLyogUHJpbnQgcmVnaXN0ZXJzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyBweXJhbWlkJ3MgZGJ4LCBhZGIsIHNkYi4gICovCitweXJfcHJpbnRfcmVnaXN0ZXJzKHJlZ19idWYsIHJlZ251bSkKKyAgICBsb25nICpyZWdfYnVmW107Cit7CisgIHJlZ2lzdGVyIGludCByZWdubzsKKyAgaW50IHVzcCwga3NwOworICBzdHJ1Y3QgdXNlciB1OworCisgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IDE2OyByZWdubysrKSB7CisgICAgcHJpbnRmX3VuZmlsdGVyZWQvKl9maWx0ZXJlZCovICgiJTYuNnM6ICU4eCAgJTYuNnM6ICU4eCAgJTZzOiAlOHggICU2czogJTh4XG4iLAorCQkgICAgIFJFR0lTVEVSX05BTUUgKHJlZ25vKSwgcmVnX2J1ZltyZWdub10sCisJCSAgICAgUkVHSVNURVJfTkFNRSAocmVnbm8rMTYpLCByZWdfYnVmW3JlZ25vKzE2XSwKKwkJICAgICBSRUdJU1RFUl9OQU1FIChyZWdubyszMiksIHJlZ19idWZbcmVnbm8rMzJdLAorCQkgICAgIFJFR0lTVEVSX05BTUUgKHJlZ25vKzQ4KSwgcmVnX2J1ZltyZWdubys0OF0pOworICB9CisgIHVzcCA9IHB0cmFjZSAoMywgaW5mZXJpb3JfcGlkLAorCQkoUFRSQUNFX0FSRzNfVFlQRSkgKChjaGFyICopJnUudV9wY2IucGNiX3VzcCkgLQorCQkoKGNoYXIgKikmdSksIDApOworICBrc3AgPSBwdHJhY2UgKDMsIGluZmVyaW9yX3BpZCwKKwkJKFBUUkFDRV9BUkczX1RZUEUpICgoY2hhciAqKSZ1LnVfcGNiLnBjYl9rc3ApIC0KKwkJKChjaGFyICopJnUpLCAwKTsKKyAgcHJpbnRmX3VuZmlsdGVyZWQvKl9maWx0ZXJlZCovICgiXG4lNi42czogJTh4ICAlNi42czogJTh4ICglMDh4KSAlNi42cyAlOHhcbiIsCisJCSAgIFJFR0lTVEVSX05BTUUgKENTUF9SRUdOVU0pLHJlZ19idWZbQ1NQX1JFR05VTV0sCisJCSAgIFJFR0lTVEVSX05BTUUgKEtTUF9SRUdOVU0pLCByZWdfYnVmW0tTUF9SRUdOVU1dLCBrc3AsCisJCSAgICJ1c3AiLCB1c3ApOworfQorCisvKiBQcmludCB0aGUgcmVnaXN0ZXIgcmVnbnVtLCBvciBhbGwgcmVnaXN0ZXJzIGlmIHJlZ251bSBpcyAtMS4KKyAgIGZwcmVncyBpcyBjdXJyZW50bHkgaWdub3JlZC4gICovCisKK3B5cl9kb19yZWdpc3RlcnNfaW5mbyAocmVnbnVtLCBmcHJlZ3MpCisgICAgaW50IHJlZ251bTsKKyAgICBpbnQgZnByZWdzOworeworICAvKiBPbiBhIHB5ciwgd2Uga25vdyBhIHZpcnR1YWwgcmVnaXN0ZXIgY2FuIGFsd2F5cyBmaXQgaW4gYW4gbG9uZy4KKyAgICAgSGVyZSAoYW5kIGVsc2V3aGVyZSkgd2UgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhhdC4gIFl1ay4gICovCisgIGxvbmcgcmF3X3JlZ3NbTUFYX1JFR0lTVEVSX1JBV19TSVpFKk5VTV9SRUdTXTsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIAorICBmb3IgKGkgPSAwIDsgaSA8IDY0IDsgaSsrKSB7CisgICAgcmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMoaSwgcmF3X3JlZ3MraSk7CisgIH0KKyAgaWYgKHJlZ251bSA9PSAtMSkKKyAgICBweXJfcHJpbnRfcmVnaXN0ZXJzIChyYXdfcmVncywgcmVnbnVtKTsKKyAgZWxzZQorICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUkVHUzsgaSsrKQorICAgICAgaWYgKGkgPT0gcmVnbnVtKSB7CisJbG9uZyB2YWwgPSByYXdfcmVnc1tpXTsKKwkKKwlmcHV0c19maWx0ZXJlZCAoUkVHSVNURVJfTkFNRSAoaSksIGdkYl9zdGRvdXQpOworCXByaW50Zl9maWx0ZXJlZCgiOiIpOworCXByaW50X3NwYWNlc19maWx0ZXJlZCAoNiAtIHN0cmxlbiAoUkVHSVNURVJfTkFNRSAoaSkpLCBnZGJfc3Rkb3V0KTsKKwlpZiAodmFsID09IDApCisJICBwcmludGZfZmlsdGVyZWQgKCIwIik7CisJZWxzZQorCSAgcHJpbnRmX2ZpbHRlcmVkICgiJXMgICVkIiwgbG9jYWxfaGV4X3N0cmluZ19jdXN0b20odmFsLCIwOCIpLCB2YWwpOworCXByaW50Zl9maWx0ZXJlZCgiXG4iKTsKKyAgICAgIH0KK30KKwwKKy8qKiogRGVidWdnaW5nIGVkaXRpb25zIG9mIHZhcmlvdXMgbWFjcm9zIGZyb20gbS1weXIuaCAqKioqLworCitDT1JFX0FERFIgZnJhbWVfbG9jYWxzX2FkZHJlc3MgKGZyYW1lKQorICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgcmVnaXN0ZXIgaW50IGFkZHIgPSBmaW5kX3NhdmVkX3JlZ2lzdGVyIChmcmFtZSxDRlBfUkVHTlVNKTsKKyAgcmVnaXN0ZXIgaW50IHJlc3VsdCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKGFkZHIsIDQpOworI2lmZGVmIFBZUkFNSURfQ09OVFJPTF9GUkFNRV9ERUJVR0dJTkcKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLAorCSAgICJcdFtbLi5mcmFtZV9sb2NhbHM6JTh4LCAlcz0gJXggQCV4IGZjZnA9ICV4IGZvbz0gJXhcblx0IGdyMTM9JXggcHIxMz0leCB0cjEzPSV4IEAleF1dXG4iLAorCSAgIGZyYW1lLT5mcmFtZSwKKwkgICBSRUdJU1RFUl9OQU1FIChDRlBfUkVHTlVNKSwKKwkgICByZXN1bHQsIGFkZHIsCisJICAgZnJhbWUtPmZyYW1lX2NmcCwgKENGUF9SRUdOVU0pLAorCisKKwkgICByZWFkX3JlZ2lzdGVyKDEzKSwgcmVhZF9yZWdpc3RlcigyOSksIHJlYWRfcmVnaXN0ZXIoNjEpLAorCSAgIGZpbmRfc2F2ZWRfcmVnaXN0ZXIoZnJhbWUsIDYxKSk7CisjZW5kaWYgLyogUFlSQU1JRF9DT05UUk9MX0ZSQU1FX0RFQlVHR0lORyAqLworCisgIC8qIEZJWE1FOiBJIHRob3VnaHQgcmVhZF9yZWdpc3RlciAoQ0ZQX1JFR05VTSkgc2hvdWxkIGJlIHRoZSByaWdodCBhbnN3ZXI7CisgICAgIG9yIGF0IGxlYXN0IENGUF9SRUdOVU0gcmVsYXRpdmUgdG8gRlJBTUUgKGllLCByZXN1bHQpLgorICAgICBUaGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBpbiB0aGUgd2F5IHRoZSBpbm5lcm1vc3QgZnJhbWUgaXMgc2V0IHVwLiAgKi8KKworICAgIHJldHVybiAoKGZyYW1lLT5uZXh0KSA/IHJlc3VsdDogZnJhbWUtPmZyYW1lX2NmcCk7Cit9CisKK0NPUkVfQUREUiBmcmFtZV9hcmdzX2FkZHIgKGZyYW1lKQorICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgcmVnaXN0ZXIgaW50IGFkZHIgPSBmaW5kX3NhdmVkX3JlZ2lzdGVyIChmcmFtZSxDRlBfUkVHTlVNKTsKKyAgcmVnaXN0ZXIgaW50IHJlc3VsdCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKGFkZHIsIDQpOworCisjaWZkZWYgUFlSQU1JRF9DT05UUk9MX0ZSQU1FX0RFQlVHR0lORworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsCisJICAgIlx0W1suLmZyYW1lX2FyZ3M6JTh4LCAlcz0gJXggQCV4IGZjZnA9ICV4IHJfcj0gJXhcblx0IGdyMTM9JXggcHIxMz0leCB0cjEzPSV4IEAleF1dXG4iLAorCSAgIGZyYW1lLT5mcmFtZSwKKwkgICBSRUdJU1RFUl9OQU1FIChDRlBfUkVHTlVNKSwKKwkgICByZXN1bHQsIGFkZHIsCisJICAgZnJhbWUtPmZyYW1lX2NmcCwgcmVhZF9yZWdpc3RlcihDRlBfUkVHTlVNKSwKKworCSAgIHJlYWRfcmVnaXN0ZXIoMTMpLCByZWFkX3JlZ2lzdGVyKDI5KSwgcmVhZF9yZWdpc3Rlcig2MSksCisJICAgZmluZF9zYXZlZF9yZWdpc3RlcihmcmFtZSwgNjEpKTsKKyNlbmRpZiAvKiAgUFlSQU1JRF9DT05UUk9MX0ZSQU1FX0RFQlVHR0lORyAqLworCisgIC8qIEZJWE1FOiBJIHRob3VnaHQgcmVhZF9yZWdpc3RlciAoQ0ZQX1JFR05VTSkgc2hvdWxkIGJlIHRoZSByaWdodCBhbnN3ZXI7CisgICAgIG9yIGF0IGxlYXN0IENGUF9SRUdOVU0gcmVsYXRpdmUgdG8gRlJBTUUgKGllLCByZXN1bHQpLgorICAgICBUaGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBpbiB0aGUgd2F5IHRoZSBpbm5lcm1vc3QgZnJhbWUgaXMgc2V0IHVwLiAgKi8KKyAgICByZXR1cm4gKChmcmFtZS0+bmV4dCkgPyByZXN1bHQ6IGZyYW1lLT5mcmFtZV9jZnApOworfQorCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAib3Bjb2RlL3B5ci5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKworDAorLyogIEEgY291cGxlIG9mIGZ1bmN0aW9ucyB1c2VkIGZvciBkZWJ1Z2dpbmcgZnJhbWUtaGFuZGxpbmcgb24KKyAgICBQeXJhbWlkcy4gKFRoZSBQeXJhbWlkLWRlcGVuZGVudCBoYW5kbGluZyBvZiByZWdpc3RlciB2YWx1ZXMgZm9yCisgICAgd2luZG93ZWQgcmVnaXN0ZXJzIGlzIGtub3duIHRvIGJlIGJ1Z2d5LikKKworICAgIFdoZW4gZGVidWdnaW5nLCB0aGVzZSBmdW5jdGlvbnMgY2FuIHN1cHBsYW50IHRoZSBub3JtYWwgZGVmaW5pdGlvbnMgb2Ygc29tZQorICAgIG9mIHRoZSBtYWNyb3MgaW4gdG0tcHlyYW1pZC5oICBUaGUgcXVhbnRpdHkgb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQKKyAgICB3aGVuIHRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBtYWtlcyB0aGUgZ2RiICB1bnVzYWJsZSBhcyBhCisgICAgZGVidWdnZXIgZm9yIHVzZXIgcHJvZ3JhbXMuICAqLworICAgIAorZXh0ZXJuIHVuc2lnbmVkIHB5cl9zYXZlZF9wYygpLCBweXJfZnJhbWVfY2hhaW4oKTsKKworQ09SRV9BRERSIHB5cl9mcmFtZV9jaGFpbihmcmFtZSkKKyAgICBDT1JFX0FERFIgZnJhbWU7Cit7CisgICAgaW50IGZvbz1mcmFtZSAtIENPTlRST0xfU1RBQ0tfRlJBTUVfU0laRTsKKyAgICAvKiBwcmludGZfdW5maWx0ZXJlZCAoIi4uLmZvbGxvd2luZyBjaGFpbiBmcm9tICV4OiBnb3QgJXhcbiIsIGZyYW1lLCBmb28pOyovCisgICAgcmV0dXJuIGZvbzsKK30KKworQ09SRV9BRERSIHB5cl9zYXZlZF9wYyhmcmFtZSkKKyAgICBDT1JFX0FERFIgZnJhbWU7Cit7CisgICAgaW50IGZvbz0wOworICAgIGZvbyA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKCgoQ09SRV9BRERSKShmcmFtZSkpKzYwLCA0KTsKKyAgICBwcmludGZfdW5maWx0ZXJlZCAoIi4ucmVhZGluZyBwYyBmcm9tIGZyYW1lIDB4JTB4KyVkIHJlZ3M6IGdvdCAlMHhcbiIsCisJICAgIGZyYW1lLCA2MC80LCBmb28pOworICAgIHJldHVybiBmb287Cit9CisKKy8qIFB5cmFtaWQgaW5zdHJ1Y3Rpb25zIGFyZSBuZXZlciBsb25nZXIgdGhhbiB0aGlzIG1hbnkgYnl0ZXMuICAqLworI2RlZmluZSBNQVhMRU4gMjQKKworLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLworLypjb25zdCovIHN0YXRpYyBpbnQgbm9wY29kZXMgPSAoc2l6ZW9mIChweXJfb3Bjb2RlcykgLyBzaXplb2YoIHB5cl9vcGNvZGVzWzBdKSk7CisjZGVmaW5lIE5PUENPREVTIChub3Bjb2RlcykKKworLyogTGV0J3MgYmUgYnl0ZS1pbmRlcGVuZGVudCBzbyB3ZSBjYW4gdXNlIHRoaXMgYXMgYSBjcm9zcy1hc3NlbWJsZXIuICAqLworCisjZGVmaW5lIE5FWFRMT05HKHApICBcCisgIChwICs9IDQsICgoKCgocFstNF0gPDwgOCkgKyBwWy0zXSkgPDwgOCkgKyBwWy0yXSkgPDwgOCkgKyBwWy0xXSkKKwwKKy8qIFByaW50IG9uZSBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzIE1FTUFERFIgaW4gZGVidWdnZWQgbWVtb3J5LAorICAgb24gU1RSRUFNLiAgUmV0dXJucyBsZW5ndGggb2YgdGhlIGluc3RydWN0aW9uLCBpbiBieXRlcy4gICovCisKK2ludAorcHlyX3ByaW50X2luc24gKG1lbWFkZHIsIHN0cmVhbSkKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIEdEQl9GSUxFICpzdHJlYW07Cit7CisgIHVuc2lnbmVkIGNoYXIgYnVmZmVyW01BWExFTl07CisgIHJlZ2lzdGVyIGludCBpLCBuYXJncywgaW5zbl9zaXplID00OworICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwOworICByZWdpc3RlciBjaGFyICpkOworICByZWdpc3RlciBpbnQgaW5zbl9vcGNvZGUsIG9wZXJhbmRfbW9kZTsKKyAgcmVnaXN0ZXIgaW50IGluZGV4X211bHRpcGxpZXIsIGluZGV4X3JlZ19yZWdubywgb3BfMV9yZWdubywgb3BfMl9yZWdubyA7CisgIGxvbmcgaW5zbjsJCQkvKiBmaXJzdCB3b3JkIG9mIHRoZSBpbnNuLCBub3QgYnJva2VuIGRvd24uICovCisgIHB5cl9pbnNuX2Zvcm1hdCBpbnNuX2RlY29kZTsJLyogdGhlIHNhbWUsIGJyb2tlbiBvdXQgaW50byBvcHtjb2RlLGVyYW5kc30gKi8KKyAgbG9uZyBleHRyYV8xLCBleHRyYV8yOworCisgIHJlYWRfbWVtb3J5IChtZW1hZGRyLCBidWZmZXIsIE1BWExFTik7CisgIGluc25fZGVjb2RlID0gKigocHlyX2luc25fZm9ybWF0ICopIGJ1ZmZlcik7CisgIGluc24gPSAqICgoaW50ICopIGJ1ZmZlcik7CisgIGluc25fb3Bjb2RlID0gaW5zbl9kZWNvZGUub3BlcmF0b3I7CisgIG9wZXJhbmRfbW9kZSA9IGluc25fZGVjb2RlLm1vZGU7CisgIGluZGV4X211bHRpcGxpZXIgPSBpbnNuX2RlY29kZS5pbmRleF9zY2FsZTsKKyAgaW5kZXhfcmVnX3JlZ25vID0gaW5zbl9kZWNvZGUuaW5kZXhfcmVnOworICBvcF8xX3JlZ25vID0gaW5zbl9kZWNvZGUub3BlcmFuZF8xOworICBvcF8yX3JlZ25vID0gaW5zbl9kZWNvZGUub3BlcmFuZF8yOworICAKKyAgCisgIGlmICgqKChpbnQgKilidWZmZXIpID09IDB4MCkgeworICAgIC8qICJoYWx0IiBsb29rcyBqdXN0IGxpa2UgYW4gaW52YWxpZCAianVtcCIgdG8gdGhlIGluc24gZGVjb2RlciwKKyAgICAgICBzbyBpcyBkZWFsdCB3aXRoIGFzIGEgc3BlY2lhbCBjYXNlICovCisgICAgZnByaW50Zl91bmZpbHRlcmVkIChzdHJlYW0sICJoYWx0Iik7CisgICAgcmV0dXJuICg0KTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBOT1BDT0RFUzsgaSsrKQorCSAgaWYgKHB5cl9vcGNvZGVzW2ldLmRhdHVtLmNvZGUgPT0gaW5zbl9vcGNvZGUpCisJCSAgYnJlYWs7CisKKyAgaWYgKGkgPT0gTk9QQ09ERVMpCisJICAvKiBGSVhNRTogSGFuZGxlIHVucmVjb2duaXNlZCBpbnN0cnVjdGlvbnMgYmV0dGVyLiAgKi8KKwkgIGZwcmludGZfdW5maWx0ZXJlZCAoc3RyZWFtLCAiPz8/XHQjJTA4eFx0KG9wPSV4IG1vZGUgPSV4KSIsCisJCSAgIGluc24sIGluc25fZGVjb2RlLm9wZXJhdG9yLCBpbnNuX2RlY29kZS5tb2RlKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFByaW50IHRoZSBtbmVtb25pYyBmb3IgdGhlIGluc3RydWN0aW9uLiAgUHlyYW1pZCBpbnNuIG9wZXJhbmRzCisgICAgICAgICBhcmUgc28gcmVndWxhciB0aGF0IHdlIGNhbiBkZWFsIHdpdGggYWxtb3N0IGFsbCBvZiB0aGVtCisgICAgICAgICBzZXBhcmF0ZWx5LgorCSBVbmNvbmRpdGlvbmFsIGJyYW5jaGVzIGFyZSBhbiBleGNlcHRpb246IHRoZXkgYXJlIGVuY29kZWQgYXMKKwkgY29uZGl0aW9uYWwgYnJhbmNoZXMgKGJyYW5jaCBpZiBmYWxzZSBjb25kaXRpb24sIEkgdGhpbmspCisJIHdpdGggbm8gY29uZGl0aW9uIHNwZWNpZmllZC4gVGhlIGF2ZXJhZ2UgdXNlciB3aWxsIG5vdCBiZQorCSBhd2FyZSBvZiB0aGlzLiBUbyBtYWludGFpbiB0aGVpciBpbGx1c2lvbiB0aGF0IGFuCisJIHVuY29uZGl0aW9uYWwgYnJhbmNoIGluc24gZXhpc3RzLCB3ZSB3aWxsIGhhdmUgdG8gRklYTUUgdG8KKwkgdHJlYXQgdGhlIGluc24gbW5lbW5vbmljIG9mIGFsbCBicmFuY2ggaW5zdHJ1Y3Rpb25zIGhlcmUgYXMgYQorCSBzcGVjaWFsIGNhc2U6IGNoZWNrIHRoZSBvcGVyYW5kcyBvZiBicmFuY2ggaW5zbiBhbmQgcHJpbnQgYW4KKwkgYXBwcm9wcmlhdGUgbW5lbW9uaWMuICovIAorCisgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwgIiVzXHQiLCBweXJfb3Bjb2Rlc1tpXS5uYW1lKTsKKworICAgIC8qIFByaW50IHRoZSBvcGVyYW5kcyBvZiB0aGUgaW5zbiAoYXMgc3BlY2lmaWVkIGluCisgICAgICAgaW5zbi5vcGVyYW5kX21vZGUpLiAKKyAgICAgICBCcmFuY2ggb3BlcmFuZHMgb2YgYnJhbmNoZXMgYXJlIGEgc3BlY2lhbCBjYXNlOiB0aGV5IGFyZSBhIHdvcmQKKyAgICAgICBvZmZzZXQsIG5vdCBhIGJ5dGUgb2Zmc2V0LiAqLworICAKKyAgICBpZiAoaW5zbl9kZWNvZGUub3BlcmF0b3IgPT0gMHgwMSB8fCBpbnNuX2RlY29kZS5vcGVyYXRvciA9PSAweDAyKSB7CisgICAgICByZWdpc3RlciBpbnQgYml0X2NvZGVzPShpbnNuID4+IDE2KSYweGY7CisgICAgICByZWdpc3RlciBpbnQgaTsKKyAgICAgIHJlZ2lzdGVyIGludCBkaXNwbGFjZW1lbnQgPSAoaW5zbiAmIDB4MDAwMGZmZmYpIDw8IDI7CisKKyAgICAgIHN0YXRpYyBjaGFyIGNjX2JpdF9uYW1lc1tdID0gImN2em4iOwkvKiB6LG4sYyx2OiBzdHJhbmdlIG9yZGVyPyAqLworCisgICAgICAvKiBJcyBiZmMgYW5kIG5vIGJpdHMgc3BlY2lmaWVkIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoPyovCisgICAgICBmb3IgKGk9MDtpPDQ7aSsrKSB7CisJaWYgKChiaXRfY29kZXMpICYgMHgxKQorCQlmcHV0Y191bmZpbHRlcmVkIChjY19iaXRfbmFtZXNbaV0sIHN0cmVhbSk7CisJYml0X2NvZGVzID4+PSAxOworICAgICAgfQorCisgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwgIiwlMHgiLAorCSAgICAgICBkaXNwbGFjZW1lbnQgKyBtZW1hZGRyKTsKKyAgICAgIHJldHVybiAoaW5zbl9zaXplKTsKKyAgICB9CisKKyAgICAgIHN3aXRjaCAob3BlcmFuZF9tb2RlKSB7CisgICAgICBjYXNlIDA6CisJZnByaW50Zl91bmZpbHRlcmVkIChzdHJlYW0sICIlcywlcyIsCisJCSBSRUdJU1RFUl9OQU1FIChvcF8xX3JlZ25vKSwKKwkJIFJFR0lTVEVSX05BTUUgKG9wXzJfcmVnbm8pKTsKKwlicmVhazsKKwkgICAgCisgICAgICBjYXNlIDE6CisJZnByaW50Zl91bmZpbHRlcmVkIChzdHJlYW0sICIgMHglMHgsJXMiLAorCQkgb3BfMV9yZWdubywKKwkJIFJFR0lTVEVSX05BTUUgKG9wXzJfcmVnbm8pKTsKKwlicmVhazsKKwkKKyAgICAgIGNhc2UgMjoKKwlyZWFkX21lbW9yeSAobWVtYWRkcis0LCBidWZmZXIsIE1BWExFTik7CisJaW5zbl9zaXplICs9IDQ7CisJZXh0cmFfMSA9ICogKChpbnQgKikgYnVmZmVyKTsKKwlmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwgIiAkMHglMHgsJXMiLAorCQkgZXh0cmFfMSwKKwkJIFJFR0lTVEVSX05BTUUgKG9wXzJfcmVnbm8pKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMzoKKwlmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwgIiAoJXMpLCVzIiwKKwkJIFJFR0lTVEVSX05BTUUgKG9wXzFfcmVnbm8pLAorCQkgUkVHSVNURVJfTkFNRSAob3BfMl9yZWdubykpOworCWJyZWFrOworCQorICAgICAgY2FzZSA0OgorCXJlYWRfbWVtb3J5IChtZW1hZGRyKzQsIGJ1ZmZlciwgTUFYTEVOKTsKKwlpbnNuX3NpemUgKz0gNDsKKwlleHRyYV8xID0gKiAoKGludCAqKSBidWZmZXIpOworCWZwcmludGZfdW5maWx0ZXJlZCAoc3RyZWFtLCAiIDB4JTB4KCVzKSwlcyIsCisJCSBleHRyYV8xLAorCQkgUkVHSVNURVJfTkFNRSAob3BfMV9yZWdubyksCisJCSBSRUdJU1RFUl9OQU1FIChvcF8yX3JlZ25vKSk7CisJYnJlYWs7CisJCisJLyogUzEgZGVzdGluYXRpb24gbW9kZSAqLworICAgICAgY2FzZSA1OgorCWZwcmludGZfdW5maWx0ZXJlZCAoc3RyZWFtLAorCQkgKChpbmRleF9yZWdfcmVnbm8pID8gIiVzLCglcylbJXMqJTFkXSIgOiAiJXMsKCVzKSIpLAorCQkgUkVHSVNURVJfTkFNRSAob3BfMV9yZWdubyksCisJCSBSRUdJU1RFUl9OQU1FIChvcF8yX3JlZ25vKSwKKwkJIFJFR0lTVEVSX05BTUUgKGluZGV4X3JlZ19yZWdubyksCisJCSBpbmRleF9tdWx0aXBsaWVyKTsKKwlicmVhazsKKwkKKyAgICAgIGNhc2UgNjoKKwlmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwKKwkJICgoaW5kZXhfcmVnX3JlZ25vKSA/ICIgJCUjMHgsKCVzKVslcyolMWRdIgorCQkgIDogIiAkJSMweCwoJXMpIiksCisJCSBvcF8xX3JlZ25vLAorCQkgUkVHSVNURVJfTkFNRSAob3BfMl9yZWdubyksCisJCSBSRUdJU1RFUl9OQU1FIChpbmRleF9yZWdfcmVnbm8pLAorCQkgaW5kZXhfbXVsdGlwbGllcik7CisJYnJlYWs7CisJCisgICAgICBjYXNlIDc6CisJcmVhZF9tZW1vcnkgKG1lbWFkZHIrNCwgYnVmZmVyLCBNQVhMRU4pOworCWluc25fc2l6ZSArPSA0OworCWV4dHJhXzEgPSAqICgoaW50ICopIGJ1ZmZlcik7CisJZnByaW50Zl91bmZpbHRlcmVkIChzdHJlYW0sCisJCSAoKGluZGV4X3JlZ19yZWdubykgPyAiICQlIzB4LCglcylbJXMqJTFkXSIKKwkJICA6ICIgJCUjMHgsKCVzKSIpLAorCQkgZXh0cmFfMSwKKwkJIFJFR0lTVEVSX05BTUUgKG9wXzJfcmVnbm8pLAorCQkgUkVHSVNURVJfTkFNRSAoaW5kZXhfcmVnX3JlZ25vKSwKKwkJIGluZGV4X211bHRpcGxpZXIpOworCWJyZWFrOworCQorICAgICAgY2FzZSA4OgorCWZwcmludGZfdW5maWx0ZXJlZCAoc3RyZWFtLAorCQkgKChpbmRleF9yZWdfcmVnbm8pID8gIiAoJXMpLCglcylbJXMqJTFkXSIgOiAiICglcyksKCVzKSIpLAorCQkgUkVHSVNURVJfTkFNRSAob3BfMV9yZWdubyksCisJCSBSRUdJU1RFUl9OQU1FIChvcF8yX3JlZ25vKSwKKwkJIFJFR0lTVEVSX05BTUUgKGluZGV4X3JlZ19yZWdubyksCisJCSBpbmRleF9tdWx0aXBsaWVyKTsKKwlicmVhazsKKwkKKyAgICAgIGNhc2UgOToKKwlyZWFkX21lbW9yeSAobWVtYWRkcis0LCBidWZmZXIsIE1BWExFTik7CisJaW5zbl9zaXplICs9IDQ7CisJZXh0cmFfMSA9ICogKChpbnQgKikgYnVmZmVyKTsKKwlmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwKKwkJICgoaW5kZXhfcmVnX3JlZ25vKQorCQkgID8gIiUjMHgoJXMpLCglcylbJXMqJTFkXSIKKwkJICA6ICIlIzB4KCVzKSwoJXMpIiksCisJCSBleHRyYV8xLAorCQkgUkVHSVNURVJfTkFNRSAob3BfMV9yZWdubyksCisJCSBSRUdJU1RFUl9OQU1FIChvcF8yX3JlZ25vKSwKKwkJIFJFR0lTVEVSX05BTUUgKGluZGV4X3JlZ19yZWdubyksCisJCSBpbmRleF9tdWx0aXBsaWVyKTsKKwlicmVhazsKKwkKKwkvKiBTMiBkZXN0aW5hdGlvbiBtb2RlICovCisgICAgICBjYXNlIDEwOgorCXJlYWRfbWVtb3J5IChtZW1hZGRyKzQsIGJ1ZmZlciwgTUFYTEVOKTsKKwlpbnNuX3NpemUgKz0gNDsKKwlleHRyYV8xID0gKiAoKGludCAqKSBidWZmZXIpOworCWZwcmludGZfdW5maWx0ZXJlZCAoc3RyZWFtLAorCQkgKChpbmRleF9yZWdfcmVnbm8pID8gIiVzLCUjMHgoJXMpWyVzKiUxZF0iIDogIiVzLCUjMHgoJXMpIiksCisJCSBSRUdJU1RFUl9OQU1FIChvcF8xX3JlZ25vKSwKKwkJIGV4dHJhXzEsCisJCSBSRUdJU1RFUl9OQU1FIChvcF8yX3JlZ25vKSwKKwkJIFJFR0lTVEVSX05BTUUgKGluZGV4X3JlZ19yZWdubyksCisJCSBpbmRleF9tdWx0aXBsaWVyKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMTE6CisJcmVhZF9tZW1vcnkgKG1lbWFkZHIrNCwgYnVmZmVyLCBNQVhMRU4pOworCWluc25fc2l6ZSArPSA0OworCWV4dHJhXzEgPSAqICgoaW50ICopIGJ1ZmZlcik7CisJZnByaW50Zl91bmZpbHRlcmVkIChzdHJlYW0sCisJCSAoKGluZGV4X3JlZ19yZWdubykgPworCQkgICIgJCUjMHgsJSMweCglcylbJXMqJTFkXSIgOiAiICQlIzB4LCUjMHgoJXMpIiksCisJCSBvcF8xX3JlZ25vLAorCQkgZXh0cmFfMSwKKwkJIFJFR0lTVEVSX05BTUUgKG9wXzJfcmVnbm8pLAorCQkgUkVHSVNURVJfTkFNRSAoaW5kZXhfcmVnX3JlZ25vKSwKKwkJIGluZGV4X211bHRpcGxpZXIpOworCWJyZWFrOworICAgICAgY2FzZSAxMjoKKwlyZWFkX21lbW9yeSAobWVtYWRkcis0LCBidWZmZXIsIE1BWExFTik7CisJaW5zbl9zaXplICs9IDQ7CisJZXh0cmFfMSA9ICogKChpbnQgKikgYnVmZmVyKTsKKwlyZWFkX21lbW9yeSAobWVtYWRkcis4LCBidWZmZXIsIE1BWExFTik7CisJaW5zbl9zaXplICs9IDQ7CisJZXh0cmFfMiA9ICogKChpbnQgKikgYnVmZmVyKTsKKwlmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwKKwkJICgoaW5kZXhfcmVnX3JlZ25vKSA/CisJCSAgIiAkJSMweCwlIzB4KCVzKVslcyolMWRdIiA6ICIgJCUjMHgsJSMweCglcykiKSwKKwkJIGV4dHJhXzEsCisJCSBleHRyYV8yLAorCQkgUkVHSVNURVJfTkFNRSAob3BfMl9yZWdubyksCisJCSBSRUdJU1RFUl9OQU1FIChpbmRleF9yZWdfcmVnbm8pLAorCQkgaW5kZXhfbXVsdGlwbGllcik7CisJYnJlYWs7CisJCisgICAgICBjYXNlIDEzOgorCXJlYWRfbWVtb3J5IChtZW1hZGRyKzQsIGJ1ZmZlciwgTUFYTEVOKTsKKwlpbnNuX3NpemUgKz0gNDsKKwlleHRyYV8xID0gKiAoKGludCAqKSBidWZmZXIpOworCWZwcmludGZfdW5maWx0ZXJlZCAoc3RyZWFtLAorCQkgKChpbmRleF9yZWdfcmVnbm8pCisJCSAgPyAiICglcyksJSMweCglcylbJXMqJTFkXSIgCisJCSAgOiAiICglcyksJSMweCglcykiKSwKKwkJIFJFR0lTVEVSX05BTUUgKG9wXzFfcmVnbm8pLAorCQkgZXh0cmFfMSwKKwkJIFJFR0lTVEVSX05BTUUgKG9wXzJfcmVnbm8pLAorCQkgUkVHSVNURVJfTkFNRSAoaW5kZXhfcmVnX3JlZ25vKSwKKwkJIGluZGV4X211bHRpcGxpZXIpOworCWJyZWFrOworICAgICAgY2FzZSAxNDoKKwlyZWFkX21lbW9yeSAobWVtYWRkcis0LCBidWZmZXIsIE1BWExFTik7CisJaW5zbl9zaXplICs9IDQ7CisJZXh0cmFfMSA9ICogKChpbnQgKikgYnVmZmVyKTsKKwlyZWFkX21lbW9yeSAobWVtYWRkcis4LCBidWZmZXIsIE1BWExFTik7CisJaW5zbl9zaXplICs9IDQ7CisJZXh0cmFfMiA9ICogKChpbnQgKikgYnVmZmVyKTsKKwlmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwKKwkJICgoaW5kZXhfcmVnX3JlZ25vKSA/ICIlIzB4KCVzKSwlIzB4KCVzKVslcyolMWRdIgorCQkgIDogIiUjMHgoJXMpLCUjMHgoJXMpICIpLAorCQkgZXh0cmFfMSwKKwkJIFJFR0lTVEVSX05BTUUgKG9wXzFfcmVnbm8pLAorCQkgZXh0cmFfMiwKKwkJIFJFR0lTVEVSX05BTUUgKG9wXzJfcmVnbm8pLAorCQkgUkVHSVNURVJfTkFNRSAoaW5kZXhfcmVnX3JlZ25vKSwKKwkJIGluZGV4X211bHRpcGxpZXIpOworCWJyZWFrOworCQorICAgICAgZGVmYXVsdDoKKwlmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwKKwkJICgoaW5kZXhfcmVnX3JlZ25vKSA/ICIlcywlcyBbJXMqJTFkXSIgOiAiJXMsJXMiKSwKKwkJIFJFR0lTVEVSX05BTUUgKG9wXzFfcmVnbm8pLAorCQkgUkVHSVNURVJfTkFNRSAob3BfMl9yZWdubyksCisJCSBSRUdJU1RFUl9OQU1FIChpbmRleF9yZWdfcmVnbm8pLAorCQkgaW5kZXhfbXVsdGlwbGllcik7CisJZnByaW50Zl91bmZpbHRlcmVkIChzdHJlYW0sCisJCSAiXHRcdCMgdW5rbm93biBtb2RlIGluICUwOHgiLAorCQkgaW5zbik7CisJYnJlYWs7CisgICAgICB9IC8qIHN3aXRjaCAqLworICAgIH0KKyAgCisgIHsKKyAgICByZXR1cm4gaW5zbl9zaXplOworICB9CisgIGFib3J0ICgpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3B5ci14ZGVwLmMgYi9nZGIvcHlyLXhkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDZkOWE5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3B5ci14ZGVwLmMKQEAgLTAsMCArMSwzNzAgQEAKKy8qIExvdyBsZXZlbCBQeXJhbWlkIGludGVyZmFjZSB0byBwdHJhY2UsIGZvciBHREIgd2hlbiBydW5uaW5nIHVuZGVyIFVuaXguCisgICBDb3B5cmlnaHQgKEMpIDE5ODgsIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisvKiAjaW5jbHVkZSA8ZmNudGwuaD4gIENhbiB3ZSBsaXZlIHdpdGhvdXQgdGhpcz8gICovCisKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSA8c3lzL3VzZXIuaD4JCS8qIEFmdGVyIGEub3V0LmggICovCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlICJnZGJfc3RhdC5oIgorCisMCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHJlZ2lzdGVyIGludCBkYXR1bTsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHJlZ2FkZHI7CisgIGludCByZWdfYnVmW05VTV9SRUdTKzFdOworICBzdHJ1Y3QgdXNlciB1OworICByZWdpc3RlciBpbnQgc2tpcHBlZF9mcmFtZXMgPSAwOworCisgIHJlZ2lzdGVyc19mZXRjaGVkICgpOworICAKKyAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgNjQ7IHJlZ25vKyspIHsKKyAgICByZWdfYnVmW3JlZ25vXSA9IHB0cmFjZSAoMywgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnbm8sIDApOworICAgIAorI2lmIGRlZmluZWQoUFlSQU1JRF9DT05UUk9MX0ZSQU1FX0RFQlVHR0lORykKKyAgICBwcmludGZfdW5maWx0ZXJlZCAoIkZldGNoaW5nIHJlZ2lzdGVyICVzLCBnb3QgJTB4XG4iLAorCSAgICBSRUdJU1RFUl9OQU1FIChyZWdubyksCisJICAgIHJlZ19idWZbcmVnbm9dKTsKKyNlbmRpZiAvKiBQWVJBTUlEX0NPTlRST0xfRlJBTUVfREVCVUdHSU5HICovCisgICAgCisgICAgaWYgKHJlZ19idWZbcmVnbm9dID09IC0xICYmIGVycm5vID09IEVJTykgeworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQoImZldGNoX2ludGVyaW9yX3JlZ2lzdGVyczogZmV0Y2hpbmcgcmVnaXN0ZXIgJXNcbiIsCisJICAgICBSRUdJU1RFUl9OQU1FIChyZWdubykpOworICAgICAgZXJybm8gPSAwOworICAgIH0KKyAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCByZWdfYnVmK3JlZ25vKTsKKyAgfQorICAvKiB0aGF0IGxlYXZlcyByZWdzIDY0LCA2NSwgYW5kIDY2ICovCisgIGRhdHVtID0gcHRyYWNlICgzLCBpbmZlcmlvcl9waWQsCisJCSAgKFBUUkFDRV9BUkczX1RZUEUpICgoKGNoYXIgKikmdS51X3BjYi5wY2JfY3NwKSAtCisJCSAgKChjaGFyICopJnUpKSwgMCk7CisgIAorICAKKyAgCisgIC8qIEZJWE1FOiBGaW5kIHRoZSBDdXJyZW50IEZyYW1lIFBvaW50ZXIgKENGUCkuIENGUCBpcyBhIGdsb2JhbAorICAgICByZWdpc3RlciAoaWUsIE5PVCB3aW5kb3dlZCksIHRoYXQgZ2V0cyBzYXZlZCBpbiBhIGZyYW1lIGlmZgorICAgICB0aGUgY29kZSBmb3IgdGhhdCBmcmFtZSBoYXMgYSBwcm9sb2d1ZSAoaWUsICJhZHNmIE4iKS4gIElmCisgICAgIHRoZXJlIGlzIGEgcHJvbG9ndWUsIHRoZSBhZHNmIGluc24gc2F2ZXMgdGhlIG9sZCBjZnAgaW4KKyAgICAgcHIxMywgY2ZwIGlzIHNldCB0byBzcCwgYW5kIE4gYnl0ZXMgb2YgbG9jYWxzIGFyZSBhbGxvY2F0ZWQKKyAgICAgKHNwIGlzIGRlY3JlbWVudGVkIGJ5IG4pLgorICAgICBUaGlzIG1ha2VzIGZpbmRpbmcgQ0ZQIGhhcmQuIEkgZ3Vlc3MgdGhlIHJpZ2h0IHdheSB0byBkbyBpdAorICAgICBpczogCisgICAgIC0gSWYgdGhpcyBpcyB0aGUgaW5uZXJtb3N0IGZyYW1lLCBiZWxpZXZlIHB0cmFjZSgpIG9yCisgICAgIHRoZSBjb3JlIGFyZWEuCisgICAgIC0gT3RoZXJ3aXNlOgorICAgICBGaW5kIHRoZSBmaXJzdCBpbnNuIG9mIHRoZSBjdXJyZW50IGZyYW1lLgorICAgICAtIGZpbmQgdGhlIHNhdmVkIHBjOworICAgICAtIGZpbmQgdGhlIGNhbGwgaW5zbiB0aGF0IHNhdmVkIGl0OworICAgICAtIGZpZ3VyZSBvdXQgd2hlcmUgdGhlIGNhbGwgaXMgdG87CisgICAgIC0gaWYgdGhlIGZpcnN0IGluc24gaXMgYW4gYWRzZiwgd2UgZ290IGEgZnJhbWUKKyAgICAgcG9pbnRlci4gKi8KKyAgCisgIAorICAvKiBOb3JtYWwgcHJvY2Vzc29ycyBoYXZlIHNlcGFyYXRlIHN0YWNrIHBvaW50ZXJzIGZvciB1c2VyIGFuZAorICAgICBrZXJuZWwgbW9kZS4gR2V0dGluZyB0aGUgbGFzdCB1c2VyIG1vZGUgZnJhbWUgb24gc3VjaAorICAgICBtYWNoaW5lcyBpcyBlYXN5OiB0aGUga2VybmVsIGNvbnRleHQgb2YgdGhlIHB0cmFjZSgpJ2QKKyAgICAgcHJvY2VzcyBpcyBvbiB0aGUga2VybmVsIHN0YWNrLCBhbmQgdGhlIFVTUCBwb2ludHMgdG8gd2hhdAorICAgICB3ZSB3YW50LiBCdXQgUHlyYW1pZHMgb25seSBoYXZlIGEgc2luZ2xlIGNmcCBmb3IgYm90aCB1c2VyIGFuZAorICAgICBrZXJuZWwgbW9kZS4gIEFuZCBwcm9jZXNzZXMgYmVpbmcgcHRyYWNlKCknZCBoYXZlIHNvbWUKKyAgICAga2VybmVsLWNvbnRleHQgY29udHJvbCBmcmFtZXMgb24gdGhlaXIgc3RhY2suCisgICAgIFRvIGF2b2lkIHRyYWNpbmcgYmFjayBpbnRvIHRoZSBrZXJuZWwgY29udGV4dCBvZiBhbiBpbmZlcmlvciwKKyAgICAgd2Ugc2tpcCAwIG9yIG1vcmUgY29udGlndW91cyBjb250cm9sIGZyYW1lcyB3aGVyZSB0aGUgcGMgaXMKKyAgICAgaW4gdGhlIGtlcm5lbC4gKi8gCisgIAorICB3aGlsZSAoMSkgeworICAgIHJlZ2lzdGVyIGludCBpbmZlcmlvcl9zYXZlZF9wYzsKKyAgICBpbmZlcmlvcl9zYXZlZF9wYyA9IHB0cmFjZSAoMSwgaW5mZXJpb3JfcGlkLAorCQkJCShQVFJBQ0VfQVJHM19UWVBFKSAoZGF0dW0rKCgzMisxNSkqNCkpLCAwKTsKKyAgICBpZiAoaW5mZXJpb3Jfc2F2ZWRfcGMgPiAwKSBicmVhazsKKyNpZiBkZWZpbmVkKFBZUkFNSURfQ09OVFJPTF9GUkFNRV9ERUJVR0dJTkcpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQoInNraXBwaW5nIGtlcm5lbCBmcmFtZSAlMDh4LCBwYz0lMDh4XG4iLCBkYXR1bSwKKwkgICBpbmZlcmlvcl9zYXZlZF9wYyk7CisjZW5kaWYgLyogUFlSQU1JRF9DT05UUk9MX0ZSQU1FX0RFQlVHR0lORyAqLworICAgIHNraXBwZWRfZnJhbWVzKys7CisgICAgZGF0dW0gLT0gQ09OVFJPTF9TVEFDS19GUkFNRV9TSVpFOworICB9CisgIAorICByZWdfYnVmW0NTUF9SRUdOVU1dID0gZGF0dW07CisgIHN1cHBseV9yZWdpc3RlcihDU1BfUkVHTlVNLCByZWdfYnVmK0NTUF9SRUdOVU0pOworI2lmZGVmICBQWVJBTUlEX0NPTlRST0xfRlJBTUVfREVCVUdHSU5HCisgIGlmIChza2lwcGVkX2ZyYW1lcykgeworICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKwkgICAgICJza2lwcGVkICVkIGZyYW1lcyBmcm9tICV4IHRvICV4OyBjZnAgd2FzICV4LCBub3cgJXhcbiIsCisJICAgICBza2lwcGVkX2ZyYW1lcywgcmVnX2J1ZltDU1BfUkVHTlVNXSk7CisgIH0KKyNlbmRpZiAvKiBQWVJBTUlEX0NPTlRST0xfRlJBTUVfREVCVUdHSU5HICovCit9CisKKy8qIFN0b3JlIG91ciByZWdpc3RlciB2YWx1ZXMgYmFjayBpbnRvIHRoZSBpbmZlcmlvci4KKyAgIElmIFJFR05PIGlzIC0xLCBkbyB0aGlzIGZvciBhbGwgcmVnaXN0ZXJzLgorICAgT3RoZXJ3aXNlLCBSRUdOTyBzcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXIgKHNvIHdlIGNhbiBzYXZlIHRpbWUpLiAgKi8KKwordm9pZAorc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgcmVnYWRkcjsKKyAgY2hhciBidWZbODBdOworCisgIGlmIChyZWdubyA+PSAwKQorICAgIHsKKyAgICAgIGlmICgoMCA8PSByZWdubykgJiYgKHJlZ25vIDwgNjQpKSB7CisJLypyZWdhZGRyID0gcmVnaXN0ZXJfYWRkciAocmVnbm8sIG9mZnNldCk7Ki8KKwlyZWdhZGRyID0gcmVnbm87CisJZXJybm8gPSAwOworCXB0cmFjZSAoNiwgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnYWRkciwKKwkJcmVhZF9yZWdpc3RlciAocmVnbm8pKTsKKwlpZiAoZXJybm8gIT0gMCkKKwkgIHsKKwkgICAgc3ByaW50ZiAoYnVmLCAid3JpdGluZyByZWdpc3RlciBudW1iZXIgJWQiLCByZWdubyk7CisJICAgIHBlcnJvcl93aXRoX25hbWUgKGJ1Zik7CisJICB9CisgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgTlVNX1JFR1M7IHJlZ25vKyspCisJeworCSAgLypyZWdhZGRyID0gcmVnaXN0ZXJfYWRkciAocmVnbm8sIG9mZnNldCk7Ki8KKwkgIHJlZ2FkZHIgPSByZWdubzsKKwkgIGVycm5vID0gMDsKKwkgIHB0cmFjZSAoNiwgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnYWRkciwKKwkJICByZWFkX3JlZ2lzdGVyIChyZWdubykpOworCSAgaWYgKGVycm5vICE9IDApCisJICAgIHsKKwkgICAgICBzcHJpbnRmIChidWYsICJ3cml0aW5nIGFsbCByZWdzLCBudW1iZXIgJWQiLCByZWdubyk7CisJICAgICAgcGVycm9yX3dpdGhfbmFtZSAoYnVmKTsKKwkgICAgfQorCX0KK30KKwwKKy8qKiogRXh0ZW5zaW9ucyB0byAgY29yZSBhbmQgZHVtcCBmaWxlcywgZm9yIEdEQi4gKi8KKworZXh0ZXJuIHVuc2lnbmVkIGludCBsYXN0X2ZyYW1lX29mZnNldDsKKworI2lmZGVmIFBZUkFNSURfQ09SRQorCisvKiBDYW4ndCBtYWtlIGRlZmluaXRpb25zIGhlcmUgc3RhdGljLCBzaW5jZSBjb3JlZmlsZS5jIG5lZWRzIHRoZW0KKyAgIHRvIGRvIGJvdW5kcyBjaGVja2luZyBvbiB0aGUgY29yZS1maWxlIGFyZWFzLiBPIHdlbGwuICovCisKKy8qIGhhdmUgdHdvIHN0YWNrczogb25lIGZvciBkYXRhLCBvbmUgZm9yIHJlZ2lzdGVyIHdpbmRvd3MuICovCitleHRlcm4gQ09SRV9BRERSIHJlZ19zdGFja19zdGFydDsKK2V4dGVybiBDT1JFX0FERFIgcmVnX3N0YWNrX2VuZDsKKworLyogbmVlZCB0aGlzIHNvIHdlIGNhbiBmaW5kIHRoZSBnbG9iYWwgcmVnaXN0ZXJzOiB0aGV5IG5ldmVyIGdldCBzYXZlZC4gKi8KK0NPUkVfQUREUiBnbG9iYWxfcmVnX29mZnNldDsKK3N0YXRpYyBDT1JFX0FERFIgbGFzdF9mcmFtZV9hZGRyZXNzOworQ09SRV9BRERSIGxhc3RfZnJhbWVfb2Zmc2V0OworCisKKy8qIEFkZHJlc3MgaW4gY29yZSBmaWxlIG9mIHN0YXJ0IG9mIHJlZ2lzdGVyIHdpbmRvdyBzdGFjayBhcmVhLgorICAgRG9uJ3Qga25vdyBpZiBpcyB0aGlzIGFueSBvZiBtZWFuaW5nZnVsLCB1c2VmdWwgb3IgbmVjZXNzYXJ5LiAgICovCitleHRlcm4gaW50IHJlZ19zdGFja19vZmZzZXQ7CisKKyNlbmRpZiAvKiBQWVJBTUlEX0NPUkUgKi8gIAorCisMCisvKiBXb3JrIHdpdGggY29yZSBkdW1wIGFuZCBleGVjdXRhYmxlIGZpbGVzLCBmb3IgR0RCLiAKKyAgIFRoaXMgY29kZSB3b3VsZCBiZSBpbiBjb3JlZmlsZS5jIGlmIGl0IHdlcmVuJ3QgbWFjaGluZS1kZXBlbmRlbnQuICovCisKK3ZvaWQKK2NvcmVfZmlsZV9jb21tYW5kIChmaWxlbmFtZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmZpbGVuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGludCB2YWw7CisgIGV4dGVybiBjaGFyIHJlZ2lzdGVyc1tdOworCisgIC8qIERpc2NhcmQgYWxsIHZlc3RpZ2VzIG9mIGFueSBwcmV2aW91cyBjb3JlIGZpbGUKKyAgICAgYW5kIG1hcmsgZGF0YSBhbmQgc3RhY2sgc3BhY2VzIGFzIGVtcHR5LiAgKi8KKworICBpZiAoY29yZWZpbGUpCisgICAgZnJlZSAoY29yZWZpbGUpOworICBjb3JlZmlsZSA9IDA7CisKKyAgaWYgKGNvcmVjaGFuID49IDApCisgICAgY2xvc2UgKGNvcmVjaGFuKTsKKyAgY29yZWNoYW4gPSAtMTsKKworICBkYXRhX3N0YXJ0ID0gMDsKKyAgZGF0YV9lbmQgPSAwOworICBzdGFja19zdGFydCA9IFNUQUNLX0VORF9BRERSOworICBzdGFja19lbmQgPSBTVEFDS19FTkRfQUREUjsKKworI2lmZGVmIFBZUkFNSURfQ09SRQorICByZWdfc3RhY2tfc3RhcnQgPSBDT05UUk9MX1NUQUNLX0FERFI7CisgIHJlZ19zdGFja19lbmQgPSBDT05UUk9MX1NUQUNLX0FERFI7CS8qIHRoaXMgaXNuJ3Qgc3RyaWN0bHkgdHJ1ZS4uLiovCisjZW5kaWYgLyogUFlSQU1JRF9DT1JFICovCisKKyAgLyogTm93LCBpZiBhIG5ldyBjb3JlIGZpbGUgd2FzIHNwZWNpZmllZCwgb3BlbiBpdCBhbmQgZGlnZXN0IGl0LiAgKi8KKworICBpZiAoZmlsZW5hbWUpCisgICAgeworICAgICAgZmlsZW5hbWUgPSB0aWxkZV9leHBhbmQgKGZpbGVuYW1lKTsKKyAgICAgIG1ha2VfY2xlYW51cCAoZnJlZSwgZmlsZW5hbWUpOworICAgICAgCisgICAgICBpZiAoaGF2ZV9pbmZlcmlvcl9wICgpKQorCWVycm9yICgiVG8gbG9vayBhdCBhIGNvcmUgZmlsZSwgeW91IG11c3Qga2lsbCB0aGUgcHJvZ3JhbSB3aXRoIFwia2lsbFwiLiIpOworICAgICAgY29yZWNoYW4gPSBvcGVuIChmaWxlbmFtZSwgT19SRE9OTFksIDApOworICAgICAgaWYgKGNvcmVjaGFuIDwgMCkKKwlwZXJyb3Jfd2l0aF9uYW1lIChmaWxlbmFtZSk7CisgICAgICAvKiA0LjItc3R5bGUgKGFuZCBwZXJoYXBzIGFsc28gc3lzVi1zdHlsZSkgY29yZSBkdW1wIGZpbGUuICAqLworICAgICAgeworCXN0cnVjdCB1c2VyIHU7CisKKwl1bnNpZ25lZCBpbnQgcmVnX29mZnNldDsKKworCXZhbCA9IG15cmVhZCAoY29yZWNoYW4sICZ1LCBzaXplb2YgdSk7CisJaWYgKHZhbCA8IDApCisJICBwZXJyb3Jfd2l0aF9uYW1lICgiTm90IGEgY29yZSBmaWxlOiByZWFkaW5nIHVwYWdlIik7CisJaWYgKHZhbCAhPSBzaXplb2YgdSkKKwkgIGVycm9yICgiTm90IGEgY29yZSBmaWxlOiBjb3VsZCBvbmx5IHJlYWQgJWQgYnl0ZXMiLCB2YWwpOworCWRhdGFfc3RhcnQgPSBleGVjX2RhdGFfc3RhcnQ7CisKKwlkYXRhX2VuZCA9IGRhdGFfc3RhcnQgKyBOQlBHICogdS51X2RzaXplOworCWRhdGFfb2Zmc2V0ID0gTkJQRyAqIFVQQUdFUzsKKwlzdGFja19vZmZzZXQgPSBOQlBHICogKFVQQUdFUyArIHUudV9kc2l6ZSk7CisKKwkvKiBmaW5kIHJlZ2lzdGVycyBpbiBjb3JlIGZpbGUgKi8KKyNpZmRlZiBQWVJBTUlEX1BUUkFDRQorCXN0YWNrX3N0YXJ0ID0gc3RhY2tfZW5kIC0gTkJQRyAqIHUudV91c3NpemU7CisJcmVnX3N0YWNrX29mZnNldCA9IHN0YWNrX29mZnNldCArIChOQlBHICp1LnVfdXNzaXplKTsKKwlyZWdfc3RhY2tfZW5kID0gcmVnX3N0YWNrX3N0YXJ0ICsgTkJQRyAqIHUudV9jc3NpemU7CisKKwlsYXN0X2ZyYW1lX2FkZHJlc3MgPSAoKGludCkgdS51X3BjYi5wY2JfY3NwKTsKKwlsYXN0X2ZyYW1lX29mZnNldCA9IHJlZ19zdGFja19vZmZzZXQgKyBsYXN0X2ZyYW1lX2FkZHJlc3MKKwkJLSBDT05UUk9MX1NUQUNLX0FERFIgOworCWdsb2JhbF9yZWdfb2Zmc2V0ID0gKGNoYXIgKikmdSAtIChjaGFyICopJnUudV9wY2IucGNiX2dyMCA7CisKKwkvKiBza2lwIGFueSBjb250cm9sLXN0YWNrIGZyYW1lcyB0aGF0IHdlcmUgZXhlY3V0ZWQgaW4gdGhlCisJICAga2VybmVsLiAqLworCisJd2hpbGUgKDEpIHsKKwkgICAgY2hhciBidWZbNF07CisJICAgIHZhbCA9IGxzZWVrIChjb3JlY2hhbiwgbGFzdF9mcmFtZV9vZmZzZXQrKDQ3KjQpLCAwKTsKKwkgICAgaWYgKHZhbCA8IDApCisJCSAgICBwZXJyb3Jfd2l0aF9uYW1lIChmaWxlbmFtZSk7CisJICAgIHZhbCA9IG15cmVhZCAoY29yZWNoYW4sIGJ1Ziwgc2l6ZW9mIGJ1Zik7CisJICAgIGlmICh2YWwgPCAwKQorCQkgICAgcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworCisJICAgIGlmICgqKGludCAqKWJ1ZiA+PSAwKQorCQkgICAgYnJlYWs7CisJICAgIHByaW50Zl91bmZpbHRlcmVkICgic2tpcHBpbmcgZnJhbWUgJXNcbiIsIGxvY2FsX2hleF9zdHJpbmcgKGxhc3RfZnJhbWVfYWRkcmVzcykpOworCSAgICBsYXN0X2ZyYW1lX29mZnNldCAtPSBDT05UUk9MX1NUQUNLX0ZSQU1FX1NJWkU7CisJICAgIGxhc3RfZnJhbWVfYWRkcmVzcyAtPSBDT05UUk9MX1NUQUNLX0ZSQU1FX1NJWkU7CisJfQorCXJlZ19vZmZzZXQgPSBsYXN0X2ZyYW1lX29mZnNldDsKKworI2lmIDEgfHwgZGVmaW5lZChQWVJBTUlEX0NPTlRST0xfRlJBTUVfREVCVUdHSU5HKQorCXByaW50Zl91bmZpbHRlcmVkICgiQ29udHJvbCBzdGFjayBwb2ludGVyID0gJXNcbiIsCisJCWxvY2FsX2hleF9zdHJpbmcgKHUudV9wY2IucGNiX2NzcCkpOworCXByaW50Zl91bmZpbHRlcmVkICgib2Zmc2V0IHRvIGNvbnRyb2wgc3RhY2sgJWQgb3V0ZXJtb3N0IGZyYW1lICVkICglcylcbiIsCisJICAgICAgcmVnX3N0YWNrX29mZnNldCwgcmVnX29mZnNldCwgbG9jYWxfaGV4X3N0cmluZyAobGFzdF9mcmFtZV9hZGRyZXNzKSk7CisjZW5kaWYgLyogUFlSQU1JRF9DT05UUk9MX0ZSQU1FX0RFQlVHR0lORyAqLworCisjZWxzZSAvKiBub3QgUFlSQU1JRF9DT1JFICovCisJc3RhY2tfc3RhcnQgPSBzdGFja19lbmQgLSBOQlBHICogdS51X3NzaXplOworICAgICAgICByZWdfb2Zmc2V0ID0gKGludCkgdS51X2FyMCAtIEtFUk5FTF9VX0FERFI7CisjZW5kaWYgLyogbm90IFBZUkFNSURfQ09SRSAqLworCisjaWZkZWYgX19ub3Rfb25fcHlyX3lldAorCS8qIFNvbWUgbWFjaGluZXMgcHV0IGFuIGFic29sdXRlIGFkZHJlc3MgaW4gaGVyZSBhbmQgc29tZSBwdXQKKwkgICB0aGUgb2Zmc2V0IGluIHRoZSB1cGFnZSBvZiB0aGUgcmVncy4gICovCisJcmVnX29mZnNldCA9IChpbnQpIHUudV9hcjA7CisJaWYgKHJlZ19vZmZzZXQgPiBOQlBHICogVVBBR0VTKQorCSAgcmVnX29mZnNldCAtPSBLRVJORUxfVV9BRERSOworI2VuZGlmCisKKwkvKiBJIGRvbid0IGtub3cgd2hlcmUgdG8gZmluZCB0aGlzIGluZm8uCisJICAgU28sIGZvciBub3csIG1hcmsgaXQgYXMgbm90IGF2YWlsYWJsZS4gICovCisJTl9TRVRfTUFHSUMgKGNvcmVfYW91dGhkciwgMCk7CisKKwkvKiBSZWFkIHRoZSByZWdpc3RlciB2YWx1ZXMgb3V0IG9mIHRoZSBjb3JlIGZpbGUgYW5kIHN0b3JlCisJICAgdGhlbSB3aGVyZSBgcmVhZF9yZWdpc3Rlcicgd2lsbCBmaW5kIHRoZW0uICAqLworCisJeworCSAgcmVnaXN0ZXIgaW50IHJlZ25vOworCisJICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCA2NDsgcmVnbm8rKykKKwkgICAgeworCSAgICAgIGNoYXIgYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisKKwkgICAgICB2YWwgPSBsc2VlayAoY29yZWNoYW4sIHJlZ2lzdGVyX2FkZHIgKHJlZ25vLCByZWdfb2Zmc2V0KSwgMCk7CisJICAgICAgaWYgKHZhbCA8IDAKKwkJICB8fCAodmFsID0gbXlyZWFkIChjb3JlY2hhbiwgYnVmLCBzaXplb2YgYnVmKSkgPCAwKQorCQl7CisJCSAgY2hhciAqIGJ1ZmZlciA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChSRUdJU1RFUl9OQU1FIChyZWdubykpCisJCQkJCQkgICArIDMwKTsKKwkJICBzdHJjcHkgKGJ1ZmZlciwgIlJlYWRpbmcgcmVnaXN0ZXIgIik7CisJCSAgc3RyY2F0IChidWZmZXIsIFJFR0lTVEVSX05BTUUgKHJlZ25vKSk7CisJCQkJCQkgICAKKwkJICBwZXJyb3Jfd2l0aF9uYW1lIChidWZmZXIpOworCQl9CisKKwkgICAgICBpZiAodmFsIDwgMCkKKwkJcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworI2lmZGVmIFBZUkFNSURfQ09OVFJPTF9GUkFNRV9ERUJVR0dJTkcKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiW3JlZyAlcyglZCksIG9mZnNldCBpbiBmaWxlICVzPTB4JTB4LCBhZGRyID0weCUweCwgPSUweF1cbiIsCisJICAgICAgUkVHSVNURVJfTkFNRSAocmVnbm8pLCByZWdubywgZmlsZW5hbWUsCisJICAgICAgcmVnaXN0ZXJfYWRkcihyZWdubywgcmVnX29mZnNldCksCisJICAgICAgcmVnbm8gKiA0ICsgbGFzdF9mcmFtZV9hZGRyZXNzLAorCSAgICAgICooKGludCAqKWJ1ZikpOworI2VuZGlmIC8qIFBZUkFNSURfQ09OVFJPTF9GUkFNRV9ERUJVR0dJTkcgKi8KKwkgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCBidWYpOworCSAgICB9CisJfQorICAgICAgfQorICAgICAgaWYgKGZpbGVuYW1lWzBdID09ICcvJykKKwljb3JlZmlsZSA9IHNhdmVzdHJpbmcgKGZpbGVuYW1lLCBzdHJsZW4gKGZpbGVuYW1lKSk7CisgICAgICBlbHNlCisJeworCSAgY29yZWZpbGUgPSBjb25jYXQgKGN1cnJlbnRfZGlyZWN0b3J5LCAiLyIsIGZpbGVuYW1lLCBOVUxMKTsKKwl9CisKKyNpZiAxIHx8IGRlZmluZWQoUFlSQU1JRF9DT05UUk9MX0ZSQU1FX0RFQlVHR0lORykKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiUHJvdmlkaW5nIENTUCAoJXMpIGFzIG5vbWluYWwgYWRkcmVzcyBvZiBjdXJyZW50IGZyYW1lLlxuIiwKKwkgICAgICBsb2NhbF9oZXhfc3RyaW5nKGxhc3RfZnJhbWVfYWRkcmVzcykpOworI2VuZGlmIFBZUkFNSURfQ09OVFJPTF9GUkFNRV9ERUJVR0dJTkcKKyAgICAgIC8qIEZJWE1FOiBXaGljaCBvZiB0aGUgZm9sbG93aW5nIGlzIGNvcnJlY3Q/ICovCisjaWYgMAorICAgICAgc2V0X2N1cnJlbnRfZnJhbWUgKCBjcmVhdGVfbmV3X2ZyYW1lIChyZWFkX3JlZ2lzdGVyIChGUF9SRUdOVU0pLAorCQkJCQkgICAgcmVhZF9wYyAoKSkpOworI2Vsc2UKKyAgICAgIHNldF9jdXJyZW50X2ZyYW1lICggY3JlYXRlX25ld19mcmFtZSAobGFzdF9mcmFtZV9hZGRyZXNzLAorCQkJCQkgICAgcmVhZF9wYyAoKSkpOworI2VuZGlmCisKKyAgICAgIHNlbGVjdF9mcmFtZSAoZ2V0X2N1cnJlbnRfZnJhbWUgKCksIDApOworICAgICAgdmFsaWRhdGVfZmlsZXMgKCk7CisgICAgfQorICBlbHNlIGlmIChmcm9tX3R0eSkKKyAgICBwcmludGZfdW5maWx0ZXJlZCAoIk5vIGNvcmUgZmlsZSBub3cuXG4iKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9yZGktc2hhcmUvTWFrZWZpbGUuYW0gYi9nZGIvcmRpLXNoYXJlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNjNkMWMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTkgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gZ2VuZXJhdGUgTWFrZWZpbGUuaW4KKworQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cworCitub2luc3RfTElCUkFSSUVTID0gbGliYW5nc2QuYQorCitsaWJhbmdzZF9hX1NPVVJDRVMgPSAgYXJkaS5jIGJ5dGVzZXguYyBjcmMuYyBkZXZzdy5jIGRyaXZlcnMuYyBldGhlcmRydi5jIFwKKyAgICAgICAgICAgICAgICAgICAgICBob3N0Y2hhbi5jIGhzeXMuYyBsb2dnaW5nLmMgbXNnYnVpbGQuYyBwYXJhbXMuYyByeC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICBzZXJkcnYuYyBzZXJwYXJkci5jIHR4LmMgdW5peGNvbW0uYworCitub2luc3RfSEVBREVSUyA9IGFkcC5oIGFkcGVyci5oIGFuZ2VsLmggYXJkaS5oIGFybWRiZy5oIGJ1ZmZlcnMuaCBieXRlc2V4LmggXAorICAgICAgICAgICAgICAgICBjaGFuZGVmcy5oIGNoYW5uZWxzLmggY2hhbnByaXYuaCBjcmMuaCBkYmdfY29uZi5oIGRiZ19jcC5oIFwKKyAgICAgICAgICAgICAgICAgZGJnX2hpZi5oIGRiZ19yZGkuaCBkZXZjbG50LmggZGV2aWNlcy5oIGRldnN3LmggZHJpdmVycy5oIFwKKyAgICAgICAgICAgICAgICAgZW5kaWFuLmggZXRoZXJuZXQuaCBob3N0LmggaG9zdGNoYW4uaCBoc3lzLmggbG9nZ2luZy5oIFwKKyAgICAgICAgICAgICAgICAgbXNnYnVpbGQuaCBwYXJhbXMuaCByeHR4Lmggc3lzLmggdW5peGNvbW0uaAorCitFWFRSQV9ESVNUID0gUkVBRE1FLkNZR05VUworCitJTkNMVURFUyA9ICAtRFJFVFJBTlMgLURBUk1fUkVMRUFTRT0nIkJlcmtlbGV5IExpY2VuY2UgZm9yIEN5Z251cyInCmRpZmYgLS1naXQgYS9nZGIvcmRpLXNoYXJlL01ha2VmaWxlLmluIGIvZ2RiL3JkaS1zaGFyZS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTQxMDA1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDI5MyBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjNiIGZyb20gTWFrZWZpbGUuYW0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCisKK1NIRUxMID0gQFNIRUxMQAorCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorCitiaW5kaXIgPSBAYmluZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACitsaWJkaXIgPSBAbGliZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK29sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKKworREVTVERJUiA9CisKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACisKK3RvcF9idWlsZGRpciA9IC4KKworQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKKworSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK3RyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK0NDID0gQENDQAorRVhFRVhUID0gQEVYRUVYVEAKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitQQUNLQUdFID0gQFBBQ0tBR0VACitSQU5MSUIgPSBAUkFOTElCQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorCitBVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCisKK25vaW5zdF9MSUJSQVJJRVMgPSBsaWJhbmdzZC5hCisKK2xpYmFuZ3NkX2FfU09VUkNFUyA9ICBhcmRpLmMgYnl0ZXNleC5jIGNyYy5jIGRldnN3LmMgZHJpdmVycy5jIGV0aGVyZHJ2LmMgXAorICAgICAgICAgICAgICAgICAgICAgIGhvc3RjaGFuLmMgaHN5cy5jIGxvZ2dpbmcuYyBtc2didWlsZC5jIHBhcmFtcy5jIHJ4LmMgXAorICAgICAgICAgICAgICAgICAgICAgIHNlcmRydi5jIHNlcnBhcmRyLmMgdHguYyB1bml4Y29tbS5jCisKK25vaW5zdF9IRUFERVJTID0gYWRwLmggYWRwZXJyLmggYW5nZWwuaCBhcmRpLmggYXJtZGJnLmggYnVmZmVycy5oIGJ5dGVzZXguaCBcCisgICAgICAgICAgICAgICAgIGNoYW5kZWZzLmggY2hhbm5lbHMuaCBjaGFucHJpdi5oIGNyYy5oIGRiZ19jb25mLmggZGJnX2NwLmggXAorICAgICAgICAgICAgICAgICBkYmdfaGlmLmggZGJnX3JkaS5oIGRldmNsbnQuaCBkZXZpY2VzLmggZGV2c3cuaCBkcml2ZXJzLmggXAorICAgICAgICAgICAgICAgICBlbmRpYW4uaCBldGhlcm5ldC5oIGhvc3QuaCBob3N0Y2hhbi5oIGhzeXMuaCBsb2dnaW5nLmggXAorICAgICAgICAgICAgICAgICBtc2didWlsZC5oIHBhcmFtcy5oIHJ4dHguaCBzeXMuaCB1bml4Y29tbS5oCisKK0VYVFJBX0RJU1QgPSBSRUFETUUuQ1lHTlVTCisKK0lOQ0xVREVTID0gIC1EUkVUUkFOUyAtREFSTV9SRUxFQVNFPSciQmVya2VsZXkgTGljZW5jZSBmb3IgQ3lnbnVzIicKK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK21raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMKK0NPTkZJR19DTEVBTl9GSUxFUyA9IAorTElCUkFSSUVTID0gICQobm9pbnN0X0xJQlJBUklFUykKKworCitERUZTID0gQERFRlNAIC1JLiAtSSQoc3JjZGlyKSAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorTERGTEFHUyA9IEBMREZMQUdTQAorTElCUyA9IEBMSUJTQAorbGliYW5nc2RfYV9MSUJBREQgPSAKK2xpYmFuZ3NkX2FfT0JKRUNUUyA9ICBhcmRpLm8gYnl0ZXNleC5vIGNyYy5vIGRldnN3Lm8gZHJpdmVycy5vIFwKK2V0aGVyZHJ2Lm8gaG9zdGNoYW4ubyBoc3lzLm8gbG9nZ2luZy5vIG1zZ2J1aWxkLm8gcGFyYW1zLm8gcngubyBcCitzZXJkcnYubyBzZXJwYXJkci5vIHR4Lm8gdW5peGNvbW0ubworQVIgPSBhcgorQ0ZMQUdTID0gQENGTEFHU0AKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xJTksgPSAkKENDKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAKK0hFQURFUlMgPSAgJChub2luc3RfSEVBREVSUykKKworRElTVF9DT01NT04gPSAgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4gYWNsb2NhbC5tNCBjb25maWd1cmUgY29uZmlndXJlLmluCisKKworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKKworVEFSID0gdGFyCitHWklQID0gLS1iZXN0CitTT1VSQ0VTID0gJChsaWJhbmdzZF9hX1NPVVJDRVMpCitPQkpFQ1RTID0gJChsaWJhbmdzZF9hX09CSkVDVFMpCisKK2FsbDogTWFrZWZpbGUgJChMSUJSQVJJRVMpICQoSEVBREVSUykKKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuUyAuYyAubyAucworJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRATWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KQorCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgTWFrZWZpbGUKKworTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwljZCAkKHRvcF9idWlsZGRpcikgXAorCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworJChBQ0xPQ0FMX000KTogQE1BSU5UQCBjb25maWd1cmUuaW4gCisJY2QgJChzcmNkaXIpICYmICQoQUNMT0NBTCkKKworY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKKyQoc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEAkKHNyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKQorCWNkICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQorCittb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVM6CisKK2NsZWFuLW5vaW5zdExJQlJBUklFUzoKKwktdGVzdCAteiAiJChub2luc3RfTElCUkFSSUVTKSIgfHwgcm0gLWYgJChub2luc3RfTElCUkFSSUVTKQorCitkaXN0Y2xlYW4tbm9pbnN0TElCUkFSSUVTOgorCittYWludGFpbmVyLWNsZWFuLW5vaW5zdExJQlJBUklFUzoKKworLmMubzoKKwkkKENPTVBJTEUpIC1jICQ8CisKKy5zLm86CisJJChDT01QSUxFKSAtYyAkPAorCisuUy5vOgorCSQoQ09NUElMRSkgLWMgJDwKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi5vIGNvcmUgKi5jb3JlCisKK2NsZWFuLWNvbXBpbGU6CisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK21haW50YWluZXItY2xlYW4tY29tcGlsZToKKworbGliYW5nc2QuYTogJChsaWJhbmdzZF9hX09CSkVDVFMpICQobGliYW5nc2RfYV9ERVBFTkRFTkNJRVMpCisJLXJtIC1mIGxpYmFuZ3NkLmEKKwkkKEFSKSBjcnUgbGliYW5nc2QuYSAkKGxpYmFuZ3NkX2FfT0JKRUNUUykgJChsaWJhbmdzZF9hX0xJQkFERCkKKwkkKFJBTkxJQikgbGliYW5nc2QuYQorCit0YWdzOiBUQUdTCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKQorCWhlcmU9YHB3ZGAgJiYgY2QgJChzcmNkaXIpIFwKKwkgICYmIG1raWQgLWYkJGhlcmUvSUQgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgJChMSVNQKQorCXRhZ3M9OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCisJICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKKwkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKKwl0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCR1bmlxdWUkKExJU1ApJCR0YWdzIiBcCisJICB8fCAoY2QgJChzcmNkaXIpICYmIGV0YWdzICQoRVRBR1NfQVJHUykgJCR0YWdzICAkJHVuaXF1ZSAkKExJU1ApIC1vICQkaGVyZS9UQUdTKQorCittb3N0bHljbGVhbi10YWdzOgorCitjbGVhbi10YWdzOgorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRAorCittYWludGFpbmVyLWNsZWFuLXRhZ3M6CisKK2Rpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKK3RvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQorCisjIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCisjIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCisjIHRhcmZpbGUuCitkaXN0Y2hlY2s6IGRpc3QKKwktcm0gLXJmICQoZGlzdGRpcikKKwlHWklQPSQoR1pJUCkgJChUQVIpIHp4ZiAkKGRpc3RkaXIpLnRhci5negorCW1rZGlyICQoZGlzdGRpcikvPWJ1aWxkCisJbWtkaXIgJChkaXN0ZGlyKS89aW5zdAorCWRjX2luc3RhbGxfYmFzZT1gY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgOyBcCisJY2QgJChkaXN0ZGlyKS89YnVpbGQgXAorCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSQkZGNfaW5zdGFsbF9iYXNlIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0CisJLXJtIC1yZiAkKGRpc3RkaXIpCisJQGVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PSI7IFwKKwllY2hvICIkKGRpc3RkaXIpLnRhci5neiBpcyByZWFkeSBmb3IgZGlzdHJpYnV0aW9uIjsgXAorCWVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PSIKK2Rpc3Q6IGRpc3RkaXIKKwktY2htb2QgLVIgYStyICQoZGlzdGRpcikKKwlHWklQPSQoR1pJUCkgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKKwktcm0gLXJmICQoZGlzdGRpcikKK2Rpc3QtYWxsOiBkaXN0ZGlyCisJLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCisJR1pJUD0kKEdaSVApICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCisJLXJtIC1yZiAkKGRpc3RkaXIpCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwktcm0gLXJmICQoZGlzdGRpcikKKwlta2RpciAkKGRpc3RkaXIpCisJLWNobW9kIDc3NyAkKGRpc3RkaXIpCisJQGZvciBmaWxlIGluICQoRElTVEZJTEVTKTsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCisJICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCisJICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCisJZG9uZQoraW5mbzoKK2R2aToKK2NoZWNrOgoraW5zdGFsbGNoZWNrOgoraW5zdGFsbC1pbmZvOgoraW5zdGFsbC1leGVjOiAKKwlAJChOT1JNQUxfSU5TVEFMTCkKKworaW5zdGFsbC1kYXRhOiAKKwlAJChOT1JNQUxfSU5TVEFMTCkKKworaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YSBhbGwKKwlAOgorCit1bmluc3RhbGw6IAorCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0nJChJTlNUQUxMX1BST0dSQU0pIC1zJyBJTlNUQUxMX1NDUklQVD0nJChJTlNUQUxMX1BST0dSQU0pJyBpbnN0YWxsCitpbnN0YWxsZGlyczoKKworCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Cittb3N0bHljbGVhbjogIG1vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUyBtb3N0bHljbGVhbi1jb21waWxlIFwKKwkJbW9zdGx5Y2xlYW4tdGFncyBtb3N0bHljbGVhbi1nZW5lcmljCisKK2NsZWFuOiAgY2xlYW4tbm9pbnN0TElCUkFSSUVTIGNsZWFuLWNvbXBpbGUgY2xlYW4tdGFncyBjbGVhbi1nZW5lcmljIFwKKwkJbW9zdGx5Y2xlYW4KKworZGlzdGNsZWFuOiAgZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUyBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tdGFncyBcCisJCWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuCisJLXJtIC1mIGNvbmZpZy5zdGF0dXMKKworbWFpbnRhaW5lci1jbGVhbjogIG1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKKwkJbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1haW50YWluZXItY2xlYW4tdGFncyBcCisJCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4KKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKwktcm0gLWYgY29uZmlnLnN0YXR1cworCisuUEhPTlk6IG1vc3RseWNsZWFuLW5vaW5zdExJQlJBUklFUyBkaXN0Y2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKK2NsZWFuLW5vaW5zdExJQlJBUklFUyBtYWludGFpbmVyLWNsZWFuLW5vaW5zdExJQlJBUklFUyBcCittb3N0bHljbGVhbi1jb21waWxlIGRpc3RjbGVhbi1jb21waWxlIGNsZWFuLWNvbXBpbGUgXAorbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIHRhZ3MgbW9zdGx5Y2xlYW4tdGFncyBkaXN0Y2xlYW4tdGFncyBcCitjbGVhbi10YWdzIG1haW50YWluZXItY2xlYW4tdGFncyBkaXN0ZGlyIGluZm8gZHZpIGluc3RhbGxjaGVjayBcCitpbnN0YWxsLWluZm8gaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YSBpbnN0YWxsIHVuaW5zdGFsbCBhbGwgXAoraW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIFwKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgorCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2dkYi9yZGktc2hhcmUvUkVBRE1FLkNZR05VUyBiL2dkYi9yZGktc2hhcmUvUkVBRE1FLkNZR05VUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmYwNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9SRUFETUUuQ1lHTlVTCkBAIC0wLDAgKzEsNiBAQAorVGhpcyBpcyBhIHZlcnNpb24gb2YgQVJNJ3MgUkRJIGxpYnJhcnkgd2hpY2ggaGFzIGJlZW4gYmVlbiBwdXQgdW5kZXIgYQorZnJlZSBzb2Z0d2FyZSBsaWNlbnNlLgorCitTZWUgQVJNJ3MgU29mdHdhcmUgRGV2ZWxvcG1lbnQgVG9vbHMgUmVmZXJlbmNlIE1hbnVhbCAoUmVtb3RlCitEZWJ1Z2dpbmcgY2hhcHRlciksIGFuZCB0aGUgZmlsZSBnZGIvcmVtb3RlLXJkaS5jIGZvciBpbmZvcm1hdGlvbgorYWJvdXQgaG93IHRvIHVzZSBpdC4KZGlmZiAtLWdpdCBhL2dkYi9yZGktc2hhcmUvYWNsb2NhbC5tNCBiL2dkYi9yZGktc2hhcmUvYWNsb2NhbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWE4MjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9hY2xvY2FsLm00CkBAIC0wLDAgKzEsMjAyIEBACitkbmwgYWNsb2NhbC5tNCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuM2IKKworZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCitkbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCitkbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitkbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKK2RubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCitkbmwgUEFSVElDVUxBUiBQVVJQT1NFLgorCisjIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2ggLS0KKyMgc29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLgorIyBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KKworIyBzZXJpYWwgMQorCitkbmwgVXNhZ2U6CitkbmwgQU1fSU5JVF9BVVRPTUFLRShwYWNrYWdlLHZlcnNpb24sIFtuby1kZWZpbmVdKQorCitBQ19ERUZVTihBTV9JTklUX0FVVE9NQUtFLAorW0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF0pCitQQUNLQUdFPVskMV0KK0FDX1NVQlNUKFBBQ0tBR0UpCitWRVJTSU9OPVskMl0KK0FDX1NVQlNUKFZFUlNJT04pCitkbmwgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAoraWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgorICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCitmaQoraWZlbHNlKFskM10sLAorQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIpCitBQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIikpCitBQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKQorQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKQorZG5sIEZJWE1FIFRoaXMgaXMgdHJ1bHkgZ3Jvc3MuCittaXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAorQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwsICRtaXNzaW5nX2RpcikKK0FNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYsICRtaXNzaW5nX2RpcikKK0FNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UsICRtaXNzaW5nX2RpcikKK0FNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyLCAkbWlzc2luZ19kaXIpCitBTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvLCAkbWlzc2luZ19kaXIpCitBQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSldKQorCisKKyMgc2VyaWFsIDEKKworQUNfREVGVU4oQU1fUFJPR19JTlNUQUxMLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pCit0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCitBQ19TVUJTVChJTlNUQUxMX1NDUklQVClkbmwKK10pCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCisjCisKK0FDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKK1tBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCisjIEp1c3QgaW4gY2FzZQorc2xlZXAgMQorZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKKyMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKKyMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQorIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcworIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKKyMgZGlyZWN0b3J5KS4KK2lmICgKKyAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKKyAgIGlmIHRlc3QgIlskXSoiID0gIlgiOyB0aGVuCisgICAgICAjIC1MIGRpZG4ndCB3b3JrLgorICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKKyAgIGZpCisgICBpZiB0ZXN0ICJbJF0qIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKKyAgICAgICYmIHRlc3QgIlskXSoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKKyAgIGZpCisKKyAgIHRlc3QgIlskXTIiID0gY29uZnRlc3RmaWxlCisgICApCit0aGVuCisgICAjIE9rLgorICAgOgorZWxzZQorICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKK0NoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKK2ZpCitybSAtZiBjb25mdGVzdCoKK0FDX01TR19SRVNVTFQoeWVzKV0pCisKK2RubCBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSwgRElSRUNUT1JZKQorZG5sIFRoZSBwcm9ncmFtIG11c3QgcHJvcGVybHkgaW1wbGVtZW50IC0tdmVyc2lvbi4KK0FDX0RFRlVOKEFNX01JU1NJTkdfUFJPRywKK1tBQ19NU0dfQ0hFQ0tJTkcoZm9yIHdvcmtpbmcgJDIpCisjIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgorIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KKyMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCitpZiAoJDIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAkMT0kMgorICAgQUNfTVNHX1JFU1VMVChmb3VuZCkKK2Vsc2UKKyAgICQxPSIkMy9taXNzaW5nICQyIgorICAgQUNfTVNHX1JFU1VMVChtaXNzaW5nKQorZmkKK0FDX1NVQlNUKCQxKV0pCisKKyMgQWRkIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvcHRpb24gdG8gY29uZmlndXJlLgorIyBGcm9tIEppbSBNZXllcmluZworCisjIHNlcmlhbCAxCisKK0FDX0RFRlVOKEFNX01BSU5UQUlORVJfTU9ERSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKKyAgZG5sIG1haW50YWluZXItbW9kZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0CisgIEFDX0FSR19FTkFCTEUobWFpbnRhaW5lci1tb2RlLAorWyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAorICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyXSwKKyAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbCwKKyAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9bm8pCisgIEFDX01TR19SRVNVTFQoJFVTRV9NQUlOVEFJTkVSX01PREUpCisgIGlmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KKyAgICBNQUlOVD0KKyAgZWxzZQorICAgIE1BSU5UPScjTSMnCisgIGZpCisgIEFDX1NVQlNUKE1BSU5UKWRubAorXQorKQorCisjIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIFdpbjMyLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgRVhFRVhUIHRvICIuZXhlIi4KKyMgT3RoZXJ3aXNlIHNldCBpdCB0byAiIi4KKworZG5sIEFNX0VYRUVYVCgpCitkbmwgVGhpcyBrbm93cyB3ZSBhZGQgLmV4ZSBpZiB3ZSdyZSBidWlsZGluZyBpbiB0aGUgQ3lnd2luCitkbmwgZW52aXJvbm1lbnQuIEJ1dCBpZiB3ZSdyZSBub3QsIHRoZW4gaXQgY29tcGlsZXMgYSB0ZXN0IHByb2dyYW0KK2RubCB0byBzZWUgaWYgdGhlcmUgaXMgYSBzdWZmaXggZm9yIGV4ZWN1dGFibGVzLgorQUNfREVGVU4oQU1fRVhFRVhULAorW0FDX1JFUVVJUkUoW0FNX0NZR1dJTl0pCitBQ19SRVFVSVJFKFtBTV9NSU5HVzMyXSkKK0FDX01TR19DSEVDS0lORyhbZm9yIGV4ZWN1dGFibGUgc3VmZml4XSkKK0FDX0NBQ0hFX1ZBTChhbV9jdl9leGVleHQsCitbaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCithbV9jdl9leGVleHQ9LmV4ZQorZWxzZQorY2F0ID4gYW1fY190ZXN0LmMgPDwgJ0VPRicKK2ludCBtYWluKCkgeworLyogTm90aGluZyBuZWVkZWQgaGVyZSAqLworfQorRU9GCiske0NDLWNjfSAtbyBhbV9jX3Rlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgYW1fY190ZXN0LmMgJExJQlMgMT4mNQorYW1fY3ZfZXhlZXh0PQorZm9yIGZpbGUgaW4gYW1fY190ZXN0Lio7IGRvCisgICBjYXNlICRmaWxlIGluCisgICAgKi5jKSA7OworICAgICoubykgOzsKKyAgICAqKSBhbV9jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9hbV9jX3Rlc3QvL2AgOzsKKyAgIGVzYWMKK2RvbmUKK3JtIC1mIGFtX2NfdGVzdCpdKQordGVzdCB4IiR7YW1fY3ZfZXhlZXh0fSIgPSB4ICYmIGFtX2N2X2V4ZWV4dD1ubworZmkKK0VYRUVYVD0iIgordGVzdCB4IiR7YW1fY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FtX2N2X2V4ZWV4dH0KK0FDX01TR19SRVNVTFQoJHthbV9jdl9leGVleHR9KQorQUNfU1VCU1QoRVhFRVhUKV0pCisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgQ3lnd2luLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgQ1lHV0lOIHRvICJ5ZXMiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICJubyIuCisKK2RubCBBTV9DWUdXSU4oKQorQUNfREVGVU4oQU1fQ1lHV0lOLAorW0FDX0NBQ0hFX0NIRUNLKGZvciBDeWd3aW4gZW52aXJvbm1lbnQsIGFtX2N2X2N5Z3dpbiwKK1tBQ19UUllfQ09NUElMRSgsW3JldHVybiBfX0NZR1dJTjMyX187XSwKK2FtX2N2X2N5Z3dpbj15ZXMsIGFtX2N2X2N5Z3dpbj1ubykKK3JtIC1mIGNvbmZ0ZXN0Kl0pCitDWUdXSU49Cit0ZXN0ICIkYW1fY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzXSkKKworCisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgTWluZ3csIHdpdGhvdXQgdXNpbmcKKyMgQUNfQ0FOT05JQ0FMXyouICBJZiBzbywgc2V0IG91dHB1dCB2YXJpYWJsZSBNSU5HVzMyIHRvICJ5ZXMiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICJubyIuCisKK2RubCBBTV9NSU5HVzMyKCkKK0FDX0RFRlVOKEFNX01JTkdXMzIsCitbQUNfQ0FDSEVfQ0hFQ0soZm9yIE1pbmd3MzIgZW52aXJvbm1lbnQsIGFtX2N2X21pbmd3MzIsCitbQUNfVFJZX0NPTVBJTEUoLFtyZXR1cm4gX19NSU5HVzMyX187XSwKK2FtX2N2X21pbmd3MzI9eWVzLCBhbV9jdl9taW5ndzMyPW5vKQorcm0gLWYgY29uZnRlc3QqXSkKK01JTkdXMzI9Cit0ZXN0ICIkYW1fY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXNdKQorCmRpZmYgLS1naXQgYS9nZGIvcmRpLXNoYXJlL2FkcC5oIGIvZ2RiL3JkaS1zaGFyZS9hZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTlmYTRkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9hZHAuaApAQCAtMCwwICsxLDI1MjggQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qIC0qLUMtKi0KKyAqCisgKiAkUmV2aXNpb24kCisgKiAgICAgJERhdGUkCisgKgorICoKKyAqCisgKiBJTlRST0RVQ1RJT04KKyAqIC0tLS0tLS0tLS0tLQorICogVGhlIGVhcmx5IFJEUCBtZXNzYWdlIGRlZmluaXRpb25zIHdlcmUgaGVsZCBpbiBhbiBBUk0gTHRkICJhcm1kYmciCisgKiBzb3VyY2UgZmlsZS4gU2luY2UgdGhlIHJlbGV2YW50IGhlYWRlciBmaWxlcyB3ZXJlIG5vdCBleHBvcnRlZAorICogcHVibGljbHkgYXMgcGFydCBvZiBhbiBBUk0gTHRkIGNvcmUgdG9vbHMgcmVsZWFzZSwgaXQgd2FzIGEgcHJvYmxlbQorICogZm9yIGRldmVsb3BlcnMgbWFuaXB1bGF0aW5nIHRoZSB0YXJnZXQgc2lkZSBvZiB0aGUgcHJvdG9jb2wuCisgKgorICogRm9yIEFuZ2VsLCB0aGlzIG5ldyAoQU5TSSAnQycgY2xlYW4pIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIEFEUAorICogcHJvdG9jb2wuIFRoZSBoZWFkZXIgc2hvdWxkIGJlIHVzZWFibGUgYnkgYm90aCBob3N0IGFuZCB0YXJnZXQKKyAqIHN5c3RlbXMsIHRodXMgYXZvaWRpbmcgcHJvYmxlbXMgdGhhdCBjYW4gYXJpc2UgZnJvbSBkdXBsaWNhdGUKKyAqIGRlZmluaXRpb25zLiBDYXJlIGhhcyBiZWVuIHRha2VuIGluIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhpcyBoZWFkZXIKKyAqIGZpbGUgdG8gYXZvaWQgYW55IGhvc3QvdGFyZ2V0IGRpZmZlcmVuY2VzLgorICoKKyAqIE1FU1NBR0UgRk9STUFUCisgKiAtLS0tLS0tLS0tLS0tLQorICogRm9ybWF0IG9mIHRoZSAiZGF0YSIgc2VjdGlvbiBvZiBkZWJ1ZyBhbmQgYm9vdCBhZ2VudCBtZXNzYWdlcy4gVGhpcyBpcworICogdGhlIHN0YW5kYXJkIEFEUCAoQW5nZWwgRGVidWcgUHJvdG9jb2wpIG1lc3NhZ2UgZm9ybWF0OgorICoKKyAqICB1bnNpZ25lZDMyIHJlYXNvbiAgICAgLSBNYWluIGRlYnVnIHJlYXNvbiBjb2RlLgorICogIHVuc2lnbmVkMzIgZGVidWdJRCAgICAtIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgaG9zdCBkZWJ1ZyB3b3JsZDsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgLSBwcml2YXRlIHRvIGhvc3QgYW5kIHVzZWQgaW4gYW55IHRhcmdldCBpbml0aWF0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy4KKyAqICB1bnNpZ25lZDMyIE9TaW5mbzEgICAgXCBUYXJnZXQgT1MgaW5mb3JtYXRpb24gdG8gaWRlbnRpZnkgcHJvY2Vzcy90aHJlYWQKKyAqICB1bnNpZ25lZDMyIE9TaW5mbzIgICAgLyBtZW1vcnkvd29ybGQsIGV0Yy4gVGhlc2UgdHdvIGZpZWxkcyBhcmUgdGFyZ2V0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZC4KKyAqICBieXRlICAgICAgIGFyZ3Nbbl0gICAgLSBEYXRhIGZvciBtZXNzYWdlICJyZWFzb24iIGNvZGUuCisgKgorICogTk9URTogVGhlIG1lc3NhZ2UgZm9ybWF0IGlzIHRoZSBzYW1lIGZvciBzaW5nbGUgdGhyZWFkZWQgZGVidWdnaW5nLAorICogZXhjZXB0IHRoYXQgdGhlICJPU2luZm8iIGZpZWxkcyBzaG91bGQgYmUgLTEgKDB4RkZGRkZGRkYpLiBFdmVuCisgKiBzaW5nbGUtdGhyZWFkZWQgZGVidWdnaW5nICpNQVkqIGhhdmUgZGlmZmVyZW50IGhvc3Qgc3BlY2lmaWVkCisgKiBkZWJ1Z0lEIHZhbHVlcywgc28gdGhlIEFuZ2VsIGRlYnVnIHN5c3RlbSB3aWxsIHByZXNlcnZlIHRoZSAiZGVidWdJRCIKKyAqIGluZm9ybWF0aW9uIGZvciByZXBsaWVzLCBhbmQgdGhlIHJlbGV2YW50IGFzeW5jaHJvbm91cyB0YXJnZXQtdG8taG9zdAorICogbWVzc2FnZXMuIFRoZSAiZGVidWdJRCIgaXMgZGVmaW5lZCBieSB0aGUgaG9zdC1lbmQgb2YgdGhlCisgKiBwcm90b2NvbCwgYW5kIGlzIHVzZWQgYnkgdGhlIGhvc3QgdG8gZW5zdXJlIHRoYXQgbWVzc2FnZXMgYXJlCisgKiByb3V0ZWQgdG8gdGhlIGNvcnJlY3QgaGFuZGxlciBwcm9ncmFtL3ZlbmVlci4KKyAqCisgKiBUaGUgcmVhc29uIHRoZXJlIGFyZSB0d28gdGFyZ2V0IHNwZWNpZmllZCAiT1NpbmZvIiB3b3JkcyBpcyBiZWNhdXNlCisgKiB0aHJlYWQgaWRlbnRpZmllcnMgbWF5IG5vdCBiZSB1bmlxdWUgd2hlbiBwcm9jZXNzZXMvdGFza3MgaGF2ZQorICogcHJpdmF0ZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2VzLiBJdCBhbGxvd3MgbW9yZSBmbGV4aWJpbGl0eSB3aGVuCisgKiBzdXBwb3J0aW5nIG11bHRpLXRocmVhZGVkIG9yIE8vUyBhd2FyZSBkZWJ1Z2dpbmcuCisgKgorICogTk9URTogVGhlIHJlYXNvbiB0aGF0IHRoZXJlIGlzIG5vICJzaXplIiBpbmZvcm1hdGlvbiwgaXMgdGhhdCB0aGUKKyAqIG1lc3NhZ2UgSURzIHRoZW1zZWx2ZXMgZW5jb2RlIHRoZSBmb3JtYXQgb2YgYW55IGFyZ3VtZW50cy4gQWxzbyBpdAorICAqIHdvdWxkIGJlIGEgZHVwbGljYXRpb24gb2YgaW5mb3JtYXRpb24gdXNlZCBieSB0aGUgcGh5c2ljYWwKKyAqIHRyYW5zcG9ydCBsYXllciAod2hpY2ggaXMgZGlzdGluY3QgZnJvbSB0aGlzIGxvZ2ljYWwgbWVzc2FnZQorICogbGF5ZXIpLiBBbnkgcm91dGluZyBvZiBtZXNzYWdlcyB0aHJvdWdoIHByb2dyYW1zLCBob3N0cywKKyAqIGV0Yy4gc2hvdWxkIGJlIHBlcmZvcm1lZCBhdCB0aGUgcGh5c2ljYWwgbGF5ZXIsIG9yIHRoZSBib3VuZGFyaWVzCisgKiBiZXR3ZWVuIHBoeXNpY2FsIGxheWVycy4gaS5lLiBwYWNrZXQgcmVjZWl2ZWQgb24gc29ja2V0IGluIGhvc3QsCisgKiBhbmQgdHJhbnNmZXJyZWQgdG8gc2VyaWFsIHBhY2tldCBmb3IgcGFzc2luZyBvbiBkb3duIHRoZSBsaW5lLgorICoKKyAqIE5PVEU6IFBvaW50ZXJzIGFyZW4ndCBwYXNzZWQgaW4gbWVzc2FnZXMgYmVjYXVzZSB0aGV5IGFyZSBkYW5nZXJvdXMgaW4KKyAqIGEgbXVsdGktdGhyZWFkZWQgZW52aXJvbm1lbnQuCisgKgorICogQURQIFJFQVNPTiBDT0RFCisgKiAtLS0tLS0tLS0tLS0tLS0KKyAqIFRoZSBtZXNzYWdlIHJlYXNvbiBjb2RlcyBjb250YWluIHNvbWUgaW5mb3JtYXRpb24gdGhhdCB0aWVzIHRoZW0gdG8KKyAqIHRoZSBjaGFubmVsIGFuZCBkaXJlY3Rpb24gdGhhdCB0aGUgbWVzc2FnZSB3aWxsIGJlIHVzZWQgd2l0aC4gVGhpcworICogd2lsbCBlbnN1cmUgdGhhdCBldmVuIGlmIHRoZSBtZXNzYWdlICIjZGVmaW5lIG5hbWUiIGlzIG5vdAorICogY29tcGxldGVseSBkZXNjcmlwdGl2ZSwgdGhlIG1lc3NhZ2UgcmVhc29uIGNvZGUgaXMuCisgKgorICogICAgICBiMzEgICAgPSBkaXJlY3Rpb24uIDA9SG9zdC10by1UYXJnZXQ7IDE9VGFyZ2V0LXRvLUhvc3Q7CisgKiAgICAgIGIzMC0yOCA9IGRlYnVnIGFnZW50IG11bHRpLXRocmVhZGVkIGNvbnRyb2wgKHNlZSBiZWxvdykKKyAqICAgICAgYjI3LTI0ID0gcmVzZXJ2ZWQuIHNob3VsZCBiZSB6ZXJvLgorICogICAgICBiMjMtMTYgPSBjaGFubmVsaWQuIFRoZSBmaXhlZCBBbmdlbCBjaGFubmVsIG51bWJlcgorICogICAgICAgICAgICAgICAoc2VlICJjaGFubmVscy5oIikuCisgKiAgICAgIGIxNS0wICA9IG1lc3NhZ2UgcmVhc29uIGNvZGUuCisgKgorICogSXQgaXMgdW5mb3J0dW5hdGUgdGhhdCB0byBhaWQgdGhlIGVycm9yLWNoZWNraW5nIGNhcGFiaWxpdGllcyBvZgorICogdGhlIEFuZ2VsIGNvbW11bmljYXRpb25zIHdlIGhhdmUgY2hhbmdlZCB0aGUgbWVzc2FnZSBudW1iZXJzIGZyb20KKyAqIHRoZSBvcmlnaW5hbCBBUk0gTHRkIFJEUC4gSG93ZXZlciB0aGlzIGFsc28gaGFzIGJlbmVmaXRzLCBpbiB0aGF0CisgKiB0aGUgQW5nZWwgd29yayBpcyBtZWFudCB0byBiZSBhIGNsZWFuIGJyZWFrLgorICoKKyAqIEhvd2V2ZXIsIGl0IGlzbid0IHNvIGJhZCBzaW5jZSBldmVuIHRob3VnaCB0aGUgbnVtYmVycyBhcmUKKyAqIGRpZmZlcmVudCwgdGhlIG1ham9yaXR5IG9mIHRoZSByZWFzb24gY29kZXMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lCisgKiBmdW5jdGlvbmFsaXR5IGFzIHRoZSBvcmlnaW5hbCBSRFAgbWVzc2FnZXMuCisgKgorICogTk9URVMKKyAqIC0tLS0tCisgKiBJdCB3b3VsZCBiZSBpZGVhbCB0byB1c2UgInJwY2dlbiIgKG9yIHNvbWUgZXF1aXZhbGVudCkgdG8KKyAqIGF1dG9tYXRpY2FsbHkgbWFpbnRhaW4gY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHRoZSB0YXJnZXQgYW5kIGhvc3QKKyAqIGVuZHMgb2YgdGhlIHByb3RvY29sLiBIb3dldmVyLCBBUk0gTHRkIGV4cHJlc3NlZCB0aGF0IHRoZSBtZXNzYWdlCisgKiBoYW5kbGluZyBzaG91bGQgYmUgaGFuZC1jb2RlZCwgdG8gYXZvaWQgZGVwZW5kYW5jZSBvbiBleHRlcm5hbAorICogdG9vbHMuCisgKgorICogQWxsIG90aGVyIGNoYW5uZWxzIGhhdmUgdW5kZWZpbmVkIGRhdGEgZm9ybWF0cyBhbmQgYXJlIHB1cmVseQorICogYXBwbGljYXRpb24gZGVmaW5lZC4gVGhlIEMgbGlicmFyeSAiX3N5c18iIHN1cHBvcnQgd2lsbCBwcm92aWRlIGEKKyAqIHZlbmVlciB0byBwZXJmb3JtIG1lc3NhZ2UgYmxvY2sgb3BlcmF0aW9ucyBhcyByZXF1aXJlZC4KKyAqCisgKiBJdCBpcyBJTVBMSUVEIHRoYXQgYWxsIG9mIHRoZSBBRFAgbWVzc2FnZXMgd2lsbCBmaXQgd2l0aGluIHRoZQorICogYnVmZmVyIERBVEFTSVpFLiBUaGlzIGhhcyBhIG1pbmltdW0gdmFsdWUsIGNhbGN1bGF0ZWQgZnJvbQorICogQlVGRkVSTUlOU0laRS4KKyAqCisgKiBBbGwgbWVzc2FnZXMgYXJlIHBhc3NlZCBhbmQgcmVjZWl2ZWQgdG8gdGhlIGNoYW5uZWwgc3lzdGVtIGluIGxpdHRsZQorICogZW5kaWFuIG9yZGVyIChpZS4gdXNlIGxpdHRsZSBlbmRpYW4gb3JkZXIgd2hlbiB3cml0aW5nIGEgd29yZCBhcworICogYSBzZXF1ZW5jZSBvZiBieXRlcyB3aXRoaW4gYSBtZXNzYWdlKS4KKyAqCisgKiBBIHJlcGx5IC8gYWNrbm93bGVkZ2VtZW50IHRvIGFuIEFEUCBtZXNzYWdlIGlzIGFsd2F5cyBzZW50IGFuZCBoYXMgdGhlCisgKiBzYW1lIHJlYXNvbiBjb2RlIGFzIHRoZSBvcmlnaW5hbCBleGNlcHQgdGhhdCB0aGUgVHRvSCAvIEh0b1QgYml0IGlzCisgKiByZXZlcnNlZC4gIFRoaXMgbWFrZXMgaXQgc2ltcGxlIHRvIGNoZWNrIHRoYXQgdGhlIHJlcGx5IHJlYWxseQorICogaXMgYSByZXBseSB0byB0aGUgbWVzc2FnZSB3aGljaCB3YXMganVzdCBzZW50ISAgW0Jvb3QgQ2hhbm5lbCBtZXNzYWdlcworICogYWxzbyByZXF1aXJlIHRoYXQgdGhpcyBwcm90b2NvbCBpcyB1c2VkXS4KKyAqLworCisjaWZuZGVmIGFuZ2VsX2FkcF9oCisjZGVmaW5lIGFuZ2VsX2FkcF9oCisKKyNpbmNsdWRlICJjaGFuZGVmcy5oIgorCisKKy8qCisgKiBCdWZmZXIgbWluaW11bSBzaXplcworICovCisKKy8qIHRoZSBtaW5pbXVtIHRhcmdldCBpbnRlcm5hbCBzaXplICovCisjZGVmaW5lIEFEUF9CVUZGRVJfTUlOX1NJWkUgKDI1NikKKworLyogYSB3b3JkIGlzIGFsd2F5cyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlIGluIHRoZSB0YXJnZXQgKi8KKyNkZWZpbmUgQURQX0JVRkZFUl9NQVhfSU5URVJOQUwgKHNpemVvZih3b3JkKSkKKworLyogdGhlIG1pbmltdW0gYXZhaWxhYmxlIGRhdGEgcG9ydGlvbiAqLworI2RlZmluZSBBRFBfQlVGRkVSX01JTl9EQVRBU0laRSBcCisgICAgKEFEUF9CVUZGRVJfTUlOX1NJWkUgLSBBRFBfQlVGRkVSX01BWF9JTlRFUk5BTCAtIENIQU5fSEVBREVSX1NJWkUpCisKKy8qCisgKiB0aGUgc3BhY2UgdGFrZW4gdXAgYnkgdGhlIHN0YW5kYXJkIEFEUCBoZWFkZXIKKyAqIChyZWFzb24sIGRlYnVnSUQsIE9TaW5mbzEsIE9TaW5mbzIpCisgKi8KKyNkZWZpbmUgQURQX0RFRkFVTFRfSEVBREVSX1NJWkUgKDQqc2l6ZW9mKHdvcmQpKQorCisKKy8qIDhiaXQgQURQIHZlcnNpb24gaWRlbnRpZmljYXRpb24gKi8KKyNkZWZpbmUgQURQVlNOICAoMHgwMykKKy8qIFRoaXMgdmFsdWUgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHByb3RvY29sIHZlcnNpb24gc3VwcG9ydGVkCisgKiBieSB0YXJnZXQgb3IgaG9zdCBzeXN0ZW1zLiBUaGlzIHZlcnNpb24gbnVtYmVyIHNob3VsZCBvbmx5IGJlCisgKiBjaGFuZ2VkIGlmIHRoZSBwcm90b2NvbCB1bmRlcmdvZXMgYSBub24tYmFja3dhcmQgY29tcGF0aWJsZQorICogY2hhbmdlLiBJdCBzaG91bGQgKk5PVCogYmUgdXNlZCB0byByZWZsZWN0IGV4dGVuc2lvbnMgdG8gdGhlCisgKiBwcm90b2NvbC4gU3VjaCBleHRlbnNpb25zIGNhbiBiZSBhZGRlZCB0byB0aGUgZXhpc3RpbmcgcHJvdG9jb2wKKyAqIHZlcnNpb24gYnkgYWxsb2NhdGluZyBuZXcgcmVhc29uIGNvZGVzLCBhbmQgYnkgZXh0ZW5kaW5nIHRoZQorICogQURQX0luZm8gbWVzc2FnZSB0byBpZGVudGlmeSBuZXcgZmVhdHVyZXMuCisgKi8KKworLyogVGhlIGZvbGxvd2luZyB2YWx1ZSBpcyB1c2VkIGluIHRoZSBPU2luZm8gZmllbGRzIGZvcgorICogc2luZ2xlLXRocmVhZGVkIG1lc3NhZ2VzLCBvciB3aGVyZSB0aGUgaG9zdCB3YW50cyB0byBhbHRlciB0aGUKKyAqIGdsb2JhbCBDUFUgc3RhdGUuIE5PVEU6IFRoZSAiZGVidWdJRCIgZmllbGQgc2hvdWxkIGFsd2F5cyBiZQorICogZGVmaW5lZCBieSB0aGUgaG9zdCwgYW5kIHJldHVybmVkIGluIHRhcmdldCBpbml0aWF0ZWQgbWVzc2FnZXMuIFRoZQorICogb25seSBleGNlcHRpb24gdG8gdGhpcyBydWxlIGlzIHRoZSBBRFBfQm9vdGVkIG1lc3NhZ2UgYXQgdGhlCisgKiBzdGFydC1vZi1kYXkuCisgKi8KKyNkZWZpbmUgQURQX0hhbmRsZVVua25vd24gKC0xKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQURQIHJlYXNvbiBjb2RlIHN1YmZpZWxkcworICoKKyAqLworCisvKiBUaGUgZm9sbG93aW5nIGJpdHMgYXJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGJhc2ljIGRpcmVjdGlvbiBvZgorICogbWVzc2FnZXMuIFRoaXMgYWxsb3dzIHNvbWUgZXh0cmEgY2hlY2tpbmcgb2YgbWVzc2FnZSB2YWxpZGl0eSB0byBiZQorICogcGVyZm9ybWVkLCBhcyB3ZWxsIGFzIHByb3ZpZGluZyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBtZXNzYWdlIHRoYXQKKyAqIG1heSBub3QgYmUgYXZhaWxhYmxlIGluIHRoZSAiY3BwIiBtYWNybzoKKyAqLworI2RlZmluZSBIdG9UICAgICgodW5zaWduZWQpMCA8PCAzMSkgICAgIC8qIEhvc3QtdG8tVGFyZ2V0IG1lc3NhZ2UgKi8KKyNkZWZpbmUgVHRvSCAgICAoKHVuc2lnbmVkKTEgPDwgMzEpICAgICAvKiBUYXJnZXQtdG8tSG9zdCBtZXNzYWdlICovCisKKy8qIFRoZSBmb2xsb3dpbmcgYml0cyBhcmUgdXNlZCB0byBjb250cm9sIGhvdyB0aGUgdGFyZ2V0IHN5c3RlbQorICogZXhlY3V0ZXMgd2hpbHN0IHByb2Nlc3NpbmcgbWVzc2FnZXMuIFRoaXMgYWxsb3dzIGZvciBPL1Mgc3BlY2lmaWMKKyAqIGhvc3QtYmFzZWQgZGVidWcgcHJvZ3JhbXMgdG8gaW50ZXJyb2dhdGUgc3lzdGVtIHN0cnVjdHVyZXMgd2hpbHN0CisgKiBlbnN1cmluZyB0aGF0IHRoZSBhY2Nlc3MgaXMgYXRvbWljIHdpdGhpbiB0aGUgY29uc3RyYWludHMgaW1wb3NlZAorICogYnkgdGhlIHRhcmdldCBPL1MuCisgKgorICogTk9URTogVGhhdCBvbmx5IHRoZSBjaGFubmVsIGlzIGluc2VydGVkIGludG8gdGhlIHJlYXNvbiBjb2RlCisgKiBhdXRvbWF0aWNhbGx5LiAgVGh1cyBib3RoIGRpcmVjdGlvbiBhbmQgbXVsdGkgdGhyZWFkIGNvbnRyb2wgYml0cworICogbXVzdCBiZSBhZGRlZCBieSB0aGUgaG9zdCAvIHRhcmdldC4KKyAqLworLyogRGlzYWJsZSBGSVEgd2hpbHN0IHByb2Nlc3NpbmcgbWVzc2FnZSAqLworI2RlZmluZSBEaXNhYmxlRklRICAgICAgICAgICAgICAoMSA8PCAzMCkKKy8qIERpc2FibGUgSVJRIHdoaWxzdCBwcm9jZXNzaW5nIG1lc3NhZ2UgKi8KKyNkZWZpbmUgRGlzYWJsZUlSUSAgICAgICAgICAgICAgKDEgPDwgMjkpCisvKiBEaXNhYmxlIE8vUyBwcmUtZW1wdGlvbiB3aGlsc3QgcHJvY2Vzc2luZyBtZXNzYWdlICovCisjZGVmaW5lIERpc2FibGVQcmVlbXB0aW9uICAgICAgICgxIDw8IDI4KQorCisvKiBUaGUgY2hhbm5lbCBpZGVudGlmaWNhdGlvbiBudW1iZXIgaXMgaGVsZCBpbiB0aGUgcmVhc29uIGNvZGUgYXMgYQorICogY2hlY2s6CisgKi8KKyNkZWZpbmUgQURQQ0hBTk5FTChiKSAgICgoKGIpICYgMHhGRikgPDwgMTYpCisKKy8qIFRoZSBmb2xsb3dpbmcgbWFjcm8gY29uc3RydWN0cyB0aGUgcmVhc29uIGNvZGUgbnVtYmVyLCBmcm9tIHRoZQorICogdmFyaW91cyBmaWVsZHMgLSBub3RlIHRoYXQgdGhlIGRpcmVjdGlvbiBpcyBOT1QgaW5sY3VkZWQgc2luY2UKKyAqIHRoaXMgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBIb3N0IG9yIFRhcmdldCBzeXN0ZW0gaXMgaW5jbHVkaW5nCisgKiB0aGlzIGZpbGUhCisgKi8KKyNkZWZpbmUgQURQUkVBU09OKGMscikgICAgICAgIChBRFBDSEFOTkVMKGMpIHwgKChyKSAmIDB4RkZGRikpCisKKy8qIFRoaXMgbWFjcm9zIGlzIHVzZWQgd2hlbiBjb25zdHJ1Y3RpbmcgbWFuaWZlc3RzIGZvciBzdWItcmVhc29uCisgKiBjb2Rlcy4gQXQgdGhlIG1vbWVudCBpdCBpcyBpZGVudGljYWwgdG8gdGhlIG1haW4gcmVhc29uIG1hY3JvLiBJZgorICogZGVzaXJlZCB3ZSBjb3VsZCBhZGQgYSBuZXcgYml0IHRoYXQgZXhwbGljaXRseSBpZGVudGlmaWVzIHRoZSB2YWx1ZQorICogYXMgYSBzdWItcmVhc29uIGNvZGUsIHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgbWFpbgorICogbWVzc2FnZSBJRCB3b3VsZCBiZSB6ZXJvLgorICovCisjZGVmaW5lIEFEUFNVQlJFQVNPTihjLHIpICAgICAoQURQQ0hBTk5FTChjKSB8ICgocikgJiAweEZGRkYpKQorCisvKiBBbGwgb3RoZXIgdW5kZWZpbmVkIGJpdHMgYXJlIHJlc2VydmVkLCBhbmQgc2hvdWxkIGJlIHplcm8uICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBjaGFubmVsX0JPT1QgbWVzc2FnZXMKKyAqCisgKi8KKworLyogVGhlIEJPT1QgYWdlbnQgb25seSBzdXBwb3J0cyBhIGZldyBtZXNzYWdlcy4gVGhleSBhcmUgdXNlZCBwdXJlbHkKKyAqIHRvIGNvbnRyb2wgdGhlICJzdGFydC1vZi1kYXkiIGNvbm5lY3Rpb24gdG8gYSBob3N0IHByb2dyYW0uIEFsbAorICogQW5nZWwgc3lzdGVtcyB3aXRoIGhvc3QgY29tbXVuaWNhdGlvbnMgKk1VU1QqIHByb3ZpZGUgdGhlIEJPT1QKKyAqIGFnZW50LCBldmVuIGlmIHRoZXkgZG9uJ3QgaGF2ZSBzdXBwb3J0IGZvciBlaXRoZXIgdGhlIHNpbmdsZS0gb3IKKyAqIG11bHRpLXRocmVhZGVkIGRlYnVnIGFnZW50cy4KKyAqCisgKiBUaGUgd2F5IHRoZSBCT09UIGNoYW5uZWwgd2lsbCBiZSB1c2VkIG9uIHN0YXJ0dXAgd2lsbCBiZSBhcyBmb2xsb3dzOgorICoKKyAqIGEpIFRhcmdldCBib2FyZCBpcyBwb3dlcmVkIHVwIGJlZm9yZSBob3N0IGRlYnVnZ2VyIGlzIGludm9rZWQKKyAqCisgKiBBZnRlciBzd2l0Y2hpbmcgb24gdGhlIHRhcmdldCBhbmQgaW5pdGlhbGlzYXRpb24gaXMgY29tcGxldGVkIHRoZQorICogdGFyZ2V0IHdpbGwgc2VuZCBhbiBBRFBfQm9vdGVkIG9yIEFEUF9SZXNldCBtZXNzYWdlLiAgVGhlIGRlYnVnZ2VyCisgKiBoYXMgbm90IGJlZW4gc3RhcnRlZCB5ZXQgc28gdGhpcyBtZXNzYWdlIHdpbGwgbm90IGJlIHJlY2VpdmVkLiAgSW4KKyAqIGEgc2VyaWFsIHdvcmxkIHRoaXMgbWFrZXMgaXQgaW1wb3J0YW50IHRoYXQgYW55IGJ1ZmZlcnMgb24gdGhlIGhvc3QKKyAqIHNpZGUgYXJlIGZsdXNoZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uIG9mIHRoZSBkZWJ1Z2dlciwgYW5kIGluIGFuCisgKiBFdGhlcm5ldCB3b3JsZCBpdCBtYWtlcyBpdCBpbXBvcnRhbnQgdGhhdCB0aGUgdGFyZ2V0IGNhbiBjb3BlIHdpdGggdGhlCisgKiBtZXNzYWdlIG5vdCBiZWluZyByZWNlaXZlZC4KKyAqCisgKiBFdmVudHVhbGx5IHRoZSBEZWJ1Z2dlciB3aWxsIGJlIHN0YXJ0ZWQgdXAgYW5kIHdpbGwgc2VuZCBhbgorICogQURQX1JlYm9vdCBvciBBRFBfUmVzZXQgcmVxdWVzdC4gIFRoZSB0YXJnZXQgd2lsbCByZXNwb25kIHRvIHRoaXMgd2l0aAorICogYW4gQURQX1JlYm9vdCBvciBBRFBfUmVzZXQgYWNrbm93bGRlZ2UgYW5kIHdpbGwgdGhlbiByZWJvb3QsIGZpbmFsbHkKKyAqIHNlbmRpbmcgYW4gQURQX1JlYm9vdGVkIHdoZW4gaXQgaGFzIGRvbmUgYWxsIGl0IG5lZWRzIHRvIGRvICh2ZXJ5IGxpdHRsZQorICogaW4gdGhlIGNhc2Ugb2YgQURQX1Jlc2V0LCBidXQgY29tcGxldGVseSByZWJvb3RpbmcgaW4gdGhlIGNhc2Ugb2YKKyAqIEFEUF9SZWJvb3QpLiAgTm90ZSB0aGF0IGl0IGlzIGltcG9ydGFudCB0aGF0IGFuIEFEUF9SZWJvb3RlZCBtZXNzYWdlIGlzCisgKiBzZW50IHNvIHRoYXQgdGhlIERlYnVnZ2VyIGRvZXMgbm90IGF0dGVtcHQgdG8gc2VuZCBhbnkgZGF0YSBhZnRlciBpdCBoYXMKKyAqIG1hZGUgYSByZXF1ZXN0IHRvIEFEUF9SZWJvb3QgYW5kIGJlZm9yZSBpdCByZWNlaXZlcyBhbiBBRFBfUmVib290ZWQsIGFzCisgKiBkYXRhIGNhbiBiZSBsb3N0IGJlIHRoZSB0YXJnZXQgZHVyaW5nIHRoaXMgdGltZS4KKyAqCisgKiBUaGUgdGFyZ2V0IGFuZCBob3N0IGFyZSBub3cgcmVhZHkgdG8gc3RhcnQgYSBkZWJ1ZyBzZXNzaW9uLgorICoKKyAqIGIpIFRhcmdldCBib2FyZCBpcyBwb3dlcmVkIHVwIGFmdGVyIGhvc3QgZGVidWdnZXIgaXMgaW52b2tlZAorICoKKyAqIFRoZSBkZWJ1Z2dlciB3aWxsIHNlbmQgYW4gQURQX1JlYm9vdCBvciBBRFBfUmVzZXQgcmVxdWVzdCwgYnV0IHdpbGwKKyAqIHJlY2VpdmUgbm8gcmVwbHkgdW50aWwgdGhlIHRhcmdldCBpcyBwb3dlcmVkIHVwLgorLyAqCisgKiBXaGVuIHRoZSB0YXJnZXQgaXMgcG93ZXJlZCB1cCB0aGVuIGl0IHdpbGwgc2VuZCBhbiBBRFBfUmVib290ZWQKKyAqIG1lc3NhZ2UgdG8gdGhlIGRlYnVnZ2VyLiAgVGhlIGRlYnVnZ2VyIHNob3VsZCBhY2NlcHQgdGhpcyBtZXNzYWdlCisgKiBldmVuIHRob3VnaCBpdCBoYXMgcmVjZWl2ZWQgbm8gQURQX1JlYm9vdCBvciBBRFBfUmVzZXQgYWNrbm93bGRlZ2UgbWVzc2FnZQorICogZnJvbSB0aGUgdGFyZ2V0LgorICoKKyAqIFRoZSB0YXJnZXQgYW5kIGhvc3QgYXJlIG5vdyByZWFkeSB0byBzdGFydCBhIGRlYnVnIHNlc3Npb24uCisgKgorICoKKyAqIElmIGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIGJvb3R1cCBzZXF1ZW5jZSBhbmQgQURQIG1lc3NhZ2VzIGFyZQorICogc2VudCBkb3duIHRoZSBTX0RCRyBjaGFubmVsIHRoZW4gdGhleSBzaG91bGQgYmUgcmVzcG9uZGVkIHRvIHdpdGggYQorICogUkRJX05vdEluaXRpYWxpc2VkIGVycm9yLiBbVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGhvd2V2ZXJdLgorICoKKyAqIEFuIEFEUF9Cb290IG9yIEFEUCBSZWJvb3RlZCBtZXNzYWdlIHNob3VsZCBiZSBhY2NlcHRlZCBhdAorICogYW55IHBvaW50LCBzaW5jZSBpdCBpcyBwb3NzaWJsZSBmb3IgYSBjYXRhc3Ryb3BoZSB0byBvY2N1ciAoc3VjaCBhcworICogZGlzY29ubmVjdGVpbmcgdGhlIGhvc3QgYW5kIHRhcmdldCBkdXJpbmcgYSBkZWJ1ZyBtZXNzYWdlKSB3aGljaAorICogcmVxdWlyZXMgdGhhdCBvbmUgb3Igb3RoZXIgZW5kIGJlIHJlc2V0LgorICoKKyAqLworCisvKgorICogQSBsaXN0IG9mIHBhcmFtZXRlciB0eXBlcyAtIGZvciBub3cganVzdCBiYXVkIHJhdGUKKyAqLwordHlwZWRlZiBlbnVtIEFEUF9QYXJhbWV0ZXIgeworICAgIEFQX1BBUkFNU19TVEFSVCA9IDB4QzAwMCwKKyAgICBBUF9CQVVEX1JBVEUgPSBBUF9QQVJBTVNfU1RBUlQsCisgICAgLyogZXh0cmEgcGFyYW1ldGVycyBnbyBpbiBoZXJlICovCisjaWZkZWYgVEVTVF9QQVJBTVMKKyAgICBBUF9DQUZFX01FTlUsICAgICAgICAgICAgICAgLyogZXh0cmEganVzdCBmb3IgdGVzdGluZyAqLworI2VuZGlmCisgICAgQVBfUEFSQU1TX0VORAorfSBBRFBfUGFyYW1ldGVyOworCisjZGVmaW5lIEFQX05VTV9QQVJBTVMgKEFQX1BBUkFNU19FTkQgLSBBUF9QQVJBTVNfU1RBUlQpCisKKy8qCisgKiBQYXJhbWV0ZXIgdHlwZXMgc2hvdWxkIGhhdmUgYXNzb2NpYXRlZCBzZW1hbnRpY3Mgd2hpY2ggY2FuIGJlIHJlcHJlc2VudGVkCisgKiB3aXRoaW4gb25lIHdvcmQgcGVyIHBhcmFtZXRlciwgb3IgYW4gYXNzb2NpYXRlZCBlbnVtIGZvciBjaG9pY2VzLgorICoKKyAqIEFQX0JBVURfUkFURTogdGhlIHdvcmQgY29udGFpbnMgdGhlIGV4YWN0IGJhdWQgcmF0ZSwgZWcuIDk2MDAsIDM4NDAwLgorICovCisKKy8qIHRoaXMgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0IGl0J3MgYW4gZXhhbXBsZSAqLwordHlwZWRlZiBlbnVtIEFEUF9CYXVkUmF0ZSB7CisgICAgQUJfOTYwMCAgPSAgOTYwMCwKKyAgICBBQl8xOTIwMCA9IDE5MjAwLAorICAgIEFCXzM4NDAwID0gMzg0MDAsCisgICAgQUJfNTc2MDAgPSA1NzYwMCwKKyAgICBBQl8xMTUyMDAgPSAxMTUyMDAKK30gQURQX0JhdWRSYXRlOworCisjZGVmaW5lIEFCX05VTV9CQVVEX1JBVEVTIDUgICAgIC8qIHRoaXMgaXMgbW9yZSB1c2VmdWwsIGZvciBzaXppbmcgYXJyYXlzICovCisKKy8qIFRoaXMgbXVzdCBiZSBzZXQgdG8gdGhlIG1heCBudW1iZXIgb2Ygb3B0aW9ucyBwZXIgcGFyYW1ldGVyIHR5cGUgKi8KKyNkZWZpbmUgQVBfTUFYX09QVElPTlMgKEFCX05VTV9CQVVEX1JBVEVTKQorCisKKyNkZWZpbmUgQURQX0Jvb3RlZCAgICAgIEFEUFJFQVNPTihDSV9UQk9PVCwwKQorLyogVGhpcyBtZXNzYWdlIGlzIHNlbnQgYnkgdGhlIHRhcmdldCBhZnRlciB0aGUgQW5nZWwgc3lzdGVtIGhhcyBiZWVuCisgKiBpbml0aWFsaXNlZC4gIFRoaXMgbWVzc2FnZSBhbHNvIGNvbnRhaW5zIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhlCisgKiBBbmdlbCB3b3JsZC4gVGhlIGluZm9ybWF0aW9uIGNhbiB0aGVuIGJlIHVzZWQgdG8gY2hlY2sgdGhhdCB0aGUKKyAqIHRhcmdldCBkZWJ1ZyBhZ2VudCBhbmQgc291cmNlIGRlYnVnZ2VyIGFyZSBjb21wYXRpYmxlLgorICoKKyAqIE1lc3NhZ2UgYXJndW1lbnRzOgorICogICAgICB3b3JkICAgIEFuZ2VsIG1lc3NhZ2UgZGVmYXVsdCBidWZmZXIgc2l6ZS4KKyAqICAgICAgd29yZCAgICBBbmdlbCBtZXNzYWdlIGxhcmdlIGJ1ZmZlciBzaXplIChtYXkgYmUgc2FtZSBhcyBkZWZhdWx0KQorICogICAgICB3b3JkICAgIEFuZ2VsIHZlcnNpb24gOyBpbmMuIHR5cGUgKGUuZy4gYm9vdCBST00pIFNlZSAoMSkKKyAqICAgICAgd29yZCAgICBBRFAgdmVyc2lvbi4gIFNlZSAoMikKKyAqICAgICAgd29yZCAgICBBUk0gQXJjaGl0ZWN0dXJlIGluZm8gU2VlICgzKQorICogICAgICB3b3JkICAgIEFSTSBDUFUgaW5mb3JtYXRpb24gOyBpbmNsdWRpbmcgdGFyZ2V0IGVuZGlhbm5lc3MuIFNlZSAoNCkKKyAqICAgICAgd29yZCAgICBUYXJnZXQgaGFyZHdhcmUgc3RhdHVzLiBTZWUgKDUpCisgKiAgICAgIHdvcmQgICAgTnVtYmVyIG9mIGJ5dGVzIGluIGJhbm5lciBtZXNzYWdlCisgKiAgICAgIGJ5dGVzICAgU3RhcnR1cCBiYW5uZXIgbWVzc2FnZSAoc2luZ2xlLXRocmVhZGVkIHJlYWRhYmxlCisgKiAgICAgICAgICAgICAgZGVzY3JpcHRpdmUgdGV4dCAtIE5PVCBOVUxMIHRlcm1pbmF0ZWQpLgorICoKKyAqIFJlcGx5OgorICogICAgICB3b3JkICAgIHN0YXR1cworICoKKyAqICAgICAgJ3N0YXR1cycgcmV0dXJucyBSRElFcnJvcl9Ob0Vycm9yIGZvciBzdWNjZXNzLCBhbmQgb3RoZXJ3aXNlCisgKiAgICAgIGluZGljYXRlcyBhbiBlcnJvci4KKyAqLworCisvKiBBbmdlbCB2ZXJzaW9uIHdvcmQgW1JlZmVyZW5jZSgxKV0gOiAqLworLyogQW5nZWwgdmVyc2lvbiBudW1iZXIgaXMgYSAxNmJpdCBCQ0QgdmFsdWUgKi8KKyNkZWZpbmUgQURQX0FOR0VMVlNOX01BU0sgICAgICAgICAgICgweDAwMDBGRkZGKQorI2RlZmluZSBBRFBfQU5HRUxWU05fU0hJRlQgICAgICAgICAgKDApCisKKy8qIFR5cGUgb2YgQW5nZWwgc3lzdGVtICovCisjZGVmaW5lIEFEUF9BTkdFTFZTTl9UWVBFX01BU0sgICAgICAoMHgwMEZGMDAwMCkKKyNkZWZpbmUgQURQX0FOR0VMVlNOX1RZUEVfU0hJRlQgICAgICgxNikKKwordHlwZWRlZiBlbnVtIHsKKyBBRFBfQW5nZWxUeXBlX2Jvb3RST00sIC8qIFNpbXBsZSBST00gc3lzdGVtIHByb3ZpZGluZyBkb3dubG9hZCBjYXBhYmlsaXR5ICovCisgQURQX0FuZ2VsVHlwZV9hcHBST00sICAvKiBST00gYmFzZWQgYXBwbGljYXRpb24gKi8KKyBBRFBfQW5nZWxUeXBlX2FwcERMT0FELC8qIERvd25sb2FkZWQgQW5nZWwgYmFzZWQgYXBwbGljYXRpb24gKi8KKyBBRFBfQW5nZWxUeXBlX0xhc3QgICAgIC8qIFVua25vd24gdHlwZS4gVGhpcyB0eXBlZGVmIGNhbiBiZSBleHRlbmRlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogYnV0IGlmIHRoZSBob3N0IGFuZCB0YXJnZXQgdnNucyBkaWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZW4gb25lIHdpbGwgc3BvdCB0aGF0IGl0IGRpZXMgbm90IHVuZGVyc3RhbmQgKi8KK30gQURQX0FuZ2VsX1R5cGVzIDsgICAgIC8qIHRoaXMgZmllbGQgYW5kIGNhbiB3aGluZ2UgYXBwcm9wcmlhdGVseSAqLworCisvKiBGaXJzdCB1bmtub3duIEFEUF9BbmdlbFR5cGUgKi8KKyNkZWZpbmUgQURQX0FOR0VMVlNOX1VOS1RZUEVfTUFTSyAgICgweEZGMDAwMDAwKQorI2RlZmluZSBBRFBfQU5HRUxWU05fVU5LWVBFX1NISUZUICAgKDI0KQorCisvKiBDdXJyZW50bHkgb25seSA4IGJpdHMgYXJlIHVzZWQgaW4gdGhlIHdvcmQ6ICovCisvKiBBRFAgcHJvdG9jb2wgc3VwcG9ydGVkIGJ5IHRhcmdldCBbUmVmZXJlbmNlICgyKV0gKi8KKyNkZWZpbmUgQURQX0FOR0VMVlNOX0FEUF9NQVNLICAgICAgICgweDAwMDAwMEZGKQorI2RlZmluZSBBRFBfQU5HRUxWU05fQURQX1NISUZUICAgICAgKDApCisKKy8qIEFSTSBBcmNoaXRlY3R1cmUgaW5mbzogW1JlZmVyZW5jZSAoMyldICovCisvKiBBUk0gQXJjaGl0ZWN0dXJlIFZlcnNvbiBvZiB0YXJnZXQgQ1BVICovCisjZGVmaW5lIEFEUF9BUk1fQVJDSF9WU05fTUFTSyAgICAgICAoMHgwMDAwMDBGRikKKyNkZWZpbmUgQURQX0FSTV9BUkNIX1ZTTl9TSElGVCAgICAgICgwKQorLyogRG9lcyB0aGUgcHJvY2Vzc29yIHN1cHBvcnQgdGhlIFRodW1iIEluc3RydWN0aW9uIFNldCAqLworI2RlZmluZSBBRFBfQVJNX0FSQ0hfVEhVTUIgICAgICAgICAgKDB4ODAwMDAwMDApCisvKiBEb2VzIHRoZSBwcm9jZXNzb3Igc3VwcG9ydCBMb25nIE11bHRpcGxpZXMgKi8KKyNkZWZpbmUgQURQX0FSTV9BUkNIX0xPTkdNVUwgICAgICAgICgweDQwMDAwMDAwKQorLyogQWxsIG90aGVyIGZsYWdzIGFyZSBjdXJyZW50IHVuZGVmaW5lZCwgYW5kIHNob3VsZCBiZSB6ZXJvLiAqLworCisvKiBUaGUgZm9sbG93aW5nIGZsYWdzIGRlc2NyaWJlIHRoZSBmZWF0dXJlIHNldCBvZiB0aGUgcHJvY2Vzc29yOiAqLworLyogU2V0IGlmIGNwdSBzdXBwb3J0cyBsaXR0bGUtZW5kaWFuIG1vZGVsIFtSZWZlcmVuY2UgKDQpXSAqLworI2RlZmluZSBBRFBfQ1BVX0xFICAgICAgICAgICAgICAoMSA8PCAwKQorLyogU2V0IGlmIGNwdSBzdXBwb3J0cyBiaWctZW5kaWFuIG1vZGVsICovCisjZGVmaW5lIEFEUF9DUFVfQkUgICAgICAgICAgICAgICgxIDw8IDEpCisvKiBTZXQgaWYgcHJvY2Vzc29yIGhhcyBhIGNhY2hlICovCisjZGVmaW5lIEFEUF9DUFVfQ0FDSEUgICAgICAgICAgICgxIDw8IDIpCisvKiBTZXQgaWYgcHJvY2Vzc29yIGhhcyBhIE1NVSAqLworI2RlZmluZSBBRFBfQ1BVX01NVSAgICAgICAgICAgICAoMSA8PCAzKQorLyogQWxsIG90aGVyIGZsYWdzIGFyZSBjdXJyZW50IHVuZGVmaW5lZCwgYW5kIHNob3VsZCBiZSB6ZXJvLiAqLworCisvKiBUaGUgZm9sbG93aW5nIGZsYWdzIHJlZmxlY3QgY3VycmVudCBUYXJnZXQgaGFyZHdhcmUgc3RhdHVzOiAqLworLyogW1JlZmVyZW5jZSAoNSldICovCisvKiAwID0gbm8gTU1VIG9yIE1NVSBvZmY7IDEgPSBNTVUgb24gKi8KKyNkZWZpbmUgQURQX0NQVV9NTVVPbiAgICAgICAgICAgKDEgPDwgMjkpCisvKiAwID0gbm8gY2FjaGUgb3IgY2FjaGUgb2ZmOyAxID0gY2FjaGUgb24gKi8KKyNkZWZpbmUgQURQX0NQVV9DYWNoZU9uICAgICAgICAgKDEgPDwgMzApCisvKiAwID0gbGl0dGxlLWVuZGlhbjsgMSA9IGJpZy1lbmRpYW4gKi8KKyNkZWZpbmUgQURQX0NQVV9CaWdFbmRpYW4gICAgICAgKDFVIDw8IDMxKQorLyogQWxsIG90aGVyIGZsYWdzIGFyZSBjdXJyZW50IHVuZGVmaW5lZCwgYW5kIHNob3VsZCBiZSB6ZXJvLiAqLworCisKKyNpZmRlZiBMSU5LX1JFQ09WRVJZCisKKyNkZWZpbmUgQURQX1RhcmdldFJlc2V0SW5kaWNhdGlvbiAgICAgICBBRFBSRUFTT04oQ0lfVEJPT1QsIDEpCisvKgorICogSWYgcGFyYW1ldGVyIG5lZ290aWF0aW9uIGlzIGVuYWJsZWQgYXQgdGhlIHRhcmdldCwgaXQgY29uZmlndXJlcyBpdHNlbGYKKyAqIHRvIHZhcmlvdXMgbGlrZWx5IHBhcmFtZXRlciBzZXR0aW5ncyBhbmQgc2VuZHMgdGhpcyBtZXNzYWdlIGF0IGVhY2gKKyAqIGNvbmZpZ3VyYXRpb24uICBUaGUgbWVzc2FnZSBkZXNjcmliZXMgdGhlIGRlZmF1bHQgc2V0dGluZ3MsIGFuZCBhZnRlcgorICogc2VuZGluZyBhdCBlYWNoIGNvbmZpZ3VyYXRpb24gdGhlIHRhcmdldCBzZXRzIGl0c2VsZiB0byB0aGUgZGVmYXVsdHMKKyAqIGl0IGhhcyBqdXN0IGJyb2FkY2FzdCwgdG8gYXdhaXQgZWl0aGVyIGFuIGFjayBvbiBUQk9PVCBvciBhIHJlcXVlc3QKKyAqIG9yIHJlc2V0IGluZGljYXRpb24gb24gSEJPT1QuCisgKgorICogSWYgdGhlIGhvc3QgcmVjZWl2ZXMgdGhpcyBtZXNzYWdlIHN1Y2Nlc3NmdWxseSwgaXQgc2hvdWxkIHJlc2V0IHRvIHRoZQorICogaW5kaWNhdGVkIHBhcmFtZXRlcnMgYW5kIHNlbmQgYSByZXBseS4KKyAqCisgKiBNZXNzYWdlIGFyZ3VtZW50czoKKyAqICAgICAgd29yZCAgICBzdGF0dXMgICAgICAgICAgICAgICAgICAgKGFsd2F5cyAwLCBtYWtlcyBib2R5IHNhbWUgYXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEUF9QYXJhbU5lZ290aWF0ZSByZXNwb25zZSkKKyAqICAgICAgd29yZCAgICBuLXBhcmFtZXRlcnMKKyAqICAgICAgbi1wYXJhbWV0ZXJzICogeworICogICAgICAgICAgICAgIHdvcmQgICAgQURQX1BhcmFtZXRlcgorICogICAgICAgICAgICAgIHdvcmQgICAgcGFyYW1ldGVyLXZhbHVlCisgKiAgICAgIH0KKyAqCisgKiBSZXBseToKKyAqICAgICAgLSAgICAgICBlbXB0eSBhY2tub3dsZWRnZW1lbnQKKyAqLworCisjZW5kaWYgLyogZGVmIExJTktfUkVDT1ZFUlkgKi8KKwordHlwZWRlZiBlbnVtIEFEUF9Cb290X0FjayB7CisgICAgQUJfTk9STUFMX0FDSywgICAgICAgICAgICAgIC8qIHdpbGwgY29tcGx5LCBpbW1lZGlhdGUgYm9vdGVkIG1lc3NhZ2UgKi8KKyAgICBBQl9MQVRFX0FDSywgICAgICAgICAgICAgICAgLyogd2lsbCBjb21wbHksIGxhdGUgc3RhcnR1cCAqLworICAgIEFCX0VSUk9SICAgICAgICAgICAgICAgICAgICAvKiBjYW5ub3QgY29tcGx5ICovCit9IEFEUF9Cb290X0FjazsKKworLyogSWYgdGhlIGhvc3Qgc2V0cyBuZWl0aGVyIG9mIHRoZXNlIGluIHRoZSB3b3JkIHNlbnQgb24gYSBSZXNldCAvIFJlYm9vdAorICogdGhlbiBpdCBkb2Vzbjt0IGNhcmUgYWJvdXQgdGhlIGVuZGlhbmVzcyBvZiB0aGUgdGFyZ2V0CisgKi8KKyNkZWZpbmUgQURQX0Jvb3RIb3N0RmVhdHVyZV9MaXR0bGVFbmQgMHg4MDAwMDAwMAorI2RlZmluZSBBRFBfQm9vdEhvc3RGZWF0dXJlX0JpZ0VuZCAgICAweDQwMDAwMDAwCisKKyNkZWZpbmUgQURQX1JlYm9vdCAgICAgIEFEUFJFQVNPTihDSV9IQk9PVCwyKQorLyogVGhpcyBtZXNzYWdlIGlzIHNlbnQgd2hlbiB0aGUgaG9zdCB3YW50cyB0aGUgdGFyZ2V0IHN5c3RlbSB0byBiZQorICogY29tcGxldGVseSByZXNldCwgYmFjayB0byB0aGUgYm9vdCBtb25pdG9yIEFuZ2VsLiBUaGlzIGlzIHRoZQorICogbWV0aG9kIG9mIHRoZSBob3N0IGZvcmNpbmcgYSBjb2xkLXJlYm9vdC4KKyAqIE5vdGUgdGhhdCBhbiBhY2tub3dsZWRnZW1lbnQgbWVzc2FnZSB3aWxsIGJlIHNlbnQgaW1tZWRpYXRlbHkgYW5kCisgKiB0aGF0IHRoaXMgbXVzdCBiZSBzZW50IGJlZm9yZSB0aGUgdGFyZ2V0IGNhbiByZXNldC4KKyAqCisgKiBUaGUgcGFyYW1ldGVyIHRvIHRoaXMgZnVuY3Rpb24gaXMgYSBiaXRzZXQgb2YgaG9zdCBzdXBwb3J0ZWQKKyAqIGZlYXR1cmVzLiAoaW4gZmFjdCB0aGUgc2FtZSBhcyBBRFBfUmVzZXQgYmVsb3cuICBUaGlzIGNhbiBiZSB1c2VkIGJ5CisgKiB0aGUgdGFyZ2V0IHN5c3RlbSB0byBhdm9pZCB1c2luZyBkZWJ1ZyBjaGFubmVsIGJhbmR3aWR0aCByYWlzaW5nCisgKiBtZXNzYWdlcyB0aGF0IHdpbGwgYmUgaWdub3JlZCBieSB0aGUgaG9zdC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgICB3b3JkICAgIGhvc3Qgc3VwcG9ydGVkIGZlYXR1cmVzIChzZWUgYWJvdmUpCisgKgorICogUmVwbHk6CisgKiAgICAgIHdvcmQgICAgc3RhdHVzLCBvbmUgb2YgZW51bSBBRFBfQm9vdF9BY2sgYWJvdmUuCisgKgorICogQ3VycmVudGx5IHRoZXJlIGFyZSBubyBzdWNoIGZlYXR1cmVzIGRlZmluZWQsIHNvIHRoZSB3b3JkIGluZGljYXRpbmcKKyAqIGhvc3Qgc3VwcG9ydGVkIGZlYXR1cmVzIHNob3VsZCBiZSBzZXQgdG8gMC4KKyAqLworCisKKworI2RlZmluZSBBRFBfUmVzZXQgICAgICAgQURQUkVBU09OKENJX0hCT09ULDMpCisvKiBUaGlzIG1lc3NhZ2UgaXMgYSByZXF1ZXN0IGZyb20gdGhlIGhvc3QsIHdoaWNoIHNob3VsZCBldmVudHVhbGx5CisgKiByZXN1bHQgaW4gdGhlICJBRFBfQm9vdGVkIiBtZXNzYWdlIGJlaW5nIHNlbnQgYnkgdGhlIHRhcmdldC4KKyAqIE5vdGUgdGhhdCBhbiBhY2tub3dsZWRnZW1lbnQgbWVzc2FnZSB3aWxsIGJlIHNlbnQgaW1tZWRpYXRlbHkgYW5kCisgKiB0aGF0IHRoaXMgbXVzdCBiZSBzZW50IGJlZm9yZSB0aGUgdGFyZ2V0IGNhbiByZXNldC4KKyAqIFRoaXMgcmVzZXQgbWVzc2FnZSBpcyAqQUxXQVlTKiB0cmVhdGVkIGFzIGEgd2FybSBib290LCB3aXRoIHRoZSB0YXJnZXQKKyAqIHByZXNlcnZpbmcgYXMgbXVjaCBzdGF0ZSBhcyBwb3NzaWJsZS4KKyAqCisgKiBUaGUgcGFyYW1ldGVyIHRvIHRoaXMgZnVuY3Rpb24gaXMgYSBiaXRzZXQgb2YgaG9zdCBzdXBwb3J0ZWQKKyAqIGZlYXR1cmVzLiBUaGlzIGNhbiBiZSB1c2VkIGJ5IHRoZSB0YXJnZXQgc3lzdGVtIHRvIGF2b2lkIHVzaW5nCisgKiBkZWJ1ZyBjaGFubmVsIGJhbmR3aXRkdGggcmFpc2luZyBtZXNzYWdlcyB0aGF0IHdpbGwgYmUgaWdub3JlZCBieQorICogdGhlIGhvc3QuCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgICAgd29yZCAgICBob3N0IHN1cHBvcnRlZCBmZWF0dXJlcyAoc2VlIGFib3ZlKQorICoKKyAqIFJlcGx5OgorICogICAgICB3b3JkICAgIHN0YXR1cywgb25lIG9mIGVudW0gQURQX0Jvb3RfQWNrIGFib3ZlLgorICoKKyAqIEN1cnJlbnRseSB0aGVyZSBhcmUgbm8gc3VjaCBmZWF0dXJlcyBkZWZpbmVkLCBzbyB0aGUgd29yZCBpbmRpY2F0aW5nCisgKiBob3N0IHN1cHBvcnRlZCBmZWF0dXJlcyBzaG91bGQgYmUgc2V0IHRvIDAuCisgKi8KKworCisjaWZkZWYgTElOS19SRUNPVkVSWQorCisjZGVmaW5lIEFEUF9Ib3N0UmVzZXRJbmRpY2F0aW9uICAgICAgICAgQURQUkVBU09OKENJX0hCT09ULCA0KQorLyoKKyAqIFRoaXMgaXMgYXMgZm9yIEFEUF9UYXJnZXRSZXNldEluZGljYXRpb24sIGJ1dCBpcyBzZW50IGJ5IHRoZSBob3N0IHdoZW4KKyAqIGl0IGZpcnN0IHN0YXJ0cyB1cCBpbiBjYXNlIHRoZSB0YXJnZXQgaXMgbGlzdGVuaW5nIGF0IGEgbm9uLWRlZmF1bHQKKyAqIHNldHRpbmcuICBIYXZpbmcgc2VudCBhdCB2YXJpb3VzIGNvbmZpZ3VyYXRpb25zLCB0aGUgaG9zdCB0aGVuIGxpc3RlbnMKKyAqIGF0IHRoZSBkZWZhdWx0cyBpdCBoYXMganVzdCBicm9hZGNhc3QsIHRvIGF3YWl0IGVpdGhlciBhbiBhY2sgb24gSEJPT1QKKyAqIG9yIGEgcmVzZXQgaW5kaWNhdGlvbiBvbiBUQk9PVC4KKyAqCisgKiBGb3IgYXJndW1lbnRzIGFuZCByZXBseSwgc2VlIEFEUF9UYXJnZXRSZXNldEluZGljYXRpb24uCisgKi8KKworI2VuZGlmIC8qIGRlZiBMSU5LX1JFQ09WRVJZICovCisKKworI2RlZmluZSBBRFBfUGFyYW1OZWdvdGlhdGUgICAgICAgICAgICAgIEFEUFJFQVNPTihDSV9IQk9PVCwgNSkKKy8qCisgKiBUaGUgaG9zdCBzZW5kcyB0aGlzIG1lc3NhZ2VzIHRvIG5lZ290aWF0ZSBuZXcgcGFyYW1ldGVycyB3aXRoIHRoZSB0YXJnZXQuCisgKiBGb3IgZWFjaCBwYXJhbWV0ZXIgdGhlIGhvc3Qgc3BlY2lmaWVzIGEgcmFuZ2Ugb2YgcG9zc2liaWxpdGllcywgc3RhcnRpbmcKKyAqIHdpdGggdGhlIG1vc3QgZmF2b3VyZWQuICBBbGwgcG9zc2libGUgY29tYmluYXRpb25zIG9mIHBhcmFtZXRlcnMKKyAqIG11c3QgYmUgdmFsaWQuCisgKgorICogSWYgdGhlIHRhcmdldCBjYW4gb3BlcmF0ZSBhdCBhIGNvbWJpbmF0aW9uIG9mIHRoZSBvZmZlcmVkIHBhcmFtZXRlcnMsCisgKiBpdCB3aWxsIHJlcGx5IHdpdGggdGhlIHBhcmFtZXRlcnMgaXQgaXMgd2lsbGluZyB0byB1c2UuICBBRlRFUiBzZW5kaW5nCisgKiB0aGUgcmVwbHksIHRoZSB0YXJnZXQgc3dpdGNoZXMgdG8gdGhpcyBjb21iaW5hdGlvbi4gIE9uIHJlY2VpdmluZyB0aGUKKyAqIHJlcGx5LCB0aGUgaG9zdCB3aWxsIHN3aXRjaCB0byB0aGUgbmV3IGNvbWJpbmF0aW9uIGFuZCBzZW5kIGEgTGlua0NoZWNrCisgKiBtZXNzYWdlIChzZWUgYmVsb3cpLgorICoKKyAqIElmIHRoZSB0YXJnZXQgY2Fubm90IG9wZXJhdGUgYXQgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBvZmZlcmVkIHBhcmFtZXRlcnMsCisgKiBpdCB3aWxsIHJlcGx5IHdpdGggYW4gZXJyb3Igc3RhdHVzLgorICoKKyAqIE1lc3NhZ2UgYXJndW1lbnRzOgorICogICAgICB3b3JkICAgIG4tcGFyYW1ldGVyLWJsb2NrcworICogICAgICBuLXBhcmFtZXRlci1ibG9ja3MgKiB7CisgKiAgICAgICAgICAgICAgd29yZCAgICBBRFBfUGFyYW1ldGVyCisgKiAgICAgICAgICAgICAgd29yZCAgICBuLW9wdGlvbnMKKyAqICAgICAgICAgICAgICBuLW9wdGlvbnMgKiB7IHdvcmQgICAgICBwYXJhbWV0ZXItdmFsdWUgfQorICogICAgICB9CisgKgorICogUmVwbHk6CisgKiAgICAgIHdvcmQgICAgc3RhdHVzCisgKiAgICAgIGlmIChzdGF0dXMgPT0gUkRJRXJyb3JfTm9FcnJvcikgeworICogICAgICAgICAgICAgIHdvcmQgICAgbi1wYXJhbWV0ZXJzCisgKiAgICAgICAgICAgICAgbi1wYXJhbWV0ZXJzICogeworICogICAgICAgICAgICAgICAgICAgICAgd29yZCAgICBBRFBfUGFyYW1ldGVyCisgKiAgICAgICAgICAgICAgICAgICAgICB3b3JkICAgIGNob3Nlbi12YWx1ZQorICogICAgICAgICAgICAgIH0KKyAqICAgICAgfQorICovCisKKyNkZWZpbmUgQURQX0xpbmtDaGVjayAgICAgICAgICAgICAgICAgICBBRFBSRUFTT04oQ0lfSEJPT1QsIDYpCisvKgorICogVGhpcyBzaG91bGQgYmUgdGhlIGZpcnN0IG1lc3NhZ2UgdGhhdCB0aGUgaG9zdCBzZW5kcyBhZnRlciBhIHN1Y2Nlc3NmdWwKKyAqIHBhcmFtZXRlciBuZWdvdGlhdGlvbi4gIEl0IGlzIHJlYWxseSBqdXN0IGEgJ3BpbmcnLgorICoKKyAqIE1lc3NhZ2UgYXJndW1lbnRzOgorICogICAgICAtICAgICAgIGVtcHR5IG1lc3NhZ2UKKyAqCisgKiBSZXBseToKKyAqICAgICAgLSAgICAgICBlbXB0eSBhY2tub3dsZWRnZW1lbnQKKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENJX0hBRFAgbWVzc2FnZXMKKyAqCisgKi8KKworI2RlZmluZSBBRFBfSEFEUFVucmVjb2duaXNlZCAgICAgICAgQURQUkVBU09OKENJX0hBRFAsMCkKKy8qIFRoaXMgbWVzc2FnZSBpcyB1bnVzdWFsIGluIHRoYXQgaXQgaXMgbm9ybWFsbHkgc2VudCBpbiByZXBseSB0bworICogYW5vdGhlciBtZXNzYWdlIHdoaWNoIGlzIG5vdCB1bmRlcnN0b29kLiAgVGhpcyBpcyBhbiBleGNlcHRpb24KKyAqIHRvIHRoZSBub3JtYWwgcHJvdG9jb2wgd2hpY2ggc2F5cyB0aGF0IGEgcmVwbHkgbXVzdCBoYXZlIHRoZQorICogc2FtZSBiYXNlIHJlYXNvbiBjb2RlIGFzIHRoZSBvcmlnaW5hbC4gIFRoZXJlIGlzIGEgc2luZ2xlIHJlcGx5CisgKiBwYXJhbWV0ZXIgd2hpY2ggaXMgdGhlIHJlYXNvbiBjb2RlIHdoaWNoIHdhcyBub3QgdW5kZXJzdG9vZC4KKyAqCisgKiBBcyB3ZWxsIGFzIGJlaW5nIGEgcmVwbHkgdGhpcyBtZXNzYWdlIGNhbiBhbHNvIGJlIHNlbnQgYW5kIHdpbGwKKyAqIHJldHVybiBhcyBpZiB0aGlzIG1lc3NhZ2Ugd2VyZSB1bnJlY29nbmlzZWQhCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgICAgbm9uZQorICoKKyAqIFJlcGx5OgorICogICAgICB3b3JkICAgIHJlYXNvbiBjb2RlIHdoaWNoIHdhcyBub3QgcmVjb2duaXNlZAorICovCisKKworI2RlZmluZSBBRFBfSW5mbyAgICAgICAgICAgICAgICBBRFBSRUFTT04oQ0lfSEFEUCwxKQorLyogVGhpcyBpcyB0aGUgbmV3IEFEUCBpbmZvcm1hdGlvbiBtZXNzYWdlLiBJdCBpcyB1c2VkIHRvIGludGVycm9nYXRlCisgKiB0aGUgdGFyZ2V0IGRlYnVnIGFnZW50LiAgSXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHByb2Nlc3NvciwKKyAqIGFzIHdlbGwgYXMgdGhlIHN0YXRlIG9mIHRoZSBkZWJ1ZyB3b3JsZC4gVGhpcyBhbGxvd3MgdGhlIGhvc3QgdG8KKyAqIGNvbmZpZ3VyZSBpdHNlbGYgdG8gdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgdGFyZ2V0LgorICoKKyAqIFdlIHRyeSBub3QgdG8gdXNlIGZlYXR1cmUgYml0c2V0cywgc2luY2Ugd2UgY291bGQgcXVpY2tseSBydW4gb3V0CisgKiBvZiBrbm93biBiaXRzLiAgVGh1cyB3aGVuIHRoZSBmZWF0dXJlIHNldCBpcyBleHRlbmRlZCwgdGhpcyBjYW4gYmUKKyAqIGRvbmUgaW4gYSBjb3VwbGUgb2Ygc3VwcG9ydGVkIHdheXM6CisgKgorICogIElmIGFuIHVuZGl2aWRlZCByZWFzb24gY29kZSBpcyB0byBiZSBhZGRlZCAobm8gcmVhc29uIHN1YmNvZGVzKQorICogIHRoZW4gYWRkIGEgbmV3IEFEUF9JbmZvIGNvZGUgd2hpY2ggcmVzcG9uZHMgd2l0aCBhIGZsYWcgaW5kaWNhdGluZworICogIHdoZXRoZXIgdGhhdCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgdGFyZ2V0LiAgSWYgdGhpcyBoYXMgbm90CisgKiAgZXZlbiBiZWVuIGltcGxlbWVudGVkIHRoZW4gdGhlIHJlcGx5IHdpbGwgYmUgQURQX0hBRFBVbnJlY29nbmlzZWQKKyAqCisgKiAgSWYgYSByZWFzb24gY29kZSB3aGljaCBpcyBzdWJkaXZpZGVkIGludG8gcmVhc29uIHN1YmNvZGVzIGlzCisgKiAgYWRkZWQgdGhlbiByZWFzb24gc3ViY29kZSAwIHNob3VsZCBiZSBzZXQgYXNpZGUgdG8gaW5kaWNhdGUKKyAqICB3aGV0aGVyIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoYXQgcmVhc29uIGNvZGUgaXMgc3VwcG9ydGVkCisgKiAgYnkgdGhlIHRhcmdldC4gIElmIGl0IGlzIG5vdCBldmVuIGltcGxlbWVudGVkIHRoZW4gdGhlIHJlcGx5IHdpbGwKKyAqICBiZSBBRFBfVW5yZWNvZ25pc2VkLgorICoKKyAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gQURQX0luZm8gaXMgYSByZWFzb24gc3ViY29kZSwgYW5kIHN1YnNlcXVlbnQKKyAqIHBhcmFtZXRlcnMgYXJlIGRlZmluZWQgYnkgdGhhdCBzdWJjb2RlCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgICAgd29yZCAgICAgICAgIHJlYXNvbiBzdWJjb2RlCisgKiAgICAgIG90aGVyIGFyZ3VtZW50cyBhcyByZWFzb24gc3ViY29kZSBkZXRlcm1pbmVzLgorICoKKyAqIFJlcGx5OgorICogICAgICB3b3JkICAgICAgICAgcmVhc29uIHN1YmNvZGUKKyAqICAgICAgb3RoZXIgYXJndW1lbnQgYXMgcmVhc29uIHN1YmNvZGUgZGV0ZXJtaW5lcworICovCisKKy8qIEFEUF9JbmZvIHJlYXNvbiBzdWJjb2RlczogKi8KKworCisKKyNkZWZpbmUgQURQX0luZm9fTk9QICAgICAgICAgICAgICAgICAgICBBRFBTVUJSRUFTT04oQ0lfSEFEUCwwKQorLyogQURQX0luZm9fTk9QCisgKiAtLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFRoaXMgbWVzc2FnZSBpcyB1c2VkIHRvIGNoZWNrIGZvciBBRFBfSW5mbyBiZWluZyBzdXBwb3J0ZWQuCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAoKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMpCisgKgorICogJ3N0YXR1cycgcmV0dXJucyBSRElFcnJvcl9Ob0Vycm9yIGZvciBzdWNjZXNzLCBub24temVybyBpbmRpY2F0ZXMgYW4gZXJyb3IuCisgKiBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCB0aGVuIHRoZXJlIGlzIG5vIGhhbmRsZXIgZm9yIHRoZSBBRFBfSW5mbworICogbWVzc2FnZS4gVGhlIG5vcm1hbCBhY3Rpb24gd2lsbCBiZSB0byByZXR1cm4gYW4gT0sgc3RhdHVzLgorICovCisKKworI2RlZmluZSBBRFBfSW5mb19UYXJnZXQgICAgICAgICAgICAgICAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDEpCisvKiBBRFBfSW5mb19UYXJnZXQKKyAqIC0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeToKKyAqIFRoaXMgcmVhc29uIGNvZGUgaXMgdXNlZCB0byBpbnRlcnJvZ2F0ZSB0YXJnZXQgc3lzdGVtIGRldGFpbHMuCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAoKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMsIHdvcmQgYml0c2V0LCB3b3JkIG1vZGVsKQorICoKKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgT0ssIG9yIG5vbi16ZXJvIHRvIGluZGljYXRlCisgKiBzb21lIHNvcnQgb2YgZXJyb3IuCisgKiAnYml0c2V0JyBpcyBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgYmVsb3csIGFuZCBpcyBtb3N0bHkgY29tcGF0aWJsZQorICogd2l0aCB0aGUgb2xkIFJESS9SRFAgc3lzdGVtIHRvIGF2b2lkIGdyYXR1aXRvdXMgY2hhbmdlcyB0byB0aGUgZGVidWdnZXIKKyAqIHRvb2xib3guCisgKiAnbW9kZWwnIGlzIHRoZSB0YXJnZXQgaGFyZHdhcmUgSUQgd29yZCwgYXMgcmV0dXJuZWQgYnkgdGhlIEFEUF9Cb290ZWQKKyAqIG1lc3NhZ2UuCisgKgorICogTk9URTogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gcHJvdG9jb2wgbGV2ZWxzIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLgorICogSXQgaXMgdGhlIEFuZ2VsIHZpZXcgdGhhdCBkZWJ1Z2dpbmcgY29tcGxleGl0eSBzaG91bGQgYmUgc2hpZnRlZCB0byB0aGUKKyAqIGhvc3QgaWYgYXQgYWxsIHBvc3NpYmxlLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBob3N0IGRlYnVnZ2VyIHNob3VsZAorICogYWx3YXlzIHRyeSB0byBjb25maWd1cmUgaXRzZWxmIHRvIHRoZSBmZWF0dXJlcyBhdmFpbGFibGUgaW4gdGhlIHRhcmdldAorICogZGVidWcgYWdlbnQuICBUaGlzIGNhbiBiZSBkb25lIGJ5IGNoZWNraW5nIGluZGl2aWR1YWwgbWVzc2FnZXMsIHJhdGhlcgorICogdGhhbiBieSBhIGJsYW5rZXQgdmVyc2lvbiBudW1iZXIgZGljdGF0aW5nIHRoZSBmZWF0dXJlIHNldC4KKyAqLworCisvKiAnYml0c2V0JzotICovCisvKiBUYXJnZXQgc3BlZWQgaW4gaW5zdHJ1Y3Rpb25zIHBlciBzZWNvbmQgPSAxMCoqKGJpdHMwLi4zKS4gKi8KKyNkZWZpbmUgQURQX0luZm9fVGFyZ2V0X0xvZ1NwZWVkTWFzayAgICAgICAgICgweEYpCisKKy8qIFRhcmdldCBpcyBydW5uaW5nIG9uIFswID0gZW11bGF0b3IgLyAxID0gaGFyZHdhcmVdICovCisjZGVmaW5lIEFEUF9JbmZvX1RhcmdldF9IVyAgICAgICAgICAgICAgICAgICAoMSA8PCA0KQorCisvKiBCaXRzIDUuLjEwIGFyZSBjdXJyZW50bHkgdW5kZWZpbmVkIGFuZCBzaG91bGQgYmUgemVyby4gKi8KKy8qIE90aGVyIGJpcyBhcmUga2VwdCB0aGUgc2FtZSBhcyB0aGUgUkRQIGluIG9yZGVyIHRvICovCisvKiBlbGltaW5hdGUgdGhlIG5lZWQgdG8gY2hhbmdlIHRoZSBwb3NpdGlvbiBvZiBzb21lIGJpdHMgKi8KKworLyogSWYgc2V0IHRoZW4gdGhlIGRlYnVnIGFnZW50IGNhbiBiZSByZWxvYWRlZC4gKi8KKyNkZWZpbmUgQURQX0luZm9fVGFyZ2V0X0NhblJlbG9hZEFnZW50ICAgICAgICgxIDw8IDExKQorCisvKiBDYW4gcmVxdWVzdCBBbmdlbEJ1ZmZlclNpemUgaW5mb3JtYXRpb24uICovCisjZGVmaW5lIEFEUF9JbmZvX1RhcmdldF9DYW5JbnF1aXJlQnVmZmVyU2l6ZSAoMSA8PCAxMikKKworLyogQml0IDEzIGlzIG5vIGxvbmdlciByZXF1aXJlZCBhcyBpdCBpbnF1aXJlZCB3aGV0aGVyCisgKiBhIHNwZWNpYWwgUkRQIEludGVycnVwdCBjb2RlIHdhcyBzdXBwb3J0ZWQKKyAqLworCisvKiBEZWJ1ZyBhZ2VudCBjYW4gcGVyZm9ybSBwcm9maWxpbmcuICovCisjZGVmaW5lIEFEUF9JbmZvX1RhcmdldF9Qcm9maWxpbmcgICAgICAgICAgICAoMSA8PCAxNCkKKworLyogRGVidWcgYWdlbnQgY2FuIHN1cHBvcnQgVGh1bWIgY29kZS4gKi8KKyNkZWZpbmUgQURQX0luZm9fVGFyZ2V0X1RodW1iICAgICAgICAgICAgICAgICgxIDw8IDE1KQorCisvKiBCaXQgMTYgd2FzIHRoZSBjb21tdW5pY2F0aW9ucyBjaGFubmVsIGNoZWNrLgorICogVGhpcyBpcyBhbHdheXMgYXZhaWxhYmxlIG9uIEFuZ2VsIHN5c3RlbXMuCisgKi8KKworI2RlZmluZSBBRFBfSW5mb19Qb2ludHMgICAgICAgICAgICAgICAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDIpCisvKiBBRFBfSW5mb19Qb2ludHMKKyAqIC0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogUmV0dXJucyBhIDMyYml0IHdpZGUgYml0c2V0IG9mIGJyZWFrLSBhbmQgd2F0Y2gtcG9pbnQKKyAqIGZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGUgdGFyZ2V0IGRlYnVnIGFnZW50LgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzLCB3b3JkIGJyZWFraW5mbykKKyAqCisgKiAnc3RhdHVzJyByZXR1cm5zIFJESUVycm9yX05vRXJyb3Igb24gc3VjY2VzcyBvciBub24temVybyB0byBpbmRpY2F0ZQorICogc29tZSBzb3J0IG9mIGVycm9yLgorICogJ2JyZWFraW5mbycgaXMgYSAzMmJpdCB3aWRlIGJpdHNldCBkZXNjcmliZWQgaW4gZGV0YWlsIGJlbG93LiAgTm90ZQorICogdGhhdCBvbmx5IGJpdHMgMS4uMTIgYXJlIHVzZWQuCisgKi8KKworLyogJ2JyZWFraW5mbyc6LSAqLworLyogQ2FuIHRyYXAgb24gYWRkcmVzcyBlcXVhbGl0eS4gKi8KKyNkZWZpbmUgQURQX0luZm9fUG9pbnRzX0NvbXBhcmlzb24gICAgICAoMSA8PCAwKQorCisvKiBDYW4gdHJhcCBvbiBhZGRyZXNzIHJhbmdlLiAqLworI2RlZmluZSBBRFBfSW5mb19Qb2ludHNfUmFuZ2UgICAgICAgICAgICgxIDw8IDEpCisKKy8qIENhbiB0cmFwIG9uIDhiaXQgbWVtb3J5IHJlYWRzLiAqLworI2RlZmluZSBBRFBfSW5mb19Qb2ludHNfUmVhZEJ5dGVXYXRjaCAgICgxIDw8IDIpCisKKy8qIENhbiB0cmFwIG9uIDE2Yml0IG1lbW9yeSByZWFkcy4gKi8KKyNkZWZpbmUgQURQX0luZm9fUG9pbnRzX1JlYWRIYWxmV2F0Y2ggICAoMSA8PCAzKQorCisvKiBDYW4gdHJhcCBvbiAzMmJpdCBtZW1vcnkgcmVhZHMuICovCisjZGVmaW5lIEFEUF9JbmZvX1BvaW50c19SZWFkV29yZFdhdGNoICAgKDEgPDwgNCkKKworLyogQ2FuIHRyYXAgb24gOGJpdCB3cml0ZSBhY2Nlc3Nlcy4gKi8KKyNkZWZpbmUgQURQX0luZm9fUG9pbnRzX1dyaXRlQnl0ZVdhdGNoICAoMSA8PCA1KQorCisvKiBDYW4gdHJhcCBvbiAxNmJpdCB3cml0ZSBhY2Nlc3Nlcy4gKi8KKyNkZWZpbmUgQURQX0luZm9fUG9pbnRzX1dyaXRlSGFsZldhdGNoICAoMSA8PCA2KQorCisvKiBDYW4gdHJhcCBvbiAzMmJpdCB3cml0ZSBhY2Nlc3Nlcy4gKi8KKyNkZWZpbmUgQURQX0luZm9fUG9pbnRzX1dyaXRlV29yZFdhdGNoICAoMSA8PCA3KQorCisvKiBMaWtlIHJhbmdlLCBidXQgYmFzZWQgb24gYWRkcmVzcyBiaXRtYXNrPC4gKi8KKyNkZWZpbmUgQURQX0luZm9fUG9pbnRzX01hc2sgICAgICAgICAgICAoMSA8PCA4KQorCisvKiBNdWx0aS10aHJlYWRlZCBzdXBwb3J0IG9ubHkgLSB0aHJlYWQgc3BlY2lmaWMgYnJlYWtwb2ludHMuICovCisjZGVmaW5lIEFEUF9JbmZvX1BvaW50c19UaHJlYWRCcmVhayAgICAgKDEgPDwgOSkKKworLyogTXVsdGktdGhyZWFkZWQgc3VwcG9ydCBvbmx5IC0gdGhyZWFkIHNwZWNpZmljIHdhdGNocG9pbnRzLiAqLworI2RlZmluZSBBRFBfSW5mb19Qb2ludHNfVGhyZWFkV2F0Y2ggICAgICgxIDw8IDEwKQorCisvKiBBbGxvd3MgY29uZGl0aW9uYWwgYnJlYWtwb2ludHMuICovCisjZGVmaW5lIEFEUF9JbmZvX1BvaW50c19Db25kaXRpb25hbHMgICAgKDEgPDwgMTEpCisKKy8qIEJyZWFrLSBhbmQgd2F0Y2gtcG9pbnRzIGNhbiBiZSBpbnRlcnJvZ2F0ZWQgKi8KKyNkZWZpbmUgQURQX0luZm9fUG9pbnRzX1N0YXR1cyAgICAgICAgICAoMSA8PCAxMikKKworCisjZGVmaW5lIEFEUF9JbmZvX1N0ZXAgICAgICAgICAgICAgICAgICAgQURQU1VCUkVBU09OKENJX0hBRFAsMykKKy8qIEFEUF9JbmZvX1N0ZXAKKyAqIC0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFJldHVybnMgYSAzMmJpdCB3aWRlIGJpdG1hc2sgb2YgdGhlIHNpbmdsZS1zdGVwcGluZworICogY2FwYWJpbGl0aWVzIG9mIHRoZSB0YXJnZXQgZGVidWcgYWdlbnQuCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAoKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMsIHdvcmQgc3RlcGluZm8pCisgKgorICogJ3N0YXR1cycgcmV0dXJucyBSRElFcnJvcl9Ob0Vycm9yIG9uIHN1Y2Nlc3MsIG9yIG5vbi16ZXJvIHRvIGluZGljYXRlCisgKiBzb21lIGtpbmQgb2YgZXJyb3IuCisgKiAnc3RlcGluZm8nIGlzIGEgMzJiaXQgd2lkZSBiaXRtYXNrIGRlc2NyaWJlZCBpbiBkZXRhaWwgYmVsb3cuICBOb3RlIHRoYXQKKyAqIG9ubHkgMyBiaXRzIGFyZSB1c2VkLgorICovCisKKy8qICdzdGVwaW5mbyc6LSAqLworLyogU2luZ2xlLXN0ZXBwaW5nIG9mIG1vcmUgdGhhbiBvbmUgaW5zdHJ1Y3Rpb24gaXMgcG9zc2libGUuICovCisjZGVmaW5lIEFEUF9JbmZvX1N0ZXBfTXVsdGlwbGUgICgxIDw8IDApCisKKy8qIFNpbmdsZS1zdGVwcGluZyB1bnRpbCBuZXh0IGRpcmVjdCBQQyBjaGFuZ2UgaXMgcG9zc2libGUuICovCisjZGVmaW5lIEFEUF9JbmZvX1N0ZXBfUENDaGFuZ2UgICgxIDw8IDEpCisKKy8qIFNpbmdsZS1zdGVwcGluZyBvZiBhIHNpbmdsZSBpbnN0cnVjdGlvbiBpcyBwb3NzaWJsZS4gKi8KKyNkZWZpbmUgQURQX0luZm9fU3RlcF9TaW5nbGUgICAgKDEgPDwgMikKKworCisjZGVmaW5lIEFEUF9JbmZvX01NVSAgICAgICAgICAgICAgICAgICAgQURQU1VCUkVBU09OKENJX0hBRFAsNCkKKy8qIEFEUF9JbmZvX01NVQorICogLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzeXN0ZW0gKGlmCisgKiBhbnkpLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzLCB3b3JkIG1lbWluZm8pCisgKgorICogJ3N0YXR1cycgcmV0dXJucyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3Mgb3Igbm9uLXplcm8gdG8KKyAqIGluZGljYXRlIHNvbWUga2luZCBvZiBlcnJvci4KKyAqICdtZW1pbmZvJyBzaG91bGQgYmUgYSAzMmJpdCB1bmlxdWUgSUQsIG9yIHplcm8gaWYgdGhlcmUgaXMgbm8gTU1VCisgKiBzdXBwb3J0IG9uIHRoZSB0YXJnZXQuCisgKi8KKworCisjZGVmaW5lIEFEUF9JbmZvX1NlbWlIb3N0aW5nICAgICAgICAgICAgQURQU1VCUkVBU09OKENJX0hBRFAsNSkKKy8qIEFEUF9JbmZvX1NlbWlIb3N0aW5nCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogVGhpcyBtZXNzYWdlIGlzIHVzZWQgdG8gY2hlY2sgd2hldGhlciBzZW1pLWhvc3RpbmcgaW5mbyBjYWxscworICogYXJlIGF2YWlsYWJsZSBvbiB0aGUgdGFyZ2V0LgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzKQorICoKKyAqICdzdGF0dXMnIHJldHVybnMgUkRJRXJyb3JfTm9FcnJvciBpZiBzZW1pLWhvc3RpbmcgaW5mbyBjYWxscyBhcmUgYXZhaWxhYmxlLAorICogbm9uLXplcm8gb3RoZXJ3aXNlLgorICovCisKKworI2RlZmluZSBBRFBfSW5mb19Db1BybyAgICAgICAgICAgICAgICAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDYpCisvKiBBRFBfSW5mb19Db1BybworICogLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFRoaXMgbWVzc2FnZSBjaGVja3Mgd2hldGhlciBDb1Byb2Nlc3NvciBpbmZvIGNhbGxzIGFyZQorICogc3VwcG9ydGVkLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzKQorICoKKyAqICdzdGF0dXMnIHJldHVybnMgUkRJRXJyb3JfTm9FcnJvciB0byBpbmRpY2F0ZSB0aGVzZSBmYWNpbGl0aWVzCisgKiBhcmUgc3VwcG9ydGVkLCBub24temVybyBvdGhlcndpc2UuCisgKi8KKworCisjZGVmaW5lIEFEUF9JbmZvX0N5Y2xlcyAgICAgICAgICAgICAgICAgQURQU1VCUkVBU09OKENJX0hBRFAsNykKKy8qIEFEUF9JbmZvX0N5Y2xlcworICogLS0tLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGFuZCBjeWNsZXMgZXhlY3V0ZWQgc2luY2UKKyAqIHRoZSB0YXJnZXQgd2FzIGluaXRpYWxpc2VkLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzLCB3b3JkIG5pbnN0ciwgd29yZCBTY3ljbGVzLCB3b3JkIE5jeWNsZXMsCisgKiAgICAgICAgICB3b3JkIEljeWNsZXMsIHdvcmQgQ2N5Y2xlcywgd29yZCBGY3ljbGVzKQorICoKKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgc3VjY2Vzcywgb3Igbm9uLXplcm8gaWYgdGhlcmUKKyAqIGlzIG5vIHRhcmdldCBzdXBwb3J0IGZvciBnYXRoZXJpbmcgY3ljbGUgY291bnQgaW5mb3JtYXRpb24uCisgKiAnbmluc3RyJyBpcyB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZC4KKyAqICdTY3ljbGVzJyBpcyB0aGUgbnVtYmVyIG9mIFMtY3ljbGVzIGV4ZWN1dGVkLgorICogJ05jeWNsZXMnIGlzIHRoZSBudW1iZXIgb2YgTi1jeWNsZXMgZXhlY3V0ZWQuCisgKiAnSWN5Y2xlcycgaXMgdGhlIG51bWJlciBvZiBJLWN5Y2xlcyBleGVjdXRlZC4KKyAqICdDY3ljbGVzJyBpcyB0aGUgbnVtYmVyIG9mIEMtY3ljbGVzIGV4ZWN1dGVkLgorICogJ0ZjeWNsZXMnIGlzIHRoZSBudW1iZXIgb2YgRi1jeWNsZXMgZXhlY3V0ZWQuCisgKi8KKworCisjZGVmaW5lIEFEUF9JbmZvX0Rlc2NyaWJlQ29Qcm8gICAgICAgICAgQURQU1VCUkVBU09OKENJX0hBRFAsOCkKKy8qIEFEUF9JbmZvX0Rlc2NyaWJlQ29Qcm8KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IERlc2NyaWJlIHRoZSByZWdpc3RlcnMgb2YgYSBjb3Byb2Nlc3Nvci4gIFVzZSBvbmx5IGlmCisgKiBBRFBfSW5mb19Db1BybyByZXR1cm4gUkRJRXJyb3JfTm9FcnJvci4KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgIEFyZ3VtZW50cyBvZiB0aGUgZm9ybToKKyAqICAgICAgICAgKGJ5dGUgY3BubywgYnl0ZSBybWluLCBieXRlIHJtYXgsIGJ5dGUgbmJ5dGVzLCBieXRlIGFjY2VzcywKKyAqICAgICAgICAgIGJ5dGUgY3BydF9yX2IwLCBieXRlIGNwcnRfcl9iMSwgYnl0ZSBjcHJ0X3dfYjAsIGJ5dGUgY3BydF93X2IxKQorICogICAgICAgICBBbmQgYSB0ZXJtaW5hdGluZyBieXRlID0gMHhmZi4gIE11c3QgYmUgd2l0aGluIG1heGltdW0gYnVmZmVyIHNpemUuCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cykKKyAqCisgKiAnY3BubycgaXMgdGhlIG51bWJlciBvZiB0aGUgY29wcm9jZXNzb3IgdG8gYmUgZGVzY3JpYmVkLgorICogJ3JtaW4nIGlzIHRoZSBib3R0b20gb2YgYSByYW5nZSBvZiByZWdpc3RlcnMgd2l0aCB0aGUgc2FtZSBkZXNjcmlwdGlvbi4KKyAqICdybWF4JyBpcyB0aGUgdG9wIG9mIGEgcmFuZ2Ugb2YgcmVnaXN0ZXJzIHdpdGggdGhlIHNhbWUgZGVzY3JpcHRpb24uCisgKiAnbmJ5dGVzJyBpcyB0aGUgc2l6ZSBvZiB0aGUgcmVnaXN0ZXIuCisgKiAnYWNjZXNzJyBkZXNjcmliZXMgYWNjZXNzIHRvIHRoZSByZWdpc3RlciBhbmQgaXMgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsCisgKiBiZWxvdy4KKyAqCisgKiBJZiBiaXQgMiBvZiBhY2Nlc3MgaXMgc2V0Oi0KKyAqICdjcHJ0X3IwJyBwcm92aWRlcyBiaXRzIDAgdG8gNywgYW5kCisgKiAnY3BydF9yMScgcHJvdmlkZXMgYml0cyAxNiB0byAyMyBvZiBhIENQUlQgaW5zdHJ1Y3Rpb24gdG8gcmVhZCB0aGUKKyAqIHJlZ2lzdGVyLgorICogJ2NwcnRfdzAnIHByb3ZpZGVzIGJpdHMgMCB0byA3LCBhbmQKKyAqICdjcHJ0X3cxJyBwcm92aWRlcyBiaXRzIDE2IHRvIDIzIG9mIGEgQ1BSVCBpbnN0cnVjdGlvbiB0byB3cml0ZSB0aGUKKyAqIHJlZ2lzdGVyLgorICoKKyAqIE90aGVyd2lzZSwgJ2NwcnRfcjAnIHByb3ZpZGVzIGJpdHMgMTIgdG8gMTUsIGFuZCAnY3BydF9yMScgYml0IDIyIG9mIENQRFQKKyAqIGluc3RydWN0aW9ucyB0byByZWFkIGFuZCB3cml0ZSB0aGUgcmVnaXN0ZXIgKCdjcHJ0X3cwJyBhbmQgJ2NwcnRfdzEnIGFyZQorICoganVuaykuCisgKi8KKworLyogJ2FjY2Vzcyc6LSAqLworLyogUmVhZGFibGUuICovCisjZGVmaW5lIEFEUF9JbmZvX0Rlc2NyaWJlQ29Qcm9fUmVhZGFibGUgICAoMSA8PCAwKQorCisvKiBXcml0ZWFibGUuICovCisjZGVmaW5lIEFEUF9JbmZvX0Rlc2NyaWJlQ29Qcm9fV3JpdGVhYmxlICAoMSA8PCAxKQorCisvKiBSZWdpc3RlcnMgcmVhZCBvciB3cml0dGVuIHZpYSBDUERUIGluc3RydWN0aW9ucyAoZWxzZSBDUFJUKSB3aXRoIHRoaXMKKyAgIGJpdCBzZXQuICovCisjZGVmaW5lIEFEUF9JbmZvX0Rlc2NyaWJlQ29Qcm9fQ1BEVCAgICAgICAoMSA8PCAyKQorCisjZGVmaW5lIEFEUF9JbmZvX1JlcXVlc3RDb1Byb0Rlc2MgICAgICAgQURQU1VCUkVBU09OKENJX0hBRFAsOSkKKy8qIEFEUF9JbmZvX1JlcXVlc3RDb1Byb0Rlc2MKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFJlcXVlc3RzIGEgZGVzY3JpcHRpb24gb2YgdGhlIHJlZ2lzdGVycyBvZiBhIGNvcHJvY2Vzc29yLiAgVXNlCisgKiBvbmx5IGlmIEFEUF9JbmZvX0NvUHJvIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKGJ5dGUgY3BubykKKyAqIFJldHVybjogQXJndW1lbnRzIG9mIHRoZSBmb3JtOi0KKyAqICAgICAgICAgKHdvcmQgc3RhdHVzLCBieXRlIHJtaW4sIGJ5dGUgcm1heCwgYnl0ZSBuYnl0ZXMsIGJ5dGUgYWNjZXNzKQorICogICAgICAgICBGb2xsb3dlZCBieSBhIHRlcm1pbmF0aW5nIGJ5dGUgPSAweEZGLiAgTXVzdCBiZSB3aXRoaW4gbWF4aW11bQorICogICAgICAgICBidWZmZXIgc2l6ZS4KKyAqICdjcG5vJyBpcyB0aGUgbnVtYmVyIG9mIHRoZSBjb3Byb2Nlc3NvciB0byBkZXNjcmliZS4KKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlLgorICogJ3JtaW4nIGlzIHRoZSBib3R0b20gb2YgYSByYW5nZSBvZiByZWdpc3RlcnMgd2l0aCB0aGUgc2FtZSBkZXNjcmlwdGlvbi4KKyAqICdybWF4JyBpcyB0aGUgdG9wIG9mIGEgcmFuZ2Ugb2YgcmVnaXN0ZXJzIHdpdGggdGhlIHNhbWUgZGVzY3JpcHRpb24uCisgKiAnbmJ5dGVzJyBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaXN0ZXIocykuCisgKiAnYWNjZXNzJyBpcyBhcyBhYm92ZSBpbiBBRFBfSW5mb19EZXNjcmliZUNvUHJvLgorICovCisKKworI2RlZmluZSBBRFBfSW5mb19BbmdlbEJ1ZmZlclNpemUgICAgICAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDEwKQorLyogQURQX0luZm9fQW5nZWxCdWZmZXJTaXplCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFJldHVybnMgdGhlIEFuZ2VsIGJ1ZmZlciBzaXplcy4KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgICgpCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cywgd29yZCBkZWZhdWx0c2l6ZSwgd29yZCBtYXhzaXplKQorICoKKyAqICdzdGF0dXMnIHJldHVybnMgUkRJRXJyb3JfTm9FcnJvciB0byBpbmRpY2F0ZSBzdWNjZXNzIG9yIG5vbi16ZXJvIHRvCisgKiBpbmRpY2F0ZSBzb21lIGtpbmQgb2YgZXJyb3IuCisgKiAnZGVmYXVsdHNpemUnIGlzIHRoZSBkZWZhdWx0IEFuZ2VsIEFEUCBidWZmZXIgc2l6ZSBpbiBieXRlcy4gVGhpcyBpcworICogYXQgbGVhc3QgMjU2IGJ5dGVzLgorICogJ21heHNpemUnIGlzIHRoZSBsYXJnZXN0IEFuZ2VsIEFEUCBidWZmZXIgc2l6ZSBpbiBieXRlcy4gVGhpcyB3aWxsIGJlCisgKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gZGVmYXVsdHNpemUuICBUaGUgdGFyZ2V0IHdpbGwgYWNjZXB0IEFEUCBtZXNzYWdlcworICogb2YgdXAgdG8gdGhpcyBsZW5ndGggZm9yIGRvd25sb2FkLCBldGMuCisgKgorICogV2FzIERvd25Mb2FkU2l6ZSBpbiBSRFAvUkRJIHdvcmxkLiAgVGhpcyBpcyB0aGUgYW1vdW50IHRoYXQgdGhlIHRhcmdldAorICogc2hvdWxkIHRyYW5zbWl0IGluIGEgc2luZ2xlIG9wZXJhdGlvbi4gIFRoaXMgc2hvdWxkIG5vdyBiZSB0aGUgQW5nZWwKKyAqIGJ1ZmZlciBzaXplLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGdpdmVuIGluIHRoZSBBRFBfQm9vdGVkIG1lc3NhZ2UuCisgKgorICogTk9URTogVGhlIHZhbHVlIHJldHVybmVkIHNob3VsZCBiZSB0aGUgREFUQVNJWkUgYW5kICpOT1QqIEJVRkZFUkRFRlNJWkUuCisgKiBUaGlzIGlzIG5lZWRlZCB0byBlbnN1cmUgdGhhdCB0aGUgdHJhbnNwb3J0IHByb3RvY29sIGluZm9ybWF0aW9uCisgKiBjYW4gYmUgd3JhcHBlZCBhcm91bmQgdGhlIGRhdGEuCisgKi8KKworI2RlZmluZSBBRFBfSW5mb19DaGFuZ2VhYmxlU0hTV0kgICAgICAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDExKQorLyogQURQX0luZm9fQ2hhbmdlYWJsZVNIU1dJCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFRoaXMgbWVzc2FnZSBpcyB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgaXQgaXMgcG9zc2libGUgdG8gY2hhbmdlCisgKiB3aGljaCBTV0kncyBhcmUgdXNlZCBmb3Igc2VtaWhvc3RpbmcuCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAoKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMpCisgKgorICogJ3N0YXR1cycgcmV0dXJucyBSRElFcnJvcl9Ob0Vycm9yIGlmIHNlbWktaG9zdGluZyBpbmZvIGNhbGxzIGFyZSBhdmFpbGFibGUsCisgKiBub24temVybyBvdGhlcndpc2UuCisgKi8KKworI2RlZmluZSBBRFBfSW5mb19DYW5UYXJnZXRFeGVjdXRlICAgICAgQURQU1VCUkVBU09OKENJX0hBRFAsMTIpCisvKiBBRFBfSW5mb19DYW5UYXJnZXRFeGVjdXRlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBUaGlzIG1lc3NhZ2UgaXMgdXNlZCB0byBzZWUgaWYgdGhlIHRhcmdldCBpcyBjdXJyZW50bHkgaW4KKyAqIGFuIGV4ZWN1dGFibGUgc3RhdGUuICBUeXBpY2FsbHkgdGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGRlYnVnZ2VyCisgKiBpbml0aWFsaXNlcy4gIElmIGEgbm9uLWVycm9yIHN0YXRpcyBpcyByZXR1cm5lZCB0aGVuIHRoZSB1c2VyIGlzCisgKiBhbGxvd2VkIHRvICdnbycgaW1tZWRpYXRlbHkuCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAoKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMpCisgKgorICogJ3N0YXR1cycgcmV0dXJucyBSRElFcnJvcl9Ob0Vycm9yIGlmIHRhcmdldCBpcyByZWFkeSB0byBleGVjdXRlLgorICogb3RoZXIgdmFsdWVzIGluZGljYXRlIHdoeSBpdCBjYW5ub3QgZXhlY3V0ZS4KKyAqLworCisjZGVmaW5lIEFEUF9JbmZvX0FnZW50RW5kaWFuZXNzICAgICBBRFBTVUJSRUFTT04oQ0lfSEFEUCwxMykKKy8qIEFEUF9JbmZvX0FnZW50RW5kaWFuZXNzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBUaGlzIG1lc3NhZ2UgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGVuZGlhbmVzcyBvZiB0aGUKKyAqIGRlYnVnIGFnZW50CisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgICgpCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cykKKyAqCisgKiBzdGF0dXMgc2hvdWxkIGJlIFJESUVycm9yX0xpdHRsZUVuZGlhbiBvciBSRElFcnJvcl9CaWdFbmRpYW4KKyAqIGFueSBvdGhlciB2YWx1ZSBpbmRpY2F0ZXMgdGhlIHRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMKKyAqIHJlcXVlc3QsIHNvIHRoZSBkZWJ1Z2dlciB3aWxsIGhhdmUgdG8gbWFrZSBhIGJlc3QgZ3Vlc3MsIHdoaWNoCisgKiBwcm9iYWJseSBtZWFucyBvbmx5IGFsbG93IGxpdHRsZSBlbmRpYW4gbG9hZGFnZW50aW5nLgorICovCisKKworI2RlZmluZSBBRFBfQ29udHJvbCAgICAgICAgICAgICBBRFBSRUFTT04oQ0lfSEFEUCwyKQorLyogVGhpcyBtZXNzYWdlIGFsbG93cyBmb3IgdGhlIHN0YXRlIG9mIHRoZSBkZWJ1ZyBhZ2VudCB0byBiZQorICogbWFuaXB1bGF0ZWQgYnkgdGhlIGhvc3QuCisgKi8KKworLyogVGhlIGZvbGxvd2luZyBhcmUgc3ViIHJlYXNvbiBjb2RlcyB0byBBRFAgY29udHJvbCwgdGhlIGZpcnN0IHBhcmFtZXRlcgorICogaXMgdGhlIHN1YiByZWFzb24gY29kZSB3aGljaCBkZWZpbmVzIHRoZSBmb3JtYXQgb2Ygc3Vic2VxdWVudCBwYXJhbWV0ZXJzLgorICoKKyAqIHdvcmQgICAgICAgICBzdWIgcmVhc29uIGNvZGUKKyAqLworCisjZGVmaW5lIEFEUF9DdHJsX05PUCAgICAgICAgICAgICAgICAgICAgQURQU1VCUkVBU09OKENJX0hBRFAsMCkKKy8qIEFEUF9DdHJsX05PUAorICogLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBUaGlzIG1lc3NhZ2UgaXMgdXNlZCB0byBjaGVjayB0aGF0IEFEUF9DdHJsIG1lc3NhZ2VzIGFyZQorICogc3VwcG9ydGVkLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzKQorICoKKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgQURQX0N0cmwgbWVzc2FnZXMgYXJlCisgKiBzdXBwb3J0ZWQsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqLworCisjZGVmaW5lIEFEUF9DdHJsX1ZlY3RvckNhdGNoICAgICAgICAgICAgQURQU1VCUkVBU09OKENJX0hBRFAsMSkKKy8qIEFEUF9DdHJsX1ZlY3RvckNhdGNoCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogU3BlY2lmaWVzIHdoaWNoIGhhcmR3YXJlIGV4Y2VwdGlvbnMgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZQorICogZGVidWdnZXIuCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAod29yZCBiaXRtYXApCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cykKKyAqCisgKiAnYml0bWFwJyBpcyBhIGJpdC1tYXNrIG9mIGV4Y2VwdGlvbnMgdG8gYmUgcmVwb3J0ZWQsIGRlc2NyaWJlZCBpbiBtb3JlCisgKiBkZXRhaWwgYmVsb3cuICBBIHNldCBiaXQgaW5kaWNhdGVzIHRoYXQgdGhlIGV4Y2VwdGlvbiBzaG91bGQgYmUKKyAqIHJlcG9ydGVkIHRvIHRoZSBkZWJ1Z2dlciwgYSBjbGVhciBiaXQgaW5kaWNhdGVzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGV4Y2VwdGlvbiB2ZWN0b3Igc2hvdWxkIGJlIHRha2VuLgorICogJ3N0YXR1cycgaXMgUkRJRXJyb3JfTm9FcnJvciB0byBpbmRpY2F0ZSBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuCisgKi8KKworLyogJ2JpdG1hcCc6LSAqLworLyogUmVzZXQoYnJhbmNoIHRocm91Z2ggemVybykuICovCisjZGVmaW5lIEFEUF9DdHJsX1ZlY3RvckNhdGNoX0JyYW5jaFRocm91Z2haZXJvICAgICAgKDEgPDwgMCkKKworLyogVW5kZWZpbmVkIEluc3RydWN0aW9uLiAqLworI2RlZmluZSBBRFBfQ3RybF9WZWN0b3JDYXRjaF9VbmRlZmluZWRJbnN0ciAgICAgICAgICgxIDw8IDEpCisKKy8qIFNvZnR3YXJlIEludGVycnVwdC4gKi8KKyNkZWZpbmUgQURQX0N0cmxfVmVjdG9yQ2F0Y2hfU1dJICAgICAgICAgICAgICAgICAgICAoMSA8PCAyKQorCisvKiBQcmVmZXRjaCBBYm9ydC4gKi8KKyNkZWZpbmUgQURQX0N0cmxfVmVjdG9yQ2F0Y2hfUHJlZmV0Y2hBYm9ydCAgICAgICAgICAoMSA8PCAzKQorCisvKiBEYXRhIEFib3J0LiAqLworI2RlZmluZSBBRFBfQ3RybF9WZWN0b3JDYXRjaF9EYXRhQWJvcnQgICAgICAgICAgICAgICgxIDw8IDQpCisKKy8qIEFkZHJlc3MgRXhjZXB0aW9uLiAqLworI2RlZmluZSBBRFBfQ3RybF9WZWN0b3JDYXRjaF9BZGRyZXNzRXhjZXB0aW9uICAgICAgICgxIDw8IDUpCisKKy8qIEludGVycnVwdCBSZXF1ZXN0LiAqLworI2RlZmluZSBBRFBfQ3RybF9WZWN0b3JDYXRjaF9JUlEgICAgICAgICAgICAgICAgICAgICgxIDw8IDYpCisKKy8qIEZhc3QgSW50ZXJydXB0IFJlcXVlc3QuICovCisjZGVmaW5lIEFEUF9DdHJsX1ZlY3RvckNhdGNoX0ZJUSAgICAgICAgICAgICAgICAgICAgKDEgPDwgNykKKworLyogRXJyb3IuICovCisjZGVmaW5lIEFEUF9DdHJsX1ZlY3RvckNhdGNoX0Vycm9yICAgICAgICAgICAgICAgICAgKDEgPDwgOCkKKworCisjZGVmaW5lIEFEUF9DdHJsX1BvaW50U3RhdHVzX1dhdGNoICAgICAgQURQU1VCUkVBU09OKENJX0hBRFAsMikKKy8qIEFEUF9DdHJsX1BvaW50U3RhdHVzX1dhdGNoCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogUmV0dXJucyB0aGUgaGFyZHdhcmUgcmVzb3VyY2UgbnVtYmVyIGFuZCB0aGUgdHlwZSBvZiB0aGF0CisgKiByZXNvdXJjZSB3aGVuIGdpdmVuIGEgd2F0Y2hwb2ludCBoYW5kbGUuICBTaG91bGQgb25seSBiZSBjYWxsZWQgaWYKKyAqIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBBRFBfSW5mb19Qb2ludHMgaGFkIEFEUF9JbmZvX1BvaW50c19TdGF0dXMgc2V0LgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKHdvcmQgaGFuZGxlKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMsIHdvcmQgaHdyZXNvdXJjZSwgd29yZCB0eXBlKQorICoKKyAqICdoYW5kbGUnIGlzIGEgaGFuZGxlIHRvIGEgd2F0Y2hwb2ludC4KKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlLgorICogJ2h3cmVzb3VyY2UnIGlzIHRoZSBoYXJkd2FyZSByZXNvdXJjZSBudW1iZXIuICEhISEhCisgKiAndHlwZScgaXMgdGhlIHR5cGUgb2YgdGhlIHJlc291cmNlLgorICovCisKKworI2RlZmluZSBBRFBfQ3RybF9Qb2ludFN0YXR1c19CcmVhayAgICAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDMpCisvKiBBRFBfQ3RybF9Qb2ludFN0YXR1c19CcmVhaworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFJldHVybnMgdGhlIGhhcmR3YXJlIHJlc291cmNlIG51bWJlciBhbmQgdGhlIHR5cGUgb2YgdGhhdAorICogcmVzb3VyY2Ugd2hlbiBnaXZlbiBhIGJyZWFrcG9pbnQgaGFuZGxlLiAgU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmCisgKiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgQURQX0luZm9fUG9pbnRzIGhhZCBBRFBfSW5mb19Qb2ludHNfU3RhdHVzIHNldC4KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgICh3b3JkIGhhbmRsZSkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzLCB3b3JkIGh3cmVzb3VyY2UsIHdvcmQgdHlwZSkKKyAqCisgKiAnaGFuZGxlJyBpcyBhIGhhbmRsZSB0byBhIGJyZWFrcG9pbnQuCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqICdod3Jlc291cmNlJyBpcyB0aGUgaGFyZHdhcmUgcmVzb3VyY2UgbnVtYmVyLgorICogJ3R5cGUnIGlzIHRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZS4KKyAqLworCisjZGVmaW5lIEFEUF9DdHJsX1NlbWlIb3N0aW5nX1NldFN0YXRlICAgQURQU1VCUkVBU09OKENJX0hBRFAsNCkKKy8qIEFEUF9DdHJsX1NlbWlIb3N0aW5nX1NldFN0YXRlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogU2V0cyB3aGV0aGVyIG9yIG5vdCBzZW1pLWhvc3RpbmcgaXMgZW5hYmxlZC4KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgICh3b3JkIHNlbWlob3N0aW5nc3RhdGUpCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cykKKyAqCisgKiAnc2VtaWhvc3RpbmdzdGF0ZScgc2V0cyBzZW1pLWhvc3RpbmcgdG8gZW5hYmxlZCBpZiB6ZXJvLCBvdGhlcndpc2UKKyAqIGl0IGRpc2FibGVzIHNlbWktaG9zdGluZy4KKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlLgorICoKKyAqIE5PVEU6IFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIEFEUF9JbmZvX1NlbWlIb3N0aW5nIGRpZG4ndCByZXR1cm4KKyAqIGFuIGVycm9yLgorICovCisKKworI2RlZmluZSBBRFBfQ3RybF9TZW1pSG9zdGluZ19HZXRTdGF0ZSAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDUpCisvKiBBRFBfQ3RybF9TZW1pSG9zdGluZ19HZXRTdGF0ZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFJlYWRzIHdoZXRoZXIgb3Igbm90IHNlbWktaG9zdGluZyBpcyBlbmFibGVkLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzLCB3b3JkIHNlbWlob3N0aW5nc3RhdGUpCisgKgorICogJ3N0YXR1cycgaXMgUkRJRXJyb3JfTm9FcnJvciB0byBpbmRpY2F0ZSBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuCisgKiAnc2VtaWhvc3RpbmdzdGF0ZScgaXMgemVybyBpZiBzZW1pLWhvc3RpbmcgaXMgZW5hYmxlZCwgbm9uLXplcm8gb3RoZXJ3aXNlLgorICoKKyAqIE5PVEU6IFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIEFEUF9JbmZvX1NlbWlIb3N0aW5nIGRpZG4ndCByZXR1cm4KKyAqIGFuIGVycm9yLgorICovCisKKworI2RlZmluZSBBRFBfQ3RybF9TZW1pSG9zdGluZ19TZXRWZWN0b3IgIEFEUFNVQlJFQVNPTihDSV9IQURQLDYpCisvKiBBRFBfQ3RybF9TZW1pSG9zdGluZ19TZXRWZWN0b3IKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogU2V0cyB0aGUgc2VtaS1ob3N0aW5nIHZlY3Rvci4KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgICh3b3JkIHNlbWlob3N0aW5ndmVjdG9yKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMpCisgKgorICogJ3NlbWlob3N0aW5ndmVjdG9yJyBob2xkcyB0aGUgdmFsdWUgdGhlIHZlY3RvciBpcyB0byBiZSBzZXQgdG8uCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqCisgKiBOT1RFOiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBBRFBfSW5mb19TZW1pSG9zdGluZyBkaWRuJ3QgcmV0dXJuCisgKiBhbiBlcnJvci4KKyAqLworCisKKyNkZWZpbmUgQURQX0N0cmxfU2VtaUhvc3RpbmdfR2V0VmVjdG9yICBBRFBTVUJSRUFTT04oQ0lfSEFEUCw3KQorLyogQURQX0N0cmxfU2VtaUhvc3RpbmdfR2V0VmVjdG9yCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzZW1pLWhvc3RpbmcgdmVjdG9yLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzLCB3b3JkIHNlbWlob3N0aW5ndmVjdG9yKQorICoKKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlLgorICogJ3NlbWlob3N0aW5ndmVjdG9yJyBob2xkcyB0aGUgdmFsdWUgb2YgdGhlIHZlY3Rvci4KKyAqCisgKiBOT1RFOiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBBRFBfSW5mb19TZW1pSG9zdGluZyBkaWRuJ3QgcmV0dXJuCisgKiBhbiBlcnJvci4KKyAqLworCisKKyNkZWZpbmUgQURQX0N0cmxfTG9nICAgICAgICAgICAgICAgICAgICBBRFBTVUJSRUFTT04oQ0lfSEFEUCw4KQorLyogQURQX0N0cmxfTG9nCisgKiAtLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFJldHVybnMgdGhlIGxvZ2dpbmcgc3RhdGUuCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAoKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMsIHdvcmQgbG9nc2V0dGluZykKKyAqCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqICdsb2dzZXR0aW5nJyBpcyBhIGJpdG1hcCBzcGVjaWZ5aW5nIHRoZSBsZXZlbCBvZiBsb2dnaW5nIGRlc2lyZWQsCisgKiAgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGJlbG93LiAgVGhlIGJpdHMgY2FuIGJlIE9SZWQgdG9nZXRoZXIKKyAqLworCisvKiAnbG9nc2V0dGluZyc6LSAqLworCisvKiBObyBsb2dnaW5nLiAqLworI2RlZmluZSBBRFBfQ3RybF9Mb2dfTm9Mb2dnaW5nICAgICgwKQorLyogUkRJIGxldmVsIGxvZ2dpbmcuICovCisjZGVmaW5lIEFEUF9DdHJsX0xvZ19SREkgICAgICAgICAgKDEgPDwgMCkKKy8qIEFEUCBieXRlIGxldmVsIGxvZ2dpbmcuICovCisjZGVmaW5lIEFEUF9DdHJsX0xvZ19BRFAgICAgICAgICAgKDEgPDwgMSkKKworCisjZGVmaW5lIEFEUF9DdHJsX1NldExvZyAgICAgICAgICAgICAgICAgQURQU1VCUkVBU09OKENJX0hBRFAsOSkKKy8qIEFEUF9DdHJsX1NldExvZworICogLS0tLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBTZXRzIHRoZSBsb2dnaW5nIHN0YXRlLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKHdvcmQgbG9nc2V0dGluZykKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzKQorICoKKyAqICdsb2dzZXR0aW5nJyBpcyB0aGUgc2FtZSBhcyBpbiBBRFBfQ3RybF9Mb2cgYWJvdmUuCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqLworCisjZGVmaW5lIEFEUF9DdHJsX1NlbWlIb3N0aW5nX1NldEFSTVNXSSAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDEwKQorLyogQURQX0N0cmxfU2VtaUhvc3RpbmdfU2V0QVJNU1dJCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFNldHMgdGhlIG51bWJlciBvZiB0aGUgQVJNIFNXSSB1c2VkIGZvciBzZW1paG9zdGluZworICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKHdvcmQgQVJNX1NXSV9udW1iZXIpCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cykKKyAqCisgKiBUaGUgZGVidWcgYWdlbnQgd2lsbCBpbnRlcnByZXQgQVJNIFNXSSdzIHdpdGggdGhlIFNXSSBudW1iZXIgc3BlY2lmaWVkCisgKiBhcyBzZW1paG9zdGluZyBTV0kncy4KKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlLgorICoKKyAqIE5PVEU6IFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIEFEUF9JbmZvX0NoYW5nZWFibGVTSFNXSSBkaWRuJ3QgcmV0dXJuCisgKiBhbiBlcnJvci4KKyAqLworCisKKyNkZWZpbmUgQURQX0N0cmxfU2VtaUhvc3RpbmdfR2V0QVJNU1dJICAgQURQU1VCUkVBU09OKENJX0hBRFAsMTEpCisvKiBBRFBfQ3RybF9TZW1pSG9zdGluZ19HZXRBUk1TV0kKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogUmVhZHMgdGhlIG51bWJlciBvZiB0aGUgQVJNIFNXSSB1c2VkIGZvciBzZW1paG9zdGluZworICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzLCB3b3JkIEFSTV9TV0lfbnVtYmVyKQorICoKKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlLgorICogQVJNX1NXSV9udW1iZXIgaXMgdGhlIFNXSSBudW1iZXIgd2hpY2ggaXMgdXNlZCBmb3Igc2VtaWhvc3RpbmcuCisgKgorICogTk9URTogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgQURQX0luZm9fU2VtaUhvc3RpbmcgZGlkbid0IHJldHVybgorICogYW4gZXJyb3IuCisgKi8KKworI2RlZmluZSBBRFBfQ3RybF9TZW1pSG9zdGluZ19TZXRUaHVtYlNXSSAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDEyKQorLyogQURQX0N0cmxfU2VtaUhvc3RpbmdfU2V0VGh1bWJTV0kKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBTZXRzIHRoZSBudW1iZXIgb2YgdGhlIFRodW1iIFNXSSB1c2VkIGZvciBzZW1paG9zdGluZworICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKHdvcmQgVGh1bWJfU1dJX251bWJlcikKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzKQorICoKKyAqIFRoZSBkZWJ1ZyBhZ2VudCB3aWxsIGludGVycHJldCBUaHVtYiBTV0kncyB3aXRoIHRoZSBTV0kgbnVtYmVyIHNwZWNpZmllZAorICogYXMgc2VtaWhvc3RpbmcgU1dJJ3MuCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqCisgKiBOT1RFOiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBBRFBfSW5mb19DaGFuZ2VhYmxlU0hTV0kgZGlkbid0IHJldHVybgorICogYW4gZXJyb3IuCisgKi8KKworCisjZGVmaW5lIEFEUF9DdHJsX1NlbWlIb3N0aW5nX0dldFRodW1iU1dJICAgQURQU1VCUkVBU09OKENJX0hBRFAsMTMpCisvKiBBRFBfQ3RybF9TZW1pSG9zdGluZ19HZXRUaHVtYlNXSQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFJlYWRzIHRoZSBudW1iZXIgb2YgdGhlIFRodW1iIFNXSSB1c2VkIGZvciBzZW1paG9zdGluZworICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzLCB3b3JkIEFSTV9UaHVtYl9udW1iZXIpCisgKgorICogJ3N0YXR1cycgaXMgUkRJRXJyb3JfTm9FcnJvciB0byBpbmRpY2F0ZSBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuCisgKiBUaHVtYl9TV0lfbnVtYmVyIGlzIHRoZSBTV0kgbnVtYmVyIHdoaWNoIGlzIHVzZWQgZm9yIHNlbWlob3N0aW5nLgorICoKKyAqIE5PVEU6IFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIEFEUF9JbmZvX1NlbWlIb3N0aW5nIGRpZG4ndCByZXR1cm4KKyAqIGFuIGVycm9yLgorICovCisKKworI2RlZmluZSBBRFBfQ3RybF9Eb3dubG9hZF9TdXBwb3J0ZWQgICBBRFBTVUJSRUFTT04oQ0lfSEFEUCwxNCkKKy8qIEFEUF9DdHJsX0Rvd25sb2FkX1N1cHBvcnRlZAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBDYW4gY29uZmlndXJhdGlvbiBiZSBkb3dubG9hZGVkPworICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzKQorICoKKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgaWYgdGhlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGRvd25sb2FkZWQsCisgKiBub24temVybyBvdGhlcndpc2UuCisgKgorICogTk9URTogRXF1aXZhbGVudCB0byBSRElJbmZvX0Rvd25Mb2FkLgorICovCisKKworI2RlZmluZSBBRFBfQ3RybF9Eb3dubG9hZF9EYXRhICAgICAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDE1KQorLyogQURQX0N0cmxfRG93bmxvYWRfRGF0YQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogTG9hZHMgY29uZmlndXJhdGlvbiBkYXRhLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKHdvcmQgbmJ5dGVzLCB3b3JkcyBkYXRhKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMpCisgKgorICogJ25ieXRlcycgaXMgdGhlIG51bWJlciBvZiAqYnl0ZXMqIGJlaW5nIHNlbnQuCisgKiAnZGF0YScgaXMgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YS4gTk9URTogZGF0YSBtdXN0IG5vdCBjYXVzZSB0aGUgYnVmZmVyCisgKiBzaXplIHRvIGV4Y2VlZCB0aGUgbWF4aW11bSBhbGxvd2VkIGJ1ZmZlciBzaXplLgorICogJ3N0YXR1cycgaXMgUkRJRXJyb3JfTm9FcnJvciB0byBpbmRpY2F0ZSBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuCisgKgorICogTk9URTogRXF1aXZhbGVudCB0byBSRFBfTG9hZENvbmZpZ0RhdGEuICBTaG91bGQgb25seSBiZSB1c2VkIGlmCisgKiBBRFBfSUNFTV9BZGRDb25maWcgZGlkbid0IHJldHVybiBhbiBlcnJvci4KKyAqLworCisKKyNkZWZpbmUgQURQX0N0cmxfRG93bmxvYWRfQWdlbnQgICAgICAgICAgICBBRFBTVUJSRUFTT04oQ0lfSEFEUCwxNikKKy8qIEFEUF9DdHJsX0Rvd25sb2FkX0FnZW50CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogUHJlcGFyZXMgRGVidWcgQWdlbnQgdG8gcmVjZWl2ZSBjb25maWd1cmF0aW9uIGRhdGEgd2hpY2ggaXQKKyAqIHNob3VsZCBpbnRlcnByZXQgYXMgYSBuZXcgdmVyc2lvbiBvZiB0aGUgRGVidWcgQWdlbnQgY29kZS4KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgICh3b3JkIGxvYWRhZGRyZXNzLCB3b3JkIHNpemUpCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cykKKyAqCisgKiAnbG9hZGFkZHJlc3MnIGlzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBuZXcgRGVidWcgQWdlbnQgY29kZSBzaG91bGQgYmUKKyAqIGxvYWRlZC4KKyAqICdzaXplJyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIERlYnVnIEFnZW50IGNvZGUgdG8gYmUgbG9hZGVkLgorICogJ3N0YXR1cycgaXMgUkRJRXJyb3JfTm9FcnJvciB0byBpbmRpY2F0ZSBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuCisgKgorICogTk9URTogRXF1aXZhbGVudCB0byBSRFBfTG9hZEFnZW50LiAgVGhlIGRhdGEgd2lsbCBiZSBkb3dubG9hZGVkIHVzaW5nCisgKiBBRFBfQ3RybF9Eb3dubG9hZF9EYXRhLiAgVGhlIG5ldyBhZ2VudCBpcyBzdGFydGVkIHdpdGggQURQX0N0cmxfU3RhcnRfQWdlbnQKKyAqLworCisKKyNkZWZpbmUgQURQX0N0cmxfU3RhcnRfQWdlbnQgICAgICAgICAgICAgICAgICAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDE3KQorLyogQURQX0N0cmxfU3RhcnRfQWdlbnQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBJbnN0cnVjdCBEZWJ1ZyBBZ2VudCB0byBiZWdpbiBleGVjdXRpb24gb2YgbmV3IGFnZW50LAorICogd2hpY2ggaGFzIGJlZW4gZG93bmxvYWRlZCBieSBBRFBfQ3RybF9Eb3dubG9hZF9BZ2VudC4KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgICh3b3JkIHN0YXJ0YWRkcmVzcykKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzKQorICoKKyAqICdzdGFydGFkZHJlc3MnIGlzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBuZXcgRGVidWcgQWdlbnQgY29kZSBzaG91bGQgYmUKKyAqICBlbnRlcmVkLCBhbmQgbXVzdCBzYXRpc2Z5OgorICogICAgIChsb2FkYWRkcmVzcyA8PSBzdGFydGFkZHJlc3MgPD0gKGxvYWRhZGRyZXNzICsgc2l6ZSkpCisgKiAgd2hlcmUgJ2xvYWRhZGRyZXNzJyBhbmQgICdzaXplJyB3ZXJlIHNwZWNpZmllZCBpbiB0aGUKKyAqICBBRFBfQ3RybF9Eb3dubG9hZF9BZ2VudCBtZXNzYWdlLgorICoKKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlLgorICovCisKKworI2RlZmluZSBBRFBfQ3RybF9TZXRUb3BNZW0gICAgICAgICAgICAgICAgICAgICAgQURQU1VCUkVBU09OKENJX0hBRFAsMTgpCisvKiBBRFBfQ3RybF9TZXRUb3BNZW0KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogU2V0cyB0aGUgdG9wIG9mIG1lbW9yeSBmb3IgSUNFbWFuMiBzeXN0ZW1zLCBzbyB0aGF0IHRoZSBDIExpYnJhcnkKKyAqIGNhbiBhbGxvY2F0ZSB0aGUgc3RhY2sgaW4gdGhlIGNvcnJlY3QgcGxhY2Ugb24gc3RhcnR1cC4KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgICh3b3JkIG1lbV90b3ApCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cykKKyAqCisgKiBUaGlzIHJlcXVlc3Qgc2hvdWxkIG9ubHkgYmUgc3VwcG9ydGVkIGJ5IElDRW1hbjIuICBTdGFuZGFyZCBBbmdlbCBzeXN0ZW1zCisgKiBzaG91bGQgcmV0dXJuIGFuIGVycm9yICh1bnJlY29nbmlzZWQgaXMgZmluZSkuCisgKi8KKworCisjZGVmaW5lIEFEUF9SZWFkICAgICAgICAgICAgICAgIEFEUFJFQVNPTihDSV9IQURQLDMpCisjZGVmaW5lIEFEUF9SZWFkSGVhZGVyU2l6ZSAgICAgIChBRFBfREVGQVVMVF9IRUFERVJfU0laRSArIDIqc2l6ZW9mKHdvcmQpKQorCisvKiBBRFBfUmVhZAorICogLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFJlcXVlc3QgZm9yIGEgdHJhbnNlciBvZiBtZW1vcnkgY29udGVudHMgZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZQorICogZGVidWdnZXIuCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAod29yZCBhZGRyZXNzLCB3b3JkIG5ieXRlcykKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzLCB3b3JkIHJuYnl0ZXMgWywgYnl0ZXMgZGF0YV0pCisgKgorICogJ2FkZHJlc3MnIGlzIHRoZSBhZGRyZXNzIGZyb20gd2hpY2ggbWVtb3J5IHRyYW5zZXIgc2hvdWxkIHN0YXJ0LgorICogJ25ieXRlcycgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byB0cmFuc2Zlci4KKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlLgorICogJ3JuYnl0ZXMnIGhvbGRzIHRoZSBudW1iZXIgb2YgcmVxdWVzdGVkIGJ5dGVzIE5PVCByZWFkIChpLmUuIHplcm8KKyAqIGluZGljYXRlcyBzdWNjZXNzLCBub24temVybyBpbmRpY2F0ZXMgYW4gZXJyb3IpLgorICogJ2RhdGEnIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkIG1pbnVzICdybmJ5dGVzJy4KKyAqLworCisKKworI2RlZmluZSBBRFBfV3JpdGUgICAgICAgICAgICAgICBBRFBSRUFTT04oQ0lfSEFEUCw0KQorI2RlZmluZSBBRFBfV3JpdGVIZWFkZXJTaXplICAgICAoQURQX0RFRkFVTFRfSEVBREVSX1NJWkUgKyAyKnNpemVvZih3b3JkKSkKKworLyogQURQX1dyaXRlCisgKiAtLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFJlcXVlc3QgZm9yIGEgdHJhbnNmZXIgb2YgbWVtb3J5IGNvbnRlbnRzIGZyb20gdGhlIGRlYnVnZ2VyIHRvCisgKiB0aGUgdGFyZ2V0LgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKHdvcmQgYWRkcmVzcywgd29yZCBuYnl0ZXMsIGJ5dGVzIGRhdGEpCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cyBbLCB3b3JkIHJuYnl0ZXNdKQorICoKKyAqICdhZGRyZXNzJyBpcyB0aGUgYWRkcmVzcyBmcm9tIHdoaWNoIG1lbW9yeSB0cmFuc2VyIHNob3VsZCBzdGFydC4KKyAqICduYnl0ZXMnIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIuCisgKiAnZGF0YScgaG9sZHMgdGhlIGJ5dGVzIHRvIGJlIHRyYW5zZmVycmVkLgorICogJ3N0YXR1cycgaXMgUkRJRXJyb3JfTm9FcnJvciB0byBpbmRpY2F0ZSBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuCisgKiAncm5ieXRlcycgaG9sZHMgdGhlIG51bWJlciBvZiByZXF1ZXN0ZWQgYnl0ZXMgTk9UIHdyaXR0ZW4gKGkuZS4gemVybworICogaW5kaWNhdGVzIHN1Y2Nlc3MsIG5vbi16ZXJvIGluZGljYXRlcyBhbiBlcnJvcikgaWYgc3RhdHVzIGluZGljYXRlZCBhbgorICogZXJyb3IuCisgKi8KKworCisKKyNkZWZpbmUgQURQX0NQVXJlYWQgICAgICAgICAgICAgQURQUkVBU09OKENJX0hBRFAsNSkKKy8qIEFEUF9DUFVyZWFkCisgKiAtLS0tLS0tLS0tLQorICogU3VtbWFyeTogVGhpcyBpcyBhIHJlcXVlc3QgdG8gcmVhZCB2YWx1ZXMgaW4gdGhlIENQVS4KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgIChieXRlIG1vZGUsIHdvcmQgbWFzaykKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzLCB3b3JkcyBkYXRhKQorICoKKyAqICdtb2RlJyBkZWZpbmVzIHRoZSBwcm9jZXNzb3IgbW9kZSBmcm9tIHdoaWNoIHRoZSB0cmFuc2ZlciBzaG91bGQgYmUgbWFkZS4KKyAqIEl0IGlzIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBiZWxvdy4KKyAqICdtYXNrJyBpbmRpY2F0ZXMgd2hpY2ggcmVnaXN0ZXJzIHNob3VsZCBiZSB0cmFuc2ZlcnJlZC4gU2V0dGluZyBhIGJpdCB0bworICogb25lIHdpbGwgY2F1c2UgdGhlIGRlc2lnbmF0ZWQgcmVnaXN0ZXIgdG8gYmUgdHJhbnNmZXJyZWQuIFRoZSBkZXRhaWxzCisgKiBvZiBtYXNrIGFyZSBzcGVjaWZpZWQgYmVsb3cuCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqICdkYXRhJyBob2xkcyB0aGUgdmFsdWVzIG9mIHRoZSByZWdpc3RlcnMgb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLAorICogb3RoZXJ3aXNlIGl0IGp1c3QgaG9sZHMgcnViYmlzaC4gIFRoZSBsb3dlc3QgbnVtYmVyZWQgcmVnaXN0ZXIgaXMKKyAqIHRyYW5zZmVycmVkIGZpcnN0LiAgTk9URTogZGF0YSBtdXN0IG5vdCBjYXVzZSB0aGUgYnVmZmVyIHNpemUgdG8gZXhjZWVkCisgKiB0aGUgbWF4aW11bSBhbGxvd2VkIGJ1ZmZlciBzaXplLgorICovCisKKy8qICdtb2RlJzotICovCisvKiBUaGUgbW9kZSBudW1iZXIgaXMgdGhlIHNhbWUgYXMgdGhlIG1vZGUgbnVtYmVyIHVzZWQgYnkgYW4gQVJNOyBhIHZhbHVlIG9mCisgICAyNTUgaW5kaWNhdGVzIHRoZSBjdXJyZW50IG1vZGUuICovCisjZGVmaW5lIEFEUF9DUFVtb2RlX0N1cnJlbnQgICAgICgyNTUpCisKKy8qIDI2Yml0IHVzZXIgbW9kZS4gKi8KKyNkZWZpbmUgQURQX0NQVXJlYWRfMjZiaXRVc2VyICAgKDB4MCkKKworLyogMjZiaXQgRklRIG1vZGUuICovCisjZGVmaW5lIEFEUF9DUFVyZWFkXzI2Yml0RklRICAgICgweDEpCisKKy8qIDI2Yml0IElSUSBtb2RlLiAqLworI2RlZmluZSBBRFBfQ1BVcmVhZF8yNmJpdElSUSAgICAoMHgyKQorCisvKiAyNmJpdCBTdXBlcnZpc29yIG1vZGUuICovCisjZGVmaW5lIEFEUF9DUFVyZWFkXzI2Yml0U1ZDICAgICgweDMpCisKKy8qIDMyYml0IHVzZXIgbW9kZS4gKi8KKyNkZWZpbmUgQURQX0NQVXJlYWRfMzJiaXRVc2VyICAgKDB4MTApCisKKy8qIDMyYml0IEZJUSBtb2RlLiAqLworI2RlZmluZSBBRFBfQ1BVcmVhZF8zMmJpdEZJUSAgICAoMHgxMSkKKworLyogMzJiaXQgSVJRIG1vZGUuICovCisjZGVmaW5lIEFEUF9DUFVyZWFkXzMyYml0SVJRICAgICgweDEyKQorCisvKiAzMmJpdCBTdXBlcnZpc29yIG1vZGUuICovCisjZGVmaW5lIEFEUF9DUFVyZWFkXzMyYml0U1ZDICAgICgweDEzKQorCisvKiAzMmJpdCBBYm9ydCBtb2RlLiAqLworI2RlZmluZSBBRFBfQ1BVcmVhZF8zMmJpdEFib3J0ICAoMHgxNykKKworLyogMzJiaXQgVW5kZWZpbmVkIG1vZGUuICovCisjZGVmaW5lIEFEUF9DUFVyZWFkXzMyYml0VW5kZWYgICgweDFCKQorCisvKiAjMzJiaXQgU3lzdGVtIG1vZGUgLSBBZGRlZCBpbiBBcmNoaXRlY3R1cmUgNCBBUk1zIGUuZy5BUk03VERNSSAqLworI2RlZmluZSBBRFBfQ1BVcmVhZF8zMmJpdFN5c3RlbSAoMHgxRikKKworLyogJ21hc2snOi0gKi8KKy8qIFJlcXVlc3QgcmVnaXN0ZXJzIFJPLVIxNC4gKi8KKyNkZWZpbmUgQURQX0NQVXJlYWRfUmVnc01hc2sgICgweDdGRkYpCisKKy8qIFJlcXVlc3QgUHJvZ3JhbSBDb3VudGVyIChpbmNsdWRpbmcgbW9kZSBhbmQgZmxhZyBiaXRzIGluIDI2LWJpdCBtb2Rlcy4gKi8KKyNkZWZpbmUgQURQX0NQVXJlYWRfUENtb2RlICAgICgxIDw8IDE1KQorCisvKiBSZXF1ZXN0IFByb2dyYW0gQ291bnRlciAod2l0aG91dCBtb2RlIGFuZCBmbGFnIGJpdHMgaW4gMjYtYml0IG1vZGVzLiAqLworI2RlZmluZSBBRFBfQ1BVcmVhZF9QQ25vbW9kZSAgKDEgPDwgMTYpCisKKy8qIFJlcXVlc3RzIHRoZSB0cmFuc2ZlciBvZiB0aGUgQ1BTUiAqLworI2RlZmluZSBBRFBfQ1BVcmVhZF9DUFNSICAgICAgKDEgPDwgMTcpCisKKy8qIEluIHByb2Nlc3NvciBtb2RlcyB3aXRoIGFuIFNQU1Iobm9uLXVzZXIgbW9kZXMpLCBiaXQgMTkgcmVxdWVzdHMgaXRzCisgICB0cmFuc2ZlciAqLworI2RlZmluZSBBRFBfQ1BVcmVhZF9TUFNSICAgICAgKDEgPDwgMTgpCisKKworCisjZGVmaW5lIEFEUF9DUFV3cml0ZSAgICAgICAgICAgIEFEUFJFQVNPTihDSV9IQURQLDYpCisvKiBBRFBfQ1BVd3JpdGUKKyAqIC0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogVGhpcyBpcyBhIHJlcXVlc3QgdG8gd3JpdGUgdmFsdWVzIHRvIHRoZSBDUFUuCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAoYnl0ZSBtb2RlLCB3b3JkIG1hc2ssIHdvcmRzIGRhdGEpCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cykKKyAqCisgKiAnbW9kZScgZGVmaW5lcyB0aGUgcHJvY2Vzc29yIG1vZGUgdG8gd2hpY2ggdGhlIHRyYW5zZmVyIHNob3VsZCBiZSBtYWRlLgorICogVGhlIG1vZGUgbnVtYmVyIGlzIHRoZSBzYW1lIGFzIHRoZSBtb2RlIG51bWJlciB1c2VkIGJ5IEFSTTsgYSB2YWx1ZSBvZgorICogMjU1IGluZGljYXRlcyB0aGUgY3VycmVudCBtb2RlLiBTZWUgQURQX0NQVXJlYWQgYWJvdmUgZm9yIG1vcmUgZGV0YWlsLgorICogJ21hc2snIGluZGljYXRlcyB3aGljaCByZWdpc3RlcnMgc2hvdWxkIGJlIHRyYW5zZmVycmVkLiBTZXR0aW5nIGEgYml0IHRvCisgKiBvbmUgd2lsbCBjYXVzZSB0aGUgZGVzaWduYXRlZCByZWdpc3RlciB0byBiZSB0cmFuc2ZlcnJlZC4gVGhlIGRldGFpbHMKKyAqIG9mIG1hc2sgYXJlIHNwZWNpZmllZCBhYm92ZSBpbiBBRFBfQ1BVcmVhZC4KKyAqICdkYXRhJyBob2xkcyB0aGUgdmFsdWVzIG9mIHRoZSByZWdpc3RlcnMgdG8gYmUgdHJhbnNmZXJyZWQuICBUaGUgZmlyc3QKKyAqIHZhbHVlIGlzIHdyaXR0ZW4gdG8gdGhlIGxvd2VzdCBudW1iZXJlZCByZWdpc3Rlci4gIE5PVEU6IGRhdGEgbXVzdCBub3QKKyAqIGNhdXNlIHRoZSBidWZmZXIgc2l6ZSB0byBleGNlZWQgdGhlIG1heGltdW0gYWxsb3dlZCBidWZmZXIgc2l6ZS4KKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlLgorICovCisKKworCisjZGVmaW5lIEFEUF9DUHJlYWQgICAgICAgICAgICAgIEFEUFJFQVNPTihDSV9IQURQLDcpCisvKiBBRFBfQ1ByZWFkCisgKiAtLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBUaGlzIG1lc3NhZ2UgcmVxdWVzdHMgYSBjby1wcm9jZXNzb3JzIGludGVybmFsIHN0YXRlLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKGJ5dGUgQ1BudW0sIHdvcmQgbWFzaykKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzLCB3b3JkcyBkYXRhKQorICoKKyAqICdDUG51bScgaXMgdGhlIG51bWJlciBvZiB0aGUgY28tcHJvY2Vzc29yIHRvIHRyYW5zZmVyIHZhbHVlcyBmcm9tLgorICogJ21hc2snIHNwZWNpZmllcyB3aGljaCByZWdpc3RlcnMgdG8gdHJhbnNmZXIgYW5kIGlzIGNvLXByb2Nlc3NvcgorICogc3BlY2lmaWMuCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqICdkYXRhJyBob2xkcyB0aGUgcmVnaXN0ZXJzIHNwZWNpZmllZCBpbiAnbWFzaycgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlCisgKiBqdXN0IHJ1YmJpc2guICBUaGUgbG93ZXN0IG51bWJlcmVkIHJlZ2lzdGVyIGlzIHRyYW5zZmVycmVkIGZpcnN0LgorICogTk9URTogZGF0YSBtdXN0IG5vdCBjYXVzZSB0aGUgYnVmZmVyIHNpemUgdG8gZXhjZWVkIHRoZSBtYXhpbXVtIGFsbG93ZWQKKyAqIGJ1ZmZlciBzaXplLgorICovCisKKworCisjZGVmaW5lIEFEUF9DUHdyaXRlICAgICAgICAgICAgIEFEUFJFQVNPTihDSV9IQURQLDgpCisvKiBBRFBfQ1B3cml0ZQorICogLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFRoaXMgbWVzc2FnZSByZXF1ZXN0cyBhIHdyaXRlIHRvIGEgY28tcHJvY2Vzc29ycyBpbnRlcm5hbCBzdGF0ZS4KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgIChieXRlIENQbnVtLCB3b3JkIG1hc2ssIHdvcmRzIGRhdGEpCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cykKKyAqCisgKiAnQ1BudW0nIGlzIHRoZSBudW1iZXIgb2YgdGhlIGNvLXByb2Nlc3NvciB0byB0cmFuc2ZlciB2YWx1ZXMgdG8uCisgKiAnbWFzaycgc3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVycyB0byB0cmFuc2ZlciBhbmQgaXMgY28tcHJvY2Vzc29yCisgKiBzcGVjaWZpYy4KKyAqICdkYXRhJyBob2xkcyB0aGUgdmFsdWVzIHRvIHRyYW5zZmVyIHRvIHRoZSByZWdpc3RlcnMgc3BlY2lmaWVkIGluICdtYXNrJy4KKyAqIFRoZSBmaXJzdCB2YWx1ZSBpcyB3cml0dGVuIHRvIHRoZSBsb3dlc3QgbnVtYmVyZWQgcmVnaXN0ZXIuCisgKiBOT1RFOiBkYXRhIG11c3Qgbm90IGNhdXNlIHRoZSBidWZmZXIgc2l6ZSB0byBleGNlZWQgdGhlIG1heGltdW0gYWxsb3dlZAorICogYnVmZmVyIHNpemUuCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqLworCisKKworI2RlZmluZSBBRFBfU2V0QnJlYWsgICAgICAgICAgICBBRFBSRUFTT04oQ0lfSEFEUCw5KQorLyogQURQX1NldEJyZWFrCisgKiAtLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFNldHMgYSBicmVha3BvaW50LgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKHdvcmQgYWRkcmVzcywgYnl0ZSB0eXBlIFssIHdvcmQgYm91bmRdKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMsIHdvcmQgcG9pbnRoYW5kbGUsIHdvcmQgcmFkZHJlc3MsIHdvcmQgcmJvdW5kKQorICoKKyAqICdhZGRyZXNzJyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gdG8gc2V0IHRoZSBicmVha3BvaW50IG9uLgorICogJ3R5cGUnIHNwZWNpZmllcyB0aGUgc29ydCBvZiBicmVha3BvaW50IGFuZCBpcyBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwKKyAqIGJlbG93LgorICogJ2JvdW5kJyBpcyBpbmNsdWRlZCBpZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgNCBiaXRzIG9mIHR5cGUgYXJlIHNldCB0bworICogNSBvciBhYm92ZSAoc2VlIGJlbG93IGZvciBtb3JlIGRldGFpbCkuCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqICdwb2ludGhhbmRsZScgIHJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGJyZWFrcG9pbnQsIGl0IHdpbGwgYmUgdmFsaWQgaWYgYml0CisgKiA3IG9mICd0eXBlJyBpcyBzZXQuICBTZWUgYmVsb3cgZm9yIG1vcmUgZGV0YWlsLgorICogJ3JhZGRyZXNzJyBpcyB2YWxpZCBkZXBlbmRpbmcgb24gJ3R5cGUnLCBzZWUgYmVsb3cgZm9yIG1vcmUgZGV0YWlsLgorICogJ3Jib3VuZCcgaXMgdmFsaWQgZGVwZW5kaW5nIG9uICd0eXBlJywgc2VlIGJlbG93IGZvciBtb3JlIGRldGFpbC4KKyAqLworCisvKiAndHlwZSc6LSAqLworLyogVGhlIGxlYXN0IHNpZ25pZmljYW50IDQgYml0cyBkZWZpbmUgdGhlIHNvcnQgb2YgYnJlYWtwb2ludCB0byBzZXQ6LSAqLworLyogSGFsdCBpZiB0aGUgcGMgaXMgZXF1YWwgdG8gJ2FkZHJlc3MnLiAqLworI2RlZmluZSBBRFBfU2V0QnJlYWtfRXF1YWxzQWRkcmVzcyAgICAgICAgICgwKQorCisvKiBIYWx0IGlmIHRoZSBwYyBpcyBncmVhdGVyIHRoYW4gJ2FkZHJlc3MnLiAqLworI2RlZmluZSBBRFBfU2V0QnJlYWtfR3JlYXRlckFkZHJlc3MgICAgICAgICgxKQorCisvKiBIYWx0IGlmIHRoZSBwYyBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJ2FkZHJlc3MnLiAqLworI2RlZmluZSBBRFBfU2V0QnJlYWtfR0VxdWFsc0FkZHJlc3MgICAgICAgICgyKQorCisvKiBIYWx0IGlmIHRoZSBwYyBpcyBsZXNzIHRoYW4gJ2FkZHJlc3MnLiAqLworI2RlZmluZSBBRFBfU2V0QnJlYWtfTGVzc0FkZHJlc3MgICAgICAgICAgICgzKQorCisvKiBIYWx0IGlmIHRoZSBwYyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJ2FkZHJlc3MnLiAqLworI2RlZmluZSBBRFBfU2V0QnJlYWtfTEVxdWFsc0FkZHJlc3MgICAgICAgICg0KQorCisvKiBIYWx0IGlmIHRoZSBwYyBpcyBpbiB0aGUgcmFuZ2UgZnJvbSAnYWRkcmVzcycgdG8gJ2JvdW5kJyBpbmNsdXNpdmUuICovCisjZGVmaW5lIEFEUF9TZXRCcmVha19SYW5nZSAgICAgICAgICAgICAgICAgKDUpCisKKy8qIEhhbHQgaWYgdGhlIHBjIGlzIG5vdCBpbiB0aGUgcmFuZ2UgZnJvbSAnYWRkcmVzcycgdG8gJ2JvdW5kJyBpbmNsdXNpdmUuICovCisjZGVmaW5lIEFEUF9TZXRCcmVha19Ob3RSYW5nZSAgICAgICAgICAgICAgKDYpCisKKy8qIEhhbHQgaWYgKHBjICYgJ2JvdW5kJykgPSAnYWRkcmVzcycuICovCisjZGVmaW5lIEFEUF9TZXRCcmVha19BbmRCb3VuZCAgICAgICAgICAgICAgKDcpCisKKy8qIEJpdHMgNSw2IGFuZCA3IGFyZSB1c2VkIGFzIGZvbGxvd3MgOi0gKi8KKy8qIElmIHNldCB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSBicmVha3BvaW50IGlzIG9uIGEgMTZiaXQgKFRodW1iKQorICAgaW5zdHJ1Y3Rpb24gcmF0aGVyIHRoYW4gYSAzMmJpdCAoQVJNKSBpbnN0cnVjdGlvbi4gKi8KKyNkZWZpbmUgQURQX1NldEJyZWFrX1RodW1iICAgICAgICAgICAgICAgICAoMSA8PCA0KQorCisvKiBUaGlzIHJlcXVlc3RzIHRoYXQgdGhlIGJyZWFrcG9pbnQgc2hvdWxkIGJlIGNvbmRpdGlvbmFsIChleGVjdXRpb24gaGFsdHMKKyAgIG9ubHkgaWYgdGhlIGJyZWFrcG9pbnRlZCBpbnN0cnVjdGlvbiBpcyBleGVjdXRlZCwgbm90IGlmIGl0IGlzCisgICBjb25kaXRpb25hbGx5IHNraXBwZWQpLiAgSWYgYml0IDUgaXMgbm90IHNldCwgZXhlY3V0aW9uIGhhbHRzIHdoZW5ldmVyCisgICB0aGUgYnJlYWtwb2ludGVkIGluc3RydWN0aW9uIGlzIHJlYWNoZWQgKHdoZXRoZXIgZXhlY3V0ZWQgb3Igc2tpcHBlZCkuICovCisjZGVmaW5lIEFEUF9TZXRCcmVha19Db25kICAgICAgICAgICAgICAgICAgKDEgPDwgNSkKKworLyogVGhpcyByZXF1ZXN0cyBhIGRyeSBydW46IHRoZSBicmVha3BvaW50IGlzIG5vdCBzZXQgYW5kIHRoZSAncmFkZHJlc3MnLCBhbmQKKyAgIGlmIGFwcHJvcHJpYXRlIHRoZSAncmJvdW5kJywgdGhhdCB3b3VsZCBiZSB1c2VkLCBhcmUgcmV0dXJuZWQgKGZvcgorICAgY29tcGFyaXNvbiBhbmQgcmFuZ2UgYnJlYWtwb2ludHMgdGhlIGFkZHJlc3MgYW5kIGJvdW5kIHVzZWQgbmVlZCBub3QgYmUKKyAgIGV4YWN0bHkgYXMgcmVxdWVzdGVkKS4gIEEgUkRJRXJyb3JfTm9FcnJvciAnc3RhdHVzJyBieXRlIGluZGljYXRlcyB0aGF0CisgICByZXNvdXJjZXMgYXJlIGN1cnJlbnRseSBhdmFpbGFibGUgdG8gc2V0IHRoZSBicmVha3BvaW50LCBub24temVybworICAgaW5kaWNhdGVzIGFuIGVycm9yLiBSRElFcnJvcl9Ob01vcmVQb2ludHMgaW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVpcmVkCisgICBicmVha3BvaW50IHJlc291cmNlcyBhcmUgbm90IGN1cnJlbnRseSBhdmFpbGFibGUuICovCisjZGVmaW5lIEFEUF9TZXRCcmVha19EcnlSdW4gICAgICAgICAgICAgICAgKDEgPDwgNikKKworLyogSWYgdGhlIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCwgYnV0IHRoZXJlIGFyZSBubyBtb3JlIGJyZWFrcG9pbnQgcmVnaXN0ZXJzCisgICAob2YgdGhlIHJlcXVlc3RlZCB0eXBlKSwgdGhlbiB0aGUgdmFsdWUgUkRJRXJyb3JfTm9Nb3JlUG9pbnRzIGlzCisgICByZXR1cm5lZC4gKi8KKworLyogSWYgYSBicmVha3BvaW50IGlzIHNldCBvbiBhIGxvY2F0aW9uIHdoaWNoIGFscmVhZHkgaGFzIGEgYnJlYWtwb2ludCwgdGhlCisgICBmaXJzdCBicmVha3BvaW50IHdpbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIG5ldyBicmVha3BvaW50IGlzIHNldC4gKi8KKworCisKKyNkZWZpbmUgQURQX0NsZWFyQnJlYWsgICAgICAgICAgQURQUkVBU09OKENJX0hBRFAsMTApCisvKiBBRFBfQ2xlYXJCcmVhaworICogLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IENsZWFycyBhIGJyZWFrcG9pbnQuCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAod29yZCBwb2ludGhhbmRsZSkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzKQorICoKKyAqICdwb2ludGhhbmRsZScgaXMgYSBoYW5kbGUgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBBRFBfU2V0QnJlYWsuCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqLworCisKKyNkZWZpbmUgQURQX1NldFdhdGNoICAgICAgICAgICAgQURQUkVBU09OKENJX0hBRFAsMTEpCisvKiBBRFBfU2V0V2F0Y2gKKyAqIC0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogU2V0cyBhIHdhdGNocG9pbnQuCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAod29yZCBhZGRyZXNzLCBieXRlIHR5cGUsIGJ5dGUgZGF0YXR5cGUgWyx3b3JkIGJvdW5kXSkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzLCB3b3JkIHBvaW50aGFuZGxlLCB3b3JkIHJhZGRyZXNzLCB3b3JkIHJib3VuZCkKKyAqCisgKiAnYWRkcmVzcycgaXMgdGhlIGFkZHJlc3MgYXQgd2hpY2ggdG8gc2V0IHRoZSB3YXRjaHBvaW50LgorICogJ3R5cGUnIGlzIHRoZSB0eXBlIG9mIHdhdGNocG9pbnQgdG8gc2V0IGFuZCBpcyBkZXNjcmliZWQgaW4gZGV0YWlsIGJlbG93LgorICogJ2RhdGF0eXBlJyBkZWZpbmVzIHRoZSBzb3J0IG9mIGRhdGEgYWNjZXNzIHRvIHdhdGNoIGZvciBhbmQgaXMgZGVzY3JpYmVkCisgKiBpbiBtb3JlIGRldGFpbCBiZWxvdy4KKyAqICdib3VuZCcgaXMgaW5jbHVkZWQgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0eXBlIChzZWUgZGVzY3JpcHRpb24gb2YKKyAqIHR5cGUgYmVsb3cpLgorICogJ3N0YXR1cycgaXMgUkRJRXJyb3JfTm9FcnJvciB0byBpbmRpY2F0ZSBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuCisgKiAncG9pbnRoYW5kbGUnIGlzIHZhbGlkIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdHlwZSAoc2VlIGRlc2NyaXB0aW9uCisgKiBvZiB0eXBlIGJlbG93KS4KKyAqICdyYWRkcmVzcycgaXMgdmFsaWQgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0eXBlIChzZWUgZGVzY3JpcHRpb24KKyAqIG9mIHR5cGUgYmVsb3cpLgorICogJ3Jib3VuZCcgaXMgdmFsaWQgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0eXBlIChzZWUgZGVzY3JpcHRpb24KKyAqIG9mIHR5cGUgYmVsb3cpLgorICovCisKKy8qICd0eXBlJzotICovCisvKiBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgNCBiaXRzIG9mICd0eXBlJyBkZWZpbmUgdGhlIHNvcnQgb2Ygd2F0Y2hwb2ludCB0bworICAgc2V0Oi0gKi8KKy8qIEhhbHQgb24gYSBkYXRhIGFjY2VzcyB0byB0aGUgYWRkcmVzcyBlcXVhbCB0byAnYWRkcmVzcycuICovCisjZGVmaW5lIEFEUF9TZXRXYXRjaF9FcXVhbHNBZGRyZXNzICAgICAgICAgICgwKQorCisvKiBIYWx0IG9uIGEgZGF0YSBhY2Nlc3MgdG8gYW4gYWRkcmVzcyBncmVhdGVyIHRoYW4gJ2FkZHJlc3MnLiAqLworI2RlZmluZSBBRFBfU2V0V2F0Y2hfR3JlYXRlckFkZHJlc3MgICAgICAgICAoMSkKKworLyogSGFsdCBvbiBhIGRhdGEgYWNjZXNzIHRvIGFuIGFkZHJlc3MgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICdhZGRyZXNzJy4gKi8KKyNkZWZpbmUgQURQX1NldFdhdGNoX0dFcXVhbHNBZGRyZXNzICAgICAgICAgKDIpCisKKy8qIEhhbHQgb24gYSBkYXRhIGFjY2VzcyB0byBhbiBhZGRyZXNzIGxlc3MgdGhhbiAnYWRkcmVzcycuICovCisjZGVmaW5lIEFEUF9TZXRXYXRjaF9MZXNzQWRkcmVzcyAgICAgICAgICAgICgzKQorCisvKiBIYWx0IG9uIGEgZGF0YSBhY2Nlc3MgdG8gYW4gYWRkcmVzcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJ2FkZHJlc3MnLiAqLworI2RlZmluZSBBRFBfU2V0V2F0Y2hfTEVxdWFsc0FkZHJlc3MgICAgICAgICAoNCkKKworLyogSGFsdCBvbiBhIGRhdGEgYWNjZXNzIHRvIGFuIGFkZHJlc3MgaW4gdGhlIHJhbmdlIGZyb20gJ2FkZHJlc3MnIHRvCisgICAnYm91bmQnIGluY2x1c2l2ZS4gKi8KKyNkZWZpbmUgQURQX1NldFdhdGNoX1JhbmdlICAgICAgICAgICAgICAgICAgKDUpCisKKy8qIEhhbHQgb24gYSBkYXRhIGFjY2VzcyB0byBhbiBhZGRyZXNzIG5vdCBpbiB0aGUgcmFuZ2UgZnJvbSAnYWRkcmVzcycgdG8KKyAgICdib3VuZCcgaW5jbHVzaXZlLiAqLworI2RlZmluZSBBRFBfU2V0V2F0Y2hfTm90UmFuZ2UgICAgICAgICAgICAgICAoNikKKworLyogSGFsdCBpZiAoZGF0YS1hY2Nlc3MtYWRkcmVzcyAmICdib3VuZCcpPSdhZGRyZXNzJy4gKi8KKyNkZWZpbmUgQURQX1NldFdhdGNoX0FuZEJvdW5kICAgICAgICAgICAgICAgKDcpCisKKy8qIEJpdHMgNiBhbmQgNyBvZiAndHlwZScgYWxzbyBoYXZlIGZ1cnRoZXIgc2lnbmlmaWNhbmNlOi0KKyAgIE5PVEU6IHRoZXkgbXVzdCBub3QgYmUgc2ltdWxhdGFuZW91c2x5IHNldC4gKi8KKworLyogQml0IDYgb2YgJ3R5cGUnIHNldDogIFJlcXVlc3RzIGEgZHJ5IHJ1bjogdGhlIHdhdGNocG9pbnQgaXMgbm90IHNldCBhbmQKKyAgIHRoZSAnYWRkcmVzcycgYW5kLCBpZiBhcHByb3ByaWF0ZSwgdGhlICdib3VuZCcsIHRoYXQgd291bGQgYmUgdXNlZCBhcmUKKyAgIHJldHVybmVkIChmb3IgcmFuZ2UgYW5kIGNvbXBhcmlzb24gd2F0Y2hwb2ludHMsIHRoZSAnYWRkcmVzcycgYW5kICdib3VuZCcKKyAgIHVzZWQgbmVlZCBub3QgYmUgZXhhY3RseSBhcyByZXF1ZXN0ZWQpLiAgQSBSRElFcnJvcl9Ob0Vycm9yIHN0YXR1cyBieXRlCisgICBpbmRpY2F0ZXMgdGhhdCByZXNvdXJjZXMgYXJlIGN1cnJlbnRseSBhdmFpbGFibGUgdG8gc2V0IHRoZSB3YXRjaHBvaW50OworICAgUkRJRXJyb3JfTm9Nb3JlUG9pbnRzIGluZGljYXRlcyB0aGF0IHRoZSByZXF1aXJlZCB3YXRjaHBvaW50IHJlc291cmNlcworICAgYXJlIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLiAqLworCisvKiBCaXQgNyBvZiAndHlwZScgc2V0OiAgUmVxdWVzdHMgdGhhdCBhIGhhbmRsZSBzaG91bGQgYmUgcmV0dXJuZWQgZm9yIHRoZQorICAgd2F0Y2hwb2ludCBieSB3aGljaCBpdCB3aWxsIGJlIGlkZW50aWZpZWQgc3Vic2VxdWVudGx5LiAgSWYgYml0IDcgaXMKKyAgIHNldCwgYSBoYW5kbGUgd2lsbCBiZSByZXR1cm5lZCAoJ3BvaW50aGFuZGxlJyksIHdoZXRoZXIgb3Igbm90IHRoZQorICAgcmVxdWVzdCBzdWNjZWVkcyBvciBmYWlscyAoYnV0LCBvYnZpb3VzbHksIGl0IHdpbGwgb25seSBiZSBtZWFuaW5nZnVsCisgICBpZiB0aGUgcmVxdWVzdCBzdWNjZWVzZCkuICovCisKKy8qICdkYXRhdHlwZSc6LSAqLworLyogVGhlICdkYXRhdHlwZScgYXJndW1lbnQgZGVmaW5lcyB0aGUgc29ydCBvZiBkYXRhIGFjY2VzcyB0byB3YXRjaCBmb3IsCisgICB2YWx1ZXMgY2FuIGJlIHN1bW1lZCBvciBPUmVkIHRvZ2V0aGVyIHRvIGhhbHQgb24gYW55IHNldCBvZiBzb3J0cyBvZgorICAgbWVtb3J5IGFjY2Vzcy4gKi8KKworLyogV2F0Y2ggZm9yIGJ5dGUgcmVhZHMuICovCisjZGVmaW5lIEFEUF9TZXRXYXRjaF9CeXRlUmVhZHMgICAgICAgICAgICgxKQorCisvKiBXYXRjaCBmb3IgaGFsZi13b3JkIHJlYWRzLiAqLworI2RlZmluZSBBRFBfU2V0V2F0Y2hfSGFsZldvcmRSZWFkcyAgICAgICAoMikKKworLyogV2F0Y2ggZm9yIHdvcmQgcmVhZHMuICovCisjZGVmaW5lIEFEUF9TZXRXYXRjaF9Xb3JkUmVhZHMgICAgICAgICAgICg0KQorCisvKiBXYXRjaCBmb3IgaGFsZi13b3JkIHJlYWRzLiAqLworI2RlZmluZSBBRFBfU2V0V2F0Y2hfQnl0ZVdyaXRlcyAgICAgICAgICAoOCkKKworLyogV2F0Y2ggZm9yIGhhbGYtd29yZCByZWFkcy4gKi8KKyNkZWZpbmUgQURQX1NldFdhdGNoX0hhbGZXb3JkV3JpdGVzICAgICAgKDE2KQorCisvKiBXYXRjaCBmb3IgaGFsZi13b3JkIHJlYWRzLiAqLworI2RlZmluZSBBRFBfU2V0V2F0Y2hfV29yZFdyaXRlcyAgICAgICAgICAoMzIpCisKKy8qIE9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBhIFJESUVycm9yX05vRXJyb3IgJ3N0YXR1cycgYnl0ZSBpcyByZXR1cm5lZC4gIE9uCisgICB1bnN1Y2Nlc3NmdWwgY29tcGxldGlvbiwgYSBub24temVybyBlcnJvciBjb2RlIGJ5dGUgaXMgcmV0dXJuZWQuICBJZiB0aGUKKyAgIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCwgYnV0IHRoZXJlIGFyZSBub3cgbm8gbW9yZSB3YXRjaHBvaW50IHJlZ2lzdGVycworICAgKG9mIHRoZSByZXF1ZXN0ZWQgdHlwZSksIHRoZW4gdGhlIHZhbHVlIFJESUVycm9yX05vTW9yZVBvaW50cyBpcworICAgcmV0dXJuZWQuICovCisKKy8qIElmIGEgd2F0Y2hwb2ludCBpcyBzZXQgb24gYSBsb2NhdGlvbiB3aGljaCBhbHJlYWR5IGhhcyBhIHdhdGNocG9pbnQsIHRoZQorICAgZmlyc3Qgd2F0Y2hwb2ludCB3aWxsIGJlIHJlbW92ZWQgYmVmb3JlIHRoZSBuZXcgd2F0Y2hwb2ludCBpcyBzZXQuICovCisKKworI2RlZmluZSBBRFBfQ2xlYXJXYXRjaCAgICAgICAgICBBRFBSRUFTT04oQ0lfSEFEUCwxMikKKy8qIEFEUF9DbGVhcldhdGNoCisgKiAtLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogQ2xlYXJzIGEgd2F0Y2hwb2ludC4KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgICh3b3JkIHBvaW50aGFuZGxlKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMpCisgKgorICogJ3BvaW50aGFuZGxlJyBpcyBhIGhhbmRsZSB0byBhIHdhdGNocG9pbnQgcmV0dXJuZWQgYnkgYSBwcmV2aW91cworICogQURQX1NldFdhdGNoLgorICogJ3N0YXR1cycgaXMgUkRJRXJyb3JfTm9FcnJvciB0byBpbmRpY2F0ZSBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuCisgKi8KKworCisKKyNkZWZpbmUgQURQX0V4ZWN1dGUgICAgICAgICAgICAgQURQUkVBU09OKENJX0hBRFAsMTMpCisvKiBBRFBfRXhlY3V0ZQorICogLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFRoaXMgbWVzc2FnZSByZXF1ZXN0cyB0aGF0IHRoZSB0YXJnZXQgc3RhcnRzIGV4ZWN1dGluZyBmcm9tCisgKiB0aGUgc3RvcmVkIENQVSBzdGF0ZS4KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgICgpCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cykKKyAqCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqIFRoZSBtZXNzYWdlIHdpbGwgKkFMV0FZUyogcmVzcG9uZCBpbW1lZGlhdGVseSB3aXRoIGFuIEFDSyAodW5saWtlIHRoZQorICogb2xkIFJESSBkZWZpbml0aW9uLCB3aGljaCBhbGxvd2VkIGFzeW5jaHJvbm91cyBtZXNzYWdlIHJlcGxpZXMpLgorICoKKyAqIEV4ZWN1dGlvbiB3aWxsIHN0b3Agd2hlbiBhbGxvd2VkIHN5c3RlbSBldmVudHMgb2NjdXIuIFRoZSBob3N0IHdpbGwKKyAqIGJlIG5vdGlmaWVkIHZpYSBhIEFEUF9TdG9wcGVkIG1lc3NhZ2UgKGRlc2NyaWJlZCBiZWxvdykuCisgKi8KKworCisKKyNkZWZpbmUgQURQX1N0ZXAgICAgICAgICAgICAgICAgQURQUkVBU09OKENJX0hBRFAsMTQpCisvKiBBRFBfU3RlcAorICogLS0tLS0tLS0KKyAqIFN1bW1hcnk6IEV4ZWN1dGUgJ25pbnN0cicgaW5zdHJ1Y3Rpb25zLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICh3b3JkIG5pbnN0cikKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzKQorICoKKyAqICduaW5zdHInIGlzIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRvIGV4ZWN1dGUsIHN0YXJ0aW5nIGF0IHRoZQorICogYWRkcmVzcyBjdXJyZW50bHkgbG9hZGVkIGludG8gdGhlIENQVSBwcm9ncmFtIGNvdW50ZXIuICBJZiBpdCBpcyB6ZXJvLAorICogdGhlIHRhcmdldCBzaG91bGQgZXhlY3V0ZSBpbnN0cnVjdGlvbnMgdXB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiB0aGF0CisgKiBleHBsaWNpdGx5IGFsdGVycyB0aGUgUHJvZ3JhbSBDb3VudGVyLiBpLmUuIGEgYnJhbmNoIG9yIEFMVSBvcGVyYXRpb24KKyAqIHdpdGggdGhlIFBDIGFzIHRoZSBkZXN0aW5hdGlvbi4KKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlLgorICoKKyAqIFRoZSBBRFBfU3RlcCBmdW5jdGlvbiAodW5saWtlIHRoZSBlYXJsaWVyIFJESSBzeXN0ZW0pIHdpbGwgKkFMV0FZUyoKKyAqIHJldHVybiBhbiBBQ0sgaW1tZWRpYXRlbHkuIEEgc3Vic2VxdWVudCBBRFBfU3RvcHBlZCBtZXNzYWdlIHdpbGwgYmUKKyAqIGRlbGl2ZXJlZCBmcm9tIHRoZSB0YXJnZXQgdG8gdGhlIGhvc3Qgd2hlbiB0aGUgQURQX1N0ZXAgb3BlcmF0aW9uCisgKiBoYXMgY29tcGxldGVkLgorICovCisKKworCisjZGVmaW5lIEFEUF9JbnRlcnJ1cHRSZXF1ZXN0ICAgIEFEUFJFQVNPTihDSV9IQURQLDE1KQorLyogQURQX0ludGVycnVwdFJlcXVlc3QKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBJbnRlcnJ1cHQgZXhlY3V0aW9uLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzKQorICoKKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlLgorICogT24gcmVjZWl2aW5nIHRoaXMgbWVzc2FnZSB0aGUgdGFyZ2V0IHNob3VsZCBhdHRlbXB0IHRvIHN0b3AgZXhlY3V0aW9uLgorICovCisKKworCisjZGVmaW5lIEFEUF9IV19FbXVsYXRpb24gICAgICAgICAgICAgQURQUkVBU09OKENJX0hBRFAsMTYpCisvKiBBRFBfSFdfRW11bGF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tCisgKiBUaGUgZmlyc3QgcGFyYW1ldGVyIHRvIEFEUF9IV19FbXVsYXRpb24gaXMgYSBSZWFzb24gU3ViY29kZSwgYW5kCisgKiBzdWJzZXF1ZW50IHBhcmFtZXRlcnMgYXJlIGRlZmluZWQgYnkgdGhhdCBzdWJjb2RlCisgKgorICogd29yZCAgICAgICAgIHJlYXNvbiBzdWJjb2RlCisgKiBvdGhlciBhcmd1bWVudHMgYXMgcmVhc29uIHN1YmNvZGUgZGV0ZXJtaW5lcworICoKKyAqLworCisvKiBBRFBfX0hXX0VtdWxhdGlvbiBzdWItcmVhc29uIGNvZGVzOiAqLworCisjZGVmaW5lIEFEUF9IV19FbXVsX1N1cHBvcnRlZCAgICAgICAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDApCisvKiBBRFBfSFdfRW11bF9TdXBwb3J0ZWQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogRW5xdWlyZXMgd2hldGhlciBjYWxscyB0byB0aGUgbmV4dCA0IG1lc3NhZ2VzIGFyZSBhdmFpbGFibGUKKyAqIChNZW1vcnlBY2Nlc3MsIE1lbW9yeU1hcCwgU2V0X0NQVXNwZWVkLCBSZWFkQ2xvY2spLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzKQorICoKKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgdGhlIG1lc3NhZ2VzIGFyZSBhdmFpbGFibGUsCisgKiBub24temVybyBvdGhlcndpc2UuCisgKgorICogTk9URTogRXF1aXZhbGVudCB0byBSRElfSW5mb19NZW1vcnlfU3RhdHMuCisgKi8KKworCisjZGVmaW5lIEFEUF9IV19FbXVsX01lbW9yeUFjY2VzcyAgICAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDEpCisvKiBBRFBfSFdfRW11bF9NZW1vcnlBY2Nlc3MKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogR2V0IG1lbW9yeSBhY2Nlc3MgaW5mb3JtYXRpb24gZm9yIG1lbW9yeSBibG9jayB3aXRoIHNwZWNpZmllZAorICogaGFuZGxlLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKHdvcmQgaGFuZGxlKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMsIHdvcmQgbnJlYWRzLCB3b3JkIG53cml0ZXMsIHdvcmQgc3JlYWRzLAorICogICAgICAgICAgd29yZCBzd3JpdGVzLCB3b3JkIG5zLCB3b3JkIHMpCisgKgorICogJ2hhbmRsZScgaXMgYSBoYW5kbGUgdG8gYSBtZW1vcnkgYmxvY2suCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqICducmVhZHMnIGlzIHRoZSBudW1iZXIgb2Ygbm9uLXNlcXVlbnRpYWwgcmVhZHMuCisgKiAnbndyaXRlcycgaXMgdGhlIG51bWJlciBvZiBub24tc2VxdWVudGlhbCB3cml0ZXMuCisgKiAnc3JlYWRzJyBpcyB0aGUgbnVtYmVyIG9mIHNlcXVlbnRpYWwgcmVhZHMuCisgKiAnc3dyaXRlcycgaXMgdGhlIG51bWJlciBvZiBzZXF1ZW50aWFsIHdyaXRlcy4KKyAqICducycgaXMgdGltZSBpbiBuYW5vIHNlY29uZHMuCisgKiAncycgaXMgdGltZSBpbiBzZWNvbmRzLgorICoKKyAqIE5PVEU6IEVxdWl2YWxlbnQgdG8gUkRJTWVtb3J5X0FjY2Vzcy4KKyAqLworCisKKyNkZWZpbmUgQURQX0hXX0VtdWxfTWVtb3J5TWFwICAgICAgICAgQURQU1VCUkVBU09OKENJX0hBRFAsMikKKy8qIEFEUF9IV19FbXVsX01lbW9yeU1hcAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBTZXRzIG1lbW9yeSBjaGFyYWN0ZXJpc3RpY3MuCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAod29yZCBuLAorICAgIFRoZW4gJ24nIHNldHMgb2YgYXJndW1lbnRzIG9mIHRoZSBmb3JtOi0KKyAgICAgICAgICAgIHdvcmQgaGFuZGxlLCB3b3JkIHN0YXJ0LCB3b3JkIGxpbWl0LCBieXRlIHdpZHRoLAorICAgICAgICAgICAgYnl0ZSBhY2Nlc3MsIHdvcmQgTnJlYWRfbnMsIHdvcmQgTndyaXRlX25zLCB3b3JkIFNyZWFkX25zLAorICAgICAgICAgICAgd29yZCBTd3JpdGVfbnMpCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cykKKyAqCisgKiAnbicgaXMgdGhlIG51bWJlciBvZiBzZXRzIG9mIGFyZ3VtZW50cy4KKyAqICdoYW5kbGUnIGlzIGEgaGFuZGxlIHRvIHRoZSByZWdpb24uCisgKiAnc3RhcnQnIGlzIHRoZSBzdGFydCBvZiB0aGlzIHJlZ2lvbi4KKyAqICdsaW1pdCcgaXMgdGhlIGxpbWl0IG9mIHRoaXMgcmVnaW9uLgorICogJ3dpZHRoJyBpcyB0aGUgbWVtb3J5IHdpZHRoLCBkZXNjcmliZWQgaW4gZGV0YWlsIGJlbG93LgorICogJ2FjY2VzcycgaXMgZGVzY3JpYmVkIGluIGRldGFpbCBiZWxvdy4KKyAqICdOcmVhZF9ucycgaXMgdGhlIGFjY2VzcyB0aW1lIGZvciBOIHJlYWQgY3ljbGVzIGluIG5hbm8gc2Vjb25kcy4KKyAqICdOd3JpdGVfbnMnIGlzIHRoZSBhY2Nlc3MgdGltZSBmb3IgTiB3cml0ZSBjeWNsZXMgaW4gbmFubyBzZWNvbmRzLgorICogJ1NyZWFkX25zJyBpcyB0aGUgYWNjZXNzIHRpbWUgZm9yIFMgcmVhZCBjeWNsZXMgaW4gbmFubyBzZWNvbmRzLgorICogJ1N3cml0ZV9ucycgaXMgdGhlIGFjY2VzcyB0aW1lIGZvciBTIHdyaXRlIGN5Y2xlcyBpbiBuYW5vIHNlY29uZHMuCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqIE5PVEU6IEVxdWl2YWxlbnQgdG8gUkRJTWVtb3J5X01hcC4KKyAqLworCisvKiAnd2lkdGgnOi0gKi8KKy8qIDggYml0IG1lbW9yeSB3aWR0aC4gKi8KKyNkZWZpbmUgQURQX0hXX0VtdWxfTWVtb3J5TWFwX1dpZHRoOCAgICAgKDApCisKKy8qIDE2IGJpdCBtZW1vcnkgd2lkdGguICovCisjZGVmaW5lIEFEUF9IV19FbXVsX01lbW9yeU1hcF9XaWR0aDE2ICAgICgxKQorCisvKiAzMiBiaXQgbWVtb3J5IHdpZHRoLiAqLworI2RlZmluZSBBRFBfSFdfRW11bF9NZW1vcnlNYXBfV2lkdGgzMiAgICAoMikKKworLyogJ2FjY2Vzcyc6LSAqLworLyogQml0IDAgLSByZWFkIGFjY2Vzcy4gKi8KKyNkZWZpbmUgQURQX0hXX0VtdWxfTWVtb3J5TWFwX0FjY2Vzc19SZWFkICAgICAgKDEgPDwgMCkKKworLyogQml0IDEgLSB3cml0ZSBhY2Nlc3MuICovCisjZGVmaW5lIEFEUF9IV19FbXVsX01lbW9yeU1hcF9BY2Nlc3NfV3JpdGUgICAgICgxIDw8IDEpCisKKy8qIEJpdCAyIC0gbGF0Y2hlZCAzMiBiaXQgbWVtb3J5LiAqLworI2RlZmluZSBBRFBfSFdfRW11bF9NZW1vcnlNYXBfQWNjZXNzX0xhdGNoZWQgICAoMSA8PCAyKQorCisKKyNkZWZpbmUgQURQX0hXX0VtdWxfU2V0Q1BVU3BlZWQgICAgICAgQURQU1VCUkVBU09OKENJX0hBRFAsMykKKy8qIEFEUF9IV19FbXVsX1NldENQVVNwZWVkCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogU2V0cyB0aGUgc3BlZWQgb2YgdGhlIENQVS4KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgICh3b3JkIHNwZWVkKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMpCisgKgorICogJ3NwZWVkJyBpcyB0aGUgQ1BVIHNwZWVkIGluIG5hbm8gc2Vjb25kcy4KKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlLgorICoKKyAqIE5PVEU6IEVxdWl2YWxlbnQgdG8gUkRJU2V0X0NQVVNwZWVkLgorICovCisKKworI2RlZmluZSBBRFBfSFdfRW11bF9SZWFkQ2xvY2sgICAgICAgICBBRFBTVUJSRUFTT04oQ0lfSEFEUCw0KQorLyogQURQX0hXX0VtdWxfUmVhZENsb2NrCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFJlYWRzIHNpbXVsYXRlZCB0aW1lLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzLCB3b3JkIG5zLCB3b3JkIHMpCisgKgorICogJ3N0YXR1cycgaXMgUkRJRXJyb3JfTm9FcnJvciB0byBpbmRpY2F0ZSBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuCisgKiAnbnMnIGlzIHRpbWUgaW4gbmFubyBzZWNvbmRzLgorICogJ3MnIGlzIHRpbWUgaW4gc2Vjb25kcy4KKyAqCisgKiBOT1RFOiBFcXVpdmFsZW50IHRvIFJESVJlYWRfQ2xvY2suCisgKi8KKworCisjZGVmaW5lIEFEUF9JQ0VicmVha2VySEFEUCAgICAgICAgICAgIEFEUFJFQVNPTihDSV9IQURQLDE3KQorCisvKiBUaGUgZmlyc3QgcGFyYW1ldGVyIHRvIEFEUF9JQ0VicmVha2VyIGlzIGEgUmVhc29uIFN1YmNvZGUsIGFuZAorICogc3Vic2VxdWVudCBwYXJhbWV0ZXJzIGFyZSBkZWZpbmVkIGJ5IHRoYXQgc3ViY29kZQorICoKKyAqIHdvcmQgICAgICAgICByZWFzb24gc3ViY29kZQorICogb3RoZXIgYXJndW1lbnRzIGFzIHJlYXNvbiBzdWJjb2RlIGRldGVybWluZXMKKyAqCisgKi8KKworLyogQURQX0lDRWJyZWFrZXIgc3ViLXJlYXNvbiBjb2RlczogKi8KKworI2RlZmluZSBBRFBfSUNFQl9FeGlzdHMgICAgICAgICAgICAgICBBRFBTVUJSRUFTT04oQ0lfSEFEUCwwKQorLyogQURQX0lDRUJfRXhpc3RzCisgKiAtLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IElzIHRoZXJlIGFuIElDRWJyZWFrZXIgaW4gdGhlIHN5c3RlbT8KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgICgpCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cykKKyAqCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHRoZXJlIGlzIGFuIElDRWJyZWFrZXIsCisgKiBub24temVybyBvdGhlcndpc2UuCisgKi8KKworCisjZGVmaW5lIEFEUF9JQ0VCX0dldExvY2tzICAgICAgICAgICAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDEpCisvKiBBRFBfSUNFQl9HZXRMb2NrcworICogLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFJldHVybnMgd2hpY2ggSUNFYnJlYWtlciByZWdpc3RlcnMgYXJlIGxvY2tlZC4KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgICgpCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cywgd29yZCBsb2NrZWRzdGF0ZSkKKyAqCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqICdsb2NrZWRzdGF0ZScgaXMgYSBiaXRtYXAgaWYgdGhlIElDRWJyZWFrZXIgcmVnaXN0ZXJzIGxvY2tlZCBhZ2FpbnN0IHVzZQorICogYnkgSWNlTWFuIChiZWNhdXNlIGV4cGxpY2l0bHkgd3JpdHRlbiBieSB0aGUgdXNlcikuIEJpdCBuIHJlcHJlc2VudHMKKyAqIGhhcmR3YXJlIGJyZWFrcG9pbnQgbiwgYW5kIGlmIHNldCB0aGUgcmVnaXN0ZXIgaXMgbG9ja2VkLgorICoKKyAqIE5PVEU6IEVxdWl2YWxlbnQgdG8gUkRJSWNlYnJlYWtlcl9HZXRMb2Nrcy4gIFNob3VsZCBvbmx5IGJlIHVzZWQgaWYKKyAqIEFEUF9JQ0VCX0V4aXN0cyBkaWRuJ3QgcmV0dXJuIGFuIGVycm9yLgorICovCisKKworI2RlZmluZSBBRFBfSUNFQl9TZXRMb2NrcyAgICAgICAgICAgICBBRFBTVUJSRUFTT04oQ0lfSEFEUCwyKQorLyogQURQX0lDRUJfU2V0TG9ja3MKKyAqIC0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBTZXRzIHdoaWNoIElDRWJyZWFrZXIgcmVnaXN0ZXJzIGFyZSBsb2NrZWQuCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAod29yZCBsb2NrZWRzdGF0ZSkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzKQorICoKKyAqICdsb2NrZWRzdGF0ZScgaXMgdGhlIHNhbWUgYXMgaW4gQURQX0lDRUJfR2V0TG9ja3MgYWJvdmUuCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqCisgKiBOT1RFOiBFcXVpdmFsZW50IHRvIFJESUljZWJyZWFrZXJfU2V0TG9ja3MuICBTaG91bGQgb25seSBiZSB1c2VkIGlmCisgKiBBRFBfSUNFQl9FeGlzdHMgZGlkbid0IHJldHVybiBhbiBlcnJvci4KKyAqLworCisKKyNkZWZpbmUgQURQX0lDRUJfQ0NfRXhpc3RzICAgICAgICAgICAgQURQU1VCUkVBU09OKENJX0hBRFAsMykKKy8qIEFEUF9JQ0VCX0NDX0V4aXN0cworICogLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBJcyB0aGVyZSBhbiBJQ0VicmVha2VyIENvbW1zIENoYW5uZWw/CisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAoKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMpCisgKgorICogJ3N0YXR1cycgaXMgUkRJRXJyb3JfTm9FcnJvciB0byBpbmRpY2F0ZSB0aGVyZSBpcyBhIENvbW1zIENoYW5uZWwsCisgKiBub24temVybyBvdGhlcndpc2UuCisgKgorICogTk9URTogU2hvdWxkIG9ubHkgYmUgdXNlZCBpZiBBRFBfSUNFQl9FeGlzdHMgZGlkbid0IHJldHVybiBhbiBlcnJvci4KKyAqLworCisKKyNkZWZpbmUgQURQX0lDRUJfQ0NfQ29ubmVjdF9Ub0hvc3QgICAgQURQU1VCUkVBU09OKENJX0hBRFAsNCkKKy8qIEFEUF9JQ0VCX0NDX0Nvbm5lY3RfVG9Ib3N0CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogQ29ubmVjdCBDb21tcyBDaGFubmVsIGluIFRvSG9zdCBkaXJlY3Rpb24uCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAoYnl0ZSBjb25uZWN0KQorICogUmV0dXJuOiAod29yZCBzdGF0dXMpCisgKgorICogJ2Nvbm5lY3QnICEhISEhCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqCisgKiBOT1RFOiBFcXVpdmFsZW50IHRvIFJESUNvbW1zQ2hhbm5lbF9Ub0hvc3QuICBTaG91bGQgb25seSBiZSB1c2VkIGlmCisgKiBBRFBfSUNFQl9DQ19FeGlzdHMgZGlkbid0IHJldHVybiBhbiBlcnJvci4KKyAqLworCisKKyNkZWZpbmUgQURQX0lDRUJfQ0NfQ29ubmVjdF9Gcm9tSG9zdCAgQURQU1VCUkVBU09OKENJX0hBRFAsNSkKKy8qIEFEUF9JQ0VCX0NDX0Nvbm5lY3RfRnJvbUhvc3QKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IENvbm5lY3QgQ29tbXMgQ2hhbm5lbCBpbiBGcm9tSG9zdCBkaXJlY3Rpb24uCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAoYnl0ZSBjb25uZWN0KQorICogUmV0dXJuOiAod29yZCBzdGF0dXMpCisgKgorICogJ2Nvbm5lY3QnIGlzIHRoZSBzYW1lIGFzIGluIEFEUF9JQ0VCX0NDX0Nvbm5lY3RfVG9Ib3N0IGFib3ZlLgorICogJ3N0YXR1cycgaXMgUkRJRXJyb3JfTm9FcnJvciB0byBpbmRpY2F0ZSBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuCisgKgorICogTk9URTogRXF1aXZhbGVudCB0byBSRElDb21tc0NoYW5uZWxfRnJvbUhvc3QuICBTaG91bGQgb25seSBiZSB1c2VkIGlmCisgKiBBRFBfSUNFQl9DQ19FeGlzdHMgZGlkbid0IHJldHVybiBhbiBlcnJvci4KKyAqLworCisKKyNkZWZpbmUgQURQX0lDRW1hbiAgICAgICAgICAgICAgICAgICAgQURQUkVBU09OKENJX0hBRFAsMTgpCisKKy8qIFRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gQURQX0lDRW1hbiBpcyBhIFJlYXNvbiBTdWJjb2RlLCBhbmQKKyAqIHN1YnNlcXVlbnQgcGFyYW1ldGVycyBhcmUgZGVmaW5lZCBieSB0aGF0IHN1YmNvZGUKKyAqCisgKiB3b3JkICAgICAgICAgcmVhc29uIHN1YmNvZGUKKyAqIG90aGVyIGFyZ3VtZW50cyBhcyByZWFzb24gc3ViY29kZSBkZXRlcm1pbmVzCisgKgorICovCisKKy8qIEFEUF9JQ0VtYW4gc3ViLXJlYXNvbiBjb2RlczogKi8KKworCisjZGVmaW5lIEFEUF9JQ0VNX0FkZENvbmZpZyAgICAgICAgICAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDApCisvKiBBRFBfSUNFTV9BZGRDb25maWcKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogUHJlcGFyZXMgdGFyZ2V0IHRvIHJlY2VpdmUgY29uZmlndXJhdGlvbiBkYXRhIGJsb2NrLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKHdvcmQgbmJ5dGVzKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMpCisgKgorICogJ25ieXRlcycgaXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgY29uZmlndXJhdGlvbiBibG9jay4KKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgc3VjY2Vzcywgbm9uLXplcm8gaWYgYQorICogY29uZmlndXJhdGlvbiBibG9jayBvZiB0aGlzIHNpemUgY2FuJ3QgYmUgYWNjZXB0ZWQuCisgKgorICogTk9URTogRXF1aXZhbGVudCB0byBSRFBfQWRkQ29uZmlnLgorICovCisKKworI2RlZmluZSBBRFBfSUNFTV9TZWxlY3RDb25maWcgICAgICAgICBBRFBTVUJSRUFTT04oQ0lfSEFEUCwxKQorLyogQURQX0lDRU1fU2VsZWN0Q29uZmlnCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFNlbGVjdHMgb25lIG9mIHRoZSBzZXRzIG9mIGNvbmZpZ3VyYXRpb24gZGF0YSBibG9ja3MgYW5kCisgKiByZWluaXRpYWxpc2VzIHRvIHVzZSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24uCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAoYnl0ZSBhc3BlY3QsIGJ5dGUgbmFtZWxlbiwgYnl0ZSBtYXRjaHR5cGUsIHdvcmQgdnNuX3JlcSwKKyAgICAgICAgICAgIGJ5dGVzIG5hbWUpCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cywgd29yZCB2c25fc2VsKQorICoKKyAqICdhc3BlY3QnIGlzIG9uZSBvZiB0d28gdmFsdWVzIGRlZmluZWQgYmVsb3cuCisgKiAnbmFtZWxlbicgaXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiAnbmFtZScuCisgKiAnbWF0Y2h0eXBlJyBzcGVjaWZpZXMgaG93IHRoZSBzZWxlY3RlZCB2ZXJzaW9uIG11c3QgbWF0Y2ggdGhhdCBzcGVjaWZpZWQsCisgKiBhbmQgdGFrZXMgb25lIG9mIHRoZSB2YWx1ZXMgZGVmaW5lZCBiZWxvdy4KKyAqICd2c25fcmVxJyBpcyB0aGUgcmVxdWVzdGVkIHZlcnNpb24gb2YgdGhlIG5hbWVkIGNvbmZpZ3VyYXRpb24uCisgKiAnbmFtZScgaXMgdGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24uCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqICd2c25fc2VsJyBpcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0ZWQgb24gc3VjY2Vzcy4KKyAqCisgKiBOT1RFOiBFcXVpdmFsZW50IHRvIFJEUF9TZWxlY3RDb25maWcuCisgKi8KKworLyogJ2FzcGVjdCc6LSAqLworI2RlZmluZSBBRFBfSUNFTV9TZWxlY3RDb25maWdfQ29uZmlnQ1BVICAgICAgICgwKQorI2RlZmluZSBBRFBfSUNFTV9TZWxlY3RDb25maWdfQ29uZmlnU3lzdGVtICAgICgxKQorCisvKiAnbWF0Y2h0eXBlJzotICovCisjZGVmaW5lIEFEUF9JQ0VNX1NlbGVjdENvbmZpZ19NYXRjaEFueSAgICAgICAgKDApCisjZGVmaW5lIEFEUF9JQ0VNX1NlbGVjdENvbmZpZ19NYXRjaEV4YWN0bHkgICAgKDEpCisjZGVmaW5lIEFEUF9JQ0VNX1NlbGVjdENvbmZpZ19NYXRjaE5vRWFybGllciAgKDIpCisKKworI2RlZmluZSBBRFBfSUNFTV9Db25maWdDb3VudCAgICAgICAgICBBRFBTVUJSRUFTT04oQ0lfSEFEUCwyKQorLyogQURQX0lDRU1fQ29uZmlnQ291bnQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBSZXR1cm4gbnVtYmVyIG9mIGNvbmZpZ3VyYXRpb25zLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzIFssIHdvcmQgY291bnRdKQorICoKKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlLgorICogJ2NvdW50JyByZXR1cm5zIHRoZSBudW1iZXIgb2YgY29uZmlndXJhdGlvbnMgaWYgc3RhdHVzIGlzIHplcm8uCisgKgorICogTk9URTogRXF1aXZhbGVudCB0byBSRElDb25maWdfQ291bnQuCisgKi8KKworCisjZGVmaW5lIEFEUF9JQ0VNX0NvbmZpZ050aCAgICAgICAgICAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDMpCisvKiBBRFBfSUNFTV9Db25maWdOdGgKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogR2V0cyB0aGUgbnRoIGNvbmZpZ3VyYXRpb24gZGV0YWlscy4KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgICh3b3JkIGNvbmZpZ24pCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cywgd29yZCB2ZXJzaW9uLCBieXRlIG5hbWVsZW4sIGJ5dGVzIG5hbWUpCisgKgorICogJ2NvbmZpZ24nIGlzIHRoZSBudW1iZXIgb2YgdGhlIGNvbmZpZ3VyYXRpb24uCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqICd2ZXJzaW9uJyBpcyB0aGUgY29uZmlndXJhdGlvbiB2ZXJzaW9uIG51bWJlci4KKyAqICduYW1lbGVuJyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluICduYW1lJy4KKyAqICduYW1lJyBpcyB0aGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbi4KKyAqCisgKiBOT1RFOiBFcXVpdmFsZW50IHRvIFJESUNvbmZpZ19OdGguCisgKi8KKworCisKKyNkZWZpbmUgQURQX1Byb2ZpbGUgICAgICAgICAgICAgICAgICAgQURQUkVBU09OKENJX0hBRFAsMTkpCisKKy8qIFRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gQURQX1Byb2ZpbGUgaXMgYSBSZWFzb24gU3ViY29kZSwgYW5kCisgKiBzdWJzZXF1ZW50IHBhcmFtZXRlcnMgYXJlIGRlZmluZWQgYnkgdGhhdCBzdWJjb2RlCisgKgorICogd29yZCAgICAgICAgIHJlYXNvbiBzdWJjb2RlCisgKiBvdGhlciBhcmd1bWVudHMgYXMgcmVhc29uIHN1YmNvZGUgZGV0ZXJtaW5lcworICoKKyAqLworCisvKiBBRFBfUHJvZmlsZSBzdWItcmVhc29uIGNvZGVzOiAqLworCisKKyNkZWZpbmUgQURQX1Byb2ZpbGVfU3VwcG9ydGVkICAgICAgICAgQURQU1VCUkVBU09OKENJX0hBRFAsMCkKKy8qIEFEUF9Qcm9maWxlX1N1cHBvcnRlZAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBDaGVja3Mgd2hldGhlciBwcm9maWxpbmcgaXMgc3VwcG9ydGVkLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzKQorICoKKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgaWYgcHJvZmlsaW5nIGlzIHN1cHBvcnRlZCwgbm9uLXplcm8gb3RoZXJ3aXNlLgorICoKKyAqIE5PVEU6IENhbiBhbHNvIGJlIGRldGVybWluZWQgdXNpbmcgSW5mb19UYXJnZXQuCisgKi8KKworCisjZGVmaW5lIEFEUF9Qcm9maWxlX1N0b3AgICAgICAgICAgICAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDEpCisvKiBBRFBfUHJvZmlsZV9TdG9wCisgKiAtLS0tLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBTdG9wcyBwcm9maWxpbmcuCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogICAoKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMpCisgKgorICogJ3N0YXR1cycgaXMgUkRJRXJyb3JfTm9FcnJvciB0byBpbmRpY2F0ZSBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuCisgKgorICogTk9URTogRXF1aXZhbGVudCB0byBSRElQcm9maWxlX1N0b3AuCisgKi8KKworCisjZGVmaW5lIEFEUF9Qcm9maWxlX1N0YXJ0ICAgICAgICAgICAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDIpCisvKiBBRFBfUHJvZmlsZV9TdGFydAorICogLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IFN0YXJ0cyBwcm9maWxpbmcgKFBDIHNhbXBsaW5nKS4KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgICh3b3JkIGludGVydmFsKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMpCisgKgorICogJ2ludGVydmFsJyBpcyB0aGUgcGVyaW9kIG9mIFBDIHNhbXBsaW5nIGluIG1pY3JvIHNlY29uZHMuCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqCisgKiBOT1RFOiBFcXVpdmFsZW50IHRvIFJESVByb2ZpbGVfU3RhcnQuCisgKi8KKworCisjZGVmaW5lIEFEUF9Qcm9maWxlX1dyaXRlTWFwICAgICAgICAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDMpCisjZGVmaW5lIEFEUF9Qcm9maWxlV3JpdGVIZWFkZXJTaXplICAgIChBRFBfREVGQVVMVF9IRUFERVJfU0laRSArIDQqc2l6ZW9mKHdvcmQpKQorCisvKiBBRFBfUHJvZmlsZV9Xcml0ZU1hcAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN1bW1hcnk6IERvd25sb2FkcyBhIG1hcCBhcnJheSwgd2hpY2ggZGVzY3JpYmVzIHRoZSBQQyByYW5nZXMgZm9yIHByb2ZpbGluZy4KKyAqCisgKiBBcmd1bWVudHM6IEEgbnVtYmVyIG9mIG1lc3NhZ2VzIGVhY2ggb2YgZm9ybTotCisgKiBTZW5kOiAgICh3b3JkIGxlbiwgd29yZCBzaXplLCB3b3JkIG9mZnNldCwgd29yZHMgbWFwX2RhdGEpCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cykKKyAqCisgKiAnbGVuJyBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBlbnRpcmUgbWFwIGFycmF5IGJlaW5nIGRvd25sb2FkZWQuCisgKiAnc2l6ZScgaXMgdGhlIG51bWJlciBvZiB3b3JkcyBiZWluZyBkb3dubG9hZGVkIGluIHRoaXMgbWVzc2FnZSwgaS5lLiB0aGUKKyAqIGxlbmd0aCBvZiAnbWFwX2RhdGEnLgorICogJ29mZnNldCcgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBlbnRpcmUgbWFwIGFycmF5IHdoaWNoIHRoaXMgbWVzc2FnZSBzdGFydHMKKyAqIGZyb20sIGluIHdvcmRzLgorICogJ21hcF9kYXRhJyBjb25zaXN0cyBvZiAnc2l6ZScgd29yZHMgb2YgbWFwIGRhdGEuCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqCisgKiBOT1RFOiBFcXVpdmFsZW50IHRvIFJESVByb2ZpbGVfV3JpdGVNYXAuCisgKi8KKworCisjZGVmaW5lIEFEUF9Qcm9maWxlX1JlYWRNYXAgICAgICAgICAgIEFEUFNVQlJFQVNPTihDSV9IQURQLDQpCisjZGVmaW5lIEFEUF9Qcm9maWxlUmVhZEhlYWRlclNpemUgICAgIChBRFBfREVGQVVMVF9IRUFERVJfU0laRSArIDIqc2l6ZW9mKHdvcmQpKQorCisvKiBBRFBfUHJvZmlsZV9SZWFkTWFwCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBVcGxvYWRzIGEgc2V0IG9mIHByb2ZpbGUgY291bnRzIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlIGN1cnJlbnQKKyAqIHByb2ZpbGUgbWFwLgorICoKKyAqIEFyZ3VtZW50czogQSBudW1iZXIgb2YgbWVzc2FnZXMsIGVhY2ggb2YgdGhlIGZvcm06CisgKiBTZW5kOiAgICh3b3JkIG9mZnNldCwgd29yZCBzaXplKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMsIHdvcmRzIGNvdW50cykKKyAqCisgKiAnb2Zmc2V0JyBpcyB0aGUgb2Zmc2V0IGluIHRoZSBlbnRpcmUgYXJyYXkgb2YgY291bnRzIHRoYXQgdGhpcyBtZXNzYWdlCisgKiBzdGFydHMgZnJvbSwgaW4gd29yZHMuCisgKiAnc2l6ZScgaXMgdGhlIG51bWJlciBvZiB3b3JkcyB1cGxvYWRlZCBpbiB0aGlzIG1lc3NhZ2UgKGluIGNvdW50cykuCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqICdjb3VudHMnIGlzICdzaXplJyB3b3JkcyBvZiBwcm9maWxlIGNvdW50cy4KKyAqCisgKiBOT1RFOiBFcXVpdmFsZW50IHRvIFJESVByb2ZpbGVfUmVhZE1hcC4KKyAqLworCisKKyNkZWZpbmUgQURQX1Byb2ZpbGVfQ2xlYXJDb3VudHMgICAgICAgQURQU1VCUkVBU09OKENJX0hBRFAsNSkKKy8qIEFEUF9Qcm9maWxlX0NsZWFyQ291bnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogUmVxdWVzdHMgdGhhdCBQQyBzYW1wbGUgY291bnRzIGJlIHNldCB0byB6ZXJvLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzKQorICoKKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlLgorICoKKyAqIE5PVEU6IEVxdWl2YWxlbnQgdG8gUkRJUHJvZmlsZV9DbGVhckNvdW50cy4KKyAqLworCisjZGVmaW5lIEFEUF9Jbml0aWFsaXNlQXBwbGljYXRpb24gICAgICAgQURQUkVBU09OKENJX0hBRFAsMjApCisvKiBBRFBfSW5pdGlhbGlzZUFwcGxpY2F0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBSZXF1ZXN0cyB0aGF0IE9TIHNldHVwIHVwIHRoZSB0aHJlYWQvdGFzayBzbyB0aGF0IGl0IGNhbiBiZQorICogICAgICAgICAgZXhlY3V0ZWQuCisgKgorICogQXJndW1lbnRzOgorICogU2VuZDogKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzKQorICoKKyAqICdzdGF0dXMnIGlzIFJESUVycm9yX05vRXJyb3IgdG8gaW5kaWNhdGUgc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlLgorICovCisKKyNkZWZpbmUgQURQX0VuZCAgICAgICAgICAgICAgICAgICAgICAgICBBRFBSRUFTT04oQ0lfSEFEUCwyMSkKKy8qIEFEUF9FbmQKKyAqIC0tLS0tLS0KKyAqIFN1bW1hcnk6IFNlbnQgYnkgdGhlIGhvc3QgZGVidWdnZXIgdG8gdGVsbCBhbmdlbCB0aGlzIGRlYnVnZ2luZyBzZXNzaW9uCisgKiAgICAgICAgICBpcyBpcyBmaW5pc2hlZAorICogQXJndW1lbnRzOgorICogU2VuZDogKCkKKyAqIFJldHVybjogKHdvcmQgc3RhdHVzKQorICogc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ0lfVEFEUCBtZXNzYWdlcworICoKKyAqLworCisjZGVmaW5lIEFEUF9UQURQVW5yZWNvZ25pc2VkICAgICAgICBBRFBSRUFTT04oQ0lfVEFEUCwwKQorLyogVGhpcyBtZXNzYWdlIGlzIHVudXN1YWwgaW4gdGhhdCBpdCBpcyBub3JtYWxseSBzZW50IGluIHJlcGx5IHRvCisgKiBhbm90aGVyIG1lc3NhZ2Ugd2hpY2ggaXMgbm90IHVuZGVyc3Rvb2QuICBUaGlzIGlzIGFuIGV4Y2VwdGlvbgorICogdG8gdGhlIG5vcm1hbCBwcm90b2NvbCB3aGljaCBzYXlzIHRoYXQgYSByZXBseSBtdXN0IGhhdmUgdGhlCisgKiBzYW1lIGJhc2UgcmVhc29uIGNvZGUgYXMgdGhlIG9yaWdpbmFsLiAgVGhlcmUgaXMgYSBzaW5nbGUgcmVwbHkKKyAqIHBhcmFtZXRlciB3aGljaCBpcyB0aGUgcmVhc29uIGNvZGUgd2hpY2ggd2FzIG5vdCB1bmRlcnN0b29kLgorICoKKyAqIEFzIHdlbGwgYXMgYmVpbmcgYSByZXBseSB0aGlzIG1lc3NhZ2UgY2FuIGFsc28gYmUgc2VudCBhbmQgd2lsbAorICogcmV0dXJuIGFzIGlmIHRoaXMgbWVzc2FnZSB3ZXJlIHVucmVjb2duaXNlZCEKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgICBub25lCisgKgorICogUmVwbHk6CisgKiAgICAgIHdvcmQgICAgcmVhc29uIGNvZGUgd2hpY2ggd2FzIG5vdCByZWNvZ25pc2VkCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBBRFBfU3RvcHBlZCAgICAgICAgICAgICBBRFBSRUFTT04oQ0lfVEFEUCwxKQorLyogQURQX1N0b3BwZWQKKyAqIC0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBUaGlzIG1lc3NhZ2UgaXMgc2VudCB0byB0aGUgaG9zdCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBzdG9wcywKKyAqIGVpdGhlciBuYXR1cmFsbHkgb3IgZHVlIHRvIGFuIGV4Y2VwdGlvbi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgICB3b3JkICAgIHJlYXNvbiBzdWJjb2RlCisgKiAgICAgIG90aGVyIGFyZ3VtZW50cyBhcyByZWFzb24gc3ViY29kZSBkZXRlcm1pbmVzLgorICogICAgICBVbmxlc3Mgc3RhdGVkIG90aGVyd2lzZSAoYmVsb3cpIHRoZXJlIHdpbGwgYmUgbm9uZS4KKyAqCisgKiBSZXBseToKKyAqICAgICAgd29yZCBzdGF0dXMgICAgIHVubGVzcyByZWFzb24gc3ViY29kZSBzYXlzIG90aGVyd2lzZQorICoKKyAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IHRvIHRoZSBob3N0IHdoZW4gZXhlY3V0aW9uIGhhcyBzdG9wcGVkLiBUaGlzCisgKiBjYW4gYmUgd2hlbiB0aGUgZW5kIG9mIHRoZSBhcHBsaWNhdGlvbiBoYXMgYmVlbiByZWFjaGVkLCBvciBhcyB0aGUKKyAqIHJlc3VsdCBvZiBhbiBleGNlcHRpb24uIEl0IGNhbiBhbHNvIGJlIHRoZSByZXR1cm4gZnJvbSBhbiBBRFBfU3RlcAorICogcHJvY2Vzcywgd2hlbiB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgaGF2ZSBiZWVuCisgKiBleGVjdXRlZC4sIG9yIGEgYnJlYWtwb2ludCBvciB3YXRjaHBvaW50IGhhcyBiZWVuIGhpdCBldGMuCisgKi8KKworLyogVGhlIGZpcnN0IHNldCBvZiBTdG9wcGVkIHN1YnJlYXNvbiBjb2RlcyBhcmUgZm9yIHRoZSBBUk0gaGFyZHdhcmUKKyAqIHZlY3RvcnMuIFRoZXNlIGV2ZW50cyB3aWxsIGJlIHJhaXNlZCBpZiB0aGUKKyAqIEFEUF9Db250cm9sX1ZlY3Rvcl9DYXRjaCBhbGxvd3MsIG9yIGlmIHRoZSB0YXJnZXQgYXBwbGljYXRpb24gaGFzCisgKiBub3QgcHJvdmlkZWQgaXRzIG93biBoYW5kbGVycy4KKyAqLworI2RlZmluZSBBRFBfU3RvcHBlZF9CcmFuY2hUaHJvdWdoWmVybyAgICBBRFBTVUJSRUFTT04oQ0lfVEFEUCwwKQorI2RlZmluZSBBRFBfU3RvcHBlZF9VbmRlZmluZWRJbnN0ciAgICAgICBBRFBTVUJSRUFTT04oQ0lfVEFEUCwxKQorI2RlZmluZSBBRFBfU3RvcHBlZF9Tb2Z0d2FyZUludGVycnVwdCAgICBBRFBTVUJSRUFTT04oQ0lfVEFEUCwyKQorI2RlZmluZSBBRFBfU3RvcHBlZF9QcmVmZXRjaEFib3J0ICAgICAgICBBRFBTVUJSRUFTT04oQ0lfVEFEUCwzKQorI2RlZmluZSBBRFBfU3RvcHBlZF9EYXRhQWJvcnQgICAgICAgICAgICBBRFBTVUJSRUFTT04oQ0lfVEFEUCw0KQorI2RlZmluZSBBRFBfU3RvcHBlZF9BZGRyZXNzRXhjZXB0aW9uICAgICBBRFBTVUJSRUFTT04oQ0lfVEFEUCw1KQorI2RlZmluZSBBRFBfU3RvcHBlZF9JUlEgICAgICAgICAgICAgICAgICBBRFBTVUJSRUFTT04oQ0lfVEFEUCw2KQorI2RlZmluZSBBRFBfU3RvcHBlZF9GSVEgICAgICAgICAgICAgICAgICBBRFBTVUJSRUFTT04oQ0lfVEFEUCw3KQorCisvKiBXZSBsZWF2ZSB0aGUgcmVzdCBvZiB3aGF0IHdvdWxkIGJlIHRoZSBiaXRzIGluIHRoZSBWZWN0b3JDYXRjaAorICogYml0bWFzayBmcmVlIGZvciBmdXR1cmUgZXhwYW5zaW9uLgorICovCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHNvZnR3YXJlIHJlYXNvbnMgZm9yIGV4ZWN1dGlvbiBzdG9wcGluZzogKi8KKyNkZWZpbmUgQURQX1N0b3BwZWRfQnJlYWtQb2ludCAgICAgICAgIEFEUFNVQlJFQVNPTihDSV9UQURQLDMyKQorLyogQnJlYWtwb2ludCB3YXMgcmVhY2hlZAorICogICBleHRyYSBzZW5kIHBhcmFtZXRlcjogd29yZCBoYW5kbGUgLSBpbmRpY2F0ZXMgd2hpY2ggYnJlYWtwb2ludAorICovCisKKyNkZWZpbmUgQURQX1N0b3BwZWRfV2F0Y2hQb2ludCAgICAgICAgIEFEUFNVQlJFQVNPTihDSV9UQURQLDMzKQorLyogV2F0Y2hwb2ludCB3YXMgdHJpZ2dlcmVkCisgKiAgIGV4dHJhIHNlbmQgcGFyYW1ldGVyOiB3b3JkIGhhbmRsZSAtIGluZGljYXRlcyB3aGljaCB3YXRjaHBvaW50CisgKi8KKworI2RlZmluZSBBRFBfU3RvcHBlZF9TdGVwQ29tcGxldGUgICAgICAgQURQU1VCUkVBU09OKENJX1RBRFAsMzQpCisvKiBFbmQgb2YgQURQX1N0ZXAgcmVxdWVzdCAqLworCisjZGVmaW5lIEFEUF9TdG9wcGVkX1J1blRpbWVFcnJvclVua25vd24gQURQU1VCUkVBU09OKENJX1RBRFAsMzUpCisvKgorICogbm9uLXNwZWNpZmljIGZhdGFsIHJ1bnRpbWUgc3VwcG9ydCBlcnJvcgorICovCisKKyNkZWZpbmUgQURQX1N0b3BwZWRfSW50ZXJuYWxFcnJvciAgICAgIEFEUFNVQlJFQVNPTihDSV9UQURQLDM2KQorLyogICBleHRyYSBzZW5kIHBhcmFtZXRlcjogd29yZCBlcnJvciAtIGluZGljYXRlcyB0aGUgbmF0dXJlIG9mIHRoZSBlcnJvcgorICoKKyAqIEFuIEFuZ2VsIGludGVybmFsIGVycm9yIGhhcyBoYXBwZW5lZC4gIFRoZSBlcnJvciBudW1iZXIgc2hvdWxkIGJlCisgKiBkaXNwbGF5ZWQgZm9yIHRoZSB1c2VyIHRvIHJlcG9ydCB0byBoaXMgc29mdHdhcmUgc3VwcGxpZXIuICBPbmNlCisgKiB0aGlzIGVycm9yIGhhcyBiZWVuIHJlY2VpdmVkIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBBbmdlbCBjYW4gbm8gbG9uZ2VyCisgKiBiZSB0cnVzdGVkLgorICovCisKKyNkZWZpbmUgQURQX1N0b3BwZWRfVXNlckludGVycnVwdGlvbiAgIEFEUFNVQlJFQVNPTihDSV9UQURQLDM3KQorLyogSG9zdCByZXF1ZXN0ZWQgaW50ZXJydXB0aW9uICovCisKKyNkZWZpbmUgQURQX1N0b3BwZWRfQXBwbGljYXRpb25FeGl0ICAgIEFEUFNVQlJFQVNPTihDSV9UQURQLDM4KQorLyogICBleHRyYSBzZW5kIHBhcmFtZXRlcjogd29yZCBleGl0Y29kZQorICogVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gaGFzIGV4aXRlZCB2aWEgZXhpdCgpLCBhbiBleGl0Y29kZQorICogb2YgemVybyBpbmRpYWN0ZXMgc3VjY2Vzc2Z1bCB0ZXJtaW5hdGlvbi4KKyAqLworCisjZGVmaW5lIEFEUF9TdG9wcGVkX1N0YWNrT3ZlcmZsb3cgICAgICBBRFBTVUJSRUFTT04oQ0lfVEFEUCwgMzkpCisvKgorICogU29mdHdhcmUgc3RhY2sgb3ZlcmZsb3cgaGFzIG9jY3VycmVkCisgKi8KKworI2RlZmluZSBBRFBfU3RvcHBlZF9EaXZpc2lvbkJ5WmVybyAgICAgQURQU1VCUkVBU09OKENJX1RBRFAsIDQwKQorLyoKKyAqIERpdmlzaW9uIGJ5IHplcm8gaGFzIG9jY3VycmVkCisgKi8KKworI2RlZmluZSBBRFBfU3RvcHBlZF9PU1NwZWNpZmljICAgICAgICAgQURQU1VCUkVBU09OKENJX1RBRFAsIDQxKQorLyoKKyAqIFRoZSBPUyBoYXMgcmVxdWVzdGVkIHRoYXQgZXhlY3V0aW9uIHN0b3BzLiAgVGhlIE9TIHdpbGwga25vdworICogd2h5IHRoaXMgaGFzIGhhcHBlbmVkLgorICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ0lfVFREQ0MgbWVzc2FnZXMgKFRhcmdldC1pbml0aWF0ZWQgZGVidWcgY29tbXMgY2hhbm5lbCkKKyAqCisgKi8KKworI2RlZmluZSBBRFBfVERDQ19Ub0hvc3QgICAgICAgICAgICAgQURQUkVBU09OKENJX1RURENDLDApCisvKiBBRFBfVERDQ19Ub0hvc3QKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLQorICogU3VtbWFyeTogU2VuZCBEYXRhIGRvd24gQ29tbXMgQ2hhbm5lbCBpbiBUb0hvc3QgZGlyZWN0aW9uLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIFNlbmQ6ICAgKHdvcmQgbmJ5dGVzLCB3b3JkcyBkYXRhKQorICogUmV0dXJuOiAod29yZCBzdGF0dXMpCisgKgorICogJ25ieXRlcycgaXMgbnVtYmVyIG9mIEJZVEVTIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gdGhlIHRhcmdldCB0byB0aGUKKyAqICBob3N0IHZpYSB0aGUgRGVidWcgQ29tbXMgY2hhbm5lbC4KKyAqICdkYXRhJyBpcyAobmJ5dGVzL3NpemVvZih3b3JkKSkgV09SRFMgb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tCisgKiAgdGhlIHRhcmdldCB0byB0aGUgaG9zdCB2aWEgdGhlIERlYnVnIENvbW1zIGNoYW5uZWwuCisgKiAnc3RhdHVzJyBpcyBSRElFcnJvcl9Ob0Vycm9yIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqCisgKiBOT1RFOiBFcXVpdmFsZW50IHRvIFJEUF9DQ1RvSG9zdCBhbmQgUkRQX0NDVG9Ib3N0UmVwbHkgKGp1c3Qgc2V0IHRoZQorICogZGlyZWN0aW9uIGJpdCkuCisgKiBOT1RFIElJOiBDdXJyZW50IGltcGxlbWVudGF0aW9ucyBvbmx5IHN1cHBvcnQgc2luZ2xlIHdvcmQgdHJhbnNmZXJzCisgKiAgICAgICAgICAobmJ5dGVzID0gNCkuCisgKi8KKworCisjZGVmaW5lIEFEUF9URENDX0Zyb21Ib3N0ICAgICAgICAgIEFEUFJFQVNPTihDSV9UVERDQywxKQorLyogQURQX1REQ0NfRnJvbUhvc3QKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdW1tYXJ5OiBTZW5kIERhdGEgZG93biBDb21tcyBDaGFubmVsIGluIEZyb21Ib3N0IGRpcmVjdGlvbi4KKyAqCisgKiBBcmd1bWVudHM6CisgKiBTZW5kOiAgICgpCisgKiBSZXR1cm46ICh3b3JkIHN0YXR1cywgd29yZCBuYnl0ZXMsIHdvcmRzIGRhdGEpCisgKgorICogJ3N0YXR1cycgaXMgUkRJRXJyb3JfTm9FcnJvciB0byBpbmRpY2F0ZSBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuCisgKiAnbmJ5dGVzJyBpcyBudW1iZXIgb2YgQllURVMgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSB0aGUgaG9zdCB0byB0aGUKKyAqICB0YXJnZXQgdmlhIHRoZSBEZWJ1ZyBDb21tcyBjaGFubmVsLCBvciB6ZXJvIGlmIHRoZSBob3N0IGhhcyBubyBkYXRhCisgKiAgdG8gdHJhbnNmZXIuCisgKiAnZGF0YScgaXMgKG5ieXRlcy9zaXplb2Yod29yZCkpIFdPUkRTIG9mIHRyYW5zZmVycmVkIGRhdGEuCisgKgorICogTk9URTogRXF1aXZhbGVudCB0byBSRFBfQ0NGcm9tSG9zdCBhbmQgUkRQX0NDRnJvbUhvc3RSZXBseSAoanVzdCBzZXQgdGhlCisgKiBkaXJlY3Rpb24gYml0KS4KKyAqIE5PVEUgSUk6IEN1cnJlbnQgaW1wbGVtZW50YXRpb25zIG9ubHkgc3VwcG9ydCBzaW5nbGUgd29yZCB0cmFuc2ZlcnMKKyAqICAgICAgICAgIChuYnl0ZXMgPSA0KS4KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRXJyb3IgQ29kZXMKKyAqCisgKi8KKworI2RlZmluZSBSRElFcnJvcl9Ob0Vycm9yICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBSRElFcnJvcl9SZXNldCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkRJRXJyb3JfVW5kZWZpbmVkSW5zdHJ1Y3Rpb24gICAyCisjZGVmaW5lIFJESUVycm9yX1NvZnR3YXJlSW50ZXJydXB0ICAgICAgMworI2RlZmluZSBSRElFcnJvcl9QcmVmZXRjaEFib3J0ICAgICAgICAgIDQKKyNkZWZpbmUgUkRJRXJyb3JfRGF0YUFib3J0ICAgICAgICAgICAgICA1CisjZGVmaW5lIFJESUVycm9yX0FkZHJlc3NFeGNlcHRpb24gICAgICAgNgorI2RlZmluZSBSRElFcnJvcl9JUlEgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgUkRJRXJyb3JfRklRICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFJESUVycm9yX0Vycm9yICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBSRElFcnJvcl9CcmFuY2hUaHJvdWdoMCAgICAgICAgIDEwCisKKyNkZWZpbmUgUkRJRXJyb3JfTm90SW5pdGlhbGlzZWQgICAgICAgICAxMjgKKyNkZWZpbmUgUkRJRXJyb3JfVW5hYmxlVG9Jbml0aWFsaXNlICAgICAxMjkKKyNkZWZpbmUgUkRJRXJyb3JfV3JvbmdCeXRlU2V4ICAgICAgICAgICAxMzAKKyNkZWZpbmUgUkRJRXJyb3JfVW5hYmxlVG9UZXJtaW5hdGUgICAgICAxMzEKKyNkZWZpbmUgUkRJRXJyb3JfQmFkSW5zdHJ1Y3Rpb24gICAgICAgICAxMzIKKyNkZWZpbmUgUkRJRXJyb3JfSWxsZWdhbEluc3RydWN0aW9uICAgICAxMzMKKyNkZWZpbmUgUkRJRXJyb3JfQmFkQ1BVU3RhdGVTZXR0aW5nICAgICAxMzQKKyNkZWZpbmUgUkRJRXJyb3JfVW5rbm93bkNvUHJvICAgICAgICAgICAxMzUKKyNkZWZpbmUgUkRJRXJyb3JfVW5rbm93bkNvUHJvU3RhdGUgICAgICAxMzYKKyNkZWZpbmUgUkRJRXJyb3JfQmFkQ29Qcm9TdGF0ZSAgICAgICAgICAxMzcKKyNkZWZpbmUgUkRJRXJyb3JfQmFkUG9pbnRUeXBlICAgICAgICAgICAxMzgKKyNkZWZpbmUgUkRJRXJyb3JfVW5pbXBsZW1lbnRlZFR5cGUgICAgICAxMzkKKyNkZWZpbmUgUkRJRXJyb3JfQmFkUG9pbnRTaXplICAgICAgICAgICAxNDAKKyNkZWZpbmUgUkRJRXJyb3JfVW5pbXBsZW1lbnRlZFNpemUgICAgICAxNDEKKyNkZWZpbmUgUkRJRXJyb3JfTm9Nb3JlUG9pbnRzICAgICAgICAgICAxNDIKKyNkZWZpbmUgUkRJRXJyb3JfQnJlYWtwb2ludFJlYWNoZWQgICAgICAxNDMKKyNkZWZpbmUgUkRJRXJyb3JfV2F0Y2hwb2ludEFjY2Vzc2VkICAgICAxNDQKKyNkZWZpbmUgUkRJRXJyb3JfTm9TdWNoUG9pbnQgICAgICAgICAgICAxNDUKKyNkZWZpbmUgUkRJRXJyb3JfUHJvZ3JhbUZpbmlzaGVkSW5TdGVwICAxNDYKKyNkZWZpbmUgUkRJRXJyb3JfVXNlckludGVycnVwdCAgICAgICAgICAxNDcKKyNkZWZpbmUgUkRJRXJyb3JfQ2FudFNldFBvaW50ICAgICAgICAgICAxNDgKKyNkZWZpbmUgUkRJRXJyb3JfSW5jb21wYXRpYmxlUkRJTGV2ZWxzICAxNDkKKworI2RlZmluZSBSRElFcnJvcl9DYW50TG9hZENvbmZpZyAgICAgICAgIDE1MAorI2RlZmluZSBSRElFcnJvcl9CYWRDb25maWdEYXRhICAgICAgICAgIDE1MQorI2RlZmluZSBSRElFcnJvcl9Ob1N1Y2hDb25maWcgICAgICAgICAgIDE1MgorI2RlZmluZSBSRElFcnJvcl9CdWZmZXJGdWxsICAgICAgICAgICAgIDE1MworI2RlZmluZSBSRElFcnJvcl9PdXRPZlN0b3JlICAgICAgICAgICAgIDE1NAorI2RlZmluZSBSRElFcnJvcl9Ob3RJbkRvd25sb2FkICAgICAgICAgIDE1NQorI2RlZmluZSBSRElFcnJvcl9Qb2ludEluVXNlICAgICAgICAgICAgIDE1NgorI2RlZmluZSBSRElFcnJvcl9CYWRJbWFnZUZvcm1hdCAgICAgICAgIDE1NworI2RlZmluZSBSRElFcnJvcl9UYXJnZXRSdW5uaW5nICAgICAgICAgIDE1OAorI2RlZmluZSBSRElFcnJvcl9EZXZpY2VXb3VsZE5vdE9wZW4gICAgIDE1OQorI2RlZmluZSBSRElFcnJvcl9Ob1N1Y2hIYW5kbGUgICAgICAgICAgIDE2MAorI2RlZmluZSBSRElFcnJvcl9Db25mbGljdGluZ1BvaW50ICAgICAgIDE2MQorCisjZGVmaW5lIFJESUVycm9yX0xpdHRsZUVuZGlhbiAgICAgICAgICAgMjQwCisjZGVmaW5lIFJESUVycm9yX0JpZ0VuZGlhbiAgICAgICAgICAgICAgMjQxCisjZGVmaW5lIFJESUVycm9yX1NvZnRJbml0aWFsaXNlRXJyb3IgICAgMjQyCisKKyNkZWZpbmUgUkRJRXJyb3JfSW5zdWZmaWNpZW50UHJpdmlsZWdlICAyNTMKKyNkZWZpbmUgUkRJRXJyb3JfVW5pbXBsZW1lbnRlZE1lc3NhZ2UgICAyNTQKKyNkZWZpbmUgUkRJRXJyb3JfVW5kZWZpbmVkTWVzc2FnZSAgICAgICAyNTUKKworCisjZW5kaWYKKworLyogRU9GIGFkcF9oICovCmRpZmYgLS1naXQgYS9nZGIvcmRpLXNoYXJlL2FkcGVyci5oIGIvZ2RiL3JkaS1zaGFyZS9hZHBlcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTBmMWRjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9hZHBlcnIuaApAQCAtMCwwICsxLDc0IEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMTk5NSBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGZyZWVseSB1c2VkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaXMgcHJlc2VydmVkIGluIGFsbCBjb3BpZXMgb2YgdGhlCisgKiBzb2Z0d2FyZS4KKyAqLworCisvKiAtKi1DLSotCisgKgorICogJFJldmlzaW9uJAorICogICAgICREYXRlJAorICoKKyAqCisgKiAgIFByb2plY3Q6IEFOR0VMCisgKgorICogICAgIFRpdGxlOiBEZWZpbml0aW9ucyBvZiBBRFAgZXJyb3IgY29kZXMKKyAqLworCisjaWZuZGVmIGFuZ3NkX2FkcGVycnNfaAorI2RlZmluZSBhbmdzZF9hZHBlcnJzX2gKKy8qCisgKiBBRFAgZmFpbHVyZSBjb2RlcyBzdGFydCBhdCAyNTYgdG8gZGlzdGluZ3Vpc2ggdGhlbSBmb3IgZGVidWcgcHVycG9zZXMKKyAqLworZW51bSBBZHBFcnJzCit7CisgICAgYWRwX29rID0gMCwKKyAgICBhZHBfZmFpbGVkID0gMjU2LAorICAgIGFkcF9tYWxsb2NfZmFpbHVyZSwKKyAgICBhZHBfaWxsZWdhbF9hcmdzLAorICAgIGFkcF9kZXZpY2Vfbm90X2ZvdW5kLAorICAgIGFkcF9kZXZpY2Vfb3Blbl9mYWlsZWQsCisgICAgYWRwX2RldmljZV9hbHJlYWR5X29wZW4sCisgICAgYWRwX2RldmljZV9ub3Rfb3BlbiwKKyAgICBhZHBfYmFkX2NoYW5uZWxfaWQsCisgICAgYWRwX2NhbGxiYWNrX2FscmVhZHlfcmVnaXN0ZXJlZCwKKyAgICBhZHBfd3JpdGVfYnVzeSwKKyAgICBhZHBfYmFkX3BhY2tldCwKKyAgICBhZHBfc2VxX2hpZ2gsCisgICAgYWRwX3NlcV9sb3csCisgICAgYWRwX3RpbWVvdXRfb25fb3BlbiwKKyAgICBhZHBfYWJhbmRvbl9ib290X3dhaXQsCisgICAgYWRwX2xhdGVfc3RhcnR1cCwKKyAgICBhZHBfbmV3X2FnZW50X3N0YXJ0aW5nCit9OworCisjaWZuZGVmIF9fY3BsdXNwbHVzCit0eXBlZGVmIGVudW0gQWRwRXJycyBBZHBFcnJzOworI2VuZGlmCisKKyNkZWZpbmUgQWRwTWVzc19GYWlsZWQgICAgICAgICAgICAgIkFEUCBFcnJvciAtIHVuc3BlY2lmaWMgZmFpbHVyZSIKKyNkZWZpbmUgQWRwTWVzc19NYWxsb2NGYWlsZWQgICAgICAgIkFEUCBFcnJvciAtIG1hbGxvYyBmYWlsZWQiCisjZGVmaW5lIEFkcE1lc3NfSWxsZWdhbEFyZ3MgICAgICAgICJBRFAgRXJyb3IgLSBpbGxlZ2FsIGFyZ3VtZW50cyIKKyNkZWZpbmUgQWRwTWVzc19EZXZpY2VOb3RGb3VuZCAgICAgIkFEUCBFcnJvciAtIGludmFsaWQgZGV2aWNlIHNwZWNpZmllZCIKKyNkZWZpbmUgQWRwTWVzc19EZXZpY2VPcGVuRmFpbGVkICAgIkFEUCBFcnJvciAtIHNwZWNpZmllZCBkZXZpY2UgZmFpbGVkIHRvIG9wZW4iCisjZGVmaW5lIEFkcE1lc3NfRGV2aWNlQWxyZWFkeU9wZW4gICJBRFAgRXJyb3IgLSBkZXZpY2UgYWxyZWFkeSBvcGVuIgorI2RlZmluZSBBZHBNZXNzX0RldmljZU5vdE9wZW4gICAgICAiQURQIEVycm9yIC0gZGV2aWNlIG5vdCBvcGVuIgorI2RlZmluZSBBZHBNZXNzX0JhZENoYW5uZWxJZCAgICAgICAiQURQIEVycm9yIC0gYmFkIGNoYW5uZWwgSWQiCisjZGVmaW5lIEFkcE1lc3NfQ0JBbHJlYWR5UmVnZCAgICAgICJBRFAgRXJyb3IgLSBjYWxsYmFjayBhbHJlYWR5IHJlZ2lzdGVyZWQiCisjZGVmaW5lIEFkcE1lc3NfV3JpdGVCdXN5ICAgICAgICAgICJBRFAgRXJyb3IgLSB3cml0ZSBidXN5IgorI2RlZmluZSBBZHBNZXNzX0JhZFBhY2tldCAgICAgICAgICAiQURQIEVycm9yIC0gYmFkIHBhY2tldCIKKyNkZWZpbmUgQWRwTWVzc19TZXFIaWdoICAgICAgICAgICAgIkFEUCBFcnJvciAtIHNlcXVlbmNlIG51bWJlciB0b28gaGlnaCIKKyNkZWZpbmUgQWRwTWVzc19TZXFMb3cgICAgICAgICAgICAgIkFEUCBFcnJvciAtIHNlcXVlbmNlIG51bWJlciB0b28gbG93IgorI2RlZmluZSBBZHBNZXNzX1RpbWVvdXRPbk9wZW4gICAgICAiQURQIEVycm9yIC0gdGFyZ2V0IGRpZCBub3QgcmVzcG9uZCIKKyNkZWZpbmUgQWRwTWVzc19BYmFuZG9uQm9vdFdhaXQgICAgImFiYW5kb25lZCB3YWl0IGZvciBsYXRlIHN0YXJ0dXAiCisjZGVmaW5lIEFkcE1lc3NfTGF0ZVN0YXJ0dXAgICAgICAgICJUYXJnZXQgY29tcGlsZWQgd2l0aCBMQVRFX1NUQVJUVVAgc2V0LlxuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYWl0aW5nIGZvciB0YXJnZXQuLi5cbiIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmVzcyA8Q3RybC1DPiB0byBhYm9ydC5cbiIKKyNkZWZpbmUgQWRwTWVzc0xlbl9MYXRlU3RhcnR1cCAgICAoMyo4MCkKKyNkZWZpbmUgQWRwTWVzc19OZXdBZ2VudFN0YXJ0aW5nICAgIk5ldyBEZWJ1ZyBBZ2VudCBhYm91dCB0byBzdGFydC5cbiIKKyAKKyNlbmRpZiAvKiBuZGVmIGFuZ3NkX2FkcGVycl9oICovCisKKy8qIEVPRiBhZHBlcnIuaCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9hbmdlbC5oIGIvZ2RiL3JkaS1zaGFyZS9hbmdlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYTVmMzEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL2FuZ2VsLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qPiBhbmdlbC5oIDwqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogVGhpcyBoZWFkZXIgZmlsZSBpcyB0aGUgbWFpbiBob2xkZXIgZm9yIHRoZSBkZWNsYXJhdGlvbnMgYW5kCisgKiBwcm90b3R5cGVzIGZvciB0aGUgY29yZSBBbmdlbCBzeXN0ZW0uIFNvbWUgQW5nZWwgY29uY2VwdHMgYXJlCisgKiBkZXNjcmliZWQgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZmlsZSB0byBlbnN1cmUgdGhhdCBhIGNvbXBsZXRlIHZpZXcKKyAqIG9mIHRoZSBBbmdlbCB3b3JsZCBjYW4gYmUgZGVyaXZlZCBwdXJlbHkgZnJvbSB0aGUgc291cmNlLgorICoKKyAqICRSZXZpc2lvbiQKKyAqICAgICAkRGF0ZSQKKyAqCisgKgorICogTk9URTogQ3VycmVudGx5IHRoZSBBbmdlbCBzb3VyY2UgaXMgZGVzaWduZWQgdG8gYmUgc2ltcGxlLAorICogdW5kZXJzdGFuZGFibGUgYW5kIGVhc3kgdG8gcG9ydCB0byBuZXcgaGFyZHdhcmUgcGxhdGZvcm1zLiBIb3dldmVyLAorICogdGhpcyBkb2VzIG5vdCBhbHdheXMgeWllbGQgdGhlIGhpZ2hlc3QgcGVyZm9ybWluZyBzeXN0ZW0uIFRoZQorICogY3VycmVudCBsYXllcmVkIGFwcHJvYWNoIGludHJvZHVjZXMgYW4gb3ZlcmhlYWQgdG8gdGhlIHBlcmZvcm1hbmNlCisgKiBvZiB0aGUgc3lzdGVtLiBJbiBhIHRydWUgY29tbWVyY2lhbCB0YXJnZXQsIHRoaXMgY29kZSBzaG91bGQgYmUKKyAqIHJlLWRlc2lnbmVkIHRvIGJ1aWxkIGEgc3lzdGVtIHdoZXJlIHRoZSBBbmdlbCBsb2dpY2FsIG1lc3NhZ2UKKyAqIHN5c3RlbSwgZGV2aWNlIGRyaXZlciBhbmQgaGFyZHdhcmUgYWNjZXNzZXMgYXJlIG1lcmdlZCB0byBwcm92aWRlCisgKiB0aGUgYmVzdCBwZXJmb3JtYW5jZS4KKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQW5nZWwgb3ZlcnZpZXc6CisKKy4uLiBzb21lIGNvbW1lbnRzIGRlc2NyaWJpbmcgQW5nZWwgLi4uCisKKyAqIEFuZ2VsIGlzIGRlc2lnbmVkIGFzIGEga2l0LW9mLXBhcnRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZQorICogcnVuLXRpbWUgc3VwcG9ydCBmb3IgdGhlIGRldmVsb3BtZW50IG9mIEFSTSBhcHBsaWNhdGlvbnMuIFRoZSBtYWluCisgKiBjb3JlIG9mIEFuZ2VsIGlzIGluIHByb3ZpZGluZyBzdXBwb3J0IGZvciB0aGUgImRlYnVnIiBtZXNzYWdlCisgKiBjb21tdW5pY2F0aW9uIHdpdGggYSBob3N0IHN5c3RlbS4gVGhlc2UgbWVzc2FnZXMgZG8gbm90IGp1c3QgY292ZXIKKyAqIGRlYnVnZ2luZyBBUk0gcHJvY2Vzc2VzLCBidXQgYWxzbyB0aGUgcHJvY2VzcyBvZiBkb3dubG9hZGluZyBBUk0KKyAqIHByb2dyYW1zIG9yIGF0dGFjaGluZyB0byBleGVjdXRpbmcgcHJvY2Vzc2VzIG9uIHRoZSB0YXJnZXQuCisgKgorICogQSBzdGFuZC1hbG9uZSBST00gYmFzZWQgQW5nZWwgd29ybGQgaXMgdGhlIGJhc2ljIHN0YXJ0aW5nIHBvaW50IGZvcgorICogYSBzeXN0ZW0sIHNpbmNlIGl0IHdpbGwgYWxsb3cgcHJvZ3JhbXMgdG8gYmUgZG93bmxvYWRlZCB0byB0aGUKKyAqIHRhcmdldC4gVGhlIFJPTSB2ZXJzaW9uIG9mIEFuZ2VsIHdpbGwgcHJvdmlkZSB0aGUgZ2VuZXJpYyBkZWJ1ZworICogc3VwcG9ydCwgYnV0IG5vIHN5c3RlbSBzcGVjaWZpYyByb3V0aW5lcy4gVGhlIHByZWZlcnJlZCBtZXRob2Qgb2YKKyAqIHVzaW5nIEFuZ2VsIGlzIGFzIGEgbGluayBsaWJyYXJ5LiBUaGlzIGVuc3VyZXMgdGhhdCBhcHBsaWNhdGlvbnMKKyAqIGNhcnJ5IHdpdGggdGhlbSB0aGUgQW5nZWwgcm91dGluZXMgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgZGVidWdnaW5nCisgKiAoYW5kIGFsc28gZW5zdXJlIHRoYXQgdGhlIEFuZ2VsIHZlcnNpb24gaXMgdXAtdG8tZGF0ZSwgaW5kZXBlbmRhbnQKKyAqIG9mIHRoZSB2ZXJzaW9uIGluIHRoZSB0YXJnZXQgUk9NKS4gRXZlbnR1YWxseSwgb25jZSBhIHByb2dyYW0gaGFzCisgKiBiZWVuIGZ1bGx5IGRlYnVnZ2VkLCBhIFJPTW1lZCB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtIGNhbiBiZQorICogZ2VuZXJhdGVkIHdpdGggdGhlIEFuZ2VsIGNvZGUgYmVpbmcgcHJvdmlkZWQgaW4gdGhlIGFwcGxpY2F0aW9uLgorCisuLiBtb3JlIGNvbW1lbnRzIC4uCisKKyAqIFRoZSBzdGFuZGFyZCBBbmdlbCByb3V0aW5lcyBkbyAqTk9UKiBwZXJmb3JtIGFueSBkeW5hbWljIG1lbW9yeQorICogYWxsb2NhdGlvbi4gVG8gc2ltcGxpZnkgdGhlIHNvdXJjZSwgYW5kIGFpZCB0aGUgcG9ydGluZyB0byBhIG5vbiBDCisgKiBsaWJyYXJ5IHdvcmxkLCBtZW1vcnkgaXMgZWl0aGVyIHByZS1hbGxvY2F0ZWQgKGFzIGJ1aWxkLXRpbWUKKyAqIGdsb2JhbHMpIG9yIGFjdHVhbGx5IGdpdmVuIHRvIHRoZSBwYXJ0aWN1bGFyIEFuZ2VsIHJvdXRpbmUgYnkgdGhlCisgKiBhY3RpdmUgcnVuLXRpbWUuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIEFuZ2VsCisgKiBhbmQgdGhlIHRhcmdldCBPL1MgaXMgbWluaW1pc2VkLgorICoKKyAqIE5vdGVzOiBXZSBzdWItaW5jbHVkZSBtb3JlIGhlYWRlciBmaWxlcyB0byBrZWVwIHRoZSBzb3VyY2UKKyAqIG1vZHVsYXIuIFNpbmNlIEFuZ2VsIGlzIGEga2l0LW9mLXBhcnRzIGFsdGVybmF0aXZlIHN5c3RlbXMgbWF5IG5lZWQKKyAqIHRvIGNoYW5nZSB0aGUgcHJvdG90eXBlcyBvZiBwYXJ0aWN1bGFyIGZ1bmN0aW9ucywgd2hpbHN0CisgKiBtYWludGFpbmluZyBhIGZpeGVkIGV4dGVybmFsIGludGVyZmFjZS4gZS5nLiB1c2luZyB0aGUgc3RhbmRhcmQKKyAqIERFQlVHIG1lc3NhZ2VzLCBidXQgd2l0aCBhIGRpZmZlcmVudCBjb21tdW5pY2F0aW9ucyB3b3JsZC4KKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9fYW5nZWxfaAorI2RlZmluZSBfX2FuZ2VsX2gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLSBHbG9iYWwgQW5nZWwgZGVmaW5pdGlvbnMgYW5kIG1hbmlmZXN0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogV2hlbiBidWlsZGluZyBBbmdlbCB3ZSBtYXkgbm90IGluY2x1ZGUgdGhlIHN0YW5kYXJkIGxpYnJhcnkKKyAqIGhlYWRlcnMuIEhvd2V2ZXIsIGl0IGlzIHVzZWZ1bCBjb2RpbmcgdXNpbmcgc3RhbmRhcmQgbWFjcm8gbmFtZXMKKyAqIHNpbmNlIGl0IG1ha2VzIHRoZSBjb2RlIGVhc2llciB0byB1bmRlcnN0YW5kLgorICovCisKK3R5cGVkZWYgdW5zaWduZWQgaW50ICB3b3JkIDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBieXRlIDsKKworLyogVGhlIGZvbGxvd2luZyB0eXBlZGVmcyBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgSS9PIHJlZ2lzdGVyczogKi8KK3R5cGVkZWYgdm9sYXRpbGUgdW5zaWduZWQgaW50ICB2dXdvcmQgOwordHlwZWRlZiB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHZ1Ynl0ZSA7CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHR5cGVkZWZzIGFyZSB1c2VkIHdoZW4gZGVmaW5pbmcgb2JqZWN0cyB0aGF0IG1heSBhbHNvCisgKiBiZSBjcmVhdGVkIG9uIGEgaG9zdCBzeXN0ZW0sIHdoZXJlIHRoZSB3b3JkIHNpemUgaXMgbm90CisgKiAzMmJpdHMuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBzYW1lIGRhdGEgdmFsdWVzIGFyZSBtYW5pcHVsYXRlZC4KKyAqLworI2lmZGVmIFRBUkdFVAordHlwZWRlZiB1bnNpZ25lZCBpbnQgdW5zaWduZWQzMjsKK3R5cGVkZWYgc2lnbmVkIGludCAgIHNpZ25lZDMyOwordHlwZWRlZiAgICAgICAgaW50ICAgaW50MzI7CisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IHVuc2lnbmVkMTY7Cit0eXBlZGVmIHNpZ25lZCAgIHNob3J0IGludCBzaWduZWQxNjsKKworLyoKKyAqIHlldCBhbm90aGVyIHNvbHV0aW9uIGZvciB0aGUgYm9vbC9ib29sZWFuIHByb2JsZW0sIHRoaXMgb25lIGlzCisgKiBjb3BpZWQgZnJvbSBTY290dCdzIG1vZGlmaWNhdGlvbnMgdG8gY2x4L2hvc3QuaAorICovCisjIGlmZGVmIElNUExFTUVOVF9CT09MX0FTX0VOVU0KKyAgIGVudW0gX2Jvb2wgeyBfZmFsc2UsIF90cnVlIH07CisjICBkZWZpbmUgX2Jvb2wgZW51bSBfYm9vbAorIyBlbGlmIGRlZmluZWQoSU1QTEVNRU5UX0JPT0xfQVNfSU5UKSB8fCAhZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgIGRlZmluZSBfYm9vbCBpbnQKKyMgIGRlZmluZSBfZmFsc2UgMAorIyAgZGVmaW5lIF90cnVlIDEKKyMgZW5kaWYKKworIyBpZmRlZiBfYm9vbAorIyAgZGVmaW5lIGJvb2wgX2Jvb2wKKyMgZW5kaWYKKworIyBpZm5kZWYgdHJ1ZQorIyAgZGVmaW5lIHRydWUgX3RydWUKKyMgIGRlZmluZSBmYWxzZSBfZmFsc2UKKyMgZW5kaWYKKworIyBpZm5kZWYgWUVTCisjICBkZWZpbmUgWUVTICAgdHJ1ZQorIyAgZGVmaW5lIE5PICAgIGZhbHNlCisjIGVuZGlmCisKKyMgdW5kZWYgVFJVRSAgICAgICAgICAgICAvKiBzb21lIE9TRiBoZWFkZXJzIGRlZmluZSBhcyAxICovCisjIGRlZmluZSBUUlVFICB0cnVlCisKKyMgdW5kZWYgRkFMU0UgICAgICAgICAgICAvKiBzb21lIE9TRiBoZWFkZXJzIGRlZmluZSBhcyAxICovCisjIGRlZmluZSBGQUxTRSBmYWxzZQorCisjIGlmbmRlZiBOVUxMCisjICBkZWZpbmUgTlVMTCAwCisjIGVuZGlmCisKKyNlbHNlCisKKyMgaW5jbHVkZSAiaG9zdC5oIgorCisjZW5kaWYKKworI2lmbmRlZiBJR05PUkUKKyMgZGVmaW5lIElHTk9SRSh4KSAoKHgpPSh4KSkKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIHR5cGVkZWYgYWxsb3dzIHVzIHRvIGNhc3QgYmV0d2VlbiBpbnRlZ3JhbCBhbmQKKyAqIGZ1bmN0aW9uIHBvaW50ZXJzLiBUaGlzIGlzbid0IGFsbG93ZWQgYnkgZGlyZWN0IGNhc3Rpbmcgd2hlbgorICogY29uZm9ybWluZyB0byB0aGUgQU5TSSBzcGVjLgorICovCit0eXBlZGVmIHVuaW9uIGFuc2lib2RnZQoreworIHdvcmQgIHcgOworIHdvcmQgKndwIDsKKyB2b2lkICp2cCA7CisgYnl0ZSAqYnAgOworIHZvaWQgKCp2Zm4pKHZvaWQpIDsKKyB3b3JkICgqd2ZuKSh2b2lkKSA7CisgaW50ICAoKmlmbikodm9pZCkgOworIGJ5dGUgKCpiZm4pKHZvaWQpIDsKK30gYW5zaWJvZGdlIDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUaGUgYW1vdW50IHNldHVwIGFzaWRlIGJ5IHRoZSBydW4tdGltZSBzeXN0ZW0gZm9yIHN0YWNrIG92ZXJmbG93CisgKiBoYW5kbGVycyB0byBleGVjdXRlIGluLiBUaGlzIG11c3QgYmUgYXQgbGVhc3QgMjU2Ynl0ZXMsIHNpbmNlIHRoYXQKKyAqIHZhbHVlIGlzIGFzc3VtZWQgYnkgdGhlIGN1cnJlbnQgQVJNIEx0ZCBjb21waWxlci4KKyAqIFRoaXMgc3BhY2UgaXMgX29ubHlfIGtlcHQgZm9yIHRoZSBVU1Igc3RhY2ssIG5vdCBhbnkgb2YgdGhlIHByaXZpbGVnZWQKKyAqIG1vZGUgc3RhY2tzLCBhcyBzdGFjayBvdmVyZmxvdyBvbiB0aGVzZSBpcyBhbHdheXMgZmF0YWwgLSB0aGVyZSBpcworICogbm8gcG9pbnQgYXR0ZW1wdGluZ3RvIHJlY292ZXIuICBJbiBhZGRpdGlvbiBpcyBpcyBpbXBvcnRhbnQgdGhhdAorICogQW5nZWwgc2hvdWxkIGtlZXAgcHJpdmlsZWdlZCBzdGFjayBzcGFjZSByZXF1aXJlbWVudHMgdG8gYSBtaW5pbXVtLgorICovCisjZGVmaW5lIEFQQ1NfU1RBQ0tHVUFSRCAyNTYKKworI2VuZGlmIC8qIF9fYW5nZWxfaCAqLworCisvKiBFT0YgYW5nZWwuaCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9hcmRpLmMgYi9nZGIvcmRpLXNoYXJlL2FyZGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjFmNzI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9hcmRpLmMKQEAgLTAsMCArMSwyNjcyIEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMTk5NSBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGZyZWVseSB1c2VkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaXMgcHJlc2VydmVkIGluIGFsbCBjb3BpZXMgb2YgdGhlCisgKiBzb2Z0d2FyZS4KKyAqLworCisvKgorICogQVJESS5jCisgKiBBbmdlbCBSZW1vdGUgRGVidWcgSW50ZXJmYWNlCisgKgorICoKKyAqICRSZXZpc2lvbiQKKyAqICAgICAkRGF0ZSQKKyAqCisgKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gL3BsZy9waXNkL3JkaS5jLCBidXQgaW5zdGVhZCBvZiB1c2luZyBSRFAgaXQgdXNlcworICogQURQIG1lc3NhZ2VzLgorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2RlZmluZSB1aW50IEhJREVfSFBzX3VpbnQKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyN1bmRlZiB1aW50CisKKworI2luY2x1ZGUgImVuZGlhbi5oIgorI2luY2x1ZGUgImFyZGkuaCIKKyNpbmNsdWRlICJidWZmZXJzLmgiCisjaW5jbHVkZSAiY2hhbm5lbHMuaCIKKyNpbmNsdWRlICJob3N0Y2hhbi5oIgorI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJieXRlc2V4LmgiCisjaW5jbHVkZSAiZGJnX2NwLmgiCisjaW5jbHVkZSAiYWRwLmgiCisjaW5jbHVkZSAiaHN5cy5oIgorI2luY2x1ZGUgImxvZ2dpbmcuaCIKKyNpbmNsdWRlICJtc2didWlsZC5oIgorI2luY2x1ZGUgInJ4dHguaCIKKyNpbmNsdWRlICJkZXZzdy5oIgorI2luY2x1ZGUgInBhcmFtcy5oIgorCisjaWZkZWYgQ09NUElMSU5HX09OX1dJTkRPV1MKKyMgIGRlZmluZSBJR05PUkUoeCkgKHggPSB4KSAgIC8qIG11c3QgZ28gYWZ0ZXIgI2luY2x1ZGVzIHRvIHdvcmsgb24gV2luZG93cyAqLworI2VuZGlmCisjZGVmaW5lIE5PVCh4KSAoISh4KSkKKworI2RlZmluZSBBRFBfSU5JVElBTF9USU1FT1VUX1BFUklPRCA1CisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgZXhlY3V0aW5nOworc3RhdGljIGludCByZGlfbG9nID0gMCA7IC8qIGRlYnVnZ2luZyAgPyAqLworCisvKiB3ZSBuZWVkIGEgc3RhcnRpbmcgcG9pbnQgZm9yIG91ciBmaXJzdCBidWZmZXJzLCB0aGlzIGlzIGEgc2FmZSBvbmUgKi8KK2ludCBBcm1zZF9CdWZmZXJTaXplID0gQURQX0JVRkZFUl9NSU5fU0laRTsKK2ludCBBcm1zZF9Mb25nQnVmU2l6ZSA9IEFEUF9CVUZGRVJfTUlOX1NJWkU7CisKKyNpZmRlZiBXSU4zMgorICBleHRlcm4gaW50IGludGVycnVwdGVkOworICBleHRlcm4gaW50IHN3aXByb2Nlc3Npbmc7CisjZW5kaWYKKworc3RhdGljIGNoYXIgZHVtbXljbGluZSA9IDA7CitjaGFyICphcmRpX2NvbW1hbmRsaW5lID0gJmR1bW15Y2xpbmUgOyAvKiBleHBvcnRlZCBpbiBhcmRpLmggKi8KKworZXh0ZXJuIHVuc2lnbmVkIGludCBoZWFydGJlYXRfZW5hYmxlZDsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmNwd29yZHNbMTZdOworCit0eXBlZGVmIHN0cnVjdCBzdG9wcGVkUHJvY0xpc3RFbGVtZW50IHsKKyAgc3RydWN0IHN0b3BwZWRQcm9jTGlzdEVsZW1lbnQgKm5leHQ7CisgIGFuZ2VsX1JESV9UYXJnZXRTdG9wcGVkUHJvYyAqZm47CisgIHZvaWQgKmFyZzsKK30gc3RvcHBlZFByb2NMaXN0RWxlbWVudDsKKworc3RhdGljIHN0b3BwZWRQcm9jTGlzdEVsZW1lbnQgKnN0b3BwZWRfcHJvY19saXN0PU5VTEw7CisKK2NvbnN0IHN0cnVjdCBEYmdfSG9zdG9zSW50ZXJmYWNlICphbmdlbF9ob3N0aWY7CitzdGF0aWMgaHN5c19zdGF0ZSAqaHN0YXRlOworCitzdGF0aWMgdm9pZCBhbmdlbF9EZWJ1Z1ByaW50KGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreyB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgYW5nZWxfaG9zdGlmLT5kYmdwcmludChhbmdlbF9ob3N0aWYtPmRiZ2FyZywgZm9ybWF0LCBhcCk7CisgIHZhX2VuZChhcCk7Cit9CisKKyNpZmRlZiBSRElfVkVSQk9TRQorI2RlZmluZSBUcmFjZVByaW50KHMpIFwKKyAgaWYgKHJkaV9sb2cgJiAyKSBhbmdlbF9EZWJ1Z1ByaW50KCJcbiIpOyBcCisgIGlmIChyZGlfbG9nICYgMSkgYW5nZWxfRGVidWdQcmludCBzCisjZWxzZQorI2RlZmluZSBUcmFjZVByaW50KHMpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgcmVjZWl2ZV9kYmdtc2dfc3RhdGUgeworICB2b2xhdGlsZSBpbnQgcmVjZWl2ZWQ7CisgIFBhY2tldCAqcGFja2V0OworfSByZWNlaXZlX2RiZ21zZ19zdGF0ZTsKKworc3RhdGljIHJlY2VpdmVfZGJnbXNnX3N0YXRlIGRiZ21zZ19zdGF0ZTsKKworc3RhdGljIHZvaWQgcmVjZWl2ZV9kZWJ1Z19wYWNrZXQoUGFja2V0ICpwYWNrZXQsIHZvaWQgKnN0YXRlcHRyKQoreworICByZWNlaXZlX2RiZ21zZ19zdGF0ZSAqc3RhdGUgPSBzdGF0ZXB0cjsKKworICBzdGF0ZS0+cGFja2V0ID0gcGFja2V0OworICBzdGF0ZS0+cmVjZWl2ZWQgPSAxOworfQorCitzdGF0aWMgaW50IHJlZ2lzdGVyX2RlYnVnX21lc3NhZ2VfaGFuZGxlcih2b2lkKQoreworICBpbnQgZXJyOworICBkYmdtc2dfc3RhdGUucmVjZWl2ZWQgPSAwOworCisgIGVyciA9IEFkcF9DaGFubmVsUmVnaXN0ZXJSZWFkKENJX0hBRFAsIHJlY2VpdmVfZGVidWdfcGFja2V0LCAmZGJnbXNnX3N0YXRlKTsKKyNpZmRlZiBERUJVRworICBpZiAoZXJyIT1hZHBfb2spIGFuZ2VsX0RlYnVnUHJpbnQoInJlZ2lzdGVyX2RlYnVnX21lc3NhZ2VfaGFuZGxlciBmYWlsZWQgJWlcbiIsIGVycik7CisjZW5kaWYKKyAgcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IHdhaXRfZm9yX2RlYnVnX21lc3NhZ2UoaW50ICpyY29kZSwgaW50ICpkZWJ1Z0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqT1NpbmZvMSwgaW50ICpPU2luZm8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc3RhdHVzLCBQYWNrZXQgKipwYWNrZXQpCit7CisgIHVuc2lnbmVkIGludCByZWFzb247CisKKyNpZmRlZiBERUJVRworICBhbmdlbF9EZWJ1Z1ByaW50KCJ3YWl0X2Zvcl9kZWJ1Z19tZXNzYWdlIHdhaXRpbmcgZm9yICVYXG4iLCAqcmNvZGUpOworI2VuZGlmCisKKyAgZm9yICggOyBkYmdtc2dfc3RhdGUucmVjZWl2ZWQgPT0gMCA7ICkKKyAgICBBZHBfQXN5bmNocm9ub3VzUHJvY2Vzc2luZyhhc3luY19ibG9ja19vbl9yZWFkKTsKKworI2lmZGVmIERFQlVHCisgIGFuZ2VsX0RlYnVnUHJpbnQoIndhaXRfZm9yX2RlYnVnX21lc3NhZ2UgZ290IHBhY2tldFxuIik7CisjZW5kaWYKKworICAqcGFja2V0ID0gZGJnbXNnX3N0YXRlLnBhY2tldDsKKworICBBZHBfQ2hhbm5lbFJlZ2lzdGVyUmVhZChDSV9IQURQLCBOVUxMLCBOVUxMKTsKKworICAvKgorICAgKiBUT0RPOgorICAgKiBJZiBBRFBfVW5yZWNvZ25pc2VkIHJldHVybiBlcnJvci4KKyAgICogSWYgQURQX0Fja25vd2xlZGdlIC0gaGFuZGxlIGFwcHJvcHJpYXRlbHkuCisgICAqIElmIGV4cGVjdGVkIG1lc3NhZ2UgcmVhZCBhcmd1bWVudHMgYW5kIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yLgorICAgKiBOb3RlOiBpZiBSRElFcnJvciBvY2N1cnMgdGhlbiB0aGUgZGF0YSB2YWx1ZXMgcmV0dXJuZWQgYXJlIGp1bmsKKyAgICovCisKKyAgdW5wYWNrX21lc3NhZ2UoQlVGRkVSREFUQSgoKnBhY2tldCktPnBrX2J1ZmZlciksICIldyV3JXcldyV3IiwgJnJlYXNvbiwgZGVidWdJRCwKKyAgICAgICAgICAgICAgICAgT1NpbmZvMSwgT1NpbmZvMiwgc3RhdHVzKTsKKyAgaWYgKHJlYXNvbiYweGZmZmZmZiA9PSBBRFBfSEFEUFVucmVjb2duaXNlZCkKKyAgICByZXR1cm4gUkRJRXJyb3JfVW5pbXBsZW1lbnRlZE1lc3NhZ2U7CisgIGlmIChyZWFzb24gIT0gKHVuc2lnbmVkICkgKnJjb2RlKSB7CisgICAgaWYoKHJlYXNvbiYweGZmZmZmZikgPT0gQURQX0hBRFBVbnJlY29nbmlzZWQpCisgICAgICByZXR1cm4gUkRJRXJyb3JfVW5pbXBsZW1lbnRlZE1lc3NhZ2U7CisgICAgZWxzZSB7CisgICAgICBhbmdlbF9EZWJ1Z1ByaW50KCJBUkRJIEVSUk9SOiBFeHBlY3RlZCByZWFzb25jb2RlICV4IGdvdCByZWFzb25jb2RlICV4LlxuIiwKKyAgICAgICAgICAgICAqcmNvZGUsIHJlYXNvbik7CisgICAgICByZXR1cm4gUkRJRXJyb3JfRXJyb3I7CisgICAgfQorICB9CisgIGVsc2UKKyAgICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKKyAgcmV0dXJuIFJESUVycm9yX0Vycm9yOyAgICAvKiBzdG9wIGEgcGVza3kgQU5TSSBjb21waWxlciB3YXJuaW5nICovCit9CisKKworLyoKKyAqIEhhbmRsZXIgYW5kIHJlZ2lzdHJhdGlvbiBmb3IgbG9nZ2luZyBtZXNzYWdlcyBmcm9tIHRhcmdldAorICovCitzdGF0aWMgdm9pZCBUYXJnZXRMb2dDYWxsYmFjayggUGFja2V0ICpwYWNrZXQsIHZvaWQgKnN0YXRlICkKK3sKKyAgICBwX0J1ZmZlciAgICAgcmVwbHkgPSBCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKTsKKyAgICB1bnNpZ25lZCBpbnQgbGVuICAgPSBwYWNrZXQtPnBrX2xlbmd0aDsKKyAgICBJR05PUkUoc3RhdGUpOworICAgIGFuZ2VsX2hvc3RpZi0+d3JpdGUoYW5nZWxfaG9zdGlmLT5ob3N0b3NhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXJlcGx5LCBsZW4gLSBDSEFOX0hFQURFUl9TSVpFKTsKKyAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisKKyAgICBwYWNrZXQgPSBEZXZTV19BbGxvY2F0ZVBhY2tldCg0KTsgLyogYmV0dGVyIG5vdCBhc2sgZm9yIDAgKi8KKyAgICAvKiB0aGUgcmVwbHkgaXMgdGhlIEFDSyAtIGFueSBjb250ZW50cyBhcmUgaWdub3JlZCAqLworICAgIGlmIChwYWNrZXQgIT0gTlVMTCkKKyAgICAgICBBZHBfQ2hhbm5lbFdyaXRlKCBDSV9UTE9HLCBwYWNrZXQgKTsKK30KKworc3RhdGljIHZvaWQgVGFyZ2V0TG9nSW5pdCggdm9pZCApCit7CisgICAgQWRwRXJycyBlcnIgPSBBZHBfQ2hhbm5lbFJlZ2lzdGVyUmVhZCggQ0lfVExPRywgVGFyZ2V0TG9nQ2FsbGJhY2ssIE5VTEwgKTsKKworI2lmZGVmIERFQlVHCisgICAgaWYgKGVyciAhPSBhZHBfb2spCisgICAgICAgYW5nZWxfRGVidWdQcmludCgiQ0lfVExPRyBSZWdpc3RlclJlYWQgZmFpbGVkICVkXG4iLCBlcnIpOworI2Vsc2UKKyAgICBJR05PUkUoZXJyKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tYW5nZWxfUkRJX29wZW4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdCBOZWdvdGlhdGVTdGF0ZSB7CisgICAgICBib29sICAgICAgICAgICAgIG5lZ290aWF0ZV9yZXNwOworICAgICAgYm9vbCAgICAgICAgICAgICBuZWdvdGlhdGVfYWNrOworICAgICAgYm9vbCAgICAgICAgICAgICBsaW5rX2NoZWNrX3Jlc3A7CisgICAgICBQYXJhbWV0ZXJDb25maWcgKmFjY2VwdGVkX2NvbmZpZzsKK30gTmVnb3RpYXRlU3RhdGU7CisKK3N0YXRpYyB2b2lkIHJlY2VpdmVfbmVnb3RpYXRlKFBhY2tldCAqcGFja2V0LCB2b2lkICpzdGF0ZXB0cikKK3sKKyAgICB1bnNpZ25lZCByZWFzb24sIGRlYnVnSUQsIE9TaW5mbzEsIE9TaW5mbzIsIHN0YXR1czsKKyAgICBOZWdvdGlhdGVTdGF0ZSAqbl9zdGF0ZSA9IChOZWdvdGlhdGVTdGF0ZSAqKXN0YXRlcHRyOworICAgIHBfQnVmZmVyIHJlcGx5ID0gQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlcik7CisKKyAgICB1bnBhY2tfbWVzc2FnZSggcmVwbHksICIldyV3JXcldyIsCisgICAgICAgICAgICAgICAgICAgICZyZWFzb24sICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIgKTsKKyAgICByZXBseSArPSBBRFBfREVGQVVMVF9IRUFERVJfU0laRTsKKworI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCggInJlY2VpdmVfbmVnb3RpYXRlOiByZWFzb24gJXhcbiIsIHJlYXNvbiApOworI2VuZGlmCisKKyAgICBzd2l0Y2ggKCByZWFzb24gKQorICAgIHsKKyAgICAgICAgY2FzZSBBRFBfUGFyYW1OZWdvdGlhdGUgfCBUdG9IOgorICAgICAgICB7CisgICAgICAgICAgICBuX3N0YXRlLT5uZWdvdGlhdGVfcmVzcCA9IFRSVUU7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IEdFVDMyTEUoIHJlcGx5ICk7CisgICAgICAgICAgICByZXBseSArPSBzaXplb2Yod29yZCk7CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIGFuZ2VsX0RlYnVnUHJpbnQoICJQYXJhbU5lZ290aWF0ZSBzdGF0dXMgJXVcbiIsIHN0YXR1cyApOworI2VuZGlmCisgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBSRElFcnJvcl9Ob0Vycm9yICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIEFuZ2VsX1JlYWRQYXJhbUNvbmZpZ01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHksIG5fc3RhdGUtPmFjY2VwdGVkX2NvbmZpZyApICkKKyAgICAgICAgICAgICAgICAgICBuX3N0YXRlLT5uZWdvdGlhdGVfYWNrID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBBRFBfTGlua0NoZWNrIHwgVHRvSDoKKyAgICAgICAgeworI2lmZGVmIERFQlVHCisgICAgICAgICAgICBhbmdlbF9EZWJ1Z1ByaW50KCAiUE9ORyFcbiIgKTsKKyNlbmRpZgorICAgICAgICAgICAgbl9zdGF0ZS0+bGlua19jaGVja19yZXNwID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworI2lmZGVmIERFQlVHCisgICAgICAgICAgICBhbmdlbF9EZWJ1Z1ByaW50KCAiVW5leHBlY3RlZCFcbiIgKTsKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgRGV2U1dfRnJlZVBhY2tldCggcGFja2V0ICk7Cit9CisKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgX191bml4CisjIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjZWxzZQorIyBpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKworLyoKKyAqIGNvbnZlcnQgYSBjb25maWcgaW50byBhIHNpbmdsZS12YWx1ZWQgb3B0aW9ucyBsaXN0CisgKi8KK3N0YXRpYyBQYXJhbWV0ZXJPcHRpb25zICpjb25maWdfdG9fb3B0aW9ucyggY29uc3QgUGFyYW1ldGVyQ29uZmlnICpjb25maWcgKQoreworICAgIHVuc2lnbmVkIGludCAgICAgICAgbnVtX3BhcmFtczsKKyAgICBzaXplX3QgICAgICAgICAgICAgIHNpemU7CisgICAgUGFyYW1ldGVyT3B0aW9ucyAgICpiYXNlX3A7CisKKyAgICBudW1fcGFyYW1zICA9IGNvbmZpZy0+bnVtX3BhcmFtZXRlcnM7CisgICAgc2l6ZSAgICAgICAgPQorICAgICAgICBzaXplb2YoUGFyYW1ldGVyT3B0aW9ucykKKyAgICAgICAgKyBudW1fcGFyYW1zKihzaXplb2YoUGFyYW1ldGVyTGlzdCkgKyBzaXplb2YodW5zaWduZWQgaW50KSk7CisgICAgYmFzZV9wICAgICAgPSBtYWxsb2MoIHNpemUgKTsKKworICAgIGlmICggYmFzZV9wICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50ICAgIHU7CisgICAgICAgIFBhcmFtZXRlckxpc3QgICpsaXN0X3AgICAgICAgICAgPQorICAgICAgICAgICAgKFBhcmFtZXRlckxpc3QgKikoKGNoYXIgKiliYXNlX3AgKyBzaXplb2YoUGFyYW1ldGVyT3B0aW9ucykpOworICAgICAgICB1bnNpZ25lZCBpbnQgICAqb3B0aW9uX3AgICAgICAgID0KKyAgICAgICAgICAgICh1bnNpZ25lZCBpbnQgKikobGlzdF9wICsgbnVtX3BhcmFtcyk7CisKKyAgICAgICAgYmFzZV9wLT5udW1fcGFyYW1fbGlzdHMgPSBudW1fcGFyYW1zOworICAgICAgICBiYXNlX3AtPnBhcmFtX2xpc3QgPSBsaXN0X3A7CisKKyAgICAgICAgZm9yICggdSA9IDA7IHUgPCBudW1fcGFyYW1zOyArK3UgKQorICAgICAgICB7CisgICAgICAgICAgICBvcHRpb25fcFt1XSAgICAgICAgICAgICAgICAgPSBjb25maWctPnBhcmFtW3VdLnZhbHVlOworICAgICAgICAgICAgbGlzdF9wW3VdLnR5cGUgICAgICAgICAgICAgID0gY29uZmlnLT5wYXJhbVt1XS50eXBlOworICAgICAgICAgICAgbGlzdF9wW3VdLm51bV9vcHRpb25zICAgICAgID0gMTsKKyAgICAgICAgICAgIGxpc3RfcFt1XS5vcHRpb24gICAgICAgICAgICA9ICZvcHRpb25fcFt1XTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiYXNlX3A7Cit9CisKK3N0YXRpYyBBZHBFcnJzIG5lZ290aWF0ZV9wYXJhbXMoIGNvbnN0IFBhcmFtZXRlck9wdGlvbnMgKnVzZXJfb3B0aW9ucyApCit7CisgICAgUGFja2V0ICAgICAgICAgICAgICAgICAgICAqcGFja2V0OworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgIGNvdW50OworICAgIHN0YXRpYyBQYXJhbWV0ZXIgICAgICAgICAgIHBhcmFtc1tBUF9OVU1fUEFSQU1TXTsKKyAgICBzdGF0aWMgUGFyYW1ldGVyQ29uZmlnICAgICBhY2NlcHRlZF9jb25maWcgPSB7IEFQX05VTV9QQVJBTVMsIHBhcmFtcyB9OworCisgICAgdGltZV90IHQ7CisKKyAgICBzdGF0aWMgdm9sYXRpbGUgTmVnb3RpYXRlU3RhdGUgICAgbl9zdGF0ZSA9IHsKKyAgICAgICAgRkFMU0UsIEZBTFNFLCBGQUxTRSwgJmFjY2VwdGVkX2NvbmZpZyB9OworCisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCAibmVnb3RpYXRlX3BhcmFtc1xuIiApOworI2VuZGlmCisKKyAgICBBZHBfQ2hhbm5lbFJlZ2lzdGVyUmVhZCggQ0lfSEJPT1QsIHJlY2VpdmVfbmVnb3RpYXRlLCAodm9pZCAqKSZuX3N0YXRlICk7CisKKyAgICBwYWNrZXQgPSAoUGFja2V0ICopRGV2U1dfQWxsb2NhdGVQYWNrZXQoQXJtc2RfQnVmZmVyU2l6ZSk7CisgICAgY291bnQgPSBtc2didWlsZCggQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlciksICIldyV3JXcldyIsCisgICAgICAgICAgICAgICAgICAgICAgQURQX1BhcmFtTmVnb3RpYXRlIHwgSHRvVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICBBRFBfSGFuZGxlVW5rbm93biwgQURQX0hhbmRsZVVua25vd24gKTsKKyAgICBjb3VudCArPSBBbmdlbF9CdWlsZFBhcmFtT3B0aW9uc01lc3NhZ2UoCisgICAgICAgIEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpICsgY291bnQsIHVzZXJfb3B0aW9ucyApOworICAgIHBhY2tldC0+cGtfbGVuZ3RoID0gY291bnQ7CisgICAgQWRwX0NoYW5uZWxXcml0ZUFzeW5jKCBDSV9IQk9PVCwgcGFja2V0ICk7CisKKyNpZmRlZiBERUJVRworICAgIGFuZ2VsX0RlYnVnUHJpbnQoICJzZW50IG5lZ290aWF0ZSBwYWNrZXRcbiIgKTsKKyNlbmRpZgorCisgICAgdD10aW1lKE5VTEwpOworCisgICAgZG8geworICAgICAgQWRwX0FzeW5jaHJvbm91c1Byb2Nlc3NpbmcoYXN5bmNfYmxvY2tfb25fbm90aGluZyk7CisKKyAgICAgIGlmICgodGltZShOVUxMKS10KSA+IEFEUF9JTklUSUFMX1RJTUVPVVRfUEVSSU9EKSB7CisgICAgICAgIHJldHVybiBhZHBfdGltZW91dF9vbl9vcGVuOworICAgICAgfQorICAgIH0gd2hpbGUgKCAhIG5fc3RhdGUubmVnb3RpYXRlX3Jlc3AgKTsKKworICAgIGlmICggbl9zdGF0ZS5uZWdvdGlhdGVfYWNrICkKKyAgICB7CisgICAgICAgIC8qIHNlbGVjdCBhY2NlcHRlZCBjb25maWcgKi8KKyAgICAgICAgQWRwX0lvY3RsKCBEQ19TRVRfUEFSQU1TLCAodm9pZCAqKW5fc3RhdGUuYWNjZXB0ZWRfY29uZmlnICk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogOTYwNDMwIEtXZWx0b24KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlcmUgaXMgYSByYWNlIGluIHRoZSByZW5lZ290aWF0aW9uIHByb3RvY29sOiB0aGUKKyAgICAgICAgICogdGFyZ2V0IGhhcyB0byBoYXZlIGhhZCB0aW1lIHRvIGxvYWQgbmV3IGNvbmZpZyBiZWZvcmUKKyAgICAgICAgICogd2Ugc2VuZCB0aGUgbGluayBjaGVjayBwYWNrZXQgLSBpbnNlcnQgYSBkZWxpYmVyYXRlCisgICAgICAgICAqIHBhdXNlICgxMDBtcykgdG8gZ2l2ZSB0aGUgdGFyZ2V0IHNvbWUgdGltZQorICAgICAgICAgKi8KKyAgICAgICAgQWRwX2RlbGF5KDEwMDAwMCk7CisKKyAgICAgICAgLyogZG8gbGluayBjaGVjayAqLworICAgICAgICBtc2dzZW5kKCBDSV9IQk9PVCwgIiV3JXcldyV3IiwgQURQX0xpbmtDaGVjayB8IEh0b1QsIDAsCisgICAgICAgICAgICAgICAgIEFEUF9IYW5kbGVVbmtub3duLCBBRFBfSGFuZGxlVW5rbm93biApOworI2lmZGVmIERFQlVHCisgICAgICAgIGFuZ2VsX0RlYnVnUHJpbnQoInNlbnQgbGluayBjaGVja1xuIik7CisjZW5kaWYKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBBZHBfQXN5bmNocm9ub3VzUHJvY2Vzc2luZyhhc3luY19ibG9ja19vbl9yZWFkKTsKKyAgICAgICAgfSB3aGlsZSAoICEgbl9zdGF0ZS5saW5rX2NoZWNrX3Jlc3AgKTsKKyAgICAgICAgQWRwX2luaXRTZXEoKTsKKyAgICB9CisgICAgcmV0dXJuIGFkcF9vazsKK30KKworc3RhdGljIGludCBsYXRlX2Jvb3RlZCA9IEZBTFNFOworc3RhdGljIGJvb2wgYXJkaV9oYW5kbGVyX2luc3RhbGxlZCA9IEZBTFNFOworCisjaWZkZWYgX191bml4CitzdGF0aWMgc3RydWN0IHNpZ2FjdGlvbiBvbGRfYWN0aW9uOworI2Vsc2UKK3N0YXRpYyB2b2lkICgqb2xkX2hhbmRsZXIpKCk7CisjZW5kaWYKKworc3RhdGljIGJvb2wgYm9vdF9pbnRlcnJ1cHRlZCA9IEZBTFNFOworCitzdGF0aWMgdm9pZCBhcmRpX3NpZ2ludF9oYW5kbGVyKGludCBzaWcpIHsKKyNpZmRlZiBERUJVRworICAgIGlmIChzaWcgIT0gU0lHSU5UKQorICAgICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkV4cGVjdGluZyBTSUdJTlQgZ290ICVkLlxuIiwgc2lnKTsKKyNlbHNlCisgICAgSUdOT1JFKHNpZyk7CisjZW5kaWYKKyAgICBib290X2ludGVycnVwdGVkID0gVFJVRTsKKyNpZm5kZWYgX191bml4CisgICAgc2lnbmFsKFNJR0lOVCwgYXJkaV9zaWdpbnRfaGFuZGxlcik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgaW5zdGFsbF9hcmRpX2hhbmRsZXIoIHZvaWQgKSB7CisgIGlmICghYXJkaV9oYW5kbGVyX2luc3RhbGxlZCkgeworICAgIC8qIGluc3RhbGwgYSBuZXcgQ3RybC1DIGhhbmRsZXIgc28gd2UgY2FuIGFiYW5kb24gd2FpdGluZyAqLworI2lmZGVmIF9fdW5peAorICAgIHN0cnVjdCBzaWdhY3Rpb24gbmV3X2FjdGlvbjsKKyAgICBzaWdlbXB0eXNldCgmbmV3X2FjdGlvbi5zYV9tYXNrKTsKKyAgICBuZXdfYWN0aW9uLnNhX2hhbmRsZXIgPSBhcmRpX3NpZ2ludF9oYW5kbGVyOworICAgIG5ld19hY3Rpb24uc2FfZmxhZ3MgPSAwOworICAgIHNpZ2FjdGlvbihTSUdJTlQsICZuZXdfYWN0aW9uLCAmb2xkX2FjdGlvbik7CisjZWxzZQorICAgIG9sZF9oYW5kbGVyID0gc2lnbmFsKFNJR0lOVCwgYXJkaV9zaWdpbnRfaGFuZGxlcik7CisjZW5kaWYKKyAgICBhcmRpX2hhbmRsZXJfaW5zdGFsbGVkID0gVFJVRTsKKyAgfQorfQorCitzdGF0aWMgaW50IGFuZ2VsX1JESV9lcnJtZXNzKGNoYXIgKmJ1ZiwgaW50IGJsZW4sIGludCBlcnJudW0pOworCitzdGF0aWMgdm9pZCByZWNlaXZlX3Jlc2V0X2Fja25vd2xlZGdlKFBhY2tldCAqcGFja2V0LCB2b2lkICpzdGF0ZXB0cikgeworICB1bnNpZ25lZCByZWFzb24sIGRlYnVnSUQsIE9TaW5mbzEsIE9TaW5mbzIsIHN0YXR1czsKKyAgSUdOT1JFKHN0YXRlcHRyKTsKKworICB1bnBhY2tfbWVzc2FnZShCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSwgIiV3JXcldyV3JXciLCAmcmVhc29uLCAmZGVidWdJRCwKKyAgICAgICAgICAgICAgICAgJk9TaW5mbzEsICZPU2luZm8yLCAmc3RhdHVzKTsKKyAgaWYgKHJlYXNvbj09KEFEUF9SZXNldCB8IFR0b0gpICYmIHN0YXR1cz09QUJfTk9STUFMX0FDSykgeworI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IFN1Y2Nlc3NmdWxseSByZWNlaXZlZCBub3JtYWwgcmVzZXQgYWNrbm93bGVkZ2VtZW50XG4iKTsKKyAgICBsYXRlX2Jvb3RlZCA9IEZBTFNFOworI2VuZGlmCisgIH0gZWxzZSBpZiAocmVhc29uPT0oQURQX1Jlc2V0IHwgVHRvSCkgJiYgc3RhdHVzPT1BQl9MQVRFX0FDSykgeworICAgIGNoYXIgbGF0ZV9tc2dbQWRwTWVzc0xlbl9MYXRlU3RhcnR1cF07CisgICAgaW50ICBsYXRlX2xlbjsKKyNpZmRlZiBERUJVRworICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBTdWNjZXNzZnVsbHkgcmVjZWl2ZWQgTEFURSByZXNldCBhY2tub3dsZWRnZW1lbnRcbiIpOworI2VuZGlmCisgICAgbGF0ZV9ib290ZWQgPSBUUlVFOworICAgIGluc3RhbGxfYXJkaV9oYW5kbGVyKCk7CisgICAgbGF0ZV9sZW4gPSBhbmdlbF9SRElfZXJybWVzcyhsYXRlX21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkcE1lc3NMZW5fTGF0ZVN0YXJ0dXAsIGFkcF9sYXRlX3N0YXJ0dXApOworICAgIGFuZ2VsX2hvc3RpZi0+d3JpdGUoYW5nZWxfaG9zdGlmLT5ob3N0b3NhcmcsIGxhdGVfbXNnLCBsYXRlX2xlbik7CisgIH0gZWxzZSB7CisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogQmFkIHJlc2V0IGFjazogcmVhc29uPSU4WCwgc3RhdHVzPSU4WFxuIiwgcmVhc29uLCBzdGF0dXMpOworI2VuZGlmCisgIH0KKyAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworfQorCitzdGF0aWMgaW50IGJvb3RlZF9ub3RfcmVjZWl2ZWQ7CitzdGF0aWMgdW5zaWduZWQgaW50IGFuZ2VsX3ZlcnNpb247CitzdGF0aWMgdW5zaWduZWQgaW50IGFkcF92ZXJzaW9uOworc3RhdGljIHVuc2lnbmVkIGludCBhcmNoX2luZm87CitzdGF0aWMgdW5zaWduZWQgaW50IGNwdV9pbmZvOworc3RhdGljIHVuc2lnbmVkIGludCBod19zdGF0dXM7CisKK3N0YXRpYyB2b2lkIHJlY2VpdmVfYm9vdGVkKFBhY2tldCAqcGFja2V0LCB2b2lkICpzdGF0ZXB0cikgeworICB1bnNpZ25lZCByZWFzb24sIGRlYnVnSUQsIE9TaW5mbzEsIE9TaW5mbzIsIGJhbm5lcl9sZW5ndGgsIGJ1ZnNpeiwgbG9uZ3NpejsKKyAgdW5zaWduZWQgaSwgY291bnQ7CisKKyAgSUdOT1JFKHN0YXRlcHRyKTsKKworICBjb3VudCA9IHVucGFja19tZXNzYWdlKEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICIldyV3JXcldyV3JXcldyV3JXcldyV3JXciLAorICAgICAgICAgICAgICAgICAmcmVhc29uLCAmZGVidWdJRCwgJk9TaW5mbzEsICZPU2luZm8yLCAmYnVmc2l6LCAmbG9uZ3NpeiwKKyAgICAgICAgICAgICAgICAgJmFuZ2VsX3ZlcnNpb24sICZhZHBfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgJmFyY2hfaW5mbywgJmNwdV9pbmZvLCAmaHdfc3RhdHVzLCAmYmFubmVyX2xlbmd0aCk7CisgIGlmIChyZWFzb249PShBRFBfQm9vdGVkIHwgVHRvSCkpIHsKKyNpZmRlZiBNT05JVE9SX0RPV05MT0FEX1BBQ0tFVFMKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogU3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIEJvb3RlZFxuIik7CisgICAgYW5nZWxfRGVidWdQcmludCgiICAgICAgIGNwdV9pbmZvPSU4WCwgaHdfc3RhdHVzPSU4WCwgYnVmc2l6PSVkLCBsb25nc2l6PSVkXG4iLAorICAgICAgICAgICBjcHVfaW5mbywgaHdfc3RhdHVzLCBidWZzaXosIGxvbmdzaXopOworI2VuZGlmCisgICAgLyogR2V0IHRoZSBiYW5uZXIgZnJvbSB0aGUgYm9vdGVkIG1lc3NhZ2UgKi8KKyAgICBmb3IgKGk9MDsgaTxiYW5uZXJfbGVuZ3RoOyBpKyspCisgICAgICBhbmdlbF9ob3N0aWYtPndyaXRlYyhhbmdlbF9ob3N0aWYtPmhvc3Rvc2FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpK2NvdW50KVtpXSk7CisKKyAgICBib290ZWRfbm90X3JlY2VpdmVkPTA7CisjaWZuZGVmIE5PX0hFQVJUQkVBVAorICAgIGhlYXJ0YmVhdF9lbmFibGVkID0gVFJVRTsKKyNlbmRpZgorICAgIEFybXNkX0J1ZmZlclNpemUgPSBidWZzaXogKyBDSEFOX0hFQURFUl9TSVpFOworICAgIEFybXNkX0xvbmdCdWZTaXplID0gbG9uZ3NpeiArIENIQU5fSEVBREVSX1NJWkU7CisgIH0gZWxzZSB7CisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogQmFkIEJvb3RlZCBtc2c6IHJlYXNvbj0lOFhcbiIsIHJlYXNvbik7CisjZW5kaWYKKyAgfQorICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7Cit9CisKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIGludCBhbmdlbF9uZWdvdGlhdGVfZGVmYXVsdHMoIHZvaWQgKTsKKworLyogT3BlbiBjb21tdW5pY2F0aW9ucy4gKi8KK2ludCBhbmdlbF9SRElfb3BlbigKKyAgICB1bnNpZ25lZCB0eXBlLCBEYmdfQ29uZmlnQmxvY2sgY29uc3QgKmNvbmZpZywKKyAgICBEYmdfSG9zdG9zSW50ZXJmYWNlIGNvbnN0ICpob3N0aWYsIHN0cnVjdCBEYmdfTUNTdGF0ZSAqZGJnX3N0YXRlKQoreworICBQYWNrZXQgKnBhY2tldDsKKyAgaW50IHN0YXR1cywgcmVhc29uY29kZSwgZGVidWdJRCwgT1NpbmZvMSwgT1NpbmZvMiwgZXJyOworICBQYXJhbWV0ZXJPcHRpb25zICp1c2VyX29wdGlvbnMgPSBOVUxMOworCisgIHRpbWVfdCB0OworCisgIElHTk9SRSggZGJnX3N0YXRlICk7CisKKyAgaWYgKCh0eXBlICYgMSkgPT0gMCkgeworICAgIC8qIGNvbGQgc3RhcnQgKi8KKyAgICBpZiAoaG9zdGlmICE9IE5VTEwpIHsKKyAgICAgIGFuZ2VsX2hvc3RpZiA9IGhvc3RpZjsKKyAgICAgIGVyciA9IEhvc3RTeXNJbml0KGhvc3RpZiwgJmFyZGlfY29tbWFuZGxpbmUsICZoc3RhdGUpOworICAgICAgaWYgKGVyciAhPSBSRElFcnJvcl9Ob0Vycm9yKSB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IEhvc3RTeXNJbml0IGVycm9yICVpXG4iLGVycik7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgIH0KKyAgICB9CisgICAgVGFyZ2V0TG9nSW5pdCgpOworICB9CisKKyNpZmRlZiBERUJVRworICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogQnVmZmVyIGFsbG9jYXRlZCBpbiBhbmdlbF9SRElfb3Blbih0eXBlPSVpKS5cbiIsdHlwZSk7CisjZW5kaWYKKworICBpZiAoKHR5cGUgJiAxKSA9PSAwKSB7CisgICAgLyogY29sZCBzdGFydCAqLworICAgIHVuc2lnbmVkIGVuZGlhbjsKKyAgICBBZHBfSW9jdGwoIERDX0dFVF9VU0VSX1BBUkFNUywgKHZvaWQgKikmdXNlcl9vcHRpb25zICk7CisgICAgaWYgKCB1c2VyX29wdGlvbnMgIT0gTlVMTCApIHsKKyAgICAgIGVyciA9IG5lZ290aWF0ZV9wYXJhbXMoIHVzZXJfb3B0aW9ucyApOworICAgICAgaWYgKGVyciAhPSBhZHBfb2spIHJldHVybiBlcnI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgUGFyYW1ldGVyQ29uZmlnICpkZWZhdWx0X2NvbmZpZyA9IE5VTEw7CisgICAgICBBZHBfSW9jdGwoIERDX0dFVF9ERUZBVUxUX1BBUkFNUywgKHZvaWQgKikmZGVmYXVsdF9jb25maWcgKTsKKyAgICAgIGlmICggZGVmYXVsdF9jb25maWcgIT0gTlVMTCApIHsKKyAgICAgICAgUGFyYW1ldGVyT3B0aW9ucyAqZGVmYXVsdF9vcHRpb25zID0gY29uZmlnX3RvX29wdGlvbnMoZGVmYXVsdF9jb25maWcpOworICAgICAgICBlcnIgPSBuZWdvdGlhdGVfcGFyYW1zKCBkZWZhdWx0X29wdGlvbnMgKTsKKyAgICAgICAgaWYgKGVyciAhPSBhZHBfb2spIHJldHVybiBlcnI7CisgICAgICB9CisgICAgfQorCisgICAgLyogUmVnaXN0ZXIgaGFuZGxlcnMgYmVmb3JlIHNlbmRpbmcgYW55IG1lc3NhZ2VzICovCisgICAgYm9vdGVkX25vdF9yZWNlaXZlZD0xOworICAgIEFkcF9DaGFubmVsUmVnaXN0ZXJSZWFkKENJX0hCT09ULCByZWNlaXZlX3Jlc2V0X2Fja25vd2xlZGdlLCBOVUxMKTsKKyAgICBBZHBfQ2hhbm5lbFJlZ2lzdGVyUmVhZChDSV9UQk9PVCwgcmVjZWl2ZV9ib290ZWQsIE5VTEwpOworICAgIGVuZGlhbiA9IDA7CisgICAgaWYgKGNvbmZpZyE9TlVMTCkgeworICAgICAgaWYgKGNvbmZpZy0+Ynl0ZXNleCAmIFJESVNleF9MaXR0bGUpIGVuZGlhbiB8PSBBRFBfQm9vdEhvc3RGZWF0dXJlX0xpdHRsZUVuZDsKKyAgICAgIGlmIChjb25maWctPmJ5dGVzZXggJiBSRElTZXhfQmlnKSBlbmRpYW4gfD0gQURQX0Jvb3RIb3N0RmVhdHVyZV9CaWdFbmQ7CisgICAgfQorICAgIG1zZ3NlbmQoQ0lfSEJPT1QsIiV3JXcldyV3JXciLCBBRFBfUmVzZXQgfCBIdG9ULCAwLAorICAgICAgICAgICAgQURQX0hhbmRsZVVua25vd24sIEFEUF9IYW5kbGVVbmtub3duLCBlbmRpYW4pOworI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IFRyYW5zbWl0dGVkIFJlc2V0IG1lc3NhZ2UgaW4gYW5nZWxfUkRJX29wZW4uXG4iKTsKKyNlbmRpZgorCisgICAgLyogV2Ugd2lsbCBub3cgZWl0aGVyIGdldCBhbiBhY2tub3dsZWRnZW1lbnQgZm9yIHRoZSBSZXNldCBtZXNzYWdlCisgICAgICogb3IgaWYgdGhlIHRhcmdldCB3YXMgc3RhcnRlZCBhZnRlciB0aGUgaG9zdCwgd2Ugd2lsbCBnZXQgYQorICAgICAqIHJlYm9vdGVkIG1lc3NhZ2UgZmlyc3QuCisgICAgICovCisKKyNpZmRlZiBERUJVRworICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiB3YWl0aW5nIGZvciBhIGJvb3RlZCBtZXNzYWdlXG4iKTsKKyNlbmRpZgorCisgICAgeworICAgICAgYm9vdF9pbnRlcnJ1cHRlZCA9IEZBTFNFOworCisgICAgICBpZiAobGF0ZV9ib290ZWQpCisgICAgICAgIGluc3RhbGxfYXJkaV9oYW5kbGVyKCk7CisKKyAgICAgIHQ9dGltZShOVUxMKTsKKworICAgICAgZG8geworICAgICAgICBBZHBfQXN5bmNocm9ub3VzUHJvY2Vzc2luZyhhc3luY19ibG9ja19vbl9ub3RoaW5nKTsKKyAgICAgICAgaWYgKCh0aW1lKE5VTEwpLXQpID4gQURQX0lOSVRJQUxfVElNRU9VVF9QRVJJT0QgJiYgIWxhdGVfYm9vdGVkKSB7CisgICAgICAgICAgcmV0dXJuIGFkcF90aW1lb3V0X29uX29wZW47CisgICAgICAgIH0KKyAgICAgIH0gd2hpbGUgKGJvb3RlZF9ub3RfcmVjZWl2ZWQgJiYgIWJvb3RfaW50ZXJydXB0ZWQpOworCisgICAgICBpZiAoYXJkaV9oYW5kbGVyX2luc3RhbGxlZCkKKyAgICAgIHsKKyAgICAgICAgLyogdW5pbnN0YWxsIG91ciBDdHJsLUMgaGFuZGxlciAqLworI2lmZGVmIF9fdW5peAorICAgICAgICBzaWdhY3Rpb24oU0lHSU5ULCAmb2xkX2FjdGlvbiwgTlVMTCk7CisjZWxzZQorICAgICAgICBzaWduYWwoU0lHSU5ULCBvbGRfaGFuZGxlcik7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgaWYgKGJvb3RfaW50ZXJydXB0ZWQpIHsKKyAgICAgICAgYW5nZWxfbmVnb3RpYXRlX2RlZmF1bHRzKCk7CisgICAgICAgIHJldHVybiBhZHBfYWJhbmRvbl9ib290X3dhaXQ7CisgICAgICB9CisgICAgfQorCisgICAgYm9vdGVkX25vdF9yZWNlaXZlZD0xOworICAgIEFkcF9DaGFubmVsUmVnaXN0ZXJSZWFkKENJX0hCT09ULCBOVUxMLCBOVUxMKTsKKworICAgIC8qIExlYXZlIHRoZSBib290ZWQgaGFuZGxlciBpbnN0YWxsZWQgKi8KKyAgICBtc2dzZW5kKENJX1RCT09ULCAiJXcldyV3JXcldyIsIEFEUF9Cb290ZWQgfCBIdG9ULCAwLAorICAgICAgICAgICAgQURQX0hhbmRsZVVua25vd24sIEFEUF9IYW5kbGVVbmtub3duLCAwKTsKKyAgICBBZHBfaW5pdFNlcSgpOworI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IFRyYW5zbWl0dGVkIEFEUF9Cb290ZWQgYWNrbm93bGVkZ2VtZW50LlxuIik7CisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IEJvb3Qgc2VxdWVuY2UgY29tcGxldGVkLCBsZWF2aW5nIGFuZ2VsX1JESV9vcGVuLlxuIik7CisjZW5kaWYKKworICAgIHJldHVybiAoaHdfc3RhdHVzICYgQURQX0NQVV9CaWdFbmRpYW4gKT8gUkRJRXJyb3JfQmlnRW5kaWFuIDoKKyAgICAgIFJESUVycm9yX0xpdHRsZUVuZGlhbjsKKyAgfQorICBlbHNlIHsKKyAgICAvKiB3YXJtIHN0YXJ0ICovCisgICAgcmVnaXN0ZXJfZGVidWdfbWVzc2FnZV9oYW5kbGVyKCk7CisKKyAgICBtc2dzZW5kKENJX0hBRFAsICIldyV3JXcldyIsCisgICAgICAgICAgICBBRFBfSW5pdGlhbGlzZUFwcGxpY2F0aW9uIHwgSHRvVCwgMCwKKyAgICAgICAgICAgIEFEUF9IYW5kbGVVbmtub3duLCBBRFBfSGFuZGxlVW5rbm93bik7CisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogVHJhbnNtaXR0ZWQgSW5pdGlhbGlzZSBBcHBsaWNhdGlvblxuIik7CisjZW5kaWYKKyAgICByZWFzb25jb2RlPUFEUF9Jbml0aWFsaXNlQXBwbGljYXRpb24gfCBUdG9IOworICAgIGVyciA9IHdhaXRfZm9yX2RlYnVnX21lc3NhZ2UoJnJlYXNvbmNvZGUsICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMsICZwYWNrZXQpOworICAgIGlmIChlcnIgIT0gUkRJRXJyb3JfTm9FcnJvcikgcmV0dXJuIGVycjsKKyAgICByZXR1cm4gc3RhdHVzOworICB9CisgIHJldHVybiAtMTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tYW5nZWxfUkRJX2Nsb3NlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IGFuZ2VsX25lZ290aWF0ZV9kZWZhdWx0cyggdm9pZCApIHsKKyAgICBpbnQgZXJyID0gYWRwX29rOworICAgIFBhcmFtZXRlckNvbmZpZyAqZGVmYXVsdF9jb25maWcgPSBOVUxMOworICAgIEFkcF9Jb2N0bCggRENfR0VUX0RFRkFVTFRfUEFSQU1TLCAodm9pZCAqKSZkZWZhdWx0X2NvbmZpZyApOworICAgIGlmICggZGVmYXVsdF9jb25maWcgIT0gTlVMTCApIHsKKyAgICAgICAgUGFyYW1ldGVyT3B0aW9ucyAqZGVmYXVsdF9vcHRpb25zID0gY29uZmlnX3RvX29wdGlvbnMoZGVmYXVsdF9jb25maWcpOworICAgICAgICBlcnIgPSBuZWdvdGlhdGVfcGFyYW1zKCBkZWZhdWx0X29wdGlvbnMgKTsKKyAgICAgICAgZnJlZSggZGVmYXVsdF9vcHRpb25zICk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK2ludCBhbmdlbF9SRElfY2xvc2Uodm9pZCkgeworLypBbmdlbCBob3N0IGV4aXQgKi8KKyAgaW50IGVycjsKKyAgaW50IHN0YXR1cyxkZWJ1Z0lELCBPU2luZm8xLE9TaW5mbzI7CisgIGludCByZWFzb247CisgIFBhY2tldCAqcGFja2V0ID0gTlVMTDs7CisjaWZkZWYgREVCVUcKKyAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IEVudGVyZWQgYW5nZWxfUkRJX0Nsb3NlLlxuIik7CisjZW5kaWYKKworICByZWdpc3Rlcl9kZWJ1Z19tZXNzYWdlX2hhbmRsZXIoKTsKKworICBoZWFydGJlYXRfZW5hYmxlZCA9IEZBTFNFOworCisgIGVyciA9IG1zZ3NlbmQoQ0lfSEFEUCwiJXcldyV3JXciLEFEUF9FbmQgfCBIdG9ULDAsCisgICAgICAgICAgQURQX0hhbmRsZVVua25vd24sIEFEUF9IYW5kbGVVbmtub3duKTsKKyAgaWYgKGVyciAhPSBSRElFcnJvcl9Ob0Vycm9yKSByZXR1cm4gZXJyOworICByZWFzb24gPSBBRFBfRW5kIHwgVHRvSDsKKyAgZXJyID0gIHdhaXRfZm9yX2RlYnVnX21lc3NhZ2UoJnJlYXNvbiwgJmRlYnVnSUQsICZPU2luZm8xLCAmT1NpbmZvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzLCAmcGFja2V0KTsKKyAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICBpZiAoZXJyICE9IFJESUVycm9yX05vRXJyb3IpIHJldHVybiBlcnI7CisgIGlmIChzdGF0dXMgPT0gUkRJRXJyb3JfTm9FcnJvcikgeworICAgIGVyciA9IGFuZ2VsX25lZ290aWF0ZV9kZWZhdWx0cygpOworICAgIGlmIChlcnIgIT0gYWRwX29rKSByZXR1cm4gZXJyOworICAgIEFkcF9Jb2N0bCggRENfUkVTRVQsIE5VTEwgKTsgLyoganVzdCB0byBiZSBzYWZlICovCisgICAgcmV0dXJuIEhvc3RTeXNFeGl0KGhzdGF0ZSk7CisgIH0KKyAgZWxzZQorICAgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tYW5nZWxfUkRJX3JlYWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBSZWFkIG1lbW9yeSBjb250ZW50cyBmcm9tIHRhcmdldCB0byBob3N0OiB1c2UgQURQX1JlYWQgKi8KK2ludCBhbmdlbF9SRElfcmVhZChBUk13b3JkIHNvdXJjZSwgdm9pZCAqZGVzdCwgdW5zaWduZWQgKm5ieXRlcykKK3sKKyAgUGFja2V0ICpwYWNrZXQ9TlVMTDsKKyAgaW50IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW50ZWdlciB0byBob2xkIG1lc3NhZ2UgbGVuZ3RoLiAqLworICB1bnNpZ25lZCBpbnQgbmJ0b2dvID0gKm5ieXRlcywgbmJpbnBhY2tldCwgbmJkb25lPTA7CisgIGludCBybmJ5dGVzID0gMCwgc3RhdHVzLCByZWFzb24sIGRlYnVnSUQsIE9TaW5mbzEsIE9TaW5mbzIsIGVycjsKKyAgdW5zaWduZWQgaW50IG1heGxlbiA9IEFybXNkX0J1ZmZlclNpemUtQ0hBTl9IRUFERVJfU0laRS1BRFBfUmVhZEhlYWRlclNpemU7CisKKyAgLyogUHJpbnQgZGVidWcgdHJhY2UgaW5mb3JtYXRpb24sIHRoaXMgaXMganVzdCBjb3BpZWQgc3RyYWlnaHQgZnJvbSByZGkuYworICAgICBhbmQgSSBjYW4gc2VlIG5vIHJlYXNvbiB3aHkgaXQgc2hvdWxkIGhhdmUgdG8gYmUgY2hhbmdlZC4gKi8KKyAgVHJhY2VQcmludCgoImFuZ2VsX1JESV9yZWFkOiBzb3VyY2U9JS44bHggZGVzdD0lcCBuYnl0ZXM9JS44eFxuIiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylzb3VyY2UsIGRlc3QsICpuYnl0ZXMpKTsKKyAgaWYgKCpuYnl0ZXMgPT0gMCkgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7ICAgICAgIC8qIFJlYWQgbm90aGluZyAtIGVhc3khICovCisgIC8qIGNoZWNrIHRoZSBidWZmZXIgc2l6ZSAqLworICB3aGlsZSAobmJ0b2dvID4wKSB7CisgICAgcmVnaXN0ZXJfZGVidWdfbWVzc2FnZV9oYW5kbGVyKCk7CisKKyAgICBuYmlucGFja2V0ID0gKG5idG9nbyA8PSBtYXhsZW4pID8gbmJ0b2dvIDogbWF4bGVuOworICAgIGxlbiA9IG1zZ3NlbmQoQ0lfSEFEUCwgIiV3JXcldyV3JXcldyIsIEFEUF9SZWFkIHwgSHRvVCwgMCwKKyAgICAgICAgICAgICAgICAgIEFEUF9IYW5kbGVVbmtub3duLCBBRFBfSGFuZGxlVW5rbm93biwgc291cmNlK25iZG9uZSwKKyAgICAgICAgICAgICAgICAgIG5iaW5wYWNrZXQpOworICAgIHJlYXNvbj1BRFBfUmVhZCB8IFR0b0g7CisgICAgZXJyID0gd2FpdF9mb3JfZGVidWdfbWVzc2FnZSgmcmVhc29uLCAmZGVidWdJRCwgJk9TaW5mbzEsICZPU2luZm8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzLCAmcGFja2V0KTsKKyAgICBUcmFjZVByaW50KCgiYW5nZWxfUkRJX3JlYWQ6IG5iaW5wYWNrZXQgPSVkIHN0YXR1cz0lMDh4IGVyciA9ICVkXG4iLAorICAgICAgICAgICAgICAgIG5iaW5wYWNrZXQsc3RhdHVzLGVycikpOworICAgIGlmIChlcnIgIT0gUkRJRXJyb3JfTm9FcnJvcikgcmV0dXJuIGVycjsgICAgICAgLyogV2FzIHRoZXJlIGFuIGVycm9yPyAqLworICAgIGlmIChzdGF0dXMgPT0gUkRJRXJyb3JfTm9FcnJvcil7CisgICAgICBybmJ5dGVzICs9IFBSRUFEKExFLCh1bnNpZ25lZCBpbnQgKikoQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlcikrMjApKTsKKyAgICAgIFRyYWNlUHJpbnQoKCJhbmdlbF9SRElfcmVhZDogcm5ieXRlcyA9ICVkXG4iLHJuYnl0ZXMpKTsKKyAgICAgIG1lbWNweSgoKHVuc2lnbmVkIGNoYXIgKilkZXN0KStuYmRvbmUsIEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpKzI0LAorICAgICAgICAgICAgIG5iaW5wYWNrZXQpOworICAgIH0KKyAgICBuYmRvbmUgKz0gbmJpbnBhY2tldDsKKyAgICBuYnRvZ28gLT0gbmJpbnBhY2tldDsKKyAgfQorICAqbmJ5dGVzIC09IHJuYnl0ZXM7CisgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLWFuZ2VsX1JESV93cml0ZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVHJhbnNmZXIgbWVtb3J5IGJsb2NrIGZyb20gaG9zdCB0byB0YXJnZXQuICBVc2UgQURQX1dyaXRlPi4gKi8KK2ludCBhbmdlbF9SRElfd3JpdGUoY29uc3Qgdm9pZCAqc291cmNlLCBBUk13b3JkIGRlc3QsIHVuc2lnbmVkICpuYnl0ZXMpCit7CisgIFBhY2tldCAqcGFja2V0Oy8qIE1lc3NhZ2UgYnVmZmVycy4gKi8KKyAgdW5zaWduZWQgaW50IGxlbiwgbmJ0b2dvID0gKm5ieXRlcywgbmJvZmZzZXQgPSAwLCBuYmlucGFja2V0OworICBpbnQgc3RhdHVzLCByZWFzb24sIGRlYnVnSUQsIE9TaW5mbzEsIE9TaW5mbzIsIGVycjsKKyAgdW5zaWduZWQgaW50IG1heGxlbiA9IEFybXNkX0xvbmdCdWZTaXplLUNIQU5fSEVBREVSX1NJWkUtQURQX1dyaXRlSGVhZGVyU2l6ZTsKKworICBUcmFjZVByaW50KCgiYW5nZWxfUkRJX3dyaXRlOiBzb3VyY2U9JXAgZGVzdD0lLjhseCBuYnl0ZXM9JS44eFxuIiwKKyAgICAgICAgICAgICAgICAgc291cmNlLCAodW5zaWduZWQgbG9uZylkZXN0LCAqbmJ5dGVzKSk7CisKKyAgaWYgKCpuYnl0ZXMgPT0gMCkgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7CisKKyAgKm5ieXRlcyA9IDA7CisgIHdoaWxlIChuYnRvZ28gPiAwKSB7CisgICAgcGFja2V0ID0gKFBhY2tldCAqKSBEZXZTV19BbGxvY2F0ZVBhY2tldChBcm1zZF9Mb25nQnVmU2l6ZSk7CisgICAgbmJpbnBhY2tldCA9IChuYnRvZ28gPD0gbWF4bGVuKSA/IG5idG9nbyA6IG1heGxlbjsKKyAgICBsZW4gPSBtc2didWlsZChCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSwgIiV3JXcldyV3JXcldyIsCisgICAgICAgICAgICAgICAgICAgQURQX1dyaXRlIHwgSHRvVCwgMCwgQURQX0hhbmRsZVVua25vd24sCisgICAgICAgICAgICAgICAgICAgQURQX0hhbmRsZVVua25vd24sIGRlc3QrbmJvZmZzZXQsIG5iaW5wYWNrZXQpOworICAgIC8qIENvcHkgdGhlIGRhdGEgaW50byB0aGUgcGFja2V0LiAqLworCisgICAgbWVtY3B5KEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpK2xlbiwKKyAgICAgICAgICAgKChjb25zdCB1bnNpZ25lZCBjaGFyICopIHNvdXJjZSkrbmJvZmZzZXQsIG5iaW5wYWNrZXQpOworICAgIG5ib2Zmc2V0ICs9IG5iaW5wYWNrZXQ7CisgICAgcGFja2V0LT5wa19sZW5ndGggPSBuYmlucGFja2V0K2xlbjsKKworI2lmZGVmIE1PTklUT1JfRE9XTkxPQURfUEFDS0VUUworICAgIGFuZ2VsX0RlYnVnUHJpbnQoImFuZ2VsX1JESV93cml0ZSBwYWNrZXQgc2l6ZT0laSwgYnl0ZXMgZG9uZT0laVxuIiwKKyAgICAgICAgICAgIG5iaW5wYWNrZXQsIG5ib2Zmc2V0KTsKKyNlbmRpZgorCisgICAgcmVnaXN0ZXJfZGVidWdfbWVzc2FnZV9oYW5kbGVyKCk7CisgICAgQWRwX0NoYW5uZWxXcml0ZShDSV9IQURQLCBwYWNrZXQpOworICAgIHJlYXNvbj1BRFBfV3JpdGUgfCBUdG9IOworICAgIGVyciA9IHdhaXRfZm9yX2RlYnVnX21lc3NhZ2UoJnJlYXNvbiwgJmRlYnVnSUQsICZPU2luZm8xLCAmT1NpbmZvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywgJnBhY2tldCk7CisgICAgbmJ0b2dvIC09IG5iaW5wYWNrZXQ7CisgICAgaWYgKGVyciAhPSBSRElFcnJvcl9Ob0Vycm9yKSByZXR1cm4gZXJyOworICAgIGlmIChzdGF0dXMgPT0gUkRJRXJyb3JfTm9FcnJvcikKKyAgICAgICpuYnl0ZXMgKz0gbmJpbnBhY2tldDsKKworICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS1hbmdlbF9SRElfQ1BVcmVhZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFJlYWRzIHRoZSB2YWx1ZXMgb2YgcmVnaXN0ZXJzIGluIHRoZSBDUFUsIHVzZXMgQURQX0NQVXdyaXRlLiAqLworaW50IGFuZ2VsX1JESV9DUFVyZWFkKHVuc2lnbmVkIG1vZGUsIHVuc2lnbmVkIGxvbmcgbWFzaywgQVJNd29yZCAqYnVmZmVyKQoreworICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgUGFja2V0ICpwYWNrZXQgPSBOVUxMOworICBpbnQgZXJyLCBzdGF0dXMsIHJlYXNvbiwgZGVidWdJRCwgT1NpbmZvMSwgT1NpbmZvMjsKKyNpZmRlZiBERUJVRworICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogRW50ZXJlZCBhbmdlbF9SRElfQ1BVcmVhZC5cbiIpOworI2VuZGlmCisgIGZvciAoaT0wLCBqPTAgOyBpIDwgUkRJTnVtQ1BVUmVncyA7IGkrKykKKyAgICBpZiAobWFzayAmICgxTCA8PCBpKSkgaisrOyAgICAgICAgICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzLiAqLworCisgIHJlZ2lzdGVyX2RlYnVnX21lc3NhZ2VfaGFuZGxlcigpOworICBtc2dzZW5kKENJX0hBRFAsICIldyV3JXcldyVjJXciLCBBRFBfQ1BVcmVhZCB8IEh0b1QsIDAsCisgICAgICAgICAgQURQX0hhbmRsZVVua25vd24sIEFEUF9IYW5kbGVVbmtub3duLCBtb2RlLCBtYXNrKTsKKyAgcmVhc29uID0gQURQX0NQVXJlYWQgfCBUdG9IOworICBlcnIgPSB3YWl0X2Zvcl9kZWJ1Z19tZXNzYWdlKCZyZWFzb24sICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzLCAmcGFja2V0KTsKKyAgaWYgKGVyciAhPSBSRElFcnJvcl9Ob0Vycm9yKSB7CisgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICAgIHJldHVybiBlcnI7CisgIH0KKyAgaWYoc3RhdHVzID09IFJESUVycm9yX05vRXJyb3IpIHsKKyAgICBmb3IgKGk9MDsgaTxqOyBpKyspCisgICAgICBidWZmZXJbaV0gPSBHRVQzMkxFKEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpKzIwKyhpKjQpKTsKKyAgICBUcmFjZVByaW50KCgiYW5nZWxfUkRJX0NQVXJlYWQ6IG1vZGU9JS44eCBtYXNrPSUuOGx4IiwgbW9kZSwgbWFzaykpOworICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyNpZmRlZiBSRElfVkVSQk9TRQorICAgIGlmIChyZGlfbG9nICYgMSkgeworICAgICAgdW5zaWduZWQgazsKKyAgICAgIGZvciAoayA9IDAsIGogPSAwIDsgaiA8PSAyMCA7IGorKykKKyAgICAgICAgaWYgKG1hc2sgJiAoMUwgPDwgaikpIHsKKyAgICAgICAgICBhbmdlbF9EZWJ1Z1ByaW50KCIlYyUuOGx4IixrJTQ9PTA/J1xuJzonICcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylidWZmZXJba10pOworICAgICAgICAgIGsrKyA7CisgICAgICAgIH0KKyAgICAgIGFuZ2VsX0RlYnVnUHJpbnQoIlxuIikgOworICAgIH0KKyNlbmRpZgorCisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLWFuZ2VsX1JESV9DUFV3cml0ZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogV3JpdGUgQ1BVIHJlZ2lzdGVyczogdXNlIEFEUF9DUFV3cml0ZS4gKi8KK2ludCBhbmdlbF9SRElfQ1BVd3JpdGUodW5zaWduZWQgbW9kZSwgdW5zaWduZWQgbG9uZyBtYXNrLAorICAgICAgICAgICAgICAgICAgICAgIEFSTXdvcmQgY29uc3QgKmJ1ZmZlcil7CisKKyAgdW5zaWduZWQgaSwgaiwgYzsKKyAgUGFja2V0ICpwYWNrZXQ7CisgIGludCBzdGF0dXMsIHJlYXNvbiwgZGVidWdJRCwgT1NpbmZvMSwgT1NpbmZvMiwgZXJyLCBsZW47CisKKyAgVHJhY2VQcmludCgoImFuZ2VsX1JESV9DUFV3cml0ZTogbW9kZT0lLjh4IG1hc2s9JS44bHgiLCBtb2RlLCBtYXNrKSk7CisjaWZkZWYgUkRJX1ZFUkJPU0UKKyBpZiAocmRpX2xvZyAmIDEpIHsKKyAgICBmb3IgKGogPSAwLCBpID0gMCA7IGkgPD0gMjAgOyBpKyspCisgICAgICAgaWYgKG1hc2sgJiAoMUwgPDwgaSkpIHsKKyAgICAgICAgICBhbmdlbF9EZWJ1Z1ByaW50KCIlYyUuOGx4IixqJTQ9PTA/J1xuJzonICcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylidWZmZXJbal0pOworICAgICAgICAgIGorKyA7CisgICAgICAgICAgfQorICAgIGFuZ2VsX0RlYnVnUHJpbnQoIlxuIikgOworICAgIH0KKyNlbmRpZgorIHBhY2tldCA9IChQYWNrZXQgKilEZXZTV19BbGxvY2F0ZVBhY2tldChBcm1zZF9CdWZmZXJTaXplKTsKKyBmb3IgKGk9MCwgaj0wOyBpIDwgUkRJTnVtQ1BVUmVncyA7IGkrKykKKyAgIGlmIChtYXNrICYgKDFMIDw8IGkpKSBqKys7IC8qIGNvdW50IHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzICovCisKKyBsZW4gPSBtc2didWlsZChCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSwgIiV3JXcldyV3JWIldyIsCisgICAgICAgICAgICAgICAgQURQX0NQVXdyaXRlIHwgSHRvVCwgMCwKKyAgICAgICAgICAgICAgICBBRFBfSGFuZGxlVW5rbm93biwgQURQX0hhbmRsZVVua25vd24sIG1vZGUsIG1hc2spOworIGZvcihjPTA7IGM8ajsgYysrKQorICAgUFVUMzJMRShCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKStsZW4rKGMqNCksIGJ1ZmZlcltjXSk7CisgcGFja2V0LT5wa19sZW5ndGggPSBsZW4rKGoqNCk7CisgcmVnaXN0ZXJfZGVidWdfbWVzc2FnZV9oYW5kbGVyKCk7CisKKyBBZHBfQ2hhbm5lbFdyaXRlKENJX0hBRFAsIHBhY2tldCk7CisgcmVhc29uID0gQURQX0NQVXdyaXRlIHwgVHRvSDsKKyBlcnIgPSB3YWl0X2Zvcl9kZWJ1Z19tZXNzYWdlKCZyZWFzb24sICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMsICZwYWNrZXQpOworIHVucGFja19tZXNzYWdlKEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpLCAiJXcldyV3JXcldyIsICZyZWFzb24sICZkZWJ1Z0lELAorICAgICAgICAgICAgICAgICZPU2luZm8xLCAmT1NpbmZvMiwgJnN0YXR1cyk7CisgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworIGlmIChlcnIgIT0gUkRJRXJyb3JfTm9FcnJvcikKKyAgIHJldHVybiBlcnI7ICAgICAgLyogV2FzIHRoZXJlIGFuIGVycm9yPyAqLworIGVsc2UKKyAgIHJldHVybiBzdGF0dXM7CisgfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS1hbmdlbF9SRElfQ1ByZWFkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFJlYWQgY29wcm9jZXNzb3IncyBpbnRlcm5hbCBzdGF0ZS4gIFNlZSBkYmdfY3AuaCBmb3IgaGVscC4KKyAqIFVzZSBBRFBfQ1BSZWFkLgorICogSXQgd291bGQgYXBwZWFyIHRoYXQgdGhlIGNvcnJlY3QgYmVoYXZpb3VyIGF0IHRoaXMgcG9pbnQgaXMgdG8gbGVhdmUKKyAqIHRoZSB1bnBhY2tpbmcgdG8gYSB0aGUgY2FsbGVyIGFuZCB0byBzaW1wbHkgY29weSB0aGUgc3RyZWFtIG9mIGRhdGEKKyAqIHdvcmRzIGludG8gdGhlIGJ1ZmZlcgorICovCisKK2ludCBhbmdlbF9SRElfQ1ByZWFkKHVuc2lnbmVkIENQbnVtLCB1bnNpZ25lZCBsb25nIG1hc2ssIEFSTXdvcmQgKmJ1ZmZlcil7CisgIFBhY2tldCAqcGFja2V0ID0gTlVMTDsKKyAgaW50IGksIGosIHN0YXR1cywgcmVhc29uY29kZSwgT1NpbmZvMSwgT1NpbmZvMiwgZXJyLCBkZWJ1Z0lEOworICB1bnNpZ25lZCBjaGFyICpybWFwID0gY3B3b3Jkc1tDUG51bV07CisgIGludCBuOworI2lmZGVmIERFQlVHCisgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBFbnRlcmVkIGFuZ2VsX1JESV9DUHJlYWQuXG4iKTsKKyNlbmRpZgorICBpZiAocm1hcCA9PSBOVUxMKSByZXR1cm4gUkRJRXJyb3JfVW5rbm93bkNvUHJvOworCisgIHJlZ2lzdGVyX2RlYnVnX21lc3NhZ2VfaGFuZGxlcigpOworICBuID0gcm1hcFstMV07CisgIG1zZ3NlbmQoQ0lfSEFEUCwgIiV3JXcldyV3JWIldyIsIEFEUF9DUHJlYWQgfCBIdG9ULCAwLAorICAgICAgICAgIEFEUF9IYW5kbGVVbmtub3duLCBBRFBfSGFuZGxlVW5rbm93biwgQ1BudW0sIG1hc2spOworICByZWFzb25jb2RlPUFEUF9DUHJlYWQgfCBUdG9IOworICBlcnIgPSB3YWl0X2Zvcl9kZWJ1Z19tZXNzYWdlKCZyZWFzb25jb2RlLCAmZGVidWdJRCwgJk9TaW5mbzEsICZPU2luZm8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywgJnBhY2tldCk7CisgIGlmIChlcnIgIT0gUkRJRXJyb3JfTm9FcnJvcikgeworICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgICByZXR1cm4gZXJyOyAgICAgICAgICAvKiBXYXMgdGhlcmUgYW4gZXJyb3I/ICovCisgIH0KKyAgZm9yIChqPWk9MDsgaSA8IG4gOyBpKyspIC8qIGNvdW50IHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzICovCisgICAgaWYgKG1hc2sgJiAoMUwgPDwgaSkpIHsKKyAgICAgIGorKzsKKyAgICB9CisgIGZvciAoaT0wOyBpPGo7IGkrKykKKyAgICBidWZmZXJbaV0gPSBQUkVBRDMyKExFLCBCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSArIDIwICsgKGkqNCkpOworICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgIFRyYWNlUHJpbnQoKCJhbmdlbF9SRElfQ1ByZWFkOiBDUG51bT0lLjh4IG1hc2s9JS44bHhcbiIsIENQbnVtLCBtYXNrKSk7CisjaWZkZWYgUkRJX1ZFUkJPU0UKKyAgaWYgKHJkaV9sb2cgJiAxKSB7CisgICAgZm9yIChpID0gMCwgaiA9IDA7IGogPCBuIDsgaisrKSB7CisgICAgICBpZiAobWFzayAmICgxTCA8PCBqKSkgeworICAgICAgICBpbnQgbncgPSBybWFwW2pdOworICAgICAgICBhbmdlbF9EZWJ1Z1ByaW50KCIlMmQgIiwgaik7CisgICAgICAgIHdoaWxlICgtLW53ID4gMCkKKyAgICAgICAgICBhbmdlbF9EZWJ1Z1ByaW50KCIlLjhseCAiLCAodW5zaWduZWQgbG9uZylidWZmZXJbaSsrXSk7CisgICAgICAgIGFuZ2VsX0RlYnVnUHJpbnQoIiUuOGx4XG4iLCAodW5zaWduZWQgbG9uZylidWZmZXJbaSsrXSk7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tYW5nZWxfUkRJX0NQd3JpdGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBXcml0ZSBjb3Byb2Nlc3NvcidzIGludGVybmFsIHN0YXRlLiAgU2VlIGRiZ19jcC5oIGZvciBoZWxwLiBVc2UKKyAqIEFEUF9DUHdyaXRlLgorICovCisKK2ludCBhbmdlbF9SRElfQ1B3cml0ZSh1bnNpZ25lZCBDUG51bSwgdW5zaWduZWQgbG9uZyBtYXNrLAorICAgICAgICAgICAgICAgICAgICAgIEFSTXdvcmQgY29uc3QgKmJ1ZmZlcikKK3sKKyAgUGFja2V0ICpwYWNrZXQgPSBOVUxMOworICBpbnQgaSwgaiwgbGVuLCBzdGF0dXMsIHJlYXNvbiwgT1NpbmZvMSwgT1NpbmZvMiwgZXJyLCBkZWJ1Z0lEOworICB1bnNpZ25lZCBjaGFyICpybWFwID0gY3B3b3Jkc1tDUG51bV07CisgIGludCBuOworCisgIGlmIChybWFwID09IE5VTEwpIHJldHVybiBSRElFcnJvcl9Vbmtub3duQ29Qcm87CisgIG4gPSBybWFwWy0xXTsKKworICBUcmFjZVByaW50KCgiYW5nZWxfUkRJX0NQd3JpdGU6IENQbnVtPSVkIG1hc2s9JS44bHhcbiIsIENQbnVtLCBtYXNrKSk7CisKKyNpZmRlZiBSRElfVkVSQk9TRQorIGlmIChyZGlfbG9nICYgMSkgeworICAgIGZvciAoaSA9IDAsIGogPSAwOyBqIDwgbiA7IGorKykKKyAgICAgICBpZiAobWFzayAmICgxTCA8PCBqKSkgeworICAgICAgICAgIGludCBudyA9IHJtYXBbal07CisgICAgICAgICAgYW5nZWxfRGVidWdQcmludCgiJTJkICIsIGopOworICAgICAgICAgIHdoaWxlICgtLW53ID4gMCkKKyAgICAgICAgICAgICBhbmdlbF9EZWJ1Z1ByaW50KCIlLjhseCAiLCAodW5zaWduZWQgbG9uZylidWZmZXJbaSsrXSk7CisgICAgICAgICAgYW5nZWxfRGVidWdQcmludCgiJS44bHhcbiIsICh1bnNpZ25lZCBsb25nKWJ1ZmZlcltpKytdKTsKKyAgICAgICB9CisgfQorI2VuZGlmCisKKyAgZm9yIChqPWk9MDsgaSA8IG4gOyBpKyspIC8qIENvdW50IHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzLiAqLworICAgIGlmIChtYXNrICYgKDFMIDw8IGkpKSBqKys7CisgIHBhY2tldCA9IERldlNXX0FsbG9jYXRlUGFja2V0KEFybXNkX0J1ZmZlclNpemUpOworICBsZW4gPSBtc2didWlsZChCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSwgIiV3JXcldyV3JWMldyIsCisgICAgICAgICAgICAgICAgIEFEUF9DUHdyaXRlIHwgSHRvVCwgMCwKKyAgICAgICAgICAgICAgICAgQURQX0hhbmRsZVVua25vd24sIEFEUF9IYW5kbGVVbmtub3duLCBDUG51bSwgbWFzayk7CisgIGZvcihpPTA7ICBpPGo7IGkrKykKKyAgICBsZW4rPW1zZ2J1aWxkKEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpICsgbGVuLCAiJXciLCBidWZmZXJbaV0pOworICBwYWNrZXQtPnBrX2xlbmd0aCA9IGxlbjsKKyAgcmVnaXN0ZXJfZGVidWdfbWVzc2FnZV9oYW5kbGVyKCk7CisgIEFkcF9DaGFubmVsV3JpdGUoQ0lfSEFEUCwgcGFja2V0KTsgICAgLyogVHJhbnNtaXQgbWVzc2FnZS4gKi8KKyAgcmVhc29uPUFEUF9DUHdyaXRlIHwgVHRvSDsKKyAgZXJyID0gd2FpdF9mb3JfZGVidWdfbWVzc2FnZSgmcmVhc29uLCAmZGVidWdJRCwgJk9TaW5mbzEsICZPU2luZm8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywgJnBhY2tldCk7CisgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgaWYgKGVyciAhPSBSRElFcnJvcl9Ob0Vycm9yKQorICAgIHJldHVybiBlcnI7CisgIGVsc2UKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS1hbmdlbF9SRElfcG9pbnRpbnEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIERvIHRlc3QgY2FsbHMgdG8gQURQX1NldEJyZWFrL0FEUF9TZXRXYXRjaCB0byBzZWUgaWYgcmVzb3VyY2VzIGV4aXN0IHRvCisgICBjYXJyeSBvdXQgcmVxdWVzdC4gKi8KK2ludCBhbmdlbF9SRElfcG9pbnRpbnEoQVJNd29yZCAqYWRkcmVzcywgdW5zaWduZWQgdHlwZSwgdW5zaWduZWQgZGF0YXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIEFSTXdvcmQgKmJvdW5kKQoreworICBQYWNrZXQgKnBhY2tldCA9IE5VTEw7CisgIGludCBsZW4sIHN0YXR1cywgcmVhc29uLCBPU2luZm8xLCBPU2luZm8yLCBlcnI9UkRJRXJyb3JfTm9FcnJvcjsKKyAgICAgICAvKiBzdG9wIGEgY29tcGlsZXIgd2FybmluZyAqLworICBpbnQgZGVidWdJRCwgcG9pbnRoYW5kbGU7CisgIFRyYWNlUHJpbnQoCisgICAgICAoImFuZ2VsX1JESV9wb2ludGlucTogYWRkcmVzcz0lLjhseCB0eXBlPSVkIGRhdGF0eXBlPSVkIGJvdW5kPSUuOGx4ICIsCisgICAgICAodW5zaWduZWQgbG9uZykqYWRkcmVzcywgdHlwZSwgZGF0YXR5cGUsICh1bnNpZ25lZCBsb25nKSpib3VuZCkpOworICAgICAgIC8qIGZvciBhIGJ1ZmZlci4gICovCisgIHBhY2tldCA9IERldlNXX0FsbG9jYXRlUGFja2V0KEFybXNkX0J1ZmZlclNpemUpOworICBsZW4gPSBtc2didWlsZChCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSwgIiV3JXcldyV3JXclYiIsCisgICAgICAgICAgICAgICAgICgoZGF0YXR5cGUgPT0gMCkgPyBBRFBfU2V0QnJlYWsgOiBBRFBfU2V0V2F0Y2gpIHwgSHRvVCwgMCwKKyAgICAgICAgICAgICAgICAgQURQX0hhbmRsZVVua25vd24sIEFEUF9IYW5kbGVVbmtub3duLCBhZGRyZXNzLCB0eXBlKTsKKyAgaWYgKGRhdGF0eXBlID09IDApCisgICAgbGVuICs9IG1zZ2J1aWxkKEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpICsgMjEsICIldyIsIGJvdW5kKTsKKyAgZWxzZQorICAgIGxlbiArPSBtc2didWlsZChCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSArIDIxLCAiJWIldyIsIGRhdGF0eXBlLCBib3VuZCk7CisKKyAgcmVnaXN0ZXJfZGVidWdfbWVzc2FnZV9oYW5kbGVyKCk7CisgIHBhY2tldC0+cGtfbGVuZ3RoID0gbGVuOworICBBZHBfQ2hhbm5lbFdyaXRlKENJX0hBRFAsIHBhY2tldCk7CisgIHJlYXNvbiA9ICgoZGF0YXR5cGUgPT0gMCkgPyBBRFBfU2V0QnJlYWsgOiBBRFBfU2V0V2F0Y2ggfCBUdG9IKTsKKyAgZXJyID0gd2FpdF9mb3JfZGVidWdfbWVzc2FnZSgmcmVhc29uLCAmZGVidWdJRCwgJk9TaW5mbzEsICZPU2luZm8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywgJnBhY2tldCk7CisgIGlmIChlcnIgIT0gUkRJRXJyb3JfTm9FcnJvcikgeworICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgICByZXR1cm4gZXJyOyAgICAgICAgLyogV2FzIHRoZXJlIGFuIGVycm9yPyAqLworICB9CisgIHVucGFja19tZXNzYWdlKEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpLCAiJXcldyV3JXcldyV3JXcldyIsCisgICAgICAgICAgICAgICAgICZyZWFzb24sICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIsICZzdGF0dXMsCisgICAgICAgICAgICAgICAgICZwb2ludGhhbmRsZSwgJmFkZHJlc3MsICZib3VuZCk7CisgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgcmV0dXJuIGVycjsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tYW5nZWxfUkRJX3NldGJyZWFrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTZXQgYSBicmVha3BvaW50OiBVc2UgQURQX1NldEJyZWFrICovCitpbnQgYW5nZWxfUkRJX3NldGJyZWFrKEFSTXdvcmQgYWRkcmVzcywgdW5zaWduZWQgdHlwZSwgQVJNd29yZCBib3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICBQb2ludEhhbmRsZSAqaGFuZGxlKQoreworICBpbnQgc3RhdHVzLCByZWFzb24sIE9TaW5mbzEsIE9TaW5mbzIsIGVyciwgZGVidWdJRDsKKyAgaW50IHRtcHZhbCwgdG1wYWRkciwgdG1wYm5kOworICBQYWNrZXQgKnBhY2tldDsKKyAgVHJhY2VQcmludCgoImFuZ2VsX1JESV9zZXRicmVhayBhZGRyZXNzPSUuOGx4IHR5cGU9JWQgYm91bmQ9JS44bHggXG4iLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylhZGRyZXNzLCB0eXBlLCAodW5zaWduZWQgbG9uZylib3VuZCkpOworCisgIHJlZ2lzdGVyX2RlYnVnX21lc3NhZ2VfaGFuZGxlcigpOworICBtc2dzZW5kKENJX0hBRFAsICIldyV3JXcldyV3JWIldyIsCisgICAgICAgICAgQURQX1NldEJyZWFrfCBIdG9ULCAwLCAgQURQX0hhbmRsZVVua25vd24sCisgICAgICAgICAgQURQX0hhbmRsZVVua25vd24sIGFkZHJlc3MsIHR5cGUsIGJvdW5kKTsKKyAgcmVhc29uID0gQURQX1NldEJyZWFrIHxUdG9IOworICBlcnIgPSB3YWl0X2Zvcl9kZWJ1Z19tZXNzYWdlKCZyZWFzb24sICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzLCAmcGFja2V0KTsKKyAgaWYgKGVyciAhPSBSRElFcnJvcl9Ob0Vycm9yKSB7CisgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICAgIHJldHVybiBlcnI7ICAgICAgICAgLyogV2FzIHRoZXJlIGFuIGVycm9yPyAqLworICB9CisgIC8qIFdvcmsgYXJvdW5kIHZhcmFyZ3MgcHJvYmxlbS4uLiAtc3RzICovCisgIHVucGFja19tZXNzYWdlKEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpLCAiJXcldyV3JXcldyV3JXcldyIsCisgICAgICAgICAgICAgICAgICZyZWFzb24sICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIsICZzdGF0dXMsCisgICAgICAgICAgICAgICAgICZ0bXB2YWwsICZ0bXBhZGRyLCAmdG1wYm5kKTsKKyAgKmhhbmRsZSA9IHRtcHZhbDsKKyAgYWRkcmVzcyA9IHRtcGFkZHI7CisgIGJvdW5kID0gdG1wYm5kOworICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgIGlmIChzdGF0dXMgIT0gUkRJRXJyb3JfTm9FcnJvcikgcmV0dXJuIHN0YXR1czsKKyAgVHJhY2VQcmludCgoInJldHVybnMgaGFuZGxlICUuOGx4XG4iLCAodW5zaWduZWQgbG9uZykqaGFuZGxlKSk7CisgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS1hbmdlbF9SRElfY2xlYXJicmVhay0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIENsZWFyIGEgYnJlYWtwb2ludDogVXNlIEFEUF9DbGVhckJyZWFrLiAqLworaW50IGFuZ2VsX1JESV9jbGVhcmJyZWFrKFBvaW50SGFuZGxlIGhhbmRsZSkKK3sKKyAgUGFja2V0ICpwYWNrZXQgPSBOVUxMOworICBpbnQgc3RhdHVzLCByZWFzb24sIE9TaW5mbzEsIE9TaW5mbzIsIGVyciwgZGVidWdJRDsKKworICBUcmFjZVByaW50KCgiYW5nZWxfUkRJX2NsZWFyYnJlYWs6IGhhbmRsZT0lLjhseFxuIiwgKHVuc2lnbmVkIGxvbmcpaGFuZGxlKSk7CisKKyAgcmVnaXN0ZXJfZGVidWdfbWVzc2FnZV9oYW5kbGVyKCk7CisgIG1zZ3NlbmQoQ0lfSEFEUCwgIiV3JXcldyV3JXciLAorICAgICAgICAgIEFEUF9DbGVhckJyZWFrfCBIdG9ULCAwLCAgQURQX0hhbmRsZVVua25vd24sCisgICAgICAgICAgQURQX0hhbmRsZVVua25vd24sIGhhbmRsZSk7CisgIHJlYXNvbiA9IEFEUF9DbGVhckJyZWFrfFR0b0g7CisgIGVyciA9IHdhaXRfZm9yX2RlYnVnX21lc3NhZ2UoJnJlYXNvbiwgJmRlYnVnSUQsICZPU2luZm8xLCAmT1NpbmZvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMsICZwYWNrZXQpOworICBpZiAoZXJyICE9IFJESUVycm9yX05vRXJyb3IpIHsKKyAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgICAgYW5nZWxfRGVidWdQcmludCgiKioqUkVDRUlWRSBERUJVRyBNRVNTQUdFIFJFVFVSTkVEIEVSUiA9ICVkLlxuIiwgZXJyKTsKKyAgICByZXR1cm4gZXJyOyAgICAgICAgICAvKiBXYXMgdGhlcmUgYW4gZXJyb3I/ICovCisgIH0KKyAgdW5wYWNrX21lc3NhZ2UoQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlciksICIldyV3JXcldyV3IiwgICZyZWFzb24sCisgICAgICAgICAgICAgICAgICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIsICZzdGF0dXMpOworICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisjaWZkZWYgREVCVUcKKyAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IENsZWFyIEJyZWFrIGNvbXBsZXRlZCBPSy5cbiIpOworI2VuZGlmCisgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS1hbmdlbF9SRElfc2V0d2F0Y2gtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFNldCBhIHdhdGNocG9pbnQ6IHVzZSBBRFBfU2V0V2F0Y2guICovCitpbnQgYW5nZWxfUkRJX3NldHdhdGNoKEFSTXdvcmQgYWRkcmVzcywgdW5zaWduZWQgdHlwZSwgdW5zaWduZWQgZGF0YXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIEFSTXdvcmQgYm91bmQsIFBvaW50SGFuZGxlICpoYW5kbGUpCit7CisgIFBhY2tldCAqcGFja2V0ID0gTlVMTDsKKyAgaW50IHN0YXR1cywgcmVhc29uLCBPU2luZm8xLCBPU2luZm8yLCBlcnIsIGRlYnVnSUQ7CisKKyAgVHJhY2VQcmludCgoImFuZ2VsX1JESV9zZXR3YXRjaDogYWRkcmVzcz0lLjhseCB0eXBlPSVkIGJvdW5kPSUuOGx4ICIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWFkZHJlc3MsIHR5cGUsICh1bnNpZ25lZCBsb25nKWJvdW5kKSk7CisKKyAgcmVnaXN0ZXJfZGVidWdfbWVzc2FnZV9oYW5kbGVyKCk7CisgIG1zZ3NlbmQoQ0lfSEFEUCwgIiV3JXcldyV3JXclYiViJXciLAorICAgICAgICAgIEFEUF9TZXRXYXRjaHwgSHRvVCwgMCwgIEFEUF9IYW5kbGVVbmtub3duLAorICAgICAgICAgIEFEUF9IYW5kbGVVbmtub3duLCBhZGRyZXNzLCB0eXBlLCBkYXRhdHlwZSwgYm91bmQpOworCisgIHJlYXNvbiA9IEFEUF9TZXRXYXRjaCB8IFR0b0g7CisgIGVyciA9IHdhaXRfZm9yX2RlYnVnX21lc3NhZ2UoJnJlYXNvbiwgJmRlYnVnSUQsICZPU2luZm8xLCAmT1NpbmZvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMsICZwYWNrZXQpOworICBpZiAoZXJyICE9IFJESUVycm9yX05vRXJyb3IpIHsKKyAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgICAgcmV0dXJuIGVycjsgICAgICAgIC8qIFdhcyB0aGVyZSBhbiBlcnJvcj8gKi8KKyAgfQorICB1bnBhY2tfbWVzc2FnZShCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSwgIiV3JXcldyV3JXcldyV3JXciLAorICAgICAgICAgICAgICAgICAmcmVhc29uLCAmZGVidWdJRCwgJk9TaW5mbzEsICZPU2luZm8yLCAmc3RhdHVzLAorICAgICAgICAgICAgICAgICBoYW5kbGUsICZhZGRyZXNzLCAmYm91bmQpOworICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgIFRyYWNlUHJpbnQoKCJyZXR1cm5zIGhhbmRsZSAlLjhseFxuIiwgKHVuc2lnbmVkIGxvbmcpKmhhbmRsZSkpOworICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLWFuZ2VsX1JESV9jbGVhcndhdGNoLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ2xlYXIgYSB3YXRjaHBvaW50OiB1c2UgQURQX0NsZWFyV2F0Y2guICovCitpbnQgYW5nZWxfUkRJX2NsZWFyd2F0Y2goUG9pbnRIYW5kbGUgaGFuZGxlKSB7CisKKyAgaW50IHN0YXR1cywgcmVhc29uLCBPU2luZm8xLCBPU2luZm8yLCBlcnIsIGRlYnVnSUQ7CisgIFBhY2tldCAqcGFja2V0ID0gTlVMTDsKKworICBUcmFjZVByaW50KCgiYW5nZWxfUkRJX2NsZWFyd2F0Y2g6IGhhbmRsZT0lLjhseFxuIiwgKHVuc2lnbmVkIGxvbmcpaGFuZGxlKSk7CisKKyAgcmVnaXN0ZXJfZGVidWdfbWVzc2FnZV9oYW5kbGVyKCk7CisgIG1zZ3NlbmQoQ0lfSEFEUCwgIiV3JXcldyV3JXciLAorICAgICAgICAgIEFEUF9DbGVhcldhdGNofCBIdG9ULCAwLCAgQURQX0hhbmRsZVVua25vd24sCisgICAgICAgICAgQURQX0hhbmRsZVVua25vd24sIGhhbmRsZSk7CisgIHJlYXNvbiA9IEFEUF9DbGVhcldhdGNofFR0b0g7CisgIGVyciA9IHdhaXRfZm9yX2RlYnVnX21lc3NhZ2UoJnJlYXNvbiwgJmRlYnVnSUQsICZPU2luZm8xLCAmT1NpbmZvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMsICZwYWNrZXQpOworICBpZiAoZXJyICE9IFJESUVycm9yX05vRXJyb3IpIHsKKyAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgICAgcmV0dXJuIGVycjsgICAgICAgIC8qIFdhcyB0aGVyZSBhbiBlcnJvcj8gKi8KKyAgfQorICB1bnBhY2tfbWVzc2FnZShCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSwgIiV3JXcldyV3JXciLCAgJnJlYXNvbiwgJmRlYnVnSUQsCisgICAgICAgICAgICAgICAgICZPU2luZm8xLCAmT1NpbmZvMiwgJnN0YXR1cyk7CisgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgc3RvcHBlZF9yZWFzb247CisgIGludCBzdG9wcGVkX3N0YXR1czsKKyAgaW50IGRhdGE7Cit9IGFkcF9zdG9wcGVkX3N0cnVjdDsKKworCitpbnQgYW5nZWxfUkRJX09uVGFyZ2V0U3RvcHBpbmcoYW5nZWxfUkRJX1RhcmdldFN0b3BwZWRQcm9jICpmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpCit7CisgIHN0b3BwZWRQcm9jTGlzdEVsZW1lbnQgKipscHRyID0gJnN0b3BwZWRfcHJvY19saXN0OworCisgIC8qIEZpbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIE5VTEwgcHRyIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KKyAgZm9yICg7ICpscHRyIT1OVUxMIDsgbHB0ciA9ICYoKCpscHRyKS0+bmV4dCkpCisgICAgOyAvKiBEbyBub3RoaW5nICovCisKKyAgKmxwdHIgPSAoc3RvcHBlZFByb2NMaXN0RWxlbWVudCAqKSBtYWxsb2Moc2l6ZW9mKHN0b3BwZWRQcm9jTGlzdEVsZW1lbnQpKTsKKyAgaWYgKCpscHRyID09IE5VTEwpIHJldHVybiBSRElFcnJvcl9PdXRPZlN0b3JlOworICAoKmxwdHIpLT5mbiA9IGZuOworICAoKmxwdHIpLT5hcmcgPSBhcmc7CisKKyAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgQ2FsbFN0b3BwZWRQcm9jcyh1bnNpZ25lZCByZWFzb24pCit7CisgIHN0b3BwZWRQcm9jTGlzdEVsZW1lbnQgKnAgPSBzdG9wcGVkX3Byb2NfbGlzdDsKKyAgaW50IGVycj1SRElFcnJvcl9Ob0Vycm9yOworICAKKyAgZm9yICg7IHAhPU5VTEwgOyBwPXAtPm5leHQpIHsKKyAgICBpbnQgbG9jYWxfZXJyID0gcC0+Zm4ocmVhc29uLCBwLT5hcmcpOworICAgIGlmIChsb2NhbF9lcnIgIT0gUkRJRXJyb3JfTm9FcnJvcikgZXJyPWxvY2FsX2VycjsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS1hbmdlbF9SRElfZXhlY3V0ZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgSGFuZGxlU3RvcHBlZE1lc3NhZ2UoUGFja2V0ICpwYWNrZXQsIHZvaWQgKnN0YXRlcHRyKSB7CisgIHVuc2lnbmVkIGludCBlcnIsICByZWFzb24sIGRlYnVnSUQsIE9TaW5mbzEsIE9TaW5mbzIsIGNvdW50OworICBhZHBfc3RvcHBlZF9zdHJ1Y3QgKnN0b3BwZWRfaW5mbzsKKyAgc3RvcHBlZF9pbmZvID0gKGFkcF9zdG9wcGVkX3N0cnVjdCAqKSBzdGF0ZXB0cjsKKyAgSUdOT1JFKHN0YXRlcHRyKTsKKyAgY291bnQgPSB1bnBhY2tfbWVzc2FnZShCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSwgIiV3JXcldyV3JXcldyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYXNvbiwgJmRlYnVnSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJk9TaW5mbzEsICZPU2luZm8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzdG9wcGVkX2luZm8tPnN0b3BwZWRfcmVhc29uLCAmc3RvcHBlZF9pbmZvLT5kYXRhKTsKKyAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworCisgIGlmIChyZWFzb24gIT0gKEFEUF9TdG9wcGVkIHwgVHRvSCkpIHsKKyNpZmRlZiBERUJVRworICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkV4cGVjdGluZyBzdG9wcGVkIG1lc3NhZ2UsIGdvdCAleCIsIHJlYXNvbik7CisjZW5kaWYKKyAgICByZXR1cm4gUkRJRXJyb3JfRXJyb3I7CisgIH0KKyAgZWxzZSB7CisgICAgZXhlY3V0aW5nID0gRkFMU0U7CisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJSZWNlaXZlZCBzdG9wcGVkIG1lc3NhZ2UuXG4iKTsKKyNlbmRpZgorICB9CisKKyAgZXJyID0gbXNnc2VuZChDSV9UQURQLCAgIiV3JXcldyV3JXciLCAoQURQX1N0b3BwZWQgfCBIdG9UKSwgMCwKKyAgICAgICAgICAgICAgICBBRFBfSGFuZGxlVW5rbm93biwgQURQX0hhbmRsZVVua25vd24sIFJESUVycm9yX05vRXJyb3IpOworI2lmZGVmIERFQlVHCisgIGFuZ2VsX0RlYnVnUHJpbnQoIlRyYW5zbWl0aW5nIHN0b3BwZWQgYWNrbm93bGVkZ2UuXG4iKTsKKyNlbmRpZgorICBpZiAoZXJyICE9IFJESUVycm9yX05vRXJyb3IpIGFuZ2VsX0RlYnVnUHJpbnQoIlRyYW5zbWl0IGZhaWxlZC5cbiIpOworI2lmZGVmIERFQlVHCisgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBTdG9wcGVkIHJlYXNvbiA6ICV4XG4iLCBzdG9wcGVkX2luZm8tPnN0b3BwZWRfcmVhc29uKTsKKyNlbmRpZgorICBzd2l0Y2ggKHN0b3BwZWRfaW5mby0+c3RvcHBlZF9yZWFzb24pIHsKKyAgY2FzZSBBRFBfU3RvcHBlZF9CcmFuY2hUaHJvdWdoWmVybzoKKyAgICBzdG9wcGVkX2luZm8tPnN0b3BwZWRfc3RhdHVzID0gUkRJRXJyb3JfQnJhbmNoVGhyb3VnaDA7CisgICAgYnJlYWs7CisgIGNhc2UgQURQX1N0b3BwZWRfVW5kZWZpbmVkSW5zdHI6CisgICAgc3RvcHBlZF9pbmZvLT5zdG9wcGVkX3N0YXR1cyA9IFJESUVycm9yX1VuZGVmaW5lZEluc3RydWN0aW9uOworICAgIGJyZWFrOworICBjYXNlIEFEUF9TdG9wcGVkX1NvZnR3YXJlSW50ZXJydXB0OgorICAgIHN0b3BwZWRfaW5mby0+c3RvcHBlZF9zdGF0dXMgPSBSRElFcnJvcl9Tb2Z0d2FyZUludGVycnVwdDsKKyAgICBicmVhazsKKyAgY2FzZSBBRFBfU3RvcHBlZF9QcmVmZXRjaEFib3J0OgorICAgIHN0b3BwZWRfaW5mby0+c3RvcHBlZF9zdGF0dXMgPSBSRElFcnJvcl9QcmVmZXRjaEFib3J0OworICAgIGJyZWFrOworICBjYXNlIEFEUF9TdG9wcGVkX0RhdGFBYm9ydDoKKyAgICBzdG9wcGVkX2luZm8tPnN0b3BwZWRfc3RhdHVzID0gUkRJRXJyb3JfRGF0YUFib3J0OworICAgIGJyZWFrOworICBjYXNlIEFEUF9TdG9wcGVkX0FkZHJlc3NFeGNlcHRpb246CisgICAgc3RvcHBlZF9pbmZvLT5zdG9wcGVkX3N0YXR1cyA9IFJESUVycm9yX0FkZHJlc3NFeGNlcHRpb247CisgICAgYnJlYWs7CisgIGNhc2UgQURQX1N0b3BwZWRfSVJROgorICAgIHN0b3BwZWRfaW5mby0+c3RvcHBlZF9zdGF0dXMgPSBSRElFcnJvcl9JUlE7CisgICAgYnJlYWs7CisgIGNhc2UgQURQX1N0b3BwZWRfQnJlYWtQb2ludDoKKyAgICBzdG9wcGVkX2luZm8tPnN0b3BwZWRfc3RhdHVzID0gUkRJRXJyb3JfQnJlYWtwb2ludFJlYWNoZWQ7CisgICAgYnJlYWs7CisgIGNhc2UgQURQX1N0b3BwZWRfV2F0Y2hQb2ludDoKKyAgICBzdG9wcGVkX2luZm8tPnN0b3BwZWRfc3RhdHVzID0gUkRJRXJyb3JfV2F0Y2hwb2ludEFjY2Vzc2VkOworICAgIGJyZWFrOworICBjYXNlIEFEUF9TdG9wcGVkX1N0ZXBDb21wbGV0ZToKKyAgICBzdG9wcGVkX2luZm8tPnN0b3BwZWRfc3RhdHVzID0gUkRJRXJyb3JfUHJvZ3JhbUZpbmlzaGVkSW5TdGVwOworICAgIGJyZWFrOworICBjYXNlIEFEUF9TdG9wcGVkX1J1blRpbWVFcnJvclVua25vd246CisgIGNhc2UgQURQX1N0b3BwZWRfU3RhY2tPdmVyZmxvdzoKKyAgY2FzZSBBRFBfU3RvcHBlZF9EaXZpc2lvbkJ5WmVybzoKKyAgICBzdG9wcGVkX2luZm8tPnN0b3BwZWRfc3RhdHVzID0gUkRJRXJyb3JfRXJyb3I7CisgICAgYnJlYWs7CisgIGNhc2UgQURQX1N0b3BwZWRfRklROgorICAgIHN0b3BwZWRfaW5mby0+c3RvcHBlZF9zdGF0dXMgPSBSRElFcnJvcl9GSVE7CisgICAgYnJlYWs7CisgIGNhc2UgQURQX1N0b3BwZWRfVXNlckludGVycnVwdGlvbjoKKyAgY2FzZSBBRFBfU3RvcHBlZF9PU1NwZWNpZmljOgorICAgIHN0b3BwZWRfaW5mby0+c3RvcHBlZF9zdGF0dXMgPSBSRElFcnJvcl9Vc2VySW50ZXJydXB0OworICAgIGJyZWFrOworICBjYXNlIEFEUF9TdG9wcGVkX0FwcGxpY2F0aW9uRXhpdDoKKyAgICBzdG9wcGVkX2luZm8tPnN0b3BwZWRfc3RhdHVzID0gUkRJRXJyb3JfTm9FcnJvcjsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBzdG9wcGVkX2luZm8tPnN0b3BwZWRfc3RhdHVzID0gUkRJRXJyb3JfTm9FcnJvcjsKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKK30KKworc3RhdGljIHZvbGF0aWxlIGJvb2wgaW50ZXJydXB0X3JlcXVlc3QgPSBGQUxTRTsKKworc3RhdGljIHZvaWQgaW50ZXJydXB0X3RhcmdldCggdm9pZCApCit7CisgICAgUGFja2V0ICpwYWNrZXQgPSBOVUxMOworICAgIGludCBlcnI7CisgICAgaW50IHJlYXNvbiwgZGVidWdJRCwgT1NpbmZvMSwgT1NpbmZvMiwgc3RhdHVzOworCisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogaW50ZXJydXB0X3RhcmdldC5cbiIpOworI2VuZGlmCisKKyAgICByZWdpc3Rlcl9kZWJ1Z19tZXNzYWdlX2hhbmRsZXIoKTsKKyAgICBtc2dzZW5kKENJX0hBRFAsICIldyV3JXcldyIsIEFEUF9JbnRlcnJ1cHRSZXF1ZXN0IHwgSHRvVCwgMCwKKyAgICAgICAgICAgICAgICAgICBBRFBfSGFuZGxlVW5rbm93biwgQURQX0hhbmRsZVVua25vd24pOworCisgICAgcmVhc29uID0gQURQX0ludGVycnVwdFJlcXVlc3QgfFR0b0g7CisgICAgZXJyID0gd2FpdF9mb3JfZGVidWdfbWVzc2FnZSgmcmVhc29uLCAmZGVidWdJRCwgJk9TaW5mbzEsICZPU2luZm8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywgJnBhY2tldCk7CisgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IGdvdCBpbnRlcnJ1cHQgYWNrIG9rIGVyciA9ICVkLCBzdGF0dXM9JWlcbiIsCisgICAgICAgICAgICAgICAgICAgICBlcnIsIHN0YXR1cyk7CisjZW5kaWYKKworICAgIHJldHVybjsKK30KKworI2lmZGVmIFRFU1RfRENfQVBQTAorICBleHRlcm4gdm9pZCB0ZXN0X2RjX2FwcGxfaGFuZGxlciggY29uc3QgRGV2aWNlRGVzY3IgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldCAqcGFja2V0ICk7CisjZW5kaWYKKworLyogQ29yZSBmdW5jdGlvbmFsaXR5IGZvciBleGVjdXRlIGFuZCBzdGVwICovCitzdGF0aWMgaW50IGFuZ2VsX1JESV9FeGVjdXRlT3JTdGVwKFBvaW50SGFuZGxlICpoYW5kbGUsIHdvcmQgdHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG5pbnN0cikKK3sKKyAgaW50IGVycjsKKyAgYWRwX3N0b3BwZWRfc3RydWN0IHN0b3BwZWRfaW5mbzsKKyAgdm9pZCogc3RhdGVwdHIgPSAodm9pZCAqKSZzdG9wcGVkX2luZm87CisgIENoYW5uZWxDYWxsYmFjayBIYW5kbGVTdG9wcGVkTWVzc2FnZUZQdHI9KENoYW5uZWxDYWxsYmFjaykgSGFuZGxlU3RvcHBlZE1lc3NhZ2U7CisgIGludCBzdGF0dXMsIHJlYXNvbmNvZGUsIGRlYnVnSUQsIE9TaW5mbzEsIE9TaW5mbzI7CisgIFBhY2tldCAqcGFja2V0ID0gTlVMTDsKKworICBUcmFjZVByaW50KCgiYW5nZWxfUkRJX0V4ZWN1dGVPclN0ZXBcbiIpKTsKKworICBlcnIgPSBBZHBfQ2hhbm5lbFJlZ2lzdGVyUmVhZChDSV9UQURQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVTdG9wcGVkTWVzc2FnZUZQdHIsIHN0YXRlcHRyKTsKKyAgaWYgKGVyciAhPSBSRElFcnJvcl9Ob0Vycm9yKSB7CisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJUQURQIFJlZ2lzdGVyIGZhaWxlZC5cbiIpOworI2VuZGlmCisgICAgcmV0dXJuIGVycjsKKyAgfQorICAvKiBTZXQgZXhlY3V0aW5nIFRSVUUgaGVyZSwgYXMgaXQgbXVzdCBiZSBzZXQgdXAgYmVmb3JlIHRoZSB0YXJnZXQgaGFzCisgICAqIGhhZCBhbnkgY2hhbmNlIGF0IGFsbCB0byBleGVjdXRlLCBvciBpdCBtYXkgc2VuZCBpdHMgc3RvcHBlZCBtZXNzYWdlCisgICAqIGJlZm9yZSB3ZSBnZXQgcm91bmQgdG8gc2V0dGluZyBleGVjdXRpbmcgPSBUUlVFICEhIQorICAgKi8KKyAgZXhlY3V0aW5nID0gVFJVRTsKKworICByZWdpc3Rlcl9kZWJ1Z19tZXNzYWdlX2hhbmRsZXIoKTsKKworI2lmZGVmIFRFU1RfRENfQVBQTAorICBBZHBfSW5zdGFsbF9EQ19BcHBsX0hhbmRsZXIoIHRlc3RfZGNfYXBwbF9oYW5kbGVyICk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHCisgIGFuZ2VsX0RlYnVnUHJpbnQoIlRyYW5zbWl0aW5nICVzIG1lc3NhZ2UuXG4iLAorICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gQURQX0V4ZWN1dGUgPyAiZXhlY3V0ZSI6ICJzdGVwIik7CisjZW5kaWYKKworICByZWdpc3Rlcl9kZWJ1Z19tZXNzYWdlX2hhbmRsZXIoKTsKKyAgLyogRXh0cmEgbmluc3RyIHBhcmFtZXRlciBmb3IgZXhlY3V0ZSBtZXNzYWdlIHdpbGwgc2ltcGx5IGJlIGlnbm9yZWQgKi8KKyAgZXJyID0gbXNnc2VuZChDSV9IQURQLCIldyV3JXcldyV3IiwgdHlwZSB8IEh0b1QsIDAsCisgICAgICAgICAgICAgICAgQURQX0hhbmRsZVVua25vd24sIEFEUF9IYW5kbGVVbmtub3duLCBuaW5zdHIpOworI2lmIERFQlVHCisgIGlmIChlcnIgIT0gUkRJRXJyb3JfTm9FcnJvcikgYW5nZWxfRGVidWdQcmludCgiVHJhbnNtaXQgZmFpbGVkLlxuIik7CisjZW5kaWYKKworICByZWFzb25jb2RlID0gdHlwZSB8IFR0b0g7CisgIGVyciA9IHdhaXRfZm9yX2RlYnVnX21lc3NhZ2UoICZyZWFzb25jb2RlLCAmZGVidWdJRCwgJk9TaW5mbzEsICZPU2luZm8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzLCAmcGFja2V0ICk7CisgIGlmIChlcnIgIT0gUkRJRXJyb3JfTm9FcnJvcikKKyAgICAgcmV0dXJuIGVycjsKKyAgZWxzZSBpZiAoc3RhdHVzICE9IFJESUVycm9yX05vRXJyb3IpCisgICAgIHJldHVybiBzdGF0dXM7CisKKyNpZmRlZiBERUJVRworICBhbmdlbF9EZWJ1Z1ByaW50KCJXYWl0aW5nIGZvciBwcm9ncmFtIHRvIGZpbmlzaC4uLlxuIik7CisjZW5kaWYKKworICB3aGlsZSggZXhlY3V0aW5nICkKKyAgeworICAgICAgaWYgKGludGVycnVwdF9yZXF1ZXN0KQorICAgICAgeworICAgICAgICBpbnRlcnJ1cHRfdGFyZ2V0KCk7CisgICAgICAgIGludGVycnVwdF9yZXF1ZXN0ID0gRkFMU0U7CisgICAgICB9CisgICAgICBBZHBfQXN5bmNocm9ub3VzUHJvY2Vzc2luZyggYXN5bmNfYmxvY2tfb25fbm90aGluZyApOworICB9CisKKyNpZmRlZiBURVNUX0RDX0FQUEwKKyAgQWRwX0luc3RhbGxfRENfQXBwbF9IYW5kbGVyKCBOVUxMICk7CisjZW5kaWYKKworICAodm9pZClBZHBfQ2hhbm5lbFJlZ2lzdGVyUmVhZChDSV9UQURQLCBOVUxMLCBOVUxMKTsKKworICAqaGFuZGxlID0gKFBvaW50SGFuZGxlKXN0b3BwZWRfaW5mby5kYXRhOworCisgIENhbGxTdG9wcGVkUHJvY3Moc3RvcHBlZF9pbmZvLnN0b3BwZWRfcmVhc29uKTsKKworICByZXR1cm4gc3RvcHBlZF9pbmZvLnN0b3BwZWRfc3RhdHVzOworfQorCisvKiBSZXF1ZXN0IHRoYXQgdGhlIHRhcmdldCBzdGFydHMgZXhlY3V0aW5nIGZyb20gdGhlIHN0b3JlZCBDUFUgc3RhdGU6IHVzZQorICAgQURQX0V4ZWN1dGUuICovCitpbnQgYW5nZWxfUkRJX2V4ZWN1dGUoUG9pbnRIYW5kbGUgKmhhbmRsZSkKK3sKKyAgICByZXR1cm4gYW5nZWxfUkRJX0V4ZWN1dGVPclN0ZXAoaGFuZGxlLCBBRFBfRXhlY3V0ZSwgMCk7Cit9CisKKyNpZmRlZiBfX1dBVENPTUNfXwordHlwZWRlZiB2b2lkIGhhbmRsZXJ0eXBlKGludCk7CisKK3N0YXRpYyBpbnQgaW50ZXJydXB0ZWQ9MDsKKworc3RhdGljIHZvaWQgbXloYW5kbGVyKGludCBzaWcpIHsKKyAgSUdOT1JFKHNpZyk7CisgIGludGVycnVwdGVkPTE7CisgIHNpZ25hbChTSUdJTlQsIG15aGFuZGxlcik7Cit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLWFuZ2VsX1JESV9zdGVwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU3RlcCAnbmluc3RyJyB0aHJvdWdoIHRoZSBjb2RlOiB1c2UgQURQX1N0ZXAuICovCitpbnQgYW5nZWxfUkRJX3N0ZXAodW5zaWduZWQgbmluc3RyLCBQb2ludEhhbmRsZSAqaGFuZGxlKQoreworICAgIGludCBlcnIgPSBhbmdlbF9SRElfRXhlY3V0ZU9yU3RlcChoYW5kbGUsIEFEUF9TdGVwLCBuaW5zdHIpOworICAgIGlmIChlcnIgPT0gUkRJRXJyb3JfUHJvZ3JhbUZpbmlzaGVkSW5TdGVwKQorICAgICAgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOworICAgIGVsc2UKKyAgICAgICByZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyB2b2lkIFNldENQV29yZHMoaW50IGNwbnVtLCBzdHJ1Y3QgRGJnX0NvUHJvRGVzYyBjb25zdCAqY3BkKSB7CisgIGludCBpLCBybWF4ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IGNwZC0+ZW50cmllczsgaSsrKQorICAgIGlmIChjcGQtPnJlZ2Rlc2NbaV0ucm1heCA+IHJtYXgpCisgICAgICBybWF4ID0gY3BkLT5yZWdkZXNjW2ldLnJtYXg7CisKKyAgeyB1bnNpZ25lZCBjaGFyICpybWFwID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2Mocm1heCArIDIpOworICAgICpybWFwKysgPSBybWF4ICsgMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3BkLT5lbnRyaWVzOyBpKyspIHsKKyAgICAgIGludCByOworICAgICAgZm9yIChyID0gY3BkLT5yZWdkZXNjW2ldLnJtaW47IHIgPD0gY3BkLT5yZWdkZXNjW2ldLnJtYXg7IHIrKykKKyAgICAgICAgcm1hcFtyXSA9IChjcGQtPnJlZ2Rlc2NbaV0ubmJ5dGVzKzMpIC8gNDsKKyAgICAgIH0KKy8qICAgIGlmIChjcHdvcmRzW2NwbnVtXSAhPSBOVUxMKSBmcmVlKGNwd29yZHNbY3BudW1dKTsgKi8KKyAgICBjcHdvcmRzW2NwbnVtXSA9IHJtYXA7CisgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLWFuZ2VsX1JESV9pbmZvLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVXNlIEFEUF9JbmZvLCBBRFBfQ3RybCBhbmQgQURQX1Byb2ZpbGUgY2FsbHMgdG8gaW1wbGVtZW50IHRoZXNlLAorICAgc2VlIGFkcC5oIGZvciBtb3JlIGRldGFpbHMuICovCisKK3N0YXRpYyBpbnQgYW5nZWxfY2NfZXhpc3RzKCB2b2lkICkKK3sKKyAgUGFja2V0ICpwYWNrZXQgPSBOVUxMOworICBpbnQgZXJyOworICBpbnQgcmVhc29uLCBkZWJ1Z0lELCBPU2luZm8xLCBPU2luZm8yLCBzdWJyZWFzb24sIHN0YXR1czsKKworI2lmZGVmIERFQlVHCisgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBBRFBfSUNFQl9DQ19FeGlzdHMuXG4iKTsKKyNlbmRpZgorCisgIGlmICggYW5nZWxfUkRJX2luZm8oIFJESUluZm9fSWNlYnJlYWtlciwgTlVMTCwgTlVMTCApID09IFJESUVycm9yX05vRXJyb3IgKSB7CisgICAgcmVnaXN0ZXJfZGVidWdfbWVzc2FnZV9oYW5kbGVyKCk7CisgICAgbXNnc2VuZChDSV9IQURQLCAiJXcldyV3JXcldyIsIEFEUF9JQ0VicmVha2VySEFEUCB8IEh0b1QsIDAsCisgICAgICAgICAgICBBRFBfSGFuZGxlVW5rbm93biwgQURQX0hhbmRsZVVua25vd24sCisgICAgICAgICAgICBBRFBfSUNFQl9DQ19FeGlzdHMgKTsKKyAgICByZWFzb24gPSBBRFBfSUNFYnJlYWtlckhBRFAgfFR0b0g7CisgICAgZXJyID0gd2FpdF9mb3JfZGVidWdfbWVzc2FnZSgmcmVhc29uLCAmZGVidWdJRCwgJk9TaW5mbzEsICZPU2luZm8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzLCAmcGFja2V0KTsKKyAgICBpZiAoZXJyICE9IFJESUVycm9yX05vRXJyb3IpIHsKKyAgICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIHVucGFja19tZXNzYWdlKEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpLCAiJXcldyV3JXcldyV3IiwgJnJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAmZGVidWdJRCwgJk9TaW5mbzEsICZPU2luZm8yLCAgJnN1YnJlYXNvbiwgJnN0YXR1cyk7CisgICAgaWYgKHN1YnJlYXNvbiAhPSAgQURQX0lDRUJfQ0NfRXhpc3RzKSB7CisgICAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgICAgICByZXR1cm4gUkRJRXJyb3JfRXJyb3I7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBzdGF0dXM7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiBSRElFcnJvcl9VbmltcGxlbWVudGVkTWVzc2FnZTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICBSRElDQ1Byb2NfVG9Ib3N0ICp0b2hvc3Q7IHZvaWQgKnRvaG9zdGFyZzsKKyAgUkRJQ0NQcm9jX0Zyb21Ib3N0ICpmcm9taG9zdDsgdm9pZCAqZnJvbWhvc3Rhcmc7CisgIGJvb2wgcmVnaXN0ZXJlZDsKK30gQ0NTdGF0ZTsKK3N0YXRpYyBDQ1N0YXRlIGNjc3RhdGUgPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIEZBTFNFIH07CisKK3N0YXRpYyB2b2lkIEhhbmRsZURDQ01lc3NhZ2UoIFBhY2tldCAqcGFja2V0LCB2b2lkICpzdGF0ZXB0ciApCit7CisgIHVuc2lnbmVkIGludCByZWFzb24sIGRlYnVnSUQsIE9TaW5mbzEsIE9TaW5mbzI7CisgIGludCBjb3VudDsKKyAgQ0NTdGF0ZSAqY2NzdGF0ZV9wID0gKENDU3RhdGUgKilzdGF0ZXB0cjsKKworICBjb3VudCA9IHVucGFja19tZXNzYWdlKCBCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSwgIiV3JXcldyV3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYXNvbiwgJmRlYnVnSUQsICZPU2luZm8xLCAmT1NpbmZvMiApOworICBzd2l0Y2ggKCByZWFzb24gKQorICB7CisgICAgICBjYXNlIEFEUF9URENDX1RvSG9zdCB8IFR0b0g6CisgICAgICB7CisgICAgICAgICAgIC8qIG9ubHkgaGFuZGxlcyBhIHNpbmdsZSB3b3JkIG9mIGRhdGEsIGZvciBub3cgKi8KKworICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIGRhdGE7CisKKyAgICAgICAgICB1bnBhY2tfbWVzc2FnZSggQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlcikrY291bnQsICIldyV3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ieXRlcywgJmRhdGEgKTsKKyNpZmRlZiBERUJVRworICAgICAgICAgIGFuZ2VsX0RlYnVnUHJpbnQoICJERUJVRzogcmVjZWl2ZWQgQ0NfVG9Ib3N0IG1lc3NhZ2U6IG5ieXRlcyAlZCBkYXRhICUwOHguXG4iLAorICAgICAgICAgICAgICAgICAgbmJ5dGVzLCBkYXRhICk7CisjZW5kaWYKKyAgICAgICAgICBjY3N0YXRlX3AtPnRvaG9zdCggY2NzdGF0ZV9wLT50b2hvc3RhcmcsIGRhdGEgKTsKKyAgICAgICAgICBtc2dzZW5kKENJX1RURENDLCAiJXcldyV3JXcldyIsCisgICAgICAgICAgICAgICAgICBBRFBfVERDQ19Ub0hvc3QgfCBIdG9ULCBkZWJ1Z0lELCBPU2luZm8xLCBPU2luZm8yLAorICAgICAgICAgICAgICAgICAgUkRJRXJyb3JfTm9FcnJvciApOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIEFEUF9URENDX0Zyb21Ib3N0IHwgVHRvSDoKKyAgICAgIHsKKyAgICAgICAgICAgLyogb25seSBoYW5kbGVzIGEgc2luZ2xlIHdvcmQgb2YgZGF0YSwgZm9yIG5vdyAqLworCisgICAgICAgICAgaW50IHZhbGlkOworICAgICAgICAgIEFSTXdvcmQgZGF0YTsKKworICAgICAgICAgIGNjc3RhdGVfcC0+ZnJvbWhvc3QoIGNjc3RhdGVfcC0+ZnJvbWhvc3RhcmcsICZkYXRhLCAmdmFsaWQgKTsKKyNpZmRlZiBERUJVRworICAgICAgICAgIGFuZ2VsX0RlYnVnUHJpbnQoICJERUJVRzogcmVjZWl2ZWQgQ0NfRnJvbUhvc3QgbWVzc2FnZSwgcmV0dXJuaW5nOiAlMDh4ICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgIGRhdGEsIHZhbGlkID8gIlZBTElEIiA6ICJJTnZhbGlkIiApOworI2VuZGlmCisgICAgICAgICAgbXNnc2VuZChDSV9UVERDQywgIiV3JXcldyV3JXcldyV3IiwKKyAgICAgICAgICAgICAgICAgIEFEUF9URENDX0Zyb21Ib3N0IHwgSHRvVCwgZGVidWdJRCwgT1NpbmZvMSwgT1NpbmZvMiwKKyAgICAgICAgICAgICAgICAgIFJESUVycm9yX05vRXJyb3IsIHZhbGlkID8gMSA6IDAsIGRhdGEgKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyNpZmRlZiBERUJVRworICAgICAgYW5nZWxfRGVidWdQcmludCggIlVuZXhwZWN0ZWQgVERDQyBtZXNzYWdlICUwOHggcmVjZWl2ZWRcbiIsIHJlYXNvbiApOworI2VuZGlmCisgICAgICBicmVhazsKKyAgfQorICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgYW5nZWxfY2hlY2tfRENDX2hhbmRsZXIoIENDU3RhdGUgKmNjc3RhdGVfcCApCit7CisgICAgaW50IGVycjsKKworICAgIGlmICggY2NzdGF0ZV9wLT50b2hvc3QgIT0gTlVMTCB8fCBjY3N0YXRlX3AtPmZyb21ob3N0ICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgLyogZG9pbmcgRENDLCBzbyBuZWVkIGEgaGFuZGxlciAqLworICAgICAgICBpZiAoICEgY2NzdGF0ZV9wLT5yZWdpc3RlcmVkICkKKyAgICAgICAgeworI2lmZGVmIERFQlVHCisgICAgICAgICAgICBhbmdlbF9EZWJ1Z1ByaW50KCAiUmVnaXN0ZXJpbmcgaGFuZGxlciBmb3IgVFREQ0MgY2hhbm5lbC5cbiIgKTsKKyNlbmRpZgorICAgICAgICAgICAgZXJyID0gQWRwX0NoYW5uZWxSZWdpc3RlclJlYWQoIENJX1RURENDLCBIYW5kbGVEQ0NNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjc3RhdGVfcCApOworICAgICAgICAgICAgaWYgKCBlcnIgPT0gYWRwX29rICkKKyAgICAgICAgICAgICAgIGNjc3RhdGVfcC0+cmVnaXN0ZXJlZCA9IFRSVUU7CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIGFuZ2VsX0RlYnVnUHJpbnQoICJhbmdlbF9jaGVja19EQ0NfaGFuZGxlcjogcmVnaXN0ZXIgZmFpbGVkIVxuIiApOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogbm90IGRvaW5nIERDQywgc28gZG9uJ3QgbmVlZCBhIGhhbmRsZXIgKi8KKyAgICAgICAgaWYgKCBjY3N0YXRlX3AtPnJlZ2lzdGVyZWQgKQorICAgICAgICB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIGFuZ2VsX0RlYnVnUHJpbnQoICJVbnJlZ2lzdGVyaW5nIGhhbmRsZXIgZm9yIFRURENDIGNoYW5uZWwuXG4iICk7CisjZW5kaWYKKyAgICAgICAgICAgIGVyciA9IEFkcF9DaGFubmVsUmVnaXN0ZXJSZWFkKCBDSV9UVERDQywgTlVMTCwgTlVMTCApOworICAgICAgICAgICAgaWYgKCBlcnIgPT0gYWRwX29rICkKKyAgICAgICAgICAgICAgIGNjc3RhdGVfcC0+cmVnaXN0ZXJlZCA9IEZBTFNFOworI2lmZGVmIERFQlVHCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBhbmdlbF9EZWJ1Z1ByaW50KCAiYW5nZWxfY2hlY2tfRENDX2hhbmRsZXI6IHVucmVnaXN0ZXIgZmFpbGVkIVxuIiApOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9Cit9CisKKworc3RhdGljIGludCBDaGVja1N1Yk1lc3NhZ2VSZXBseShpbnQgcmVhc29uLCBpbnQgc3VicmVhc29uKSB7CisgIFBhY2tldCAqcGFja2V0ID0gTlVMTDsKKyAgaW50IHN0YXR1cywgZGVidWdJRCwgT1NpbmZvMSwgT1NpbmZvMjsKKyAgaW50IGVyciA9IFJESUVycm9yX05vRXJyb3I7CisgIHJlYXNvbiB8PSBUdG9IOworICBlcnIgPSB3YWl0X2Zvcl9kZWJ1Z19tZXNzYWdlKCZyZWFzb24sICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywgJnBhY2tldCk7CisgIGlmIChlcnIgIT0gUkRJRXJyb3JfTm9FcnJvcikgeworICAgIHN0YXR1cyA9IGVycjsKKyAgfSBlbHNlIHsKKyAgICBpbnQgc3I7CisgICAgdW5wYWNrX21lc3NhZ2UoQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlciksICIldyV3JXcldyV3JXciLCAmcmVhc29uLCAmZGVidWdJRCwKKyAgICAgICAgICAgICAgICAgICAmT1NpbmZvMSwgJk9TaW5mbzIsICZzciwgJnN0YXR1cyk7CisgICAgaWYgKHN1YnJlYXNvbiAhPSBzcikgc3RhdHVzID0gUkRJRXJyb3JfRXJyb3I7CisgIH0KKyAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFNlbmRTdWJNZXNzYWdlQW5kQ2hlY2tSZXBseShpbnQgcmVhc29uLCBpbnQgc3VicmVhc29uKSB7CisgIHJlZ2lzdGVyX2RlYnVnX21lc3NhZ2VfaGFuZGxlcigpOworICBtc2dzZW5kKENJX0hBRFAsICIldyV3JXcldyV3IiwgcmVhc29uIHwgSHRvVCwgMCwKKyAgICAgICAgICBBRFBfSGFuZGxlVW5rbm93biwgQURQX0hhbmRsZVVua25vd24sCisgICAgICAgICAgc3VicmVhc29uKTsKKyAgcmV0dXJuIENoZWNrU3ViTWVzc2FnZVJlcGx5KHJlYXNvbiwgc3VicmVhc29uKTsKK30KKworc3RhdGljIGludCBTZW5kU3ViTWVzc2FnZVdvcmRBbmRDaGVja1JlcGx5KGludCByZWFzb24sIGludCBzdWJyZWFzb24sIEFSTXdvcmQgd29yZCkgeworICByZWdpc3Rlcl9kZWJ1Z19tZXNzYWdlX2hhbmRsZXIoKTsKKyAgbXNnc2VuZChDSV9IQURQLCAiJXcldyV3JXcldyV3IiwgcmVhc29uIHwgSHRvVCwgMCwKKyAgICAgICAgICBBRFBfSGFuZGxlVW5rbm93biwgQURQX0hhbmRsZVVua25vd24sCisgICAgICAgICAgc3VicmVhc29uLCB3b3JkKTsKKyAgcmV0dXJuIENoZWNrU3ViTWVzc2FnZVJlcGx5KHJlYXNvbiwgc3VicmVhc29uKTsKK30KKworc3RhdGljIGludCBTZW5kU3ViTWVzc2FnZUdldFdvcmRBbmRDaGVja1JlcGx5KGludCByZWFzb24sIGludCBzdWJyZWFzb24sIEFSTXdvcmQgKnJlc3ApIHsKKyAgUGFja2V0ICpwYWNrZXQgPSBOVUxMOworICBpbnQgc3RhdHVzLCBkZWJ1Z0lELCBPU2luZm8xLCBPU2luZm8yOworICBpbnQgZXJyID0gUkRJRXJyb3JfTm9FcnJvcjsKKworICByZWdpc3Rlcl9kZWJ1Z19tZXNzYWdlX2hhbmRsZXIoKTsKKyAgbXNnc2VuZChDSV9IQURQLCAiJXcldyV3JXcldyIsIHJlYXNvbiB8IEh0b1QsIDAsCisgICAgICAgICAgQURQX0hhbmRsZVVua25vd24sIEFEUF9IYW5kbGVVbmtub3duLAorICAgICAgICAgIHN1YnJlYXNvbik7CisgIHJlYXNvbiB8PSBUdG9IOworICBlcnIgPSB3YWl0X2Zvcl9kZWJ1Z19tZXNzYWdlKCZyZWFzb24sICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywgJnBhY2tldCk7CisgIGlmIChlcnIgIT0gUkRJRXJyb3JfTm9FcnJvcikgeworICAgIHN0YXR1cyA9IGVycjsKKyAgfSBlbHNlIHsKKyAgICBpbnQgc3I7CisgICAgdW5wYWNrX21lc3NhZ2UoQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlciksICIldyV3JXcldyV3JXcldyIsICZyZWFzb24sICZkZWJ1Z0lELAorICAgICAgICAgICAgICAgICAgICZPU2luZm8xLCAmT1NpbmZvMiwgICZzciwgJnN0YXR1cywgcmVzcCk7CisgICAgaWYgKHN1YnJlYXNvbiAhPSBzcikgc3RhdHVzID0gUkRJRXJyb3JfRXJyb3I7CisgIH0KKyAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGNvbnN0IGhvc3RzZXggPSAxOworCitpbnQgYW5nZWxfUkRJX2luZm8odW5zaWduZWQgdHlwZSwgQVJNd29yZCAqYXJnMSwgQVJNd29yZCAqYXJnMikgeworICBQYWNrZXQgKnBhY2tldCA9IE5VTEw7CisgIGludCBsZW4sIHN0YXR1cywgYywgcmVhc29uLCBzdWJyZWFzb24sIGRlYnVnSUQsIE9TaW5mbzEsIE9TaW5mbzI7CisgIGludCBlcnI9UkRJRXJyb3JfTm9FcnJvciwgY3BudW09MDsKKyAgc3RydWN0IERiZ19Db1Byb0Rlc2MgKmNwZDsKKyAgaW50IGNvdW50LCBpOworICB1bnNpZ25lZCBjaGFyICpicDsKKworI2lmZGVmIERFQlVHCisgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBFbnRlcmVkIGFuZ2VsX1JESV9pbmZvLlxuIik7CisjZW5kaWYKKyAgc3dpdGNoICh0eXBlKSB7CisgIGNhc2UgUkRJSW5mb19UYXJnZXQ6CisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogUkRJSW5mb19UYXJnZXQuXG4iKTsKKyNlbmRpZgorCisgICAgcmVnaXN0ZXJfZGVidWdfbWVzc2FnZV9oYW5kbGVyKCk7CisgICAgbXNnc2VuZChDSV9IQURQLCAiJXcldyV3JXcldyIsIEFEUF9JbmZvIHwgSHRvVCwgMCwKKyAgICAgICAgICAgICAgICAgQURQX0hhbmRsZVVua25vd24sIEFEUF9IYW5kbGVVbmtub3duLCBBRFBfSW5mb19UYXJnZXQpOworICAgIHJlYXNvbiA9IEFEUF9JbmZvIHxUdG9IOworICAgIGVyciA9IHdhaXRfZm9yX2RlYnVnX21lc3NhZ2UoJnJlYXNvbiwgJmRlYnVnSUQsICZPU2luZm8xLCAmT1NpbmZvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMsICZwYWNrZXQpOworICAgIGlmIChlcnIgIT0gUkRJRXJyb3JfTm9FcnJvcikgeworICAgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgdW5wYWNrX21lc3NhZ2UoQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlciksICIldyV3JXcldyV3JXcldyV3IiwgJnJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAmZGVidWdJRCwgJk9TaW5mbzEsICZPU2luZm8yLCAgJnN1YnJlYXNvbiwgJnN0YXR1cywKKyAgICAgICAgICAgICAgICAgICBhcmcxLCBhcmcyKTsKKyAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisKKyAgICBpZiAoc3VicmVhc29uICE9ICBBRFBfSW5mb19UYXJnZXQpCisgICAgICByZXR1cm4gUkRJRXJyb3JfRXJyb3I7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHN0YXR1czsKKworICBjYXNlIFJESVNpZ25hbF9TdG9wOgorI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IFJESVNpZ25hbF9TdG9wLlxuIik7CisgICAgaWYgKGludGVycnVwdF9yZXF1ZXN0KQorICAgICAgIGFuZ2VsX0RlYnVnUHJpbnQoIiAgICAgICBTVElMTCBXQUlUSU5HIHRvIHNlbmQgcHJldmlvdXMgaW50ZXJydXB0IHJlcXVlc3RcbiIpOworI2VuZGlmCisgICAgaW50ZXJydXB0X3JlcXVlc3QgPSBUUlVFOworICAgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOworCisgIGNhc2UgUkRJSW5mb19Qb2ludHM6CisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogUkRJSW5mb19Qb2ludHMuXG4iKTsKKyNlbmRpZgorICAgIHJldHVybiBTZW5kU3ViTWVzc2FnZUdldFdvcmRBbmRDaGVja1JlcGx5KEFEUF9JbmZvLCBBRFBfSW5mb19Qb2ludHMsIGFyZzEpOworCisgIGNhc2UgUkRJSW5mb19TdGVwOgorI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IFJESUluZm9fU3RlcC5cbiIpOworI2VuZGlmCisgICAgcmV0dXJuIFNlbmRTdWJNZXNzYWdlR2V0V29yZEFuZENoZWNrUmVwbHkoQURQX0luZm8sIEFEUF9JbmZvX1N0ZXAsIGFyZzEpOworCisgIGNhc2UgUkRJU2V0X0NtZGxpbmU6CisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogUkRJU2V0X0NtZGxpbmUuXG4iKTsKKyNlbmRpZgorICAgIGlmIChhcmRpX2NvbW1hbmRsaW5lICE9ICZkdW1teWNsaW5lKQorICAgICAgZnJlZShhcmRpX2NvbW1hbmRsaW5lKTsKKyAgICBhcmRpX2NvbW1hbmRsaW5lID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKChjaGFyKilhcmcxKSArIDEpIDsKKyAgICAodm9pZClzdHJjcHkoYXJkaV9jb21tYW5kbGluZSwgKGNoYXIgKilhcmcxKSA7CisgICAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7CisKKyAgY2FzZSBSRElJbmZvX1NldExvZzoKKyNpZmRlZiBERUJVRworICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBSRElJbmZvX1NldExvZy5cbiIpOworI2VuZGlmCisgICAgcmRpX2xvZyA9IChpbnQpICphcmcxOworICAgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOworCisgIGNhc2UgUkRJSW5mb19Mb2c6CisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogUkRJSW5mb19Mb2cuXG4iKTsKKyNlbmRpZgorICAgICphcmcxID0gcmRpX2xvZzsKKyAgICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKKworCisgIGNhc2UgUkRJSW5mb19NTVU6CisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogUkRJSW5mb19NTVUuXG4iKTsKKyNlbmRpZgorICAgIHJldHVybiBTZW5kU3ViTWVzc2FnZUdldFdvcmRBbmRDaGVja1JlcGx5KEFEUF9JbmZvLCBBRFBfSW5mb19NTVUsIGFyZzEpOworCisgIGNhc2UgUkRJSW5mb19TZW1pSG9zdGluZzoKKyNpZmRlZiBERUJVRworICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBSRElJbmZvX1NlbWlIb3N0aW5nLlxuIik7CisjZW5kaWYKKyAgICByZXR1cm4gU2VuZFN1Yk1lc3NhZ2VBbmRDaGVja1JlcGx5KEFEUF9JbmZvLCBBRFBfSW5mb19TZW1pSG9zdGluZyk7CisKKyAgY2FzZSBSRElJbmZvX0NvUHJvOgorI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IFJESUluZm9fQ29Qcm8uXG4iKTsKKyNlbmRpZgorICAgIHJldHVybiBTZW5kU3ViTWVzc2FnZUFuZENoZWNrUmVwbHkoQURQX0luZm8sIEFEUF9JbmZvX0NvUHJvKTsKKworICBjYXNlIFJESUN5Y2xlczoKKyNpZmRlZiBERUJVRworICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBSRElDeWNsZXMuXG4iKTsKKyNlbmRpZgorICAgIHJlZ2lzdGVyX2RlYnVnX21lc3NhZ2VfaGFuZGxlcigpOworICAgIG1zZ3NlbmQoQ0lfSEFEUCwgIiV3JXcldyV3JXciLCBBRFBfSW5mbyB8IEh0b1QsIDAsCisgICAgICAgICAgICBBRFBfSGFuZGxlVW5rbm93biwgQURQX0hhbmRsZVVua25vd24sIEFEUF9JbmZvX0N5Y2xlcyk7CisgICAgcmVhc29uID0gQURQX0luZm8gfFR0b0g7CisgICAgZXJyID0gd2FpdF9mb3JfZGVidWdfbWVzc2FnZSgmcmVhc29uLCAmZGVidWdJRCwgJk9TaW5mbzEsICZPU2luZm8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywgJnBhY2tldCk7CisgICAgaWYgKGVyciAhPSBSRElFcnJvcl9Ob0Vycm9yKSB7CisgICAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICB1bnBhY2tfbWVzc2FnZShCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSwgIiV3JXcldyV3JXcldyIsICZyZWFzb24sICZkZWJ1Z0lELAorICAgICAgICAgICAgICAgICAmT1NpbmZvMSwgJk9TaW5mbzIsICAmc3VicmVhc29uLCAmc3RhdHVzKTsKKyAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgICAgaWYgKHN1YnJlYXNvbiAhPSAgQURQX0luZm9fQ3ljbGVzKQorICAgICAgcmV0dXJuIFJESUVycm9yX0Vycm9yOworICAgIGlmIChzdGF0dXMgIT0gUkRJRXJyb3JfTm9FcnJvcikgcmV0dXJuIHN0YXR1czsKKyAgICBmb3IgKGM9MDsgYzwxMjsgYysrKQorICAgICAgYXJnMVtjXT1HRVQzMkxFKEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpKzI0KyhjKjQpKTsKKyAgICByZXR1cm4gc3RhdHVzOworCisgIGNhc2UgUkRJSW5mb19EZXNjcmliZUNvUHJvOgorI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IFJESUluZm9fRGVzY3JpYmVDb1Byby5cbiIpOworI2VuZGlmCisgICAgY3BudW0gPSAqKGludCAqKWFyZzE7CisgICAgY3BkID0gKHN0cnVjdCBEYmdfQ29Qcm9EZXNjICopYXJnMjsKKyAgICBwYWNrZXQgPSBEZXZTV19BbGxvY2F0ZVBhY2tldChBcm1zZF9CdWZmZXJTaXplKTsKKyAgICBpZiAoYW5nZWxfUkRJX2luZm8oQURQX0luZm9fQ29Qcm8sIE5VTEwsIE5VTEwpICE9IFJESUVycm9yX05vRXJyb3IpCisgICAgICByZXR1cm4gUkRJRXJyb3JfRXJyb3I7CisgICAgbGVuID0gbXNnYnVpbGQoQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlciksICIldyV3JXcldyV3IiwgQURQX0luZm8gfCBIdG9ULCAwLAorICAgICAgICAgICAgICAgICAgIEFEUF9IYW5kbGVVbmtub3duLCBBRFBfSGFuZGxlVW5rbm93biwKKyAgICAgICAgICAgICAgICAgICBBRFBfSW5mb19EZXNjcmliZUNvUHJvKTsKKyAgICBsZW4gKz1tc2didWlsZChCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSsyMCwgIiViJWIlYiViJWIiLCBjcG51bSwKKyAgICAgICAgICAgICAgICAgICBjcGQtPnJlZ2Rlc2NbY3BudW1dLnJtaW4sIGNwZC0+cmVnZGVzY1tjcG51bV0ucm1heCwKKyAgICAgICAgICAgICAgICAgICBjcGQtPnJlZ2Rlc2NbY3BudW1dLm5ieXRlcywgY3BkLT5yZWdkZXNjW2NwbnVtXS5hY2Nlc3MpOworICAgIGlmIChjcGQtPnJlZ2Rlc2NbY3BudW1dLmFjY2VzcyYweDMgPT0gMHgzKXsKKyAgICAgIGxlbiArPSBtc2didWlsZChCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSsyNSwgIiViJWIlYiViJWIiLAorICAgICAgICAgICAgICAgICAgICAgIGNwZC0+cmVnZGVzY1tjcG51bV0uYWNjZXNzaW5zdC5jcHJ0LnJlYWRfYjAsCisgICAgICAgICAgICAgICAgICAgICAgY3BkLT5yZWdkZXNjW2NwbnVtXS5hY2Nlc3NpbnN0LmNwcnQucmVhZF9iMSwKKyAgICAgICAgICAgICAgICAgICAgICBjcGQtPnJlZ2Rlc2NbY3BudW1dLmFjY2Vzc2luc3QuY3BydC53cml0ZV9iMCwKKyAgICAgICAgICAgICAgICAgICAgICBjcGQtPnJlZ2Rlc2NbY3BudW1dLmFjY2Vzc2luc3QuY3BydC53cml0ZV9iMSwgMHhmZik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgbGVuICs9IG1zZ2J1aWxkKEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpKzI1LCAiJWIlYiViJWIlYiUiLAorICAgICAgICAgICAgICAgICAgICAgIGNwZC0+cmVnZGVzY1tjcG51bV0uYWNjZXNzaW5zdC5jcGR0LnJkYml0cywKKyAgICAgICAgICAgICAgICAgICAgICBjcGQtPnJlZ2Rlc2NbY3BudW1dLmFjY2Vzc2luc3QuY3BkdC5uYml0LDAsMCwgMHhmZik7CisgICAgfQorICAgIHJlZ2lzdGVyX2RlYnVnX21lc3NhZ2VfaGFuZGxlcigpOworICAgIHBhY2tldC0+cGtfbGVuZ3RoID0gbGVuOworICAgIEFkcF9DaGFubmVsV3JpdGUoQ0lfSEFEUCwgcGFja2V0KTsgLyogVHJhbnNtaXQgbWVzc2FnZS4gKi8KKyAgICByZWFzb24gPSBBRFBfSW5mbyB8VHRvSDsKKyAgICBlcnIgPSB3YWl0X2Zvcl9kZWJ1Z19tZXNzYWdlKCZyZWFzb24sICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMsICZwYWNrZXQpOworICAgIGlmIChlcnIgIT0gUkRJRXJyb3JfTm9FcnJvcikgeworICAgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgdW5wYWNrX21lc3NhZ2UoQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlciksICIldyV3JXcldyV3JXciLCAmcmVhc29uLCAmZGVidWdJRCwKKyAgICAgICAgICAgICAgICAgICAmT1NpbmZvMSwgJk9TaW5mbzIsICZzdWJyZWFzb24sICZzdGF0dXMpOworICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgICBpZiAoc3VicmVhc29uICE9IEFEUF9JbmZvX0Rlc2NyaWJlQ29Qcm8pCisgICAgICByZXR1cm4gUkRJRXJyb3JfRXJyb3I7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHN0YXR1czsKKworICBjYXNlIFJESUluZm9fUmVxdWVzdENvUHJvRGVzYzoKKyNpZmRlZiBERUJVRworICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBSRElJbmZvX1JlcXVlc3RDb1Byb0Rlc2MuXG4iKTsKKyNlbmRpZgorICAgIGNwbnVtID0gKihpbnQgKilhcmcxOworICAgIGNwZCA9IChzdHJ1Y3QgRGJnX0NvUHJvRGVzYyAqKWFyZzI7CisgICAgcGFja2V0ID0gRGV2U1dfQWxsb2NhdGVQYWNrZXQoQXJtc2RfQnVmZmVyU2l6ZSk7CisgICAgbGVuID0gbXNnYnVpbGQoQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlciksICIldyV3JXcldyV3IiwgQURQX0luZm8gfCBIdG9ULCAwLAorICAgICAgICAgICAgICAgICAgIEFEUF9IYW5kbGVVbmtub3duLCBBRFBfSGFuZGxlVW5rbm93biwKKyAgICAgICAgICAgICAgICAgICBBRFBfSW5mb19SZXF1ZXN0Q29Qcm9EZXNjKTsKKyAgICBsZW4gKz0gbXNnYnVpbGQoQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlcikrMjAsICIlYiIsICooaW50ICopYXJnMSk7CisgICAgcGFja2V0LT5wa19sZW5ndGggPSBsZW47CisgICAgcmVnaXN0ZXJfZGVidWdfbWVzc2FnZV9oYW5kbGVyKCk7CisgICAgQWRwX0NoYW5uZWxXcml0ZShDSV9IQURQLCBwYWNrZXQpOyAvKiBUcmFuc21pdCBtZXNzYWdlLiAqLworICAgIHJlYXNvbiA9IEFEUF9JbmZvIHxUdG9IOworICAgIGVyciA9IHdhaXRfZm9yX2RlYnVnX21lc3NhZ2UoJnJlYXNvbiwgJmRlYnVnSUQsICZPU2luZm8xLCAmT1NpbmZvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMsICZwYWNrZXQpOworICAgIGlmIChlcnIgIT0gUkRJRXJyb3JfTm9FcnJvcikgeworICAgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgY291bnQgPSB1bnBhY2tfbWVzc2FnZShCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSwgIiV3JXcldyV3JXcldyIsICZyZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVidWdJRCwgJk9TaW5mbzEsICZPU2luZm8yLCAgJnN1YnJlYXNvbiwgJnN0YXR1cyk7CisgICAgaWYgKHN1YnJlYXNvbiAhPSAgQURQX0luZm9fUmVxdWVzdENvUHJvRGVzYykgeworICAgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICAgICAgcmV0dXJuIFJESUVycm9yX0Vycm9yOworICAgIH0gZWxzZSBpZiAoIHN0YXR1cyAhPSBSRElFcnJvcl9Ob0Vycm9yICkgeworICAgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9IGVsc2UgeworICAgICAgYnAgPSBCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKStjb3VudDsKKyAgICAgIGZvciAoIGkgPSAwOyAqYnAgIT0gMHhGRiAmJiBpIDwgY3BkLT5lbnRyaWVzOyArK2kgKSB7CisgICAgICAgIGNwZC0+cmVnZGVzY1tpXS5ybWluID0gKmJwKys7CisgICAgICAgIGNwZC0+cmVnZGVzY1tpXS5ybWF4ID0gKmJwKys7CisgICAgICAgIGNwZC0+cmVnZGVzY1tpXS5uYnl0ZXMgPSAqYnArKzsKKyAgICAgICAgY3BkLT5yZWdkZXNjW2ldLmFjY2VzcyA9ICpicCsrOworICAgICAgfQorICAgICAgY3BkLT5lbnRyaWVzID0gaTsKKyAgICAgIGlmICggKmJwICE9IDB4RkYgKQorICAgICAgICBzdGF0dXMgPSBSRElFcnJvcl9CdWZmZXJGdWxsOworICAgICAgZWxzZQorICAgICAgICBTZXRDUFdvcmRzKCBjcG51bSwgY3BkICk7CisgICAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICBjYXNlIFJESUluZm9fR2V0TG9hZFNpemU6CisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogQURQX0luZm9fQW5nZWxCdWZmZXJTaXplLlxuIik7CisjZW5kaWYKKyAgICByZWdpc3Rlcl9kZWJ1Z19tZXNzYWdlX2hhbmRsZXIoKTsKKyAgICBtc2dzZW5kKENJX0hBRFAsICIldyV3JXcldyV3IiwgQURQX0luZm8gfCBIdG9ULCAwLAorICAgICAgICAgICAgQURQX0hhbmRsZVVua25vd24sIEFEUF9IYW5kbGVVbmtub3duLAorICAgICAgICAgICAgQURQX0luZm9fQW5nZWxCdWZmZXJTaXplKTsKKyAgICByZWFzb24gPSBBRFBfSW5mbyB8VHRvSDsKKyAgICBlcnIgPSB3YWl0X2Zvcl9kZWJ1Z19tZXNzYWdlKCZyZWFzb24sICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzLCAmcGFja2V0KTsKKyAgICBpZiAoZXJyICE9IFJESUVycm9yX05vRXJyb3IpIHsKKyAgICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIHVucGFja19tZXNzYWdlKEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpLCAiJXcldyV3JXcldyV3IiwgJnJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAmZGVidWdJRCwgJk9TaW5mbzEsICZPU2luZm8yLCAgJnN1YnJlYXNvbiwgJnN0YXR1cyk7CisgICAgaWYgKHN1YnJlYXNvbiAhPSAgQURQX0luZm9fQW5nZWxCdWZmZXJTaXplKSB7CisgICAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgICAgICByZXR1cm4gUkRJRXJyb3JfRXJyb3I7CisgICAgfQorICAgIGVsc2UgeworICAgICAgd29yZCBkZWZhdWx0c2l6ZSwgbG9uZ3NpemU7CisgICAgICB1bnBhY2tfbWVzc2FnZShCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSsyNCwgIiV3JXciLAorICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRzaXplLCAmbG9uZ3NpemUpOworICAgICAgKmFyZzEgPSBsb25nc2l6ZSAtIEFEUF9Xcml0ZUhlYWRlclNpemU7ICAgLyogc3BhY2UgZm9yIEFEUCBoZWFkZXIgKi8KKyNpZmRlZiBNT05JVE9SX0RPV05MT0FEX1BBQ0tFVFMKKyAgICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBBRFBfSW5mb19BbmdlbEJ1ZmZlclNpemU6IGdvdCAoJWQsICVkKSwgcmV0dXJuaW5nICVkLlxuIiwKKyAgICAgICAgICAgICBkZWZhdWx0c2l6ZSwgbG9uZ3NpemUsICphcmcxKTsKKyNlbmRpZgorICAgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgY2FzZSBSRElWZWN0b3JfQ2F0Y2g6CisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogQURQX0N0cmxfVmVjdG9yQ2F0Y2ggJWx4LlxuIiwgKmFyZzEpOworI2VuZGlmCisgICAgcmV0dXJuIFNlbmRTdWJNZXNzYWdlV29yZEFuZENoZWNrUmVwbHkoQURQX0NvbnRyb2wsIEFEUF9DdHJsX1ZlY3RvckNhdGNoLCAqYXJnMSk7CisKKyAgY2FzZSBSRElTZW1pSG9zdGluZ19TZXRTdGF0ZToKKyNpZmRlZiBERUJVRworICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBBRFBfQ3RybF9TZW1pSG9zdGluZ19TZXRTdGF0ZSAlbHguXG4iLCAqYXJnMSk7CisjZW5kaWYKKyAgICByZXR1cm4gU2VuZFN1Yk1lc3NhZ2VXb3JkQW5kQ2hlY2tSZXBseShBRFBfQ29udHJvbCwgQURQX0N0cmxfU2VtaUhvc3RpbmdfU2V0U3RhdGUsICphcmcxKTsKKworICBjYXNlIFJESVNlbWlIb3N0aW5nX0dldFN0YXRlOgorI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IEFEUF9DdHJsX1NlbWlIb3N0aW5nX0dldFN0YXRlLlxuIik7CisjZW5kaWYKKyAgICByZXR1cm4gU2VuZFN1Yk1lc3NhZ2VHZXRXb3JkQW5kQ2hlY2tSZXBseShBRFBfQ29udHJvbCwgQURQX0N0cmxfU2VtaUhvc3RpbmdfR2V0U3RhdGUsIGFyZzEpOworCisgIGNhc2UgUkRJU2VtaUhvc3RpbmdfU2V0VmVjdG9yOgorI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IEFEUF9DdHJsX1NlbWlIb3N0aW5nX1NldFZlY3RvciAlbHguXG4iLCAqYXJnMSk7CisjZW5kaWYKKyAgICByZXR1cm4gU2VuZFN1Yk1lc3NhZ2VXb3JkQW5kQ2hlY2tSZXBseShBRFBfQ29udHJvbCwgQURQX0N0cmxfU2VtaUhvc3RpbmdfU2V0VmVjdG9yLCAqYXJnMSk7CisKKyAgY2FzZSBSRElTZW1pSG9zdGluZ19HZXRWZWN0b3I6CisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogQURQX0N0cmxfU2VtaUhvc3RpbmdfR2V0VmVjdG9yLlxuIik7CisjZW5kaWYKKyAgICByZXR1cm4gU2VuZFN1Yk1lc3NhZ2VHZXRXb3JkQW5kQ2hlY2tSZXBseShBRFBfQ29udHJvbCwgQURQX0N0cmxfU2VtaUhvc3RpbmdfR2V0VmVjdG9yLCBhcmcxKTsKKworICBjYXNlIFJESVNlbWlIb3N0aW5nX1NldEFSTVNXSToKKyNpZmRlZiBERUJVRworICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBBRFBfQ3RybF9TZW1pSG9zdGluZ19TZXRBUk1TV0kuXG4iKTsKKyNlbmRpZgorICAgIHJldHVybiBTZW5kU3ViTWVzc2FnZVdvcmRBbmRDaGVja1JlcGx5KEFEUF9Db250cm9sLCBBRFBfQ3RybF9TZW1pSG9zdGluZ19TZXRBUk1TV0ksICphcmcxKTsKKworICBjYXNlIFJESVNlbWlIb3N0aW5nX0dldEFSTVNXSToKKyNpZmRlZiBERUJVRworICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBBRFBfQ3RybF9TZW1pSG9zdGluZ19HZXRBUk1TV0kuXG4iKTsKKyNlbmRpZgorICAgIHJldHVybiBTZW5kU3ViTWVzc2FnZUdldFdvcmRBbmRDaGVja1JlcGx5KEFEUF9Db250cm9sLCBBRFBfQ3RybF9TZW1pSG9zdGluZ19HZXRBUk1TV0ksIGFyZzEpOworCisgIGNhc2UgUkRJU2VtaUhvc3RpbmdfU2V0VGh1bWJTV0k6CisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogQURQX0N0cmxfU2VtaUhvc3RpbmdfU2V0VGh1bWJTV0kuXG4iKTsKKyNlbmRpZgorICAgIHJldHVybiBTZW5kU3ViTWVzc2FnZVdvcmRBbmRDaGVja1JlcGx5KEFEUF9Db250cm9sLCBBRFBfQ3RybF9TZW1pSG9zdGluZ19TZXRUaHVtYlNXSSwgKmFyZzEpOworCisgIGNhc2UgUkRJU2VtaUhvc3RpbmdfR2V0VGh1bWJTV0k6CisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogQURQX0N0cmxfU2VtaUhvc3RpbmdfR2V0VGh1bWJTV0kuXG4iKTsKKyNlbmRpZgorICAgIHJldHVybiBTZW5kU3ViTWVzc2FnZUdldFdvcmRBbmRDaGVja1JlcGx5KEFEUF9Db250cm9sLCBBRFBfQ3RybF9TZW1pSG9zdGluZ19HZXRUaHVtYlNXSSwgYXJnMSk7CisKKyAgY2FzZSBSRElJbmZvX1NldFRvcE1lbToKKyNpZmRlZiBERUJVRworICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBBRFBfQ3RybF9TZXRUb3BNZW0uXG4iKTsKKyNlbmRpZgorICAgIHJldHVybiBTZW5kU3ViTWVzc2FnZVdvcmRBbmRDaGVja1JlcGx5KEFEUF9Db250cm9sLCBBRFBfQ3RybF9TZXRUb3BNZW0sICphcmcxKTsKKworICBjYXNlIFJESVBvaW50U3RhdHVzX1dhdGNoOgorI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IEFEUF9DdHJsX1BvaW50U3RhdHVzX1dhdGNoLlxuIik7CisjZW5kaWYKKyAgICByZWdpc3Rlcl9kZWJ1Z19tZXNzYWdlX2hhbmRsZXIoKTsKKyAgICBtc2dzZW5kKENJX0hBRFAsICIldyV3JXcldyV3JXciLCBBRFBfQ29udHJvbCB8IEh0b1QsIDAsCisgICAgICAgICAgICBBRFBfSGFuZGxlVW5rbm93biwgQURQX0hhbmRsZVVua25vd24sCisgICAgICAgICAgICBBRFBfQ3RybF9Qb2ludFN0YXR1c19XYXRjaCwgKmFyZzEgKTsKKyAgICByZWFzb24gPSBBRFBfQ29udHJvbCB8VHRvSDsKKyAgICBlcnIgPSB3YWl0X2Zvcl9kZWJ1Z19tZXNzYWdlKCZyZWFzb24sICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzLCAmcGFja2V0KTsKKyAgICBpZiAoZXJyICE9IFJESUVycm9yX05vRXJyb3IpIHsKKyAgICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIHVucGFja19tZXNzYWdlKEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpLCAiJXcldyV3JXcldyV3JXcldyIsICZyZWFzb24sCisgICAgICAgICAgICAgICAgICAgJmRlYnVnSUQsICZPU2luZm8xLCAmT1NpbmZvMiwgICZzdWJyZWFzb24sICZzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgYXJnMSwgYXJnMik7CisgICAgaWYgKHN1YnJlYXNvbiAhPSAgQURQX0N0cmxfUG9pbnRTdGF0dXNfV2F0Y2gpIHsKKyAgICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgICAgIHJldHVybiBSRElFcnJvcl9FcnJvcjsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIHN0YXR1czsKKworICBjYXNlIFJESVBvaW50U3RhdHVzX0JyZWFrOgorI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IEFEUF9DdHJsX1BvaW50U3RhdHVzX0JyZWFrLlxuIik7CisjZW5kaWYKKyAgICByZWdpc3Rlcl9kZWJ1Z19tZXNzYWdlX2hhbmRsZXIoKTsKKyAgICBtc2dzZW5kKENJX0hBRFAsICIldyV3JXcldyV3JXciLCBBRFBfQ29udHJvbCB8IEh0b1QsIDAsCisgICAgICAgICAgICBBRFBfSGFuZGxlVW5rbm93biwgQURQX0hhbmRsZVVua25vd24sCisgICAgICAgICAgICBBRFBfQ3RybF9Qb2ludFN0YXR1c19CcmVhaywgKmFyZzEgKTsKKyAgICByZWFzb24gPSBBRFBfQ29udHJvbCB8VHRvSDsKKyAgICBlcnIgPSB3YWl0X2Zvcl9kZWJ1Z19tZXNzYWdlKCZyZWFzb24sICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzLCAmcGFja2V0KTsKKyAgICBpZiAoZXJyICE9IFJESUVycm9yX05vRXJyb3IpIHsKKyAgICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIHVucGFja19tZXNzYWdlKEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpLCAiJXcldyV3JXcldyV3JXcldyIsICZyZWFzb24sCisgICAgICAgICAgICAgICAgICAgJmRlYnVnSUQsICZPU2luZm8xLCAmT1NpbmZvMiwgICZzdWJyZWFzb24sICZzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgYXJnMSwgYXJnMik7CisgICAgaWYgKHN1YnJlYXNvbiAhPSAgQURQX0N0cmxfUG9pbnRTdGF0dXNfQnJlYWspIHsKKyAgICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgICAgIHJldHVybiBSRElFcnJvcl9FcnJvcjsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIHN0YXR1czsKKworICBjYXNlIFJESUluZm9fRG93bkxvYWQ6CisjaWZkZWYgREVCVUcKKyAgICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogQURQX0N0cmxfRG93bmxvYWRfU3VwcG9ydGVkLlxuIik7CisjZW5kaWYKKyAgICByZXR1cm4gU2VuZFN1Yk1lc3NhZ2VBbmRDaGVja1JlcGx5KEFEUF9Db250cm9sLCBBRFBfQ3RybF9Eb3dubG9hZF9TdXBwb3J0ZWQpOworCisgIGNhc2UgUkRJQ29uZmlnX0NvdW50OgorI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IEFEUF9JQ0VNX0NvbmZpZ0NvdW50LlxuIik7CisjZW5kaWYKKyAgICByZXR1cm4gU2VuZFN1Yk1lc3NhZ2VHZXRXb3JkQW5kQ2hlY2tSZXBseShBRFBfSUNFbWFuLCBBRFBfSUNFTV9Db25maWdDb3VudCwgYXJnMSk7CisKKyAgY2FzZSBSRElDb25maWdfTnRoOgorI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IEFEUF9JQ0VNX0NvbmZpZ050aC5cbiIpOworI2VuZGlmCisgICAgcmVnaXN0ZXJfZGVidWdfbWVzc2FnZV9oYW5kbGVyKCk7CisgICAgbXNnc2VuZChDSV9IQURQLCAiJXcldyV3JXcldyV3IiwgQURQX0lDRW1hbiB8IEh0b1QsIDAsCisgICAgICAgICAgICBBRFBfSGFuZGxlVW5rbm93biwgQURQX0hhbmRsZVVua25vd24sCisgICAgICAgICAgICBBRFBfSUNFTV9Db25maWdOdGgsICphcmcxICk7CisgICAgcmVhc29uID0gQURQX0lDRW1hbiB8VHRvSDsKKyAgICBlcnIgPSB3YWl0X2Zvcl9kZWJ1Z19tZXNzYWdlKCZyZWFzb24sICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzLCAmcGFja2V0KTsKKyAgICBpZiAoZXJyICE9IFJESUVycm9yX05vRXJyb3IpIHsKKyAgICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfSBlbHNlIHsKKyAgICAgIFJESV9Db25maWdEZXNjICpjZCA9IChSRElfQ29uZmlnRGVzYyAqKWFyZzI7CisgICAgICB1bnNpZ25lZCBjaGFyIG47CisgICAgICBsZW4gPSB1bnBhY2tfbWVzc2FnZShCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSwgIiV3JXcldyV3JXcldyV3JWIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYXNvbiwgJmRlYnVnSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmT1NpbmZvMSwgJk9TaW5mbzIsICAmc3VicmVhc29uLCAmc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNkLT52ZXJzaW9uLCAmbik7CisgICAgICBpZiAoc3VicmVhc29uICE9ICBBRFBfSUNFTV9Db25maWdOdGgpIHsKKyAgICAgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICAgICAgICByZXR1cm4gUkRJRXJyb3JfRXJyb3I7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgbWVtY3B5KCBjZC0+bmFtZSwgQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlcikrbGVuLCBuKzEgKTsKKyAgICAgICAgY2QtPm5hbWVbbl0gPSAwOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgfQorICAgIH0KKworICBjYXNlIFJESUluZm9fSWNlYnJlYWtlcjoKKyNpZmRlZiBERUJVRworICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBBRFBfSUNFQl9FeGlzdHMuXG4iKTsKKyNlbmRpZgorICAgIHJldHVybiBTZW5kU3ViTWVzc2FnZUFuZENoZWNrUmVwbHkoQURQX0lDRWJyZWFrZXJIQURQLCBBRFBfSUNFQl9FeGlzdHMpOworCisgIGNhc2UgUkRJSWNlYnJlYWtlcl9HZXRMb2NrczoKKyNpZmRlZiBERUJVRworICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBBRFBfSUNFQl9HZXRMb2Nrcy5cbiIpOworI2VuZGlmCisgICAgcmV0dXJuIFNlbmRTdWJNZXNzYWdlR2V0V29yZEFuZENoZWNrUmVwbHkoQURQX0lDRWJyZWFrZXJIQURQLCBBRFBfSUNFQl9HZXRMb2NrcywgYXJnMSk7CisKKyAgY2FzZSBSRElJY2VicmVha2VyX1NldExvY2tzOgorI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IEFEUF9JQ0VCX1NldExvY2tzLlxuIik7CisjZW5kaWYKKyAgICByZXR1cm4gU2VuZFN1Yk1lc3NhZ2VXb3JkQW5kQ2hlY2tSZXBseShBRFBfSUNFYnJlYWtlckhBRFAsIEFEUF9JQ0VCX1NldExvY2tzLCAqYXJnMSk7CisKKyAgY2FzZSBSRElDb21tc0NoYW5uZWxfVG9Ib3N0OgorI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IEFEUF9JQ0VCX0NDX0Nvbm5lY3RfVG9Ib3N0LlxuIik7CisjZW5kaWYKKyAgICBpZiAoIGFuZ2VsX2NjX2V4aXN0cygpID09IFJESUVycm9yX05vRXJyb3IgKSB7CisKKyAgICAvKgorICAgICAqIFRoZSBmb2xsb3dpbmcgdGhyZWUgbGluZXMgb2YgY29kZSBoYXZlIHRvIGJlIHJlbW92ZWQgaW4gb3JkZXIgdG8gZ2V0CisgICAgICogdGhlIFdpbmRvd3MgQW5nZWwgQ2hhbm5lbCBWaWV3ZXIgd29ya2luZyB3aXRoIHRoZSBUaHVtYiBjb21tcyBjaGFubmVsLgorICAgICAqIEF0IHRoZSBtb21lbnQgaXQgYWxsb3dzIHRoZSBBUk1TRCBjb21tYW5kIGxpbmUgdG8gcmVnaXN0ZXIgYSBDQ0lOL0NDT1VUCisgICAgICogY2FsbGJhY2sgd2hpY2ggc3RvcHMgdGhlIEFDViB3b3JraW5nIQorICAgICAqLworI2lmZGVmIF9fdW5peAorICAgICAgY2NzdGF0ZS50b2hvc3QgPSAoUkRJQ0NQcm9jX1RvSG9zdCAqKWFyZzE7CisgICAgICBjY3N0YXRlLnRvaG9zdGFyZyA9IGFyZzI7CisgICAgICBhbmdlbF9jaGVja19EQ0NfaGFuZGxlciggJmNjc3RhdGUgKTsKKyNlbmRpZgorI2lmZGVmIF9XSU4zMgorICAgICAgCisjZW5kaWYKKworICAgICAgcmVnaXN0ZXJfZGVidWdfbWVzc2FnZV9oYW5kbGVyKCk7CisgICAgICBtc2dzZW5kKENJX0hBRFAsICIldyV3JXcldyV3JWIiLCBBRFBfSUNFYnJlYWtlckhBRFAgfCBIdG9ULCAwLAorICAgICAgICAgICAgICBBRFBfSGFuZGxlVW5rbm93biwgQURQX0hhbmRsZVVua25vd24sCisgICAgICAgICAgICAgIEFEUF9JQ0VCX0NDX0Nvbm5lY3RfVG9Ib3N0LCAoYXJnMSAhPSBOVUxMKSApOworICAgICAgcmV0dXJuIENoZWNrU3ViTWVzc2FnZVJlcGx5KEFEUF9JQ0VicmVha2VySEFEUCwgQURQX0lDRUJfQ0NfQ29ubmVjdF9Ub0hvc3QpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gUkRJRXJyb3JfVW5pbXBsZW1lbnRlZE1lc3NhZ2U7CisgICAgfQorCisgIGNhc2UgUkRJQ29tbXNDaGFubmVsX0Zyb21Ib3N0OgorI2lmZGVmIERFQlVHCisgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IEFEUF9JQ0VCX0NDX0Nvbm5lY3RfRnJvbUhvc3QuXG4iKTsKKyNlbmRpZgorICAgIGlmICggYW5nZWxfY2NfZXhpc3RzKCkgPT0gUkRJRXJyb3JfTm9FcnJvciApIHsKKworICAgICAgY2NzdGF0ZS5mcm9taG9zdCA9IChSRElDQ1Byb2NfRnJvbUhvc3QgKilhcmcxOworICAgICAgY2NzdGF0ZS5mcm9taG9zdGFyZyA9IGFyZzI7CisgICAgICBhbmdlbF9jaGVja19EQ0NfaGFuZGxlciggJmNjc3RhdGUgKTsKKworICAgICAgcmVnaXN0ZXJfZGVidWdfbWVzc2FnZV9oYW5kbGVyKCk7CisgICAgICBtc2dzZW5kKENJX0hBRFAsICIldyV3JXcldyV3JWIiLCBBRFBfSUNFYnJlYWtlckhBRFAgfCBIdG9ULCAwLAorICAgICAgICAgICAgICBBRFBfSGFuZGxlVW5rbm93biwgQURQX0hhbmRsZVVua25vd24sCisgICAgICAgICAgICAgIEFEUF9JQ0VCX0NDX0Nvbm5lY3RfRnJvbUhvc3QsIChhcmcxICE9IE5VTEwpICk7CisgICAgICByZXR1cm4gQ2hlY2tTdWJNZXNzYWdlUmVwbHkoQURQX0lDRWJyZWFrZXJIQURQLCBBRFBfSUNFQl9DQ19Db25uZWN0X0Zyb21Ib3N0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFJESUVycm9yX1VuaW1wbGVtZW50ZWRNZXNzYWdlOworICAgIH0KKworICBjYXNlIFJESVByb2ZpbGVfU3RvcDoKKyAgICByZXR1cm4gU2VuZFN1Yk1lc3NhZ2VBbmRDaGVja1JlcGx5KEFEUF9Qcm9maWxlLCBBRFBfUHJvZmlsZV9TdG9wKTsKKworICBjYXNlIFJESVByb2ZpbGVfQ2xlYXJDb3VudHM6CisgICAgcmV0dXJuIFNlbmRTdWJNZXNzYWdlQW5kQ2hlY2tSZXBseShBRFBfUHJvZmlsZSwgQURQX1Byb2ZpbGVfQ2xlYXJDb3VudHMpOworCisgIGNhc2UgUkRJUHJvZmlsZV9TdGFydDoKKyNpZmRlZiBERUJVRworICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBBRFBfUHJvZmlsZV9TdGFydCAlbGQuXG4iLCAobG9uZykqYXJnMSk7CisjZW5kaWYKKyAgICByZXR1cm4gU2VuZFN1Yk1lc3NhZ2VXb3JkQW5kQ2hlY2tSZXBseShBRFBfUHJvZmlsZSwgQURQX1Byb2ZpbGVfU3RhcnQsICphcmcxKTsKKworICBjYXNlIFJESVByb2ZpbGVfV3JpdGVNYXA6CisgICAgeyBSRElfUHJvZmlsZU1hcCAqbWFwID0gKFJESV9Qcm9maWxlTWFwICopYXJnMTsKKyAgICAgIGludDMyIG1hcGxlbiA9IG1hcC0+bGVuLAorICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgc2l6ZTsKKyAgICAgIGludDMyIGNodW5rID0gKEFybXNkX0xvbmdCdWZTaXplLUNIQU5fSEVBREVSX1NJWkUtQURQX1Byb2ZpbGVXcml0ZUhlYWRlclNpemUpIC8gc2l6ZW9mKEFSTXdvcmQpOworICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBudW1iZXIgb2Ygd29yZHMgc2VuZGFibGUgaW4gb25lIG1lc3NhZ2UgKi8KKyAgICAgIGludCBvbGRyZXYgPSBieXRlc2V4X3JldmVyc2luZygpOworICAgICAgaW50IGhvc3RfbGl0dGxlID0gKih1aW50OCBjb25zdCAqKSZob3N0c2V4OworI2lmZGVmIERFQlVHCisgICAgICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogQURQX1Byb2ZpbGVfV3JpdGVNYXAgJWxkLlxuIiwgbWFwbGVuKTsKKyNlbmRpZgorICAgICAgc3RhdHVzID0gUkRJRXJyb3JfTm9FcnJvcjsKKyAgICAgIGlmICghaG9zdF9saXR0bGUpIHsKKyAgICAgICAgYnl0ZXNleF9yZXZlcnNlKDEpOworICAgICAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IG1hcGxlbjsgb2Zmc2V0KyspCisgICAgICAgICAgbWFwLT5tYXBbb2Zmc2V0XSA9IGJ5dGVzZXhfaG9zdHZhbChtYXAtPm1hcFtvZmZzZXRdKTsKKyAgICAgIH0KKyAgICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbWFwbGVuOyBvZmZzZXQgKz0gc2l6ZSkgeworICAgICAgICB1bnNpZ25lZCBoZHJsZW47CisgICAgICAgIHNpemUgPSBtYXBsZW4gLSBvZmZzZXQ7CisgICAgICAgIHBhY2tldCA9IChQYWNrZXQgKilEZXZTV19BbGxvY2F0ZVBhY2tldChBcm1zZF9Mb25nQnVmU2l6ZSk7CisgICAgICAgIGlmIChzaXplID4gY2h1bmspIHNpemUgPSBjaHVuazsKKyAgICAgICAgaGRybGVuID0gbXNnYnVpbGQoQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlciksICIldyV3JXcldyV3JXcldyV3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQURQX1Byb2ZpbGUgfCBIdG9ULCAwLCBBRFBfSGFuZGxlVW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQURQX0hhbmRsZVVua25vd24sIEFEUF9Qcm9maWxlX1dyaXRlTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBsZW4sIHNpemUsIG9mZnNldCk7CisKKyAgICAgICAgLyogQ29weSB0aGUgZGF0YSBpbnRvIHRoZSBwYWNrZXQuICovCisgICAgICAgIG1lbWNweShCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKStoZHJsZW4sCisgICAgICAgICAgICAgICAmbWFwLT5tYXBbb2Zmc2V0XSwgKHNpemVfdClzaXplICogc2l6ZW9mKEFSTXdvcmQpKTsKKyAgICAgICAgcGFja2V0LT5wa19sZW5ndGggPSBzaXplICogc2l6ZW9mKEFSTXdvcmQpICsgaGRybGVuOworICAgICAgICByZWdpc3Rlcl9kZWJ1Z19tZXNzYWdlX2hhbmRsZXIoKTsKKyAgICAgICAgQWRwX0NoYW5uZWxXcml0ZShDSV9IQURQLCBwYWNrZXQpOworICAgICAgICByZWFzb24gPSBBRFBfUHJvZmlsZSB8IFR0b0g7CisgICAgICAgIGVyciA9IHdhaXRfZm9yX2RlYnVnX21lc3NhZ2UoJnJlYXNvbiwgJmRlYnVnSUQsICZPU2luZm8xLCAmT1NpbmZvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzLCAmcGFja2V0KTsKKyAgICAgICAgaWYgKGVyciA9PSBSRElFcnJvcl9Ob0Vycm9yKSB7CisgICAgICAgICAgdW5wYWNrX21lc3NhZ2UoQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlciksICIldyV3JXcldyV3JXciLCAmcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIsICZzdWJyZWFzb24sICZzdGF0dXMpOworICAgICAgICAgIGlmIChzdWJyZWFzb24gIT0gIEFEUF9Qcm9maWxlX1dyaXRlTWFwKSB7CisgICAgICAgICAgICBlcnIgPSBSRElFcnJvcl9FcnJvcjsKKyAgICAgICAgICB9CisgICAgICAgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgIT0gUkRJRXJyb3JfTm9FcnJvcikgeyBzdGF0dXMgPSBlcnI7IGJyZWFrOyB9CisgICAgICB9CisgICAgICBpZiAoIWhvc3RfbGl0dGxlKSB7CisgICAgICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbWFwbGVuOyBvZmZzZXQrKykKKyAgICAgICAgICBtYXAtPm1hcFtvZmZzZXRdID0gYnl0ZXNleF9ob3N0dmFsKG1hcC0+bWFwW29mZnNldF0pOworICAgICAgICBieXRlc2V4X3JldmVyc2Uob2xkcmV2KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgIGNhc2UgUkRJUHJvZmlsZV9SZWFkTWFwOgorICAgIHsgaW50MzIgbWFwbGVuID0gKihpbnQzMiAqKWFyZzEsCisgICAgICAgICAgICBvZmZzZXQgPSAwLAorICAgICAgICAgICAgc2l6ZTsKKyAgICAgIGludDMyIGNodW5rID0gKEFybXNkX0J1ZmZlclNpemUtQ0hBTl9IRUFERVJfU0laRS1BRFBfUHJvZmlsZVJlYWRIZWFkZXJTaXplKSAvIHNpemVvZihBUk13b3JkKTsKKyNpZmRlZiBERUJVRworICAgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IEFEUF9Qcm9maWxlX1JlYWRNYXAgJWxkLlxuIiwgbWFwbGVuKTsKKyNlbmRpZgorICAgICAgc3RhdHVzID0gUkRJRXJyb3JfTm9FcnJvcjsKKyAgICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbWFwbGVuOyBvZmZzZXQgKz0gc2l6ZSkgeworICAgICAgICBzaXplID0gbWFwbGVuIC0gb2Zmc2V0OworICAgICAgICBpZiAoc2l6ZSA+IGNodW5rKSBzaXplID0gY2h1bms7CisgICAgICAgIHJlZ2lzdGVyX2RlYnVnX21lc3NhZ2VfaGFuZGxlcigpOworICAgICAgICBtc2dzZW5kKENJX0hBRFAsICIldyV3JXcldyV3JXcldyIsIEFEUF9Qcm9maWxlIHwgSHRvVCwgMCwKKyAgICAgICAgICAgICAgICBBRFBfSGFuZGxlVW5rbm93biwgQURQX0hhbmRsZVVua25vd24sCisgICAgICAgICAgICAgICAgQURQX1Byb2ZpbGVfUmVhZE1hcCwgb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgcmVhc29uID0gQURQX1Byb2ZpbGUgfCBUdG9IOworICAgICAgICBlcnIgPSB3YWl0X2Zvcl9kZWJ1Z19tZXNzYWdlKCZyZWFzb24sICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywgJnBhY2tldCk7CisgICAgICAgIGlmIChlcnIgIT0gUkRJRXJyb3JfTm9FcnJvcikgcmV0dXJuIGVycjsKKyAgICAgICAgdW5wYWNrX21lc3NhZ2UoQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlciksICIldyV3JXcldyV3JXciLCAmcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAmZGVidWdJRCwgJk9TaW5mbzEsICZPU2luZm8yLCAmc3VicmVhc29uLCAmc3RhdHVzKTsKKyAgICAgICAgbWVtY3B5KCZhcmcyW29mZnNldF0sIEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpK0FEUF9Qcm9maWxlUmVhZEhlYWRlclNpemUsCisgICAgICAgICAgICAgICBzaXplICogc2l6ZW9mKEFSTXdvcmQpKTsKKyAgICAgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICAgICAgICBpZiAoc3RhdHVzICE9IFJESUVycm9yX05vRXJyb3IpIGJyZWFrOworICAgICAgfQorICAgICAgeyBpbnQgb2xkcmV2ID0gYnl0ZXNleF9yZXZlcnNpbmcoKTsKKyAgICAgICAgaW50IGhvc3RfbGl0dGxlID0gKih1aW50OCBjb25zdCAqKSZob3N0c2V4OworICAgICAgICBpZiAoIWhvc3RfbGl0dGxlKSB7CisgICAgICAgICAgYnl0ZXNleF9yZXZlcnNlKDEpOworICAgICAgICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbWFwbGVuOyBvZmZzZXQrKykKKyAgICAgICAgICAgIGFyZzJbb2Zmc2V0XSA9IGJ5dGVzZXhfaG9zdHZhbChhcmcyW29mZnNldF0pOworICAgICAgICB9CisgICAgICAgIGJ5dGVzZXhfcmV2ZXJzZShvbGRyZXYpOworICAgICAgfQorICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgY2FzZSBSRElJbmZvX0NhblRhcmdldEV4ZWN1dGU6CisjaWZkZWYgREVCVUcKKyAgICBwcmludGYoIkRFQlVHOiBSRElJbmZvX0NhblRhcmdldEV4ZWN1dGUuXG4iKTsKKyNlbmRpZgorICAgIHJldHVybiBTZW5kU3ViTWVzc2FnZUFuZENoZWNrUmVwbHkoQURQX0luZm8sIEFEUF9JbmZvX0NhblRhcmdldEV4ZWN1dGUpOworCisgIGNhc2UgUkRJSW5mb19BZ2VudEVuZGlhbmVzczoKKyAgICByZXR1cm4gU2VuZFN1Yk1lc3NhZ2VBbmRDaGVja1JlcGx5KEFEUF9JbmZvLCBBRFBfSW5mb19BZ2VudEVuZGlhbmVzcyk7CisKKyAgZGVmYXVsdDoKKyNpZmRlZiBERUJVRworICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiBGZWxsIHRocm91Z2ggQURQX0luZm8sIGRlZmF1bHQgY2FzZSB0YWtlbi5cbiIpOworICAgIGFuZ2VsX0RlYnVnUHJpbnQoIkRFQlVHOiB0eXBlID0gMHgleC5cbiIsIHR5cGUpOworI2VuZGlmCisgICAgaWYgKHR5cGUgJiBSRElJbmZvX0NhcGFiaWxpdHlSZXF1ZXN0KSB7CisgICAgICBzd2l0Y2ggKHR5cGUgJiB+UkRJSW5mb19DYXBhYmlsaXR5UmVxdWVzdCkgeworICAgICAgICBjYXNlIFJESVNlbWlIb3N0aW5nX1NldEFSTVNXSToKKyAgICAgICAgICByZXR1cm4gU2VuZFN1Yk1lc3NhZ2VBbmRDaGVja1JlcGx5KEFEUF9JbmZvLCBBRFBfSW5mb19DaGFuZ2VhYmxlU0hTV0kpOworICAgICAgICBkZWZhdWx0OgorI2lmZGVmIERFQlVHCisgICAgICAgICAgYW5nZWxfRGVidWdQcmludCgKKyAgICAgICAgICAiREVCVUc6IEFEUF9JbmZvIC0gQ2FwYWJpbGl0eSBSZXF1ZXN0KCVkKSAtIHJlcG9ydGluZyB1bmltcGxlbWVudGVkIFxuIiwKKyAgICAgICAgICAgICAgICAgdHlwZSAmIH5SRElJbmZvX0NhcGFiaWxpdHlSZXF1ZXN0KTsKKyNlbmRpZgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUkRJRXJyb3JfVW5pbXBsZW1lbnRlZE1lc3NhZ2U7CisgIH0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tYW5nZWxfUkRJX0FkZENvbmZpZy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBBZGQgYSBjb25maWd1cmF0aW9uOiB1c2UgQURQX0lDRU1fQWRkQ29uZmlnLiAqLworaW50IGFuZ2VsX1JESV9BZGRDb25maWcodW5zaWduZWQgbG9uZyBuYnl0ZXMpIHsKKyAgUGFja2V0ICpwYWNrZXQgPSBOVUxMOworICBpbnQgc3RhdHVzLCByZWFzb24sIHN1YnJlYXNvbiwgZGVidWdJRCwgT1NpbmZvMSwgT1NpbmZvMiwgZXJyOworCisjaWZkZWYgREVCVUcKKyAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IEVudGVyZWQgYW5nZWxfUkRJX0FkZENvbmZpZy5cbiIpOworI2VuZGlmCisgIHJlZ2lzdGVyX2RlYnVnX21lc3NhZ2VfaGFuZGxlcigpOworICBtc2dzZW5kKENJX0hBRFAsICIldyV3JXcldyV3JXciLCBBRFBfSUNFbWFuIHwgSHRvVCwKKyAgICAgICAgICAwLCBBRFBfSGFuZGxlVW5rbm93biwgQURQX0hhbmRsZVVua25vd24sCisgICAgICAgICAgQURQX0lDRU1fQWRkQ29uZmlnLCBuYnl0ZXMpOworICByZWFzb249QURQX0lDRW1hbiB8IFR0b0g7CisgIGVyciA9IHdhaXRfZm9yX2RlYnVnX21lc3NhZ2UoJnJlYXNvbiwgJmRlYnVnSUQsICZPU2luZm8xLCAmT1NpbmZvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMsICZwYWNrZXQpOworICBpZiAoZXJyICE9IFJESUVycm9yX05vRXJyb3IpIHsKKyAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgICAgcmV0dXJuIC0xOworICB9CisgIHVucGFja19tZXNzYWdlKEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpLCAiJXcldyV3JXcldyV3IiwgJnJlYXNvbiwgJmRlYnVnSUQsCisgICAgICAgICAgICAgICAgICZPU2luZm8xLCAmT1NpbmZvMiwgJnN1YnJlYXNvbiwgJnN0YXR1cyk7CisgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgaWYgKCBzdWJyZWFzb24gIT0gQURQX0lDRU1fQWRkQ29uZmlnICkKKyAgICByZXR1cm4gUkRJRXJyb3JfRXJyb3I7CisgIGVsc2UKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS1hbmdlbF9SRElfTG9hZENvbmZpZ0RhdGEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIExvYWQgY29uZmlndXJhdGlvbiBkYXRhOiB1c2UgQURQX0N0cmxfRG93bmxvYWRfRGF0YS4gKi8KK2ludCBhbmdlbF9SRElfTG9hZENvbmZpZ0RhdGEodW5zaWduZWQgbG9uZyBuYnl0ZXMsIGNoYXIgY29uc3QgKmRhdGEpIHsKKyAgUGFja2V0ICpwYWNrZXQgPSBOVUxMOworICBpbnQgbGVuLCBzdGF0dXMsIHJlYXNvbiwgc3VicmVhc29uLCBkZWJ1Z0lELCBPU2luZm8xLCBPU2luZm8yLCBlcnI7CisKKyNpZmRlZiBERUJVRworICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogRW50ZXJlZCBhbmdlbF9SRElfTG9hZENvbmZpZ0RhdGEgKCVkIGJ5dGVzKVxuIiwgbmJ5dGVzKTsKKyNlbmRpZgorI2lmIDAKKyAgaWYgKGVyciA9IGFuZ2VsX1JESV9BZGRDb25maWcobmJ5dGVzKSAhPSBSRElFcnJvcl9Ob0Vycm9yKQorICAgIHJldHVybiBlcnI7CisjZW5kaWYKKyAgcGFja2V0ID0gRGV2U1dfQWxsb2NhdGVQYWNrZXQoQXJtc2RfTG9uZ0J1ZlNpemUpOworICBsZW4gPSBtc2didWlsZChCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSwgIiV3JXcldyV3JXcldyIsCisgICAgICAgICAgICAgICAgIEFEUF9Db250cm9sIHwgSHRvVCwgMCwKKyAgICAgICAgICAgICAgICAgQURQX0hhbmRsZVVua25vd24sIEFEUF9IYW5kbGVVbmtub3duLAorICAgICAgICAgICAgICAgICBBRFBfQ3RybF9Eb3dubG9hZF9EYXRhLCBuYnl0ZXMpOworICBtZW1jcHkoQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlcikrbGVuLCBkYXRhLCBuYnl0ZXMpOworICBsZW4gKz0gbmJ5dGVzOworICBwYWNrZXQtPnBrX2xlbmd0aCA9IGxlbjsKKyNpZmRlZiBERUJVRworICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogcGFja2V0IGxlbiAlZC5cbiIsIGxlbik7CisjZW5kaWYKKyAgcmVnaXN0ZXJfZGVidWdfbWVzc2FnZV9oYW5kbGVyKCk7CisgIEFkcF9DaGFubmVsV3JpdGUoQ0lfSEFEUCwgcGFja2V0KTsKKyAgcmVhc29uPUFEUF9Db250cm9sIHwgVHRvSDsKKyAgZXJyID0gd2FpdF9mb3JfZGVidWdfbWVzc2FnZSgmcmVhc29uLCAmZGVidWdJRCwgJk9TaW5mbzEsICZPU2luZm8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywgJnBhY2tldCk7CisgIGlmIChlcnIgIT0gUkRJRXJyb3JfTm9FcnJvcikgeworICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgdW5wYWNrX21lc3NhZ2UoQlVGRkVSREFUQShwYWNrZXQtPnBrX2J1ZmZlciksICIldyV3JXcldyV3JXciLCAmcmVhc29uLCAmZGVidWdJRCwKKyAgICAgICAgICAgICAgICAgJk9TaW5mbzEsICZPU2luZm8yLCAmc3VicmVhc29uLCAmc3RhdHVzKTsKKyAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICBpZiAoIHN1YnJlYXNvbiAhPSBBRFBfQ3RybF9Eb3dubG9hZF9EYXRhICkKKyAgICByZXR1cm4gUkRJRXJyb3JfRXJyb3I7CisgIGVsc2UKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS1hbmdlbF9SRElfU2VsZWN0Q29uZmlnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFNlbGVjdCBhIGNvbmZpZ3VyYXRpb246IHVzZSBBRFBfSUNFTV9TZWxlY0NvbmZpZy4qLworaW50IGFuZ2VsX1JESV9TZWxlY3RDb25maWcoUkRJX0NvbmZpZ0FzcGVjdCBhc3BlY3QsIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSRElfQ29uZmlnTWF0Y2hUeXBlIG1hdGNodHlwZSwgdW5zaWduZWQgdmVyc2lvbnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqdmVyc2lvbnApCit7CisgIFBhY2tldCAqcGFja2V0ID0gTlVMTDsKKyAgaW50IGxlbiwgc3RhdHVzLCByZWFzb24sIHN1YnJlYXNvbiwgZGVidWdJRCwgT1NpbmZvMSwgT1NpbmZvMiwgZXJyOworCisjaWZkZWYgREVCVUcKKyAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IEVudGVyZWQgYW5nZWxfUkRJX1NlbGVjdENvbmZpZy5cbiIpOworI2VuZGlmCisgIHBhY2tldCA9IERldlNXX0FsbG9jYXRlUGFja2V0KEFybXNkX0J1ZmZlclNpemUpOworICBsZW4gPSBtc2didWlsZChCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSwgIiV3JXcldyV3JXclYiViJWIldyIsCisgICAgICAgICAgICAgICAgIEFEUF9JQ0VtYW4gfCBIdG9ULCAwLAorICAgICAgICAgICAgICAgICBBRFBfSGFuZGxlVW5rbm93biwgQURQX0hhbmRsZVVua25vd24sCisgICAgICAgICAgICAgICAgIEFEUF9JQ0VNX1NlbGVjdENvbmZpZywgYXNwZWN0LCBzdHJsZW4obmFtZSksCisgICAgICAgICAgICAgICAgIG1hdGNodHlwZSwgdmVyc2lvbnJlcSk7CisgIC8qIGNvcHkgdGhlIG5hbWUgaW50byB0aGUgYnVmZmVyICovCisgIG1lbWNweShCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKStsZW4sIG5hbWUsIHN0cmxlbihuYW1lKSk7CisgIGxlbiArPSBzdHJsZW4obmFtZSk7CisgIHBhY2tldC0+cGtfbGVuZ3RoID0gbGVuOworICByZWdpc3Rlcl9kZWJ1Z19tZXNzYWdlX2hhbmRsZXIoKTsKKyAgQWRwX0NoYW5uZWxXcml0ZShDSV9IQURQLCBwYWNrZXQpOworICByZWFzb249QURQX0lDRW1hbiB8IFR0b0g7CisgIGVyciA9IHdhaXRfZm9yX2RlYnVnX21lc3NhZ2UoJnJlYXNvbiwgJmRlYnVnSUQsICZPU2luZm8xLCAmT1NpbmZvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMsICZwYWNrZXQpOworICBpZiAoZXJyICE9IFJESUVycm9yX05vRXJyb3IpIHsKKyAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgICAgcmV0dXJuIGVycjsKKyAgfQorICB1bnBhY2tfbWVzc2FnZShCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSwgIiV3JXcldyV3JXcldyV3IiwKKyAgICAgICAgICAgICAgICAgJnJlYXNvbiwgJmRlYnVnSUQsICZPU2luZm8xLCAmT1NpbmZvMiwKKyAgICAgICAgICAgICAgICAgJnN1YnJlYXNvbiwgJnN0YXR1cywgdmVyc2lvbnApOworICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgIGlmICggc3VicmVhc29uICE9IEFEUF9JQ0VNX1NlbGVjdENvbmZpZyApCisgICAgcmV0dXJuIFJESUVycm9yX0Vycm9yOworICBlbHNlCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tYW5nZWxfUkRJX0xvYWRBZ2VudC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBMb2FkIGEgbmV3IGRlYnVnIGFnZW50OiB1c2UgQURQX0N0cmxfRG93bmxvYWRfQWdlbnQuICovCitpbnQgYW5nZWxfUkRJX0xvYWRBZ2VudChBUk13b3JkIGRlc3QsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0YnVmZmVycHJvYyAqZ2V0Yiwgdm9pZCAqZ2V0YmFyZykKK3sKKyAgUGFja2V0ICpwYWNrZXQgPSBOVUxMOworICBpbnQgIHN0YXR1cywgcmVhc29uLCBzdWJyZWFzb24sIGRlYnVnSUQsIE9TaW5mbzEsIE9TaW5mbzIsIGVycjsKKyAgdGltZV90IHQ7CisKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKERFQlVHX0xPQURBR0VOVCkKKyAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IEVudGVyZWQgYW5nZWxfUkRJX0xvYWRBZ2VudC5cbiIpOworI2VuZGlmCisgIHJlZ2lzdGVyX2RlYnVnX21lc3NhZ2VfaGFuZGxlcigpOworICBtc2dzZW5kKENJX0hBRFAsICIldyV3JXcldyV3JXcldyIsIEFEUF9Db250cm9sIHwgSHRvVCwKKyAgICAgICAgICAwLCBBRFBfSGFuZGxlVW5rbm93biwgQURQX0hhbmRsZVVua25vd24sCisgICAgICAgICAgQURQX0N0cmxfRG93bmxvYWRfQWdlbnQsIGRlc3QsIHNpemUpOworICByZWFzb249QURQX0NvbnRyb2wgfCBUdG9IOworICBlcnIgPSB3YWl0X2Zvcl9kZWJ1Z19tZXNzYWdlKCZyZWFzb24sICZkZWJ1Z0lELCAmT1NpbmZvMSwgJk9TaW5mbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzLCAmcGFja2V0KTsKKyAgaWYgKGVyciAhPSBSRElFcnJvcl9Ob0Vycm9yKSB7CisgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICAgIHJldHVybiAtMTsKKyAgfQorICB1bnBhY2tfbWVzc2FnZShCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSwgIiV3JXcldyV3JXcldyIsICZyZWFzb24sICZkZWJ1Z0lELAorICAgICAgICAgICAgICAgICAmT1NpbmZvMSwgJk9TaW5mbzIsICZzdWJyZWFzb24sICZzdGF0dXMpOworICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgaWYgKCBzdWJyZWFzb24gIT0gQURQX0N0cmxfRG93bmxvYWRfQWdlbnQgKQorICAgIHJldHVybiBSRElFcnJvcl9FcnJvcjsKKyAgaWYgKCBzdGF0dXMgIT0gUkRJRXJyb3JfTm9FcnJvciApCisgICAgcmV0dXJuIHN0YXR1czsKKworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoREVCVUdfTE9BREFHRU5UKQorICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogc3RhcnRpbmcgYWdlbnQgZGF0YSBkb3dubG9hZC5cbiIpOworI2VuZGlmCisgIHsgdW5zaWduZWQgbG9uZyBwb3MgPSAwLCBzZWdzaXplOworICAgIGZvciAoOyBwb3MgPCBzaXplOyBwb3MgKz0gc2Vnc2l6ZSkgeworICAgICAgY2hhciAqYiA9IGdldGIoZ2V0YmFyZywgJnNlZ3NpemUpOworICAgICAgaWYgKGIgPT0gTlVMTCkgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7CisgICAgICBlcnIgPSBhbmdlbF9SRElfTG9hZENvbmZpZ0RhdGEoIHNlZ3NpemUsIGIgKTsKKyAgICAgIGlmIChlcnIgIT0gUkRJRXJyb3JfTm9FcnJvcikgcmV0dXJuIGVycjsKKyAgICB9CisgIH0KKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKERFQlVHX0xPQURBR0VOVCkKKyAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IGZpbmlzaGVkIGRvd25sb2FkaW5nIG5ldyBhZ2VudC5cbiIpOworI2VuZGlmCisKKyAgLyogcmVuZWdvdGlhdGUgYmFjayBkb3duICovCisgIGVyciA9IGFuZ2VsX25lZ290aWF0ZV9kZWZhdWx0cygpOworICBpZiAoZXJyICE9IGFkcF9vaykKKyAgICAgcmV0dXJuIGVycjsKKworICAvKiBPdXRwdXQgYSBtZXNzYWdlIHRvIHRlbGwgdGhlIHVzZXIgd2hhdCBpcyBnb2luZyBvbi4gIFRoaXMgaXMgdml0YWwKKyAgICogd2hlbiBzd2l0Y2hpbmcgZnJvbSBBRFAgRUlDRSB0byBBRFAgb3ZlciBKVEFHLCBhcyB0aGVuIHRoZSB1c2VyCisgICAqIGhhcyB0byByZXNldCB0aGUgdGFyZ2V0IGJvYXJkICEKKyAgICovCisgIHsgY2hhciBtc2dbMjU2XTsKKyAgICBpbnQgbGVuPWFuZ2VsX1JESV9lcnJtZXNzKG1zZywgMjU2LCBhZHBfbmV3X2FnZW50X3N0YXJ0aW5nKTsKKyAgICBhbmdlbF9ob3N0aWYtPndyaXRlKGFuZ2VsX2hvc3RpZi0+aG9zdG9zYXJnLCBtc2csIGxlbik7CisgIH0KKworICAvKiBnZXQgbmV3IGltYWdlIHN0YXJ0ZWQgKi8KKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKERFQlVHX0xPQURBR0VOVCkKKyAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IHNlbmRpbmcgc3RhcnQgbWVzc2FnZSBmb3IgbmV3IGFnZW50LlxuIik7CisjZW5kaWYKKworICByZWdpc3Rlcl9kZWJ1Z19tZXNzYWdlX2hhbmRsZXIoKTsKKyAgbXNnc2VuZChDSV9IQURQLCAiJXcldyV3JXcldyV3IiwgQURQX0NvbnRyb2wgfCBIdG9ULAorICAgICAgICAgIDAsIEFEUF9IYW5kbGVVbmtub3duLCBBRFBfSGFuZGxlVW5rbm93biwKKyAgICAgICAgICBBRFBfQ3RybF9TdGFydF9BZ2VudCwgZGVzdCk7CisgIHJlYXNvbj1BRFBfQ29udHJvbCB8IFR0b0g7CisgIGVyciA9IHdhaXRfZm9yX2RlYnVnX21lc3NhZ2UoJnJlYXNvbiwgJmRlYnVnSUQsICZPU2luZm8xLCAmT1NpbmZvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMsICZwYWNrZXQpOworICBpZiAoZXJyICE9IFJESUVycm9yX05vRXJyb3IpIHsKKyAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgICAgcmV0dXJuIC0xOworICB9CisgIHVucGFja19tZXNzYWdlKEJVRkZFUkRBVEEocGFja2V0LT5wa19idWZmZXIpLCAiJXcldyV3JXcldyV3IiwgJnJlYXNvbiwKKyAgICAgICAgICAgICAgICAgJmRlYnVnSUQsICZPU2luZm8xLCAmT1NpbmZvMiwgJnN1YnJlYXNvbiwgJnN0YXR1cyk7CisgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICBpZiAoIHN1YnJlYXNvbiAhPSBBRFBfQ3RybF9TdGFydF9BZ2VudCApCisgICAgcmV0dXJuIFJESUVycm9yX0Vycm9yOworICBpZiAoIHN0YXR1cyAhPSBSRElFcnJvcl9Ob0Vycm9yICkKKyAgICByZXR1cm4gc3RhdHVzOworCisgIC8qIHdhaXQgZm9yIGltYWdlIHRvIHN0YXJ0IHVwICovCisgIGhlYXJ0YmVhdF9lbmFibGVkID0gRkFMU0U7CisgIHQ9dGltZShOVUxMKTsKKyAgZG8geworICAgIEFkcF9Bc3luY2hyb25vdXNQcm9jZXNzaW5nKGFzeW5jX2Jsb2NrX29uX25vdGhpbmcpOworICAgIGlmICgodGltZShOVUxMKS10KSA+IDIpIHsKKyNpZmRlZiBERUJVRworICAgICAgYW5nZWxfRGVidWdQcmludCgiREVCVUc6IG5vIGJvb3RlZCBtZXNzYWdlIGZyb20gbmV3IGltYWdlIHlldC5cbiIpOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKGJvb3RlZF9ub3RfcmVjZWl2ZWQpOworICBib290ZWRfbm90X3JlY2VpdmVkPTE7CisKKyAgLyogR2l2ZSBkZXZpY2UgZHJpdmVyIGEgY2hhbmNlIHRvIGRvIGFueSBuZWNlc3NhcnkgcmVzeW5jaW5nIHdpdGggbmV3IGFnZW50LgorICAgKiBPbmx5IHVzZWQgYnkgZXRoZXJkcnYuYyBhdCB0aGUgbW9tZW50LgorICAgKi8KKyAgKHZvaWQpQWRwX0lvY3RsKCBEQ19SRVNZTkMsIE5VTEwgKTsKKworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoREVCVUdfTE9BREFHRU5UKQorICBhbmdlbF9EZWJ1Z1ByaW50KCJERUJVRzogcmVvcGVuaW5nIHRvIG5ldyBhZ2VudC5cbiIpOworI2VuZGlmCisgIGVyciA9IGFuZ2VsX1JESV9vcGVuKDAsIE5VTEwsIE5VTEwsIE5VTEwpOworICBzd2l0Y2ggKCBlcnIgKQorICB7CisgICAgICBjYXNlIFJESUVycm9yX05vRXJyb3I6CisgICAgICB7CisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChERUJVR19MT0FEQUdFTlQpCisgICAgICAgICAgYW5nZWxfRGVidWdQcmludCggIkxvYWRBZ2VudDogT3BlbiByZXR1cm5lZCBSRElFcnJvcl9Ob0Vycm9yXG4iICk7CisjZW5kaWYKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBSRElFcnJvcl9MaXR0bGVFbmRpYW46CisgICAgICB7CisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChERUJVR19MT0FEQUdFTlQpCisgICAgICAgICAgYW5nZWxfRGVidWdQcmludCggIkxvYWRBZ2VudDogT3BlbiByZXR1cm5lZCBSRElFcnJvcl9MaXR0bGVFbmRpYW4gKE9LKVxuIiApOworI2VuZGlmCisgICAgICAgICAgZXJyID0gUkRJRXJyb3JfTm9FcnJvcjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBSRElFcnJvcl9CaWdFbmRpYW46CisgICAgICB7CisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChERUJVR19MT0FEQUdFTlQpCisgICAgICAgICAgYW5nZWxfRGVidWdQcmludCggIkxvYWRBZ2VudDogT3BlbiByZXR1cm5lZCBSRElFcnJvcl9CaWdFbmRpYW4gKE9LKVxuIiApOworI2VuZGlmCisgICAgICAgICAgZXJyID0gUkRJRXJyb3JfTm9FcnJvcjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDoKKyAgICAgIHsKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKERFQlVHX0xPQURBR0VOVCkKKyAgICAgICAgICBhbmdlbF9EZWJ1Z1ByaW50KCAiTG9hZEFnZW50OiBPcGVuIHJldHVybmVkICVkIC0gdW5leHBlY3RlZCFcbiIsIGVyciApOworI2VuZGlmCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgIH0KKyNpZm5kZWYgTk9fSEVBUlRCRUFUCisgIGhlYXJ0YmVhdF9lbmFibGVkID0gVFJVRTsKKyNlbmRpZgorICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGFuZ2VsX1JESV9lcnJtZXNzKGNoYXIgKmJ1ZiwgaW50IGJsZW4sIGludCBlcnJudW0pIHsKKyAgY2hhciAqcz1OVUxMOworICBpbnQgbjsKKworICBzd2l0Y2ggKGVycm51bSkgeworICAgIGNhc2UgYWRwX21hbGxvY19mYWlsdXJlOgorICAgICAgcz1BZHBNZXNzX01hbGxvY0ZhaWxlZDsgYnJlYWs7CisgICAgY2FzZSBhZHBfaWxsZWdhbF9hcmdzOgorICAgICAgcz1BZHBNZXNzX0lsbGVnYWxBcmdzOyBicmVhazsKKyAgICBjYXNlIGFkcF9kZXZpY2Vfbm90X2ZvdW5kOgorICAgICAgcz1BZHBNZXNzX0RldmljZU5vdEZvdW5kOyBicmVhazsKKyAgICBjYXNlIGFkcF9kZXZpY2Vfb3Blbl9mYWlsZWQ6CisgICAgICBzPUFkcE1lc3NfRGV2aWNlT3BlbkZhaWxlZDsgYnJlYWs7CisgICAgY2FzZSBhZHBfZGV2aWNlX2FscmVhZHlfb3BlbjoKKyAgICAgIHM9QWRwTWVzc19EZXZpY2VBbHJlYWR5T3BlbjsgYnJlYWs7CisgICAgY2FzZSBhZHBfZGV2aWNlX25vdF9vcGVuOgorICAgICAgcz1BZHBNZXNzX0RldmljZU5vdE9wZW47IGJyZWFrOworICAgIGNhc2UgYWRwX2JhZF9jaGFubmVsX2lkOgorICAgICAgcz1BZHBNZXNzX0JhZENoYW5uZWxJZDsgYnJlYWs7CisgICAgY2FzZSBhZHBfY2FsbGJhY2tfYWxyZWFkeV9yZWdpc3RlcmVkOgorICAgICAgcz1BZHBNZXNzX0NCQWxyZWFkeVJlZ2Q7IGJyZWFrOworICAgIGNhc2UgYWRwX3dyaXRlX2J1c3k6CisgICAgICBzPUFkcE1lc3NfV3JpdGVCdXN5OyBicmVhazsKKyAgICBjYXNlIGFkcF9iYWRfcGFja2V0OgorICAgICAgcz1BZHBNZXNzX0JhZFBhY2tldDsgYnJlYWs7CisgICAgY2FzZSBhZHBfc2VxX2hpZ2g6CisgICAgICBzPUFkcE1lc3NfU2VxSGlnaDsgYnJlYWs7CisgICAgY2FzZSBhZHBfc2VxX2xvdzoKKyAgICAgIHM9QWRwTWVzc19TZXFMb3c7IGJyZWFrOworICAgIGNhc2UgYWRwX3RpbWVvdXRfb25fb3BlbjoKKyAgICAgIHM9QWRwTWVzc19UaW1lb3V0T25PcGVuOyBicmVhazsKKyAgICBjYXNlIGFkcF9mYWlsZWQ6CisgICAgICBzPUFkcE1lc3NfRmFpbGVkOyBicmVhazsKKyAgICBjYXNlIGFkcF9hYmFuZG9uX2Jvb3Rfd2FpdDoKKyAgICAgIHM9QWRwTWVzc19BYmFuZG9uQm9vdFdhaXQ7IGJyZWFrOworICAgIGNhc2UgYWRwX2xhdGVfc3RhcnR1cDoKKyAgICAgIHM9QWRwTWVzc19MYXRlU3RhcnR1cDsgYnJlYWs7CisgICAgY2FzZSBhZHBfbmV3X2FnZW50X3N0YXJ0aW5nOgorICAgICAgcz1BZHBNZXNzX05ld0FnZW50U3RhcnRpbmc7IGJyZWFrOworICAgIGRlZmF1bHQ6IHJldHVybiAwOworICB9CisgIG49c3RybGVuKHMpOworICBpZiAobj5ibGVuLTEpIG49Ymxlbi0xOworICBtZW1jcHkoYnVmLCBzLCBuKTsKKyAgYnVmW24rK109MDsKKyAgcmV0dXJuIG47Cit9CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgUkRJUHJvY1ZlYyBhbmdlbF9yZGk7Citjb25zdCBzdHJ1Y3QgUkRJUHJvY1ZlYyBhbmdlbF9yZGkgPSB7CisgICAgIkFEUCIsCisgICAgYW5nZWxfUkRJX29wZW4sCisgICAgYW5nZWxfUkRJX2Nsb3NlLAorICAgIGFuZ2VsX1JESV9yZWFkLAorICAgIGFuZ2VsX1JESV93cml0ZSwKKyAgICBhbmdlbF9SRElfQ1BVcmVhZCwKKyAgICBhbmdlbF9SRElfQ1BVd3JpdGUsCisgICAgYW5nZWxfUkRJX0NQcmVhZCwKKyAgICBhbmdlbF9SRElfQ1B3cml0ZSwKKyAgICBhbmdlbF9SRElfc2V0YnJlYWssCisgICAgYW5nZWxfUkRJX2NsZWFyYnJlYWssCisgICAgYW5nZWxfUkRJX3NldHdhdGNoLAorICAgIGFuZ2VsX1JESV9jbGVhcndhdGNoLAorICAgIGFuZ2VsX1JESV9leGVjdXRlLAorICAgIGFuZ2VsX1JESV9zdGVwLAorICAgIGFuZ2VsX1JESV9pbmZvLAorICAgIGFuZ2VsX1JESV9wb2ludGlucSwKKworICAgIGFuZ2VsX1JESV9BZGRDb25maWcsCisgICAgYW5nZWxfUkRJX0xvYWRDb25maWdEYXRhLAorICAgIGFuZ2VsX1JESV9TZWxlY3RDb25maWcsCisKKyAgICAwLCAvKmFuZ2VsX1JESV9kcml2ZXJuYW1lcywqLworICAgIDAsICAgLyogY3B1bmFtZXMgKi8KKworICAgIGFuZ2VsX1JESV9lcnJtZXNzLAorCisgICAgYW5nZWxfUkRJX0xvYWRBZ2VudAorfTsKKworLyogRU9GIGFyZGkuYyAqLworCisvKiBOb3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQgYWxsb3dzIGxpbmtpbmcgdGhpcyBjb2RlIGludG8gYXJtc2QuICovCisKK3N0cnVjdCBmb28geworICAgIGNoYXIgKm5hbWU7CisgICAgaW50ICgqYWN0aW9uKSgpOworICAgIGNoYXIgKnN5bnRheDsKKyAgICBjaGFyICoqaGVscG1lc3NhZ2U7CisgICAgaW50IGRvYWZ0ZXJlbmQ7CisgICAgaW50IGRvYmVmb3Jlc3RhcnQ7CisgICAgaW50IGRvaW5taWRsaW5lOworfSBob3N0YXBwbF9DbWRUYWJsZVsxXSA9IHt7IiIsIE5VTEx9fTsKKwordm9pZAoraG9zdGFwcGxfSW5pdCgpCit7Cit9CisKK2ludAoraG9zdGFwcGxfQmFja3N0b3AoKQoreworICByZXR1cm4gLTMwOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9hcmRpLmggYi9nZGIvcmRpLXNoYXJlL2FyZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmFjZDFhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9hcmRpLmgKQEAgLTAsMCArMSw4NSBAQAorLyogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgdXNlZCwgY29waWVkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzIHByZXNlcnZlZCBpbiBhbGwgY29waWVzIG9mIHRoZQorICogc29mdHdhcmUuCisgKi8KKworLyoKKyAqIGFyZGkuaAorICogQURQIFJESSBpbnRlcmZhY2VzCisgKgorICogJFJldmlzaW9uJAorICogICAgICREYXRlJAorICovCisKKyNpbmNsdWRlICJob3N0LmgiCisKK3R5cGVkZWYgdW5zaWduZWQzMiBBUk13b3JkOworCisjaW5jbHVkZSAiZGJnX3JkaS5oIgorI2luY2x1ZGUgImRiZ19jb25mLmgiCisKK2V4dGVybiBjaGFyICpjb21tYW5kbGluZTsKK2V4dGVybiBBUk13b3JkIGxhc3RfdmVjdG9yX2NhdGNoOworCisvKiBUaGlzIGlzIHRoZSBzaXplIG9mIGJ1ZmZlcnMgdGhhdCBhcmUgYXNrZWQgZm9yIGJ5IHN0YW5kYXJkIGNoYW5uZWxzCisgKiBOb24gc3RhbmRhcmQgY2hhbm5lbHMgbWF5IHdpc2ggdG8gY29weSB0aGlzIQorICovCitleHRlcm4gaW50IEFybXNkX0J1ZmZlclNpemU7CisKK3R5cGVkZWYgaW50ICgqaG9zdF9DaGFubmVsQnVmZmVyRmlsbGVkRm5QdHIpKHVuc2lnbmVkIGludCAsdW5zaWduZWQgY2hhciAqKiAsdm9pZCAqKTsKKworaW50IGFuZ2VsX1JESV9vcGVuKAorICAgIHVuc2lnbmVkIHR5cGUsIERiZ19Db25maWdCbG9jayBjb25zdCAqY29uZmlnLAorICAgIERiZ19Ib3N0b3NJbnRlcmZhY2UgY29uc3QgKmhvc3RpZiwgc3RydWN0IERiZ19NQ1N0YXRlICpkYmdfc3RhdGUpOworaW50IGFuZ2VsX1JESV9jbG9zZSh2b2lkKTsKKworaW50IGFuZ2VsX1JESV9yZWFkKEFSTXdvcmQgc291cmNlLCB2b2lkICpkZXN0LCB1bnNpZ25lZCAqbmJ5dGVzKTsKK2ludCBhbmdlbF9SRElfd3JpdGUoY29uc3Qgdm9pZCAqc291cmNlLCBBUk13b3JkIGRlc3QsIHVuc2lnbmVkICpuYnl0ZXMpOworCitpbnQgYW5nZWxfUkRJX0NQVXJlYWQodW5zaWduZWQgbW9kZSwgdW5zaWduZWQgbG9uZyBtYXNrLCBBUk13b3JkICpidWZmZXIpOworaW50IGFuZ2VsX1JESV9DUFV3cml0ZSh1bnNpZ25lZCBtb2RlLCB1bnNpZ25lZCBsb25nIG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgIEFSTXdvcmQgY29uc3QgKmJ1ZmZlcik7CisKK2ludCBhbmdlbF9SRElfQ1ByZWFkKHVuc2lnbmVkIENQbnVtLCB1bnNpZ25lZCBsb25nIG1hc2ssIEFSTXdvcmQgKmJ1ZmZlcik7CitpbnQgYW5nZWxfUkRJX0NQd3JpdGUodW5zaWduZWQgQ1BudW0sIHVuc2lnbmVkIGxvbmcgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICBBUk13b3JkIGNvbnN0ICpidWZmZXIpOworCitpbnQgYW5nZWxfUkRJX3NldGJyZWFrKEFSTXdvcmQgYWRkcmVzcywgdW5zaWduZWQgdHlwZSwgQVJNd29yZCBib3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICBQb2ludEhhbmRsZSAqaGFuZGxlKTsKK2ludCBhbmdlbF9SRElfY2xlYXJicmVhayhQb2ludEhhbmRsZSBoYW5kbGUpOworCitpbnQgYW5nZWxfUkRJX3NldHdhdGNoKEFSTXdvcmQgYWRkcmVzcywgdW5zaWduZWQgdHlwZSwgdW5zaWduZWQgZGF0YXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgQVJNd29yZCBib3VuZCwgUG9pbnRIYW5kbGUgKmhhbmRsZSk7CitpbnQgYW5nZWxfUkRJX2NsZWFyd2F0Y2goUG9pbnRIYW5kbGUgaGFuZGxlKTsKKworaW50IGFuZ2VsX1JESV9wb2ludGlucShBUk13b3JkICphZGRyZXNzLCB1bnNpZ25lZCB0eXBlLCB1bnNpZ25lZCBkYXRhdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBBUk13b3JkICpib3VuZCk7CisKK2ludCBhbmdlbF9SRElfZXhlY3V0ZShQb2ludEhhbmRsZSAqaGFuZGxlKTsKKworaW50IGFuZ2VsX1JESV9zdGVwKHVuc2lnbmVkIG5pbnN0ciwgUG9pbnRIYW5kbGUgKmhhbmRsZSk7CisKK2ludCBhbmdlbF9SRElfaW5mbyh1bnNpZ25lZCB0eXBlLCBBUk13b3JkICphcmcxLCBBUk13b3JkICphcmcyKTsKKworaW50IGFuZ2VsX1JESV9BZGRDb25maWcodW5zaWduZWQgbG9uZyBuYnl0ZXMpOworCitpbnQgYW5nZWxfUkRJX0xvYWRDb25maWdEYXRhKHVuc2lnbmVkIGxvbmcgbmJ5dGVzLCBjaGFyIGNvbnN0ICpkYXRhKTsKKworaW50IGFuZ2VsX1JESV9TZWxlY3RDb25maWcoUkRJX0NvbmZpZ0FzcGVjdCBhc3BlY3QsIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJESV9Db25maWdNYXRjaFR5cGUgbWF0Y2h0eXBlLCB1bnNpZ25lZCB2ZXJzaW9ucmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqdmVyc2lvbnApOworCitSRElfTmFtZUxpc3QgY29uc3QgKmFuZ2VsX1JESV9kcml2ZXJuYW1lcyh2b2lkKTsKKworaW50IGFuZ2VsX1JESV9Mb2FkQWdlbnQoQVJNd29yZCBkZXN0LCB1bnNpZ25lZCBsb25nIHNpemUsIGdldGJ1ZmZlcnByb2MgKmdldGIsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpnZXRiYXJnKTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBEYmdfSG9zdG9zSW50ZXJmYWNlICphbmdlbF9ob3N0aWY7CisKK3R5cGVkZWYgaW50IGFuZ2VsX1JESV9UYXJnZXRTdG9wcGVkUHJvYyh1bnNpZ25lZCBzdG9wcGVkX3JlYXNvbiwgdm9pZCAqYXJnKTsKKworZXh0ZXJuIGludCBhbmdlbF9SRElfT25UYXJnZXRTdG9wcGluZyhhbmdlbF9SRElfVGFyZ2V0U3RvcHBlZFByb2MgKmZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpOwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9hcm1kYmcuaCBiL2dkYi9yZGktc2hhcmUvYXJtZGJnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmYWUxMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZGktc2hhcmUvYXJtZGJnLmgKQEAgLTAsMCArMSwxNDUyIEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMTk5NSBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGZyZWVseSB1c2VkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaXMgcHJlc2VydmVkIGluIGFsbCBjb3BpZXMgb2YgdGhlCisgKiBzb2Z0d2FyZS4KKyAqLworCisvKgorICogQVJNIHN5bWJvbGljIGRlYnVnZ2VyIHRvb2xib3ggaW50ZXJmYWNlCisgKi8KKworLyoKKyAqIFJDUyAkUmV2aXNpb24kCisgKiBDaGVja2luICREYXRlJAorICovCisKKy8qIE1pbm9yIHBvaW50cyBvZiB1bmNlcnRhaW50eSBhcmUgaW5kaWNhdGVkIGJ5IGEgcXVlc3Rpb24gbWFyayBpbiB0aGUKKyAgIExIIG1hcmdpbi4KKworICAgV2hlcmV2ZXIgYW4gaW50ZXJmYWNlIGlzIHJlcXVpcmVkIHRvIGl0ZXJhdGUgb3ZlciB0aGluZ3Mgb2Ygc29tZSBjbGFzcywKKyAgIEkgcHJlZmVyIHNvbWV0aGluZyBvZiB0aGUgZm9ybSAgRW51bWVyYXRlWFhzKC4uLiwgWFhQcm9jICpwLCB2b2lkICphcmcpCisgICB3aGljaCByZXN1bHRzIGluIGEgY2FsbCBvZiBwKHh4LCBhcmcpIGZvciBlYWNoIHh4LCByYXRoZXIgdGhhbiBzb21ldGhpbmcKKyAgIG9mIHRoZSBmb3JtCisgICAgIGZvciAoeHhoID0gU3RhcnRJdGVyYXRpb25PdmVyWFhzKCk7ICh4eCA9IE5leHQoeHhoKSkgIT0gMDsgKSB7IC4uLiB9CisgICAgIEVuZEl0ZXJhdGlvbk92ZXJYWHMoeHhoKTsKKyAgIE90aGVycyBtYXkgZGlzYWdyZWUuCisgICAoRWFjaCBYWFByb2MgcmV0dXJucyBhbiBFcnJvciB2YWx1ZTogaWYgdGhpcyBpcyBub3QgRXJyX09LLCBpdGVyYXRpb24KKyAgIHN0b3BzIGltbWVkaWF0ZWx5IGFuZCB0aGUgRW51bWVyYXRlWFhzIGZ1bmN0aW9uIHJldHVybnMgdGhhdCB2YWx1ZSkuCisKKyAgIHB0cmFjZSBoYXMgYmVlbiByZXRpcmVkIGFzIG9mIGluc3VmZmljaWVudCB1dGlsaXR5LiAgSWYgc3VjaCBmdWN0aW9uYWxpdHkgaXMKKyAgIHJlcXVpcmVkLCBpdCBjYW4gYmUgY29uc3RydWN0ZWQgdXNpbmcgYnJlYWtwb2ludHMuCisKKyAgIFRoZSBmaWxlIGZvcm0gb2YgYWxsIG5hbWUgZmllbGRzIGluIGRlYnVnIGFyZWFzIGlzIGluLWxpbmUsIHdpdGggYSBsZW5ndGgKKyAgIGJ5dGUgYW5kIG5vIHRlcm1pbmF0b3IuICBUaGUgZGVidWdnZXIgdG9vbGJveCBtYWtlcyBhbiBpbi1zdG9yZSB0cmFuc2xhdGlvbiwKKyAgIHdoZXJlIHRoZSBzdHJpbmdzIGFyZSBvdXQgb2YgbGluZSAodGhlIG5hbWVwIHZhcmlhbnQgaW4gYXNkZm10LmgpIGFuZCBoYXZlIGEKKyAgIHRlcm1pbmF0aW5nIHplcm8gYnl0ZTogdGhlIHBvaW50ZXIgaXMgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nCisgICB3aXRoIHRoZSBsZW5ndGggYnl0ZSBhdCAuLi4tPm4ubmFtZXBbLTFdLgorICovCisKKyNpZm5kZWYgYXJtZGJnX19oCisjZGVmaW5lIGFybWRiZ19faAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAibXNnLmgiCisKK3R5cGVkZWYgdW5zaWduZWQzMiBBUk1hZGRyZXNzOwordHlwZWRlZiB1bnNpZ25lZDMyIEFSTXdvcmQ7Cit0eXBlZGVmIHVuc2lnbmVkMTYgQVJNaHdvcmQ7CisKKyNpbmNsdWRlICJkYmdfY29uZi5oIgorI2luY2x1ZGUgImRiZ19yZGkuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIERiZ19CeXRlOworCit0eXBlZGVmIGludCBEYmdfRXJyb3I7CisKK3R5cGVkZWYgc3RydWN0IERiZ19NQ1N0YXRlIERiZ19NQ1N0YXRlOworLyogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhdGUgb2YgdGhlIHRhcmdldC4gIFRoZSBzdHJ1Y3R1cmUgaXMgbm90IHJldmVhbGVkLgorICAgQSBwb2ludGVyIHRvIG9uZSBvZiB0aGVzZSBpcyByZXR1cm5lZCBieSBEYmdfSW5pdGlhbGlzZSgpLCBpcyBwYXNzZWQgdG8gYWxsCisgICB0b29sYm94IGNhbGxzIHdoaWNoIHJlZmVyIHRvIHRoZSBzdGF0ZSBvZiB0aGUgdGFyZ2V0LCBhbmQgaXMgZGlzY2FyZGVkCisgICBieSBEYmdfRmluYWxpc2UoKS4KKyAgIE5vdGhpbmcgaW4gdGhlIHRvb2xib3ggaXRzZWxmIHByZWNsdWRlcyB0aGVyZSBiZWluZyBtdWx0aXBsZSB0YXJnZXRzLCBlYWNoCisgICB3aXRoIGl0cyBvd24gc3RhdGUuCisgKi8KKworLyogTW9zdCB0b29sYm94IGludGVyZmFjZXMgcmV0dXJuIGFuIGVycm9yIHN0YXR1cy4gIE9ubHkgYSBmZXcgb2YgdGhlIHN0YXR1cworICAgdmFsdWVzIGFyZSBleHBlY3RlZCB0byBiZSBpbnRlcmVzdGluZyB0byBjbGllbnRzIGFuZCBkZWZpbmVkIGhlcmU7IHRoZQorICAgcmVzdCBhcmUgcHJpdmF0ZSAoYnV0IGEgdGV4dHVhbCBmb3JtIGNhbiBiZSBwcm9kdWNlZCBieSBFcnJvclRvQ2hhcnMoKSkuCisgKi8KKworI2RlZmluZSBFcnJvcl9PSyAwCisKKy8qIFBhcnRpdGlvbmluZyBvZiB0aGUgZXJyb3IgY29kZSBzcGFjZTogZXJyb3JzIGJlbG93IERiZ19FcnJvcl9CYXNlIGFyZSBSREkKKyAgIGVycm9ycyAoYXMgZGVmaW5lZCBpbiBkYmdfcmRpLmgpLiBDb2RlcyBhYm92ZSBEYmdfRXJyb3JfTGltaXQgYXJlCisgICBhdmFpbGFibGUgdG8gY2xpZW50cywgd2hvIG1heSBpbXBvc2Ugc29tZSBmdXJ0aGVyIHN0cnVjdHVyZS4KKyAqLworI2RlZmluZSBEYmdfRXJyb3JfQmFzZSAweDEwMDAKKyNkZWZpbmUgRGJnX0Vycm9yX0xpbWl0IDB4MjAwMAorCisjZGVmaW5lIERiZ0Vycm9yKG4pICgoRGJnX0Vycm9yKShEYmdfRXJyb3JfQmFzZSsobikpKQorCisjZGVmaW5lIERiZ19FcnJfT0sgRXJyb3JfT0sKKyNkZWZpbmUgRGJnX0Vycl9JbnRlcnJ1cHRlZCAgICAgICAgICAgICBEYmdFcnJvcigxKQorI2RlZmluZSBEYmdfRXJyX092ZXJmbG93ICAgICAgICAgICAgICAgIERiZ0Vycm9yKDIpCisjZGVmaW5lIERiZ19FcnJfRmlsZU5vdEZvdW5kICAgICAgICAgICAgRGJnRXJyb3IoMykKKyNkZWZpbmUgRGJnX0Vycl9BY3RpdmF0aW9uTm90UHJlc2VudCAgICBEYmdFcnJvcig0KQorI2RlZmluZSBEYmdfRXJyX091dE9mSGVhcCAgICAgICAgICAgICAgIERiZ0Vycm9yKDUpCisjZGVmaW5lIERiZ19FcnJfVHlwZU5vdFNpbXBsZSAgICAgICAgICAgRGJnRXJyb3IoNikKKyNkZWZpbmUgRGJnX0Vycl9CdWZmZXJGdWxsICAgICAgICAgICAgICBEYmdFcnJvcig3KQorI2RlZmluZSBEYmdfRXJyX0F0U3RhY2tCYXNlICAgICAgICAgICAgIERiZ0Vycm9yKDgpCisjZGVmaW5lIERiZ19FcnJfQXRTdGFja1RvcCAgICAgICAgICAgICAgRGJnRXJyb3IoOSkKKyNkZWZpbmUgRGJnX0Vycl9EYmdUYWJsZUZvcm1hdCAgICAgICAgICBEYmdFcnJvcigxMCkKKyNkZWZpbmUgRGJnX0Vycl9Ob3RWYXJpYWJsZSAgICAgICAgICAgICBEYmdFcnJvcigxMSkKKyNkZWZpbmUgRGJnX0Vycl9Ob1N1Y2hCcmVha1BvaW50ICAgICAgICBEYmdFcnJvcigxMikKKyNkZWZpbmUgRGJnX0Vycl9Ob1N1Y2hXYXRjaFBvaW50ICAgICAgICBEYmdFcnJvcigxMykKKyNkZWZpbmUgRGJnX0Vycl9GaWxlTGluZU5vdEZvdW5kICAgICAgICBEYmdFcnJvcigxNCkKKyNkZWZpbmUgRGJnX0Vycl9EYmdUYWJsZVZlcnNpb24gICAgICAgICBEYmdFcnJvcigxNSkKKyNkZWZpbmUgRGJnX0Vycl9Ob1N1Y2hQYXRoICAgICAgICAgICAgICBEYmdFcnJvcigxNikKKyNkZWZpbmUgRGJnX0Vycl9TdGF0ZUNoYW5nZWQgICAgICAgICAgICBEYmdFcnJvcigxNykKKyNkZWZpbmUgRGJnX0Vycl9Tb2Z0SW5pdGlhbGlzZUVycm9yICAgICBEYmdFcnJvcigxOCkKKyNkZWZpbmUgRGJnX0Vycl9Db1Byb1JlZ05vdFdyaXRhYmxlICAgICBEYmdFcnJvcigxOSkKKyNkZWZpbmUgRGJnX0Vycl9Ob3RJbkhpc3RvcnkgICAgICAgICAgICBEYmdFcnJvcigyMCkKKyNkZWZpbmUgRGJnX0Vycl9Db250ZXh0U3ludGF4ICAgICAgICAgICBEYmdFcnJvcigyMSkKKyNkZWZpbmUgRGJnX0Vycl9Db250ZXh0Tm9MaW5lICAgICAgICAgICBEYmdFcnJvcigyMikKKyNkZWZpbmUgRGJnX0Vycl9Db250ZXh0VHdvTGluZXMgICAgICAgICBEYmdFcnJvcigyMykKKyNkZWZpbmUgRGJnX0Vycl9WYXJSZWFkT25seSAgICAgICAgICAgICBEYmdFcnJvcigyNCkKKyNkZWZpbmUgRGJnX0Vycl9GaWxlTmV3ZXJUaGFuSW1hZ2UgICAgICBEYmdFcnJvcigyNSkKKyNkZWZpbmUgRGJnX0Vycl9Ob3RGb3VuZCAgICAgICAgICAgICAgICBEYmdFcnJvcigyNikKKworICAgLyogZnVuY3Rpb25zIHdoaWNoIGV2YWx1YXRlIGV4cHJlc3Npb25zIG1heSByZXR1cm4gdGhpcyB2YWx1ZSwgdG8gaW5kaWNhdGUKKyAgICAgIHRoYXQgZXhlY3V0aW9uIGJlY2FtZSBzdXNwZW5kZWQgd2l0aGluIGEgZnVuY3Rpb24gY2FsbGVkIGluIHRoZSBkZWJ1Z2VlICovCisKKy8qIEZ1bmN0aW9ucyByZXR1cm5pbmcgY2hhcmFjdGVycyB0YWtlIGEgQnVmRGVzYyBhcmd1bWVudCwgd2l0aCBmaWVsZHMgYnVmZmVyCisgICBhbmQgYnVmc2l6ZSBiZWluZyBpbnB1dCBhcmd1bWVudHMgZGVzY3JpYmluZyB0aGUgYnVmZmVyIHRvIGJlIGZpbGxlZCwgYW5kCisgICBmaWxsZWQgYmVpbmcgc2V0IG9uIHJldHVybiB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlcgorICAgKG9taXR0aW5nIHRoZSB0ZXJtaW5hdGluZyAwKS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBEYmdfQnVmRGVzYyBEYmdfQnVmRGVzYzsKKwordHlwZWRlZiB2b2lkIERiZ19CdWZmZXJGdWxsUHJvYyhEYmdfQnVmRGVzYyAqYmQpOworCitzdHJ1Y3QgRGJnX0J1ZkRlc2MgeworICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgZmlsbGVkOworICAgIERiZ19CdWZmZXJGdWxsUHJvYyAqcDsKKyAgICB2b2lkICphcmc7Cit9OworCisjZGVmaW5lIERiZ19Jbml0QnVmRGVzYyhiZCwgYnVmLCBieXRlcykgXAorICAgICgoYmQpLmJ1ZmZlciA9IChidWYpLCAoYmQpLnNpemUgPSAoYnl0ZXMpLCAoYmQpLmZpbGxlZCA9IDAsXAorICAgICAoYmQpLnAgPSBOVUxMLCAoYmQpLmFyZyA9IE5VTEwpCisKKyNkZWZpbmUgRGJnX0luaXRCdWZEZXNjX1AoYmQsIGJ1ZiwgYnl0ZXMsIGZuLCBhKSBcCisgICAgKChiZCkuYnVmZmVyID0gKGJ1ZiksIChiZCkuc2l6ZSA9IChieXRlcyksIChiZCkuZmlsbGVkID0gMCxcCisgICAgIChiZCkucCA9IChmbiksIChiZCkuYXJnID0gKGEpKQorCitEYmdfRXJyb3IgRGJnX1N0cmluZ1RvQnVmKERiZ19CdWZEZXNjICpidWYsIGNoYXIgY29uc3QgKnMpOworRGJnX0Vycm9yIERiZ19CdWZQcmludGYoRGJnX0J1ZkRlc2MgKmJ1ZiwgY2hhciBjb25zdCAqZm9ybSwgLi4uKTsKKyNpZmRlZiBOTFMKK0RiZ19FcnJvciBEYmdfTXNnVG9CdWYoRGJnX0J1ZkRlc2MgKmJ1ZiwgbXNnX3QgdCk7CitEYmdfRXJyb3IgRGJnX0J1Zk1zZ1ByaW50ZihEYmdfQnVmRGVzYyAqYnVmLCBtc2dfdCBmb3JtLCAuLi4pOworI2Vsc2UKKyNkZWZpbmUgRGJnX01zZ1RvQnVmIERiZ19TdHJpbmdUb0J1ZgorI2RlZmluZSBEYmdfQnVmTXNnUHJpbnRmIERiZ19CdWZQcmludGYKKyNlbmRpZgorRGJnX0Vycm9yIERiZ19DaGFyVG9CdWYoRGJnX0J1ZkRlc2MgKmJ1ZiwgaW50IGNoKTsKKworaW50IERiZ19DSVN0ckNtcChjaGFyIGNvbnN0ICpzMSwgY2hhciBjb25zdCAqczIpOworLyogQ2FzZS1pbmRlcGVuZGVudCBzdHJpbmcgY29tcGFyaXNvbiwgaW50ZXJmYWNlIGFzIGZvciBzdHJjbXAgKi8KKworaW50IERiZ19DSVN0cm5DbXAoY2hhciBjb25zdCAqczEsIGNoYXIgY29uc3QgKnMyLCBzaXplX3Qgbik7CisvKiBDYXNlLWluZGVwZW5kZW50IHN0cmluZyBjb21wYXJpc29uLCBpbnRlcmZhY2UgYXMgZm9yIHN0cm5jbXAgKi8KKwordm9pZCBEYmdfRXJyb3JUb0NoYXJzKERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX0Vycm9yIGVyciwgRGJnX0J1ZkRlc2MgKmJ1Zik7CisKK3R5cGVkZWYgaW50IERiZ19SRElSZXNldENoZWNrUHJvYyhpbnQpOworLyogVHlwZSBvZiBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhZnRlciBlYWNoIFJESSBvcGVyYXRpb24gcGVyZm9ybWVkIGJ5IHRoZQorICAgdG9vbGJveCwgd2l0aCB0aGUgc3RhdHVzIGZyb20gdGhlIG9wZXJhdGlvbiBhcyBhcmd1bWVudC4gIFRoZSB2YWx1ZSByZXR1cm5lZAorICAgaXMgdHJlYXRlZCBhcyB0aGUgc3RhdHVzLiAgKFRoZSBpbnRlbnQgaXMgdG8gYWxsb3cgdGhlIHRvb2xib3gncyBjbGllbnQgdG8KKyAgIHRha2Ugc3BlY2lhbCBhY3Rpb24gdG8gaGFuZGxlIFJESURiZ19FcnJvcl9SZXNldCkuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgRGJnX0NvUHJvRGVzYyBEYmdfQ29Qcm9EZXNjOworCit0eXBlZGVmIERiZ19FcnJvciBEYmdfQ29Qcm9Gb3VuZFByb2MoRGJnX01DU3RhdGUgKnN0YXRlLCBpbnQgY3BubywgRGJnX0NvUHJvRGVzYyBjb25zdCAqY3BkKTsKKy8qIFR5cGUgb2YgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgc2hhcGUgb2YgYSBjb3Byb2Nlc3NvciBpcyBkaXNjb3ZlcmVkCisgICBieSBlbnF1aXJ5IG9mIHRoZSB0YXJnZXQgb3IgYWdlbnQgKHZpYSBSZXF1ZXN0Q29Qcm9EZXNjKQorICovCisKK3R5cGVkZWYgc3RydWN0IFJESVByb2NWZWMgUkRJUHJvY1ZlYzsKKworRGJnX0Vycm9yIERiZ19SZXF1ZXN0UmVzZXQoRGJnX01DU3RhdGUgKik7CisKK0RiZ19FcnJvciBEYmdfSW5pdGlhbGlzZSgKKyAgICBEYmdfQ29uZmlnQmxvY2sgKmNvbmZpZywgRGJnX0hvc3Rvc0ludGVyZmFjZSBjb25zdCAqaSwKKyAgICBEYmdfUkRJUmVzZXRDaGVja1Byb2MgKmNoZWNrcmVzZXQsIERiZ19Db1Byb0ZvdW5kUHJvYyAqY29wcm9mb3VuZCwKKyAgICBSRElQcm9jVmVjIGNvbnN0ICpyZGksIERiZ19NQ1N0YXRlICoqc3RhdGVwKTsKKy8qIHZhbHVlcyBpbiBjb25maWcgYXJlIHVwZGF0ZWQgaWYgdGhleSBjYWxsIGZvciBkZWZhdWx0IHZhbHVlcyAqLworCit2b2lkIERiZ19GaW5hbGlzZShEYmdfTUNTdGF0ZSAqc3RhdGUsIGJvb2wgdGFyZ2V0ZGVhZCk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyIG5hbWVbMTZdOworICAgIFJESV9NZW1EZXNjciBtZDsKKyAgICBSRElfTWVtQWNjZXNzU3RhdHMgYTsKK30gRGJnX01lbVN0YXRzOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU3ltYm9sIHRhYmxlIG1hbmFnZW1lbnQuCisgICBUaGUgc3RydWN0dXJlIG9mIGEgRGJnX1N5bVRhYmxlIGlzIG5vdCByZXZlYWxlZC4gIEl0IGlzIGNyZWF0ZWQgYnkKKyAgIERiZ19SZWFkU3ltYm9scygpIG9yIGJ5IERiZ19Mb2FkRmlsZSgpLCBhbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcmd1bWVudAorICAgRGJnX01DU3RhdGUuCisgICBNYW55IHN5bWJvbCB0YWJsZXMgbWF5IGJlIGNvbmN1cnJlbnRseSBhY3RpdmUuCisgICBBIERiZ19TeW1UYWJsZSBpcyByZW1vdmVkIGVpdGhlciBleHBsaWNpdGx5IChieSBjYWxsIHRvIERiZ19EZWxldGVTeW1ib2xzKQorICAgb3IgaW1wbGljaXRseSB3aGVuIGEgc3ltYm9sIHRhYmxlIGZvciBhbiBvdmVybGFwcGluZyBhZGRyZXNzIHJhbmdlIGlzIHJlYWQuCisKKyAgIFRoZXJlIGlzIGEgcHJlLWRlZmluZWQgc3ltYm9sIHRhYmxlIGNvbnRhaW5pbmcgZW50cmllcyBmb3IgQVJNIHJlZ2lzdGVycywKKyAgIGNvLXByb2Nlc3NvciByZWdpc3RlcnMgYW5kIHRoZSBsaWtlLgorICovCisKK3R5cGVkZWYgc3RydWN0IERiZ19TeW1UYWJsZSBEYmdfU3ltVGFibGU7CisKK3R5cGVkZWYgc3RydWN0IERiZ19JbWFnZUZyYWdtZW50RGVzYyB7CisgICAgQVJNYWRkcmVzcyBiYXNlLCBsaW1pdDsKK30gRGJnX0ltYWdlRnJhZ21lbnREZXNjOworCit0eXBlZGVmIGVudW0geworICAgIERiZ19MYW5nX05vbmUsCisgICAgRGJnX0xhbmdfQywKKyAgICBEYmdfTGFuZ19QYXNjYWwsCisgICAgRGJnX0xhbmdfRm9ydHJhbiwKKyAgICBEYmdfTGFuZ19Bc20sCisgICAgRGJnX0xhbmdfQ3BwCit9IERiZ19MYW5nOworCit0eXBlZGVmIHN0cnVjdCBEYmdfSW1hZ2VEZXNjIHsKKyAgICBEYmdfTGFuZyBsYW5nOworICAgIGludCBleGVjdXRhYmxlOworICAgIEFSTWFkZHJlc3Mgcm9iYXNlLCByb2xpbWl0LCByd2Jhc2UsIHJ3bGltaXQ7CisgICAgaW50IG5mcmFnczsKKyAgICBEYmdfSW1hZ2VGcmFnbWVudERlc2MgKmZyYWdtZW50czsKKyAgICBjaGFyICpuYW1lOworfSBEYmdfSW1hZ2VEZXNjOworCitEYmdfSW1hZ2VEZXNjICpEYmdfSW1hZ2VBcmVhcyhEYmdfU3ltVGFibGUgKnN0KTsKKworRGJnX1N5bVRhYmxlICpEYmdfTGFzdEltYWdlKERiZ19NQ1N0YXRlICpzdGF0ZSk7CisKK0RiZ19TeW1UYWJsZSAqRGJnX05ld1N5bVRhYmxlKERiZ19NQ1N0YXRlICpzdGF0ZSwgY29uc3QgY2hhciAqbmFtZSk7CisKK0RiZ19FcnJvciBEYmdfUmVhZFN5bWJvbHMoRGJnX01DU3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgRGJnX1N5bVRhYmxlICoqc3QpOworLyogSnVzdCByZWFkIHRoZSBzeW1ib2xzIGZyb20gdGhlIG5hbWVkIGltYWdlLiAgPHN0PiBpcyBzZXQgdG8gdGhlIGFsbG9jYXRlZAorICAgc3ltYm9sIHRhYmxlLgorPyAgTWF5YmUgd2UgY291bGQgdXNlZnVsbHkgYWxsb3cgb3RoZXIgZm9ybWF0cyB0aGFuIEFJRiBpbWFnZXMgdG8gZGVzY3JpYmUKKyAgIHRoZSBzeW1ib2xzIChlZykgb2Ygc2hhcmVkIGxpYnJhcmllcworICovCisKK3R5cGVkZWYgc3RydWN0IERiZ19TeW1JbmZvIHsKKyAgICBpbnQgaXNpemU7CisgICAgQVJNYWRkcmVzcyBhZGRyOworICAgIGNoYXIgKm5hbWU7Cit9IERiZ19TeW1JbmZvOworCitEYmdfU3ltSW5mbyAqRGJnX0FzbVN5bShEYmdfU3ltVGFibGUgKnN0LCBBUk1hZGRyZXNzIGFkZHIpOworaW50MzIgRGJnX0FzbUFkZHIoRGJnX1N5bVRhYmxlICpzdCwgaW50MzIgbGluZSk7CitpbnQzMiBEYmdfQXNtTGluZShEYmdfU3ltVGFibGUgKnN0LCBBUk1hZGRyZXNzIGFkZHIpOworaW50MzIgRGJnX0FzbUxpbmVzSW5SYW5nZShEYmdfU3ltVGFibGUgKnN0LCBBUk1hZGRyZXNzIHN0YXJ0LCBBUk1hZGRyZXNzIGVuZCk7CisKK0RiZ19FcnJvciBEYmdfTG9hZEZpbGUoRGJnX01DU3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgRGJnX1N5bVRhYmxlICoqc3QpOworLyogbG9hZCB0aGUgaW1hZ2UgaW50byB0YXJnZXQgbWVtb3J5LCBhbmQgcmVhZCBpdHMgc3ltYm9scy4gIDxzdD4gaXMgc2V0IHRvCisgICB0aGUgYWxsb2NhdGVkIHN5bWJvbCB0YWJsZS4KKyAgIEEgbnVsbCBmaWxlbmFtZSByZWxvYWRzIHRoZSBtb3N0IHJlY2VudGx5IGxvYWRlZCBmaWxlIChhbmQgcmVyZWFkcyBpdHMKKyAgIHN5bWJvbHMpLgorICAgTG9hZGluZyBhbiBpbWFnZSBsZWF2ZXMgYnJlYWtwb2ludHMgdW5jaGFuZ2VkLiAgSWYgYSBjbGllbnQgd2lzaGVzCisgICBvdGhlcndpc2UsIGl0IG11c3QgcmVtb3ZlIHRoZSBicmVha3BvaW50cyBleHBsaWNpdGx5LgorKi8KKworRGJnX0Vycm9yIERiZ19DYWxsR0xvYWRGaWxlKERiZ19NQ1N0YXRlICpzdGF0ZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsIERiZ19TeW1UYWJsZSAqKnN0KTsKKwordHlwZWRlZiB2b2lkIERiZ19JbWFnZUxvYWRQcm9jKERiZ19NQ1N0YXRlICosIERiZ19TeW1UYWJsZSAqKTsKK0RiZ19FcnJvciBEYmdfT25JbWFnZUxvYWQoRGJnX01DU3RhdGUgKiwgRGJnX0ltYWdlTG9hZFByb2MgKik7CisvKiBSZWdpc3RlciBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYmFjayB3aGVuZXZlciBhbiBpbWFnZSBpcyBsb2FkZWQsIG9yIHN5bWJvbHMKKyAqIGZvciBhbiBpbWFnZSByZWFkLiAoVG8gYWxsb3cgbXVsdGlwbGUgdG9vbGJveCBjbGllbnRzIHRvIGNvZXhpc3QpLgorICovCisKK0RiZ19FcnJvciBEYmdfTG9hZEFnZW50KERiZ19NQ1N0YXRlICpzdGF0ZSwgY29uc3QgY2hhciAqZmlsZW5hbWUpOworLyogTG9hZCBhIGRlYnVnIGFnZW50LCBhbmQgc3RhcnQgaXQuCisgICBTeW1ib2xzIGluIHRoZSBpbWFnZSBmb3IgdGhlIGFnZW50IGFyZSBpZ25vcmVkLgorKi8KKworRGJnX0Vycm9yIERiZ19SZWxvY2F0ZVN5bWJvbHMoRGJnX1N5bVRhYmxlICpzdCwgQVJNYWRkcmVzcyByZWxvYyk7CisvKiBhZGQgPHJlbG9jPiB0byB0aGUgdmFsdWUgb2YgYWxsIHN5bWJvbHMgaW4gPHN0PiBkZXNjcmliaW5nIGFic29sdXRlIG1lbW9yeQorICAgbG9jYXRpb25zLiAgVGhlIGludGVudCBpcyB0byBhbGxvdyB0aGUgc3ltYm9scyBpbiBhIGxvYWQtdGltZSByZWxvY2F0aW5nCisgICBpbWFnZSAoZm9yIGV4YW1wbGUpIHRvIGJlIHVzZWZ1bC4KKyAqLworCitEYmdfRXJyb3IgRGJnX0RlbGV0ZVN5bWJvbHMoRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfU3ltVGFibGUgKipzdCk7CisKK3R5cGVkZWYgZW51bSBEYmdfTExTeW1UeXBlIHsKKyAgICBsbHN0X2NvZGUsCisgICAgbGxzdF9jb2RlMTYsCisgICAgbGxzdF9kYXRhLAorICAgIGxsc3RfY29uc3QsCisgICAgbGxzdF91bmtub3duLAorICAgIGxsc3RfbWF4Cit9IERiZ19MTFN5bVR5cGU7CisvKiBTaW5jZSBBSUYgaW1hZ2VzIGNvbnRhaW4gbm8gdHlwZSBpbmZvcm1hdGlvbiBmb3IgbG93LWxldmVsIHN5bWJvbHMsIHRoaXMKKyAgIGNsYXNzaWZpY2F0aW9uIGlzIG9ubHkgYSBndWVzcywgYW5kIHNvbWUgc3ltYm9scyBkZXNjcmliaW5nIGNvbnN0YW50cyB3aWxsCisgICBpbmNvcnJlY3RseSBiZSBkZXNjcmliZWQgYXMgY29kZSBvciBkYXRhLgorICovCisKK3R5cGVkZWYgRGJnX0Vycm9yIERiZ19TeW1Qcm9jKAorICAgIERiZ19NQ1N0YXRlICpzdGF0ZSwKKyAgICBjb25zdCBjaGFyICpzeW1ib2wsIERiZ19MTFN5bVR5cGUgc3ltdHlwZSwgQVJNYWRkcmVzcyB2YWx1ZSwKKyAgICB2b2lkICphcmcpOworCitEYmdfRXJyb3IgRGJnX0VudW1lcmF0ZUxvd0xldmVsU3ltYm9scygKKyAgICBEYmdfTUNTdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgKm1hdGNoLCBEYmdfU3ltUHJvYyAqcCwKKyAgICB2b2lkICphcmcpOworLyogQ2FsbCAgcChuYW1lLCB2YWx1ZSkgIGZvciBlYWNoIGxvdyBsZXZlbCBzeW1ib2wgaW4gdGhlIHRhYmxlcyBvZiA8c3RhdGU+CisgICB3aG9zZSBuYW1lIG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiA8bWF0Y2g+IChhIE5VTEwgPG1hdGNoPiBtYXRjaGVzCisgICBhbnkgbmFtZSkuICBTeW1ib2xzIGFyZSBlbnVtZXJhdGVkIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgaGVyZSB0byBhbGxvdyBxdWljayBtYXNzIGFjY2VzcyB0byByZWdpc3RlciB2YWx1ZXMKKyAgIGZvciBkaXNwbGF5LiAgVGhlcmUgaXMgbm8gY29tcGFyYWJsZSBuZWVkIGZvciBxdWljayBtYXNzIHVwZGF0ZSwgc28gd3JpdGluZworICAgc2hvdWxkIGJlIHZpYSBBc3NpZ24oKS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBEYmdfUmVnU2V0IHsKKyAgICBBUk13b3JkCisgICAgICAgIHVzZXJbMTVdLAorICAgICAgICBwYywKKyAgICAgICAgcHNyLAorICAgICAgICBmaXFbN10sCisgICAgICAgIHNwc3JfZmlxLAorICAgICAgICBpcnFbMl0sCisgICAgICAgIHNwc3JfaXJxLAorICAgICAgICBzdmNbMl0sCisgICAgICAgIHNwc3Jfc3ZjLAorICAgICAgICBhYm9ydFsyXSwKKyAgICAgICAgc3Bzcl9hYm9ydCwKKyAgICAgICAgdW5kZWZbMl0sCisgICAgICAgIHNwc3JfdW5kZWY7Cit9IERiZ19SZWdTZXQ7CisKKy8qIGJpdHMgaW4gdGhlIG1vZGVtYXNrIGFyZ3VtZW50IGZvciBSZWFkUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgRGJnX01NX1VzZXIgICAgIDEKKyNkZWZpbmUgRGJnX01NX0ZJUSAgICAgIDIKKyNkZWZpbmUgRGJnX01NX0lSUSAgICAgIDQKKyNkZWZpbmUgRGJnX01NX1NWQyAgICAgIDgKKyNkZWZpbmUgRGJnX01NX0Fib3J0IDB4MTAKKyNkZWZpbmUgRGJnX01NX1VuZGVmIDB4MjAKKyNkZWZpbmUgRGJnX01NX1N5c3RlbSAweDQwCisKK0RiZ19FcnJvciBEYmdfUmVhZFJlZ2lzdGVycyhEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19SZWdTZXQgKnJlZ3MsIGludCBtb2RlbWFzayk7CisKK0RiZ19FcnJvciBEYmdfV3JpdGVSZWdpc3RlcihEYmdfTUNTdGF0ZSAqc3RhdGUsIGludCBybm8sIGludCBtb2RlbWFzaywgQVJNd29yZCB2YWwpOworCitpbnQgRGJnX1N0cmluZ1RvTW9kZShjb25zdCBjaGFyICpuYW1lKTsKKworaW50IERiZ19Nb2RlVG9Nb2RlTWFzayhBUk13b3JkIG1vZGUpOworCisvKiBTb21lIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgRlAgaW5zdHJ1Y3Rpb24gc2V0IGtlZXAgRlAgdmFsdWVzIGxvYWRlZCBpbnRvCisgICByZWdpc3RlcnMgaW4gdGhlaXIgdW5jb252ZXJ0ZWQgZm9ybWF0LCBjb252ZXJ0aW5nIG9ubHkgd2hlbiBuZWNlc3NhcnkuCisgICBTb21lIFJESSBpbXBsZW1lbnRhdGlvbnMgZGVsaXZlciB0aGVzZSB2YWx1ZXMgdW5pbnRlcnByZXRlZC4KKyAgIChGb3IgdGhlIHJlc3QsIHJlZ2lzdGVyIHZhbHVlcyB3aWxsIGFsd2F5cyBoYXZlIHR5cGUgRl9FeHRlbmRlZCkuCisgKi8KKwordHlwZWRlZiBlbnVtIHsgRl9TaW5nbGUsIEZfRG91YmxlLCBGX0V4dGVuZGVkLCBGX1BhY2tlZCwgLyogZnBlMzQwIHZhbHVlcyAqLworICAgICAgICAgICAgICAgRl9JbnRlcm5hbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV3IGZwZSA6IG1vc3RseSBhcyBleHRlbmRlZCAqLworICAgICAgICAgICAgICAgRl9Ob25lIH0gRGJnX0ZQVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeyBBUk13b3JkIHdbM107IH0gRGJnX1RhcmdldEV4dGVuZGVkVmFsOwordHlwZWRlZiBzdHJ1Y3QgeyBBUk13b3JkIHdbM107IH0gRGJnX1RhcmdldFBhY2tlZFZhbDsKK3R5cGVkZWYgc3RydWN0IHsgQVJNd29yZCB3WzJdOyB9IERiZ19UYXJnZXREb3VibGVWYWw7Cit0eXBlZGVmIHN0cnVjdCB7IEFSTXdvcmQgd1sxXTsgfSBEYmdfVGFyZ2V0RmxvYXRWYWw7CisKK3R5cGVkZWYgdW5pb24geyBEYmdfVGFyZ2V0RXh0ZW5kZWRWYWwgZTsgRGJnX1RhcmdldFBhY2tlZFZhbCBwOworICAgICAgICAgICAgICAgIERiZ19UYXJnZXREb3VibGVWYWwgZDsgRGJnX1RhcmdldEZsb2F0VmFsIGY7IH0gRGJnX1RhcmdldEZQVmFsOworCisjZGVmaW5lIFRhcmdldFNpemVvZl9FeHRlbmRlZCAxMgorI2RlZmluZSBUYXJnZXRTaXplb2ZfUGFja2VkICAgMTIKKyNkZWZpbmUgVGFyZ2V0U2l6ZW9mX0RvdWJsZSAgIDgKKyNkZWZpbmUgVGFyZ2V0U2l6ZW9mX0Zsb2F0ICAgIDQKKwordHlwZWRlZiBzdHJ1Y3QgRGJnX0ZQUmVnVmFsIHsKKyAgICAgRGJnX0ZQVHlwZSB0eXBlOworICAgICBEYmdfVGFyZ2V0RlBWYWwgdjsKK30gRGJnX0ZQUmVnVmFsOworCit0eXBlZGVmIHN0cnVjdCBEYmdfRlBSZWdTZXQgeworICAgIERiZ19GUFJlZ1ZhbCBmWzhdOworICAgIEFSTXdvcmQgZnBzciwgZnBjcjsKK30gRGJnX0ZQUmVnU2V0OworCitEYmdfRXJyb3IgRGJnX1JlYWRGUFJlZ2lzdGVycyhEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19GUFJlZ1NldCAqcmVncyk7CisKK0RiZ19FcnJvciBEYmdfV3JpdGVGUFJlZ2lzdGVycyhEYmdfTUNTdGF0ZSAqc3RhdGUsIGludDMyIG1hc2ssIERiZ19GUFJlZ1NldCAqcmVncyk7CisKK0RiZ19FcnJvciBEYmdfRlBSZWdUb0RvdWJsZShEYmxlQmluICpkLCBEYmdfRlBSZWdWYWwgY29uc3QgKmYpOworLyogQ29udmVydHMgZnJvbSBhIEZQIHJlZ2lzdGVyIHZhbHVlIChpbiBhbnkgZm9ybWF0KSB0byBhIGRvdWJsZSB3aXRoCisgICBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIHZhbHVlIChvciByZXR1cm5zIERiZ19FcnJfT3ZlcmZsb3cpCisgKi8KKwordm9pZCBEYmdfRG91YmxlVG9GUFJlZyhEYmdfRlBSZWdWYWwgKmYsIERibGVCaW4gY29uc3QgKmQpOworLyogQ29udmVydHMgdGhlIGRvdWJsZSA8ZD4gdG8gYSBEYmdfRlBSZWdWYWwgd2l0aCB0eXBlIEZfRXh0ZW5kZWQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJkYmdfY3AuaCIKKworRGJnX0Vycm9yIERiZ19EZXNjcmliZUNvUHJvKERiZ19NQ1N0YXRlICpzdGF0ZSwgaW50IGNwbnVtLCBEYmdfQ29Qcm9EZXNjICpwKTsKKworRGJnX0Vycm9yIERiZ19EZXNjcmliZUNvUHJvX1JESShEYmdfTUNTdGF0ZSAqc3RhdGUsIGludCBjcG51bSwgRGJnX0NvUHJvRGVzYyAqcCk7CisKK0RiZ19FcnJvciBEYmdfUmVhZENQUmVnaXN0ZXJzKERiZ19NQ1N0YXRlICpzdGF0ZSwgaW50IGNwbnVtLCBBUk13b3JkICpyZWdzKTsKKworRGJnX0Vycm9yIERiZ19Xcml0ZUNQUmVnaXN0ZXJzKERiZ19NQ1N0YXRlICpzdGF0ZSwgaW50IGNwbnVtLCBpbnQzMiBtYXNrLCBBUk13b3JkICpyZWdzKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0RiZ19FcnJvciBEYmdfUmVhZFdvcmRzKAorICAgIERiZ19NQ1N0YXRlICpzdGF0ZSwKKyAgICBBUk13b3JkICp3b3JkcywgQVJNYWRkcmVzcyBhZGRyLCB1bnNpZ25lZCBjb3VudCk7CisvKiBSZWFkcyBhIG51bWJlciBvZiAoMzItYml0KSB3b3JkcyBmcm9tIHRhcmdldCBzdG9yZS4gIFRoZSB2YWx1ZXMgYXJlIGluIGhvc3QKKyAgIGJ5dGUgb3JkZXI7IGlmIHRoZXkgYXJlIGFsc28gdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYnl0ZXMgRGJnX1N3YXBCeXRlT3JkZXIoKQorICAgbXVzdCBiZSBjYWxsZWQgdG8gY29udmVydCB0byB0YXJnZXQgYnl0ZSBvcmRlci4KKyAqLworCitEYmdfRXJyb3IgRGJnX1dyaXRlV29yZHMoCisgICAgRGJnX01DU3RhdGUgKnN0YXRlLAorICAgIEFSTWFkZHJlc3MgYWRkciwgY29uc3QgQVJNd29yZCAqd29yZHMsIHVuc2lnbmVkIGNvdW50KTsKKy8qIFdyaXRlcyBhIG51bWJlciBvZiAoMzItYml0KSB3b3JkcyB0byB0YXJnZXQgc3RvcmUuICBUaGUgdmFsdWVzIGFyZSBpbiBob3N0CisgICBieXRlIG9yZGVyIChpZiB3aGF0IGlzIGJlaW5nIHdyaXR0ZW4gaXMgYWN0dWFsbHkgYSBieXRlIHN0cmluZyBpdCBtdXN0IGJlCisgICBjb252ZXJ0ZWQgYnkgRGJnX1N3YXBCeXRlT3JkZXIoKSkuCisgKi8KKworRGJnX0Vycm9yIERiZ19SZWFkSGFsZihEYmdfTUNTdGF0ZSAqc3RhdGUsIEFSTWh3b3JkICp2YWwsIEFSTWFkZHJlc3MgYWRkcik7CitEYmdfRXJyb3IgRGJnX1dyaXRlSGFsZihEYmdfTUNTdGF0ZSAqc3RhdGUsIEFSTWFkZHJlc3MgYWRkciwgQVJNd29yZCB2YWwpOworCitEYmdfRXJyb3IgRGJnX1JlYWRCeXRlcyhEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19CeXRlICp2YWwsIEFSTWFkZHJlc3MgYWRkciwgdW5zaWduZWQgY291bnQpOworRGJnX0Vycm9yIERiZ19Xcml0ZUJ5dGVzKERiZ19NQ1N0YXRlICpzdGF0ZSwgQVJNYWRkcmVzcyBhZGRyLCBjb25zdCBEYmdfQnl0ZSAqdmFsLCB1bnNpZ25lZCBjb3VudCk7CisKK3ZvaWQgRGJnX0hvc3RXb3JkcyhEYmdfTUNTdGF0ZSAqc3RhdGUsIEFSTXdvcmQgKndvcmRzLCB1bnNpZ25lZCB3b3JkY291bnQpOworLyogKEEgbm9vcCB1bmxlc3MgaG9zdCBhbmQgdGFyZ2V0IGJ5dGVzZXhlcyBkaWZmZXIpICovCisKK0FSTXdvcmQgRGJnX0hvc3RXb3JkKERiZ19NQ1N0YXRlICpzdGF0ZSwgQVJNd29yZCB2KTsKKworQVJNaHdvcmQgRGJnX0hvc3RIYWxmKERiZ19NQ1N0YXRlICpzdGF0ZSwgQVJNd29yZCB2KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFR5cGVzIGRlc2NyaWJpbmcgdmFyaW91cyBhc3BlY3RzIG9mIHBvc2l0aW9uIHdpdGhpbiBjb2RlLgorICAgVGhlcmUgYXJlIHJhdGhlciBhIGxvdCBvZiB0aGVzZSwgaW4gdGhlIGludGVyZXN0cyBvZiBkZXNjcmliaW5nIHByZWNpc2VseQorICAgd2hhdCBmaWVsZHMgbXVzdCBiZSBwcmVzZW50IChyYXRoZXIgdGhhbiBoYXZpbmcgYSBzaW5nbGUgdHlwZSB3aXRoIG1hbnkKKyAgIGZpZWxkcyB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSB2YWxpZCBhY2NvcmRpbmcgdG8gY29udGV4dCkuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgRGJnX0xMUG9zIHsKKyAgICBEYmdfU3ltVGFibGUgKnN0OworICAgIGNoYXIgKmxsc3ltOworICAgIEFSTWFkZHJlc3Mgb2Zmc2V0OworfSBEYmdfTExQb3M7CisKK3R5cGVkZWYgc3RydWN0IERiZ19GaWxlIHsKKyAgICBEYmdfU3ltVGFibGUgKnN0OworICAgIGNoYXIgKmZpbGU7Cit9IERiZ19GaWxlOworCit0eXBlZGVmIHN0cnVjdCBEYmdfTGluZSB7CisgICAgdW5zaWduZWQzMiBsaW5lOyAgICAgIC8qIGxpbmVudW1iZXIgaW4gdGhlIGZpbGUgKi8KKyAgICB1bnNpZ25lZDE2IHN0YXRlbWVudCwgLyogd2l0aGluIHRoZSBsaW5lICgxLWJhc2VkKSAqLworICAgICAgICAgICAgICAgY2hhcnBvczsgICAvKiBkaXR0byAqLworfSBEYmdfTGluZTsKKy8qIEFzIGFuIG91dHB1dCB2YWx1ZSBmcm9tIHRvb2xib3ggZnVuY3Rpb25zLCBib3RoIHN0YXRlbWVudCBhbmQgY2hhcnBvcyBhcmUgc2V0CisgICBpZiB0aGUgdmVyc2lvbiBvZiB0aGUgZGVidWdnZXIgdGFibGVzIGZvciB0aGUgc2VjdGlvbiBjb25jZXJuZWQgcGVybWl0cy4KKyAgIE9uIGlucHV0LCA8Y2hhcnBvcz4gaXMgdXNlZCBvbmx5IGlmIDxzdGF0ZW1lbnQ+IGlzIDAgKGluIHdoaWNoIGNhc2UsIGlmCisgICA8Y2hhcnBvcz4gaXMgbm9uLTAsIERiZ19FcnJfRGJnVGFibGVWZXJzaW9uIGlzIHJldHVybmVkIGlmIHRoZSB2ZXJzaW9uIG9mCisgICB0aGUgZGVidWdnZXIgdGFibGVzIGNvbmNlcm5lZCBpcyB0b28gZWFybHkuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgRGJnX0ZpbGVQb3MgeworICAgIERiZ19GaWxlIGY7CisgICAgRGJnX0xpbmUgbGluZTsKK30gRGJnX0ZpbGVQb3M7CisKK3R5cGVkZWYgc3RydWN0IERiZ19Qcm9jRGVzYyB7CisgICAgRGJnX0ZpbGUgZjsKKyAgICBjaGFyICpuYW1lOworfSBEYmdfUHJvY0Rlc2M7CisKK3R5cGVkZWYgc3RydWN0IERiZ19Qcm9jUG9zIHsKKyAgICBEYmdfUHJvY0Rlc2MgcDsKKyAgICBEYmdfTGluZSBsaW5lOworfSBEYmdfUHJvY1BvczsKKworLyogU3VwcG9ydCBmb3IgY29udmVyc2lvbnMgYmV0d2VlbiBwb3NpdGlvbiByZXByZXNlbnRhdGlvbnMgKi8KKworRGJnX0Vycm9yIERiZ19Qcm9jRGVzY1RvTGluZShEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19Qcm9jRGVzYyAqcHJvYywgRGJnX0xpbmUgKmxpbmUpOworLyogSWYgcHJvYy0+Zi5maWxlIGlzIG51bGwgKGFuZCB0aGVyZSBpcyBqdXN0IG9uZSBmdW5jdGlvbiBwcm9jLT5uYW1lKSwgaXQgaXMKKyAgIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyAodGhlIHN0YXJ0IG9mKQorICAgcHJvYy0+bmFtZS4KKyAqLworCitEYmdfRXJyb3IgRGJnX0ZpbGVQb3NUb1Byb2MoRGJnX01DU3RhdGUgKnN0YXRlLCBjb25zdCBEYmdfRmlsZVBvcyAqcG9zLCBjaGFyICoqcHJvY25hbWUpOworCisvKiBDb252ZXJzaW9ucyBmcm9tIHBvc2l0aW9uIHJlcHJlc2VudGF0aW9ucyB0byBhbmQgZnJvbSBjb2RlIGFkZHJlc3NlcyAqLworCitEYmdfRXJyb3IgRGJnX0FkZHJlc3NUb1Byb2NQb3MoCisgICAgRGJnX01DU3RhdGUgKnN0YXRlLCBBUk1hZGRyZXNzIGFkZHIsCisgICAgRGJnX1Byb2NQb3MgKnBvcyk7CitEYmdfRXJyb3IgRGJnX0FkZHJlc3NUb0xMUG9zKAorICAgIERiZ19NQ1N0YXRlICpzdGF0ZSwgQVJNYWRkcmVzcyBhZGRyLAorICAgIERiZ19MTFBvcyAqcG9zLCBEYmdfTExTeW1UeXBlICpyZXNfdHlwZSwgaW50IHN5c3RlbV9uYW1lcyk7CisKK0RiZ19FcnJvciBEYmdfUHJvY1Bvc1RvQWRkcmVzcygKKyAgICBEYmdfTUNTdGF0ZSAqc3RhdGUsIGNvbnN0IERiZ19Qcm9jUG9zICpwb3MsCisgICAgQVJNYWRkcmVzcyAqcmVzKTsKK0RiZ19FcnJvciBEYmdfTExQb3NUb0FkZHJlc3MoCisgICAgRGJnX01DU3RhdGUgKnN0YXRlLCBjb25zdCBEYmdfTExQb3MgKnBvcywKKyAgICBBUk1hZGRyZXNzICpyZXMpOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQVJNYWRkcmVzcyBzdGFydCwgZW5kOworfSBEYmdfQWRkcmVzc1JhbmdlOworCit0eXBlZGVmIERiZ19FcnJvciBEYmdfQWRkcmVzc1JhbmdlUHJvYyh2b2lkICphcmcsIGludDMyIGZpcnN0LCBpbnQzMiBsYXN0LCBEYmdfQWRkcmVzc1JhbmdlIGNvbnN0ICpyYW5nZSk7CisKK0RiZ19FcnJvciBEYmdfTWFwQWRkcmVzc1Jhbmdlc0ZvckZpbGVSYW5nZSgKKyAgICBEYmdfTUNTdGF0ZSAqc3RhdGUsCisgICAgRGJnX1N5bVRhYmxlICpzdCwgY29uc3QgY2hhciAqZiwgaW50MzIgZmlyc3QsIGludDMyIGxhc3QsIERiZ19BZGRyZXNzUmFuZ2VQcm9jICpwLCB2b2lkICphcmcpOworCit0eXBlZGVmIHN0cnVjdCBEYmdfRW52aXJvbm1lbnQgRGJnX0Vudmlyb25tZW50OworLyogQSBEYmdfRW52aXJvbm1lbnQgZGVzY3JpYmVzIHRoZSBjb250ZXh0IHJlcXVpcmVkIHRvIG1ha2Ugc2Vuc2Ugb2YgYSB2YXJpYWJsZQorICAgbmFtZSBhbmQgYWNjZXNzIGl0cyB2YWx1ZS4gIEl0cyBmb3JtYXQgaXMgbm90IHJldmVhbGVkLiAgRGJnX0Vudmlyb25tZW50CisgICB2YWx1ZXMgYXJlIGFsbG9jYXRlZCBieSBEYmdfTmV3RW52aXJvbm1lbnQoKSBhbmQgZGlzY2FyZGVkIGJ5CisgICBEYmdfRGVsZXRlRW52aXJvbm1lbnQoKS4KKyAqLworCitEYmdfRW52aXJvbm1lbnQgKkRiZ19OZXdFbnZpcm9ubWVudChEYmdfTUNTdGF0ZSAqc3RhdGUpOwordm9pZCBEYmdfRGVsZXRlRW52aXJvbm1lbnQoRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfRW52aXJvbm1lbnQgKmVudik7CisKK0RiZ19FcnJvciBEYmdfU3RyaW5nVG9FbnYoCisgICAgRGJnX01DU3RhdGUgKnN0YXRlLCBjaGFyICpzdHIsIERiZ19FbnZpcm9ubWVudCAqcmVzZW52LAorICAgIGludCBmb3Jjb250ZXh0LCBEYmdfRW52aXJvbm1lbnQgY29uc3QgKmN1cmVudik7CisKK0RiZ19FcnJvciBEYmdfUHJvY1Bvc1RvRW52aXJvbm1lbnQoCisgICAgRGJnX01DU3RhdGUgKnN0YXRlLCBjb25zdCBEYmdfUHJvY1BvcyAqcG9zLCBpbnQgYWN0aXZhdGlvbiwKKyAgICBjb25zdCBEYmdfRW52aXJvbm1lbnQgKmN1cnJlbnQsIERiZ19FbnZpcm9ubWVudCAqcmVzKTsKKworLyogQ29udmVyc2lvbiBmcm9tIGEgcG9zaXRpb24gcmVwcmVzZW50YXRpb24gdG8gYW4gRGJnX0Vudmlyb25tZW50IChhcyByZXF1aXJlZAorICAgdG8gYWNjZXNzIHZhcmlhYmxlIHZhbHVlcykuICBPbmx5IGEgRGJnX1Byb2NQb3MgYXJndW1lbnQgaGVyZTsgb3RoZXIKKyAgIHJlcHJlc2VudGF0aW9ucyBuZWVkIHRvIGJlIGNvbnZlcnRlZCBmaXJzdC4KKworICAgUmV0dXJucyA8cmVzPiBkZXNjcmliaW5nIHRoZSA8YWN0aXZhdGlvbj50aCBpbnN0YW5jZSBvZiB0aGUgZnVuY3Rpb24KKyAgIGRlc2NyaWJlZCBieSA8cG9zPiwgdXAgZnJvbSB0aGUgc3RhY2sgYmFzZSBpZiA8YWN0aXZhdGlvbj4gaXMgbmVnYXRpdmUsCisgICBlbHNlIGRvd24gZnJvbSA8Y3VycmVudD4uCisgICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgRGJnX0Vycl9BY3RpdmF0aW9uTm90UHJlc2VudCwgdGhlIHJlc3VsdAorICAgRGJnX0Vudmlyb25tZW50IGlzIHN0aWxsIHZhbGlkIGZvciBhY2Nlc3Npbmcgbm9uLWF1dG8gdmFyaWFibGVzLgorICovCisKK3R5cGVkZWYgc3RydWN0IERiZ19EZWNsU3BlYyBEYmdfRGVjbFNwZWM7CisKK0RiZ19FcnJvciBEYmdfRW52VG9Qcm9jSXRlbSgKKyAgICBEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19FbnZpcm9ubWVudCBjb25zdCAqZW52LCBEYmdfRGVjbFNwZWMgKnByb2MpOworCitEYmdfRXJyb3IgRGJnX0NvbnRhaW5pbmdFbnZpcm9ubWVudCgKKyAgICBEYmdfTUNTdGF0ZSAqc3RhdGUsIGNvbnN0IERiZ19FbnZpcm9ubWVudCAqY29udGV4dCwgRGJnX0Vudmlyb25tZW50ICpyZXMpOworLyogU2V0IDxyZXM+IHRvIGRlc2NyaWJlIHRoZSBjb250YWluaW5nIGZ1bmN0aW9uLCBmaWxlIGlmIDxjb250ZXh0PiBpcyB3aXRoaW4KKyAgIGEgdG9wLWxldmVsIGZ1bmN0aW9uIChvciBlcnJvciBpZiA8Y29udGV4dD4gYWxyZWFkeSBkZXNjcmliZXMgYSBmaWxlKS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQVNEIGRlYnVnIHRhYmxlIHBvaW50ZXJzIGFyZSBub3QgYnkgdGhlbXNlbHZlcyBzdWZmaWNpZW50IGRlc2NyaXB0aW9uLAorICAgc2luY2UgdGhlcmUncyBhbiBpbXBsaWVkIHNlY3Rpb24gY29udGV4dC4gIEhlbmNlIHRoZSBEZWNsU3BlYyBhbmQgVHlwZVNwZWMKKyAgIHN0cnVjdHVyZXMuCisgKi8KKworCisjaWZuZGVmIERiZ19UeXBlU3BlY19EZWZpbmVkCisKK3N0cnVjdCBEYmdfRGVjbFNwZWMgeyB2b2lkICphOyB9OworCisjaWZkZWYgQ0FMTEFCTEVfQ09NUElMRVIKK3R5cGVkZWYgdm9pZCAqRGJnX1R5cGVTcGVjOworCisvKiBUaGUgaW50ZW50aW9uIGhlcmUgaXMgdG8gZ2l2ZSBhbiBhbHRlcm5hdGl2ZSBkZWZpbml0aW9uIGZvciBEYmdfQmFzaWNUeXBlCisgICB3aGljaCBmb2xsb3dzLgorICovCisKKyNkZWZpbmUgRGJnX1RfVm9pZCAgICAgIHhEYmdfVF9Wb2lkCisjZGVmaW5lIERiZ19UX0Jvb2wgICAgICB4RGJnX1RfQm9vbAorI2RlZmluZSBEYmdfVF9TQnl0ZSAgICAgeERiZ19UX1NCeXRlCisjZGVmaW5lIERiZ19UX1NIYWxmICAgICB4RGJnX1RfSGFsZgorI2RlZmluZSBEYmdfVF9TV29yZCAgICAgeERiZ19UX1NXb3JkCisjZGVmaW5lIERiZ19UX1VCeXRlICAgICB4RGJnX1RfVUJ5dGUKKyNkZWZpbmUgRGJnX1RfVUhhbGYgICAgIHhEYmdfVF9VSGFsZgorI2RlZmluZSBEYmdfVF9VV29yZCAgICAgeERiZ19UX1VXb3JkCisjZGVmaW5lIERiZ19UX0Zsb2F0ICAgICB4RGJnX1RfRmxvYXQKKyNkZWZpbmUgRGJnX1RfRG91YmxlICAgIHhEYmdfVF9Eb3VibGUKKyNkZWZpbmUgRGJnX1RfTERvdWJsZSAgIHhEYmdfVF9MRG91YmxlCisjZGVmaW5lIERiZ19UX0NvbXBsZXggICB4RGJnX1RfQ29tcGxleAorI2RlZmluZSBEYmdfVF9EQ29tcGxleCAgeERiZ19UX0RDb21wbGV4CisjZGVmaW5lIERiZ19UX1N0cmluZyAgICB4RGJnX1RfU3RyaW5nCisjZGVmaW5lIERiZ19UX0Z1bmN0aW9uICB4RGJnX1RfRnVuY3Rpb24KKworI2RlZmluZSBEYmdfQmFzaWNUeXBlICAgeERiZ19CYWlzY1R5cGUKKyNkZWZpbmUgRGJnX1ByaW1pdGl2ZVR5cGVUb1R5cGVTcGVjIHhEYmdfUHJpbWl0aXZlVHlwZVRvVHlwZVNwZWMKKworI2Vsc2UKKy8qIFdlIHdhbnQgYSBEYmdfVHlwZVNwZWMgdG8gYmUgYSBhbiBvcGFxdWUgdHlwZSwgYnV0IG9mIGtub3duIHNpemUgKHNvIHRoZQorICAgdG9vbGJveCdzIGNsaWVudHMgY2FuIGFsbG9jYXRlIHRoZSBzdG9yZSB0byBob2xkIG9uZSk7IHVuZm9ydHVuYXRlbHksIHdlCisgICBjYW4gZG8gdGhpcyBvbmx5IGJ5IGhhdmluZyBvbmUgZGVmaW5pdGlvbiBmb3IgdGhlIHRvb2xib3gncyBjbGllbnRzIGFuZAorICAgb25lIChlbHNld2hlcmUpIGZvciB0aGUgdG9vbGJveCBpdHNlbGYuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgRGJnX1R5cGVTcGVjIERiZ19UeXBlU3BlYzsKK3N0cnVjdCBEYmdfVHlwZVNwZWMgeyB2b2lkICphOyBpbnQzMiBiOyB9OworI2VuZGlmIC8qIENBTExBQkxFX0NPTVBJTEVSICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgRGJnX1RfVm9pZCwKKworICAgIERiZ19UX0Jvb2wsCisKKyAgICBEYmdfVF9TQnl0ZSwKKyAgICBEYmdfVF9TSGFsZiwKKyAgICBEYmdfVF9TV29yZCwKKworICAgIERiZ19UX1VCeXRlLAorICAgIERiZ19UX1VIYWxmLAorICAgIERiZ19UX1VXb3JkLAorCisgICAgRGJnX1RfRmxvYXQsCisgICAgRGJnX1RfRG91YmxlLAorICAgIERiZ19UX0xEb3VibGUsCisKKyAgICBEYmdfVF9Db21wbGV4LAorICAgIERiZ19UX0RDb21wbGV4LAorCisgICAgRGJnX1RfU3RyaW5nLAorCisgICAgRGJnX1RfRnVuY3Rpb24KK30gRGJnX0Jhc2ljVHlwZTsKKworI2VuZGlmCisKK3ZvaWQgRGJnX1ByaW1pdGl2ZVR5cGVUb1R5cGVTcGVjKERiZ19UeXBlU3BlYyAqdHMsIERiZ19CYXNpY1R5cGUgdCk7CisKK2Jvb2wgRGJnX1R5cGVJc0ludGVncmFsKERiZ19UeXBlU3BlYyBjb25zdCAqdHMpOworCitib29sIERiZ19UeXBlSXNQb2ludGVyKERiZ19UeXBlU3BlYyBjb25zdCAqdHMpOworCitib29sIERiZ19UeXBlSXNGdW5jdGlvbihEYmdfVHlwZVNwZWMgY29uc3QgKnRzKTsKKworYm9vbCBEYmdfUHJ1bmVUeXBlKERiZ19UeXBlU3BlYyAqdHNyZXMsIERiZ19UeXBlU3BlYyBjb25zdCAqdHMpOworLyogUmV0dXJuIHRvIHRzcmVzIGEgdmVyc2lvbiBvZiB0cyB3aGljaCBoYXMgYmVlbiBwcnVuZWQgYnkgdGhlIHJlbW92YWwgb2YgYWxsCisgICB0b3BsZXZlbCB0eXBlZGVmcy4gUmVzdWx0IGlzIFlFUyBpZiB0aGUgcmVzdWx0IGhhcyBjaGFuZ2VkLgorICovCisKK3R5cGVkZWYgRGJnX0Vycm9yIERiZ19GaWxlUHJvYyhEYmdfTUNTdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IERiZ19EZWNsU3BlYyAqcHJvY2RlZiwgdm9pZCAqYXJnKTsKKworRGJnX0Vycm9yIERiZ19FbnVtZXJhdGVGaWxlcyhEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19TeW1UYWJsZSAqc3QsIERiZ19GaWxlUHJvYyAqcCwgdm9pZCAqYXJnKTsKKy8qIFRoZSB0b3AgbGV2ZWwgZm9yIGEgaGlnaCBsZXZlbCBlbnVtZXJhdGUuICBMb3dlciBsZXZlbHMgYXJlIHBlcmZvcm1lZCBieQorICAgRW51bWVyYXRlRGVjbGFyYXRpb25zIChiZWxvdykuCisgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBkc19JbnZhbGlkLAorICAgIGRzX1R5cGUsCisgICAgZHNfVmFyLAorICAgIGRzX1Byb2MsCisgICAgZHNfRW51bSwKKyAgICBkc19GdW5jdGlvbiwKKyAgICBkc19MYWJlbAorfSBEYmdfRGVjbFNvcnQ7CisKK0RiZ19EZWNsU29ydCBEYmdfU29ydE9mRGVjbFNwZWMoRGJnX0RlY2xTcGVjIGNvbnN0ICpkZWNsKTsKKworY2hhciAqRGJnX05hbWVPZkRlY2xTcGVjKERiZ19EZWNsU3BlYyBjb25zdCAqZGVjbCk7CisKK0RiZ19UeXBlU3BlYyBEYmdfVHlwZVNwZWNPZkRlY2xTcGVjKERiZ19EZWNsU3BlYyBjb25zdCAqZGVjbCk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgY3NfTm9uZSwKKyAgICBjc19FeHRlcm4sCisgICAgY3NfU3RhdGljLAorICAgIGNzX0F1dG8sCisgICAgY3NfUmVnLAorICAgIGNzX1ZhciwKKyAgICBjc19GYXJnLAorICAgIGNzX0ZjYXJnLAorICAgIGNzX0xvY2FsLAorICAgIGNzX0ZpbHRlcmVkLAorICAgIGNzX0dsb2JhbHJlZworfSBEYmdfU3RnQ2xhc3M7CisKK0RiZ19TdGdDbGFzcyBEYmdfU3RnQ2xhc3NPZkRlY2xTcGVjKERiZ19EZWNsU3BlYyBjb25zdCAqZGVjbCk7CisKK2Jvb2wgRGJnX1ZhcnNBdFNhbWVBZGRyZXNzKERiZ19EZWNsU3BlYyBjb25zdCAqZDEsIERiZ19EZWNsU3BlYyBjb25zdCAqZDIpOworCitib29sIERiZ19WYXJzRGVjcmliZWRGb3JEZWNsU3BlYyhEYmdfRGVjbFNwZWMgY29uc3QgKmRlY2wpOworCitpbnQgRGJnX0FyZ0NvdW50T2ZEZWNsU3BlYyhEYmdfRGVjbFNwZWMgY29uc3QgKmRlY2wpOworCit0eXBlZGVmIHN0cnVjdCBEYmdfRENvbXBsZXggeyBEYmxlQmluIHIsIGk7IH0gRGJnX0RDb21wbGV4OworCit0eXBlZGVmIHVuaW9uIERiZ19Db25zdGFudFZhbCB7CisgICAgaW50MzIgbDsKKyAgICB1bnNpZ25lZDMyIHU7CisgICAgRGJsZUJpbiBkOworICAgIERiZ19EQ29tcGxleCBmYzsKKyAgICBBUk1hZGRyZXNzIGE7CisgICAgY2hhciAqczsKK30gRGJnX0NvbnN0YW50VmFsOworCit0eXBlZGVmIHN0cnVjdCBEYmdfQ29uc3RhbnQgeworICAgIERiZ19UeXBlU3BlYyB0eXBlOworICAgIERiZ19Db25zdGFudFZhbCB2YWw7Cit9IERiZ19Db25zdGFudDsKKwordHlwZWRlZiBlbnVtIERiZ19WYWx1ZVNvcnQgeworICAgIHZzX3JlZ2lzdGVyLAorICAgIHZzX3N0b3JlLAorICAgIHZzX2NvbnN0YW50LAorICAgIHZzX2xvY2FsLAorICAgIHZzX2ZpbHRlcmVkLAorICAgIHZzX25vbmUsCisgICAgdnNfZXJyb3IKK30gRGJnX1ZhbHVlU29ydDsKKworLyogdnNfbG9jYWwgYWxsb3dzIHRoZSB1c2Ugb2Ygc3ltYm9sIHRhYmxlIGVudHJpZXMgdG8gZGVzY3JpYmUgZW50aXRpZXMgd2l0aGluCisgICB0aGUgZGVidWdnZXIncyBvd24gYWRkcmVzcyBzcGFjZSwgYWNjZXNzZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHRhcmdldAorICAgdmFyaWFibGVzLgorICAgdnNfZmlsdGVyZWQgZGVzY3JpYmVzIGVudGl0aWVzIHdoaWNoIG1heSBiZSByZWFkIG9yIHdyaXR0ZW4gb25seSB2aWEgYW4KKyAgIGFjY2VzcyBmdW5jdGlvbiAoZWcgcjE1KQorICovCisKKyNkZWZpbmUgZnByX2Jhc2UgMTYKKy8qIFRoZXJlJ3Mgb25seSBvbmUgcmVnaXN0ZXIgVmFsdWVTb3J0IChyZWZsZWN0aW5nIGFzZCB0YWJsZSBTdGdDbGFzcyk7CisgICBmcCByZWdpc3RlciBuIGlzIGVuY29kZWQgYXMgcmVnaXN0ZXIgbitmcHJfYmFzZS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBEYmdfVmFsdWUgRGJnX1ZhbHVlOworCit0eXBlZGVmIERiZ19FcnJvciBEYmdfQWNjZXNzRm4oRGJnX01DU3RhdGUgKnN0YXRlLCBpbnQgd3JpdGUsIERiZ19WYWx1ZSAqc2VsZiwgRGJnX0NvbnN0YW50ICpjKTsKKy8qIDx3cml0ZT4gPT0gMDogcmVhZCBhIHZzX2ZpbHRlcmVkIHZhbHVlLCB1cGRhdGluZyB0aGUgdmFsdWUgc2VsZi4KKyAgIDx3cml0ZT4gPT0gMTogdXBkYXRlIGEgdnNfZmlsdGVyZWQgdmFsdWUsIHdpdGggdGhlIHZhbHVlIGRlc2NyaWJlZCBieSBjLgorICAgPHNlbGY+IGFsbG93cyB1c2Ugb2YgdGhlIHNhbWUgRGJnX0FjY2Vzc0ZuIGZvciBzZXZlcmFsIGRpZmZlcmVudCBlbnRpdGllcworICAgKHVzaW5nIGRpZmZlcmVudCB2YWwuZi5pZCBmaWVsZHMpLgorICovCisKK3R5cGVkZWYgRGJnX0Vycm9yIERiZ19Gb3JtYXRGbihpbnQgZGVjb2RlLCBjaGFyICpiLCBBUk13b3JkICp2YWxwLCB2b2lkICpmb3JtYXRhcmcpOworCit0eXBlZGVmIHN0cnVjdCB7IERiZ19BY2Nlc3NGbiAqZjsgaW50IGlkOyB9IERiZ19BY2Nlc3NGblJlYzsKKworc3RydWN0IERiZ19WYWx1ZSB7CisgICAgRGJnX1R5cGVTcGVjIHR5cGU7CisgICAgRGJnX1ZhbHVlU29ydCBzb3J0OworICAgIERiZ19Gb3JtYXRGbiAqZm9ybWF0cDsKKyAgICB2b2lkICpmb3JtYXRhcmc7CisgICAgaW50IGY3N2NzaXplOworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsgaW50IG5vOyBBUk1hZGRyZXNzIGZyYW1lOyB9IHI7CisgICAgICAgIEFSTWFkZHJlc3MgcHRyOworICAgICAgICBEYmdfQ29uc3RhbnRWYWwgYzsKKyAgICAgICAgdm9pZCAqbG9jYWxwOworICAgICAgICBEYmdfQWNjZXNzRm5SZWMgZjsKKyAgICAgICAgRGJnX0Vycm9yIGVycjsKKyAgICB9IHZhbDsKK307CisKK0RiZ19FcnJvciBEYmdfQWRkTExTeW1ib2woRGJnX1N5bVRhYmxlICpzdCwgY2hhciBjb25zdCAqbmFtZSwgRGJnX0xMU3ltVHlwZSB0eXBlLCBBUk13b3JkIHZhbCk7CisKK0RiZ19FcnJvciBEYmdfQWRkU3ltYm9sKERiZ19TeW1UYWJsZSAqc3QsIGNoYXIgY29uc3QgKm5hbWUsIERiZ19WYWx1ZSBjb25zdCAqdmFsKTsKKwordHlwZWRlZiBzdHJ1Y3QgRGJnX0RlY2xTcGVjRiB7CisgIERiZ19EZWNsU3BlYyBkZWNsOworICBEYmdfRm9ybWF0Rm4gKmZvcm1hdHA7CisgIHZvaWQgKmZvcm1hdGFyZzsKK30gRGJnX0RlY2xTcGVjRjsKKwordHlwZWRlZiBEYmdfRXJyb3IgRGJnX0RlY2xQcm9jKERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX0Vudmlyb25tZW50IGNvbnN0ICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBEYmdfRGVjbFNwZWNGIGNvbnN0ICp2YXIsIERiZ19EZWNsU29ydCBzb3J0LCBpbnQgbWFza2VkLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpOworCitEYmdfRXJyb3IgRGJnX0VudW1lcmF0ZURlY2xhcmF0aW9ucyhEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19FbnZpcm9ubWVudCBjb25zdCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYmdfRGVjbFByb2MgKnAsIHZvaWQgKmFyZyk7CisvKiBjYWxsIHAgb25jZSBmb3IgZXZlcnkgZGVjbGFyYXRpb24gbG9jYWwgdG8gdGhlIGZ1bmN0aW9uIGRlc2NyaWJlZCBieQorICAgPGNvbnRleHQ+IChvciBmaWxlIGlmIDxjb250ZXh0PiBkZXNjcmliZXMgYSBwbGFjZSBvdXRzaWRlIGEgZnVuY3Rpb24pLgorICAgcCdzIGFyZ3VtZW50IDxtYXNrZWQ+IGlzIHRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIG5vdCB2aXNpYmxlLCB0aGFua3MgdG8KKyAgIGEgZGVjbGFyYXRpb24gaW4gYW4gaW5uZXIgc2NvcGUuCisgKi8KKworRGJnX0Vycm9yIERiZ19WYWx1ZU9mVmFyKERiZ19NQ1N0YXRlICpzdGF0ZSwgY29uc3QgRGJnX0Vudmlyb25tZW50ICpjb250ZXh0LAorICAgICAgICAgICAgICAgICBjb25zdCBEYmdfRGVjbFNwZWMgKnZhciwgRGJnX1ZhbHVlICp2YWwpOworLyogRGlmZmVyZW50IGZyb20gRGJnX0V2YWxFeHByKCkgaW4gdGhhdCB0aGUgdGhpbmcgYmVpbmcgZXZhbHVhdGVkIGlzIGRlc2NyaWJlZAorICAgYnkgYSBEYmdfRGVjbFNwZWMgKHdoaWNoIG11c3QgYmUgZm9yIGEgdmFyaWFibGUpLCByYXRoZXIgdGhhbiBhIHN0cmluZworICAgbmVlZGluZyB0byBiZSBkZWNvZGVkIGFuZCBhc3NvY2lhdGVkIHdpdGggYSBzeW1ib2wtdGFibGUgaXRlbS4gIEludGVuZGVkIHRvCisgICBiZSBjYWxsZWQgZnJvbSBhIERiZ19EZWNsUHJvYyBjYWxsZWQgZnJvbSBEYmdfRW51bWVyYXRlRGVjbGFyYXRpb25zLgorICovCisKK0RiZ19FcnJvciBEYmdfRXZhbEV4cHIoRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfRW52aXJvbm1lbnQgY29uc3QgKmNvbnRleHQsCisgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICpleHByLCBpbnQgZmxhZ3MsIERiZ19WYWx1ZSAqdmFsKTsKKworRGJnX0Vycm9yIERiZ19FdmFsRXhwcl9lcChEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19FbnZpcm9ubWVudCBjb25zdCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKmV4cHIsIGNoYXIgKipleHByZW5kLCBpbnQgZmxhZ3MsIERiZ19WYWx1ZSAqdmFsKTsKKworLyogQm90aCBEYmdfVmFsdWVPZlZhciBhbmQgRGJnX0V2YWxFeHByIG1vc3RseSBkZWxpdmVyIGEgdmFsdWUgc3RpbGwgY29udGFpbmluZworICAgYW4gaW5kaXJlY3Rpb24gKHNpbmNlIGl0IG1heSBiZSB3YW50ZWQgYXMgdGhlIGxocyBvZiBhbiBhc3NpZ25tZW50KQorICovCisKK3ZvaWQgRGJnX1JlYWxMb2NhdGlvbihEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19WYWx1ZSAqdmFsKTsKKy8qIElmIHZhbCBkZXNjcmliZXMgYSByZWdpc3RlciwgdGhpcyBtYXkgcmVhbGx5IGJlIGEgcmVnaXN0ZXIsIG9yIGEgcGxhY2Ugb24KKyAgIHRoZSBzdGFjayB3aGVyZSB0aGUgcmVnaXN0ZXIncyB2YWx1ZSBpcyBzYXZlZC4gSW4gdGhlIGxhdHRlciBjYXNlLCB2YWwKKyAgIGlzIGFsdGVyZWQgdG8gZGVzY3JpYmUgdGhlIHNhdmUgcGxhY2UuIChJbiBhbGwgb3RoZXJzLCBpdCByZW1haW5zCisgICB1bmNoYW5nZWQpLgorICovCisKK0RiZ19FcnJvciBEYmdfRGVyZWZlcmVuY2VWYWx1ZShEYmdfTUNTdGF0ZSAqc3RhdGUsIGNvbnN0IERiZ19WYWx1ZSAqdmFsdWUsIERiZ19Db25zdGFudCAqYyk7CisvKiBUaGlzIGZhaWxzIGlmIDx2YWx1ZT4gZGVzY3JpYmVzIGEgc3RydWN0dXJlIG9yIGFycmF5LCByZXR1cm5pbmcKKyAgIERiZ19FcnJfVHlwZU5vdFNpbXBsZQorICovCisKK3R5cGVkZWYgc3RydWN0IERiZ19FeHByIERiZ19FeHByOworLyogVGhlIHJlc3VsdCBvZiBwYXJzaW5nIGFuIGV4cHJlc3Npb24gaW4gYW4gZW52aXJvbm1lbnQ6IGl0cyBzdHJ1Y3R1cmUgaXMgbm90CisgICByZXZlYWxlZC4gIChDbGllbnRzIG1heSB3aXNoIHRvIHBhcnNlIGp1c3Qgb25jZSBhbiBleHByZXNzaW9uIHdoaWNoIG1heSBiZQorICAgZXZhbHVhdGVkIG9mdGVuKS4gIEluIHN1cHBvcnQgb2Ygd2hpY2gsIHRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBwYXJ0aXRpb24KKyAgIHRoZSB3b3JrIG9mIERiZ19FdmFsRXhwcigpLgorICovCisKKyNkZWZpbmUgRGJnX2V4ZmxfaGVhcCAxICAgIC8qIGFsbG9jYXRlIEV4cHIgb24gdGhlIGhlYXAgKEZyZWVFeHByIG11c3QgdGhlbiBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIHRvIGRpc2NhcmQgaXQpLiAgT3RoZXJ3aXNlLCBpdCBnb2VzIGluIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlIG92ZXJ3cml0dGVuIGJ5IHRoZSBuZXh0IGNhbGwgdG8gUGFyc2VFeHByCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBFdmFsRXhwcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERiZ19leGZsX25lZWRhc3NpZ24gMgorI2RlZmluZSBEYmdfZXhmbF9sb3dsZXZlbCAgIDQKKworaW50IERiZ19TZXRJbnB1dFJhZGl4KERiZ19NQ1N0YXRlICpzdGF0ZSwgaW50IHJhZGl4KTsKK2NoYXIgKkRiZ19TZXREZWZhdWx0SW50Rm9ybWF0KERiZ19NQ1N0YXRlICpzdGF0ZSwgY2hhciAqZm9ybWF0KTsKKworRGJnX0Vycm9yIERiZ19QYXJzZUV4cHIoCisgICAgRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfRW52aXJvbm1lbnQgY29uc3QgKmVudiwgY2hhciAqc3RyaW5nLAorICAgIGNoYXIgKiplbmQsIERiZ19FeHByICoqcmVzLCBpbnQgZmxhZ3MpOworLyogSnVzdCBwYXJzZSB0aGUgYXJndW1lbnQgc3RyaW5nLCByZXR1cm5pbmcgYSBwb2ludGVyIHRvIGEgcGFyc2VkIGV4cHJlc3Npb24KKyAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG5vbi13aGl0ZSBzcGFjZSBjaGFyYWN0ZXIgaW4gdGhlIGlucHV0IHN0cmluZworICAgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhlIHBhcnNlZCBleHByZXNzaW9uLiAoSWYgbWFjcm8gZXhwYW5zaW9uIGhhcyB0YWtlbgorICAgcGxhY2UsIHRoZSByZXR1cm5lZCBwb2ludGVyIHdpbGwgbm90IGJlIGludG8gdGhlIGFyZ3VtZW50IHN0cmluZyBhdCBhbGwsCisgICByYXRoZXIgaW50byB0aGUgZXhwYW5kZWQgdmVyc2lvbiBvZiBpdCkuCisgKi8KKworRGJnX0Vycm9yIERiZ19QYXJzZUV4cHJDaGVja0VuZCgKKyAgICBEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19FbnZpcm9ubWVudCBjb25zdCAqZW52LCBjaGFyICpzdHJpbmcsCisgICAgRGJnX0V4cHIgKipyZXMsIGludCBmbGFncyk7CisvKiBBcyBEYmdfUGFyc2VFeHByLCBidXQgdGhlIHBhcnNlZCBleHByZXNzaW9uIGlzIHJlcXVpcmVkIGNvbXBsZXRlbHkgdG8gZmlsbAorICAgdGhlIGFyZ3VtZW50IHN0cmluZyAoYXBhcnQgcG9zc2libHkgZm9yIHRyYWlsaW5nIHdoaXRlc3BhY2UpLCBhbmQgYW4gZXJyb3IKKyAgIGlzIHJldHVybmVkIGlmIGl0IGRvZXMgbm90LgorICovCisKK0RiZ19FcnJvciBEYmdfUGFyc2VkRXhwclRvVmFsdWUoCisgICAgRGJnX01DU3RhdGUgKnN0YXRlLCBjb25zdCBEYmdfRW52aXJvbm1lbnQgKmVudiwgRGJnX0V4cHIgKmV4cHIsIERiZ19WYWx1ZSAqdik7CisKK0RiZ19FcnJvciBEYmdfUmVhZERlY2woCisgICAgRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfRW52aXJvbm1lbnQgY29uc3QgKmVudiwgY2hhciAqc3RyaW5nLAorICAgIERiZ19UeXBlU3BlYyAqcCwgY2hhciAqKnZhcnAsIGludCBmbGFncyk7CisvKiBSZWFkIGEgdmFyaWFibGUgZGVjbGFyYXRpb24sIHJldHVyaW5nIGEgZGVzY3JpcHRpb24gb2YgdGhlIHR5cGUgb2YgdGhlCisgICB2YXJpYWJsZSB0byBwLCBhbmQgYSBwb2ludGVyIHRvIGl0cyBuYW1lIHRvIHZhcnAuCisgKi8KKworYm9vbCBEYmdfSXNDYXN0VG9BcnJheVR5cGUoRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfRXhwciAqZXhwcik7CisKK3ZvaWQgRGJnX0ZyZWVFeHByKERiZ19FeHByICpleHByKTsKKworRGJnX0Vycm9yIERiZ19Db3B5VHlwZShEYmdfVHlwZVNwZWMgKnRkZXN0LCBEYmdfVHlwZVNwZWMgY29uc3QgKnRzb3VyY2UpOworRGJnX0Vycm9yIERiZ19GcmVlQ29waWVkVHlwZShEYmdfVHlwZVNwZWMgKnRzKTsKKworRGJnX0Vycm9yIERiZ19UeXBlT2ZFeHByKERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX0V4cHIgKnRyZWUsIERiZ19UeXBlU3BlYyAqcmVzdHlwZSk7CisKK0RiZ19FcnJvciBEYmdfRXhwclRvVmFyKGNvbnN0IERiZ19FeHByICpleHByLCBEYmdfRGVjbFNwZWMgKnZhciwgRGJnX0Vudmlyb25tZW50ICplbnYpOworCitEYmdfRXJyb3IgRGJnX0Fzc2lnbihEYmdfTUNTdGF0ZSAqc3RhdGUsIGNvbnN0IERiZ19WYWx1ZSAqbHYsIGNvbnN0IERiZ19WYWx1ZSAqcnYpOworCit0eXBlZGVmIGVudW0gRGJnX1R5cGVTb3J0IHsKKyAgdHNfc2ltcGxlLAorICB0c191bmlvbiwKKyAgdHNfc3RydWN0LAorICB0c19hcnJheQorfSBEYmdfVHlwZVNvcnQ7CisKK0RiZ19UeXBlU29ydCBEYmdfVHlwZVNvcnRPZlZhbHVlKERiZ19NQ1N0YXRlICpzdGF0ZSwgY29uc3QgRGJnX1ZhbHVlICp2YWwsIGludCAqZmllbGRjb3VudCk7CisKK0RiZ19FcnJvciBEYmdfVHlwZVRvQ2hhcnMoY29uc3QgRGJnX1R5cGVTcGVjICp2YXIsIERiZ19CdWZEZXNjICpidWYpOworCitEYmdfRXJyb3IgRGJnX1R5cGVTaXplKERiZ19NQ1N0YXRlICpzdGF0ZSwgY29uc3QgRGJnX1R5cGVTcGVjICp0eXBlLCB1bnNpZ25lZDMyICpyZXMpOworCit0eXBlZGVmIGludCBEYmdfVmFsVG9DaGFyc19jYihEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19WYWx1ZSAqc3VidmFsLCBjb25zdCBjaGFyICpmaWVsZG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERiZ19CdWZEZXNjICpidWYsIHZvaWQgKmFyZyk7CisKK0RiZ19FcnJvciBEYmdfVmFsVG9DaGFycyhEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19WYWx1ZSAqdmFsLCBpbnQgYmFzZSwKKyAgICAgICAgICAgICAgICAgRGJnX1ZhbFRvQ2hhcnNfY2IgKmNiLCB2b2lkICphcmcsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm0sIERiZ19CdWZEZXNjICpidWYpOworLyoKKyAgIDxiYXNlPiBpcyB1c2VkIGZvciAoYW55IHNpemUpIGludGVnZXIgdmFsdWVzLgorICAgSWYgPHZhbD4gaXMgb2YgYW4gYXJyYXkgb3Igc3RydWN0dXJlIHR5cGUsIDxjYj4gaXMgY2FsbGVkIGZvciBlYWNoIGVsZW1lbnQsCisgICB3aXRoIDxhcmc+IGFzIGl0cyBsYXN0IHBhcmFtZXRlciwgYW5kIDxzdWJidWY+IGRlc2NyaWJpbmcgdGhlIHNwYWNlIHJlbWFpbmluZworICAgaW4gPGJ1Zj4uICBJZiA8Y2I+IHJldHVybnMgMCwgY29udmVyc2lvbiBjZWFzZXMuCisgKi8KKworRGJnX0Vycm9yIERiZ19OdGhFbGVtZW50KAorICAgIERiZ19NQ1N0YXRlICpzdGF0ZSwKKyAgICBjb25zdCBEYmdfVmFsdWUgKnZhbCwgdW5zaWduZWQzMiBuLCBjaGFyICoqZmllbGRuYW1lLCBEYmdfVmFsdWUgKnN1YnZhbCk7CisKK3R5cGVkZWYgRGJnX0Vycm9yIERiZ19IaXN0b3J5UHJvYyh2b2lkICosIGludCwgRGJnX1ZhbHVlICopOworCitEYmdfRXJyb3IgRGJnX1JlZ2lzdGVySGlzdG9yeVByb2MoRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfSGlzdG9yeVByb2MgKnAsIHZvaWQgKmFyZyk7CisKK3R5cGVkZWYgZW51bSB7CisgIGxzX2NwdSwKKyAgbHNfc3RvcmUsCisgIGxzX2NvcHJvLAorICBsc19sb2NhbCwKKyAgbHNfZmlsdGVyZWQKK30gRGJnX0xvY1NvcnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgRGJnX0xvY1NvcnQgc29ydDsKKyAgdW5pb24geworICAgIHN0cnVjdCB7IEFSTWFkZHJlc3MgYWRkciwgc2l6ZTsgfSBzdG9yZTsKKyAgICBzdHJ1Y3QgeyBpbnQgbW9kZW1hc2s7IGludCByOyB9IGNwdTsKKyAgICBzdHJ1Y3QgeyBpbnQgbm87IGludCByOyB9IGNwOworICAgIHZvaWQgKmxvY2FscDsKKyAgICBEYmdfQWNjZXNzRm5SZWMgZjsKKyAgfSBsb2M7Cit9IERiZ19Mb2M7CisKK3R5cGVkZWYgRGJnX0Vycm9yIERiZ19PYmplY3RXcml0ZVByb2MoRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfTG9jIGNvbnN0ICpsb2MpOworRGJnX0Vycm9yIERiZ19Pbk9iamVjdFdyaXRlKERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX09iamVjdFdyaXRlUHJvYyAqcCk7CisvKiBSZWdpc3RlciBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYmFjayB3aGVuZXZlciB0aGUgdG9vbGJveCBoYXMgd3JpdHRlbiB0byBhbnkKKyAqIG9iamVjdCBhY2Nlc3NpYmxlIGJ5IHRoZSBkZWJ1Z2dlZSAob3IgdG8gbG9jYWwgdmFyaWFibGVzIGJlbG9uZ2luZyB0byBhCisgKiB0b29sYm94IGNsaWVudCkuIFRoZSB3cml0ZSBoYXMgYWxyZWFkeSBiZWVuIGRvbmUuCisgKiAoVG8gYWxsb3cgbXVsdGlwbGUgdG9vbGJveCBjbGllbnRzIHRvIGNvZXhpc3QpLgorICovCisKK0RiZ19FcnJvciBEYmdfT2JqZWN0V3JpdHRlbihEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19Mb2MgY29uc3QgKmxvYyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBDb250cm9sIG9mIHRhcmdldCBwcm9ncmFtIGV4ZWN1dGlvbi4KKyAgIEN1cnJlbnRseSwgb25seSBzeW5jaHJvbm91cyBvcGVyYXRpb24gaXMgcHJvdmlkZWQuCisgICBFeGVjdXRpb24gY291bGQgcG9zc2libHkgYmUgYXN5bmNocm9ub3VzIHdoZXJlIHRoZSB0YXJnZXQgaXMgYSBzZXBlcmF0ZQorICAgcHJvY2Vzc29yLCBidXQgaXMgbmVjZXNzYXJpbHkgc3luY2hyb25vdXMgaWYgdGhlIHRhcmdldCBpcyBBcm11bGF0b3IuCisgICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1heSByZXF1aXJlIG1vZGlmaWNhdGlvbiB0byB0aGUgUkRJIGltcGxlbWVudGF0aW9uCisgICBpZiBtdWx0aXRhc2tpbmcgaXMgcmVxdWlyZWQgYnV0IHRoZSB0aGUgaG9zdCBzeXN0ZW0gcHJvdmlkZXMgaXQgb25seQorICAgY29vcGVyYXRpdmVseSwgb3IgaWYgdGhlcmUgaXMgbm8gc3lzdGVtLXByb3ZpZGVkIHdheSB0byBnZW5lcmF0ZSBTSUdJTlQuCisgKi8KKworRGJnX0Vycm9yIERiZ19TZXRDb21tYW5kbGluZShEYmdfTUNTdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgKmFyZ3MpOworLyogU2V0IHRoZSBhcmd1bWVudCBzdHJpbmcgdG8gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIG5hbWUgb2YgdGhlIG1vc3QKKyAgIHJlY2VudGx5IGxvYWRlZCBpbWFnZSBhbmQgYXJncy4KKyAqLworCit0eXBlZGVmIGVudW0gRGJnX1Byb2dyYW1TdGF0ZSB7CisgICAgcHNfbm90c3RhcnRlZCwKKyAgICAvKiBOb3JtYWwgd2F5cyBvZiBzdG9wcGluZyAqLworICAgIHBzX2F0YnJlYWssIHBzX2F0d2F0Y2gsIHBzX3N0ZXBkb25lLAorICAgIHBzX2ludGVycnVwdGVkLAorICAgIHBzX3N0b3BwZWQsCisgICAgLyogYWJub3JtYWwgKGJ1dCB1bnN1cnByaXNpbmcpIHdheXMgb2Ygc3RvcHBpbmcgKi8KKyAgICBwc19sb3N0d2F0Y2gsCisgICAgcHNfYnJhbmNodGhyb3VnaDAsIHBzX3VuZGVmLCBwc19jYXVnaHRzd2ksIHBzX3ByZWZldGNoLAorICAgIHBzX2Fib3J0LCBwc19hZGRyZXhjZXB0LCBwc19jYXVnaHRpcnEsIHBzX2NhdWdodGZpcSwKKyAgICBwc19lcnJvciwKKyAgICAvKiBvbmx5IGFzIGEgcmV0dXJuIHZhbHVlIGZyb20gQ2FsbCgpICovCisgICAgcHNfY2FsbGZhaWxlZCwgcHNfY2FsbHJldHVybmVkLAorICAgIC8qIGludGVybmFsIGluY29uc2lzdGVuY2llcyAqLworICAgIHBzX2Jyb2tlbiwgICAgICAgICAgICAgICAgICAvKiB0YXJnZXQgaGFzICJicm9rZW4iICovCisgICAgcHNfdW5rbm93bmJyZWFrLAorICAgIHBzX3Vua25vd24KK30gRGJnX1Byb2dyYW1TdGF0ZTsKKworaW50IERiZ19Jc0NhbGxMaW5rKERiZ19NQ1N0YXRlICpzdGF0ZSwgQVJNYWRkcmVzcyBwYyk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBEYmdfRlBSZWdWYWwgZnByZXM7CisgICAgQVJNd29yZCBpbnRyZXM7Cit9IERiZ19DYWxsUmVzdWx0czsKKworRGJnX0NhbGxSZXN1bHRzICpEYmdfR2V0Q2FsbFJlc3VsdHMoRGJnX01DU3RhdGUgKnN0YXRlKTsKKworI2RlZmluZSBEYmdfU19TVEFURU1FTlRTIDAKKyNkZWZpbmUgRGJnX1NfSU5TVFJVQ1RJT05TIDEKKyNkZWZpbmUgRGJnX1NfU1RFUElOVE9QUk9DUyAyCisKK0RiZ19FcnJvciBEYmdfU3RlcChEYmdfTUNTdGF0ZSAqc3RhdGUsIGludDMyIHN0ZXBjb3VudCwgaW50IHN0ZXBieSwgRGJnX1Byb2dyYW1TdGF0ZSAqc3RhdHVzKTsKKy8qICA8c3RlcGJ5PiBpcyBhIGNvbWJpbmF0aW9uIG9mIHRoZSBEYmdfU18uLi4gdmFsdWVzIGFib3ZlICovCisKK0RiZ19FcnJvciBEYmdfU3RlcE91dChEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19Qcm9ncmFtU3RhdGUgKnN0YXR1cyk7CisKK2Jvb2wgRGJnX0NhbkdvKERiZ19NQ1N0YXRlICpzdGF0ZSk7CisKK2Jvb2wgRGJnX0lzRXhlY3V0aW5nKERiZ19NQ1N0YXRlICpzdGF0ZSk7CisKK0RiZ19FcnJvciBEYmdfR28oRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfUHJvZ3JhbVN0YXRlICpzdGF0dXMpOworCitEYmdfRXJyb3IgRGJnX1N0b3AoRGJnX01DU3RhdGUgKnN0YXRlKTsKKy8qIEFzeW5jaHJvbm91cyBTdG9wIHJlcXVlc3QsIGZvciBjYWxsIGZyb20gU0lHSU5UIGhhbmRsZXIuICBPbiByZXR1cm4gdG8gdGhlCisgICBjYWxsZXIsIHRoZSBjYWxsIG9mIERiZ19HbywgRGJnX1N0ZXAgb3IgRGJnX0NhbGwgd2hpY2ggc3RhcnRlZCBleGVjdXRpb24KKyAgIHNob3VsZCByZXR1cm4gcHNfaW50ZXJydXB0ZWQuCisgKi8KKwordHlwZWRlZiB2b2lkIERiZ19FeGVjdXRlUHJvYyhEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19Qcm9ncmFtU3RhdGUgc3RhdHVzKTsKK0RiZ19FcnJvciBEYmdfT25FeGVjdXRlKERiZ19NQ1N0YXRlICosIERiZ19FeGVjdXRlUHJvYyAqKTsKKy8qIFJlZ2lzdGVyIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiYWNrIHdoZW5ldmVyIGV4ZWN1dGlvbiBzdG9wcy4KKyAqIChUbyBhbGxvdyBtdWx0aXBsZSB0b29sYm94IGNsaWVudHMgdG8gY29leGlzdCkuCisgKi8KKworRGJnX0Vycm9yIERiZ19TZXRSZXR1cm4oRGJnX01DU3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgIGNvbnN0IERiZ19FbnZpcm9ubWVudCAqY29udGV4dCwgY29uc3QgRGJnX1ZhbHVlICp2YWx1ZSk7CisvKiBQcmVwYXJlIGNvbnRpbnVhdGlvbiBieSByZXR1cm5pbmcgPHZhbHVlPiBmcm9tIHRoZSBmdW5jdGlvbiBhY3RpdmF0aW9uCisgICBkZXNjcmliZWQgYnkgPGNvbnRleHQ+LiAgKERiZ19HbygpIG9yIERiZ19TdGVwKCkgYWN0dWFsbHkgcGVyZm9ybSB0aGUKKyAgIGNvbnRpbnVhdGlvbikuCisgKi8KKworRGJnX0Vycm9yIERiZ19TZXRFeGVjdXRpb24oRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfRW52aXJvbm1lbnQgKmNvbnRleHQpOworLyogU2V0IHRoZSBwYyBpbiBhIGhpZ2gtbGV2ZWwgZmFzaGlvbiAqLworCitEYmdfRXJyb3IgRGJnX1Byb2dyYW1TdGF0ZVRvQ2hhcnMoRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfUHJvZ3JhbVN0YXRlIGV2ZW50LCBEYmdfQnVmRGVzYyAqYnVmKTsKKy8qIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBnaXZlIGEgY29tcGxldGVseSBhY2N1cmF0ZSBkZXNjcmlwdGlvbiBvZiA8ZXZlbnQ+IGlmCisgICB0aGlzIHdhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIG1vc3QgcmVjZW50IGNhbGwgb2YgRGJnX0dvLCBEYmdfU3RlcCwKKyAgIG9yIERiZ19DYWxsLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitEYmdfRXJyb3IgRGJnX0N1cnJlbnRFbnZpcm9ubWVudChEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19FbnZpcm9ubWVudCAqY29udGV4dCk7CisKK0RiZ19FcnJvciBEYmdfUHJldkZyYW1lKERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX0Vudmlyb25tZW50ICpjb250ZXh0KTsKKy8qIHRvd2FyZHMgdGhlIGJhc2Ugb2YgdGhlIHN0YWNrICovCisKK0RiZ19FcnJvciBEYmdfTmV4dEZyYW1lKERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX0Vudmlyb25tZW50ICpjb250ZXh0KTsKKy8qIGF3YXkgZnJvbSB0aGUgYmFzZSBvZiB0aGUgc3RhY2sgKi8KKwordHlwZWRlZiBzdHJ1Y3QgRGJnX0FueVBvcyB7CisgICAgZW51bSB7IHBvc19zb3VyY2UsIHBvc19sbCwgcG9zX25vbmUgfSBwb3N0eXBlOworICAgIEFSTWFkZHJlc3MgcGM7CisgICAgdW5pb24geworICAgICAgICBEYmdfUHJvY1BvcyBzb3VyY2U7CisgICAgICAgIERiZ19MTFBvcyBsbDsKKyAgICAgICAgQVJNYWRkcmVzcyBub25lOworICAgIH0gcG9zOworfSBEYmdfQW55UG9zOworCitEYmdfRXJyb3IgRGJnX0Vudmlyb25tZW50VG9Qb3MoRGJnX01DU3RhdGUgKnN0YXRlLCBjb25zdCBEYmdfRW52aXJvbm1lbnQgKmNvbnRleHQsIERiZ19BbnlQb3MgKnBvcyk7CisvKiA8cG9zPiBpcyBzZXQgdG8gYSBEYmdfUHJvY1BvcyBpZiB0aGVzZSBpcyBvbmUgY29ycmVzcG9uZGluZyB0byA8Y29udGV4dD4KKyAgIGVsc2UgYSBEYmdfTExQb3MgaWYgdGhlcmUgaXMgb25lLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTb3VyY2UgZmlsZSBtYW5hZ2VtZW50LgorICAgUHJldHR5IHZlc3RpZ2lhbC4gIEhhbmRsZXMgc291cmNlIHBhdGggKHBlciBsb2FkZWQgaW1hZ2UpLAorICAgYW5kIHRyYW5zbGF0ZXMgZnJvbSBsaW5lLW51bWJlciAoYXMgZ2l2ZW4gaW4gZGVidWdnZXIgdGFibGVzKSB0byBjaGFyYWN0ZXIKKyAgIHBvc2l0aW9uIChhcyByZXF1aXJlZCB0byBhY2Nlc3MgZmlsZXMpCisgKi8KKworRGJnX0Vycm9yIERiZ19DbGVhclBhdGhzKERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX1N5bVRhYmxlICpzdCk7CitEYmdfRXJyb3IgRGJnX0FkZFBhdGgoRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfU3ltVGFibGUgKnN0LCBjb25zdCBjaGFyICpwYXRoKTsKK0RiZ19FcnJvciBEYmdfRGVsZXRlUGF0aChEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19TeW1UYWJsZSAqc3QsIGNvbnN0IGNoYXIgKnBhdGgpOworCit0eXBlZGVmIGVudW0geworICBEYmdfUGF0aHNDbGVhcmVkLAorICBEYmdfUGF0aEFkZGVkLAorICBEYmdfUGF0aERlbGV0ZWQKK30gRGJnX1BhdGhBbHRlcmF0aW9uOworCit0eXBlZGVmIHZvaWQgRGJnX1BhdGhBbHRlcmVkUHJvYygKKyAgICBEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19TeW1UYWJsZSAqc3QsIGNoYXIgY29uc3QgKnBhdGgsCisgICAgRGJnX1BhdGhBbHRlcmF0aW9uIHNvcnQpOworCitEYmdfRXJyb3IgRGJnX09uUGF0aEFsdGVyYXRpb24oRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfUGF0aEFsdGVyZWRQcm9jICpwKTsKKy8qIFJlZ2lzdGVyIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiYWNrIHdoZW5ldmVyIG9uZSBvZiB0aGUgc291cmNlIHBhdGgKKyAqIG1vZGlmaWNhdGlvbiBmdW5jdGlvbnMgYWJvdmUgaXMgY2FsbGVkLiAoVG8gYWxsb3cgbXVsdGlwbGUgdG9vbGJveAorICogY2xpZW50cyB0byBjb2V4aXN0KS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBEYmdfRmlsZVJlYyBEYmdfRmlsZVJlYzsKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQzMiBsaW5lY291bnQ7CisgIERiZ19GaWxlUmVjICpoYW5kbGU7CisgIGNoYXIgKmZ1bGxuYW1lOworfSBEYmdfRmlsZURldGFpbHM7CisKK0RiZ19FcnJvciBEYmdfR2V0RmlsZURldGFpbHMoCisgICAgRGJnX01DU3RhdGUgKnN0YXRlLCBjb25zdCBEYmdfRmlsZSAqZm5hbWUsIERiZ19GaWxlRGV0YWlscyAqcmVzKTsKK0RiZ19FcnJvciBEYmdfRmluaXNoZWRXaXRoRmlsZShEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19GaWxlUmVjICpoYW5kbGUpOworCitEYmdfRXJyb3IgRGJnX0dldEZpbGVEZXRhaWxzX2ZyKAorICAgIERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX0ZpbGVSZWMgKmhhbmRsZSwgRGJnX0ZpbGVEZXRhaWxzICpyZXMpOworLyogUmVmcmVzaCBkZXRhaWxzIGFib3V0IHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCA8aGFuZGxlPiAoaW4gcGFydGljdWxhciwKKyAqIGl0cyBsaW5lY291bnQpLgorICovCisKK0RiZ19FcnJvciBEYmdfRmlsZUxpbmVMZW5ndGgoCisgICAgRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfRmlsZVJlYyAqaGFuZGxlLCBpbnQzMiBsaW5lbm8sIGludDMyICpsZW4pOworLyogUmV0dXJuIHRvIDxsZW4+IHRoZSBsZW5ndGggb2YgbGluZSA8bGluZW5vPiBvZiB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGgKKyAqIDxoYW5kbGU+ICh3aXRob3V0IG5lY2Vzc2FyaWx5IHJlYWRpbmcgZnJvbSB0aGUgZmlsZSkuCisgKi8KKworRGJnX0Vycm9yIERiZ19HZXRGaWxlTGluZV9mcigKKyAgICBEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19GaWxlUmVjICpoYW5kbGUsIGludDMyIGxpbmVubywgRGJnX0J1ZkRlc2MgKmJ1Zik7CisvKiBSZXR1cm4gdG8gPGJ1Zj4gdGhlIGNvbnRlbnRzIG9mIGxpbmUgPGxpbmVubz4gb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoCisgKiA8aGFuZGxlPiAoaW5jbHVkaW5nIGl0cyB0ZXJtaW5hdGluZyBuZXdsaW5lKS4KKyAqLworCitEYmdfRXJyb3IgRGJnX1N0YXJ0RmlsZUFjY2VzcyhEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19GaWxlUmVjICpoYW5kbGUpOworRGJnX0Vycm9yIERiZ19FbmRGaWxlQWNjZXNzKERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX0ZpbGVSZWMgKmhhbmRsZSk7CisvKiBUaGVzZSB0d28gY2FsbHMgYnJhY2tldCBhIHNlcXVlbmNlIG9mIGNhbGxzIHRvIEdldEZpbGVMaW5lLiBCZXR3ZWVuIHRoZQorICogY2FsbHMsIHRoZSB0b29sYm94IGlzIHBlcm1pdHRlZCB0byByZXRhaW4gc3RhdGUgYWxsb3dpbmcgbW9yZSByYXBpZAorICogYWNjZXNzIHRvIHRleHQgb24gdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIDxoYW5kbGU+LgorICovCisKK0RiZ19FcnJvciBEYmdfQ29udHJvbFNvdXJjZUZpbGVBY2Nlc3MoCisgICAgRGJnX01DU3RhdGUgKnN0YXRlLCB1aW50MzIgY2FjaGVzaXplLCBib29sIGNsb3NlZmlsZXMpOworLyogQ29udHJvbCBkZXRhaWxzIG9mIGhvdyB0aGUgdG9vbGJveCBtYW5hZ2VzIHNvdXJjZSBmaWxlcy4KKyAqICAgSWYgPGNhY2hlc2l6ZT4gaXMgbm9uLXplcm8sIHRoZSB0ZXh0IGZyb20gdGhlIG1vc3QgcmVjZW50bHkgYWNjZXNzZWQKKyAqICAgICBzb3VyY2UgZmlsZXMgKG9mIHRvdGFsIHNpemUgbm90IHRvIGV4Y2VlZCA8Y2FjaGVzaXplPikgaXMgc2F2ZWQgaW4KKyAqICAgICBzdG9yZSBvbiBmaXJzdCBhY2Nlc3MgdG8gdGhlIGZpbGU7IHN1YnNlcXVlbnQgYWNjZXNzIHRvIHRoZSB0ZXh0IG9mCisgKiAgICAgdGhlIGZpbGUgdXNlcyB0aGlzIGNvcHkuCisgKiAgIElmIDxjbG9zZWZpbGVzPiBpcyB0cnVlLCBubyBzdHJlYW0gaXMgbGVmdCBhdHRhY2hlZCB0byB1bmNhY2hlZCBzb3VyY2UKKyAqICAgICBmaWxlcyBhZnRlciBEYmdfRW5kRmlsZUFjY2VzcyBoYXMgYmVlbiBjbG9zZWQuIE90aGVyd2lzZSwgdGhlIHRvb2xib3gKKyAqICAgICBtYXkgcmV0YWluIHN1Y2ggc3RyZWFtcywgaW4gb3JkZXIgdG8gaW1wcm92ZSBhY2Nlc3MuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGRpc2Fzc2VtYmx5ICovCisKKy8qCisgPyBNb3JlIGV4YWN0IGNvbnRyb2wgaXMgd2FudGVkIGhlcmUsIGJ1dCB0aGF0IHJlcXVpcmVzIGEgbW9yZSBjb21wbGljYXRlZAorID8gZGlzYXNzIGNhbGxiYWNrIGludGVyZmFjZS4KKyAqLworCit0eXBlZGVmIGNvbnN0IGNoYXIgKkRiZ19TV0lfRGVjb2RlKERiZ19NQ1N0YXRlICpzdGF0ZSwgQVJNd29yZCBzd2lubyk7CisKK0RiZ19FcnJvciBEYmdfSW5zdHJ1Y3Rpb25BdChEYmdfTUNTdGF0ZSAqc3RhdGUsIEFSTWFkZHJlc3MgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgaW50IGlzaXplLCBBUk1od29yZCAqaW5zdCwgRGJnX1N5bVRhYmxlICpzdCwKKyAgICAgICAgICAgICAgICAgICAgRGJnX1NXSV9EZWNvZGUgKnN3aV9uYW1lLCBEYmdfQnVmRGVzYyAqYnVmLCBpbnQgKmxlbmd0aCk7CisvKiA8aXNpemU+IGRlc2NyaWJlcyB0aGUgZm9ybSBvZiBkaXNhc3NlbWJseSB3YW50ZWQ6IDIgZm9yIDE2LWJpdCwgNCBmb3IgMzItYml0LAorICogMCBmb3IgMTYtIG9yIDMyLWJpdCBkZXBlbmRpbmcgd2hldGhlciBhZGRyIGFkZHJlc3NlcyAxNi0gb3IgMzItYml0IGNvZGUuCisgKiA8aW5zdD4gaXMgYSBwb2ludGVyIHRvIGEgcGFpciBvZiBoYWxmd29yZHMgKmluIHRhcmdldCBieXRlIG9yZGVyKgorICogUG9zc2libHkgb25seSB0aGUgZmlyc3QgaGFsZndvcmQgd2lsbCBiZSBjb25zdW1lZDogdGhlIG51bWJlciBvZiBieXRlcyB1c2VkCisgKiBpcyByZXR1cm5lZCB2aWEgPGxlbmd0aD4uCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludCBEYmdfUkRJT3BlbihEYmdfTUNTdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIHR5cGUpOworaW50IERiZ19SRElJbmZvKERiZ19NQ1N0YXRlICpzdGF0ZSwgdW5zaWduZWQgdHlwZSwgQVJNd29yZCAqYXJnMSwgQVJNd29yZCAqYXJnMik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0geworICAgIERiZ19Qb2ludF9Ub29sYm94LAorICAgIERiZ19Qb2ludF9SRElfVW5rbm93biwKKyAgICBEYmdfUG9pbnRfUkRJX1NXLAorICAgIERiZ19Qb2ludF9SRElfSFcKK30gRGJnX1BvaW50VHlwZTsKKworLyogYnJlYWtwb2ludCBtYW5hZ2VtZW50CisgICBBc3NvY2lhdGVkIHdpdGggYSBicmVha3BvaW50IHRoZXJlIG1heSBiZSBhbnkgb2YKKyAgICAgYSBjb3VudAorICAgICBhbiBleHByZXNzaW9uCisgICAgIGEgZnVuY3Rpb24KKyAgIHRoZSBicmVha3BvaW50IGlzIGFjdGl2YXRlZCBpZgorICAgICAgICB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBub24temVybyB2YWx1ZSAob3IgZmFpbHMgdG8gZXZhbHVhdGUpLgorICAgICAmJiBkZWNyZW1lbnRpbmcgdGhlIGNvdW50IHJlYWNoZXMgemVybyAodGhlIGNvdW50IGlzIHRoZW4gcmVzZXQgdG8gaXRzCisgICAgICAgIGluaXRpYWwgdmFsdWUpLgorICAgICAmJiB0aGUgZnVuY3Rpb24sIGNhbGxlZCB3aXRoIHRoZSBicmVha3BvaW50IGFkZHJlc3MgYXMgYXJndW1lbnQsIHJldHVybnMKKyAgICAgICAgYSBub24temVybyB2YWx1ZS4KKz8gIChUaGUgb3JkZXIgaGVyZSBtYXkgYmUgb3BlbiB0byBkZWJhdGUuICBOb3RlIHRoYXQgdGhlIGZpcnN0IHR3byBhcmUgaW4KKyAgICB0aGUgb3Bwb3NpdGUgb3JkZXIgaW4gYXJtc2QsIGJ1dCBJIHRoaW5rIHRoaXMgb3JkZXIgbW9yZSByYXRpb25hbCkKKyAqLworCit0eXBlZGVmIGVudW0gRGJnX0JyZWFrUG9zVHlwZSB7CisgICAgYnRfcHJvY3BvcywKKyAgICBidF9wcm9jZXhpdCwKKyAgICBidF9hZGRyZXNzCit9IERiZ19CcmVha1Bvc1R5cGU7CisKK3R5cGVkZWYgdW5pb24geworICAgICAgRGJnX1Byb2NQb3MgcHJvY3BvczsKKyAgICAgIERiZ19Qcm9jRGVzYyBwcm9jZXhpdDsKKyAgICAgIEFSTWFkZHJlc3MgYWRkcmVzczsKK30gRGJnX0JyZWFrUG9zUG9zOworCit0eXBlZGVmIHN0cnVjdCBEYmdfQnJlYWtQb3MgeworICAgIERiZ19CcmVha1Bvc1R5cGUgc29ydDsKKyAgICBEYmdfQnJlYWtQb3NQb3MgbG9jOworfSBEYmdfQnJlYWtQb3M7CisKK3R5cGVkZWYgaW50IERiZ19CUFByb2MoRGJnX01DU3RhdGUgKnN0YXRlLCB2b2lkICpCUEFyZywgRGJnX0JyZWFrUG9zICp3aGVyZSk7CisKK3R5cGVkZWYgc3RydWN0IERiZ19CcmVha1N0YXR1cyB7CisgICAgaW50IGluZGV4OworICAgIGludCBpbml0Y291bnQsIGNvdW50bm93OworICAgIERiZ19CcmVha1BvcyB3aGVyZTsKKyAgICBjaGFyICpleHByOworICAgIERiZ19CUFByb2MgKnA7IHZvaWQgKnBfYXJnOworICAgIGludCBpbmNvbXBsZXRlOworICAgIERiZ19Qb2ludFR5cGUgdHlwZTsKKyAgICBBUk13b3JkIGh3cmVzb3VyY2U7Cit9IERiZ19CcmVha1N0YXR1czsKKworRGJnX0Vycm9yIERiZ19TdHJpbmdUb0JyZWFrUG9zKAorICAgIERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX0Vudmlyb25tZW50ICplbnYsIGNoYXIgY29uc3QgKnN0ciwgc2l6ZV90IGxlbiwKKyAgICBEYmdfQnJlYWtQb3MgKmJwb3MsIGNoYXIgKmIpOworCitEYmdfRXJyb3IgRGJnX1NldEJyZWFrUG9pbnQoRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfQnJlYWtQb3MgKndoZXJlLAorICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmV4cHIsCisgICAgICAgICAgICAgICAgICAgIERiZ19CUFByb2MgKnAsIHZvaWQgKmFyZyk7CitEYmdfRXJyb3IgRGJnX1NldEJyZWFrUG9pbnQxNihEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19CcmVha1BvcyAqd2hlcmUsCisgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXhwciwKKyAgICAgICAgICAgICAgICAgICAgRGJnX0JQUHJvYyAqcCwgdm9pZCAqYXJnKTsKK0RiZ19FcnJvciBEYmdfU2V0QnJlYWtQb2ludE5hdHVyYWxTaXplKERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX0JyZWFrUG9zICp3aGVyZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpleHByLAorICAgICAgICAgICAgICAgICAgICBEYmdfQlBQcm9jICpwLCB2b2lkICphcmcpOworLyogU2V0dGluZyBhIGJyZWFrcG9pbnQgYXQgdGhlIHNhbWUgYWRkcmVzcyBhcyBhIHByZXZpb3VzIGJyZWFrcG9pbnQKKyAgIGNvbXBsZXRlbHkgcmVtb3ZlcyB0aGUgcHJldmlvdXMgb25lLgorICovCisKK0RiZ19FcnJvciBEYmdfRGVsZXRlQnJlYWtQb2ludChEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19CcmVha1BvcyAqd2hlcmUpOworCitEYmdfRXJyb3IgRGJnX1N1c3BlbmRCcmVha1BvaW50KERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX0JyZWFrUG9zICp3aGVyZSk7CisvKiBUZW1wb3JhcmlseSByZW1vdmUgdGhlIGJyZWFrIHBvaW50ICh1bnRpbCBSZWluc3RhdGVkKSBidXQgbGVhdmUgaW50YWN0CisgICBpdHMgYXNzb2NpYXRlZCBleHByLCB0aGUgdmFsdWUgaXRzIGNvdW50IGhhcyByZWFjaGVkLCBldGMuCis/ICBUaGUgZGVidWdnZXIgdG9vbGJveCBpdHNlbGYgd2FudHMgdGhpcywgYnV0IEknbSBub3Qgc3VyZSB3aGF0IHVzZSBhIGNsaWVudAorICAgY291bGQgaGF2ZSBmb3IgaXQuICBEaXR0byBSZWluc3RhdGUuLi4KKyAqLworCitEYmdfRXJyb3IgRGJnX1JlaW5zdGF0ZUJyZWFrUG9pbnQoRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfQnJlYWtQb3MgKndoZXJlKTsKKy8qIFVuZG8gdGhlIGVmZmVjdCBvZiBEYmdfU3VzcGVuZEJyZWFrUG9pbnQKKyAqLworCitEYmdfRXJyb3IgRGJnX0RlbGV0ZUFsbEJyZWFrUG9pbnRzKERiZ19NQ1N0YXRlICpzdGF0ZSk7CisKK0RiZ19FcnJvciBEYmdfU3VzcGVuZEFsbEJyZWFrUG9pbnRzKERiZ19NQ1N0YXRlICpzdGF0ZSk7CisKK0RiZ19FcnJvciBEYmdfUmVpbnN0YXRlQWxsQnJlYWtQb2ludHMoRGJnX01DU3RhdGUgKnN0YXRlKTsKKwordHlwZWRlZiBEYmdfRXJyb3IgRGJnX0JQRW51bVByb2MoRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfQnJlYWtTdGF0dXMgKnN0YXR1cywgdm9pZCAqYXJnKTsKKworRGJnX0Vycm9yIERiZ19FbnVtZXJhdGVCcmVha1BvaW50cyhEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19CUEVudW1Qcm9jICpwLCB2b2lkICphcmcpOworCitEYmdfRXJyb3IgRGJnX0JyZWFrUG9pbnRTdGF0dXMoRGJnX01DU3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYmdfQnJlYWtQb3MgKndoZXJlLCBEYmdfQnJlYWtTdGF0dXMgKnN0YXR1cyk7CisKK3R5cGVkZWYgdm9pZCBEYmdfQnJlYWtBbHRlcmVkUHJvYyhEYmdfTUNTdGF0ZSAqc3RhdGUsIEFSTWFkZHJlc3MgYWRkciwgYm9vbCBzZXQpOworRGJnX0Vycm9yIERiZ19PbkJyZWFrKERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX0JyZWFrQWx0ZXJlZFByb2MgKnApOworLyogUmVnaXN0ZXIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJhY2sgd2hlbmV2ZXIgYSBicmVha3BvaW50IGlzIHNldCBvcgorICogY2xlYXJlZC4gKFRvIGFsbG93IG11bHRpcGxlIHRvb2xib3ggY2xpZW50cyB0byBjb2V4aXN0KS4KKyAqLworCitib29sIERiZ19TdG9wcGVkQXRCcmVha1BvaW50KERiZ19NQ1N0YXRlICpzdGF0ZSwgY29uc3QgRGJnX0JyZWFrUG9zICp3aGVyZSk7CisvKiBDYWxsZWQgYWZ0ZXIgZXhlY3V0aW9uIHdoaWNoIHJlc3VsdGVkIGluIHBzX2F0YnJlYWssIHRvIGZpbmQgb3V0IHdoZXRoZXIKKyAgIHRoZSBzcGVjaWZpZWQgYnJlYWtwb2ludCB3YXMgaGl0IChjb3VsZCBiZSA+MSwgZWcuIGV4aXQgYnJlYWsgYW5kIGFub3RoZXIKKyAgIGhpZ2gtbGV2ZWwgYnJlYWtwb2ludCBhdCB0aGUgc2FtZSBwb3NpdGlvbikuCisgICBSZXR1cm5zIE5PIGlmIHNwZWNpZmllZCBicmVha3BvaW50IG5vdCBmb3VuZCwgb3IgZXhlY3V0aW9uIGRpZG4ndCBzdG9wCisgICB3aXRoIHBzX2F0YnJlYWsgc3RhdHVzLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdCB7CisgIERiZ19WYWx1ZSB2YWw7CisgIGNoYXIgKm5hbWU7Cit9IERiZ19XYXRjaFBvczsKKwordHlwZWRlZiBpbnQgRGJnX1dQUHJvYyhEYmdfTUNTdGF0ZSAqc3RhdGUsIHZvaWQgKldQQXJnLCBEYmdfV2F0Y2hQb3MgKndoZXJlKTsKKwordHlwZWRlZiBzdHJ1Y3QgRGJnX1dQU3RhdHVzIHsKKyAgICBpbnQgaW5kZXg7CisgICAgaW50IGluaXRjb3VudCwgY291bnRub3c7CisgICAgRGJnX1dhdGNoUG9zIHdoYXQsIHRhcmdldDsKKyAgICBjaGFyICpleHByOworICAgIERiZ19XUFByb2MgKnA7IHZvaWQgKnBfYXJnOworICAgIERiZ19Qb2ludFR5cGUgdHlwZTsKKyAgICBBUk13b3JkIGh3cmVzb3VyY2U7CisgICAgaW50IHNraXA7Cit9IERiZ19XUFN0YXR1czsKKworRGJnX0Vycm9yIERiZ19TZXRXYXRjaFBvaW50KAorICAgIERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX0Vudmlyb25tZW50ICpjb250ZXh0LCBjaGFyIGNvbnN0ICp3YXRjaGVlLAorICAgIGNoYXIgY29uc3QgKnRhcmdldCwKKyAgICBpbnQgY291bnQsCisgICAgY2hhciBjb25zdCAqZXhwciwKKyAgICBEYmdfV1BQcm9jICpwLCB2b2lkICphcmcpOworCisvKiBDYXVzZSBhIHdhdGNocG9pbnQgZXZlbnQgaWYgdGhlIHZhbHVlIG9mIDx3YXRjaGVlPiBjaGFuZ2VzIHRvIHRoZSB2YWx1ZSBvZgorICAgPHRhcmdldD4gKG9yIGNoYW5nZXMgYXQgYWxsIGlmIDx0YXJnZXQ+IGlzIE5VTEwpLiAgPHdhdGNoZWU+IHNob3VsZAorICAgZXZhbHVhdGUgZWl0aGVyIHRvIGFuIEwtdmFsdWUgKHdoZW4gdGhlIHNpemUgb2YgdGhlIG9iamVjdCBiZWluZyB3YXRjaGVkIGlzCisgICBkZXRlcm1pbmVkIGJ5IGl0cyB0eXBlKSBvciB0byBhbiBpbnRlZ2VyIGNvbnN0YW50ICh3aGVuIHRoZSB3b3JkIHdpdGggdGhpcworICAgYWRkcmVzcyBpcyB3YXRjaGVkKS4KKyAqLworCitEYmdfRXJyb3IgRGJnX0RlbGV0ZVdhdGNoUG9pbnQoRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfRW52aXJvbm1lbnQgKmNvbnRleHQsIGNoYXIgY29uc3QgKndhdGNoZWUpOworCisKK0RiZ19FcnJvciBEYmdfU2V0V2F0Y2hQb2ludF9WKAorICAgIERiZ19NQ1N0YXRlICpzdGF0ZSwKKyAgICBjaGFyIGNvbnN0ICpuYW1lLCBEYmdfVmFsdWUgY29uc3QgKnZhbCwgY2hhciBjb25zdCAqdG5hbWUsIERiZ19WYWx1ZSBjb25zdCAqdHZhbCwKKyAgICBpbnQgY291bnQsCisgICAgY2hhciBjb25zdCAqZXhwciwKKyAgICBEYmdfV1BQcm9jICpwLCB2b2lkICphcmcpOworCitEYmdfRXJyb3IgRGJnX0RlbGV0ZVdhdGNoUG9pbnRfVihEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19WYWx1ZSBjb25zdCAqdmFsKTsKKworCitEYmdfRXJyb3IgRGJnX0RlbGV0ZUFsbFdhdGNoUG9pbnRzKERiZ19NQ1N0YXRlICpzdGF0ZSk7CisKK3R5cGVkZWYgRGJnX0Vycm9yIERiZ19XUEVudW1Qcm9jKERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX1dQU3RhdHVzIGNvbnN0ICp3YXRjaGVlLCB2b2lkICphcmcpOworCitEYmdfRXJyb3IgRGJnX0VudW1lcmF0ZVdhdGNoUG9pbnRzKERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX1dQRW51bVByb2MgKnAsIHZvaWQgKmFyZyk7CisKK0RiZ19FcnJvciBEYmdfV2F0Y2hQb2ludFN0YXR1cyhEYmdfTUNTdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIERiZ19XYXRjaFBvcyBjb25zdCAqd2hlcmUsIERiZ19XUFN0YXR1cyAqc3RhdHVzKTsKKwordHlwZWRlZiB2b2lkIERiZ19XUFJlbW92ZWRQcm9jKHZvaWQgKmFyZywgRGJnX1dQU3RhdHVzIGNvbnN0ICp3cCk7CitEYmdfRXJyb3IgRGJnX1JlZ2lzdGVyV1BSZW1vdmFsUHJvYyhEYmdfTUNTdGF0ZSAqc3RhdGUsIERiZ19XUFJlbW92ZWRQcm9jICpwLCB2b2lkICphcmcpOworLyogV2hlbiBhIHdhdGNocG9pbnQgZ29lcyBvdXQgb2Ygc2NvcGUgaXQgaXMgcmVtb3ZlZCBieSB0aGUgdG9vbGJveCwgYW5kIHRoZQorICAgZnVuY3Rpb24gcmVnaXN0ZXJlZCBoZXJlIGdldHMgY2FsbGVkIGJhY2sgdG8gYWRqdXN0IGl0cyB2aWV3CisgKi8KKwordHlwZWRlZiB2b2lkIERiZ19XYXRjaEFsdGVyZWRQcm9jKERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX1ZhbHVlIGNvbnN0ICp3aGVyZSwgYm9vbCBzZXQpOworRGJnX0Vycm9yIERiZ19PbldhdGNoKERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX1dhdGNoQWx0ZXJlZFByb2MgKnApOworLyogUmVnaXN0ZXIgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJhY2sgd2hlbmV2ZXIgYSB3YXRjaHBvaW50IGlzIHNldCBvcgorICogY2xlYXJlZC4gKFRvIGFsbG93IG11bHRpcGxlIHRvb2xib3ggY2xpZW50cyB0byBjb2V4aXN0KS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworRGJnX0Vycm9yIERiZ19Qcm9maWxlTG9hZChEYmdfTUNTdGF0ZSAqc3RhdGUpOworCitEYmdfRXJyb3IgRGJnX1Byb2ZpbGVTdGFydChEYmdfTUNTdGF0ZSAqc3RhdGUsIEFSTXdvcmQgaW50ZXJ2YWwpOworRGJnX0Vycm9yIERiZ19Qcm9maWxlU3RvcChEYmdfTUNTdGF0ZSAqc3RhdGUpOworCitEYmdfRXJyb3IgRGJnX1Byb2ZpbGVDbGVhcihEYmdfTUNTdGF0ZSAqc3RhdGUpOworCitEYmdfRXJyb3IgRGJnX1dyaXRlUHJvZmlsZShEYmdfTUNTdGF0ZSAqc3RhdGUsIGNoYXIgY29uc3QgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqdG9vbGlkLCBjaGFyIGNvbnN0ICphcmcpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworRGJnX0Vycm9yIERiZ19Db25uZWN0Q2hhbm5lbF9Ub0hvc3QoRGJnX01DU3RhdGUgKnN0YXRlLCBSRElDQ1Byb2NfVG9Ib3N0ICpwLCB2b2lkICphcmcpOworRGJnX0Vycm9yIERiZ19Db25uZWN0Q2hhbm5lbF9Gcm9tSG9zdChEYmdfTUNTdGF0ZSAqc3RhdGUsIFJESUNDUHJvY19Gcm9tSG9zdCAqcCwgdm9pZCAqYXJnKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIENvbmZpZ3VyYXRpb24gZGF0YSBtYW5hZ2VtZW50ICovCisKK0RiZ19FcnJvciBEYmdfTG9hZENvbmZpZ0RhdGEoRGJnX01DU3RhdGUgKnN0YXRlLCBjaGFyIGNvbnN0ICpmaWxlbmFtZSk7CisKK0RiZ19FcnJvciBEYmdfU2VsZWN0Q29uZmlnKAorICAgIERiZ19NQ1N0YXRlICpzdGF0ZSwKKyAgICBSRElfQ29uZmlnQXNwZWN0IGFzcGVjdCwgY2hhciBjb25zdCAqbmFtZSwgUkRJX0NvbmZpZ01hdGNoVHlwZSBtYXRjaHR5cGUsCisgICAgdW5zaWduZWQgdmVyc2lvbnJlcSwgdW5zaWduZWQgKnZlcnNpb25wKTsKKworRGJnX0Vycm9yIERiZ19QYXJzZUNvbmZpZ1ZlcnNpb24oCisgICAgY2hhciBjb25zdCAqcywgUkRJX0NvbmZpZ01hdGNoVHlwZSAqbWF0Y2hwLCB1bnNpZ25lZCAqdmVyc2lvbnApOworCit0eXBlZGVmIERiZ19FcnJvciBEYmdfQ29uZmlnRW51bVByb2MoRGJnX01DU3RhdGUgKnN0YXRlLCBSRElfQ29uZmlnRGVzYyBjb25zdCAqZGVzYywgdm9pZCAqYXJnKTsKKworRGJnX0Vycm9yIERiZ19FbnVtZXJhdGVDb25maWdzKERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX0NvbmZpZ0VudW1Qcm9jICpwLCB2b2lkICphcmcpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQW5nZWwgT1Mgc3VwcG9ydCAqLworCitEYmdfRXJyb3IgRGJnX0NyZWF0ZVRhc2soRGJnX01DU3RhdGUgKipzdGF0ZXAsIERiZ19NQ1N0YXRlICpwYXJlbnQsIGJvb2wgaW5oZXJpdCk7CisvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgdGFzayBpcyB0byBiZSBkZWJ1Z2dlZCB3aGljaCBoYXMgbm90IGJlZW4gZGVidWdnZWQKKyAgIGJlZm9yZSAtIGllLiB0aGVyZSBpcyBubyBleGlzdGluZyBEYmdfTUNTdGF0ZSBmb3IgdGhpcyB0YXNrLiBJdAorICAgaW5pdGlhbGlzZXMgYSBuZXcgRGJnX01DU3RhdGUgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIGl0LgorICAgPHBhcmVudD4gaXMgYW55IHZhbGlkIHByZXZpb3VzbHktY3JlYXRlZCBNQ0NTdGF0ZS4gSWYgPGluaGVyaXQ+IGlzIFRSVUUsCisgICB0aGUgbmV3IE1DU3RhdGUgaW5oZXJpdHMgY2VydGFpbiBmZWF0dXJlcyBmcm9tIGl0IChlZy4gc3ltYm9scykuCisgICBPdGhlcndpc2UsIG9ubHkgZmVhdHVyZXMgd2hpY2ggYXJlIHRoZSBzYW1lIGFjcm9zcyBhbGwgdGFza3MgYXJlIGluaGVyaXRlZCwKKyAgIChlZy4gZ2xvYmFsIGJyZWFrcG9pbnRzKS4KKyAqLworCitEYmdfRXJyb3IgRGJnX0RlbGV0ZVRhc2soRGJnX01DU3RhdGUgKnN0YXRlKTsKKy8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSB0YXNrIGRpZXMsIGFuZCBmcmVlcyB1cCBldmVyeXRoaW5nIHdoaWNoIHJlbGF0ZXMgdG8gdGhhdAorICAgdGFzayB3aGljaCBpcyBjb250cm9sbGVkIGJ5IGFybWRiZy4KKyAqLworCitEYmdfRXJyb3IgRGJnX0RldGFjaFRhc2soRGJnX01DU3RhdGUgKnN0YXRlKTsKKworRGJnX0Vycm9yIERiZ19BdHRhY2hUYXNrKERiZ19NQ1N0YXRlICpzdGF0ZSk7CisvKiBUaGVzZSBhcmUgY2FsbGVkIHRvIHJlcXVlc3QgYSBzd2l0Y2ggb2YgdGhlIGN1cnJlbnQgdGFzay4gIEZpcnN0CisgICBEYmdfRGV0YWNoVGFzayBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIHN0YXRlIG9mIHRoZSBvbGQgdGFzay4KKyAgIERiZ19EZXRhY2hUYXNrIHdpbGwgZW5zdXJlIHRoYXQgYW55IGNhY2hlZCBzdGF0ZSBoZWxkIGJ5IGFybWRiZyBmb3IKKyAgIHRoZSBvbGQgdGFzayBpcyBpbW1lZGlhdGVseSB3cml0dGVuIG91dCB0byB0aGUgdGFyZ2V0LgorCisgICBBZnRlciBEYmdfRGV0YWNoVGFzayBpcyBjYWxsZWQgYW5kIGJlZm9yZSBEYmdfQXR0YWNoVGFzayBpcyBjYWxsZWQKKyAgIHRoZSBPUyBjaGFubmVsIG1hbmFnZXIgc2hvdWxkIHRlbGwgdGhlIHRhcmdldCB0aGF0IGFueSBmdXR1cmUKKyAgIHJlcXVlc3RzIGZyb20gdGhlIGRlYnVnZ2VyIHdpbGwgYmUgZm9yZSB0aGUgbmV3IHRhc2suCisKKyAgIElmIHRoZSBuZXcgdGFzayBkb2VzIG5vdCBoYXZlIGFuIGFybWRiZyBzdGF0ZSBzdHJ1Y3R1cmUKKyAgIGFscmVhZHksIHRoZW4gRGJnX0NyZWF0ZVRhc2sgc2hvdWxkIGJlIGNhbGxlZCB0byBjcmVhdGUgb25lIChzZWUKKyAgIGFib3ZlKS4gIFRoZW4gRGJnX0F0dGFjaFRhc2sgaXMgY2FsbGVkIHRvIHRlbGwgYXJtZGJnIHRvIHRyZWF0IHRoZQorICAgbmV3IGFybWRiZyBzdGF0ZSBhcyB0aGUgY3VycmVudCB0YXNrLgorICovCisKK3R5cGVkZWYgRGJnX0Vycm9yIERiZ19UYXNrU3dpdGNoUHJvYyh2b2lkICphcmcsIERiZ19NQ1N0YXRlICpuZXdzdGF0ZSk7CisKK0RiZ19FcnJvciBEYmdfT25UYXNrU3dpdGNoKERiZ19NQ1N0YXRlICpzdGF0ZSwgRGJnX1Rhc2tTd2l0Y2hQcm9jICpmbiwgdm9pZCAqYXJnKTsKKy8qIFRoZSBmcm9udCBlbmQgbWF5IHJlZ2lzdGVyIGEgY2FsbGJhY2sgd2hpY2ggZ2V0cyBjYWxsZWQgYnkgYXJtZGJnIHdoZW5ldmVyCisgICBEYmdfQXR0YWNoVGFzayBpcyBjYWxsZWQuICBUaGlzIGNhbGxiYWNrIHRlbGxzIHRoZSBmcm9udCBlbmQgdGhlIG5ldyBjdXJyZW50CisgICBEYmdfTUNTdGF0ZSBpdCBzaG91bGQgdXNlIHRvIGNhbGwgYXJtZGJnLgorICAgW05vdGUgdGhhdCB0aGlzIGlzIG9ubHkgdXNlZnVsIGlmIHRoZXJlIGlzIG9uZSBmcm9udCBlbmQgc2hhcmVkIGJldHdlZW4gYWxsCisgICAgdGFza3MgcmF0aGVyIHRoYW4gb25lIGZyb250IGVuZCBwZXIgdGFza10KKyAgIFRoZSB2YWx1ZSBvZiA8YXJnPiBwYXNzZWQgdG8gRGJnX09uVGFza1N3aXRjaCBpcyBwYXNzZWQgdG8gPGZuPgorICAgd2hlbiBpdCBpcyBjYWxsZWQuCisgKi8KKwordHlwZWRlZiBEYmdfRXJyb3IgRGJnX1Jlc3RhcnRQcm9jKAorICAgIHZvaWQgKmFyZywgRGJnX01DU3RhdGUgKmN1cnN0YXRlLCBEYmdfTUNTdGF0ZSAqKm5ld3N0YXRlKTsKKworRGJnX0Vycm9yIERiZ19PblJlc3RhcnQoRGJnX01DU3RhdGUgKnN0YXRlLCBEYmdfUmVzdGFydFByb2MgKmZuLCB2b2lkICphcmcpOworLyogVGhpcyBpcyB1c2VkIGJ5IHRoZSBPUyBjaGFubmVscyBsYXllciB0byByZWdpc3RlciBhIGNhbGxiYWNrIHdoaWNoCisgICB3aWxsIGJlIG1hZGUgYnkgdGhlIGRlYnVnZ2VyIHRvb2xib3ggZWFybHkgaW4gdGhlIHByb2Nlc3Mgb2YgcmVzdW1pbmcKKyAgIGV4ZWN1dGlvbi4KKworICAgVGhpcyBjYWxsYmFjayBtdXN0IGRldGVybWluZSB3aGljaCB0YXNrIHdpbGwgYmUgcmVzdW1lZCB3aGVuIHRoZSB0YXJnZXQKKyAgIHJlc3RhcnRzIGV4ZWN1dGlvbi4gIElmIHRoaXMgaXMgbm90IGFscmVhZHkgdGhlIGN1cnJlbnQgdGFzayB0aGVuIGl0IG11c3QKKyAgIGNhbGwgRGJnX0RldGFjaFRhc2sgYW5kIERiZ19BdHRhY2hUYXNrIGFzIGRlY3JpYmVkIGFib3ZlIHRvIHN3aXRjaCB0byB0aGUKKyAgIHRhc2sgYWJvdXQgdG8gYmUgcmVzdW1lZCBhbmQgcmV0dXJuIHRoZSBzdGF0ZSBmb3IgdGhlIG5ldyB0YXNrIGluCisgICA8bmV3c3RhdGU+LgorCisgICBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgYXJtZGJnIHVwZGF0ZXMgdGhlIGNvcnJlY3QgdGFzayBvbiBleGVjdXRpb24gYXMgd2VsbAorICAgYXMgZW5zdXJpbmcgdGhhdCBzdGVwcGluZyBvdmVyIGEgYnJlYWtwb2ludGVkIGluc3RydWN0aW9uIG9uIHJlc3RhcnRpbmcKKyAgIGhhcHBlbnMgY29ycmVjdGx5LgorCisgICBUaGUgdmFsdWUgb2YgPGFyZz4gcGFzc2VkIHRvIERiZ19PblJlc3RhcnQgaXMgcGFzc2VkIHRvIDxmbj4KKyAgIHdoZW4gaXQgaXMgY2FsbGVkLgorICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCisKKy8qIEVuZCBvZiBhcm1kYmcuaCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9idWZmZXJzLmggYi9nZGIvcmRpLXNoYXJlL2J1ZmZlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODU0OWRlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9idWZmZXJzLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qIC0qLUMtKi0KKyAqCisgKiAkUmV2aXNpb24kCisgKiAgICAgJERhdGUkCisgKgorICoKKyAqICAgUHJvamVjdDogQU5HRUwKKyAqCisgKiAgICAgVGl0bGU6IFB1YmxpYyBpbnRlcmZhY2UgdG8gYnVmZmVyIG1hbmFnZW1lbnQKKyAqLworCisjaWZuZGVmIGFuZ2VsX2J1ZmZlcnNfaAorI2RlZmluZSBhbmdlbF9idWZmZXJzX2gKKworI2luY2x1ZGUgImNoYW5kZWZzLmgiICAgICAgICAgICAvKiBDSEFOX0hFQURFUl9TSVpFICovCisKKworLyogdGhlIGhhbmRsZSB0byBhIGJ1ZmZlciAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICpwX0J1ZmZlcjsKKworCisvKgorICogQW5nZWwgUGFja2V0cyBhcmUgc3RydWN0dXJlZCBhcyBhIGZpeGVkIHNpemUgaGVhZGVyLCBmb2xsb3dlZAorICogYnkgdGhlIHBhY2tldCBkYXRhCisgKi8KKyNpZmRlZiBUQVJHRVQKKyMgZGVmaW5lIEJVRkZFUkRBVEEoYikgIChiKSAgICAgLyogY2hhbm5lbHMgbGF5ZXIgdGFrZXMgY2FyZSBvZiBpdCAqLworI2Vsc2UKKyMgZGVmaW5lIEJVRkZFUkRBVEEoYikgICgmKChiKVtDSEFOX0hFQURFUl9TSVpFXSkpCisjZW5kaWYKKworCisvKgorICogVGhlIGJ1ZmZlciBtYW5hZ2VtZW50IGZ1bmN0aW9uIHByb3RvdHlwZXMgYXJlIG9ubHkgYXBwbGljYWJsZQorICogd2hlbiBjb21waWxpbmcgdGFyZ2V0IGNvZGUKKyAqLworI2lmZGVmIFRBUkdFVAorCisvKgorICogRnVuY3Rpb246IEFuZ2VsX0J1ZmZlclF1ZXJ5U2l6ZXMKKyAqICBQdXJwb3NlOiBSZXF1ZXN0IGluZm9tYXRpb24gb24gdGhlIGRlZmF1bHQgYW5kIG1heGltdW0gYnVmZmVyIHNpemVzCisgKiAgICAgICAgICAgdGhhdCBjYW4gYmUgYWxsb2NhdGVkCisgKgorICogICBQYXJhbXM6CisgKiAgICAgICAgICAgICBJbi9PdXQ6IGRlZmF1bHRfc2l6ZSwgbWF4X3NpemU6IHBvaW50ZXJzIHRvIHBsYWNlIHRoZQorICogICAgICAgICAgICAgICAgICAgICBzaXplcyBpbiBvbiByZXR1cm4KKyAqLworCit2b2lkIEFuZ2VsX0J1ZmZlclF1ZXJ5U2l6ZXModW5zaWduZWQgaW50ICpkZWZhdWx0X3NpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbWF4X3NpemUgKTsKKworLyoKKyAqIEZ1bmN0aW9uOiBBbmdlbF9SeEVuZ2luQnVmZmVyc0xlZnQKKyAqICBQdXJwb3NlOiByZXR1cm4gdGhlIG51bWJlciBvZiBmcmVlIGJ1ZmZlcnMgCisgKgorICogICBQYXJhbXM6CisgKiAgICAgICAgICAgIFJldHVybnM6IG51bWJlciBvZiBmcmVlIGJ1ZmZlcnMKKyAqLwordW5zaWduZWQgaW50IEFuZ2VsX0J1ZmZlcnNMZWZ0KCB2b2lkICk7CisKKy8qCisgKiBGdW5jdGlvbjogQW5nZWxfQnVmZmVyQWxsb2MKKyAqICBQdXJwb3NlOiBhbGxvY2F0ZSBhIGJ1ZmZlciB0aGF0IGlzIGF0IGxlYXN0IHJlcV9zaXplIGJ5dGVzIGxvbmcgCisgKgorICogICBQYXJhbXM6CisgKiAgICAgICAgICAgICAgSW5wdXQ6IHJlcV9zaXplICAgICB0aGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgYnVmZmVyCisgKgorICogICAgICAgICAgICAgIFJldHVybnM6IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBOVUxMIGlmIHVuYWJsZSB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICBmdWxmaWwgdGhlIHJlcXVlc3QKKyAqLworcF9CdWZmZXIgICAgIEFuZ2VsX0J1ZmZlckFsbG9jKHVuc2lnbmVkIGludCAgcmVxX3NpemUpOworCisvKgorICogRnVuY3Rpb246IEFuZ2VsX0J1ZmZlclJlbGVhc2UKKyAqICBQdXJwb3NlOiByZWxlYXNlIGEgYnVmZmVyIGJhY2sgdG8gdGhlIGZyZWUgcG9vbAorICoKKyAqICAgUGFyYW1zOgorICogICAgICAgICAgICAgIElucHV0OiBwb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gZnJlZQorICovCit2b2lkIEFuZ2VsX0J1ZmZlclJlbGVhc2UocF9CdWZmZXIgYnVmZmVyKTsKKworCisvKiByZXR1cm4gdmFsdWVzIGZvciBhbmdlbF9Jbml0QnVmZmVycyAqLwordHlwZWRlZiBlbnVtIGJ1Zl9pbml0X2Vycm9yeworICBJTklUX0JVRl9PSywKKyAgSU5JVF9CVUZfRkFJTAorfSBidWZfaW5pdF9lcnJvcjsKKworLyoKKyAqIEZ1bmN0aW9uOiBBbmdlbF9Jbml0QnVmZmVycworICogIFB1cnBvc2U6IEluaXRhbGlzZWQgYW5kIG1hbGxvYyB0aGUgYnVmZmVyIHBvb2wKKyAqCisgKiAgIFBhcmFtczoKKyAqICAgICAgICAgICAgICBSZXR1cm5zOiBzZWUgYWJvdmUKKyAqLworCitidWZfaW5pdF9lcnJvciAgQW5nZWxfSW5pdEJ1ZmZlcnModm9pZCk7CisKKyNlbmRpZiAvKiBkZWYgVEFSR0VUICovCisKKyNlbmRpZiAvKiBuZGVmIGFuZ2VsX2J1ZmZlcnNfaCAqLworCisvKiBFT0YgYnVmZmVycy5oICovCmRpZmYgLS1naXQgYS9nZGIvcmRpLXNoYXJlL2J5dGVzZXguYyBiL2dkYi9yZGktc2hhcmUvYnl0ZXNleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNmFhYWUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL2J5dGVzZXguYwpAQCAtMCwwICsxLDU3IEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMTk5NSBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGZyZWVseSB1c2VkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaXMgcHJlc2VydmVkIGluIGFsbCBjb3BpZXMgb2YgdGhlCisgKiBzb2Z0d2FyZS4KKyAqLworCisvKgorICogYnl0ZXNleC5jIC0gQ29kZSB0byBzdXBwb3J0IGJ5dGUtc2V4IGluZGVwZW5kZW5jZQorICogQ29weXJpZ2h0OiAoQykgMTk5MSwgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuLCBDYW1icmlkZ2UsIEVuZ2xhbmQuCisgKi8KKworLyoKKyAqIFJDUyAkUmV2aXNpb24kCisgKiBDaGVja2luICREYXRlJAorICovCisKKyNpbmNsdWRlICJieXRlc2V4LmgiCisKK3N0YXRpYyBpbnQgcmV2ZXJzaW5nX2J5dGVzID0gMDsKKwordm9pZCBieXRlc2V4X3JldmVyc2UoeWVzX29yX25vKQoraW50IHllc19vcl9ubzsKK3sgcmV2ZXJzaW5nX2J5dGVzID0geWVzX29yX25vOworfQorCitpbnQgYnl0ZXNleF9yZXZlcnNpbmcoKQoreworICByZXR1cm4gcmV2ZXJzaW5nX2J5dGVzOworfQorCitpbnQzMiBieXRlc2V4X2hvc3R2YWwodikKK2ludDMyIHY7Cit7IC8qIFJldHVybiB2IHdpdGggdGhlIHNhbWUgZW5kaWFuLW5lc3MgYXMgdGhlIGhvc3QgKi8KKyAgLyogVGhpcyBtZXNzIGdlbmVyYXRlcyBiZXR0ZXIgQVJNIGNvZGUgdGhhbiB0aGUgbW9yZSBvYnZpb3VzIG1lc3MgKi8KKyAgLyogYW5kIG1heSBldmVudHVhbGx5IHBlZXBob2xlIHRvIG9wdGltYWwgY29kZS4uLiAgICAgICAgICAgICAgICAgKi8KKyAgaWYgKHJldmVyc2luZ19ieXRlcykKKyAgeyB1bnNpZ25lZDMyIHQ7CisgICAgLyogdCA9IHYgXiAodiByb3IgMTYpICovCisgICAgdCA9IHYgXiAoKHYgPDwgMTYpIHwgKCgodW5zaWduZWQzMil2KSA+PiAxNikpOworICAgIHQgJj0gfjB4ZmYwMDAwOworICAgIC8qIHYgPSB2IHJvciA4ICovCisgICAgdiA9ICh2IDw8IDI0KSB8ICgoKHVuc2lnbmVkMzIpdikgPj4gOCk7CisgICAgdiA9IHYgXiAodCA+PiA4KTsKKyAgfQorICByZXR1cm4gdjsKK30KKworaW50MzIgYnl0ZXNleF9ob3N0dmFsXzE2KHYpCitpbnQzMiB2OworeworICBpZiAocmV2ZXJzaW5nX2J5dGVzKSB7CisgICAgdiA9ICgodiA+PiA4KSAmIDB4ZmYpIHwgKCh2IDw8IDgpICYgMHhmZjAwKTsKKyAgfQorICByZXR1cm4gdjsKK30KZGlmZiAtLWdpdCBhL2dkYi9yZGktc2hhcmUvYnl0ZXNleC5oIGIvZ2RiL3JkaS1zaGFyZS9ieXRlc2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI1M2VmMwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZGktc2hhcmUvYnl0ZXNleC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qCisgIFRpdGxlOiAgICAgQ29kZSB0byBzdXBwb3J0IGJ5dGUtc2V4IGluZGVwZW5kZW5jZQorICBDb3B5cmlnaHQ6IChDKSAxOTkxLCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4sIENhbWJyaWRnZSwgRW5nbGFuZC4KKyovCisvKgorICogUkNTICRSZXZpc2lvbiQKKyAqIENoZWNraW4gJERhdGUkCisgKi8KKworI2lmbmRlZiBfX2J5dGVzZXhfaAorI2RlZmluZSBfX2J5dGVzZXhfaAorCisjaW5jbHVkZSAiaG9zdC5oIgorCit2b2lkIGJ5dGVzZXhfcmV2ZXJzZShpbnQgeWVzX29yX25vKTsKKy8qCisgKiBUdXJuIHNleC1yZXZlcnNhbCBvbiBvciBvZmYgLSAwIG1lYW5zIG9mZiwgbm9uLTAgbWVhbnMgb24uCisgKi8KKworaW50IGJ5dGVzZXhfcmV2ZXJzaW5nKHZvaWQpOworLyoKKyAqIFJldHVybiBub24tMCBpZiByZXZlcnNpbmcgdGhlIGJ5dGUgc2V4LCBlbHNlIDAuCisgKi8KKworaW50MzIgYnl0ZXNleF9ob3N0dmFsKGludDMyIHYpOworLyoKKyAqIFJldHVybiB2IG9yIGJ5dGUtcmV2ZXJzZWQgdiwgYWNjb3JkaW5nIHRvIHdoZXRoZXIgc2V4LXJldmVyc3ZhbAorICogaXMgb24gb3Igb2ZmLgorICovCisKK2ludDMyIGJ5dGVzZXhfaG9zdHZhbF8xNihpbnQzMiB2KTsKKy8qIFJldHVybiB2IG9yIGJ5dGUtcmV2ZXJzZWQgdiBmb3IgYSAxNiBiaXQgdmFsdWUgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvcmRpLXNoYXJlL2NoYW5kZWZzLmggYi9nZGIvcmRpLXNoYXJlL2NoYW5kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3ZjBiNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZGktc2hhcmUvY2hhbmRlZnMuaApAQCAtMCwwICsxLDUwIEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMTk5NSBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGZyZWVseSB1c2VkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaXMgcHJlc2VydmVkIGluIGFsbCBjb3BpZXMgb2YgdGhlCisgKiBzb2Z0d2FyZS4KKyAqLworCisvKiAtKi1DLSotCisgKgorICogJFJldmlzaW9uJAorICogICAgICREYXRlJAorICoKKyAqCisgKiAgIFByb2plY3Q6IEFOR0VMCisgKgorICogICAgIFRpdGxlOiBFbnVtZXJhdGlvbiB3aXRoIGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMKKyAqLworCisjaWZuZGVmIGFuZ2VsX2NoYW5kZWZzX2gKKyNkZWZpbmUgYW5nZWxfY2hhbmRlZnNfaAorCitlbnVtIGNoYW5uZWxJRHMgeworICBDSV9QUklWQVRFID0gMCwgICAgICAgICAgICAgICAvKiBjaGFubmVscyBwcm90b2NvbCBjb250cm9sIG1lc3NhZ2VzICovCisgIENJX0hBRFAsICAgICAgICAgICAgICAgICAgICAgIC8qIEFEUCwgaG9zdCBvcmlnaW5hdGVkICovCisgIENJX1RBRFAsICAgICAgICAgICAgICAgICAgICAgIC8qIEFEUCwgdGFyZ2V0IG9yaWdpbmF0ZWQgKi8KKyAgQ0lfSEJPT1QsICAgICAgICAgICAgICAgICAgICAgLyogQm9vdCwgaG9zdCBvcmlnaW5hdGVkICovCisgIENJX1RCT09ULCAgICAgICAgICAgICAgICAgICAgIC8qIEJvb3QsIHRhcmdldCBvcmlnaW5hdGVkICovCisgIENJX0NMSUIsICAgICAgICAgICAgICAgICAgICAgIC8qIFNlbWlob3N0aW5nIEMgbGlicmFyeSBzdXBwb3J0ICovCisgIENJX0hVREJHLCAgICAgICAgICAgICAgICAgICAgIC8qIFVzZXIgZGVidWcgc3VwcG9ydCwgaG9zdCBvcmlnaW5hdGVkICovCisgIENJX1RVREJHLCAgICAgICAgICAgICAgICAgICAgIC8qIFVzZXIgZGVidWcgc3VwcG9ydCwgdGFyZ2V0IG9yaWdpbmF0ZWQgKi8KKyAgQ0lfSFREQ0MsICAgICAgICAgICAgICAgICAgICAgLyogVGh1bWIgZGlyZWN0IGNvbW1zIGNoYW5uZWwsIGhvc3Qgb3JpZy4gKi8KKyAgQ0lfVFREQ0MsICAgICAgICAgICAgICAgICAgICAgLyogVGh1bWIgZGlyZWN0IGNvbW1zIGNoYW5uZWwsIHRhcmdldCBvcmlnLiAqLworICBDSV9UTE9HLCAgICAgICAgICAgICAgICAgICAgICAvKiBUYXJnZXQgZGVidWcvbG9nZ2luZyAqLworICBDSV9OVU1fQ0hBTk5FTFMKK307CisKK3R5cGVkZWYgdW5zaWduZWQgQ2hhbm5lbElEOworCisKKy8qCisgKiBTaXplIGluIGJ5dGVzIG9mIHRoZSBjaGFubmVsIGhlYWRlci4KKyAqIFRoaXMgaXMgYSBkdXBsaWNhdGUgb2YgWFhYIGluIGNoYW5wcml2LmgsIGJ1dCB3ZSBkb24ndCB3YW50IGV2ZXJ5b25lCisgKiB0byBoYXZlIGFjY2VzcyB0byBhbGwgb2YgY2hhbnByaXYuaCwgc28gd2UnbGwgZG91YmxlLWNoZWNrIGluIGNoYW5wcml2LmguCisgKi8KKyNkZWZpbmUgQ0hBTl9IRUFERVJfU0laRSAoNCkKKworI2VuZGlmIC8qIG5kZWYgYW5nZWxfY2hhbmRlZnNfaCAqLworCisvKiBFT0YgY2hhbmRlZnMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9jaGFubmVscy5oIGIvZ2RiL3JkaS1zaGFyZS9jaGFubmVscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0M2ViYzEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL2NoYW5uZWxzLmgKQEAgLTAsMCArMSwzODQgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qIC0qLUMtKi0KKyAqCisgKiAkUmV2aXNpb24kCisgKiAgICAgJERhdGUkCisgKgorICoKKyAqICAgUHJvamVjdDogQU5HRUwKKyAqCisgKiAgICAgVGl0bGU6IFVzZXIgaW50ZXJmYWNlIHRvIHRoZSBjaGFubmVscyBsYXllcgorICovCisKKyNpZm5kZWYgYW5nZWxfY2hhbm5lbHNfaAorI2RlZmluZSBhbmdlbF9jaGFubmVsc19oCisKKy8qCisgKiBUaGlzIHByb3ZpZGVzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIHRvIHRoZSBjaGFubmVscyBsYXllciByZWFkIGFuZCB3cml0ZQorICogcm91dGluZXMsIGFuZCBidWZmZXIgbWFuYWdlbWVudCByb3V0aW5lcy4KKyAqLworCisvKiBOZXN0ZWQgaGVhZGVyIGZpbGVzLCBpZiByZXF1aXJlZCAqLworCisjaW5jbHVkZSAiZGV2aWNlcy5oIgorI2luY2x1ZGUgImNoYW5kZWZzLmgiCisjaW5jbHVkZSAiYWRwZXJyLmgiCisKKy8qIEdlbmVyYWwgcHVycG9zZSBjb25zdGFudHMsIG1hY3JvcywgZW51bXMsIHR5cGVkZWZzICovCisKKy8qIHVzZSB0aGUgZGVmYXVsdCBkZXZpY2UgKi8KKyNkZWZpbmUgQ0hfREVGQVVMVF9ERVYgKChEZXZpY2VJRCktMSkKKworLyogcmV0dXJuIGNvZGVzICovCit0eXBlZGVmIGVudW0gQ2hhbkVycm9yIHsKKyAgQ0VfT0tBWSwgICAgICAgICAgICAgICAgICAgICAgLyogbm8gZXJyb3IgKi8KKyAgQ0VfQUJBTkRPTkVELCAgICAgICAgICAgICAgICAgLyogYWJhbmRvbmVkIGR1ZSB0byBkZXZpY2Ugc3dpdGNoICovCisgIENFX0RFVl9FUlJPUiwgICAgICAgICAgICAgICAgIC8qIHVuZXhwZWN0ZWQgZXJyb3IgZnJvbSBkZXZpY2UgZHJpdmVyICovCisgIENFX0JVU1ksICAgICAgICAgICAgICAgICAgICAgIC8qIGNoYW5uZWwgaW4gdXNlICovCisgIENFX0JVRkZfRVJST1IsICAgICAgICAgICAgICAgIC8qIHVuYWJsZSB0byBnZXQgYnVmZmVyICovCisgIENFX1BSSVZBVEUgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IG9mIGludGVybmFsIGVycm9yIGNvZGVzICovCit9IENoYW5FcnJvcjsKKworCisvKiBQdWJsaWNhbGx5LWFjY2Vzc2libGUgZ2xvYmFscyAqLworCisvKgorICogVGhlIGZvbGxvd2luZyB0d28gZ2xvYmFscyBhcmUgb25seSB2YWxpZCBhZnRlciBhbmdlbF9Jbml0aWFsaXNlQ2hhbm5lbHMoKQorICogaGFzIGJlZW4gY2FsbGVkLgorICovCisKKy8qIHRoZSBkZWZhdWx0IHNpemUgb2YgYSBjaGFubmVsIGJ1ZmZlciwgZm9yIGdsb2JhbCB1c2UgKi8KK2V4dGVybiB1bnNpZ25lZCBBbmdlbF9DaGFuQnVmZlNpemU7CisKKy8qIHRoZSBzaXplIG9mIGEgbG9uZyBidWZmZXIsIGZvciBnbG9iYWwgdXNlICovCitleHRlcm4gdW5zaWduZWQgQW5nZWxfQ2hhbkxvbmdTaXplOworCisjaWZkZWYgVEFSR0VUCitBZHBFcnJzIHNlbmRfcmVzZW5kX21zZyhEZXZpY2VJRCBkZXZpZCk7CisjZW5kaWYKKworLyoKKyAqIEZ1bmN0aW9uOiBhbmdlbF9Jbml0aWFsaXNlQ2hhbm5lbHMKKyAqICBQdXJwb3NlOiBpbml0aWFsaXNlIHRoZSBjaGFubmVscyBsYXllcgorICoKKyAqICAgUGFyYW1zOgorICogICAgICAgICAgICAgIElucHV0OiAtCisgKiAgICAgICAgICAgICBPdXRwdXQ6IC0KKyAqICAgICAgICAgICAgIEluL091dDogLQorICoKKyAqICAgICAgICAgICAgUmV0dXJuczogLQorICoKKyAqICAgICAgUmVhZHMgZ2xvYmFsczogLQorICogICBNb2RpZmllcyBnbG9iYWxzOiAtCisgKgorICogT3RoZXIgc2lkZSBlZmZlY3RzOiAtCisgKi8KKwordm9pZCBhbmdlbF9Jbml0aWFsaXNlQ2hhbm5lbHMoIHZvaWQgKTsKKworLyoKKyAqIEZ1bmN0aW9uOiBhZHBfaW5pdF9zZXEKKyAqICBQdXJwb3NlOiBpbml0aWFsaXNlIHNlcXVlbmNlIG51bWJlcnMgYW5kIGZyZWUgYW55dCBsZWZ0b3ZlciBidWZmZXJzCisgKgorICogICBQYXJhbXM6CisgKiAgICAgICAgICAgICAgSW5wdXQ6IC0KKyAqICAgICAgICAgICAgIE91dHB1dDogLQorICogICAgICAgICAgICAgSW4vT3V0OiAtCisgKgorICogICAgICAgICAgICBSZXR1cm5zOiAtIGFkcF9vayBpZiB0aGluZ3Mgd2VudCBvayBlbHNlIGFuIGVycm9yIGNvZGUKKyAqCisgKiAgICAgIFJlYWRzIGdsb2JhbHM6IC0KKyAqICAgTW9kaWZpZXMgZ2xvYmFsczogLQorICoKKyAqIE90aGVyIHNpZGUgZWZmZWN0czogLQorICovCisKK0FkcEVycnMgYWRwX2luaXRfc2VxKHZvaWQpOworCisvKgorICogRnVuY3Rpb246IGFuZ2VsX0NoYW5uZWxBbGxvY0J1ZmZlcgorICogIFB1cnBvc2U6IGFsbG9jYXRlIGEgYnVmZmVyIHRoYXQgaXMgYXQgbGVhc3QgcmVxX3NpemUgYnl0ZXMgbG9uZworICoKKyAqICAgUGFyYW1zOgorICogICAgICAgICAgICAgIElucHV0OiByZXFfc2l6ZSAgICAgICAgdGhlIG1pbmltdW0gc2l6ZSByZXF1aXJlZAorICogICAgICAgICAgICAgT3V0cHV0OiAtCisgKiAgICAgICAgICAgICBJbi9PdXQ6IC0KKyAqCisgKiAgICAgICAgICAgIFJldHVybnM6IHBvaW50ZXIgdG8gYWxsb2NhdGVkIGJ1ZmZlciwgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgTlVMTCBpZiB1bmFibGUgdG8gYWxsb2NhdGUgc3VpdGFibGUgYnVmZmVyCisgKgorICogICAgICBSZWFkcyBnbG9iYWxzOiAtCisgKiAgIE1vZGlmaWVzIGdsb2JhbHM6IC0KKyAqCisgKiBPdGhlciBzaWRlIGVmZmVjdHM6IC0KKyAqLworCitwX0J1ZmZlciBhbmdlbF9DaGFubmVsQWxsb2NCdWZmZXIodW5zaWduZWQgcmVxX3NpemUpOworCisKKy8qCisgKiBGdW5jdGlvbjogYW5nZWxfQ2hhbm5lbFJlbGVhc2VCdWZmZXIKKyAqICBQdXJwb3NlOiByZWxlYXNlIGEgYnVmZmVyIGJhY2sgdG8gdGhlIGZyZWUgcG9vbAorICoKKyAqICAgUGFyYW1zOgorICogICAgICAgICAgICAgIElucHV0OiBidWZmZXIgICB0aGUgYnVmZmVyIHRvIHJlbGVhc2UKKyAqICAgICAgICAgICAgIE91dHB1dDogLQorICogICAgICAgICAgICAgSW4vT3V0OiAtCisgKgorICogICAgICAgICAgICBSZXR1cm5zOiAtCisgKgorICogICAgICBSZWFkcyBnbG9iYWxzOiAtCisgKiAgIE1vZGlmaWVzIGdsb2JhbHM6IC0KKyAqCisgKiBPdGhlciBzaWRlIGVmZmVjdHM6IC0KKyAqLworCit2b2lkIGFuZ2VsX0NoYW5uZWxSZWxlYXNlQnVmZmVyKHBfQnVmZmVyIGJ1ZmZlcik7CisKKworLyoKKyAqIEZ1bmN0aW9uOiBhbmdlbF9DaGFubmVsU2VuZAorICogIFB1cnBvc2U6IGJsb2NraW5nIHNlbmQgb2YgYSBwYWNrZXQgdmlhIGEgY2hhbm5lbAorICoKKyAqICAgUGFyYW1zOgorICogICAgICAgICAgICAgIElucHV0OiBkZXZpZCAgICAgICAgIERldmljZSB0byB1c2UsIG9yIENIX0RFRkFVTFRfREVWCisgKiAgICAgICAgICAgICAgICAgICAgIGNoYW5pZCAgICAgICAgQ2hhbm5lbCB0byB1c2UgZm9yIHR4IAorICogICAgICAgICAgICAgICAgICAgICBidWZmZXIgICAgICAgIFBvaW50ZXIgdG8gZGF0YSB0byBzZW5kCisgKiAgICAgICAgICAgICAgICAgICAgIGxlbiAgICAgICAgICAgTGVuZ3RoIG9mIGRhdGEgdG8gc2VuZAorICogICAgICAgICAgICAgT3V0cHV0OiAtCisgKiAgICAgICAgICAgICBJbi9PdXQ6IC0KKyAqCisgKiAgICAgICAgICAgIFJldHVybnM6IENFX09LQVkgICAgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlZAorICogICAgICAgICAgICAgICAgICAgICBDRV9CQURfQ0hBTiAgIENoYW5uZWwgaWQgaW52YWxpZAorICogICAgICAgICAgICAgICAgICAgICBDRV9BQkFORE9ORUQgIFR4IGFiYW5kb25lZCBkdWUgdG8gZGV2aWNlIHN3aXRjaAorICoKKyAqICAgICAgUmVhZHMgZ2xvYmFsczogLQorICogICBNb2RpZmllcyBnbG9iYWxzOiAtCisgKgorICogT3RoZXIgc2lkZSBlZmZlY3RzOiAtCisgKi8KKworQ2hhbkVycm9yIGFuZ2VsX0NoYW5uZWxTZW5kKERldmljZUlEIGRldmlkLCBDaGFubmVsSUQgY2hhbmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBfQnVmZmVyIGJ1ZmZlciwgdW5zaWduZWQgbGVuKTsKKworCisvKgorICogRnVuY3Rpb246IGFuZ2VsX0NoYW5uZWxTZW5kQXN5bmMKKyAqICBQdXJwb3NlOiBhc3luY2hyb25vdXMgc2VuZCBvZiBhIHBhY2tldCB2aWEgYSBjaGFubmVsCisgKgorICogICBQYXJhbXM6CisgKiAgICAgICAgICAgICAgSW5wdXQ6IGRldmlkICAgICAgICAgRGV2aWNlIHRvIHVzZSwgb3IgQ0hfREVGQVVMVF9ERVYKKyAqICAgICAgICAgICAgICAgICAgICAgY2hhbmlkICAgICAgICBDaGFubmVsIHRvIHVzZSBmb3IgdHggCisgKiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAgICAgICAgUG9pbnRlciB0byBkYXRhIHRvIHNlbmQKKyAqICAgICAgICAgICAgICAgICAgICAgbGVuICAgICAgICAgICBMZW5ndGggb2YgZGF0YSB0byBzZW5kCisgKiAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICAgICAgRnVuY3Rpb24gdG8gY2FsbCBvbiBjb21wbGV0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2RhdGEgUG9pbnRlciB0byBwYXNzIHRvIGNhbGxiYWNrCisgKiAgICAgICAgICAgICBPdXRwdXQ6IC0KKyAqICAgICAgICAgICAgIEluL091dDogLQorICoKKyAqICAgICAgICAgICAgUmV0dXJuczogQ0VfT0tBWSAgICAgICBUcmFuc21pc3Npb24gdW5kZXJ3YXkKKyAqICAgICAgICAgICAgICAgICAgICAgQ0VfQkFEX0NIQU4gICBDaGFubmVsIGlkIGludmFsaWQKKyAqICAgICAgICAgICAgICAgICAgICAgQ0VfQUJBTkRPTkVEICBUeCBhYmFuZG9uZWQgZHVlIHRvIGRldmljZSBzd2l0Y2gKKyAqCisgKiAgICAgIFJlYWRzIGdsb2JhbHM6IC0KKyAqICAgTW9kaWZpZXMgZ2xvYmFsczogLQorICoKKyAqIE90aGVyIHNpZGUgZWZmZWN0czogLQorICoKKyAqIHJlZ2lzdGVyIGFuIGFzeW5jaHJvbm91cyBzZW5kIG9uIHRoZSBnaXZlbiBjaGFubmVsCisgKiAoYmxvY2tzIHVudGlsIHNlbmQgY2FuIGJlIGNvbW1lbmNlZCkKKyAqLworCit0eXBlZGVmIHZvaWQgKCpDaGFuVHhfQ0JfRm4pKENoYW5uZWxJRCAgY2hhbmlkLCAgICAgICAgIC8qIHdoaWNoIGNoYW5uZWwgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqY2FsbGJhY2tfZGF0YSk7IC8qIGFzIHN1cHBsaWVkLi4uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCitDaGFuRXJyb3IgYW5nZWxfQ2hhbm5lbFNlbmRBc3luYyggICAgICAgICAgRGV2aWNlSUQgICAgICBkZXZpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsSUQgICAgIGNoYW5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwX0J1ZmZlciAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICAgIGxlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhblR4X0NCX0ZuICBjYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICpjYWxsYmFja19kYXRhKTsKKworCisvKgorICogRnVuY3Rpb246IGFuZ2VsX0NoYW5uZWxSZWFkCisgKiAgUHVycG9zZTogYmxvY2tpbmcgcmVhZCBvZiBhIHBhY2tldCBmcm9tIGEgY2hhbm5lbAorICoKKyAqICAgUGFyYW1zOgorICogICAgICAgICAgICAgIElucHV0OiBkZXZpZCAgICAgICAgIERldmljZSB0byB1c2UsIG9yIENIX0RFRkFVTFRfREVWCisgKiAgICAgICAgICAgICAgICAgICAgIGNoYW5pZCAgICAgICAgQ2hhbm5lbCB0byB1c2UgZm9yIHJ4CisgKiAgICAgICAgICAgICBPdXRwdXQ6IGJ1ZmZlciAgICAgICAgVGhlIGJ1ZmZlciwgc3VwcGxpZWQgYW5kIGZpbGxlZAorICogICAgICAgICAgICAgICAgICAgICBsZW4gICAgICAgICAgIEhvdyBtYW55IGJ5dGVzIHRoZXJlIGFyZSBpbiB0aGUgYnVmZmVyCisgKiAgICAgICAgICAgICBJbi9PdXQ6IC0KKyAqCisgKiAgICAgICAgICAgIFJldHVybnM6IENFX09LQVkgICAgICAgUmVjZXB0aW9uIHN1Y2Nlc3NmdWwKKyAqICAgICAgICAgICAgICAgICAgICAgQ0VfQkFEX0NIQU4gICBDaGFubmVsIGlkIGludmFsaWQKKyAqICAgICAgICAgICAgICAgICAgICAgQ0VfQUJBTkRPTkVEICBUeCBhYmFuZG9uZWQgZHVlIHRvIGRldmljZSBzd2l0Y2gKKyAqCisgKiAgICAgIFJlYWRzIGdsb2JhbHM6IC0KKyAqICAgTW9kaWZpZXMgZ2xvYmFsczogLQorICoKKyAqIE90aGVyIHNpZGUgZWZmZWN0czogLQorICoKKyAqIE5vdGUgdGhhdCBpbiB0aGUgcHJlc2VudCB2ZXJzaW9uLCBpZiBhbiBhc3luY2hyb25vdXMgcmVhZCBoYXMgYmVlbgorICogcmVnaXN0ZXJlZCwgYSBibG9ja2luZyByZWFkIHdpbGwgYmUgcmVmdXNlZCB3aXRoIENFX0JVU1kuCisgKi8KK0NoYW5FcnJvciBhbmdlbF9DaGFubmVsUmVhZChEZXZpY2VJRCAgICAgIGRldmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxJRCAgICAgY2hhbmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfQnVmZmVyICAgICAqYnVmZmVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICAgKmxlbik7CisKKworLyoKKyAqIEZ1bmN0aW9uOiBhbmdlbF9DaGFubmVsUmVhZEFzeW5jCisgKiAgUHVycG9zZTogYXN5bmNocm9ub3VzIHJlYWQgb2YgYSBwYWNrZXQgdmlhIGEgY2hhbm5lbAorICoKKyAqICAgUGFyYW1zOgorICogICAgICAgICAgICAgIElucHV0OiBkZXZpZCAgICAgICAgIERldmljZSB0byB1c2UsIG9yIENIX0RFRkFVTFRfREVWCisgKiAgICAgICAgICAgICAgICAgICAgIGNoYW5pZCAgICAgICAgQ2hhbm5lbCB0byB3YWl0IG9uCisgKiAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrICAgICAgRnVuY3Rpb24gdG8gY2FsbCBvbiBjb21wbGV0aW9uLCBvciBOVUxMCisgKiAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2RhdGEgUG9pbnRlciB0byBwYXNzIHRvIGNhbGxiYWNrCisgKiAgICAgICAgICAgICBPdXRwdXQ6IC0KKyAqICAgICAgICAgICAgIEluL091dDogLQorICoKKyAqICAgICAgICAgICAgUmV0dXJuczogQ0VfT0tBWSAgICAgICBSZWFkIHJlcXVlc3QgcmVnaXN0ZXJlZAorICogICAgICAgICAgICAgICAgICAgICBDRV9CQURfQ0hBTiAgIENoYW5uZWwgaWQgaW52YWxpZAorICogICAgICAgICAgICAgICAgICAgICBDRV9CVVNZICAgICAgIFNvbWVvbmUgZWxzZSBpcyB1c2luZyB0aGUgY2hhbm5lbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbiBhIHNpbmdsZSB0aHJlYWRlZCB3b3JsZCkKKyAqCisgKiAgICAgIFJlYWRzIGdsb2JhbHM6IC0KKyAqICAgTW9kaWZpZXMgZ2xvYmFsczogLQorICoKKyAqIE90aGVyIHNpZGUgZWZmZWN0czogLQorICoKKyAqIFJlZ2lzdGVyIGFuIGFzeW5jaHJvbm91cyByZWFkIG9uIHRoZSBnaXZlbiBjaGFubmVsLiAgVGhlcmUgY2FuIG9ubHkgYmUgb25lCisgKiBhc3luYy4gcmVhZGVyIHBlciBjaGFubmVsLCBhbmQgYmxvY2tpbmcgcmVhZHMgYXJlIG5vdCBwZXJtaXR0ZWQgd2hpbHN0CisgKiBhbiBhc3luYy4gcmVhZGVyIGlzIHJlZ2lzdGVyZWQuCisgKgorICogUmVhZGVyIGNhbiB1bnJlZ2lzdGVyIGJ5IHNwZWNpZnlpbmcgTlVMTCBhcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCisgKi8KKwordHlwZWRlZiB2b2lkICgqQ2hhblJ4X0NCX0ZuKShEZXZpY2VJRCAgIGRldklELCAgIC8qIElEIG9mIHJlY2VpdmluZyBkZXZpY2UgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxJRCAgY2hhbklELCAgLyogSUQgb2YgcmVjZWl2aW5nIGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9CdWZmZXIgICBidWZmLCAgICAvKiBwb2ludGVyIHRvIGJ1ZmZlciAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgIGxlbiwgICAgIC8qIGxlbmd0aCBvZiBkYXRhICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAqY2JfZGF0YSAgLyogY2FsbGJhY2sgZGF0YSAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworQ2hhbkVycm9yIGFuZ2VsX0NoYW5uZWxSZWFkQXN5bmMoRGV2aWNlSUQgICAgICBkZXZpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxJRCAgICAgY2hhbmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhblJ4X0NCX0ZuICBjYWxsYmFjaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgKmNhbGxiYWNrX2RhdGEpOworCisKKy8qCisgKiBGdW5jdGlvbjogYW5nZWxfQ2hhbm5lbFJlYWRBbGwKKyAqICBQdXJwb3NlOiByZWdpc3RlciBhbiBhc3luY2hyb25vdXMgcmVhZCBhY3Jvc3MgYWxsIGRldmljZXMKKyAqCisgKiAgIFBhcmFtczoKKyAqICAgICAgICAgICAgICBJbnB1dDogY2hhbmlkICAgICAgICBDaGFubmVsIHRvIGxvb2sgZm9yICh1c3VhbGx5IEhCT09UKQorICogICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAgICAgIEZ1bmN0aW9uIHRvIGNhbGwgb24gY29tcGxldGlvbgorICogICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19kYXRhIFBvaW50ZXIgdG8gcGFzcyB0byBjYWxsYmFjaworICogICAgICAgICAgICAgT3V0cHV0OiAtCisgKiAgICAgICAgICAgICBJbi9PdXQ6IC0KKyAqCisgKiAgICAgICAgICAgIFJldHVybnM6IENFX09LQVkgICAgICAgUmVhZCByZXF1ZXN0IHJlZ2lzdGVyZWQKKyAqICAgICAgICAgICAgICAgICAgICAgQ0VfQkFEX0NIQU4gICBDaGFubmVsIGlkIGludmFsaWQKKyAqICAgICAgICAgICAgICAgICAgICAgQ0VfQlVTWSAgICAgICBTb21lb25lIGVsc2UgaXMgcmVhZGluZyBhbGwgZGV2aWNlcworICoKKyAqICAgICAgUmVhZHMgZ2xvYmFsczogLQorICogICBNb2RpZmllcyBnbG9iYWxzOiAtCisgKgorICogT3RoZXIgc2lkZSBlZmZlY3RzOiAtCisgKgorICogUmVnaXN0ZXIgYW4gYXN5bmNocm9ub3VzIHJlYWQgYWNyb3NzIGFsbCBkZXZpY2VzLiAgVGhpcyBpcyBhICdmYWxsYmFjaycsCisgKiB3aGljaCB3aWxsIGJlIHN1cGVyc2VkZWQgKHRlbXBvcmFyaWx5KSBieSBhIHJlZ2lzdGVyZWQgcmVhZGVyIG9yIGJsb2NraW5nIAorICogcmVhZCBvbiBhIHNwZWNpZmljIGRldmljZS4KKyAqLworCitDaGFuRXJyb3IgYW5nZWxfQ2hhbm5lbFJlYWRBbGwoICAgICAgICAgQ2hhbm5lbElEICAgICBjaGFuaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhblJ4X0NCX0ZuICBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgKmNhbGxiYWNrX2RhdGEpOworCisKKworLyoKKyAqIEZ1bmN0aW9uOiBhbmdlbF9DaGFubmVsU2VuZFRoZW5SZWFkCisgKiAgUHVycG9zZTogYmxvY2tpbmcgd3JpdGUgdG8gZm9sbG93ZWQgYnkgcmVhZCBmcm9tIGEgY2hhbm5lbAorICoKKyAqICAgUGFyYW1zOgorICogICAgICAgICAgICAgIElucHV0OiBkZXZpZCAgICAgICAgIERldmljZSB0byB1c2UsIG9yIENIX0RFRkFVTFRfREVWCisgKiAgICAgICAgICAgICAgICAgICAgIGNoYW5pZCAgICAgICAgQ2hhbm5lbCB0byB1c2UgZm9yIHJ4CisgKiAgICAgICAgICAgICBJbi9PdXQ6IGJ1ZmZlciAgICAgICAgT24gZW50cnk6ICB0aGUgcGFja2V0IHRvIGJlIHNlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiByZXR1cm46IHRoZSBwYWNrZXQgcmVjZWl2ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgbGVuICAgICAgICAgICBPbiBlbnRyeTogIGxlbmd0aCBvZiBwYWNrZXQgdG8gYmUgc2VudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uIHJldHVybjogbGVuZ3RoIG9mIHBhY2tldCByeCdkCisgKiAgICAgICAgICAgICBJbi9PdXQ6IC0KKyAqCisgKiAgICAgICAgICAgIFJldHVybnM6IENFX09LQVkgICAgICAgVHggYW5kIFJlY2VwdGlvbiBzdWNjZXNzZnVsCisgKiAgICAgICAgICAgICAgICAgICAgIENFX0JBRF9DSEFOICAgQ2hhbm5lbCBpZCBpbnZhbGlkCisgKiAgICAgICAgICAgICAgICAgICAgIENFX0FCQU5ET05FRCAgVHggYWJhbmRvbmVkIGR1ZSB0byBkZXZpY2Ugc3dpdGNoCisgKgorICogICAgICBSZWFkcyBnbG9iYWxzOiAtCisgKiAgIE1vZGlmaWVzIGdsb2JhbHM6IC0KKyAqCisgKiBPdGhlciBzaWRlIGVmZmVjdHM6IC0KKyAqCisgKiBOb3RlIHRoYXQgaW4gdGhlIHByZXNlbnQgdmVyc2lvbiwgaWYgYW4gYXN5bmNocm9ub3VzIHJlYWQgaGFzIGJlZW4KKyAqIHJlZ2lzdGVyZWQsIHRoaXMgd2lsbCBiZSByZWZ1c2VkIHdpdGggQ0VfQlVTWS4KKyAqLworQ2hhbkVycm9yIGFuZ2VsX0NoYW5uZWxTZW5kVGhlblJlYWQoRGV2aWNlSUQgICAgICBkZXZpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxJRCAgICAgY2hhbmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9CdWZmZXIgICAgICpidWZmZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgICAgICpsZW4pOworCisKKy8qCisgKiBGdW5jdGlvbjogYW5nZWxfQ2hhbm5lbFNlbGVjdERldmljZQorICogIFB1cnBvc2U6IHNlbGVjdCB0aGUgZGV2aWNlIHRvIGJlIHVzZWQgZm9yIGFsbCBjaGFubmVsIGNvbW1zCisgKgorICogICBQYXJhbXM6CisgKiAgICAgICAgICAgICAgSW5wdXQ6IGRldmljZSAgICAgICAgSUQgb2YgZGV2aWNlIHRvIHVzZSBhcyB0aGUgZGVmYXVsdAorICogICAgICAgICAgICAgT3V0cHV0OiAtCisgKiAgICAgICAgICAgICBJbi9PdXQ6IC0KKyAqCisgKiAgICAgICAgICAgIFJldHVybnM6IENFX09LQVkgICAgICAgRGVmYXVsdCBkZXZpY2Ugc2VsZWN0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgQ0VfQkFEX0RFViAgICBJbnZhbGlkIGRldmljZSBJRAorICoKKyAqICAgICAgUmVhZHMgZ2xvYmFsczogLQorICogICBNb2RpZmllcyBnbG9iYWxzOiAtCisgKgorICogT3RoZXIgc2lkZSBlZmZlY3RzOiBBbnkgY2hhbm5lbCBvcGVyYXRpb25zIGluIHByb2dyZXNzIGFyZQorICogICAgICAgICAgICAgICAgICAgICBhYmFuZG9uZWQuCisgKgorICogc2VsZWN0IHRoZSBkZXZpY2UgZm9yIGFsbCBjaGFubmVscyBjb21tcworICovCisKK0NoYW5FcnJvciBhbmdlbF9DaGFubmVsU2VsZWN0RGV2aWNlKERldmljZUlEIGRldmljZSk7CisKKworLyoKKyAqIEZ1bmN0aW9uOiBhbmdlbF9DaGFubmVsUmVhZEFjdGl2ZURldmljZQorICogIFB1cnBvc2U6IHJlYWRzIHRoZSBkZXZpY2UgaWQgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgZGV2aWNlCisgKgorICogICBQYXJhbXM6CisgKiAgICAgICAgICAgICAgSW5wdXQ6IGRldmljZSAgICAgICAgYWRkcmVzcyBvZiBhIERldmljZUlEIHZhcmlhYmxlCisgKiAgICAgICAgICAgICBPdXRwdXQ6ICpkZXZpY2UgICAgICAgSUQgb2YgZGV2aWNlIGN1cnJlbnRseSBiZWluZyB1c2VkCisgKiAgICAgICAgICAgICBJbi9PdXQ6IC0KKyAqCisgKiAgICAgICAgICAgIFJldHVybnM6IENFX09LQVkgICAgICAgRGVmYXVsdCBkZXZpY2Ugc2VsZWN0ZWQKKyAqLworCitDaGFuRXJyb3IgYW5nZWxfQ2hhbm5lbFJlYWRBY3RpdmVEZXZpY2UoRGV2aWNlSUQgKmRldmljZSk7CisKKyNlbmRpZiAvKiBuZGVmIGFuZ2VsX2NoYW5uZWxzX2ggKi8KKworLyogRU9GIGNoYW5uZWxzLmggKi8KZGlmZiAtLWdpdCBhL2dkYi9yZGktc2hhcmUvY2hhbnByaXYuaCBiL2dkYi9yZGktc2hhcmUvY2hhbnByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTVlODY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9jaGFucHJpdi5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qIC0qLUMtKi0KKyAqCisgKiAkUmV2aXNpb24kCisgKiAgICAgJERhdGUkCisgKgorICoKKyAqICAgUHJvamVjdDogQU5HRUwKKyAqCisgKiAgICAgVGl0bGU6IFByaXZhdGUgaGVhZGVyIGZvciBjaGFubmVscyBpbXBsZW1lbnRhdGlvbnMKKyAqLworCisjaWZuZGVmIGFuZ2VsX2NoYW5wcml2X2gKKyNkZWZpbmUgYW5nZWxfY2hhbnByaXZfaAorCisvKgorICogVGhpcyBkZXNjcmliZXMgdGhlIGludGVybmFsIHN0cnVjdHVyZSBhbmQgZmxhZ3MgZm9yIGEgY2hhbm5lbHMgcGFja2V0LgorICovCisKKy8qIGJ5dGUgcG9zaXRpb25zIHdpdGhpbiBjaGFubmVsIHBhY2tldCAqLworI2RlZmluZSBDRl9DSEFOTkVMX0JZVEVfUE9TICAwCisjZGVmaW5lIENGX0hPTUVfU0VRX0JZVEVfUE9TIDEKKyNkZWZpbmUgQ0ZfT1BQT19TRVFfQllURV9QT1MgMgorI2RlZmluZSBDRl9GTEFHU19CWVRFX1BPUyAgICAzCisjZGVmaW5lIENGX0RBVEFfQllURV9QT1MgICAgIDQKKworLyogZmxhZ3MgZm9yIEZMQUdTIGZpZWxkICovCisjZGVmaW5lIENGX1JFTElBQkxFICAoMSA8PCAwKSAgICAvKiB1c2UgcmVsaWFibGUgY2hhbm5lbHMgcHJvdG9jb2wgKi8KKyNkZWZpbmUgQ0ZfUkVTRU5EICAgICgxIDw8IDEpICAgIC8qIHRoaXMgaXMgYSByZW5lZ290aWF0aW9uIHBhY2tldCAqLworI2RlZmluZSBDRl9IRUFSVEJFQVQgKDEgPDwgMikgICAgLyogaGVhcnRiZWF0IHBhY2tldCAtIHByb2QgdGFyZ2V0IGludG8gc3luYyAqLworCisvKiBieXRlIHBvc2l0aW9ucyB3aXRoaW4gYnVmZmVyICovCisjZGVmaW5lIENCX0xJTktfQllURV9QT1MgICAgICAgIDAgICAvKiB0aGUgbGluayBwb2ludGVyICovCisjZGVmaW5lIENCX0NIQU5fSEVBREVSX0JZVEVfUE9TIDQgICAvKiB0aGUgY2hhbm5lbCBmcmFtZSBzdGFydHMgaGVyZSAqLworCisvKiBtYWNybyB0byBnZXQgYnVmZmVyIHBvc2l0aW9uIG9mIHBhY2tldCBjb21wb25lbnQgKi8KKyNkZWZpbmUgQ0JfUEFDS0VUKHgpIChDQl9DSEFOX0hFQURFUl9CWVRFX1BPUyArICh4KSkKKworLyogYnl0ZSBvZmZzZXQgb2YgcGFja2V0IGRhdGEgd2l0aGluIGJ1ZmZlciAqLworI2RlZmluZSBDQl9DSEFOX0RBVEFfQllURV9QT1MgICAoQ0JfUEFDS0VUKENGX0RBVEFfQllURV9QT1MpKQorCisvKiBhY2Nlc3MgdGhlIGxpbmsgaW4gYSBidWZmZXIsIHdoZXJlIGIgaXMgYnl0ZSBwb2ludGVyIHRvIGJ1ZmZlciAqLworI2RlZmluZSBDQl9MSU5LKGIpICgocF9CdWZmZXIpKCYoYilbMF0pKQorCisjZGVmaW5lIGludmFsaWRDaGFubmVsSUQoY2hhbikgICgoKGludCkoY2hhbikpIDwgMCB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbikgPj0gQ0lfTlVNX0NIQU5ORUxTKQorCisjZW5kaWYgLyogbmRlZiBhbmdlbF9jaGFucHJpdl9oICovCisKKy8qIEVPRiBjaGFucHJpdi5oICovCmRpZmYgLS1naXQgYS9nZGIvcmRpLXNoYXJlL2NvbmZpZ3VyZSBiL2dkYi9yZGktc2hhcmUvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU4NWY0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDIxMTUgQEAKKyMhIC9iaW4vc2gKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2J1aWxkPU5PTkUKK2NhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2V4ZWNfcHJlZml4PU5PTkUKK2hvc3Q9Tk9ORQorbm9fY3JlYXRlPQorbm9ub3B0PU5PTkUKK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3RhcmdldD1OT05FCit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorc3ViZGlycz0KK01GTEFHUz0gTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT1hZHAuaAorCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2FjX2V4ZWV4dD0KK2FjX29iamV4dD1vCitpZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KKyAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKyAgICBhY19uPSBhY19jPScKKycgYWNfdD0nCScKKyAgZWxzZQorICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKyAgZmkKK2Vsc2UKKyAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CitmaQorCisKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1NjA6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisKK3Rlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2MTQ6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1CisjIEp1c3QgaW4gY2FzZQorc2xlZXAgMQorZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKKyMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKKyMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQorIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcworIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKKyMgZGlyZWN0b3J5KS4KK2lmICgKKyAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKKyAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgorICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KKyAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCisgICBmaQorICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAorICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAxPiYyOyBleGl0IDE7IH0KKyAgIGZpCisKKyAgIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0ZmlsZQorICAgKQordGhlbgorICAgIyBPay4KKyAgIDoKK2Vsc2UKKyAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCitDaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgMT4mMjsgZXhpdCAxOyB9CitmaQorcm0gLWYgY29uZnRlc3QqCitlY2hvICIkYWNfdCIieWVzIiAxPiY2CitpZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KK2Vsc2UKKyAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCitzLFxcLFxcXFwsZzsgcyxcJCwkJCxnCitFT0ZfU0VECisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCisgIHJtIC1mIGNvbmZ0ZXN0c2VkCitmaQordGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCit0ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisKKyMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KK3Rlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjcxOiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKK3NldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCithbGw6CisJQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKK0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCitldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKK2lmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCitlbHNlCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCitmaQorcm0gLWYgY29uZnRlc3RtYWtlCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBTRVRfTUFLRT0KK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKKworUEFDS0FHRT1yZGktc2hhcmUKKworVkVSU0lPTj0xLjAKKworaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdCIgMT4mMjsgZXhpdCAxOyB9CitmaQorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCitFT0YKKworY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCitFT0YKKworCisKK21pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3MTc6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQorIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKKyMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCisjIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgoraWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICBBQ0xPQ0FMPWFjbG9jYWwKKyAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgorZWxzZQorICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKKyAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzMwOiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIgPiY1CisjIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgorIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KKyMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCitpZiAoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICBBVVRPQ09ORj1hdXRvY29uZgorICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2CitlbHNlCisgICBBVVRPQ09ORj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2NvbmYiCisgICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc0MzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiID4mNQorIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKKyMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCisjIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgoraWYgKGF1dG9tYWtlIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgQVVUT01BS0U9YXV0b21ha2UKKyAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgorZWxzZQorICAgQVVUT01BS0U9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9tYWtlIgorICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc1NjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1CisjIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgorIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KKyMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCitpZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgorICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2CitlbHNlCisgICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgorICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3Njk6IGNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiA+JjUKKyMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCisjIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgorIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KK2lmIChtYWtlaW5mbyAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgIE1BS0VJTkZPPW1ha2VpbmZvCisgICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKK2Vsc2UKKyAgIE1BS0VJTkZPPSIkbWlzc2luZ19kaXIvbWlzc2luZyBtYWtlaW5mbyIKKyAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2CitmaQorCisKKworUEFDS0FHRT1yZGktc2hhcmUKK1ZFUlNJT049MS4wCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Nzg5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4MTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4Njg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjg5OTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgOTA5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK21haW4oKXtyZXR1cm4oMCk7fQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjkxMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCisgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKyAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubworICBlbHNlCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKKyAgZmkKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkzMzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Citjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkzODogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTQ3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjk2NjogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKK2lmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfY2NfZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDA5OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KKyAgICBjYXNlICIkYWNfZGlyLyIgaW4KKyAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKKyAgICAqKQorICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKyAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICAgIyBieSBkZWZhdWx0LgorICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbworICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisgICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJICAgIDoKKwkgIGVsc2UKKwkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgorCSAgICBicmVhayAyCisJICBmaQorCWZpCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX0lGUyIKKworZmkKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQorICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KKyAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKKyAgZmkKK2ZpCitlY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA2MDogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1CitzZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgorYWxsOgorCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCitFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCitpZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcworZWxzZQorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0bWFrZQorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgU0VUX01BS0U9CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwODk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExMTg6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBDUFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKKyAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KKyAgQ1BQPSIke0NDLWNjfSAtRSIKKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTEzMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTEzOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTE1MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTE1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTE2NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTE3MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0vbGliL2NwcAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCisgIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgorZWxzZQorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCitlY2hvICIkYWNfdCIiJENQUCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTE5ODogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTIwMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTIxMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjI4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyNDYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTI2NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQoraWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKK2V4aXQgKDApOyB9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjc4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNURENfSEVBREVSUyAxCitFT0YKKworZmkKKworZm9yIGFjX2hkciBpbiBmY250bC5oIHN5cy9pb2N0bC5oIHN5cy90aW1lLmggdW5pc3RkLmggc3lzL2ZpbGlvLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzA1OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTMxMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTMxNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzNDM6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwordHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OworLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK2NoYXIgY29uc3QgKmNvbnN0ICpjY3A7CitjaGFyICoqcDsKKy8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCitzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CitzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKKy8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KKyAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQorICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KK2NvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKK2NjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKy8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCisrK2NjcDsKK3AgPSAoY2hhcioqKSBjY3A7CitjY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKK3sgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgKnQ7CisgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7CisKKyAgKnQrKyA9IDA7Cit9Cit7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLworICBpbnQgeFtdID0gezI1LCAxN307CisgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICsrZm9vOworfQoreyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOworICBpcHRyIHAgPSAwOworICArK3A7Cit9Cit7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKKyAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OworICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Cit9Cit7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLworICBjb25zdCBpbnQgZm9vID0gMTA7Cit9CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzk3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGNvbnN0IAorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0MTg6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTQyMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAic2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZAorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGltZS5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDUxOiBjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3RpbWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNDU2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KK2ludCBtYWluKCkgeworc3RydWN0IHRtICp0cDsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDY1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3RpbWU9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl90aW1lPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl90aW1lIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfdGltZSA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgVElNRV9XSVRIX1NZU19USU1FIDEKK0VPRgorCitmaQorCisKK2lmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBuZWVkcyAtdHJhZGl0aW9uYWwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0ODg6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gbmVlZHMgLXRyYWRpdGlvbmFsIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djY190cmFkaXRpb25hbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgYWNfcGF0dGVybj0iQXV0b2NvbmYuKid4JyIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTQ5NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c2d0dHkuaD4KK0F1dG9jb25mIFRJT0NHRVRQCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIiRhY19wYXR0ZXJuIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9wcm9nX2djY190cmFkaXRpb25hbD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9wcm9nX2djY190cmFkaXRpb25hbD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCisKKyAgaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWwgPSBubzsgdGhlbgorICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE1MTIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHRlcm1pby5oPgorQXV0b2NvbmYgVENHRVRBCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIiRhY19wYXR0ZXJuIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9wcm9nX2djY190cmFkaXRpb25hbD15ZXMKK2ZpCitybSAtZiBjb25mdGVzdCoKKworICBmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djY190cmFkaXRpb25hbCIgMT4mNgorICBpZiB0ZXN0ICRhY19jdl9wcm9nX2djY190cmFkaXRpb25hbCA9IHllczsgdGhlbgorICAgIENDPSIkQ0MgLXRyYWRpdGlvbmFsIgorICBmaQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNTM0OiBjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2lnbmFsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTUzOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaWZkZWYgc2lnbmFsCisjdW5kZWYgc2lnbmFsCisjZW5kaWYKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB2b2lkICgqc2lnbmFsIChpbnQsIHZvaWQgKCopKGludCkpKShpbnQpOworI2Vsc2UKK3ZvaWQgKCpzaWduYWwgKCkpICgpOworI2VuZGlmCisKK2ludCBtYWluKCkgeworaW50IGk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU1NjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2lnbmFsPXZvaWQKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9aW50CitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2lnbmFsIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBSRVRTSUdUWVBFICRhY19jdl90eXBlX3NpZ25hbAorRU9GCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHZwcmludGYiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE1NzU6IGNoZWNraW5nIGZvciB2cHJpbnRmIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3ZwcmludGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNTgwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHZwcmludGYoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciB2cHJpbnRmKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfdnByaW50ZikgfHwgZGVmaW5lZCAoX19zdHViX19fdnByaW50ZikKK2Nob2tlIG1lCisjZWxzZQordnByaW50ZigpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjAzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jX3ZwcmludGY9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jX3ZwcmludGY9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyd2cHJpbnRmYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1ZQUklOVEYgMQorRU9GCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0ICIkYWNfY3ZfZnVuY192cHJpbnRmIiAhPSB5ZXM7IHRoZW4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBfZG9wcm50IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjI3OiBjaGVja2luZyBmb3IgX2RvcHJudCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19fZG9wcm50JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTYzMiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBfZG9wcm50KCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgX2RvcHJudCgpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViX19kb3BybnQpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX19kb3BybnQpCitjaG9rZSBtZQorI2Vsc2UKK19kb3BybnQoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY1NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY19fZG9wcm50PXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY19fZG9wcm50PW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nX2RvcHJudGBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9ET1BSTlQgMQorRU9GCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitmaQorCitmb3IgYWNfZnVuYyBpbiBnZXR0aW1lb2ZkYXkgc2VsZWN0IHNvY2tldCBzdHJ0b2Qgc3RydG91bCBtZW1jcHkgbWVtbW92ZQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY4MjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTY4NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzEwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzM2OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1CisgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgorICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX01BSU5UQUlORVJfTU9ERT1ubworZmkKKworICBlY2hvICIkYWNfdCIiJFVTRV9NQUlOVEFJTkVSX01PREUiIDE+JjYKKyAgaWYgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllczsgdGhlbgorICAgIE1BSU5UPQorICBlbHNlCisgICAgTUFJTlQ9JyNNIycKKyAgZmkKKyAgCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3NTQ6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X2N5Z3dpbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE3NTkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK3JldHVybiBfX0NZR1dJTjMyX187Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc2NjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X2N5Z3dpbj15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfY3lnd2luPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYW1fY3ZfY3lnd2luIiAxPiY2CitDWUdXSU49Cit0ZXN0ICIkYW1fY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgTWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTc4MzogY2hlY2tpbmcgZm9yIE1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNzg4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CityZXR1cm4gX19NSU5HVzMyX187Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc5NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X21pbmd3MzI9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X21pbmd3MzI9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhbV9jdl9taW5ndzMyIiAxPiY2CitNSU5HVzMyPQordGVzdCAiJGFtX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODE0OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllczsgdGhlbgorYW1fY3ZfZXhlZXh0PS5leGUKK2Vsc2UKK2NhdCA+IGFtX2NfdGVzdC5jIDw8ICdFT0YnCitpbnQgbWFpbigpIHsKKy8qIE5vdGhpbmcgbmVlZGVkIGhlcmUgKi8KK30KK0VPRgorJHtDQy1jY30gLW8gYW1fY190ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGFtX2NfdGVzdC5jICRMSUJTIDE+JjUKK2FtX2N2X2V4ZWV4dD0KK2ZvciBmaWxlIGluIGFtX2NfdGVzdC4qOyBkbworICAgY2FzZSAkZmlsZSBpbgorICAgICouYykgOzsKKyAgICAqLm8pIDs7CisgICAgKikgYW1fY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvYW1fY190ZXN0Ly9gIDs7CisgICBlc2FjCitkb25lCitybSAtZiBhbV9jX3Rlc3QqCitmaQorCit0ZXN0IHgiJHthbV9jdl9leGVleHR9IiA9IHggJiYgYW1fY3ZfZXhlZXh0PW5vCitmaQorRVhFRVhUPSIiCit0ZXN0IHgiJHthbV9jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YW1fY3ZfZXhlZXh0fQorZWNobyAiJGFjX3QiIiR7YW1fY3ZfZXhlZXh0fSIgMT4mNgorCisKK3RyYXAgJycgMSAyIDE1CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxIHwgZ3JlcCBhY19zcGFjZWAgaW4KKyAgKmFjX3NwYWNlPVwgKikKKyAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgc2VkIC1uIFwKKyAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCisgICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCisgICAgOzsKKyAgKikKKyAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKyAgICA7OworICBlc2FjID4+IGNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCisjIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KKyMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJworZmkKKwordHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gREVGUy4KKyMgUHJvdGVjdCBhZ2FpbnN0IHNoZWxsIGV4cGFuc2lvbiB3aGlsZSBleGVjdXRpbmcgTWFrZWZpbGUgcnVsZXMuCisjIFByb3RlY3QgYWdhaW5zdCBNYWtlZmlsZSBtYWNybyBleHBhbnNpb24uCitjYXQgPiBjb25mdGVzdC5kZWZzIDw8XEVPRgorcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklLURcMT1cMiVnCitzJVsgCWB+IyReJiooKXt9XFx8OyciPD4/XSVcXCYlZworcyVcWyVcXCYlZworcyVcXSVcXCYlZworcyVcJCUkJCVnCitFT0YKK0RFRlM9YHNlZCAtZiBjb25mdGVzdC5kZWZzIGNvbmZkZWZzLmggfCB0ciAnXDAxMicgJyAnYAorcm0gLWYgY29uZnRlc3QuZGVmcworCisKKyMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgorOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorCitlY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCitybSAtZiAkQ09ORklHX1NUQVRVUworY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyMhIC9iaW4vc2gKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCisjIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIworIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKKyMKKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCithY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgorZm9yIGFjX29wdGlvbgorZG8KKyAgY2FzZSAiXCRhY19vcHRpb24iIGluCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKKyAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCisgICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUiIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAU0hFTExAJSRTSEVMTCVnCitzJUBDRkxBR1NAJSRDRkxBR1MlZworcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCitzJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKK3MlQERFRlNAJSRERUZTJWcKK3MlQExERkxBR1NAJSRMREZMQUdTJWcKK3MlQExJQlNAJSRMSUJTJWcKK3MlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworcyVAcHJlZml4QCUkcHJlZml4JWcKK3MlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKK3MlQGJpbmRpckAlJGJpbmRpciVnCitzJUBzYmluZGlyQCUkc2JpbmRpciVnCitzJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCitzJUBkYXRhZGlyQCUkZGF0YWRpciVnCitzJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCitzJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKK3MlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKK3MlQGxpYmRpckAlJGxpYmRpciVnCitzJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCitzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCitzJUBpbmZvZGlyQCUkaW5mb2RpciVnCitzJUBtYW5kaXJAJSRtYW5kaXIlZworcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKK3MlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCitzJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKK3MlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKK3MlQFZFUlNJT05AJSRWRVJTSU9OJWcKK3MlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKK3MlQEFVVE9DT05GQCUkQVVUT0NPTkYlZworcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCitzJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCitzJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKK3MlQFNFVF9NQUtFQCUkU0VUX01BS0UlZworcyVAQ0NAJSRDQyVnCitzJUBSQU5MSUJAJSRSQU5MSUIlZworcyVAQ1BQQCUkQ1BQJWcKK3MlQE1BSU5UQCUkTUFJTlQlZworcyVARVhFRVhUQCUkRVhFRVhUJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KKyAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OworICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKK3MlQElOU1RBTExAJSRJTlNUQUxMJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworZXhpdCAwCitFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCitybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwordGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisKZGlmZiAtLWdpdCBhL2dkYi9yZGktc2hhcmUvY29uZmlndXJlLmluIGIvZ2RiL3JkaS1zaGFyZS9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJkYTVjYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZGktc2hhcmUvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsMzYgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorQUNfUFJFUkVRKDIuMTIuMSkKK0FDX0lOSVQoYWRwLmgpCisKK0FNX0lOSVRfQVVUT01BS0UocmRpLXNoYXJlLCAxLjApCisKK1BBQ0tBR0U9cmRpLXNoYXJlCitWRVJTSU9OPTEuMAorCitkbmwgQ2hlY2tzIGZvciBwcm9ncmFtcy4KK0FDX1BST0dfQ0MKK0FDX1BST0dfSU5TVEFMTAorQUNfUFJPR19NQUtFX1NFVAorQUNfUFJPR19SQU5MSUIKKworZG5sIENoZWNrcyBmb3IgbGlicmFyaWVzLgorCitkbmwgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCitBQ19IRUFERVJfU1REQworQUNfQ0hFQ0tfSEVBREVSUyhmY250bC5oIHN5cy9pb2N0bC5oIHN5cy90aW1lLmggdW5pc3RkLmggc3lzL2ZpbGlvLmgpCisKK2RubCBDaGVja3MgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzLgorQUNfQ19DT05TVAorQUNfVFlQRV9TSVpFX1QKK0FDX0hFQURFUl9USU1FCisKK2RubCBDaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLgorQUNfUFJPR19HQ0NfVFJBRElUSU9OQUwKK0FDX1RZUEVfU0lHTkFMCitBQ19GVU5DX1ZQUklOVEYKK0FDX0NIRUNLX0ZVTkNTKGdldHRpbWVvZmRheSBzZWxlY3Qgc29ja2V0IHN0cnRvZCBzdHJ0b3VsIG1lbWNweSBtZW1tb3ZlKQorCitBTV9NQUlOVEFJTkVSX01PREUKK0FNX0VYRUVYVAorCitBQ19PVVRQVVQoTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9nZGIvcmRpLXNoYXJlL2NyYy5jIGIvZ2RiL3JkaS1zaGFyZS9jcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmE2NTIyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9jcmMuYwpAQCAtMCwwICsxLDI1NyBAQAorLyogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgdXNlZCwgY29waWVkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzIHByZXNlcnZlZCBpbiBhbGwgY29waWVzIG9mIHRoZQorICogc29mdHdhcmUuCisgKi8KKworLyogLSotQy0qLQorICoKKyAqICRSZXZpc2lvbiQKKyAqICAgICAkRGF0ZSQKKyAqCisgKgorICogY3JjLmMgLSBwcm92aWRlcyBzb21lICJzdGFuZGFyZCIgQ1JDIGNhbGN1bGF0aW9uIHJvdXRpbmVzLgorICoKKyAqLworI2luY2x1ZGUgImNyYy5oIiAgICAvKiBkZXNjcmliZXMgdGhpcyBjb2RlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogY3JjMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFLTgwMi4zIDMyYml0IENSQworICogLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIFRoaXMgdGFibGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgImNyY3RhYmxlIiBwcm9ncmFtICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNyYzMydGFibGVbMjU2XSA9IHsKKyAgICAgICAgICAgICAgICAgICAvKiAweDAwICovIDB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4RUUwRTYxMkMsIDB4OTkwOTUxQkEsCisgICAgICAgICAgICAgICAgICAgLyogMHgwNCAqLyAweDA3NkRDNDE5LCAweDcwNkFGNDhGLCAweEU5NjNBNTM1LCAweDlFNjQ5NUEzLAorICAgICAgICAgICAgICAgICAgIC8qIDB4MDggKi8gMHgwRURCODgzMiwgMHg3OURDQjhBNCwgMHhFMEQ1RTkxRSwgMHg5N0QyRDk4OCwKKyAgICAgICAgICAgICAgICAgICAvKiAweDBDICovIDB4MDlCNjRDMkIsIDB4N0VCMTdDQkQsIDB4RTdCODJEMDcsIDB4OTBCRjFEOTEsCisgICAgICAgICAgICAgICAgICAgLyogMHgxMCAqLyAweDFEQjcxMDY0LCAweDZBQjAyMEYyLCAweEYzQjk3MTQ4LCAweDg0QkU0MURFLAorICAgICAgICAgICAgICAgICAgIC8qIDB4MTQgKi8gMHgxQURBRDQ3RCwgMHg2RERERTRFQiwgMHhGNEQ0QjU1MSwgMHg4M0QzODVDNywKKyAgICAgICAgICAgICAgICAgICAvKiAweDE4ICovIDB4MTM2Qzk4NTYsIDB4NjQ2QkE4QzAsIDB4RkQ2MkY5N0EsIDB4OEE2NUM5RUMsCisgICAgICAgICAgICAgICAgICAgLyogMHgxQyAqLyAweDE0MDE1QzRGLCAweDYzMDY2Q0Q5LCAweEZBMEYzRDYzLCAweDhEMDgwREY1LAorICAgICAgICAgICAgICAgICAgIC8qIDB4MjAgKi8gMHgzQjZFMjBDOCwgMHg0QzY5MTA1RSwgMHhENTYwNDFFNCwgMHhBMjY3NzE3MiwKKyAgICAgICAgICAgICAgICAgICAvKiAweDI0ICovIDB4M0MwM0U0RDEsIDB4NEIwNEQ0NDcsIDB4RDIwRDg1RkQsIDB4QTUwQUI1NkIsCisgICAgICAgICAgICAgICAgICAgLyogMHgyOCAqLyAweDM1QjVBOEZBLCAweDQyQjI5ODZDLCAweERCQkJDOUQ2LCAweEFDQkNGOTQwLAorICAgICAgICAgICAgICAgICAgIC8qIDB4MkMgKi8gMHgzMkQ4NkNFMywgMHg0NURGNUM3NSwgMHhEQ0Q2MERDRiwgMHhBQkQxM0Q1OSwKKyAgICAgICAgICAgICAgICAgICAvKiAweDMwICovIDB4MjZEOTMwQUMsIDB4NTFERTAwM0EsIDB4QzhENzUxODAsIDB4QkZEMDYxMTYsCisgICAgICAgICAgICAgICAgICAgLyogMHgzNCAqLyAweDIxQjRGNEI1LCAweDU2QjNDNDIzLCAweENGQkE5NTk5LCAweEI4QkRBNTBGLAorICAgICAgICAgICAgICAgICAgIC8qIDB4MzggKi8gMHgyODAyQjg5RSwgMHg1RjA1ODgwOCwgMHhDNjBDRDlCMiwgMHhCMTBCRTkyNCwKKyAgICAgICAgICAgICAgICAgICAvKiAweDNDICovIDB4MkY2RjdDODcsIDB4NTg2ODRDMTEsIDB4QzE2MTFEQUIsIDB4QjY2NjJEM0QsCisgICAgICAgICAgICAgICAgICAgLyogMHg0MCAqLyAweDc2REM0MTkwLCAweDAxREI3MTA2LCAweDk4RDIyMEJDLCAweEVGRDUxMDJBLAorICAgICAgICAgICAgICAgICAgIC8qIDB4NDQgKi8gMHg3MUIxODU4OSwgMHgwNkI2QjUxRiwgMHg5RkJGRTRBNSwgMHhFOEI4RDQzMywKKyAgICAgICAgICAgICAgICAgICAvKiAweDQ4ICovIDB4NzgwN0M5QTIsIDB4MEYwMEY5MzQsIDB4OTYwOUE4OEUsIDB4RTEwRTk4MTgsCisgICAgICAgICAgICAgICAgICAgLyogMHg0QyAqLyAweDdGNkEwREJCLCAweDA4NkQzRDJELCAweDkxNjQ2Qzk3LCAweEU2NjM1QzAxLAorICAgICAgICAgICAgICAgICAgIC8qIDB4NTAgKi8gMHg2QjZCNTFGNCwgMHgxQzZDNjE2MiwgMHg4NTY1MzBEOCwgMHhGMjYyMDA0RSwKKyAgICAgICAgICAgICAgICAgICAvKiAweDU0ICovIDB4NkMwNjk1RUQsIDB4MUIwMUE1N0IsIDB4ODIwOEY0QzEsIDB4RjUwRkM0NTcsCisgICAgICAgICAgICAgICAgICAgLyogMHg1OCAqLyAweDY1QjBEOUM2LCAweDEyQjdFOTUwLCAweDhCQkVCOEVBLCAweEZDQjk4ODdDLAorICAgICAgICAgICAgICAgICAgIC8qIDB4NUMgKi8gMHg2MkREMURERiwgMHgxNURBMkQ0OSwgMHg4Q0QzN0NGMywgMHhGQkQ0NEM2NSwKKyAgICAgICAgICAgICAgICAgICAvKiAweDYwICovIDB4NERCMjYxNTgsIDB4M0FCNTUxQ0UsIDB4QTNCQzAwNzQsIDB4RDRCQjMwRTIsCisgICAgICAgICAgICAgICAgICAgLyogMHg2NCAqLyAweDRBREZBNTQxLCAweDNERDg5NUQ3LCAweEE0RDFDNDZELCAweEQzRDZGNEZCLAorICAgICAgICAgICAgICAgICAgIC8qIDB4NjggKi8gMHg0MzY5RTk2QSwgMHgzNDZFRDlGQywgMHhBRDY3ODg0NiwgMHhEQTYwQjhEMCwKKyAgICAgICAgICAgICAgICAgICAvKiAweDZDICovIDB4NDQwNDJENzMsIDB4MzMwMzFERTUsIDB4QUEwQTRDNUYsIDB4REQwRDdDQzksCisgICAgICAgICAgICAgICAgICAgLyogMHg3MCAqLyAweDUwMDU3MTNDLCAweDI3MDI0MUFBLCAweEJFMEIxMDEwLCAweEM5MEMyMDg2LAorICAgICAgICAgICAgICAgICAgIC8qIDB4NzQgKi8gMHg1NzY4QjUyNSwgMHgyMDZGODVCMywgMHhCOTY2RDQwOSwgMHhDRTYxRTQ5RiwKKyAgICAgICAgICAgICAgICAgICAvKiAweDc4ICovIDB4NUVERUY5MEUsIDB4MjlEOUM5OTgsIDB4QjBEMDk4MjIsIDB4QzdEN0E4QjQsCisgICAgICAgICAgICAgICAgICAgLyogMHg3QyAqLyAweDU5QjMzRDE3LCAweDJFQjQwRDgxLCAweEI3QkQ1QzNCLCAweEMwQkE2Q0FELAorICAgICAgICAgICAgICAgICAgIC8qIDB4ODAgKi8gMHhFREI4ODMyMCwgMHg5QUJGQjNCNiwgMHgwM0I2RTIwQywgMHg3NEIxRDI5QSwKKyAgICAgICAgICAgICAgICAgICAvKiAweDg0ICovIDB4RUFENTQ3MzksIDB4OUREMjc3QUYsIDB4MDREQjI2MTUsIDB4NzNEQzE2ODMsCisgICAgICAgICAgICAgICAgICAgLyogMHg4OCAqLyAweEUzNjMwQjEyLCAweDk0NjQzQjg0LCAweDBENkQ2QTNFLCAweDdBNkE1QUE4LAorICAgICAgICAgICAgICAgICAgIC8qIDB4OEMgKi8gMHhFNDBFQ0YwQiwgMHg5MzA5RkY5RCwgMHgwQTAwQUUyNywgMHg3RDA3OUVCMSwKKyAgICAgICAgICAgICAgICAgICAvKiAweDkwICovIDB4RjAwRjkzNDQsIDB4ODcwOEEzRDIsIDB4MUUwMUYyNjgsIDB4NjkwNkMyRkUsCisgICAgICAgICAgICAgICAgICAgLyogMHg5NCAqLyAweEY3NjI1NzVELCAweDgwNjU2N0NCLCAweDE5NkMzNjcxLCAweDZFNkIwNkU3LAorICAgICAgICAgICAgICAgICAgIC8qIDB4OTggKi8gMHhGRUQ0MUI3NiwgMHg4OUQzMkJFMCwgMHgxMERBN0E1QSwgMHg2N0RENEFDQywKKyAgICAgICAgICAgICAgICAgICAvKiAweDlDICovIDB4RjlCOURGNkYsIDB4OEVCRUVGRjksIDB4MTdCN0JFNDMsIDB4NjBCMDhFRDUsCisgICAgICAgICAgICAgICAgICAgLyogMHhBMCAqLyAweEQ2RDZBM0U4LCAweEExRDE5MzdFLCAweDM4RDhDMkM0LCAweDRGREZGMjUyLAorICAgICAgICAgICAgICAgICAgIC8qIDB4QTQgKi8gMHhEMUJCNjdGMSwgMHhBNkJDNTc2NywgMHgzRkI1MDZERCwgMHg0OEIyMzY0QiwKKyAgICAgICAgICAgICAgICAgICAvKiAweEE4ICovIDB4RDgwRDJCREEsIDB4QUYwQTFCNEMsIDB4MzYwMzRBRjYsIDB4NDEwNDdBNjAsCisgICAgICAgICAgICAgICAgICAgLyogMHhBQyAqLyAweERGNjBFRkMzLCAweEE4NjdERjU1LCAweDMxNkU4RUVGLCAweDQ2NjlCRTc5LAorICAgICAgICAgICAgICAgICAgIC8qIDB4QjAgKi8gMHhDQjYxQjM4QywgMHhCQzY2ODMxQSwgMHgyNTZGRDJBMCwgMHg1MjY4RTIzNiwKKyAgICAgICAgICAgICAgICAgICAvKiAweEI0ICovIDB4Q0MwQzc3OTUsIDB4QkIwQjQ3MDMsIDB4MjIwMjE2QjksIDB4NTUwNTI2MkYsCisgICAgICAgICAgICAgICAgICAgLyogMHhCOCAqLyAweEM1QkEzQkJFLCAweEIyQkQwQjI4LCAweDJCQjQ1QTkyLCAweDVDQjM2QTA0LAorICAgICAgICAgICAgICAgICAgIC8qIDB4QkMgKi8gMHhDMkQ3RkZBNywgMHhCNUQwQ0YzMSwgMHgyQ0Q5OUU4QiwgMHg1QkRFQUUxRCwKKyAgICAgICAgICAgICAgICAgICAvKiAweEMwICovIDB4OUI2NEMyQjAsIDB4RUM2M0YyMjYsIDB4NzU2QUEzOUMsIDB4MDI2RDkzMEEsCisgICAgICAgICAgICAgICAgICAgLyogMHhDNCAqLyAweDlDMDkwNkE5LCAweEVCMEUzNjNGLCAweDcyMDc2Nzg1LCAweDA1MDA1NzEzLAorICAgICAgICAgICAgICAgICAgIC8qIDB4QzggKi8gMHg5NUJGNEE4MiwgMHhFMkI4N0ExNCwgMHg3QkIxMkJBRSwgMHgwQ0I2MUIzOCwKKyAgICAgICAgICAgICAgICAgICAvKiAweENDICovIDB4OTJEMjhFOUIsIDB4RTVENUJFMEQsIDB4N0NEQ0VGQjcsIDB4MEJEQkRGMjEsCisgICAgICAgICAgICAgICAgICAgLyogMHhEMCAqLyAweDg2RDNEMkQ0LCAweEYxRDRFMjQyLCAweDY4RERCM0Y4LCAweDFGREE4MzZFLAorICAgICAgICAgICAgICAgICAgIC8qIDB4RDQgKi8gMHg4MUJFMTZDRCwgMHhGNkI5MjY1QiwgMHg2RkIwNzdFMSwgMHgxOEI3NDc3NywKKyAgICAgICAgICAgICAgICAgICAvKiAweEQ4ICovIDB4ODgwODVBRTYsIDB4RkYwRjZBNzAsIDB4NjYwNjNCQ0EsIDB4MTEwMTBCNUMsCisgICAgICAgICAgICAgICAgICAgLyogMHhEQyAqLyAweDhGNjU5RUZGLCAweEY4NjJBRTY5LCAweDYxNkJGRkQzLCAweDE2NkNDRjQ1LAorICAgICAgICAgICAgICAgICAgIC8qIDB4RTAgKi8gMHhBMDBBRTI3OCwgMHhENzBERDJFRSwgMHg0RTA0ODM1NCwgMHgzOTAzQjNDMiwKKyAgICAgICAgICAgICAgICAgICAvKiAweEU0ICovIDB4QTc2NzI2NjEsIDB4RDA2MDE2RjcsIDB4NDk2OTQ3NEQsIDB4M0U2RTc3REIsCisgICAgICAgICAgICAgICAgICAgLyogMHhFOCAqLyAweEFFRDE2QTRBLCAweEQ5RDY1QURDLCAweDQwREYwQjY2LCAweDM3RDgzQkYwLAorICAgICAgICAgICAgICAgICAgIC8qIDB4RUMgKi8gMHhBOUJDQUU1MywgMHhERUJCOUVDNSwgMHg0N0IyQ0Y3RiwgMHgzMEI1RkZFOSwKKyAgICAgICAgICAgICAgICAgICAvKiAweEYwICovIDB4QkRCREYyMUMsIDB4Q0FCQUMyOEEsIDB4NTNCMzkzMzAsIDB4MjRCNEEzQTYsCisgICAgICAgICAgICAgICAgICAgLyogMHhGNCAqLyAweEJBRDAzNjA1LCAweENERDcwNjkzLCAweDU0REU1NzI5LCAweDIzRDk2N0JGLAorICAgICAgICAgICAgICAgICAgIC8qIDB4RjggKi8gMHhCMzY2N0EyRSwgMHhDNDYxNEFCOCwgMHg1RDY4MUIwMiwgMHgyQTZGMkI5NCwKKyAgICAgICAgICAgICAgICAgICAvKiAweEZDICovIDB4QjQwQkJFMzcsIDB4QzMwQzhFQTEsIDB4NUEwNURGMUIsIDB4MkQwMkVGOEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Cit1bnNpZ25lZCBpbnQgY3JjMzIodW5zaWduZWQgY2hhciAqYWRkcmVzcywgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGludCBjcmMpCit7CisjaWYgMAorICAvKiBGQVNULCBidXQgYmlnZ2VyIGFuZCBvbmx5IGdvb2QgZm9yIHdvcmQtYWxpZ25lZCBkYXRhICovCisgIHVuc2lnbmVkIGludCAqZGFkZHIgPSAodW5zaWduZWQgaW50ICopYWRkcmVzczsKKyAgdW5zaWduZWQgaW50ICBkYXRhID0gRkFMU0U7IC8qIGxpdHRsZS1lbmRpYW4gYnkgZGVmYXVsdCAqLworCisgLyoKKyAgKiBUT0RPOiBXZSBzaG91bGQgcmVhbGx5IGdldCB0aGUgY3VycmVudCBwcm9jZXNzb3IgYmlnLSBvcgorICAqIGxpdHRsZS1lbmRpYW4gc3RhdGUgYW5kIHNldCAiZGF0YSIgYWNjb3JkaW5nbHkuCisgICovCisKKyAgLyogUGVyZm9ybSB3b3JkIGxvb3AgdG8gc2F2ZSBvbiBtZW1vcnkgYWNjZXNzZXMgKi8KKyAgaWYgKGRhdGEpCisgICAgLyogYmlnLWVuZGlhbiAqLworICAgIGZvciAoOyAoc2l6ZSA+IDApOyBzaXplIC09IHNpemVvZih1bnNpZ25lZCBpbnQpKQorICAgIHsKKyAgICAgIGRhdGEgPSAqZGFkZHIrKzsKKyAgICAgIGNyYyA9ICgoKGNyYyA+PiA4KSAmIDB4MDBGRkZGRkYpIF4KKyAgICAgICAgICAgICBjcmMzMnRhYmxlWyhjcmMgXiAoKGRhdGEgPj4gMjQpICYgMHhGRikpICYgMHhGRl0pOworICAgICAgY3JjID0gKCgoY3JjID4+IDgpICYgMHgwMEZGRkZGRikgXgorICAgICAgICAgICAgIGNyYzMydGFibGVbKGNyYyBeICgoZGF0YSA+PiAxNikgJiAweEZGKSkgJiAweEZGXSk7CisgICAgICBjcmMgPSAoKChjcmMgPj4gOCkgJiAweDAwRkZGRkZGKSBeCisgICAgICAgICAgICAgY3JjMzJ0YWJsZVsoY3JjIF4gKChkYXRhID4+ICA4KSAmIDB4RkYpKSAmIDB4RkZdKTsKKyAgICAgIGNyYyA9ICgoKGNyYyA+PiA4KSAmIDB4MDBGRkZGRkYpIF4KKyAgICAgICAgICAgICBjcmMzMnRhYmxlWyhjcmMgXiAoKGRhdGEgPj4gIDApICYgMHhGRikpICYgMHhGRl0pOworICAgIH0KKyAgZWxzZQorICAgIGZvciAoOyAoc2l6ZSA+IDApOyBzaXplIC09IHNpemVvZih1bnNpZ25lZCBpbnQpKQorICAgIHsKKyAgICAgIGRhdGEgPSAqZGFkZHIrKzsKKyAgICAgIGNyYyA9ICgoKGNyYyA+PiA4KSAmIDB4MDBGRkZGRkYpIF4KKyAgICAgICAgICAgICBjcmMzMnRhYmxlWyhjcmMgXiAoKGRhdGEgPj4gIDApICYgMHhGRikpICYgMHhGRl0pOworICAgICAgY3JjID0gKCgoY3JjID4+IDgpICYgMHgwMEZGRkZGRikgXgorICAgICAgICAgICAgIGNyYzMydGFibGVbKGNyYyBeICgoZGF0YSA+PiAgOCkgJiAweEZGKSkgJiAweEZGXSk7CisgICAgICBjcmMgPSAoKChjcmMgPj4gOCkgJiAweDAwRkZGRkZGKSBeCisgICAgICAgICAgICAgY3JjMzJ0YWJsZVsoY3JjIF4gKChkYXRhID4+IDE2KSAmIDB4RkYpKSAmIDB4RkZdKTsKKyAgICAgIGNyYyA9ICgoKGNyYyA+PiA4KSAmIDB4MDBGRkZGRkYpIF4KKyAgICAgICAgICAgICBjcmMzMnRhYmxlWyhjcmMgXiAoKGRhdGEgPj4gMjQpICYgMHhGRikpICYgMHhGRl0pOworICAgIH0KKyNlbHNlCisgIGZvciAoOyAoc2l6ZSA+IDApOyBzaXplLS0pCisgICAgLyogYnl0ZSBsb29wICovCisgICAgY3JjID0gKCgoY3JjID4+IDgpICYgMHgwMEZGRkZGRikgXgorICAgICAgICAgICBjcmMzMnRhYmxlWyhjcmMgXiAqYWRkcmVzcysrKSAmIDB4MDAwMDAwRkZdKTsKKyNlbmRpZgorCisgIHJldHVybihjcmMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIGNyYzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNmJpdCBDUkMtQ0NJVFQKKyAqIC0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB0YWJsZSBkcml2ZW4gMTZiaXQgQ1JDIGdlbmVyYXRpb24gZm9yIGJ5dGUgZGF0YS4KKyAqIFRoaXMgQ1JDIGlzIGFsc28ga25vd24gYXMgdGhlIEhETEMgQ1JDLgorICovCisvKgorICogOTYwMjAxIEtXZWx0b24KKyAqCisgKlRPRE86IElzIHRoaXMgY29ycmVjdD8gIFRoZSBjb21waWxlciBwcmVkZWZpbmVzIF9fYXJtLCAqbm90KiBfX0FSTQorICovCisjaWZkZWYgX19BUk0KKy8qCisgKiBUbyBtYWtlIHRoZSBjb2RlIHF1aWNrZXIgb24gdGhlIEFSTSwgd2UgZG91YmxlIHRoZSB0YWJsZSBzaXplIGFuZAorICogdXNlIGludGVnZXIgc2xvdHMgcmF0aGVyIHRoYW4gc2hvcnQgc2xvdHMgZm9yIHRoZSB0YWJsZS4KKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjcmN0YWJsZUFbMTZdID0geworI2Vsc2UKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBjcmN0YWJsZUFbMTZdID0geworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwODEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIxMDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMxODMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyMDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDUyODUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYzMDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDczODcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0MDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDk0ODksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEE1MEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI1OEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEM2MEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEQ2OEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEU3MEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEY3OEYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworI2lmZGVmIF9fQVJNCisvKiBTZWUgY29tbWVudHMgYWJvdmUgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY3JjdGFibGVCWzE2XSA9IHsKKyNlbHNlCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgY3JjdGFibGVCWzE2XSA9IHsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTg5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMzEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMjlCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NjI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1N0FELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NTM2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3NEJGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzQ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5REMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBRjVBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCRUQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDQTZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQkU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFOTdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGOEY3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKK3Vuc2lnbmVkIHNob3J0IGNyYzE2KHVuc2lnbmVkIGNoYXIgKmFkZHJlc3MsIHVuc2lnbmVkIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgY3JjKQoreworICBmb3IgKDsgKHNpemUgPiAwKTsgc2l6ZS0tKQorICB7CisgICAgLyogYnl0ZSBsb29wICovCisgICAgdW5zaWduZWQgY2hhciBkYXRhID0gKmFkZHJlc3MrKzsgLyogZmV0Y2ggdGhlIG5leHQgZGF0YSBieXRlICovCisKKyAgICBkYXRhIF49IGNyYzsgLyogRU9SIGRhdGEgd2l0aCBjdXJyZW50IENSQyB2YWx1ZSAqLworICAgIGNyYyA9ICgoY3JjdGFibGVBWyhkYXRhICYgMHhGMCkgPj4gNF0gXiBjcmN0YWJsZUJbZGF0YSAmIDB4MEZdKSBeCisgICAgICAgICAgIChjcmMgPj4gOCkpOworICB9CisKKyAgcmV0dXJuKGNyYyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgMCAvKiBub3QgcmVxdWlyZWQgYXQgdGhlIG1vbWVudCAqLworCisvKgorICogZWxmX2hhc2gKKyAqIC0tLS0tLS0tCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcml2ZWQgZnJvbSB0aGUgb25lIG9uIHBhZ2UgNjggb2YgY2hhcHRlciBvZiB0aGUgIlVuaXgKKyAqIFNWUjQgUHJvZ3JhbW1lcidzIEd1aWRlIi4gSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBhIGhhc2gtY29kZSBmcm9tIGEKKyAqIHN5bWJvbCBuYW1lLgorICovCit1bnNpZ25lZCBpbnQgZWxmX2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSkKK3sKKyAgdW5zaWduZWQgaW50IGggPSAwOworICB1bnNpZ25lZCBpbnQgZzsKKworICAvKiBOVUxMIHBvaW50ZXIgcmV0dXJucyBhIGhhc2ggb2YgemVybyAqLworICB3aGlsZSAobmFtZSAmJiAoKm5hbWUpKQorICB7CisgICAgaCA9ICgoaCA8PCA0KSArICpuYW1lKyspOworCisgICAgaWYgKGcgPSAoaCAmIDB4RjAwMDAwMDApKQorICAgICAgaCBePSAoZyA+PiAyNCk7CisKKyAgICBoICY9IH5nOworICB9CisKKyAgcmV0dXJuKGgpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFT0YgY3JjLmMgKi8KZGlmZiAtLWdpdCBhL2dkYi9yZGktc2hhcmUvY3JjLmggYi9nZGIvcmRpLXNoYXJlL2NyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YmEyM2UKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL2NyYy5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qIC0qLUMtKi0KKyAqCisgKiAkUmV2aXNpb24kCisgKiAgICAgJERhdGUkCisgKgorICoKKyAqIGNyYy5oIC0gZGVzY3JpYmVzIHNvbWUgInN0YW5kYXJkIiBDUkMgY2FsY3VsYXRpb24gcm91dGluZXMuCisgKi8KKyNpZm5kZWYgYW5nZWxfY3JjX2gKKyNkZWZpbmUgYW5nZWxfY3JjX2gKKworLyoKKyAqIG1hbmlmZXN0cworICovCisKKy8qCisgKiBXaGVuIHVzaW5nICJjcmMzMiIgb3IgImNyYzE2IiB0aGVzZSBpbml0aWFsIENSQyB2YWx1ZXMgbXVzdCBiZSBnaXZlbiB0bworICogdGhlIHJlc3BlY3RpdmUgZnVuY3Rpb24gdGhlIGZpcnN0IHRpbWUgaXQgaXMgY2FsbGVkLiBUaGUgZnVuY3Rpb24gY2FuCisgKiB0aGVuIGJlIGNhbGxlZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgbGFzdCBjYWxsIG9mIHRoZSBmdW5jdGlvbgorICogdG8gZ2VuZXJhdGUgYSBydW5uaW5nIENSQyBvdmVyIG11bHRpcGxlIGRhdGEgYmxvY2tzLgorICogV2hlbiB0aGUgbGFzdCBkYXRhIGJsb2NrIGhhcyBiZWVuIHByb2Nlc3NlZCB1c2luZyB0aGUgImNyYzMyIiBhbGdvcml0aG0KKyAqIHRoZSBDUkMgdmFsdWUgc2hvdWxkIGJlIGludmVydGVkIHRvIHByb2R1Y2UgdGhlIGZpbmFsIENSQyB2YWx1ZToKKyAqIGUuZy4gQ1JDID0gfkNSQworICovCisKKyNkZWZpbmUgc3RhcnRDUkMzMiAgKDB4RkZGRkZGRkYpICAgIC8qIENSQyBpbml0aWFsaXNlZCB0byBhbGwgMXMgKi8KKyNkZWZpbmUgc3RhcnRDUkMxNiAgKDB4MDAwMCkgICAgICAgIC8qIENSQyBpbml0aWFsaXNlZCB0byBhbGwgMHMgKi8KKworLyoKKyAqIEZvciB0aGUgQ1JDLTMyIHJlc2lkdWFsIHRvIGJlIGNhbGN1bGF0ZWQgY29ycmVjdGx5IHJlcXVpcmVzIHRoYXQgdGhlIENSQworICogdmFsdWUgaXMgaW4gbWVtb3J5IGxpdHRsZS1lbmRpYW4gZHVlIHRvIHRoZSBieXRlIHJlYWQsIGJpdC1vcmRlcmluZworICogbmF0dXJlIG9mIHRoZSBhbGdvcml0aG0uCisgKi8KKyNkZWZpbmUgQ1JDMzJyZXNpZHVhbCAgICgweERFQkIyMEUzKSAgICAvKiBnb29kIENSQy0zMiByZXNpZHVhbCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogZXhwb3J0ZWQgZnVuY3Rpb25zCisgKi8KKworLyoKKyAqICBGdW5jdGlvbjogY3JjMzIKKyAqICAgUHVycG9zZTogUHJvdmlkZXMgYSB0YWJsZSBkcml2ZW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIElFRUUtODAyLjMKKyAqICAgICAgICAgICAgMzItYml0IENSQyBhbGdvcml0aG0gZm9yIGJ5dGUgZGF0YS4KKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgICBJbnB1dDogYWRkcmVzcyAgICAgcG9pbnRlciB0byB0aGUgYnl0ZSBkYXRhCisgKiAgICAgICAgICAgICAgc2l6ZSAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgdG8gYmUgcHJvY2Vzc2VkCisgKiAgICAgICAgICAgICAgY3JjICAgICAgICAgaW5pdGlhbCBDUkMgdmFsdWUgdG8gYmUgdXNlZCAoY2FuIGJlIHRoZSBvdXRwdXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGEgcHJldmlvdXMgY2FsbCB0byB0aGlzIGZ1bmN0aW9uKS4KKyAqICAgUmV0dXJuczoKKyAqICAgICAgICAgIE9LOiAzMi1iaXQgQ1JDIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGRhdGEKKyAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBjcmMzMih1bnNpZ25lZCBjaGFyICphZGRyZXNzLCB1bnNpZ25lZCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNyYyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoKKyAqICBGdW5jdGlvbjogY3JjMTYKKyAqICAgUHVycG9zZTogR2VuZXJhdGVzIGEgdGFibGUgZHJpdmVuIDE2LWJpdCBDUkMtQ0NJVFQgZm9yIGJ5dGUgZGF0YQorICoKKyAqICAgIFBhcmFtczoKKyAqICAgICAgIElucHV0OiBhZGRyZXNzICAgICBwb2ludGVyIHRvIHRoZSBieXRlIGRhdGEKKyAqICAgICAgICAgICAgICBzaXplICAgICAgICBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0byBiZSBwcm9jZXNzZWQKKyAqICAgICAgICAgICAgICBjcmMgICAgICAgICBpbml0aWFsIENSQyB2YWx1ZSB0byBiZSB1c2VkIChjYW4gYmUgdGhlIG91dHB1dAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gYSBwcmV2aW91cyBjYWxsIHRvIHRoaXMgZnVuY3Rpb24pLgorICoKKyAqICAgUmV0dXJuczoKKyAqICAgICAgICAgIE9LOiAxNi1iaXQgQ1JDIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGRhdGEKKyAqLworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGNyYzE2KHVuc2lnbmVkIGNoYXIgKmFkZHJlc3MsIHVuc2lnbmVkIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGNyYyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgLyogIWRlZmluZWQoYW5nZWxfY3JjX2gpICovCisKKy8qIEVPRiBjcmMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9kYmdfY29uZi5oIGIvZ2RiL3JkaS1zaGFyZS9kYmdfY29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNzk5NTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL2RiZ19jb25mLmgKQEAgLTAsMCArMSw1NCBAQAorLyogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgdXNlZCwgY29waWVkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzIHByZXNlcnZlZCBpbiBhbGwgY29waWVzIG9mIHRoZQorICogc29mdHdhcmUuCisgKi8KKworLyoKKyAqIEFSTSBzeW1ib2xpYyBkZWJ1Z2dlciB0b29sYm94OiBkYmdfY29uZi5oCisgKi8KKworLyoKKyAqIFJDUyAkUmV2aXNpb24kCisgKiBDaGVja2luICREYXRlJAorICovCisKKyNpZm5kZWYgRGJnX0NvbmZfX2gKKworI2RlZmluZSBEYmdfQ29uZl9faAorCit0eXBlZGVmIHN0cnVjdCBEYmdfQ29uZmlnQmxvY2sgeworICAgIGludCBieXRlc2V4OworICAgIGludCBmcGU7ICAgICAgICAgICAgICAgLyogVGFyZ2V0IHNob3VsZCBpbml0aWFsaXNlIEZQRSAqLworICAgIGxvbmcgbWVtb3J5c2l6ZTsKKyAgICB1bnNpZ25lZCBsb25nIGNwdV9zcGVlZDsvKiBDcHUgc3BlZWQgKEhaKSAqLworICAgIGludCBzZXJpYWxwb3J0OyAgICAgICAgLyopIHJlbW90ZSBjb25uZWN0aW9uIHBhcmFtZXRlcnMgKi8KKyAgICBpbnQgc2VyaWFsbGluZXNwZWVkOyAgIC8qKSAoc2VyaWFsIGNvbm5lY3Rpb24pICovCisgICAgaW50IHBhcmFsbGVscG9ydDsgICAgICAvKikgZGl0dG8gKi8KKyAgICBpbnQgcGFyYWxsZWxsaW5lc3BlZWQ7IC8qKSAocGFyYWxsZWwgY29ubmVjdGlvbikgKi8KKyAgICBjaGFyICpldGhlcm5ldHRhcmdldDsgIC8qIG5hbWUgb2YgcmVtb3RlIGV0aGVybmV0IHRhcmdldCAqLworICAgIGludCBwcm9jZXNzb3I7ICAgICAgICAgLyogcHJvY2Vzc29yIHRoZSBhcm11bGF0b3IgaXMgdG8gZW11bGF0ZSAoZWcgQVJNNjApICovCisgICAgaW50IHJkaXR5cGU7ICAgICAgICAgICAvKiBhcm11bGF0b3IgLyByZW1vdGUgcHJvY2Vzc29yICovCisgICAgaW50IGhlYXJ0YmVhdF9vbjsgIC8qIGFuZ2VsIGhlYXJ0YmVhdCAqLworICAgIGludCBkcml2ZXJ0eXBlOyAgICAgICAgLyogcGFyYWxsZWwgLyBzZXJpYWwgLyBldGMgKi8KKyAgICBjaGFyIGNvbnN0ICpjb25maWd0b2xvYWQ7CisgICAgY2hhciBjb25zdCAqbWVtY29uZmlndG9sb2FkOworICAgIGludCBmbGFnczsKK30gRGJnX0NvbmZpZ0Jsb2NrOworCisjZGVmaW5lIERiZ19Db25maWdGbGFnX1Jlc2V0IDEKKyNkZWZpbmUgRGJnX0NvbmZpZ0ZsYWdfTExTeW1zTmVlZFByZWZpeCAyCisKK3R5cGVkZWYgc3RydWN0IERiZ19Ib3N0b3NJbnRlcmZhY2UgRGJnX0hvc3Rvc0ludGVyZmFjZTsKKy8qIFRoaXMgc3RydWN0dXJlIGFsbG93cyBhY2Nlc3MgYnkgdGhlIChob3N0LWluZGVwZW5kZW50KSBDLWxpYnJhcnkgc3VwcG9ydAorICAgbW9kdWxlIG9mIGFybXVsYXRvciBvciBwaXNkIChhcm1vcy5jKSB0byBob3N0LWRlcGVuZGVudCBmdW5jdGlvbnMgZm9yCisgICB3aGljaCB0aGVyZSBpcyBubyBob3N0LWluZGVwZW5kZW50IGludGVyZmFjZS4gIEl0cyBjb250ZW50cyBhcmUgdW5rbm93bgorICAgdG8gdGhlIGRlYnVnZ2VyIHRvb2xib3guCisgICBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0LCBpbiBhIHdpbmRvd2VkIHN5c3RlbSwgZnB1dGMoc3RkZXJyKSBmb3IgZXhhbXBsZQorICAgbWF5IG5vdCBhY2hpZXZlIHRoZSBkZXNpcmVkIGVmZmVjdCBvZiB0aGUgY2hhcmFjdGVyIGFwcGVhcmluZyBpbiBzb21lCisgICB3aW5kb3cuCisgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvcmRpLXNoYXJlL2RiZ19jcC5oIGIvZ2RiL3JkaS1zaGFyZS9kYmdfY3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTc0ZjgzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9kYmdfY3AuaApAQCAtMCwwICsxLDYyIEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMTk5NSBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGZyZWVseSB1c2VkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaXMgcHJlc2VydmVkIGluIGFsbCBjb3BpZXMgb2YgdGhlCisgKiBzb2Z0d2FyZS4KKyAqLworCisvKgorICogQVJNIHN5bWJvbGljIGRlYnVnZ2VyIHRvb2xib3g6IGRiZ19jcC5oCisgKi8KKworLyoKKyAqIFJDUyAkUmV2aXNpb24kCisgKiBDaGVja2luICREYXRlJAorICovCisKKyNpZm5kZWYgRGJnX0NQX19oCisKKyNkZWZpbmUgRGJnX0NQX19oCisKKyNkZWZpbmUgRGJnX0FjY2Vzc19SZWFkYWJsZSAgMQorI2RlZmluZSBEYmdfQWNjZXNzX1dyaXRhYmxlICAyCisjZGVmaW5lIERiZ19BY2Nlc3NfQ1BEVCAgICAgIDQgLyogZWxzZSBDUFJUICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBzaG9ydCBybWluLCBybWF4OworICAgIC8qIGEgc2luZ2xlIGRlc2NyaXB0aW9uIGNhbiBiZSB1c2VkIGZvciBhIHJhbmdlIG9mIHJlZ2lzdGVycyB3aXRoCisgICAgICAgdGhlIHNhbWUgcHJvcGVydGllcyAqYWNjZXNzZWQgdmlhIENQRFQgaW5zdHJ1Y3Rpb25zKgorICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIgbmJ5dGVzOyAgIC8qIHNpemUgb2YgcmVnaXN0ZXIgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGFjY2VzczsgICAvKiBzZWUgYWJvdmUgKEFjY2Vzc194eHgpICovCisgICAgdW5pb24geworICAgICAgIHN0cnVjdCB7IC8qIENQRFQgaW5zdHJ1Y3Rpb25zIGRvIG5vdCBhbGxvdyB0aGUgY29wcm9jZXNzb3IgbXVjaCBmcmVlZG9tOgorICAgICAgICAgICAgICAgICAgIG9ubHkgYml0IDIyICgnTicpIGFuZCAxMi0xNSAoJ0NSZCcpIGFyZSBmcmVlIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICBjb3Byb2Nlc3NvciB0byB1c2UgYXMgaXQgc2VlcyBmaXQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBuYml0OworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcmRiaXRzOworICAgICAgICAgICAgICB9IGNwZHQ7CisgICAgICAgc3RydWN0IHsgLyogQ1BSVCBpbnN0cnVjdGlvbnMgaGF2ZSBtdWNoIG1vcmUgbGF0aXR1ZGUuICBUaGUgYml0cyBmaXhlZAorICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBBUk0gYXJlICAyNC4uMzEgKGNvbmRpdGlvbiBtYXNrICYgb3Bjb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCAoZGlyZWN0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4Li4xNSAoY3BudW0sIGFybSByZWdpc3RlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAoQ1BSVCBub3QgQ1BETykKKyAgICAgICAgICAgICAgICAgICBsZWF2aW5nIDE0IGJpdHMgZnJlZSB0byB0aGUgY29wcm9jZXNzb3IgKGZvcnR1bmF0ZWx5CisgICAgICAgICAgICAgICAgICAgZmFsbGluZyB3aXRoaW4gdHdvIGJ5dGVzKS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHJlYWRfYjAsIHJlYWRfYjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9iMCwgd3JpdGVfYjE7CisgICAgICAgICAgICAgIH0gY3BydDsKKyAgICB9IGFjY2Vzc2luc3Q7Cit9IERiZ19Db1Byb1JlZ0Rlc2M7CisKK3N0cnVjdCBEYmdfQ29Qcm9EZXNjIHsKKyAgICBpbnQgZW50cmllczsKKyAgICBEYmdfQ29Qcm9SZWdEZXNjIHJlZ2Rlc2NbMS8qIHJlYWxseSBuZW50cmllcyAqL107Cit9OworCisjZGVmaW5lIERiZ19Db1Byb0Rlc2NfU2l6ZShuKSAoc2l6ZW9mKHN0cnVjdCBEYmdfQ29Qcm9EZXNjKSArICgobiktMSkqc2l6ZW9mKERiZ19Db1Byb1JlZ0Rlc2MpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dkYi9yZGktc2hhcmUvZGJnX2hpZi5oIGIvZ2RiL3JkaS1zaGFyZS9kYmdfaGlmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJlMjE1NgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZGktc2hhcmUvZGJnX2hpZi5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qCisgKiBBUk0gZGVidWdnZXIgdG9vbGJveCA6IGRiZ19oaWYuYworICogRGVzY3JpcHRpb24gb2YgdGhlIERiZ19Ib3N0b3NJbnRlcmZhY2Ugc3RydWN0dXJlLiAgVGhpcyBpcyAqTk9UKgorICogcGFydCBvZiB0aGUgZGVidWdnZXIgdG9vbGJveCwgYnV0IGl0IGlzIHJlcXVpcmVkIGJ5IDIgYmFjayBlbmRzCisgKiAoYXJtdWwgJiBwaXNkKSBhbmQgdHdvIGZyb250IGVuZHMgKGFybXNkICYgd2RiZyksIHNvIHB1dHRpbmcgaXQKKyAqIGluIHRoZSB0b29sYm94IGlzIHRoZSBvbmx5IHdheSBvZiBhdm9pZGluZyBtdWx0aXBsZSBjb3BpZXMuCisgKi8KKworLyoKKyAqIFJDUyAkUmV2aXNpb24kCisgKiBDaGVja2luICREYXRlJAorICovCisKKyNpZm5kZWYgZGJnX2hpZl9faAorI2RlZmluZSBkYmdfaGlmX19oCisKKyNpZmRlZiBTVERDX0hFQURFUlMKKyMgIGluY2x1ZGUgPHN0ZGFyZy5oPgorI2Vsc2UKKyMgIGluY2x1ZGUgPHZhcmFyZ3MuaD4KKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgSGlmX0RiZ1ByaW50KHZvaWQgKmFyZywgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKTsKK3R5cGVkZWYgdm9pZCBIaWZfRGJnUGF1c2Uodm9pZCAqYXJnKTsKKwordHlwZWRlZiB2b2lkIEhpZl9Xcml0ZUModm9pZCAqYXJnLCBpbnQgYyk7Cit0eXBlZGVmIGludCBIaWZfUmVhZEModm9pZCAqYXJnKTsKK3R5cGVkZWYgaW50IEhpZl9Xcml0ZSh2b2lkICphcmcsIGNoYXIgY29uc3QgKmJ1ZmZlciwgaW50IGxlbik7Cit0eXBlZGVmIGNoYXIgKkhpZl9HZXRTKHZvaWQgKmFyZywgY2hhciAqYnVmZmVyLCBpbnQgbGVuKTsKKwordHlwZWRlZiB2b2lkIEhpZl9SRElSZXNldFByb2Modm9pZCAqYXJnKTsKKworc3RydWN0IERiZ19Ib3N0b3NJbnRlcmZhY2UgeworICAgIEhpZl9EYmdQcmludCAqZGJncHJpbnQ7CisgICAgSGlmX0RiZ1BhdXNlICpkYmdwYXVzZTsKKyAgICB2b2lkICpkYmdhcmc7CisKKyAgICBIaWZfV3JpdGVDICp3cml0ZWM7CisgICAgSGlmX1JlYWRDICpyZWFkYzsKKyAgICBIaWZfV3JpdGUgKndyaXRlOworICAgIEhpZl9HZXRTICpnZXRzOworICAgIHZvaWQgKmhvc3Rvc2FyZzsKKworICAgIEhpZl9SRElSZXNldFByb2MgKnJlc2V0OworICAgIHZvaWQgKnJlc2V0YXJnOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvcmRpLXNoYXJlL2RiZ19yZGkuaCBiL2dkYi9yZGktc2hhcmUvZGJnX3JkaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZGE3YmQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL2RiZ19yZGkuaApAQCAtMCwwICsxLDUxMSBAQAorLyogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgdXNlZCwgY29waWVkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzIHByZXNlcnZlZCBpbiBhbGwgY29waWVzIG9mIHRoZQorICogc29mdHdhcmUuCisgKi8KKworLyoKKyAqIEFSTSBkZWJ1Z2dlciB0b29sYm94IDogZGJnX3JkaS5oCisgKi8KKworLyoKKyAqIFJDUyAkUmV2aXNpb24kCisgKiBDaGVja2luICREYXRlJAorICovCisKKyNpZm5kZWYgZGJnX3JkaV9faAorI2RlZmluZSBkYmdfcmRpX19oCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyIFJESSB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBSRElTZXhfTGl0dGxlICAgICAgICAgICAwIC8qIHRoZSBieXRlIHNleCBvZiB0aGUgZGVidWdnZWUgICAgICAgKi8KKyNkZWZpbmUgUkRJU2V4X0JpZyAgICAgICAgICAgICAgMQorI2RlZmluZSBSRElTZXhfRG9udENhcmUgICAgICAgICAyCisKKyNkZWZpbmUgUkRJUG9pbnRfRVEgICAgICAgICAgICAgMCAvKiB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGJyZWFrL3dhdGNocG9pbnRzICovCisjZGVmaW5lIFJESVBvaW50X0dUICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkRJUG9pbnRfR0UgICAgICAgICAgICAgMgorI2RlZmluZSBSRElQb2ludF9MVCAgICAgICAgICAgICAzCisjZGVmaW5lIFJESVBvaW50X0xFICAgICAgICAgICAgIDQKKyNkZWZpbmUgUkRJUG9pbnRfSU4gICAgICAgICAgICAgNQorI2RlZmluZSBSRElQb2ludF9PVVQgICAgICAgICAgICA2CisjZGVmaW5lIFJESVBvaW50X01BU0sgICAgICAgICAgIDcKKworI2RlZmluZSBSRElQb2ludF8xNkJpdCAgICAgICAgICAxNiAgLyogMTYtYml0IGJyZWFrcG9pbnQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkRJUG9pbnRfQ29uZGl0aW9uYWwgICAgMzIKKworLyogT1JSZWQgd2l0aCBwb2ludCB0eXBlIGluIGV4dGVuZGVkIFJEUCBicmVhayBhbmQgd2F0Y2ggbWVzc2FnZXMgICAgICAgKi8KKyNkZWZpbmUgUkRJUG9pbnRfSW5xdWlyeSAgICAgICAgNjQKKyNkZWZpbmUgUkRJUG9pbnRfSGFuZGxlICAgICAgICAgMTI4IC8qIG1lc3NhZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgUkRJV2F0Y2hfQnl0ZVJlYWQgICAgICAgMSAvKiB0eXBlcyBvZiBkYXRhIGFjY2Vzc2VzIHRvIHdhdGNoIGZvciovCisjZGVmaW5lIFJESVdhdGNoX0hhbGZSZWFkICAgICAgIDIKKyNkZWZpbmUgUkRJV2F0Y2hfV29yZFJlYWQgICAgICAgNAorI2RlZmluZSBSRElXYXRjaF9CeXRlV3JpdGUgICAgICA4CisjZGVmaW5lIFJESVdhdGNoX0hhbGZXcml0ZSAgICAgIDE2CisjZGVmaW5lIFJESVdhdGNoX1dvcmRXcml0ZSAgICAgIDMyCisKKyNkZWZpbmUgUkRJUmVnX1IxNSAgICAgICAgICAgICAgKDFMIDw8IDE1KSAvKiBtYXNrIHZhbHVlcyBmb3IgQ1BVICAgICAgICovCisjZGVmaW5lIFJESVJlZ19QQyAgICAgICAgICAgICAgICgxTCA8PCAxNikKKyNkZWZpbmUgUkRJUmVnX0NQU1IgICAgICAgICAgICAgKDFMIDw8IDE3KQorI2RlZmluZSBSRElSZWdfU1BTUiAgICAgICAgICAgICAoMUwgPDwgMTgpCisjZGVmaW5lIFJESU51bUNQVVJlZ3MgICAgICAgICAgIDE5CisKKyNkZWZpbmUgUkRJTnVtQ1BSZWdzICAgICAgICAgICAgMTAgLyogY3VycmVudCBtYXhpbXVtICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgUkRJTW9kZV9DdXJyICAgICAgICAgICAgMjU1CisKKy8qIFJESV9JbmZvIHN1YmNvZGVzICovCisvKiByZHAgaW4gcGFyYW1ldGVycyBhcmUgYWxsIHByZWNlZGVkIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBpbiBieXRlID0gUkRQX0luZm8sIHdvcmQgPSBpbmZvIHN1YmNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBvdXQgcGFyYW1ldGVycyBhcmUgYWxsIHByZWNlZGVkIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIG91dCBieXRlID0gUkRQX1JldHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJESUluZm9fVGFyZ2V0ICAgICAgICAgIDAKKy8qIHJkaTogb3V0IEFSTXdvcmQgKnRhcmdldGZsYWdzLCBvdXQgQVJNd29yZCAqcHJvY2Vzc29yIGlkICAgICAgICAgICAgICovCisvKiByZHA6IGluIG5vbmUsIG91dCB3b3JkIHRhcmdldGZsYWdzLCB3b3JkIHByb2Nlc3NvcmlkLCBieXRlIHN0YXR1cyAgICAqLworLyogdGhlIGZvbGxvd2luZyBiaXRzIGFyZSBkZWZpbmVkIGluIHRhcmdldGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyMgIGRlZmluZSBSRElUYXJnZXRfTG9nU3BlZWQgICAgICAgICAgICAgICAgICAweDBmCisjICBkZWZpbmUgUkRJVGFyZ2V0X0hXICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCAgICAvKiBlbHNlIGVtdWxhdG9yICAqLworIyAgZGVmaW5lIFJESVRhcmdldF9BZ2VudE1heExldmVsICAgICAgICAgICAgIDB4ZTAKKyMgIGRlZmluZSBSRElUYXJnZXRfQWdlbnRMZXZlbFNoaWZ0ICAgICAgIDUKKyMgIGRlZmluZSBSRElUYXJnZXRfRGVidWdnZXJNaW5MZXZlbCAgICAgICAgIDB4NzAwCisjICBkZWZpbmUgUkRJVGFyZ2V0X0RlYnVnZ2VyTGV2ZWxTaGlmdCAgICA4CisjICBkZWZpbmUgUkRJVGFyZ2V0X0NhblJlbG9hZEFnZW50ICAgICAgICAgICAweDgwMAorIyAgZGVmaW5lIFJESVRhcmdldF9DYW5JbnF1aXJlTG9hZFNpemUgICAgICAweDEwMDAKKyMgIGRlZmluZSBSRElUYXJnZXRfVW5kZXJzdGFuZHNSRFBJbnRlcnJ1cHQgMHgyMDAwCisjICBkZWZpbmUgUkRJVGFyZ2V0X0NhblByb2ZpbGUgICAgICAgICAgICAgIDB4NDAwMAorIyAgZGVmaW5lIFJESVRhcmdldF9Db2RlMTYgICAgICAgICAgICAgICAgICAweDgwMDAKKyMgIGRlZmluZSBSRElUYXJnZXRfSGFzQ29tbXNDaGFubmVsICAgICAgICAweDEwMDAwCisKKyNkZWZpbmUgUkRJSW5mb19Qb2ludHMgICAgICAgICAgMQorLyogcmRpOiBvdXQgQVJNd29yZCAqcG9pbnRjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHJkcDogaW4gbm9uZSwgb3V0IHdvcmQgcG9pbnRjYXBhYmlsaXRpZXMsIGJ5dGUgc3RhdHVzICAgICAgICAgICAgICAgICovCisvKiB0aGUgZm9sbG93aW5nIGJpdHMgYXJlIGRlZmluZWQgaW4gcG9pbnRjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAqLworIyAgZGVmaW5lIFJESVBvaW50Q2FwYWJpbGl0eV9Db21wYXJpc29uICAgMQorIyAgZGVmaW5lIFJESVBvaW50Q2FwYWJpbGl0eV9SYW5nZSAgICAgICAgMgorLyogNCB0byAxMjggYXJlIFJESVdhdGNoX3h4e1JlYWQsV3JpdGV9IGxlZnQtc2hpZnRlZCBieSB0d28gKi8KKyMgIGRlZmluZSBSRElQb2ludENhcGFiaWxpdHlfTWFzayAgICAgICAgIDB4MTAwCisjICBkZWZpbmUgUkRJUG9pbnRDYXBhYmlsaXR5X1RocmVhZEJyZWFrICAweDIwMAorIyAgZGVmaW5lIFJESVBvaW50Q2FwYWJpbGl0eV9UaHJlYWRXYXRjaCAgMHg0MDAKKyMgIGRlZmluZSBSRElQb2ludENhcGFiaWxpdHlfQ29uZEJyZWFrICAgIDB4ODAwCisjICBkZWZpbmUgUkRJUG9pbnRDYXBhYmlsaXR5X1N0YXR1cyAgICAgICAweDEwMDAgLyogc3RhdHVzIGVucXVpcmllcyBhdmFpbGFibGUgKi8KKworI2RlZmluZSBSRElJbmZvX1N0ZXAgICAgICAgICAgICAyCisvKiByZGk6IG91dCBBUk13b3JkICpzdGVwY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiBub25lLCBvdXQgd29yZCBzdGVwY2FwYWJpbGl0aWVzLCBieXRlIHN0YXR1cyAgICAgICAgICAgICAgICAgKi8KKy8qIHRoZSBmb2xsb3dpbmcgYml0cyBhcmUgZGVmaW5lZCBpbiBzdGVwY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICovCisjICBkZWZpbmUgUkRJU3RlcF9NdWx0aXBsZSAgICAgIDEKKyMgIGRlZmluZSBSRElTdGVwX1BDQ2hhbmdlICAgICAgMgorIyAgZGVmaW5lIFJESVN0ZXBfU2luZ2xlICAgICAgICA0CisKKyNkZWZpbmUgUkRJSW5mb19NTVUgICAgICAgICAgICAgMworLyogcmRpOiBvdXQgQVJNd29yZCAqbW11aWRlbnRpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHJkcDogaW4gbm9uZSwgb3V0IHdvcmQgbW11aWRlbnRpdHksIGJ5dGUgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgUkRJSW5mb19Eb3duTG9hZCAgICAgICAgNAorLyogSW5xdWlyZXMgd2hldGhlciBjb25maWd1cmF0aW9uIGRvd25sb2FkIGFuZCBzZWxlY3Rpb24gaXMgYXZhaWxhYmxlLiAgKi8KKy8qIHJkcDogaW4gbm9uZSwgb3V0IGJ5dGUgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBObyBhcmd1bWVudCwgbm8gcmV0dXJuIHZhbHVlLiBzdGF0dXMgPT0gb2sgaWYgYXZhaWxhYmxlICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJESUluZm9fU2VtaUhvc3RpbmcgICAgIDUKKy8qIElucXVpcmVzIHdoZXRoZXIgUkRJU2VtaUhvc3RpbmdfKiBSRElfSW5mbyBjYWxscyBhcmUgYXZhaWxhYmxlLiAgICAgICovCisvKiByZHA6IGluIG5vbmUsIG91dCBieXRlIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTm8gYXJndW1lbnQsIG5vIHJldHVybiB2YWx1ZS4gc3RhdHVzID09IG9rIGlmIGF2YWlsYWJsZSAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBSRElJbmZvX0NvUHJvICAgICAgICAgICA2CisvKiBJbnF1aXJlcyB3aGV0aGVyIENvUHJvIFJESV9JbmZvIGNhbGxzIGFyZSBhdmFpbGFibGUuICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiBub25lLCBvdXQgYnl0ZSBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vIGFyZ3VtZW50LCBubyByZXR1cm4gdmFsdWUuIHN0YXR1cyA9PSBvayBpZiBhdmFpbGFibGUgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgUkRJSW5mb19JY2VicmVha2VyICAgICAgNworLyogSW5xdWlyZXMgd2hldGhlciBkZWJ1Z2dlZSBjb250cm9sbGVkIGJ5IEljZUJyZWFrZXIuICAgICAgICAgICAgICAgICAgKi8KKy8qIHJkcDogaW4gbm9uZSwgb3V0IGJ5dGUgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBObyBhcmd1bWVudCwgbm8gcmV0dXJuIHZhbHVlLiBzdGF0dXMgPT0gb2sgaWYgYXZhaWxhYmxlICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJESU1lbW9yeV9BY2Nlc3MgICAgICAgIDgKKy8qIHJkaTogb3V0IFJESV9NZW1BY2Nlc3NTdGF0cyAqcCwgaW4gQVJNd29yZCAqaGFuZGxlICAgICAgICAgICAgICAgICAgICovCisvKiByZHA6IGluIHdvcmQgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdXQgd29yZCBucmVhZHMsIHdvcmQgbndyaXRlcywgd29yZCBzcmVhZHMsIHdvcmQgc3dyaXRlcywgICAgICAgKi8KKy8qICAgICAgICAgIHdvcmQgbnMsIHdvcmQgcywgYnl0ZSBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEdldCBtZW1vcnkgYWNjZXNzIGluZm9ybWF0aW9uIGZvciBtZW1vcnkgYmxvY2sgd2l0aCBzcGVjaWZpZWQgaGFuZGxlICovCisKKyNkZWZpbmUgUkRJTWVtb3J5X01hcCAgICAgICAgICAgOQorLyogcmRpOiBpbiAgUkRJX01lbURlc2NyIG1kW25dLCBpbiBBUk13b3JkICpuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHJkcDogaW4gd29yZCBuLCBuICogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgd29yZCBoYW5kbGUsIHdvcmQgc3RhcnQsIHdvcmQgbGltaXQsICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgIGJ5dGUgd2lkdGgsIGJ5dGUgYWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICB3b3JkIE5yZWFkX25zLCB3b3JkIE53cml0ZV9ucywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgd29yZCBTcmVhZF9ucywgd29yZCBTd3JpdGVfbnN9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdXQgYnl0ZSBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFNldHMgbWVtb3J5IGNoYXJhY3RlcmlzdGljcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgUkRJU2V0X0NQVVNwZWVkICAgICAgICAgMTAKKy8qIHJkaTogaW4gIEFSTXdvcmQgKnNwZWVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiByZHA6IGluIHdvcmQgc3BlZWQsIG91dCBieXRlIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogU2V0cyBDUFUgc3BlZWQgKGluIG5zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBSRElSZWFkX0Nsb2NrICAgICAgICAgICAxMgorLyogcmRpOiBvdXQgQVJNd29yZCAqbnMsIG91dCBBUk13b3JkICpzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHJkcDogaW4gbm9uZSwgb3V0IHdvcmQgbnMsIHdvcmQgcywgYnl0ZSBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZWFkcyBzaW11bGF0ZWQgdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJESUluZm9fTWVtb3J5X1N0YXRzICAgIDEzCisvKiBJbnF1aXJlcyB3aGV0aGVyIFJESV9JbmZvIGNvZGVzIDgtMTAgYXJlIGF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiBub25lLCBvdXQgYnl0ZSBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vIGFyZ3VtZW50LCBubyByZXR1cm4gdmFsdWUuIHN0YXR1cyA9PSBvayBpZiBhdmFpbGFibGUgICAgICAgICAgICAgICovCisKKy8qIFRoZSBuZXh0IHR3byBhcmUgb25seSB0byBiZSB1c2VkIGlmIFJESUluZm9fRG93bkxvYWQgcmV0dXJuZWQgbm8gICAgICovCisvKiBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSRElDb25maWdfQ291bnQgICAgICAgICAxNAorLyogcmRpOiBvdXQgQVJNd29yZCAqY291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHJkcDogb3V0IGJ5dGUgc3RhdHVzLCB3b3JkIGNvdW50IChpZiBzdGF0dXMgPT0gT0spICAgICAgICAgICAgICAgICAgICovCisKKy8qIEluIGFkZGl0aW9uLCB0aGUgbmV4dCBvbmUgaXMgb25seSB0byBiZSB1c2VkIGlmIFJESUNvbmZpZ19Db3VudCAgICAgICovCisvKiByZXR1cm5lZCBubyBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZDMyIHZlcnNpb247IGNoYXIgbmFtZVszMl07IH0gUkRJX0NvbmZpZ0Rlc2M7CisjZGVmaW5lIFJESUNvbmZpZ19OdGggICAgICAgICAgIDE1CisvKiByZGk6IGluIEFSTXdvcmQgKm4sIG91dCBSRElfQ29uZmlnRGVzYyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiB3b3JkIG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3V0IHdvcmQgdmVyc2lvbiwgYnl0ZSBuYW1lbGVuLCBieXRlcyAqIGJ5dGVsZW4gbmFtZSwgICAgICAgICAgICovCisvKiAgICAgICAgICBieXRlIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBTZXQgYSBmcm9udC1lbmQgcG9sbGluZyBmdW5jdGlvbiB0byBiZSB1c2VkIGZyb20gd2l0aGluIGRyaXZlciBwb2xsICAqLworLyogbG9vcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgdm9pZCBSRElfUG9sbFByb2Modm9pZCAqKTsKK3R5cGVkZWYgc3RydWN0IHsgUkRJX1BvbGxQcm9jICpwOyB2b2lkICphcmc7IH0gUkRJX1BvbGxEZXNjOworI2RlZmluZSBSRElTZXRfUG9sbFByb2MgICAgICAgICAxNgorLyogcmRpOiBpbiBSRElfUG9sbERlc2MgY29uc3QgKmZyb20sIFJESV9Qb2xsRGVzYyAqdG8gICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaWYgZnJvbSBub24tTlVMTCwgc2V0cyB0aGUgcG9sbGluZyBmdW5jdGlvbiBmcm9tIGl0ICAgICAgICAgICAgICovCisvKiAgICAgIGlmIHRvIG5vbi1OVUxMLCByZXR1cm5zIHRoZSBwcmV2aW91cyBwb2xsaW5nIGZ1bmN0aW9uIHRvIGl0ICAgICAqLworLyogTm8gY29ycmVzcG9uZGluZyBSRFAgb3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogQ2FsbGVkIG9uIGRlYnVnZ2VyIHN0YXJ0dXAgdG8gc2VlIGlmIHRoZSB0YXJnZXQgaXMgcmVhZHkgdG8gZXhlY3V0ZSAgKi8KKyNkZWZpbmUgUkRJSW5mb19DYW5UYXJnZXRFeGVjdXRlIDIwCisvKiByZGk6IGluICB2b2lkCisgKiAgICAgIG91dCBieXRlIHN0YXR1cyAoUkRJRXJyb3JfTm9FcnJvciA9PiBZZXMsIE90aGVyd2lzZSBObykKKyAqLworCisvKiBDYWxsZWQgdG8gc2V0IHRoZSB0b3Agb2YgdGFyZ2V0IG1lbW9yeSBpbiBhbiBJQ0VtYW4yIHN5c3RlbQorICogVGhpcyBpcyB0aGVuIHVzZWQgYnkgSUNFbWFuIHRvIHRlbGwgdGhlIEMgTGlicmFyeSB2aWEgdGhlIElORk9IRUFQCisgKiBTV0kgd2hlcmUgdGhlIHN0YWNrIHNob3VsZCBzdGFydC4KKyAqIE5vdGUgdGhhdCBvbmx5IElDRW1hbjIgc3VwcG9ydHMgdGhpcyBjYWxsLiAgT3RoZXIgc3lzdGVtcyBlZy4KKyAqIERlbW9uLCBBbmdlbCwgd2lsbCBzaW1wbHkgcmV0dXJuIGFuIGVycm9yLCB3aGljaCBtZWFucyB0aGF0IHNldHRpbmcKKyAqIHRoZSB0b3Agb2YgbWVtb3J5IGluIHRoaXMgZmFzaGlvbiBpcyBub3Qgc3VwcG9ydGVkLgorICovCisjZGVmaW5lIFJESUluZm9fU2V0VG9wTWVtICAgICAgICAyMQorLyogcmRpOiBpbiAgd29yZCBtZW1fdG9wCisgKiAgICAgIG91dCBieXRlIHN0YXR1cyAoUkRJRXJyb3JfTm9FcnJvciA9PiBEb25lLCBPdGhlciA9PiBOb3Qgc3VwcG9ydGVkCisgKi8KKworLyogQ2FsbGVkIGJlZm9yZSBwZXJmb3JtaW5nIGEgbG9hZGFnZW50IHRvIGRldGVybWluZSB0aGUgZW5kaWFuZXNzIG9mCisgKiB0aGUgZGVidWcgYWdlbnQsIHNvIHRoYXQgaW1hZ2VzIG9mIHRoZSB3cm9uZyBieXRlc2V4IGNhbiBiZQorICogY29tcGxhaW5lZCBhYm91dAorICovCisjZGVmaW5lIFJESUluZm9fQWdlbnRFbmRpYW5lc3MgICAyMgorLyogcmRpOiBpbiB2b2lkCisgKiAgICAgIG91dCBieXRlIHN0YXR1cworICogICAgICBzdGF0dXMgc2hvdWxkIGJlIFJESUVycm9yX0xpdHRsZUVuZGlhbiBvciBSRElFcnJvcl9CaWdFbmRpYW4KKyAqICAgICAgYW55IG90aGVyIHZhbHVlIGluZGljYXRlcyB0aGUgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgdGhpcworICogICAgICByZXF1ZXN0LCBzbyB0aGUgZGVidWdnZXIgd2lsbCBoYXZlIHRvIG1ha2UgYSBiZXN0IGd1ZXNzLCB3aGljaAorICogICAgICBwcm9iYWJseSBtZWFucyBvbmx5IGFsbG93IGxpdHRsZSBlbmRpYW4gbG9hZGFnZW50aW5nLgorICovCisKKy8qIFRoZSBuZXh0IHR3byBhcmUgb25seSB0byBiZSB1c2VkIGlmIHRoZSB2YWx1ZSByZXR1cm5lZCBieSAgICAgICAgICAgICovCisvKiBSRElJbmZvX1BvaW50cyBoYXMgUkRJUG9pbnRDYXBhYmlsaXR5X1N0YXR1cyBzZXQuICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSRElQb2ludFN0YXR1c19XYXRjaCAgICAweDgwCisjZGVmaW5lIFJESVBvaW50U3RhdHVzX0JyZWFrICAgIDB4ODEKKy8qIHJkaTogaW5vdXQgQVJNd29yZCAqIChpbiBoYW5kbGUsIG91dCBod3Jlc291cmNlKSwgb3V0IEFSTXdvcmQgKnR5cGUgICovCisvKiByZHA6IGluIHdvcmQgaGFuZGxlLCBvdXQgd29yZCBod3Jlc291cmNlLCB3b3JkIHR5cGUsIGJ5dGUgc3RhdHVzICAgICAqLworCisjZGVmaW5lIFJESVNpZ25hbF9TdG9wICAgICAgICAgIDB4MTAwCisvKiBSZXF1ZXN0cyB0aGF0IHRoZSBkZWJ1Z2dlZSBzdG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTm8gYXJndW1lbnRzLCBubyByZXR1cm4gdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHJkcDogbm8gcmVwbHkgKHdoZW4gdGhlIGRlYnVnZ2VlIHN0b3BzLCB0aGVyZSB3aWxsIGJlIGEgcmVwbHkgdG8gdGhlICovCisvKiAgICAgIHN0ZXAgb3IgZXhlY3V0ZSByZXF1ZXN0IHdoaWNoIHN0YXJ0ZWQgaXQpICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJESVZlY3Rvcl9DYXRjaCAgICAgICAgIDB4MTgwCisvKiByZGk6IGluIEFSTXdvcmQgKmJpdG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbnQgd29yZCBiaXRtYXAsIG91dCBieXRlIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGJpdCBpIGluIGJpdG1hcCBzZXQgdG8gY2F1c2UgdmVjdG9yIGkgdG8gY2F1c2UgZW50cnkgdG8gZGVidWdnZXIgICAgICovCisKKy8qIFRoZSBuZXh0IGZvdXIgYXJlIG9ubHkgdG8gYmUgdXNlZCBpZiBSRElJbmZvX1NlbWlob3N0aW5nIHJldHVybmVkICAgICovCisvKiBubyBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSRElTZW1pSG9zdGluZ19TZXRTdGF0ZSAweDE4MQorLyogcmRpOiBpbiBBUk13b3JkICpzZW1paG9zdGluZ3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHJkcDogaW4gd29yZCBzZW1paG9zdGluZ3N0YXRlLCBvdXQgYnl0ZSBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJESVNlbWlIb3N0aW5nX0dldFN0YXRlIDB4MTgyCisvKiByZGk6IG91dCBBUk13b3JkICpzZW1paG9zdGluZ3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiBub25lLCBvdXQgd29yZCBzZW1paG9zdGluZ3N0YXRlLCBieXRlIHN0YXR1cyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkRJU2VtaUhvc3RpbmdfU2V0VmVjdG9yIDB4MTgzCisvKiByZGk6IGluIEFSTXdvcmQgKnNlbWlob3N0aW5ndmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiB3b3JkIHNlbWlob3N0aW5ndmVjdG9yLCBvdXQgYnl0ZSBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkRJU2VtaUhvc3RpbmdfR2V0VmVjdG9yIDB4MTg0CisvKiByZGk6IG91dCBBUk13b3JkICpzZW1paG9zdGluZ3ZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiBub25lLCBvdXQgd29yZCBzZW1paG9zdGluZ3ZlY3RvciwgYnl0ZSBzdGF0dXMgICAgICAgICAgICAgICAgKi8KKworLyogVGhlIG5leHQgdHdvIGFyZSBvbmx5IHRvIGJlIHVzZWQgaWYgUkRJSW5mb19JY2VicmVha2VyIHJldHVybmVkICAgICAgKi8KKy8qIG5vIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJESUljZWJyZWFrZXJfR2V0TG9ja3MgIDB4MTg1CisvKiByZGk6IG91dCBBUk13b3JkICpsb2NrZWRzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiBub25lLCBvdXQgd29yZCBsb2NrZWRzdGF0ZSwgYnl0ZSBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBSRElJY2VicmVha2VyX1NldExvY2tzICAweDE4NgorLyogcmRpOiBpbiBBUk13b3JkICpsb2NrZWRzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHJkcDogaW4gd29yZCBsb2NrZWRzdGF0ZSwgb3V0IGJ5dGUgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIGxvY2tlZHN0YXRlIGlzIGEgYml0bWFwIG9mIHRoZSBpY2VicmVha2VyIHJlZ2lzdGVycyBsb2NrZWQgYWdhaW5zdCAgICovCisvKiB1c2UgYnkgSWNlTWFuIChiZWNhdXNlIGV4cGxpY2l0bHkgd3JpdHRlbiBieSB0aGUgdXNlcikgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJESUluZm9fR2V0TG9hZFNpemUgICAgIDB4MTg3CisvKiByZGk6IG91dCBBUk13b3JkICptYXhsb2Fkc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiBub25lLCBvdXQgd29yZCBtYXhsb2Fkc2l6ZSwgYnl0ZSBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIElucXVpcmVzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBkYXRhIHRyYW5zZmVyIHRoZSBhZ2VudCBpcyBwcmVwYXJlZCAgICovCisvKiB0byByZWNlaXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT25seSB1c2FibGUgaWYgUkRJSW5mb19UYXJnZXQgcmV0dXJuZWQgUkRJVGFyZ2V0X0NhbklucXVpcmVMb2FkU2l6ZSAgKi8KKy8qIHJkaTogb3V0IEFSTXdvcmQgKnNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIE9ubHkgdG8gYmUgdXNlZCBpZiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgUkRJSW5mb19UYXJnZXQgaGFkICAgICAgICAgICovCisvKiBSRElUYXJnZXRfSGFzQ29tbXNDaGFubmVsIHNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwordHlwZWRlZiB2b2lkIFJESUNDUHJvY19Ub0hvc3Qodm9pZCAqYXJnLCBBUk13b3JkIGRhdGEpOwordHlwZWRlZiB2b2lkIFJESUNDUHJvY19Gcm9tSG9zdCh2b2lkICphcmcsIEFSTXdvcmQgKmRhdGEsIGludCAqdmFsaWQpOworCisjZGVmaW5lIFJESUNvbW1zQ2hhbm5lbF9Ub0hvc3QgIDB4MTg4CisvKiByZGk6IGluIFJESUNDUHJvY19Ub0hvc3QgKiwgaW4gdm9pZCAqYXJnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiBieXRlIGNvbm5lY3QsIG91dCBieXRlIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkRJQ29tbXNDaGFubmVsX0Zyb21Ib3N0IDB4MTg5CisvKiByZGk6IGluIFJESUNDUHJvY19Gcm9tSG9zdCAqLCBpbiB2b2lkICphcmcgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiBieXRlIGNvbm5lY3QsIG91dCBieXRlIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogVGhlc2UgNCBhcmUgb25seSB0byBiZSB1c2VkIGlmIFJESUluZm9fU2VtaWhvc3RpbmcgcmV0dXJucyBubyBlcnJvciAgKi8KKyNkZWZpbmUgUkRJU2VtaUhvc3RpbmdfU2V0QVJNU1dJIDB4MTkwCisvKiByZGk6IGluIEFSTXdvcmQgQVJNX1NXSV9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiBBUk13b3JkIEFSTV9TV0lfbnVtYmVyLCBvdXQgYnl0ZSBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBSRElTZW1pSG9zdGluZ19HZXRBUk1TV0kgMHgxOTEKKy8qIHJkaTogb3V0IEFSTXdvcmQgQVJNX1NXSV9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiByZHA6IG91dCBBUk13b3JkIEFSTV9TV0lfbnVtYmVyLCBieXRlIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJESVNlbWlIb3N0aW5nX1NldFRodW1iU1dJIDB4MTkyCisvKiByZGk6IGluIEFSTXdvcmQgVGh1bWJfU1dJX251bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiBBUk13b3JkIFRodW1iX1NXSV9udW1iZXIsIG91dCBieXRlIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBSRElTZW1pSG9zdGluZ19HZXRUaHVtYlNXSSAweDE5MworLyogcmRpOiBvdXQgQVJNd29yZCBBUk1fVGh1bWJfbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHJkcDogb3V0IEFSTXdvcmQgQVJNX1RodW1iX251bWJlciwgYnl0ZSBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICovCisKKworI2RlZmluZSBSRElDeWNsZXMgICAgICAgICAgICAgICAweDIwMAorLyogcmRpOiBvdXQgQVJNd29yZCBjeWNsZXNbMTJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHJkcDogaW4gbm9uZSwgb3V0IDYgd29yZHMgY3ljbGVzLCBieXRlIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiB0aGUgcmRpIHJlc3VsdCByZXByZXNlbnRzIDYgYmlnLWVuZGlhbiBkb3VibGV3b3JkczsgdGhlIHJkcCByZXN1bHRzICAqLworLyogcmV0dXJuIHZhbHVlcyBmb3IgdGhlIGxzIGhhbHZlcyBvZiB0aGVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyMgIGRlZmluZSBSRElDeWNsZXNfU2l6ZSAgICAgICAgNDgKKworI2RlZmluZSBSRElFcnJvclAgICAgICAgICAgICAgICAweDIwMQorLyogcmRpOiBvdXQgQVJNYWRkcmVzcyAqZXJyb3JwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHJkcDogaW4gbm9uZSwgb3V0IHdvcmQgZXJyb3JwLCBieXRlIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm5zIHRoZSBlcnJvciBwb2ludGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGFzdCByZXR1cm4gZnJvbSBzdGVwICAqLworLyogb3IgZXhlY3V0ZSB3aXRoIHN0YXR1cyBSRElFcnJvcl9FcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBSRElTZXRfQ21kbGluZSAgICAgICAgICAweDMwMAorLyogcmRpOiBpbiBjaGFyICpjb21tYW5kbGluZSAoYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nKSAgICAgICAgICAgICAgICAgKi8KKy8qIE5vIGNvcnJlc3BvbmRpbmcgUkRQIG9wZXJhdGlvbiAoY21kbGluZSBpcyBzZW50IHRvIHRoZSBhZ2VudCBpbiAgICAgICovCisvKiByZXNwb25zZSB0byBTV0lfR2V0RW52KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJESVNldF9SRElMZXZlbCAgICAgICAgIDB4MzAxCisvKiByZGk6IGluIEFSTXdvcmQgKmxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiB3b3JkIGxldmVsLCBvdXQgYnl0ZSBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFNldHMgdGhlIFJESS9SRFAgcHJvdG9jb2wgbGV2ZWwgdG8gYmUgdXNlZCAobXVzdCBsaWUgYmV0d2VlbiB0aGUgICAgICovCisvKiBsaW1pdHMgcmV0dXJuZWQgYnkgUkRJSW5mb19UYXJnZXQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJESVNldF9UaHJlYWQgICAgICAgICAgIDB4MzAyCisvKiByZGk6IGluIEFSTXdvcmQgKnRocmVhZGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiB3b3JkIHRocmVhZGhhbmRsZSwgb3V0IGJ5dGUgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFNldHMgdGhlIHRocmVhZCBjb250ZXh0IGZvciBzdWJzZXF1ZW50IHRocmVhZC1zZW5zaXRpdmUgb3BlcmF0aW9ucyAgICovCisvKiAobnVsbCB2YWx1ZSBzZXRzIG5vIHRocmVhZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBUaGUgbmV4dCB0d28gYXJlIG9ubHkgdG8gYmUgdXNlZCBpZiBSRElfcmVhZCBvciBSRElfd3JpdGUgcmV0dXJuZWQgICAqLworLyogUkRJRXJyb3JfTGl0dGxlRW5kaWFuIG9yIFJESUVycm9yX0JpZ0VuZGlhbiwgdG8gc2lnbmlmeSB0aGF0IHRoZSAgICAgKi8KKy8qIGRlYnVnZ2VyIGhhcyBub3RpY2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJESUluZm9fQWNrQnl0ZVNleCAgMHgzMDMKKy8qIHJkaTogaW4gQVJNd29yZCAqc2V4IChSRElTZXhfTGl0dGxlIG9yIFJESVNleF9CaWcpICAgICAgICAgICAgICAgICAgICovCisKKy8qIFRoZSBuZXh0IHR3byBhcmUgb25seSB0byBiZSB1c2VkIGlmIFJESUluZm9fQ29Qcm8gcmV0dXJuZWQgbm8gZXJyb3IgICovCisjZGVmaW5lIFJESUluZm9fRGVzY3JpYmVDb1BybyAgIDB4NDAwCisvKiByZGk6IGluIGludCAqY3BubywgRGJnX0NvUHJvRGVzYyAqY3BkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiBieXRlIGNwbm8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgY3BkLT5lbnRyaWVzICogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgYnl0ZSBybWluLCBieXRlIHJtYXgsIGJ5dGUgbmJ5dGVzLCBieXRlIGFjY2VzcywgICAgICAgICAgICAqLworLyogICAgICAgICAgIGJ5dGUgY3BydF9yX2IwLCBjcHJ0X3JfYjEsIGNwcnRfd19iMCwgY3BydF93X2IxfSAgICAgICAgICAgKi8KKy8qICAgICAgICAgYnl0ZSA9IDI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG91dCBieXRlIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJESUluZm9fUmVxdWVzdENvUHJvRGVzYyAweDQwMQorLyogcmRpOiBpbiBpbnQgKmNwbm8sIG91dCBEYmdfQ29Qcm9EZXNjICpjcGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHJwZDogaW4gYnl0ZSBjcG5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG91dCBuZW50cmllcyAqIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICBieXRlIHJtaW4sIGJ5dGUgcm1heCwgYnl0ZSBuYnl0ZXMsIGJ5dGUgYWNjZXNzLCAgICAgICAgICAgKi8KKy8qICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBieXRlID0gMjU1LCBieXRlIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJESUluZm9fTG9nICAgICAgICAgICAgIDB4ODAwCisvKiByZGk6IG91dCBBUk13b3JkICpsb2dzZXR0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTm8gY29ycmVzcG9uZGluZyBSRFAgb3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkRJSW5mb19TZXRMb2cgICAgICAgICAgMHg4MDEKKy8qIHJkaTogaW4gQVJNd29yZCAqbG9nc2V0dGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBObyBjb3JyZXNwb25kaW5nIFJEUCBvcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJESVByb2ZpbGVfU3RvcCAgICAgICAgIDB4NTAwCisvKiBObyBhcmd1bWVudHMsIG5vIHJldHVybiB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiBub25lLCBvdXQgYnl0ZSBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJlcXVlc3RzIHRoYXQgcGMgc2FtcGxpbmcgc3RvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgUkRJUHJvZmlsZV9TdGFydCAgICAgICAgMHg1MDEKKy8qIHJkaTogaW4gQVJNd29yZCAqaW50ZXJ2YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiByZHA6IGluIHdvcmQgaW50ZXJ2YWwsIG91dCBieXRlIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmVxdWVzdHMgdGhhdCBwYyBzYW1wbGluZyBzdGFydCwgd2l0aCBwZXJpb2QgPGludGVydmFsPiB1c2VjICAgICAgICAgKi8KKworI2RlZmluZSBSRElQcm9maWxlX1dyaXRlTWFwICAgICAweDUwMgorLyogcmRpOiBpbiBBUk13b3JkIG1hcFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIG1hcFswXSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSwgc3Vic2VxdWVudCBlbGVtZW50cyBhcmUgc29ydGVkICAgICovCisvKiBhbmQgYXJlIHRoZSBiYXNlIG9mIHJhbmdlcyBmb3IgcGMgc2FtcGxpbmcgKHNvIGlmIHRoZSBzYW1wbGVkIHBjICAgICAqLworLyogbGllcyBiZXR3ZWVuIG1hcFtpXSBhbmQgbWFwW2krMV0sIGNvdW50W2ldIGlzIGluY3JlbWVudGVkKS4gICAgICAgICAgKi8KKy8qIHJkcDogYSBudW1iZXIgb2YgbWVzc2FnZXMsIGVhY2ggb2YgZm9ybTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgaW4gd29yZCBsZW4sIHdvcmQgc2l6ZSwgd29yZCBvZmZzZXQsIDxzaXplPiB3b3JkcyBtYXAgZGF0YSAgICAqLworLyogICAgICAgIG91dCBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGxlbiwgc2l6ZSBhbmQgb2Zmc2V0IGFyZSBhbGwgd29yZCBjb3VudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgUkRJUHJvZmlsZV9SZWFkTWFwICAgICAgMHg1MDMKKy8qIHJkaTogaW4gQVJNd29yZCAqbGVuLCBvdXQgQVJNd29yZCBjb3VudHNbbGVuXSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXF1ZXN0cyB0aGF0IHRoZSBjb3VudHMgYXJyYXkgYmUgc2V0IHRvIHRoZSBhY2N1bXVsYXRlZCBwYyBzYW1wbGUgICAqLworLyogY291bnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHJkcDogYSBudW1iZXIgb2YgbWVzc2FnZXMsIGVhY2ggb2YgZm9ybTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgaW4gd29yZCBvZmZzZXQsIHdvcmQgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIG91dCA8c2l6ZT4gd29yZHMsIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGxlbiwgc2l6ZSBhbmQgb2Zmc2V0IGFyZSBhbGwgd29yZCBjb3VudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgUkRJUHJvZmlsZV9DbGVhckNvdW50cyAgMHg1MDQKKy8qIE5vIGFyZ3VtZW50cywgbm8gcmV0dXJuIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiByZHA6IGluIG5vbmUsIG91dCBieXRlIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmVxdWVzdHMgdGhhdCBwYyBzYW1wbGUgY291bnRzIGJlIHNldCB0byB6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBSRElJbmZvX1JlcXVlc3RSZXNldCAgICAweDkwMAorLyogUmVxdWVzdCByZXNldCBvZiB0aGUgdGFyZ2V0IGVudmlyb25tZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5vIGFyZ3VtZW50cywgbm8gcmV0dXJuIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBObyBSRFAgZXF1aXZhbGVudCwgc2VuZHMgYW4gUkRQIHJlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJESUluZm9fQ2FwYWJpbGl0eVJlcXVlc3QgMHg4MDAwCisvKiBSZXF1ZXN0IHdoZXRoZXIgdGhlIGludGVyZmFjZSBzdXBwb3J0cyB0aGUgbmFtZWQgY2FwYWJpbGl0eS4gVGhlICAgICAqLworLyogY2FwYWJpbGl0eSBpcyBzcGVjaWZpZWQgYnkgb3InaW5nIHRoZSBSRElJbmZvIG51bWJlciB3aXRoIHRoaXMsIGFuZCAgKi8KKy8qIHNlbmRpbmcgdGhhdCByZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiByZGk6IGluIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcmRwOiBpbiBub25lLCBvdXQgYnl0ZSBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBBUk13b3JkIGxlbjsKKyAgQVJNd29yZCBtYXBbMV07Cit9IFJESV9Qcm9maWxlTWFwOworCit0eXBlZGVmIHVuc2lnbmVkMzIgUG9pbnRIYW5kbGU7Cit0eXBlZGVmIHVuc2lnbmVkMzIgVGhyZWFkSGFuZGxlOworI2RlZmluZSBSRElOb1BvaW50SGFuZGxlICAgICAgICAoKFBvaW50SGFuZGxlKS0xTCkKKyNkZWZpbmUgUkRJTm9IYW5kbGUgICAgICAgICAgICAgKChUaHJlYWRIYW5kbGUpLTFMKQorCitzdHJ1Y3QgRGJnX0NvbmZpZ0Jsb2NrOworc3RydWN0IERiZ19Ib3N0b3NJbnRlcmZhY2U7CitzdHJ1Y3QgRGJnX01DU3RhdGU7Cit0eXBlZGVmIGludCByZGlfb3Blbl9wcm9jKHVuc2lnbmVkIHR5cGUsIHN0cnVjdCBEYmdfQ29uZmlnQmxvY2sgY29uc3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IERiZ19Ib3N0b3NJbnRlcmZhY2UgY29uc3QgKmksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBEYmdfTUNTdGF0ZSAqZGJnX3N0YXRlKTsKK3R5cGVkZWYgaW50IHJkaV9jbG9zZV9wcm9jKHZvaWQpOwordHlwZWRlZiBpbnQgcmRpX3JlYWRfcHJvYyhBUk13b3JkIHNvdXJjZSwgdm9pZCAqZGVzdCwgdW5zaWduZWQgKm5ieXRlcyk7Cit0eXBlZGVmIGludCByZGlfd3JpdGVfcHJvYyhjb25zdCB2b2lkICpzb3VyY2UsIEFSTXdvcmQgZGVzdCwgdW5zaWduZWQgKm5ieXRlcyk7Cit0eXBlZGVmIGludCByZGlfQ1BVcmVhZF9wcm9jKHVuc2lnbmVkIG1vZGUsIHVuc2lnbmVkMzIgbWFzaywgQVJNd29yZCAqc3RhdGUpOwordHlwZWRlZiBpbnQgcmRpX0NQVXdyaXRlX3Byb2ModW5zaWduZWQgbW9kZSwgdW5zaWduZWQzMiBtYXNrLCBBUk13b3JkIGNvbnN0ICpzdGF0ZSk7Cit0eXBlZGVmIGludCByZGlfQ1ByZWFkX3Byb2ModW5zaWduZWQgQ1BudW0sIHVuc2lnbmVkMzIgbWFzaywgQVJNd29yZCAqc3RhdGUpOwordHlwZWRlZiBpbnQgcmRpX0NQd3JpdGVfcHJvYyh1bnNpZ25lZCBDUG51bSwgdW5zaWduZWQzMiBtYXNrLCBBUk13b3JkIGNvbnN0ICpzdGF0ZSk7Cit0eXBlZGVmIGludCByZGlfc2V0YnJlYWtfcHJvYyhBUk13b3JkIGFkZHJlc3MsIHVuc2lnbmVkIHR5cGUsIEFSTXdvcmQgYm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludEhhbmRsZSAqaGFuZGxlKTsKK3R5cGVkZWYgaW50IHJkaV9jbGVhcmJyZWFrX3Byb2MoUG9pbnRIYW5kbGUgaGFuZGxlKTsKK3R5cGVkZWYgaW50IHJkaV9zZXR3YXRjaF9wcm9jKEFSTXdvcmQgYWRkcmVzcywgdW5zaWduZWQgdHlwZSwgdW5zaWduZWQgZGF0YXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk13b3JkIGJvdW5kLCBQb2ludEhhbmRsZSAqaGFuZGxlKTsKK3R5cGVkZWYgaW50IHJkaV9jbGVhcndhdGNoX3Byb2MoUG9pbnRIYW5kbGUgaGFuZGxlKTsKK3R5cGVkZWYgaW50IHJkaV9leGVjdXRlX3Byb2MoUG9pbnRIYW5kbGUgKmhhbmRsZSk7Cit0eXBlZGVmIGludCByZGlfc3RlcF9wcm9jKHVuc2lnbmVkIG5pbnN0ciwgUG9pbnRIYW5kbGUgKmhhbmRsZSk7Cit0eXBlZGVmIGludCByZGlfaW5mb19wcm9jKHVuc2lnbmVkIHR5cGUsIEFSTXdvcmQgKmFyZzEsIEFSTXdvcmQgKmFyZzIpOwordHlwZWRlZiBpbnQgcmRpX3BvaW50aW5xX3Byb2MoQVJNd29yZCAqYWRkcmVzcywgdW5zaWduZWQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGRhdGF0eXBlLCBBUk13b3JkICpib3VuZCk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgUkRJX0NvbmZpZ0NQVSwKKyAgICBSRElfQ29uZmlnU3lzdGVtCit9IFJESV9Db25maWdBc3BlY3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgUkRJX01hdGNoQW55LAorICAgIFJESV9NYXRjaEV4YWN0bHksCisgICAgUkRJX01hdGNoTm9FYXJsaWVyCit9IFJESV9Db25maWdNYXRjaFR5cGU7CisKK3R5cGVkZWYgaW50IHJkaV9hZGRjb25maWdfcHJvYyh1bnNpZ25lZDMyIG5ieXRlcyk7Cit0eXBlZGVmIGludCByZGlfbG9hZGNvbmZpZ2RhdGFfcHJvYyh1bnNpZ25lZDMyIG5ieXRlcywgY2hhciBjb25zdCAqZGF0YSk7Cit0eXBlZGVmIGludCByZGlfc2VsZWN0Y29uZmlnX3Byb2MoUkRJX0NvbmZpZ0FzcGVjdCBhc3BlY3QsIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRJX0NvbmZpZ01hdGNoVHlwZSBtYXRjaHR5cGUsIHVuc2lnbmVkIHZlcnNpb25yZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKnZlcnNpb25wKTsKKwordHlwZWRlZiBjaGFyICpnZXRidWZmZXJwcm9jKHZvaWQgKmdldGJhcmcsIHVuc2lnbmVkMzIgKnNpemVwKTsKK3R5cGVkZWYgaW50IHJkaV9sb2FkYWdlbnRwcm9jKEFSTXdvcmQgZGVzdCwgdW5zaWduZWQzMiBzaXplLCBnZXRidWZmZXJwcm9jICpnZXRiLCB2b2lkICpnZXRiYXJnKTsKK3R5cGVkZWYgaW50IHJkaV90YXJnZXRpc2RlYWQodm9pZCk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgaXRlbW1heDsKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgKm5hbWVzOworfSBSRElfTmFtZUxpc3Q7CisKK3R5cGVkZWYgUkRJX05hbWVMaXN0IGNvbnN0ICpyZGlfbmFtZWxpc3Rwcm9jKHZvaWQpOworCit0eXBlZGVmIGludCByZGlfZXJybWVzc3Byb2MoY2hhciAqYnVmLCBpbnQgYnVmbGVuLCBpbnQgZXJybnVtKTsKKworc3RydWN0IFJESVByb2NWZWMgeworICAgIGNoYXIgcmRpdHlwZW5hbWVbMTJdOworCisgICAgcmRpX29wZW5fcHJvYyAgICAgICAqb3BlbjsKKyAgICByZGlfY2xvc2VfcHJvYyAgICAgICpjbG9zZTsKKyAgICByZGlfcmVhZF9wcm9jICAgICAgICpyZWFkOworICAgIHJkaV93cml0ZV9wcm9jICAgICAgKndyaXRlOworICAgIHJkaV9DUFVyZWFkX3Byb2MgICAgKkNQVXJlYWQ7CisgICAgcmRpX0NQVXdyaXRlX3Byb2MgICAqQ1BVd3JpdGU7CisgICAgcmRpX0NQcmVhZF9wcm9jICAgICAqQ1ByZWFkOworICAgIHJkaV9DUHdyaXRlX3Byb2MgICAgKkNQd3JpdGU7CisgICAgcmRpX3NldGJyZWFrX3Byb2MgICAqc2V0YnJlYWs7CisgICAgcmRpX2NsZWFyYnJlYWtfcHJvYyAqY2xlYXJicmVhazsKKyAgICByZGlfc2V0d2F0Y2hfcHJvYyAgICpzZXR3YXRjaDsKKyAgICByZGlfY2xlYXJ3YXRjaF9wcm9jICpjbGVhcndhdGNoOworICAgIHJkaV9leGVjdXRlX3Byb2MgICAgKmV4ZWN1dGU7CisgICAgcmRpX3N0ZXBfcHJvYyAgICAgICAqc3RlcDsKKyAgICByZGlfaW5mb19wcm9jICAgICAgICppbmZvOworICAgIC8qIFYyIFJESSAqLworICAgIHJkaV9wb2ludGlucV9wcm9jICAgKnBvaW50aW5xdWlyeTsKKworICAgIC8qIFRoZXNlIHRocmVlIHVzZWFibGUgb25seSBpZiBSRElJbmZvX0Rvd25Mb2FkIHJldHVybnMgbm8gZXJyb3IgKi8KKyAgICByZGlfYWRkY29uZmlnX3Byb2MgICphZGRjb25maWc7CisgICAgcmRpX2xvYWRjb25maWdkYXRhX3Byb2MgKmxvYWRjb25maWdkYXRhOworICAgIHJkaV9zZWxlY3Rjb25maWdfcHJvYyAqc2VsZWN0Y29uZmlnOworCisgICAgcmRpX25hbWVsaXN0cHJvYyAgICAqZHJpdmVybmFtZXM7CisgICAgcmRpX25hbWVsaXN0cHJvYyAgICAqY3B1bmFtZXM7CisKKyAgICByZGlfZXJybWVzc3Byb2MgICAgICplcnJtZXNzOworCisgICAgLyogT25seSBpZiBSRElJbmZvX1RhcmdldCByZXR1cm5zIGEgdmFsdWUgd2l0aCBSRElUYXJnZXRfTG9hZEFnZW50IHNldCAqLworICAgIHJkaV9sb2FkYWdlbnRwcm9jICAgKmxvYWRhZ2VudDsKKyAgICByZGlfdGFyZ2V0aXNkZWFkICAgICp0YXJnZXRpc2RlYWQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2dkYi9yZGktc2hhcmUvZGV2Y2xudC5oIGIvZ2RiL3JkaS1zaGFyZS9kZXZjbG50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5MjBmNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZGktc2hhcmUvZGV2Y2xudC5oCkBAIC0wLDAgKzEsMjYwIEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMTk5NSBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGZyZWVseSB1c2VkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaXMgcHJlc2VydmVkIGluIGFsbCBjb3BpZXMgb2YgdGhlCisgKiBzb2Z0d2FyZS4KKyAqLworCisvKiAtKi1DLSotCisgKgorICogJFJldmlzaW9uJAorICogICAgICREYXRlJAorICoKKyAqCisgKiAgIFByb2plY3Q6IEFOR0VMCisgKgorICogICAgIFRpdGxlOiBQdWJsaWMgY2xpZW50IGludGVyZmFjZSB0byBkZXZpY2VzCisgKi8KKworI2lmbmRlZiBhbmdlbF9kZXZjbG50X2gKKyNkZWZpbmUgYW5nZWxfZGV2Y2xudF9oCisKKy8qCisgKiBUaGlzIGhlYWRlciBleHBvcnRzIHRoZSBwdWJsaWMgaW50ZXJmYWNlIHRvIEFuZ2VsLWNvbXBsaWFudCBkZXZpY2UKKyAqIGRyaXZlcnMuCisgKgorICogVGhleSBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBzb2xlbHkgYnkgQW5nZWwsIG5vdCBieSB0aGUgVXNlcgorICogQXBwbGljYXRpb24uICBTZWUgZGV2YXBwbC5oIGZvciB0aGUgVXNlciBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgdG8KKyAqIHRoZSBkZXZpY2UgZHJpdmVycy4KKyAqLworCisjaW5jbHVkZSAiZGV2aWNlcy5oIgorCisvKiBHZW5lcmFsIHB1cnBvc2UgY29uc3RhbnRzLCBtYWNyb3MsIGVudW1zLCB0eXBlZGVmcyAqLworCisvKgorICogcG9zc2libGUgY2hhbm5lbHMgYXQgZGV2aWNlIGxldmVsCisgKgorICogWFhYCisgKgorICogdGhlc2UgYXJlIHVzZWQgYXMgYXJyYXkgaW5kaWNlcywgc28gYmUgc3BlY2lmaWMgYWJvdXQgdGhlaXIgdmFsdWVzCisgKi8KK3R5cGVkZWYgZW51bSBEZXZDaGFuSUQgeworICBEQ19EQlVHID0gMCwgICAgICAgICAgICAgICAgICAvKiByZWxpYWJsZSBkZWJ1ZyBwYWNrZXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvbnRhaW5pbmcgU0RCRywgQ0xJQixVREJHLCBldGMuKSAqLworICBEQ19BUFBMID0gMSwgICAgICAgICAgICAgICAgICAvKiBhcHBsaWNhdGlvbiBwYWNrZXRzICovCisgIERDX05VTV9DSEFOTkVMUworfSBEZXZDaGFuSUQ7CisKKy8qIFB1YmxpY2FsbHktYWNjZXNzaWJsZSBnbG9iYWxzICovCisvKiBub25lICovCisKKy8qIFB1YmxpYyBmdW5jdGlvbnMgKi8KKworLyoKKyAqIEZ1bmN0aW9uOiBhbmdlbF9EZXZpY2VXcml0ZQorICogIFB1cnBvc2U6IFRoZSBtYWluIGVudHJ5IHBvaW50IGZvciBhc3luY2hyb25vdXMgd3JpdGVzIHRvIGEgZGV2aWNlLgorICoKKyAqICAgUGFyYW1zOgorICogICAgICAgICAgICAgIElucHV0OiBkZXZJRCAgICAgaW5kZXggb2YgdGhlIGRldmljZSB0byB3cml0ZSB0bworICogICAgICAgICAgICAgICAgICAgICBidWZmICAgICAgZGF0YSB0byB3cml0ZQorICogICAgICAgICAgICAgICAgICAgICBsZW5ndGggICAgaG93IG11Y2ggZGF0YSB0byB3cml0ZQorICogICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAgY2FsbGJhY2sgaGVyZSB3aGVuIHdyaXRlIGZpbmlzaGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZXJyb3IKKyAqICAgICAgICAgICAgICAgICAgICAgY2JfZGF0YSAgIGRhdGEgdG8gYmUgcGFzc2VkIHRvIGNhbGxiYWNrCisgKiAgICAgICAgICAgICAgICAgICAgIGNoYW5JRCAgICBkZXZpY2UgY2hhbm5lbCB0byB1c2UKKyAqICAgICAgICAgICAgIE91dHB1dDogLQorICogICAgICAgICAgICAgSW4vT3V0OiAtCisgKgorICogICAgICAgICAgICBSZXR1cm5zOiBERV9PS0FZICAgICB3cml0ZSByZXF1ZXN0IGlzIHVuZGVyd2F5ICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgREVfTk9fREVWICAgbm8gc3VjaCBkZXZpY2UgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgIERFX0JBRF9ERVYgIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGFuZ2VsIHdyaXRlcworICogICAgICAgICAgICAgICAgICAgICBERV9CQURfQ0hBTiBubyBzdWNoIGRldmljZSBjaGFubmVsICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgREVfQlVTWSAgICAgZGV2aWNlIGJ1c3kgd2l0aCBhbm90aGVyIHdyaXRlICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgIERFX0lOVkFMICAgIHNpbGx5IGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgIAorICoKKyAqICAgICAgUmVhZHMgZ2xvYmFsczogLQorICogICBNb2RpZmllcyBnbG9iYWxzOiAtCisgKgorICogT3RoZXIgc2lkZSBlZmZlY3RzOiAtCisgKgorICogQ29tbWVuY2UgYXN5bmNocm9ub3VzIHRyYW5zbWlzc2lvbiBvZiBhIGJ1ZmZlciBvbiBhIGRldmljZS4gIFRoZQorICogY2FsbGJhY2sgd2lsbCBvY2N1ciB3aGVuIHRoZSB3cml0ZSBjb21wbGV0ZXMgb3IgaWYgdGhlcmUgaXMgYW4KKyAqIGVycm9yLgorICoKKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgZm9yIGVhY2ggcGFja2V0IHRvIGJlIHNlbnQuCisgKi8KKworRGV2RXJyb3IgYW5nZWxfRGV2aWNlV3JpdGUoRGV2aWNlSUQgZGV2SUQsIHBfQnVmZmVyIGJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZW5ndGgsIERldldyaXRlX0NCX0ZuIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2JfZGF0YSwgRGV2Q2hhbklEIGNoYW5JRCk7CisKKworLyoKKyAqIEZ1bmN0aW9uOiBhbmdlbF9EZXZpY2VSZWdpc3RlclJlYWQKKyAqICBQdXJwb3NlOiBUaGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgYXN5bmNocm9ub3VzIHJlYWRzIGZyb20gYSBkZXZpY2UuCisgKgorICogICBQYXJhbXM6CisgKiAgICAgICAgICAgICAgSW5wdXQ6IGRldklEICAgICBpbmRleCBvZiB0aGUgZGV2aWNlIHRvIHJlYWQgZnJvbQorICogICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayAgY2FsbGJhY2sgaGVyZSB3aGVuIHJlYWQgZmluaXNoZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBlcnJvcgorICogICAgICAgICAgICAgICAgICAgICBjYl9kYXRhICAgZGF0YSB0byBiZSBwYXNzZWQgdG8gY2FsbGJhY2sKKyAqICAgICAgICAgICAgICAgICAgICAgZ2V0X2J1ZmYgIGNhbGxiYWNrIHRvIGJlIHVzZWQgdG8gYWNxdWlyZSBidWZmZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaW5jb21pbmcgcGFja2V0cworICogICAgICAgICAgICAgICAgICAgICBnZXRiX2RhdGEgZGF0YSB0byBiZSBwYXNzZWQgdG8gZ2V0X2J1ZmYKKyAqICAgICAgICAgICAgICAgICAgICAgY2hhbklEICAgIGRldmljZSBjaGFubmVsIHRvIHVzZQorICogICAgICAgICAgICAgT3V0cHV0OiAtCisgKiAgICAgICAgICAgICBJbi9PdXQ6IC0KKyAqCisgKiAgICAgICAgICAgIFJldHVybnM6IERFX09LQVkgICAgIHJlYWQgcmVxdWVzdCBpcyB1bmRlcndheSAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgIERFX05PX0RFViAgIG5vIHN1Y2ggZGV2aWNlICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICBERV9CQURfREVWICBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBhbmdlbCByZWFkcworICogICAgICAgICAgICAgICAgICAgICBERV9CQURfQ0hBTiBubyBzdWNoIGRldmljZSBjaGFubmVsICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgREVfQlVTWSAgICAgZGV2aWNlIGJ1c3kgd2l0aCBhbm90aGVyIHJlYWQgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgREVfSU5WQUwgICAgc2lsbHkgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgCisgKgorICogICAgICBSZWFkcyBnbG9iYWxzOiAtCisgKiAgIE1vZGlmaWVzIGdsb2JhbHM6IC0KKyAqCisgKiBPdGhlciBzaWRlIGVmZmVjdHM6IC0KKyAqCisgKiBSZWdpc3RlciBhc3luY2hyb25vdXMgcGFja2V0IHJlYWQgZnJvbSBhIGRldmljZS4gIFRoZSBjYWxsYmFjayB3aWxsCisgKiBvY2N1ciB3aGVuIHRoZSByZWFkIGNvbXBsZXRlcyBvciBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAqCisgKiBUaGlzIGlzIHBlcnNpc3RlbnQ6IHRoZSByZWFkIHJlbWFpbnMgcmVnaXN0ZXJlZCBmb3IgYWxsIGluY29taW5nCisgKiBwYWNrZXRzIG9uIHRoZSBkZXZpY2UgY2hhbm5lbC4KKyAqLworCitEZXZFcnJvciBhbmdlbF9EZXZpY2VSZWdpc3RlclJlYWQoRGV2aWNlSUQgZGV2SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2UmVhZF9DQl9GbiBjYWxsYmFjaywgdm9pZCAqY2JfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZHZXRCdWZmX0ZuIGdldF9idWZmLCB2b2lkICpnZXRiX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2Q2hhbklEIGNoYW5JRCk7CisKKworLyoKKyAqIEZ1bmN0aW9uOiBhbmdlbF9EZXZpY2VDb250cm9sCisgKiAgUHVycG9zZTogQ2FsbCBhIGNvbnRyb2wgZnVuY3Rpb24gZm9yIGEgZGV2aWNlCisgKgorICogICBQYXJhbXM6CisgKiAgICAgICAgICAgICAgSW5wdXQ6IGRldklEICAgICBpbmRleCBvZiB0aGUgZGV2aWNlIHRvIGNvbnRyb2wgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgb3AgICAgICAgIG9wZXJhdGlvbiB0byBwZXJmb3JtCisgKiAgICAgICAgICAgICAgICAgICAgIGFyZyAgICAgICBwYXJhbWV0ZXIgZGVwZW5kaW5nIG9uIG9wCisgKgorICogICAgICAgICAgICBSZXR1cm5zOiBERV9PS0FZICAgICBjb250cm9sIHJlcXVlc3QgaXMgdW5kZXJ3YXkgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICBERV9OT19ERVYgICBubyBzdWNoIGRldmljZSAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgREVfQkFEX09QICAgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgb3BlcmF0aW9uCisgKgorICogICAgICBSZWFkcyBnbG9iYWxzOiAtCisgKiAgIE1vZGlmaWVzIGdsb2JhbHM6IC0KKyAqCisgKiBPdGhlciBzaWRlIGVmZmVjdHM6IC0KKyAqCisgKiBIYXZlIGEgZGV2aWNlIHBlcmZvcm0gYSBjb250cm9sIG9wZXJhdGlvbi4gIEV4dHJhIHBhcmFtZXRlcnMgdmFyeSAKKyAqIGFjY29yZGluZyB0byB0aGUgb3BlcmF0aW9uIHJlcXVlc3RlZC4KKyAqLworCitEZXZFcnJvciBhbmdlbF9EZXZpY2VDb250cm9sKERldmljZUlEIGRldklELCBEZXZpY2VDb250cm9sIG9wLCB2b2lkICphcmcpOworCisKKy8qCisgKiBGdW5jdGlvbjogYW5nZWxfUmVjZWl2ZU1vZGUKKyAqICBQdXJwb3NlOiBlbmFibGUgb3IgZGlzYWJsZSByZWNlcHRpb24gYWNyb3NzIGFsbCBkZXZpY2VzCisgKgorICogICBQYXJhbXM6CisgKiAgICAgICAgICAgICAgSW5wdXQ6IG1vZGUgICBjaG9vc2UgZW5hYmxlIG9yIGRpc2FibGUKKyAqCisgKiBQYXNzIHRoZSBtb2RlIHBhcmFtZXRlciB0byB0aGUgcmVjZWl2ZV9tb2RlIGNvbnRyb2wgbWV0aG9kIG9mIGVhY2ggZGV2aWNlCisgKi8KKwordm9pZCBhbmdlbF9SZWNlaXZlTW9kZShEZXZSZWN2TW9kZSBtb2RlKTsKKworCisvKgorICogRnVuY3Rpb246IGFuZ2VsX1Jlc2V0RGV2aWNlcworICogIFB1cnBvc2U6IHJlc2V0IGFsbCBkZXZpY2VzCisgKgorICogICBQYXJhbXM6IG5vbmUKKyAqCisgKiBDYWxsIHRoZSByZXNldCBjb250cm9sIG1ldGhvZCBmb3IgZWFjaCBkZXZpY2UKKyAqLworCit2b2lkIGFuZ2VsX1Jlc2V0RGV2aWNlcyh2b2lkKTsKKworCisvKgorICogRnVuY3Rpb246IGFuZ2VsX0luaXRpYWxpc2VEZXZpY2VzCisgKiAgUHVycG9zZTogaW5pdGlhbGlzZSB0aGUgZGV2aWNlIGRyaXZlciBsYXllcgorICoKKyAqICAgUGFyYW1zOiBub25lCisgKgorICogU2V0IHVwIHRoZSBkZXZpY2UgZHJpdmVyIGxheWVyIGFuZCBjYWxsIHRoZSBpbml0IG1ldGhvZCBmb3IgZWFjaCBkZXZpY2UKKyAqLworCit2b2lkIGFuZ2VsX0luaXRpYWxpc2VEZXZpY2VzKHZvaWQpOworCisKKy8qCisgKiBGdW5jdGlvbjogYW5nZWxfSXNBbmdlbERldmljZQorICogIFB1cnBvc2U6IEZpbmQgb3V0IGlmIGEgZGV2aWNlIHN1cHBvcnRzIEFuZ2VsIHBhY2tldHMKKyAqCisgKiAgIFBhcmFtczoKKyAqICAgICAgICAgICAgICBJbnB1dDogZGV2SUQgICAgIGluZGV4IG9mIHRoZSBkZXZpY2UgdG8gY29udHJvbCB0bworICoKKyAqICAgICAgICAgICAgUmV0dXJuczogVFJVRSAgICAgIHN1cHBvcnRzIEFuZ2VsIHBhY2tldHMKKyAqICAgICAgICAgICAgICAgICAgICAgRkFMU0UgICAgIHJhdyBkZXZpY2UKKyAqCisgKiAgICAgIFJlYWRzIGdsb2JhbHM6IC0KKyAqICAgTW9kaWZpZXMgZ2xvYmFsczogLQorICoKKyAqIE90aGVyIHNpZGUgZWZmZWN0czogLQorICovCisKK2Jvb2wgYW5nZWxfSXNBbmdlbERldmljZShEZXZpY2VJRCBkZXZJRCk7CisKKworI2lmICFkZWZpbmVkKE1JTklNQUxfQU5HRUwpIHx8IE1JTklNQUxfQU5HRUwgPT0gMAorCisvKgorICogRnVuY3Rpb246IGFuZ2VsX0FwcGxEZXZpY2VIYW5kbGVyCisgKiAgUHVycG9zZTogVGhlIGVudHJ5IHBvaW50IGZvciBVc2VyIEFwcGxpY2F0aW9uIERldmljZSBEcml2ZXIgcmVxdWVzdHMKKyAqICAgICAgICAgICBpbiBhIGZ1bGwgZnVuY3RpaW9uYWxpdHkgdmVyc2lvbiBvZiBBbmdlbC4KKyAqICAgICAgICAgICBJdCB3aWxsIG5ldmVyIGJlIGNhbGxlZCBkaXJlY3RseSBieSB0aGUgVXNlciBBcHBsaWNhdGlvbiwKKyAqICAgICAgICAgICBidXQgZ2V0cyBjYWxsZWQgaW5kaXJlY3RseSwgdmlhIHRoZSBTV0kgaGFuZGxlci4KKyAqCisgKiAgUGFyYW1zOgorICogICAgICBJbnB1dDogc3dpX3IwICAgIEFyZ3VtZW50IHRvIFNXSSBpbmRpY2F0aW5nIHRoYXQgCisgKiAgICAgICAgICAgICAgICAgICAgICAgYW5nZWxfQXBwbERldmljZUhhbmRsZXIgd2FzIHRvIGJlIGNhbGxlZC4gIFRoaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICB3aWxsIG5vdCBiZSB1c2VkIGluIHRoaXMgZnVuY3Rpb24sIGJ1dCBpcyBuZWVkZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgU1dJIGhhbmRsZXIuCisgKiAgICAgICAgICAgICBhcmdfYmxrICAgcG9pbnRlciB0byBibG9jayBvZiBhcmd1bWVudHMKKyAqICAgICAgICAgICAgICAgICAgICAgICBhcmdfYmxrWzBdIGlzIG9uZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgIGFuZ2VsX1NXSXJlYXNvbl9BcHBsRGV2aWNlX3tSZWFkLFdyaXRlLFlpZWxkfQorICogICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGluZGljYXRlcyB3aGljaCBhbmdlbF9EZXZpY2UqIGZuIGlzIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FsbGVkLiAgYXJnX2Jsa1sxXSAtIGFyZ19ibGtbbl0gYXJlIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cyB0byB0aGUgY29ycmVzcG9uZGluZworICogICAgICAgICAgICAgICAgICAgICAgIGFuZ2VsX0FwcGxEZXZpY2UqIGZ1bmN0aW9uLgorICogICAgICAgICAgICAgT3V0cHV0OiAtCisgKiAgICAgICAgICAgICBJbi9PdXQ6IC0KKyAqCisgKiAgICAgICAgICAgIFJldHVybnM6ICAgd2hhdGV2ZXIgdGhlIHNwZWNpZmllZCBhbmdlbF9EZXZpY2UqIGZ1bmN0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucy4KKyAqCisgKiAgICAgIFJlYWRzIGdsb2JhbHM6IC0KKyAqICAgTW9kaWZpZXMgZ2xvYmFsczogLQorICoKKyAqIE90aGVyIHNpZGUgZWZmZWN0czogLQorICoKKyAqIFRoaXMgaGFzIHRoZSBzaWRlIGVmZmVjdHMgb2YgYW5nZWxfRGV2aWNle1JlYWQsV3JpdGUsWWllbGR9CisgKiBkZXBlbmRpbmcgdXBvbiB3aGljaCBpcyBvcGVyYXRpb24gaXMgc3BlY2lmaWVkIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqLworCitEZXZFcnJvciBhbmdlbF9BcHBsRGV2aWNlSGFuZGxlcigKKyAgdW5zaWduZWQgc3dpX3IwLCB1bnNpZ25lZCAqYXJnX2JsaworKTsKKworI2VuZGlmIC8qIG5kZWYgTUlOSU1BTF9BTkdFTCAqLworCisjZW5kaWYgLyogbmRlZiBhbmdlbF9kZXZjbG50X2ggKi8KKworLyogRU9GIGRldmNsbnQuaCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9kZXZpY2VzLmggYi9nZGIvcmRpLXNoYXJlL2RldmljZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWM2ZWUyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9kZXZpY2VzLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qIC0qLUMtKi0KKyAqCisgKiAkUmV2aXNpb24kCisgKiAgICAgJERhdGUkCisgKgorICoKKyAqICAgUHJvamVjdDogQU5HRUwKKyAqCisgKiAgICAgVGl0bGU6IERldmljZXMgaGVhZGVyIGZpbGUKKyAqLworCisjaWZuZGVmIGFuZ2VsX2RldmljZXNfaAorI2RlZmluZSBhbmdlbF9kZXZpY2VzX2gKKworLyoKKyAqIFByb3ZpZGVzIGNvbW1vbiB0eXBlcyBmb3IgdXNpbmcgZGV2aWNlcywgYW5kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUKKyAqIGRldmljZSB0YWJsZS4KKyAqLworCisjaW5jbHVkZSAiYW5nZWwuaCIKKyNpbmNsdWRlICJidWZmZXJzLmgiCisKKy8qIEdlbmVyYWwgcHVycG9zZSBjb25zdGFudHMsIG1hY3JvcywgZW51bXMsIHR5cGVkZWZzICovCisKKy8qIGEgbm9uLWVudW0gaG9sZGVyIGZvciBkZXZpY2UgSURzICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBEZXZpY2VJRDsKKworLyogZGV2aWNlIGVycm9yIGNvZGVzICovCit0eXBlZGVmIGVudW0gRGV2RXJyb3IgeworICBERV9PS0FZLCAgICAgLyogbm8gZXJyb3IgKi8KKyAgREVfTk9fREVWLCAgIC8qIG5vIHN1Y2ggZGV2aWNlICovCisgIERFX0JBRF9ERVYsICAvKiBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBhbmdlbCAqLworICBERV9CQURfQ0hBTiwgLyogbm8gc3VjaCBkZXZpY2UgY2hhbm5lbCAqLworICBERV9CQURfT1AsICAgLyogb3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UgKi8KKyAgREVfQlVTWSwgICAgIC8qIGRldmljZSBhbHJlYWR5IGJ1c3kgKi8KKyAgREVfSU5WQUwsICAgIC8qIGxlbmd0aCBpbnZhbGlkICovCisgIERFX0ZBSUxFRCAgICAvKiBzb21ldGhpbmcgZWxzZSB3ZW50IHdyb25nICovCit9IERldkVycm9yOworCisvKiByZXR1cm4gY29kZXMgZnJvbSBhc3luY2hyb25vdXMgY2FsbHMgLSBwcmltYXJpbHkgZm9yIGNoYW5uZWxzJyBiZW5lZml0ICovCit0eXBlZGVmIGVudW0gRGV2U3RhdHVzIHsKKyAgRFNfRE9ORSwgICAgICAgICAgICAgICAgICAgICAgLyogb3BlcmF0aW9uIHN1Y2NlZWRlZCAqLworICBEU19PVkVSRkxPVywgICAgICAgICAgICAgICAgICAvKiBub3QgZW5vdWdoIGJ1ZmZlciBzcGFjZSAqLworICBEU19CQURfUEFDS0VULCAgICAgICAgICAgICAgICAvKiBwYWNrZXQgZmFpbGVkICovCisgIERTX0RFVl9FUlJPUiwgICAgICAgICAgICAgICAgIC8qIGRldmljZSBlcnJvciAqLworICBEU19JTlRfRVJST1IgICAgICAgICAgICAgICAgICAvKiBpbnRlcm5hbCBlcnJvciAqLworfSBEZXZTdGF0dXM7CisKKy8qIENhbGxiYWNrIGZvciBhc3luYy4gd3JpdGVzICovCit0eXBlZGVmIHZvaWQgKCpEZXZXcml0ZV9DQl9GbikoCisgICAgdm9pZCAqYnVmZiwgICAgIC8qIHBvaW50ZXIgdG8gZGF0YSAtLSBjYXN0IHRvIHBfQnVmZmVyICAqLworICAgIHZvaWQgKmxlbmd0aCwgICAvKiBob3cgbXVjaCBkb25lICAgLS0gY2FzdCB0byB1bnNpZ25lZCAgKi8KKyAgICB2b2lkICpzdGF0dXMsICAgLyogc3VjY2VzcyBjb2RlICAgIC0tIGNhc3QgdG8gRGV2U3RhdHVzICovCisgICAgdm9pZCAqY2JfZGF0YSAgIC8qIGFzIHN1cHBsaWVkICovCisgICAgKTsKKworLyogQ2FsbGJhY2sgZm9yIGFzeW5jLiByZWFkcyAqLwordHlwZWRlZiB2b2lkICgqRGV2UmVhZF9DQl9GbikoCisgICAgdm9pZCAqYnVmZiwgICAgIC8qIHBvaW50ZXIgdG8gZGF0YSAtLSBjYXN0IHRvIHBfQnVmZmVyICAqLworICAgIHZvaWQgKmxlbmd0aCwgICAvKiBob3cgbXVjaCByZWFkICAgLS0gY2FzdCB0byB1bnNpZ25lZCAgKi8KKyAgICB2b2lkICpzdGF0dXMsICAgLyogc3VjY2VzcyBjb2RlICAgIC0tIGNhc3QgdG8gRGV2U3RhdHVzICovCisgICAgdm9pZCAqY2JfZGF0YSAgIC8qIGFzIHN1cHBsaWVkICovCisgICAgKTsKKworLyogY29udHJvbCBvcGVyYXRpb25zICovCit0eXBlZGVmIGVudW0gRGV2aWNlQ29udHJvbCB7CisgIERDX0lOSVQsICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpc2UgZGV2aWNlICAgICAgICAgICAgICovCisgIERDX1JFU0VULCAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2V0IGRldmljZSAgICAgICAgICAgICAgICAgICovCisgIERDX1JFQ0VJVkVfTU9ERSwgICAgICAgICAgICAgIC8qIGNvbnRyb2wgcmVjZXB0aW9uICAgICAgICAgICAgICovCisgIERDX1NFVF9QQVJBTVMsICAgICAgICAgICAgICAgIC8qIHNldCBwYXJhbWV0ZXJzIG9mIGRldmljZSAgICAgICovCisjaWZuZGVmIFRBUkdFVAorICBEQ19HRVRfVVNFUl9QQVJBTVMsICAgICAgICAgICAvKiBwYXJhbXMgc2V0IGJ5IHVzZXIgYXQgb3BlbiAgICAqLworICBEQ19HRVRfREVGQVVMVF9QQVJBTVMsICAgICAgICAvKiBkZXZpY2UgZGVmYXVsdCBwYXJhbWV0ZXJzICAgICAqLworICBEQ19SRVNZTkMsICAgICAgICAgICAgICAgICAgICAvKiByZXN5bmNocm9uaXNlIHdpdGggbmV3IGFnZW50ICAqLworI2VuZGlmCisgIERDX1BSSVZBVEUgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IG9mIHByaXZhdGUgZGV2aWNlIGNvZGVzICovCit9IERldmljZUNvbnRyb2w7CisKK3R5cGVkZWYgZW51bSBEZXZSZWN2TW9kZSB7CisgIERSX0RJU0FCTEUsCisgIERSX0VOQUJMRQorfSBEZXZSZWN2TW9kZTsKKworLyoKKyAqIGNhbGxiYWNrIHRvIGFsbG93IGEgZGV2aWNlIGRyaXZlciB0byByZXF1ZXN0IGEgYnVmZmVyLCB0byBiZSBmaWxsZWQKKyAqIHdpdGggYW4gaW5jb21pbmcgcGFja2V0CisgKi8KK3R5cGVkZWYgcF9CdWZmZXIgKCpEZXZHZXRCdWZmX0ZuKSh1bnNpZ25lZCByZXFfc2l6ZSwgdm9pZCAqY2JfZGF0YSk7CisKKworLyogUHVibGljYWxseS1hY2Nlc3NpYmxlIGdsb2JhbHMgKi8KKy8qIG5vbmUgKi8KKworI2VuZGlmIC8qIG5kZWYgYW5nZWxfZGV2aWNlc19oICovCisKKy8qIEVPRiBkZXZpY2VzLmggKi8KZGlmZiAtLWdpdCBhL2dkYi9yZGktc2hhcmUvZGV2c3cuYyBiL2dkYi9yZGktc2hhcmUvZGV2c3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmExNDJiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9kZXZzdy5jCkBAIC0wLDAgKzEsNDA0IEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMTk5NSBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGZyZWVseSB1c2VkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaXMgcHJlc2VydmVkIGluIGFsbCBjb3BpZXMgb2YgdGhlCisgKiBzb2Z0d2FyZS4KKyAqLworCisvKiAtKi1DLSotCisgKgorICogJFJldmlzaW9uJAorICogICAgICREYXRlJAorICoKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJhZHAuaCIKKyNpbmNsdWRlICJoc3lzLmgiCisjaW5jbHVkZSAicnh0eC5oIgorI2luY2x1ZGUgImRyaXZlcnMuaCIKKyNpbmNsdWRlICJidWZmZXJzLmgiCisjaW5jbHVkZSAiZGV2Y2xudC5oIgorI2luY2x1ZGUgImFkcGVyci5oIgorI2luY2x1ZGUgImRldnN3LmgiCisjaW5jbHVkZSAiaG9zdGNoYW4uaCIKKyNpbmNsdWRlICJsb2dnaW5nLmgiCisKKy8qCisgKiBUT0RPOiB0aGlzIHNob3VsZCBiZSBhZGp1c3RhYmxlIC0gaXQgY291bGQgYmUgZG9uZSBieSBkZWZpbmluZworICogICAgICAgYSByZWFzb24gY29kZSBmb3IgRGV2U1dfSW9jdGwuICBJdCBjb3VsZCBldmVuIGJlIGEKKyAqICAgICAgIHBlci1kZXZpY2VjaGFubmVsIHBhcmFtZXRlci4KKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhbGxvY3NpemUgPSBBRFBfQlVGRkVSX01JTl9TSVpFOworCisjZGVmaW5lIGlsbGVnYWxEZXZDaGFuSUQodHlwZSkgICgodHlwZSkgPj0gRENfTlVNX0NIQU5ORUxTKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICBGdW5jdGlvbjogaW5pdGlhbGlzZV9yZWFkCisgKiAgIFB1cnBvc2U6IFNldCB1cCBhIHJlYWQgcmVxdWVzdCBmb3IgYW5vdGhlciBwYWNrZXQKKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgIEluL091dDogZHMgICAgICBTdGF0ZSBzdHJ1Y3R1cmUgdG8gYmUgaW5pdGlhbGlzZWQKKyAqCisgKiAgIFJldHVybnM6CisgKiAgICAgICAgICBPSzogMAorICogICAgICAgRXJyb3I6IC0xCisgKi8KK3N0YXRpYyBpbnQgaW5pdGlhbGlzZV9yZWFkKERldlNXU3RhdGUgKmRzKQoreworICAgIHN0cnVjdCBkYXRhX3BhY2tldCAqZHA7CisKKyAgICAvKgorICAgICAqIHRyeSB0byBjbGFpbSB0aGUgc3RydWN0dXJlIHRoYXQgd2lsbAorICAgICAqIGV2ZW50dWFsbHkgaG9sZCB0aGUgbmV3IHBhY2tldC4KKyAgICAgKi8KKyAgICBpZiAoKGRzLT5kc19uZXh0cmVhZHBhY2tldCA9IERldlNXX0FsbG9jYXRlUGFja2V0KGFsbG9jc2l6ZSkpID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qCisgICAgICogQ2FsbHMgaW50byB0aGUgZGV2aWNlIGRyaXZlciB1c2UgdGhlIERyaXZlckNhbGwgc3RydWN0dXJlOiB1c2UKKyAgICAgKiB0aGUgYnVmZmVyIHdlIGhhdmUganVzdCBhbGxvY2F0ZWQsIGFuZCBkZWNsYXJlIGl0cyBzaXplLiAgV2UKKyAgICAgKiBhcmUgYWxzbyBvYmxpZ2VkIHRvIGNsZWFyIHRoZSBkcml2ZXIncyBjb250ZXh0IHBvaW50ZXIuCisgICAgICovCisgICAgZHAgPSAmZHMtPmRzX2FjdGl2ZXJlYWQuZGNfcGFja2V0OworICAgIGRwLT5idWZfbGVuID0gYWxsb2NzaXplOworICAgIGRwLT5kYXRhID0gZHMtPmRzX25leHRyZWFkcGFja2V0LT5wa19idWZmZXI7CisKKyAgICBkcy0+ZHNfYWN0aXZlcmVhZC5kY19jb250ZXh0ID0gTlVMTDsKKworICAgIHJldHVybiAwOworfQorCisvKgorICogIEZ1bmN0aW9uOiBpbml0aWFsaXNlX3dyaXRlCisgKiAgIFB1cnBvc2U6IFNldCB1cCBhIHdyaXRlIHJlcXVlc3QgZm9yIGFub3RoZXIgcGFja2V0CisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IHBhY2tldCAgVGhlIHBhY2tldCB0byBiZSB3cml0dGVuCisgKgorICogICAgICAgICAgICAgIHR5cGUgICAgVGhlIHR5cGUgb2YgdGhlIHBhY2tldAorICoKKyAqICAgICAgSW4vT3V0OiBkYyAgICAgIFRoZSBzdHJ1Y3R1cmUgdG8gYmUgaW50aWFsaXNlZAorICoKKyAqICAgUmV0dXJuczogTm90aGluZworICovCitzdGF0aWMgdm9pZCBpbml0aWFsaXNlX3dyaXRlKERyaXZlckNhbGwgKmRjLCBQYWNrZXQgKnBhY2tldCwgRGV2Q2hhbklEIHR5cGUpCit7CisgICAgc3RydWN0IGRhdGFfcGFja2V0ICpkcCA9ICZkYy0+ZGNfcGFja2V0OworCisgICAgZHAtPmxlbiA9IHBhY2tldC0+cGtfbGVuZ3RoOworICAgIGRwLT5kYXRhID0gcGFja2V0LT5wa19idWZmZXI7CisgICAgZHAtPnR5cGUgPSB0eXBlOworCisgICAgLyoKKyAgICAgKiB3ZSBhcmUgcmVxdWlyZWQgdG8gY2xlYXIgdGhlIHN0YXRlIHN0cnVjdHVyZSBmb3IgdGhlIGRyaXZlcgorICAgICAqLworICAgIGRjLT5kY19jb250ZXh0ID0gTlVMTDsKK30KKworLyoKKyAqICBGdW5jdGlvbjogZW5xdWV1ZV9wYWNrZXQKKyAqICAgUHVycG9zZTogbW92ZSBhIG5ld2x5IHJlYWQgcGFja2V0IG9udG8gdGhlIGFwcHJvcHJpYXRlIHF1ZXVlCisgKiAgICAgICAgICAgICAgb2YgcmVhZCBwYWNrZXRzCisgKgorICogICAgUGFyYW1zOgorICogICAgICBJbi9PdXQ6IGRzICAgICAgU3RhdGUgc3RydWN0dXJlIHdpdGggbmV3IHBhY2tldAorICoKKyAqICAgUmV0dXJuczogTm90aGluZworICovCitzdGF0aWMgdm9pZCBlbnF1ZXVlX3BhY2tldChEZXZTV1N0YXRlICpkcykKK3sKKyAgICBzdHJ1Y3QgZGF0YV9wYWNrZXQgKmRwID0gJmRzLT5kc19hY3RpdmVyZWFkLmRjX3BhY2tldDsKKyAgICBQYWNrZXQgKnBhY2tldCA9IGRzLT5kc19uZXh0cmVhZHBhY2tldDsKKworICAgIC8qCisgICAgICogdHJhbnNmZXIgdGhlIGxlbmd0aAorICAgICAqLworICAgIHBhY2tldC0+cGtfbGVuZ3RoID0gZHAtPmxlbjsKKworICAgIC8qCisgICAgICogdGFrZSB0aGlzIHBhY2tldCBvdXQgb2YgdGhlIGluY29taW5nIHNsb3QKKyAgICAgKi8KKyAgICBkcy0+ZHNfbmV4dHJlYWRwYWNrZXQgPSBOVUxMOworCisgICAgLyoKKyAgICAgKiB0cnkgdG8gcHV0IGl0IG9uIHRoZSBjb3JyZWN0IGlucHV0IHF1ZXVlCisgICAgICovCisgICAgaWYgKGlsbGVnYWxEZXZDaGFuSUQoZHAtPnR5cGUpKQorICAgIHsKKyAgICAgICAgLyogdGhpcyBzaG91bGRuJ3QgaGFwcGVuICovCisgICAgICAgIFdBUk4oIklsbGVnYWwgdHlwZSBmb3IgUnggcGFja2V0Iik7CisgICAgICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBBZHBfYWRkVG9RdWV1ZSgmZHMtPmRzX3JlYWRxdWV1ZVtkcC0+dHlwZV0sIHBhY2tldCk7Cit9CisKKy8qCisgKiAgRnVuY3Rpb246IGZsdXNoX3BhY2tldAorICogICBQdXJwb3NlOiBTZW5kIGEgcGFja2V0IHRvIHRoZSBkZXZpY2UgZHJpdmVyCisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IGRldmljZSAgVGhlIGRldmljZSB0byBiZSB3cml0dGVuIHRvCisgKgorICogICAgICBJbi9PdXQ6IGRjICAgICAgRGVzY3JpYmVzIHRoZSBwYWNrZXQgdG8gYmUgc2VudAorICoKKyAqICAgUmV0dXJuczogTm90aGluZworICoKKyAqIFBvc3QtY29uZGl0aW9uczogSWYgdGhlIHdob2xlIHBhY2tldCB3YXMgYWNjZXB0ZWQgYnkgdGhlIGRldmljZQorICogICAgICAgICAgICAgICAgICAgICAgZHJpdmVyLCB0aGVuIGRjLT5kY19wYWNrZXQuZGF0YSB3aWxsIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gTlVMTC4KKyAqLworc3RhdGljIHZvaWQgZmx1c2hfcGFja2V0KGNvbnN0IERldmljZURlc2NyICpkZXZpY2UsIERyaXZlckNhbGwgKmRjKQoreworICAgIGlmIChkZXZpY2UtPkRldmljZVdyaXRlKGRjKSA+IDApCisgICAgICAgIC8qCisgICAgICAgICAqIHRoZSB3aG9sZSBwYWNrZXQgd2FzIHN3YWxsb3dlZAorICAgICAgICAgKi8KKyAgICAgICAgZGMtPmRjX3BhY2tldC5kYXRhID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbnMuICBUaGV5IGFyZSBkb2N1bWVudGVkIGluCisgKiBkZXZzdy5oCisgKi8KK1BhY2tldCAqRGV2U1dfQWxsb2NhdGVQYWNrZXQoY29uc3QgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKyAgICBQYWNrZXQgKnBrOworCisgICAgaWYgKChwayA9IG1hbGxvYyhzaXplb2YoKnBrKSkpID09IE5VTEwpCisgICAgeworICAgICAgICBXQVJOKCJtYWxsb2MgZmFpbHVyZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoKHBrLT5wa19idWZmZXIgPSBtYWxsb2MobGVuZ3RoK0NIQU5fSEVBREVSX1NJWkUpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgV0FSTigibWFsbG9jIGZhaWx1cmUiKTsKKyAgICAgICAgZnJlZShwayk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBwazsKK30KKwordm9pZCBEZXZTV19GcmVlUGFja2V0KFBhY2tldCAqcGspCit7CisgICAgZnJlZShway0+cGtfYnVmZmVyKTsKKyAgICBmcmVlKHBrKTsKK30KKworQWRwRXJycyBEZXZTV19PcGVuKERldmljZURlc2NyICpkZXZpY2UsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmFyZywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZDaGFuSUQgdHlwZSkKK3sKKyAgICBEZXZTV1N0YXRlICpkczsKKworICAgIC8qCisgICAgICogaXMgdGhpcyB0aGUgdmVyeSBmaXJzdCBvcGVuIGNhbGwgZm9yIHRoaXMgZHJpdmVyPworICAgICAqLworICAgIGlmICgoZHMgPSAoRGV2U1dTdGF0ZSAqKShkZXZpY2UtPlN3aXRjaGVyU3RhdGUpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogeWVzLCBpdCBpczogaW5pdGlhbGlzZSBzdGF0ZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChkcyA9IG1hbGxvYyhzaXplb2YoKmRzKSkpID09IE5VTEwpCisgICAgICAgICAgICAvKiBnaXZlIHVwICovCisgICAgICAgICAgICByZXR1cm4gYWRwX21hbGxvY19mYWlsdXJlOworCisgICAgICAgICh2b2lkKW1lbXNldChkcywgMCwgc2l6ZW9mKCpkcykpOworICAgICAgICBkZXZpY2UtPlN3aXRjaGVyU3RhdGUgPSAodm9pZCAqKWRzOworICAgIH0KKworICAgIC8qCisgICAgICogY2hlY2sgdGhhdCB3ZSBoYXZlbid0IGFscmVhZHkgYmVlbiBvcGVuZWQgZm9yIHRoaXMgdHlwZQorICAgICAqLworICAgIGlmICgoZHMtPmRzX29wZW5kZXZjaGFucyAmICgxIDw8IHR5cGUpKSAhPSAwKQorICAgICAgICByZXR1cm4gYWRwX2RldmljZV9hbHJlYWR5X29wZW47CisKKyAgICAvKgorICAgICAqIGlmIG5vIG9wZW5zIGhhdmUgYmVlbiBkb25lIGZvciB0aGlzIGRldmljZSwgdGhlbiBkbyBpdCBub3cKKyAgICAgKi8KKyAgICBpZiAoZHMtPmRzX29wZW5kZXZjaGFucyA9PSAwKQorICAgICAgICBpZiAoZGV2aWNlLT5EZXZpY2VPcGVuKG5hbWUsIGFyZykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGFkcF9kZXZpY2Vfb3Blbl9mYWlsZWQ7CisKKyAgICAvKgorICAgICAqIG9wZW4gaGFzIGZpbmlzaGVkCisgICAgICovCisgICAgZHMtPmRzX29wZW5kZXZjaGFucyB8PSAoMSA8PCB0eXBlKTsKKyAgICByZXR1cm4gYWRwX29rOworfQorCitBZHBFcnJzIERldlNXX01hdGNoKGNvbnN0IERldmljZURlc2NyICpkZXZpY2UsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICByZXR1cm4gKGRldmljZS0+RGV2aWNlTWF0Y2gobmFtZSwgYXJnKSA9PSAtMSkgPyBhZHBfZmFpbGVkIDogYWRwX29rOworfQorCitBZHBFcnJzIERldlNXX0Nsb3NlKGNvbnN0IERldmljZURlc2NyICpkZXZpY2UsIGNvbnN0IERldkNoYW5JRCB0eXBlKQoreworICAgIERldlNXU3RhdGUgKmRzID0gKERldlNXU3RhdGUgKikoZGV2aWNlLT5Td2l0Y2hlclN0YXRlKTsKKyAgICBQYWNrZXQgKnBrOworCisgICAgaWYgKChkcy0+ZHNfb3BlbmRldmNoYW5zICYgKDEgPDwgdHlwZSkpID09IDApCisgICAgICAgIHJldHVybiBhZHBfZGV2aWNlX25vdF9vcGVuOworCisgICAgZHMtPmRzX29wZW5kZXZjaGFucyAmPSB+KDEgPDwgdHlwZSk7CisKKyAgICAvKgorICAgICAqIGlmIHRoaXMgaXMgdGhlIGxhc3QgY2xvc2UgZm9yIHRoaXMgY2hhbm5lbCwgdGhlbiBpbmZvcm0gdGhlIGRyaXZlcgorICAgICAqLworICAgIGlmIChkcy0+ZHNfb3BlbmRldmNoYW5zID09IDApCisgICAgICAgIGRldmljZS0+RGV2aWNlQ2xvc2UoKTsKKworICAgIC8qCisgICAgICogcmVsZWFzZSBhbGwgcGFja2V0cyBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZQorICAgICAqLworICAgIGZvciAocGsgPSBBZHBfcmVtb3ZlRnJvbVF1ZXVlKCYoZHMtPmRzX3JlYWRxdWV1ZVt0eXBlXSkpOworICAgICAgICAgcGsgIT0gTlVMTDsKKyAgICAgICAgIHBrID0gQWRwX3JlbW92ZUZyb21RdWV1ZSgmKGRzLT5kc19yZWFkcXVldWVbdHlwZV0pKSkKKyAgICAgICAgRGV2U1dfRnJlZVBhY2tldChwayk7CisKKyAgICAvKiBGcmVlIG1lbW9yeSAqLworICAgIGZyZWUgKChjaGFyICopIGRldmljZS0+U3dpdGNoZXJTdGF0ZSk7CisgICAgZGV2aWNlLT5Td2l0Y2hlclN0YXRlID0gMHgwOworCisgICAgLyogdGhhdCdzIGFsbCAqLworICAgIHJldHVybiBhZHBfb2s7Cit9CisKK0FkcEVycnMgRGV2U1dfUmVhZChjb25zdCBEZXZpY2VEZXNjciAqZGV2aWNlLCBjb25zdCBEZXZDaGFuSUQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBQYWNrZXQgKipwYWNrZXQsIGJvb2wgYmxvY2spCit7CisgIGludCByZWFkX2VycjsKKyAgRGV2U1dTdGF0ZSAqZHMgPSBkZXZpY2UtPlN3aXRjaGVyU3RhdGU7CisKKyAgICAvKgorICAgICAqIFRvIHRyeSB0byBnZXQgaW5mb3JtYXRpb24gb3V0IG9mIHRoZSBkZXZpY2UgZHJpdmVyIGFzCisgICAgICogcXVpY2tseSBhcyBwb3NzaWJsZSwgd2UgdHJ5IGFuZCByZWFkIG1vcmUgcGFja2V0cywgZXZlbgorICAgICAqIGlmIGEgY29tcGxldGVkIHBhY2tldCBpcyBhbHJlYWR5IGF2YWlsYWJsZS4KKyAgICAgKi8KKworICAgIC8qCisgICAgICogaGF2ZSB3ZSBnb3QgYSBwYWNrZXQgY3VycmVudGx5IHBlbmRpbmc/CisgICAgICovCisgIGlmIChkcy0+ZHNfbmV4dHJlYWRwYWNrZXQgPT0gTlVMTCkKKyAgICAvKgorICAgICAgICogbm8gLSBzZXQgdGhpbmdzIHVwCisgICAgICAgKi8KKyAgICBpZiAoaW5pdGlhbGlzZV9yZWFkKGRzKSA8IDApIHsKKyAgICAgIC8qCisgICAgICAgKiB3ZSBmYWlsZWQgdG8gaW5pdGlhbGlzZSB0aGUgbmV4dCBwYWNrZXQsIGJ1dCBjYW4KKyAgICAgICAqIHN0aWxsIHJldHVybiBhIHBhY2tldCB0aGF0IGhhcyBhbHJlYWR5IGFycml2ZWQuCisgICAgICAgKi8KKyAgICAgICpwYWNrZXQgPSBBZHBfcmVtb3ZlRnJvbVF1ZXVlKCZkcy0+ZHNfcmVhZHF1ZXVlW3R5cGVdKTsgCisgICAgICByZXR1cm4gYWRwX29rOworICAgIH0KKyAgcmVhZF9lcnIgPSBkZXZpY2UtPkRldmljZVJlYWQoJmRzLT5kc19hY3RpdmVyZWFkLCBibG9jayk7CisgIHN3aXRjaCAocmVhZF9lcnIpIHsKKyAgY2FzZSAxOgorICAgIC8qCisgICAgICogZHJpdmVyIGhhcyBwdWxsZWQgaW4gYSBjb21wbGV0ZSBwYWNrZXQsIHF1ZXVlIGl0IHVwCisgICAgICovCisjaWZkZWYgUkVUX0RFQlVHCisgICAgcHJpbnRmKCJnb3QgYSBjb21wbGV0ZSBwYWNrZXRcbiIpOworI2VuZGlmCisgICAgZW5xdWV1ZV9wYWNrZXQoZHMpOworICAgICpwYWNrZXQgPSBBZHBfcmVtb3ZlRnJvbVF1ZXVlKCZkcy0+ZHNfcmVhZHF1ZXVlW3R5cGVdKTsKKyAgICByZXR1cm4gYWRwX29rOworICBjYXNlIDA6CisgICAgLyoKKyAgICAgKiBPSywgcmV0dXJuIHRoZSBoZWFkIG9mIHRoZSByZWFkIHF1ZXVlIGZvciB0aGUgZ2l2ZW4gdHlwZQorICAgICAqLworICAgIC8qICAgIGVucXVldWVfcGFja2V0KGRzKTsgKi8KKyAgICAqcGFja2V0ID0gQWRwX3JlbW92ZUZyb21RdWV1ZSgmZHMtPmRzX3JlYWRxdWV1ZVt0eXBlXSk7CisgICAgcmV0dXJuIGFkcF9vazsKKyAgY2FzZSAtMToKKyNpZmRlZiBSRVRfREVCVUcKKyAgICBwcmludGYoImdvdCBhIGJhZCBwYWNrZXRcbiIpOworI2VuZGlmCisgICAgLyogYmFkIHBhY2tldCAqLworICAgICpwYWNrZXQgPSBOVUxMOworICAgIHJldHVybiBhZHBfYmFkX3BhY2tldDsKKyAgZGVmYXVsdDoKKyAgICBwYW5pYygiRGV2U1dfUmVhZDogYmFkIHJlYWQgc3RhdHVzICVkIiwgcmVhZF9lcnIpOworICB9CisgIHJldHVybiAwOyAvKiBnZXQgcmlkIG9mIGEgcG90ZW50aWFsIGNvbXBpbGVyIHdhcm5pbmcgKi8KK30KKworCitBZHBFcnJzIERldlNXX0ZsdXNoUGVuZGluZ1dyaXRlKGNvbnN0IERldmljZURlc2NyICpkZXZpY2UpCit7CisgICAgc3RydWN0IERyaXZlckNhbGwgKmRjOworICAgIHN0cnVjdCBkYXRhX3BhY2tldCAqZHA7CisKKyAgICBkYyA9ICYoKERldlNXU3RhdGUgKikoZGV2aWNlLT5Td2l0Y2hlclN0YXRlKSktPmRzX2FjdGl2ZXdyaXRlOworICAgIGRwID0gJmRjLT5kY19wYWNrZXQ7CisKKyAgICAvKgorICAgICAqIHRyeSB0byBmbHVzaCBhbnkgcGFja2V0IHRoYXQgaXMgc3RpbGwgYmVpbmcgd3JpdHRlbgorICAgICAqLworICAgIGlmIChkcC0+ZGF0YSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZmx1c2hfcGFja2V0KGRldmljZSwgZGMpOworCisgICAgICAgIC8qIHNlZSBpZiBpdCBoYXMgZ29uZSAqLworICAgICAgICBpZiAoZHAtPmRhdGEgIT0gTlVMTCkKKyAgICAgICAgICAgcmV0dXJuIGFkcF93cml0ZV9idXN5OworICAgICAgICBlbHNlCisgICAgICAgICAgIHJldHVybiBhZHBfb2s7CisgICAgfQorICAgIGVsc2UKKyAgICAgICByZXR1cm4gYWRwX29rOworfQorCisKK0FkcEVycnMgRGV2U1dfV3JpdGUoY29uc3QgRGV2aWNlRGVzY3IgKmRldmljZSwgUGFja2V0ICpwYWNrZXQsIERldkNoYW5JRCB0eXBlKQoreworICAgIHN0cnVjdCBEcml2ZXJDYWxsICpkYzsKKyAgICBzdHJ1Y3QgZGF0YV9wYWNrZXQgKmRwOworCisgICAgZGMgPSAmKChEZXZTV1N0YXRlICopKGRldmljZS0+U3dpdGNoZXJTdGF0ZSkpLT5kc19hY3RpdmV3cml0ZTsKKyAgICBkcCA9ICZkYy0+ZGNfcGFja2V0OworCisgICAgaWYgKGlsbGVnYWxEZXZDaGFuSUQodHlwZSkpCisgICAgICAgIHJldHVybiBhZHBfaWxsZWdhbF9hcmdzOworCisgICAgLyoKKyAgICAgKiB0cnkgdG8gZmx1c2ggYW55IHBhY2tldCB0aGF0IGlzIHN0aWxsIGJlaW5nIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBpZiAoRGV2U1dfRmx1c2hQZW5kaW5nV3JpdGUoZGV2aWNlKSAhPSBhZHBfb2spCisgICAgICAgcmV0dXJuIGFkcF93cml0ZV9idXN5OworCisgICAgLyoKKyAgICAgKiB3ZSBjYW4gdGFrZSB0aGlzIHBhY2tldCAtIHNldCB0aGluZ3MgdXAsIHRoZW4gdHJ5IHRvIGdldCByaWQgb2YgaXQKKyAgICAgKi8KKyAgICBpbml0aWFsaXNlX3dyaXRlKGRjLCBwYWNrZXQsIHR5cGUpOworICAgIGZsdXNoX3BhY2tldChkZXZpY2UsIGRjKTsKKworICAgIHJldHVybiBhZHBfb2s7Cit9CisKK0FkcEVycnMgRGV2U1dfSW9jdGwoY29uc3QgRGV2aWNlRGVzY3IgKmRldmljZSwgY29uc3QgaW50IG9wY29kZSwgdm9pZCAqYXJncykKK3sKKyAgICByZXR1cm4gKGRldmljZS0+RGV2aWNlSW9jdGwob3Bjb2RlLCBhcmdzKSA8IDApID8gYWRwX2ZhaWxlZCA6IGFkcF9vazsKK30KKworYm9vbCBEZXZTV19Xcml0ZUZpbmlzaGVkKGNvbnN0IERldmljZURlc2NyICpkZXZpY2UpCit7CisgICAgc3RydWN0IERyaXZlckNhbGwgKmRjOworICAgIHN0cnVjdCBkYXRhX3BhY2tldCAqZHA7CisKKyAgICBkYyA9ICYoKERldlNXU3RhdGUgKikoZGV2aWNlLT5Td2l0Y2hlclN0YXRlKSktPmRzX2FjdGl2ZXdyaXRlOworICAgIGRwID0gJmRjLT5kY19wYWNrZXQ7CisKKyAgICByZXR1cm4gKGRwID09IE5VTEwgfHwgZHAtPmRhdGEgPT0gTlVMTCk7Cit9CisKKy8qIEVPRiBkZXZzdy5jICovCmRpZmYgLS1naXQgYS9nZGIvcmRpLXNoYXJlL2RldnN3LmggYi9nZGIvcmRpLXNoYXJlL2RldnN3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU2MTc2OAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZGktc2hhcmUvZGV2c3cuaApAQCAtMCwwICsxLDI2OCBAQAorLyogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgdXNlZCwgY29waWVkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzIHByZXNlcnZlZCBpbiBhbGwgY29waWVzIG9mIHRoZQorICogc29mdHdhcmUuCisgKi8KKworLyogLSotQy0qLQorICoKKyAqICRSZXZpc2lvbiQKKyAqICAgICAkRGF0ZSQKKyAqCisgKi8KKyNpZm5kZWYgYW5nc2RfZGV2c3dfaAorI2RlZmluZSBhbmdzZF9kZXZzd19oCisKKyNpbmNsdWRlICJkZXZjbG50LmgiCisjaW5jbHVkZSAiYWRwZXJyLmgiCisjaW5jbHVkZSAiZHJpdmVycy5oIgorCisjaWZuZGVmIF9fY3BsdXNwbHVzCit0eXBlZGVmIHN0cnVjdCBQYWNrZXQgUGFja2V0OwordHlwZWRlZiBzdHJ1Y3QgRGV2U1dTdGF0ZSBEZXZTV1N0YXRlOworI2VuZGlmCisKKy8qCisgKiB0aGUgYmFzaWMgc3RydWN0dXJlIHVzZWQgZm9yIHBhc3NpbmcgcGFja2V0cyBhcm91bmQKKyAqLworc3RydWN0IFBhY2tldAoreworICAgIHN0cnVjdCBQYWNrZXQgKnBrX25leHQ7ICAgICAgICAgICAgIC8qIFhYWCBmaXJzdCBmaWVsZCBpbiBzdHJ1Y3QgKi8KKyAgICB1bnNpZ25lZCBpbnQgICBwa19sZW5ndGg7CisgICAgdW5zaWduZWQgY2hhciAqcGtfYnVmZmVyOworfTsKKworLyoKKyAqIGNvbnRyb2wgc3RydWN0dXJlLCB1c2VkIGZvciBtYWludGFpbmluZyBkZXZpY2Ugc3dpdGNoZXIgc3RhdGUKKyAqLworc3RydWN0IERldlNXU3RhdGUKK3sKKyAgICB1bnNpZ25lZCBpbnQgIGRzX29wZW5kZXZjaGFuczsgICAgICAvKiBiaXRtYXAgb2Ygb3BlbiBkZXZpY2UgY2hhbm5lbHMgKi8KKworICAgIC8qCisgICAgICogcXVldWUgb2YgcGFja2V0cyByZWFkIGZvciB0aGUgdmFyaW91cyBkZXZpY2UgY2hhbm5lbHMKKyAgICAgKi8KKyAgICBQYWNrZXQgICAgICAgKmRzX3JlYWRxdWV1ZVtEQ19OVU1fQ0hBTk5FTFNdOworCisgICAgLyoKKyAgICAgKiBzdHJ1Y3R1cmVzIGZvciBtYW5hZ2luZyBhY3RpdmUgcmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucworICAgICAqLworICAgIFBhY2tldCAgICAgICAqZHNfbmV4dHJlYWRwYWNrZXQ7CisgICAgRHJpdmVyQ2FsbCAgICBkc19hY3RpdmVyZWFkOworICAgIERyaXZlckNhbGwgICAgZHNfYWN0aXZld3JpdGU7Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorICogIEZ1bmN0aW9uOiBEZXZTV19BbGxvY2F0ZVBhY2tldAorICogICBQdXJwb3NlOiBDbGFpbSBzb21lIG1lbW9yeSB0byBob2xkIGEgc3RydWN0IFBhY2tldCwgYW5kIHRoZSBidWZmZXIgZm9yCisgKiAgICAgICAgICAgICAgdGhhdCBwYWNrZXQuCisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IGxlbmd0aCAgU2l6ZSBvZiB0aGUgYnVmZmVyIGluIHN0cnVjdCBQYWNrZXQuCisgKgorICogICBSZXR1cm5zOgorICogICAgICAgICAgT0s6IFBvaW50ZXIgdG8gdGhlIG5ld2x5IG1hbGxvYygpZWQgUGFja2V0LgorICogICAgICAgRXJyb3I6IE5VTEwKKyAqLworUGFja2V0ICpEZXZTV19BbGxvY2F0ZVBhY2tldChjb25zdCB1bnNpZ25lZCBpbnQgbGVuZ3RoKTsKKworLyoKKyAqICBGdW5jdGlvbjogRGV2U1dfRnJlZVBhY2tldAorICogICBQdXJwb3NlOiBGcmVlIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGEgc3RydWN0IFBhY2tldC4KKyAqCisgKiAgUHJlLWNvbmRpdGlvbnMgVGhlIHN0cnVjdHVyZSBtdXN0IGhhdmUgYmVlbiBvcmlnaW5hbGx5IGNsYWltZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIHZpYSBEZXZTV19BbGxvY2F0ZVBhY2tldC4KKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgICBJbnB1dDogcGsgICAgICBUaGUgcGFja2V0IHRvIGJlIGZyZWVkLgorICoKKyAqICAgUmV0dXJuczogTm90aGluZworICovCit2b2lkIERldlNXX0ZyZWVQYWNrZXQoUGFja2V0ICpwayk7CisKKy8qCisgKiAgRnVuY3Rpb246IERldlNXX09wZW4KKyAqICAgUHVycG9zZTogT3BlbiB0aGUgc3BlY2lmaWVkIGRldmljZSBkcml2ZXIKKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgICBJbnB1dDogbmFtZSAgICBJZGVudGlmaWVzIHdoaWNoIGRldmljZSB0byBvcGVuLiAgVGhpcyBjYW4gZWl0aGVyIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICBhIGhvc3Qgc3BlY2lmaWMgaWRlbnRpZmllciAoZS5nLiAiL2Rldi90dHlhIiwKKyAqICAgICAgICAgICAgICAgICAgICAgICJDT00xOiIpLCBvciBhIG51bWJlciB3aGljaCBpcyB1c2VkIHRvIHJlZmVyIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICBgc3RhbmRhcmQnIGludGVyZmFjZXMsIHNvICIxIiB3b3VsZCBiZSB0aGUgZmlyc3QgaG9zdAorICogICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLCAiMiIgdGhlIHNlY29uZCwgYW5kIHNvIG9uLgorICoKKyAqICAgICAgICAgICAgICBhcmcgICAgIERyaXZlciBzcGVjaWZpYyBhcmd1bWVudHMuICBGb3IgZXhhbXBsZSwgc29tZSBzZXJpYWwKKyAqICAgICAgICAgICAgICAgICAgICAgIGRyaXZlcnMgYWNjZXB0IHNwZWVkIGFuZCBjb250cm9sIGFyZ3VtZW50cyBzdWNoIGFzCisgKiAgICAgICAgICAgICAgICAgICAgICAiOTYwMCIgb3IgIjE5MjAwL05PX0JSRUFLIi4gIFRoZXNlIGFyZ3VtZW50cyBhcmUKKyAqICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlbHkgZnJlZS1mb3JtOiBpdCBpcyB0aGUgaW5kaXZpZHVhbCBkcml2ZXJzCisgKiAgICAgICAgICAgICAgICAgICAgICB3aGljaCBkbyB0aGUgbmVjZXNzYXJ5IGludGVycHJldGF0aW9uLgorICoKKyAqICAgICAgICAgICAgICB0eXBlICAgIFRoZSB0eXBlIG9mIHBhY2tldCB0aGUgY2FsbGVyIGlzIGludGVyZXN0ZWQgaW4uICBPbmx5CisgKiAgICAgICAgICAgICAgICAgICAgICBvbmUgb3BlbiBpcyBhbGxvd2VkIGZvciBlYWNoIHR5cGUgb2YgcGFja2V0LgorICoKKyAqICAgICAgSW4vT3V0OiBkZXZpY2UgIFRoZSBkZXZpY2UgZHJpdmVyIHRvIG9wZW4KKyAqCisgKiAgIFJldHVybnM6CisgKiAgICAgICAgICBPSzogYWRwX29rCisgKiAgICAgICBFcnJvcjogYWRwX2RldmljZV9vcGVuX2ZhaWxlZAorICogICAgICAgICAgICAgIGFkcF9kZXZpY2VfYWxyZWFkeV9vcGVuCisgKiAgICAgICAgICAgICAgYWRwX21hbGxvY19mYWlsdXJlCisgKi8KK0FkcEVycnMgRGV2U1dfT3BlbihEZXZpY2VEZXNjciAqZGV2aWNlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICphcmcsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2Q2hhbklEIHR5cGUpOworCisvKgorICogIEZ1bmN0aW9uOiBEZXZTV19NYXRjaAorICogICBQdXJwb3NlOiBNaW5pbWFsIHZlbmVlciBmb3IgRGV2aWNlTWF0Y2gKKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgICBJbnB1dDogZGV2aWNlICBUaGUgZGV2aWNlIGRyaXZlciB0byBtYXRjaC4KKyAqCisgKiAgICAgICAgICAgICAgbmFtZSAgICBJZGVudGlmaWVzIHdoaWNoIGRldmljZSB0byBvcGVuLiAgVGhpcyBjYW4gZWl0aGVyIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICBhIGhvc3Qgc3BlY2lmaWMgaWRlbnRpZmllciAoZS5nLiAiL2Rldi90dHlhIiwKKyAqICAgICAgICAgICAgICAgICAgICAgICJDT00xOiIpLCBvciBhIG51bWJlciB3aGljaCBpcyB1c2VkIHRvIHJlZmVyIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICBgc3RhbmRhcmQnIGludGVyZmFjZXMsIHNvICIxIiB3b3VsZCBiZSB0aGUgZmlyc3QgaG9zdAorICogICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLCAiMiIgdGhlIHNlY29uZCwgYW5kIHNvIG9uLgorICoKKyAqICAgICAgICAgICAgICBhcmcgICAgIERyaXZlciBzcGVjaWZpYyBhcmd1bWVudHMuICBGb3IgZXhhbXBsZSwgc29tZSBzZXJpYWwKKyAqICAgICAgICAgICAgICAgICAgICAgIGRyaXZlcnMgYWNjZXB0IHNwZWVkIGFuZCBjb250cm9sIGFyZ3VtZW50cyBzdWNoIGFzCisgKiAgICAgICAgICAgICAgICAgICAgICAiOTYwMCIgb3IgIjE5MjAwL05PX0JSRUFLIi4gIFRoZXNlIGFyZ3VtZW50cyBhcmUKKyAqICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlbHkgZnJlZS1mb3JtOiBpdCBpcyB0aGUgaW5kaXZpZHVhbCBkcml2ZXJzCisgKiAgICAgICAgICAgICAgICAgICAgICB3aGljaCBkbyB0aGUgbmVjZXNzYXJ5IGludGVycHJldGF0aW9uLgorICoKKyAqICAgUmV0dXJuczoKKyAqICAgICAgICAgIE9LOiBhZHBfb2sKKyAqICAgICAgIEVycm9yOiBhZHBfZmFpbGVkCisgKi8KK0FkcEVycnMgRGV2U1dfTWF0Y2goY29uc3QgRGV2aWNlRGVzY3IgKmRldmljZSwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXJnKTsKKworLyoKKyAqICBGdW5jdGlvbjogRGV2U1dfQ2xvc2UKKyAqICAgUHVycG9zZTogQ2xvc2UgdGhlIHNwZWNpZmllZCBkZXZpY2UgZHJpdmVyLiBBbGwgcGFja2V0cyBvZiB0aGUgdHlwZQorICogICAgICAgICAgICAgIHVzZWQgYnkgdGhlIGNhbGxlciBoZWxkIHdpdGhpbiB0aGUgc3dpdGNoaW5nIGxheWVyIHdpbGwKKyAqICAgICAgICAgICAgICBiZSBkaXNjYXJkZWQuCisgKgorICogIFByZS1jb25kaXRpb25zOiBEZXZpY2UgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBvcGVuZWQuCisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IGRldmljZSAgVGhlIGRldmljZSBkcml2ZXIgdG8gY2xvc2UKKyAqCisgKiAgICAgICAgICAgICAgdHlwZSAgICBUaGUgdHlwZSBvZiBwYWNrZXQgdGhlIGNhbGxlciB3YXMgaW50ZXJlc3RlZCBpbi4KKyAqCisgKiAgIFJldHVybnM6CisgKiAgICAgICAgICBPSzogYWRwX29rCisgKiAgICAgICBFcnJvcjogYWRwX2RldmljZV9ub3Rfb3BlbgorICovCitBZHBFcnJzIERldlNXX0Nsb3NlKGNvbnN0IERldmljZURlc2NyICpkZXZpY2UsIGNvbnN0IERldkNoYW5JRCB0eXBlKTsKKworLyoKKyAqICBGdW5jdGlvbjogRGV2U1dfUmVhZAorICogICBQdXJwb3NlOiBSZWFkIGEgcGFja2V0IG9mIGFwcHJvcHJpYXRlIHR5cGUgZnJvbSB0aGUgZGV2aWNlIGRyaXZlcgorICoKKyAqICAgIFBhcmFtczoKKyAqICAgICAgIElucHV0OiBkZXZpY2UgIFRoZSBkZXZpY2UgZHJpdmVyIHRvIHJlYWQgcGFja2V0IGZyb20uCisgKgorICogICAgICAgICAgICAgIHR5cGUgICAgVGhlIHR5cGUgb2YgcGFja2V0IHRoZSBjYWxsZXIgaXMgaW50ZXJlc3RlZCBpbi4KKyAqCisgKiAgICAgIE91dHB1dDogcGFja2V0ICBQb2ludGVyIHRvIG5ldyBwYWNrZXQgKGlmIG9uZSBpcyBhdmFpbGFibGUpCisgKiAgICAgICAgICAgICAgTlVMTCAoaWYgbm8gY29tcGxldGUgcGFja2V0IGlzIGF2YWlsYWJsZSkKKyAqCisgKiAgICAgICBJbnB1dDogYmxvY2sgICBJZiBUUlVFLCByZWFkIG1heSBzYWZlbHkgYmxvY2sgZm9yIGEgc2hvcnQgcGVyaW9kCisgKiAgICAgICAgICAgICAgICAgICAgICBvZiB0aW1lIChzYXkgdXAgdG8gMjBtcyksIHRvIGF2b2lkIGhpZ2ggQ1BVIGxvYWQKKyAqICAgICAgICAgICAgICAgICAgICAgIHdoaWxzdCB3YWl0aW5nIGZvciBhIHJlcGx5LgorICogICAgICAgICAgICAgICAgICAgICAgSWYgRkFMU0UsIHJlYWQgTVVTVCBOT1QgYmxvY2suCisgKgorICogICBSZXR1cm5zOgorICogICAgICAgICAgT0s6IGFkcF9vaworICogICAgICAgRXJyb3I6IGFkcF9iYWRfcGFja2V0CisgKgorICogUG9zdC1jb25kaXRpb25zOiBUaGUgY2FsbGluZyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBwYWNrZXQgd2hlbiBpdCBpcyBubyBsb25nZXIKKyAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZC4KKyAqLworQWRwRXJycyBEZXZTV19SZWFkKGNvbnN0IERldmljZURlc2NyICpkZXZpY2UsIGNvbnN0IERldkNoYW5JRCB0eXBlLAorICAgICAgICAgICAgICAgICAgIFBhY2tldCAqKnBhY2tldCwgYm9vbCBibG9jayk7CisKKy8qCisgKiAgRnVuY3Rpb246IERldlNXX1dyaXRlCisgKiAgIFB1cnBvc2U6IFRyeSB0byB3cml0ZSBhIHBhY2tldCB0byB0aGUgZGV2aWNlIGRyaXZlci4gIFRoZSB3cml0ZSB3aWxsCisgKiAgICAgICAgICAgICAgYmUgYm91bmNlZCBpZiBhbm90aGVyIHdyaXRlIGlzIHN0aWxsIGluIHByb2dyZXNzLgorICoKKyAqICAgIFBhcmFtczoKKyAqICAgICAgIElucHV0OiBkZXZpY2UgIFRoZSBkZXZpY2UgZHJpdmVyIHRvIHdyaXRlIGEgcGFja2V0IHRvLgorICoKKyAqICAgICAgICAgICAgICBwYWNrZXQgIFRoZSBwYWNrZXQgdG8gYmUgd3JpdHRlbi4KKyAqCisgKiAgICAgICAgICAgICAgdHlwZSAgICBUaGUgdHlwZSB0byBiZSBhc3NpZ25lZCB0byB0aGUgcGFja2V0LgorICoKKyAqICAgUmV0dXJuczoKKyAqICAgICAgICAgIE9LOiBhZHBfb2sKKyAqICAgICAgIEVycm9yOiBhZHBfaWxsZWdhbF9hcmdzCisgKiAgICAgICAgICAgICAgYWRwX3dyaXRlX2J1c3kKKyAqCisgKiBQb3N0LWNvbmRpdGlvbnM6IFRoZSBjYWxsaW5nIGZ1bmN0aW9uIHJldGFpbnMgIm93bmVyc2hpcCIgb2YgdGhlIHBhY2tldCwKKyAqICAgICAgICAgICAgICAgICAgICAgIGkuZS4gaXQgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgdGhlIHJlc291cmNlcyB1c2VkCisgKiAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgcGFja2V0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAqLworQWRwRXJycyBEZXZTV19Xcml0ZShjb25zdCBEZXZpY2VEZXNjciAqZGV2aWNlLCBQYWNrZXQgKnBhY2tldCwgRGV2Q2hhbklEIHR5cGUpOworCisvKgorICogIEZ1bmN0aW9uOiBEZXZTV19GbHVzaFBlbmRpbmdXcml0ZQorICogICBQdXJwb3NlOiBJZiBhIHdyaXRlIGlzIGluIHByb2dyZXNzLCBnaXZlIGl0IGEgY2hhbmNlIHRvIGZpbmlzaC4KKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgICBJbnB1dDogZGV2aWNlICBUaGUgZGV2aWNlIGRyaXZlciB0byBmbHVzaC4KKyAqCisgKiAgIFJldHVybnM6CisgKiAgICAgICAgICAgICAgYWRwX29rICAgICAgICAgICBubyBwZW5kaW5nIHdyaXRlLCBvciB3cml0ZSBmbHVzaGVkIGNvbXBsZXRlbHkKKyAqICAgICAgICAgICAgICBhZHBfd3JpdGVfYnVzeSAgIHBlbmRpbmcgd3JpdGUgbm90IGZsdXNoZWQgY29tcGxldGVseQorICovCitBZHBFcnJzIERldlNXX0ZsdXNoUGVuZGluZ1dyaXRlKGNvbnN0IERldmljZURlc2NyICpkZXZpY2UpOworCisvKgorICogIEZ1bmN0aW9uOiBEZXZTV19Jb2N0bAorICogICBQdXJwb3NlOiBQZXJmb3JtIG1pc2NlbGxhbmVvdXMgY29udHJvbCBvcGVyYXRpb25zLiAgVGhpcyBpcyBhIG1pbmltYWwKKyAqICAgICAgICAgICAgICB2ZW5lZXIgdG8gRGV2aWNlSW9jdGwuCisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IGRldmljZSAgVGhlIGRldmljZSBkcml2ZXIgdG8gY29udHJvbC4KKyAqCisgKiAgICAgICAgICAgICAgb3Bjb2RlICBSZWFzb24gY29kZSBpbmRpY2F0aW5nIHRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybS4KKyAqCisgKiAgICAgIEluL091dDogYXJncyAgICBQb2ludGVyIHRvIG9wY29kZS1zZW5zaXRpdmUgYXJndW1lbnRzL3Jlc3VsdCBzcGFjZS4KKyAqCisgKiAgIFJldHVybnM6CisgKiAgICAgICAgICBPSzogYWRwX29rCisgKiAgICAgICBFcnJvcjogYWRwX2ZhaWxlZAorICovCitBZHBFcnJzIERldlNXX0lvY3RsKGNvbnN0IERldmljZURlc2NyICpkZXZpY2UsIGNvbnN0IGludCBvcGNvZGUsIHZvaWQgKmFyZ3MpOworCisvKgorICogIEZ1bmN0aW9uOiBEZXZTV19Xcml0ZUZpbmlzaGVkCisgKiAgIFB1cnBvc2U6IFJldHVybiBUUlVFIGlmIHRoZSBhY3RpdmUgZGV2aWNlIGhhcyBmaW5pc2hlZCB3cml0aW5nCisgKiAgICAgICAgICAgICAgdGhlIGxhc3QgcGFja2V0IHRvIGJlIHNlbnQsIG9yIEZBTFNFIGlmIGEgcGFja2V0IGlzIHN0aWxsCisgKiAgICAgICAgICAgICAgYmVpbmcgdHJhbnNtaXR0ZWQuCisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IGRldmljZSAgVGhlIGRldmljZSBkcml2ZXIgdG8gY2hlY2suCisgKgorICogICBSZXR1cm5zOgorICogICAgICAgIFRSVUU6IHdyaXRlIGZpbmlzaGVkIG9yIGluYWN0aXZlCisgKiAgICAgICBGQUxTRTogd3JpdGUgaW4gcHJvZ3Jlc3MKKyAqLworYm9vbCBEZXZTV19Xcml0ZUZpbmlzaGVkKGNvbnN0IERldmljZURlc2NyICpkZXZpY2UpOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9CisjZW5kaWYKKworI2VuZGlmIC8qIG5kZWYgYW5nc2RfZGV2c3dfaCAqLworCisvKiBFT0YgZGV2c3cuaCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9kcml2ZXJzLmMgYi9nZGIvcmRpLXNoYXJlL2RyaXZlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTBlZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9kcml2ZXJzLmMKQEAgLTAsMCArMSwzNCBAQAorLyogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgdXNlZCwgY29waWVkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzIHByZXNlcnZlZCBpbiBhbGwgY29waWVzIG9mIHRoZQorICogc29mdHdhcmUuCisgKi8KKworLyogLSotQy0qLQorICoKKyAqICRSZXZpc2lvbiQKKyAqICAgICAkRGF0ZSQKKyAqCisgKgorICogZHJpdmVycy5jIC0gZGVjbGFyZXMgYSBOVUxMIHRlcm1pbmF0ZWQgbGlzdCBvZiBkZXZpY2UgZHJpdmVyCisgKiAgICAgICAgICAgICBkZXNjcmlwdG9ycyBzdXBwb3J0ZWQgYnkgdGhlIGhvc3QuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZHJpdmVycy5oIgorCitleHRlcm4gRGV2aWNlRGVzY3IgYW5nZWxfU2VyaWFsRGV2aWNlOworZXh0ZXJuIERldmljZURlc2NyIGFuZ2VsX1NlcnBhckRldmljZTsKK2V4dGVybiBEZXZpY2VEZXNjciBhbmdlbF9FdGhlcm5ldERldmljZTsKKworRGV2aWNlRGVzY3IgKmRldmljZXNbXSA9Cit7CisgICAgJmFuZ2VsX1NlcmlhbERldmljZSwKKyAgICAmYW5nZWxfU2VycGFyRGV2aWNlLAorICAgICZhbmdlbF9FdGhlcm5ldERldmljZSwKKyAgICBOVUxMCit9OworCisvKiBFT0YgZHJpdmVycy5jICovCmRpZmYgLS1naXQgYS9nZGIvcmRpLXNoYXJlL2RyaXZlcnMuaCBiL2dkYi9yZGktc2hhcmUvZHJpdmVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NTVjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL2RyaXZlcnMuaApAQCAtMCwwICsxLDE5MyBAQAorLyogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgdXNlZCwgY29waWVkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzIHByZXNlcnZlZCBpbiBhbGwgY29waWVzIG9mIHRoZQorICogc29mdHdhcmUuCisgKi8KKworLyogLSotQy0qLQorICoKKyAqICRSZXZpc2lvbiQKKyAqICAgICAkRGF0ZSQKKyAqCisgKgorICogICBQcm9qZWN0OiBBTkdFTAorICoKKyAqICAgICBUaXRsZTogRGVmaW5pdGlvbnMgZm9yIGRldmljZSBkcml2ZXIgaW50ZXJmYWNlLgorICovCisjaWZuZGVmIGFuZ3NkX2RyaXZlcnNfaAorI2RlZmluZSBhbmdzZF9kcml2ZXJzX2gKKworI2luY2x1ZGUgInJ4dHguaCIKKworI2lmbmRlZiBfX2NwbHVzcGx1cwordHlwZWRlZiBzdHJ1Y3QgRGV2aWNlRGVzY3IgRGV2aWNlRGVzY3I7Cit0eXBlZGVmIHN0cnVjdCBEcml2ZXJDYWxsIERyaXZlckNhbGw7CisjZW5kaWYKKworLyoKKyAqIHVzZWQgdG8gcGFzcyBwYWNrZXRzIGFjcm9zcyB0aGUgZHJpdmVyIGludGVyZmFjZQorICovCitzdHJ1Y3QgRHJpdmVyQ2FsbAoreworICAgIHN0cnVjdCBkYXRhX3BhY2tldCAgZGNfcGFja2V0OworICAgIHZvaWQgICAgICAgICAgICAgICAqZGNfY29udGV4dDsKK307CisKKy8qCisgKiB1c2VkIHRvIGRlc2NyaWJlIGEgZGV2aWNlIGRyaXZlcgorICovCitzdHJ1Y3QgRGV2aWNlRGVzY3IKK3sKKyAgICBjaGFyICAqRGV2aWNlTmFtZTsKKyAgICBpbnQgICgqRGV2aWNlT3BlbikoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYXJnKTsKKyAgICBpbnQgICgqRGV2aWNlTWF0Y2gpKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmFyZyk7CisgICAgdm9pZCAoKkRldmljZUNsb3NlKSh2b2lkKTsKKyAgICBpbnQgICgqRGV2aWNlUmVhZCkoRHJpdmVyQ2FsbCAqZGMsIGJvb2wgYmxvY2spOworICAgIGludCAgKCpEZXZpY2VXcml0ZSkoRHJpdmVyQ2FsbCAqZGMpOworICAgIGludCAgKCpEZXZpY2VJb2N0bCkoY29uc3QgaW50IG9wY29kZSwgdm9pZCAqYXJncyk7CisgICAgdm9pZCAgKlN3aXRjaGVyU3RhdGU7ICAgICAgICAgICAgICAgLyogdXNlZCBieSBzd2l0Y2hlciBpbnRlcmZhY2UgKi8KK307CisKKy8qCisgKiAgRnVuY3Rpb246IERldmljZU9wZW4KKyAqCisgKiAgIFB1cnBvc2U6IE9wZW4gYSBjb21tdW5pY2F0aW9ucyBkZXZpY2UKKyAqCisgKiAgUHJlLWNvbmRpdGlvbnM6IE5vIHByZXZpb3VzIG9wZW4gaXMgc3RpbGwgYWN0aXZlCisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IG5hbWUgICAgSWRlbnRpZmllcyB3aGljaCBkZXZpY2UgdG8gb3Blbi4gIFRoaXMgY2FuIGVpdGhlciBiZQorICogICAgICAgICAgICAgICAgICAgICAgYSBob3N0IHNwZWNpZmljIGlkZW50aWZpZXIgKGUuZy4gIi9kZXYvdHR5YSIsCisgKiAgICAgICAgICAgICAgICAgICAgICAiQ09NMToiKSwgb3IgYSBudW1iZXIgd2hpY2ggaXMgdXNlZCB0byByZWZlciB0bworICogICAgICAgICAgICAgICAgICAgICAgYHN0YW5kYXJkJyBpbnRlcmZhY2VzLCBzbyAiMSIgd291bGQgYmUgdGhlIGZpcnN0IGhvc3QKKyAqICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSwgIjIiIHRoZSBzZWNvbmQsIGFuZCBzbyBvbi4KKyAqCisgKiAgICAgICAgICAgICAgYXJnICAgICBEcml2ZXIgc3BlY2lmaWMgYXJndW1lbnRzLiAgRm9yIGV4YW1wbGUsIHNvbWUgc2VyaWFsCisgKiAgICAgICAgICAgICAgICAgICAgICBkcml2ZXJzIGFjY2VwdCBzcGVlZCBhbmQgY29udHJvbCBhcmd1bWVudHMgc3VjaCBhcworICogICAgICAgICAgICAgICAgICAgICAgIjk2MDAiIG9yICIxOTIwMC9OT19CUkVBSyIuICBUaGVzZSBhcmd1bWVudHMgYXJlCisgKiAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWx5IGZyZWUtZm9ybTogaXQgaXMgdGhlIGluZGl2aWR1YWwgZHJpdmVycworICogICAgICAgICAgICAgICAgICAgICAgd2hpY2ggZG8gdGhlIG5lY2Vzc2FyeSBpbnRlcnByZXRhdGlvbi4KKyAqCisgKiAgIFJldHVybnM6CisgKiAgICAgICAgICBPSzogMAorICogICAgICAgRXJyb3I6IC0xCisgKi8KK2V4dGVybiBpbnQgRGV2aWNlT3Blbihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICphcmcpOworCisvKgorICogIEZ1bmN0aW9uOiBEZXZpY2VNYXRjaAorICoKKyAqICAgUHVycG9zZTogQ2hlY2sgd2hldGhlciBwYXJhbWV0ZXJzIGFyZSBPSyB0byBiZSBwYXNzZWQgdG8gRGV2aWNlT3BlbgorICoKKyAqICAgIFBhcmFtczoKKyAqICAgICAgIElucHV0OiBuYW1lICAgIElkZW50aWZpZXMgd2hpY2ggZGV2aWNlIHRvIG9wZW4uICBUaGlzIGNhbiBlaXRoZXIgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgIGEgaG9zdCBzcGVjaWZpYyBpZGVudGlmaWVyIChlLmcuICIvZGV2L3R0eWEiLAorICogICAgICAgICAgICAgICAgICAgICAgIkNPTTE6IiksIG9yIGEgbnVtYmVyIHdoaWNoIGlzIHVzZWQgdG8gcmVmZXIgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgIGBzdGFuZGFyZCcgaW50ZXJmYWNlcywgc28gIjEiIHdvdWxkIGJlIHRoZSBmaXJzdCBob3N0CisgKiAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UsICIyIiB0aGUgc2Vjb25kLCBhbmQgc28gb24uCisgKgorICogICAgICAgICAgICAgIGFyZyAgICAgRHJpdmVyIHNwZWNpZmljIGFyZ3VtZW50cy4gIEZvciBleGFtcGxlLCBzb21lIHNlcmlhbAorICogICAgICAgICAgICAgICAgICAgICAgZHJpdmVycyBhY2NlcHQgc3BlZWQgYW5kIGNvbnRyb2wgYXJndW1lbnRzIHN1Y2ggYXMKKyAqICAgICAgICAgICAgICAgICAgICAgICI5NjAwIiBvciAiMTkyMDAvTk9fQlJFQUsiLiAgVGhlc2UgYXJndW1lbnRzIGFyZQorICogICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVseSBmcmVlLWZvcm06IGl0IGlzIHRoZSBpbmRpdmlkdWFsIGRyaXZlcnMKKyAqICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGRvIHRoZSBuZWNlc3NhcnkgaW50ZXJwcmV0YXRpb24uCisgKgorICogICBSZXR1cm5zOgorICogICAgICAgICAgT0s6IDAKKyAqICAgICAgIEVycm9yOiAtMQorICovCitleHRlcm4gaW50IERldmljZU1hdGNoKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmFyZyk7CisKKy8qCisgKiAgRnVuY3Rpb246IERldmljZUNsb3NlCisgKgorICogICBQdXJwb3NlOiBDbG9zZSBhIGNvbW11bmljYXRpb25zIGRldmljZQorICoKKyAqICBQcmUtY29uZGl0aW9uczogRGV2aWNlIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgb3BlbmVkCisgKgorICogICAgUGFyYW1zOiBOb25lCisgKgorICogICBSZXR1cm5zOiBOb3RoaW5nCisgKi8KK2V4dGVybiB2b2lkIERldmljZUNsb3NlKHZvaWQpOworCisvKgorICogIEZ1bmN0aW9uOiBEZXZpY2VSZWFkCisgKgorICogICBQdXJwb3NlOiBUcnkgdG8gcmVhZCBhIGNvbXBsZXRlIHBhY2tldCBmcm9tIGEgY29tbXVuaWNhdGlvbnMgZGV2aWNlLgorICogICAgICAgICAgICAgIFRoaXMgcmVhZCBtdXN0IHVzdWFsbHkgYmUgbm9uLWJsb2NraW5nLCBpLmUuIGl0IHNob3VsZCByZWFkIGFzCisgKiAgICAgICAgICAgICAgbWFueSBkYXRhIGZyb20gdGhlIGRldmljZSBhcyBuZWVkZWQgdG8gY29tcGxldGUgdGhlIHBhY2tldCwKKyAqICAgICAgICAgICAgICBidXQgaXQgc2hvdWxkIG5vdCB3YWl0IGlmIHRoZSBwYWNrZXQgaXMgbm90IGNvbXBsZXRlLCBhbmQgbm8KKyAqICAgICAgICAgICAgICBtb3JlIGRhdGEgYXJlIGN1cnJlbnRseSBhdmFpbGFibGUgZnJvbSB0aGUgZGV2aWNlLgorICogICAgICAgICAgICBBcyBhbiBvcHRpbWlzYXRpb24gdGhlIHJlYWQgY2FuIG9wdGlvbmFsbHkgYmxvY2sgd2hlbiAnYmxvY2snCisgKiAgICAgICAgICAgICAgaXMgVFJVRSwgYnV0IG9ubHkgZm9yIGEgc2hvcnQgdGltZS4gIEl0IGlzIGFjY2VwdGFibGUgZm9yIHRoZQorICogICAgICAgICAgICAgICdibG9jaycgcGFyYW1ldGVyIHRvIGJlIGlnbm9yZWQgaW4gd2hpY2ggY2FzZSBhbGwgcmVhZHMKKyAqICAgICAgICAgICAgICBzaG91bGQgYmUgbm9uLWJsb2NraW5nLgorICoKKyAqICBQcmUtY29uZGl0aW9uczogRGV2aWNlIGhhcyBiZWVuIG9wZW5lZCB2aWEgRGV2aWNlT3BlbigpCisgKgorICogICAgUGFyYW1zOgorICogICAgICBJbi9PdXQ6IGRjICAgICAgRGVzY3JpYmVzIHRoZSBwYWNrZXQgYmVpbmcgcmVhZCAoZGMtPmRjX3BhY2tldCk7CisgKiAgICAgICAgICAgICAgICAgICAgICBkYy0+ZGNfY29udGV4dCBpcyBmb3IgdGhlIGRyaXZlciB0byBzdG9yZSBwcml2YXRlCisgKiAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBhbmQgaXMgZ3VhcmFudGVlZCB0byBiZSBOVUxMIHRoZSBmaXJzdAorICogICAgICAgICAgICAgICAgICAgICAgdGltZSBEZXZpY2VSZWFkIGlzIGNhbGxlZCBmb3IgYSBnaXZlbiBwYWNrZXQuCisgKgorICogICAgICAgICAgSW46IGJsb2NrICAgSWYgVFJVRSwgcmVhZCBtYXkgc2FmZWx5IGJsb2NrIGZvciBhIHNob3J0IHBlcmlvZAorICogICAgICAgICAgICAgICAgICAgICAgb2YgdGltZSAoc2F5IHVwIHRvIDIwbXMpLCB0byBhdm9pZCBoaWdoIENQVSBsb2FkCisgKiAgICAgICAgICAgICAgICAgICAgICB3aGlsc3Qgd2FpdGluZyBmb3IgYSByZXBseS4KKyAqICAgICAgICAgICAgICAgICAgICAgIElmIEZBTFNFLCByZWFkIE1VU1QgTk9UIGJsb2NrLgorICoKKyAqICAgUmV0dXJuczoKKyAqICAgICAgICAgIE9LOiAgMSAocGFja2V0IGlzIGNvbXBsZXRlKQorICogICAgICAgICAgICAgICAwIChwYWNrZXQgaXMgbm90IHlldCBjb21wbGV0ZSkKKyAqICAgICAgIEVycm9yOiAtMSBiYWQgcGFja2V0CisgKgorICogICBQb3N0LWNvbmRpdGlvbnM6IHNob3VsZCBhIGNhbGFtYXRvdXMgZXJyb3Igb2NjdXIgcGFuaWMoKSB3aWxsIGJlIGNhbGxlZAorICovCitleHRlcm4gaW50IERldmljZVJlYWQoRHJpdmVyQ2FsbCAqZGMsIGJvb2wgYmxvY2spOworCisvKgorICogIEZ1bmN0aW9uOiBEZXZpY2VXcml0ZQorICoKKyAqICAgUHVycG9zZTogVHJ5IHRvIHdyaXRlIGEgcGFja2V0IHRvIGEgY29tbXVuaWNhdGlvbnMgZGV2aWNlLiAgVGhpcyB3cml0ZQorICogICAgICAgICAgICAgIG11c3QgYmUgbm9uLWJsb2NraW5nLCBpLmUuIGl0IHNob3VsZCB3cml0ZSBhcyBtYW55IGRhdGEgdG8KKyAqICAgICAgICAgICAgICB0aGUgZGV2aWNlIGFzIGlzIGltbWVkaWF0ZWx5IHBvc3NpYmxlLCBidXQgc2hvdWxkIG5vdCB3YWl0CisgKiAgICAgICAgICAgICAgZm9yIHNwYWNlIHRvIHNlbmQgYW55IG1vcmUgYWZ0ZXIgdGhhdC4KKyAqCisgKiAgUHJlLWNvbmRpdGlvbnM6IERldmljZSBoYXMgYmVlbiBvcGVuZWQgdmlhIERldmljZU9wZW4oKQorICoKKyAqICAgIFBhcmFtczoKKyAqICAgICAgSW4vT3V0OiBkYyAgICAgIERlc2NyaWJlcyB0aGUgcGFja2V0IGJlaW5nIHdyaXR0ZW4gKGRjLT5kY19wYWNrZXQpOworICogICAgICAgICAgICAgICAgICAgICAgZGMtPmRjX2NvbnRleHQgaXMgZm9yIHRoZSBkcml2ZXIgdG8gc3RvcmUgcHJpdmF0ZQorICogICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgYW5kIGlzIGd1YXJhbnRlZWQgdG8gYmUgTlVMTCB0aGUgZmlyc3QKKyAqICAgICAgICAgICAgICAgICAgICAgIHRpbWUgRGV2aWNlV3JpdGUgaXMgY2FsbGVkIGZvciBhIGdpdmVuIHBhY2tldC4KKyAqCisgKiAgIFJldHVybnM6CisgKiAgICAgICAgICBPSzogIDEgKGFsbCBvZiB0aGUgcGFja2V0IGhhcyBiZWVuIHdyaXR0ZW4pCisgKiAgICAgICAgICAgICAgIDAgKHNvbWUgb2YgdGhlIHBhY2tldCByZW1haW5zIHRvIGJlIHdyaXR0ZW4pCisgKiAgICAgICBFcnJvcjogLTEKKyAqLworZXh0ZXJuIGludCBEZXZpY2VXcml0ZShEcml2ZXJDYWxsICpkYyk7CisKKy8qCisgKiAgRnVuY3Rpb246IERldmljZUlvY3RsCisgKgorICogICBQdXJwb3NlOiBQZXJmb3JtIG1pc2NlbGxhbmVvdXMgZHJpdmVyIG9wZXJhdGlvbnMKKyAqCisgKiAgUHJlLWNvbmRpdGlvbnM6IERldmljZSBoYXMgYmVlbiBvcGVuIHZpYSBEZXZpY2VPcGVuKCkKKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgICBJbnB1dDogb3Bjb2RlICBSZWFzb24gY29kZSBpbmRpY2F0aW5nIHRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybQorICogICAgICBJbi9PdXQ6IGFyZ3MgICAgUG9pbnRlciB0byBvcGNvZGUtc2Vuc2l0aXZlIGFyZ3VtZW50cy9yZXN1bHQgc3BhY2UKKyAqCisgKiAgIFJldHVybnM6CisgKiAgICAgICAgICBPSzogMAorICogICAgICAgRXJyb3I6IC0xCisgKi8KK2V4dGVybiBpbnQgRGV2aWNlSW9jdGwoY29uc3QgaW50IG9wY29kZSwgdm9pZCAqYXJncyk7CisKKyNlbmRpZiAvKiAhZGVmaW5lZChhbmdzZF9kcml2ZXJzX2gpICovCisKKy8qIEVPRiBkcml2ZXJzLmggKi8KZGlmZiAtLWdpdCBhL2dkYi9yZGktc2hhcmUvZW5kaWFuLmggYi9nZGIvcmRpLXNoYXJlL2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzJkOWEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL2VuZGlhbi5oCkBAIC0wLDAgKzEsMTI1IEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMTk5NSBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGZyZWVseSB1c2VkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaXMgcHJlc2VydmVkIGluIGFsbCBjb3BpZXMgb2YgdGhlCisgKiBzb2Z0d2FyZS4KKyAqLworCisvKiAtKi1DLSotCisgKgorICogJFJldmlzaW9uJAorICogICAgICREYXRlJAorICoKKyAqCisgKiBlbmRpYW4uaCAtIHRhcmdldCBlbmRpYW5uZXNzIGluZGVwZW5kZW50IHJlYWQvd3JpdGUgcHJpbWl0aXZlcy4KKyAqLworCisjaWZuZGVmIGFuZ2VsX2VuZGlhbl9oCisjZGVmaW5lIGFuZ2VsX2VuZGlhbl9oCisKKy8qCisgKiBUaGUgZW5kaWFubmVzcyBvZiB0aGUgZGF0YSBiZWluZyBwcm9jZXNzZWQgbmVlZHMgdG8gYmUga25vd24sIGJ1dAorICogdGhlIGhvc3QgZW5kaWFubmVzcyBpcyBub3QgcmVxdWlyZWQgKHNpbmNlIHRoZSBkYXRhIGlzIGNvbnN0cnVjdGVkCisgKiB1c2luZyBieXRlcykuICBBdCB0aGUgbW9tZW50IHRoZXNlIGFyZSBwcm92aWRlZCBhcyBtYWNyb3MuIFRoaXMKKyAqIGdpdmVzIHRoZSBjb21waWxlciBmcmVlZG9tIGluIG9wdGltaXNpbmcgaW5kaXZpZHVhbCBjYWxscy4gSG93ZXZlciwKKyAqIGlmIHNwYWNlIGlzIGF0IGEgcHJlbWl1bSB0aGVuIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHJvdmlkZWQuCisgKgorICogTk9URTogVGhlc2UgbWFjcm9zIGFzc3VtZSB0aGF0IHRoZSBkYXRhIGhhcyBiZWVuIHBhY2tlZCBpbiB0aGUgc2FtZSBmb3JtYXQKKyAqICAgICAgIGFzIHRoZSBwYWNraW5nIG9uIHRoZSBidWlsZCBob3N0LiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSB0aGVuCisgKiAgICAgICB0aGUgd3JvbmcgYWRkcmVzc2VzIGNvdWxkIGJlIHVzZWQgd2hlbiBkZWFsaW5nIHdpdGggc3RydWN0dXJlcy4KKyAqCisgKi8KKworLyoKKyAqIEZvciBhbGwgdGhlIGZvbGxvd2luZyByb3V0aW5lcyB0aGUgdGFyZ2V0IGVuZGlhbm5lc3MgaXMgZGVmaW5lZCBieSB0aGUKKyAqIGZvbGxvd2luZyBib29sZWFuIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIEJFICgxID09IDEpIC8qIFRSVUUgIDogYmlnLWVuZGlhbiAqLworI2RlZmluZSBMRSAoMSA9PSAwKSAvKiBGQUxTRSA6IGxpdHRsZS1lbmRpYW4gKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdHlwZSBkZWZpbml0aW9ucyBhcmUgdXNlZCBieSB0aGUgZW5kaWFubmVzcyBjb252ZXJ0aW5nCisgKiBtYWNyb3MuCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBVODsKK3R5cGVkZWYgVTggKlBfVTg7Cit0eXBlZGVmIGNvbnN0IFU4ICpDUF9VODsKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVMTY7Cit0eXBlZGVmIFUxNiAqUF9VMTY7CisKK3R5cGVkZWYgdW5zaWduZWQgaW50IFUzMjsKK3R5cGVkZWYgVTMyICpQX1UzMjsKKworLyoKKyAqIElmIHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBob3N0IGFuZCB0YXJnZXQgYXJlIGtub3duIChmaXhlZCkgYW5kIHRoZSBzYW1lCisgKiB0aGVuIHRoZSBmb2xsb3dpbmcgbWFjcm8gZGVmaW5pdGlvbnMgY2FuIGJlIHVzZWQuIFRoZXNlIGp1c3QgZGlyZWN0bHkgY29weQorICogdGhlIGRhdGEuCisgKgorICogI2RlZmluZSBSRUFEKGUsYSkgICAgICAgKGEpCisgKiAjZGVmaW5lIFdSSVRFKGUsYSx2KSAgICAoKGEpID0gKHYpKQorICogI2RlZmluZSBQUkVBRChlLGEpICAgICAgKGEpCisgKiAjZGVmaW5lIFBXUklURShlLGEsdikgICAoKihhKSA9ICh2KSkKKyAqLworCisvKgorICogVGhlc2UgbWFjcm9zIGFzc3VtZSB0aGF0IGEgYnl0ZSAoY2hhcikgaXMgOGJpdHMgaW4gc2l6ZSwgYW5kIHRoYXQgdGhlCisgKiBlbmRpYW5uZXNzIGlzIG5vdCBpbXBvcnRhbnQgd2hlbiByZWFkaW5nIG9yIHdyaXRpbmcgYnl0ZXMuCisgKi8KKyNkZWZpbmUgUFVUOChhLHYpICAgICAgICgqKChQX1U4KShhKSkgPSAoVTgpKHYpKQorI2RlZmluZSBQVVQxNkxFKGEsdikgICAgKFBVVDgoYSwoKHYpICYgMHhGRikpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgUFVUOCgoKChQX1U4KShhKSkgKyBzaXplb2YoY2hhcikpLCgodikgPj4gOCkpKQorI2RlZmluZSBQVVQxNkJFKGEsdikgICAgKFBVVDgoYSwoKHYpID4+IDgpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFBVVDgoKCgoUF9VOCkoYSkpICsgc2l6ZW9mKGNoYXIpKSwoKHYpICYgMHhGRikpKQorI2RlZmluZSBQVVQzMkxFKGEsdikgICAgKFBVVDE2TEUoYSx2KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFBVVDE2TEUoKCgoUF9VOCkoYSkpICsgc2l6ZW9mKHNob3J0KSksKCh2KSA+PiAxNikpKQorI2RlZmluZSBQVVQzMkJFKGEsdikgICAgKFBVVDE2QkUoYSwoKHYpID4+IDE2KSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQVVQxNkJFKCgoKFBfVTgpKGEpKSArIHNpemVvZihzaG9ydCkpLHYpKQorCisjZGVmaW5lIEdFVDgoYSkgICAgICgqKChDUF9VOCkoYSkpKQorI2RlZmluZSBHRVQxNkxFKGEpICAoR0VUOChhKSB8ICgoKFUxNilHRVQ4KCgoQ1BfVTgpKGEpKSArIHNpemVvZihjaGFyKSkpIDw8IDgpKQorI2RlZmluZSBHRVQxNkJFKGEpICAoKCgoVTE2KUdFVDgoYSkpIDw8IDgpIHwgR0VUOCgoKENQX1U4KShhKSkgKyBzaXplb2YoY2hhcikpKQorI2RlZmluZSBHRVQzMkxFKGEpICAoR0VUMTZMRShhKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICgoKFUzMilHRVQxNkxFKCgoQ1BfVTgpKGEpKSArIHNpemVvZihzaG9ydCkpKSA8PCAxNikpCisjZGVmaW5lIEdFVDMyQkUoYSkgICgoKChVMzIpR0VUMTZCRShhKSkgPDwgMTYpIHwgXAorICAgICAgICAgICAgICAgICAgICAgR0VUMTZCRSgoKENQX1U4KShhKSkgKyBzaXplb2Yoc2hvcnQpKSkKKworLyoKKyAqIFRoZXNlIG1hY3JvcyBzaW1wbGlmeSB0aGUgY29kZSBpbiByZXNwZWN0IHRvIHJlYWRpbmcgYW5kIHdyaXRpbmcgdGhlCisgKiBjb3JyZWN0IHNpemUgZGF0YSB3aGVuIGRlYWxpbmcgd2l0aCBlbmRpYW5uZXNzLiAiZSIgaXMgVFJVRSBpZiB3ZSBhcmUKKyAqIGRlYWxpbmcgd2l0aCBiaWctZW5kaWFuIGRhdGEsIEZBTFNFIGlmIHdlIGFyZSBkZWFsaW5nIHdpdGggbGl0dGxlLWVuZGlhbi4KKyAqLworCisvKiB2b2lkIFdSSVRFKGludCBlbmRpYW5uZXNzLCB2b2lkICphZGRyZXNzLCB1bnNpZ25lZCB2YWx1ZSk7ICovCisKKyNkZWZpbmUgV1JJVEUxNihlLGEsdikgKChlKSA/IFBVVDE2QkUoJihhKSx2KSA6IFBVVDE2TEUoJihhKSx2KSkKKyNkZWZpbmUgV1JJVEUzMihlLGEsdikgKChlKSA/IFBVVDMyQkUoJihhKSx2KSA6IFBVVDMyTEUoJihhKSx2KSkKKyNkZWZpbmUgV1JJVEUoZSxhLHYpICAgKChzaXplb2YodikgPT0gc2l6ZW9mKGNoYXIpKSA/IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVVDgoJihhKSx2KSA6ICgoc2l6ZW9mKHYpID09IHNpemVvZihzaG9ydCkpID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFMTYoZSxhLHYpIDogV1JJVEUzMihlLGEsdikpKQorCisvKiB1bnNpZ25lZCBSRUFEKGludCBlbmRpYW5uZXNzLCB2b2lkICphZGRyZXNzKSAqLworI2RlZmluZSBSRUFEMTYoZSxhKSAoKGUpID8gR0VUMTZCRSgmKGEpKSA6IEdFVDE2TEUoJihhKSkpCisjZGVmaW5lIFJFQUQzMihlLGEpICgoZSkgPyBHRVQzMkJFKCYoYSkpIDogR0VUMzJMRSgmKGEpKSkKKyNkZWZpbmUgUkVBRChlLGEpICgoc2l6ZW9mKGEpID09IHNpemVvZihjaGFyKSkgPyBcCisgICAgICAgICAgICAgICAgICAgR0VUOCgoQ1BfVTgpJihhKSkgOiAoKHNpemVvZihhKSA9PSBzaXplb2Yoc2hvcnQpKSA/IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUQxNihlLGEpIDogUkVBRDMyKGUsYSkpKQorCisvKiB2b2lkIFBXUklURShpbnQgZW5kaWFubmVzcywgdm9pZCAqYWRkcmVzcywgdW5zaWduZWQgdmFsdWUpOyAqLworI2RlZmluZSBQV1JJVEUxNihlLGEsdikgKChlKSA/IFBVVDE2QkUoYSx2KSA6IFBVVDE2TEUoYSx2KSkKKyNkZWZpbmUgUFdSSVRFMzIoZSxhLHYpICgoZSkgPyBQVVQzMkJFKGEsdikgOiBQVVQzMkxFKGEsdikpCisjZGVmaW5lIFBXUklURShlLGEsdikgICAoKHNpemVvZih2KSA9PSBzaXplb2YoY2hhcikpID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgIFBVVDgoYSx2KSA6ICgoc2l6ZW9mKHYpID09IHNpemVvZihzaG9ydCkpID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV1JJVEUxNihlLGEsdikgOiBQV1JJVEUzMihlLGEsdikpKQorCisvKiB1bnNpZ25lZCBQUkVBRChpbnQgZW5kaWFubmVzcywgdm9pZCAqYWRkcmVzcykgKi8KKyNkZWZpbmUgUFJFQUQxNihlLGEpICgoZSkgPyBHRVQxNkJFKGEpIDogR0VUMTZMRShhKSkKKyNkZWZpbmUgUFJFQUQzMihlLGEpICgoZSkgPyBHRVQzMkJFKGEpIDogR0VUMzJMRShhKSkKKyNkZWZpbmUgUFJFQUQoZSxhKSAoKHNpemVvZigqKGEpKSA9PSBzaXplb2YoY2hhcikpID8gXAorICAgICAgICAgICAgICAgICAgICBHRVQ4KChDUF9VOClhKSA6ICgoc2l6ZW9mKCooYSkpID09IHNpemVvZihzaG9ydCkpID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRUFEMTYoZSxhKSA6IFBSRUFEMzIoZSxhKSkpCisKKyNlbmRpZiAvKiAhZGVmaW5lZChhbmdlbF9lbmRpYW5faCkgKi8KKworLyogRU9GIGVuZGlhbi5oICovCmRpZmYgLS1naXQgYS9nZGIvcmRpLXNoYXJlL2V0aGVyZHJ2LmMgYi9nZGIvcmRpLXNoYXJlL2V0aGVyZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg0NjJkNAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZGktc2hhcmUvZXRoZXJkcnYuYwpAQCAtMCwwICsxLDczMCBAQAorLyogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgdXNlZCwgY29waWVkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzIHByZXNlcnZlZCBpbiBhbGwgY29waWVzIG9mIHRoZQorICogc29mdHdhcmUuCisgKi8KKworLyogLSotQy0qLQorICoKKyAqICRSZXZpc2lvbiQKKyAqICAgICAkRGF0ZSQKKyAqCisgKgorICogZXRoZXJkcnYuYyAtIEV0aGVybmV0IERyaXZlciBmb3IgQW5nZWwuCisgKi8KKworI2lmZGVmIF9faHB1eAorIyBkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCisjIGRlZmluZSBfSFBVWF9TT1VSQ0UgMQorIyBkZWZpbmUgX1hPUEVOX1NPVVJDRSAxCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgX19ocHV4CisjIGRlZmluZSB1aW50IGhpZGVfSFBzX3VpbnQKKyNlbmRpZgorI2lmZGVmIFNURENfSEVBREVSUworIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaWZkZWYgX19ocHV4CisjICAgdW5kZWYgdWludAorIyBlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgX19ocHV4CisjIGRlZmluZSB1aW50IGhpZGVfSFBzX3VpbnQKKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgX19ocHV4CisjIHVuZGVmIHVpbnQKKyNlbmRpZgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJob3N0LmgiCisKKyNpZmRlZiBDT01QSUxJTkdfT05fV0lORE9XUworICB0eXBlZGVmIGNoYXIgKiBjYWRkcl90OworIyB1bmRlZiBJR05PUkUKKyMgaW5jbHVkZSA8d2luc29jay5oPgorIyBpbmNsdWRlICJhbmdlbGRsbC5oIgorI2Vsc2UKKyMgaWZkZWYgX19ocHV4CisjICAgZGVmaW5lIHVpbnQgaGlkZV9IUHNfdWludAorIyBlbmRpZgorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorIyBpZmRlZiBfX2hwdXgKKyMgICB1bmRlZiB1aW50CisjIGVuZGlmCisjIGluY2x1ZGUgPG5ldGRiLmg+CisjIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgorIyBpZmRlZiBIQVZFX1NZU19GSUxJT19ICisjICAgaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMgaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgImhzeXMuaCIKKyNpbmNsdWRlICJkZXZpY2VzLmgiCisjaW5jbHVkZSAiZW5kaWFuLmgiCisjaW5jbHVkZSAiYnVmZmVycy5oIgorI2luY2x1ZGUgImhvc3RjaGFuLmgiCisjaW5jbHVkZSAicGFyYW1zLmgiCisjaW5jbHVkZSAibG9nZ2luZy5oIgorI2luY2x1ZGUgImV0aGVybmV0LmgiCisKKworI2lmICFkZWZpbmVkKENPTVBJTElOR19PTl9XSU5ET1dTKSAmJiAhZGVmaW5lZChTVERDX0hFQURFUlMpCisvKiBUaGVzZSB0d28gbWlnaHQgbm90IHdvcmsgZm9yIHdpbmRvd3MuICAqLworZXh0ZXJuIGludCBzeXNfbmVycjsKK2V4dGVybiBjaGFyICogc3lzX2Vycmxpc3RbXTsKKyNlbmRpZgorCisjaWZuZGVmIFVOVVNFRAorIyBkZWZpbmUgVU5VU0VEKHgpICh4ID0geCkgICAgICAvKiBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdzICovCisjZW5kaWYKKworLyoKKyAqIGZvcndhcmQgZGVjbGFyYXRpb25zIG9mIHN0YXRpYyBmdW5jdGlvbnMKKyAqLworc3RhdGljIGludCBFdGhlcm5ldE9wZW4oY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYXJnKTsKK3N0YXRpYyBpbnQgRXRoZXJuZXRNYXRjaChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICphcmcpOworc3RhdGljIHZvaWQgRXRoZXJuZXRDbG9zZSh2b2lkKTsKK3N0YXRpYyBpbnQgRXRoZXJuZXRSZWFkKERyaXZlckNhbGwgKmRjLCBib29sIGJsb2NrKTsKK3N0YXRpYyBpbnQgRXRoZXJuZXRXcml0ZShEcml2ZXJDYWxsICpkYyk7CitzdGF0aWMgaW50IEV0aGVybmV0SW9jdGwoY29uc3QgaW50IG9wY29kZSwgdm9pZCAqYXJncyk7CisKKy8qCisgKiB0aGUgZGV2aWNlIGRlc2NyaXB0b3IgZm9yIEV0aGVybmV0CisgKi8KK0RldmljZURlc2NyIGFuZ2VsX0V0aGVybmV0RGV2aWNlID0KK3sKKyAgICAiRXRoZXJuZXQiLAorICAgIEV0aGVybmV0T3BlbiwKKyAgICBFdGhlcm5ldE1hdGNoLAorICAgIEV0aGVybmV0Q2xvc2UsCisgICAgRXRoZXJuZXRSZWFkLAorICAgIEV0aGVybmV0V3JpdGUsCisgICAgRXRoZXJuZXRJb2N0bAorfTsKKworLyoKKyAqIGRlc2NyaXB0b3IgZm9yIHRoZSBzb2NrZXQgdGhhdCB3ZSB0YWxrIGRvd24KKyAqLworc3RhdGljIGludCBzb2NrID0gLTE7CisKKy8qCisgKiBhZGRyZXNzIG9mIHRoZSByZW1vdGUgdGFyZ2V0CisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlLCAqaWEgPSAmcmVtb3RlOworCisvKgorICogYXJyYXkgb2YgZHluYW1pYyBwb3J0IG51bWJlcnMgb24gdGFyZ2V0CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbnQgcG9ydHNbMl07CisKKy8qCisgKiAgRnVuY3Rpb246IHNldF9hZGRyZXNzCisgKiAgIFB1cnBvc2U6IFRyeSB0byBnZXQgYW4gYWRkcmVzcyBpbnRvIGFuIHVuZGVyc3RhbmRhYmxlIGZvcm0KKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgICBJbnB1dDogYWRkciAgICBUaGUgYWRkcmVzcyB0byBwYXJzZQorICoKKyAqICAgICAgT3V0cHV0OiBpYSAgICAgIFN0cnVjdHVyZSB0byBob2xkIHRoZSBwYXJzZWQgYWRkcmVzcworICoKKyAqICAgUmV0dXJuczoKKyAqICAgICAgICAgIE9LOiAgMAorICogICAgICAgRXJyb3I6IC0xCisgKi8KK3N0YXRpYyBpbnQgc2V0X2FkZHJlc3MoY29uc3QgY2hhciAqY29uc3QgYWRkciwgc3RydWN0IHNvY2thZGRyX2luICpjb25zdCBpYSkKK3sKKyAgICBpYS0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisKKyAgICAvKgorICAgICAqIFRyeSBhZGRyZXNzIGFzIGEgZG90dGVkIGRlY2ltYWwKKyAgICAgKi8KKyAgICBpYS0+c2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKGFkZHIpOworCisgICAgLyoKKyAgICAgKiBJZiB0aGF0IGZhaWxlZCwgdHJ5IGl0IGFzIGEgaG9zdG5hbWUKKyAgICAgKi8KKyAgICBpZiAoaWEtPnNpbl9hZGRyLnNfYWRkciA9PSAodV9pbnQpLTEpCisgICAgeworICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBnZXRob3N0YnluYW1lKGFkZHIpOworCisgICAgICAgIGlmIChocCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICh2b2lkKW1lbWNweSgoY2FkZHJfdCkmaWEtPnNpbl9hZGRyLCBocC0+aF9hZGRyLCBocC0+aF9sZW5ndGgpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKgorICogIEZ1bmN0aW9uOiBvcGVuX3NvY2tldAorICogICBQdXJwb3NlOiBPcGVuIGEgbm9uLWJsb2NraW5nIFVEUCBzb2NrZXQsIGFuZCBiaW5kIGl0IHRvIGEgcG9ydAorICogICAgICAgICAgICAgIGFzc2lnbmVkIGJ5IHRoZSBzeXN0ZW0uCisgKgorICogICAgUGFyYW1zOiBOb25lCisgKgorICogICBSZXR1cm5zOgorICogICAgICAgICAgT0s6IHNvY2tldCBkZXNjcmlwdG9yCisgKiAgICAgICBFcnJvcjogLTEKKyAqLworc3RhdGljIGludCBvcGVuX3NvY2tldCh2b2lkKQoreworICAgIGludCBzZmQ7CisjaWYgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlZSAjaWYgMCBqdXN0IGJlbG93IC1WVlYtICovCisgICAgaW50IHllc3BsZWFzZSA9IDE7CisjZW5kaWYKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbG9jYWw7CisKKyAgICAvKgorICAgICAqIG9wZW4gdGhlIHNvY2tldAorICAgICAqLworI2lmZGVmIENPTVBJTElOR19PTl9XSU5ET1dTCisgICAgaWYgKChzZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCkpID09IElOVkFMSURfU09DS0VUKQorICAgICAgICByZXR1cm4gLTE7CisjZWxzZQorICAgIGlmICgoc2ZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApKSA8IDApCisgICAgeworIyBpZmRlZiBERUJVRworICAgICAgICBwZXJyb3IoInNvY2tldCIpOworIyBlbmRpZgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIDk2MDczMSBLV2VsdG9uCisgICAgICoKKyAgICAgKiBJIGRvbid0IGJlbGlldmUgdGhhdCB0aGlzIHNob3VsZCBiZSBuZWNlc3NhcnkgLSBpZiB3ZQorICAgICAqIHVzZSBzZWxlY3QoKSwgdGhlbiBub24tYmxvY2tpbmcgSS9PIGlzIHJlZHVuZGFudC4KKyAgICAgKiBVbmZvcnR1bmF0ZWx5LCBzZWxlY3QoKSBhcHBlYXJzIHRvIGJlIGJyb2tlbiAodW5kZXIKKyAgICAgKiBTb2xhcmlzLCB3aXRoIGEgbGltaXRlZCBhbW91bnQgb2YgdGltZSBhdmFpbGFibGUgZm9yCisgICAgICogZGVidWcpLCBzbyB0aGlzIGNvZGUgc3RheXMgaW4gZm9yIHRoZSB0aW1lIGJlaW5nCisgICAgICovCisjaWYgMAorICAgIC8qCisgICAgICogZW5hYmxlIG5vbi1ibG9ja2luZyBJL08KKyAgICAgKi8KKyAgICBpZiAoaW9jdGxzb2NrZXQoc2ZkLCBGSU9OQklPLCAmeWVzcGxlYXNlKSA8IDApCisgICAgeworIyBpZmRlZiBERUJVRworICAgICAgICBwZXJyb3IoImlvY3RsKEZJT05CSU8pIik7CisjIGVuZGlmCisgICAgICAgIGNsb3Nlc29ja2V0KHNmZCk7CisKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyNlbmRpZiAvKiAwLzEgKi8KKworICAgIC8qCisgICAgICogYmluZCBsb2NhbCBhZGRyZXNzIHRvIGEgc3lzdGVtLWFzc2lnbmVkIHBvcnQKKyAgICAgKi8KKyAgICBtZW1zZXQoKGNoYXIgKikmbG9jYWwsIDAsIHNpemVvZihsb2NhbCkpOworICAgIGxvY2FsLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgIGxvY2FsLnNpbl9wb3J0ID0gaHRvbnMoMCk7CisgICAgbG9jYWwuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKyAgICBpZiAoYmluZChzZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmbG9jYWwsIHNpemVvZihsb2NhbCkpIDwgMCkKKyAgICB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgcGVycm9yKCJiaW5kIik7CisjZW5kaWYKKyAgICAgICAgY2xvc2Vzb2NrZXQoc2ZkKTsKKworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBhbGwgZG9uZQorICAgICAqLworICAgIHJldHVybiBzZmQ7Cit9CisKKy8qCisgKiAgRnVuY3Rpb246IGZldGNoX3BvcnRzCisgKiAgIFB1cnBvc2U6IFJlcXVlc3QgYXNzaWduZWQgcG9ydCBudW1iZXJzIGZyb20gcmVtb3RlIHRhcmdldAorICoKKyAqICAgIFBhcmFtczogTm9uZQorICoKKyAqICAgUmV0dXJuczogTm90aGluZworICoKKyAqIFBvc3QtY29uZGl0aW9uczogVGhpcyByb3V0aW5lIHdpbGwgKmFsd2F5cyogcmV0dXJuIHNvbWV0aGluZyBmb3IgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBwb3J0IG51bWJlcnMuICBJZiB0aGUgcmVtb3RlIHRhcmdldCBkb2VzIG5vdAorICogICAgICAgICAgICAgICAgICAgICAgcmVzcG9uZCwgdGhlbiBpdCBtYWtlcyBzb21ldGhpbmcgdXAgLSB0aGlzIGFsbG93cworICogICAgICAgICAgICAgICAgICAgICAgdGhlIHN0YW5kYXJkIGVycm9yIG1lc3NhZ2UgKGZyb20gYXJkaS5jKSB0byBiZQorICogICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gdGhlIHRhcmdldCBpcyBkZWFkIGZvciB3aGF0ZXZlcgorICogICAgICAgICAgICAgICAgICAgICAgcmVhc29uLgorICovCitzdGF0aWMgdm9pZCBmZXRjaF9wb3J0cyh2b2lkKQoreworICAgIGludCBpOworICAgIGNvbnN0IGNoYXIgY3RybHBhY2tldFtdID0gQ1RSTF9NQUdJQzsKKyAgICAgICAgQ3RybFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgLyoKKyAgICAgKiB3ZSB3aWxsIHRyeSAzIHRpbWVzIHRvIGVsaWNpdCBhIHJlc3BvbnNlIGZyb20gdGhlIHRhcmdldAorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpCisgICAgeworICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICAgICAgZmRfc2V0IGZkc2V0OworCisgICAgICAgIC8qCisgICAgICAgICAqIHNlbmQgdGhlIG1hZ2ljIHN0cmluZyB0byB0aGUgY29udHJvbAorICAgICAgICAgKiBwb3J0IG9uIHRoZSByZW1vdGUgdGFyZ2V0CisgICAgICAgICAqLworICAgICAgICBpYS0+c2luX3BvcnQgPSBodG9ucyhDVFJMX1BPUlQpOworICAgICAgICBpZiAoc2VuZHRvKHNvY2ssIGN0cmxwYWNrZXQsIHNpemVvZihjdHJscGFja2V0KSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKWlhLCBzaXplb2YoKmlhKSkgPCAwKQorICAgICAgICB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgIHBlcnJvcigiZmV0Y2hfcG9ydHM6IHNlbmR0byIpOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBGRF9aRVJPKCZmZHNldCk7CisgICAgICAgIEZEX1NFVChzb2NrLCAmZmRzZXQpOworICAgICAgICB0di50dl9zZWMgPSAwOworICAgICAgICB0di50dl91c2VjID0gMjUwMDAwOworCisgICAgICAgIGlmIChzZWxlY3Qoc29jayArIDEsICZmZHNldCwgTlVMTCwgTlVMTCwgJnR2KSA8IDApCisgICAgICAgIHsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgcGVycm9yKCJmZXRjaF9wb3J0czogc2VsZWN0Iik7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChGRF9JU1NFVChzb2NrLCAmZmRzZXQpKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogdGhlcmUgaXMgc29tZXRoaW5nIHRoZXJlIC0gcmVhZCBpdAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocmVjdihzb2NrLCAoY2hhciAqKSZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSwgMCkgPCAwKQorICAgICAgICAgICAgeworI2lmZGVmIENPTVBJTElOR19PTl9XSU5ET1dTCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHdlcnJubyA9IFdTQUdldExhc3RFcnJvcigpOworCisgICAgICAgICAgICAgICAgaWYgKHdlcnJubyA9PSBXU0FFV09VTERCTE9DSyB8fCB3ZXJybm8gPT0gMCkKKyNlbHNlCisgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVXT1VMREJMT0NLKQorI2VuZGlmCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworI2lmZGVmIERFQlVHCisgICAgICAgICAgICAgICAgICAgIHBlcnJvcigiZmV0Y2hfcG9ydHM6IHJlY3YiKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogWFhYCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiB0aGlzIGlzICp2ZXJ5KiB1bnBsZWFzYW50IC0gdHJ5IHRvIG1hdGNoIHRoZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICAgKiBsYXlvdXQKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqc3B0ciA9ICh1bnNpZ25lZCBzaG9ydCAqKShyZXNwb25zZSArIFJFU1BfREJVRyk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHJlc3BvbnNlLCBjdHJscGFja2V0KSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9ydHNbREJVR19JTkRFWF0gPSBodG9ucygqc3B0cik7CisgICAgICAgICAgICAgICAgICAgIHNwdHIrKzsKKyAgICAgICAgICAgICAgICAgICAgcG9ydHNbQVBQTF9JTkRFWF0gPSBodG9ucygqc3B0cik7CisgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgICAgICBwcmludGYoImZldGNoX3BvcnRzOiBnb3QgcmVzcG9uc2UsIERCVUc9JWQsIEFQUEw9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHBvcnRzW0RCVUdfSU5ERVhdLCBwb3J0c1tBUFBMX0lOREVYXSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIHdlIGZhaWxlZCB0byBnZXQgYSByZXNwb25zZQorICAgICAqLworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCJmZXRjaF9wb3J0czogZmFpbGVkIHRvIGdldCBhIHJlYWwgYW5zd2VyXG4iKTsKKyNlbmRpZgorfQorCisvKgorICogIEZ1bmN0aW9uOiByZWFkX3BhY2tldAorICogICBQdXJwb3NlOiByZWFkIGEgcGFja2V0LCBhbmQgcGFzcyBpdCBiYWNrIHRvIGhpZ2hlciBsZXZlbHMKKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgIEluL091dDogcGFja2V0ICBIb2xkZXIgZm9yIHRoZSByZWFkIHBhY2tldAorICoKKyAqICAgUmV0dXJuczogIDEgLSBQYWNrZXQgaXMgY29tcGxldGUKKyAqICAgICAgICAgICAgIDAgLSBObyBjb21wbGV0ZSBwYWNrZXQgcmVhZAorICoKKyAqIFBvc3QtY29uZGl0aW9uczogV2lsbCBjYWxsIHBhbmljKCkgaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgT1MKKyAqLworc3RhdGljIGludCByZWFkX3BhY2tldChzdHJ1Y3QgZGF0YV9wYWNrZXQgKmNvbnN0IHBhY2tldCkKK3sKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gZnJvbTsKKyAgICBpbnQgbmJ5dGVzLCBmcm9tbGVuID0gc2l6ZW9mKGZyb20pOworICAgIERldkNoYW5JRCBkZXZjaGFuOworCisgICAgLyoKKyAgICAgKiB0cnkgdG8gZ2V0IHRoZSBwYWNrZXQKKyAgICAgKi8KKyAgICBpZiAoKG5ieXRlcyA9IHJlY3Zmcm9tKHNvY2ssIChjaGFyICopKHBhY2tldC0+ZGF0YSksIHBhY2tldC0+YnVmX2xlbiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmZnJvbSwgJmZyb21sZW4pKSA8IDApCisgICAgeworI2lmZGVmIENPTVBJTElOR19PTl9XSU5ET1dTCisgICAgICAgIGlmIChuYnl0ZXMgPT0gU09DS0VUX0VSUk9SICYmIFdTQUdldExhc3RFcnJvcigpICE9IFdTQUVXT1VMREJMT0NLKQorICAgICAgICAgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLCAiRXJyb3IgcmVjZWl2aW5nIHBhY2tldFxuIiwgIkFuZ2VsIiwgTUJfT0sgfCBNQl9JQ09OU1RPUCk7CisjZWxzZQorICAgICAgICBpZiAoZXJybm8gIT0gRVdPVUxEQkxPQ0spCisgICAgICAgIHsKKyMgaWZkZWYgREVCVUcKKyAgICAgICAgICAgIHBlcnJvcigicmVjdiIpOworIyBlbmRpZgorICAgICAgICAgICAgcGFuaWMoImV0aGVybmV0IHJlY3YgZmFpbHVyZSIpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisjaWZkZWYgQ09NUElMSU5HX09OX1dJTkRPV1MKKyAgICBpZiAocGZuUHJvZ3Jlc3NDYWxsYmFjayAhPSBOVUxMICYmIG5ieXRlcyAhPSBTT0NLRVRfRVJST1IpCisgICAgeworICAgICAgICBwcm9ncmVzc0luZm8ublJlYWQgKz0gbmJ5dGVzOworICAgICAgICAoKnBmblByb2dyZXNzQ2FsbGJhY2spKCZwcm9ncmVzc0luZm8pOworICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiB3b3JrIG91dCB3aGVyZSB0aGUgcGFja2V0IHdhcyBmcm9tCisgICAgICovCisgICAgaWYgKGZyb20uc2luX2FkZHIuc19hZGRyICE9IHJlbW90ZS5zaW5fYWRkci5zX2FkZHIpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBub3QgZnJvbSBvdXIgdGFyZ2V0IC0gaWdub3JlIGl0CisgICAgICAgICAqLworI2lmZGVmIERFQlVHCisgICAgICAgIHByaW50ZigicmVhZF9wYWNrZXQ6IGlnbm9yaW5nIHBhY2tldCBmcm9tICVzXG4iLAorICAgICAgICAgICAgICAgaW5ldF9udG9hKGZyb20uc2luX2FkZHIpKTsKKyNlbmRpZgorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIGlmIChudG9ocyhmcm9tLnNpbl9wb3J0KSA9PSBwb3J0c1tEQlVHX0lOREVYXSkKKyAgICAgICAgZGV2Y2hhbiA9IERDX0RCVUc7CisgICAgZWxzZSBpZiAobnRvaHMoZnJvbS5zaW5fcG9ydCkgPT0gcG9ydHNbQVBQTF9JTkRFWF0pCisgICAgICAgIGRldmNoYW4gPSBEQ19BUFBMOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIHVua25vd24gcG9ydCBudW1iZXIgLSBpZ25vcmUgaXQKKyAgICAgICAgICovCisjaWZkZWYgREVCVUcKKyAgICAgICAgcHJpbnRmKCJyZWFkX3BhY2tldDogaWdub3JlIHBhY2tldCBmcm9tIHBvcnQgJWhkXG4iLAorICAgICAgICAgICAgICAgaHRvbnMoZnJvbS5zaW5fcG9ydCkpOworI2VuZGlmCisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisjaWYgZGVmaW5lZChERUJVRykgJiYgIWRlZmluZWQoRE9fVFJBQ0UpCisgICAgcHJpbnRmKCJFdGhlcm5ldFJlYWQ6ICVkIGJ5dGVzIGZyb20gJXMgY2hhbm5lbFxuIiwKKyAgICAgICAgICAgbmJ5dGVzLCAoZGV2Y2hhbiA9PSBEQ19EQlVHKSA/ICJEQlVHIiA6ICJBUFBMIik7CisjZW5kaWYKKworI2lmZGVmIERPX1RSQUNFCisgICAgcHJpbnRmKCJbJWQgb24gJWRdXG4iLCBuYnl0ZXMsIGRldmNoYW4pOworICAgIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB1bnNpZ25lZCBjaGFyICpjcHRyID0gcGFja2V0LT5kYXRhOworCisgICAgICAgIHdoaWxlIChpIDwgbmJ5dGVzKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoIjwlMDJYICIsICooY3B0cisrKSk7CisKKyAgICAgICAgICAgIGlmICghKCsraSAlIDE2KSkKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSAlIDE2KQorICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBPSyAtIGZpbGwgaW4gdGhlIGRldGFpbHMKKyAgICAgKi8KKyAgICBwYWNrZXQtPnR5cGUgPSBkZXZjaGFuOworICAgIHBhY2tldC0+bGVuID0gbmJ5dGVzOworICAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICBGdW5jdGlvbjogRXRoZXJuZXRfT3BlbgorICogICBQdXJwb3NlOiBPcGVuIHRoZSBFdGhlcm5ldCBkZXZpY2UuICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yCisgKiAgICAgICAgICAgICAgRGV2aWNlT3BlbiBpbiBkcml2ZXJzLmgKKyAqCisgKiBQb3N0LWNvbmRpdGlvbnM6IFdpbGwgaGF2ZSB1cGRhdGVkIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGUgKCppYSkKKyAqICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSB0YXJnZXQuCisgKi8KK3N0YXRpYyBpbnQgRXRoZXJuZXRPcGVuKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyNpZmRlZiBDT01QSUxJTkdfT05fV0lORE9XUworICAgIFdPUkQgd1ZlcnNpb25SZXF1ZXN0ZWQ7CisgICAgV1NBREFUQSB3c2FEYXRhOworI2VuZGlmCisgICAgLyoKKyAgICAgKiBuYW1lIGlzIHBhc3NlZCBhcyBlPTxibGFoPiwgc28gc2tpcCAxc3QgdHdvIGNoYXJhY3RlcnMKKyAgICAgKi8KKyAgICBjb25zdCBjaGFyICpldGhlcmFkZHIgPSBuYW1lICsgMjsKKworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCJFdGhlcm5ldE9wZW46IG5hbWUgYCVzJ1xuIiwgbmFtZSk7CisjZW5kaWYKKworICAgIC8qIENoZWNrIHRoYXQgdGhlIG5hbWUgaXMgYSB2YWxpZCBvbmUgKi8KKyAgICBpZiAoRXRoZXJuZXRNYXRjaChuYW1lLCBhcmcpICE9IDApCisgICAgICAgIHJldHVybiAtMTsKKworI2lmZGVmIENPTVBJTElOR19PTl9XSU5ET1dTCisgICAgd1ZlcnNpb25SZXF1ZXN0ZWQgPSBNQUtFV09SRCgxLCAxKTsKKyAgICBpZiAoV1NBU3RhcnR1cCh3VmVyc2lvblJlcXVlc3RlZCwgJndzYURhdGEpICE9IDApCisgICAgICAgIC8qCisgICAgICAgICAqIENvdWxkbid0IGZpbmQgYSB1c2VhYmxlIHdpbnNvY2suZGxsLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKCBMT0JZVEUoIHdzYURhdGEud1ZlcnNpb24gKSAhPSAxIHx8IEhJQllURSggd3NhRGF0YS53VmVyc2lvbiApICE9IDEgKQorICAgIHsKKyAgICAgICAgV1NBQ2xlYW51cCgpOworCisgICAgICAgIC8qCisgICAgICAgICAqIENvdWxkbid0IGZpbmQgYSB3aW5zb2NrLmRsbCB3aXRoIHN1cHBvcnRlZCB2ZXJzaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyNlbmRpZgorCisgICAgbWVtc2V0KChjaGFyICopaWEsIDAsIHNpemVvZigqaWEpKTsKKyAgICBpZiAoc2V0X2FkZHJlc3MoZXRoZXJhZGRyLCBpYSkgPCAwKQorICAgIHsKKyNpZmRlZiBDT01QSUxJTkdfT05fV0lORE9XUworICAgICAgICAvKgorICAgICAgICAgKiBTSiAtIEknbSBub3Qgc3VyZSB0aGF0IHRoaXMgaXMgdGhlIGNvcnJlY3Qgd2F5IHRvIGhhbmRsZSB0aGlzCisgICAgICAgICAqIGFzIEZhaWwgY2FsbHMgcmVtb3RlX2Rpc2FibGUgYW5kIGV4aXRzLCB3aGlsZSBwYW5pYyBqdXN0IGV4aXRzLgorICAgICAgICAgKiBIb3dldmVyIGF0IHRoZSB0aW1lIG9mIHdyaXRpbmcgcmVtb3RlX2Rpc2FibGUgZG9lcyBub3RoaW5nIQorICAgICAgICAgKi8KKyAvKiAgICAgUGFuaWMoIkV0aGVybmV0T3BlbjogYmFkIG5hbWUgYCVzJ1xuIiwgZXRoZXJhZGRyKTsgKi8KKyNlbHNlCisgICAgICAgIEZhaWwoIkV0aGVybmV0T3BlbjogYmFkIG5hbWUgYCVzJ1xuIiwgZXRoZXJhZGRyKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKChzb2NrID0gb3Blbl9zb2NrZXQoKSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKgorICAgICAqIGZldGNoIHRoZSBwb3J0IG51bWJlcnMgYXNzaWduZWQgYnkgdGhlIHJlbW90ZSB0YXJnZXQKKyAgICAgKiB0byBpdHMgRGVidWcgYW5kIEFwcGxpY2F0aW9uIHNvY2tldHMKKyAgICAgKi8KKyAgICBmZXRjaF9wb3J0cygpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRXRoZXJuZXRNYXRjaChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICphcmcpCit7CisgICAgLyogSUdOT1JFIGFyZyAqLworICAgIGlmICgwKQorICAgICAgICBhcmcgPSBhcmc7CisKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAodG9sb3dlcihuYW1lWzBdKSAhPSAnZScgfHwgbmFtZVsxXSAhPSAnPScpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBFdGhlcm5ldENsb3NlKHZvaWQpCit7CisgICAgaWYgKHNvY2sgPj0gMCkKKyAgICB7CisgICAgICAgIGNsb3Nlc29ja2V0KHNvY2spOworICAgICAgICBzb2NrID0gLTE7CisgICAgfQorCisjaWZkZWYgQ09NUElMSU5HX09OX1dJTkRPV1MKKyAgICBXU0FDbGVhbnVwKCk7CisjZW5kaWYKK30KKworc3RhdGljIGludCBFdGhlcm5ldFJlYWQoRHJpdmVyQ2FsbCAqZGMsIGJvb2wgYmxvY2spCit7CisgICAgZmRfc2V0IGZkc2V0OworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGludCBlcnI7CisKKyAgICBGRF9aRVJPKCZmZHNldCk7CisgICAgRkRfU0VUKHNvY2ssICZmZHNldCk7CisKKyNpZmRlZiBDT01QSUxJTkdfT05fV0lORE9XUworICAgIFVOVVNFRChibG9jayk7CisgICAgdHYudHZfc2VjID0gdHYudHZfdXNlYyA9IDA7CisjZWxzZQorICAgIHR2LnR2X3NlYyA9IDA7CisgICAgdHYudHZfdXNlYyA9IChibG9jayA/IDEwMDAwIDogMCk7CisjZW5kaWYKKworICAgIGVyciA9IHNlbGVjdChzb2NrICsgMSwgJmZkc2V0LCBOVUxMLCBOVUxMLCAmdHYpOworCisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIHBhbmljKCJldGhlcm5ldCBzZWxlY3QgZmFpbHVyZSAoZXJybm89JWkpIixlcnJubyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoRkRfSVNTRVQoc29jaywgJmZkc2V0KSkKKyAgICAgIHJldHVybiByZWFkX3BhY2tldCgmZGMtPmRjX3BhY2tldCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRXRoZXJuZXRXcml0ZShEcml2ZXJDYWxsICpkYykKK3sKKyAgICBpbnQgbmJ5dGVzOworICAgIHN0cnVjdCBkYXRhX3BhY2tldCAqcGFja2V0ID0gJmRjLT5kY19wYWNrZXQ7CisKKyAgICBpZiAocGFja2V0LT50eXBlID09IERDX0RCVUcpCisgICAgICAgIGlhLT5zaW5fcG9ydCA9IGh0b25zKHBvcnRzW0RCVUdfSU5ERVhdKTsKKyAgICBlbHNlIGlmIChwYWNrZXQtPnR5cGUgPT0gRENfQVBQTCkKKyAgICAgICAgaWEtPnNpbl9wb3J0ID0gaHRvbnMocG9ydHNbQVBQTF9JTkRFWF0pOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBhbmljKCJFdGhlcm5ldFdyaXRlOiB1bmtub3duIGRldmNoYW4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisjaWYgZGVmaW5lZChERUJVRykgJiYgIWRlZmluZWQoRE9fVFJBQ0UpCisgICAgcHJpbnRmKCJFdGhlcm5ldFdyaXRlOiAlZCBieXRlcyB0byAlcyBjaGFubmVsXG4iLAorICAgICAgICAgICBwYWNrZXQtPmxlbiwgKHBhY2tldC0+dHlwZSA9PSBEQ19EQlVHKSA/ICJEQlVHIiA6ICJBUFBMIik7CisjZW5kaWYKKworI2lmZGVmIERPX1RSQUNFCisgICAgcHJpbnRmKCJbJWQgb24gJWRdXG4iLCBwYWNrZXQtPmxlbiwgcGFja2V0LT50eXBlKTsKKyAgICB7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqY3B0ciA9IHBhY2tldC0+ZGF0YTsKKworICAgICAgICB3aGlsZSAoaSA8IHBhY2tldC0+bGVuKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoIj4lMDJYICIsICooY3B0cisrKSk7CisKKyAgICAgICAgICAgIGlmICghKCsraSAlIDE2KSkKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSAlIDE2KQorICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKChuYnl0ZXMgPSBzZW5kdG8oc29jaywgKGNoYXIgKikocGFja2V0LT5kYXRhKSwgcGFja2V0LT5sZW4sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKWlhLCBzaXplb2YoKmlhKSkpICE9IHBhY2tldC0+bGVuKQorICAgIHsKKyNpZmRlZiBDT01QSUxJTkdfT05fV0lORE9XUworICAgICAgICBpZiAobmJ5dGVzID09IFNPQ0tFVF9FUlJPUiAmJiBXU0FHZXRMYXN0RXJyb3IoKSAhPSBXU0FFV09VTERCTE9DSykKKyNlbHNlCisgICAgICAgIGlmIChuYnl0ZXMgPCAwICYmIGVycm5vICE9IEVXT1VMREJMT0NLKQorI2VuZGlmCisgICAgICAgIHsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgcGVycm9yKCJzZW5kdG8iKTsKKyNlbmRpZgorCisjaWZkZWYgQ09NUElMSU5HX09OX1dJTkRPV1MKKyAgICAgICAgICAgIHBhbmljKCJldGhlcm5ldCBzZW5kIGZhaWx1cmVcbiIpOworI2Vsc2UKKyAgICAgICAgICAgIC8qIG1pZ2h0IG5vdCB3b3JrIGZvciBXaW5kb3dzICovCisgICAgICAgICAgICBwYW5pYygiZXRoZXJuZXQgc2VuZCBmYWlsdXJlIFslc11cbiIsCisjaWZkZWYgU1REQ19IRUFERVJTCisJCSAgc3RyZXJyb3IoZXJybm8pKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICBlcnJubyA8IHN5c19uZXJyID8gc3lzX2Vycmxpc3RbZXJybm9dIDogInVua25vd24gZXJybm8iKTsKKyNlbmRpZiAvKiBTVERDX0hFQURFUlMgKi8KKyNlbmRpZgorICAgICAgICB9CisjaWZkZWYgREVCVUcKKyAgICAgICAgZWxzZSBpZiAobmJ5dGVzID49IDApCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImV0aGVybmV0IHNlbmQ6IGFza2VkIGZvciAlZCwgc2VudCAlZFxuIiwgcGFja2V0LT5sZW4sIG5ieXRlcyk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisjaWZkZWYgQ09NUElMSU5HX09OX1dJTkRPV1MKKyAgICBpZiAocGZuUHJvZ3Jlc3NDYWxsYmFjayAhPSBOVUxMICYmIG5ieXRlcyAhPSBTT0NLRVRfRVJST1IpCisgICAgeworICAgICAgICBwcm9ncmVzc0luZm8ubldyaXR0ZW4gKz0gbmJ5dGVzOworICAgICAgICAoKnBmblByb2dyZXNzQ2FsbGJhY2spKCZwcm9ncmVzc0luZm8pOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgRXRoZXJuZXRJb2N0bChjb25zdCBpbnQgb3Bjb2RlLCB2b2lkICphcmdzKQoreworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCAiRXRoZXJuZXRJb2N0bDogb3AgJWQgYXJnICV4XG4iLCBvcGNvZGUsIGFyZ3MgKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBJR05PUkUob3Bjb2RlKQorICAgICAqLworICAgIGlmICgwKQorICAgIHsKKyAgICAgICAgaW50IGR1bW15ID0gb3Bjb2RlOworICAgICAgICBVTlVTRUQoZHVtbXkpOworICAgIH0KKyAgICBVTlVTRUQoYXJncyk7CisKKyAgICBzd2l0Y2ggKCBvcGNvZGUgKQorICAgIHsKKyAgICAgICAgY2FzZSBEQ19SRVNZTkM6CisgICAgICAgIHsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgcHJpbnRmKCAiRXRoZXJuZXRJb2N0bDogcmVzeW5jXG4iICk7CisjZW5kaWYKKyAgICAgICAgICAgIGZldGNoX3BvcnRzKCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogRU9GIGV0aGVyZHJ2LmMgKi8KZGlmZiAtLWdpdCBhL2dkYi9yZGktc2hhcmUvZXRoZXJuZXQuaCBiL2dkYi9yZGktc2hhcmUvZXRoZXJuZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzBhY2VkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9ldGhlcm5ldC5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qIC0qLUMtKi0KKyAqCisgKiAkUmV2aXNpb24kCisgKiAgICAgJERhdGUkCisgKgorICoKKyAqIGV0aGVybmV0Lmg6ICBBbmdlbCBkcml2ZXJzIGZvciBFdGhlcm5ldCB1c2luZyBGdXNpb24gVURQL0lQIHN0YWNrCisgKi8KKyNpZm5kZWYgYW5nZWxfZXRoZXJuZXRfaAorI2RlZmluZSBhbmdlbF9ldGhlcm5ldF9oCisKKy8qCisgKiB0aGUgVURQIHBvcnRzIHRoYXQgQW5nZWwgRXRoZXJuZXQgdXNlcworICovCisjZGVmaW5lIENUUkxfUE9SVCAgICAgICAxOTEzCisKKy8qCisgKiB0aGUgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBwYWNrZXQgYWNjZXB0ZWQgb24gdGhlIGNvbnRyb2wgc29ja2V0CisgKi8KKyNkZWZpbmUgQ1RSTF9NQVhQQUNLRVQgIDYKKworLyoKKyAqIFRoaXMgaXMgdGhlICJtYWdpYyBudW1iZXIiIHNlbnQgdG8gdGhlIGNvbnRyb2wgcG9ydCB0bworICogcmVxdWVzdCB0aGF0IHRoZSBjaGFubmVsIHBvcnQgbnVtYmVycyBhcmUgcmV0dXJuZWQKKyAqLworI2RlZmluZSBDVFJMX01BR0lDICAgICAgIkFuZ2VsIgorCisvKgorICogQXJyYXkgdXNlZCBmb3IgcmVzcG9uZGluZyB0byBhIHJlcXVlc3Qgb24gdGhlIGNvbnRyb2wgcG9ydAorICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgQ3RybFJlc3BvbnNlWzEwXTsKKyNkZWZpbmUgUkVTUF9NQUdJQyAwCisjZGVmaW5lIFJFU1BfREJVRyAgNgorI2RlZmluZSBSRVNQX0FQUEwgIDgKKworLyoKKyAqIGluZGljZXMgZm9yIGFjY2Vzc2luZyB0aGUgYXJyYXkgb2YgcG9ydCBudW1iZXJzIHNlbnQKKyAqIG92ZXIgdGhlIGNvbnRyb2wgc29ja2V0CisgKi8KKyNkZWZpbmUgREJVR19JTkRFWCAgICAgIDAKKyNkZWZpbmUgQVBQTF9JTkRFWCAgICAgIDEKKworI2lmZGVmIFRBUkdFVAorCisjIGluY2x1ZGUgImRldmRyaXYuaCIKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBhbmdlbF9EZXZpY2VFbnRyeSBhbmdlbF9FdGhlcm5ldERldmljZTsKKworLyoKKyAqICBGdW5jdGlvbjogYW5nZWxfRXRoZXJuZXRQb2xsCisgKiAgIFB1cnBvc2U6IFBvbGwgRnVzaW9uIGZvciBuZXdseSBhcnJpdmVkIHBhY2tldHMKKyAqCisgKiAgUHJlLWNvbmRpdGlvbnM6IENhbGxlZCBpbiBTVkMgbW9kZSB3aXRoIHRoZSBsb2NrCisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IGRhdGEgICAgSUdOT1JFJ2QKKyAqCisgKiAgIFJldHVybnM6IE5vdGhpbmcKKyAqCisgKiBQb3N0LWNvbmRpdGlvbnM6IFdpbGwgaGF2ZSBwYXNzZWQgYW55IHBhY2tldHMgcmVjZWl2ZWQgYWxvbmcgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgIGhpZ2hlciBsZXZlbHMKKyAqLwordm9pZCBhbmdlbF9FdGhlcm5ldFBvbGwodW5zaWduZWQgaW50IGRhdGEpOworCit2b2lkIGFuZ2VsX0V0aGVybmV0Tk9QKHVuc2lnbmVkIGludCBkYXRhKTsKKworCisvKgorICogIEZ1bmN0aW9uOiBhbmdlbF9GaW5kRXRoZXJuZXRDb25maWdCbG9jaworICogICBQdXJwb3NlOiBTZWFyY2ggdGhlIEZsYXNoIGZvciBhbiBldGhlcm5ldCBjb25maWcgYmxvY2sgYW5kIHJldHVybgorICogICAgICAgICAgICBpdCBpZiBmb3VuZC4KKyAqCisgKiAgICBQYXJhbXM6IE5vbmUKKyAqCisgKiAgIFJldHVybnM6IE5VTEwgaWYgbm8gY29uZmlnIGJsb2NrIGZvdW5kLCB0aGUgYWRkcmVzcyBpZiBvbmUgaXMgZm91bmQuCisgKgorICovCitleHRlcm4gYW5nZWxfRXRoZXJuZXRDb25maWdCbG9jayAqYW5nZWxfRmluZEV0aGVybmV0Q29uZmlnQmxvY2sodm9pZCk7CisKKyNlbHNlIC8qIGRlZiBUQVJHRVQgKi8KKworIyBpZm5kZWYgQ09NUElMSU5HX09OX1dJTkRPV1MKKyMgIGRlZmluZSBpb2N0bHNvY2tldCh4LCB5LCB6KSAgaW9jdGwoKHgpLCAoeSksICh6KSkKKyMgIGRlZmluZSBjbG9zZXNvY2tldCh4KSAgICAgICAgY2xvc2UoeCkKKyMgZW5kaWYKKworI2VuZGlmIC8qIGRlZiBUQVJHRVQgKi8KKworI2VuZGlmIC8qIG5kZWYgYW5nZWxfZXRoZXJuZXRfaCAqLworCisvKiBFT0YgZXRoZXJuZXQuaCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9ob3N0LmggYi9nZGIvcmRpLXNoYXJlL2hvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGZmYTg0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9ob3N0LmgKQEAgLTAsMCArMSwyMzAgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKworI2lmbmRlZiBfaG9zdF9MT0FERUQKKyNkZWZpbmUgX2hvc3RfTE9BREVEIDEKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZm5kZWYgU0VFS19TRVQKKyMgIGRlZmluZSBTRUVLX1NFVCAgMAorI2VuZGlmCisjaWZuZGVmIFNFRUtfQ1VSCisjICBkZWZpbmUgU0VFS19DVVIgIDEKKyNlbmRpZgorI2lmbmRlZiBTRUVLX0VORAorIyAgZGVmaW5lIFNFRUtfRU5EICAyCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBmb3IgdGhlIGJlbmVmaXQgb2YgY29tcGlsaW5nIG9uIFN1bk9TICovCisjaWZuZGVmIG9mZnNldG9mCisjICBkZWZpbmUgb2Zmc2V0b2YoVCwgbWVtYmVyKSAgKChjaGFyICopJigoKFQgKikwKS0+bWVtYmVyKSAtIChjaGFyICopMCkKKyNlbmRpZgorCisvKiBJZiB1bmRlciBDeWd3aW4sIHByb3ZpZGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlcgorICAgQ3lnd2luIGNvbXBpbGVycyB0aGF0IGRvbid0IGRlZmluZSB0aGUgY3VycmVudCBjcHAgZGVmaW5lLiAqLworI2lmZGVmIF9fQ1lHV0lOMzJfXworI2lmbmRlZiBfX0NZR1dJTl9fCisjZGVmaW5lIF9fQ1lHV0lOX18KKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiB1bml4ICAgICAgICAgICAgICAgICAgIC8qIEEgdGVtcG9yYXJ5IHNvcCB0byBvbGRlciBjb21waWxlcnMgKi8KKyMgIGlmbmRlZiBfX3VuaXggICAgICAgICAgICAgIC8qIChnb29kIGZvciBsb25nLXRlcm0gcG9ydGFiaWxpdHk/KSAgKi8KKyMgICAgZGVmaW5lIF9fdW5peCAgICAxCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX3VuaXgKKy8qIEdlbmVyaWMgdW5peCAtLSBob3BlZnVsbHkgYSBzcGxpdCBpbnRvIG90aGVyIHZhcmlhbnRzIHdpbGwgbm90IGJlICAgICovCisvKiBuZWVkZWQuICBIb3dldmVyLCBiZXdhcmUgdGhlICdic2QnIHRlc3QgYWJvdmUgYW5kIHNhZmVfdG91cHBlciBldGMuICAqLworLyogd2hpY2ggY29wZSB3aXRoIGJhY2t3YXJkcyAocHJlLXBvc2l4L1gvb3BlbikgdW5peCBjb21wYXRpbGl0eS4gICAgICAgKi8KKyMgIGRlZmluZSBDT01QSUxJTkdfT05fVU5JWCAgICAgMQorI2VuZGlmCisjaWYgZGVmaW5lZChfV0lOMzIpCisjICBkZWZpbmUgQ09NUElMSU5HX09OX1dJTjMyICAgIDEKKyMgIGlmICFkZWZpbmVkKF9fQ1lHV0lOMzJfXykKKyMgICAgZGVmaW5lIENPTVBJTElOR19PTl9XSU5ET1dTICAxCisjICBlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChfQ09OU09MRSkKKyMgIGRlZmluZSBDT01QSUxJTkdfT05fV0lORE9XU19DT05TT0xFIDEKKyMgIGRlZmluZSBDT01QSUxJTkdfT05fV0lORE9XUyAxCisjZW5kaWYKKyNpZmRlZiBfTVNDX1ZFUgorIyAgZGVmaW5lIENPTVBJTElOR19PTl9NU0RPUyAgICAxCisjICBkZWZpbmUgQ09NUElMSU5HX09OX1dJTkRPV1MgIDEKKyMgIGlmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjICAgIGRlZmluZSBJTVBMRU1FTlRfQk9PTF9BU19JTlQgMSAvKiBWQysrIGRvZXNuJ3QgaGF2ZSAnYm9vbCcgKHlldCkgKi8KKyMgIGVuZGlmCisjZW5kaWYKKy8qIFRoZSAnKGRlZmluZWQoX19zcGFyYykgJiYgZGVmaW5lZChQX3RtcGRpcikgICAgICAgICAgICAgICAgICAgICAqLworLyogJiYgIWRlZmluZWQoX19zdnI0X18pKScgaXMgdG8gZGV0ZWN0IGdjYyBvbiBTdW5PUy4gICAgICAgICAgICAgICovCisvKiBDKysgY29tcGlsZXJzIGRvbid0IGhhdmUgdG8gZGVmaW5lIF9fU1REQ19fICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZiAoZGVmaW5lZChfX3NwYXJjKSAmJiBkZWZpbmVkKFBfdG1wZGlyKSkKKyMgIGlmIGRlZmluZWQoX19zdnI0X18pCisjICAgIGRlZmluZSBDT01QSUxJTkdfT05fU09MQVJJUworIyAgZWxzZQorIyAgICBkZWZpbmUgQ09NUElMSU5HX09OX1NVTk9TCisjICBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19ocHBhCisjICBkZWZpbmUgQ09NUElMSU5HX09OX0hQVVgKKyNlbmRpZgorCisvKgorICogVGhlIGZvbGxvd2luZyB0eXBlZGVmcyBtYXkgbmVlZCBhbHRlcmF0aW9uIGZvciBvYnNjdXJlIGhvc3QgbWFjaGluZXMuCisgKi8KKyNpZiBkZWZpbmVkKF9fYWxwaGEpICYmIGRlZmluZWQoX19vc2ZfXykgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBVbmRlciBPU0YgdGhlIGFscGhhIGhhcyA2NC1iaXQgcG9pbnRlcnMgYW5kIDY0LWJpdCBsb25ncy4gICAgICAgICAgICAqLwordHlwZWRlZiAgICAgICAgICAgICAgICBpbnQgICBpbnQzMjsKK3R5cGVkZWYgdW5zaWduZWQgICAgICAgaW50ICAgdW5zaWduZWQzMjsKKy8qIElQdHIgYW5kIFVQdHIgYXJlICdpbnRzIG9mIHNhbWUgc2l6ZSBhcyBwb2ludGVyJy4gIERvIG5vdCB1c2UgaW4gICAgICovCisvKiBuZXcgY29kZS4gIEN1cnJlbnRseSBvbmx5IHVzZWQgd2l0aGluICduY2MnLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwordHlwZWRlZiAgICAgICAgICBsb25nICBpbnQgICBJUHRyOwordHlwZWRlZiB1bnNpZ25lZCBsb25nICBpbnQgICBVUHRyOworCisjZWxzZSAvKiBhbGwgaG9zdHMgZXhjZXB0IGFscGhhIHVuZGVyIE9TRiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCit0eXBlZGVmICAgICAgICAgIGxvbmcgIGludCAgIGludDMyOwordHlwZWRlZiB1bnNpZ25lZCBsb25nICBpbnQgICB1bnNpZ25lZDMyOworLyogSVB0ciBhbmQgVVB0ciBhcmUgJ2ludHMgb2Ygc2FtZSBzaXplIGFzIHBvaW50ZXInLiAgRG8gbm90IHVzZSBpbiAgICAgKi8KKy8qIG5ldyBjb2RlLiAgQ3VycmVudGx5IG9ubHkgdXNlZCB3aXRoaW4gJ25jYycuICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElQdHIgaW50MzIKKyNkZWZpbmUgVVB0ciB1bnNpZ25lZDMyCisjZW5kaWYgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCit0eXBlZGVmICAgICAgICAgIHNob3J0IGludCAgIGludDE2OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgICB1bnNpZ25lZDE2OwordHlwZWRlZiAgIHNpZ25lZCAgICAgICBjaGFyICBpbnQ4OwordHlwZWRlZiB1bnNpZ25lZCAgICAgICBjaGFyICB1bnNpZ25lZDg7CisKKy8qIFRoZSBmb2xsb3dpbmcgY29kZSBkZWZpbmVzIHRoZSAnYm9vbCcgdHlwZSB0byBiZSAnaW50JyB1bmRlciBDICAgICAgICovCisvKiBhbmQgcmVhbCAnYm9vbCcgdW5kZXIgQysrLiAgSXQgYWxzbyBhdm9pZHMgd2FybmluZ3Mgc3VjaCBhcyAgICAgICAgICAqLworLyogQysrIGtleXdvcmQgJ2Jvb2wnIHVzZWQgYXMgaWRlbnRpZmllci4gIEl0IGNhbiBiZSBvdmVycmlkZGVuIGJ5ICAgICAgKi8KKy8qIGRlZmluaW5nIElNUExFTUVOVF9CT09MX0FTX0VOVU0gb3IgSU1QTEVNRU5UX0JPT0xfQVNfSU5ULiAgICAgICAgICAgICovCisjdW5kZWYgX2Jvb2wKKworI2lmZGVmIElNUExFTUVOVF9CT09MX0FTX0VOVU0KKyAgIGVudW0gX2Jvb2wgeyBfZmFsc2UsIF90cnVlIH07CisjICBkZWZpbmUgX2Jvb2wgZW51bSBfYm9vbAorI2VsaWYgZGVmaW5lZChJTVBMRU1FTlRfQk9PTF9BU19JTlQpIHx8ICFkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgZGVmaW5lIF9ib29sIGludAorIyAgZGVmaW5lIF9mYWxzZSAwCisjICBkZWZpbmUgX3RydWUgMQorI2VuZGlmCisKKyNpZmRlZiBfYm9vbAorIyAgaWYgZGVmaW5lZChfTUZDX1ZFUikgfHwgZGVmaW5lZChfX0NDX05PUkNST0ZUKSAvKiBXaGVuIHVzaW5nIE1TIFZpc3VhbCBDL0MrKyB2NC4yICovCisjICAgIGRlZmluZSBib29sIF9ib29sIC8qIGF2b2lkcyAiJ2Jvb2wnIGlzIHJlc2VydmVkIHdvcmQiIHdhcm5pbmcgICAgICAqLworIyAgZWxzZQorICAgICB0eXBlZGVmIF9ib29sIGJvb2w7CisjICBlbmRpZgorIyAgZGVmaW5lIHRydWUgX3RydWUKKyMgIGRlZmluZSBmYWxzZSBfZmFsc2UKKyNlbmRpZgorCisjZGVmaW5lIFlFUyAgIHRydWUKKyNkZWZpbmUgTk8gICAgZmFsc2UKKyN1bmRlZiBUUlVFICAgICAgICAgICAgIC8qIHNvbWUgT1NGIGhlYWRlcnMgZGVmaW5lIGFzIDEgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRSVUUgIHRydWUKKyN1bmRlZiBGQUxTRSAgICAgICAgICAgIC8qIHNvbWUgT1NGIGhlYWRlcnMgZGVmaW5lIGFzIDEgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZBTFNFIGZhbHNlCisKKy8qICd1aW50JyBjb25mbGljdHMgd2l0aCBzb21lIFVuaXhlbiBzeXMvdHlwZXMuaCwgc28gd2Ugbm93IGRvbid0IGRlZmluZSBpdCAqLwordHlwZWRlZiB1bnNpZ25lZDggIHVpbnQ4OwordHlwZWRlZiB1bnNpZ25lZDE2IHVpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQzMiB1aW50MzI7CisKK3R5cGVkZWYgdW5zaWduZWQgICBVaW50OwordHlwZWRlZiB1bnNpZ25lZDggIFVpbnQ4OwordHlwZWRlZiB1bnNpZ25lZDE2IFVpbnQxNjsKK3R5cGVkZWYgdW5zaWduZWQzMiBVaW50MzI7CisKKyNpZmRlZiBBTFBIQV9UQVNPX1NIT1JUX09OX09TRiAvKiB3YXMgX19hbHBoYSAmJiBfX29zZi4gICAgICAgICAgICAgICAgICovCisvKiBUaGUgZm9sbG93aW5nIHNldHMgQXJndlR5cGUgZm9yIDY0LWJpdCBwb2ludGVycyBzbyB0aGF0ICAgICAgICAgICAgICAqLworLyogREVDIFVuaXggKE9TRikgY2MgY2FuIGJlIHVzZWQgd2l0aCB0aGUgLXh0YXNvX3Nob3J0IGNvbXBpbGVyIG9wdGlvbiAgKi8KKy8qIHRvIGZvcmNlIHBvaW50ZXJzIHRvIGJlIDMyLWJpdC4gIE5vdCBjdXJyZW50bHkgdXNlZCBzaW5jZSBtb3N0L2FsbCAgICovCisvKiBBUk0gdG9vbHMgYWNjZXB0IDMyIG9yIDY0IGJpdCBwb2ludGVycyB0cmFuc3BhcmVudGx5LiAgU2VlIElQdHIuICAgICAqLworI3ByYWdtYSBwb2ludGVyX3NpemUgKHNhdmUpCisjcHJhZ21hIHBvaW50ZXJfc2l6ZSAobG9uZykKK3R5cGVkZWYgY2hhciAqQXJndlR5cGU7CisjcHJhZ21hIHBvaW50ZXJfc2l6ZSAocmVzdG9yZSkKKyNlbHNlCit0eXBlZGVmIGNoYXIgKkFyZ3ZUeXBlOworI2VuZGlmCisKKy8qCisgKiBSb3RhdGUgbWFjcm9zCisgKi8KKyNkZWZpbmUgUk9MXzMyKHZhbCwgbikgXAorKCgoKHVuc2lnbmVkMzIpKHZhbCkgPDwgKG4pKSB8ICgodW5zaWduZWQzMikodmFsKSA+PiAoMzItKG4pKSkpICYgMHhGRkZGRkZGRkwpCisjZGVmaW5lIFJPUl8zMih2YWwsIG4pIFwKKygoKCh1bnNpZ25lZDMyKSh2YWwpID4+IChuKSkgfCAoKHVuc2lnbmVkMzIpKHZhbCkgPDwgKDMyLShuKSkpKSAmIDB4RkZGRkZGRkZMKQorCisjaWZkZWYgQ09NUElMSU5HX09OX1VOSVgKKyMgIGRlZmluZSBGT1BFTl9XQiAgICAgInciCisjICBkZWZpbmUgRk9QRU5fUkIgICAgICJyIgorIyAgZGVmaW5lIEZPUEVOX1JXQiAgICAicisiCisjICBpZm5kZWYgX19TVERDX18gICAgICAgICAgICAgICAgICAgICAvKiBjYXZlYXQgUklTQ2lYLi4uICovCisjICAgIGRlZmluZSByZW1vdmUoZmlsZSkgdW5saW5rKGZpbGUpICAvKiBhIGhvcnJpZCBoYWNrLCBidXQgcHJvYmFibHkgYmVzdD8gKi8KKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIEZPUEVOX1dCICAgICAid2IiCisjICBkZWZpbmUgRk9QRU5fUkIgICAgICJyYiIKKyMgIGRlZmluZSBGT1BFTl9SV0IgICAgInJiKyIKKyNlbmRpZgorCisjaWZuZGVmIEZJTEVOQU1FX01BWAorIyAgZGVmaW5lIEZJTEVOQU1FX01BWCAyNTYKKyNlbmRpZgorCisjaWYgKCFkZWZpbmVkKF9fU1REQ19fKSAmJiAhZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoX01TQ19WRVIpKSB8fCBcCisgICAgZGVmaW5lZChDT01QSUxJTkdfT05fU1VOT1MpCisvKiBVc2UgYmNvcHkgcmF0aGVyIHRoYW4gbWVtbW92ZSwgYXMgbWVtbW92ZSBpcyBub3QgYXZhaWxhYmxlLiAgICAgKi8KKy8qIFRoZXJlIGRvZXMgbm90IHNlZW0gdG8gYmUgYSBoZWFkZXIgZm9yIGJjb3B5LiAgICAgICAgICAgICAgICAgICAqLwordm9pZCBiY29weShjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbmd0aCk7CisjICBkZWZpbmUgbWVtbW92ZShkLHMsbCkgYmNvcHkocyxkLGwpCisKKy8qIEJTRC9TVU4gZG9uJ3QgaGF2ZSBzdHJ0b3VsKCksIGJ1dCB0aGVuIHN0cnRvbCgpIGRvZXNuJ3QgYmFyZiBvbiAqLworLyogb3ZlcmZsb3cgYXMgcmVxdWlyZWQgYnkgQU5TSS4uLiBUaGlzIGJvZGdlIGlzIGhvcnJpZC4gICAgICAgICAgICovCisjICBkZWZpbmUgc3RydG91bChzLCBwdHIsIGJhc2UpIHN0cnRvbChzLCBwdHIsIGJhc2UpCisKKy8qIHN0cnRvZCBpcyBwcmVzZW50IGluIHRoZSBDLWxpYnJhcnkgYnV0IGlzIG5vdCBpbiBzdGRsaWIuaCAgICAgICAqLworZXh0ZXJuIGRvdWJsZSBzdHJ0b2QoY29uc3QgY2hhciAqc3RyLCBjaGFyICoqcHRyKTsKKyNlbmRpZgorCisvKiBGb3Igc3lzdGVtcyB0aGF0IGRvIG5vdCBkZWZpbmUgRVhJVF9TVUNDRVNTIGFuZCBFWElUX0ZBSUxVUkUgKi8KKyNpZm5kZWYgRVhJVF9TVUNDRVNTCisjICBkZWZpbmUgRVhJVF9TVUNDRVNTICAgICAgICAgICAwCisjZW5kaWYKKyNpZm5kZWYgRVhJVF9GQUlMVVJFCisjICBkZWZpbmUgRVhJVF9GQUlMVVJFICAgICAgICAgICAxCisjZW5kaWYKKworI2lmbmRlZiBJR05PUkUKKyNkZWZpbmUgSUdOT1JFKHgpICh4ID0geCkgIC8qIFNpbGVuY2UgY29tcGlsZXIgd2FybmluZ3MgZm9yIHVudXNlZCBhcmd1bWVudHMgKi8KKyNlbmRpZgorCisvKiBEZWZpbmUgZW5kaWFuLW5lc3Mgb2YgaG9zdCAqLworCisjaWYgZGVmaW5lZChfX2Fjb3JuKSB8fCBkZWZpbmVkKF9fbXZzKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgXAorICAoZGVmaW5lZChfX2FscGhhKSAmJiBkZWZpbmVkKF9fb3NmX18pKQorIyAgZGVmaW5lIEhPU1RfRU5ESUFOX0xJVFRMRQorI2VsaWYgZGVmaW5lZChfX3NwYXJjKSB8fCBkZWZpbmVkKG1hY2ludG9zaCkKKyMgIGRlZmluZSBIT1NUX0VORElBTl9CSUcKKyNlbHNlCisjICBkZWZpbmUgSE9TVF9FTkRJQU5fVU5LTk9XTgorI2VuZGlmCisKKyNlbmRpZgorCisvKiBlbmQgb2YgaG9zdC5oICovCmRpZmYgLS1naXQgYS9nZGIvcmRpLXNoYXJlL2hvc3RjaGFuLmMgYi9nZGIvcmRpLXNoYXJlL2hvc3RjaGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0MWRhNAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZGktc2hhcmUvaG9zdGNoYW4uYwpAQCAtMCwwICsxLDEwNTcgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qIC0qLUMtKi0KKyAqCisgKiAkUmV2aXNpb24kCisgKiAgICAgJERhdGUkCisgKgorICoKKyAqIGhvc3RjaGFuLmMgLSBTZW1pIFN5bmNocm9ub3VzIEhvc3Qgc2lkZSBjaGFubmVsIGludGVyZmFjZSBmb3IgQW5nZWwuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjZWxzZQorIyAgaW5jbHVkZSAid2luc29jay5oIgorIyAgaW5jbHVkZSAidGltZS5oIgorI2VuZGlmCisjaW5jbHVkZSAiaHN5cy5oIgorI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJsb2dnaW5nLmgiCisjaW5jbHVkZSAiY2hhbmRlZnMuaCIKKyNpbmNsdWRlICJjaGFucHJpdi5oIgorI2luY2x1ZGUgImRldmNsbnQuaCIKKyNpbmNsdWRlICJidWZmZXJzLmgiCisjaW5jbHVkZSAiZHJpdmVycy5oIgorI2luY2x1ZGUgImFkcGVyci5oIgorI2luY2x1ZGUgImRldnN3LmgiCisjaW5jbHVkZSAiaG9zdGNoYW4uaCIKKworI2lmbmRlZiBVTlVTRUQKKyNkZWZpbmUgVU5VU0VEKHgpICh4ID0geCkgIC8qIFNpbGVuY2UgY29tcGlsZXIgd2FybmluZ3MgZm9yIHVudXNlZCBhcmd1bWVudHMgKi8KKyNlbmRpZgorCisjZGVmaW5lIEhFQVJUUkFURSA1MDAwMDAwCisKKy8qCisgKiBsaXN0IG9mIGF2YWlsYWJsZSBkcml2ZXJzLCBkZWNsYXJlZCBpbiBkcml2ZXJzLmMKKyAqLworZXh0ZXJuIERldmljZURlc2NyICpkZXZpY2VzW107CisKK3N0YXRpYyBEZXZpY2VEZXNjciAqZGV2aWNlVG9Vc2UgPSBOVUxMOworCitzdGF0aWMgc3RydWN0IENoYW5uZWwgeworICAgIENoYW5uZWxDYWxsYmFjayBjYWxsYmFjazsKKyAgICB2b2lkICpjYWxsYmFja19zdGF0ZTsKK30gY2hhbm5lbHNbQ0lfTlVNX0NIQU5ORUxTXTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgSG9tZVNlcTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIE9wcG9TZXE7CisKKy8qCisgKiBIYW5kbGVyIGZvciBEQ19BUFBMIHBhY2tldHMKKyAqLworc3RhdGljIERDX0FwcGxfSGFuZGxlciBkY19hcHBsX2hhbmRsZXIgPSBOVUxMOworCisvKgorICogc2xvdHMgZm9yIHJlZ2lzdGVyZWQgYXN5bmNocm9ub3VzIHByb2Nlc3NpbmcgY2FsbGJhY2sgcHJvY2VkdXJlcworICovCisjZGVmaW5lIE1BWF9BU1lOQ19DQUxMQkFDS1MgOAorc3RhdGljIHVuc2lnbmVkIGludCAgICAgICAgICAgICBudW1fYXN5bmNfY2FsbGJhY2tzID0gMDsKK3N0YXRpYyBBZHBfQXN5bmNfQ2FsbGJhY2sgICAgICAgYXN5bmNfY2FsbGJhY2tzW01BWF9BU1lOQ19DQUxMQkFDS1NdOworCisvKgorICogd3JpdGVRdWV1ZVJvb3QgaXMgdGhlIHF1ZXVlIG9mIHdyaXRlIHJlcXVlc3RzIHBlbmRpbmcgYWNrbm93bGVkZ2VtZW50CisgKiB3cml0ZVF1ZXVlU2VuZCBpcyB0aGUgcXVldWUgb2YgcGVuZGluZyB3cml0ZSByZXF1ZXN0cyB3aGljaCB3aWxsCisgKiBiZSBhIHN1YnNldCBvZiB0aGUgbGlzdCB3cml0ZVF1ZXVlUm9vdAorICovCitzdGF0aWMgUGFja2V0ICp3cml0ZVF1ZXVlUm9vdCA9IE5VTEw7CitzdGF0aWMgUGFja2V0ICp3cml0ZVF1ZXVlU2VuZCA9IE5VTEw7CitzdGF0aWMgUGFja2V0ICpyZXNlbmRfcGt0ID0gTlVMTDsKK3N0YXRpYyBpbnQgcmVzZW5kaW5nID0gRkFMU0U7CisKKy8qIGhlYXJ0YmVhdF9lbmFibGVkIGlzIGEgZmxhZyB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGhlYXJ0YmVhdCBpcworICogY3VycmVudGx5IHR1cm5lZCBvbiwgaGVhcnRiZWF0X2VuYWJsZWQgd2lsbCBiZSBmYWxzZSBpbiBzaXR1YXRpb25zCisgKiB3aGVyZSBldmVuIHRob3VnaCBhIGhlYXJ0YmVhdCBpcyBiZWluZyB1c2VkIGl0IGlzIHByb2JsZW1hdGljYWwgb3IKKyAqIGRpcy1hZHZhbnRhZ2VvdXMgdG8gaGF2ZSBpdCB0dXJuZWQgb24sIGZvciBpbnN0YW5jZSBkdXJpbmcgdGhlIAorICogaW5pdGlhbCBzdGFnZXMgb2YgYm9vdCB1cAorICovCit1bnNpZ25lZCBpbnQgaGVhcnRiZWF0X2VuYWJsZWQgPSBGQUxTRTsKKy8qIGhlYXJ0YmVhdF9jb25maWd1cmVkIGlzIHNldCB1cCBieSB0aGUgZGV2aWNlIGRyaXZlciB0byBpbmRpY2F0ZSB3aGV0aGVyCisgKiB0aGUgaGVhcnRiZWF0IGlzIGJlaW5nIHVzZWQgZHVyaW5nIHRoaXMgZGVidWcgc2Vzc2lvbi4gIEluIGNvbnRyYXN0IHRvCisgKiBoZWFydGJlYXRfZW5hYmxlZCBpdCBtdXN0IG5vdCBiZSBjaGFuZ2VkIGR1cmluZyBhIHNlc3Npb24uICBUaGUgbG9naWMgZm9yCisgKiBkZWNpZGluZyB3aGV0aGVyIHRvIHNlbmQgYSBoZWFydGJlYXQgaXM6IElzIGhlYXJ0YmVhdF9jb25maWd1cmVkIGZvciB0aGlzCisgKiBzZXNzaW9uPyBpZiBhbmQgb25seSBpZiBpdCBpcyB0aGVuIGlmIGhlYXJ0YmVhdFtpcyBjdXJyZW50bHldX2VuYWJsZWQgYW5kCisgKiB3ZSBhcmUgZHVlIHRvIHNlbmQgYSBwdWxzZSB0aGVuIHNlbmQgaXQgCisgKi8KK3Vuc2lnbmVkIGludCBoZWFydGJlYXRfY29uZmlndXJlZCA9IFRSVUU7CisKK3ZvaWQgQWRwX2luaXRTZXEoIHZvaWQgKSB7CisgIFBhY2tldCAqdG1wX3BrdCA9IHdyaXRlUXVldWVTZW5kOworCisgIEhvbWVTZXEgPSAwOworICBPcHBvU2VxID0gMDsKKyAgaWYgKCB3cml0ZVF1ZXVlU2VuZCAhPSBOVUxMKSB7CisgICAgd2hpbGUgKHdyaXRlUXVldWVTZW5kLT5wa19uZXh0ICE9TlVMTCkgeworICAgICAgdG1wX3BrdCA9IHdyaXRlUXVldWVTZW5kOworICAgICAgd3JpdGVRdWV1ZVNlbmQgPSB0bXBfcGt0LT5wa19uZXh0OworICAgICAgRGV2U1dfRnJlZVBhY2tldCh0bXBfcGt0KTsKKyAgICB9CisgIH0KKyAgdG1wX3BrdCA9IHdyaXRlUXVldWVSb290OworICBpZiAoIHdyaXRlUXVldWVSb290ID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIHdoaWxlICh3cml0ZVF1ZXVlUm9vdC0+cGtfbmV4dCAhPU5VTEwpIHsKKyAgICB0bXBfcGt0ID0gd3JpdGVRdWV1ZVJvb3Q7CisgICAgd3JpdGVRdWV1ZVJvb3QgPSB0bXBfcGt0LT5wa19uZXh0OworICAgIERldlNXX0ZyZWVQYWNrZXQodG1wX3BrdCk7CisgIH0KKyAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICBGdW5jdGlvbjogRHVtbXlDYWxsYmFjaworICogICBQdXJwb3NlOiBEZWZhdWx0IGNhbGxiYWNrIHJvdXRpbmUgdG8gaGFuZGxlIHVuZXhwZWN0ZWQgaW5wdXQKKyAqICAgICAgICAgICAgICBvbiBhIGNoYW5uZWwKKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgICBJbnB1dDogcGFja2V0ICBUaGUgcmVjZWl2ZWQgcGFja2V0CisgKgorICogICAgICAgICAgICAgIHN0YXRlICAgQ29udGFpbnMgbm90aGluZyBvZiBzaWduaWZpY2FuY2UKKyAqCisgKiAgIFJldHVybnM6IE5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgRHVtbXlDYWxsYmFjayhQYWNrZXQgKnBhY2tldCwgdm9pZCAqc3RhdGUpCit7CisgICAgQ2hhbm5lbElEIGNoYW47CisgICAgY29uc3QgY2hhciBmbXRbXSA9ICJVbmV4cGVjdGVkIHJlYWQgb24gY2hhbm5lbCAldSwgbGVuZ3RoICVkXG4iOworICAgIGNoYXIgZm10YnVmW3NpemVvZihmbXQpICsgMjRdOworCisgICAgVU5VU0VEKHN0YXRlKTsKKworICAgIGNoYW4gPSAqKHBhY2tldC0+cGtfYnVmZmVyKTsKKyAgICBzcHJpbnRmKGZtdGJ1ZiwgZm10LCBjaGFuLCBwYWNrZXQtPnBrX2xlbmd0aCk7CisgICAgcHJpbnRmKGZtdGJ1Zik7CisKKyAgICAvKgorICAgICAqIGp1bmsgdGhpcyBwYWNrZXQKKyAgICAgKi8KKyAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7Cit9CisKKy8qCisgKiAgRnVuY3Rpb246IEJsb2NraW5nQ2FsbGJhY2sKKyAqICAgUHVycG9zZTogQ2FsbGJhY2sgcm91dGluZSB1c2VkIHRvIGltcGxlbWVudCBhIGJsb2NraW5nIHJlYWQgY2FsbAorICoKKyAqICAgIFBhcmFtczoKKyAqICAgICAgIElucHV0OiBwYWNrZXQgIFRoZSByZWNlaXZlZCBwYWNrZXQuCisgKgorICogICAgICBPdXRwdXQ6IHN0YXRlICAgQWRkcmVzcyBvZiBoaWdoZXIgbGV2ZWwncyBwb2ludGVyIHRvIHRoZSByZWNlaXZlZAorICogICAgICAgICAgICAgICAgICAgICAgcGFja2V0LgorICoKKyAqICAgUmV0dXJuczogTm90aGluZworICovCitzdGF0aWMgdm9pZCBCbG9ja2luZ0NhbGxiYWNrKFBhY2tldCAqcGFja2V0LCB2b2lkICpzdGF0ZSkKK3sKKyAgICAvKgorICAgICAqIFBhc3MgdGhlIHBhY2tldCBiYWNrIHRvIHRoZSBjYWxsZXIgd2hpY2ggcmVxdWVzdGVkIGEgcGFja2V0CisgICAgICogZnJvbSB0aGlzIGNoYW5uZWwuICBUaGlzIGFsc28gZmxhZ3MgdGhlIGNvbXBsZXRpb24gb2YgdGhlIEkvTworICAgICAqIHJlcXVlc3QgdG8gdGhlIGJsb2NraW5nIHJlYWQgY2FsbC4KKyAgICAgKi8KKyAgICAqKChQYWNrZXQgKiopc3RhdGUpID0gcGFja2V0OworfQorCisvKgorICogIEZ1bmN0aW9uOiBGaXJlQ2FsbGJhY2sKKyAqICAgUHVycG9zZTogUGFzcyByZWNlaXZlZCBwYWNrZXQgYWxvbmcgdG8gdGhlIGNhbGxiYWNrIHJvdXRpbmUgZm9yCisgKiAgICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIGNoYW5uZWwKKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgICBJbnB1dDogcGFja2V0ICBUaGUgcmVjZWl2ZWQgcGFja2V0LgorICoKKyAqICAgUmV0dXJuczogTm90aGluZworICoKKyAqIFBvc3QtY29uZGl0aW9uczogVGhlIFRhcmdldC10by1Ib3N0IHNlcXVlbmNlIG51bWJlciBmb3IgdGhlIGNoYW5uZWwKKyAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgaGF2ZSBiZWVuIGluY3JlbWVudGVkLgorICovCitzdGF0aWMgdm9pZCBGaXJlQ2FsbGJhY2soUGFja2V0ICpwYWNrZXQpCit7CisgICAgQ2hhbm5lbElEIGNoYW47CisgICAgc3RydWN0IENoYW5uZWwgKmNoOworCisgICAgLyoKKyAgICAgKiBpcyB0aGlzIGEgc2Vuc2libGUgY2hhbm5lbCBudW1iZXI/CisgICAgICovCisgICAgY2hhbiA9ICoocGFja2V0LT5wa19idWZmZXIpOworICAgIGlmIChpbnZhbGlkQ2hhbm5lbElEKGNoYW4pKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJFUlJPUjogaW52YWxpZCBDaGFubmVsSUQgcmVjZWl2ZWQgZnJvbSB0YXJnZXRcbiIpOworCisgICAgICAgIC8qCisgICAgICAgICAqIGZyZWUgdGhlIHBhY2tldCdzIHJlc291cmNlcywgJ2NhdXNlIG5vLW9uZSBlbHNlIHdpbGwKKyAgICAgICAgICovCisgICAgICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qCisgICAgICogbG9va3MgT0sgLSBpbmNyZW1lbnQgc2VxdWVuY2UgbnVtYmVyLCBhbmQgcGFzcyBwYWNrZXQgdG8gY2FsbGJhY2sKKyAgICAgKi8KKyAgICBjaCA9IGNoYW5uZWxzICsgY2hhbjsKKyAgICAoY2gtPmNhbGxiYWNrKShwYWNrZXQsIGNoLT5jYWxsYmFja19zdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhlc2UgYXJlIHRoZSBleHRlcm5hbGx5IHZpc2libGUgZnVuY3Rpb25zLiAgVGhleSBhcmUgZG9jdW1lbnRlZAorICogaW4gaG9zdGNoYW4uaAorICovCit2b2lkIEFkcF9hZGRUb1F1ZXVlKFBhY2tldCAqKmhlYWQsIFBhY2tldCAqbmV3cGt0KQoreworICAgIC8qCisgICAgICogdGhpcyBpcyBhIGJpdCBvZiBhIGhhY2sKKyAgICAgKi8KKyAgICBQYWNrZXQgKnBrOworCisgICAgLyoKKyAgICAgKiBtYWtlIHN1cmUgdGhhdCB0aGUgaGFjayB3ZSBhcmUgYWJvdXQgdG8gdXNlIHdpbGwgd29yayBhcyBleHBlY3RlZAorICAgICAqLworICAgIEFTU0VSVCgmKCgoUGFja2V0ICopMCktPnBrX25leHQpID09IDAsICJiYWQgc3RydWN0IFBhY2tldCBsYXlvdXQiKTsKKworI2lmIERFQlVHICYmIDAKKyAgICBwcmludGYoIkFkcF9hZGRUb1F1ZXVlKCVwLCAlcClcbiIsIGhlYWQsIG5ld3BrdCk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogaGVyZSdzIHRoZSBoYWNrIC0gaXQgcmVsaWVzIHVwb24gdGhlIG5leHQKKyAgICAgKiBwb2ludGVyIGJlaW5nIGF0IHRoZSBzdGFydCBvZiBQYWNrZXQuCisgICAgICovCisgICAgcGsgPSAoUGFja2V0ICopKGhlYWQpOworCisgICAgLyoKKyAgICAgKiBza2lwIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlCisgICAgICovCisgICAgd2hpbGUgKHBrLT5wa19uZXh0ICE9IE5VTEwpCisgICAgICAgIHBrID0gcGstPnBrX25leHQ7CisKKyAgICAvKgorICAgICAqIG5vdyBhZGQgdGhlIG5ldyBlbGVtZW50CisgICAgICovCisgICAgbmV3cGt0LT5wa19uZXh0ID0gTlVMTDsKKyAgICBway0+cGtfbmV4dCA9IG5ld3BrdDsKK30KKworUGFja2V0ICpBZHBfcmVtb3ZlRnJvbVF1ZXVlKFBhY2tldCAqKmhlYWQpCit7CisgICAgc3RydWN0IFBhY2tldCAqcGs7CisKKyAgICBwayA9ICpoZWFkOworCisgICAgaWYgKHBrICE9IE5VTEwpCisgICAgICAgICpoZWFkID0gcGstPnBrX25leHQ7CisKKyAgICByZXR1cm4gcGs7Cit9CisKK0FkcEVycnMgQWRwX09wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaGVhcnRiZWF0X29uKQoreworICAgIGludCBpOworICAgIEFkcEVycnMgcmV0YzsKKyAgICBDaGFubmVsSUQgY2hhbjsKKworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCJBZHBfT3BlbkRldmljZSglcywgJXMpXG4iLCBuYW1lLCBhcmcgPyBhcmcgOiAiPE5VTEw+Iik7CisjZW5kaWYKKworICAgIGhlYXJ0YmVhdF9jb25maWd1cmVkID0gaGVhcnRiZWF0X29uOworICAgIGlmIChkZXZpY2VUb1VzZSAhPSBOVUxMKQorICAgICAgICByZXR1cm4gYWRwX2RldmljZV9hbHJlYWR5X29wZW47CisKKyAgICBmb3IgKGkgPSAwOyAoZGV2aWNlVG9Vc2UgPSBkZXZpY2VzW2ldKSAhPSBOVUxMOyArK2kpCisgICAgICAgIGlmIChEZXZTV19NYXRjaChkZXZpY2VUb1VzZSwgbmFtZSwgYXJnKSA9PSBhZHBfb2spCisgICAgICAgICAgICBicmVhazsKKworICAgIGlmIChkZXZpY2VUb1VzZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gYWRwX2RldmljZV9ub3RfZm91bmQ7CisKKyAgICAvKgorICAgICAqIHdlIHNlZW0gdG8gaGF2ZSBmb3VuZCBhIHN1aXRhYmxlIGRldmljZSBkcml2ZXIsIHNvIHRyeSB0byBvcGVuIGl0CisgICAgICovCisgICAgaWYgKChyZXRjID0gRGV2U1dfT3BlbihkZXZpY2VUb1VzZSwgbmFtZSwgYXJnLCBEQ19EQlVHKSkgIT0gYWRwX29rKQorICAgIHsKKyAgICAgICAgLyogd2UgZG9uJ3QgaGF2ZSBhIGRldmljZSB0byB1c2UgKi8KKyAgICAgICAgZGV2aWNlVG9Vc2UgPSBOVUxMOworICAgICAgICByZXR1cm4gcmV0YzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHRoZXJlIGlzIG5vIGV4cGxpY2l0IG9wZW4gb24gY2hhbm5lbHMgYW55IG1vcmUsIHNvCisgICAgICogaW5pdGlhbGlzZSBzdGF0ZSBmb3IgYWxsIGNoYW5uZWxzLgorICAgICAqLworICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBDSV9OVU1fQ0hBTk5FTFM7ICsrY2hhbikKKyAgICB7CisgICAgICAgIHN0cnVjdCBDaGFubmVsICpjaCA9IGNoYW5uZWxzICsgY2hhbjsKKworICAgICAgICBjaC0+Y2FsbGJhY2sgPSBEdW1teUNhbGxiYWNrOworICAgICAgICBjaC0+Y2FsbGJhY2tfc3RhdGUgPSBOVUxMOworICAgICAgICBPcHBvU2VxID0gMDsKKyAgICAgICAgSG9tZVNlcSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIGFkcF9vazsKK30KKworQWRwRXJycyBBZHBfQ2xvc2VEZXZpY2Uodm9pZCkKK3sKKyAgICBBZHBFcnJzIHJldGM7CisKKyNpZmRlZiBERUJVRworICAgIHByaW50ZigiQWRwX0Nsb3NlRGV2aWNlXG4iKTsKKyNlbmRpZgorCisgICAgaWYgKGRldmljZVRvVXNlID09IE5VTEwpCisgICAgICAgIHJldHVybiBhZHBfZGV2aWNlX25vdF9vcGVuOworCisgICAgaGVhcnRiZWF0X2VuYWJsZWQgPSBGQUxTRTsKKworICAgIHJldGMgPSBEZXZTV19DbG9zZShkZXZpY2VUb1VzZSwgRENfREJVRyk7CisKKyAgICAvKgorICAgICAqIHdlIGhhdmUgdG8gY2xlYXIgZGV2aWNlVG9Vc2UsIGV2ZW4gd2hlbiB0aGUgbG93ZXIgbGF5ZXJzCisgICAgICogZmF1bHRlZCB0aGUgY2xvc2UsIG90aGVyd2lzZSB0aGUgY29uZGl0aW9uIHdpbGwgbmV2ZXIgY2xlYXIKKyAgICAgKi8KKyAgICBpZiAocmV0YyAhPSBhZHBfb2spCisgICAgICAgIFdBUk4oIkRldlNXX0Nsb3NlIGZhdWx0ZWQgdGhlIGNhbGwiKTsKKworICAgIGRldmljZVRvVXNlID0gTlVMTDsKKyAgICByZXR1cm4gcmV0YzsKK30KKworQWRwRXJycyBBZHBfSW9jdGwoaW50IG9wY29kZSwgdm9pZCAqYXJncykKK3sKKyNpZmRlZiBERUJVRworICAgIHByaW50ZigiQWRwX0lvY3RsXG4iKTsKKyNlbmRpZgorCisgICAgaWYgKGRldmljZVRvVXNlID09IE5VTEwpCisgICAgICAgIHJldHVybiBhZHBfZGV2aWNlX25vdF9vcGVuOworCisgICAgcmV0dXJuIERldlNXX0lvY3RsKGRldmljZVRvVXNlLCBvcGNvZGUsIGFyZ3MpOworfQorCitBZHBFcnJzIEFkcF9DaGFubmVsUmVnaXN0ZXJSZWFkKGNvbnN0IENoYW5uZWxJRCBjaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDaGFubmVsQ2FsbGJhY2sgY2JmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYnN0YXRlKQoreworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCJBZHBfQ2hhbm5lbFJlZ2lzdGVyUmVhZCglZCwgJXAsICV4KVxuIiwgY2hhbiwgY2JmdW5jLCBjYnN0YXRlKTsKKyNlbmRpZgorCisgICAgaWYgKGRldmljZVRvVXNlID09IE5VTEwpCisgICAgICAgIHJldHVybiBhZHBfZGV2aWNlX25vdF9vcGVuOworCisgICAgaWYgKGludmFsaWRDaGFubmVsSUQoY2hhbikpCisgICAgICAgIHJldHVybiBhZHBfYmFkX2NoYW5uZWxfaWQ7CisKKyAgICBpZiAoY2JmdW5jID09IE5VTEwpCisgICAgeworICAgICAgICBjaGFubmVsc1tjaGFuXS5jYWxsYmFjayA9IER1bW15Q2FsbGJhY2s7CisgICAgICAgIGNoYW5uZWxzW2NoYW5dLmNhbGxiYWNrX3N0YXRlID0gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY2hhbm5lbHNbY2hhbl0uY2FsbGJhY2sgPSBjYmZ1bmM7CisgICAgICAgIGNoYW5uZWxzW2NoYW5dLmNhbGxiYWNrX3N0YXRlID0gY2JzdGF0ZTsKKyAgICB9CisKKyAgICByZXR1cm4gYWRwX29rOworfQorCitBZHBFcnJzIEFkcF9DaGFubmVsUmVhZChjb25zdCBDaGFubmVsSUQgY2hhbiwgUGFja2V0ICoqcGFja2V0KQoreworICAgIHN0cnVjdCBDaGFubmVsICpjaDsKKworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCJBZHBfQ2hhbm5lbFJlYWQoJWQsICV4KVxuIiwgY2hhbiwgKnBhY2tldCk7CisjZW5kaWYKKworICAgIGlmIChkZXZpY2VUb1VzZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gYWRwX2RldmljZV9ub3Rfb3BlbjsKKworICAgIGlmIChpbnZhbGlkQ2hhbm5lbElEKGNoYW4pKQorICAgICAgICByZXR1cm4gYWRwX2JhZF9jaGFubmVsX2lkOworCisgICAgLyoKKyAgICAgKiBpZiBhIGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBmb3IgdGhpcworICAgICAqIGNoYW5uZWwsIHRoZW4gd2UgZG8gbm90IGFsbG93IHRoaXMgYmxvY2tpbmcgcmVhZC4KKyAgICAgKi8KKyAgICBjaCA9IGNoYW5uZWxzICsgY2hhbjsKKyAgICBpZiAoY2gtPmNhbGxiYWNrICE9IER1bW15Q2FsbGJhY2spCisgICAgICAgIHJldHVybiBhZHBfY2FsbGJhY2tfYWxyZWFkeV9yZWdpc3RlcmVkOworCisgICAgLyoKKyAgICAgKiBPSywgdXNlIG91ciBvd24gY2FsbGJhY2sgdG8gd2FpdCBmb3IgYSBwYWNrZXQgdG8gYXJyaXZlCisgICAgICogb24gdGhpcyBjaGFubmVsCisgICAgICovCisgICAgY2gtPmNhbGxiYWNrID0gQmxvY2tpbmdDYWxsYmFjazsKKyAgICBjaC0+Y2FsbGJhY2tfc3RhdGUgPSBwYWNrZXQ7CisgICAgKnBhY2tldCA9IE5VTEw7CisKKyAgICAvKgorICAgICAqIGtlZXAgcG9sbGluZyB1bnRpbCBhIHBhY2tldCBhcHBlYXJzIGZvciB0aGlzIGNoYW5uZWwKKyAgICAgKi8KKyAgICB3aGlsZSAoKCh2b2xhdGlsZSBQYWNrZXQgKikoKnBhY2tldCkpID09IE5VTEwpCisgICAgICAgIC8qCisgICAgICAgICAqIHRoaXMgY2FsbCB3aWxsIGJsb2NrIHVudGlsIGEgcGFja2V0IGlzIHJlYWQgb24gYW55IGNoYW5uZWwKKyAgICAgICAgICovCisgICAgICAgIEFkcF9Bc3luY2hyb25vdXNQcm9jZXNzaW5nKGFzeW5jX2Jsb2NrX29uX3JlYWQpOworCisgICAgLyoKKyAgICAgKiBPSywgdGhlIHBhY2tldCBoYXMgYXJyaXZlZDogY2xlYXIgdGhlIGNhbGxiYWNrCisgICAgICovCisgICAgY2gtPmNhbGxiYWNrID0gRHVtbXlDYWxsYmFjazsKKyAgICBjaC0+Y2FsbGJhY2tfc3RhdGUgPSBOVUxMOworCisgICAgcmV0dXJuIGFkcF9vazsKK30KKworc3RhdGljIEFkcEVycnMgQ2hhbm5lbFdyaXRlKAorICAgIGNvbnN0IENoYW5uZWxJRCBjaGFuLCBQYWNrZXQgKnBhY2tldCwgQXN5bmNNb2RlIG1vZGUpCit7CisgICAgc3RydWN0IENoYW5uZWwgKmNoOworICAgIHVuc2lnbmVkIGNoYXIgKmNwdHI7CisKKyNpZmRlZiBERUJVRworICAgIHByaW50ZiggIkFkcF9DaGFubmVsV3JpdGUoJWQsICV4KVxuIiwgY2hhbiwgcGFja2V0ICk7CisjZW5kaWYKKworICAgIGlmIChkZXZpY2VUb1VzZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gYWRwX2RldmljZV9ub3Rfb3BlbjsKKworICAgIGlmIChpbnZhbGlkQ2hhbm5lbElEKGNoYW4pKQorICAgICAgICByZXR1cm4gYWRwX2JhZF9jaGFubmVsX2lkOworCisgICAgLyoKKyAgICAgKiBmaWxsIGluIHRoZSBjaGFubmVscyBoZWFkZXIgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgYnVmZmVyCisgICAgICovCisgICAgY2ggPSBjaGFubmVscyArIGNoYW47CisgICAgY3B0ciA9IHBhY2tldC0+cGtfYnVmZmVyOworICAgICpjcHRyKysgPSBjaGFuOworICAgICpjcHRyID0gMDsKKyAgICBwYWNrZXQtPnBrX2xlbmd0aCArPSBDSEFOX0hFQURFUl9TSVpFOworCisgICAgLyoKKyAgICAgKiBPSywgYWRkIHRoaXMgcGFja2V0IHRvIHRoZSB3cml0ZSBxdWV1ZSwgYW5kIHRyeSB0byBmbHVzaCBpdCBvdXQKKyAgICAgKi8KKworICAgIEFkcF9hZGRUb1F1ZXVlKCZ3cml0ZVF1ZXVlU2VuZCwgcGFja2V0KTsKKyAgICBBZHBfQXN5bmNocm9ub3VzUHJvY2Vzc2luZyhtb2RlKTsKKworICAgIHJldHVybiBhZHBfb2s7Cit9CisKK0FkcEVycnMgQWRwX0NoYW5uZWxXcml0ZShjb25zdCBDaGFubmVsSUQgY2hhbiwgUGFja2V0ICpwYWNrZXQpIHsKKyAgcmV0dXJuIENoYW5uZWxXcml0ZShjaGFuLCBwYWNrZXQsIGFzeW5jX2Jsb2NrX29uX3dyaXRlKTsKK30KKworQWRwRXJycyBBZHBfQ2hhbm5lbFdyaXRlQXN5bmMoY29uc3QgQ2hhbm5lbElEIGNoYW4sIFBhY2tldCAqcGFja2V0KSB7CisgIHJldHVybiBDaGFubmVsV3JpdGUoY2hhbiwgcGFja2V0LCBhc3luY19ibG9ja19vbl9ub3RoaW5nKTsKK30KKworc3RhdGljIEFkcEVycnMgc2VuZF9yZXNlbmRfbXNnKERldmljZUlEIGRldmlkKSB7CisKKyAgLyoKKyAgICogU2VuZCBhIHJlc2VuZCBtZXNzYWdlLCB1c3VhbGx5IGluIHJlc3BvbnNlIHRvIGEgYmFkIHBhY2tldCBvcgorICAgKiBhIHJlc2VuZCByZXF1ZXN0ICovCisgIFBhY2tldCAqIHBhY2tldDsKKyAgcGFja2V0ID0gRGV2U1dfQWxsb2NhdGVQYWNrZXQoQ0ZfREFUQV9CWVRFX1BPUyk7CisgIHBhY2tldC0+cGtfYnVmZmVyW0NGX0NIQU5ORUxfQllURV9QT1NdID0gQ0lfUFJJVkFURTsKKyAgcGFja2V0LT5wa19idWZmZXJbQ0ZfSE9NRV9TRVFfQllURV9QT1NdID0gSG9tZVNlcTsKKyAgcGFja2V0LT5wa19idWZmZXJbQ0ZfT1BQT19TRVFfQllURV9QT1NdID0gT3Bwb1NlcTsKKyAgcGFja2V0LT5wa19idWZmZXJbQ0ZfRkxBR1NfQllURV9QT1NdID0gQ0ZfUkVMSUFCTEUgfCBDRl9SRVNFTkQ7CisgIHBhY2tldC0+cGtfbGVuZ3RoID0gQ0ZfREFUQV9CWVRFX1BPUzsKKyAgcmV0dXJuIERldlNXX1dyaXRlKGRldmljZVRvVXNlLCBwYWNrZXQsIGRldmlkKTsKK30KKworc3RhdGljIEFkcEVycnMgY2hlY2tfc2VxKHVuc2lnbmVkIGNoYXIgbXNnX2hvbWUsIHVuc2lnbmVkIGNoYXIgbXNnX29wcG8pIHsKKyAgUGFja2V0ICp0bXBfcGt0OworCisgIFVOVVNFRChtc2dfb3Bwbyk7CisgIC8qIAorICAgKiBjaGVjayBpZiB3ZSBoYXZlIGdvdCBhbiBhY2sgZm9yIGFueXRoaW5nIGFuZCBpZiBzbyByZW1vdmUgaXQgZnJvbSB0aGUKKyAgICogcXVldWUKKyAgICovCisgIGlmIChtc2dfaG9tZSA9PSAodW5zaWduZWQgY2hhcikoT3Bwb1NlcSsxKSkgeworICAgIC8qCisgICAgICogYXJyaXZlZCBpbiBzZXF1ZW5jZSBjYW4gaW5jcmVtZW50IG91ciBvcHBvc2luZyBzZXEgbnVtYmVyIGFuZCByZW1vdmUKKyAgICAgKiB0aGUgcmVsZXZhbnQgcGFja2V0IGZyb20gb3VyIHF1ZXVlCisgICAgICogY2hlY2sgdGhhdCB0aGUgcGFja2V0IHdlJ3JlIGdvaW5nIHRvIHJlbW92ZSByZWFsbHkgaXMgdGhlIHJpZ2h0IG9uZQorICAgICAqLworICAgIHRtcF9wa3QgPSB3cml0ZVF1ZXVlUm9vdDsKKyAgICB3aGlsZSAoKHRtcF9wa3QtPnBrX25leHQgIT0gTlVMTCkgJiYKKyAgICAgICAgICAgKHRtcF9wa3QtPnBrX25leHQtPnBrX2J1ZmZlcltDRl9IT01FX1NFUV9CWVRFX1BPU10KKyAgICAgICAgICAgICE9IE9wcG9TZXEpKXsKKyAgICAgIHRtcF9wa3QgPSB0bXBfcGt0LT5wa19uZXh0OworICAgIH0KKyAgICBPcHBvU2VxKys7CisgICAgaWYgKHRtcF9wa3QtPnBrX25leHQgPT0gTlVMTCkgeworI2lmZGVmIERFQlVHCisgICAgICBwcmludGYoInRyeWluZyB0byByZW1vdmUgYSBub24gZXhpc3RhbnQgcGFja2V0XG4iKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIGFkcF9iYWRfcGFja2V0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIFBhY2tldCAqdG1wID0gdG1wX3BrdC0+cGtfbmV4dDsKKyNpZmRlZiBSRVRfREVCVUcKKyAgICAgIHByaW50ZigicmVtb3ZpbmcgYSBwYWNrZXQgZnJvbSB0aGUgcm9vdCBxdWV1ZVxuIik7CisjZW5kaWYKKyAgICAgIHRtcF9wa3QtPnBrX25leHQgPSB0bXBfcGt0LT5wa19uZXh0LT5wa19uZXh0OworICAgICAgLyogcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBwYWNrZXQgKi8KKyAgICAgIERldlNXX0ZyZWVQYWNrZXQodG1wKTsKKyAgICByZXR1cm4gYWRwX29rOworICAgIH0KKyAgfQorICBlbHNlIGlmIChtc2dfaG9tZSA8ICh1bnNpZ25lZCBjaGFyKSAoT3Bwb1NlcSsxKSl7CisgICAgLyogYWxyZWFkeSByZWNlaXZlZCB0aGlzIG1lc3NhZ2UgKi8KKyNpZmRlZiBSRVRfREVCVUcKKyAgICBwcmludGYoInNlcXVlbmNlIG51bWJlcnMgbG93XG4iKTsKKyNlbmRpZiAgIAorICAgIHJldHVybiBhZHBfc2VxX2xvdzsKKyAgfQorICBlbHNlIHsgIC8qIHdlJ3ZlIG1pc3NlZCBzb21ldGhpbmcgKi8KKyNpZmRlZiBSRVRfREVCVUcKKyAgICBwcmludGYoInNlcXVlbmNlIG51bWJlcnMgaGlnaFxuIik7CisjZW5kaWYgICAKKyAgICByZXR1cm4gYWRwX3NlcV9oaWdoOworICB9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHR2X2RpZmYoY29uc3Qgc3RydWN0IHRpbWV2YWwgKnRpbWVfbm93LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWV2YWwgKnRpbWVfd2FzKQoreworICAgIHJldHVybiAoICAoKHRpbWVfbm93LT50dl9zZWMgKiAxMDAwMDAwKSArIHRpbWVfbm93LT50dl91c2VjKQorICAgICAgICAgICAgLSAoKHRpbWVfd2FzLT50dl9zZWMgKiAxMDAwMDAwKSArIHRpbWVfd2FzLT50dl91c2VjKSApOworfQorCisjaWYgIWRlZmluZWQoX191bml4KSAmJiAhZGVmaW5lZChfX0NZR1dJTjMyX18pCitzdGF0aWMgdm9pZCBnZXR0aW1lb2ZkYXkoIHN0cnVjdCB0aW1ldmFsICp0aW1lX25vdywgdm9pZCAqZHVtbXkgKQoreworICAgIHRpbWVfdCB0ID0gY2xvY2soKTsKKyAgICBVTlVTRUQoZHVtbXkpOworICAgIHRpbWVfbm93LT50dl9zZWMgPSB0L0NMT0NLU19QRVJfU0VDOworICAgIHRpbWVfbm93LT50dl91c2VjID0gKHQlQ0xPQ0tTX1BFUl9TRUMpKigxMDAwMDAwL0NMT0NLU19QRVJfU0VDKTsKK30KKyNlbmRpZgorCitzdGF0aWMgQWRwRXJycyBwYWNlbWFrZXIodm9pZCkKK3sKKyAgUGFja2V0ICpwYWNrZXQ7CisKKyAgcGFja2V0ID0gRGV2U1dfQWxsb2NhdGVQYWNrZXQoQ0ZfREFUQV9CWVRFX1BPUyk7CisgIGlmIChwYWNrZXQgPT0gTlVMTCkgeworICAgIHByaW50ZigiRVJST1I6IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIHBhY2tldCBpbiBwYWNlbWFrZXIoKVxuIik7CisgICAgcmV0dXJuIGFkcF9tYWxsb2NfZmFpbHVyZTsKKyAgfQorICBwYWNrZXQtPnBrX2J1ZmZlcltDRl9DSEFOTkVMX0JZVEVfUE9TXSA9IENJX1BSSVZBVEU7CisgIHBhY2tldC0+cGtfYnVmZmVyW0NGX0hPTUVfU0VRX0JZVEVfUE9TXSA9IEhvbWVTZXE7CisgIHBhY2tldC0+cGtfYnVmZmVyW0NGX09QUE9fU0VRX0JZVEVfUE9TXSA9IE9wcG9TZXE7CisgIHBhY2tldC0+cGtfYnVmZmVyW0NGX0ZMQUdTX0JZVEVfUE9TXSA9IENGX1JFTElBQkxFIHwgQ0ZfSEVBUlRCRUFUOworICBwYWNrZXQtPnBrX2xlbmd0aCA9IENGX0RBVEFfQllURV9QT1M7CisgIHJldHVybiBEZXZTV19Xcml0ZShkZXZpY2VUb1VzZSwgcGFja2V0LCBEQ19EQlVHKTsKK30gIAorCisjaWZkZWYgRkFLRV9CQURfTElORV9SWAorc3RhdGljIEFkcEVycnMgZmFrZV9iYWRfbGluZV9yeCggY29uc3QgUGFja2V0ICpjb25zdCBwYWNrZXQsIEFkcEVycnMgYWRwX2VyciApCit7CisgICAgc3RhdGljIHVuc2lnbmVkIGludCBibF9udW0gPSAwOworCisgICAgaWYgKCAgICAgKHBhY2tldCAhPSBOVUxMKQorICAgICAgICAgICYmIChibF9udW0rKyA+PSAyMCApCisgICAgICAgICAgJiYgKChibF9udW0gJSBGQUtFX0JBRF9MSU5FX1JYKSA9PSAwKSkKKyAgICB7CisgICAgICAgIHByaW50ZigiREVCVUc6IGZha2luZyBhIGJhZCBwYWNrZXRcbiIpOworICAgICAgICByZXR1cm4gYWRwX2JhZF9wYWNrZXQ7CisgICAgfQorICAgIHJldHVybiBhZHBfZXJyOworfQorI2VuZGlmIC8qIGRlZiBGQUtFX0JBRF9MSU5FX1JYICovCisKKyNpZmRlZiBGQUtFX0JBRF9MSU5FX1RYCitzdGF0aWMgdW5zaWduZWQgY2hhciB0bXBfY2g7CisKK3N0YXRpYyB2b2lkIGZha2VfYmFkX2xpbmVfdHgoIHZvaWQgKQoreworICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgYmxfbnVtID0gMDsKKworICAgIC8qIGdpdmUgdGhlIHRoaW5nIGEgY2hhbmNlIHRvIGJvb3QgdGhlbiB0cnkgY29ycnVwdGluZyBzdHVmZiAqLworICAgIGlmICggKGJsX251bSsrID49IDIwKSAmJiAoKGJsX251bSAlIEZBS0VfQkFEX0xJTkVfVFgpID09IDApKSAKKyAgICB7CisgICAgICAgIHByaW50ZigiREVCVUc6IGZha2luZyBhIGJhZCBwYWNrZXQgZm9yIHR4XG4iKTsKKyAgICAgICAgdG1wX2NoID0gd3JpdGVRdWV1ZVNlbmQtPnBrX2J1ZmZlcltDRl9GTEFHU19CWVRFX1BPU107CisgICAgICAgIHdyaXRlUXVldWVTZW5kLT5wa19idWZmZXJbQ0ZfRkxBR1NfQllURV9QT1NdID0gNzc7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB1bmZha2VfYmFkX2xpbmVfdHgoIHZvaWQgKQoreworICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgYmxfbnVtID0gMDsKKworICAgIC8qCisgICAgICogbXVzdCByZXNldCB0aGUgcGFja2V0IHNvIHRoYXQgaXRzIG5vdCBjb3JydXB0ZWQgd2hlbiB3ZQorICAgICAqICByZXNlbmQgaXQgCisgICAgICovICAgCisgICAgaWYgKCAoYmxfbnVtID49IDIwKSAmJiAoKGJsX251bSAlIEZBS0VfQkFEX0xJTkVfVFgpICE9IDApKQorICAgIHsKKyAgICAgICAgd3JpdGVRdWV1ZVNlbmQtPnBrX2J1ZmZlcltDRl9GTEFHU19CWVRFX1BPU10gPSB0bXBfY2g7CisgICAgfQorfQorI2VuZGlmIC8qIGRlZiBGQUtFX0JBRF9MSU5FX1RYICovCisKKy8qCisgKiBOT1RFOiB3ZSBhcmUgYXNzdW1pbmcgdGhhdCBhIHJlc29sdXRpb24gb2YgbWljcm9zZWNvbmRzIHdpbGwKKyAqIGJlIGdvb2QgZW5vdWdoIGZvciB0aGUgcHVycG9yc2VzIG9mIHRoZSBoZWFydGJlYXQuICBJZiB0aGlzIHByb3ZlcworICogbm90IHRvIGJlIHRoZSBjYXNlIHRoZW4gd2UgbWF5IG5lZWQgYSByZXRoaW5rLCBwb3NzaWJseSB1c2luZworICogW2dldCxzZXRdaXRpbWVyCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdGltZXZhbCB0aW1lX25vdzsKK3N0YXRpYyBzdHJ1Y3QgdGltZXZhbCB0aW1lX2xhc3RhbGl2ZTsKKworc3RhdGljIHZvaWQgYXN5bmNfcHJvY2Vzc19kYnVnX3JlYWQoIGNvbnN0IEFzeW5jTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmNvbnN0IGZpbmlzaGVkICApCit7CisgICAgUGFja2V0ICpwYWNrZXQ7CisgICAgdW5zaWduZWQgaW50IG1zZ19ob21lLCBtc2dfb3BwbzsKKyAgICBBZHBFcnJzIGFkcF9lcnI7CisKKyAgICBhZHBfZXJyID0gRGV2U1dfUmVhZChkZXZpY2VUb1VzZSwgRENfREJVRywgJnBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID09IGFzeW5jX2Jsb2NrX29uX3JlYWQgICAgKTsKKworI2lmZGVmIEZBS0VfQkFEX0xJTkVfUlgKKyAgICBhZHBfZXJyID0gZmFrZV9iYWRfbGluZV9yeCggcGFja2V0LCBhZHBfZXJyICk7CisjZW5kaWYKKworICAgIGlmIChhZHBfZXJyID09IGFkcF9iYWRfcGFja2V0KSB7CisgICAgICAgIC8qIFdlIGdvdCBhIGJhZCBwYWNrZXQsIGFzayBmb3IgYSByZXNlbmQsIHNlbmQgYSByZXNlbmQgbWVzc2FnZSAqLworI2lmZGVmIERFQlVHCisgICAgICAgIHByaW50ZigicmVjZWl2ZWQgYSBiYWQgcGFja2V0XG4iKTsKKyNlbmRpZgorICAgICAgICBzZW5kX3Jlc2VuZF9tc2coRENfREJVRyk7CisgICAgfQorICAgIGVsc2UgaWYgKHBhY2tldCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLyogdXBkYXRlIHRoZSBoZWFydGJlYXQgY2xvY2sgKi8KKyAgICAgICAgZ2V0dGltZW9mZGF5KCZ0aW1lX2xhc3RhbGl2ZSwgTlVMTCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiB3ZSBnb3QgYSBsaXZlIG9uZSBoZXJlIC0gd2VyZSB3ZSB3YWl0aW5nIGZvciBpdD8KKyAgICAgICAgICAgICAqLworICAgICAgICBpZiAobW9kZSA9PSBhc3luY19ibG9ja19vbl9yZWFkKQorICAgICAgICAgICAvKiBub3QgYW55IG1vcmUgKi8KKyAgICAgICAgICAgKmZpbmlzaGVkID0gVFJVRTsKKyNpZmRlZiBSRVRSQU5TCisKKyAgICAgICAgaWYgKHBhY2tldC0+cGtfbGVuZ3RoIDwgQ0ZfREFUQV9CWVRFX1BPUykgeworICAgICAgICAgICAgLyogd2UndmUgZ290IGEgcGFja2V0IHdpdGggbm8gaGVhZGVyIGluZm9ybWF0aW9uISAqLworICAgICAgICAgICAgcHJpbnRmKCJFUlJPUjogcGFja2V0IHdpdGggbm8gdHJhbnNwb3J0IGhlYWRlclxuIik7CisgICAgICAgICAgICBzZW5kX3Jlc2VuZF9tc2coRENfREJVRyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisjaWZkZWYgUkVUX0RFQlVHCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYzsKKyNlbmRpZgorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRPRE86IENoZWNrIHRvIHNlZSBpZiBpdHMgYWNrbm93bGVkZ2VpbmcgYW55dGhpbmcsIHJlbW92ZQorICAgICAgICAgICAgICogdGhvc2UgcGFja2V0cyBpdCBpcyBmcm9tIHRoZSBxdWV1ZS4gIElmIGl0cyBhIHJldHJhbnMgYWRkIHRoZQorICAgICAgICAgICAgICogcGFja2V0cyB0byB0aGUgcXVldWUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbXNnX2hvbWUgPSBwYWNrZXQtPnBrX2J1ZmZlcltDRl9IT01FX1NFUV9CWVRFX1BPU107CisgICAgICAgICAgICBtc2dfb3BwbyA9IHBhY2tldC0+cGtfYnVmZmVyW0NGX09QUE9fU0VRX0JZVEVfUE9TXTsKKyNpZmRlZiBSRVRfREVCVUcKKyAgICAgICAgICAgIHByaW50ZigibXNnIHNlcSBudW1iZXJzIGFyZSBoc2VxIDB4JXggb3NlcSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgIG1zZ19ob21lLCBtc2dfb3Bwbyk7CisgICAgICAgICAgICBmb3IgKGM9MDtjPHBhY2tldC0+cGtfbGVuZ3RoO2MrKykKKyAgICAgICAgICAgICAgIHByaW50ZigiJTAyLjJ4IiwgcGFja2V0LT5wa19idWZmZXJbY10pOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworI2VuZGlmCisgICAgICAgICAgICAvKiBub3cgd2FzIGl0IGEgcmVzZW5kIHJlcXVlc3Q/ICovCisgICAgICAgICAgICBpZiAoKHBhY2tldC0+cGtfYnVmZmVyW0NGX0ZMQUdTX0JZVEVfUE9TXSkgCisgICAgICAgICAgICAgICAgJiBDRl9SRVNFTkQpIHsKKyAgICAgICAgICAgICAgICAvKiB3ZSd2ZSBiZWVuIGFza2VkIGZvciBhIHJlc2VuZCBzbyB3ZSBoYWQgYmV0dGVyIHJlc2VuZCAqLworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogSSBkb24ndCB0aGluayB3ZSBjYW4gdXNlIGEgcmVzZW5kIGFzIGFja25vd2xlZGdlbWVudCBmb3IKKyAgICAgICAgICAgICAgICAgKiBhbnl0aGluZyBzbyBsZXRzIG5vdCBkbyB0aGlzIGZvciB0aGUgbW9tZW50CisgICAgICAgICAgICAgICAgICogY2hlY2tfc2VxKG1zZ19ob21lLCBtc2dfb3Bwbyk7CisgICAgICAgICAgICAgICAgICovCisjaWZkZWYgUkVUX0RFQlVHCisgICAgICAgICAgICAgICAgcHJpbnRmKCJyZWNlaXZlZCBhIHJlc2VuZCByZXF1ZXN0XG4iKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChIb21lU2VxICE9IG1zZ19vcHBvKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBmb3VuZCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAvKiBuZWVkIHRvIHJlc2VuZCBmcm9tIG1zZ19vcHBvICsxIHVwd2FyZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICAgICAgICAgICAgICAgICAgICByZXNlbmRpbmcgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAvKiBmaW5kIHRoZSBjb3JyZWN0IHBhY2tldCB0byByZXNlbmQgZnJvbSAqLworICAgICAgICAgICAgICAgICAgICBwYWNrZXQgPSB3cml0ZVF1ZXVlUm9vdDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCgocGFja2V0LT5wa19uZXh0KSAhPSBOVUxMKSAmJiAhZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocGFja2V0LT5wa19idWZmZXJbQ0ZfT1BQT19TRVFfQllURV9QT1NdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IG1zZ19vcHBvKzEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlbmRfcGt0ID0gcGFja2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldCA9IHBhY2tldC0+cGtfbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYW5pYygidHJ5aW5nIHRvIHJlc2VuZCBub24tZXhpc3RlbnQgcGFja2V0c1xuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoT3Bwb1NlcSAhPSBtc2dfaG9tZSkgeworICAgICAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgICAgICogc2VuZCBhIHJlc2VuZCByZXF1ZXN0IHRlbGxpbmcgdGhlIHRhcmdldCB3aGVyZSB3ZSB0aGluaworICAgICAgICAgICAgICAgICAgICAgKiB0aGUgd29ybGQgaXMgYXQgCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRfcmVzZW5kX21zZyhEQ19EQlVHKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBub3QgYSByZXNlbmQgcmVxdWVzdCwgbGV0cyBjaGVjayB0aGUgc2VxdWVuY2UgbnVtYmVycyAqLworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICgocGFja2V0LT5wa19idWZmZXJbQ0ZfQ0hBTk5FTF9CWVRFX1BPU10gIT0gQ0lfSEJPT1QpICYmCisgICAgICAgICAgICAgICAgICAgIChwYWNrZXQtPnBrX2J1ZmZlcltDRl9DSEFOTkVMX0JZVEVfUE9TXSAhPSBDSV9UQk9PVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRwX2VyciA9IGNoZWNrX3NlcShtc2dfaG9tZSwgbXNnX29wcG8pOworICAgICAgICAgICAgICAgICAgICBpZiAoYWRwX2VyciA9PSBhZHBfc2VxX2xvdykgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgaGF2ZSBhbHJlYWR5IHJlY2VpdmVkIHRoaXMgcGFja2V0IHNvIGRpc2NhcmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZHBfZXJyID09IGFkcF9zZXFfaGlnaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHdlIG11c3QgaGF2ZSBtaXNzZWQgYSBwYWNrZXQgc29tZXdoZXJlLCBkaXNjYXJkIHRoaXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBwYWNrZXQgYW5kIHRlbGwgdGhlIHRhcmdldCB3aGVyZSB3ZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9yZXNlbmRfbXNnKERDX0RCVUcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICogbm93IHBhc3MgdGhlIHBhY2tldCB0byB3aG9ldmVyIGlzIHdhaXRpbmcgZm9yIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICBGaXJlQ2FsbGJhY2socGFja2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgIEZpcmVDYWxsYmFjayhwYWNrZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZWxzZQorICAgICAgICAvKgorICAgICAgICAgICAgICogbm93IHBhc3MgdGhlIHBhY2tldCB0byB3aG9ldmVyIGlzIHdhaXRpbmcgZm9yIGl0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgRmlyZUNhbGxiYWNrKHBhY2tldCk7CisjZW5kaWYKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFzeW5jX3Byb2Nlc3NfYXBwbF9yZWFkKHZvaWQpCit7CisgICAgUGFja2V0ICpwYWNrZXQ7CisgICAgQWRwRXJycyBhZHBfZXJyOworCisgICAgLyogc2VlIGlmIHRoZXJlIGlzIGFueXRoaW5nIGZvciB0aGUgRENfQVBQTCBjaGFubmVsICovCisgICAgYWRwX2VyciA9IERldlNXX1JlYWQoZGV2aWNlVG9Vc2UsIERDX0FQUEwsICZwYWNrZXQsIEZBTFNFKTsKKworICAgIGlmIChhZHBfZXJyID09IGFkcF9vayAmJiBwYWNrZXQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIGdvdCBhbiBhcHBsaWNhdGlvbiBwYWNrZXQgb24gYSBzaGFyZWQgZGV2aWNlICovCisKKyNpZmRlZiBERUJVRworICAgICAgICBwcmludGYoIkdPVCBEQ19BUFBMIFBBQ0tFVDogbGVuICVkXG5EYXRhOiAiLCBwYWNrZXQtPnBrX2xlbmd0aCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBjOworICAgICAgICAgICAgZm9yICggYyA9IDA7IGMgPCBwYWNrZXQtPnBrX2xlbmd0aDsgKytjICkKKyAgICAgICAgICAgICAgIHByaW50ZiggIiUwMlggIiwgcGFja2V0LT5wa19idWZmZXJbY10gKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisjZW5kaWYKKworICAgICAgICBpZiAoZGNfYXBwbF9oYW5kbGVyICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRjX2FwcGxfaGFuZGxlciggZGV2aWNlVG9Vc2UsIHBhY2tldCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogZm9yIG5vdywganVzdCBmcmVlIGl0ISEgKi8KKyNpZmRlZiBERUJVRworICAgICAgICAgICAgcHJpbnRmKCJubyBoYW5kbGVyIC0gZHJvcHBpbmcgRENfQVBQTCBwYWNrZXRcbiIpOworI2VuZGlmCisgICAgICAgICAgICBEZXZTV19GcmVlUGFja2V0KCBwYWNrZXQgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgYXN5bmNfcHJvY2Vzc193cml0ZSggY29uc3QgQXN5bmNNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpjb25zdCBmaW5pc2hlZCAgKQoreworICAgIFBhY2tldCAqcGFja2V0OworCisjaWZkZWYgREVCVUcKKyAgICBzdGF0aWMgdW5zaWduZWQgaW50IG51bV93cml0dGVuID0gMDsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBOT1RFOiBoZXJlIHdlIHJlbHkgaW4gdGhlIGZhY3QgdGhhdCBhbnkgcGFja2V0IGluIHRoZSB3cml0ZVF1ZXVlU2VuZAorICAgICAqIHNlY3Rpb24gb2YgdGhlIHF1ZXVlIHdpbGwgbmVlZCBpdHMgc2VxdWVuY2UgbnVtYmVyIHNldHRpbmcgdXAgd2hpbGUKKyAgICAgKiBhbmQgcGFja2V0IGluIHRoZSB3cml0ZVF1ZXVlUm9vdCBzZWN0aW9uIHdpbGwgaGF2ZSBpdHMgc2VxdWVuY2UKKyAgICAgKiBudW1iZXJzIHNldCB1cCBmcm9tIHdoZW4gaXQgd2FzIGZpcnN0IHNlbnQgc28gd2UgY2FuIGVhc2lseSBsb29rCisgICAgICogdXAgdGhlIHBhY2tldCBudW1iZXJzIHdoZW4oaWYpIHdlIHdhbnQgdG8gcmVzZW5kIHRoZSBwYWNrZXQuCisgICAgICovCisKKyNpZmRlZiBERUJVRworICAgIGlmICh3cml0ZVF1ZXVlU2VuZCE9TlVMTCkKKyAgICAgICBwcmludGYoIndyaXR0ZW4gMHgleFxuIixudW1fd3JpdHRlbiArPSB3cml0ZVF1ZXVlU2VuZC0+cGtfbGVuZ3RoKTsKKyNlbmRpZgorICAgIC8qCisgICAgICogZ2l2ZSB0aGUgc3dpdGNoZXIgYSBjaGFuY2UgdG8gY29tcGxldGUgYW55IHBhcnRpYWwgd3JpdGVzCisgICAgICovCisgICAgaWYgKERldlNXX0ZsdXNoUGVuZGluZ1dyaXRlKGRldmljZVRvVXNlKSA9PSBhZHBfd3JpdGVfYnVzeSkKKyAgICB7CisgICAgICAgIC8qIG5vIHBvaW50IHRyeWluZyBhIG5ldyB3cml0ZSAqLworICAgICAgICByZXR1cm47CisgICAgfQorICAgICAgCisgICAgLyoKKyAgICAgKiBub3cgc2VlIHdoZXRoZXIgdGhlcmUgaXMgYW55dGhpbmcgdG8gd3JpdGUKKyAgICAgKi8KKyAgICBwYWNrZXQgPSBOVUxMOworICAgIGlmIChyZXNlbmRpbmcpIHsKKyAgICAgICAgcGFja2V0ID0gcmVzZW5kX3BrdDsKKyNpZmRlZiBSRVRfREVCVUcKKyAgICAgICAgcHJpbnRmKCJyZXNlbmRpbmcgaHNlcSAweCV4IG9zZXEgMHgleFxuIiwgCisgICAgICAgICAgICAgICBwYWNrZXQtPnBrX2J1ZmZlcltDRl9IT01FX1NFUV9CWVRFX1BPU10sCisgICAgICAgICAgICAgICBwYWNrZXQtPnBrX2J1ZmZlcltDRl9PUFBPX1NFUV9CWVRFX1BPU10pOworI2VuZGlmCisgICAgfQorICAgIGVsc2UgaWYgKHdyaXRlUXVldWVTZW5kICE9IE5VTEwpIHsKKyNpZmRlZiBSRVRSQU5TCisgICAgICAgIC8qIHNldCB1cCB0aGUgc2VxdWVuY2UgbnVtYmVyIG9uIHRoZSBwYWNrZXQgKi8KKyAgICAgICAgcGFja2V0ID0gd3JpdGVRdWV1ZVNlbmQ7CisgICAgICAgIEhvbWVTZXErKzsKKyAgICAgICAgKHdyaXRlUXVldWVTZW5kLT5wa19idWZmZXJbQ0ZfT1BQT19TRVFfQllURV9QT1NdKQorICAgICAgICAgICAgPSBPcHBvU2VxOworICAgICAgICAod3JpdGVRdWV1ZVNlbmQtPnBrX2J1ZmZlcltDRl9IT01FX1NFUV9CWVRFX1BPU10pCisgICAgICAgICAgICA9IEhvbWVTZXE7CisgICAgICAgICh3cml0ZVF1ZXVlU2VuZC0+cGtfYnVmZmVyW0NGX0ZMQUdTX0JZVEVfUE9TXSkKKyAgICAgICAgICAgID0gQ0ZfUkVMSUFCTEU7CisjIGlmZGVmIFJFVF9ERUJVRworICAgICAgICBwcmludGYoInNlbmRpbmcgcGFja2V0IHdpdGggaHNlcSAweCV4IG9zZXEgMHgleFxuIiwKKyAgICAgICAgICAgICAgIHdyaXRlUXVldWVTZW5kLT5wa19idWZmZXJbQ0ZfSE9NRV9TRVFfQllURV9QT1NdLAorICAgICAgICAgICAgICAgd3JpdGVRdWV1ZVNlbmQtPnBrX2J1ZmZlcltDRl9PUFBPX1NFUV9CWVRFX1BPU10pOworIyBlbmRpZgorI2VuZGlmIC8qIFJFVFJBTlMgKi8KKyAgICB9CisKKyAgICBpZiAocGFja2V0ICE9IE5VTEwpIHsKKyAgICAgICAgQWRwRXJycyBkZXZfZXJyOworCisjaWZkZWYgRkFLRV9CQURfTElORV9UWAorICAgICAgICBmYWtlX2JhZF9saW5lX3R4KCk7CisjZW5kaWYKKworICAgICAgICBkZXZfZXJyID0gRGV2U1dfV3JpdGUoZGV2aWNlVG9Vc2UsIHBhY2tldCwgRENfREJVRyk7CisgICAgICAgIGlmIChkZXZfZXJyID09IGFkcF9vaykgeworI2lmZGVmIFJFVFJBTlMKKyAgICAgICAgICAgIGlmIChyZXNlbmRpbmcpIHsKKyAgICAgICAgICAgICAgICAvKiBjaGVjayB0byBzZWUgaWYgd2UndmUgcmVjb3ZlcmVkIHlldCAqLworICAgICAgICAgICAgICAgIGlmICgocGFja2V0LT5wa19uZXh0KSA9PSBOVUxMKXsKKyMgaWZkZWYgUkVUX0RFQlVHCisgICAgICAgICAgICAgICAgICAgIHByaW50Zigid2UgaGF2ZSByZWNvdmVyZWRcbiIpOworIyBlbmRpZgorICAgICAgICAgICAgICAgICAgICByZXNlbmRpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc2VuZF9wa3QgPSByZXNlbmRfcGt0LT5wa19uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIAorICAgICAgICAgICAgICAgICAqIG1vdmUgdGhlIHBhY2tldCB3ZSBqdXN0IHNlbnQgZnJvbSB0aGUgc2VuZCBxdWV1ZSB0byB0aGUgcm9vdAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIFBhY2tldCAqdG1wX3BrdCwgKnRtcDsKKworIyBpZmRlZiBGQUtFX0JBRF9MSU5FX1RYCisgICAgICAgICAgICAgICAgdW5mYWtlX2JhZF9saW5lX3R4KCk7CisjIGVuZGlmCisKKyAgICAgICAgICAgICAgICB0bXBfcGt0ID0gd3JpdGVRdWV1ZVNlbmQ7CisgICAgICAgICAgICAgICAgd3JpdGVRdWV1ZVNlbmQgPSB3cml0ZVF1ZXVlU2VuZC0+cGtfbmV4dDsKKyAgICAgICAgICAgICAgICB0bXBfcGt0LT5wa19uZXh0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpZiAod3JpdGVRdWV1ZVJvb3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICB3cml0ZVF1ZXVlUm9vdCA9IHRtcF9wa3Q7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IHdyaXRlUXVldWVSb290OworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodG1wLT5wa19uZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcC0+cGtfbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0bXAtPnBrX25leHQgPSB0bXBfcGt0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbHNlICAvKiBub3QgUkVUUkFOUyAqLworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIHN3aXRjaGVyIGhhcyB0YWtlbiB0aGUgd3JpdGUsIHNvIHJlbW92ZSBpdCBmcm9tIHRoZQorICAgICAgICAgICAgICogcXVldWUsIGFuZCBmcmVlIGl0cyByZXNvdXJjZXMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgRGV2U1dfRnJlZVBhY2tldChBZHBfcmVtb3ZlRnJvbVF1ZXVlKCZ3cml0ZVF1ZXVlU2VuZCkpOworI2VuZGlmIC8qIGlmIFJFVFJBTlMgLi4uIGVsc2UgLi4uICovCisKKyAgICAgICAgICAgIGlmIChtb2RlID09IGFzeW5jX2Jsb2NrX29uX3dyaXRlKQorICAgICAgICAgICAgICAgKmZpbmlzaGVkID0gRGV2U1dfV3JpdGVGaW5pc2hlZChkZXZpY2VUb1VzZSk7CisKKyAgICAgICAgfSAvKiBlbmRpZiB3cml0ZSBvayAqLworICAgIH0KKyAgICBlbHNlIC8qIHBhY2tldCA9PSBOVUxMICovCisgICAgeworICAgICAgICBpZiAobW9kZSA9PSBhc3luY19ibG9ja19vbl93cml0ZSkKKyAgICAgICAgICAgKmZpbmlzaGVkID0gRGV2U1dfV3JpdGVGaW5pc2hlZChkZXZpY2VUb1VzZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhc3luY19wcm9jZXNzX2hlYXJ0YmVhdCggdm9pZCApCit7CisgICAgLyogY2hlY2sgdG8gc2VlIHdoZXRoZXIgd2UgbmVlZCB0byBzZW5kIGEgaGVhcnRiZWF0ICovCisgICAgZ2V0dGltZW9mZGF5KCZ0aW1lX25vdywgTlVMTCk7CisKKyAgICBpZiAodHZfZGlmZigmdGltZV9ub3csICZ0aW1lX2xhc3RhbGl2ZSkgPj0gSEVBUlRSQVRFKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogaWYgd2UndmUgbm90IGJvb3RlZCB0aGVuIGRvbid0IGRvIHNlbmQgYSBoZWFydHJhdGUgdGhlIGxpbmsKKyAgICAgICAgICogbXVzdCBiZSByZWxpYWJsZSBlbm91Z2ggZm9yIHVzIHRvIGJvb3Qgd2l0aG91dCBhbnkgY2xldmVyIHN0dWZmLAorICAgICAgICAgKiBpZiB3ZSBjYW4ndCBkbyB0aGlzIHRoZW4gdGhlcmVzIGxpdHRsZSBjaGFuY2Ugb2YgdGhlIGxpbmsgc3RheWluZworICAgICAgICAgKiB0b2dldGhlciBldmVuIHdpdGggdGhlIHJlc2VuZHMgZXRjCisgICAgICAgICAqLworICAgICAgICBpZiAoaGVhcnRiZWF0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIGdldHRpbWVvZmRheSgmdGltZV9sYXN0YWxpdmUsIE5VTEwpOworICAgICAgICAgICAgcGFjZW1ha2VyKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFzeW5jX3Byb2Nlc3NfY2FsbGJhY2tzKCB2b2lkICkKK3sKKyAgICAvKiBjYWxsIGFueSByZWdpc3RlcmVkIGFzeW5jaHJvbm91cyBjYWxsYmFja3MgKi8KKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9hc3luY19jYWxsYmFja3M7ICsraSApCisgICAgICAgYXN5bmNfY2FsbGJhY2tzW2ldKCBkZXZpY2VUb1VzZSwgJnRpbWVfbm93ICk7Cit9CisKK3ZvaWQgQWRwX0FzeW5jaHJvbm91c1Byb2Nlc3NpbmcoY29uc3QgQXN5bmNNb2RlIG1vZGUpCit7CisgICAgYm9vbCBmaW5pc2hlZCA9IEZBTFNFOworI2lmZGVmIERFQlVHCisgICAgdW5zaWduZWQgaW50IHdjID0gMCwgZGMgPSAwLCBhYyA9IDAsIGhjID0gMDsKKyMgZGVmaW5lIElOQ19DT1VOVCh4KSAoKHgpKyspCisjZWxzZQorIyBkZWZpbmUgSU5DX0NPVU5UKHgpCisjZW5kaWYKKworICAgIGlmICgodGltZV9sYXN0YWxpdmUudHZfc2VjID09IDApICYmICh0aW1lX2xhc3RhbGl2ZS50dl91c2VjID09IDApKSB7CisgICAgICAvKiBmaXJzdCB0aW1lIHRocm91Z2gsIG5lZWRzIGluaXRpbmcgKi8KKyAgICAgIGdldHRpbWVvZmRheSgmdGltZV9sYXN0YWxpdmUsIE5VTEwpOworICAgIH0KKworICAgIC8qIG1haW4gbG9vcCAqLworICAgIGRvCisgICAgeworICAgICAgICBhc3luY19wcm9jZXNzX3dyaXRlKCBtb2RlLCAmZmluaXNoZWQgKTsKKyAgICAgICAgSU5DX0NPVU5UKHdjKTsKKworICAgICAgICBpZiAoICEgZmluaXNoZWQgJiYgbW9kZSAhPSBhc3luY19ibG9ja19vbl93cml0ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzeW5jX3Byb2Nlc3NfZGJ1Z19yZWFkKCBtb2RlLCAmZmluaXNoZWQgKTsKKyAgICAgICAgICAgIElOQ19DT1VOVChkYyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICEgZmluaXNoZWQgJiYgbW9kZSAhPSBhc3luY19ibG9ja19vbl93cml0ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgYXN5bmNfcHJvY2Vzc19hcHBsX3JlYWQoKTsKKyAgICAgICAgICAgSU5DX0NPVU5UKGFjKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggISBmaW5pc2hlZCApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaGVhcnRiZWF0X2NvbmZpZ3VyZWQpCisgICAgICAgICAgICBhc3luY19wcm9jZXNzX2hlYXJ0YmVhdCgpOworICAgICAgICAgIGFzeW5jX3Byb2Nlc3NfY2FsbGJhY2tzKCk7CisgICAgICAgICAgSU5DX0NPVU5UKGhjKTsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSAoIWZpbmlzaGVkICYmIG1vZGUgIT0gYXN5bmNfYmxvY2tfb25fbm90aGluZyk7CisKKyNpZmRlZiBERUJVRworICAgIGlmICggbW9kZSAhPSBhc3luY19ibG9ja19vbl9ub3RoaW5nICkKKyAgICAgICBwcmludGYoICJBc3luYzogJXMgLSB3ICVkLCBkICVkLCBhICVkLCBoICVkXG4iLAorICAgICAgICAgICAgICAgbW9kZSA9PSBhc3luY19ibG9ja19vbl93cml0ZSA/ICJibGtfd3JpdGUiIDogImJsa19yZWFkIiwKKyAgICAgICAgICAgICAgIHdjLCBkYywgYWMsIGhjICk7CisjZW5kaWYKK30KKworLyoKKyAqIGluc3RhbGwgYSBoYW5kbGVyIGZvciBEQ19BUFBMIHBhY2tldHMgKGNhbiBiZSBOVUxMKSwgcmV0dXJuaW5nIG9sZCBvbmUuCisgKi8KK0RDX0FwcGxfSGFuZGxlciBBZHBfSW5zdGFsbF9EQ19BcHBsX0hhbmRsZXIoY29uc3QgRENfQXBwbF9IYW5kbGVyIGhhbmRsZXIpCit7CisgICAgRENfQXBwbF9IYW5kbGVyIG9sZF9oYW5kbGVyID0gZGNfYXBwbF9oYW5kbGVyOworCisjaWZkZWYgREVCVUcKKyAgICBwcmludGYoICJJbnN0YWxsaW5nIERDX0FQUEwgaGFuZGxlciAleCAob2xkICV4KVxuIiwgaGFuZGxlciwgb2xkX2hhbmRsZXIgKTsKKyNlbmRpZgorCisgICAgZGNfYXBwbF9oYW5kbGVyID0gaGFuZGxlcjsKKyAgICByZXR1cm4gb2xkX2hhbmRsZXI7Cit9CisKKworLyoKKyAqIGFkZCBhbiBhc3luY2hyb25vdXMgcHJvY2Vzc2luZyBjYWxsYmFjayB0byB0aGUgbGlzdAorICogVFJVRSA9PSBva2F5LCBGQUxTRSA9PSBubyBtb3JlIGFzeW5jIHByb2Nlc3Npbmcgc2xvdHMKKyAqLworYm9vbCBBZHBfSW5zdGFsbF9Bc3luY19DYWxsYmFjayggY29uc3QgQWRwX0FzeW5jX0NhbGxiYWNrIGNhbGxiYWNrX3Byb2MgKQoreworICAgIGlmICggbnVtX2FzeW5jX2NhbGxiYWNrcyA8IE1BWF9BU1lOQ19DQUxMQkFDS1MgJiYgY2FsbGJhY2tfcHJvYyAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIGFzeW5jX2NhbGxiYWNrc1tudW1fYXN5bmNfY2FsbGJhY2tzXSA9IGNhbGxiYWNrX3Byb2M7CisgICAgICAgICsrbnVtX2FzeW5jX2NhbGxiYWNrczsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoKKyAqIGRlbGF5IGZvciBhIGdpdmVuIHBlcmlvZCAoaW4gbWljcm9zZWNvbmRzKQorICovCit2b2lkIEFkcF9kZWxheSh1bnNpZ25lZCBpbnQgcGVyaW9kKQoreworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworCisjaWZkZWYgREVCVUcKKyAgICBwcmludGYoImRlbGF5aW5nIGZvciAlZCBtaWNyb3NlY29uZHNcbiIsIHBlcmlvZCk7CisjZW5kaWYKKyAgICB0di50dl9zZWMgPSAocGVyaW9kIC8gMTAwMDAwMCk7CisgICAgdHYudHZfdXNlYyA9IChwZXJpb2QgJSAxMDAwMDAwKTsKKworICAgICh2b2lkKXNlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmdHYpOworfQorCisvKiBFT0YgaG9zdGNoYW4uYyAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9ob3N0Y2hhbi5oIGIvZ2RiL3JkaS1zaGFyZS9ob3N0Y2hhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NTYzYTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL2hvc3RjaGFuLmgKQEAgLTAsMCArMSwzMDggQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qIC0qLUMtKi0KKyAqCisgKiAkUmV2aXNpb24kCisgKiAgICAgJERhdGUkCisgKgorICovCisjaWZuZGVmIGFuZ3NkX2hvc3RjaGFuX2gKKyNkZWZpbmUgYW5nc2RfaG9zdGNoYW5faAorCisvKiBJZiB1bmRlciBDeWd3aW4sIHByb3ZpZGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlcgorICAgQ3lnd2luIGNvbXBpbGVycyB0aGF0IGRvbid0IGRlZmluZSB0aGUgY3VycmVudCBjcHAgZGVmaW5lLiAqLworI2lmZGVmIF9fQ1lHV0lOMzJfXworI2lmbmRlZiBfX0NZR1dJTl9fCisjZGVmaW5lIF9fQ1lHV0lOX18KKyNlbmRpZgorI2VuZGlmCisKKy8qIHN0cnVjdCB0aW1ldmFsICovCisjaWYgZGVmaW5lZChfX3VuaXgpIHx8IGRlZmluZWQoX19DWUdXSU4zMl9fKQorIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbHNlCisjICBpbmNsdWRlICJ3aW5zb2NrLmgiCisjICBpbmNsdWRlICJ0aW1lLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImNoYW5kZWZzLmgiCisjaW5jbHVkZSAiYWRwZXJyLmgiCisjaW5jbHVkZSAiZGV2c3cuaCIKKworLyoKKyAqIGFzeW5jaHJvbm91cyBwcm9jZXNzaW5nIG1vZGVzCisgKi8KK2VudW0gQXN5bmNNb2RlCit7CisgICAgYXN5bmNfYmxvY2tfb25fbm90aGluZywKKyAgICBhc3luY19ibG9ja19vbl9yZWFkLAorICAgIGFzeW5jX2Jsb2NrX29uX3dyaXRlCit9OworCisjaWZuZGVmIF9fY3BsdXNwbHVzCit0eXBlZGVmIGVudW0gQXN5bmNNb2RlIEFzeW5jTW9kZTsKKyNlbmRpZgorCisvKgorICogcHJvdG90eXBlIGZvciBjaGFubmVscyBjYWxsYmFjayBmdW5jdGlvbgorICovCit0eXBlZGVmIHZvaWQgKCpDaGFubmVsQ2FsbGJhY2spKFBhY2tldCAqcGFja2V0LCB2b2lkICpzdGF0ZSk7CisKKy8qCisgKiAgRnVuY3Rpb246IEFkcF9pbml0U2VxCisgKiAgIFB1cnBvc2U6IGluaXRpYWxpc2UgdGhlIGNoYW5uZWwgcHJvdG9jb2wgYW5kIHNlcXVlbmNlIG51bWJlcnMKKyAqCisgKiAgICBQYXJhbXM6IG5vbmUKKyAqCisgKiAgIFJldHVybnM6IE5vdGhpbmcKKyAqLworZXh0ZXJuIHZvaWQgQWRwX2luaXRTZXEodm9pZCk7CisKKy8qCisgKiAgRnVuY3Rpb246IEFkcF9hZGRUb1F1ZXVlCisgKiAgIFB1cnBvc2U6IGNoYWluIGEgUGFja2V0IHRvIHRoZSBlbmQgb2YgYSBsaW5rZWQgbGlzdCBvZiBzdWNoIHN0cnVjdHVyZXMKKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgIEluL091dDogaGVhZCAgICBIZWFkIG9mIHRoZSBsaW5rZWQgbGlzdAorICoKKyAqICAgICAgICAgICAgICBuZXdwa3QgIFBhY2tldCB0byBiZSBjaGFpbmVkIG9udG8gdGhlIGxpc3QKKyAqCisgKiAgIFJldHVybnM6IE5vdGhpbmcKKyAqLworZXh0ZXJuIHZvaWQgQWRwX2FkZFRvUXVldWUoUGFja2V0ICoqaGVhZCwgUGFja2V0ICpuZXdwa3QpOworCisvKgorICogIEZ1bmN0aW9uOiByZW1vdmVGcm9tUXVldWUKKyAqICAgUHVycG9zZTogcmVtb3ZlIGEgUGFja2V0IGZyb20gdGhlIGhlYWQgb2YgYSBsaW5rZWQgbGlzdCBvZiBzdWNoIHN0cnVjdHVyZXMKKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgIEluL091dDogaGVhZCAgICBIZWFkIG9mIHRoZSBsaW5rZWQgbGlzdAorICoKKyAqICAgUmV0dXJuczogT2xkIGhlYWQgZnJvbSB0aGUgbGlua2VkIGxpc3QKKyAqCisgKiBQb3N0LWNvbmRpdGlvbnM6IFNlY29uZCBlbGVtZW50IGluIHRoZSBsaXN0IHdpbGwgYmUgdGhlIG5ldyBoZWFkLgorICovCisKK2V4dGVybiBQYWNrZXQgKkFkcF9yZW1vdmVGcm9tUXVldWUoUGFja2V0ICoqaGVhZCk7CisKKy8qCisgKiAgRnVuY3Rpb246IEFkcF9PcGVuRGV2aWNlCisgKiAgIFB1cnBvc2U6IE9wZW4gYSBkZXZpY2UgdG8gdXNlIGZvciBjaGFubmVscyBjb21tdW5pY2F0aW9uLiAgVGhpcyBpcyBhCisgKiAgICAgICAgICAgICAgdmVyeSB0aGluIHZlbmVlciB0byB0aGUgZGV2aWNlIGRyaXZlcnM6IHdoYXQgaG9zdGNoYW4uYworICogICAgICAgICAgICAgIHdpbGwgZG8gaXMgY2FsbCBEZXZpY2VNYXRjaCBmb3IgZWFjaCBkZXZpY2UgZHJpdmVyIHVudGlsIGl0CisgKiAgICAgICAgICAgICAgZmluZHMgYSBkcml2ZXIgdGhhdCB3aWxsIGFjY2VwdCBuYW1lIGFuZCBhcmcsIHRoZW4gY2FsbAorICogICAgICAgICAgICAgIERldmljZU9wZW4gZm9yIHRoYXQgZGV2aWNlLgorICoKKyAqICBQcmUtY29uZGl0aW9uczogTm8gcHJldmlvdXMgb3BlbiBpcyBzdGlsbCBhY3RpdmUKKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgICBJbnB1dDogbmFtZSAgICBJZGVudGlmaWVzIHdoaWNoIGRldmljZSB0byBvcGVuLiAgVGhpcyBjYW4gZWl0aGVyIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICBhIGhvc3Qgc3BlY2lmaWMgaWRlbnRpZmllciAoZS5nLiAiL2Rldi90dHlhIiwKKyAqICAgICAgICAgICAgICAgICAgICAgICJDT00xOiIpLCBvciBhIG51bWJlciB3aGljaCBpcyB1c2VkIHRvIHJlZmVyIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICBgc3RhbmRhcmQnIGludGVyZmFjZXMsIHNvICIxIiB3b3VsZCBiZSB0aGUgZmlyc3QgaG9zdAorICogICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLCAiMiIgdGhlIHNlY29uZCwgYW5kIHNvIG9uLgorICoKKyAqICAgICAgICAgICAgICBhcmcgICAgIERyaXZlciBzcGVjaWZpYyBhcmd1bWVudHMuICBGb3IgZXhhbXBsZSwgc29tZSBzZXJpYWwKKyAqICAgICAgICAgICAgICAgICAgICAgIGRyaXZlcnMgYWNjZXB0IHNwZWVkIGFuZCBjb250cm9sIGFyZ3VtZW50cyBzdWNoIGFzCisgKiAgICAgICAgICAgICAgICAgICAgICAiOTYwMCIgb3IgIjE5MjAwL05PX0JSRUFLIi4gIFRoZXNlIGFyZ3VtZW50cyBhcmUKKyAqICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlbHkgZnJlZS1mb3JtOiBpdCBpcyB0aGUgaW5kaXZpZHVhbCBkcml2ZXJzCisgKiAgICAgICAgICAgICAgICAgICAgICB3aGljaCBkbyB0aGUgbmVjZXNzYXJ5IGludGVycHJldGF0aW9uLgorICoKKyAqICAgICAgICAgICAgICBoZWFydGJlYXRfb24gIEluY2ljYXRlcyBpZiB0aGUgaGVhcnRiZWF0IGlzIGNvbmZpZ3VyZWQgdG8gYmUgCisgKiAgICAgICAgICAgICAgICAgICAgICB1c2VkIG9yIG5vdCwgdHJ1ZSBpZiBpdCBpcywgZmFsc2Ugb3RoZXJ3aXNlCisgKgorICogICBSZXR1cm5zOgorICogICAgICAgICAgT0s6IGFkcF9vaworICogICAgICAgRXJyb3I6IGFkcF9kZXZpY2Vfbm90X2tub3duLAorICogICAgICAgICAgICAgIGFkcF9kZXZpY2Vfb3Blbl9mYWlsZWQKKyAqICAgICAgICAgICAgICBhZHBfZGV2aWNlX2FscmVhZHlfb3BlbgorICovCitBZHBFcnJzIEFkcF9PcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhlYXJ0YmVhdF9vbik7CisKKy8qCisgKiAgRnVuY3Rpb246IEFkcF9DbG9zZURldmljZQorICogICBQdXJwb3NlOiBDbG9zZSB0aGUgZGV2aWNlIHVzZWQgZm9yIGNoYW5uZWxzIGNvbW11bmljYXRpb24uCisgKgorICogICAgUGFyYW1zOiBOb25lCisgKgorICogICBSZXR1cm5zOgorICogICAgICAgICAgT0s6IGFkcF9vaworICogICAgICAgRXJyb3I6IGFkcF9kZXZpY2Vfbm90X29wZW4KKyAqLworQWRwRXJycyBBZHBfQ2xvc2VEZXZpY2Uodm9pZCk7CisKKy8qCisgKiAgRnVuY3Rpb246IEFkcF9Jb2N0bAorICogICBQdXJwb3NlOiBQZXJmb3JtIG1pc2NlbGxhbmVvdXMgY29udHJvbCBvcGVyYXRpb25zIG9uCisgKiAgICAgICAgICAgICAgdGhlIGRldmljZSB1c2VkIGZvciBjaGFubmVscyBjb21tdW5pY2F0aW9uLgorICogICAgICAgICAgICAgIFRoaXMgaXMgYSBtaW5pbWFsIHZlbmVlciB0byBEZXZTV19Jb2N0bC4KKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgICBJbnB1dDogb3Bjb2RlICBSZWFzb24gY29kZSBpbmRpY2F0aW5nIHRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybS4KKyAqICAgICAgSW4vT3V0OiBhcmdzICAgIFBvaW50ZXIgdG8gb3Bjb2RlLXNlbnNpdGl2ZSBhcmd1bWVudHMvcmVzdWx0IHNwYWNlLgorICoKKyAqCisgKiAgIFJldHVybnM6CisgKiAgICAgICAgICBPSzogYWRwX29rCisgKiAgICAgICBFcnJvcjogYWRwX2RldmljZV9ub3Rfb3BlbiwgYWRwX2ZhaWxlZAorICovCitBZHBFcnJzIEFkcF9Jb2N0bChpbnQgb3Bjb2RlLCB2b2lkICphcmdzKTsKKworLyoKKyAqICBGdW5jdGlvbjogQWRwX0NoYW5uZWxSZWdpc3RlclJlYWQKKyAqICAgUHVycG9zZTogUmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgcmVjZWl2ZWQgcGFja2V0cyBvbiBhIGdpdmVuCisgKiAgICAgICAgICAgICAgY2hhbm5lbAorICoKKyAqICAgIFBhcmFtczoKKyAqICAgICAgIElucHV0OiBjaGFuICAgIFRoZSBjaGFubmVsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBmb3IuCisgKgorICogICAgICAgICAgICAgIGNiZnVuYyAgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uLiAgSWYgTlVMTCwgdGhlbiB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgaXMgcmVtb3ZlZC4KKyAqCisgKiAgICAgICAgICAgICAgY2JzdGF0ZSBTdGF0ZSBwb2ludGVyIHRvIHBhc3MgaW50byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKyAqCisgKiAgIFJldHVybnM6CisgKiAgICAgICAgICBPSzogYWRwX29rCisgKiAgICAgICBFcnJvcjogYWRwX2RldmljZV9ub3Rfb3BlbgorICogICAgICAgICAgICAgIGFkcF9iYWRfY2hhbm5lbF9pZAorICoKKyAqIFBvc3QtY29uZGl0aW9uczogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgcGFja2V0IHRoYXQgaXMgcGFzc2VkIHRvIGl0LCB3aGVuIHRoYXQgcGFja2V0IGlzCisgKiAgICAgICAgICAgICAgICAgICAgICBubyBsb25nZXIgbmVlZGVkLgorICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisgICAgCitleHRlcm4gQWRwRXJycyBBZHBfQ2hhbm5lbFJlZ2lzdGVyUmVhZChjb25zdCBDaGFubmVsSUQgY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDaGFubmVsQ2FsbGJhY2sgY2JmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYnN0YXRlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfQorI2VuZGlmCisvKgorICogIEZ1bmN0aW9uOiBBZHBfQ2hhbm5lbFJlYWQKKyAqICAgUHVycG9zZTogV2FpdCB1bnRpbCBhIHBhY2tldCBoYXMgYmVlbiByZWFkIGZvciBhIGdpdmVuIGNoYW5uZWwsIGFuZAorICogICAgICAgICAgICAgIHRoZW4gcmV0dXJuIGl0LiAgQ2FsbGJhY2tzIGZvciBvdGhlciBjaGFubmVscyBhcmUgc3RpbGwKKyAqICAgICAgICAgICAgICBhY3RpdmUgd2hpbGUgdGhpcyByZWFkIGlzIGJsb2NraW5nLgorICoKKyAqICBQcmUtY29uZGl0aW9uczogTm8gY2FsbGJhY2sgaGFzIGJlZW4gYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgY2hhbm5lbC4KKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgICBJbnB1dDogY2hhbiAgICBUaGUgY2hhbm5lbCB0byByZWFkLgorICoKKyAqICAgICAgT3V0cHV0OiBwYWNrZXQgIFRoZSByZWNlaXZlZCBwYWNrZXQuCisgKgorICogICBSZXR1cm5zOgorICogICAgICAgICAgT0s6IGFkcF9vaworICogICAgICAgRXJyb3I6IGFkcF9kZXZpY2Vfbm90X29wZW4KKyAqICAgICAgICAgICAgICBhZHBfYmFkX2NoYW5uZWxfaWQKKyAqICAgICAgICAgICAgICBhZHBfY2FsbGJhY2tfYWxyZWFkeV9yZWdpc3RlcmVkCisgKgorICogUG9zdC1jb25kaXRpb25zOiBUaGUgY2FsbGluZyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkIHBhY2tldCwgd2hlbiB0aGF0IHBhY2tldCBpcyBubyBsb25nZXIKKyAqICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZC4KKyAqLworQWRwRXJycyBBZHBfQ2hhbm5lbFJlYWQoY29uc3QgQ2hhbm5lbElEIGNoYW4sIFBhY2tldCAqKnBhY2tldCk7CisKKy8qCisgKiAgRnVuY3Rpb246IEFkcF9DaGFubmVsV3JpdGUKKyAqICAgUHVycG9zZTogV3JpdGUgYSBwYWNrZXQgdG8gdGhlIGdpdmVuIGNoYW5uZWwKKyAqCisgKiAgUHJlLWNvbmRpdGlvbnM6IENoYW5uZWwgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBvcGVuZWQuCisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IGNoYW4gICAgVGhlIGNoYW5uZWwgdG8gd3JpdGUuCisgKgorICogICAgICAgICAgICAgIHBhY2tldCAgVGhlIHBhY2tldCB0byB3cml0ZS4KKyAqCisgKiAgIFJldHVybnM6CisgKiAgICAgICAgICBPSzogYWRwX29rCisgKiAgICAgICBFcnJvcjogYWRwX2RldmljZV9ub3Rfb3BlbgorICogICAgICAgICAgICAgIGFkcF9iYWRfY2hhbm5lbF9pZAorICoKKyAqIFBvc3QtY29uZGl0aW9uczogVGhlIHBhY2tldCBiZWluZyB3cml0dGVuIGJlY29tZXMgdGhlICJwcm9wZXJ0eSIgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgIEFkcF9DaGFubmVsV3JpdGUsIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFja2V0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAqLworQWRwRXJycyBBZHBfQ2hhbm5lbFdyaXRlKGNvbnN0IENoYW5uZWxJRCBjaGFuLCBQYWNrZXQgKnBhY2tldCk7CisKKy8qCisgKiAgRnVuY3Rpb246IEFkcF9DaGFubmVsV3JpdGVBc3luYworICogICBQdXJwb3NlOiBXcml0ZSBhIHBhY2tldCB0byB0aGUgZ2l2ZW4gY2hhbm5lbCwgYnV0IGRvbid0IHdhaXQKKyAqICAgICAgICAgICAgZm9yIHRoZSB3cml0ZSB0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nLgorICoKKyAqICBQcmUtY29uZGl0aW9uczogQ2hhbm5lbCBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IG9wZW5lZC4KKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgICBJbnB1dDogY2hhbiAgICBUaGUgY2hhbm5lbCB0byB3cml0ZS4KKyAqCisgKiAgICAgICAgICAgICAgcGFja2V0ICBUaGUgcGFja2V0IHRvIHdyaXRlLgorICoKKyAqICAgUmV0dXJuczoKKyAqICAgICAgICAgIE9LOiBhZHBfb2sKKyAqICAgICAgIEVycm9yOiBhZHBfZGV2aWNlX25vdF9vcGVuCisgKiAgICAgICAgICAgICAgYWRwX2JhZF9jaGFubmVsX2lkCisgKgorICogUG9zdC1jb25kaXRpb25zOiBUaGUgcGFja2V0IGJlaW5nIHdyaXR0ZW4gYmVjb21lcyB0aGUgInByb3BlcnR5IiBvZgorICogICAgICAgICAgICAgICAgICAgICAgQWRwX0NoYW5uZWxXcml0ZSwgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYWNrZXQgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgorICovCitBZHBFcnJzIEFkcF9DaGFubmVsV3JpdGVBc3luYyhjb25zdCBDaGFubmVsSUQgY2hhbiwgUGFja2V0ICpwYWNrZXQpOworCisvKgorICogIEZ1bmN0aW9uOiBBZHBfQXN5bmNocm9ub3VzUHJvY2Vzc2luZworICogICBQdXJwb3NlOiBUaGlzIHJvdXRpbmUgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHBlcnNpc3RlbnQgYW55IGlkbGUgbG9vcAorICogICAgICAgICAgICAgIHRvIGdpdmUgdGhlIGRhdGEgSS9PIHJvdXRpbmVzIGEgY2hhbmNlIHRvIHBvbGwgZm9yIHBhY2tldAorICogICAgICAgICAgICAgIGFjdGl2aXR5LiAgRGVwZW5kaW5nIHVwb24gdGhlIHJlcXVlc3RlZCBtb2RlLCB0aGlzIHJvdXRpbmUKKyAqICAgICAgICAgICAgICBtYXksIG9yIG1heSBub3QsIGJsb2NrLgorICoKKyAqICAgIFBhcmFtczoKKyAqICAgICAgIElucHV0OiBtb2RlICAgIFNwZWNpZmllcyB3aGV0aGVyIHRvIGJsb2NrIHVudGlsIGEgY29tcGxldGUgcGFja2V0CisgKiAgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiByZWFkLCBhbGwgcGVuZGluZyB3cml0ZXMgaGF2ZSBjb21wbGV0ZWQsCisgKiAgICAgICAgICAgICAgICAgICAgICBvciBub3QgdG8gYmxvY2sgYXQgYWxsLgorICoKKyAqICAgUmV0dXJuczogTm90aGluZy4KKyAqLwordm9pZCBBZHBfQXN5bmNocm9ub3VzUHJvY2Vzc2luZyhjb25zdCBBc3luY01vZGUgbW9kZSk7CisKKy8qCisgKiBwcm90b3R5cGUgZm9yIERDX0FQUEwgcGFja2V0IGhhbmRsZXIKKyAqLwordHlwZWRlZiB2b2lkICgqRENfQXBwbF9IYW5kbGVyKShjb25zdCBEZXZpY2VEZXNjciAqZGV2aWNlLCBQYWNrZXQgKnBhY2tldCk7CisKKy8qCisgKiBpbnN0YWxsIGEgaGFuZGxlciBmb3IgRENfQVBQTCBwYWNrZXRzIChjYW4gYmUgTlVMTCksIHJldHVybmluZyBvbGQgb25lLgorICovCitEQ19BcHBsX0hhbmRsZXIgQWRwX0luc3RhbGxfRENfQXBwbF9IYW5kbGVyKGNvbnN0IERDX0FwcGxfSGFuZGxlciBoYW5kbGVyKTsKKworLyoKKyAqIHByb3RvdHlwZSBmb3IgYXN5bmNocm9ub3VzIHByb2Nlc3NpbmcgY2FsbGJhY2sKKyAqLwordHlwZWRlZiB2b2lkICgqQWRwX0FzeW5jX0NhbGxiYWNrKShjb25zdCBEZXZpY2VEZXNjciAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXZhbCAqY29uc3QgdGltZV9ub3cpOworCisvKgorICogYWRkIGFuIGFzeW5jaHJvbm91cyBwcm9jZXNzaW5nIGNhbGxiYWNrIHRvIHRoZSBsaXN0CisgKiBUUlVFID09IG9rYXksIEZBTFNFID09IG5vIG1vcmUgYXN5bmMgcHJvY2Vzc2luZyBzbG90cworICovCitib29sIEFkcF9JbnN0YWxsX0FzeW5jX0NhbGxiYWNrKCBjb25zdCBBZHBfQXN5bmNfQ2FsbGJhY2sgY2FsbGJhY2tfcHJvYyApOworCisvKgorICogZGVsYXkgZm9yIGEgZ2l2ZW4gcGVyaW9kIChpbiBtaWNyb3NlY29uZHMpCisgKi8KK3ZvaWQgQWRwX2RlbGF5KHVuc2lnbmVkIGludCBwZXJpb2QpOworCisjZW5kaWYgLyogbmRlZiBhbmdzZF9ob3N0Y2hhbl9oICovCisKKy8qIEVPRiBob3N0Y2hhbi5oICovCmRpZmYgLS1naXQgYS9nZGIvcmRpLXNoYXJlL2hzeXMuYyBiL2dkYi9yZGktc2hhcmUvaHN5cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNDJhMzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL2hzeXMuYwpAQCAtMCwwICsxLDkxNSBAQAorLyogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgdXNlZCwgY29waWVkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzIHByZXNlcnZlZCBpbiBhbGwgY29waWVzIG9mIHRoZQorICogc29mdHdhcmUuCisgKi8KKworLyoKKyAqIEhvc3QgQyBMaWJyYXJ5IHN1cHBvcnQgZnVuY3Rpb25zLgorICoKKyAqICRSZXZpc2lvbiQKKyAqICAgICAkRGF0ZSQKKyAqLworCisjaWZkZWYgREVCVUcKKyMgIGluY2x1ZGUgPGN0eXBlLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJhZHAuaCIKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiYXJkaS5oIgorI2luY2x1ZGUgImJ1ZmZlcnMuaCIKKyNpbmNsdWRlICJjaGFubmVscy5oIiAgICAgICAgLyogQ2hhbm5lbCBpbnRlcmZhY2UuICovCisjaW5jbHVkZSAiZW5kaWFuLmgiCisjaW5jbHVkZSAibG9nZ2luZy5oIiAgICAgICAgIC8qIEFuZ2VsIHN1cHBvcnQgZnVuY3Rpb25zLiAqLworI2luY2x1ZGUgIm1zZ2J1aWxkLmgiCisjaW5jbHVkZSAic3lzLmgiICAgIAorI2luY2x1ZGUgImhzeXMuaCIgICAgICAvKiBGdW5jdGlvbiBhbmQgc3RydWN0dXJlIGRlY2xhcmF0aW9ucy4gKi8KKyNpbmNsdWRlICJob3N0Y2hhbi5oIgorCisjZGVmaW5lIEZJTEVIQU5ETEUgaW50CisKKy8qIE5vdGU6IG5vIHN0YXRpY3MgYWxsb3dlZC4gIEFsbCBnbG9iYWxzIG11c3QgYmUgbWFsbG9jKCllZCBvbiB0aGUgaGVhcC4KKyAgIFRoZSBzdGF0ZSBzdHJ1Y3QgaXMgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLiAgU2VlICdoc3lzLmgnLiAgICAgICAgICAgICAgICAqLworLyogVGhpcyBpcyB0aGUgbWVzc2FnZSBoYW5kbGVyIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgY2hhbm5lbCBtYW5hZ2VyIGluCisgICBIb3N0U3lzSW5pdC4gIEl0IGlzIGNhbGxlZCB3aGVuZXZlciBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuICdidWZmcHRyJworICAgcG9pbnRzIHRvIHRoZSBtZXNzYWdlIGJvZHkuICBGdW5jdGlvbmFsaXR5IGlzIHByb3ZpZGVkIGJ5IHRoZSBkZWJ1Z2dlcgorICAgdG9vbGtpdC4gIFRoZSByb3V0aW5lIGlzIHZlcnkgbG9vc2VseSBiYXNlZCBvbiB0aGUgSGFuZGxlU1dJIHJvdXRpbmUgZnJvbQorICAgYXJtb3MuYyBpbiB0aGUgYXJtdWxhdG9yIHNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGVzZSByb3V0aW5lcyBjb3VsZCBiZSB0ZXN0ZWQgYnkgcHJvdmlkaW5nIGEgc2ltcGxlIGludGVyZmFjZSB0byBhcm1zZCwgCisgICBhbmQgcnVubmluZyB0aGVtIGluIHRoYXQuICAgKi8KKworCisvKiB0YWtlbiBzdGFpZ2h0IGZyb20gYXJtdWxhdG9yIHNvdXJjZSAqLworI2lmZGVmIF9fcmlzY29zCisgIGV4dGVybiBpbnQgX2Zpc2F0dHkoRklMRSAqKTsKKyMgZGVmaW5lIGlzYXR0eV8oZikgX2Zpc2F0dHkoZikKKyMgZGVmaW5lIEVNRklMRSAtMQorIyBkZWZpbmUgRUJBREYgLTEKKyAgaW50IF9rZXJuZWxfZXNjYXBlX3NlZW4odm9pZCkgeyByZXR1cm4gMCA7fQorI2Vsc2UKKyMgaWYgZGVmaW5lZChfV0lORE9XUykgfHwgZGVmaW5lZChfQ09OU09MRSkKKyMgICBkZWZpbmUgaXNhdHR5XyhmKSAoZiA9PSBzdGRpbiB8fCBmID09IHN0ZG91dCkKKyMgZWxzZQorIyAgIGlmZGVmIF9fWlRDX18KKyMgICAgIGluY2x1ZGUgPGlvLmg+CisjICAgICBkZWZpbmUgaXNhdHR5XyhmKSBpc2F0dHkoKGYpLT5fZmlsZSkKKyMgICBlbHNlCisjICAgICBpZmRlZiBtYWNpbnRvc2gKKyMgICAgICAgaW5jbHVkZSA8aW9jdGwuaD4KKyMgICAgICAgZGVmaW5lIGlzYXR0eV8oZikgKH5pb2N0bCgoZiktPl9maWxlLEZJT0lOVEVSQUNUSVZFLE5VTEwpKQorIyAgICAgZWxzZQorIyAgICAgICBkZWZpbmUgaXNhdHR5XyhmKSBpc2F0dHkoZmlsZW5vKGYpKQorIyAgICAgZW5kaWYKKyMgICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKy8qIFNldCB1cCB0aGUgc3RhdGUgYmxvY2ssIGZpbGV0YWJsZSBhbmQgcmVnaXN0ZXIgdGhlIEMgbGliIGNhbGxiYWNrIGZuICovCitpbnQgSG9zdFN5c0luaXQoY29uc3Qgc3RydWN0IERiZ19Ib3N0b3NJbnRlcmZhY2UgKmhvc3RpZiwgY2hhciAqKmNtZGxpbmUsCisgICAgICAgICAgICAgICAgaHN5c19zdGF0ZSAqKnN0YXRlcHRyKQoreworICBDaGFubmVsQ2FsbGJhY2sgSGFuZGxlTWVzc2FnZUZQdHIgPSAoQ2hhbm5lbENhbGxiYWNrKSBIYW5kbGVTeXNNZXNzYWdlOworICBpbnQgaTsKKyAgKnN0YXRlcHRyID0gKGhzeXNfc3RhdGUgKiltYWxsb2Moc2l6ZW9mKGhzeXNfc3RhdGUpKTsKKworICBpZiAoKnN0YXRlcHRyID09IE5VTEwpIHJldHVybiBSRElFcnJvcl9PdXRPZlN0b3JlOworCisgICgqc3RhdGVwdHIpLT5ob3N0aWY9aG9zdGlmOworICAoKnN0YXRlcHRyKS0+bGFzdF9lcnJubz0wOworICAoKnN0YXRlcHRyKS0+T1NwdHI9KE9TYmxvY2sgKiltYWxsb2Moc2l6ZW9mKE9TYmxvY2spKTsKKyAgaWYgKCgqc3RhdGVwdHIpLT5PU3B0ciA9PSBOVUxMKSByZXR1cm4gUkRJRXJyb3JfT3V0T2ZTdG9yZTsKKyAgZm9yIChpPTA7IGk8VU5JUVVFVEVNUFM7IGkrKykgKCpzdGF0ZXB0ciktPk9TcHRyLT5UZW1wTmFtZXNbaV09TlVMTDsKKyAgZm9yIChpPTA7IGk8SFNZU19GT1BFTl9NQVg7IGkrKykgeworICAgICAgICgqc3RhdGVwdHIpLT5PU3B0ci0+RmlsZVRhYmxlW2ldPU5VTEw7CisgICAgICAgKCpzdGF0ZXB0ciktPk9TcHRyLT5GaWxlRmxhZ3NbaV09MDsKKyAgfQorICAoKnN0YXRlcHRyKS0+Q29tbWFuZExpbmU9Y21kbGluZTsKKworICByZXR1cm4gQWRwX0NoYW5uZWxSZWdpc3RlclJlYWQoQ0lfQ0xJQiwgKENoYW5uZWxDYWxsYmFjaylIYW5kbGVNZXNzYWdlRlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0ZXB0cik7Cit9CisKKy8qIFNodXQgZG93biB0aGUgQ2xpYiBzdXBwb3J0LCB0aGlzIHdpbGwgcHJvYmFibHkgbmV2ZXIgZ2V0IGNhbGxlZCB0aG91Z2ggKi8KK2ludCBIb3N0U3lzRXhpdChoc3lzX3N0YXRlICpzdGF0ZXB0cikKK3sKKyAgZnJlZShzdGF0ZXB0ci0+T1NwdHIpOworICBmcmVlKHN0YXRlcHRyKTsKKyAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7Cit9CisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgRGVidWdDaGVja051bGxUZXJtU3RyaW5nKGNoYXIgKnByZWZpeCwgYm9vbCBubCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpzdHJwKQoreworICAgIHByaW50ZigiJXM6ICVkOiAiLCBwcmVmaXgsIGxlbik7CisgICAgaWYgKHN0cnBbbGVuXT09J1wwJykKKyAgICAgICBwcmludGYoIlwiJXNcIiIsIHN0cnApOworICAgIGVsc2UKKyAgICAgICBwcmludGYoIk5PVCBOVUxMIFRFUk1JTkFURUQiKTsKKyAgICBpZiAobmwpCisgICAgICAgcHJpbnRmKCJcbiIpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50ZigiICIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICB9Cit9CisKK2V4dGVybiBpbnQgc3lzX25lcnI7CitleHRlcm4gY2hhciAqc3lzX2Vycmxpc3RbXTsKKworc3RhdGljIGNoYXIgKkRlYnVnU3RyRXJyb3IoaW50IGxhc3RfZXJybm8pCit7CisgICAgaWYgKGxhc3RfZXJybm8gPCBzeXNfbmVycikKKyAgICAgICByZXR1cm4gc3lzX2Vycmxpc3RbbGFzdF9lcnJub107CisgICAgZWxzZQorICAgICAgIHJldHVybiAiTk8gTVNHIChlcnJubz5zeXNfbmVycikiOworfQorCitzdGF0aWMgdm9pZCBEZWJ1Z0NoZWNrRXJyKGNoYXIgKnByZWZpeCwgYm9vbCBubCwgaW50IGVyciwgaW50IGxhc3RfZXJybm8pCit7CisgICAgcHJpbnRmKCJcdCVzOiByZXR1cm5lZCAiLCBwcmVmaXgpOworICAgIGlmIChlcnIgPT0gMCkKKyAgICAgICBwcmludGYoIm9rYXkiKTsKKyAgICBlbHNlCisgICAgICAgcHJpbnRmKCIlZCwgZXJybm8gPSAlZCBcIiVzXCIiLCBlcnIsIGxhc3RfZXJybm8sCisgICAgICAgICAgICAgIERlYnVnU3RyRXJyb3IobGFzdF9lcnJubykpOworICAgIGlmIChubCkKKyAgICAgICBwcmludGYoIlxuIik7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJpbnRmKCIgIik7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgRGVidWdDaGVja05vbk51bGwoY2hhciAqcHJlZml4LCBib29sIG5sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqaGFuZGxlLCBpbnQgbGFzdF9lcnJubykKK3sKKyAgICBwcmludGYoIlx0JXM6IHJldHVybmVkICIsIHByZWZpeCk7CisgICAgaWYgKGhhbmRsZSAhPSBOVUxMKQorICAgICAgIHByaW50Zigib2theSBbJTA4eF0iLCAodW5zaWduZWQgaW50KWhhbmRsZSk7CisgICAgZWxzZQorICAgICAgIHByaW50ZigiTlVMTCwgZXJybm8gPSAlZCBcIiVzXCIiLCBsYXN0X2Vycm5vLAorICAgICAgICAgICAgICBEZWJ1Z1N0ckVycm9yKGxhc3RfZXJybm8pKTsKKyAgICBpZiAobmwpCisgICAgICAgcHJpbnRmKCJcbiIpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50ZigiICIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICB9Cit9CisKKyNkZWZpbmUgRGVidWdQcmludEYoYykgcHJpbnRmIGM7CisKKyNlbHNlCisKKyNkZWZpbmUgRGVidWdDaGVja051bGxUZXJtU3RyaW5nKHAsIG4sIGwsIHMpICAgICgodm9pZCkoMCkpCisjZGVmaW5lIERlYnVnQ2hlY2tFcnIocCwgbiwgZSwgbCkgICAgICAgICAgICAgICAoKHZvaWQpKDApKQorI2RlZmluZSBEZWJ1Z0NoZWNrTm9uTnVsbChwLCBuLCBoLCBsKSAgICAgICAgICAgKCh2b2lkKSgwKSkKKyNkZWZpbmUgRGVidWdQcmludEYoYykgICAgICAgICAgICAgICAgICAgICAgICAgICgodm9pZCkoMCkpCisKKyNlbmRpZiAvKiBpZmRlZiBERUJVRyAuLi4gZWxzZSAqLworCitzdGF0aWMgRklMRSAqaHN5c0dldFJlYWxGaWxlSGFuZGxlKGhzeXNfc3RhdGUgKnN0YXRlcHRyLCBpbnQgZmgsIGNoYXIgKmZsYWdzKQoreworICAgIEZJTEUgKmZpbGVfcCA9IE5VTEw7CisKKyAgICBpZiAoZmggPCAwIHx8IGZoID49IEhTWVNfRk9QRU5fTUFYKQorICAgIHsKKyAgICAgICAgc3RhdGVwdHItPmxhc3RfZXJybm8gPSBFQkFERjsKKyAgICAgICAgRGVidWdQcmludEYoKCJcdGZoICVkIG91dC1vZi1ib3VuZHMhXG4iLCBmaCkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZmlsZV9wID0gc3RhdGVwdHItPk9TcHRyLT5GaWxlVGFibGVbZmhdOworICAgICAgICBpZiAoZmlsZV9wICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChmbGFncyAhPSBOVUxMKQorICAgICAgICAgICAgICAgKmZsYWdzID0gc3RhdGVwdHItPk9TcHRyLT5GaWxlRmxhZ3NbZmhdOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHN0YXRlcHRyLT5sYXN0X2Vycm5vID0gRUJBREY7CisgICAgICAgICAgRGVidWdQcmludEYoKCJcdEZpbGVUYWJsZVslZF0gaXMgTlVMTFxuIiwgZmgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmaWxlX3A7CisgICAgfQorfQorCitpbnQgSGFuZGxlU3lzTWVzc2FnZShQYWNrZXQgKnBhY2tldCwgaHN5c19zdGF0ZSAqc3RhdGVwdHIpCit7CisgIHVuc2lnbmVkIGludCByZWFzb25fY29kZSwgbW9kZSwgbGVuLCBjLCBuYnl0ZXMsIG5idG90YWwsIG5idG9nbyA9IDA7CisgIGxvbmcgcG9zbiwgZmw7CisgIGNoYXIgY2hhcmFjdGVyOworICBpbnQgZXJyOworCisgIC8qIE5vdGU6IFdlIG11c3Qgbm90IGZyZWUgdGhlIGJ1ZmZlciBwYXNzZWQgaW4gYXMgdGhlIGNhbGxiYWNrIGhhbmRsZXIgKi8KKyAgLyogZXhwZWN0cyB0byBkbyB0aGlzLiAgRnJlZWluZyBhbnkgb3RoZXIgYnVmZmVycyB3ZSBoYXZlIG1hbGxvY2VkICovCisgIC8qIG91cnNlbHZlcyBpcyBhY2NlcHRhYmxlICovCisKKyAgdW5zaWduZWQgY2hhciAqYnVmZnAgPSAoKHVuc2lnbmVkIGNoYXIgKilCVUZGRVJEQVRBKHBhY2tldC0+cGtfYnVmZmVyKSkrMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWZmcCBwb2ludHMgdG8gdGhlIHBhcmFtZXRlcnMqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGludmlkdWFsIG1lc3NhZ2VzLCBleGNsdWRpbmcqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhbmRhcmQgU1lTIGZpZWxkcyAoZGVidWdJRCwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9zaW5mbyBhbmQgcmVhc29uY29kZSkgKi8KKyAgdW5zaWduZWQgY2hhciAqYnVmZmhlYWQgPSAodW5zaWduZWQgY2hhciAqKShwYWNrZXQtPnBrX2J1ZmZlcik7CisKKyAgaW50IERlYnVnSUQsIE9TSW5mbzEsIE9TSW5mbzIsIGNvdW50OworCisgIGNvbnN0IGNoYXIqIGZtb2RlW10gPSB7InIiLCJyYiIsInIrIiwicitiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidyIsIndiIiwidysiLCJ3K2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIiwiYWIiLCJhKyIsImErYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInIiLCJyIiwiciIsInIifSAvKiBsYXN0IDQgYXJlIGlsbGVnYWwgKi8gOworCisgIEZJTEVIQU5ETEUgZmg7ICAvKiBmaCBpcyB1c2VkIGFzIGFuIGluZGV4IHRvIHRoZSByZWFsIGZpbGUgaGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbiBPU3B0ciAqLyAgCisgIEZJTEUgKmZocmVhbDsKKyAgdW5wYWNrX21lc3NhZ2UoQlVGRkVSREFUQShidWZmaGVhZCksICIldyV3JXcldyIsICZyZWFzb25fY29kZSwKKyAgICAgICAgICAgICAgICAgJkRlYnVnSUQsICZPU0luZm8xLCAmT1NJbmZvMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRXh0cmFjdCByZWFzb24gY29kZSBmcm9tIGJ1ZmZlci4gKi8KKyAgcmVhc29uX2NvZGUgJj0gMHhGRkZGOyAgICAgICAgLyogU3RyaXAgYXdheSBkaXJlY3Rpb24gYml0LCBPU0luZm8gYW5kICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWJ1Z0luZm8gZmllbGRzLiAgV2lsbCB3YW50IHRvIGRvIHNvbWUgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvcnQgb2YgdmFsaWRhdGlvbiBvbiB0aGlzIGxhdGVyLiAgICAgICAgKi8KKyAgCisgIHN3aXRjaChyZWFzb25fY29kZSkKKyAgeworCisgIGNhc2UgQ0xfV3JpdGVDOiAgIC8qIFdyaXRlIGEgY2hhcmFjdGVyIHRvIHRoZSB0ZXJtaW5hbC4gKi8KKyAgICAgICAgICAgICAgICAgICAgLyogYnl0ZSBkYXRhIC0+IHdvcmQgc3RhdHVzICAgICAgICAgICAqLworICAgIHsKKyNpZmRlZiBERUJVRworICAgICAgaW50IGMgPSAoaW50KSgqYnVmZnApOworICAgICAgcHJpbnRmKCJDTF9Xcml0ZUM6IFslMDJ4XT4lYzwiLCBjLCBpc3ByaW50KGMpID8gYyA6ICcuJyk7CisjZW5kaWYKKyAgICAgIHN0YXRlcHRyLT5ob3N0aWYtPndyaXRlYyhzdGF0ZXB0ci0+aG9zdGlmLT5ob3N0b3NhcmcsIChpbnQpKCpidWZmcCkpOworICAgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICAgICAgcmV0dXJuIG1zZ3NlbmQoQ0lfQ0xJQiwiJXcldyV3JXcldyIsIENMX1dyaXRlQ3xIdG9ULAorICAgICAgICAgICAgICAgICAgICBEZWJ1Z0lELCBPU0luZm8xLCBPU0luZm8yLCBOb0Vycm9yKTsKKyAgICB9CisKKyAgY2FzZSBDTF9Xcml0ZTA6ICAvKiBXcml0ZSBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgdG8gdGhlIHRlcm1pbmFsLiAqLworICAgIHsKKyAgICAgIHVucGFja19tZXNzYWdlKGJ1ZmZwLCAiJXciLCAmbGVuKTsKKyAgICAgIERlYnVnQ2hlY2tOdWxsVGVybVN0cmluZygiQ0xfV3JpdGUwIiwgVFJVRSwgbGVuLCBidWZmcCs0KTsKKyAgICAgIHN0YXRlcHRyLT5ob3N0aWYtPndyaXRlKHN0YXRlcHRyLT5ob3N0aWYtPmhvc3Rvc2FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIGJ1ZmZwKzQsIGxlbik7CisgICAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgICAgICByZXR1cm4gbXNnc2VuZChDSV9DTElCLCAiJXcldyV3JXcldyIsIENMX1dyaXRlMHxIdG9ULCBEZWJ1Z0lELCAKKyAgICAgICAgICAgICAgICAgICAgT1NJbmZvMSwgT1NJbmZvMiwgTm9FcnJvcik7CisgICAgfQorCisgIGNhc2UgQ0xfUmVhZEM6ICAgLyogUmVhZCBhIGJ5dGUgZnJvbSB0aGUgdGVybWluYWwgKi8KKyAgICB7CisgICAgICBEZWJ1Z1ByaW50RigoIkNMX1JlYWRDOiAiKSk7CisgICAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisKKyAgICAgIGNoYXJhY3RlciA9IHN0YXRlcHRyLT5ob3N0aWYtPnJlYWRjKHN0YXRlcHRyLT5ob3N0aWYtPmhvc3Rvc2FyZyk7CisgICAgICBEZWJ1Z1ByaW50RigoIlxuQ0xfUmVhZEMgcmV0dXJuaW5nIFslMDJ4XT4lYzxcbiIsIGNoYXJhY3RlciwKKyAgICAgICAgICAgICAgICAgICBpc3ByaW50KGNoYXJhY3RlcikgPyBjaGFyYWN0ZXIgOiAnLicpKTsKKworICAgICAgcmV0dXJuIG1zZ3NlbmQoQ0lfQ0xJQiwgIiV3JXcldyV3JXclYiIsIENMX1JlYWRDfEh0b1QsCisgICAgICAgICAgICAgICAgICAgIERlYnVnSUQsIE9TSW5mbzEsIE9TSW5mbzIsIE5vRXJyb3IsIGNoYXJhY3Rlcik7CisgICAgfQorCisgIGNhc2UgQ0xfU3lzdGVtOiAgLyogUGFzcyBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBob3N0cyBjb21tYW5kIAorICAgICAgICAgICAgICAgICAgICAqIGludGVycHJldGVyLiBBcyBpdCBpcyBuVUxMIHRlcm1pbmF0ZWQgd2UgZG9udCBuZWVkCisgICAgICAgICAgICAgICAgICAgICogdGhlIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAqLworICAgIHsKKyAgICAgIHVucGFja19tZXNzYWdlKGJ1ZmZwLCAiJXciLCAmbGVuKTsKKyAgICAgIERlYnVnQ2hlY2tOdWxsVGVybVN0cmluZygiQ0xfU3lzdGVtIiwgVFJVRSwgbGVuLCBidWZmcCs0KTsKKworICAgICAgZXJyID0gc3lzdGVtKChjaGFyICopYnVmZnArNCk7IC8qIFVzZSB0aGUgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KKyAgICAgIHN0YXRlcHRyLT5sYXN0X2Vycm5vID0gZXJybm87CisgICAgICBEZWJ1Z0NoZWNrRXJyKCJzeXN0ZW0iLCBUUlVFLCBlcnIsIHN0YXRlcHRyLT5sYXN0X2Vycm5vKTsKKworICAgICAgZXJyID0gbXNnc2VuZChDSV9DTElCLCAiJXcldyV3JXcldyV3IiwgQ0xfU3lzdGVtfEh0b1QsCisgICAgICAgICAgICAgICAgICAgIERlYnVnSUQsIE9TSW5mbzEsIE9TSW5mbzIsIE5vRXJyb3IsIGVycik7CisgICAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICBjYXNlIENMX0dldENtZExpbmU6ICAvKiBSZXR1cm5zIHRoZSBjb21tYW5kIGxpbmUgdXNlZCB0byBjYWxsIHRoZSBwcm9ncmFtICovCisgICAgeworICAgICAgLyogTm90ZTogd2UgcmV1c2UgdGhlIHBhY2tldCBoZXJlLCB0aGlzIG1heSBub3QgYWx3YXlzIGJlIGRlc2lyYWJsZSAqLworICAgICAgLyogLyogVE9ETzogVXNlIGxvbmcgYnVmZmVycyBpZiBwb3NzaWJsZSAqLworICAgICAgRGVidWdQcmludEYoKCJDTF9HZXRDbWRMaW5lOiBcIiVzXCJcbiIsICooc3RhdGVwdHItPkNvbW1hbmRMaW5lKSkpOworCisgICAgICBpZiAoYnVmZmhlYWQhPU5VTEwpIHsKKyAgICAgICAgbGVuID0gc3RybGVuKCooc3RhdGVwdHItPkNvbW1hbmRMaW5lKSk7CisgICAgICAgIGlmIChsZW4gPiBBcm1zZF9CdWZmZXJTaXplLTI0KSBsZW4gPSBBcm1zZF9CdWZmZXJTaXplLTI0OyAKKyAgICAgICAgcGFja2V0LT5wa19sZW5ndGggPSBsZW4gKyBtc2didWlsZChCVUZGRVJEQVRBKGJ1ZmZoZWFkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXcldyV3JXcldyV3IiwgQ0xfR2V0Q21kTGluZXxIdG9ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnSUQsIE9TSW5mbzEsIE9TSW5mbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9FcnJvciwgbGVuKTsKKyAgICAgICAgc3RybmNweSgoY2hhciAqKSBCVUZGRVJEQVRBKGJ1ZmZoZWFkKSsyNCwqKHN0YXRlcHRyLT5Db21tYW5kTGluZSksCisgICAgICAgICAgICAgICAgbGVuKTsKKyAgICAgICAgCisgICAgICAgIEFkcF9DaGFubmVsV3JpdGUoQ0lfQ0xJQiwgcGFja2V0KTsvKiBTZW5kIG1lc3NhZ2UuICovCisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZWxzZSByZXR1cm4gLTE7CisgICAgfQorCisgIGNhc2UgQ0xfQ2xvY2s6ICAgLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2VudGlzZWNvbmRzIHNpbmNlIHRoZSBzdXBwb3J0ICovCisgICAgICAgICAgICAgICAgICAgLyogY29kZSBzdGFydGVkIGV4ZWN1dGluZyAqLworICAgIHsKKyAgICAgIHRpbWVfdCByZXRUaW1lID0gdGltZShOVUxMKTsKKyAgICAgIGlmIChyZXRUaW1lID09ICh0aW1lX3QpLTEpCisgICAgICAgICAgICAgc3RhdGVwdHItPmxhc3RfZXJybm8gPSBlcnJubzsKKyAgICAgIGVsc2UKKyAgICAgICAgICAgICByZXRUaW1lICo9MTAwOworCisgICAgICBEZWJ1Z1ByaW50RigoIkNMX0Nsb2NrOiAlbHVcbiIsIHJldFRpbWUpKTsKKyAgICAgIERlYnVnQ2hlY2tFcnIoInRpbWUiLCBUUlVFLCAocmV0VGltZSA9PSAodGltZV90KS0xKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVwdHItPmxhc3RfZXJybm8pOworCisgICAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgICAgICByZXR1cm4gbXNnc2VuZChDSV9DTElCLCAiJXcldyV3JXcldyV3IixDTF9DbG9ja3xIdG9ULAorICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnSUQsIE9TSW5mbzEsIE9TSW5mbzIsIE5vRXJyb3IsIHJldFRpbWUpOworICAgIH0KKworICBjYXNlIENMX1RpbWU6ICAgIC8qIHJldHVybiB0aW1lLCBpbiBzZWNvbmRzIHNpbmNlIHRoZSBzdGFydCBvZiAxOTcwICovCisgICAgeworICAgICAgdGltZV90IHJldFRpbWUgPSB0aW1lKE5VTEwpOworICAgICAgaWYgKHJldFRpbWUgPT0gKHRpbWVfdCktMSkKKyAgICAgICAgICAgICAgc3RhdGVwdHItPmxhc3RfZXJybm8gPSBlcnJubzsKKworICAgICAgRGVidWdQcmludEYoKCJDTF9UaW1lOiAlbHVcbiIsIHJldFRpbWUpKTsKKyAgICAgIERlYnVnQ2hlY2tFcnIoInRpbWUiLCBUUlVFLCAocmV0VGltZSA9PSAodGltZV90KS0xKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVwdHItPmxhc3RfZXJybm8pOworCisgICAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgICAgICByZXR1cm4gbXNnc2VuZChDSV9DTElCLCIldyV3JXcldyV3JXciLENMX1RpbWV8SHRvVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0lELCBPU0luZm8xLCBPU0luZm8yLCBOb0Vycm9yLCByZXRUaW1lKTsKKyAgICB9CisKKyAgY2FzZSBDTF9SZW1vdmU6ICAvKiBkZWxldGUgbmFtZWQgaW4gdGhlIG51bGwgdGVybWluYXRlZCBzdHJpbmcgKi8KKyAgICB7CisgICAgICAvKiBSZW1vdmluZyBhbiBvcGVuIGZpbGUgd2lsbCBjYXVzZSBwcm9ibGVtcyBidXQgb25jZSBhZ2FpbgorICAgICAgICogaXRzIG5vdCBvdXIgcHJvYmxlbSwgbGlrZWx5IHJlc3VsdCBpcyBhIHRhbmdsZWQgRmlsZVRhYmxlICovCisgICAgICAvKiBBcyB0aGUgZmlsZW5hbWUgaXMgcGFzc2VkIHdpdGggYSBudWxsIHRlcm1pbmF0b3Igd2UgY2FuIHVzZSBpdAorICAgICAgICogc3RyYWlnaHQgb3V0IG9mIHRoZSBidWZmZXIgd2l0aG91dCBjb3B5aW5nIGl0LiovCisKKyAgICAgIHVucGFja19tZXNzYWdlKGJ1ZmZwLCAiJXciLCAmbGVuKTsKKyAgICAgIERlYnVnQ2hlY2tOdWxsVGVybVN0cmluZygiQ0xfUmVtb3ZlIiwgVFJVRSwgbGVuLCBidWZmcCs0KTsKKworICAgICAgZXJyPXJlbW92ZSgoY2hhciAqKWJ1ZmZwKzQpOworICAgICAgc3RhdGVwdHItPmxhc3RfZXJybm8gPSBlcnJubzsKKyAgICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgICAgIERlYnVnQ2hlY2tFcnIoInJlbW92ZSIsIFRSVUUsIGVyciwgc3RhdGVwdHItPmxhc3RfZXJybm8pOworCisgICAgICByZXR1cm4gbXNnc2VuZChDSV9DTElCLCAiJXcldyV3JXcldyIsIENMX1JlbW92ZXxIdG9ULAorICAgICAgICAgICAgICAgICAgICAgRGVidWdJRCwgT1NJbmZvMSwgT1NJbmZvMiwgZXJyPy0xOk5vRXJyb3IpOworICAgIH0KKworICBjYXNlIENMX1JlbmFtZTogIC8qIHJlbmFtZSBmaWxlICovCisgICAgeworICAgICAgLyogUmVuYW1lKHdvcmQgbmJ5dGVzLCBieXRlcyBvbmFtZSwgd29yZCBuYnl0ZXMsIGJ5dGVzIG5uYW1lKQorICAgICAgKiByZXR1cm4oYnl0ZSBzdGF0dXMpCisgICAgICAqLworICAgICAgdW5zaWduZWQgaW50IGxlbjI7CisKKyAgICAgIHVucGFja19tZXNzYWdlKGJ1ZmZwLCAiJXciLCAmbGVuKTsKKyAgICAgIERlYnVnQ2hlY2tOdWxsVGVybVN0cmluZygiQ0xfUmVuYW1lIiwgRkFMU0UsIGxlbiwgYnVmZnArNCk7CisgICAgICB1bnBhY2tfbWVzc2FnZShidWZmcCs1K2xlbiwgIiV3IiwgJmxlbjIpOworICAgICAgRGVidWdDaGVja051bGxUZXJtU3RyaW5nKCJ0byIsIFRSVUUsIGxlbjIsIGJ1ZmZwKzkrbGVuKTsKKworICAgICAgLyogQm90aCBuYW1lcyBhcmUgcGFzc2VkIHdpdGggbnVsbCB0ZXJtaW5hdG9ycyBzbyB3ZSBjYW4gdXNlIHRoZW0KKyAgICAgICAqIGRpcmVjdGx5IGZyb20gdGhlIGJ1ZmZlci4gKi8KKyAgICAgIGVyciA9IHJlbmFtZSgoY2hhciAqKWJ1ZmZwKzQsIChjaGFyICopYnVmZnArOStsZW4pOworICAgICAgc3RhdGVwdHItPmxhc3RfZXJybm8gPSBlcnJubzsKKyAgICAgIERlYnVnQ2hlY2tFcnIoInJlbmFtZSIsIFRSVUUsIGVyciwgc3RhdGVwdHItPmxhc3RfZXJybm8pOworICAgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworCisgICAgICByZXR1cm4gbXNnc2VuZChDSV9DTElCLCAiJXcldyV3JXcldyIsICBDTF9SZW5hbWV8SHRvVCwKKyAgICAgICAgICAgICAgICAgICAgIERlYnVnSUQsIE9TSW5mbzEsIE9TSW5mbzIsIChlcnI9PTApPyBOb0Vycm9yIDogLTEpOworICAgIH0KKyAgCisgIGNhc2UgQ0xfT3BlbjogICAgLyogb3BlbiB0aGUgZmlsZSAqLworICAgIHsKKyAgICAgIC8qIE9wZW4od29yZCBuYnl0ZXMsIGJ5dGVzIG5hbWUsIGJ5dGUgbW9kZSkKKyAgICAgICogcmV0dXJuKHdvcmQgaGFuZGxlKQorICAgICAgKi8KKyAgICAgIHVucGFja19tZXNzYWdlKGJ1ZmZwLCAiJXciLCAmbGVuKTsKKyAgICAgIC8qIGdldCB0aGUgb3BlbiBtb2RlICovCisgICAgICB1bnBhY2tfbWVzc2FnZSgoYnVmZnApKzQrbGVuKzEsICIldyIsICZtb2RlKTsKKyAgICAgIERlYnVnQ2hlY2tOdWxsVGVybVN0cmluZygiQ0xfT3BlbiIsIEZBTFNFLCBsZW4sIGJ1ZmZwKzQpOworICAgICAgRGVidWdQcmludEYoKCJtb2RlOiAlZFxuIiwgbW9kZSkpOworCisgICAgICAvKiBkbyBzb21lIGNoZWNraW5nIG9uIHRoZSBmaWxlIGZpcnN0PyAqLworICAgICAgLyogY2hlY2sgaWYgaXRzIGEgdHR5ICovCisgICAgICBpZiAoc3RyY21wKChjaGFyICopYnVmZnArNCwgIjp0dCIpPT0wICYmIChtb2RlPT0wfHxtb2RlPT0xKSkgeworICAgICAgICAvKiBvcGVuaW5nIHR0eSAiciIgKi8KKyAgICAgICAgZmhyZWFsID0gc3RkaW47CisgICAgICAgIHN0YXRlcHRyLT5sYXN0X2Vycm5vID0gZXJybm87CisgICAgICAgIERlYnVnUHJpbnRGKCgiXHRzdGRpbiAiKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChzdHJjbXAoKGNoYXIgKilidWZmcCs0LCAiOnR0Iik9PSAwICYmIChtb2RlPT00fHxtb2RlPT01KSkgeworICAgICAgICAvKiBvcGVuaW5nIHR0eSAidyIgKi8KKyAgICAgICAgZmhyZWFsID0gc3Rkb3V0OworICAgICAgICBzdGF0ZXB0ci0+bGFzdF9lcnJubyA9IGVycm5vOworICAgICAgICBEZWJ1Z1ByaW50RigoIlx0c3Rkb3V0ICIpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZmhyZWFsID0gZm9wZW4oKGNoYXIgKilidWZmcCs0LCBmbW9kZVttb2RlJjB4RkZdKTsKKyAgICAgICAgc3RhdGVwdHItPmxhc3RfZXJybm8gPSBlcnJubzsKKyAgICAgICAgRGVidWdDaGVja05vbk51bGwoImZvcGVuIiwgRkFMU0UsIGZocmVhbCwgc3RhdGVwdHItPmxhc3RfZXJybm8pOworICAgICAgfQorICAgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworCisgICAgICBjID0gTk9OSEFORExFOworICAgICAgaWYgKGZocmVhbCAhPSBOVUxMKSB7CisgICAgICAgIC8qIHVwZGF0ZSBmaWxldGFibGUgKi8KKyAgICAgICAgZm9yIChjPTM7IGMgPCBIU1lTX0ZPUEVOX01BWDsgYysrKSB7CisgICAgICAgICAgLyogYWxsb3cgZm9yIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciAoISEhIFdIWT8gTUpHKSAqLworICAgICAgICAgIGlmIChzdGF0ZXB0ci0+T1NwdHItPkZpbGVUYWJsZVtjXSA9PSBOVUxMKSB7CisgICAgICAgICAgICBzdGF0ZXB0ci0+T1NwdHItPkZpbGVUYWJsZVtjXT0gZmhyZWFsOworICAgICAgICAgICAgc3RhdGVwdHItPk9TcHRyLT5GaWxlRmxhZ3NbY109IG1vZGUgJiAxOworICAgICAgICAgICAgRGVidWdQcmludEYoKCJmaDogJWRcbiIsIGMpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChjID09IEhTWVNfRk9QRU5fTUFYKSB7CisgICAgICAgICAgLyogbm8gZmlsZWhhbmRsZXMgZnJlZSAqLworICAgICAgICAgIERlYnVnUHJpbnRGKCgibm8gZnJlZSBmaDogJWRcbiIsIGMpKTsKKyAgICAgICAgICBzdGF0ZXB0ci0+bGFzdF9lcnJubyA9IEVNRklMRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAvKiAgICAgICAgYyA9IE5VTEw7Ki8KKyAgICAgICAgRGVidWdQcmludEYoKCJlcnJvciBmaDogJWRcbiIsIGMpKTsKKyAgICAgIH0KKyAgICAgICh2b2lkKSBtc2dzZW5kKENJX0NMSUIsICIldyV3JXcldyV3IiwgIENMX09wZW58SHRvVCwKKyAgICAgICAgICAgICAgICAgICAgIERlYnVnSUQsIE9TSW5mbzEsIE9TSW5mbzIsIGMpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGNhc2UgQ0xfQ2xvc2U6ICAgLyogY2xvc2UgdGhlIGZpbGUgcG9pbnRlZCB0byBieSB0aGUgZmlsZWhhbmRsZSAqLworICAgIHsKKyAgICAgIHVucGFja19tZXNzYWdlKGJ1ZmZwLCAiJXciLCAmZmgpOworICAgICAgRGVidWdQcmludEYoKCJDTF9DbG9zZTogZmggJWRcbiIsIGZoKSk7CisgICAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisKKyAgICAgIGZocmVhbCA9IGhzeXNHZXRSZWFsRmlsZUhhbmRsZShzdGF0ZXB0ciwgZmgsIE5VTEwpOworICAgICAgaWYgKGZocmVhbCA9PSBOVUxMKQorICAgICAgICAgZXJyID0gLTE7CisgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiAoZmhyZWFsID09IHN0ZGluIHx8IGZocmVhbCA9PSBzdGRvdXQgfHwgZmhyZWFsID09IHN0ZGVycikgeworICAgICAgICAgICAgICBzdGF0ZXB0ci0+bGFzdF9lcnJubyA9IGVycm5vOworICAgICAgICAgICAgICBEZWJ1Z1ByaW50RigoIlx0c2tpcHBpbmcgY2xvc2Ugb2Ygc3RkKlxuIikpOworICAgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgZXJyID0gZmNsb3NlKGZocmVhbCk7CisgICAgICAgICAgICAgIGlmIChlcnIgPT0gMCkKKyAgICAgICAgICAgICAgICAgc3RhdGVwdHItPk9TcHRyLT5GaWxlVGFibGVbZmhdPU5VTEw7CisgICAgICAgICAgICAgIHN0YXRlcHRyLT5sYXN0X2Vycm5vID0gZXJybm87CisgICAgICAgICAgICAgIERlYnVnQ2hlY2tFcnIoImZjbG9zZSIsIFRSVUUsIGVyciwgc3RhdGVwdHItPmxhc3RfZXJybm8pOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBtc2dzZW5kKENJX0NMSUIsIiV3JXcldyV3JXciLCAgQ0xfQ2xvc2V8SHRvVCwgRGVidWdJRCwKKyAgICAgICAgICAgICAgICAgICAgIE9TSW5mbzEsIE9TSW5mbzIsIGVycik7CisgICAgfQorCisgIGNhc2UgQ0xfV3JpdGU6CisgICAgeworICAgICAgICAvKiBXcml0ZSh3b3JkIGhhbmRsZSwgd29yZCBuYnRvdGFsLCB3b3JkIG5ieXRlcywgYnl0ZXMgZGF0YSkKKyAgICAgICAgICogcmV0dXJuKHdvcmQgbmJ5dGVzKQorICAgICAgICAgKiBXcml0ZVgod29yZCBuYnl0ZXMsIGJ5dGVzIGRhdGEpCisgICAgICAgICAqIHJldHVybih3b3JkIG5ieXRlcykKKyAgICAgICAgICovCisgICAgICB1bnNpZ25lZCBjaGFyICpyd2RhdGEgPSBOVUxMLCAqcndoZWFkID0gTlVMTDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKndyaXRlX3NvdXJjZSA9IE5VTEw7CisgICAgICBjaGFyIGZsYWdzOworICAgICAgRklMRSAqZmhyZWFsOworICAgICAgdW5zaWduZWQgaW50IGFja19yZWFzb24gPSBDTF9Xcml0ZTsgLyogZmlyc3QgYWNrIGlzIGZvciBDTF9Xcml0ZSAqLworCisgICAgICBlcnIgPSAtMTsgICAgICAgICAgICAgICAgIC8qIGVyciA9PSAwIGlzIGZ3cml0ZSgpIGVycm9yIGluZGljYXRpb24gKi8KKyAgICAgIHVucGFja19tZXNzYWdlKGJ1ZmZwLCAiJXcldyV3IiwgJmZoLCAmbmJ0b3RhbCwgJm5ieXRlcyk7IAorICAgICAgRGVidWdQcmludEYoKCJDTF9Xcml0ZTogZmggJWQgbmJ0b3RhbCAldSBuYnl0ZXMgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgZmgsIG5idG90YWwsIG5ieXRlcykpOworCisgICAgICBmaHJlYWwgPSBoc3lzR2V0UmVhbEZpbGVIYW5kbGUoc3RhdGVwdHIsIGZoLCAmZmxhZ3MpOworICAgICAgbmJ0b2dvID0gbmJ0b3RhbDsKKworICAgICAgLyogZGVhbCB3aXRoIHRoZSBmaWxlIGhhbmRsZSAqLworICAgICAgaWYgKGZocmVhbCA9PSBOVUxMKQorICAgICAgICAgZXJyID0gMDsKKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoZmxhZ3MgJiBSRUFET1ApCisgICAgICAgICAgIGZzZWVrKGZocmVhbCwwLFNFRUtfQ1VSKTsKKyAgICAgICAgc3RhdGVwdHItPk9TcHRyLT5GaWxlRmxhZ3NbZmhdID0gKGZsYWdzICYgQklOQVJZKSB8IFdSSVRFT1A7CisKKyAgICAgICAgbmJ0b2dvIC09IG5ieXRlczsKKworICAgICAgICBpZiAobmJ0b2dvID4gMCkgeworICAgICAgICAgIHdyaXRlX3NvdXJjZSA9IHJ3ZGF0YSA9IHJ3aGVhZCA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKG5idG90YWwpOworICAgICAgICAgIGlmIChyd2hlYWQgPT0gTlVMTCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJPVVQgT0YgTUVNT1JZIGF0IGxpbmUgJWQgaW4gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBfX0ZJTEVfXyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICAgIG1lbWNweShyd2RhdGEsIGJ1ZmZwKzEyLCBuYnl0ZXMpOworICAgICAgICAgIHJ3ZGF0YSArPSBuYnl0ZXM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICB3cml0ZV9zb3VyY2UgPSBidWZmcCsxMjsKKyAgICAgIH0KKworICAgICAgZG8geworICAgICAgICAvKiBhdCBsZWFzdCBvbmNlISEgKi8KKworICAgICAgICBpZiAobmJ0b2dvID09IDAgJiYgZXJyICE9IDApIHsKKyAgICAgICAgICAvKiBEbyB0aGUgYWN0dWFsIHdyaXRlISAqLworICAgICAgICAgIGlmIChmaHJlYWwgPT0gc3Rkb3V0IHx8IGZocmVhbCA9PSBzdGRlcnIpIHsKKyAgICAgICAgICAgIHN0YXRlcHRyLT5ob3N0aWYtPndyaXRlKHN0YXRlcHRyLT5ob3N0aWYtPmhvc3Rvc2FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopd3JpdGVfc291cmNlLCBuYnRvdGFsKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICBlcnIgPSBmd3JpdGUod3JpdGVfc291cmNlLCAxLCBuYnRvdGFsLCBmaHJlYWwpOworICAgICAgICAgIHN0YXRlcHRyLT5sYXN0X2Vycm5vID0gZXJybm87CisgICAgICAgICAgRGVidWdDaGVja0VycigiZndyaXRlIiwgVFJVRSwgKGVyciA9PSAwKSwgc3RhdGVwdHItPmxhc3RfZXJybm8pOworICAgICAgICB9CisKKyAgICAgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworICAgICAgICBpZiAobXNnc2VuZChDSV9DTElCLCIldyV3JXcldyV3JXciLCBhY2tfcmVhc29ufEh0b1QsCisgICAgICAgICAgICAgICAgICAgIERlYnVnSUQsIE9TSW5mbzEsIE9TSW5mbzIsIChlcnIgPT0gMCksIG5idG9nbykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ09VTEQgTk9UIFJFUExZIGF0IGxpbmUgJWQgaW4gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBfX0ZJTEVfXyk7CisgICAgICAgICAgICBpZiAocndoZWFkICE9IE5VTEwpCisgICAgICAgICAgICAgICBmcmVlKHJ3aGVhZCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmJ0b2dvID09IDAgfHwgZXJyID09IDApIHsKKyAgICAgICAgICBEZWJ1Z1ByaW50RigoIlx0d3JpdGUgY29tcGxldGUgLSByZXR1cm5pbmdcbiIpKTsKKyAgICAgICAgICBpZiAocndoZWFkICE9IE5VTEwpCisgICAgICAgICAgICAgZnJlZShyd2hlYWQpOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8qIGF3YWl0IGV4dGVuc2lvbiAqLworICAgICAgICAgIGFja19yZWFzb24gPSBDTF9Xcml0ZVg7CisKKyAgICAgICAgICBwYWNrZXQgPSBEZXZTV19BbGxvY2F0ZVBhY2tldChBcm1zZF9CdWZmZXJTaXplKTsKKyAgICAgICAgICBpZiAocGFja2V0ID09IE5VTEwpCisgICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDT1VMRCBOT1QgQUxMT0MgUEFDS0VUIGF0IGxpbmUgJWQgaW4gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBfX0ZJTEVfXyk7CisgICAgICAgICAgICBpZiAocndoZWFkICE9IE5VTEwpCisgICAgICAgICAgICAgICBmcmVlKHJ3aGVhZCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICAgIEFkcF9DaGFubmVsUmVnaXN0ZXJSZWFkKENJX0NMSUIsIE5VTEwsIE5VTEwpOworICAgICAgICAgIEFkcF9DaGFubmVsUmVhZChDSV9DTElCLCAmcGFja2V0KTsKKyAgICAgICAgICBBZHBfQ2hhbm5lbFJlZ2lzdGVyUmVhZChDSV9DTElCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDaGFubmVsQ2FsbGJhY2spSGFuZGxlU3lzTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXB0cik7CisKKyAgICAgICAgICBidWZmaGVhZCA9IHBhY2tldC0+cGtfYnVmZmVyOworICAgICAgICAgIHVucGFja19tZXNzYWdlKEJVRkZFUkRBVEEoYnVmZmhlYWQpLCAiJXcldyV3JXcldyIsICZyZWFzb25fY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmRGVidWdJRCwgJk9TSW5mbzEsICZPU0luZm8yLCAmbmJ5dGVzKTsgCisgICAgICAgICAgaWYgKHJlYXNvbl9jb2RlICE9IChDTF9Xcml0ZVh8VHRvSCkpIHsKKyAgICAgICAgICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgICAgICAgICAgIGZyZWUocndoZWFkKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVhQRUNUSU5HIENMX1dyaXRlWCBHT1QgJXUgYXQgbGluZSAlZCBpbiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgcmVhc29uX2NvZGUsIF9fTElORV9fLCBfX0ZJTEVfXyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorCisgICAgICAgICAgRGVidWdQcmludEYoKCJDTF9Xcml0ZVg6IG5ieXRlcyAldVxuIiwgbmJ5dGVzKSk7CisgICAgICAgICAgbWVtY3B5KHJ3ZGF0YSwgQlVGRkVSREFUQShidWZmaGVhZCkrMjAsIG5ieXRlcyk7CisgICAgICAgICAgcndkYXRhICs9IG5ieXRlczsKKyAgICAgICAgICBuYnRvZ28gLT0gbmJ5dGVzOworICAgICAgICB9CisKKyAgICAgIH0gd2hpbGUgKFRSVUUpOyAgICAgICAgICAgLyogd2lsbCByZXR1cm4gd2hlbiBkb25lICovCisgICAgfQorCisgIGNhc2UgQ0xfV3JpdGVYOiAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgKiBOT1RFOiBpZiB3ZSd2ZSBnb3QgaGVyZSBzb21ldGhpbmcgaGFzIGdvbmUgd3JvbmcKKyAgICAgICAgICAgICAgICAgICAgICAgKiBDTF9Xcml0ZVgncyBzaG91bGQgYWxsIGJlIHBpY2tlZCB1cCB3aXRoaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICogQ0xfV3JpdGUgbG9vcCwgcHJvYmFibHkgYmVzdCB0byByZXR1cm4gYW4gZXJyb3IgaGVyZQorICAgICAgICAgICAgICAgICAgICAgICAqIGRvIHRoaXMgZm9yIHRoZSBtb21lbnQganVzdCBzbyB3ZSBkbyBhY3R1YWxseSByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmV4cGVjdGVkIENMX1dyaXRlWCBtZXNzYWdlIHJlY2VpdmVkXG4iKTsKKyAgICByZXR1cm4gLTE7IAorCisgIGNhc2UgQ0xfUmVhZDoKKyAgICB7CisgICAgICAgICAgICAgICAgICAgLyogUmVhZCh3b3JkIGhhbmRsZSwgd29yZCBuYnRvdGFsKQorICAgICAgICAgICAgICAgICAgICAqIHJldHVybih3b3JkIG5ieXRlcywgd29yZCBuYm1vcmUsIGJ5dGVzIGRhdGEpCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgLyogUmVhZFgoKQorICAgICAgICAgICAgICAgICAgICAqIHJldHVybih3b3JkIG5ieXRlcywgd29yZCBuYm1vcmUsIGJ5dGVzIGRhdGEpICovCisgICAgICB1bnNpZ25lZCBjaGFyICpyd2RhdGEsICpyd2hlYWQ7CisgICAgICBpbnQgZ290bGVuOworICAgICAgdW5zaWduZWQgaW50IG1heF9kYXRhX2luX2J1ZmZlcj1Bcm1zZF9CdWZmZXJTaXplLTI4OworICAgICAgY2hhciBmbGFnczsKKyAgICAgIEZJTEUgKmZocmVhbDsKKyAgICAgIHVuc2lnbmVkIGludCBuYmxlZnQgPSAwLCByZWFzb24gPSBDTF9SZWFkOworCisgICAgICBlcnIgPSBOb0Vycm9yOworCisgICAgICB1bnBhY2tfbWVzc2FnZShidWZmcCwgIiV3JXciLCAmZmgsICZuYnRvdGFsKTsKKyAgICAgIERlYnVnUHJpbnRGKCgiQ0xfUmVhZDogZmggJWQsIG5idG90YWwgJWQ6ICIsIGZoLCBuYnRvdGFsKSk7CisKKyAgICAgIHJ3ZGF0YSA9IHJ3aGVhZCA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKG5idG90YWwpOworICAgICAgaWYgKHJ3ZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiT1VUIE9GIE1FTU9SWSBhdCBsaW5lICVkIGluICVzXG4iLAorICAgICAgICAgICAgICAgIF9fTElORV9fLCBfX0ZJTEVfXyk7CisgICAgICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorCisgICAgICAvKiBwZXJmb3JtIHRoZSBhY3R1YWwgcmVhZCAqLworICAgICAgZmhyZWFsID0gaHN5c0dldFJlYWxGaWxlSGFuZGxlKHN0YXRlcHRyLCBmaCwgJmZsYWdzKTsKKyAgICAgIGlmIChmaHJlYWwgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgLyogYmFkIGZpbGUgaGFuZGxlICovCisgICAgICAgIGVyciA9IC0xOworICAgICAgICBuYnl0ZXMgPSAwOworICAgICAgICBnb3RsZW4gPSAwOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAoZmxhZ3MgJiBXUklURU9QKQorICAgICAgICAgIGZzZWVrKGZocmVhbCwwLFNFRUtfQ1VSKTsKKyAgICAgICAgc3RhdGVwdHItPk9TcHRyLT5GaWxlRmxhZ3NbZmhdID0gKGZsYWdzICYgQklOQVJZKSB8IFdSSVRFT1A7CisgICAgICAgIGlmIChpc2F0dHlfKGZocmVhbCkpIHsKKyAgICAgICAgICAvKiByZWFkaW5nIGZyb20gYSB0dHksIHNvIGRvIHNvbWUgbmFzdHkgc3R1ZmYsIHJlYWRpbmcgaW50byByd2RhdGEgKi8KKyAgICAgICAgICBpZiAoYW5nZWxfaG9zdGlmLT5nZXRzKHN0YXRlcHRyLT5ob3N0aWYtPmhvc3Rvc2FyZywgKGNoYXIgKilyd2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYnRvdGFsKSAhPSAwKQorICAgICAgICAgICAgIGdvdGxlbiA9IHN0cmxlbigoY2hhciAqKXJ3ZGF0YSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIGdvdGxlbiA9IDA7CisgICAgICAgICAgc3RhdGVwdHItPmxhc3RfZXJybm8gPSBlcnJubzsKKyAgICAgICAgICBEZWJ1Z1ByaW50RigoInR0eXJlYWQgJWRcbiIsIGdvdGxlbikpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8qIG5vdCBhIHR0eSwgcmVhZGluZyBmcm9tIGEgcmVhbCBmaWxlICovCisgICAgICAgICAgZ290bGVuID0gZnJlYWQocndkYXRhLCAxLCBuYnRvdGFsLCBmaHJlYWwpOworICAgICAgICAgIHN0YXRlcHRyLT5sYXN0X2Vycm5vID0gZXJybm87CisgICAgICAgICAgRGVidWdDaGVja0VycigiZnJlYWQiLCBGQUxTRSwgKGdvdGxlbiA9PSAwKSwgc3RhdGVwdHItPmxhc3RfZXJybm8pOworICAgICAgICAgIERlYnVnUHJpbnRGKCgiKCVkKVxuIiwgZ290bGVuKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgbmJ0b2dvID0gZ290bGVuOworCisgICAgICBkbyB7CisgICAgICAgIC8qIGF0IGxlYXN0IG9uY2UgKi8KKworICAgICAgICBpZiAoKHVuc2lnbmVkIGludCkgbmJ0b2dvIDw9IG1heF9kYXRhX2luX2J1ZmZlcikKKyAgICAgICAgICAgbmJ5dGVzID0gbmJ0b2dvOworICAgICAgICBlbHNlCisgICAgICAgICAgIG5ieXRlcyA9IG1heF9kYXRhX2luX2J1ZmZlcjsKKyAgICAgICAgbmJ0b2dvIC09IG5ieXRlczsKKworICAgICAgICAvKiBsYXN0IFJlYWRYIG5lZWRzIHN1YnRsZSBhZGp1c3RtZW50IHRvIHJldHVybmVkIG5idG9nbyAqLworICAgICAgICBpZiAobmJ0b2dvID09IDAgJiYgZXJyID09IE5vRXJyb3IgJiYgcmVhc29uID09IENMX1JlYWRYKQorICAgICAgICAgICBuYmxlZnQgPSBuYnRvdGFsIC0gZ290bGVuOworICAgICAgICBlbHNlCisgICAgICAgICAgIG5ibGVmdCA9IG5idG9nbzsKKworICAgICAgICBjb3VudCA9IG1zZ2J1aWxkKEJVRkZFUkRBVEEoYnVmZmhlYWQpLCAiJXcldyV3JXcldyV3JXciLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbnxIdG9ULCAwLCBBRFBfSGFuZGxlVW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRFBfSGFuZGxlVW5rbm93biwgZXJyLCBuYnl0ZXMsIG5ibGVmdCk7CisKKyAgICAgICAgaWYgKGVyciA9PSBOb0Vycm9yKSB7CisgICAgICAgICAgLyogY29weSBkYXRhIGludG8gYnVmZnB0ciAqLyAgIAorICAgICAgICAgIG1lbWNweShCVUZGRVJEQVRBKGJ1ZmZoZWFkKSsyOCwgcndkYXRhLCBuYnl0ZXMpOworICAgICAgICAgIHJ3ZGF0YSArPSBuYnl0ZXM7CisgICAgICAgICAgY291bnQgKz0gbmJ5dGVzOworICAgICAgICB9CisKKyAgICAgICAgRGVidWdQcmludEYoKCJcdHJlcGx5aW5nIGVyciAlZCwgbmJ5dGVzICVkLCBuYnRvZ28gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBlcnIsIG5ieXRlcywgbmJ0b2dvKSk7CisKKyAgICAgICAgcGFja2V0LT5wa19sZW5ndGggPSBjb3VudDsKKyAgICAgICAgQWRwX0NoYW5uZWxXcml0ZShDSV9DTElCLCBwYWNrZXQpOworCisgICAgICAgIGlmIChuYnRvZ28gPT0gMCB8fCBlcnIgIT0gTm9FcnJvcikgeworICAgICAgICAgIC8qIGRvbmUgKi8KKyAgICAgICAgICBmcmVlKHJ3aGVhZCk7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLyogYXdhaXQgZXh0ZW5zaW9uICovCisgICAgICAgICAgcmVhc29uID0gQ0xfUmVhZFg7CisKKyAgICAgICAgICBwYWNrZXQgPSBEZXZTV19BbGxvY2F0ZVBhY2tldChBcm1zZF9CdWZmZXJTaXplKTsKKyAgICAgICAgICBpZiAocGFja2V0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ09VTEQgTk9UIEFMTE9DIFBBQ0tFVCBhdCBsaW5lICVkIGluICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgX19GSUxFX18pOworICAgICAgICAgICAgZnJlZShyd2hlYWQpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBBZHBfQ2hhbm5lbFJlZ2lzdGVyUmVhZChDSV9DTElCLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICBBZHBfQ2hhbm5lbFJlYWQoQ0lfQ0xJQiwgJnBhY2tldCk7CisgICAgICAgICAgQWRwX0NoYW5uZWxSZWdpc3RlclJlYWQoQ0lfQ0xJQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2hhbm5lbENhbGxiYWNrKUhhbmRsZVN5c01lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVwdHIpOworICAgICAgICAgIGJ1ZmZoZWFkID0gcGFja2V0LT5wa19idWZmZXI7CisgICAgICAgICAgdW5wYWNrX21lc3NhZ2UoQlVGRkVSREFUQShidWZmaGVhZCksIiV3IiwgJnJlYXNvbl9jb2RlKTsKKyAgICAgICAgICBpZiAocmVhc29uX2NvZGUgIT0gKENMX1JlYWRYfFR0b0gpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVYUEVDVElORyBDTF9SZWFkWCBHT1QgJXUgYXQgbGluZSAlZCBpbiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgcmVhc29uX2NvZGUsIF9fTElORV9fLCBfX0ZJTEVfXyk7CisgICAgICAgICAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisgICAgICAgICAgICBmcmVlKHJ3ZGF0YSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIH0gd2hpbGUgKFRSVUUpOyAgICAgICAgICAgLyogd2lsbCByZXR1cm4gYWJvdmUgb24gZXJyb3Igb3Igd2hlbiBkb25lICovCisgICAgfQorCisgIGNhc2UgQ0xfUmVhZFg6ICAgICAgLyogSWYgd2UncmUgaGVyZSBzb21ldGhpbmcgaGFzIHByb2JhYmx5IGdvbmUgd3JvbmcgKi8KKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBHb3QgdW5leHBlY3RlZCBDTF9SZWFkWCBtZXNzYWdlXG4iKTsKKyAgICByZXR1cm4gLTE7CisKKyAgY2FzZSBDTF9TZWVrOgorICAgIHsKKyAgICAgIHVucGFja19tZXNzYWdlKGJ1ZmZwLCAiJXcldyIsICZmaCwgJnBvc24pOworICAgICAgRGVidWdQcmludEYoKCJDTF9TZWVrOiBmaCAlZCwgcG9zbiAlbGRcbiIsIGZoLCBwb3NuKSk7CisgICAgICBEZXZTV19GcmVlUGFja2V0KHBhY2tldCk7CisKKyAgICAgIGZocmVhbCA9IGhzeXNHZXRSZWFsRmlsZUhhbmRsZShzdGF0ZXB0ciwgZmgsIE5VTEwpOworICAgICAgaWYgKGZocmVhbCA9PSBOVUxMKQorICAgICAgICAgZXJyID0gLTE7CisgICAgICBlbHNlIHsKKyAgICAgICAgZXJyID0gZnNlZWsoZmhyZWFsLCBwb3NuLCBTRUVLX1NFVCk7IAorICAgICAgICBzdGF0ZXB0ci0+bGFzdF9lcnJubyA9IGVycm5vOworICAgICAgICBEZWJ1Z0NoZWNrRXJyKCJmc2VlayIsIFRSVUUsIGVyciwgc3RhdGVwdHItPmxhc3RfZXJybm8pOworICAgICAgfQorCisgICAgICByZXR1cm4gbXNnc2VuZChDSV9DTElCLCAiJXcldyV3JXcldyIsIENMX1NlZWt8SHRvVCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdJRCwgT1NJbmZvMSwgT1NJbmZvMiwgZXJyKTsKKyAgICB9CisKKyAgY2FzZSBDTF9GbGVuOgorICAgIHsKKyAgICAgIHVucGFja19tZXNzYWdlKGJ1ZmZwLCAiJXciLCAmZmgpOworICAgICAgRGVidWdQcmludEYoKCJDTF9GbGVuOiBmaCAlZCAiLCBmaCkpOworICAgICAgRGV2U1dfRnJlZVBhY2tldChwYWNrZXQpOworCisgICAgICBmaHJlYWwgPSBoc3lzR2V0UmVhbEZpbGVIYW5kbGUoc3RhdGVwdHIsIGZoLCBOVUxMKTsKKyAgICAgIGlmIChmaHJlYWwgPT0gTlVMTCkKKyAgICAgICAgZmwgPSAtMTsKKyAgICAgIGVsc2UgeworICAgICAgICBwb3NuID0gZnRlbGwoZmhyZWFsKTsKKyAgICAgICAgaWYgKGZzZWVrKGZocmVhbCwgMEwsIFNFRUtfRU5EKSA8IDApIHsKKyAgICAgICAgICBmbD0tMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBmbCA9IGZ0ZWxsKGZocmVhbCk7CisgICAgICAgICAgZnNlZWsoZmhyZWFsLCBwb3NuLCBTRUVLX1NFVCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGVwdHItPmxhc3RfZXJybm8gPSBlcnJubzsKKyAgICAgIH0KKyAgICAgIERlYnVnUHJpbnRGKCgicmV0dXJuaW5nIGxlbiAlbGRcbiIsIGZsKSk7CisgICAgICByZXR1cm4gbXNnc2VuZChDSV9DTElCLCAiJXcldyV3JXcldyIsIENMX0ZsZW58SHRvVCwgRGVidWdJRCwgT1NJbmZvMSwKKyAgICAgICAgICAgICAgICAgICAgIE9TSW5mbzIsIGZsKTsKKyAgICB9IAorCisgIGNhc2UgQ0xfSXNUVFk6CisgICAgeworICAgICAgaW50ICB0dHlPck5vdDsKKyAgICAgIHVucGFja19tZXNzYWdlKGJ1ZmZwLCAiJXciLCAmZmgpOworICAgICAgRGVidWdQcmludEYoKCJDTF9Jc1RUWTogZmggJWQgIiwgZmgpKTsKKyAgICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKworICAgICAgZmhyZWFsID0gaHN5c0dldFJlYWxGaWxlSGFuZGxlKHN0YXRlcHRyLCBmaCwgTlVMTCk7CisgICAgICBpZiAoZmhyZWFsID09IE5VTEwpCisgICAgICAgICB0dHlPck5vdCA9IEZBTFNFOworICAgICAgZWxzZSB7CisgICAgICAgIHR0eU9yTm90ID0gaXNhdHR5XyhmaHJlYWwpOworICAgICAgICBzdGF0ZXB0ci0+bGFzdF9lcnJubyA9IGVycm5vOworICAgICAgfQorICAgICAgRGVidWdQcmludEYoKCJyZXR1cm5pbmcgJXNcbiIsIHR0eU9yTm90ID8gInR0eSAoMSkiIDogIm5vdCAoMCkiKSk7CisKKyAgICAgIHJldHVybiBtc2dzZW5kKENJX0NMSUIsICIldyV3JXcldyV3IixDTF9Jc1RUWXxIdG9ULCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0lELCBPU0luZm8xLCBPU0luZm8yLCB0dHlPck5vdCk7CisgICAgfQorCisgIGNhc2UgQ0xfVG1wTmFtOgorICAgIHsKKyAgICAgIGNoYXIgKm5hbWU7CisgICAgICB1bnNpZ25lZCBpbnQgdG5hbWVsZW4sIFRhcmdldElEOworICAgICAgdW5wYWNrX21lc3NhZ2UoYnVmZnAsICIldyV3IiwgJnRuYW1lbGVuLCAmVGFyZ2V0SUQpOyAKKyAgICAgIERlYnVnUHJpbnRGKCgiQ0xfVG1wTmFtOiB0bmFtZWxlbiAlZCBUYXJnZXRJRCAlZDogIiwKKyAgICAgICAgICAgICAgICAgICB0bmFtZWxlbiwgVGFyZ2V0SUQpKTsKKyAgICAgIERldlNXX0ZyZWVQYWNrZXQocGFja2V0KTsKKworICAgICAgVGFyZ2V0SUQgPSBUYXJnZXRJRCAmIDB4RkY7CisgICAgICBpZiAoc3RhdGVwdHItPk9TcHRyLT5UZW1wTmFtZXNbVGFyZ2V0SURdID09IE5VTEwpIHsKKyAgICAgICAgaWYgKChzdGF0ZXB0ci0+T1NwdHItPlRlbXBOYW1lc1tUYXJnZXRJRF0gPQorICAgICAgICAgICAgIChjaGFyICopbWFsbG9jKExfdG1wbmFtKSkgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiT1VUIE9GIE1FTU9SWSBhdCBsaW5lICVkIGluICVzXG4iLAorICAgICAgICAgICAgICAgICAgX19MSU5FX18sIF9fRklMRV9fKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgdG1wbmFtKHN0YXRlcHRyLT5PU3B0ci0+VGVtcE5hbWVzW1RhcmdldElEXSk7CisgICAgICB9CisgICAgICBuYW1lID0gc3RhdGVwdHItPk9TcHRyLT5UZW1wTmFtZXNbVGFyZ2V0SURdOworICAgICAgbGVuID0gc3RybGVuKG5hbWUpICsgMTsKKyAgICAgIHBhY2tldCA9IERldlNXX0FsbG9jYXRlUGFja2V0KEFybXNkX0J1ZmZlclNpemUpOworICAgICAgaWYgKHBhY2tldCA9PSBOVUxMKQorICAgICAgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ09VTEQgTk9UIEFMTE9DIFBBQ0tFVCBhdCBsaW5lICVkIGluICVzXG4iLAorICAgICAgICAgICAgICAgICAgX19MSU5FX18sIF9fRklMRV9fKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBidWZmaGVhZCA9IHBhY2tldC0+cGtfYnVmZmVyOworICAgICAgaWYgKGxlbiA+IHRuYW1lbGVuKSB7CisgICAgICAgIERlYnVnUHJpbnRGKCgiVE1QTkFNRSBUT08gTE9ORyFcbiIpKTsKKyAgICAgICAgY291bnQgPSBtc2didWlsZChCVUZGRVJEQVRBKGJ1ZmZoZWFkKSwgIiV3JXcldyV3JXciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xfVG1wTmFtfEh0b1QsIERlYnVnSUQsIE9TSW5mbzEsIE9TSW5mbzIsIC0xKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBEZWJ1Z1ByaW50RigoInJldHVybmluZyBcIiVzXCJcbiIsIG5hbWUpKTsKKyAgICAgICAgY291bnQgPSBtc2didWlsZChCVUZGRVJEQVRBKGJ1ZmZoZWFkKSwgIiV3JXcldyV3JXcldyIsIENMX1RtcE5hbXxIdG9ULAorICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnSUQsIE9TSW5mbzEsIE9TSW5mbzIsIDAsIGxlbik7CisgICAgICAgIHN0cmNweSgoY2hhciAqKUJVRkZFUkRBVEEoYnVmZmhlYWQpK2NvdW50LCBuYW1lKTsKKyAgICAgICAgY291bnQgKz1sZW4rMTsKKyAgICAgIH0KKyAgICAgIHBhY2tldC0+cGtfbGVuZ3RoID0gY291bnQ7CisgICAgICBBZHBfQ2hhbm5lbFdyaXRlKENJX0NMSUIsIHBhY2tldCk7LyogU2VuZCBtZXNzYWdlLiAqLworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGNhc2UgQ0xfVW5yZWNvZ25pc2VkOgorICAgIERlYnVnUHJpbnRGKCgiQ0xfVW5yZWNvZ25pc2VkISFcbiIpKTsKKyAgICByZXR1cm4gMDsKKworICBkZWZhdWx0OgorICAgIGZwcmludGYoc3RkZXJyLCAiVU5SRUNPR05JU0VEIENMIGNvZGUgJTA4eFxuIiwgcmVhc29uX2NvZGUpOworICAgIGJyZWFrOworLyogTmVlZCBzb21lIHNvcnQgb2YgZXJyb3IgaGFuZGxpbmcgaGVyZS4gKi8KKy8qIEEgY2FsbCB0byBDTF9VbnJlY29nbmlzZWQgc2hvdWxkIHN1ZmZpY2UgKi8KKyAgfQorICByZXR1cm4gLTE7ICAvKiBTdG9wIGEgcG90ZW50aWFsIGNvbXBpbGVyIHdhcm5pbmcgKi8KK30KKworI2lmZGVmIENPTVBJTElOR19PTl9XSU5ET1dTCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK2V4dGVybiBIV05EIGh3bmRQYXJlbnQ7CisKK3ZvaWQgcGFuaWMoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgY2hhciBidWZbMjA0OF07CisgICAgdmFfbGlzdCBhcmdzOworCisgICAgQWRwX0Nsb3NlRGV2aWNlKCk7CisKKyAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICAgIHZzcHJpbnRmKGJ1ZiwgZm9ybWF0LCBhcmdzKTsKKworICAgIE1lc3NhZ2VCb3goaHduZFBhcmVudCwgKExQQ1RTVFIpYnVmLCAoTFBDVFNUUikiRmF0YWwgRXJyb3I6IiwgTUJfT0spOworCisgICAgLyogU0ogLSBOb3QgdGhlIHByb3BlciB3YXkgdG8gc2h1dGRvd24gdGhlIGFwcCAqLworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKworLyoKKyAgICBpZiAoaHduZFBhcmVudCAhPSBOVUxMKQorICAgICAgICBTZW5kTWVzc2FnZShod25kUGFyZW50LCBXTV9RVUlULCAwLCAwKTsKKyovCisKKyAgICB2YV9lbmQoYXJncyk7Cit9CisKKyNlbHNlCisKK3ZvaWQgcGFuaWMoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworCisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkZhdGFsIGVycm9yOiAiKTsKKyAgICB2ZnByaW50ZihzdGRlcnIsIGZvcm1hdCwgYXJncyk7CisgICAgZnByaW50ZihzdGRlcnIsIlxuIik7CisKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKKyNlbmRpZgorCisvKiBFT0YgaHN5cy5jICovCmRpZmYgLS1naXQgYS9nZGIvcmRpLXNoYXJlL2hzeXMuaCBiL2dkYi9yZGktc2hhcmUvaHN5cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNjNkMDEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL2hzeXMuaApAQCAtMCwwICsxLDEwMSBAQAorLyogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgdXNlZCwgY29waWVkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzIHByZXNlcnZlZCBpbiBhbGwgY29waWVzIG9mIHRoZQorICogc29mdHdhcmUuCisgKi8KKworLyoKKyAqIEhvc3QgQyBsaWJyYXJ5IHN1cHBvcnQgaGVhZGVyIGZpbGUuCisgKgorICogJFJldmlzaW9uJAorICogICAgICREYXRlJAorICoKKyAqLworCisjaWZuZGVmIGFuZ3NkX2hzeXNfaAorI2RlZmluZSBhbmdzZF9oc3lzX2gKKworI2RlZmluZSBIU1lTX0ZPUEVOX01BWCAyNTYKKyNkZWZpbmUgTk9OSEFORExFIC0xCisjZGVmaW5lIFVOSVFVRVRFTVBTIDI1NgorCisjaW5jbHVkZSAiZGJnX2hpZi5oIgorI2luY2x1ZGUgImhvc3RjaGFuLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgRklMRSAqRmlsZVRhYmxlW0hTWVNfRk9QRU5fTUFYXSA7CisgIGNoYXIgRmlsZUZsYWdzW0hTWVNfRk9QRU5fTUFYXSA7CisgIGNoYXIgKlRlbXBOYW1lc1tVTklRVUVURU1QU107Cit9IE9TYmxvY2s7CisKKyNkZWZpbmUgTk9PUCAwCisjZGVmaW5lIEJJTkFSWSAxCisjZGVmaW5lIFJFQURPUCAyCisjZGVmaW5lIFdSSVRFT1AgNAorCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IHN0cnVjdCBEYmdfSG9zdG9zSW50ZXJmYWNlICpob3N0aWY7ICAvKiBJbnRlcmZhY2UgdG8gZGVidWcgdG9vbGtpdC4gKi8KKyAgaW50IGxhc3RfZXJybm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHRoZSBsYXN0IGVycm9yLiAqLworICBPU2Jsb2NrICpPU3B0cjsKKyAgY2hhciAqKkNvbW1hbmRMaW5lIDsgICAgICAgICAgIC8qIFB0ciB0byBjbWQgbGluZSBkYHN0cmluZyBoZWxkIGJ5IGFyZGkuYyAqLworfSBoc3lzX3N0YXRlOworCisvKgorICogIEZ1bmN0aW9uOiBIb3N0U3lzSW5pdAorICogICBQdXJwb3NlOiBTZXQgdXAgdGhlIHN0YXRlIGJsb2NrLCBmaWxldGFibGUgYW5kIHJlZ2lzdGVyIHRoZSBhbmQgQyBsaWIKKyAqICAgICAgICAgICAgY2FsbGJhY2sgZm4gCisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IGhvc3RpZiwgdGhlIGhvc3QgaW50ZXJmYWNlIGZyb20gdGhlIGRlYnVnIHRvb2xib3gKKyAqICAgICAgICAgICAgICBjbWRsaW5lLCB0aGUgY29tbWFuZCBsaW5lIHVzZWQgdG8gY2FsbCB0aGUgaW1hZ2UKKyAqICAgICAgICAgICAgICBzdGF0ZSwgdGhlIHN0YXR1cyBibG9jayBmb3IgdGhlIEMgbGliIAorICoKKyAqICAgUmV0dXJuczoKKyAqICAgICAgICAgIE9LOiBhbiBSRElFcnJvcl8qIHZhbHVlZQorICovCitleHRlcm4gaW50IEhvc3RTeXNJbml0KAorICBjb25zdCBzdHJ1Y3QgRGJnX0hvc3Rvc0ludGVyZmFjZSAqaG9zdGlmLCBjaGFyICoqY21kbGluZSwgaHN5c19zdGF0ZSAqKnN0YXRlCispOworCisvKgorICogIEZ1bmN0aW9uOiBIb3N0U3lzRXhpdAorICogICBQdXJwb3NlOiBDbG9zZSBkb3duIHRoZSBob3N0IHNpZGUgQyBsaWJyYXJ5IHN1cHBvcnQKKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgICBJbnB1dDogaHN0YXRlLCB0aGUgc3RhdHVzIGJsb2NrIGZvciB0aGUgQyBsaWIgCisgKgorICogICAgUmV0dXJuczogIGFuIFJESUVycm9yXyogdmFsdWVlCisgKi8KK2V4dGVybiBpbnQgSG9zdFN5c0V4aXQoaHN5c19zdGF0ZSAqaHN0YXRlKTsKKworLyoKKyAqICBGdW5jdGlvbjogSGFuZGxlU3lzTWVzc2FnZQorICogICBQdXJwb3NlOiBIYW5kbGUgYW4gaW5jb21pbmcgQyBsaWJyYXJ5IG1lc3NhZ2UgYXMgYSBjYWxsYmFjaworICoKKyAqICAgIFBhcmFtczoKKyAqICAgICAgIElucHV0OiBwYWNrZXQgaXMgdGhlIGluY29taW5nIGRhdGEgcGFja2V0IGFzIGRlc2NyaWJlZCBpbiBkZXZzdy5oCisgKiAgICAgICBoc3RhdGUsIHRoZSBzdGF0dXMgYmxvY2sgZm9yIHRoZSBDIGxpYgorICoKKyAqICAgIFJldHVybnM6ICBhbiBSRElFcnJvcl8qIHZhbHVlZQorICovCitleHRlcm4gaW50IEhhbmRsZVN5c01lc3NhZ2UoUGFja2V0ICpwYWNrZXQsIGhzeXNfc3RhdGUqIHN0YXRlcHRyKTsKKworLyoKKyAqICBGdW5jdGlvbjogcGFuaWMKKyAqICAgUHVycG9zZTogUHJpbnQgYSBmYXRhbCBlcnJvciBtZXNzYWdlCisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IGZvcm1hdCAgcHJpbnRmKCkgc3R5bGUgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBwcm9ibGVtCisgKiAgICAgICAgICAgICAgLi4uICAgICBleHRyYSBhcmd1bWVudHMgZm9yIHByaW50ZigpLgorICoKKyAqICAgUmV0dXJuczogVGhpcyByb3V0aW5lIGRvZXMgbm90IHJldHVybgorICoKKyAqIFBvc3QtY29uZGl0aW9uczogV2lsbCBoYXZlIGNhbGxlZCBleGl0KDEpOworICovCitleHRlcm4gdm9pZCBwYW5pYyhjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CisKKyNlbmRpZiAvKiBuZGVmIGFuZ3NkX2hzeXNfaCAqLworCisvKiBFT0YgaHN5cy5oICovCmRpZmYgLS1naXQgYS9nZGIvcmRpLXNoYXJlL2xvZ2dpbmcuYyBiL2dkYi9yZGktc2hhcmUvbG9nZ2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YjcwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL2xvZ2dpbmcuYwpAQCAtMCwwICsxLDM2OSBAQAorLyogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgdXNlZCwgY29waWVkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzIHByZXNlcnZlZCBpbiBhbGwgY29waWVzIG9mIHRoZQorICogc29mdHdhcmUuCisgKi8KKworLyogLSotQy0qLQorICoKKyAqICRSZXZpc2lvbiQKKyAqICAgICAkRGF0ZSQKKyAqCisgKgorICogbG9nZ2luZy5jIC0gbWV0aG9kcyBmb3IgbG9nZ2luZyB3YXJuaW5ncywgZXJyb3JzIGFuZCB0cmFjZSBpbmZvCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4gICAgIC8qIEFOU0kgdmFyYXJncyBzdXBwb3J0ICovCisKKyNpZmRlZiBUQVJHRVQKKyMgaW5jbHVkZSAiYW5nZWwuaCIKKyMgaW5jbHVkZSAiZGV2Y29uZi5oIgorI2Vsc2UKKyMgaW5jbHVkZSAiaG9zdC5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJsb2dnaW5nLmgiICAgIC8qIEhlYWRlciBmaWxlIGZvciB0aGlzIHNvdXJjZSBjb2RlICovCisKKyNpZm5kZWYgVU5VU0VECisjIGRlZmluZSBVTlVTRUQoeCkgKCh4KT0oeCkpCisjZW5kaWYKKworLyoKKyAqIF9fcnRfd2FybmluZworICogLS0tLS0tLS0tLS0tCisgKiBUaGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgYXMgYSBzdGFuZGFyZCBtZXRob2Qgb2YgZ2VuZXJhdGluZworICogcnVuLXRpbWUgc3lzdGVtIHdhcm5pbmdzLiBUaGUgYWN0dWFsIGFjdGlvbiB0YWtlbiBieSB0aGlzIGNvZGUgY2FuCisgKiBiZSBib2FyZCBvciB0YXJnZXQgYXBwbGljYXRpb24gc3BlY2lmaWMsIGUuZy4gaW50ZXJuYWwgbG9nZ2luZywKKyAqIGRlYnVnIG1lc3NhZ2UsIGV0Yy4KKyAqLworCisjaWZkZWYgREVCVUcKKworIyBpZmRlZiBERUJVR19NRVRIT0QKKworIyAgZGVmaW5lICBTVFJJTkdJRlkyKHgpICN4CisjICBkZWZpbmUgIFNUUklOR0lGWSh4KSAgU1RSSU5HSUZZMih4KQorIyAgZGVmaW5lICBERUJVR19NRVRIT0RfSEVBREVSICAgICAgICBTVFJJTkdJRlkoREVCVUdfTUVUSE9EIyMuaCkKKworIyAgaW5jbHVkZSBERUJVR19NRVRIT0RfSEVBREVSCisKKyMgIGRlZmluZSAgTUVUSE9EX0VYUEFORF8yKG0sIHAsIGMpIG0jI3AoYykKKyMgIGRlZmluZSAgTUVUSE9EX0VYUEFORChtLCBwLCBjKSAgIE1FVEhPRF9FWFBBTkRfMihtLCBwLCBjKQorCisjICBkZWZpbmUgIENIQVJPVVQoYykgICAgTUVUSE9EX0VYUEFORChERUJVR19NRVRIT0QsIF9QdXRDaGFyLCAgKGMpKQorIyAgZGVmaW5lICBQUkVfREVCVUcobCkgIE1FVEhPRF9FWFBBTkQoREVCVUdfTUVUSE9ELCBfUHJlV2FybiwgIChsKSkKKyMgIGRlZmluZSAgUE9TVF9ERUJVRyhuKSBNRVRIT0RfRVhQQU5EKERFQlVHX01FVEhPRCwgX1Bvc3RXYXJuLCAobikpCisKKyMgZWxzZQorIyAgZXJyb3IgTXVzdCBkZWZpbmUgREVCVUdfTUVUSE9ECisjIGVuZGlmCisKKyNlbmRpZiAvKiBkZWYgREVCVUcgKi8KKworLyoKKyAqIHRoZSBndXRzIG9mIF9fcnRfd2FybmluZworICovCisKKyNwcmFnbWEgbm9fY2hlY2tfc3RhY2sKKyNpZmRlZiBERUJVRworCitzdGF0aWMgY29uc3QgY2hhciBoZXh0YWJbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKworLyoKKyAqIElmIGRlYnVnZ2luZywgdGhlbiB3ZSBicmVhayB2YV93YXJuIGludG8gc3ViLWZ1bmN0aW9ucyB3aGljaAorICogYWxsb3cgdXMgdG8gZ2V0IGFuIGVhc3kgYnJlYWtwb2ludCBvbiB0aGUgZm9ybWF0dGVkIHN0cmluZworICovCitzdGF0aWMgaW50IHZhX3dhcm4wKGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQoreworICAgIGludCBsZW4gPSAwOworCisgICAgd2hpbGUgKChmb3JtYXQgIT0gTlVMTCkgJiYgKCpmb3JtYXQgIT0gJ1wwJykpCisgICAgeworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnJScpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgZmNoID0gKigrK2Zvcm1hdCk7IC8qIGdldCBmb3JtYXQgY2hhcmFjdGVyIChza2lwcGluZyAnJScpICovCisgICAgICAgICAgICBpbnQgaXZhbDsgLyogaG9sZGVyIGZvciBpbnRlZ2VyIGFyZ3VtZW50cyAqLworICAgICAgICAgICAgY2hhciAqc3RyaW5nOyAvKiBob2xkZXIgZm9yIHN0cmluZyBhcmd1bWVudHMgKi8KKyAgICAgICAgICAgIGludCB3aWR0aCA9IDA7IC8qIE5vIGZpZWxkIHdpZHRoIGJ5IGRlZmF1bHQgKi8KKyAgICAgICAgICAgIGludCBwYWR6ZXJvID0gRkFMU0U7IC8qIEJ5IGRlZmF1bHQgd2UgcGFkIHdpdGggc3BhY2VzICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDaGVjayBpZiB0aGUgZm9ybWF0IGhhcyBhIHdpZHRoIHNwZWNpZmllZC4gTk9URTogV2UgZG8KKyAgICAgICAgICAgICAqIG5vdCB1c2UgdGhlICJpc2RpZ2l0IiBmdW5jdGlvbiBoZXJlLCBzaW5jZSBpdCB3aWxsCisgICAgICAgICAgICAgKiByZXF1aXJlIHJ1bi10aW1lIHN1cHBvcnQuIFRoZSBjdXJyZW50IEFSTSBMdGQgaGVhZGVyCisgICAgICAgICAgICAgKiBkZWZpbmVzICJpc2RpZ2l0IiBhcyBhIG1hY3JvLCB0aGF0IHVzZXMgYSBmaXhlZAorICAgICAgICAgICAgICogY2hhcmFjdGVyIGRlc2NyaXB0aW9uIHRhYmxlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKGZjaCA+PSAnMCcpICYmIChmY2ggPD0gJzknKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmNoID09ICcwJykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIExlYWRpbmcgemVyb2VzIHBhZGRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgcGFkemVybyA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGZjaCA9ICooKytmb3JtYXQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlICgoZmNoID49ICcwJykgJiYgKGZjaCA8PSAnOScpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAoKHdpZHRoICogMTApICsgKGZjaCAtICcwJykpOworICAgICAgICAgICAgICAgICAgICBmY2ggPSAqKCsrZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmY2ggPT0gJ2wnKQorICAgICAgICAgICAgICAgIC8qIHNraXAgJ2wnIGluICIlbHgiLCBldGMuICovCisgICAgICAgICAgICAgICAgZmNoID0gKigrK2Zvcm1hdCk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoZmNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgICAgICAgIC8qIGNoYXIgKi8KKyAgICAgICAgICAgICAgICAgIGl2YWwgPSB2YV9hcmcoYXJncywgaW50KTsKKyAgICAgICAgICAgICAgICAgIENIQVJPVVQoKGNoYXIpaXZhbCk7CisgICAgICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogaGV4YWRlY2ltYWwgKi8KKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB1dmFsID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGludCk7CisgICAgICAgICAgICAgICAgICBpbnQgbG9vcDsKKworICAgICAgICAgICAgICAgICAgVU5VU0VEKHV2YWwpOworCisgICAgICAgICAgICAgICAgICBpZiAoKHdpZHRoID09IDApIHx8ICh3aWR0aCA+IDgpKQorICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gODsKKworICAgICAgICAgICAgICAgICAgZm9yKGxvb3AgPSAod2lkdGggKiA0KTsgKGxvb3AgIT0gMCk7IGxvb3AgLT0gNCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBDSEFST1VUKGhleHRhYlsodXZhbCA+PiAobG9vcCAtIDQpKSAmIDB4Rl0pOworICAgICAgICAgICAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgICAgICAvKiBkZWNpbWFsICovCisgICAgICAgICAgICAgICAgICBpdmFsID0gdmFfYXJnKGFyZ3MsIGludCk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChpdmFsIDwgMCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpdmFsID0gLWl2YWw7CisgICAgICAgICAgICAgICAgICAgICAgQ0hBUk9VVCgnLScpOworICAgICAgICAgICAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBpZiAoaXZhbCA9PSAwKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIENIQVJPVVQoJzAnKTsKKyAgICAgICAgICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSBzaW1wbGVzdCBtZXRob2Qgb2YgZGlzcGxheWluZyBudW1iZXJzIGlzCisgICAgICAgICAgICAgICAgICAgICAgICogdG8gcHJvdmlkZSBhIHNtYWxsIHJlY3Vyc2l2ZSByb3V0aW5lLCB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICogbmVzdHMgdW50aWwgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgZGlnaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgKiByZWFjaGVkLCBhbmQgdGhlbiBmYWxscyBiYWNrIG91dCBkaXNwbGF5aW5nCisgICAgICAgICAgICAgICAgICAgICAgICogaW5kaXZpZHVhbCBkaWdpdHMuIEhvd2V2ZXIsIHdlIHdhbnQgdG8gYXZvaWQKKyAgICAgICAgICAgICAgICAgICAgICAgKiB1c2luZyByZWN1cnNpdmUgY29kZSB3aXRoaW4gdGhlIGxvLWxldmVsCisgICAgICAgICAgICAgICAgICAgICAgICogcGFydHMgb2YgQW5nZWwgKHRvIG1pbmltaXNlIHRoZSBzdGFjaworICAgICAgICAgICAgICAgICAgICAgICAqIHVzYWdlKS4gVGhlIGZvbGxvd2luZyBudW1iZXIgY29udmVyc2lvbiBpcyBhCisgICAgICAgICAgICAgICAgICAgICAgICogbm9uLXJlY3Vyc2l2ZSBzb2x1dGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICBjaGFyIGJ1ZmZlclsxNl07IC8qIHN0YWNrIHNwYWNlIHVzZWQgdG8gaG9sZCBudW1iZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOyAvKiBwb2ludGVyIGludG8gYnVmZmVyICovCisKKyAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAqIFBsYWNlIHRoZSBjb252ZXJzaW9uIGludG8gdGhlIGJ1ZmZlciBpbgorICAgICAgICAgICAgICAgICAgICAgICAqIHJldmVyc2Ugb3JkZXI6CisgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl2YWwgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltjb3VudCsrXSA9ICgnMCcgKyAoKHVuc2lnbmVkIGludClpdmFsICUgMTApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXZhbCA9ICgodW5zaWduZWQgaW50KWl2YWwgLyAxMCk7CisgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgKiBDaGVjayBpZiB3ZSBhcmUgcGxhY2luZyB0aGUgZGF0YSBpbiBhCisgICAgICAgICAgICAgICAgICAgICAgICogZml4ZWQgd2lkdGggZmllbGQ6CisgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCAtPSBjb3VudDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgKHdpZHRoICE9IDApOyB3aWR0aC0tKQorICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFST1VUKHBhZHplcm8gPyAnMCc6ICcgJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZW4gZGlzcGxheSB0aGUgYnVmZmVyIGluIHJldmVyc2Ugb3JkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgKGNvdW50ICE9IDApOyBjb3VudC0tKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUk9VVChidWZmZXJbY291bnQgLSAxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICAgICAgICAvKiBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICAgIHN0cmluZyA9IHZhX2FyZyhhcmdzLCBjaGFyICopOworCisgICAgICAgICAgICAgICAgICAvKiB3ZSBvbmx5IG5lZWQgdGhpcyB0ZXN0IG9uY2UgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAvKiB3aGlsc3Qgd2UgY2hlY2sgdGhpcyBmb3IgZXZlcnkgY2hhcmFjdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCpzdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFST1VUKCpzdHJpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICogTk9URTogV2UgZG8gbm90IHVzZSAiKnN0cmluZysrIiBhcyB0aGUgbWFjcm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGFyYW1ldGVyLCBzaW5jZSB3ZSBkbyBub3Qga25vdyBob3cgbWFueSB0aW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRoZSBwYXJhbWV0ZXIgbWF5IGJlIGV4cGFuZGVkIHdpdGhpbiB0aGUgbWFjcm8uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAnXDAnOgorICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAqIHN0cmluZyB0ZXJtaW5hdGVkIGJ5ICclJyBjaGFyYWN0ZXIsIGJvZGdlIHRoaW5ncworICAgICAgICAgICAgICAgICAgICogdG8gcHJlcGFyZSBmb3IgZGVmYXVsdCAiZm9ybWF0KysiIGJlbG93CisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGZvcm1hdC0tOworCisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgLyoganVzdCBkaXNwbGF5IHRoZSBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgICAgICAgIENIQVJPVVQoKmZvcm1hdCk7CisgICAgICAgICAgICAgICAgICBsZW4rKzsKKworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcm1hdCsrOyAvKiBzdGVwIG92ZXIgZm9ybWF0IGNoYXJhY3RlciAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ0hBUk9VVCgqZm9ybWF0KTsKKyAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIHRoaXMgcm91dGluZSBpcyBzaW1wbHkgaGVyZSBhcyBhIGdvb2QgYnJlYWtwb2ludCBmb3IgZHVtcGluZyBtc2cgLQorICogY2FuIGJlIHVzZWQgYnkgREVCVUdfTUVUSE9EIG1hY3JvcyBvciBmdW5jdGlvbnMsIGlmIHJlcXVpcmVkLgorICovCisjIGlmZGVmIERFQlVHX05FRURfVkFfV0FSTjEKK3N0YXRpYyB2b2lkIHZhX3dhcm4xKGludCBsZW4sIGNoYXIgKm1zZykKK3sKKyAgICBVTlVTRUQobGVuKTsgVU5VU0VEKG1zZyk7Cit9CisjIGVuZGlmCisKK3ZvaWQgdmFfd2FybihXYXJuTGV2ZWwgbGV2ZWwsIGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQoreworICAgIGludCBsZW47CisKKyAgICBpZiAoIFBSRV9ERUJVRyggbGV2ZWwgKSApCisgICAgeworICAgICAgICBsZW4gPSB2YV93YXJuMChmb3JtYXQsIGFyZ3MpOworICAgICAgICBQT1NUX0RFQlVHKCBsZW4gKTsKKyAgICB9Cit9CisKKyNlbHNlIC8qIG5kZWYgREVCVUcgKi8KKwordm9pZCB2YV93YXJuKFdhcm5MZXZlbCBsZXZlbCwgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgICAgVU5VU0VEKGxldmVsKTsgVU5VU0VEKGZvcm1hdCk7IFVOVVNFRChhcmdzKTsKK30KKworI2VuZGlmIC8qIC4uLiBlbHNlIG5kZWYoREVCVUcpIC4uLiAqLworI3ByYWdtYSBjaGVja19zdGFjaworCisjcHJhZ21hIG5vX2NoZWNrX3N0YWNrCit2b2lkIF9fcnRfd2FybmluZyhjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisKKyAgICAvKgorICAgICAqIEZvciBhIG11bHRpLXRocmVhZGVkIHN5c3RlbSB3ZSBzaG91bGQgcHJvdmlkZSBhIGxvY2sgYXQgdGhpcyBwb2ludAorICAgICAqIHRvIGVuc3VyZSB0aGF0IHRoZSB3YXJuaW5nIG1lc3NhZ2VzIGFyZSBzZXF1ZW5jZWQgcHJvcGVybHkuCisgICAgICovCisKKyAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICAgIHZhX3dhcm4oV0xfV0FSTiwgZm9ybWF0LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7CisKKyAgICByZXR1cm47Cit9CisjcHJhZ21hIGNoZWNrX3N0YWNrCisKKyNpZmRlZiBUQVJHRVQKKworI3ByYWdtYSBub19jaGVja19zdGFjawordm9pZCBfX3J0X3VuaW50ZXJydXB0YWJsZV9sb29wKCB2b2lkICk7IC8qIGluIHN1cHBhc20ucyAqLworCit2b2lkIF9fcnRfZXJyb3IoY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworCisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKworICAgIC8qIERpc3BsYXkgd2FybmluZyBtZXNzYWdlICovCisgICAgdmFfd2FybihXTF9FUlJPUiwgZm9ybWF0LCBhcmdzKTsKKworICAgIF9fcnRfdW5pbnRlcnJ1cHRhYmxlX2xvb3AoKTsKKworICAgIHZhX2VuZChhcmdzKTsKKyAgICByZXR1cm47Cit9CisjcHJhZ21hIGNoZWNrX3N0YWNrCisKKyNlbmRpZiAvKiBkZWYgVEFSR0VUICovCisKKyNpZmRlZiBET19UUkFDRQorCitzdGF0aWMgYm9vbCB0cmFjZV9vbiA9IEZBTFNFOyAvKiBtdXN0IGJlIHNldCB0cnVlIGluIGRlYnVnZ2VyIGlmIHJlcSdkICovCisKKyNwcmFnbWEgbm9fY2hlY2tfc3RhY2sKK3ZvaWQgX19ydF90cmFjZShjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisKKyAgICAvKgorICAgICAqIEZvciBhIG11bHRpLXRocmVhZGVkIHN5c3RlbSB3ZSBzaG91bGQgcHJvdmlkZSBhIGxvY2sgYXQgdGhpcyBwb2ludAorICAgICAqIHRvIGVuc3VyZSB0aGF0IHRoZSB3YXJuaW5nIG1lc3NhZ2VzIGFyZSBzZXF1ZW5jZWQgcHJvcGVybHkuCisgICAgICovCisKKyAgICBpZiAodHJhY2Vfb24pCisgICAgeworICAgICAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICAgICAgICB2YV93YXJuKFdMX1RSQUNFLCBmb3JtYXQsIGFyZ3MpOworICAgICAgICB2YV9lbmQoYXJncyk7CisgICAgfQorCisgICAgcmV0dXJuOworfQorI3ByYWdtYSBjaGVja19zdGFjaworCisjZW5kaWYgLyogZGVmIERPX1RSQUNFICovCisKKworLyogRU9GIGxvZ2dpbmcuYyAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9sb2dnaW5nLmggYi9nZGIvcmRpLXNoYXJlL2xvZ2dpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2JmOTAyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9sb2dnaW5nLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qIC0qLUMtKi0KKyAqCisgKiAkUmV2aXNpb24kCisgKiAgICAgJERhdGUkCisgKgorICoKKyAqIGxvZ2dpbmcuaCAtIG1ldGhvZHMgZm9yIGxvZ2dpbmcgd2FybmluZ3MsIGVycm9ycyBhbmQgdHJhY2UgaW5mbworICovCisKKyNpZm5kZWYgYW5nZWxfbG9nZ2luZ19oCisjZGVmaW5lIGFuZ2VsX2xvZ2dpbmdfaAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qCisgKiBfX3J0X3dhcm5pbmcKKyAqIC0tLS0tLS0tLS0tLQorICogUHJvdmlkZXMgYSBzdGFuZGFyZCBtZXRob2Qgb2YgZ2VuZXJhdGluZyBydW4tdGltZSBzeXN0ZW0KKyAqIHdhcm5pbmdzLiBUaGUgYWN0dWFsIGFjdGlvbiB0YWtlbiBieSB0aGlzIGNvZGUgY2FuIGJlIGJvYXJkIG9yCisgKiB0YXJnZXQgYXBwbGljYXRpb24gc3BlY2lmaWMsIGUuZy4gaW50ZXJuYWwgbG9nZ2luZywgZGVidWcgbWVzc2FnZSwKKyAqIGV0Yy4KKyAqLworZXh0ZXJuIHZvaWQgX19ydF93YXJuaW5nKGNoYXIgKmZvcm1hdCwgLi4uKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogX19ydF9lcnJvcgorICogLS0tLS0tLS0tLQorICogUmFpc2UgYW4gaW50ZXJuYWwgQW5nZWwgZXJyb3IuIFRoZSBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgZGlyZWN0bHkKKyAqIHRvICJfX3J0X3dhcm5pbmciIGZvciBkaXNwbGF5LCBhbmQgdGhlIGNvZGUgdGhlbiByYWlzZXMgYSBkZWJ1Z2dlcgorICogZXZlbnQgYW5kIHN0b3BzIHRoZSB0YXJnZXQgcHJvY2Vzc2luZy4KKyAqLworZXh0ZXJuIHZvaWQgX19ydF9lcnJvcihjaGFyICpmb3JtYXQsIC4uLik7CisKKy8qCisgKiBTb21lIG1hY3JvcyBmb3IgZGVidWdnaW5nIGFuZCB3YXJuaW5nIG1lc3NhZ2VzCisgKi8KKwordHlwZWRlZiBlbnVtIFdhcm5MZXZlbCB7CisgICAgV0xfVFJBQ0UsCisgICAgV0xfV0FSTiwKKyAgICBXTF9FUlJPUgorfSBXYXJuTGV2ZWw7CisKK3ZvaWQgdmFfd2FybihXYXJuTGV2ZWwgbGV2ZWwsIGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKTsKKworI2lmZGVmIF9XSU5HRElfCisvKiBzdHVwaWRpdHkgaW4gTVNWQyA8d2luZ2RpLmg+IChpbiA8d2luZG93cy5oPiBpbiA8d2luc29jay5oPikgKi8KKyMgdW5kZWYgRVJST1IKKyNlbmRpZgorCisjaWZuZGVmIEVSUk9SCisjIGRlZmluZSBFUlJPUl9GT1JNQVQgIkVycm9yIFwiJXNcIiBpbiAlcyBhdCBsaW5lICVkXG4iCisjIGRlZmluZSBFUlJPUihlKSBfX3J0X2Vycm9yKEVSUk9SX0ZPUk1BVCwgKGUpLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZW5kaWYKKworI2lmbmRlZiBBU1NFUlQKKyMgaWZkZWYgQVNTRVJUSU9OU19FTkFCTEVECisjICAgZGVmaW5lIEFTU0VSVCh4LCB5KSAoKHgpID8gKHZvaWQpKDApIDogRVJST1IoKHkpKSkKKyMgZWxzZQorIyAgIGRlZmluZSBBU1NFUlQoeCwgeSkgKCh2b2lkKSgwKSkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFdBUk4KKyMgaWZkZWYgQVNTRVJUSU9OU19FTkFCTEVECisjICAgZGVmaW5lIFdBUk5fRk9STUFUICJXYXJuaW5nIFwiJXNcIiBpbiAlcyBhdCBsaW5lICVkXG4iCisjICAgZGVmaW5lIFdBUk4odykgX19ydF93YXJuaW5nKFdBUk5fRk9STUFULCAodyksIF9fRklMRV9fLCBfX0xJTkVfXykKKyMgZWxzZQorIyAgIGRlZmluZSBXQVJOKHcpICgodm9pZCkoMCkpCisjIGVuZGlmCisjZW5kaWYKKworCisjaWZkZWYgTk9fSU5GT19NRVNTQUdFUworIyBkZWZpbmUgX19ydF9pbmZvICh2b2lkKQorIyBpZm5kZWYgSU5GTworIyAgIGRlZmluZSBJTkZPKHcpCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgX19ydF9pbmZvIF9fcnRfd2FybmluZworIyBpZm5kZWYgSU5GTworIyAgaWZkZWYgREVCVUcKKyMgICBkZWZpbmUgSU5GTyh3KSBfX3J0X3dhcm5pbmcoIiVzXG4iLCAodykpCisjICBlbHNlCisjICAgZGVmaW5lIElORk8odykgKCh2b2lkKSgwKSkKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworCisjaWYgZGVmaW5lZChERUJVRykgJiYgIWRlZmluZWQoTk9fSURMRV9DSElUQ0hBVCkKKyMgaWZuZGVmIERPX1RSQUNFCisjICAgZGVmaW5lIERPX1RSQUNFICgxKQorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBET19UUkFDRQorZXh0ZXJuIHZvaWQgX19ydF90cmFjZShjaGFyICpmb3JtYXQsIC4uLik7CisjZW5kaWYKKworI2lmbmRlZiBUUkFDRQorIyBpZmRlZiBET19UUkFDRQorIyAgIGRlZmluZSBUUkFDRSh3KSBfX3J0X3RyYWNlKCIlcyAiLCAodykpCisjIGVsc2UKKyMgICBkZWZpbmUgVFJBQ0UodykgKCh2b2lkKSgwKSkKKyMgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogbmRlZiBhbmdlbF9sb2dnaW5nX2ggKi8KKworLyogRU9GIGxvZ2dpbmcuaCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9tc2didWlsZC5jIGIvZ2RiL3JkaS1zaGFyZS9tc2didWlsZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZGIyY2MKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL21zZ2J1aWxkLmMKQEAgLTAsMCArMSwyODIgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qIC0qLUMtKi0KKyAqCisgKiAkUmV2aXNpb24kCisgKiAgICAgJERhdGUkCisgKgorICoKKyAqIG1zZ2J1aWxkLmMgLSB1dGlsaXRpZXMgZm9yIGFzc2VtYmxpbmcgYW5kIGludGVycHJldGluZyBBRFAgbWVzc2FnZXMKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPiAgICAgLyogQU5TSSB2YXJhcmdzIHN1cHBvcnQgKi8KKworI2lmZGVmIFRBUkdFVAorIyBpbmNsdWRlICJhbmdlbC5oIgorIyBpbmNsdWRlICJkZXZjb25mLmgiCisjZWxzZQorIyBpbmNsdWRlICJob3N0LmgiCisjIGluY2x1ZGUgImhvc3RjaGFuLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImNoYW5uZWxzLmgiCisjaW5jbHVkZSAiYnVmZmVycy5oIgorI2luY2x1ZGUgImVuZGlhbi5oIiAgICAgLyogRW5kaWFubmVzcyBzdXBwb3J0IG1hY3JvcyAqLworI2luY2x1ZGUgIm1zZ2J1aWxkLmgiICAgLyogSGVhZGVyIGZpbGUgZm9yIHRoaXMgc291cmNlIGNvZGUgKi8KKworI2lmbmRlZiBVTlVTRUQKKyMgZGVmaW5lIFVOVVNFRCh4KSAoKHgpPSh4KSkKKyNlbmRpZgorCisjaWZuZGVmIFRBUkdFVAorCitleHRlcm4gdW5zaWduZWQgaW50IEFybXNkX0J1ZmZlclNpemU7CisKKyNlbmRpZiAvKiBuZGVmIFRBUkdFVCAqLworCisKK3Vuc2lnbmVkIGludCB2bXNnYnVpbGQodW5zaWduZWQgY2hhciAqYnVmZmVyLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKyAgICB1bnNpZ25lZCBpbnQgYmxlbiA9IDA7CisgICAgaW50IGNoOworCisgICAgLyogU3RlcCB0aHJvdWdoIHRoZSBmb3JtYXQgc3RyaW5nICovCisgICAgd2hpbGUgKChjaCA9ICpmb3JtYXQrKykgIT0gJ1wwJykKKyAgICB7CisgICAgICAgIGlmIChjaCAhPSAnJScpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAqYnVmZmVyKysgPSAodW5zaWduZWQgY2hhciljaDsKKworICAgICAgICAgICAgYmxlbisrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChjaCA9ICpmb3JtYXQrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY2FzZSAndyc6CisgICAgICAgICAgICAgIGNhc2UgJ1cnOgorICAgICAgICAgICAgICAvKiAzMmJpdCBwb2ludGVyICovCisgICAgICAgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLyogMzJiaXQgd29yZCAvIDMyYml0IHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBpbnQpOworCisgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgUFVUMzJMRShidWZmZXIsIG5hKTsKKyAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgKz0gc2l6ZW9mKHVuc2lnbmVkIGludCk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGJsZW4gKz0gc2l6ZW9mKHVuc2lnbmVkIGludCk7CisKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICAgIGNhc2UgJ0gnOgorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiAxNmJpdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5hID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGludCk7CisKKyAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBQVVQxNkxFKGJ1ZmZlciwgbmEpOworICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBzaXplb2YodW5zaWduZWQgc2hvcnQpOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBibGVuICs9IHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgICAgICAgICAvKiA4Yml0IGNoYXJhY3RlciAvIDhiaXQgYnl0ZSAqLworICAgICAgICAgICAgICAgICAgY2ggPSB2YV9hcmcoYXJncywgaW50KTsKKworICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAqIFhYWAorICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAqIGZhbGwgdGhyb3VnaCB0byB0aGUgbm9ybWFsIGNoYXJhY3RlciBwcm9jZXNzaW5nCisgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIC8qIG5vcm1hbCAnJScgY2hhcmFjdGVyLCBvciBhIGRpZmZlcmVudCBub3JtYWwgY2hhcmFjdGVyICovCisgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlcisrID0gKHVuc2lnbmVkIGNoYXIpY2g7CisKKyAgICAgICAgICAgICAgICAgIGJsZW4rKzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJsZW47Cit9CisKKy8qCisgKiBtc2didWlsZAorICogLS0tLS0tLS0KKyAqIFNpbXBsZSByb3V0aW5lIHRvIGFpZCBpbiBjb25zdHJ1Y3Rpb24gb2YgQW5nZWwgbWVzc2FnZXMuIFNlZSB0aGUKKyAqICJtc2didWlsZC5oIiBoZWFkZXIgZmlsZSBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgb3BlcmF0aW9uCisgKiBvZiB0aGlzIHJvdXRpbmUuCisgKi8KK3Vuc2lnbmVkIGludCBtc2didWlsZCh1bnNpZ25lZCBjaGFyICpidWZmZXIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXJnczsKKyAgICB1bnNpZ25lZCBpbnQgYmxlbjsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgYmxlbiA9IHZtc2didWlsZChidWZmZXIsIGZvcm1hdCwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3MpOworCisgICAgcmV0dXJuIGJsZW47Cit9CisKKyNpZiAhZGVmaW5lZChKVEFHX0FEUF9TVVBQT1JURUQpICYmICFkZWZpbmVkKE1TR19VVElMU19PTkxZKQorLyoKKyAqIFRoaXMgcm91dGluZSBhbGxvY2F0ZXMgYSBidWZmZXIsIHB1dHMgdGhlIGRhdGEgc3VwcGxpZWQgYXMKKyAqIHBhcmFtZXRlcnMgaW50byB0aGUgYnVmZmVyIGFuZCBzZW5kcyB0aGUgbWVzc2FnZS4gSXQgZG9lcyAqTk9UKgorICogd2FpdCBmb3IgYSByZXBseS4KKyAqLworZXh0ZXJuIGludCBtc2dzZW5kKENoYW5uZWxJRCBjaGFuLCBjb25zdCBjaGFyICpmb3JtYXQsLi4uKQoreworICAgIHVuc2lnbmVkIGludCBsZW5ndGg7CisgICAgcF9CdWZmZXIgYnVmZmVyOworICAgIHZhX2xpc3QgYXJnczsKKyMgaWZuZGVmIFRBUkdFVAorICAgIFBhY2tldCAqcGFja2V0OworCisgICAgcGFja2V0ID0gRGV2U1dfQWxsb2NhdGVQYWNrZXQoQXJtc2RfQnVmZmVyU2l6ZSk7CisgICAgYnVmZmVyID0gcGFja2V0LT5wa19idWZmZXI7CisjIGVsc2UKKyAgICBidWZmZXIgPSBhbmdlbF9DaGFubmVsQWxsb2NCdWZmZXIoQW5nZWxfQ2hhbkJ1ZmZTaXplKTsKKyMgZW5kaWYKKworICAgIGlmIChidWZmZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisKKyAgICAgICAgbGVuZ3RoID0gdm1zZ2J1aWxkKEJVRkZFUkRBVEEoYnVmZmVyKSwgZm9ybWF0LCBhcmdzKTsKKworIyBpZmRlZiBUQVJHRVQKKyAgICAgICAgYW5nZWxfQ2hhbm5lbFNlbmQoQ0hfREVGQVVMVF9ERVYsIGNoYW4sIGJ1ZmZlciwgbGVuZ3RoKTsKKyMgZWxzZQorICAgICAgICBwYWNrZXQtPnBrX2xlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgQWRwX0NoYW5uZWxXcml0ZShjaGFuLCBwYWNrZXQpOworIyBlbmRpZgorCisgICAgICAgIHZhX2VuZChhcmdzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC0xOworfQorCisjZW5kaWYgLyogbmRlZiBKVEFHX0FEUF9TVVBQT1JURUQgJiYgbmRlZiBNU0dfVVRJTFNfT05MWSAqLworCisvKgorICogdW5wYWNrX21lc3NhZ2UKKyAqIC0tLS0tLS0tLS0tLS0tCisgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgdW5wYWNrX21lc3NhZ2UodW5zaWduZWQgY2hhciAqYnVmZmVyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdW5zaWduZWQgaW50IGJsZW4gPSAwOworICAgIGludCBjaDsKKyAgICBjaGFyICpjaHAgPSBOVUxMOworCisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKworICAgIC8qIFN0ZXAgdGhyb3VnaCB0aGUgZm9ybWF0IHN0cmluZy4gKi8KKyAgICB3aGlsZSAoKGNoID0gKmZvcm1hdCsrKSAhPSAnXDAnKQorICAgIHsKKyAgICAgICAgaWYgKGNoICE9ICclJykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGNoID0gKHVuc2lnbmVkIGNoYXIpKmJ1ZmZlcisrOworCisgICAgICAgICAgICBibGVuKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGNoID0gKmZvcm1hdCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjYXNlICd3JzoKKyAgICAgICAgICAgICAgY2FzZSAnVyc6CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIDMyYml0IHdvcmQuICovCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm5hcCA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBpbnQqKTsKKworICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICpuYXAgPSBQUkVBRDMyKExFLCBidWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBzaXplb2YodW5zaWduZWQgaW50KTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgYmxlbiArPSBzaXplb2YodW5zaWduZWQgaW50KTsKKworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgY2FzZSAnSCc6CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIDE2Yml0IHZhbHVlLiAqLworICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpuYXAgPSB2YV9hcmcoYXJncywgdW5zaWduZWQgaW50Kik7CisKKyAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAqbmFwID0gUFJFQUQxNihMRSxidWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBzaXplb2YodW5zaWduZWQgc2hvcnQpOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBibGVuICs9IHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgICAgICAgICAvKiA4LWJpdCBjaGFyYWN0ZXIsIG9yIDgtYml0IGJ5dGUgKi8KKyAgICAgICAgICAgICAgICAgIGNocCA9IHZhX2FyZyhhcmdzLCBjaGFyKik7CisKKyAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgKiBYWFgKKyAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgKiBmYWxsIHRocm91Z2ggdG8gdGhlIG5vcm1hbCBjaGFyYWN0ZXIgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgLyogbm9ybWFsICclJyBjaGFyYWN0ZXIsIG9yIGEgZGlmZmVyZW50IG5vcm1hbCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAqY2hwID0gKHVuc2lnbmVkIGNoYXIpKmJ1ZmZlcisrOworCisgICAgICAgICAgICAgICAgICBibGVuKys7CisKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdmFfZW5kKGFyZ3MpOworICAgIHJldHVybihibGVuKTsKK30KKworCisvKiBFT0YgbXNnYnVpbGQuYyAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9tc2didWlsZC5oIGIvZ2RiL3JkaS1zaGFyZS9tc2didWlsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMjQzNmMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL21zZ2J1aWxkLmgKQEAgLTAsMCArMSw3NSBAQAorLyogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgdXNlZCwgY29waWVkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzIHByZXNlcnZlZCBpbiBhbGwgY29waWVzIG9mIHRoZQorICogc29mdHdhcmUuCisgKi8KKworLyogLSotQy0qLQorICoKKyAqICRSZXZpc2lvbiQKKyAqICAgICAkRGF0ZSQKKyAqCisgKgorICogbXNnYnVpbGQuaCAtIHV0aWxpdGllcyBmb3IgYXNzZW1ibGluZyBhbmQgaW50ZXJwcmV0aW5nIEFEUCBtZXNzYWdlcworICovCisKKyNpZm5kZWYgYW5nZWxfbXNnYnVpbGRfaAorI2RlZmluZSBhbmdlbF9tc2didWlsZF9oCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAiY2hhbm5lbHMuaCIKKworLyoKKyAqIG1zZ2J1aWxkCisgKiAtLS0tLS0tLQorICogV2UgdXNlIGEgInZhcmFyZ3MiIGZ1bmN0aW9uIHRvIGVuYWJsZSBhIGRlc2NyaXB0aW9uIG9mIGhvdyB0aGUKKyAqIGZpbmFsIG1lc3NhZ2Ugc2hvdWxkIGxvb2sgdG8gYmUgcHJvdmlkZWQuIFdlIHVzZSBhIGZ1bmN0aW9uIHJhdGhlcgorICogdGhhbiBpbi1saW5lIG1hY3JvcyB0byBrZWVwIHRoZSBzaXplIG9mIEFuZ2VsIHNtYWxsLgorICoKKyAqIFRoZSAiYnVmZmVyIiBwb2ludGVyIGlzIHRoZSBzdGFydGluZyBwb2ludCBmcm9tIHdoZXJlIHRoZSBkYXRhIHdpbGwKKyAqIGJlIHdyaXR0ZW4uIE5vdGU6IElmIGEgTlVMTCBwb2ludGVyIGlzIHBhc3NlZCB0aGVuIG5vIGRhdGEgd2lsbCBiZQorICogd3JpdHRlbiwgYnV0IHRoZSBzaXplIGluZm9ybWF0aW9uIHdpbGwgYmUgcmV0dXJuZWQuIFRoaXMgYWxsb3dzCisgKiBjb2RlIHRvIGNhbGwgdGhpcyByb3V0aW5lIHdpdGggYSBOVUxMICJidWZmZXIiIHBvaW50ZXIgdG8gYXNjZXJ0YWluCisgKiB3aGV0aGVyIHRoZSBwb2ludGVyIHRoZXkgYXJlIHBhc3NpbmcgY29udGFpbnMgZW5vdWdoIHNwYWNlIGZvciB0aGUKKyAqIG1lc3NhZ2UgYmVpbmcgY29uc3RydWN0ZWQuCisgKgorICogVGhlICJmb3JtYXQiIHN0cmluZyBzaG91bGQgY29udGFpbiBzZXF1ZW5jZXMgb2YgdGhlIGZvbGxvd2luZworICogdG9rZW5zOgorICogICAgICAldyAtIGluc2VydCAzMmJpdCB3b3JkIHZhbHVlCisgKiAgICAgICVwIC0gaW5zZXJ0IDMyYml0IHRhcmdldCBwb2ludGVyIHZhbHVlCisgKiAgICAgICVoIC0gaW5zZXJ0IDE2Yml0IHZhbHVlCisgKiAgICAgICViIC0gaW5zZXJ0IDhiaXQgYnl0ZSB2YWx1ZQorICoKKyAqIFRoZSByZXR1cm4gcGFyYW1ldGVyIGlzIHRoZSBmaW5hbCBieXRlIGxlbmd0aCBvZiB0aGUgZGF0YSB3cml0dGVuLgorICovCit1bnNpZ25lZCBpbnQgbXNnYnVpbGQodW5zaWduZWQgY2hhciAqYnVmZmVyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7Cit1bnNpZ25lZCBpbnQgdm1zZ2J1aWxkKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBtc2dzZW5kCisgKiAtLS0tLS0tCisgKiBBcyBmb3IgbXNnYnVpbGQgZXhjZXB0IHRoYXQgaXQgYWxsb2NhdGVzIGEgYnVmZmVyLCBmb3JtYXRzIHRoZSBkYXRhIGFzCisgKiBmb3IgbXNnYnVpbGQgYW5kIHRyYW5zbWl0cyB0aGUgcGFja2V0LiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCBub24gMCBpZiBvdAorICogZmFpbHMuCisgKiBOb3QgZm9yIHVzZSBvbiBjb29rZWQgY2hhbm5lbHMgZS5nLiBkZWJ1ZyBjaGFubmVscyBvbmx5LgorICovCitleHRlcm4gaW50IG1zZ3NlbmQoQ2hhbm5lbElEIGNoYW4sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVW5wYWNrX21lc3NhZ2UKKyAqIC0tLS0tLS0tLS0tLS0tCisgKiAgICBUaGlzIGJhc2ljYWxseSBkb2VzIHRoZSBvcHBvc2l0ZSBvZiBtc2dfYnVpbGQsIGl0IHRha2VzIGEgbWVzc2FnZSwgYW5kCisgKiBhIHNjYW5mIHR5cGUgZm9ybWF0IHN0cmluZyAoYnV0IG11Y2ggY3V0IGRvd24gZnVuY3Rpb25hbGl0eSkgYW5kIHJldHVybnMKKyAqIHRoZSBhcmd1bWVudHMgaW4gdGhlIG1lc3NhZ2UuCisgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgdW5wYWNrX21lc3NhZ2UodW5zaWduZWQgY2hhciAqYnVmZmVyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CisKKyNlbmRpZiAvKiBuZGVmIGFuZ2VsX21zZ2J1aWxkX2ggKi8KKworLyogRU9GIG1zZ2J1aWxkLmggKi8KZGlmZiAtLWdpdCBhL2dkYi9yZGktc2hhcmUvcGFyYW1zLmMgYi9nZGIvcmRpLXNoYXJlL3BhcmFtcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzgxODgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL3BhcmFtcy5jCkBAIC0wLDAgKzEsMzI1IEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMTk5NSBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGZyZWVseSB1c2VkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaXMgcHJlc2VydmVkIGluIGFsbCBjb3BpZXMgb2YgdGhlCisgKiBzb2Z0d2FyZS4KKyAqLworCisvKiAtKi1DLSotCisgKgorICogJFJldmlzaW9uJAorICogICAgICREYXRlJAorICoKKyAqCisgKiAgIFByb2plY3Q6IEFOR0VMCisgKgorICogICAgIFRpdGxlOiBQYXJhbWV0ZXIgbmVnb3RpYXRpb24gdXRpbGl0eSBmdW5jdGlvbnMKKyAqLworCisjaW5jbHVkZSAicGFyYW1zLmgiCisKKyNpbmNsdWRlICJlbmRpYW4uaCIKKyNpbmNsdWRlICJsb2dnaW5nLmgiCisKKworLyoKKyAqIEZ1bmN0aW9uOiBBbmdlbF9GaW5kUGFyYW0KKyAqICBQdXJwb3NlOiBmaW5kIHRoZSB2YWx1ZSBvZiBhIGdpdmVuIHBhcmFtZXRlciBmcm9tIGEgY29uZmlnLgorICoKKyAqIHNlZSBwYXJhbXMuaCBmb3IgZGV0YWlscworICovCitib29sIEFuZ2VsX0ZpbmRQYXJhbSggQURQX1BhcmFtZXRlciAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmFtZXRlckNvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAqdmFsdWUgKQoreworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgZm9yICggaSA9IDA7IGkgPCBjb25maWctPm51bV9wYXJhbWV0ZXJzOyArK2kgKQorICAgICAgIGlmICggY29uZmlnLT5wYXJhbVtpXS50eXBlID09IHR5cGUgKQorICAgICAgIHsKKyAgICAgICAgICAgKnZhbHVlID0gY29uZmlnLT5wYXJhbVtpXS52YWx1ZTsKKyAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKyNpZiAhZGVmaW5lZChUQVJHRVQpIHx8ICFkZWZpbmVkKE1JTklNQUxfQU5HRUwpIHx8IE1JTklNQUxfQU5HRUwgPT0gMAorCitQYXJhbWV0ZXJMaXN0ICpBbmdlbF9GaW5kUGFyYW1MaXN0KCBjb25zdCBQYXJhbWV0ZXJPcHRpb25zICpvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURQX1BhcmFtZXRlciAgICAgICAgICAgdHlwZSApCit7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBmb3IgKCBpID0gMDsgaSA8IG9wdGlvbnMtPm51bV9wYXJhbV9saXN0czsgKytpICkKKyAgICAgICBpZiAoIG9wdGlvbnMtPnBhcmFtX2xpc3RbaV0udHlwZSA9PSB0eXBlICkKKyAgICAgICAgICByZXR1cm4gJm9wdGlvbnMtPnBhcmFtX2xpc3RbaV07CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworCisjaWYgZGVmaW5lZChUQVJHRVQpIHx8IGRlZmluZWQoVEVTVF9QQVJBTVMpCisvKgorICogRnVuY3Rpb246IEFuZ2VsX01hdGNoUGFyYW1zCisgKiAgUHVycG9zZTogZmluZCBhIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgcmVxdWVzdGVkIG9wdGlvbnMgd2hpY2ggaXMKKyAqICAgICAgICAgICB0aGUgYmVzdCBtYXRjaCBmcm9tIHRoZSBzdXBwb3J0ZWQgb3B0aW9ucy4KKyAqCisgKiBzZWUgcGFyYW1zLmggZm9yIGRldGFpbHMKKyAqLworY29uc3QgUGFyYW1ldGVyQ29uZmlnICpBbmdlbF9NYXRjaFBhcmFtcyggY29uc3QgUGFyYW1ldGVyT3B0aW9ucyAqcmVxdWVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyYW1ldGVyT3B0aW9ucyAqc3VwcG9ydGVkICkKK3sKKyAgICBzdGF0aWMgUGFyYW1ldGVyICAgICAgICBjaG9zZW5fcGFyYW1zW0FQX05VTV9QQVJBTVNdOworICAgIHN0YXRpYyBQYXJhbWV0ZXJDb25maWcgIGNob3Nlbl9jb25maWcgPSB7CisgICAgICAgIEFQX05VTV9QQVJBTVMsCisgICAgICAgIGNob3Nlbl9wYXJhbXMKKyAgICB9OworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgQVNTRVJUKCByZXF1ZXN0ZWQgIT0gTlVMTCwgInJlcXVlc3RlZCBpcyBOVUxMIiApOworICAgIEFTU0VSVCggcmVxdWVzdGVkICE9IE5VTEwsICJyZXF1ZXN0ZWQgaXMgTlVMTCIgKTsKKyAgICBBU1NFUlQoIHN1cHBvcnRlZC0+bnVtX3BhcmFtX2xpc3RzIDw9IEFQX05VTV9QQVJBTVMsICJzdXBwX251bSB0b28gYmlnIiApOworCisgICAgaWYgKCByZXF1ZXN0ZWQtPm51bV9wYXJhbV9saXN0cyA+IHN1cHBvcnRlZC0+bnVtX3BhcmFtX2xpc3RzICkKKyAgICB7CisgICAgICAgIFdBUk4oICJyZXFfbnVtIGV4Y2VlZHMgc3VwcF9udW0iICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoIGkgPSAwOyBpIDwgcmVxdWVzdGVkLT5udW1fcGFyYW1fbGlzdHM7ICsraSApCisgICAgeworICAgICAgICBib29sICAgICAgICAgICBtYXRjaDsKKyAgICAgICAgdW5zaWduZWQgaW50ICAgajsKKworICAgICAgICBjb25zdCBQYXJhbWV0ZXJMaXN0ICpyZXFfbGlzdCA9ICZyZXF1ZXN0ZWQtPnBhcmFtX2xpc3RbaV07CisgICAgICAgIEFEUF9QYXJhbWV0ZXIgICAgICAgIHJlcV90eXBlID0gcmVxX2xpc3QtPnR5cGU7CisgICAgICAgIGNvbnN0IFBhcmFtZXRlckxpc3QgKnN1cF9saXN0ID0gQW5nZWxfRmluZFBhcmFtTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLCByZXFfdHlwZSApOworCisgICAgICAgIGlmICggc3VwX2xpc3QgPT0gTlVMTCApCisgICAgICAgIHsKKyNpZmRlZiBBU1NFUlRJT05TX0VOQUJMRUQKKyAgICAgICAgICAgIF9fcnRfd2FybmluZyggIm9wdGlvbiAleCBub3Qgc3VwcG9ydGVkXG4iLCByZXFfdHlwZSApOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoIGogPSAwLCBtYXRjaCA9IEZBTFNFOworICAgICAgICAgICAgICAoaiA8IHJlcV9saXN0LT5udW1fb3B0aW9ucykgJiYgIW1hdGNoOworICAgICAgICAgICAgICArK2oKKyAgICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IGs7CisKKyAgICAgICAgICAgIGZvciAoIGsgPSAwOworICAgICAgICAgICAgICAgICAgKGsgPCBzdXBfbGlzdC0+bnVtX29wdGlvbnMpICYmICFtYXRjaDsKKyAgICAgICAgICAgICAgICAgICsraworICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHJlcV9saXN0LT5vcHRpb25bal0gPT0gc3VwX2xpc3QtPm9wdGlvbltrXSApCisgICAgICAgICAgICAgICAgeworI2lmZGVmIERFQlVHCisgICAgICAgICAgICAgICAgICAgIF9fcnRfaW5mbyggImNob3NlIHZhbHVlICVkIGZvciBvcHRpb24gJXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX2xpc3QtPm9wdGlvbltqXSwgcmVxX3R5cGUgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9jb25maWcucGFyYW1baV0udHlwZSA9IHJlcV90eXBlOworICAgICAgICAgICAgICAgICAgICBjaG9zZW5fY29uZmlnLnBhcmFtW2ldLnZhbHVlID0gcmVxX2xpc3QtPm9wdGlvbltqXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoICFtYXRjaCApCisgICAgICAgIHsKKyNpZmRlZiBBU1NFUlRJT05TX0VOQUJMRUQKKyAgICAgICAgICAgIF9fcnRfd2FybmluZyggIm5vIG1hdGNoIGZvdW5kIGZvciBvcHRpb24gJXhcbiIsIHJlcV90eXBlICk7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgY2hvc2VuX2NvbmZpZy5udW1fcGFyYW1ldGVycyA9IGk7CisgICAgSU5GTyggIm1hdGNoIHN1Y2NlZWRlZCIgKTsKKyAgICByZXR1cm4gJmNob3Nlbl9jb25maWc7Cit9CisjZW5kaWYgLyogZGVmaW5lZChUQVJHRVQpIHx8IGRlZmluZWQoVEVTVF9QQVJBTVMpICovCisKKworI2lmICFkZWZpbmVkKFRBUkdFVCkgfHwgZGVmaW5lZChURVNUX1BBUkFNUykKKy8qCisgKiBGdW5jdGlvbjogQW5nZWxfU3RvcmVQYXJhbQorICogIFB1cnBvc2U6IHN0b3JlIHRoZSB2YWx1ZSBvZiBhIGdpdmVuIHBhcmFtZXRlciB0byBhIGNvbmZpZy4KKyAqCisgKiBzZWUgcGFyYW1zLmggZm9yIGRldGFpbHMKKyAqLworYm9vbCBBbmdlbF9TdG9yZVBhcmFtKCBQYXJhbWV0ZXJDb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgQURQX1BhcmFtZXRlciAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHZhbHVlICkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIGZvciAoIGkgPSAwOyBpIDwgY29uZmlnLT5udW1fcGFyYW1ldGVyczsgKytpICkKKyAgICAgICBpZiAoIGNvbmZpZy0+cGFyYW1baV0udHlwZSA9PSB0eXBlICkKKyAgICAgICB7CisgICAgICAgICAgIGNvbmZpZy0+cGFyYW1baV0udmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorI2VuZGlmIC8qICFkZWZpbmVkKFRBUkdFVCkgfHwgZGVmaW5lZChURVNUX1BBUkFNUykgKi8KKworCisjaWYgZGVmaW5lZChUQVJHRVQpIHx8IGRlZmluZWQoTElOS19SRUNPVkVSWSkgfHwgZGVmaW5lZChURVNUX1BBUkFNUykKKy8qCisgKiBGdW5jdGlvbjogQW5nZWxfQnVpbGRQYXJhbUNvbmZpZ01lc3NhZ2UKKyAqICBQdXJwb3NlOiB3cml0ZSBhIHBhcmFtZXRlciBjb25maWcgdG8gYSBidWZmZXIgaW4gQURQIGZvcm1hdC4KKyAqCisgKiBzZWUgcGFyYW1zLmggZm9yIGRldGFpbHMKKyAqLwordW5zaWduZWQgaW50IEFuZ2VsX0J1aWxkUGFyYW1Db25maWdNZXNzYWdlKCB1bnNpZ25lZCBjaGFyICAgICAgICAgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyYW1ldGVyQ29uZmlnICpjb25maWcgKQoreworICAgIHVuc2lnbmVkIGNoYXIgKnN0YXJ0ID0gYnVmZmVyOworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgUFVUMzJMRSggYnVmZmVyLCBjb25maWctPm51bV9wYXJhbWV0ZXJzICk7CisgICAgYnVmZmVyICs9IHNpemVvZiggd29yZCApOworCisgICAgZm9yICggaSA9IDA7IGkgPCBjb25maWctPm51bV9wYXJhbWV0ZXJzOyArK2kgKQorICAgIHsKKyAgICAgICAgUFVUMzJMRSggYnVmZmVyLCBjb25maWctPnBhcmFtW2ldLnR5cGUgKTsKKyAgICAgICAgYnVmZmVyICs9IHNpemVvZiggd29yZCApOworICAgICAgICBQVVQzMkxFKCBidWZmZXIsIGNvbmZpZy0+cGFyYW1baV0udmFsdWUgKTsKKyAgICAgICAgYnVmZmVyICs9IHNpemVvZiggd29yZCApOworICAgIH0KKworICAgIHJldHVybiAoYnVmZmVyIC0gc3RhcnQpOworfQorI2VuZGlmIC8qIGRlZmluZWQoVEFSR0VUKSB8fCBkZWZpbmVkKExJTktfUkVDT1ZFUlkpIHx8IGRlZmluZWQoVEVTVF9QQVJBTVMpICovCisKKworI2lmICFkZWZpbmVkKFRBUkdFVCkgfHwgZGVmaW5lZChURVNUX1BBUkFNUykKKy8qCisgKiBGdW5jdGlvbjogQW5nZWxfQnVpbGRQYXJhbU9wdGlvbnNNZXNzYWdlCisgKiAgUHVycG9zZTogd3JpdGUgYSBwYXJhbWV0ZXIgT3B0aW9ucyB0byBhIGJ1ZmZlciBpbiBBRFAgZm9ybWF0LgorICoKKyAqIHNlZSBwYXJhbXMuaCBmb3IgZGV0YWlscworICovCit1bnNpZ25lZCBpbnQgQW5nZWxfQnVpbGRQYXJhbU9wdGlvbnNNZXNzYWdlKCB1bnNpZ25lZCBjaGFyICAgICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJhbWV0ZXJPcHRpb25zICpvcHRpb25zICkKK3sKKyAgICB1bnNpZ25lZCBjaGFyICpzdGFydCA9IGJ1ZmZlcjsKKyAgICB1bnNpZ25lZCBpbnQgaSwgajsKKworICAgIFBVVDMyTEUoIGJ1ZmZlciwgb3B0aW9ucy0+bnVtX3BhcmFtX2xpc3RzICk7CisgICAgYnVmZmVyICs9IHNpemVvZiggd29yZCApOworCisgICAgZm9yICggaSA9IDA7IGkgPCBvcHRpb25zLT5udW1fcGFyYW1fbGlzdHM7ICsraSApCisgICAgeworICAgICAgICBQVVQzMkxFKCBidWZmZXIsIG9wdGlvbnMtPnBhcmFtX2xpc3RbaV0udHlwZSApOworICAgICAgICBidWZmZXIgKz0gc2l6ZW9mKCB3b3JkICk7CisgICAgICAgIFBVVDMyTEUoIGJ1ZmZlciwgb3B0aW9ucy0+cGFyYW1fbGlzdFtpXS5udW1fb3B0aW9ucyApOworICAgICAgICBidWZmZXIgKz0gc2l6ZW9mKCB3b3JkICk7CisgICAgICAgIGZvciAoIGogPSAwOyBqIDwgb3B0aW9ucy0+cGFyYW1fbGlzdFtpXS5udW1fb3B0aW9uczsgKytqICkKKyAgICAgICAgeworICAgICAgICAgICAgUFVUMzJMRSggYnVmZmVyLCBvcHRpb25zLT5wYXJhbV9saXN0W2ldLm9wdGlvbltqXSApOworICAgICAgICAgICAgYnVmZmVyICs9IHNpemVvZiggd29yZCApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChidWZmZXIgLSBzdGFydCk7Cit9CisjZW5kaWYgLyogIWRlZmluZWQoVEFSR0VUKSB8fCBkZWZpbmVkKFRFU1RfUEFSQU1TKSAqLworCisKKyNpZiAhZGVmaW5lZChUQVJHRVQpIHx8IGRlZmluZWQoTElOS19SRUNPVkVSWSkgfHwgZGVmaW5lZChURVNUX1BBUkFNUykKKy8qCisgKiBGdW5jdGlvbjogQW5nZWxfUmVhZFBhcmFtQ29uZmlnTWVzc2FnZQorICogIFB1cnBvc2U6IHJlYWQgYSBwYXJhbWV0ZXIgY29uZmlnIGZyb20gYSBidWZmZXIgd2hlcmUgaXQgaXMgaW4gQURQIGZvcm1hdC4KKyAqCisgKiBzZWUgcGFyYW1zLmggZm9yIGRldGFpbHMKKyAqLworYm9vbCBBbmdlbF9SZWFkUGFyYW1Db25maWdNZXNzYWdlKCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlckNvbmZpZyAgICAgKmNvbmZpZyApCit7CisgICAgdW5zaWduZWQgaW50IHdvcmQ7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICB3b3JkID0gR0VUMzJMRSggYnVmZmVyICk7CisgICAgYnVmZmVyICs9IHNpemVvZiggd29yZCApOworICAgIGlmICggd29yZCA+IGNvbmZpZy0+bnVtX3BhcmFtZXRlcnMgKQorICAgIHsKKyAgICAgICAgV0FSTiggIm5vdCBlbm91Z2ggc3BhY2UiICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgY29uZmlnLT5udW1fcGFyYW1ldGVycyA9IHdvcmQ7CisKKyAgICBmb3IgKCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3BhcmFtZXRlcnM7ICsraSApCisgICAgeworICAgICAgICBjb25maWctPnBhcmFtW2ldLnR5cGUgPSAoQURQX1BhcmFtZXRlcilHRVQzMkxFKCBidWZmZXIgKTsKKyAgICAgICAgYnVmZmVyICs9IHNpemVvZiggd29yZCApOworICAgICAgICBjb25maWctPnBhcmFtW2ldLnZhbHVlID0gR0VUMzJMRSggYnVmZmVyICk7CisgICAgICAgIGJ1ZmZlciArPSBzaXplb2YoIHdvcmQgKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvKiAhZGVmaW5lZChUQVJHRVQpIHx8IGRlZmluZWQoTElOS19SRUNPVkVSWSkgfHwgZGVmaW5lZChURVNUX1BBUkFNUykgKi8KKworCisjaWYgZGVmaW5lZChUQVJHRVQpIHx8IGRlZmluZWQoVEVTVF9QQVJBTVMpCisvKgorICogRnVuY3Rpb246IEFuZ2VsX1JlYWRQYXJhbU9wdGlvbnNNZXNzYWdlCisgKiAgUHVycG9zZTogcmVhZCBhIHBhcmFtZXRlciBvcHRpb25zIGJsb2NrIGZyb20gYSBidWZmZXIKKyAqICAgICAgICAgICAgIHdoZXJlIGl0IGlzIGluIEFEUCBmb3JtYXQuCisgKgorICogc2VlIHBhcmFtcy5oIGZvciBkZXRhaWxzCisgKi8KK2Jvb2wgQW5nZWxfUmVhZFBhcmFtT3B0aW9uc01lc3NhZ2UoIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck9wdGlvbnMgICAgKm9wdGlvbnMgKQoreworICAgIHVuc2lnbmVkIGludCB3b3JkOworICAgIHVuc2lnbmVkIGludCBpLCBqOworCisgICAgd29yZCA9IEdFVDMyTEUoIGJ1ZmZlciApOworICAgIGJ1ZmZlciArPSBzaXplb2YoIHdvcmQgKTsKKyAgICBpZiAoIHdvcmQgPiBvcHRpb25zLT5udW1fcGFyYW1fbGlzdHMgKQorICAgIHsKKyAgICAgICAgV0FSTiggIm5vdCBlbm91Z2ggc3BhY2UiICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgb3B0aW9ucy0+bnVtX3BhcmFtX2xpc3RzID0gd29yZDsKKworICAgIGZvciAoIGkgPSAwOyBpIDwgb3B0aW9ucy0+bnVtX3BhcmFtX2xpc3RzOyArK2kgKQorICAgIHsKKyAgICAgICAgUGFyYW1ldGVyTGlzdCAqbGlzdCA9ICZvcHRpb25zLT5wYXJhbV9saXN0W2ldOworCisgICAgICAgIGxpc3QtPnR5cGUgPSAoQURQX1BhcmFtZXRlcilHRVQzMkxFKCBidWZmZXIgKTsKKyAgICAgICAgYnVmZmVyICs9IHNpemVvZiggd29yZCApOworICAgICAgICB3b3JkID0gR0VUMzJMRSggYnVmZmVyICk7CisgICAgICAgIGJ1ZmZlciArPSBzaXplb2YoIHdvcmQgKTsKKyAgICAgICAgaWYgKCB3b3JkID4gbGlzdC0+bnVtX29wdGlvbnMgKQorICAgICAgICB7CisgICAgICAgICAgICBXQVJOKCAibm90IGVub3VnaCBsaXN0IHNwYWNlIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGxpc3QtPm51bV9vcHRpb25zID0gd29yZDsKKworICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGxpc3QtPm51bV9vcHRpb25zOyArK2ogKQorICAgICAgICB7CisgICAgICAgICAgICBsaXN0LT5vcHRpb25bal0gPSBHRVQzMkxFKCBidWZmZXIgKTsKKyAgICAgICAgICAgIGJ1ZmZlciArPSBzaXplb2YoIHdvcmQgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8qIGRlZmluZWQoVEFSR0VUKSB8fCBkZWZpbmVkKFRFU1RfUEFSQU1TKSAqLworCisjZW5kaWYgLyogIWRlZmluZShUQVJHRVQpIHx8ICFkZWZpbmVkKE1JTklNQUxfQU5HRUwpIHx8IE1JTklNQUxfQU5HRUwgPT0gMCAqLworCisvKiBFT0YgcGFyYW1zLmMgKi8KZGlmZiAtLWdpdCBhL2dkYi9yZGktc2hhcmUvcGFyYW1zLmggYi9nZGIvcmRpLXNoYXJlL3BhcmFtcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMDc1N2IKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL3BhcmFtcy5oCkBAIC0wLDAgKzEsMTgxIEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMTk5NSBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGZyZWVseSB1c2VkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaXMgcHJlc2VydmVkIGluIGFsbCBjb3BpZXMgb2YgdGhlCisgKiBzb2Z0d2FyZS4KKyAqLworCisvKiAtKi1DLSotCisgKgorICogJFJldmlzaW9uJAorICogICAgICREYXRlJAorICoKKyAqCisgKiAgIFByb2plY3Q6IEFOR0VMCisgKgorICogICAgIFRpdGxlOiBQYXJhbWV0ZXIgbmVnb3RpYXRpb24gc3RydWN0dXJlcyBhbmQgdXRpbGl0aWVzCisgKi8KKworI2lmbmRlZiBhbmdlbF9wYXJhbXNfaAorI2RlZmluZSBhbmdlbF9wYXJhbXNfaAorCisjaW5jbHVkZSAiYW5nZWwuaCIKKyNpbmNsdWRlICJhZHAuaCIKKworI2lmbmRlZiBUQVJHRVQKKyMgaW5jbHVkZSAiaG9zdC5oIgorI2VuZGlmCisKKy8qIEEgc2luZ2xlIHBhcmFtZXRlciwgd2l0aCB0YWcgKi8KK3R5cGVkZWYgc3RydWN0IFBhcmFtZXRlciB7CisgICAgICBBRFBfUGFyYW1ldGVyICAgICB0eXBlOworICAgICAgdW5zaWduZWQgaW50ICAgICAgdmFsdWU7Cit9IFBhcmFtZXRlcjsKKworLyogQSBsaXN0IG9mIHBhcmFtZXRlciB2YWx1ZXMsIHdpdGggdGFnICovCit0eXBlZGVmIHN0cnVjdCBQYXJhbWV0ZXJMaXN0IHsKKyAgICAgIEFEUF9QYXJhbWV0ZXIgICAgIHR5cGU7CisgICAgICB1bnNpZ25lZCBpbnQgICAgICBudW1fb3B0aW9uczsKKyAgICAgIHVuc2lnbmVkIGludCAgICAgKm9wdGlvbjsgLyogcG9pbnRzIHRvIGFycmF5IG9mIHZhbHVlcyAqLworfSBQYXJhbWV0ZXJMaXN0OworCisvKiBBIGNvbmZpZ3VyYXRpb24gb2Ygb25lIG9yIG1vcmUgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgUGFyYW1ldGVyQ29uZmlnIHsKKyAgICAgIHVuc2lnbmVkIGludCAgICAgIG51bV9wYXJhbWV0ZXJzOworICAgICAgUGFyYW1ldGVyICAgICAgICAqcGFyYW07ICAvKiBwb2ludGVyIHRvIGFycmF5IG9mIFBhcmFtZXRlcnMgKi8KK30gUGFyYW1ldGVyQ29uZmlnOworCisvKiBBIHNldCBvZiBwYXJhbWV0ZXIgb3B0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QgUGFyYW1ldGVyT3B0aW9ucyB7CisgICAgICB1bnNpZ25lZCBpbnQgICAgICBudW1fcGFyYW1fbGlzdHM7CisgICAgICBQYXJhbWV0ZXJMaXN0ICAgICpwYXJhbV9saXN0OyAvKiBwb2ludGVyIHRvIGFycmF5IG9mIFBhcmFtTGlzdHMgKi8KK30gUGFyYW1ldGVyT3B0aW9uczsKKworLyoKKyAqIEZ1bmN0aW9uOiBBbmdlbF9NYXRjaFBhcmFtcworICogIFB1cnBvc2U6IGZpbmQgYSBjb25maWd1cmF0aW9uIGZyb20gdGhlIHJlcXVlc3RlZCBvcHRpb25zIHdoaWNoIGlzCisgKiAgICAgICAgICAgdGhlIGJlc3QgbWF0Y2ggZnJvbSB0aGUgc3VwcG9ydGVkIG9wdGlvbnMuCisgKgorICogICBQYXJhbXM6CisgKiAgICAgICAgICAgICAgSW5wdXQ6IHJlcXVlc3RlZCAgICAgIFRoZSBvZmZlcmVkIHNldCBvZiBwYXJhbWV0ZXJzLgorICogICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgICAgICBUaGUgc3VwcG9ydGVkIHNldCBvZiBwYXJhbWV0ZXJzLgorICoKKyAqICAgICAgICAgICAgUmV0dXJuczogcHRyIHRvIGNvbmZpZyAgQSBtYXRjaCBoYXMgYmVlbiBtYWRlLCBwdHIgdG8gcmVzdWx0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCByZW1haW4gdmFsaWQgdW50aWwgbmV4dCBjYWxsIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgTlVMTCAgICAgICAgICAgTWF0Y2ggbm90IHBvc3NpYmxlCisgKi8KK2NvbnN0IFBhcmFtZXRlckNvbmZpZyAqQW5nZWxfTWF0Y2hQYXJhbXMoIGNvbnN0IFBhcmFtZXRlck9wdGlvbnMgKnJlcXVlc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmFtZXRlck9wdGlvbnMgKnN1cHBvcnRlZCApOworCisvKgorICogRnVuY3Rpb246IEFuZ2VsX0ZpbmRQYXJhbQorICogIFB1cnBvc2U6IGZpbmQgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gcGFyYW1ldGVyIGZyb20gYSBjb25maWcuCisgKgorICogICBQYXJhbXM6CisgKiAgICAgICAgICAgICAgSW5wdXQ6IHR5cGUgICAgIHBhcmFtZXRlciB0eXBlIHRvIGZpbmQKKyAqICAgICAgICAgICAgICAgICAgICAgY29uZmlnICAgY29uZmlnIHRvIHNlYXJjaAorICogICAgICAgICAgICAgT3V0cHV0OiB2YWx1ZSAgICBwYXJhbWV0ZXIgdmFsdWUgaWYgZm91bmQKKyAqCisgKiAgICAgICAgICAgIFJldHVybnM6IFRSVUUgICAgIHBhcmFtZXRlciBmb3VuZAorICogICAgICAgICAgICAgICAgICAgICBGQUxTRSAgICBwYXJhbWV0ZXIgbm90IGZvdW5kCisgKi8KK2Jvb2wgQW5nZWxfRmluZFBhcmFtKCBBRFBfUGFyYW1ldGVyICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyYW1ldGVyQ29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICp2YWx1ZSApOworCisvKgorICogRnVuY3Rpb246IEFuZ2VsX1N0b3JlUGFyYW0KKyAqICBQdXJwb3NlOiBzdG9yZSB0aGUgdmFsdWUgb2YgYSBnaXZlbiBwYXJhbWV0ZXIgaW4gYSBjb25maWcuCisgKgorICogICBQYXJhbXM6CisgKiAgICAgICAgICAgICBJbi9PdXQ6IGNvbmZpZyAgIGNvbmZpZyB0byBzdG9yZSBpbgorICogICAgICAgICAgICAgIElucHV0OiB0eXBlICAgICBwYXJhbWV0ZXIgdHlwZSB0byBzdG9yZQorICogICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgICBwYXJhbWV0ZXIgdmFsdWUgaWYgZm91bmQKKyAqCisgKiAgICAgICAgICAgIFJldHVybnM6IFRSVUUgICAgIHBhcmFtZXRlciBmb3VuZCBhbmQgbmV3IHZhbHVlIHN0b3JlZAorICogICAgICAgICAgICAgICAgICAgICBGQUxTRSAgICBwYXJhbWV0ZXIgbm90IGZvdW5kCisgKi8KK2Jvb2wgQW5nZWxfU3RvcmVQYXJhbSggUGFyYW1ldGVyQ29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgIEFEUF9QYXJhbWV0ZXIgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICB2YWx1ZSApOworCisvKgorICogRnVuY3Rpb246IEFuZ2VsX0ZpbmRQYXJhbUxpc3QKKyAqICBQdXJwb3NlOiBmaW5kIHRoZSBwYXJhbWV0ZXIgbGlzdCBvZiBhIGdpdmVuIHBhcmFtZXRlciBmcm9tIGFuIG9wdGlvbnMuCisgKgorICogICBQYXJhbXM6CisgKiAgICAgICAgICAgICAgSW5wdXQ6IHR5cGUgICAgIHBhcmFtZXRlciB0eXBlIHRvIGZpbmQKKyAqICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAgb3B0aW9ucyBibG9jayB0byBzZWFyY2gKKyAqCisgKiAgICAgICAgICAgIFJldHVybnM6IHBvaW50ZXIgdG8gbGlzdAorICogICAgICAgICAgICAgICAgICAgICBOVUxMICAgICBwYXJhbWV0ZXIgbm90IGZvdW5kCisgKi8KK1BhcmFtZXRlckxpc3QgKkFuZ2VsX0ZpbmRQYXJhbUxpc3QoIGNvbnN0IFBhcmFtZXRlck9wdGlvbnMgKm9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRFBfUGFyYW1ldGVyICAgICAgICAgICB0eXBlICk7CisKKy8qCisgKiBGdW5jdGlvbjogQW5nZWxfQnVpbGRQYXJhbUNvbmZpZ01lc3NhZ2UKKyAqICBQdXJwb3NlOiB3cml0ZSBhIHBhcmFtZXRlciBjb25maWcgdG8gYSBidWZmZXIgaW4gQURQIGZvcm1hdC4KKyAqCisgKiAgIFBhcmFtczoKKyAqICAgICAgICAgICAgICBJbnB1dDogYnVmZmVyICAgd2hlcmUgdG8gd3JpdGUgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgY29uZmlnICAgdGhlIHBhcmFtZXRlciBjb25maWcgdG8gd3JpdGUKKyAqCisgKiAgICAgICAgICAgIFJldHVybnM6IG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gdG8gYnVmZmVyCisgKi8KK3Vuc2lnbmVkIGludCBBbmdlbF9CdWlsZFBhcmFtQ29uZmlnTWVzc2FnZSggdW5zaWduZWQgY2hhciAgICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmFtZXRlckNvbmZpZyAqY29uZmlnICk7CisKKy8qCisgKiBGdW5jdGlvbjogQW5nZWxfQnVpbGRQYXJhbU9wdGlvbnNNZXNzYWdlCisgKiAgUHVycG9zZTogd3JpdGUgYSBwYXJhbWV0ZXIgT3B0aW9ucyB0byBhIGJ1ZmZlciBpbiBBRFAgZm9ybWF0LgorICoKKyAqICAgUGFyYW1zOgorICogICAgICAgICAgICAgIElucHV0OiBidWZmZXIgICB3aGVyZSB0byB3cml0ZSB0bworICogICAgICAgICAgICAgICAgICAgICBvcHRpb25zICB0aGUgb3B0aW9ucyBibG9jayB0byB3cml0ZQorICoKKyAqICAgICAgICAgICAgUmV0dXJuczogbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiB0byBidWZmZXIKKyAqLwordW5zaWduZWQgaW50IEFuZ2VsX0J1aWxkUGFyYW1PcHRpb25zTWVzc2FnZSggdW5zaWduZWQgY2hhciAgICAgICAgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyYW1ldGVyT3B0aW9ucyAqb3B0aW9ucyApOworCisvKgorICogRnVuY3Rpb246IEFuZ2VsX1JlYWRQYXJhbUNvbmZpZ01lc3NhZ2UKKyAqICBQdXJwb3NlOiByZWFkIGEgcGFyYW1ldGVyIGNvbmZpZyBmcm9tIGEgYnVmZmVyIHdoZXJlIGl0IGlzIGluIEFEUCBmb3JtYXQuCisgKgorICogICBQYXJhbXM6CisgKiAgICAgICAgICAgICAgSW5wdXQ6IGJ1ZmZlciAgIHdoZXJlIHRvIHJlYWQgZnJvbQorICogICAgICAgICAgICAgSW4vT3V0OiBjb25maWcgICB0aGUgcGFyYW1ldGVyIGNvbmZpZyB0byByZWFkIHRvLCB3aGljaCBtdXN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNldCB1cCBvbiBlbnRyeSB3aXRoIGEgdmFsaWQgYXJyYXksIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgaW4gbnVtX3BhcmFtZXRlcnMuCisgKgorICogICAgICAgICAgICBSZXR1cm5zOiBUUlVFICAgICBva2F5CisgKiAgICAgICAgICAgICAgICAgICAgIEZBTFNFICAgIG5vdCBlbm91Z2ggc3BhY2UgaW4gY29uZmlnCisgKi8KK2Jvb2wgQW5nZWxfUmVhZFBhcmFtQ29uZmlnTWVzc2FnZSggY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJDb25maWcgICAgICpjb25maWcgKTsKKworLyoKKyAqIEZ1bmN0aW9uOiBBbmdlbF9SZWFkUGFyYW1PcHRpb25zTWVzc2FnZQorICogIFB1cnBvc2U6IHJlYWQgYSBwYXJhbWV0ZXIgb3B0aW9ucyBmcm9tIGEgYnVmZmVyCisgKiAgICAgICAgICAgICB3aGVyZSBpdCBpcyBpbiBBRFAgZm9ybWF0LgorICoKKyAqICAgUGFyYW1zOgorICogICAgICAgICAgICAgIElucHV0OiBidWZmZXIgICB3aGVyZSB0byByZWFkIGZyb20KKyAqICAgICAgICAgICAgIEluL091dDogb3B0aW9ucyAgdGhlIHBhcmFtZXRlciBvcHRpb25zIGJsb2NrIHRvIHJlYWQgdG8sIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIG11c3QgYmUgc2V0IHVwIG9uIGVudHJ5IHdpdGggYSB2YWxpZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LCBhbmQgdGhlIHNpemUgb2YgdGhlIGFycmF5IGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BhcmFtZXRlcnMuICBFYWNoIHBhcmFtX2xpc3QgbXVzdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsc28gYmUgc2V0IHVwIGluIHRoZSBzYW1lIHdheS4KKyAqCisgKiAgICAgICAgICAgIFJldHVybnM6IFRSVUUgICAgIG9rYXkKKyAqICAgICAgICAgICAgICAgICAgICAgRkFMU0UgICAgbm90IGVub3VnaCBzcGFjZSBpbiBvcHRpb25zCisgKi8KK2Jvb2wgQW5nZWxfUmVhZFBhcmFtT3B0aW9uc01lc3NhZ2UoIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlck9wdGlvbnMgICAgKm9wdGlvbnMgKTsKKworI2VuZGlmIC8qIG5kZWYgYW5nZWxfcGFyYW1zX2ggKi8KKworLyogRU9GIHBhcmFtcy5oICovCmRpZmYgLS1naXQgYS9nZGIvcmRpLXNoYXJlL3J4LmMgYi9nZGIvcmRpLXNoYXJlL3J4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0MzRmMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZGktc2hhcmUvcnguYwpAQCAtMCwwICsxLDM2MSBAQAorLyogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgdXNlZCwgY29waWVkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzIHByZXNlcnZlZCBpbiBhbGwgY29waWVzIG9mIHRoZQorICogc29mdHdhcmUuCisgKi8KKworLyotKi1DLSotCisgKgorICogJFJldmlzaW9uJAorICogICAgICREYXRlJAorICoKKyAqCisgKiAgIFByb2plY3Q6IEFOR0VMCisgKgorICogICAgIFRpdGxlOiAgQ2hhcmFjdGVyIHJlY2VwdGlvbiBlbmdpbmUKKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+ICAgIC8qIEFOU0kgdmFyYXJncyBzdXBwb3J0ICovCisjaW5jbHVkZSAiYW5nZWwuaCIgICAgIC8qIEFuZ2VsIHN5c3RlbSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImVuZGlhbi5oIiAgICAvKiBFbmRpYW4gaW5kZXBlbmRhbnQgbWVtb3J5IGFjY2VzcyBtYWNyb3MgKi8KKyNpbmNsdWRlICJjcmMuaCIgICAgICAgLyogY3JjIGdlbmVyYXRpb24gZGVmaW5pdGlvbnMgYW5kIGhlYWRlcnMgKi8KKyNpbmNsdWRlICJyeHR4LmgiCisjaW5jbHVkZSAiY2hhbm5lbHMuaCIKKyNpbmNsdWRlICJidWZmZXJzLmgiCisjaWZkZWYgVEFSR0VUCisjICBpbmNsdWRlICJkZXZkcml2LmgiCisjZW5kaWYKKyNpbmNsdWRlICJsb2dnaW5nLmgiCisKK3N0YXRpYyByZV9zdGF0dXMgdW5leHBfc3R4KHN0cnVjdCByZV9zdGF0ZSAqcnhzdGF0ZSk7CitzdGF0aWMgcmVfc3RhdHVzIHVuZXhwX2V0eChzdHJ1Y3QgcmVfc3RhdGUgKnJ4c3RhdGUpOworCisvKiBiaXRmaWVsZCBmb3IgdGhlIHJ4X2VuZ2luZSBzdGF0ZSAqLwordHlwZWRlZiBlbnVtIHJ4X3N0YXRlX2ZsYWd7CisgIFJTVF9TVFgsCisgIFJTVF9UWVAsCisgIFJTVF9MRU4sCisgIFJTVF9EQVQsCisgIFJTVF9DUkMsCisgIFJTVF9FVFgsCisgIFJTVF9FU0MgPSAoMHgxIDw8IDB4MykKK30gcnhfc3RhdGVfZmxhZzsKKwordm9pZCBBbmdlbF9SeEVuZ2luZUluaXQoY29uc3Qgc3RydWN0IHJlX2NvbmZpZyAqcnhjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVfc3RhdGUgKnJ4c3RhdGUpCit7CisgIHJ4c3RhdGUtPnJ4X3N0YXRlID0gUlNUX1NUWDsKKyAgcnhzdGF0ZS0+ZmllbGRfYyA9IDA7CisgIHJ4c3RhdGUtPmluZGV4ID0gMDsKKyAgcnhzdGF0ZS0+Y3JjID0gMDsKKyAgcnhzdGF0ZS0+ZXJyb3IgPSBSRV9PS0FZOworICByeHN0YXRlLT5jb25maWcgPSByeGNvbmZpZzsKK30KKworcmVfc3RhdHVzIEFuZ2VsX1J4RW5naW5lKHVuc2lnbmVkIGNoYXIgbmV3X2NoLCBzdHJ1Y3QgZGF0YV9wYWNrZXQgKnBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVfc3RhdGUgKnJ4c3RhdGUpCit7CisgIC8qCisgICAqIFRPRE86IGFkZCB0aGUgZmxvdyBjb250cm9sIGJpdHMgaW4KKyAgICogTm90ZTogV2UgdGVzdCBmb3IgdGhlIGRhdGEgZmllbGQgaW4gYSBzZXBlcmF0ZSBjYXNlIHNvIHdlIGNhbgorICAgKiBjb21wbGV0ZWx5IGF2b2lkIGVudGVyaW5nIHRoZSBzd2l0Y2ggZm9yIG1vc3QgY2hhcnMKKyAgICovCisKKyAgLyogc2VlIGlmIHdlJ3JlIGV4cGVjdGluZyBhIGVzY2FwZWQgY2hhciAqLworICBpZiAoKHJ4c3RhdGUtPnJ4X3N0YXRlICYgUlNUX0VTQykgPT0gUlNUX0VTQykKKyAgeworICAgIC8qIHVuZXNjYXBlIHRoZSBjaGFyIGFuZCB1bnNldCB0aGUgZmxhZyovCisgICAgbmV3X2NoICY9IH5zZXJpYWxfRVNDQVBFOworI2lmZGVmIERPX1RSQUNFCisgICAgX19ydF90cmFjZSgicnhlLWVjaGFyLSUyeCAiLCBuZXdfY2gpOworI2VuZGlmCisgICAgcnhzdGF0ZS0+cnhfc3RhdGUgJj0gflJTVF9FU0M7CisgIH0KKyAgZWxzZSBpZiAoICgxIDw8IG5ld19jaCkgJiByeHN0YXRlLT5jb25maWctPmVzY19zZXQgKQorICB7CisgICAgLyogc2VlIGlmIHRoZSBpbmNvbWluZyBjaGFyIGlzIGEgc3BlY2lhbCBvbmUgKi8KKyAgICBpZiAobmV3X2NoID09IHJ4c3RhdGUtPmNvbmZpZy0+ZXNjKQorICAgIHsKKyNpZmRlZiBET19UUkFDRQorICAgICAgX19ydF90cmFjZSgicnhlLWVzYyAiKTsKKyNlbmRpZgorICAgICAgcnhzdGF0ZS0+cnhfc3RhdGUgfD0gUlNUX0VTQzsKKyAgICAgIHJldHVybiBSU19JTl9QS1Q7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKgorICAgICAgICogbXVzdCBiZSBhIG5vcm1hbCBwYWNrZXQgc28gZG8gc29tZSB1bmV4cGVjdGVkIGV0eC9zdHggY2hlY2tpbmcKKyAgICAgICAqIHdlIGhhdmVuJ3QgYmVlbiB0b2xkIHRvIGVzY2FwZSBvciByZWNlaXZlZCBhbiBlc2NhcGUgc28gdW5sZXNzCisgICAgICAgKiB3ZSBhcmUgZXhwZWN0aW5nIGFuIHN0eCBvciBldHggdGhlbiB3ZSBjYW4gdGFrZSB0aGUgdW5leHBlY3RlZCAKKyAgICAgICAqIHN0eC9ldHggdHJhcAorICAgICAgICovCisgICAgICBpZiAoKG5ld19jaCA9PSAocnhzdGF0ZS0+Y29uZmlnLT5zdHgpKSAmJiAocnhzdGF0ZS0+cnhfc3RhdGUgIT0gUlNUX1NUWCkpCisgICAgICAgIHJldHVybiB1bmV4cF9zdHgocnhzdGF0ZSk7CisgICAgICBpZiAoKG5ld19jaCA9PSAocnhzdGF0ZS0+Y29uZmlnLT5ldHgpKSAmJiAocnhzdGF0ZS0+cnhfc3RhdGUgIT0gUlNUX0VUWCkpCisgICAgICAgIHJldHVybiB1bmV4cF9ldHgocnhzdGF0ZSk7CisgICAgfQorICB9CisKKyAgaWYgKHJ4c3RhdGUtPnJ4X3N0YXRlID09IFJTVF9EQVQpCisgIHsKKyAgICAvKgorICAgICAqIGRvIHRoaXMgdG8gc3BlZWQgdXAgdGhlIGNvbW1vbiBjYXNlLCBubyByZWFsIHBlbmFsdHkgZm9yCisgICAgICogb3RoZXIgY2FzZXMgCisgICAgICovCisjaWZkZWYgRE9fVFJBQ0UKKyAgICBfX3J0X3RyYWNlKCJyeGUtZGF0ICIpOworI2VuZGlmCisKKyAgICByeHN0YXRlLT5jcmMgPSBjcmMzMigmbmV3X2NoLCAxLCByeHN0YXRlLT5jcmMpOworICAgIChwYWNrZXQtPmRhdGEpW3J4c3RhdGUtPmluZGV4KytdID0gKHVuc2lnbmVkIGludCluZXdfY2ggJiAweGZmOworCisgICAgaWYgKHJ4c3RhdGUtPmluZGV4ID09IHBhY2tldC0+bGVuKQorICAgICAgcnhzdGF0ZS0+cnhfc3RhdGUgPSBSU1RfQ1JDOworCisgICAgcmV0dXJuIFJTX0lOX1BLVDsKKyAgfQorCisgIC8qCisgICAqIE5vdyB0aGF0IHRoZSBjb21tb24gY2FzZSBpcyBvdXQgb2YgdGhlIHdheSB3ZSBjYW4gdGVzdCBmb3IgZXZlcnl0aGluZworICAgKiBlbHNlIHdpdGhvdXQgd29ycnlpbmcgcXVpdGUgc28gbXVjaCBhYm91dCB0aGUgc3BlZWQsIGNoYW5naW5nIHRoZQorICAgKiBvcmRlciB0byBsZW4sY3JjLHN0eCxldHgsdHlwIG1pZ2h0IGdhaW4gYSB0aW55IGJpdCBvZiBzcGVlZCBidXQgbGV0cworICAgKiBsZWF2ZSB0aGF0IGZvciB0aGUgbW9tZW50CisgICAqLworICBzd2l0Y2ggKHJ4c3RhdGUtPnJ4X3N0YXRlKQorICB7CisgICAgY2FzZSBSU1RfU1RYOgorICAgICAgaWYgKG5ld19jaCA9PSByeHN0YXRlLT5jb25maWctPnN0eCkKKyAgICAgIHsKKyAgICAgICAgcnhzdGF0ZS0+cnhfc3RhdGUgPSBSU1RfVFlQOworICAgICAgICByeHN0YXRlLT5lcnJvciA9IFJFX09LQVk7CisgICAgICAgIHJ4c3RhdGUtPmNyYyA9IHN0YXJ0Q1JDMzI7CisgICAgICAgIHJ4c3RhdGUtPmluZGV4ID0gMDsKKyAgICAgICAgcmV0dXJuIFJTX0lOX1BLVDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgcnhzdGF0ZS0+ZXJyb3IgPSBSRV9PS0FZOworICAgICAgICByZXR1cm4gUlNfV0FJVF9QS1Q7CisgICAgICB9CisKKyAgICBjYXNlIFJTVF9UWVA6CisgICAgICBwYWNrZXQtPnR5cGUgPSAoRGV2Q2hhbklEKW5ld19jaDsKKyAgICAgIHJ4c3RhdGUtPnJ4X3N0YXRlID0gUlNUX0xFTjsKKyAgICAgIHJ4c3RhdGUtPmVycm9yID0gUkVfT0tBWTsKKyAgICAgIHJ4c3RhdGUtPmZpZWxkX2MgPSAwOyAvKiBzZXQgdXAgaGVyZSBmb3IgdGhlIGxlbmd0aCB0aGF0IGZvbGxvd3MgKi8KKyNpZmRlZiBET19UUkFDRSAKKyAgICAgIF9fcnRfdHJhY2UoInJ4ZS10eXBlLSUyeCAiLCBwYWNrZXQtPnR5cGUpOworI2VuZGlmCisgICAgICByeHN0YXRlLT5jcmMgPSBjcmMzMigmbmV3X2NoLCAxLCByeHN0YXRlLT5jcmMpOworCisgICAgICByZXR1cm4gUlNfSU5fUEtUOworCisgICAgY2FzZSBSU1RfTEVOOgorICAgICAgcnhzdGF0ZS0+Y3JjID0gY3JjMzIoJm5ld19jaCwgMSwgcnhzdGF0ZS0+Y3JjKTsKKworICAgICAgaWYgKHJ4c3RhdGUtPmZpZWxkX2MrKyA9PSAwKQorICAgICAgeworICAgICAgICAvKiBmaXJzdCBsZW5ndGggYnl0ZSAqLworICAgICAgICBwYWNrZXQtPmxlbiA9ICgodW5zaWduZWQgaW50KW5ld19jaCkgPDwgODsKKyAgICAgICAgcmV0dXJuIFJTX0lOX1BLVDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogZ290IHRoZSB3aG9sZSBsZWd0aCAqLworICAgICAgICBwYWNrZXQtPmxlbiB8PSBuZXdfY2g7CisjaWZkZWYgRE9fVFJBQ0UKKyAgICAgICAgX19ydF90cmFjZSgicnhlLWxlbi0lNHhcbiIsIHBhY2tldC0+bGVuKTsKKyNlbmRpZgorCisgICAgICAgIC8qIGNoZWNrIHRoYXQgdGhlIGxlbmd0aCBpcyBvayAqLworICAgICAgICBpZiAocGFja2V0LT5sZW4gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIGVtcHR5IHBrdCAqLworICAgICAgICAgIHJ4c3RhdGUtPmZpZWxkX2MgPSAwOworICAgICAgICAgIHJ4c3RhdGUtPnJ4X3N0YXRlID0gUlNUX0NSQzsKKyAgICAgICAgICByZXR1cm4gUlNfSU5fUEtUOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChwYWNrZXQtPmRhdGEgPT0gTlVMTCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBuZWVkIHRvIGFsbG9jIHRoZSBkYXRhIGJ1ZmZlciAqLworICAgICAgICAgICAgaWYgKCFyeHN0YXRlLT5jb25maWctPmJhX2NhbGxiYWNrKAorICAgICAgICAgICAgICAgIHBhY2tldCwgcnhzdGF0ZS0+Y29uZmlnLT5iYV9kYXRhKSkgeworICAgICAgICAgICAgICByeHN0YXRlLT5yeF9zdGF0ZSA9IFJTVF9TVFg7CisgICAgICAgICAgICAgIHJ4c3RhdGUtPmVycm9yID0gUkVfSU5URVJOQUw7CisgICAgICAgICAgICAgIHJldHVybiBSU19CQURfUEtUOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChwYWNrZXQtPmxlbiA+IHBhY2tldC0+YnVmX2xlbikKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBwa3QgYmlnZ2VyIHRoYW4gYnVmZmVyICovCisgICAgICAgICAgICByeHN0YXRlLT5maWVsZF9jID0gMDsKKyAgICAgICAgICAgIHJ4c3RhdGUtPnJ4X3N0YXRlID0gUlNUX1NUWDsKKyAgICAgICAgICAgIHJ4c3RhdGUtPmVycm9yID0gUkVfTEVOOworICAgICAgICAgICAgcmV0dXJuIFJTX0JBRF9QS1Q7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBwYWNrZXQgb2sgKi8KKyAgICAgICAgICAgIHJ4c3RhdGUtPmZpZWxkX2MgPSAwOworICAgICAgICAgICAgcnhzdGF0ZS0+cnhfc3RhdGUgPSBSU1RfREFUOworICAgICAgICAgICAgcmV0dXJuIFJTX0lOX1BLVDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIGNhc2UgUlNUX0RBVDoKKyAgICAgIC8qIGR1bW15IGNhc2UgKGRlYWx0IHdpdGggZWFybGllcikgKi8KKyNpZmRlZiBBU1NFUlRJT05TX0VOQUJMRUQKKyAgICAgIF9fcnRfd2FybmluZygiRVJST1I6IGhpdCBSU1RfZGF0IGluIHN3aXRjaFxuIik7CisjZW5kaWYKKyAgICAgIHJ4c3RhdGUtPnJ4X3N0YXRlID0gUlNUX1NUWDsKKyAgICAgIHJ4c3RhdGUtPmVycm9yID0gUkVfSU5URVJOQUw7CisgICAgICByZXR1cm4gUlNfQkFEX1BLVDsKKworICAgIGNhc2UgUlNUX0NSQzoKKyAgICAgIGlmIChyeHN0YXRlLT5maWVsZF9jID09IDApCisgICAgICAgIHBhY2tldC0+Y3JjID0gMDsKKworICAgICAgcGFja2V0LT5jcmMgfD0gKG5ld19jaCAmIDB4RkYpIDw8ICgoMyAtIHJ4c3RhdGUtPmZpZWxkX2MpICogOCk7CisgICAgICByeHN0YXRlLT5maWVsZF9jKys7CisKKyAgICAgIGlmIChyeHN0YXRlLT5maWVsZF9jID09IDQpCisgICAgICB7CisgICAgICAgIC8qIGxhc3QgY3JjIGZpZWxkICovCisgICAgICAgIHJ4c3RhdGUtPmZpZWxkX2MgPSAwOworICAgICAgICByeHN0YXRlLT5yeF9zdGF0ZSA9IFJTVF9FVFg7CisjaWZkZWYgRE9fVFJBQ0UKKyAgICAgICAgX19ydF90cmFjZSgicnhlLXJjcmMtJTh4ICIsIHBhY2tldC0+Y3JjKTsKKyNlbmRpZgorICAgICAgfQorCisgICAgICByZXR1cm4gUlNfSU5fUEtUOworCisgICAgY2FzZSBSU1RfRVRYOgorICAgICAgaWYgKG5ld19jaCA9PSByeHN0YXRlLT5jb25maWctPmV0eCkKKyAgICAgIHsKKyNpZiBkZWZpbmVkKERFQlVHKSAmJiAhZGVmaW5lZChOT19QS1RfREFUQSkKKyAgICAgICAgeworICAgICAgICAgIGludCBjOworIyBpZmRlZiBET19UUkFDRQorICAgICAgICAgIF9fcnRfdHJhY2UoIlxuIik7CisjIGVuZGlmCisgICAgICAgICAgX19ydF9pbmZvKCJSWEUgRGF0YSA9Iik7CisgICAgICAgICAgZm9yIChjPTA7IGMgPCBwYWNrZXQtPmxlbjsgYysrKQorICAgICAgICAgICAgX19ydF9pbmZvKCIlMDJ4IiwgcGFja2V0LT5kYXRhW2NdKTsKKyAgICAgICAgICBfX3J0X2luZm8oIlxuIik7IAorICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAvKiBjaGVjayBjcmMgKi8KKyAgICAgICAgaWYgKHJ4c3RhdGUtPmNyYyA9PSBwYWNrZXQtPmNyYykKKyAgICAgICAgeworICAgICAgICAgIC8qIGNyYyBvayAqLworICAgICAgICAgIHJ4c3RhdGUtPnJ4X3N0YXRlID0gUlNUX1NUWDsKKyAgICAgICAgICByeHN0YXRlLT5maWVsZF9jID0gMDsKKyAgICAgICAgICByZXR1cm4gUlNfR09PRF9QS1Q7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisjaWZkZWYgQVNTRVJUSU9OU19FTkFCTEVECisgICAgICAgICAgX19ydF93YXJuaW5nKCJCYWQgY3JjLCByeCBjYWxjdWxhdGVzIGl0IHNob3VsZCBiZSAweCV4XG4iLCByeHN0YXRlLT5jcmMpOworI2VuZGlmCisgICAgICAgICAgcnhzdGF0ZS0+cnhfc3RhdGUgPSBSU1RfU1RYOworICAgICAgICAgIHJ4c3RhdGUtPmVycm9yID0gUkVfQ1JDOworICAgICAgICAgIHJldHVybiBSU19CQURfUEtUOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChuZXdfY2ggPT0gcnhzdGF0ZS0+Y29uZmlnLT5zdHgpCisgICAgICAgIHJldHVybiB1bmV4cF9zdHgocnhzdGF0ZSk7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHJ4c3RhdGUtPnJ4X3N0YXRlID0gUlNUX1NUWDsKKyAgICAgICAgcnhzdGF0ZS0+ZXJyb3IgPSBSRV9ORVRYOworICAgICAgICByZXR1cm4gUlNfQkFEX1BLVDsKKyAgICAgIH0KKworICAgIGRlZmF1bHQ6CisjaWZkZWYgQVNTRVJUSU9OU19FTkFCTEVECisgICAgICBfX3J0X3dhcm5pbmcoIkVSUk9SIGZlbGwgdGhyb3VnaCByeGVuZ2luZVxuIik7CisjZW5kaWYKKyAgICAgIHJ4c3RhdGUtPnJ4X3N0YXRlID0gUlNUX1NUWDsKKyAgICAgIHJ4c3RhdGUtPmVycm9yID0gUkVfSU5URVJOQUw7CisgICAgICByZXR1cm4gUlNfQkFEX1BLVDsKKyAgfQorfQorCitzdGF0aWMgcmVfc3RhdHVzIHVuZXhwX3N0eChzdHJ1Y3QgcmVfc3RhdGUgKnJ4c3RhdGUpCit7CisjaWZkZWYgQVNTRVJUSU9OU19FTkFCTEVECisgIF9fcnRfd2FybmluZygiVW5leHBlY3RlZCBzdHhcbiIpOworI2VuZGlmCisgIHJ4c3RhdGUtPmNyYyA9IHN0YXJ0Q1JDMzI7CisgIHJ4c3RhdGUtPmluZGV4ID0gMDsKKyAgcnhzdGF0ZS0+cnhfc3RhdGUgPSBSU1RfVFlQOworICByeHN0YXRlLT5lcnJvciA9IFJFX1VfU1RYOworICByeHN0YXRlLT5maWVsZF9jID0gMDsKKyAgcmV0dXJuIFJTX0JBRF9QS1Q7Cit9CisKK3N0YXRpYyByZV9zdGF0dXMgdW5leHBfZXR4KHN0cnVjdCByZV9zdGF0ZSAqcnhzdGF0ZSkKK3sKKyNpZmRlZiBBU1NFUlRJT05TX0VOQUJMRUQKKyAgX19ydF93YXJuaW5nKCJVbmV4cGVjdGVkIGV0eCwgcnhzdGF0ZTogaW5kZXg9IDB4JTJ4LCBmaWVsZF9jPTB4JTJ4LCBzdGF0ZT0weCUyeFxuIiwgcnhzdGF0ZS0+aW5kZXgsIHJ4c3RhdGUtPmZpZWxkX2MsIHJ4c3RhdGUtPnJ4X3N0YXRlKTsKKyNlbmRpZgorICByeHN0YXRlLT5jcmMgPSAwOworICByeHN0YXRlLT5pbmRleCA9IDA7CisgIHJ4c3RhdGUtPnJ4X3N0YXRlID0gUlNUX1NUWDsKKyAgcnhzdGF0ZS0+ZXJyb3IgPSBSRV9VX0VUWDsKKyAgcnhzdGF0ZS0+ZmllbGRfYyA9IDA7CisgIHJldHVybiBSU19CQURfUEtUOworfQorCisvKgorICogVGhpcyBjYW4gYmUgdXNlZCBhcyB0aGUgYnVmZmVyIGFsbG9jYXRpb24gY2FsbGJhY2sgZm9yIHRoZSByeCBlbmdpbmUsCisgKiBhbmQgbWFrZXMgdXNlIG9mIGFuZ2VsX0REX0dldEJ1ZmZlcigpIFtpbiBkZXZkcnYuaF0uIAorICoKKyAqIFNhdmVzIGR1cGxpY2F0aW5nIHRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gaW4gZXZlcnkgZGV2aWNlIGRyaXZlciB0aGF0CisgKiB1c2VzIHRoZSByeCBlbmdpbmUuCisgKgorICogTm90ZSB0aGF0IHRoaXMgUkVRVUlSRVMgdGhhdCB0aGUgZGV2aWNlIGlkIGlzIGluc3RhbGxlZCBhcyBiYV9kYXRhCisgKiBpbiB0aGUgcnggZW5naW5lIGNvbmZpZyBzdHJ1Y3R1cmUgZm9yIHRoZSBkcml2ZXIuCisgKi8KK2Jvb2wgYW5nZWxfRERfUnhFbmdfQnVmZmVyQWxsb2MoIHN0cnVjdCBkYXRhX3BhY2tldCAqcGFja2V0LCB2b2lkICpjYl9kYXRhICkKK3sKKyNpZmRlZiBUQVJHRVQKKyAgICBEZXZpY2VJRCBkZXZpZCA9IChEZXZpY2VJRCljYl9kYXRhOworI2Vsc2UKKyAgICBJR05PUkUoY2JfZGF0YSk7CisjZW5kaWYKKworICAgIGlmICggcGFja2V0LT50eXBlIDwgRENfTlVNX0NIQU5ORUxTICkKKyAgICB7CisgICAgICAgIC8qIHJlcXVlc3QgYSBidWZmZXIgZG93biBmcm9tIHRoZSBjaGFubmVscyBsYXllciAqLworI2lmZGVmIFRBUkdFVAorICAgICAgICBwYWNrZXQtPmRhdGEgPSBhbmdlbF9ERF9HZXRCdWZmZXIoIGRldmlkLCBwYWNrZXQtPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5sZW4gICAgICAgICAgICAgICk7CisjZWxzZQorICAgICAgICBwYWNrZXQtPmRhdGEgPSBtYWxsb2MocGFja2V0LT5sZW4pOworI2VuZGlmCisgICAgICAgIGlmICggcGFja2V0LT5kYXRhID09IE5VTEwgKQorICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcGFja2V0LT5idWZfbGVuID0gcGFja2V0LT5sZW47CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBiYWQgdHlwZSBmaWVsZCAqLworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisvKiBFT0YgcnguYyAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9yeHR4LmggYi9nZGIvcmRpLXNoYXJlL3J4dHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDRlOTk4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS9yeHR4LmgKQEAgLTAsMCArMSwyNjMgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qLSotQy0qLQorICoKKyAqICRSZXZpc2lvbiQKKyAqICAgICAkRGF0ZSQKKyAqCisgKgorICogICBQcm9qZWN0OiBBTkdFTAorICoKKyAqICAgICBUaXRsZTogIERlZmluaXRpb25zIHJlcXVpcmVkIGZvciB0aGUgcnggYW5kIHR4IGVuZ2luZXMKKyAqLworCisjaWZuZGVmIGFuZ2VsX3J4dHhfaAorI2RlZmluZSBhbmdlbF9yeHR4X2gKKworCisvKgorICogd2UgbmVlZCBhIGRlZmluaXRpb24gZm9yIGJvb2wsIHdoaWNoIGlzICJzeXN0ZW0iIGRlcGVuZGVudAorICovCisjaWZkZWYgVEFSR0VUCisjIGluY2x1ZGUgImFuZ2VsLmgiCisjZWxzZQorIyBpbmNsdWRlICJob3N0LmgiCisjZW5kaWYKKworI2luY2x1ZGUgImRldmNsbnQuaCIKKworLyogcmV0dXJuIHN0YXR1cyBjb2RlcyBmb3IgdGhlIHJ4IGVuZ2luZSAqLwordHlwZWRlZiBlbnVtIHJlX3N0YXR1cyB7CisgIFJTX1dBSVRfUEtULAorICBSU19JTl9QS1QsCisgIFJTX0JBRF9QS1QsCisgIFJTX0dPT0RfUEtUCit9IHJlX3N0YXR1czsKKworLyogcmV0dXJuIHN0YXR1cyBjb2RlcyBmb3IgdGhlIHR4IGVuZ2luZSAqLwordHlwZWRlZiBlbnVtIHRlX3N0YXR1cyB7CisgIFRTX0lETEUsCisgIFRTX0lOX1BLVCwKKyAgVFNfRE9ORV9QS1QKK30gdGVfc3RhdHVzOworCisKKy8qCisgKiByZXF1aXJlZCBzZXJpYWwgZGVmaW5pdGlvbnMsIHRoZXkgc2hvdWxkIGFsbCBiZSA8MzIsIHJlZmVyIHRvIHRoZQorICogcmVfY29uZmlnIHN0cnVjdCBjb21tZW50cyBmb3IgbW9yZSBkZXRhaWxzCisgKi8KKyNkZWZpbmUgc2VyaWFsX1NUWCAgICAoMHgxYykgLyogZGF0YSBwYWNrZXQgc3RhcnQgKi8KKyNkZWZpbmUgc2VyaWFsX0VUWCAgICAoMHgxZCkgLyogcGFja2V0IGVuZCAqLworI2RlZmluZSBzZXJpYWxfRVNDICAgICgweDFiKSAvKiBzdGFuZGFyZCBlc2NhcGUgY2hhcmFjdGVyICovCisjZGVmaW5lIHNlcmlhbF9YT04gICAgKDB4MTEpIC8qIHNvZnR3YXJlIGZsb3cgY29udHJvbCAtIGVuYWJsZSB0cmFuc21pc3Npb24gKi8KKyNkZWZpbmUgc2VyaWFsX1hPRkYgICAoMHgxMykgLyogc29mdHdhcmUgZmxvdyBjb250cm9sIC0gZGlzYWJsZSB0cmFuc21pc3Npb24gKi8KKworLyoKKyAqIEFsbCBvdGhlciBjaGFyYWN0ZXJzIGFyZSB0cmFuc21pdHRlZCBjbGVhbi4gSWYgYW55IG9mIHRoZSBhYm92ZQorICogY2hhcmFjdGVycyBuZWVkIHRvIGJlIHRyYW5zbWl0dGVkIGFzIHBhcnQgb2YgdGhlIHNlcmlhbCBkYXRhIHN0cmVhbQorICogdGhlbiB0aGUgY2hhcmFjdGVyIHdpbGwgYmUgcHJlY2VkZWQgYnkgdGhlICJzZXJpYWxfRVNDIiBjaGFyYWN0ZXIsCisgKiBhbmQgdGhlbiB0aGUgcmVxdWlyZWQgY2hhcmFjdGVyIHRyYW5zbWl0dGVkIChPUi1lZCB3aXRoIHRoZQorICogInNlcmlhbF9FU0NBUEUiIHZhbHVlLCB0byBlbnN1cmUgdGhhdCB0aGUgc2VyaWFsIHN0cmVhbSBuZXZlciBoYXMKKyAqIGFueSBvZiB0aGUgZXhjZXB0aW9uYWwgY2hhcmFjdGVycyBnZW5lcmF0ZWQgYnkgZGF0YSB0cmFuc2ZlcnMpLgorICovCisKKyNkZWZpbmUgc2VyaWFsX0VTQ0FQRSAgICgweDQwKSAgLyogT1ItZWQgd2l0aCBlc2NhcGVkIGNoYXJhY3RlcnMgKi8KKworLyogYmFkIHBhY2tldCBlcnJvciBjb2RlcyAqLwordHlwZWRlZiBlbnVtIHJlX2Vycm9yIHsKKyAgUkVfT0tBWSwKKyAgUkVfVV9TVFgsCisgIFJFX1VfRVRYLAorICBSRV9MRU4sCisgIFJFX0NSQywKKyAgUkVfTkVUWCwKKyAgUkVfSU5URVJOQUwKK30gcmVfZXJyb3I7CisKKy8qIGEgZGVjb2RlZCBwYWNrZXQgKi8KK3N0cnVjdCBkYXRhX3BhY2tldCB7CisgIHVuc2lnbmVkIHNob3J0ICBidWZfbGVuOyAgICAgIC8qIHNob3VsZCBiZSBzZXQgYnkgY2FsbGVyICovCisgIERldkNoYW5JRCAgICAgICB0eXBlOyAgICAgICAgIC8qIHZhbGlkIHdoZW4gc3RhdHVzIGlzIFJTX0dPT0RfUEtUICovCisgIHVuc2lnbmVkIHNob3J0ICBsZW47ICAgICAgICAgIC8qIC0tIi0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHVuc2lnbmVkIGludCAgICBjcmM7ICAgICAgICAgIC8qIGNyYyBmb3IgdGhlIHVuZXNjYXBlZCBwa3QgKi8KKyAgdW5zaWduZWQgY2hhciAgICpkYXRhOyAgICAgICAgLyogc2hvdWxkIGJlIHNldCBieSBjYWxsZXIgKi8KK307CisKKy8qCisgKiBQdXJwb3NlOiB0eXBlZGVmIGZvciBmbG93IGNvbnRyb2wgZnVuY3Rpb24KKyAqCisgKiAgUGFyYW1zOgorICogICAgICAgICAgSW5wdXQ6ICBmY19jaGFyICB0aGUgZmxvdyBjb250cm9sIGNoYXJhY3RlciBpbiBxdWVzdGlvbgorICogICAgICAgICAgSW4vT3V0OiBjYl9kYXRhICBjYWxsYmFjayBkYXRhIGFzIHNldCBpbiB0aGUgZmNfZGF0YQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG9mIHJlX2NvbmZpZywgdHlwaWNhbGx5IGRldmljZSBpZAorICoKKyAqIFRoaXMgY2FsbGJhY2sgd291bGQgdHB5aWNhbGx5IHJlc3BvbmQgdG8gcmVjZWl2ZWQgWE9OIGFuZCBYT0ZGCisgKiBjaGFyYWN0ZXJzIGJ5IGNvbnRyb2xsaW5nIHRoZSB0cmFuc21pdCBzaWRlIG9mIHRoZSBkZXZpY2UuCisgKi8KK3R5cGVkZWYgdm9pZCAoKmZjX2NiX2Z1bmMpKGNoYXIgZmNfY2hhciwgdm9pZCAqY2JfZGF0YSk7CisKKworLyoKKyAqIFB1cnBvc2U6IHR5cGVkZWYgZm9yIHRoZSBmdW5jdGlvbiB0byBhbGxvYyB0aGUgZGF0YSBidWZmZXIgCisgKgorICogIFBhcmFtczoKKyAqICAgICAgICAgIEluL091dDogcGFja2V0ICAgIHRoZSBkYXRhIHBhY2tldDogbGVuIGFuZCB0eXBlIHdpbGwgYmUgc2V0IG9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LCBhbmQgYnVmX2xlbiBhbmQgZGF0YSBzaG91bGQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2V0IGJ5IHRoaXMgcm91dGluZSBpZiBzdWNjZXNzZnVsLgorICogICAgICAgICAgICAgICAgICBjYl9kYXRhICAgY2FsbGJhY2sgZGF0YSBhcyBzZXQgaW4gdGhlIGJhX2RhdGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgb2YgcmVfY29uZmlnLCB0eXBpY2FsbHkgZGV2aWNlIGlkCisgKgorICogICAgICAgICBSZXR1cm5zOiBUUlVFICAgICAgYnVmZmVyIGFsbG9jYXRlZCBva2F5CisgKiAgICAgICAgICAgICAgICAgIEZBTFNFICAgICBjb3VsZG4ndCBhbGxvY2F0ZSBidWZmZXIgb2YgcmVxdWlyZWQgc2l6ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZ2l2ZW4gdHlwZQorICoKKyAqIFRoaXMgY2FsbGJhY2sgc2hvdWxkIGF0dGVtcHQgdG8gYWNxdWlyZSBhIGJ1ZmZlciBmb3IgdGhlIGRhdGEgcG9ydGlvbgorICogb2YgdGhlIHBhY2tldCB3aGljaCBpcyBjdXJyZW50bHkgYmVpbmcgcmVjZWl2ZWQsIGJhc2VkIG9uIHRoZSBsZW4gYW5kIAorICogdHlwZSBmaWVsZHMgc3VwcGxpZWQgaW4gcGFja2V0LgorICoKKyAqIGFuZ2VsX0REX1J4RW5nX0J1ZmZlckFsbG9jKCkgaXMgc3VwcGxpZWQgZm9yIHVzZSBhcyB0aGlzIGNhbGxiYWNrLAorICogYW5kIHdpbGwgYmUgc3VmZmljaWVudCBmb3IgbW9zdCBkZXZpY2VzLgorICovCit0eXBlZGVmIGJvb2wgKCpCdWZmZXJBbGxvY19DQl9Gbikoc3RydWN0IGRhdGFfcGFja2V0ICpwYWNrZXQsIHZvaWQgKmNiX2RhdGEpOworCisKKy8qCisgKiBUaGUgc3RhdGljIGluZm8gbmVlZGVkIGJ5IHRoZSBlbmdpbmUsIG1heSB2YXJ5IHBlciBkZXZpY2UuCisgKgorICogZmNfc2V0IGFuZCBlc2Nfc2V0IGFyZSBiaXRtYXBzLCBlLmcuIGJpdCAzID09IGNoYXJjb2RlIDMgPT0gQVNDSUkgRVRYLgorICogVGh1cyBhbnkgb2YgdGhlIGZpcnN0IDMyIGNoYXJjb2RlcyBjYW4gYmUgc2V0IGZvciBmbG93IGNvbnRyb2wgb3IgdG8KKyAqIGJlIGVzY2FwZWQuCisgKiAKKyAqIE5vdGUgdGhhdCBlc2Nfc2V0IHNob3VsZCBpbmNsdWRlIGFsbCBvZiBmY19zZXQsIGFuZCBzaG91bGQgaGF2ZSBiaXRzCisgKiBzZXQgZm9yIHN0eCwgZXR4IGFuZCBlc2MsIGFzIGEgbWluaW11bS4KKyAqCisgKiBJZiBjaGFyYWN0ZXIgY29kZXMgPiAzMSBuZWVkIHRvIGJlIHVzZWQgdGhlbiBmY19zZXQgYW5kIGVzY19zZXQKKyAqIGFuZCB0aGVpciBoYW5kbGluZyBjYW4gYmUgZXh0ZW5kZWQgdG8gdXNlIGFycmF5cyBhbmQgYml0IG1hbmlwdWxhdGlvbgorICogbWFjcm9zLCBwb3RlbnRpYWxseSB1cCB0byB0aGUgZnVsbCAyNTYgcG9zc2libGUgY2hhcnMuCisgKgorICogTm90ZSB0b28gdGhhdCB0aGlzIGNvdWxkL3Nob3VsZCBiZSBzaGFyZWQgd2l0aCB0aGUgdHggZW5naW5lLgorICovCisKK3N0cnVjdCByZV9jb25maWcgeworICB1bnNpZ25lZCBjaGFyICAgICBzdHg7ICAgICAgICAgICAgICAgICAgLyogdGhlIFNUWCBjaGFyIGZvciB0aGlzIGRldmljZSAqLworICB1bnNpZ25lZCBjaGFyICAgICBldHg7ICAgICAgICAgICAgICAgICAgLyogdGhlIEVUWCAtLSItLSAgICAgICAgICAgICAgICAqLworICB1bnNpZ25lZCBjaGFyICAgICBlc2M7ICAgICAgICAgICAgICAgICAgLyogdGhlIEVTQyAtLSItLSAgICAgICAgICAgICAgICAqLworICB1bnNpZ25lZCBpbnQgICAgICBmY19zZXQ7ICAgICAgICAgICAgICAgLyogYml0bWFwIG9mIGZsb3cgY29udHJvbCBjaGFycyAqLworICB1bnNpZ25lZCBpbnQgICAgICBlc2Nfc2V0OyAgICAgICAgICAgICAgLyogYml0bWFwIG9mIHNwZWNpYWwgY2hhcnMgICAgICAqLworICBmY19jYl9mdW5jICAgICAgICBmY19jYWxsYmFjazsgICAgICAgICAgLyogZmxvdyBjb250cm9sIGNhbGxiYWNrIGZ1bmMgICAqLworICB2b2lkICAgICAgICAgICAgICAqZmNfZGF0YTsgICAgICAgICAgICAgLyogZGF0YSB0byBwYXNzIHRvIGZjX2NhbGxiYWNrICAqLworICBCdWZmZXJBbGxvY19DQl9GbiBiYV9jYWxsYmFjazsgICAgICAgICAgLyogYnVmZmVyIGFsbG9jIGNhbGxiYWNrICAgICAgICAqLworICB2b2lkICAgICAgICAgICAgICAqYmFfZGF0YTsgICAgICAgICAgICAgLyogZGF0YSB0byBwYXNzIHRvIGJhX2NhbGJhY2sgICAqLworfTsKKworLyogdGhlIGR5bmFtaWMgaW5mbyBuZWVkZWQgYnkgdGhlIHJ4IGVuZ2luZSAqLworc3RydWN0IHJlX3N0YXRlIHsKKyAgdW5zaWduZWQgY2hhciAgICAgICAgICByeF9zdGF0ZTsgLyogMyBiaXRzIHBrdCBzdGF0ZSwgMSBwcmVwcm8gc3RhdGUgKi8KKyAgdW5zaWduZWQgc2hvcnQgICAgICAgICBmaWVsZF9jOyAgLyogY2hhcnMgbGVmdCBpbiBjdXJyZW50IGZpZWxkICovCisgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgaW5kZXg7ICAgIC8qIGluZGV4IGludG8gYnVmZmVyICovCisgIHVuc2lnbmVkIGludCAgICAgICAgICAgY3JjOyAgICAgIC8qIGNyYyBhY2N1bXVsYXRvciAqLworICByZV9lcnJvciAgICAgICAgICAgICAgIGVycm9yOyAgICAvKiB2YWxpZCBvbmx5IGlmIHN0YXR1cyBpcyBSU19CQURfUEtUICovCisgIGNvbnN0IHN0cnVjdCByZV9jb25maWcgKmNvbmZpZzsgIC8qIHBvaW50ZXIgdG8gc3RhdGljIGNvbmZpZyAqLworfTsKKworLyogZHluYW1pYyBzdGF0ZSBpbmZvIG5lZWRlZCBieSB0aGUgdHggZW5naW5lICovCitzdHJ1Y3QgdGVfc3RhdGUgeworICB1bnNpZ25lZCBzaG9ydCAgICAgICAgIGZpZWxkX2M7ICAvKiBwb3NpdGlvbiBpbiBjdXJyZW50IGZpZWxkICovCisgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgdHhfc3RhdGU7IC8qIGVuY29kZXMgbixlLCBhbmQgZiAoMisxKzI9NSBiaXRzKSAqLworICB1bnNpZ25lZCBjaGFyICAgICAgICAgIGVuY29kZWQ7ICAvKiBlc2NhcGUtZW5jb2RlZCBjaGFyIGZvciB0cmFuc21pc3Npb24gKi8KKyAgY29uc3Qgc3RydWN0IHJlX2NvbmZpZyAqY29uZmlnOyAgLyogcG9pbnRlciB0byBzdGF0aWMgY29uZmlnICovCisgIHVuc2lnbmVkIGludCAgICAgICAgICAgY3JjOyAgICAgIC8qIHNwYWNlIGZvciBDUkMgKGJlZm9yZSBlc2NhcGluZykgKi8KK307CisKKy8qCisgKiBGdW5jdGlvbjogQW5nZWxfUnhFbmdpbmVJbml0CisgKiAgUHVycG9zZTogSW5pdGlhbGlzZSBzdGF0ZSAoZHVyaW5nIGRldmljZSBpbml0KSBmb3IgZW5naW5lLgorICoKKyAqICAgUGFyYW1zOgorICogICAgICAgICAgICAgIElucHV0OiBjb25maWcgICBzdGF0aWMgY29uZmlnIGluZm8KKyAqICAgICAgICAgICAgIEluL091dDogc3RhdGUgICAgaW50ZXJuYWwgc3RhdGUKKyAqLworCit2b2lkIEFuZ2VsX1J4RW5naW5lSW5pdChjb25zdCBzdHJ1Y3QgcmVfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVfc3RhdGUgKnN0YXRlKTsKKworLyoKKyAqIEZ1bmN0aW9uOiBBbmdlbF9SeEVuZ2luZQorICogIFB1cnBvc2U6IFJ4IEVuZ2luZSBmb3IgY2hhcmFjdGVyLWJhc2VkIGRldmljZXMKKyAqCisgKiAgIFBhcmFtczoKKyAqICAgICAgICAgICAgICBJbnB1dDogbmV3X2NoICAgICAgIHRoZSBsYXRlc3QgY2hhcmFjdGVyCisgKgorICogICAgICAgICAgICAgSW4vT3V0OiBwYWNrZXQgICAgICAgZGV0YWlscyBvZiBwYWNrZXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQuYnVmX2xlbiBhbmQgcGFja2V0LmRhdGEgbXVzdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNldCBvbiBlbnRyeSEKKyAqICAgICAgICAgICAgICAgICAgICAgc3RhdGUgICAgICAgIGludGVybmFsIHN0YXRlLCBpbnRpYWxseSBzZXQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmdlbF9SeEVuZ2luZUluaXQoKQorICoKKyAqICAgICAgICAgICAgUmV0dXJuczogcmVfc3RhdHVzIChzZWUgYWJvdmUpCisgKgorICovCisKK3JlX3N0YXR1cyBBbmdlbF9SeEVuZ2luZSh1bnNpZ25lZCBjaGFyIG5ld19jaCwgc3RydWN0IGRhdGFfcGFja2V0ICpwYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlX3N0YXRlICpzdGF0ZSk7CisKKy8qCisgKiBUaGlzIGNhbiBiZSB1c2VkIGFzIHRoZSBidWZmZXIgYWxsb2NhdGlvbiBjYWxsYmFjayBmb3IgdGhlIHJ4IGVuZ2luZSwKKyAqIGFuZCB3aWxsIG1ha2UgdXNlIG9mIGFuZ2VsX0REX0dldEJ1ZmZlcigpIFtpbiBkZXZkcnYuaF0uIAorICoKKyAqIFNhdmVzIGR1cGxpY2F0aW5nIHRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gaW4gZXZlcnkgZGV2aWNlIGRyaXZlciB0aGF0CisgKiB1c2VzIHRoZSByeCBlbmdpbmUuCisgKgorICogTm90ZSB0aGF0IHRoaXMgUkVRVUlSRVMgdGhhdCB0aGUgZGV2aWNlIGlkIGlzIGluc3RhbGxlZCBhcyBiYV9kYXRhCisgKiBpbiB0aGUgcnggZW5naW5lIGNvbmZpZyBzdHJ1Y3R1cmUgZm9yIHRoZSBkcml2ZXIuCisgKi8KK2Jvb2wgYW5nZWxfRERfUnhFbmdfQnVmZmVyQWxsb2MoIHN0cnVjdCBkYXRhX3BhY2tldCAqcGFja2V0LCB2b2lkICpjYl9kYXRhICk7CisKKy8qCisgKiBGdW5jdGlvbjogQW5nZWxfVHhFbmdpbmVJbml0CisgKiAgUHVycG9zZTogU2V0IHVwIHR4IGVuZ2luZSBhdCBzdGFydCBvZiBuZXcgcGFja2V0LCBjYWxjdWxhdGUgQ1JDIGV0Yy4KKyAqICAgICAgICAgICAoVGhpcyBzaG91bGQgcGVyZm9ybSB0aGUgYWN0aW9ucyBkZXNjcmliZWQgdW5kZXIKKyAqICAgICAgICAgICAgICJJbml0aWFsaXNhdGlvbiIgYWJvdmUpCisgKgorICogICBQYXJhbXM6CisgKiAgICAgICAgICAgICAgSW5wdXQ6IGNvbmZpZyAgIHN0YXRpYyBjb25maWcgaW5mbworICogICAgICAgICAgICAgICAgICAgICBwYWNrZXQgICB0aGUgcGFja2V0IHRvIHRyYW5zbWl0CisgKiAgICAgICAgICAgICBJbi9PdXQ6IHN0YXRlICAgIGludGVybmFsIHN0YXRlCisgKi8KKwordm9pZCBBbmdlbF9UeEVuZ2luZUluaXQoY29uc3Qgc3RydWN0IHJlX2NvbmZpZyAgICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZGF0YV9wYWNrZXQgKnBhY2tldCwgCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGVfc3RhdGUgICAgKnN0YXRlKTsKKworLyoKKyAqIEZ1bmN0aW9uOiBBbmdlbF9UeEVuZ2luZQorICogIFB1cnBvc2U6IFR4IEVuZ2luZSBmb3IgY2hhcmFjdGVyLWJhc2VkIGRldmljZXMKKyAqCisgKiAgIFBhcmFtczoKKyAqICAgICAgICAgICAgICBJbnB1dDogcGFja2V0ICAgICAgIGRldGFpbHMgb2YgcGFja2V0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LmxlbiwgcGFja2V0LmRhdGEgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LnR5cGUgbXVzdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNldCBvbiBlbnRyeSEKKyAqICAgICAgICAgICAgIEluL091dDogc3RhdGUgICAgICAgIGludGVybmFsIHN0YXRlLCBpbnRpYWxseSBzZXQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmdlbF9UeEVuZ2luZVN0YXJ0KCkKKyAqICAgICAgICAgICAgIE91dHB1dDogdHhfY2ggICAgICAgIHRoZSBjaGFyYWN0ZXIgdG8gYmUgdHJhbnNtaXR0ZWQgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5PVCBTRVQgaWYgcmV0dXJuIGNvZGUgaXMgVFNfSURMRSkKKyAqCisgKiAgICAgICAgICAgIFJldHVybnM6IHRlX3N0YXR1cyAoc2VlIGFib3ZlKQorICovCisKK3RlX3N0YXR1cyBBbmdlbF9UeEVuZ2luZShjb25zdCBzdHJ1Y3QgZGF0YV9wYWNrZXQgICpwYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRlX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp0eF9jaCk7CisKKworCisjZW5kaWYgLyogIWRlZmluZWQoYW5nZWxfcnh0eF9oKSAqLworCisvKiAgRU9GIHJ4dHguaCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9zZXJkcnYuYyBiL2dkYi9yZGktc2hhcmUvc2VyZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmZDVhMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZGktc2hhcmUvc2VyZHJ2LmMKQEAgLTAsMCArMSw2NDkgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qIC0qLUMtKi0KKyAqCisgKiAkUmV2aXNpb24kCisgKiAgICAgJERhdGUkCisgKgorICoKKyAqIHNlcmRydi5jIC0gU3luY2hyb25vdXMgU2VyaWFsIERyaXZlciBmb3IgQW5nZWwuCisgKiAgICAgICAgICAgIFRoaXMgaXMgbmljZSBhbmQgc2ltcGxlIGp1c3QgdG8gZ2V0IHNvbWV0aGluZyBnb2luZy4KKyAqLworCisjaWZkZWYgX19ocHV4CisjICBkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJjcmMuaCIKKyNpbmNsdWRlICJkZXZpY2VzLmgiCisjaW5jbHVkZSAiYnVmZmVycy5oIgorI2luY2x1ZGUgInJ4dHguaCIKKyNpbmNsdWRlICJob3N0Y2hhbi5oIgorI2luY2x1ZGUgInBhcmFtcy5oIgorI2luY2x1ZGUgImxvZ2dpbmcuaCIKKworI2lmZGVmIENPTVBJTElOR19PTl9XSU5ET1dTCisjICB1bmRlZiAgIEVSUk9SCisjICB1bmRlZiAgIElHTk9SRQorIyAgaW5jbHVkZSA8d2luZG93cy5oPgorIyAgaW5jbHVkZSAiYW5nZWxkbGwuaCIKKyMgIGluY2x1ZGUgImNvbWJfYXBpLmgiCisjZWxzZQorIyAgaWZkZWYgX19ocHV4CisjICAgIGRlZmluZSBfVEVSTUlPU19JTkNMVURFRAorIyAgICBpbmNsdWRlIDxzeXMvdGVybWlvLmg+CisjICAgIHVuZGVmIF9URVJNSU9TX0lOQ0xVREVECisjICBlbHNlCisjICAgIGluY2x1ZGUgPHRlcm1pb3MuaD4KKyMgIGVuZGlmCisjICBpbmNsdWRlICJ1bml4Y29tbS5oIgorI2VuZGlmCisKKyNpZm5kZWYgVU5VU0VECisjICBkZWZpbmUgVU5VU0VEKHgpICh4ID0geCkgICAgICAvKiBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdzICovCisjZW5kaWYKKyAKKyNkZWZpbmUgTUFYUkVBRFNJWkUgNTEyCisjZGVmaW5lIE1BWFdSSVRFU0laRSA1MTIKKworI2RlZmluZSBTRVJJQUxfRkNfU0VUICAoKDE8PHNlcmlhbF9YT04pfCgxPDxzZXJpYWxfWE9GRikpCisjZGVmaW5lIFNFUklBTF9DVExfU0VUICgoMTw8c2VyaWFsX1NUWCl8KDE8PHNlcmlhbF9FVFgpfCgxPDxzZXJpYWxfRVNDKSkKKyNkZWZpbmUgU0VSSUFMX0VTQ19TRVQgKFNFUklBTF9GQ19TRVR8U0VSSUFMX0NUTF9TRVQpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVfY29uZmlnIGNvbmZpZyA9IHsKKyAgICBzZXJpYWxfU1RYLCBzZXJpYWxfRVRYLCBzZXJpYWxfRVNDLCAvKiBzZWxmLWV4cGxhbmF0b3J5PyAgICAgICAgICAgICAgICovCisgICAgU0VSSUFMX0ZDX1NFVCwgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IG9mIGZsb3ctY29udHJvbCBjaGFyYWN0ZXJzICAqLworICAgIFNFUklBTF9FU0NfU0VULCAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlIGVzY2FwZWQgKi8KKyAgICBOVUxMIC8qIHNlcmlhbF9mbG93X2NvbnRyb2wgKi8sIE5VTEwgICwgICAgLyogd2hhdCB0byBkbyB3aXRoIEZDIGNoYXJzICovCisgICAgYW5nZWxfRERfUnhFbmdfQnVmZmVyQWxsb2MsIE5VTEwgICAgICAgICAgICAgICAgLyogaG93IHRvIGdldCBhIGJ1ZmZlciAqLworfTsKKworc3RhdGljIHN0cnVjdCByZV9zdGF0ZSByeHN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB3cml0ZXN0YXRlIHsKKyAgdW5zaWduZWQgaW50IHdiaW5kZXg7CisgIC8qICBzdGF0aWMgdGVfc3RhdHVzIHRlc3RhdHVzOyovCisgIHVuc2lnbmVkIGNoYXIgd3JpdGVidWZbTUFYV1JJVEVTSVpFXTsKKyAgc3RydWN0IHRlX3N0YXRlIHR4c3RhdGU7Cit9IHdyaXRlc3RhdGU7CisKK3N0YXRpYyBzdHJ1Y3Qgd3JpdGVzdGF0ZSB3c3RhdGU7CisKKy8qCisgKiBUaGUgc2V0IG9mIHBhcmFtZXRlciBvcHRpb25zIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYmF1ZF9vcHRpb25zW10gPSB7CisjaWZkZWYgX19ocHV4CisgICAgMTE1MjAwLCA1NzYwMCwgCisjZW5kaWYKKyAgICAzODQwMCwgMTkyMDAsIDk2MDAKK307CisKK3N0YXRpYyBQYXJhbWV0ZXJMaXN0IHBhcmFtX2xpc3RbXSA9IHsKKyAgICB7IEFQX0JBVURfUkFURSwKKyAgICAgIHNpemVvZihiYXVkX29wdGlvbnMpL3NpemVvZih1bnNpZ25lZCBpbnQpLAorICAgICAgYmF1ZF9vcHRpb25zIH0KK307CisKK3N0YXRpYyBjb25zdCBQYXJhbWV0ZXJPcHRpb25zIHNlcmlhbF9vcHRpb25zID0geworICAgIHNpemVvZihwYXJhbV9saXN0KS9zaXplb2YoUGFyYW1ldGVyTGlzdCksIHBhcmFtX2xpc3QgfTsKKworLyogCisgKiBUaGUgZGVmYXVsdCBwYXJhbWV0ZXIgY29uZmlnIGZvciB0aGUgZGV2aWNlCisgKi8KK3N0YXRpYyBQYXJhbWV0ZXIgcGFyYW1fZGVmYXVsdFtdID0geworICAgIHsgQVBfQkFVRF9SQVRFLCA5NjAwIH0KK307CisKK3N0YXRpYyBQYXJhbWV0ZXJDb25maWcgc2VyaWFsX2RlZmF1bHRzID0geworICAgIHNpemVvZihwYXJhbV9kZWZhdWx0KS9zaXplb2YoUGFyYW1ldGVyKSwgcGFyYW1fZGVmYXVsdCB9OworCisvKgorICogVGhlIHVzZXItbW9kaWZpZWQgb3B0aW9ucyBmb3IgdGhlIGRldmljZQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHVzZXJfYmF1ZF9vcHRpb25zW3NpemVvZihiYXVkX29wdGlvbnMpL3NpemVvZih1bnNpZ25lZCldOworCitzdGF0aWMgUGFyYW1ldGVyTGlzdCBwYXJhbV91c2VyX2xpc3RbXSA9IHsKKyAgICB7IEFQX0JBVURfUkFURSwKKyAgICAgIHNpemVvZih1c2VyX2JhdWRfb3B0aW9ucykvc2l6ZW9mKHVuc2lnbmVkKSwKKyAgICAgIHVzZXJfYmF1ZF9vcHRpb25zIH0KK307CisKK3N0YXRpYyBQYXJhbWV0ZXJPcHRpb25zIHVzZXJfb3B0aW9ucyA9IHsKKyAgICBzaXplb2YocGFyYW1fdXNlcl9saXN0KS9zaXplb2YoUGFyYW1ldGVyTGlzdCksIHBhcmFtX3VzZXJfbGlzdCB9OworCitzdGF0aWMgYm9vbCB1c2VyX29wdGlvbnNfc2V0OworCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIGludCBzZXJpYWxfcmVzZXQoIHZvaWQgKTsKK3N0YXRpYyBpbnQgc2VyaWFsX3NldF9wYXJhbXMoIGNvbnN0IFBhcmFtZXRlckNvbmZpZyAqY29uZmlnICk7CitzdGF0aWMgaW50IFNlcmlhbE1hdGNoKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmFyZyk7CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfYmF1ZF9yYXRlKCB1bnNpZ25lZCBpbnQgdGFyZ2V0X2JhdWRfcmF0ZSApCit7CisgICAgY29uc3QgUGFyYW1ldGVyTGlzdCAqZnVsbF9saXN0OworICAgIFBhcmFtZXRlckxpc3QgICAgICAgKnVzZXJfbGlzdDsKKworICAgIC8qIGNyZWF0ZSBzdWJzZXQgb2YgZnVsbCBvcHRpb25zICovCisgICAgZnVsbF9saXN0ID0gQW5nZWxfRmluZFBhcmFtTGlzdCggJnNlcmlhbF9vcHRpb25zLCBBUF9CQVVEX1JBVEUgKTsKKyAgICB1c2VyX2xpc3QgPSBBbmdlbF9GaW5kUGFyYW1MaXN0KCAmdXNlcl9vcHRpb25zLCAgIEFQX0JBVURfUkFURSApOworCisgICAgaWYgKCBmdWxsX2xpc3QgIT0gTlVMTCAmJiB1c2VyX2xpc3QgIT0gTlVMTCApCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgICAgICAgdW5zaWduZWQgaW50IGRlZl9iYXVkID0gMDsKKworICAgICAgICAvKiBmaW5kIGxvd2VyIG9yIGVxdWFsIHRvICovCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgZnVsbF9saXN0LT5udW1fb3B0aW9uczsgKytpICkKKyAgICAgICAgICAgaWYgKCB0YXJnZXRfYmF1ZF9yYXRlID49IGZ1bGxfbGlzdC0+b3B0aW9uW2ldICkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogY29weSByZW1haW5pbmcgKi8KKyAgICAgICAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgKGZ1bGxfbGlzdC0+bnVtX29wdGlvbnMgLSBpKTsgKytqICkKKyAgICAgICAgICAgICAgICAgIHVzZXJfbGlzdC0+b3B0aW9uW2pdID0gZnVsbF9saXN0LT5vcHRpb25baStqXTsKKyAgICAgICAgICAgICAgIHVzZXJfbGlzdC0+bnVtX29wdGlvbnMgPSBqOworCisgICAgICAgICAgICAgICAvKiBjaGVjayB0aGlzIGlzIG5vdCB0aGUgZGVmYXVsdCAqLworICAgICAgICAgICAgICAgQW5nZWxfRmluZFBhcmFtKCBBUF9CQVVEX1JBVEUsICZzZXJpYWxfZGVmYXVsdHMsICZkZWZfYmF1ZCApOworICAgICAgICAgICAgICAgaWYgKCAoaiA9PSAxKSAmJiAodXNlcl9saXN0LT5vcHRpb25bMF0gPT0gZGVmX2JhdWQpICkKKyAgICAgICAgICAgICAgIHsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgICAgICAgIHByaW50ZiggInVzZXIgc2VsZWN0ZWQgZGVmYXVsdFxuIiApOworI2VuZGlmCisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgdXNlcl9vcHRpb25zX3NldCA9IFRSVUU7CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgICAgICAgICBwcmludGYoICJ1c2VyIG9wdGlvbnMgYXJlOiAiICk7CisgICAgICAgICAgICAgICAgICAgZm9yICggaiA9IDA7IGogPCB1c2VyX2xpc3QtPm51bV9vcHRpb25zOyArK2ogKQorICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiggIiV1ICIsIHVzZXJfbGlzdC0+b3B0aW9uW2pdICk7CisgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiXG4iICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgYnJlYWs7ICAgLyogb3V0IG9mIGkgbG9vcCAqLworICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisjaWZkZWYgREVCVUcKKyAgICAgICAgaWYgKCBpID49IGZ1bGxfbGlzdC0+bnVtX29wdGlvbnMgKQorICAgICAgICAgICBwcmludGYoICJjb3VsZG4ndCBtYXRjaCBiYXVkIHJhdGUgJXVcbiIsIHRhcmdldF9iYXVkX3JhdGUgKTsKKyNlbmRpZgorICAgIH0KKyNpZmRlZiBERUJVRworICAgIGVsc2UKKyAgICAgICBwcmludGYoICJmYWlsZWQgdG8gZmluZCBsaXN0c1xuIiApOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgU2VyaWFsT3Blbihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICphcmcpCit7CisgICAgY29uc3QgY2hhciAqcG9ydF9uYW1lID0gbmFtZTsKKworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCJTZXJpYWxPcGVuOiBuYW1lICVzIGFyZyAlc1xuIiwgbmFtZSwgYXJnID8gYXJnIDogIjxOVUxMPiIpOworI2VuZGlmCisKKyNpZmRlZiBDT01QSUxJTkdfT05fV0lORE9XUworICAgIGlmIChJc09wZW5TZXJpYWwoKSkgcmV0dXJuIC0xOworI2Vsc2UKKyAgICBpZiAoVW5peF9Jc1NlcmlhbEluVXNlKCkpIHJldHVybiAtMTsKKyNlbmRpZgorCisjaWZkZWYgQ09NUElMSU5HX09OX1dJTkRPV1MKKyAgICBpZiAoU2VyaWFsTWF0Y2gobmFtZSwgYXJnKSAhPSBhZHBfb2spCisgICAgICAgIHJldHVybiBhZHBfZmFpbGVkOworI2Vsc2UKKyAgICBwb3J0X25hbWUgPSBVbml4X01hdGNoVmFsaWRTZXJpYWxEZXZpY2UocG9ydF9uYW1lKTsKKyMgaWZkZWYgREVCVUcKKyAgICBwcmludGYoInRyYW5zbGF0ZWQgcG9ydCB0byAlc1xuIiwgcG9ydF9uYW1lID09IDAgPyAiTlVMTCIgOiBwb3J0X25hbWUpOworIyBlbmRpZgorICAgIGlmIChwb3J0X25hbWUgPT0gMCkgcmV0dXJuIGFkcF9mYWlsZWQ7CisjZW5kaWYKKworICAgIHVzZXJfb3B0aW9uc19zZXQgPSBGQUxTRTsKKworICAgIC8qIGludGVycHJldCBhbmQgc3RvcmUgdGhlIGFyZ3VtZW50cyAqLworICAgIGlmICggYXJnICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHRhcmdldF9iYXVkX3JhdGU7CisgICAgICAgIHRhcmdldF9iYXVkX3JhdGUgPSAodW5zaWduZWQgaW50KXN0cnRvdWwoYXJnLCBOVUxMLCAxMCk7CisgICAgICAgIGlmICh0YXJnZXRfYmF1ZF9yYXRlID4gMCkKKyAgICAgICAgeworI2lmZGVmIERFQlVHCisgICAgICAgICAgICBwcmludGYoICJ1c2VyIHNlbGVjdGVkIGJhdWQgcmF0ZSAldVxuIiwgdGFyZ2V0X2JhdWRfcmF0ZSApOworI2VuZGlmCisgICAgICAgICAgICBwcm9jZXNzX2JhdWRfcmF0ZSggdGFyZ2V0X2JhdWRfcmF0ZSApOworICAgICAgICB9CisjaWZkZWYgREVCVUcKKyAgICAgICAgZWxzZQorICAgICAgICAgICBwcmludGYoICJjb3VsZCBub3QgdW5kZXJzdGFuZCBiYXVkIHJhdGUgJXNcbiIsIGFyZyApOworI2VuZGlmCisgICAgfQorCisjaWZkZWYgQ09NUElMSU5HX09OX1dJTkRPV1MKKyAgICB7CisgICAgICAgIGludCBwb3J0ID0gSXNWYWxpZERldmljZShuYW1lKTsKKyAgICAgICAgaWYgKE9wZW5TZXJpYWwocG9ydCwgRkFMU0UpICE9IENPTV9PSykKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisjZWxzZQorICAgIGlmIChVbml4X09wZW5TZXJpYWwocG9ydF9uYW1lKSA8IDApCisgICAgICByZXR1cm4gLTE7CisjZW5kaWYKKworICAgIHNlcmlhbF9yZXNldCgpOworCisjaWYgZGVmaW5lZChfX3VuaXgpIHx8IGRlZmluZWQoX19DWUdXSU4zMl9fKQorICAgIFVuaXhfaW9jdGxOb25CbG9ja2luZygpOworI2VuZGlmCisKKyAgICBBbmdlbF9SeEVuZ2luZUluaXQoJmNvbmZpZywgJnJ4c3RhdGUpOworICAgIC8qCisgICAgICogREFOR0VSITogcGFzc2luZyBpbiBOVUxMIGFzIHRoZSBwYWNrZXQgaXMgb2sgZm9yIG5vdyBhcyBpdCBpcyBqdXN0CisgICAgICogSUdOT1JFZCBidXQgdGhpcyBtYXkgd2VsbCBjaGFuZ2UKKyAgICAgKi8KKyAgICBBbmdlbF9UeEVuZ2luZUluaXQoJmNvbmZpZywgTlVMTCwgJndzdGF0ZS50eHN0YXRlKTsgCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgU2VyaWFsTWF0Y2goY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYXJnKQoreworICAgIFVOVVNFRChhcmcpOworI2lmZGVmIENPTVBJTElOR19PTl9XSU5ET1dTCisgICAgaWYgKElzVmFsaWREZXZpY2UobmFtZSkgPT0gQ09NX0RFVklDRU5PVFZBTElEKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgcmV0dXJuIFVuaXhfTWF0Y2hWYWxpZFNlcmlhbERldmljZShuYW1lKSA9PSAwID8gLTEgOiAwOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIFNlcmlhbENsb3NlKHZvaWQpCit7CisjaWZkZWYgRE9fVFJBQ0UKKyAgICBwcmludGYoIlNlcmlhbENsb3NlKClcbiIpOworI2VuZGlmCisKKyNpZmRlZiBDT01QSUxJTkdfT05fV0lORE9XUworICAgIENsb3NlU2VyaWFsKCk7CisjZWxzZQorICAgIFVuaXhfQ2xvc2VTZXJpYWwoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IFNlcmlhbFJlYWQoRHJpdmVyQ2FsbCAqZGMsIGJvb2wgYmxvY2spIHsKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVhZGJ1ZltNQVhSRUFEU0laRV07CisgIHN0YXRpYyBpbnQgcmJpbmRleD0wOworCisgIGludCBucmVhZDsKKyAgaW50IHJlYWRfZXJybm87CisgIGludCBjPTA7CisgIHJlX3N0YXR1cyByZXN0YXR1czsKKyAgaW50IHJldF9jb2RlID0gLTE7ICAgICAgICAgICAgLyogYXNzdW1lIGJhZCBwYWNrZXQgb3IgZXJyb3IgKi8KKworICAvKiBtdXN0IG5vdCBvdmVyZmxvdyBidWZmZXIgYW5kIG11c3Qgc3RhcnQgYWZ0ZXIgdGhlIGV4aXN0aW5nIGRhdGEgKi8KKyNpZmRlZiBDT01QSUxJTkdfT05fV0lORE9XUworICB7CisgICAgQk9PTCBkdW1teSA9IEZBTFNFOworICAgIG5yZWFkID0gQnl0ZXNJblJYQnVmZmVyU2VyaWFsKCk7CisKKyAgICBpZiAobnJlYWQgPiBNQVhSRUFEU0laRSAtIHJiaW5kZXgpCisgICAgICBucmVhZCA9IE1BWFJFQURTSVpFIC0gcmJpbmRleDsKKworICAgIGlmICgocmVhZF9lcnJubyA9IFJlYWRTZXJpYWwocmVhZGJ1ZityYmluZGV4LCBucmVhZCwgJmR1bW15KSkgPT0gQ09NX1JFQURGQUlMKQorICAgIHsKKyAgICAgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLCAiUmVhZCBlcnJvclxuIiwgIkFuZ2VsIiwgTUJfT0sgfCBNQl9JQ09OU1RPUCk7CisgICAgICAgIHJldHVybiAtMTsgICAvKiBTSiAtIFRoaXMgcmVhbGx5IG5lZWRzIHRvIHJldHVybiBhIHZhbHVlLCB3aGljaCBpcyBwaWNrZWQgdXAgaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgRGV2U1dfUmVhZCBhcyBtZWFuaW5nIHN0b3AgZGVidWdnZXIgYnV0IGRvbid0IGtpbGwuICovCisgICAgfQorICAgIGVsc2UgaWYgKHBmblByb2dyZXNzQ2FsbGJhY2sgIT0gTlVMTCAmJiByZWFkX2Vycm5vID09IENPTV9PSykKKyAgICB7CisgICAgICBwcm9ncmVzc0luZm8ublJlYWQgKz0gbnJlYWQ7CisgICAgICAoKnBmblByb2dyZXNzQ2FsbGJhY2spKCZwcm9ncmVzc0luZm8pOworICAgIH0KKyAgfQorI2Vsc2UKKyAgbnJlYWQgPSBVbml4X1JlYWRTZXJpYWwocmVhZGJ1ZityYmluZGV4LCBNQVhSRUFEU0laRS1yYmluZGV4LCBibG9jayk7CisgIHJlYWRfZXJybm8gPSBlcnJubzsKKyNlbmRpZgorCisgIGlmICgobnJlYWQgPiAwKSB8fCAocmJpbmRleCA+IDApKSB7CisKKyNpZmRlZiBET19UUkFDRQorICAgIHByaW50ZigiWyVkQCVkXSAiLCBucmVhZCwgcmJpbmRleCk7CisjZW5kaWYKKworICAgIGlmIChucmVhZD4wKQorICAgICAgIHJiaW5kZXggPSByYmluZGV4K25yZWFkOworCisgICAgZG8geworICAgICAgcmVzdGF0dXMgPSBBbmdlbF9SeEVuZ2luZShyZWFkYnVmW2NdLCAmKGRjLT5kY19wYWNrZXQpLCAmcnhzdGF0ZSk7CisjaWZkZWYgRE9fVFJBQ0UKKyAgICAgIHByaW50ZigiPCUwMlggIixyZWFkYnVmW2NdKTsKKyAgICAgIGlmICghKCsrYyAlIDE2KSkKKyAgICAgICAgICBwcmludGYoIlxuIik7CisjZWxzZQorICAgICAgYysrOworI2VuZGlmCisgICAgfSB3aGlsZSAoYzxyYmluZGV4ICYmCisgICAgICAgICAgICAgKChyZXN0YXR1cyA9PSBSU19JTl9QS1QpIHx8IChyZXN0YXR1cyA9PSBSU19XQUlUX1BLVCkpKTsKKworI2lmZGVmIERPX1RSQUNFCisgICBpZiAoYyAlIDE2KQorICAgICAgICBwcmludGYoIlxuIik7CisjZW5kaWYKKworICAgIHN3aXRjaChyZXN0YXR1cykgeworICAgICAgCisgICAgICBjYXNlIFJTX0dPT0RfUEtUOgorICAgICAgICByZXRfY29kZSA9IDE7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCB0bzogKi8KKworICAgICAgY2FzZSBSU19CQURfUEtUOgorICAgICAgICAvKgorICAgICAgICAgKiBXZSBub3cgbmVlZCB0byBzaHVmZmxlIGFueSBsZWZ0IG92ZXIgZGF0YSBkb3duIHRvIHRoZQorICAgICAgICAgKiBiZWdpbm5pbmcgb2Ygb3VyIHByaXZhdGUgYnVmZmVyIHJlYWR5IHRvIGJlIHVzZWQgCisgICAgICAgICAqZm9yIHRoZSBuZXh0IHBhY2tldCAKKyAgICAgICAgICovCisjaWZkZWYgRE9fVFJBQ0UKKyAgICAgICAgcHJpbnRmKCJTZXJpYWxSZWFkKCkgcHJvY2Vzc2VkICVkLCBtb3ZpbmcgZG93biAlZFxuIiwgYywgcmJpbmRleC1jKTsKKyNlbmRpZgorICAgICAgICBpZiAoYyAhPSByYmluZGV4KSBtZW1tb3ZlKChjaGFyICopIHJlYWRidWYsIChjaGFyICopIChyZWFkYnVmK2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJiaW5kZXgtYyk7CisgICAgICAgIHJiaW5kZXggLT0gYzsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUlNfSU5fUEtUOgorICAgICAgY2FzZSBSU19XQUlUX1BLVDoKKyAgICAgICAgcmJpbmRleCA9IDA7ICAgICAgICAgICAgLyogd2lsbCBoYXZlIHByb2Nlc3NlZCBhbGwgd2UgaGFkICovCisgICAgICAgIHJldF9jb2RlID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisjaWZkZWYgREVCVUcKKyAgICAgICAgcHJpbnRmKCJCYWQgcmVfc3RhdHVzIGluIHNlcmlhbFJlYWQoKVxuIik7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgaWYgKG5yZWFkID09IDApCisgICAgcmV0X2NvZGUgPSAwOyAgICAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gcmVhZCAqLworICBlbHNlIGlmIChyZWFkX2Vycm5vID09IEVSUk5PX0ZPUl9CTE9DS0VEX0lPKSAvKiBucmVhZCA8IDAgKi8KKyAgICByZXRfY29kZSA9IDA7CisKKyNpZmRlZiBERUJVRworICBpZiAoKG5yZWFkPDApICYmIChyZWFkX2Vycm5vIT1FUlJOT19GT1JfQkxPQ0tFRF9JTykpCisgICAgcGVycm9yKCJyZWFkKCkgZXJyb3IgaW4gc2VyaWFsUmVhZCgpIik7CisjZW5kaWYKKworICByZXR1cm4gcmV0X2NvZGU7Cit9CisKKworc3RhdGljIGludCBTZXJpYWxXcml0ZShEcml2ZXJDYWxsICpkYykgeworICBpbnQgbndyaXR0ZW4gPSAwOworICB0ZV9zdGF0dXMgdGVzdGF0dXMgPSBUU19JTl9QS1Q7CisKKyAgaWYgKGRjLT5kY19jb250ZXh0ID09IE5VTEwpIHsKKyAgICBBbmdlbF9UeEVuZ2luZUluaXQoJmNvbmZpZywgJihkYy0+ZGNfcGFja2V0KSwgJih3c3RhdGUudHhzdGF0ZSkpOworICAgIHdzdGF0ZS53YmluZGV4ID0gMDsKKyAgICBkYy0+ZGNfY29udGV4dCA9ICZ3c3RhdGU7CisgIH0KKworICB3aGlsZSAoKHRlc3RhdHVzID09IFRTX0lOX1BLVCkgJiYgKHdzdGF0ZS53YmluZGV4IDwgTUFYV1JJVEVTSVpFKSkKKyAgeworICAgIC8qIHNlbmQgdGhlIHJhdyBkYXRhIHRocm91Z2ggdGhlIHR4IGVuZ2luZSB0byBlc2NhcGUgYW5kIGVuY2Fwc3VsYXRlICovCisgICAgdGVzdGF0dXMgPSBBbmdlbF9UeEVuZ2luZSgmKGRjLT5kY19wYWNrZXQpLCAmKHdzdGF0ZS50eHN0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYod3N0YXRlLndyaXRlYnVmKVt3c3RhdGUud2JpbmRleF0pOworICAgIGlmICh0ZXN0YXR1cyAhPSBUU19JRExFKSB3c3RhdGUud2JpbmRleCsrOworICB9CisKKyAgaWYgKHRlc3RhdHVzID09IFRTX0lETEUpIHsKKyNpZmRlZiBERUJVRworICAgIHByaW50ZigiU2VyaWFsV3JpdGU6IHRlc3RhdHVzIGlzIFRTX0lETEUgZHVyaW5nIHByZXByb2Nlc3NpbmdcbiIpOworI2VuZGlmCisgIH0KKworI2lmZGVmIERPX1RSQUNFCisgIHsgCisgICAgaW50IGkgPSAwOworCisgICAgd2hpbGUgKGk8d3N0YXRlLndiaW5kZXgpCisgICAgeworICAgICAgICBwcmludGYoIj4lMDJYICIsd3N0YXRlLndyaXRlYnVmW2ldKTsKKworICAgICAgICBpZiAoISgrK2kgJSAxNikpCisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgfQorICAgIGlmIChpICUgMTYpCisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgfQorI2VuZGlmCisKKyNpZmRlZiBDT01QSUxJTkdfT05fV0lORE9XUworICBpZiAoV3JpdGVTZXJpYWwod3N0YXRlLndyaXRlYnVmLCB3c3RhdGUud2JpbmRleCkgPT0gQ09NX09LKQorICB7CisgICAgbndyaXR0ZW4gPSB3c3RhdGUud2JpbmRleDsKKyAgICBpZiAocGZuUHJvZ3Jlc3NDYWxsYmFjayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHByb2dyZXNzSW5mby5uV3JpdHRlbiArPSBud3JpdHRlbjsKKyAgICAgICgqcGZuUHJvZ3Jlc3NDYWxsYmFjaykoJnByb2dyZXNzSW5mbyk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLCAiV3JpdGUgZXJyb3JcbiIsICJBbmdlbCIsIE1CX09LIHwgTUJfSUNPTlNUT1ApOworICAgICAgcmV0dXJuIC0xOyAgIC8qIFNKIC0gVGhpcyByZWFsbHkgbmVlZHMgdG8gcmV0dXJuIGEgdmFsdWUsIHdoaWNoIGlzIHBpY2tlZCB1cCBpbiAqLworICAgICAgICAgICAgICAgICAgIC8qICAgICAgRGV2U1dfUmVhZCBhcyBtZWFuaW5nIHN0b3AgZGVidWdnZXIgYnV0IGRvbid0IGtpbGwuICovCisgIH0KKyNlbHNlCisgIG53cml0dGVuID0gVW5peF9Xcml0ZVNlcmlhbCh3c3RhdGUud3JpdGVidWYsIHdzdGF0ZS53YmluZGV4KTsKKworICBpZiAobndyaXR0ZW4gPCAwKSB7CisgICAgbndyaXR0ZW49MDsKKyAgfQorI2VuZGlmCisKKyNpZmRlZiBERUJVRworICBpZiAobndyaXR0ZW4gPiAwKQorICAgIHByaW50ZigiV3JvdGUgJSMwNHggYnl0ZXNcbiIsIG53cml0dGVuKTsKKyNlbmRpZgorCisgIGlmICgodW5zaWduZWQpIG53cml0dGVuID09IHdzdGF0ZS53YmluZGV4ICYmIAorICAgICAgKHRlc3RhdHVzID09IFRTX0RPTkVfUEtUIHx8IHRlc3RhdHVzID09IFRTX0lETEUpKSB7CisKKyAgICAvKiBmaW5pc2hlZCBzZW5kaW5nIHRoZSBwYWNrZXQgKi8KKworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCJTZXJpYWxXcml0ZTogY2FsbGluZyBBbmdlbF9UeEVuZ2luZUluaXQgYWZ0ZXIgc2VuZGluZyBwYWNrZXQgKGxlbj0laSlcbiIsd3N0YXRlLndiaW5kZXgpOworI2VuZGlmCisgICAgdGVzdGF0dXMgPSBUU19JTl9QS1Q7CisgICAgd3N0YXRlLndiaW5kZXggPSAwOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UgeworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCJTZXJpYWxXcml0ZTogV3JvdGUgcGFydCBvZiBwYWNrZXQgd2JpbmRleD0laSwgbndyaXR0ZW49JWlcbiIsCisgICAgICAgICAgIHdzdGF0ZS53YmluZGV4LCBud3JpdHRlbik7CisjZW5kaWYKKyAgIAorICAgIC8qCisgICAgICogIHN0aWxsIHNvbWUgZGF0YSBsZWZ0IHRvIHNlbmQgc2h1ZmZsZSB3aGF0cyBsZWZ0IGRvd24gYW5kIHJlc2V0CisgICAgICogdGhlIHB0cgorICAgICAqLworICAgIG1lbW1vdmUoKGNoYXIgKikgd3N0YXRlLndyaXRlYnVmLCAoY2hhciAqKSAod3N0YXRlLndyaXRlYnVmK253cml0dGVuKSwKKyAgICAgICAgICAgIHdzdGF0ZS53YmluZGV4LW53cml0dGVuKTsKKyAgICB3c3RhdGUud2JpbmRleCAtPSBud3JpdHRlbjsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKKworc3RhdGljIGludCBzZXJpYWxfcmVzZXQoIHZvaWQgKQoreworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCAic2VyaWFsX3Jlc2V0XG4iICk7CisjZW5kaWYKKworI2lmZGVmIENPTVBJTElOR19PTl9XSU5ET1dTCisgICAgRmx1c2hTZXJpYWwoKTsKKyNlbHNlCisgICAgVW5peF9SZXNldFNlcmlhbCgpOworI2VuZGlmCisKKyAgICByZXR1cm4gc2VyaWFsX3NldF9wYXJhbXMoICZzZXJpYWxfZGVmYXVsdHMgKTsKK30KKworCitzdGF0aWMgaW50IGZpbmRfYmF1ZF9yYXRlKCB1bnNpZ25lZCBpbnQgKnNwZWVkICkKK3sKKyAgICBzdGF0aWMgc3RydWN0IHsKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgYmF1ZDsKKyAgICAgICAgICBpbnQgdGVybWlvc1ZhbHVlOworICAgIH0gcG9zc2libGVCYXVkUmF0ZXNbXSA9IHsKKyNpZiBkZWZpbmVkKF9faHB1eCkKKyAgICAgICAgezExNTIwMCxfQjExNTIwMH0sIHs1NzYwMCxfQjU3NjAwfSwKKyNlbmRpZgorI2lmZGVmIENPTVBJTElOR19PTl9XSU5ET1dTCisgICAgICAgIHszODQwMCxDQlJfMzg0MDB9LCB7MTkyMDAsQ0JSXzE5MjAwfSwgezk2MDAsIENCUl85NjAwfSwgezAsMH0KKyNlbHNlCisgICAgICAgIHszODQwMCxCMzg0MDB9LCB7MTkyMDAsQjE5MjAwfSwgezk2MDAsIEI5NjAwfSwgezAsMH0KKyNlbmRpZgorICAgIH07CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICAvKiBsb29rIGZvciBsb3dlciBvciBtYXRjaGluZyAtLSB3aWxsIGFsd2F5cyB0ZXJtaW5hdGUgYXQgMCBlbmQgbWFya2VyICovCisgICAgZm9yICggaSA9IDA7IHBvc3NpYmxlQmF1ZFJhdGVzW2ldLmJhdWQgPiAqc3BlZWQ7ICsraSApCisgICAgICAgLyogZG8gbm90aGluZyAqLyA7CisKKyAgICBpZiAoIHBvc3NpYmxlQmF1ZFJhdGVzW2ldLmJhdWQgPiAwICkKKyAgICAgICAqc3BlZWQgPSBwb3NzaWJsZUJhdWRSYXRlc1tpXS5iYXVkOworCisgICAgcmV0dXJuIHBvc3NpYmxlQmF1ZFJhdGVzW2ldLnRlcm1pb3NWYWx1ZTsKK30KKworCitzdGF0aWMgaW50IHNlcmlhbF9zZXRfcGFyYW1zKCBjb25zdCBQYXJhbWV0ZXJDb25maWcgKmNvbmZpZyApCit7CisgICAgdW5zaWduZWQgaW50IHNwZWVkOworICAgIGludCB0ZXJtaW9zX3ZhbHVlOworCisjaWZkZWYgREVCVUcKKyAgICBwcmludGYoICJzZXJpYWxfc2V0X3BhcmFtc1xuIiApOworI2VuZGlmCisKKyAgICBpZiAoICEgQW5nZWxfRmluZFBhcmFtKCBBUF9CQVVEX1JBVEUsIGNvbmZpZywgJnNwZWVkICkgKQorICAgIHsKKyNpZmRlZiBERUJVRworICAgICAgICBwcmludGYoICJzcGVlZCBub3QgZm91bmQgaW4gY29uZmlnXG4iICk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIERFX09LQVk7CisgICAgfQorCisgICAgdGVybWlvc192YWx1ZSA9IGZpbmRfYmF1ZF9yYXRlKCAmc3BlZWQgKTsKKyAgICBpZiAoIHRlcm1pb3NfdmFsdWUgPT0gMCApCisgICAgeworI2lmZGVmIERFQlVHCisgICAgICAgIHByaW50ZiggInNwZWVkIG5vdCB2YWxpZDogJXVcbiIsIHNwZWVkICk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIERFX09LQVk7CisgICAgfQorCisjaWZkZWYgREVCVUcKKyAgICBwcmludGYoICJzZXR0aW5nIHNwZWVkIHRvICV1XG4iLCBzcGVlZCApOworI2VuZGlmCisKKyNpZmRlZiBDT01QSUxJTkdfT05fV0lORE9XUworICAgIFNldEJhdWRSYXRlKChXT1JEKXRlcm1pb3NfdmFsdWUpOworI2Vsc2UKKyAgICBVbml4X1NldFNlcmlhbEJhdWRSYXRlKHRlcm1pb3NfdmFsdWUpOworI2VuZGlmCisKKyAgICByZXR1cm4gREVfT0tBWTsKK30KKworCitzdGF0aWMgaW50IHNlcmlhbF9nZXRfdXNlcl9wYXJhbXMoIFBhcmFtZXRlck9wdGlvbnMgKipwX29wdGlvbnMgKQoreworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCAic2VyaWFsX2dldF91c2VyX3BhcmFtc1xuIiApOworI2VuZGlmCisKKyAgICBpZiAoIHVzZXJfb3B0aW9uc19zZXQgKQorICAgIHsKKyAgICAgICAgKnBfb3B0aW9ucyA9ICZ1c2VyX29wdGlvbnM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwX29wdGlvbnMgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBERV9PS0FZOworfQorCisKK3N0YXRpYyBpbnQgc2VyaWFsX2dldF9kZWZhdWx0X3BhcmFtcyggUGFyYW1ldGVyQ29uZmlnICoqcF9jb25maWcgKQoreworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCAic2VyaWFsX2dldF9kZWZhdWx0X3BhcmFtc1xuIiApOworI2VuZGlmCisKKyAgICAqcF9jb25maWcgPSAoUGFyYW1ldGVyQ29uZmlnICopICZzZXJpYWxfZGVmYXVsdHM7CisgICAgcmV0dXJuIERFX09LQVk7Cit9CisKKworc3RhdGljIGludCBTZXJpYWxJb2N0bChjb25zdCBpbnQgb3Bjb2RlLCB2b2lkICphcmdzKSB7CisKKyAgICBpbnQgcmV0X2NvZGU7CisKKyNpZmRlZiBERUJVRworICAgIHByaW50ZiggIlNlcmlhbElvY3RsOiBvcCAlZCBhcmcgJXBcbiIsIG9wY29kZSwgYXJncyA/IGFyZ3MgOiAiPE5VTEw+Iik7CisjZW5kaWYKKworICAgIHN3aXRjaCAob3Bjb2RlKQorICAgIHsKKyAgICAgICBjYXNlIERDX1JFU0VUOiAgICAgICAgIAorICAgICAgICAgICByZXRfY29kZSA9IHNlcmlhbF9yZXNldCgpOworICAgICAgICAgICBicmVhazsKKworICAgICAgIGNhc2UgRENfU0VUX1BBUkFNUzogICAgIAorICAgICAgICAgICByZXRfY29kZSA9IHNlcmlhbF9zZXRfcGFyYW1zKChjb25zdCBQYXJhbWV0ZXJDb25maWcgKilhcmdzKTsKKyAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIERDX0dFVF9VU0VSX1BBUkFNUzogICAgIAorICAgICAgICAgICByZXRfY29kZSA9IHNlcmlhbF9nZXRfdXNlcl9wYXJhbXMoKFBhcmFtZXRlck9wdGlvbnMgKiopYXJncyk7CisgICAgICAgICAgIGJyZWFrOworCisgICAgICAgY2FzZSBEQ19HRVRfREVGQVVMVF9QQVJBTVM6CisgICAgICAgICAgIHJldF9jb2RlID0gc2VyaWFsX2dldF9kZWZhdWx0X3BhcmFtcygoUGFyYW1ldGVyQ29uZmlnICoqKWFyZ3MpOworICAgICAgICAgICBicmVhazsKKworICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgCisgICAgICAgICAgIHJldF9jb2RlID0gREVfQkFEX09QOworICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIHJldF9jb2RlOworfQorCitEZXZpY2VEZXNjciBhbmdlbF9TZXJpYWxEZXZpY2UgPSB7CisgICAgIlNFUklBTCIsCisgICAgU2VyaWFsT3BlbiwKKyAgICBTZXJpYWxNYXRjaCwKKyAgICBTZXJpYWxDbG9zZSwKKyAgICBTZXJpYWxSZWFkLAorICAgIFNlcmlhbFdyaXRlLAorICAgIFNlcmlhbElvY3RsCit9OwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9zZXJwYXJkci5jIGIvZ2RiL3JkaS1zaGFyZS9zZXJwYXJkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNGQwNDgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL3NlcnBhcmRyLmMKQEAgLTAsMCArMSw3MzAgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qIC0qLUMtKi0KKyAqCisgKiAkUmV2aXNpb24kCisgKiAgICAgJERhdGUkCisgKgorICoKKyAqIHNlcnBhcmR2LmMgLSBTZXJpYWwvUGFyYWxsZWwgRHJpdmVyIGZvciBBbmdlbC4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJjcmMuaCIKKyNpbmNsdWRlICJkZXZpY2VzLmgiCisjaW5jbHVkZSAiYnVmZmVycy5oIgorI2luY2x1ZGUgInJ4dHguaCIKKyNpbmNsdWRlICJob3N0Y2hhbi5oIgorI2luY2x1ZGUgInBhcmFtcy5oIgorI2luY2x1ZGUgImxvZ2dpbmcuaCIKKyNpbmNsdWRlICJoc3lzLmgiCisKKyNpZmRlZiBDT01QSUxJTkdfT05fV0lORE9XUworIyAgdW5kZWYgICBFUlJPUgorIyAgdW5kZWYgICBJR05PUkUKKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgIGluY2x1ZGUgImFuZ2VsZGxsLmgiCisjICBpbmNsdWRlICJjb21iX2FwaS5oIgorI2Vsc2UKKyMgIGlmZGVmIF9faHB1eAorIyAgICBkZWZpbmUgX1RFUk1JT1NfSU5DTFVERUQKKyMgICAgaW5jbHVkZSA8c3lzL3Rlcm1pby5oPgorIyAgICB1bmRlZiBfVEVSTUlPU19JTkNMVURFRAorIyAgZWxzZQorIyAgICBpbmNsdWRlIDx0ZXJtaW9zLmg+CisjICBlbmRpZgorIyAgaW5jbHVkZSAidW5peGNvbW0uaCIKKyNlbmRpZgorCisjaWZuZGVmIFVOVVNFRAorIyAgZGVmaW5lIFVOVVNFRCh4KSAoeCA9IHgpICAgICAvKiBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdzICovCisjZW5kaWYKKworI2RlZmluZSBNQVhSRUFEU0laRSAgICAgNTEyCisjZGVmaW5lIE1BWFdSSVRFU0laRSAgICA1MTIKKworI2RlZmluZSBTRVJQQVJfRkNfU0VUICAoKDEgPDwgc2VyaWFsX1hPTikgfCAoMSA8PCBzZXJpYWxfWE9GRikpCisjZGVmaW5lIFNFUlBBUl9DVExfU0VUICgoMSA8PCBzZXJpYWxfU1RYKSB8ICgxIDw8IHNlcmlhbF9FVFgpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgc2VyaWFsX0VTQykpCisjZGVmaW5lIFNFUlBBUl9FU0NfU0VUIChTRVJQQVJfRkNfU0VUIHwgU0VSUEFSX0NUTF9TRVQpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVfY29uZmlnIGNvbmZpZyA9IHsKKyAgICBzZXJpYWxfU1RYLCBzZXJpYWxfRVRYLCBzZXJpYWxfRVNDLCAvKiBzZWxmLWV4cGxhbmF0b3J5PyAgICAgICAgICAgICAgICovCisgICAgU0VSUEFSX0ZDX1NFVCwgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IG9mIGZsb3ctY29udHJvbCBjaGFyYWN0ZXJzICAqLworICAgIFNFUlBBUl9FU0NfU0VULCAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlIGVzY2FwZWQgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXJpYWxfZmxvd19jb250cm9sICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hhdCB0byBkbyB3aXRoIEZDIGNoYXJzICovCisgICAgYW5nZWxfRERfUnhFbmdfQnVmZmVyQWxsb2MsIE5VTEwgICAgLyogaG93IHRvIGdldCBhIGJ1ZmZlciAqLworfTsKKworc3RhdGljIHN0cnVjdCByZV9zdGF0ZSByeHN0YXRlOworCisvKgorICogc3RydWN0dXJlIHVzZWQgZm9yIG1hbmlwdWxhdGluZyB0cmFuc21pdCBkYXRhCisgKi8KK3R5cGVkZWYgc3RydWN0IFR4U3RhdGUKK3sKKyAgICBzdHJ1Y3QgdGVfc3RhdGUgc3RhdGU7CisgICAgdW5zaWduZWQgaW50ICAgIGluZGV4OworICAgIHVuc2lnbmVkIGNoYXIgICB3cml0ZWJ1ZltNQVhXUklURVNJWkVdOworfSBUeFN0YXRlOworCisvKgorICogVGhlIHNldCBvZiBwYXJhbWV0ZXIgb3B0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGJhdWRfb3B0aW9uc1tdID0KK3sKKyNpZmRlZiBfX2hwdXgKKyAgICAxMTUyMDAsIDU3NjAwLAorI2VuZGlmCisgICAgMzg0MDAsIDE5MjAwLCA5NjAwCit9OworCitzdGF0aWMgUGFyYW1ldGVyTGlzdCBwYXJhbV9saXN0W10gPQoreworICAgIHsKKyAgICAgICAgQVBfQkFVRF9SQVRFLAorICAgICAgICBzaXplb2YoYmF1ZF9vcHRpb25zKSAvIHNpemVvZih1bnNpZ25lZCBpbnQpLAorICAgICAgICBiYXVkX29wdGlvbnMKKyAgICB9Cit9OworCitzdGF0aWMgY29uc3QgUGFyYW1ldGVyT3B0aW9ucyBzZXJwYXJfb3B0aW9ucyA9Cit7CisgICAgc2l6ZW9mKHBhcmFtX2xpc3QpIC8gc2l6ZW9mKFBhcmFtZXRlckxpc3QpLAorICAgIHBhcmFtX2xpc3QKK307CisKKy8qCisgKiBUaGUgZGVmYXVsdCBwYXJhbWV0ZXIgY29uZmlnIGZvciB0aGUgZGV2aWNlCisgKi8KK3N0YXRpYyBQYXJhbWV0ZXIgcGFyYW1fZGVmYXVsdFtdID0KK3sKKyAgICB7IEFQX0JBVURfUkFURSwgOTYwMCB9Cit9OworCitzdGF0aWMgY29uc3QgUGFyYW1ldGVyQ29uZmlnIHNlcnBhcl9kZWZhdWx0cyA9Cit7CisgICAgc2l6ZW9mKHBhcmFtX2RlZmF1bHQpL3NpemVvZihQYXJhbWV0ZXIpLAorICAgIHBhcmFtX2RlZmF1bHQKK307CisKKy8qCisgKiBUaGUgdXNlci1tb2RpZmllZCBvcHRpb25zIGZvciB0aGUgZGV2aWNlCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXNlcl9iYXVkX29wdGlvbnNbc2l6ZW9mKGJhdWRfb3B0aW9ucykgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1bnNpZ25lZCBpbnQpXTsKKworc3RhdGljIFBhcmFtZXRlckxpc3QgcGFyYW1fdXNlcl9saXN0W10gPQoreworICAgIHsKKyAgICAgICAgQVBfQkFVRF9SQVRFLAorICAgICAgICBzaXplb2YodXNlcl9iYXVkX29wdGlvbnMpIC8gc2l6ZW9mKHVuc2lnbmVkKSwKKyAgICAgICAgdXNlcl9iYXVkX29wdGlvbnMKKyAgICB9Cit9OworCitzdGF0aWMgUGFyYW1ldGVyT3B0aW9ucyB1c2VyX29wdGlvbnMgPQoreworICAgIHNpemVvZihwYXJhbV91c2VyX2xpc3QpIC8gc2l6ZW9mKFBhcmFtZXRlckxpc3QpLAorICAgIHBhcmFtX3VzZXJfbGlzdAorfTsKKworc3RhdGljIGJvb2wgdXNlcl9vcHRpb25zX3NldDsKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgc2VycGFyX3Jlc2V0KHZvaWQpOworc3RhdGljIGludCBzZXJwYXJfc2V0X3BhcmFtcyhjb25zdCBQYXJhbWV0ZXJDb25maWcgKmNvbmZpZyk7CitzdGF0aWMgaW50IFNlcnBhck1hdGNoKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmFyZyk7CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfYmF1ZF9yYXRlKHVuc2lnbmVkIGludCB0YXJnZXRfYmF1ZF9yYXRlKQoreworICAgIGNvbnN0IFBhcmFtZXRlckxpc3QgKmZ1bGxfbGlzdDsKKyAgICBQYXJhbWV0ZXJMaXN0ICAgICAgICp1c2VyX2xpc3Q7CisKKyAgICAvKiBjcmVhdGUgc3Vic2V0IG9mIGZ1bGwgb3B0aW9ucyAqLworICAgIGZ1bGxfbGlzdCA9IEFuZ2VsX0ZpbmRQYXJhbUxpc3QoJnNlcnBhcl9vcHRpb25zLCBBUF9CQVVEX1JBVEUpOworICAgIHVzZXJfbGlzdCA9IEFuZ2VsX0ZpbmRQYXJhbUxpc3QoJnVzZXJfb3B0aW9ucywgICBBUF9CQVVEX1JBVEUpOworCisgICAgaWYgKGZ1bGxfbGlzdCAhPSBOVUxMICYmIHVzZXJfbGlzdCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGksIGo7CisgICAgICAgIHVuc2lnbmVkIGludCBkZWZfYmF1ZCA9IDA7CisKKyAgICAgICAgLyogZmluZCBsb3dlciBvciBlcXVhbCB0byAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnVsbF9saXN0LT5udW1fb3B0aW9uczsgKytpKQorICAgICAgICAgICBpZiAodGFyZ2V0X2JhdWRfcmF0ZSA+PSBmdWxsX2xpc3QtPm9wdGlvbltpXSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogY29weSByZW1haW5pbmcgKi8KKyAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoZnVsbF9saXN0LT5udW1fb3B0aW9ucyAtIGkpOyArK2opCisgICAgICAgICAgICAgICAgICB1c2VyX2xpc3QtPm9wdGlvbltqXSA9IGZ1bGxfbGlzdC0+b3B0aW9uW2kral07CisgICAgICAgICAgICAgICB1c2VyX2xpc3QtPm51bV9vcHRpb25zID0gajsKKworICAgICAgICAgICAgICAgLyogY2hlY2sgdGhpcyBpcyBub3QgdGhlIGRlZmF1bHQgKi8KKyAgICAgICAgICAgICAgIEFuZ2VsX0ZpbmRQYXJhbShBUF9CQVVEX1JBVEUsICZzZXJwYXJfZGVmYXVsdHMsICZkZWZfYmF1ZCk7CisgICAgICAgICAgICAgICBpZiAoKGogPT0gMSkgJiYgKHVzZXJfbGlzdC0+b3B0aW9uWzBdID09IGRlZl9iYXVkKSkKKyAgICAgICAgICAgICAgIHsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgICAgICAgIHByaW50ZigidXNlciBzZWxlY3RlZCBkZWZhdWx0XG4iKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHVzZXJfb3B0aW9uc19zZXQgPSBUUlVFOworI2lmZGVmIERFQlVHCisgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJ1c2VyIG9wdGlvbnMgYXJlOiAiKTsKKyAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdXNlcl9saXN0LT5udW1fb3B0aW9uczsgKytqKQorICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXUgIiwgdXNlcl9saXN0LT5vcHRpb25bal0pOworICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBicmVhazsgICAvKiBvdXQgb2YgaSBsb29wICovCisgICAgICAgICAgIH0KKworI2lmZGVmIERFQlVHCisgICAgICAgIGlmIChpID49IGZ1bGxfbGlzdC0+bnVtX29wdGlvbnMpCisgICAgICAgICAgIHByaW50ZigiY291bGRuJ3QgbWF0Y2ggYmF1ZCByYXRlICV1XG4iLCB0YXJnZXRfYmF1ZF9yYXRlKTsKKyNlbmRpZgorICAgIH0KKyNpZmRlZiBERUJVRworICAgIGVsc2UKKyAgICAgICBwcmludGYoImZhaWxlZCB0byBmaW5kIGxpc3RzXG4iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IFNlcnBhck9wZW4oY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYXJnKQoreworICAgIGNoYXIgKnNlcm5hbWUgPSBOVUxMOworICAgIGNoYXIgKnBhcm5hbWUgPSBOVUxMOworCisjaWZkZWYgREVCVUcKKyAgICBwcmludGYoIlNlcnBhck9wZW46IG5hbWUgJXMgYXJnICVzXG4iLCBuYW1lLCBhcmcgPyBhcmcgOiAiPE5VTEw+Iik7CisjZW5kaWYKKworI2lmZGVmIENPTVBJTElOR19PTl9XSU5ET1dTCisgICAgaWYgKElzT3BlblNlcmlhbCgpIHx8IElzT3BlblBhcmFsbGVsKCkpIHJldHVybiAtMTsKKyNlbHNlCisgICAgaWYgKFVuaXhfSXNTZXJpYWxJblVzZSgpIHx8IFVuaXhfSXNQYXJhbGxlbEluVXNlKCkpIHJldHVybiAtMTsKKyNlbmRpZgorCisjaWZkZWYgQ09NUElMSU5HX09OX1dJTkRPV1MKKyAgICBpZiAoU2VycGFyTWF0Y2gobmFtZSwgYXJnKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworI2Vsc2UKKyAgICBVbml4X0lzVmFsaWRQYXJhbGxlbERldmljZShuYW1lLCZzZXJuYW1lLCZwYXJuYW1lKTsKKyMgaWZkZWYgREVCVUcKKyAgICBwcmludGYoInRyYW5zbGF0ZWQgJXMgdG8gc2VyaWFsICVzIGFuZCBwYXJhbGxlbCAlc1xuIiwKKyAgICAgICAgICAgbmFtZT09MCA/ICJOVUxMIiA6IG5hbWUsCisgICAgICAgICAgIHNlcm5hbWU9PTAgPyAiTlVMTCIgOiBzZXJuYW1lLAorICAgICAgICAgICBwYXJuYW1lPT0wID8gIk5VTEwiIDogcGFybmFtZSk7CisjIGVuZGlmCisgICAgaWYgKHNlcm5hbWU9PU5VTEwgfHwgcGFybmFtZT09TlVMTCkgcmV0dXJuIC0xOworI2VuZGlmCisKKyAgICB1c2VyX29wdGlvbnNfc2V0ID0gRkFMU0U7CisKKyAgICAvKiBpbnRlcnByZXQgYW5kIHN0b3JlIHRoZSBhcmd1bWVudHMgKi8KKyAgICBpZiAoYXJnICE9IE5VTEwpCisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2JhdWRfcmF0ZTsKKworICAgICAgICB0YXJnZXRfYmF1ZF9yYXRlID0gKHVuc2lnbmVkIGludClzdHJ0b3VsKGFyZywgTlVMTCwgMTApOworCisgICAgICAgIGlmICh0YXJnZXRfYmF1ZF9yYXRlID4gMCkKKyAgICAgICAgeworI2lmZGVmIERFQlVHCisgICAgICAgICAgICBwcmludGYoInVzZXIgc2VsZWN0ZWQgYmF1ZCByYXRlICV1XG4iLCB0YXJnZXRfYmF1ZF9yYXRlKTsKKyNlbmRpZgorICAgICAgICAgICAgcHJvY2Vzc19iYXVkX3JhdGUodGFyZ2V0X2JhdWRfcmF0ZSk7CisgICAgICAgIH0KKyNpZmRlZiBERUJVRworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoImNvdWxkIG5vdCB1bmRlcnN0YW5kIGJhdWQgcmF0ZSAlc1xuIiwgYXJnKTsKKyNlbmRpZgorICAgIH0KKworI2lmZGVmIENPTVBJTElOR19PTl9XSU5ET1dTCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgc2VyaWFsIHBvcnQgbnVtYmVyIGlzIGluIG5hbWVbMF0gZm9sbG93ZWQgYnkKKyAgICAgICAgICogdGhlIHBhcmFsbGVsIHBvcnQgbnVtYmVyIGluIG5hbWVbMV0KKyAgICAgICAgICovCisKKyAgICAgICAgaW50IHNwb3J0ID0gbmFtZVswXSAtICcwJzsKKyAgICAgICAgaW50IHBwb3J0ID0gbmFtZVsxXSAtICcwJzsKKworICAgICAgICBpZiAoT3BlblBhcmFsbGVsKHBwb3J0KSAhPSBDT01fT0spCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgaWYgKE9wZW5TZXJpYWwoc3BvcnQsIEZBTFNFKSAhPSBDT01fT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIENsb3NlUGFyYWxsZWwoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgVW5peF9PcGVuUGFyYWxsZWwocGFybmFtZSk7CisgICAgVW5peF9PcGVuU2VyaWFsKHNlcm5hbWUpOworI2VuZGlmCisKKyAgICBzZXJwYXJfcmVzZXQoKTsKKworI2lmIGRlZmluZWQoX191bml4KSB8fCBkZWZpbmVkKF9fQ1lHV0lOMzJfXykKKyAgICBVbml4X2lvY3RsTm9uQmxvY2tpbmcoKTsKKyNlbmRpZgorCisgICAgQW5nZWxfUnhFbmdpbmVJbml0KCZjb25maWcsICZyeHN0YXRlKTsKKworICAgIHJldHVybiAwOworfQorCisjaWZkZWYgQ09NUElMSU5HX09OX1dJTkRPV1MKK3N0YXRpYyBpbnQgU2VycGFyTWF0Y2goY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYXJnKQoreworICAgIGNoYXIgc2VybmFtZVsyXTsKKyAgICBjaGFyIHBhcm5hbWVbMl07CisKKyAgICBVTlVTRUQoYXJnKTsKKworICAgIHNlcm5hbWVbMF0gPSBuYW1lWzBdOworICAgIHBhcm5hbWVbMF0gPSBuYW1lWzFdOworICAgIHNlcm5hbWVbMV0gPSBwYXJuYW1lWzFdID0gMDsKKworICAgIGlmIChJc1ZhbGlkRGV2aWNlKHNlcm5hbWUpID09IENPTV9ERVZJQ0VOT1RWQUxJRCB8fAorICAgICAgICBJc1ZhbGlkRGV2aWNlKHBhcm5hbWUpID09IENPTV9ERVZJQ0VOT1RWQUxJRCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGludCBTZXJwYXJNYXRjaChjb25zdCBjaGFyICpwb3J0c3RyaW5nLCBjb25zdCBjaGFyICphcmcpCit7CisgICAgY2hhciAqc2VybmFtZT1OVUxMLCAqcGFybmFtZT1OVUxMOworICAgIFVOVVNFRChhcmcpOworCisgICAgVW5peF9Jc1ZhbGlkUGFyYWxsZWxEZXZpY2UocG9ydHN0cmluZywmc2VybmFtZSwmcGFybmFtZSk7CisKKyAgICAgIC8qIE1hdGNoIGZhaWxlZCBpZiBlaXRoZXIgc2VybmFtZSBvciBwYXJuYW1lIGFyZSBzdGlsbCBOVUxMICovCisgICAgaWYgKHNlcm5hbWU9PU5VTEwgfHwgcGFybmFtZT09TlVMTCkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIFNlcnBhckNsb3NlKHZvaWQpCit7CisjaWZkZWYgQ09NUElMSU5HX09OX1dJTkRPV1MKKyAgICBDbG9zZVBhcmFsbGVsKCk7CisgICAgQ2xvc2VTZXJpYWwoKTsKKyNlbHNlCisgICAgVW5peF9DbG9zZVBhcmFsbGVsKCk7CisgICAgVW5peF9DbG9zZVNlcmlhbCgpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgU2VycGFyUmVhZChEcml2ZXJDYWxsICpkYywgYm9vbCBibG9jaykKK3sKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciByZWFkYnVmW01BWFJFQURTSVpFXTsKKyAgICBzdGF0aWMgaW50IHJiaW5kZXggPSAwOworCisgICAgaW50IG5yZWFkOworICAgIGludCByZWFkX2Vycm5vOworICAgIGludCBjID0gMDsKKyAgICByZV9zdGF0dXMgcmVzdGF0dXM7CisgICAgaW50IHJldF9jb2RlID0gLTE7ICAgICAgICAgICAgLyogYXNzdW1lIGJhZCBwYWNrZXQgb3IgZXJyb3IgKi8KKworICAgIC8qCisgICAgICogd2UgbXVzdCBub3Qgb3ZlcmZsb3cgYnVmZmVyLCBhbmQgbXVzdCBzdGFydCBhZnRlcgorICAgICAqIHRoZSBleGlzdGluZyBkYXRhCisgICAgICovCisjaWZkZWYgQ09NUElMSU5HX09OX1dJTkRPV1MKKyAgICB7CisgICAgICAgIEJPT0wgZHVtbXkgPSBGQUxTRTsKKyAgICAgICAgbnJlYWQgPSBCeXRlc0luUlhCdWZmZXJTZXJpYWwoKTsKKworICAgICAgICBpZiAobnJlYWQgPiBNQVhSRUFEU0laRSAtIHJiaW5kZXgpCisgICAgICAgICAgICBucmVhZCA9IE1BWFJFQURTSVpFIC0gcmJpbmRleDsKKyAgICAgICAgcmVhZF9lcnJubyA9IFJlYWRTZXJpYWwocmVhZGJ1ZityYmluZGV4LCBucmVhZCwgJmR1bW15KTsKKyAgICAgICAgaWYgKHBmblByb2dyZXNzQ2FsbGJhY2sgIT0gTlVMTCAmJiByZWFkX2Vycm5vID09IENPTV9PSykKKyAgICAgICAgeworICAgICAgICAgICAgcHJvZ3Jlc3NJbmZvLm5SZWFkICs9IG5yZWFkOworICAgICAgICAgICAgKCpwZm5Qcm9ncmVzc0NhbGxiYWNrKSgmcHJvZ3Jlc3NJbmZvKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgbnJlYWQgPSBVbml4X1JlYWRTZXJpYWwocmVhZGJ1ZityYmluZGV4LCBNQVhSRUFEU0laRS1yYmluZGV4LCBibG9jayk7CisgICAgcmVhZF9lcnJubyA9IGVycm5vOworI2VuZGlmCisKKyAgICBpZiAoKG5yZWFkID4gMCkgfHwgKHJiaW5kZXggPiAwKSkKKyAgICB7CisjaWZkZWYgRE9fVFJBQ0UKKyAgICAgICAgcHJpbnRmKCJbJWRAJWRdICIsIG5yZWFkLCByYmluZGV4KTsKKyNlbmRpZgorCisgICAgICAgIGlmIChucmVhZCA+IDApCisgICAgICAgICAgICByYmluZGV4ID0gcmJpbmRleCArIG5yZWFkOworCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3RhdHVzID0gQW5nZWxfUnhFbmdpbmUocmVhZGJ1ZltjXSwgJihkYy0+ZGNfcGFja2V0KSwgJnJ4c3RhdGUpOworCisjaWZkZWYgRE9fVFJBQ0UKKyAgICAgICAgICAgIHByaW50ZigiPCUwMlggIixyZWFkYnVmW2NdKTsKKyNlbmRpZgorICAgICAgICAgICAgYysrOworICAgICAgICB9IHdoaWxlIChjIDwgcmJpbmRleCAmJgorICAgICAgICAgICAgICAgICAoKHJlc3RhdHVzID09IFJTX0lOX1BLVCkgfHwgKHJlc3RhdHVzID09IFJTX1dBSVRfUEtUKSkpOworCisjaWZkZWYgRE9fVFJBQ0UKKyAgICAgICAgcHJpbnRmKCJcbiIpOworI2VuZGlmCisKKyAgICAgICAgc3dpdGNoKHJlc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBSU19HT09EX1BLVDoKKyAgICAgICAgICAgICAgcmV0X2NvZGUgPSAxOworICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggdG86ICovCisKKyAgICAgICAgICBjYXNlIFJTX0JBRF9QS1Q6CisgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAqIFdlIG5vdyBuZWVkIHRvIHNodWZmbGUgYW55IGxlZnQgb3ZlciBkYXRhIGRvd24gdG8gdGhlCisgICAgICAgICAgICAgICAqIGJlZ2lubmluZyBvZiBvdXIgcHJpdmF0ZSBidWZmZXIgcmVhZHkgdG8gYmUgdXNlZAorICAgICAgICAgICAgICAgKmZvciB0aGUgbmV4dCBwYWNrZXQKKyAgICAgICAgICAgICAgICovCisjaWZkZWYgRE9fVFJBQ0UKKyAgICAgICAgICAgICAgcHJpbnRmKCJTZXJwYXJSZWFkKCkgcHJvY2Vzc2VkICVkLCBtb3ZpbmcgZG93biAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGMsIHJiaW5kZXggLSBjKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgIGlmIChjICE9IHJiaW5kZXgpCisgICAgICAgICAgICAgICAgICBtZW1tb3ZlKChjaGFyICopIHJlYWRidWYsIChjaGFyICopIChyZWFkYnVmICsgYyksIHJiaW5kZXggLSBjKTsKKworICAgICAgICAgICAgICByYmluZGV4IC09IGM7CisKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIFJTX0lOX1BLVDoKKyAgICAgICAgICBjYXNlIFJTX1dBSVRfUEtUOgorICAgICAgICAgICAgICByYmluZGV4ID0gMDsgICAgICAgICAgICAvKiB3aWxsIGhhdmUgcHJvY2Vzc2VkIGFsbCB3ZSBoYWQgKi8KKyAgICAgICAgICAgICAgcmV0X2NvZGUgPSAwOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisjaWZkZWYgREVCVUcKKyAgICAgICAgICAgICAgcHJpbnRmKCJCYWQgcmVfc3RhdHVzIGluIFNlcnBhclJlYWQoKVxuIik7CisjZW5kaWYKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAobnJlYWQgPT0gMCkKKyAgICAgICAgLyogbm90aGluZyB0byByZWFkICovCisgICAgICAgIHJldF9jb2RlID0gMDsKKyAgICBlbHNlIGlmIChyZWFkX2Vycm5vID09IEVSUk5PX0ZPUl9CTE9DS0VEX0lPKSAvKiBucmVhZCA8IDAgKi8KKyAgICAgICAgcmV0X2NvZGUgPSAwOworCisjaWZkZWYgREVCVUcKKyAgICBpZiAoKG5yZWFkIDwgMCkgJiYgKHJlYWRfZXJybm8gIT0gRVJSTk9fRk9SX0JMT0NLRURfSU8pKQorICAgICAgICBwZXJyb3IoInJlYWQoKSBlcnJvciBpbiBTZXJwYXJSZWFkKCkiKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJldF9jb2RlOworfQorCisvKgorICogIEZ1bmN0aW9uOiBzZW5kX3BhY2tldAorICogICBQdXJwb3NlOiBTZW5kIGEgc3RyZWFtIG9mIGJ5dGVzIHRvIEFuZ2VsIHRocm91Z2ggdGhlIHBhcmFsbGVsIHBvcnQKKyAqCisgKiBBbGdvcml0aG06IFdlIG5lZWQgdG8gcHJlc2VudCB0aGUgZGF0YSBpbiBhIGZvcm0gdGhhdCBhbGwgYm9hcmRzIGNhbgorICogICAgICAgICAgICBzd2FsbG93LiAgV2l0aCB0aGUgUElEIGJvYXJkLCB0aGlzIGlzIGEgcHJvYmxlbTogZm9yIHJlYXNvbnMKKyAqICAgICAgICAgICAgZGVzY3JpYmVkIGluIHRoZSBkcml2ZXIgKGFuZ2VsL3BpZC9zdDE2YzU1Mi5jKSwgZGF0YSBhcmUKKyAqICAgICAgICAgICAgc2VudCBhIG55YmJsZSBhdCBhIHRpbWUgb24gRDAtRDIgYW5kIEQ0OyBEMyBpcyB3aXJlZCB0byBBQ0ssCisgKiAgICAgICAgICAgIHdoaWNoIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQgd2hlbiBpdCBnb2VzIGxvdy4gIFRoaXMgcm91dGluZQorICogICAgICAgICAgICBmaWxscyBpbiBhbiBhcnJheSBvZiBueWJibGVzLCB3aXRoIEFDSyBjbGVhciBpbiBhbGwgYnV0IHRoZQorICogICAgICAgICAgICBsYXN0IG9uZS4gIElmLCBmb3Igd2hhdGV2ZXIgcmVhc29uLCB0aGUgd3JpdGUgZmFpbHMsIHRoZW4KKyAqICAgICAgICAgICAgQUNLIGlzIGZvcmNlZCBoaWdoICh0aGVyZWJ5IGVuYWJsaW5nIHRoZSBuZXh0IHdyaXRlIGEgY2hhbmNlCisgKiAgICAgICAgICAgIHRvIGJlIG5vdGljZWQgd2hlbiB0aGUgZmFsbGluZyBlZGdlIG9mIEFDSyBnZW5lcmF0ZXMgYW4KKyAqICAgICAgICAgICAgaW50ZXJydXB0IChob3BlZnVsbHkpLgorICoKKyAqICAgIFBhcmFtczoKKyAqICAgICAgIElucHV0OiB0eHN0YXRlIENvbnRhaW5zIHRoZSBwYWNrZXQgdG8gYmUgc2VudAorICoKKyAqICAgUmV0dXJuczogTnVtYmVyIG9mICpjb21wbGV0ZSogYnl0ZXMgd3JpdHRlbgorICovCisKK3N0YXRpYyBpbnQgU2VycGFyV3JpdGUoRHJpdmVyQ2FsbCAqZGMpCit7CisgICAgdGVfc3RhdHVzIHN0YXR1czsKKyAgICBpbnQgbndyaXR0ZW4gPSAwOworICAgIHN0YXRpYyBUeFN0YXRlIHR4c3RhdGU7CisKKyAgICAvKgorICAgICAqIGlzIHRoaXMgYSBuZXcgcGFja2V0PworICAgICAqLworICAgIGlmIChkYy0+ZGNfY29udGV4dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogeWVzIC0gaW5pdGlhbGlzZSBUeEVuZ2luZQorICAgICAgICAgKi8KKyAgICAgICAgQW5nZWxfVHhFbmdpbmVJbml0KCZjb25maWcsICZkYy0+ZGNfcGFja2V0LCAmdHhzdGF0ZS5zdGF0ZSk7CisKKyAgICAgICAgdHhzdGF0ZS5pbmRleCA9IDA7CisgICAgICAgIGRjLT5kY19jb250ZXh0ID0gJnR4c3RhdGU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBmaWxsIHRoZSBidWZmZXIgdXNpbmcgdGhlIFR4IEVuZ2luZQorICAgICAqLworICAgIGRvCisgICAgeworICAgICAgICBzdGF0dXMgPSBBbmdlbF9UeEVuZ2luZSgmZGMtPmRjX3BhY2tldCwgJnR4c3RhdGUuc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eHN0YXRlLndyaXRlYnVmW3R4c3RhdGUuaW5kZXhdKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBUU19JRExFKSB0eHN0YXRlLmluZGV4Kys7CisKKyAgICB9IHdoaWxlIChzdGF0dXMgPT0gVFNfSU5fUEtUICYmIHR4c3RhdGUuaW5kZXggPCBNQVhXUklURVNJWkUpOworCisjaWZkZWYgRE9fVFJBQ0UKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCBpID0gMDsKKworICAgICAgICB3aGlsZSAoaSA8IHR4c3RhdGUuaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiPiUwMlggIiwgdHhzdGF0ZS53cml0ZWJ1ZltpXSk7CisKKyAgICAgICAgICAgIGlmICghKCsraSAlIDE2KSkKKyAgICAgICAgICAgICAgICBwdXRjKCdcbicsIHN0ZG91dCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSAlIDE2KQorICAgICAgICAgICAgcHV0YygnXG4nLCBzdGRvdXQpOworICAgIH0KKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiB0aGUgZGF0YSBhcmUgcmVhZHksIGFsbCB3ZSBuZWVkIG5vdyBpcyB0byBzZW5kIHRoZW0gb3V0CisgICAgICogaW4gYSBmb3JtIHRoYXQgQW5nZWwgY2FuIHN3YWxsb3cuCisgICAgICovCisjaWZkZWYgQ09NUElMSU5HX09OX1dJTkRPV1MKKyAgaWYgKFdyaXRlUGFyYWxsZWwodHhzdGF0ZS53cml0ZWJ1ZiwgdHhzdGF0ZS5pbmRleCkgPT0gQ09NX09LKQorICB7CisgICAgbndyaXR0ZW4gPSB0eHN0YXRlLmluZGV4OworICAgIGlmIChwZm5Qcm9ncmVzc0NhbGxiYWNrICE9IE5VTEwpCisgICAgeworICAgICAgcHJvZ3Jlc3NJbmZvLm5Xcml0dGVuICs9IG53cml0dGVuOworICAgICAgKCpwZm5Qcm9ncmVzc0NhbGxiYWNrKSgmcHJvZ3Jlc3NJbmZvKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgICBNZXNzYWdlQm94KEdldEZvY3VzKCksICJXcml0ZSBlcnJvclxuIiwgIkFuZ2VsIiwgTUJfT0sgfCBNQl9JQ09OU1RPUCk7CisgICAgICByZXR1cm4gLTE7ICAgLyogU0ogLSBUaGlzIHJlYWxseSBuZWVkcyB0byByZXR1cm4gYSB2YWx1ZSwgd2hpY2ggaXMgcGlja2VkIHVwIGluICovCisgICAgICAgICAgICAgICAgICAgLyogICAgICBEZXZTV19SZWFkIGFzIG1lYW5pbmcgc3RvcCBkZWJ1Z2dlciBidXQgZG9uJ3Qga2lsbC4gKi8KKyAgfQorI2Vsc2UKKyAgICBud3JpdHRlbiA9IFVuaXhfV3JpdGVQYXJhbGxlbCh0eHN0YXRlLndyaXRlYnVmLCB0eHN0YXRlLmluZGV4KTsKKyNlbmRpZgorCisgICAgaWYgKG53cml0dGVuIDwgMCkgbndyaXR0ZW4gPSAwOworCisjaWZkZWYgRE9fVFJBQ0UKKyAgICBwcmludGYoIlNlcnBhcldyaXRlOiB3cm90ZSAlZCBvdXQgb2YgJWQgYnl0ZXNcbiIsCisgICAgICAgICAgIG53cml0dGVuLCB0eHN0YXRlLmluZGV4KTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBoYXMgdGhlIHdob2xlIHBhY2tldCBnb25lPworICAgICAqLworICAgIGlmIChud3JpdHRlbiA9PSAoaW50KXR4c3RhdGUuaW5kZXggJiYKKyAgICAgICAgKHN0YXR1cyA9PSBUU19ET05FX1BLVCB8fCBzdGF0dXMgPT0gVFNfSURMRSkpCisgICAgICAgIC8qCisgICAgICAgICAqIHllcyBpdCBoYXMKKyAgICAgICAgICovCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIGlmIHNvbWUgZGF0YSBhcmUgbGVmdCwgc2h1ZmZsZSB0aGVtCisgICAgICAgICAqIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyCisgICAgICAgICAqLworICAgICAgICBpZiAobndyaXR0ZW4gIT0gKGludCl0eHN0YXRlLmluZGV4ICYmIG53cml0dGVuICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHR4c3RhdGUuaW5kZXggLT0gbndyaXR0ZW47CisgICAgICAgICAgICAodm9pZCltZW1tb3ZlKChjaGFyICopIHR4c3RhdGUud3JpdGVidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopICh0eHN0YXRlLndyaXRlYnVmICsgbndyaXR0ZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eHN0YXRlLmluZGV4KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChud3JpdHRlbiA9PSAoaW50KXR4c3RhdGUuaW5kZXgpCisgICAgICAgICAgICB0eHN0YXRlLmluZGV4ID0gMDsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgc2VycGFyX3Jlc2V0KHZvaWQpCit7CisjaWZkZWYgQ09NUElMSU5HX09OX1dJTkRPV1MKKyAgICBGbHVzaFBhcmFsbGVsKCk7CisgICAgRmx1c2hTZXJpYWwoKTsKKyNlbHNlCisgICAgVW5peF9SZXNldFBhcmFsbGVsKCk7CisgICAgVW5peF9SZXNldFNlcmlhbCgpOworI2VuZGlmCisKKyAgICByZXR1cm4gc2VycGFyX3NldF9wYXJhbXMoJnNlcnBhcl9kZWZhdWx0cyk7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9iYXVkX3JhdGUodW5zaWduZWQgaW50ICpzcGVlZCkKK3sKKyAgICBzdGF0aWMgc3RydWN0CisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgYmF1ZDsKKyAgICAgICAgaW50IHRlcm1pb3NWYWx1ZTsKKyAgICB9IHBvc3NpYmxlQmF1ZFJhdGVzW10gPQorICAgICAgeworI2lmIGRlZmluZWQoX19ocHV4KQorICAgICAgICAgIHsxMTUyMDAsIF9CMTE1MjAwfSwgezU3NjAwLCBfQjU3NjAwfSwKKyNlbmRpZgorI2lmZGVmIENPTVBJTElOR19PTl9XSU5ET1dTCisgICAgICAgIHszODQwMCwgQ0JSXzM4NDAwfSwgezE5MjAwLCBDQlJfMTkyMDB9LCB7OTYwMCwgQ0JSXzk2MDB9LCB7MCwgMH0KKyNlbHNlCisgICAgICAgIHszODQwMCwgQjM4NDAwfSwgezE5MjAwLCBCMTkyMDB9LCB7OTYwMCwgQjk2MDB9LCB7MCwgMH0KKyNlbmRpZgorICAgIH07CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICAvKiBsb29rIGZvciBsb3dlciBvciBtYXRjaGluZyAtLSB3aWxsIGFsd2F5cyB0ZXJtaW5hdGUgYXQgMCBlbmQgbWFya2VyICovCisgICAgZm9yIChpID0gMDsgcG9zc2libGVCYXVkUmF0ZXNbaV0uYmF1ZCA+ICpzcGVlZDsgKytpKQorICAgICAgICAvKiBkbyBub3RoaW5nICovCisgICAgICAgIDsKKworICAgIGlmIChwb3NzaWJsZUJhdWRSYXRlc1tpXS5iYXVkID4gMCkKKyAgICAgICAqc3BlZWQgPSBwb3NzaWJsZUJhdWRSYXRlc1tpXS5iYXVkOworCisgICAgcmV0dXJuIHBvc3NpYmxlQmF1ZFJhdGVzW2ldLnRlcm1pb3NWYWx1ZTsKK30KKworc3RhdGljIGludCBzZXJwYXJfc2V0X3BhcmFtcyhjb25zdCBQYXJhbWV0ZXJDb25maWcgKmNvbmZpZykKK3sKKyAgICB1bnNpZ25lZCBpbnQgc3BlZWQ7CisgICAgaW50IHRlcm1pb3NfdmFsdWU7CisKKyNpZmRlZiBERUJVRworICAgIHByaW50Zigic2VycGFyX3NldF9wYXJhbXNcbiIpOworI2VuZGlmCisKKyAgICBpZiAoIUFuZ2VsX0ZpbmRQYXJhbShBUF9CQVVEX1JBVEUsIGNvbmZpZywgJnNwZWVkKSkKKyAgICB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgcHJpbnRmKCJzcGVlZCBub3QgZm91bmQgaW4gY29uZmlnXG4iKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gREVfT0tBWTsKKyAgICB9CisKKyAgICB0ZXJtaW9zX3ZhbHVlID0gZmluZF9iYXVkX3JhdGUoJnNwZWVkKTsKKyAgICBpZiAodGVybWlvc192YWx1ZSA9PSAwKQorICAgIHsKKyNpZmRlZiBERUJVRworICAgICAgICBwcmludGYoInNwZWVkIG5vdCB2YWxpZDogJXVcbiIsIHNwZWVkKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gREVfT0tBWTsKKyAgICB9CisKKyNpZmRlZiBERUJVRworICAgIHByaW50Zigic2V0dGluZyBzcGVlZCB0byAldVxuIiwgc3BlZWQpOworI2VuZGlmCisKKyNpZmRlZiBDT01QSUxJTkdfT05fV0lORE9XUworICAgIFNldEJhdWRSYXRlKChXT1JEKXRlcm1pb3NfdmFsdWUpOworI2Vsc2UKKyAgICBVbml4X1NldFNlcmlhbEJhdWRSYXRlKHRlcm1pb3NfdmFsdWUpOworI2VuZGlmCisKKyAgICByZXR1cm4gREVfT0tBWTsKK30KKworCitzdGF0aWMgaW50IHNlcnBhcl9nZXRfdXNlcl9wYXJhbXMoUGFyYW1ldGVyT3B0aW9ucyAqKnBfb3B0aW9ucykKK3sKKyNpZmRlZiBERUJVRworICAgIHByaW50Zigic2VycGFyX2dldF91c2VyX3BhcmFtc1xuIik7CisjZW5kaWYKKworICAgIGlmICh1c2VyX29wdGlvbnNfc2V0KQorICAgIHsKKyAgICAgICAgKnBfb3B0aW9ucyA9ICZ1c2VyX29wdGlvbnM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwX29wdGlvbnMgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBERV9PS0FZOworfQorCisKK3N0YXRpYyBpbnQgc2VyaWFsX2dldF9kZWZhdWx0X3BhcmFtcyggY29uc3QgUGFyYW1ldGVyQ29uZmlnICoqcF9jb25maWcgKQoreworI2lmZGVmIERFQlVHCisgICAgcHJpbnRmKCAic2VyaWFsX2dldF9kZWZhdWx0X3BhcmFtc1xuIiApOworI2VuZGlmCisKKyAgICAqcF9jb25maWcgPSAmc2VycGFyX2RlZmF1bHRzOworICAgIHJldHVybiBERV9PS0FZOworfQorCisKK3N0YXRpYyBpbnQgU2VycGFySW9jdGwoY29uc3QgaW50IG9wY29kZSwgdm9pZCAqYXJncykKK3sKKyAgICBpbnQgcmV0X2NvZGU7CisKKyNpZmRlZiBERUJVRworICAgIHByaW50ZigiU2VycGFySW9jdGw6IG9wICVkIGFyZyAlcFxuIiwgb3Bjb2RlLCBhcmdzID8gYXJncyA6ICI8TlVMTD4iKTsKKyNlbmRpZgorCisgICAgc3dpdGNoIChvcGNvZGUpCisgICAgeworICAgICAgIGNhc2UgRENfUkVTRVQ6CisgICAgICAgICAgIHJldF9jb2RlID0gc2VycGFyX3Jlc2V0KCk7CisgICAgICAgICAgIGJyZWFrOworCisgICAgICAgY2FzZSBEQ19TRVRfUEFSQU1TOgorICAgICAgICAgICByZXRfY29kZSA9IHNlcnBhcl9zZXRfcGFyYW1zKChjb25zdCBQYXJhbWV0ZXJDb25maWcgKilhcmdzKTsKKyAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIERDX0dFVF9VU0VSX1BBUkFNUzoKKyAgICAgICAgICAgcmV0X2NvZGUgPSBzZXJwYXJfZ2V0X3VzZXJfcGFyYW1zKChQYXJhbWV0ZXJPcHRpb25zICoqKWFyZ3MpOworICAgICAgICAgICBicmVhazsKKworICAgICAgIGNhc2UgRENfR0VUX0RFRkFVTFRfUEFSQU1TOgorICAgICAgICAgICByZXRfY29kZSA9CisgICAgICAgICAgICAgICBzZXJpYWxfZ2V0X2RlZmF1bHRfcGFyYW1zKChjb25zdCBQYXJhbWV0ZXJDb25maWcgKiopYXJncyk7CisgICAgICAgICAgIGJyZWFrOworCisgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgcmV0X2NvZGUgPSBERV9CQURfT1A7CisgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gcmV0X2NvZGU7Cit9CisKK0RldmljZURlc2NyIGFuZ2VsX1NlcnBhckRldmljZSA9Cit7CisgICAgIlNFUlBBUiIsCisgICAgU2VycGFyT3BlbiwKKyAgICBTZXJwYXJNYXRjaCwKKyAgICBTZXJwYXJDbG9zZSwKKyAgICBTZXJwYXJSZWFkLAorICAgIFNlcnBhcldyaXRlLAorICAgIFNlcnBhcklvY3RsCit9OworCisvKiBFT0Ygc2VycGFyZHIuYyAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS9zeXMuaCBiL2dkYi9yZGktc2hhcmUvc3lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4YWM3OAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZGktc2hhcmUvc3lzLmgKQEAgLTAsMCArMSwzMTkgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qIHN5cy5oIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBbmdlbCBDIExpYmFyeSBzdXBwb3J0IGNoYW5uZWwgcHJvdG9jb2wgZGVmaW5pdGlvbnMKKyAqCisgKiAkUmV2aXNpb24kCisgKiAgICAgJERhdGUkCisgKgorICoKKyAqCisgKgorICogTUVTU0FHRSBGT1JNQVQKKyAqIC0tLS0tLS0tLS0tLS0tCisgKiBGb3JtYXQgb2YgdGhlICJkYXRhIiBzZWN0aW9uIG9mIEMgTGliIFN1cHBvcnQgQ2hhbm5lbCBNZXNzYWdlcy4KKyAqIFlvdSB3aWxsIG5vdGljZSB0aGF0IHRoZSBmb3JtYXQgaXMgbXVjaCB0aGUgc2FtZSBhcyB0aGUgZm9ybWF0CisgKiBvZiBBRFAgbWVzc2FnZXMgLSB0aGlzIGlzIHNvIHRoYXQgbXVsdGktdGhyZWFkZWQgQyBMaWJyYXJpZXMgY2FuCisgKiBiZSBzdXBwb3J0ZWQuCisgKgorICogIHVuc2lnbmVkMzIgcmVhc29uICAgICAtIE1haW4gQyBMaWJyYXJ5IHJlYXNvbiBjb2RlLgorICogIHVuc2lnbmVkMzIgZGVidWdJRCAgICAtIEluZm8uIGRlc2NyaWJpbmcgaG9zdCBkZWJ1ZyB3b3JsZDsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHRvIGhvc3QgYW5kIHVzZWQgaW4gYW55IHRhcmdldAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYXRlZCBtZXNzYWdlcy4KKyAqICB1bnNpZ25lZDMyIE9TaW5mbzEgICAgXCBUYXJnZXQgT1MgaW5mb3JtYXRpb24gdG8gaWRlbnRpZnkgcHJvY2Vzcy90aHJlYWQKKyAqICB1bnNpZ25lZDMyIE9TaW5mbzIgICAgLyB3b3JsZCwgZXRjLiBUaGVzZSB0d28gZmllbGRzIGFyZSB0YXJnZXQgZGVmaW5lZC4KKyAqICBieXRlICAgICAgIGFyZ3Nbbl0gICAgLSBEYXRhIGZvciBtZXNzYWdlICJyZWFzb24iIGNvZGUuCisgKgorICogVGhlICJkZWJ1Z0lEIiBpcyBkZWZpbmVkIGJ5IHRoZSBob3N0LWVuZCBvZiB0aGUgcHJvdG9jb2wsIGFuZCBpcyB1c2VkCisgKiBieSB0aGUgaG9zdCB0byBlbnN1cmUgdGhhdCBtZXNzYWdlcyBhcmUgcm91dGVkIHRvIHRoZSBjb3JyZWN0IGhhbmRsZXIKKyAqIHByb2dyYW0vdmVuZWVyIChlZy4gaW1hZ2luZSBzZXZlcmFsIHRocmVhZHMgaGF2aW5nIG9wZW5lZCBzdGRvdXQgYW5kCisgKiBlYWNoIHdyaXRpbmcgdG8gYSBkaWZmZXJlbnQgd2luZG93IGluIGEgd2luZG93ZWQgZGVidWdnZXIpLgorICoKKyAqIE5PVEU6IFRoZSByZWFzb24gdGhhdCB0aGVyZSBpcyBubyAic2l6ZSIgaW5mb3JtYXRpb24sIGlzIHRoYXQgdGhlCisgKiBtZXNzYWdlIElEcyB0aGVtc2VsdmVzIGVuY29kZSB0aGUgZm9ybWF0IG9mIGFueSBhcmd1bWVudHMuCisgKgorICogRm9yIGZ1cnRoZXIgZGlzY3Vzc2lvbiBvZiB0aGUgZm9ybWF0IHNlZSBhZHAuaAorICoKKyAqIE4uQi4gQWxsIHN0cmVhbXMgYXJlIGxpdHRsZSBlbmRpYW4uCisgKgorICogQ0xJQiBSRUFTT04gQ09ERQorICogLS0tLS0tLS0tLS0tLS0tLQorICogVGhlIG1lc3NhZ2UgcmVhc29uIGNvZGVzIGNvbnRhaW4gc29tZSBpbmZvcm1hdGlvbiB0aGF0IHRpZXMgdGhlbSB0bworICogdGhlIGNoYW5uZWwgYW5kIGRpcmVjdGlvbiB0aGF0IHRoZSBtZXNzYWdlIHdpbGwgYmUgdXNlZCB3aXRoLiBUaGlzCisgKiB3aWxsIGVuc3VyZSB0aGF0IGV2ZW4gaWYgdGhlIG1lc3NhZ2UgIiNkZWZpbmUgbmFtZSIgaXMgbm90CisgKiBjb21wbGV0ZWx5IGRlc2NyaXB0aXZlLCB0aGUgbWVzc2FnZSByZWFzb24gY29kZSBpcy4KKyAqCisgKiAgICAgIGIzMSAgICA9IGRpcmVjdGlvbi4gMD1Ib3N0LXRvLVRhcmdldDsgMT1UYXJnZXQtdG8tSG9zdDsKKyAqICAgICAgYjMwLTE2ID0gcmVzZXJ2ZWQuIHNob3VsZCBiZSB6ZXJvCisgKiAgICAgIGIxNS0wICA9IG1lc3NhZ2UgcmVhc29uIGNvZGUuCisgKgorICogTm90ZSB0aGF0IHR5cGljYWxseSBhIHJlcXVlc3Qgd2lsbCBiZSBpbml0aWF0ZWQgYnkgdGhlIHRhcmdldCBzaWRlLCBhbmQKKyAqIHRoYXQgdGhlIGhvc3Qgd2lsbCB0aGVuIHJlc3BvbmQgd2l0aCBlaXRoZXIgYW4gYWNrbm93bGVkZ2VtZW50IG9yIHNvbWUKKyAqIGRhdGEuICBJbiBlaXRoZXIgY2FzZSB0aGUgc2FtZSByZWFzb24gY29kZSB3aWxsIGJlIHVzZWQsIGJ1dCB0aGUgZGlyZWN0aW9uCisgKiBiaXQgd2lsbCBiZSByZXZlcmVzZWQuCisgKi8KKworI2lmbmRlZiBfX3N5c19oCisjZGVmaW5lIF9fc3lzX2gKKworI2lmbmRlZiBIdG9UCisjZGVmaW5lIEh0b1QgICAgKCh1bnNpZ25lZCkwIDw8IDMxKSAgICAgLyogSG9zdC10by1UYXJnZXQgbWVzc2FnZSAqLworI2RlZmluZSBUdG9IICAgICgodW5zaWduZWQpMSA8PCAzMSkgICAgIC8qIFRhcmdldC10by1Ib3N0IG1lc3NhZ2UgKi8KKyNlbmRpZgorCisvKgorICogVGhlIGZvbGxvd2luZyBhcmUgZXJyb3IgY29kZXMgdXNlZCBpbiB0aGUgc3RhdHVzIGZpZWxkIHJldHVybmVkIG9uCisgKiBzZW5kaW5nIGEgbWVzc2FnZS4gMCByZXByZXNlbnRzIG5vIGVycm9yIGhhdmluZyBvY2N1cnJlZCwgbm9uLXplcm8KKyAqIHJlcHJlc2VudHMgYSBnZW5lcmFsIGVycm9yLiAgTW9yZSBjb2RlcyBzaG91bGQgYmUgYWRkZWQgYXMgcmVxdWlyZWQuCisgKi8KKyAKKyNpZm5kZWYgRXJyQ29kZQorI2RlZmluZSBOb0Vycm9yICAweDAKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoZSBmb2xsb3dpbmcgYXJlIGRpcmVjdCBjb252ZXJzaW9ucyBvZiB0aGUgRGVNb24gU1dJJ3MgICAgICAgICAgICAgICAqLworLyogTkI6IG5ieXRlcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIElOQ0xVRElORyBUSEUgTlVMTCBjaGFyYWN0ZXIgd2hlcmUgICovCisvKiAgICAgYXBwbGljYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogVGhpcyBtZXNzYWdlIGlzIHVzZWQgYXMgYSAgcmVzcG9uc2UgdG8gYSBwYWNrZXQgd2hvc2UgbWVzc2FnZQorICogd2FzIG5vdCB1bmRlcnN0b29kLiAgVGhlIHJldHVybiBwYXJhbWV0ZXIsIGNvZGUgaXMgdGhlIHJlYXNvbgorICogY29kZSB3aGljaCB3YXMgbm90IHVuZGVyc3Rvb2QuIEFsdGhvdWdoIGludGVuZGVkIGZvciB1c2UgYXMgYQorICogZGVmYXVsdCBjYXNlIG9uIGEgcmVjZWl2ZWQgbWVzc2FnZSBzd2l0Y2ggaXQgY2FuIGFsc28gYmUgdXNlZAorICogYXMgYSAgcHJvcGVyIG1lc3NhZ2UqLworI2RlZmluZSBDTF9VbnJlY29nbmlzZWQgICAgICAgICAgMHgwMAorICAgIC8qIFVucmVjb2duaXNlZCgpCisgICAgICogcmV0dXJuKHdvcmQgY29kZSkKKyAgICAgKi8KKworLyogV3JpdGUgYSBjaGFyYWN0ZXIgdG8gdGhlIHRlcm1pbmFsLgorICovCisjZGVmaW5lIENMX1dyaXRlQyAgICAgICAweDAxCisgICAvKiBXcml0ZUMoYnl0ZSBkYXRhKQorICAgICogcmV0dXJuKHdvcmQgc3RhdHVzKQorICAgICovCisKKy8qIFdyaXRlIGEgTlVMTCB0ZXJtaW5hdGVkIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHRvIHRoZSB0ZXJtaW5hbC4gIFRoZSBsZW5ndGgKKyAqIG9mIHRoZSBzdHJpbmcgZXhjbHVkaW5nIHRoZSBOVUxMIHRlcm1pbmF0aW5nIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4gCisgKiAnbmJ5dGVzJy4KKyAqLworI2RlZmluZSBDTF9Xcml0ZTAgICAgICAgMHgwMgorICAgLyogV3JpdGUwKHdvcmQgbmJ5dGVzLCBieXRlcyBkYXRhKQorICAgICogcmV0dXJuKHdvcmQgc3RhdHVzKQorICAgICovCisKKy8qIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgdGVybWluYWwgLSBwcm9iYWJseSB0aGUga2V5Ym9hcmQuCisgKi8KKyNkZWZpbmUgQ0xfUmVhZEMgICAgICAgIDB4MDQKKyAgIC8qIFJlYWRDKHZvaWQpCisgICAgKiByZXR1cm4od29yZCBzdGF0dXMsIGJ5dGUgZGF0YSkKKyAgICAqLworCisvKiBQZXJmb3JtIHN5c3RlbSBjYWxsLCBwYXNzIE5VTEwgdGVybWluYXRlZCBzdHJpbmcgdG8gaG9zdCdzIGNvbW1hbmQKKyAqIGxpbmUgaW50ZXJwcmV0ZXIoTk9UIEFWQUlMQUJMRSBJTiBQQy9ET1MgUkVMRUFTRSkuICBUaGUgZGF0YSBieXRlCisgKiByZXR1cm5lZCBob2xkcyB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgc3lzdGVtIGNhbGwuCisgKi8gCisjZGVmaW5lIENMX1N5c3RlbSAgICAgICAweDA1CisgICAvKiBDTEkod29yZCBuYnl0ZXMsIGJ5dGVzIGRhdGEpCisgICAgKiByZXR1cm4od29yZCBzdGF0dXMsIHdvcmQgZGF0YSkKKyAgICAqLworCisvKiBJdCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBudWxsIHRlcm1pbmF0ZWQgY29tbWFuZCBsaW5lIHN0cmluZyB1c2VkIHRvCisgKiBpbnZva2UgdGhlIHByb2dyYW0uIHN0YXR1cyB3aWxsIGJlIHNldCB0byBOb0Vycm9yIGlmIHRoZSBjb21tYW5kIGxpbmUKKyAqIGNhbiBiZSByZXR1cm5lZC4gT3RoZXIgc3RhdHVzIHZhbHVlcyB3aWxsIGJlIHRyZWF0ZWQgYXMgZXJyb3IgY29uZGl0aW9ucy4KKyAqLworI2RlZmluZSBDTF9HZXRDbWRMaW5lICAgMHgxMAorICAgLyogR2V0Q21kTGluZSh2b2lkKQorICAgICogcmV0dXJuKHdvcmQgc3RhdHVzLCB3b3JkIG5ieXRlcywgYnl0ZXMgYXJnbGluZSkKKyAgICAqLworCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjZW50aS1zZWNvbmRzIHNpbmNlIHRoZSBzdXBwb3J0IGNvZGUgYmVnYW4gCisgKiBleGVjdXRpb24uICBPbmx5IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc3VjY2Vzc2l2ZSBjYWxscyBjYW4gYmUKKyAqIG1lYW5pbmdmdWwuCisgKi8KKyNkZWZpbmUgQ0xfQ2xvY2sgICAgICAgIDB4NjEKKyAgIC8qIENsb2NrKHZvaWQpCisgICAgKiByZXR1cm4od29yZCBzdGF0dXMsIHdvcmQgY2xrcykKKyAgICAqLworCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgMTk3MC4KKyAqLworI2RlZmluZSBDTF9UaW1lICAgICAgICAgMHg2MworICAgLyogVGltZSh2b2lkKQorICAgICogcmV0dXJuKHdvcmQgc3RhdHVzLCB3b3JkIHRpbWUpCisgICAgKi8KKworLyogRGVsZXRlKHJlbW92ZSwgdW4tbGluaywgd2lwZSwgZGVzdHJveSkgdGhlIGZpbGUgbmFtZWQgYnkgdGhlCisgKiBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nICduYW1lJy4KKyAqLworI2RlZmluZSBDTF9SZW1vdmUgICAgICAgMHg2NAorICAgLyogUmVtb3ZlKHdvcmQgbmJ5dGVzLCBieXRlcyBuYW1lKQorICAgICogcmV0dXJuKHdvcmQgc3RhdHVzKQorICAgICovCisKKy8qIFJlbmFtZSB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgdGhlIE5VTEwtdGVybWluYXRlZCBzdHJpbmcgJ29uYW1lJworICogdG8gJ25uYW1lJy4KKyAqLyAgIAorI2RlZmluZSBDTF9SZW5hbWUgICAgICAgMHg2NQorICAgLyogUmVuYW1lKHdvcmQgbmJ5dGVzLCBieXRlcyBvbmFtZSwgd29yZCBuYnl0ZXMsIGJ5dGVzIG5uYW1lKQorICAgICogcmV0dXJuKHdvcmQgc3RhdHVzKQorICAgICovCisKKy8qICduYW1lJyBzcGVjaWZpZXMgYSBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgYSBmaWxlIG5hbWUgb3IgYQorICogZGV2aWNlIG5hbWUuICBPcGVucyB0aGUgZmlsZS9kZXZpY2UgYW5kIHJldHVybnMgYSBub24temVybyBoYW5kbGUgb24KKyAqIHN1Y2Nlc3MgdGhhdCBjYW4gYmUgcXVvdGVkIHRvIENMX0Nsb3NlLCBDTF9SZWFkLCBDTF9Xcml0ZSwgQ0xfU2VlaywKKyAqIENMX0ZsZW4gb3IgQ0xfSXNUVFkuICBUaGUgbW9kZSBpcyBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSAwLTExOi0KKyAqCisgKiBNb2RlOiAgICAgICAgICAgICAgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIDEwICAgMTEKKyAqIEFOU0kgQyBmb3BlbiBtb2RlOiByICAgcmIgIHIrICByK2IgdyAgIHdiICB3KyAgdytiIGEgICBhYiAgYSsgICBhK2IKKyAqCisgKiBWYWx1ZXMgMTItMTUgYXJlIGlsbGVnYWwuICBJZiAnbmFtZScgaXMgIjp0dCIgdGhlIHN0ZGluL3N0ZG91dCBpcworICogb3BlbmVkIGRlcGVuZGluZyBvbiB3aGV0aGVyICdtb2RlJyBpcyByZWFkIG9yIHdyaXRlLgorICovIAorI2RlZmluZSBDTF9PcGVuICAgICAgICAgMHg2NgorICAgLyogT3Blbih3b3JkIG5ieXRlcywgYnl0ZXMgbmFtZSwgd29yZCBtb2RlKQorICAgICogcmV0dXJuKHdvcmQgaGFuZGxlKQorICAgICovCisKKy8qICdoYW5kbGUnIGlzIGEgZmlsZSBoYW5kbGUgcHJldmlvdXNseSByZXR1cm5lZCBieSBDTF9PcGVuLiAgQ0xfQ2xvc2UKKyAqIGNsb3NlcyB0aGUgZmlsZS4KKyAqLyAKKyNkZWZpbmUgQ0xfQ2xvc2UgICAgICAgIDB4NjgKKyAgIC8qIENsb3NlKHdvcmQgaGFuZGxlKQorICAgICogcmV0dXJuKHdvcmQgc3RhdHVzKQorICAgICovCisKKy8qIFdyaXRlcyBkYXRhIG9mIGxlbmd0aCBuYnl0ZXMgdG8gdGhlIGZpbGUvZGV2aWNlIHNwZWNpZmllZCBieQorICogaGFuZGxlLiAgbmJ0b3RhbCByZXByZXNlbnRzIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUKKyAqIHdyaXR0ZW4sIHdoZXJlYXMgbmJ5dGVzIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyBwYWNrZXQKKyAqCisgKiBJZiBuYnRvdGFsIGlzIDw9IERBVEFTSVpFIC0gQ0xfV3JpdGUgbWVzc2FnZSBoZWFkZXIgc2l6ZSBpbiB0aGUKKyAqIHBhY2tldCB0aGVuIG5ieXRlcyA9IG5idG90YWwgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgbm90IHdyaXR0ZW4KKyAqIGlzIHJldHVybmVkLiAgSWYgbmJ0b3RhbCBpcyA+IHRoZSBwYWNrZXQgc2l6ZSB0aGVuIHRoZSBDTF9Xcml0ZQorICogbXVzdCBiZSBmb2xsb3dlZCBieSBhIG51bWJlciBvZiBDTF9Xcml0ZVgncyB0byBjb21wbGV0ZSB0aGUgd3JpdGUsCisgKiB0aGUgbmJ5dGVzIHJldHVybmVkIGJ5IENMX1dyaXRlIGNhbiBiZSBpZ25vcmVkCisgKiBJZiB0aGUgc3RhdHVzIHdvcmQgcmV0dXJuZWQgaXMgbm9uIHplcm8sIGFuIGVycm9yIGhhcyBvY2N1cnJlZCBhbmQKKyAqIHRoZSB3cml0ZSByZXF1ZXN0IGhhcyBiZWVuIGFib3J0ZWQuCisgKiAKKyAqLworI2RlZmluZSBDTF9Xcml0ZSAgICAgICAgMHg2OQorICAgLyogV3JpdGUod29yZCBoYW5kbGUsIHdvcmQgbmJ0b3RhbCwgd29yZCBuYnl0ZXMsIGJ5dGVzIGRhdGEpCisgICAgKiByZXR1cm4od29yZCBzdGF0dXMsIHdvcmQgbmJ5dGVzKQorICAgICovCisKKy8qIFdyaXRlIEV4dGVuc2lvbiBpcyBhIHJlYWRzIGEgY29udGludWF0aW9uIG9mIGRhdGEgZnJvbSBhIENMX1dyaXRlIAorICogd2hpY2ggd2FzIHRvbyBiaWcgdG8gZml0IGluIGEgc2luZ2xlIHBhY2tldC4KKyAqIG5ieXRlcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgaW4gdGhpcyBwYWNrZXQsIHRoZSAKKyAqIHJldHVybmVkIHZhbHVlIG9mIG5ieXRlcyBjYW4gYmUgaWdub3JlZCBleGNlcHQgaWYgaXQgaXMgdGhlIAorICogbGFzdCBwYWNrZXQsIGluIHdoaWNoIGNhc2UgaXQgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdlcmUgTk9UCisgKiB3cml0dGVuIAorICovCisjZGVmaW5lIENMX1dyaXRlWCAgICAgICAweDZBCisgICAvKiBXcml0ZVgod29yZCBuYnl0ZXMsIGJ5dGVzIGRhdGEpCisgICAgKiByZXR1cm4od29yZCBzdGF0dXMsIHdvcmQgbmJ5dGVzKQorICAgICovCisKKy8qIFJlYWRzICduYnl0ZXMnIGZyb20gdGhlIGZpbGUvZGV2aWNlIHNwZWNpZmllZCBieSAnaGFuZGxlJy4KKyAqCisgKiBJZiBuYnl0ZXMgPD0gREFUQVNJWkUgdGhlbiB0aGUgcmVhZCB3aWxsIG9jY3VyIGluIGEgc2luZ2xlIHBhY2tldAorICogYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSBvZiBuYnl0ZXMgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5CisgKiByZWFkIGFuZCBuYm1vcmUgd2lsbCBiZSAwLiBJZiBuYnl0ZXM+IERBVEFTSVpFIHRoZW4gbXVsdGlwbGUgcGFja2V0cworICogd2lsbCBoYXZlIHRvIGJlIHVzZWQgaWUgQ0xfUmVhZCBmb2xsb3dlZCBieSAxIG9yIG1vcmUgQ0xfUmVhZFgKKyAqIHBhY2tldHMuIEluIHRoaXMgY2FzZSBDTF9SZWFkIHdpbGwgcmV0dXJuIG5ieXRlcyByZWFkIGluIHRoZSBjdXJyZW50CisgKiBwYWNrZXQgYW5kIG5ibW9yZSByZXByZXNlbnRpbmcgaG93IG1hbnkgbW9yZSBieXRlcyBhcmUgZXhwZWN0ZWQgdG8gYmUKKyAqIHJlYWQKKyAqIElmIHRoZSBzdGF0dXMgd29yZCBpcyBub24gemVybyB0aGVuIHRoZSByZXF1ZXN0IGhhcyBjb21wbGV0ZWQgd2l0aCBhbgorICogZXJyb3IuIElmIHRoZSBzdGF0dXMgd29yZCBpcyAweEZGRkZGRkZGICgtMSkgdGhlbiBhbiBFT0YgY29uZGl0aW9uCisgKiBoYXMgYmVlbiByZWFjaGVkLgorICovCisjZGVmaW5lIENMX1JlYWQgICAgICAgICAweDZCCisgICAvKiBSZWFkKHdvcmQgaGFuZGxlLCB3b3JkIG5ieXRlcykKKyAgICAqIHJldHVybih3b3JkIHN0YXR1cywgd29yZCBuYnl0ZXMsIHdvcmQgbmJtb3JlLCBieXRlcyBkYXRhKQorICAgICovCisKKy8qIFJlYWQgZVh0ZW5zaW9uIHJldHVybnMgYSBjb250aW51YXRpb24gb2YgdGhlIGRhdGEgdGhhdCB3YXMgb3BlbmVkIGZvcgorICogcmVhZCBpbiB0aGUgZWFybGllciBDTF9SZWFkLiBUaGUgcmV0dXJuIHZhbHVlIG5ieXRlcyBpcyB0aGUgbnVtYmVyIG9mCisgKiBkYXRhIGJ5dGVzIGluIHRoZSBwYWNrZXQsIG5ibW9yZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG1vcmUgdGhhdCBhcmUKKyAqIGV4cGVjdGVkIHRvIGJlIHJlYWQgaW4gc3Vic2VxdWVudCBwYWNrZXRzLgorICovCisjZGVmaW5lIENMX1JlYWRYICAgICAgICAweDZDCisgIC8qIFJlYWRYKCkKKyAgICogcmV0dXJuKHdvcmQgc3RhdHVzLCB3b3JkIG5ieXRlcywgd29yZCBuYm1vcmUsIGJ5dGVzIGRhdGEpCisgICAqLworCisvKiBTZWVrcyB0byBieXRlIHBvc2l0aW9uICdwb3NuJyBpbiB0aGUgZmlsZS9kZXZpY2Ugc3BlY2lmaWVkIGJ5ICdoYW5kbGUnLgorICovCisjZGVmaW5lIENMX1NlZWsgICAgICAgICAweDZECisgICAvKiBTZWVrKHdvcmQgaGFuZGxlLCB3b3JkIHBvc24pCisgICAgKiByZXR1cm4od29yZCBzdGF0dXMpCisgICAgKi8KKworLyogUmV0dXJucyB0aGUgY3VycmVudCBsZW5ndGggb2YgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5ICdoYW5kbGUnIGluICdsZW4nLgorICogSWYgYW4gZXJyb3Igb2NjdXJzICdsZW4nIGlzIHNldCB0byAtMS4gCisgKi8gCisjZGVmaW5lIENMX0ZsZW4gICAgICAgICAweDZFCisgICAvKiBGbGVuKHdvcmQgaGFuZGxlKQorICAgICogcmV0dXJuKHdvcmQgbGVuKQorICAgICovCisKKy8qIFJldHVybnMgTm9FcnJvciBpZiAnaGFuZGxlJyBzcGVjaWZpZXMgYW4gaW50ZXJhY3RpdmUgZGV2aWNlLCBvdGhlcndpc2UKKyAqIHJldHVybnMgR2VuRXJyb3IKKyAqLyAKKyNkZWZpbmUgQ0xfSXNUVFkgICAgICAgIDB4NkYKKyAgIC8qIElzVFRZKHdvcmQgaGFuZGxlKQorICAgICogcmV0dXJuKHdvcmQgc3RhdHVzKQorICAgICovCisKKy8qIFJldHVybnMgYSB0ZW1wb3JhcnkgaG9zdCBmaWxlIG5hbWUuIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGZpbGUgbmFtZQorICogaXMgcGFzc2VkIHRvIHRoZSBob3N0LiBUaGUgVGFyZ2V0SUQgaXMgc29tZSBpZGVudGlmaWVyIGZyb20gdGhlIHRhcmdldAorICogZm9yIHRoaXMgcGFydGljdWxhciB0ZW1wb3JhcnkgZmlsZW5hbWUuIFRoaXMgdmFsdWUgaXMgY291bGQgYmUgdXNlZAorICogZGlyZWN0bHkgaW4gdGhlIGdlbmVyYXRpb24gb2YgdGhlIGZpbGVuYW1lLiAKKyAqCisgKiBJZiB0aGUgaG9zdCBjYW5ub3QgY3JlYXRlIGEgc3VpdGFibGUgbmFtZSBvciB0aGUgZ2VuZXJhdGVkIG5hbWUgaXMgdG9vCisgKiBsb25nIHRoZW4gc3RhdHVzIGlzIG5vbiB6ZXJvLiBzdGF0dXMgd2lsbCBiZSBOb0Vycm9yIGlmIHRoZSBob3N0IGNhbiBjcmVhdGUKKyAqIGEgbmFtZS4gCisgKi8KKyNkZWZpbmUgQ0xfVG1wTmFtICAgICAgIDB4NzAKKyAgIC8qIFRtcE5hbSh3b3JkIG1heGxlbmd0aCwgd29yZCBUYXJnZXRJRCkKKyAgICAqIHJldHVybih3b3JkIHN0YXR1cywgd29yZCBuYnl0ZXMsIGJ5dGVzIGZuYW1lKQorICAgICovCisKKy8qIE5vdGUgdGhlcmUgaXMgbm8gbWVzc2FnZSBmb3IgRXhpdCwgRW50ZXJPUywgSW5zdGFsbEhhbmRsZXIgb3IKKyAqIEdlbmVyYXRlRXJyb3IgYXMgdGhlc2Ugd2lsbCBiZSBzdXBwb3J0ZWQgZW50aXJlbHkgYXQgdGhlIGhvc3QgZW5kLAorICogb3IgYnkgdGhlIHVuZGVybHlpbmcgT3BlcmF0aW5nIHN5c3RlbS4KKyAqLworCisjZGVmaW5lIENMX1Vua25vd25SZWFzb24gKC0xKQorCitleHRlcm4gdW5zaWduZWQgaW50IEdldFJhaXNlSGFuZGxlciggdm9pZCApOworZXh0ZXJuIHVuc2lnbmVkIGludCBTeXNMaWJyYXJ5SGFuZGxlcih1bnNpZ25lZCBpbnQgc3lzQ29kZSwgdW5zaWduZWQgaW50ICphcmdzKTsKK2V4dGVybiB2b2lkIGFuZ2VsX1N5c0xpYnJhcnlJbml0KHZvaWQpOworCisvKgorICogRnVuY3Rpb246IEFuZ2VsX0lzU3lzSGFuZGxlclJ1bm5pbmcKKyAqICBQdXJwb3NlOiByZXR1cm4gd2hldGhlciBvciBub3QgU3lzTGlicmFyeUhhbmRsZXIgaXMgcnVubmluZworICoKKyAqICAgTm8gcGFyYW1hdGVycworICogICAgICAgICAgICAgCisgKiAgIFJldHVybnMgMSBpZiBTeXNMaWJyYXJ5SGFuZGxlciBpcyBydW5uaW5nCisgKiAgICAgICAgICAgMCBvdGhlcndpc2UKKyAqLworZXh0ZXJuIGludCBBbmdlbF9Jc1N5c0hhbmRsZXJSdW5uaW5nKHZvaWQpOworCisjaWZkZWYgSUNFTUFOMgorLyogVGhpcyBmdW5jdGlvbiBleGlzdHMgaW4gYW4gSUNFbWFuMiBzeXN0ZW0gb25seSwgYW5kIGNhbiBiZSBjYWxsZWQgYnkKKyAqIGRlYnVnIHN1cHBvcnQgY29kZSB3aGVuIHRoZSBkZWJ1Z2dlciB0ZWxscyBpdCBob3cgbXVjaCBtZW1vcnkgdGhlCisgKiB0YXJnZXQgaGFzLiAgVGhpcyB3aWxsIHRoZW4gYmUgdXNlZCB0byBkZWFsIHdpdGggdGhlIEhFQVBJTkZPIFNXSQorICovCitleHRlcm4gdm9pZCBhbmdlbF9TZXRUb3BNZW0odW5zaWduZWQgYWRkcik7CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2dkYi9yZGktc2hhcmUvdHguYyBiL2dkYi9yZGktc2hhcmUvdHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTIyODZjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JkaS1zaGFyZS90eC5jCkBAIC0wLDAgKzEsMTc2IEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMTk5NSBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGZyZWVseSB1c2VkLCBjb3BpZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgaXMgcHJlc2VydmVkIGluIGFsbCBjb3BpZXMgb2YgdGhlCisgKiBzb2Z0d2FyZS4KKyAqLworCisvKi0qLUMtKi0KKyAqCisgKiAkUmV2aXNpb24kCisgKiAgICAgJERhdGUkCisgKgorICogICBQcm9qZWN0OiBBTkdFTAorICoKKyAqICAgICBUaXRsZTogQ2hhcmFjdGVyIGJhc2VkIHBhY2tldCB0cmFuc21pc3Npb24gZW5naW5lCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPiAgICAvKiBBTlNJIHZhcmFyZ3Mgc3VwcG9ydCAqLworI2luY2x1ZGUgImFuZ2VsLmgiICAgICAvKiBBbmdlbCBzeXN0ZW0gZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJlbmRpYW4uaCIgICAgLyogRW5kaWFuIGluZGVwZW5kYW50IG1lbW9yeSBhY2Nlc3MgbWFjcm9zICovCisjaW5jbHVkZSAiY3JjLmgiICAgICAgIC8qIGNyYyBnZW5lcmF0aW9uIGRlZmluaXRpb25zIGFuZCBoZWFkZXJzICovCisjaW5jbHVkZSAicnh0eC5oIgorI2luY2x1ZGUgImNoYW5uZWxzLmgiCisjaW5jbHVkZSAiYnVmZmVycy5oIgorI2luY2x1ZGUgImxvZ2dpbmcuaCIKKworLyogZGVmaW5pdGlvbnMgdG8gZGVzY3JpYmUgdGhlIGVuZ2luZXMgc3RhdGUgKi8KKyNkZWZpbmUgTl9TVFggICAgICAgICAgIDB4MCAgLyogZmlyc3QgMiBiaXRzIGZvciBOXyAqLworI2RlZmluZSBOX0JPRFkgICAgICAgICAgMHgxCisjZGVmaW5lIE5fRVRYICAgICAgICAgICAweDIKKyNkZWZpbmUgTl9JRExFICAgICAgICAgIDB4MworI2RlZmluZSBOX01BU0sgICAgICAgICAgMHgzIC8qIG1hc2sgZm9yIHRoZSBFbmNhcHN1bGF0b3Igc3RhdGUgKi8KKworI2RlZmluZSBFX1BMQUlOICAgICAgICAgKDB4MCA8PCAyKSAvKiAzcmQgYml0IGZvciBFXyAqLworI2RlZmluZSBFX0VTQyAgICAgICAgICAgKDB4MSA8PCAyKSAvKiAzcmQgYml0IGZvciBFXyAqLworI2RlZmluZSBFX01BU0sgICAgICAgICAgKDB4MSA8PCAyKSAvKiBtYXNrIGZvciB0aGUgRXNjYXBlciBzdGF0ZSAqLworCisjZGVmaW5lIEZfSEVBRCAgICAgICAgICAoMHgwIDw8IDMpIC8qIDR0aCBhbmQgNXRoIGJpdHMgZm9yIEZfICovCisjZGVmaW5lIEZfREFUQSAgICAgICAgICAoMHgxIDw8IDMpIAorI2RlZmluZSBGX0NSQyAgICAgICAgICAgKDB4MSA8PCA0KQorI2RlZmluZSBGX01BU0sgICAgICAgICAgKDB4MyA8PCAzKSAvKiBtYXNrIGZvciB0aGUgRXNjYXBlciBzdGF0ZSAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBlc2NhcGUodW5zaWduZWQgY2hhciBjaF9pbiwgc3RydWN0IHRlX3N0YXRlICp0eHN0YXRlKTsKKwordm9pZCBBbmdlbF9UeEVuZ2luZUluaXQoY29uc3Qgc3RydWN0IHJlX2NvbmZpZyAqdHhjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZGF0YV9wYWNrZXQgKnBhY2tldCwgCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGVfc3RhdGUgKnR4c3RhdGUpeworICBJR05PUkUocGFja2V0KTsKKyAgdHhzdGF0ZS0+dHhfc3RhdGUgPSBOX1NUWCB8IEVfUExBSU4gfCBGX0hFQUQ7CisgIHR4c3RhdGUtPmZpZWxkX2MgPSAwOworICB0eHN0YXRlLT5lbmNvZGVkID0gMDsKKyAgdHhzdGF0ZS0+Y29uZmlnID0gdHhjb25maWc7CisgIHR4c3RhdGUtPmNyYyA9IDA7Cit9CisKK3RlX3N0YXR1cyBBbmdlbF9UeEVuZ2luZShjb25zdCBzdHJ1Y3QgZGF0YV9wYWNrZXQgKnBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGVfc3RhdGUgKnR4c3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdHhfY2gpeworICAvKiBUT0RPOiBnYXVyZCBvbiBsb25nL2JhZCBwYWNrZXRzICovCisgIC8qCisgICAqIGVuY2Fwc3VsYXRlIHRoZSBwYWNrZXQsIGZyYW1pbmcgaGFzIGJlZW4gbW92ZWQgZnJvbSBhIHNlcGVyYXRlCisgICAqIGZ1bmN0aW9uIGludG8gdGhlIGVuY2Fwc3VsYXRpb24gcm91dGluZSBhcyBpdCBuZWVkZWQgdG9vIG11Y2gKKyAgICogaW5oZXJpdGVkIHN0YXRlIGZvciBpdCB0byBiZSBzZW5zaWJseSBsb2NhdGVkIGVsc2V3aGVyZQorICAgKi8KKyAgc3dpdGNoICgodHhzdGF0ZS0+dHhfc3RhdGUpICYgTl9NQVNLKXsKKyAgY2FzZSBOX1NUWDoKKyNpZmRlZiBET19UUkFDRQorICAgIF9fcnRfdHJhY2UoInR4ZS1zdHggIik7CisjZW5kaWYKKyAgICB0eHN0YXRlLT50eF9zdGF0ZSA9ICh0eHN0YXRlLT50eF9zdGF0ZSAmIH5OX01BU0spIHwgTl9CT0RZOworICAgICp0eF9jaCA9IHR4c3RhdGUtPmNvbmZpZy0+c3R4OworICAgIHR4c3RhdGUtPmZpZWxkX2MgPSAzOyAvKiBzZXQgdXAgZm9yIHRoZSBoZWFkZXIgKi8KKyAgICB0eHN0YXRlLT5jcmMgPSBzdGFydENSQzMyOyAvKiBzZXQgdXAgYmFzaWMgY3JjICovCisgICAgcmV0dXJuIFRTX0lOX1BLVDsKKyAgY2FzZSBOX0JPRFk6eworICAgIHN3aXRjaCAodHhzdGF0ZS0+dHhfc3RhdGUgJiBGX01BU0spIHsKKyAgICBjYXNlIEZfSEVBRDoKKyNpZmRlZiBET19UUkFDRQorICAgIF9fcnRfdHJhY2UoInR4ZS1oZWFkICIpOworI2VuZGlmCisgICAgICBpZiAodHhzdGF0ZS0+ZmllbGRfYyA9PSAzKSB7CisgICAgICAgIC8qIHNlbmQgdHlwZSAqLworICAgICAgICAqdHhfY2ggPSBlc2NhcGUocGFja2V0LT50eXBlLCB0eHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIFRTX0lOX1BLVDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAqdHhfY2ggPSBlc2NhcGUoKHBhY2tldC0+bGVuID4+ICh0eHN0YXRlLT5maWVsZF9jIC0gMSkgKiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgdHhzdGF0ZSk7CisgICAgICAgICAgaWYgKHR4c3RhdGUtPmZpZWxkX2MgPT0gMCkgeworICAgICAgICAgICAgLyogbW92ZSBvbiB0byB0aGUgbmV4dCBzdGF0ZSAqLworICAgICAgICAgICAgdHhzdGF0ZS0+dHhfc3RhdGUgPSAodHhzdGF0ZS0+dHhfc3RhdGUgJiB+Rl9NQVNLKSB8IEZfREFUQTsKKyAgICAgICAgICAgIHR4c3RhdGUtPmZpZWxkX2MgPSBwYWNrZXQtPmxlbjsKKyAgICAgICAgICB9CisgICAgICAgIHJldHVybiBUU19JTl9QS1Q7CisgICAgICB9CisgICAgY2FzZSBGX0RBVEE6CisjaWZkZWYgRE9fVFJBQ0UKKyAgICBfX3J0X3RyYWNlKCJ0eGUtZGF0YSAiKTsKKyNlbmRpZgorICAgICAgKnR4X2NoID0gZXNjYXBlKHBhY2tldC0+ZGF0YVtwYWNrZXQtPmxlbiAtIHR4c3RhdGUtPmZpZWxkX2NdLCB0eHN0YXRlKTsKKyAgICAgIGlmICh0eHN0YXRlLT5maWVsZF9jID09IDApIHsKKyAgICAgICAgLyogbW92ZSBvbiB0byB0aGUgbmV4dCBzdGF0ZSAqLworICAgICAgICB0eHN0YXRlLT50eF9zdGF0ZSA9ICh0eHN0YXRlLT50eF9zdGF0ZSAmIH5GX01BU0spIHwgRl9DUkM7CisgICAgICAgIHR4c3RhdGUtPmZpZWxkX2MgPSA0OworICAgICAgfSAgICAgIAorICAgICAgcmV0dXJuIFRTX0lOX1BLVDsKKyAgICBjYXNlIEZfQ1JDOgorI2lmZGVmIERPX1RSQUNFCisgICAgX19ydF90cmFjZSgidHhlLWNyYyAiKTsKKyNlbmRpZgorICAgICAqdHhfY2ggPSBlc2NhcGUoKHR4c3RhdGUtPmNyYyA+PiAoKHR4c3RhdGUtPmZpZWxkX2MgLSAxKSAqIDgpKSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgdHhzdGF0ZSk7CisKKyAgICAgIGlmICh0eHN0YXRlLT5maWVsZF9jID09IDApIHsKKyNpZmRlZiBET19UUkFDRQorICAgICAgICBfX3J0X3RyYWNlKCJ0eGUgY3JjID0gMHgleFxuIiwgdHhzdGF0ZS0+Y3JjKTsKKyNlbmRpZgorICAgICAgICAvKiBtb3ZlIG9uIHRvIHRoZSBuZXh0IHN0YXRlICovCisgICAgICAgIHR4c3RhdGUtPnR4X3N0YXRlID0gKHR4c3RhdGUtPnR4X3N0YXRlICYgfk5fTUFTSykgfCBOX0VUWDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBUU19JTl9QS1Q7ICAgICAKKyAgICB9CisgIH0KKyAgY2FzZSBOX0VUWDoKKyNpZmRlZiBET19UUkFDRQorICAgIF9fcnRfdHJhY2UoInR4ZS1ldHhcbiIpOworI2VuZGlmCisgICAgdHhzdGF0ZS0+dHhfc3RhdGUgPSAodHhzdGF0ZS0+dHhfc3RhdGUgJiB+Tl9NQVNLKSB8IE5fSURMRTsKKyAgICAqdHhfY2ggPSB0eHN0YXRlLT5jb25maWctPmV0eDsKKyAgICByZXR1cm4gVFNfRE9ORV9QS1Q7CisgIGRlZmF1bHQ6CisjaWZkZWYgREVCVUcKKyAgICBfX3J0X2luZm8oInR4IGRlZmF1bHRcbiIpOworI2VuZGlmCisgICAgdHhzdGF0ZS0+dHhfc3RhdGUgPSAodHhzdGF0ZS0+dHhfc3RhdGUgJiB+Tl9NQVNLKSB8IE5fSURMRTsKKyAgICByZXR1cm4gVFNfSURMRTsKKyAgfQorICAvKiBzdG9wIGEgc2lsbHkgLVdhbGwgd2FybmluZyAqLworICByZXR1cm4gKHRlX3N0YXR1cyktMTsKK30KKworLyoKKyAqIGNyYyBnZW5lcmF0aW9uIG9jY3VycyBpbiB0aGUgZXNjYXBlIGZ1bmN0aW9uIGJlY2F1c2UgaXQgaXMgdGhlIG9ubHkKKyAqIHBsYWNlIHdoZXJlIHdlIGtub3cgdGhhdCB3ZSdyZSBwdXR0aW5nIGEgcmVhbCBjaGFyIGludG8gdGhlIGJ1ZmZlcgorICogcmF0aGVyIHRoYW4gYW4gZXNjYXBlZCBvbmUuCisgKiBXZSBtdXN0IGJlIGNhcmVmdWwgaGVyZSBub3QgdG8gdXBkYXRlIHRoZSBjcmMgd2hlbiB3ZSdyZSBzZW5kaW5nIGl0CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGVzY2FwZSh1bnNpZ25lZCBjaGFyIGNoX2luLCBzdHJ1Y3QgdGVfc3RhdGUgKnR4c3RhdGUpIHsKKyAgIGlmICgoKHR4c3RhdGUtPnR4X3N0YXRlKSAmIEVfTUFTSykgPT0gRV9FU0MpIHsKKyAgICAgIC8qIGNoYXIgaGFzIGJlZW4gZXNjYXBlZCBzbyBzZW5kIHRoZSByZWFsIGNoYXIgKi8KKyNpZmRlZiBET19UUkFDRQorICAgICBfX3J0X3RyYWNlKCJ0eGUtZWNoYXIgIik7CisjZW5kaWYKKyAgICAgIHR4c3RhdGUtPnR4X3N0YXRlID0gKHR4c3RhdGUtPnR4X3N0YXRlICYgfkVfTUFTSykgfCBFX1BMQUlOOworICAgICAgdHhzdGF0ZS0+ZmllbGRfYy0tOworICAgICAgaWYgKCh0eHN0YXRlLT50eF9zdGF0ZSAmIEZfTUFTSykgIT0gRl9DUkMpCisgICAgICAgIHR4c3RhdGUtPmNyYyA9IGNyYzMyKCAmY2hfaW4sIDEsIHR4c3RhdGUtPmNyYyk7CisgICAgICByZXR1cm4gY2hfaW4gfCBzZXJpYWxfRVNDQVBFOworICAgfQorICAgaWYgKChjaF9pbiA8IDMyKSAmJiAoKHR4c3RhdGUtPmNvbmZpZy0+ZXNjX3NldCAmICgxIDw8IGNoX2luKSkgIT0gMCkpIHsKKyAgICAgLyogY2hhciBuZWVkcyBlc2NhcGluZyAqLworI2lmZGVmIERPX1RSQUNFCisgICAgIF9fcnRfdHJhY2UoInR4ZS1lc2MgIik7CisjZW5kaWYKKyAgICAgdHhzdGF0ZS0+dHhfc3RhdGUgPSAodHhzdGF0ZS0+dHhfc3RhdGUgJiB+RV9NQVNLKSB8IEVfRVNDOworICAgICByZXR1cm4gdHhzdGF0ZS0+Y29uZmlnLT5lc2M7CisgICB9CisgICAvKiBtdXN0IGJlIGEgY2hhciB0aGF0IGNhbiBiZSBzZW50IHBsYWluICovCisgICB0eHN0YXRlLT5maWVsZF9jLS07CisgICBpZiAoKHR4c3RhdGUtPnR4X3N0YXRlICYgRl9NQVNLKSAhPSBGX0NSQykKKyAgICAgdHhzdGF0ZS0+Y3JjID0gY3JjMzIoJmNoX2luLCAxLCB0eHN0YXRlLT5jcmMpOworICAgcmV0dXJuIGNoX2luOworfQorCisvKiBFT0YgdHguYyAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS91bml4Y29tbS5jIGIvZ2RiL3JkaS1zaGFyZS91bml4Y29tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMjE4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL3VuaXhjb21tLmMKQEAgLTAsMCArMSw1NTIgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qIC0qLUMtKi0KKyAqCisgKiAkUmV2aXNpb24kCisgKiAgICAgJERhdGUkCisgKgorICovCisKKyNpZmRlZiBfX2hwdXgKKyMgIGRlZmluZSBfUE9TSVhfU09VUkNFIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaWZkZWYgX19ocHV4CisjICBkZWZpbmUgX1RFUk1JT1NfSU5DTFVERUQKKyMgIGluY2x1ZGUgPHN5cy90ZXJtaW8uaD4KKyMgIHVuZGVmIF9URVJNSU9TX0lOQ0xVREVECisjZWxzZQorIyAgaW5jbHVkZSA8dGVybWlvcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2lmZGVmIHN1bgorIyBpbmNsdWRlIDxzeXMvaW9jY29tLmg+CisjIGlmZGVmIF9fc3ZyNF9fCisjICBpbmNsdWRlIDxzeXMvYnBwX2lvLmg+CisjIGVsc2UKKyMgIGluY2x1ZGUgPHNidXNkZXYvYnBwX2lvLmg+CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEJTRAorIyBpZmRlZiBzdW4KKyMgIGluY2x1ZGUgPHN5cy90dHlkZXYuaD4KKyMgZW5kaWYKKyMgaWZkZWYgX19hbHBoYSAKKyMgIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgorIyBlbHNlCisjICBpbmNsdWRlIDxzeXMvZmlsaW8uaD4KKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19ocHV4CisjICBkZWZpbmUgX0lOQ0xVREVfSFBVWF9TT1VSQ0UKKyMgIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgorIyAgdW5kZWYgX0lOQ0xVREVfSFBVWF9TT1VSQ0UKKyNlbmRpZgorCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgInVuaXhjb21tLmgiCisKKyNkZWZpbmUgUFBfVElNRU9VVCAgICAgIDEgICAgICAgICAgICAgIC8qIHNlY29uZHMgKi8KKworI2lmZGVmIHN1bgorI2RlZmluZSBTRVJQT1JUMSAgICIvZGV2L3R0eWEiCisjZGVmaW5lIFNFUlBPUlQyICAgIi9kZXYvdHR5YiIKKyNkZWZpbmUgUEFSUE9SVDEgICAiL2Rldi9icHAwIgorI2RlZmluZSBQQVJQT1JUMiAgICIvZGV2L2JwcDEiCisjZW5kaWYKKworI2lmZGVmIF9faHB1eAorI2RlZmluZSBTRVJQT1JUMSAgICIvZGV2L3R0eTAwIgorI2RlZmluZSBTRVJQT1JUMiAgICIvZGV2L3R0eTAxIgorI2RlZmluZSBQQVJQT1JUMSAgICIvZGV2L3B0cl9wYXJhbGxlbCIKKyNkZWZpbmUgUEFSUE9SVDIgICAiL2Rldi9wdHJfcGFyYWxsZWwiCisjZW5kaWYKKworI2lmZGVmIF9fbGludXhfXworI2RlZmluZSBTRVJQT1JUMSAgICIvZGV2L2N1YTAiCisjZGVmaW5lIFNFUlBPUlQyICAgIi9kZXYvY3VhMSIKKyNkZWZpbmUgUEFSUE9SVDEgICAiL2Rldi9wYXIwIgorI2RlZmluZSBQQVJQT1JUMiAgICIvZGV2L3BhcjEiCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkIChfX05ldEJTRF9fKSB8fCBkZWZpbmVkIChfX09wZW5CU0RfXykgfHwgZGVmaW5lZCAoYnNkaSkKKyNkZWZpbmUgU0VSUE9SVDEgICAiL2Rldi9jdWFhMCIKKyNkZWZpbmUgU0VSUE9SVDIgICAiL2Rldi9jdWFhMSIKKyNkZWZpbmUgUEFSUE9SVDEgICAiL2Rldi9scHQwIgorI2RlZmluZSBQQVJQT1JUMiAgICIvZGV2L2xwdDEiCisjZW5kaWYKKworCisjZGVmaW5lIFNFUklBTF9QUkVGSVggIi9kZXYvdHR5IgorI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkIChfX0NZR1dJTjMyX18pIAorI2RlZmluZSBTRVJQT1JUMSAgICJjb20xIgorI2RlZmluZSBTRVJQT1JUMiAgICJjb20yIgorI2RlZmluZSBQQVJQT1JUMSAgICJscHQxIgorI2RlZmluZSBQQVJQT1JUMiAgICJscHQyIgorI3VuZGVmIFNFUklBTF9QUkVGSVgKKyNkZWZpbmUgU0VSSUFMX1BSRUZJWCAiY29tIgorI2VuZGlmCisKKworCisvKgorICogUGFyYWxsZWwgcG9ydCBvdXRwdXQgcGlucywgdXNlZCBmb3Igc2lnbmFsbGluZyB0byB0YXJnZXQKKyAqLworCisjaWZkZWYgc3VuCitzdHJ1Y3QgYnBwX3BpbnMgYnA7CisjZW5kaWYKKworc3RhdGljIGludCBzZXJwZmQgPSAtMTsKK3N0YXRpYyBpbnQgcGFycGZkID0gLTE7CisKK2V4dGVybiBjb25zdCBjaGFyICpVbml4X01hdGNoVmFsaWRTZXJpYWxEZXZpY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgaW50IGk9MDsKKyAgY2hhciAqc2VybmFtZT1OVUxMOworCisgIC8qIEFjY2VwdCBubyBuYW1lIGFzIHRoZSBkZWZhdWx0IHNlcmlhbCBwb3J0ICovCisgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICByZXR1cm4gU0VSUE9SVDE7CisgIH0KKworICAvKiBMb29rIGZvciB0aGUgc2ltcGxlIGNhc2VzIC0gMSwyLHMsUywvZGV2Ly4uLiBmaXJzdCwgYW5kCisgICAqIGFmdGVyd2FyZHMgbG9vayBmb3IgUz0uLi4gY2xhdXNlcywgd2hpY2ggbmVlZCBwYXJzaW5nIHByb3Blcmx5LgorICAgKi8KKworICAvKiBBY2NlcHQgL2Rldi90dHkqIHdoZXJlICogaXMgbGltaXRlZCAqLworICBpZiAoc3RybGVuKG5hbWUpID09IHN0cmxlbihTRVJQT1JUMSkKKyAgICAgICYmIHN0cm5jbXAobmFtZSwgU0VSSUFMX1BSRUZJWCwgc3RybGVuIChTRVJJQUxfUFJFRklYKSkgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICB9CisKKyAgLyogQWNjZXB0ICIxIiBvciAiMiIgb3IgIlMiIC0gUyBpcyBlcXVpdmFsZW50IHRvICIxIiAqLworICBpZiAoc3RyY21wKG5hbWUsICIxIikgPT0gMCB8fAorICAgICAgc3RyY21wKG5hbWUsICJTIikgPT0gMCB8fCBzdHJjbXAobmFtZSwgInMiKSA9PSAwKSB7CisgICAgcmV0dXJuIFNFUlBPUlQxOworICB9CisgIGlmIChzdHJjbXAobmFtZSwgIjIiKSA9PSAwKSByZXR1cm4gU0VSUE9SVDI7CisKKyAgLyogSXQgd2Fzbid0IG9uZSBvZiB0aGUgc2ltcGxlIGNhc2VzLCBzbyBub3cgd2UgaGF2ZSB0byBwYXJzZSBpdAorICAgKiBwcm9wZXJseQorICAgKi8KKworICBkbyB7CisgICAgc3dpdGNoIChuYW1lW2ldKSB7CisgICAgICBjYXNlICcsJzoKKyAgICAgICAgLyogU2tpcCBvdmVyIGNvbW1hcyAqLworICAgICAgICBpKys7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgLyogVW5leHBlY3RlZCBjaGFyYWN0ZXIgPT4gZXJyb3IgLSBub3QgbWF0Y2hlZCAqLworCisgICAgICBjYXNlIDA6CisgICAgICAgIC8qIEVuZCBvZiBzdHJpbmcgbWVhbnMgcmV0dXJuIHdoYXRldmVyIHdlIGhhdmUgbWF0Y2hlZCAqLworICAgICAgICByZXR1cm4gc2VybmFtZTsKKworICAgICAgY2FzZSAncyc6CisgICAgICBjYXNlICdTJzoKKyAgICAgIGNhc2UgJ2gnOgorICAgICAgY2FzZSAnSCc6IHsKKyAgICAgICAgY2hhciBjaCA9IHRvbG93ZXIobmFtZVtpXSk7CisgICAgICAgIGludCBqLCBjb250aW51ZV9mcm9tLCBsZW47CisgICAgICAgIAorICAgICAgICAvKiBJZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgYSBjb21tYSBvciBhIE5VTEwgdGhlbiB0aGlzIGlzCisgICAgICAgICAqIGEgcmVxdWVzdCBmb3IgdGhlIGRlZmF1bHQgU2VyaWFsIHBvcnQKKyAgICAgICAgICovCisgICAgICAgIGlmIChuYW1lWysraV0gPT0gMCB8fCBuYW1lW2ldID09ICcsJykgeworICAgICAgICAgIGlmIChjaD09J3MnKSAKKyAgICAgICAgICAgICAgc2VybmFtZT1TRVJQT1JUMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE5leHQgY2hhcmFjdGVyIG11c3QgYmUgYW4gPSAqLworICAgICAgICBpZiAobmFtZVtpXSAhPSAnPScpIHJldHVybiAwOworICAgICAgICAvKiBTZWFyY2ggZm9yIHRoZSBlbmQgb2YgdGhlIHBvcnQgc3BlYy4gKGVuZHMgaW4gTlVMTCBvciAsKSAqLworICAgICAgICBmb3IgKGo9ICsraTsgbmFtZVtqXSAhPSAwICYmIG5hbWVbal0gIT0gJywnOyBqKyspCisgICAgICAgICAgOyAvKiBEbyBub3RoaW5nICovCisgICAgICAgIC8qIE5vdGljZSB3aGV0aGVyIHRoaXMgaXMgdGhlIGxhc3QgdGhpbmcgdG8gcGFyc2Ugb3Igbm90CisgICAgICAgICAqIGFuZCBhbHNvIGNhbGFjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nCisgICAgICAgICAqLworICAgICAgICBpZiAobmFtZVtqXSA9PSAnMCcpIGNvbnRpbnVlX2Zyb20gPSAtMTsKKyAgICAgICAgZWxzZSBjb250aW51ZV9mcm9tID0gajsKKyAgICAgICAgbGVuPShqLWkpOworCisgICAgICAgIC8qIEFuZCBub3cgdHJ5IHRvIG1hdGNoIHRoZSBzZXJpYWwgLyBwYXJhbGxlbCBwb3J0ICovCisgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICBjYXNlICdzJzogeworICAgICAgICAgICAgLyogTWF0Y2ggc2VyaWFsIHBvcnQgKi8KKyAgICAgICAgICAgIGlmIChsZW49PTEpIHsKKyAgICAgICAgICAgICAgaWYgKG5hbWVbaV09PScxJykgCisgICAgICAgICAgICAgICAgICBzZXJuYW1lPVNFUlBPUlQxOworICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lW2ldPT0nMicpIAorICAgICAgICAgICAgICAgICAgc2VybmFtZT1TRVJQT1JUMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGVuPT1zdHJsZW4oU0VSUE9SVDEpKSB7CisgICAgICAgICAgICAgIGlmIChzdHJuY21wKG5hbWUraSxTRVJQT1JUMSxzdHJsZW4oU0VSUE9SVDEpKSA9PSAwKQorICAgICAgICAgICAgICAgIHNlcm5hbWU9U0VSUE9SVDE7CisgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAobmFtZStpLFNFUlBPUlQyLHN0cmxlbihTRVJQT1JUMikpID09IDApCisgICAgICAgICAgICAgICAgc2VybmFtZT1TRVJQT1JUMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgY2FzZSAnaCc6IAorICAgICAgICAgICAgLyogV2UgZG9uJ3QgYWN0dWFsbHkgZGVhbCB3aXRoIHRoZSBIIGNhc2UgaGVyZSwgd2UganVzdAorICAgICAgICAgICAgICogbWF0Y2ggaXQgYW5kIGFsbG93IGl0IHRocm91Z2guCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnRpbnVlX2Zyb20gPT0gLTEpIHJldHVybiBzZXJuYW1lOworICAgICAgICBpID0gY29udGludWVfZnJvbTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9IHdoaWxlICgxKTsKKworICByZXR1cm4gMDsKK30KKworCitleHRlcm4gaW50IFVuaXhfSXNTZXJpYWxJblVzZSh2b2lkKQoreworICAgIGlmIChzZXJwZmQgPj0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbnQgVW5peF9PcGVuU2VyaWFsKGNvbnN0IGNoYXIgKm5hbWUpCit7CisjaWYgZGVmaW5lZChCU0QpIHx8IGRlZmluZWQoX19DWUdXSU4zMl9fKQorICAgIHNlcnBmZCA9IG9wZW4obmFtZSwgT19SRFdSKTsKKyNlbHNlCisgICAgc2VycGZkID0gb3BlbihuYW1lLCBPX1JEV1IgfCBPX05PTkJMT0NLKTsKKyNlbmRpZgorCisgICAgaWYgKHNlcnBmZCA8IDApIHsKKyAgICAgICAgcGVycm9yKCJvcGVuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworZXh0ZXJuIHZvaWQgVW5peF9DbG9zZVNlcmlhbCh2b2lkKQoreworICAgIGlmIChzZXJwZmQgPj0gMCkKKyAgICB7CisgICAgICAgICh2b2lkKWNsb3NlKHNlcnBmZCk7CisgICAgICAgIHNlcnBmZCA9IC0xOworICAgIH0KK30KKworZXh0ZXJuIGludCBVbml4X1JlYWRTZXJpYWwodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbiwgYm9vbCBibG9jaykKK3sKKyAgICBmZF9zZXQgZmRzZXQ7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgaW50IGVycjsKKworICAgIEZEX1pFUk8oJmZkc2V0KTsKKyAgICBGRF9TRVQoc2VycGZkLCAmZmRzZXQpOworCisgICAgdHYudHZfc2VjID0gMDsKKyAgICB0di50dl91c2VjID0gKGJsb2NrID8gMTAwMDAgOiAwKTsKKworICAgIGVyciA9IHNlbGVjdChzZXJwZmQgKyAxLCAmZmRzZXQsIE5VTEwsIE5VTEwsICZ0dik7CisKKyAgICBpZiAoZXJyIDwgMCAmJiBlcnJubyAhPSBFSU5UUikKKyAgICB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgcGVycm9yKCJzZWxlY3QiKTsKKyNlbmRpZgorICAgICAgICBwYW5pYygic2VsZWN0IGZhaWx1cmUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIGlmIChlcnIgPiAwICYmIEZEX0lTU0VUKHNlcnBmZCwgJmZkc2V0KSkKKyAgICAgICAgcmV0dXJuIHJlYWQoc2VycGZkLCBidWYsIG4pOworICAgIGVsc2UgLyogZXJyID09IDAgfHwgRkRfQ0xSKHNlcnBmZCwgJmZkc2V0KSAqLworICAgIHsKKyAgICAgICAgZXJybm8gPSBFUlJOT19GT1JfQkxPQ0tFRF9JTzsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworZXh0ZXJuIGludCBVbml4X1dyaXRlU2VyaWFsKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IG4pCit7CisgICAgcmV0dXJuIHdyaXRlKHNlcnBmZCwgYnVmLCBuKTsKK30KKworZXh0ZXJuIHZvaWQgVW5peF9SZXNldFNlcmlhbCh2b2lkKQoreworICAgIHN0cnVjdCB0ZXJtaW9zIHRlcm1pbmZvOworCisgICAgdGNnZXRhdHRyKHNlcnBmZCwgJnRlcm1pbmZvKTsKKyNpZmRlZiBfX0NZR1dJTjMyX18KKyAgICAvKiBFeHBlZGllbnQsIGJ1dCBpdCB3b3Jrcy4gICovCisgICAgdGVybWluZm8uY19pZmxhZyA9IDA7CisgICAgdGVybWluZm8uY19vZmxhZyA9IDA7CisgICAgdGVybWluZm8uY19jZmxhZyA9IDQ4OworICAgIHRlcm1pbmZvLmNfbGZsYWcgPSAwOworICAgIHRlcm1pbmZvLmNfY2NbVk1JTl0gPSAwOworICAgIHRlcm1pbmZvLmNfY2NbVlRJTUVdID0gMTsKKyNlbHNlCisgICAgdGVybWluZm8uY19sZmxhZyAmPSB+KElDQU5PTiB8IElTSUcgfCBFQ0hPIHwgSUVYVEVOKTsKKyAgICB0ZXJtaW5mby5jX2lmbGFnICY9IH4oSUdOQ1IgfCBJTlBDSyB8IElTVFJJUCB8IElDUk5MIHwgQlJLSU5UKTsKKyAgICB0ZXJtaW5mby5jX2lmbGFnIHw9IChJWE9OIHwgSVhPRkYgfCBJR05CUkspOworICAgIHRlcm1pbmZvLmNfY2ZsYWcgPSAodGVybWluZm8uY19jZmxhZyAmIH5DU0laRSkgfCBDUzggfCBDUkVBRDsKKyAgICB0ZXJtaW5mby5jX2NmbGFnICY9IH5QQVJFTkI7CisgICAgdGVybWluZm8uY19jY1tWTUlOXSA9IDE7CisgICAgdGVybWluZm8uY19jY1tWVElNRV0gPSAwOworICAgIHRlcm1pbmZvLmNfb2ZsYWcgJj0gfk9QT1NUOworI2VuZGlmCisgICAgdGNzZXRhdHRyKHNlcnBmZCwgVENTQUZMVVNILCAmdGVybWluZm8pOworfQorCitleHRlcm4gdm9pZCBVbml4X1NldFNlcmlhbEJhdWRSYXRlKGludCBiYXVkcmF0ZSkKK3sKKyAgICBzdHJ1Y3QgdGVybWlvcyB0ZXJtaW5mbzsKKworICAgIHRjZ2V0YXR0cihzZXJwZmQsICZ0ZXJtaW5mbyk7CisgICAgY2ZzZXRvc3BlZWQoJnRlcm1pbmZvLCBiYXVkcmF0ZSk7CisgICAgY2ZzZXRpc3BlZWQoJnRlcm1pbmZvLCBiYXVkcmF0ZSk7CisgICAgdGNzZXRhdHRyKHNlcnBmZCwgVENTQUZMVVNILCAmdGVybWluZm8pOworfQorCitleHRlcm4gdm9pZCBVbml4X2lvY3RsTm9uQmxvY2tpbmcodm9pZCkKK3sKKyNpZiBkZWZpbmVkKEJTRCkKKyAgICBpbnQgbm9uYmxvY2tpbmdJTyA9IDE7CisgICAgKHZvaWQpaW9jdGwoc2VycGZkLCBGSU9OQklPLCAmbm9uYmxvY2tpbmdJTyk7CisKKyAgICBpZiAocGFycGZkICE9IC0xKQorICAgICAgICAodm9pZClpb2N0bChwYXJwZmQsIEZJT05CSU8sICZub25ibG9ja2luZ0lPKTsKKyNlbmRpZgorfQorCitleHRlcm4gdm9pZCBVbml4X0lzVmFsaWRQYXJhbGxlbERldmljZSgKKyAgY29uc3QgY2hhciAqcG9ydHN0cmluZywgY2hhciAqKnNlcm5hbWUsIGNoYXIgKipwYXJuYW1lKQoreworICBpbnQgaT0wOworICAqc2VybmFtZT1OVUxMOworICAqcGFybmFtZT1OVUxMOworCisgIC8qIERvIG5vdCByZWNvZ25pc2UgYSBOVUxMIHBvcnRzdHJpbmcgKi8KKyAgaWYgKHBvcnRzdHJpbmc9PU5VTEwpIHJldHVybjsKKworICBkbyB7CisgICAgc3dpdGNoIChwb3J0c3RyaW5nW2ldKSB7CisgICAgICBjYXNlICcsJzoKKyAgICAgICAgLyogU2tpcCBvdmVyIGNvbW1hcyAqLworICAgICAgICBpKys7CisgICAgICAgIGJyZWFrOworICAgICAgCisgICAgICBkZWZhdWx0OgorICAgICAgY2FzZSAwOgorICAgICAgICAvKiBFbmQgb2Ygc3RyaW5nIG9yIGJhZCBjaGFyYWNjdGVyIG1lYW5zIHdlIGhhdmUgZmluaXNoZWQgKi8KKyAgICAgICAgcmV0dXJuOworCisgICAgICBjYXNlICdzJzoKKyAgICAgIGNhc2UgJ1MnOgorICAgICAgY2FzZSAncCc6CisgICAgICBjYXNlICdQJzoKKyAgICAgIGNhc2UgJ2gnOgorICAgICAgY2FzZSAnSCc6IHsKKyAgICAgICAgY2hhciBjaCA9IHRvbG93ZXIocG9ydHN0cmluZ1tpXSk7CisgICAgICAgIGludCBqLCBjb250aW51ZV9mcm9tLCBsZW47CisgICAgICAgIAorICAgICAgICAvKiBJZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgYSBjb21tYSBvciBhIE5VTEwgdGhlbiB0aGlzIGlzCisgICAgICAgICAqIGEgcmVxdWVzdCBmb3IgdGhlIGRlZmF1bHQgU2VyaWFsIG9yIFBhcmFsbGVsIHBvcnQKKyAgICAgICAgICovCisgICAgICAgIGlmIChwb3J0c3RyaW5nWysraV0gPT0gMCB8fCBwb3J0c3RyaW5nW2ldID09ICcsJykgeworICAgICAgICAgIGlmIChjaD09J3MnKSAqc2VybmFtZT1TRVJQT1JUMTsKKyAgICAgICAgICBlbHNlIGlmIChjaD09J3AnKSAqcGFybmFtZT1QQVJQT1JUMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE5leHQgY2hhcmFjdGVyIG11c3QgYmUgYW4gPSAqLworICAgICAgICBpZiAocG9ydHN0cmluZ1tpXSAhPSAnPScpIHJldHVybjsKKyAgICAgICAgLyogU2VhcmNoIGZvciB0aGUgZW5kIG9mIHRoZSBwb3J0IHNwZWMuIChlbmRzIGluIE5VTEwgb3IgLCkgKi8KKyAgICAgICAgZm9yIChqPSArK2k7IHBvcnRzdHJpbmdbal0gIT0gMCAmJiBwb3J0c3RyaW5nW2pdICE9ICcsJzsgaisrKQorICAgICAgICAgIDsgLyogRG8gbm90aGluZyAqLworICAgICAgICAvKiBOb3RpY2Ugd2hldGhlciB0aGlzIGlzIHRoZSBsYXN0IHRoaW5nIHRvIHBhcnNlIG9yIG5vdAorICAgICAgICAgKiBhbmQgYWxzbyBjYWxhY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZworICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBvcnRzdHJpbmdbal0gPT0gJzAnKSBjb250aW51ZV9mcm9tID0gLTE7CisgICAgICAgIGVsc2UgY29udGludWVfZnJvbSA9IGo7CisgICAgICAgIGxlbj0oai1pKTsKKworICAgICAgICAvKiBBbmQgbm93IHRyeSB0byBtYXRjaCB0aGUgc2VyaWFsIC8gcGFyYWxsZWwgcG9ydCAqLworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgY2FzZSAncyc6IHsKKyAgICAgICAgICAgIC8qIE1hdGNoIHNlcmlhbCBwb3J0ICovCisgICAgICAgICAgICBpZiAobGVuPT0xKSB7CisgICAgICAgICAgICAgIGlmIChwb3J0c3RyaW5nW2ldPT0nMScpICpzZXJuYW1lPVNFUlBPUlQxOworICAgICAgICAgICAgICBlbHNlIGlmIChwb3J0c3RyaW5nW2ldPT0nMicpICpzZXJuYW1lPVNFUlBPUlQyOworICAgICAgICAgICAgfSBlbHNlIGlmIChsZW49PXN0cmxlbihTRVJQT1JUMSkpIHsKKyAgICAgICAgICAgICAgaWYgKHN0cm5jbXAocG9ydHN0cmluZytpLFNFUlBPUlQxLHN0cmxlbihTRVJQT1JUMSkpID09IDApCisgICAgICAgICAgICAgICAgKnNlcm5hbWU9U0VSUE9SVDE7CisgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAocG9ydHN0cmluZytpLFNFUlBPUlQyLHN0cmxlbihTRVJQT1JUMikpID09IDApCisgICAgICAgICAgICAgICAgKnNlcm5hbWU9U0VSUE9SVDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBjYXNlICdwJzogeworICAgICAgICAgICAgLyogTWF0Y2ggcGFyYWxsZWwgcG9ydCAqLworICAgICAgICAgICAgaWYgKGxlbj09MSkgeworICAgICAgICAgICAgICBpZiAocG9ydHN0cmluZ1tpXT09JzEnKSAqcGFybmFtZT1QQVJQT1JUMTsKKyAgICAgICAgICAgICAgZWxzZSBpZiAocG9ydHN0cmluZ1tpXT09JzInKSAqcGFybmFtZT1QQVJQT1JUMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGVuPT1zdHJsZW4oUEFSUE9SVDEpKSB7CisgICAgICAgICAgICAgIGlmIChzdHJuY21wKHBvcnRzdHJpbmcraSxQQVJQT1JUMSxzdHJsZW4oUEFSUE9SVDEpKSA9PSAwKQorICAgICAgICAgICAgICAgICpwYXJuYW1lPVBBUlBPUlQxOworICAgICAgICAgICAgICBlbHNlIGlmIChzdHJuY21wKHBvcnRzdHJpbmcraSxQQVJQT1JUMixzdHJsZW4oUEFSUE9SVDIpKSA9PSAwKQorICAgICAgICAgICAgICAgICpwYXJuYW1lPVBBUlBPUlQyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgY2FzZSAnaCc6IAorICAgICAgICAgICAgLyogV2UgZG9uJ3QgYWN0dWFsbHkgZGVhbCB3aXRoIHRoZSBIIGNhc2UgaGVyZSwgd2UganVzdAorICAgICAgICAgICAgICogbWF0Y2ggaXQgYW5kIGFsbG93IGl0IHRocm91Z2guCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnRpbnVlX2Zyb20gPT0gLTEpIHJldHVybjsKKyAgICAgICAgaSA9IGNvbnRpbnVlX2Zyb207CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAoMSk7CisgIHJldHVybjsgIC8qIFdpbGwgbmV2ZXIgZ2V0IGhlcmUgKi8KK30KKworZXh0ZXJuIGludCBVbml4X0lzUGFyYWxsZWxJblVzZSh2b2lkKQoreworICAgIGlmIChwYXJwZmQgPj0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbnQgVW5peF9PcGVuUGFyYWxsZWwoY29uc3QgY2hhciAqbmFtZSkKK3sKKyNpZiBkZWZpbmVkKEJTRCkKKyAgICBwYXJwZmQgPSBvcGVuKG5hbWUsIE9fUkRXUik7CisjZWxzZQorICAgIHBhcnBmZCA9IG9wZW4obmFtZSwgT19SRFdSIHwgT19OT05CTE9DSyk7CisjZW5kaWYKKworICAgIGlmIChwYXJwZmQgPCAwKQorICAgIHsKKyAgICAgICAgY2hhciBlcnJidWZbMjU2XTsKKworICAgICAgICBzcHJpbnRmKGVycmJ1ZiwgIm9wZW4gJXMiLCBuYW1lKTsKKyAgICAgICAgcGVycm9yKGVycmJ1Zik7CisKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitleHRlcm4gdm9pZCBVbml4X0Nsb3NlUGFyYWxsZWwodm9pZCkKK3sKKyAgICBpZiAocGFycGZkID49IDApCisgICAgeworICAgICAgICAodm9pZCljbG9zZShwYXJwZmQpOworICAgICAgICBwYXJwZmQgPSAtMTsKKyAgICB9Cit9CisKKworZXh0ZXJuIHVuc2lnbmVkIGludCBVbml4X1dyaXRlUGFyYWxsZWwodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbikKK3sKKyAgICBpbnQgbmdvbmU7CisKKyAgICBpZiAoKG5nb25lID0gd3JpdGUocGFycGZkLCBidWYsIG4pKSA8IDApCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiB3ZSBpZ25vcmUgZXJyb3JzIChleGNlcHQgZm9yIGRlYnVnIHB1cnBvc2VzKQorICAgICAgICAgKi8KKyNpZmRlZiBERUJVRworICAgICAgICBjaGFyIGVycmJ1ZlsyNTZdOworCisgICAgICAgIHNwcmludGYoZXJyYnVmLCAic2VuZF9wYWNrZXQ6IHdyaXRlIik7CisgICAgICAgIHBlcnJvcihlcnJidWYpOworI2VuZGlmCisgICAgICAgIG5nb25lID0gMDsKKyAgICB9CisKKyAgICAvKiBmaW5pc2hlZCAqLworICAgIHJldHVybiAodW5zaWduZWQgaW50KW5nb25lOworfQorCisKKyNpZmRlZiBzdW4KK2V4dGVybiB2b2lkIFVuaXhfUmVzZXRQYXJhbGxlbCh2b2lkKQoreworICAgIHN0cnVjdCBicHBfdHJhbnNmZXJfcGFybXMgdHA7CisKKyNpZmRlZiBERUJVRworICAgIHByaW50Zigic2VycGFyX3Jlc2V0XG4iKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiB3ZSBuZWVkIHRvIHNldCB0aGUgcGFyYWxsZWwgcG9ydCB1cCBmb3IgQlVTWSBoYW5kc2hha2luZywKKyAgICAgKiBhbmQgc2VsZWN0IHRoZSB0aW1lb3V0CisgICAgICovCisgICAgaWYgKGlvY3RsKHBhcnBmZCwgQlBQSU9DX0dFVFBBUk1TLCAmdHApIDwgMCkKKyAgICB7CisjaWZkZWYgREVCVUcKKyAgICAgICAgcGVycm9yKCJpb2N0bChCUFBJT0NHRVRQQVJNUykiKTsKKyNlbmRpZgorICAgICAgICBwYW5pYygic2VycGFyX3Jlc2V0OiBjYW5ub3QgZ2V0IEJQUCBwYXJhbWV0ZXJzIik7CisgICAgfQorCisgICAgdHAud3JpdGVfaGFuZHNoYWtlID0gQlBQX0JVU1lfSFM7CisgICAgdHAud3JpdGVfdGltZW91dCA9IFBQX1RJTUVPVVQ7CisKKyAgICBpZiAoaW9jdGwocGFycGZkLCBCUFBJT0NfU0VUUEFSTVMsICZ0cCkgPCAwKQorICAgIHsKKyNpZmRlZiBERUJVRworICAgICAgICBwZXJyb3IoImlvY3RsKEJQUElPQ19TRVRQQVJNUykiKTsKKyNlbmRpZgorICAgICAgICBwYW5pYygic2VycGFyX3Jlc2V0OiBjYW5ub3Qgc2V0IEJQUCBwYXJhbWV0ZXJzIik7CisgICAgfQorfQorCisjZWxzZQorCisvKiBQYXJhbGxlbCBub3Qgc3VwcG9ydGVkIG9uIEhQICovCisKK2V4dGVybiB2b2lkIFVuaXhfUmVzZXRQYXJhbGxlbCh2b2lkKQoreworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZ2RiL3JkaS1zaGFyZS91bml4Y29tbS5oIGIvZ2RiL3JkaS1zaGFyZS91bml4Y29tbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYTY1NTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmRpLXNoYXJlL3VuaXhjb21tLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHVzZWQsIGNvcGllZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBpcyBwcmVzZXJ2ZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUKKyAqIHNvZnR3YXJlLgorICovCisKKy8qIC0qLUMtKi0KKyAqCisgKiAkUmV2aXNpb24kCisgKiAgICAgJERhdGUkCisgKgorICovCisjaWZuZGVmIGFuZ3NkX3VuaXhjb21tX2gKKyNkZWZpbmUgYW5nc2RfdW5peGNvbW1faAorCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmIGRlZmluZWQoQlNEKQorIyAgZGVmaW5lIEVSUk5PX0ZPUl9CTE9DS0VEX0lPIEVXT1VMREJMT0NLCisjZWxzZQorIyAgZGVmaW5lIEVSUk5PX0ZPUl9CTE9DS0VEX0lPIEVBR0FJTgorI2VuZGlmCisKKy8qCisgKiAgRnVuY3Rpb246IFVuaXhfTWF0Y2hWYWxpZFNlcmlhbERldmljZQorICogICBQdXJwb3NlOiBjaGVjayB0aGF0IHRoZSBzZXJpYWwgZHJpdmVyL3BvcnQgbmFtZSBpcyB2YWxpZAorICogICAgICAgICAgICBhbmQgcmV0dXJuIHRoZSBhY3R1YWwgZGV2aWNlIG5hbWUgaWYgaXQgaXMuCisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IG5hbWUgICAgTmFtZSBvZiBkZXZpY2UgZ29pbmcgdG8gYmUgdXNlZAorICoKKyAqICAgUmV0dXJuczogCisgKiAgICAgICAgICBPSzogUG9pbnRlciB0byBuYW1lIG9mIHRoZSBkZXZpY2UgbWF0Y2hlZAorICogICAgICAgRXJyb3Igb3IgdW5yZWNvZ25pc2VkIGRlaXZjZTogMAorICovCitleHRlcm4gY29uc3QgY2hhciAqVW5peF9NYXRjaFZhbGlkU2VyaWFsRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUpOworCisvKgorICogIEZ1bmN0aW9uOiBVbml4X0lzU2VyaWFsSW5Vc2UKKyAqICAgUHVycG9zZTogY2hlY2sgd2hldGhlciB0aGUgc2VyaWFsIHBvcnQgaXMgaW4gdXNlCisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IE5vdGhpbmcKKyAqCisgKiAgIFJldHVybnM6IAorICogICAgICAgICAgT0s6IDAgICAgICAgU2VyaWFsIGRldmljZSBub3QgaW4gdXNlCisgKiAgICAgICBFcnJvcjogLTEgICAgICBTZXJpYWwgZGV2aWNlIGluIHVzZQorICovCitleHRlcm4gaW50IFVuaXhfSXNTZXJpYWxJblVzZSh2b2lkKTsKKworLyoKKyAqICBGdW5jdGlvbjogVW5peF9PcGVuU2VyaWFsCisgKiAgIFB1cnBvc2U6IG9wZW4gdGhlIHNlcmlhbCBwb3J0CisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IG5hbWUgICAgTmFtZSBvZiBkZXZpY2UgdG8gb3BlbgorICoKKyAqICAgUmV0dXJuczogVW5peCAnb3BlbicgcmV0dXJucworICovCitleHRlcm4gaW50IFVuaXhfT3BlblNlcmlhbChjb25zdCBjaGFyICpuYW1lKTsKKworLyoKKyAqICBGdW5jdGlvbjogVW5peF9DbG9zZVNlcmlhbAorICogICBQdXJwb3NlOiBjbG9zZSB0aGUgc2VyaWFsIHBvcnQKKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgICBJbnB1dDogTm90aGluZworICoKKyAqICAgUmV0dXJuczogTm90aGluZworICovCitleHRlcm4gdm9pZCBVbml4X0Nsb3NlU2VyaWFsKHZvaWQpOworCisvKgorICogIEZ1bmN0aW9uOiBVbml4X1JlYWRTZXJpYWwKKyAqICAgUHVycG9zZTogcmVhZHMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIChvciBsZXNzKSBmcm9tIHRoZSBzZXJpYWwgcG9ydAorICoKKyAqICAgIFBhcmFtczoKKyAqICAgICAgIElucHV0OiBidWYgICAgIEJ1ZmZlciB0byBzdG9yZSByZWFkIGJ5dGVzCisgKiAgICAgICAgICAgICAgbiAgICAgICBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkCisgKgorICogICBSZXR1cm5zOiBVbml4ICdyZWFkJyByZXR1cm5zCisgKi8KK2V4dGVybiBpbnQgVW5peF9SZWFkU2VyaWFsKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IG4sIGJvb2wgYmxvY2spOworCisvKgorICogIEZ1bmN0aW9uOiBVbml4X1dyaXRlU2VyaWFsCisgKiAgIFB1cnBvc2U6IHdyaXRlcyBhIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgKG9yIGxlc3MpIHRvIHRoZSBzZXJpYWwgcG9ydAorICoKKyAqICAgIFBhcmFtczoKKyAqICAgICAgIElucHV0OiBidWYgICAgIEJ1ZmZlciB0byB3cml0ZSBieXRlcyBmcm9tCisgKiAgICAgICAgICAgICAgbiAgICAgICBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICoKKyAqICAgUmV0dXJuczogVW5peCAnd3JpdGUnIHJldHVybnMKKyAqLworZXh0ZXJuIGludCBVbml4X1dyaXRlU2VyaWFsKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IG4pOworCisvKgorICogIEZ1bmN0aW9uOiBVbml4X1Jlc2V0U2VyaWFsCisgKiAgIFB1cnBvc2U6IHJlc2V0cyB0aGUgc2VyaWFsIHBvcnQgZm9yIGFub3RoZXIgb3BlcmF0aW9uCisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IE5vdGhpbmcKKyAqCisgKiAgIFJldHVybnM6IE5vdGhpbmcKKyAqLworZXh0ZXJuIHZvaWQgVW5peF9SZXNldFNlcmlhbCh2b2lkKTsKKworLyoKKyAqICBGdW5jdGlvbjogVW5peF9TZXRTZXJpYWxCYXVkUmF0ZQorICogICBQdXJwb3NlOiBjaGVjayB0aGF0IHRoZSBzZXJpYWwgZHJpdmVyL3BvcnQgbmFtZSBpcyB2YWxpZAorICoKKyAqICAgIFBhcmFtczoKKyAqICAgICAgIElucHV0OiBiYXVkcmF0ZSAgICB0ZXJtaW9zIHZhbHVlIGZvciBiYXVkIHJhdGUKKyAqCisgKiAgIFJldHVybnM6IE5vdGhpbmcKKyAqLworZXh0ZXJuIHZvaWQgVW5peF9TZXRTZXJpYWxCYXVkUmF0ZShpbnQgYmF1ZHJhdGUpOworCisvKgorICogIEZ1bmN0aW9uOiBVbml4X2lvY3RsTm9uQmxvY2tpbmcKKyAqICAgUHVycG9zZTogc2V0cyB0aGUgc2VyaWFsIHBvcnQgdG8gbm9uLWJsb2NraW5nIElPCisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IE5vdGhpbmcKKyAqCisgKiAgIFJldHVybnM6IE5vdGhpbmcKKyAqLworZXh0ZXJuIHZvaWQgVW5peF9pb2N0bE5vbkJsb2NraW5nKHZvaWQpOworCisvKgorICogIEZ1bmN0aW9uOiBVbml4X0lzVmFsaWRQYXJhbGxlbERldmljZQorICogICBQdXJwb3NlOiBjaGVjayB3aGV0aGVyIHRoZSBjb21iaW5lZCBzZXJpYWwgYW5kIHBhcmFsbGVsIGRldmljZSBzcGVjaWZpY2F0aW9uCisgKiAgICAgICAgICAgIGlzIG9rLCBhbmQgcmV0dXJuIHRoZSBwb3J0cyBzZWxlY3RlZAorICoKKyAqICAgIFBhcmFtczoKKyAqICAgICAgIElucHV0OiBwb3J0c3RyaW5nIC0gaXMgYSBzdHJpbmcgd2hpY2ggc3BlY2lmaWVzIHdoaWNoIHNlcmlhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcGFyYWxsZWwgcG9ydHMgYXJlIHRvIGJlIHVzZWQuIENhbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIHM9PHZhbD4gYW5kIHA9PHZhbD4gc2VwYXJhdGVkIGJ5IGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWEuCisgKgorICogICBSZXR1cm5zOiAKKyAqICAgICAgIE91dHB1dDogKnNlcm5hbWUgIC0gcmV0dXJucyB0aGUgZGV2aWNlIG5hbWUgb2YgdGhlIGNob3NlbiBzZXJpYWwgcG9ydAorICogICAgICAgICAgICAgICAqcGFybmFtZSAgLSByZXR1cm5zIHRoZSBkZXZpY2UgbmFtZSBvZiB0aGUgY2hvc2VuIHBhcmFsbGVsIHBvcnQKKyAqICAgICAgICAgICAgICAgSWYgZWl0aGVyIG9mIHRoZXNlIGlzIE5VTEwgb24gcmV0dXJuIHRoZW4gdGhlIG1hdGNoIGZhaWxlZC4KKyAqLworZXh0ZXJuIHZvaWQgVW5peF9Jc1ZhbGlkUGFyYWxsZWxEZXZpY2UoCisgIGNvbnN0IGNoYXIgKnBvcnRzdHJpbmcsIGNoYXIgKipzZXJuYW1lLCBjaGFyICoqcGFybmFtZQorKTsKKworLyoKKyAqICBGdW5jdGlvbjogVW5peF9Jc1BhcmFsbGVsSW5Vc2UKKyAqICAgUHVycG9zZTogY2hlY2sgd2hldGhlciB0aGUgcGFyYWxsZWwgcG9ydCBpcyBpbiB1c2UKKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgICBJbnB1dDogTm90aGluZworICoKKyAqICAgUmV0dXJuczogCisgKiAgICAgICAgICBPSzogMCAgICAgICBQYXJhbGxlbCBkZXZpY2Ugbm90IGluIHVzZQorICogICAgICAgRXJyb3I6IC0xICAgICAgUGFyYWxsZWwgZGV2aWNlIGluIHVzZQorICovCitleHRlcm4gaW50IFVuaXhfSXNQYXJhbGxlbEluVXNlKHZvaWQpOworCisvKgorICogIEZ1bmN0aW9uOiBVbml4X09wZW5QYXJhbGxlbAorICogICBQdXJwb3NlOiBvcGVuIHRoZSBwYXJhbGxlbCBwb3J0CisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IG5hbWUgICAgTmFtZSBvZiBkZXZpY2UgdG8gb3BlbgorICoKKyAqICAgUmV0dXJuczogVW5peCAnb3BlbicgcmV0dXJucworICovCitleHRlcm4gaW50IFVuaXhfT3BlblBhcmFsbGVsKGNvbnN0IGNoYXIgKm5hbWUpOworCisvKgorICogIEZ1bmN0aW9uOiBVbml4X0Nsb3NlUGFyYWxsZWwKKyAqICAgUHVycG9zZTogY2xvc2UgdGhlIHBhcmFsbGVsIHBvcnQKKyAqCisgKiAgICBQYXJhbXM6CisgKiAgICAgICBJbnB1dDogTm90aGluZworICoKKyAqICAgUmV0dXJuczogTm90aGluZworICovCitleHRlcm4gdm9pZCBVbml4X0Nsb3NlUGFyYWxsZWwodm9pZCk7CisKKy8qCisgKiAgRnVuY3Rpb246IFVuaXhfV3JpdGVQYXJhbGxlbAorICogICBQdXJwb3NlOiB3cml0ZXMgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIChvciBsZXNzKSB0byB0aGUgcGFyYWxsZWwgcG9ydAorICoKKyAqICAgIFBhcmFtczoKKyAqICAgICAgIElucHV0OiBidWYgICAgIEJ1ZmZlciB0byB3cml0ZSBieXRlcyBmcm9tCisgKiAgICAgICAgICAgICAgbiAgICAgICBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICoKKyAqICAgUmV0dXJuczogVW5peCAnd3JpdGUnIHJldHVybnMKKyAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBVbml4X1dyaXRlUGFyYWxsZWwodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbik7CisKKy8qCisgKiAgRnVuY3Rpb246IFVuaXhfUmVzZXRQYXJhbGxlbAorICogICBQdXJwb3NlOiByZXNldHMgdGhlIHBhcmFsbGVsIHBvcnQgZm9yIGFub3RoZXIgb3BlcmF0aW9uCisgKgorICogICAgUGFyYW1zOgorICogICAgICAgSW5wdXQ6IE5vdGhpbmcKKyAqCisgKiAgIFJldHVybnM6IE5vdGhpbmcKKyAqLworZXh0ZXJuIHZvaWQgVW5peF9SZXNldFBhcmFsbGVsKHZvaWQpOworCisjZW5kaWYgLyogbmRlZiBhbmdzZF91bml4Y29tbV9oICovCisKKy8qIEVPRiB1bml4Y29tbS5oICovCmRpZmYgLS1naXQgYS9nZGIvcmVtb3RlLWFkYXB0LmMgYi9nZGIvcmVtb3RlLWFkYXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIyZjE4MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZW1vdGUtYWRhcHQuYwpAQCAtMCwwICsxLDE0NDMgQEAKKy8qIFJlbW90ZSBkZWJ1Z2dpbmcgaW50ZXJmYWNlIGZvciBBTUQgMjkwKjAgQWRhcHQgTW9uaXRvciBWZXJzaW9uIDIuMWQxOC4gCisgICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIFdvb2QgYXQgTmV3IFlvcmsgVW5pdmVyc2l0eSAod29vZEBsYWIudWx0cmEubnl1LmVkdSkuCisgICBBZGFwdGVkIGZyb20gd29yayBkb25lIGF0IEN5Z251cyBTdXBwb3J0IGluIHJlbW90ZS1lYi5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgaXMgbGlrZSByZW1vdGUuYyBidXQgaXMgZm9yIGFuIGVzb3RlcmljIHNpdHVhdGlvbi0tCisgICBoYXZpbmcgYSAyOWsgYm9hcmQgYXR0YWNoZWQgdG8gYW4gQWRhcHQgaW5saW5lIG1vbml0b3IuIAorICAgVGhlICBtb25pdG9yIGlzIGNvbm5lY3RlZCB2aWEgc2VyaWFsIGxpbmUgdG8gYSB1bml4IG1hY2hpbmUgCisgICBydW5uaW5nIGdkYi4gCisKKyAgIDMvOTEgLSAgZGV2ZWxvcGVkIG9uIFN1bjMgT1MgNC4xLCBieSBEYXZpZCBXb29kCisgICAJbyAtIEkgY2FuJ3QgZ2V0IGJpbmFyeSBjb2ZmIHRvIGxvYWQuIAorCW8gLSBJIGNhbid0IGdldCAxOTIwMCBiYXVkIHJhdGUgdG8gd29yay4gCisgICA3LzkxIG8gLSBGcmVlemUgbW9kZSB0cmFjaW5nIGNhbiBiZSBkb25lIG9uIGEgMjkwNTAuICAqLworCisKKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJ3YWl0LmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJ0ZXJtaW5hbC5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKworLyogVGhpcyBwcm9jZXNzb3IgaXMgZ2V0dGluZyBydXN0eSBidXQgSSBhbSB0cnlpbmcgdG8ga2VlcCBpdAorICAgdXAgdG8gZGF0ZSBhdCBsZWFzdCB3aXRoIGRhdGEgc3RydWN0dXJlIGNoYW5nZXMuCisgICBBY3RpdmF0ZSB0aGlzIGJsb2NrIHRvIGNvbXBpbGUganVzdCB0aGlzIGZpbGUuCisgICAqLworI2RlZmluZSBDT01QSUxFX0NIRUNLIDAKKyNpZiBDT01QSUxFX0NIRUNLCisjZGVmaW5lIFFfUkVHTlVNIDAKKyNkZWZpbmUgVkFCX1JFR05VTSAwCisjZGVmaW5lIENQU19SRUdOVU0gMAorI2RlZmluZSBJUEFfUkVHTlVNIDAKKyNkZWZpbmUgSVBCX1JFR05VTSAwCisjZGVmaW5lIEdSMV9SRUdOVU0gMAorI2RlZmluZSBMUjBfUkVHTlVNIDAKKyNkZWZpbmUgSVBDX1JFR05VTSAwCisjZGVmaW5lIENSX1JFR05VTSAwCisjZGVmaW5lIEJQX1JFR05VTSAwCisjZGVmaW5lIEZDX1JFR05VTSAwCisjZGVmaW5lIElOVEVfUkVHTlVNIDAKKyNkZWZpbmUgRVhPX1JFR05VTSAwCisjZGVmaW5lIEdSOTZfUkVHTlVNIDAKKyNkZWZpbmUgTlBDX1JFR05VTQorI2RlZmluZSBGUEVfUkVHTlVNIDAKKyNkZWZpbmUgUEMyX1JFR05VTSAwCisjZGVmaW5lIEZQU19SRUdOVU0gMAorI2RlZmluZSBBTFVfUkVHTlVNIDAKKyNkZWZpbmUgTFJVX1JFR05VTSAwCisjZGVmaW5lIFRFUk1JTkFMIGludAorI2RlZmluZSBSQVcgMQorI2RlZmluZSBBTllQIDEKK2V4dGVybiBpbnQgYTI5a19mcmVlemVfbW9kZSA7CitleHRlcm4gaW50IHByb2Nlc3Nvcl90eXBlIDsKK2V4dGVybiBjaGFyICogcHJvY2Vzc29yX25hbWUgOworI2VuZGlmCisKKy8qIEV4dGVybmFsIGRhdGEgZGVjbGFyYXRpb25zICovCitleHRlcm4gaW50IHN0b3Bfc29vbl9xdWlldGx5OyAgICAgICAgICAgLyogZm9yIHdhaXRfZm9yX2luZmVyaW9yICovCisKKy8qIEZvcndhcmQgZGF0YSBkZWNsYXJhdGlvbnMgKi8KK2V4dGVybiBzdHJ1Y3QgdGFyZ2V0X29wcyBhZGFwdF9vcHM7CQkvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCisKKy8qIEZvcndhcmQgZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCitzdGF0aWMgdm9pZCBhZGFwdF9mZXRjaF9yZWdpc3RlcnMgKCk7CitzdGF0aWMgdm9pZCBhZGFwdF9zdG9yZV9yZWdpc3RlcnMgKCk7CitzdGF0aWMgdm9pZCBhZGFwdF9jbG9zZSAoKTsKK3N0YXRpYyBpbnQgIGFkYXB0X2NsZWFyX2JyZWFrcG9pbnRzKCk7CisKKyNkZWZpbmUgRlJFRVpFX01PREUgCShyZWFkX3JlZ2lzdGVyKENQU19SRUdOVU0pICYmIDB4NDAwKSAKKyNkZWZpbmUgVVNFX1NIQURPV19QQwkoKHByb2Nlc3Nvcl90eXBlID09IGEyOWtfZnJlZXplX21vZGUpICYmIEZSRUVaRV9NT0RFKQorCisvKiBDYW4ndCBzZWVtIHRvIGdldCBiaW5hcnkgY29mZiB3b3JraW5nICovCisjZGVmaW5lIEFTQ0lJX0NPRkYJCS8qIEFkYXB0IHdpbGwgYmUgZG93bmxvYWRlZCB3aXRoIGFzY2lpIGNvZmYgKi8KKworLyogRklYTUU6IFJlcGxhY2Ugd2l0aCBgc2V0IHJlbW90ZWRlYnVnJy4gICovCisjZGVmaW5lIExPR19GSUxFICJhZGFwdC5sb2ciCisjaWYgZGVmaW5lZCAoTE9HX0ZJTEUpCitGSUxFICpsb2dfZmlsZT1OVUxMOworI2VuZGlmCisKK3N0YXRpYyBpbnQgdGltZW91dCA9IDU7CitzdGF0aWMgY2hhciAqZGV2X25hbWU7CisKKy8qIERlc2NyaXB0b3IgZm9yIEkvTyB0byByZW1vdGUgbWFjaGluZS4gIEluaXRpYWxpemUgaXQgdG8gLTEgc28gdGhhdAorICAgYWRhcHRfb3BlbiBrbm93cyB0aGF0IHdlIGRvbid0IGhhdmUgYSBmaWxlIG9wZW4gd2hlbiB0aGUgcHJvZ3JhbQorICAgc3RhcnRzLiAgKi8KK2ludCBhZGFwdF9kZXNjID0gLTE7CisKKy8qIHN0cmVhbSB3aGljaCBpcyBmZG9wZW4nZCBmcm9tIGFkYXB0X2Rlc2MuICBPbmx5IHZhbGlkIHdoZW4KKyAgIGFkYXB0X2Rlc2MgIT0gLTEuICAqLworRklMRSAqYWRhcHRfc3RyZWFtOworCisjZGVmaW5lIE9OCTEKKyNkZWZpbmUgT0ZGCTAKK3N0YXRpYyB2b2lkCityYXdtb2RlKGRlc2MsIHR1cm5vbikKK2ludAlkZXNjOworaW50CXR1cm5vbjsKK3sKKyAgCisgIFRFUk1JTkFMIHNnOworCisgIGlmIChkZXNjIDwgMCkKKyAgICByZXR1cm47CisKKyAgaW9jdGwgKGRlc2MsIFRJT0NHRVRQLCAmc2cpOworCisgIGlmICh0dXJub24pIHsKKyNpZmRlZiBIQVZFX1RFUk1JTworICAJc2cuY19sZmxhZyAmPSB+KElDQU5PTik7CisjZWxzZQorCXNnLnNnX2ZsYWdzIHw9IFJBVzsKKyNlbmRpZgorICB9IGVsc2UgeworI2lmZGVmIEhBVkVfVEVSTUlPCisgIAlzZy5jX2xmbGFnIHw9IElDQU5PTjsKKyNlbHNlCisJc2cuc2dfZmxhZ3MgJj0gfihSQVcpOworI2VuZGlmCisgIH0KKyAgaW9jdGwgKGRlc2MsIFRJT0NTRVRQLCAmc2cpOworfQorCisvKiBTdWNrIHVwIGFsbCB0aGUgaW5wdXQgZnJvbSB0aGUgYWRhcHQgKi8KK3NsdXJwX2lucHV0KCkKK3sKKyAgY2hhciBidWZbOF07CisKKyNpZmRlZiBIQVZFX1RFUk1JTworICAvKiB0ZXJtaW8gZG9lcyB0aGUgdGltZW91dCBmb3IgdXMuICAqLworICB3aGlsZSAocmVhZCAoYWRhcHRfZGVzYywgYnVmLCA4KSA+IDApOworI2Vsc2UKKyAgYWxhcm0gKHRpbWVvdXQpOworICB3aGlsZSAocmVhZCAoYWRhcHRfZGVzYywgYnVmLCA4KSA+IDApOworICBhbGFybSAoMCk7CisjZW5kaWYKK30KKworLyogUmVhZCBhIGNoYXJhY3RlciBmcm9tIHRoZSByZW1vdGUgc3lzdGVtLCBkb2luZyBhbGwgdGhlIGZhbmN5CisgICB0aW1lb3V0IHN0dWZmLiAgKi8KK3N0YXRpYyBpbnQKK3JlYWRjaGFyICgpCit7CisgIGNoYXIgYnVmOworCisgIGJ1ZiA9ICdcMCc7CisjaWZkZWYgSEFWRV9URVJNSU8KKyAgLyogdGVybWlvIGRvZXMgdGhlIHRpbWVvdXQgZm9yIHVzLiAgKi8KKyAgcmVhZCAoYWRhcHRfZGVzYywgJmJ1ZiwgMSk7CisjZWxzZQorICBhbGFybSAodGltZW91dCk7CisgIGlmIChyZWFkIChhZGFwdF9kZXNjLCAmYnVmLCAxKSA8IDApCisgICAgeworICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorCWVycm9yICgiVGltZW91dCByZWFkaW5nIGZyb20gcmVtb3RlIHN5c3RlbS4iKTsKKyAgICAgIGVsc2UKKwlwZXJyb3Jfd2l0aF9uYW1lICgicmVtb3RlIik7CisgICAgfQorICBhbGFybSAoMCk7CisjZW5kaWYKKworICBpZiAoYnVmID09ICdcMCcpCisgICAgZXJyb3IgKCJUaW1lb3V0IHJlYWRpbmcgZnJvbSByZW1vdGUgc3lzdGVtLiIpOworI2lmIGRlZmluZWQgKExPR19GSUxFKQorICBwdXRjIChidWYgJiAweDdmLCBsb2dfZmlsZSk7CisjZW5kaWYKKyAgcmV0dXJuIGJ1ZiAmIDB4N2Y7Cit9CisKKy8qIEtlZXAgZGlzY2FyZGluZyBpbnB1dCBmcm9tIHRoZSByZW1vdGUgc3lzdGVtLCB1bnRpbCBTVFJJTkcgaXMgZm91bmQuIAorICAgTGV0IHRoZSB1c2VyIGJyZWFrIG91dCBpbW1lZGlhdGVseS4gICovCitzdGF0aWMgdm9pZAorZXhwZWN0IChzdHJpbmcpCisgICAgIGNoYXIgKnN0cmluZzsKK3sKKyAgY2hhciAqcCA9IHN0cmluZzsKKworICBmZmx1c2goYWRhcHRfc3RyZWFtKTsKKyAgaW1tZWRpYXRlX3F1aXQgPSAxOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAocmVhZGNoYXIoKSA9PSAqcCkKKwl7CisJICBwKys7CisJICBpZiAoKnAgPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGltbWVkaWF0ZV9xdWl0ID0gMDsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJcCA9IHN0cmluZzsKKyAgICB9Cit9CisKKy8qIEtlZXAgZGlzY2FyZGluZyBpbnB1dCB1bnRpbCB3ZSBzZWUgdGhlIGFkYXB0IHByb21wdC4KKworICAgVGhlIGNvbnZlbnRpb24gZm9yIGRlYWxpbmcgd2l0aCB0aGUgcHJvbXB0IGlzIHRoYXQgeW91CisgICBvIGdpdmUgeW91ciBjb21tYW5kCisgICBvICp0aGVuKiB3YWl0IGZvciB0aGUgcHJvbXB0LgorCisgICBUaHVzIHRoZSBsYXN0IHRoaW5nIHRoYXQgYSBwcm9jZWR1cmUgZG9lcyB3aXRoIHRoZSBzZXJpYWwgbGluZQorICAgd2lsbCBiZSBhbiBleHBlY3RfcHJvbXB0KCkuICBFeGNlcHRpb246ICBhZGFwdF9yZXN1bWUgZG9lcyBub3QKKyAgIHdhaXQgZm9yIHRoZSBwcm9tcHQsIGJlY2F1c2UgdGhlIHRlcm1pbmFsIGlzIGJlaW5nIGhhbmRlZCBvdmVyCisgICB0byB0aGUgaW5mZXJpb3IuICBIb3dldmVyLCB0aGUgbmV4dCB0aGluZyB3aGljaCBoYXBwZW5zIGFmdGVyIHRoYXQKKyAgIGlzIGEgYWRhcHRfd2FpdCB3aGljaCBkb2VzIHdhaXQgZm9yIHRoZSBwcm9tcHQuCisgICBOb3RlIHRoYXQgdGhpcyBpbmNsdWRlcyBhYm5vcm1hbCBleGl0LCBlLmcuIGVycm9yKCkuICBUaGlzIGlzCisgICBuZWNlc3NhcnkgdG8gcHJldmVudCBnZXR0aW5nIGludG8gc3RhdGVzIGZyb20gd2hpY2ggd2UgY2FuJ3QKKyAgIHJlY292ZXIuICAqLworc3RhdGljIHZvaWQKK2V4cGVjdF9wcm9tcHQgKCkKK3sKKyNpZiBkZWZpbmVkIChMT0dfRklMRSkKKyAgLyogVGhpcyBpcyBhIGNvbnZlbmllbnQgcGxhY2UgdG8gZG8gdGhpcy4gIFRoZSBpZGVhIGlzIHRvIGRvIGl0IG9mdGVuCisgICAgIGVub3VnaCB0aGF0IHdlIG5ldmVyIGxvc2UgbXVjaCBkYXRhIGlmIHdlIHRlcm1pbmF0ZSBhYm5vcm1hbGx5LiAgKi8KKyAgZmZsdXNoIChsb2dfZmlsZSk7CisjZW5kaWYKKyAgZmZsdXNoKGFkYXB0X3N0cmVhbSk7CisgIGV4cGVjdCAoIlxuIyAiKTsKK30KKworLyogR2V0IGEgaGV4IGRpZ2l0IGZyb20gdGhlIHJlbW90ZSBzeXN0ZW0gJiByZXR1cm4gaXRzIHZhbHVlLgorICAgSWYgaWdub3JlX3NwYWNlIGlzIG5vbnplcm8sIGlnbm9yZSBzcGFjZXMgKG5vdCBuZXdsaW5lLCB0YWIsIGV0YykuICAqLworc3RhdGljIGludAorZ2V0X2hleF9kaWdpdCAoaWdub3JlX3NwYWNlKQorICAgICBpbnQgaWdub3JlX3NwYWNlOworeworICBpbnQgY2g7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGNoID0gcmVhZGNoYXIgKCk7CisgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKKwlyZXR1cm4gY2ggLSAnMCc7CisgICAgICBlbHNlIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKQorCXJldHVybiBjaCAtICdBJyArIDEwOworICAgICAgZWxzZSBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykKKwlyZXR1cm4gY2ggLSAnYScgKyAxMDsKKyAgICAgIGVsc2UgaWYgKGNoID09ICcgJyAmJiBpZ25vcmVfc3BhY2UpCisJOworICAgICAgZWxzZQorCXsKKwkgIGV4cGVjdF9wcm9tcHQgKCk7CisJICBlcnJvciAoIkludmFsaWQgaGV4IGRpZ2l0IGZyb20gcmVtb3RlIHN5c3RlbS4iKTsKKwl9CisgICAgfQorfQorCisvKiBHZXQgYSBieXRlIGZyb20gYWRhcHRfZGVzYyBhbmQgcHV0IGl0IGluICpCWVQuICBBY2NlcHQgYW55IG51bWJlcgorICAgbGVhZGluZyBzcGFjZXMuICAqLworc3RhdGljIHZvaWQKK2dldF9oZXhfYnl0ZSAoYnl0KQorICAgICBjaGFyICpieXQ7Cit7CisgIGludCB2YWw7CisKKyAgdmFsID0gZ2V0X2hleF9kaWdpdCAoMSkgPDwgNDsKKyAgdmFsIHw9IGdldF9oZXhfZGlnaXQgKDApOworICAqYnl0ID0gdmFsOworfQorCisvKiBSZWFkIGEgMzItYml0IGhleCB3b3JkIGZyb20gdGhlIGFkYXB0LCBwcmVjZWRlZCBieSBhIHNwYWNlICAqLworc3RhdGljIGxvbmcgCitnZXRfaGV4X3dvcmQoKQoreworICBsb25nIHZhbDsKKyAgaW50IGo7CisgICAgICAKKyAgdmFsID0gMDsKKyAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwl2YWwgPSAodmFsIDw8IDQpICsgZ2V0X2hleF9kaWdpdCAoaiA9PSAwKTsKKyAgcmV0dXJuIHZhbDsKK30KKy8qIEdldCBOIDMyLWJpdCBoZXggd29yZHMgZnJvbSByZW1vdGUsIGVhY2ggcHJlY2VkZWQgYnkgYSBzcGFjZSAKKyAgIGFuZCBwdXQgdGhlbSBpbiByZWdpc3RlcnMgc3RhcnRpbmcgYXQgUkVHTk8uICAqLworc3RhdGljIHZvaWQKK2dldF9oZXhfcmVncyAobiwgcmVnbm8pCisgICAgIGludCBuOworICAgICBpbnQgcmVnbm87Cit7CisJbG9uZyB2YWw7CisJd2hpbGUgKG4tLSkgeworCQl2YWwgPSBnZXRfaGV4X3dvcmQoKTsKKwkJc3VwcGx5X3JlZ2lzdGVyKHJlZ25vKyssKGNoYXIgKikgJnZhbCk7CisJfQorfQorLyogQ2FsbGVkIHdoZW4gU0lHQUxSTSBzaWduYWwgc2VudCBkdWUgdG8gYWxhcm0oKSB0aW1lb3V0LiAgKi8KKyNpZm5kZWYgSEFWRV9URVJNSU8KKworI2lmbmRlZiBfX1NURENfXworIyBpZm5kZWYgdm9sYXRpbGUKKyMgIGRlZmluZSB2b2xhdGlsZSAvKiovCisjIGVuZGlmCisjZW5kaWYKK3ZvbGF0aWxlIGludCBuX2FsYXJtczsKKwordm9pZAorYWRhcHRfdGltZXIgKCkKK3sKKyNpZiAwCisgIGlmIChraW9kZWJ1ZykKKyAgICBwcmludGYgKCJhZGFwdF90aW1lciBjYWxsZWRcbiIpOworI2VuZGlmCisgIG5fYWxhcm1zKys7Cit9CisjZW5kaWYKKworLyogbWFsbG9jJ2QgbmFtZSBvZiB0aGUgcHJvZ3JhbSBvbiB0aGUgcmVtb3RlIHN5c3RlbS4gICovCitzdGF0aWMgY2hhciAqcHJvZ19uYW1lID0gTlVMTDsKKworLyogTnVtYmVyIG9mIFNJR1RSQVBzIHdlIG5lZWQgdG8gc2ltdWxhdGUuICBUaGF0IGlzLCB0aGUgbmV4dAorICAgTkVFRF9BUlRJRklDSUFMX1RSQVAgY2FsbHMgdG8gYWRhcHRfd2FpdCBzaG91bGQganVzdCByZXR1cm4KKyAgIFNJR1RSQVAgd2l0aG91dCBhY3R1YWxseSB3YWl0aW5nIGZvciBhbnl0aGluZy4gICovCisKK3N0YXRpYyBpbnQgbmVlZF9hcnRpZmljaWFsX3RyYXAgPSAwOworCit2b2lkCithZGFwdF9raWxsKGFyZyxmcm9tX3R0eSkKK2NoYXIJKmFyZzsKK2ludAlmcm9tX3R0eTsKK3sKKwlmcHJpbnRmIChhZGFwdF9zdHJlYW0sICJLIik7CisJZnByaW50ZiAoYWRhcHRfc3RyZWFtLCAiXHIiKTsKKwlleHBlY3RfcHJvbXB0ICgpOworfQorLyoKKyAqIERvd25sb2FkIGEgZmlsZSBzcGVjaWZpZWQgaW4gJ2FyZ3MnLCB0byB0aGUgYWRhcHQuIAorICogRklYTUU6IEFzc3VtZXMgdGhlIGZpbGUgdG8gZG93bmxvYWQgaXMgYSBiaW5hcnkgY29mZiBmaWxlLgorICovCitzdGF0aWMgdm9pZAorYWRhcHRfbG9hZChhcmdzLGZyb210dHkpCitjaGFyCSphcmdzOworaW50CWZyb210dHk7Cit7CisJRklMRSAqZnA7CisJaW50CW47CisJY2hhcglidWZmZXJbMTAyNF07CisJCisJaWYgKCFhZGFwdF9zdHJlYW0pIHsKKwkJcHJpbnRmX2ZpbHRlcmVkKCJBZGFwdCBub3Qgb3Blbi4gVXNlICd0YXJnZXQnIGNvbW1hbmQgdG8gb3BlbiBhZGFwdFxuIik7CisJCXJldHVybjsKKwl9CisKKyAgCS8qIE9LLCBub3cgcmVhZCBpbiB0aGUgZmlsZS4gIFk9cmVhZCwgQz1DT0ZGLCBUPWRUZSBwb3J0CisgICAgIAkJMD1zdGFydCBhZGRyZXNzLiAgKi8KKworI2lmZGVmIEFTQ0lJX0NPRkYJLyogQXNjaWkgY29mZiAqLworCWZwcmludGYgKGFkYXB0X3N0cmVhbSwgIllBIFQsMFxyIik7CisJZmZsdXNoKGFkYXB0X3N0cmVhbSk7IAkvKiBKdXN0IGluIGNhc2UgKi8KKwkvKiBGSVhNRTogc2hvdWxkIGNoZWNrIGFyZ3MgZm9yIG9ubHkgMSBhcmd1bWVudCAqLworCXNwcmludGYoYnVmZmVyLCJjYXQgJXMgfCBidG9hID4gL3RtcC8jYWRhcHQtYnRvYSIsYXJncyk7CisJc3lzdGVtKGJ1ZmZlcik7CisJZnAgPSBmb3BlbigiL3RtcC8jYWRhcHQtYnRvYSIsInIiKTsKKwlyYXdtb2RlKGFkYXB0X2Rlc2MsT0ZGKTsJCisJd2hpbGUgKG49ZnJlYWQoYnVmZmVyLDEsMTAyNCxmcCkpIHsKKwkJZG8geyBuIC09IHdyaXRlKGFkYXB0X2Rlc2MsYnVmZmVyLG4pOyB9IHdoaWxlIChuPjApOworCQlpZiAobjwwKSB7IHBlcnJvcigid3JpdGluZyBhc2NpaSBjb2ZmIik7IGJyZWFrOyB9CisJfQorCWZjbG9zZShmcCk7CisJcmF3bW9kZShhZGFwdF9kZXNjLE9OKTsJCisJc3lzdGVtKCJybSAvdG1wLyNhZGFwdC1idG9hIik7CisjZWxzZQkvKiBCaW5hcnkgY29mZiAtIGNhbid0IGdldCBpdCB0byB3b3JrIC4qLworCWZwcmludGYgKGFkYXB0X3N0cmVhbSwgIllDIFQsMFxyIik7CisJZmZsdXNoKGFkYXB0X3N0cmVhbSk7IAkvKiBKdXN0IGluIGNhc2UgKi8KKwlpZiAoIShmcCA9IGZvcGVuKGFyZ3MsInIiKSkpIHsKKwkJcHJpbnRmX2ZpbHRlcmVkKCJDYW4ndCBvcGVuICVzXG4iLGFyZ3MpOworCQlyZXR1cm47CisJfQorCXdoaWxlIChuPWZyZWFkKGJ1ZmZlciwxLDUxMixmcCkpIHsKKwkJZG8geyBuIC09IHdyaXRlKGFkYXB0X2Rlc2MsYnVmZmVyLG4pOyB9IHdoaWxlIChuPjApOworCQlpZiAobjwwKSB7IHBlcnJvcigid3JpdGluZyBhc2NpaSBjb2ZmIik7IGJyZWFrOyB9CisJfQorCWZjbG9zZShmcCk7CisjZW5kaWYKKyAgCWV4cGVjdF9wcm9tcHQgKCk7CS8qIFNraXAgZ2FyYmFnZSB0aGF0IGNvbWVzIG91dCAqLworCWZwcmludGYgKGFkYXB0X3N0cmVhbSwgIlxyIik7CisgIAlleHBlY3RfcHJvbXB0ICgpOworfQorCisvKiBUaGlzIGlzIGNhbGxlZCBub3Qgb25seSB3aGVuIHdlIGZpcnN0IGF0dGFjaCwgYnV0IGFsc28gd2hlbiB0aGUKKyAgIHVzZXIgdHlwZXMgInJ1biIgYWZ0ZXIgaGF2aW5nIGF0dGFjaGVkLiAgKi8KK3ZvaWQKK2FkYXB0X2NyZWF0ZV9pbmZlcmlvciAoZXhlY2ZpbGUsIGFyZ3MsIGVudikKKyAgICAgY2hhciAqZXhlY2ZpbGU7CisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGludCBlbnRyeV9wdDsKKworICBpZiAoYXJncyAmJiAqYXJncykKKyAgICBlcnJvciAoIkNhbid0IHBhc3MgYXJndW1lbnRzIHRvIHJlbW90ZSBhZGFwdCBwcm9jZXNzLiIpOworCisgIGlmIChleGVjZmlsZSA9PSAwIHx8IGV4ZWNfYmZkID09IDApCisgICAgZXJyb3IgKCJObyBleGVjdXRhYmxlIGZpbGUgc3BlY2lmaWVkIik7CisKKyAgZW50cnlfcHQgPSAoaW50KSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGV4ZWNfYmZkKTsKKworICBpZiAoYWRhcHRfc3RyZWFtKSB7CisJYWRhcHRfa2lsbChOVUxMLE5VTEwpOwkgCisJYWRhcHRfY2xlYXJfYnJlYWtwb2ludHMoKTsKKwlpbml0X3dhaXRfZm9yX2luZmVyaW9yICgpOworCS8qIENsZWFyIHRoZSBpbnB1dCBiZWNhdXNlIHdoYXQgdGhlIGFkYXB0IHNlbmRzIGJhY2sgaXMgZGlmZmVyZW50CisJICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgaXQgd2FzIHJ1bm5pbmcgb3Igbm90LgorCSAqLworCXNsdXJwX2lucHV0KCk7CS8qIEFmdGVyIHRoaXMgdGhlcmUgc2hvdWxkIGJlIGEgcHJvbXB0ICovCisJZnByaW50ZihhZGFwdF9zdHJlYW0sIlxyIik7IAorCWV4cGVjdF9wcm9tcHQoKTsKKwlwcmludGZfZmlsdGVyZWQoIkRvIHlvdSB3YW50IHRvIGRvd25sb2FkICclcycgKHkvbik/IFt5XSA6ICIscHJvZ19uYW1lKTsKKwl7CQorCQljaGFyIGJ1ZmZlclsxMF07CisJCWdldHMoYnVmZmVyKTsKKwkJaWYgKCpidWZmZXIgIT0gJ24nKSB7CisJCQlhZGFwdF9sb2FkKHByb2dfbmFtZSwwKTsKKwkJfQorCX0KKworI2lmZGVmIE5PVERFRgorCS8qIFNldCB0aGUgUEMgYW5kIHdhaXQgZm9yIGEgZ28vY29udCAqLworCSAgZnByaW50ZiAoYWRhcHRfc3RyZWFtLCAiRyAleCxOXHIiLGVudHJ5X3B0KTsKKwkgIHByaW50Zl9maWx0ZXJlZCgiTm93IHVzZSB0aGUgJ2NvbnRpbnVlJyBjb21tYW5kIHRvIHN0YXJ0LlxuIik7IAorICAJICBleHBlY3RfcHJvbXB0ICgpOworI2Vsc2UKKyAgCWluc2VydF9icmVha3BvaW50cyAoKTsgIC8qIE5lZWRlZCB0byBnZXQgY29ycmVjdCBpbnN0cnVjdGlvbiBpbiBjYWNoZSAqLworICAJcHJvY2VlZChlbnRyeV9wdCwgVEFSR0VUX1NJR05BTF9ERUZBVUxULCAwKTsKKyNlbmRpZgorCisgIH0gZWxzZSB7CisJcHJpbnRmX2ZpbHRlcmVkKCJBZGFwdCBub3Qgb3BlbiB5ZXQuXG4iKTsKKyAgfQorfQorCisvKiBUcmFuc2xhdGUgYmF1ZCByYXRlcyBmcm9tIGludGVnZXJzIHRvIGRhbW4gQl9jb2Rlcy4gIFVuaXggc2hvdWxkCisgICBoYXZlIG91dGdyb3duIHRoaXMgY3JhcCB5ZWFycyBhZ28sIGJ1dCBldmVuIFBPU0lYIHdvdWxkbid0IGJ1Y2sgaXQuICAqLworCisjaWZuZGVmIEIxOTIwMAorI2RlZmluZSBCMTkyMDAgRVhUQQorI2VuZGlmCisjaWZuZGVmIEIzODQwMAorI2RlZmluZSBCMzg0MDAgRVhUQgorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qge2ludCByYXRlLCBkYW1uX2I7fSBiYXVkdGFiW10gPSB7CisJezAsIEIwfSwKKwl7NTAsIEI1MH0sCisJezc1LCBCNzV9LAorCXsxMTAsIEIxMTB9LAorCXsxMzQsIEIxMzR9LAorCXsxNTAsIEIxNTB9LAorCXsyMDAsIEIyMDB9LAorCXszMDAsIEIzMDB9LAorCXs2MDAsIEI2MDB9LAorCXsxMjAwLCBCMTIwMH0sCisJezE4MDAsIEIxODAwfSwKKwl7MjQwMCwgQjI0MDB9LAorCXs0ODAwLCBCNDgwMH0sCisJezk2MDAsIEI5NjAwfSwKKwl7MTkyMDAsIEIxOTIwMH0sCisJezM4NDAwLCBCMzg0MDB9LAorCXstMSwgLTF9LAorfTsKKworc3RhdGljIGludCBkYW1uX2IgKHJhdGUpCisgICAgIGludCByYXRlOworeworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBiYXVkdGFiW2ldLnJhdGUgIT0gLTE7IGkrKykKKyAgICBpZiAocmF0ZSA9PSBiYXVkdGFiW2ldLnJhdGUpIHJldHVybiBiYXVkdGFiW2ldLmRhbW5fYjsKKyAgcmV0dXJuIEIzODQwMDsJLyogUmFuZG9tICovCit9CisKKworLyogT3BlbiBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgZGVidWdnZXIuCisgICBOQU1FIGlzIHRoZSBmaWxlbmFtZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uLCB0aGVuIGEgc3BhY2UsCisgICB0aGVuIHRoZSBiYXVkIHJhdGUuCisgKi8KKworc3RhdGljIGludCBiYXVkcmF0ZSA9IDk2MDA7CitzdGF0aWMgdm9pZAorYWRhcHRfb3BlbiAobmFtZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgVEVSTUlOQUwgc2c7CisgIHVuc2lnbmVkIGludCBwcmw7CisgIGNoYXIgKnA7CisKKyAgLyogRmluZCB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIsIGl0IHNlcGFyYXRlcyBkZXZfbmFtZSBmcm9tCisgICAgIHByb2dfbmFtZS4gICovCisgIGlmIChuYW1lID09IDApCisgICAgZ290byBlcnJvaWQ7CisKKyAgZm9yIChwID0gbmFtZTsKKyAgICAgICAqcCAhPSAnXDAnICYmICFpc3NwYWNlICgqcCk7IHArKykKKyAgICA7CisgIGlmICgqcCA9PSAnXDAnKQorZXJyb2lkOgorICAgIGVycm9yICgiXAorUGxlYXNlIGluY2x1ZGUgdGhlIG5hbWUgb2YgdGhlIGRldmljZSBmb3IgdGhlIHNlcmlhbCBwb3J0LFxuXAordGhlIGJhdWQgcmF0ZSwgYW5kIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHJ1biBvbiB0aGUgcmVtb3RlIHN5c3RlbS4iKTsKKyAgZGV2X25hbWUgPSAoY2hhciopeG1hbGxvYyhwIC0gbmFtZSArIDEpOworICBzdHJuY3B5IChkZXZfbmFtZSwgbmFtZSwgcCAtIG5hbWUpOworICBkZXZfbmFtZVtwIC0gbmFtZV0gPSAnXDAnOworCisgIC8qIFNraXAgb3ZlciB0aGUgd2hpdGVzcGFjZSBhZnRlciBkZXZfbmFtZSAqLworICBmb3IgKDsgaXNzcGFjZSAoKnApOyBwKyspCisgICAgLypFTVBUWSovOworICAKKyAgaWYgKDEgIT0gc3NjYW5mIChwLCAiJWQgIiwgJmJhdWRyYXRlKSkKKyAgICBnb3RvIGVycm9pZDsKKworICAvKiBTa2lwIHRoZSBudW1iZXIgYW5kIHRoZW4gdGhlIHNwYWNlcyAqLworICBmb3IgKDsgaXNkaWdpdCAoKnApOyBwKyspCisgICAgLypFTVBUWSovOworICBmb3IgKDsgaXNzcGFjZSAoKnApOyBwKyspCisgICAgLypFTVBUWSovOworICAKKyAgaWYgKHByb2dfbmFtZSAhPSBOVUxMKQorICAgIGZyZWUgKHByb2dfbmFtZSk7CisgIHByb2dfbmFtZSA9IHNhdmVzdHJpbmcgKHAsIHN0cmxlbiAocCkpOworCisgIGFkYXB0X2Nsb3NlICgwKTsKKworICBhZGFwdF9kZXNjID0gb3BlbiAoZGV2X25hbWUsIE9fUkRXUik7CisgIGlmIChhZGFwdF9kZXNjIDwgMCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lIChkZXZfbmFtZSk7CisgIGlvY3RsIChhZGFwdF9kZXNjLCBUSU9DR0VUUCwgJnNnKTsKKyNpZiAhIGRlZmluZWQoQ09NUElMRV9DSEVDSykgCisjaWZkZWYgSEFWRV9URVJNSU8KKyAgc2cuY19jY1tWTUlOXSA9IDA7CQkvKiByZWFkIHdpdGggdGltZW91dC4gICovCisgIHNnLmNfY2NbVlRJTUVdID0gdGltZW91dCAqIDEwOworICBzZy5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyk7CisgIHNnLmNfY2ZsYWcgPSAoc2cuY19jZmxhZyAmIH5DQkFVRCkgfCBkYW1uX2IgKGJhdWRyYXRlKTsKKyNlbHNlCisgIHNnLnNnX2lzcGVlZCA9IGRhbW5fYiAoYmF1ZHJhdGUpOworICBzZy5zZ19vc3BlZWQgPSBkYW1uX2IgKGJhdWRyYXRlKTsKKyAgc2cuc2dfZmxhZ3MgfD0gUkFXIHwgQU5ZUDsKKyAgc2cuc2dfZmxhZ3MgJj0gfkVDSE87CisjZW5kaWYKKworICBpb2N0bCAoYWRhcHRfZGVzYywgVElPQ1NFVFAsICZzZyk7CisgIGFkYXB0X3N0cmVhbSA9IGZkb3BlbiAoYWRhcHRfZGVzYywgInIrIik7CisjZW5kaWYgLyogY29tcGlsZV9jaGVjayAqLworICBwdXNoX3RhcmdldCAoJmFkYXB0X29wcyk7CisKKyNpZm5kZWYgSEFWRV9URVJNSU8KKyNpZm5kZWYgTk9fU0lHSU5URVJSVVBUCisgIC8qIENhdXNlIFNJR0FMUk0ncyB0byBtYWtlIHJlYWRzIGZhaWwgd2l0aCBFSU5UUiBpbnN0ZWFkIG9mIHJlc3VtaW5nCisgICAgIHRoZSByZWFkLiAgKi8KKyAgaWYgKHNpZ2ludGVycnVwdCAoU0lHQUxSTSwgMSkgIT0gMCkKKyAgICBwZXJyb3IgKCJhZGFwdF9vcGVuOiBlcnJvciBpbiBzaWdpbnRlcnJ1cHQiKTsKKyNlbmRpZgorCisgIC8qIFNldCB1cCByZWFkIHRpbWVvdXQgdGltZXIuICAqLworICBpZiAoKHZvaWQgKCopKSBzaWduYWwgKFNJR0FMUk0sIGFkYXB0X3RpbWVyKSA9PSAodm9pZCAoKikpIC0xKQorICAgIHBlcnJvciAoImFkYXB0X29wZW46IGVycm9yIGluIHNpZ25hbCIpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChMT0dfRklMRSkKKyAgbG9nX2ZpbGUgPSBmb3BlbiAoTE9HX0ZJTEUsICJ3Iik7CisgIGlmIChsb2dfZmlsZSA9PSBOVUxMKQorICAgIHBlcnJvcl93aXRoX25hbWUgKExPR19GSUxFKTsKKyNlbmRpZgorCisgIC8qIFB1dCB0aGlzIHBvcnQgaW50byBOT1JNQUwgbW9kZSwgc2VuZCB0aGUgJ25vcm1hbCcgY2hhcmFjdGVyICovCisgIHdyaXRlKGFkYXB0X2Rlc2MsICIBIiwgMSk7CS8qIENvbnRyb2wgQSAqLworICB3cml0ZShhZGFwdF9kZXNjLCAiXHIiLCAxKTsJCisgIGV4cGVjdF9wcm9tcHQgKCk7CisgIAorICAvKiBIZWxsbz8gIEFyZSB5b3UgdGhlcmU/ICAqLworICB3cml0ZSAoYWRhcHRfZGVzYywgIlxyIiwgMSk7CisgCisgIGV4cGVjdF9wcm9tcHQgKCk7CisKKyAgLyogQ2xlYXIgYW55IGJyZWFrIHBvaW50cyAqLworICBhZGFwdF9jbGVhcl9icmVha3BvaW50cygpOworCisgIC8qIFByaW50IG91dCBzb21lIHN0dWZmLCBsZXR0aW5nIHRoZSB1c2VyIG5vdyB3aGF0J3MgZ29pbmcgb24gKi8KKyAgcHJpbnRmX2ZpbHRlcmVkKCJDb25uZWN0ZWQgdG8gYW4gQWRhcHQgdmlhICVzLlxuIiwgZGV2X25hbWUpOworICAgIC8qIEZJWE1FOiBjYW4gdGhpcyByZXN0cmljdGlvbiBiZSByZW1vdmVkPyAqLworICBwcmludGZfZmlsdGVyZWQoIlJlbW90ZSBkZWJ1Z2dpbmcgdXNpbmcgdmlydHVhbCBhZGRyZXNzZXMgd29ya3Mgb25seVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXHR3aGVuIHZpcnR1YWwgYWRkcmVzc2VzIG1hcCAxOjEgdG8gcGh5c2ljYWwgYWRkcmVzc2VzLlxuIik7IAorICBpZiAocHJvY2Vzc29yX3R5cGUgIT0gYTI5a19mcmVlemVfbW9kZSkgeworCWZwcmludGZfZmlsdGVyZWQoZ2RiX3N0ZGVyciwKKwkiRnJlZXplLW1vZGUgZGVidWdnaW5nIG5vdCBhdmFpbGFibGUsIGFuZCBjYW4gb25seSBiZSBkb25lIG9uIGFuIEEyOTA1MC5cbiIpOworICB9Cit9CisKKy8qIENsb3NlIG91dCBhbGwgZmlsZXMgYW5kIGxvY2FsIHN0YXRlIGJlZm9yZSB0aGlzIHRhcmdldCBsb3NlcyBjb250cm9sLiAqLworCitzdGF0aWMgdm9pZAorYWRhcHRfY2xvc2UgKHF1aXR0aW5nKQorICAgICBpbnQgcXVpdHRpbmc7Cit7CisKKyAgLyogQ2xlYXIgYW55IGJyZWFrIHBvaW50cyAqLworICBhZGFwdF9jbGVhcl9icmVha3BvaW50cygpOworCisgIC8qIFB1dCB0aGlzIHBvcnQgYmFjayBpbnRvIFJFTU9URSBtb2RlICovIAorICBpZiAoYWRhcHRfc3RyZWFtKSB7CisgICAgIGZmbHVzaChhZGFwdF9zdHJlYW0pOworICAgICBzbGVlcCgxKTsJCS8qIExldCBhbnkgb3V0cHV0IG1ha2UgaXQgYWxsIHRoZSB3YXkgYmFjayAqLworICAgICB3cml0ZShhZGFwdF9kZXNjLCAiUlxyIiwgMik7CisgIH0KKworICAvKiBEdWUgdG8gYSBidWcgaW4gVW5peCwgZmNsb3NlIGNsb3NlcyBub3Qgb25seSB0aGUgc3RkaW8gc3RyZWFtLAorICAgICBidXQgYWxzbyB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgU28gd2UgZG9uJ3QgYWN0dWFsbHkgY2xvc2UKKyAgICAgYWRhcHRfZGVzYy4gICovCisgIGlmIChhZGFwdF9zdHJlYW0pCisgICAgZmNsb3NlIChhZGFwdF9zdHJlYW0pOwkvKiBUaGlzIGFsc28gY2xvc2VzIGFkYXB0X2Rlc2MgKi8KKyAgaWYgKGFkYXB0X2Rlc2MgPj0gMCkKKyAgICAvKiBjbG9zZSAoYWRhcHRfZGVzYyk7ICovCisKKyAgLyogRG8gbm90IHRyeSB0byBjbG9zZSBhZGFwdF9kZXNjIGFnYWluLCBsYXRlciBpbiB0aGUgcHJvZ3JhbS4gICovCisgIGFkYXB0X3N0cmVhbSA9IE5VTEw7CisgIGFkYXB0X2Rlc2MgPSAtMTsKKworI2lmIGRlZmluZWQgKExPR19GSUxFKQorICBpZiAobG9nX2ZpbGUpIHsKKyAgICBpZiAoZmVycm9yIChsb2dfZmlsZSkpCisgICAgICBwcmludGZfZmlsdGVyZWQgKCJFcnJvciB3cml0aW5nIGxvZyBmaWxlLlxuIik7CisgICAgaWYgKGZjbG9zZSAobG9nX2ZpbGUpICE9IDApCisgICAgICBwcmludGZfZmlsdGVyZWQgKCJFcnJvciBjbG9zaW5nIGxvZyBmaWxlLlxuIik7CisgICAgbG9nX2ZpbGUgPSBOVUxMOworICB9CisjZW5kaWYKK30KKworLyogQXR0YWNoIHRvIHRoZSB0YXJnZXQgdGhhdCBpcyBhbHJlYWR5IGxvYWRlZCBhbmQgcG9zc2libHkgcnVubmluZyAqLworc3RhdGljIHZvaWQKK2FkYXB0X2F0dGFjaCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKworICBpZiAoZnJvbV90dHkpCisgICAgICBwcmludGZfZmlsdGVyZWQgKCJBdHRhY2hpbmcgdG8gcmVtb3RlIHByb2dyYW0gJXMuXG4iLCBwcm9nX25hbWUpOworCisgIC8qIFNlbmQgdGhlIGFkYXB0IGEga2lsbC4gSXQgaXMgb2sgaWYgaXQgaXMgbm90IGFscmVhZHkgcnVubmluZyAqLworICBmcHJpbnRmKGFkYXB0X3N0cmVhbSwgIktcciIpOyBmZmx1c2goYWRhcHRfc3RyZWFtKTsKKyAgZXhwZWN0X3Byb21wdCgpOwkJLyogU2x1cnAgdGhlIGVjaG8gKi8KK30KKworCisvKiBUZXJtaW5hdGUgdGhlIG9wZW4gY29ubmVjdGlvbiB0byB0aGUgcmVtb3RlIGRlYnVnZ2VyLgorICAgVXNlIHRoaXMgd2hlbiB5b3Ugd2FudCB0byBkZXRhY2ggYW5kIGRvIHNvbWV0aGluZyBlbHNlCisgICB3aXRoIHlvdXIgZ2RiLiAgKi8KK3ZvaWQKK2FkYXB0X2RldGFjaCAoYXJncyxmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworCisgIGlmIChhZGFwdF9zdHJlYW0pIHsgLyogU2VuZCBpdCBvbiBpdHMgd2F5ICh0ZWxsIGl0IHRvIGNvbnRpbnVlKSAgKi8KKwlhZGFwdF9jbGVhcl9icmVha3BvaW50cygpOworICAJZnByaW50ZihhZGFwdF9zdHJlYW0sIkdcciIpOworICB9CisgCisgIHBvcF90YXJnZXQoKTsJCS8qIGNhbGxzIGFkYXB0X2Nsb3NlIHRvIGRvIHRoZSByZWFsIHdvcmsgKi8KKyAgaWYgKGZyb21fdHR5KQorICAgIHByaW50Zl9maWx0ZXJlZCAoIkVuZGluZyByZW1vdGUgJXMgZGVidWdnaW5nXG4iLCB0YXJnZXRfc2hvcnRuYW1lKTsKK30KKyAKKy8qIFRlbGwgdGhlIHJlbW90ZSBtYWNoaW5lIHRvIHJlc3VtZS4gICovCisKK3ZvaWQKK2FkYXB0X3Jlc3VtZSAocGlkLCBzdGVwLCBzaWcpCisgICAgIGludCBwaWQsIHN0ZXA7CisgICAgIGVudW0gdGFyZ2V0X3NpZ25hbCBzaWc7Cit7CisgIGlmIChzdGVwKQkKKyAgICB7CisgICAgICB3cml0ZSAoYWRhcHRfZGVzYywgInQgMSxzXHIiLCA2KTsKKyAgICAgIC8qIFdhaXQgZm9yIHRoZSBlY2hvLiAgKi8KKyAgICAgIGV4cGVjdCAoInQgMSxzXHJcbiIpOworICAgICAgLyogVGhlbiBjb21lcyBhIGxpbmUgY29udGFpbmluZyB0aGUgaW5zdHJ1Y3Rpb24gd2Ugc3RlcHBlZCB0by4gICovCisgICAgICBleHBlY3QgKCJAIik7CisgICAgICAvKiBUaGVuIHdlIGdldCB0aGUgcHJvbXB0LiAgKi8KKyAgICAgIGV4cGVjdF9wcm9tcHQgKCk7CisKKyAgICAgIC8qIEZvcmNlIHRoZSBuZXh0IGFkYXB0X3dhaXQgdG8gcmV0dXJuIGEgdHJhcC4gIE5vdCBkb2luZyBhbnl0aGluZworICAgICAgICAgYWJvdXQgSS9PIGZyb20gdGhlIHRhcmdldCBtZWFucyB0aGF0IHRoZSB1c2VyIGhhcyB0byB0eXBlCisgICAgICAgICAiY29udGludWUiIHRvIHNlZSBhbnkuICBGSVhNRSwgdGhpcyBzaG91bGQgYmUgZml4ZWQuICAqLworICAgICAgbmVlZF9hcnRpZmljaWFsX3RyYXAgPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHdyaXRlIChhZGFwdF9kZXNjLCAiR1xyIiwgMik7CisgICAgICAvKiBTd2FsbG93IHRoZSBlY2hvLiAgKi8KKyAgICAgIGV4cGVjdF9wcm9tcHQoKTsgCisgICAgfQorfQorCisvKiBXYWl0IHVudGlsIHRoZSByZW1vdGUgbWFjaGluZSBzdG9wcywgdGhlbiByZXR1cm4sCisgICBzdG9yaW5nIHN0YXR1cyBpbiBTVEFUVVMganVzdCBhcyBgd2FpdCcgd291bGQuICAqLworCitpbnQKK2FkYXB0X3dhaXQgKHN0YXR1cykKKyAgICAgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpzdGF0dXM7Cit7CisgIC8qIFN0cmluZ3MgdG8gbG9vayBmb3IuICAnPycgbWVhbnMgbWF0Y2ggYW55IHNpbmdsZSBjaGFyYWN0ZXIuICAKKyAgICAgTm90ZSB0aGF0IHdpdGggdGhlIGFsZ29yaXRobSB3ZSB1c2UsIHRoZSBpbml0aWFsIGNoYXJhY3RlcgorICAgICBvZiB0aGUgc3RyaW5nIGNhbm5vdCByZWN1ciBpbiB0aGUgc3RyaW5nLCBvciB3ZSB3aWxsIG5vdAorICAgICBmaW5kIHNvbWUgY2FzZXMgb2YgdGhlIHN0cmluZyBpbiB0aGUgaW5wdXQuICAqLworICAKKyAgc3RhdGljIGNoYXIgYnB0W10gPSAiQCI7CisgIC8qIEl0IHdvdWxkIGJlIHRlbXB0aW5nIHRvIGxvb2sgZm9yICJcbltfX2V4aXQgKyAweDhdXG4iCisgICAgIGJ1dCB0aGF0IHJlcXVpcmVzIGxvYWRpbmcgc3ltYm9scyB3aXRoICJ5YyBpIiBhbmQgZXZlbiBpZgorICAgICB3ZSBkaWQgZG8gdGhhdCB3ZSBkb24ndCBrbm93IHRoYXQgdGhlIGZpbGUgaGFzIHN5bWJvbHMuICAqLworICBzdGF0aWMgY2hhciBleGl0bXNnW10gPSAiQD8/Pz8/Pz8/SSAgICBKTVBUSSAgICAgR1IxMjEsTFIwIjsKKyAgY2hhciAqYnAgPSBicHQ7CisgIGNoYXIgKmVwID0gZXhpdG1zZzsKKworICAvKiBMYXJnZSBlbm91Z2ggZm9yIGVpdGhlciBzaXplb2YgKGJwdCkgb3Igc2l6ZW9mIChleGl0bXNnKSBjaGFycy4gICovCisgIGNoYXIgc3dhbGxvd2VkWzUwXTsKKyAgLyogQ3VycmVudCBwb3NpdGlvbiBpbiBzd2FsbG93ZWQuICAqLworICBjaGFyICpzd2FsbG93ZWRfcCA9IHN3YWxsb3dlZDsKKworICBpbnQgY2g7CisgIGludCBjaF9oYW5kbGVkOworICBpbnQgb2xkX3RpbWVvdXQgPSB0aW1lb3V0OworICBpbnQgb2xkX2ltbWVkaWF0ZV9xdWl0ID0gaW1tZWRpYXRlX3F1aXQ7CisKKyAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0VYSVRFRDsKKyAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gMDsKKworICBpZiAobmVlZF9hcnRpZmljaWFsX3RyYXAgIT0gMCkKKyAgICB7CisgICAgICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKyAgICAgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQOworICAgICAgbmVlZF9hcnRpZmljaWFsX3RyYXAtLTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICB0aW1lb3V0ID0gMDsJCS8qIERvbid0IHRpbWUgb3V0IC0tIHVzZXIgcHJvZ3JhbSBpcyBydW5uaW5nLiAqLworICBpbW1lZGlhdGVfcXVpdCA9IDE7CS8qIEhlbHBzIGFiaWxpdHkgdG8gUVVJVCAqLworICB3aGlsZSAoMSkgeworICAgICAgUVVJVDsJCS8qIExldCB1c2VyIHF1aXQgYW5kIGxlYXZlIHByb2Nlc3MgcnVubmluZyAqLworICAgICAgY2hfaGFuZGxlZCA9IDA7CisgICAgICBjaCA9IHJlYWRjaGFyICgpOworICAgICAgaWYgKGNoID09ICpicCkgeworCSAgYnArKzsKKwkgIGlmICgqYnAgPT0gJ1wwJykKKwkgICAgYnJlYWs7CisJICBjaF9oYW5kbGVkID0gMTsKKworCSAgKnN3YWxsb3dlZF9wKysgPSBjaDsKKyAgICAgIH0gZWxzZQorCWJwID0gYnB0OworICAgICAgaWYgKGNoID09ICplcCB8fCAqZXAgPT0gJz8nKSB7CisJICBlcCsrOworCSAgaWYgKCplcCA9PSAnXDAnKQorCSAgICBicmVhazsKKworCSAgaWYgKCFjaF9oYW5kbGVkKQorCSAgICAqc3dhbGxvd2VkX3ArKyA9IGNoOworCSAgY2hfaGFuZGxlZCA9IDE7CisgICAgICB9IGVsc2UKKwllcCA9IGV4aXRtc2c7CisgICAgICBpZiAoIWNoX2hhbmRsZWQpIHsKKwkgIGNoYXIgKnA7CisJICAvKiBQcmludCBvdXQgYW55IGNoYXJhY3RlcnMgd2hpY2ggaGF2ZSBiZWVuIHN3YWxsb3dlZC4gICovCisJICBmb3IgKHAgPSBzd2FsbG93ZWQ7IHAgPCBzd2FsbG93ZWRfcDsgKytwKQorCSAgICBwdXRjICgqcCwgc3Rkb3V0KTsKKwkgIHN3YWxsb3dlZF9wID0gc3dhbGxvd2VkOworCSAgcHV0YyAoY2gsIHN0ZG91dCk7CisgICAgICB9CisgIH0KKyAgZXhwZWN0X3Byb21wdCAoKTsKKyAgaWYgKCpicD09ICdcMCcpCisgICAgeworICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVFJBUDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVEOworICAgICAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gMDsKKyAgICB9CisgIHRpbWVvdXQgPSBvbGRfdGltZW91dDsKKyAgaW1tZWRpYXRlX3F1aXQgPSBvbGRfaW1tZWRpYXRlX3F1aXQ7CisgIHJldHVybiAwOworfQorCisvKiBSZXR1cm4gdGhlIG5hbWUgb2YgcmVnaXN0ZXIgbnVtYmVyIFJFR05PCisgICBpbiB0aGUgZm9ybSBpbnB1dCBhbmQgb3V0cHV0IGJ5IGFkYXB0LgorCisgICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0YXRpYyBidWZmZXIgY29udGFpbmluZyB0aGUgYW5zd2VyLiAgKi8KK3N0YXRpYyBjaGFyICoKK2dldF9yZWdfbmFtZSAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgc3RhdGljIGNoYXIgYnVmWzgwXTsKKyAgaWYgKHJlZ25vID49IEdSOTZfUkVHTlVNICYmIHJlZ25vIDwgR1I5Nl9SRUdOVU0gKyAzMiApCisgICAgc3ByaW50ZiAoYnVmLCAiR1IlMDNkIiwgcmVnbm8gLSBHUjk2X1JFR05VTSArIDk2KTsKKyNpZiBkZWZpbmVkKEdSNjRfUkVHTlVNKQorICBlbHNlIGlmIChyZWdubyA+PSBHUjY0X1JFR05VTSAmJiByZWdubyA8IEdSNjRfUkVHTlVNICsgMzIgKQorICAgIHNwcmludGYgKGJ1ZiwgIkdSJTAzZCIsIHJlZ25vIC0gR1I2NF9SRUdOVU0gKyA2NCk7CisjZW5kaWYKKyAgZWxzZSBpZiAocmVnbm8gPj0gTFIwX1JFR05VTSAmJiByZWdubyA8IExSMF9SRUdOVU0gKyAxMjgpCisgICAgc3ByaW50ZiAoYnVmLCAiTFIlMDNkIiwgcmVnbm8gLSBMUjBfUkVHTlVNKTsKKyAgZWxzZSBpZiAocmVnbm8gPT0gUV9SRUdOVU0pIAorICAgIHN0cmNweSAoYnVmLCAiU1IxMzEiKTsKKyAgZWxzZSBpZiAocmVnbm8gPj0gQlBfUkVHTlVNICYmIHJlZ25vIDw9IENSX1JFR05VTSkKKyAgICBzcHJpbnRmIChidWYsICJTUiUwM2QiLCByZWdubyAtIEJQX1JFR05VTSArIDEzMyk7CisgIGVsc2UgaWYgKHJlZ25vID09IEFMVV9SRUdOVU0pCisgICAgc3RyY3B5IChidWYsICJTUjEzMiIpOworICBlbHNlIGlmIChyZWdubyA+PSBJUENfUkVHTlVNICYmIHJlZ25vIDw9IElQQl9SRUdOVU0pCisgICAgc3ByaW50ZiAoYnVmLCAiU1IlMDNkIiwgcmVnbm8gLSBJUENfUkVHTlVNICsgMTI4KTsKKyAgZWxzZSBpZiAocmVnbm8gPj0gVkFCX1JFR05VTSAmJiByZWdubyA8PSBMUlVfUkVHTlVNKSB7CisgICAgLyogV2hlbiBhIDI5MDUwIGlzIGluIGZyZWV6ZS1tb2RlLCByZWFkIHNoYWRvdyBwY3MgaW5zdGVhZCAqLworICAgIGlmICgocmVnbm8gPj0gTlBDX1JFR05VTSAmJiByZWdubyA8PSBQQzJfUkVHTlVNKSAmJiBVU0VfU0hBRE9XX1BDKQorICAgIAlzcHJpbnRmIChidWYsICJTUiUwM2QiLCByZWdubyAtIE5QQ19SRUdOVU0gKyAyMCk7CisgICAgZWxzZQorICAgIAlzcHJpbnRmIChidWYsICJTUiUwM2QiLCByZWdubyAtIFZBQl9SRUdOVU0pOworICB9CisgIGVsc2UgaWYgKHJlZ25vID09IEdSMV9SRUdOVU0pCisgICAgc3RyY3B5IChidWYsICJHUjAwMSIpOworICByZXR1cm4gYnVmOworfQorCisvKiBSZWFkIHRoZSByZW1vdGUgcmVnaXN0ZXJzLiAgKi8KKworc3RhdGljIHZvaWQKK2FkYXB0X2ZldGNoX3JlZ2lzdGVycyAoKQoreworICBpbnQgcmVnX2luZGV4OworICBpbnQgcmVnbnVtX2luZGV4OworICBjaGFyIHRlbXBidWZbMTBdOworICBpbnQJc3JlZ19idWZbMTZdOworICBpbnQgaSxqOworCisvKiAKKyAqIEdsb2JhbCByZWdpc3RlcnMKKyAqLworI2lmIGRlZmluZWQoR1I2NF9SRUdOVU0pCisgIHdyaXRlIChhZGFwdF9kZXNjLCAiZHcgZ3I2NCxncjk1XHIiLCAxMyk7CisgIGZvciAocmVnX2luZGV4ID0gNjQsIHJlZ251bV9pbmRleCA9IEdSNjRfUkVHTlVNOworICAgICAgIHJlZ19pbmRleCA8IDk2OworICAgICAgIHJlZ19pbmRleCArPSA0LCByZWdudW1faW5kZXggKz0gNCkKKyAgICB7CisgICAgICBzcHJpbnRmICh0ZW1wYnVmLCAiR1IlMDNkICIsIHJlZ19pbmRleCk7CisgICAgICBleHBlY3QgKHRlbXBidWYpOworICAgICAgZ2V0X2hleF9yZWdzICg0LCByZWdudW1faW5kZXgpOworICAgICAgZXhwZWN0ICgiXG4iKTsKKyAgICB9CisjZW5kaWYKKyAgd3JpdGUgKGFkYXB0X2Rlc2MsICJkdyBncjk2LGdyMTI3XHIiLCAxNCk7CisgIGZvciAocmVnX2luZGV4ID0gOTYsIHJlZ251bV9pbmRleCA9IEdSOTZfUkVHTlVNOworICAgICAgIHJlZ19pbmRleCA8IDEyODsKKyAgICAgICByZWdfaW5kZXggKz0gNCwgcmVnbnVtX2luZGV4ICs9IDQpCisgICAgeworICAgICAgc3ByaW50ZiAodGVtcGJ1ZiwgIkdSJTAzZCAiLCByZWdfaW5kZXgpOworICAgICAgZXhwZWN0ICh0ZW1wYnVmKTsKKyAgICAgIGdldF9oZXhfcmVncyAoNCwgcmVnbnVtX2luZGV4KTsKKyAgICAgIGV4cGVjdCAoIlxuIik7CisgICAgfQorCisvKiAKKyAqIExvY2FsIHJlZ2lzdGVycworICovCisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkgKz0gMzIpCisgICAgeworICAgICAgLyogVGhlIFBDIGhhcyBhIHRlbmRlbmN5IHRvIGhhbmcgaWYgd2UgZ2V0IHRoZXNlCisJIGFsbCBpbiBvbmUgZmVsbCBzd29vcCAoImR3IGxyMCxscjEyNyIpLiAgKi8KKyAgICAgIHNwcmludGYgKHRlbXBidWYsICJkdyBsciVkXHIiLCBpKTsKKyAgICAgIHdyaXRlIChhZGFwdF9kZXNjLCB0ZW1wYnVmLCBzdHJsZW4gKHRlbXBidWYpKTsKKyAgICAgIGZvciAocmVnX2luZGV4ID0gaSwgcmVnbnVtX2luZGV4ID0gTFIwX1JFR05VTSArIGk7CisJICAgcmVnX2luZGV4IDwgaSArIDMyOworCSAgIHJlZ19pbmRleCArPSA0LCByZWdudW1faW5kZXggKz0gNCkKKwl7CisJICBzcHJpbnRmICh0ZW1wYnVmLCAiTFIlMDNkICIsIHJlZ19pbmRleCk7CisJICBleHBlY3QgKHRlbXBidWYpOworCSAgZ2V0X2hleF9yZWdzICg0LCByZWdudW1faW5kZXgpOworCSAgZXhwZWN0ICgiXG4iKTsKKwl9CisgICAgfQorCisvKiAKKyAqIFNwZWNpYWwgcmVnaXN0ZXJzCisgKi8KKyAgc3ByaW50ZiAodGVtcGJ1ZiwgImR3IHNyMFxyIik7CisgIHdyaXRlIChhZGFwdF9kZXNjLCB0ZW1wYnVmLCBzdHJsZW4gKHRlbXBidWYpKTsKKyAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsJCQkvKiBTUjAgLSBTUjE0ICovCisgICAgICAgIHNwcmludGYgKHRlbXBidWYsICJTUiUzZCIsaSo0KTsKKwlleHBlY3QodGVtcGJ1Zik7CisJZm9yIChqPTAgOyBqIDwgKGk9PTMgPyAzIDogNCkgOyBqKyspCisJCXNyZWdfYnVmW2kqNCArIGpdID0gZ2V0X2hleF93b3JkKCk7CisgIH0JCQorICBleHBlY3RfcHJvbXB0KCk7CisgIC8qIAorICAgKiBSZWFkIHRoZSBwY3MgaW5kaXZpZHVhbGx5IGlmIHdlIGFyZSBpbiBmcmVlemUgbW9kZS4KKyAgICogU2VlIGdldF9yZWdfbmFtZSgpLCBpdCB0cmFuc2xhdGVzIHRoZSByZWdpc3RlciBuYW1lcyBmb3IgdGhlIHBjcyB0bworICAgKiB0aGUgbmFtZXMgb2YgdGhlIHNoYWRvdyBwY3MuCisgICAqLyAKKyAgaWYgKFVTRV9TSEFET1dfUEMpICB7CisJICBzcmVnX2J1ZlsxMF0gPSByZWFkX3JlZ2lzdGVyKE5QQ19SRUdOVU0pOwkvKiBwYzAgKi8KKwkgIHNyZWdfYnVmWzExXSA9IHJlYWRfcmVnaXN0ZXIoUENfUkVHTlVNKTsJLyogcGMxICovCisJICBzcmVnX2J1ZlsxMl0gPSByZWFkX3JlZ2lzdGVyKFBDMl9SRUdOVU0pOwkvKiBwYzIgKi8KKyAgfQorICBmb3IgKGk9MCA7IGk8MTQgOyBpKyspCQkvKiBTdXBwbHkgdmFiIC0+IGxydSAqLworIAlzdXBwbHlfcmVnaXN0ZXIoVkFCX1JFR05VTStpLCAoY2hhciAqKSAmc3JlZ19idWZbaV0pOworICBzcHJpbnRmICh0ZW1wYnVmLCAiZHcgc3IxMjhcciIpOworICB3cml0ZSAoYWRhcHRfZGVzYywgdGVtcGJ1Ziwgc3RybGVuICh0ZW1wYnVmKSk7CisgIGZvciAoaT0wIDsgaTwyIDsgaSsrKSB7CQkJLyogU1IxMjggLSBTUjEzNSAqLworICAgICAgICBzcHJpbnRmICh0ZW1wYnVmLCAiU1IlM2QiLDEyOCArIGkqNCk7CisJZXhwZWN0KHRlbXBidWYpOworCWZvciAoaj0wIDsgajw0IDsgaisrKQorCQlzcmVnX2J1ZltpKjQgKyBqXSA9IGdldF9oZXhfd29yZCgpOworICB9CQkKKyAgZXhwZWN0X3Byb21wdCgpOworICBzdXBwbHlfcmVnaXN0ZXIoSVBDX1JFR05VTSwoY2hhciAqKSAmc3JlZ19idWZbMF0pOworICBzdXBwbHlfcmVnaXN0ZXIoSVBBX1JFR05VTSwoY2hhciAqKSAmc3JlZ19idWZbMV0pOworICBzdXBwbHlfcmVnaXN0ZXIoSVBCX1JFR05VTSwoY2hhciAqKSAmc3JlZ19idWZbMl0pOworICBzdXBwbHlfcmVnaXN0ZXIoUV9SRUdOVU0sICAoY2hhciAqKSAmc3JlZ19idWZbM10pOworCQkvKiBTa2lwIEFMVSAqLworICBzdXBwbHlfcmVnaXN0ZXIoQlBfUkVHTlVNLCAoY2hhciAqKSAmc3JlZ19idWZbNV0pOworICBzdXBwbHlfcmVnaXN0ZXIoRkNfUkVHTlVNLCAoY2hhciAqKSAmc3JlZ19idWZbNl0pOworICBzdXBwbHlfcmVnaXN0ZXIoQ1JfUkVHTlVNLCAoY2hhciAqKSAmc3JlZ19idWZbN10pOworCisgIC8qIFRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgd2F5IHRvIGdldCB0aGVzZS4gICovCisgIHsKKyAgICBpbnQgdmFsID0gLTE7CisgICAgc3VwcGx5X3JlZ2lzdGVyIChGUEVfUkVHTlVNLCAoY2hhciAqKSAmdmFsKTsKKyAgICBzdXBwbHlfcmVnaXN0ZXIgKElOVEVfUkVHTlVNLCAoY2hhciAqKSAmdmFsKTsKKyAgICBzdXBwbHlfcmVnaXN0ZXIgKEZQU19SRUdOVU0sIChjaGFyICopICZ2YWwpOworICAgIHN1cHBseV9yZWdpc3RlciAoRVhPX1JFR05VTSwgKGNoYXIgKikgJnZhbCk7CisgIH0KKworICB3cml0ZSAoYWRhcHRfZGVzYywgImR3IGdyMSxncjFcciIsIDExKTsKKyAgZXhwZWN0ICgiR1IwMDEgIik7CisgIGdldF9oZXhfcmVncyAoMSwgR1IxX1JFR05VTSk7CisgIGV4cGVjdF9wcm9tcHQgKCk7Cit9CisKKy8qIEZldGNoIHJlZ2lzdGVyIFJFR05PLCBvciBhbGwgcmVnaXN0ZXJzIGlmIFJFR05PIGlzIC0xLgorICovCitzdGF0aWMgdm9pZAorYWRhcHRfZmV0Y2hfcmVnaXN0ZXIgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGlmIChyZWdubyA9PSAtMSkKKyAgICBhZGFwdF9mZXRjaF9yZWdpc3RlcnMgKCk7CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyICpuYW1lID0gZ2V0X3JlZ19uYW1lIChyZWdubyk7CisgICAgICBmcHJpbnRmIChhZGFwdF9zdHJlYW0sICJkdyAlcywlc1xyIiwgbmFtZSwgbmFtZSk7CisgICAgICBleHBlY3QgKG5hbWUpOworICAgICAgZXhwZWN0ICgiICIpOworICAgICAgZ2V0X2hleF9yZWdzICgxLCByZWdubyk7CisgICAgICBleHBlY3RfcHJvbXB0ICgpOworICAgIH0KK30KKworLyogU3RvcmUgdGhlIHJlbW90ZSByZWdpc3RlcnMgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIGJsb2NrIFJFR1MuICAqLworCitzdGF0aWMgdm9pZAorYWRhcHRfc3RvcmVfcmVnaXN0ZXJzICgpCit7CisgIGludCBpLCBqOworCisgIGZwcmludGYgKGFkYXB0X3N0cmVhbSwgInMgZ3IxLCV4XHIiLCByZWFkX3JlZ2lzdGVyIChHUjFfUkVHTlVNKSk7CisgIGV4cGVjdF9wcm9tcHQgKCk7CisKKyNpZiBkZWZpbmVkKEdSNjRfUkVHTlVNKQorICBmb3IgKGogPSAwOyBqIDwgMzI7IGogKz0gMTYpCisgICAgeworICAgICAgZnByaW50ZiAoYWRhcHRfc3RyZWFtLCAicyBnciVkLCIsIGogKyA2NCk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMTU7ICsraSkgCisJZnByaW50ZiAoYWRhcHRfc3RyZWFtLCAiJXgsIiwgcmVhZF9yZWdpc3RlciAoR1I2NF9SRUdOVU0gKyBqICsgaSkpOworICAgICAgZnByaW50ZiAoYWRhcHRfc3RyZWFtLCAiJXhcciIsIHJlYWRfcmVnaXN0ZXIgKEdSNjRfUkVHTlVNICsgaiArIDE1KSk7CisgICAgICBleHBlY3RfcHJvbXB0ICgpOworICAgIH0KKyNlbmRpZgorICBmb3IgKGogPSAwOyBqIDwgMzI7IGogKz0gMTYpCisgICAgeworICAgICAgZnByaW50ZiAoYWRhcHRfc3RyZWFtLCAicyBnciVkLCIsIGogKyA5Nik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMTU7ICsraSkgCisJZnByaW50ZiAoYWRhcHRfc3RyZWFtLCAiJXgsIiwgcmVhZF9yZWdpc3RlciAoR1I5Nl9SRUdOVU0gKyBqICsgaSkpOworICAgICAgZnByaW50ZiAoYWRhcHRfc3RyZWFtLCAiJXhcciIsIHJlYWRfcmVnaXN0ZXIgKEdSOTZfUkVHTlVNICsgaiArIDE1KSk7CisgICAgICBleHBlY3RfcHJvbXB0ICgpOworICAgIH0KKworICBmb3IgKGogPSAwOyBqIDwgMTI4OyBqICs9IDE2KQorICAgIHsKKyAgICAgIGZwcmludGYgKGFkYXB0X3N0cmVhbSwgInMgbHIlZCwiLCBqKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAxNTsgKytpKSAKKwlmcHJpbnRmIChhZGFwdF9zdHJlYW0sICIleCwiLCByZWFkX3JlZ2lzdGVyIChMUjBfUkVHTlVNICsgaiArIGkpKTsKKyAgICAgIGZwcmludGYgKGFkYXB0X3N0cmVhbSwgIiV4XHIiLCByZWFkX3JlZ2lzdGVyIChMUjBfUkVHTlVNICsgaiArIDE1KSk7CisgICAgICBleHBlY3RfcHJvbXB0ICgpOworICAgIH0KKworICBmcHJpbnRmIChhZGFwdF9zdHJlYW0sICJzIHNyMTI4LCV4LCV4LCV4XHIiLCByZWFkX3JlZ2lzdGVyIChJUENfUkVHTlVNKSwKKwkgICByZWFkX3JlZ2lzdGVyIChJUEFfUkVHTlVNKSwgcmVhZF9yZWdpc3RlciAoSVBCX1JFR05VTSkpOworICBleHBlY3RfcHJvbXB0ICgpOworICBmcHJpbnRmIChhZGFwdF9zdHJlYW0sICJzIHNyMTMzLCV4LCV4LCV4XHIiLCByZWFkX3JlZ2lzdGVyIChCUF9SRUdOVU0pLAorCSAgIHJlYWRfcmVnaXN0ZXIgKEZDX1JFR05VTSksIHJlYWRfcmVnaXN0ZXIgKENSX1JFR05VTSkpOworICBleHBlY3RfcHJvbXB0ICgpOworICBmcHJpbnRmIChhZGFwdF9zdHJlYW0sICJzIHNyMTMxLCV4XHIiLCByZWFkX3JlZ2lzdGVyIChRX1JFR05VTSkpOworICBleHBlY3RfcHJvbXB0ICgpOworICBmcHJpbnRmIChhZGFwdF9zdHJlYW0sICJzIHNyMCwiKTsKKyAgZm9yIChpPTAgOyBpPDcgOyArK2kpCisgICAgZnByaW50ZiAoYWRhcHRfc3RyZWFtLCAiJXgsIiwgcmVhZF9yZWdpc3RlciAoVkFCX1JFR05VTSArIGkpKTsKKyAgZXhwZWN0X3Byb21wdCAoKTsKKyAgZnByaW50ZiAoYWRhcHRfc3RyZWFtLCAicyBzcjcsIik7CisgIGZvciAoaT03OyBpPDE0IDsgKytpKQorICAgIGZwcmludGYgKGFkYXB0X3N0cmVhbSwgIiV4LCIsIHJlYWRfcmVnaXN0ZXIgKFZBQl9SRUdOVU0gKyBpKSk7CisgIGV4cGVjdF9wcm9tcHQgKCk7Cit9CisKKy8qIFN0b3JlIHJlZ2lzdGVyIFJFR05PLCBvciBhbGwgaWYgUkVHTk8gPT0gLTEuCisgICBSZXR1cm4gZXJybm8gdmFsdWUuICAqLwordm9pZAorYWRhcHRfc3RvcmVfcmVnaXN0ZXIgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIC8qIHByaW50ZigiYWRhcHRfc3RvcmVfcmVnaXN0ZXIoKSBjYWxsZWQuXG4iKTsgZmZsdXNoKHN0ZG91dCk7IC8qICovCisgIGlmIChyZWdubyA9PSAtMSkKKyAgICBhZGFwdF9zdG9yZV9yZWdpc3RlcnMgKCk7CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyICpuYW1lID0gZ2V0X3JlZ19uYW1lIChyZWdubyk7CisgICAgICBmcHJpbnRmIChhZGFwdF9zdHJlYW0sICJzICVzLCV4XHIiLCBuYW1lLCByZWFkX3JlZ2lzdGVyIChyZWdubykpOworICAgICAgLyogU2V0dGluZyBHUjEgY2hhbmdlcyB0aGUgbnVtYmVycyBvZiBhbGwgdGhlIGxvY2Fscywgc28KKwkgaW52YWxpZGF0ZSB0aGUgcmVnaXN0ZXIgY2FjaGUuICBEbyB0aGlzICphZnRlciogY2FsbGluZworCSByZWFkX3JlZ2lzdGVyLCBiZWNhdXNlIHdlIHdhbnQgcmVhZF9yZWdpc3RlciB0byByZXR1cm4gdGhlCisJIHZhbHVlIHRoYXQgd3JpdGVfcmVnaXN0ZXIgaGFzIGp1c3Qgc3R1ZmZlZCBpbnRvIHRoZSByZWdpc3RlcnMKKwkgYXJyYXksIG5vdCB0aGUgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyIGZldGNoZWQgZnJvbSB0aGUKKwkgaW5mZXJpb3IuICAqLworICAgICAgaWYgKHJlZ25vID09IEdSMV9SRUdOVU0pCisJcmVnaXN0ZXJzX2NoYW5nZWQgKCk7CisgICAgICBleHBlY3RfcHJvbXB0ICgpOworICAgIH0KK30KKworLyogR2V0IHJlYWR5IHRvIG1vZGlmeSB0aGUgcmVnaXN0ZXJzIGFycmF5LiAgT24gbWFjaGluZXMgd2hpY2ggc3RvcmUKKyAgIGluZGl2aWR1YWwgcmVnaXN0ZXJzLCB0aGlzIGRvZXNuJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gIE9uIG1hY2hpbmVzCisgICB3aGljaCBzdG9yZSBhbGwgdGhlIHJlZ2lzdGVycyBpbiBvbmUgZmVsbCBzd29vcCwgdGhpcyBtYWtlcyBzdXJlCisgICB0aGF0IHJlZ2lzdGVycyBjb250YWlucyBhbGwgdGhlIHJlZ2lzdGVycyBmcm9tIHRoZSBwcm9ncmFtIGJlaW5nCisgICBkZWJ1Z2dlZC4gICovCisKK3ZvaWQKK2FkYXB0X3ByZXBhcmVfdG9fc3RvcmUgKCkKK3sKKyAgLyogRG8gbm90aGluZywgc2luY2Ugd2UgY2FuIHN0b3JlIGluZGl2aWR1YWwgcmVncyAqLworfQorCitzdGF0aWMgQ09SRV9BRERSIAordHJhbnNsYXRlX2FkZHIoYWRkcikKK0NPUkVfQUREUiBhZGRyOworeworI2lmIGRlZmluZWQoS0VSTkVMX0RFQlVHR0lORykKKwkvKiBDaGVjayBmb3IgYSB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhlIGtlcm5lbCAqLworCS8qIEFzc3VtZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHVibG9jayBpcyBpbiAgcGFkZHJfdSByZWdpc3RlciAqLworCWlmIChhZGRyID49IFVWQUREUikgeworCQkvKiBQQUREUl9VIHJlZ2lzdGVyIGhvbGRzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSB1YmxvY2sgKi8KKwkJQ09SRV9BRERSIGkgPSAoQ09SRV9BRERSKXJlYWRfcmVnaXN0ZXIoUEFERFJfVV9SRUdOVU0pOwkKKwkJcmV0dXJuKGkgKyBhZGRyIC0gKENPUkVfQUREUilVVkFERFIpOworCX0gZWxzZSB7CisJCXJldHVybihhZGRyKTsKKwl9CisjZWxzZQorCXJldHVybihhZGRyKTsKKyNlbmRpZgorfQorCisKKy8qIEZJWE1FISAgTWVyZ2UgdGhlc2UgdHdvLiAgKi8KK2ludAorYWRhcHRfeGZlcl9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuLCB3cml0ZSkKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IHdyaXRlOworeworCisgIG1lbWFkZHIgPSB0cmFuc2xhdGVfYWRkcihtZW1hZGRyKTsKKworICBpZiAod3JpdGUpCisgICAgcmV0dXJuIGFkYXB0X3dyaXRlX2luZmVyaW9yX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4pOworICBlbHNlCisgICAgcmV0dXJuIGFkYXB0X3JlYWRfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbik7Cit9CisKK3ZvaWQKK2FkYXB0X2ZpbGVzX2luZm8gKCkKK3sKKyAgcHJpbnRmX2ZpbHRlcmVkKCJcdEF0dGFjaGVkIHRvICVzIGF0ICVkIGJhdWQgYW5kIHJ1bm5pbmcgcHJvZ3JhbSAlc1xuIiwKKwkgIGRldl9uYW1lLCBiYXVkcmF0ZSwgcHJvZ19uYW1lKTsKKyAgcHJpbnRmX2ZpbHRlcmVkKCJcdG9uIGFuICVzIHByb2Nlc3Nvci5cbiIsIHByb2Nlc3Nvcl9uYW1lW3Byb2Nlc3Nvcl90eXBlXSk7Cit9CisKKy8qIENvcHkgTEVOIGJ5dGVzIG9mIGRhdGEgZnJvbSBkZWJ1Z2dlciBtZW1vcnkgYXQgTVlBRERSCisgICB0byBpbmZlcmlvcidzIG1lbW9yeSBhdCBNRU1BRERSLiAgUmV0dXJucyBlcnJubyB2YWx1ZS4gIAorICogc2Ivc2ggaW5zdHJ1Y3Rpb25zIGRvbid0IHdvcmsgb24gdW5hbGlnbmVkIGFkZHJlc3Nlcywgd2hlbiBUVT0xLiAKKyAqLworaW50CithZGFwdF93cml0ZV9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICBpbnQgaTsKKyAgdW5zaWduZWQgaW50IGNwczsKKworICAvKiBUdXJuIFRVIGJpdCBvZmYgc28gd2UgY2FuIGRvICdzYicgY29tbWFuZHMgKi8KKyAgY3BzID0gcmVhZF9yZWdpc3RlcihDUFNfUkVHTlVNKTsKKyAgaWYgKGNwcyAmIDB4MDAwMDA4MDApCisgIAl3cml0ZV9yZWdpc3RlcihDUFNfUkVHTlVNLGNwcyZ+KDB4MDAwMDA4MDApKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgeworICAgICAgaWYgKChpICUgMTYpID09IDApCisJZnByaW50ZiAoYWRhcHRfc3RyZWFtLCAic2IgJXgsIiwgbWVtYWRkciArIGkpOworICAgICAgaWYgKChpICUgMTYpID09IDE1IHx8IGkgPT0gbGVuIC0gMSkKKwl7CisJICBmcHJpbnRmIChhZGFwdF9zdHJlYW0sICIleFxyIiwgKCh1bnNpZ25lZCBjaGFyICopbXlhZGRyKVtpXSk7CisJICBleHBlY3RfcHJvbXB0ICgpOworCX0KKyAgICAgIGVsc2UKKwlmcHJpbnRmIChhZGFwdF9zdHJlYW0sICIleCwiLCAoKHVuc2lnbmVkIGNoYXIgKilteWFkZHIpW2ldKTsKKyAgICB9CisgIC8qIFJlc3RvcmUgdGhlIG9sZCB2YWx1ZSBvZiBjcHMgaWYgdGhlIFRVIGJpdCB3YXMgb24gKi8KKyAgaWYgKGNwcyAmIDB4MDAwMDA4MDApCisgIAl3cml0ZV9yZWdpc3RlcihDUFNfUkVHTlVNLGNwcyk7CisgIHJldHVybiBsZW47Cit9CisKKy8qIFJlYWQgTEVOIGJ5dGVzIGZyb20gaW5mZXJpb3IgbWVtb3J5IGF0IE1FTUFERFIuICBQdXQgdGhlIHJlc3VsdAorICAgYXQgZGVidWdnZXIgYWRkcmVzcyBNWUFERFIuICBSZXR1cm5zIGVycm5vIHZhbHVlLiAgKi8KK2ludAorYWRhcHRfcmVhZF9pbmZlcmlvcl9tZW1vcnkobWVtYWRkciwgbXlhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47Cit7CisgIGludCBpOworCisgIC8qIE51bWJlciBvZiBieXRlcyByZWFkIHNvIGZhci4gICovCisgIGludCBjb3VudDsKKworICAvKiBTdGFydGluZyBhZGRyZXNzIG9mIHRoaXMgcGFzcy4gICovCisgIHVuc2lnbmVkIGxvbmcgc3RhcnRhZGRyOworCisgIC8qIE51bWJlciBvZiBieXRlcyB0byByZWFkIGluIHRoaXMgcGFzcy4gICovCisgIGludCBsZW5fdGhpc19wYXNzOworCisgIC8qIE5vdGUgdGhhdCB0aGlzIGNvZGUgd29ya3MgY29ycmVjdGx5IGlmIHN0YXJ0YWRkciBpcyBqdXN0IGxlc3MKKyAgICAgdGhhbiBVSU5UX01BWCAod2VsbCwgcmVhbGx5IENPUkVfQUREUl9NQVggaWYgdGhlcmUgd2FzIHN1Y2ggYQorICAgICB0aGluZykuICBUaGF0IGlzLCBzb21ldGhpbmcgbGlrZQorICAgICBhZGFwdF9yZWFkX2J5dGVzIChDT1JFX0FERFJfTUFYIC0gNCwgZm9vLCA0KQorICAgICB3b3Jrcy0taXQgbmV2ZXIgYWRkcyBsZW4gdG8gbWVtYWRkciBhbmQgZ2V0cyAwLiAgKi8KKyAgLyogSG93ZXZlciwgc29tZXRoaW5nIGxpa2UKKyAgICAgYWRhcHRfcmVhZF9ieXRlcyAoQ09SRV9BRERSX01BWCAtIDMsIGZvbywgNCkKKyAgICAgZG9lc24ndCBuZWVkIHRvIHdvcmsuICBEZXRlY3QgaXQgYW5kIGdpdmUgdXAgaWYgdGhlcmUncyBhbiBhdHRlbXB0CisgICAgIHRvIGRvIHRoYXQuICAqLworCisgIGlmICgoKG1lbWFkZHIgLSAxKSArIGxlbikgPCBtZW1hZGRyKQorICAgIHJldHVybiBFSU87CisgIAorICBzdGFydGFkZHIgPSBtZW1hZGRyOworICBjb3VudCA9IDA7CisgIHdoaWxlIChjb3VudCA8IGxlbikKKyAgICB7CisgICAgICBsZW5fdGhpc19wYXNzID0gMTY7CisgICAgICBpZiAoKHN0YXJ0YWRkciAlIDE2KSAhPSAwKQorCWxlbl90aGlzX3Bhc3MgLT0gc3RhcnRhZGRyICUgMTY7CisgICAgICBpZiAobGVuX3RoaXNfcGFzcyA+IChsZW4gLSBjb3VudCkpCisJbGVuX3RoaXNfcGFzcyA9IChsZW4gLSBjb3VudCk7CisKKyAgICAgIGZwcmludGYgKGFkYXB0X3N0cmVhbSwgImRiICV4LCV4XHIiLCBzdGFydGFkZHIsCisJICAgICAgIChzdGFydGFkZHIgLSAxKSArIGxlbl90aGlzX3Bhc3MpOworCisjaWZkZWYgTk9UREVGCS8qIFdoeSBkbyB0aGlzICovCisgICAgICBleHBlY3QgKCJcbiIpOworICAgICAgLyogTG9vayBmb3IgOCBoZXggZGlnaXRzLiAgKi8KKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKDEpCisJeworCSAgaWYgKGlzeGRpZ2l0IChyZWFkY2hhciAoKSkpCisJICAgICsraTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGV4cGVjdF9wcm9tcHQgKCk7CisJICAgICAgZXJyb3IgKCJIZXggZGlnaXQgZXhwZWN0ZWQgZnJvbSByZW1vdGUgc3lzdGVtLiIpOworCSAgICB9CisJICBpZiAoaSA+PSA4KQorCSAgICBicmVhazsKKwl9CisjZW5kaWYgLyogTk9UREVGICovCisKKyAgICAgIGV4cGVjdCAoIiAgIik7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5fdGhpc19wYXNzOyBpKyspCisJZ2V0X2hleF9ieXRlICgmbXlhZGRyW2NvdW50KytdKTsKKworICAgICAgZXhwZWN0X3Byb21wdCAoKTsKKworICAgICAgc3RhcnRhZGRyICs9IGxlbl90aGlzX3Bhc3M7CisgICAgfQorICByZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgTUFYX0JSRUFLUwk4CitzdGF0aWMgaW50IG51bV9icmtwdHM9MDsKK3N0YXRpYyBpbnQKK2FkYXB0X2luc2VydF9icmVha3BvaW50KGFkZHIsIHNhdmUpCitDT1JFX0FERFIJYWRkcjsKK2NoYXIJCSpzYXZlOwkvKiBUaHJvdyBhd2F5LCBsZXQgYWRhcHQgc2F2ZSBpbnN0cnVjdGlvbnMgKi8KK3sKKyAgaWYgKG51bV9icmtwdHMgPCBNQVhfQlJFQUtTKSB7CisgIAludW1fYnJrcHRzKys7CisgIAlmcHJpbnRmIChhZGFwdF9zdHJlYW0sICJCICV4IiwgYWRkcik7CisgIAlmcHJpbnRmIChhZGFwdF9zdHJlYW0sICJcciIpOworICAJZXhwZWN0X3Byb21wdCAoKTsKKwlyZXR1cm4oMCk7CS8qIFN1Y2Nlc3MgKi8KKyAgfSBlbHNlIHsKKwlmcHJpbnRmX2ZpbHRlcmVkKGdkYl9zdGRlcnIsCisJCSJUb28gbWFueSBicmVhayBwb2ludHMsIGJyZWFrIHBvaW50IG5vdCBpbnN0YWxsZWRcbiIpOworCXJldHVybigxKTsJLyogRmFpbHVyZSAqLworICB9CisKK30KK3N0YXRpYyBpbnQKK2FkYXB0X3JlbW92ZV9icmVha3BvaW50KGFkZHIsIHNhdmUpCitDT1JFX0FERFIJYWRkcjsKK2NoYXIJCSpzYXZlOwkvKiBUaHJvdyBhd2F5LCBsZXQgYWRhcHQgc2F2ZSBpbnN0cnVjdGlvbnMgKi8KK3sKKyAgaWYgKG51bV9icmtwdHMgPiAwKSB7CisJICBudW1fYnJrcHRzLS07CisJICBmcHJpbnRmIChhZGFwdF9zdHJlYW0sICJCUiAleCIsIGFkZHIpOworCSAgZnByaW50ZiAoYWRhcHRfc3RyZWFtLCAiXHIiKTsKKwkgIGZmbHVzaCAoYWRhcHRfc3RyZWFtKTsKKwkgIGV4cGVjdF9wcm9tcHQgKCk7CisgIH0KKyAgcmV0dXJuKDApOworfQorCisvKiBDbGVhciB0aGUgYWRhcHRzIG5vdGlvbiBvZiB3aGF0IHRoZSBicmVhayBwb2ludHMgYXJlICovCitzdGF0aWMgaW50CithZGFwdF9jbGVhcl9icmVha3BvaW50cygpIAoreyAKKyAgaWYgKGFkYXB0X3N0cmVhbSkgeworICAJZnByaW50ZiAoYWRhcHRfc3RyZWFtLCAiQlIiKTsJLyogQ2xlYXIgYWxsIGJyZWFrIHBvaW50cyAqLworICAJZnByaW50ZiAoYWRhcHRfc3RyZWFtLCAiXHIiKTsKKyAgCWZmbHVzaChhZGFwdF9zdHJlYW0pOworICAJZXhwZWN0X3Byb21wdCAoKTsKKyAgfQorICBudW1fYnJrcHRzID0gMDsKK30KK3N0YXRpYyB2b2lkCithZGFwdF9tb3VybigpIAoreyAKKyAgYWRhcHRfY2xlYXJfYnJlYWtwb2ludHMoKTsKKyAgcG9wX3RhcmdldCAoKTsgICAgICAgICAgICAgICAgLyogUG9wIGJhY2sgdG8gbm8tY2hpbGQgc3RhdGUgKi8KKyAgZ2VuZXJpY19tb3Vybl9pbmZlcmlvciAoKTsKK30KKworLyogRGlzcGxheSBldmVydGhpbmcgd2UgcmVhZCBpbiBmcm9tIHRoZSBhZGFwdCB1bnRpbCB3ZSBtYXRjaC9zZWUgdGhlCisgKiBzcGVjaWZpZWQgc3RyaW5nCisgKi8KK3N0YXRpYyBpbnQKK2Rpc3BsYXlfdW50aWwoc3RyKQorY2hhcgkqc3RyOworeworCWludAlpPTAsaixjOworCisJd2hpbGUgKGM9cmVhZGNoYXIoKSkgeworCQlpZiAoYz09c3RyW2ldKSB7CisJCQlpKys7CisJCQlpZiAoaSA9PSBzdHJsZW4oc3RyKSkgcmV0dXJuOworCQl9IGVsc2UgeworCQkJaWYgKGkpIHsKKwkJCSAgICBmb3IgKGo9MCA7IGo8aSA7IGorKykgLyogUHV0IGV2ZXJ0aGluZyB3ZSBtYXRjaGVkICovCisJCQkJcHV0Y2hhcihzdHJbal0pOworCQkJICAgIGk9MDsKKwkJCX0KKwkJCXB1dGNoYXIoYyk7CisJCX0JCisJfQorCit9CisKKworLyogUHV0IGEgY29tbWFuZCBzdHJpbmcsIGluIGFyZ3MsIG91dCB0byB0aGUgYWRhcHQuICBUaGUgYWRhcHQgaXMgYXNzdW1lZCB0bworICAgYmUgaW4gcmF3IG1vZGUsIGFsbCB3cml0aW5nL3JlYWRpbmcgZG9uZSB0aHJvdWdoIGFkYXB0X2Rlc2MuCisgICBPdXB1dCBmcm9tIHRoZSBhZGFwdCBpcyBwbGFjZWQgb24gdGhlIHVzZXJzIHRlcm1pbmFsIHVudGlsIHRoZQorICAgcHJvbXB0IGZyb20gdGhlIGFkYXB0IGlzIHNlZW4uCisgICBGSVhNRTogQ2FuJ3QgaGFuZGxlIGNvbW1hbmRzIHRoYXQgdGFrZSBpbnB1dC4gICovCisKK3ZvaWQKK2FkYXB0X2NvbSAoYXJncywgZnJvbXR0eSkKKyAgICAgY2hhcgkqYXJnczsKKyAgICAgaW50CWZyb210dHk7Cit7CisJaWYgKCFhZGFwdF9zdHJlYW0pIHsKKwkJcHJpbnRmX2ZpbHRlcmVkKCJBZGFwdCBub3Qgb3Blbi4gIFVzZSB0aGUgJ3RhcmdldCcgY29tbWFuZCB0byBvcGVuLlxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBDbGVhciBhbGwgaW5wdXQgc28gb25seSBjb21tYW5kIHJlbGF0aXZlIG91dHB1dCBpcyBkaXNwbGF5ZWQgKi8KKwlzbHVycF9pbnB1dCgpOwkKKworCXN3aXRjaChpc2xvd2VyKGFyZ3NbMF0pID8gdG91cHBlcihhcmdzWzBdKSA6IGFyZ3NbMF0pIHsKKwlkZWZhdWx0OgorCQlwcmludGZfZmlsdGVyZWQoIlVua25vd24vVW5pbXBsZW1lbnRlZCBhZGFwdCBjb21tYW5kICclcydcbiIsYXJncyk7CisJCWJyZWFrOworCWNhc2UgJ0cnOgkvKiBHbywgYmVnaW4gZXhlY3V0aW9uICovCisJCXdyaXRlKGFkYXB0X2Rlc2MsYXJncyxzdHJsZW4oYXJncykpOworCQl3cml0ZShhZGFwdF9kZXNjLCJcciIsMSk7CisJCWV4cGVjdF9wcm9tcHQoKTsKKwkJYnJlYWs7CisJY2FzZSAnQic6CS8qIEJyZWFrIHBvaW50cywgQiBvciBCUiAqLworCWNhc2UgJ0MnOgkvKiBDaGVjayBjdXJyZW50IDI5ayBzdGF0dXMgKHJ1bm5pbmcvaGFsdGVkKSAqLworCWNhc2UgJ0QnOgkvKiBEaXNwbGF5IGRhdGEvcmVnaXN0ZXJzICovIAorCWNhc2UgJ0knOgkvKiBJbnB1dCBmcm9tIGkvbyBzcGFjZSAqLworCWNhc2UgJ0onOgkvKiBKYW0gYW4gaW5zdHJ1Y3Rpb24gKi8KKwljYXNlICdLJzoJLyogS2lsbCwgc3RvcCBleGVjdXRpb24gKi8KKwljYXNlICdMJzoJLyogRGlzYXNzZW1ibGUgKi8KKwljYXNlICdPJzoJLyogT3V0cHV0IHRvIGkvbyBzcGFjZSAqLworCWNhc2UgJ1QnOgkvKiBUcmFjZSAqLyAKKwljYXNlICdQJzoJLyogUHVsc2UgYW4gaW5wdXQgbGluZSAqLyAKKwljYXNlICdYJzoJLyogRXhhbWluZSBzcGVjaWFsIHB1cnBvc2UgcmVnaXN0ZXJzICovIAorCWNhc2UgJ1onOgkvKiBEaXNwbGF5IHRyYWNlIGJ1ZmZlciAqLyAKKwkJd3JpdGUoYWRhcHRfZGVzYyxhcmdzLHN0cmxlbihhcmdzKSk7CisJCXdyaXRlKGFkYXB0X2Rlc2MsIlxyIiwxKTsKKwkJZXhwZWN0KGFyZ3MpOwkJLyogRG9uJ3QgZGlzcGxheSB0aGUgY29tbWFuZCAqLworCQlkaXNwbGF5X3VudGlsKCIjICIpOworCQlicmVhazsKKwkvKiBCZWdpbiBjb21tYW5kcyB0aGF0IHRha2UgaW5wdXQgaW4gdGhlIGZvcm0gJ2MgeCx5Wyx6Li4uXScgKi8KKwljYXNlICdTJzoJLyogU2V0IG1lbW9yeSBvciByZWdpc3RlciAqLworCQlpZiAoc3RyY2hyKGFyZ3MsJywnKSkgewkvKiBBc3N1bWUgaXQgaXMgcHJvcGVybHkgZm9ybWF0dGVkICovCisJCQl3cml0ZShhZGFwdF9kZXNjLGFyZ3Msc3RybGVuKGFyZ3MpKTsKKwkJCXdyaXRlKGFkYXB0X2Rlc2MsIlxyIiwxKTsKKwkJCWV4cGVjdF9wcm9tcHQoKTsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKKy8qIERlZmluZSB0aGUgdGFyZ2V0IHN1YnJvdXRpbmUgbmFtZXMgKi8KKworc3RydWN0IHRhcmdldF9vcHMgYWRhcHRfb3BzIDsKKworc3RhdGljIHZvaWQgCitpbml0X2FkYXB0X29wcyh2b2lkKQoreworICBhZGFwdF9vcHMudG9fc2hvcnRuYW1lID0gCSJhZGFwdCI7CisgIGFkYXB0X29wcy50b19sb25nbmFtZSA9IAkiUmVtb3RlIEFNRCBgQWRhcHQnIHRhcmdldCI7CisgIGFkYXB0X29wcy50b19kb2MgPSAJIlJlbW90ZSBkZWJ1ZyBhbiBBTUQgMjkwKjAgdXNpbmcgYW4gYEFkYXB0JyBtb25pdG9yIHZpYSBSUzIzMiI7CisgIGFkYXB0X29wcy50b19vcGVuID0gCWFkYXB0X29wZW47CisgIGFkYXB0X29wcy50b19jbG9zZSA9IAlhZGFwdF9jbG9zZTsKKyAgYWRhcHRfb3BzLnRvX2F0dGFjaCA9IGFkYXB0X2F0dGFjaDsKKyAgYWRhcHRfb3BzLnRvX3Bvc3RfYXR0YWNoID0gTlVMTDsKKyAgYWRhcHRfb3BzLnRvX3JlcXVpcmVfYXR0YWNoID0gTlVMTDsgIAorICBhZGFwdF9vcHMudG9fZGV0YWNoID0gYWRhcHRfZGV0YWNoOworICBhZGFwdF9vcHMudG9fcmVxdWlyZV9kZXRhY2ggPSBOVUxMOworICBhZGFwdF9vcHMudG9fcmVzdW1lID0gYWRhcHRfcmVzdW1lOworICBhZGFwdF9vcHMudG9fd2FpdCAgPSAJYWRhcHRfd2FpdDsKKyAgYWRhcHRfb3BzLnRvX3Bvc3Rfd2FpdCA9IE5VTEw7CisgIGFkYXB0X29wcy50b19mZXRjaF9yZWdpc3RlcnMgID0gYWRhcHRfZmV0Y2hfcmVnaXN0ZXI7CisgIGFkYXB0X29wcy50b19zdG9yZV9yZWdpc3RlcnMgID0gYWRhcHRfc3RvcmVfcmVnaXN0ZXI7CisgIGFkYXB0X29wcy50b19wcmVwYXJlX3RvX3N0b3JlID0gYWRhcHRfcHJlcGFyZV90b19zdG9yZTsKKyAgYWRhcHRfb3BzLnRvX3hmZXJfbWVtb3J5ICA9IAlhZGFwdF94ZmVyX2luZmVyaW9yX21lbW9yeTsKKyAgYWRhcHRfb3BzLnRvX2ZpbGVzX2luZm8gID0gCWFkYXB0X2ZpbGVzX2luZm87CisgIGFkYXB0X29wcy50b19pbnNlcnRfYnJlYWtwb2ludCA9IGFkYXB0X2luc2VydF9icmVha3BvaW50OworICBhZGFwdF9vcHMudG9fcmVtb3ZlX2JyZWFrcG9pbnQgPSBhZGFwdF9yZW1vdmVfYnJlYWtwb2ludDsgCisgIGFkYXB0X29wcy50b190ZXJtaW5hbF9pbml0ICA9IAkwOworICBhZGFwdF9vcHMudG9fdGVybWluYWxfaW5mZXJpb3IgPSAJMDsKKyAgYWRhcHRfb3BzLnRvX3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCA9IAkwOworICBhZGFwdF9vcHMudG9fdGVybWluYWxfb3VycyAgPSAJMDsKKyAgYWRhcHRfb3BzLnRvX3Rlcm1pbmFsX2luZm8gID0gCTA7CisgIGFkYXB0X29wcy50b19raWxsICA9IAlhZGFwdF9raWxsOyAJCQorICBhZGFwdF9vcHMudG9fbG9hZCAgPSAJYWRhcHRfbG9hZDsKKyAgYWRhcHRfb3BzLnRvX2xvb2t1cF9zeW1ib2wgPSAJMDsgCQkKKyAgYWRhcHRfb3BzLnRvX2NyZWF0ZV9pbmZlcmlvciA9ICBhZGFwdF9jcmVhdGVfaW5mZXJpb3I7CisgIGFkYXB0X29wcy50b19wb3N0X3N0YXJ0dXBfaW5mZXJpb3IgPSBOVUxMOworICBhZGFwdF9vcHMudG9fYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvciA9IE5VTEw7CisgIGFkYXB0X29wcy50b19jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yID0gTlVMTDsgICAgICAgICAgCisgIGFkYXB0X29wcy50b19wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSA9IE5VTEw7ICAKKyAgYWRhcHRfb3BzLnRvX2luc2VydF9mb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBhZGFwdF9vcHMudG9fcmVtb3ZlX2ZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGFkYXB0X29wcy50b19pbnNlcnRfdmZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGFkYXB0X29wcy50b19yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgCisgIGFkYXB0X29wcy50b19oYXNfZm9ya2VkID0gTlVMTDsKKyAgYWRhcHRfb3BzLnRvX2hhc192Zm9ya2VkID0gTlVMTDsKKyAgYWRhcHRfb3BzLnRvX2Nhbl9mb2xsb3dfdmZvcmtfcHJpb3JfdG9fZXhlYyA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgCisgIGFkYXB0X29wcy50b19wb3N0X2ZvbGxvd192Zm9yayA9IE5VTEw7IAkKKyAgYWRhcHRfb3BzLnRvX2luc2VydF9leGVjX2NhdGNocG9pbnQgPSBOVUxMOworICBhZGFwdF9vcHMudG9fcmVtb3ZlX2V4ZWNfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGFkYXB0X29wcy50b19oYXNfZXhlY2QgPSBOVUxMOworICBhZGFwdF9vcHMudG9fcmVwb3J0ZWRfZXhlY19ldmVudHNfcGVyX2V4ZWNfY2FsbCA9IE5VTEw7CisgIGFkYXB0X29wcy50b19oYXNfZXhpdGVkID0gTlVMTDsKKyAgYWRhcHRfb3BzLnRvX21vdXJuX2luZmVyaW9yID0gICBhZGFwdF9tb3VybjsgCQkKKyAgYWRhcHRfb3BzLnRvX2Nhbl9ydW4gID0gCTA7IAorICBhZGFwdF9vcHMudG9fbm90aWNlX3NpZ25hbHMgPSAJMDsKKyAgYWRhcHRfb3BzLnRvX3RocmVhZF9hbGl2ZSAgPSAJMDsKKyAgYWRhcHRfb3BzLnRvX3N0b3AgID0gCTAgOyAvKiBwcm9jZXNzX3N0cmF0dW07ICovCisgIGFkYXB0X29wcy50b19waWRfdG9fZXhlY19maWxlID0gTlVMTDsKKyAgYWRhcHRfb3BzLnRvX2NvcmVfZmlsZV90b19zeW1fZmlsZSA9IE5VTEw7CisgIGFkYXB0X29wcy50b19zdHJhdHVtID0gCTA7IAorICBhZGFwdF9vcHMuRE9OVF9VU0UgPSAJMCA7CisgIGFkYXB0X29wcy50b19oYXNfYWxsX21lbW9yeSA9IAkxOworICBhZGFwdF9vcHMudG9faGFzX21lbW9yeSA9IAkxOworICBhZGFwdF9vcHMudG9faGFzX3N0YWNrID0gCTE7CisgIGFkYXB0X29wcy50b19oYXNfcmVnaXN0ZXJzID0gCTE7CisgIGFkYXB0X29wcy50b19oYXNfZXhlY3V0aW9uID0gCTA7CisgIGFkYXB0X29wcy50b19zZWN0aW9ucyA9IAkwOworICBhZGFwdF9vcHMudG9fc2VjdGlvbnNfZW5kID0gCTAgOworICBhZGFwdF9vcHMudG9fbWFnaWMgPSAJT1BTX01BR0lDOyAKK30gLyogaW5pdF9hZGFwdF9vcHMgKi8KKwordm9pZAorX2luaXRpYWxpemVfcmVtb3RlX2FkYXB0ICgpCit7CisgIGluaXRfYWRhcHRfb3BzKCkgOworICBhZGRfdGFyZ2V0ICgmYWRhcHRfb3BzKTsKKyAgYWRkX2NvbSAoImFkYXB0IDxjb21tYW5kPiIsIGNsYXNzX29ic2N1cmUsIGFkYXB0X2NvbSwKKyAJIlNlbmQgYSBjb21tYW5kIHRvIHRoZSBBTUQgQWRhcHQgcmVtb3RlIG1vbml0b3IuIik7Cit9CmRpZmYgLS1naXQgYS9nZGIvcmVtb3RlLWFycmF5LmMgYi9nZGIvcmVtb3RlLWFycmF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0ODcxYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZW1vdGUtYXJyYXkuYwpAQCAtMCwwICsxLDE0OTcgQEAKKy8qIFJlbW90ZSBkZWJ1Z2dpbmcgaW50ZXJmYWNlIGZvciBBcnJheSBUZWNoIFJBSUQgY29udHJvbGxlci4uCisgICBDb3B5cmlnaHQgOTAsIDkxLCA5MiwgOTMsIDk0LCAxOTk1LCAxOTk4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LiBXcml0dGVuIGJ5IFJvYiBTYXZveWUgZm9yIEN5Z251cy4KKworICAgVGhpcyBtb2R1bGUgdGFsa3MgdG8gYSBkZWJ1ZyBtb25pdG9yIGNhbGxlZCAnTU9OSVRPUicsIHdoaWNoCisgICBXZSBjb21tdW5pY2F0ZSB3aXRoIE1PTklUT1IgdmlhIGVpdGhlciBhIGRpcmVjdCBzZXJpYWwgbGluZSwgb3IgYSBUQ1AKKyAgIChvciBwb3NzaWJseSBURUxORVQpIHN0cmVhbSB0byBhIHRlcm1pbmFsIG11bHRpcGxleG9yLAorICAgd2hpY2ggaW4gdHVybiB0YWxrcyB0byB0aGUgdGFyZ2V0IGJvYXJkLgorCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJ3YWl0LmgiCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjZWxzZQorI2luY2x1ZGUgPHZhcmFyZ3MuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJzZXJpYWwuaCIKKyNpbmNsdWRlICJtb25pdG9yLmgiCisjaW5jbHVkZSAicmVtb3RlLXV0aWxzLmgiCisKK2V4dGVybiBpbnQgYmF1ZF9yYXRlOworCisjZGVmaW5lIEFSUkFZX1BST01QVCAiPj4gIgorCisjZGVmaW5lIFNXQVBfVEFSR0VUX0FORF9IT1NUKGJ1ZmZlcixsZW4pIAkJCQlcCisgIGRvCQkJCQkJCQkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBpZiAoVEFSR0VUX0JZVEVfT1JERVIgIT0gSE9TVF9CWVRFX09SREVSKQkJCQlcCisJewkJCQkJCQkJXAorCSAgY2hhciB0bXA7CQkJCQkJCVwKKwkgIGNoYXIgKnAgPSAoY2hhciAqKShidWZmZXIpOwkJCQkJXAorCSAgY2hhciAqcSA9ICgoY2hhciAqKShidWZmZXIpKSArIGxlbiAtIDE7CQkgICAJXAorCSAgZm9yICg7IHAgPCBxOyBwKyssIHEtLSkJCQkJIAlcCisJICAgIHsJCQkJCQkJCVwKKwkgICAgICB0bXAgPSAqcTsJCQkJCQkJXAorCSAgICAgICpxID0gKnA7CQkJCQkJCVwKKwkgICAgICAqcCA9IHRtcDsJCQkJCQkJXAorCSAgICB9CQkJCQkJCQlcCisJfQkJCQkJCQkJXAorICAgIH0JCQkJCQkJCQlcCisgIHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBkZWJ1Z2xvZ3MgUEFSQU1TKChpbnQsIGNoYXIgKiwgLi4uKSk7CitzdGF0aWMgdm9pZCBhcnJheV9vcGVuKCk7CitzdGF0aWMgdm9pZCBhcnJheV9jbG9zZSgpOworc3RhdGljIHZvaWQgYXJyYXlfZGV0YWNoKCk7CitzdGF0aWMgdm9pZCBhcnJheV9hdHRhY2goKTsKK3N0YXRpYyB2b2lkIGFycmF5X3Jlc3VtZSgpOworc3RhdGljIHZvaWQgYXJyYXlfZmV0Y2hfcmVnaXN0ZXIoKTsKK3N0YXRpYyB2b2lkIGFycmF5X3N0b3JlX3JlZ2lzdGVyKCk7CitzdGF0aWMgdm9pZCBhcnJheV9mZXRjaF9yZWdpc3RlcnMoKTsKK3N0YXRpYyB2b2lkIGFycmF5X3N0b3JlX3JlZ2lzdGVycygpOworc3RhdGljIHZvaWQgYXJyYXlfcHJlcGFyZV90b19zdG9yZSgpOworc3RhdGljIHZvaWQgYXJyYXlfZmlsZXNfaW5mbygpOworc3RhdGljIHZvaWQgYXJyYXlfa2lsbCgpOworc3RhdGljIHZvaWQgYXJyYXlfY3JlYXRlX2luZmVyaW9yKCk7CitzdGF0aWMgdm9pZCBhcnJheV9tb3Vybl9pbmZlcmlvcigpOworc3RhdGljIHZvaWQgbWFrZV9nZGJfcGFja2V0KCk7CitzdGF0aWMgaW50IGFycmF5X3hmZXJfbWVtb3J5KCk7CitzdGF0aWMgaW50IGFycmF5X3dhaXQoKTsKK3N0YXRpYyBpbnQgYXJyYXlfaW5zZXJ0X2JyZWFrcG9pbnQoKTsKK3N0YXRpYyBpbnQgYXJyYXlfcmVtb3ZlX2JyZWFrcG9pbnQoKTsKK3N0YXRpYyBpbnQgdG9oZXgoKTsKK3N0YXRpYyBpbnQgdG9faGV4KCk7CitzdGF0aWMgaW50IGZyb21faGV4KCk7CitzdGF0aWMgaW50IGFycmF5X3NlbmRfcGFja2V0KCk7CitzdGF0aWMgaW50IGFycmF5X2dldF9wYWNrZXQoKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFzY2lpMmhleHdvcmQoKTsKK3N0YXRpYyB2b2lkIGhleHdvcmQyYXNjaWkoKTsKKworZXh0ZXJuIGNoYXIgKnZlcnNpb247CisKKyNkZWZpbmUgTE9HX0ZJTEUgIm1vbml0b3IubG9nIgorI2lmIGRlZmluZWQgKExPR19GSUxFKQorRklMRSAqbG9nX2ZpbGU7CisjZW5kaWYKKworc3RhdGljIGludCB0aW1lb3V0ID0gMzA7CisvKiBIYXZpbmcgdGhpcyBsYXJnZXIgdGhhbiA0MDAgY2F1c2VzIHVzIHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIG02OGstc3R1Yi5jCisgICBhbmQgaTM4Ni1zdHViLmMuICBOb3JtYWxseSwgbm8gb25lIHdvdWxkIG5vdGljZSBiZWNhdXNlIGl0IG9ubHkgbWF0dGVycworICAgZm9yIHdyaXRpbmcgbGFyZ2UgY2h1bmtzIG9mIG1lbW9yeSAoZS5nLiBpbiBkb3dubG9hZHMpLiAgQWxzbywgdGhpcyBuZWVkcworICAgdG8gYmUgbW9yZSB0aGFuIDQwMCBpZiByZXF1aXJlZCB0byBob2xkIHRoZSByZWdpc3RlcnMgKHNlZSBiZWxvdywgd2hlcmUKKyAgIHdlIHJvdW5kIGl0IHVwIGJhc2VkIG9uIFJFR0lTVEVSX0JZVEVTKS4gICovCisjZGVmaW5lIFBCVUZTSVogNDAwCisKKy8qIAorICogRGVzY3JpcHRvciBmb3IgSS9PIHRvIHJlbW90ZSBtYWNoaW5lLiAgSW5pdGlhbGl6ZSBpdCB0byBOVUxMIHNvIHRoYXQKKyAqIGFycmF5X29wZW4ga25vd3MgdGhhdCB3ZSBkb24ndCBoYXZlIGEgZmlsZSBvcGVuIHdoZW4gdGhlIHByb2dyYW0gc3RhcnRzLgorICovCitzZXJpYWxfdCBhcnJheV9kZXNjID0gTlVMTDsKKworLyoKKyAqIHRoaXMgYXJyYXkgb2YgcmVnaXN0ZXJzIG5lZWQgdG8gbWF0Y2ggdGhlIGluZGV4ZXMgdXNlZCBieSBHREIuIFRoZQorICogd2hvbGUgcmVhc29uIHRoaXMgZXhpc3RzIGlzIGNhdXNlIHRoZSB2YXJpb3VzIFJPTSBtb25pdG9ycyB1c2UKKyAqIGRpZmZlcmVudCBzdHJpbmdzIHRoYW4gR0RCIGRvZXMsIGFuZCBkb2Vzbid0IHN1cHBvcnQgYWxsIHRoZQorICogcmVnaXN0ZXJzIGVpdGhlci4gU28sIHR5cGluZyAiaW5mbyByZWcgc3AiIGJlY29tZXMgYSAicjMwIi4KKyAqLworZXh0ZXJuIGNoYXIgKnRtcF9taXBzX3Byb2Nlc3Nvcl90eXBlOworZXh0ZXJuIGludCBtaXBzX3NldF9wcm9jZXNzb3JfdHlwZSgpOworCitzdGF0aWMgc3RydWN0IHRhcmdldF9vcHMgYXJyYXlfb3BzIDsKKworc3RhdGljIHZvaWQgCitpbml0X2FycmF5X29wcyh2b2lkKQoreworICBhcnJheV9vcHMudG9fc2hvcnRuYW1lID0gICAiYXJyYXkiOwkKKyAgYXJyYXlfb3BzLnRvX2xvbmduYW1lID0gCQkKKyAgICAiRGVidWcgdXNpbmcgdGhlIHN0YW5kYXJkIEdEQiByZW1vdGUgcHJvdG9jb2wgZm9yIHRoZSBBcnJheSBUZWNoIHRhcmdldC4iLAorICAgIGFycmF5X29wcy50b19kb2MgPSAJCQkKKyAgICAiRGVidWcgdXNpbmcgdGhlIHN0YW5kYXJkIEdEQiByZW1vdGUgcHJvdG9jb2wgZm9yIHRoZSBBcnJheSBUZWNoIHRhcmdldC5cblwKK1NwZWNpZnkgdGhlIHNlcmlhbCBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvIChlLmcuIC9kZXYvdHR5YSkuIiA7CisgIGFycmF5X29wcy50b19vcGVuID0gICBhcnJheV9vcGVuOwkKKyAgYXJyYXlfb3BzLnRvX2Nsb3NlID0gICBhcnJheV9jbG9zZTsJCisgIGFycmF5X29wcy50b19hdHRhY2ggPSAgIE5VTEw7CisgIGFycmF5X29wcy50b19wb3N0X2F0dGFjaCA9IE5VTEw7CQkKKyAgYXJyYXlfb3BzLnRvX3JlcXVpcmVfYXR0YWNoID0gTlVMTDsKKyAgYXJyYXlfb3BzLnRvX2RldGFjaCA9ICAgYXJyYXlfZGV0YWNoOwkKKyAgYXJyYXlfb3BzLnRvX3JlcXVpcmVfZGV0YWNoID0gTlVMTDsKKyAgYXJyYXlfb3BzLnRvX3Jlc3VtZSA9ICAgYXJyYXlfcmVzdW1lOwkKKyAgYXJyYXlfb3BzLnRvX3dhaXQgID0gICBhcnJheV93YWl0OwkKKyAgYXJyYXlfb3BzLnRvX3Bvc3Rfd2FpdCA9IE5VTEw7CisgIGFycmF5X29wcy50b19mZXRjaF9yZWdpc3RlcnMgID0gICBhcnJheV9mZXRjaF9yZWdpc3RlcnM7CisgIGFycmF5X29wcy50b19zdG9yZV9yZWdpc3RlcnMgID0gICBhcnJheV9zdG9yZV9yZWdpc3RlcnM7CisgIGFycmF5X29wcy50b19wcmVwYXJlX3RvX3N0b3JlID0gICBhcnJheV9wcmVwYXJlX3RvX3N0b3JlOworICBhcnJheV9vcHMudG9feGZlcl9tZW1vcnkgID0gICBhcnJheV94ZmVyX21lbW9yeTsJCQorICBhcnJheV9vcHMudG9fZmlsZXNfaW5mbyAgPSAgIGFycmF5X2ZpbGVzX2luZm87CQkKKyAgYXJyYXlfb3BzLnRvX2luc2VydF9icmVha3BvaW50ID0gICBhcnJheV9pbnNlcnRfYnJlYWtwb2ludDsJCisgIGFycmF5X29wcy50b19yZW1vdmVfYnJlYWtwb2ludCA9ICAgYXJyYXlfcmVtb3ZlX2JyZWFrcG9pbnQ7CQorICBhcnJheV9vcHMudG9fdGVybWluYWxfaW5pdCAgPSAgIDA7CQkJCQorICBhcnJheV9vcHMudG9fdGVybWluYWxfaW5mZXJpb3IgPSAgIDA7CQkJCQorICBhcnJheV9vcHMudG9fdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ID0gICAwOwkJCQorICBhcnJheV9vcHMudG9fdGVybWluYWxfb3VycyAgPSAgIDA7CQkJCQorICBhcnJheV9vcHMudG9fdGVybWluYWxfaW5mbyAgPSAgIDA7CQkJCQorICBhcnJheV9vcHMudG9fa2lsbCAgPSAgIGFycmF5X2tpbGw7CQkKKyAgYXJyYXlfb3BzLnRvX2xvYWQgID0gICAwOwkJCQorICBhcnJheV9vcHMudG9fbG9va3VwX3N5bWJvbCA9ICAgMDsJCQorICBhcnJheV9vcHMudG9fY3JlYXRlX2luZmVyaW9yID0gICBhcnJheV9jcmVhdGVfaW5mZXJpb3I7CQorICBhcnJheV9vcHMudG9fcG9zdF9zdGFydHVwX2luZmVyaW9yID0gTlVMTDsKKyAgYXJyYXlfb3BzLnRvX2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IgPSBOVUxMOworICBhcnJheV9vcHMudG9fY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciA9IE5VTEw7ICAgICAgICAgIAorICBhcnJheV9vcHMudG9fcG9zdF9mb2xsb3dfaW5mZXJpb3JfYnlfY2xvbmUgPSBOVUxMOyAgCisgIGFycmF5X29wcy50b19pbnNlcnRfZm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgYXJyYXlfb3BzLnRvX3JlbW92ZV9mb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBhcnJheV9vcHMudG9faW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBhcnJheV9vcHMudG9fcmVtb3ZlX3Zmb3JrX2NhdGNocG9pbnQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAKKyAgYXJyYXlfb3BzLnRvX2hhc19mb3JrZWQgPSBOVUxMOworICBhcnJheV9vcHMudG9faGFzX3Zmb3JrZWQgPSBOVUxMOyAgICAgICAgICAgIAorICBhcnJheV9vcHMudG9fY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjID0gTlVMTDsgICAgICAgICAgICAKKyAgYXJyYXlfb3BzLnRvX3Bvc3RfZm9sbG93X3Zmb3JrID0gTlVMTDsKKyAgYXJyYXlfb3BzLnRvX2luc2VydF9leGVjX2NhdGNocG9pbnQgPSBOVUxMOworICBhcnJheV9vcHMudG9fcmVtb3ZlX2V4ZWNfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGFycmF5X29wcy50b19oYXNfZXhlY2QgPSBOVUxMOworICBhcnJheV9vcHMudG9fcmVwb3J0ZWRfZXhlY19ldmVudHNfcGVyX2V4ZWNfY2FsbCA9IE5VTEw7CisgIGFycmF5X29wcy50b19oYXNfZXhpdGVkID0gTlVMTDsKKyAgYXJyYXlfb3BzLnRvX21vdXJuX2luZmVyaW9yID0gICBhcnJheV9tb3Vybl9pbmZlcmlvcjsJCQorICBhcnJheV9vcHMudG9fY2FuX3J1biAgPSAgIDA7CQkKKyAgYXJyYXlfb3BzLnRvX25vdGljZV9zaWduYWxzID0gICAwOyAJCisgIGFycmF5X29wcy50b190aHJlYWRfYWxpdmUgID0gICAwOwkKKyAgYXJyYXlfb3BzLnRvX3N0b3AgID0gICAwOworICBhcnJheV9vcHMudG9fcGlkX3RvX2V4ZWNfZmlsZSA9IE5VTEw7CisgIGFycmF5X29wcy50b19jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUgPSBOVUxMOyAgICAgICAgIAorICBhcnJheV9vcHMudG9fc3RyYXR1bSA9ICAgcHJvY2Vzc19zdHJhdHVtOwkKKyAgYXJyYXlfb3BzLkRPTlRfVVNFID0gICAwOwkJCQorICBhcnJheV9vcHMudG9faGFzX2FsbF9tZW1vcnkgPSAgIDE7CQkKKyAgYXJyYXlfb3BzLnRvX2hhc19tZW1vcnkgPSAgIDE7CQkKKyAgYXJyYXlfb3BzLnRvX2hhc19zdGFjayA9ICAgMTsJCQkKKyAgYXJyYXlfb3BzLnRvX2hhc19yZWdpc3RlcnMgPSAgIDE7CQkKKyAgYXJyYXlfb3BzLnRvX2hhc19leGVjdXRpb24gPSAgIDE7CQkKKyAgYXJyYXlfb3BzLnRvX3NlY3Rpb25zID0gICAwOwkJCQorICBhcnJheV9vcHMudG9fc2VjdGlvbnNfZW5kID0gICAwOwkJCisgIGFycmF5X29wcy50b19tYWdpYyA9ICAgT1BTX01BR0lDOwkJCit9OworCisvKgorICogcHJpbnRmX21vbml0b3IgLS0gc2VuZCBkYXRhIHRvIG1vbml0b3IuICBXb3JrcyBqdXN0IGxpa2UgcHJpbnRmLgorICovCitzdGF0aWMgdm9pZAorI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworcHJpbnRmX21vbml0b3IoY2hhciAqcGF0dGVybiwgLi4uKQorI2Vsc2UKK3ByaW50Zl9tb25pdG9yKHZhX2FsaXN0KQorICAgICB2YV9kY2wKKyNlbmRpZgoreworICB2YV9saXN0IGFyZ3M7CisgIGNoYXIgYnVmW1BCVUZTSVpdOworICBpbnQgaTsKKworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworICB2YV9zdGFydChhcmdzLCBwYXR0ZXJuKTsKKyNlbHNlCisgIGNoYXIgKnBhdHRlcm47CisgIHZhX3N0YXJ0KGFyZ3MpOworICBwYXR0ZXJuID0gdmFfYXJnKGFyZ3MsIGNoYXIgKik7CisjZW5kaWYKKworICB2c3ByaW50ZihidWYsIHBhdHRlcm4sIGFyZ3MpOworCisgIGRlYnVnbG9ncyAoMSwgInByaW50Zl9tb25pdG9yKCksIFNlbmRpbmc6IFwiJXNcIi4iLCBidWYpOworCisgIGlmIChzdHJsZW4oYnVmKSA+IFBCVUZTSVopCisgICAgZXJyb3IgKCJwcmludGZfbW9uaXRvcigpOiBzdHJpbmcgdG9vIGxvbmciKTsKKyAgaWYgKFNFUklBTF9XUklURShhcnJheV9kZXNjLCBidWYsIHN0cmxlbihidWYpKSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlNFUklBTF9XUklURSBmYWlsZWQ6ICVzXG4iLCBzYWZlX3N0cmVycm9yKGVycm5vKSk7Cit9CisvKgorICogd3JpdGVfbW9uaXRvciAtLSBzZW5kIHJhdyBkYXRhIHRvIG1vbml0b3IuCisgKi8KK3N0YXRpYyB2b2lkCit3cml0ZV9tb25pdG9yKGRhdGEsIGxlbikKKyAgICAgY2hhciBkYXRhW107CisgICAgIGludCBsZW47Cit7CisgIGlmIChTRVJJQUxfV1JJVEUoYXJyYXlfZGVzYywgZGF0YSwgbGVuKSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlNFUklBTF9XUklURSBmYWlsZWQ6ICVzXG4iLCBzYWZlX3N0cmVycm9yKGVycm5vKSk7CisgCisgICooZGF0YSArIGxlbisxKSA9ICdcMCc7CisgIGRlYnVnbG9ncyAoMSwgIndyaXRlX21vbml0b3IoKSwgU2VuZGluZzogXCIlc1wiLiIsIGRhdGEpOworCit9CisKKy8qCisgKiBkZWJ1Z2xvZ3MgLS0gZGVhbCB3aXRoIGRlYnVnZ2luZyBpbmZvIHRvIG11bHRpcGxlIHNvdXJjZXMuIFRoaXMgdGFrZXMKKyAqCXR3byByZWFsIGFyZ3MsIHRoZSBmaXJzdCBvbmUgaXMgdGhlIGxldmVsIHRvIGJlIGNvbXBhcmVkIGFnYWluc3QgCisgKgl0aGUgc3JfZ2V0X2RlYnVnKCkgdmFsdWUsIHRoZSBzZWNvbmQgYXJnIGlzIGEgcHJpbnRmIGJ1ZmZlciBhbmQgYXJncworICoJdG8gYmUgZm9ybWF0dGVkIGFuZCBwcmludGVkLiBBIENSIGlzIGFkZGVkIGFmdGVyIGVhY2ggc3RyaW5nIGlzIHByaW50ZWQuCisgKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCitkZWJ1Z2xvZ3MoaW50IGxldmVsLCBjaGFyICpwYXR0ZXJuLCAuLi4pCisjZWxzZQorZGVidWdsb2dzKHZhX2FsaXN0KQorICAgICB2YV9kY2wKKyNlbmRpZgoreworICB2YV9saXN0IGFyZ3M7CisgIGNoYXIgKnA7CisgIHVuc2lnbmVkIGNoYXIgYnVmW1BCVUZTSVpdOworICBjaGFyIG5ld2J1ZltQQlVGU0laXTsKKyAgaW50IGk7CisKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyAgdmFfc3RhcnQoYXJncywgcGF0dGVybik7CisjZWxzZQorICBjaGFyICpwYXR0ZXJuOworICBpbnQgbGV2ZWw7CisgIHZhX3N0YXJ0KGFyZ3MpOworICBsZXZlbCA9IHZhX2FyZyhhcmdzLCBpbnQpOwkJCS8qIGdldCB0aGUgZGVidWcgbGV2ZWwgKi8KKyAgcGF0dGVybiA9IHZhX2FyZyhhcmdzLCBjaGFyICopOwkJLyogZ2V0IHRoZSBwcmludGYgc3R5bGUgcGF0dGVybiAqLworI2VuZGlmCisKKyAgaWYgKChsZXZlbCA8MCkgfHwgKGxldmVsID4gMTAwKSkgeworICAgIGVycm9yICgiQmFkIGFyZ3VtZW50IHBhc3NlZCB0byBkZWJ1Z2xvZ3MoKSwgbmVlZHMgZGVidWcgbGV2ZWwiKTsKKyAgICByZXR1cm47CisgIH0KKyAgICAgIAorICB2c3ByaW50ZihidWYsIHBhdHRlcm4sIGFyZ3MpOwkJCS8qIGZvcm1hdCB0aGUgc3RyaW5nICovCisgIAorICAvKiBjb252ZXJ0IHNvbWUgY2hhcmFjdGVycyBzbyBpdCdsbCBsb29rIHJpZ2h0IGluIHRoZSBsb2cgKi8KKyAgcCA9IG5ld2J1ZjsKKyAgZm9yIChpID0gMCA7IGJ1ZltpXSAhPSAnXDAnOyBpKyspIHsKKyAgICBpZiAoaSA+IFBCVUZTSVopCisgICAgICBlcnJvciAoIkRlYnVnIG1lc3NhZ2UgdG9vIGxvbmciKTsKKyAgICBzd2l0Y2ggKGJ1ZltpXSkgeworICAgIGNhc2UgJ1xuJzoJCQkJCS8qIG5ld2xpbmVzICovCisgICAgICAqcCsrID0gJ1xcJzsKKyAgICAgICpwKysgPSAnbic7CisgICAgICBjb250aW51ZTsKKyAgICBjYXNlICdccic6CQkJCQkvKiBjYXJyaWFnZSByZXR1cm5zICovCisgICAgICAqcCsrID0gJ1xcJzsKKyAgICAgICpwKysgPSAncic7CisgICAgICBjb250aW51ZTsKKyAgICBjYXNlICdcMDMzJzoJCQkJLyogZXNjYXBlICovCisgICAgICAqcCsrID0gJ1xcJzsKKyAgICAgICpwKysgPSAnZSc7CisgICAgICBjb250aW51ZTsKKyAgICBjYXNlICdcdCc6CQkJCQkvKiB0YWIgKi8KKyAgICAgICpwKysgPSAnXFwnOworICAgICAgKnArKyA9ICd0JzsKKyAgICAgIGNvbnRpbnVlOworICAgIGNhc2UgJ1xiJzoJCQkJCS8qIGJhY2tzcGFjZSAqLworICAgICAgKnArKyA9ICdcXCc7CisgICAgICAqcCsrID0gJ2InOworICAgICAgY29udGludWU7CisgICAgZGVmYXVsdDoJCQkJCS8qIG5vIGNoYW5nZSAqLworICAgICAgKnArKyA9IGJ1ZltpXTsKKyAgICB9CisKKyAgICBpZiAoYnVmW2ldIDwgMjYpIHsJCQkJLyogbW9kaWZ5IGNvbnRyb2wgY2hhcmFjdGVycyAqLworICAgICAgKnArKyA9ICdeJzsKKyAgICAgICpwKysgPSBidWZbaV0gKyAnQSc7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgIGlmIChidWZbaV0gPj0gMTI4KSB7CQkJLyogbW9kaWZ5IGNvbnRyb2wgY2hhcmFjdGVycyAqLworICAgICAgKnArKyA9ICchJzsKKyAgICAgICpwKysgPSBidWZbaV0gKyAnQSc7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgfQorICAqcCA9ICdcMCc7CQkJCQkvKiB0ZXJtaW5hdGUgdGhlIHN0cmluZyAqLworCisgIGlmIChzcl9nZXRfZGVidWcoKSA+IGxldmVsKQorICAgIHByaW50Zl91bmZpbHRlcmVkICgiJXNcbiIsIG5ld2J1Zik7CisKKyNpZmRlZiBMT0dfRklMRQkJCQkJLyogd3JpdGUgdG8gdGhlIG1vbml0b3IgbG9nICovCisgIGlmIChsb2dfZmlsZSAhPSAweDApIHsKKyAgICBmcHV0cyAobmV3YnVmLCBsb2dfZmlsZSk7CisgICAgZnB1dGMgKCdcbicsIGxvZ19maWxlKTsKKyAgICBmZmx1c2ggKGxvZ19maWxlKTsKKyAgfQorI2VuZGlmCit9CisKKy8qIHJlYWRjaGFyIC0tIHJlYWQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgcmVtb3RlIHN5c3RlbSwgZG9pbmcgYWxsIHRoZSBmYW5jeQorICoJdGltZW91dCBzdHVmZi4KKyAqLworc3RhdGljIGludAorcmVhZGNoYXIodGltZW91dCkKKyAgICAgaW50IHRpbWVvdXQ7Cit7CisgIGludCBjOworCisgIGMgPSBTRVJJQUxfUkVBRENIQVIoYXJyYXlfZGVzYywgYWJzKHRpbWVvdXQpKTsKKworICBpZiAoc3JfZ2V0X2RlYnVnKCkgPiA1KSB7CisgICAgcHV0Y2hhcihjICYgMHg3Zik7CisgICAgZGVidWdsb2dzICg1LCAicmVhZGNoYXI6IHRpbWVvdXQgPSAlZFxuIiwgdGltZW91dCk7CisgIH0KKworI2lmZGVmIExPR19GSUxFCisgIGlmIChpc2FzY2lpIChjKSkKKyAgICBwdXRjKGMgJiAweDdmLCBsb2dfZmlsZSk7CisjZW5kaWYKKworICBpZiAoYyA+PSAwKQorICAgIHJldHVybiBjICYgMHg3ZjsKKworICBpZiAoYyA9PSBTRVJJQUxfVElNRU9VVCkgeworICAgIGlmICh0aW1lb3V0IDw9IDApCisgICAgICByZXR1cm4gYzsJCS8qIFBvbGxzIHNob3VsZG4ndCBnZW5lcmF0ZSB0aW1lb3V0IGVycm9ycyAqLworICAgIGVycm9yKCJUaW1lb3V0IHJlYWRpbmcgZnJvbSByZW1vdGUgc3lzdGVtLiIpOworI2lmZGVmIExPR19GSUxFCisgICAgICBmcHV0cyAoIkVSUk9SOiBUaW1lb3V0IHJlYWRpbmcgZnJvbSByZW1vdGUgc3lzdGVtIiwgbG9nX2ZpbGUpOworI2VuZGlmCisgIH0KKyAgcGVycm9yX3dpdGhfbmFtZSgicmVhZGNoYXIiKTsKK30KKworLyogCisgKiBleHBlY3QgLS0gIHNjYW4gaW5wdXQgZnJvbSB0aGUgcmVtb3RlIHN5c3RlbSwgdW50aWwgU1RSSU5HIGlzIGZvdW5kLgorICoJSWYgRElTQ0FSRCBpcyBub24temVybywgdGhlbiBkaXNjYXJkIG5vbi1tYXRjaGluZyBpbnB1dCwgZWxzZSBwcmludAorICoJaXQgb3V0LiBMZXQgdGhlIHVzZXIgYnJlYWsgb3V0IGltbWVkaWF0ZWx5LgorICovCitzdGF0aWMgdm9pZAorZXhwZWN0IChzdHJpbmcsIGRpc2NhcmQpCisgICAgIGNoYXIgKnN0cmluZzsKKyAgICAgaW50IGRpc2NhcmQ7Cit7CisgIGNoYXIgKnAgPSBzdHJpbmc7CisgIGludCBjOworCisKKyAgZGVidWdsb2dzICgxLCAiRXhwZWN0aW5nIFwiJXNcIi4iLCBzdHJpbmcpOworCisgIGltbWVkaWF0ZV9xdWl0ID0gMTsKKyAgd2hpbGUgKDEpIHsKKyAgICBjID0gcmVhZGNoYXIodGltZW91dCk7CisgICAgaWYgKCFpc2FzY2lpIChjKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChjID09ICpwKyspIHsKKyAgICAgIGlmICgqcCA9PSAnXDAnKSB7CisJaW1tZWRpYXRlX3F1aXQgPSAwOworCWRlYnVnbG9ncyAoNCwgIk1hdGNoZWQiKTsKKwlyZXR1cm47CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghZGlzY2FyZCkgeworCWZwdXRjX3VuZmlsdGVyZWQgKGMsIGdkYl9zdGRvdXQpOworICAgICAgfQorICAgICAgcCA9IHN0cmluZzsKKyAgICB9CisgIH0KK30KKworLyogS2VlcCBkaXNjYXJkaW5nIGlucHV0IHVudGlsIHdlIHNlZSB0aGUgTU9OSVRPUiBhcnJheV9jbWRzLT5wcm9tcHQuCisKKyAgIFRoZSBjb252ZW50aW9uIGZvciBkZWFsaW5nIHdpdGggdGhlIGV4cGVjdF9wcm9tcHQgaXMgdGhhdCB5b3UKKyAgIG8gZ2l2ZSB5b3VyIGNvbW1hbmQKKyAgIG8gKnRoZW4qIHdhaXQgZm9yIHRoZSBleHBlY3RfcHJvbXB0LgorCisgICBUaHVzIHRoZSBsYXN0IHRoaW5nIHRoYXQgYSBwcm9jZWR1cmUgZG9lcyB3aXRoIHRoZSBzZXJpYWwgbGluZQorICAgd2lsbCBiZSBhbiBleHBlY3RfcHJvbXB0KCkuICBFeGNlcHRpb246ICBhcnJheV9yZXN1bWUgZG9lcyBub3QKKyAgIHdhaXQgZm9yIHRoZSBleHBlY3RfcHJvbXB0LCBiZWNhdXNlIHRoZSB0ZXJtaW5hbCBpcyBiZWluZyBoYW5kZWQgb3ZlcgorICAgdG8gdGhlIGluZmVyaW9yLiAgSG93ZXZlciwgdGhlIG5leHQgdGhpbmcgd2hpY2ggaGFwcGVucyBhZnRlciB0aGF0CisgICBpcyBhIGFycmF5X3dhaXQgd2hpY2ggZG9lcyB3YWl0IGZvciB0aGUgZXhwZWN0X3Byb21wdC4KKyAgIE5vdGUgdGhhdCB0aGlzIGluY2x1ZGVzIGFibm9ybWFsIGV4aXQsIGUuZy4gZXJyb3IoKS4gIFRoaXMgaXMKKyAgIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGdldHRpbmcgaW50byBzdGF0ZXMgZnJvbSB3aGljaCB3ZSBjYW4ndAorICAgcmVjb3Zlci4gICovCitzdGF0aWMgdm9pZAorZXhwZWN0X3Byb21wdChkaXNjYXJkKQorICAgICBpbnQgZGlzY2FyZDsKK3sKKyAgZXhwZWN0IChBUlJBWV9QUk9NUFQsIGRpc2NhcmQpOworfQorCisvKgorICoganVuayAtLSBpZ25vcmUganVuayBjaGFyYWN0ZXJzLiBSZXR1cm5zIGEgMSBpZiBqdW5rLCAwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50CitqdW5rKGNoKQorICAgICBjaGFyIGNoOworeworICBzd2l0Y2ggKGNoKSB7CisgIGNhc2UgJ1wwJzoKKyAgY2FzZSAnICc6CisgIGNhc2UgJy0nOgorICBjYXNlICdcdCc6CisgIGNhc2UgJ1xyJzoKKyAgY2FzZSAnXG4nOgorICAgIGlmIChzcl9nZXRfZGVidWcoKSA+IDUpCisgICAgICBkZWJ1Z2xvZ3MgKDUsICJJZ25vcmluZyBcJyVjXCcuIiwgY2gpOworICAgIHJldHVybiAxOworICBkZWZhdWx0OgorICAgIGlmIChzcl9nZXRfZGVidWcoKSA+IDUpCisgICAgICBkZWJ1Z2xvZ3MgKDUsICJBY2NlcHRpbmcgXCclY1wnLiIsIGNoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisvKiAKKyAqICBnZXRfaGV4X2RpZ2l0IC0tIEdldCBhIGhleCBkaWdpdCBmcm9tIHRoZSByZW1vdGUgc3lzdGVtICYgcmV0dXJuIGl0cyB2YWx1ZS4KKyAqCQlJZiBpZ25vcmUgaXMgbm9uemVybywgaWdub3JlIHNwYWNlcywgbmV3bGluZSAmIHRhYnMuCisgKi8KK3N0YXRpYyBpbnQKK2dldF9oZXhfZGlnaXQoaWdub3JlKQorICAgICBpbnQgaWdub3JlOworeworICBzdGF0aWMgaW50IGNoOworICB3aGlsZSAoMSkgeworICAgIGNoID0gcmVhZGNoYXIodGltZW91dCk7CisgICAgaWYgKGp1bmsoY2gpKQorICAgICAgY29udGludWU7CisgICAgaWYgKHNyX2dldF9kZWJ1ZygpID4gNCkgeworICAgICAgZGVidWdsb2dzICg0LCAiZ2V0X2hleF9kaWdpdCgpIGdvdCBhIDB4JXgoJWMpIiwgY2gsIGNoKTsKKyAgICB9IGVsc2UgeworI2lmZGVmIExPR19GSUxFCQkJCQkvKiB3cml0ZSB0byB0aGUgbW9uaXRvciBsb2cgKi8KKyAgICAgIGlmIChsb2dfZmlsZSAhPSAweDApIHsKKwlmcHV0cyAoImdldF9oZXhfZGlnaXQoKSBnb3QgYSAweCIsIGxvZ19maWxlKTsKKwlmcHV0YyAoY2gsIGxvZ19maWxlKTsKKwlmcHV0YyAoJ1xuJywgbG9nX2ZpbGUpOworCWZmbHVzaCAobG9nX2ZpbGUpOworICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCisgICAgICByZXR1cm4gY2ggLSAnMCc7CisgICAgZWxzZSBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykKKyAgICAgIHJldHVybiBjaCAtICdBJyArIDEwOworICAgIGVsc2UgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpCisgICAgICByZXR1cm4gY2ggLSAnYScgKyAxMDsKKyAgICBlbHNlIGlmIChjaCA9PSAnICcgJiYgaWdub3JlKQorICAgICAgOworICAgIGVsc2UgeworICAgICBleHBlY3RfcHJvbXB0KDEpOworICAgICAgZGVidWdsb2dzICg0LCAiSW52YWxpZCBoZXggZGlnaXQgZnJvbSByZW1vdGUgc3lzdGVtLiAoMHgleCkiLCBjaCk7CisgICAgICBlcnJvcigiSW52YWxpZCBoZXggZGlnaXQgZnJvbSByZW1vdGUgc3lzdGVtLiAoMHgleCkiLCBjaCk7CisgICAgfQorICB9Cit9CisKKy8qIGdldF9oZXhfYnl0ZSAtLSBHZXQgYSBieXRlIGZyb20gbW9uaXRvciBhbmQgcHV0IGl0IGluICpCWVQuIAorICoJQWNjZXB0IGFueSBudW1iZXIgbGVhZGluZyBzcGFjZXMuCisgKi8KK3N0YXRpYyB2b2lkCitnZXRfaGV4X2J5dGUgKGJ5dCkKKyAgICAgY2hhciAqYnl0OworeworICBpbnQgdmFsOworCisgIHZhbCA9IGdldF9oZXhfZGlnaXQgKDEpIDw8IDQ7CisgIGRlYnVnbG9ncyAoNCwgImdldF9oZXhfYnl0ZSgpIC0tIFJlYWQgZmlyc3QgbmliYmxlIDB4JXgiLCB2YWwpOworIAorICB2YWwgfD0gZ2V0X2hleF9kaWdpdCAoMCk7CisgIGRlYnVnbG9ncyAoNCwgImdldF9oZXhfYnl0ZSgpIC0tIFJlYWQgc2Vjb25kIG5pYmJsZSAweCV4IiwgdmFsKTsKKyAgKmJ5dCA9IHZhbDsKKyAgCisgIGRlYnVnbG9ncyAoNCwgImdldF9oZXhfYnl0ZSgpIC0tIFJlYWQgYSAweCV4IiwgdmFsKTsKK30KKworLyogCisgKiBnZXRfaGV4X3dvcmQgLS0gIEdldCBOIDMyLWJpdCB3b3JkcyBmcm9tIHJlbW90ZSwgZWFjaCBwcmVjZWRlZCBieSBhIHNwYWNlLAorICoJYW5kIHB1dCB0aGVtIGluIHJlZ2lzdGVycyBzdGFydGluZyBhdCBSRUdOTy4KKyAqLworc3RhdGljIGludAorZ2V0X2hleF93b3JkICgpCit7CisgIGxvbmcgdmFsLCBuZXd2YWw7CisgIGludCBpOworCisgIHZhbCA9IDA7CisKKyNpZiAwCisgIGlmIChIT1NUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikgeworI2VuZGlmCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgIHZhbCA9ICh2YWwgPDwgNCkgKyBnZXRfaGV4X2RpZ2l0IChpID09IDApOworI2lmIDAKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSA3OyBpID49IDA7IGktLSkKKyAgICAgIHZhbCA9ICh2YWwgPDwgNCkgKyBnZXRfaGV4X2RpZ2l0IChpID09IDApOworICB9CisjZW5kaWYKKworICBkZWJ1Z2xvZ3MgKDQsICJnZXRfaGV4X3dvcmQoKSBnb3QgYSAweCV4IGZvciBhICVzIGhvc3QuIiwgdmFsLCAoSE9TVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pID8gImJpZyBlbmRpYW4iIDogImxpdHRsZSBlbmRpYW4iKTsKKworICByZXR1cm4gdmFsOworfQorCisvKiBUaGlzIGlzIGNhbGxlZCBub3Qgb25seSB3aGVuIHdlIGZpcnN0IGF0dGFjaCwgYnV0IGFsc28gd2hlbiB0aGUKKyAgIHVzZXIgdHlwZXMgInJ1biIgYWZ0ZXIgaGF2aW5nIGF0dGFjaGVkLiAgKi8KK3N0YXRpYyB2b2lkCithcnJheV9jcmVhdGVfaW5mZXJpb3IgKGV4ZWNmaWxlLCBhcmdzLCBlbnYpCisgICAgIGNoYXIgKmV4ZWNmaWxlOworICAgICBjaGFyICphcmdzOworICAgICBjaGFyICoqZW52OworeworICBpbnQgZW50cnlfcHQ7CisKKyAgaWYgKGFyZ3MgJiYgKmFyZ3MpCisgICAgZXJyb3IoIkNhbid0IHBhc3MgYXJndW1lbnRzIHRvIHJlbW90ZSBNT05JVE9SIHByb2Nlc3MiKTsKKworICBpZiAoZXhlY2ZpbGUgPT0gMCB8fCBleGVjX2JmZCA9PSAwKQorICAgIGVycm9yKCJObyBleGVjdXRhYmxlIGZpbGUgc3BlY2lmaWVkIik7CisKKyAgZW50cnlfcHQgPSAoaW50KSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGV4ZWNfYmZkKTsKKworLyogVGhlICJwcm9jZXNzIiAoYm9hcmQpIGlzIGFscmVhZHkgc3RvcHBlZCBhd2FpdGluZyBvdXIgY29tbWFuZHMsIGFuZAorICAgdGhlIHByb2dyYW0gaXMgYWxyZWFkeSBkb3dubG9hZGVkLiAgV2UganVzdCBzZXQgaXRzIFBDIGFuZCBnby4gICovCisKKyAgY2xlYXJfcHJvY2VlZF9zdGF0dXMgKCk7CisKKyAgLyogVGVsbCB3YWl0X2Zvcl9pbmZlcmlvciB0aGF0IHdlJ3ZlIHN0YXJ0ZWQgYSBuZXcgcHJvY2Vzcy4gICovCisgIGluaXRfd2FpdF9mb3JfaW5mZXJpb3IgKCk7CisKKyAgLyogU2V0IHVwIHRoZSAic2F2ZWQgdGVybWluYWwgbW9kZXMiIG9mIHRoZSBpbmZlcmlvcgorICAgICBiYXNlZCBvbiB3aGF0IG1vZGVzIHdlIGFyZSBzdGFydGluZyBpdCB3aXRoLiAgKi8KKyAgdGFyZ2V0X3Rlcm1pbmFsX2luaXQgKCk7CisKKyAgLyogSW5zdGFsbCBpbmZlcmlvcidzIHRlcm1pbmFsIG1vZGVzLiAgKi8KKyAgdGFyZ2V0X3Rlcm1pbmFsX2luZmVyaW9yICgpOworCisgIC8qIGluc2VydF9zdGVwX2JyZWFrcG9pbnQgKCk7ICBGSVhNRSwgZG8gd2UgbmVlZCB0aGlzPyAgKi8KKworICAvKiBMZXQgJ2VyIHJpcC4uLiAqLworICBwcm9jZWVkICgoQ09SRV9BRERSKWVudHJ5X3B0LCBUQVJHRVRfU0lHTkFMX0RFRkFVTFQsIDApOworfQorCisvKgorICogYXJyYXlfb3BlbiAtLSBvcGVuIGEgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBkZWJ1Z2dlci4KKyAqCU5BTUUgaXMgdGhlIGZpbGVuYW1lIHVzZWQgZm9yIGNvbW11bmljYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgYmF1ZHJhdGUgPSA5NjAwOworc3RhdGljIGNoYXIgZGV2X25hbWVbMTAwXTsKKworc3RhdGljIHZvaWQKK2FycmF5X29wZW4oYXJncywgbmFtZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGNoYXIgKm5hbWU7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgY2hhciBwYWNrZXRbUEJVRlNJWl07CisKKyAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICBlcnJvciAoIlVzZSBgdGFyZ2V0ICVzIERFVklDRS1OQU1FJyB0byB1c2UgYSBzZXJpYWwgcG9ydCwgb3IgXG5cCitgdGFyZ2V0ICVzIEhPU1QtTkFNRTpQT1JULU5VTUJFUicgdG8gdXNlIGEgbmV0d29yayBjb25uZWN0aW9uLiIsIG5hbWUsIG5hbWUpOworCisvKiAgaWYgKGlzX29wZW4pICovCisgICAgYXJyYXlfY2xvc2UoMCk7CisKKyAgdGFyZ2V0X3ByZW9wZW4gKGZyb21fdHR5KTsKKyAgdW5wdXNoX3RhcmdldCAoJmFycmF5X29wcyk7CisKKyAgdG1wX21pcHNfcHJvY2Vzc29yX3R5cGUgPSAibHNpMzNrIjsJLyogY2hhbmdlIHRoZSBkZWZhdWx0IGZyb20gcjMwNTEgKi8KKyAgbWlwc19zZXRfcHJvY2Vzc29yX3R5cGVfY29tbWFuZCAoImxzaTMzayIsIDApOworCisgIHN0cmNweShkZXZfbmFtZSwgYXJncyk7CisgIGFycmF5X2Rlc2MgPSBTRVJJQUxfT1BFTihkZXZfbmFtZSk7CisKKyAgaWYgKGFycmF5X2Rlc2MgPT0gTlVMTCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lKGRldl9uYW1lKTsKKworICBpZiAoYmF1ZF9yYXRlICE9IC0xKSB7CisgICAgaWYgKFNFUklBTF9TRVRCQVVEUkFURSAoYXJyYXlfZGVzYywgYmF1ZF9yYXRlKSkgeworICAgICAgU0VSSUFMX0NMT1NFIChhcnJheV9kZXNjKTsKKyAgICAgIHBlcnJvcl93aXRoX25hbWUgKG5hbWUpOworICAgIH0KKyAgfQorICAKKyAgU0VSSUFMX1JBVyhhcnJheV9kZXNjKTsKKworI2lmIGRlZmluZWQgKExPR19GSUxFKQorICBsb2dfZmlsZSA9IGZvcGVuIChMT0dfRklMRSwgInciKTsKKyAgaWYgKGxvZ19maWxlID09IE5VTEwpCisgICAgcGVycm9yX3dpdGhfbmFtZSAoTE9HX0ZJTEUpOworICBmcHJpbnRmIChsb2dfZmlsZSwgIkdEQiAlcyAoJXMiLCB2ZXJzaW9uKTsKKyAgZnByaW50ZiAobG9nX2ZpbGUsICIgLS10YXJnZXQgJXMpXG4iLCBhcnJheV9vcHMudG9fc2hvcnRuYW1lKTsKKyAgZnByaW50ZiAobG9nX2ZpbGUsICJSZW1vdGUgdGFyZ2V0ICVzIGNvbm5lY3RlZCB0byAlc1xuXG4iLCBhcnJheV9vcHMudG9fc2hvcnRuYW1lLCBkZXZfbmFtZSk7CisjZW5kaWYKKworICAvKiBzZWUgaWYgdGhlIHRhcmdldCBpcyBhbGl2ZS4gRm9yIGEgUk9NIG1vbml0b3IsIHdlIGNhbiBqdXN0IHRyeSB0byBmb3JjZSB0aGUKKyAgICAgZXhwZWN0X3Byb21wdCB0byBwcmludCBhIGZldyB0aW1lcy4gRm9yIHRoZSBHREIgcmVtb3RlIHByb3RvY29sLCB0aGUgYXBwbGljYXRpb24KKyAgICAgYmVpbmcgZGVidWdnZWQgaXMgc2l0dGluZyBhdCBhIGJyZWFrcG9pbnQgYW5kIHdhaXRpbmcgZm9yIEdEQiB0byBpbml0aWFsaXplCisgICAgIHRoZSBjb25uZWN0aW9uLiBXZSBmb3JjZSBpdCB0byBnaXZlIHVzIGFuIGVtcHR5IHBhY2tldCB0byBzZWUgaWYgaXQncyBhbGl2ZS4KKyAgICAgKi8KKyAgICBkZWJ1Z2xvZ3MgKDMsICJUcnlpbmcgdG8gQUNLIHRoZSB0YXJnZXQncyBkZWJ1ZyBzdHViIik7CisgICAgLyogdW5sZXNzIHlvdXIgYXJlIG9uIHRoZSBuZXcgaGFyZHdhcmUsIHRoZSBvbGQgYm9hcmQgd29uJ3QgaW5pdGlhbGl6ZQorICAgICAgIGJlY2F1c2UgdGhlICdAJyBkb2Vzbid0IGZsdXNoIG91dHB1dCBsaWtlIGl0IGRvZXMgb24gdGhlIG5ldyBST01TLgorICAgICAqLworICAgIHByaW50Zl9tb25pdG9yICgiQCIpOwkvKiBhc2sgZm9yIHRoZSBsYXN0IHNpZ25hbCAqLworICAgIGV4cGVjdF9wcm9tcHQoMSk7CQkvKiBTZWUgaWYgd2UgZ2V0IGEgZXhwZWN0X3Byb21wdCAqLworI2lmZGVmIFRFU1RfQVJSQVkJCS8qIHNraXAgcGFja2V0IGZvciB0ZXN0aW5nICovCisgICAgbWFrZV9nZGJfcGFja2V0IChwYWNrZXQsICI/Iik7CS8qIGFzayBmb3IgYSBib2d1cyBwYWNrZXQgKi8KKyAgICBpZiAoYXJyYXlfc2VuZF9wYWNrZXQgKHBhY2tldCkgPT0gMCkKKyAgICAgIGVycm9yICgiQ291bGRuJ3QgdHJhbnNtaXQgcGFja2V0XG4iKTsKKyAgICBwcmludGZfbW9uaXRvciAoIkBcbiIpOwkvKiBmb3JjZSBpdCB0byBmbHVzaCBzdGRvdXQgKi8KKyAgIGV4cGVjdF9wcm9tcHQoMSk7CQkvKiBTZWUgaWYgd2UgZ2V0IGEgZXhwZWN0X3Byb21wdCAqLworI2VuZGlmCisgIHB1c2hfdGFyZ2V0ICgmYXJyYXlfb3BzKTsKKyAgaWYgKGZyb21fdHR5KQorICAgIHByaW50ZigiUmVtb3RlIHRhcmdldCAlcyBjb25uZWN0ZWQgdG8gJXNcbiIsIGFycmF5X29wcy50b19zaG9ydG5hbWUsIGRldl9uYW1lKTsKK30KKworLyoKKyAqIGFycmF5X2Nsb3NlIC0tIENsb3NlIG91dCBhbGwgZmlsZXMgYW5kIGxvY2FsIHN0YXRlIGJlZm9yZSB0aGlzCisgKgl0YXJnZXQgbG9zZXMgY29udHJvbC4KKyAqLworCitzdGF0aWMgdm9pZAorYXJyYXlfY2xvc2UgKHF1aXR0aW5nKQorICAgICBpbnQgcXVpdHRpbmc7Cit7CisgIFNFUklBTF9DTE9TRShhcnJheV9kZXNjKTsKKyAgYXJyYXlfZGVzYyA9IE5VTEw7CisKKyAgZGVidWdsb2dzICgxLCAiYXJyYXlfY2xvc2UgKHF1aXR0aW5nPSVkKSIsIHF1aXR0aW5nKTsKKworI2lmIGRlZmluZWQgKExPR19GSUxFKQorICBpZiAobG9nX2ZpbGUpIHsKKyAgICBpZiAoZmVycm9yKGxvZ19maWxlKSkKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkVycm9yIHdyaXRpbmcgbG9nIGZpbGUuXG4iKTsKKyAgICBpZiAoZmNsb3NlKGxvZ19maWxlKSAhPSAwKQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiRXJyb3IgY2xvc2luZyBsb2cgZmlsZS5cbiIpOworICB9CisjZW5kaWYKK30KKworLyogCisgKiBhcnJheV9kZXRhY2ggLS0gdGVybWluYXRlIHRoZSBvcGVuIGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZQorICoJZGVidWdnZXIuIFVzZSB0aGlzIHdoZW4geW91IHdhbnQgdG8gZGV0YWNoIGFuZCBkbyBzb21ldGhpbmcKKyAqCWVsc2Ugd2l0aCB5b3VyIGdkYi4KKyAqLworc3RhdGljIHZvaWQKK2FycmF5X2RldGFjaCAoZnJvbV90dHkpCisgICAgIGludCBmcm9tX3R0eTsKK3sKKworICBkZWJ1Z2xvZ3MgKDEsICJhcnJheV9kZXRhY2ggKCkiKTsKKworICBwb3BfdGFyZ2V0KCk7CQkvKiBjYWxscyBhcnJheV9jbG9zZSB0byBkbyB0aGUgcmVhbCB3b3JrICovCisgIGlmIChmcm9tX3R0eSkKKyAgICBwcmludGYgKCJFbmRpbmcgcmVtb3RlICVzIGRlYnVnZ2luZ1xuIiwgdGFyZ2V0X3Nob3J0bmFtZSk7Cit9CisKKy8qCisgKiBhcnJheV9hdHRhY2ggLS0gYXR0YWNoIEdEQiB0byB0aGUgdGFyZ2V0LgorICovCitzdGF0aWMgdm9pZAorYXJyYXlfYXR0YWNoIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAoZnJvbV90dHkpCisgICAgcHJpbnRmICgiU3RhcnRpbmcgcmVtb3RlICVzIGRlYnVnZ2luZ1xuIiwgdGFyZ2V0X3Nob3J0bmFtZSk7CisgCisgIGRlYnVnbG9ncyAoMSwgImFycmF5X2F0dGFjaCAoYXJncz0lcykiLCBhcmdzKTsKKyAgCisgIHByaW50Zl9tb25pdG9yICgiZ28gJXhcbiIpOworICAvKiBzd2FsbG93IHRoZSBlY2hvLiAgKi8KKyAgZXhwZWN0ICgiZ28gJXhcbiIsIDEpOworfQorICAKKy8qCisgKiBhcnJheV9yZXN1bWUgLS0gVGVsbCB0aGUgcmVtb3RlIG1hY2hpbmUgdG8gcmVzdW1lLgorICovCitzdGF0aWMgdm9pZAorYXJyYXlfcmVzdW1lIChwaWQsIHN0ZXAsIHNpZykKKyAgICAgaW50IHBpZCwgc3RlcDsKKyAgICAgZW51bSB0YXJnZXRfc2lnbmFsIHNpZzsKK3sKKyAgZGVidWdsb2dzICgxLCAiYXJyYXlfcmVzdW1lIChzdGVwPSVkLCBzaWc9JWQpIiwgc3RlcCwgc2lnKTsKKworICBpZiAoc3RlcCkgeworICAgIHByaW50Zl9tb25pdG9yICgic1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmX21vbml0b3IgKCJnb1xuIik7CisgIH0KK30KKworI2RlZmluZSBUTVBCVUZTSVogNQorCisvKgorICogYXJyYXlfd2FpdCAtLSBXYWl0IHVudGlsIHRoZSByZW1vdGUgbWFjaGluZSBzdG9wcywgdGhlbiByZXR1cm4sCisgKiAgICAgICAgICBzdG9yaW5nIHN0YXR1cyBpbiBzdGF0dXMganVzdCBhcyBgd2FpdCcgd291bGQuCisgKi8KK3N0YXRpYyBpbnQKK2FycmF5X3dhaXQgKHBpZCwgc3RhdHVzKQorICAgICBpbnQgcGlkOworICAgICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0YXR1czsKK3sKKyAgaW50IG9sZF90aW1lb3V0ID0gdGltZW91dDsKKyAgaW50IHJlc3VsdCwgaTsKKyAgY2hhciBjOworICBzZXJpYWxfdCB0dHlfZGVzYzsKKyAgc2VyaWFsX3R0eXN0YXRlIHR0eXN0YXRlOworCisgIGRlYnVnbG9ncygxLCAiYXJyYXlfd2FpdCAoKSwgcHJpbnRpbmcgZXh0cmFuZW91cyB0ZXh0LiIpOworICAKKyAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0VYSVRFRDsKKyAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gMDsKKworICB0aW1lb3V0ID0gMDsJCS8qIERvbid0IHRpbWUgb3V0IC0tIHVzZXIgcHJvZ3JhbSBpcyBydW5uaW5nLiAqLworIAorI2lmICFkZWZpbmVkKF9fR08zMl9fKSAmJiAhZGVmaW5lZChfX01TRE9TX18pICYmICFkZWZpbmVkKF9XSU4zMikKKyAgdHR5X2Rlc2MgPSBTRVJJQUxfRkRPUEVOICgwKTsKKyAgdHR5c3RhdGUgPSBTRVJJQUxfR0VUX1RUWV9TVEFURSAodHR5X2Rlc2MpOworICBTRVJJQUxfUkFXICh0dHlfZGVzYyk7CisKKyAgaSA9IDA7CisgIC8qIHBvbGwgb24gdGhlIHNlcmlhbCBwb3J0IGFuZCB0aGUga2V5Ym9hcmQuICovCisgIHdoaWxlICgxKSB7CisgICAgYyA9IHJlYWRjaGFyKHRpbWVvdXQpOworICAgIGlmIChjID4gMCkgeworICAgICAgaWYgKGMgPT0gKihBUlJBWV9QUk9NUFQgKyBpKSkgeworCWlmICgrK2kgPj0gc3RybGVuIChBUlJBWV9QUk9NUFQpKSB7IC8qIG1hdGNoZWQgdGhlIHByb21wdCAqLworCSAgZGVidWdsb2dzICg0LCAiYXJyYXlfd2FpdCgpLCBnb3QgdGhlIGV4cGVjdF9wcm9tcHQuIik7CisJICBicmVhazsKKwl9CisgICAgICB9IGVsc2UgewkJLyogbm90IHRoZSBwcm9tcHQgKi8KKwlpID0gMDsKKyAgICAgIH0KKyAgICAgIGZwdXRjX3VuZmlsdGVyZWQgKGMsIGdkYl9zdGRvdXQpOworICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgICB9CisgICAgYyA9IFNFUklBTF9SRUFEQ0hBUih0dHlfZGVzYywgdGltZW91dCk7CisgICAgaWYgKGMgPiAwKSB7CisgICAgICBTRVJJQUxfV1JJVEUoYXJyYXlfZGVzYywgJmMsIDEpOworICAgICAgLyogZG8gdGhpcyBzbyBpdCBsb29rcyBsaWtlIHRoZXJlJ3Mga2V5Ym9hcmQgZWNobyAqLworICAgICAgaWYgKGMgPT0gMykJCS8qIGV4aXQgb24gQ29udHJvbC1DICovCisJYnJlYWs7CisjaWYgMAorICAgICAgZnB1dGNfdW5maWx0ZXJlZCAoYywgZ2RiX3N0ZG91dCk7CisgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworI2VuZGlmCisgICAgfQorICB9CisgIFNFUklBTF9TRVRfVFRZX1NUQVRFICh0dHlfZGVzYywgdHR5c3RhdGUpOworI2Vsc2UKKyAgZXhwZWN0X3Byb21wdCgxKTsKKyAgZGVidWdsb2dzICg0LCAiYXJyYXlfd2FpdCgpLCBnb3QgdGhlIGV4cGVjdF9wcm9tcHQuIik7CisjZW5kaWYKKworICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKyAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1RSQVA7CisKKyAgdGltZW91dCA9IG9sZF90aW1lb3V0OworCisgIHJldHVybiAwOworfQorCisvKgorICogYXJyYXlfZmV0Y2hfcmVnaXN0ZXJzIC0tIHJlYWQgdGhlIHJlbW90ZSByZWdpc3RlcnMgaW50byB0aGUKKyAqCWJsb2NrIHJlZ3MuCisgKi8KK3N0YXRpYyB2b2lkCithcnJheV9mZXRjaF9yZWdpc3RlcnMgKGlnbm9yZWQpCisgICAgIGludCBpZ25vcmVkOworeworICBpbnQgcmVnbm8sIGk7CisgIGNoYXIgKnA7CisgIHVuc2lnbmVkIGNoYXIgcGFja2V0W1BCVUZTSVpdOworICBjaGFyIHJlZ3NbUkVHSVNURVJfQllURVNdOworCisgIGRlYnVnbG9ncyAoMSwgImFycmF5X2ZldGNoX3JlZ2lzdGVycyAoaWdub3JlZD0lZClcbiIsIGlnbm9yZWQpOworCisgIG1lbXNldCAocGFja2V0LCAwLCBQQlVGU0laKTsKKyAgLyogVW5pbXBsZW1lbnRlZCByZWdpc3RlcnMgcmVhZCBhcyBhbGwgYml0cyB6ZXJvLiAgKi8KKyAgbWVtc2V0IChyZWdzLCAwLCBSRUdJU1RFUl9CWVRFUyk7CisgIG1ha2VfZ2RiX3BhY2tldCAocGFja2V0LCAiZyIpOworICBpZiAoYXJyYXlfc2VuZF9wYWNrZXQgKHBhY2tldCkgPT0gMCkKKyAgICBlcnJvciAoIkNvdWxkbid0IHRyYW5zbWl0IHBhY2tldFxuIik7CisgIGlmIChhcnJheV9nZXRfcGFja2V0IChwYWNrZXQpID09IDApCisgICAgZXJyb3IgKCJDb3VsZG4ndCByZWNlaXZlIHBhY2tldFxuIik7ICAKKyAgLyogRklYTUU6IHJlYWQgYnl0ZXMgZnJvbSBwYWNrZXQgKi8KKyAgZGVidWdsb2dzICg0LCAiYXJyYXlfZmV0Y2hfcmVnaXN0ZXJzOiBHb3QgYSBcIiVzXCIgYmFja1xuIiwgcGFja2V0KTsKKyAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDw9IFBDX1JFR05VTSs0OyByZWdubysrKSB7CisgICAgLyogc3VwcGx5IHJlZ2lzdGVyIHN0b3JlcyBpbiB0YXJnZXQgYnl0ZSBvcmRlciwgc28gc3dhcCBoZXJlICovCisgICAgLyogRklYTUU6IGNvbnZlcnQgZnJvbSBBU0NJSSBoZXggdG8gcmF3IGJ5dGVzICovCisgICAgaSA9IGFzY2lpMmhleHdvcmQgKHBhY2tldCArIChyZWdubyAqIDgpKTsKKyAgICBkZWJ1Z2xvZ3MgKDUsICJBZGRpbmcgcmVnaXN0ZXIgJWQgPSAleFxuIiwgcmVnbm8sIGkpOworICAgIFNXQVBfVEFSR0VUX0FORF9IT1NUICgmaSwgNCk7CisgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgKGNoYXIgKikmaSk7CisgIH0KK30KKworLyogCisgKiBUaGlzIGlzIHVudXNlZCBieSB0YXJnZXRzIGxpa2UgdGhpcyBvbmUgdGhhdCB1c2UgYQorICogcHJvdG9jb2wgYmFzZWQgb24gR0RCJ3MgcmVtb3RlIHByb3RvY29sLgorICovCitzdGF0aWMgdm9pZAorYXJyYXlfZmV0Y2hfcmVnaXN0ZXIgKGlnbm9yZWQpCisgICAgIGludCBpZ25vcmVkOworeworICBhcnJheV9mZXRjaF9yZWdpc3RlcnMgKCk7Cit9CisKKy8qCisgKiBHZXQgYWxsIHRoZSByZWdpc3RlcnMgZnJvbSB0aGUgdGFyZ2V0cy4gVGhleSBjb21lIGJhY2sgaW4gYSBsYXJnZSBhcnJheS4KKyAqLworc3RhdGljIHZvaWQKK2FycmF5X3N0b3JlX3JlZ2lzdGVycyAoaWdub3JlZCkKKyAgICAgaW50IGlnbm9yZWQ7Cit7CisgIGludCByZWdubzsKKyAgdW5zaWduZWQgbG9uZyBpOworICBjaGFyIHBhY2tldFtQQlVGU0laXTsKKyAgY2hhciBidWZbUEJVRlNJWl07CisgIGNoYXIgbnVtWzldOworICAKKyAgZGVidWdsb2dzICgxLCAiYXJyYXlfc3RvcmVfcmVnaXN0ZXJzKCkiKTsKKworICBtZW1zZXQgKHBhY2tldCwgMCwgUEJVRlNJWik7CisgIG1lbXNldCAoYnVmLCAwLCBQQlVGU0laKTsKKyAgYnVmWzBdID0gJ0cnOworCisgIC8qIFVuaW1wbGVtZW50ZWQgcmVnaXN0ZXJzIHJlYWQgYXMgYWxsIGJpdHMgemVyby4gICovCisgIC8qIEZJWE1FOiByZWFkIGJ5dGVzIGZyb20gcGFja2V0ICovCisgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IDQxOyByZWdubysrKSB7IC8qIEZJWE1FICovCisgICAgLyogc3VwcGx5IHJlZ2lzdGVyIHN0b3JlcyBpbiB0YXJnZXQgYnl0ZSBvcmRlciwgc28gc3dhcCBoZXJlICovCisgICAgLyogRklYTUU6IGNvbnZlcnQgZnJvbSBBU0NJSSBoZXggdG8gcmF3IGJ5dGVzICovCisgICAgaSA9ICh1bnNpZ25lZCBsb25nKXJlYWRfcmVnaXN0ZXIgKHJlZ25vKTsKKyAgICBoZXh3b3JkMmFzY2lpIChudW0sIGkpOworICAgIHN0cmNweSAoYnVmKyhyZWdubyAqIDgpKzEsIG51bSk7CisgIH0KKyAgKihidWYgKyAocmVnbm8gKiA4KSArIDIpID0gMDsKKyAgbWFrZV9nZGJfcGFja2V0IChwYWNrZXQsIGJ1Zik7CisgIGlmIChhcnJheV9zZW5kX3BhY2tldCAocGFja2V0KSA9PSAwKQorICAgIGVycm9yICgiQ291bGRuJ3QgdHJhbnNtaXQgcGFja2V0XG4iKTsKKyAgaWYgKGFycmF5X2dldF9wYWNrZXQgKHBhY2tldCkgPT0gMCkKKyAgICBlcnJvciAoIkNvdWxkbid0IHJlY2VpdmUgcGFja2V0XG4iKTsgIAorICAKKyAgcmVnaXN0ZXJzX2NoYW5nZWQgKCk7Cit9CisKKy8qIAorICogVGhpcyBpcyB1bnVzZWQgYnkgdGFyZ2V0cyBsaWtlIHRoaXMgb25lIHRoYXQgdXNlIGEKKyAqIHByb3RvY29sIGJhc2VkIG9uIEdEQidzIHJlbW90ZSBwcm90b2NvbC4KKyAqLworc3RhdGljIHZvaWQKK2FycmF5X3N0b3JlX3JlZ2lzdGVyIChpZ25vcmVkKQorICAgICBpbnQgaWdub3JlZDsKK3sKKyAgYXJyYXlfc3RvcmVfcmVnaXN0ZXJzICgpOworfQorCisvKiBHZXQgcmVhZHkgdG8gbW9kaWZ5IHRoZSByZWdpc3RlcnMgYXJyYXkuICBPbiBtYWNoaW5lcyB3aGljaCBzdG9yZQorICAgaW5kaXZpZHVhbCByZWdpc3RlcnMsIHRoaXMgZG9lc24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLiAgT24gbWFjaGluZXMKKyAgIHdoaWNoIHN0b3JlIGFsbCB0aGUgcmVnaXN0ZXJzIGluIG9uZSBmZWxsIHN3b29wLCB0aGlzIG1ha2VzIHN1cmUKKyAgIHRoYXQgcmVnaXN0ZXJzIGNvbnRhaW5zIGFsbCB0aGUgcmVnaXN0ZXJzIGZyb20gdGhlIHByb2dyYW0gYmVpbmcKKyAgIGRlYnVnZ2VkLiAgKi8KKworc3RhdGljIHZvaWQKK2FycmF5X3ByZXBhcmVfdG9fc3RvcmUgKCkKK3sKKyAgLyogRG8gbm90aGluZywgc2luY2Ugd2UgY2FuIHN0b3JlIGluZGl2aWR1YWwgcmVncyAqLworfQorCitzdGF0aWMgdm9pZAorYXJyYXlfZmlsZXNfaW5mbyAoKQoreworICBwcmludGYgKCJcdEF0dGFjaGVkIHRvICVzIGF0ICVkIGJhdWQuXG4iLAorCSAgZGV2X25hbWUsIGJhdWRyYXRlKTsKK30KKworLyoKKyAqIGFycmF5X3dyaXRlX2luZmVyaW9yX21lbW9yeSAtLSBDb3B5IExFTiBieXRlcyBvZiBkYXRhIGZyb20gZGVidWdnZXIKKyAqCW1lbW9yeSBhdCBNWUFERFIgdG8gaW5mZXJpb3IncyBtZW1vcnkgYXQgTUVNQUREUi4gIFJldHVybnMgbGVuZ3RoIG1vdmVkLgorICovCitzdGF0aWMgaW50CithcnJheV93cml0ZV9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgdW5zaWduZWQgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICB1bnNpZ25lZCBsb25nIGk7CisgIGludCBqOworICBjaGFyIHBhY2tldFtQQlVGU0laXTsKKyAgY2hhciBidWZbUEJVRlNJWl07CisgIGNoYXIgbnVtWzldOworICBjaGFyICpwOworICAKKyAgZGVidWdsb2dzICgxLCAiYXJyYXlfd3JpdGVfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyPTB4JXgsIG15YWRkcj0weCV4LCBsZW49JWQpIiwgbWVtYWRkciwgbXlhZGRyLCBsZW4pOworICBtZW1zZXQgKGJ1ZiwgJ1wwJywgUEJVRlNJWik7CQkvKiB0aGlzIGFsc28gc2V0cyB0aGUgc3RyaW5nIHRlcm1pbmF0b3IgKi8KKyAgcCA9IGJ1ZjsKKworICAqcCsrID0gJ00nOwkJCQkvKiBUaGUgY29tbWFuZCB0byB3cml0ZSBtZW1vcnkgKi8KKyAgaGV4d29yZDJhc2NpaSAobnVtLCBtZW1hZGRyKTsJLyogY29udmVydCB0aGUgYWRkcmVzcyAqLworICBzdHJjcHkgKHAsIG51bSk7CQkJLyogY29weSB0aGUgYWRkcmVzcyAqLworICBwICs9IDg7CisgICpwKysgPSAnLCc7CQkJCS8qIGFkZCBjb21tYSBkZWxpbWV0ZXIgKi8KKyAgaGV4d29yZDJhc2NpaSAobnVtLCBsZW4pOwkJLyogR2V0IHRoZSBsZW5ndGggYXMgYSA0IGRpZ2l0IG51bWJlciAqLworICAqcCsrID0gbnVtWzRdOworICAqcCsrID0gbnVtWzVdOworICAqcCsrID0gbnVtWzZdOworICAqcCsrID0gbnVtWzddOworICAqcCsrID0gJzonOwkJCQkvKiBhZGQgdGhlIGNvbG9uIGRlbGltZXRlciAqLworICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsJCS8qIGNvcHkgdGhlIGRhdGEgaW4gYWZ0ZXIgY29udmVydGluZyBpdCAqLworICAgICpwKysgPSB0b2hleCAoKG15YWRkcltqXSA+PiA0KSAmIDB4Zik7CisgICAgKnArKyA9IHRvaGV4ICAobXlhZGRyW2pdICYgMHhmKTsKKyAgfQorICAKKyAgbWFrZV9nZGJfcGFja2V0IChwYWNrZXQsIGJ1Zik7CisgIGlmIChhcnJheV9zZW5kX3BhY2tldCAocGFja2V0KSA9PSAwKQorICAgIGVycm9yICgiQ291bGRuJ3QgdHJhbnNtaXQgcGFja2V0XG4iKTsKKyAgaWYgKGFycmF5X2dldF9wYWNrZXQgKHBhY2tldCkgPT0gMCkKKyAgICBlcnJvciAoIkNvdWxkbid0IHJlY2VpdmUgcGFja2V0XG4iKTsgIAorCisgIHJldHVybiBsZW47Cit9CisKKy8qCisgKiBhcnJheV9yZWFkX2luZmVyaW9yX21lbW9yeSAtLSByZWFkIExFTiBieXRlcyBmcm9tIGluZmVyaW9yIG1lbW9yeQorICoJYXQgTUVNQUREUi4gIFB1dCB0aGUgcmVzdWx0IGF0IGRlYnVnZ2VyIGFkZHJlc3MgTVlBRERSLiAgUmV0dXJucworICoJbGVuZ3RoIG1vdmVkLgorICovCitzdGF0aWMgaW50CithcnJheV9yZWFkX2luZmVyaW9yX21lbW9yeShtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaW50IGo7CisgIGNoYXIgYnVmWzIwXTsKKyAgY2hhciBwYWNrZXRbUEJVRlNJWl07CisgIGludCBjb3VudDsJCQkvKiBOdW1iZXIgb2YgYnl0ZXMgcmVhZCBzbyBmYXIuICAqLworICB1bnNpZ25lZCBsb25nIHN0YXJ0YWRkcjsJLyogU3RhcnRpbmcgYWRkcmVzcyBvZiB0aGlzIHBhc3MuICAqLworICBpbnQgbGVuX3RoaXNfcGFzczsJCS8qIE51bWJlciBvZiBieXRlcyB0byByZWFkIGluIHRoaXMgcGFzcy4gICovCisKKyAgZGVidWdsb2dzICgxLCAiYXJyYXlfcmVhZF9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHI9MHgleCwgbXlhZGRyPTB4JXgsIGxlbj0lZCkiLCBtZW1hZGRyLCBteWFkZHIsIGxlbik7CisKKyAgLyogTm90ZSB0aGF0IHRoaXMgY29kZSB3b3JrcyBjb3JyZWN0bHkgaWYgc3RhcnRhZGRyIGlzIGp1c3QgbGVzcworICAgICB0aGFuIFVJTlRfTUFYICh3ZWxsLCByZWFsbHkgQ09SRV9BRERSX01BWCBpZiB0aGVyZSB3YXMgc3VjaCBhCisgICAgIHRoaW5nKS4gIFRoYXQgaXMsIHNvbWV0aGluZyBsaWtlCisgICAgIGFycmF5X3JlYWRfYnl0ZXMgKENPUkVfQUREUl9NQVggLSA0LCBmb28sIDQpCisgICAgIHdvcmtzLS1pdCBuZXZlciBhZGRzIGxlbiBUbyBtZW1hZGRyIGFuZCBnZXRzIDAuICAqLworICAvKiBIb3dldmVyLCBzb21ldGhpbmcgbGlrZQorICAgICBhcnJheV9yZWFkX2J5dGVzIChDT1JFX0FERFJfTUFYIC0gMywgZm9vLCA0KQorICAgICBkb2Vzbid0IG5lZWQgdG8gd29yay4gIERldGVjdCBpdCBhbmQgZ2l2ZSB1cCBpZiB0aGVyZSdzIGFuIGF0dGVtcHQKKyAgICAgdG8gZG8gdGhhdC4gICovCisgIGlmICgoKG1lbWFkZHIgLSAxKSArIGxlbikgPCBtZW1hZGRyKSB7CisgICAgZXJybm8gPSBFSU87CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIGZvciAoY291bnQgPSAwLCBzdGFydGFkZHIgPSBtZW1hZGRyOyBjb3VudCA8IGxlbjsgc3RhcnRhZGRyICs9IGxlbl90aGlzX3Bhc3MpCisgICAgeworICAgICAgLyogVHJ5IHRvIGFsaWduIHRvIDE2IGJ5dGUgYm91bmRyeSAod2h5PykgKi8KKyAgICAgIGxlbl90aGlzX3Bhc3MgPSAxNjsKKyAgICAgIGlmICgoc3RhcnRhZGRyICUgMTYpICE9IDApCisJeworCSAgbGVuX3RoaXNfcGFzcyAtPSBzdGFydGFkZHIgJSAxNjsKKwl9CisgICAgICAvKiBPbmx5IHRyYW5zZmVyIGJ5dGVzIHdlIG5lZWQgKi8KKyAgICAgIGlmIChsZW5fdGhpc19wYXNzID4gKGxlbiAtIGNvdW50KSkKKwl7CisJICBsZW5fdGhpc19wYXNzID0gKGxlbiAtIGNvdW50KTsKKwl9CisgICAgICAvKiBGZXRjaCB0aGUgYnl0ZXMgKi8KKyAgICAgIGRlYnVnbG9ncyAoMywgInJlYWQgJWQgYnl0ZXMgZnJvbSBpbmZlcmlvciBhZGRyZXNzICV4IiwgbGVuX3RoaXNfcGFzcywKKwkJIHN0YXJ0YWRkcik7CisgICAgICBzcHJpbnRmIChidWYsICJtJTA4eCwlMDR4Iiwgc3RhcnRhZGRyLCBsZW5fdGhpc19wYXNzKTsKKyAgICAgIG1ha2VfZ2RiX3BhY2tldCAocGFja2V0LCBidWYpOworICAgICAgaWYgKGFycmF5X3NlbmRfcGFja2V0IChwYWNrZXQpID09IDApCisJeworCSAgZXJyb3IgKCJDb3VsZG4ndCB0cmFuc21pdCBwYWNrZXRcbiIpOworCX0KKyAgICAgIGlmIChhcnJheV9nZXRfcGFja2V0IChwYWNrZXQpID09IDApCisJeworCSAgZXJyb3IgKCJDb3VsZG4ndCByZWNlaXZlIHBhY2tldFxuIik7ICAKKwl9CisgICAgICBpZiAoKnBhY2tldCA9PSAwKQorCXsKKwkgIGVycm9yICgiR290IG5vIGRhdGEgaW4gdGhlIEdEQiBwYWNrZXRcbiIpOworCX0KKyAgICAgIC8qIFBpY2sgcGFja2V0IGFwYXJ0IGFuZCB4ZmVyIGJ5dGVzIHRvIG15YWRkciAqLworICAgICAgZGVidWdsb2dzICg0LCAiYXJyYXlfcmVhZF9pbmZlcmlvcl9tZW1vcnk6IEdvdCBhIFwiJXNcIiBiYWNrXG4iLCBwYWNrZXQpOworICAgICAgZm9yIChqID0gMDsgaiA8IGxlbl90aGlzX3Bhc3MgOyBqKyspCisJeworCSAgLyogZXh0cmFjdCB0aGUgYnl0ZSB2YWx1ZXMgKi8KKwkgIG15YWRkcltjb3VudCsrXSA9IGZyb21faGV4ICgqKHBhY2tldCsoaioyKSkpICogMTYgKyBmcm9tX2hleCAoKihwYWNrZXQrKGoqMikrMSkpOworCSAgZGVidWdsb2dzICg1LCAibXlhZGRyWyVkXSBzZXQgdG8gJXhcbiIsIGNvdW50LTEsIG15YWRkcltjb3VudC0xXSk7CisJfQorICAgIH0KKyAgcmV0dXJuIChjb3VudCk7Cit9CisKKy8qIEZJWE1FLXNvbWVkYXkhICBtZXJnZSB0aGVzZSB0d28uICAqLworc3RhdGljIGludAorYXJyYXlfeGZlcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuLCB3cml0ZSwgdGFyZ2V0KQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworICAgICBpbnQgd3JpdGU7CisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQ7CQkvKiBpZ25vcmVkICovCit7CisgIGlmICh3cml0ZSkKKyAgICByZXR1cm4gYXJyYXlfd3JpdGVfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbik7CisgIGVsc2UKKyAgICByZXR1cm4gYXJyYXlfcmVhZF9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKTsKK30KKworc3RhdGljIHZvaWQKK2FycmF5X2tpbGwgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHJldHVybjsJCS8qIGlnbm9yZSBhdHRlbXB0cyB0byBraWxsIHRhcmdldCBzeXN0ZW0gKi8KK30KKworLyogQ2xlYW4gdXAgd2hlbiBhIHByb2dyYW0gZXhpdHMuCisgICBUaGUgcHJvZ3JhbSBhY3R1YWxseSBsaXZlcyBvbiBpbiB0aGUgcmVtb3RlIHByb2Nlc3NvcidzIFJBTSwgYW5kIG1heSBiZQorICAgcnVuIGFnYWluIHdpdGhvdXQgYSBkb3dubG9hZC4gIERvbid0IGxlYXZlIGl0IGZ1bGwgb2YgYnJlYWtwb2ludAorICAgaW5zdHJ1Y3Rpb25zLiAgKi8KKworc3RhdGljIHZvaWQKK2FycmF5X21vdXJuX2luZmVyaW9yICgpCit7CisgIHJlbW92ZV9icmVha3BvaW50cyAoKTsKKyAgZ2VuZXJpY19tb3Vybl9pbmZlcmlvciAoKTsJLyogRG8gYWxsIHRoZSBwcm9wZXIgdGhpbmdzIG5vdyAqLworfQorCisjZGVmaW5lIE1BWF9BUlJBWV9CUkVBS1BPSU5UUyAxNgorCitzdGF0aWMgQ09SRV9BRERSIGJyZWFrYWRkcltNQVhfQVJSQVlfQlJFQUtQT0lOVFNdID0gezB9OworCisvKgorICogYXJyYXlfaW5zZXJ0X2JyZWFrcG9pbnQgLS0gYWRkIGEgYnJlYWtwb2ludAorICovCitzdGF0aWMgaW50CithcnJheV9pbnNlcnRfYnJlYWtwb2ludCAoYWRkciwgc2hhZG93KQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqc2hhZG93OworeworICBpbnQgaTsKKyAgaW50IGJwX3NpemUgPSAwOworICBDT1JFX0FERFIgYnBfYWRkciA9IGFkZHI7CisKKyAgZGVidWdsb2dzICgxLCAiYXJyYXlfaW5zZXJ0X2JyZWFrcG9pbnQoKSBhZGRyID0gMHgleCIsIGFkZHIpOworICBCUkVBS1BPSU5UX0ZST01fUEMgKCZicF9hZGRyLCAmYnBfc2l6ZSk7CisKKyAgZm9yIChpID0gMDsgaSA8PSBNQVhfQVJSQVlfQlJFQUtQT0lOVFM7IGkrKykgeworICAgIGlmIChicmVha2FkZHJbaV0gPT0gMCkgeworICAgICAgYnJlYWthZGRyW2ldID0gYWRkcjsKKyAgICAgIGlmIChzcl9nZXRfZGVidWcoKSA+IDQpCisJcHJpbnRmICgiQnJlYWtwb2ludCBhdCAleFxuIiwgYWRkcik7CisgICAgICBhcnJheV9yZWFkX2luZmVyaW9yX21lbW9yeSAoYnBfYWRkciwgc2hhZG93LCBicF9zaXplKTsKKyAgICAgIHByaW50Zl9tb25pdG9yKCJiIDB4JXhcbiIsIGFkZHIpOworICAgICAgZXhwZWN0X3Byb21wdCgxKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgYnJlYWtwb2ludHMgKD4gMTYpIGZvciBtb25pdG9yXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBfcmVtb3ZlX2JyZWFrcG9pbnQgLS0gVGVsbCB0aGUgbW9uaXRvciB0byByZW1vdmUgYSBicmVha3BvaW50CisgKi8KK3N0YXRpYyBpbnQKK2FycmF5X3JlbW92ZV9icmVha3BvaW50IChhZGRyLCBzaGFkb3cpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpzaGFkb3c7Cit7CisgIGludCBpOworCisgIGRlYnVnbG9ncyAoMSwgImFycmF5X3JlbW92ZV9icmVha3BvaW50KCkgYWRkciA9IDB4JXgiLCBhZGRyKTsKKworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0FSUkFZX0JSRUFLUE9JTlRTOyBpKyspIHsKKyAgICBpZiAoYnJlYWthZGRyW2ldID09IGFkZHIpIHsKKyAgICAgIGJyZWFrYWRkcltpXSA9IDA7CisgICAgICAvKiBzb21lIG1vbml0b3JzIHJlbW92ZSBicmVha3BvaW50cyBiYXNlZCBvbiB0aGUgYWRkcmVzcyAqLworICAgICAgcHJpbnRmX21vbml0b3IoImJkICV4XG4iLCBpKTsKKyAgICAgIGV4cGVjdF9wcm9tcHQoMSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBmaW5kIGJyZWFrcG9pbnQgYXNzb2NpYXRlZCB3aXRoIDB4JXhcbiIsIGFkZHIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK2FycmF5X3N0b3AgKCkKK3sKKyAgZGVidWdsb2dzICgxLCAiYXJyYXlfc3RvcCgpIik7CisgIHByaW50Zl9tb25pdG9yKCJcMDAzIik7CisgZXhwZWN0X3Byb21wdCgxKTsKK30KKworLyogCisgKiBhcnJheV9jb21tYW5kIC0tIHB1dCBhIGNvbW1hbmQgc3RyaW5nLCBpbiBhcmdzLCBvdXQgdG8gTU9OSVRPUi4KKyAqCU91dHB1dCBmcm9tIE1PTklUT1IgaXMgcGxhY2VkIG9uIHRoZSB1c2VycyB0ZXJtaW5hbCB1bnRpbCB0aGUKKyAqCWV4cGVjdF9wcm9tcHQgaXMgc2Vlbi4gRklYTUUKKyAqLworc3RhdGljIHZvaWQKK21vbml0b3JfY29tbWFuZCAoYXJncywgZnJvbXR0eSkKKyAgICAgY2hhcgkqYXJnczsKKyAgICAgaW50CWZyb210dHk7Cit7CisgIGRlYnVnbG9ncyAoMSwgIm1vbml0b3JfY29tbWFuZCAoYXJncz0lcykiLCBhcmdzKTsKKworICBpZiAoYXJyYXlfZGVzYyA9PSBOVUxMKQorICAgIGVycm9yKCJtb25pdG9yIHRhcmdldCBub3Qgb3Blbi4iKTsKKworICBpZiAoIWFyZ3MpCisgICAgZXJyb3IoIk1pc3NpbmcgY29tbWFuZC4iKTsKKwkKKyAgcHJpbnRmX21vbml0b3IgKCIlc1xuIiwgYXJncyk7CisgIGV4cGVjdF9wcm9tcHQoMCk7Cit9CisKKy8qCisgKiBtYWtlX2dkYl9wYWNrZXQgLS0gbWFrZSBhIEdEQiBwYWNrZXQuIFRoZSBkYXRhIGlzIGFsd2F5cyBBU0NJSS4KKyAqCSBBIGRlYnVnIHBhY2tldCB3aG9zZSBjb250ZW50cyBhcmUgPGRhdGE+CisgKgkgaXMgZW5jYXBzdWxhdGVkIGZvciB0cmFuc21pc3Npb24gaW4gdGhlIGZvcm06CisgKgorICoJCSQgPGRhdGE+ICMgQ1NVTTEgQ1NVTTIKKyAqCisgKiAgICAgICA8ZGF0YT4gbXVzdCBiZSBBU0NJSSBhbHBoYW51bWVyaWMgYW5kIGNhbm5vdCBpbmNsdWRlIGNoYXJhY3RlcnMKKyAqICAgICAgICckJyBvciAnIycuICBJZiA8ZGF0YT4gc3RhcnRzIHdpdGggdHdvIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnkKKyAqICAgICAgICc6JywgdGhlbiB0aGUgZXhpc3Rpbmcgc3R1YnMgaW50ZXJwcmV0IHRoaXMgYXMgYSBzZXF1ZW5jZSBudW1iZXIuCisgKgorICogICAgICAgQ1NVTTEgYW5kIENTVU0yIGFyZSBhc2NpaSBoZXggcmVwcmVzZW50YXRpb24gb2YgYW4gOC1iaXQgCisgKiAgICAgICBjaGVja3N1bSBvZiA8ZGF0YT4sIHRoZSBtb3N0IHNpZ25pZmljYW50IG5pYmJsZSBpcyBzZW50IGZpcnN0LgorICogICAgICAgdGhlIGhleCBkaWdpdHMgMC05LGEtZiBhcmUgdXNlZC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkCittYWtlX2dkYl9wYWNrZXQgKGJ1ZiwgZGF0YSkKKyAgICAgY2hhciAqYnVmLCAqZGF0YTsKK3sKKyAgaW50IGk7CisgIHVuc2lnbmVkIGNoYXIgY3N1bSA9IDA7CisgIGludCBjbnQ7CisgIGNoYXIgKnA7CisKKyAgZGVidWdsb2dzICgzLCAibWFrZV9nZGJfcGFja2V0KCVzKVxuIiwgZGF0YSk7CisgIGNudCAgPSBzdHJsZW4gKGRhdGEpOworICBpZiAoY250ID4gUEJVRlNJWikKKyAgICBlcnJvciAoIm1ha2VfZ2RiX3BhY2tldCgpOiB0byBtdWNoIGRhdGFcbiIpOworCisgIC8qIHN0YXJ0IHdpdGggdGhlIHBhY2tldCBoZWFkZXIgKi8KKyAgcCA9IGJ1ZjsKKyAgKnArKyA9ICckJzsKKworICAvKiBjYWxjdWxhdGUgdGhlIGNoZWNrc3VtICovCisgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworICAgIGNzdW0gKz0gZGF0YVtpXTsKKyAgICAqcCsrID0gZGF0YVtpXTsKKyAgfQorCisgIC8qIHRlcm1pbmF0ZSB0aGUgZGF0YSB3aXRoIGEgJyMnICovCisgICpwKysgPSAnIyc7CisgIAorICAvKiBhZGQgdGhlIGNoZWNrc3VtIGFzIHR3byBhc2NpaSBkaWdpdHMgKi8KKyAgKnArKyA9IHRvaGV4ICgoY3N1bSA+PiA0KSAmIDB4Zik7CisgICpwKysgPSB0b2hleCAoY3N1bSAmIDB4Zik7CisgICpwICA9IDB4MDsJCQkvKiBOdWxsIHRlcm1pbmF0b3Igb24gc3RyaW5nICovCit9CisKKy8qCisgKiBhcnJheV9zZW5kX3BhY2tldCAtLSBzZW5kIGEgR0RCIHBhY2tldCB0byB0aGUgdGFyZ2V0IHdpdGggZXJyb3IgaGFuZGxpbmcuIFdlCisgKgkJZ2V0IGEgJysnIChBQ0spIGJhY2sgaWYgdGhlIHBhY2tldCBpcyByZWNlaXZlZCBhbmQgdGhlIGNoZWNrc3VtCisgKgkJbWF0Y2hlcy4gT3RoZXJ3aXNlIGEgJy0nIChOQUspIGlzIHJldHVybmVkLiBJdCByZXR1cm5zIGEgMSBmb3IgYQorICoJCXN1Y2Nlc3NmdWwgdHJhbnNtaXRpb24sIG9yIGEgMCBmb3IgYSBmYWlsdXJlLgorICovCitzdGF0aWMgaW50CithcnJheV9zZW5kX3BhY2tldCAocGFja2V0KQorICAgICBjaGFyICpwYWNrZXQ7Cit7CisgIGludCBjLCByZXRyaWVzLCBpOworICBjaGFyIGp1bmtbUEJVRlNJWl07CisKKyAgcmV0cmllcyA9IDA7CisKKyNpZiAwCisgIC8qIHNjYW4gdGhlIHBhY2tldCB0byBtYWtlIHN1cmUgaXQgb25seSBjb250YWlucyB2YWxpZCBjaGFyYWN0ZXJzLgorICAgICB0aGlzIG1heSBzb3VuZCBzaWxseSwgYnV0IHNvbWV0aW1lcyBhIGdhcmJsZWQgcGFja2V0IHdpbGwgaGFuZworICAgICB0aGUgdGFyZ2V0IGJvYXJkLiBXZSBzY2FuIHRoZSB3aG9sZSB0aGluZywgdGhlbiBwcmludCB0aGUgZXJyb3IKKyAgICAgbWVzc2FnZS4KKyAgICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHN0cmxlbihwYWNrZXQpOyBpKyspIHsKKyAgICBkZWJ1Z2xvZ3MgKDUsICJhcnJheV9zZW5kX3BhY2tldCgpOiBTY2FubmluZyBcJyVjXCdcbiIsIHBhY2tldFtpXSk7CisgICAgLyogbGVnaXQgaGV4IG51bWJlcnMgb3IgY29tbWFuZCAqLworICAgIGlmICgoaXN4ZGlnaXQocGFja2V0W2ldKSkgfHwgKGlzYWxwaGEocGFja2V0W2ldKSkpCisgICAgICBjb250aW51ZTsKKyAgICBzd2l0Y2ggKHBhY2tldFtpXSkgeworICAgIGNhc2UgJysnOgkJCS8qIEFDSyAqLworICAgIGNhc2UgJy0nOgkJCS8qIE5BSyAqLworICAgIGNhc2UgJyMnOgkJCS8qIGVuZCBvZiBwYWNrZXQgKi8KKyAgICBjYXNlICckJzoJCQkvKiBzdGFydCBvZiBwYWNrZXQgKi8KKyAgICAgIGNvbnRpbnVlOworICAgIGRlZmF1bHQ6CQkJLyogYm9ndXMgY2hhcmFjdGVyICovCisgICAgICByZXRyaWVzKys7CisgICAgICBkZWJ1Z2xvZ3MgKDQsICJhcnJheV9zZW5kX3BhY2tldCgpOiBGb3VuZCBhIG5vbi1hc2NpaSBkaWdpdCBcJyVjXCcgaW4gdGhlIHBhY2tldC5cbiIsIHBhY2tldFtpXSk7CisgICAgfQorICB9CisjZW5kaWYgIAorCisgIGlmIChyZXRyaWVzID4gMCkKKyAgICBlcnJvciAoIkNhbid0IHNlbmQgcGFja2V0LCBmb3VuZCAlZCBub24tYXNjaWkgY2hhcmFjdGVycyIsIHJldHJpZXMpOworCisgIC8qIG9rLCB0cnkgdG8gc2VuZCB0aGUgcGFja2V0ICovCisgIHJldHJpZXMgPSAwOworICB3aGlsZSAocmV0cmllcysrIDw9IDEwKSB7CisgICAgcHJpbnRmX21vbml0b3IgKCIlcyIsIHBhY2tldCk7CisgICAgCisgICAgLyogcmVhZCB1bnRpbCBlaXRoZXIgYSB0aW1lb3V0IG9jY3VycyAoLTIpIG9yICcrJyBpcyByZWFkICovCisgICAgd2hpbGUgKHJldHJpZXMgPD0gMTApIHsKKyAgICAgIGMgPSByZWFkY2hhciAoLXRpbWVvdXQpOworICAgICAgZGVidWdsb2dzICgzLCAiUmVhZGluZyBhIEdEQiBwcm90b2NvbCBwYWNrZXQuLi4gR290IGEgJyVjJ1xuIiwgYyk7CisgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgJysnOgorCWRlYnVnbG9ncyAoMywgIkdvdCBBY2tcbiIpOworCXJldHVybiAxOworICAgICAgY2FzZSBTRVJJQUxfVElNRU9VVDoKKwlkZWJ1Z2xvZ3MgKDMsICJUaW1lZCBvdXQgcmVhZGluZyBzZXJpYWwgcG9ydFxuIik7CisJcHJpbnRmX21vbml0b3IoIkAiKTsJCS8qIHJlc3luYyB3aXRoIHRoZSBtb25pdG9yICovCisgICAgICAgZXhwZWN0X3Byb21wdCgxKTsJCS8qIFNlZSBpZiB3ZSBnZXQgYSBleHBlY3RfcHJvbXB0ICovICAgCisJYnJlYWs7ICAgICAgICAgICAgLyogUmV0cmFuc21pdCBidWZmZXIgKi8KKyAgICAgIGNhc2UgJy0nOgorCWRlYnVnbG9ncyAoMywgIkdvdCBOQUtcbiIpOworCXByaW50Zl9tb25pdG9yKCJAIik7CQkvKiByZXN5bmMgd2l0aCB0aGUgbW9uaXRvciAqLworICAgICAgIGV4cGVjdF9wcm9tcHQoMSk7CQkvKiBTZWUgaWYgd2UgZ2V0IGEgZXhwZWN0X3Byb21wdCAqLyAgIAorCWJyZWFrOworICAgICAgY2FzZSAnJCc6CisJLyogaXQncyBwcm9iYWJseSBhbiBvbGQgcmVzcG9uc2UsIG9yIHRoZSBlY2hvIG9mIG91ciBjb21tYW5kLgorCSAqIGp1c3QgZ29iYmxlIHVwIHRoZSBwYWNrZXQgYW5kIGlnbm9yZSBpdC4KKwkgKi8KKwlkZWJ1Z2xvZ3MgKDMsICJHb3QgYSBqdW5rIHBhY2tldFxuIik7CisJaSA9IDA7CisJZG8geworCSAgYyA9IHJlYWRjaGFyICh0aW1lb3V0KTsKKwkgIGp1bmtbaSsrXSA9IGM7CisJfSB3aGlsZSAoYyAhPSAnIycpOworCWMgPSByZWFkY2hhciAodGltZW91dCk7CisJanVua1tpKytdID0gYzsKKwljID0gcmVhZGNoYXIgKHRpbWVvdXQpOworCWp1bmtbaSsrXSA9IGM7CisJanVua1tpKytdID0gJ1wwJzsKKwlkZWJ1Z2xvZ3MgKDMsICJSZWFkaW5nIGEganVuayBwYWNrZXQsIGdvdCBhIFwiJXNcIlxuIiwganVuayk7CisJY29udGludWU7ICAgICAgICAgICAgICAgLyogTm93LCBnbyBsb29rIGZvciBuZXh0IHBhY2tldCAqLworICAgICAgZGVmYXVsdDoKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHJldHJpZXMrKzsKKyAgICAgIGRlYnVnbG9ncyAoMywgIlJldHJhbnNtaXR0aW5nIHBhY2tldCBcIiVzXCJcbiIsIHBhY2tldCk7CisgICAgICBicmVhazsgICAgICAgICAgICAgICAgLyogSGVyZSB0byByZXRyYW5zbWl0ICovCisgICAgfQorICB9IC8qIG91dGVyIHdoaWxlICovCisgIHJldHVybiAwOworfQorCisvKgorICogYXJyYXlfZ2V0X3BhY2tldCAtLSBnZXQgYSBHREIgcGFja2V0IGZyb20gdGhlIHRhcmdldC4gQmFzaWNhbGx5IHdlIHJlYWQgdGlsbCB3ZQorICoJCXNlZSBhICcjJywgdGhlbiBjaGVjayB0aGUgY2hlY2tzdW0uIEl0IHJldHVybnMgYSAxIGlmIGl0J3MgZ290dGVuIGEKKyAqCQlwYWNrZXQsIG9yIGEgMCBpdCB0aGUgcGFja2V0IHdhc24ndCB0cmFuc21pdHRlZCBjb3JyZWN0bHkuCisgKi8KK3N0YXRpYyBpbnQKK2FycmF5X2dldF9wYWNrZXQgKHBhY2tldCkKKyAgICAgY2hhciAqcGFja2V0OworeworICBpbnQgYzsKKyAgaW50IHJldHJpZXM7CisgIHVuc2lnbmVkIGNoYXIgY3N1bTsKKyAgdW5zaWduZWQgY2hhciBwa3Rjc3VtOworICBjaGFyICpicDsKKworICBjc3VtID0gMDsKKyAgYnAgPSBwYWNrZXQ7CisKKyAgbWVtc2V0IChwYWNrZXQsIDEsIFBCVUZTSVopOworICByZXRyaWVzID0gMDsKKyAgd2hpbGUgKHJldHJpZXMgPD0gMTApIHsKKyAgICBkbyB7CisgICAgICBjID0gcmVhZGNoYXIgKHRpbWVvdXQpOworICAgICAgaWYgKGMgPT0gU0VSSUFMX1RJTUVPVVQpIHsKKwlkZWJ1Z2xvZ3MgKDMsICJhcnJheV9nZXRfcGFja2V0OiBnb3QgdGltZSBvdXQgZnJvbSBzZXJpYWwgcG9ydC5cbiIpOworICAgICAgfQorICAgICAgZGVidWdsb2dzICgzLCAiV2FpdGluZyBmb3IgYSAnJCcsIGdvdCBhICVjXG4iLCBjKTsKKyAgICB9IHdoaWxlIChjICE9ICckJyk7CisgICAgCisgICAgcmV0cmllcyA9IDA7CisgICAgd2hpbGUgKHJldHJpZXMgPD0gMTApIHsKKyAgICAgIGMgPSByZWFkY2hhciAodGltZW91dCk7CisgICAgICBkZWJ1Z2xvZ3MgKDMsICJhcnJheV9nZXRfcGFja2V0OiBnb3QgYSAnJWMnXG4iLCBjKTsKKyAgICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSBTRVJJQUxfVElNRU9VVDoKKwlkZWJ1Z2xvZ3MgKDMsICJUaW1lb3V0IGluIG1pZC1wYWNrZXQsIHJldHJ5aW5nXG4iKTsKKwlyZXR1cm4gMDsKKyAgICAgIGNhc2UgJyQnOgorCWRlYnVnbG9ncyAoMywgIlNhdyBuZXcgcGFja2V0IHN0YXJ0IGluIG1pZGRsZSBvZiBvbGQgb25lXG4iKTsKKwlyZXR1cm4gMDsgICAgICAgICAgICAgLyogU3RhcnQgYSBuZXcgcGFja2V0LCBjb3VudCByZXRyaWVzICovCisgICAgICBjYXNlICcjJzoJCisJKmJwID0gJ1wwJzsKKwlwa3Rjc3VtID0gZnJvbV9oZXggKHJlYWRjaGFyICh0aW1lb3V0KSkgPDwgNDsKKwlwa3Rjc3VtIHw9IGZyb21faGV4IChyZWFkY2hhciAodGltZW91dCkpOworCWlmIChjc3VtID09IDApCisJICBkZWJ1Z2xvZ3MgKDMsICJcbkdEQiBwYWNrZXQgY2hlY2tzdW0gemVybywgbXVzdCBiZSBhIGJvZ3VzIHBhY2tldFxuIik7CisJaWYgKGNzdW0gPT0gcGt0Y3N1bSkgeworCSAgZGVidWdsb2dzICgzLCAiXG5HREIgcGFja2V0IGNoZWNrc3VtIGNvcnJlY3QsIHBhY2tldCBkYXRhIGlzIFwiJXNcIixcbiIsIHBhY2tldCk7CisJICBwcmludGZfbW9uaXRvciAoIkAiKTsKKwkgZXhwZWN0X3Byb21wdCAoMSk7CisJICByZXR1cm4gMTsKKwl9CisJZGVidWdsb2dzICgzLCAiQmFkIGNoZWNrc3VtLCBzZW50c3VtPTB4JXgsIGNzdW09MHgleFxuIiwgcGt0Y3N1bSwgY3N1bSk7CisJcmV0dXJuIDA7CisgICAgICBjYXNlICcqJzogICAgICAgICAgICAgICAvKiBSdW4gbGVuZ3RoIGVuY29kaW5nICovCisJZGVidWdsb2dzICg1LCAiUnVuIGxlbmd0aCBlbmNvZGluZyBpbiBwYWNrZXRcbiIpOworCWNzdW0gKz0gYzsKKwljID0gcmVhZGNoYXIgKHRpbWVvdXQpOworCWNzdW0gKz0gYzsKKwljID0gYyAtICcgJyArIDM7ICAgICAgLyogQ29tcHV0ZSByZXBlYXQgY291bnQgKi8KKwkKKwlpZiAoYyA+IDAgJiYgYyA8IDI1NSAmJiBicCArIGMgLSAxIDwgcGFja2V0ICsgUEJVRlNJWiAtIDEpIHsKKwkgIG1lbXNldCAoYnAsICooYnAgLSAxKSwgYyk7CisJICBicCArPSBjOworCSAgY29udGludWU7CisJfQorCSpicCA9ICdcMCc7CisJcHJpbnRmX2ZpbHRlcmVkICgiUmVwZWF0IGNvdW50ICVkIHRvbyBsYXJnZSBmb3IgYnVmZmVyLlxuIiwgYyk7CisJcmV0dXJuIDA7CisJCisgICAgICBkZWZhdWx0OgorCWlmICgoIWlzeGRpZ2l0KGMpKSAmJiAoIWlzcHVuY3QoYykpKQorCSAgZGVidWdsb2dzICg0LCAiR290IGEgbm9uLWFzY2lpIGRpZ2l0IFwnJWNcJy5cXG4iLCBjKTsKKwlpZiAoYnAgPCBwYWNrZXQgKyBQQlVGU0laIC0gMSkgeworCSAgKmJwKysgPSBjOworCSAgY3N1bSArPSBjOworCSAgY29udGludWU7CisJfQorCQorCSpicCA9ICdcMCc7CisJcHV0c19maWx0ZXJlZCAoIlJlbW90ZSBwYWNrZXQgdG9vIGxvbmcuXG4iKTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7IC8qIGV4Y2VlZGVkIHJldHJpZXMgKi8KK30KKworLyoKKyAqIGFzY2lpMmhleHdvcmQgLS0gY29udmVydCBhbiBhc2NpaSBudW1iZXIgcmVwcmVzZW50ZWQgYnkgOCBkaWdpdHMgdG8gYSBoZXggdmFsdWUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nCithc2NpaTJoZXh3b3JkIChtZW0pCisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbTsKK3sKKyAgdW5zaWduZWQgbG9uZyB2YWw7CisgIGludCBpOworICBjaGFyIGJ1Zls5XTsKKworICB2YWwgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgdmFsIDw8PSA0OworICAgIGlmIChtZW1baV0gPj0gJ0EnICYmIG1lbVtpXSA8PSAnRicpCisgICAgICB2YWwgPSB2YWwgKyBtZW1baV0gLSAnQScgKyAxMDsgICAgICAKKyAgICBpZiAobWVtW2ldID49ICdhJyAmJiBtZW1baV0gPD0gJ2YnKQorICAgICAgdmFsID0gdmFsICsgbWVtW2ldIC0gJ2EnICsgMTA7CisgICAgaWYgKG1lbVtpXSA+PSAnMCcgJiYgbWVtW2ldIDw9ICc5JykKKyAgICAgIHZhbCA9IHZhbCArIG1lbVtpXSAtICcwJzsKKyAgICBidWZbaV0gPSBtZW1baV07CisgIH0KKyAgYnVmWzhdID0gJ1wwJzsKKyAgZGVidWdsb2dzICg0LCAiYXNjaWkyaGV4d29yZCgpIGdvdCBhIDB4JXggZnJvbSAlcygleCkuXG4iLCB2YWwsIGJ1ZiwgbWVtKTsKKyAgcmV0dXJuIHZhbDsKK30KKworLyoKKyAqIGFzY2lpMmhleHdvcmQgLS0gY29udmVydCBhIGhleCB2YWx1ZSB0byBhbiBhc2NpaSBudW1iZXIgcmVwcmVzZW50ZWQgYnkgOAorICoJZGlnaXRzLgorICovCitzdGF0aWMgdm9pZAoraGV4d29yZDJhc2NpaSAobWVtLCBudW0pCisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbTsKKyAgICAgdW5zaWduZWQgbG9uZyBudW07Cit7CisgIGludCBpOworICB1bnNpZ25lZCBjaGFyIGNoOworICAKKyAgZGVidWdsb2dzICg0LCAiaGV4d29yZDJhc2NpaSgpIGNvbnZlcnRpbmcgJXggIiwgbnVtKTsKKyAgZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pIHsgICAgCisgICAgbWVtW2ldID0gdG9oZXggKChudW0gPj4gNCkgJiAweGYpOworICAgIG1lbVtpXSA9IHRvaGV4IChudW0gJiAweGYpOworICAgIG51bSA9IG51bSA+PiA0OworICB9CisgIG1lbVs4XSA9ICdcMCc7CisgIGRlYnVnbG9ncyAoNCwgIlx0dG8gYSAlcyIsIG1lbSk7Cit9CisKKy8qIENvbnZlcnQgaGV4IGRpZ2l0IEEgdG8gYSBudW1iZXIuICAqLworc3RhdGljIGludAorZnJvbV9oZXggKGEpCisgICAgIGludCBhOworeyAgCisgIGlmIChhID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgZGVidWdsb2dzICg0LCAiZnJvbV9oZXggZ290IGEgMHgleCglYylcbiIsYSxhKTsKKyAgaWYgKGEgPj0gJzAnICYmIGEgPD0gJzknKQorICAgIHJldHVybiBhIC0gJzAnOworICBpZiAoYSA+PSAnYScgJiYgYSA8PSAnZicpCisgICAgcmV0dXJuIGEgLSAnYScgKyAxMDsKKyAgaWYgKGEgPj0gJ0EnICYmIGEgPD0gJ0YnKQorICAgIHJldHVybiBhIC0gJ0EnICsgMTA7CisgIGVsc2UgeworICAgIGVycm9yICgiUmVwbHkgY29udGFpbnMgaW52YWxpZCBoZXggZGlnaXQgMHgleCIsIGEpOworICB9Cit9CisKKy8qIENvbnZlcnQgbnVtYmVyIE5JQiB0byBhIGhleCBkaWdpdC4gICovCitzdGF0aWMgaW50Cit0b2hleCAobmliKQorICAgICBpbnQgbmliOworeworICBpZiAobmliIDwgMTApCisgICAgcmV0dXJuICcwJytuaWI7CisgIGVsc2UKKyAgICByZXR1cm4gJ2EnK25pYi0xMDsKK30KKworLyoKKyAqIF9pbml0aWFsaXplX3JlbW90ZV9tb25pdG9ycyAtLSBzZXR1cCBhIGZldyBhZGR0aXRpb25hbCBjb21tYW5kcyB0aGF0CisgKgkJYXJlIHVzdWFsbHkgb25seSB1c2VkIGJ5IG1vbml0b3JzLgorICovCit2b2lkCitfaW5pdGlhbGl6ZV9yZW1vdGVfbW9uaXRvcnMgKCkKK3sKKyAgLyogZ2VuZXJpYyBtb25pdG9yIGNvbW1hbmQgKi8KKyAgYWRkX2NvbSAoIm1vbml0b3IiLCBjbGFzc19vYnNjdXJlLCBtb25pdG9yX2NvbW1hbmQsCisJICAgIlNlbmQgYSBjb21tYW5kIHRvIHRoZSBkZWJ1ZyBtb25pdG9yLiIpOyAKKworfQorCisvKgorICogX2luaXRpYWxpemVfYXJyYXkgLS0gZG8gYW55IHNwZWNpYWwgaW5pdCBzdHVmZiBmb3IgdGhlIHRhcmdldC4KKyAqLwordm9pZAorX2luaXRpYWxpemVfYXJyYXkgKCkKK3sKKyAgaW5pdF9hcnJheV9vcHMoKSA7CisgIGFkZF90YXJnZXQgKCZhcnJheV9vcHMpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS1idWcuYyBiL2dkYi9yZW1vdGUtYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmZDcxMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZW1vdGUtYnVnLmMKQEAgLTAsMCArMSwxMDk5IEBACisvKiBSZW1vdGUgZGVidWdnaW5nIGludGVyZmFjZSBmb3IgTW90b3JvbGEncyBNVk1FMTg3QlVHIG1vbml0b3IsIGFuIGVtYmVkZGVkCisgICBtb25pdG9yIGZvciB0aGUgbTg4ay4KKworICAgQ29weXJpZ2h0IDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4gIFdyaXR0ZW4gYnkgSy4gUmljaGFyZCBQaXhsZXkuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgIndhaXQuaCIKKworI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgInRlcm1pbmFsLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorCisjaW5jbHVkZSAicmVtb3RlLXV0aWxzLmgiCisKKworZXh0ZXJuIGludCBzbGVlcCgpOworCisvKiBFeHRlcm5hbCBkYXRhIGRlY2xhcmF0aW9ucyAqLworZXh0ZXJuIGludCBzdG9wX3Nvb25fcXVpZXRseTsJLyogZm9yIHdhaXRfZm9yX2luZmVyaW9yICovCisKKy8qIEZvcndhcmQgZGF0YSBkZWNsYXJhdGlvbnMgKi8KK2V4dGVybiBzdHJ1Y3QgdGFyZ2V0X29wcyBidWdfb3BzOwkvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCisKKy8qIEZvcndhcmQgZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCitzdGF0aWMgaW50IGJ1Z19jbGVhcl9icmVha3BvaW50cyBQQVJBTVMoKHZvaWQpKTsKKworc3RhdGljIGludCBidWdfcmVhZF9tZW1vcnkgUEFSQU1TKChDT1JFX0FERFIgbWVtYWRkciwKKwkJCQkJICAgIHVuc2lnbmVkIGNoYXIgKm15YWRkciwKKwkJCQkJICAgIGludCBsZW4pKTsKKworc3RhdGljIGludCBidWdfd3JpdGVfbWVtb3J5IFBBUkFNUygoQ09SRV9BRERSIG1lbWFkZHIsCisJCQkJCSAgICAgdW5zaWduZWQgY2hhciAqbXlhZGRyLAorCQkJCQkgICAgIGludCBsZW4pKTsKKworLyogVGhpcyB2YXJpYWJsZSBpcyBzb21ld2hhdCBhcmJpdHJhcnkuICBJdCdzIGhlcmUgc28gdGhhdCBpdCBjYW4gYmUKKyAgIHNldCBmcm9tIHdpdGhpbiBhIHJ1bm5pbmcgZ2RiLiAgKi8KKworc3RhdGljIGludCBzcmVjX21heF9yZXRyaWVzID0gMzsKKworLyogRWFjaCBTLXJlY29yZCBkb3dubG9hZCB0byB0aGUgdGFyZ2V0IGNvbnNpc3RzIG9mIGFuIFMwIGhlYWRlcgorICAgcmVjb3JkLCBzb21lIG51bWJlciBvZiBTMyBkYXRhIHJlY29yZHMsIGFuZCBvbmUgUzcgdGVybWluYXRpb24KKyAgIHJlY29yZC4gIEkgY2FsbCB0aGlzIGRvd25sb2FkIGEgImZyYW1lIi4gIFNyZWNfZnJhbWUgc2F5cyBob3cgbWFueQorICAgYnl0ZXMgd2lsbCBiZSByZXByZXNlbnRlZCBpbiBlYWNoIGZyYW1lLiAgKi8KKworI2RlZmluZSBTUkVDX1NJWkUgMTYwCitzdGF0aWMgaW50IHNyZWNfZnJhbWUgPSBTUkVDX1NJWkU7CisKKy8qIFRoaXMgdmFyaWFibGUgZGV0ZXJtaW5lcyBob3cgbWFueSBieXRlcyB3aWxsIGJlIHJlcHJlc2VudGVkIGluIGVhY2gKKyAgIFMzIHMtcmVjb3JkLiAgKi8KKworc3RhdGljIGludCBzcmVjX2J5dGVzID0gNDA7CisKKy8qIEF0IG9uZSBwb2ludCBpdCBhcHBlYXJlZCB0byBtZSBhcyB0aG91Z2ggdGhlIGJ1ZyBtb25pdG9yIGNvdWxkIG5vdAorICAgcmVhbGx5IGJlIGV4cGVjdGVkIHRvIHJlY2VpdmUgdHdvIHNlcXVlbnRpYWwgY2hhcmFjdGVycyBhdCA5NjAwCisgICBiYXVkIHJlbGlhYmx5LiAgRWNoby1wYWNpbmcgaXMgYW4gYXR0ZW1wdCB0byBmb3JjZSBkYXRhIGFjcm9zcyB0aGUKKyAgIGxpbmUgZXZlbiBpbiB0aGlzIGNvbmRpdGlvbi4gIFNwZWNpZmljYWxseSwgaW4gZWNoby1wYWNlIG1vZGUsIGVhY2gKKyAgIGNoYXJhY3RlciBpcyBzZW50IG9uZSBhdCBhIHRpbWUgYW5kIHdlIGxvb2sgZm9yIHRoZSBlY2hvIGJlZm9yZQorICAgc2VuZGluZyB0aGUgbmV4dC4gIFRoaXMgaXMgZXhjcnVjaWF0aW5nbHkgc2xvdy4gICovCisKK3N0YXRpYyBpbnQgc3JlY19lY2hvX3BhY2UgPSAwOworCisvKiBIb3cgbG9uZyB0byB3YWl0IGFmdGVyIGFuIHNyZWMgZm9yIGEgcG9zc2libGUgZXJyb3IgbWVzc2FnZS4KKyAgIFNpbWlsYXIgdG8gdGhlIGFib3ZlLCBJIHRyaWVkIHNsZWVwaW5nIGFmdGVyIHNlbmRpbmcgZWFjaCBTMyByZWNvcmQKKyAgIGluIGhvcGVzIHRoYXQgSSBtaWdodCBhY3R1YWxseSBzZWUgZXJyb3IgbWVzc2FnZXMgZnJvbSB0aGUgYnVnCisgICBtb25pdG9yLiAgVGhpcyBtaWdodCBhY3R1YWxseSB3b3JrIGlmIHdlIHdlcmUgdG8gdXNlIHNsZWVwCisgICBpbnRlcnZhbHMgc21hbGxlciB0aGFuIDEgc2Vjb25kLiAgKi8KKworc3RhdGljIGludCBzcmVjX3NsZWVwID0gMDsKKworLyogRXZlcnkgc3JlY19ub2lzZSByZWNvcmRzLCBmbHViIHRoZSBjaGVja3N1bS4gIFRoaXMgaXMgYSBkZWJ1Z2dpbmcKKyAgIGZlYXR1cmUuICBTZXQgdGhlIHZhcmlhYmxlIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIDEgaW4gb3JkZXIgdG8KKyAgIGluamVjdCAqZGVsaWJlcmF0ZSogY2hlY2tzdW0gZXJyb3JzLiAgT25lIG1pZ2h0IGRvIHRoaXMgaWYgb25lCisgICB3YW50ZWQgdG8gdGVzdCBlcnJvciBoYW5kbGluZyBhbmQgcmVjb3ZlcnkuICAqLworCitzdGF0aWMgaW50IHNyZWNfbm9pc2UgPSAwOworCisvKiBDYWxsZWQgd2hlbiBTSUdBTFJNIHNpZ25hbCBzZW50IGR1ZSB0byBhbGFybSgpIHRpbWVvdXQuICAqLworCisvKiBOdW1iZXIgb2YgU0lHVFJBUHMgd2UgbmVlZCB0byBzaW11bGF0ZS4gIFRoYXQgaXMsIHRoZSBuZXh0CisgICBORUVEX0FSVElGSUNJQUxfVFJBUCBjYWxscyB0byBidWdfd2FpdCBzaG91bGQganVzdCByZXR1cm4KKyAgIFNJR1RSQVAgd2l0aG91dCBhY3R1YWxseSB3YWl0aW5nIGZvciBhbnl0aGluZy4gICovCisKK3N0YXRpYyBpbnQgbmVlZF9hcnRpZmljaWFsX3RyYXAgPSAwOworCisvKgorICogRG93bmxvYWQgYSBmaWxlIHNwZWNpZmllZCBpbiAnYXJncycsIHRvIHRoZSBidWcuCisgKi8KKworc3RhdGljIHZvaWQKK2J1Z19sb2FkIChhcmdzLCBmcm9tdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbXR0eTsKK3sKKyAgYmZkICphYmZkOworICBhc2VjdGlvbiAqczsKKyAgY2hhciBidWZmZXJbMTAyNF07CisKKyAgc3JfY2hlY2tfb3BlbiAoKTsKKworICBkY2FjaGVfZmx1c2ggKGdyX2dldF9kY2FjaGUoKSk7CisgIGluZmVyaW9yX3BpZCA9IDA7CisgIGFiZmQgPSBiZmRfb3BlbnIgKGFyZ3MsIDApOworICBpZiAoIWFiZmQpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiVW5hYmxlIHRvIG9wZW4gZmlsZSAlc1xuIiwgYXJncyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSA9PSAwKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkZpbGUgaXMgbm90IGFuIG9iamVjdCBmaWxlXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgcyA9IGFiZmQtPnNlY3Rpb25zOworICB3aGlsZSAocyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKKyAgICB7CisgICAgICBzcmVjX2ZyYW1lID0gU1JFQ19TSVpFOworICAgICAgaWYgKHMtPmZsYWdzICYgU0VDX0xPQUQpCisJeworCSAgaW50IGk7CisKKwkgIGNoYXIgKmJ1ZmZlciA9IHhtYWxsb2MgKHNyZWNfZnJhbWUpOworCisJICBwcmludGZfZmlsdGVyZWQgKCIlc1x0OiAweCU0eCAuLiAweCU0eCAgIiwgcy0+bmFtZSwgcy0+dm1hLCBzLT52bWEgKyBzLT5fcmF3X3NpemUpOworCSAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwkgIGZvciAoaSA9IDA7IGkgPCBzLT5fcmF3X3NpemU7IGkgKz0gc3JlY19mcmFtZSkKKwkgICAgeworCSAgICAgIGlmIChzcmVjX2ZyYW1lID4gcy0+X3Jhd19zaXplIC0gaSkKKwkJc3JlY19mcmFtZSA9IHMtPl9yYXdfc2l6ZSAtIGk7CisKKwkgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHMsIGJ1ZmZlciwgaSwgc3JlY19mcmFtZSk7CisJICAgICAgYnVnX3dyaXRlX21lbW9yeSAocy0+dm1hICsgaSwgYnVmZmVyLCBzcmVjX2ZyYW1lKTsKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCIqIik7CisJICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwkgICAgfQorCSAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKwkgIGZyZWUgKGJ1ZmZlcik7CisJfQorICAgICAgcyA9IHMtPm5leHQ7CisgICAgfQorICBzcHJpbnRmIChidWZmZXIsICJycyBpcCAlbHgiLCAodW5zaWduZWQgbG9uZykgYWJmZC0+c3RhcnRfYWRkcmVzcyk7CisgIHNyX3dyaXRlX2NyIChidWZmZXIpOworICBncl9leHBlY3RfcHJvbXB0ICgpOworfQorCisjaWYgMAorc3RhdGljIGNoYXIgKgorZ2V0X3dvcmQgKHApCisgICAgIGNoYXIgKipwOworeworICBjaGFyICpzID0gKnA7CisgIGNoYXIgKndvcmQ7CisgIGNoYXIgKmNvcHk7CisgIHNpemVfdCBsZW47CisKKyAgd2hpbGUgKGlzc3BhY2UgKCpzKSkKKyAgICBzKys7CisKKyAgd29yZCA9IHM7CisKKyAgbGVuID0gMDsKKworICB3aGlsZSAoKnMgJiYgIWlzc3BhY2UgKCpzKSkKKyAgICB7CisgICAgICBzKys7CisgICAgICBsZW4rKzsKKworICAgIH0KKyAgY29weSA9IHhtYWxsb2MgKGxlbiArIDEpOworICBtZW1jcHkgKGNvcHksIHdvcmQsIGxlbik7CisgIGNvcHlbbGVuXSA9IDA7CisgICpwID0gczsKKyAgcmV0dXJuIGNvcHk7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBncl9zZXR0aW5ncyBidWdfc2V0dGluZ3MgPSB7CisgIE5VTEwsCS8qIGRjYWNoZSAqLworICAiQnVnPiIsIC8qIHByb21wdCAqLworICAmYnVnX29wcywgLyogb3BzICovCisgIGJ1Z19jbGVhcl9icmVha3BvaW50cywgLyogY2xlYXJfYWxsX2JyZWFrcG9pbnRzICovCisgIGJ1Z19yZWFkX21lbW9yeSwgLyogcmVhZGZ1bmMgKi8KKyAgYnVnX3dyaXRlX21lbW9yeSwgLyogd3JpdGVmdW5jICovCisgIGdyX2dlbmVyaWNfY2hlY2tpbiwgLyogY2hlY2tpbiAqLworfTsKKworc3RhdGljIGNoYXIgKmNwdV9jaGVja19zdHJpbmdzW10gPSB7CisgICI9IiwKKyAgIkludmFsaWQgUmVnaXN0ZXIiLAorfTsKKworc3RhdGljIHZvaWQKK2J1Z19vcGVuIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgYXJncyA9ICIiOworCisgIGdyX29wZW4oYXJncywgZnJvbV90dHksICZidWdfc2V0dGluZ3MpOworICAvKiBkZWNpZGUgKm5vdyogd2hldGhlciB3ZSBhcmUgb24gYW4gODgxMDAgb3IgYW4gODgxMTAgKi8KKyAgc3Jfd3JpdGVfY3IoInJzIGNyMDYiKTsKKyAgc3JfZXhwZWN0KCJycyBjcjA2Iik7CisKKyAgc3dpdGNoIChncl9tdWx0aV9zY2FuKGNwdV9jaGVja19zdHJpbmdzLCAwKSkKKyAgICB7CisgICAgY2FzZSAwOiAvKiB0aGlzIGlzIGFuIG04ODEwMCAqLworICAgICAgdGFyZ2V0X2lzX204ODExMCA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6IC8qIHRoaXMgaXMgYW4gbTg4MTEwICovCisgICAgICB0YXJnZXRfaXNfbTg4MTEwID0gMTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCgpOworICAgIH0KK30KKworLyogVGVsbCB0aGUgcmVtb3RlIG1hY2hpbmUgdG8gcmVzdW1lLiAgKi8KKwordm9pZAorYnVnX3Jlc3VtZSAocGlkLCBzdGVwLCBzaWcpCisgICAgIGludCBwaWQsIHN0ZXA7CisgICAgIGVudW0gdGFyZ2V0X3NpZ25hbCBzaWc7Cit7CisgIGRjYWNoZV9mbHVzaCAoZ3JfZ2V0X2RjYWNoZSgpKTsKKworICBpZiAoc3RlcCkKKyAgICB7CisgICAgICBzcl93cml0ZV9jcigidCIpOworCisgICAgICAvKiBGb3JjZSB0aGUgbmV4dCBidWdfd2FpdCB0byByZXR1cm4gYSB0cmFwLiAgTm90IGRvaW5nIGFueXRoaW5nCisgICAgICAgYWJvdXQgSS9PIGZyb20gdGhlIHRhcmdldCBtZWFucyB0aGF0IHRoZSB1c2VyIGhhcyB0byB0eXBlCisgICAgICAgImNvbnRpbnVlIiB0byBzZWUgYW55LiAgRklYTUUsIHRoaXMgc2hvdWxkIGJlIGZpeGVkLiAgKi8KKyAgICAgIG5lZWRfYXJ0aWZpY2lhbF90cmFwID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICAgIHNyX3dyaXRlX2NyICgiZyIpOworCisgIHJldHVybjsKK30KKworLyogV2FpdCB1bnRpbCB0aGUgcmVtb3RlIG1hY2hpbmUgc3RvcHMsIHRoZW4gcmV0dXJuLAorICAgc3RvcmluZyBzdGF0dXMgaW4gU1RBVFVTIGp1c3QgYXMgYHdhaXQnIHdvdWxkLiAgKi8KKworc3RhdGljIGNoYXIgKndhaXRfc3RyaW5nc1tdID0geworICAiQXQgQnJlYWtwb2ludCIsCisgICJFeGNlcHRpb246IERhdGEgQWNjZXNzIEZhdWx0IChMb2NhbCBCdXMgVGltZW91dCkiLAorICAiXHI4Pz9cPy1CdWc+IiwJLyogVGhlICdcPycgYXZvaWRzIGNyZWF0aW5nIGEgdHJpZ3JhcGggKi8KKyAgIlxyMTk3LUJ1Zz4iLAorICBOVUxMLAorfTsKKworaW50CitidWdfd2FpdCAocGlkLCBzdGF0dXMpCisgICAgIGludCBwaWQ7CisgICAgIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqc3RhdHVzOworeworICBpbnQgb2xkX3RpbWVvdXQgPSBzcl9nZXRfdGltZW91dCgpOworICBpbnQgb2xkX2ltbWVkaWF0ZV9xdWl0ID0gaW1tZWRpYXRlX3F1aXQ7CisKKyAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0VYSVRFRDsKKyAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gMDsKKworICAvKiByZWFkIG9mZiBsZWZ0b3ZlcnMgZnJvbSByZXN1bWUgc28gdGhhdCB0aGUgcmVzdCBjYW4gYmUgcGFzc2VkCisgICAgIGJhY2sgb3V0IGFzIHN0ZG91dC4gICovCisgIGlmIChuZWVkX2FydGlmaWNpYWxfdHJhcCA9PSAwKQorICAgIHsKKyAgICAgIHNyX2V4cGVjdCgiRWZmZWN0aXZlIGFkZHJlc3M6ICIpOworICAgICAgKHZvaWQpIHNyX2dldF9oZXhfd29yZCgpOworICAgICAgc3JfZXhwZWN0ICgiXHJcbiIpOworICAgIH0KKworICBzcl9zZXRfdGltZW91dCgtMSk7IC8qIERvbid0IHRpbWUgb3V0IC0tIHVzZXIgcHJvZ3JhbSBpcyBydW5uaW5nLiAqLworICBpbW1lZGlhdGVfcXVpdCA9IDE7IC8qIEhlbHBzIGFiaWxpdHkgdG8gUVVJVCAqLworCisgIHN3aXRjaCAoZ3JfbXVsdGlfc2Nhbih3YWl0X3N0cmluZ3MsIG5lZWRfYXJ0aWZpY2lhbF90cmFwID09IDApKQorICAgIHsKKyAgICBjYXNlIDA6IC8qIGJyZWFrcG9pbnQgY2FzZSAqLworICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVFJBUDsKKyAgICAgIC8qIHVzZXIgb3V0cHV0IGZyb20gdGhlIHRhcmdldCBjYW4gYmUgZGlzY2FyZGVkIGhlcmUuICg/KSAqLworICAgICAgZ3JfZXhwZWN0X3Byb21wdCgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDE6IC8qIGJ1cyBlcnJvciAqLworICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfQlVTOworICAgICAgLyogdXNlciBvdXRwdXQgZnJvbSB0aGUgdGFyZ2V0IGNhbiBiZSBkaXNjYXJkZWQgaGVyZS4gKD8pICovCisgICAgICBncl9leHBlY3RfcHJvbXB0KCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMjogLyogbm9ybWFsIGNhc2UgKi8KKyAgICBjYXNlIDM6CisgICAgICBpZiAobmVlZF9hcnRpZmljaWFsX3RyYXAgIT0gMCkKKwl7CisJICAvKiBzdGVwcGluZyAqLworCSAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisJICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVFJBUDsKKwkgIG5lZWRfYXJ0aWZpY2lhbF90cmFwLS07CisJICBicmVhazsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogZXhpdCBjYXNlICovCisJICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVEOworCSAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gMDsKKwkgIGJyZWFrOworCX0KKworICAgIGNhc2UgLTE6IC8qIHRyb3VibGUgKi8KKyAgICBkZWZhdWx0OgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKwkJCSJUcm91YmxlIHJlYWRpbmcgdGFyZ2V0IGR1cmluZyB3YWl0XG4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBzcl9zZXRfdGltZW91dChvbGRfdGltZW91dCk7CisgIGltbWVkaWF0ZV9xdWl0ID0gb2xkX2ltbWVkaWF0ZV9xdWl0OworICByZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHRoZSBuYW1lIG9mIHJlZ2lzdGVyIG51bWJlciBSRUdOTworICAgaW4gdGhlIGZvcm0gaW5wdXQgYW5kIG91dHB1dCBieSBidWcuCisKKyAgIFJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RhdGljIGJ1ZmZlciBjb250YWluaW5nIHRoZSBhbnN3ZXIuICAqLworc3RhdGljIGNoYXIgKgorZ2V0X3JlZ19uYW1lIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBzdGF0aWMgY2hhciAqcm5bXSA9IHsKKyAgICAicjAwIiwgInIwMSIsICJyMDIiLCAicjAzIiwgInIwNCIsICJyMDUiLCAicjA2IiwgInIwNyIsCisgICAgInIwOCIsICJyMDkiLCAicjEwIiwgInIxMSIsICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUiLAorICAgICJyMTYiLCAicjE3IiwgInIxOCIsICJyMTkiLCAicjIwIiwgInIyMSIsICJyMjIiLCAicjIzIiwKKyAgICAicjI0IiwgInIyNSIsICJyMjYiLCAicjI3IiwgInIyOCIsICJyMjkiLCAicjMwIiwgInIzMSIsCisKKyAgICAvKiB0aGVzZSBnZXQgY29uZnVzaW5nIGJlY2F1c2Ugd2Ugb21pdCBhIGZldyBhbmQgc3dpdGNoIHNvbWUgb3JkZXJpbmcgYXJvdW5kLiAqLworCisgICAgImNyMDEiLCAgLyogMzIgPSBwc3IgKi8KKyAgICAiZmNyNjIiLCAvKiAzMyA9IGZwc3IqLworICAgICJmY3I2MyIsIC8qIDM0ID0gZnBjciAqLworICAgICJpcCIsCQkJLyogdGhpcyBpcyBzb21ldGhpbmcgb2YgYSBjaGVhdC4gKi8KKyAgLyogMzUgPSBzeGlwICovCisgICAgImNyMDUiLCAvKiAzNiA9IHNuaXAgKi8KKyAgICAiY3IwNiIsIC8qIDM3ID0gc2ZpcCAqLworCisgICAgIngwMCIsICJ4MDEiLCAieDAyIiwgIngwMyIsICJ4MDQiLCAieDA1IiwgIngwNiIsICJ4MDciLAorICAgICJ4MDgiLCAieDA5IiwgIngxMCIsICJ4MTEiLCAieDEyIiwgIngxMyIsICJ4MTQiLCAieDE1IiwKKyAgICAieDE2IiwgIngxNyIsICJ4MTgiLCAieDE5IiwgIngyMCIsICJ4MjEiLCAieDIyIiwgIngyMyIsCisgICAgIngyNCIsICJ4MjUiLCAieDI2IiwgIngyNyIsICJ4MjgiLCAieDI5IiwgIngzMCIsICJ4MzEiLAorICB9OworCisgIHJldHVybiBybltyZWdub107Cit9CisKKyNpZiAwIC8qIG5vdCBjdXJyZW50bHkgdXNlZCAqLworLyogUmVhZCBmcm9tIHJlbW90ZSB3aGlsZSB0aGUgaW5wdXQgbWF0Y2hlcyBTVFJJTkcuICBSZXR1cm4gemVybyBvbgorICAgc3VjY2VzcywgLTEgb24gZmFpbHVyZS4gICovCisKK3N0YXRpYyBpbnQKK2J1Z19zY2FuIChzKQorICAgICBjaGFyICpzOworeworICBpbnQgYzsKKworICB3aGlsZSAoKnMpCisgICAgeworICAgICAgYyA9IHNyX3JlYWRjaGFyKCk7CisgICAgICBpZiAoYyAhPSAqcysrKQorCXsKKwkgIGZmbHVzaChzdGRvdXQpOworCSAgcHJpbnRmKCJcbk5leHQgY2hhcmFjdGVyIGlzICclYycgLSAlZCBhbmQgcyBpcyBcIiVzXCIuXG4iLCBjLCBjLCAtLXMpOworCSAgcmV0dXJuKC0xKTsKKwl9CisgICAgfQorCisgIHJldHVybigwKTsKK30KKyNlbmRpZiAvKiBuZXZlciAqLworCitzdGF0aWMgaW50CitidWdfc3JlY193cml0ZV9jciAocykKKyAgICAgY2hhciAqczsKK3sKKyAgY2hhciAqcCA9IHM7CisKKyAgaWYgKHNyZWNfZWNob19wYWNlKQorICAgIGZvciAocCA9IHM7ICpwOyArK3ApCisgICAgICB7CisJaWYgKHNyX2dldF9kZWJ1ZygpID4gMCkKKwkgIHByaW50ZiAoIiVjIiwgKnApOworCisJZG8KKwkgIFNFUklBTF9XUklURShzcl9nZXRfZGVzYygpLCBwLCAxKTsKKwl3aGlsZSAoc3JfcG9sbGNoYXIoKSAhPSAqcCk7CisgICAgICB9CisgIGVsc2UKKyAgICB7ICAKKyAgICAgIHNyX3dyaXRlX2NyIChzKTsKKy8qICAgICAgIHJldHVybihidWdfc2NhbiAocykgfHwgYnVnX3NjYW4gKCJcbiIpKTsgKi8KKyAgICB9CisKKyAgcmV0dXJuKDApOworfQorCisvKiBTdG9yZSByZWdpc3RlciBSRUdOTywgb3IgYWxsIGlmIFJFR05PID09IC0xLiAqLworCitzdGF0aWMgdm9pZAorYnVnX2ZldGNoX3JlZ2lzdGVyKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHNyX2NoZWNrX29wZW4oKTsKKworICBpZiAocmVnbm8gPT0gLTEpCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUkVHUzsgKytpKQorCWJ1Z19mZXRjaF9yZWdpc3RlcihpKTsKKyAgICB9CisgIGVsc2UgaWYgKHRhcmdldF9pc19tODgxMTAgJiYgcmVnbm8gPT0gU0ZJUF9SRUdOVU0pCisgICAgeworICAgICAgLyogbTg4MTEwIGhhcyBubyBzZmlwLiAqLworICAgICAgbG9uZyBsID0gMDsKKyAgICAgIHN1cHBseV9yZWdpc3RlcihyZWdubywgKGNoYXIgKikgJmwpOworICAgIH0KKyAgZWxzZSBpZiAocmVnbm8gPCBYRlBfUkVHTlVNKQorICAgIHsKKyAgICAgIGNoYXIgYnVmZmVyW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisKKyAgICAgIHNyX3dyaXRlICgicnMgIiwgMyk7CisgICAgICBzcl93cml0ZV9jciAoZ2V0X3JlZ19uYW1lKHJlZ25vKSk7CisgICAgICBzcl9leHBlY3QgKCI9Iik7CisgICAgICBzdG9yZV91bnNpZ25lZF9pbnRlZ2VyIChidWZmZXIsIFJFR0lTVEVSX1JBV19TSVpFIChyZWdubyksCisJCQkgICAgICBzcl9nZXRfaGV4X3dvcmQoKSk7CisgICAgICBncl9leHBlY3RfcHJvbXB0ICgpOworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgYnVmZmVyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBGbG9hdCByZWdpc3RlciBzbyB3ZSBuZWVkIHRvIHBhcnNlIGEgc3RyYW5nZSBkYXRhIGZvcm1hdC4gKi8KKyAgICAgIGxvbmcgcDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgZnByZWdfYnVmWzEwXTsKKworICAgICAgc3Jfd3JpdGUoInJzICIsIDMpOworICAgICAgc3Jfd3JpdGUoZ2V0X3JlZ19uYW1lKHJlZ25vKSwgc3RybGVuKGdldF9yZWdfbmFtZShyZWdubykpKTsKKyAgICAgIHNyX3dyaXRlX2NyKCI7ZCIpOworICAgICAgc3JfZXhwZWN0KCJycyIpOworICAgICAgc3JfZXhwZWN0KGdldF9yZWdfbmFtZShyZWdubykpOworICAgICAgc3JfZXhwZWN0KCI7ZCIpOworICAgICAgc3JfZXhwZWN0KCI9Iik7CisKKyAgICAgIC8qIHNpZ24gKi8KKyAgICAgIHAgPSBzcl9nZXRfaGV4X2RpZ2l0KDEpOworICAgICAgZnByZWdfYnVmWzBdID0gcCA8PCA3OworCisgICAgICAvKiBleHBvbmVudCAqLworICAgICAgc3JfZXhwZWN0KCJfIik7CisgICAgICBwID0gc3JfZ2V0X2hleF9kaWdpdCgxKTsKKyAgICAgIGZwcmVnX2J1ZlswXSArPSAocCA8PCA0KTsKKyAgICAgIGZwcmVnX2J1ZlswXSArPSBzcl9nZXRfaGV4X2RpZ2l0KDEpOworCisgICAgICBmcHJlZ19idWZbMV0gPSBzcl9nZXRfaGV4X2RpZ2l0KDEpIDw8IDQ7CisKKyAgICAgIC8qIGZyYWN0aW9uICovCisgICAgICBzcl9leHBlY3QoIl8iKTsKKyAgICAgIGZwcmVnX2J1ZlsxXSArPSBzcl9nZXRfaGV4X2RpZ2l0KDEpOworCisgICAgICBmcHJlZ19idWZbMl0gPSAoc3JfZ2V0X2hleF9kaWdpdCgxKSA8PCA0KSArIHNyX2dldF9oZXhfZGlnaXQoMSk7CisgICAgICBmcHJlZ19idWZbM10gPSAoc3JfZ2V0X2hleF9kaWdpdCgxKSA8PCA0KSArIHNyX2dldF9oZXhfZGlnaXQoMSk7CisgICAgICBmcHJlZ19idWZbNF0gPSAoc3JfZ2V0X2hleF9kaWdpdCgxKSA8PCA0KSArIHNyX2dldF9oZXhfZGlnaXQoMSk7CisgICAgICBmcHJlZ19idWZbNV0gPSAoc3JfZ2V0X2hleF9kaWdpdCgxKSA8PCA0KSArIHNyX2dldF9oZXhfZGlnaXQoMSk7CisgICAgICBmcHJlZ19idWZbNl0gPSAoc3JfZ2V0X2hleF9kaWdpdCgxKSA8PCA0KSArIHNyX2dldF9oZXhfZGlnaXQoMSk7CisgICAgICBmcHJlZ19idWZbN10gPSAoc3JfZ2V0X2hleF9kaWdpdCgxKSA8PCA0KSArIHNyX2dldF9oZXhfZGlnaXQoMSk7CisgICAgICBmcHJlZ19idWZbOF0gPSAwOworICAgICAgZnByZWdfYnVmWzldID0gMDsKKworICAgICAgZ3JfZXhwZWN0X3Byb21wdCgpOworICAgICAgc3VwcGx5X3JlZ2lzdGVyKHJlZ25vLCBmcHJlZ19idWYpOworICAgIH0KKworICByZXR1cm47Cit9CisKKy8qIFN0b3JlIHJlZ2lzdGVyIFJFR05PLCBvciBhbGwgaWYgUkVHTk8gPT0gLTEuICovCisKK3N0YXRpYyB2b2lkCitidWdfc3RvcmVfcmVnaXN0ZXIgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGNoYXIgYnVmZmVyWzEwMjRdOworICBzcl9jaGVja19vcGVuKCk7CisKKyAgaWYgKHJlZ25vID09IC0xKQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1JFR1M7ICsraSkKKwlidWdfc3RvcmVfcmVnaXN0ZXIoaSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciAqcmVnbmFtZTsKKworICAgICAgcmVnbmFtZSA9IGdldF9yZWdfbmFtZShyZWdubyk7CisKKyAgICAgIGlmICh0YXJnZXRfaXNfbTg4MTEwICYmIHJlZ25vID09IFNGSVBfUkVHTlVNKQorCXJldHVybjsKKyAgICAgIGVsc2UgaWYgKHJlZ25vIDwgWEZQX1JFR05VTSkKKwlzcHJpbnRmKGJ1ZmZlciwgInJzICVzICUwOHgiLAorCQlyZWduYW1lLAorCQlyZWFkX3JlZ2lzdGVyKHJlZ25vKSk7CisgICAgICBlbHNlCisJeworCSAgdW5zaWduZWQgY2hhciAqZnByZWdfYnVmID0KKwkgICAgKHVuc2lnbmVkIGNoYXIgKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUocmVnbm8pXTsKKwkgIAorCSAgc3ByaW50ZihidWZmZXIsICJycyAlcyAlMXhfJTAyeCUxeF8lMXglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMng7ZCIsCisJCSAgcmVnbmFtZSwKKwkJICAvKiBzaWduICovCisJCSAgKGZwcmVnX2J1ZlswXSA+PiA3KSAmIDB4ZiwKKwkJICAvKiBleHBvbmVudCAqLworCQkgIGZwcmVnX2J1ZlswXSAmIDB4N2YsCisJCSAgKGZwcmVnX2J1ZlsxXSA+PiA4KSAmIDB4ZiwKKwkJICAvKiBmcmFjdGlvbiAqLworCQkgIGZwcmVnX2J1ZlsxXSAmIDB4ZiwKKwkJICBmcHJlZ19idWZbMl0sCisJCSAgZnByZWdfYnVmWzNdLAorCQkgIGZwcmVnX2J1Zls0XSwKKwkJICBmcHJlZ19idWZbNV0sCisJCSAgZnByZWdfYnVmWzZdLAorCQkgIGZwcmVnX2J1Zls3XSk7CisJfQorCisgICAgICBzcl93cml0ZV9jcihidWZmZXIpOworICAgICAgZ3JfZXhwZWN0X3Byb21wdCgpOworICAgIH0KKworICByZXR1cm47Cit9CisKK2ludAorYnVnX3hmZXJfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbiwgd3JpdGUsIHRhcmdldCkKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IHdyaXRlOworICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0OwkvKiBpZ25vcmVkICovCit7CisgIHJlZ2lzdGVyIGludCBpOworCisgIC8qIFJvdW5kIHN0YXJ0aW5nIGFkZHJlc3MgZG93biB0byBsb25nd29yZCBib3VuZGFyeS4gICovCisgIHJlZ2lzdGVyIENPUkVfQUREUiBhZGRyOworCisgIC8qIFJvdW5kIGVuZGluZyBhZGRyZXNzIHVwOyBnZXQgbnVtYmVyIG9mIGxvbmd3b3JkcyB0aGF0IG1ha2VzLiAgKi8KKyAgcmVnaXN0ZXIgaW50IGNvdW50OworCisgIC8qIEFsbG9jYXRlIGJ1ZmZlciBvZiB0aGF0IG1hbnkgbG9uZ3dvcmRzLiAgKi8KKyAgcmVnaXN0ZXIgaW50ICpidWZmZXI7CisKKyAgYWRkciA9IG1lbWFkZHIgJiAtc2l6ZW9mIChpbnQpOworICBjb3VudCA9ICgoKG1lbWFkZHIgKyBsZW4pIC0gYWRkcikgKyBzaXplb2YgKGludCkgLSAxKSAvIHNpemVvZiAoaW50KTsKKworICBidWZmZXIgPSAoaW50ICopIGFsbG9jYSAoY291bnQgKiBzaXplb2YgKGludCkpOworCisgIGlmICh3cml0ZSkKKyAgICB7CisgICAgICAvKiBGaWxsIHN0YXJ0IGFuZCBlbmQgZXh0cmEgYnl0ZXMgb2YgYnVmZmVyIHdpdGggZXhpc3RpbmcgbWVtb3J5IGRhdGEuICAqLworCisgICAgICBpZiAoYWRkciAhPSBtZW1hZGRyIHx8IGxlbiA8IChpbnQpIHNpemVvZiAoaW50KSkKKwl7CisJICAvKiBOZWVkIHBhcnQgb2YgaW5pdGlhbCB3b3JkIC0tIGZldGNoIGl0LiAgKi8KKwkgIGJ1ZmZlclswXSA9IGdyX2ZldGNoX3dvcmQgKGFkZHIpOworCX0KKworICAgICAgaWYgKGNvdW50ID4gMSkJCS8qIEZJWE1FLCBhdm9pZCBpZiBldmVuIGJvdW5kYXJ5ICovCisJeworCSAgYnVmZmVyW2NvdW50IC0gMV0KKwkgICAgPSBncl9mZXRjaF93b3JkIChhZGRyICsgKGNvdW50IC0gMSkgKiBzaXplb2YgKGludCkpOworCX0KKworICAgICAgLyogQ29weSBkYXRhIHRvIGJlIHdyaXR0ZW4gb3ZlciBjb3JyZXNwb25kaW5nIHBhcnQgb2YgYnVmZmVyICovCisKKyAgICAgIG1lbWNweSAoKGNoYXIgKikgYnVmZmVyICsgKG1lbWFkZHIgJiAoc2l6ZW9mIChpbnQpIC0gMSkpLCBteWFkZHIsIGxlbik7CisKKyAgICAgIC8qIFdyaXRlIHRoZSBlbnRpcmUgYnVmZmVyLiAgKi8KKworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIGFkZHIgKz0gc2l6ZW9mIChpbnQpKQorCXsKKwkgIGVycm5vID0gMDsKKwkgIGdyX3N0b3JlX3dvcmQgKGFkZHIsIGJ1ZmZlcltpXSk7CisJICBpZiAoZXJybm8pCisJICAgIHsKKworCSAgICAgIHJldHVybiAwOworCSAgICB9CisKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogUmVhZCBhbGwgdGhlIGxvbmd3b3JkcyAqLworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIGFkZHIgKz0gc2l6ZW9mIChpbnQpKQorCXsKKwkgIGVycm5vID0gMDsKKwkgIGJ1ZmZlcltpXSA9IGdyX2ZldGNoX3dvcmQgKGFkZHIpOworCSAgaWYgKGVycm5vKQorCSAgICB7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKwkgIFFVSVQ7CisJfQorCisgICAgICAvKiBDb3B5IGFwcHJvcHJpYXRlIGJ5dGVzIG91dCBvZiB0aGUgYnVmZmVyLiAgKi8KKyAgICAgIG1lbWNweSAobXlhZGRyLCAoY2hhciAqKSBidWZmZXIgKyAobWVtYWRkciAmIChzaXplb2YgKGludCkgLSAxKSksIGxlbik7CisgICAgfQorCisgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyB2b2lkCitzdGFydF9sb2FkKCkKK3sKKyAgY2hhciAqY29tbWFuZDsKKworICBjb21tYW5kID0gKHNyZWNfZWNob19wYWNlID8gImxvIDAgO3giIDogImxvIDAiKTsKKworICBzcl93cml0ZV9jciAoY29tbWFuZCk7CisgIHNyX2V4cGVjdCAoY29tbWFuZCk7CisgIHNyX2V4cGVjdCAoIlxyXG4iKTsKKyAgYnVnX3NyZWNfd3JpdGVfY3IgKCJTMDAzMDAwMEZDIik7CisgIHJldHVybjsKK30KKworLyogVGhpcyBpcyBhbiBleHRyZW1lbHkgdnVsbmVyYWJsZSBhbmQgZnJhZ2lsZSBmdW5jdGlvbi4gIEkndmUgbWFkZQorICAgY29uc2lkZXJhYmxlIGF0dGVtcHRzIHRvIG1ha2UgdGhpcyBkZXRlcm1pbmlzdGljLCBidXQgSSd2ZQorICAgY2VydGFpbmx5IGZvcmdvdHRlbiBzb21ldGhpbmcuICBUaGUgdHJvdWJsZSBpcyB0aGF0IFMtcmVjb3JkcyBhcmUKKyAgIG9ubHkgYSBwYXJ0aWFsIGZpbGUgZm9ybWF0LCBub3QgYSBwcm90b2NvbC4gIFdvcnNlLCBhcHBhcmVudGx5IHRoZQorICAgbTg4ayBidWcgbW9uaXRvciBkb2VzIG5vdCBydW4gaW4gcmVhbCB0aW1lIHdoaWxlIHJlY2VpdmluZworICAgUy1yZWNvcmRzLiAgSGVuY2UsIHdlIG11c3QgcGF5IGV4Y3J1Y2lhdGluZyBhdHRlbnRpb24gdG8gd2hlbiBhbmQKKyAgIHdoZXJlIGVycm9yIG1lc3NhZ2VzIGFyZSByZXR1cm5lZCwgYW5kIHdoYXQgaGFzIGFjdHVhbGx5IGJlZW4gc2VudC4KKworICAgRWFjaCBjYWxsIHJlcHJlc2VudHMgYSBjaHVuayBvZiBtZW1vcnkgdG8gYmUgc2VudCB0byB0aGUgdGFyZ2V0LgorICAgV2UgYnJlYWsgdGhhdCBjaHVuayBpbnRvIGFuIFMwIGhlYWRlciByZWNvcmQsIHNvbWUgbnVtYmVyIG9mIFMzCisgICBkYXRhIHJlY29yZHMgZWFjaCBjb250YWluaW5nIHNyZWNfYnl0ZXMsIGFuZCBhbiBTNyB0ZXJtaW5hdGlvbgorICAgcmVjb3JkLiAgKi8KKworc3RhdGljIGNoYXIgKnNyZWNvcmRfc3RyaW5nc1tdID0geworICAiUy1SRUNPUkQiLAorICAiLUJ1Zz4iLAorICBOVUxMLAorfTsKKworc3RhdGljIGludAorYnVnX3dyaXRlX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICB1bnNpZ25lZCBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47Cit7CisgIGludCBkb25lOworICBpbnQgY2hlY2tzdW07CisgIGludCB4OworICBpbnQgcmV0cmllczsKKyAgY2hhciAqYnVmZmVyID0gYWxsb2NhICgoc3JlY19ieXRlcyArIDgpIDw8IDEpOworCisgIHJldHJpZXMgPSAwOworCisgIGRvCisgICAgeworICAgICAgZG9uZSA9IDA7CisKKyAgICAgIGlmIChyZXRyaWVzID4gc3JlY19tYXhfcmV0cmllcykKKwlyZXR1cm4oLTEpOworCisgICAgICBpZiAocmV0cmllcyA+IDApCisJeworCSAgaWYgKHNyX2dldF9kZWJ1ZygpID4gMCkKKwkgICAgcHJpbnRmKCJcbjxyZXRyeWluZy4uLj5cbiIpOworCisJICAvKiBUaGlzIGdyX2V4cGVjdF9wcm9tcHQgY2FsbCBpcyBleHRyZW1lbHkgaW1wb3J0YW50LiAgV2l0aG91dAorCSAgICAgaXQsIHdlIHdpbGwgdGVuZCB0byByZXNlbmQgb3VyIHBhY2tldCBzbyBmYXN0IHRoYXQgaXQKKwkgICAgIHdpbGwgYXJyaXZlIGJlZm9yZSB0aGUgYnVnIG1vbml0b3IgaXMgcmVhZHkgdG8gcmVjZWl2ZQorCSAgICAgaXQuICBUaGlzIHdvdWxkIGxlYWQgdG8gYSB2ZXJ5IHVnbHkgcmVzZW5kIGxvb3AuICAqLworCisJICBncl9leHBlY3RfcHJvbXB0KCk7CisJfQorCisgICAgICBzdGFydF9sb2FkKCk7CisKKyAgICAgIHdoaWxlIChkb25lIDwgbGVuKQorCXsKKwkgIGludCB0aGlzZ287CisJICBpbnQgaWR4OworCSAgY2hhciAqYnVmID0gYnVmZmVyOworCSAgQ09SRV9BRERSIGFkZHJlc3M7CisKKwkgIGNoZWNrc3VtID0gMDsKKwkgIHRoaXNnbyA9IGxlbiAtIGRvbmU7CisJICBpZiAodGhpc2dvID4gc3JlY19ieXRlcykKKwkgICAgdGhpc2dvID0gc3JlY19ieXRlczsKKworCSAgYWRkcmVzcyA9IG1lbWFkZHIgKyBkb25lOworCSAgc3ByaW50ZiAoYnVmLCAiUzMlMDJYJTA4WCIsIHRoaXNnbyArIDQgKyAxLCBhZGRyZXNzKTsKKwkgIGJ1ZiArPSAxMjsKKworCSAgY2hlY2tzdW0gKz0gKHRoaXNnbyArIDQgKyAxCisJCSAgICAgICArIChhZGRyZXNzICYgMHhmZikKKwkJICAgICAgICsgKChhZGRyZXNzID4+ICA4KSAmIDB4ZmYpCisJCSAgICAgICArICgoYWRkcmVzcyA+PiAxNikgJiAweGZmKQorCQkgICAgICAgKyAoKGFkZHJlc3MgPj4gMjQpICYgMHhmZikpOworCisJICBmb3IgKGlkeCA9IDA7IGlkeCA8IHRoaXNnbzsgaWR4KyspCisJICAgIHsKKwkgICAgICBzcHJpbnRmIChidWYsICIlMDJYIiwgbXlhZGRyW2lkeCArIGRvbmVdKTsKKwkgICAgICBjaGVja3N1bSArPSBteWFkZHJbaWR4ICsgZG9uZV07CisJICAgICAgYnVmICs9IDI7CisJICAgIH0KKworCSAgaWYgKHNyZWNfbm9pc2UgPiAwKQorCSAgICB7CisJICAgICAgLyogRklYTUUtTk9XOiBpbnNlcnQgYSBkZWxpYmVyYXRlIGVycm9yIGV2ZXJ5IG5vdyBhbmQgdGhlbi4KKwkJIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHRlc3RpbmcvZGVidWdnaW5nIHRoZSBlcnJvciBoYW5kbGluZworCQkgc3R1ZmYuICAqLworCSAgICAgIHN0YXRpYyBpbnQgY291bnRlciA9IDA7CisJICAgICAgaWYgKCsrY291bnRlciA+IHNyZWNfbm9pc2UpCisJCXsKKwkJICBjb3VudGVyID0gMDsKKwkJICArK2NoZWNrc3VtOworCQl9CisJICAgIH0KKworCSAgc3ByaW50ZihidWYsICIlMDJYIiwgfmNoZWNrc3VtICYgMHhmZik7CisJICBidWdfc3JlY193cml0ZV9jciAoYnVmZmVyKTsKKworCSAgaWYgKHNyZWNfc2xlZXAgIT0gMCkKKwkgICAgc2xlZXAoc3JlY19zbGVlcCk7CisKKwkgIC8qIFRoaXMgcG9sbGNoYXIgaXMgcHJvYmFibHkgcmVkdW5kYW50IHRvIHRoZSBncl9tdWx0aV9zY2FuCisJICAgICBiZWxvdy4gIFRyb3VibGUgaXMsIHdlIGNhbid0IGJlIHN1cmUgd2hlbiBvciB3aGVyZSBhbgorCSAgICAgZXJyb3IgbWVzc2FnZSB3aWxsIGFwcGVhci4gIEFwcGFyZW50bHksIHdoZW4gcnVubmluZyBhdAorCSAgICAgZnVsbCBzcGVlZCBmcm9tIGEgdHlwaWNhbCBzdW40LCBlcnJvciBtZXNzYWdlcyB0ZW5kIHRvCisJICAgICBhcHBlYXIgdG8gYXJyaXZlIG9ubHkgKmFmdGVyKiB0aGUgczcgcmVjb3JkLiAgICovCisKKwkgIGlmICgoeCA9IHNyX3BvbGxjaGFyKCkpICE9IDApCisJICAgIHsKKwkgICAgICBpZiAoc3JfZ2V0X2RlYnVnKCkgPiAwKQorCQlwcmludGYoIlxuPHJldHJ5aW5nLi4uPlxuIik7CisKKwkgICAgICArK3JldHJpZXM7CisKKwkgICAgICAvKiBmbHVzaCBhbnkgcmVtYWluaW5nIGlucHV0IGFuZCB2ZXJpZnkgdGhhdCB3ZSBhcmUgYmFjaworCQkgYXQgdGhlIHByb21wdCBsZXZlbC4gKi8KKwkgICAgICBncl9leHBlY3RfcHJvbXB0KCk7CisJICAgICAgLyogc3RhcnQgYWxsIG92ZXIgYWdhaW4uICovCisJICAgICAgc3RhcnRfbG9hZCgpOworCSAgICAgIGRvbmUgPSAwOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIGRvbmUgKz0gdGhpc2dvOworCX0KKworICAgICAgYnVnX3NyZWNfd3JpdGVfY3IoIlM3MDYwMDAwMDAwMDAwRjkiKTsKKyAgICAgICsrcmV0cmllczsKKworICAgICAgLyogSGF2aW5nIGZpbmlzaGVkIHRoZSBsb2FkLCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hldGhlciB3ZQorCSBoYWQgYW55IGVycm9ycy4gICovCisgICAgfSB3aGlsZSAoZ3JfbXVsdGlfc2NhbihzcmVjb3JkX3N0cmluZ3MsIDApID09IDApOzsKKworICByZXR1cm4oMCk7Cit9CisKKy8qIENvcHkgTEVOIGJ5dGVzIG9mIGRhdGEgZnJvbSBkZWJ1Z2dlciBtZW1vcnkgYXQgTVlBRERSCisgICB0byBpbmZlcmlvcidzIG1lbW9yeSBhdCBNRU1BRERSLiAgUmV0dXJucyBlcnJubyB2YWx1ZS4KKyAqIHNiL3NoIGluc3RydWN0aW9ucyBkb24ndCB3b3JrIG9uIHVuYWxpZ25lZCBhZGRyZXNzZXMsIHdoZW4gVFU9MS4KKyAqLworCisvKiBSZWFkIExFTiBieXRlcyBmcm9tIGluZmVyaW9yIG1lbW9yeSBhdCBNRU1BRERSLiAgUHV0IHRoZSByZXN1bHQKKyAgIGF0IGRlYnVnZ2VyIGFkZHJlc3MgTVlBRERSLiAgUmV0dXJucyBlcnJubyB2YWx1ZS4gICovCitzdGF0aWMgaW50CitidWdfcmVhZF9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgdW5zaWduZWQgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICBjaGFyIHJlcXVlc3RbMTAwXTsKKyAgY2hhciAqYnVmZmVyOworICBjaGFyICpwOworICBjaGFyIHR5cGU7CisgIGNoYXIgc2l6ZTsKKyAgdW5zaWduZWQgY2hhciBjOworICB1bnNpZ25lZCBpbnQgaW5hZGRyOworICB1bnNpZ25lZCBpbnQgY2hlY2tzdW07CisKKyAgc3ByaW50ZihyZXF1ZXN0LCAiZHUgMCAleDomJWQiLCBtZW1hZGRyLCBsZW4pOworICBzcl93cml0ZV9jcihyZXF1ZXN0KTsKKworICBwID0gYnVmZmVyID0gYWxsb2NhKGxlbik7CisKKyAgLyogc2NhbiB1cCB0aHJvdWdoIHRoZSBoZWFkZXIgKi8KKyAgc3JfZXhwZWN0KCJTMDAzMDAwMEZDIik7CisKKyAgd2hpbGUgKHAgPCBidWZmZXIgKyBsZW4pCisgICAgeworICAgICAgLyogc2NhbiBvZmYgYW55IHdoaXRlIHNwYWNlLiAqLworICAgICAgd2hpbGUgKHNyX3JlYWRjaGFyKCkgIT0gJ1MnKSA7OworCisgICAgICAvKiB3aGF0IGtpbmQgb2Ygcy1yZWM/ICovCisgICAgICB0eXBlID0gc3JfcmVhZGNoYXIoKTsKKworICAgICAgLyogc2NhbiByZWNvcmQgc2l6ZSAqLworICAgICAgc3JfZ2V0X2hleF9ieXRlKCZzaXplKTsKKyAgICAgIGNoZWNrc3VtID0gc2l6ZTsKKyAgICAgIC0tc2l6ZTsKKyAgICAgIGluYWRkciA9IDA7CisKKyAgICAgIHN3aXRjaCAodHlwZSkKKwl7CisJY2FzZSAnNyc6CisJY2FzZSAnOCc6CisJY2FzZSAnOSc6CisJICBnb3RvIGRvbmU7CisKKwljYXNlICczJzoKKwkgIHNyX2dldF9oZXhfYnl0ZSgmYyk7CisJICBpbmFkZHIgPSAoaW5hZGRyIDw8IDgpICsgYzsKKwkgIGNoZWNrc3VtICs9IGM7CisJICAtLXNpemU7CisJICAvKiBpbnRlbnRpb25hbCBmYWxsIHRocm91Z2ggKi8KKwljYXNlICcyJzoKKwkgIHNyX2dldF9oZXhfYnl0ZSgmYyk7CisJICBpbmFkZHIgPSAoaW5hZGRyIDw8IDgpICsgYzsKKwkgIGNoZWNrc3VtICs9IGM7CisJICAtLXNpemU7CisJICAvKiBpbnRlbnRpb25hbCBmYWxsIHRocm91Z2ggKi8KKwljYXNlICcxJzoKKwkgIHNyX2dldF9oZXhfYnl0ZSgmYyk7CisJICBpbmFkZHIgPSAoaW5hZGRyIDw8IDgpICsgYzsKKwkgIGNoZWNrc3VtICs9IGM7CisJICAtLXNpemU7CisJICBzcl9nZXRfaGV4X2J5dGUoJmMpOworCSAgaW5hZGRyID0gKGluYWRkciA8PCA4KSArIGM7CisJICBjaGVja3N1bSArPSBjOworCSAgLS1zaXplOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgLyogYm9uayAqLworCSAgZXJyb3IoInJlYWRpbmcgcy1yZWNvcmRzLiIpOworCX0KKworICAgICAgaWYgKGluYWRkciA8IG1lbWFkZHIKKwkgIHx8IChtZW1hZGRyICsgbGVuKSA8IChpbmFkZHIgKyBzaXplKSkKKwllcnJvcigic3JlYyBvdXQgb2YgbWVtb3J5IHJhbmdlLiIpOworCisgICAgICBpZiAocCAhPSBidWZmZXIgKyBpbmFkZHIgLSBtZW1hZGRyKQorCWVycm9yKCJzcmVjIG91dCBvZiBzZXF1ZW5jZS4iKTsKKworICAgICAgZm9yICg7IHNpemU7IC0tc2l6ZSwgKytwKQorCXsKKwkgIHNyX2dldF9oZXhfYnl0ZShwKTsKKwkgIGNoZWNrc3VtICs9ICpwOworCX0KKworICAgICAgc3JfZ2V0X2hleF9ieXRlKCZjKTsKKyAgICAgIGlmIChjICE9ICh+Y2hlY2tzdW0gJiAweGZmKSkKKwllcnJvcigiYmFkIHMtcmVjIGNoZWNrc3VtIik7CisgICAgfQorCisgZG9uZToKKyAgZ3JfZXhwZWN0X3Byb21wdCgpOworICBpZiAocCAhPSBidWZmZXIgKyBsZW4pCisgICAgcmV0dXJuKDEpOworCisgIG1lbWNweShteWFkZHIsIGJ1ZmZlciwgbGVuKTsKKyAgcmV0dXJuKDApOworfQorCisjZGVmaW5lIE1BWF9CUkVBS1MJMTYKK3N0YXRpYyBpbnQgbnVtX2Jya3B0cyA9IDA7CitzdGF0aWMgaW50CitidWdfaW5zZXJ0X2JyZWFrcG9pbnQgKGFkZHIsIHNhdmUpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpzYXZlOwkJLyogVGhyb3cgYXdheSwgbGV0IGJ1ZyBzYXZlIGluc3RydWN0aW9ucyAqLworeworICBzcl9jaGVja19vcGVuICgpOworCisgIGlmIChudW1fYnJrcHRzIDwgTUFYX0JSRUFLUykKKyAgICB7CisgICAgICBjaGFyIGJ1ZmZlclsxMDBdOworCisgICAgICBudW1fYnJrcHRzKys7CisgICAgICBzcHJpbnRmIChidWZmZXIsICJiciAleCIsIGFkZHIpOworICAgICAgc3Jfd3JpdGVfY3IgKGJ1ZmZlcik7CisgICAgICBncl9leHBlY3RfcHJvbXB0ICgpOworICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKGdkYl9zdGRlcnIsCisJCSAgICAgICJUb28gbWFueSBicmVhayBwb2ludHMsIGJyZWFrIHBvaW50IG5vdCBpbnN0YWxsZWRcbiIpOworICAgICAgcmV0dXJuKDEpOworICAgIH0KKworfQorc3RhdGljIGludAorYnVnX3JlbW92ZV9icmVha3BvaW50IChhZGRyLCBzYXZlKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqc2F2ZTsJCS8qIFRocm93IGF3YXksIGxldCBidWcgc2F2ZSBpbnN0cnVjdGlvbnMgKi8KK3sKKyAgaWYgKG51bV9icmtwdHMgPiAwKQorICAgIHsKKyAgICAgIGNoYXIgYnVmZmVyWzEwMF07CisKKyAgICAgIG51bV9icmtwdHMtLTsKKyAgICAgIHNwcmludGYgKGJ1ZmZlciwgIm5vYnIgJXgiLCBhZGRyKTsKKyAgICAgIHNyX3dyaXRlX2NyIChidWZmZXIpOworICAgICAgZ3JfZXhwZWN0X3Byb21wdCAoKTsKKworICAgIH0KKyAgcmV0dXJuICgwKTsKK30KKworLyogQ2xlYXIgdGhlIGJ1Z3Mgbm90aW9uIG9mIHdoYXQgdGhlIGJyZWFrIHBvaW50cyBhcmUgKi8KK3N0YXRpYyBpbnQKK2J1Z19jbGVhcl9icmVha3BvaW50cyAoKQoreworCisgIGlmIChzcl9pc19vcGVuKCkpCisgICAgeworICAgICAgc3Jfd3JpdGVfY3IgKCJub2JyIik7CisgICAgICBzcl9leHBlY3QoIm5vYnIiKTsKKyAgICAgIGdyX2V4cGVjdF9wcm9tcHQgKCk7CisgICAgfQorICBudW1fYnJrcHRzID0gMDsKKyAgcmV0dXJuKDApOworfQorCitzdHJ1Y3QgdGFyZ2V0X29wcyBidWdfb3BzIDsKKworc3RhdGljIHZvaWQgCitpbml0X2J1Z19vcHModm9pZCkKK3sKKyAgYnVnX29wcy50b19zaG9ydG5hbWUgPSAgICJidWciOyAiUmVtb3RlIEJVRyBtb25pdG9yIiwKKwkJCQkgICAgYnVnX29wcy50b19sb25nbmFtZSA9ICAgIlVzZSB0aGUgbXZtZTE4NyBib2FyZCBydW5uaW5nIHRoZSBCVUcgbW9uaXRvciBjb25uZWN0ZWQgYnkgYSBzZXJpYWwgbGluZS4iOworICBidWdfb3BzLnRvX2RvYyA9ICAgIiAiOworICBidWdfb3BzLnRvX29wZW4gPSAgIGJ1Z19vcGVuOworICBidWdfb3BzLnRvX2Nsb3NlID0gICBncl9jbG9zZTsKKyAgYnVnX29wcy50b19hdHRhY2ggPSAgIDA7CisgIGJ1Z19vcHMudG9fcG9zdF9hdHRhY2ggPSBOVUxMOworICBidWdfb3BzLnRvX3JlcXVpcmVfYXR0YWNoID0gTlVMTDsKKyAgYnVnX29wcy50b19kZXRhY2ggPSAgIGdyX2RldGFjaDsKKyAgYnVnX29wcy50b19yZXF1aXJlX2RldGFjaCA9IE5VTEw7CisgIGJ1Z19vcHMudG9fcmVzdW1lID0gICBidWdfcmVzdW1lOworICBidWdfb3BzLnRvX3dhaXQgID0gICBidWdfd2FpdDsKKyAgYnVnX29wcy50b19wb3N0X3dhaXQgPSBOVUxMOworICBidWdfb3BzLnRvX2ZldGNoX3JlZ2lzdGVycyAgPSAgIGJ1Z19mZXRjaF9yZWdpc3RlcjsKKyAgYnVnX29wcy50b19zdG9yZV9yZWdpc3RlcnMgID0gICBidWdfc3RvcmVfcmVnaXN0ZXI7CisgIGJ1Z19vcHMudG9fcHJlcGFyZV90b19zdG9yZSA9ICAgZ3JfcHJlcGFyZV90b19zdG9yZTsKKyAgYnVnX29wcy50b194ZmVyX21lbW9yeSAgPSAgIGJ1Z194ZmVyX21lbW9yeTsKKyAgYnVnX29wcy50b19maWxlc19pbmZvICA9ICAgZ3JfZmlsZXNfaW5mbzsKKyAgYnVnX29wcy50b19pbnNlcnRfYnJlYWtwb2ludCA9ICAgYnVnX2luc2VydF9icmVha3BvaW50OworICBidWdfb3BzLnRvX3JlbW92ZV9icmVha3BvaW50ID0gICBidWdfcmVtb3ZlX2JyZWFrcG9pbnQ7CisgIGJ1Z19vcHMudG9fdGVybWluYWxfaW5pdCAgPSAgIDA7CisgIGJ1Z19vcHMudG9fdGVybWluYWxfaW5mZXJpb3IgPSAgIDA7CisgIGJ1Z19vcHMudG9fdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ID0gICAwOworICBidWdfb3BzLnRvX3Rlcm1pbmFsX291cnMgID0gICAwOworICBidWdfb3BzLnRvX3Rlcm1pbmFsX2luZm8gID0gICAwOwkJCisgIGJ1Z19vcHMudG9fa2lsbCAgPSAgIGdyX2tpbGw7CQkJCisgIGJ1Z19vcHMudG9fbG9hZCAgPSAgIGJ1Z19sb2FkOworICBidWdfb3BzLnRvX2xvb2t1cF9zeW1ib2wgPSAgIDA7CQkJCisgIGJ1Z19vcHMudG9fY3JlYXRlX2luZmVyaW9yID0gICBncl9jcmVhdGVfaW5mZXJpb3I7CQorICBidWdfb3BzLnRvX3Bvc3Rfc3RhcnR1cF9pbmZlcmlvciA9IE5VTEw7CisgIGJ1Z19vcHMudG9fYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvciA9IE5VTEw7CisgIGJ1Z19vcHMudG9fY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciA9IE5VTEw7ICAgICAgICAgIAorICBidWdfb3BzLnRvX3Bvc3RfZm9sbG93X2luZmVyaW9yX2J5X2Nsb25lID0gTlVMTDsgIAorICBidWdfb3BzLnRvX2luc2VydF9mb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBidWdfb3BzLnRvX3JlbW92ZV9mb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBidWdfb3BzLnRvX2luc2VydF92Zm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgYnVnX29wcy50b19yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgIAorICBidWdfb3BzLnRvX2hhc19mb3JrZWQgPSBOVUxMOworICBidWdfb3BzLnRvX2hhc192Zm9ya2VkID0gTlVMTDsgCisgIGJ1Z19vcHMudG9fY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgIAorICBidWdfb3BzLnRvX3Bvc3RfZm9sbG93X3Zmb3JrID0gTlVMTDsKKyAgYnVnX29wcy50b19pbnNlcnRfZXhlY19jYXRjaHBvaW50ID0gTlVMTDsKKyAgYnVnX29wcy50b19yZW1vdmVfZXhlY19jYXRjaHBvaW50ID0gTlVMTDsKKyAgYnVnX29wcy50b19oYXNfZXhlY2QgPSBOVUxMOworICBidWdfb3BzLnRvX3JlcG9ydGVkX2V4ZWNfZXZlbnRzX3Blcl9leGVjX2NhbGwgPSBOVUxMOworICBidWdfb3BzLnRvX2hhc19leGl0ZWQgPSBOVUxMOworICBidWdfb3BzLnRvX21vdXJuX2luZmVyaW9yID0gICBncl9tb3VybjsJCQorICBidWdfb3BzLnRvX2Nhbl9ydW4gID0gICAwOwkJCQkKKyAgYnVnX29wcy50b19ub3RpY2Vfc2lnbmFscyA9ICAgMDsJCQkKKyAgYnVnX29wcy50b190aHJlYWRfYWxpdmUgID0gIDAgOworICBidWdfb3BzLnRvX3N0b3AgID0gICAwOworICBidWdfb3BzLnRvX3BpZF90b19leGVjX2ZpbGUgPSBOVUxMOworICBidWdfb3BzLnRvX2NvcmVfZmlsZV90b19zeW1fZmlsZSA9IE5VTEw7CisgIGJ1Z19vcHMudG9fc3RyYXR1bSA9ICAgcHJvY2Vzc19zdHJhdHVtIDsKKyAgYnVnX29wcy5ET05UX1VTRSA9ICAgMDsKKyAgYnVnX29wcy50b19oYXNfYWxsX21lbW9yeSA9ICAgMTsKKyAgYnVnX29wcy50b19oYXNfbWVtb3J5ID0gICAxOworICBidWdfb3BzLnRvX2hhc19zdGFjayA9ICAgMTsJCisgIGJ1Z19vcHMudG9faGFzX3JlZ2lzdGVycyA9ICAgMDsKKyAgYnVnX29wcy50b19oYXNfZXhlY3V0aW9uID0gICAwOwkJCQorICBidWdfb3BzLnRvX3NlY3Rpb25zID0gICAwIDsKKyAgYnVnX29wcy50b19zZWN0aW9uc19lbmQgPSAwIDsKKyAgYnVnX29wcy50b19tYWdpYyA9IE9QU19NQUdJQzsJCQkvKiBBbHdheXMgdGhlIGxhc3QgdGhpbmcgKi8KK30gLyogaW5pdF9idWdfb3BzICovCisKK3ZvaWQKK19pbml0aWFsaXplX3JlbW90ZV9idWcgKCkKK3sKKyAgaW5pdF9idWdfb3BzKCkgOworICBhZGRfdGFyZ2V0ICgmYnVnX29wcyk7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQKKyAgICAoYWRkX3NldF9jbWQgKCJzcmVjLWJ5dGVzIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX3VpbnRlZ2VyLAorCQkgIChjaGFyICopICZzcmVjX2J5dGVzLAorCQkgICJcCitTZXQgdGhlIG51bWJlciBvZiBieXRlcyByZXByZXNlbnRlZCBpbiBlYWNoIFMtcmVjb3JkLlxuXAorVGhpcyBhZmZlY3RzIHRoZSBjb21tdW5pY2F0aW9uIHByb3RvY29sIHdpdGggdGhlIHJlbW90ZSB0YXJnZXQuIiwKKwkJICAmc2V0bGlzdCksCisgICAgICZzaG93bGlzdCk7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQKKyAgICAoYWRkX3NldF9jbWQgKCJzcmVjLW1heC1yZXRyaWVzIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX3VpbnRlZ2VyLAorCQkgIChjaGFyICopICZzcmVjX21heF9yZXRyaWVzLAorCQkgICJcCitTZXQgdGhlIG51bWJlciBvZiByZXRyaWVzIGZvciBzaGlwcGluZyBTLXJlY29yZHMuXG5cCitUaGlzIGFmZmVjdHMgdGhlIGNvbW11bmljYXRpb24gcHJvdG9jb2wgd2l0aCB0aGUgcmVtb3RlIHRhcmdldC4iLAorCQkgICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKKworI2lmIDAKKyAgLyogVGhpcyBuZWVkcyB0byBzZXQgU1JFQ19TSVpFLCBub3Qgc3JlY19mcmFtZSB3aGljaCBnZXRzIGNoYW5nZWQgYXQgdGhlCisgICAgIGVuZCBvZiBhIGRvd25sb2FkLiAgQnV0IGRvIHdlIG5lZWQgdGhlIG9wdGlvbiBhdCBhbGw/ICAqLworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoInNyZWMtZnJhbWUiLCBjbGFzc19zdXBwb3J0LCB2YXJfdWludGVnZXIsCisJCSAgKGNoYXIgKikgJnNyZWNfZnJhbWUsCisJCSAgIlwKK1NldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGFuIFMtcmVjb3JkIGZyYW1lLlxuXAorVGhpcyBhZmZlY3RzIHRoZSBjb21tdW5pY2F0aW9uIHByb3RvY29sIHdpdGggdGhlIHJlbW90ZSB0YXJnZXQuIiwKKwkJICAmc2V0bGlzdCksCisgICAgICZzaG93bGlzdCk7CisjZW5kaWYgLyogMCAqLworCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgic3JlYy1ub2lzZSIsIGNsYXNzX3N1cHBvcnQsIHZhcl96aW50ZWdlciwKKwkJICAoY2hhciAqKSAmc3JlY19ub2lzZSwKKwkJICAiXAorU2V0IG51bWJlciBvZiBTLXJlY29yZCB0byBzZW5kIGJlZm9yZSBkZWxpYmVyYXRlbHkgZmx1YmJpbmcgYSBjaGVja3N1bS5cblwKK1plcm8gbWVhbnMgZmx1YiBub25lIGF0IGFsbC4gIFRoaXMgYWZmZWN0cyB0aGUgY29tbXVuaWNhdGlvbiBwcm90b2NvbFxuXAord2l0aCB0aGUgcmVtb3RlIHRhcmdldC4iLAorCQkgICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoInNyZWMtc2xlZXAiLCBjbGFzc19zdXBwb3J0LCB2YXJfemludGVnZXIsCisJCSAgKGNoYXIgKikgJnNyZWNfc2xlZXAsCisJCSAgIlwKK1NldCBudW1iZXIgb2Ygc2Vjb25kcyB0byBzbGVlcCBhZnRlciBhbiBTLXJlY29yZCBmb3IgYSBwb3NzaWJsZSBlcnJvciBtZXNzYWdlIHRvIGFycml2ZS5cblwKK1RoaXMgYWZmZWN0cyB0aGUgY29tbXVuaWNhdGlvbiBwcm90b2NvbCB3aXRoIHRoZSByZW1vdGUgdGFyZ2V0LiIsCisJCSAgJnNldGxpc3QpLAorICAgICAmc2hvd2xpc3QpOworCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgic3JlYy1lY2hvLXBhY2UiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKKwkJICAoY2hhciAqKSAmc3JlY19lY2hvX3BhY2UsCisJCSAgIlwKK1NldCBlY2hvLXZlcmlmaWNhdGlvbi5cblwKK1doZW4gb24sIHVzZSB2ZXJpZmljYXRpb24gYnkgZWNobyB3aGVuIGRvd25sb2FkaW5nIFMtcmVjb3Jkcy4gIFRoaXMgaXNcblwKK211Y2ggc2xvd2VyLCBidXQgZ2VuZXJhbGx5IG1vcmUgcmVsaWFibGUuIiwgCisJCSAgJnNldGxpc3QpLAorICAgICAmc2hvd2xpc3QpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS1kMTB2LmMgYi9nZGIvcmVtb3RlLWQxMHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTI5YjIxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JlbW90ZS1kMTB2LmMKQEAgLTAsMCArMSwyMjggQEAKKy8qIFJlbW90ZSB0YXJnZXQgY29tbXVuaWNhdGlvbnMgZm9yIGQxMHYgY29ubmVjdGVkIHZpYSBhIHNlcmlhbCBsaW5lLgorICAgQ29weXJpZ2h0IDE5ODgsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJ3YWl0LmgiCisvKiNpbmNsdWRlICJ0ZXJtaW5hbC5oIiovCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJnZGItc3RhYnMuaCIKKyNpbmNsdWRlICJnZGJ0aHJlYWQuaCIKKworI2luY2x1ZGUgImRjYWNoZS5oIgorCisjaWZkZWYgVVNHCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgInNlcmlhbC5oIgorCisvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMgKi8KKworc3RhdGljIHZvaWQgcmVtb3RlX2QxMHZfb3BlbiBQQVJBTVMgKChjaGFyICpuYW1lLCBpbnQgZnJvbV90dHkpKTsKKworLyogRGVmaW5lIHRoZSB0YXJnZXQgc3Vicm91dGluZSBuYW1lcyAqLworc3RhdGljIHN0cnVjdCB0YXJnZXRfb3BzIHJlbW90ZV9kMTB2X29wczsKKworLyogT3BlbiBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgZGVidWdnZXIuCisgICBOQU1FIGlzIHRoZSBmaWxlbmFtZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uLiAgKi8KKworc3RhdGljIHZvaWQKK3JlbW90ZV9kMTB2X29wZW4gKG5hbWUsIGZyb21fdHR5KQorICAgICBjaGFyICpuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHBvcF90YXJnZXQgKCk7CisgIHB1c2hfcmVtb3RlX3RhcmdldCAobmFtZSwgZnJvbV90dHkpOworfQorCisKKy8qIFRyYW5zbGF0ZSBhIEdEQiB2aXJ0dWFsIEFERFIvTEVOIGludG8gYSBmb3JtYXQgdGhlIHJlbW90ZSB0YXJnZXQKKyAgIHVuZGVyc3RhbmRzLiAgUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgdHJhbnNmZXJlZAorICAgc3RhcnRpbmcgYXQgdGFkZHIsIFpFUk8gaWYgbm8gYnl0ZXMgY2FuIGJlIHRyYW5zZmVyZWQuICovCitpbnQKK3JlbW90ZV9kMTB2X3RyYW5zbGF0ZV94ZmVyX2FkZHJlc3MgKG1lbWFkZHIsIG5yX2J5dGVzLCB0YWRkcikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGludCBucl9ieXRlczsKKyAgICAgQ09SRV9BRERSICp0YWRkcjsKK3sKKyAgQ09SRV9BRERSIHBoeXM7CisgIENPUkVfQUREUiBzZWc7CisgIENPUkVfQUREUiBvZmY7CisgIGNoYXIgKmZyb20gPSAidW5rbm93biI7CisgIGNoYXIgKnRvID0gInVua25vd24iOworICB1bnNpZ25lZCBzaG9ydCBpbWFwMCA9IHJlYWRfcmVnaXN0ZXIgKElNQVAwX1JFR05VTSk7CisgIHVuc2lnbmVkIHNob3J0IGltYXAxID0gcmVhZF9yZWdpc3RlciAoSU1BUDFfUkVHTlVNKTsKKyAgdW5zaWduZWQgc2hvcnQgZG1hcCA9IHJlYWRfcmVnaXN0ZXIgKERNQVBfUkVHTlVNKTsKKworICAvKiBHREIgaW50ZXJwcmV0cyBhZGRyZXNzZXMgYXM6CisKKyAgICAgICAweDAweHh4eHh4OiBMb2dpY2FsIGRhdGEgYWRkcmVzcyBzZWdtZW50ICAgICAgICAoRE1BUCB0cmFuc2xhdGVkIG1lbW9yeSkKKyAgICAgICAweDAxeHh4eHh4OiBMb2dpY2FsIGluc3RydWN0aW9uIGFkZHJlc3Mgc2VnbWVudCAoSU1BUCB0cmFuc2xhdGVkIG1lbW9yeSkKKyAgICAgICAweDEweHh4eHh4OiBQaHlzaWNhbCBkYXRhIG1lbW9yeSBzZWdtZW50ICAgICAgICAoT24tY2hpcCBkYXRhIG1lbW9yeSkKKyAgICAgICAweDExeHh4eHh4OiBQaHlzaWNhbCBpbnN0cnVjdGlvbiBtZW1vcnkgc2VnbWVudCAoT24tY2hpcCBpbnNuIG1lbW9yeSkKKyAgICAgICAweDEyeHh4eHh4OiBQaGlzaWNhbCB1bmlmaWVkIG1lbW9yeSBzZWdtZW50ICAgICAoVW5pZmllZCBtZW1vcnkpCisKKyAgICAgVGhlIHJlbW90ZSBkMTB2IGJvYXJkIGludGVycHJldHMgYWRkcmVzc2VzIGFzOgorCisgICAgICAgMHgwMHh4eHh4eDogUGhpc2ljYWwgdW5pZmllZCBtZW1vcnkgc2VnbWVudCAgICAgKFVuaWZpZWQgbWVtb3J5KQorICAgICAgIDB4MDF4eHh4eHg6IFBoeXNpY2FsIGluc3RydWN0aW9uIG1lbW9yeSBzZWdtZW50IChPbi1jaGlwIGluc24gbWVtb3J5KQorICAgICAgIDB4MDJ4eHh4eHg6IFBoeXNpY2FsIGRhdGEgbWVtb3J5IHNlZ21lbnQgICAgICAgIChPbi1jaGlwIGRhdGEgbWVtb3J5KQorCisgICAgIFRyYW5zbGF0ZSBhY2NvcmRpbmcgdG8gY3VycmVudCBJTUFQL2RtYXAgcmVnaXN0ZXJzICovCisKKyAgZW51bSB7CisgICAgdGFyZ191bmlmaWVkID0gMHgwMDAwMDAwMCwKKyAgICB0YXJnX2luc24gPSAweDAxMDAwMDAwLAorICAgIHRhcmdfZGF0YSA9IDB4MDIwMDAwMDAsCisgIH07CisKKyAgc2VnID0gKG1lbWFkZHIgPj4gMjQpOworICBvZmYgPSAobWVtYWRkciAmIDB4ZmZmZmZmTCk7CisKKyAgc3dpdGNoIChzZWcpIAorICAgICAgeworICAgICAgY2FzZSAweDAwOiAvKiBpbiBsb2dpY2FsIGRhdGEgYWRkcmVzcyBzZWdtZW50ICovCisJeworCSAgZnJvbSA9ICJsb2dpY2FsLWRhdGEiOworCSAgaWYgKG9mZiA8PSAweDdmZmZMKQorCSAgICB7CisJICAgICAgLyogT24gY2hpcCBkYXRhICovCisJICAgICAgcGh5cyA9IHRhcmdfZGF0YSArIG9mZjsKKwkgICAgICBpZiAob2ZmICsgbnJfYnl0ZXMgPiAweDdmZmZMKQorCQkvKiBkb24ndCBjcm9zcyBWTSBib3VuZGFyeSAqLworCQlucl9ieXRlcyA9IDB4N2ZmZkwgLSBvZmYgKyAxOworCSAgICAgIHRvID0gImNoaXAtZGF0YSI7CisJICAgIH0KKwkgIGVsc2UgaWYgKG9mZiA8PSAweGJmZmZMKQorCSAgICB7CisJICAgICAgc2hvcnQgbWFwID0gZG1hcDsKKwkgICAgICBpZiAobWFwICYgMHgxMDAwKQorCQl7CisJCSAgLyogSW5zdHJ1Y3Rpb24gbWVtb3J5ICovCisJCSAgcGh5cyA9IHRhcmdfaW5zbiB8ICgobWFwICYgMHhmKSA8PCAxNCkgfCAob2ZmICYgMHgzZmZmKTsKKwkJICB0byA9ICJjaGlwLWluc24iOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogVW5pZmllZCBtZW1vcnkgKi8KKwkJICBwaHlzID0gdGFyZ191bmlmaWVkIHwgKChtYXAgJiAweDNmZikgPDwgMTQpIHwgKG9mZiAmIDB4M2ZmZik7CisJCSAgdG8gPSAidW5pZmllZCI7CisJCX0KKwkgICAgICBpZiAob2ZmICsgbnJfYnl0ZXMgPiAweGJmZmZMKQorCQkvKiBkb24ndCBjcm9zcyBWTSBib3VuZGFyeSAqLworCQlucl9ieXRlcyA9ICgweGJmZmZMIC0gb2ZmICsgMSk7CisJICAgIH0JICAgIAorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogTG9naWNhbCBhZGRyZXNzIG91dCBzaWRlIG9mIGRhdGEgc2VnbWVudHMsIG5vdCBzdXBwb3J0ZWQgKi8KKwkgICAgICByZXR1cm4gKDApOworCSAgICB9CisJICBicmVhazsKKwl9CisKKyAgICAgIGNhc2UgMHgwMTogLyogaW4gbG9naWNhbCBpbnN0cnVjdGlvbiBhZGRyZXNzIHNlZ21lbnQgKi8KKwl7CisJICBzaG9ydCBtYXA7CisJICBmcm9tID0gImxvZ2ljYWwtaW5zbiI7CisJICBpZiAob2ZmIDw9IDB4MWZmZmZMKQorCSAgICB7CisJICAgICAgbWFwID0gaW1hcDA7CisJICAgIH0KKwkgIGVsc2UgaWYgKG9mZiA8PSAweDNmZmZmTCkKKwkgICAgeworCSAgICAgIG1hcCA9IGltYXAxOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBMb2dpY2FsIGFkZHJlc3Mgb3V0c2lkZSBvZiBJTUFQWzAxXSBzZWdtZW50LCBub3QKKwkJIHN1cHBvcnRlZCAqLworCSAgICAgIHJldHVybiAoMCk7CisJICAgIH0KKwkgIGlmICgob2ZmICYgMHgxZmZmZikgKyBucl9ieXRlcyA+IDB4MWZmZmZMKQorCSAgICB7CisJICAgICAgLyogZG9uJ3QgY3Jvc3MgVk0gYm91bmRhcnkgKi8KKwkgICAgICBucl9ieXRlcyA9IDB4MWZmZmZMIC0gKG9mZiAmIDB4MWZmZmZMKSArIDE7CisJICAgIH0KKwkgIGlmIChtYXAgJiAweDEwMDApCisJICAgIC8qIEluc3RydWN0aW9uIG1lbW9yeSAqLworCSAgICB7CisJICAgICAgcGh5cyA9IHRhcmdfaW5zbiB8IG9mZjsKKwkgICAgICB0byA9ICJjaGlwLWluc24iOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBwaHlzID0gKChtYXAgJiAweDdmTCkgPDwgMTcpICsgKG9mZiAmIDB4MWZmZmZMKTsKKwkgICAgICBpZiAocGh5cyA+IDB4ZmZmZmZmTCkKKwkJLyogQWRkcmVzcyBvdXRzaWRlIG9mIHVuaWZpZWQgYWRkcmVzcyBzZWdtZW50ICovCisJCXJldHVybiAoMCk7CisJICAgICAgcGh5cyB8PSB0YXJnX3VuaWZpZWQ7CisJICAgICAgdG8gPSAidW5pZmllZCI7CisJICAgIH0KKwkgIGJyZWFrOworCX0KKworICAgICAgY2FzZSAweDEwOiAvKiBQaHlzaWNhbCBkYXRhIG1lbW9yeSBzZWdtZW50ICovCisJZnJvbSA9ICJwaHlzLWRhdGEiOworCXBoeXMgPSB0YXJnX2RhdGEgfCBvZmY7CisJdG8gPSAiY2hpcC1kYXRhIjsKKwlicmVhazsKKworICAgICAgY2FzZSAweDExOiAvKiBQaHlzaWNhbCBpbnN0cnVjdGlvbiBtZW1vcnkgKi8KKwlmcm9tID0gInBoeXMtaW5zbiI7CisJcGh5cyA9IHRhcmdfaW5zbiB8IG9mZjsKKwl0byA9ICJjaGlwLWluc24iOworCWJyZWFrOworCisgICAgICBjYXNlIDB4MTI6IC8qIFBoeXNpY2FsIHVuaWZpZWQgbWVtb3J5ICovCisJZnJvbSA9ICJwaHlzLXVuaWZpZWQiOworCXBoeXMgPSB0YXJnX3VuaWZpZWQgfCBvZmY7CisJdG8gPSAidW5pZmllZCI7CisJYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisJcmV0dXJuICgwKTsKKyAgICAgIH0KKworCisgICp0YWRkciA9IHBoeXM7CisgIHJldHVybiBucl9ieXRlczsKK30KKworCit2b2lkCitfaW5pdGlhbGl6ZV9yZW1vdGVfZDEwdiAoKQoreworICByZW1vdGVfZDEwdl9vcHMudG9fc2hvcnRuYW1lID0gImQxMHYiOworICByZW1vdGVfZDEwdl9vcHMudG9fbG9uZ25hbWUgPSAiUmVtb3RlIGQxMHYgc2VyaWFsIHRhcmdldCBpbiBnZGItc3BlY2lmaWMgcHJvdG9jb2wiOworICByZW1vdGVfZDEwdl9vcHMudG9fZG9jID0gIlVzZSBhIHJlbW90ZSBkMTB2IHZpYSBhIHNlcmlhbCBsaW5lLCB1c2luZyBhIGdkYi1zcGVjaWZpYyBwcm90b2NvbC5cblwKK1NwZWNpZnkgdGhlIHNlcmlhbCBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvIChlLmcuIC9kZXYvdHR5YSkuIjsKKyAgcmVtb3RlX2QxMHZfb3BzLnRvX29wZW4gPSByZW1vdGVfZDEwdl9vcGVuOworCisgIGFkZF90YXJnZXQgKCZyZW1vdGVfZDEwdl9vcHMpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS1lNzAwMC5jIGIvZ2RiL3JlbW90ZS1lNzAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZTY5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmVtb3RlLWU3MDAwLmMKQEAgLTAsMCArMSwyMjU4IEBACisvKiBSZW1vdGUgZGVidWdnaW5nIGludGVyZmFjZSBmb3IgSGl0YWNoaSBFNzAwMCBJQ0UsIGZvciBHREIKKyAgIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuIAorCisgICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIGZvciBDeWdudXMgU3VwcG9ydC4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGUgRTcwMDAgaXMgYW4gaW4tY2lyY3VpdCBlbXVsYXRvciBmb3IgdGhlIEhpdGFjaGkgSDgvMzAwLUggYW5kCisgICBIaXRhY2hpLVNIIHByb2Nlc3Nvci4gIEl0IGhhcyBzZXJpYWwgcG9ydCBhbmQgYSBsYW4gcG9ydC4gIAorCisgICBUaGUgbW9uaXRvciBjb21tYW5kIHNldCBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gbG9hZCBsYXJnZSBhbW1vdW50cyBvZgorICAgZGF0YSBvdmVyIHRoZSBsYW4gd2l0aG91dCB1c2luZyBmdHAgLSBzbyB0cnkgbm90IHRvIGlzc3VlIGxvYWQKKyAgIGNvbW1hbmRzIHdoZW4gY29tbXVuaWNhdGluZyBvdmVyIGV0aGVybmV0OyB1c2UgdGhlIGZ0cGxvYWQgY29tbWFuZC4KKworICAgVGhlIG1vbml0b3IgcGF1c2VzIGZvciBhIHNlY29uZCB3aGVuIGR1bXBpbmcgc3JlY29yZHMgdG8gdGhlIHNlcmlhbAorICAgbGluZSB0b28sIHNvIHdlIHVzZSBhIHNsb3dlciBwZXIgYnl0ZSBtZWNoYW5pc20gYnV0IHdpdGhvdXQgdGhlCisgICBzdGFydHVwIG92ZXJoZWFkLiAgRXZlbiBzbywgaXQncyBwcmV0dHkgc2xvdy4uLiAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJnZGJhcmNoLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJ3YWl0LmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJjb21tYW5kLmgiCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgInNlcmlhbC5oIgorI2luY2x1ZGUgInJlbW90ZS11dGlscy5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworCisjaWYgMQorI2RlZmluZSBIQVJEX0JSRUFLUE9JTlRTCS8qIE5vdyBoYW5kbGVkIGJ5IHNldCBvcHRpb24uICovCisjZGVmaW5lIEJDX0JSRUFLUE9JTlRTIHVzZV9oYXJkX2JyZWFrcG9pbnRzCisjZW5kaWYKKworI2RlZmluZSBDVFJMQyAweDAzCisjZGVmaW5lIEVOUSAgMHgwNQorI2RlZmluZSBBQ0sgIDB4MDYKKyNkZWZpbmUgQ1RSTFogMHgxYQorCitleHRlcm4gdm9pZCBub3RpY2VfcXVpdCBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIHJlcG9ydF90cmFuc2Zlcl9wZXJmb3JtYW5jZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLAorCQkJCQkJIHRpbWVfdCwgdGltZV90KSk7CisKK2V4dGVybiBjaGFyICpzaF9wcm9jZXNzb3JfdHlwZTsKKworLyogTG9jYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zLiAgKi8KKworc3RhdGljIHZvaWQgZTcwMDBfY2xvc2UgUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyB2b2lkIGU3MDAwX2ZldGNoX3JlZ2lzdGVyIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgdm9pZCBlNzAwMF9zdG9yZV9yZWdpc3RlciBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIHZvaWQgZTcwMDBfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBlNzAwMF9sb2dpbl9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGU3MDAwX2Z0cF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGU3MDAwX2RyYWluX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgZXhwZWN0IFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgdm9pZCBleHBlY3RfZnVsbF9wcm9tcHQgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZCBleHBlY3RfcHJvbXB0IFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIGludCBlNzAwMF9wYXJzZV9kZXZpY2UgUEFSQU1TICgoY2hhciAqYXJncywgY2hhciAqZGV2X25hbWUsCisJCQkJICAgICAgIGludCBiYXVkcmF0ZSkpOworLyogVmFyaWFibGVzLiAqLworCitzdGF0aWMgc2VyaWFsX3QgZTcwMDBfZGVzYzsKKworLyogQWxsb3cgdXNlciB0byBjaG9zZSBiZXR3ZWVuIHVzaW5nIGhhcmR3YXJlIGJyZWFrcG9pbnRzIG9yIG1lbW9yeS4gKi8KK3N0YXRpYyBpbnQgdXNlX2hhcmRfYnJlYWtwb2ludHMgPSAwOyAvKiB1c2Ugc3cgYnJlYWtwb2ludHMgYnkgZGVmYXVsdCAqLworCisvKiBOb256ZXJvIGlmIHVzaW5nIHRoZSB0Y3Agc2VyaWFsIGRyaXZlci4gICovCisKK3N0YXRpYyBpbnQgdXNpbmdfdGNwOwkvKiBkaXJlY3QgdGNwIGNvbm5lY3Rpb24gdG8gdGFyZ2V0ICovCitzdGF0aWMgaW50IHVzaW5nX3RjcF9yZW1vdGU7CS8qIGluZGlyZWN0IGNvbm5lY3Rpb24gdG8gdGFyZ2V0IAorCQkJCSAgIHZpYSB0Y3AgdG8gY29udHJvbGxlciAqLworCisvKiBOb256ZXJvIGlmIHVzaW5nIHRoZSBwYyBpc2EgY2FyZC4gICovCisKK3N0YXRpYyBpbnQgdXNpbmdfcGM7CisKK2V4dGVybiBzdHJ1Y3QgdGFyZ2V0X29wcyBlNzAwMF9vcHM7CS8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KKworY2hhciAqRU5RU1RSSU5HID0gIlwwMDUiOworCisvKiBOb256ZXJvIGlmIHNvbWUgcm91dGluZSAoYXMgb3Bwb3NlZCB0byB0aGUgdXNlcikgd2FudHMgZWNob2luZy4KKyAgIEZJWE1FOiBEbyB0aGlzIHJlZW50cmFudGx5IHdpdGggYW4gZXh0cmEgcGFyYW1ldGVyLiAgKi8KKworc3RhdGljIGludCBlY2hvOworCitzdGF0aWMgaW50IGN0cmxfYzsKKworc3RhdGljIGludCB0aW1lb3V0ID0gMjA7CisKKy8qIFNlbmQgZGF0YSB0byBlNzAwMGRlYnVnLiAgKi8KKworc3RhdGljIHZvaWQKK3B1dHNfZTcwMDBkZWJ1ZyAoYnVmKQorICAgICBjaGFyICpidWY7Cit7CisgIGlmICghZTcwMDBfZGVzYykKKyAgICBlcnJvciAoIlVzZSBcInRhcmdldCBlNzAwMCAuLi5cIiBmaXJzdC4iKTsKKworICBpZiAocmVtb3RlX2RlYnVnKQorICAgIHByaW50Zl91bmZpbHRlcmVkICgiU2VuZGluZyAlc1xuIiwgYnVmKTsKKworICBpZiAoU0VSSUFMX1dSSVRFIChlNzAwMF9kZXNjLCBidWYsIHN0cmxlbiAoYnVmKSkpCisgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiU0VSSUFMX1dSSVRFIGZhaWxlZDogJXNcbiIsIHNhZmVfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgLyogQW5kIGV4cGVjdCB0byBzZWUgaXQgZWNob2VkLCB1bmxlc3MgdXNpbmcgdGhlIHBjIGludGVyZmFjZSAqLworI2lmIDAKKyAgaWYgKCF1c2luZ19wYykKKyNlbmRpZgorICAgIGV4cGVjdCAoYnVmKTsKK30KKworc3RhdGljIHZvaWQKK3B1dGNoYXJfZTcwMDAgKHgpCisgICAgIGludCB4OworeworICBjaGFyIGJbMV07CisKKyAgYlswXSA9IHg7CisgIFNFUklBTF9XUklURSAoZTcwMDBfZGVzYywgYiwgMSk7Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZV9lNzAwMCAocykKKyAgICAgY2hhciAqczsKK3sKKyAgU0VSSUFMX1dSSVRFIChlNzAwMF9kZXNjLCBzLCBzdHJsZW4gKHMpKTsKK30KKworc3RhdGljIGludAorbm9ybWFsICh4KQorICAgICBpbnQgeDsKK3sKKyAgaWYgKHggPT0gJ1xuJykKKyAgICByZXR1cm4gJ1xyJzsKKyAgcmV0dXJuIHg7Cit9CisKKy8qIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgcmVtb3RlIHN5c3RlbSwgZG9pbmcgYWxsIHRoZSBmYW5jeSB0aW1lb3V0CisgICBzdHVmZi4gIEhhbmRsZXMgc2VyaWFsIGVycm9ycyBhbmQgRU9GLiAgSWYgVElNRU9VVCA9PSAwLCBhbmQgbm8gY2hhcnMsCisgICByZXR1cm5zIC0xLCBlbHNlIHJldHVybnMgbmV4dCBjaGFyLiAgRGlzY2FyZHMgY2hhcnMgPiAxMjcuICAqLworCitzdGF0aWMgaW50CityZWFkY2hhciAodGltZW91dCkKKyAgICAgaW50IHRpbWVvdXQ7Cit7CisgIGludCBjOworCisgIGRvCisgICAgeworICAgICAgYyA9IFNFUklBTF9SRUFEQ0hBUiAoZTcwMDBfZGVzYywgdGltZW91dCk7CisgICAgfQorICB3aGlsZSAoYyA+IDEyNyk7CisKKyAgaWYgKGMgPT0gU0VSSUFMX1RJTUVPVVQpCisgICAgeworICAgICAgaWYgKHRpbWVvdXQgPT0gMCkKKwlyZXR1cm4gLTE7CisgICAgICBlY2hvID0gMDsKKyAgICAgIGVycm9yICgiVGltZW91dCByZWFkaW5nIGZyb20gcmVtb3RlIHN5c3RlbS4iKTsKKyAgICB9CisgIGVsc2UgaWYgKGMgPCAwKQorICAgIGVycm9yICgiU2VyaWFsIGNvbW11bmljYXRpb24gZXJyb3IiKTsKKworICBpZiAocmVtb3RlX2RlYnVnKSAKKyAgICB7CisgICAgICBwdXRjaGFyX3VuZmlsdGVyZWQgKGMpOworICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgICB9CisKKyAgcmV0dXJuIG5vcm1hbCAoYyk7Cit9CisKKyNpZiAwCitjaGFyICoKK3RsICh4KQoreworICBzdGF0aWMgY2hhciBiWzhdWzEwXTsKKyAgc3RhdGljIGludCBwOworCisgIHArKzsKKyAgcCAmPSA3OworICBpZiAoeCA+PSAnICcpIAorICAgIHsgCisgICAgICBiW3BdWzBdID0geDsKKyAgICAgIGJbcF1bMV0gPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNwcmludGYoYltwXSwgIjwlZD4iLCB4KTsKKyAgICB9CisKKyAgcmV0dXJuIGJbcF07Cit9CisjZW5kaWYKKworLyogU2NhbiBpbnB1dCBmcm9tIHRoZSByZW1vdGUgc3lzdGVtLCB1bnRpbCBTVFJJTkcgaXMgZm91bmQuICBJZgorICAgRElTQ0FSRCBpcyBub24temVybywgdGhlbiBkaXNjYXJkIG5vbi1tYXRjaGluZyBpbnB1dCwgZWxzZSBwcmludCBpdAorICAgb3V0LiAgTGV0IHRoZSB1c2VyIGJyZWFrIG91dCBpbW1lZGlhdGVseS4gICovCisKK3N0YXRpYyB2b2lkCitleHBlY3QgKHN0cmluZykKKyAgICAgY2hhciAqc3RyaW5nOworeworICBjaGFyICpwID0gc3RyaW5nOworICBpbnQgYzsKKyAgaW50IG5sID0gMDsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBjID0gcmVhZGNoYXIgKHRpbWVvdXQpOworI2lmIDAKKyAgICAgIG5vdGljZV9xdWl0ICgpOworICAgICAgaWYgKHF1aXRfZmxhZyA9PSAxKSAKKwl7CisJICBpZiAoY3RybF9jKQorCSAgICB7CisJICAgICAgcHV0Y2hhcl9lNzAwMChDVFJMQyk7CisJICAgICAgLS1jdHJsX2M7CisJICAgIH0KKwkgIGVsc2UgCisJICAgIHsKKwkgICAgICBxdWl0ICgpOworCSAgICB9CisJfQorI2VuZGlmCisgICAgICAKKyAgICAgIGlmIChlY2hvKQorCXsKKwkgIGlmIChjID09ICdccicgfHwgYyA9PSAnXG4nKQorCSAgICB7CisJICAgICAgaWYgKCFubCkKKwkJcHV0Y2hhcl91bmZpbHRlcmVkICgnXG4nKTsKKwkgICAgICBubCA9IDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG5sID0gMDsKKwkgICAgICBwdXRjaGFyX3VuZmlsdGVyZWQgKGMpOworCSAgICB9CisJICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCX0KKyAgICAgIGlmIChub3JtYWwgKGMpID09IG5vcm1hbCAoKnArKykpCisJeworCSAgaWYgKCpwID09ICdcMCcpCisJICAgIHJldHVybjsKKwl9CisgICAgICBlbHNlCisJeworCSAgcCA9IHN0cmluZzsKKworCSAgaWYgKG5vcm1hbCAoYykgPT0gbm9ybWFsIChzdHJpbmdbMF0pKQorCSAgICBwKys7CisJfQorICAgIH0KK30KKworLyogS2VlcCBkaXNjYXJkaW5nIGlucHV0IHVudGlsIHdlIHNlZSB0aGUgZTcwMDAgcHJvbXB0LgorCisgICBUaGUgY29udmVudGlvbiBmb3IgZGVhbGluZyB3aXRoIHRoZSBwcm9tcHQgaXMgdGhhdCB5b3UKKyAgIG8gZ2l2ZSB5b3VyIGNvbW1hbmQKKyAgIG8gKnRoZW4qIHdhaXQgZm9yIHRoZSBwcm9tcHQuCisKKyAgIFRodXMgdGhlIGxhc3QgdGhpbmcgdGhhdCBhIHByb2NlZHVyZSBkb2VzIHdpdGggdGhlIHNlcmlhbCBsaW5lIHdpbGwKKyAgIGJlIGFuIGV4cGVjdF9wcm9tcHQoKS4gIEV4Y2VwdGlvbjogZTcwMDBfcmVzdW1lIGRvZXMgbm90IHdhaXQgZm9yCisgICB0aGUgcHJvbXB0LCBiZWNhdXNlIHRoZSB0ZXJtaW5hbCBpcyBiZWluZyBoYW5kZWQgb3ZlciB0byB0aGUKKyAgIGluZmVyaW9yLiAgSG93ZXZlciwgdGhlIG5leHQgdGhpbmcgd2hpY2ggaGFwcGVucyBhZnRlciB0aGF0IGlzIGEKKyAgIGU3MDAwX3dhaXQgd2hpY2ggZG9lcyB3YWl0IGZvciB0aGUgcHJvbXB0LiAgTm90ZSB0aGF0IHRoaXMgaW5jbHVkZXMKKyAgIGFibm9ybWFsIGV4aXQsIGUuZy4gZXJyb3IoKS4gIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgZ2V0dGluZworICAgaW50byBzdGF0ZXMgZnJvbSB3aGljaCB3ZSBjYW4ndCByZWNvdmVyLiAgKi8KKworc3RhdGljIHZvaWQKK2V4cGVjdF9wcm9tcHQgKCkKK3sKKyAgZXhwZWN0ICgiOiIpOworfQorCitzdGF0aWMgdm9pZAorZXhwZWN0X2Z1bGxfcHJvbXB0ICgpCit7CisgIGV4cGVjdCAoIlxyOiIpOworfQorCitzdGF0aWMgaW50Citjb252ZXJ0X2hleF9kaWdpdCAoY2gpCisgICAgIGludCBjaDsKK3sKKyAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCisgICAgcmV0dXJuIGNoIC0gJzAnOworICBlbHNlIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKQorICAgIHJldHVybiBjaCAtICdBJyArIDEwOworICBlbHNlIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKQorICAgIHJldHVybiBjaCAtICdhJyArIDEwOworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9oZXggKHN0YXJ0KQorICAgICBpbnQgKnN0YXJ0OworeworICBpbnQgdmFsdWUgPSBjb252ZXJ0X2hleF9kaWdpdCAoKnN0YXJ0KTsKKyAgaW50IHRyeTsKKworICAqc3RhcnQgPSByZWFkY2hhciAodGltZW91dCk7CisgIHdoaWxlICgodHJ5ID0gY29udmVydF9oZXhfZGlnaXQgKCpzdGFydCkpID49IDApCisgICAgeworICAgICAgdmFsdWUgPDw9IDQ7CisgICAgICB2YWx1ZSArPSB0cnk7CisgICAgICAqc3RhcnQgPSByZWFkY2hhciAodGltZW91dCk7CisgICAgfQorICByZXR1cm4gdmFsdWU7Cit9CisKKyNpZiAwCisvKiBHZXQgTiAzMi1iaXQgd29yZHMgZnJvbSByZW1vdGUsIGVhY2ggcHJlY2VkZWQgYnkgYSBzcGFjZSwgYW5kIHB1dAorICAgdGhlbSBpbiByZWdpc3RlcnMgc3RhcnRpbmcgYXQgUkVHTk8uICAqLworCitzdGF0aWMgdm9pZAorZ2V0X2hleF9yZWdzIChuLCByZWdubykKKyAgICAgaW50IG47CisgICAgIGludCByZWdubzsKK3sKKyAgbG9uZyB2YWw7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgaW50IGo7CisKKyAgICAgIHZhbCA9IDA7CisgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCXZhbCA9ICh2YWwgPDwgNCkgKyBnZXRfaGV4X2RpZ2l0IChqID09IDApOworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubysrLCAoY2hhciAqKSAmdmFsKTsKKyAgICB9Cit9CisjZW5kaWYKKworLyogVGhpcyBpcyBjYWxsZWQgbm90IG9ubHkgd2hlbiB3ZSBmaXJzdCBhdHRhY2gsIGJ1dCBhbHNvIHdoZW4gdGhlCisgICB1c2VyIHR5cGVzICJydW4iIGFmdGVyIGhhdmluZyBhdHRhY2hlZC4gICovCisKK3N0YXRpYyB2b2lkCitlNzAwMF9jcmVhdGVfaW5mZXJpb3IgKGV4ZWNmaWxlLCBhcmdzLCBlbnYpCisgICAgIGNoYXIgKmV4ZWNmaWxlOworICAgICBjaGFyICphcmdzOworICAgICBjaGFyICoqZW52OworeworICBpbnQgZW50cnlfcHQ7CisKKyAgaWYgKGFyZ3MgJiYgKmFyZ3MpCisgICAgZXJyb3IgKCJDYW4ndCBwYXNzIGFyZ3VtZW50cyB0byByZW1vdGUgRTcwMDBERUJVRyBwcm9jZXNzIik7CisKKyAgaWYgKGV4ZWNmaWxlID09IDAgfHwgZXhlY19iZmQgPT0gMCkKKyAgICBlcnJvciAoIk5vIGV4ZWN1dGFibGUgZmlsZSBzcGVjaWZpZWQiKTsKKworICBlbnRyeV9wdCA9IChpbnQpIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoZXhlY19iZmQpOworCisjaWZkZWYgQ1JFQVRFX0lORkVSSU9SX0hPT0sKKyAgQ1JFQVRFX0lORkVSSU9SX0hPT0sgKDApOwkvKiBObyBwcm9jZXNzLUlEICovCisjZW5kaWYKKworICAvKiBUaGUgInByb2Nlc3MiIChib2FyZCkgaXMgYWxyZWFkeSBzdG9wcGVkIGF3YWl0aW5nIG91ciBjb21tYW5kcywgYW5kCisgICAgIHRoZSBwcm9ncmFtIGlzIGFscmVhZHkgZG93bmxvYWRlZC4gIFdlIGp1c3Qgc2V0IGl0cyBQQyBhbmQgZ28uICAqLworCisgIGNsZWFyX3Byb2NlZWRfc3RhdHVzICgpOworCisgIC8qIFRlbGwgd2FpdF9mb3JfaW5mZXJpb3IgdGhhdCB3ZSd2ZSBzdGFydGVkIGEgbmV3IHByb2Nlc3MuICAqLworICBpbml0X3dhaXRfZm9yX2luZmVyaW9yICgpOworCisgIC8qIFNldCB1cCB0aGUgInNhdmVkIHRlcm1pbmFsIG1vZGVzIiBvZiB0aGUgaW5mZXJpb3IKKyAgICAgYmFzZWQgb24gd2hhdCBtb2RlcyB3ZSBhcmUgc3RhcnRpbmcgaXQgd2l0aC4gICovCisgIHRhcmdldF90ZXJtaW5hbF9pbml0ICgpOworCisgIC8qIEluc3RhbGwgaW5mZXJpb3IncyB0ZXJtaW5hbCBtb2Rlcy4gICovCisgIHRhcmdldF90ZXJtaW5hbF9pbmZlcmlvciAoKTsKKworICAvKiBpbnNlcnRfc3RlcF9icmVha3BvaW50ICgpOyAgRklYTUUsIGRvIHdlIG5lZWQgdGhpcz8gICovCisgIHByb2NlZWQgKChDT1JFX0FERFIpIGVudHJ5X3B0LCAtMSwgMCk7CS8qIExldCAnZXIgcmlwLi4uICovCit9CisKKy8qIE9wZW4gYSBjb25uZWN0aW9uIHRvIGEgcmVtb3RlIGRlYnVnZ2VyLiAgTkFNRSBpcyB0aGUgZmlsZW5hbWUgdXNlZAorICAgZm9yIGNvbW11bmljYXRpb24uICAqLworCitzdGF0aWMgaW50IGJhdWRyYXRlID0gOTYwMDsKK3N0YXRpYyBjaGFyIGRldl9uYW1lWzEwMF07CisKK3N0YXRpYyBjaGFyICptYWNoaW5lID0gIiI7CitzdGF0aWMgY2hhciAqdXNlciA9ICIiOworc3RhdGljIGNoYXIgKnBhc3N3ZCA9ICIiOworc3RhdGljIGNoYXIgKmRpciA9ICIiOworCisvKiBHcmFiIHRoZSBuZXh0IHRva2VuIGFuZCBidXkgc29tZSBzcGFjZSBmb3IgaXQgKi8KKworc3RhdGljIGNoYXIgKgorbmV4dCAocHRyKQorICAgICBjaGFyICoqcHRyOworeworICBjaGFyICpwID0gKnB0cjsKKyAgY2hhciAqczsKKyAgY2hhciAqcjsKKyAgaW50IGwgPSAwOworCisgIHdoaWxlICgqcCAmJiAqcCA9PSAnICcpCisgICAgcCsrOworICBzID0gcDsKKyAgd2hpbGUgKCpwICYmICgqcCAhPSAnICcgJiYgKnAgIT0gJ1x0JykpCisgICAgeworICAgICAgbCsrOworICAgICAgcCsrOworICAgIH0KKyAgciA9IHhtYWxsb2MgKGwgKyAxKTsKKyAgbWVtY3B5IChyLCBzLCBsKTsKKyAgcltsXSA9IDA7CisgICpwdHIgPSBwOworICByZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQKK2U3MDAwX2xvZ2luX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGlmIChhcmdzKQorICAgIHsKKyAgICAgIG1hY2hpbmUgPSBuZXh0ICgmYXJncyk7CisgICAgICB1c2VyID0gbmV4dCAoJmFyZ3MpOworICAgICAgcGFzc3dkID0gbmV4dCAoJmFyZ3MpOworICAgICAgZGlyID0gbmV4dCAoJmFyZ3MpOworICAgICAgaWYgKGZyb21fdHR5KQorCXsKKwkgIHByaW50Zl91bmZpbHRlcmVkICgiU2V0IGluZm8gdG8gJXMgJXMgJXMgJXNcbiIsIG1hY2hpbmUsIHVzZXIsIHBhc3N3ZCwgZGlyKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZXJyb3IgKCJTeW50YXggaXMgZnRwbG9naW4gPG1hY2hpbmU+IDx1c2VyPiA8cGFzc3dkPiA8ZGlyZWN0b3J5PiIpOworICAgIH0KK30KKworLyogU3RhcnQgYW4gZnRwIHRyYW5zZmVyIGZyb20gdGhlIEU3MDAwIHRvIGEgaG9zdCAqLworCitzdGF0aWMgdm9pZAorZTcwMDBfZnRwX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIC8qIEZJWE1FOiBhcmJpdHJhcnkgbGltaXQgb24gbWFjaGluZSBuYW1lcyBhbmQgc3VjaC4gICovCisgIGNoYXIgYnVmWzIwMF07CisKKyAgaW50IG9sZHRpbWVvdXQgPSB0aW1lb3V0OworICB0aW1lb3V0ID0gcmVtb3RlX3RpbWVvdXQ7CisKKyAgc3ByaW50ZiAoYnVmLCAiZnRwICVzXHIiLCBtYWNoaW5lKTsKKyAgcHV0c19lNzAwMGRlYnVnIChidWYpOworICBleHBlY3QgKCIgVXNlcm5hbWUgOiAiKTsKKyAgc3ByaW50ZiAoYnVmLCAiJXNcciIsIHVzZXIpOworICBwdXRzX2U3MDAwZGVidWcgKGJ1Zik7CisgIGV4cGVjdCAoIiBQYXNzd29yZCA6ICIpOworICB3cml0ZV9lNzAwMCAocGFzc3dkKTsKKyAgd3JpdGVfZTcwMDAgKCJcciIpOworICBleHBlY3QgKCJzdWNjZXNzXHIiKTsKKyAgZXhwZWN0ICgiRlRQPiIpOworICBzcHJpbnRmIChidWYsICJjZCAlc1xyIiwgZGlyKTsKKyAgcHV0c19lNzAwMGRlYnVnIChidWYpOworICBleHBlY3QgKCJGVFA+Iik7CisgIHNwcmludGYgKGJ1ZiwgImxsIDA7czolc1xyIiwgYXJncyk7CisgIHB1dHNfZTcwMDBkZWJ1ZyAoYnVmKTsKKyAgZXhwZWN0ICgiRlRQPiIpOworICBwdXRzX2U3MDAwZGVidWcgKCJieWVcciIpOworICBleHBlY3QgKCI6Iik7CisgIHRpbWVvdXQgPSBvbGR0aW1lb3V0OworfQorCitzdGF0aWMgaW50IAorZTcwMDBfcGFyc2VfZGV2aWNlIChhcmdzLCBkZXZfbmFtZSwgYmF1ZHJhdGUpIAorICAgIGNoYXIgKmFyZ3M7CisgICAgY2hhciAqZGV2X25hbWU7CisgICAgaW50IGJhdWRyYXRlOworeworICBjaGFyIGp1bmtbMTI4XTsKKyAgaW50IG4gPSAwOworICBpZiAoYXJncyAmJiBzdHJjYXNlY21wIChhcmdzLCAicGMiKSA9PSAwKQorICAgIHsKKyAgICAgIHN0cmNweSAoZGV2X25hbWUsIGFyZ3MpOworICAgICAgdXNpbmdfcGMgPSAxOworICAgIH0KKyAgZWxzZSAKKyAgICB7CisgICAgICAvKiBGSVhNRSEgdGVtcCBoYWNrIHRvIGFsbG93IHVzZSB3aXRoIHBvcnQgbWFzdGVyIC0KKwkgICAgIHRhcmdldCB0Y3BfcmVtb3RlIDxkZXZpY2U+ICovCisgICAgICBpZiAoYXJncyAmJiBzdHJuY21wIChhcmdzLCAidGNwIiwgMTApID09IDApIAorICAgICAgICB7CisJICBjaGFyIGNvbV90eXBlWzEyOF07CisJICBuID0gc3NjYW5mIChhcmdzLCAiICVzICVzICVkICVzIiwgY29tX3R5cGUsIGRldl9uYW1lLCAmYmF1ZHJhdGUsIGp1bmspOworCSAgdXNpbmdfdGNwX3JlbW90ZT0xOworCSAgbi0tOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChhcmdzKSAKKwl7CisJICBuID0gc3NjYW5mIChhcmdzLCAiICVzICVkICVzIiwgZGV2X25hbWUsICZiYXVkcmF0ZSwganVuayk7CisJfQorCisgICAgICBpZiAobiAhPSAxICYmIG4gIT0gMikKKwl7CisJICBlcnJvciAoIkJhZCBhcmd1bWVudHMuICBVc2FnZTpcdHRhcmdldCBlNzAwMCA8ZGV2aWNlPiA8c3BlZWQ+XG5cCitvciBcdFx0dGFyZ2V0IGU3MDAwIDxob3N0Pls6PHBvcnQ+XVxuXAorb3IgXHRcdHRhcmdldCBlNzAwMCB0Y3BfcmVtb3RlIDxob3N0Pls6PHBvcnQ+XVxuXAorb3IgXHRcdHRhcmdldCBlNzAwMCBwY1xuIik7CisJfQorCisjaWYgIWRlZmluZWQoX19HTzMyX18pICYmICFkZWZpbmVkKF9XSU4zMikKKyAgICAgIC8qIEZJWE1FISAgdGVzdCBmb3IgJzonIGlzIGFtYmlndW91cyAqLworICAgICAgaWYgKG4gPT0gMSAmJiBzdHJjaHIgKGRldl9uYW1lLCAnOicpID09IDApCisJeworCSAgLyogRGVmYXVsdCB0byBub3JtYWwgdGVsbmV0IHBvcnQgKi8KKwkgIC8qIHNlcmlhbF9vcGVuIHdpbGwgdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIHRjcCBjb21tdW5pY2F0aW9uICovCisJICBzdHJjYXQgKGRldl9uYW1lLCAiOjIzIik7CisJfQorI2VuZGlmCisgICAgICBpZiAoIXVzaW5nX3RjcF9yZW1vdGUgJiYgc3RyY2hyIChkZXZfbmFtZSwgJzonKSkKKyAgICAgICAgdXNpbmdfdGNwID0gMTsKKyAgICB9CisKKyAgcmV0dXJuIG47Cit9CisKKy8qIFN0dWIgZm9yIGNhdGNoX2Vycm9ycy4gICovCisKK3N0YXRpYyBpbnQKK2U3MDAwX3N0YXJ0X3JlbW90ZSAoZHVtbXkpCisgICAgIGNoYXIgKmR1bW15OworeworICBpbnQgbG9vcDsKKyAgaW50IHN5bmM7CisgIGludCB0cnk7CisgIGludCBxdWl0X3RyeWluZzsKKworICBpbW1lZGlhdGVfcXVpdCA9IDE7CQkvKiBBbGxvdyB1c2VyIHRvIGludGVycnVwdCBpdCAqLworCisgIC8qIEhlbGxvPyAgQXJlIHlvdSB0aGVyZT8gICovCisgIHN5bmMgPSAwOworICBsb29wID0gIDA7CisgIHRyeSA9IDA7CisgIHF1aXRfdHJ5aW5nID0gMjA7CisgIHB1dGNoYXJfZTcwMDAgKENUUkxDKTsKKyAgd2hpbGUgKCFzeW5jICYmICsrdHJ5IDw9IHF1aXRfdHJ5aW5nKQorICAgIHsKKyAgICAgIGludCBjOworCisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIlt3YWl0aW5nIGZvciBlNzAwMC4uLl1cbiIpOworCisgICAgICB3cml0ZV9lNzAwMCAoIlxyIik7CisgICAgICBjID0gcmVhZGNoYXIgKDEpOworCisgICAgICAvKiBGSVhNRSEgIHRoaXMgZGlkbid0IHNlZW0gcmlnaHQtPiAgd2hpbGUgKGMgIT0gU0VSSUFMX1RJTUVPVVQpCisgICAgICAgKiB3ZSBnZXQgc3R1Y2sgaW4gdGhpcyBsb29wIC4uLgorICAgICAgICogV2UgbWF5IG5ldmVyIHRpbWVvdXQsIGFuZCBuZXZlciBzeW5jIHVwIDotKAorICAgICAgICovCisgICAgICB3aGlsZSAoIXN5bmMgJiYgYyAhPSAtMSkKKwl7CisJICAvKiBEb250IGVjaG8gY3IncyAqLworCSAgaWYgKGMgIT0gJ1xyJykKKwkgICAgeworCSAgICAgIHB1dGNoYXJfdW5maWx0ZXJlZCAoYyk7CisJICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwkgICAgfQorCSAgLyogU2hvdWxkbid0IHdlIGVpdGhlciBicmVhayBoZXJlLCBvciBjaGVjayBmb3Igc3luYyBpbiBpbm5lciBsb29wPyAqLworCSAgaWYgKGMgPT0gJzonKQorCSAgICBzeW5jID0gMTsKKworCSAgaWYgKGxvb3ArKyA9PSAyMCkgCisJICAgIHsKKwkgICAgICBwdXRjaGFyX2U3MDAwIChDVFJMQyk7CisJICAgICAgbG9vcCA9IDA7CisJICAgIH0KKworCSAgUVVJVCA7CisKKwkgIGlmIChxdWl0X2ZsYWcpCisJICAgIHsKKwkgICAgICBwdXRjaGFyX2U3MDAwIChDVFJMQyk7CisJICAgICAgLyogV2FzLT4gcXVpdF9mbGFnID0gMDsgKi8KKwkgICAgICBjID0gLTE7CisJICAgICAgcXVpdF90cnlpbmcgPSB0cnkrMTsgIC8qIHdlIGRvbid0IHdhbnQgdG8gdHJ5IGFueW1vcmUgKi8KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgYyA9IHJlYWRjaGFyICgxKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKCFzeW5jKQorICAgIHsKKyAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIkdpdmluZyB1cCBhZnRlciAlZCB0cmllcy4uLlxuIix0cnkpOworICAgICAgZXJyb3IgKCJVbmFibGUgdG8gc3luY3Jvbml6ZSB3aXRoIHRhcmdldC5cbiIpOworICAgIH0KKworICBwdXRzX2U3MDAwZGVidWcgKCJcciIpOworICBleHBlY3RfcHJvbXB0ICgpOworICBwdXRzX2U3MDAwZGVidWcgKCJiIC1cciIpOwkvKiBDbGVhciBicmVha3BvaW50cyAqLworICBleHBlY3RfcHJvbXB0ICgpOworCisgIGltbWVkaWF0ZV9xdWl0ID0gMDsKKworLyogVGhpcyBpcyByZWFsbHkgdGhlIGpvYiBvZiBzdGFydF9yZW1vdGUgaG93ZXZlciwgdGhhdCBtYWtlcyBhbiBhc3N1bXB0aW9uCisgICB0aGF0IHRoZSB0YXJnZXQgaXMgYWJvdXQgdG8gcHJpbnQgb3V0IGEgc3RhdHVzIG1lc3NhZ2Ugb2Ygc29tZSBzb3J0LiAgVGhhdAorICAgZG9lc24ndCBoYXBwZW4gaGVyZS4gKi8KKworICBmbHVzaF9jYWNoZWRfZnJhbWVzICgpOworICByZWdpc3RlcnNfY2hhbmdlZCAoKTsKKyAgc3RvcF9wYyA9IHJlYWRfcGMgKCk7CisgIHNldF9jdXJyZW50X2ZyYW1lIChjcmVhdGVfbmV3X2ZyYW1lIChyZWFkX2ZwICgpLCBzdG9wX3BjKSk7CisgIHNlbGVjdF9mcmFtZSAoZ2V0X2N1cnJlbnRfZnJhbWUgKCksIDApOworICBwcmludF9zdGFja19mcmFtZSAoc2VsZWN0ZWRfZnJhbWUsIC0xLCAxKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK2U3MDAwX29wZW4gKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGludCBuOworCisgIHRhcmdldF9wcmVvcGVuIChmcm9tX3R0eSk7CisKKyAgbiA9IGU3MDAwX3BhcnNlX2RldmljZSAoYXJncywgZGV2X25hbWUsIGJhdWRyYXRlKTsKKworICBwdXNoX3RhcmdldCAoJmU3MDAwX29wcyk7CisKKyAgZTcwMDBfZGVzYyA9IFNFUklBTF9PUEVOIChkZXZfbmFtZSk7CisKKyAgaWYgKCFlNzAwMF9kZXNjKQorICAgIHBlcnJvcl93aXRoX25hbWUgKGRldl9uYW1lKTsKKworICBTRVJJQUxfU0VUQkFVRFJBVEUgKGU3MDAwX2Rlc2MsIGJhdWRyYXRlKTsKKyAgU0VSSUFMX1JBVyAoZTcwMDBfZGVzYyk7CisKKyNpZmRlZiBHREJfVEFSR0VUX0lTX0g4MzAwCisgIGg4MzAwaG1vZGUgPSAxOworI2VuZGlmCisKKyAgLyogU3RhcnQgdGhlIHJlbW90ZSBjb25uZWN0aW9uOyBpZiBlcnJvciAoMCksIGRpc2NhcmQgdGhpcyB0YXJnZXQuCisgICAgIEluIHBhcnRpY3VsYXIsIGlmIHRoZSB1c2VyIHF1aXRzLCBiZSBzdXJlIHRvIGRpc2NhcmQgaXQKKyAgICAgKHdlJ2QgYmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlIG90aGVyd2lzZSkuICAqLworICBpZiAoIWNhdGNoX2Vycm9ycyAoZTcwMDBfc3RhcnRfcmVtb3RlLCAoY2hhciAqKTAsIAorCQkgICAgICJDb3VsZG4ndCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byByZW1vdGUgdGFyZ2V0XG4iLCBSRVRVUk5fTUFTS19BTEwpKQorICBpZiAoZnJvbV90dHkpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiUmVtb3RlIHRhcmdldCAlcyBjb25uZWN0ZWQgdG8gJXNcbiIsIHRhcmdldF9zaG9ydG5hbWUsCisJCSAgICAgZGV2X25hbWUpOworfQorCisvKiBDbG9zZSBvdXQgYWxsIGZpbGVzIGFuZCBsb2NhbCBzdGF0ZSBiZWZvcmUgdGhpcyB0YXJnZXQgbG9zZXMgY29udHJvbC4gKi8KKworc3RhdGljIHZvaWQKK2U3MDAwX2Nsb3NlIChxdWl0dGluZykKKyAgICAgaW50IHF1aXR0aW5nOworeworICBpZiAoZTcwMDBfZGVzYykKKyAgICB7CisgICAgICBTRVJJQUxfQ0xPU0UgKGU3MDAwX2Rlc2MpOworICAgICAgZTcwMDBfZGVzYyA9IDA7CisgICAgfQorfQorCisvKiBUZXJtaW5hdGUgdGhlIG9wZW4gY29ubmVjdGlvbiB0byB0aGUgcmVtb3RlIGRlYnVnZ2VyLiAgVXNlIHRoaXMKKyAgIHdoZW4geW91IHdhbnQgdG8gZGV0YWNoIGFuZCBkbyBzb21ldGhpbmcgZWxzZSB3aXRoIHlvdXIgZ2RiLiAgKi8KKworc3RhdGljIHZvaWQKK2U3MDAwX2RldGFjaCAoZnJvbV90dHkpCisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcG9wX3RhcmdldCAoKTsJCS8qIGNhbGxzIGU3MDAwX2Nsb3NlIHRvIGRvIHRoZSByZWFsIHdvcmsgKi8KKyAgaWYgKGZyb21fdHR5KQorICAgIHByaW50Zl91bmZpbHRlcmVkICgiRW5kaW5nIHJlbW90ZSAlcyBkZWJ1Z2dpbmdcbiIsIHRhcmdldF9zaG9ydG5hbWUpOworfQorCisvKiBUZWxsIHRoZSByZW1vdGUgbWFjaGluZSB0byByZXN1bWUuICAqLworCitzdGF0aWMgdm9pZAorZTcwMDBfcmVzdW1lIChwaWQsIHN0ZXAsIHNpZykKKyAgICAgaW50IHBpZCwgc3RlcCwgc2lnOworeworICBpZiAoc3RlcCkKKyAgICBwdXRzX2U3MDAwZGVidWcgKCJTXHIiKTsKKyAgZWxzZQorICAgIHB1dHNfZTcwMDBkZWJ1ZyAoIkdcciIpOworfQorCisvKiBSZWFkIHRoZSByZW1vdGUgcmVnaXN0ZXJzIGludG8gdGhlIGJsb2NrIFJFR1MuICAKKworICAgRm9yIHRoZSBIOC8zMDAgYSByZWdpc3RlciBkdW1wIGxvb2tzIGxpa2U6CisKKyAgIFBDPTAwMDIxQSAgQ0NSPTgwOkkqKioqKioqCisgICBFUjAgLSBFUjMgIDAwMDAwMDBBIDAwMDAwMDJFIDAwMDAwMDJFIDAwMDAwMDAwCisgICBFUjQgLSBFUjcgIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwRkZFRkY2CisgICAwMDAyMTggICAgICAgICAgIE1PVi5CICAgICBSMUwsUjJMCisgICBTVEVQIE5PUk1BTCBFTkQgb3IKKyAgIEJSRUFLIFBPSU5UCisgICAqLworCisjaWZkZWYgR0RCX1RBUkdFVF9JU19IODMwMAorCitjaGFyICp3YW50X2g4MzAwaCA9ICJQQz0lcCBDQ1I9JWNcblwKKyBFUjAgLSBFUjMgICUwICUxICUyICUzXG5cCisgRVI0IC0gRVI3ICAlNCAlNSAlNiAlN1xuIjsKKworY2hhciAqd2FudF9ub3BjX2g4MzAwaCA9ICIlcCBDQ1I9JWNcblwKKyBFUjAgLSBFUjMgICUwICUxICUyICUzXG5cCisgRVI0IC0gRVI3ICAlNCAlNSAlNiAlNyI7CisKK2NoYXIgKndhbnRfaDgzMDBzID0gIlBDPSVwIENDUj0lY1xuXAorIE1BQ0g9XG5cCisgRVIwIC0gRVIzICAlMCAlMSAlMiAlM1xuXAorIEVSNCAtIEVSNyAgJTQgJTUgJTYgJTdcbiI7CisKK2NoYXIgKndhbnRfbm9wY19oODMwMHMgPSAiJXAgQ0NSPSVjIEVYUj0lOVxuXAorIEVSMCAtIEVSMyAgJTAgJTEgJTIgJTNcblwKKyBFUjQgLSBFUjcgICU0ICU1ICU2ICU3IjsKKworI2VuZGlmCisKKyNpZmRlZiBHREJfVEFSR0VUX0lTX1NICisKK2NoYXIgKndhbnQgPSAiUEM9JTE2IFNSPSUyMlxuXAorUFI9JTE3IEdCUj0lMTggVkJSPSUxOVxuXAorTUFDSD0lMjAgTUFDTD0lMjFcblwKK1IwLTcgICUwICUxICUyICUzICU0ICU1ICU2ICU3XG5cCitSOC0xNSAlOCAlOSAlMTAgJTExICUxMiAlMTMgJTE0ICUxNVxuIjsKKworY2hhciAqd2FudF9ub3BjID0gIiUxNiBTUj0lMjJcblwKKyBQUj0lMTcgR0JSPSUxOCBWQlI9JTE5XG5cCisgTUFDSD0lMjAgTUFDTD0lMjFcblwKKyBSMC03ICAlMCAlMSAlMiAlMyAlNCAlNSAlNiAlN1xuXAorIFI4LTE1ICU4ICU5ICUxMCAlMTEgJTEyICUxMyAlMTQgJTE1IjsKKworY2hhciAqd2FudF9zaDMgPSAiUEM9JTE2IFNSPSUyMlxuXAorUFI9JTE3IEdCUj0lMTggVkJSPSUxOVxuXAorTUFDSD0lMjAgTUFDTD0lMjEgU1NSPSUyMyBTUEM9JTI0XG5cCitSMC03ICAlMCAlMSAlMiAlMyAlNCAlNSAlNiAlN1xuXAorUjgtMTUgJTggJTkgJTEwICUxMSAlMTIgJTEzICUxNCAlMTVcblwKK1IwX0JBTkswLVIzX0JBTkswICUyNSAlMjYgJTI3ICUyOFxuXAorUjRfQkFOSzAtUjdfQkFOSzAgJTI5ICUzMCAlMzEgJTMyXG5cCitSMF9CQU5LMS1SM19CQU5LMSAlMzMgJTM0ICUzNSAlMzZcblwKK1I0X0JBTksxLVI3X0JBTksxICUzNyAlMzggJTM5ICU0MCI7CisKK2NoYXIgKndhbnRfc2gzX25vcGMgPSAiJTE2IFNSPSUyMlxuXAorIFBSPSUxNyBHQlI9JTE4IFZCUj0lMTlcblwKKyBNQUNIPSUyMCBNQUNMPSUyMSBTU1I9JTIyIFNQQz0lMjNcblwKKyBSMC03ICAlMCAlMSAlMiAlMyAlNCAlNSAlNiAlN1xuXAorIFI4LTE1ICU4ICU5ICUxMCAlMTEgJTEyICUxMyAlMTQgJTE1XG5cCisgUjBfQkFOSzAtUjNfQkFOSzAgJTI1ICUyNiAlMjcgJTI4XG5cCisgUjRfQkFOSzAtUjdfQkFOSzAgJTI5ICUzMCAlMzEgJTMyXG5cCisgUjBfQkFOSzEtUjNfQkFOSzEgJTMzICUzNCAlMzUgJTM2XG5cCisgUjRfQkFOSzEtUjdfQkFOSzEgJTM3ICUzOCAlMzkgJTQwIjsKKworI2VuZGlmCisKK3N0YXRpYyBpbnQKK2djaCAoKQoreworICByZXR1cm4gcmVhZGNoYXIgKHRpbWVvdXQpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitnYnl0ZSAoKQoreworICBpbnQgaGlnaCA9IGNvbnZlcnRfaGV4X2RpZ2l0IChnY2ggKCkpOworICBpbnQgbG93ID0gY29udmVydF9oZXhfZGlnaXQgKGdjaCAoKSk7CisKKyAgcmV0dXJuIChoaWdoIDw8IDQpICsgbG93OworfQorCit2b2lkCitmZXRjaF9yZWdzX2Zyb21fZHVtcCAobmV4dGNoYXIsIHdhbnQpCisgICAgIGludCAoKm5leHRjaGFyKSgpOworICAgICBjaGFyICp3YW50OworeworICBpbnQgcmVnbm87CisgIGNoYXIgYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisKKyAgaW50IHRoaXNjaGFyID0gbmV4dGNoYXIgKCk7CisKKyAgd2hpbGUgKCp3YW50KQorICAgIHsKKyAgICAgIHN3aXRjaCAoKndhbnQpCisJeworCWNhc2UgJ1xuJzoKKwkgIC8qIFNraXAgdG8gZW5kIG9mIGxpbmUgYW5kIHRoZW4gZWF0IGFsbCBuZXcgbGluZSB0eXBlIHN0dWZmICovCisJICB3aGlsZSAodGhpc2NoYXIgIT0gJ1xuJyAmJiB0aGlzY2hhciAhPSAnXHInKSAKKwkgICAgdGhpc2NoYXIgPSBuZXh0Y2hhciAoKTsKKwkgIHdoaWxlICh0aGlzY2hhciA9PSAnXG4nIHx8IHRoaXNjaGFyID09ICdccicpIAorCSAgICB0aGlzY2hhciA9IG5leHRjaGFyICgpOworCSAgd2FudCsrOworCSAgYnJlYWs7CisKKwljYXNlICcgJzoKKwkgIHdoaWxlICh0aGlzY2hhciA9PSAnICcKKwkJIHx8IHRoaXNjaGFyID09ICdcdCcKKwkJIHx8IHRoaXNjaGFyID09ICdccicKKwkJIHx8IHRoaXNjaGFyID09ICdcbicpCisJICAgIHRoaXNjaGFyID0gbmV4dGNoYXIgKCk7CisJICB3YW50Kys7CisJICBicmVhazsKKwkgIAorCWRlZmF1bHQ6CisJICBpZiAoKndhbnQgPT0gdGhpc2NoYXIpCisJICAgIHsKKwkgICAgICB3YW50Kys7CisJICAgICAgaWYgKCp3YW50KQorCQl0aGlzY2hhciA9IG5leHRjaGFyICgpOworCSAgICAgIAorCSAgICB9CisJICBlbHNlIGlmICh0aGlzY2hhciA9PSAnICcgfHwgdGhpc2NoYXIgPT0gJ1xuJyB8fCB0aGlzY2hhciA9PSAnXHInKQorCSAgICB7CisJICAgICAgdGhpc2NoYXIgPSBuZXh0Y2hhciAoKTsKKwkgICAgfQorCSAgZWxzZSB7CisJICAgIGVycm9yICgib3V0IG9mIHN5bmMgaW4gZmV0Y2ggcmVnaXN0ZXJzIHdhbnRlZCA8JXM+LCBnb3QgPCVjIDB4JXg+IiwKKwkJICAgd2FudCwgdGhpc2NoYXIsIHRoaXNjaGFyKTsKKwkgIH0KKyAgICAKKwkgIGJyZWFrOworCWNhc2UgJyUnOgorCSAgLyogR290IGEgcmVnaXN0ZXIgY29tbWFuZCAqLworCSAgd2FudCsrOworCSAgc3dpdGNoICgqd2FudCkKKwkgICAgeworI2lmZGVmIFBDX1JFR05VTQorCSAgICBjYXNlICdwJzoKKwkgICAgICByZWdubyA9IFBDX1JFR05VTTsKKwkgICAgICB3YW50Kys7CisJICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDQ1JfUkVHTlVNCisJICAgIGNhc2UgJ2MnOgorCSAgICAgIHJlZ25vID0gQ0NSX1JFR05VTTsKKwkgICAgICB3YW50Kys7CisJICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBTUF9SRUdOVU0KKwkgICAgY2FzZSAncyc6CisJICAgICAgcmVnbm8gPSBTUF9SRUdOVU07CisJICAgICAgd2FudCsrOworCSAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRlBfUkVHTlVNCisJICAgIGNhc2UgJ2YnOgorCSAgICAgIHJlZ25vID0gRlBfUkVHTlVNOworCSAgICAgIHdhbnQrKzsKKwkgICAgICBicmVhazsKKyNlbmRpZgorCisJICAgIGRlZmF1bHQ6CisJICAgICAgaWYgKGlzZGlnaXQgKHdhbnRbMF0pKSAKKwkJeworCQkgIGlmIChpc2RpZ2l0ICh3YW50WzFdKSkKKwkJICAgIHsKKwkJICAgICAgcmVnbm8gPSAod2FudFswXSAtICcwJykgKiAxMCArIHdhbnRbMV0gLSAnMCc7CisJCSAgICAgIHdhbnQgKz0gMjsKKwkJICAgIH0KKwkJICBlbHNlIAorCQkgICAgeworCQkgICAgICByZWdubyA9IHdhbnRbMF0gLSAnMCc7CisJCSAgICAgIHdhbnQrKzsKKwkJICAgIH0KKwkJfQorCSAgICAgIAorCSAgICAgIGVsc2UKKwkJYWJvcnQgKCk7CisJICAgIH0KKwkgIHN0b3JlX3NpZ25lZF9pbnRlZ2VyIChidWYsCisJCQkJUkVHSVNURVJfUkFXX1NJWkUocmVnbm8pLAorCQkJCShMT05HRVNUKSBnZXRfaGV4ICgmdGhpc2NoYXIsIG5leHRjaGFyKSk7CisJICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCBidWYpOworCSAgYnJlYWs7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK2U3MDAwX2ZldGNoX3JlZ2lzdGVycyAoKQoreworICBpbnQgcmVnbm87CisgIGNoYXIgKndhbnRlZDsKKworICBwdXRzX2U3MDAwZGVidWcgKCJSXHIiKTsKKworI2lmZGVmIEdEQl9UQVJHRVRfSVNfU0gKKyAgd2FudGVkID0gd2FudDsKKyAgaWYgKFRBUkdFVF9BUkNISVRFQ1RVUkUtPmFyY2ggPT0gYmZkX2FyY2hfc2gpCisgICAgc3dpdGNoIChUQVJHRVRfQVJDSElURUNUVVJFLT5tYWNoKQorICAgICAgeworICAgICAgY2FzZSBiZmRfbWFjaF9zaDM6CisgICAgICBjYXNlIGJmZF9tYWNoX3NoM2U6CisJd2FudGVkID0gd2FudF9zaDM7CisgICAgICB9CisjZWxzZQorICBpZiAoaDgzMDBzbW9kZSkKKyAgICB3YW50ZWQgPSB3YW50X2g4MzAwczsKKyAgZWxzZQorICAgIHdhbnRlZCA9IHdhbnRfaDgzMDBoOworI2VuZGlmCisgIGZldGNoX3JlZ3NfZnJvbV9kdW1wIChnY2gsIHdhbnRlZCk7CisKKyAgLyogQW5kIHN1cHBseSB0aGUgZXh0cmEgb25lcyB0aGUgc2ltdWxhdG9yIHVzZXMgKi8KKyAgZm9yIChyZWdubyA9IE5VTV9SRUFMUkVHUzsgcmVnbm8gPCBOVU1fUkVHUzsgcmVnbm8rKykKKyAgICB7CisgICAgICBpbnQgYnVmID0gMDsKKworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgKGNoYXIgKikgKCZidWYpKTsKKyAgICB9Cit9CisKKy8qIEZldGNoIHJlZ2lzdGVyIFJFR05PLCBvciBhbGwgcmVnaXN0ZXJzIGlmIFJFR05PIGlzIC0xLiAgUmV0dXJucworICAgZXJybm8gdmFsdWUuICAqLworCitzdGF0aWMgdm9pZAorZTcwMDBfZmV0Y2hfcmVnaXN0ZXIgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGU3MDAwX2ZldGNoX3JlZ2lzdGVycyAoKTsKK30KKworLyogU3RvcmUgdGhlIHJlbW90ZSByZWdpc3RlcnMgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIGJsb2NrIFJFR1MuICAqLworCitzdGF0aWMgdm9pZAorZTcwMDBfc3RvcmVfcmVnaXN0ZXJzICgpCit7CisgIGludCByZWdubzsKKworICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCBOVU1fUkVBTFJFR1M7IHJlZ25vKyspCisgICAgZTcwMDBfc3RvcmVfcmVnaXN0ZXIgKHJlZ25vKTsKKworICByZWdpc3RlcnNfY2hhbmdlZCAoKTsKK30KKworLyogU3RvcmUgcmVnaXN0ZXIgUkVHTk8sIG9yIGFsbCBpZiBSRUdOTyA9PSAwLiAgUmV0dXJuIGVycm5vIHZhbHVlLiAgKi8KKworc3RhdGljIHZvaWQKK2U3MDAwX3N0b3JlX3JlZ2lzdGVyIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBjaGFyIGJ1ZlsyMDBdOworCisgIGlmIChyZWdubyA9PSAtMSkKKyAgICB7CisgICAgICBlNzAwMF9zdG9yZV9yZWdpc3RlcnMgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgR0RCX1RBUkdFVF9JU19IODMwMAorICBpZiAocmVnbm8gPD0gNykKKyAgICB7CisgICAgICBzcHJpbnRmIChidWYsICIuRVIlZCAleFxyIiwgcmVnbm8sIHJlYWRfcmVnaXN0ZXIgKHJlZ25vKSk7CisgICAgICBwdXRzX2U3MDAwZGVidWcgKGJ1Zik7CisgICAgfQorICBlbHNlIGlmIChyZWdubyA9PSBQQ19SRUdOVU0pCisgICAgeworICAgICAgc3ByaW50ZiAoYnVmLCAiLlBDICV4XHIiLCByZWFkX3JlZ2lzdGVyIChyZWdubykpOworICAgICAgcHV0c19lNzAwMGRlYnVnIChidWYpOworICAgIH0KKyAgZWxzZSBpZiAocmVnbm8gPT0gQ0NSX1JFR05VTSkKKyAgICB7CisgICAgICBzcHJpbnRmIChidWYsICIuQ0NSICV4XHIiLCByZWFkX3JlZ2lzdGVyIChyZWdubykpOworICAgICAgcHV0c19lNzAwMGRlYnVnIChidWYpOworICAgIH0KKyNlbmRpZiAvKiBHREJfVEFSR0VUX0lTX0g4MzAwICovCisKKyNpZmRlZiAgR0RCX1RBUkdFVF9JU19TSAorICBzd2l0Y2ggKHJlZ25vKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgc3ByaW50ZiAoYnVmLCAiLlIlZCAleFxyIiwgcmVnbm8sIHJlYWRfcmVnaXN0ZXIgKHJlZ25vKSk7CisgICAgICBwdXRzX2U3MDAwZGVidWcgKGJ1Zik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUENfUkVHTlVNOgorICAgICAgc3ByaW50ZiAoYnVmLCAiLlBDICV4XHIiLCByZWFkX3JlZ2lzdGVyIChyZWdubykpOworICAgICAgcHV0c19lNzAwMGRlYnVnIChidWYpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNSX1JFR05VTToKKyAgICAgIHNwcmludGYgKGJ1ZiwgIi5TUiAleFxyIiwgcmVhZF9yZWdpc3RlciAocmVnbm8pKTsKKyAgICAgIHB1dHNfZTcwMDBkZWJ1ZyAoYnVmKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQUl9SRUdOVU06CisgICAgICBzcHJpbnRmIChidWYsICIuUFIgJXhcciIsIHJlYWRfcmVnaXN0ZXIgKHJlZ25vKSk7CisgICAgICBwdXRzX2U3MDAwZGVidWcgKGJ1Zik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR0JSX1JFR05VTToKKyAgICAgIHNwcmludGYgKGJ1ZiwgIi5HQlIgJXhcciIsIHJlYWRfcmVnaXN0ZXIgKHJlZ25vKSk7CisgICAgICBwdXRzX2U3MDAwZGVidWcgKGJ1Zik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVkJSX1JFR05VTToKKyAgICAgIHNwcmludGYgKGJ1ZiwgIi5WQlIgJXhcciIsIHJlYWRfcmVnaXN0ZXIgKHJlZ25vKSk7CisgICAgICBwdXRzX2U3MDAwZGVidWcgKGJ1Zik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTUFDSF9SRUdOVU06CisgICAgICBzcHJpbnRmIChidWYsICIuTUFDSCAleFxyIiwgcmVhZF9yZWdpc3RlciAocmVnbm8pKTsKKyAgICAgIHB1dHNfZTcwMDBkZWJ1ZyAoYnVmKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNQUNMX1JFR05VTToKKyAgICAgIHNwcmludGYgKGJ1ZiwgIi5NQUNMICV4XHIiLCByZWFkX3JlZ2lzdGVyIChyZWdubykpOworICAgICAgcHV0c19lNzAwMGRlYnVnIChidWYpOworICAgICAgYnJlYWs7CisgICAgfQorCisjZW5kaWYgLyogR0RCX1RBUkdFVF9JU19TSCAqLworCisgIGV4cGVjdF9wcm9tcHQgKCk7Cit9CisKKy8qIEdldCByZWFkeSB0byBtb2RpZnkgdGhlIHJlZ2lzdGVycyBhcnJheS4gIE9uIG1hY2hpbmVzIHdoaWNoIHN0b3JlCisgICBpbmRpdmlkdWFsIHJlZ2lzdGVycywgdGhpcyBkb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuICBPbiBtYWNoaW5lcworICAgd2hpY2ggc3RvcmUgYWxsIHRoZSByZWdpc3RlcnMgaW4gb25lIGZlbGwgc3dvb3AsIHRoaXMgbWFrZXMgc3VyZQorICAgdGhhdCByZWdpc3RlcnMgY29udGFpbnMgYWxsIHRoZSByZWdpc3RlcnMgZnJvbSB0aGUgcHJvZ3JhbSBiZWluZworICAgZGVidWdnZWQuICAqLworCitzdGF0aWMgdm9pZAorZTcwMDBfcHJlcGFyZV90b19zdG9yZSAoKQoreworICAvKiBEbyBub3RoaW5nLCBzaW5jZSB3ZSBjYW4gc3RvcmUgaW5kaXZpZHVhbCByZWdzICovCit9CisKK3N0YXRpYyB2b2lkCitlNzAwMF9maWxlc19pbmZvICgpCit7CisgIHByaW50Zl91bmZpbHRlcmVkICgiXHRBdHRhY2hlZCB0byAlcyBhdCAlZCBiYXVkLlxuIiwgZGV2X25hbWUsIGJhdWRyYXRlKTsKK30KKworc3RhdGljIGludAorc3RpY2tieXRlICh3aGVyZSwgd2hhdCkKKyAgICAgY2hhciAqd2hlcmU7CisgICAgIHVuc2lnbmVkIGludCB3aGF0OworeworICBzdGF0aWMgQ09OU1QgY2hhciBkaWdzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisKKyAgd2hlcmVbMF0gPSBkaWdzWyh3aGF0ID4+IDQpICYgMHhmXTsKKyAgd2hlcmVbMV0gPSBkaWdzWyh3aGF0ICYgMHhmKSAmIDB4Zl07CisKKyAgcmV0dXJuIHdoYXQ7Cit9CisKKy8qIFdyaXRlIGEgc21hbGwgYW1tb3VudCBvZiBtZW1vcnkuICovCisKK3N0YXRpYyBpbnQKK3dyaXRlX3NtYWxsIChtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIHVuc2lnbmVkIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaW50IGk7CisgIGNoYXIgYnVmWzIwMF07CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHsKKyAgICAgIGlmICgoKG1lbWFkZHIgKyBpKSAmIDMpID09IDAgJiYgKGkgKyAzIDwgbGVuKSkKKwl7CisJICAvKiBDYW4gYmUgZG9uZSB3aXRoIGEgbG9uZyB3b3JkICovCisJICBzcHJpbnRmIChidWYsICJtICV4ICV4JTAyeCUwMnglMDJ4O2xcciIsCisJCSAgIG1lbWFkZHIgKyBpLAorCQkgICBteWFkZHJbaV0sIG15YWRkcltpICsgMV0sIG15YWRkcltpICsgMl0sIG15YWRkcltpICsgM10pOworCSAgcHV0c19lNzAwMGRlYnVnIChidWYpOworCSAgaSArPSAzOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzcHJpbnRmIChidWYsICJtICV4ICV4XHIiLCBtZW1hZGRyICsgaSwgbXlhZGRyW2ldKTsKKwkgIHB1dHNfZTcwMDBkZWJ1ZyAoYnVmKTsKKwl9CisgICAgfQorCisgIGV4cGVjdF9wcm9tcHQgKCk7CisKKyAgcmV0dXJuIGxlbjsKK30KKworLyogV3JpdGUgYSBsYXJnZSBhbW1vdW50IG9mIG1lbW9yeSwgdGhpcyBvbmx5IHdvcmtzIHdpdGggdGhlIHNlcmlhbAorICAgbW9kZSBlbmFibGVkLiAgQ29tbWFuZCBpcyBzZW50IGFzCisKKwlpbCA7czpzXHIJIC0+CisJCQk8LSBpbCA7czpzXHIKKwkJCTwtICAJRU5RCisJQUNLCQktPgorCQkJPC0gTE8gc1xyCisJU3JlY29yZHMuLi4KKwleWgkJLT4KKwkJCTwtCUVOUQorCUFDSwkJLT4gIAorCQkJPC0JOiAgIAkKKyAgKi8KKworc3RhdGljIGludAord3JpdGVfbGFyZ2UgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgdW5zaWduZWQgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICBpbnQgaTsKKyNkZWZpbmUgbWF4c3RyaWRlICAxMjgKKyAgaW50IHN0cmlkZTsKKworICBwdXRzX2U3MDAwZGVidWcgKCJJTCA7UzpGS1xyIik7CisgIGV4cGVjdCAoRU5RU1RSSU5HKTsKKyAgcHV0Y2hhcl9lNzAwMCAoQUNLKTsKKyAgZXhwZWN0ICgiTE8gRktcciIpOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gc3RyaWRlKQorICAgIHsKKyAgICAgIGNoYXIgY29tcG9zZVttYXhzdHJpZGUgKiAyICsgNTBdOworICAgICAgaW50IGFkZHJlc3MgPSBpICsgbWVtYWRkcjsKKyAgICAgIGludCBqOworICAgICAgaW50IGNoZWNrX3N1bTsKKyAgICAgIGludCB3aGVyZSA9IDA7CisgICAgICBpbnQgYWxlbjsKKworICAgICAgc3RyaWRlID0gbGVuIC0gaTsKKyAgICAgIGlmIChzdHJpZGUgPiBtYXhzdHJpZGUpCisJc3RyaWRlID0gbWF4c3RyaWRlOworCisgICAgICBjb21wb3NlW3doZXJlKytdID0gJ1MnOworICAgICAgY2hlY2tfc3VtID0gMDsKKyAgICAgIGlmIChhZGRyZXNzID49IDB4ZmZmZmZmKQorCWFsZW4gPSA0OworICAgICAgZWxzZSBpZiAoYWRkcmVzcyA+PSAweGZmZmYpCisJYWxlbiA9IDM7CisgICAgICBlbHNlCisJYWxlbiA9IDI7CisgICAgICAvKiBJbnNlcnQgdHlwZS4gKi8KKyAgICAgIGNvbXBvc2Vbd2hlcmUrK10gPSBhbGVuIC0gMSArICcwJzsKKyAgICAgIC8qIEluc2VydCBsZW5ndGguICovCisgICAgICBjaGVja19zdW0gKz0gc3RpY2tieXRlIChjb21wb3NlICsgd2hlcmUsIGFsZW4gKyBzdHJpZGUgKyAxKTsKKyAgICAgIHdoZXJlICs9IDI7CisgICAgICB3aGlsZSAoYWxlbiA+IDApCisJeworCSAgYWxlbi0tOworCSAgY2hlY2tfc3VtICs9IHN0aWNrYnl0ZSAoY29tcG9zZSArIHdoZXJlLCBhZGRyZXNzID4+ICg4ICogKGFsZW4pKSk7CisJICB3aGVyZSArPSAyOworCX0KKworICAgICAgZm9yIChqID0gMDsgaiA8IHN0cmlkZTsgaisrKQorCXsKKwkgIGNoZWNrX3N1bSArPSBzdGlja2J5dGUgKGNvbXBvc2UgKyB3aGVyZSwgbXlhZGRyW2kgKyBqXSk7CisJICB3aGVyZSArPSAyOworCX0KKyAgICAgIHN0aWNrYnl0ZSAoY29tcG9zZSArIHdoZXJlLCB+Y2hlY2tfc3VtKTsKKyAgICAgIHdoZXJlICs9IDI7CisgICAgICBjb21wb3NlW3doZXJlKytdID0gJ1xyJzsKKyAgICAgIGNvbXBvc2Vbd2hlcmUrK10gPSAnXG4nOworICAgICAgY29tcG9zZVt3aGVyZSsrXSA9IDA7CisKKyAgICAgIFNFUklBTF9XUklURSAoZTcwMDBfZGVzYywgY29tcG9zZSwgd2hlcmUpOworICAgICAgaiA9IHJlYWRjaGFyICgwKTsKKyAgICAgIGlmIChqID09IC0xKQorCXsKKwkgIC8qIFRoaXMgaXMgb2sgLSBub3RoaW5nIHRoZXJlICovCisJfQorICAgICAgZWxzZSBpZiAoaiA9PSBFTlEpCisJeworCSAgLyogSG1tLCBpdCdzIHRyeWluZyB0byB0ZWxsIHVzIHNvbWV0aGluZyAqLworCSAgZXhwZWN0ICgiOiIpOworCSAgZXJyb3IgKCJFcnJvciB3cml0aW5nIG1lbW9yeSIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwcmludGZfdW5maWx0ZXJlZCAoIkAlZH1AIiwgaik7CisJICB3aGlsZSAoKGogPSByZWFkY2hhciAoMCkpID4gMCkgCisJICAgIHsKKwkgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIkB7JWR9QCIsaik7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIFNlbmQgdGhlIHRyYWlsZXIgcmVjb3JkICovCisgIHdyaXRlX2U3MDAwICgiUzcwNTAwMDAwMDAwRkFcciIpOworICBwdXRjaGFyX2U3MDAwIChDVFJMWik7CisgIGV4cGVjdCAoRU5RU1RSSU5HKTsKKyAgcHV0Y2hhcl9lNzAwMCAoQUNLKTsKKyAgZXhwZWN0ICgiOiIpOworCisgIHJldHVybiBsZW47Cit9CisKKy8qIENvcHkgTEVOIGJ5dGVzIG9mIGRhdGEgZnJvbSBkZWJ1Z2dlciBtZW1vcnkgYXQgTVlBRERSIHRvIGluZmVyaW9yJ3MKKyAgIG1lbW9yeSBhdCBNRU1BRERSLiAgUmV0dXJucyBsZW5ndGggbW92ZWQuCisKKyAgIENhbid0IHVzZSB0aGUgU3JlY29yZCBsb2FkIG92ZXIgZXRoZXJuZXQsIHNvIGRvbid0IHVzZSBmYXN0IG1ldGhvZAorICAgdGhlbi4gICovCisKK3N0YXRpYyBpbnQKK2U3MDAwX3dyaXRlX2luZmVyaW9yX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICB1bnNpZ25lZCBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47Cit7CisgIGlmIChsZW4gPCAxNiB8fCB1c2luZ190Y3AgfHwgdXNpbmdfcGMpCisgICAgcmV0dXJuIHdyaXRlX3NtYWxsIChtZW1hZGRyLCBteWFkZHIsIGxlbik7CisgIGVsc2UKKyAgICByZXR1cm4gd3JpdGVfbGFyZ2UgKG1lbWFkZHIsIG15YWRkciwgbGVuKTsKK30KKworLyogUmVhZCBMRU4gYnl0ZXMgZnJvbSBpbmZlcmlvciBtZW1vcnkgYXQgTUVNQUREUi4gIFB1dCB0aGUgcmVzdWx0CisgICBhdCBkZWJ1Z2dlciBhZGRyZXNzIE1ZQUREUi4gIFJldHVybnMgbGVuZ3RoIG1vdmVkLiAKKworICBTbWFsbCB0cmFuc2FjdGlvbnMgd2Ugc2VuZAorICBtIDxhZGRyPjtsCisgIGFuZCByZWNlaXZlCisgICAgMDAwMDAwMDAgMTIzNDU2NzggPworICovCisKK3N0YXRpYyBpbnQKK2U3MDAwX3JlYWRfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIHVuc2lnbmVkIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaW50IGNvdW50OworICBpbnQgYzsKKyAgaW50IGk7CisgIGNoYXIgYnVmWzIwMF07CisgIC8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhpcyBwYXNzLiAgKi8KKworLyogIHByaW50ZigiUkVBRCBJTkYgJXggJXggJWRcbiIsIG1lbWFkZHIsIG15YWRkciwgbGVuKTsqLworICBpZiAoKChtZW1hZGRyIC0gMSkgKyBsZW4pIDwgbWVtYWRkcikKKyAgICB7CisgICAgICBlcnJubyA9IEVJTzsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBzcHJpbnRmIChidWYsICJtICV4O2xcciIsIG1lbWFkZHIpOworICBwdXRzX2U3MDAwZGVidWcgKGJ1Zik7CisKKyAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbGVuOyBjb3VudCArPSA0KSAKKyAgICB7CisgICAgICAvKiBTdWNrIGF3YXkgdGhlIGFkZHJlc3MgKi8KKyAgICAgIGMgPSBnY2ggKCk7CQorICAgICAgd2hpbGUgKGMgIT0gJyAnKQorCWMgPSBnY2ggKCk7CQorICAgICAgYyA9IGdjaCAoKTsKKyAgICAgIGlmIChjID09ICcqJykgCisJewkJCS8qIFNvbWUga2luZCBvZiBlcnJvciAqLworCSAgcHV0c19lNzAwMGRlYnVnICgiLlxyIik7IC8qIFNvbWUgZXJyb3JzIGxlYXZlIHVzIGluIG1lbW9yeSBpbnB1dCBtb2RlICovCisJICBleHBlY3RfZnVsbF9wcm9tcHQoKTsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgICB3aGlsZSAoYyAhPSAnICcpCisJYyA9IGdjaCAoKTsJCisKKyAgICAgIC8qIE5vdyByZWFkIGluIHRoZSBkYXRhICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSAKKwl7CisJICBpbnQgYiA9IGdieXRlKCk7CisJICBpZiAoY291bnQgKyBpIDwgbGVuKSB7CisJICAgIG15YWRkcltjb3VudCArIGldID0gYjsKKwkgIH0KKwl9CisKKyAgICAgIC8qIFNraXAgdGhlIHRyYWlsaW5nID8gYW5kIHNlbmQgYSAuIHRvIGVuZCBhbmQgYSBjciBmb3IgbW9yZSAqLworICAgICAgZ2NoICgpOwkKKyAgICAgIGdjaCAoKTsKKyAgICAgIGlmIChjb3VudCArIDQgPj0gbGVuKQorCXB1dHNfZTcwMDBkZWJ1ZygiLlxyIik7CisgICAgICBlbHNlCisJcHV0c19lNzAwMGRlYnVnKCJcciIpOworCisgICAgfQorICBleHBlY3RfcHJvbXB0KCk7CisgIHJldHVybiBsZW47Cit9CisKKworCisvKgorICBGb3IgbGFyZ2UgdHJhbnNmZXJzIHdlIHVzZWQgdG8gc2VuZAorCisKKyAgZCA8YWRkcj4gPGVuZGFkZHI+XHIKKworICBhbmQgcmVjZWl2ZQorICAgPEFERFJFU1M+ICAgICAgICAgICA8ICAgIEQgICBBICAgVCAgIEEgICAgPiAgICAgICAgICAgICAgIDwgICBBU0NJSSBDT0RFICAgPgorICAgMDAwMDAwMDAgNUYgRkQgRkQgRkYgREYgN0YgREYgRkYgIDAxIDAwIDAxIDAwIDAyIDAwIDA4IDA0ICAiXy4uLi4uLi4uLi4uLi4uLiIKKyAgIDAwMDAwMDEwIEZGIEQ3IEZGIDdGIEQ3IEYxIDdGIEZGICAwMCAwNSAwMCAwMCAwOCAwMCA0MCAwMCAgIi4uLi4uLi4uLi4uLi4uQC4iCisgICAwMDAwMDAyMCA3RiBGRCBGRiBGNyA3RiBGRiBGRiBGNyAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgICIuLi4uLi4uLi4uLi4uLi4uIgorCisgIEEgY29zdCBpbiBjaGFycyBmb3IgZWFjaCB0cmFuc2FjdGlvbiBvZiA4MCArIDUqbi1ieXRlcy4gCisKKyAgTGFyZ2UgdHJhbnNhY3Rpb25zIGNvdWxkIGJlIGRvbmUgd2l0aCB0aGUgc3JlY29yZCBsb2FkIGNvZGUsIGJ1dAorICB0aGVyZSBpcyBhIHBhdXNlIGZvciBhIHNlY29uZCBiZWZvcmUgZHVtcGluZyBzdGFydHMsIHdoaWNoIHNsb3dzIHRoZQorICBhdmVyYWdlIHJhdGUgZG93biEKKyovCisKK3N0YXRpYyBpbnQKK2U3MDAwX3JlYWRfaW5mZXJpb3JfbWVtb3J5X2xhcmdlIChtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIHVuc2lnbmVkIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaW50IGNvdW50OworICBpbnQgYzsKKyAgY2hhciBidWZbMjAwXTsKKworICAvKiBTdGFydGluZyBhZGRyZXNzIG9mIHRoaXMgcGFzcy4gICovCisKKyAgaWYgKCgobWVtYWRkciAtIDEpICsgbGVuKSA8IG1lbWFkZHIpCisgICAgeworICAgICAgZXJybm8gPSBFSU87CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgc3ByaW50ZiAoYnVmLCAiZCAleCAleFxyIiwgbWVtYWRkciwgbWVtYWRkciArIGxlbiAtIDEpOworICBwdXRzX2U3MDAwZGVidWcgKGJ1Zik7CisKKyAgY291bnQgPSAwOworICBjID0gZ2NoICgpOworICAKKyAgLyogc2tpcCBkb3duIHRvIHRoZSBmaXJzdCAiPiIgKi8KKyAgd2hpbGUoIGMgIT0gJz4nICkKKyAgICBjID0gZ2NoICgpOworICAvKiBub3cgc2tpcCB0byB0aGUgZW5kIG9mIHRoYXQgbGluZSAqLworICB3aGlsZSggYyAhPSAnXHInICkKKyAgICBjID0gZ2NoICgpOworICBjID0gZ2NoICgpOworCisgIHdoaWxlIChjb3VudCA8IGxlbikKKyAgICB7CisgICAgICAvKiBnZXQgcmlkIG9mIGFueSB3aGl0ZSBzcGFjZSBiZWZvcmUgdGhlIGFkZHJlc3MgKi8KKyAgICAgIHdoaWxlIChjIDw9ICcgJykKKwljID0gZ2NoICgpOworCisgICAgICAvKiBTa2lwIHRoZSBhZGRyZXNzICovCisgICAgICBnZXRfaGV4ICgmYyk7CisKKyAgICAgIC8qIHJlYWQgaW4gdGhlIGJ5dGVzIG9uIHRoZSBsaW5lICovCisgICAgICB3aGlsZSAoYyAhPSAnIicgJiYgY291bnQgPCBsZW4pCisJeworCSAgaWYgKGMgPT0gJyAnKQorCSAgICBjID0gZ2NoICgpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgbXlhZGRyW2NvdW50KytdID0gZ2V0X2hleCAoJmMpOworCSAgICB9CisJfQorICAgICAgLyogdGhyb3cgb3V0IHRoZSByZXN0IG9mIHRoZSBsaW5lICovCisgICAgICB3aGlsZSggYyAhPSAnXHInICkKKwljID0gZ2NoICgpOworICAgIH0KKworICAvKiB3YWl0IGZvciB0aGUgIjoiIHByb21wdCAqLworICB3aGlsZSAoYyAhPSAnOicpCisgICAgYyA9IGdjaCAoKTsKKworICByZXR1cm4gbGVuOworfQorCisjaWYgMAorCitzdGF0aWMgaW50CitmYXN0X2J1dF9mb3JfdGhlX3BhdXNlX2U3MDAwX3JlYWRfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaW50IGxvb3A7CisgIGludCBjOworICBjaGFyIGJ1ZlsyMDBdOworCisgIGlmICgoKG1lbWFkZHIgLSAxKSArIGxlbikgPCBtZW1hZGRyKQorICAgIHsKKyAgICAgIGVycm5vID0gRUlPOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHNwcmludGYgKGJ1ZiwgImlzICV4QCV4OnNcciIsIG1lbWFkZHIsIGxlbik7CisgIHB1dHNfZTcwMDBkZWJ1ZyAoYnVmKTsKKyAgZ2NoICgpOworICBjID0gZ2NoICgpOworICBpZiAoYyAhPSBFTlEpCisgICAgeworICAgICAgLyogR290IGFuIGVycm9yICovCisgICAgICBlcnJvciAoIk1lbW9yeSByZWFkIGVycm9yIik7CisgICAgfQorICBwdXRjaGFyX2U3MDAwIChBQ0spOworICBleHBlY3QgKCJTViBzIik7CisgIGxvb3AgPSAxOworICB3aGlsZSAobG9vcCkKKyAgICB7CisgICAgICBpbnQgdHlwZTsKKyAgICAgIGludCBsZW5ndGg7CisgICAgICBpbnQgYWRkcjsKKyAgICAgIGludCBpOworCisgICAgICBjID0gZ2NoICgpOworICAgICAgc3dpdGNoIChjKQorCXsKKwljYXNlIEVOUToJCS8qIEVOUSwgYXQgdGhlIGVuZCAqLworCSAgbG9vcCA9IDA7CisJICBicmVhazsKKwljYXNlICdTJzoKKwkgIC8qIFN0YXJ0IG9mIGFuIFNyZWNvcmQgKi8KKwkgIHR5cGUgPSBnY2ggKCk7CisJICBsZW5ndGggPSBnYnl0ZSAoKTsKKwkgIHN3aXRjaCAodHlwZSkKKwkgICAgeworCSAgICBjYXNlICc3JzoJCS8qIFRlcm1pbmF0aW9uIHJlY29yZCwgaWdub3JlICovCisJICAgIGNhc2UgJzAnOgorCSAgICBjYXNlICc4JzoKKwkgICAgY2FzZSAnOSc6CisJICAgICAgLyogSGVhZGVyIHJlY29yZCAtIGlnbm9yZSBpdCAqLworCSAgICAgIHdoaWxlIChsZW5ndGgtLSkKKwkJeworCQkgIGdieXRlICgpOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJzEnOgorCSAgICBjYXNlICcyJzoKKwkgICAgY2FzZSAnMyc6CisJICAgICAgeworCQlpbnQgYWxlbjsKKworCQlhbGVuID0gdHlwZSAtICcwJyArIDE7CisJCWFkZHIgPSAwOworCQl3aGlsZSAoYWxlbi0tKQorCQkgIHsKKwkJICAgIGFkZHIgPSAoYWRkciA8PCA4KSArIGdieXRlICgpOworCQkgICAgbGVuZ3RoLS07CisJCSAgfQorCisJCWZvciAoaSA9IDA7IGkgPCBsZW5ndGggLSAxOyBpKyspCisJCSAgbXlhZGRyW2kgKyBhZGRyIC0gbWVtYWRkcl0gPSBnYnl0ZSAoKTsKKworCQlnYnl0ZSAoKTsJLyogSWdub3JlIGNoZWNrc3VtICovCisJICAgICAgfQorCSAgICB9CisJfQorICAgIH0KKworICBwdXRjaGFyX2U3MDAwIChBQ0spOworICBleHBlY3QgKCJUT1AgQUREUkVTUyA9Iik7CisgIGV4cGVjdCAoIkVORCBBRERSRVNTID0iKTsKKyAgZXhwZWN0ICgiOiIpOworCisgIHJldHVybiBsZW47Cit9CisKKyNlbmRpZgorCitzdGF0aWMgaW50CitlNzAwMF94ZmVyX2luZmVyaW9yX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4sIHdyaXRlLCB0YXJnZXQpCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICB1bnNpZ25lZCBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47CisgICAgIGludCB3cml0ZTsKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldDsJLyogaWdub3JlZCAqLworeworICBpZiAod3JpdGUpCisgICAgcmV0dXJuIGU3MDAwX3dyaXRlX2luZmVyaW9yX21lbW9yeSggbWVtYWRkciwgbXlhZGRyLCBsZW4pOworICBlbHNlIAorICAgIGlmKCBsZW4gPCAxNiApCisgICAgICByZXR1cm4gZTcwMDBfcmVhZF9pbmZlcmlvcl9tZW1vcnkoIG1lbWFkZHIsIG15YWRkciwgbGVuKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gZTcwMDBfcmVhZF9pbmZlcmlvcl9tZW1vcnlfbGFyZ2UoIG1lbWFkZHIsIG15YWRkciwgbGVuKTsKK30KKworc3RhdGljIHZvaWQKK2U3MDAwX2tpbGwgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7Cit9CisKK3N0YXRpYyB2b2lkCitlNzAwMF9sb2FkIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgYmZkICpwYmZkOworICBiZmRfdm1hIGVudHJ5OworI2RlZmluZSBXUklURVNJWkUgMHgxMDAwCisgIGNoYXIgYnVmWzIgKyA0ICsgNCArIFdSSVRFU0laRV07IC8qIGBEVCcgKyA8YWRkcj4gKyA8bGVuPiArIDxkYXRhPiAqLworICBjaGFyICpmaWxlbmFtZTsKKyAgaW50IHF1aWV0OworICBpbnQgbm9zdGFydDsKKyAgdGltZV90IHN0YXJ0X3RpbWUsIGVuZF90aW1lOwkvKiBTdGFydCBhbmQgZW5kIHRpbWVzIG9mIGRvd25sb2FkICovCisgIHVuc2lnbmVkIGxvbmcgZGF0YV9jb3VudDsJLyogTnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHRvIG1lbW9yeSAqLworICBpbnQgb2xkdGltZW91dCA9IHRpbWVvdXQ7CQorCisgIHRpbWVvdXQgPSByZW1vdGVfdGltZW91dDsKKworCisgIC8qIEZJWE1FISBjaGFuZ2UgdGVzdCB0byB0ZXN0IGZvciB0eXBlIG9mIGRvd25sb2FkICovCisgIGlmICghdXNpbmdfdGNwKQorICAgIHsKKyAgICAgIGdlbmVyaWNfbG9hZCAoYXJncywgZnJvbV90dHkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBmb3IgZGlyZWN0IHRjcCBjb25uZWN0aW9ucywgd2UgY2FuIGRvIGEgZmFzdCBiaW5hcnkgZG93bmxvYWQgKi8KKyAgYnVmWzBdID0gJ0QnOworICBidWZbMV0gPSAnVCc7CisgIHF1aWV0ID0gMDsKKyAgbm9zdGFydCA9IDA7CisgIGZpbGVuYW1lID0gTlVMTDsKKworICB3aGlsZSAoKmFyZ3MgIT0gJ1wwMDAnKQorICAgIHsKKyAgICAgIGNoYXIgKmFyZzsKKworICAgICAgd2hpbGUgKGlzc3BhY2UgKCphcmdzKSkgYXJncysrOworCisgICAgICBhcmcgPSBhcmdzOworCisgICAgICB3aGlsZSAoKCphcmdzICE9ICdcMDAwJykgJiYgIWlzc3BhY2UgKCphcmdzKSkgYXJncysrOworCisgICAgICBpZiAoKmFyZ3MgIT0gJ1wwMDAnKQorCSphcmdzKysgPSAnXDAwMCc7CisKKyAgICAgIGlmICgqYXJnICE9ICctJykKKwlmaWxlbmFtZSA9IGFyZzsKKyAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGFyZywgIi1xdWlldCIsIHN0cmxlbiAoYXJnKSkgPT0gMCkKKwlxdWlldCA9IDE7CisgICAgICBlbHNlIGlmIChzdHJuY21wIChhcmcsICItbm9zdGFydCIsIHN0cmxlbiAoYXJnKSkgPT0gMCkKKwlub3N0YXJ0ID0gMTsKKyAgICAgIGVsc2UKKwllcnJvciAoInVua25vd24gb3B0aW9uIGAlcyciLCBhcmcpOworICAgIH0KKworICBpZiAoIWZpbGVuYW1lKQorICAgIGZpbGVuYW1lID0gZ2V0X2V4ZWNfZmlsZSAoMSk7CisKKyAgcGJmZCA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIGdudXRhcmdldCk7CisgIGlmIChwYmZkID09IE5VTEwpCisgICAgeworICAgICAgcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGJmZF9jbG9zZSwgcGJmZCk7CisKKyAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0IChwYmZkLCBiZmRfb2JqZWN0KSkgCisgICAgZXJyb3IgKCJcIiVzXCIgaXMgbm90IGFuIG9iamVjdCBmaWxlOiAlcyIsIGZpbGVuYW1lLAorCSAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKworICBzdGFydF90aW1lID0gdGltZSAoTlVMTCk7CisgIGRhdGFfY291bnQgPSAwOworCisgIHB1dHNfZTcwMDBkZWJ1ZyAoIm13XHIiKTsKKworICBleHBlY3QgKCJcbk9LIik7CisKKyAgZm9yIChzZWN0aW9uID0gcGJmZC0+c2VjdGlvbnM7IHNlY3Rpb247IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KSAKKyAgICB7CisgICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChwYmZkLCBzZWN0aW9uKSAmIFNFQ19MT0FEKQorCXsKKwkgIGJmZF92bWEgc2VjdGlvbl9hZGRyZXNzOworCSAgYmZkX3NpemVfdHlwZSBzZWN0aW9uX3NpemU7CisJICBmaWxlX3B0ciBmcHRyOworCisJICBzZWN0aW9uX2FkZHJlc3MgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChwYmZkLCBzZWN0aW9uKTsKKwkgIHNlY3Rpb25fc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdGlvbik7CisKKwkgIGlmICghcXVpZXQpCisJICAgIHByaW50Zl9maWx0ZXJlZCAoIltMb2FkaW5nIHNlY3Rpb24gJXMgYXQgMHgleCAoJWQgYnl0ZXMpXVxuIiwKKwkJCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKHBiZmQsIHNlY3Rpb24pLAorCQkJICAgICBzZWN0aW9uX2FkZHJlc3MsCisJCQkgICAgIHNlY3Rpb25fc2l6ZSk7CisKKwkgIGZwdHIgPSAwOworCSAgCisJICBkYXRhX2NvdW50ICs9IHNlY3Rpb25fc2l6ZTsKKworCSAgd2hpbGUgKHNlY3Rpb25fc2l6ZSA+IDApCisJICAgIHsKKwkgICAgICBpbnQgY291bnQ7CisJICAgICAgc3RhdGljIGNoYXIgaW5kc1tdID0gInwvLVxcIjsKKwkgICAgICBzdGF0aWMgaW50IGsgPSAwOworCisJICAgICAgUVVJVDsKKworCSAgICAgIGNvdW50ID0gbWluIChzZWN0aW9uX3NpemUsIFdSSVRFU0laRSk7CisKKwkgICAgICBidWZbMl0gPSBzZWN0aW9uX2FkZHJlc3MgPj4gMjQ7CisJICAgICAgYnVmWzNdID0gc2VjdGlvbl9hZGRyZXNzID4+IDE2OworCSAgICAgIGJ1Zls0XSA9IHNlY3Rpb25fYWRkcmVzcyA+PiA4OworCSAgICAgIGJ1Zls1XSA9IHNlY3Rpb25fYWRkcmVzczsKKworCSAgICAgIGJ1Zls2XSA9IGNvdW50ID4+IDI0OworCSAgICAgIGJ1Zls3XSA9IGNvdW50ID4+IDE2OworCSAgICAgIGJ1Zls4XSA9IGNvdW50ID4+IDg7CisJICAgICAgYnVmWzldID0gY291bnQ7CisKKwkgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKHBiZmQsIHNlY3Rpb24sIGJ1ZiArIDEwLCBmcHRyLCBjb3VudCk7CisKKwkgICAgICBpZiAoU0VSSUFMX1dSSVRFIChlNzAwMF9kZXNjLCBidWYsIGNvdW50ICsgMTApKQorCQlmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsCisJCQkJICAgICJlNzAwMF9sb2FkOiBTRVJJQUxfV1JJVEUgZmFpbGVkOiAlc1xuIiwKKwkJCQkgICAgc2FmZV9zdHJlcnJvcihlcnJubykpOworCisJICAgICAgZXhwZWN0ICgiT0siKTsKKworCSAgICAgIGlmICghcXVpZXQpCisJCXsKKwkJICBwcmludGZfdW5maWx0ZXJlZCAoIlxyJWMiLCBpbmRzW2srKyAlIDRdKTsKKwkJICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCQl9CisKKwkgICAgICBzZWN0aW9uX2FkZHJlc3MgKz0gY291bnQ7CisJICAgICAgZnB0ciArPSBjb3VudDsKKwkgICAgICBzZWN0aW9uX3NpemUgLT0gY291bnQ7CisJICAgIH0KKwl9CisgICAgfQorCisgIHdyaXRlX2U3MDAwICgiRUQiKTsKKworICBleHBlY3RfcHJvbXB0ICgpOworCisgIGVuZF90aW1lID0gdGltZSAoTlVMTCk7CisKKy8qIEZpbmFsbHksIG1ha2UgdGhlIFBDIHBvaW50IGF0IHRoZSBzdGFydCBhZGRyZXNzICovCisKKyAgaWYgKGV4ZWNfYmZkKQorICAgIHdyaXRlX3BjIChiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGV4ZWNfYmZkKSk7CisKKyAgaW5mZXJpb3JfcGlkID0gMDsJCS8qIE5vIHByb2Nlc3Mgbm93ICovCisKKy8qIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgbWFueSB0aGluZ3Mgd2VyZSBiYXNlZCBvbiB0aGUgUEMgYXQgdGhlIHRpbWUgdGhhdAorICAgd2UgYXR0YWNoZWQgdG8gdGhlIG1vbml0b3IsIHdoaWNoIGlzIG5vIGxvbmdlciB2YWxpZCBub3cgdGhhdCB3ZSBoYXZlIGxvYWRlZAorICAgbmV3IGNvZGUgKGFuZCBqdXN0IGNoYW5nZWQgdGhlIFBDKS4gIEFub3RoZXIgd2F5IHRvIGRvIHRoaXMgbWlnaHQgYmUgdG8gY2FsbAorICAgbm9ybWFsX3N0b3AsIGV4Y2VwdCB0aGF0IHRoZSBzdGFjayBtYXkgbm90IGJlIHZhbGlkLCBhbmQgdGhpbmdzIHdvdWxkIGdldAorICAgaG9ycmlibHkgY29uZnVzZWQuLi4gKi8KKworICBjbGVhcl9zeW10YWJfdXNlcnMgKCk7CisKKyAgaWYgKCFub3N0YXJ0KQorICAgIHsKKyAgICAgIGVudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChwYmZkKTsKKworICAgICAgaWYgKCFxdWlldCkKKwlwcmludGZfdW5maWx0ZXJlZCAoIltTdGFydGluZyAlcyBhdCAweCV4XVxuIiwgZmlsZW5hbWUsIGVudHJ5KTsKKworLyogICAgICBzdGFydF9yb3V0aW5lIChlbnRyeSk7Ki8KKyAgICB9CisKKyAgcmVwb3J0X3RyYW5zZmVyX3BlcmZvcm1hbmNlIChkYXRhX2NvdW50LCBzdGFydF90aW1lLCBlbmRfdGltZSk7CisKKyAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisgIHRpbWVvdXQgPSBvbGR0aW1lb3V0OworfQorCisvKiBDbGVhbiB1cCB3aGVuIGEgcHJvZ3JhbSBleGl0cy4KKworICAgVGhlIHByb2dyYW0gYWN0dWFsbHkgbGl2ZXMgb24gaW4gdGhlIHJlbW90ZSBwcm9jZXNzb3IncyBSQU0sIGFuZCBtYXkgYmUKKyAgIHJ1biBhZ2FpbiB3aXRob3V0IGEgZG93bmxvYWQuICBEb24ndCBsZWF2ZSBpdCBmdWxsIG9mIGJyZWFrcG9pbnQKKyAgIGluc3RydWN0aW9ucy4gICovCisKK3N0YXRpYyB2b2lkCitlNzAwMF9tb3Vybl9pbmZlcmlvciAoKQoreworICByZW1vdmVfYnJlYWtwb2ludHMgKCk7CisgIHVucHVzaF90YXJnZXQgKCZlNzAwMF9vcHMpOworICBnZW5lcmljX21vdXJuX2luZmVyaW9yICgpOwkvKiBEbyBhbGwgdGhlIHByb3BlciB0aGluZ3Mgbm93ICovCit9CisKKyNkZWZpbmUgTUFYX0JSRUFLUE9JTlRTIDIwMAorI2lmZGVmICBIQVJEX0JSRUFLUE9JTlRTCisjZGVmaW5lIE1BWF9FNzAwMERFQlVHX0JSRUFLUE9JTlRTIChCQ19CUkVBS1BPSU5UUyA/IDUgOiAgTUFYX0JSRUFLUE9JTlRTKQorI2Vsc2UKKyNkZWZpbmUgTUFYX0U3MDAwREVCVUdfQlJFQUtQT0lOVFMgTUFYX0JSRUFLUE9JTlRTCisjZW5kaWYKKworLyogU2luY2Ugd2UgY2FuIGNoYW5nZSB0byBzb2Z0IGJyZWFrcG9pbnRzIGR5bmFtaWNhbGx5LCB3ZSBtdXN0IGRlZmluZSAKKyAgIG1vcmUgdGhhbiBlbm91Z2guICBXYXMgYnJlYWthZGRyW01BWF9FNzAwMERFQlVHX0JSRUFLUE9JTlRTXS4gKi8KK3N0YXRpYyBDT1JFX0FERFIgYnJlYWthZGRyW01BWF9CUkVBS1BPSU5UU10gPSB7MH07CisKK3N0YXRpYyBpbnQKK2U3MDAwX2luc2VydF9icmVha3BvaW50IChhZGRyLCBzaGFkb3cpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICB1bnNpZ25lZCBjaGFyICpzaGFkb3c7Cit7CisgIGludCBpOworICBjaGFyIGJ1ZlsyMDBdOworI2lmIDAKKyAgc3RhdGljIGNoYXIgbm9wWzJdID0gTk9QOworI2VuZGlmCisKKyAgZm9yIChpID0gMDsgaSA8PSBNQVhfRTcwMDBERUJVR19CUkVBS1BPSU5UUzsgaSsrKQorICAgIGlmIChicmVha2FkZHJbaV0gPT0gMCkKKyAgICAgIHsKKwlicmVha2FkZHJbaV0gPSBhZGRyOworCS8qIFNhdmUgb2xkIGNvbnRlbnRzLCBhbmQgaW5zZXJ0IGEgbm9wIGluIHRoZSBzcGFjZSAqLworI2lmZGVmIEhBUkRfQlJFQUtQT0lOVFMKKwlpZiAoQkNfQlJFQUtQT0lOVFMpIAorCSAgeworCSAgICBzcHJpbnRmIChidWYsICJCQyVkIEE9JXhcciIsIGkrMSwgYWRkcik7CisJICAgIHB1dHNfZTcwMDBkZWJ1ZyAoYnVmKTsKKwkgIH0KKwllbHNlIAorCSAgeworCSAgICBzcHJpbnRmIChidWYsICJCICV4XHIiLCBhZGRyKTsKKwkgICAgcHV0c19lNzAwMGRlYnVnIChidWYpOworCSAgfQorI2Vsc2UKKyNpZiAwCisJZTcwMDBfcmVhZF9pbmZlcmlvcl9tZW1vcnkgKGFkZHIsIHNoYWRvdywgMik7CisJZTcwMDBfd3JpdGVfaW5mZXJpb3JfbWVtb3J5IChhZGRyLCBub3AsIDIpOworI2VuZGlmCisKKwlzcHJpbnRmIChidWYsICJCICV4XHIiLCBhZGRyKTsKKwlwdXRzX2U3MDAwZGVidWcgKGJ1Zik7CisjZW5kaWYKKwlleHBlY3RfcHJvbXB0ICgpOworCXJldHVybiAwOworICAgICAgfQorCisgIGVycm9yICgiVG9vIG1hbnkgYnJlYWtwb2ludHMgKCA+ICVkKSBmb3IgdGhlIEU3MDAwXG4iLAorCSBNQVhfRTcwMDBERUJVR19CUkVBS1BPSU5UUyk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CitlNzAwMF9yZW1vdmVfYnJlYWtwb2ludCAoYWRkciwgc2hhZG93KQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgdW5zaWduZWQgY2hhciAqc2hhZG93OworeworICBpbnQgaTsKKyAgY2hhciBidWZbMjAwXTsKKworICBmb3IgKGkgPSAwOyBpIDwgTUFYX0U3MDAwREVCVUdfQlJFQUtQT0lOVFM7IGkrKykKKyAgICBpZiAoYnJlYWthZGRyW2ldID09IGFkZHIpCisgICAgICB7CisJYnJlYWthZGRyW2ldID0gMDsKKyNpZmRlZiBIQVJEX0JSRUFLUE9JTlRTCisJaWYgKEJDX0JSRUFLUE9JTlRTKSAKKwkgIHsKKwkgICAgc3ByaW50ZiAoYnVmLCAiQkMlZCAtIFxyIiwgIGkrMSk7CisJICAgIHB1dHNfZTcwMDBkZWJ1ZyAoYnVmKTsKKwkgIH0KKwllbHNlIAorCSAgeworCSAgICBzcHJpbnRmIChidWYsICJCIC0gJXhcciIsICBhZGRyKTsKKwkgICAgcHV0c19lNzAwMGRlYnVnIChidWYpOworCSAgfQorCWV4cGVjdF9wcm9tcHQgKCk7CisjZWxzZQorCXNwcmludGYgKGJ1ZiwgIkIgLSAleFxyIiwgYWRkcik7CisJcHV0c19lNzAwMGRlYnVnIChidWYpOworCWV4cGVjdF9wcm9tcHQgKCk7CisKKyNpZiAwCisJLyogUmVwbGFjZSB0aGUgaW5zbiB1bmRlciB0aGUgYnJlYWsgKi8KKwllNzAwMF93cml0ZV9pbmZlcmlvcl9tZW1vcnkgKGFkZHIsIHNoYWRvdywgMik7CisjZW5kaWYKKyNlbmRpZgorCisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgd2FybmluZyAoIkNhbid0IGZpbmQgYnJlYWtwb2ludCBhc3NvY2lhdGVkIHdpdGggMHgleFxuIiwgYWRkcik7CisgIHJldHVybiAxOworfQorCisvKiBQdXQgYSBjb21tYW5kIHN0cmluZywgaW4gYXJncywgb3V0IHRvIFNUREJVRy4gIE91dHB1dCBmcm9tIFNUREJVRworICAgaXMgcGxhY2VkIG9uIHRoZSB1c2VycyB0ZXJtaW5hbCB1bnRpbCB0aGUgcHJvbXB0IGlzIHNlZW4uICovCisKK3N0YXRpYyB2b2lkCitlNzAwMF9jb21tYW5kIChhcmdzLCBmcm9tdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbXR0eTsKK3sKKyAgLyogRklYTUU6IGFyYml0cmFyeSBsaW1pdCBvbiBsZW5ndGggb2YgYXJncy4gICovCisgIGNoYXIgYnVmWzIwMF07CisKKyAgZWNobyA9IDA7CisKKyAgaWYgKCFlNzAwMF9kZXNjKQorICAgIGVycm9yICgiZTcwMDAgdGFyZ2V0IG5vdCBvcGVuLiIpOworICBpZiAoIWFyZ3MpCisgICAgeworICAgICAgcHV0c19lNzAwMGRlYnVnICgiXHIiKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzcHJpbnRmIChidWYsICIlc1xyIiwgYXJncyk7CisgICAgICBwdXRzX2U3MDAwZGVidWcgKGJ1Zik7CisgICAgfQorCisgIGVjaG8rKzsKKyAgY3RybF9jID0gMjsKKyAgZXhwZWN0X2Z1bGxfcHJvbXB0ICgpOworICBlY2hvLS07CisgIGN0cmxfYyA9IDA7CisgIHByaW50Zl91bmZpbHRlcmVkICgiXG4iKTsKKworICAvKiBXaG8ga25vd3Mgd2hhdCB0aGUgY29tbWFuZCBkaWQuLi4gKi8KKyAgcmVnaXN0ZXJzX2NoYW5nZWQgKCk7Cit9CisKKworc3RhdGljIHZvaWQKK2U3MDAwX2RyYWluX2NvbW1hbmQgKGFyZ3MsIGZyb210dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tdHR5OworCit7CisgIGludCBjOworCisgIHB1dHNfZTcwMDBkZWJ1ZygiZW5kXHIiKTsKKyAgcHV0Y2hhcl9lNzAwMCAoQ1RSTEMpOworCisgIHdoaWxlICgoYyA9IHJlYWRjaGFyICgxKSAhPSAtMSkpCisgICAgeworICAgICAgaWYgKHF1aXRfZmxhZykKKwl7CisJICBwdXRjaGFyX2U3MDAwKENUUkxDKTsKKwkgIHF1aXRfZmxhZyA9IDA7CisJfQorICAgICAgaWYgKGMgPiAnICcgJiYgYyA8IDEyNykKKwlwcmludGZfdW5maWx0ZXJlZCAoIiVjIiwgYyAmIDB4ZmYpOworICAgICAgZWxzZQorCXByaW50Zl91bmZpbHRlcmVkICgiPCV4PiIsIGMgJiAweGZmKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgTklURU1TIDcKKworc3RhdGljIGludAord2h5X3N0b3AgKCkKK3sKKyAgc3RhdGljICBjaGFyICpzdHJpbmdzW05JVEVNU10gPSB7CisgICAgIlNURVAgTk9STUFMIiwKKyAgICAiQlJFQUsgUE9JTlQiLAorICAgICJCUkVBSyBLRVkiLAorICAgICJCUkVBSyBDT05ESSIsCisgICAgIkNZQ0xFIEFDQ0VTUyIsCisgICAgIklMTEVHQUwgSU5TVFJVQ1RJT04iLAorICAgICJXUklURSBQUk9URUNUIiwKKyAgfTsKKyAgY2hhciAqcFtOSVRFTVNdOworICBpbnQgYzsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IE5JVEVNUzsgKytpKQorICAgIHBbaV0gPSBzdHJpbmdzW2ldOworICAKKyAgYyA9IGdjaCAoKTsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IE5JVEVNUzsgaSsrKQorCXsKKwkgIGlmIChjID09ICoocFtpXSkpIAorCSAgICB7CisJICAgICAgcFtpXSsrOworCSAgICAgIGlmICgqKHBbaV0pID09IDApIAorCQl7IAorCQkgIC8qIGZvdW5kIG9uZSBvZiB0aGUgY2hvaWNlcyAqLworCQkgIHJldHVybiBpOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgcFtpXSA9IHN0cmluZ3NbaV07CisJfQorCisgICAgICBjID0gZ2NoICgpOworICAgIH0KK30KKworLyogU3VjayBjaGFyYWN0ZXJzLCBpZiBhIHN0cmluZyBtYXRjaCwgdGhlbiByZXR1cm4gdGhlIHN0cmluZ3MgaW5kZXgKKyAgIG90aGVyd2lzZSBlY2hvIHRoZW0uICAqLworCitpbnQKK2V4cGVjdF9uIChzdHJpbmdzKQorY2hhciAqKnN0cmluZ3M7Cit7CisgIGNoYXIgKihwdHJbMTBdKTsKKyAgaW50IG47IAorICBpbnQgYzsKKyAgY2hhciBzYXZlYXdheVsxMDBdOworICBjaGFyICpidWZmZXIgPSBzYXZlYXdheTsKKyAgLyogQ291bnQgbnVtYmVyIG9mIGV4cGVjdCBzdHJpbmdzICAqLworCisgIGZvciAobiA9IDA7IHN0cmluZ3Nbbl07IG4rKykgCisgICAgeworICAgICAgcHRyW25dID0gc3RyaW5nc1tuXTsKKyAgICB9CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaW50IGk7CisgICAgICBpbnQgZ290b25lID0gMDsKKworICAgICAgYyA9IHJlYWRjaGFyICgxKTsKKyAgICAgIGlmIChjID09IC0xKQorCXsKKwkgIHByaW50Zl91bmZpbHRlcmVkICgiW3dhaXRpbmcgZm9yIGU3MDAwLi4uXVxuIik7CisJfQorI2lmZGVmIF9fR08zMl9fCisgICAgICBpZiAoa2JoaXQgKCkpCisJeworCSAgaW50IGsgPSBnZXRrZXkoKTsKKworCSAgaWYgKGsgPT0gMSkKKwkgICAgcXVpdF9mbGFnID0gMTsKKwl9CisjZW5kaWYKKyAgICAgIGlmIChxdWl0X2ZsYWcpCisJeworCSAgcHV0Y2hhcl9lNzAwMCAoQ1RSTEMpOwkvKiBpbnRlcnJ1cHQgdGhlIHJ1bm5pbmcgcHJvZ3JhbSAqLworCSAgcXVpdF9mbGFnID0gMDsKKwl9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJeworCSAgaWYgKGMgPT0gcHRyW2ldWzBdKSAKKwkgICAgeworCSAgICAgIHB0cltpXSsrOworCSAgICAgIGlmIChwdHJbaV1bMF0gPT0gMCkKKwkJeworCQkgIC8qIEdvbmUgYWxsIHRoZSB3YXkgKi8KKwkJICByZXR1cm4gaTsKKwkJfQorCSAgICAgIGdvdG9uZSA9IDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHB0cltpXSA9IHN0cmluZ3NbaV07CisJICAgIH0KKwl9CisgICAgCisgICAgICBpZiAoZ290b25lKQorCXsKKwkgIC8qIFNhdmUgaXQgdXAgaW5jYXNlIHdlIGZpbmQgdGhhdCB0aGVyZSB3YXMgbm8gbWF0Y2ggKi8KKwkgICpidWZmZXIgKysgPSBjOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoYnVmZmVyICE9IHNhdmVhd2F5KSAKKwkgICAgeworCSAgICAgICpidWZmZXIrKyA9IDA7CisJICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlcyIsIGJ1ZmZlcik7CisJICAgICAgYnVmZmVyID0gc2F2ZWF3YXk7CisJICAgIH0KKwkgIGlmIChjICE9IC0xKQorCSAgICB7CisJICAgICAgcHV0Y2hhcl91bmZpbHRlcmVkIChjKTsKKwkgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCSAgICB9CisJfQorICAgIH0KK30KKworLyogV2Ugc3VidHJhY3QgdHdvIGZyb20gdGhlIHBjIGhlcmUgcmF0aGVyIHRoYW4gdXNlCisgICBERUNSX1BDX0FGVEVSX0JSRUFLIHNpbmNlIHRoZSBlNzAwMCBkb2Vzbid0IGFsd2F5cyBhZGQgdHdvIHRvIHRoZQorICAgcGMsIGFuZCB0aGUgc2ltdWxhdG9ycyBuZXZlciBkby4gKi8KKworc3RhdGljIHZvaWQKK3N1YjJfZnJvbV9wYyAoKQoreworICBjaGFyIGJ1Zls0XTsKKyAgY2hhciBidWYyWzIwMF07CisKKyAgc3RvcmVfc2lnbmVkX2ludGVnZXIgKGJ1ZiwKKwkJCVJFR0lTVEVSX1JBV19TSVpFKFBDX1JFR05VTSksIAorCQkJcmVhZF9yZWdpc3RlciAoUENfUkVHTlVNKSAtMik7CisgIHN1cHBseV9yZWdpc3RlciAoUENfUkVHTlVNLCBidWYpOworICBzcHJpbnRmIChidWYyLCAiLlBDICV4XHIiLCByZWFkX3JlZ2lzdGVyIChQQ19SRUdOVU0pKTsKKyAgcHV0c19lNzAwMGRlYnVnIChidWYyKTsKK30KKworI2RlZmluZSBXQVNfU0xFRVAgMAorI2RlZmluZSBXQVNfSU5UIDEKKyNkZWZpbmUgV0FTX1JVTk5JTkcgMgorI2RlZmluZSBXQVNfT1RIRVIgMworCitzdGF0aWMgY2hhciAqZXN0cmluZ3NbXSA9IHsKKyAgIioqIFNMRUVQIiwKKyAgIkJSRUFLICEiLAorICAiKiogUEMiLAorICAiUEMiLAorICBOVUxMCit9OworCisvKiBXYWl0IHVudGlsIHRoZSByZW1vdGUgbWFjaGluZSBzdG9wcywgdGhlbiByZXR1cm4sIHN0b3Jpbmcgc3RhdHVzIGluCisgICBTVEFUVVMganVzdCBhcyBgd2FpdCcgd291bGQuICAqLworCitzdGF0aWMgaW50CitlNzAwMF93YWl0IChwaWQsIHN0YXR1cykKKyAgICAgaW50IHBpZDsKKyAgICAgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpzdGF0dXM7Cit7CisgIGludCBzdG9wX3JlYXNvbjsKKyAgaW50IHJlZ25vOworICBpbnQgcnVubmluZ19jb3VudCA9IDA7CisgIGludCBoYWRfc2xlZXAgPSAwOworICBpbnQgbG9vcCA9IDE7CisgIGNoYXIgKndhbnRlZF9ub3BjOworCisgIC8qIFRoZW4gZWNobyBjaGFycyB1bnRpbCBQQz0gc3RyaW5nIHNlZW4gKi8KKyAgZ2NoICgpOwkJCS8qIERyb3AgY3IgKi8KKyAgZ2NoICgpOwkJCS8qIGFuZCBzcGFjZSAqLworCisgIHdoaWxlIChsb29wKQorICAgIHsKKyAgICAgIHN3aXRjaCAoZXhwZWN0X24gKGVzdHJpbmdzKSkKKwl7CSAKKwljYXNlIFdBU19PVEhFUjoKKwkgIC8qIGhvdyBkaWQgdGhpcyBoYXBwZW4gPyAqLworCSAgbG9vcCA9IDA7CisJICBicmVhazsKKwljYXNlIFdBU19TTEVFUDoKKwkgIGhhZF9zbGVlcCA9IDE7CisJICBwdXRjaGFyX2U3MDAwIChDVFJMQyk7CisJICBsb29wID0gMDsKKwkgIGJyZWFrOworCWNhc2UgV0FTX0lOVDoKKwkgIGxvb3AgPSAwOworCSAgYnJlYWs7CisJY2FzZSBXQVNfUlVOTklORzoKKwkgIHJ1bm5pbmdfY291bnQrKzsKKwkgIGlmIChydW5uaW5nX2NvdW50ID09IDIwKQorCSAgICB7CisJICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJbcnVubmluZy4uLl1cbiIpOworCSAgICAgIHJ1bm5pbmdfY291bnQgPSAwOworCSAgICB9CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgLyogZXJyb3I/ICovCisJICBicmVhazsKKwl9CisgICAgfQorCisgIC8qIFNraXAgdGlsbCB0aGUgUEM9ICovCisgIGV4cGVjdCAoIj0iKTsKKworI2lmZGVmIEdEQl9UQVJHRVRfSVNfU0gKKyAgd2FudGVkX25vcGMgPSB3YW50X25vcGM7CisgIGlmIChUQVJHRVRfQVJDSElURUNUVVJFLT5hcmNoID09IGJmZF9hcmNoX3NoKQorICAgIHN3aXRjaCAoVEFSR0VUX0FSQ0hJVEVDVFVSRS0+bWFjaCkKKyAgICAgIHsKKyAgICAgIGNhc2UgYmZkX21hY2hfc2gzOgorICAgICAgY2FzZSBiZmRfbWFjaF9zaDNlOgorCXdhbnRlZF9ub3BjID0gd2FudF9zaDNfbm9wYzsKKyAgICAgIH0KKyNlbHNlCisgIGlmIChoODMwMHNtb2RlKQorICAgIHdhbnRlZF9ub3BjID0gd2FudF9ub3BjX2g4MzAwczsKKyAgZWxzZQorICAgIHdhbnRlZF9ub3BjID0gd2FudF9ub3BjX2g4MzAwaDsKKyNlbmRpZgorICBmZXRjaF9yZWdzX2Zyb21fZHVtcCAoZ2NoLCB3YW50ZWRfbm9wYyk7CisKKyAgLyogQW5kIHN1cHBseSB0aGUgZXh0cmEgb25lcyB0aGUgc2ltdWxhdG9yIHVzZXMgKi8KKyAgZm9yIChyZWdubyA9IE5VTV9SRUFMUkVHUzsgcmVnbm8gPCBOVU1fUkVHUzsgcmVnbm8rKykKKyAgICB7CisgICAgICBpbnQgYnVmID0gMDsKKyAgICAgIHN1cHBseV9yZWdpc3RlciAocmVnbm8sIChjaGFyICopICZidWYpOworICAgIH0KKworICBzdG9wX3JlYXNvbiA9IHdoeV9zdG9wICgpOworICBleHBlY3RfZnVsbF9wcm9tcHQgKCk7CisKKyAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQOworCisgIHN3aXRjaCAoc3RvcF9yZWFzb24pCisgICAgeworICAgIGNhc2UgMToJCQkvKiBCcmVha3BvaW50ICovCisgICAgICB3cml0ZV9wYyAocmVhZF9wYyAoKSk7IC8qIFBDIGlzIGFsd2F5cyBvZmYgYnkgMiBmb3IgYnJlYWtwb2ludHMgKi8KKyAgICAgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQOyAgICAgIAorICAgICAgYnJlYWs7CisgICAgY2FzZSAwOgkJCS8qIFNpbmdsZSBzdGVwICovCisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVFJBUDsgICAgICAKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoJCQkvKiBJbnRlcnJ1cHQgKi8KKyAgICAgIGlmIChoYWRfc2xlZXApCisJeworCSAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1RSQVA7ICAgICAgCisJICBzdWIyX2Zyb21fcGMgKCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9JTlQ7ICAgICAgCisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJhIGN5Y2xlIGFkZHJlc3MgZXJyb3I/XG4iKTsKKyAgICAgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9VTktOT1dOOyAgICAgIAorICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX0lMTDsgICAgICAKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9TRUdWOyAgICAgIAorICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgkJCS8qIEFueXRoaW5nIGVsc2UgKE5JVEVNUyArIDEpICovCisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoImEgd3JpdGUgcHJvdGVjdCBlcnJvcj9cbiIpOworICAgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1VOS05PV047ICAgICAgCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogR2V0IHRoZSB1c2VyJ3MgYXR0ZW50aW9uIC0gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAqLworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBTdG9wIHRoZSBydW5uaW5nIHByb2dyYW0uICAqLworCitzdGF0aWMgdm9pZAorZTcwMDBfc3RvcCAoKSAgCit7CisgIC8qIFNlbmRpbmcgYSBeQyBpcyBzdXBwb3NlZCB0byBzdG9wIHRoZSBydW5uaW5nIHByb2dyYW0uICAqLworICBwdXRjaGFyX2U3MDAwIChDVFJMQyk7Cit9CisKKy8qIERlZmluZSB0aGUgdGFyZ2V0IHN1YnJvdXRpbmUgbmFtZXMuICovCisKK3N0cnVjdCB0YXJnZXRfb3BzIGU3MDAwX29wcyA7CisKK3N0YXRpYyB2b2lkIAoraW5pdF9lNzAwMF9vcHModm9pZCkKK3sKKyAgZTcwMDBfb3BzLnRvX3Nob3J0bmFtZSA9ICAgImU3MDAwIjsKKyAgZTcwMDBfb3BzLnRvX2xvbmduYW1lID0gICAiUmVtb3RlIEhpdGFjaGkgZTcwMDAgdGFyZ2V0IjsKKyAgZTcwMDBfb3BzLnRvX2RvYyA9ICAgIlVzZSBhIHJlbW90ZSBIaXRhY2hpIGU3MDAwIElDRSBjb25uZWN0ZWQgYnkgYSBzZXJpYWwgbGluZTtcblwKK29yIGEgbmV0d29yayBjb25uZWN0aW9uLlxuXAorQXJndW1lbnRzIGFyZSB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlIGZvciB0aGUgc2VyaWFsIGxpbmUsXG5cCit0aGUgc3BlZWQgdG8gY29ubmVjdCBhdCBpbiBiaXRzIHBlciBzZWNvbmQuXG5cCitlZ1xuXAordGFyZ2V0IGU3MDAwIC9kZXYvdHR5YSA5NjAwXG5cCit0YXJnZXQgZTcwMDAgZm9vYmFyIiA7CisgIGU3MDAwX29wcy50b19vcGVuID0gICBlNzAwMF9vcGVuOwkKKyAgZTcwMDBfb3BzLnRvX2Nsb3NlID0gICBlNzAwMF9jbG9zZTsJCisgIGU3MDAwX29wcy50b19hdHRhY2ggPSAgIDA7CisgIGU3MDAwX29wcy50b19wb3N0X2F0dGFjaCA9IE5VTEw7CisgIGU3MDAwX29wcy50b19yZXF1aXJlX2F0dGFjaCA9IE5VTEw7CQorICBlNzAwMF9vcHMudG9fZGV0YWNoID0gICBlNzAwMF9kZXRhY2g7CisgIGU3MDAwX29wcy50b19yZXF1aXJlX2RldGFjaCA9IE5VTEw7CQorICBlNzAwMF9vcHMudG9fcmVzdW1lID0gICBlNzAwMF9yZXN1bWU7CQorICBlNzAwMF9vcHMudG9fd2FpdCAgPSAgIGU3MDAwX3dhaXQ7CisgIGU3MDAwX29wcy50b19wb3N0X3dhaXQgPSBOVUxMOwkKKyAgZTcwMDBfb3BzLnRvX2ZldGNoX3JlZ2lzdGVycyAgPSAgIGU3MDAwX2ZldGNoX3JlZ2lzdGVyOworICBlNzAwMF9vcHMudG9fc3RvcmVfcmVnaXN0ZXJzICA9ICAgZTcwMDBfc3RvcmVfcmVnaXN0ZXI7CisgIGU3MDAwX29wcy50b19wcmVwYXJlX3RvX3N0b3JlID0gICBlNzAwMF9wcmVwYXJlX3RvX3N0b3JlOworICBlNzAwMF9vcHMudG9feGZlcl9tZW1vcnkgID0gICBlNzAwMF94ZmVyX2luZmVyaW9yX21lbW9yeTsKKyAgZTcwMDBfb3BzLnRvX2ZpbGVzX2luZm8gID0gICBlNzAwMF9maWxlc19pbmZvOwkJCisgIGU3MDAwX29wcy50b19pbnNlcnRfYnJlYWtwb2ludCA9ICAgZTcwMDBfaW5zZXJ0X2JyZWFrcG9pbnQ7CQorICBlNzAwMF9vcHMudG9fcmVtb3ZlX2JyZWFrcG9pbnQgPSAgIGU3MDAwX3JlbW92ZV9icmVha3BvaW50OwkKKyAgZTcwMDBfb3BzLnRvX3Rlcm1pbmFsX2luaXQgID0gICAwOwkJCQkKKyAgZTcwMDBfb3BzLnRvX3Rlcm1pbmFsX2luZmVyaW9yID0gICAwOwkJCQkKKyAgZTcwMDBfb3BzLnRvX3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCA9ICAgMDsJCQkKKyAgZTcwMDBfb3BzLnRvX3Rlcm1pbmFsX291cnMgID0gICAwOwkJCQkKKyAgZTcwMDBfb3BzLnRvX3Rlcm1pbmFsX2luZm8gID0gICAwOwkJCQkKKyAgZTcwMDBfb3BzLnRvX2tpbGwgID0gICBlNzAwMF9raWxsOwkJCisgIGU3MDAwX29wcy50b19sb2FkICA9ICAgZTcwMDBfbG9hZDsJCQorICBlNzAwMF9vcHMudG9fbG9va3VwX3N5bWJvbCA9ICAgMDsJCQorICBlNzAwMF9vcHMudG9fY3JlYXRlX2luZmVyaW9yID0gICBlNzAwMF9jcmVhdGVfaW5mZXJpb3I7CisgIGU3MDAwX29wcy50b19wb3N0X3N0YXJ0dXBfaW5mZXJpb3IgPSBOVUxMOworICBlNzAwMF9vcHMudG9fYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvciA9IE5VTEw7CisgIGU3MDAwX29wcy50b19jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yID0gTlVMTDsgICAgICAgICAgCisgIGU3MDAwX29wcy50b19wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSA9IE5VTEw7ICAKKyAgZTcwMDBfb3BzLnRvX2luc2VydF9mb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBlNzAwMF9vcHMudG9fcmVtb3ZlX2ZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGU3MDAwX29wcy50b19pbnNlcnRfdmZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGU3MDAwX29wcy50b19yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgIAorICBlNzAwMF9vcHMudG9faGFzX2ZvcmtlZCA9IE5VTEw7CisgIGU3MDAwX29wcy50b19oYXNfdmZvcmtlZCA9IE5VTEw7CisgIGU3MDAwX29wcy50b19jYW5fZm9sbG93X3Zmb3JrX3ByaW9yX3RvX2V4ZWMgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgIAorICBlNzAwMF9vcHMudG9fcG9zdF9mb2xsb3dfdmZvcmsgPSBOVUxMOworICBlNzAwMF9vcHMudG9faW5zZXJ0X2V4ZWNfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGU3MDAwX29wcy50b19yZW1vdmVfZXhlY19jYXRjaHBvaW50ID0gTlVMTDsKKyAgZTcwMDBfb3BzLnRvX2hhc19leGVjZCA9IE5VTEw7CisgIGU3MDAwX29wcy50b19yZXBvcnRlZF9leGVjX2V2ZW50c19wZXJfZXhlY19jYWxsID0gTlVMTDsKKyAgZTcwMDBfb3BzLnRvX2hhc19leGl0ZWQgPSBOVUxMOworICBlNzAwMF9vcHMudG9fbW91cm5faW5mZXJpb3IgPSAgIGU3MDAwX21vdXJuX2luZmVyaW9yOwkJCisgIGU3MDAwX29wcy50b19jYW5fcnVuICA9ICAgMDsJCQkKKyAgZTcwMDBfb3BzLnRvX25vdGljZV9zaWduYWxzID0gICAwOwkJCisgIGU3MDAwX29wcy50b190aHJlYWRfYWxpdmUgID0gICAwOwkJCisgIGU3MDAwX29wcy50b19zdG9wICA9ICAgZTcwMDBfc3RvcDsKKyAgZTcwMDBfb3BzLnRvX3BpZF90b19leGVjX2ZpbGUgPSBOVUxMOwkKKyAgZTcwMDBfb3BzLnRvX2NvcmVfZmlsZV90b19zeW1fZmlsZSA9IE5VTEw7CisgIGU3MDAwX29wcy50b19zdHJhdHVtID0gICBwcm9jZXNzX3N0cmF0dW07CQorICBlNzAwMF9vcHMuRE9OVF9VU0UgPSAgIDA7CQkJCisgIGU3MDAwX29wcy50b19oYXNfYWxsX21lbW9yeSA9ICAgMTsJCQorICBlNzAwMF9vcHMudG9faGFzX21lbW9yeSA9ICAgMTsJCQorICBlNzAwMF9vcHMudG9faGFzX3N0YWNrID0gICAxOwkJCQorICBlNzAwMF9vcHMudG9faGFzX3JlZ2lzdGVycyA9ICAgMTsJCQorICBlNzAwMF9vcHMudG9faGFzX2V4ZWN1dGlvbiA9ICAgMTsJCQorICBlNzAwMF9vcHMudG9fc2VjdGlvbnMgPSAgIDA7CQkJCisgIGU3MDAwX29wcy50b19zZWN0aW9uc19lbmQgPSAgIDA7CQkKKyAgZTcwMDBfb3BzLnRvX21hZ2ljID0gICBPUFNfTUFHSUM7CQkKK307CisKK3ZvaWQKK19pbml0aWFsaXplX3JlbW90ZV9lNzAwMCAoKQoreworICBpbml0X2U3MDAwX29wcygpIDsKKyAgYWRkX3RhcmdldCAoJmU3MDAwX29wcyk7CisKKyAgYWRkX2NvbSAoImU3MDAwIiwgY2xhc3Nfb2JzY3VyZSwgZTcwMDBfY29tbWFuZCwKKwkgICAiU2VuZCBhIGNvbW1hbmQgdG8gdGhlIGU3MDAwIG1vbml0b3IuIik7CisKKyAgYWRkX2NvbSAoImZ0cGxvZ2luIiwgY2xhc3Nfb2JzY3VyZSwgZTcwMDBfbG9naW5fY29tbWFuZCwKKwkgICAiTG9naW4gdG8gbWFjaGluZSBhbmQgY2hhbmdlIHRvIGRpcmVjdG9yeS4iKTsKKworICBhZGRfY29tICgiZnRwbG9hZCIsIGNsYXNzX29ic2N1cmUsIGU3MDAwX2Z0cF9jb21tYW5kLAorCSAgICJGZXRjaCBhbmQgbG9hZCBhIGZpbGUgZnJvbSBwcmV2aW91c2x5IGRlc2NyaWJlZCBwbGFjZS4iKTsKKworICBhZGRfY29tICgiZHJhaW4iLCBjbGFzc19vYnNjdXJlLCBlNzAwMF9kcmFpbl9jb21tYW5kLAorCSAgICJEcmFpbiBwZW5kaW5nIGU3MDAwIHRleHQgYnVmZmVycy4iKTsKKworICBhZGRfc2hvd19mcm9tX3NldCAoYWRkX3NldF9jbWQgKCJ1c2VoYXJkYnJlYWtwb2ludHMiLCBub19jbGFzcywKKwkJCQkgIHZhcl9pbnRlZ2VyLCAoY2hhciAqKSZ1c2VfaGFyZF9icmVha3BvaW50cywKKwkJCQkgICJTZXQgdXNlIG9mIGhhcmR3YXJlIGJyZWFrcG9pbnRzIGZvciBhbGwgYnJlYWtwb2ludHMuXG4iLCAmc2V0bGlzdCksCisJCSAgICAgJnNob3dsaXN0KTsKK30KZGlmZiAtLWdpdCBhL2dkYi9yZW1vdGUtZWIuYyBiL2dkYi9yZW1vdGUtZWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2EzYzQxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JlbW90ZS1lYi5jCkBAIC0wLDAgKzEsMTA1NiBAQAorLyogUmVtb3RlIGRlYnVnZ2luZyBpbnRlcmZhY2UgZm9yIEFNRCAyOTAwMCBFQk1PTiBvbiBJQk0gUEMsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LiAgV3JpdHRlbiBieSBKaW0gS2luZ2RvbiBmb3IgQ3lnbnVzLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgaXMgbGlrZSByZW1vdGUuYyBidXQgaXMgZm9yIGFuIGVzb3RlcmljIHNpdHVhdGlvbi0tCisgICBoYXZpbmcgYSBhMjlrIGJvYXJkIGluIGEgUEMgaG9va2VkIHVwIHRvIGEgdW5peCBtYWNoaW5lIHdpdGgKKyAgIGEgc2VyaWFsIGxpbmUsIGFuZCBydW5uaW5nIGN0dHkgY29tMSBvbiB0aGUgUEMsIHRocm91Z2ggd2hpY2gKKyAgIHRoZSB1bml4IG1hY2hpbmUgY2FuIHJ1biBlYm1vbi4gIE5vdCB0byBtZW50aW9uIHRoYXQgdGhlIFBDCisgICBoYXMgUEMvTkZTLCBzbyBpdCBjYW4gYWNjZXNzIHRoZSBzYW1lIGV4ZWN1dGFibGVzIHRoYXQgZ2RiIGNhbiwKKyAgIG92ZXIgdGhlIG5ldCBpbiByZWFsIHRpbWUuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKworI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgIndhaXQuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgInRlcm1pbmFsLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorCitleHRlcm4gc3RydWN0IHRhcmdldF9vcHMgZWJfb3BzOwkJLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworCitzdGF0aWMgdm9pZCBlYl9jbG9zZSgpOworCisjZGVmaW5lIExPR19GSUxFICJlYi5sb2ciCisjaWYgZGVmaW5lZCAoTE9HX0ZJTEUpCitGSUxFICpsb2dfZmlsZTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHRpbWVvdXQgPSAyNDsKKworLyogRGVzY3JpcHRvciBmb3IgSS9PIHRvIHJlbW90ZSBtYWNoaW5lLiAgSW5pdGlhbGl6ZSBpdCB0byAtMSBzbyB0aGF0CisgICBlYl9vcGVuIGtub3dzIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIGZpbGUgb3BlbiB3aGVuIHRoZSBwcm9ncmFtCisgICBzdGFydHMuICAqLworaW50IGViX2Rlc2MgPSAtMTsKKworLyogc3RyZWFtIHdoaWNoIGlzIGZkb3BlbidkIGZyb20gZWJfZGVzYy4gIE9ubHkgdmFsaWQgd2hlbgorICAgZWJfZGVzYyAhPSAtMS4gICovCitGSUxFICplYl9zdHJlYW07CisKKy8qIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgcmVtb3RlIHN5c3RlbSwgZG9pbmcgYWxsIHRoZSBmYW5jeQorICAgdGltZW91dCBzdHVmZi4gICovCitzdGF0aWMgaW50CityZWFkY2hhciAoKQoreworICBjaGFyIGJ1ZjsKKworICBidWYgPSAnXDAnOworI2lmZGVmIEhBVkVfVEVSTUlPCisgIC8qIHRlcm1pbyBkb2VzIHRoZSB0aW1lb3V0IGZvciB1cy4gICovCisgIHJlYWQgKGViX2Rlc2MsICZidWYsIDEpOworI2Vsc2UKKyAgYWxhcm0gKHRpbWVvdXQpOworICBpZiAocmVhZCAoZWJfZGVzYywgJmJ1ZiwgMSkgPCAwKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKKwllcnJvciAoIlRpbWVvdXQgcmVhZGluZyBmcm9tIHJlbW90ZSBzeXN0ZW0uIik7CisgICAgICBlbHNlCisJcGVycm9yX3dpdGhfbmFtZSAoInJlbW90ZSIpOworICAgIH0KKyAgYWxhcm0gKDApOworI2VuZGlmCisKKyAgaWYgKGJ1ZiA9PSAnXDAnKQorICAgIGVycm9yICgiVGltZW91dCByZWFkaW5nIGZyb20gcmVtb3RlIHN5c3RlbS4iKTsKKyNpZiBkZWZpbmVkIChMT0dfRklMRSkKKyAgcHV0YyAoYnVmICYgMHg3ZiwgbG9nX2ZpbGUpOworI2VuZGlmCisgIHJldHVybiBidWYgJiAweDdmOworfQorCisvKiBLZWVwIGRpc2NhcmRpbmcgaW5wdXQgZnJvbSB0aGUgcmVtb3RlIHN5c3RlbSwgdW50aWwgU1RSSU5HIGlzIGZvdW5kLiAKKyAgIExldCB0aGUgdXNlciBicmVhayBvdXQgaW1tZWRpYXRlbHkuICAqLworc3RhdGljIHZvaWQKK2V4cGVjdCAoc3RyaW5nKQorICAgICBjaGFyICpzdHJpbmc7Cit7CisgIGNoYXIgKnAgPSBzdHJpbmc7CisKKyAgaW1tZWRpYXRlX3F1aXQgPSAxOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAocmVhZGNoYXIoKSA9PSAqcCkKKwl7CisJICBwKys7CisJICBpZiAoKnAgPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGltbWVkaWF0ZV9xdWl0ID0gMDsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJcCA9IHN0cmluZzsKKyAgICB9Cit9CisKKy8qIEtlZXAgZGlzY2FyZGluZyBpbnB1dCB1bnRpbCB3ZSBzZWUgdGhlIGVibW9uIHByb21wdC4KKworICAgVGhlIGNvbnZlbnRpb24gZm9yIGRlYWxpbmcgd2l0aCB0aGUgcHJvbXB0IGlzIHRoYXQgeW91CisgICBvIGdpdmUgeW91ciBjb21tYW5kCisgICBvICp0aGVuKiB3YWl0IGZvciB0aGUgcHJvbXB0LgorCisgICBUaHVzIHRoZSBsYXN0IHRoaW5nIHRoYXQgYSBwcm9jZWR1cmUgZG9lcyB3aXRoIHRoZSBzZXJpYWwgbGluZQorICAgd2lsbCBiZSBhbiBleHBlY3RfcHJvbXB0KCkuICBFeGNlcHRpb246ICBlYl9yZXN1bWUgZG9lcyBub3QKKyAgIHdhaXQgZm9yIHRoZSBwcm9tcHQsIGJlY2F1c2UgdGhlIHRlcm1pbmFsIGlzIGJlaW5nIGhhbmRlZCBvdmVyCisgICB0byB0aGUgaW5mZXJpb3IuICBIb3dldmVyLCB0aGUgbmV4dCB0aGluZyB3aGljaCBoYXBwZW5zIGFmdGVyIHRoYXQKKyAgIGlzIGEgZWJfd2FpdCB3aGljaCBkb2VzIHdhaXQgZm9yIHRoZSBwcm9tcHQuCisgICBOb3RlIHRoYXQgdGhpcyBpbmNsdWRlcyBhYm5vcm1hbCBleGl0LCBlLmcuIGVycm9yKCkuICBUaGlzIGlzCisgICBuZWNlc3NhcnkgdG8gcHJldmVudCBnZXR0aW5nIGludG8gc3RhdGVzIGZyb20gd2hpY2ggd2UgY2FuJ3QKKyAgIHJlY292ZXIuICAqLworc3RhdGljIHZvaWQKK2V4cGVjdF9wcm9tcHQgKCkKK3sKKyNpZiBkZWZpbmVkIChMT0dfRklMRSkKKyAgLyogVGhpcyBpcyBhIGNvbnZlbmllbnQgcGxhY2UgdG8gZG8gdGhpcy4gIFRoZSBpZGVhIGlzIHRvIGRvIGl0IG9mdGVuCisgICAgIGVub3VnaCB0aGF0IHdlIG5ldmVyIGxvc2UgbXVjaCBkYXRhIGlmIHdlIHRlcm1pbmF0ZSBhYm5vcm1hbGx5LiAgKi8KKyAgZmZsdXNoIChsb2dfZmlsZSk7CisjZW5kaWYKKyAgZXhwZWN0ICgiXG4jICIpOworfQorCisvKiBHZXQgYSBoZXggZGlnaXQgZnJvbSB0aGUgcmVtb3RlIHN5c3RlbSAmIHJldHVybiBpdHMgdmFsdWUuCisgICBJZiBpZ25vcmVfc3BhY2UgaXMgbm9uemVybywgaWdub3JlIHNwYWNlcyAobm90IG5ld2xpbmUsIHRhYiwgZXRjKS4gICovCitzdGF0aWMgaW50CitnZXRfaGV4X2RpZ2l0IChpZ25vcmVfc3BhY2UpCisgICAgIGludCBpZ25vcmVfc3BhY2U7Cit7CisgIGludCBjaDsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgY2ggPSByZWFkY2hhciAoKTsKKyAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQorCXJldHVybiBjaCAtICcwJzsKKyAgICAgIGVsc2UgaWYgKGNoID49ICdBJyAmJiBjaCA8PSAnRicpCisJcmV0dXJuIGNoIC0gJ0EnICsgMTA7CisgICAgICBlbHNlIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKQorCXJldHVybiBjaCAtICdhJyArIDEwOworICAgICAgZWxzZSBpZiAoY2ggPT0gJyAnICYmIGlnbm9yZV9zcGFjZSkKKwk7CisgICAgICBlbHNlCisJeworCSAgZXhwZWN0X3Byb21wdCAoKTsKKwkgIGVycm9yICgiSW52YWxpZCBoZXggZGlnaXQgZnJvbSByZW1vdGUgc3lzdGVtLiIpOworCX0KKyAgICB9Cit9CisKKy8qIEdldCBhIGJ5dGUgZnJvbSBlYl9kZXNjIGFuZCBwdXQgaXQgaW4gKkJZVC4gIEFjY2VwdCBhbnkgbnVtYmVyCisgICBsZWFkaW5nIHNwYWNlcy4gICovCitzdGF0aWMgdm9pZAorZ2V0X2hleF9ieXRlIChieXQpCisgICAgIGNoYXIgKmJ5dDsKK3sKKyAgaW50IHZhbDsKKworICB2YWwgPSBnZXRfaGV4X2RpZ2l0ICgxKSA8PCA0OworICB2YWwgfD0gZ2V0X2hleF9kaWdpdCAoMCk7CisgICpieXQgPSB2YWw7Cit9CisKKy8qIEdldCBOIDMyLWJpdCB3b3JkcyBmcm9tIHJlbW90ZSwgZWFjaCBwcmVjZWRlZCBieSBhIHNwYWNlLAorICAgYW5kIHB1dCB0aGVtIGluIHJlZ2lzdGVycyBzdGFydGluZyBhdCBSRUdOTy4gICovCitzdGF0aWMgdm9pZAorZ2V0X2hleF9yZWdzIChuLCByZWdubykKKyAgICAgaW50IG47CisgICAgIGludCByZWdubzsKK3sKKyAgbG9uZyB2YWw7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgaW50IGo7CisgICAgICAKKyAgICAgIHZhbCA9IDA7CisgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCXZhbCA9ICh2YWwgPDwgNCkgKyBnZXRfaGV4X2RpZ2l0IChqID09IDApOworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubysrLCAoY2hhciAqKSAmdmFsKTsKKyAgICB9Cit9CisKKy8qIENhbGxlZCB3aGVuIFNJR0FMUk0gc2lnbmFsIHNlbnQgZHVlIHRvIGFsYXJtKCkgdGltZW91dC4gICovCisjaWZuZGVmIEhBVkVfVEVSTUlPCisKKyNpZm5kZWYgX19TVERDX18KKyNkZWZpbmUgdm9sYXRpbGUgLyoqLworI2VuZGlmCit2b2xhdGlsZSBpbnQgbl9hbGFybXM7CisKK3ZvaWQKK2ViX3RpbWVyICgpCit7CisjaWYgMAorICBpZiAoa2lvZGVidWcpCisgICAgcHJpbnRmICgiZWJfdGltZXIgY2FsbGVkXG4iKTsKKyNlbmRpZgorICBuX2FsYXJtcysrOworfQorI2VuZGlmCisKKy8qIG1hbGxvYydkIG5hbWUgb2YgdGhlIHByb2dyYW0gb24gdGhlIHJlbW90ZSBzeXN0ZW0uICAqLworc3RhdGljIGNoYXIgKnByb2dfbmFtZSA9IE5VTEw7CisKKy8qIE5vbnplcm8gaWYgd2UgaGF2ZSBsb2FkZWQgdGhlIGZpbGUgKCJ5YyIpIGFuZCBub3QgeWV0IGlzc3VlZCBhICJnaSIKKyAgIGNvbW1hbmQuICAiZ2kiIGlzIHN1cHBvc2VkIHRvIGhhcHBlbiBleGFjdGx5IG9uY2UgZm9yIGVhY2ggInljIi4gICovCitzdGF0aWMgaW50IG5lZWRfZ2kgPSAwOworCisvKiBOdW1iZXIgb2YgU0lHVFJBUHMgd2UgbmVlZCB0byBzaW11bGF0ZS4gIFRoYXQgaXMsIHRoZSBuZXh0CisgICBORUVEX0FSVElGSUNJQUxfVFJBUCBjYWxscyB0byBlYl93YWl0IHNob3VsZCBqdXN0IHJldHVybgorICAgU0lHVFJBUCB3aXRob3V0IGFjdHVhbGx5IHdhaXRpbmcgZm9yIGFueXRoaW5nLiAgKi8KKworc3RhdGljIGludCBuZWVkX2FydGlmaWNpYWxfdHJhcCA9IDA7CisKKy8qIFRoaXMgaXMgY2FsbGVkIG5vdCBvbmx5IHdoZW4gd2UgZmlyc3QgYXR0YWNoLCBidXQgYWxzbyB3aGVuIHRoZQorICAgdXNlciB0eXBlcyAicnVuIiBhZnRlciBoYXZpbmcgYXR0YWNoZWQuICAqLworc3RhdGljIHZvaWQKK2ViX2NyZWF0ZV9pbmZlcmlvciAoZXhlY2ZpbGUsIGFyZ3MsIGVudikKKyAgICAgY2hhciAqZXhlY2ZpbGU7CisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGludCBlbnRyeV9wdDsKKworICBpZiAoYXJncyAmJiAqYXJncykKKyAgICBlcnJvciAoIkNhbid0IHBhc3MgYXJndW1lbnRzIHRvIHJlbW90ZSBFQk1PTiBwcm9jZXNzIik7CisKKyAgaWYgKGV4ZWNmaWxlID09IDAgfHwgZXhlY19iZmQgPT0gMCkKKyAgICBlcnJvciAoIk5vIGV4ZWN1dGFibGUgZmlsZSBzcGVjaWZpZWQiKTsKKworICBlbnRyeV9wdCA9IChpbnQpIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoZXhlY19iZmQpOworCisgIHsKKyAgICAvKiBPSywgbm93IHJlYWQgaW4gdGhlIGZpbGUuICBZPXJlYWQsIEM9Q09GRiwgRD1ubyBzeW1ib2xzCisgICAgICAgMD1zdGFydCBhZGRyZXNzLCAlcz1maWxlbmFtZS4gICovCisKKyAgICBmcHJpbnRmIChlYl9zdHJlYW0sICJZQyBELDA6JXMiLCBwcm9nX25hbWUpOworCisgICAgaWYgKGFyZ3MgIT0gTlVMTCkKKwlmcHJpbnRmKGViX3N0cmVhbSwgIiAlcyIsIGFyZ3MpOworCisgICAgZnByaW50ZiAoZWJfc3RyZWFtLCAiXG4iKTsKKyAgICBmZmx1c2ggKGViX3N0cmVhbSk7CisKKyAgICBleHBlY3RfcHJvbXB0ICgpOworCisgICAgbmVlZF9naSA9IDE7CisgIH0KKworLyogVGhlICJwcm9jZXNzIiAoYm9hcmQpIGlzIGFscmVhZHkgc3RvcHBlZCBhd2FpdGluZyBvdXIgY29tbWFuZHMsIGFuZAorICAgdGhlIHByb2dyYW0gaXMgYWxyZWFkeSBkb3dubG9hZGVkLiAgV2UganVzdCBzZXQgaXRzIFBDIGFuZCBnby4gICovCisKKyAgY2xlYXJfcHJvY2VlZF9zdGF0dXMgKCk7CisKKyAgLyogVGVsbCB3YWl0X2Zvcl9pbmZlcmlvciB0aGF0IHdlJ3ZlIHN0YXJ0ZWQgYSBuZXcgcHJvY2Vzcy4gICovCisgIGluaXRfd2FpdF9mb3JfaW5mZXJpb3IgKCk7CisKKyAgLyogU2V0IHVwIHRoZSAic2F2ZWQgdGVybWluYWwgbW9kZXMiIG9mIHRoZSBpbmZlcmlvcgorICAgICBiYXNlZCBvbiB3aGF0IG1vZGVzIHdlIGFyZSBzdGFydGluZyBpdCB3aXRoLiAgKi8KKyAgdGFyZ2V0X3Rlcm1pbmFsX2luaXQgKCk7CisKKyAgLyogSW5zdGFsbCBpbmZlcmlvcidzIHRlcm1pbmFsIG1vZGVzLiAgKi8KKyAgdGFyZ2V0X3Rlcm1pbmFsX2luZmVyaW9yICgpOworCisgIC8qIGluc2VydF9zdGVwX2JyZWFrcG9pbnQgKCk7ICBGSVhNRSwgZG8gd2UgbmVlZCB0aGlzPyAgKi8KKyAgcHJvY2VlZCAoKENPUkVfQUREUillbnRyeV9wdCwgVEFSR0VUX1NJR05BTF9ERUZBVUxULCAwKTsJCS8qIExldCAnZXIgcmlwLi4uICovCit9CisKKy8qIFRyYW5zbGF0ZSBiYXVkIHJhdGVzIGZyb20gaW50ZWdlcnMgdG8gZGFtbiBCX2NvZGVzLiAgVW5peCBzaG91bGQKKyAgIGhhdmUgb3V0Z3Jvd24gdGhpcyBjcmFwIHllYXJzIGFnbywgYnV0IGV2ZW4gUE9TSVggd291bGRuJ3QgYnVjayBpdC4gICovCisKKyNpZm5kZWYgQjE5MjAwCisjZGVmaW5lIEIxOTIwMCBFWFRBCisjZW5kaWYKKyNpZm5kZWYgQjM4NDAwCisjZGVmaW5lIEIzODQwMCBFWFRCCisjZW5kaWYKKworc3RydWN0IHtpbnQgcmF0ZSwgZGFtbl9iO30gYmF1ZHRhYltdID0geworCXswLCBCMH0sCisJezUwLCBCNTB9LAorCXs3NSwgQjc1fSwKKwl7MTEwLCBCMTEwfSwKKwl7MTM0LCBCMTM0fSwKKwl7MTUwLCBCMTUwfSwKKwl7MjAwLCBCMjAwfSwKKwl7MzAwLCBCMzAwfSwKKwl7NjAwLCBCNjAwfSwKKwl7MTIwMCwgQjEyMDB9LAorCXsxODAwLCBCMTgwMH0sCisJezI0MDAsIEIyNDAwfSwKKwl7NDgwMCwgQjQ4MDB9LAorCXs5NjAwLCBCOTYwMH0sCisJezE5MjAwLCBCMTkyMDB9LAorCXszODQwMCwgQjM4NDAwfSwKKwl7LTEsIC0xfSwKK307CisKK2ludCBkYW1uX2IgKHJhdGUpCisgICAgIGludCByYXRlOworeworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBiYXVkdGFiW2ldLnJhdGUgIT0gLTE7IGkrKykKKyAgICBpZiAocmF0ZSA9PSBiYXVkdGFiW2ldLnJhdGUpIHJldHVybiBiYXVkdGFiW2ldLmRhbW5fYjsKKyAgcmV0dXJuIEIzODQwMDsJLyogUmFuZG9tICovCit9CisKKworLyogT3BlbiBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgZGVidWdnZXIuCisgICBOQU1FIGlzIHRoZSBmaWxlbmFtZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uLCB0aGVuIGEgc3BhY2UsCisgICB0aGVuIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIGFzIHdlIHNob3VsZCBuYW1lIGl0IHRvIEVCTU9OLiAgKi8KKworc3RhdGljIGludCBiYXVkcmF0ZSA9IDk2MDA7CitzdGF0aWMgY2hhciAqZGV2X25hbWU7Cit2b2lkCitlYl9vcGVuIChuYW1lLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICBURVJNSU5BTCBzZzsKKworICBjaGFyICpwOworCisgIHRhcmdldF9wcmVvcGVuIChmcm9tX3R0eSk7CisgIAorICAvKiBGaW5kIHRoZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciwgaXQgc2VwYXJhdGVzIGRldl9uYW1lIGZyb20KKyAgICAgcHJvZ19uYW1lLiAgKi8KKyAgaWYgKG5hbWUgPT0gMCkKKyAgICBnb3RvIGVycm9pZDsKKworICBmb3IgKHAgPSBuYW1lOworICAgICAgICpwICE9ICdcMCcgJiYgIWlzc3BhY2UgKCpwKTsgcCsrKQorICAgIDsKKyAgaWYgKCpwID09ICdcMCcpCitlcnJvaWQ6CisgICAgZXJyb3IgKCJcCitQbGVhc2UgaW5jbHVkZSB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlIGZvciB0aGUgc2VyaWFsIHBvcnQsXG5cCit0aGUgYmF1ZCByYXRlLCBhbmQgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gcnVuIG9uIHRoZSByZW1vdGUgc3lzdGVtLiIpOworICBkZXZfbmFtZSA9IGFsbG9jYSAocCAtIG5hbWUgKyAxKTsKKyAgc3RybmNweSAoZGV2X25hbWUsIG5hbWUsIHAgLSBuYW1lKTsKKyAgZGV2X25hbWVbcCAtIG5hbWVdID0gJ1wwJzsKKworICAvKiBTa2lwIG92ZXIgdGhlIHdoaXRlc3BhY2UgYWZ0ZXIgZGV2X25hbWUgKi8KKyAgZm9yICg7IGlzc3BhY2UgKCpwKTsgcCsrKQorICAgIC8qRU1QVFkqLzsKKyAgCisgIGlmICgxICE9IHNzY2FuZiAocCwgIiVkICIsICZiYXVkcmF0ZSkpCisgICAgZ290byBlcnJvaWQ7CisKKyAgLyogU2tpcCB0aGUgbnVtYmVyIGFuZCB0aGVuIHRoZSBzcGFjZXMgKi8KKyAgZm9yICg7IGlzZGlnaXQgKCpwKTsgcCsrKQorICAgIC8qRU1QVFkqLzsKKyAgZm9yICg7IGlzc3BhY2UgKCpwKTsgcCsrKQorICAgIC8qRU1QVFkqLzsKKyAgCisgIGlmIChwcm9nX25hbWUgIT0gTlVMTCkKKyAgICBmcmVlIChwcm9nX25hbWUpOworICBwcm9nX25hbWUgPSBzYXZlc3RyaW5nIChwLCBzdHJsZW4gKHApKTsKKworICBlYl9jbG9zZSAoMCk7CisKKyAgZWJfZGVzYyA9IG9wZW4gKGRldl9uYW1lLCBPX1JEV1IpOworICBpZiAoZWJfZGVzYyA8IDApCisgICAgcGVycm9yX3dpdGhfbmFtZSAoZGV2X25hbWUpOworICBpb2N0bCAoZWJfZGVzYywgVElPQ0dFVFAsICZzZyk7CisjaWZkZWYgSEFWRV9URVJNSU8KKyAgc2cuY19jY1tWTUlOXSA9IDA7CQkvKiByZWFkIHdpdGggdGltZW91dC4gICovCisgIHNnLmNfY2NbVlRJTUVdID0gdGltZW91dCAqIDEwOworICBzZy5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyk7CisgIHNnLmNfY2ZsYWcgPSAoc2cuY19jZmxhZyAmIH5DQkFVRCkgfCBkYW1uX2IgKGJhdWRyYXRlKTsKKyNlbHNlCisgIHNnLnNnX2lzcGVlZCA9IGRhbW5fYiAoYmF1ZHJhdGUpOworICBzZy5zZ19vc3BlZWQgPSBkYW1uX2IgKGJhdWRyYXRlKTsKKyAgc2cuc2dfZmxhZ3MgfD0gUkFXIHwgQU5ZUDsKKyAgc2cuc2dfZmxhZ3MgJj0gfkVDSE87CisjZW5kaWYKKworICBpb2N0bCAoZWJfZGVzYywgVElPQ1NFVFAsICZzZyk7CisgIGViX3N0cmVhbSA9IGZkb3BlbiAoZWJfZGVzYywgInIrIik7CisKKyAgcHVzaF90YXJnZXQgKCZlYl9vcHMpOworICBpZiAoZnJvbV90dHkpCisgICAgcHJpbnRmICgiUmVtb3RlICVzIGRlYnVnZ2luZyAlcyB1c2luZyAlc1xuIiwgdGFyZ2V0X3Nob3J0bmFtZSwKKwkgICAgcHJvZ19uYW1lLCBkZXZfbmFtZSk7CisKKyNpZm5kZWYgSEFWRV9URVJNSU8KKyNpZm5kZWYgTk9fU0lHSU5URVJSVVBUCisgIC8qIENhdXNlIFNJR0FMUk0ncyB0byBtYWtlIHJlYWRzIGZhaWwgd2l0aCBFSU5UUiBpbnN0ZWFkIG9mIHJlc3VtaW5nCisgICAgIHRoZSByZWFkLiAgKi8KKyAgaWYgKHNpZ2ludGVycnVwdCAoU0lHQUxSTSwgMSkgIT0gMCkKKyAgICBwZXJyb3IgKCJlYl9vcGVuOiBlcnJvciBpbiBzaWdpbnRlcnJ1cHQiKTsKKyNlbmRpZgorCisgIC8qIFNldCB1cCByZWFkIHRpbWVvdXQgdGltZXIuICAqLworICBpZiAoKHZvaWQgKCopKSBzaWduYWwgKFNJR0FMUk0sIGViX3RpbWVyKSA9PSAodm9pZCAoKikpIC0xKQorICAgIHBlcnJvciAoImViX29wZW46IGVycm9yIGluIHNpZ25hbCIpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChMT0dfRklMRSkKKyAgbG9nX2ZpbGUgPSBmb3BlbiAoTE9HX0ZJTEUsICJ3Iik7CisgIGlmIChsb2dfZmlsZSA9PSBOVUxMKQorICAgIHBlcnJvcl93aXRoX25hbWUgKExPR19GSUxFKTsKKyNlbmRpZgorCisgIC8qIEhlbGxvPyAgQXJlIHlvdSB0aGVyZT8gICovCisgIHdyaXRlIChlYl9kZXNjLCAiXG4iLCAxKTsKKyAgCisgIGV4cGVjdF9wcm9tcHQgKCk7Cit9CisKKy8qIENsb3NlIG91dCBhbGwgZmlsZXMgYW5kIGxvY2FsIHN0YXRlIGJlZm9yZSB0aGlzIHRhcmdldCBsb3NlcyBjb250cm9sLiAqLworCitzdGF0aWMgdm9pZAorZWJfY2xvc2UgKHF1aXR0aW5nKQorICAgICBpbnQgcXVpdHRpbmc7Cit7CisKKyAgLyogRHVlIHRvIGEgYnVnIGluIFVuaXgsIGZjbG9zZSBjbG9zZXMgbm90IG9ubHkgdGhlIHN0ZGlvIHN0cmVhbSwKKyAgICAgYnV0IGFsc28gdGhlIGZpbGUgZGVzY3JpcHRvci4gIFNvIHdlIGRvbid0IGFjdHVhbGx5IGNsb3NlCisgICAgIGViX2Rlc2MuICAqLworICBpZiAoZWJfc3RyZWFtKQorICAgIGZjbG9zZSAoZWJfc3RyZWFtKTsJLyogVGhpcyBhbHNvIGNsb3NlcyBlYl9kZXNjICovCisgIGlmIChlYl9kZXNjID49IDApCisgICAgLyogY2xvc2UgKGViX2Rlc2MpOyAqLworCisgIC8qIERvIG5vdCB0cnkgdG8gY2xvc2UgZWJfZGVzYyBhZ2FpbiwgbGF0ZXIgaW4gdGhlIHByb2dyYW0uICAqLworICBlYl9zdHJlYW0gPSBOVUxMOworICBlYl9kZXNjID0gLTE7CisKKyNpZiBkZWZpbmVkIChMT0dfRklMRSkKKyAgaWYgKGxvZ19maWxlKSB7CisgICAgaWYgKGZlcnJvciAobG9nX2ZpbGUpKQorICAgICAgcHJpbnRmICgiRXJyb3Igd3JpdGluZyBsb2cgZmlsZS5cbiIpOworICAgIGlmIChmY2xvc2UgKGxvZ19maWxlKSAhPSAwKQorICAgICAgcHJpbnRmICgiRXJyb3IgY2xvc2luZyBsb2cgZmlsZS5cbiIpOworICB9CisjZW5kaWYKK30KKworLyogVGVybWluYXRlIHRoZSBvcGVuIGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSBkZWJ1Z2dlci4KKyAgIFVzZSB0aGlzIHdoZW4geW91IHdhbnQgdG8gZGV0YWNoIGFuZCBkbyBzb21ldGhpbmcgZWxzZQorICAgd2l0aCB5b3VyIGdkYi4gICovCit2b2lkCitlYl9kZXRhY2ggKGZyb21fdHR5KQorICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHBvcF90YXJnZXQoKTsJCS8qIGNhbGxzIGViX2Nsb3NlIHRvIGRvIHRoZSByZWFsIHdvcmsgKi8KKyAgaWYgKGZyb21fdHR5KQorICAgIHByaW50ZiAoIkVuZGluZyByZW1vdGUgJXMgZGVidWdnaW5nXG4iLCB0YXJnZXRfc2hvcnRuYW1lKTsKK30KKyAKKy8qIFRlbGwgdGhlIHJlbW90ZSBtYWNoaW5lIHRvIHJlc3VtZS4gICovCisKK3ZvaWQKK2ViX3Jlc3VtZSAocGlkLCBzdGVwLCBzaWcpCisgICAgIGludCBwaWQsIHN0ZXA7CisgICAgIGVudW0gdGFyZ2V0X3NpZ25hbCBzaWc7Cit7CisgIGlmIChzdGVwKQorICAgIHsKKyAgICAgIHdyaXRlIChlYl9kZXNjLCAidCAxLHNcbiIsIDYpOworICAgICAgLyogV2FpdCBmb3IgdGhlIGVjaG8uICAqLworICAgICAgZXhwZWN0ICgidCAxLHNcciIpOworICAgICAgLyogVGhlbiBjb21lcyBhIGxpbmUgY29udGFpbmluZyB0aGUgaW5zdHJ1Y3Rpb24gd2Ugc3RlcHBlZCB0by4gICovCisgICAgICBleHBlY3QgKCJcbkAiKTsKKyAgICAgIC8qIFRoZW4gd2UgZ2V0IHRoZSBwcm9tcHQuICAqLworICAgICAgZXhwZWN0X3Byb21wdCAoKTsKKworICAgICAgLyogRm9yY2UgdGhlIG5leHQgZWJfd2FpdCB0byByZXR1cm4gYSB0cmFwLiAgTm90IGRvaW5nIGFueXRoaW5nCisgICAgICAgICBhYm91dCBJL08gZnJvbSB0aGUgdGFyZ2V0IG1lYW5zIHRoYXQgdGhlIHVzZXIgaGFzIHRvIHR5cGUKKyAgICAgICAgICJjb250aW51ZSIgdG8gc2VlIGFueS4gIFRoaXMgc2hvdWxkIGJlIGZpeGVkLiAgKi8KKyAgICAgIG5lZWRfYXJ0aWZpY2lhbF90cmFwID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAobmVlZF9naSkKKwl7CisJICBuZWVkX2dpID0gMDsKKwkgIHdyaXRlIChlYl9kZXNjLCAiZ2lcbiIsIDMpOworCSAgCisJICAvKiBTd2FsbG93IHRoZSBlY2hvIG9mICJnaSIuICAqLworCSAgZXhwZWN0ICgiZ2lcciIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB3cml0ZSAoZWJfZGVzYywgIkdSXG4iLCAzKTsKKwkgIC8qIFN3YWxsb3cgdGhlIGVjaG8uICAqLworCSAgZXhwZWN0ICgiR1JcciIpOworCX0KKyAgICB9Cit9CisKKy8qIFdhaXQgdW50aWwgdGhlIHJlbW90ZSBtYWNoaW5lIHN0b3BzLCB0aGVuIHJldHVybiwKKyAgIHN0b3Jpbmcgc3RhdHVzIGluIFNUQVRVUyBqdXN0IGFzIGB3YWl0JyB3b3VsZC4gICovCisKK2ludAorZWJfd2FpdCAoc3RhdHVzKQorICAgICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0YXR1czsKK3sKKyAgLyogU3RyaW5ncyB0byBsb29rIGZvci4gICc/JyBtZWFucyBtYXRjaCBhbnkgc2luZ2xlIGNoYXJhY3Rlci4gIAorICAgICBOb3RlIHRoYXQgd2l0aCB0aGUgYWxnb3JpdGhtIHdlIHVzZSwgdGhlIGluaXRpYWwgY2hhcmFjdGVyCisgICAgIG9mIHRoZSBzdHJpbmcgY2Fubm90IHJlY3VyIGluIHRoZSBzdHJpbmcsIG9yIHdlIHdpbGwgbm90CisgICAgIGZpbmQgc29tZSBjYXNlcyBvZiB0aGUgc3RyaW5nIGluIHRoZSBpbnB1dC4gICovCisgIAorICBzdGF0aWMgY2hhciBicHRbXSA9ICJJbnZhbGlkIGludGVycnVwdCB0YWtlbiAtICMweDUwIC0gIjsKKyAgLyogSXQgd291bGQgYmUgdGVtcHRpbmcgdG8gbG9vayBmb3IgIlxuW19fZXhpdCArIDB4OF1cbiIKKyAgICAgYnV0IHRoYXQgcmVxdWlyZXMgbG9hZGluZyBzeW1ib2xzIHdpdGggInljIGkiIGFuZCBldmVuIGlmCisgICAgIHdlIGRpZCBkbyB0aGF0IHdlIGRvbid0IGtub3cgdGhhdCB0aGUgZmlsZSBoYXMgc3ltYm9scy4gICovCisgIHN0YXRpYyBjaGFyIGV4aXRtc2dbXSA9ICJcbkA/Pz8/Pz8/P0kgICAgSk1QVEkgICAgIEdSMTIxLExSMCI7CisgIGNoYXIgKmJwID0gYnB0OworICBjaGFyICplcCA9IGV4aXRtc2c7CisKKyAgLyogTGFyZ2UgZW5vdWdoIGZvciBlaXRoZXIgc2l6ZW9mIChicHQpIG9yIHNpemVvZiAoZXhpdG1zZykgY2hhcnMuICAqLworICBjaGFyIHN3YWxsb3dlZFs1MF07CisgIC8qIEN1cnJlbnQgcG9zaXRpb24gaW4gc3dhbGxvd2VkLiAgKi8KKyAgY2hhciAqc3dhbGxvd2VkX3AgPSBzd2FsbG93ZWQ7CisKKyAgaW50IGNoOworICBpbnQgY2hfaGFuZGxlZDsKKworICBpbnQgb2xkX3RpbWVvdXQgPSB0aW1lb3V0OworCisgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9FWElURUQ7CisgIHN0YXR1cy0+dmFsdWUuaW50ZWdlciA9IDA7CisKKyAgaWYgKG5lZWRfYXJ0aWZpY2lhbF90cmFwICE9IDApCisgICAgeworICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVFJBUDsKKyAgICAgIG5lZWRfYXJ0aWZpY2lhbF90cmFwLS07CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgdGltZW91dCA9IDA7CQkvKiBEb24ndCB0aW1lIG91dCAtLSB1c2VyIHByb2dyYW0gaXMgcnVubmluZy4gKi8KKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgY2hfaGFuZGxlZCA9IDA7CisgICAgICBjaCA9IHJlYWRjaGFyICgpOworICAgICAgaWYgKGNoID09ICpicCkKKwl7CisJICBicCsrOworCSAgaWYgKCpicCA9PSAnXDAnKQorCSAgICBicmVhazsKKwkgIGNoX2hhbmRsZWQgPSAxOworCisJICAqc3dhbGxvd2VkX3ArKyA9IGNoOworCX0KKyAgICAgIGVsc2UKKwlicCA9IGJwdDsKKworICAgICAgaWYgKGNoID09ICplcCB8fCAqZXAgPT0gJz8nKQorCXsKKwkgIGVwKys7CisJICBpZiAoKmVwID09ICdcMCcpCisJICAgIGJyZWFrOworCisJICBpZiAoIWNoX2hhbmRsZWQpCisJICAgICpzd2FsbG93ZWRfcCsrID0gY2g7CisJICBjaF9oYW5kbGVkID0gMTsKKwl9CisgICAgICBlbHNlCisJZXAgPSBleGl0bXNnOworCisgICAgICBpZiAoIWNoX2hhbmRsZWQpCisJeworCSAgY2hhciAqcDsKKworCSAgLyogUHJpbnQgb3V0IGFueSBjaGFyYWN0ZXJzIHdoaWNoIGhhdmUgYmVlbiBzd2FsbG93ZWQuICAqLworCSAgZm9yIChwID0gc3dhbGxvd2VkOyBwIDwgc3dhbGxvd2VkX3A7ICsrcCkKKwkgICAgcHV0YyAoKnAsIHN0ZG91dCk7CisJICBzd2FsbG93ZWRfcCA9IHN3YWxsb3dlZDsKKwkgIAorCSAgcHV0YyAoY2gsIHN0ZG91dCk7CisJfQorICAgIH0KKyAgZXhwZWN0X3Byb21wdCAoKTsKKyAgaWYgKCpicD09ICdcMCcpCisgICAgeworICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVFJBUDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVEOworICAgICAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gMDsKKyAgICB9CisgIHRpbWVvdXQgPSBvbGRfdGltZW91dDsKKworICByZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHRoZSBuYW1lIG9mIHJlZ2lzdGVyIG51bWJlciBSRUdOTworICAgaW4gdGhlIGZvcm0gaW5wdXQgYW5kIG91dHB1dCBieSBFQk1PTi4KKworICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBzdGF0aWMgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGFuc3dlci4gICovCitzdGF0aWMgY2hhciAqCitnZXRfcmVnX25hbWUgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHN0YXRpYyBjaGFyIGJ1Zls4MF07CisgIGlmIChyZWdubyA+PSBHUjk2X1JFR05VTSAmJiByZWdubyA8IEdSOTZfUkVHTlVNICsgMzIpCisgICAgc3ByaW50ZiAoYnVmLCAiR1IlMDNkIiwgcmVnbm8gLSBHUjk2X1JFR05VTSArIDk2KTsKKyAgZWxzZSBpZiAocmVnbm8gPj0gTFIwX1JFR05VTSAmJiByZWdubyA8IExSMF9SRUdOVU0gKyAxMjgpCisgICAgc3ByaW50ZiAoYnVmLCAiTFIlMDNkIiwgcmVnbm8gLSBMUjBfUkVHTlVNKTsKKyAgZWxzZSBpZiAocmVnbm8gPT0gUV9SRUdOVU0pCisgICAgc3RyY3B5IChidWYsICJTUjEzMSIpOworICBlbHNlIGlmIChyZWdubyA+PSBCUF9SRUdOVU0gJiYgcmVnbm8gPD0gQ1JfUkVHTlVNKQorICAgIHNwcmludGYgKGJ1ZiwgIlNSJTAzZCIsIHJlZ25vIC0gQlBfUkVHTlVNICsgMTMzKTsKKyAgZWxzZSBpZiAocmVnbm8gPT0gQUxVX1JFR05VTSkKKyAgICBzdHJjcHkgKGJ1ZiwgIlNSMTMyIik7CisgIGVsc2UgaWYgKHJlZ25vID49IElQQ19SRUdOVU0gJiYgcmVnbm8gPD0gSVBCX1JFR05VTSkKKyAgICBzcHJpbnRmIChidWYsICJTUiUwM2QiLCByZWdubyAtIElQQ19SRUdOVU0gKyAxMjgpOworICBlbHNlIGlmIChyZWdubyA+PSBWQUJfUkVHTlVNICYmIHJlZ25vIDw9IExSVV9SRUdOVU0pCisgICAgc3ByaW50ZiAoYnVmLCAiU1IlMDNkIiwgcmVnbm8gLSBWQUJfUkVHTlVNKTsKKyAgZWxzZSBpZiAocmVnbm8gPT0gR1IxX1JFR05VTSkKKyAgICBzdHJjcHkgKGJ1ZiwgIkdSMDAxIik7CisgIHJldHVybiBidWY7Cit9CisKKy8qIFJlYWQgdGhlIHJlbW90ZSByZWdpc3RlcnMgaW50byB0aGUgYmxvY2sgUkVHUy4gICovCisKK3N0YXRpYyB2b2lkCitlYl9mZXRjaF9yZWdpc3RlcnMgKCkKK3sKKyAgaW50IHJlZ19pbmRleDsKKyAgaW50IHJlZ251bV9pbmRleDsKKyAgY2hhciB0ZW1wYnVmWzEwXTsKKyAgaW50IGk7CisKKyNpZiAwCisgIC8qIFRoaXMgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnksIGJlY2F1c2Ugb25lIGlzIHN1cHBvc2VkIHRvIHJlYWQgdGhlCisgICAgIHJlZ2lzdGVycyBvbmx5IHdoZW4gdGhlIGluZmVyaW9yIGlzIHN0b3BwZWQgKGF0IGxlYXN0IHdpdGgKKyAgICAgcHRyYWNlKCkgYW5kIHdoeSBub3QgbWFrZSBpdCB0aGUgc2FtZSBmb3IgcmVtb3RlPykuICAqLworICAvKiBeQSBpcyB0aGUgIm5vcm1hbCBjaGFyYWN0ZXIiIHVzZWQgdG8gbWFrZSBzdXJlIHdlIGFyZSB0YWxraW5nIHRvIEVCTU9OCisgICAgIGFuZCBub3QgdG8gdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQuICAqLworICB3cml0ZSAoZWJfZGVzYywgIlwwMDFcbiIpOworICBleHBlY3RfcHJvbXB0ICgpOworI2VuZGlmCisKKyAgd3JpdGUgKGViX2Rlc2MsICJkdyBncjk2LGdyMTI3XG4iLCAxNCk7CisgIGZvciAocmVnX2luZGV4ID0gOTYsIHJlZ251bV9pbmRleCA9IEdSOTZfUkVHTlVNOworICAgICAgIHJlZ19pbmRleCA8IDEyODsKKyAgICAgICByZWdfaW5kZXggKz0gNCwgcmVnbnVtX2luZGV4ICs9IDQpCisgICAgeworICAgICAgc3ByaW50ZiAodGVtcGJ1ZiwgIkdSJTAzZCAiLCByZWdfaW5kZXgpOworICAgICAgZXhwZWN0ICh0ZW1wYnVmKTsKKyAgICAgIGdldF9oZXhfcmVncyAoNCwgcmVnbnVtX2luZGV4KTsKKyAgICAgIGV4cGVjdCAoIlxuIik7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkgKz0gMzIpCisgICAgeworICAgICAgLyogVGhlIFBDIGhhcyBhIHRlbmRlbmN5IHRvIGhhbmcgaWYgd2UgZ2V0IHRoZXNlCisJIGFsbCBpbiBvbmUgZmVsbCBzd29vcCAoImR3IGxyMCxscjEyNyIpLiAgKi8KKyAgICAgIHNwcmludGYgKHRlbXBidWYsICJkdyBsciVkXG4iLCBpKTsKKyAgICAgIHdyaXRlIChlYl9kZXNjLCB0ZW1wYnVmLCBzdHJsZW4gKHRlbXBidWYpKTsKKyAgICAgIGZvciAocmVnX2luZGV4ID0gaSwgcmVnbnVtX2luZGV4ID0gTFIwX1JFR05VTSArIGk7CisJICAgcmVnX2luZGV4IDwgaSArIDMyOworCSAgIHJlZ19pbmRleCArPSA0LCByZWdudW1faW5kZXggKz0gNCkKKwl7CisJICBzcHJpbnRmICh0ZW1wYnVmLCAiTFIlMDNkICIsIHJlZ19pbmRleCk7CisJICBleHBlY3QgKHRlbXBidWYpOworCSAgZ2V0X2hleF9yZWdzICg0LCByZWdudW1faW5kZXgpOworCSAgZXhwZWN0ICgiXG4iKTsKKwl9CisgICAgfQorCisgIHdyaXRlIChlYl9kZXNjLCAiZHcgc3IxMzMsc3IxMzNcbiIsIDE1KTsKKyAgZXhwZWN0ICgiU1IxMzMgICAgICAgICAgIik7CisgIGdldF9oZXhfcmVncyAoMSwgQlBfUkVHTlVNKTsKKyAgZXhwZWN0ICgiXG4iKTsKKworICB3cml0ZSAoZWJfZGVzYywgImR3IHNyMTM0LHNyMTM0XG4iLCAxNSk7CisgIGV4cGVjdCAoIlNSMTM0ICAgICAgICAgICAgICAgICAgICIpOworICBnZXRfaGV4X3JlZ3MgKDEsIEZDX1JFR05VTSk7CisgIGV4cGVjdCAoIlxuIik7CisKKyAgd3JpdGUgKGViX2Rlc2MsICJkdyBzcjEzNSxzcjEzNVxuIiwgMTUpOworICBleHBlY3QgKCJTUjEzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKKyAgZ2V0X2hleF9yZWdzICgxLCBDUl9SRUdOVU0pOworICBleHBlY3QgKCJcbiIpOworCisgIHdyaXRlIChlYl9kZXNjLCAiZHcgc3IxMzEsc3IxMzFcbiIsIDE1KTsKKyAgZXhwZWN0ICgiU1IxMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CisgIGdldF9oZXhfcmVncyAoMSwgUV9SRUdOVU0pOworICBleHBlY3QgKCJcbiIpOworCisgIHdyaXRlIChlYl9kZXNjLCAiZHcgc3IwLHNyMTRcbiIsIDEyKTsKKyAgZm9yIChyZWdfaW5kZXggPSAwLCByZWdudW1faW5kZXggPSBWQUJfUkVHTlVNOworICAgICAgIHJlZ251bV9pbmRleCA8PSBMUlVfUkVHTlVNOworICAgICAgIHJlZ251bV9pbmRleCArPSA0LCByZWdfaW5kZXggKz0gNCkKKyAgICB7CisgICAgICBzcHJpbnRmICh0ZW1wYnVmLCAiU1IlMDNkICIsIHJlZ19pbmRleCk7CisgICAgICBleHBlY3QgKHRlbXBidWYpOworICAgICAgZ2V0X2hleF9yZWdzIChyZWdfaW5kZXggPT0gMTIgPyAzIDogNCwgcmVnbnVtX2luZGV4KTsKKyAgICAgIGV4cGVjdCAoIlxuIik7CisgICAgfQorCisgIC8qIFRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgd2F5IHRvIGdldCB0aGVzZS4gICovCisgIHsKKyAgICBpbnQgdmFsID0gLTE7CisgICAgc3VwcGx5X3JlZ2lzdGVyIChGUEVfUkVHTlVNLCAoY2hhciAqKSAmdmFsKTsKKyAgICBzdXBwbHlfcmVnaXN0ZXIgKElOVEVfUkVHTlVNLCAoY2hhciAqKSAmdmFsKTsKKyAgICBzdXBwbHlfcmVnaXN0ZXIgKEZQU19SRUdOVU0sIChjaGFyICopICZ2YWwpOworICAgIHN1cHBseV9yZWdpc3RlciAoRVhPX1JFR05VTSwgKGNoYXIgKikgJnZhbCk7CisgIH0KKworICB3cml0ZSAoZWJfZGVzYywgImR3IGdyMSxncjFcbiIsIDExKTsKKyAgZXhwZWN0ICgiR1IwMDEgIik7CisgIGdldF9oZXhfcmVncyAoMSwgR1IxX1JFR05VTSk7CisgIGV4cGVjdF9wcm9tcHQgKCk7Cit9CisKKy8qIEZldGNoIHJlZ2lzdGVyIFJFR05PLCBvciBhbGwgcmVnaXN0ZXJzIGlmIFJFR05PIGlzIC0xLgorICAgUmV0dXJucyBlcnJubyB2YWx1ZS4gICovCit2b2lkCitlYl9mZXRjaF9yZWdpc3RlciAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgaWYgKHJlZ25vID09IC0xKQorICAgIGViX2ZldGNoX3JlZ2lzdGVycyAoKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgKm5hbWUgPSBnZXRfcmVnX25hbWUgKHJlZ25vKTsKKyAgICAgIGZwcmludGYgKGViX3N0cmVhbSwgImR3ICVzLCVzXG4iLCBuYW1lLCBuYW1lKTsKKyAgICAgIGV4cGVjdCAobmFtZSk7CisgICAgICBleHBlY3QgKCIgIik7CisgICAgICBnZXRfaGV4X3JlZ3MgKDEsIHJlZ25vKTsKKyAgICAgIGV4cGVjdF9wcm9tcHQgKCk7CisgICAgfQorICByZXR1cm47Cit9CisKKy8qIFN0b3JlIHRoZSByZW1vdGUgcmVnaXN0ZXJzIGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoZSBibG9jayBSRUdTLiAgKi8KKworc3RhdGljIHZvaWQKK2ViX3N0b3JlX3JlZ2lzdGVycyAoKQoreworICBpbnQgaSwgajsKKyAgZnByaW50ZiAoZWJfc3RyZWFtLCAicyBncjEsJXhcbiIsIHJlYWRfcmVnaXN0ZXIgKEdSMV9SRUdOVU0pKTsKKyAgZXhwZWN0X3Byb21wdCAoKTsKKworICBmb3IgKGogPSAwOyBqIDwgMzI7IGogKz0gMTYpCisgICAgeworICAgICAgZnByaW50ZiAoZWJfc3RyZWFtLCAicyBnciVkLCIsIGogKyA5Nik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMTU7ICsraSkKKwlmcHJpbnRmIChlYl9zdHJlYW0sICIleCwiLCByZWFkX3JlZ2lzdGVyIChHUjk2X1JFR05VTSArIGogKyBpKSk7CisgICAgICBmcHJpbnRmIChlYl9zdHJlYW0sICIleFxuIiwgcmVhZF9yZWdpc3RlciAoR1I5Nl9SRUdOVU0gKyBqICsgMTUpKTsKKyAgICAgIGV4cGVjdF9wcm9tcHQgKCk7CisgICAgfQorCisgIGZvciAoaiA9IDA7IGogPCAxMjg7IGogKz0gMTYpCisgICAgeworICAgICAgZnByaW50ZiAoZWJfc3RyZWFtLCAicyBsciVkLCIsIGopOworICAgICAgZm9yIChpID0gMDsgaSA8IDE1OyArK2kpCisJZnByaW50ZiAoZWJfc3RyZWFtLCAiJXgsIiwgcmVhZF9yZWdpc3RlciAoTFIwX1JFR05VTSArIGogKyBpKSk7CisgICAgICBmcHJpbnRmIChlYl9zdHJlYW0sICIleFxuIiwgcmVhZF9yZWdpc3RlciAoTFIwX1JFR05VTSArIGogKyAxNSkpOworICAgICAgZXhwZWN0X3Byb21wdCAoKTsKKyAgICB9CisKKyAgZnByaW50ZiAoZWJfc3RyZWFtLCAicyBzcjEzMywleCwleCwleFxuIiwgcmVhZF9yZWdpc3RlciAoQlBfUkVHTlVNKSwKKwkgICByZWFkX3JlZ2lzdGVyIChGQ19SRUdOVU0pLCByZWFkX3JlZ2lzdGVyIChDUl9SRUdOVU0pKTsKKyAgZXhwZWN0X3Byb21wdCAoKTsKKyAgZnByaW50ZiAoZWJfc3RyZWFtLCAicyBzcjEzMSwleFxuIiwgcmVhZF9yZWdpc3RlciAoUV9SRUdOVU0pKTsKKyAgZXhwZWN0X3Byb21wdCAoKTsKKyAgZnByaW50ZiAoZWJfc3RyZWFtLCAicyBzcjAsIik7CisgIGZvciAoaSA9IDA7IGkgPCAxMTsgKytpKQorICAgIGZwcmludGYgKGViX3N0cmVhbSwgIiV4LCIsIHJlYWRfcmVnaXN0ZXIgKFZBQl9SRUdOVU0gKyBpKSk7CisgIGZwcmludGYgKGViX3N0cmVhbSwgIiV4XG4iLCByZWFkX3JlZ2lzdGVyIChWQUJfUkVHTlVNICsgMTEpKTsKKyAgZXhwZWN0X3Byb21wdCAoKTsKK30KKworLyogU3RvcmUgcmVnaXN0ZXIgUkVHTk8sIG9yIGFsbCBpZiBSRUdOTyA9PSAwLgorICAgUmV0dXJuIGVycm5vIHZhbHVlLiAgKi8KK3ZvaWQKK2ViX3N0b3JlX3JlZ2lzdGVyIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBpZiAocmVnbm8gPT0gLTEpCisgICAgZWJfc3RvcmVfcmVnaXN0ZXJzICgpOworICBlbHNlCisgICAgeworICAgICAgY2hhciAqbmFtZSA9IGdldF9yZWdfbmFtZSAocmVnbm8pOworICAgICAgZnByaW50ZiAoZWJfc3RyZWFtLCAicyAlcywleFxuIiwgbmFtZSwgcmVhZF9yZWdpc3RlciAocmVnbm8pKTsKKyAgICAgIC8qIFNldHRpbmcgR1IxIGNoYW5nZXMgdGhlIG51bWJlcnMgb2YgYWxsIHRoZSBsb2NhbHMsIHNvCisJIGludmFsaWRhdGUgdGhlIHJlZ2lzdGVyIGNhY2hlLiAgRG8gdGhpcyAqYWZ0ZXIqIGNhbGxpbmcKKwkgcmVhZF9yZWdpc3RlciwgYmVjYXVzZSB3ZSB3YW50IHJlYWRfcmVnaXN0ZXIgdG8gcmV0dXJuIHRoZQorCSB2YWx1ZSB0aGF0IHdyaXRlX3JlZ2lzdGVyIGhhcyBqdXN0IHN0dWZmZWQgaW50byB0aGUgcmVnaXN0ZXJzCisJIGFycmF5LCBub3QgdGhlIHZhbHVlIG9mIHRoZSByZWdpc3RlciBmZXRjaGVkIGZyb20gdGhlCisJIGluZmVyaW9yLiAgKi8KKyAgICAgIGlmIChyZWdubyA9PSBHUjFfUkVHTlVNKQorCXJlZ2lzdGVyc19jaGFuZ2VkICgpOworICAgICAgZXhwZWN0X3Byb21wdCAoKTsKKyAgICB9Cit9CisKKy8qIEdldCByZWFkeSB0byBtb2RpZnkgdGhlIHJlZ2lzdGVycyBhcnJheS4gIE9uIG1hY2hpbmVzIHdoaWNoIHN0b3JlCisgICBpbmRpdmlkdWFsIHJlZ2lzdGVycywgdGhpcyBkb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuICBPbiBtYWNoaW5lcworICAgd2hpY2ggc3RvcmUgYWxsIHRoZSByZWdpc3RlcnMgaW4gb25lIGZlbGwgc3dvb3AsIHRoaXMgbWFrZXMgc3VyZQorICAgdGhhdCByZWdpc3RlcnMgY29udGFpbnMgYWxsIHRoZSByZWdpc3RlcnMgZnJvbSB0aGUgcHJvZ3JhbSBiZWluZworICAgZGVidWdnZWQuICAqLworCit2b2lkCitlYl9wcmVwYXJlX3RvX3N0b3JlICgpCit7CisgIC8qIERvIG5vdGhpbmcsIHNpbmNlIHdlIGNhbiBzdG9yZSBpbmRpdmlkdWFsIHJlZ3MgKi8KK30KKworCisvKiBGSVhNRS1zb21lZGF5ISAgTWVyZ2UgdGhlc2UgdHdvLiAgKi8KK2ludAorZWJfeGZlcl9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuLCB3cml0ZSwgdGFyZ2V0KQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworICAgICBpbnQgd3JpdGU7CisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQ7CQkvKiBpZ25vcmVkICovCit7CisgIGlmICh3cml0ZSkKKyAgICByZXR1cm4gZWJfd3JpdGVfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbik7CisgIGVsc2UKKyAgICByZXR1cm4gZWJfcmVhZF9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKTsKK30KKwordm9pZAorZWJfZmlsZXNfaW5mbyAoKQoreworICBwcmludGYgKCJcdEF0dGFjaGVkIHRvICVzIGF0ICVkIGJhdWQgYW5kIHJ1bm5pbmcgcHJvZ3JhbSAlcy5cbiIsCisJICBkZXZfbmFtZSwgYmF1ZHJhdGUsIHByb2dfbmFtZSk7Cit9CisKKy8qIENvcHkgTEVOIGJ5dGVzIG9mIGRhdGEgZnJvbSBkZWJ1Z2dlciBtZW1vcnkgYXQgTVlBRERSCisgICB0byBpbmZlcmlvcidzIG1lbW9yeSBhdCBNRU1BRERSLiAgUmV0dXJucyBsZW5ndGggbW92ZWQuICAqLworaW50CitlYl93cml0ZV9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgeworICAgICAgaWYgKChpICUgMTYpID09IDApCisJZnByaW50ZiAoZWJfc3RyZWFtLCAic2IgJXgsIiwgbWVtYWRkciArIGkpOworICAgICAgaWYgKChpICUgMTYpID09IDE1IHx8IGkgPT0gbGVuIC0gMSkKKwl7CisJICBmcHJpbnRmIChlYl9zdHJlYW0sICIleFxuIiwgKCh1bnNpZ25lZCBjaGFyICopbXlhZGRyKVtpXSk7CisJICBleHBlY3RfcHJvbXB0ICgpOworCX0KKyAgICAgIGVsc2UKKwlmcHJpbnRmIChlYl9zdHJlYW0sICIleCwiLCAoKHVuc2lnbmVkIGNoYXIgKilteWFkZHIpW2ldKTsKKyAgICB9CisgIHJldHVybiBsZW47Cit9CisKKy8qIFJlYWQgTEVOIGJ5dGVzIGZyb20gaW5mZXJpb3IgbWVtb3J5IGF0IE1FTUFERFIuICBQdXQgdGhlIHJlc3VsdAorICAgYXQgZGVidWdnZXIgYWRkcmVzcyBNWUFERFIuICBSZXR1cm5zIGxlbmd0aCBtb3ZlZC4gICovCitpbnQKK2ViX3JlYWRfaW5mZXJpb3JfbWVtb3J5KG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICBpbnQgaTsKKworICAvKiBOdW1iZXIgb2YgYnl0ZXMgcmVhZCBzbyBmYXIuICAqLworICBpbnQgY291bnQ7CisKKyAgLyogU3RhcnRpbmcgYWRkcmVzcyBvZiB0aGlzIHBhc3MuICAqLworICB1bnNpZ25lZCBsb25nIHN0YXJ0YWRkcjsKKworICAvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBpbiB0aGlzIHBhc3MuICAqLworICBpbnQgbGVuX3RoaXNfcGFzczsKKworICAvKiBOb3RlIHRoYXQgdGhpcyBjb2RlIHdvcmtzIGNvcnJlY3RseSBpZiBzdGFydGFkZHIgaXMganVzdCBsZXNzCisgICAgIHRoYW4gVUlOVF9NQVggKHdlbGwsIHJlYWxseSBDT1JFX0FERFJfTUFYIGlmIHRoZXJlIHdhcyBzdWNoIGEKKyAgICAgdGhpbmcpLiAgVGhhdCBpcywgc29tZXRoaW5nIGxpa2UKKyAgICAgZWJfcmVhZF9ieXRlcyAoQ09SRV9BRERSX01BWCAtIDQsIGZvbywgNCkKKyAgICAgd29ya3MtLWl0IG5ldmVyIGFkZHMgbGVuIHRvIG1lbWFkZHIgYW5kIGdldHMgMC4gICovCisgIC8qIEhvd2V2ZXIsIHNvbWV0aGluZyBsaWtlCisgICAgIGViX3JlYWRfYnl0ZXMgKENPUkVfQUREUl9NQVggLSAzLCBmb28sIDQpCisgICAgIGRvZXNuJ3QgbmVlZCB0byB3b3JrLiAgRGV0ZWN0IGl0IGFuZCBnaXZlIHVwIGlmIHRoZXJlJ3MgYW4gYXR0ZW1wdAorICAgICB0byBkbyB0aGF0LiAgKi8KKyAgaWYgKCgobWVtYWRkciAtIDEpICsgbGVuKSA8IG1lbWFkZHIpIHsKKyAgICBlcnJubyA9IEVJTzsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgc3RhcnRhZGRyID0gbWVtYWRkcjsKKyAgY291bnQgPSAwOworICB3aGlsZSAoY291bnQgPCBsZW4pCisgICAgeworICAgICAgbGVuX3RoaXNfcGFzcyA9IDE2OworICAgICAgaWYgKChzdGFydGFkZHIgJSAxNikgIT0gMCkKKwlsZW5fdGhpc19wYXNzIC09IHN0YXJ0YWRkciAlIDE2OworICAgICAgaWYgKGxlbl90aGlzX3Bhc3MgPiAobGVuIC0gY291bnQpKQorCWxlbl90aGlzX3Bhc3MgPSAobGVuIC0gY291bnQpOworCisgICAgICBmcHJpbnRmIChlYl9zdHJlYW0sICJkYiAleCwleFxuIiwgc3RhcnRhZGRyLAorCSAgICAgICAoc3RhcnRhZGRyIC0gMSkgKyBsZW5fdGhpc19wYXNzKTsKKyAgICAgIGV4cGVjdCAoIlxuIik7CisKKyAgICAgIC8qIExvb2sgZm9yIDggaGV4IGRpZ2l0cy4gICovCisgICAgICBpID0gMDsKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIGlmIChpc3hkaWdpdCAocmVhZGNoYXIgKCkpKQorCSAgICArK2k7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBleHBlY3RfcHJvbXB0ICgpOworCSAgICAgIGVycm9yICgiSGV4IGRpZ2l0IGV4cGVjdGVkIGZyb20gcmVtb3RlIHN5c3RlbS4iKTsKKwkgICAgfQorCSAgaWYgKGkgPj0gOCkKKwkgICAgYnJlYWs7CisJfQorCisgICAgICBleHBlY3QgKCIgICIpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuX3RoaXNfcGFzczsgaSsrKQorCWdldF9oZXhfYnl0ZSAoJm15YWRkcltjb3VudCsrXSk7CisKKyAgICAgIGV4cGVjdF9wcm9tcHQgKCk7CisKKyAgICAgIHN0YXJ0YWRkciArPSBsZW5fdGhpc19wYXNzOworICAgIH0KKyAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQKK2ViX2tpbGwgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHJldHVybjsJCS8qIElnbm9yZSBhdHRlbXB0cyB0byBraWxsIHRhcmdldCBzeXN0ZW0gKi8KK30KKworLyogQ2xlYW4gdXAgd2hlbiBhIHByb2dyYW0gZXhpdHMuCisKKyAgIFRoZSBwcm9ncmFtIGFjdHVhbGx5IGxpdmVzIG9uIGluIHRoZSByZW1vdGUgcHJvY2Vzc29yJ3MgUkFNLCBhbmQgbWF5IGJlCisgICBydW4gYWdhaW4gd2l0aG91dCBhIGRvd25sb2FkLiAgRG9uJ3QgbGVhdmUgaXQgZnVsbCBvZiBicmVha3BvaW50CisgICBpbnN0cnVjdGlvbnMuICAqLworCit2b2lkCitlYl9tb3Vybl9pbmZlcmlvciAoKQoreworICByZW1vdmVfYnJlYWtwb2ludHMgKCk7CisgIHVucHVzaF90YXJnZXQgKCZlYl9vcHMpOworICBnZW5lcmljX21vdXJuX2luZmVyaW9yICgpOwkvKiBEbyBhbGwgdGhlIHByb3BlciB0aGluZ3Mgbm93ICovCit9CisvKiBEZWZpbmUgdGhlIHRhcmdldCBzdWJyb3V0aW5lIG5hbWVzICovCisKK3N0cnVjdCB0YXJnZXRfb3BzIGViX29wcyA7CisKK3N0YXRpYyB2b2lkIAoraW5pdF9lYl9vcHModm9pZCkKK3sKKyAgZWJfb3BzLnRvX3Nob3J0bmFtZSA9IAkiYW1kLWViIjsKKyAgZWJfb3BzLnRvX2xvbmduYW1lID0gCSJSZW1vdGUgc2VyaWFsIEFNRCBFQk1PTiB0YXJnZXQiOworICBlYl9vcHMudG9fZG9jID0gCSJVc2UgYSByZW1vdGUgY29tcHV0ZXIgcnVubmluZyBFQk1PTiBjb25uZWN0ZWQgYnkgYSBzZXJpYWwgbGluZS5cblwKK0FyZ3VtZW50cyBhcmUgdGhlIG5hbWUgb2YgdGhlIGRldmljZSBmb3IgdGhlIHNlcmlhbCBsaW5lLFxuXAordGhlIHNwZWVkIHRvIGNvbm5lY3QgYXQgaW4gYml0cyBwZXIgc2Vjb25kLCBhbmQgdGhlIGZpbGVuYW1lIG9mIHRoZVxuXAorZXhlY3V0YWJsZSBhcyBpdCBleGlzdHMgb24gdGhlIHJlbW90ZSBjb21wdXRlci4gIEZvciBleGFtcGxlLFxuXAordGFyZ2V0IGFtZC1lYiAvZGV2L3R0eWEgOTYwMCBkZW1vIiwKKyAgICBlYl9vcHMudG9fb3BlbiA9IAllYl9vcGVuOworICBlYl9vcHMudG9fY2xvc2UgPSAJZWJfY2xvc2U7CisgIGViX29wcy50b19hdHRhY2ggPSAJMDsKKyAgZWJfb3BzLnRvX3Bvc3RfYXR0YWNoID0gTlVMTDsKKyAgZWJfb3BzLnRvX3JlcXVpcmVfYXR0YWNoID0gTlVMTDsKKyAgZWJfb3BzLnRvX2RldGFjaCA9IAllYl9kZXRhY2g7CisgIGViX29wcy50b19yZXF1aXJlX2RldGFjaCA9IE5VTEw7CisgIGViX29wcy50b19yZXN1bWUgPSAJZWJfcmVzdW1lOworICBlYl9vcHMudG9fd2FpdCAgPSAJZWJfd2FpdDsKKyAgZWJfb3BzLnRvX3Bvc3Rfd2FpdCA9IE5VTEw7CisgIGViX29wcy50b19mZXRjaF9yZWdpc3RlcnMgID0gCWViX2ZldGNoX3JlZ2lzdGVyOworICBlYl9vcHMudG9fc3RvcmVfcmVnaXN0ZXJzICA9IAllYl9zdG9yZV9yZWdpc3RlcjsKKyAgZWJfb3BzLnRvX3ByZXBhcmVfdG9fc3RvcmUgPSAJZWJfcHJlcGFyZV90b19zdG9yZTsKKyAgZWJfb3BzLnRvX3hmZXJfbWVtb3J5ICA9IAllYl94ZmVyX2luZmVyaW9yX21lbW9yeTsKKyAgZWJfb3BzLnRvX2ZpbGVzX2luZm8gID0gCWViX2ZpbGVzX2luZm87CisgIGViX29wcy50b19pbnNlcnRfYnJlYWtwb2ludCA9IAkwOworICBlYl9vcHMudG9fcmVtb3ZlX2JyZWFrcG9pbnQgPSAJMDsJLyogQnJlYWtwb2ludHMgKi8KKyAgZWJfb3BzLnRvX3Rlcm1pbmFsX2luaXQgID0gCTA7CisgIGViX29wcy50b190ZXJtaW5hbF9pbmZlcmlvciA9IAkwOworICBlYl9vcHMudG9fdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ID0gCTA7CisgIGViX29wcy50b190ZXJtaW5hbF9vdXJzICA9IAkwOworICBlYl9vcHMudG9fdGVybWluYWxfaW5mbyAgPSAJMDsJLyogVGVybWluYWwgaGFuZGxpbmcgKi8KKyAgZWJfb3BzLnRvX2tpbGwgID0gCWViX2tpbGw7CisgIGViX29wcy50b19sb2FkICA9IAlnZW5lcmljX2xvYWQ7CS8qIGxvYWQgKi8KKyAgZWJfb3BzLnRvX2xvb2t1cF9zeW1ib2wgPSAJMDsgLyogbG9va3VwX3N5bWJvbCAqLworICBlYl9vcHMudG9fY3JlYXRlX2luZmVyaW9yID0gCWViX2NyZWF0ZV9pbmZlcmlvcjsKKyAgZWJfb3BzLnRvX3Bvc3Rfc3RhcnR1cF9pbmZlcmlvciA9IE5VTEw7CisgIGViX29wcy50b19hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yID0gTlVMTDsKKyAgZWJfb3BzLnRvX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IgPSBOVUxMOyAgICAgIAorICBlYl9vcHMudG9fcG9zdF9mb2xsb3dfaW5mZXJpb3JfYnlfY2xvbmUgPSBOVUxMOworICBlYl9vcHMudG9faW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGViX29wcy50b19yZW1vdmVfZm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgZWJfb3BzLnRvX2luc2VydF92Zm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgZWJfb3BzLnRvX3JlbW92ZV92Zm9ya19jYXRjaHBvaW50ID0gTlVMTDsgICAgICAgICAgICAgICAgICAKKyAgZWJfb3BzLnRvX2hhc19mb3JrZWQgPSBOVUxMOworICBlYl9vcHMudG9faGFzX3Zmb3JrZWQgPSBOVUxMOyAgICAgICAgICAgIAorICBlYl9vcHMudG9fY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjID0gTlVMTDsgICAgICAgIAorICBlYl9vcHMudG9fcG9zdF9mb2xsb3dfdmZvcmsgPSBOVUxMOworICBlYl9vcHMudG9faW5zZXJ0X2V4ZWNfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGViX29wcy50b19yZW1vdmVfZXhlY19jYXRjaHBvaW50ID0gTlVMTDsKKyAgZWJfb3BzLnRvX2hhc19leGVjZCA9IE5VTEw7CisgIGViX29wcy50b19yZXBvcnRlZF9leGVjX2V2ZW50c19wZXJfZXhlY19jYWxsID0gTlVMTDsKKyAgZWJfb3BzLnRvX2hhc19leGl0ZWQgPSBOVUxMOworICBlYl9vcHMudG9fbW91cm5faW5mZXJpb3IgPSAJZWJfbW91cm5faW5mZXJpb3I7CisgIGViX29wcy50b19jYW5fcnVuICA9ICAgCTA7CS8qIGNhbl9ydW4gKi8KKyAgZWJfb3BzLnRvX25vdGljZV9zaWduYWxzID0gICAJMDsgLyogbm90aWNlX3NpZ25hbHMgKi8KKyAgZWJfb3BzLnRvX3RocmVhZF9hbGl2ZSAgPSAJMDsgLyogdGhyZWFkLWFsaXZlICovCisgIGViX29wcy50b19zdG9wICA9IAkwOwkJCS8qIHRvX3N0b3AgKi8KKyAgZWJfb3BzLnRvX3BpZF90b19leGVjX2ZpbGUgPSBOVUxMOworICBlYl9vcHMudG9fY29yZV9maWxlX3RvX3N5bV9maWxlID0gTlVMTDsKKyAgZWJfb3BzLnRvX3N0cmF0dW0gPSAJcHJvY2Vzc19zdHJhdHVtOworICBlYl9vcHMuRE9OVF9VU0UgPSAJMDsgLyogbmV4dCAqLworICBlYl9vcHMudG9faGFzX2FsbF9tZW1vcnkgPSAJMTsKKyAgZWJfb3BzLnRvX2hhc19tZW1vcnkgPSAJMTsKKyAgZWJfb3BzLnRvX2hhc19zdGFjayA9IAkxOworICBlYl9vcHMudG9faGFzX3JlZ2lzdGVycyA9IAkxOworICBlYl9vcHMudG9faGFzX2V4ZWN1dGlvbiA9IAkxOwkvKiBhbGwgbWVtLCBtZW0sIHN0YWNrLCByZWdzLCBleGVjICovCisgIGViX29wcy50b19zZWN0aW9ucyA9IAkwOyAvKiBzZWN0aW9ucyAqLworICBlYl9vcHMudG9fc2VjdGlvbnNfZW5kID0gCTA7IC8qIHNlY3Rpb25zIGVuZCAqLworICBlYl9vcHMudG9fbWFnaWMgPSAJT1BTX01BR0lDOwkJLyogQWx3YXlzIHRoZSBsYXN0IHRoaW5nICovCit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9yZW1vdGVfZWIgKCkKK3sKKyAgaW5pdF9lYl9vcHMoKSA7CisgIGFkZF90YXJnZXQgKCZlYl9vcHMpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS1lcy5jIGIvZ2RiL3JlbW90ZS1lcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNmU4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmVtb3RlLWVzLmMKQEAgLTAsMCArMSwyMjAyIEBACisvKiBNZW1vcnktYWNjZXNzIGFuZCBjb21tYW5kcyBmb3IgcmVtb3RlIGVzMTgwMCBwcm9jZXNzZXMsIGZvciBHREIuCisgICBDb3B5cmlnaHQgKEMpIDE5ODgsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBhZGRlZCB0byBHREIgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBkbyBkZWJ1Z2dpbmcgdmlhIGFuCisgICBFUy0xODAwIGVtdWxhdG9yLiBUaGUgY29kZSB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IEpvaGFuIEhvbG1iZXJnCisgICBUVC9TSiBFcmljc3NvbiBUZWxlY29tIEFCIGFuZCBsYXRlciBtb2RpZmllZCBieSBKb2hhbiBIZW5yaWtzc29uCisgICBUVC9TSi4gSXQgd2FzIG1vZGlmaWVkIGZvciBnZGIgNC4wIGJ5IFRYL0RLIEphbiBOb3JkZW5hbmQgYnkgVFgvREtHCisgICBIYXJhbGQgSm9oYW5zZW4uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisvKiBFbXVsYXRvciBjb21tdW5pY2F0aW9uIHByb3RvY29sLgorICAgQWxsIHZhbHVlcyBhcmUgZW5jb2RlZCBpbiBhc2NpaSBoZXggZGlnaXRzLgorCisgICAgICAgIFJlcXVlc3QKK0NvbW1hbmQKK1JlcGx5CisJcmVhZCByZWdpc3RlcnM6CitEUjxjcj4KKyAgICAgLSAwIC0gICAgLSAxIC0gICAgLSAyIC0gICAgLSAzIC0gICAgICAtIDQgLSAgICAtIDUgLSAgICAtLSA2IC0gICAtIDcgLSAKK0QgPSBYWFhYWFhYWCBYWFhYWFhYWCBYWFhYWFhYWCBYWFhYWFhYWCAgIFhYWFhYWFhYIFhYWFhYWFhYIFhYWFhYWFhYIFhYWFhYWFhYCitBID0gWFhYWFhYWFggWFhYWFhYWFggWFhYWFhYWFggWFhYWFhYWFggICBYWFhYWFhYWCBYWFhYWFhYWCBYWFhYWFhYWCAKKyAgICBQQyA9IFhYWFhYWCAgICAgICBTU1AgPSBYWFhYWFggICAgVVNQID0gWFhYWFhYICAgICBTUiA9IFhYWFhYWFhYCisgPgorRWFjaCBieXRlIG9mIHJlZ2lzdGVyIGRhdGEgaXMgZGVzY3JpYmVkIGJ5IHR3byBoZXggZGlnaXRzLgorCisJd3JpdGUgcmVncworRDA9WFhYWFhYWFg8Y3I+CisgPkQxPVhYWFhYWFhYPGNyPgorID5EMj1YWFhYWFhYWDxjcj4KKyA+RDM9WFhYWFhYWFg8Y3I+CisgPkQ0PVhYWFhYWFhYPGNyPgorID5ENT1YWFhYWFhYWDxjcj4KKyA+RDY9WFhYWFhYWFg8Y3I+CisgPkQ3PVhYWFhYWFhYPGNyPgorID5BMD1YWFhYWFhYWDxjcj4KKyA+QTE9WFhYWFhYWFg8Y3I+CisgPkEyPVhYWFhYWFhYPGNyPgorID5BMz1YWFhYWFhYWDxjcj4KKyA+QTQ9WFhYWFhYWFg8Y3I+CisgPkE1PVhYWFhYWFhYPGNyPgorID5BNj1YWFhYWFhYWDxjcj4KKyA+QTc9WFhYWFhYWFg8Y3I+CisgPlNSPVhYWFhYWFhYPGNyPgorID5QQz1YWFhYWFg8Y3I+CisgPgorRWFjaCBieXRlIG9mIHJlZ2lzdGVyIGRhdGEgaXMgZGVzY3JpYmVkIGJ5IHR3byBoZXggZGlnaXRzLgorCisJcmVhZCBtZW0KK0AuQkFBLi5BQQorJEZGRkZGRlhYCisgPgorQUEuLkFBIGlzIGFkZHJlc3MsIFhYWFhYWFggaXMgdGhlIGNvbnRlbnRzCisKKwl3cml0ZSBtZW0KKwlALkJBQS4uQUE9JFhYWFhYWFhYCisgPgorQUEuLkFBIGlzIGFkZHJlc3MsIFhYWFhYWFhYIGlzIGRhdGEKKworCWNvbnQKK1BDPSRBQS4uQUEKKyA+UkJLCitSPgorQUEuLkFBIGlzIGFkZHJlc3MgdG8gcmVzdW1lLiBJZiBBQS4uQUEgaXMgb21pdHRlZCwgcmVzdW1lIGF0IHNhbWUgYWRkcmVzcy4KKworCXN0ZXAKK1BDPSRBQS4uQUEKKyA+U1RQCitSPgorQUEuLkFBIGlzIGFkZHJlc3MgdG8gcmVzdW1lLiBJZiBBQS4uQUEgaXMgb21pdHRlZCwgcmVzdW1lIGF0IHNhbWUgYWRkcmVzcy4KKworCWtpbGwgcmVxCitTVFAKKyA+CisqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAid2FpdC5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJyZW1vdGUtdXRpbHMuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAic2VyaWFsLmgiCisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgdm9pZAorZXMxODAwX2NoaWxkX2RldGFjaCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZAorZXMxODAwX2NoaWxkX29wZW4gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgCitlczE4MDBfdHJhbnNwYXJlbnQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2VzMTgwMF9jcmVhdGVfaW5mZXJpb3IgUEFSQU1TICgoY2hhciAqLCBjaGFyICosIGNoYXIgKiopKTsKKworc3RhdGljIHZvaWQKK2VzMTgwMF9sb2FkIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitlczE4MDBfa2lsbCBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyBpbnQKK3ZlcmlmeV9icmVhayBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIGludAorZXMxODAwX3JlbW92ZV9icmVha3BvaW50IFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqKSk7CisKK3N0YXRpYyBpbnQKK2VzMTgwMF9pbnNlcnRfYnJlYWtwb2ludCBQQVJBTVMgKChDT1JFX0FERFIsIGNoYXIgKikpOworCitzdGF0aWMgdm9pZAorZXMxODAwX2ZpbGVzX2luZm8gUEFSQU1TICgoc3RydWN0IHRhcmdldF9vcHMgKikpOworCitzdGF0aWMgaW50CitlczE4MDBfeGZlcl9pbmZlcmlvcl9tZW1vcnkgUEFSQU1TICgoQ09SRV9BRERSLCBjaGFyICosIGludCwgaW50LAorCQkJCSAgICAgc3RydWN0IHRhcmdldF9vcHMgKikpOworCitzdGF0aWMgdm9pZCAKK2VzMTgwMF9wcmVwYXJlX3RvX3N0b3JlIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIGludCBlczE4MDBfd2FpdCBQQVJBTVMgKChpbnQsIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqKSk7CisKK3N0YXRpYyB2b2lkIGVzMTgwMF9yZXN1bWUgUEFSQU1TICgoaW50LCBpbnQsIGVudW0gdGFyZ2V0X3NpZ25hbCkpOworCitzdGF0aWMgdm9pZAorZXMxODAwX2RldGFjaCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZAorZXMxODAwX2F0dGFjaCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgaW50CitkYW1uX2IgUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyB2b2lkCitlczE4MDBfb3BlbiBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZAorZXMxODAwX3RpbWVyIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQKK2VzMTgwMF9yZXNldCBQQVJBTVMgKChjaGFyICopKTsKKworc3RhdGljIHZvaWQKK2VzMTgwMF9yZXF1ZXN0X3F1aXQgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgaW50CityZWFkY2hhciBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkCitleHBlY3QgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2V4cGVjdF9wcm9tcHQgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZAorZG93bmxvYWQgUEFSQU1TICgoRklMRSAqLCBpbnQsIGludCkpOworCisjaWYgMAorc3RhdGljIHZvaWQKK2JmZF9jb3B5IFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkCitnZXRfYnJlYWtfYWRkciBQQVJBTVMgKChpbnQsIENPUkVfQUREUiAqKSk7CisKK3N0YXRpYyBpbnQKK2Zyb21oZXggUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyBpbnQKK3RvaGV4IFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgdm9pZAorZXMxODAwX2Nsb3NlIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgdm9pZAorZXMxODAwX2ZldGNoX3JlZ2lzdGVycyBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkCitlczE4MDBfZmV0Y2hfcmVnaXN0ZXIgUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyB2b2lkCitlczE4MDBfc3RvcmVfcmVnaXN0ZXIgUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyB2b2lkCitlczE4MDBfcmVhZF9ieXRlcyBQQVJBTVMgKChDT1JFX0FERFIsIGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitlczE4MDBfd3JpdGVfYnl0ZXMgUEFSQU1TICgoQ09SRV9BRERSLCBjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZAorc2VuZF93aXRoX3JlcGx5IFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK3NlbmRfY29tbWFuZCBQQVJBTVMgKChjaGFyICopKTsKKworc3RhdGljIHZvaWQKK3NlbmQgUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyB2b2lkCitnZXRtZXNzYWdlIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitlczE4MDBfbW91cm5faW5mZXJpb3IgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZAorZXMxODAwX2NyZWF0ZV9icmVha19pbnNuIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitlczE4MDBfaW5pdF9icmVhayBQQVJBTVMgKChjaGFyICosIGludCkpOworCisvKiBMb2NhbCB2YXJpYWJsZXMgKi8KKworLyogRklYTUU6IENvbnZlcnQgdGhpcyB0byB1c2UgInNldCByZW1vdGVkZWJ1ZyIgaW5zdGVhZC4gICovCisjZGVmaW5lIExPR19GSUxFICJlczE4MDAubG9nIgorI2lmIGRlZmluZWQgKExPR19GSUxFKQorc3RhdGljIEZJTEUgKmxvZ19maWxlOworI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3QgdGFyZ2V0X29wcyBlczE4MDBfb3BzOwkJLyogRm9yd2FyZCBkZWNsICovCitleHRlcm4gc3RydWN0IHRhcmdldF9vcHMgZXMxODAwX2NoaWxkX29wczsJLyogRm9yd2FyZCBkZWNsICovCisKK3N0YXRpYyBpbnQga2lvZGVidWc7CitzdGF0aWMgaW50IHRpbWVvdXQgPSAxMDA7IAorc3RhdGljIGNoYXIgKnNhdmVuYW1lOwkJCQkvKiBOYW1lIG9mIGkvbyBkZXZpY2UgdXNlZCAqLworc3RhdGljIHNlcmlhbF90dHlzdGF0ZSBlczE4MDBfc2F2ZWRfdHR5c3RhdGU7CitzdGF0aWMgaW50IGVzMTgwMF9mY19zYXZlOwkJCS8qIFNhdmUgZmNudGwgc3RhdGUgKi8KKworLyogaW5kaWNhdGVzIHRoYXQgdGhlIGVtdWxhdG9yIHVzZXMgMzItYml0IGRhdGEtYWRyZXNzICg2ODAyMC1tb2RlKSAKKyAgIGluc3RlYWQgb2YgMjQtYml0ICg2ODAwMCAtbW9kZSkgKi8KKworc3RhdGljIGludCBtNjgwMjA7CisKKyNkZWZpbmUgTU9ERSAobTY4MDIwID8gIk02ODAyMCIgOiAiTTY4MDAwIiApCisjZGVmaW5lIEVTMTgwMF9CUkVBS19WRUMgKDB4ZikKKworLyogRGVzY3JpcHRvciBmb3IgSS9PIHRvIHJlbW90ZSBtYWNoaW5lLiAgSW5pdGlhbGl6ZSBpdCB0byBOVUxMIHNvIHRoYXQKKyAgIGVzMTgwMF9vcGVuIGtub3dzIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIGZpbGUgb3BlbiB3aGVuIHRoZSBwcm9ncmFtCisgICBzdGFydHMuICAqLworCitzdGF0aWMgc2VyaWFsX3QgZXMxODAwX2Rlc2MgPSBOVUxMOworCisjZGVmaW5lCVBCVUZTSVoJMTAwMAorI2RlZmluZSBIRFJMRU4gc2l6ZW9mKCJALkJBQUFBQUFBQT0kVlZcciIpCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQvd3JpdGUgYXQgb25jZS4gIFRoZSB2YWx1ZSBoZXJlCisgICBpcyBjaG9zZW4gdG8gZmlsbCB1cCBhIHBhY2tldC4gICovCisKKyNkZWZpbmUgTUFYQlVGQllURVMgKChQQlVGU0laLTE1MCkqMTYvNzUgKQorCitzdGF0aWMgaW50IGVzMTgwMF9icmVha192ZWMgPSAwOworc3RhdGljIGNoYXIgZXMxODAwX2JyZWFrX2luc25bMl07CitzdGF0aWMgbG9uZyBlczE4MDBfYnJlYWtfYWRkcmVzczsKK3N0YXRpYyB2b2lkICgqb2xkX3NpZ2ludCkoKTsJCS8qIE9sZCBzaWduYWwtaGFuZGxlciBmb3Igc2lnaW50ICovCitzdGF0aWMgam1wX2J1ZiBpbnRlcnJ1cHQ7CisKKy8qIExvY2FsIHNpZ25hbGhhbmRsZXIgdG8gYWxsb3cgYnJlYWtpbmcgdHJhbmZlcnMgb3IgcHJvZ3JhbSBydW4uCisgICBSZWx5IG9uIGdsb2JhbCB2YXJpYWJsZXM6IG9sZF9zaWdpbnQoKSwgaW50ZXJydXB0ICovCisKK3N0YXRpYyB2b2lkCitlczE4MDBfcmVxdWVzdF9xdWl0ICgpCit7CisgIC8qIHJlc3RvcmUgb3JpZ2luYWwgc2lnbmFsaGFuZGxlciAqLworICBzaWduYWwgKFNJR0lOVCwgb2xkX3NpZ2ludCk7CisgIGxvbmdqbXAgKGludGVycnVwdCwgMSk7Cit9CisKKworLyogUmVzZXQgZW11bGF0b3IuCisgICBTZW5kaW5nIHJlc2V0IGNoYXJhY3RlcihvY3RhbCAzMikgdG8gZW11bGF0b3IuCisgICBxdWl0IC0gcmV0dXJuIHRvICcoZXNnZGIpJyBwcm9tcHQgb3IgY29udGludWUJKi8KKworc3RhdGljIHZvaWQKK2VzMTgwMF9yZXNldCAocXVpdCkKKyAgICAgY2hhciAqcXVpdDsKK3sKKyAgY2hhciBidWZbODBdOworCisgIGlmIChxdWl0KQorICAgIHsKKyAgICAgIHByaW50ZiAoIlxuUmVzZXR0aW5nIGVtdWxhdG9yLi4uICAiKTsKKyAgICB9CisgIHN0cmNweSAoYnVmLCAiXDAzMiIpOworICBzZW5kIChidWYpOworICBleHBlY3RfcHJvbXB0ICgpOworICBpZiAocXVpdCkKKyAgICB7CisgICAgICBlcnJvciAoImRvbmVcbiIpOworICAgIH0KK30KKworCisvKiBPcGVuIGEgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBkZWJ1Z2dlciBhbmQgcHVzaCB0aGUgbmV3IHRhcmdldAorICAgb250byB0aGUgc3RhY2suIENoZWNrIGlmIHRoZSBlbXVsYXRvciBpcyByZXNwb25kaW5nIGFuZCBmaW5kIG91dAorICAgd2hhdCBraW5kIG9mIHByb2Nlc3NvciB0aGUgZW11bGF0b3IgaXMgY29ubmVjdGVkIHRvLgorICAgSW5pdGlhdGUgdGhlIGJyZWFrcG9pbnQgaGFuZGxpbmcgaW4gdGhlIGVtdWxhdG9yLgorCisgICBuYW1lICAgICAtIHRoZSBmaWxlbmFtZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uIChleC4gJy9kZXYvdHRhJykKKyAgIGZyb21fdHR5IC0gc2F5cyB3aGV0aGVyIHRvIGJlIHZlcmJvc2Ugb3Igbm90ICovCisKK3N0YXRpYyB2b2lkCitlczE4MDBfb3BlbiAobmFtZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgY2hhciBidWZbUEJVRlNJWl07CisgIGNoYXIgKnA7CisgIGludCBpLCBmY2ZsYWc7CisKKyAgbTY4MDIwID0gMDsKKworICBpZiAoIW5hbWUpICAgICAgICAgICAvKiBubyBkZXZpY2UgbmFtZSBnaXZlbiBpbiB0YXJnZXQgY29tbWFuZCAqLworICAgIHsKKyAgICAgIGVycm9yX25vX2FyZyAoInNlcmlhbCBwb3J0IGRldmljZSBuYW1lIik7CisgICAgfQorCisgIHRhcmdldF9wcmVvcGVuIChmcm9tX3R0eSk7CisgIGVzMTgwMF9jbG9zZSAoMCk7CisKKyAgLyogb3BlbiB0aGUgZGV2aWNlIGFuZCBjb25maWd1cmUgaXQgZm9yIGNvbW11bmljYXRpb24gKi8KKworI2lmbmRlZiBERUJVR19TVERJTgorCisgIGVzMTgwMF9kZXNjID0gU0VSSUFMX09QRU4gKG5hbWUpOworICBpZiAoZXMxODAwX2Rlc2MgPT0gTlVMTCkKKyAgICB7CisgICAgICBwZXJyb3Jfd2l0aF9uYW1lIChuYW1lKTsKKyAgICB9CisgIHNhdmVuYW1lID0gc2F2ZXN0cmluZyAobmFtZSwgc3RybGVuIChuYW1lKSk7CisKKyAgZXMxODAwX3NhdmVkX3R0eXN0YXRlID0gU0VSSUFMX0dFVF9UVFlfU1RBVEUgKGVzMTgwMF9kZXNjKTsKKworICBpZiAoKGZjZmxhZyA9IGZjbnRsIChlczE4MDBfZGVzYy0+ZmQsIEZfR0VURkwsIDApKSA9PSAtMSkKKyAgICB7CisgICAgICBwZXJyb3Jfd2l0aF9uYW1lICgiZmNudGwgc2VyaWFsIik7CisgICAgfQorICBlczE4MDBfZmNfc2F2ZSA9IGZjZmxhZzsKKworICBmY2ZsYWcgPSAoZmNmbGFnICYgKEZSRUFEIHwgRldSSVRFKSk7IC8qIG1hc2sgb3V0IGFueSBmdW5ueSBzdHVmZiAqLworICBpZiAoZmNudGwgKGVzMTgwMF9kZXNjLT5mZCwgRl9TRVRGTCwgZmNmbGFnKSA9PSAtMSkKKyAgICB7CisgICAgICBwZXJyb3Jfd2l0aF9uYW1lICgiZmNudGwgc2VyaWFsIik7CisgICAgfQorCisgIGlmIChiYXVkX3JhdGUgIT0gLTEpCisgICAgeworICAgICAgaWYgKFNFUklBTF9TRVRCQVVEUkFURSAoZXMxODAwX2Rlc2MsIGJhdWRfcmF0ZSkpCisJeworCSAgU0VSSUFMX0NMT1NFIChlczE4MDBfZGVzYyk7CisJICBwZXJyb3Jfd2l0aF9uYW1lIChuYW1lKTsKKwl9CisgICAgfQorCisgIFNFUklBTF9SQVcgKGVzMTgwMF9kZXNjKTsKKworICAvKiBJZiB0aGVyZSBpcyBzb21ldGhpbmcgc2l0dGluZyBpbiB0aGUgYnVmZmVyIHdlIG1pZ2h0IHRha2UgaXQgYXMgYQorICAgICByZXNwb25zZSB0byBhIGNvbW1hbmQsIHdoaWNoIHdvdWxkIGJlIGJhZC4gICovCisgIFNFUklBTF9GTFVTSF9JTlBVVCAoZXMxODAwX2Rlc2MpOworCisjZW5kaWYJLyogREVCVUdfU1RESU4gKi8KKworICBwdXNoX3RhcmdldCAoJmVzMTgwMF9vcHMpOwkvKiBTd2l0Y2ggdG8gdXNpbmcgcmVtb3RlIHRhcmdldCBub3cgKi8KKyAgaWYgKGZyb21fdHR5KQorICAgIHsKKyAgICAgIHByaW50ZiAoIlJlbW90ZSBFUzE4MDAgZGVidWdnaW5nIHVzaW5nICVzXG4iLCBuYW1lKTsKKyAgICB9CisKKyNpZiBkZWZpbmVkIChMT0dfRklMRSkKKworICBsb2dfZmlsZSA9IGZvcGVuIChMT0dfRklMRSwgInciKTsKKyAgaWYgKGxvZ19maWxlID09IE5VTEwpCisgICAgeworICAgICAgcGVycm9yX3dpdGhfbmFtZSAoTE9HX0ZJTEUpOworICAgIH0KKworI2VuZGlmCS8qIExPR19GSUxFICovCisKKyAgLyogSGVsbG8/ICBBcmUgeW91IHRoZXJlPywgYWxzbyBjaGVjayBtb2RlICAqLworCisgIC8qICBzZW5kX3dpdGhfcmVwbHkoICJEQiAwIFRPIDEiLCBidWYsIHNpemVvZihidWYpKTsgKi8KKyAgLyogIGZvciAocCA9IGJ1ZiwgaSA9IDA7ICpwKysgPT0nMCc7KSAgKi8gICAvKiBjb3VudCB0aGUgbnVtYmVyIG9mIHplcm9zICovCisgIC8qICAgICAgaSsrOyAqLworCisgIHNlbmQgKCJcMDMyIik7CisgIGdldG1lc3NhZ2UgKGJ1Ziwgc2l6ZW9mIChidWYpKTsgIC8qIHNlbmQgcmVzZXQgY2hhcmFjdGVyICovCisKKyAgaWYgKGZyb21fdHR5KQorICAgIHsKKyAgICAgIHByaW50ZiAoIkNoZWNraW5nIG1vZGUuLi4uICIpOworICAgIH0KKyAgLyogIG02ODAyMCA9IChpPT04KTsgKi8gICAvKiBpZiBlaWdodCB6ZXJvcyB0aGVuIHdlIGFyZSBpbiBtNjgwMjAgbW9kZSAqLworCisgIC8qIFdoYXQga2luZCBvZiBwcm9jZXNzb3IgYW0gaSB0YWxraW5nIHRvID8qLworICBwID0gYnVmOworICB3aGlsZSAoKnArKyAhPSAnXG4nKSB7O30KKyAgd2hpbGUgKCpwKysgIT0gJ1xuJykgezt9CisgIHdoaWxlICgqcCsrICE9ICdcbicpIHs7fQorICBmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKywgcCsrKSB7O30KKyAgbTY4MDIwID0gIXN0cm5jbXAgKHAsICI2ODAyMCIsIDUpOworICBpZiAoZnJvbV90dHkpCisgICAgeworICAgICAgcHJpbnRmICgiWW91IGFyZSBpbiAlcyglYyVjJWMlYyVjKS1tb2RlXG4iLCBNT0RFLCBwWzBdLCBwWzFdLCBwWzJdLAorCSAgICAgIHBbM10sIHBbNF0pOworICAgIH0KKworICAvKiBpZiBubyBpbml0X2JyZWFrIHN0YXRlbWVudCBpcyBwcmVzZW50IGluIC5nZGIgZmlsZSB3ZSBoYXZlIHRvIGNoZWNrIAorICAgICB3aGV0aGVyIHRvIGRvd25sb2FkIGEgYnJlYWtwb2ludCByb3V0aW5lIG9yIG5vdCAqLworCisjaWYgMAorICBpZiAoKGVzMTgwMF9icmVha192ZWMgPT0gMCkgfHwgKHZlcmlmeV9icmVhayAoZXMxODAwX2JyZWFrX3ZlYykgIT0gMCkKKyAgICAgICYmIHF1ZXJ5ICgiTm8gYnJlYWtwb2ludCByb3V0aW5lIGluIEVTIDE4MDAgZW11bGF0b3IhXG5Eb3dubG9hZCBhIGJyZWFrcG9pbnQgcm91dGluZSB0byB0aGUgZW11bGF0b3I/ICIpKQorICAgIHsKKyAgICAgIENPUkVfQUREUiBtZW1hZGRyZXNzOworICAgICAgcHJpbnRmICgiR2l2ZSB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgYnJlYWtwb2ludCByb3V0aW5lOiAiKTsKKyAgICAgIHNjYW5mICgiJWxpIiwgJm1lbWFkZHJlc3MpOworICAgICAgZXMxODAwX2luaXRfYnJlYWsgKChlczE4MDBfYnJlYWtfdmVjID8gZXMxODAwX2JyZWFrX3ZlYyA6CisJCQkgIEVTMTgwMF9CUkVBS19WRUMpLCBtZW1hZGRyZXNzKTsKKyAgICB9CisjZW5kaWYKKworfQorCisvKiAgQ2xvc2Ugb3V0IGFsbCBmaWxlcyBhbmQgbG9jYWwgc3RhdGUgYmVmb3JlIHRoaXMgdGFyZ2V0IGxvc2VzIGNvbnRyb2wuCisgICAgcXVpdHRpbmcgLSBhcmUgd2UgcXVpdHRpbmcgZ2RiIG5vdz8gKi8KKworc3RhdGljIHZvaWQKK2VzMTgwMF9jbG9zZSAocXVpdHRpbmcpCisgICAgIGludCBxdWl0dGluZzsKK3sKKyAgaWYgKGVzMTgwMF9kZXNjICE9IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmICgiXG5DbG9zaW5nIGNvbm5lY3Rpb24gdG8gZW11bGF0b3IuLi5cbiIpOworICAgICAgaWYgKFNFUklBTF9TRVRfVFRZX1NUQVRFIChlczE4MDBfZGVzYywgZXMxODAwX3NhdmVkX3R0eXN0YXRlKSA8IDApCisJcHJpbnRfc3lzX2Vycm1zZyAoIndhcm5pbmc6IHVuYWJsZSB0byByZXN0b3JlIHR0eSBzdGF0ZSIsIGVycm5vKTsKKyAgICAgIGZjbnRsIChlczE4MDBfZGVzYy0+ZmQsIEZfU0VURkwsIGVzMTgwMF9mY19zYXZlKTsKKyAgICAgIFNFUklBTF9DTE9TRSAoZXMxODAwX2Rlc2MpOworICAgICAgZXMxODAwX2Rlc2MgPSBOVUxMOworICAgIH0KKyAgaWYgKHNhdmVuYW1lICE9IE5VTEwpCisgICAgeworICAgICAgZnJlZSAoc2F2ZW5hbWUpOworICAgIH0KKyAgc2F2ZW5hbWUgPSBOVUxMOworCisjaWYgZGVmaW5lZCAoTE9HX0ZJTEUpCisKKyAgaWYgKGxvZ19maWxlICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGZlcnJvciAobG9nX2ZpbGUpKQorCXsKKwkgIHByaW50ZiAoIkVycm9yIHdyaXRpbmcgbG9nIGZpbGUuXG4iKTsKKwl9CisgICAgICBpZiAoZmNsb3NlIChsb2dfZmlsZSkgIT0gMCkKKwl7CisJICBwcmludGYgKCJFcnJvciBjbG9zaW5nIGxvZyBmaWxlLlxuIik7CisJfQorICAgICAgbG9nX2ZpbGUgPSBOVUxMOworICAgIH0KKworI2VuZGlmCS8qIExPR19GSUxFICovCisKK30KKworLyogIEF0dGFjaGVzIHRvIGEgcHJvY2VzcyBvbiB0aGUgdGFyZ2V0IHNpZGUKKyAgICBwcm9jX2lkICAtIHRoZSBpZCBvZiB0aGUgcHJvY2VzcyB0byBiZSBhdHRhY2hlZC4KKyAgICBmcm9tX3R0eSAtIHNheXMgd2hldGhlciB0byBiZSB2ZXJib3NlIG9yIG5vdCAqLworCitzdGF0aWMgdm9pZAorZXMxODAwX2F0dGFjaCAoYXJncywgZnJvbV90dHkpCisgICAgY2hhciAqYXJnczsKKyAgICBpbnQgZnJvbV90dHk7Cit7CisgIGVycm9yICgiQ2Fubm90IGF0dGFjaCB0byBwaWQgJXMsIHRoaXMgZmVhdHVyZSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LiIsCisJIGFyZ3MpOworfQorCisKKy8qIFRha2VzIGEgcHJvZ3JhbSBwcmV2aW91c2x5IGF0dGFjaGVkIHRvIGFuZCBkZXRhY2hlcyBpdC4KKyAgIFdlIGJldHRlciBub3QgaGF2ZSBsZWZ0IGFueSBicmVha3BvaW50cworICAgaW4gdGhlIHByb2dyYW0gb3IgaXQnbGwgZGllIHdoZW4gaXQgaGl0cyBvbmUuCisgICBDbG9zZSB0aGUgb3BlbiBjb25uZWN0aW9uIHRvIHRoZSByZW1vdGUgZGVidWdnZXIuCisgICBVc2UgdGhpcyB3aGVuIHlvdSB3YW50IHRvIGRldGFjaCBhbmQgZG8gc29tZXRoaW5nIGVsc2UKKyAgIHdpdGggeW91ciBnZGIuCisgCisgICBhcmdzICAgICAtIGFyZ3VtZW50cyBnaXZlbiB0byB0aGUgJ2RldGFjaCcgY29tbWFuZAorICAgZnJvbV90dHkgLSBzYXlzIHdoZXRoZXIgdG8gYmUgdmVyYm9zZSBvciBub3QgKi8KKworc3RhdGljIHZvaWQKK2VzMTgwMF9kZXRhY2ggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGlmIChhcmdzKQorICAgIHsKKyAgICAgIGVycm9yICgiQXJndW1lbnQgZ2l2ZW4gdG8gXCJkZXRhY2hcIiB3aGVuIHJlbW90ZWx5IGRlYnVnZ2luZy4iKTsKKyAgICB9CisgIHBvcF90YXJnZXQgKCk7CisgIGlmIChmcm9tX3R0eSkKKyAgICB7CisgICAgICBwcmludGYgKCJFbmRpbmcgZXMxODAwIHJlbW90ZSBkZWJ1Z2dpbmcuXG4iKTsKKyAgICB9Cit9CisKKworLyogVGVsbCB0aGUgcmVtb3RlIG1hY2hpbmUgdG8gcmVzdW1lLgorICAgc3RlcCAgICAtIHNpbmdsZS1zdGVwIG9yIHJ1biBmcmVlCisgICBzaWdnbmFsIC0gdGhlIHNpZ25hbCB2YWx1ZSB0byBiZSBnaXZlbiB0byB0aGUgdGFyZ2V0ICgwID0gbm8gc2lnbmFsKSAqLworCitzdGF0aWMgdm9pZAorZXMxODAwX3Jlc3VtZSAocGlkLCBzdGVwLCBzaWdnbmFsKQorICAgICBpbnQgcGlkOworICAgICBpbnQgc3RlcDsKKyAgICAgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ2duYWw7Cit7CisgIGNoYXIgYnVmW1BCVUZTSVpdOworCisgIGlmIChzaWdnbmFsKQorICAgIHsKKyAgICAgIGVycm9yICgiQ2FuJ3Qgc2VuZCBzaWduYWxzIHRvIGEgcmVtb3RlIHN5c3RlbS4iKTsKKyAgICB9CisgIGlmIChzdGVwKQorICAgIHsKKyAgICAgIHN0cmNweSAoYnVmLCJTVFBcciIpOworICAgICAgc2VuZCAoYnVmKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzZW5kX2NvbW1hbmQgKCJSQksiKTsKKyAgICB9Cit9CisKKy8qIFdhaXQgdW50aWwgdGhlIHJlbW90ZSBtYWNoaW5lIHN0b3BzLCB0aGVuIHJldHVybiwKKyAgIHN0b3Jpbmcgc3RhdHVzIGluIFNUQVRVUyBqdXN0IGFzIGB3YWl0JyB3b3VsZC4KKyAgIHN0YXR1cyAtICAqLworIAorc3RhdGljIGludAorZXMxODAwX3dhaXQgKHBpZCwgc3RhdHVzKQorICAgICBpbnQgcGlkOworICAgICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0YXR1czsKK3sKKyAgdW5zaWduZWQgY2hhciBidWZbUEJVRlNJWl07CisgIGludCBvbGRfdGltZW91dCA9IHRpbWVvdXQ7CisKKyAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0VYSVRFRDsKKyAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gMDsKKworICB0aW1lb3V0ID0gMDsJCS8qIERvbid0IHRpbWUgb3V0IC0tIHVzZXIgcHJvZ3JhbSBpcyBydW5uaW5nLiAqLworICBpZiAoIXNldGptcCAoaW50ZXJydXB0KSkKKyAgICB7CisgICAgICBvbGRfc2lnaW50ID0gc2lnbmFsIChTSUdJTlQsIGVzMTgwMF9yZXF1ZXN0X3F1aXQpOworICAgICAgd2hpbGUgKDEpCisgICAgICAgIHsKKwkgIGdldG1lc3NhZ2UgKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCSAgaWYgKHN0cm5jbXAgKCBidWYsICJcclxuKiBCUkVBSyAqIiwgMTEpID09IDApIAorCSAgICB7CisJICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisJICAgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1RSQVA7CisJICAgICAgc2VuZF9jb21tYW5kICgiU1RQIik7CS8qIFJlc3RvcmUgc3RhY2sgYW5kIFBDIGFuZCBzdWNoICovCisJICAgICAgaWYgKG02ODAyMCkKKwkJeworCQkgIHNlbmRfY29tbWFuZCAoIlNUUCIpOworCQl9CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGlmIChzdHJuY21wIChidWYsICJTVFBcclxuICIsIDYpID09IDApCisJICAgIHsKKwkgICAgICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKwkgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVFJBUDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgaWYgKGJ1ZltzdHJsZW4gKGJ1ZikgLSAyXSA9PSAnUicpCisJICAgIHsKKwkgICAgICBwcmludGYgKCJVbmV4cGVjdGVkIGVtdWxhdG9yIHJlcGx5OiBcbiVzXG4iLCBidWYpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBwcmludGYgKCJVbmV4cGVjdGVkIHN0b3A6IFxuJXNcbiIsIGJ1Zik7CisJICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisJICAgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1FVSVQ7CisJICAgICAgYnJlYWs7CisJICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZmbHVzaCAoc3RkaW4pOworICAgICAgcHJpbnRmICgiXG5TdG9wcGluZyBlbXVsYXRvci4uLiIpOworICAgICAgaWYgKCFzZXRqbXAgKGludGVycnVwdCkpCisJeworCSAgb2xkX3NpZ2ludCA9IHNpZ25hbCAoU0lHSU5ULCBlczE4MDBfcmVxdWVzdF9xdWl0KTsKKwkgIHNlbmRfY29tbWFuZCAoIlNUUCIpOworCSAgcHJpbnRmICgiIGVtdWxhdG9yIHN0b3BwZWRcbiIpOworCSAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisJICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfSU5UOworICAgICAgICB9CisgICAgICBlbHNlCisJeworCSAgZmZsdXNoIChzdGRpbik7CisJICBlczE4MDBfcmVzZXQgKChjaGFyKikgMSk7CisJfQorICAgIH0KKyAgc2lnbmFsIChTSUdJTlQsIG9sZF9zaWdpbnQpOworICB0aW1lb3V0ID0gb2xkX3RpbWVvdXQ7CisgIHJldHVybiAoMCk7Cit9CisKKworLyogRmV0Y2ggcmVnaXN0ZXIgdmFsdWVzIGZyb20gcmVtb3RlIG1hY2hpbmUuCisgICByZWdubyAtIHRoZSByZWdpc3RlciB0byBiZSBmZXRjaGVkIChmZXRjaCBhbGwgcmVnaXN0ZXJzIGlmIC0xKSAqLworCitzdGF0aWMgdm9pZAorZXMxODAwX2ZldGNoX3JlZ2lzdGVyIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBjaGFyIGJ1ZltQQlVGU0laXTsKKyAgaW50IGs7CisgIGludCByOworICBjaGFyICpwOworICBzdGF0aWMgY2hhciByZWd0YWJbMThdWzRdID0gCisgICAgeworICAgICAgIkQwICIsICJEMSAiLCAiRDIgIiwgIkQzICIsICJENCAiLCAiRDUgIiwgIkQ2ICIsICJENyAiLAorICAgICAgIkEwICIsICJBMSAiLCAiQTIgIiwgIkEzICIsICJBNCAiLCAiQTUgIiwgIkE2ICIsICJTU1AiLAorICAgICAgIlNSICIsICJQQyAiCisgICAgfTsKKworICBpZiAoKHJlZ25vIDwgMTUpIHx8IChyZWdubyA9PSAxNikgfHwgKHJlZ25vID09IDE3KSkKKyAgICB7CisgICAgICByID0gcmVnbm8gKiA0OworICAgICAgc2VuZF93aXRoX3JlcGx5IChyZWd0YWJbcmVnbm9dLCBidWYsIHNpemVvZiAoYnVmKSk7CisgICAgICBwID0gYnVmOworICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykKKwl7CisJICBpZiAoKHBbayoyICsgMV0gPT0gMCkgfHwgKHBbayoyICsgMl0gPT0gMCkpCisJICAgIHsKKwkgICAgICBlcnJvciAoIkVtdWxhdG9yIHJlcGx5IGlzIHRvbyBzaG9ydDogJXMiLCBidWYpOworCSAgICB9CisJICByZWdpc3RlcnNbcisrXSA9IChmcm9taGV4IChwW2sqMiArIDFdKSAqIDE2KSArIGZyb21oZXggKHBbayoyICsgMl0pOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBlczE4MDBfZmV0Y2hfcmVnaXN0ZXJzICgpOworICAgIH0KK30KKworLyogUmVhZCB0aGUgcmVtb3RlIHJlZ2lzdGVycyBpbnRvIFJFR0lTVEVSUy4KKyAgIEFsd2F5cyBmZXRjaGVzIGFsbCByZWdpc3RlcnMuICovCisKK3N0YXRpYyB2b2lkCitlczE4MDBfZmV0Y2hfcmVnaXN0ZXJzICgpCit7CisgIGNoYXIgYnVmW1BCVUZTSVpdOworICBjaGFyIFNSX2J1ZltQQlVGU0laXTsKKyAgaW50IGk7CisgIGludCBrOworICBpbnQgcjsKKyAgY2hhciAqcDsKKworICBzZW5kX3dpdGhfcmVwbHkgKCJEUiIsIGJ1Ziwgc2l6ZW9mIChidWYpKTsKKworICAvKiBSZXBseSBpcyBlZGl0ZWQgdG8gYSBzdHJpbmcgdGhhdCBkZXNjcmliZXMgcmVnaXN0ZXJzIGJ5dGUgYnkgYnl0ZSwKKyAgICAgZWFjaCBieXRlIGVuY29kZWQgYXMgdHdvIGhleCBjaGFyYWN0ZXJzLiAgKi8KKworICBwID0gYnVmOworICByID0gMDsKKworICAvKiAgcGFyc2luZyByb3cgb25lIC0gRDAtRDctcmVnaXN0ZXJzICAqLworCisgIHdoaWxlICgqcCsrICE9ICdcbicpIHs7fQorICBmb3IgKGkgPSA0OyBpIDwgNzA7IGkgKz0gKGkgPT0gMzkgPyAzIDogMSkpCisgICAgeworICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykKKwl7CisJICBpZiAocFtpKzBdID09IDAgfHwgcFtpKzFdID09IDApCisJICAgIHsKKwkgICAgICBlcnJvciAoIkVtdWxhdG9yIHJlcGx5IGlzIHRvbyBzaG9ydDogJXMiLCBidWYpOworCSAgICB9CisJICByZWdpc3RlcnNbcisrXSA9IChmcm9taGV4IChwW2krMF0pICogMTYpICsgZnJvbWhleCAocFtpKzFdKTsKKwkgIGkgKz0gMjsKKwl9CisgICAgfQorICBwICs9IGk7CisKKyAgLyogIHBhcnNpbmcgcm93IHR3byAtIEEwLUE2LXJlZ2lzdGVycyAgKi8KKworICB3aGlsZSAoKnArKyAhPSAnXG4nKSB7O30KKyAgZm9yIChpID0gNDsgaSA8IDYxOyBpICs9IChpID09IDM5ID8gMyA6IDEpKQorICAgIHsKKyAgICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspCisJeworCSAgaWYgKHBbaSswXSA9PSAwIHx8IHBbaSsxXSA9PSAwKQorCSAgICB7CisJICAgICAgZXJyb3IgKCJFbXVsYXRvciByZXBseSBpcyB0b28gc2hvcnQ6ICVzIiwgYnVmKTsKKwkgICAgfQorCSAgcmVnaXN0ZXJzW3IrK10gPSAoZnJvbWhleCAocFtpKzBdKSkgKiAxNiArIGZyb21oZXggKHBbaSsxXSk7CisJICBpICs9IDI7CisJfQorICAgIH0KKyAgcCArPSBpOworCisgIHdoaWxlICgqcCsrICE9ICdcbicpIHs7fQorCisgIC8qIGZldGNoIFNTUC0sIFNSLSBhbmQgUEMtcmVnaXN0ZXJzICAqLworCisgIC8qIGZpcnN0IC0gY2hlY2sgU1RBVFVTLXdvcmQgYW5kIGRlY2lkZSB3aGljaCBzdGFja3BvaW50ZXIgdG8gdXNlICovCisKKyAgc2VuZF93aXRoX3JlcGx5ICgiU1IiLCBTUl9idWYsIHNpemVvZiAoU1JfYnVmKSk7CisgIHAgPSBTUl9idWY7CisgIHAgKz0gNTsKKworICBpZiAobTY4MDIwKQorICAgIHsKKyAgICAgIGlmICgqcCA9PSAnMycpCQkgLyogdXNlIG1hc3RlcnN0YWNrcG9pbnRlciBNU1AgKi8KKwl7CisJICBzZW5kX3dpdGhfcmVwbHkgKCJNU1AiLCBidWYsIHNpemVvZiAoYnVmKSk7CisJfQorICAgICAgZWxzZSBpZiAoKnAgPT0gJzInKQkvKiB1c2UgaW50ZXJydXB0c3RhY2twb2ludGVyIElTUCAgKi8KKwl7CisJICBzZW5kX3dpdGhfcmVwbHkgKCJJU1AiLCBidWYsIHNpemVvZiAoYnVmKSk7CisJfQorICAgICAgZWxzZQkJCS8qIHVzZSB1c2Vyc3RhY2twb2ludGVyIFVTUCAgKi8KKwl7CisJICBzZW5kX3dpdGhfcmVwbHkgKCJVU1AiLCBidWYsIHNpemVvZiAoYnVmKSk7IAorCX0KKyAgICAgIHAgPSBidWY7CisgICAgICBmb3IgKGsgPSAwOyBrPDQ7IGsrKykKKwl7CisJICBpZiAocFtrKjIrMV0gPT0gMCB8fCBwW2sqMisyXSA9PSAwKQorCSAgICB7CisJICAgICAgZXJyb3IgKCJFbXVsYXRvciByZXBseSBpcyB0b28gc2hvcnQ6ICVzIiwgYnVmKTsKKwkgICAgfQorCSAgcmVnaXN0ZXJzW3IrK10gPSBmcm9taGV4IChidWZbayoyKzFdKSAqIDE2ICsgZnJvbWhleCAoYnVmW2sqMisyXSk7CisJfQorCisgICAgICBwID0gU1JfYnVmOworICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykKKwl7CisJICBpZiAocFtrKjIrMV0gPT0gMCB8fCBwW2sqMisyXSA9PSAwKQorCSAgICB7CisJICAgICAgZXJyb3IgKCJFbXVsYXRvciByZXBseSBpcyB0b28gc2hvcnQ6ICVzIiwgYnVmKTsKKwkgICAgfQorCSAgcmVnaXN0ZXJzW3IrK10gPQorCSAgICBmcm9taGV4IChTUl9idWZbayoyKzFdKSAqIDE2ICsgZnJvbWhleCAoU1JfYnVmW2sqMisyXSk7CisJfQorICAgICAgc2VuZF93aXRoX3JlcGx5ICgiUEMiLCBidWYsIHNpemVvZiAoYnVmKSk7CisgICAgICBwID0gYnVmOworICAgICAgZm9yIChrID0gMDsgazw0OyBrKyspCisJeworCSAgaWYgKHBbayoyKzFdID09IDAgfHwgcFtrKjIrMl0gPT0gMCkKKwkgICAgeworCSAgICAgIGVycm9yICgiRW11bGF0b3IgcmVwbHkgaXMgdG9vIHNob3J0OiAlcyIsIGJ1Zik7CisJICAgIH0KKwkgIHJlZ2lzdGVyc1tyKytdID0gZnJvbWhleCAoYnVmW2sqMisxXSkgKiAxNiArIGZyb21oZXggKGJ1ZltrKjIrMl0pOworCX0KKyAgICB9CisgIGVsc2UgICAgLyogNjgwMDAtbW9kZSAqLworICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgaWYgKCpwID09ICcyJykgLyogdXNlIHN1cGVydmlzb3JzdGFja3BvaW50ZXIgU1NQICAqLworCXsKKwkgIHNlbmRfd2l0aF9yZXBseSAoIlNTUCIsIGJ1Ziwgc2l6ZW9mIChidWYpKTsgCisJfQorICAgICAgZWxzZSAgLyogdXNlIHVzZXJzdGFja3BvaW50ZXIgVVNQICAqLworCXsKKwkgIHNlbmRfd2l0aF9yZXBseSAoIlVTUCIsIGJ1Ziwgc2l6ZW9mIChidWYpKTsgCisJfQorCisgICAgICAvKiBmZXRjaCBTVEFDS1BPSU5URVIgKi8KKworICAgICAgcCA9IGJ1ZjsKKyAgICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspCisJeworCSAgaWYgKHBbayoyICsgMV0gPT0gMCB8fCBwW2sqMiArIDJdID09IDApCisJICAgIHsKKwkgICAgICBlcnJvciAoIkVtdWxhdG9yIHJlcGx5IGlzIHRvbyBzaG9ydDogJXMiLCBidWYpOworCSAgICB9CisJICByZWdpc3RlcnNbcisrXSA9IGZyb21oZXggKGJ1ZltrKjIrMV0pICogMTYgKyBmcm9taGV4IChidWZbayoyKzJdKTsKKwl9CisKKyAgICAgIC8qIGZldGNoIFNUQVRVUyAqLworCisgICAgICBwID0gU1JfYnVmOworICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykKKwl7CisJICBpZiAocFtrKjIrMV0gPT0gMCB8fCBwW2sqMisyXSA9PSAwKQorCSAgICB7CisJICAgICAgZXJyb3IgKCJFbXVsYXRvciByZXBseSBpcyB0b28gc2hvcnQ6ICVzIiwgYnVmKTsKKwkgICAgfQorCSAgcmVnaXN0ZXJzW3IrK10gPQorCSAgICBmcm9taGV4IChTUl9idWZbayoyKzFdKSAqIDE2ICsgZnJvbWhleCAoU1JfYnVmW2sqMisyXSk7CisJfQorCisgICAgICAvKiBmZXRjaCBQQyAqLworCisgICAgICBzZW5kX3dpdGhfcmVwbHkgKCJQQyIsIGJ1Ziwgc2l6ZW9mIChidWYpKTsgCisgICAgICBwID0gYnVmOworICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykKKwl7CisJICBpZiAocFtrKjIrMV0gPT0gMCB8fCBwW2sqMisyXSA9PSAwKQorCSAgICB7CisJICAgICAgZXJyb3IgKCJFbXVsYXRvciByZXBseSBpcyB0b28gc2hvcnQ6ICVzIiwgYnVmKTsKKwkgICAgfQorCSAgcmVnaXN0ZXJzW3IrK10gPSBmcm9taGV4IChidWZbayoyKzFdKSAqIDE2ICsgZnJvbWhleCAoYnVmW2sqMisyXSk7CisJfSAgICAKKyAgICB9Cit9CisKKy8qIFN0b3JlIHJlZ2lzdGVyIHZhbHVlLCBsb2NhdGVkIGluIFJFR0lTVEVSLCBvbiB0aGUgdGFyZ2V0IHByb2Nlc3Nvci4KKyAgIHJlZ25vIC0gdGhlIHJlZ2lzdGVyLW51bWJlciBvZiB0aGUgcmVnaXN0ZXIgdG8gc3RvcmUKKyAgICAgICAgICAgKC0xIG1lYW5zIHN0b3JlIHRoZW0gYWxsKQorICAgRklYTUU6IFJldHVybiBlcnJubyB2YWx1ZS4gICovCisKK3N0YXRpYyB2b2lkCitlczE4MDBfc3RvcmVfcmVnaXN0ZXIocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKworICBzdGF0aWMgY2hhciByZWd0YWJbMThdWzRdID0KKyAgICB7CisgICAgICAiRDAgIiwgIkQxICIsICJEMiAiLCAiRDMgIiwgIkQ0ICIsICJENSAiLCAiRDYgIiwgIkQ3ICIsCisgICAgICAiQTAgIiwgIkExICIsICJBMiAiLCAiQTMgIiwgIkE0ICIsICJBNSAiLCAiQTYgIiwgIlNTUCIsCisgICAgICAiU1IgIiwgIlBDICIKKyAgICB9OworCisgIGNoYXIgYnVmW1BCVUZTSVpdOworICBjaGFyIFNSX2J1ZltQQlVGU0laXTsKKyAgY2hhciBzdGFja19wb2ludGVyWzRdOworICBjaGFyICpwOworICBpbnQgaTsKKyAgaW50IGo7CisgIGludCBrOworICB1bnNpZ25lZCBjaGFyICpyOworCisgIHIgPSAodW5zaWduZWQgY2hhciAqKSByZWdpc3RlcnM7CisKKyAgaWYgKHJlZ25vID09IC0xKSAgLyogd3JpdGUgYWxsIHJlZ2lzdGVycyAqLworICAgIHsKKyAgICAgIGogPSAwOworICAgICAgayA9IDE4OworICAgIH0KKyAgZWxzZSAgICAgICAgICAgICAgLyogd3JpdGUgb25lIHJlZ2lzdGVyICovCisgICAgeworICAgICAgaiA9IHJlZ25vOworICAgICAgayA9IHJlZ25vKzE7CisgICAgICByICs9IHJlZ25vICogNDsgCisgICAgfSAgICAKKworICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gMTUpKQorICAgIHsKKyAgICAgIC8qIGZldGNoIGN1cnJlbnQgc3RhdHVzICovCisgICAgICBzZW5kX3dpdGhfcmVwbHkgKCJTUiIsIFNSX2J1Ziwgc2l6ZW9mIChTUl9idWYpKTsKKyAgICAgIHAgPSBTUl9idWY7CisgICAgICBwICs9IDU7CisgICAgICBpZiAobTY4MDIwKQorCXsKKwkgIGlmICgqcCA9PSAnMycpIC8qIHVzZSBtYXN0ZXJzdGFja3BvaW50ZXIgTVNQICovCisJICAgIHsKKwkgICAgICBzdHJjcHkgKHN0YWNrX3BvaW50ZXIsIk1TUCIpOyAgCisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICgqcCA9PSAnMicpIC8qIHVzZSBpbnRlcnJ1cHRzdGFja3BvaW50ZXIgSVNQICAqLworCQl7CisJCSAgc3RyY3B5IChzdGFja19wb2ludGVyLCJJU1AiKTsgIAorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgc3RyY3B5IChzdGFja19wb2ludGVyLCJVU1AiKTsgIC8qIHVzZSB1c2Vyc3RhY2twb2ludGVyIFVTUCAgKi8KKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZSAgLyogNjgwMDAtbW9kZSAqLworCXsKKwkgIGlmICgqcCA9PSAnMicpIC8qIHVzZSBzdXBlcnZpc29yc3RhY2twb2ludGVyIFNTUCAgKi8KKwkgICAgeworCSAgICAgIHN0cmNweSAoc3RhY2tfcG9pbnRlciwiU1NQIik7ICAKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgc3RyY3B5IChzdGFja19wb2ludGVyLCJVU1AiKTsvKiB1c2UgdXNlcnN0YWNrcG9pbnRlciBVU1AgICovICAKKwkgICAgfQorCX0KKyAgICAgIHN0cmNweSAocmVndGFiWzE1XSxzdGFja19wb2ludGVyKTsKKyAgICB9CisKKyAgZm9yIChpID0gajsgaTxrOyBpKyspCisgICAgeworICAgICAgYnVmWzBdID0gcmVndGFiW2ldWzBdOworICAgICAgYnVmWzFdID0gcmVndGFiW2ldWzFdOworICAgICAgYnVmWzJdID0gcmVndGFiW2ldWzJdOworICAgICAgYnVmWzNdID0gJz0nOworICAgICAgYnVmWzRdID0gJyQnOworICAgICAgYnVmWzVdID0gdG9oZXggKCgqciA+PiA0KSAmIDB4MGYpOworICAgICAgYnVmWzZdID0gdG9oZXggKCpyKysgJiAweDBmKTsKKyAgICAgIGJ1Zls3XSA9IHRvaGV4ICgoKnIgPj4gNCkgJiAweDBmKTsKKyAgICAgIGJ1Zls4XSA9IHRvaGV4ICgqcisrICYgMHgwZik7CisgICAgICBidWZbOV0gPSB0b2hleCAoKCpyID4+IDQpICYgMHgwZik7CisgICAgICBidWZbMTBdID0gdG9oZXggKCpyKysgJiAweDBmKTsKKyAgICAgIGJ1ZlsxMV0gPSB0b2hleCAoKCpyID4+IDQpICYgMHgwZik7CisgICAgICBidWZbMTJdID0gdG9oZXggKCpyKysgJiAweDBmKTsKKyAgICAgIGJ1ZlsxM10gPSAwOworCisgICAgICBzZW5kX3dpdGhfcmVwbHkgKGJ1ZiwgYnVmLCBzaXplb2YgKGJ1ZikpOyAvKiBGSVhNRSwgcmVwbHkgbm90IHVzZWQ/ICovCisgICAgfQorfQorCisKKy8qIFByZXBhcmUgdG8gc3RvcmUgcmVnaXN0ZXJzLiAgKi8KKworc3RhdGljIHZvaWQgCitlczE4MDBfcHJlcGFyZV90b19zdG9yZSAoKQoreworICAvKiBEbyBub3RoaW5nLCBzaW5jZSB3ZSBjYW4gc3RvcmUgaW5kaXZpZHVhbCByZWdzICovCit9CisKKy8qIENvbnZlcnQgaGV4IGRpZ2l0IEEgdG8gYSBudW1iZXIuICAqLworCitzdGF0aWMgaW50Citmcm9taGV4IChhKQorICAgICBpbnQgYTsKK3sKKyAgaWYgKGEgPj0gJzAnICYmIGEgPD0gJzknKQorICAgIHsKKyAgICAgIHJldHVybiBhIC0gJzAnOworICAgIH0KKyAgZWxzZSBpZiAoYSA+PSAnYScgJiYgYSA8PSAnZicpCisgICAgeworICAgICAgcmV0dXJuIGEgLSAnYScgKyAxMDsKKyAgICB9CisgIGVsc2UgaWYgKGEgPj0gJ0EnICYmIGEgPD0gJ0YnKQorICAgIHsKKyAgICAgIHJldHVybiBhIC0gJ0EnICsgMTA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZXJyb3IgKCJSZXBseSBjb250YWlucyBpbnZhbGlkIGhleCBkaWdpdCIpOworICAgIH0KKyAgcmV0dXJuICgtMSk7Cit9CisKKworLyogQ29udmVydCBudW1iZXIgTklCIHRvIGEgaGV4IGRpZ2l0LiAgKi8KKworc3RhdGljIGludAordG9oZXggKG5pYikKKyAgICAgaW50IG5pYjsKK3sKKyAgaWYgKG5pYiA8IDEwKQorICAgIHsKKyAgICAgIHJldHVybiAoJzAnICsgbmliKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gKCdBJyArIG5pYiAtIDEwKTsKKyAgICB9Cit9CisKKy8qIFJlYWQgb3Igd3JpdGUgTEVOIGJ5dGVzIGZyb20gaW5mZXJpb3IgbWVtb3J5IGF0IE1FTUFERFIsIHRyYW5zZmVycmluZworICAgdG8gb3IgZnJvbSBkZWJ1Z2dlciBhZGRyZXNzIE1ZQUREUi4gIFdyaXRlIHRvIGluZmVyaW9yIGlmIFdSSVRFIGlzCisgICBub256ZXJvLiAgUmV0dXJucyBsZW5ndGggb2YgZGF0YSB3cml0dGVuIG9yIHJlYWQ7IDAgZm9yIGVycm9yLiAKKyAKKyAgIG1lbWFkZHIgLSB0aGUgdGFyZ2V0J3MgYWRkcmVzcworICAgbXlhZGRyICAtIGdkYidzIGFkZHJlc3MKKyAgIGxlbiAgICAgLSBudW1iZXIgb2YgYnl0ZXMgCisgICB3cml0ZSAgIC0gd3JpdGUgaWYgIT0gMCBvdGhlcndpc2UgcmVhZAkqLworCitzdGF0aWMgaW50CitlczE4MDBfeGZlcl9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuLCB3cml0ZSwgdG9wcykKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IHdyaXRlOworICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdG9wczsJLyogVW51c2VkICovCit7CisgIGludCBvcmlnbGVuID0gbGVuOworICBpbnQgeGZlcnNpemU7CisKKyAgd2hpbGUgKGxlbiA+IDApCisgICAgeworICAgICAgeGZlcnNpemUgPSBsZW4gPiBNQVhCVUZCWVRFUyA/IE1BWEJVRkJZVEVTIDogbGVuOworICAgICAgaWYgKHdyaXRlKQorCXsKKwkgIGVzMTgwMF93cml0ZV9ieXRlcyAobWVtYWRkciwgbXlhZGRyLCB4ZmVyc2l6ZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGVzMTgwMF9yZWFkX2J5dGVzIChtZW1hZGRyLCBteWFkZHIsIHhmZXJzaXplKTsKKwl9CisgICAgICBtZW1hZGRyICs9IHhmZXJzaXplOworICAgICAgbXlhZGRyICs9IHhmZXJzaXplOworICAgICAgbGVuIC09IHhmZXJzaXplOworICAgIH0KKyAgcmV0dXJuIChvcmlnbGVuKTsgLyogbm8gZXJyb3IgcG9zc2libGUgKi8KK30KKworCisvKiBXcml0ZSBtZW1vcnkgZGF0YSBkaXJlY3RseSB0byB0aGUgZW11bGF0b3IuCisgICBUaGlzIGRvZXMgbm90IGluZm9ybSB0aGUgZGF0YSBjYWNoZTsgdGhlIGRhdGEgY2FjaGUgdXNlcyB0aGlzLgorICAgTUVNQUREUiBpcyB0aGUgYWRkcmVzcyBpbiB0aGUgcmVtb3RlIG1lbW9yeSBzcGFjZS4KKyAgIE1ZQUREUiBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGluIG91ciBzcGFjZS4KKyAgIExFTiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzLgorIAorICAgbWVtYWRkciAtIHRoZSB0YXJnZXQncyBhZGRyZXNzCisgICBteWFkZHIgIC0gZ2RiJ3MgYWRkcmVzcworICAgbGVuICAgICAtIG51bWJlciBvZiBieXRlcyAgICovCisKK3N0YXRpYyB2b2lkCitlczE4MDBfd3JpdGVfYnl0ZXMgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICBjaGFyIGJ1ZltQQlVGU0laXTsKKyAgaW50IGk7CisgIGNoYXIgKnA7CisKKyAgcCA9IG15YWRkcjsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHsKKyAgICAgIHNwcmludGYgKGJ1ZiwgIkAuQiQleD0kJXgiLCBtZW1hZGRyK2ksICgqcCsrKSAmIDB4ZmYpOworICAgICAgc2VuZF93aXRoX3JlcGx5IChidWYsIGJ1Ziwgc2l6ZW9mIChidWYpKTsgICAgICAvKiBGSVhNRSBzZW5kX2NvbW1hbmQ/ICovCisgICAgfQorfQorCisKKy8qIFJlYWQgbWVtb3J5IGRhdGEgZGlyZWN0bHkgZnJvbSB0aGUgZW11bGF0b3IuCisgICBUaGlzIGRvZXMgbm90IHVzZSB0aGUgZGF0YSBjYWNoZTsgdGhlIGRhdGEgY2FjaGUgdXNlcyB0aGlzLgorIAorICAgbWVtYWRkciAtIHRoZSB0YXJnZXQncyBhZGRyZXNzCisgICBteWFkZHIgIC0gZ2RiJ3MgYWRkcmVzcworICAgbGVuICAgICAtIG51bWJlciBvZiBieXRlcyAgICovCisKK3N0YXRpYyB2b2lkCitlczE4MDBfcmVhZF9ieXRlcyAobWVtYWRkciwgbXlhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47Cit7CisgIHN0YXRpYyBpbnQgREJfdGFiWzE2XSA9IHs4LDExLDE0LDE3LDIwLDIzLDI2LDI5LDM0LDM3LDQwLDQzLDQ2LDQ5LDUyLDU1fTsKKyAgY2hhciBidWZbUEJVRlNJWl07CisgIGludCBpOworICBpbnQgbG93X2FkZHI7CisgIGNoYXIgKnA7CisgIGNoYXIgKmI7CisKKyAgaWYgKGxlbiA+IFBCVUZTSVogLyAyIC0gMSkKKyAgICB7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgaWYgKGxlbiA9PSAxKQkvKiBUaGUgZW11bGF0b3IgZG9lcyBub3QgbGlrZSBleHByZXNzaW9ucyBsaWtlOiAgKi8KKyAgICB7CisgICAgICBsZW4gPSAyOwkvKiBEQi5CICQyMDAxOCBUTyAkMjAwMTggICAgICAgICAgICAgICAgICAgICAgICovCisgICAgfQorCisgIC8qIFJlcGx5IGRlc2NyaWJlcyByZWdpc3RlcnMgYnl0ZSBieSBieXRlLCBlYWNoIGJ5dGUgZW5jb2RlZCBhcyB0d28gaGV4CisgICAgIGNoYXJhY3RlcnMuICAqLworCisgIHNwcmludGYgKGJ1ZiwgIkRCLkIgJCV4IFRPICQleCIsIG1lbWFkZHIsIG1lbWFkZHIrbGVuLTEpOworICBzZW5kX3dpdGhfcmVwbHkgKGJ1ZiwgYnVmLCBzaXplb2YgKGJ1ZikpOworICBiID0gYnVmOworICBsb3dfYWRkciA9IG1lbWFkZHImMHgwZjsKKyAgZm9yIChpID0gbG93X2FkZHI7IGkgPCBsb3dfYWRkciArIGxlbjsgaSsrKQorICAgIHsKKyAgICAgIGlmICgoIShpICUgMTYpKSAmJiBpKQorCXsgICAvKiBpZiAoaSA9IDE2LDMyLDQ4KSAgKi8KKwkgIHdoaWxlICgqcCsrIT0nXG4nKSB7O30KKwkgIGIgPSBwOworCX0KKyAgICAgIHAgPSBiICsgREJfdGFiW2klMTZdICsgKG02ODAyMCA/IDIgOiAwKTsKKyAgICAgIGlmIChwWzBdID09IDMyIHx8IHBbMV0gPT0gMzIpCisJeworCSAgZXJyb3IgKCJFbXVsYXRvciByZXBseSBpcyB0b28gc2hvcnQ6ICVzIiwgYnVmKTsKKwl9CisgICAgICBteWFkZHJbaS1sb3dfYWRkcl0gPSBmcm9taGV4IChwWzBdKSAqIDE2ICsgZnJvbWhleCAocFsxXSk7CisgICAgfQorfQorCisvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCB0YXJnZXQgICovCisKK3N0YXRpYyB2b2lkCitlczE4MDBfZmlsZXNfaW5mbyAodG9wcykKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKnRvcHM7CS8qIFVudXNlZCAqLworeworICBwcmludGYgKCJFUzE4MDAgQXR0YWNoZWQgdG8gJXMgYXQgJWQgYmF1ZCBpbiAlcyBtb2RlXG4iLCBzYXZlbmFtZSwgMTkyMDAsCisJICBNT0RFKTsKK30KKworCisvKiBXZSByZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgdGFyZ2V0IGxvY2F0aW9uIGFuZCBzdGFzaCBpdCwKKyAgIHRoZW4gb3ZlcndyaXRlIGl0IHdpdGggYSBicmVha3BvaW50IGluc3RydWN0aW9uLgorIAorICAgYWRkciAgICAgICAgICAgLSBpcyB0aGUgdGFyZ2V0IGxvY2F0aW9uIGluIHRoZSB0YXJnZXQgbWFjaGluZS4KKyAgIGNvbnRlbnRzX2NhY2hlIC0gaXMgYSBwb2ludGVyIHRvIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHNhdmluZyB0aGUgdGFyZ2V0IGNvbnRlbnRzLgorICAgICAgICAgICAgICAgICAgICBJdCBpcyBndWFyYW50ZWVkIGJ5IHRoZSBjYWxsZXIgdG8gYmUgbG9uZyBlbm91Z2ggdG8gc2F2ZSBzaXplb2YgCisgICAgICAgICAgICAgICAgICAgIEJSRUFLUE9JTlQgYnl0ZXMuCisgCisgICBGSVhNRTogVGhpcyBzaXplIGlzIHRhcmdldF9hcmNoIGRlcGVuZGVudCBhbmQgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbgorICAgdGhlIHRhcmdldF9hcmNoIHRyYW5zZmVyIHZlY3RvciwgaWYgd2UgZXZlciBoYXZlIG9uZS4uLiAgKi8KKworc3RhdGljIGludAorZXMxODAwX2luc2VydF9icmVha3BvaW50IChhZGRyLCBjb250ZW50c19jYWNoZSkKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGNoYXIgKmNvbnRlbnRzX2NhY2hlOworeworICBpbnQgdmFsOyAKKworICB2YWwgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGFkZHIsIGNvbnRlbnRzX2NhY2hlLCBzaXplb2YgKGVzMTgwMF9icmVha19pbnNuKSk7CisKKyAgaWYgKHZhbCA9PSAwKQorICAgIHsKKyAgICAgIHZhbCA9IHRhcmdldF93cml0ZV9tZW1vcnkgKGFkZHIsIGVzMTgwMF9icmVha19pbnNuLAorCQkJCSBzaXplb2YgKGVzMTgwMF9icmVha19pbnNuKSk7CisgICAgfQorCisgIHJldHVybiAodmFsKTsKK30KKworCisvKiBXcml0ZSBiYWNrIHRoZSBzdGFzaGVkIGluc3RydWN0aW9uCisgCisgICBhZGRyICAgICAgICAgICAtIGlzIHRoZSB0YXJnZXQgbG9jYXRpb24gaW4gdGhlIHRhcmdldCBtYWNoaW5lLgorICAgY29udGVudHNfY2FjaGUgLSBpcyBhIHBvaW50ZXIgdG8gbWVtb3J5IGFsbG9jYXRlZCBmb3Igc2F2aW5nIHRoZSB0YXJnZXQgY29udGVudHMuCisgICAgICAgICAgICAgICAgICAgIEl0IGlzIGd1YXJhbnRlZWQgYnkgdGhlIGNhbGxlciB0byBiZSBsb25nIGVub3VnaCB0byBzYXZlIHNpemVvZiAKKyAgICAgICAgICAgICAgICAgICAgQlJFQUtQT0lOVCBieXRlcy4JKi8KKyAKK3N0YXRpYyBpbnQKK2VzMTgwMF9yZW1vdmVfYnJlYWtwb2ludCAoYWRkciwgY29udGVudHNfY2FjaGUpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpjb250ZW50c19jYWNoZTsKK3sKKworICByZXR1cm4gKHRhcmdldF93cml0ZV9tZW1vcnkgKGFkZHIsIGNvbnRlbnRzX2NhY2hlLAorCQkJICAgICAgIHNpemVvZiAoZXMxODAwX2JyZWFrX2luc24pKSk7Cit9CisKKy8qIGNyZWF0ZV9icmVha19pbnNuICgpCisgICBQcmltaXRpdmUgZGF0YXN0cnVjdHVyZXMgY29udGFpbmluZyB0aGUgZXMxODAwIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gICovCisKK3N0YXRpYyB2b2lkCitlczE4MDBfY3JlYXRlX2JyZWFrX2luc24gKGlucywgdmVjKQorICAgICBjaGFyICppbnM7CisgICAgIGludCB2ZWM7Cit7CisgIGlmICh2ZWMgPT0gMTUpCisgICAgeworICAgICAgaW5zWzBdID0gMHg0ZTsKKyAgICAgIGluc1sxXSA9IDB4NGY7CisgICAgfQorfQorCisKKy8qIHZlcmlmeV9icmVhayAoKQorICAgU2VhY2ggZm9yIGJyZWFrcG9pbnQgcm91dGluZSBpbiBlbXVsYXRvciBtZW1vcnkuCisgICByZXR1cm5zIG5vbi16ZXJvIG9uIGZhaWx1cmUKKyAgIHZlYyAtIHRyYXAgdmVjdG9yIHVzZWQgZm9yIGJyZWFrcG9pbnRzICAqLworCitzdGF0aWMgaW50Cit2ZXJpZnlfYnJlYWsgKHZlYykKKyAgICAgaW50IHZlYzsKK3sKKyAgQ09SRV9BRERSIG1lbWFkZHJlc3M7CisgIGNoYXIgYnVmWzhdOworICBjaGFyICppbnN0ciA9ICJOcU5xTnFOcyI7ICAgICAgLyogYnJlYWtwb2ludCByb3V0aW5lICovCisgIGludCBzdGF0dXM7CisKKyAgZ2V0X2JyZWFrX2FkZHIgKHZlYywgJm1lbWFkZHJlc3MpOworCisgIGlmIChtZW1hZGRyZXNzKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAobWVtYWRkcmVzcywgYnVmLCA4KTsgCisgICAgICBpZiAoc3RhdHVzICE9IDApCisJeworCSAgbWVtb3J5X2Vycm9yIChzdGF0dXMsIG1lbWFkZHJlc3MpOworCX0KKyAgICAgIHJldHVybiAoU1RSQ01QIChpbnN0ciwgYnVmKSk7CisgICAgfQorICAgIHJldHVybiAoLTEpOworfQorCisKKy8qIGdldF9icmVha19hZGRyICgpCisgICBmaW5kIGFkZHJlc3Mgb2YgYnJlYWtwaW50IHJvdXRpbmUKKyAgIHZlYyAtIHRyYXAgdmVjdG9yIHVzZWQgZm9yIGJyZWFrcG9pbnRzCisgICBhZGRycCAtIHN0b3JlIHRoZSBhZGRyZXNzIGhlcmUJKi8KKworc3RhdGljIHZvaWQKK2dldF9icmVha19hZGRyICh2ZWMsIGFkZHJwKQorICAgICBpbnQgdmVjOworICAgICBDT1JFX0FERFIgKmFkZHJwOworeworICBDT1JFX0FERFIgbWVtYWRkcmVzcyA9IDA7CisgIGludCBzdGF0dXM7CisgIGludCBrOworICBjaGFyIGJ1ZltQQlVGU0laXTsKKyAgY2hhciBiYXNlX2FkZHJbNF07CisgIGNoYXIgKnA7CisKKyAgaWYgKG02ODAyMCkKKyAgICB7CisgICAgICBzZW5kX3dpdGhfcmVwbHkgKCJWQlIgIiwgYnVmLCBzaXplb2YgKGJ1ZikpOworICAgICAgcCA9IGJ1ZjsKKyAgICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspCisJeworCSAgaWYgKChwW2sqMiArIDFdID09IDApIHx8IChwW2sqMiArIDJdID09IDApKQorCSAgICB7CisJICAgICAgZXJyb3IgKCJFbXVsYXRvciByZXBseSBpcyB0b28gc2hvcnQ6ICVzIiwgYnVmKTsKKwkgICAgfQorCSAgYmFzZV9hZGRyW2tdID0gKGZyb21oZXggKHBbayoyICsgMV0pICogMTYpICsgZnJvbWhleCAocFtrKjIgKyAyXSk7CisJfQorICAgICAgLyogYmFzZSBhZGRyIG9mIGV4Y2VwdGlvbiB2ZWN0b3IgdGFibGUgKi8KKyAgICAgIG1lbWFkZHJlc3MgPSAqKChDT1JFX0FERFIgKikgYmFzZV9hZGRyKTsKKyAgICB9CisKKyAgICBtZW1hZGRyZXNzICs9ICh2ZWMgKyAzMikgKiA0OyAgICAgLyogYWRkcmVzcyBvZiB0cmFwIHZlY3RvciAqLworICAgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAobWVtYWRkcmVzcywgKGNoYXIgKikgYWRkcnAsIDQpOyAKKyAgICBpZiAoc3RhdHVzICE9IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB7CisJbWVtb3J5X2Vycm9yIChzdGF0dXMsIG1lbWFkZHJlc3MpOworICAgICAgfQorfQorCisKKy8qIEtpbGwgYW4gaW5mZXJpb3IgcHJvY2VzcyAqLworCitzdGF0aWMgdm9pZAorZXMxODAwX2tpbGwgKCkKK3sKKyAgaWYgKGluZmVyaW9yX3BpZCAhPSAwKQorICAgIHsKKyAgICAgIGluZmVyaW9yX3BpZCA9IDA7CisgICAgICBlczE4MDBfbW91cm5faW5mZXJpb3IgKCk7CisgICAgfQorfQorCisKKy8qIExvYWQgYSBmaWxlIHRvIHRoZSBFUzE4MDAgZW11bGF0b3IuIAorICAgQ29udmVydHMgdGhlIGZpbGUgZnJvbSBhLm91dCBmb3JtYXQgaW50byBFeHRlbmRlZCBUZWtoZXggZm9ybWF0CisgICBiZWZvcmUgdGhlIGZpbGUgaXMgbG9hZGVkLgorICAgQWxzbyBsb2FkcyB0aGUgdHJhcCByb3V0aW5lLCBhbmQgc2V0cyB0aGUgRVMxODAwIGJyZWFrcG9pbnQgb24gaXQKKyAgIGZpbGVuYW1lIC0gdGhlIGEub3V0IHRvIGJlIGxvYWRlZAorICAgZnJvbV90dHkgLSBzYXlzIHdoZXRoZXIgdG8gYmUgdmVyYm9zZSBvciBub3QKKyAgIEZJWE1FIFVzZXMgZW11bGF0b3Igb3ZlcmxheSBtZW1vcnkgZm9yIHRyYXAgcm91dGluZQkqLworIAorc3RhdGljIHZvaWQKK2VzMTgwMF9sb2FkIChmaWxlbmFtZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmZpbGVuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisKKyAgRklMRSAqaW5zdHJlYW07CisgIGNoYXIgbG9hZG5hbWVbMTVdOworICBjaGFyIGJ1ZlsxNjBdOworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworICBpbnQgZXMxODAwX2xvYWRfZm9ybWF0ID0gNTsKKworICBpZiAoZXMxODAwX2Rlc2MgPT0gTlVMTCkgCisgICAgeworICAgICAgcHJpbnRmICgiTm8gZW11bGF0b3IgYXR0YWNoZWQsIHR5cGUgZW11bGF0b3ItY29tbWFuZCBmaXJzdFxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGZpbGVuYW1lID0gdGlsZGVfZXhwYW5kIChmaWxlbmFtZSk7CisgIG1ha2VfY2xlYW51cCAoZnJlZSwgZmlsZW5hbWUpOworCisgIHN3aXRjaCAoZXMxODAwX2xvYWRfZm9ybWF0KQorICAgIHsKKyAgICAgIGNhc2UgMjogICAvKiBFeHRlbmRlZCBUZWtoZXggICovCisgICAgICAgIGlmIChmcm9tX3R0eSkKKwkgIHsKKwkgICAgcHJpbnRmICgiQ29udmVydGluZyBcIiVzXCIgdG8gRXh0ZW5kZWQgVGVraGV4IEZvcm1hdFxuIiwgZmlsZW5hbWUpOworCSAgfQorCXNwcmludGYgKGJ1ZiwgInRla2hleCAlcyIsIGZpbGVuYW1lKTsKKwlzeXN0ZW0gKGJ1Zik7CisJc3ByaW50ZiAobG9hZG5hbWUsICJvdXQuaGV4Iik7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgNTogICAvKiBNb3Rvcm9sYSBTLXJlYyAgKi8KKwlpZiAoZnJvbV90dHkpCisJICB7CisJICAgIHByaW50ZiAoIkNvbnZlcnRpbmcgXCIlc1wiIHRvIE1vdG9yb2xhIFMtcmVjb3JkIGZvcm1hdFxuIiwKKwkJICAgIGZpbGVuYW1lKTsKKwkgIH0KKwkvKiBpbiB0aGUgZnV0dXJlIHRoZSBzb3VyY2UgY29kZSBpbiBjb3B5IChwYXJ0IG9mIGJpbnV0aWxzLTEuOTMpIHdpbGwKKwkgICBiZSBpbmNsdWRlZCBpbiB0aGlzIGZpbGUgKi8KKwlzcHJpbnRmIChidWYsCisJCSAiY29weSAtcyBcImEub3V0LXN1bm9zLWJpZ1wiIC1kIFwic3JlY1wiICVzIC90bXAvb3V0LmhleCIsCisJCSBmaWxlbmFtZSk7CisJc3lzdGVtIChidWYpOworCXNwcmludGYgKGxvYWRuYW1lLCAiL3RtcC9vdXQuaGV4Iik7CisJYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisJZXJyb3IgKCJEb3dubG9hZGluZyBmb3JtYXQgbm90IGRlZmluZWRcbiIpOworICAgIH0KKyAKKyAgYnJlYWtwb2ludF9pbml0X2luZmVyaW9yICgpOworICBpbmZlcmlvcl9waWQgPSAwOworICBpZiAoZnJvbV90dHkpCisgICAgeworICAgICAgcHJpbnRmICgiRG93bmxvYWRpbmcgXCIlc1wiIHRvIHRoZSBFUyAxODAwXG4iLGZpbGVuYW1lKTsKKyAgICB9CisgIGlmICgoaW5zdHJlYW0gPSBmb3BlbiAobG9hZG5hbWUsICJyIikpID09IE5VTEwpCisgICAgeworICAgICAgcGVycm9yX3dpdGhfbmFtZSAoImZvcGVuOiIpOworICAgIH0KKworICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKGZjbG9zZSwgaW5zdHJlYW0pOworICBpbW1lZGlhdGVfcXVpdCsrOworCisgIGVzMTgwMF9yZXNldCAoMCk7CisKKyAgZG93bmxvYWQgKGluc3RyZWFtLCBmcm9tX3R0eSwgZXMxODAwX2xvYWRfZm9ybWF0KTsKKworICAvKiBpZiBicmVha3BvaW50IHJvdXRpbmUgaXMgbm90IHByZXNlbnQgYW55bW9yZSB3ZSBoYXZlIHRvIGNoZWNrIAorICAgICB3aGV0aGVyIHRvIGRvd25sb2FkIGEgbmV3IGJyZWFrcG9pbnQgcm91dGluZSBvciBub3QgKi8KKworICBpZiAoKHZlcmlmeV9icmVhayAoZXMxODAwX2JyZWFrX3ZlYykgIT0gMCkKKyAgICAgICYmIHF1ZXJ5ICgiTm8gYnJlYWtwb2ludCByb3V0aW5lIGluIEVTIDE4MDAgZW11bGF0b3IhXG5Eb3dubG9hZCBhIGJyZWFrcG9pbnQgcm91dGluZSB0byB0aGUgZW11bGF0b3I/ICIpKQorICAgIHsKKyAgICAgIGNoYXIgYnVmWzEyOF07CisgICAgICBwcmludGYgKCJVc2luZyBicmVhayB2ZWN0b3IgMHgleFxuIiwgZXMxODAwX2JyZWFrX3ZlYyk7CisgICAgICBzcHJpbnRmIChidWYsICIweCV4ICIsIGVzMTgwMF9icmVha192ZWMpOworICAgICAgcHJpbnRmICgiR2l2ZSB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgYnJlYWtwb2ludCByb3V0aW5lOiAiKTsKKyAgICAgIGZnZXRzIChidWYgKyBzdHJsZW4gKGJ1ZiksIHNpemVvZiAoYnVmKSAtIHN0cmxlbiAoYnVmKSwgc3RkaW4pOworICAgICAgZXMxODAwX2luaXRfYnJlYWsgKGJ1ZiwgMCk7CisgICAgfQorCisgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworICBleHBlY3RfcHJvbXB0ICgpOworICByZWFkY2hhciAoKTsgIC8qIEZJWE1FIEkgYW0gZ2V0dGluZyBhIF5HID0gNyBhZnRlciB0aGUgcHJvbXB0ICAqLworICBwcmludGYgKCJcbiIpOworCisgIGlmIChmY2xvc2UgKGluc3RyZWFtKSA9PSBFT0YpCisgICAgeworICAgICAgOworICAgIH0KKworICBpZiAoZXMxODAwX2xvYWRfZm9ybWF0ICE9IDIpCisgICAgeworICAgICAgc3ByaW50ZiAoYnVmLCAiL3Vzci9iaW4vcm0gJXMiLCBsb2FkbmFtZSk7CisgICAgICBzeXN0ZW0gKGJ1Zik7CisgICAgfQorCisgIHN5bWJvbF9maWxlX2NvbW1hbmQgKGZpbGVuYW1lLCBmcm9tX3R0eSk7ICAgLyogcmVhZGluZyBzeW1ib2wgdGFibGUgKi8KKyAgaW1tZWRpYXRlX3F1aXQtLTsKK30KKworI2lmIDAKKworI2RlZmluZSBOVU1DUFlCWVRFUyAyMAorCitzdGF0aWMgdm9pZAorYmZkX2NvcHkgKGZyb21fYmZkLCB0b19iZmQpCisgICAgIGJmZCAqZnJvbV9iZmQ7CisgICAgIGJmZCAqdG9fYmZkOworeworICBhc2VjdGlvbiAqcCwgKm5ldzsKKyAgaW50IGk7CisgIGNoYXIgYnVmW05VTUNQWUJZVEVTXTsKKworICBmb3IgKHAgPSBmcm9tX2JmZC0+c2VjdGlvbnM7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCisgICAgeworICAgICAgcHJpbnRmICgiICBDb3B5aW5nIHNlY3Rpb24gJXMuIFNpemUgPSAleC5cbiIsIHAtPm5hbWUsIHAtPl9jb29rZWRfc2l6ZSk7CisgICAgICBwcmludGYgKCIgICAgdm1hID0gJXgsICBvZmZzZXQgPSAleCwgIG91dHB1dF9zZWMgPSAleFxuIiwKKwkgICAgICBwLT52bWEsIHAtPm91dHB1dF9vZmZzZXQsIHAtPm91dHB1dF9zZWN0aW9uKTsKKyAgICAgIG5ldyA9IGJmZF9tYWtlX3NlY3Rpb24gKHRvX2JmZCwgcC0+bmFtZSk7CisgICAgICBpZiAocC0+X2Nvb2tlZF9zaXplICYmCisJICAhYmZkX3NldF9zZWN0aW9uX3NpemUgKHRvX2JmZCwgbmV3LCBwLT5fY29va2VkX3NpemUpKQorCXsKKwkgIGVycm9yICgiV3JvbmcgQkZEIHNpemUhXG4iKTsKKwl9CisgICAgICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAodG9fYmZkLCBuZXcsIHAtPmZsYWdzKSkKKwl7CisJICBlcnJvciAoImJmZF9zZXRfc2VjdGlvbl9mbGFncyIpOworCX0KKyAgICAgIG5ldy0+dm1hID0gcC0+dm1hOworICAgICAgCisgICAgICBmb3IgKGkgPSAwOyAoaSArIE5VTUNQWUJZVEVTKSA8IHAtPl9jb29rZWRfc2l6ZSA7IGkgKz0gTlVNQ1BZQllURVMpCisJeworCSAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGZyb21fYmZkLCBwLCAoUFRSKSBidWYsIChmaWxlX3B0cikgaSwKKwkJCQkJKGJmZF9zaXplX3R5cGUpIE5VTUNQWUJZVEVTKSkKKwkgICAgeworCSAgICAgIGVycm9yICgiYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzXG4iKTsKKwkgICAgfQorCWlmICghYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzICh0b19iZmQsIG5ldywgKFBUUikgYnVmLCAoZmlsZV9wdHIpIGksCisJCQkJICAgICAgKGJmZF9zaXplX3R5cGUpIE5VTUNQWUJZVEVTKSkKKwkgIHsKKwkgICAgZXJyb3IgKCJiZmRfc2V0X3NlY3Rpb25fY29udGVudHNcbiIpOworCSAgfQorICAgICAgfQorICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChmcm9tX2JmZCwgcCwgKFBUUikgYnVmLCAoZmlsZV9wdHIpIGksCisJCQkJKGJmZF9zaXplX3R5cGUpIChwLT5fY29va2VkX3NpemUgLSBpKSk7CisgICAgICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKHRvX2JmZCwgbmV3LCAoUFRSKSBidWYsKGZpbGVfcHRyKSBpLAorCQkJCShiZmRfc2l6ZV90eXBlKSAocC0+X2Nvb2tlZF9zaXplIC0gaSkpOworICAgIH0KK30KKworI2VuZGlmCisKKy8qIFN0YXJ0IGFuIHByb2Nlc3Mgb24gdGhlIGVzMTgwMCBhbmQgc2V0IGluZmVyaW9yX3BpZCB0byB0aGUgbmV3CisgICBwcm9jZXNzJyBwaWQuCisgICBleGVjZmlsZSAtIHRoZSBmaWxlIHRvIHJ1bgorICAgYXJncyAgICAgLSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBwcm9ncmFtCisgICBlbnYgICAgICAtIHRoZSBlbnZpcm9ubWVudCB2ZWN0b3IgdG8gcGFzcwkqLworCitzdGF0aWMgdm9pZAorZXMxODAwX2NyZWF0ZV9pbmZlcmlvciAoZXhlY2ZpbGUsIGFyZ3MsIGVudikKKyAgICAgY2hhciAqZXhlY2ZpbGU7CisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGludCBlbnRyeV9wdDsKKyAgaW50IHBpZDsKKyNpZiAwCisgIHN0cnVjdCBleHByZXNzaW9uICpleHByOworICByZWdpc3RlciBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluID0gMDsKKyAgcmVnaXN0ZXIgdmFsdWUgdmFsOworI2VuZGlmCisKKyAgaWYgKGFyZ3MgJiYgKmFyZ3MpCisgICAgeworICAgICAgZXJyb3IgKCJDYW4ndCBwYXNzIGFyZ3VtZW50cyB0byByZW1vdGUgRVMxODAwIHByb2Nlc3MiKTsKKyAgICB9CisKKyNpZiAwCisgIGlmIChxdWVyeSAoIlVzZSAnc3RhcnQnIGFzIGVudHJ5IHBvaW50PyAiKSkKKyAgICB7CisgICAgICBleHByID0gcGFyc2VfY19leHByZXNzaW9uICgic3RhcnQiKTsKKyAgICAgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoZnJlZV9jdXJyZW50X2NvbnRlbnRzLCAmZXhwcik7CisgICAgICB2YWwgPSBldmFsdWF0ZV9leHByZXNzaW9uIChleHByKTsKKyAgICAgIGVudHJ5X3B0ID0gKHZhbC0+bG9jYXRpb24pLmFkZHJlc3M7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRmICgiRW50ZXIgdGhlIHByb2dyYW0ncyBlbnRyeSBwb2ludCAoaW4gaGV4YWRlY2ltYWwpOiAiKTsKKyAgICAgIHNjYW5mICgiJXgiLCAmZW50cnlfcHQpOworICAgIH0KKyNlbmRpZgorCisgIGlmIChleGVjZmlsZSA9PSAwIHx8IGV4ZWNfYmZkID09IDApCisgICAgeworICAgICAgZXJyb3IgKCJObyBleGVjdXRhYmxlIGZpbGUgc3BlY2lmaWVkIik7CisgICAgfQorCisgIGVudHJ5X3B0ID0gKGludCkgYmZkX2dldF9zdGFydF9hZGRyZXNzIChleGVjX2JmZCk7CisKKyAgcGlkID0gNDI7CisKKyAgLyogTm93IHRoYXQgd2UgaGF2ZSBhIGNoaWxkIHByb2Nlc3MsIG1ha2UgaXQgb3VyIHRhcmdldC4gICovCisKKyAgcHVzaF90YXJnZXQgKCZlczE4MDBfY2hpbGRfb3BzKTsKKworICAvKiBUaGUgInByb2Nlc3MiIChib2FyZCkgaXMgYWxyZWFkeSBzdG9wcGVkIGF3YWl0aW5nIG91ciBjb21tYW5kcywgYW5kCisgICAgIHRoZSBwcm9ncmFtIGlzIGFscmVhZHkgZG93bmxvYWRlZC4gIFdlIGp1c3Qgc2V0IGl0cyBQQyBhbmQgZ28uICAqLworCisgIGluZmVyaW9yX3BpZCA9IHBpZDsJCS8qIE5lZWRlZCBmb3Igd2FpdF9mb3JfaW5mZXJpb3IgYmVsb3cgKi8KKworICBjbGVhcl9wcm9jZWVkX3N0YXR1cyAoKTsKKworICAvKiBUZWxsIHdhaXRfZm9yX2luZmVyaW9yIHRoYXQgd2UndmUgc3RhcnRlZCBhIG5ldyBwcm9jZXNzLiAgKi8KKworICBpbml0X3dhaXRfZm9yX2luZmVyaW9yICgpOworCisgIC8qIFNldCB1cCB0aGUgInNhdmVkIHRlcm1pbmFsIG1vZGVzIiBvZiB0aGUgaW5mZXJpb3IKKyAgICAgYmFzZWQgb24gd2hhdCBtb2RlcyB3ZSBhcmUgc3RhcnRpbmcgaXQgd2l0aC4gICovCisKKyAgdGFyZ2V0X3Rlcm1pbmFsX2luaXQgKCk7CisKKyAgLyogSW5zdGFsbCBpbmZlcmlvcidzIHRlcm1pbmFsIG1vZGVzLiAgKi8KKworICB0YXJnZXRfdGVybWluYWxfaW5mZXJpb3IgKCk7CisKKyAgLyogcmVtb3RlX3N0YXJ0IChhcmdzKTsgKi8KKyAgLyogdHJhcF9leHBlY3RlZCA9IDA7ICovCisgIC8qIGluc2VydF9zdGVwX2JyZWFrcG9pbnQgKCk7ICBGSVhNRSwgZG8gd2UgbmVlZCB0aGlzPyAgKi8KKworICAvKiBMZXQgJ2VyIHJpcC4uLiAqLworICBwcm9jZWVkICgoQ09SRV9BRERSKSBlbnRyeV9wdCwgVEFSR0VUX1NJR05BTF9ERUZBVUxULCAwKTsKKworfQorCisKKy8qIFRoZSBwcm9jZXNzIGhhcyBkaWVkLCBjbGVhbiB1cC4gICovCisKK3N0YXRpYyB2b2lkCitlczE4MDBfbW91cm5faW5mZXJpb3IgKCkKK3sKKyAgcmVtb3ZlX2JyZWFrcG9pbnRzICgpOworICB1bnB1c2hfdGFyZ2V0ICgmZXMxODAwX2NoaWxkX29wcyk7CisgIGdlbmVyaWNfbW91cm5faW5mZXJpb3IgKCk7CS8qIERvIGFsbCB0aGUgcHJvcGVyIHRoaW5ncyBub3cgKi8KK30KKworLyogRVMxODAwLXByb3RvY29sIHNwZWNpZmljIHJvdXRpbmVzICovCisKKy8qIEtlZXAgZGlzY2FyZGluZyBpbnB1dCBmcm9tIHRoZSByZW1vdGUgc3lzdGVtLCB1bnRpbCBTVFJJTkcgaXMgZm91bmQuIAorICAgTGV0IHRoZSB1c2VyIGJyZWFrIG91dCBpbW1lZGlhdGVseS4gCisgICBzdHJpbmcgLSB0aGUgc3RyaW5nIHRvIGV4cGVjdAorICAgbm93YWl0IC0gYnJlYWsgb3V0IGlmIHN0cmluZyBub3QgdGhlIGVtdWxhdG9yJ3MgZmlyc3QgcmVzcG9uZCBvdGhlcndpc2UKKyAgICAgICAgICAgIHJlYWQgdW50aWwgc3RyaW5nIGlzIGZvdW5kICg9PSAwKSAgICovCisgCitzdGF0aWMgdm9pZAorZXhwZWN0IChzdHJpbmcsIG5vd2FpdCkKKyAgICAgY2hhciAqc3RyaW5nOworICAgIGludCBub3dhaXQ7Cit7CisgIGNoYXIgYzsKKyAgY2hhciAqcCA9IHN0cmluZzsKKworICBpbW1lZGlhdGVfcXVpdCsrOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBjID0gcmVhZGNoYXIgKCk7CisgICAgICBpZiAoaXNhbHBoYSAoYykpCisJeworCSAgYyA9IHRvdXBwZXIgKGMpOworCX0KKyAgICAgIGlmIChjID09IHRvdXBwZXIgKCpwKSkKKwl7CisJICBwKys7CisJICBpZiAoKnAgPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGltbWVkaWF0ZV9xdWl0LS07CisJICAgICAgcmV0dXJuOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoIW5vd2FpdCkKKwl7CisJICBwID0gc3RyaW5nOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwcmludGYgKCJcJyVzXCcgZXhwZWN0ZWRcbiIgLCBzdHJpbmcpOworCSAgcHJpbnRmICgiY2hhciAlZCBpcyAlZCIsIHAgLSBzdHJpbmcsIGMpOworCSAgZXJyb3IgKCJcbiIgKTsKKwl9CisgICAgfQorfQorCisvKiBLZWVwIGRpc2NhcmRpbmcgaW5wdXQgdW50aWwgd2Ugc2VlIHRoZSBwcm9tcHQuICAqLworCitzdGF0aWMgdm9pZAorZXhwZWN0X3Byb21wdCAoKQoreworICBleHBlY3QgKCI+IiwgMCk7Cit9CisKKworLyogUmVhZCBvbmUgY2hhcmFjdGVyICovCisKKyNpZmRlZiBERUJVR19TVERJTgorCisvKiByZWFkIGZyb20gc3RkaW4gKi8KKworc3RhdGljIGludAorcmVhZGNoYXIgKCkKK3sKKyAgY2hhciBidWZbMV07CisKKyAgYnVmWzBdID0gJ1wwJzsKKyAgcHJpbnRmICgicmVhZGNoYXIsIGdpdmUgb25lIGNoYXJhY3RlclxuIik7CisgIHJlYWQgKDAsIGJ1ZiwgMSk7CisKKyNpZiBkZWZpbmVkIChMT0dfRklMRSkKKyAgcHV0YyAoYnVmWzBdICYgMHg3ZiwgbG9nX2ZpbGUpOworI2VuZGlmCisKKyAgcmV0dXJuIChidWZbMF0gJiAweDdmKTsKK30KKworI2Vsc2UJLyogIURFQlVHX1NURElOICovCisKKy8qIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgcmVtb3RlIHN5c3RlbSwgZG9pbmcgYWxsIHRoZSBmYW5jeQorICAgdGltZW91dCBzdHVmZi4gICovCisKK3N0YXRpYyBpbnQKK3JlYWRjaGFyICgpCit7CisgIGludCBjaDsKKworICBjaCA9IFNFUklBTF9SRUFEQ0hBUiAoZXMxODAwX2Rlc2MsIHRpbWVvdXQpOworCisgIC8qIEZJWE1FOiBkb2luZyBhbiBlcnJvcigpIGhlcmUgd2lsbCBwcm9iYWJseSBjYXVzZSB0cm91YmxlLCBhdCBsZWFzdCBpZiBmcm9tCisgICAgIGVzMTgwMF93YWl0LiAgKi8KKyAgaWYgKGNoID09IFNFUklBTF9USU1FT1VUKQorICAgIGVycm9yICgiVGltZW91dCByZWFkaW5nIGZyb20gcmVtb3RlIHN5c3RlbS4iKTsKKyAgZWxzZSBpZiAoY2ggPT0gU0VSSUFMX0VSUk9SKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJyZW1vdGUgcmVhZCIpOworCisjaWYgZGVmaW5lZCAoTE9HX0ZJTEUpCisgIHB1dGMgKGNoICYgMHg3ZiwgbG9nX2ZpbGUpOworICBmZmx1c2ggKGxvZ19maWxlKTsKKyNlbmRpZgorCisgIHJldHVybiAoY2gpOworfQorCisjZW5kaWYJLyogREVCVUdfU1RESU4gKi8KKworCisvKiBTZW5kIGEgY29tbWFuZCB0byB0aGUgZW11bGF0b3IgYW5kIHNhdmUgdGhlIHJlcGx5LgorICAgUmVwb3J0IGFuIGVycm9yIGlmIHdlIGdldCBhbiBlcnJvciByZXBseS4KKyAgIHN0cmluZyAtIHRoZSBlczE4MDAgY29tbWFuZAorICAgYnVmICAgIC0gY29udGFpbmluZyB0aGUgZW11bGF0b3IgcmVwbHkgb24gcmV0dXJuCisgICBsZW4gICAgLSBzaXplIG9mIGJ1ZiAgKi8KKworc3RhdGljIHZvaWQKK3NlbmRfd2l0aF9yZXBseSAoc3RyaW5nLCBidWYsIGxlbikKKyAgICBjaGFyICpzdHJpbmcsICpidWY7CisgICAgaW50IGxlbjsKK3sKKyAgc2VuZCAoc3RyaW5nKTsKKyAgU0VSSUFMX1dSSVRFIChlczE4MDBfZGVzYywgIlxyIiwgMSk7CisKKyNpZm5kZWYgREVCVUdfU1RESU4KKyAgZXhwZWN0IChzdHJpbmcsIDEpOworICBleHBlY3QgKCJcclxuIiwgMCk7CisjZW5kaWYKKworICBnZXRtZXNzYWdlIChidWYsIGxlbik7Cit9CisKKworLyogU2VuZCB0aGUgY29tbWFuZCBpbiBTVFIgdG8gdGhlIGVtdWxhdG9yIGFkZGluZyBcci4gY2hlY2sKKyAgIHRoZSBlY2hvIGZvciBjb25zaXN0ZW5jeS4gCisgICBzdHJpbmcgLSB0aGUgZXMxODAwIGNvbW1hbmQgICovCisgCitzdGF0aWMgdm9pZAorc2VuZF9jb21tYW5kIChzdHJpbmcpCisgICAgIGNoYXIgKnN0cmluZzsKK3sKKyAgc2VuZCAoc3RyaW5nKTsKKyAgU0VSSUFMX1dSSVRFIChlczE4MDBfZGVzYywgIlxyIiwgMSk7CisKKyNpZm5kZWYgREVCVUdfU1RESU4KKyAgZXhwZWN0IChzdHJpbmcsIDApOworICBleHBlY3RfcHJvbXB0ICgpOworI2VuZGlmCisKK30KKworLyogU2VuZCBhIHN0cmluZworICAgc3RyaW5nIC0gdGhlIGVzMTgwMCBjb21tYW5kICAqLworCitzdGF0aWMgdm9pZAorc2VuZCAoc3RyaW5nKQorICAgICBjaGFyICpzdHJpbmc7Cit7CisgIGlmIChraW9kZWJ1ZykgCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiU2VuZGluZzogJXNcbiIsIHN0cmluZyk7CisgICAgfQorICBTRVJJQUxfV1JJVEUgKGVzMTgwMF9kZXNjLCBzdHJpbmcsIHN0cmxlbiAoc3RyaW5nKSk7Cit9CisKKworLyogUmVhZCBhIG1lc3NhZ2UgZnJvbSB0aGUgZW11bGF0b3IgYW5kIHN0b3JlIGl0IGluIEJVRi4gCisgICBidWYgICAgLSBjb250YWluaW5nIHRoZSBlbXVsYXRvciByZXBseSBvbiByZXR1cm4KKyAgIGxlbiAgICAtIHNpemUgb2YgYnVmICAqLworIAorc3RhdGljIHZvaWQKK2dldG1lc3NhZ2UgKGJ1ZiwgbGVuKQorICAgICBjaGFyICpidWY7CisgICAgIGludCBsZW47Cit7CisgIGNoYXIgKmJwOworICBpbnQgYzsKKyAgaW50IHByb21wdF9mb3VuZCA9IDA7CisgIGV4dGVybiBraW9kZWJ1ZzsKKworI2lmIGRlZmluZWQgKExPR19GSUxFKQorICAvKiBUaGlzIGlzIGEgY29udmVuaWVudCBwbGFjZSB0byBkbyB0aGlzLiAgVGhlIGlkZWEgaXMgdG8gZG8gaXQgb2Z0ZW4KKyAgICAgZW5vdWdoIHRoYXQgd2UgbmV2ZXIgbG9zZSBtdWNoIGRhdGEgaWYgd2UgdGVybWluYXRlIGFibm9ybWFsbHkuICAqLworICBmZmx1c2ggKGxvZ19maWxlKTsKKyNlbmRpZgorCisgIGJwID0gYnVmOworICBjID0gcmVhZGNoYXIgKCk7CisgIGRvCisgICAgeworICAgICAgaWYgKGMpIAorCXsKKwkgIGlmIChsZW4tLSA8IDIpIC8qIGNoYXIgYW5kIHRlcm1pbmFsaW5nIE5VTEwgKi8KKwkgICAgeworCSAgICAgIGVycm9yICgiaW5wdXQgYnVmZmVyIG92ZXJydW5cbiIpOworCSAgICB9CisJICAqYnArKyA9IGM7CisJfQorICAgICAgYyA9IHJlYWRjaGFyICgpOworICAgICAgaWYgKChjID09ICc+JykgJiYgKCooYnAgLSAxKSA9PSAnICcpKQorCXsKKwkgIHByb21wdF9mb3VuZCA9IDE7CisJfQorICAgIH0KKyAgd2hpbGUgKCFwcm9tcHRfZm91bmQpOworICAqYnAgPSAwOworICAKKyAgaWYgKGtpb2RlYnVnKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwibWVzc2FnZSByZWNlaXZlZCA6JXNcbiIsIGJ1Zik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZG93bmxvYWQgKGluc3RyZWFtLCBmcm9tX3R0eSwgZm9ybWF0KQorRklMRSAqaW5zdHJlYW07CisgICAgIGludCBmcm9tX3R0eTsKKyAgICAgaW50IGZvcm1hdDsKK3sKKyAgY2hhciBjOworICBjaGFyIGJ1ZlsxNjBdOworICBpbnQgaSA9IDA7CisKKyAgc2VuZF9jb21tYW5kICgiU0VUICMyLCQxQSIpOyAgICAgICAgICAgICAgICAgIC8qIHJlc2V0IGNoYXIgPSBeWiAqLworICBzZW5kX2NvbW1hbmQgKCJTRVQgIzMsJDExLCQxMyIpOyAgICAgICAgICAgICAgLyogWE9OICBYT0ZGICovCisgIGlmIChmb3JtYXQgPT0gMikKKyAgICB7CisgICAgICBzZW5kX2NvbW1hbmQgKCJTRVQgIzI2LCMyIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2VuZF9jb21tYW5kICgiU0VUICMyNiwjNSIpOwkJLyogRm9ybWF0PUV4dGVuZGVkIFRla2hleCAqLworICAgIH0KKyAgc2VuZF9jb21tYW5kICgiREZCID0gJDEwIik7CisgIHNlbmRfY29tbWFuZCAoIlBVUiIpOworICBzZW5kX2NvbW1hbmQgKCJDRVMiKTsKKyAgc2VuZCAoIkROTFxyIik7CisgIGV4cGVjdCAoIkROTCIsIDEpOworICBpZiAoZnJvbV90dHkpCisgICAgeworICAgICAgcHJpbnRmICgiICAgIDAgcmVjb3JkcyBsb2FkZWQuLi5cciIpOworICAgIH0KKyAgd2hpbGUgKGZnZXRzIChidWYsIDE2MCwgaW5zdHJlYW0pKQorICAgICAgeworCXNlbmQgKGJ1Zik7CisJaWYgKGZyb21fdHR5KQorCSAgeworCSAgICBwcmludGYgKCIlNWRcYlxiXGJcYlxiIiwrK2kpOworCSAgICBmZmx1c2ggKHN0ZG91dCk7CisJICB9CisJaWYgKChjID0gcmVhZGNoYXIgKCkpICE9IDAwNikgCisJICB7CisJICAgIGVycm9yICgiZXhwZWN0ZWQgQUNLIik7CisJICB9CisgICAgICB9CisgIGlmIChmcm9tX3R0eSkKKyAgICB7CisgICAgICBwcmludGYgKCItIEFsbCIpOworICAgIH0KK30KKworLyogQWRkaXRpb25hbCBjb21tYW5kcyAqLworCisjaWYgZGVmaW5lZCAoVElPQ0dFVFApICYmIGRlZmluZWQgKEZOREVMQVkpICYmIGRlZmluZWQgKEVXT1VMREJMT0NLKQorI2RlZmluZSBQUk9WSURFX1RSQU5TUEFSRU5UCisjZW5kaWYKKworI2lmZGVmIFBST1ZJREVfVFJBTlNQQVJFTlQKKy8qIFRhbGsgZGlyZWN0bHkgdG8gdGhlIGVtdWxhdG9yCisgICBGSVhNRSwgdXNlcyBidXN5IHdhaXQsIGFuZCBpcyBTVU5PUyAob3IgYXQgbGVhc3QgQlNEKSBzcGVjaWZpYyAgKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgdm9pZCAKK2VzMTgwMF90cmFuc3BhcmVudCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IGNvbnNvbGU7CisgIHN0cnVjdCBzZ3R0eWIgbW9kZWJsOworICBpbnQgZmNmbGFnOworICBpbnQgY2M7CisgIHN0cnVjdCBzZ3R0eWIgY29uc29sZV9tb2RlX3NhdmU7CisgIGludCBjb25zb2xlX2ZjX3NhdmU7CisgIGludCBlczE4MDBfZmNfc2F2ZTsKKyAgaW50IGlucHV0Y250ID0gODA7CisgIGNoYXIgaW5wdXRidWZbODBdOworICBpbnQgY29uc29sZWNudCA9IDA7CisgIGNoYXIgY29uc29sZWJ1Zls4MF07CisgIGludCBlczE4MDBfY250ID0gMDsKKyAgY2hhciBlczE4MDBfYnVmWzgwXTsKKyAgaW50IGk7CisKKyAgZG9udF9yZXBlYXQgKCk7CisgIGlmIChlczE4MDBfZGVzYyA9PSBOVUxMKSAKKyAgICB7CisgICAgICBwcmludGYgKCJObyBlbXVsYXRvciBhdHRhY2hlZCwgdHlwZSBlbXVsYXRvci1jb21tYW5kIGZpcnN0XG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgcHJpbnRmICgiXG4iKTsKKyAgcHJpbnRmICgiWW91IGFyZSBub3cgY29tbXVuaWNhdGluZyBkaXJlY3RseSB3aXRoIHRoZSBFUyAxODAwIGVtdWxhdG9yLlxuIik7CisgIHByaW50ZiAoIlRvIGxlYXZlIHRoaXMgbW9kZSAodHJhbnNwYXJlbnQgbW9kZSksIHByZXNzIF5FLlxuIik7CisgIHByaW50ZiAoIlxuIik7CisgIHByaW50ZiAoIiA+Iik7CisgIGZmbHVzaCAoc3Rkb3V0KTsKKworICBpZiAoKGNvbnNvbGUgPSBvcGVuICgiL2Rldi90dHkiLCBPX1JEV1IpKSA9PSAtMSkgCisgICAgeworICAgICAgcGVycm9yX3dpdGhfbmFtZSAoIi9kZXYvdHR5OiIpOworICAgIH0KKworICBpZiAoKGZjZmxhZyA9IGZjbnRsIChjb25zb2xlLCBGX0dFVEZMLCAwKSkgPT0gLTEpCisgICAgeworICAgICAgcGVycm9yX3dpdGhfbmFtZSAoImZjbnRsIGNvbnNvbGUiKTsKKyAgICB9CisKKyAgY29uc29sZV9mY19zYXZlID0gZmNmbGFnOworICBmY2ZsYWcgPSBmY2ZsYWcgfCBGTkRFTEFZOworCisgIGlmIChmY250bCAoY29uc29sZSwgRl9TRVRGTCwgZmNmbGFnKSA9PSAtMSkKKyAgICB7CisgICAgICBwZXJyb3Jfd2l0aF9uYW1lICgiZmNudGwgY29uc29sZSIpOworICAgIH0KKworICBpZiAoaW9jdGwgKGNvbnNvbGUsIFRJT0NHRVRQLCAmbW9kZWJsKSkKKyAgICB7CisgICAgICBwZXJyb3Jfd2l0aF9uYW1lICgiaW9jdGwgY29uc29sZSIpOworICAgIH0KKworICBjb25zb2xlX21vZGVfc2F2ZSA9IG1vZGVibDsKKyAgbW9kZWJsLnNnX2ZsYWdzID0gUkFXOyAKKworICBpZiAoaW9jdGwgKGNvbnNvbGUsIFRJT0NTRVRQLCAmbW9kZWJsKSkKKyAgICB7CisgICAgICBwZXJyb3Jfd2l0aF9uYW1lICgiaW9jdGwgY29uc29sZSIpOworICAgIH0KKworICBpZiAoKGZjZmxhZyA9IGZjbnRsIChlczE4MDBfZGVzYy0+ZmQsIEZfR0VURkwsIDApKSA9PSAtMSkKKyAgICB7CisgICAgICBwZXJyb3Jfd2l0aF9uYW1lICgiZmNudGwgc2VyaWFsIik7CisgICAgfQorCisgIGVzMTgwMF9mY19zYXZlID0gZmNmbGFnOworICBmY2ZsYWcgPSBmY2ZsYWcgfCBGTkRFTEFZOworCisgIGlmIChmY250bCAoZXMxODAwX2Rlc2MtPmZkLCBGX1NFVEZMLCBmY2ZsYWcpID09IC0xKQorICAgIHsKKyAgICAgIHBlcnJvcl93aXRoX25hbWUgKCJmY250bCBzZXJpYWwiKTsKKyAgICB9CisKKyAgd2hpbGUgKDEpCisgICAgeyAKKyAgICAgIGNjID0gcmVhZCAoY29uc29sZSwgaW5wdXRidWYsIGlucHV0Y250KTsKKyAgICAgIGlmIChjYyAhPSAtMSkKKwl7CisJICBpZiAoKCppbnB1dGJ1ZiAmIDB4N2YpID09IDB4MDUpCisJICAgIHsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgZm9yIChpID0gMDsgaSA8IGNjOyApCisJICAgIHsKKwkgICAgICBlczE4MDBfYnVmW2VzMTgwMF9jbnQrK10gPSBpbnB1dGJ1ZltpKytdOworCSAgICB9CisJICBpZiAoKGNjID0gU0VSSUFMX1dSSVRFIChlczE4MDBfZGVzYywgZXMxODAwX2J1ZiwgZXMxODAwX2NudCkpID09IC0xKQorCSAgICB7CisJICAgICAgcGVycm9yX3dpdGhfbmFtZSAoIkZFTCEgd3JpdGU6Iik7CisJICAgIH0KKwkgIGVzMTgwMF9jbnQgLT0gY2M7CisJICBpZiAoZXMxODAwX2NudCAmJiBjYykgCisJICAgIHsKKwkgICAgICBmb3IgKGkgPSAwOyBpIDwgZXMxODAwX2NudDsgaSsrKQorCQl7CisJCSAgZXMxODAwX2J1ZltpXSA9IGVzMTgwMF9idWZbY2MraV07CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKGVycm5vICE9IEVXT1VMREJMT0NLKQorCXsKKwkgIHBlcnJvcl93aXRoX25hbWUgKCJGRUwhIHJlYWQ6Iik7CisJfQorICAgICAgCisgICAgICBjYyA9IHJlYWQgKGVzMTgwMF9kZXNjLT5mZCxpbnB1dGJ1ZixpbnB1dGNudCk7CisgICAgICBpZiAoY2MgIT0gLTEpCisJeworCSAgZm9yIChpID0gMDsgaSA8IGNjOyApCisJICAgIHsKKwkgICAgICBjb25zb2xlYnVmW2NvbnNvbGVjbnQrK10gPSBpbnB1dGJ1ZltpKytdOworCSAgICB9CisJICBpZiAoKGNjID0gd3JpdGUgKGNvbnNvbGUsY29uc29sZWJ1Zixjb25zb2xlY250KSkgPT0gLTEpCisJICAgIHsKKwkgICAgICBwZXJyb3Jfd2l0aF9uYW1lICgiRkVMISB3cml0ZToiKTsKKwkgICAgfQorCSAgY29uc29sZWNudCAtPSBjYzsKKwkgIGlmIChjb25zb2xlY250ICYmIGNjKSAKKwkgICAgeworCSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25zb2xlY250OyBpKyspCisJCXsKKwkJICBjb25zb2xlYnVmW2ldID0gY29uc29sZWJ1ZltjYytpXTsKKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoZXJybm8gIT0gRVdPVUxEQkxPQ0spCisJeworCSAgcGVycm9yX3dpdGhfbmFtZSAoIkZFTCEgcmVhZDoiKTsKKwl9CisgICAgfQorCisgIGNvbnNvbGVfZmNfc2F2ZSA9IGNvbnNvbGVfZmNfc2F2ZSAmICFGTkRFTEFZOworICBpZiAoZmNudGwgKGNvbnNvbGUsIEZfU0VURkwsIGNvbnNvbGVfZmNfc2F2ZSkgPT0gLTEpCisgICAgeworICAgICAgcGVycm9yX3dpdGhfbmFtZSAoIkZFTCEgZmNudGwiKTsKKyAgICB9CisKKyAgaWYgKGlvY3RsIChjb25zb2xlLCBUSU9DU0VUUCwgJmNvbnNvbGVfbW9kZV9zYXZlKSkKKyAgICB7CisgICAgICBwZXJyb3Jfd2l0aF9uYW1lICgiRkVMISBpb2N0bCIpOworICAgIH0KKworICBjbG9zZSAoY29uc29sZSk7CisKKyAgaWYgKGZjbnRsIChlczE4MDBfZGVzYy0+ZmQsIEZfU0VURkwsIGVzMTgwMF9mY19zYXZlKSA9PSAtMSkKKyAgICB7CisgICAgICBwZXJyb3Jfd2l0aF9uYW1lICgiRkVMISBmY250bCIpOworICAgIH0KKworICBwcmludGYgKCJcbiIpOworCit9CisjZW5kaWYgLyogUFJPVklERV9UUkFOU1BBUkVOVCAqLworCitzdGF0aWMgdm9pZAorZXMxODAwX2luaXRfYnJlYWsgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIENPUkVfQUREUiBtZW1hZGRyZXNzID0gMDsKKyAgY2hhciBidWZbUEJVRlNJWl07CisgIGNoYXIgYmFzZV9hZGRyWzRdOworICBjaGFyICpzcGFjZV9pbmRleDsKKyAgY2hhciAqcDsKKyAgaW50IGs7CisKKyAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICB7CisgICAgICBlcnJvcl9ub19hcmcgKCJhIHRyYXAgdmVjdG9yIik7CisgICAgfQorCisgIGlmICghKHNwYWNlX2luZGV4ID0gc3RyY2hyIChhcmdzLCAnICcpKSkKKyAgICB7CisgICAgICBlcnJvciAoIlR3byBhcmd1bWVudHMgbmVlZGVkICh0cmFwIHZlY3RvciBhbmQgYWRkcmVzcyBvZiBicmVhayByb3V0aW5lKS5cbiIpOworICAgIH0KKworICAqc3BhY2VfaW5kZXggPSAnXDAnOworCisgIGVzMTgwMF9icmVha192ZWMgPSBzdHJ0b2wgKGFyZ3MsIChjaGFyICoqKSBOVUxMLCAwKTsKKyAgZXMxODAwX2JyZWFrX2FkZHJlc3MgPSBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIChzcGFjZV9pbmRleCArIDEpOworCisgIGVzMTgwMF9jcmVhdGVfYnJlYWtfaW5zbiAoZXMxODAwX2JyZWFrX2luc24sIGVzMTgwMF9icmVha192ZWMpOworCisgIGlmIChtNjgwMjApCisgICAgeworICAgICAgc2VuZF93aXRoX3JlcGx5ICgiVkJSICIsIGJ1Ziwgc2l6ZW9mIChidWYpKTsKKyAgICAgIHAgPSBidWY7CisgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKQorCXsKKwkgIGlmICgocFtrKjIgKyAxXSA9PSAwKSB8fCAocFtrKjIgKyAyXSA9PSAwKSkKKwkgICAgeworCSAgICAgIGVycm9yICgiRW11bGF0b3IgcmVwbHkgaXMgdG9vIHNob3J0OiAlcyIsIGJ1Zik7CisJICAgIH0KKwkgIGJhc2VfYWRkcltrXSA9IChmcm9taGV4IChwW2sqMiArIDFdKSAqIDE2KSArIGZyb21oZXggKHBbayoyICsgMl0pOworCX0KKyAgICAgIC8qIGJhc2UgYWRkciBvZiBleGNlcHRpb24gdmVjdG9yIHRhYmxlICovCisgICAgICBtZW1hZGRyZXNzID0gICooKENPUkVfQUREUiAqKSBiYXNlX2FkZHIpOworICAgIH0KKworICBtZW1hZGRyZXNzICs9IChlczE4MDBfYnJlYWtfdmVjICsgMzIpICogNDsgICAgIC8qIGFkZHJlc3Mgb2YgdHJhcCB2ZWN0b3IgKi8KKworICBzcHJpbnRmIChidWYsICJALkwlbHg9JCVseCIsIG1lbWFkZHJlc3MsIGVzMTgwMF9icmVha19hZGRyZXNzKTsKKyAgc2VuZF9jb21tYW5kIChidWYpOyAgIC8qIHNldCB0aGUgYWRkcmVzcyBvZiB0aGUgYnJlYWsgcm91dGluZSBpbiB0aGUgKi8KKyAgCQkgICAgICAgLyogdHJhcCB2ZWN0b3IgKi8KKyAgCisgIHNwcmludGYgKGJ1ZiwgIkAuTCVseD0kNEU3MTRFNzEiLCBlczE4MDBfYnJlYWtfYWRkcmVzcyk7ICAgICAgLyogTk9QOyBOT1AgKi8KKyAgc2VuZF9jb21tYW5kIChidWYpOworICBzcHJpbnRmIChidWYsICJALkwlbHg9JDRFNzE0RTczIiwgZXMxODAwX2JyZWFrX2FkZHJlc3MgKyA0KTsgIC8qIE5PUDsgUlRFICovCisgIHNlbmRfY29tbWFuZCAoYnVmKTsKKyAgCisgIHNwcmludGYgKGJ1ZiwgIkFDMj0kJWx4IiwgZXMxODAwX2JyZWFrX2FkZHJlc3MgKyA0KTsKKyAgLyogYnJlYWtwb2ludCBhdCBlczE4MDAtYnJlYWtfYWRkcmVzcyAqLworICBzZW5kX2NvbW1hbmQgKGJ1Zik7CisgIHNlbmRfY29tbWFuZCAoIldIRU4gQUMyIFRIRU4gQlJLIik7ICAgICAgICAgIC8qIGllIGluIGV4Y2VwdGlvbiByb3V0aW5lICovCisKKyAgaWYgKGZyb21fdHR5KQorICAgIHsKKyAgICAgIHByaW50ZiAoIkJyZWFrcG9pbnQgKHRyYXAgJCV4KSByb3V0aW5lIGF0IGFkZHJlc3M6ICVseFxuIiwKKwkgICAgICBlczE4MDBfYnJlYWtfdmVjLCBlczE4MDBfYnJlYWtfYWRkcmVzcyk7CisgICAgfQorfQkgIAorCitzdGF0aWMgdm9pZAorZXMxODAwX2NoaWxkX29wZW4gKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBlcnJvciAoIlVzZSB0aGUgXCJydW5cIiBjb21tYW5kIHRvIHN0YXJ0IGEgY2hpbGQgcHJvY2Vzcy4iKTsKK30KKworc3RhdGljIHZvaWQKK2VzMTgwMF9jaGlsZF9kZXRhY2ggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGlmIChhcmdzKQorICAgIHsKKyAgICAgIGVycm9yICgiQXJndW1lbnQgZ2l2ZW4gdG8gXCJkZXRhY2hcIiB3aGVuIHJlbW90ZWx5IGRlYnVnZ2luZy4iKTsKKyAgICB9CisgIAorICBwb3BfdGFyZ2V0ICgpOworICBpZiAoZnJvbV90dHkpCisgICAgeworICAgICAgcHJpbnRmICgiRW5kaW5nIGRlYnVnZ2luZyB0aGUgcHJvY2VzcyAlZC5cbiIsIGluZmVyaW9yX3BpZCk7CisgICAgfQorfQorCisKKy8qIERlZmluZSB0aGUgdGFyZ2V0IHN1YnJvdXRpbmUgbmFtZXMgICovCisKK3N0cnVjdCB0YXJnZXRfb3BzIGVzMTgwMF9vcHMgOworCitzdGF0aWMgdm9pZCAKK2luaXRfZXMxODAwX29wcyh2b2lkKQoreworICBlczE4MDBfb3BzLnRvX3Nob3J0bmFtZSA9ICAgImVzMTgwMCI7CQkKKyAgZXMxODAwX29wcy50b19sb25nbmFtZSA9ICAgIlJlbW90ZSBzZXJpYWwgdGFyZ2V0IGluIEVTMTgwMC1lbXVsYXRvciBwcm90b2NvbCI7CisgIGVzMTgwMF9vcHMudG9fZG9jID0gICAiUmVtb3RlIGRlYnVnZ2luZyBvbiB0aGUgZXMxODAwIGVtdWxhdG9yIHZpYSBhIHNlcmlhbCBsaW5lLlxuXAorU3BlY2lmeSB0aGUgc2VyaWFsIGRldmljZSBpdCBpcyBjb25uZWN0ZWQgdG8gKGUuZy4gL2Rldi90dHlhKS4iIDsKKyAgZXMxODAwX29wcy50b19vcGVuID0gICBlczE4MDBfb3BlbjsJCQorICBlczE4MDBfb3BzLnRvX2Nsb3NlID0gICBlczE4MDBfY2xvc2U7CQkKKyAgZXMxODAwX29wcy50b19hdHRhY2ggPSAgIGVzMTgwMF9hdHRhY2g7CisgIGVzMTgwMF9vcHMudG9fcG9zdF9hdHRhY2ggPSBOVUxMOwkKKyAgZXMxODAwX29wcy50b19yZXF1aXJlX2F0dGFjaCA9IE5VTEw7CisgIGVzMTgwMF9vcHMudG9fZGV0YWNoID0gICBlczE4MDBfZGV0YWNoOwkKKyAgZXMxODAwX29wcy50b19yZXF1aXJlX2RldGFjaCA9IE5VTEw7CisgIGVzMTgwMF9vcHMudG9fcmVzdW1lID0gICBlczE4MDBfcmVzdW1lOwkKKyAgZXMxODAwX29wcy50b193YWl0ICA9ICAgTlVMTDsKKyAgZXMxODAwX29wcy50b19wb3N0X3dhaXQgPSBOVUxMOwkKKyAgZXMxODAwX29wcy50b19mZXRjaF9yZWdpc3RlcnMgID0gICBOVUxMOwkKKyAgZXMxODAwX29wcy50b19zdG9yZV9yZWdpc3RlcnMgID0gICBOVUxMOwkKKyAgZXMxODAwX29wcy50b19wcmVwYXJlX3RvX3N0b3JlID0gICBlczE4MDBfcHJlcGFyZV90b19zdG9yZTsKKyAgZXMxODAwX29wcy50b194ZmVyX21lbW9yeSAgPSAgIGVzMTgwMF94ZmVyX2luZmVyaW9yX21lbW9yeTsKKyAgZXMxODAwX29wcy50b19maWxlc19pbmZvICA9ICAgZXMxODAwX2ZpbGVzX2luZm87CQkKKyAgZXMxODAwX29wcy50b19pbnNlcnRfYnJlYWtwb2ludCA9ICAgZXMxODAwX2luc2VydF9icmVha3BvaW50OwkKKyAgZXMxODAwX29wcy50b19yZW1vdmVfYnJlYWtwb2ludCA9ICAgZXMxODAwX3JlbW92ZV9icmVha3BvaW50OwkKKyAgZXMxODAwX29wcy50b190ZXJtaW5hbF9pbml0ICA9ICAgTlVMTDsJCQkKKyAgZXMxODAwX29wcy50b190ZXJtaW5hbF9pbmZlcmlvciA9ICAgTlVMTDsJCQkKKyAgZXMxODAwX29wcy50b190ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgPSAgIE5VTEw7CQkKKyAgZXMxODAwX29wcy50b190ZXJtaW5hbF9vdXJzICA9ICAgTlVMTDsJCQkKKyAgZXMxODAwX29wcy50b190ZXJtaW5hbF9pbmZvICA9ICAgTlVMTDsJCQkKKyAgZXMxODAwX29wcy50b19raWxsICA9ICAgTlVMTDsJCQkKKyAgZXMxODAwX29wcy50b19sb2FkICA9ICAgZXMxODAwX2xvYWQ7CQkKKyAgZXMxODAwX29wcy50b19sb29rdXBfc3ltYm9sID0gICBOVUxMOwkJCisgIGVzMTgwMF9vcHMudG9fY3JlYXRlX2luZmVyaW9yID0gICBlczE4MDBfY3JlYXRlX2luZmVyaW9yOworICBlczE4MDBfb3BzLnRvX3Bvc3Rfc3RhcnR1cF9pbmZlcmlvciA9IE5VTEw7CisgIGVzMTgwMF9vcHMudG9fYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvciA9IE5VTEw7CisgIGVzMTgwMF9vcHMudG9fY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciA9IE5VTEw7ICAKKyAgZXMxODAwX29wcy50b19wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSA9IE5VTEw7CisgIGVzMTgwMF9vcHMudG9faW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGVzMTgwMF9vcHMudG9fcmVtb3ZlX2ZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGVzMTgwMF9vcHMudG9faW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBlczE4MDBfb3BzLnRvX3JlbW92ZV92Zm9ya19jYXRjaHBvaW50ID0gTlVMTDsgICAgICAgICAgICAgIAorICBlczE4MDBfb3BzLnRvX2hhc19mb3JrZWQgPSBOVUxMOworICBlczE4MDBfb3BzLnRvX2hhc192Zm9ya2VkID0gTlVMTDsgICAgICAgICAgICAKKyAgZXMxODAwX29wcy50b19jYW5fZm9sbG93X3Zmb3JrX3ByaW9yX3RvX2V4ZWMgPSBOVUxMOyAgICAKKyAgZXMxODAwX29wcy50b19wb3N0X2ZvbGxvd192Zm9yayA9IE5VTEw7CisgIGVzMTgwMF9vcHMudG9faW5zZXJ0X2V4ZWNfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGVzMTgwMF9vcHMudG9fcmVtb3ZlX2V4ZWNfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGVzMTgwMF9vcHMudG9faGFzX2V4ZWNkID0gTlVMTDsKKyAgZXMxODAwX29wcy50b19yZXBvcnRlZF9leGVjX2V2ZW50c19wZXJfZXhlY19jYWxsID0gTlVMTDsKKyAgZXMxODAwX29wcy50b19oYXNfZXhpdGVkID0gTlVMTDsKKyAgZXMxODAwX29wcy50b19tb3Vybl9pbmZlcmlvciA9ICAgTlVMTDsJCQkKKyAgZXMxODAwX29wcy50b19jYW5fcnVuICA9ICAgMDsJCQkKKyAgZXMxODAwX29wcy50b19ub3RpY2Vfc2lnbmFscyA9ICAgMDsJCQorICBlczE4MDBfb3BzLnRvX3RocmVhZF9hbGl2ZSAgPSAgIDA7CQkKKyAgZXMxODAwX29wcy50b19zdG9wICA9ICAgMDsKKyAgZXMxODAwX29wcy50b19waWRfdG9fZXhlY19maWxlID0gTlVMTDsKKyAgZXMxODAwX29wcy50b19jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUgPSBOVUxMOwkKKyAgZXMxODAwX29wcy50b19zdHJhdHVtID0gICBjb3JlX3N0cmF0dW07CQorICBlczE4MDBfb3BzLkRPTlRfVVNFID0gICAwOwkJCQorICBlczE4MDBfb3BzLnRvX2hhc19hbGxfbWVtb3J5ID0gICAwOwkJCisgIGVzMTgwMF9vcHMudG9faGFzX21lbW9yeSA9ICAgMTsJCQorICBlczE4MDBfb3BzLnRvX2hhc19zdGFjayA9ICAgMDsJCQorICBlczE4MDBfb3BzLnRvX2hhc19yZWdpc3RlcnMgPSAgIDA7CQkKKyAgZXMxODAwX29wcy50b19oYXNfZXhlY3V0aW9uID0gICAwOwkJCisgIGVzMTgwMF9vcHMudG9fc2VjdGlvbnMgPSAgIE5VTEw7CQkKKyAgZXMxODAwX29wcy50b19zZWN0aW9uc19lbmQgPSAgIE5VTEw7CQkKKyAgZXMxODAwX29wcy50b19tYWdpYyA9ICAgT1BTX01BR0lDIDsJCQorfQorCisvKiBEZWZpbmUgdGhlIHRhcmdldCBzdWJyb3V0aW5lIG5hbWVzICAqLworCitzdHJ1Y3QgdGFyZ2V0X29wcyBlczE4MDBfY2hpbGRfb3BzIDsKKworc3RhdGljIHZvaWQgCitpbml0X2VzMTgwMF9jaGlsZF9vcHModm9pZCkKK3sKKyAgZXMxODAwX2NoaWxkX29wcy50b19zaG9ydG5hbWUgPSAgICJlczE4MDBfcHJvY2VzcyI7CQorICBlczE4MDBfY2hpbGRfb3BzLnRvX2xvbmduYW1lID0gICAiUmVtb3RlIHNlcmlhbCB0YXJnZXQgaW4gRVMxODAwLWVtdWxhdG9yIHByb3RvY29sIjsKKyAgZXMxODAwX2NoaWxkX29wcy50b19kb2MgPSAgICJSZW1vdGUgZGVidWdnaW5nIG9uIHRoZSBlczE4MDAgZW11bGF0b3IgdmlhIGEgc2VyaWFsIGxpbmUuXG5cCitTcGVjaWZ5IHRoZSBzZXJpYWwgZGV2aWNlIGl0IGlzIGNvbm5lY3RlZCB0byAoZS5nLiAvZGV2L3R0eWEpLiI7CisgIGVzMTgwMF9jaGlsZF9vcHMudG9fb3BlbiA9ICAgZXMxODAwX2NoaWxkX29wZW47CQorICBlczE4MDBfY2hpbGRfb3BzLnRvX2Nsb3NlID0gICBOVUxMOwkJCQorICBlczE4MDBfY2hpbGRfb3BzLnRvX2F0dGFjaCA9ICAgZXMxODAwX2F0dGFjaDsKKyAgZXMxODAwX2NoaWxkX29wcy50b19wb3N0X2F0dGFjaCA9IE5VTEw7CisgIGVzMTgwMF9jaGlsZF9vcHMudG9fcmVxdWlyZV9hdHRhY2ggPSBOVUxMOwkKKyAgZXMxODAwX2NoaWxkX29wcy50b19kZXRhY2ggPSAgIGVzMTgwMF9jaGlsZF9kZXRhY2g7CisgIGVzMTgwMF9jaGlsZF9vcHMudG9fcmVxdWlyZV9kZXRhY2ggPSBOVUxMOwkKKyAgZXMxODAwX2NoaWxkX29wcy50b19yZXN1bWUgPSAgIGVzMTgwMF9yZXN1bWU7CQorICBlczE4MDBfY2hpbGRfb3BzLnRvX3dhaXQgID0gICBlczE4MDBfd2FpdDsKKyAgZXMxODAwX2NoaWxkX29wcy50b19wb3N0X3dhaXQgPSBOVUxMOwkKKyAgZXMxODAwX2NoaWxkX29wcy50b19mZXRjaF9yZWdpc3RlcnMgID0gICBlczE4MDBfZmV0Y2hfcmVnaXN0ZXI7CisgIGVzMTgwMF9jaGlsZF9vcHMudG9fc3RvcmVfcmVnaXN0ZXJzICA9ICAgZXMxODAwX3N0b3JlX3JlZ2lzdGVyOworICBlczE4MDBfY2hpbGRfb3BzLnRvX3ByZXBhcmVfdG9fc3RvcmUgPSAgIGVzMTgwMF9wcmVwYXJlX3RvX3N0b3JlOworICBlczE4MDBfY2hpbGRfb3BzLnRvX3hmZXJfbWVtb3J5ICA9ICAgZXMxODAwX3hmZXJfaW5mZXJpb3JfbWVtb3J5OworICBlczE4MDBfY2hpbGRfb3BzLnRvX2ZpbGVzX2luZm8gID0gICBlczE4MDBfZmlsZXNfaW5mbzsJCQorICBlczE4MDBfY2hpbGRfb3BzLnRvX2luc2VydF9icmVha3BvaW50ID0gICBlczE4MDBfaW5zZXJ0X2JyZWFrcG9pbnQ7CQorICBlczE4MDBfY2hpbGRfb3BzLnRvX3JlbW92ZV9icmVha3BvaW50ID0gICBlczE4MDBfcmVtb3ZlX2JyZWFrcG9pbnQ7CQorICBlczE4MDBfY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX2luaXQgID0gICBOVUxMOwkJCQorICBlczE4MDBfY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX2luZmVyaW9yID0gICBOVUxMOwkJCQorICBlczE4MDBfY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCA9ICAgTlVMTDsJCQorICBlczE4MDBfY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX291cnMgID0gICBOVUxMOwkJCQorICBlczE4MDBfY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX2luZm8gID0gICBOVUxMOwkJCQorICBlczE4MDBfY2hpbGRfb3BzLnRvX2tpbGwgID0gICBlczE4MDBfa2lsbDsJCQkKKyAgZXMxODAwX2NoaWxkX29wcy50b19sb2FkICA9ICAgZXMxODAwX2xvYWQ7CQkJCisgIGVzMTgwMF9jaGlsZF9vcHMudG9fbG9va3VwX3N5bWJvbCA9ICAgTlVMTDsJCQkKKyAgZXMxODAwX2NoaWxkX29wcy50b19jcmVhdGVfaW5mZXJpb3IgPSAgIGVzMTgwMF9jcmVhdGVfaW5mZXJpb3I7CisgIGVzMTgwMF9jaGlsZF9vcHMudG9fcG9zdF9zdGFydHVwX2luZmVyaW9yID0gTlVMTDsKKyAgZXMxODAwX2NoaWxkX29wcy50b19hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yID0gTlVMTDsKKyAgZXMxODAwX2NoaWxkX29wcy50b19jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yID0gTlVMTDsKKyAgZXMxODAwX2NoaWxkX29wcy50b19wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSA9IE5VTEw7CisgIGVzMTgwMF9jaGlsZF9vcHMudG9faW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGVzMTgwMF9jaGlsZF9vcHMudG9fcmVtb3ZlX2ZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGVzMTgwMF9jaGlsZF9vcHMudG9faW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBlczE4MDBfY2hpbGRfb3BzLnRvX3JlbW92ZV92Zm9ya19jYXRjaHBvaW50ID0gTlVMTDsgICAgICAgIAorICBlczE4MDBfY2hpbGRfb3BzLnRvX2hhc19mb3JrZWQgPSBOVUxMOworICBlczE4MDBfY2hpbGRfb3BzLnRvX2hhc192Zm9ya2VkID0gTlVMTDsgICAgICAgICAgCisgIGVzMTgwMF9jaGlsZF9vcHMudG9fY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjID0gTlVMTDsKKyAgZXMxODAwX2NoaWxkX29wcy50b19wb3N0X2ZvbGxvd192Zm9yayA9IE5VTEw7CisgIGVzMTgwMF9jaGlsZF9vcHMudG9faW5zZXJ0X2V4ZWNfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGVzMTgwMF9jaGlsZF9vcHMudG9fcmVtb3ZlX2V4ZWNfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGVzMTgwMF9jaGlsZF9vcHMudG9faGFzX2V4ZWNkID0gTlVMTDsKKyAgZXMxODAwX2NoaWxkX29wcy50b19yZXBvcnRlZF9leGVjX2V2ZW50c19wZXJfZXhlY19jYWxsID0gTlVMTDsKKyAgZXMxODAwX2NoaWxkX29wcy50b19oYXNfZXhpdGVkID0gTlVMTDsKKyAgZXMxODAwX2NoaWxkX29wcy50b19tb3Vybl9pbmZlcmlvciA9ICAgZXMxODAwX21vdXJuX2luZmVyaW9yOwkKKyAgZXMxODAwX2NoaWxkX29wcy50b19jYW5fcnVuICA9ICAgMDsJCQkJCisgIGVzMTgwMF9jaGlsZF9vcHMudG9fbm90aWNlX3NpZ25hbHMgPSAgIDA7CQkJCisgIGVzMTgwMF9jaGlsZF9vcHMudG9fdGhyZWFkX2FsaXZlICA9ICAgMDsJCQkKKyAgZXMxODAwX2NoaWxkX29wcy50b19zdG9wICA9ICAgMDsKKyAgZXMxODAwX2NoaWxkX29wcy50b19waWRfdG9fZXhlY19maWxlID0gTlVMTDsKKyAgZXMxODAwX2NoaWxkX29wcy50b19jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUgPSBOVUxMOworICBlczE4MDBfY2hpbGRfb3BzLnRvX3N0cmF0dW0gPSAgIHByb2Nlc3Nfc3RyYXR1bTsJCQorICBlczE4MDBfY2hpbGRfb3BzLkRPTlRfVVNFID0gICAwOwkJCQkKKyAgZXMxODAwX2NoaWxkX29wcy50b19oYXNfYWxsX21lbW9yeSA9ICAgMTsJCQkKKyAgZXMxODAwX2NoaWxkX29wcy50b19oYXNfbWVtb3J5ID0gICAxOwkJCQorICBlczE4MDBfY2hpbGRfb3BzLnRvX2hhc19zdGFjayA9ICAgMTsJCQkKKyAgZXMxODAwX2NoaWxkX29wcy50b19oYXNfcmVnaXN0ZXJzID0gICAxOwkJCQorICBlczE4MDBfY2hpbGRfb3BzLnRvX2hhc19leGVjdXRpb24gPSAgIDE7CQkJCisgIGVzMTgwMF9jaGlsZF9vcHMudG9fc2VjdGlvbnMgPSAgIE5VTEw7CQkJCisgIGVzMTgwMF9jaGlsZF9vcHMudG9fc2VjdGlvbnNfZW5kID0gICBOVUxMOwkJCQorICBlczE4MDBfY2hpbGRfb3BzLnRvX21hZ2ljID0gICBPUFNfTUFHSUM7CQkJCit9CisKK3ZvaWQKK19pbml0aWFsaXplX2VzMTgwMCAoKQoreworICBpbml0X2VzMTgwMF9vcHMoKSA7CisgIGluaXRfZXMxODAwX2NoaWxkX29wcygpIDsKKyAgYWRkX3RhcmdldCAoJmVzMTgwMF9vcHMpOworICBhZGRfdGFyZ2V0ICgmZXMxODAwX2NoaWxkX29wcyk7CisjaWZkZWYgUFJPVklERV9UUkFOU1BBUkVOVAorICBhZGRfY29tICgidHJhbnNwYXJlbnQiLCBjbGFzc19zdXBwb3J0LCBlczE4MDBfdHJhbnNwYXJlbnQsCisJICAgIlN0YXJ0IHRyYW5zcGFyZW50IGNvbW11bmljYXRpb24gd2l0aCB0aGUgRVMgMTgwMCBlbXVsYXRvci4iKTsKKyNlbmRpZiAvKiBQUk9WSURFX1RSQU5TUEFSRU5UICovCisgIGFkZF9jb20gKCJpbml0X2JyZWFrIiwgY2xhc3Nfc3VwcG9ydCwgZXMxODAwX2luaXRfYnJlYWssCisJICAgIkRvd25sb2FkIGJyZWFrIHJvdXRpbmUgYW5kIGluaXRpYWxpemUgYnJlYWsgZmFjaWxpdHkgb24gRVMgMTgwMCIpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS1lc3QuYyBiL2dkYi9yZW1vdGUtZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmZDhhYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZW1vdGUtZXN0LmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qIFJlbW90ZSBkZWJ1Z2dpbmcgaW50ZXJmYWNlIGZvciBFU1QtMzAwIElDRSwgZm9yIEdEQgorICAgQ29weXJpZ2h0IDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBmb3IgQ3lnbnVzIFN1cHBvcnQuCisgICBSZS13cml0dGVuIGJ5IFN0dSBHcm9zc21hbiBvZiBDeWdudXMgU3VwcG9ydAorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgIm1vbml0b3IuaCIKKyNpbmNsdWRlICJzZXJpYWwuaCIKKworc3RhdGljIHZvaWQgZXN0X29wZW4gUEFSQU1TICgoY2hhciAqYXJncywgaW50IGZyb21fdHR5KSk7CisKK3N0YXRpYyB2b2lkCitlc3Rfc3VwcGx5X3JlZ2lzdGVyIChyZWduYW1lLCByZWduYW1lbGVuLCB2YWwsIHZhbGxlbikKKyAgICAgY2hhciAqcmVnbmFtZTsKKyAgICAgaW50IHJlZ25hbWVsZW47CisgICAgIGNoYXIgKnZhbDsKKyAgICAgaW50IHZhbGxlbjsKK3sKKyAgaW50IHJlZ25vOworCisgIGlmIChyZWduYW1lbGVuICE9IDIpCisgICAgcmV0dXJuOworCisgIHN3aXRjaCAocmVnbmFtZVswXSkKKyAgICB7CisgICAgY2FzZSAnUyc6CisgICAgICBpZiAocmVnbmFtZVsxXSAhPSAnUicpCisJcmV0dXJuOworICAgICAgcmVnbm8gPSBQU19SRUdOVU07CisgICAgICBicmVhazsKKyAgICBjYXNlICdQJzoKKyAgICAgIGlmIChyZWduYW1lWzFdICE9ICdDJykKKwlyZXR1cm47CisgICAgICByZWdubyA9IFBDX1JFR05VTTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0QnOgorICAgICAgaWYgKHJlZ25hbWVbMV0gPCAnMCcgfHwgcmVnbmFtZVsxXSA+ICc3JykKKwlyZXR1cm47CisgICAgICByZWdubyA9IHJlZ25hbWVbMV0gLSAnMCcgKyBEMF9SRUdOVU07CisgICAgICBicmVhazsKKyAgICBjYXNlICdBJzoKKyAgICAgIGlmIChyZWduYW1lWzFdIDwgJzAnIHx8IHJlZ25hbWVbMV0gPiAnNycpCisJcmV0dXJuOworICAgICAgcmVnbm8gPSByZWduYW1lWzFdIC0gJzAnICsgQTBfUkVHTlVNOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbW9uaXRvcl9zdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCB2YWwpOworfQorCisvKgorICogVGhpcyBhcnJheSBvZiByZWdpc3RlcnMgbmVlZHMgdG8gbWF0Y2ggdGhlIGluZGV4ZXMgdXNlZCBieSBHREIuIFRoZQorICogd2hvbGUgcmVhc29uIHRoaXMgZXhpc3RzIGlzIGJlY2F1c2UgdGhlIHZhcmlvdXMgUk9NIG1vbml0b3JzIHVzZQorICogZGlmZmVyZW50IG5hbWVzIHRoYW4gR0RCIGRvZXMsIGFuZCBkb24ndCBzdXBwb3J0IGFsbCB0aGUKKyAqIHJlZ2lzdGVycyBlaXRoZXIuIFNvLCB0eXBpbmcgImluZm8gcmVnIHNwIiBiZWNvbWVzIGEgInIzMCIuCisgKi8KKworc3RhdGljIGNoYXIgKmVzdF9yZWduYW1lc1tOVU1fUkVHU10gPQoreworICAiRDAiLCAiRDEiLCAiRDIiLCAiRDMiLCAiRDQiLCAiRDUiLCAiRDYiLCAiRDciLAorICAiQTAiLCAiQTEiLCAiQTIiLCAiQTMiLCAiQTQiLCAiQTUiLCAiQTYiLCAiQTciLAorICAiU1IiLCAiUEMiLAorfTsKKworLyoKKyAqIERlZmluZSB0aGUgbW9uaXRvciBjb21tYW5kIHN0cmluZ3MuIFNpbmNlIHRoZXNlIGFyZSBwYXNzZWQgZGlyZWN0bHkKKyAqIHRocm91Z2ggdG8gYSBwcmludGYgc3R5bGUgZnVuY3Rpb24sIHdlIG5lZWQgY2FuIGluY2x1ZGUgZm9ybWF0dGluZworICogc3RyaW5ncy4gV2UgYWxzbyBuZWVkIGEgQ1Igb3IgTEYgb24gdGhlIGVuZC4KKyAqLworCitzdGF0aWMgc3RydWN0IHRhcmdldF9vcHMgZXN0X29wczsKKworc3RhdGljIGNoYXIgKmVzdF9pbml0c1tdID0geyJoZVxyIiwgLyogUmVzZXRzIHRoZSBwcm9tcHQsIGFuZCBjbGVhcnMgcmVwZWF0ZWQgY21kcyAqLworCQkJICAgICAgTlVMTH07CisKK3N0YXRpYyBzdHJ1Y3QgbW9uaXRvcl9vcHMgZXN0X2NtZHMgOworCitzdGF0aWMgdm9pZCAKK2luaXRfZXN0X2NtZHModm9pZCkKK3sKKyAgZXN0X2NtZHMuZmxhZ3MgPSAgIE1PX0NMUl9CUkVBS19VU0VTX0FERFIgfCBNT19GSUxMX1VTRVNfQUREUiB8IE1PX05FRURfUkVHRFVNUF9BRlRFUl9DT05UIHwKKyAgICBNT19TUkVDX0FDSyB8IE1PX1NSRUNfQUNLX1BMVVMgOworICBlc3RfY21kcy5pbml0ID0gICBlc3RfaW5pdHM7CQkJLyogSW5pdCBzdHJpbmdzICovCisgIGVzdF9jbWRzLmNvbnQgPSAgICJnb1xyIjsJCQkvKiBjb250aW51ZSBjb21tYW5kICovCisgIGVzdF9jbWRzLnN0ZXAgPSAgICJzaWRyXHIiOwkJCS8qIHNpbmdsZSBzdGVwICovCisgIGVzdF9jbWRzLnN0b3AgPSAgICJcMDAzIjsJCQkvKiBeQyBpbnRlcnJ1cHRzIHRoZSBwcm9ncmFtICovCisgIGVzdF9jbWRzLnNldF9icmVhayA9ICAgInNiICV4XHIiOwkJCS8qIHNldCBhIGJyZWFrcG9pbnQgKi8KKyAgZXN0X2NtZHMuY2xyX2JyZWFrID0gICAicmIgJXhcciI7CQkJLyogY2xlYXIgYSBicmVha3BvaW50ICovCisgIGVzdF9jbWRzLmNscl9hbGxfYnJlYWsgPSAgICJyYlxyIjsJCQkvKiBjbGVhciBhbGwgYnJlYWtwb2ludHMgKi8KKyAgZXN0X2NtZHMuZmlsbCA9ICAgImJmYiAleCAleCAleFxyIjsJCS8qIGZpbGwgKHN0YXJ0IGVuZCB2YWwpICovCisgIGVzdF9jbWRzLnNldG1lbS5jbWRiID0gICAgICJzbWIgJXggJXhcciI7CQkvKiBzZXRtZW0uY21kYiAoYWRkciwgdmFsdWUpICovCisgIGVzdF9jbWRzLnNldG1lbS5jbWR3ID0gICAgICJzbXcgJXggJXhcciI7CQkvKiBzZXRtZW0uY21kdyAoYWRkciwgdmFsdWUpICovCisgIGVzdF9jbWRzLnNldG1lbS5jbWRsID0gICAgICJzbWwgJXggJXhcciI7CQkvKiBzZXRtZW0uY21kbCAoYWRkciwgdmFsdWUpICovCisgIGVzdF9jbWRzLnNldG1lbS5jbWRsbCA9ICAgICBOVUxMOwkJCS8qIHNldG1lbS5jbWRsbCAoYWRkciwgdmFsdWUpICovCisgIGVzdF9jbWRzLnNldG1lbS5yZXNwX2RlbGltID0gICAgIE5VTEw7CQkJLyogc2V0cmVnLnJlc3BfZGVsaW0gKi8KKyAgZXN0X2NtZHMuc2V0bWVtLnRlcm0gPSAgICAgTlVMTDsJCQkvKiBzZXRyZWcudGVybSAqLworICBlc3RfY21kcy5zZXRtZW0udGVybV9jbWQgPSAgICAgTlVMTDsJCQkvKiBzZXRyZWcudGVybV9jbWQgKi8KKyAgZXN0X2NtZHMuZ2V0bWVtLmNtZGIgPSAgICAgImRtYiAleCAleFxyIjsJCS8qIGdldG1lbS5jbWRiIChhZGRyLCBsZW4pICovCisgIGVzdF9jbWRzLmdldG1lbS5jbWR3ID0gICAgICJkbXcgJXggJXhcciI7CQkvKiBnZXRtZW0uY21kdyAoYWRkciwgbGVuKSAqLworICBlc3RfY21kcy5nZXRtZW0uY21kbCA9ICAgICAiZG1sICV4ICV4XHIiOwkJLyogZ2V0bWVtLmNtZGwgKGFkZHIsIGxlbikgKi8KKyAgZXN0X2NtZHMuZ2V0bWVtLmNtZGxsID0gICAgIE5VTEw7CQkJLyogZ2V0bWVtLmNtZGxsIChhZGRyLCBsZW4pICovCisgIGVzdF9jbWRzLmdldG1lbS5yZXNwX2RlbGltID0gICAgICI6ICI7CQkJLyogZ2V0bWVtLnJlc3BfZGVsaW0gKi8KKyAgZXN0X2NtZHMuZ2V0bWVtLnRlcm0gPSAgICAgTlVMTDsJCQkvKiBnZXRtZW0udGVybSAqLworICBlc3RfY21kcy5nZXRtZW0udGVybV9jbWQgPSAgICAgTlVMTDsJCQkvKiBnZXRtZW0udGVybV9jbWQgKi8KKyAgZXN0X2NtZHMuc2V0cmVnLmNtZCA9ICAgICAic3IgJXMgJXhcciI7CQkvKiBzZXRyZWcuY21kIChuYW1lLCB2YWx1ZSkgKi8KKyAgZXN0X2NtZHMuc2V0cmVnLnJlc3BfZGVsaW0gPSAgICAgTlVMTDsJCQkvKiBzZXRyZWcucmVzcF9kZWxpbSAqLworICBlc3RfY21kcy5zZXRyZWcudGVybSA9ICAgICBOVUxMOwkJCS8qIHNldHJlZy50ZXJtICovCisgIGVzdF9jbWRzLnNldHJlZy50ZXJtX2NtZCA9ICAgICBOVUxMOwkJCS8qIHNldHJlZy50ZXJtX2NtZCAqLworICBlc3RfY21kcy5nZXRyZWcuY21kID0gICAgICJkciAlc1xyIjsJCQkvKiBnZXRyZWcuY21kIChuYW1lKSAqLworICBlc3RfY21kcy5nZXRyZWcucmVzcF9kZWxpbSA9ICAgICAiID0gIjsJCQkvKiBnZXRyZWcucmVzcF9kZWxpbSAqLworICBlc3RfY21kcy5nZXRyZWcudGVybSA9ICAgICBOVUxMOwkJCS8qIGdldHJlZy50ZXJtICovCisgIGVzdF9jbWRzLmdldHJlZy50ZXJtX2NtZCA9ICAgICBOVUxMIDsJCQkvKiBnZXRyZWcudGVybV9jbWQgKi8KKyAgZXN0X2NtZHMuZHVtcF9yZWdpc3RlcnMgPSAgICJkclxyIjsJCQkvKiBkdW1wX3JlZ2lzdGVycyAqLworICBlc3RfY21kcy5yZWdpc3Rlcl9wYXR0ZXJuID0gICAiXFwoXFx3K1xcKSA9IFxcKFswLTlhLWZBLUZdK1xcKSI7IC8qIHJlZ2lzdGVyX3BhdHRlcm4gKi8KKyAgZXN0X2NtZHMuc3VwcGx5X3JlZ2lzdGVyID0gICBlc3Rfc3VwcGx5X3JlZ2lzdGVyOwkJLyogc3VwcGx5X3JlZ2lzdGVyICovCisgIGVzdF9jbWRzLmxvYWRfcm91dGluZSA9ICAgTlVMTDsJCQkJLyogbG9hZF9yb3V0aW5lIChkZWZhdWx0cyB0byBTUkVDcykgKi8KKyAgZXN0X2NtZHMubG9hZCA9ICAgImRsXHIiOwkJCS8qIGRvd25sb2FkIGNvbW1hbmQgKi8KKyAgZXN0X2NtZHMubG9hZHJlc3AgPSAgICIrIjsJCQkJLyogbG9hZCByZXNwb25zZSAqLworICBlc3RfY21kcy5wcm9tcHQgPSAgICI+QktNPiI7CQkJLyogbW9uaXRvciBjb21tYW5kIHByb21wdCAqLworICBlc3RfY21kcy5saW5lX3Rlcm0gPSAgICJcciI7CQkJCS8qIGVuZC1vZi1saW5lIHRlcm1pbmF0b3IgKi8KKyAgZXN0X2NtZHMuY21kX2VuZCA9ICAgTlVMTDsJCQkJLyogb3B0aW9uYWwgY29tbWFuZCB0ZXJtaW5hdG9yICovCisgIGVzdF9jbWRzLnRhcmdldCA9ICAgJmVzdF9vcHM7CQkJLyogdGFyZ2V0IG9wZXJhdGlvbnMgKi8KKyAgZXN0X2NtZHMuc3RvcGJpdHMgPSAgIFNFUklBTF8xX1NUT1BCSVRTOwkJLyogbnVtYmVyIG9mIHN0b3AgYml0cyAqLworICBlc3RfY21kcy5yZWduYW1lcyA9ICAgZXN0X3JlZ25hbWVzOwkJCS8qIHJlZ2lzdGVycyBuYW1lcyAqLworICBlc3RfY21kcy5tYWdpYyA9ICAgTU9OSVRPUl9PUFNfTUFHSUMJOwkvKiBtYWdpYyAqLworfSAvKiBpbml0X2VzdF9jbWRzICovCisKK3N0YXRpYyB2b2lkCitlc3Rfb3BlbihhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBtb25pdG9yX29wZW4gKGFyZ3MsICZlc3RfY21kcywgZnJvbV90dHkpOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9lc3QgKCkKK3sKKyAgaW5pdF9lc3RfY21kcygpIDsKKyAgaW5pdF9tb25pdG9yX29wcyAoJmVzdF9vcHMpOworCisgIGVzdF9vcHMudG9fc2hvcnRuYW1lID0gImVzdCI7CisgIGVzdF9vcHMudG9fbG9uZ25hbWUgPSAiRVNUIGJhY2tncm91bmQgZGVidWcgbW9uaXRvciI7CisgIGVzdF9vcHMudG9fZG9jID0gIkRlYnVnIHZpYSB0aGUgRVNUIEJETS5cblwKK1NwZWNpZnkgdGhlIHNlcmlhbCBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvIChlLmcuIC9kZXYvdHR5YSkuIjsKKyAgZXN0X29wcy50b19vcGVuID0gZXN0X29wZW47CisKKyAgYWRkX3RhcmdldCAoJmVzdF9vcHMpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS1obXMuYyBiL2dkYi9yZW1vdGUtaG1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhODQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZW1vdGUtaG1zLmMKQEAgLTAsMCArMSwxNTAwIEBACisvKiBSZW1vdGUgZGVidWdnaW5nIGludGVyZmFjZSBmb3IgSGl0YWNoaSBITVMgTW9uaXRvciBWZXJzaW9uIDEuMAorICAgQ29weXJpZ2h0IDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4gIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4KKyAgIChzYWNAY3lnbnVzLmNvbSkuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAibW9uaXRvci5oIgorI2luY2x1ZGUgInNlcmlhbC5oIgorCitzdGF0aWMgdm9pZCBobXNfb3BlbiBQQVJBTVMgKChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpKTsKK3N0YXRpYyB2b2lkCitobXNfc3VwcGx5X3JlZ2lzdGVyIChyZWduYW1lLCByZWduYW1lbGVuLCB2YWwsIHZhbGxlbikKKyAgICAgY2hhciAqcmVnbmFtZTsKKyAgICAgaW50IHJlZ25hbWVsZW47CisgICAgIGNoYXIgKnZhbDsKKyAgICAgaW50IHZhbGxlbjsKK3sKKyAgaW50IHJlZ25vOworCisgIGlmIChyZWduYW1lbGVuICE9IDIpCisgICAgcmV0dXJuOworICBpZiAocmVnbmFtZVswXSAhPSAnUCcpCisgICAgcmV0dXJuOworICAvKiBXZSBzY2FuIG9mZiBhbGwgdGhlIHJlZ2lzdGVycyBpbiBvbmUgZ28gKi8KKworICB2YWwgPSBtb25pdG9yX3N1cHBseV9yZWdpc3RlciAoUENfUkVHTlVNLCB2YWwpOworICAvKiBTa2lwIHRoZSBjY3Igc3RyaW5nICovCisgIHdoaWxlICgqdmFsICE9ICc9JyAmJiAqdmFsKQorICAgIHZhbCsrOworCisgIHZhbCA9IG1vbml0b3Jfc3VwcGx5X3JlZ2lzdGVyIChDQ1JfUkVHTlVNLCB2YWwgKyAxKTsKKworICAvKiBTa2lwIHVwIHRvIHJlc3Qgb2YgcmVncyAqLworICB3aGlsZSAoKnZhbCAhPSAnPScgJiYgKnZhbCkKKyAgICB2YWwrKzsKKworICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCA3OyByZWdubysrKQorICAgIHsKKyAgICAgIHZhbCA9IG1vbml0b3Jfc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgdmFsICsgMSk7CisgICAgfQorfQorCisvKgorICogVGhpcyBhcnJheSBvZiByZWdpc3RlcnMgbmVlZHMgdG8gbWF0Y2ggdGhlIGluZGV4ZXMgdXNlZCBieSBHREIuIFRoZQorICogd2hvbGUgcmVhc29uIHRoaXMgZXhpc3RzIGlzIGJlY2F1c2UgdGhlIHZhcmlvdXMgUk9NIG1vbml0b3JzIHVzZQorICogZGlmZmVyZW50IG5hbWVzIHRoYW4gR0RCIGRvZXMsIGFuZCBkb24ndCBzdXBwb3J0IGFsbCB0aGUKKyAqIHJlZ2lzdGVycyBlaXRoZXIuIFNvLCB0eXBpbmcgImluZm8gcmVnIHNwIiBiZWNvbWVzIGEgInIzMCIuCisgKi8KKworc3RhdGljIGNoYXIgKmhtc19yZWduYW1lc1tOVU1fUkVHU10gPQoreworICAiUjAiLCAiUjEiLCAiUjIiLCAiUjMiLCAiUjQiLCAiUjUiLCAiUjYiLCAiUjciLCAiQ0NSIiwgIlBDIgorfTsKKworLyoKKyAqIERlZmluZSB0aGUgbW9uaXRvciBjb21tYW5kIHN0cmluZ3MuIFNpbmNlIHRoZXNlIGFyZSBwYXNzZWQgZGlyZWN0bHkKKyAqIHRocm91Z2ggdG8gYSBwcmludGYgc3R5bGUgZnVuY3Rpb24sIHdlIG5lZWQgY2FuIGluY2x1ZGUgZm9ybWF0dGluZworICogc3RyaW5ncy4gV2UgYWxzbyBuZWVkIGEgQ1Igb3IgTEYgb24gdGhlIGVuZC4KKyAqLworCitzdGF0aWMgc3RydWN0IHRhcmdldF9vcHMgaG1zX29wczsKKworc3RhdGljIGNoYXIgKmhtc19pbml0c1tdID0KK3siXDAwMyIsCQkJLyogUmVzZXRzIHRoZSBwcm9tcHQsIGFuZCBjbGVhcnMgcmVwZWF0ZWQgY21kcyAqLworIE5VTEx9OworCitzdGF0aWMgc3RydWN0IG1vbml0b3Jfb3BzIGhtc19jbWRzIDsKKworc3RhdGljIHZvaWQgCitpbml0X2htc19jbWRzKHZvaWQpCit7CisgIGhtc19jbWRzLmZsYWdzID0gICBNT19DTFJfQlJFQUtfVVNFU19BRERSIHwgTU9fRklMTF9VU0VTX0FERFIgfCBNT19HRVRNRU1fTkVFRFNfUkFOR0U7CisgIGhtc19jbWRzLmluaXQgPSAgIGhtc19pbml0czsJCS8qIEluaXQgc3RyaW5ncyAqLworICBobXNfY21kcy5jb250ID0gICAiZ1xyIjsJCS8qIGNvbnRpbnVlIGNvbW1hbmQgKi8KKyAgaG1zX2NtZHMuc3RlcCA9ICAgInNcciI7CQkvKiBzaW5nbGUgc3RlcCAqLworICBobXNfY21kcy5zdG9wID0gICAiXDAwMyI7CQkvKiBeQyBpbnRlcnJ1cHRzIHRoZSBwcm9ncmFtICovCisgIGhtc19jbWRzLnNldF9icmVhayA9ICAgImIgJXhcciI7CS8qIHNldCBhIGJyZWFrcG9pbnQgKi8KKyAgaG1zX2NtZHMuY2xyX2JyZWFrID0gICAiYiAtICV4XHIiOwkvKiBjbGVhciBhIGJyZWFrcG9pbnQgKi8KKyAgaG1zX2NtZHMuY2xyX2FsbF9icmVhayA9ICAgImIgLVxyIjsJLyogY2xlYXIgYWxsIGJyZWFrcG9pbnRzICovCisgIGhtc19jbWRzLmZpbGwgPSAgICJmICV4ICV4ICV4XHIiOwkvKiBmaWxsIChzdGFydCBlbmQgdmFsKSAqLworICBobXNfY21kcy5zZXRtZW0uY21kYiA9ICAgICAibS5iICV4PSV4XHIiOwkvKiBzZXRtZW0uY21kYiAoYWRkciwgdmFsdWUpICovCisgIGhtc19jbWRzLnNldG1lbS5jbWR3ID0gICAgICJtLncgJXg9JXhcciI7CS8qIHNldG1lbS5jbWR3IChhZGRyLCB2YWx1ZSkgKi8KKyAgaG1zX2NtZHMuc2V0bWVtLmNtZGwgPSAgICAgTlVMTDsJLyogc2V0bWVtLmNtZGwgKGFkZHIsIHZhbHVlKSAqLworICBobXNfY21kcy5zZXRtZW0uY21kbGwgPSAgICAgTlVMTDsJLyogc2V0bWVtLmNtZGxsIChhZGRyLCB2YWx1ZSkgKi8KKyAgaG1zX2NtZHMuc2V0bWVtLnJlc3BfZGVsaW0gPSAgICAgTlVMTDsvKiBzZXRyZWcucmVzcF9kZWxpbSAqLworICBobXNfY21kcy5zZXRtZW0udGVybSA9ICAgICBOVUxMOwkvKiBzZXRyZWcudGVybSAqLworICBobXNfY21kcy5zZXRtZW0udGVybV9jbWQgPSAgICAgTlVMTDsJLyogc2V0cmVnLnRlcm1fY21kICovCisgIGhtc19jbWRzLmdldG1lbS5jbWRiID0gICAgICJtLmIgJXggJXhcciI7CS8qIGdldG1lbS5jbWRiIChhZGRyLCBhZGRyKSAqLworICBobXNfY21kcy5nZXRtZW0uY21kdyA9ICAgICAibS53ICV4ICV4XHIiOwkvKiBnZXRtZW0uY21kdyAoYWRkciwgYWRkcikgKi8KKyAgaG1zX2NtZHMuZ2V0bWVtLmNtZGwgPSAgICAgTlVMTDsJLyogZ2V0bWVtLmNtZGwgKGFkZHIsIGFkZHIpICovCisgIGhtc19jbWRzLmdldG1lbS5jbWRsbCA9ICAgICBOVUxMOwkvKiBnZXRtZW0uY21kbGwgKGFkZHIsIGFkZHIpICovCisgIGhtc19jbWRzLmdldG1lbS5yZXNwX2RlbGltID0gICAgICI6ICI7LyogZ2V0bWVtLnJlc3BfZGVsaW0gKi8KKyAgaG1zX2NtZHMuZ2V0bWVtLnRlcm0gPSAgICAgIj4iOwkvKiBnZXRtZW0udGVybSAqLworICBobXNfY21kcy5nZXRtZW0udGVybV9jbWQgPSAgICAgIlwwMDMiOy8qIGdldG1lbS50ZXJtX2NtZCAqLworICBobXNfY21kcy5zZXRyZWcuY21kID0gICAgICJyICVzPSV4XHIiOy8qIHNldHJlZy5jbWQgKG5hbWUsIHZhbHVlKSAqLworICBobXNfY21kcy5zZXRyZWcucmVzcF9kZWxpbSA9ICAgICBOVUxMOy8qIHNldHJlZy5yZXNwX2RlbGltICovCisgIGhtc19jbWRzLnNldHJlZy50ZXJtID0gICAgIE5VTEw7CS8qIHNldHJlZy50ZXJtICovCisgIGhtc19jbWRzLnNldHJlZy50ZXJtX2NtZCA9ICAgICBOVUxMOwkvKiBzZXRyZWcudGVybV9jbWQgKi8KKyAgaG1zX2NtZHMuZ2V0cmVnLmNtZCA9ICAgICAiciAlc1xyIjsJLyogZ2V0cmVnLmNtZCAobmFtZSkgKi8KKyAgaG1zX2NtZHMuZ2V0cmVnLnJlc3BfZGVsaW0gPSAgICAgIiAoIjsvKiBnZXRyZWcucmVzcF9kZWxpbSAqLworICBobXNfY21kcy5nZXRyZWcudGVybSA9ICAgICAiOiI7CS8qIGdldHJlZy50ZXJtICovCisgIGhtc19jbWRzLmdldHJlZy50ZXJtX2NtZCA9ICAgICAiXDAwMyI7LyogZ2V0cmVnLnRlcm1fY21kICovCisgIGhtc19jbWRzLmR1bXBfcmVnaXN0ZXJzID0gICAiclxyIjsJLyogZHVtcF9yZWdpc3RlcnMgKi8KKyAgaG1zX2NtZHMucmVnaXN0ZXJfcGF0dGVybiA9ICAgIlxcKFxcdytcXCk9XFwoWzAtOWEtZkEtRl0rXFwpIjsJLyogcmVnaXN0ZXJfcGF0dGVybiAqLworICBobXNfY21kcy5zdXBwbHlfcmVnaXN0ZXIgPSAgIGhtc19zdXBwbHlfcmVnaXN0ZXI7CS8qIHN1cHBseV9yZWdpc3RlciAqLworICBobXNfY21kcy5sb2FkX3JvdXRpbmUgPSAgIE5VTEw7CS8qIGxvYWRfcm91dGluZSAoZGVmYXVsdHMgdG8gU1JFQ3MpICovCisgIGhtc19jbWRzLmxvYWQgPSAgICJ0bFxyIjsJCS8qIGRvd25sb2FkIGNvbW1hbmQgKi8KKyAgaG1zX2NtZHMubG9hZHJlc3AgPSAgIE5VTEw7CQkvKiBsb2FkIHJlc3BvbnNlICovCisgIGhtc19jbWRzLnByb21wdCA9ICAgIj4iOwkJLyogbW9uaXRvciBjb21tYW5kIHByb21wdCAqLworICBobXNfY21kcy5saW5lX3Rlcm0gPSAgICJcciI7CQkvKiBlbmQtb2YtY29tbWFuZCBkZWxpbWl0b3IgKi8KKyAgaG1zX2NtZHMuY21kX2VuZCA9ICAgTlVMTDsJCS8qIG9wdGlvbmFsIGNvbW1hbmQgdGVybWluYXRvciAqLworICBobXNfY21kcy50YXJnZXQgPSAgICZobXNfb3BzOwkJLyogdGFyZ2V0IG9wZXJhdGlvbnMgKi8KKyAgaG1zX2NtZHMuc3RvcGJpdHMgPSAgIFNFUklBTF8xX1NUT1BCSVRTOy8qIG51bWJlciBvZiBzdG9wIGJpdHMgKi8KKyAgaG1zX2NtZHMucmVnbmFtZXMgPSAgIGhtc19yZWduYW1lczsJLyogcmVnaXN0ZXJzIG5hbWVzICovCisgIGhtc19jbWRzLm1hZ2ljID0gICBNT05JVE9SX09QU19NQUdJQzsJLyogbWFnaWMgKi8KK30gLyogaW5pdF9obXMtY21kcyAqLworCitzdGF0aWMgdm9pZAoraG1zX29wZW4gKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIG1vbml0b3Jfb3BlbiAoYXJncywgJmhtc19jbWRzLCBmcm9tX3R0eSk7Cit9CisKK2ludCB3cml0ZV9kb3NfdGlja19kZWxheTsKKwordm9pZAorX2luaXRpYWxpemVfcmVtb3RlX2htcyAoKQoreworICBpbml0X2htc19jbWRzKCkgOworICBpbml0X21vbml0b3Jfb3BzICgmaG1zX29wcyk7CisKKyAgaG1zX29wcy50b19zaG9ydG5hbWUgPSAiaG1zIjsKKyAgaG1zX29wcy50b19sb25nbmFtZSA9ICJIaXRhY2hpIE1pY3Jvc3lzdGVtcyBIOC8zMDAgZGVidWcgbW9uaXRvciI7CisgIGhtc19vcHMudG9fZG9jID0gIkRlYnVnIHZpYSB0aGUgSE1TIG1vbml0b3IuXG5cCitTcGVjaWZ5IHRoZSBzZXJpYWwgZGV2aWNlIGl0IGlzIGNvbm5lY3RlZCB0byAoZS5nLiAvZGV2L3R0eWEpLiI7CisgIGhtc19vcHMudG9fb3BlbiA9IGhtc19vcGVuOworICAvKiBCeSB0cmlhbCBhbmQgZXJyb3IgSSd2ZSBmb3VuZCB0aGF0IHRoaXMgZGVsYXkgZG9lc24ndCBicmVhayB0aGluZ3MgKi8KKyAgd3JpdGVfZG9zX3RpY2tfZGVsYXkgPSAxOworICBhZGRfdGFyZ2V0ICgmaG1zX29wcyk7Cit9CisKKyNpZiAwCisvKiBUaGlzIGlzIGtlcHQgaGVyZSBiZWNhdXNlIHdlIHVzZWQgdG8gc3VwcG9ydCB0aGUgSDgvNTAwIGluIHRoaXMgbW9kdWxlLAorICAgYW5kIEkgaGF2ZW4ndCBkb25lIHRoZSBIOC81MDAgeWV0ICovCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAid2FpdC5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgInRlcm1pbmFsLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgInNlcmlhbC5oIgorI2luY2x1ZGUgInJlbW90ZS11dGlscy5oIgorLyogRXh0ZXJuYWwgZGF0YSBkZWNsYXJhdGlvbnMgKi8KK2V4dGVybiBpbnQgc3RvcF9zb29uX3F1aWV0bHk7CS8qIGZvciB3YWl0X2Zvcl9pbmZlcmlvciAqLworCisvKiBGb3J3YXJkIGRhdGEgZGVjbGFyYXRpb25zICovCitleHRlcm4gc3RydWN0IHRhcmdldF9vcHMgaG1zX29wczsJLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworCisvKiBGb3J3YXJkIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIHZvaWQgaG1zX2ZldGNoX3JlZ2lzdGVycyAoKTsKK3N0YXRpYyBpbnQgaG1zX3N0b3JlX3JlZ2lzdGVycyAoKTsKK3N0YXRpYyB2b2lkIGhtc19jbG9zZSAoKTsKK3N0YXRpYyBpbnQgaG1zX2NsZWFyX2JyZWFrcG9pbnRzICgpOworCitleHRlcm4gc3RydWN0IHRhcmdldF9vcHMgaG1zX29wczsKK3N0YXRpYyB2b2lkIGhtc19kcmFpbiAoKTsKK3N0YXRpYyB2b2lkIGFkZF9jb21tYW5kcyAoKTsKK3N0YXRpYyB2b2lkIHJlbW92ZV9jb21tYW5kcyAoKTsKKworc3RhdGljIGludCBxdWlldCA9IDE7CQkvKiBGSVhNRSAtIGNhbiBiZSByZW1vdmVkIGFmdGVyIERlYyAnOTQgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSS9PIHN0dWZmIHN0b2xlbiBmcm9tIHJlbW90ZS1lYi5jCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgdGltZW91dCA9IDI7CisKK3N0YXRpYyBjb25zdCBjaGFyICpkZXZfbmFtZTsKKworLyogRGVzY3JpcHRvciBmb3IgSS9PIHRvIHJlbW90ZSBtYWNoaW5lLiAgSW5pdGlhbGl6ZSBpdCB0byAtMSBzbyB0aGF0CisgICBobXNfb3BlbiBrbm93cyB0aGF0IHdlIGRvbid0IGhhdmUgYSBmaWxlIG9wZW4gd2hlbiB0aGUgcHJvZ3JhbQorICAgc3RhcnRzLiAgKi8KKworc3RhdGljIGludCBiZWZvcmUgPSAweGRlYWQ7CitzdGF0aWMgaW50IGlzX29wZW4gPSAwOworc3RhdGljIGludCBhZnRlciA9IDB4ZGVhZDsKK2ludAorY2hlY2tfb3BlbiAoKQoreworICBpZiAoYmVmb3JlICE9IDB4ZGVhZAorICAgICAgfHwgYWZ0ZXIgIT0gMHhkZWFkKQorICAgIHByaW50ZiAoIk9VVENIISBcbiIpOworICBpZiAoIWlzX29wZW4pCisgICAgeworICAgICAgZXJyb3IgKCJyZW1vdGUgZGV2aWNlIG5vdCBvcGVuIik7CisgICAgfQorfQorCisjZGVmaW5lIE9OCTEKKyNkZWZpbmUgT0ZGCTAKKworLyogUmVhZCBhIGNoYXJhY3RlciBmcm9tIHRoZSByZW1vdGUgc3lzdGVtLCBkb2luZyBhbGwgdGhlIGZhbmN5CisgICB0aW1lb3V0IHN0dWZmLiAgKi8KK3N0YXRpYyBpbnQKK3JlYWRjaGFyICgpCit7CisgIGludCBidWY7CisKKyAgYnVmID0gU0VSSUFMX1JFQURDSEFSIChkZXNjLCB0aW1lb3V0KTsKKworICBpZiAoYnVmID09IFNFUklBTF9USU1FT1VUKQorICAgIHsKKyAgICAgIGhtc193cml0ZSAoIi5cclxuIiwgMyk7CisgICAgICBlcnJvciAoIlRpbWVvdXQgcmVhZGluZyBmcm9tIHJlbW90ZSBzeXN0ZW0uIik7CisgICAgfQorICBpZiAoYnVmID09IFNFUklBTF9FUlJPUikKKyAgICB7CisgICAgICBlcnJvciAoIlNlcmlhbCBwb3J0IGVycm9yISIpOworICAgIH0KKworICBpZiAoIXF1aWV0IHx8IHJlbW90ZV9kZWJ1ZykKKyAgICBwcmludGZfdW5maWx0ZXJlZCAoIiVjIiwgYnVmKTsKKworICByZXR1cm4gYnVmICYgMHg3ZjsKK30KKworc3RhdGljIHZvaWQKK2ZsdXNoICgpCit7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGludCBiID0gU0VSSUFMX1JFQURDSEFSIChkZXNjLCAwKTsKKyAgICAgIGlmIChiID09IFNFUklBTF9USU1FT1VUKQorCXJldHVybjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK3JlYWRjaGFyX25vZmFpbCAoKQoreworICBpbnQgYnVmOworCisgIGJ1ZiA9IFNFUklBTF9SRUFEQ0hBUiAoZGVzYywgdGltZW91dCk7CisgIGlmIChidWYgPT0gU0VSSUFMX1RJTUVPVVQpCisgICAgYnVmID0gMDsKKyAgaWYgKCFxdWlldCB8fCByZW1vdGVfZGVidWcpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlYyIsIGJ1Zik7CisKKyAgcmV0dXJuIGJ1ZiAmIDB4N2Y7CisKK30KKworLyogS2VlcCBkaXNjYXJkaW5nIGlucHV0IGZyb20gdGhlIHJlbW90ZSBzeXN0ZW0sIHVudGlsIFNUUklORyBpcyBmb3VuZC4KKyAgIExldCB0aGUgdXNlciBicmVhayBvdXQgaW1tZWRpYXRlbHkuICAqLworc3RhdGljIHZvaWQKK2V4cGVjdCAoc3RyaW5nKQorICAgICBjaGFyICpzdHJpbmc7Cit7CisgIGNoYXIgKnAgPSBzdHJpbmc7CisgIGNoYXIgYzsKKyAgaW1tZWRpYXRlX3F1aXQgPSAxOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBjID0gcmVhZGNoYXIgKCk7CisgICAgICBpZiAoYyA9PSAqcCkKKwl7CisJICBwKys7CisJICBpZiAoKnAgPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGltbWVkaWF0ZV9xdWl0ID0gMDsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgcCA9IHN0cmluZzsKKwkgIGlmIChjID09ICpwKQorCSAgICBwKys7CisJfQorICAgIH0KK30KKworLyogS2VlcCBkaXNjYXJkaW5nIGlucHV0IHVudGlsIHdlIHNlZSB0aGUgaG1zIHByb21wdC4KKworICAgVGhlIGNvbnZlbnRpb24gZm9yIGRlYWxpbmcgd2l0aCB0aGUgcHJvbXB0IGlzIHRoYXQgeW91CisgICBvIGdpdmUgeW91ciBjb21tYW5kCisgICBvICp0aGVuKiB3YWl0IGZvciB0aGUgcHJvbXB0LgorCisgICBUaHVzIHRoZSBsYXN0IHRoaW5nIHRoYXQgYSBwcm9jZWR1cmUgZG9lcyB3aXRoIHRoZSBzZXJpYWwgbGluZQorICAgd2lsbCBiZSBhbiBleHBlY3RfcHJvbXB0KCkuICBFeGNlcHRpb246ICBobXNfcmVzdW1lIGRvZXMgbm90CisgICB3YWl0IGZvciB0aGUgcHJvbXB0LCBiZWNhdXNlIHRoZSB0ZXJtaW5hbCBpcyBiZWluZyBoYW5kZWQgb3ZlcgorICAgdG8gdGhlIGluZmVyaW9yLiAgSG93ZXZlciwgdGhlIG5leHQgdGhpbmcgd2hpY2ggaGFwcGVucyBhZnRlciB0aGF0CisgICBpcyBhIGhtc193YWl0IHdoaWNoIGRvZXMgd2FpdCBmb3IgdGhlIHByb21wdC4KKyAgIE5vdGUgdGhhdCB0aGlzIGluY2x1ZGVzIGFibm9ybWFsIGV4aXQsIGUuZy4gZXJyb3IoKS4gIFRoaXMgaXMKKyAgIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGdldHRpbmcgaW50byBzdGF0ZXMgZnJvbSB3aGljaCB3ZSBjYW4ndAorICAgcmVjb3Zlci4gICovCitzdGF0aWMgdm9pZAorZXhwZWN0X3Byb21wdCAoKQoreworICBleHBlY3QgKCJITVM+Iik7Cit9CisKKy8qIEdldCBhIGhleCBkaWdpdCBmcm9tIHRoZSByZW1vdGUgc3lzdGVtICYgcmV0dXJuIGl0cyB2YWx1ZS4KKyAgIElmIGlnbm9yZV9zcGFjZSBpcyBub256ZXJvLCBpZ25vcmUgc3BhY2VzIChub3QgbmV3bGluZSwgdGFiLCBldGMpLiAgKi8KK3N0YXRpYyBpbnQKK2dldF9oZXhfZGlnaXQgKGlnbm9yZV9zcGFjZSkKKyAgICAgaW50IGlnbm9yZV9zcGFjZTsKK3sKKyAgaW50IGNoOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGNoID0gcmVhZGNoYXIgKCk7CisgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKKwlyZXR1cm4gY2ggLSAnMCc7CisgICAgICBlbHNlIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKQorCXJldHVybiBjaCAtICdBJyArIDEwOworICAgICAgZWxzZSBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykKKwlyZXR1cm4gY2ggLSAnYScgKyAxMDsKKyAgICAgIGVsc2UgaWYgKGNoID09ICcgJyAmJiBpZ25vcmVfc3BhY2UpCisJOworICAgICAgZWxzZQorCXsKKwkgIGV4cGVjdF9wcm9tcHQgKCk7CisJICBlcnJvciAoIkludmFsaWQgaGV4IGRpZ2l0IGZyb20gcmVtb3RlIHN5c3RlbS4iKTsKKwl9CisgICAgfQorfQorCisvKiBHZXQgYSBieXRlIGZyb20gaG1zX2Rlc2MgYW5kIHB1dCBpdCBpbiAqQllULiAgQWNjZXB0IGFueSBudW1iZXIKKyAgIGxlYWRpbmcgc3BhY2VzLiAgKi8KK3N0YXRpYyB2b2lkCitnZXRfaGV4X2J5dGUgKGJ5dCkKKyAgICAgY2hhciAqYnl0OworeworICBpbnQgdmFsOworCisgIHZhbCA9IGdldF9oZXhfZGlnaXQgKDEpIDw8IDQ7CisgIHZhbCB8PSBnZXRfaGV4X2RpZ2l0ICgwKTsKKyAgKmJ5dCA9IHZhbDsKK30KKworLyogUmVhZCBhIDMyLWJpdCBoZXggd29yZCBmcm9tIHRoZSBobXMsIHByZWNlZGVkIGJ5IGEgc3BhY2UgICovCitzdGF0aWMgbG9uZworZ2V0X2hleF93b3JkICgpCit7CisgIGxvbmcgdmFsOworICBpbnQgajsKKworICB2YWwgPSAwOworICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgIHZhbCA9ICh2YWwgPDwgNCkgKyBnZXRfaGV4X2RpZ2l0IChqID09IDApOworICByZXR1cm4gdmFsOworfQorCisvKiBDYWxsZWQgd2hlbiBTSUdBTFJNIHNpZ25hbCBzZW50IGR1ZSB0byBhbGFybSgpIHRpbWVvdXQuICAqLworCisvKiBOdW1iZXIgb2YgU0lHVFJBUHMgd2UgbmVlZCB0byBzaW11bGF0ZS4gIFRoYXQgaXMsIHRoZSBuZXh0CisgICBORUVEX0FSVElGSUNJQUxfVFJBUCBjYWxscyB0byBobXNfd2FpdCBzaG91bGQganVzdCByZXR1cm4KKyAgIFNJR1RSQVAgd2l0aG91dCBhY3R1YWxseSB3YWl0aW5nIGZvciBhbnl0aGluZy4gICovCisKK3N0YXRpYyBpbnQgbmVlZF9hcnRpZmljaWFsX3RyYXAgPSAwOworCit2b2lkCitobXNfa2lsbCAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisKK30KKworLyogVGhpcyBpcyBjYWxsZWQgbm90IG9ubHkgd2hlbiB3ZSBmaXJzdCBhdHRhY2gsIGJ1dCBhbHNvIHdoZW4gdGhlCisgICB1c2VyIHR5cGVzICJydW4iIGFmdGVyIGhhdmluZyBhdHRhY2hlZC4gICovCit2b2lkCitobXNfY3JlYXRlX2luZmVyaW9yIChleGVjZmlsZSwgYXJncywgZW52KQorICAgICBjaGFyICpleGVjZmlsZTsKKyAgICAgY2hhciAqYXJnczsKKyAgICAgY2hhciAqKmVudjsKK3sKKyAgaW50IGVudHJ5X3B0OworICBjaGFyIGJ1ZmZlclsxMDBdOworCisgIGlmIChhcmdzICYmICphcmdzKQorICAgIGVycm9yICgiQ2FuJ3QgcGFzcyBhcmd1bWVudHMgdG8gcmVtb3RlIGhtcyBwcm9jZXNzLiIpOworCisgIGlmIChleGVjZmlsZSA9PSAwIHx8IGV4ZWNfYmZkID09IDApCisgICAgZXJyb3IgKCJObyBleGVjdXRhYmxlIGZpbGUgc3BlY2lmaWVkIik7CisKKyAgZW50cnlfcHQgPSAoaW50KSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGV4ZWNfYmZkKTsKKyAgY2hlY2tfb3BlbiAoKTsKKworICBobXNfa2lsbCAoTlVMTCwgTlVMTCk7CisgIGhtc19jbGVhcl9icmVha3BvaW50cyAoKTsKKyAgaW5pdF93YWl0X2Zvcl9pbmZlcmlvciAoKTsKKyAgaG1zX3dyaXRlX2NyICgiIik7CisgIGV4cGVjdF9wcm9tcHQgKCk7CisKKyAgaW5zZXJ0X2JyZWFrcG9pbnRzICgpOwkvKiBOZWVkZWQgdG8gZ2V0IGNvcnJlY3QgaW5zdHJ1Y3Rpb24gaW4gY2FjaGUgKi8KKyAgcHJvY2VlZCAoZW50cnlfcHQsIFRBUkdFVF9TSUdOQUxfREVGQVVMVCwgMCk7Cit9CisKKy8qIE9wZW4gYSBjb25uZWN0aW9uIHRvIGEgcmVtb3RlIGRlYnVnZ2VyLgorICAgTkFNRSBpcyB0aGUgZmlsZW5hbWUgdXNlZCBmb3IgY29tbXVuaWNhdGlvbiwgdGhlbiBhIHNwYWNlLAorICAgdGhlbiB0aGUgYmF1ZCByYXRlLgorICovCisKK3N0YXRpYyBjaGFyICoKK2ZpbmRfZW5kX29mX3dvcmQgKHMpCisgICAgIGNoYXIgKnM7Cit7CisgIHdoaWxlICgqcyAmJiAhaXNzcGFjZSAoKnMpKQorICAgIHMrKzsKKyAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBjaGFyICoKK2dldF93b3JkIChwKQorICAgICBjaGFyICoqcDsKK3sKKyAgY2hhciAqcyA9ICpwOworICBjaGFyICp3b3JkOworICBjaGFyICpjb3B5OworICBzaXplX3QgbGVuOworCisgIHdoaWxlIChpc3NwYWNlICgqcykpCisgICAgcysrOworCisgIHdvcmQgPSBzOworCisgIGxlbiA9IDA7CisKKyAgd2hpbGUgKCpzICYmICFpc3NwYWNlICgqcykpCisgICAgeworICAgICAgcysrOworICAgICAgbGVuKys7CisKKyAgICB9CisgIGNvcHkgPSB4bWFsbG9jIChsZW4gKyAxKTsKKyAgbWVtY3B5IChjb3B5LCB3b3JkLCBsZW4pOworICBjb3B5W2xlbl0gPSAwOworICAqcCA9IHM7CisgIHJldHVybiBjb3B5OworfQorCitzdGF0aWMgaW50IGJhdWRyYXRlID0gOTYwMDsKKworc3RhdGljIGludAoraXNfYmF1ZHJhdGVfcmlnaHQgKCkKK3sKKyAgaW50IG9rOworCisgIC8qIFB1dCB0aGlzIHBvcnQgaW50byBOT1JNQUwgbW9kZSwgc2VuZCB0aGUgJ25vcm1hbCcgY2hhcmFjdGVyICovCisKKyAgaG1zX3dyaXRlICgiXDAwMSIsIDEpOwkvKiBDb250cm9sIEEgKi8KKyAgaG1zX3dyaXRlICgiXHJcbiIsIDIpOwkvKiBDciAqLworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIG9rID0gU0VSSUFMX1JFQURDSEFSIChkZXNjLCB0aW1lb3V0KTsKKyAgICAgIGlmIChvayA8IDApCisJYnJlYWs7CisgICAgfQorCisgIGhtc193cml0ZSAoInIiLCAxKTsKKworICBpZiAocmVhZGNoYXJfbm9mYWlsICgpID09ICdyJykKKyAgICByZXR1cm4gMTsKKworICAvKiBOb3QgdGhlIHJpZ2h0IGJhdWRyYXRlLCBvciB0aGUgYm9hcmQncyBub3Qgb24gKi8KKyAgcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZAorc2V0X3JhdGUgKCkKK3sKKyAgaWYgKCFTRVJJQUxfU0VUQkFVRFJBVEUgKGRlc2MsIGJhdWRyYXRlKSkKKyAgICBlcnJvciAoIkNhbid0IHNldCBiYXVkcmF0ZSIpOworfQorCisKKworLyogQ2xvc2Ugb3V0IGFsbCBmaWxlcyBhbmQgbG9jYWwgc3RhdGUgYmVmb3JlIHRoaXMgdGFyZ2V0IGxvc2VzIGNvbnRyb2wuICovCisKK3N0YXRpYyB2b2lkCitobXNfY2xvc2UgKHF1aXR0aW5nKQorICAgICBpbnQgcXVpdHRpbmc7Cit7CisgIC8qIENsZWFyIGFueSBicmVhayBwb2ludHMgKi8KKyAgcmVtb3ZlX2NvbW1hbmRzICgpOworICBobXNfY2xlYXJfYnJlYWtwb2ludHMgKCk7CisgIHNsZWVwICgxKTsJCQkvKiBMZXQgYW55IG91dHB1dCBtYWtlIGl0IGFsbCB0aGUgd2F5IGJhY2sgKi8KKyAgaWYgKGlzX29wZW4pCisgICAgeworICAgICAgU0VSSUFMX1dSSVRFIChkZXNjLCAiUlxyXG4iLCAzKTsKKyAgICAgIFNFUklBTF9DTE9TRSAoZGVzYyk7CisgICAgfQorICBpc19vcGVuID0gMDsKK30KKworLyogVGVybWluYXRlIHRoZSBvcGVuIGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSBkZWJ1Z2dlci4gIFVzZSB0aGlzCisgICB3aGVuIHlvdSB3YW50IHRvIGRldGFjaCBhbmQgZG8gc29tZXRoaW5nIGVsc2Ugd2l0aCB5b3VyIGdkYi4gICovIHZvaWQKK2htc19kZXRhY2ggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGlmIChpc19vcGVuKQorICAgIHsKKyAgICAgIGhtc19jbGVhcl9icmVha3BvaW50cyAoKTsKKyAgICB9CisKKyAgcG9wX3RhcmdldCAoKTsJCS8qIGNhbGxzIGhtc19jbG9zZSB0byBkbyB0aGUgcmVhbCB3b3JrCisJCQkJICovCisgIGlmIChmcm9tX3R0eSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJFbmRpbmcgcmVtb3RlICVzIGRlYnVnZ2luZ1xuIiwKKwkJICAgICB0YXJnZXRfc2hvcnRuYW1lKTsKK30KKworLyogVGVsbCB0aGUgcmVtb3RlIG1hY2hpbmUgdG8gcmVzdW1lLiAgKi8KKwordm9pZAoraG1zX3Jlc3VtZSAocGlkLCBzdGVwLCBzaWcpCisgICAgIGludCBwaWQsIHN0ZXA7CisgICAgIGVudW0gdGFyZ2V0X3NpZ25hbAorICAgICAgIHNpZzsKK3sKKyAgaWYgKHN0ZXApCisgICAgeworICAgICAgaG1zX3dyaXRlX2NyICgicyIpOworICAgICAgZXhwZWN0ICgiU3RlcD4iKTsKKworICAgICAgLyogRm9yY2UgdGhlIG5leHQgaG1zX3dhaXQgdG8gcmV0dXJuIGEgdHJhcC4gIE5vdCBkb2luZyBhbnl0aGluZworICAgICAgICAgYWJvdXQgSS9PIGZyb20gdGhlIHRhcmdldCBtZWFucyB0aGF0IHRoZSB1c2VyIGhhcyB0byB0eXBlICJjb250aW51ZSIKKyAgICAgICAgIHRvIHNlZSBhbnkuICBGSVhNRSwgdGhpcyBzaG91bGQgYmUgZml4ZWQuICAqLworICAgICAgbmVlZF9hcnRpZmljaWFsX3RyYXAgPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGhtc193cml0ZV9jciAoImciKTsKKyAgICAgIGV4cGVjdCAoImciKTsKKyAgICB9Cit9CisKKy8qIFdhaXQgdW50aWwgdGhlIHJlbW90ZSBtYWNoaW5lIHN0b3BzLCB0aGVuIHJldHVybiwgc3RvcmluZyBzdGF0dXMgaW4KKyAgIFNUQVRVUyBqdXN0IGFzIGB3YWl0JyB3b3VsZC4gICovCisKK2ludAoraG1zX3dhaXQgKHBpZCwgc3RhdHVzKQorICAgICBpbnQgcGlkOworICAgICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0YXR1czsKK3sKKyAgLyogU3RyaW5ncyB0byBsb29rIGZvci4gICc/JyBtZWFucyBtYXRjaCBhbnkgc2luZ2xlIGNoYXJhY3Rlci4gIE5vdGUKKyAgICAgdGhhdCB3aXRoIHRoZSBhbGdvcml0aG0gd2UgdXNlLCB0aGUgaW5pdGlhbCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZworICAgICBjYW5ub3QgcmVjdXIgaW4gdGhlIHN0cmluZywgb3Igd2Ugd2lsbCBub3QgZmluZCBzb21lIGNhc2VzIG9mIHRoZQorICAgICBzdHJpbmcgaW4gdGhlIGlucHV0LiAgKi8KKworICBzdGF0aWMgY2hhciBicHRbXSA9ICJBdCBicmVha3BvaW50OiI7CisKKyAgLyogSXQgd291bGQgYmUgdGVtcHRpbmcgdG8gbG9vayBmb3IgIlxuW19fZXhpdCArIDB4OF1cbiIgYnV0IHRoYXQKKyAgICAgcmVxdWlyZXMgbG9hZGluZyBzeW1ib2xzIHdpdGggInljIGkiIGFuZCBldmVuIGlmIHdlIGRpZCBkbyB0aGF0IHdlCisgICAgIGRvbid0IGtub3cgdGhhdCB0aGUgZmlsZSBoYXMgc3ltYm9scy4gICovCisgIHN0YXRpYyBjaGFyIGV4aXRtc2dbXSA9ICJITVM+IjsKKyAgY2hhciAqYnAgPSBicHQ7CisgIGNoYXIgKmVwID0gZXhpdG1zZzsKKworICAvKiBMYXJnZSBlbm91Z2ggZm9yIGVpdGhlciBzaXplb2YgKGJwdCkgb3Igc2l6ZW9mIChleGl0bXNnKSBjaGFycy4KKyAgICovCisgIGNoYXIgc3dhbGxvd2VkWzUwXTsKKworICAvKiBDdXJyZW50IHBvc2l0aW9uIGluIHN3YWxsb3dlZC4gICovCisgIGNoYXIgKnN3YWxsb3dlZF9wID0gc3dhbGxvd2VkOworCisgIGludCBjaDsKKyAgaW50IGNoX2hhbmRsZWQ7CisgIGludCBvbGRfdGltZW91dCA9IHRpbWVvdXQ7CisgIGludAorICAgIG9sZF9pbW1lZGlhdGVfcXVpdCA9IGltbWVkaWF0ZV9xdWl0OworICBpbnQgc3dhbGxvd2VkX2NyID0gMDsKKworICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVEOworICBzdGF0dXMtPnZhbHVlLmludGVnZXIgPSAwOworCisgIGlmIChuZWVkX2FydGlmaWNpYWxfdHJhcCAhPSAwKQorICAgIHsKKyAgICAgIHN0YXR1cy0+a2luZCA9CisJVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVFJBUDsKKyAgICAgIG5lZWRfYXJ0aWZpY2lhbF90cmFwLS07CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgdGltZW91dCA9IDU7CQkJLyogRG9uJ3QgdGltZSBvdXQgZm9yIGEgd2hpbGUgLSB1c2VyIHByb2dyYW0gaXMgcnVubmluZy4KKwkJCQkgKi8KKyAgaW1tZWRpYXRlX3F1aXQgPSAxOwkJLyogSGVscHMgYWJpbGl0eSB0byBRVUlUICovCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIFFVSVQ7CQkJLyogTGV0IHVzZXIgcXVpdCBhbmQgbGVhdmUgcHJvY2VzcyBydW5uaW5nICovCisgICAgICBjaF9oYW5kbGVkID0gMDsKKyAgICAgIGNoID0gcmVhZGNoYXIgKCk7CisgICAgICBpZiAoY2ggPT0gKmJwKQorCXsKKwkgIGJwKys7CisJICBpZiAoKmJwID09ICdcMCcpCisJICAgIGJyZWFrOworCSAgY2hfaGFuZGxlZCA9IDE7CisKKwkgICpzd2FsbG93ZWRfcCsrID0gY2g7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJwID0gYnB0OworCX0KKyAgICAgIGlmCisJKGNoID09ICplcCB8fCAqZXAgPT0gJz8nKQorCXsKKwkgIGVwKys7CisJICBpZiAoKmVwID09ICdcMCcpCisJICAgIGJyZWFrOworCisJICBpZiAoIWNoX2hhbmRsZWQpCisJICAgICpzd2FsbG93ZWRfcCsrID0gY2g7CisJICBjaF9oYW5kbGVkID0KKwkgICAgMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZXAgPSBleGl0bXNnOworCX0KKworICAgICAgaWYgKCFjaF9oYW5kbGVkKQorCXsKKwkgIGNoYXIgKnA7CisKKwkgIC8qIFByaW50IG91dCBhbnkgY2hhcmFjdGVycyB3aGljaCBoYXZlIGJlZW4gc3dhbGxvd2VkLiAgKi8KKwkgIGZvciAocCA9IHN3YWxsb3dlZDsgcCA8IHN3YWxsb3dlZF9wOyArK3ApCisJICAgIHB1dGNoYXJfdW5maWx0ZXJlZCAoKnApOworCSAgc3dhbGxvd2VkX3AgPSBzd2FsbG93ZWQ7CisKKwkgIGlmICgoY2ggIT0gJ1xyJyAmJiBjaCAhPSAnXG4nKSB8fCBzd2FsbG93ZWRfY3IgPiAxMCkKKwkgICAgeworCSAgICAgIHB1dGNoYXJfdW5maWx0ZXJlZCAoY2gpOworCSAgICAgIHN3YWxsb3dlZF9jciA9IDEwOworCSAgICB9CisJICBzd2FsbG93ZWRfY3IrKzsKKworCX0KKyAgICB9CisgIGlmICgqYnAgPT0gJ1wwJykKKyAgICB7CisgICAgICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKyAgICAgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQOworICAgICAgZXhwZWN0X3Byb21wdCAoKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVEOworICAgICAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0KKwlUQVJHRVRfU0lHTkFMX1NUT1A7CisgICAgfQorCisgIHRpbWVvdXQgPSBvbGRfdGltZW91dDsKKyAgaW1tZWRpYXRlX3F1aXQgPSBvbGRfaW1tZWRpYXRlX3F1aXQ7CisgIHJldHVybgorICAgIDA7Cit9CisKKy8qIFJldHVybiB0aGUgbmFtZSBvZiByZWdpc3RlciBudW1iZXIgUkVHTk8gaW4gdGhlIGZvcm0gaW5wdXQgYW5kCisgICBvdXRwdXQgYnkgaG1zLgorCisgICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0YXRpYyBidWZmZXIgY29udGFpbmluZyB0aGUgYW5zd2VyLiAgKi8KK3N0YXRpYyBjaGFyICoKK2dldF9yZWdfbmFtZSAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgc3RhdGljIGNoYXIgKnJuW10gPQorICBSRUdJU1RFUl9OQU1FUzsKKworICByZXR1cm4gcm5bcmVnbm9dOworfQorCisvKiBSZWFkIHRoZSByZW1vdGUgcmVnaXN0ZXJzLiAgKi8KKworc3RhdGljIGludAorZ2V0aGV4IChsZW5ndGgsIHN0YXJ0LCBvaykKKyAgICAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyAgICAgY2hhciAqc3RhcnQ7CisgICAgIGludCAqb2s7Cit7CisgIGludCByZXN1bHQgPSAwOworCisgIHdoaWxlIChsZW5ndGgtLSkKKyAgICB7CisgICAgICByZXN1bHQgPDw9IDQ7CisgICAgICBpZiAoKnN0YXJ0ID49ICdhJyAmJiAqc3RhcnQgPD0gJ2YnKQorCXsKKwkgIHJlc3VsdCArPSAqc3RhcnQgLSAnYScgKyAxMDsKKwl9CisgICAgICBlbHNlIGlmICgqc3RhcnQgPj0gJ0EnICYmCisJICAgICAgICpzdGFydCA8PSAnRicpCisJeworCSAgcmVzdWx0ICs9ICpzdGFydCAtICdBJyArIDEwOworCX0KKyAgICAgIGVsc2UgaWYKKwkoKnN0YXJ0ID49ICcwJyAmJiAqc3RhcnQgPD0gJzknKQorCXsKKwkgIHJlc3VsdCArPSAqc3RhcnQgLSAnMCc7CisJfQorICAgICAgZWxzZQorCSpvayA9IDA7CisgICAgICBzdGFydCsrOworCisgICAgfQorICByZXR1cm4gcmVzdWx0OworfQorc3RhdGljIGludAordGltZWRfcmVhZCAoYnVmLCBuLCB0aW1lb3V0KQorICAgICBjaGFyCisgICAgICAqYnVmOworCit7CisgIGludCBpOworICBjaGFyIGM7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbikKKyAgICB7CisgICAgICBjID0gcmVhZGNoYXIgKCk7CisKKyAgICAgIGlmIChjID09IDApCisJcmV0dXJuIGk7CisgICAgICBidWZbaV0gPSBjOworICAgICAgaSsrOworCisgICAgfQorICByZXR1cm4gaTsKK30KKworaG1zX3dyaXRlIChhLCBsKQorICAgICBjaGFyICphOworeworICBpbnQgaTsKKworICBTRVJJQUxfV1JJVEUgKGRlc2MsIGEsIGwpOworCisgIGlmICghcXVpZXQgfHwgcmVtb3RlX2RlYnVnKQorICAgIHsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiPCIpOworICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykKKwl7CisJICBwcmludGZfdW5maWx0ZXJlZCAoIiVjIiwgYVtpXSk7CisJfQorICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCI+Iik7CisgICAgfQorfQorCitobXNfd3JpdGVfY3IgKHMpCisgICAgIGNoYXIgKnM7Cit7CisgIGhtc193cml0ZSAocywgc3RybGVuIChzKSk7CisgIGhtc193cml0ZSAoIlxyXG4iLCAyKTsKK30KKworI2lmZGVmIEdEQl9UQVJHRVRfSVNfSDg1MDAKKworLyogSDgvNTAwIG1vbml0b3IgcmVnIGR1bXAgbG9va3MgbGlrZToKKworICAgSE1TPnIKKyAgIFBDOjgwMDAgU1I6MDcwQyAuN05aLi4gQ1A6MDAgRFA6MDAgRVA6MDAgVFA6MDAgQlI6MDAKKyAgIFIwLVI3OiBGRjVBIDAwMDEgRjRGRSBGNTAwIDAwMDAgRjUyOCBGNTI4IEY0RUUKKyAgIEhNUz4KKworCisgKi8KKworc3VwcGx5X3ZhbCAobiwgc2l6ZSwgcHRyLCBzZWdwdHIpCisgICAgIGludCBuOworICAgICBpbnQgc2l6ZTsKKyAgICAgY2hhciAqcHRyOworICAgICBjaGFyICpzZWdwdHI7Cit7CisgIGludCBvazsKKyAgY2hhciByYXdbNF07CisgIHN3aXRjaCAoc2l6ZSkKKyAgICB7CisgICAgY2FzZSAyOgorICAgICAgcmF3WzBdID0gZ2V0aGV4ICgyLCBwdHIsICZvayk7CisgICAgICByYXdbMV0gPSBnZXRoZXggKDIsIHB0ciArIDIsICZvayk7CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKG4sIHJhdyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICByYXdbMF0gPSBnZXRoZXggKDIsIHB0ciwgJm9rKTsKKyAgICAgIHN1cHBseV9yZWdpc3RlciAobiwgcmF3KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIHsKKwlpbnQgdiA9IGdldGhleCAoNCwgcHRyLCAmb2spOworCXYgfD0gZ2V0aGV4ICgyLCBzZWdwdHIsICZvaykgPDwgMTY7CisJcmF3WzBdID0gMDsKKwlyYXdbMV0gPSAodiA+PiAxNikgJiAweGZmOworCXJhd1syXSA9ICh2ID4+IDgpICYgMHhmZjsKKwlyYXdbM10gPSAodiA+PiAwKSAmIDB4ZmY7CisJc3VwcGx5X3JlZ2lzdGVyIChuLCByYXcpOworICAgICAgfQorICAgIH0KKworfQorc3RhdGljIHZvaWQKK2htc19mZXRjaF9yZWdpc3RlciAoZHVtbXkpCisgICAgIGludCBkdW1teTsKK3sKKyNkZWZpbmUgUkVHUkVQTFlfU0laRSAxMDgKKyAgY2hhciBsaW5lYnVmW1JFR1JFUExZX1NJWkUgKyAxXTsKKyAgaW50IGk7CisgIGludCBzOworICBpbnQgZ290dG9rOworCisgIExPTkdFU1QgcmVnW05VTV9SRUdTXTsKKyAgY2hlY2tfb3BlbiAoKTsKKworICBkbworICAgIHsKKworICAgICAgaG1zX3dyaXRlX2NyICgiciIpOworICAgICAgZXhwZWN0ICgiciIpOworICAgICAgcyA9IHRpbWVkX3JlYWQgKGxpbmVidWYgKyAxLCBSRUdSRVBMWV9TSVpFLCAxKTsKKworICAgICAgbGluZWJ1ZltSRUdSRVBMWV9TSVpFXSA9IDA7CisgICAgICBnb3R0b2sgPSAwOworICAgICAgaWYgKGxpbmVidWZbM10gPT0gJ1AnICYmCisJICBsaW5lYnVmWzRdID09ICdDJyAmJgorCSAgbGluZWJ1Zls1XSA9PSAnOicgJiYKKwkgIGxpbmVidWZbMTA1XSA9PSAnSCcgJiYKKwkgIGxpbmVidWZbMTA2XSA9PSAnTScgJiYKKwkgIGxpbmVidWZbMTA3XSA9PSAnUycpCisJeworCisJICAvKgorCSAgICAgMDEyCisJICAgICByKioKKwkgICAgIC0tLS0tLS0xLS0tLS0tLS0tMi0tLS0tLS0tLTMtLS0tLS0tLS00LS0tLS0tLS0tNS0tLS0tCisJICAgICAzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTYKKwkgICAgIFBDOjgwMDAgU1I6MDcwQyAuN05aLi4gQ1A6MDAgRFA6MDAgRVA6MDAgVFA6MDAgQlI6MDAqKgorCSAgICAgLS0tNi0tLS0tLS0tLTctLS0tLS0tLS04LS0tLS0tLS0tOS0tLS0tLS0tMTAtLS0tCisJICAgICA3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQKKwkgICAgIFIwLVI3OiBGRjVBIDAwMDEgRjRGRSBGNTAwIDAwMDAgRjUyOCBGNTI4IEY0RUUqKgorCisJICAgICA1Njc4OQorCSAgICAgSE1TPgorCSAgICovCisJICBnb3R0b2sgPSAxOworCisKKwkgIHN1cHBseV92YWwgKFBDX1JFR05VTSwgNCwgbGluZWJ1ZiArIDYsIGxpbmVidWYgKyAyOSk7CisKKwkgIHN1cHBseV92YWwgKENDUl9SRUdOVU0sIDIsIGxpbmVidWYgKyAxNCk7CisJICBzdXBwbHlfdmFsIChTRUdfQ19SRUdOVU0sIDEsIGxpbmVidWYgKyAyOSk7CisJICBzdXBwbHlfdmFsIChTRUdfRF9SRUdOVU0sIDEsIGxpbmVidWYgKyAzNSk7CisJICBzdXBwbHlfdmFsIChTRUdfRV9SRUdOVU0sIDEsIGxpbmVidWYgKyA0MSk7CisJICBzdXBwbHlfdmFsIChTRUdfVF9SRUdOVU0sIDEsIGxpbmVidWYgKyA0Nyk7CisJICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCSAgICB7CisJICAgICAgc3RhdGljIGludCBzcls4XSA9CisJICAgICAgezM1LCAzNSwgMzUsIDM1LAorCSAgICAgICA0MSwgNDEsIDQ3LCA0N307CisKKwkgICAgICBjaGFyIHJhd1s0XTsKKwkgICAgICBjaGFyICpzcmMgPSBsaW5lYnVmICsgNjQgKyA1ICogaTsKKwkgICAgICBjaGFyICpzZWdzcmMgPSBsaW5lYnVmICsgc3JbaV07CisJICAgICAgc3VwcGx5X3ZhbCAoUjBfUkVHTlVNICsgaSwgMiwgc3JjKTsKKwkgICAgICBzdXBwbHlfdmFsIChQUjBfUkVHTlVNICsgaSwgNCwgc3JjLCBzZWdzcmMpOworCSAgICB9CisJfQorICAgICAgaWYgKCFnb3R0b2spCisJeworCSAgaG1zX3dyaXRlX2NyICgiIik7CisJICBleHBlY3QgKCJITVM+Iik7CisJfQorICAgIH0KKyAgd2hpbGUgKCFnb3R0b2spOworfQorI2VuZGlmCisKKyNpZmRlZiBHREJfVEFSR0VUX0lTX0g4MzAwCitzdGF0aWMgdm9pZAoraG1zX2ZldGNoX3JlZ2lzdGVyIChkdW1teSkKKyAgICAgaW50IGR1bW15OworeworI2RlZmluZSBSRUdSRVBMWV9TSVpFIDc5CisgIGNoYXIgbGluZWJ1ZltSRUdSRVBMWV9TSVpFICsgMV07CisgIGludCBpOworICBpbnQgczsKKyAgaW50IGdvdHRvazsKKworICBVTE9OR0VTVCByZWdbTlVNX1JFR1NdOworCisgIGNoZWNrX29wZW4gKCk7CisKKyAgZG8KKyAgICB7CisgICAgICBobXNfd3JpdGVfY3IgKCJyIik7CisKKyAgICAgIHMgPSB0aW1lZF9yZWFkIChsaW5lYnVmLCAxLCAxKTsKKworICAgICAgd2hpbGUgKGxpbmVidWZbMF0gIT0gJ3InKQorCXMgPSB0aW1lZF9yZWFkIChsaW5lYnVmLCAxLCAxKTsKKworICAgICAgcyA9IHRpbWVkX3JlYWQgKGxpbmVidWYgKyAxLCBSRUdSRVBMWV9TSVpFIC0gMSwgMSk7CisKKyAgICAgIGxpbmVidWZbUkVHUkVQTFlfU0laRV0gPSAwOworICAgICAgZ290dG9rID0gMDsKKyAgICAgIGlmIChsaW5lYnVmWzBdID09ICdyJyAmJgorCSAgbGluZWJ1ZlszXSA9PSAnUCcgJiYKKwkgIGxpbmVidWZbNF0gPT0gJ0MnICYmCisJICBsaW5lYnVmWzVdID09ICc9JyAmJgorCSAgbGluZWJ1Zls3NV0gPT0gJ0gnICYmCisJICBsaW5lYnVmWzc2XSA9PSAnTScgJiYKKwkgIGxpbmVidWZbNzddID09ICdTJykKKwl7CisJICAvKgorCSAgICAgUEM9WFhYWCBDQ1I9WFg6WFhYWFhYWFggUjAtUjc9IFhYWFggWFhYWCBYWFhYIFhYWFggWFhYWCBYWFhYIFhYWFggWFhYWAorCSAgICAgNTQzNjc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMgorCSAgICAgMCAgICAgIDEgICAgICAgICAyICAgICAgICAgMyAgICAgICAgIDQgICAgICAgICA1ICAgICAgICAgNgorCSAgICovCisJICBnb3R0b2sgPSAxOworCisJICByZWdbUENfUkVHTlVNXSA9IGdldGhleCAoNCwgbGluZWJ1ZiArIDYsICZnb3R0b2spOworCSAgcmVnW0NDUl9SRUdOVU1dID0gZ2V0aGV4ICgyLCBsaW5lYnVmICsgMTUsICZnb3R0b2spOworCSAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkgICAgeworCSAgICAgIHJlZ1tpXSA9IGdldGhleCAoNCwgbGluZWJ1ZiArIDM0ICsgNSAqIGksICZnb3R0b2spOworCSAgICB9CisJfQorICAgIH0KKyAgd2hpbGUgKCFnb3R0b2spOworICBmb3IgKGkgPSAwOyBpIDwgTlVNX1JFR1M7IGkrKykKKyAgICB7CisgICAgICBjaGFyIHN3YXBwZWRbMl07CisKKyAgICAgIHN3YXBwZWRbMV0gPSByZWdbaV07CisgICAgICBzd2FwcGVkWzBdID0gKHJlZ1tpXSkgPj4gODsKKworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChpLCBzd2FwcGVkKTsKKyAgICB9Cit9CisjZW5kaWYKKy8qIFN0b3JlIHJlZ2lzdGVyIFJFR05PLCBvciBhbGwgaWYgUkVHTk8gPT0gLTEuCisgICBSZXR1cm4gZXJybm8gdmFsdWUuICAqLworc3RhdGljIHZvaWQKK2htc19zdG9yZV9yZWdpc3RlciAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgaWYgKHJlZ25vID09IC0xKQorICAgIHsKKyAgICAgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IE5VTV9SRUdTOyByZWdubysrKQorCXsKKwkgIGhtc19zdG9yZV9yZWdpc3RlciAocmVnbm8pOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyICpuYW1lID0gZ2V0X3JlZ19uYW1lIChyZWdubyk7CisgICAgICBjaGFyIGJ1ZmZlclsxMDBdOworICAgICAgLyogU29tZSByZWdzIGRvbnQgcmVhbGx5IGV4aXN0ICovCisgICAgICBpZiAoIShuYW1lWzBdID09ICdwJyAmJiBuYW1lWzFdID09ICdyJykKKwkgICYmICEobmFtZVswXSA9PSAnYycgJiYgbmFtZVsxXSA9PSAneScpCisJICAmJiAhKG5hbWVbMF0gPT0gJ3QnICYmIG5hbWVbMV0gPT0gJ2knKQorCSAgJiYgIShuYW1lWzBdID09ICdpJyAmJiBuYW1lWzFdID09ICduJykpCisJeworCSAgc3ByaW50ZiAoYnVmZmVyLCAiciAlcz0leCIsIG5hbWUsIHJlYWRfcmVnaXN0ZXIgKHJlZ25vKSk7CisJICBobXNfd3JpdGVfY3IgKGJ1ZmZlcik7CisJICBleHBlY3RfcHJvbXB0ICgpOworCX0KKyAgICB9Cit9CisKKworLyogR2V0IHJlYWR5IHRvIG1vZGlmeSB0aGUgcmVnaXN0ZXJzIGFycmF5LiAgT24gbWFjaGluZXMgd2hpY2ggc3RvcmUKKyAgIGluZGl2aWR1YWwgcmVnaXN0ZXJzLCB0aGlzIGRvZXNuJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gIE9uIG1hY2hpbmVzCisgICB3aGljaCBzdG9yZSBhbGwgdGhlIHJlZ2lzdGVycyBpbiBvbmUgZmVsbCBzd29vcCwgdGhpcyBtYWtlcyBzdXJlCisgICB0aGF0IHJlZ2lzdGVycyBjb250YWlucyBhbGwgdGhlIHJlZ2lzdGVycyBmcm9tIHRoZSBwcm9ncmFtIGJlaW5nCisgICBkZWJ1Z2dlZC4gICovCisKK3ZvaWQKK2htc19wcmVwYXJlX3RvX3N0b3JlICgpCit7CisgIC8qIERvIG5vdGhpbmcsIHNpbmNlIHdlIGNhbiBzdG9yZSBpbmRpdmlkdWFsIHJlZ3MgKi8KK30KKworc3RhdGljIENPUkVfQUREUgordHJhbnNsYXRlX2FkZHIgKGFkZHIpCisgICAgIENPUkVfQUREUiBhZGRyOworeworCisgIHJldHVybiAoYWRkcik7CisKK30KKworCitpbnQKK2htc194ZmVyX2luZmVyaW9yX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4sIHdyaXRlLCB0YXJnZXQpCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47CisgICAgIGludCB3cml0ZTsKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldDsJLyogaWdub3JlZCAqLworeworCisgIHJldHVybiBsZW47Cit9CisKK2ludAoraG1zX3dyaXRlX2luZmVyaW9yX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICB1bnNpZ25lZCBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47Cit7CisgIGJmZF92bWEgYWRkcjsKKyAgaW50IGRvbmU7CisgIGludCB0b2RvOworICBjaGFyIGJ1ZmZlclsxMDBdOworICBkb25lID0gMDsKKyAgaG1zX3dyaXRlX2NyICgiLiIpOworICBleHBlY3RfcHJvbXB0ICgpOworICB3aGlsZSAoZG9uZSA8IGxlbikKKyAgICB7CisgICAgICBjaGFyICpwdHIgPSBidWZmZXI7CisgICAgICBpbnQgdGhpc2dvOworICAgICAgaW50IGlkeDsKKworICAgICAgdGhpc2dvID0gbGVuIC0gZG9uZTsKKyAgICAgIGlmICh0aGlzZ28gPiAyMCkKKwl0aGlzZ28gPSAyMDsKKworICAgICAgc3ByaW50ZiAocHRyLCAiTS5CICU0eCA9IiwgbWVtYWRkciArIGRvbmUpOworICAgICAgcHRyICs9IDEwOworICAgICAgZm9yIChpZHggPSAwOyBpZHggPCB0aGlzZ287IGlkeCsrKQorCXsKKwkgIHNwcmludGYgKHB0ciwgIiUyeCAiLCBteWFkZHJbaWR4ICsgZG9uZV0pOworCSAgcHRyICs9IDM7CisJfQorICAgICAgaG1zX3dyaXRlX2NyIChidWZmZXIpOworICAgICAgZXhwZWN0X3Byb21wdCAoKTsKKyAgICAgIGRvbmUgKz0gdGhpc2dvOworICAgIH0KK30KKwordm9pZAoraG1zX2ZpbGVzX2luZm8gKCkKK3sKKyAgY2hhciAqZmlsZSA9ICJub3RoaW5nIjsKKworICBpZiAoZXhlY19iZmQpCisgICAgZmlsZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGV4ZWNfYmZkKTsKKworICBpZiAoZXhlY19iZmQpCisjaWZkZWYgX19HTzMyX18KKyAgICBwcmludGZfZmlsdGVyZWQgKCJcdEF0dGFjaGVkIHRvIERPUyBhc3luY3RzciBhbmQgcnVubmluZyBwcm9ncmFtICVzXG4iLCBmaWxlKTsKKyNlbHNlCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXHRBdHRhY2hlZCB0byAlcyBhdCAlZCBiYXVkIGFuZCBydW5uaW5nIHByb2dyYW0gJXNcbiIsIGRldl9uYW1lLCBiYXVkcmF0ZSwgZmlsZSk7CisjZW5kaWYKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXHRvbiBhbiBIOC8zMDAgcHJvY2Vzc29yLlxuIik7Cit9CisKKy8qIENvcHkgTEVOIGJ5dGVzIG9mIGRhdGEgZnJvbSBkZWJ1Z2dlciBtZW1vcnkgYXQgTVlBRERSCisgICB0byBpbmZlcmlvcidzIG1lbW9yeSBhdCBNRU1BRERSLiAgUmV0dXJucyBlcnJubyB2YWx1ZS4KKyAgICogc2Ivc2ggaW5zdHJ1Y3Rpb25zIGRvbid0IHdvcmsgb24gdW5hbGlnbmVkIGFkZHJlc3Nlcywgd2hlbiBUVT0xLgorICovCisKKy8qIFJlYWQgTEVOIGJ5dGVzIGZyb20gaW5mZXJpb3IgbWVtb3J5IGF0IE1FTUFERFIuICBQdXQgdGhlIHJlc3VsdAorICAgYXQgZGVidWdnZXIgYWRkcmVzcyBNWUFERFIuICBSZXR1cm5zIGVycm5vIHZhbHVlLiAgKi8KK2ludAoraG1zX3JlYWRfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgLyogQWxpZ24gdG8gbmVhcmVzdCBsb3cgMTYgYml0cyAqLworICBpbnQgaTsKKworICBDT1JFX0FERFIgc3RhcnQgPSBtZW1hZGRyOworICBDT1JFX0FERFIgZW5kID0gbWVtYWRkciArIGxlbiAtIDE7CisKKyAgaW50IG9rID0gMTsKKworICAvKgorICAgICBBQUFBOiBYWFhYIFhYWFggWFhYWCBYWFhYIFhYWFggWFhYWCBYWFhYIFhYWFggJy4uLi4uLi4uLi4uLi4uLi4nCisgICAgIDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NQorICAgICAwICAgICAgICAgMSAgICAgICAgIDIgICAgICAgICAzICAgICAgICAgNCAgICAgICAgIDUgICAgICAgICA2CisgICAqLworICBjaGFyIGJ1ZmZlcls2Nl07CisKKyAgaWYgKG1lbWFkZHIgJiAweGYpCisgICAgYWJvcnQgKCk7CisgIGlmIChsZW4gIT0gMTYpCisgICAgYWJvcnQgKCk7CisKKyAgc3ByaW50ZiAoYnVmZmVyLCAibSAlNHggJTR4Iiwgc3RhcnQgJiAweGZmZmYsIGVuZCAmIDB4ZmZmZik7CisKKyAgZmx1c2ggKCk7CisgIGhtc193cml0ZV9jciAoYnVmZmVyKTsKKyAgLyogZHJvcCB0aGUgZWNobyBhbmQgbmV3bGluZSAqLworICBmb3IgKGkgPSAwOyBpIDwgMTM7IGkrKykKKyAgICByZWFkY2hhciAoKTsKKworICAvKiBHcmFiIHRoZSBsaW5lcyBhcyB0aGV5IGNvbWUgb3V0IGFuZCBmaWxsIHRoZSBhcmVhICovCisgIC8qIFNraXAgb3ZlciBjciAqLworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpbnQgcDsKKyAgICAgIGludCBpOworICAgICAgaW50IGFkZHI7CisgICAgICBzaXplX3QgaWR4OworCisgICAgICBjaGFyIGJ5dGVbMTZdOworCisgICAgICBidWZmZXJbMF0gPSByZWFkY2hhciAoKTsKKyAgICAgIHdoaWxlIChidWZmZXJbMF0gPT0gJ1xyJworCSAgICAgfHwgYnVmZmVyWzBdID09ICdcbicpCisJYnVmZmVyWzBdID0gcmVhZGNoYXIgKCk7CisKKyAgICAgIGlmIChidWZmZXJbMF0gPT0gJ00nKQorCWJyZWFrOworCisgICAgICBmb3IgKGkgPSAxOyBpIDwgNTA7IGkrKykKKwl7CisJICBidWZmZXJbaV0gPSByZWFkY2hhciAoKTsKKwl9CisgICAgICAvKiBzb21ldGltZXMgd2UgbG9vc2UgY2hhcmFjdGVycyBpbiB0aGUgYXNjaWkgcmVwcmVzZW50YXRpb24gb2YgdGhlIAorICAgICAgICAgZGF0YS4gIEkgZG9uJ3Qga25vdyB3aGVyZS4gIFNvIGp1c3Qgc2NhbiBmb3IgdGhlIGVuZCBvZiBsaW5lICovCisgICAgICBpID0gcmVhZGNoYXIgKCk7CisgICAgICB3aGlsZSAoaSAhPSAnXG4nICYmIGkgIT0gJ1xyJykKKwlpID0gcmVhZGNoYXIgKCk7CisKKyAgICAgIC8qIE5vdyBwYXJzZSB0aGUgbGluZSAqLworCisgICAgICBhZGRyID0gZ2V0aGV4ICg0LCBidWZmZXIsICZvayk7CisgICAgICBpZHggPSA2OworICAgICAgZm9yIChwID0gMDsgcCA8IDE2OyBwICs9IDIpCisJeworCSAgYnl0ZVtwXSA9IGdldGhleCAoMiwgYnVmZmVyICsgaWR4LCAmb2spOworCSAgYnl0ZVtwICsgMV0gPSBnZXRoZXggKDIsIGJ1ZmZlciArIGlkeCArIDIsICZvayk7CisJICBpZHggKz0gNTsKKwl9CisKKyAgICAgIGZvciAocCA9IDA7IHAgPCAxNjsgcCsrKQorCXsKKwkgIGlmIChhZGRyICsgcCA+PSBtZW1hZGRyICYmCisJICAgICAgYWRkciArIHAgPCBtZW1hZGRyICsgbGVuKQorCSAgICB7CisJICAgICAgbXlhZGRyWyhhZGRyICsgcCkgLSBtZW1hZGRyXSA9IGJ5dGVbcF07CisKKwkgICAgfQorCisJfQorICAgIH0KKyNpZmRlZiBHREJfVEFSR0VUX0lTX0g4NTAwCisgIGV4cGVjdCAoIm9yZT4iKTsKKyNlbmRpZgorI2lmZGVmIEdEQl9UQVJHRVRfSVNfSDgzMDAKKyAgZXhwZWN0ICgiZW1vcnk+Iik7CisjZW5kaWYKKyAgaG1zX3dyaXRlX2NyICgiLiIpOworCisgIGV4cGVjdF9wcm9tcHQgKCk7CisgIHJldHVybiBsZW47Cit9CisKKworCisjZGVmaW5lIE1BWF9CUkVBS1MJMTYKK3N0YXRpYyBpbnQgbnVtX2Jya3B0cyA9IDA7CitzdGF0aWMgaW50CitobXNfaW5zZXJ0X2JyZWFrcG9pbnQgKGFkZHIsIHNhdmUpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpzYXZlOwkJLyogVGhyb3cgYXdheSwgbGV0IGhtcyBzYXZlIGluc3RydWN0aW9ucyAqLworeworICBjaGVja19vcGVuICgpOworCisgIGlmIChudW1fYnJrcHRzIDwgTUFYX0JSRUFLUykKKyAgICB7CisgICAgICBjaGFyIGJ1ZmZlclsxMDBdOworCisgICAgICBudW1fYnJrcHRzKys7CisgICAgICBzcHJpbnRmIChidWZmZXIsICJiICV4IiwgYWRkciAmIDB4ZmZmZik7CisgICAgICBobXNfd3JpdGVfY3IgKGJ1ZmZlcik7CisgICAgICBleHBlY3RfcHJvbXB0ICgpOworICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChnZGJfc3RkZXJyLAorCQkgICAgICAiVG9vIG1hbnkgYnJlYWsgcG9pbnRzLCBicmVhayBwb2ludCBub3QgaW5zdGFsbGVkXG4iKTsKKyAgICAgIHJldHVybiAoMSk7CisgICAgfQorCit9CitzdGF0aWMgaW50CitobXNfcmVtb3ZlX2JyZWFrcG9pbnQgKGFkZHIsIHNhdmUpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpzYXZlOwkJLyogVGhyb3cgYXdheSwgbGV0IGhtcyBzYXZlIGluc3RydWN0aW9ucyAqLworeworICBpZiAobnVtX2Jya3B0cyA+IDApCisgICAgeworICAgICAgY2hhciBidWZmZXJbMTAwXTsKKworICAgICAgbnVtX2Jya3B0cy0tOworICAgICAgc3ByaW50ZiAoYnVmZmVyLCAiYiAtICV4IiwgYWRkciAmIDB4ZmZmZik7CisgICAgICBobXNfd3JpdGVfY3IgKGJ1ZmZlcik7CisgICAgICBleHBlY3RfcHJvbXB0ICgpOworCisgICAgfQorICByZXR1cm4gKDApOworfQorCisvKiBDbGVhciB0aGUgaG1zcyBub3Rpb24gb2Ygd2hhdCB0aGUgYnJlYWsgcG9pbnRzIGFyZSAqLworc3RhdGljIGludAoraG1zX2NsZWFyX2JyZWFrcG9pbnRzICgpCit7CisKKyAgaWYgKGlzX29wZW4pCisgICAgeworICAgICAgaG1zX3dyaXRlX2NyICgiYiAtIik7CisgICAgICBleHBlY3RfcHJvbXB0ICgpOworICAgIH0KKyAgbnVtX2Jya3B0cyA9IDA7Cit9CitzdGF0aWMgdm9pZAoraG1zX21vdXJuICgpCit7CisgIGhtc19jbGVhcl9icmVha3BvaW50cyAoKTsKKyAgdW5wdXNoX3RhcmdldCAoJmhtc19vcHMpOworICBnZW5lcmljX21vdXJuX2luZmVyaW9yICgpOworfQorCisvKiBQdXQgYSBjb21tYW5kIHN0cmluZywgaW4gYXJncywgb3V0IHRvIHRoZSBobXMuICBUaGUgaG1zIGlzIGFzc3VtZWQgdG8KKyAgIGJlIGluIHJhdyBtb2RlLCBhbGwgd3JpdGluZy9yZWFkaW5nIGRvbmUgdGhyb3VnaCBkZXNjLgorICAgT3VwdXQgZnJvbSB0aGUgaG1zIGlzIHBsYWNlZCBvbiB0aGUgdXNlcnMgdGVybWluYWwgdW50aWwgdGhlCisgICBwcm9tcHQgZnJvbSB0aGUgaG1zIGlzIHNlZW4uCisgICBGSVhNRTogQ2FuJ3QgaGFuZGxlIGNvbW1hbmRzIHRoYXQgdGFrZSBpbnB1dC4gICovCisKK3ZvaWQKK2htc19jb20gKGFyZ3MsIGZyb210dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tdHR5OworeworICBjaGVja19vcGVuICgpOworCisgIGlmICghYXJncykKKyAgICByZXR1cm47CisKKyAgLyogQ2xlYXIgYWxsIGlucHV0IHNvIG9ubHkgY29tbWFuZCByZWxhdGl2ZSBvdXRwdXQgaXMgZGlzcGxheWVkICovCisKKyAgaG1zX3dyaXRlX2NyIChhcmdzKTsKKy8qICBobXNfd3JpdGUgKCJcMDMwIiwgMSk7ICovCisgIGV4cGVjdF9wcm9tcHQgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitobXNfb3BlbiAobmFtZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgdW5zaWduZWQgaW50IHBybDsKKyAgY2hhciAqcDsKKworICBpZiAobmFtZSA9PSAwKQorICAgIHsKKyAgICAgIG5hbWUgPSAiIjsKKyAgICB9CisgIGlmIChpc19vcGVuKQorICAgIGhtc19jbG9zZSAoMCk7CisgIGRldl9uYW1lID0gc3RyZHVwIChuYW1lKTsKKworICBpZiAoIShkZXNjID0gU0VSSUFMX09QRU4gKGRldl9uYW1lKSkpCisgICAgcGVycm9yX3dpdGhfbmFtZSAoKGNoYXIgKikgZGV2X25hbWUpOworCisgIFNFUklBTF9SQVcgKGRlc2MpOworICBpc19vcGVuID0gMTsKKyAgcHVzaF90YXJnZXQgKCZobXNfb3BzKTsKKyAgZGNhY2hlX3B0ciA9IGRjYWNoZV9pbml0IChobXNfcmVhZF9pbmZlcmlvcl9tZW1vcnksCisJCQkgICAgaG1zX3dyaXRlX2luZmVyaW9yX21lbW9yeSk7CisgIHJlbW90ZV9kY2FjaGUgPSAxOworICAvKiBIZWxsbz8gIEFyZSB5b3UgdGhlcmU/ICAqLworICBTRVJJQUxfV1JJVEUgKGRlc2MsICJcclxuIiwgMik7CisgIGV4cGVjdF9wcm9tcHQgKCk7CisKKyAgLyogQ2xlYXIgYW55IGJyZWFrIHBvaW50cyAqLworICBobXNfY2xlYXJfYnJlYWtwb2ludHMgKCk7CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiQ29ubmVjdGVkIHRvIHJlbW90ZSBib2FyZCBydW5uaW5nIEhNUyBtb25pdG9yLlxuIik7CisgIGFkZF9jb21tYW5kcyAoKTsKKy8qICBobXNfZHJhaW4gKCk7ICovCit9CisKKy8qIERlZmluZSB0aGUgdGFyZ2V0IHN1YnJvdXRpbmUgbmFtZXMgKi8KKworc3RydWN0IHRhcmdldF9vcHMgaG1zX29wcyA7CisKK3N0YXRpYyB2b2lkIAoraW5pdF9obXNfb3BzKHZvaWQpCit7CisgIGhtc19vcHMudG9fc2hvcnRuYW1lID0gICAiaG1zIjsKKyAgaG1zX29wcy50b19sb25nbmFtZSA9ICAgIlJlbW90ZSBITVMgbW9uaXRvciI7CisgIGhtc19vcHMudG9fZG9jID0gICAiVXNlIHRoZSBIOCBldmFsdWF0aW9uIGJvYXJkIHJ1bm5pbmcgdGhlIEhNUyBtb25pdG9yIGNvbm5lY3RlZFxuXAorYnkgYSBzZXJpYWwgbGluZS4iOworICBobXNfb3BzLnRvX29wZW4gPSAgIGhtc19vcGVuOworICBobXNfb3BzLnRvX2Nsb3NlID0gICBobXNfY2xvc2U7CisgIGhtc19vcHMudG9fYXR0YWNoID0gICAwOworICBobXNfb3BzLnRvX3Bvc3RfYXR0YWNoID0gTlVMTDsKKyAgaG1zX29wcy50b19yZXF1aXJlX2F0dGFjaCA9IE5VTEw7CisgIGhtc19vcHMudG9fZGV0YWNoID0gICBobXNfZGV0YWNoOworICBobXNfb3BzLnRvX3JlcXVpcmVfZGV0YWNoID0gTlVMTDsKKyAgaG1zX29wcy50b19yZXN1bWUgPSAgIGhtc19yZXN1bWU7CisgIGhtc19vcHMudG9fd2FpdCAgPSAgIGhtc193YWl0OworICBobXNfb3BzLnRvX3Bvc3Rfd2FpdCA9IE5VTEw7CisgIGhtc19vcHMudG9fZmV0Y2hfcmVnaXN0ZXJzICA9ICAgaG1zX2ZldGNoX3JlZ2lzdGVyOworICBobXNfb3BzLnRvX3N0b3JlX3JlZ2lzdGVycyAgPSAgIGhtc19zdG9yZV9yZWdpc3RlcjsKKyAgaG1zX29wcy50b19wcmVwYXJlX3RvX3N0b3JlID0gICBobXNfcHJlcGFyZV90b19zdG9yZTsKKyAgaG1zX29wcy50b194ZmVyX21lbW9yeSAgPSAgIGhtc194ZmVyX2luZmVyaW9yX21lbW9yeTsKKyAgaG1zX29wcy50b19maWxlc19pbmZvICA9ICAgaG1zX2ZpbGVzX2luZm87CisgIGhtc19vcHMudG9faW5zZXJ0X2JyZWFrcG9pbnQgPSAgIGhtc19pbnNlcnRfYnJlYWtwb2ludDsKKyAgaG1zX29wcy50b19yZW1vdmVfYnJlYWtwb2ludCA9ICAgaG1zX3JlbW92ZV9icmVha3BvaW50OworICBobXNfb3BzLnRvX3Rlcm1pbmFsX2luaXQgID0gICAwOworICBobXNfb3BzLnRvX3Rlcm1pbmFsX2luZmVyaW9yID0gICAwOworICBobXNfb3BzLnRvX3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCA9ICAgMDsKKyAgaG1zX29wcy50b190ZXJtaW5hbF9vdXJzICA9ICAgMDsKKyAgaG1zX29wcy50b190ZXJtaW5hbF9pbmZvICA9ICAgMDsKKyAgaG1zX29wcy50b19raWxsICA9ICAgaG1zX2tpbGw7CQorICBobXNfb3BzLnRvX2xvYWQgID0gICBnZW5lcmljX2xvYWQ7CisgIGhtc19vcHMudG9fbG9va3VwX3N5bWJvbCA9ICAgMDsKKyAgaG1zX29wcy50b19jcmVhdGVfaW5mZXJpb3IgPSAgIGhtc19jcmVhdGVfaW5mZXJpb3I7CisgIGhtc19vcHMudG9fcG9zdF9zdGFydHVwX2luZmVyaW9yID0gTlVMTDsKKyAgaG1zX29wcy50b19hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yID0gTlVMTDsKKyAgaG1zX29wcy50b19jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yID0gTlVMTDsKKyAgaG1zX29wcy50b19wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSA9IE5VTEw7CisgIGhtc19vcHMudG9faW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGhtc19vcHMudG9fcmVtb3ZlX2ZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGhtc19vcHMudG9faW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBobXNfb3BzLnRvX3JlbW92ZV92Zm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgaG1zX29wcy50b19oYXNfZm9ya2VkID0gTlVMTDsKKyAgaG1zX29wcy50b19oYXNfdmZvcmtlZCA9IE5VTEw7CisgIGhtc19vcHMudG9fY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjID0gTlVMTDsKKyAgaG1zX29wcy50b19wb3N0X2ZvbGxvd192Zm9yayA9IE5VTEw7CisgIGhtc19vcHMudG9faW5zZXJ0X2V4ZWNfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGhtc19vcHMudG9fcmVtb3ZlX2V4ZWNfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGhtc19vcHMudG9faGFzX2V4ZWNkID0gTlVMTDsKKyAgaG1zX29wcy50b19yZXBvcnRlZF9leGVjX2V2ZW50c19wZXJfZXhlY19jYWxsID0gTlVMTDsKKyAgaG1zX29wcy50b19oYXNfZXhpdGVkID0gTlVMTDsKKyAgaG1zX29wcy50b19tb3Vybl9pbmZlcmlvciA9ICAgaG1zX21vdXJuOworICBobXNfb3BzLnRvX2Nhbl9ydW4gID0gICAwOworICBobXNfb3BzLnRvX25vdGljZV9zaWduYWxzID0gICAwOworICBobXNfb3BzLnRvX3RocmVhZF9hbGl2ZSAgPSAgIDA7CisgIGhtc19vcHMudG9fc3RvcCAgPSAgIDA7CisgIGhtc19vcHMudG9fcGlkX3RvX2V4ZWNfZmlsZSA9IE5VTEw7CisgIGhtc19vcHMudG9fY29yZV9maWxlX3RvX3N5bV9maWxlID0gTlVMTDsJCQkKKyAgaG1zX29wcy50b19zdHJhdHVtID0gICBwcm9jZXNzX3N0cmF0dW07CisgIGhtc19vcHMuRE9OVF9VU0UgPSAgIDA7CQorICBobXNfb3BzLnRvX2hhc19hbGxfbWVtb3J5ID0gICAxOworICBobXNfb3BzLnRvX2hhc19tZW1vcnkgPSAgIDE7CisgIGhtc19vcHMudG9faGFzX3N0YWNrID0gICAxOworICBobXNfb3BzLnRvX2hhc19yZWdpc3RlcnMgPSAgIDE7CisgIGhtc19vcHMudG9faGFzX2V4ZWN1dGlvbiA9ICAgMTsKKyAgaG1zX29wcy50b19zZWN0aW9ucyA9ICAgMDsKKyAgaG1zX29wcy50b19zZWN0aW9uc19lbmQgPSAgIDA7CQkJCisgIGhtc19vcHMudG9fbWFnaWMgPSAgIE9QU19NQUdJQzsJCQorfTsKKworaG1zX3F1aWV0ICgpCQkJLyogRklYTUUgLSB0aGlzIHJvdXRpbmUgY2FuIGJlIHJlbW92ZWQgYWZ0ZXIgRGVjICc5NCAqLworeworICBxdWlldCA9ICFxdWlldDsKKyAgaWYgKHF1aWV0KQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlNub29wIGRpc2FibGVkXG4iKTsKKyAgZWxzZQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlNub29wIGVuYWJsZWRcbiIpOworCisgIHByaW50Zl9maWx0ZXJlZCAoImBzbm9vcCcgaXMgb2Jzb2xldGUsIHBsZWFzZSB1c2UgYHNldCByZW1vdGVkZWJ1ZycuXG4iKTsKK30KKworaG1zX2RldmljZSAocykKKyAgICAgY2hhciAqczsKK3sKKyAgaWYgKHMpCisgICAgeworICAgICAgZGV2X25hbWUgPSBnZXRfd29yZCAoJnMpOworICAgIH0KK30KKworc3RhdGljCitobXNfc3BlZWQgKHMpCisgICAgIGNoYXIgKnM7Cit7CisgIGNoZWNrX29wZW4gKCk7CisKKyAgaWYgKHMpCisgICAgeworICAgICAgY2hhciBidWZmZXJbMTAwXTsKKyAgICAgIGludCBuZXdyYXRlID0gYXRvaSAocyk7CisgICAgICBpbnQgd2hpY2ggPSAwOworCisgICAgICBpZiAoU0VSSUFMX1NFVEJBVURSQVRFIChkZXNjLCBuZXdyYXRlKSkKKwllcnJvciAoIkNhbid0IHVzZSAlZCBiYXVkXG4iLCBuZXdyYXRlKTsKKworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiQ2hlY2tpbmcgdGFyZ2V0IGlzIGluIHN5bmNcbiIpOworCisgICAgICBwcmludGZfZmlsdGVyZWQgKCJTZW5kaW5nIGNvbW1hbmRzIHRvIHNldCB0YXJnZXQgdG8gJWRcbiIsCisJCSAgICAgICBiYXVkcmF0ZSk7CisKKyAgICAgIHNwcmludGYgKGJ1ZmZlciwgInRtICVkLiBOIDggMSIsIGJhdWRyYXRlKTsKKyAgICAgIGhtc193cml0ZV9jciAoYnVmZmVyKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2htc19kcmFpbiAoYXJncywgZnJvbXR0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb210dHk7Cit7CisgIGludCBjOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBjID0gU0VSSUFMX1JFQURDSEFSIChkZXNjLCAxKTsKKyAgICAgIGlmIChjID09IFNFUklBTF9USU1FT1VUKQorCWJyZWFrOworICAgICAgaWYgKGMgPT0gU0VSSUFMX0VSUk9SKQorCWJyZWFrOworICAgICAgaWYgKGMgPiAnICcgJiYgYyA8IDEyNykKKwlwcmludGYgKCIlYyIsIGMgJiAweGZmKTsKKyAgICAgIGVsc2UKKwlwcmludGYgKCI8JXg+IiwgYyAmIDB4ZmYpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2FkZF9jb21tYW5kcyAoKQoreworCisgIGFkZF9jb20gKCJobXNfZHJhaW4iLCBjbGFzc19vYnNjdXJlLCBobXNfZHJhaW4sCisJICAgIkRyYWluIHBlbmRpbmcgaG1zIHRleHQgYnVmZmVycy4iKTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9jb21tYW5kcyAoKQoreworICBleHRlcm4gc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmNtZGxpc3Q7CisgIGRlbGV0ZV9jbWQgKCJobXMtZHJhaW4iLCAmY21kbGlzdCk7Cit9CisKKwordm9pZAorX2luaXRpYWxpemVfcmVtb3RlX2htcyAoKQoreworICBpbml0X2htc19vcHMoKSA7CisgIGFkZF90YXJnZXQgKCZobXNfb3BzKTsKKworICBhZGRfY29tICgiaG1zIDxjb21tYW5kPiIsIGNsYXNzX29ic2N1cmUsIGhtc19jb20sCisJICAgIlNlbmQgYSBjb21tYW5kIHRvIHRoZSBITVMgbW9uaXRvci4iKTsKKworICAvKiBGSVhNRSAtIGhtc19xdWlldCBhbmQgYHNub29wJyBjYW4gYmUgcmVtb3ZlZCBhZnRlciBEZWMgJzk0ICovCisgIGFkZF9jb20gKCJzbm9vcCIsIGNsYXNzX29ic2N1cmUsIGhtc19xdWlldCwKKwkgICAiU2hvdyB3aGF0IGNvbW1hbmRzIGFyZSBnb2luZyB0byB0aGUgbW9uaXRvciAoT0JTT0xFVEUgLSBzZWUgJ3NldCByZW1vdGVkZWJ1ZycpIik7CisKKyAgYWRkX2NvbSAoImRldmljZSIsIGNsYXNzX29ic2N1cmUsIGhtc19kZXZpY2UsCisJICAgIlNldCB0aGUgdGVybWluYWwgbGluZSBmb3IgSE1TIGNvbW11bmljYXRpb25zIik7CisKKyAgYWRkX2NvbSAoInNwZWVkIiwgY2xhc3Nfb2JzY3VyZSwgaG1zX3NwZWVkLAorCSAgICJTZXQgdGhlIHRlcm1pbmFsIGxpbmUgc3BlZWQgZm9yIEhNUyBjb21tdW5pY2F0aW9ucyIpOworCisgIGRldl9uYW1lID0gTlVMTDsKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9nZGIvcmVtb3RlLW1pcHMuYyBiL2dkYi9yZW1vdGUtbWlwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MmY4YjcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmVtb3RlLW1pcHMuYwpAQCAtMCwwICsxLDM2NTUgQEAKKy8qIFJlbW90ZSBkZWJ1Z2dpbmcgaW50ZXJmYWNlIGZvciBNSVBTIHJlbW90ZSBkZWJ1Z2dpbmcgcHJvdG9jb2wuCisgICBDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LiAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yCisgICA8aWFuQGN5Z251cy5jb20+LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAid2FpdC5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJzZXJpYWwuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJyZW1vdGUtdXRpbHMuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2Vsc2UKKyNpbmNsdWRlIDx2YXJhcmdzLmg+CisjZW5kaWYKKworLyogTWljcm9zb2Z0IEMncyBzdGF0LmggZG9lc24ndCBkZWZpbmUgYWxsIHRoZSBQT1NJWCBmaWxlIG1vZGVzLiAgKi8KKyNpZm5kZWYgU19JUk9USAorI2RlZmluZSBTX0lST1RIIFNfSVJFQUQKKyNlbmRpZgorCitleHRlcm4gdm9pZCBtaXBzX3NldF9wcm9jZXNzb3JfdHlwZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKKwwKKy8qIEJyZWFrcG9pbnQgdHlwZXMuICBWYWx1ZXMgMCwgMSwgYW5kIDIgbXVzdCBhZ3JlZSB3aXRoIHRoZSB3YXRjaAorICAgdHlwZXMgcGFzc2VkIGJ5IGJyZWFrcG9pbnQuYyB0byB0YXJnZXRfaW5zZXJ0X3dhdGNocG9pbnQuCisgICBWYWx1ZSAzIGlzIG91ciBvd24gaW52ZW50aW9uLCBhbmQgaXMgdXNlZCBmb3Igb3JkaW5hcnkgaW5zdHJ1Y3Rpb24KKyAgIGJyZWFrcG9pbnRzLiAgVmFsdWUgNCBpcyB1c2VkIHRvIG1hcmsgYW4gdW51c2VkIHdhdGNocG9pbnQgaW4gdGFibGVzLiAgKi8KK2VudW0gYnJlYWtfdHlwZSB7CisgIEJSRUFLX1dSSVRFLAkvKiAwICovCisgIEJSRUFLX1JFQUQsCS8qIDEgKi8KKyAgQlJFQUtfQUNDRVNTLAkvKiAyICovCisgIEJSRUFLX0ZFVENILAkvKiAzICovCisgIEJSRUFLX1VOVVNFRAkvKiA0ICovCit9OworCisvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLworCitzdGF0aWMgaW50IG1pcHNfcmVhZGNoYXIgUEFSQU1TICgoaW50IHRpbWVvdXQpKTsKKworc3RhdGljIGludCBtaXBzX3JlY2VpdmVfaGVhZGVyIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKmhkciwgaW50ICpwZ2FyYmFnZSwKKwkJCQkJaW50IGNoLCBpbnQgdGltZW91dCkpOworCitzdGF0aWMgaW50IG1pcHNfcmVjZWl2ZV90cmFpbGVyIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKnRybHIsIGludCAqcGdhcmJhZ2UsCisJCQkJCSBpbnQgKnBjaCwgaW50IHRpbWVvdXQpKTsKKworc3RhdGljIGludCBtaXBzX2Nrc3VtIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhkciwKKwkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJICAgICAgIGludCBsZW4pKTsKKworc3RhdGljIHZvaWQgbWlwc19zZW5kX3BhY2tldCBQQVJBTVMgKChjb25zdCBjaGFyICpzLCBpbnQgZ2V0X2FjaykpOworCitzdGF0aWMgdm9pZCBtaXBzX3NlbmRfY29tbWFuZCBQQVJBTVMgKChjb25zdCBjaGFyICpjbWQsIGludCBwcm9tcHQpKTsKKworc3RhdGljIGludCBtaXBzX3JlY2VpdmVfcGFja2V0IFBBUkFNUyAoKGNoYXIgKmJ1ZmYsIGludCB0aHJvd19lcnJvciwKKwkJCQkJaW50IHRpbWVvdXQpKTsKKworc3RhdGljIENPUkVfQUREUiBtaXBzX3JlcXVlc3QgUEFSQU1TICgoaW50IGNtZCwgQ09SRV9BRERSIGFkZHIsCisJCQkJIENPUkVfQUREUiBkYXRhLCBpbnQgKnBlcnIsIGludCB0aW1lb3V0LAorCQkJCSBjaGFyICpidWZmKSk7CisKK3N0YXRpYyB2b2lkIG1pcHNfaW5pdGlhbGl6ZSBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIG1pcHNfb3BlbiBQQVJBTVMgKChjaGFyICpuYW1lLCBpbnQgZnJvbV90dHkpKTsKKworc3RhdGljIHZvaWQgcG1vbl9vcGVuIFBBUkFNUyAoKGNoYXIgKm5hbWUsIGludCBmcm9tX3R0eSkpOworCitzdGF0aWMgdm9pZCBkZGJfb3BlbiBQQVJBTVMgKChjaGFyICpuYW1lLCBpbnQgZnJvbV90dHkpKTsKKworc3RhdGljIHZvaWQgbHNpX29wZW4gUEFSQU1TICgoY2hhciAqbmFtZSwgaW50IGZyb21fdHR5KSk7CisKK3N0YXRpYyB2b2lkIG1pcHNfY2xvc2UgUEFSQU1TICgoaW50IHF1aXR0aW5nKSk7CisKK3N0YXRpYyB2b2lkIG1pcHNfZGV0YWNoIFBBUkFNUyAoKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkpOworCitzdGF0aWMgdm9pZCBtaXBzX3Jlc3VtZSBQQVJBTVMgKChpbnQgcGlkLCBpbnQgc3RlcCwKKwkJCQkgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ2duYWwpKTsKKworc3RhdGljIGludCBtaXBzX3dhaXQgUEFSQU1TICgoaW50IHBpZCwgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpzdGF0dXMpKTsKKworc3RhdGljIGludCBtaXBzX21hcF9yZWdubyBQQVJBTVMgKChpbnQgcmVnbm8pKTsKKworc3RhdGljIHZvaWQgbWlwc19mZXRjaF9yZWdpc3RlcnMgUEFSQU1TICgoaW50IHJlZ25vKSk7CisKK3N0YXRpYyB2b2lkIG1pcHNfcHJlcGFyZV90b19zdG9yZSBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIG1pcHNfc3RvcmVfcmVnaXN0ZXJzIFBBUkFNUyAoKGludCByZWdubykpOworCitzdGF0aWMgdW5zaWduZWQgaW50IG1pcHNfZmV0Y2hfd29yZCBQQVJBTVMgKChDT1JFX0FERFIgYWRkcikpOworCitzdGF0aWMgaW50IG1pcHNfc3RvcmVfd29yZCBQQVJBTVMgKChDT1JFX0FERFIgYWRkciwgdW5zaWduZWQgaW50IHZhbHVlLAorCQkJCSAgICBjaGFyICpvbGRfY29udGVudHMpKTsKKworc3RhdGljIGludCBtaXBzX3hmZXJfbWVtb3J5IFBBUkFNUyAoKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsIGludCBsZW4sCisJCQkJICAgICBpbnQgd3JpdGUsIHN0cnVjdCB0YXJnZXRfb3BzICppZ25vcmUpKTsKKworc3RhdGljIHZvaWQgbWlwc19maWxlc19pbmZvIFBBUkFNUyAoKHN0cnVjdCB0YXJnZXRfb3BzICppZ25vcmUpKTsKKworc3RhdGljIHZvaWQgbWlwc19jcmVhdGVfaW5mZXJpb3IgUEFSQU1TICgoY2hhciAqZXhlY2ZpbGUsIGNoYXIgKmFyZ3MsCisJCQkJCSAgY2hhciAqKmVudikpOworCitzdGF0aWMgdm9pZCBtaXBzX21vdXJuX2luZmVyaW9yIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIGludCBwbW9uX21ha2ViNjQgUEFSQU1TICgodW5zaWduZWQgbG9uZyB2LCBjaGFyICpwLCBpbnQgbiwgaW50ICpjaGtzdW0pKTsKKworc3RhdGljIGludCBwbW9uX3plcm9zZXQgUEFSQU1TICgoaW50IHJlY3NpemUsIGNoYXIgKipidWZmLCBpbnQgKmFtb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqY2hrc3VtKSk7CisKK3N0YXRpYyBpbnQgcG1vbl9jaGVja3NldCBQQVJBTVMgKChpbnQgcmVjc2l6ZSwgY2hhciAqKmJ1ZmYsIGludCAqdmFsdWUpKTsKKworc3RhdGljIHZvaWQgcG1vbl9tYWtlX2Zhc3RyZWMgUEFSQU1TICgoY2hhciAqKm91dGJ1ZiwgdW5zaWduZWQgY2hhciAqaW5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmlucHRyLCBpbnQgaW5hbW91bnQsIGludCAqcmVjc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqY3N1bSwgdW5zaWduZWQgaW50ICp6ZXJvZmlsbCkpOworCitzdGF0aWMgaW50IHBtb25fY2hlY2tfYWNrIFBBUkFNUyAoKGNoYXIgKm1lc2cpKTsKKworc3RhdGljIHZvaWQgcG1vbl9zdGFydF9kb3dubG9hZCBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIHBtb25fZW5kX2Rvd25sb2FkIFBBUkFNUyAoKGludCBmaW5hbCwgaW50IGJpbnRvdGFsKSk7CisKK3N0YXRpYyB2b2lkIHBtb25fZG93bmxvYWQgUEFSQU1TICgoY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKSk7CisKK3N0YXRpYyB2b2lkIHBtb25fbG9hZF9mYXN0IFBBUkFNUyAoKGNoYXIgKmZpbGUpKTsKKworc3RhdGljIHZvaWQgbWlwc19sb2FkIFBBUkFNUyAoKGNoYXIgKmZpbGUsIGludCBmcm9tX3R0eSkpOworCitzdGF0aWMgaW50IG1pcHNfbWFrZV9zcmVjIFBBUkFNUyAoKGNoYXIgKmJ1ZmZlciwgaW50IHR5cGUsIENPUkVfQUREUiBtZW1hZGRyLAorCQkJCSAgIHVuc2lnbmVkIGNoYXIgKm15YWRkciwgaW50IGxlbikpOworCitzdGF0aWMgaW50IHNldF9icmVha3BvaW50IFBBUkFNUyAoKENPUkVfQUREUiBhZGRyLCBpbnQgbGVuLAorCQkJCSAgIGVudW0gYnJlYWtfdHlwZSB0eXBlKSk7CisKK3N0YXRpYyBpbnQgY2xlYXJfYnJlYWtwb2ludCBQQVJBTVMgKChDT1JFX0FERFIgYWRkciwgaW50IGxlbiwKKwkJCQkgICAgIGVudW0gYnJlYWtfdHlwZSB0eXBlKSk7CisKK3N0YXRpYyBpbnQgY29tbW9uX2JyZWFrcG9pbnQgUEFSQU1TICgoaW50IHNldCwgQ09SRV9BRERSIGFkZHIsIGludCBsZW4sCisJCQkJICAgICAgZW51bSBicmVha190eXBlIHR5cGUpKTsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMuICAqLworZXh0ZXJuIHN0cnVjdCB0YXJnZXRfb3BzIG1pcHNfb3BzOworZXh0ZXJuIHN0cnVjdCB0YXJnZXRfb3BzIHBtb25fb3BzOworZXh0ZXJuIHN0cnVjdCB0YXJnZXRfb3BzIGRkYl9vcHM7CisMCisvKiBUaGUgTUlQUyByZW1vdGUgZGVidWdnaW5nIGludGVyZmFjZSBpcyBidWlsdCBvbiB0b3Agb2YgYSBzaW1wbGUKKyAgIHBhY2tldCBwcm90b2NvbC4gIEVhY2ggcGFja2V0IGlzIG9yZ2FuaXplZCBhcyBmb2xsb3dzOgorCisgICBTWU4JVGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhbHdheXMgYSBTWU4gKEFTQ0lJIDAyNiwgb3IgXlYpLiAgU1lOCisJbWF5IG5vdCBhcHBlYXIgYW55d2hlcmUgZWxzZSBpbiB0aGUgcGFja2V0LiAgQW55IHRpbWUgYSBTWU4gaXMKKwlzZWVuLCBhIG5ldyBwYWNrZXQgc2hvdWxkIGJlIGFzc3VtZWQgdG8gaGF2ZSBiZWd1bi4KKworICAgVFlQRV9MRU4KKwlUaGlzIGJ5dGUgY29udGFpbnMgdGhlIHVwcGVyIGZpdmUgYml0cyBvZiB0aGUgbG9naWNhbCBsZW5ndGgKKwlvZiB0aGUgZGF0YSBzZWN0aW9uLCBwbHVzIGEgc2luZ2xlIGJpdCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcworCWlzIGEgZGF0YSBwYWNrZXQgb3IgYW4gYWNrbm93bGVkZ2VtZW50LiAgVGhlIGRvY3VtZW50YXRpb24KKwlpbmRpY2F0ZXMgdGhhdCB0aGlzIGJpdCBpcyAxIGZvciBhIGRhdGEgcGFja2V0LCBidXQgdGhlIGFjdHVhbAorCWJvYXJkIHVzZXMgMSBmb3IgYW4gYWNrbm93bGVkZ2VtZW50LiAgVGhlIHZhbHVlIG9mIHRoZSBieXRlIGlzCisJCTB4NDAgKyAoYWNrID8gMHgyMCA6IDApICsgKGxlbiA+PiA2KQorCSh3ZSBhbHdheXMgaGF2ZSAwIDw9IGxlbiA8IDEwMjQpLiAgQWNrbm93bGVkZ2VtZW50IHBhY2tldHMgZG8KKwlub3QgY2FycnkgZGF0YSwgYW5kIG11c3QgaGF2ZSBhIGRhdGEgbGVuZ3RoIG9mIDAuCisKKyAgIExFTjEgVGhpcyBieXRlIGNvbnRhaW5zIHRoZSBsb3dlciBzaXggYml0cyBvZiB0aGUgbG9naWNhbCBsZW5ndGggb2YKKwl0aGUgZGF0YSBzZWN0aW9uLiAgVGhlIHZhbHVlIGlzCisJIAkweDQwICsgKGxlbiAmIDB4M2YpCisKKyAgIFNFUQlUaGlzIGJ5dGUgY29udGFpbnMgdGhlIHNpeCBiaXQgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBwYWNrZXQuCisJVGhlIHZhbHVlIGlzCisJCTB4NDAgKyBzZXEKKwlBbiBhY2tub3dsZWdtZW50IHBhY2tldCBjb250YWlucyB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZQorCXBhY2tldCBiZWluZyBhY2tub3dsZWRnZWQgcGx1cyAxIG1vZHVsbyA2NC4gIERhdGEgcGFja2V0cyBhcmUKKwl0cmFuc21pdHRlZCBpbiBzZXF1ZW5jZS4gIFRoZXJlIG1heSBvbmx5IGJlIG9uZSBvdXRzdGFuZGluZworCXVuYWNrbm93bGVkZ2VkIGRhdGEgcGFja2V0IGF0IGEgdGltZS4gIFRoZSBzZXF1ZW5jZSBudW1iZXJzCisJYXJlIGluZGVwZW5kZW50IGluIGVhY2ggZGlyZWN0aW9uLiAgSWYgYW4gYWNrbm93bGVkZ2VtZW50IGZvcgorCXRoZSBwcmV2aW91cyBwYWNrZXQgaXMgcmVjZWl2ZWQgKGkuZS4sIGFuIGFja25vd2xlZGdlbWVudCB3aXRoCisJdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgcGFja2V0IGp1c3Qgc2VudCkgdGhlIHBhY2tldCBqdXN0CisJc2VudCBzaG91bGQgYmUgcmV0cmFuc21pdHRlZC4gIElmIG5vIGFja25vd2xlZGdlbWVudCBpcworCXJlY2VpdmVkIHdpdGhpbiBhIHRpbWVvdXQgcGVyaW9kLCB0aGUgcGFja2V0IHNob3VsZCBiZQorCXJldHJhbnNtaXR0ZWQuICBUaGlzIGhhcyBhbiB1bmZvcnR1bmF0ZSBmYWlsdXJlIGNvbmRpdGlvbiBvbiBhCisJaGlnaC1sYXRlbmN5IGxpbmUsIGFzIGEgZGVsYXllZCBhY2tub3dsZWRnZW1lbnQgbWF5IGxlYWQgdG8gYW4KKwllbmRsZXNzIHNlcmllcyBvZiBkdXBsaWNhdGUgcGFja2V0cy4KKworICAgREFUQQlUaGUgYWN0dWFsIGRhdGEgYnl0ZXMgZm9sbG93LiAgVGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGFyZQorCWVzY2FwZWQgaW5saW5lIHdpdGggRExFIChBU0NJSSAwMjAsIG9yIF5QKToKKwkJU1lOICgwMjYpCURMRSBTCisJCURMRSAoMDIwKQlETEUgRAorCQleQyAgKDAwMykJRExFIEMKKwkJXlMgICgwMjMpCURMRSBzCisJCV5RICAoMDIxKQlETEUgcQorCVRoZSBhZGRpdGlvbmFsIERMRSBjaGFyYWN0ZXJzIGFyZSBub3QgY291bnRlZCBpbiB0aGUgbG9naWNhbAorCWxlbmd0aCBzdG9yZWQgaW4gdGhlIFRZUEVfTEVOIGFuZCBMRU4xIGJ5dGVzLgorCisgICBDU1VNMQorICAgQ1NVTTIKKyAgIENTVU0zCisJVGhlc2UgYnl0ZXMgY29udGFpbiBhbiAxOCBiaXQgY2hlY2tzdW0gb2YgdGhlIGNvbXBsZXRlCisJY29udGVudHMgb2YgdGhlIHBhY2tldCBleGNsdWRpbmcgdGhlIFNFUSBieXRlIGFuZCB0aGUKKwlDU1VNWzEyM10gYnl0ZXMuICBUaGUgY2hlY2tzdW0gaXMgc2ltcGx5IHRoZSB0d29zIGNvbXBsZW1lbnQKKwlhZGRpdGlvbiBvZiBhbGwgdGhlIGJ5dGVzIHRyZWF0ZWQgYXMgdW5zaWduZWQgY2hhcmFjdGVycy4gIFRoZQorCXZhbHVlcyBvZiB0aGUgY2hlY2tzdW0gYnl0ZXMgYXJlOgorCQlDU1VNMTogMHg0MCArICgoY2tzdW0gPj4gMTIpICYgMHgzZikKKwkJQ1NVTTI6IDB4NDAgKyAoKGNrc3VtID4+IDYpICYgMHgzZikKKwkJQ1NVTTM6IDB4NDAgKyAoY2tzdW0gJiAweDNmKQorCisgICBJdCBoYXBwZW5zIHRoYXQgdGhlIE1JUFMgcmVtb3RlIGRlYnVnZ2luZyBwcm90b2NvbCBhbHdheXMKKyAgIGNvbW11bmljYXRlcyB3aXRoIEFTQ0lJIHN0cmluZ3MuICBCZWNhdXNlIG9mIHRoaXMsIHRoaXMKKyAgIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgYm90aGVyIHRvIGhhbmRsZSB0aGUgRExFIHF1b3RpbmcgbWVjaGFuaXNtLAorICAgc2luY2UgaXQgd2lsbCBuZXZlciBiZSByZXF1aXJlZC4gICovCisKKy8qIFRoZSBTWU4gY2hhcmFjdGVyIHdoaWNoIHN0YXJ0cyBlYWNoIHBhY2tldC4gICovCisjZGVmaW5lIFNZTiAnXDAyNicKKworLyogVGhlIDB4NDAgdXNlZCB0byBvZmZzZXQgZWFjaCBwYWNrZXQgKHRoaXMgdmFsdWUgZW5zdXJlcyB0aGF0IGFsbCBvZgorICAgdGhlIGhlYWRlciBhbmQgdHJhaWxlciBieXRlcywgb3RoZXIgdGhhbiBTWU4sIGFyZSBwcmludGFibGUgQVNDSUkKKyAgIGNoYXJhY3RlcnMpLiAgKi8KKyNkZWZpbmUgSERSX09GRlNFVCAweDQwCisKKy8qIFRoZSBpbmRpY2VzIG9mIHRoZSBieXRlcyBpbiB0aGUgcGFja2V0IGhlYWRlci4gICovCisjZGVmaW5lIEhEUl9JTkRYX1NZTiAwCisjZGVmaW5lIEhEUl9JTkRYX1RZUEVfTEVOIDEKKyNkZWZpbmUgSERSX0lORFhfTEVOMSAyCisjZGVmaW5lIEhEUl9JTkRYX1NFUSAzCisjZGVmaW5lIEhEUl9MRU5HVEggNAorCisvKiBUaGUgZGF0YS9hY2sgYml0IGluIHRoZSBUWVBFX0xFTiBoZWFkZXIgYnl0ZS4gICovCisjZGVmaW5lIFRZUEVfTEVOX0RBX0JJVCAweDIwCisjZGVmaW5lIFRZUEVfTEVOX0RBVEEgMAorI2RlZmluZSBUWVBFX0xFTl9BQ0sgVFlQRV9MRU5fREFfQklUCisKKy8qIEhvdyB0byBjb21wdXRlIHRoZSBoZWFkZXIgYnl0ZXMuICAqLworI2RlZmluZSBIRFJfU0VUX1NZTihkYXRhLCBsZW4sIHNlcSkgKFNZTikKKyNkZWZpbmUgSERSX1NFVF9UWVBFX0xFTihkYXRhLCBsZW4sIHNlcSkgXAorICAoSERSX09GRlNFVCBcCisgICArICgoZGF0YSkgPyBUWVBFX0xFTl9EQVRBIDogVFlQRV9MRU5fQUNLKSBcCisgICArICgoKGxlbikgPj4gNikgJiAweDFmKSkKKyNkZWZpbmUgSERSX1NFVF9MRU4xKGRhdGEsIGxlbiwgc2VxKSAoSERSX09GRlNFVCArICgobGVuKSAmIDB4M2YpKQorI2RlZmluZSBIRFJfU0VUX1NFUShkYXRhLCBsZW4sIHNlcSkgKEhEUl9PRkZTRVQgKyAoc2VxKSkKKworLyogQ2hlY2sgdGhhdCBhIGhlYWRlciBieXRlIGlzIHJlYXNvbmFibGUuICAqLworI2RlZmluZSBIRFJfQ0hFQ0soY2gpICgoKGNoKSAmIEhEUl9PRkZTRVQpID09IEhEUl9PRkZTRVQpCisKKy8qIEdldCBkYXRhIGZyb20gdGhlIGhlYWRlci4gIFRoZXNlIG1hY3JvcyBldmFsdWF0ZSB0aGVpciBhcmd1bWVudAorICAgbXVsdGlwbGUgdGltZXMuICAqLworI2RlZmluZSBIRFJfSVNfREFUQShoZHIpIFwKKyAgKCgoaGRyKVtIRFJfSU5EWF9UWVBFX0xFTl0gJiBUWVBFX0xFTl9EQV9CSVQpID09IFRZUEVfTEVOX0RBVEEpCisjZGVmaW5lIEhEUl9HRVRfTEVOKGhkcikgXAorICAoKCgoaGRyKVtIRFJfSU5EWF9UWVBFX0xFTl0gJiAweDFmKSA8PCA2KSArICgoKGhkcilbSERSX0lORFhfTEVOMV0gJiAweDNmKSkpCisjZGVmaW5lIEhEUl9HRVRfU0VRKGhkcikgKCh1bnNpZ25lZCBpbnQpKGhkcilbSERSX0lORFhfU0VRXSAmIDB4M2YpCisKKy8qIFRoZSBtYXhpbXVtIGRhdGEgbGVuZ3RoLiAgKi8KKyNkZWZpbmUgREFUQV9NQVhMRU4gMTAyMworCisvKiBUaGUgdHJhaWxlciBvZmZzZXQuICAqLworI2RlZmluZSBUUkxSX09GRlNFVCBIRFJfT0ZGU0VUCisKKy8qIFRoZSBpbmRpY2VzIG9mIHRoZSBieXRlcyBpbiB0aGUgcGFja2V0IHRyYWlsZXIuICAqLworI2RlZmluZSBUUkxSX0lORFhfQ1NVTTEgMAorI2RlZmluZSBUUkxSX0lORFhfQ1NVTTIgMQorI2RlZmluZSBUUkxSX0lORFhfQ1NVTTMgMgorI2RlZmluZSBUUkxSX0xFTkdUSCAzCisKKy8qIEhvdyB0byBjb21wdXRlIHRoZSB0cmFpbGVyIGJ5dGVzLiAgKi8KKyNkZWZpbmUgVFJMUl9TRVRfQ1NVTTEoY2tzdW0pIChUUkxSX09GRlNFVCArICgoKGNrc3VtKSA+PiAxMikgJiAweDNmKSkKKyNkZWZpbmUgVFJMUl9TRVRfQ1NVTTIoY2tzdW0pIChUUkxSX09GRlNFVCArICgoKGNrc3VtKSA+PiAgNikgJiAweDNmKSkKKyNkZWZpbmUgVFJMUl9TRVRfQ1NVTTMoY2tzdW0pIChUUkxSX09GRlNFVCArICgoKGNrc3VtKSAgICAgICkgJiAweDNmKSkKKworLyogQ2hlY2sgdGhhdCBhIHRyYWlsZXIgYnl0ZSBpcyByZWFzb25hYmxlLiAgKi8KKyNkZWZpbmUgVFJMUl9DSEVDSyhjaCkgKCgoY2gpICYgVFJMUl9PRkZTRVQpID09IFRSTFJfT0ZGU0VUKQorCisvKiBHZXQgZGF0YSBmcm9tIHRoZSB0cmFpbGVyLiAgVGhpcyBldmFsdWF0ZXMgaXRzIGFyZ3VtZW50IG11bHRpcGxlCisgICB0aW1lcy4gICovCisjZGVmaW5lIFRSTFJfR0VUX0NLU1VNKHRybHIpIFwKKyAgKCgoKHRybHIpW1RSTFJfSU5EWF9DU1VNMV0gJiAweDNmKSA8PCAxMikgXAorICAgKyAoKCh0cmxyKVtUUkxSX0lORFhfQ1NVTTJdICYgMHgzZikgPDwgIDYpIFwKKyAgICsgKCh0cmxyKVtUUkxSX0lORFhfQ1NVTTNdICYgMHgzZikpCisKKy8qIFRoZSBzZXF1ZW5jZSBudW1iZXIgbW9kdWxvcy4gICovCisjZGVmaW5lIFNFUV9NT0RVTE9TICg2NCkKKworLyogUE1PTiBjb21tYW5kcyB0byBsb2FkIGZyb20gdGhlIHNlcmlhbCBwb3J0IG9yIFVEUCBzb2NrZXQuICAqLworI2RlZmluZSBMT0FEX0NNRAkibG9hZCAtYiAtcyB0dHkwXHIiCisjZGVmaW5lIExPQURfQ01EX1VEUAkibG9hZCAtYiAtcyB1ZHBcciIKKworLyogVGhlIHRhcmdldCB2ZWN0b3JzIGZvciB0aGUgZm91ciBkaWZmZXJlbnQgcmVtb3RlIE1JUFMgdGFyZ2V0cy4KKyAgIFRoZXNlIGFyZSBpbml0aWFsaXplZCB3aXRoIGNvZGUgaW4gX2luaXRpYWxpemVfcmVtb3RlX21pcHMgaW5zdGVhZAorICAgb2Ygc3RhdGljIGluaXRpYWxpemVycywgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZXh0ZW5kIHRoZSB0YXJnZXRfb3BzCisgICB2ZWN0b3IgbGF0ZXIuICAqLworc3RydWN0IHRhcmdldF9vcHMgbWlwc19vcHMsIHBtb25fb3BzLCBkZGJfb3BzLCBsc2lfb3BzOworCitlbnVtIG1pcHNfbW9uaXRvcl90eXBlIHsKKyAgLyogSURUL1NJTSBtb25pdG9yIGJlaW5nIHVzZWQ6ICovCisgIE1PTl9JRFQsCisgIC8qIFBNT04gbW9uaXRvciBiZWluZyB1c2VkOiAqLworICBNT05fUE1PTiwgLyogMy4wLjgzIFtDT0dFTlQsRUIsRlAsTkVUXSBBbGdvcml0aG1pY3MgTHRkLiBOb3YgIDkgMTk5NSAxNzoxOTo1MCAqLworICBNT05fRERCLCAgLyogMi43LjQ3MyBbRERCVlI0MzAwLEVMLEZQLE5FVF0gUmlzcSBNb2R1bGFyIFN5c3RlbXMsICBUaHUgSnVuIDYgMDk6Mjg6NDAgUERUIDE5OTYgKi8KKyAgTU9OX0xTSSwgIC8qIDQuMy4xMiBbRUIsRlBdLCBMU0kgTE9HSUMgQ29ycC4gVHVlIEZlYiAyNSAxMzoyMjoxNCAxOTk3ICovCisgIC8qIExhc3QgYW5kIHVudXNlZCB2YWx1ZSwgZm9yIHNpemluZyB2ZWN0b3JzLCBldGMuICovCisgIE1PTl9MQVNUCit9Oworc3RhdGljIGVudW0gbWlwc19tb25pdG9yX3R5cGUgbWlwc19tb25pdG9yID0gTU9OX0xBU1Q7CisKKy8qIFRoZSBtb25pdG9yIHByb21wdCB0ZXh0LiAgSWYgdGhlIHVzZXIgc2V0cyB0aGUgUE1PTiBwcm9tcHQKKyAgIHRvIHNvbWUgbmV3IHZhbHVlLCB0aGUgR0RCIGBzZXQgbW9uaXRvci1wcm9tcHQnIGNvbW1hbmQgbXVzdCBhbHNvCisgICBiZSB1c2VkIHRvIGluZm9ybSBHREIgYWJvdXQgdGhlIGV4cGVjdGVkIHByb21wdC4gIE90aGVyd2lzZSwgR0RCCisgICB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbm5lY3QgdG8gUE1PTiBpbiBtaXBzX2luaXRpYWxpemUoKS4KKyAgIElmIHRoZSBgc2V0IG1vbml0b3ItcHJvbXB0JyBjb21tYW5kIGlzIG5vdCB1c2VkLCB0aGUgZXhwZWN0ZWQKKyAgIGRlZmF1bHQgcHJvbXB0IHdpbGwgYmUgc2V0IGFjY29yZGluZyB0aGUgdGFyZ2V0OgorCXRhcmdldAkJcHJvbXB0CisJLS0tLS0JCS0tLS0tCisJcG1vbgkJUE1PTj4gCisJZGRiCQlORUMwMTA+CisJbHNpCQlQTU9OPgorKi8KK3N0YXRpYyBjaGFyICptaXBzX21vbml0b3JfcHJvbXB0OworCisvKiBTZXQgdG8gMSBpZiB0aGUgdGFyZ2V0IGlzIG9wZW4uICAqLworc3RhdGljIGludCBtaXBzX2lzX29wZW47CisKKy8qIEN1cnJlbnRseSBhY3RpdmUgdGFyZ2V0IGRlc2NyaXB0aW9uIChpZiBtaXBzX2lzX29wZW4gPT0gMSkgKi8KK3N0YXRpYyBzdHJ1Y3QgdGFyZ2V0X29wcyAqY3VycmVudF9vcHM7CisKKy8qIFNldCB0byAxIHdoaWxlIHRoZSBjb25uZWN0aW9uIGlzIGJlaW5nIGluaXRpYWxpemVkLiAgKi8KK3N0YXRpYyBpbnQgbWlwc19pbml0aWFsaXppbmc7CisKKy8qIFNldCB0byAxIHdoaWxlIHRoZSBjb25uZWN0aW9uIGlzIGJlaW5nIGJyb3VnaHQgZG93bi4gICovCitzdGF0aWMgaW50IG1pcHNfZXhpdGluZzsKKworLyogVGhlIG5leHQgc2VxdWVuY2UgbnVtYmVyIHRvIHNlbmQuICAqLworc3RhdGljIHVuc2lnbmVkIGludCBtaXBzX3NlbmRfc2VxOworCisvKiBUaGUgbmV4dCBzZXF1ZW5jZSBudW1iZXIgd2UgZXhwZWN0IHRvIHJlY2VpdmUuICAqLworc3RhdGljIHVuc2lnbmVkIGludCBtaXBzX3JlY2VpdmVfc2VxOworCisvKiBUaGUgdGltZSB0byB3YWl0IGJlZm9yZSByZXRyYW5zbWl0dGluZyBhIHBhY2tldCwgaW4gc2Vjb25kcy4gICovCitzdGF0aWMgaW50IG1pcHNfcmV0cmFuc21pdF93YWl0ID0gMzsKKworLyogVGhlIG51bWJlciBvZiB0aW1lcyB0byB0cnkgcmV0cmFuc21pdHRpbmcgYSBwYWNrZXQgYmVmb3JlIGdpdmluZyB1cC4gICovCitzdGF0aWMgaW50IG1pcHNfc2VuZF9yZXRyaWVzID0gMTA7CisKKy8qIFRoZSBudW1iZXIgb2YgZ2FyYmFnZSBjaGFyYWN0ZXJzIHRvIGFjY2VwdCB3aGVuIGxvb2tpbmcgZm9yIGFuCisgICBTWU4gZm9yIHRoZSBuZXh0IHBhY2tldC4gICovCitzdGF0aWMgaW50IG1pcHNfc3luX2dhcmJhZ2UgPSAxMDUwOworCisvKiBUaGUgdGltZSB0byB3YWl0IGZvciBhIHBhY2tldCwgaW4gc2Vjb25kcy4gICovCitzdGF0aWMgaW50IG1pcHNfcmVjZWl2ZV93YWl0ID0gNTsKKworLyogU2V0IGlmIHdlIGhhdmUgc2VudCBhIHBhY2tldCB0byB0aGUgYm9hcmQgYnV0IGhhdmUgbm90IHlldCByZWNlaXZlZAorICAgYSByZXBseS4gICovCitzdGF0aWMgaW50IG1pcHNfbmVlZF9yZXBseSA9IDA7CisKKy8qIEhhbmRsZSB1c2VkIHRvIGFjY2VzcyBzZXJpYWwgSS9PIHN0cmVhbS4gICovCitzdGF0aWMgc2VyaWFsX3QgbWlwc19kZXNjOworCisvKiBVRFAgaGFuZGxlIHVzZWQgdG8gZG93bmxvYWQgZmlsZXMgdG8gdGFyZ2V0LiAgKi8KK3N0YXRpYyBzZXJpYWxfdCB1ZHBfZGVzYzsKK3N0YXRpYyBpbnQgdWRwX2luX3VzZTsKKworLyogVEZUUCBmaWxlbmFtZSB1c2VkIHRvIGRvd25sb2FkIGZpbGVzIHRvIEREQiBib2FyZCwgaW4gdGhlIGZvcm0KKyAgIGhvc3Q6ZmlsZW5hbWUuICAqLworc3RhdGljIGNoYXIgKnRmdHBfbmFtZTsJCS8qIGhvc3Q6ZmlsZW5hbWUgKi8KK3N0YXRpYyBjaGFyICp0ZnRwX2xvY2FsbmFtZTsJLyogZmlsZW5hbWUgcG9ydGlvbiBvZiBhYm92ZSAqLworc3RhdGljIGludCB0ZnRwX2luX3VzZTsKK3N0YXRpYyBGSUxFICp0ZnRwX2ZpbGU7CisKKy8qIENvdW50cyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSB1c2VyIHRyaWVkIHRvIGludGVycnVwdCB0aGUgdGFyZ2V0ICh1c3VhbGx5CisgICB2aWEgXkMuICAqLworc3RhdGljIGludCBpbnRlcnJ1cHRfY291bnQ7CisKKy8qIElmIG5vbi16ZXJvLCBtZWFucyB0aGF0IHRoZSB0YXJnZXQgaXMgcnVubmluZy4gKi8KK3N0YXRpYyBpbnQgbWlwc193YWl0X2ZsYWcgPSAwOworCisvKiBJZiBub24temVybywgbW9uaXRvciBzdXBwb3J0cyBicmVha3BvaW50IGNvbW1hbmRzLiAqLworc3RhdGljIG1vbml0b3Jfc3VwcG9ydHNfYnJlYWtwb2ludHMgPSAwOworCisvKiBEYXRhIGNhY2hlIGhlYWRlci4gICovCisKKyNpZiAwCS8qIG5vdCB1c2VkICh5ZXQ/KSAqLworc3RhdGljIERDQUNIRSAqbWlwc19kY2FjaGU7CisjZW5kaWYKKworLyogTm9uLXplcm8gbWVhbnMgdGhhdCB3ZSd2ZSBqdXN0IGhpdCBhIHJlYWQgb3Igd3JpdGUgd2F0Y2hwb2ludCAqLworc3RhdGljIGludCBoaXRfd2F0Y2hwb2ludDsKKworLyogVGFibGUgb2YgYnJlYWtwb2ludHMvd2F0Y2hwb2ludHMgKHVzZWQgb25seSBvbiBMU0kgUE1PTiB0YXJnZXQpLgorICAgVGhlIHRhYmxlIGlzIGluZGV4ZWQgYnkgYSBicmVha3BvaW50IG51bWJlciwgd2hpY2ggaXMgYW4gaW50ZWdlcgorICAgZnJvbSAwIHRvIDI1NSByZXR1cm5lZCBieSB0aGUgTFNJIFBNT04gd2hlbiBhIGJyZWFrcG9pbnQgaXMgc2V0LgorKi8KKyNkZWZpbmUgTUFYX0xTSV9CUkVBS1BPSU5UUyAyNTYKK3N0cnVjdCBsc2lfYnJlYWtwb2ludF9pbmZvCit7CisgIGVudW0gYnJlYWtfdHlwZSB0eXBlOwkJLyogdHlwZSBvZiBicmVha3BvaW50ICovCisgIENPUkVfQUREUiBhZGRyOwkJLyogYWRkcmVzcyBvZiBicmVha3BvaW50ICovCisgIGludCBsZW47CQkJLyogbGVuZ3RoIG9mIHJlZ2lvbiBiZWluZyB3YXRjaGVkICovCisgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CQkvKiB2YWx1ZSB0byB3YXRjaCAqLworfSBsc2lfYnJlYWtwb2ludHMgW01BWF9MU0lfQlJFQUtQT0lOVFNdOworCisvKiBFcnJvci93YXJuaW5nIGNvZGVzIHJldHVybmVkIGJ5IExTSSBQTU9OIGZvciBicmVha3BvaW50IGNvbW1hbmRzLgorICAgV2FybmluZyB2YWx1ZXMgbWF5IGJlIE9SZWQgdG9nZXRoZXI7IGVycm9yIHZhbHVlcyBtYXkgbm90LiAgKi8KKyNkZWZpbmUgV19XQVJOCTB4MTAwCS8qIFRoaXMgYml0IGlzIHNldCBpZiB0aGUgZXJyb3IgY29kZSBpcyBhIHdhcm5pbmcgKi8KKyNkZWZpbmUgV19NU0sgICAweDEwMQkvKiB3YXJuaW5nOiBSYW5nZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCB2aWEgbWFzayAqLworI2RlZmluZSBXX1ZBTCAgIDB4MTAyCS8qIHdhcm5pbmc6IFZhbHVlIGNoZWNrIGlzIG5vdCBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUgKi8KKyNkZWZpbmUgV19RQUwgICAweDEwNAkvKiB3YXJuaW5nOiBSZXF1ZXN0ZWQgcXVhbGlmaWVycyBhcmUgbm90IHN1cHBvcnRlZCBpbiBoYXJkd2FyZSAqLworCisjZGVmaW5lIEVfRVJSCTB4MjAwCS8qIFRoaXMgYml0IGlzIHNldCBpZiB0aGUgZXJyb3IgY29kZSBpcyBhbiBlcnJvciAqLworI2RlZmluZSBFX0JQVCAgIDB4MjAwCS8qIGVycm9yOiBObyBzdWNoIGJyZWFrcG9pbnQgbnVtYmVyICovCisjZGVmaW5lIEVfUkdFICAgMHgyMDEJLyogZXJyb3I6IFJhbmdlIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRV9RQUwgICAweDIwMgkvKiBlcnJvcjogVGhlIHJlcXVlc3RlZCBxdWFsaWZpZXJzIGNhbiBub3QgYmUgdXNlZCAqLworI2RlZmluZSBFX09VVCAgIDB4MjAzCS8qIGVycm9yOiBPdXQgb2YgaGFyZHdhcmUgcmVzb3VyY2VzICovCisjZGVmaW5lIEVfTk9OICAgMHgyMDQJLyogZXJyb3I6IEhhcmR3YXJlIGJyZWFrcG9pbnQgbm90IHN1cHBvcnRlZCAqLworCitzdHJ1Y3QgbHNpX2Vycm9yCit7CisgIGludCBjb2RlOwkJLyogZXJyb3IgY29kZSAqLworICBjaGFyICpzdHJpbmc7CQkvKiBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29kZSAqLworfTsKKworc3RydWN0IGxzaV9lcnJvciBsc2lfd2FybmluZ190YWJsZVtdID0KK3sKKyAgeyBXX01TSywJIlJhbmdlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIHZpYSBtYXNrIiB9LAorICB7IFdfVkFMLAkiVmFsdWUgY2hlY2sgaXMgbm90IHN1cHBvcnRlZCBpbiBoYXJkd2FyZSIgfSwKKyAgeyBXX1FBTCwJIlJlcXVlc3RlZCBxdWFsaWZpZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGluIGhhcmR3YXJlIiB9LAorICB7IDAsCQlOVUxMIH0KK307CisKK3N0cnVjdCBsc2lfZXJyb3IgbHNpX2Vycm9yX3RhYmxlW10gPQoreyAgCisgIHsgRV9CUFQsCSJObyBzdWNoIGJyZWFrcG9pbnQgbnVtYmVyIiB9LAorICB7IEVfUkdFLAkiUmFuZ2UgaXMgbm90IHN1cHBvcnRlZCIgfSwKKyAgeyBFX1FBTCwJIlRoZSByZXF1ZXN0ZWQgcXVhbGlmaWVycyBjYW4gbm90IGJlIHVzZWQiIH0sCisgIHsgRV9PVVQsCSJPdXQgb2YgaGFyZHdhcmUgcmVzb3VyY2VzIiB9LAorICB7IEVfTk9OLAkiSGFyZHdhcmUgYnJlYWtwb2ludCBub3Qgc3VwcG9ydGVkIiB9LAorICB7IDAsCQlOVUxMIH0KK307CisKKy8qIFNldCB0byAxIHdpdGggdGhlICdzZXQgbW9uaXRvci13YXJuaW5ncycgY29tbWFuZCB0byBlbmFibGUgcHJpbnRpbmcKKyAgIG9mIHdhcm5pbmdzIHJldHVybmVkIGJ5IFBNT04gd2hlbiBoYXJkd2FyZSBicmVha3BvaW50cyBhcmUgdXNlZC4gICovCitzdGF0aWMgaW50IG1vbml0b3Jfd2FybmluZ3M7CisKKworc3RhdGljIHZvaWQKK2Nsb3NlX3BvcnRzKCkKK3sKKyAgbWlwc19pc19vcGVuID0gMDsKKyAgU0VSSUFMX0NMT1NFIChtaXBzX2Rlc2MpOworCisgIGlmICh1ZHBfaW5fdXNlKQorICAgIHsKKyAgICAgIFNFUklBTF9DTE9TRSAodWRwX2Rlc2MpOworICAgICAgdWRwX2luX3VzZSA9IDA7CisgICAgfQorICB0ZnRwX2luX3VzZSA9IDA7Cit9CisgICAgCisvKiBIYW5kbGUgbG93LWxldmVsIGVycm9yIHRoYXQgd2UgY2FuJ3QgcmVjb3ZlciBmcm9tLiAgTm90ZSB0aGF0IGp1c3QKKyAgIGVycm9yKClpbmcgb3V0IGZyb20gdGFyZ2V0X3dhaXQgb3Igc29tZSBzdWNoIGxvdy1sZXZlbCBwbGFjZSB3aWxsIGNhdXNlCisgICBhbGwgaGVsbCB0byBicmVhayBsb29zZS0tdGhlIHJlc3Qgb2YgR0RCIHdpbGwgdGVuZCB0byBnZXQgbGVmdCBpbiBhbgorICAgaW5jb25zaXN0ZW50IHN0YXRlLiAgKi8KKworc3RhdGljIE5PUkVUVVJOIHZvaWQKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKK21pcHNfZXJyb3IgKGNoYXIgKnN0cmluZywgLi4uKQorI2Vsc2UKK21pcHNfZXJyb3IgKHZhX2FsaXN0KQorICAgICB2YV9kY2wKKyNlbmRpZgoreworICB2YV9saXN0IGFyZ3M7CisKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyAgdmFfc3RhcnQgKGFyZ3MsIHN0cmluZyk7CisjZWxzZQorICBjaGFyICpzdHJpbmc7CisgIHZhX3N0YXJ0IChhcmdzKTsKKyAgc3RyaW5nID0gdmFfYXJnIChhcmdzLCBjaGFyICopOworI2VuZGlmCisgCisgIHRhcmdldF90ZXJtaW5hbF9vdXJzICgpOworICB3cmFwX2hlcmUoIiIpOwkJCS8qIEZvcmNlIG91dCBhbnkgYnVmZmVyZWQgb3V0cHV0ICovCisgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisgIGlmIChlcnJvcl9wcmVfcHJpbnQpCisgICAgZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgZXJyb3JfcHJlX3ByaW50KTsKKyAgdmZwcmludGZfZmlsdGVyZWQgKGdkYl9zdGRlcnIsIHN0cmluZywgYXJncyk7CisgIGZwcmludGZfZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJcbiIpOworICB2YV9lbmQgKGFyZ3MpOworICBnZGJfZmx1c2ggKGdkYl9zdGRlcnIpOworCisgIC8qIENsZWFuIHVwIGluIHN1Y2ggYSB3YXkgdGhhdCBtaXBzX2Nsb3NlIHdvbid0IHRyeSB0byB0YWxrIHRvIHRoZQorICAgICBib2FyZCAoaXQgYWxtb3N0IHN1cmVseSB3b24ndCB3b3JrIHNpbmNlIHdlIHdlcmVuJ3QgYWJsZSB0byB0YWxrIHRvCisgICAgIGl0KS4gICovCisgIGNsb3NlX3BvcnRzICgpOworCisgIHByaW50Zl91bmZpbHRlcmVkICgiRW5kaW5nIHJlbW90ZSBNSVBTIGRlYnVnZ2luZy5cbiIpOworICB0YXJnZXRfbW91cm5faW5mZXJpb3IgKCk7CisKKyAgcmV0dXJuX3RvX3RvcF9sZXZlbCAoUkVUVVJOX0VSUk9SKTsKK30KKworLyogcHV0Y19yZWFkYWJsZSAtIHByaW50IGEgY2hhcmFjdGVyLCBkaXNwbGF5aW5nIG5vbi1wcmludGFibGUgY2hhcnMgaW4KKyAgIF54IG5vdGF0aW9uIG9yIGluIGhleC4gICovCisKK3N0YXRpYyB2b2lkCitwdXRjX3JlYWRhYmxlIChjaCkKKyAgICAgaW50IGNoOworeworICBpZiAoY2ggPT0gJ1xuJykKKyAgICBwdXRjaGFyX3VuZmlsdGVyZWQgKCdcbicpOworICBlbHNlIGlmIChjaCA9PSAnXHInKQorICAgIHByaW50Zl91bmZpbHRlcmVkICgiXFxyIik7CisgIGVsc2UgaWYgKGNoIDwgMHgyMCkJLyogQVNDSUkgY29udHJvbCBjaGFyYWN0ZXIgKi8KKyAgICBwcmludGZfdW5maWx0ZXJlZCAoIl4lYyIsIGNoICsgJ0AnKTsKKyAgZWxzZSBpZiAoY2ggPj0gMHg3ZikJLyogbm9uLUFTQ0lJIGNoYXJhY3RlcnMgKHJ1Ym91dCBvciBncmVhdGVyKSAqLworICAgIHByaW50Zl91bmZpbHRlcmVkICgiWyUwMnhdIiwgY2ggJiAweGZmKTsKKyAgZWxzZQorICAgIHB1dGNoYXJfdW5maWx0ZXJlZCAoY2gpOworfQorCisKKy8qIHB1dHNfcmVhZGFibGUgLSBwcmludCBhIHN0cmluZywgZGlzcGxheWluZyBub24tcHJpbnRhYmxlIGNoYXJzIGluCisgICBeeCBub3RhdGlvbiBvciBpbiBoZXguICAqLworCitzdGF0aWMgdm9pZAorcHV0c19yZWFkYWJsZSAoc3RyaW5nKQorICAgICBjaGFyICpzdHJpbmc7Cit7CisgIGludCBjOworCisgIHdoaWxlICgoYyA9ICpzdHJpbmcrKykgIT0gJ1wwJykKKyAgICBwdXRjX3JlYWRhYmxlIChjKTsKK30KKworCisvKiBXYWl0IHVudGlsIFNUUklORyBzaG93cyB1cCBpbiBtaXBzX2Rlc2MuICBSZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bCwgZWxzZSAwIGlmCisgICB0aW1lZCBvdXQuICBUSU1FT1VUIHNwZWNpZmllcyB0aW1lb3V0IHZhbHVlIGluIHNlY29uZHMuCisqLworCitpbnQKK21pcHNfZXhwZWN0X3RpbWVvdXQgKHN0cmluZywgdGltZW91dCkKKyAgICAgY2hhciAqc3RyaW5nOworICAgICBpbnQgdGltZW91dDsKK3sKKyAgY2hhciAqcCA9IHN0cmluZzsKKworICBpZiAocmVtb3RlX2RlYnVnKQorICAgIHsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiRXhwZWN0ZWQgXCIiKTsKKyAgICAgIHB1dHNfcmVhZGFibGUgKHN0cmluZyk7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIlwiLCBnb3QgXCIiKTsKKyAgICB9CisKKyAgaW1tZWRpYXRlX3F1aXQgPSAxOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpbnQgYzsKKworLyogTXVzdCB1c2UgU0VSSUFMX1JFQURDSEFSIGhlcmUgY3V6IG1pcHNfcmVhZGNoYXIgd291bGQgZ2V0IGNvbmZ1c2VkIGlmIHdlCisgICB3ZXJlIHdhaXRpbmcgZm9yIHRoZSBtaXBzX21vbml0b3JfcHJvbXB0Li4uICovCisKKyAgICAgIGMgPSBTRVJJQUxfUkVBRENIQVIgKG1pcHNfZGVzYywgdGltZW91dCk7CisKKyAgICAgIGlmIChjID09IFNFUklBTF9USU1FT1VUKQorCXsKKwkgIGlmIChyZW1vdGVfZGVidWcpCisJICAgIHByaW50Zl91bmZpbHRlcmVkICgiXCI6IEZBSUxcbiIpOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICBpZiAocmVtb3RlX2RlYnVnKQorCXB1dGNfcmVhZGFibGUgKGMpOworCisgICAgICBpZiAoYyA9PSAqcCsrKQorCXsJCisJICBpZiAoKnAgPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGltbWVkaWF0ZV9xdWl0ID0gMDsKKwkgICAgICBpZiAocmVtb3RlX2RlYnVnKQorCSAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiXCI6IE9LXG4iKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBwID0gc3RyaW5nOworCSAgaWYgKGMgPT0gKnApCisJICAgIHArKzsKKwl9CisgICAgfQorfQorCisvKiBXYWl0IHVudGlsIFNUUklORyBzaG93cyB1cCBpbiBtaXBzX2Rlc2MuICBSZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bCwgZWxzZSAwIGlmCisgICB0aW1lZCBvdXQuICBUaGUgdGltZW91dCB2YWx1ZSBpcyBoYXJkLWNvZGVkIHRvIDIgc2Vjb25kcy4gIFVzZQorICAgbWlwc19leHBlY3RfdGltZW91dCBpZiBhIGRpZmZlcmVudCB0aW1lb3V0IHZhbHVlIGlzIG5lZWRlZC4KKyovCisKK2ludAorbWlwc19leHBlY3QgKHN0cmluZykKKyAgICAgY2hhciAqc3RyaW5nOworeworICAgIHJldHVybiBtaXBzX2V4cGVjdF90aW1lb3V0IChzdHJpbmcsIDIpOworfQorCisvKiBSZWFkIHRoZSByZXF1aXJlZCBudW1iZXIgb2YgY2hhcmFjdGVycyBpbnRvIHRoZSBnaXZlbiBidWZmZXIgKHdoaWNoCisgICBpcyBhc3N1bWVkIHRvIGJlIGxhcmdlIGVub3VnaCkuIFRoZSBvbmx5IGZhaWx1cmUgaXMgYSB0aW1lb3V0LiAqLworaW50CittaXBzX2dldHN0cmluZyAoc3RyaW5nLCBuKQorICAgICBjaGFyICpzdHJpbmc7CisgICAgIGludCBuOworeworICBjaGFyICpwID0gc3RyaW5nOworICBpbnQgYzsKKworICBpbW1lZGlhdGVfcXVpdCA9IDE7CisgIHdoaWxlIChuID4gMCkKKyAgICB7CisgICAgICBjID0gU0VSSUFMX1JFQURDSEFSIChtaXBzX2Rlc2MsIDIpOworCisgICAgICBpZiAoYyA9PSBTRVJJQUxfVElNRU9VVCkgeworICAgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsCisJCQkgICAgIkZhaWxlZCB0byByZWFkICVkIGNoYXJhY3RlcnMgZnJvbSB0YXJnZXQgKFRJTUVPVVQpXG4iLCBuKTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgKnArKyA9IGM7CisgICAgICBuLS07CisgICAgfQorCisgIHJldHVybiAxOworfQorCisvKiBSZWFkIGEgY2hhcmFjdGVyIGZyb20gdGhlIHJlbW90ZSwgYWJvcnRpbmcgb24gZXJyb3IuICBSZXR1cm5zCisgICBTRVJJQUxfVElNRU9VVCBvbiB0aW1lb3V0IChzaW5jZSB0aGF0J3Mgd2hhdCBTRVJJQUxfUkVBRENIQVIKKyAgIHJldHVybnMpLiAgRklYTUU6IElmIHdlIHNlZSB0aGUgc3RyaW5nIG1pcHNfbW9uaXRvcl9wcm9tcHQgZnJvbQorICAgdGhlIGJvYXJkLCB0aGVuIHdlIGFyZSBkZWJ1Z2dpbmcgb24gdGhlIG1haW4gY29uc29sZSBwb3J0LCBhbmQgd2UKKyAgIGhhdmUgc29tZWhvdyBkcm9wcGVkIG91dCBvZiByZW1vdGUgZGVidWdnaW5nIG1vZGUuICBJbiB0aGlzIGNhc2UsCisgICB3ZSBhdXRvbWF0aWNhbGx5IGdvIGJhY2sgaW4gdG8gcmVtb3RlIGRlYnVnZ2luZyBtb2RlLiAgVGhpcyBpcyBhCisgICBoYWNrLCBwdXQgaW4gYmVjYXVzZSBJIGNhbid0IGZpbmQgYW55IHdheSBmb3IgYSBwcm9ncmFtIHJ1bm5pbmcgb24KKyAgIHRoZSByZW1vdGUgYm9hcmQgdG8gdGVybWluYXRlIHdpdGhvdXQgYWxzbyBlbmRpbmcgcmVtb3RlIGRlYnVnZ2luZworICAgbW9kZS4gIEkgYXNzdW1lIHVzZXJzIHdvbid0IGhhdmUgYW55IHRyb3VibGUgd2l0aCB0aGlzOyBmb3Igb25lCisgICB0aGluZywgdGhlIElEVCBkb2N1bWVudGF0aW9uIGdlbmVyYWxseSBhc3N1bWVzIHRoYXQgdGhlIHJlbW90ZQorICAgZGVidWdnaW5nIHBvcnQgaXMgbm90IHRoZSBjb25zb2xlIHBvcnQuICBUaGlzIGlzLCBob3dldmVyLCB2ZXJ5CisgICBjb252ZW5pZW50IGZvciBEZWphR251IHdoZW4geW91IG9ubHkgaGF2ZSBvbmUgY29ubmVjdGVkIHNlcmlhbAorICAgcG9ydC4gICovCisKK3N0YXRpYyBpbnQKK21pcHNfcmVhZGNoYXIgKHRpbWVvdXQpCisgICAgIGludCB0aW1lb3V0OworeworICBpbnQgY2g7CisgIHN0YXRpYyBpbnQgc3RhdGUgPSAwOworICBpbnQgbWlwc19tb25pdG9yX3Byb21wdF9sZW4gPSBzdHJsZW4gKG1pcHNfbW9uaXRvcl9wcm9tcHQpOworCisjaWZkZWYgTUFJTlRFTkFOQ0VfQ01EUworICB7CisgICAgaW50IGk7CisKKyAgICBpID0gdGltZW91dDsKKyAgICBpZiAoaSA9PSAtMSAmJiB3YXRjaGRvZyA+IDApCisgICAgIGkgPSB3YXRjaGRvZzsKKyAgfQorI2VuZGlmCisKKyAgaWYgKHN0YXRlID09IG1pcHNfbW9uaXRvcl9wcm9tcHRfbGVuKQorICAgIHRpbWVvdXQgPSAxOworICBjaCA9IFNFUklBTF9SRUFEQ0hBUiAobWlwc19kZXNjLCB0aW1lb3V0KTsKKyNpZmRlZiBNQUlOVEVOQU5DRV9DTURTCisgIGlmIChjaCA9PSBTRVJJQUxfVElNRU9VVCAmJiB0aW1lb3V0ID09IC0xKSAvKiBXYXRjaGRvZyB3ZW50IG9mZiAqLworICAgIHsKKyAgICAgIHRhcmdldF9tb3Vybl9pbmZlcmlvciAoKTsKKyAgICAgIGVycm9yICgiV2F0Y2hkb2cgaGFzIGV4cGlyZWQuICBUYXJnZXQgZGV0YWNoZWQuXG4iKTsKKyAgICB9CisjZW5kaWYKKyAgaWYgKGNoID09IFNFUklBTF9FT0YpCisgICAgbWlwc19lcnJvciAoIkVuZCBvZiBmaWxlIGZyb20gcmVtb3RlIik7CisgIGlmIChjaCA9PSBTRVJJQUxfRVJST1IpCisgICAgbWlwc19lcnJvciAoIkVycm9yIHJlYWRpbmcgZnJvbSByZW1vdGU6ICVzIiwgc2FmZV9zdHJlcnJvciAoZXJybm8pKTsKKyAgaWYgKHJlbW90ZV9kZWJ1ZyA+IDEpCisgICAgeworICAgICAgLyogRG9uJ3QgdXNlIF9maWx0ZXJlZDsgd2UgY2FuJ3QgZGVhbCB3aXRoIGEgUVVJVCBvdXQgb2YKKwkgdGFyZ2V0X3dhaXQsIGFuZCBJIHRoaW5rIHRoaXMgbWlnaHQgYmUgY2FsbGVkIGZyb20gdGhlcmUuICAqLworICAgICAgaWYgKGNoICE9IFNFUklBTF9USU1FT1VUKQorCXByaW50Zl91bmZpbHRlcmVkICgiUmVhZCAnJWMnICVkIDB4JXhcbiIsIGNoLCBjaCwgY2gpOworICAgICAgZWxzZQorCXByaW50Zl91bmZpbHRlcmVkICgiVGltZWQgb3V0IGluIHJlYWRcbiIpOworICAgIH0KKworICAvKiBJZiB3ZSBoYXZlIHNlZW4gbWlwc19tb25pdG9yX3Byb21wdCBhbmQgd2UgZWl0aGVyIHRpbWUgb3V0LCBvcgorICAgICB3ZSBzZWUgYSBAICh3aGljaCB3YXMgZWNob2VkIGZyb20gYSBwYWNrZXQgd2Ugc2VudCksIHJlc2V0IHRoZQorICAgICBib2FyZCBhcyBkZXNjcmliZWQgYWJvdmUuICBUaGUgZmlyc3QgY2hhcmFjdGVyIGluIGEgcGFja2V0IGFmdGVyCisgICAgIHRoZSBTWU4gKHdoaWNoIGlzIG5vdCBlY2hvZWQpIGlzIGFsd2F5cyBhbiBAIHVubGVzcyB0aGUgcGFja2V0IGlzCisgICAgIG1vcmUgdGhhbiA2NCBjaGFyYWN0ZXJzIGxvbmcsIHdoaWNoIG91cnMgbmV2ZXIgYXJlLiAgKi8KKyAgaWYgKChjaCA9PSBTRVJJQUxfVElNRU9VVCB8fCBjaCA9PSAnQCcpCisgICAgICAmJiBzdGF0ZSA9PSBtaXBzX21vbml0b3JfcHJvbXB0X2xlbgorICAgICAgJiYgISBtaXBzX2luaXRpYWxpemluZworICAgICAgJiYgISBtaXBzX2V4aXRpbmcpCisgICAgeworICAgICAgaWYgKHJlbW90ZV9kZWJ1ZyA+IDApCisJLyogRG9uJ3QgdXNlIF9maWx0ZXJlZDsgd2UgY2FuJ3QgZGVhbCB3aXRoIGEgUVVJVCBvdXQgb2YKKwkgICB0YXJnZXRfd2FpdCwgYW5kIEkgdGhpbmsgdGhpcyBtaWdodCBiZSBjYWxsZWQgZnJvbSB0aGVyZS4gICovCisJcHJpbnRmX3VuZmlsdGVyZWQgKCJSZWluaXRpYWxpemluZyBNSVBTIGRlYnVnZ2luZyBtb2RlXG4iKTsKKworICAgICAgbWlwc19uZWVkX3JlcGx5ID0gMDsKKyAgICAgIG1pcHNfaW5pdGlhbGl6ZSAoKTsKKworICAgICAgc3RhdGUgPSAwOworCisgICAgICAvKiBBdCB0aGlzIHBvaW50LCBhYm91dCB0aGUgb25seSB0aGluZyB3ZSBjYW4gZG8gaXMgYWJvcnQgdGhlIGNvbW1hbmQKKwkgaW4gcHJvZ3Jlc3MgYW5kIGdldCBiYWNrIHRvIGNvbW1hbmQgbGV2ZWwgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4gKi8KKworICAgICAgZXJyb3IgKCJSZW1vdGUgYm9hcmQgcmVzZXQsIGRlYnVnIHByb3RvY29sIHJlLWluaXRpYWxpemVkLiIpOworICAgIH0KKworICBpZiAoY2ggPT0gbWlwc19tb25pdG9yX3Byb21wdFtzdGF0ZV0pCisgICAgKytzdGF0ZTsKKyAgZWxzZQorICAgIHN0YXRlID0gMDsKKworICByZXR1cm4gY2g7Cit9CisKKy8qIEdldCBhIHBhY2tldCBoZWFkZXIsIHB1dHRpbmcgdGhlIGRhdGEgaW4gdGhlIHN1cHBsaWVkIGJ1ZmZlci4KKyAgIFBHQVJCQUdFIGlzIGEgcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGdhcmJhZ2UgY2hhcmFjdGVycyByZWNlaXZlZAorICAgc28gZmFyLiAgQ0ggaXMgdGhlIGxhc3QgY2hhcmFjdGVyIHJlY2VpdmVkLiAgUmV0dXJucyAwIGZvciBzdWNjZXNzLAorICAgb3IgLTEgZm9yIHRpbWVvdXQuICAqLworCitzdGF0aWMgaW50CittaXBzX3JlY2VpdmVfaGVhZGVyIChoZHIsIHBnYXJiYWdlLCBjaCwgdGltZW91dCkKKyAgICAgdW5zaWduZWQgY2hhciAqaGRyOworICAgICBpbnQgKnBnYXJiYWdlOworICAgICBpbnQgY2g7CisgICAgIGludCB0aW1lb3V0OworeworICBpbnQgaTsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAvKiBXYWl0IGZvciBhIFNZTi4gIG1pcHNfc3luX2dhcmJhZ2UgaXMgaW50ZW5kZWQgdG8gcHJldmVudAorCSBzaXR0aW5nIGhlcmUgaW5kZWZpbml0ZWx5IGlmIHRoZSBib2FyZCBzZW5kcyB1cyBvbmUgZ2FyYmFnZQorCSBjaGFyYWN0ZXIgcGVyIHNlY29uZC4gIGNoIG1heSBhbHJlYWR5IGhhdmUgYSB2YWx1ZSBmcm9tIHRoZQorCSBsYXN0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcC4gICovCisgICAgICB3aGlsZSAoY2ggIT0gU1lOKQorCXsKKwkgIGNoID0gbWlwc19yZWFkY2hhciAodGltZW91dCk7CisJICBpZiAoY2ggPT0gU0VSSUFMX1RJTUVPVVQpCisgICAgICAgICAgIHJldHVybiAtMTsKKwkgIGlmIChjaCAhPSBTWU4pCisJICAgIHsKKwkgICAgICAvKiBQcmludGluZyB0aGUgY2hhcmFjdGVyIGhlcmUgbGV0cyB0aGUgdXNlciBvZiBnZGIgc2VlCisJCSB3aGF0IHRoZSBwcm9ncmFtIGlzIG91dHB1dHRpbmcsIGlmIHRoZSBkZWJ1Z2dpbmcgaXMKKwkJIGJlaW5nIGRvbmUgb24gdGhlIGNvbnNvbGUgcG9ydC4gIERvbid0IHVzZSBfZmlsdGVyZWQ7CisJCSB3ZSBjYW4ndCBkZWFsIHdpdGggYSBRVUlUIG91dCBvZiB0YXJnZXRfd2FpdC4gICovCisJICAgICAgaWYgKCEgbWlwc19pbml0aWFsaXppbmcgfHwgcmVtb3RlX2RlYnVnID4gMCkKKwkJeworCQkgIHB1dGNfcmVhZGFibGUgKGNoKTsKKwkJICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCQl9CisKKwkgICAgICArKypwZ2FyYmFnZTsKKwkgICAgICBpZiAobWlwc19zeW5fZ2FyYmFnZSA+IDAKKwkJICAmJiAqcGdhcmJhZ2UgPiBtaXBzX3N5bl9nYXJiYWdlKQorCQltaXBzX2Vycm9yICgiRGVidWcgcHJvdG9jb2wgZmFpbHVyZTogIG1vcmUgdGhhbiAlZCBjaGFyYWN0ZXJzIGJlZm9yZSBhIHN5bmMuIiwgCisJCQkgICAgbWlwc19zeW5fZ2FyYmFnZSk7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIEdldCB0aGUgcGFja2V0IGhlYWRlciBmb2xsb3dpbmcgdGhlIFNZTi4gICovCisgICAgICBmb3IgKGkgPSAxOyBpIDwgSERSX0xFTkdUSDsgaSsrKQorCXsKKwkgIGNoID0gbWlwc19yZWFkY2hhciAodGltZW91dCk7CisJICBpZiAoY2ggPT0gU0VSSUFMX1RJTUVPVVQpCisgICAgICAgICAgICByZXR1cm4gLTE7CisJICAvKiBNYWtlIHN1cmUgdGhpcyBpcyBhIGhlYWRlciBieXRlLiAgKi8KKwkgIGlmIChjaCA9PSBTWU4gfHwgISBIRFJfQ0hFQ0sgKGNoKSkKKwkgICAgYnJlYWs7CisKKwkgIGhkcltpXSA9IGNoOworCX0KKworICAgICAgLyogSWYgd2UgZ290IHRoZSBjb21wbGV0ZSBoZWFkZXIsIHdlIGNhbiByZXR1cm4uICBPdGhlcndpc2Ugd2UKKwkgbG9vcCBhcm91bmQgYW5kIGtlZXAgbG9va2luZyBmb3IgU1lOLiAgKi8KKyAgICAgIGlmIChpID49IEhEUl9MRU5HVEgpCisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyogR2V0IGEgcGFja2V0IGhlYWRlciwgcHV0dGluZyB0aGUgZGF0YSBpbiB0aGUgc3VwcGxpZWQgYnVmZmVyLgorICAgUEdBUkJBR0UgaXMgYSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgZ2FyYmFnZSBjaGFyYWN0ZXJzIHJlY2VpdmVkCisgICBzbyBmYXIuICBUaGUgbGFzdCBjaGFyYWN0ZXIgcmVhZCBpcyByZXR1cm5lZCBpbiAqUENILiAgUmV0dXJucyAwCisgICBmb3Igc3VjY2VzcywgLTEgZm9yIHRpbWVvdXQsIC0yIGZvciBlcnJvci4gICovCisKK3N0YXRpYyBpbnQKK21pcHNfcmVjZWl2ZV90cmFpbGVyICh0cmxyLCBwZ2FyYmFnZSwgcGNoLCB0aW1lb3V0KQorICAgICB1bnNpZ25lZCBjaGFyICp0cmxyOworICAgICBpbnQgKnBnYXJiYWdlOworICAgICBpbnQgKnBjaDsKKyAgICAgaW50IHRpbWVvdXQ7Cit7CisgIGludCBpOworICBpbnQgY2g7CisKKyAgZm9yIChpID0gMDsgaSA8IFRSTFJfTEVOR1RIOyBpKyspCisgICAgeworICAgICAgY2ggPSBtaXBzX3JlYWRjaGFyICh0aW1lb3V0KTsKKyAgICAgICpwY2ggPSBjaDsKKyAgICAgIGlmIChjaCA9PSBTRVJJQUxfVElNRU9VVCkKKwlyZXR1cm4gLTE7CisgICAgICBpZiAoISBUUkxSX0NIRUNLIChjaCkpCisJcmV0dXJuIC0yOworICAgICAgdHJscltpXSA9IGNoOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIEdldCB0aGUgY2hlY2tzdW0gb2YgYSBwYWNrZXQuICBIRFIgcG9pbnRzIHRvIHRoZSBwYWNrZXQgaGVhZGVyLgorICAgREFUQSBwb2ludHMgdG8gdGhlIHBhY2tldCBkYXRhLiAgTEVOIGlzIHRoZSBsZW5ndGggb2YgREFUQS4gICovCisKK3N0YXRpYyBpbnQKK21pcHNfY2tzdW0gKGhkciwgZGF0YSwgbGVuKQorICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpoZHI7CisgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgIGludCBsZW47Cit7CisgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisgIHJlZ2lzdGVyIGludCBjOworICByZWdpc3RlciBpbnQgY2tzdW07CisKKyAgY2tzdW0gPSAwOworCisgIC8qIFRoZSBpbml0aWFsIFNZTiBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGNoZWNrc3VtLiAgKi8KKyAgYyA9IEhEUl9MRU5HVEggLSAxOworICBwID0gaGRyICsgMTsKKyAgd2hpbGUgKGMtLSAhPSAwKQorICAgIGNrc3VtICs9ICpwKys7CisgIAorICBjID0gbGVuOworICBwID0gZGF0YTsKKyAgd2hpbGUgKGMtLSAhPSAwKQorICAgIGNrc3VtICs9ICpwKys7CisKKyAgcmV0dXJuIGNrc3VtOworfQorCisvKiBTZW5kIGEgcGFja2V0IGNvbnRhaW5pbmcgdGhlIGdpdmVuIEFTQ0lJIHN0cmluZy4gICovCisKK3N0YXRpYyB2b2lkCittaXBzX3NlbmRfcGFja2V0IChzLCBnZXRfYWNrKQorICAgICBjb25zdCBjaGFyICpzOworICAgICBpbnQgZ2V0X2FjazsKK3sKKyAgLyogdW5zaWduZWQgKi8gaW50IGxlbjsKKyAgdW5zaWduZWQgY2hhciAqcGFja2V0OworICByZWdpc3RlciBpbnQgY2tzdW07CisgIGludCB0cnk7CisKKyAgbGVuID0gc3RybGVuIChzKTsKKyAgaWYgKGxlbiA+IERBVEFfTUFYTEVOKQorICAgIG1pcHNfZXJyb3IgKCJNSVBTIHByb3RvY29sIGRhdGEgcGFja2V0IHRvbyBsb25nOiAlcyIsIHMpOworCisgIHBhY2tldCA9ICh1bnNpZ25lZCBjaGFyICopIGFsbG9jYSAoSERSX0xFTkdUSCArIGxlbiArIFRSTFJfTEVOR1RIICsgMSk7CisKKyAgcGFja2V0W0hEUl9JTkRYX1NZTl0gPSBIRFJfU0VUX1NZTiAoMSwgbGVuLCBtaXBzX3NlbmRfc2VxKTsKKyAgcGFja2V0W0hEUl9JTkRYX1RZUEVfTEVOXSA9IEhEUl9TRVRfVFlQRV9MRU4gKDEsIGxlbiwgbWlwc19zZW5kX3NlcSk7CisgIHBhY2tldFtIRFJfSU5EWF9MRU4xXSA9IEhEUl9TRVRfTEVOMSAoMSwgbGVuLCBtaXBzX3NlbmRfc2VxKTsKKyAgcGFja2V0W0hEUl9JTkRYX1NFUV0gPSBIRFJfU0VUX1NFUSAoMSwgbGVuLCBtaXBzX3NlbmRfc2VxKTsKKworICBtZW1jcHkgKHBhY2tldCArIEhEUl9MRU5HVEgsIHMsIGxlbik7CisKKyAgY2tzdW0gPSBtaXBzX2Nrc3VtIChwYWNrZXQsIHBhY2tldCArIEhEUl9MRU5HVEgsIGxlbik7CisgIHBhY2tldFtIRFJfTEVOR1RIICsgbGVuICsgVFJMUl9JTkRYX0NTVU0xXSA9IFRSTFJfU0VUX0NTVU0xIChja3N1bSk7CisgIHBhY2tldFtIRFJfTEVOR1RIICsgbGVuICsgVFJMUl9JTkRYX0NTVU0yXSA9IFRSTFJfU0VUX0NTVU0yIChja3N1bSk7CisgIHBhY2tldFtIRFJfTEVOR1RIICsgbGVuICsgVFJMUl9JTkRYX0NTVU0zXSA9IFRSTFJfU0VUX0NTVU0zIChja3N1bSk7CisKKyAgLyogSW5jcmVtZW50IHRoZSBzZXF1ZW5jZSBudW1iZXIuICBUaGlzIHdpbGwgc2V0IG1pcHNfc2VuZF9zZXEgdG8KKyAgICAgdGhlIHNlcXVlbmNlIG51bWJlciB3ZSBleHBlY3QgaW4gdGhlIGFja25vd2xlZGdlbWVudC4gICovCisgIG1pcHNfc2VuZF9zZXEgPSAobWlwc19zZW5kX3NlcSArIDEpICUgU0VRX01PRFVMT1M7CisKKyAgLyogV2UgY2FuIG9ubHkgaGF2ZSBvbmUgb3V0c3RhbmRpbmcgZGF0YSBwYWNrZXQsIHNvIHdlIGp1c3Qgd2FpdCBmb3IKKyAgICAgdGhlIGFja25vd2xlZGdlbWVudCBoZXJlLiAgS2VlcCByZXRyYW5zbWl0dGluZyB0aGUgcGFja2V0IHVudGlsCisgICAgIHdlIGdldCBvbmUsIG9yIHVudGlsIHdlJ3ZlIHRyaWVkIHRvbyBtYW55IHRpbWVzLiAgKi8KKyAgZm9yICh0cnkgPSAwOyB0cnkgPCBtaXBzX3NlbmRfcmV0cmllczsgdHJ5KyspCisgICAgeworICAgICAgaW50IGdhcmJhZ2U7CisgICAgICBpbnQgY2g7CisKKyAgICAgIGlmIChyZW1vdGVfZGVidWcgPiAwKQorCXsKKwkgIC8qIERvbid0IHVzZSBfZmlsdGVyZWQ7IHdlIGNhbid0IGRlYWwgd2l0aCBhIFFVSVQgb3V0IG9mCisJICAgICB0YXJnZXRfd2FpdCwgYW5kIEkgdGhpbmsgdGhpcyBtaWdodCBiZSBjYWxsZWQgZnJvbSB0aGVyZS4gICovCisJICBwYWNrZXRbSERSX0xFTkdUSCArIGxlbiArIFRSTFJfTEVOR1RIXSA9ICdcMCc7CisJICBwcmludGZfdW5maWx0ZXJlZCAoIldyaXRpbmcgXCIlc1wiXG4iLCBwYWNrZXQgKyAxKTsKKwl9CisKKyAgICAgIGlmIChTRVJJQUxfV1JJVEUgKG1pcHNfZGVzYywgcGFja2V0LAorCQkJSERSX0xFTkdUSCArIGxlbiArIFRSTFJfTEVOR1RIKSAhPSAwKQorCW1pcHNfZXJyb3IgKCJ3cml0ZSB0byB0YXJnZXQgZmFpbGVkOiAlcyIsIHNhZmVfc3RyZXJyb3IgKGVycm5vKSk7CisKKyAgICAgIGlmICghIGdldF9hY2spCisJcmV0dXJuOworCisgICAgICBnYXJiYWdlID0gMDsKKyAgICAgIGNoID0gMDsKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIHVuc2lnbmVkIGNoYXIgaGRyW0hEUl9MRU5HVEggKyAxXTsKKwkgIHVuc2lnbmVkIGNoYXIgdHJscltUUkxSX0xFTkdUSCArIDFdOworCSAgaW50IGVycjsKKwkgIHVuc2lnbmVkIGludCBzZXE7CisKKwkgIC8qIEdldCB0aGUgcGFja2V0IGhlYWRlci4gIElmIHdlIHRpbWUgb3V0LCByZXNlbmQgdGhlIGRhdGEKKwkgICAgIHBhY2tldC4gICovCisJICBlcnIgPSBtaXBzX3JlY2VpdmVfaGVhZGVyIChoZHIsICZnYXJiYWdlLCBjaCwgbWlwc19yZXRyYW5zbWl0X3dhaXQpOworCSAgaWYgKGVyciAhPSAwKQorCSAgICBicmVhazsKKworCSAgY2ggPSAwOworCisJICAvKiBJZiB3ZSBnZXQgYSBkYXRhIHBhY2tldCwgYXNzdW1lIGl0IGlzIGEgZHVwbGljYXRlIGFuZAorCSAgICAgaWdub3JlIGl0LiAgRklYTUU6IElmIHRoZSBhY2tub3dsZWRnZW1lbnQgaXMgbG9zdCwgdGhpcworCSAgICAgZGF0YSBwYWNrZXQgbWF5IGJlIHRoZSBwYWNrZXQgdGhlIHJlbW90ZSBzZW5kcyBhZnRlciB0aGUKKwkgICAgIGFja25vd2xlZGdlbWVudC4gICovCisJICBpZiAoSERSX0lTX0RBVEEgKGhkcikpIHsKKyAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICAvKiBJZ25vcmUgYW55IGVycm9ycyByYWlzZWQgd2hpbHN0IGF0dGVtcHRpbmcgdG8gaWdub3JlCisgICAgICAgICAgICAgICBwYWNrZXQuICovCisKKyAgICAgICAgICAgIGxlbiA9IEhEUl9HRVRfTEVOIChoZHIpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcmNoOworCisgICAgICAgICAgICAgICAgcmNoID0gbWlwc19yZWFkY2hhciAoMik7CisgICAgICAgICAgICAgICAgaWYgKHJjaCA9PSBTWU4pCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gU1lOOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmNoID09IFNFUklBTF9USU1FT1VUKQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogaWdub3JlIHRoZSBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaSA9PSBsZW4pCisgICAgICAgICAgICAgICh2b2lkKSBtaXBzX3JlY2VpdmVfdHJhaWxlciAodHJsciwgJmdhcmJhZ2UsICZjaCwgMik7CisKKyAgICAgICAgICAgIC8qIFdlIGRvbid0IGJvdGhlciBjaGVja2luZyB0aGUgY2hlY2tzdW0sIG9yIHByb3ZpZGluZyBhbgorICAgICAgICAgICAgICAgQUNLIHRvIHRoZSBwYWNrZXQuICovCisJICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworCSAgLyogSWYgdGhlIGxlbmd0aCBpcyBub3QgMCwgdGhpcyBpcyBhIGdhcmJsZWQgcGFja2V0LiAgKi8KKwkgIGlmIChIRFJfR0VUX0xFTiAoaGRyKSAhPSAwKQorCSAgICBjb250aW51ZTsKKworCSAgLyogR2V0IHRoZSBwYWNrZXQgdHJhaWxlci4gICovCisJICBlcnIgPSBtaXBzX3JlY2VpdmVfdHJhaWxlciAodHJsciwgJmdhcmJhZ2UsICZjaCwKKwkJCQkgICAgICBtaXBzX3JldHJhbnNtaXRfd2FpdCk7CisKKwkgIC8qIElmIHdlIHRpbWVkIG91dCwgcmVzZW5kIHRoZSBkYXRhIHBhY2tldC4gICovCisJICBpZiAoZXJyID09IC0xKQorCSAgICBicmVhazsKKworCSAgLyogSWYgd2UgZ290IGEgYmFkIGNoYXJhY3RlciwgcmVyZWFkIHRoZSBoZWFkZXIuICAqLworCSAgaWYgKGVyciAhPSAwKQorCSAgICBjb250aW51ZTsKKworCSAgLyogSWYgdGhlIGNoZWNrc3VtIGRvZXMgbm90IG1hdGNoIHRoZSB0cmFpbGVyIGNoZWNrc3VtLCB0aGlzCisJICAgICBpcyBhIGJhZCBwYWNrZXQ7IGlnbm9yZSBpdC4gICovCisJICBpZiAobWlwc19ja3N1bSAoaGRyLCAodW5zaWduZWQgY2hhciAqKSBOVUxMLCAwKQorCSAgICAgICE9IFRSTFJfR0VUX0NLU1VNICh0cmxyKSkKKwkgICAgY29udGludWU7CisKKwkgIGlmIChyZW1vdGVfZGVidWcgPiAwKQorCSAgICB7CisJICAgICAgaGRyW0hEUl9MRU5HVEhdID0gJ1wwJzsKKwkgICAgICB0cmxyW1RSTFJfTEVOR1RIXSA9ICdcMCc7CisJICAgICAgLyogRG9uJ3QgdXNlIF9maWx0ZXJlZDsgd2UgY2FuJ3QgZGVhbCB3aXRoIGEgUVVJVCBvdXQgb2YKKwkJIHRhcmdldF93YWl0LCBhbmQgSSB0aGluayB0aGlzIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIHRoZXJlLiAgKi8KKwkgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIkdvdCBhY2sgJWQgXCIlcyVzXCJcbiIsCisJCQkgICAgICAgSERSX0dFVF9TRVEgKGhkciksIGhkciArIDEsIHRybHIpOworCSAgICB9CisKKwkgIC8qIElmIHRoaXMgYWNrIGlzIGZvciB0aGUgY3VycmVudCBwYWNrZXQsIHdlJ3JlIGRvbmUuICAqLworCSAgc2VxID0gSERSX0dFVF9TRVEgKGhkcik7CisJICBpZiAoc2VxID09IG1pcHNfc2VuZF9zZXEpCisJICAgIHJldHVybjsKKworCSAgLyogSWYgdGhpcyBhY2sgaXMgZm9yIHRoZSBsYXN0IHBhY2tldCwgcmVzZW5kIHRoZSBjdXJyZW50CisJICAgICBwYWNrZXQuICAqLworCSAgaWYgKChzZXEgKyAxKSAlIFNFUV9NT0RVTE9TID09IG1pcHNfc2VuZF9zZXEpCisJICAgIGJyZWFrOworCisJICAvKiBPdGhlcndpc2UgdGhpcyBpcyBhIGJhZCBhY2s7IGlnbm9yZSBpdC4gIEluY3JlbWVudCB0aGUKKwkgICAgIGdhcmJhZ2UgY291bnQgdG8gZW5zdXJlIHRoYXQgd2UgZG8gbm90IHN0YXkgaW4gdGhpcyBsb29wCisJICAgICBmb3JldmVyLiAgKi8KKwkgICsrZ2FyYmFnZTsKKwl9CisgICAgfQorCisgIG1pcHNfZXJyb3IgKCJSZW1vdGUgZGlkIG5vdCBhY2tub3dsZWRnZSBwYWNrZXQiKTsKK30KKworLyogUmVjZWl2ZSBhbmQgYWNrbm93bGVkZ2UgYSBwYWNrZXQsIHJldHVybmluZyB0aGUgZGF0YSBpbiBCVUZGICh3aGljaAorICAgc2hvdWxkIGJlIERBVEFfTUFYTEVOICsgMSBieXRlcykuICBUaGUgcHJvdG9jb2wgZG9jdW1lbnRhdGlvbgorICAgaW1wbGllcyB0aGF0IG9ubHkgdGhlIHNlbmRlciByZXRyYW5zbWl0cyBwYWNrZXRzLCBzbyB0aGlzIGNvZGUganVzdAorICAgd2FpdHMgc2lsZW50bHkgZm9yIGEgcGFja2V0LiAgSXQgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZAorICAgcGFja2V0LiAgSWYgVEhST1dfRVJST1IgaXMgbm9uemVybywgY2FsbCBlcnJvcigpIG9uIGVycm9ycy4gIElmIG5vdCwKKyAgIGRvbid0IHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIHJldHVybiAtMS4gICovCisKK3N0YXRpYyBpbnQKK21pcHNfcmVjZWl2ZV9wYWNrZXQgKGJ1ZmYsIHRocm93X2Vycm9yLCB0aW1lb3V0KQorICAgICBjaGFyICpidWZmOworICAgICBpbnQgdGhyb3dfZXJyb3I7CisgICAgIGludCB0aW1lb3V0OworeworICBpbnQgY2g7CisgIGludCBnYXJiYWdlOworICBpbnQgbGVuOworICB1bnNpZ25lZCBjaGFyIGFja1tIRFJfTEVOR1RIICsgVFJMUl9MRU5HVEggKyAxXTsKKyAgaW50IGNrc3VtOworCisgIGNoID0gMDsKKyAgZ2FyYmFnZSA9IDA7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaGRyW0hEUl9MRU5HVEhdOworICAgICAgdW5zaWduZWQgY2hhciB0cmxyW1RSTFJfTEVOR1RIXTsKKyAgICAgIGludCBpOworICAgICAgaW50IGVycjsKKworICAgICAgaWYgKG1pcHNfcmVjZWl2ZV9oZWFkZXIgKGhkciwgJmdhcmJhZ2UsIGNoLCB0aW1lb3V0KSAhPSAwKQorCXsKKwkgIGlmICh0aHJvd19lcnJvcikKKwkgICAgbWlwc19lcnJvciAoIlRpbWVkIG91dCB3YWl0aW5nIGZvciByZW1vdGUgcGFja2V0Iik7CisJICBlbHNlCisJICAgIHJldHVybiAtMTsKKwl9CisKKyAgICAgIGNoID0gMDsKKworICAgICAgLyogQW4gYWNrbm93bGVkZ2VtZW50IGlzIHByb2JhYmx5IGEgZHVwbGljYXRlOyBpZ25vcmUgaXQuICAqLworICAgICAgaWYgKCEgSERSX0lTX0RBVEEgKGhkcikpCisJeworICAgICAgICAgIGxlbiA9IEhEUl9HRVRfTEVOIChoZHIpOworICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBsZW5ndGggaXMgdmFsaWQgZm9yIGFuIEFDSywgd2UgbWF5IGFzd2VsbAorICAgICAgICAgICAgIHRyeSBhbmQgcmVhZCB0aGUgcmVtYWluZGVyIG9mIHRoZSBwYWNrZXQ6ICovCisgICAgICAgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBJZ25vcmUgdGhlIGVycm9yIGNvbmRpdGlvbiwgc2luY2Ugd2UgYXJlIGdvaW5nIHRvCisgICAgICAgICAgICAgICAgIGlnbm9yZSB0aGUgcGFja2V0IGFueXdheS4gKi8KKyAgICAgICAgICAgICAgKHZvaWQpIG1pcHNfcmVjZWl2ZV90cmFpbGVyICh0cmxyLCAmZ2FyYmFnZSwgJmNoLCB0aW1lb3V0KTsKKyAgICAgICAgICAgIH0KKwkgIC8qIERvbid0IHVzZSBfZmlsdGVyZWQ7IHdlIGNhbid0IGRlYWwgd2l0aCBhIFFVSVQgb3V0IG9mCisJICAgICB0YXJnZXRfd2FpdCwgYW5kIEkgdGhpbmsgdGhpcyBtaWdodCBiZSBjYWxsZWQgZnJvbSB0aGVyZS4gICovCisJICBpZiAocmVtb3RlX2RlYnVnID4gMCkKKwkgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJJZ25vcmluZyB1bmV4cGVjdGVkIEFDS1xuIik7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGxlbiA9IEhEUl9HRVRfTEVOIChoZHIpOworICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCXsKKwkgIGludCByY2g7CisKKwkgIHJjaCA9IG1pcHNfcmVhZGNoYXIgKHRpbWVvdXQpOworCSAgaWYgKHJjaCA9PSBTWU4pCisJICAgIHsKKwkgICAgICBjaCA9IFNZTjsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgaWYgKHJjaCA9PSBTRVJJQUxfVElNRU9VVCkKKwkgICAgeworCSAgICAgIGlmICh0aHJvd19lcnJvcikKKwkJbWlwc19lcnJvciAoIlRpbWVkIG91dCB3YWl0aW5nIGZvciByZW1vdGUgcGFja2V0Iik7CisJICAgICAgZWxzZQorCQlyZXR1cm4gLTE7CisJICAgIH0KKwkgIGJ1ZmZbaV0gPSByY2g7CisJfQorCisgICAgICBpZiAoaSA8IGxlbikKKwl7CisJICAvKiBEb24ndCB1c2UgX2ZpbHRlcmVkOyB3ZSBjYW4ndCBkZWFsIHdpdGggYSBRVUlUIG91dCBvZgorCSAgICAgdGFyZ2V0X3dhaXQsIGFuZCBJIHRoaW5rIHRoaXMgbWlnaHQgYmUgY2FsbGVkIGZyb20gdGhlcmUuICAqLworCSAgaWYgKHJlbW90ZV9kZWJ1ZyA+IDApCisJICAgIHByaW50Zl91bmZpbHRlcmVkICgiR290IG5ldyBTWU4gYWZ0ZXIgJWQgY2hhcnMgKHdhbnRlZCAlZClcbiIsCisJCQkgICAgIGksIGxlbik7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGVyciA9IG1pcHNfcmVjZWl2ZV90cmFpbGVyICh0cmxyLCAmZ2FyYmFnZSwgJmNoLCB0aW1lb3V0KTsKKyAgICAgIGlmIChlcnIgPT0gLTEpCisJeworCSAgaWYgKHRocm93X2Vycm9yKQorCSAgICBtaXBzX2Vycm9yICgiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHBhY2tldCIpOworCSAgZWxzZQorCSAgICByZXR1cm4gLTE7CisJfQorICAgICAgaWYgKGVyciA9PSAtMikKKwl7CisJICAvKiBEb24ndCB1c2UgX2ZpbHRlcmVkOyB3ZSBjYW4ndCBkZWFsIHdpdGggYSBRVUlUIG91dCBvZgorCSAgICAgdGFyZ2V0X3dhaXQsIGFuZCBJIHRoaW5rIHRoaXMgbWlnaHQgYmUgY2FsbGVkIGZyb20gdGhlcmUuICAqLworCSAgaWYgKHJlbW90ZV9kZWJ1ZyA+IDApCisJICAgIHByaW50Zl91bmZpbHRlcmVkICgiR290IFNZTiB3aGVuIHdhbnRlZCB0cmFpbGVyXG4iKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogSWYgdGhpcyBpcyB0aGUgd3Jvbmcgc2VxdWVuY2UgbnVtYmVyLCBpZ25vcmUgaXQuICAqLworICAgICAgaWYgKEhEUl9HRVRfU0VRIChoZHIpICE9IG1pcHNfcmVjZWl2ZV9zZXEpCisJeworCSAgLyogRG9uJ3QgdXNlIF9maWx0ZXJlZDsgd2UgY2FuJ3QgZGVhbCB3aXRoIGEgUVVJVCBvdXQgb2YKKwkgICAgIHRhcmdldF93YWl0LCBhbmQgSSB0aGluayB0aGlzIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIHRoZXJlLiAgKi8KKwkgIGlmIChyZW1vdGVfZGVidWcgPiAwKQorCSAgICBwcmludGZfdW5maWx0ZXJlZCAoIklnbm9yaW5nIHNlcXVlbmNlIG51bWJlciAlZCAod2FudCAlZClcbiIsCisJCQkgICAgIEhEUl9HRVRfU0VRIChoZHIpLCBtaXBzX3JlY2VpdmVfc2VxKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKG1pcHNfY2tzdW0gKGhkciwgYnVmZiwgbGVuKSA9PSBUUkxSX0dFVF9DS1NVTSAodHJscikpCisgICAgICAgIGJyZWFrOworCisgICAgICBpZiAocmVtb3RlX2RlYnVnID4gMCkKKwkvKiBEb24ndCB1c2UgX2ZpbHRlcmVkOyB3ZSBjYW4ndCBkZWFsIHdpdGggYSBRVUlUIG91dCBvZgorCSAgIHRhcmdldF93YWl0LCBhbmQgSSB0aGluayB0aGlzIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIHRoZXJlLiAgKi8KKwlwcmludGZfdW5maWx0ZXJlZCAoIkJhZCBjaGVja3N1bTsgZGF0YSAlZCwgdHJhaWxlciAlZFxuIiwKKwkJCSBtaXBzX2Nrc3VtIChoZHIsIGJ1ZmYsIGxlbiksCisJCQkgVFJMUl9HRVRfQ0tTVU0gKHRybHIpKTsKKworICAgICAgLyogVGhlIGNoZWNrc3VtIGZhaWxlZC4gIFNlbmQgYW4gYWNrbm93bGVkZ2VtZW50IGZvciB0aGUKKwkgcHJldmlvdXMgcGFja2V0IHRvIHRlbGwgdGhlIHJlbW90ZSB0byByZXNlbmQgdGhlIHBhY2tldC4gICovCisgICAgICBhY2tbSERSX0lORFhfU1lOXSA9IEhEUl9TRVRfU1lOICgwLCAwLCBtaXBzX3JlY2VpdmVfc2VxKTsKKyAgICAgIGFja1tIRFJfSU5EWF9UWVBFX0xFTl0gPSBIRFJfU0VUX1RZUEVfTEVOICgwLCAwLCBtaXBzX3JlY2VpdmVfc2VxKTsKKyAgICAgIGFja1tIRFJfSU5EWF9MRU4xXSA9IEhEUl9TRVRfTEVOMSAoMCwgMCwgbWlwc19yZWNlaXZlX3NlcSk7CisgICAgICBhY2tbSERSX0lORFhfU0VRXSA9IEhEUl9TRVRfU0VRICgwLCAwLCBtaXBzX3JlY2VpdmVfc2VxKTsKKworICAgICAgY2tzdW0gPSBtaXBzX2Nrc3VtIChhY2ssICh1bnNpZ25lZCBjaGFyICopIE5VTEwsIDApOworCisgICAgICBhY2tbSERSX0xFTkdUSCArIFRSTFJfSU5EWF9DU1VNMV0gPSBUUkxSX1NFVF9DU1VNMSAoY2tzdW0pOworICAgICAgYWNrW0hEUl9MRU5HVEggKyBUUkxSX0lORFhfQ1NVTTJdID0gVFJMUl9TRVRfQ1NVTTIgKGNrc3VtKTsKKyAgICAgIGFja1tIRFJfTEVOR1RIICsgVFJMUl9JTkRYX0NTVU0zXSA9IFRSTFJfU0VUX0NTVU0zIChja3N1bSk7CisKKyAgICAgIGlmIChyZW1vdGVfZGVidWcgPiAwKQorCXsKKwkgIGFja1tIRFJfTEVOR1RIICsgVFJMUl9MRU5HVEhdID0gJ1wwJzsKKwkgIC8qIERvbid0IHVzZSBfZmlsdGVyZWQ7IHdlIGNhbid0IGRlYWwgd2l0aCBhIFFVSVQgb3V0IG9mCisJICAgICB0YXJnZXRfd2FpdCwgYW5kIEkgdGhpbmsgdGhpcyBtaWdodCBiZSBjYWxsZWQgZnJvbSB0aGVyZS4gICovCisJICBwcmludGZfdW5maWx0ZXJlZCAoIldyaXRpbmcgYWNrICVkIFwiJXNcIlxuIiwgbWlwc19yZWNlaXZlX3NlcSwKKwkJCSAgIGFjayArIDEpOworCX0KKworICAgICAgaWYgKFNFUklBTF9XUklURSAobWlwc19kZXNjLCBhY2ssIEhEUl9MRU5HVEggKyBUUkxSX0xFTkdUSCkgIT0gMCkKKwl7CisJICBpZiAodGhyb3dfZXJyb3IpCisJICAgIG1pcHNfZXJyb3IgKCJ3cml0ZSB0byB0YXJnZXQgZmFpbGVkOiAlcyIsIHNhZmVfc3RyZXJyb3IgKGVycm5vKSk7CisJICBlbHNlCisJICAgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgIGlmIChyZW1vdGVfZGVidWcgPiAwKQorICAgIHsKKyAgICAgIGJ1ZmZbbGVuXSA9ICdcMCc7CisgICAgICAvKiBEb24ndCB1c2UgX2ZpbHRlcmVkOyB3ZSBjYW4ndCBkZWFsIHdpdGggYSBRVUlUIG91dCBvZgorCSB0YXJnZXRfd2FpdCwgYW5kIEkgdGhpbmsgdGhpcyBtaWdodCBiZSBjYWxsZWQgZnJvbSB0aGVyZS4gICovCisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIkdvdCBwYWNrZXQgXCIlc1wiXG4iLCBidWZmKTsKKyAgICB9CisKKyAgLyogV2UgZ290IHRoZSBwYWNrZXQuICBTZW5kIGFuIGFja25vd2xlZGdlbWVudC4gICovCisgIG1pcHNfcmVjZWl2ZV9zZXEgPSAobWlwc19yZWNlaXZlX3NlcSArIDEpICUgU0VRX01PRFVMT1M7CisKKyAgYWNrW0hEUl9JTkRYX1NZTl0gPSBIRFJfU0VUX1NZTiAoMCwgMCwgbWlwc19yZWNlaXZlX3NlcSk7CisgIGFja1tIRFJfSU5EWF9UWVBFX0xFTl0gPSBIRFJfU0VUX1RZUEVfTEVOICgwLCAwLCBtaXBzX3JlY2VpdmVfc2VxKTsKKyAgYWNrW0hEUl9JTkRYX0xFTjFdID0gSERSX1NFVF9MRU4xICgwLCAwLCBtaXBzX3JlY2VpdmVfc2VxKTsKKyAgYWNrW0hEUl9JTkRYX1NFUV0gPSBIRFJfU0VUX1NFUSAoMCwgMCwgbWlwc19yZWNlaXZlX3NlcSk7CisKKyAgY2tzdW0gPSBtaXBzX2Nrc3VtIChhY2ssICh1bnNpZ25lZCBjaGFyICopIE5VTEwsIDApOworCisgIGFja1tIRFJfTEVOR1RIICsgVFJMUl9JTkRYX0NTVU0xXSA9IFRSTFJfU0VUX0NTVU0xIChja3N1bSk7CisgIGFja1tIRFJfTEVOR1RIICsgVFJMUl9JTkRYX0NTVU0yXSA9IFRSTFJfU0VUX0NTVU0yIChja3N1bSk7CisgIGFja1tIRFJfTEVOR1RIICsgVFJMUl9JTkRYX0NTVU0zXSA9IFRSTFJfU0VUX0NTVU0zIChja3N1bSk7CisKKyAgaWYgKHJlbW90ZV9kZWJ1ZyA+IDApCisgICAgeworICAgICAgYWNrW0hEUl9MRU5HVEggKyBUUkxSX0xFTkdUSF0gPSAnXDAnOworICAgICAgLyogRG9uJ3QgdXNlIF9maWx0ZXJlZDsgd2UgY2FuJ3QgZGVhbCB3aXRoIGEgUVVJVCBvdXQgb2YKKwkgdGFyZ2V0X3dhaXQsIGFuZCBJIHRoaW5rIHRoaXMgbWlnaHQgYmUgY2FsbGVkIGZyb20gdGhlcmUuICAqLworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJXcml0aW5nIGFjayAlZCBcIiVzXCJcbiIsIG1pcHNfcmVjZWl2ZV9zZXEsCisJCSAgICAgICBhY2sgKyAxKTsKKyAgICB9CisKKyAgaWYgKFNFUklBTF9XUklURSAobWlwc19kZXNjLCBhY2ssIEhEUl9MRU5HVEggKyBUUkxSX0xFTkdUSCkgIT0gMCkKKyAgICB7CisgICAgICBpZiAodGhyb3dfZXJyb3IpCisJbWlwc19lcnJvciAoIndyaXRlIHRvIHRhcmdldCBmYWlsZWQ6ICVzIiwgc2FmZV9zdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiBsZW47Cit9CisMCisvKiBPcHRpb25hbGx5IHNlbmQgYSByZXF1ZXN0IHRvIHRoZSByZW1vdGUgc3lzdGVtIGFuZCBvcHRpb25hbGx5IHdhaXQKKyAgIGZvciB0aGUgcmVwbHkuICBUaGlzIGltcGxlbWVudHMgdGhlIHJlbW90ZSBkZWJ1Z2dpbmcgcHJvdG9jb2wsCisgICB3aGljaCBpcyBidWlsdCBvbiB0b3Agb2YgdGhlIHBhY2tldCBwcm90b2NvbCBkZWZpbmVkIGFib3ZlLiAgRWFjaAorICAgcmVxdWVzdCBoYXMgYW4gQUREUiBhcmd1bWVudCBhbmQgYSBEQVRBIGFyZ3VtZW50LiAgVGhlIGZvbGxvd2luZworICAgcmVxdWVzdHMgYXJlIGRlZmluZWQ6CisKKyAgIFwwCWRvbid0IHNlbmQgYSByZXF1ZXN0OyBqdXN0IHdhaXQgZm9yIGEgcmVwbHkKKyAgIGkJcmVhZCB3b3JkIGZyb20gaW5zdHJ1Y3Rpb24gc3BhY2UgYXQgQUREUgorICAgZAlyZWFkIHdvcmQgZnJvbSBkYXRhIHNwYWNlIGF0IEFERFIKKyAgIEkJd3JpdGUgREFUQSB0byBpbnN0cnVjdGlvbiBzcGFjZSBhdCBBRERSCisgICBECXdyaXRlIERBVEEgdG8gZGF0YSBzcGFjZSBhdCBBRERSCisgICByCXJlYWQgcmVnaXN0ZXIgbnVtYmVyIEFERFIKKyAgIFIJc2V0IHJlZ2lzdGVyIG51bWJlciBBRERSIHRvIHZhbHVlIERBVEEKKyAgIGMJY29udGludWUgZXhlY3V0aW9uIChpZiBBRERSICE9IDEsIHNldCBwYyB0byBBRERSKQorICAgcwlzaW5nbGUgc3RlcCAoaWYgQUREUiAhPSAxLCBzZXQgcGMgdG8gQUREUikKKworICAgVGhlIHJlYWQgcmVxdWVzdHMgcmV0dXJuIHRoZSB2YWx1ZSByZXF1ZXN0ZWQuICBUaGUgd3JpdGUgcmVxdWVzdHMKKyAgIHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUgaW4gdGhlIGNoYW5nZWQgbG9jYXRpb24uICBUaGUgZXhlY3V0aW9uCisgICByZXF1ZXN0cyByZXR1cm4gYSBVTklYIHdhaXQgdmFsdWUgKHRoZSBhcHByb3hpbWF0ZSBzaWduYWwgd2hpY2gKKyAgIGNhdXNlZCBleGVjdXRpb24gdG8gc3RvcCBpcyBpbiB0aGUgdXBwZXIgZWlnaHQgYml0cykuCisKKyAgIElmIFBFUlIgaXMgbm90IE5VTEwsIHRoaXMgZnVuY3Rpb24gd2FpdHMgZm9yIGEgcmVwbHkuICBJZiBhbiBlcnJvcgorICAgb2NjdXJzLCBpdCBzZXRzICpQRVJSIHRvIDEgYW5kIHNldHMgZXJybm8gYWNjb3JkaW5nIHRvIHdoYXQgdGhlCisgICB0YXJnZXQgYm9hcmQgcmVwb3J0cy4gICovCisKK3N0YXRpYyBDT1JFX0FERFIgCittaXBzX3JlcXVlc3QgKGNtZCwgYWRkciwgZGF0YSwgcGVyciwgdGltZW91dCwgYnVmZikKKyAgICAgaW50IGNtZDsKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIENPUkVfQUREUiBkYXRhOworICAgICBpbnQgKnBlcnI7CisgICAgIGludCB0aW1lb3V0OworICAgICBjaGFyICpidWZmOworeworICBjaGFyIG15QnVmZltEQVRBX01BWExFTiArIDFdOworICBpbnQgbGVuOworICBpbnQgcnBpZDsKKyAgY2hhciByY21kOworICBpbnQgcmVycmZsZzsKKyAgdW5zaWduZWQgbG9uZyBycmVzcG9uc2U7CisKKyAgaWYgKGJ1ZmYgPT0gKGNoYXIgKikgTlVMTCkKKyAgICBidWZmID0gbXlCdWZmOworCisgIGlmIChjbWQgIT0gJ1wwJykKKyAgICB7CisgICAgICBpZiAobWlwc19uZWVkX3JlcGx5KQorCWZhdGFsICgibWlwc19yZXF1ZXN0OiBUcnlpbmcgdG8gc2VuZCBjb21tYW5kIGJlZm9yZSByZXBseSIpOworICAgICAgc3ByaW50ZiAoYnVmZiwgIjB4MCAlYyAweCVzIDB4JXMiLCBjbWQsIHBhZGRyX256IChhZGRyKSwgcGFkZHJfbnogKGRhdGEpKTsKKyAgICAgIG1pcHNfc2VuZF9wYWNrZXQgKGJ1ZmYsIDEpOworICAgICAgbWlwc19uZWVkX3JlcGx5ID0gMTsKKyAgICB9CisKKyAgaWYgKHBlcnIgPT0gKGludCAqKSBOVUxMKQorICAgIHJldHVybiAwOworCisgIGlmICghIG1pcHNfbmVlZF9yZXBseSkKKyAgICBmYXRhbCAoIm1pcHNfcmVxdWVzdDogVHJ5aW5nIHRvIGdldCByZXBseSBiZWZvcmUgY29tbWFuZCIpOworCisgIG1pcHNfbmVlZF9yZXBseSA9IDA7CisKKyAgbGVuID0gbWlwc19yZWNlaXZlX3BhY2tldCAoYnVmZiwgMSwgdGltZW91dCk7CisgIGJ1ZmZbbGVuXSA9ICdcMCc7CisKKyAgaWYgKHNzY2FuZiAoYnVmZiwgIjB4JXggJWMgMHgleCAweCVseCIsCisJICAgICAgJnJwaWQsICZyY21kLCAmcmVycmZsZywgJnJyZXNwb25zZSkgIT0gNAorICAgICAgfHwgKGNtZCAhPSAnXDAnICYmIHJjbWQgIT0gY21kKSkKKyAgICBtaXBzX2Vycm9yICgiQmFkIHJlc3BvbnNlIGZyb20gcmVtb3RlIGJvYXJkIik7CisKKyAgaWYgKHJlcnJmbGcgIT0gMCkKKyAgICB7CisgICAgICAqcGVyciA9IDE7CisKKyAgICAgIC8qIEZJWE1FOiBUaGlzIHdpbGwgcmV0dXJucyBNSVBTIGVycm5vIG51bWJlcnMsIHdoaWNoIG1heSBvciBtYXkKKwkgbm90IGJlIHRoZSBzYW1lIGFzIGVycm5vIHZhbHVlcyB1c2VkIG9uIG90aGVyIHN5c3RlbXMuICBJZgorCSB0aGV5IHN0aWNrIHRvIGNvbW1vbiBlcnJubyB2YWx1ZXMsIHRoZXkgd2lsbCBiZSB0aGUgc2FtZSwgYnV0CisJIGlmIHRoZXkgZG9uJ3QsIHRoZXkgbXVzdCBiZSB0cmFuc2xhdGVkLiAgKi8KKyAgICAgIGVycm5vID0gcnJlc3BvbnNlOworCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgKnBlcnIgPSAwOworICByZXR1cm4gcnJlc3BvbnNlOworfQorCitzdGF0aWMgdm9pZAorbWlwc19pbml0aWFsaXplX2NsZWFudXBzIChhcmcpCisgICAgIFBUUiBhcmc7Cit7CisgIG1pcHNfaW5pdGlhbGl6aW5nID0gMDsKK30KKworc3RhdGljIHZvaWQKK21pcHNfZXhpdF9jbGVhbnVwcyAoYXJnKQorICAgICBQVFIgYXJnOworeworICBtaXBzX2V4aXRpbmcgPSAwOworfQorCitzdGF0aWMgdm9pZAorbWlwc19zZW5kX2NvbW1hbmQgKGNtZCwgcHJvbXB0KQorICAgICBjb25zdCBjaGFyICpjbWQ7CisgICAgIGludCBwcm9tcHQ7Cit7CisgIFNFUklBTF9XUklURSAobWlwc19kZXNjLCBjbWQsIHN0cmxlbihjbWQpKTsKKyAgbWlwc19leHBlY3QgKGNtZCk7CisgIG1pcHNfZXhwZWN0ICgiXG4iKTsKKyAgaWYgKHByb21wdCkKKyAgICBtaXBzX2V4cGVjdCAobWlwc19tb25pdG9yX3Byb21wdCk7Cit9CisKKy8qIEVudGVyIHJlbW90ZSAoZGJ4KSBkZWJ1ZyBtb2RlOiAqLworc3RhdGljIHZvaWQKK21pcHNfZW50ZXJfZGVidWcgKCkKK3sKKyAgLyogUmVzZXQgdGhlIHNlcXVlbmNlIG51bWJlcnMsIHJlYWR5IGZvciB0aGUgbmV3IGRlYnVnIHNlcXVlbmNlOiAqLworICBtaXBzX3NlbmRfc2VxID0gMDsKKyAgbWlwc19yZWNlaXZlX3NlcSA9IDA7CisKKyAgaWYgKG1pcHNfbW9uaXRvciAhPSBNT05fSURUKQorICAgIG1pcHNfc2VuZF9jb21tYW5kICgiZGVidWdcciIsIDApOworICBlbHNlIC8qIGFzc3VtZSBJRFQgbW9uaXRvciBieSBkZWZhdWx0ICovCisgICAgbWlwc19zZW5kX2NvbW1hbmQgKCJkYiB0dHkwXHIiLCAwKTsKKworICBzbGVlcCgxKTsKKyAgU0VSSUFMX1dSSVRFIChtaXBzX2Rlc2MsICJcciIsIHNpemVvZiAiXHIiIC0gMSk7CisKKyAgLyogV2UgZG9uJ3QgbmVlZCB0byBhYnNvcmIgYW55IHNwdXJpb3VzIGNoYXJhY3RlcnMgaGVyZSwgc2luY2UgdGhlCisgICAgIG1pcHNfcmVjZWl2ZV9oZWFkZXIgd2lsbCBlYXQgdXAgYSByZWFzb25hYmxlIG51bWJlciBvZiBjaGFyYWN0ZXJzCisgICAgIHdoaWxzdCBsb29raW5nIGZvciB0aGUgU1lOLCBob3dldmVyIHRoaXMgYXZvaWRzIHRoZSAiZ2FyYmFnZSIKKyAgICAgYmVpbmcgZGlzcGxheWVkIHRvIHRoZSB1c2VyLiAqLworICBpZiAobWlwc19tb25pdG9yICE9IE1PTl9JRFQpCisgICAgbWlwc19leHBlY3QgKCJcciIpOworICAKKyAgeworICAgIGNoYXIgYnVmZltEQVRBX01BWExFTiArIDFdOworICAgIGlmIChtaXBzX3JlY2VpdmVfcGFja2V0IChidWZmLCAxLCAzKSA8IDApCisgICAgICBtaXBzX2Vycm9yICgiRmFpbGVkIHRvIGluaXRpYWxpemUgKGRpZG4ndCByZWNlaXZlIHBhY2tldCkuIik7CisgIH0KK30KKworLyogRXhpdCByZW1vdGUgKGRieCkgZGVidWcgbW9kZSwgcmV0dXJuaW5nIHRvIHRoZSBtb25pdG9yIHByb21wdDogKi8KK3N0YXRpYyBpbnQKK21pcHNfZXhpdF9kZWJ1ZyAoKQoreworICBpbnQgZXJyOworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NsZWFudXBzID0gbWFrZV9jbGVhbnVwIChtaXBzX2V4aXRfY2xlYW51cHMsIE5VTEwpOworCisgIG1pcHNfZXhpdGluZyA9IDE7CisKKyAgaWYgKG1pcHNfbW9uaXRvciAhPSBNT05fSURUKQorICAgIHsKKyAgICAgIC8qIFRoZSBEREIgKE5FQykgYW5kIE1pbmlSSVNDIChMU0kpIHZlcnNpb25zIG9mIFBNT04gZXhpdCBpbW1lZGlhdGVseSwKKyAgICAgICAgIHNvIHdlIGRvIG5vdCBnZXQgYSByZXBseSB0byB0aGlzIGNvbW1hbmQ6ICovCisgICAgICBtaXBzX3JlcXVlc3QgKCd4JywgKHVuc2lnbmVkIGludCkgMCwgKHVuc2lnbmVkIGludCkgMCwgTlVMTCwKKwkJbWlwc19yZWNlaXZlX3dhaXQsIE5VTEwpOworICAgICAgbWlwc19uZWVkX3JlcGx5ID0gMDsKKyAgICAgIGlmICghbWlwc19leHBlY3QgKCIgYnJlYWshIikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIGVsc2UKKyAgICBtaXBzX3JlcXVlc3QgKCd4JywgKHVuc2lnbmVkIGludCkgMCwgKHVuc2lnbmVkIGludCkgMCwgJmVyciwKKyAgICAgICAgICAgICAgICAgIG1pcHNfcmVjZWl2ZV93YWl0LCBOVUxMKTsKKworICBpZiAoIW1pcHNfZXhwZWN0IChtaXBzX21vbml0b3JfcHJvbXB0KSkKKyAgICByZXR1cm4gLTE7CisKKyAgZG9fY2xlYW51cHMgKG9sZF9jbGVhbnVwcyk7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEluaXRpYWxpemUgYSBuZXcgY29ubmVjdGlvbiB0byB0aGUgTUlQUyBib2FyZCwgYW5kIG1ha2Ugc3VyZSB3ZSBhcmUKKyAgIHJlYWxseSBjb25uZWN0ZWQuICAqLworCitzdGF0aWMgdm9pZAorbWlwc19pbml0aWFsaXplICgpCit7CisgIGludCBlcnI7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2xlYW51cHMgPSBtYWtlX2NsZWFudXAgKG1pcHNfaW5pdGlhbGl6ZV9jbGVhbnVwcywgTlVMTCk7CisgIGludCBqOworCisgIC8qIFdoYXQgaXMgdGhpcyBjb2RlIGRvaW5nIGhlcmU/ICBJIGRvbid0IHNlZSBhbnkgd2F5IGl0IGNhbiBoYXBwZW4sIGFuZAorICAgICBpdCBtaWdodCBtZWFuIG1pcHNfaW5pdGlhbGl6aW5nIGRpZG4ndCBnZXQgY2xlYXJlZCBwcm9wZXJseS4KKyAgICAgU28gSSdsbCBtYWtlIGl0IGEgd2FybmluZy4gICovCisKKyAgaWYgKG1pcHNfaW5pdGlhbGl6aW5nKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJpbnRlcm5hbCBlcnJvcjogbWlwc19pbml0aWFsaXplIGNhbGxlZCB0d2ljZSIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBtaXBzX3dhaXRfZmxhZyA9IDA7CisgIG1pcHNfaW5pdGlhbGl6aW5nID0gMTsKKworICAvKiBBdCB0aGlzIHBvaW50LCB0aGUgcGFja2l0IHByb3RvY29sIGlzbid0IHJlc3BvbmRpbmcuICBXZSdsbCB0cnkgZ2V0dGluZworICAgICBpbnRvIHRoZSBtb25pdG9yLCBhbmQgcmVzdGFydGluZyB0aGUgcHJvdG9jb2wuICAqLworCisgIC8qIEZvcmNlIHRoZSBzeXN0ZW0gaW50byB0aGUgbW9uaXRvci4gIEFmdGVyIHRoaXMgd2UgKnNob3VsZCogYmUgYXQKKyAgICAgdGhlIG1pcHNfbW9uaXRvcl9wcm9tcHQuICAqLworICBpZiAobWlwc19tb25pdG9yICE9IE1PTl9JRFQpCisgICAgaiA9IDA7IC8qIHN0YXJ0IGJ5IGNoZWNraW5nIGlmIHdlIGFyZSBhbHJlYWR5IGF0IHRoZSBwcm9tcHQgKi8KKyAgZWxzZQorICAgIGogPSAxOyAvKiBzdGFydCBieSBzZW5kaW5nIGEgYnJlYWsgKi8KKyAgZm9yICg7IGogPD0gNDsgaisrKQorICAgIHsKKyAgICAgIHN3aXRjaCAoaikKKwl7CisgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgIC8qIEZpcnN0LCB0cnkgc2VuZGluZyBhIENSICovCisgICAgICAgICAgU0VSSUFMX0ZMVVNIX0lOUFVUIChtaXBzX2Rlc2MpOworCSAgU0VSSUFMX1dSSVRFIChtaXBzX2Rlc2MsICJcciIsIDEpOworICAgICAgICAgIGJyZWFrOworCWNhc2UgMToJCQkvKiBGaXJzdCwgdHJ5IHNlbmRpbmcgYSBicmVhayAqLworCSAgU0VSSUFMX1NFTkRfQlJFQUsgKG1pcHNfZGVzYyk7CisJICBicmVhazsKKwljYXNlIDI6CQkJLyogVGhlbiwgdHJ5IGEgXkMgKi8KKwkgIFNFUklBTF9XUklURSAobWlwc19kZXNjLCAiXDAwMyIsIDEpOworCSAgYnJlYWs7CisJY2FzZSAzOgkJCS8qIFRoZW4sIHRyeSBlc2NhcGluZyBmcm9tIGRvd25sb2FkICovCisJICB7CisgICAgICAgICAgICBpZiAobWlwc19tb25pdG9yICE9IE1PTl9JRFQpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIHRidWZmWzddOworCisgICAgICAgICAgICAgICAgLyogV2Ugc2hvdWxkbid0IG5lZWQgdG8gc2VuZCBtdWx0aXBsZSB0ZXJtaW5hdGlvbgorICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlcywgc2luY2UgdGhlIHRhcmdldCBwZXJmb3JtcyBsaW5lIChvcgorICAgICAgICAgICAgICAgICAgIGJsb2NrKSByZWFkcywgYW5kIHRoZW4gcHJvY2Vzc2VzIHRob3NlCisgICAgICAgICAgICAgICAgICAgcGFja2V0cy4gSW4tY2FzZSB3ZSB3ZXJlIGRvd25sb2FkaW5nIGEgbGFyZ2UgcGFja2V0CisgICAgICAgICAgICAgICAgICAgd2UgZmx1c2ggdGhlIG91dHB1dCBidWZmZXIgYmVmb3JlIGluc2VydGluZyBhCisgICAgICAgICAgICAgICAgICAgdGVybWluYXRpb24gc2VxdWVuY2UuICovCisgICAgICAgICAgICAgICAgU0VSSUFMX0ZMVVNIX09VVFBVVCAobWlwc19kZXNjKTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmICh0YnVmZiwgIlxyL0UvRVxyIik7CisgICAgICAgICAgICAgICAgU0VSSUFMX1dSSVRFIChtaXBzX2Rlc2MsIHRidWZmLCA2KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciBzcmVjWzEwXTsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgIC8qIFdlIGFyZSBwb3NzaWJseSBpbiBiaW5hcnkgZG93bmxvYWQgbW9kZSwgaGF2aW5nCisgICAgICAgICAgICAgICAgICAgYWJvcnRlZCBpbiB0aGUgbWlkZGxlIG9mIGFuIFMtcmVjb3JkLiAgXkMgd29uJ3QKKyAgICAgICAgICAgICAgICAgICB3b3JrIGJlY2F1c2Ugb2YgYmluYXJ5IG1vZGUuICBUaGUgb25seSByZWxpYWJsZSB3YXkKKyAgICAgICAgICAgICAgICAgICBvdXQgaXMgdG8gc2VuZCBlbm91Z2ggdGVybWluYXRpb24gcGFja2V0cyAoOCBieXRlcykKKyAgICAgICAgICAgICAgICAgICB0byBmaWxsIHVwIGFuZCB0aGVuIG92ZXJmbG93IHRoZSBsYXJnZXN0IHNpemUKKyAgICAgICAgICAgICAgICAgICBTLXJlY29yZCAoMjU1IGJ5dGVzIGluIHRoaXMgY2FzZSkuICBUaGlzIGFtb3VudHMgdG8KKyAgICAgICAgICAgICAgICAgICAyNTYvOCArIDEgcGFja2V0cy4KKyAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgbWlwc19tYWtlX3NyZWMgKHNyZWMsICc3JywgMCwgTlVMTCwgMCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IDMzOyBpKyspCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNFUklBTF9XUklURSAobWlwc19kZXNjLCBzcmVjLCA4KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoU0VSSUFMX1JFQURDSEFSIChtaXBzX2Rlc2MsIDApID49IDApCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CS8qIEJyZWFrIGltbWVkaWF0bHkgaWYgd2UgZ2V0IHNvbWV0aGluZyBmcm9tCisJCQkJICAgdGhlIGJvYXJkLiAqLworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorCSAgYnJlYWs7CisJY2FzZSA0OgorCSAgbWlwc19lcnJvciAoIkZhaWxlZCB0byBpbml0aWFsaXplLiIpOworCX0KKworICAgICAgaWYgKG1pcHNfZXhwZWN0IChtaXBzX21vbml0b3JfcHJvbXB0KSkKKwlicmVhazsKKyAgICB9CisKKyAgaWYgKG1pcHNfbW9uaXRvciAhPSBNT05fSURUKQorICAgIHsKKyAgICAgIC8qIFNvbWV0aW1lcyBQTU9OIGlnbm9yZXMgdGhlIGZpcnN0IGZldyBjaGFyYWN0ZXJzIGluIHRoZSBmaXJzdAorICAgICAgICAgY29tbWFuZCBzZW50IGFmdGVyIGEgbG9hZC4gIFNlbmRpbmcgYSBibGFuayBjb21tYW5kIGdldHMKKwkgYXJvdW5kIHRoYXQuICAqLworICAgICAgbWlwc19zZW5kX2NvbW1hbmQgKCJcciIsIC0xKTsKKworICAgICAgLyogRW5zdXJlIHRoZSBjb3JyZWN0IHRhcmdldCBzdGF0ZTogKi8KKyAgICAgIGlmIChtaXBzX21vbml0b3IgIT0gTU9OX0xTSSkKKwltaXBzX3NlbmRfY29tbWFuZCAoInNldCByZWdzaXplIDY0XHIiLCAtMSk7CisgICAgICBtaXBzX3NlbmRfY29tbWFuZCAoInNldCBob3N0cG9ydCB0dHkwXHIiLCAtMSk7CisgICAgICBtaXBzX3NlbmRfY29tbWFuZCAoInNldCBicmtjbWQgXCJcIlxyIiwgLTEpOworICAgICAgLyogRGVsZXRlIGFsbCB0aGUgY3VycmVudCBicmVha3BvaW50czogKi8KKyAgICAgIG1pcHNfc2VuZF9jb21tYW5kICgiZGIgKlxyIiwgLTEpOworICAgICAgLyogTk9URTogUE1PTiBkb2VzIG5vdCBoYXZlIGJyZWFrcG9pbnQgc3VwcG9ydCB0aHJvdWdoIHRoZQorICAgICAgICAgImRlYnVnIiBtb2RlLCBvbmx5IGF0IHRoZSBtb25pdG9yIGNvbW1hbmQtbGluZS4gKi8KKyAgICB9CisKKyAgbWlwc19lbnRlcl9kZWJ1ZyAoKTsKKworICAvKiBDbGVhciBhbGwgYnJlYWtwb2ludHM6ICovCisgIGlmICgobWlwc19tb25pdG9yID09IE1PTl9JRFQKKyAgICAgICAmJiBjbGVhcl9icmVha3BvaW50ICgtMSwgMCwgQlJFQUtfVU5VU0VEKSA9PSAwKQorICAgICAgfHwgbWlwc19tb25pdG9yID09IE1PTl9MU0kpCisgICAgbW9uaXRvcl9zdXBwb3J0c19icmVha3BvaW50cyA9IDE7CisgIGVsc2UKKyAgICBtb25pdG9yX3N1cHBvcnRzX2JyZWFrcG9pbnRzID0gMDsKKworICBkb19jbGVhbnVwcyAob2xkX2NsZWFudXBzKTsKKworICAvKiBJZiB0aGlzIGRvZXNuJ3QgY2FsbCBlcnJvciwgd2UgaGF2ZSBjb25uZWN0ZWQ7IHdlIGRvbid0IGNhcmUgaWYKKyAgICAgdGhlIHJlcXVlc3QgaXRzZWxmIHN1Y2NlZWRzIG9yIGZhaWxzLiAgKi8KKworICBtaXBzX3JlcXVlc3QgKCdyJywgKHVuc2lnbmVkIGludCkgMCwgKHVuc2lnbmVkIGludCkgMCwgJmVyciwKKwkJbWlwc19yZWNlaXZlX3dhaXQsIE5VTEwpOworICBzZXRfY3VycmVudF9mcmFtZSAoY3JlYXRlX25ld19mcmFtZSAocmVhZF9mcCAoKSwgcmVhZF9wYyAoKSkpOworICBzZWxlY3RfZnJhbWUgKGdldF9jdXJyZW50X2ZyYW1lICgpLCAwKTsKK30KKworLyogT3BlbiBhIGNvbm5lY3Rpb24gdG8gdGhlIHJlbW90ZSBib2FyZC4gICovCitzdGF0aWMgdm9pZAorY29tbW9uX29wZW4gKG9wcywgbmFtZSwgZnJvbV90dHksIG5ld19tb25pdG9yLCBuZXdfbW9uaXRvcl9wcm9tcHQpCisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICpvcHM7CisgICAgIGNoYXIgKm5hbWU7CisgICAgIGludCBmcm9tX3R0eTsKKyAgICAgZW51bSBtaXBzX21vbml0b3JfdHlwZSBuZXdfbW9uaXRvcjsKKyAgICAgY2hhciAqbmV3X21vbml0b3JfcHJvbXB0OworeworICBjaGFyICpwdHlwZTsKKyAgY2hhciAqc2VyaWFsX3BvcnRfbmFtZTsKKyAgY2hhciAqcmVtb3RlX25hbWUgPSAwOworICBjaGFyICpsb2NhbF9uYW1lID0gMDsKKyAgY2hhciAqKmFyZ3Y7CisKKyAgaWYgKG5hbWUgPT0gMCkKKyAgICBlcnJvciAoCisiVG8gb3BlbiBhIE1JUFMgcmVtb3RlIGRlYnVnZ2luZyBjb25uZWN0aW9uLCB5b3UgbmVlZCB0byBzcGVjaWZ5IHdoYXQgc2VyaWFsXG5cCitkZXZpY2UgaXMgYXR0YWNoZWQgdG8gdGhlIHRhcmdldCBib2FyZCAoZS5nLiwgL2Rldi90dHlhKS5cbiIKKyJJZiB5b3Ugd2FudCB0byB1c2UgVEZUUCB0byBkb3dubG9hZCB0byB0aGUgYm9hcmQsIHNwZWNpZnkgdGhlIG5hbWUgb2YgYVxuIgorInRlbXBvcmFyeSBmaWxlIHRvIGJlIHVzZWQgYnkgR0RCIGZvciBkb3dubG9hZHMgYXMgdGhlIHNlY29uZCBhcmd1bWVudC5cbiIKKyJUaGlzIGZpbGVuYW1lIG11c3QgYmUgaW4gdGhlIGZvcm0gaG9zdDpmaWxlbmFtZSwgd2hlcmUgaG9zdCBpcyB0aGUgbmFtZVxuIgorIm9mIHRoZSBob3N0IHJ1bm5pbmcgdGhlIFRGVFAgc2VydmVyLCBhbmQgdGhlIGZpbGUgbXVzdCBiZSByZWFkYWJsZSBieSB0aGVcbiIKKyJ3b3JsZC4gIElmIHRoZSBsb2NhbCBuYW1lIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSBkaWZmZXJzIGZyb20gdGhlIG5hbWUgYXNcbiIKKyJzZWVuIGZyb20gdGhlIGJvYXJkIHZpYSBURlRQLCBzcGVjaWZ5IHRoYXQgbmFtZSBhcyB0aGUgdGhpcmQgcGFyYW1ldGVyLlxuIik7CisKKyAgLyogUGFyc2UgdGhlIHNlcmlhbCBwb3J0IG5hbWUsIHRoZSBvcHRpb25hbCBURlRQIG5hbWUsIGFuZCB0aGUKKyAgICAgb3B0aW9uYWwgbG9jYWwgVEZUUCBuYW1lLiAgKi8KKyAgaWYgKChhcmd2ID0gYnVpbGRhcmd2IChuYW1lKSkgPT0gTlVMTCkKKyAgICBub21lbSgwKTsKKyAgbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVhcmd2LCBhcmd2KTsKKworICBzZXJpYWxfcG9ydF9uYW1lID0gc3Ryc2F2ZSAoYXJndlswXSk7CisgIGlmIChhcmd2WzFdKQkJCQkvKiByZW1vdGUgVEZUUCBuYW1lIHNwZWNpZmllZD8gKi8KKyAgICB7CisgICAgICByZW1vdGVfbmFtZSA9IGFyZ3ZbMV07CisgICAgICBpZiAoYXJndlsyXSkJCQkvKiBsb2NhbCBURlRQIGZpbGVuYW1lIHNwZWNpZmllZD8gKi8KKwlsb2NhbF9uYW1lID0gYXJndlsyXTsKKyAgICB9CisKKyAgdGFyZ2V0X3ByZW9wZW4gKGZyb21fdHR5KTsKKworICBpZiAobWlwc19pc19vcGVuKQorICAgIHVucHVzaF90YXJnZXQgKGN1cnJlbnRfb3BzKTsKKworICAvKiBPcGVuIGFuZCBpbml0aWFsaXplIHRoZSBzZXJpYWwgcG9ydC4gICovCisgIG1pcHNfZGVzYyA9IFNFUklBTF9PUEVOIChzZXJpYWxfcG9ydF9uYW1lKTsKKyAgaWYgKG1pcHNfZGVzYyA9PSAoc2VyaWFsX3QpIE5VTEwpCisgICAgcGVycm9yX3dpdGhfbmFtZSAoc2VyaWFsX3BvcnRfbmFtZSk7CisKKyAgaWYgKGJhdWRfcmF0ZSAhPSAtMSkKKyAgICB7CisgICAgICBpZiAoU0VSSUFMX1NFVEJBVURSQVRFIChtaXBzX2Rlc2MsIGJhdWRfcmF0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICBTRVJJQUxfQ0xPU0UgKG1pcHNfZGVzYyk7CisgICAgICAgICAgcGVycm9yX3dpdGhfbmFtZSAoc2VyaWFsX3BvcnRfbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgU0VSSUFMX1JBVyAobWlwc19kZXNjKTsKKworICAvKiBPcGVuIGFuZCBpbml0aWFsaXplIHRoZSBvcHRpb25hbCBkb3dubG9hZCBwb3J0LiAgSWYgaXQgaXMgaW4gdGhlIGZvcm0KKyAgICAgaG9zdG5hbWUjcG9ydG51bWJlciwgaXQncyBhIFVEUCBzb2NrZXQuICBJZiBpdCBpcyBpbiB0aGUgZm9ybQorICAgICBob3N0bmFtZTpmaWxlbmFtZSwgYXNzdW1lIGl0J3MgdGhlIFRGVFAgZmlsZW5hbWUgdGhhdCBtdXN0IGJlCisgICAgIHBhc3NlZCB0byB0aGUgRERCIGJvYXJkIHRvIHRlbGwgaXQgd2hlcmUgdG8gZ2V0IHRoZSBsb2FkIGZpbGUuICAqLworICBpZiAocmVtb3RlX25hbWUpCisgICAgeworICAgICAgaWYgKHN0cmNociAocmVtb3RlX25hbWUsICcjJykpCisJeworCSAgdWRwX2Rlc2MgPSBTRVJJQUxfT1BFTiAocmVtb3RlX25hbWUpOworCSAgaWYgKCF1ZHBfZGVzYykKKwkgICAgcGVycm9yX3dpdGhfbmFtZSAoIlVuYWJsZSB0byBvcGVuIFVEUCBwb3J0Iik7CisJICB1ZHBfaW5fdXNlID0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogU2F2ZSB0aGUgcmVtb3RlIGFuZCBsb2NhbCBuYW1lcyBvZiB0aGUgVEZUUCB0ZW1wIGZpbGUuICBJZgorCSAgICAgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYSBsb2NhbCBuYW1lLCBhc3N1bWUgaXQncyB0aGUgc2FtZQorCSAgICAgYXMgdGhlIHBhcnQgb2YgdGhlIHJlbW90ZSBuYW1lIGFmdGVyIHRoZSAiaG9zdDoiLiAgKi8KKwkgIGlmICh0ZnRwX25hbWUpCisJICAgIGZyZWUgKHRmdHBfbmFtZSk7CisJICBpZiAodGZ0cF9sb2NhbG5hbWUpCisJICAgIGZyZWUgKHRmdHBfbG9jYWxuYW1lKTsKKwkgIGlmIChsb2NhbF9uYW1lID09IE5VTEwpCisJICAgICAgaWYgKChsb2NhbF9uYW1lID0gc3RyY2hyIChyZW1vdGVfbmFtZSwgJzonKSkgIT0gTlVMTCkKKwkJbG9jYWxfbmFtZSsrOwkJLyogc2tpcCBvdmVyIHRoZSBjb2xvbiAqLworCSAgaWYgKGxvY2FsX25hbWUgPT0gTlVMTCkKKwkgICAgbG9jYWxfbmFtZSA9IHJlbW90ZV9uYW1lOwkvKiBsb2NhbCBuYW1lIHNhbWUgYXMgcmVtb3RlIG5hbWUgKi8KKwkgIHRmdHBfbmFtZSA9IHN0cnNhdmUgKHJlbW90ZV9uYW1lKTsKKwkgIHRmdHBfbG9jYWxuYW1lID0gc3Ryc2F2ZSAobG9jYWxfbmFtZSk7CisJICB0ZnRwX2luX3VzZSA9IDE7CisJfQorICAgIH0KKworICBjdXJyZW50X29wcyA9IG9wczsKKyAgbWlwc19pc19vcGVuID0gMTsKKworICAvKiBSZXNldCB0aGUgZXhwZWN0ZWQgbW9uaXRvciBwcm9tcHQgaWYgaXQncyBuZXZlciBiZWVuIHNldCBiZWZvcmUuICAqLworICBpZiAobWlwc19tb25pdG9yX3Byb21wdCA9PSBOVUxMKQorICAgIG1pcHNfbW9uaXRvcl9wcm9tcHQgPSBzdHJzYXZlIChuZXdfbW9uaXRvcl9wcm9tcHQpOworICBtaXBzX21vbml0b3IgPSBuZXdfbW9uaXRvcjsKKworICBtaXBzX2luaXRpYWxpemUgKCk7CisKKyAgaWYgKGZyb21fdHR5KQorICAgIHByaW50Zl91bmZpbHRlcmVkICgiUmVtb3RlIE1JUFMgZGVidWdnaW5nIHVzaW5nICVzXG4iLCBzZXJpYWxfcG9ydF9uYW1lKTsKKworICAvKiBTd2l0Y2ggdG8gdXNpbmcgcmVtb3RlIHRhcmdldCBub3cuICAqLworICBwdXNoX3RhcmdldCAob3BzKTsKKworICAvKiBGSVhNRTogU2hvdWxkIHdlIGNhbGwgc3RhcnRfcmVtb3RlIGhlcmU/ICAqLworCisgIC8qIFRyeSB0byBmaWd1cmUgb3V0IHRoZSBwcm9jZXNzb3IgbW9kZWwgaWYgcG9zc2libGUuICAqLworICBwdHlwZSA9IG1pcHNfcmVhZF9wcm9jZXNzb3JfdHlwZSAoKTsKKyAgaWYgKHB0eXBlKQorICAgIG1pcHNfc2V0X3Byb2Nlc3Nvcl90eXBlX2NvbW1hbmQgKHN0cnNhdmUgKHB0eXBlKSwgMCk7CisKKy8qIFRoaXMgaXMgcmVhbGx5IHRoZSBqb2Igb2Ygc3RhcnRfcmVtb3RlIGhvd2V2ZXIsIHRoYXQgbWFrZXMgYW4gYXNzdW1wdGlvbgorICAgdGhhdCB0aGUgdGFyZ2V0IGlzIGFib3V0IHRvIHByaW50IG91dCBhIHN0YXR1cyBtZXNzYWdlIG9mIHNvbWUgc29ydC4gIFRoYXQKKyAgIGRvZXNuJ3QgaGFwcGVuIGhlcmUgKGluIGZhY3QsIGl0IG1heSBub3QgYmUgcG9zc2libGUgdG8gZ2V0IHRoZSBtb25pdG9yIHRvCisgICBzZW5kIHRoZSBhcHByb3ByaWF0ZSBwYWNrZXQpLiAgKi8KKworICBmbHVzaF9jYWNoZWRfZnJhbWVzICgpOworICByZWdpc3RlcnNfY2hhbmdlZCAoKTsKKyAgc3RvcF9wYyA9IHJlYWRfcGMgKCk7CisgIHNldF9jdXJyZW50X2ZyYW1lIChjcmVhdGVfbmV3X2ZyYW1lIChyZWFkX2ZwICgpLCBzdG9wX3BjKSk7CisgIHNlbGVjdF9mcmFtZSAoZ2V0X2N1cnJlbnRfZnJhbWUgKCksIDApOworICBwcmludF9zdGFja19mcmFtZSAoc2VsZWN0ZWRfZnJhbWUsIC0xLCAxKTsKKyAgZnJlZSAoc2VyaWFsX3BvcnRfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkCittaXBzX29wZW4gKG5hbWUsIGZyb21fdHR5KQorICAgICBjaGFyICpuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNvbW1vbl9vcGVuICgmbWlwc19vcHMsIG5hbWUsIGZyb21fdHR5LCBNT05fSURULCBUQVJHRVRfTU9OSVRPUl9QUk9NUFQpOworfQorCitzdGF0aWMgdm9pZAorcG1vbl9vcGVuIChuYW1lLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjb21tb25fb3BlbiAoJnBtb25fb3BzLCBuYW1lLCBmcm9tX3R0eSwgTU9OX1BNT04sICJQTU9OPiAiKTsKK30KKworc3RhdGljIHZvaWQKK2RkYl9vcGVuIChuYW1lLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjb21tb25fb3BlbiAoJmRkYl9vcHMsIG5hbWUsIGZyb21fdHR5LCBNT05fRERCLCAiTkVDMDEwPiIpOworfQorCitzdGF0aWMgdm9pZAorbHNpX29wZW4gKG5hbWUsIGZyb21fdHR5KQorICAgICBjaGFyICpuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGludCBpOworCisgIC8qIENsZWFyIHRoZSBMU0kgYnJlYWtwb2ludCB0YWJsZS4gICovCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfTFNJX0JSRUFLUE9JTlRTOyBpKyspCisgICAgbHNpX2JyZWFrcG9pbnRzW2ldLnR5cGUgPSBCUkVBS19VTlVTRUQ7CisgIAorICBjb21tb25fb3BlbiAoJmxzaV9vcHMsIG5hbWUsIGZyb21fdHR5LCBNT05fTFNJLCAiUE1PTj4gIik7Cit9CisKKy8qIENsb3NlIGEgY29ubmVjdGlvbiB0byB0aGUgcmVtb3RlIGJvYXJkLiAgKi8KKworc3RhdGljIHZvaWQKK21pcHNfY2xvc2UgKHF1aXR0aW5nKQorICAgICBpbnQgcXVpdHRpbmc7Cit7CisgIGlmIChtaXBzX2lzX29wZW4pCisgICAgeworICAgICAgLyogR2V0IHRoZSBib2FyZCBvdXQgb2YgcmVtb3RlIGRlYnVnZ2luZyBtb2RlLiAgKi8KKyAgICAgICh2b2lkKSBtaXBzX2V4aXRfZGVidWcgKCk7CisKKyAgICAgIGNsb3NlX3BvcnRzICgpOworICAgIH0KK30KKworLyogRGV0YWNoIGZyb20gdGhlIHJlbW90ZSBib2FyZC4gICovCisKK3N0YXRpYyB2b2lkCittaXBzX2RldGFjaCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaWYgKGFyZ3MpCisgICAgZXJyb3IgKCJBcmd1bWVudCBnaXZlbiB0byBcImRldGFjaFwiIHdoZW4gcmVtb3RlbHkgZGVidWdnaW5nLiIpOworCisgIHBvcF90YXJnZXQgKCk7CisKKyAgbWlwc19jbG9zZSAoMSk7CisKKyAgaWYgKGZyb21fdHR5KQorICAgIHByaW50Zl91bmZpbHRlcmVkICgiRW5kaW5nIHJlbW90ZSBNSVBTIGRlYnVnZ2luZy5cbiIpOworfQorCisvKiBUZWxsIHRoZSB0YXJnZXQgYm9hcmQgdG8gcmVzdW1lLiAgVGhpcyBkb2VzIG5vdCB3YWl0IGZvciBhIHJlcGx5CisgICBmcm9tIHRoZSBib2FyZCwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIHNpbmdsZS1zdGVwcGluZyBvbiBMU0kgYm9hcmRzLAorICAgd2hlcmUgUE1PTiBkb2VzIHJldHVybiBhIHJlcGx5LiAgKi8KKworc3RhdGljIHZvaWQKK21pcHNfcmVzdW1lIChwaWQsIHN0ZXAsIHNpZ2duYWwpCisgICAgIGludCBwaWQsIHN0ZXA7CisgICAgIGVudW0gdGFyZ2V0X3NpZ25hbCBzaWdnbmFsOworeworICBpbnQgZXJyOworCisgIC8qIExTSSBQTU9OIHJlcXVpcmVzIHJldHVybnMgYSByZXBseSBwYWNrZXQgIjB4MSBzIDB4MCAweDU3ZiIgYWZ0ZXIKKyAgICAgYSBzaW5nbGUgc3RlcCwgc28gd2Ugd2FpdCBmb3IgdGhhdC4gICovCisgIG1pcHNfcmVxdWVzdCAoc3RlcCA/ICdzJyA6ICdjJywKKwkJKHVuc2lnbmVkIGludCkgMSwKKwkJKHVuc2lnbmVkIGludCkgc2lnZ25hbCwKKwkJbWlwc19tb25pdG9yID09IE1PTl9MU0kgJiYgc3RlcCA/ICZlcnIgOiAoaW50ICopIE5VTEwsCisJCW1pcHNfcmVjZWl2ZV93YWl0LCBOVUxMKTsKK30KKworLyogUmV0dXJuIHRoZSBzaWduYWwgY29ycmVzcG9uZGluZyB0byBTSUcsIHdoZXJlIFNJRyBpcyB0aGUgbnVtYmVyIHdoaWNoCisgICB0aGUgTUlQUyBwcm90b2NvbCB1c2VzIGZvciB0aGUgc2lnbmFsLiAgKi8KK2VudW0gdGFyZ2V0X3NpZ25hbAorbWlwc19zaWduYWxfZnJvbV9wcm90b2NvbCAoc2lnKQorICAgICBpbnQgc2lnOworeworICAvKiBXZSBhbGxvdyBhIGZldyBtb3JlIHNpZ25hbHMgdGhhbiB0aGUgSURUIGJvYXJkIGFjdHVhbGx5IHJldHVybnMsIG9uCisgICAgIHRoZSB0aGVvcnkgdGhhdCB0aGVyZSBpcyBhdCBsZWFzdCAqc29tZSogaG9wZSB0aGF0IHBlcmhhcHMgdGhlIG51bWJlcmluZworICAgICBmb3IgdGhlc2Ugc2lnbmFscyBpcyB3aWRlbHkgYWdyZWVkIHVwb24uICAqLworICBpZiAoc2lnIDw9IDAKKyAgICAgIHx8IHNpZyA+IDMxKQorICAgIHJldHVybiBUQVJHRVRfU0lHTkFMX1VOS05PV047CisKKyAgLyogRG9uJ3Qgd2FudCB0byB1c2UgdGFyZ2V0X3NpZ25hbF9mcm9tX2hvc3QgYmVjYXVzZSB3ZSBhcmUgY29udmVydGluZworICAgICBmcm9tIE1JUFMgc2lnbmFsIG51bWJlcnMsIG5vdCBob3N0IG9uZXMuICBPdXIgaW50ZXJuYWwgbnVtYmVycworICAgICBtYXRjaCB0aGUgTUlQUyBudW1iZXJzIGZvciB0aGUgc2lnbmFscyB0aGUgYm9hcmQgY2FuIHJldHVybiwgd2hpY2gKKyAgICAgYXJlOiBTSUdJTlQsIFNJR1NFR1YsIFNJR0JVUywgU0lHSUxMLCBTSUdGUEUsIFNJR1RSQVAuICAqLworICByZXR1cm4gKGVudW0gdGFyZ2V0X3NpZ25hbCkgc2lnOworfQorCisvKiBXYWl0IHVudGlsIHRoZSByZW1vdGUgc3RvcHMsIGFuZCByZXR1cm4gYSB3YWl0IHN0YXR1cy4gICovCisKK3N0YXRpYyBpbnQKK21pcHNfd2FpdCAocGlkLCBzdGF0dXMpCisgICAgIGludCBwaWQ7CisgICAgIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqc3RhdHVzOworeworICBpbnQgcnN0YXR1czsKKyAgaW50IGVycjsKKyAgY2hhciBidWZmW0RBVEFfTUFYTEVOXTsKKyAgaW50IHJwYywgcmZwLCByc3A7CisgIGNoYXIgZmxhZ3NbMjBdOworICBpbnQgbmZpZWxkczsKKyAgaW50IGk7CisKKyAgaW50ZXJydXB0X2NvdW50ID0gMDsKKyAgaGl0X3dhdGNocG9pbnQgPSAwOworCisgIC8qIElmIHdlIGhhdmUgbm90IHNlbnQgYSBzaW5nbGUgc3RlcCBvciBjb250aW51ZSBjb21tYW5kLCB0aGVuIHRoZQorICAgICBib2FyZCBpcyB3YWl0aW5nIGZvciB1cyB0byBkbyBzb21ldGhpbmcuICBSZXR1cm4gYSBzdGF0dXMKKyAgICAgaW5kaWNhdGluZyB0aGF0IGl0IGlzIHN0b3BwZWQuICAqLworICBpZiAoISBtaXBzX25lZWRfcmVwbHkpCisgICAgeworICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVFJBUDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBObyB0aW1lb3V0OyB3ZSBzaXQgaGVyZSBhcyBsb25nIGFzIHRoZSBwcm9ncmFtIGNvbnRpbnVlcyB0byBleGVjdXRlLiAgKi8KKyAgbWlwc193YWl0X2ZsYWcgPSAxOworICByc3RhdHVzID0gbWlwc19yZXF1ZXN0ICgnXDAwMCcsICh1bnNpZ25lZCBpbnQpIDAsICh1bnNpZ25lZCBpbnQpIDAsICZlcnIsIC0xLAorCQkJICBidWZmKTsKKyAgbWlwc193YWl0X2ZsYWcgPSAwOworICBpZiAoZXJyKQorICAgIG1pcHNfZXJyb3IgKCJSZW1vdGUgZmFpbHVyZTogJXMiLCBzYWZlX3N0cmVycm9yIChlcnJubykpOworCisgIC8qIE9uIHJldHVybmluZyBmcm9tIGEgY29udGludWUsIHRoZSBQTU9OIG1vbml0b3Igc2VlbXMgdG8gc3RhcnQKKyAgICAgZWNob2luZyBiYWNrIHRoZSBtZXNzYWdlcyB3ZSBzZW5kIHByaW9yIHRvIHNlbmRpbmcgYmFjayB0aGUKKyAgICAgQUNLLiBUaGUgY29kZSBjYW4gY29wZSB3aXRoIHRoaXMsIGJ1dCB0byB0cnkgYW5kIGF2b2lkIHRoZQorICAgICB1bm5lY2Vzc2FyeSBzZXJpYWwgdHJhZmZpYywgYW5kICJzcHVyaW91cyIgY2hhcmFjdGVycyBkaXNwbGF5ZWQKKyAgICAgdG8gdGhlIHVzZXIsIHdlIGNoZWF0IGFuZCByZXNldCB0aGUgZGVidWcgcHJvdG9jb2wuIFRoZSBwcm9ibGVtcworICAgICBzZWVtcyB0byBiZSBjYXVzZWQgYnkgYSBjaGVjayBvbiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cywgYW5kIHRoZQorICAgICBjb21tYW5kIGxlbmd0aCwgd2l0aGluIHRoZSBtb25pdG9yIGNhdXNpbmcgaXQgdG8gZWNobyB0aGUgY29tbWFuZAorICAgICBhcyBhIGJhZCBwYWNrZXQuICovCisgIGlmIChtaXBzX21vbml0b3IgPT0gTU9OX1BNT04pCisgICAgeworICAgICAgbWlwc19leGl0X2RlYnVnICgpOworICAgICAgbWlwc19lbnRlcl9kZWJ1ZyAoKTsKKyAgICB9CisKKyAgLyogU2VlIGlmIHdlIGdvdCBiYWNrIGV4dGVuZGVkIHN0YXR1cy4gIElmIHNvLCBwaWNrIG91dCB0aGUgcGMsIGZwLCBzcCwgZXRjLi4uICovCisKKyAgbmZpZWxkcyA9IHNzY2FuZiAoYnVmZiwgIjB4JSp4ICUqYyAweCUqeCAweCUqeCAweCV4IDB4JXggMHgleCAweCUqeCAlcyIsCisJCSAgICAmcnBjLCAmcmZwLCAmcnNwLCBmbGFncyk7CisgIGlmIChuZmllbGRzID49IDMpCisgICAgeworICAgICAgY2hhciBidWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKworICAgICAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoYnVmLCBSRUdJU1RFUl9SQVdfU0laRSAoUENfUkVHTlVNKSwgcnBjKTsKKyAgICAgIHN1cHBseV9yZWdpc3RlciAoUENfUkVHTlVNLCBidWYpOworCisgICAgICBzdG9yZV91bnNpZ25lZF9pbnRlZ2VyIChidWYsIFJFR0lTVEVSX1JBV19TSVpFIChQQ19SRUdOVU0pLCByZnApOworICAgICAgc3VwcGx5X3JlZ2lzdGVyICgzMCwgYnVmKTsgLyogVGhpcyByZWdpc3RlciB0aGV5IGFyZSBhdm9pZGluZyBhbmQgc28gaXQgaXMgdW5uYW1lZCAqLworCisgICAgICBzdG9yZV91bnNpZ25lZF9pbnRlZ2VyIChidWYsIFJFR0lTVEVSX1JBV19TSVpFIChTUF9SRUdOVU0pLCByc3ApOworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChTUF9SRUdOVU0sIGJ1Zik7CisKKyAgICAgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgUkVHSVNURVJfUkFXX1NJWkUgKEZQX1JFR05VTSksIDApOworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChGUF9SRUdOVU0sIGJ1Zik7CisKKyAgICAgIGlmIChuZmllbGRzID09IDkpCisJeworCSAgaW50IGk7CisKKwkgIGZvciAoaSA9IDA7IGkgPD0gMjsgaSsrKQorCSAgICBpZiAoZmxhZ3NbaV0gPT0gJ3InIHx8IGZsYWdzW2ldID09ICd3JykKKwkgICAgICBoaXRfd2F0Y2hwb2ludCA9IDE7CisJICAgIGVsc2UgaWYgKGZsYWdzW2ldID09ICdcMDAwJykKKwkgICAgICBicmVhazsKKwl9CisgICAgfQorCisgIGlmIChzdHJjbXAgKHRhcmdldF9zaG9ydG5hbWUsICJsc2kiKSA9PSAwKQorICAgIHsKKyNpZiAwCisgICAgICAvKiBJZiB0aGlzIGlzIGFuIExTSSBQTU9OIHRhcmdldCwgc2VlIGlmIHdlIGp1c3QgaGl0IGEgaGFyZHJkd2FyZSB3YXRjaHBvaW50LgorCSBSaWdodCBub3csIFBNT04gZG9lc24ndCBnaXZlIHVzIGVub3VnaCBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgd2hpY2gKKwkgYnJlYWtwb2ludCB3ZSBoaXQuICBTbyB3ZSBoYXZlIHRvIGxvb2sgdXAgdGhlIFBDIGluIG91ciBvd24gdGFibGUKKwkgb2YgYnJlYWtwb2ludHMsIGFuZCBpZiBmb3VuZCwgYXNzdW1lIGl0J3MganVzdCBhIG5vcm1hbCBpbnN0cnVjdGlvbgorCSBmZXRjaCBicmVha3BvaW50LCBub3QgYSBkYXRhIHdhdGNocG9pbnQuICBGSVhNRSB3aGVuIFBNT04KKwkgcHJvdmlkZXMgc29tZSB3YXkgdG8gdGVsbCB1cyB3aGF0IHR5cGUgb2YgYnJlYWtwb2ludCBpdCBpcy4gICovCisgICAgICBpbnQgaTsKKyAgICAgIENPUkVfQUREUiBwYyA9IHJlYWRfcGMoKTsKKworICAgICAgaGl0X3dhdGNocG9pbnQgPSAxOworICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9MU0lfQlJFQUtQT0lOVFM7IGkrKykKKwl7CisJICBpZiAobHNpX2JyZWFrcG9pbnRzW2ldLmFkZHIgPT0gcGMKKwkgICAgICAmJiBsc2lfYnJlYWtwb2ludHNbaV0udHlwZSA9PSBCUkVBS19GRVRDSCkKKwkgICAgeworCSAgICAgIGhpdF93YXRjaHBvaW50ID0gMDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyNlbHNlCisgICAgICAvKiBJZiBhIGRhdGEgYnJlYWtwb2ludCB3YXMgaGl0LCBQTU9OIHJldHVybnMgdGhlIGZvbGxvd2luZyBwYWNrZXQ6CisJICAgICAweDEgYyAweDAgMHg1N2YgMHgxCisJIFRoZSByZXR1cm4gcGFja2V0IGZyb20gYW4gb3JkaW5hcnkgYnJlYWtwb2ludCBkb2Vzbid0IGhhdmUgdGhlCisJIGV4dHJhIDB4MDEgZmllbGQgdGFja2VkIG9udG8gdGhlIGVuZC4gICovCisgICAgICBpZiAobmZpZWxkcyA9PSAxICYmIHJwYyA9PSAxKQorCWhpdF93YXRjaHBvaW50ID0gMTsKKyNlbmRpZgorICAgIH0KKworICAvKiBOT1RFOiBUaGUgZm9sbG93aW5nIChzaWcpIG51bWJlcnMgYXJlIGRlZmluZWQgYnkgUE1PTjoKKyAgICAgCVNQUF9TSUdUUkFQICAgICA1ICAgICAgIGJyZWFrcG9pbnQKKyAgICAgICAgU1BQX1NJR0lOVCAgICAgIDIKKyAgICAgICAgU1BQX1NJR1NFR1YgICAgIDExCisgICAgICAgIFNQUF9TSUdCVVMgICAgICAxMAorICAgICAgICBTUFBfU0lHSUxMICAgICAgNAorICAgICAgICBTUFBfU0lHRlBFICAgICAgOAorICAgICAgICBTUFBfU0lHVEVSTSAgICAgMTUgKi8KKworICAvKiBUcmFuc2xhdGUgYSBNSVBTIHdhaXRzdGF0dXMuICBXZSB1c2UgY29uc3RhbnRzIGhlcmUgcmF0aGVyIHRoYW4gV1RFUk1TSUcKKyAgICAgYW5kIHNvIG9uLCBiZWNhdXNlIHRoZSBjb25zdGFudHMgd2Ugd2FudCBoZXJlIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZQorICAgICBNSVBTIHByb3RvY29sIGFuZCBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCB3aGF0IGhvc3Qgd2UgYXJlIHJ1bm5pbmcgb24uICAqLworICBpZiAoKHJzdGF0dXMgJiAweGZmKSA9PSAwKQorICAgIHsKKyAgICAgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9FWElURUQ7CisgICAgICBzdGF0dXMtPnZhbHVlLmludGVnZXIgPSAoKChyc3RhdHVzKSA+PiA4KSAmIDB4ZmYpOworICAgIH0KKyAgZWxzZSBpZiAoKHJzdGF0dXMgJiAweGZmKSA9PSAweDdmKQorICAgIHsKKyAgICAgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOworICAgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBtaXBzX3NpZ25hbF9mcm9tX3Byb3RvY29sICgoKHJzdGF0dXMpID4+IDgpICYgMHhmZik7CisKKyAgICAgIC8qIElmIHRoZSBzdG9wIFBDIGlzIGluIHRoZSBfZXhpdCBmdW5jdGlvbiwgYXNzdW1lCisgICAgICAgICB3ZSBoaXQgdGhlICdicmVhayAweDNmZicgaW5zdHJ1Y3Rpb24gaW4gX2V4aXQsIHNvIHRoaXMKKwkgaXMgbm90IGEgbm9ybWFsIGJyZWFrcG9pbnQuICAqLworICAgICAgaWYgKHN0cmNtcCAodGFyZ2V0X3Nob3J0bmFtZSwgImxzaSIpID09IDApCisJeworCSAgY2hhciAqZnVuY19uYW1lOworCSAgQ09SRV9BRERSIGZ1bmNfc3RhcnQ7CisJICBDT1JFX0FERFIgcGMgPSByZWFkX3BjKCk7CisKKwkgIGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAocGMsICZmdW5jX25hbWUsICZmdW5jX3N0YXJ0LCBOVUxMKTsKKwkgIGlmIChmdW5jX25hbWUgIT0gTlVMTCAmJiBzdHJjbXAgKGZ1bmNfbmFtZSwgIl9leGl0IikgPT0gMAorCSAgICAgICYmIGZ1bmNfc3RhcnQgPT0gcGMpCisJICAgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9FWElURUQ7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TSUdOQUxMRUQ7CisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IG1pcHNfc2lnbmFsX2Zyb21fcHJvdG9jb2wgKHJzdGF0dXMgJiAweDdmKTsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFdlIGhhdmUgdG8gbWFwIGJldHdlZW4gdGhlIHJlZ2lzdGVyIG51bWJlcnMgdXNlZCBieSBnZGIgYW5kIHRoZQorICAgcmVnaXN0ZXIgbnVtYmVycyB1c2VkIGJ5IHRoZSBkZWJ1Z2dpbmcgcHJvdG9jb2wuICBUaGlzIGZ1bmN0aW9uCisgICBhc3N1bWVzIHRoYXQgd2UgYXJlIHVzaW5nIHRtLW1pcHMuaC4gICovCisKKyNkZWZpbmUgUkVHTk9fT0ZGU0VUIDk2CisKK3N0YXRpYyBpbnQKK21pcHNfbWFwX3JlZ25vIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBpZiAocmVnbm8gPCAzMikKKyAgICByZXR1cm4gcmVnbm87CisgIGlmIChyZWdubyA+PSBGUDBfUkVHTlVNICYmIHJlZ25vIDwgRlAwX1JFR05VTSArIDMyKQorICAgIHJldHVybiByZWdubyAtIEZQMF9SRUdOVU0gKyAzMjsKKyAgc3dpdGNoIChyZWdubykKKyAgICB7CisgICAgY2FzZSBQQ19SRUdOVU06CisgICAgICByZXR1cm4gUkVHTk9fT0ZGU0VUICsgMDsKKyAgICBjYXNlIENBVVNFX1JFR05VTToKKyAgICAgIHJldHVybiBSRUdOT19PRkZTRVQgKyAxOworICAgIGNhc2UgSElfUkVHTlVNOgorICAgICAgcmV0dXJuIFJFR05PX09GRlNFVCArIDI7CisgICAgY2FzZSBMT19SRUdOVU06CisgICAgICByZXR1cm4gUkVHTk9fT0ZGU0VUICsgMzsKKyAgICBjYXNlIEZDUkNTX1JFR05VTToKKyAgICAgIHJldHVybiBSRUdOT19PRkZTRVQgKyA0OworICAgIGNhc2UgRkNSSVJfUkVHTlVNOgorICAgICAgcmV0dXJuIFJFR05PX09GRlNFVCArIDU7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIEZJWE1FOiBJcyB0aGVyZSBhIHdheSB0byBnZXQgdGhlIHN0YXR1cyByZWdpc3Rlcj8gICovCisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qIEZldGNoIHRoZSByZW1vdGUgcmVnaXN0ZXJzLiAgKi8KKworc3RhdGljIHZvaWQKK21pcHNfZmV0Y2hfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICB1bnNpZ25lZCBMT05HRVNUIHZhbDsKKyAgaW50IGVycjsKKworICBpZiAocmVnbm8gPT0gLTEpCisgICAgeworICAgICAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgTlVNX1JFR1M7IHJlZ25vKyspCisJbWlwc19mZXRjaF9yZWdpc3RlcnMgKHJlZ25vKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHJlZ25vID09IEZQX1JFR05VTSB8fCByZWdubyA9PSBaRVJPX1JFR05VTSkKKyAgICAvKiBGUF9SRUdOVU0gb24gdGhlIG1pcHMgaXMgYSBoYWNrIHdoaWNoIGlzIGp1c3Qgc3VwcG9zZWQgdG8gcmVhZAorICAgICAgIHplcm8gKHNlZSBhbHNvIG1pcHMtbmF0LmMpLiAgKi8KKyAgICB2YWwgPSAwOworICBlbHNlCisgICAgeworICAgICAgLyogSWYgUE1PTiBkb2Vzbid0IHN1cHBvcnQgdGhpcyByZWdpc3RlciwgZG9uJ3Qgd2FzdGUgc2VyaWFsCisgICAgICAgICBiYW5kd2lkdGggdHJ5aW5nIHRvIHJlYWQgaXQuICAqLworICAgICAgaW50IHBtb25fcmVnID0gbWlwc19tYXBfcmVnbm8gKHJlZ25vKTsKKyAgICAgIGlmIChyZWdubyAhPSAwICYmIHBtb25fcmVnID09IDApCisJdmFsID0gMDsKKyAgICAgIGVsc2UKKwl7CisJICAvKiBVbmZvcnR1bmF0ZWx5IHRoZSBQTU9OIHZlcnNpb24gaW4gdGhlIFZyNDMwMCBib2FyZCBoYXMgYmVlbgorCSAgICAgY29tcGlsZWQgd2l0aG91dCB0aGUgNjRiaXQgcmVnaXN0ZXIgYWNjZXNzIGNvbW1hbmRzLiBUaGlzCisJICAgICBtZWFucyB3ZSBjYW5ub3QgZ2V0IGhvbGQgb2YgdGhlIGZ1bGwgcmVnaXN0ZXIgd2lkdGguICovCisJICBpZiAobWlwc19tb25pdG9yID09IE1PTl9EREIpCisJICAgIHZhbCA9ICh1bnNpZ25lZCltaXBzX3JlcXVlc3QgKCd0JywgKHVuc2lnbmVkIGludCkgcG1vbl9yZWcsCisJCQkJKHVuc2lnbmVkIGludCkgMCwgJmVyciwgbWlwc19yZWNlaXZlX3dhaXQsIE5VTEwpOworCSAgZWxzZQorCSAgICB2YWwgPSBtaXBzX3JlcXVlc3QgKCdyJywgKHVuc2lnbmVkIGludCkgcG1vbl9yZWcsCisJCQkJKHVuc2lnbmVkIGludCkgMCwgJmVyciwgbWlwc19yZWNlaXZlX3dhaXQsIE5VTEwpOworCSAgaWYgKGVycikKKwkgICAgbWlwc19lcnJvciAoIkNhbid0IHJlYWQgcmVnaXN0ZXIgJWQ6ICVzIiwgcmVnbm8sCisJCQlzYWZlX3N0cmVycm9yIChlcnJubykpOworCX0KKyAgICB9CisKKyAgeworICAgIGNoYXIgYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisKKyAgICAvKiBXZSBnb3QgdGhlIG51bWJlciB0aGUgcmVnaXN0ZXIgaG9sZHMsIGJ1dCBnZGIgZXhwZWN0cyB0byBzZWUgYQorICAgICAgIHZhbHVlIGluIHRoZSB0YXJnZXQgYnl0ZSBvcmRlcmluZy4gICovCisgICAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoYnVmLCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pLCB2YWwpOworICAgIHN1cHBseV9yZWdpc3RlciAocmVnbm8sIGJ1Zik7CisgIH0KK30KKworLyogUHJlcGFyZSB0byBzdG9yZSByZWdpc3RlcnMuICBUaGUgTUlQUyBwcm90b2NvbCBjYW4gc3RvcmUgaW5kaXZpZHVhbAorICAgcmVnaXN0ZXJzLCBzbyB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgaGF2ZSB0byBkbyBhbnl0aGluZy4gICovCisKK3N0YXRpYyB2b2lkCittaXBzX3ByZXBhcmVfdG9fc3RvcmUgKCkKK3sKK30KKworLyogU3RvcmUgcmVtb3RlIHJlZ2lzdGVyKHMpLiAgKi8KKworc3RhdGljIHZvaWQKK21pcHNfc3RvcmVfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBpbnQgZXJyOworCisgIGlmIChyZWdubyA9PSAtMSkKKyAgICB7CisgICAgICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCBOVU1fUkVHUzsgcmVnbm8rKykKKwltaXBzX3N0b3JlX3JlZ2lzdGVycyAocmVnbm8pOworICAgICAgcmV0dXJuOworICAgIH0KKworICBtaXBzX3JlcXVlc3QgKCdSJywgKHVuc2lnbmVkIGludCkgbWlwc19tYXBfcmVnbm8gKHJlZ25vKSwKKwkJcmVhZF9yZWdpc3RlciAocmVnbm8pLAorCQkmZXJyLCBtaXBzX3JlY2VpdmVfd2FpdCwgTlVMTCk7CisgIGlmIChlcnIpCisgICAgbWlwc19lcnJvciAoIkNhbid0IHdyaXRlIHJlZ2lzdGVyICVkOiAlcyIsIHJlZ25vLCBzYWZlX3N0cmVycm9yIChlcnJubykpOworfQorCisvKiBGZXRjaCBhIHdvcmQgZnJvbSB0aGUgdGFyZ2V0IGJvYXJkLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCAKK21pcHNfZmV0Y2hfd29yZCAoYWRkcikKKyAgICAgQ09SRV9BRERSIGFkZHI7Cit7CisgIHVuc2lnbmVkIGludCB2YWw7CisgIGludCBlcnI7CisKKyAgLyogRklYTUUhIGFkZHIgd2FzIGNhc3QgdG8gdWludCEgKi8KKyAgdmFsID0gbWlwc19yZXF1ZXN0ICgnZCcsIGFkZHIsICh1bnNpZ25lZCBpbnQpIDAsICZlcnIsCisJCSAgICAgIG1pcHNfcmVjZWl2ZV93YWl0LCBOVUxMKTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICAvKiBEYXRhIHNwYWNlIGZhaWxlZDsgdHJ5IGluc3RydWN0aW9uIHNwYWNlLiAgKi8KKyAgICAgIC8qIEZJWE1FISBhZGRyIHdhcyBjYXN0IHRvIHVpbnQhICovCisgICAgICB2YWwgPSBtaXBzX3JlcXVlc3QgKCdpJywgYWRkciwgKHVuc2lnbmVkIGludCkgMCwgJmVyciwKKwkJCSAgbWlwc19yZWNlaXZlX3dhaXQsIE5VTEwpOworICAgICAgaWYgKGVycikKKyAgICAgICAgbWlwc19lcnJvciAoIkNhbid0IHJlYWQgYWRkcmVzcyAweCVzOiAlcyIsCisJICAgICAgcGFkZHJfbnogKGFkZHIpLCBzYWZlX3N0cmVycm9yIChlcnJubykpOworICAgIH0KKyAgcmV0dXJuIHZhbDsKK30KKworLyogU3RvcmUgYSB3b3JkIHRvIHRoZSB0YXJnZXQgYm9hcmQuICBSZXR1cm5zIGVycm5vIGNvZGUgb3IgemVybyBmb3IKKyAgIHN1Y2Nlc3MuICBJZiBPTERfQ09OVEVOVFMgaXMgbm9uLU5VTEwsIHB1dCB0aGUgb2xkIGNvbnRlbnRzIG9mIHRoYXQKKyAgIG1lbW9yeSBsb2NhdGlvbiB0aGVyZS4gICovCisKKy8qIEZJWE1FISBtYWtlIHN1cmUgb25seSAzMi1iaXQgcXVhbnRpdGllcyBnZXQgc3RvcmVkISAqLworc3RhdGljIGludAorbWlwc19zdG9yZV93b3JkIChhZGRyLCB2YWwsIG9sZF9jb250ZW50cykKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIHVuc2lnbmVkIGludCB2YWw7CisgICAgIGNoYXIgKm9sZF9jb250ZW50czsKK3sKKyAgaW50IGVycjsKKyAgdW5zaWduZWQgaW50IG9sZGNvbnRlbnRzOworCisgIG9sZGNvbnRlbnRzID0gbWlwc19yZXF1ZXN0ICgnRCcsIGFkZHIsICh1bnNpZ25lZCBpbnQpIHZhbCwKKwkJCSAgICAgICZlcnIsCisJCQkgICAgICBtaXBzX3JlY2VpdmVfd2FpdCwgTlVMTCk7CisgIGlmIChlcnIpCisgICAgeworICAgICAgLyogRGF0YSBzcGFjZSBmYWlsZWQ7IHRyeSBpbnN0cnVjdGlvbiBzcGFjZS4gICovCisgICAgICBvbGRjb250ZW50cyA9IG1pcHNfcmVxdWVzdCAoJ0knLCBhZGRyLAorCQkJCSAgKHVuc2lnbmVkIGludCkgdmFsLCAmZXJyLAorCQkJCSAgbWlwc19yZWNlaXZlX3dhaXQsIE5VTEwpOworICAgICAgaWYgKGVycikKKwlyZXR1cm4gZXJybm87CisgICAgfQorICBpZiAob2xkX2NvbnRlbnRzICE9IE5VTEwpCisgICAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAob2xkX2NvbnRlbnRzLCA0LCBvbGRjb250ZW50cyk7CisgIHJldHVybiAwOworfQorCisvKiBSZWFkIG9yIHdyaXRlIExFTiBieXRlcyBmcm9tIGluZmVyaW9yIG1lbW9yeSBhdCBNRU1BRERSLAorICAgdHJhbnNmZXJyaW5nIHRvIG9yIGZyb20gZGVidWdnZXIgYWRkcmVzcyBNWUFERFIuICBXcml0ZSB0byBpbmZlcmlvcgorICAgaWYgU0hPVUxEX1dSSVRFIGlzIG5vbnplcm8uICBSZXR1cm5zIGxlbmd0aCBvZiBkYXRhIHdyaXR0ZW4gb3IKKyAgIHJlYWQ7IDAgZm9yIGVycm9yLiAgTm90ZSB0aGF0IHByb3RvY29sIGdpdmVzIHVzIHRoZSBjb3JyZWN0IHZhbHVlCisgICBmb3IgYSBsb25nd29yZCwgc2luY2UgaXQgdHJhbnNmZXJzIHZhbHVlcyBpbiBBU0NJSS4gIFdlIHdhbnQgdGhlCisgICBieXRlIHZhbHVlcywgc28gd2UgaGF2ZSB0byBzd2FwIHRoZSBsb25nd29yZCB2YWx1ZXMuICAqLworCitzdGF0aWMgaW50CittaXBzX3hmZXJfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbiwgd3JpdGUsIGlnbm9yZSkKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IHdyaXRlOworICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqaWdub3JlOworeworICByZWdpc3RlciBpbnQgaTsKKyAgLyogUm91bmQgc3RhcnRpbmcgYWRkcmVzcyBkb3duIHRvIGxvbmd3b3JkIGJvdW5kYXJ5LiAgKi8KKyAgcmVnaXN0ZXIgQ09SRV9BRERSIGFkZHIgPSBtZW1hZGRyICZ+IDM7CisgIC8qIFJvdW5kIGVuZGluZyBhZGRyZXNzIHVwOyBnZXQgbnVtYmVyIG9mIGxvbmd3b3JkcyB0aGF0IG1ha2VzLiAgKi8KKyAgcmVnaXN0ZXIgaW50IGNvdW50ID0gKCgobWVtYWRkciArIGxlbikgLSBhZGRyKSArIDMpIC8gNDsKKyAgLyogQWxsb2NhdGUgYnVmZmVyIG9mIHRoYXQgbWFueSBsb25nd29yZHMuICAqLworICByZWdpc3RlciBjaGFyICpidWZmZXIgPSBhbGxvY2EgKGNvdW50ICogNCk7CisKKyAgaW50IHN0YXR1czsKKworICBpZiAod3JpdGUpCisgICAgeworICAgICAgLyogRmlsbCBzdGFydCBhbmQgZW5kIGV4dHJhIGJ5dGVzIG9mIGJ1ZmZlciB3aXRoIGV4aXN0aW5nIGRhdGEuICAqLworICAgICAgaWYgKGFkZHIgIT0gbWVtYWRkciB8fCBsZW4gPCA0KQorCXsKKwkgIC8qIE5lZWQgcGFydCBvZiBpbml0aWFsIHdvcmQgLS0gZmV0Y2ggaXQuICAqLworCSAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoJmJ1ZmZlclswXSwgNCwgbWlwc19mZXRjaF93b3JkIChhZGRyKSk7CisJfQorCisgICAgICBpZiAoY291bnQgPiAxKQorCXsKKwkgIC8qIE5lZWQgcGFydCBvZiBsYXN0IHdvcmQgLS0gZmV0Y2ggaXQuICBGSVhNRTogd2UgZG8gdGhpcyBldmVuCisJICAgICBpZiB3ZSBkb24ndCBuZWVkIGl0LiAgKi8KKwkgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKCZidWZmZXJbKGNvdW50IC0gMSkgKiA0XSwgNCwKKwkJCQkgIG1pcHNfZmV0Y2hfd29yZCAoYWRkciArIChjb3VudCAtIDEpICogNCkpOworCX0KKworICAgICAgLyogQ29weSBkYXRhIHRvIGJlIHdyaXR0ZW4gb3ZlciBjb3JyZXNwb25kaW5nIHBhcnQgb2YgYnVmZmVyICovCisKKyAgICAgIG1lbWNweSAoKGNoYXIgKikgYnVmZmVyICsgKG1lbWFkZHIgJiAzKSwgbXlhZGRyLCBsZW4pOworCisgICAgICAvKiBXcml0ZSB0aGUgZW50aXJlIGJ1ZmZlci4gICovCisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBhZGRyICs9IDQpCisJeworCSAgc3RhdHVzID0gbWlwc19zdG9yZV93b3JkIChhZGRyLAorCQkJCSAgICBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKCZidWZmZXJbaSo0XSwgNCksCisJCQkJICAgIE5VTEwpOworCSAgLyogUmVwb3J0IGVhY2gga2lsb2J5dGUgKHdlIGRvd25sb2FkIDMyLWJpdCB3b3JkcyBhdCBhIHRpbWUpICovCisJICBpZiAoaSAlIDI1NiA9PSAyNTUpIAorCSAgICB7CisJICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCIqIik7CisJICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwkgICAgfQorCSAgaWYgKHN0YXR1cykKKwkgICAgeworCSAgICAgIGVycm5vID0gc3RhdHVzOworCSAgICAgIHJldHVybiAwOworCSAgICB9CisJICAvKiBGSVhNRTogRG8gd2Ugd2FudCBhIFFVSVQgaGVyZT8gICovCisJfQorICAgICAgaWYgKGNvdW50ID49IDI1NikKKwlwcmludGZfdW5maWx0ZXJlZCAoIlxuIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogUmVhZCBhbGwgdGhlIGxvbmd3b3JkcyAqLworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIGFkZHIgKz0gNCkKKwl7CisJICBzdG9yZV91bnNpZ25lZF9pbnRlZ2VyICgmYnVmZmVyW2kqNF0sIDQsIG1pcHNfZmV0Y2hfd29yZCAoYWRkcikpOworCSAgUVVJVDsKKwl9CisKKyAgICAgIC8qIENvcHkgYXBwcm9wcmlhdGUgYnl0ZXMgb3V0IG9mIHRoZSBidWZmZXIuICAqLworICAgICAgbWVtY3B5IChteWFkZHIsIGJ1ZmZlciArIChtZW1hZGRyICYgMyksIGxlbik7CisgICAgfQorICByZXR1cm4gbGVuOworfQorCisvKiBQcmludCBpbmZvIG9uIHRoaXMgdGFyZ2V0LiAgKi8KKworc3RhdGljIHZvaWQKK21pcHNfZmlsZXNfaW5mbyAoaWdub3JlKQorICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqaWdub3JlOworeworICBwcmludGZfdW5maWx0ZXJlZCAoIkRlYnVnZ2luZyBhIE1JUFMgYm9hcmQgb3ZlciBhIHNlcmlhbCBsaW5lLlxuIik7Cit9CisKKy8qIEtpbGwgdGhlIHByb2Nlc3MgcnVubmluZyBvbiB0aGUgYm9hcmQuICBUaGlzIHdpbGwgYWN0dWFsbHkgb25seQorICAgd29yayBpZiB3ZSBhcmUgZG9pbmcgcmVtb3RlIGRlYnVnZ2luZyBvdmVyIHRoZSBjb25zb2xlIGlucHV0LiAgSQorICAgdGhpbmsgdGhhdCBpZiBJRFQvc2ltIGhhZCB0aGUgcmVtb3RlIGRlYnVnIGludGVycnVwdCBlbmFibGVkIG9uIHRoZQorICAgcmlnaHQgcG9ydCwgd2UgY291bGQgaW50ZXJydXB0IHRoZSBwcm9jZXNzIHdpdGggYSBicmVhayBzaWduYWwuICAqLworCitzdGF0aWMgdm9pZAorbWlwc19raWxsICgpCit7CisgIGlmICghbWlwc193YWl0X2ZsYWcpCisgICAgcmV0dXJuOworCisgIGludGVycnVwdF9jb3VudCsrOworCisgIGlmIChpbnRlcnJ1cHRfY291bnQgPj0gMikKKyAgICB7CisgICAgICBpbnRlcnJ1cHRfY291bnQgPSAwOworCisgICAgICB0YXJnZXRfdGVybWluYWxfb3VycyAoKTsKKworICAgICAgaWYgKHF1ZXJ5ICgiSW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIHByb2dyYW0uXG5cCitHaXZlIHVwIChhbmQgc3RvcCBkZWJ1Z2dpbmcgaXQpPyAiKSkKKwl7CisJICAvKiBDbGVhbiB1cCBpbiBzdWNoIGEgd2F5IHRoYXQgbWlwc19jbG9zZSB3b24ndCB0cnkgdG8gdGFsayB0byB0aGUKKwkgICAgIGJvYXJkIChpdCBhbG1vc3Qgc3VyZWx5IHdvbid0IHdvcmsgc2luY2Ugd2Ugd2VyZW4ndCBhYmxlIHRvIHRhbGsgdG8KKwkgICAgIGl0KS4gICovCisJICBtaXBzX3dhaXRfZmxhZyA9IDA7CisJICBjbG9zZV9wb3J0cygpOworCisJICBwcmludGZfdW5maWx0ZXJlZCAoIkVuZGluZyByZW1vdGUgTUlQUyBkZWJ1Z2dpbmcuXG4iKTsKKwkgIHRhcmdldF9tb3Vybl9pbmZlcmlvciAoKTsKKworCSAgcmV0dXJuX3RvX3RvcF9sZXZlbCAoUkVUVVJOX1FVSVQpOworCX0KKworICAgICAgdGFyZ2V0X3Rlcm1pbmFsX2luZmVyaW9yICgpOworICAgIH0KKworICBpZiAocmVtb3RlX2RlYnVnID4gMCkKKyAgICBwcmludGZfdW5maWx0ZXJlZCAoIlNlbmRpbmcgYnJlYWtcbiIpOworCisgIFNFUklBTF9TRU5EX0JSRUFLIChtaXBzX2Rlc2MpOworCisjaWYgMAorICBpZiAobWlwc19pc19vcGVuKQorICAgIHsKKyAgICAgIGNoYXIgY2M7CisKKyAgICAgIC8qIFNlbmQgYSBeQy4gICovCisgICAgICBjYyA9ICdcMDAzJzsKKyAgICAgIFNFUklBTF9XUklURSAobWlwc19kZXNjLCAmY2MsIDEpOworICAgICAgc2xlZXAgKDEpOworICAgICAgdGFyZ2V0X21vdXJuX2luZmVyaW9yICgpOworICAgIH0KKyNlbmRpZgorfQorCisvKiBTdGFydCBydW5uaW5nIG9uIHRoZSB0YXJnZXQgYm9hcmQuICAqLworCitzdGF0aWMgdm9pZAorbWlwc19jcmVhdGVfaW5mZXJpb3IgKGV4ZWNmaWxlLCBhcmdzLCBlbnYpCisgICAgIGNoYXIgKmV4ZWNmaWxlOworICAgICBjaGFyICphcmdzOworICAgICBjaGFyICoqZW52OworeworICBDT1JFX0FERFIgZW50cnlfcHQ7CisKKyAgaWYgKGFyZ3MgJiYgKmFyZ3MpCisgICAgeworICAgICAgd2FybmluZyAoIlwKK0Nhbid0IHBhc3MgYXJndW1lbnRzIHRvIHJlbW90ZSBNSVBTIGJvYXJkOyBhcmd1bWVudHMgaWdub3JlZC4iKTsKKyAgICAgIC8qIEFuZCBkb24ndCB0cnkgdG8gdXNlIHRoZW0gb24gdGhlIG5leHQgInJ1biIgY29tbWFuZC4gICovCisgICAgICBleGVjdXRlX2NvbW1hbmQgKCJzZXQgYXJncyIsIDApOworICAgIH0KKworICBpZiAoZXhlY2ZpbGUgPT0gMCB8fCBleGVjX2JmZCA9PSAwKQorICAgIGVycm9yICgiTm8gZXhlY3V0YWJsZSBmaWxlIHNwZWNpZmllZCIpOworCisgIGVudHJ5X3B0ID0gKENPUkVfQUREUikgYmZkX2dldF9zdGFydF9hZGRyZXNzIChleGVjX2JmZCk7CisKKyAgaW5pdF93YWl0X2Zvcl9pbmZlcmlvciAoKTsKKworICAvKiBGSVhNRTogU2hvdWxkIHdlIHNldCBpbmZlcmlvcl9waWQgaGVyZT8gICovCisKKyAgcHJvY2VlZCAoZW50cnlfcHQsIFRBUkdFVF9TSUdOQUxfREVGQVVMVCwgMCk7Cit9CisKKy8qIENsZWFuIHVwIGFmdGVyIGEgcHJvY2Vzcy4gIEFjdHVhbGx5IG5vdGhpbmcgdG8gZG8uICAqLworCitzdGF0aWMgdm9pZAorbWlwc19tb3Vybl9pbmZlcmlvciAoKQoreworICBpZiAoY3VycmVudF9vcHMgIT0gTlVMTCkKKyAgICB1bnB1c2hfdGFyZ2V0IChjdXJyZW50X29wcyk7CisgIGdlbmVyaWNfbW91cm5faW5mZXJpb3IgKCk7Cit9CisMCisvKiBXZSBjYW4gd3JpdGUgYSBicmVha3BvaW50IGFuZCByZWFkIHRoZSBzaGFkb3cgY29udGVudHMgaW4gb25lCisgICBvcGVyYXRpb24uICAqLworCisvKiBJbnNlcnQgYSBicmVha3BvaW50LiAgT24gdGFyZ2V0cyB0aGF0IGRvbid0IGhhdmUgYnVpbHQtaW4gYnJlYWtwb2ludAorICAgc3VwcG9ydCwgd2UgcmVhZCB0aGUgY29udGVudHMgb2YgdGhlIHRhcmdldCBsb2NhdGlvbiBhbmQgc3Rhc2ggaXQsCisgICB0aGVuIG92ZXJ3cml0ZSBpdCB3aXRoIGEgYnJlYWtwb2ludCBpbnN0cnVjdGlvbi4gIEFERFIgaXMgdGhlIHRhcmdldAorICAgbG9jYXRpb24gaW4gdGhlIHRhcmdldCBtYWNoaW5lLiAgQ09OVEVOVFNfQ0FDSEUgaXMgYSBwb2ludGVyIHRvIAorICAgbWVtb3J5IGFsbG9jYXRlZCBmb3Igc2F2aW5nIHRoZSB0YXJnZXQgY29udGVudHMuICBJdCBpcyBndWFyYW50ZWVkCisgICBieSB0aGUgY2FsbGVyIHRvIGJlIGxvbmcgZW5vdWdoIHRvIHNhdmUgc2l6ZW9mIEJSRUFLUE9JTlQgYnl0ZXMgKHRoaXMKKyAgIGlzIGFjY29tcGxpc2hlZCB2aWEgQlJFQUtQT0lOVF9NQVgpLiAgKi8KKworc3RhdGljIGludAorbWlwc19pbnNlcnRfYnJlYWtwb2ludCAoYWRkciwgY29udGVudHNfY2FjaGUpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpjb250ZW50c19jYWNoZTsKK3sKKyAgaWYgKG1vbml0b3Jfc3VwcG9ydHNfYnJlYWtwb2ludHMpCisgICAgcmV0dXJuIHNldF9icmVha3BvaW50IChhZGRyLCBNSVBTX0lOU1RMRU4sIEJSRUFLX0ZFVENIKTsKKyAgZWxzZQorICAgIHJldHVybiBtZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKTsKK30KKworc3RhdGljIGludAorbWlwc19yZW1vdmVfYnJlYWtwb2ludCAoYWRkciwgY29udGVudHNfY2FjaGUpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpjb250ZW50c19jYWNoZTsKK3sKKyAgaWYgKG1vbml0b3Jfc3VwcG9ydHNfYnJlYWtwb2ludHMpCisgICAgcmV0dXJuIGNsZWFyX2JyZWFrcG9pbnQgKGFkZHIsIE1JUFNfSU5TVExFTiwgQlJFQUtfRkVUQ0gpOworICBlbHNlCisgICAgcmV0dXJuIG1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCAoYWRkciwgY29udGVudHNfY2FjaGUpOworfQorCisjaWYgMCAvKiBjdXJyZW50bHkgbm90IHVzZWQgKi8KKy8qIFBNT04gZG9lcyBub3QgY3VycmVudGx5IHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIGRlYnVnIG1vZGUgJ2InCisgICBjb21tYW5kcyB0byBtYW5pcHVsYXRlIGJyZWFrcG9pbnRzLiBIb3dldmVyLCBpZiB3ZSB3YW50ZWQgdG8gdXNlCisgICB0aGUgbW9uaXRvciBicmVha3BvaW50cyAocmF0aGVyIHRoYW4gdGhlIEdEQiBCUkVBS19JTlNOIHZlcnNpb24pCisgICB0aGVuIHRoaXMgY29kZSBwZXJmb3JtcyB0aGUgd29yayBuZWVkZWQgdG8gbGVhdmUgZGVidWcgbW9kZSwKKyAgIHNldC9jbGVhciB0aGUgYnJlYWtwb2ludCwgYW5kIHRoZW4gcmV0dXJuIHRvIGRlYnVnIG1vZGUuICovCisKKyNkZWZpbmUgUE1PTl9NQVhfQlAgKDMzKSAvKiAzMiBTVywgMSBIVyAqLworc3RhdGljIENPUkVfQUREUiBtaXBzX3Btb25fYnBfaW5mb1tQTU9OX01BWF9CUF07CisvKiBOT1RFOiBUaGUgY29kZSByZWxpZXMgb24gdGhpcyB2ZWN0b3IgYmVpbmcgemVyby1pbml0aWFsaXNlZCBieSB0aGUgc3lzdGVtICovCisKK3N0YXRpYyBpbnQKK3Btb25faW5zZXJ0X2JyZWFrcG9pbnQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqY29udGVudHNfY2FjaGU7Cit7CisgIGludCBzdGF0dXM7CisKKyAgaWYgKG1vbml0b3Jfc3VwcG9ydHNfYnJlYWtwb2ludHMpCisgICAgeworICAgICAgY2hhciB0YnVmZlsxMl07IC8qIHNwYWNlIGZvciBicmVha3BvaW50IGNvbW1hbmQgKi8KKyAgICAgIGludCBicG51bTsKKyAgICAgIENPUkVfQUREUiBicGFkZHI7CisKKyAgICAgIC8qIFBNT04gZG9lcyBub3Qgc3VwcG9ydCBkZWJ1ZyBsZXZlbCBicmVha3BvaW50IHNldC9yZW1vdmU6ICovCisgICAgICBpZiAobWlwc19leGl0X2RlYnVnICgpKQorICAgICAgICBtaXBzX2Vycm9yICgiRmFpbGVkIHRvIGV4aXQgZGVidWcgbW9kZSIpOworCisgICAgICBzcHJpbnRmICh0YnVmZiwgImIgJTA4eFxyIiwgYWRkcik7CisgICAgICBtaXBzX3NlbmRfY29tbWFuZCAodGJ1ZmYsIDApOworCisgICAgICBtaXBzX2V4cGVjdCAoIkJwdCAiKTsKKworICAgICAgaWYgKCFtaXBzX2dldHN0cmluZyAodGJ1ZmYsIDIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICAgIHRidWZmWzJdID0gJ1wwJzsgLyogdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKyAgICAgIGlmIChzc2NhbmYgKHRidWZmLCAiJWQiLCAmYnBudW0pICE9IDEpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsCisJCQkgICAgICAiSW52YWxpZCBkZWNpbWFsIGJyZWFrcG9pbnQgbnVtYmVyIGZyb20gdGFyZ2V0OiAlc1xuIiwgdGJ1ZmYpOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgIG1pcHNfZXhwZWN0ICgiID0gIik7CisKKyAgICAgIC8qIExlYWQgaW4gdGhlIGhleCBudW1iZXIgd2UgYXJlIGV4cGVjdGluZzogKi8KKyAgICAgIHRidWZmWzBdID0gJzAnOworICAgICAgdGJ1ZmZbMV0gPSAneCc7CisKKyAgICAgIC8qIEZJWE1FISEgb25seSA4IGJ5dGVzISAgbmVlZCB0byBleHBhbmQgZm9yIEJmZDY0OyAKKyAgICAgICAgIHdoaWNoIHRhcmdldHMgcmV0dXJuIDY0LWJpdCBhZGRyZXNzZXM/ICBQTU9OIHJldHVybnMgb25seSAzMiEgKi8KKyAgICAgIGlmICghbWlwc19nZXRzdHJpbmcgKCZ0YnVmZlsyXSwgOCkpCisgICAgICAgIHJldHVybiAxOworICAgICAgdGJ1ZmZbMTBdID0gJ1wwJzsgLyogdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKworICAgICAgaWYgKHNzY2FuZiAodGJ1ZmYsICIweCUwOHgiLCAmYnBhZGRyKSAhPSAxKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLAorCQkJICAgICAgIkludmFsaWQgaGV4IGFkZHJlc3MgZnJvbSB0YXJnZXQ6ICVzXG4iLCB0YnVmZik7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgaWYgKGJwbnVtID49IFBNT05fTUFYX0JQKQorICAgICAgICB7CisgICAgICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLAorCQkJICAgICAgIkVycm9yOiBSZXR1cm5lZCBicmVha3BvaW50IG51bWJlciAlZCBvdXRzaWRlIGFjY2VwdGFibGUgcmFuZ2UgKDAuLiVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwbnVtLCBQTU9OX01BWF9CUCAtIDEpOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgIGlmIChicGFkZHIgIT0gYWRkcikKKyAgICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiV2FybmluZzogQnJlYWtwb2ludCBhZGRyZXNzZXMgZG8gbm90IG1hdGNoOiAweCV4ICE9IDB4JXhcbiIsIGFkZHIsIGJwYWRkcik7CisKKyAgICAgIG1pcHNfcG1vbl9icF9pbmZvW2JwbnVtXSA9IGJwYWRkcjsKKworICAgICAgbWlwc19leHBlY3QgKCJcclxuIik7CisgICAgICBtaXBzX2V4cGVjdCAobWlwc19tb25pdG9yX3Byb21wdCk7CisKKyAgICAgIG1pcHNfZW50ZXJfZGVidWcgKCk7CisKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByZXR1cm4gbWlwc19zdG9yZV93b3JkIChhZGRyLCBCUkVBS19JTlNOLCBjb250ZW50c19jYWNoZSk7Cit9CisKK3N0YXRpYyBpbnQKK3Btb25fcmVtb3ZlX2JyZWFrcG9pbnQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqY29udGVudHNfY2FjaGU7Cit7CisgIGlmIChtb25pdG9yX3N1cHBvcnRzX2JyZWFrcG9pbnRzKQorICAgIHsKKyAgICAgIGludCBicG51bTsKKyAgICAgIGNoYXIgdGJ1ZmZbN107IC8qIGVub3VnaCBmb3IgZGVsZXRlIGJyZWFrcG9pbnQgY29tbWFuZCAqLworCisgICAgICBmb3IgKGJwbnVtID0gMDsgYnBudW0gPCBQTU9OX01BWF9CUDsgYnBudW0rKykKKyAgICAgICAgaWYgKG1pcHNfcG1vbl9icF9pbmZvW2JwbnVtXSA9PSBhZGRyKQorICAgICAgICAgIGJyZWFrOworCisgICAgICBpZiAoYnBudW0gPj0gUE1PTl9NQVhfQlApCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsCisJICAgICJwbW9uX3JlbW92ZV9icmVha3BvaW50OiBGYWlsZWQgdG8gZmluZCBicmVha3BvaW50IGF0IGFkZHJlc3MgMHglc1xuIiwKKwkgICAgcGFkZHJfbnogKGFkZHIpKTsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICBpZiAobWlwc19leGl0X2RlYnVnICgpKQorICAgICAgICBtaXBzX2Vycm9yICgiRmFpbGVkIHRvIGV4aXQgZGVidWcgbW9kZSIpOworCisgICAgICBzcHJpbnRmICh0YnVmZiwgImRiICUwMmRcciIsIGJwbnVtKTsKKworICAgICAgbWlwc19zZW5kX2NvbW1hbmQgKHRidWZmLCAtMSk7CisgICAgICAvKiBOT1RFOiBJZiB0aGUgYnJlYWtwb2ludCBkb2VzIG5vdCBleGlzdCB0aGVuIGEgIkJwdCA8ZGQ+IG5vdAorICAgICAgICAgc2V0IiBtZXNzYWdlIHdpbGwgYmUgcmV0dXJuZWQuICovCisKKyAgICAgIG1pcHNfZW50ZXJfZGVidWcgKCk7CisKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICByZXR1cm4gdGFyZ2V0X3dyaXRlX21lbW9yeSAoYWRkciwgY29udGVudHNfY2FjaGUsIEJSRUFLX0lOU05fU0laRSk7Cit9CisjZW5kaWYKKworCisvKiBUZWxsIHdoZXRoZXIgdGhpcyB0YXJnZXQgY2FuIHN1cHBvcnQgYSBoYXJkd2FyZSBicmVha3BvaW50LiAgQ05UCisgICBpcyB0aGUgbnVtYmVyIG9mIGhhcmR3YXJlIGJyZWFrcG9pbnRzIGFscmVhZHkgaW5zdGFsbGVkLiAgVGhpcworICAgaW1wbGVtZW50cyB0aGUgVEFSR0VUX0NBTl9VU0VfSEFSRFdBUkVfV0FUQ0hQT0lOVCBtYWNyby4gICovCisKK2ludAorcmVtb3RlX21pcHNfY2FuX3VzZV9oYXJkd2FyZV93YXRjaHBvaW50IChjbnQpCisgICAgIGludCBjbnQ7Cit7CisgICAgcmV0dXJuIGNudCA8IE1BWF9MU0lfQlJFQUtQT0lOVFMgJiYgc3RyY21wICh0YXJnZXRfc2hvcnRuYW1lLCAibHNpIikgPT0gMDsKK30KKworCisvKiBDb21wdXRlIGEgZG9uJ3QgY2FyZSBtYXNrIGZvciB0aGUgcmVnaW9uIGJvdW5kaW5nIEFERFIgYW5kIEFERFIgKyBMRU4gLSAxLgorICAgVGhpcyBpcyB1c2VkIGZvciBtZW1vcnkgcmVmIGJyZWFrcG9pbnRzLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2NhbGN1bGF0ZV9tYXNrIChhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBpbnQgbGVuOworeworICB1bnNpZ25lZCBsb25nIG1hc2s7CisgIGludCBpOworCisgIG1hc2sgPSBhZGRyIF4gKGFkZHIgKyBsZW4gLSAxKTsKKworICBmb3IgKGkgPSAzMjsgaSA+PSAwOyBpLS0pCisgICAgaWYgKG1hc2sgPT0gMCkKKyAgICAgIGJyZWFrOworICAgIGVsc2UKKyAgICAgIG1hc2sgPj49IDE7CisKKyAgbWFzayA9ICh1bnNpZ25lZCBsb25nKSAweGZmZmZmZmZmID4+IGk7CisKKyAgcmV0dXJuIG1hc2s7Cit9CisKKworLyogSW5zZXJ0IGEgaGFyZHdhcmUgYnJlYWtwb2ludC4gIFRoaXMgd29ya3Mgb25seSBvbiBMU0kgdGFyZ2V0cywgd2hpY2gKKyAgIGltcGxlbWVudCBvcmRpbmFyeSBicmVha3BvaW50cyB1c2luZyBoYXJkd2FyZSBmYWNpbGl0aWVzLiAgKi8KKworaW50CityZW1vdGVfbWlwc19pbnNlcnRfaHdfYnJlYWtwb2ludCAoYWRkciwgY29udGVudHNfY2FjaGUpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpjb250ZW50c19jYWNoZTsKK3sKKyAgaWYgKHN0cmNtcCAodGFyZ2V0X3Nob3J0bmFtZSwgImxzaSIpID09IDApCisgICAgcmV0dXJuIG1pcHNfaW5zZXJ0X2JyZWFrcG9pbnQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKTsKKyAgZWxzZQorICAgIHJldHVybiAtMTsKK30KKworCisvKiBSZW1vdmUgYSBoYXJkd2FyZSBicmVha3BvaW50LiAgVGhpcyB3b3JrcyBvbmx5IG9uIExTSSB0YXJnZXRzLCB3aGljaAorICAgaW1wbGVtZW50IG9yZGluYXJ5IGJyZWFrcG9pbnRzIHVzaW5nIGhhcmR3YXJlIGZhY2lsaXRpZXMuICAqLworCitpbnQKK3JlbW90ZV9taXBzX3JlbW92ZV9od19icmVha3BvaW50IChhZGRyLCBjb250ZW50c19jYWNoZSkKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGNoYXIgKmNvbnRlbnRzX2NhY2hlOworeworICBpZiAoc3RyY21wICh0YXJnZXRfc2hvcnRuYW1lLCAibHNpIikgPT0gMCkKKyAgICByZXR1cm4gbWlwc19yZW1vdmVfYnJlYWtwb2ludCAoYWRkciwgY29udGVudHNfY2FjaGUpOworICBlbHNlCisgICAgcmV0dXJuIC0xOworfQorCisvKiBTZXQgYSBkYXRhIHdhdGNocG9pbnQuICBBRERSIGFuZCBMRU4gc2hvdWxkIGJlIG9idmlvdXMuICBUWVBFIGlzIDAKKyAgIGZvciBhIHdyaXRlIHdhdGNocG9pbnQsIDEgZm9yIGEgcmVhZCB3YXRjaHBvaW50LCBvciAyIGZvciBhIHJlYWQvd3JpdGUKKyAgIHdhdGNocG9pbnQuICovCisKK2ludAorcmVtb3RlX21pcHNfc2V0X3dhdGNocG9pbnQgKGFkZHIsIGxlbiwgdHlwZSkKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGludCBsZW47CisgICAgIGludCB0eXBlOworeworICBpZiAoc2V0X2JyZWFrcG9pbnQgKGFkZHIsIGxlbiwgdHlwZSkpCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAwOworfQorCitpbnQKK3JlbW90ZV9taXBzX3JlbW92ZV93YXRjaHBvaW50IChhZGRyLCBsZW4sIHR5cGUpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBpbnQgbGVuOworICAgICBpbnQgdHlwZTsKK3sKKyAgaWYgKGNsZWFyX2JyZWFrcG9pbnQgKGFkZHIsIGxlbiwgdHlwZSkpCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAwOworfQorCitpbnQKK3JlbW90ZV9taXBzX3N0b3BwZWRfYnlfd2F0Y2hwb2ludCAoKQoreworICByZXR1cm4gaGl0X3dhdGNocG9pbnQ7Cit9CisKKworLyogSW5zZXJ0IGEgYnJlYWtwb2ludC4gICovCisKK3N0YXRpYyBpbnQKK3NldF9icmVha3BvaW50IChhZGRyLCBsZW4sIHR5cGUpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBpbnQgbGVuOworICAgICBlbnVtIGJyZWFrX3R5cGUgdHlwZTsKK3sKKyAgcmV0dXJuIGNvbW1vbl9icmVha3BvaW50ICgxLCBhZGRyLCBsZW4sIHR5cGUpOworfQorCisKKy8qIENsZWFyIGEgYnJlYWtwb2ludC4gICovCisKK3N0YXRpYyBpbnQKK2NsZWFyX2JyZWFrcG9pbnQgKGFkZHIsIGxlbiwgdHlwZSkKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGludCBsZW47CisgICAgIGVudW0gYnJlYWtfdHlwZSB0eXBlOworeworICByZXR1cm4gY29tbW9uX2JyZWFrcG9pbnQgKDAsIGFkZHIsIGxlbiwgdHlwZSk7Cit9CisKKworLyogQ2hlY2sgdGhlIGVycm9yIGNvZGUgZnJvbSB0aGUgcmV0dXJuIHBhY2tldCBmb3IgYW4gTFNJIGJyZWFrcG9pbnQKKyAgIGNvbW1hbmQuICBJZiB0aGVyZSdzIG5vIGVycm9yLCBqdXN0IHJldHVybiAwLiAgSWYgaXQncyBhIHdhcm5pbmcsCisgICBwcmludCB0aGUgd2FybmluZyB0ZXh0IGFuZCByZXR1cm4gMC4gIElmIGl0J3MgYW4gZXJyb3IsIHByaW50CisgICB0aGUgZXJyb3IgdGV4dCBhbmQgcmV0dXJuIDEuICA8QUREUj4gaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGJyZWFrcG9pbnQKKyAgIHRoYXQgd2FzIGJlaW5nIHNldC4gIDxSRVJSRkxHPiBpcyB0aGUgZXJyb3IgY29kZSByZXR1cm5lZCBieSBQTU9OLiAKKyAgIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIGNvbW1vbl9icmVha3BvaW50LiAgKi8KKworc3RhdGljIGludAorY2hlY2tfbHNpX2Vycm9yIChhZGRyLCByZXJyZmxnKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgaW50IHJlcnJmbGc7Cit7CisgIHN0cnVjdCBsc2lfZXJyb3IgKmVycjsKKyAgY2hhciAqc2FkZHIgPSBwYWRkcl9ueiAoYWRkcik7CS8qIHByaW50YWJsZSBhZGRyZXNzIHN0cmluZyAqLworCisgIGlmIChyZXJyZmxnID09IDApCQkvKiBubyBlcnJvciAqLworICAgIHJldHVybiAwOworCisgIC8qIFdhcm5pbmdzIGNhbiBiZSBPUmVkIHRvZ2V0aGVyLCBzbyBjaGVjayB0aGVtIGFsbC4gICovCisgIGlmIChyZXJyZmxnICYgV19XQVJOKQorICAgIHsKKyAgICAgIGlmIChtb25pdG9yX3dhcm5pbmdzKQorCXsKKwkgIGludCBmb3VuZCA9IDA7CisJICBmb3IgKGVyciA9IGxzaV93YXJuaW5nX3RhYmxlOyBlcnItPmNvZGUgIT0gMDsgZXJyKyspCisJICAgIHsKKwkgICAgICBpZiAoKGVyci0+Y29kZSAmIHJlcnJmbGcpID09IGVyci0+Y29kZSkKKwkJeworCQkgIGZvdW5kID0gMTsKKwkJICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsCisJCQkJICAgICAgImNvbW1vbl9icmVha3BvaW50ICgweCVzKTogV2FybmluZzogJXNcbiIsCisJCQkJICAgICAgc2FkZHIsCisJCQkJICAgICAgZXJyLT5zdHJpbmcpOworCQl9CisJICAgIH0KKwkgIGlmICghZm91bmQpCisJICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKwkJCQkiY29tbW9uX2JyZWFrcG9pbnQgKDB4JXMpOiBVbmtub3duIHdhcm5pbmc6IDB4JXhcbiIsCisJCQkJc2FkZHIsCisJCQkJcmVycmZsZyk7CisJfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIEVycm9ycyBhcmUgdW5pcXVlLCBpLmUuIGNhbid0IGJlIE9SZWQgdG9nZXRoZXIuICAqLworICBmb3IgKGVyciA9IGxzaV9lcnJvcl90YWJsZTsgZXJyLT5jb2RlICE9IDA7IGVycisrKQorICAgIHsKKyAgICAgIGlmICgoZXJyLT5jb2RlICYgcmVycmZsZykgPT0gZXJyLT5jb2RlKQorCXsKKwkgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKwkJCSAgICAgICJjb21tb25fYnJlYWtwb2ludCAoMHglcyk6IEVycm9yOiAlc1xuIiwKKwkJCSAgICAgIHNhZGRyLAorCQkJICAgICAgZXJyLT5zdHJpbmcpOworCSAgcmV0dXJuIDE7CisJfQorICAgIH0KKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLAorCQkgICAgICAiY29tbW9uX2JyZWFrcG9pbnQgKDB4JXMpOiBVbmtub3duIGVycm9yOiAweCV4XG4iLAorCQkgICAgICBzYWRkciwKKwkJICAgICAgcmVycmZsZyk7CisgIHJldHVybiAxOworfQorCisKKy8qIFRoaXMgcm91dGluZSBzZW5kcyBhIGJyZWFrcG9pbnQgY29tbWFuZCB0byB0aGUgcmVtb3RlIHRhcmdldC4KKworICAgPFNFVD4gaXMgMSBpZiBzZXR0aW5nIGEgYnJlYWtwb2ludCwgb3IgMCBpZiBjbGVhcmluZyBhIGJyZWFrcG9pbnQuCisgICA8QUREUj4gaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGJyZWFrcG9pbnQuCisgICA8TEVOPiB0aGUgbGVuZ3RoIG9mIHRoZSByZWdpb24gdG8gYnJlYWsgb24uCisgICA8VFlQRT4gaXMgdGhlIHR5cGUgb2YgYnJlYWtwb2ludDoKKyAgICAgMCA9IHdyaXRlCQkJKEJSRUFLX1dSSVRFKQorICAgICAxID0gcmVhZAkJCShCUkVBS19SRUFEKQorICAgICAyID0gcmVhZC93cml0ZQkJKEJSRUFLX0FDQ0VTUykKKyAgICAgMyA9IGluc3RydWN0aW9uIGZldGNoCShCUkVBS19GRVRDSCkKKworICAgUmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bDsgb3RoZXJ3aXNlIDEuICAqLworCitzdGF0aWMgaW50Citjb21tb25fYnJlYWtwb2ludCAoc2V0LCBhZGRyLCBsZW4sIHR5cGUpCisgICAgIGludCBzZXQ7CisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBpbnQgbGVuOworICAgICBlbnVtIGJyZWFrX3R5cGUgdHlwZTsKK3sKKyAgY2hhciBidWZbREFUQV9NQVhMRU4gKyAxXTsKKyAgY2hhciBjbWQsIHJjbWQ7CisgIGludCBycGlkLCByZXJyZmxnLCBycmVzcG9uc2UsIHJsZW47CisgIGludCBuZmllbGRzOworCisgIGFkZHIgPSBBRERSX0JJVFNfUkVNT1ZFIChhZGRyKTsKKworICBpZiAobWlwc19tb25pdG9yID09IE1PTl9MU0kpCisgICAgeworICAgICAgaWYgKHNldCA9PSAwKQkvKiBjbGVhciBicmVha3BvaW50ICovCisJeworCSAgLyogVGhlIExTSSBQTU9OICJjbGVhciBicmVha3BvaW50IiBoYXMgdGhpcyBmb3JtOgorCSAgICAgICA8cGlkPiAnYicgPGJwdG4+IDB4MAorCSAgICAgICByZXBseToKKwkgICAgICAgPHBpZD4gJ2InIDB4MCA8Y29kZT4KKworCSAgICAgPGJwdG4+IGlzIGEgYnJlYWtwb2ludCBudW1iZXIgcmV0dXJuZWQgYnkgYW4gZWFybGllciAnQicgY29tbWFuZC4KKwkgICAgIFBvc3NpYmxlIHJldHVybiBjb2RlczogT0ssIEVfQlBULiAgKi8KKworCSAgaW50IGk7CisKKwkgIC8qIFNlYXJjaCBmb3IgdGhlIGJyZWFrcG9pbnQgaW4gdGhlIHRhYmxlLiAgKi8KKwkgIGZvciAoaSA9IDA7IGkgPCBNQVhfTFNJX0JSRUFLUE9JTlRTOyBpKyspCisJICAgIGlmIChsc2lfYnJlYWtwb2ludHNbaV0udHlwZSA9PSB0eXBlCisJCSYmIGxzaV9icmVha3BvaW50c1tpXS5hZGRyID09IGFkZHIKKwkJJiYgbHNpX2JyZWFrcG9pbnRzW2ldLmxlbiA9PSBsZW4pCisJICAgICAgYnJlYWs7CisKKwkgIC8qIENsZWFyIHRoZSB0YWJsZSBlbnRyeSBhbmQgdGVsbCBQTU9OIHRvIGNsZWFyIHRoZSBicmVha3BvaW50LiAgKi8KKwkgIGlmIChpID09IE1BWF9MU0lfQlJFQUtQT0lOVFMpCisJICAgIHsKKwkgICAgICB3YXJuaW5nICgiY29tbW9uX2JyZWFrcG9pbnQ6IEF0dGVtcHQgdG8gY2xlYXIgYm9ndXMgYnJlYWtwb2ludCBhdCAlc1xuIiwKKwkJICAgICAgIHBhZGRyX256IChhZGRyKSk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIH0KKworCSAgbHNpX2JyZWFrcG9pbnRzW2ldLnR5cGUgPSBCUkVBS19VTlVTRUQ7CisJICBzcHJpbnRmIChidWYsICIweDAgYiAweCV4IDB4MCIsIGkpOworCSAgbWlwc19zZW5kX3BhY2tldCAoYnVmLCAxKTsKKworCSAgcmxlbiA9IG1pcHNfcmVjZWl2ZV9wYWNrZXQgKGJ1ZiwgMSwgbWlwc19yZWNlaXZlX3dhaXQpOworCSAgYnVmW3JsZW5dID0gJ1wwJzsKKworCSAgbmZpZWxkcyA9IHNzY2FuZiAoYnVmLCAiMHgleCBiIDB4MCAweCV4IiwgJnJwaWQsICZyZXJyZmxnKTsKKwkgIGlmIChuZmllbGRzICE9IDIpCisJICAgIG1pcHNfZXJyb3IgKCJjb21tb25fYnJlYWtwb2ludDogQmFkIHJlc3BvbnNlIGZyb20gcmVtb3RlIGJvYXJkOiAlcyIsIGJ1Zik7CisKKwkgIHJldHVybiAoY2hlY2tfbHNpX2Vycm9yIChhZGRyLCByZXJyZmxnKSk7CisJfQorICAgICAgZWxzZQkvKiBzZXQgYSBicmVha3BvaW50ICovCisJeworCSAgLyogVGhlIExTSSBQTU9OICJzZXQgYnJlYWtwb2ludCIgY29tbWFuZCBoYXMgdGhpcyBmb3JtOgorCSAgICAgICA8cGlkPiAnQicgPGFkZHI+IDB4MAorCSAgICAgICByZXBseToKKwkgICAgICAgPHBpZD4gJ0InIDxicHRuPiA8Y29kZT4KKworCSAgICAgVGhlICJzZXQgZGF0YSBicmVha3BvaW50IiBjb21tYW5kIGhhcyB0aGlzIGZvcm06CisKKwkgICAgICAgIDxwaWQ+ICdBJyA8YWRkcjE+IDx0eXBlPiBbPGFkZHIyPiAgWzx2YWx1ZT5dXQorCisJCXdoZXJlOiB0eXBlPSAiMHgxIiA9IHJlYWQKKwkgICAgICAgICAgICAgIjB4MiIgPSB3cml0ZQorCSAgICAgICAgICAgICAiMHgzIiA9IGFjY2VzcyAocmVhZCBvciB3cml0ZSkKKworCSAgICAgVGhlIHJlcGx5IHJldHVybnMgdHdvIHZhbHVlczoKKwkJICAgICBicHRuIC0gYSBicmVha3BvaW50IG51bWJlciwgd2hpY2ggaXMgYSBzbWFsbCBpbnRlZ2VyIHdpdGgKKwkJCSAgICBwb3NzaWJsZSB2YWx1ZXMgb2YgemVybyB0aHJvdWdoIDI1NS4KKwkJICAgICBjb2RlIC0gYW4gZXJyb3IgcmV0dXJuIGNvZGUsIGEgdmFsdWUgb2YgemVybyBpbmRpY2F0ZXMgYQorCQkJICAgIHN1Y2Nlc2Z1bCBjb21wbGV0aW9uLCBvdGhlciB2YWx1ZXMgaW5kaWNhdGUgdmFyaW91cworCQkJICAgIGVycm9ycyBhbmQgd2FybmluZ3MuCisJICAgICAgCisJICAgICBQb3NzaWJsZSByZXR1cm4gY29kZXM6IE9LLCBXX1FBTCwgRV9RQUwsIEVfT1VULCBFX05PTi4gIAorCisJICAqLworCisJICBpZiAodHlwZSA9PSBCUkVBS19GRVRDSCkJLyogaW5zdHJ1Y3Rpb24gYnJlYWtwb2ludCAqLworCSAgICB7CisJICAgICAgY21kID0gJ0InOworCSAgICAgIHNwcmludGYgKGJ1ZiwgIjB4MCBCIDB4JXMgMHgwIiwgcGFkZHJfbnogKGFkZHIpKTsKKwkgICAgfQorCSAgZWxzZQkJCQkvKiB3YXRjaHBvaW50ICovCisJICAgIHsKKwkgICAgICBjbWQgPSAnQSc7CisJICAgICAgc3ByaW50ZiAoYnVmLCAiMHgwIEEgMHglcyAweCV4IDB4JXMiLCBwYWRkcl9ueiAoYWRkciksCisJCSAgICAgICB0eXBlID09IEJSRUFLX1JFQUQgPyAxIDogKHR5cGUgPT0gQlJFQUtfV1JJVEUgPyAyIDogMyksCisJCSAgICAgICBwYWRkcl9ueiAoYWRkciArIGxlbiAtIDEpKTsKKwkgICAgfQorCSAgbWlwc19zZW5kX3BhY2tldCAoYnVmLCAxKTsKKworCSAgcmxlbiA9IG1pcHNfcmVjZWl2ZV9wYWNrZXQgKGJ1ZiwgMSwgbWlwc19yZWNlaXZlX3dhaXQpOworCSAgYnVmW3JsZW5dID0gJ1wwJzsKKworCSAgbmZpZWxkcyA9IHNzY2FuZiAoYnVmLCAiMHgleCAlYyAweCV4IDB4JXgiLAorCQkJICAgICZycGlkLCAmcmNtZCwgJnJyZXNwb25zZSwgJnJlcnJmbGcpOworCSAgaWYgKG5maWVsZHMgIT0gNCB8fCByY21kICE9IGNtZCB8fCBycmVzcG9uc2UgPiAyNTUpCisJICAgIG1pcHNfZXJyb3IgKCJjb21tb25fYnJlYWtwb2ludDogQmFkIHJlc3BvbnNlIGZyb20gcmVtb3RlIGJvYXJkOiAlcyIsIGJ1Zik7CisKKwkgIGlmIChyZXJyZmxnICE9IDApCisJICAgIGlmIChjaGVja19sc2lfZXJyb3IgKGFkZHIsIHJlcnJmbGcpKQorCSAgICAgIHJldHVybiAxOworCisJICAvKiBycmVzcG9uc2UgY29udGFpbnMgUE1PTidzIGJyZWFrcG9pbnQgbnVtYmVyLiAgUmVjb3JkIHRoZQorCSAgICAgaW5mb3JtYXRpb24gZm9yIHRoaXMgYnJlYWtwb2ludCBzbyB3ZSBjYW4gY2xlYXIgaXQgbGF0ZXIuICAqLworCSAgbHNpX2JyZWFrcG9pbnRzW3JyZXNwb25zZV0udHlwZSA9IHR5cGU7CisJICBsc2lfYnJlYWtwb2ludHNbcnJlc3BvbnNlXS5hZGRyID0gYWRkcjsKKwkgIGxzaV9icmVha3BvaW50c1tycmVzcG9uc2VdLmxlbiA9ICBsZW47CisKKwkgIHJldHVybiAwOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBPbiBub24tTFNJIHRhcmdldHMsIHRoZSBicmVha3BvaW50IGNvbW1hbmQgaGFzIHRoaXMgZm9ybToKKwkgICAweDAgPENNRD4gPEFERFI+IDxNQVNLPiA8RkxBR1M+CisJIDxNQVNLPiBpcyBhIGRvbid0IGNhcmUgbWFzayBmb3IgYWRkcmVzc2VzLgorCSA8RkxBR1M+IGlzIGFueSBjb21iaW5hdGlvbiBvZiBgcicsIGB3Jywgb3IgYGYnIGZvciByZWFkL3dyaXRlL2ZldGNoLgorICAgICAgICovCisgICAgICB1bnNpZ25lZCBsb25nIG1hc2s7CisKKyAgICAgIG1hc2sgPSBjYWxjdWxhdGVfbWFzayAoYWRkciwgbGVuKTsKKyAgICAgIGFkZHIgJj0gfm1hc2s7CisKKyAgICAgIGlmIChzZXQpCQkvKiBzZXQgYSBicmVha3BvaW50ICovCisgICAgICAgIHsKKwkgIGNoYXIgKmZsYWdzOworCSAgc3dpdGNoICh0eXBlKQorCSAgICB7CisJICAgIGNhc2UgQlJFQUtfV1JJVEU6CQkvKiB3cml0ZSAqLworCSAgICAgIGZsYWdzID0gInciOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEJSRUFLX1JFQUQ6CQkvKiByZWFkICovCisJICAgICAgZmxhZ3MgPSAiciI7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQlJFQUtfQUNDRVNTOgkJLyogcmVhZC93cml0ZSAqLworCSAgICAgIGZsYWdzID0gInJ3IjsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBCUkVBS19GRVRDSDoJCS8qIGZldGNoICovCisJICAgICAgZmxhZ3MgPSAiZiI7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKworCSAgY21kID0gJ0InOworCSAgc3ByaW50ZiAoYnVmLCAiMHgwIEIgMHglcyAweCVzICVzIiwgcGFkZHJfbnogKGFkZHIpLAorCQkgICBwYWRkcl9ueiAobWFzayksIGZsYWdzKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgY21kID0gJ2InOworCSAgc3ByaW50ZiAoYnVmLCAiMHgwIGIgMHglcyIsIHBhZGRyX256IChhZGRyKSk7CisJfQorCisgICAgICBtaXBzX3NlbmRfcGFja2V0IChidWYsIDEpOworCisgICAgICBybGVuID0gbWlwc19yZWNlaXZlX3BhY2tldCAoYnVmLCAxLCBtaXBzX3JlY2VpdmVfd2FpdCk7CisgICAgICBidWZbcmxlbl0gPSAnXDAnOworCisgICAgICBuZmllbGRzID0gc3NjYW5mIChidWYsICIweCV4ICVjIDB4JXggMHgleCIsCisJCQkmcnBpZCwgJnJjbWQsICZyZXJyZmxnLCAmcnJlc3BvbnNlKTsKKworICAgICAgaWYgKG5maWVsZHMgIT0gNCB8fCByY21kICE9IGNtZCkKKwltaXBzX2Vycm9yICgiY29tbW9uX2JyZWFrcG9pbnQ6IEJhZCByZXNwb25zZSBmcm9tIHJlbW90ZSBib2FyZDogJXMiLAorCQkgICAgYnVmKTsKKworICAgICAgaWYgKHJlcnJmbGcgIT0gMCkKKwl7CisJICAvKiBEZGIgcmV0dXJucyAiMHgwIGIgMHgxNiAweDBcMDAwIiwgd2hlcmVhcworCSAgICAgQ29nZW50IHJldHVybnMgIjB4MCBiIDB4ZmZmZmZmZmYgMHgxNlwwMDAiOiAqLworCSAgaWYgKG1pcHNfbW9uaXRvciA9PSBNT05fRERCKQorCSAgICBycmVzcG9uc2UgPSByZXJyZmxnOworCSAgaWYgKHJyZXNwb25zZSAhPSAyMikgLyogaW52YWxpZCBhcmd1bWVudCAqLworCSAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsCisJCQkJImNvbW1vbl9icmVha3BvaW50ICgweCVzKTogIEdvdCBlcnJvcjogMHgleFxuIiwKKwkJCQlwYWRkcl9ueiAoYWRkciksIHJyZXNwb25zZSk7CisJICByZXR1cm4gMTsKKwl9CisgICAgfQorICByZXR1cm4gMDsKK30KKwwKK3N0YXRpYyB2b2lkCitzZW5kX3NyZWMgKHNyZWMsIGxlbiwgYWRkcikKKyAgICAgY2hhciAqc3JlYzsKKyAgICAgaW50IGxlbjsKKyAgICAgQ09SRV9BRERSIGFkZHI7Cit7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGludCBjaDsKKworICAgICAgU0VSSUFMX1dSSVRFIChtaXBzX2Rlc2MsIHNyZWMsIGxlbik7CisKKyAgICAgIGNoID0gbWlwc19yZWFkY2hhciAoMik7CisKKyAgICAgIHN3aXRjaCAoY2gpCisJeworCWNhc2UgU0VSSUFMX1RJTUVPVVQ6CisJICBlcnJvciAoIlRpbWVvdXQgZHVyaW5nIGRvd25sb2FkLiIpOworCSAgYnJlYWs7CisJY2FzZSAweDY6CQkvKiBBQ0sgKi8KKwkgIHJldHVybjsKKwljYXNlIDB4MTU6CQkvKiBOQUNLICovCisJICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJEb3dubG9hZCBnb3QgYSBOQUNLIGF0IGJ5dGUgJWQhICBSZXRyeWluZy5cbiIsIGFkZHIpOworCSAgY29udGludWU7CisJZGVmYXVsdDoKKwkgIGVycm9yICgiRG93bmxvYWQgZ290IHVuZXhwZWN0ZWQgYWNrIGNoYXI6IDB4JXgsIHJldHJ5aW5nLlxuIiwgY2gpOworCX0KKyAgICB9Cit9CisKKy8qICBEb3dubG9hZCBhIGJpbmFyeSBmaWxlIGJ5IGNvbnZlcnRpbmcgaXQgdG8gUyByZWNvcmRzLiAqLworCitzdGF0aWMgdm9pZAorbWlwc19sb2FkX3NyZWMgKGFyZ3MpCisgICAgIGNoYXIgKmFyZ3M7Cit7CisgIGJmZCAqYWJmZDsKKyAgYXNlY3Rpb24gKnM7CisgIGNoYXIgKmJ1ZmZlciwgc3JlY1sxMDI0XTsKKyAgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVkIGludCBzcmVjX2ZyYW1lID0gMjAwOworICBpbnQgcmVjbGVuOworICBzdGF0aWMgaW50IGhhc2htYXJrID0gMTsKKworICBidWZmZXIgPSBhbGxvY2EgKHNyZWNfZnJhbWUgKiAyICsgMjU2KTsKKworICBhYmZkID0gYmZkX29wZW5yIChhcmdzLCAwKTsKKyAgaWYgKCFhYmZkKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlVuYWJsZSB0byBvcGVuIGZpbGUgJXNcbiIsIGFyZ3MpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkgPT0gMCkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJGaWxlIGlzIG5vdCBhbiBvYmplY3QgZmlsZVxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisvKiBUaGlzIGFjdHVhbGx5IGNhdXNlcyBhIGRvd25sb2FkIGluIHRoZSBJRFQgYmluYXJ5IGZvcm1hdDogKi8KKyAgbWlwc19zZW5kX2NvbW1hbmQgKExPQURfQ01ELCAwKTsKKworICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCisgICAgeworICAgICAgaWYgKHMtPmZsYWdzICYgU0VDX0xPQUQpCisJeworCSAgdW5zaWduZWQgaW50IG51bWJ5dGVzOworCisJICAvKiBGSVhNRSEgIHZtYSB0b28gc21hbGw/PyAqLworCSAgcHJpbnRmX2ZpbHRlcmVkICgiJXNcdDogMHglNHggLi4gMHglNHggICIsIHMtPm5hbWUsIHMtPnZtYSwKKwkJCSAgIHMtPnZtYSArIHMtPl9yYXdfc2l6ZSk7CisJICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCisJICBmb3IgKGkgPSAwOyBpIDwgcy0+X3Jhd19zaXplOyBpICs9IG51bWJ5dGVzKQorCSAgICB7CisJICAgICAgbnVtYnl0ZXMgPSBtaW4gKHNyZWNfZnJhbWUsIHMtPl9yYXdfc2l6ZSAtIGkpOworCisJICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzLCBidWZmZXIsIGksIG51bWJ5dGVzKTsKKworCSAgICAgIHJlY2xlbiA9IG1pcHNfbWFrZV9zcmVjIChzcmVjLCAnMycsIHMtPnZtYSArIGksIGJ1ZmZlciwgbnVtYnl0ZXMpOworCSAgICAgIHNlbmRfc3JlYyAoc3JlYywgcmVjbGVuLCBzLT52bWEgKyBpKTsKKworCSAgICAgIGlmIChoYXNobWFyaykKKwkJeworCQkgIHB1dGNoYXJfdW5maWx0ZXJlZCAoJyMnKTsKKwkJICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCQl9CisKKwkgICAgfSAvKiBQZXItcGFja2V0IChvciBTLXJlY29yZCkgbG9vcCAqLworCSAgCisJICBwdXRjaGFyX3VuZmlsdGVyZWQgKCdcbicpOworCX0gLyogTG9hZGFibGUgc2VjdGlvbnMgKi8KKyAgICB9CisgIGlmIChoYXNobWFyaykgCisgICAgcHV0Y2hhcl91bmZpbHRlcmVkICgnXG4nKTsKKyAgCisgIC8qIFdyaXRlIGEgdHlwZSA3IHRlcm1pbmF0b3IgcmVjb3JkLiBubyBkYXRhIGZvciBhIHR5cGUgNywgYW5kIHRoZXJlCisgICAgIGlzIG5vIGRhdGEsIHNvIGxlbiBpcyAwLiAgKi8KKworICByZWNsZW4gPSBtaXBzX21ha2Vfc3JlYyAoc3JlYywgJzcnLCBhYmZkLT5zdGFydF9hZGRyZXNzLCBOVUxMLCAwKTsKKworICBzZW5kX3NyZWMgKHNyZWMsIHJlY2xlbiwgYWJmZC0+c3RhcnRfYWRkcmVzcyk7CisKKyAgU0VSSUFMX0ZMVVNIX0lOUFVUIChtaXBzX2Rlc2MpOworfQorCisvKgorICogbWlwc19tYWtlX3NyZWMgLS0gbWFrZSBhbiBzcmVjb3JkLiBUaGlzIHdyaXRlcyBlYWNoIGxpbmUsIG9uZSBhdCBhCisgKgl0aW1lLCBlYWNoIHdpdGggaXQncyBvd24gaGVhZGVyIGFuZCB0cmFpbGVyIGxpbmUuCisgKglBbiBzcmVjb3JkIGxvb2tzIGxpa2UgdGhpczoKKyAqCisgKiBieXRlIGNvdW50LSsgICAgIGFkZHJlc3MKKyAqIHN0YXJ0IC0tLSsgfCAgICAgICAgfCAgICAgICBkYXRhICAgICAgICArLSBjaGVja3N1bQorICoJICAgIHwgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8CisgKgkgIFMwMTAwMDAwNkY2QjY5MkQ3NDY1NzM3NDJFNzM3MjY1NjNFNAorICoJICBTMzE1MDAwNDQ4NjAwMDAwMDAwMDAwMDAwMDAwRkMwMDAwNTkwMDAwMDAwMEU5CisgKgkgIFMzMUEwMDA0MDAwMDIzQzE0MDAwMzdERTAwRjAyMzYwNDAwMDM3N0IwMDkwMjA4MjUwMDAzNDhECisgKgkgIFMzMEIwMDA0NDg1QTAwMDAwMDAwMDAwMDRFCisgKgkgIFM3MDUwMDA0MDAwMEY2CisgKgorICoJUzx0eXBlPjxsZW5ndGg+PGFkZHJlc3M+PGRhdGE+PGNoZWNrc3VtPgorICoKKyAqICAgICAgV2hlcmUKKyAqICAgICAgLSBsZW5ndGgKKyAqICAgICAgICBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZvbGxvd2luZyB1cHRvIHRoZSBjaGVja3N1bS4gTm90ZSB0aGF0CisgKiAgICAgICAgdGhpcyBpcyBub3QgdGhlIG51bWJlciBvZiBjaGFycyBmb2xsb3dpbmcsIHNpbmNlIGl0IHRha2VzIHR3bworICogICAgICAgIGNoYXJzIHRvIHJlcHJlc2VudCBhIGJ5dGUuCisgKiAgICAgIC0gdHlwZQorICogICAgICAgIGlzIG9uZSBvZjoKKyAqICAgICAgICAwKSBoZWFkZXIgcmVjb3JkCisgKiAgICAgICAgMSkgdHdvIGJ5dGUgYWRkcmVzcyBkYXRhIHJlY29yZAorICogICAgICAgIDIpIHRocmVlIGJ5dGUgYWRkcmVzcyBkYXRhIHJlY29yZAorICogICAgICAgIDMpIGZvdXIgYnl0ZSBhZGRyZXNzIGRhdGEgcmVjb3JkCisgKiAgICAgICAgNykgZm91ciBieXRlIGFkZHJlc3MgdGVybWluYXRpb24gcmVjb3JkCisgKiAgICAgICAgOCkgdGhyZWUgYnl0ZSBhZGRyZXNzIHRlcm1pbmF0aW9uIHJlY29yZAorICogICAgICAgIDkpIHR3byBieXRlIGFkZHJlc3MgdGVybWluYXRpb24gcmVjb3JkCisgKiAgICAgICAKKyAqICAgICAgLSBhZGRyZXNzCisgKiAgICAgICAgaXMgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGRhdGEgZm9sbG93aW5nLCBvciBpbiB0aGUgY2FzZSBvZgorICogICAgICAgIGEgdGVybWluYXRpb24gcmVjb3JkLCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgaW1hZ2UKKyAqICAgICAgLSBkYXRhCisgKiAgICAgICAgaXMgdGhlIGRhdGEuCisgKiAgICAgIC0gY2hlY2tzdW0KKyAqCSAgaXMgdGhlIHN1bSBvZiBhbGwgdGhlIHJhdyBieXRlIGRhdGEgaW4gdGhlIHJlY29yZCwgZnJvbSB0aGUgbGVuZ3RoCisgKiAgICAgICAgdXB3YXJkcywgbW9kdWxvIDI1NiBhbmQgc3VidHJhY3RlZCBmcm9tIDI1NS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBTLXJlY29yZC4KKyAqCisgKi8KKworc3RhdGljIGludAorbWlwc19tYWtlX3NyZWMgKGJ1ZiwgdHlwZSwgbWVtYWRkciwgbXlhZGRyLCBsZW4pCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgaW50IHR5cGU7CisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICB1bnNpZ25lZCBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47Cit7CisgIHVuc2lnbmVkIGNoYXIgY2hlY2tzdW07CisgIGludCBpOworCisgIC8qIENyZWF0ZSB0aGUgaGVhZGVyIGZvciB0aGUgc3JlYy4gYWRkcl9zaXplIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGFkZHJlc3MsCisgICAgIGFuZCAxIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGNvdW50LiAgKi8KKworICAvKiBGSVhNRSEhIGJpZ2dlciBidWYgcmVxdWlyZWQgZm9yIDY0LWJpdCEgKi8KKyAgYnVmWzBdID0gJ1MnOworICBidWZbMV0gPSB0eXBlOworICBidWZbMl0gPSBsZW4gKyA0ICsgMTsJCS8qIGxlbiArIDQgYnl0ZSBhZGRyZXNzICsgMSBieXRlIGNoZWNrc3VtICovCisgIC8qIFRoaXMgYXNzdW1lcyBTMyBzdHlsZSBkb3dubG9hZHMgKDRieXRlIGFkZHJlc3NlcykuIFRoZXJlIHNob3VsZAorICAgICBwcm9iYWJseSBiZSBhIGNoZWNrLCBvciB0aGUgY29kZSBjaGFuZ2VkIHRvIG1ha2UgaXQgbW9yZQorICAgICBleHBsaWNpdC4gKi8KKyAgYnVmWzNdID0gbWVtYWRkciA+PiAyNDsKKyAgYnVmWzRdID0gbWVtYWRkciA+PiAxNjsKKyAgYnVmWzVdID0gbWVtYWRkciA+PiA4OworICBidWZbNl0gPSBtZW1hZGRyOworICBtZW1jcHkgKCZidWZbN10sIG15YWRkciwgbGVuKTsKKworICAvKiBOb3RlIHRoYXQgdGhlIGNoZWNrc3VtIGlzIGNhbGN1bGF0ZWQgb24gdGhlIHJhdyBkYXRhLCBub3QgdGhlCisgICAgIGhleGlmaWVkIGRhdGEuICBJdCBpbmNsdWRlcyB0aGUgbGVuZ3RoLCBhZGRyZXNzIGFuZCB0aGUgZGF0YQorICAgICBwb3J0aW9ucyBvZiB0aGUgcGFja2V0LiAgKi8KKyAgY2hlY2tzdW0gPSAwOworICBidWYgKz0gMjsJCQkvKiBQb2ludCBhdCBsZW5ndGggYnl0ZSAqLworICBmb3IgKGkgPSAwOyBpIDwgbGVuICsgNCArIDE7IGkrKykKKyAgICBjaGVja3N1bSArPSAqYnVmKys7CisKKyAgKmJ1ZiA9IH5jaGVja3N1bTsKKworICByZXR1cm4gbGVuICsgODsKK30KKworLyogVGhlIGZvbGxvd2luZyBtYW5pZmVzdCBjb250cm9scyB3aGV0aGVyIHdlIGVuYWJsZSB0aGUgc2ltcGxlIGZsb3cKKyAgIGNvbnRyb2wgc3VwcG9ydCBwcm92aWRlZCBieSB0aGUgbW9uaXRvci4gSWYgZW5hYmxlZCB0aGUgY29kZSB3aWxsCisgICB3YWl0IGZvciBhbiBhZmZpcm1hdGl2ZSBBQ0sgYmV0d2VlbiB0cmFuc21pdHRpbmcgcGFja2V0cy4gKi8KKyNkZWZpbmUgRE9FVFhBQ0sgKDEpCisKKy8qIFRoZSBQTU9OIGZhc3QtZG93bmxvYWQgdXNlcyBhbiBlbmNvZGVkIHBhY2tldCBmb3JtYXQgY29uc3RydWN0ZWQgb2YKKyAgIDNieXRlIGRhdGEgcGFja2V0cyAoZW5jb2RlZCBhcyA0IHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXJzKSwgYW5kCisgICBlc2NhcGUgc2VxdWVuY2VzIChwcmVjZWRlZCBieSBhICcvJyk6CisKKwknSycgICAgIGNsZWFyIGNoZWNrc3VtCisJJ0MnICAgICBjb21wYXJlIGNoZWNrc3VtICgxMmJpdCB2YWx1ZSwgbm90IGluY2x1ZGVkIGluIGNoZWNrc3VtIGNhbGN1bGF0aW9uKQorCSdTJyAgICAgZGVmaW5lIHN5bWJvbCBuYW1lIChmb3IgYWRkcikgdGVybWluYXRlZCB3aXRoICIsIiBhbmQgcGFkZGVkIHRvIDRjaGFyIGJvdW5kYXJ5CisJJ1onICAgICB6ZXJvIGZpbGwgbXVsdGlwbGUgb2YgM2J5dGVzCisJJ0InICAgICBieXRlICgxMmJpdCBlbmNvZGVkIHZhbHVlLCBvZiA4Yml0IGRhdGEpCisJJ0EnICAgICBhZGRyZXNzICgzNmJpdCBlbmNvZGVkIHZhbHVlKQorCSdFJyAgICAgZGVmaW5lIGVudHJ5IGFzIG9yaWdpbmFsIGFkZHJlc3MsIGFuZCBleGl0IGxvYWQKKworICAgVGhlIHBhY2tldHMgYXJlIHByb2Nlc3NlZCBpbiA0IGNoYXJhY3RlciBjaHVua3MsIHNvIHRoZSBlc2NhcGUKKyAgIHNlcXVlbmNlcyB0aGF0IGRvIG5vdCBoYXZlIGFueSBkYXRhIChvciB2YXJpYWJsZSBsZW5ndGggZGF0YSkKKyAgIHNob3VsZCBiZSBwYWRkZWQgdG8gYSA0IGNoYXJhY3RlciBib3VuZGFyeS4gIFRoZSBkZWNvZGVyIHdpbGwgZ2l2ZQorICAgYW4gZXJyb3IgaWYgdGhlIGNvbXBsZXRlIG1lc3NhZ2UgYmxvY2sgc2l6ZSBpcyBub3QgYSBtdWx0aXBsZSBvZgorICAgNGJ5dGVzIChzaXplIG9mIHJlY29yZCkuCisKKyAgIFRoZSBlbmNvZGluZyBvZiBudW1iZXJzIGlzIGRvbmUgaW4gNmJpdCBmaWVsZHMuICBUaGUgNmJpdCB2YWx1ZSBpcworICAgdXNlZCB0byBpbmRleCBpbnRvIHRoaXMgc3RyaW5nIHRvIGdldCB0aGUgc3BlY2lmaWMgY2hhcmFjdGVyCisgICBlbmNvZGluZyBmb3IgdGhlIHZhbHVlOiAqLworc3RhdGljIGNoYXIgZW5jb2RpbmdbXSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSwuIjsKKworLyogQ29udmVydCB0aGUgbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgaW50byBhbiBlbmNvZGVkIG51bWJlciwgNmJpdHMKKyAgIGF0IGEgdGltZSAocmFuZ2UgMC4uNjMpLiAgS2VlcCBhIGNoZWNrc3VtIGlmIHJlcXVpcmVkIChwYXNzZWQKKyAgIHBvaW50ZXIgbm9uLU5VTEwpLiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVuY29kZWQKKyAgIGNoYXJhY3RlcnMgd3JpdHRlbiBpbnRvIHRoZSBidWZmZXIuICovCitzdGF0aWMgaW50CitwbW9uX21ha2ViNjQgKHYsIHAsIG4sIGNoa3N1bSkKKyAgICAgdW5zaWduZWQgbG9uZyB2OworICAgICBjaGFyICpwOworICAgICBpbnQgbjsKKyAgICAgaW50ICpjaGtzdW07Cit7CisgIGludCBjb3VudCA9IChuIC8gNik7CisKKyAgaWYgKChuICUgMTIpICE9IDApIHsKKyAgICBmcHJpbnRmX3VuZmlsdGVyZWQoZ2RiX3N0ZGVyciwKKwkJICAgICAgICJGYXN0IGVuY29kaW5nIGJpdGNvdW50IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxMmJpdHM6ICVkYml0JXNcbiIsbiwobiA9PSAxKT8iIjoicyIpOworICAgIHJldHVybigwKTsKKyAgfQorICBpZiAobiA+IDM2KSB7CisgICAgZnByaW50Zl91bmZpbHRlcmVkKGdkYl9zdGRlcnIsCisJCSAgICAgICAiRmFzdCBlbmNvZGluZyBjYW5ub3QgcHJvY2VzcyBtb3JlIHRoYW4gMzZiaXRzIGF0IHRoZSBtb21lbnQ6ICVkYml0c1xuIixuKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKworICAvKiBEZWFsIHdpdGggdGhlIGNoZWNrc3VtOiAqLworICBpZiAoY2hrc3VtICE9IE5VTEwpIHsKKyAgICBzd2l0Y2ggKG4pIHsKKyAgICAgY2FzZSAzNjogKmNoa3N1bSArPSAoKHYgPj4gMjQpICYgMHhGRkYpOworICAgICBjYXNlIDI0OiAqY2hrc3VtICs9ICgodiA+PiAxMikgJiAweEZGRik7CisgICAgIGNhc2UgMTI6ICpjaGtzdW0gKz0gKCh2ID4+ICAwKSAmIDB4RkZGKTsKKyAgICB9CisgIH0KKworICBkbyB7CisgICAgbiAtPSA2OworICAgICpwKysgPSBlbmNvZGluZ1sodiA+PiBuKSAmIDB4M0ZdOworICB9IHdoaWxlIChuID4gMCk7CisKKyAgcmV0dXJuKGNvdW50KTsKK30KKworLyogU2hvcnRoYW5kIGZ1bmN0aW9uICh0aGF0IGNvdWxkIGJlIGluLWxpbmVkKSB0byBvdXRwdXQgdGhlIHplcm8tZmlsbAorICAgZXNjYXBlIHNlcXVlbmNlIGludG8gdGhlIGRhdGEgc3RyZWFtLiAqLworc3RhdGljIGludAorcG1vbl96ZXJvc2V0IChyZWNzaXplLCBidWZmLCBhbW91bnQsIGNoa3N1bSkKKyAgICAgaW50IHJlY3NpemU7CisgICAgIGNoYXIgKipidWZmOworICAgICBpbnQgKmFtb3VudDsKKyAgICAgdW5zaWduZWQgaW50ICpjaGtzdW07Cit7CisgIGludCBjb3VudDsKKworICBzcHJpbnRmKCpidWZmLCIvWiIpOworICBjb3VudCA9IHBtb25fbWFrZWI2NCAoKmFtb3VudCwgKCpidWZmICsgMiksIDEyLCBjaGtzdW0pOworICAqYnVmZiArPSAoY291bnQgKyAyKTsKKyAgKmFtb3VudCA9IDA7CisgIHJldHVybihyZWNzaXplICsgY291bnQgKyAyKTsKK30KKworc3RhdGljIGludAorcG1vbl9jaGVja3NldCAocmVjc2l6ZSwgYnVmZiwgdmFsdWUpCisgICAgIGludCByZWNzaXplOworICAgICBjaGFyICoqYnVmZjsKKyAgICAgaW50ICp2YWx1ZTsKK3sKKyAgaW50IGNvdW50OworCisgIC8qIEFkZCB0aGUgY2hlY2tzdW0gKHdpdGhvdXQgdXBkYXRpbmcgdGhlIHZhbHVlKTogKi8KKyAgc3ByaW50ZiAoKmJ1ZmYsICIvQyIpOworICBjb3VudCA9IHBtb25fbWFrZWI2NCAoKnZhbHVlLCAoKmJ1ZmYgKyAyKSwgMTIsIE5VTEwpOworICAqYnVmZiArPSAoY291bnQgKyAyKTsKKyAgc3ByaW50ZiAoKmJ1ZmYsICJcbiIpOworICAqYnVmZiArPSAyOyAvKiBpbmNsdWRlIHplcm8gdGVybWluYXRvciAqLworICAvKiBGb3JjaW5nIGEgY2hlY2tzdW0gdmFsaWRhdGlvbiBjbGVhcnMgdGhlIHN1bTogKi8KKyAgKnZhbHVlID0gMDsKKyAgcmV0dXJuKHJlY3NpemUgKyBjb3VudCArIDMpOworfQorCisvKiBBbW91bnQgb2YgcGFkZGluZyB3ZSBsZWF2ZSBhZnRlciBhdCB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgYnVmZmVyLAorICAgZm9yIHRoZSBjaGVja3N1bSBhbmQgbGluZSB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXJzOiAqLworI2RlZmluZSBDSEVDS1NJWkUgKDQgKyA0ICsgNCArIDIpCisvKiB6ZXJvLWZpbGwsIGNoZWNrc3VtLCB0cmFuc2ZlciBlbmQgYW5kIGxpbmUgdGVybWluYXRpb24gc3BhY2UuICovCisKKy8qIFRoZSBhbW91bnQgb2YgYmluYXJ5IGRhdGEgbG9hZGVkIGZyb20gdGhlIG9iamVjdCBmaWxlIGluIGEgc2luZ2xlCisgICBvcGVyYXRpb246ICovCisjZGVmaW5lIEJJTkNIVU5LICgxMDI0KQorCisvKiBNYXhpbXVtIGxpbmUgb2YgZGF0YSBhY2NlcHRlZCBieSB0aGUgbW9uaXRvcjogKi8KKyNkZWZpbmUgTUFYUkVDU0laRSAoNTUwKQorLyogTk9URTogVGhpcyBjb25zdGFudCBkZXBlbmRzIG9uIHRoZSBtb25pdG9yIGJlaW5nIHVzZWQuIFRoaXMgdmFsdWUKKyAgIGlzIGZvciBQTU9OIDUueCBvbiB0aGUgQ29nZW50IFZyNDMwMCBib2FyZC4gKi8KKworc3RhdGljIHZvaWQKK3Btb25fbWFrZV9mYXN0cmVjIChvdXRidWYsIGluYnVmLCBpbnB0ciwgaW5hbW91bnQsIHJlY3NpemUsIGNzdW0sIHplcm9maWxsKQorICAgICBjaGFyICoqb3V0YnVmOworICAgICB1bnNpZ25lZCBjaGFyICppbmJ1ZjsKKyAgICAgaW50ICppbnB0cjsKKyAgICAgaW50IGluYW1vdW50OworICAgICBpbnQgKnJlY3NpemU7CisgICAgIHVuc2lnbmVkIGludCAqY3N1bTsKKyAgICAgdW5zaWduZWQgaW50ICp6ZXJvZmlsbDsKK3sKKyAgaW50IGNvdW50ID0gMDsKKyAgY2hhciAqcCA9ICpvdXRidWY7CisKKyAgLyogVGhpcyBpcyBhIHNpbXBsZSBjaGVjayB0byBlbnN1cmUgdGhhdCBvdXIgZGF0YSB3aWxsIGZpdCB3aXRoaW4KKyAgICAgdGhlIG1heGltdW0gYWxsb3dhYmxlIHJlY29yZCBzaXplLiBFYWNoIHJlY29yZCBvdXRwdXQgaXMgNGJ5dGVzCisgICAgIGluIGxlbmd0aC4gV2UgbXVzdCBhbGxvdyBzcGFjZSBmb3IgYSBwZW5kaW5nIHplcm8gZmlsbCBjb21tYW5kLAorICAgICB0aGUgcmVjb3JkLCBhbmQgYSBjaGVja3N1bSByZWNvcmQuICovCisgIHdoaWxlICgoKnJlY3NpemUgPCAoTUFYUkVDU0laRSAtIENIRUNLU0laRSkpICYmICgoaW5hbW91bnQgLSAqaW5wdHIpID4gMCkpIHsKKyAgICAvKiBQcm9jZXNzIHRoZSBiaW5hcnkgZGF0YTogKi8KKyAgICBpZiAoKGluYW1vdW50IC0gKmlucHRyKSA8IDMpIHsKKyAgICAgIGlmICgqemVyb2ZpbGwgIT0gMCkKKyAgICAgICAqcmVjc2l6ZSA9IHBtb25femVyb3NldCAoKnJlY3NpemUsICZwLCB6ZXJvZmlsbCwgY3N1bSk7CisgICAgICBzcHJpbnRmIChwLCAiL0IiKTsKKyAgICAgIGNvdW50ID0gcG1vbl9tYWtlYjY0IChpbmJ1ZlsqaW5wdHJdLCAmcFsyXSwgMTIsIGNzdW0pOworICAgICAgcCArPSAoMiArIGNvdW50KTsKKyAgICAgICpyZWNzaXplICs9ICgyICsgY291bnQpOworICAgICAgKCppbnB0cikrKzsKKyAgICB9IGVsc2UgeworICAgICAgdW5zaWduZWQgaW50IHZhbHVlID0gKChpbmJ1ZlsqaW5wdHIgKyAwXSA8PCAxNikgfCAoaW5idWZbKmlucHRyICsgMV0gPDwgOCkgfCBpbmJ1ZlsqaW5wdHIgKyAyXSk7CisgICAgICAvKiBTaW1wbGUgY2hlY2sgZm9yIHplcm8gZGF0YS4gVE9ETzogQSBiZXR0ZXIgY2hlY2sgd291bGQgYmUKKyAgICAgICAgIHRvIGNoZWNrIHRoZSBsYXN0LCBhbmQgdGhlbiB0aGUgbWlkZGxlIGJ5dGUgZm9yIGJlaW5nIHplcm8KKyAgICAgICAgIChpZiB0aGUgZmlyc3QgYnl0ZSBpcyBub3QpLiBXZSBjb3VsZCB0aGVuIGNoZWNrIGZvcgorICAgICAgICAgZm9sbG93aW5nIHJ1bnMgb2YgemVyb3MsIGFuZCBpZiBhYm92ZSBhIGNlcnRhaW4gc2l6ZSBpdCBpcworICAgICAgICAgd29ydGggdGhlIDQgb3IgOCBjaGFyYWN0ZXIgaGl0IG9mIHRoZSBieXRlIGluc2VydGlvbnMgdXNlZAorICAgICAgICAgdG8gcGFkIHRvIHRoZSBzdGFydCBvZiB0aGUgemVyb2VzLiBOT1RFOiBUaGlzIGFsc28gZGVwZW5kcworICAgICAgICAgb24gdGhlIGFsaWdubWVudCBhdCB0aGUgZW5kIG9mIHRoZSB6ZXJvIHJ1bi4gKi8KKyAgICAgIGlmICh2YWx1ZSA9PSAweDAwMDAwMDAwKSB7CisgICAgICAgICgqemVyb2ZpbGwpKys7CisgICAgICAgIGlmICgqemVyb2ZpbGwgPT0gMHhGRkYpIC8qIDEyYml0IGNvdW50ZXIgKi8KKyAgICAgICAgICpyZWNzaXplID0gcG1vbl96ZXJvc2V0ICgqcmVjc2l6ZSwgJnAsIHplcm9maWxsLCBjc3VtKTsKKyAgICAgIH1lbHNlIHsKKyAgICAgICAgaWYgKCp6ZXJvZmlsbCAhPSAwKQorICAgICAgICAgKnJlY3NpemUgPSBwbW9uX3plcm9zZXQgKCpyZWNzaXplLCAmcCwgemVyb2ZpbGwsIGNzdW0pOworICAgICAgICBjb3VudCA9IHBtb25fbWFrZWI2NCAodmFsdWUsIHAsIDI0LCBjc3VtKTsKKyAgICAgICAgcCArPSBjb3VudDsKKyAgICAgICAgKnJlY3NpemUgKz0gY291bnQ7CisgICAgICB9CisgICAgICAqaW5wdHIgKz0gMzsKKyAgICB9CisgIH0KKworICAqb3V0YnVmID0gcDsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgaW50CitwbW9uX2NoZWNrX2FjayhtZXNnKQorICAgICBjaGFyICptZXNnOworeworI2lmIGRlZmluZWQoRE9FVFhBQ0spCisgIGludCBjOworCisgIGlmICghdGZ0cF9pbl91c2UpCisgICAgeworICAgICAgYyA9IFNFUklBTF9SRUFEQ0hBUiAodWRwX2luX3VzZSA/IHVkcF9kZXNjIDogbWlwc19kZXNjLCAyKTsKKyAgICAgIGlmICgoYyA9PSBTRVJJQUxfVElNRU9VVCkgfHwgKGMgIT0gMHgwNikpCisJeworCSAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLAorCQkJICAgICAgIkZhaWxlZCB0byByZWNlaXZlIHZhbGlkIEFDSyBmb3IgJXNcbiIsIG1lc2cpOworCSAgcmV0dXJuKC0xKTsgLyogdGVybWluYXRlIHRoZSBkb3dubG9hZCAqLworCX0KKyAgICB9CisjZW5kaWYgLyogRE9FVFhBQ0sgKi8KKyAgcmV0dXJuKDApOworfQorCisvKiBwbW9uX2Rvd25sb2FkIC0gU2VuZCBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdG8gdGhlIFBNT04gZG93bmxvYWQgcG9ydCwKKyAgIHdoaWNoIGlzIGVpdGhlciBhIHNlcmlhbCBwb3J0IG9yIGEgVURQIHNvY2tldC4gICovCisKK3N0YXRpYyB2b2lkCitwbW9uX3N0YXJ0X2Rvd25sb2FkICgpCit7CisgIGlmICh0ZnRwX2luX3VzZSkKKyAgICB7CisgICAgICAvKiBDcmVhdGUgdGhlIHRlbXBvcmFyeSBkb3dubG9hZCBmaWxlLiAgKi8KKyAgICAgIGlmICgodGZ0cF9maWxlID0gZm9wZW4gKHRmdHBfbG9jYWxuYW1lLCAidyIpKSA9PSBOVUxMKQorCXBlcnJvcl93aXRoX25hbWUgKHRmdHBfbG9jYWxuYW1lKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtaXBzX3NlbmRfY29tbWFuZCAodWRwX2luX3VzZSA/IExPQURfQ01EX1VEUCA6IExPQURfQ01ELCAwKTsKKyAgICAgIG1pcHNfZXhwZWN0ICgiRG93bmxvYWRpbmcgZnJvbSAiKTsKKyAgICAgIG1pcHNfZXhwZWN0ICh1ZHBfaW5fdXNlID8gInVkcCIgOiAidHR5MCIpOworICAgICAgbWlwc19leHBlY3QgKCIsIF5DIHRvIGFib3J0XHJcbiIpOworICAgIH0KK30KKworc3RhdGljIGludAorbWlwc19leHBlY3RfZG93bmxvYWQgKGNoYXIgKnN0cmluZykKK3sKKyAgaWYgKCFtaXBzX2V4cGVjdCAoc3RyaW5nKSkKKyAgICB7CisgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJMb2FkIGRpZCBub3QgY29tcGxldGUgc3VjY2Vzc2Z1bGx5LlxuIik7CisgICAgICBpZiAodGZ0cF9pbl91c2UpCisJcmVtb3ZlICh0ZnRwX2xvY2FsbmFtZSk7CS8qIFJlbW92ZSB0ZW1wb3JhcnkgZmlsZSAqLworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitwbW9uX2VuZF9kb3dubG9hZCAoZmluYWwsIGJpbnRvdGFsKQorICAgICBpbnQgZmluYWw7CisgICAgIGludCBiaW50b3RhbDsKK3sKKyAgY2hhciBoZXhudW1iZXJbOV07IC8qIGluY2x1ZGVzICdcMCcgc3BhY2UgKi8KKworICBpZiAodGZ0cF9pbl91c2UpCisgICAgeworICAgICAgc3RhdGljIGNoYXIgKmxvYWRfY21kX3ByZWZpeCA9ICJsb2FkIC1iIC1zICI7CisgICAgICBjaGFyICpjbWQ7CisgICAgICBzdHJ1Y3Qgc3RhdCBzdGJ1ZjsKKworICAgICAgLyogQ2xvc2Ugb2ZmIHRoZSB0ZW1wb3JhcnkgZmlsZSBjb250YWluaW5nIHRoZSBsb2FkIGRhdGEuICAqLworICAgICAgZmNsb3NlICh0ZnRwX2ZpbGUpOworICAgICAgdGZ0cF9maWxlID0gTlVMTDsKKworICAgICAgLyogTWFrZSB0aGUgdGVtcG9yYXJ5IGZpbGUgcmVhZGFibGUgYnkgdGhlIHdvcmxkLiAgKi8KKyAgICAgIGlmIChzdGF0ICh0ZnRwX2xvY2FsbmFtZSwgJnN0YnVmKSA9PSAwKQorCWNobW9kICh0ZnRwX2xvY2FsbmFtZSwgc3RidWYuc3RfbW9kZSB8IFNfSVJPVEgpOworCisgICAgICAvKiBNdXN0IHJlaW5pdGlhbGl6ZSB0aGUgYm9hcmQgdG8gcHJldmVudCBQTU9OIGZyb20gY3Jhc2hpbmcuICAqLworICAgICAgbWlwc19zZW5kX2NvbW1hbmQgKCJpbml0RXRoZXJcciIsIC0xKTsKKworICAgICAgLyogU2VuZCB0aGUgbG9hZCBjb21tYW5kLiAgKi8KKyAgICAgIGNtZCA9IHhtYWxsb2MgKHN0cmxlbiAobG9hZF9jbWRfcHJlZml4KSArIHN0cmxlbiAodGZ0cF9uYW1lKSArIDIpOworICAgICAgc3RyY3B5IChjbWQsIGxvYWRfY21kX3ByZWZpeCk7CisgICAgICBzdHJjYXQgKGNtZCwgdGZ0cF9uYW1lKTsKKyAgICAgIHN0cmNhdCAoY21kLCAiXHIiKTsKKyAgICAgIG1pcHNfc2VuZF9jb21tYW5kIChjbWQsIDApOworICAgICAgZnJlZSAoY21kKTsKKyAgICAgIGlmICghbWlwc19leHBlY3RfZG93bmxvYWQgKCJEb3dubG9hZGluZyBmcm9tICIpKQorCXJldHVybjsKKyAgICAgIGlmICghbWlwc19leHBlY3RfZG93bmxvYWQgKHRmdHBfbmFtZSkpCisJcmV0dXJuOworICAgICAgaWYgKCFtaXBzX2V4cGVjdF9kb3dubG9hZCAoIiwgXkMgdG8gYWJvcnRcclxuIikpCisJcmV0dXJuOworICAgIH0KKworICAvKiBXYWl0IGZvciB0aGUgc3R1ZmYgdGhhdCBQTU9OIHByaW50cyBhZnRlciB0aGUgbG9hZCBoYXMgY29tcGxldGVkLgorICAgICBUaGUgdGltZW91dCB2YWx1ZSBmb3IgdXNlIGluIHRoZSB0ZnRwIGNhc2UgKDE1IHNlY29uZHMpIHdhcyBwaWNrZWQKKyAgICAgYXJiaXRyYXJpbHkgYnV0IG1pZ2h0IGJlIHRvbyBzbWFsbCBmb3IgcmVhbGx5IGxhcmdlIGRvd25sb2Fkcy4gRklYTUUuICovCisgIGlmIChtaXBzX21vbml0b3IgPT0gTU9OX0xTSSkKKyAgICB7CisgICAgICBwbW9uX2NoZWNrX2FjayAoInRlcm1pbmF0aW9uIik7CisgICAgICBtaXBzX2V4cGVjdF90aW1lb3V0ICgiRW50cnkgYWRkcmVzcyBpcyAiLCB0ZnRwX2luX3VzZSA/IDE1IDogMik7CisgICAgfQorICBlbHNlCisgICAgbWlwc19leHBlY3RfdGltZW91dCAoIkVudHJ5IEFkZHJlc3MgID0gIiwgdGZ0cF9pbl91c2UgPyAxNSA6IDIpOworCisgIHNwcmludGYgKGhleG51bWJlciwiJXgiLGZpbmFsKTsKKyAgbWlwc19leHBlY3QgKGhleG51bWJlcik7CisgIG1pcHNfZXhwZWN0ICgiXHJcbiIpOworICBpZiAobWlwc19tb25pdG9yICE9IE1PTl9MU0kpCisgICAgcG1vbl9jaGVja19hY2sgKCJ0ZXJtaW5hdGlvbiIpOworICBtaXBzX2V4cGVjdCAoIlxyXG50b3RhbCA9IDB4Iik7CisgIHNwcmludGYgKGhleG51bWJlciwiJXgiLGJpbnRvdGFsKTsKKyAgbWlwc19leHBlY3QgKGhleG51bWJlcik7CisgIGlmICghbWlwc19leHBlY3RfZG93bmxvYWQgKCIgYnl0ZXNcclxuIikpCisgICAgcmV0dXJuOworCisgIGlmICh0ZnRwX2luX3VzZSkKKyAgICByZW1vdmUgKHRmdHBfbG9jYWxuYW1lKTsJLyogUmVtb3ZlIHRlbXBvcmFyeSBmaWxlICovCit9CisKK3N0YXRpYyB2b2lkCitwbW9uX2Rvd25sb2FkIChidWZmZXIsIGxlbmd0aCkKKyAgICAgY2hhciAqYnVmZmVyOworICAgICBpbnQgbGVuZ3RoOworeworICBpZiAodGZ0cF9pbl91c2UpCisgICAgZndyaXRlIChidWZmZXIsIDEsIGxlbmd0aCwgdGZ0cF9maWxlKTsKKyAgZWxzZQorICAgIFNFUklBTF9XUklURSAodWRwX2luX3VzZSA/IHVkcF9kZXNjIDogbWlwc19kZXNjLCBidWZmZXIsIGxlbmd0aCk7Cit9CisKK3N0YXRpYyB2b2lkCitwbW9uX2xvYWRfZmFzdCAoZmlsZSkKKyAgICAgY2hhciAqZmlsZTsKK3sKKyAgYmZkICphYmZkOworICBhc2VjdGlvbiAqczsKKyAgdW5zaWduZWQgY2hhciAqYmluYnVmOworICBjaGFyICpidWZmZXI7CisgIGludCByZWNsZW47CisgIHVuc2lnbmVkIGludCBjc3VtID0gMDsKKyAgaW50IGhhc2htYXJrID0gIXRmdHBfaW5fdXNlOworICBpbnQgYmludG90YWwgPSAwOworICBpbnQgZmluYWwgPSAwOworICBpbnQgZmluaXNoZWQgPSAwOworCisgIGJ1ZmZlciA9IChjaGFyICopeG1hbGxvYyhNQVhSRUNTSVpFICsgMSk7CisgIGJpbmJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopeG1hbGxvYyhCSU5DSFVOSyk7CisKKyAgYWJmZCA9IGJmZF9vcGVucihmaWxlLDApOworICBpZiAoIWFiZmQpCisgICB7CisgICAgIHByaW50Zl9maWx0ZXJlZCAoIlVuYWJsZSB0byBvcGVuIGZpbGUgJXNcbiIsZmlsZSk7CisgICAgIHJldHVybjsKKyAgIH0KKworICBpZiAoYmZkX2NoZWNrX2Zvcm1hdChhYmZkLGJmZF9vYmplY3QpID09IDApCisgICB7CisgICAgIHByaW50Zl9maWx0ZXJlZCgiRmlsZSBpcyBub3QgYW4gb2JqZWN0IGZpbGVcbiIpOworICAgICByZXR1cm47CisgICB9CisKKyAgLyogU2V0dXAgdGhlIHJlcXVpcmVkIGRvd25sb2FkIHN0YXRlOiAqLworICBtaXBzX3NlbmRfY29tbWFuZCAoInNldCBkbHByb3RvIGV0eGFja1xyIiwgLTEpOworICBtaXBzX3NlbmRfY29tbWFuZCAoInNldCBkbGVjaG8gb2ZmXHIiLCAtMSk7CisgIC8qIE5PVEU6IFdlIGdldCBhICJjYW5ub3Qgc2V0IHZhcmlhYmxlIiBtZXNzYWdlIGlmIHRoZSB2YXJpYWJsZSBpcworICAgICBhbHJlYWR5IGRlZmluZWQgdG8gaGF2ZSB0aGUgYXJndW1lbnQgd2UgZ2l2ZS4gVGhlIGNvZGUgZG9lc24ndAorICAgICBjYXJlLCBzaW5jZSBpdCBqdXN0IHNjYW5zIHRvIHRoZSBuZXh0IHByb21wdCBhbnl3YXkuICovCisgIC8qIFN0YXJ0IHRoZSBkb3dubG9hZDogKi8KKyAgcG1vbl9zdGFydF9kb3dubG9hZCgpOworICAKKyAgLyogWmVybyB0aGUgY2hlY2tzdW0gKi8KKyAgc3ByaW50ZihidWZmZXIsIi9LeHhcbiIpOworICByZWNsZW4gPSBzdHJsZW4oYnVmZmVyKTsKKyAgcG1vbl9kb3dubG9hZCAoYnVmZmVyLCByZWNsZW4pOworICBmaW5pc2hlZCA9IHBtb25fY2hlY2tfYWNrKCIvS3h4Iik7CisKKyAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgJiYgIWZpbmlzaGVkOyBzID0gcy0+bmV4dCkKKyAgIGlmIChzLT5mbGFncyAmIFNFQ19MT0FEKSAvKiBvbmx5IGRlYWwgd2l0aCBsb2FkYWJsZSBzZWN0aW9ucyAqLworICAgIHsKKyAgICAgIGJpbnRvdGFsICs9IHMtPl9yYXdfc2l6ZTsKKyAgICAgIGZpbmFsID0gKHMtPnZtYSArIHMtPl9yYXdfc2l6ZSk7CisKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiVzXHQ6IDB4JTR4IC4uIDB4JTR4ICAiLCBzLT5uYW1lLCAodW5zaWduZWQgaW50KXMtPnZtYSwKKyAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkocy0+dm1hICsgcy0+X3Jhd19zaXplKSk7CisgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCisgICAgICAvKiBPdXRwdXQgdGhlIHN0YXJ0aW5nIGFkZHJlc3MgKi8KKyAgICAgIHNwcmludGYoYnVmZmVyLCIvQSIpOworICAgICAgcmVjbGVuID0gcG1vbl9tYWtlYjY0KHMtPnZtYSwmYnVmZmVyWzJdLDM2LCZjc3VtKTsKKyAgICAgIGJ1ZmZlclsyICsgcmVjbGVuXSA9ICdcbic7CisgICAgICBidWZmZXJbMyArIHJlY2xlbl0gPSAnXDAnOworICAgICAgcmVjbGVuICs9IDM7IC8qIGZvciB0aGUgaW5pdGlhbCBlc2NhcGUgY29kZSBhbmQgY2FycmlhZ2UgcmV0dXJuICovCisgICAgICBwbW9uX2Rvd25sb2FkIChidWZmZXIsIHJlY2xlbik7CisgICAgICBmaW5pc2hlZCA9IHBtb25fY2hlY2tfYWNrKCIvQSIpOworCisgICAgICBpZiAoIWZpbmlzaGVkKQorICAgICAgIHsKKyAgICAgICAgIHVuc2lnbmVkIGludCBiaW5hbW91bnQ7CisgICAgICAgICB1bnNpZ25lZCBpbnQgemVyb2ZpbGwgPSAwOworICAgICAgICAgY2hhciAqYnAgPSBidWZmZXI7CisgICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgICAgcmVjbGVuID0gMDsKKworICAgICAgICAgZm9yIChpID0gMDsgKChpIDwgcy0+X3Jhd19zaXplKSAmJiAhZmluaXNoZWQpOyBpICs9IGJpbmFtb3VudCkgeworICAgICAgICAgICBpbnQgYmlucHRyID0gMDsKKworICAgICAgICAgICBiaW5hbW91bnQgPSBtaW4gKEJJTkNIVU5LLCBzLT5fcmF3X3NpemUgLSBpKTsKKworICAgICAgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHMsIGJpbmJ1ZiwgaSwgYmluYW1vdW50KTsKKworICAgICAgICAgICAvKiBUaGlzIGtlZXBzIGEgcm9sbGluZyBjaGVja3N1bSwgdW50aWwgd2UgZGVjaWRlIHRvIG91dHB1dAorICAgICAgICAgICAgICB0aGUgbGluZTogKi8KKyAgICAgICAgICAgZm9yICg7ICgoYmluYW1vdW50IC0gYmlucHRyKSA+IDApOykgeworICAgICAgICAgICAgIHBtb25fbWFrZV9mYXN0cmVjICgmYnAsIGJpbmJ1ZiwgJmJpbnB0ciwgYmluYW1vdW50LCAmcmVjbGVuLCAmY3N1bSwgJnplcm9maWxsKTsKKyAgICAgICAgICAgICBpZiAocmVjbGVuID49IChNQVhSRUNTSVpFIC0gQ0hFQ0tTSVpFKSkgeworICAgICAgICAgICAgICAgcmVjbGVuID0gcG1vbl9jaGVja3NldCAocmVjbGVuLCAmYnAsICZjc3VtKTsKKyAgICAgICAgICAgICAgIHBtb25fZG93bmxvYWQgKGJ1ZmZlciwgcmVjbGVuKTsKKyAgICAgICAgICAgICAgIGZpbmlzaGVkID0gcG1vbl9jaGVja19hY2soImRhdGEgcmVjb3JkIik7CisgICAgICAgICAgICAgICBpZiAoZmluaXNoZWQpIHsKKyAgICAgICAgICAgICAgICAgemVyb2ZpbGwgPSAwOyAvKiBkbyBub3QgdHJhbnNtaXQgcGVuZGluZyB6ZXJvZmlsbHMgKi8KKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGlmIChoYXNobWFyaykgeworICAgICAgICAgICAgICAgICBwdXRjaGFyX3VuZmlsdGVyZWQgKCcjJyk7CisgICAgICAgICAgICAgICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGJwID0gYnVmZmVyOworICAgICAgICAgICAgICAgcmVjbGVuID0gMDsgLyogYnVmZmVyIHByb2Nlc3NlZCAqLworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICAvKiBFbnN1cmUgbm8gb3V0LXN0YW5kaW5nIHplcm9maWxsIHJlcXVlc3RzOiAqLworICAgICAgICAgaWYgKHplcm9maWxsICE9IDApCisgICAgICAgICAgcmVjbGVuID0gcG1vbl96ZXJvc2V0IChyZWNsZW4sICZicCwgJnplcm9maWxsLCAmY3N1bSk7CisKKyAgICAgICAgIC8qIGFuZCB0aGVuIGZsdXNoIHRoZSBsaW5lOiAqLworICAgICAgICAgaWYgKHJlY2xlbiA+IDApIHsKKyAgICAgICAgICAgcmVjbGVuID0gcG1vbl9jaGVja3NldCAocmVjbGVuLCAmYnAsICZjc3VtKTsKKyAgICAgICAgICAgLyogQ3VycmVudGx5IHBtb25fY2hlY2tzZXQgb3V0cHV0cyB0aGUgbGluZSB0ZXJtaW5hdG9yIGJ5CisgICAgICAgICAgICAgIGRlZmF1bHQsIHNvIHdlIHdyaXRlIG91dCB0aGUgYnVmZmVyIHNvIGZhcjogKi8KKyAgICAgICAgICAgcG1vbl9kb3dubG9hZCAoYnVmZmVyLCByZWNsZW4pOworICAgICAgICAgICBmaW5pc2hlZCA9IHBtb25fY2hlY2tfYWNrKCJyZWNvcmQgcmVtbmFudCIpOworICAgICAgICAgfQorICAgICAgIH0KKworICAgICAgcHV0Y2hhcl91bmZpbHRlcmVkICgnXG4nKTsKKyAgICB9CisKKyAgLyogVGVybWluYXRlIHRoZSB0cmFuc2Zlci4gV2Uga25vdyB0aGF0IHdlIGhhdmUgYW4gZW1wdHkgb3V0cHV0CisgICAgIGJ1ZmZlciBhdCB0aGlzIHBvaW50LiAqLworICBzcHJpbnRmIChidWZmZXIsICIvRS9FXG4iKTsgLyogaW5jbHVkZSBkdW1teSBwYWRkaW5nIGNoYXJhY3RlcnMgKi8KKyAgcmVjbGVuID0gc3RybGVuIChidWZmZXIpOworICBwbW9uX2Rvd25sb2FkIChidWZmZXIsIHJlY2xlbik7CisKKyAgaWYgKGZpbmlzaGVkKSB7IC8qIElnbm9yZSB0aGUgdGVybWluYXRpb24gbWVzc2FnZTogKi8KKyAgICBTRVJJQUxfRkxVU0hfSU5QVVQgKHVkcF9pbl91c2UgPyB1ZHBfZGVzYyA6IG1pcHNfZGVzYyk7CisgIH0gZWxzZSB7IC8qIERlYWwgd2l0aCB0ZXJtaW5hdGlvbiBtZXNzYWdlOiAqLworICAgIHBtb25fZW5kX2Rvd25sb2FkIChmaW5hbCwgYmludG90YWwpOworICB9CisKKyAgcmV0dXJuOworfQorCisvKiBtaXBzX2xvYWQgLS0gZG93bmxvYWQgYSBmaWxlLiAqLworCitzdGF0aWMgdm9pZAorbWlwc19sb2FkIChmaWxlLCBmcm9tX3R0eSkKKyAgICBjaGFyICpmaWxlOworICAgIGludCAgZnJvbV90dHk7Cit7CisgIC8qIEdldCB0aGUgYm9hcmQgb3V0IG9mIHJlbW90ZSBkZWJ1Z2dpbmcgbW9kZS4gICovCisgIGlmIChtaXBzX2V4aXRfZGVidWcgKCkpCisgICAgZXJyb3IgKCJtaXBzX2xvYWQ6ICBDb3VsZG4ndCBnZXQgaW50byBtb25pdG9yIG1vZGUuIik7CisKKyAgaWYgKG1pcHNfbW9uaXRvciAhPSBNT05fSURUKQorICAgcG1vbl9sb2FkX2Zhc3QgKGZpbGUpOworICBlbHNlCisgICBtaXBzX2xvYWRfc3JlYyAoZmlsZSk7CisKKyAgbWlwc19pbml0aWFsaXplICgpOworCisgIC8qIEZpbmFsbHksIG1ha2UgdGhlIFBDIHBvaW50IGF0IHRoZSBzdGFydCBhZGRyZXNzICovCisgIGlmIChtaXBzX21vbml0b3IgIT0gTU9OX0lEVCkKKyAgICB7CisgICAgICAvKiBXb3JrIGFyb3VuZCBwcm9ibGVtIHdoZXJlIFBNT04gbW9uaXRvciB1cGRhdGVzIHRoZSBQQyBhZnRlciBhIGxvYWQKKwkgdG8gYSBkaWZmZXJlbnQgdmFsdWUgdGhhbiBHREIgdGhpbmtzIGl0IGhhcy4gVGhlIGZvbGxvd2luZyBlbnN1cmVzCisJIHRoYXQgdGhlIHdyaXRlX3BjKCkgV0lMTCB1cGRhdGUgdGhlIFBDIHZhbHVlOiAqLworICAgICAgcmVnaXN0ZXJfdmFsaWRbUENfUkVHTlVNXSA9IDA7CisgICAgfQorICBpZiAoZXhlY19iZmQpCisgICAgd3JpdGVfcGMgKGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoZXhlY19iZmQpKTsKKworICBpbmZlcmlvcl9waWQgPSAwOwkJLyogTm8gcHJvY2VzcyBub3cgKi8KKworLyogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBtYW55IHRoaW5ncyB3ZXJlIGJhc2VkIG9uIHRoZSBQQyBhdCB0aGUgdGltZSB0aGF0CisgICB3ZSBhdHRhY2hlZCB0byB0aGUgbW9uaXRvciwgd2hpY2ggaXMgbm8gbG9uZ2VyIHZhbGlkIG5vdyB0aGF0IHdlIGhhdmUgbG9hZGVkCisgICBuZXcgY29kZSAoYW5kIGp1c3QgY2hhbmdlZCB0aGUgUEMpLiAgQW5vdGhlciB3YXkgdG8gZG8gdGhpcyBtaWdodCBiZSB0byBjYWxsCisgICBub3JtYWxfc3RvcCwgZXhjZXB0IHRoYXQgdGhlIHN0YWNrIG1heSBub3QgYmUgdmFsaWQsIGFuZCB0aGluZ3Mgd291bGQgZ2V0CisgICBob3JyaWJseSBjb25mdXNlZC4uLiAqLworCisgIGNsZWFyX3N5bXRhYl91c2VycyAoKTsKK30KKworCisvKiBQYXNzIHRoZSBjb21tYW5kIGFyZ3VtZW50IGFzIGEgcGFja2V0IHRvIFBNT04gdmVyYmF0aW0uICAqLworCitzdGF0aWMgdm9pZAorcG1vbl9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjaGFyIGJ1ZltEQVRBX01BWExFTiArIDFdOworICBpbnQgcmxlbjsKKworICBzcHJpbnRmIChidWYsICIweDAgJXMiLCBhcmdzKTsKKyAgbWlwc19zZW5kX3BhY2tldCAoYnVmLCAxKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiU2VuZCBwYWNrZXQ6ICVzXG4iLCBidWYpOworCisgIHJsZW4gPSBtaXBzX3JlY2VpdmVfcGFja2V0IChidWYsIDEsIG1pcHNfcmVjZWl2ZV93YWl0KTsKKyAgYnVmW3JsZW5dID0gJ1wwJzsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiUmVjZWl2ZWQgcGFja2V0OiAlc1xuIiwgYnVmKTsKK30KKwwKK3ZvaWQKK19pbml0aWFsaXplX3JlbW90ZV9taXBzICgpCit7CisgIC8qIEluaXRpYWxpemUgdGhlIGZpZWxkcyBpbiBtaXBzX29wcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIGZvdXIgdGFyZ2V0cy4gICovCisgIG1pcHNfb3BzLnRvX2xvbmduYW1lID0gIlJlbW90ZSBNSVBTIGRlYnVnZ2luZyBvdmVyIHNlcmlhbCBsaW5lIjsKKyAgbWlwc19vcHMudG9fY2xvc2UgPSBtaXBzX2Nsb3NlOworICBtaXBzX29wcy50b19kZXRhY2ggPSBtaXBzX2RldGFjaDsKKyAgbWlwc19vcHMudG9fcmVzdW1lID0gbWlwc19yZXN1bWU7CisgIG1pcHNfb3BzLnRvX2ZldGNoX3JlZ2lzdGVycyA9IG1pcHNfZmV0Y2hfcmVnaXN0ZXJzOworICBtaXBzX29wcy50b19zdG9yZV9yZWdpc3RlcnMgPSBtaXBzX3N0b3JlX3JlZ2lzdGVyczsKKyAgbWlwc19vcHMudG9fcHJlcGFyZV90b19zdG9yZSA9IG1pcHNfcHJlcGFyZV90b19zdG9yZTsKKyAgbWlwc19vcHMudG9feGZlcl9tZW1vcnkgPSBtaXBzX3hmZXJfbWVtb3J5OworICBtaXBzX29wcy50b19maWxlc19pbmZvID0gbWlwc19maWxlc19pbmZvOworICBtaXBzX29wcy50b19pbnNlcnRfYnJlYWtwb2ludCA9IG1pcHNfaW5zZXJ0X2JyZWFrcG9pbnQ7CisgIG1pcHNfb3BzLnRvX3JlbW92ZV9icmVha3BvaW50ID0gbWlwc19yZW1vdmVfYnJlYWtwb2ludDsKKyAgbWlwc19vcHMudG9fa2lsbCA9IG1pcHNfa2lsbDsKKyAgbWlwc19vcHMudG9fbG9hZCA9IG1pcHNfbG9hZDsKKyAgbWlwc19vcHMudG9fY3JlYXRlX2luZmVyaW9yID0gbWlwc19jcmVhdGVfaW5mZXJpb3I7CisgIG1pcHNfb3BzLnRvX21vdXJuX2luZmVyaW9yID0gbWlwc19tb3Vybl9pbmZlcmlvcjsKKyAgbWlwc19vcHMudG9fc3RyYXR1bSA9IHByb2Nlc3Nfc3RyYXR1bTsKKyAgbWlwc19vcHMudG9faGFzX2FsbF9tZW1vcnkgPSAxOworICBtaXBzX29wcy50b19oYXNfbWVtb3J5ID0gMTsKKyAgbWlwc19vcHMudG9faGFzX3N0YWNrID0gMTsKKyAgbWlwc19vcHMudG9faGFzX3JlZ2lzdGVycyA9IDE7CisgIG1pcHNfb3BzLnRvX2hhc19leGVjdXRpb24gPSAxOworICBtaXBzX29wcy50b19tYWdpYyA9IE9QU19NQUdJQzsKKworICAvKiBDb3B5IHRoZSBjb21tb24gZmllbGRzIHRvIGFsbCBmb3VyIHRhcmdldCB2ZWN0b3JzLiAgKi8KKyAgcG1vbl9vcHMgPSBkZGJfb3BzID0gbHNpX29wcyA9IG1pcHNfb3BzOworCisgIC8qIEluaXRpYWxpemUgdGFyZ2V0LXNwZWNpZmljIGZpZWxkcyBpbiB0aGUgdGFyZ2V0IHZlY3RvcnMuICAqLworICBtaXBzX29wcy50b19zaG9ydG5hbWUgPSAibWlwcyI7CisgIG1pcHNfb3BzLnRvX2RvYyA9ICJcCitEZWJ1ZyBhIGJvYXJkIHVzaW5nIHRoZSBNSVBTIHJlbW90ZSBkZWJ1Z2dpbmcgcHJvdG9jb2wgb3ZlciBhIHNlcmlhbCBsaW5lLlxuXAorVGhlIGFyZ3VtZW50IGlzIHRoZSBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvIG9yLCBpZiBpdCBjb250YWlucyBhIGNvbG9uLFxuXAorSE9TVDpQT1JUIHRvIGFjY2VzcyBhIGJvYXJkIG92ZXIgYSBuZXR3b3JrIjsKKyAgbWlwc19vcHMudG9fb3BlbiA9IG1pcHNfb3BlbjsKKyAgbWlwc19vcHMudG9fd2FpdCA9IG1pcHNfd2FpdDsKKworICBwbW9uX29wcy50b19zaG9ydG5hbWUgPSAicG1vbiI7CisgIHBtb25fb3BzLnRvX2RvYyA9ICAgIlwKK0RlYnVnIGEgYm9hcmQgdXNpbmcgdGhlIFBNT04gTUlQUyByZW1vdGUgZGVidWdnaW5nIHByb3RvY29sIG92ZXIgYSBzZXJpYWxcblwKK2xpbmUuIFRoZSBhcmd1bWVudCBpcyB0aGUgZGV2aWNlIGl0IGlzIGNvbm5lY3RlZCB0byBvciwgaWYgaXQgY29udGFpbnMgYVxuXAorY29sb24sIEhPU1Q6UE9SVCB0byBhY2Nlc3MgYSBib2FyZCBvdmVyIGEgbmV0d29yayI7CisgIHBtb25fb3BzLnRvX29wZW4gPSBwbW9uX29wZW47CisgIHBtb25fb3BzLnRvX3dhaXQgPSBtaXBzX3dhaXQ7CisKKyAgZGRiX29wcy50b19zaG9ydG5hbWUgPSAiZGRiIjsKKyAgZGRiX29wcy50b19kb2MgPSAiXAorRGVidWcgYSBib2FyZCB1c2luZyB0aGUgUE1PTiBNSVBTIHJlbW90ZSBkZWJ1Z2dpbmcgcHJvdG9jb2wgb3ZlciBhIHNlcmlhbFxuXAorbGluZS4gVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvIG9yLCBpZiBpdCBjb250YWluc1xuXAorYSBjb2xvbiwgSE9TVDpQT1JUIHRvIGFjY2VzcyBhIGJvYXJkIG92ZXIgYSBuZXR3b3JrLiAgVGhlIG9wdGlvbmFsIHNlY29uZFxuXAorcGFyYW1ldGVyIGlzIHRoZSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgZm9ybSBIT1NUOkZJTEVOQU1FIHRvIGJlIHVzZWQgZm9yXG5cCitURlRQIGRvd25sb2FkcyB0byB0aGUgYm9hcmQuICBUaGUgb3B0aW9uYWwgdGhpcmQgcGFyYW1ldGVyIGlzIHRoZSBsb2NhbCBuYW1lXG5cCitvZiB0aGUgVEZUUCB0ZW1wb3JhcnkgZmlsZSwgaWYgaXQgZGlmZmVycyBmcm9tIHRoZSBmaWxlbmFtZSBzZWVuIGJ5IHRoZSBib2FyZC4iOworICBkZGJfb3BzLnRvX29wZW4gPSBkZGJfb3BlbjsKKyAgZGRiX29wcy50b193YWl0ID0gbWlwc193YWl0OworCisgIGxzaV9vcHMudG9fc2hvcnRuYW1lID0gImxzaSI7CisgIGxzaV9vcHMudG9fZG9jID0gcG1vbl9vcHMudG9fZG9jOworICBsc2lfb3BzLnRvX29wZW4gPSBsc2lfb3BlbjsKKyAgbHNpX29wcy50b193YWl0ID0gbWlwc193YWl0OworCisgIC8qIEFkZCB0aGUgdGFyZ2V0cy4gICovCisgIGFkZF90YXJnZXQgKCZtaXBzX29wcyk7CisgIGFkZF90YXJnZXQgKCZwbW9uX29wcyk7CisgIGFkZF90YXJnZXQgKCZkZGJfb3BzKTsKKyAgYWRkX3RhcmdldCAoJmxzaV9vcHMpOworCisgIGFkZF9zaG93X2Zyb21fc2V0ICgKKyAgICBhZGRfc2V0X2NtZCAoInRpbWVvdXQiLCBub19jbGFzcywgdmFyX3ppbnRlZ2VyLAorCQkgKGNoYXIgKikgJm1pcHNfcmVjZWl2ZV93YWl0LAorCQkgIlNldCB0aW1lb3V0IGluIHNlY29uZHMgZm9yIHJlbW90ZSBNSVBTIHNlcmlhbCBJL08uIiwKKwkJICZzZXRsaXN0KSwKKwkmc2hvd2xpc3QpOworCisgIGFkZF9zaG93X2Zyb21fc2V0ICgKKyAgICBhZGRfc2V0X2NtZCAoInJldHJhbnNtaXQtdGltZW91dCIsIG5vX2NsYXNzLCB2YXJfemludGVnZXIsCisJCSAoY2hhciAqKSAmbWlwc19yZXRyYW5zbWl0X3dhaXQsCisJICJTZXQgcmV0cmFuc21pdCB0aW1lb3V0IGluIHNlY29uZHMgZm9yIHJlbW90ZSBNSVBTIHNlcmlhbCBJL08uXG5cCitUaGlzIGlzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciBhbiBhY2tub3dsZWRnZW1lbnQgdG8gYSBwYWNrZXRcblwKK2JlZm9yZSByZXNlbmRpbmcgdGhlIHBhY2tldC4iLCAmc2V0bGlzdCksCisJJnNob3dsaXN0KTsKKworICBhZGRfc2hvd19mcm9tX3NldCAoCisgICAgYWRkX3NldF9jbWQgKCJzeW4tZ2FyYmFnZS1saW1pdCIsIG5vX2NsYXNzLCB2YXJfemludGVnZXIsCisJCSAoY2hhciAqKSAmbWlwc19zeW5fZ2FyYmFnZSwKKyJTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gaWdub3JlIHdoZW4gc2Nhbm5pbmcgZm9yIGEgU1lOLlxuXAorVGhpcyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBHREIgd2lsbCBpZ25vcmUgd2hlbiB0cnlpbmcgdG9cblwKK3N5bmNocm9uaXplIHdpdGggdGhlIHJlbW90ZSBzeXN0ZW0uICBBIHZhbHVlIG9mIC0xIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gbGltaXRcblwKKyhOb3RlIHRoYXQgdGhlc2UgY2hhcmFjdGVycyBhcmUgcHJpbnRlZCBvdXQgZXZlbiB0aG91Z2ggdGhleSBhcmUgaWdub3JlZC4pIiwKKwkJICZzZXRsaXN0KSwKKwkJICAgICAmc2hvd2xpc3QpOworCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgibW9uaXRvci1wcm9tcHQiLCBjbGFzc19vYnNjdXJlLCB2YXJfc3RyaW5nLAorCQkgIChjaGFyICopICZtaXBzX21vbml0b3JfcHJvbXB0LAorCQkgICJTZXQgdGhlIHByb21wdCB0aGF0IEdEQiBleHBlY3RzIGZyb20gdGhlIG1vbml0b3IuIiwKKwkJICAmc2V0bGlzdCksCisgICAgICZzaG93bGlzdCk7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQgKAorICAgIGFkZF9zZXRfY21kICgibW9uaXRvci13YXJuaW5ncyIsIGNsYXNzX29ic2N1cmUsIHZhcl96aW50ZWdlciwKKwkJIChjaGFyICopJm1vbml0b3Jfd2FybmluZ3MsCisJCSAiU2V0IHByaW50aW5nIG9mIG1vbml0b3Igd2FybmluZ3MuXG4iCisJCSAiV2hlbiBlbmFibGVkLCBtb25pdG9yIHdhcm5pbmdzIGFib3V0IGhhcmR3YXJlIGJyZWFrcG9pbnRzICIKKwkJICJ3aWxsIGJlIGRpc3BsYXllZC4iLAorCQkgJnNldGxpc3QpLAorCQkgICAgICZzaG93bGlzdCk7CisKKyAgYWRkX2NvbSAoInBtb24gPGNvbW1hbmQ+IiwgY2xhc3Nfb2JzY3VyZSwgcG1vbl9jb21tYW5kLAorCSAgICJTZW5kIGEgcGFja2V0IHRvIFBNT04gKG11c3QgYmUgaW4gZGVidWcgbW9kZSkuIik7IAorfQpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS1tbS5jIGIvZ2RiL3JlbW90ZS1tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NDU1YjQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmVtb3RlLW1tLmMKQEAgLTAsMCArMSwxNjczIEBACisvKiBSZW1vdGUgZGVidWdnaW5nIGludGVyZmFjZSBmb3IgQW0yOTAqMCBydW5uaW5nIE1pbmlNT04gbW9uaXRvciwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgT3JpZ2luYWxseSB3cml0dGVuIGJ5IERhbmllbCBNYW5uIGF0IEFNRC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGlzIGxpa2UgcmVtb3RlLmMgYnV0IGVjcGVjdHMgTWluaU1PTiB0byBiZSBydW5uaW5nIG9uIHRoZSBBbTI5MDAwIAorICAgdGFyZ2V0IGhhcmR3YXJlLgorIC0gRGF2aWQgV29vZCAod29vZEBsYWIudWx0cmEubnl1LmVkdSkgYXQgTmV3IFlvcmsgVW5pdmVyc2l0eSBhZGFwdGVkIHRoaXMKKwlmaWxlIHRvIGdkYiAzLjk1LiAgSSB3YXMgdW5hYmxlIHRvIGdldCB0aGlzIHdvcmtpbmcgb24gc3VuM29zNAorCXdpdGggdGVybWlvLCBvbmx5IHdpdGggc2d0dHkuICBCZWNhdXNlIHdlIGFyZSBvbmx5IGF0dGVtcHRpbmcgdG8KKwl1c2UgdGhpcyBtb2R1bGUgdG8gZGVidWcgb3VyIGtlcm5lbCwgd2hpY2ggaXMgYWxyZWFkeSBsb2FkZWQgd2hlbgorCWdkYiBpcyBzdGFydGVkIHVwLCBJIGRpZCBub3QgY29kZSB1cCB0aGUgZmlsZSBkb3dubG9hZGluZyBmYWNpbGl0aWVzLiAgCisJQXMgYSByZXN1bHQgdGhpcyBtb2R1bGUgaGFzIG9ubHkgdGhlIHN0dWJzIHRvIGRvd25sb2FkIGZpbGVzLiAKKwlZb3Ugc2hvdWxkIGdldCB0YWdnZWQgYXQgY29tcGlsZSB0aW1lIGlmIHlvdSBuZWVkIHRvIG1ha2UgYW55IAorCWNoYW5nZXMvYWRkaXRpb25zLiAgKi8KKyAKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJ3YWl0LmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSAidGVybWluYWwuaCIKKyNpbmNsdWRlICJtaW5pbW9uLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisKKy8qIE9mZnNldCBvZiBtZW1iZXIgTUVNQkVSIGluIGEgc3RydWN0IG9mIHR5cGUgVFlQRS4gICovCisjZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgKChpbnQpICYoKFRZUEUgKikwKS0+TUVNQkVSKQorCisjZGVmaW5lIERSQUlOX0lOUFVUKCkJKG1zZ19yZWN2X3NlcmlhbCgodW5pb24gbXNnX3QqKTApKQorCitleHRlcm4gaW50IHN0b3Bfc29vbl9xdWlldGx5OyAgICAgICAgICAgLyogZm9yIHdhaXRfZm9yX2luZmVyaW9yICovCisKK3N0YXRpYyB2b2lkIG1tX3Jlc3VtZSgpOworc3RhdGljIHZvaWQgbW1fZmV0Y2hfcmVnaXN0ZXJzICgpOworc3RhdGljIGludCBmZXRjaF9yZWdpc3RlciAoKTsKK3N0YXRpYyB2b2lkIG1tX3N0b3JlX3JlZ2lzdGVycyAoKTsKK3N0YXRpYyBpbnQgc3RvcmVfcmVnaXN0ZXIgKCk7CitzdGF0aWMgaW50IHJlZ251bV90b19zcm51bSgpOworc3RhdGljIHZvaWQgIG1tX2Nsb3NlICgpOworc3RhdGljIGNoYXIqIG1zZ19zdHIoKTsKK3N0YXRpYyBjaGFyKiBlcnJvcl9tc2dfc3RyKCk7CitzdGF0aWMgaW50IGV4cGVjdF9tc2coKTsKK3N0YXRpYyB2b2lkIGluaXRfdGFyZ2V0X21tKCk7CitzdGF0aWMgaW50IG1tX21lbW9yeV9zcGFjZSgpOworCisjZGVmaW5lIEZSRUVaRV9NT0RFICAgICAocmVhZF9yZWdpc3RlcihDUFNfUkVHTlVNKSAmJiAweDQwMCkKKyNkZWZpbmUgVVNFX1NIQURPV19QQwkoKHByb2Nlc3Nvcl90eXBlID09IGEyOWtfZnJlZXplX21vZGUpICYmIEZSRUVaRV9NT0RFKQorCisvKiBGSVhNRTogUmVwbGFjZSB3aXRoIGBzZXQgcmVtb3RlZGVidWcnLiAgKi8KKyNkZWZpbmUgTExPR19GSUxFICJtaW5pbW9uLmxvZyIKKyNpZiBkZWZpbmVkIChMT0dfRklMRSkKK0ZJTEUgKmxvZ19maWxlOworI2VuZGlmCisKKy8qICAKKyAqIFNpemUgb2YgbWVzc2FnZSBidWZmZXJzLiAgSSBjb3VsZG4ndCBnZXQgbWVtb3J5IHJlYWRzIHRvIHdvcmsgd2hlbgorICogdGhlIGJ5dGVfY291bnQgd2FzIGxhcmdlciB0aGFuIDUxMiAoaXQgbWF5IGJlIGEgYmF1ZCByYXRlIHByb2JsZW0pLgorICovCisjZGVmaW5lIEJVRkVSX1NJWkUgIDUxMgkJCisvKiAKKyAqIFNpemUgb2YgZGF0YSBhcmVhIGluIG1lc3NhZ2UgYnVmZmVyIG9uIHRoZSBUQVJHRVQgKHJlbW90ZSBzeXN0ZW0pLgorICovCisjZGVmaW5lIE1BWERBVEFfVCAgKHRhcmdldF9jb25maWcubWF4X21zZ19zaXplIC0gXAorCQkJb2Zmc2V0b2Yoc3RydWN0IHdyaXRlX3JfbXNnX3QsZGF0YVswXSkpCisvKgkJIAorICogU2l6ZSBvZiBkYXRhIGFyZWEgaW4gbWVzc2FnZSBidWZmZXIgb24gdGhlIEhPU1QgKGdkYikuIAorICovCisjZGVmaW5lIE1BWERBVEFfSCAgKEJVRkVSX1NJWkUgLSBvZmZzZXRvZihzdHJ1Y3Qgd3JpdGVfcl9tc2dfdCxkYXRhWzBdKSkKKy8qIAorICogRGVmaW5lZCBhcyB0aGUgbWluaW11bSBzaXplIG9mIGRhdGEgYXJlYXMgb2YgdGhlIHR3byBtZXNzYWdlIGJ1ZmZlcnMgCisgKi8KKyNkZWZpbmUgTUFYREFUQQkgICAoTUFYREFUQV9IIDwgTUFYREFUQV9UID8gTUFYREFUQV9IIDogTUFYREFUQV9UKQorCitzdGF0aWMgY2hhciBvdXRfYnVmW0JVRkVSX1NJWkVdOworc3RhdGljIGNoYXIgIGluX2J1ZltCVUZFUl9TSVpFXTsKKworaW50IG1zZ19yZWN2X3NlcmlhbCgpOworaW50IG1zZ19zZW5kX3NlcmlhbCgpOworCisjZGVmaW5lIE1BWF9SRVRSSUVTIDUwMDAKK2V4dGVybiBzdHJ1Y3QgdGFyZ2V0X29wcyBtbV9vcHM7ICAgICAgICAgICAgIC8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0cnVjdCBjb25maWdfbXNnX3QgIHRhcmdldF9jb25maWc7CS8qIEhJRiBuZWVkcyB0aGlzICovCit1bmlvbiBtc2dfdCAgKm91dF9tc2dfYnVmID0gKHVuaW9uIG1zZ190KilvdXRfYnVmOwordW5pb24gbXNnX3QgICppbl9tc2dfYnVmICA9ICh1bmlvbiBtc2dfdCopaW5fYnVmOworCitzdGF0aWMgaW50IHRpbWVvdXQgPSA1OworCisvKiBEZXNjcmlwdG9yIGZvciBJL08gdG8gcmVtb3RlIG1hY2hpbmUuICBJbml0aWFsaXplIGl0IHRvIC0xIHNvIHRoYXQKKyAgIG1tX29wZW4ga25vd3MgdGhhdCB3ZSBkb24ndCBoYXZlIGEgZmlsZSBvcGVuIHdoZW4gdGhlIHByb2dyYW0KKyAgIHN0YXJ0cy4gICovCitpbnQgbW1fZGVzYyA9IC0xOworCisvKiBzdHJlYW0gd2hpY2ggaXMgZmRvcGVuJ2QgZnJvbSBtbV9kZXNjLiAgT25seSB2YWxpZCB3aGVuCisgICBtbV9kZXNjICE9IC0xLiAgKi8KK0ZJTEUgKm1tX3N0cmVhbTsKKworLyogQ2FsbGVkIHdoZW4gU0lHQUxSTSBzaWduYWwgc2VudCBkdWUgdG8gYWxhcm0oKSB0aW1lb3V0LiAgKi8KKyNpZm5kZWYgSEFWRV9URVJNSU8KKworI2lmbmRlZiBfX1NURENfXworIyBpZm5kZWYgdm9sYXRpbGUKKyMgIGRlZmluZSB2b2xhdGlsZSAvKiovCisjIGVuZGlmCisjZW5kaWYKK3ZvbGF0aWxlIGludCBuX2FsYXJtczsKKworc3RhdGljIHZvaWQKK21tX3RpbWVyICgpCit7CisjaWYgMAorICBpZiAoa2lvZGVidWcpCisgICAgcHJpbnRmICgibW1fdGltZXIgY2FsbGVkXG4iKTsKKyNlbmRpZgorICBuX2FsYXJtcysrOworfQorI2VuZGlmCS8qIEhBVkVfVEVSTUlPICovCisKKy8qIG1hbGxvYydkIG5hbWUgb2YgdGhlIHByb2dyYW0gb24gdGhlIHJlbW90ZSBzeXN0ZW0uICAqLworc3RhdGljIGNoYXIgKnByb2dfbmFtZSA9IE5VTEw7CisKKworLyogTnVtYmVyIG9mIFNJR1RSQVBzIHdlIG5lZWQgdG8gc2ltdWxhdGUuICBUaGF0IGlzLCB0aGUgbmV4dAorICAgTkVFRF9BUlRJRklDSUFMX1RSQVAgY2FsbHMgdG8gbW1fd2FpdCBzaG91bGQganVzdCByZXR1cm4KKyAgIFNJR1RSQVAgd2l0aG91dCBhY3R1YWxseSB3YWl0aW5nIGZvciBhbnl0aGluZy4gICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFJFTU9URV9DUkVBVEVfSU5GRVJJT1IgKi8KKy8qIFRoaXMgaXMgY2FsbGVkIG5vdCBvbmx5IHdoZW4gd2UgZmlyc3QgYXR0YWNoLCBidXQgYWxzbyB3aGVuIHRoZQorICAgdXNlciB0eXBlcyAicnVuIiBhZnRlciBoYXZpbmcgYXR0YWNoZWQuICAqLworc3RhdGljIHZvaWQKK21tX2NyZWF0ZV9pbmZlcmlvciAoZXhlY2ZpbGUsIGFyZ3MsIGVudikKKyAgICAgY2hhciAqZXhlY2ZpbGU7CisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGNoYXIgKiplbnY7Cit7CisjZGVmaW5lIE1BWF9UT0tFTlMgMjUKKyNkZWZpbmUgQlVGRkVSX1NJWkUgMjU2CisgICBpbnQJdG9rZW5fY291bnQ7CisgICBpbnQJcmVzdWx0OworICAgY2hhcgkqdG9rZW5bTUFYX1RPS0VOU107CisgICBjaGFyCWNtZF9saW5lW0JVRkZFUl9TSVpFXTsKKworICBpZiAoYXJncyAmJiAqYXJncykKKyAgICBlcnJvciAoIkNhbid0IHBhc3MgYXJndW1lbnRzIHRvIHJlbW90ZSBtbSBwcm9jZXNzICh5ZXQpLiIpOworCisgIGlmIChleGVjZmlsZSA9PSAwIC8qIHx8IGV4ZWNfYmZkID09IDAgKi8gKQorICAgIGVycm9yICgiTm8gZXhlY3V0YWJsZSBmaWxlIHNwZWNpZmllZCIpOworCisgIGlmICghbW1fc3RyZWFtKSB7CisgICAgICAgIHByaW50ZigiTWluaW1vbiBub3Qgb3BlbiB5ZXQuXG4iKTsKKwlyZXR1cm47CisgIH0KKworICAvKiBPbiB1bHRyYTMgKE5ZVSkgd2UgYXNzdW1lIHRoZSBrZXJuZWwgaXMgYWxyZWFkeSBydW5uaW5nIHNvIHRoZXJlIGlzCisgICAgIG5vIGZpbGUgdG8gZG93bmxvYWQuCisgICAgIEZJWE1FOiBGaXhlZCByZXF1aXJlZCBoZXJlIC0+IGxvYWQgeW91ciBwcm9ncmFtLCBwb3NzaWJseSB3aXRoIG1tX2xvYWQoKS4KKyAgICAgKi8KKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cCitBc3N1bWluZyB5b3UgYXJlIGF0IE5ZVSBkZWJ1Z2luZyBhIGtlcm5lbCwgaS5lLiwgbm8gbmVlZCB0byBkb3dubG9hZC5cblxuIik7CisKKyAgLyogV2Ugd2lsbCBnZXQgYSB0YXNrIHNwYXduIGV2ZW50IGltbWVkaWF0ZWx5LiAgKi8KKyAgaW5pdF93YWl0X2Zvcl9pbmZlcmlvciAoKTsKKyAgY2xlYXJfcHJvY2VlZF9zdGF0dXMgKCk7CisgIHN0b3Bfc29vbl9xdWlldGx5ID0gMTsKKyAgcHJvY2VlZCAoLTEsIFRBUkdFVF9TSUdOQUxfREVGQVVMVCwgMCk7CisgIG5vcm1hbF9zdG9wICgpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUkVNT1RFX01PVVJOX0lORkVSSU9SICovCitzdGF0aWMgdm9pZAorbW1fbW91cm4oKQoreworICAgICAgICBwb3BfdGFyZ2V0ICgpOyAgICAgICAgICAgICAgICAvKiBQb3AgYmFjayB0byBuby1jaGlsZCBzdGF0ZSAqLworICAgICAgICBnZW5lcmljX21vdXJuX2luZmVyaW9yICgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBkYW1uX2IKKyovCisvKiBUcmFuc2xhdGUgYmF1ZCByYXRlcyBmcm9tIGludGVnZXJzIHRvIGRhbW4gQl9jb2Rlcy4gIFVuaXggc2hvdWxkCisgICBoYXZlIG91dGdyb3duIHRoaXMgY3JhcCB5ZWFycyBhZ28sIGJ1dCBldmVuIFBPU0lYIHdvdWxkbid0IGJ1Y2sgaXQuICAqLworCisjaWZuZGVmIEIxOTIwMAorI2RlZmluZSBCMTkyMDAgRVhUQQorI2VuZGlmCisjaWZuZGVmIEIzODQwMAorI2RlZmluZSBCMzg0MDAgRVhUQgorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qge2ludCByYXRlLCBkYW1uX2I7fSBiYXVkdGFiW10gPSB7CisJezAsIEIwfSwKKwl7NTAsIEI1MH0sCisJezc1LCBCNzV9LAorCXsxMTAsIEIxMTB9LAorCXsxMzQsIEIxMzR9LAorCXsxNTAsIEIxNTB9LAorCXsyMDAsIEIyMDB9LAorCXszMDAsIEIzMDB9LAorCXs2MDAsIEI2MDB9LAorCXsxMjAwLCBCMTIwMH0sCisJezE4MDAsIEIxODAwfSwKKwl7MjQwMCwgQjI0MDB9LAorCXs0ODAwLCBCNDgwMH0sCisJezk2MDAsIEI5NjAwfSwKKwl7MTkyMDAsIEIxOTIwMH0sCisJezM4NDAwLCBCMzg0MDB9LAorCXstMSwgLTF9LAorfTsKKworc3RhdGljIGludCBkYW1uX2IgKHJhdGUpCisgICAgIGludCByYXRlOworeworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBiYXVkdGFiW2ldLnJhdGUgIT0gLTE7IGkrKykKKyAgICBpZiAocmF0ZSA9PSBiYXVkdGFiW2ldLnJhdGUpIHJldHVybiBiYXVkdGFiW2ldLmRhbW5fYjsKKyAgcmV0dXJuIEIzODQwMDsJLyogUmFuZG9tICovCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFJFTU9URV9PUEVOCisqKiBPcGVuIGEgY29ubmVjdGlvbiB0byByZW1vdGUgbWluaW1vbi4KKyAgIE5BTUUgaXMgdGhlIGZpbGVuYW1lIHVzZWQgZm9yIGNvbW11bmljYXRpb24sIHRoZW4gYSBzcGFjZSwKKyAgIHRoZW4gdGhlIGJhdWQgcmF0ZS4KKyAgICd0YXJnZXQgYWRhcHQgL2Rldi90dHlhIDk2MDAgW3Byb2duYW1dJyBmb3IgZXhhbXBsZS4KKyAqLworCitzdGF0aWMgY2hhciAqZGV2X25hbWU7CitpbnQgYmF1ZHJhdGUgPSA5NjAwOworc3RhdGljIHZvaWQKK21tX29wZW4gKG5hbWUsIGZyb21fdHR5KQorICAgICBjaGFyICpuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIFRFUk1JTkFMIHNnOworICB1bnNpZ25lZCBpbnQgcHJsOworICBjaGFyICpwOworCisgIC8qIEZpbmQgdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyLCBpdCBzZXBhcmF0ZXMgZGV2X25hbWUgZnJvbQorICAgICBwcm9nX25hbWUuICAqLworICBmb3IgKHAgPSBuYW1lOworICAgICAgIHAgJiYgKnAgJiYgIWlzc3BhY2UgKCpwKTsgcCsrKQorICAgIDsKKyAgaWYgKHAgPT0gMCB8fCAqcCA9PSAnXDAnKQorZXJyb2lkOgorICAgIGVycm9yICgiVXNhZ2UgOiA8Y29tbWFuZD4gPHNlcmlhbC1kZXZpY2U+IDxiYXVkLXJhdGU+IFtwcm9nbmFtZV0iKTsKKyAgZGV2X25hbWUgPSAoY2hhciopeG1hbGxvYyAocCAtIG5hbWUgKyAxKTsKKyAgc3RybmNweSAoZGV2X25hbWUsIG5hbWUsIHAgLSBuYW1lKTsKKyAgZGV2X25hbWVbcCAtIG5hbWVdID0gJ1wwJzsKKworICAvKiBTa2lwIG92ZXIgdGhlIHdoaXRlc3BhY2UgYWZ0ZXIgZGV2X25hbWUgKi8KKyAgZm9yICg7IGlzc3BhY2UgKCpwKTsgcCsrKQorICAgIC8qRU1QVFkqLzsKKyAgCisgIGlmICgxICE9IHNzY2FuZiAocCwgIiVkICIsICZiYXVkcmF0ZSkpCisgICAgZ290byBlcnJvaWQ7CisKKyAgLyogU2tpcCB0aGUgbnVtYmVyIGFuZCB0aGVuIHRoZSBzcGFjZXMgKi8KKyAgZm9yICg7IGlzZGlnaXQgKCpwKTsgcCsrKQorICAgIC8qRU1QVFkqLzsKKyAgZm9yICg7IGlzc3BhY2UgKCpwKTsgcCsrKQorICAgIC8qRU1QVFkqLzsKKyAgCisgIGlmIChwcm9nX25hbWUgIT0gTlVMTCkKKyAgICBmcmVlIChwcm9nX25hbWUpOworICBwcm9nX25hbWUgPSBzYXZlc3RyaW5nIChwLCBzdHJsZW4gKHApKTsKKworCisgIGlmIChtbV9kZXNjID49IDApCisgICAgY2xvc2UgKG1tX2Rlc2MpOworCisgIG1tX2Rlc2MgPSBvcGVuIChkZXZfbmFtZSwgT19SRFdSKTsKKyAgaWYgKG1tX2Rlc2MgPCAwKQorICAgIHBlcnJvcl93aXRoX25hbWUgKGRldl9uYW1lKTsKKyAgaW9jdGwgKG1tX2Rlc2MsIFRJT0NHRVRQLCAmc2cpOworI2lmZGVmIEhBVkVfVEVSTUlPCisgIHNnLmNfY2NbVk1JTl0gPSAwOwkJLyogcmVhZCB3aXRoIHRpbWVvdXQuICAqLworICBzZy5jX2NjW1ZUSU1FXSA9IHRpbWVvdXQgKiAxMDsKKyAgc2cuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8pOworICBzZy5jX2NmbGFnID0gKHNnLmNfY2ZsYWcgJiB+Q0JBVUQpIHwgZGFtbl9iIChiYXVkcmF0ZSk7CisjZWxzZQorICBzZy5zZ19pc3BlZWQgPSBkYW1uX2IgKGJhdWRyYXRlKTsKKyAgc2cuc2dfb3NwZWVkID0gZGFtbl9iIChiYXVkcmF0ZSk7CisgIHNnLnNnX2ZsYWdzIHw9IFJBVzsKKyAgc2cuc2dfZmxhZ3MgfD0gQU5ZUDsKKyAgc2cuc2dfZmxhZ3MgJj0gfkVDSE87CisjZW5kaWYKKworCisgIGlvY3RsIChtbV9kZXNjLCBUSU9DU0VUUCwgJnNnKTsKKyAgbW1fc3RyZWFtID0gZmRvcGVuIChtbV9kZXNjLCAicisiKTsKKworICBwdXNoX3RhcmdldCAoJm1tX29wcyk7CisKKyNpZm5kZWYgSEFWRV9URVJNSU8KKyNpZm5kZWYgTk9fU0lHSU5URVJSVVBUCisgIC8qIENhdXNlIFNJR0FMUk0ncyB0byBtYWtlIHJlYWRzIGZhaWwgd2l0aCBFSU5UUiBpbnN0ZWFkIG9mIHJlc3VtaW5nCisgICAgIHRoZSByZWFkLiAgKi8KKyAgaWYgKHNpZ2ludGVycnVwdCAoU0lHQUxSTSwgMSkgIT0gMCkKKyAgICBwZXJyb3IgKCJtbV9vcGVuOiBlcnJvciBpbiBzaWdpbnRlcnJ1cHQiKTsKKyNlbmRpZgorCisgIC8qIFNldCB1cCByZWFkIHRpbWVvdXQgdGltZXIuICAqLworICBpZiAoKHZvaWQgKCopKSBzaWduYWwgKFNJR0FMUk0sIG1tX3RpbWVyKSA9PSAodm9pZCAoKikpIC0xKQorICAgIHBlcnJvciAoIm1tX29wZW46IGVycm9yIGluIHNpZ25hbCIpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChMT0dfRklMRSkKKyAgbG9nX2ZpbGUgPSBmb3BlbiAoTE9HX0ZJTEUsICJ3Iik7CisgIGlmIChsb2dfZmlsZSA9PSBOVUxMKQorICAgIHBlcnJvcl93aXRoX25hbWUgKExPR19GSUxFKTsKKyNlbmRpZgorICAgLyoKKyAgICoqIEluaXRpYWxpemUgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIChnbG9iYWwpCisgICAqLworICAgRFJBSU5fSU5QVVQoKTsKKyAgIG91dF9tc2dfYnVmLT5jb25maWdfcmVxX21zZy5jb2RlID0gQ09ORklHX1JFUTsKKyAgIG91dF9tc2dfYnVmLT5jb25maWdfcmVxX21zZy5sZW5ndGggPSA0KjA7CisgICBtc2dfc2VuZF9zZXJpYWwob3V0X21zZ19idWYpOyAvKiBzZW5kIGNvbmZpZyByZXF1ZXN0IG1lc3NhZ2UgKi8KKworICAgZXhwZWN0X21zZyhDT05GSUcsaW5fbXNnX2J1ZiwxKTsKKworICBhMjlrX2dldF9wcm9jZXNzb3JfdHlwZSAoKTsKKworICAvKiBQcmludCBvdXQgc29tZSBzdHVmZiwgbGV0dGluZyB0aGUgdXNlciBub3cgd2hhdCdzIGdvaW5nIG9uICovCisgIHByaW50Zl9maWx0ZXJlZCgiQ29ubmVjdGVkIHRvIE1pbmlNb24gdmlhICVzLlxuIiwgZGV2X25hbWUpOworICAgIC8qIEZJWE1FOiBjYW4gdGhpcyByZXN0cmljdGlvbiBiZSByZW1vdmVkPyAqLworICBwcmludGZfZmlsdGVyZWQoIlJlbW90ZSBkZWJ1Z2dpbmcgdXNpbmcgdmlydHVhbCBhZGRyZXNzZXMgd29ya3Mgb25seVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXHR3aGVuIHZpcnR1YWwgYWRkcmVzc2VzIG1hcCAxOjEgdG8gcGh5c2ljYWwgYWRkcmVzc2VzLlxuIikKKzsKKyAgaWYgKHByb2Nlc3Nvcl90eXBlICE9IGEyOWtfZnJlZXplX21vZGUpIHsKKyAgICAgICAgZnByaW50Zl9maWx0ZXJlZChnZGJfc3RkZXJyLAorICAgICAgICAiRnJlZXplLW1vZGUgZGVidWdnaW5nIG5vdCBhdmFpbGFibGUsIGFuZCBjYW4gb25seSBiZSBkb25lIG9uIGFuIEEyOTA1MC5cbiIpOworICB9CisKKyAgIHRhcmdldF9jb25maWcuY29kZSA9IENPTkZJRzsKKyAgIHRhcmdldF9jb25maWcubGVuZ3RoID0gMDsKKyAgIHRhcmdldF9jb25maWcucHJvY2Vzc29yX2lkID0gaW5fbXNnX2J1Zi0+Y29uZmlnX21zZy5wcm9jZXNzb3JfaWQ7CisgICB0YXJnZXRfY29uZmlnLnZlcnNpb24gPSBpbl9tc2dfYnVmLT5jb25maWdfbXNnLnZlcnNpb247CisgICB0YXJnZXRfY29uZmlnLklfbWVtX3N0YXJ0ID0gaW5fbXNnX2J1Zi0+Y29uZmlnX21zZy5JX21lbV9zdGFydDsKKyAgIHRhcmdldF9jb25maWcuSV9tZW1fc2l6ZSA9IGluX21zZ19idWYtPmNvbmZpZ19tc2cuSV9tZW1fc2l6ZTsKKyAgIHRhcmdldF9jb25maWcuRF9tZW1fc3RhcnQgPSBpbl9tc2dfYnVmLT5jb25maWdfbXNnLkRfbWVtX3N0YXJ0OworICAgdGFyZ2V0X2NvbmZpZy5EX21lbV9zaXplID0gaW5fbXNnX2J1Zi0+Y29uZmlnX21zZy5EX21lbV9zaXplOworICAgdGFyZ2V0X2NvbmZpZy5ST01fc3RhcnQgPSBpbl9tc2dfYnVmLT5jb25maWdfbXNnLlJPTV9zdGFydDsKKyAgIHRhcmdldF9jb25maWcuUk9NX3NpemUgPSAgaW5fbXNnX2J1Zi0+Y29uZmlnX21zZy5ST01fc2l6ZTsKKyAgIHRhcmdldF9jb25maWcubWF4X21zZ19zaXplID0gaW5fbXNnX2J1Zi0+Y29uZmlnX21zZy5tYXhfbXNnX3NpemU7CisgICB0YXJnZXRfY29uZmlnLm1heF9ia3B0cyA9IGluX21zZ19idWYtPmNvbmZpZ19tc2cubWF4X2JrcHRzOworICAgdGFyZ2V0X2NvbmZpZy5jb3Byb2Nlc3NvciA9IGluX21zZ19idWYtPmNvbmZpZ19tc2cuY29wcm9jZXNzb3I7CisgICB0YXJnZXRfY29uZmlnLnJlc2VydmVkID0gaW5fbXNnX2J1Zi0+Y29uZmlnX21zZy5yZXNlcnZlZDsKKyAgIGlmIChmcm9tX3R0eSkgeworICAgCXByaW50ZigiQ29ubmVjdGVkIHRvIE1pbmlNT04gOlxuIik7CisJcHJpbnRmKCIgICAgRGVidWdjb3JlIHZlcnNpb24gICAgICAgICAgICAlZC4lZFxuIiwKKwkJMHgwZiAmICh0YXJnZXRfY29uZmlnLnZlcnNpb24gPj4gNCksCisJCTB4MGYgJiAodGFyZ2V0X2NvbmZpZy52ZXJzaW9uICkgKTsKKwlwcmludGYoIiAgICBDb25maWd1cmF0aW9uIHZlcnNpb24gICAgICAgICVkLiVkXG4iLAorCQkweDBmICYgKHRhcmdldF9jb25maWcudmVyc2lvbiA+PiAxMiksCisJCTB4MGYgJiAodGFyZ2V0X2NvbmZpZy52ZXJzaW9uID4+ICA4KSApOworCXByaW50ZigiICAgIE1lc3NhZ2Ugc3lzdGVtIHZlcnNpb24gICAgICAgJWQuJWRcbiIsCisJCTB4MGYgJiAodGFyZ2V0X2NvbmZpZy52ZXJzaW9uID4+IDIwKSwKKwkJMHgwZiAmICh0YXJnZXRfY29uZmlnLnZlcnNpb24gPj4gMTYpICk7CisJcHJpbnRmKCIgICAgQ29tbXVuaWNhdGlvbiBkcml2ZXIgdmVyc2lvbiAlZC4lZFxuIiwKKwkJMHgwZiAmICh0YXJnZXRfY29uZmlnLnZlcnNpb24gPj4gMjgpLAorCQkweDBmICYgKHRhcmdldF9jb25maWcudmVyc2lvbiA+PiAyNCkgKTsKKyAgIH0KKworICAvKiBMZWF2ZSB0aGUgdGFyZ2V0IHJ1bm5pbmcuLi4gCisgICAqIFRoZSBhYm92ZSBtZXNzYWdlIHN0b3BwZWQgdGhlIHRhcmdldCBpbiB0aGUgZGJnIGNvcmUgKE1pbmlNb24pLCAgCisgICAqIHNvIHJlc3RhcnQgdGhlIHRhcmdldCBvdXQgb2YgTWluaU1vbiwgCisgICAqLworICBvdXRfbXNnX2J1Zi0+Z29fbXNnLmNvZGUgPSBHTzsKKyAgb3V0X21zZ19idWYtPmdvX21zZy5sZW5ndGggPSAwOworICBtc2dfc2VuZF9zZXJpYWwob3V0X21zZ19idWYpOworICAvKiBObyBtZXNzYWdlIHRvIGV4cGVjdCBhZnRlciBhIEdPICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFJFTU9URV9DTE9TRQorKiogQ2xvc2UgdGhlIG9wZW4gY29ubmVjdGlvbiB0byB0aGUgbWluaW1vbiBkZWJ1Z2dlci4KKyAgIFVzZSB0aGlzIHdoZW4geW91IHdhbnQgdG8gZGV0YWNoIGFuZCBkbyBzb21ldGhpbmcgZWxzZQorICAgd2l0aCB5b3VyIGdkYi4gICovCitzdGF0aWMgdm9pZAorbW1fY2xvc2UgKHF1aXR0aW5nKQkvKkZJWE1FOiBob3cgaXMgcXVpdHRpbmcgdXNlZCAqLworICAgICBpbnQgcXVpdHRpbmc7Cit7CisgIGlmIChtbV9kZXNjIDwgMCkKKyAgICBlcnJvciAoIkNhbid0IGNsb3NlIHJlbW90ZSBjb25uZWN0aW9uOiBub3QgZGVidWdnaW5nIHJlbW90ZWx5LiIpOworCisgIC8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSBpZiB0aGVyZSBpc24ndCBzb21ldGhpbmcgdmFsaWQgaW4KKyAgICAgbW1fZGVzYyBhbmQgbW1fc3RyZWFtLiAgCisKKyAgICAgRHVlIHRvIGEgYnVnIGluIFVuaXgsIGZjbG9zZSBjbG9zZXMgbm90IG9ubHkgdGhlIHN0ZGlvIHN0cmVhbSwKKyAgICAgYnV0IGFsc28gdGhlIGZpbGUgZGVzY3JpcHRvci4gIFNvIHdlIGRvbid0IGFjdHVhbGx5IGNsb3NlCisgICAgIG1tX2Rlc2MuICAqLworICBEUkFJTl9JTlBVVCgpOworICBmY2xvc2UgKG1tX3N0cmVhbSk7CQorICAvKiBjbG9zZSAobW1fZGVzYyk7ICovCisKKyAgLyogRG8gbm90IHRyeSB0byBjbG9zZSBtbV9kZXNjIGFnYWluLCBsYXRlciBpbiB0aGUgcHJvZ3JhbS4gICovCisgIG1tX3N0cmVhbSA9IE5VTEw7CisgIG1tX2Rlc2MgPSAtMTsKKworI2lmIGRlZmluZWQgKExPR19GSUxFKQorICBpZiAoZmVycm9yIChsb2dfZmlsZSkpCisgICAgcHJpbnRmICgiRXJyb3Igd3JpdGluZyBsb2cgZmlsZS5cbiIpOworICBpZiAoZmNsb3NlIChsb2dfZmlsZSkgIT0gMCkKKyAgICBwcmludGYgKCJFcnJvciBjbG9zaW5nIGxvZyBmaWxlLlxuIik7CisjZW5kaWYKKworICBwcmludGYgKCJFbmRpbmcgcmVtb3RlIGRlYnVnZ2luZ1xuIik7Cit9IAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBSRU1PVEVfQVRBQ0ggKi8KKy8qIEF0dGFjaCB0byBhIHByb2dyYW0gdGhhdCBpcyBhbHJlYWR5IGxvYWRlZCBhbmQgcnVubmluZyAKKyAqIFVwb24gZXhpdGluZyB0aGUgcHJvY2VzcydzIGV4ZWN1dGlvbiBpcyBzdG9wcGVkLgorICovCitzdGF0aWMgdm9pZAorbW1fYXR0YWNoIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworCisgIGlmICghbW1fc3RyZWFtKQorICAgICAgZXJyb3IgKCJNaW5pTW9uIG5vdCBvcGVuZWQgeWV0LCB1c2UgdGhlICd0YXJnZXQgbWluaW1vbicgY29tbWFuZC5cbiIpOworCQorICBpZiAoZnJvbV90dHkpCisgICAgICBwcmludGYgKCJBdHRhY2hpbmcgdG8gcmVtb3RlIHByb2dyYW0gJXMuLi5cbiIsIHByb2dfbmFtZSk7CisKKyAgLyogTWFrZSBzdXJlIHRoZSB0YXJnZXQgaXMgY3VycmVudGx5IHJ1bm5pbmcsIGl0IGlzIHN1cHBvc2VkIHRvIGJlLiAqLworICAvKiBGSVhNRTogaXMgaXQgb2sgdG8gc2VuZCBNaW5pTW9uIGEgQlJFQUsgaWYgaXQgaXMgYWxyZWFkeSBzdG9wcGVkIGluIAorICAgKiAJdGhlIGRiZyBjb3JlLiAgSWYgc28sIHdlIGRvbid0IG5lZWQgdG8gc2VuZCB0aGlzIEdPLgorICAgKi8KKyAgb3V0X21zZ19idWYtPmdvX21zZy5jb2RlID0gR087CisgIG91dF9tc2dfYnVmLT5nb19tc2cubGVuZ3RoID0gMDsKKyAgbXNnX3NlbmRfc2VyaWFsKG91dF9tc2dfYnVmKTsKKyAgc2xlZXAoMik7CS8qIEF0IHRoZSB3b3JzdCBpdCB3aWxsIHN0b3AsIHJlY2VpdmUgYSBtZXNzYWdlLCBjb250aW51ZSAqLworIAorICAvKiBTZW5kIHRoZSBtbSBhIGJyZWFrLiAqLyAKKyAgb3V0X21zZ19idWYtPmJyZWFrX21zZy5jb2RlID0gQlJFQUs7CisgIG91dF9tc2dfYnVmLT5icmVha19tc2cubGVuZ3RoID0gMDsKKyAgbXNnX3NlbmRfc2VyaWFsKG91dF9tc2dfYnVmKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFJFTU9URV9ERVRBQ0ggKi8KKy8qIFRlcm1pbmF0ZSB0aGUgb3BlbiBjb25uZWN0aW9uIHRvIHRoZSByZW1vdGUgZGVidWdnZXIuCisgICBVc2UgdGhpcyB3aGVuIHlvdSB3YW50IHRvIGRldGFjaCBhbmQgZG8gc29tZXRoaW5nIGVsc2UKKyAgIHdpdGggeW91ciBnZGIuICBMZWF2ZSByZW1vdGUgcHJvY2VzcyBydW5uaW5nICh3aXRoIG5vIGJyZWFrcG9pbnRzIHNldCkuICovCitzdGF0aWMgdm9pZAorbW1fZGV0YWNoIChhcmdzLGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHJlbW92ZV9icmVha3BvaW50cygpOwkJLyogSnVzdCBpbiBjYXNlIHRoZXJlIHdlcmUgYW55IGxlZnQgaW4gKi8KKyAgb3V0X21zZ19idWYtPmdvX21zZy5jb2RlID0gR087CisgIG91dF9tc2dfYnVmLT5nb19tc2cubGVuZ3RoID0gMDsKKyAgbXNnX3NlbmRfc2VyaWFsKG91dF9tc2dfYnVmKTsKKyAgcG9wX3RhcmdldCgpOyAgICAgICAgIAkvKiBjYWxscyBtbV9jbG9zZSB0byBkbyB0aGUgcmVhbCB3b3JrICovCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBSRU1PVEVfUkVTVU1FCisqKiBUZWxsIHRoZSByZW1vdGUgbWFjaGluZSB0byByZXN1bWUuICAqLworCitzdGF0aWMgdm9pZAorbW1fcmVzdW1lIChwaWQsIHN0ZXAsIHNpZykKKyAgICAgaW50IHBpZCwgc3RlcDsKKyAgICAgZW51bSB0YXJnZXRfc2lnbmFsIHNpZzsKK3sKKyAgaWYgKHNpZyAhPSBUQVJHRVRfU0lHTkFMXzApCisgICAgd2FybmluZyAoIkNhbid0IHNlbmQgc2lnbmFscyB0byBhIHJlbW90ZSBNaW5pTW9uIHN5c3RlbS4iKTsKKworICBpZiAoc3RlcCkgeworICAgICAgb3V0X21zZ19idWYtPnN0ZXBfbXNnLmNvZGU9IFNURVA7CisgICAgICBvdXRfbXNnX2J1Zi0+c3RlcF9tc2cubGVuZ3RoID0gMSo0OworICAgICAgb3V0X21zZ19idWYtPnN0ZXBfbXNnLmNvdW50ID0gMTsJCS8qIHN0ZXAgMSBpbnN0cnVjdGlvbiAqLworICAgICAgbXNnX3NlbmRfc2VyaWFsKG91dF9tc2dfYnVmKTsKKyAgfSBlbHNlIHsKKyAgICAgIG91dF9tc2dfYnVmLT5nb19tc2cuY29kZT0gR087CisgICAgICBvdXRfbXNnX2J1Zi0+Z29fbXNnLmxlbmd0aCA9IDA7CisgICAgICBtc2dfc2VuZF9zZXJpYWwob3V0X21zZ19idWYpOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBSRU1PVEVfV0FJVAorKiogV2FpdCB1bnRpbCB0aGUgcmVtb3RlIG1hY2hpbmUgc3RvcHMsIHRoZW4gcmV0dXJuLAorICAgc3RvcmluZyBzdGF0dXMgaW4gU1RBVFVTIGp1c3QgYXMgYHdhaXQnIHdvdWxkLiAgKi8KKworc3RhdGljIGludAorbW1fd2FpdCAoc3RhdHVzKQorICAgICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0YXR1czsKK3sKKyAgaW50IGksIHJlc3VsdDsKKyAgaW50IG9sZF90aW1lb3V0ID0gdGltZW91dDsKKyAgaW50IG9sZF9pbW1lZGlhdGVfcXVpdCA9IGltbWVkaWF0ZV9xdWl0OworCisgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9FWElURUQ7CisgIHN0YXR1cy0+dmFsdWUuaW50ZWdlciA9IDA7CisKKy8qIHdhaXQgZm9yIG1lc3NhZ2UgdG8gYXJyaXZlLiBJdCBzaG91bGQgYmU6CisJLSBBIEhJRiBzZXJ2aWNlIHJlcXVlc3QuCisJLSBBIEhJRiBleGl0IHNlcnZpY2UgcmVxdWVzdC4KKwktIEEgQ0hBTk5FTDBfQUNLLgorCS0gQSBDSEFOTkVMMSByZXF1ZXN0LgorCS0gYSBkZWJ1Z2NvcmUgSEFMVCBtZXNzYWdlLgorICBISUYgc2VydmljZXMgbXVzdCBiZSByZXNwb25kZWQgdG9vLCBhbmQgd2hpbGUtbG9vcGluZyBjb250aW51ZWQuCisgIElmIHRoZSB0YXJnZXQgc3RvcHMgZXhlY3V0aW5nLCBtbV93YWl0KCkgc2hvdWxkIHJldHVybi4KKyovCisgIHRpbWVvdXQgPSAwOwkvKiBXYWl0IGluZGVmaW5ldGx5IGZvciBhIG1lc3NhZ2UgKi8KKyAgaW1tZWRpYXRlX3F1aXQgPSAxOyAgIC8qIEhlbHBzIGFiaWxpdHkgdG8gUVVJVCAqLworICB3aGlsZSgxKQorICB7CisgICAgd2hpbGUobXNnX3JlY3Zfc2VyaWFsKGluX21zZ19idWYpKSB7CisgICAgCVFVSVQ7CS8qIExldCB1c2VyIHF1aXQgaWYgdGhleSB3YW50ICovCisgICAgfQorICAgIHN3aXRjaCAoaW5fbXNnX2J1Zi0+aGFsdF9tc2cuY29kZSkKKyAgICB7CisgICAgY2FzZSBISUZfQ0FMTDoKKwlpID0gaW5fbXNnX2J1Zi0+aGlmX2NhbGxfcnRuX21zZy5zZXJ2aWNlX251bWJlcjsKKwlyZXN1bHQ9c2VydmljZV9ISUYoaW5fbXNnX2J1Zik7CisgICAJaWYoaSA9PSAxKSAvKiBFWElUICovCisJICAgIGdvdG8gZXhpdDsKKwlpZihyZXN1bHQpCisJICAgIHByaW50ZigiV2FybmluZzogZmFpbHVyZSBkdXJpbmcgSElGIHNlcnZpY2UgJWRcbiIsIGkpOworCWJyZWFrOworICAgIGNhc2UgQ0hBTk5FTDBfQUNLOgorCXNlcnZpY2VfSElGKGluX21zZ19idWYpOworCWJyZWFrOworICAgIGNhc2UgQ0hBTk5FTDE6CisgICAgICAgIGk9aW5fbXNnX2J1Zi0+Y2hhbm5lbDFfbXNnLmxlbmd0aDsKKyAgICAgICAgaW5fbXNnX2J1Zi0+Y2hhbm5lbDFfbXNnLmRhdGFbaV0gPSAnXDAnOworICAgICAgICBwcmludGYoIiVzIiwgaW5fbXNnX2J1Zi0+Y2hhbm5lbDFfbXNnLmRhdGEpOworCWdkYl9mbHVzaChnZGJfc3Rkb3V0KTsKKyAgICAgICAgLyogU2VuZCBDSEFOTkVMMV9BQ0sgbWVzc2FnZSAqLworICAgICAgICBvdXRfbXNnX2J1Zi0+Y2hhbm5lbDFfYWNrX21zZy5jb2RlID0gQ0hBTk5FTDFfQUNLOworICAgICAgICBvdXRfbXNnX2J1Zi0+Y2hhbm5lbDFfYWNrX21zZy5sZW5ndGggPSAwOworICAgICAgICByZXN1bHQgPSBtc2dfc2VuZF9zZXJpYWwob3V0X21zZ19idWYpOworCWJyZWFrOworICAgIGNhc2UgSEFMVDoKKwlnb3RvIGhhbHRlZDsKKyAgICBkZWZhdWx0OgorCWdvdG8gaGFsdGVkOworICAgIH0KKyAgfQoraGFsdGVkOgorICAvKiBGSVhNRSwgdGhlc2UgcHJpbnRmcyBzaG91bGQgbm90IGJlIGhlcmUuICBUaGlzIGlzIGEgc291cmNlIGxldmVsIAorICAgICBkZWJ1Z2dlciwgZ3V5cyEgICovCisgIGlmIChpbl9tc2dfYnVmLT5oYWx0X21zZy50cmFwX251bWJlcj09IDApCisgIHsgcHJpbnRmKCJBbTI5MCowIHJlY2VpdmVkIHZlY3RvciBudW1iZXIgJWQgKGJyZWFrIHBvaW50KVxuIiwKKwlpbl9tc2dfYnVmLT5oYWx0X21zZy50cmFwX251bWJlcik7CisgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1RSQVA7CisgIH0KKyAgZWxzZSBpZiAoaW5fbXNnX2J1Zi0+aGFsdF9tc2cudHJhcF9udW1iZXI9PSAxKQorICAgIHsKKyAgICAgIHByaW50ZigiQW0yOTAqMCByZWNlaXZlZCB2ZWN0b3IgbnVtYmVyICVkXG4iLAorCSAgICAgaW5fbXNnX2J1Zi0+aGFsdF9tc2cudHJhcF9udW1iZXIpOworICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfQlVTOworICAgIH0KKyAgZWxzZSBpZiAoaW5fbXNnX2J1Zi0+aGFsdF9tc2cudHJhcF9udW1iZXI9PSAzCisgICAgICAgIHx8IGluX21zZ19idWYtPmhhbHRfbXNnLnRyYXBfbnVtYmVyPT0gNCkKKyAgeyBwcmludGYoIkFtMjkwKjAgcmVjZWl2ZWQgdmVjdG9yIG51bWJlciAlZFxuIiwKKwlpbl9tc2dfYnVmLT5oYWx0X21zZy50cmFwX251bWJlcik7CisgICAgICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKyAgICAgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9GUEU7CisgIH0KKyAgZWxzZSBpZiAoaW5fbXNnX2J1Zi0+aGFsdF9tc2cudHJhcF9udW1iZXI9PSA1KQorICB7IHByaW50ZigiQW0yOTAqMCByZWNlaXZlZCB2ZWN0b3IgbnVtYmVyICVkXG4iLAorCWluX21zZ19idWYtPmhhbHRfbXNnLnRyYXBfbnVtYmVyKTsKKyAgICAgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOworICAgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX0lMTDsKKyAgfQorICBlbHNlIGlmIChpbl9tc2dfYnVmLT5oYWx0X21zZy50cmFwX251bWJlciA+PSA2CisgICAgICAgICYmIGluX21zZ19idWYtPmhhbHRfbXNnLnRyYXBfbnVtYmVyIDw9IDExKQorICB7IHByaW50ZigiQW0yOTAqMCByZWNlaXZlZCB2ZWN0b3IgbnVtYmVyICVkXG4iLAorCWluX21zZ19idWYtPmhhbHRfbXNnLnRyYXBfbnVtYmVyKTsKKyAgICAgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOworICAgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1NFR1Y7CisgIH0KKyAgZWxzZSBpZiAoaW5fbXNnX2J1Zi0+aGFsdF9tc2cudHJhcF9udW1iZXI9PSAxMgorICAgICAgICB8fCBpbl9tc2dfYnVmLT5oYWx0X21zZy50cmFwX251bWJlcj09IDEzKQorICB7IHByaW50ZigiQW0yOTAqMCByZWNlaXZlZCB2ZWN0b3IgbnVtYmVyICVkXG4iLAorCWluX21zZ19idWYtPmhhbHRfbXNnLnRyYXBfbnVtYmVyKTsKKyAgICAgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOworICAgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX0lMTDsKKyAgfQorICBlbHNlIGlmIChpbl9tc2dfYnVmLT5oYWx0X21zZy50cmFwX251bWJlcj09IDE0KQorICB7IHByaW50ZigiQW0yOTAqMCByZWNlaXZlZCB2ZWN0b3IgbnVtYmVyICVkXG4iLAorCWluX21zZ19idWYtPmhhbHRfbXNnLnRyYXBfbnVtYmVyKTsKKyAgICAgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOworICAgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX0FMUk07CisgIH0KKyAgZWxzZSBpZiAoaW5fbXNnX2J1Zi0+aGFsdF9tc2cudHJhcF9udW1iZXI9PSAxNSkKKyAgICB7CisgICAgICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKyAgICAgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQOworICAgIH0KKyAgZWxzZSBpZiAoaW5fbXNnX2J1Zi0+aGFsdF9tc2cudHJhcF9udW1iZXIgPj0gMTYKKyAgICAgICAgJiYgaW5fbXNnX2J1Zi0+aGFsdF9tc2cudHJhcF9udW1iZXIgPD0gMjEpCisgIHsgcHJpbnRmKCJBbTI5MCowIHJlY2VpdmVkIHZlY3RvciBudW1iZXIgJWRcbiIsCisJaW5fbXNnX2J1Zi0+aGFsdF9tc2cudHJhcF9udW1iZXIpOworICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfSU5UOworICB9CisgIGVsc2UgaWYgKGluX21zZ19idWYtPmhhbHRfbXNnLnRyYXBfbnVtYmVyPT0gMjIpCisgIHsgcHJpbnRmKCJBbTI5MCowIHJlY2VpdmVkIHZlY3RvciBudW1iZXIgJWRcbiIsCisJaW5fbXNnX2J1Zi0+aGFsdF9tc2cudHJhcF9udW1iZXIpOworICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfSUxMOworICB9IC8qIEJSRUFLIG1lc3NhZ2Ugd2FzIHNlbnQgKi8KKyAgZWxzZSBpZiAoaW5fbXNnX2J1Zi0+aGFsdF9tc2cudHJhcF9udW1iZXI9PSA3NSkKKyAgICB7CisgICAgICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKyAgICAgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQOworICAgIH0KKyAgZWxzZQorZXhpdDoKKyAgICB7CisgICAgICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVEOworICAgICAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gMDsKKyAgICB9CisKKyAgdGltZW91dCA9IG9sZF90aW1lb3V0OwkvKiBSZXN0b3JlIG9yaWdpbmFsIHRpbWVvdXQgdmFsdWUgKi8KKyAgaW1tZWRpYXRlX3F1aXQgPSBvbGRfaW1tZWRpYXRlX3F1aXQ7CisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBSRU1PVEVfRkVUQ0hfUkVHSVNURVJTCisgKiBSZWFkIGEgcmVtb3RlIHJlZ2lzdGVyICdyZWdubycuIAorICogSWYgcmVnbm89PS0xIHRoZW4gcmVhZCBhbGwgdGhlIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIHZvaWQgCittbV9mZXRjaF9yZWdpc3RlcnMgKHJlZ25vKQoraW50CXJlZ25vOworeworICBJTlQzMiAqZGF0YV9wOworCisgIGlmIChyZWdubyA+PSAwKSAgeworCWZldGNoX3JlZ2lzdGVyKHJlZ25vKTsKKwlyZXR1cm47CisgIH0KKworLyogR3IxL3JzcCAqLworICBvdXRfbXNnX2J1Zi0+cmVhZF9yZXFfbXNnLmJ5dGVfY291bnQgPSA0KjE7CisgIG91dF9tc2dfYnVmLT5yZWFkX3JlcV9tc2cubWVtb3J5X3NwYWNlID0gR0xPQkFMX1JFRzsKKyAgb3V0X21zZ19idWYtPnJlYWRfcmVxX21zZy5hZGRyZXNzID0gMTsKKyAgbXNnX3NlbmRfc2VyaWFsKG91dF9tc2dfYnVmKTsKKyAgZXhwZWN0X21zZyhSRUFEX0FDSyxpbl9tc2dfYnVmLDEpOworICBkYXRhX3AgPSAmKGluX21zZ19idWYtPnJlYWRfcl9hY2tfbXNnLmRhdGFbMF0pOworICBzdXBwbHlfcmVnaXN0ZXIgKEdSMV9SRUdOVU0gLCBkYXRhX3ApOworCisjaWYgZGVmaW5lZChHUjY0X1JFR05VTSkJLyogUmVhZCBncjY0LTEyNyAqLworLyogR2xvYmFsIFJlZ2lzdGVycyBncjY0LWdyOTUgKi8gCisgIG91dF9tc2dfYnVmLT5yZWFkX3JlcV9tc2cuY29kZT0gUkVBRF9SRVE7CisgIG91dF9tc2dfYnVmLT5yZWFkX3JlcV9tc2cubGVuZ3RoID0gNCozOworICBvdXRfbXNnX2J1Zi0+cmVhZF9yZXFfbXNnLmJ5dGVfY291bnQgPSA0KjMyOworICBvdXRfbXNnX2J1Zi0+cmVhZF9yZXFfbXNnLm1lbW9yeV9zcGFjZSA9IEdMT0JBTF9SRUc7CisgIG91dF9tc2dfYnVmLT5yZWFkX3JlcV9tc2cuYWRkcmVzcyA9IDY0OworICBtc2dfc2VuZF9zZXJpYWwob3V0X21zZ19idWYpOworICBleHBlY3RfbXNnKFJFQURfQUNLLGluX21zZ19idWYsMSk7CisgIGRhdGFfcCA9ICYoaW5fbXNnX2J1Zi0+cmVhZF9yX2Fja19tc2cuZGF0YVswXSk7CisKKyAgZm9yIChyZWdubz1HUjY0X1JFR05VTTsgcmVnbm88R1I2NF9SRUdOVU0rMzI7IHJlZ25vKyspIHsKKyAgICAgIHN1cHBseV9yZWdpc3RlciAocmVnbm8sIGRhdGFfcCsrKTsKKyAgfQorI2VuZGlmCS8qICBHUjY0X1JFR05VTSAqLworCisvKiBHbG9iYWwgUmVnaXN0ZXJzIGdyOTYtZ3IxMjcgKi8gCisgIG91dF9tc2dfYnVmLT5yZWFkX3JlcV9tc2cuY29kZT0gUkVBRF9SRVE7CisgIG91dF9tc2dfYnVmLT5yZWFkX3JlcV9tc2cubGVuZ3RoID0gNCozOworICBvdXRfbXNnX2J1Zi0+cmVhZF9yZXFfbXNnLmJ5dGVfY291bnQgPSA0ICogMzI7CisgIG91dF9tc2dfYnVmLT5yZWFkX3JlcV9tc2cubWVtb3J5X3NwYWNlID0gR0xPQkFMX1JFRzsKKyAgb3V0X21zZ19idWYtPnJlYWRfcmVxX21zZy5hZGRyZXNzID0gOTY7CisgIG1zZ19zZW5kX3NlcmlhbChvdXRfbXNnX2J1Zik7CisgIGV4cGVjdF9tc2coUkVBRF9BQ0ssaW5fbXNnX2J1ZiwxKTsKKyAgZGF0YV9wID0gJihpbl9tc2dfYnVmLT5yZWFkX3JfYWNrX21zZy5kYXRhWzBdKTsKKworICBmb3IgKHJlZ25vPUdSOTZfUkVHTlVNOyByZWdubzxHUjk2X1JFR05VTSszMjsgcmVnbm8rKykgeworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgZGF0YV9wKyspOworICB9CisKKy8qIExvY2FsIFJlZ2lzdGVycyAqLyAKKyAgb3V0X21zZ19idWYtPnJlYWRfcmVxX21zZy5ieXRlX2NvdW50ID0gNCAqICgxMjgpOworICBvdXRfbXNnX2J1Zi0+cmVhZF9yZXFfbXNnLm1lbW9yeV9zcGFjZSA9IExPQ0FMX1JFRzsKKyAgb3V0X21zZ19idWYtPnJlYWRfcmVxX21zZy5hZGRyZXNzID0gMDsKKyAgbXNnX3NlbmRfc2VyaWFsKG91dF9tc2dfYnVmKTsKKyAgZXhwZWN0X21zZyhSRUFEX0FDSyxpbl9tc2dfYnVmLDEpOworICBkYXRhX3AgPSAmKGluX21zZ19idWYtPnJlYWRfcl9hY2tfbXNnLmRhdGFbMF0pOworCisgIGZvciAocmVnbm89TFIwX1JFR05VTTsgcmVnbm88TFIwX1JFR05VTSsxMjg7IHJlZ25vKyspIHsKKyAgICAgIHN1cHBseV9yZWdpc3RlciAocmVnbm8sIGRhdGFfcCsrKTsKKyAgfQorCisvKiBQcm90ZWN0ZWQgU3BlY2lhbCBSZWdpc3RlcnMgKi8gCisgIG91dF9tc2dfYnVmLT5yZWFkX3JlcV9tc2cuYnl0ZV9jb3VudCA9IDQqMTU7CisgIG91dF9tc2dfYnVmLT5yZWFkX3JlcV9tc2cubWVtb3J5X3NwYWNlID0gU1BFQ0lBTF9SRUc7CisgIG91dF9tc2dfYnVmLT5yZWFkX3JlcV9tc2cuYWRkcmVzcyA9IDA7CisgIG1zZ19zZW5kX3NlcmlhbCggb3V0X21zZ19idWYpOworICBleHBlY3RfbXNnKFJFQURfQUNLLGluX21zZ19idWYsMSk7CisgIGRhdGFfcCA9ICYoaW5fbXNnX2J1Zi0+cmVhZF9yX2Fja19tc2cuZGF0YVswXSk7CisKKyAgZm9yIChyZWdubz0wOyByZWdubzw9MTQ7IHJlZ25vKyspIHsKKyAgICAgIHN1cHBseV9yZWdpc3RlciAoU1JfUkVHTlVNKHJlZ25vKSwgZGF0YV9wKyspOworICB9CisgIGlmIChVU0VfU0hBRE9XX1BDKSB7CS8qIExldCByZWdub190b19zcm51bSgpIGhhbmRsZSB0aGUgcmVnaXN0ZXIgbnVtYmVyICovCisJZmV0Y2hfcmVnaXN0ZXIoTlBDX1JFR05VTSk7CisJZmV0Y2hfcmVnaXN0ZXIoUENfUkVHTlVNKTsKKwlmZXRjaF9yZWdpc3RlcihQQzJfUkVHTlVNKTsKKyAgfQorCisvKiBVbnByb3RlY3RlZCBTcGVjaWFsIFJlZ2lzdGVycyAqLyAKKyAgb3V0X21zZ19idWYtPnJlYWRfcmVxX21zZy5ieXRlX2NvdW50ID0gNCo4OworICBvdXRfbXNnX2J1Zi0+cmVhZF9yZXFfbXNnLm1lbW9yeV9zcGFjZSA9IFNQRUNJQUxfUkVHOworICBvdXRfbXNnX2J1Zi0+cmVhZF9yZXFfbXNnLmFkZHJlc3MgPSAxMjg7CisgIG1zZ19zZW5kX3NlcmlhbCggb3V0X21zZ19idWYpOworICBleHBlY3RfbXNnKFJFQURfQUNLLGluX21zZ19idWYsMSk7CisgIGRhdGFfcCA9ICYoaW5fbXNnX2J1Zi0+cmVhZF9yX2Fja19tc2cuZGF0YVswXSk7CisKKyAgZm9yIChyZWdubz0xMjg7IHJlZ25vPD0xMzU7IHJlZ25vKyspIHsKKyAgICAgIHN1cHBseV9yZWdpc3RlciAoU1JfUkVHTlVNKHJlZ25vKSwgZGF0YV9wKyspOworICB9CisKKyAgLyogVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSB3YXkgdG8gZ2V0IHRoZXNlLiAgKi8KKyAgeworICAgIGludCB2YWwgPSAtMTsKKyAgICBzdXBwbHlfcmVnaXN0ZXIgKEZQRV9SRUdOVU0sICZ2YWwpOworICAgIHN1cHBseV9yZWdpc3RlciAoSU5URV9SRUdOVU0sICZ2YWwpOworICAgIHN1cHBseV9yZWdpc3RlciAoRlBTX1JFR05VTSwgJnZhbCk7CisgICAgc3VwcGx5X3JlZ2lzdGVyIChFWE9fUkVHTlVNLCAmdmFsKTsKKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUkVNT1RFX1NUT1JFX1JFR0lTVEVSUworICogU3RvcmUgcmVnaXN0ZXIgcmVnbm8gaW50byB0aGUgdGFyZ2V0LiAgCisgKiBJZiByZWdubz09LTEgdGhlbiBzdG9yZSBhbGwgdGhlIHJlZ2lzdGVycy4KKyAqIFJlc3VsdCBpcyAwIGZvciBzdWNjZXNzLCAtMSBmb3IgZmFpbHVyZS4KKyAqLworCitzdGF0aWMgdm9pZAorbW1fc3RvcmVfcmVnaXN0ZXJzIChyZWdubykKK2ludCByZWdubzsKK3sKKyAgaW50IHJlc3VsdDsKKyAgCisgIGlmIChyZWdubyA+PSAwKSB7CisgICAgc3RvcmVfcmVnaXN0ZXIocmVnbm8pOworICAgIHJldHVybjsKKyAgfQorCisgIHJlc3VsdCA9IDA7CisKKyAgb3V0X21zZ19idWYtPndyaXRlX3JfbXNnLmNvZGU9IFdSSVRFX1JFUTsKKworLyogR3IxL3JzcCAqLworICBvdXRfbXNnX2J1Zi0+d3JpdGVfcl9tc2cuYnl0ZV9jb3VudCA9IDQqMTsKKyAgb3V0X21zZ19idWYtPndyaXRlX3JfbXNnLmxlbmd0aCA9IDMqNCArIG91dF9tc2dfYnVmLT53cml0ZV9yX21zZy5ieXRlX2NvdW50OworICBvdXRfbXNnX2J1Zi0+d3JpdGVfcl9tc2cubWVtb3J5X3NwYWNlID0gR0xPQkFMX1JFRzsKKyAgb3V0X21zZ19idWYtPndyaXRlX3JfbXNnLmFkZHJlc3MgPSAxOworICBvdXRfbXNnX2J1Zi0+d3JpdGVfcl9tc2cuZGF0YVswXSA9IHJlYWRfcmVnaXN0ZXIgKEdSMV9SRUdOVU0pOworCisgIG1zZ19zZW5kX3NlcmlhbCggb3V0X21zZ19idWYpOworICBpZiAoIWV4cGVjdF9tc2coV1JJVEVfQUNLLGluX21zZ19idWYsMSkpIHsKKwlyZXN1bHQgPSAtMTsKKyAgfQorCisjaWYgZGVmaW5lZChHUjY0X1JFR05VTSkKKy8qIEdsb2JhbCByZWdpc3RlcnMgZ3I2NC1ncjk1ICovCisgIG91dF9tc2dfYnVmLT53cml0ZV9yX21zZy5ieXRlX2NvdW50ID0gNCogKDMyKTsKKyAgb3V0X21zZ19idWYtPndyaXRlX3JfbXNnLmxlbmd0aCA9IDMqNCArIG91dF9tc2dfYnVmLT53cml0ZV9yX21zZy5ieXRlX2NvdW50OworICBvdXRfbXNnX2J1Zi0+d3JpdGVfcl9tc2cuYWRkcmVzcyA9IDY0OworCisgIGZvciAocmVnbm89R1I2NF9SRUdOVU0gOyByZWdubzxHUjY0X1JFR05VTSszMiA7IHJlZ25vKyspCisgICAgeworICAgICAgb3V0X21zZ19idWYtPndyaXRlX3JfbXNnLmRhdGFbcmVnbm8tR1I2NF9SRUdOVU1dID0gcmVhZF9yZWdpc3RlciAocmVnbm8pOworICAgIH0KKyAgbXNnX3NlbmRfc2VyaWFsKG91dF9tc2dfYnVmKTsKKyAgaWYgKCFleHBlY3RfbXNnKFdSSVRFX0FDSyxpbl9tc2dfYnVmLDEpKSB7CisJcmVzdWx0ID0gLTE7CisgIH0KKyNlbmRpZgkvKiBHUjY0X1JFR05VTSAqLworCisvKiBHbG9iYWwgcmVnaXN0ZXJzIGdyOTYtZ3IxMjcgKi8KKyAgb3V0X21zZ19idWYtPndyaXRlX3JfbXNnLmJ5dGVfY291bnQgPSA0KiAoMzIpOworICBvdXRfbXNnX2J1Zi0+d3JpdGVfcl9tc2cubGVuZ3RoID0gMyo0ICsgb3V0X21zZ19idWYtPndyaXRlX3JfbXNnLmJ5dGVfY291bnQ7CisgIG91dF9tc2dfYnVmLT53cml0ZV9yX21zZy5hZGRyZXNzID0gOTY7CisgIGZvciAocmVnbm89R1I5Nl9SRUdOVU0gOyByZWdubzxHUjk2X1JFR05VTSszMiA7IHJlZ25vKyspCisgICAgeworICAgICAgb3V0X21zZ19idWYtPndyaXRlX3JfbXNnLmRhdGFbcmVnbm8tR1I5Nl9SRUdOVU1dID0gcmVhZF9yZWdpc3RlciAocmVnbm8pOworICAgIH0KKyAgbXNnX3NlbmRfc2VyaWFsKCBvdXRfbXNnX2J1Zik7CisgIGlmICghZXhwZWN0X21zZyhXUklURV9BQ0ssaW5fbXNnX2J1ZiwxKSkgeworCXJlc3VsdCA9IC0xOworICB9CisKKy8qIExvY2FsIFJlZ2lzdGVycyAqLworICBvdXRfbXNnX2J1Zi0+d3JpdGVfcl9tc2cubWVtb3J5X3NwYWNlID0gTE9DQUxfUkVHOworICBvdXRfbXNnX2J1Zi0+d3JpdGVfcl9tc2cuYnl0ZV9jb3VudCA9IDQqMTI4OworICBvdXRfbXNnX2J1Zi0+d3JpdGVfcl9tc2cubGVuZ3RoID0gMyo0ICsgb3V0X21zZ19idWYtPndyaXRlX3JfbXNnLmJ5dGVfY291bnQ7CisgIG91dF9tc2dfYnVmLT53cml0ZV9yX21zZy5hZGRyZXNzID0gMDsKKworICBmb3IgKHJlZ25vID0gTFIwX1JFR05VTSA7IHJlZ25vIDwgTFIwX1JFR05VTSsxMjggOyByZWdubysrKQorICAgIHsKKyAgICAgIG91dF9tc2dfYnVmLT53cml0ZV9yX21zZy5kYXRhW3JlZ25vLUxSMF9SRUdOVU1dID0gcmVhZF9yZWdpc3RlciAocmVnbm8pOworICAgIH0KKyAgbXNnX3NlbmRfc2VyaWFsKCBvdXRfbXNnX2J1Zik7CisgIGlmICghZXhwZWN0X21zZyhXUklURV9BQ0ssaW5fbXNnX2J1ZiwxKSkgeworCXJlc3VsdCA9IC0xOworICB9CisKKy8qIFByb3RlY3RlZCBTcGVjaWFsIFJlZ2lzdGVycyAqLyAKKyAgLyogVkFCIHRocm91Z2ggVE1SICovCisgIG91dF9tc2dfYnVmLT53cml0ZV9yX21zZy5tZW1vcnlfc3BhY2UgPSBTUEVDSUFMX1JFRzsKKyAgb3V0X21zZ19idWYtPndyaXRlX3JfbXNnLmJ5dGVfY291bnQgPSA0KiAxMDsKKyAgb3V0X21zZ19idWYtPndyaXRlX3JfbXNnLmxlbmd0aCA9IDMqNCArIG91dF9tc2dfYnVmLT53cml0ZV9yX21zZy5ieXRlX2NvdW50OworICBvdXRfbXNnX2J1Zi0+d3JpdGVfcl9tc2cuYWRkcmVzcyA9IDA7CisgIGZvciAocmVnbm8gPSAwIDsgcmVnbm88PTkgOyByZWdubysrKQkvKiBWQUIgdGhyb3VnaCBUTVIgKi8KKyAgICBvdXRfbXNnX2J1Zi0+d3JpdGVfcl9tc2cuZGF0YVtyZWdub10gPSByZWFkX3JlZ2lzdGVyIChTUl9SRUdOVU0ocmVnbm8pKTsKKyAgbXNnX3NlbmRfc2VyaWFsKCBvdXRfbXNnX2J1Zik7CisgIGlmICghZXhwZWN0X21zZyhXUklURV9BQ0ssaW5fbXNnX2J1ZiwxKSkgeworCXJlc3VsdCA9IC0xOworICB9CisKKyAgLyogUEMwLCBQQzEsIFBDMiBwb3NzaWJseSBhcyBzaGFkb3cgcmVnaXN0ZXJzICovCisgIG91dF9tc2dfYnVmLT53cml0ZV9yX21zZy5ieXRlX2NvdW50ID0gNCogMzsKKyAgb3V0X21zZ19idWYtPndyaXRlX3JfbXNnLmxlbmd0aCA9IDMqNCArIG91dF9tc2dfYnVmLT53cml0ZV9yX21zZy5ieXRlX2NvdW50OworICBmb3IgKHJlZ25vPTEwIDsgcmVnbm88PTEyIDsgcmVnbm8rKykJLyogTFJVIGFuZCBNTVUgKi8KKyAgICBvdXRfbXNnX2J1Zi0+d3JpdGVfcl9tc2cuZGF0YVtyZWduby0xMF0gPSByZWFkX3JlZ2lzdGVyIChTUl9SRUdOVU0ocmVnbm8pKTsKKyAgaWYgKFVTRV9TSEFET1dfUEMpIAorICAgIG91dF9tc2dfYnVmLT53cml0ZV9yX21zZy5hZGRyZXNzID0gMjA7CS8qIFNQQzAgKi8KKyAgZWxzZSAKKyAgICBvdXRfbXNnX2J1Zi0+d3JpdGVfcl9tc2cuYWRkcmVzcyA9IDEwOwkvKiBQQzAgKi8KKyAgbXNnX3NlbmRfc2VyaWFsKCBvdXRfbXNnX2J1Zik7CisgIGlmICghZXhwZWN0X21zZyhXUklURV9BQ0ssaW5fbXNnX2J1ZiwxKSkgeworCXJlc3VsdCA9IC0xOworICB9CisKKyAgLyogTFJVIGFuZCBNTVUgKi8KKyAgb3V0X21zZ19idWYtPndyaXRlX3JfbXNnLmJ5dGVfY291bnQgPSA0KiAyOworICBvdXRfbXNnX2J1Zi0+d3JpdGVfcl9tc2cubGVuZ3RoID0gMyo0ICsgb3V0X21zZ19idWYtPndyaXRlX3JfbXNnLmJ5dGVfY291bnQ7CisgIG91dF9tc2dfYnVmLT53cml0ZV9yX21zZy5hZGRyZXNzID0gMTM7CisgIGZvciAocmVnbm89MTMgOyByZWdubzw9MTQgOyByZWdubysrKQkvKiBMUlUgYW5kIE1NVSAqLworICAgIG91dF9tc2dfYnVmLT53cml0ZV9yX21zZy5kYXRhW3JlZ25vLTEzXSA9IHJlYWRfcmVnaXN0ZXIgKFNSX1JFR05VTShyZWdubykpOworICBtc2dfc2VuZF9zZXJpYWwoIG91dF9tc2dfYnVmKTsKKyAgaWYgKCFleHBlY3RfbXNnKFdSSVRFX0FDSyxpbl9tc2dfYnVmLDEpKSB7CisJcmVzdWx0ID0gLTE7CisgIH0KKworLyogVW5wcm90ZWN0ZWQgU3BlY2lhbCBSZWdpc3RlcnMgKi8gCisgIG91dF9tc2dfYnVmLT53cml0ZV9yX21zZy5ieXRlX2NvdW50ID0gNCo4OworICBvdXRfbXNnX2J1Zi0+d3JpdGVfcl9tc2cubGVuZ3RoID0gMyo0ICsgb3V0X21zZ19idWYtPndyaXRlX3JfbXNnLmJ5dGVfY291bnQ7CisgIG91dF9tc2dfYnVmLT53cml0ZV9yX21zZy5hZGRyZXNzID0gMTI4OworICBmb3IgKHJlZ25vID0gMTI4IDsgcmVnbm88PTEzNSA7IHJlZ25vKyspCisgICAgb3V0X21zZ19idWYtPndyaXRlX3JfbXNnLmRhdGFbcmVnbm8tMTI4XSA9IHJlYWRfcmVnaXN0ZXIoU1JfUkVHTlVNKHJlZ25vKSk7CisgIG1zZ19zZW5kX3NlcmlhbCggb3V0X21zZ19idWYpOworICBpZiAoIWV4cGVjdF9tc2coV1JJVEVfQUNLLGluX21zZ19idWYsMSkpIHsKKwlyZXN1bHQgPSAtMTsKKyAgfQorIAorICByZWdpc3RlcnNfY2hhbmdlZCAoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBSRU1PVEVfUFJFUEFSRV9UT19TVE9SRSAqLworLyogR2V0IHJlYWR5IHRvIG1vZGlmeSB0aGUgcmVnaXN0ZXJzIGFycmF5LiAgT24gbWFjaGluZXMgd2hpY2ggc3RvcmUKKyAgIGluZGl2aWR1YWwgcmVnaXN0ZXJzLCB0aGlzIGRvZXNuJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gIE9uIG1hY2hpbmVzCisgICB3aGljaCBzdG9yZSBhbGwgdGhlIHJlZ2lzdGVycyBpbiBvbmUgZmVsbCBzd29vcCwgdGhpcyBtYWtlcyBzdXJlCisgICB0aGF0IHJlZ2lzdGVycyBjb250YWlucyBhbGwgdGhlIHJlZ2lzdGVycyBmcm9tIHRoZSBwcm9ncmFtIGJlaW5nCisgICBkZWJ1Z2dlZC4gICovCisKK3N0YXRpYyB2b2lkCittbV9wcmVwYXJlX3RvX3N0b3JlICgpCit7CisgIC8qIERvIG5vdGhpbmcsIHNpbmNlIHdlIGNhbiBzdG9yZSBpbmRpdmlkdWFsIHJlZ3MgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUkVNT1RFX1hGRVJfTUVNT1JZICovCitzdGF0aWMgQ09SRV9BRERSCit0cmFuc2xhdGVfYWRkcihhZGRyKQorQ09SRV9BRERSIGFkZHI7Cit7CisjaWYgZGVmaW5lZChLRVJORUxfREVCVUdHSU5HKQorICAgICAgICAvKiBDaGVjayBmb3IgYSB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhlIGtlcm5lbCAqLworICAgICAgICAvKiBBc3N1bWUgcGh5c2ljYWwgYWRkcmVzcyBvZiB1YmxvY2sgaXMgaW4gIHBhZGRyX3UgcmVnaXN0ZXIgKi8KKwkvKiBGSVhNRTogZG9lc24ndCB3b3JrIGZvciB1c2VyIHZpcnR1YWwgYWRkcmVzc2VzICovCisgICAgICAgIGlmIChhZGRyID49IFVWQUREUikgeworICAgICAgICAgICAgICAgIC8qIFBBRERSX1UgcmVnaXN0ZXIgaG9sZHMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHVibG9jayAqLworICAgICAgICAgICAgICAgIENPUkVfQUREUiBpID0gKENPUkVfQUREUilyZWFkX3JlZ2lzdGVyKFBBRERSX1VfUkVHTlVNKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oaSArIGFkZHIgLSAoQ09SRV9BRERSKVVWQUREUik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIAlyZXR1cm4oYWRkcik7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHJldHVybihhZGRyKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBSRU1PVEVfRklMRVNfSU5GTyAqLworc3RhdGljIHZvaWQKK21tX2ZpbGVzX2luZm8gKCkKK3sKKyAgcHJpbnRmICgiXHRBdHRhY2hlZCB0byAlcyBhdCAlZCBiYXVkIGFuZCBydW5uaW5nIHByb2dyYW0gJXMuXG4iLAorICAgICAgICAgIGRldl9uYW1lLCBiYXVkcmF0ZSwgcHJvZ19uYW1lKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUkVNT1RFX0lOU0VSVF9CUkVBS1BPSU5UICovCitzdGF0aWMgaW50CittbV9pbnNlcnRfYnJlYWtwb2ludCAoYWRkciwgY29udGVudHNfY2FjaGUpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpjb250ZW50c19jYWNoZTsKK3sKKyAgb3V0X21zZ19idWYtPmJrcHRfc2V0X21zZy5jb2RlID0gQktQVF9TRVQ7CisgIG91dF9tc2dfYnVmLT5ia3B0X3NldF9tc2cubGVuZ3RoID0gNCo0OworICBvdXRfbXNnX2J1Zi0+YmtwdF9zZXRfbXNnLm1lbW9yeV9zcGFjZSA9IElfTUVNOworICBvdXRfbXNnX2J1Zi0+YmtwdF9zZXRfbXNnLmJrcHRfYWRkciA9IChBRERSMzIpIGFkZHI7CisgIG91dF9tc2dfYnVmLT5ia3B0X3NldF9tc2cucGFzc19jb3VudCA9IDE7CisgIG91dF9tc2dfYnVmLT5ia3B0X3NldF9tc2cuYmtwdF90eXBlID0gLTE7CS8qIHVzZSBpbGxvcCBmb3IgMjkwMDAgKi8KKyAgbXNnX3NlbmRfc2VyaWFsKCBvdXRfbXNnX2J1Zik7CisgIGlmIChleHBlY3RfbXNnKEJLUFRfU0VUX0FDSyxpbl9tc2dfYnVmLDEpKSB7CisJcmV0dXJuIDA7CQkvKiBTdWNjZXNzICovCisgIH0gZWxzZSB7CisJcmV0dXJuIDE7CQkvKiBGYWlsdXJlICovCisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUkVNT1RFX0RFTEVURV9CUkVBS1BPSU5UICovCitzdGF0aWMgaW50CittbV9yZW1vdmVfYnJlYWtwb2ludCAoYWRkciwgY29udGVudHNfY2FjaGUpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpjb250ZW50c19jYWNoZTsKK3sKKyAgb3V0X21zZ19idWYtPmJrcHRfcm1fbXNnLmNvZGUgPSBCS1BUX1JNOworICBvdXRfbXNnX2J1Zi0+YmtwdF9ybV9tc2cubGVuZ3RoID0gNCozOworICBvdXRfbXNnX2J1Zi0+YmtwdF9ybV9tc2cubWVtb3J5X3NwYWNlID0gSV9NRU07CisgIG91dF9tc2dfYnVmLT5ia3B0X3JtX21zZy5ia3B0X2FkZHIgPSAoQUREUjMyKSBhZGRyOworICBtc2dfc2VuZF9zZXJpYWwoIG91dF9tc2dfYnVmKTsKKyAgaWYgKGV4cGVjdF9tc2coQktQVF9STV9BQ0ssaW5fbXNnX2J1ZiwxKSkgeworCXJldHVybiAwOwkJLyogU3VjY2VzcyAqLworICB9IGVsc2UgeworCXJldHVybiAxOwkJLyogRmFpbHVyZSAqLworICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUkVNT1RFX0tJTEwgKi8KK3N0YXRpYyB2b2lkCittbV9raWxsKGFyZyxmcm9tX3R0eSkKK2NoYXIgICAgKmFyZzsKK2ludCAgICAgZnJvbV90dHk7Cit7CisJY2hhcglidWZbNF07CisKKyNpZiBkZWZpbmVkKEtFUk5FTF9ERUJVR0dJTkcpCisJLyogV2UgZG9uJ3QgZXZlciBraWxsIHRoZSBrZXJuZWwgKi8KKwlpZiAoZnJvbV90dHkpIHsKKwkJcHJpbnRmKCJLZXJuZWwgbm90IGtpbGxlZCwgYnV0IGxlZnQgaW4gY3VycmVudCBzdGF0ZS5cbiIpOworCSAJcHJpbnRmKCJVc2UgZGV0YWNoIHRvIGxlYXZlIGtlcm5lbCBydW5uaW5nLlxuIik7CisJfQorI2Vsc2UKKyAgCW91dF9tc2dfYnVmLT5icmVha19tc2cuY29kZSA9IEJSRUFLOworICAJb3V0X21zZ19idWYtPmJrcHRfc2V0X21zZy5sZW5ndGggPSA0KjA7CisJZXhwZWN0X21zZyhIQUxULGluX21zZ19idWYsZnJvbV90dHkpOworCWlmIChmcm9tX3R0eSkgeworCQlwcmludGYoIlRhcmdldCBoYXMgYmVlbiBzdG9wcGVkLiIpOworCQlwcmludGYoIldvdWxkIHlvdSBsaWtlIHRvIGRvIGEgaGFyZHdhcmUgcmVzZXQgKHkvbikgW25dICIpOworCQlmZ2V0cyhidWYsMyxzdGRpbik7CQorCQlpZiAoYnVmWzBdID09ICd5JykgeworCQkJb3V0X21zZ19idWYtPnJlc2V0X21zZy5jb2RlID0gUkVTRVQ7CisJCQlvdXRfbXNnX2J1Zi0+YmtwdF9zZXRfbXNnLmxlbmd0aCA9IDQqMDsKKwkJCWV4cGVjdF9tc2coUkVTRVRfQUNLLGluX21zZ19idWYsZnJvbV90dHkpOworCQkJcHJpbnRmKCJUYXJnZXQgaGFzIGJlZW4gcmVzZXQuIik7CisJCX0KKwl9CisJcG9wX3RhcmdldCgpOworI2VuZGlmIAorfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIAorICogTG9hZCBhIHByb2dyYW0gaW50byB0aGUgdGFyZ2V0LgorICovCitzdGF0aWMgdm9pZAorbW1fbG9hZChhcmdfc3RyaW5nLGZyb21fdHR5KQorY2hhcgkqYXJnX3N0cmluZzsKK2ludAlmcm9tX3R0eTsKK3sKKyAgZG9udF9yZXBlYXQgKCk7CisKKyNpZiBkZWZpbmVkKEtFUk5FTF9ERUJVR0dJTkcpCisgIHByaW50ZigiVGhlIGtlcm5lbCBoYWQgYmV0dGVyIGJlIGxvYWRlZCBhbHJlYWR5ISAgTG9hZGluZyBub3QgZG9uZS5cbiIpOworI2Vsc2UKKyAgaWYgKGFyZ19zdHJpbmcgPT0gMCkKKyAgICBlcnJvciAoIlRoZSBsb2FkIGNvbW1hbmQgdGFrZXMgYSBmaWxlIG5hbWUiKTsKKworICBhcmdfc3RyaW5nID0gdGlsZGVfZXhwYW5kIChhcmdfc3RyaW5nKTsKKyAgbWFrZV9jbGVhbnVwIChmcmVlLCBhcmdfc3RyaW5nKTsKKyAgUVVJVDsKKyAgaW1tZWRpYXRlX3F1aXQrKzsKKyAgZXJyb3IoIkZpbGUgbG9hZGluZyBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgTWluaU1vbi4iKTsKKyAgLyogRklYTUUsIGNvZGUgdG8gbG9hZCB5b3VyIGZpbGUgaGVyZS4uLiAqLworICAvKiBZb3UgbWF5IG5lZWQgdG8gZG8gYW4gaW5pdF90YXJnZXRfbW0oKSAqLworICAvKiBpbml0X3RhcmdldF9tbSg/LD8sPyw/LD8sPyw/LD8pOyAqLworICBpbW1lZGlhdGVfcXVpdC0tOworICAvKiBzeW1ib2xfZmlsZV9hZGQgKGFyZ19zdHJpbmcsIGZyb21fdHR5LCB0ZXh0X2FkZHIsIDAsIDAsIDAsIDApOyAqLworI2VuZGlmCisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBSRU1PVEVfV1JJVEVfSU5GRVJJT1JfTUVNT1JZCisqKiBDb3B5IExFTiBieXRlcyBvZiBkYXRhIGZyb20gZGVidWdnZXIgbWVtb3J5IGF0IE1ZQUREUgorICAgdG8gaW5mZXJpb3IncyBtZW1vcnkgYXQgTUVNQUREUi4gIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uICAqLworc3RhdGljIGludAorbW1fd3JpdGVfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaW50IGksbndyaXR0ZW47CisKKyAgb3V0X21zZ19idWYtPndyaXRlX3JlcV9tc2cuY29kZT0gV1JJVEVfUkVROworICBvdXRfbXNnX2J1Zi0+d3JpdGVfcmVxX21zZy5tZW1vcnlfc3BhY2UgPSBtbV9tZW1vcnlfc3BhY2UobWVtYWRkcik7CQorCisgIG53cml0dGVuPTA7CisgIHdoaWxlIChud3JpdHRlbiA8IGxlbikgeworCWludCBudW1fdG9fd3JpdGUgPSBsZW4gLSBud3JpdHRlbjsKKwlpZiAobnVtX3RvX3dyaXRlID4gTUFYREFUQSkgbnVtX3RvX3dyaXRlID0gTUFYREFUQTsKKyAgCWZvciAoaT0wIDsgaSA8IG51bV90b193cml0ZSA7IGkrKykKKyAgICAgIAkJb3V0X21zZ19idWYtPndyaXRlX3JlcV9tc2cuZGF0YVtpXSA9IG15YWRkcltpK253cml0dGVuXTsKKyAgCW91dF9tc2dfYnVmLT53cml0ZV9yZXFfbXNnLmJ5dGVfY291bnQgPSBudW1fdG9fd3JpdGU7CisgIAlvdXRfbXNnX2J1Zi0+d3JpdGVfcmVxX21zZy5sZW5ndGggPSAzKjQgKyBudW1fdG9fd3JpdGU7IAorICAJb3V0X21zZ19idWYtPndyaXRlX3JlcV9tc2cuYWRkcmVzcyA9IG1lbWFkZHIgKyBud3JpdHRlbjsKKyAgCW1zZ19zZW5kX3NlcmlhbChvdXRfbXNnX2J1Zik7CisKKyAgCWlmIChleHBlY3RfbXNnKFdSSVRFX0FDSyxpbl9tc2dfYnVmLDEpKSB7CisgIAkJbndyaXR0ZW4gKz0gaW5fbXNnX2J1Zi0+d3JpdGVfYWNrX21zZy5ieXRlX2NvdW50OworICAJfSBlbHNlIHsKKwkJYnJlYWs7CQorICAJfQorICB9CisgIHJldHVybihud3JpdHRlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFJFTU9URV9SRUFEX0lORkVSSU9SX01FTU9SWQorKiogUmVhZCBMRU4gYnl0ZXMgZnJvbSBpbmZlcmlvciBtZW1vcnkgYXQgTUVNQUREUi4gIFB1dCB0aGUgcmVzdWx0CisgICBhdCBkZWJ1Z2dlciBhZGRyZXNzIE1ZQUREUi4gIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICAqLworc3RhdGljIGludAorbW1fcmVhZF9pbmZlcmlvcl9tZW1vcnkobWVtYWRkciwgbXlhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47Cit7CisgIGludCBpLG5yZWFkOworCisgIG91dF9tc2dfYnVmLT5yZWFkX3JlcV9tc2cuY29kZT0gUkVBRF9SRVE7CisgIG91dF9tc2dfYnVmLT5yZWFkX3JlcV9tc2cubWVtb3J5X3NwYWNlID0gbW1fbWVtb3J5X3NwYWNlKG1lbWFkZHIpOworCisgIG5yZWFkPTA7CisgIHdoaWxlIChucmVhZCA8IGxlbikgeworCWludCBudW1fdG9fcmVhZCA9IChsZW4gLSBucmVhZCk7CisJaWYgKG51bV90b19yZWFkID4gTUFYREFUQSkgbnVtX3RvX3JlYWQgPSBNQVhEQVRBOworICAJb3V0X21zZ19idWYtPnJlYWRfcmVxX21zZy5ieXRlX2NvdW50ID0gbnVtX3RvX3JlYWQ7IAorICAJb3V0X21zZ19idWYtPnJlYWRfcmVxX21zZy5sZW5ndGggPSAzKjQgKyBudW1fdG9fcmVhZDsgCisgIAlvdXRfbXNnX2J1Zi0+cmVhZF9yZXFfbXNnLmFkZHJlc3MgPSBtZW1hZGRyICsgbnJlYWQ7CisgIAltc2dfc2VuZF9zZXJpYWwob3V0X21zZ19idWYpOworCisgIAlpZiAoZXhwZWN0X21zZyhSRUFEX0FDSyxpbl9tc2dfYnVmLDEpKSB7CisgIAkJZm9yIChpPTAgOyBpPGluX21zZ19idWYtPnJlYWRfYWNrX21zZy5ieXRlX2NvdW50IDsgaSsrKQorICAgICAgCQkJbXlhZGRyW2krbnJlYWRdID0gaW5fbXNnX2J1Zi0+cmVhZF9hY2tfbXNnLmRhdGFbaV07CisgIAkJbnJlYWQgKz0gaW5fbXNnX2J1Zi0+cmVhZF9hY2tfbXNnLmJ5dGVfY291bnQ7CisgIAl9IGVsc2UgeworCQlicmVhazsJCisgIAl9CisgIH0KKyAgcmV0dXJuKG5yZWFkKTsKK30KKworLyogRklYTUUhICBNZXJnZSB0aGVzZSB0d28uICAqLworc3RhdGljIGludAorbW1feGZlcl9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuLCB3cml0ZSkKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IHdyaXRlOworeworCisgIG1lbWFkZHIgPSB0cmFuc2xhdGVfYWRkcihtZW1hZGRyKTsKKworICBpZiAod3JpdGUpCisgICAgcmV0dXJuIG1tX3dyaXRlX2luZmVyaW9yX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4pOworICBlbHNlCisgICAgcmV0dXJuIG1tX3JlYWRfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVNHX1NFTkRfU0VSSUFMCisqKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhIG1lc3NhZ2Ugb3ZlciB0aGUKKyoqIHNlcmlhbCBsaW5lLgorKioKKyoqIElmIHRoZSBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseSBzZW50LCBhIHplcm8gaXMKKyoqIHJldHVybmVkLiAgSWYgdGhlIG1lc3NhZ2Ugd2FzIG5vdCBzZW5kYWJsZSwgYSAtMQorKiogaXMgcmV0dXJuZWQuICBUaGlzIGZ1bmN0aW9uIGJsb2Nrcy4gIFRoYXQgaXMsIGl0CisqKiBkb2VzIG5vdCByZXR1cm4gdW50aWwgdGhlIG1lc3NhZ2UgaXMgY29tcGxldGVseQorKiogc2VudCwgb3IgdW50aWwgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQuCisqKgorKi8KKworaW50Cittc2dfc2VuZF9zZXJpYWwobXNnX3B0cikKKyAgIHVuaW9uICBtc2dfdCAgKm1zZ19wdHI7Cit7CisgICBJTlQzMiAgbWVzc2FnZV9zaXplOworICAgaW50ICAgIGJ5dGVfY291bnQ7CisgICBpbnQgICAgcmVzdWx0OworICAgY2hhciAgIGM7CisKKyAgIC8qIFNlbmQgbWVzc2FnZSBoZWFkZXIgKi8KKyAgIGJ5dGVfY291bnQgPSAwOworICAgbWVzc2FnZV9zaXplID0gbXNnX3B0ci0+Z2VuZXJpY19tc2cubGVuZ3RoICsgKDIgKiBzaXplb2YoSU5UMzIpKTsKKyAgIGRvIHsKKyAgICAgIGMgPSAqKChjaGFyICopbXNnX3B0citieXRlX2NvdW50KTsKKyAgICAgIHJlc3VsdCA9IHdyaXRlKG1tX2Rlc2MsICZjLCAxKTsKKyAgICAgIGlmIChyZXN1bHQgPT0gMSkgeworICAgICAgICAgYnl0ZV9jb3VudCA9IGJ5dGVfY291bnQgKyAxOworICAgICAgfQorICAgfSB3aGlsZSAoKGJ5dGVfY291bnQgPCBtZXNzYWdlX3NpemUpICk7CisKKyAgIHJldHVybigwKTsKK30gIC8qIGVuZCBtc2dfc2VuZF9zZXJpYWwoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNU0dfUkVDVl9TRVJJQUwKKyoqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWNlaXZlIGEgbWVzc2FnZSBvdmVyIGEKKyoqIHNlcmlhbCBsaW5lLgorKioKKyoqIElmIHRoZSBtZXNzYWdlIGlzIHdhaXRpbmcgaW4gdGhlIGJ1ZmZlciwgYSB6ZXJvIGlzCisqKiByZXR1cm5lZCBhbmQgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IG1zZ19wdHIgaXMgZmlsbGVkCisqKiBpbi4gIElmIG5vIG1lc3NhZ2Ugd2FzIGF2YWlsYWJsZSwgYSAtMSBpcyByZXR1cm5lZC4KKyoqIElmIHRpbWVvdXQ9PTAsIHdhaXQgaW5kZWZpbmV0bHkgZm9yIGEgY2hhcmFjdGVyLgorKioKKyovCisKK2ludAorbXNnX3JlY3Zfc2VyaWFsKG1zZ19wdHIpCit1bmlvbiAgbXNnX3QgICptc2dfcHRyOworeworICAgc3RhdGljIElOVDMyICBsZW5ndGg9MDsKKyAgIHN0YXRpYyBJTlQzMiAgYnl0ZV9jb3VudD0wOworICAgaW50ICAgIHJlc3VsdDsKKyAgIGNoYXIgICBjOworICBpZihtc2dfcHRyID09IDApCQkvKiByZS1zeW5jIHJlcXVlc3QgKi8KKyAgeyAgbGVuZ3RoPTA7CisgICAgIGJ5dGVfY291bnQ9MDsKKyNpZmRlZiBIQVZFX1RFUk1JTworICAgICAvKiBUaGUgdGltZW91dCBoZXJlIGlzIHRoZSBwcmV2YWlsaW5nIHRpbWVvdXQgc2V0IHdpdGggVlRJTUUgKi8KKyAgICAgLT4idGltZW91dD09MCBzZW1hbnRpY3Mgbm90IHN1cHBvcnRlZCIKKyAgICAgcmVhZChtbV9kZXNjLCBpbl9idWYsIEJVRkVSX1NJWkUpOworI2Vsc2UKKyAgICAgYWxhcm0gKDEpOworICAgICByZWFkKG1tX2Rlc2MsIGluX2J1ZiwgQlVGRVJfU0laRSk7CisgICAgIGFsYXJtICgwKTsKKyNlbmRpZgorICAgICByZXR1cm4oMCk7CisgIH0KKyAgIC8qIFJlY2VpdmUgbWVzc2FnZSAqLworI2lmZGVmIEhBVkVfVEVSTUlPCisvKiBUaW1lb3V0PT0wLCBoZWxwIHN1cHBvcnQgdGhlIG1tX3dhaXQoKSByb3V0aW5lICovCisgICAtPiJ0aW1lb3V0PT0wIHNlbWFudGljcyBub3Qgc3VwcG9ydGVkIChhbmQgaXRzIG5pY2UgaWYgdGhleSBhcmUpIgorICAgcmVzdWx0ID0gcmVhZChtbV9kZXNjLCAmYywgMSk7CisjZWxzZQorICBhbGFybSh0aW1lb3V0KTsKKyAgcmVzdWx0ID0gcmVhZChtbV9kZXNjLCAmYywgMSk7CisgIGFsYXJtICgwKTsKKyNlbmRpZgorICBpZiAoIHJlc3VsdCA8IDApIHsKKyAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgeworICAgICAgCWVycm9yICgiVGltZW91dCByZWFkaW5nIGZyb20gcmVtb3RlIHN5c3RlbS4iKTsKKyAgICAgIH0gZWxzZQorCXBlcnJvcl93aXRoX25hbWUgKCJyZW1vdGUiKTsKKyAgfSBlbHNlIGlmIChyZXN1bHQgPT0gMSkgeworICAgICAgKigoY2hhciAqKW1zZ19wdHIrYnl0ZV9jb3VudCkgPSBjOworICAgICAgYnl0ZV9jb3VudCA9IGJ5dGVfY291bnQgKyAxOworICB9CisKKyAgIC8qIE1lc3NhZ2UgaGVhZGVyIHJlY2VpdmVkLiAgU2F2ZSBtZXNzYWdlIGxlbmd0aC4gKi8KKyAgaWYgKGJ5dGVfY291bnQgPT0gKDIgKiBzaXplb2YoSU5UMzIpKSkKKyAgICAgIGxlbmd0aCA9IG1zZ19wdHItPmdlbmVyaWNfbXNnLmxlbmd0aDsKKworICBpZiAoYnl0ZV9jb3VudCA+PSAobGVuZ3RoICsgKDIgKiBzaXplb2YoSU5UMzIpKSkpIHsKKyAgICAgIC8qIE1lc3NhZ2UgcmVjZWl2ZWQgKi8KKyAgICAgIGJ5dGVfY291bnQgPSAwOworICAgICAgcmV0dXJuKDApOworICB9IGVsc2UKKyAgICAgIHJldHVybiAoLTEpOworCit9ICAvKiBlbmQgbXNnX3JlY3Zfc2VyaWFsKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBLQkRfUkFXCisqKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcHV0IHRoZSBrZXlib2FyZCBpbiAicmF3IgorKiogbW9kZSBmb3IgQlNEIFVuaXguICBUaGUgb3JpZ2luYWwgc3RhdHVzIGlzIHNhdmVkCisqKiBzbyB0aGF0IGl0IG1heSBiZSByZXN0b3JlZCBsYXRlci4KKyovCitURVJNSU5BTCBrYmRfdGJ1ZjsKKworaW50CitrYmRfcmF3KCkgeworICAgaW50ICAgIHJlc3VsdDsKKyAgIFRFUk1JTkFMIHRidWY7CisKKyAgIC8qIEdldCBrZXlib2FyZCB0ZXJtaW8gKHRvIHNhdmUgdG8gcmVzdG9yZSBvcmlnaW5hbCBtb2RlcykgKi8KKyNpZmRlZiBIQVZFX1RFUk1JTworICAgcmVzdWx0ID0gaW9jdGwoMCwgVENHRVRBLCAma2JkX3RidWYpOworI2Vsc2UKKyAgIHJlc3VsdCA9IGlvY3RsKDAsIFRJT0NHRVRQLCAma2JkX3RidWYpOworI2VuZGlmCisgICBpZiAocmVzdWx0ID09IC0xKQorICAgICAgcmV0dXJuIChlcnJubyk7CisKKyAgIC8qIEdldCBrZXlib2FyZCBURVJNSU5BTCAoZm9yIG1vZGlmaWNhdGlvbikgKi8KKyNpZmRlZiBIQVZFX1RFUk1JTworICAgcmVzdWx0ID0gaW9jdGwoMCwgVENHRVRBLCAmdGJ1Zik7CisjZWxzZQorICAgcmVzdWx0ID0gaW9jdGwoMCwgVElPQ0dFVFAsICZ0YnVmKTsKKyNlbmRpZgorICAgaWYgKHJlc3VsdCA9PSAtMSkKKyAgICAgIHJldHVybiAoZXJybm8pOworCisgICAvKiBTZXQgdXAgbmV3IHBhcmFtZXRlcnMgKi8KKyNpZmRlZiBIQVZFX1RFUk1JTworICAgdGJ1Zi5jX2lmbGFnID0gdGJ1Zi5jX2lmbGFnICYKKyAgICAgIH4oSU5MQ1IgfCBJQ1JOTCB8IElVQ0xDIHwgSVNUUklQIHwgSVhPTiB8IEJSS0lOVCk7CisgICB0YnVmLmNfbGZsYWcgPSB0YnVmLmNfbGZsYWcgJiB+KElDQU5PTiB8IElTSUcgfCBFQ0hPKTsKKyAgIHRidWYuY19jY1s0XSA9IDA7ICAvKiBNSU4gKi8KKyAgIHRidWYuY19jY1s1XSA9IDA7ICAvKiBUSU1FICovCisjZWxzZQorICAgLyogRklYTUU6IG5vdCBzdXJlIGlmIHRoaXMgaXMgY29ycmVjdCAobWF0Y2hlcyBIQVZFX1RFUk1JTykuICovCisgICB0YnVmLnNnX2ZsYWdzIHw9IFJBVzsKKyAgIHRidWYuc2dfZmxhZ3MgfD0gQU5ZUDsKKyAgIHRidWYuc2dfZmxhZ3MgJj0gfkVDSE87CisjZW5kaWYKKworICAgLyogU2V0IGtleWJvYXJkIHRlcm1pbyB0byBuZXcgbW9kZSAoUkFXKSAqLworI2lmZGVmIEhBVkVfVEVSTUlPCisgICByZXN1bHQgPSBpb2N0bCgwLCBUQ1NFVEFGLCAmdGJ1Zik7CisjZWxzZQorICAgcmVzdWx0ID0gaW9jdGwoMCwgVElPQ1NFVFAsICZ0YnVmKTsKKyNlbmRpZiAKKyAgIGlmIChyZXN1bHQgPT0gLTEpCisgICAgICByZXR1cm4gKGVycm5vKTsKKworICAgcmV0dXJuICgwKTsKK30gIC8qIGVuZCBrYmRfcmF3KCkgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBLQkRfUkVTVE9SRQorKiogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHB1dCB0aGUga2V5Ym9hcmQgYmFjayBpbiB0aGUKKyoqIG1vZGUgaXQgd2FzIGluIGJlZm9yZSBrYmtfcmF3IHdhcyBjYWxsZWQuICBOb3RlIHRoYXQKKyoqIGtia19yYXcoKSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZSBiZWZvcmUKKyoqIGtiZF9yZXN0b3JlKCkgaXMgY2FsbGVkLgorKi8KKworaW50CitrYmRfcmVzdG9yZSgpIHsKKyAgIGludCByZXN1bHQ7CisKKyAgIC8qIFNldCBrZXlib2FyZCB0ZXJtaW8gdG8gb3JpZ2luYWwgbW9kZSAqLworI2lmZGVmIEhBVkVfVEVSTUlPCisgICByZXN1bHQgPSBpb2N0bCgwLCBUQ1NFVEFGLCAma2JkX3RidWYpOworI2Vsc2UKKyAgIHJlc3VsdCA9IGlvY3RsKDAsIFRJT0NHRVRQLCAma2JkX3RidWYpOworI2VuZGlmCisKKyAgIGlmIChyZXN1bHQgPT0gLTEpCisgICAgICByZXR1cm4gKGVycm5vKTsKKworICAgcmV0dXJuKDApOworfSAgLyogZW5kIGtiZF9jb29rZWQoKSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCisvKiBGZXRjaCBhIHNpbmdsZSByZWdpc3RlciBpbmRpY2F0YXRlZCBieSAncmVnbm8nLiAKKyAqIFJldHVybnMgMC8tMSBvbiBzdWNjZXNzL2ZhaWx1cmUuICAKKyAqLworc3RhdGljIGludAorZmV0Y2hfcmVnaXN0ZXIgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgICAgIGludCAgcmVzdWx0OworICBvdXRfbXNnX2J1Zi0+cmVhZF9yZXFfbXNnLmNvZGU9IFJFQURfUkVROworICBvdXRfbXNnX2J1Zi0+cmVhZF9yZXFfbXNnLmxlbmd0aCA9IDQqMzsKKyAgb3V0X21zZ19idWYtPnJlYWRfcmVxX21zZy5ieXRlX2NvdW50ID0gNDsKKworICBpZiAocmVnbm8gPT0gR1IxX1JFR05VTSkKKyAgeyBvdXRfbXNnX2J1Zi0+cmVhZF9yZXFfbXNnLm1lbW9yeV9zcGFjZSA9IEdMT0JBTF9SRUc7CisgICAgb3V0X21zZ19idWYtPnJlYWRfcmVxX21zZy5hZGRyZXNzID0gMTsKKyAgfQorICBlbHNlIGlmIChyZWdubyA+PSBHUjk2X1JFR05VTSAmJiByZWdubyA8IEdSOTZfUkVHTlVNICsgMzIpCisgIHsgb3V0X21zZ19idWYtPnJlYWRfcmVxX21zZy5tZW1vcnlfc3BhY2UgPSBHTE9CQUxfUkVHOworICAgIG91dF9tc2dfYnVmLT5yZWFkX3JlcV9tc2cuYWRkcmVzcyA9IChyZWdubyAtIEdSOTZfUkVHTlVNKSArIDk2OworICB9CisjaWYgZGVmaW5lZChHUjY0X1JFR05VTSkKKyAgZWxzZSBpZiAocmVnbm8gPj0gR1I2NF9SRUdOVU0gJiYgcmVnbm8gPCBHUjY0X1JFR05VTSArIDMyICkKKyAgeyBvdXRfbXNnX2J1Zi0+cmVhZF9yZXFfbXNnLm1lbW9yeV9zcGFjZSA9IEdMT0JBTF9SRUc7CisgICAgb3V0X21zZ19idWYtPnJlYWRfcmVxX21zZy5hZGRyZXNzID0gKHJlZ25vIC0gR1I2NF9SRUdOVU0pICsgNjQ7CisgIH0KKyNlbmRpZgkvKiBHUjY0X1JFR05VTSAqLworICBlbHNlIGlmIChyZWdubyA+PSBMUjBfUkVHTlVNICYmIHJlZ25vIDwgTFIwX1JFR05VTSArIDEyOCkKKyAgeyBvdXRfbXNnX2J1Zi0+cmVhZF9yZXFfbXNnLm1lbW9yeV9zcGFjZSA9IExPQ0FMX1JFRzsKKyAgICBvdXRfbXNnX2J1Zi0+cmVhZF9yZXFfbXNnLmFkZHJlc3MgPSAocmVnbm8gLSBMUjBfUkVHTlVNKTsKKyAgfQorICBlbHNlIGlmIChyZWdubz49RlBFX1JFR05VTSAmJiByZWdubzw9RVhPX1JFR05VTSkgIAorICB7IGludCB2YWwgPSAtMTsKKyAgICBzdXBwbHlfcmVnaXN0ZXIoMTYwICsgKHJlZ25vIC0gRlBFX1JFR05VTSksJnZhbCk7CisgICAgcmV0dXJuIDA7CQkvKiBQcmV0ZW5kIFN1Y2Nlc3MgKi8KKyAgfQorICBlbHNlIAorICB7IG91dF9tc2dfYnVmLT5yZWFkX3JlcV9tc2cubWVtb3J5X3NwYWNlID0gU1BFQ0lBTF9SRUc7CisgICAgb3V0X21zZ19idWYtPnJlYWRfcmVxX21zZy5hZGRyZXNzID0gcmVnbnVtX3RvX3NybnVtKHJlZ25vKTsgCisgIH0gCisKKyAgbXNnX3NlbmRfc2VyaWFsKG91dF9tc2dfYnVmKTsKKworICBpZiAoZXhwZWN0X21zZyhSRUFEX0FDSyxpbl9tc2dfYnVmLDEpKSB7CisgIAlzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCAmKGluX21zZ19idWYtPnJlYWRfcl9hY2tfbXNnLmRhdGFbMF0pKTsKKwlyZXN1bHQgPSAwOworICB9IGVsc2UgeworCXJlc3VsdCA9IC0xOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAorLyogU3RvcmUgYSBzaW5nbGUgcmVnaXN0ZXIgaW5kaWNhdGVkIGJ5ICdyZWdubycuIAorICogUmV0dXJucyAwLy0xIG9uIHN1Y2Nlc3MvZmFpbHVyZS4gIAorICovCitzdGF0aWMgaW50CitzdG9yZV9yZWdpc3RlciAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgICAgaW50ICByZXN1bHQ7CisKKyAgb3V0X21zZ19idWYtPndyaXRlX3JlcV9tc2cuY29kZT0gV1JJVEVfUkVROworICBvdXRfbXNnX2J1Zi0+d3JpdGVfcmVxX21zZy5sZW5ndGggPSA0KjQ7CisgIG91dF9tc2dfYnVmLT53cml0ZV9yZXFfbXNnLmJ5dGVfY291bnQgPSA0OworICBvdXRfbXNnX2J1Zi0+d3JpdGVfcl9tc2cuZGF0YVswXSA9IHJlYWRfcmVnaXN0ZXIgKHJlZ25vKTsKKworICBpZiAocmVnbm8gPT0gR1IxX1JFR05VTSkKKyAgeyBvdXRfbXNnX2J1Zi0+d3JpdGVfcmVxX21zZy5tZW1vcnlfc3BhY2UgPSBHTE9CQUxfUkVHOworICAgIG91dF9tc2dfYnVmLT53cml0ZV9yZXFfbXNnLmFkZHJlc3MgPSAxOworICAgIC8qIFNldHRpbmcgR1IxIGNoYW5nZXMgdGhlIG51bWJlcnMgb2YgYWxsIHRoZSBsb2NhbHMsIHNvIGludmFsaWRhdGUgdGhlIAorICAgICAqIHJlZ2lzdGVyIGNhY2hlLiAgRG8gdGhpcyAqYWZ0ZXIqIGNhbGxpbmcgcmVhZF9yZWdpc3RlciwgYmVjYXVzZSB3ZSB3YW50IAorICAgICAqIHJlYWRfcmVnaXN0ZXIgdG8gcmV0dXJuIHRoZSB2YWx1ZSB0aGF0IHdyaXRlX3JlZ2lzdGVyIGhhcyBqdXN0IHN0dWZmZWQgCisgICAgICogaW50byB0aGUgcmVnaXN0ZXJzIGFycmF5LCBub3QgdGhlIHZhbHVlIG9mIHRoZSByZWdpc3RlciBmZXRjaGVkIGZyb20gCisgICAgICogdGhlIGluZmVyaW9yLiAgCisgICAgICovCisgICAgcmVnaXN0ZXJzX2NoYW5nZWQgKCk7CisgIH0KKyNpZiBkZWZpbmVkKEdSNjRfUkVHTlVNKQorICBlbHNlIGlmIChyZWdubyA+PSBHUjY0X1JFR05VTSAmJiByZWdubyA8IEdSNjRfUkVHTlVNICsgMzIgKQorICB7IG91dF9tc2dfYnVmLT53cml0ZV9yZXFfbXNnLm1lbW9yeV9zcGFjZSA9IEdMT0JBTF9SRUc7CisgICAgb3V0X21zZ19idWYtPndyaXRlX3JlcV9tc2cuYWRkcmVzcyA9IChyZWdubyAtIEdSNjRfUkVHTlVNKSArIDY0OworICB9CisjZW5kaWYJLyogR1I2NF9SRUdOVU0gKi8KKyAgZWxzZSBpZiAocmVnbm8gPj0gR1I5Nl9SRUdOVU0gJiYgcmVnbm8gPCBHUjk2X1JFR05VTSArIDMyKQorICB7IG91dF9tc2dfYnVmLT53cml0ZV9yZXFfbXNnLm1lbW9yeV9zcGFjZSA9IEdMT0JBTF9SRUc7CisgICAgb3V0X21zZ19idWYtPndyaXRlX3JlcV9tc2cuYWRkcmVzcyA9IChyZWdubyAtIEdSOTZfUkVHTlVNKSArIDk2OworICB9CisgIGVsc2UgaWYgKHJlZ25vID49IExSMF9SRUdOVU0gJiYgcmVnbm8gPCBMUjBfUkVHTlVNICsgMTI4KQorICB7IG91dF9tc2dfYnVmLT53cml0ZV9yZXFfbXNnLm1lbW9yeV9zcGFjZSA9IExPQ0FMX1JFRzsKKyAgICBvdXRfbXNnX2J1Zi0+d3JpdGVfcmVxX21zZy5hZGRyZXNzID0gKHJlZ25vIC0gTFIwX1JFR05VTSk7CisgIH0KKyAgZWxzZSBpZiAocmVnbm8+PUZQRV9SRUdOVU0gJiYgcmVnbm88PUVYT19SRUdOVU0pICAKKyAgeyAKKyAgICByZXR1cm4gMDsJCS8qIFByZXRlbmQgU3VjY2VzcyAqLworICB9CisgIGVsc2UgCS8qIEFuIHVucHJvdGVjdGVkIG9yIHByb3RlY3RlZCBzcGVjaWFsIHJlZ2lzdGVyICovCisgIHsgb3V0X21zZ19idWYtPndyaXRlX3JlcV9tc2cubWVtb3J5X3NwYWNlID0gU1BFQ0lBTF9SRUc7CisgICAgb3V0X21zZ19idWYtPndyaXRlX3JlcV9tc2cuYWRkcmVzcyA9IHJlZ251bV90b19zcm51bShyZWdubyk7IAorICB9IAorCisgIG1zZ19zZW5kX3NlcmlhbChvdXRfbXNnX2J1Zik7CisKKyAgaWYgKGV4cGVjdF9tc2coV1JJVEVfQUNLLGluX21zZ19idWYsMSkpIHsKKwlyZXN1bHQgPSAwOworICB9IGVsc2UgeworCXJlc3VsdCA9IC0xOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIAorICogQ29udmVydCBhIGdkYiBzcGVjaWFsIHJlZ2lzdGVyIG51bWJlciB0byBhIDI5MDAwIHNwZWNpYWwgcmVnaXN0ZXIgbnVtYmVyLgorICovCitzdGF0aWMgaW50CityZWdudW1fdG9fc3JudW0ocmVnbm8pCitpbnQJcmVnbm87Cit7CisJc3dpdGNoKHJlZ25vKSB7CisJCWNhc2UgVkFCX1JFR05VTTogcmV0dXJuKDApOyAKKwkJY2FzZSBPUFNfUkVHTlVNOiByZXR1cm4oMSk7IAorCQljYXNlIENQU19SRUdOVU06IHJldHVybigyKTsgCisJCWNhc2UgQ0ZHX1JFR05VTTogcmV0dXJuKDMpOyAKKwkJY2FzZSBDSEFfUkVHTlVNOiByZXR1cm4oNCk7IAorCQljYXNlIENIRF9SRUdOVU06IHJldHVybig1KTsgCisJCWNhc2UgQ0hDX1JFR05VTTogcmV0dXJuKDYpOyAKKwkJY2FzZSBSQlBfUkVHTlVNOiByZXR1cm4oNyk7IAorCQljYXNlIFRNQ19SRUdOVU06IHJldHVybig4KTsgCisJCWNhc2UgVE1SX1JFR05VTTogcmV0dXJuKDkpOyAKKwkJY2FzZSBOUENfUkVHTlVNOiByZXR1cm4oVVNFX1NIQURPV19QQyA/ICgyMCkgOiAoMTApKTsKKwkJY2FzZSBQQ19SRUdOVU06ICByZXR1cm4oVVNFX1NIQURPV19QQyA/ICgyMSkgOiAoMTEpKTsKKwkJY2FzZSBQQzJfUkVHTlVNOiByZXR1cm4oVVNFX1NIQURPV19QQyA/ICgyMikgOiAoMTIpKTsKKwkJY2FzZSBNTVVfUkVHTlVNOiByZXR1cm4oMTMpOyAKKwkJY2FzZSBMUlVfUkVHTlVNOiByZXR1cm4oMTQpOyAKKwkJY2FzZSBJUENfUkVHTlVNOiByZXR1cm4oMTI4KTsgCisJCWNhc2UgSVBBX1JFR05VTTogcmV0dXJuKDEyOSk7IAorCQljYXNlIElQQl9SRUdOVU06IHJldHVybigxMzApOyAKKwkJY2FzZSBRX1JFR05VTTogICByZXR1cm4oMTMxKTsgCisJCWNhc2UgQUxVX1JFR05VTTogcmV0dXJuKDEzMik7IAorCQljYXNlIEJQX1JFR05VTTogIHJldHVybigxMzMpOyAKKwkJY2FzZSBGQ19SRUdOVU06ICByZXR1cm4oMTM0KTsgCisJCWNhc2UgQ1JfUkVHTlVNOiAgcmV0dXJuKDEzNSk7IAorCQljYXNlIEZQRV9SRUdOVU06IHJldHVybigxNjApOyAKKwkJY2FzZSBJTlRFX1JFR05VTTogcmV0dXJuKDE2MSk7IAorCQljYXNlIEZQU19SRUdOVU06IHJldHVybigxNjIpOyAKKwkJY2FzZSBFWE9fUkVHTlVNOnJldHVybigxNjQpOyAKKwkJZGVmYXVsdDoKKwkJCXJldHVybigyNTUpOwkvKiBGYWlsdXJlID8gKi8KKwl9Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIAorICogSW5pdGlhbGl6ZSB0aGUgdGFyZ2V0IGRlYnVnZ2VyIChtaW5pbW9uIG9ubHkpLgorICovCitzdGF0aWMgdm9pZAoraW5pdF90YXJnZXRfbW0odHN0YXJ0LHRlbmQsZHN0YXJ0LGRlbmQsZW50cnksbXNfc2l6ZSxyc19zaXplLGFyZ19zdGFydCkKK0FERFIzMgl0c3RhcnQsdGVuZCxkc3RhcnQsZGVuZCxlbnRyeTsKK0lOVDMyCW1zX3NpemUscnNfc2l6ZTsKK0FERFIzMglhcmdfc3RhcnQ7Cit7CisJb3V0X21zZ19idWYtPmluaXRfbXNnLmNvZGUgPSBJTklUOworCW91dF9tc2dfYnVmLT5pbml0X21zZy5sZW5ndGg9IHNpemVvZihzdHJ1Y3QgaW5pdF9tc2dfdCktMipzaXplb2YoSU5UMzIpOworCW91dF9tc2dfYnVmLT5pbml0X21zZy50ZXh0X3N0YXJ0ID0gdHN0YXJ0OworCW91dF9tc2dfYnVmLT5pbml0X21zZy50ZXh0X2VuZCA9IHRlbmQ7CisJb3V0X21zZ19idWYtPmluaXRfbXNnLmRhdGFfc3RhcnQgPSBkc3RhcnQ7CisJb3V0X21zZ19idWYtPmluaXRfbXNnLmRhdGFfZW5kID0gZGVuZDsKKwlvdXRfbXNnX2J1Zi0+aW5pdF9tc2cuZW50cnlfcG9pbnQgPSBlbnRyeTsKKwlvdXRfbXNnX2J1Zi0+aW5pdF9tc2cubWVtX3N0YWNrX3NpemUgPSBtc19zaXplOworCW91dF9tc2dfYnVmLT5pbml0X21zZy5yZWdfc3RhY2tfc2l6ZSA9IHJzX3NpemU7CisJb3V0X21zZ19idWYtPmluaXRfbXNnLmFyZ19zdGFydCA9IGFyZ19zdGFydDsKKwltc2dfc2VuZF9zZXJpYWwob3V0X21zZ19idWYpOworCWV4cGVjdF9tc2coSU5JVF9BQ0ssaW5fbXNnX2J1ZiwxKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gbWVzc2FnZSBjb2RlLgorICogTm90IGFsbCBtZXNzYWdlcyBhcmUgcmVwcmVzZW50ZWQgaGVyZSwgb25seSB0aGUgb25lcyB0aGF0IHdlIGV4cGVjdAorICogdG8gYmUgY2FsbGVkIHdpdGguCisgKi8KK3N0YXRpYyBjaGFyKgorbXNnX3N0cihjb2RlKQorSU5UMzIJY29kZTsKK3sKKwlzdGF0aWMgY2hhciBjYnVmWzMyXTsKKworCXN3aXRjaCAoY29kZSkgeworCWNhc2UgQktQVF9TRVRfQUNLOiBzcHJpbnRmKGNidWYsIiVzICglZCkiLCJCS1BUX1NFVF9BQ0siLGNvZGUpOyBicmVhazsgCisJY2FzZSBCS1BUX1JNX0FDSzogc3ByaW50ZihjYnVmLCIlcyAoJWQpIiwiQktQVF9STV9BQ0siLGNvZGUpOyBicmVhazsgCisJY2FzZSBJTklUX0FDSzogCSAgc3ByaW50ZihjYnVmLCIlcyAoJWQpIiwiSU5JVF9BQ0siLGNvZGUpOyBicmVhazsgCisJY2FzZSBSRUFEX0FDSzogCSAgc3ByaW50ZihjYnVmLCIlcyAoJWQpIiwiUkVBRF9BQ0siLGNvZGUpOyBicmVhazsgCisJY2FzZSBXUklURV9BQ0s6CSAgc3ByaW50ZihjYnVmLCIlcyAoJWQpIiwiV1JJVEVfQUNLIixjb2RlKTsgYnJlYWs7IAorCWNhc2UgRVJST1I6ICAgICAgIHNwcmludGYoY2J1ZiwiJXMgKCVkKSIsIkVSUk9SIixjb2RlKTsgYnJlYWs7IAorCWNhc2UgSEFMVDogCXNwcmludGYoY2J1ZiwiJXMgKCVkKSIsIkhBTFQiLGNvZGUpOyBicmVhazsgCisJZGVmYXVsdDoJc3ByaW50ZihjYnVmLCJVTktOT1dOICglZCkiLGNvZGUpOyBicmVhazsgCisJfQorCXJldHVybihjYnVmKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFNlbGVjdGVkIChub3QgYWxsIG9mIHRoZW0pIGVycm9yIGNvZGVzIHRoYXQgd2UgbWlnaHQgZ2V0LgorICovCitzdGF0aWMgY2hhciogCitlcnJvcl9tc2dfc3RyKGNvZGUpCitJTlQzMgljb2RlOworeworCXN0YXRpYyBjaGFyIGNidWZbNTBdOworCisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBFTUZBSUw6IAlyZXR1cm4oIkVNRkFJTDogdW5yZWNvdmVyYWJsZSBlcnJvciIpOyAKKwljYXNlIEVNQkFEQUREUjogcmV0dXJuKCJFTUJBREFERFI6IElsbGVnYWwgYWRkcmVzcyIpOyAKKwljYXNlIEVNQkFEUkVHOiAJcmV0dXJuKCJFTUJBRFJFRzogSWxsZWdhbCByZWdpc3RlciAiKTsgCisJY2FzZSBFTUFDQ0VTUzogCXJldHVybigiRU1BQ0NFU1M6IENvdWxkIG5vdCBhY2Nlc3MgbWVtb3J5Iik7CisJY2FzZSBFTUJBRE1TRzogCXJldHVybigiRU1CQURNU0c6IFVua25vd24gbWVzc2FnZSB0eXBlIik7IAorCWNhc2UgRU1NU0cyQklHOiByZXR1cm4oIkVNTVNHMkJJRzogTWVzc2FnZSB0byBsYXJnZSIpOyAKKwljYXNlIEVNTk9TRU5EOiAJcmV0dXJuKCJFTU5PU0VORDogQ291bGQgbm90IHNlbmQgbWVzc2FnZSIpOyAKKwljYXNlIEVNTk9SRUNWOiAJcmV0dXJuKCJFTU5PUkVDVjogQ291bGQgbm90IHJlY3YgbWVzc2FnZSIpOyAKKwljYXNlIEVNUkVTRVQ6IAlyZXR1cm4oIkVNUkVTRVQ6IENvdWxkIG5vdCBSRVNFVCB0YXJnZXQiKTsgCisJY2FzZSBFTUNPTkZJRzogCXJldHVybigiRU1DT05GSUc6IENvdWxkIG5vdCBnZXQgdGFyZ2V0IENPTkZJRyIpOyAKKwljYXNlIEVNU1RBVFVTOiAJcmV0dXJuKCJFTVNUQVRVUzogQ291bGQgbm90IGdldCB0YXJnZXQgU1RBVFVTIik7IAorCWNhc2UgRU1SRUFEOiAJcmV0dXJuKCJFTVJFQUQ6IENvdWxkIG5vdCBSRUFEIHRhcmdldCBtZW1vcnkiKTsgCisJY2FzZSBFTVdSSVRFOiAJcmV0dXJuKCJFTVdSSVRFOiBDb3VsZCBub3QgV1JJVEUgdGFyZ2V0IG1lbW9yeSIpOyAKKwljYXNlIEVNQktQVFNFVDogcmV0dXJuKCJFTUJLUFRTRVQ6IENvdWxkIG5vdCBzZXQgYnJlYWtwb2ludCIpOyAKKwljYXNlIEVNQktQVFJNOglyZXR1cm4oIkVNQktQVFJNOiBDb3VsZCBub3QgcmVtb3ZlIGJyZWFrcG9pbnQiKTsgCisJY2FzZSBFTUJLUFRTVEFUOnJldHVybigiRU1CS1BUU1RBVDogQ291bGQgbm90IGdldCBicmVha3BvaW50IHN0YXR1cyIpOyAKKwljYXNlIEVNQktQVE5PTkU6cmV0dXJuKCJFTUJLUFROT05FOiBBbGwgYnJlYWtwb2ludHMgaW4gdXNlIik7IAorCWNhc2UgRU1CS1BUVVNFRDpyZXR1cm4oIkVNQktQVFVTRUQ6IEJyZWFrcG9pbnRzIGFscmVhZHkgaW4gdXNlIik7IAorCWNhc2UgRU1JTklUOiAJcmV0dXJuKCJFTUlOSVQ6IENvdWxkIG5vdCBpbml0IHRhcmdldCBtZW1vcnkiKTsgCisJY2FzZSBFTUdPOiAJcmV0dXJuKCJFTUdPOiBDb3VsZCBub3Qgc3RhcnQgZXhlY3V0aW9uIik7IAorCWNhc2UgRU1TVEVQOiAJcmV0dXJuKCJFTVNURVA6IENvdWxkIG5vdCBzaW5nbGUgc3RlcCIpOyAKKwljYXNlIEVNQlJFQUs6IAlyZXR1cm4oIkVNQlJFQUs6IENvdWxkIG5vdCBCUkVBSyIpOyAKKwljYXNlIEVNQ09NTUVSUjogcmV0dXJuKCJFTUNPTU1FUlI6IENvbW11bmljYXRpb24gZXJyb3IiKTsgCisJZGVmYXVsdDogICAgIAlzcHJpbnRmKGNidWYsImVycm9yIG51bWJlciAlZCIsY29kZSk7IGJyZWFrOworCX0gLyogZW5kIHN3aXRjaCAqLworCisJcmV0dXJuIChjYnVmKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogCisgKiAgUmVjZWl2ZSBhIG1lc3NhZ2UgYW5kIGV4cGVjdCBpdCB0byBiZSBvZiB0eXBlIG1zZ2NvZGUuCisgKiAgUmV0dXJucyAwLzEgb24gZmFpbHVyZS9zdWNjZXNzLgorICovCitzdGF0aWMgaW50CitleHBlY3RfbXNnKG1zZ2NvZGUsbXNnX2J1Zixmcm9tX3R0eSkKK0lOVDMyCW1zZ2NvZGU7CQkvKiBNc2cgY29kZSB3ZSBleHBlY3QgKi8KK3VuaW9uIG1zZ190ICptc2dfYnVmOwkJLyogV2hlcmUgdG8gcHV0ICB0aGUgbWVzc2FnZSByZWNlaXZlZCAqLworaW50CWZyb21fdHR5OwkJLyogUHJpbnQgbWVzc2FnZSBvbiBlcnJvciBpZiBub24temVybyAqLworeworICBpbnQJcmV0cmllcz0wOworICB3aGlsZShtc2dfcmVjdl9zZXJpYWwobXNnX2J1ZikgJiYgKHJldHJpZXMrKzxNQVhfUkVUUklFUykpOyAKKyAgaWYgKHJldHJpZXMgPj0gTUFYX1JFVFJJRVMpIHsKKwlwcmludGYoIkV4cGVjdGVkIG1zZyAlcywgIixtc2dfc3RyKG1zZ2NvZGUpKTsKKwlwcmludGYoIm5vIG1lc3NhZ2UgcmVjZWl2ZWQhXG4iKTsKKyAgICAgICAgcmV0dXJuKDApOwkJLyogRmFpbHVyZSAqLworICB9CisKKyAgaWYgKG1zZ19idWYtPmdlbmVyaWNfbXNnLmNvZGUgIT0gbXNnY29kZSkgeworICAgICBpZiAoZnJvbV90dHkpIHsKKwlwcmludGYoIkV4cGVjdGVkIG1zZyAlcywgIixtc2dfc3RyKG1zZ2NvZGUpKTsKKwlwcmludGYoImdvdCBtc2cgJXNcbiIsbXNnX3N0cihtc2dfYnVmLT5nZW5lcmljX21zZy5jb2RlKSk7CisgICAgICAgIGlmIChtc2dfYnVmLT5nZW5lcmljX21zZy5jb2RlID09IEVSUk9SKSAKKwkJcHJpbnRmKCIlc1xuIixlcnJvcl9tc2dfc3RyKG1zZ19idWYtPmVycm9yX21zZy5lcnJvcl9jb2RlKSk7CisgICAgIH0KKyAgICAgcmV0dXJuKDApOwkJCS8qIEZhaWx1cmUgKi8KKyAgfQorICByZXR1cm4oMSk7CQkJLyogU3VjY2VzcyAqLworfQkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIERldGVybWluZSB0aGUgTWluaU1vbiBtZW1vcnkgc3BhY2UgcXVhbGlmaWVyIGJhc2VkIG9uIHRoZSBhZGRyLiAKKyAqIEZJWE1FOiBDYW4ndCBkaXN0aW5ndWlzIElfUk9NL0RfUk9NLiAgCisgKiBGSVhNRTogRG9lc24ndCBrbm93IGFueXRoaW5nIGFib3V0IElfQ0FDSEUvRF9DQUNIRS4KKyAqLworc3RhdGljIGludAorbW1fbWVtb3J5X3NwYWNlKGFkZHIpCitDT1JFX0FERFIJKmFkZHI7Cit7CisJQUREUjMyIHRzdGFydCA9IHRhcmdldF9jb25maWcuSV9tZW1fc3RhcnQ7CisJQUREUjMyIHRlbmQgICA9IHRzdGFydCArIHRhcmdldF9jb25maWcuSV9tZW1fc2l6ZTsgIAorCUFERFIzMiBkc3RhcnQgPSB0YXJnZXRfY29uZmlnLkRfbWVtX3N0YXJ0OworCUFERFIzMiBkZW5kICAgPSB0c3RhcnQgKyB0YXJnZXRfY29uZmlnLkRfbWVtX3NpemU7ICAKKwlBRERSMzIgcnN0YXJ0ID0gdGFyZ2V0X2NvbmZpZy5ST01fc3RhcnQ7CisJQUREUjMyIHJlbmQgICA9IHRzdGFydCArIHRhcmdldF9jb25maWcuUk9NX3NpemU7ICAKKworCWlmICgoKEFERFIzMilhZGRyID49IHRzdGFydCkgJiYgKChBRERSMzIpYWRkciA8IHRlbmQpKSB7IAorCQlyZXR1cm4gSV9NRU07CisJfSBlbHNlIGlmICgoKEFERFIzMilhZGRyID49IGRzdGFydCkgJiYgKChBRERSMzIpYWRkciA8IGRlbmQpKSB7IAorCQlyZXR1cm4gRF9NRU07CisJfSBlbHNlIGlmICgoKEFERFIzMilhZGRyID49IHJzdGFydCkgJiYgKChBRERSMzIpYWRkciA8IHJlbmQpKSB7CisJCS8qIEZJWE1FOiBob3cgZG8gd2UgZGV0ZXJtaW5lIGJldHdlZW4gRF9ST00gYW5kIElfUk9NICovCisJCXJldHVybiBEX1JPTTsKKwl9IGVsc2UJLyogRklYTUU6IHdoYXQgZG8gbWUgZG8gbm93PyAqLworCQlyZXR1cm4gRF9NRU07CS8qIEhtbW0hICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogCisgKiAgRGVmaW5lIHRoZSB0YXJnZXQgc3Vicm91dGluZSBuYW1lcworICovCitzdHJ1Y3QgdGFyZ2V0X29wcyBtbV9vcHMgOworCitzdGF0aWMgdm9pZCAKK2luaXRfbW1fb3BzKHZvaWQpCit7CisgIG1tX29wcy50b19zaG9ydG5hbWUgPSAgICJtaW5pbW9uIjsKKyAgbW1fb3BzLnRvX2xvbmduYW1lID0gICAiUmVtb3RlIEFNRC9NaW5pbW9uIHRhcmdldCI7CisgIG1tX29wcy50b19kb2MgPSAgICJSZW1vdGUgZGVidWcgYW4gQU1EIDI5MCowIHVzaW5nIHRoZSBNaW5pTW9uIGRiZyBjb3JlIG9uIHRoZSB0YXJnZXQiOworICBtbV9vcHMudG9fb3BlbiA9ICAgbW1fb3BlbjsKKyAgbW1fb3BzLnRvX2Nsb3NlID0gICBtbV9jbG9zZTsKKyAgbW1fb3BzLnRvX2F0dGFjaCA9ICAgbW1fYXR0YWNoOworICBtbV9vcHMudG9fcG9zdF9hdHRhY2ggPSBOVUxMOworICBtbV9vcHMudG9fcmVxdWlyZV9hdHRhY2ggPSBOVUxMOworICBtbV9vcHMudG9fZGV0YWNoID0gICBtbV9kZXRhY2g7CisgIG1tX29wcy50b19yZXF1aXJlX2RldGFjaCA9IE5VTEw7CisgIG1tX29wcy50b19yZXN1bWUgPSAgIG1tX3Jlc3VtZTsKKyAgbW1fb3BzLnRvX3dhaXQgID0gICBtbV93YWl0OworICBtbV9vcHMudG9fcG9zdF93YWl0ID0gTlVMTDsKKyAgbW1fb3BzLnRvX2ZldGNoX3JlZ2lzdGVycyAgPSAgIG1tX2ZldGNoX3JlZ2lzdGVyczsKKyAgbW1fb3BzLnRvX3N0b3JlX3JlZ2lzdGVycyAgPSAgIG1tX3N0b3JlX3JlZ2lzdGVyczsKKyAgbW1fb3BzLnRvX3ByZXBhcmVfdG9fc3RvcmUgPSAgIG1tX3ByZXBhcmVfdG9fc3RvcmU7CisgIG1tX29wcy50b194ZmVyX21lbW9yeSAgPSAgIG1tX3hmZXJfaW5mZXJpb3JfbWVtb3J5OworICBtbV9vcHMudG9fZmlsZXNfaW5mbyAgPSAgIG1tX2ZpbGVzX2luZm87CisgIG1tX29wcy50b19pbnNlcnRfYnJlYWtwb2ludCA9ICAgbW1faW5zZXJ0X2JyZWFrcG9pbnQ7CisgIG1tX29wcy50b19yZW1vdmVfYnJlYWtwb2ludCA9ICAgbW1fcmVtb3ZlX2JyZWFrcG9pbnQ7CisgIG1tX29wcy50b190ZXJtaW5hbF9pbml0ICA9ICAgMDsKKyAgbW1fb3BzLnRvX3Rlcm1pbmFsX2luZmVyaW9yID0gICAwOworICBtbV9vcHMudG9fdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ID0gICAwOworICBtbV9vcHMudG9fdGVybWluYWxfb3VycyAgPSAgIDA7CisgIG1tX29wcy50b190ZXJtaW5hbF9pbmZvICA9ICAgMDsgICAgICAgIAorICBtbV9vcHMudG9fa2lsbCAgPSAgIG1tX2tpbGw7ICAgICAgICAgICAKKyAgbW1fb3BzLnRvX2xvYWQgID0gICBtbV9sb2FkOworICBtbV9vcHMudG9fbG9va3VwX3N5bWJvbCA9ICAgMDsgICAgICAgICAgIAorICBtbV9vcHMudG9fY3JlYXRlX2luZmVyaW9yID0gICBtbV9jcmVhdGVfaW5mZXJpb3I7CisgIG1tX29wcy50b19wb3N0X3N0YXJ0dXBfaW5mZXJpb3IgPSBOVUxMOworICBtbV9vcHMudG9fYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvciA9IE5VTEw7CisgIG1tX29wcy50b19jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yID0gTlVMTDsKKyAgbW1fb3BzLnRvX3Bvc3RfZm9sbG93X2luZmVyaW9yX2J5X2Nsb25lID0gTlVMTDsKKyAgbW1fb3BzLnRvX2luc2VydF9mb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBtbV9vcHMudG9fcmVtb3ZlX2ZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIG1tX29wcy50b19pbnNlcnRfdmZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIG1tX29wcy50b19yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIG1tX29wcy50b19oYXNfZm9ya2VkID0gTlVMTDsKKyAgbW1fb3BzLnRvX2hhc192Zm9ya2VkID0gTlVMTDsKKyAgbW1fb3BzLnRvX2Nhbl9mb2xsb3dfdmZvcmtfcHJpb3JfdG9fZXhlYyA9IE5VTEw7CisgIG1tX29wcy50b19wb3N0X2ZvbGxvd192Zm9yayA9IE5VTEw7IAorICBtbV9vcHMudG9faW5zZXJ0X2V4ZWNfY2F0Y2hwb2ludCA9IE5VTEw7CisgIG1tX29wcy50b19yZW1vdmVfZXhlY19jYXRjaHBvaW50ID0gTlVMTDsKKyAgbW1fb3BzLnRvX2hhc19leGVjZCA9IE5VTEw7CisgIG1tX29wcy50b19yZXBvcnRlZF9leGVjX2V2ZW50c19wZXJfZXhlY19jYWxsID0gTlVMTDsKKyAgbW1fb3BzLnRvX2hhc19leGl0ZWQgPSBOVUxMOworICBtbV9vcHMudG9fbW91cm5faW5mZXJpb3IgPSAgIG1tX21vdXJuOyAKKyAgbW1fb3BzLnRvX2Nhbl9ydW4gID0gICAwOwkKKyAgbW1fb3BzLnRvX25vdGljZV9zaWduYWxzID0gICAwOworICBtbV9vcHMudG9fdGhyZWFkX2FsaXZlICA9ICAgMDsKKyAgbW1fb3BzLnRvX3N0b3AgID0gICAwOwkJCisgIG1tX29wcy50b19waWRfdG9fZXhlY19maWxlID0gTlVMTDsKKyAgbW1fb3BzLnRvX2NvcmVfZmlsZV90b19zeW1fZmlsZSA9IE5VTEw7CisgIG1tX29wcy50b19zdHJhdHVtID0gICBwcm9jZXNzX3N0cmF0dW07CisgIG1tX29wcy5ET05UX1VTRSA9ICAgMDsgCisgIG1tX29wcy50b19oYXNfYWxsX21lbW9yeSA9ICAgMTsKKyAgbW1fb3BzLnRvX2hhc19tZW1vcnkgPSAgIDE7CisgIG1tX29wcy50b19oYXNfc3RhY2sgPSAgIDE7CisgIG1tX29wcy50b19oYXNfcmVnaXN0ZXJzID0gICAxOworICBtbV9vcHMudG9faGFzX2V4ZWN1dGlvbiA9ICAgMTsgCisgIG1tX29wcy50b19zZWN0aW9ucyA9ICAgMDsKKyAgbW1fb3BzLnRvX3NlY3Rpb25zX2VuZCA9ICAgMDsJCisgIG1tX29wcy50b19tYWdpYyA9ICAgT1BTX01BR0lDOyAgICAKK307CisKK3ZvaWQKK19pbml0aWFsaXplX3JlbW90ZV9tbSgpCit7CisgIGluaXRfbW1fb3BzKCkgOworICBhZGRfdGFyZ2V0ICgmbW1fb3BzKTsKK30KKworI2lmZGVmIE5PX0hJRl9TVVBQT1JUCitzZXJ2aWNlX0hJRihtc2cpCit1bmlvbiBtc2dfdAkqbXNnOworeworCXJldHVybigwKTsJLyogRW11bGF0ZSBhIGZhaWx1cmUgKi8KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS1uaW5keS5jIGIvZ2RiL3JlbW90ZS1uaW5keS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZTg5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmVtb3RlLW5pbmR5LmMKQEAgLTAsMCArMSw4NTIgQEAKKy8qIE1lbW9yeS1hY2Nlc3MgYW5kIGNvbW1hbmRzIGZvciByZW1vdGUgTklORFkgcHJvY2VzcywgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgSW50ZWwgQ29ycG9yYXRpb24uICBNb2RpZmllZCBmcm9tIHJlbW90ZS5jIGJ5IENocmlzIEJlbmVuYXRpLgorCitHREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWS4gIE5vIGF1dGhvciBvciBkaXN0cmlidXRvciBhY2NlcHRzIHJlc3BvbnNpYmlsaXR5IHRvIGFueW9uZQorZm9yIHRoZSBjb25zZXF1ZW5jZXMgb2YgdXNpbmcgaXQgb3IgZm9yIHdoZXRoZXIgaXQgc2VydmVzIGFueQorcGFydGljdWxhciBwdXJwb3NlIG9yIHdvcmtzIGF0IGFsbCwgdW5sZXNzIGhlIHNheXMgc28gaW4gd3JpdGluZy4KK1JlZmVyIHRvIHRoZSBHREIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgZnVsbCBkZXRhaWxzLgorCitFdmVyeW9uZSBpcyBncmFudGVkIHBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUgR0RCLAorYnV0IG9ubHkgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZGVzY3JpYmVkIGluIHRoZSBHREIgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UuICBBIGNvcHkgb2YgdGhpcyBsaWNlbnNlIGlzIHN1cHBvc2VkIHRvIGhhdmUgYmVlbiBnaXZlbiB0byB5b3UKK2Fsb25nIHdpdGggR0RCIHNvIHlvdSBjYW4ga25vdyB5b3VyIHJpZ2h0cyBhbmQgcmVzcG9uc2liaWxpdGllcy4gIEl0CitzaG91bGQgYmUgaW4gYSBmaWxlIG5hbWVkIENPUFlJTkcuICBBbW9uZyBvdGhlciB0aGluZ3MsIHRoZSBjb3B5cmlnaHQKK25vdGljZSBhbmQgdGhpcyBub3RpY2UgbXVzdCBiZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKworSW4gb3RoZXIgd29yZHMsIGdvIGFoZWFkIGFuZCBzaGFyZSBHREIsIGJ1dCBkb24ndCB0cnkgdG8gc3RvcAorYW55b25lIGVsc2UgZnJvbSBzaGFyaW5nIGl0IGZhcnRoZXIuICBIZWxwIHN0YW1wIG91dCBzb2Z0d2FyZSBob2FyZGluZyEKKyovCisKKy8qCitFeGNlcHQgZm9yIHRoZSBkYXRhIGNhY2hlIHJvdXRpbmVzLCB0aGlzIGZpbGUgYmVhcnMgbGl0dGxlIHJlc2VtYmxlbmNlCit0byByZW1vdGUuYy4gIEEgbmV3IChhbHRob3VnaCBzaW1pbGFyKSBwcm90b2NvbCBoYXMgYmVlbiBzcGVjaWZpZWQsIGFuZAorcG9ydGlvbnMgb2YgdGhlIGNvZGUgYXJlIGVudGlyZWx5IGRlcGVuZGVudCBvbiBoYXZpbmcgYW4gaTgwOTYwIHdpdGggYQorTklORFkgUk9NIG1vbml0b3IgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgbGluZS4KKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJFTU9URSBDT01NVU5JQ0FUSU9OIFBST1RPQ09MIEJFVFdFRU4gR0RCOTYwIEFORCBUSEUgTklORFkgUk9NIE1PTklUT1IuCisgKgorICoKKyAqIE1PREVTIE9GIE9QRVJBVElPTgorICogLS0tLS0gLS0gLS0tLS0tLS0tCisgKgkKKyAqIEFzIGZhciBhcyBOSU5EWSBpcyBjb25jZXJuZWQsIEdEQiBpcyBhbHdheXMgaW4gb25lIG9mIHR3byBtb2RlczogY29tbWFuZAorICogbW9kZSBvciBwYXNzdGhyb3VnaCBtb2RlLgorICoKKyAqIEluIGNvbW1hbmQgbW9kZSAodGhlIGRlZmF1bHQpIHByZS1kZWZpbmVkIHBhY2tldHMgY29udGFpbmluZyByZXF1ZXN0cworICogYXJlIHNlbnQgYnkgR0RCIHRvIE5JTkRZLiAgTklORFkgbmV2ZXIgdGFsa3MgZXhjZXB0IGluIHJlcG9uc2UgdG8gYSByZXF1ZXN0LgorICoKKyAqIE9uY2UgdGhlIHRoZSB1c2VyIHByb2dyYW0gaXMgc3RhcnRlZCwgR0RCIGVudGVycyBwYXNzdGhyb3VnaCBtb2RlLCB0byBnaXZlCisgKiB0aGUgdXNlciBwcm9ncmFtIGFjY2VzcyB0byB0aGUgdGVybWluYWwuICBHREIgcmVtYWlucyBpbiB0aGlzIG1vZGUgdW50aWwKKyAqIE5JTkRZIGluZGljYXRlcyB0aGF0IHRoZSBwcm9ncmFtIGhhcyBzdG9wcGVkLgorICoKKyAqCisgKiBQQVNTVEhST1VHSCBNT0RFCisgKiAtLS0tLS0tLS0tLSAtLS0tCisgKgorICogR0RCIHdyaXRlcyBhbGwgaW5wdXQgcmVjZWl2ZWQgZnJvbSB0aGUga2V5Ym9hcmQgZGlyZWN0bHkgdG8gTklORFksIGFuZCB3cml0ZXMKKyAqIGFsbCBjaGFyYWN0ZXJzIHJlY2VpdmVkIGZyb20gTklORFkgZGlyZWN0bHkgdG8gdGhlIG1vbml0b3IuCisgKgorICogS2V5Ym9hcmQgaW5wdXQgaXMgbmVpdGhlciBidWZmZXJlZCBub3IgZWNob2VkIHRvIHRoZSBtb25pdG9yLgorICoKKyAqIEdEQiByZW1haW5zIGluIHBhc3N0aHJvdWdoIG1vZGUgdW50aWwgTklORFkgc2VuZHMgYSBzaW5nbGUgXlAgY2hhcmFjdGVyLAorICogdG8gaW5kaWNhdGUgdGhhdCB0aGUgdXNlciBwcm9jZXNzIGhhcyBzdG9wcGVkLgorICoKKyAqIE5vdGU6CisgKglHREIgYXNzdW1lcyBOSU5EWSBwZXJmb3JtcyBhICdmbHVzaHJlZycgd2hlbiB0aGUgdXNlciBwcm9ncmFtIHN0b3BzLgorICoKKyAqCisgKiBDT01NQU5EIE1PREUKKyAqIC0tLS0tLS0gLS0tLQorICoKKyAqIEFsbCBpbmZvIChleGNlcHQgZm9yIG1lc3NhZ2UgYWNrIGFuZCBuYWspIGlzIHRyYW5zZmVycmVkIGJldHdlZW4gZ2RiCisgKiBhbmQgdGhlIHJlbW90ZSBwcm9jZXNzb3IgaW4gbWVzc2FnZXMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgKgorICoJCTxpbmZvPiM8Y2hlY2tzdW0+CisgKgorICogd2hlcmUgCisgKgkjCWlzIGEgbGl0ZXJhbCBjaGFyYWN0ZXIKKyAqCisgKgk8aW5mbz4JQVNDSUkgaW5mb3JtYXRpb247ICBhbGwgbnVtZXJpYyBpbmZvcm1hdGlvbiBpcyBpbiB0aGUKKyAqCQlmb3JtIG9mIGhleCBkaWdpdHMgKCcwJy0nOScgYW5kIGxvd2VyY2FzZSAnYSctJ2YnKS4KKyAqCisgKgk8Y2hlY2tzdW0+CisgKgkJaXMgYSBwYWlyIG9mIEFTQ0lJIGhleCBkaWdpdHMgcmVwcmVzZW50aW5nIGFuIDgtYml0CisgKgkJY2hlY2tzdW0gZm9ybWVkIGJ5IGFkZGluZyB0b2dldGhlciBlYWNoIG9mIHRoZQorICoJCWNoYXJhY3RlcnMgaW4gPGluZm8+LgorICoKKyAqIFRoZSByZWNlaXZlciBvZiBhIG1lc3NhZ2UgYWx3YXlzIHNlbmRzIGEgc2luZ2xlIGNoYXJhY3RlciB0byB0aGUgc2VuZGVyCisgKiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjaGVja3N1bSB3YXMgZ29vZCAoJysnKSBvciBiYWQgKCctJyk7ICB0aGUgc2VuZGVyCisgKiByZS10cmFuc21pdHMgdGhlIGVudGlyZSBtZXNzYWdlIG92ZXIgdW50aWwgYSAnKycgaXMgcmVjZWl2ZWQuCisgKgorICogSW4gcmVzcG9uc2UgdG8gYSBjb21tYW5kIE5JTkRZIGFsd2F5cyBzZW5kcyBiYWNrIGVpdGhlciBkYXRhIG9yCisgKiBhIHJlc3VsdCBjb2RlIG9mIHRoZSBmb3JtICJYbm4iLCB3aGVyZSAibm4iIGFyZSBoZXggZGlnaXRzIGFuZCAiWDAwIgorICogbWVhbnMgbm8gZXJyb3JzLiAgKEV4Y2VwdGlvbnM6IHRoZSAicyIgYW5kICJjIiBjb21tYW5kcyBkb24ndCByZXNwb25kLikKKyAqCisgKiBTRUUgVEhFIEhFQURFUiBPRiBUSEUgRklMRSAiZ2RiLmMiIElOIFRIRSBOSU5EWSBNT05JVE9SIFNPVVJDRSBDT0RFIEZPUiBBCisgKiBGVUxMIERFU0NSSVBUSU9OIE9GIExFR0FMIENPTU1BTkRTLgorICoKKyAqIFNFRSBUSEUgRklMRSAic3RvcC5oIiBJTiBUSEUgTklORFkgTU9OSVRPUiBTT1VSQ0UgQ09ERSBGT1IgQSBMSVNUCisgKiBPRiBTVE9QIENPREVTLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJjb21tYW5kLmgiCisjaW5jbHVkZSAiZmxvYXRmb3JtYXQuaCIKKworI2luY2x1ZGUgIndhaXQuaCIKKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAic2VyaWFsLmgiCisjaW5jbHVkZSAibmluZHktc2hhcmUvZW52LmgiCisjaW5jbHVkZSAibmluZHktc2hhcmUvc3RvcC5oIgorCisjaW5jbHVkZSAiZGNhY2hlLmgiCisjaW5jbHVkZSAicmVtb3RlLXV0aWxzLmgiCisKK3N0YXRpYyBEQ0FDSEUgKm5pbmR5X2RjYWNoZTsKKworZXh0ZXJuIGludCB1bmxpbmsoKTsKK2V4dGVybiBjaGFyICpnZXRlbnYoKTsKK2V4dGVybiBjaGFyICpta3RlbXAoKTsKKworZXh0ZXJuIHZvaWQgZ2VuZXJpY19tb3Vybl9pbmZlcmlvciAoKTsKKworZXh0ZXJuIHN0cnVjdCB0YXJnZXRfb3BzIG5pbmR5X29wczsKK2V4dGVybiBGSUxFICppbnN0cmVhbTsKKworZXh0ZXJuIGNoYXIgbmluU3RvcFdoeSAoKTsKK2V4dGVybiBpbnQgbmluTWVtR2V0ICgpOworZXh0ZXJuIGludCBuaW5NZW1QdXQgKCk7CisKK2ludCBuaW5keV9pbml0aWFsX2JyazsJLyogbm9uemVybyBpZiB3YW50IHRvIHNlbmQgYW4gaW5pdGlhbCBCUkVBSyB0byBuaW5keSAqLworaW50IG5pbmR5X29sZF9wcm90b2NvbDsJLyogbm9uemVybyBpZiB3YW50IHRvIHVzZSBvbGQgcHJvdG9jb2wgKi8KK2NoYXIgKm5pbmR5X3R0eW5hbWU7CS8qIG5hbWUgb2YgdHR5IHRvIHRhbGsgdG8gbmluZHkgb24sIG9yIG51bGwgKi8KKworI2RlZmluZSBETEUJJ1wwMjAnCS8qIENoYXJhY3RlciBOSU5EWSBzZW5kcyB0byBpbmRpY2F0ZSB1c2VyIHByb2dyYW0gaGFzCisJCQkgKiBoYWx0ZWQuICAqLworI2RlZmluZSBUUlVFCTEKKyNkZWZpbmUgRkFMU0UJMAorCisvKiBGcm9tIG5pbmR5LXNoYXJlL25pbmR5LmMuICAqLworZXh0ZXJuIHNlcmlhbF90IG5pbmR5X3NlcmlhbDsKKworc3RhdGljIGludCBoYXZlX3JlZ3MgPSAwOwkvKiAxIGlmZiByZWdzIHJlYWQgc2luY2UgaTk2MCBsYXN0IGhhbHRlZCAqLworc3RhdGljIGludCByZWdzX2NoYW5nZWQgPSAwOwkvKiAxIGlmZiByZWdzIHdlcmUgbW9kaWZpZWQgc2luY2UgbGFzdCByZWFkICovCisKK2V4dGVybiBjaGFyICpleGlzdHMoKTsKKworc3RhdGljIHZvaWQKK25pbmR5X2ZldGNoX3JlZ2lzdGVycyBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIHZvaWQKK25pbmR5X3N0b3JlX3JlZ2lzdGVycyBQQVJBTVMgKChpbnQpKTsKKwwKK3N0YXRpYyBjaGFyICpzYXZlbmFtZTsKKworc3RhdGljIHZvaWQKK25pbmR5X2Nsb3NlIChxdWl0dGluZykKKyAgICAgaW50IHF1aXR0aW5nOworeworICBpZiAobmluZHlfc2VyaWFsICE9IE5VTEwpCisgICAgU0VSSUFMX0NMT1NFIChuaW5keV9zZXJpYWwpOworICBuaW5keV9zZXJpYWwgPSBOVUxMOworCisgIGlmIChzYXZlbmFtZSkKKyAgICBmcmVlIChzYXZlbmFtZSk7CisgIHNhdmVuYW1lID0gMDsKK30KKworLyogT3BlbiBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgZGVidWdnZXIuICAgCisgICBGSVhNRSwgdGhlcmUgc2hvdWxkIGJlICJzZXQiIGNvbW1hbmRzIGZvciB0aGUgb3B0aW9ucyB0aGF0IGFyZQorICAgbm93IHNwZWNpZmllZCB3aXRoIGdkYiBjb21tYW5kLWxpbmUgb3B0aW9ucyAob2xkX3Byb3RvY29sLAorICAgYW5kIGluaXRpYWxfYnJrKS4gICovCit2b2lkCituaW5keV9vcGVuIChuYW1lLCBmcm9tX3R0eSkKKyAgICBjaGFyICpuYW1lOwkJLyogIi9kZXYvdHR5WFgiLCAidHR5WFgiLCBvciAiWFgiOiB0dHkgdG8gYmUgb3BlbmVkICovCisgICAgaW50IGZyb21fdHR5OworeworICBjaGFyIGJhdWRyYXRlWzEwMjRdOworCisgIGlmICghbmFtZSkKKyAgICBlcnJvcl9ub19hcmcgKCJzZXJpYWwgcG9ydCBkZXZpY2UgbmFtZSIpOworCisgIHRhcmdldF9wcmVvcGVuIChmcm9tX3R0eSk7CisKKyAgbmluZHlfY2xvc2UgKDApOworCisgIGhhdmVfcmVncyA9IHJlZ3NfY2hhbmdlZCA9IDA7CisgIG5pbmR5X2RjYWNoZSA9IGRjYWNoZV9pbml0KG5pbk1lbUdldCwgbmluTWVtUHV0KTsKKworICAvKiBBbGxvdyB1c2VyIHRvIGludGVycnVwdCB0aGUgZm9sbG93aW5nIC0tIHdlIGNvdWxkIGhhbmcgaWYgdGhlcmUncworICAgICBubyBOSU5EWSBhdCB0aGUgb3RoZXIgZW5kIG9mIHRoZSByZW1vdGUgdHR5LiAgKi8KKyAgaW1tZWRpYXRlX3F1aXQrKzsKKyAgLyogSWYgYmF1ZF9yYXRlIGlzIC0xLCB0aGVuIG5pbkNvbm5lY3Qgd2lsbCBub3QgcmVjb2duaXplIHRoZSBiYXVkIHJhdGUKKyAgICAgYW5kIHdpbGwgZGVhbCB3aXRoIHRoZSBzaXR1YXRpb24gaW4gYSAobW9yZSBvciBsZXNzKSByZWFzb25hYmxlCisgICAgIGZhc2hpb24uICAqLworICBzcHJpbnRmKGJhdWRyYXRlLCAiJWQiLCBiYXVkX3JhdGUpOworICBuaW5Db25uZWN0KG5hbWUsIGJhdWRyYXRlLAorCSAgICAgbmluZHlfaW5pdGlhbF9icmssICFmcm9tX3R0eSwgbmluZHlfb2xkX3Byb3RvY29sKTsKKyAgaW1tZWRpYXRlX3F1aXQtLTsKKworICBpZiAobmluZHlfc2VyaWFsID09IE5VTEwpCisgICAgeworICAgICAgcGVycm9yX3dpdGhfbmFtZSAobmFtZSk7CisgICAgfQorCisgIHNhdmVuYW1lID0gc2F2ZXN0cmluZyAobmFtZSwgc3RybGVuIChuYW1lKSk7CisgIHB1c2hfdGFyZ2V0ICgmbmluZHlfb3BzKTsKKworICB0YXJnZXRfZmV0Y2hfcmVnaXN0ZXJzKC0xKTsKKworICBpbml0X3RocmVhZF9saXN0ICgpOworICBpbml0X3dhaXRfZm9yX2luZmVyaW9yICgpOworICBjbGVhcl9wcm9jZWVkX3N0YXR1cyAoKTsKKyAgbm9ybWFsX3N0b3AgKCk7Cit9CisKKy8qIFVzZXItaW5pdGlhdGVkIHF1aXQgb2YgbmluZHkgb3BlcmF0aW9ucy4gICovCisKK3N0YXRpYyB2b2lkCituaW5keV9kZXRhY2ggKG5hbWUsIGZyb21fdHR5KQorICAgICBjaGFyICpuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGlmIChuYW1lKQorICAgIGVycm9yICgiVG9vIG1hbnkgYXJndW1lbnRzIik7CisgIHBvcF90YXJnZXQgKCk7Cit9CisKK3N0YXRpYyB2b2lkCituaW5keV9maWxlc19pbmZvICgpCit7CisgIC8qIEZJWE1FOiB0aGlzIGxpZXMgYWJvdXQgdGhlIGJhdWQgcmF0ZSBpZiB3ZSBhdXRvYmF1ZGVkLiAgKi8KKyAgcHJpbnRmX3VuZmlsdGVyZWQoIlx0QXR0YWNoZWQgdG8gJXMgYXQgJWQgYml0cyBwZXIgc2Vjb25kJXMlcy5cbiIsIHNhdmVuYW1lLAorCSBiYXVkX3JhdGUsCisJIG5pbmR5X29sZF9wcm90b2NvbD8gIiBpbiBvbGQgcHJvdG9jb2wiOiAiIiwKKyAgICAgICAgIG5pbmR5X2luaXRpYWxfYnJrPyAiIHdpdGggaW5pdGlhbCBicmVhayI6ICIiKTsKK30KKwwKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGJ1ZmZlciBiZWZvcmUKKyAgIHRoZSBmaXJzdCBETEUgY2hhcmFjdGVyLiAgKi8KKworc3RhdGljCitpbnQKK25vbl9kbGUoIGJ1ZiwgbiApCisgICAgY2hhciAqYnVmOwkJLyogQ2hhcmFjdGVyIGJ1ZmZlcjsgTk9UICdcMCctdGVybWluYXRlZCAqLworICAgIGludCBuOwkJLyogTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYnVmZmVyICovCit7CisgIGludCBpOworCisgIGZvciAoIGkgPSAwOyBpIDwgbjsgaSsrICl7CisgICAgaWYgKCBidWZbaV0gPT0gRExFICl7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGk7Cit9CisMCisvKiBUZWxsIHRoZSByZW1vdGUgbWFjaGluZSB0byByZXN1bWUuICAqLworCit2b2lkCituaW5keV9yZXN1bWUgKHBpZCwgc3RlcCwgc2lnZ25hbCkKKyAgICAgaW50IHBpZCwgc3RlcDsKKyAgICAgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ2duYWw7Cit7CisgIGlmIChzaWdnbmFsICE9IFRBUkdFVF9TSUdOQUxfMCAmJiBzaWdnbmFsICE9IHN0b3Bfc2lnbmFsKQorICAgIHdhcm5pbmcgKCJDYW4ndCBzZW5kIHNpZ25hbHMgdG8gcmVtb3RlIE5JTkRZIHRhcmdldHMuIik7CisKKyAgZGNhY2hlX2ZsdXNoKG5pbmR5X2RjYWNoZSk7CisgIGlmICggcmVnc19jaGFuZ2VkICkKKyAgICB7CisgICAgICBuaW5keV9zdG9yZV9yZWdpc3RlcnMgKC0xKTsKKyAgICAgIHJlZ3NfY2hhbmdlZCA9IDA7CisgICAgfQorICBoYXZlX3JlZ3MgPSAwOworICBuaW5Hbyggc3RlcCApOworfQorDAorLyogRklYTUUsIHdlIGNhbiBwcm9iYWJseSB1c2UgdGhlIG5vcm1hbCB0ZXJtaW5hbF9pbmZlcmlvciBzdHVmZiBoZXJlLgorICAgV2UgaGF2ZSB0byBkbyB0ZXJtaW5hbF9pbmZlcmlvciBhbmQgdGhlbiBzZXQgdXAgdGhlIHBhc3N0aHJvdWdoCisgICBzZXR0aW5ncyBpbml0aWFsbHkuICBUaGVyZWFmdGVyLCB0ZXJtaW5hbF9vdXJzIGFuZCB0ZXJtaW5hbF9pbmZlcmlvcgorICAgd2lsbCBhdXRvbWF0aWNhbGx5IHN3YXAgdGhlIHNldHRpbmdzIGFyb3VuZCBmb3IgdXMuICAqLworCitzdHJ1Y3QgY2xlYW5fdXBfdHR5X2FyZ3MgeworICBzZXJpYWxfdHR5c3RhdGUgc3RhdGU7CisgIHNlcmlhbF90IHNlcmlhbDsKK307CitzdGF0aWMgIHN0cnVjdCBjbGVhbl91cF90dHlfYXJncyB0dHlfYXJnczsKKworc3RhdGljIHZvaWQKK2NsZWFuX3VwX3R0eSAocHRyYXJnKQorICAgICBQVFIgcHRyYXJnOworeworICBzdHJ1Y3QgY2xlYW5fdXBfdHR5X2FyZ3MgKmFyZ3MgPSAoc3RydWN0IGNsZWFuX3VwX3R0eV9hcmdzICopIHB0cmFyZzsKKyAgU0VSSUFMX1NFVF9UVFlfU1RBVEUgKGFyZ3MtPnNlcmlhbCwgYXJncy0+c3RhdGUpOworICBmcmVlIChhcmdzLT5zdGF0ZSk7CisgIHdhcm5pbmcgKCJcblxuWW91IG1heSBuZWVkIHRvIHJlc2V0IHRoZSA4MDk2MCBhbmQvb3IgcmVsb2FkIHlvdXIgcHJvZ3JhbS5cbiIpOworfQorCisvKiBSZWNvdmVyIGZyb20gXlogb3IgXkMgd2hpbGUgcmVtb3RlIHByb2Nlc3MgaXMgcnVubmluZyAqLworc3RhdGljIHZvaWQgKCpvbGRfY3RybGMpKCk7ICAKKyNpZmRlZiBTSUdUU1RQCitzdGF0aWMgdm9pZCAoKm9sZF9jdHJseikoKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorY2xlYW5fdXBfaW50KCkKK3sKKyAgU0VSSUFMX1NFVF9UVFlfU1RBVEUgKHR0eV9hcmdzLnNlcmlhbCwgdHR5X2FyZ3Muc3RhdGUpOworICBmcmVlICh0dHlfYXJncy5zdGF0ZSk7CisKKyAgc2lnbmFsKFNJR0lOVCwgb2xkX2N0cmxjKTsKKyNpZmRlZiBTSUdUU1RQCisgIHNpZ25hbChTSUdUU1RQLCBvbGRfY3RybHopOworI2VuZGlmCisgIGVycm9yKCJcblxuWW91IG1heSBuZWVkIHRvIHJlc2V0IHRoZSA4MDk2MCBhbmQvb3IgcmVsb2FkIHlvdXIgcHJvZ3JhbS5cbiIpOworfQorCisvKiBXYWl0IHVudGlsIHRoZSByZW1vdGUgbWFjaGluZSBzdG9wcy4gV2hpbGUgd2FpdGluZywgb3BlcmF0ZSBpbiBwYXNzdGhyb3VnaAorICogbW9kZTsgaS5lLiwgcGFzcyBldmVyeXRoaW5nIE5JTkRZIHNlbmRzIHRvIGdkYl9zdGRvdXQsIGFuZCBldmVyeXRoaW5nIGZyb20KKyAqIHN0ZGluIHRvIE5JTkRZLgorICoKKyAqIFJldHVybiB0byBjYWxsZXIsIHN0b3Jpbmcgc3RhdHVzIGluICdzdGF0dXMnIGp1c3QgYXMgYHdhaXQnIHdvdWxkLgorICovCisKK3N0YXRpYyBpbnQKK25pbmR5X3dhaXQoIHBpZCwgc3RhdHVzICkKKyAgICBpbnQgcGlkOworICAgIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqc3RhdHVzOworeworICBmZF9zZXQgZmRzOworICBpbnQgYzsKKyAgY2hhciBidWZbMl07CisgIGludCBpLCBuOworICB1bnNpZ25lZCBjaGFyIHN0b3BfZXhpdDsKKyAgdW5zaWduZWQgY2hhciBzdG9wX2NvZGU7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2xlYW51cHM7CisgIGxvbmcgaXBfdmFsdWUsIGZwX3ZhbHVlLCBzcF92YWx1ZTsJLyogUmVnIHZhbHVlcyBmcm9tIHN0b3AgKi8KKworICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVEOworICBzdGF0dXMtPnZhbHVlLmludGVnZXIgPSAwOworCisgIC8qIE9QRVJBVEUgSU4gUEFTU1RIUk9VR0ggTU9ERSBVTlRJTCBOSU5EWSBTRU5EUyBBIERMRSBDSEFSQUNURVIgKi8KKworICAvKiBTYXZlIGN1cnJlbnQgdHR5IGF0dHJpYnV0ZXMsIGFuZCByZXN0b3JlIHRoZW0gd2hlbiBkb25lLiAgKi8KKyAgdHR5X2FyZ3Muc2VyaWFsID0gU0VSSUFMX0ZET1BFTiAoMCk7CisgIHR0eV9hcmdzLnN0YXRlID0gU0VSSUFMX0dFVF9UVFlfU1RBVEUgKHR0eV9hcmdzLnNlcmlhbCk7CisgIG9sZF9jdHJsYyA9IHNpZ25hbCggU0lHSU5ULCBjbGVhbl91cF9pbnQgKTsKKyNpZmRlZiBTSUdUU1RQCisgIG9sZF9jdHJseiA9IHNpZ25hbCggU0lHVFNUUCwgY2xlYW5fdXBfaW50ICk7CisjZW5kaWYKKworICBvbGRfY2xlYW51cHMgPSBtYWtlX2NsZWFudXAgKGNsZWFuX3VwX3R0eSwgJnR0eV9hcmdzKTsKKworICAvKiBQYXNzIGlucHV0IGZyb20ga2V5Ym9hcmQgdG8gTklORFkgYXMgaXQgYXJyaXZlcy4gIE5JTkRZIHdpbGwgaW50ZXJwcmV0CisgICAgIDxDUj4gYW5kIHBlcmZvcm0gZWNoby4gICovCisgIC8qIFRoaXMgdXNlZCB0byBzZXQgQ0JSRUFLIGFuZCBjbGVhciBFQ0hPIGFuZCBDUk1PRC4gIEkgaG9wZSB0aGlzIGlzIGNsb3NlCisgICAgIGVub3VnaC4gICovCisgIFNFUklBTF9SQVcgKHR0eV9hcmdzLnNlcmlhbCk7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgLyogSW5wdXQgb24gcmVtb3RlICovCisgICAgICBjID0gU0VSSUFMX1JFQURDSEFSIChuaW5keV9zZXJpYWwsIC0xKTsKKyAgICAgIGlmIChjID09IFNFUklBTF9FUlJPUikKKwl7CisJICBlcnJvciAoIkNhbm5vdCByZWFkIGZyb20gc2VyaWFsIGxpbmUiKTsKKwl9CisgICAgICBlbHNlIGlmIChjID09IDB4MWIpIC8qIEVTQyAqLworCXsKKwkgIGMgPSBTRVJJQUxfUkVBRENIQVIgKG5pbmR5X3NlcmlhbCwgLTEpOworCSAgYyAmPSB+MHg0MDsKKwl9IAorICAgICAgZWxzZSBpZiAoYyAhPSAweDEwKSAvKiBETEUgKi8KKwkvKiBXcml0ZSBvdXQgYW55IGNoYXJhY3RlcnMgcHJlY2VkaW5nIERMRSAqLworCXsKKwkgIGJ1ZlswXSA9IChjaGFyKWM7CisJICB3cml0ZSAoMSwgYnVmLCAxKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3RvcF9leGl0ID0gbmluU3RvcFdoeSgmc3RvcF9jb2RlLAorCQkJCSAmaXBfdmFsdWUsICZmcF92YWx1ZSwgJnNwX3ZhbHVlKTsKKwkgIGlmICghc3RvcF9leGl0ICYmIChzdG9wX2NvZGUgPT0gU1RPUF9TUlEpKQorCSAgICB7CisJICAgICAgaW1tZWRpYXRlX3F1aXQrKzsKKwkgICAgICBuaW5TcnEoKTsKKwkgICAgICBpbW1lZGlhdGVfcXVpdC0tOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBHZXQgb3V0IG9mIGxvb3AgKi8KKwkgICAgICBzdXBwbHlfcmVnaXN0ZXIgKElQX1JFR05VTSwgCisJCQkgICAgICAgKGNoYXIgKikmaXBfdmFsdWUpOworCSAgICAgIHN1cHBseV9yZWdpc3RlciAoRlBfUkVHTlVNLCAKKwkJCSAgICAgICAoY2hhciAqKSZmcF92YWx1ZSk7CisJICAgICAgc3VwcGx5X3JlZ2lzdGVyIChTUF9SRUdOVU0sIAorCQkJICAgICAgIChjaGFyICopJnNwX3ZhbHVlKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgU0VSSUFMX1NFVF9UVFlfU1RBVEUgKHR0eV9hcmdzLnNlcmlhbCwgdHR5X2FyZ3Muc3RhdGUpOworICBmcmVlICh0dHlfYXJncy5zdGF0ZSk7CisgIGRpc2NhcmRfY2xlYW51cHMgKG9sZF9jbGVhbnVwcyk7CisKKyAgaWYgKHN0b3BfZXhpdCkKKyAgICB7CisgICAgICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVEOworICAgICAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gc3RvcF9jb2RlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIG5pbmR5IGhhcyBzb21lIHNwZWNpYWwgc3RvcCBjb2RlIG5lZWQgdG8gYmUgaGFuZGxlZCAqLworICAgICAgaWYgKHN0b3BfY29kZSA9PSBTVE9QX0dEQl9CUFQpCisJc3RvcF9jb2RlID0gVFJBQ0VfU1RFUDsKKyAgICAgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOworICAgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBpOTYwX2ZhdWx0X3RvX3NpZ25hbCAoc3RvcF9jb2RlKTsKKyAgICB9CisgIHJldHVybiBpbmZlcmlvcl9waWQ7Cit9CisKKy8qIFJlYWQgdGhlIHJlbW90ZSByZWdpc3RlcnMgaW50byB0aGUgYmxvY2sgUkVHUy4gICovCisKKy8qIFRoaXMgaXMgdGhlIGJsb2NrIHRoYXQgbmluUmVnc0dldCBhbmQgbmluUmVnc1B1dCBoYW5kbGVzLiAgKi8KK3N0cnVjdCBuaW5keV9yZWdzIHsKKyAgY2hhcglsb2NhbF9yZWdzWzE2ICogNF07CisgIGNoYXIJZ2xvYmFsX3JlZ3NbMTYgKiA0XTsKKyAgY2hhcglwY3dfYWN3WzIgKiA0XTsKKyAgY2hhcglpcFs0XTsKKyAgY2hhcgl0Y3dbNF07CisgIGNoYXIJZnBfYXNfZG91YmxlWzQgKiA4XTsKK307CisKK3N0YXRpYyB2b2lkCituaW5keV9mZXRjaF9yZWdpc3RlcnMocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgc3RydWN0IG5pbmR5X3JlZ3MgbmluZHlfcmVnczsKKyAgaW50IHJlZ251bTsKKworICBpbW1lZGlhdGVfcXVpdCsrOworICBuaW5SZWdzR2V0KCAoY2hhciAqKSAmbmluZHlfcmVncyApOworICBpbW1lZGlhdGVfcXVpdC0tOworCisgIG1lbWNweSAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChSMF9SRUdOVU0pXSwgbmluZHlfcmVncy5sb2NhbF9yZWdzLCAxNio0KTsKKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEcwX1JFR05VTSldLCBuaW5keV9yZWdzLmdsb2JhbF9yZWdzLCAxNio0KTsKKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKFBDV19SRUdOVU0pXSwgbmluZHlfcmVncy5wY3dfYWN3LCAyKjQpOworICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoSVBfUkVHTlVNKV0sIG5pbmR5X3JlZ3MuaXAsIDEqNCk7CisgIG1lbWNweSAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChUQ1dfUkVHTlVNKV0sIG5pbmR5X3JlZ3MudGN3LCAxKjQpOworICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLCBuaW5keV9yZWdzLmZwX2FzX2RvdWJsZSwgNCAqIDgpOworCisgIHJlZ2lzdGVyc19mZXRjaGVkICgpOworfQorCitzdGF0aWMgdm9pZAorbmluZHlfcHJlcGFyZV90b19zdG9yZSgpCit7CisgIC8qIEZldGNoIGFsbCByZWdzIGlmIHRoZXkgYXJlbid0IGFscmVhZHkgaGVyZS4gICovCisgIHJlYWRfcmVnaXN0ZXJfYnl0ZXMgKDAsIE5VTEwsIFJFR0lTVEVSX0JZVEVTKTsKK30KKworc3RhdGljIHZvaWQKK25pbmR5X3N0b3JlX3JlZ2lzdGVycyhyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBzdHJ1Y3QgbmluZHlfcmVncyBuaW5keV9yZWdzOworICBpbnQgcmVnbnVtOworCisgIG1lbWNweSAobmluZHlfcmVncy5sb2NhbF9yZWdzLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKFIwX1JFR05VTSldLCAxNio0KTsKKyAgbWVtY3B5IChuaW5keV9yZWdzLmdsb2JhbF9yZWdzLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEcwX1JFR05VTSldLCAxNio0KTsKKyAgbWVtY3B5IChuaW5keV9yZWdzLnBjd19hY3csICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUENXX1JFR05VTSldLCAyKjQpOworICBtZW1jcHkgKG5pbmR5X3JlZ3MuaXAsICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoSVBfUkVHTlVNKV0sIDEqNCk7CisgIG1lbWNweSAobmluZHlfcmVncy50Y3csICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoVENXX1JFR05VTSldLCAxKjQpOworICBtZW1jcHkgKG5pbmR5X3JlZ3MuZnBfYXNfZG91YmxlLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pXSwgOCo0KTsKKworICBpbW1lZGlhdGVfcXVpdCsrOworICBuaW5SZWdzUHV0KCAoY2hhciAqKSAmbmluZHlfcmVncyApOworICBpbW1lZGlhdGVfcXVpdC0tOworfQorCisvKiBSZWFkIGEgd29yZCBmcm9tIHJlbW90ZSBhZGRyZXNzIEFERFIgYW5kIHJldHVybiBpdC4KKyAqIFRoaXMgZ29lcyB0aHJvdWdoIHRoZSBkYXRhIGNhY2hlLgorICovCitpbnQKK25pbmR5X2ZldGNoX3dvcmQgKGFkZHIpCisgICAgIENPUkVfQUREUiBhZGRyOworeworCXJldHVybiBkY2FjaGVfZmV0Y2ggKG5pbmR5X2RjYWNoZSwgYWRkcik7Cit9CisKKy8qIFdyaXRlIGEgd29yZCBXT1JEIGludG8gcmVtb3RlIGFkZHJlc3MgQUREUi4KKyAgIFRoaXMgZ29lcyB0aHJvdWdoIHRoZSBkYXRhIGNhY2hlLiAgKi8KKwordm9pZAorbmluZHlfc3RvcmVfd29yZCAoYWRkciwgd29yZCkKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGludCB3b3JkOworeworCWRjYWNoZV9wb2tlIChuaW5keV9kY2FjaGUsIGFkZHIsIHdvcmQpOworfQorCisvKiBDb3B5IExFTiBieXRlcyB0byBvciBmcm9tIGluZmVyaW9yJ3MgbWVtb3J5IHN0YXJ0aW5nIGF0IE1FTUFERFIKKyAgIHRvIGRlYnVnZ2VyIG1lbW9yeSBzdGFydGluZyBhdCBNWUFERFIuICAgQ29weSB0byBpbmZlcmlvciBpZgorICAgV1JJVEUgaXMgbm9uemVyby4gIFJldHVybnMgdGhlIGxlbmd0aCBjb3BpZWQuCisKKyAgIFRoaXMgaXMgc3RvbGVuIGFsbW9zdCBkaXJlY3RseSBmcm9tIGluZnB0cmFjZS5jJ3MgY2hpbGRfeGZlcl9tZW1vcnksCisgICB3aGljaCBhbHNvIGRlYWxzIHdpdGggYSB3b3JkLW9yaWVudGVkIG1lbW9yeSBpbnRlcmZhY2UuICBTb21ldGltZSwKKyAgIEZJWE1FLCByZXdyaXRlIHRoaXMgdG8gbm90IHVzZSB0aGUgd29yZC1vcmllbnRlZCByb3V0aW5lcy4gICovCisKK2ludAorbmluZHlfeGZlcl9pbmZlcmlvcl9tZW1vcnkobWVtYWRkciwgbXlhZGRyLCBsZW4sIHNob3VsZF93cml0ZSwgdGFyZ2V0KQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworICAgICBpbnQgc2hvdWxkX3dyaXRlOworICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0OwkJCS8qIGlnbm9yZWQgKi8KK3sKKyAgcmVnaXN0ZXIgaW50IGk7CisgIC8qIFJvdW5kIHN0YXJ0aW5nIGFkZHJlc3MgZG93biB0byBsb25nd29yZCBib3VuZGFyeS4gICovCisgIHJlZ2lzdGVyIENPUkVfQUREUiBhZGRyID0gbWVtYWRkciAmIC0gc2l6ZW9mIChpbnQpOworICAvKiBSb3VuZCBlbmRpbmcgYWRkcmVzcyB1cDsgZ2V0IG51bWJlciBvZiBsb25nd29yZHMgdGhhdCBtYWtlcy4gICovCisgIHJlZ2lzdGVyIGludCBjb3VudAorICAgID0gKCgobWVtYWRkciArIGxlbikgLSBhZGRyKSArIHNpemVvZiAoaW50KSAtIDEpIC8gc2l6ZW9mIChpbnQpOworICAvKiBBbGxvY2F0ZSBidWZmZXIgb2YgdGhhdCBtYW55IGxvbmd3b3Jkcy4gICovCisgIHJlZ2lzdGVyIGludCAqYnVmZmVyID0gKGludCAqKSBhbGxvY2EgKGNvdW50ICogc2l6ZW9mIChpbnQpKTsKKworICBpZiAoc2hvdWxkX3dyaXRlKQorICAgIHsKKyAgICAgIC8qIEZpbGwgc3RhcnQgYW5kIGVuZCBleHRyYSBieXRlcyBvZiBidWZmZXIgd2l0aCBleGlzdGluZyBtZW1vcnkgZGF0YS4gICovCisKKyAgICAgIGlmIChhZGRyICE9IG1lbWFkZHIgfHwgbGVuIDwgKGludClzaXplb2YgKGludCkpIHsKKwkvKiBOZWVkIHBhcnQgb2YgaW5pdGlhbCB3b3JkIC0tIGZldGNoIGl0LiAgKi8KKyAgICAgICAgYnVmZmVyWzBdID0gbmluZHlfZmV0Y2hfd29yZCAoYWRkcik7CisgICAgICB9CisKKyAgICAgIGlmIChjb3VudCA+IDEpCQkvKiBGSVhNRSwgYXZvaWQgaWYgZXZlbiBib3VuZGFyeSAqLworCXsKKwkgIGJ1ZmZlcltjb3VudCAtIDFdCisJICAgID0gbmluZHlfZmV0Y2hfd29yZCAoYWRkciArIChjb3VudCAtIDEpICogc2l6ZW9mIChpbnQpKTsKKwl9CisKKyAgICAgIC8qIENvcHkgZGF0YSB0byBiZSB3cml0dGVuIG92ZXIgY29ycmVzcG9uZGluZyBwYXJ0IG9mIGJ1ZmZlciAqLworCisgICAgICBtZW1jcHkgKChjaGFyICopIGJ1ZmZlciArIChtZW1hZGRyICYgKHNpemVvZiAoaW50KSAtIDEpKSwgbXlhZGRyLCBsZW4pOworCisgICAgICAvKiBXcml0ZSB0aGUgZW50aXJlIGJ1ZmZlci4gICovCisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBhZGRyICs9IHNpemVvZiAoaW50KSkKKwl7CisJICBlcnJubyA9IDA7CisJICBuaW5keV9zdG9yZV93b3JkIChhZGRyLCBidWZmZXJbaV0pOworCSAgaWYgKGVycm5vKQorCSAgICByZXR1cm4gMDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogUmVhZCBhbGwgdGhlIGxvbmd3b3JkcyAqLworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIGFkZHIgKz0gc2l6ZW9mIChpbnQpKQorCXsKKwkgIGVycm5vID0gMDsKKwkgIGJ1ZmZlcltpXSA9IG5pbmR5X2ZldGNoX3dvcmQgKGFkZHIpOworCSAgaWYgKGVycm5vKQorCSAgICByZXR1cm4gMDsKKwkgIFFVSVQ7CisJfQorCisgICAgICAvKiBDb3B5IGFwcHJvcHJpYXRlIGJ5dGVzIG91dCBvZiB0aGUgYnVmZmVyLiAgKi8KKyAgICAgIG1lbWNweSAobXlhZGRyLCAoY2hhciAqKSBidWZmZXIgKyAobWVtYWRkciAmIChzaXplb2YgKGludCkgLSAxKSksIGxlbik7CisgICAgfQorICByZXR1cm4gbGVuOworfQorDAorc3RhdGljIHZvaWQKK25pbmR5X2NyZWF0ZV9pbmZlcmlvciAoZXhlY2ZpbGUsIGFyZ3MsIGVudikKKyAgICAgY2hhciAqZXhlY2ZpbGU7CisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGludCBlbnRyeV9wdDsKKyAgaW50IHBpZDsKKworICBpZiAoYXJncyAmJiAqYXJncykKKyAgICBlcnJvciAoIkNhbid0IHBhc3MgYXJndW1lbnRzIHRvIHJlbW90ZSBOSU5EWSBwcm9jZXNzIik7CisKKyAgaWYgKGV4ZWNmaWxlID09IDAgfHwgZXhlY19iZmQgPT0gMCkKKyAgICBlcnJvciAoIk5vIGV4ZWN1dGFibGUgZmlsZSBzcGVjaWZpZWQiKTsKKworICBlbnRyeV9wdCA9IChpbnQpIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoZXhlY19iZmQpOworCisgIHBpZCA9IDQyOworCisgIC8qIFRoZSAicHJvY2VzcyIgKGJvYXJkKSBpcyBhbHJlYWR5IHN0b3BwZWQgYXdhaXRpbmcgb3VyIGNvbW1hbmRzLCBhbmQKKyAgICAgdGhlIHByb2dyYW0gaXMgYWxyZWFkeSBkb3dubG9hZGVkLiAgV2UganVzdCBzZXQgaXRzIFBDIGFuZCBnby4gICovCisKKyAgaW5mZXJpb3JfcGlkID0gcGlkOwkJLyogTmVlZGVkIGZvciB3YWl0X2Zvcl9pbmZlcmlvciBiZWxvdyAqLworCisgIGNsZWFyX3Byb2NlZWRfc3RhdHVzICgpOworCisgIC8qIFRlbGwgd2FpdF9mb3JfaW5mZXJpb3IgdGhhdCB3ZSd2ZSBzdGFydGVkIGEgbmV3IHByb2Nlc3MuICAqLworICBpbml0X3dhaXRfZm9yX2luZmVyaW9yICgpOworCisgIC8qIFNldCB1cCB0aGUgInNhdmVkIHRlcm1pbmFsIG1vZGVzIiBvZiB0aGUgaW5mZXJpb3IKKyAgICAgYmFzZWQgb24gd2hhdCBtb2RlcyB3ZSBhcmUgc3RhcnRpbmcgaXQgd2l0aC4gICovCisgIHRhcmdldF90ZXJtaW5hbF9pbml0ICgpOworCisgIC8qIEluc3RhbGwgaW5mZXJpb3IncyB0ZXJtaW5hbCBtb2Rlcy4gICovCisgIHRhcmdldF90ZXJtaW5hbF9pbmZlcmlvciAoKTsKKworICAvKiBpbnNlcnRfc3RlcF9icmVha3BvaW50ICgpOyAgRklYTUUsIGRvIHdlIG5lZWQgdGhpcz8gICovCisgIC8qIExldCAnZXIgcmlwLi4uICovCisgIHByb2NlZWQgKChDT1JFX0FERFIpZW50cnlfcHQsIFRBUkdFVF9TSUdOQUxfREVGQVVMVCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCityZXNldF9jb21tYW5kKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGlmIChuaW5keV9zZXJpYWwgPT0gTlVMTCkKKyAgICB7CisgICAgICBlcnJvciggIk5vIHRhcmdldCBzeXN0ZW0gdG8gcmVzZXQgLS0gdXNlICd0YXJnZXQgbmluZHknIGNvbW1hbmQuIik7CisgICAgfQorICBpZiAoIHF1ZXJ5KCJSZWFsbHkgcmVzZXQgdGhlIHRhcmdldCBzeXN0ZW0/IiwwLDApICkKKyAgICB7CisgICAgICBTRVJJQUxfU0VORF9CUkVBSyAobmluZHlfc2VyaWFsKTsKKyAgICAgIHR0eV9mbHVzaCAobmluZHlfc2VyaWFsKTsKKyAgICB9Cit9CisKK3ZvaWQKK25pbmR5X2tpbGwgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHJldHVybjsJCS8qIElnbm9yZSBhdHRlbXB0cyB0byBraWxsIHRhcmdldCBzeXN0ZW0gKi8KK30KKworLyogQ2xlYW4gdXAgd2hlbiBhIHByb2dyYW0gZXhpdHMuCisKKyAgIFRoZSBwcm9ncmFtIGFjdHVhbGx5IGxpdmVzIG9uIGluIHRoZSByZW1vdGUgcHJvY2Vzc29yJ3MgUkFNLCBhbmQgbWF5IGJlCisgICBydW4gYWdhaW4gd2l0aG91dCBhIGRvd25sb2FkLiAgRG9uJ3QgbGVhdmUgaXQgZnVsbCBvZiBicmVha3BvaW50CisgICBpbnN0cnVjdGlvbnMuICAqLworCit2b2lkCituaW5keV9tb3Vybl9pbmZlcmlvciAoKQoreworICByZW1vdmVfYnJlYWtwb2ludHMgKCk7CisgIHVucHVzaF90YXJnZXQgKCZuaW5keV9vcHMpOworICBnZW5lcmljX21vdXJuX2luZmVyaW9yICgpOwkvKiBEbyBhbGwgdGhlIHByb3BlciB0aGluZ3Mgbm93ICovCit9CisMCisvKiBQYXNzIHRoZSBhcmdzIHRoZSB3YXkgY2F0Y2hfZXJyb3JzIHdhbnRzIHRoZW0uICAqLworc3RhdGljIGludAorbmluZHlfb3Blbl9zdHViIChhcmcpCisgICAgIGNoYXIgKmFyZzsKK3sKKyAgbmluZHlfb3BlbiAoYXJnLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCituaW5keV9sb2FkKCBmaWxlbmFtZSwgZnJvbV90dHkgKQorICAgIGNoYXIgKmZpbGVuYW1lOworICAgIGludCBmcm9tX3R0eTsKK3sKKyAgYXNlY3Rpb24gKnM7CisgIC8qIENhbid0IGRvIHVuaXggc3R5bGUgZm9ya2luZyBvbiBhIFZNUyBzeXN0ZW0sIHNvIHdlJ2xsIHVzZSBiZmQgdG8gZG8KKyAgICAgYWxsIHRoZSB3b3JrIGZvciB1cworICAgICAqLworCisgIGJmZCAqZmlsZSA9IGJmZF9vcGVucihmaWxlbmFtZSwwKTsKKyAgaWYgKCFmaWxlKQorICB7CisgICAgcGVycm9yX3dpdGhfbmFtZShmaWxlbmFtZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0KGZpbGUsIGJmZF9vYmplY3QpKQorICB7CisgICAgZXJyb3IoImNhbid0IHByb3ZlIGl0J3MgYW4gb2JqZWN0IGZpbGVcbiIpOworICAgIHJldHVybjsKKyAgfQorIAorICBmb3IgKCBzID0gZmlsZS0+c2VjdGlvbnM7IHM7IHM9cy0+bmV4dCkKKyAgeworICAgIGlmIChzLT5mbGFncyAmIFNFQ19MT0FEKQorICAgIHsKKyAgICAgIGNoYXIgKmJ1ZmZlciA9IHhtYWxsb2Mocy0+X3Jhd19zaXplKTsKKyAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyhmaWxlLCBzLCBidWZmZXIsIDAsIHMtPl9yYXdfc2l6ZSk7CisgICAgICBwcmludGYoIkxvYWRpbmcgc2VjdGlvbiAlcywgc2l6ZSAleCB2bWEgJXhcbiIsCisgICAgICAgICAgICAgcy0+bmFtZSwKKyAgICAgICAgICAgICBzLT5fcmF3X3NpemUsCisgICAgICAgICAgICAgcy0+dm1hKTsKKyAgICAgIG5pbk1lbVB1dChzLT52bWEsIGJ1ZmZlciwgcy0+X3Jhd19zaXplKTsKKyAgICAgIGZyZWUoYnVmZmVyKTsKKyAgICB9CisgIH0KKyAgYmZkX2Nsb3NlKGZpbGUpOworfQorCitzdGF0aWMgaW50Citsb2FkX3N0dWIgKGFyZykKKyAgICAgY2hhciAqYXJnOworeworICB0YXJnZXRfbG9hZCAoYXJnLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFRoaXMgcm91dGluZSBpcyBydW4gYXMgYSBob29rLCBqdXN0IGJlZm9yZSB0aGUgbWFpbiBjb21tYW5kIGxvb3AgaXMKKyAgIGVudGVyZWQuICBJZiBnZGIgaXMgY29uZmlndXJlZCBmb3IgdGhlIGk5NjAsIGJ1dCBoYXMgbm90IGhhZCBpdHMKKyAgIG5pbmR5IHRhcmdldCBzcGVjaWZpZWQgeWV0LCB0aGlzIHdpbGwgbG9vcCBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZG8gc28uCisKKyAgIFVubGlrZSB0aGUgbG9vcCBwcm92aWRlZCBieSBJbnRlbCwgd2UgYWN0dWFsbHkgbGV0IHRoZSB1c2VyIGdldCBvdXQKKyAgIG9mIHRoaXMgd2l0aCBhIFJFVFVSTi4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gZS5nLiBzaW1wbHkgZXhhbWluaW5nCisgICBhbiBpOTYwIG9iamVjdCBmaWxlIG9uIHRoZSBob3N0IHN5c3RlbS4gICovCisKK3ZvaWQKK25pbmR5X2JlZm9yZV9tYWluX2xvb3AgKCkKK3sKKyAgY2hhciB0dHluYW1lWzEwMF07CisgIGNoYXIgKnAsICpwMjsKKworICB3aGlsZSAodGFyZ2V0X3N0YWNrLT50YXJnZXRfb3BzICE9ICZuaW5keV9vcHMpIC8qIFdoYXQgaXMgdGhpcyBjcmFwPz8/ICovCisgICAgewkJCQkvKiByZW1vdGUgdHR5IG5vdCBzcGVjaWZpZWQgeWV0ICovCisJaWYgKCBpbnN0cmVhbSA9PSBzdGRpbiApeworCQlwcmludGZfdW5maWx0ZXJlZCgiXG5BdHRhY2ggL2Rldi90dHlOTiAtLSBzcGVjaWZ5IE5OLCBvciBcInF1aXRcIiB0byBxdWl0OiAgIik7CisJCWdkYl9mbHVzaCggZ2RiX3N0ZG91dCApOworCX0KKwlmZ2V0cyggdHR5bmFtZSwgc2l6ZW9mKHR0eW5hbWUpLTEsIHN0ZGluICk7CisKKwkvKiBTdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlICovCisJZm9yICggcCA9IHR0eW5hbWU7IGlzc3BhY2UoKnApOyBwKysgKXsKKwkJOworCX0KKwlpZiAoICpwID09ICdcMCcgKXsKKwkJcmV0dXJuOwkJLyogVXNlciBqdXN0IGhpdCBzcGFjZXMgb3IgcmV0dXJuLCB3YW50cyBvdXQgKi8KKwl9CisJZm9yICggcDI9IHA7ICFpc3NwYWNlKCpwMikgJiYgKCpwMiAhPSAnXDAnKTsgcDIrKyApeworCQk7CisJfQorCSpwMj0gJ1wwJzsKKwlpZiAoIFNUUkVRKCJxdWl0IixwKSApeworCQlleGl0KDEpOworCX0KKworCWlmIChjYXRjaF9lcnJvcnMgKG5pbmR5X29wZW5fc3R1YiwgcCwgIiIsIFJFVFVSTl9NQVNLX0FMTCkpCisJICB7CisJICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgYSB0dHkgb3BlbiBmb3IgdGFsa2luZyB0byB0aGUgcmVtb3RlIG1hY2hpbmUsCisJICAgICAgIGRvd25sb2FkIHRoZSBleGVjdXRhYmxlIGZpbGUgaWYgb25lIHdhcyBzcGVjaWZpZWQuICAqLworCSAgICBpZiAoZXhlY19iZmQpCisJICAgICAgeworCQljYXRjaF9lcnJvcnMgKGxvYWRfc3R1YiwgYmZkX2dldF9maWxlbmFtZSAoZXhlY19iZmQpLCAiIiwKKwkJCSAgICAgIFJFVFVSTl9NQVNLX0FMTCk7CisJICAgICAgfQorCSAgfQorICAgICAgfQorfQorDAorLyogRGVmaW5lIHRoZSB0YXJnZXQgc3Vicm91dGluZSBuYW1lcyAqLworCitzdHJ1Y3QgdGFyZ2V0X29wcyBuaW5keV9vcHMgOworCitzdGF0aWMgdm9pZCAKK2luaXRfbmluZHlfb3BzKHZvaWQpCit7CisgIG5pbmR5X29wcy50b19zaG9ydG5hbWUgPSAgICJuaW5keSI7ICJSZW1vdGUgc2VyaWFsIHRhcmdldCBpbiBpOTYwIE5JTkRZLXNwZWNpZmljIHByb3RvY29sIiwKKwkJCQkJbmluZHlfb3BzLnRvX2xvbmduYW1lID0gICAiVXNlIGEgcmVtb3RlIGk5NjAgc3lzdGVtIHJ1bm5pbmcgTklORFkgY29ubmVjdGVkIGJ5IGEgc2VyaWFsIGxpbmUuXG5cCitTcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UgdGhlIHNlcmlhbCBsaW5lIGlzIGNvbm5lY3RlZCB0by5cblwKK1RoZSBzcGVlZCAoYmF1ZCByYXRlKSwgd2hldGhlciB0byB1c2UgdGhlIG9sZCBOSU5EWSBwcm90b2NvbCxcblwKK2FuZCB3aGV0aGVyIHRvIHNlbmQgYSBicmVhayBvbiBzdGFydHVwLCBhcmUgY29udHJvbGxlZCBieSBvcHRpb25zXG5cCitzcGVjaWZpZWQgd2hlbiB5b3Ugc3RhcnRlZCBHREIuIiA7CisgIG5pbmR5X29wcy50b19kb2MgPSAgICIiOworICBuaW5keV9vcHMudG9fb3BlbiA9ICAgbmluZHlfb3BlbjsKKyAgbmluZHlfb3BzLnRvX2Nsb3NlID0gICBuaW5keV9jbG9zZTsKKyAgbmluZHlfb3BzLnRvX2F0dGFjaCA9ICAgMDsKKyAgbmluZHlfb3BzLnRvX3Bvc3RfYXR0YWNoID0gTlVMTDsKKyAgbmluZHlfb3BzLnRvX3JlcXVpcmVfYXR0YWNoID0gTlVMTDsKKyAgbmluZHlfb3BzLnRvX2RldGFjaCA9ICAgbmluZHlfZGV0YWNoOworICBuaW5keV9vcHMudG9fcmVxdWlyZV9kZXRhY2ggPSBOVUxMOworICBuaW5keV9vcHMudG9fcmVzdW1lID0gICBuaW5keV9yZXN1bWU7CisgIG5pbmR5X29wcy50b193YWl0ICA9ICAgbmluZHlfd2FpdDsKKyAgbmluZHlfb3BzLnRvX3Bvc3Rfd2FpdCA9IE5VTEw7CisgIG5pbmR5X29wcy50b19mZXRjaF9yZWdpc3RlcnMgID0gICBuaW5keV9mZXRjaF9yZWdpc3RlcnM7CisgIG5pbmR5X29wcy50b19zdG9yZV9yZWdpc3RlcnMgID0gICBuaW5keV9zdG9yZV9yZWdpc3RlcnM7CisgIG5pbmR5X29wcy50b19wcmVwYXJlX3RvX3N0b3JlID0gICBuaW5keV9wcmVwYXJlX3RvX3N0b3JlOworICBuaW5keV9vcHMudG9feGZlcl9tZW1vcnkgID0gICBuaW5keV94ZmVyX2luZmVyaW9yX21lbW9yeTsKKyAgbmluZHlfb3BzLnRvX2ZpbGVzX2luZm8gID0gICBuaW5keV9maWxlc19pbmZvOworICBuaW5keV9vcHMudG9faW5zZXJ0X2JyZWFrcG9pbnQgPSAgIG1lbW9yeV9pbnNlcnRfYnJlYWtwb2ludDsKKyAgbmluZHlfb3BzLnRvX3JlbW92ZV9icmVha3BvaW50ID0gICBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQ7CisgIG5pbmR5X29wcy50b190ZXJtaW5hbF9pbml0ICA9ICAgMDsKKyAgbmluZHlfb3BzLnRvX3Rlcm1pbmFsX2luZmVyaW9yID0gICAwOworICBuaW5keV9vcHMudG9fdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ID0gICAwOworICBuaW5keV9vcHMudG9fdGVybWluYWxfb3VycyAgPSAgIDA7CisgIG5pbmR5X29wcy50b190ZXJtaW5hbF9pbmZvICA9ICAgMDsJLyogVGVybWluYWwgY3J1ZCAqLworICBuaW5keV9vcHMudG9fa2lsbCAgPSAgIG5pbmR5X2tpbGw7CisgIG5pbmR5X29wcy50b19sb2FkICA9ICAgbmluZHlfbG9hZDsKKyAgbmluZHlfb3BzLnRvX2xvb2t1cF9zeW1ib2wgPSAgIDA7IC8qIGxvb2t1cF9zeW1ib2wgKi8KKyAgbmluZHlfb3BzLnRvX2NyZWF0ZV9pbmZlcmlvciA9ICAgbmluZHlfY3JlYXRlX2luZmVyaW9yOworICBuaW5keV9vcHMudG9fcG9zdF9zdGFydHVwX2luZmVyaW9yID0gTlVMTDsKKyAgbmluZHlfb3BzLnRvX2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IgPSBOVUxMOworICBuaW5keV9vcHMudG9fY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciA9IE5VTEw7CisgIG5pbmR5X29wcy50b19wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSA9IE5VTEw7CisgIG5pbmR5X29wcy50b19pbnNlcnRfZm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgbmluZHlfb3BzLnRvX3JlbW92ZV9mb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBuaW5keV9vcHMudG9faW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBuaW5keV9vcHMudG9fcmVtb3ZlX3Zmb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBuaW5keV9vcHMudG9faGFzX2ZvcmtlZCA9IE5VTEw7CisgIG5pbmR5X29wcy50b19oYXNfdmZvcmtlZCA9IE5VTEw7CisgIG5pbmR5X29wcy50b19jYW5fZm9sbG93X3Zmb3JrX3ByaW9yX3RvX2V4ZWMgPSBOVUxMOworICBuaW5keV9vcHMudG9fcG9zdF9mb2xsb3dfdmZvcmsgPSBOVUxMOworICBuaW5keV9vcHMudG9faW5zZXJ0X2V4ZWNfY2F0Y2hwb2ludCA9IE5VTEw7CisgIG5pbmR5X29wcy50b19yZW1vdmVfZXhlY19jYXRjaHBvaW50ID0gTlVMTDsKKyAgbmluZHlfb3BzLnRvX2hhc19leGVjZCA9IE5VTEw7CisgIG5pbmR5X29wcy50b19yZXBvcnRlZF9leGVjX2V2ZW50c19wZXJfZXhlY19jYWxsID0gTlVMTDsKKyAgbmluZHlfb3BzLnRvX2hhc19leGl0ZWQgPSBOVUxMOworICBuaW5keV9vcHMudG9fbW91cm5faW5mZXJpb3IgPSAgIG5pbmR5X21vdXJuX2luZmVyaW9yOworICBuaW5keV9vcHMudG9fY2FuX3J1biAgPSAgIDA7CQkvKiBjYW5fcnVuICovCisgIG5pbmR5X29wcy50b19ub3RpY2Vfc2lnbmFscyA9ICAgMDsgLyogbm90aWNlX3NpZ25hbHMgKi8KKyAgbmluZHlfb3BzLnRvX3RocmVhZF9hbGl2ZSAgPSAgIDA7CQkJLyogdG9fdGhyZWFkX2FsaXZlICovCisgIG5pbmR5X29wcy50b19zdG9wICA9ICAgMDsJCQkvKiB0b19zdG9wICovCisgIG5pbmR5X29wcy50b19waWRfdG9fZXhlY19maWxlID0gTlVMTDsKKyAgbmluZHlfb3BzLnRvX2NvcmVfZmlsZV90b19zeW1fZmlsZSA9IE5VTEw7CisgIG5pbmR5X29wcy50b19zdHJhdHVtID0gICBwcm9jZXNzX3N0cmF0dW07CisgIG5pbmR5X29wcy5ET05UX1VTRSA9ICAgMDsgLyogbmV4dCAqLworICBuaW5keV9vcHMudG9faGFzX2FsbF9tZW1vcnkgPSAgIDE7CisgIG5pbmR5X29wcy50b19oYXNfbWVtb3J5ID0gICAxOworICBuaW5keV9vcHMudG9faGFzX3N0YWNrID0gICAxOworICBuaW5keV9vcHMudG9faGFzX3JlZ2lzdGVycyA9ICAgMTsKKyAgbmluZHlfb3BzLnRvX2hhc19leGVjdXRpb24gPSAgIDE7CS8qIGFsbCBtZW0sIG1lbSwgc3RhY2ssIHJlZ3MsIGV4ZWMgKi8KKyAgbmluZHlfb3BzLnRvX3NlY3Rpb25zID0gICAwOworICBuaW5keV9vcHMudG9fc2VjdGlvbnNfZW5kID0gICAwOwkJCS8qIFNlY3Rpb24gcG9pbnRlcnMgKi8KKyAgbmluZHlfb3BzLnRvX21hZ2ljID0gICBPUFNfTUFHSUM7CQkvKiBBbHdheXMgdGhlIGxhc3QgdGhpbmcgKi8KK30KKwordm9pZAorX2luaXRpYWxpemVfbmluZHkgKCkKK3sKKyAgaW5pdF9uaW5keV9vcHMoKSA7CisgIGFkZF90YXJnZXQgKCZuaW5keV9vcHMpOworICBhZGRfY29tICgicmVzZXQiLCBjbGFzc19vYnNjdXJlLCByZXNldF9jb21tYW5kLAorCSAgICJTZW5kIGEgJ2JyZWFrJyB0byB0aGUgcmVtb3RlIHRhcmdldCBzeXN0ZW0uXG5cCitPbmx5IHVzZWZ1bCBpZiB0aGUgdGFyZ2V0IGhhcyBiZWVuIGVxdWlwcGVkIHdpdGggYSBjaXJjdWl0XG5cCit0byBwZXJmb3JtIGEgaGFyZCByZXNldCB3aGVuIGEgYnJlYWsgaXMgZGV0ZWN0ZWQuIik7Cit9CmRpZmYgLS1naXQgYS9nZGIvcmVtb3RlLW5yb20uYyBiL2dkYi9yZW1vdGUtbnJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OTlhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmVtb3RlLW5yb20uYwpAQCAtMCwwICsxLDM2MCBAQAorLyogUmVtb3RlIGRlYnVnZ2luZyB3aXRoIHRoZSBYTE5UIERlc2lnbnMsIEluYyAoWERJKSBOZXRST00uCisgICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5OgorCSBSb2dlciBNb3llcnMgCisJIFhMTlQgRGVzaWducywgSW5jLgorCSAxNTA1MCBBdmVudWUgb2YgU2NpZW5jZSwgU3VpdGUgMTA2CisJIFNhbiBEaWVnbywgQ0EgIDkyMTI4CisJICg2MTkpNDg3LTkzMjAKKwkgcm9nZXJAeGxudC5jb20KKyAgIEFkYXB0ZWQgZnJvbSB3b3JrIGRvbmUgYXQgQ3lnbnVzIFN1cHBvcnQgaW4gcmVtb3RlLW5pbmR5LmMsCisgICBsYXRlciBtZXJnZWQgaW4gYnkgU3RhbiBTaGVicyBhdCBDeWdudXMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJzZXJpYWwuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKworLyogRGVmYXVsdCBwb3J0cyB1c2VkIHRvIHRhbGsgd2l0aCB0aGUgTmV0Uk9NLiAgKi8KKworI2RlZmluZSBERUZBVUxUX05FVFJPTV9MT0FEX1BPUlQgICAgMTIzNgorI2RlZmluZSBERUZBVUxUX05FVFJPTV9DT05UUk9MX1BPUlQgMTIzNworCitzdGF0aWMgdm9pZCBucm9tX2Nsb3NlIFBBUkFNUyAoKGludCBxdWl0dGluZykpOworCisvKiBOZXcgY29tbWFuZHMuICAqLworCitzdGF0aWMgdm9pZCBucm9tX3Bhc3N0aHJ1IFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKKy8qIFdlIHRhbGsgdG8gdGhlIE5ldFJPTSBvdmVyIHRoZXNlIHNvY2tldHMuICAqLworCitzdGF0aWMgc2VyaWFsX3QgbG9hZF9kZXNjID0gTlVMTDsKK3N0YXRpYyBzZXJpYWxfdCBjdHJsX2Rlc2MgPSBOVUxMOworCitzdGF0aWMgaW50IGxvYWRfcG9ydCA9IERFRkFVTFRfTkVUUk9NX0xPQURfUE9SVDsKK3N0YXRpYyBpbnQgY29udHJvbF9wb3J0ID0gREVGQVVMVF9ORVRST01fQ09OVFJPTF9QT1JUOworCitzdGF0aWMgY2hhciBucm9tX2hvc3RuYW1lWzEwMF07CisKKy8qIEZvcndhcmQgZGF0YSBkZWNsYXJhdGlvbi4gKi8KKworZXh0ZXJuIHN0cnVjdCB0YXJnZXRfb3BzIG5yb21fb3BzOworCisvKiBTY2FuIGlucHV0IGZyb20gdGhlIHJlbW90ZSBzeXN0ZW0sIHVudGlsIFNUUklORyBpcyBmb3VuZC4gIFByaW50IGNoYXJzIHRoYXQKKyAgIGRvbid0IG1hdGNoLiAgKi8KKworc3RhdGljIGludAorZXhwZWN0IChzdHJpbmcpCisgICAgIGNoYXIgKnN0cmluZzsKK3sKKyAgY2hhciAqcCA9IHN0cmluZzsKKyAgaW50IGM7CisKKyAgaW1tZWRpYXRlX3F1aXQgPSAxOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGMgPSBTRVJJQUxfUkVBRENIQVIgKGN0cmxfZGVzYywgNSk7CisKKyAgICAgIGlmIChjID09ICpwKyspCisJeworCSAgaWYgKCpwID09ICdcMCcpCisJICAgIHsKKwkgICAgICBpbW1lZGlhdGVfcXVpdCA9IDA7CisKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBmcHV0Y191bmZpbHRlcmVkIChjLCBnZGJfc3Rkb3V0KTsKKwkgIHAgPSBzdHJpbmc7CisJICBpZiAoYyA9PSAqcCkKKwkgICAgcCsrOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitucm9tX2tpbGwgKCkKK3sKKyAgbnJvbV9jbG9zZSAoMCk7Cit9CisKK3N0YXRpYyBzZXJpYWxfdAorb3Blbl9zb2NrZXQgKG5hbWUsIHBvcnQpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIGludCBwb3J0OworeworICBjaGFyIHNvY2tuYW1lWzEwMF07CisgIHNlcmlhbF90IGRlc2M7CisKKyAgc3ByaW50ZiAoc29ja25hbWUsICIlczolZCIsIG5hbWUsIHBvcnQpOworICBkZXNjID0gU0VSSUFMX09QRU4gKHNvY2tuYW1lKTsKKyAgaWYgKCFkZXNjKQorICAgIHBlcnJvcl93aXRoX25hbWUgKHNvY2tuYW1lKTsKKworICByZXR1cm4gZGVzYzsKK30KKworc3RhdGljIHZvaWQKK2xvYWRfY2xlYW51cCAoKQoreworICBTRVJJQUxfQ0xPU0UgKGxvYWRfZGVzYyk7CisgIGxvYWRfZGVzYyA9IE5VTEw7Cit9CisKKy8qIERvd25sb2FkIGEgZmlsZSBzcGVjaWZpZWQgaW4gQVJHUyB0byB0aGUgbmV0Uk9NLiAgKi8KKworc3RhdGljIHZvaWQKK25yb21fbG9hZCAoYXJncywgZnJvbXR0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb210dHk7Cit7CisgIGludCBmZCwgcmRfYW10LCBmc2l6ZTsKKyAgYmZkICpwYmZkOworICBhc2VjdGlvbiAqc2VjdGlvbjsKKyAgY2hhciAqZG93bmxvYWRzdHJpbmcgPSAiZG93bmxvYWQgMFxuIjsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKworICAvKiBUZWxsIHRoZSBuZXRyb20gdG8gZ2V0IHJlYWR5IHRvIGRvd25sb2FkLiAqLworICBpZiAoU0VSSUFMX1dSSVRFIChjdHJsX2Rlc2MsIGRvd25sb2Fkc3RyaW5nLCBzdHJsZW4gKGRvd25sb2Fkc3RyaW5nKSkpCisgICAgZXJyb3IgKCJucm9tX2xvYWQ6IGNvbnRyb2xfc2VuZCgpIG9mIGAlcycgZmFpbGVkIiwgZG93bmxvYWRzdHJpbmcpOworCisgIGV4cGVjdCAoIldhaXRpbmcgZm9yIGEgY29ubmVjdGlvbi4uLlxuIik7CisKKyAgbG9hZF9kZXNjID0gb3Blbl9zb2NrZXQgKG5yb21faG9zdG5hbWUsIGxvYWRfcG9ydCk7CisKKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwIChsb2FkX2NsZWFudXAsIDApOworCisgIHBiZmQgPSBiZmRfb3BlbnIgKGFyZ3MsIDApOworCisgIGlmIChwYmZkKQorICAgIHsKKyAgICAgIG1ha2VfY2xlYW51cCAoYmZkX2Nsb3NlLCBwYmZkKTsKKworICAgICAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0IChwYmZkLCBiZmRfb2JqZWN0KSkgCisJZXJyb3IgKCJcIiVzXCI6IG5vdCBpbiBleGVjdXRhYmxlIGZvcm1hdDogJXMiLAorCSAgICAgICBhcmdzLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisKKyAgICAgIGZvciAoc2VjdGlvbiA9IHBiZmQtPnNlY3Rpb25zOyBzZWN0aW9uOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkgCisJeworCSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAocGJmZCwgc2VjdGlvbikgJiBTRUNfQUxMT0MpCisJICAgIHsKKwkgICAgICBiZmRfdm1hIHNlY3Rpb25fYWRkcmVzczsKKwkgICAgICB1bnNpZ25lZCBsb25nIHNlY3Rpb25fc2l6ZTsKKwkgICAgICBjb25zdCBjaGFyICpzZWN0aW9uX25hbWU7CisKKwkgICAgICBzZWN0aW9uX25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAocGJmZCwgc2VjdGlvbik7CisJICAgICAgc2VjdGlvbl9hZGRyZXNzID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAocGJmZCwgc2VjdGlvbik7CisJICAgICAgc2VjdGlvbl9zaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAocGJmZCwgc2VjdGlvbik7CisKKwkgICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChwYmZkLCBzZWN0aW9uKSAmIFNFQ19MT0FEKQorCQl7CisJCSAgZmlsZV9wdHIgZnB0cjsKKworCQkgIHByaW50Zl9maWx0ZXJlZCAoIltMb2FkaW5nIHNlY3Rpb24gJXMgYXQgJXggKCVkIGJ5dGVzKV1cbiIsCisJCQkJICAgc2VjdGlvbl9uYW1lLCBzZWN0aW9uX2FkZHJlc3MsCisJCQkJICAgc2VjdGlvbl9zaXplKTsKKworCQkgIGZwdHIgPSAwOworCisJCSAgd2hpbGUgKHNlY3Rpb25fc2l6ZSA+IDApCisJCSAgICB7CisJCSAgICAgIGNoYXIgYnVmZmVyWzEwMjRdOworCQkgICAgICBpbnQgY291bnQ7CisJCSAgICAgIAorCQkgICAgICBjb3VudCA9IG1pbiAoc2VjdGlvbl9zaXplLCAxMDI0KTsKKworCQkgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKHBiZmQsIHNlY3Rpb24sIGJ1ZmZlciwgZnB0ciwKKwkJCQkJCWNvdW50KTsKKworCQkgICAgICBTRVJJQUxfV1JJVEUgKGxvYWRfZGVzYywgYnVmZmVyLCBjb3VudCk7CisJCSAgICAgIHNlY3Rpb25fYWRkcmVzcyArPSBjb3VudDsKKwkJICAgICAgZnB0ciArPSBjb3VudDsKKwkJICAgICAgc2VjdGlvbl9zaXplIC09IGNvdW50OworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQkJCS8qIEJTUyBhbmQgc3VjaCAqLworCQl7CisJCSAgcHJpbnRmX2ZpbHRlcmVkICgiW3NlY3Rpb24gJXM6IG5vdCBsb2FkaW5nXVxuIiwKKwkJCQkgICBzZWN0aW9uX25hbWUpOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCisgICAgZXJyb3IgKCJcIiVzXCI6IENvdWxkIG5vdCBvcGVuIiwgYXJncyk7CisKKyAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7Cit9CisKKy8qIE9wZW4gYSBjb25uZWN0aW9uIHRvIHRoZSByZW1vdGUgTmV0Uk9NIGRldmljZXMuICAqLworCitzdGF0aWMgdm9pZAorbnJvbV9vcGVuIChuYW1lLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpbnQgZXJybjsKKworICBpZiAoIW5hbWUgfHwgc3RyY2hyIChuYW1lLCAnLycpIHx8IHN0cmNociAobmFtZSwgJzonKSkKKyAgICBlcnJvciAoCisiVG8gb3BlbiBhIE5ldFJPTSBjb25uZWN0aW9uLCB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBob3N0bmFtZVxuXAorb3IgSVAgYWRkcmVzcyBvZiB0aGUgTmV0Uk9NIGRldmljZSB5b3Ugd2lzaCB0byB1c2UuIik7CisKKyAgc3RyY3B5IChucm9tX2hvc3RuYW1lLCBuYW1lKTsKKworICB0YXJnZXRfcHJlb3BlbiAoZnJvbV90dHkpOworCisgIHVucHVzaF90YXJnZXQgKCZucm9tX29wcyk7CisKKyAgY3RybF9kZXNjID0gb3Blbl9zb2NrZXQgKG5yb21faG9zdG5hbWUsIGNvbnRyb2xfcG9ydCk7CisKKyAgcHVzaF90YXJnZXQgKCZucm9tX29wcyk7CisKKyAgaWYgKGZyb21fdHR5KQorICAgIHByaW50Zl9maWx0ZXJlZCAoIkNvbm5lY3RlZCB0byBOZXRST00gZGV2aWNlIFwiJXNcIlxuIiwgbnJvbV9ob3N0bmFtZSk7Cit9CisKKy8qIENsb3NlIG91dCBhbGwgZmlsZXMgYW5kIGxvY2FsIHN0YXRlIGJlZm9yZSB0aGlzIHRhcmdldCBsb3NlcyBjb250cm9sLiAqLworCitzdGF0aWMgdm9pZAorbnJvbV9jbG9zZSAocXVpdHRpbmcpCisgICAgIGludCBxdWl0dGluZzsKK3sKKyAgaWYgKGxvYWRfZGVzYykKKyAgICBTRVJJQUxfQ0xPU0UgKGxvYWRfZGVzYyk7CisgIGlmIChjdHJsX2Rlc2MpCisgICAgU0VSSUFMX0NMT1NFIChjdHJsX2Rlc2MpOworfQorCisvKiBQYXNzIGFyZ3VtZW50cyBkaXJlY3RseSB0byB0aGUgTmV0Uk9NLiAqLworCitzdGF0aWMgdm9pZAorbnJvbV9wYXNzdGhydSAoYXJncywgZnJvbXR0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb210dHk7Cit7CisgIGNoYXIgYnVmWzEwMjRdOworCisgIHNwcmludGYgKGJ1ZiwgIiVzXG4iLCBhcmdzKTsKKyAgaWYgKFNFUklBTF9XUklURSAoY3RybF9kZXNjLCBidWYsIHN0cmxlbiAoYnVmKSkpCisgICAgZXJyb3IgKCJucm9tX3Jlc2V0OiBjb250cm9sX3NlbmQoKSBvZiBgJXMnZmFpbGVkIiwgYXJncyk7Cit9CisKK3N0YXRpYyB2b2lkCitucm9tX21vdXJuKCkgCit7IAorICB1bnB1c2hfdGFyZ2V0ICgmbnJvbV9vcHMpOworICBnZW5lcmljX21vdXJuX2luZmVyaW9yICgpOworfQorCisvKiBEZWZpbmUgdGhlIHRhcmdldCB2ZWN0b3IuICovCisKK3N0cnVjdCB0YXJnZXRfb3BzIG5yb21fb3BzIDsKKworc3RhdGljIHZvaWQgCitpbml0X25yb21fb3BzKHZvaWQpCit7CisgIG5yb21fb3BzLnRvX3Nob3J0bmFtZSA9ICAgIm5yb20iOwkKKyAgbnJvbV9vcHMudG9fbG9uZ25hbWUgPSAgICJSZW1vdGUgWERJIGBOZXRST00nIHRhcmdldCI7CisgIG5yb21fb3BzLnRvX2RvYyA9ICAgIlJlbW90ZSBkZWJ1ZyB1c2luZyBhIE5ldFJPTSBvdmVyIEV0aGVybmV0IjsgCisgIG5yb21fb3BzLnRvX29wZW4gPSAgIG5yb21fb3BlbjsJCQorICBucm9tX29wcy50b19jbG9zZSA9ICAgbnJvbV9jbG9zZTsJCQorICBucm9tX29wcy50b19hdHRhY2ggPSAgIE5VTEw7CisgIG5yb21fb3BzLnRvX3Bvc3RfYXR0YWNoID0gTlVMTDsKKyAgbnJvbV9vcHMudG9fcmVxdWlyZV9hdHRhY2ggPSBOVUxMOwkJCQorICBucm9tX29wcy50b19kZXRhY2ggPSAgIE5VTEw7CisgIG5yb21fb3BzLnRvX3JlcXVpcmVfZGV0YWNoID0gTlVMTDsJCisgIG5yb21fb3BzLnRvX3Jlc3VtZSA9ICAgTlVMTDsJCQkKKyAgbnJvbV9vcHMudG9fd2FpdCAgPSAgIE5VTEw7CisgIG5yb21fb3BzLnRvX3Bvc3Rfd2FpdCA9IE5VTEw7CQkKKyAgbnJvbV9vcHMudG9fZmV0Y2hfcmVnaXN0ZXJzICA9ICAgTlVMTDsKKyAgbnJvbV9vcHMudG9fc3RvcmVfcmVnaXN0ZXJzICA9ICAgTlVMTDsKKyAgbnJvbV9vcHMudG9fcHJlcGFyZV90b19zdG9yZSA9ICAgTlVMTDsKKyAgbnJvbV9vcHMudG9feGZlcl9tZW1vcnkgID0gICBOVUxMOwkKKyAgbnJvbV9vcHMudG9fZmlsZXNfaW5mbyAgPSAgIE5VTEw7CisgIG5yb21fb3BzLnRvX2luc2VydF9icmVha3BvaW50ID0gICBOVUxMOworICBucm9tX29wcy50b19yZW1vdmVfYnJlYWtwb2ludCA9ICAgTlVMTDsKKyAgbnJvbV9vcHMudG9fdGVybWluYWxfaW5pdCAgPSAgIE5VTEw7CQorICBucm9tX29wcy50b190ZXJtaW5hbF9pbmZlcmlvciA9ICAgTlVMTDsKKyAgbnJvbV9vcHMudG9fdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ID0gICBOVUxMOworICBucm9tX29wcy50b190ZXJtaW5hbF9vdXJzICA9ICAgTlVMTDsJCisgIG5yb21fb3BzLnRvX3Rlcm1pbmFsX2luZm8gID0gICBOVUxMOwkKKyAgbnJvbV9vcHMudG9fa2lsbCAgPSAgIG5yb21fa2lsbDsKKyAgbnJvbV9vcHMudG9fbG9hZCAgPSAgIG5yb21fbG9hZDsKKyAgbnJvbV9vcHMudG9fbG9va3VwX3N5bWJvbCA9ICAgTlVMTDsJCisgIG5yb21fb3BzLnRvX2NyZWF0ZV9pbmZlcmlvciA9ICAgTlVMTDsKKyAgbnJvbV9vcHMudG9fcG9zdF9zdGFydHVwX2luZmVyaW9yID0gTlVMTDsKKyAgbnJvbV9vcHMudG9fYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvciA9IE5VTEw7CisgIG5yb21fb3BzLnRvX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IgPSBOVUxMOworICBucm9tX29wcy50b19wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSA9IE5VTEw7CisgIG5yb21fb3BzLnRvX2luc2VydF9mb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBucm9tX29wcy50b19yZW1vdmVfZm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgbnJvbV9vcHMudG9faW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBucm9tX29wcy50b19yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIG5yb21fb3BzLnRvX2hhc19mb3JrZWQgPSBOVUxMOworICBucm9tX29wcy50b19oYXNfdmZvcmtlZCA9IE5VTEw7CisgIG5yb21fb3BzLnRvX2Nhbl9mb2xsb3dfdmZvcmtfcHJpb3JfdG9fZXhlYyA9IE5VTEw7CisgIG5yb21fb3BzLnRvX3Bvc3RfZm9sbG93X3Zmb3JrID0gTlVMTDsJCisgIG5yb21fb3BzLnRvX2luc2VydF9leGVjX2NhdGNocG9pbnQgPSBOVUxMOworICBucm9tX29wcy50b19yZW1vdmVfZXhlY19jYXRjaHBvaW50ID0gTlVMTDsKKyAgbnJvbV9vcHMudG9faGFzX2V4ZWNkID0gTlVMTDsKKyAgbnJvbV9vcHMudG9fcmVwb3J0ZWRfZXhlY19ldmVudHNfcGVyX2V4ZWNfY2FsbCA9IE5VTEw7CisgIG5yb21fb3BzLnRvX2hhc19leGl0ZWQgPSBOVUxMOworICBucm9tX29wcy50b19tb3Vybl9pbmZlcmlvciA9ICAgbnJvbV9tb3VybjsKKyAgbnJvbV9vcHMudG9fY2FuX3J1biAgPSAgIE5VTEw7CisgIG5yb21fb3BzLnRvX25vdGljZV9zaWduYWxzID0gICAwOworICBucm9tX29wcy50b190aHJlYWRfYWxpdmUgID0gICAwOworICBucm9tX29wcy50b19zdG9wICA9ICAgMDsKKyAgbnJvbV9vcHMudG9fcGlkX3RvX2V4ZWNfZmlsZSA9IE5VTEw7CisgIG5yb21fb3BzLnRvX2NvcmVfZmlsZV90b19zeW1fZmlsZSA9IE5VTEw7CisgIG5yb21fb3BzLnRvX3N0cmF0dW0gPSAgIGRvd25sb2FkX3N0cmF0dW07CisgIG5yb21fb3BzLkRPTlRfVVNFID0gICBOVUxMOwkJCQorICBucm9tX29wcy50b19oYXNfYWxsX21lbW9yeSA9ICAgMTsJCQorICBucm9tX29wcy50b19oYXNfbWVtb3J5ID0gICAxOwkJCQorICBucm9tX29wcy50b19oYXNfc3RhY2sgPSAgIDE7CQkJCisgIG5yb21fb3BzLnRvX2hhc19yZWdpc3RlcnMgPSAgIDE7CQkKKyAgbnJvbV9vcHMudG9faGFzX2V4ZWN1dGlvbiA9ICAgMDsJCQorICBucm9tX29wcy50b19zZWN0aW9ucyA9ICAgTlVMTDsJCQorICBucm9tX29wcy50b19zZWN0aW9uc19lbmQgPSAgIE5VTEw7CQkKKyAgbnJvbV9vcHMudG9fbWFnaWMgPSAgIE9QU19NQUdJQyA7CQkKK307CisKK3ZvaWQKK19pbml0aWFsaXplX3JlbW90ZV9ucm9tICgpCit7CisgIGluaXRfbnJvbV9vcHMoKSA7CisgIGFkZF90YXJnZXQgKCZucm9tX29wcyk7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQgKAorICAgIGFkZF9zZXRfY21kICgibnJvbV9sb2FkX3BvcnQiLCBub19jbGFzcywgdmFyX3ppbnRlZ2VyLCAoY2hhciAqKSZsb2FkX3BvcnQsCisJCSAiU2V0IHRoZSBwb3J0IHRvIHVzZSBmb3IgTmV0Uk9NIGRvd25sb2Fkc1xuIiwgJnNldGxpc3QpLAorCQkgICAgICZzaG93bGlzdCk7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQgKAorICAgIGFkZF9zZXRfY21kICgibnJvbV9jb250cm9sX3BvcnQiLCBub19jbGFzcywgdmFyX3ppbnRlZ2VyLCAoY2hhciAqKSZjb250cm9sX3BvcnQsCisJCSAiU2V0IHRoZSBwb3J0IHRvIHVzZSBmb3IgTmV0Uk9NIGRlYnVnZ2VyIHNlcnZpY2VzXG4iLCAmc2V0bGlzdCksCisJCSAgICAgJnNob3dsaXN0KTsKKworICBhZGRfY21kICgibnJvbSIsIG5vX2NsYXNzLCBucm9tX3Bhc3N0aHJ1LAorCSAgICJQYXNzIGFyZ3VtZW50cyBhcyBjb21tYW5kIHRvIE5ldFJPTSIsCisJICAgJmNtZGxpc3QpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS1vczlrLmMgYi9nZGIvcmVtb3RlLW9zOWsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWJmYTgzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JlbW90ZS1vczlrLmMKQEAgLTAsMCArMSwxMjY0IEBACisvKiBSZW1vdGUgZGVidWdnaW5nIGludGVyZmFjZSBmb3IgYm9vdCBtb25pdG9ycywgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSB3YXMgZGVyaXZlZCBmcm9tIHJlbW90ZS1lYi5jLCB3aGljaCBkaWQgYSBzaW1pbGFyIGpvYiwgYnV0IGZvcgorICAgYW4gQU1ELTI5SyBydW5uaW5nIEVCTU9OLiAgVGhhdCBmaWxlIHdhcyBpbiB0dXJuIGRlcml2ZWQgZnJvbSByZW1vdGUuYworICAgYXMgbWVudGlvbmVkIGluIHRoZSBmb2xsb3dpbmcgY29tbWVudCAobGVmdCBpbiBmb3IgY29taWMgcmVsaWVmKToKKworICAiVGhpcyBpcyBsaWtlIHJlbW90ZS5jIGJ1dCBpcyBmb3IgYSBkaWZmZXJlbnQgc2l0dWF0aW9uLS0KKyAgIGhhdmluZyBhIFBDIHJ1bm5pbmcgb3M5MDAwIGhvb2sgdXAgd2l0aCBhIHVuaXggbWFjaGluZSB3aXRoCisgICBhIHNlcmlhbCBsaW5lLCBhbmQgcnVubmluZyBjdHR5IGNvbTIgb24gdGhlIFBDLiBvczkwMDAgaGFzIGEgZGVidWcKKyAgIG1vbml0b3IgY2FsbGVkIFJPTUJVRyBydW5uaW5nLiAgTm90IHRvIG1lbnRpb24gdGhhdCB0aGUgUEMKKyAgIGhhcyBQQy9ORlMsIHNvIGl0IGNhbiBhY2Nlc3MgdGhlIHNhbWUgZXhlY3V0YWJsZXMgdGhhdCBnZGIgY2FuLAorICAgb3ZlciB0aGUgbmV0IGluIHJlYWwgdGltZS4iCisKKyAgIEluIHJlYWxpdHksIHRoaXMgbW9kdWxlIHRhbGtzIHRvIGEgZGVidWcgbW9uaXRvciBjYWxsZWQgJ1JPTUJVRycsIHdoaWNoCisgICBXZSBjb21tdW5pY2F0ZSB3aXRoIFJPTUJVRyB2aWEgYSBkaXJlY3Qgc2VyaWFsIGxpbmUsIHRoZSBuZXR3b3JrIHZlcnNpb24KKyAgIG9mIFJPTUJVRyBpcyBub3QgYXZhaWxhYmxlIHlldC4KKyovCisKKy8qIEZJWE1FIFRoaXMgZmlsZSBuZWVkcyB0byBiZSByZXdyaXR0ZW4gaWYgaXQncyB0byB3b3JrIGFnYWluLCBlaXRoZXIKKyAgIHRvIHNlbGYtY29udGFpbmVkIG9yIHRvIHVzZSB0aGUgbmV3IG1vbml0b3IgaW50ZXJmYWNlLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAid2FpdC5oIgorI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2Vsc2UKKyNpbmNsdWRlIDx2YXJhcmdzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgInNlcmlhbC5oIgorI2luY2x1ZGUgIm1vbml0b3IuaCIKKyNpbmNsdWRlICJyZW1vdGUtdXRpbHMuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJnZGItc3RhYnMuaCIKKworc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKnNob3dsaXN0OworZXh0ZXJuIHN0cnVjdCB0YXJnZXRfb3BzIHJvbWJ1Z19vcHM7CQkvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCitleHRlcm4gc3RydWN0IG1vbml0b3Jfb3BzIHJvbWJ1Z19jbWRzOwkJLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworZXh0ZXJuIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpzZXRsaXN0OworZXh0ZXJuIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICp1bnNldGxpc3Q7CitleHRlcm4gaW50IGF0dGFjaF9mbGFnOworCitzdGF0aWMgdm9pZCByb21idWdfY2xvc2UoKTsKK3N0YXRpYyB2b2lkIHJvbWJ1Z19mZXRjaF9yZWdpc3RlcigpOworc3RhdGljIHZvaWQgcm9tYnVnX2ZldGNoX3JlZ2lzdGVycygpOworc3RhdGljIHZvaWQgcm9tYnVnX3N0b3JlX3JlZ2lzdGVyKCk7CisjaWYgMAorc3RhdGljIGludCBzcl9nZXRfZGVidWcoKTsJCQkvKiBmbGFnIHNldCBieSAic2V0IHJlbW90ZWRlYnVnIiAqLworI2VuZGlmCitzdGF0aWMgaW50IGhhc2htYXJrOwkJCQkvKiBmbGFnIHNldCBieSAic2V0IGhhc2giICovCitzdGF0aWMgaW50IHJvbWJ1Z19pc19vcGVuID0gMDsKKworLyogRklYTUU6IFJlcGxhY2Ugd2l0aCBzcl9nZXRfZGVidWcgKCkuICAqLworI2RlZmluZSBMT0dfRklMRSAibW9uaXRvci5sb2ciCitGSUxFICpsb2dfZmlsZTsKK3N0YXRpYyBpbnQgbW9uaXRvcl9sb2cgPSAwOworc3RhdGljIGludCB0dHlfeG9uID0gMDsKK3N0YXRpYyBpbnQgdHR5X3hvZmYgPSAwOworCitzdGF0aWMgaW50IHRpbWVvdXQgPSAxMDsKK3N0YXRpYyBpbnQgaXNfdHJhY2VfbW9kZSA9IDA7CisvKiBEZXNjcmlwdG9yIGZvciBJL08gdG8gcmVtb3RlIG1hY2hpbmUuICBJbml0aWFsaXplIGl0IHRvIE5VTEwqLworc3RhdGljIHNlcmlhbF90IG1vbml0b3JfZGVzYyA9IE5VTEw7CisKK3N0YXRpYyBDT1JFX0FERFIgYnVmYWRkciA9IDA7CitzdGF0aWMgaW50IGJ1ZmxlbiA9IDA7CitzdGF0aWMgY2hhciByZWFkYnVmWzE2XTsKKworLyogU2VuZCBkYXRhIHRvIG1vbml0b3IuICBXb3JrcyBqdXN0IGxpa2UgcHJpbnRmLiAqLworc3RhdGljIHZvaWQKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKK3ByaW50Zl9tb25pdG9yKGNoYXIgKnBhdHRlcm4sIC4uLikKKyNlbHNlCitwcmludGZfbW9uaXRvcih2YV9hbGlzdCkKKyAgICAgdmFfZGNsCisjZW5kaWYKK3sKKyAgdmFfbGlzdCBhcmdzOworICBjaGFyIGJ1ZlsyMDBdOworICBpbnQgaTsKKworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworICB2YV9zdGFydCAoYXJncywgcGF0dGVybik7CisjZWxzZQorICBjaGFyICpwYXR0ZXJuOworICB2YV9zdGFydChhcmdzKTsKKyAgcGF0dGVybiA9IHZhX2FyZyhhcmdzLCBjaGFyICopOworI2VuZGlmCisKKyAgdnNwcmludGYoYnVmLCBwYXR0ZXJuLCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworCisgIGlmIChTRVJJQUxfV1JJVEUobW9uaXRvcl9kZXNjLCBidWYsIHN0cmxlbihidWYpKSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlNFUklBTF9XUklURSBmYWlsZWQ6ICVzXG4iLCBzYWZlX3N0cmVycm9yKGVycm5vKSk7Cit9CisKKy8qIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgcmVtb3RlIHN5c3RlbSwgZG9pbmcgYWxsIHRoZSBmYW5jeSB0aW1lb3V0IHN0dWZmKi8KK3N0YXRpYyBpbnQKK3JlYWRjaGFyKHRpbWVvdXQpCisgICAgIGludCB0aW1lb3V0OworeworICBpbnQgYzsKKworICBjID0gU0VSSUFMX1JFQURDSEFSKG1vbml0b3JfZGVzYywgdGltZW91dCk7CisKKyAgaWYgKHNyX2dldF9kZWJ1ZygpKQorICAgIHB1dGNoYXIoYyAmIDB4N2YpOworCisgIGlmIChtb25pdG9yX2xvZyAmJiBpc2FzY2lpKGMpKQorICAgIHB1dGMoYyAmIDB4N2YsIGxvZ19maWxlKTsKKworICBpZiAoYyA+PSAwKQorICAgIHJldHVybiBjICYgMHg3ZjsKKworICBpZiAoYyA9PSBTRVJJQUxfVElNRU9VVCkKKyAgICB7CisgICAgICBpZiAodGltZW91dCA9PSAwKQorCXJldHVybiBjOwkJLyogUG9sbHMgc2hvdWxkbid0IGdlbmVyYXRlIHRpbWVvdXQgZXJyb3JzICovCisKKyAgICAgIGVycm9yKCJUaW1lb3V0IHJlYWRpbmcgZnJvbSByZW1vdGUgc3lzdGVtLiIpOworICAgIH0KKworICBwZXJyb3Jfd2l0aF9uYW1lKCJyZW1vdGUtbW9uaXRvciIpOworfQorCisvKiBTY2FuIGlucHV0IGZyb20gdGhlIHJlbW90ZSBzeXN0ZW0sIHVudGlsIFNUUklORyBpcyBmb3VuZC4gIElmIERJU0NBUkQgaXMKKyAgIG5vbi16ZXJvLCB0aGVuIGRpc2NhcmQgbm9uLW1hdGNoaW5nIGlucHV0LCBlbHNlIHByaW50IGl0IG91dC4KKyAgIExldCB0aGUgdXNlciBicmVhayBvdXQgaW1tZWRpYXRlbHkuICAqLworc3RhdGljIHZvaWQKK2V4cGVjdChzdHJpbmcsIGRpc2NhcmQpCisgICAgIGNoYXIgKnN0cmluZzsKKyAgICAgaW50IGRpc2NhcmQ7Cit7CisgIGNoYXIgKnAgPSBzdHJpbmc7CisgIGludCBjOworCisgIGlmIChzcl9nZXRfZGVidWcoKSkKKyAgICBwcmludGYgKCJFeHBlY3RpbmcgXCIlc1wiXG4iLCBzdHJpbmcpOworCisgIGltbWVkaWF0ZV9xdWl0ID0gMTsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgYyA9IHJlYWRjaGFyKHRpbWVvdXQpOworICAgICAgaWYgKCFpc2FzY2lpIChjKSkKKwljb250aW51ZTsKKyAgICAgIGlmIChjID09ICpwKyspCisJeworCSAgaWYgKCpwID09ICdcMCcpCisJICAgIHsKKwkgICAgICBpbW1lZGlhdGVfcXVpdCA9IDA7CisJICAgICAgaWYgKHNyX2dldF9kZWJ1ZygpKQorCQlwcmludGYgKCJcbk1hdGNoZWRcbiIpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoIWRpc2NhcmQpCisJICAgIHsKKwkgICAgICBmd3JpdGUoc3RyaW5nLCAxLCAocCAtIDEpIC0gc3RyaW5nLCBzdGRvdXQpOworCSAgICAgIHB1dGNoYXIoKGNoYXIpYyk7CisJICAgICAgZmZsdXNoKHN0ZG91dCk7CisJICAgIH0KKwkgIHAgPSBzdHJpbmc7CisJfQorICAgIH0KK30KKworLyogS2VlcCBkaXNjYXJkaW5nIGlucHV0IHVudGlsIHdlIHNlZSB0aGUgUk9NQlVHIHByb21wdC4KKworICAgVGhlIGNvbnZlbnRpb24gZm9yIGRlYWxpbmcgd2l0aCB0aGUgcHJvbXB0IGlzIHRoYXQgeW91CisgICBvIGdpdmUgeW91ciBjb21tYW5kCisgICBvICp0aGVuKiB3YWl0IGZvciB0aGUgcHJvbXB0LgorCisgICBUaHVzIHRoZSBsYXN0IHRoaW5nIHRoYXQgYSBwcm9jZWR1cmUgZG9lcyB3aXRoIHRoZSBzZXJpYWwgbGluZQorICAgd2lsbCBiZSBhbiBleHBlY3RfcHJvbXB0KCkuICBFeGNlcHRpb246ICByb21idWdfcmVzdW1lIGRvZXMgbm90CisgICB3YWl0IGZvciB0aGUgcHJvbXB0LCBiZWNhdXNlIHRoZSB0ZXJtaW5hbCBpcyBiZWluZyBoYW5kZWQgb3ZlcgorICAgdG8gdGhlIGluZmVyaW9yLiAgSG93ZXZlciwgdGhlIG5leHQgdGhpbmcgd2hpY2ggaGFwcGVucyBhZnRlciB0aGF0CisgICBpcyBhIHJvbWJ1Z193YWl0IHdoaWNoIGRvZXMgd2FpdCBmb3IgdGhlIHByb21wdC4KKyAgIE5vdGUgdGhhdCB0aGlzIGluY2x1ZGVzIGFibm9ybWFsIGV4aXQsIGUuZy4gZXJyb3IoKS4gIFRoaXMgaXMKKyAgIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGdldHRpbmcgaW50byBzdGF0ZXMgZnJvbSB3aGljaCB3ZSBjYW4ndAorICAgcmVjb3Zlci4gICovCitzdGF0aWMgdm9pZAorZXhwZWN0X3Byb21wdChkaXNjYXJkKQorICAgICBpbnQgZGlzY2FyZDsKK3sKKyAgaWYgKG1vbml0b3JfbG9nKQorICAvKiBUaGlzIGlzIGEgY29udmVuaWVudCBwbGFjZSB0byBkbyB0aGlzLiAgVGhlIGlkZWEgaXMgdG8gZG8gaXQgb2Z0ZW4KKyAgICAgZW5vdWdoIHRoYXQgd2UgbmV2ZXIgbG9zZSBtdWNoIGRhdGEgaWYgd2UgdGVybWluYXRlIGFibm9ybWFsbHkuICAqLworICAgIGZmbHVzaChsb2dfZmlsZSk7CisKKyAgaWYgKGlzX3RyYWNlX21vZGUpIHsKKyAgICBleHBlY3QoInRyYWNlIiwgZGlzY2FyZCk7CisgIH0gZWxzZSB7CisgICAgZXhwZWN0IChQUk9NUFQsIGRpc2NhcmQpOworICB9Cit9CisKKy8qIEdldCBhIGhleCBkaWdpdCBmcm9tIHRoZSByZW1vdGUgc3lzdGVtICYgcmV0dXJuIGl0cyB2YWx1ZS4KKyAgIElmIGlnbm9yZV9zcGFjZSBpcyBub256ZXJvLCBpZ25vcmUgc3BhY2VzIChub3QgbmV3bGluZSwgdGFiLCBldGMpLiAgKi8KK3N0YXRpYyBpbnQKK2dldF9oZXhfZGlnaXQoaWdub3JlX3NwYWNlKQorICAgICBpbnQgaWdub3JlX3NwYWNlOworeworICBpbnQgY2g7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGNoID0gcmVhZGNoYXIodGltZW91dCk7CisgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKKwlyZXR1cm4gY2ggLSAnMCc7CisgICAgICBlbHNlIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKQorCXJldHVybiBjaCAtICdBJyArIDEwOworICAgICAgZWxzZSBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykKKwlyZXR1cm4gY2ggLSAnYScgKyAxMDsKKyAgICAgIGVsc2UgaWYgKGNoID09ICcgJyAmJiBpZ25vcmVfc3BhY2UpCisJOworICAgICAgZWxzZQorCXsKKwkgIGV4cGVjdF9wcm9tcHQoMSk7CisJICBlcnJvcigiSW52YWxpZCBoZXggZGlnaXQgZnJvbSByZW1vdGUgc3lzdGVtLiIpOworCX0KKyAgICB9Cit9CisKKy8qIEdldCBhIGJ5dGUgZnJvbSBtb25pdG9yIGFuZCBwdXQgaXQgaW4gKkJZVC4gIEFjY2VwdCBhbnkgbnVtYmVyCisgICBsZWFkaW5nIHNwYWNlcy4gICovCitzdGF0aWMgdm9pZAorZ2V0X2hleF9ieXRlIChieXQpCisgICAgIGNoYXIgKmJ5dDsKK3sKKyAgaW50IHZhbDsKKworICB2YWwgPSBnZXRfaGV4X2RpZ2l0ICgxKSA8PCA0OworICB2YWwgfD0gZ2V0X2hleF9kaWdpdCAoMCk7CisgICpieXQgPSB2YWw7Cit9CisKKy8qIEdldCBOIDMyLWJpdCB3b3JkcyBmcm9tIHJlbW90ZSwgZWFjaCBwcmVjZWRlZCBieSBhIHNwYWNlLAorICAgYW5kIHB1dCB0aGVtIGluIHJlZ2lzdGVycyBzdGFydGluZyBhdCBSRUdOTy4gICovCitzdGF0aWMgdm9pZAorZ2V0X2hleF9yZWdzIChuLCByZWdubykKKyAgICAgaW50IG47CisgICAgIGludCByZWdubzsKK3sKKyAgbG9uZyB2YWw7CisgIGludCBpOworICB1bnNpZ25lZCBjaGFyIGI7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7CisgICAgICBpbnQgajsKKyAgICAgIAorICAgICAgdmFsID0gMDsKKyAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisJeworCSAgZ2V0X2hleF9ieXRlICgmYik7CisJICBpZiAoVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKKwkgICAgdmFsID0gKHZhbCA8PCA4KSArIGI7CisJICBlbHNlCisJICAgIHZhbCA9IHZhbCArIChiIDw8IChqKjgpKTsKKwl9CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vKyssIChjaGFyICopICZ2YWwpOworICAgIH0KK30KKworLyogVGhpcyBpcyBjYWxsZWQgbm90IG9ubHkgd2hlbiB3ZSBmaXJzdCBhdHRhY2gsIGJ1dCBhbHNvIHdoZW4gdGhlCisgICB1c2VyIHR5cGVzICJydW4iIGFmdGVyIGhhdmluZyBhdHRhY2hlZC4gICovCitzdGF0aWMgdm9pZAorcm9tYnVnX2NyZWF0ZV9pbmZlcmlvciAoZXhlY2ZpbGUsIGFyZ3MsIGVudikKKyAgICAgY2hhciAqZXhlY2ZpbGU7CisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGludCBlbnRyeV9wdDsKKworICBpZiAoYXJncyAmJiAqYXJncykKKyAgICBlcnJvcigiQ2FuJ3QgcGFzcyBhcmd1bWVudHMgdG8gcmVtb3RlIFJPTUJVRyBwcm9jZXNzIik7CisKKyAgaWYgKGV4ZWNmaWxlID09IDAgfHwgZXhlY19iZmQgPT0gMCkKKyAgICBlcnJvcigiTm8gZXhlY3V0YWJsZSBmaWxlIHNwZWNpZmllZCIpOworCisgIGVudHJ5X3B0ID0gKGludCkgYmZkX2dldF9zdGFydF9hZGRyZXNzIChleGVjX2JmZCk7CisKKyAgaWYgKG1vbml0b3JfbG9nKQorICAgIGZwdXRzICgiXG5JbiBDcmVhdGVfaW5mZXJpb3IoKSIsIGxvZ19maWxlKTsKKworCisvKiBUaGUgInByb2Nlc3MiIChib2FyZCkgaXMgYWxyZWFkeSBzdG9wcGVkIGF3YWl0aW5nIG91ciBjb21tYW5kcywgYW5kCisgICB0aGUgcHJvZ3JhbSBpcyBhbHJlYWR5IGRvd25sb2FkZWQuICBXZSBqdXN0IHNldCBpdHMgUEMgYW5kIGdvLiAgKi8KKworICBpbml0X3dhaXRfZm9yX2luZmVyaW9yICgpOworICBwcm9jZWVkICgoQ09SRV9BRERSKWVudHJ5X3B0LCBUQVJHRVRfU0lHTkFMX0RFRkFVTFQsIDApOworfQorCisvKiBPcGVuIGEgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBkZWJ1Z2dlci4KKyAgIE5BTUUgaXMgdGhlIGZpbGVuYW1lIHVzZWQgZm9yIGNvbW11bmljYXRpb24uICAqLworCitzdGF0aWMgY2hhciBkZXZfbmFtZVsxMDBdOworCitzdGF0aWMgdm9pZAorcm9tYnVnX29wZW4oYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICBlcnJvciAoIlVzZSBgdGFyZ2V0IFJvbUJ1ZyBERVZJQ0UtTkFNRScgdG8gdXNlIGEgc2VyaWFsIHBvcnQsIG9yIFxuXAorYHRhcmdldCBSb21CdWcgSE9TVC1OQU1FOlBPUlQtTlVNQkVSJyB0byB1c2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uIik7CisKKyAgdGFyZ2V0X3ByZW9wZW4oZnJvbV90dHkpOworCisgIGlmIChyb21idWdfaXNfb3BlbikKKyAgICB1bnB1c2hfdGFyZ2V0KCZyb21idWdfb3BzKTsKKworICBzdHJjcHkoZGV2X25hbWUsIGFyZ3MpOworICBtb25pdG9yX2Rlc2MgPSBTRVJJQUxfT1BFTihkZXZfbmFtZSk7CisgIGlmIChtb25pdG9yX2Rlc2MgPT0gTlVMTCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lKGRldl9uYW1lKTsKKworICAvKiBpZiBiYXVkIHJhdGUgaXMgc2V0IGJ5ICdzZXQgcmVtb3RlYmF1ZCcgKi8KKyAgaWYgKFNFUklBTF9TRVRCQVVEUkFURSAobW9uaXRvcl9kZXNjLCBzcl9nZXRfYmF1ZF9yYXRlKCkpKQorICAgIHsKKyAgICAgIFNFUklBTF9DTE9TRSAobW9uaXRvcl9kZXNjKTsKKyAgICAgIHBlcnJvcl93aXRoX25hbWUgKCJSb21CdWciKTsKKyAgICB9CisgIFNFUklBTF9SQVcobW9uaXRvcl9kZXNjKTsKKyAgaWYgKHR0eV94b24gfHwgdHR5X3hvZmYpCisgICAgeworICAgIHN0cnVjdCBoYXJkd2FyZV90dHlzdGF0ZSB7IHN0cnVjdCB0ZXJtaW9zIHQ7fSAqdHR5X3M7CisKKyAgICAgIHR0eV9zID0oc3RydWN0IGhhcmR3YXJlX3R0eXN0YXRlICAqKVNFUklBTF9HRVRfVFRZX1NUQVRFKG1vbml0b3JfZGVzYyk7CisgICAgICBpZiAodHR5X3hvbikgdHR5X3MtPnQuY19pZmxhZyB8PSBJWE9OOyAKKyAgICAgIGlmICh0dHlfeG9mZikgdHR5X3MtPnQuY19pZmxhZyB8PSBJWE9GRjsKKyAgICAgIFNFUklBTF9TRVRfVFRZX1NUQVRFKG1vbml0b3JfZGVzYywgKHNlcmlhbF90dHlzdGF0ZSkgdHR5X3MpOworICAgIH0KKworICByb21idWdfaXNfb3BlbiA9IDE7CisKKyAgbG9nX2ZpbGUgPSBmb3BlbiAoTE9HX0ZJTEUsICJ3Iik7CisgIGlmIChsb2dfZmlsZSA9PSBOVUxMKQorICAgIHBlcnJvcl93aXRoX25hbWUgKExPR19GSUxFKTsKKworICBwdXNoX21vbml0b3IgKCZyb21idWdfY21kcyk7CisgIHByaW50Zl9tb25pdG9yKCJcciIpOwkvKiBDUiB3YWtlcyB1cCBtb25pdG9yICovCisgIGV4cGVjdF9wcm9tcHQoMSk7CisgIHB1c2hfdGFyZ2V0ICgmcm9tYnVnX29wcyk7CisgIGF0dGFjaF9mbGFnID0gMTsKKworICBpZiAoZnJvbV90dHkpCisgICAgcHJpbnRmKCJSZW1vdGUgJXMgY29ubmVjdGVkIHRvICVzXG4iLCB0YXJnZXRfc2hvcnRuYW1lLAorCSAgIGRldl9uYW1lKTsKKworICByb21idWdfZmV0Y2hfcmVnaXN0ZXJzKCk7CisKKyAgcHJpbnRmX21vbml0b3IgKCJvdiBlIFxyIik7CisgIGV4cGVjdF9wcm9tcHQoMSk7CisgIGJ1ZmFkZHIgPSAwOworICBidWZsZW4gPSAwOworfQorCisvKgorICogQ2xvc2Ugb3V0IGFsbCBmaWxlcyBhbmQgbG9jYWwgc3RhdGUgYmVmb3JlIHRoaXMgdGFyZ2V0IGxvc2VzIGNvbnRyb2wuCisgKi8KKworc3RhdGljIHZvaWQKK3JvbWJ1Z19jbG9zZSAocXVpdHRpbmcpCisgICAgIGludCBxdWl0dGluZzsKK3sKKyAgaWYgKHJvbWJ1Z19pc19vcGVuKSB7CisgICAgU0VSSUFMX0NMT1NFKG1vbml0b3JfZGVzYyk7CisgICAgbW9uaXRvcl9kZXNjID0gTlVMTDsKKyAgICByb21idWdfaXNfb3BlbiA9IDA7CisgIH0KKworICBpZiAobG9nX2ZpbGUpIHsKKyAgICBpZiAoZmVycm9yKGxvZ19maWxlKSkKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd3JpdGluZyBsb2cgZmlsZS5cbiIpOworICAgIGlmIChmY2xvc2UobG9nX2ZpbGUpICE9IDApCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGNsb3NpbmcgbG9nIGZpbGUuXG4iKTsKKyAgICBsb2dfZmlsZSA9IDA7CisgIH0KK30KKworaW50Cityb21idWdfbGluayhtb2RfbmFtZSwgdGV4dF9yZWxvYykKKyAgICAgY2hhciAqbW9kX25hbWU7CisgICAgIENPUkVfQUREUiAqdGV4dF9yZWxvYzsKK3sKKyAgaW50IGksIGo7CisgIHVuc2lnbmVkIGxvbmcgdmFsOworICB1bnNpZ25lZCBjaGFyIGI7CisKKyAgcHJpbnRmX21vbml0b3IoImwgJXMgXHIiLCBtb2RfbmFtZSk7IAorICBleHBlY3RfcHJvbXB0KDEpOworICBwcmludGZfbW9uaXRvcigiLnIgXHIiKTsKKyAgZXhwZWN0KFJFR19ERUxJTSwgMSk7CisgIGZvciAoaT0wOyBpIDw9IDc7IGkrKykKKyAgICB7CisgICAgICB2YWwgPSAwOworICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgeworICAgICAgICAgIGdldF9oZXhfYnl0ZSgmYik7CisgICAgICAgICAgdmFsID0gKHZhbCA8PCA4KSArIGI7CisJfQorICAgIH0KKyAgZXhwZWN0X3Byb21wdCgxKTsKKyAgKnRleHRfcmVsb2MgPSB2YWw7CisgIHJldHVybiAxOworfQorCisvKiBUZXJtaW5hdGUgdGhlIG9wZW4gY29ubmVjdGlvbiB0byB0aGUgcmVtb3RlIGRlYnVnZ2VyLgorICAgVXNlIHRoaXMgd2hlbiB5b3Ugd2FudCB0byBkZXRhY2ggYW5kIGRvIHNvbWV0aGluZyBlbHNlCisgICB3aXRoIHlvdXIgZ2RiLiAgKi8KK3N0YXRpYyB2b2lkCityb21idWdfZGV0YWNoIChmcm9tX3R0eSkKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAoYXR0YWNoX2ZsYWcpIHsKKyAgICBwcmludGZfbW9uaXRvciAoR09fQ01EKTsKKyAgICBhdHRhY2hfZmxhZyA9IDA7CisgIH0KKyAgcG9wX3RhcmdldCgpOwkJLyogY2FsbHMgcm9tYnVnX2Nsb3NlIHRvIGRvIHRoZSByZWFsIHdvcmsgKi8KKyAgaWYgKGZyb21fdHR5KQorICAgIHByaW50ZiAoIkVuZGluZyByZW1vdGUgJXMgZGVidWdnaW5nXG4iLCB0YXJnZXRfc2hvcnRuYW1lKTsKK30KKyAKKy8qCisgKiBUZWxsIHRoZSByZW1vdGUgbWFjaGluZSB0byByZXN1bWUuCisgKi8KK3N0YXRpYyB2b2lkCityb21idWdfcmVzdW1lIChwaWQsIHN0ZXAsIHNpZykKKyAgICAgaW50IHBpZCwgc3RlcDsKKyAgICAgZW51bSB0YXJnZXRfc2lnbmFsIHNpZzsKK3sKKyAgaWYgKG1vbml0b3JfbG9nKQorICAgIGZwcmludGYgKGxvZ19maWxlLCAiXG5JbiBSZXN1bWUgKHN0ZXA9JWQsIHNpZz0lZClcbiIsIHN0ZXAsIHNpZyk7CisKKyAgaWYgKHN0ZXApCisgICAgeworICAgICAgaXNfdHJhY2VfbW9kZSA9IDE7CisgICAgICBwcmludGZfbW9uaXRvciAoU1RFUF9DTUQpOworICAgICAgLyogd2FpdCBmb3IgdGhlIGVjaG8uICAqKgorICAgICAgZXhwZWN0IChTVEVQX0NNRCwgMSk7CisgICAgICAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50Zl9tb25pdG9yIChHT19DTUQpOworICAgICAgLyogc3dhbGxvdyB0aGUgZWNoby4gICoqCisgICAgICBleHBlY3QgKEdPX0NNRCwgMSk7CisgICAgICAqLworICAgIH0KKyAgYnVmYWRkciA9IDA7CisgIGJ1Zmxlbj0gMDsKK30KKworLyoKKyAqIFdhaXQgdW50aWwgdGhlIHJlbW90ZSBtYWNoaW5lIHN0b3BzLCB0aGVuIHJldHVybiwKKyAqIHN0b3Jpbmcgc3RhdHVzIGluIHN0YXR1cyBqdXN0IGFzIGB3YWl0JyB3b3VsZC4KKyAqLworCitzdGF0aWMgaW50Cityb21idWdfd2FpdCAocGlkLCBzdGF0dXMpCisgICAgIGludCBwaWQ7CisgICAgIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqc3RhdHVzOworeworICBpbnQgb2xkX3RpbWVvdXQgPSB0aW1lb3V0OworICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpvZmZzOworICBDT1JFX0FERFIgYWRkciwgcGM7CisgIHN0cnVjdCBvYmpfc2VjdGlvbiAqb2JqX3NlYzsKKworICBpZiAobW9uaXRvcl9sb2cpCisgICAgZnB1dHMgKCJcbkluIHdhaXQgKCkiLCBsb2dfZmlsZSk7CisKKyAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0VYSVRFRDsKKyAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gMDsKKworICB0aW1lb3V0ID0gLTE7CQkvKiBEb24ndCB0aW1lIG91dCAtLSB1c2VyIHByb2dyYW0gaXMgcnVubmluZy4gKi8KKyAgZXhwZWN0ICgiZWF4OiIsIDApOyAgIC8qIG91dHB1dCBhbnkgbWVzc2FnZSBiZWZvcmUgcmVnaXN0ZXIgZGlzcGxheSAqLworICBleHBlY3RfcHJvbXB0KDEpOyAgICAgLyogV2FpdCBmb3IgcHJvbXB0LCBvdXRwdXR0aW5nIGV4dHJhbmVvdXMgdGV4dCAqLworCisgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOworICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVFJBUDsKKyAgdGltZW91dCA9IG9sZF90aW1lb3V0OworICByb21idWdfZmV0Y2hfcmVnaXN0ZXJzKCk7CisgIGJ1ZmFkZHIgPSAwOworICBidWZsZW4gPSAwOworICBwYyA9IHJlYWRfcmVnaXN0ZXIoUENfUkVHTlVNKTsKKyAgYWRkciA9IHJlYWRfcmVnaXN0ZXIoREFUQUJBU0VfUkVHKTsKKyAgb2JqX3NlYyA9IGZpbmRfcGNfc2VjdGlvbiAocGMpOworICBpZiAob2JqX3NlYyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChvYmpfc2VjLT5vYmpmaWxlICE9IHN5bWZpbGVfb2JqZmlsZSkKKyAgICAgICAgbmV3X3N5bWZpbGVfb2JqZmlsZShvYmpfc2VjLT5vYmpmaWxlLCAxLCAwKTsKKyAgICAgIG9mZnMgPSAoKHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKikKKwkgYWxsb2NhIChzaXplb2YgKHN0cnVjdCBzZWN0aW9uX29mZnNldHMpCisJICsgKHN5bWZpbGVfb2JqZmlsZS0+bnVtX3NlY3Rpb25zICogc2l6ZW9mIChvZmZzLT5vZmZzZXRzKSkpKTsKKyAgICAgIG1lbWNweSAob2Zmcywgc3ltZmlsZV9vYmpmaWxlLT5zZWN0aW9uX29mZnNldHMsCisgICAgICAgICAoc2l6ZW9mIChzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzKSArIAorCSAoc3ltZmlsZV9vYmpmaWxlLT5udW1fc2VjdGlvbnMgKiBzaXplb2YgKG9mZnMtPm9mZnNldHMpKSkpOworICAgICAgQU5PRkZTRVQgKG9mZnMsIFNFQ1RfT0ZGX0RBVEEpID0gYWRkcjsKKyAgICAgIEFOT0ZGU0VUIChvZmZzLCBTRUNUX09GRl9CU1MpID0gYWRkcjsKKworICAgICAgb2JqZmlsZV9yZWxvY2F0ZShzeW1maWxlX29iamZpbGUsIG9mZnMpOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHRoZSBuYW1lIG9mIHJlZ2lzdGVyIG51bWJlciByZWdubyBpbiB0aGUgZm9ybSBpbnB1dCBhbmQgb3V0cHV0IGJ5CisgICBtb25pdG9yLiAgQ3VycmVudGx5LCByZWdpc3Rlcl9uYW1lcyBqdXN0IGhhcHBlbnMgdG8gY29udGFpbiBleGFjdGx5IHdoYXQKKyAgIG1vbml0b3Igd2FudHMuICBMZXRzIHRha2UgYWR2YW50YWdlIG9mIHRoYXQganVzdCBhcyBsb25nIGFzIHBvc3NpYmxlISAqLworCitzdGF0aWMgY2hhciAqCitnZXRfcmVnX25hbWUgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHN0YXRpYyBjaGFyIGJ1Zls1MF07CisgIGNoYXIgKnA7CisgIGNoYXIgKmI7CisKKyAgYiA9IGJ1ZjsKKworICBpZiAocmVnbm8gPCAwKQorICAgIHJldHVybiAoIiIpOworLyoKKyAgZm9yIChwID0gUkVHSVNURVJfTkFNRSAocmVnbm8pOyAqcDsgcCsrKQorICAgICpiKysgPSB0b3VwcGVyKCpwKTsKKyAgKmIgPSAnXDAwMCc7CisqLworICBwID0gKGNoYXIgKilSRUdJU1RFUl9OQU1FIChyZWdubyk7CisgIHJldHVybiBwOworLyoKKyAgcmV0dXJuIGJ1ZjsKKyovCit9CisKKy8qIHJlYWQgdGhlIHJlbW90ZSByZWdpc3RlcnMgaW50byB0aGUgYmxvY2sgcmVncy4gICovCisKK3N0YXRpYyB2b2lkCityb21idWdfZmV0Y2hfcmVnaXN0ZXJzICgpCit7CisgIGludCByZWdubywgaiwgaTsKKyAgbG9uZyB2YWw7CisgIHVuc2lnbmVkIGNoYXIgYjsKKworICBwcmludGZfbW9uaXRvciAoR0VUX1JFRyk7CisgIGV4cGVjdCgiZWF4OiIsIDEpOworICBleHBlY3QoIlxuIiwgMSk7CisgIGdldF9oZXhfcmVncygxLCAwKTsKKyAgZ2V0X2hleF9yZWdzKDEsIDMpOworICBnZXRfaGV4X3JlZ3MoMSwgMSk7CisgIGdldF9oZXhfcmVncygxLCAyKTsKKyAgZ2V0X2hleF9yZWdzKDEsIDYpOworICBnZXRfaGV4X3JlZ3MoMSwgNyk7CisgIGdldF9oZXhfcmVncygxLCA1KTsKKyAgZ2V0X2hleF9yZWdzKDEsIDQpOworICBmb3IgKHJlZ25vID0gODsgcmVnbm8gPD0gMTU7IHJlZ25vKyspCisgICAgeworICAgICAgZXhwZWN0KFJFR19ERUxJTSwgMSk7CisgICAgICBpZiAocmVnbm8gPj0gOCAmJiByZWdubyA8PSAxMykKKwl7CisJICB2YWwgPSAwOworCSAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZ2V0X2hleF9ieXRlICgmYik7CisJICAgICAgaWYgKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pCisJCXZhbCA9ICh2YWwgPDwgOCkgKyBiOworCSAgICAgIGVsc2UKKwkJdmFsID0gdmFsICsgKGIgPDwgKGoqOCkpOworICAgICAgICAgICAgfQorCisJICBpZiAocmVnbm8gPT0gOCkgaSA9IDEwOworCSAgaWYgKHJlZ25vID49ICA5ICYmIHJlZ25vIDw9IDEyKSBpID0gcmVnbm8gKyAzOworCSAgaWYgKHJlZ25vID09IDEzKSBpID0gMTE7CisJICBzdXBwbHlfcmVnaXN0ZXIgKGksIChjaGFyICopICZ2YWwpOworCX0KKyAgICAgIGVsc2UgaWYgKHJlZ25vID09IDE0KQorCXsKKwkgIGdldF9oZXhfcmVncygxLCBQQ19SRUdOVU0pOworCX0KKyAgICAgIGVsc2UgaWYgKHJlZ25vID09IDE1KQorCXsKKwkgIGdldF9oZXhfcmVncygxLCA5KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdmFsID0gMDsKKwkgIHN1cHBseV9yZWdpc3RlcihyZWdubywgKGNoYXIgKikgJnZhbCk7CisJfQorICAgIH0KKyAgaXNfdHJhY2VfbW9kZSA9IDA7CisgIGV4cGVjdF9wcm9tcHQgKDEpOworfQorCisvKiBGZXRjaCByZWdpc3RlciBSRUdOTywgb3IgYWxsIHJlZ2lzdGVycyBpZiBSRUdOTyBpcyAtMS4KKyAgIFJldHVybnMgZXJybm8gdmFsdWUuICAqLworc3RhdGljIHZvaWQKK3JvbWJ1Z19mZXRjaF9yZWdpc3RlciAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgaW50IHZhbCwgajsKKyAgdW5zaWduZWQgY2hhciBiOworCisgIGlmIChtb25pdG9yX2xvZykgeworICAgIGZwcmludGYgKGxvZ19maWxlLCAiXG5JbiBGZXRjaCBSZWdpc3RlciAocmVnPSVzKVxuIiwgZ2V0X3JlZ19uYW1lIChyZWdubykpOworICAgIGZmbHVzaCAobG9nX2ZpbGUpOworICB9CisKKyAgaWYgKHJlZ25vIDwgMCkKKyAgICB7CisgICAgICByb21idWdfZmV0Y2hfcmVnaXN0ZXJzICgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgKm5hbWUgPSBnZXRfcmVnX25hbWUgKHJlZ25vKTsKKyAgICAgIHByaW50Zl9tb25pdG9yIChHRVRfUkVHKTsKKyAgICAgIGlmIChyZWdubyA+PSAxMCAmJiByZWdubyA8PSAxNSkKKwl7CisJICBleHBlY3QgKCJcbiIsIDEpOworCSAgZXhwZWN0ICgiXG4iLCAxKTsKKyAgICAgICAgICBleHBlY3QgKG5hbWUsIDEpOworICAgICAgICAgIGV4cGVjdCAoUkVHX0RFTElNLCAxKTsKKwkgIHZhbCA9IDA7CisJICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBnZXRfaGV4X2J5dGUgKCZiKTsKKwkgICAgICBpZiAoVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKKwkJdmFsID0gKHZhbCA8PCA4KSArIGI7CisJICAgICAgZWxzZQorCQl2YWwgPSB2YWwgKyAoYiA8PCAoaio4KSk7CisgICAgICAgICAgICB9CisJICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCAoY2hhciAqKSAmdmFsKTsKKwl9CisgICAgICBlbHNlIGlmIChyZWdubyA9PSA4IHx8IHJlZ25vID09IDkpCisJeworCSAgZXhwZWN0ICgiXG4iLCAxKTsKKwkgIGV4cGVjdCAoIlxuIiwgMSk7CisJICBleHBlY3QgKCJcbiIsIDEpOworICAgICAgICAgIGV4cGVjdCAobmFtZSwgMSk7CisgICAgICAgICAgZXhwZWN0IChSRUdfREVMSU0sIDEpOworCSAgZ2V0X2hleF9yZWdzICgxLCByZWdubyk7CisJfQorICAgICAgZWxzZQorCXsKKyAgICAgICAgICBleHBlY3QgKG5hbWUsIDEpOworICAgICAgICAgIGV4cGVjdCAoUkVHX0RFTElNLCAxKTsKKwkgIGV4cGVjdCgiXG4iLCAxKTsKKwkgIGdldF9oZXhfcmVncygxLCAwKTsKKwkgIGdldF9oZXhfcmVncygxLCAzKTsKKwkgIGdldF9oZXhfcmVncygxLCAxKTsKKwkgIGdldF9oZXhfcmVncygxLCAyKTsKKwkgIGdldF9oZXhfcmVncygxLCA2KTsKKwkgIGdldF9oZXhfcmVncygxLCA3KTsKKwkgIGdldF9oZXhfcmVncygxLCA1KTsKKwkgIGdldF9oZXhfcmVncygxLCA0KTsKKwl9CisgICAgICBleHBlY3RfcHJvbXB0ICgxKTsKKyAgICB9CisgIHJldHVybjsKK30KKworLyogU3RvcmUgdGhlIHJlbW90ZSByZWdpc3RlcnMgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIGJsb2NrIFJFR1MuICAqLworCitzdGF0aWMgdm9pZAorcm9tYnVnX3N0b3JlX3JlZ2lzdGVycyAoKQoreworICBpbnQgcmVnbm87CisKKyAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDw9IFBDX1JFR05VTTsgcmVnbm8rKykKKyAgICByb21idWdfc3RvcmVfcmVnaXN0ZXIocmVnbm8pOworCisgIHJlZ2lzdGVyc19jaGFuZ2VkICgpOworfQorCisvKiBTdG9yZSByZWdpc3RlciBSRUdOTywgb3IgYWxsIGlmIFJFR05PID09IDAuCisgICByZXR1cm4gZXJybm8gdmFsdWUuICAqLworc3RhdGljIHZvaWQKK3JvbWJ1Z19zdG9yZV9yZWdpc3RlciAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKK2NoYXIgKm5hbWU7CisKKyAgaWYgKG1vbml0b3JfbG9nKQorICAgIGZwcmludGYgKGxvZ19maWxlLCAiXG5JbiBTdG9yZV9yZWdpc3RlciAocmVnbm89JWQpXG4iLCByZWdubyk7CisKKyAgaWYgKHJlZ25vID09IC0xKQorICAgIHJvbWJ1Z19zdG9yZV9yZWdpc3RlcnMgKCk7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoc3JfZ2V0X2RlYnVnKCkpCisJcHJpbnRmICgiU2V0dGluZyByZWdpc3RlciAlcyB0byAweCV4XG4iLCBnZXRfcmVnX25hbWUgKHJlZ25vKSwgcmVhZF9yZWdpc3RlciAocmVnbm8pKTsKKworICAgICAgbmFtZSA9IGdldF9yZWdfbmFtZShyZWdubyk7CisgICAgICBpZiAobmFtZSA9PSAwKSByZXR1cm47CisgICAgICBwcmludGZfbW9uaXRvciAoU0VUX1JFRywgbmFtZSwgcmVhZF9yZWdpc3RlciAocmVnbm8pKTsKKworICAgICAgaXNfdHJhY2VfbW9kZSA9IDA7CisgICAgICBleHBlY3RfcHJvbXB0ICgxKTsKKyAgICB9Cit9CisKKy8qIEdldCByZWFkeSB0byBtb2RpZnkgdGhlIHJlZ2lzdGVycyBhcnJheS4gIE9uIG1hY2hpbmVzIHdoaWNoIHN0b3JlCisgICBpbmRpdmlkdWFsIHJlZ2lzdGVycywgdGhpcyBkb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuICBPbiBtYWNoaW5lcworICAgd2hpY2ggc3RvcmUgYWxsIHRoZSByZWdpc3RlcnMgaW4gb25lIGZlbGwgc3dvb3AsIHRoaXMgbWFrZXMgc3VyZQorICAgdGhhdCByZWdpc3RlcnMgY29udGFpbnMgYWxsIHRoZSByZWdpc3RlcnMgZnJvbSB0aGUgcHJvZ3JhbSBiZWluZworICAgZGVidWdnZWQuICAqLworCitzdGF0aWMgdm9pZAorcm9tYnVnX3ByZXBhcmVfdG9fc3RvcmUgKCkKK3sKKyAgLyogRG8gbm90aGluZywgc2luY2Ugd2UgY2FuIHN0b3JlIGluZGl2aWR1YWwgcmVncyAqLworfQorCitzdGF0aWMgdm9pZAorcm9tYnVnX2ZpbGVzX2luZm8gKCkKK3sKKyAgcHJpbnRmICgiXHRBdHRhY2hlZCB0byAlcyBhdCAlZCBiYXVkLlxuIiwKKwkgIGRldl9uYW1lLCBzcl9nZXRfYmF1ZF9yYXRlKCkpOworfQorCisvKiBDb3B5IExFTiBieXRlcyBvZiBkYXRhIGZyb20gZGVidWdnZXIgbWVtb3J5IGF0IE1ZQUREUgorICAgdG8gaW5mZXJpb3IncyBtZW1vcnkgYXQgTUVNQUREUi4gIFJldHVybnMgbGVuZ3RoIG1vdmVkLiAgKi8KK3N0YXRpYyBpbnQKK3JvbWJ1Z193cml0ZV9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgdW5zaWduZWQgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICBpbnQgaTsKKyAgY2hhciBidWZbMTBdOworCisgIGlmIChtb25pdG9yX2xvZykKKyAgICBmcHJpbnRmIChsb2dfZmlsZSwgIlxuSW4gV3JpdGVfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyPSV4LCBsZW49JWQpXG4iLCBtZW1hZGRyLCBsZW4pOworCisgIHByaW50Zl9tb25pdG9yIChNRU1fU0VUX0NNRCwgbWVtYWRkcik7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICB7CisgICAgICBleHBlY3QgKENNRF9ERUxJTSwgMSk7CisgICAgICBwcmludGZfbW9uaXRvciAoIiV4IFxyIiwgbXlhZGRyW2ldKTsKKyAgICAgIGlmIChzcl9nZXRfZGVidWcoKSkKKwlwcmludGYgKCJcblNldCAweCV4IHRvIDB4JXhcbiIsIG1lbWFkZHIgKyBpLCBteWFkZHJbaV0pOworICAgIH0KKyAgZXhwZWN0IChDTURfREVMSU0sIDEpOworICBpZiAoQ01EX0VORCkKKyAgICBwcmludGZfbW9uaXRvciAoQ01EX0VORCk7CisgIGlzX3RyYWNlX21vZGUgPSAwOworICBleHBlY3RfcHJvbXB0ICgxKTsKKworICBidWZhZGRyID0gMDsKKyAgYnVmbGVuID0gMDsKKyAgcmV0dXJuIGxlbjsKK30KKworLyogUmVhZCBMRU4gYnl0ZXMgZnJvbSBpbmZlcmlvciBtZW1vcnkgYXQgTUVNQUREUi4gIFB1dCB0aGUgcmVzdWx0CisgICBhdCBkZWJ1Z2dlciBhZGRyZXNzIE1ZQUREUi4gIFJldHVybnMgbGVuZ3RoIG1vdmVkLiAgKi8KK3N0YXRpYyBpbnQKK3JvbWJ1Z19yZWFkX2luZmVyaW9yX21lbW9yeShtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaW50IGksIGo7CisKKyAgLyogTnVtYmVyIG9mIGJ5dGVzIHJlYWQgc28gZmFyLiAgKi8KKyAgaW50IGNvdW50OworCisgIC8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhpcyBwYXNzLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBzdGFydGFkZHI7CisKKyAgLyogTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgaW4gdGhpcyBwYXNzLiAgKi8KKyAgaW50IGxlbl90aGlzX3Bhc3M7CisKKyAgaWYgKG1vbml0b3JfbG9nKQorICAgIGZwcmludGYgKGxvZ19maWxlLCAiXG5JbiBSZWFkX2luZmVyaW9yX21lbW9yeSAobWVtYWRkcj0leCwgbGVuPSVkKVxuIiwgbWVtYWRkciwgbGVuKTsKKworICAvKiBOb3RlIHRoYXQgdGhpcyBjb2RlIHdvcmtzIGNvcnJlY3RseSBpZiBzdGFydGFkZHIgaXMganVzdCBsZXNzCisgICAgIHRoYW4gVUlOVF9NQVggKHdlbGwsIHJlYWxseSBDT1JFX0FERFJfTUFYIGlmIHRoZXJlIHdhcyBzdWNoIGEKKyAgICAgdGhpbmcpLiAgVGhhdCBpcywgc29tZXRoaW5nIGxpa2UKKyAgICAgcm9tYnVnX3JlYWRfYnl0ZXMgKENPUkVfQUREUl9NQVggLSA0LCBmb28sIDQpCisgICAgIHdvcmtzLS1pdCBuZXZlciBhZGRzIGxlbiBUbyBtZW1hZGRyIGFuZCBnZXRzIDAuICAqLworICAvKiBIb3dldmVyLCBzb21ldGhpbmcgbGlrZQorICAgICByb21idWdfcmVhZF9ieXRlcyAoQ09SRV9BRERSX01BWCAtIDMsIGZvbywgNCkKKyAgICAgZG9lc24ndCBuZWVkIHRvIHdvcmsuICBEZXRlY3QgaXQgYW5kIGdpdmUgdXAgaWYgdGhlcmUncyBhbiBhdHRlbXB0CisgICAgIHRvIGRvIHRoYXQuICAqLworICBpZiAoKChtZW1hZGRyIC0gMSkgKyBsZW4pIDwgbWVtYWRkcikgeworICAgIGVycm5vID0gRUlPOworICAgIHJldHVybiAwOworICB9CisgIGlmIChidWZhZGRyIDw9IG1lbWFkZHIgJiYgKG1lbWFkZHIrbGVuKSA8PSAoYnVmYWRkcitidWZsZW4pKQorICAgIHsKKyAgICAgIG1lbWNweShteWFkZHIsICZyZWFkYnVmW21lbWFkZHItYnVmYWRkcl0sIGxlbik7CisgICAgICByZXR1cm4gbGVuOworICAgIH0KKyAgCisgIHN0YXJ0YWRkciA9IG1lbWFkZHI7CisgIGNvdW50ID0gMDsKKyAgd2hpbGUgKGNvdW50IDwgbGVuKQorICAgIHsKKyAgICAgIGxlbl90aGlzX3Bhc3MgPSAxNjsKKyAgICAgIGlmICgoc3RhcnRhZGRyICUgMTYpICE9IDApCisJbGVuX3RoaXNfcGFzcyAtPSBzdGFydGFkZHIgJSAxNjsKKyAgICAgIGlmIChsZW5fdGhpc19wYXNzID4gKGxlbiAtIGNvdW50KSkKKwlsZW5fdGhpc19wYXNzID0gKGxlbiAtIGNvdW50KTsKKyAgICAgIGlmIChzcl9nZXRfZGVidWcoKSkKKwlwcmludGYgKCJcbkRpc3BsYXkgJWQgYnl0ZXMgYXQgJXhcbiIsIGxlbl90aGlzX3Bhc3MsIHN0YXJ0YWRkcik7CisKKyAgICAgIHByaW50Zl9tb25pdG9yIChNRU1fRElTX0NNRCwgc3RhcnRhZGRyLCA4KTsKKyAgICAgIGV4cGVjdCAoIi0gIiwgMSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwl7CisJICBnZXRfaGV4X2J5dGUgKCZyZWFkYnVmW2ldKTsKKwl9CisgICAgICBidWZhZGRyID0gc3RhcnRhZGRyOworICAgICAgYnVmbGVuID0gMTY7CisgICAgICBtZW1jcHkoJm15YWRkcltjb3VudF0sIHJlYWRidWYsIGxlbl90aGlzX3Bhc3MpOyAKKyAgICAgIGNvdW50ICs9IGxlbl90aGlzX3Bhc3M7CisgICAgICBzdGFydGFkZHIgKz0gbGVuX3RoaXNfcGFzczsKKyAgICAgIGV4cGVjdChDTURfREVMSU0sIDEpOworICAgIH0KKyAgaWYgKENNRF9FTkQpIAorICAgICAgcHJpbnRmX21vbml0b3IgKENNRF9FTkQpOworICBpc190cmFjZV9tb2RlID0gMDsKKyAgZXhwZWN0X3Byb21wdCAoMSk7CisKKyAgcmV0dXJuIGxlbjsKK30KKworLyogRklYTUUtc29tZWRheSEgIG1lcmdlIHRoZXNlIHR3by4gICovCitzdGF0aWMgaW50Cityb21idWdfeGZlcl9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuLCB3cml0ZSwgdGFyZ2V0KQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworICAgICBpbnQgd3JpdGU7CisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQ7CQkvKiBpZ25vcmVkICovCit7CisgIGlmICh3cml0ZSkKKyAgICByZXR1cm4gcm9tYnVnX3dyaXRlX2luZmVyaW9yX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4pOworICBlbHNlCisgICAgcmV0dXJuIHJvbWJ1Z19yZWFkX2luZmVyaW9yX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4pOworfQorCitzdGF0aWMgdm9pZAorcm9tYnVnX2tpbGwgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHJldHVybjsJCS8qIGlnbm9yZSBhdHRlbXB0cyB0byBraWxsIHRhcmdldCBzeXN0ZW0gKi8KK30KKworLyogQ2xlYW4gdXAgd2hlbiBhIHByb2dyYW0gZXhpdHMuCisgICBUaGUgcHJvZ3JhbSBhY3R1YWxseSBsaXZlcyBvbiBpbiB0aGUgcmVtb3RlIHByb2Nlc3NvcidzIFJBTSwgYW5kIG1heSBiZQorICAgcnVuIGFnYWluIHdpdGhvdXQgYSBkb3dubG9hZC4gIERvbid0IGxlYXZlIGl0IGZ1bGwgb2YgYnJlYWtwb2ludAorICAgaW5zdHJ1Y3Rpb25zLiAgKi8KKworc3RhdGljIHZvaWQKK3JvbWJ1Z19tb3Vybl9pbmZlcmlvciAoKQoreworICByZW1vdmVfYnJlYWtwb2ludHMgKCk7CisgIGdlbmVyaWNfbW91cm5faW5mZXJpb3IgKCk7CS8qIERvIGFsbCB0aGUgcHJvcGVyIHRoaW5ncyBub3cgKi8KK30KKworI2RlZmluZSBNQVhfTU9OSVRPUl9CUkVBS1BPSU5UUyAxNgorCitzdGF0aWMgQ09SRV9BRERSIGJyZWFrYWRkcltNQVhfTU9OSVRPUl9CUkVBS1BPSU5UU10gPSB7MH07CisKK3N0YXRpYyBpbnQKK3JvbWJ1Z19pbnNlcnRfYnJlYWtwb2ludCAoYWRkciwgc2hhZG93KQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqc2hhZG93OworeworICBpbnQgaTsKKyAgQ09SRV9BRERSIGJwX2FkZHIgPSBhZGRyOworICBpbnQgYnBfc2l6ZSA9IDA7CisKKyAgaWYgKG1vbml0b3JfbG9nKQorICAgIGZwcmludGYgKGxvZ19maWxlLCAiXG5JbiBJbnNlcnRfYnJlYWtwb2ludCAoYWRkcj0leClcbiIsIGFkZHIpOworICBCUkVBS1BPSU5UX0ZST01fUEMgKCZicF9hZGRyLCAmYnBfc2l6ZSk7CisKKyAgZm9yIChpID0gMDsgaSA8PSBNQVhfTU9OSVRPUl9CUkVBS1BPSU5UUzsgaSsrKQorICAgIGlmIChicmVha2FkZHJbaV0gPT0gMCkKKyAgICAgIHsKKwlicmVha2FkZHJbaV0gPSBhZGRyOworCWlmIChzcl9nZXRfZGVidWcoKSkKKwkgIHByaW50ZiAoIkJyZWFrcG9pbnQgYXQgJXhcbiIsIGFkZHIpOworCXJvbWJ1Z19yZWFkX2luZmVyaW9yX21lbW9yeSAoYnBfYWRkciwgc2hhZG93LCBicF9zaXplKTsKKwlwcmludGZfbW9uaXRvcihTRVRfQlJFQUtfQ01ELCBhZGRyKTsKKwlpc190cmFjZV9tb2RlID0gMDsKKwlleHBlY3RfcHJvbXB0KDEpOworCXJldHVybiAwOworICAgICAgfQorCisgIGZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgYnJlYWtwb2ludHMgKD4gMTYpIGZvciBtb25pdG9yXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBfcmVtb3ZlX2JyZWFrcG9pbnQgLS0gVGVsbCB0aGUgbW9uaXRvciB0byByZW1vdmUgYSBicmVha3BvaW50CisgKi8KK3N0YXRpYyBpbnQKK3JvbWJ1Z19yZW1vdmVfYnJlYWtwb2ludCAoYWRkciwgc2hhZG93KQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqc2hhZG93OworeworICBpbnQgaTsKKworICBpZiAobW9uaXRvcl9sb2cpCisgICAgZnByaW50ZiAobG9nX2ZpbGUsICJcbkluIFJlbW92ZV9icmVha3BvaW50IChhZGRyPSV4KVxuIiwgYWRkcik7CisKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9NT05JVE9SX0JSRUFLUE9JTlRTOyBpKyspCisgICAgaWYgKGJyZWFrYWRkcltpXSA9PSBhZGRyKQorICAgICAgeworCWJyZWFrYWRkcltpXSA9IDA7CisJcHJpbnRmX21vbml0b3IoQ0xSX0JSRUFLX0NNRCwgYWRkcik7CisJaXNfdHJhY2VfbW9kZSA9IDA7CisJZXhwZWN0X3Byb21wdCgxKTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGZpbmQgYnJlYWtwb2ludCBhc3NvY2lhdGVkIHdpdGggMHgleFxuIiwgYWRkcik7CisgIHJldHVybiAxOworfQorCisvKiBMb2FkIGEgZmlsZS4gVGhpcyBpcyB1c3VhbGx5IGFuIHNyZWNvcmQsIHdoaWNoIGlzIGFzY2lpLiBObyAKKyAgIHByb3RvY29sLCBqdXN0IHNlbnQgbGluZSBieSBsaW5lLiAqLworCisjZGVmaW5lIERPV05MT0FEX0xJTkVfU0laRSAxMDAKK3N0YXRpYyB2b2lkCityb21idWdfbG9hZCAoYXJnKQorICAgIGNoYXIJKmFyZzsKK3sKKy8qIHRoaXMgcGFydCBjb21tZW50IG91dCBmb3Igb3M5KiAqLworI2lmIDAKKyAgRklMRSAqZG93bmxvYWQ7CisgIGNoYXIgYnVmW0RPV05MT0FEX0xJTkVfU0laRV07CisgIGludCBpLCBieXRlc19yZWFkOworCisgIGlmIChzcl9nZXRfZGVidWcoKSkKKyAgICBwcmludGYgKCJMb2FkaW5nICVzIHRvIG1vbml0b3JcbiIsIGFyZyk7CisKKyAgZG93bmxvYWQgPSBmb3BlbiAoYXJnLCAiciIpOworICBpZiAoZG93bmxvYWQgPT0gTlVMTCkKKyAgICB7CisgICAgZXJyb3IgKHNwcmludGYgKGJ1ZiwgIiVzIERvZXMgbm90IGV4aXN0IiwgYXJnKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgcHJpbnRmX21vbml0b3IgKExPQURfQ01EKTsKKy8qICBleHBlY3QgKCJXYWl0aW5nIGZvciBTLXJlY29yZHMgZnJvbSBob3N0Li4uICIsIDEpOyAqLworCisgIHdoaWxlICghZmVvZiAoZG93bmxvYWQpKQorICAgIHsKKyAgICAgIGJ5dGVzX3JlYWQgPSBmcmVhZCAoYnVmLCBzaXplb2YgKGNoYXIpLCBET1dOTE9BRF9MSU5FX1NJWkUsIGRvd25sb2FkKTsKKyAgICAgIGlmIChoYXNobWFyaykKKwl7CisJICBwdXRjaGFyICgnLicpOworCSAgZmZsdXNoIChzdGRvdXQpOworCX0KKworICAgICAgaWYgKFNFUklBTF9XUklURShtb25pdG9yX2Rlc2MsIGJ1ZiwgYnl0ZXNfcmVhZCkpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIlNFUklBTF9XUklURSBmYWlsZWQ6ICh3aGlsZSBkb3dubG9hZGluZykgJXNcbiIsIHNhZmVfc3RyZXJyb3IoZXJybm8pKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIGkgPSAwOworICAgICAgd2hpbGUgKGkrKyA8PTIwMDAwMCkge30gOyAgICAgCQkJLyogVWdseSBIQUNLLCBwcm9iYWJseSBuZWVkcyBmbG93IGNvbnRyb2wgKi8KKyAgICAgIGlmIChieXRlc19yZWFkIDwgRE9XTkxPQURfTElORV9TSVpFKQorCXsKKwkgIGlmICghZmVvZiAoZG93bmxvYWQpKQorCSAgICBlcnJvciAoIk9ubHkgcmVhZCAlZCBieXRlc1xuIiwgYnl0ZXNfcmVhZCk7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGlmIChoYXNobWFyaykKKyAgICB7CisgICAgICBwdXRjaGFyICgnXG4nKTsKKyAgICB9CisgIGlmICghZmVvZiAoZG93bmxvYWQpKQorICAgIGVycm9yICgiTmV2ZXIgZ290IEVPRiB3aGlsZSBkb3dubG9hZGluZyIpOworICBmY2xvc2UgKGRvd25sb2FkKTsKKyNlbmRpZiAwCit9CisKKy8qIFB1dCBhIGNvbW1hbmQgc3RyaW5nLCBpbiBhcmdzLCBvdXQgdG8gTU9OSVRPUi4gIAorICAgT3V0cHV0IGZyb20gTU9OSVRPUiBpcyBwbGFjZWQgb24gdGhlIHVzZXJzIHRlcm1pbmFsIHVudGlsIHRoZSBwcm9tcHQgCisgICBpcyBzZWVuLiAqLworCitzdGF0aWMgdm9pZAorcm9tYnVnX2NvbW1hbmQgKGFyZ3MsIGZyb210dHkpCisgICAgIGNoYXIJKmFyZ3M7CisgICAgIGludAlmcm9tdHR5OworeworICBpZiAobW9uaXRvcl9kZXNjID09IE5VTEwpCisgICAgZXJyb3IoIm1vbml0b3IgdGFyZ2V0IG5vdCBvcGVuLiIpOworICAKKyAgaWYgKG1vbml0b3JfbG9nKQorICAgIGZwcmludGYgKGxvZ19maWxlLCAiXG5JbiBjb21tYW5kIChhcmdzPSVzKVxuIiwgYXJncyk7CisKKyAgaWYgKCFhcmdzKQorICAgIGVycm9yKCJNaXNzaW5nIGNvbW1hbmQuIik7CisJCisgIHByaW50Zl9tb25pdG9yKCIlc1xyIiwgYXJncyk7CisgIGV4cGVjdF9wcm9tcHQoMCk7Cit9CisKKyNpZiAwCisvKiBDb25uZWN0IHRoZSB1c2VyIGRpcmVjdGx5IHRvIE1PTklUT1IuICBUaGlzIGNvbW1hbmQgYWN0cyBqdXN0IGxpa2UgdGhlCisgICAnY3UnIG9yICd0aXAnIGNvbW1hbmQuICBVc2UgPENSPn4uIG9yIDxDUj5+XkQgdG8gYnJlYWsgb3V0LiAgKi8KKworc3RhdGljIHN0cnVjdCB0dHlzdGF0ZSB0dHlzdGF0ZTsKKworc3RhdGljIHZvaWQKK2NsZWFudXBfdHR5KCkKK3sgIHByaW50ZigiXHJcbltFeGl0aW5nIGNvbm5lY3QgbW9kZV1cclxuIik7CisgIC8qU0VSSUFMX1JFU1RPUkUoMCwgJnR0eXN0YXRlKTsqLworfQorCitzdGF0aWMgdm9pZAorY29ubmVjdF9jb21tYW5kIChhcmdzLCBmcm9tdHR5KQorICAgICBjaGFyCSphcmdzOworICAgICBpbnQJZnJvbXR0eTsKK3sKKyAgZmRfc2V0IHJlYWRmZHM7CisgIGludCBudW1mZHM7CisgIGludCBjOworICBjaGFyIGN1cl9lc2MgPSAwOworCisgIGRvbnRfcmVwZWF0KCk7CisKKyAgaWYgKG1vbml0b3JfZGVzYyA9PSBOVUxMKQorICAgIGVycm9yKCJtb25pdG9yIHRhcmdldCBub3Qgb3Blbi4iKTsKKyAgCisgIGlmIChhcmdzKQorICAgIGZwcmludGYoIlRoaXMgY29tbWFuZCB0YWtlcyBubyBhcmdzLiAgVGhleSBoYXZlIGJlZW4gaWdub3JlZC5cbiIpOworCQorICBwcmludGYoIltFbnRlcmluZyBjb25uZWN0IG1vZGUuICBVc2Ugfi4gb3Igfl5EIHRvIGVzY2FwZV1cbiIpOworCisgIHNlcmlhbF9yYXcoMCwgJnR0eXN0YXRlKTsKKworICBtYWtlX2NsZWFudXAoY2xlYW51cF90dHksIDApOworCisgIEZEX1pFUk8oJnJlYWRmZHMpOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGRvCisJeworCSAgRkRfU0VUKDAsICZyZWFkZmRzKTsKKwkgIEZEX1NFVChtb25pdG9yX2Rlc2MsICZyZWFkZmRzKTsKKwkgIG51bWZkcyA9IHNlbGVjdChzaXplb2YocmVhZGZkcykqOCwgJnJlYWRmZHMsIDAsIDAsIDApOworCX0KKyAgICAgIHdoaWxlIChudW1mZHMgPT0gMCk7CisKKyAgICAgIGlmIChudW1mZHMgPCAwKQorCXBlcnJvcl93aXRoX25hbWUoInNlbGVjdCIpOworCisgICAgICBpZiAoRkRfSVNTRVQoMCwgJnJlYWRmZHMpKQorCXsJCQkvKiB0dHkgaW5wdXQsIHNlbmQgdG8gbW9uaXRvciAqLworCSAgYyA9IGdldGNoYXIoKTsKKwkgIGlmIChjIDwgMCkKKwkgICAgcGVycm9yX3dpdGhfbmFtZSgiY29ubmVjdCIpOworCisJICBwcmludGZfbW9uaXRvcigiJWMiLCBjKTsKKwkgIHN3aXRjaCAoY3VyX2VzYykKKwkgICAgeworCSAgICBjYXNlIDA6CisJICAgICAgaWYgKGMgPT0gJ1xyJykKKwkJY3VyX2VzYyA9IGM7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ1xyJzoKKwkgICAgICBpZiAoYyA9PSAnficpCisJCWN1cl9lc2MgPSBjOworCSAgICAgIGVsc2UKKwkJY3VyX2VzYyA9IDA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ34nOgorCSAgICAgIGlmIChjID09ICcuJyB8fCBjID09ICdcMDA0JykKKwkJcmV0dXJuOworCSAgICAgIGVsc2UKKwkJY3VyX2VzYyA9IDA7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChGRF9JU1NFVChtb25pdG9yX2Rlc2MsICZyZWFkZmRzKSkKKwl7CisJICB3aGlsZSAoMSkKKwkgICAgeworCSAgICAgIGMgPSByZWFkY2hhcigwKTsKKwkgICAgICBpZiAoYyA8IDApCisJCWJyZWFrOworCSAgICAgIHB1dGNoYXIoYyk7CisJICAgIH0KKwkgIGZmbHVzaChzdGRvdXQpOworCX0KKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIERlZmluZSB0aGUgbW9uaXRvciBjb21tYW5kIHN0cmluZ3MuIFNpbmNlIHRoZXNlIGFyZSBwYXNzZWQgZGlyZWN0bHkKKyAqIHRocm91Z2ggdG8gYSBwcmludGYgc3R5bGUgZnVuY3Rpb24sIHdlIG5lZWQgY2FuIGluY2x1ZGUgZm9ybWF0dGluZworICogc3RyaW5ncy4gV2UgYWxzbyBuZWVkIGEgQ1Igb3IgTEYgb24gdGhlIGVuZC4KKyAqLworI3dhcm5pbmcgRklYTUU6IG1vbml0b3IgaW50ZXJmYWNlIHBhdHRlcm4gc3RyaW5ncywgc3RhbGUgc3RydWN0IGRlY2wKK3N0cnVjdCBtb25pdG9yX29wcyByb21idWdfY21kcyA9IHsKKyAgImcgXHIiLAkJCQkvKiBleGVjdXRlIG9yIHVzdWFsbHkgR08gY29tbWFuZCAqLworICAiZyBcciIsCQkJCS8qIGNvbnRpbnVlIGNvbW1hbmQgKi8KKyAgInQgXHIiLAkJCQkvKiBzaW5nbGUgc3RlcCAqLworICAiYiAleFxyIiwJCQkJLyogc2V0IGEgYnJlYWtwb2ludCAqLworICAiayAleFxyIiwJCQkJLyogY2xlYXIgYSBicmVha3BvaW50ICovCisgICJjICV4XHIiLAkJCQkvKiBzZXQgbWVtb3J5IHRvIGEgdmFsdWUgKi8KKyAgImQgJXggJWRcciIsCQkJCS8qIGRpc3BsYXkgbWVtb3J5ICovCisgICIkJTA4WCIsCQkJCS8qIHByb21wdCBtZW1vcnkgY29tbWFuZHMgdXNlICovCisgICIuJXMgJXhcciIsCQkJCS8qIHNldCBhIHJlZ2lzdGVyICovCisgICI6IiwJCQkJCS8qIGRlbGltaXRlciBiZXR3ZWVuIHJlZ2lzdGVycyAqLworICAiLiBcciIsCQkJCS8qIHJlYWQgYSByZWdpc3RlciAqLworICAibWYgXHIiLAkJCQkvKiBkb3dubG9hZCBjb21tYW5kICovCisgICJSb21CdWc6ICIsCQkJCS8qIG1vbml0b3IgY29tbWFuZCBwcm9tcHQgKi8KKyAgIjogIiwJCQkJCS8qIGVuZC1vZi1jb21tYW5kIGRlbGltaXRvciAqLworICAiLlxyIgkJCQkJLyogb3B0aW9uYWwgY29tbWFuZCB0ZXJtaW5hdG9yICovCit9OworCitzdHJ1Y3QgdGFyZ2V0X29wcyByb21idWdfb3BzIDsKKworc3RhdGljIHZvaWQgCitpbml0X3JvbWJ1Z19vcHModm9pZCkKK3sKKyAgcm9tYnVnX29wcy50b19zaG9ydG5hbWUgPSAgICJyb21idWciOworICByb21idWdfb3BzLnRvX2xvbmduYW1lID0gICAiTWljcm93YXJlJ3MgUk9NQlVHIGRlYnVnIG1vbml0b3IiOworICByb21idWdfb3BzLnRvX2RvYyA9ICAgIlVzZSBhIHJlbW90ZSBjb21wdXRlciBydW5uaW5nIHRoZSBST01CVUcgZGVidWcgbW9uaXRvci5cblwKK1NwZWNpZnkgdGhlIHNlcmlhbCBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvIChlLmcuIC9kZXYvdHR5YSkuIiwKKyAgICByb21idWdfb3BzLnRvX29wZW4gPSAgIHJvbWJ1Z19vcGVuOworICByb21idWdfb3BzLnRvX2Nsb3NlID0gICByb21idWdfY2xvc2U7CisgIHJvbWJ1Z19vcHMudG9fYXR0YWNoID0gICAwOworICByb21idWdfb3BzLnRvX3Bvc3RfYXR0YWNoID0gTlVMTDsKKyAgcm9tYnVnX29wcy50b19yZXF1aXJlX2F0dGFjaCA9IE5VTEw7CisgIHJvbWJ1Z19vcHMudG9fZGV0YWNoID0gICByb21idWdfZGV0YWNoOworICByb21idWdfb3BzLnRvX3JlcXVpcmVfZGV0YWNoID0gTlVMTDsKKyAgcm9tYnVnX29wcy50b19yZXN1bWUgPSAgIHJvbWJ1Z19yZXN1bWU7CisgIHJvbWJ1Z19vcHMudG9fd2FpdCAgPSAgIHJvbWJ1Z193YWl0OworICByb21idWdfb3BzLnRvX3Bvc3Rfd2FpdCA9IE5VTEw7CisgIHJvbWJ1Z19vcHMudG9fZmV0Y2hfcmVnaXN0ZXJzICA9ICAgcm9tYnVnX2ZldGNoX3JlZ2lzdGVyOworICByb21idWdfb3BzLnRvX3N0b3JlX3JlZ2lzdGVycyAgPSAgIHJvbWJ1Z19zdG9yZV9yZWdpc3RlcjsKKyAgcm9tYnVnX29wcy50b19wcmVwYXJlX3RvX3N0b3JlID0gICByb21idWdfcHJlcGFyZV90b19zdG9yZTsKKyAgcm9tYnVnX29wcy50b194ZmVyX21lbW9yeSAgPSAgIHJvbWJ1Z194ZmVyX2luZmVyaW9yX21lbW9yeTsKKyAgcm9tYnVnX29wcy50b19maWxlc19pbmZvICA9ICAgcm9tYnVnX2ZpbGVzX2luZm87CisgIHJvbWJ1Z19vcHMudG9faW5zZXJ0X2JyZWFrcG9pbnQgPSAgIHJvbWJ1Z19pbnNlcnRfYnJlYWtwb2ludDsKKyAgcm9tYnVnX29wcy50b19yZW1vdmVfYnJlYWtwb2ludCA9ICAgcm9tYnVnX3JlbW92ZV9icmVha3BvaW50OwkvKiBCcmVha3BvaW50cyAqLworICByb21idWdfb3BzLnRvX3Rlcm1pbmFsX2luaXQgID0gICAwOworICByb21idWdfb3BzLnRvX3Rlcm1pbmFsX2luZmVyaW9yID0gICAwOworICByb21idWdfb3BzLnRvX3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCA9ICAgMDsKKyAgcm9tYnVnX29wcy50b190ZXJtaW5hbF9vdXJzICA9ICAgMDsKKyAgcm9tYnVnX29wcy50b190ZXJtaW5hbF9pbmZvICA9ICAgMDsJCQkJLyogVGVybWluYWwgaGFuZGxpbmcgKi8KKyAgcm9tYnVnX29wcy50b19raWxsICA9ICAgcm9tYnVnX2tpbGw7CisgIHJvbWJ1Z19vcHMudG9fbG9hZCAgPSAgIHJvbWJ1Z19sb2FkOwkJCS8qIGxvYWQgKi8KKyAgcm9tYnVnX29wcy50b19sb29rdXBfc3ltYm9sID0gICByb21idWdfbGluazsJCQkJLyogbG9va3VwX3N5bWJvbCAqLworICByb21idWdfb3BzLnRvX2NyZWF0ZV9pbmZlcmlvciA9ICAgcm9tYnVnX2NyZWF0ZV9pbmZlcmlvcjsKKyAgcm9tYnVnX29wcy50b19wb3N0X3N0YXJ0dXBfaW5mZXJpb3IgPSBOVUxMOworICByb21idWdfb3BzLnRvX2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IgPSBOVUxMOworICByb21idWdfb3BzLnRvX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IgPSBOVUxMOworICByb21idWdfb3BzLnRvX3Bvc3RfZm9sbG93X2luZmVyaW9yX2J5X2Nsb25lID0gTlVMTDsKKyAgcm9tYnVnX29wcy50b19pbnNlcnRfZm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgcm9tYnVnX29wcy50b19yZW1vdmVfZm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgcm9tYnVnX29wcy50b19pbnNlcnRfdmZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIHJvbWJ1Z19vcHMudG9fcmVtb3ZlX3Zmb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICByb21idWdfb3BzLnRvX2hhc19mb3JrZWQgPSBOVUxMOworICByb21idWdfb3BzLnRvX2hhc192Zm9ya2VkID0gTlVMTDsKKyAgcm9tYnVnX29wcy50b19jYW5fZm9sbG93X3Zmb3JrX3ByaW9yX3RvX2V4ZWMgPSBOVUxMOworICByb21idWdfb3BzLnRvX3Bvc3RfZm9sbG93X3Zmb3JrID0gTlVMTDsKKyAgcm9tYnVnX29wcy50b19pbnNlcnRfZXhlY19jYXRjaHBvaW50ID0gTlVMTDsKKyAgcm9tYnVnX29wcy50b19yZW1vdmVfZXhlY19jYXRjaHBvaW50ID0gTlVMTDsKKyAgcm9tYnVnX29wcy50b19oYXNfZXhlY2QgPSBOVUxMOworICByb21idWdfb3BzLnRvX3JlcG9ydGVkX2V4ZWNfZXZlbnRzX3Blcl9leGVjX2NhbGwgPSBOVUxMOworICByb21idWdfb3BzLnRvX2hhc19leGl0ZWQgPSBOVUxMOworICByb21idWdfb3BzLnRvX21vdXJuX2luZmVyaW9yID0gICByb21idWdfbW91cm5faW5mZXJpb3I7CisgIHJvbWJ1Z19vcHMudG9fY2FuX3J1biAgPSAgIDA7CQkJCS8qIGNhbl9ydW4gKi8KKyAgcm9tYnVnX29wcy50b19ub3RpY2Vfc2lnbmFscyA9ICAgMDsgCQkJCS8qIG5vdGljZV9zaWduYWxzICovCisgIHJvbWJ1Z19vcHMudG9fdGhyZWFkX2FsaXZlICA9ICAgMDsKKyAgcm9tYnVnX29wcy50b19zdG9wICA9ICAgMDsJCQkJLyogdG9fc3RvcCAqLworICByb21idWdfb3BzLnRvX3BpZF90b19leGVjX2ZpbGUgPSBOVUxMOworICByb21idWdfb3BzLnRvX2NvcmVfZmlsZV90b19zeW1fZmlsZSA9IE5VTEw7CisgIHJvbWJ1Z19vcHMudG9fc3RyYXR1bSA9ICAgcHJvY2Vzc19zdHJhdHVtOworICByb21idWdfb3BzLkRPTlRfVVNFID0gICAwOwkJCQkvKiBuZXh0ICovCisgIHJvbWJ1Z19vcHMudG9faGFzX2FsbF9tZW1vcnkgPSAgIDE7CisgIHJvbWJ1Z19vcHMudG9faGFzX21lbW9yeSA9ICAgMTsKKyAgcm9tYnVnX29wcy50b19oYXNfc3RhY2sgPSAgIDE7CisgIHJvbWJ1Z19vcHMudG9faGFzX3JlZ2lzdGVycyA9ICAgMTsKKyAgcm9tYnVnX29wcy50b19oYXNfZXhlY3V0aW9uID0gICAxOwkJCQkvKiBoYXMgZXhlY3V0aW9uICovCisgIHJvbWJ1Z19vcHMudG9fc2VjdGlvbnMgPSAgIDA7CisgIHJvbWJ1Z19vcHMudG9fc2VjdGlvbnNfZW5kID0gICAwOwkJCQkvKiBTZWN0aW9uIHBvaW50ZXJzICovCisgIHJvbWJ1Z19vcHMudG9fbWFnaWMgPSAgIE9QU19NQUdJQzsJCQkvKiBBbHdheXMgdGhlIGxhc3QgdGhpbmcgKi8KK30gCisKK3ZvaWQKK19pbml0aWFsaXplX3JlbW90ZV9vczlrICgpCit7CisgIGluaXRfcm9tYnVnX29wcygpIDsKKyAgYWRkX3RhcmdldCAoJnJvbWJ1Z19vcHMpOworCisgIGFkZF9zaG93X2Zyb21fc2V0ICgKKyAgICAgICAgYWRkX3NldF9jbWQgKCJoYXNoIiwgbm9fY2xhc3MsIHZhcl9ib29sZWFuLCAoY2hhciAqKSZoYXNobWFyaywKKwkJIlNldCBkaXNwbGF5IG9mIGFjdGl2aXR5IHdoaWxlIGRvd25sb2FkaW5nIGEgZmlsZS5cbldoZW4gZW5hYmxlZCwgYSBwZXJpb2QgXCcuXCcgaXMgZGlzcGxheWVkLiIsCisgICAgICAgICAgICAgICAgJnNldGxpc3QpLAorCSZzaG93bGlzdCk7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQgKAorICAgICAgICBhZGRfc2V0X2NtZCAoInRpbWVvdXQiLCBub19jbGFzcywgdmFyX3ppbnRlZ2VyLAorICAgICAgICAgICAgICAgICAoY2hhciAqKSAmdGltZW91dCwKKyAgICAgICAgICAgICAgICAgIlNldCB0aW1lb3V0IGluIHNlY29uZHMgZm9yIHJlbW90ZSBNSVBTIHNlcmlhbCBJL08uIiwKKyAgICAgICAgICAgICAgICAgJnNldGxpc3QpLAorICAgICAgICAmc2hvd2xpc3QpOworCisgIGFkZF9zaG93X2Zyb21fc2V0ICgKKyAgICAgICAgYWRkX3NldF9jbWQgKCJyZW1vdGVsb2ciLCBub19jbGFzcywgdmFyX3ppbnRlZ2VyLAorICAgICAgICAgICAgICAgICAoY2hhciAqKSAmbW9uaXRvcl9sb2csCisgICAgICAgICAgICAgICAgICJTZXQgbW9uaXRvciBhY3Rpdml0eSBsb2cgb24oPTEpIG9yIG9mZig9MCkuIiwKKyAgICAgICAgICAgICAgICAgJnNldGxpc3QpLAorICAgICAgICAmc2hvd2xpc3QpOworCisgIGFkZF9zaG93X2Zyb21fc2V0ICgKKyAgICAgICAgYWRkX3NldF9jbWQgKCJyZW1vdGV4b24iLCBub19jbGFzcywgdmFyX3ppbnRlZ2VyLAorICAgICAgICAgICAgICAgICAoY2hhciAqKSAmdHR5X3hvbiwKKyAgICAgICAgICAgICAgICAgIlNldCByZW1vdGUgdHR5IGxpbmUgWE9OIGNvbnRyb2wiLAorICAgICAgICAgICAgICAgICAmc2V0bGlzdCksCisgICAgICAgICZzaG93bGlzdCk7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQgKAorICAgICAgICBhZGRfc2V0X2NtZCAoInJlbW90ZXhvZmYiLCBub19jbGFzcywgdmFyX3ppbnRlZ2VyLAorICAgICAgICAgICAgICAgICAoY2hhciAqKSAmdHR5X3hvZmYsCisgICAgICAgICAgICAgICAgICJTZXQgcmVtb3RlIHR0eSBsaW5lIFhPRkYgY29udHJvbCIsCisgICAgICAgICAgICAgICAgICZzZXRsaXN0KSwKKyAgICAgICAgJnNob3dsaXN0KTsKKworICBhZGRfY29tICgicm9tYnVnIDxjb21tYW5kPiIsIGNsYXNzX29ic2N1cmUsIHJvbWJ1Z19jb21tYW5kLAorCSAgICJTZW5kIGEgY29tbWFuZCB0byB0aGUgZGVidWcgbW9uaXRvci4iKTsgCisjaWYgMAorICBhZGRfY29tICgiY29ubmVjdCIsIGNsYXNzX29ic2N1cmUsIGNvbm5lY3RfY29tbWFuZCwKKyAgIAkgICAiQ29ubmVjdCB0aGUgdGVybWluYWwgZGlyZWN0bHkgdXAgdG8gYSBzZXJpYWwgYmFzZWQgY29tbWFuZCBtb25pdG9yLlxuVXNlIDxDUj5+LiBvciA8Q1I+fl5EIHRvIGJyZWFrIG91dC4iKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS1yZGkuYyBiL2dkYi9yZW1vdGUtcmRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhOTIwZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZW1vdGUtcmRpLmMKQEAgLTAsMCArMSw5NzMgQEAKKy8qIEdEQiBpbnRlcmZhY2UgdG8gQVJNIFJESSBsaWJyYXJ5LgorICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgIndhaXQuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJvYmpmaWxlcy5oIgorI2luY2x1ZGUgImdkYi1zdGFicy5oIgorI2luY2x1ZGUgImdkYnRocmVhZC5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKworI2lmZGVmIFVTRworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgInJkaS1zaGFyZS9hcmRpLmgiCisjaW5jbHVkZSAicmRpLXNoYXJlL2FkcC5oIgorI2luY2x1ZGUgInJkaS1zaGFyZS9oc3lzLmgiCisKK2V4dGVybiBpbnQgaXNhc2NpaSBQQVJBTVMgKChpbnQpKTsKKworLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zICovCisKK3N0YXRpYyB2b2lkIGFybV9yZGlfZmlsZXNfaW5mbyBQQVJBTVMgKChzdHJ1Y3QgdGFyZ2V0X29wcyAqaWdub3JlKSk7CisKK3N0YXRpYyBpbnQgYXJtX3JkaV94ZmVyX21lbW9yeSBQQVJBTVMgKChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLAorCQkJCSAgICAgICBpbnQgbGVuLCBpbnQgc2hvdWxkX3dyaXRlLAorCQkJCSAgICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0KSk7CisKK3N0YXRpYyB2b2lkIGFybV9yZGlfcHJlcGFyZV90b19zdG9yZSBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIGFybV9yZGlfZmV0Y2hfcmVnaXN0ZXJzIFBBUkFNUyAoKGludCByZWdubykpOworCitzdGF0aWMgdm9pZCBhcm1fcmRpX3Jlc3VtZSBQQVJBTVMgKChpbnQgcGlkLCBpbnQgc3RlcCwKKwkJCQkgICBlbnVtIHRhcmdldF9zaWduYWwgc2lnZ25hbCkpOworCitzdGF0aWMgaW50IGFybV9yZGlfc3RhcnRfcmVtb3RlIFBBUkFNUyAoKGNoYXIgKmR1bW15KSk7CisKK3N0YXRpYyB2b2lkIGFybV9yZGlfb3BlbiBQQVJBTVMgKChjaGFyICpuYW1lLCBpbnQgZnJvbV90dHkpKTsKKworc3RhdGljIHZvaWQgYXJtX3JkaV9jcmVhdGVfaW5mZXJpb3IgUEFSQU1TICgoY2hhciAqZXhlY19maWxlLCBjaGFyICphcmdzLAorCQkJCQkgICAgIGNoYXIgKiplbnYpKTsKKworc3RhdGljIHZvaWQgYXJtX3JkaV9jbG9zZSBQQVJBTVMgKChpbnQgcXVpdHRpbmcpKTsKKworc3RhdGljIHZvaWQgYXJtX3JkaV9zdG9yZV9yZWdpc3RlcnMgUEFSQU1TICgoaW50IHJlZ25vKSk7CisKK3N0YXRpYyB2b2lkIGFybV9yZGlfbW91cm4gUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZCBhcm1fcmRpX3NlbmQgUEFSQU1TICgoY2hhciAqYnVmKSk7CisKK3N0YXRpYyBpbnQgYXJtX3JkaV93YWl0IFBBUkFNUyAoKGludCBwaWQsIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqc3RhdHVzKSk7CisKK3N0YXRpYyB2b2lkIGFybV9yZGlfa2lsbCBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIGFybV9yZGlfZGV0YWNoIFBBUkFNUyAoKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkpOworCitzdGF0aWMgdm9pZCBhcm1fcmRpX2ludGVycnVwdCBQQVJBTVMgKChpbnQgc2lnbm8pKTsKKworc3RhdGljIHZvaWQgYXJtX3JkaV9pbnRlcnJ1cHRfdHdpY2UgUEFSQU1TICgoaW50IHNpZ25vKSk7CisKK3N0YXRpYyB2b2lkIGludGVycnVwdF9xdWVyeSBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyBpbnQgYXJtX3JkaV9pbnNlcnRfYnJlYWtwb2ludCBQQVJBTVMgKChDT1JFX0FERFIsIGNoYXIgKikpOworCitzdGF0aWMgaW50IGFybV9yZGlfcmVtb3ZlX2JyZWFrcG9pbnQgUEFSQU1TICgoQ09SRV9BRERSLCBjaGFyICopKTsKKworc3RhdGljIGNoYXIgKnJkaV9lcnJvcl9tZXNzYWdlIFBBUkFNUyAoKGludCBlcnIpKTsKKworc3RhdGljIGVudW0gdGFyZ2V0X3NpZ25hbCByZGlfZXJyb3Jfc2lnbmFsIFBBUkFNUyAoKGludCBlcnIpKTsKKworLyogR2xvYmFsIHZhcmlhYmxlcy4gICovCisKK3N0cnVjdCB0YXJnZXRfb3BzIGFybV9yZGlfb3BzOworCitzdGF0aWMgc3RydWN0IERiZ19Db25maWdCbG9jayBnZGJfY29uZmlnOworCitzdGF0aWMgc3RydWN0IERiZ19Ib3N0b3NJbnRlcmZhY2UgZ2RiX2hvc3RpZjsKKworc3RhdGljIGludCBtYXhfbG9hZF9zaXplOworCitzdGF0aWMgaW50IGV4ZWN1dGVfc3RhdHVzOworCisvKiBBIGxpdHRsZSBsaXN0IG9mIGJyZWFrcG9pbnRzIHRoYXQgaGF2ZSBiZWVuIHNldC4gICovCisKK3N0YXRpYyBzdHJ1Y3QgbG9jYWxfYnBfbGlzdF9lbnRyeSB7CisgIENPUkVfQUREUiBhZGRyOworICBQb2ludEhhbmRsZSBwb2ludDsKKyAgc3RydWN0IGxvY2FsX2JwX2xpc3RfZW50cnkgKm5leHQ7Cit9ICpsb2NhbF9icF9saXN0OworCisMCisvKiBTdHViIGZvciBjYXRjaF9lcnJvcnMuICAqLworCitzdGF0aWMgaW50Cithcm1fcmRpX3N0YXJ0X3JlbW90ZSAoZHVtbXkpCisgICAgIGNoYXIgKmR1bW15OworeworICByZXR1cm4gMTsKK30KKworLyogSGVscGVyIGNhbGxiYWNrcyBmb3IgdGhlICJob3N0IGludGVyZmFjZSIgc3RydWN0dXJlLiAgUkRJIGZ1bmN0aW9ucyBjYWxsCisgICB0aGVzZSB0byBmb3J3YXJkIG91dHB1dCBmcm9tIHRoZSB0YXJnZXQgc3lzdGVtIGFuZCBzbyBmb3J0aC4gICovCisKK3ZvaWQKK3ZvaWRkdW1teSAoKQoreworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRvdXQsICJ2b2lkIGR1bW15XG4iKTsKK30KKworc3RhdGljIHZvaWQKK215cHJpbnQgKGFyZywgZm9ybWF0LCBhcCkKKyAgICAgUFRSIGFyZzsKKyAgICAgY29uc3QgY2hhciAqZm9ybWF0OworICAgICB2YV9saXN0IGFwOworeworICB2ZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3Rkb3V0LCBmb3JtYXQsIGFwKTsKK30KKworc3RhdGljIHZvaWQKK215d3JpdGVjIChhcmcsIGMpCisgICAgIFBUUiBhcmc7CisgICAgIGludCBjOworeworICBpZiAoaXNhc2NpaSAoYykpCisgICAgZnB1dGNfdW5maWx0ZXJlZCAoYywgZ2RiX3N0ZG91dCk7Cit9CisKK3N0YXRpYyBpbnQKK215d3JpdGUgKGFyZywgYnVmZmVyLCBsZW4pCisgICAgIFBUUiBhcmc7CisgICAgIGNoYXIgY29uc3QgKmJ1ZmZlcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaW50IGk7CisgIGNoYXIgKmU7CisKKyAgZSA9IChjaGFyICopIGJ1ZmZlcjsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQoreworICAgICAgaWYgKGlzYXNjaWkgKChpbnQpICplKSkKKyAgICAgICAgeworICAgICAgICAgIGZwdXRjX3VuZmlsdGVyZWQgKChpbnQpICplLCBnZGJfc3Rkb3V0KTsKKyAgICAgICAgICBlKys7CisgICAgICAgIH0KK30KKworICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgdm9pZAorbXlwYXVzZSAoYXJnKQorICAgICBQVFIgYXJnOworeworfQorCisvKiBUaGVzZSBsYXN0IHR3byBhcmUgdHJpY2t5IGFzIHdlIGhhdmUgdG8gaGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugb2YKKyAgIGJlaW5nIGludGVycnVwdGVkIG1vcmUgY2FyZWZ1bGx5ICovCisKK3N0YXRpYyBpbnQKK215cmVhZGMgKGFyZykKKyAgICAgUFRSIGFyZzsKK3sgCisgIHJldHVybiBmZ2V0YyAoc3RkaW4pOworfQorCitzdGF0aWMgY2hhciAqCitteWdldHMgKGFyZywgYnVmZmVyLCBsZW4pCisgICAgIFBUUiBhcmc7CisgICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgcmV0dXJuIGZnZXRzKGJ1ZmZlciwgbGVuLCBzdGRpbik7Cit9CisKKy8qIFByZXZlbnQgbXVsdGlwbGUgY2FsbHMgdG8gYW5nZWxfUkRJX2Nsb3NlKCkuICAqLworc3RhdGljIGludCBjbG9zZWRfYWxyZWFkeSA9IDE7CisKKy8qIE9wZW4gYSBjb25uZWN0aW9uIHRvIGEgcmVtb3RlIGRlYnVnZ2VyLiAgTkFNRSBpcyB0aGUgZmlsZW5hbWUgdXNlZAorICAgZm9yIGNvbW11bmljYXRpb24uICAqLworCitzdGF0aWMgdm9pZAorYXJtX3JkaV9vcGVuIChuYW1lLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpbnQgcnNsdCwgaTsKKyAgdW5zaWduZWQgbG9uZyBhcmcxLCBhcmcyOworCisgIGlmIChuYW1lID09IE5VTEwpCisgICAgZXJyb3IgKCJUbyBvcGVuIGFuIFJESSBjb25uZWN0aW9uLCB5b3UgbmVlZCB0byBzcGVjaWZ5IHdoYXQgc2VyaWFsXG5cCitkZXZpY2UgaXMgYXR0YWNoZWQgdG8gdGhlIHJlbW90ZSBzeXN0ZW0gKGUuZy4gL2Rldi90dHlhKS4iKTsKKworICAvKiBNYWtlIHRoZSBiYXNpYyBsb3ctbGV2ZWwgY29ubmVjdGlvbi4gICovCisKKyAgcnNsdCA9IEFkcF9PcGVuRGV2aWNlIChuYW1lLCBOVUxMLCAxKTsKKworICBpZiAocnNsdCAhPSBhZHBfb2spCisgICAgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiBkZXZpY2UgXCIlc1wiIiwgbmFtZSk7CisKKyAgZ2RiX2NvbmZpZy5ieXRlc2V4ID0gMiB8IChUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOID8gMSA6IDApOworICBnZGJfY29uZmlnLmZwZSA9IDE7CisgIGdkYl9jb25maWcucmRpdHlwZSA9IDI7CisgIGdkYl9jb25maWcuaGVhcnRiZWF0X29uID0gMTsKKyAgZ2RiX2NvbmZpZy5mbGFncyA9IDI7CisKKyAgZ2RiX2hvc3RpZi5kYmdwcmludCA9IG15cHJpbnQ7CisgIGdkYl9ob3N0aWYuZGJncGF1c2UgPSBteXBhdXNlOworICBnZGJfaG9zdGlmLmRiZ2FyZyA9IE5VTEw7CisgIGdkYl9ob3N0aWYud3JpdGVjID0gbXl3cml0ZWM7CisgIGdkYl9ob3N0aWYucmVhZGMgPSBteXJlYWRjOworICBnZGJfaG9zdGlmLndyaXRlID0gbXl3cml0ZTsKKyAgZ2RiX2hvc3RpZi5nZXRzID0gbXlnZXRzOworICBnZGJfaG9zdGlmLmhvc3Rvc2FyZyA9IE5VTEw7CisgIGdkYl9ob3N0aWYucmVzZXQgPSB2b2lkZHVtbXk7CisKKyAgcnNsdCA9IGFuZ2VsX1JESV9vcGVuICgxMCwgJmdkYl9jb25maWcsICZnZGJfaG9zdGlmLCBOVUxMKTsKKyAgaWYgKHJzbHQgPT0gUkRJRXJyb3JfQmlnRW5kaWFuIHx8IHJzbHQgPT0gUkRJRXJyb3JfTGl0dGxlRW5kaWFuKQorICAgIDsgIC8qIGRvIG5vdGhpbmcsIHRoaXMgaXMgdGhlIGV4cGVjdGVkIHJldHVybiAqLworICBlbHNlIGlmIChyc2x0KQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlJESV9vcGVuOiAlc1xuIiwgcmRpX2Vycm9yX21lc3NhZ2UgKHJzbHQpKTsKKyAgICB9CisKKyAgcnNsdCA9IGFuZ2VsX1JESV9pbmZvIChSRElJbmZvX1RhcmdldCwgJmFyZzEsICZhcmcyKTsKKyAgaWYgKHJzbHQpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiUkRJX2luZm86ICVzXG4iLCByZGlfZXJyb3JfbWVzc2FnZSAocnNsdCkpOworICAgIH0KKyAgcnNsdCA9IGFuZ2VsX1JESV9pbmZvIChSRElJbmZvX1BvaW50cywgJmFyZzEsICZhcmcyKTsKKyAgaWYgKHJzbHQpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiUkRJX2luZm86ICVzXG4iLCByZGlfZXJyb3JfbWVzc2FnZSAocnNsdCkpOworICAgIH0KKyAgcnNsdCA9IGFuZ2VsX1JESV9pbmZvIChSRElJbmZvX1N0ZXAsICZhcmcxLCAmYXJnMik7CisgIGlmIChyc2x0KQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlJESV9pbmZvOiAlc1xuIiwgcmRpX2Vycm9yX21lc3NhZ2UgKHJzbHQpKTsKKyAgICB9CisgIHJzbHQgPSBhbmdlbF9SRElfaW5mbyAoUkRJSW5mb19Db1BybywgJmFyZzEsICZhcmcyKTsKKyAgaWYgKHJzbHQpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiUkRJX2luZm86ICVzXG4iLCByZGlfZXJyb3JfbWVzc2FnZSAocnNsdCkpOworICAgIH0KKyAgcnNsdCA9IGFuZ2VsX1JESV9pbmZvIChSRElJbmZvX1NlbWlIb3N0aW5nLCAmYXJnMSwgJmFyZzIpOworICBpZiAocnNsdCkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJSRElfaW5mbzogJXNcbiIsIHJkaV9lcnJvcl9tZXNzYWdlIChyc2x0KSk7CisgICAgfQorCisgIHJzbHQgPSBhbmdlbF9SRElfaW5mbyAoUkRJSW5mb19HZXRMb2FkU2l6ZSwgJmFyZzEsICZhcmcyKTsKKyAgaWYgKHJzbHQpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiUkRJX2luZm86ICVzXG4iLCByZGlfZXJyb3JfbWVzc2FnZSAocnNsdCkpOworICAgIH0KKyAgbWF4X2xvYWRfc2l6ZSA9IGFyZzE7CisKKyAgcHVzaF90YXJnZXQgKCZhcm1fcmRpX29wcyk7CisKKyAgdGFyZ2V0X2ZldGNoX3JlZ2lzdGVycyAoLTEpOworCisgIHJzbHQgPSBhbmdlbF9SRElfb3BlbiAoMSwgJmdkYl9jb25maWcsIE5VTEwsIE5VTEwpOworICBpZiAocnNsdCkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJSRElfb3BlbjogJXNcbiIsIHJkaV9lcnJvcl9tZXNzYWdlIChyc2x0KSk7CisgICAgfQorCisgIGFyZzEgPSAweDEzYjsKKyAgcnNsdCA9IGFuZ2VsX1JESV9pbmZvIChSRElWZWN0b3JfQ2F0Y2gsICZhcmcxLCAmYXJnMik7CisgIGlmIChyc2x0KQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlJESV9pbmZvOiAlc1xuIiwgcmRpX2Vycm9yX21lc3NhZ2UgKHJzbHQpKTsKKyAgICB9CisKKyAgYXJnMSA9ICh1bnNpZ25lZCBsb25nKSAiIjsKKyAgcnNsdCA9IGFuZ2VsX1JESV9pbmZvIChSRElTZXRfQ21kbGluZSwgJmFyZzEsICZhcmcyKTsKKyAgaWYgKHJzbHQpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiUkRJX2luZm86ICVzXG4iLCByZGlfZXJyb3JfbWVzc2FnZSAocnNsdCkpOworICAgIH0KKworICAvKiBDbGVhciBvdXQgYW55IGV4aXN0aW5nIHJlY29yZHMgb2YgYnJlYWtwb2ludHMuICAqLworICB7CisgICAgc3RydWN0IGxvY2FsX2JwX2xpc3RfZW50cnkgKmVudHJ5LCAqcHJldmVudHJ5ID0gTlVMTDsKKworICAgIGZvciAoZW50cnkgPSBsb2NhbF9icF9saXN0OyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQorICAgICAgeworCWlmIChwcmV2ZW50cnkpCisJICBmcmVlIChwcmV2ZW50cnkpOworICAgICAgfQorICB9CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiQ29ubmVjdGVkIHRvIEFSTSBSREkgdGFyZ2V0LlxuIik7CisgIGNsb3NlZF9hbHJlYWR5ID0gMDsKKyAgaW5mZXJpb3JfcGlkID0gNDI7Cit9CisKKy8qIFN0YXJ0IGFuIGluZmVyaW9yIHByb2Nlc3MgYW5kIHNldCBpbmZlcmlvcl9waWQgdG8gaXRzIHBpZC4KKyAgIEVYRUNfRklMRSBpcyB0aGUgZmlsZSB0byBydW4uCisgICBBUkdTIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cyB0byB0aGUgcHJvZ3JhbS4KKyAgIEVOViBpcyB0aGUgZW52aXJvbm1lbnQgdmVjdG9yIHRvIHBhc3MuICBFcnJvcnMgcmVwb3J0ZWQgd2l0aCBlcnJvcigpLgorICAgT24gVnhXb3JrcyBhbmQgdmFyaW91cyBzdGFuZGFsb25lIHN5c3RlbXMsIHdlIGlnbm9yZSBleGVjX2ZpbGUuICAqLworLyogVGhpcyBpcyBjYWxsZWQgbm90IG9ubHkgd2hlbiB3ZSBmaXJzdCBhdHRhY2gsIGJ1dCBhbHNvIHdoZW4gdGhlCisgICB1c2VyIHR5cGVzICJydW4iIGFmdGVyIGhhdmluZyBhdHRhY2hlZC4gICovCisKK3N0YXRpYyB2b2lkCithcm1fcmRpX2NyZWF0ZV9pbmZlcmlvciAoZXhlY19maWxlLCBhcmdzLCBlbnYpCisgICAgIGNoYXIgKmV4ZWNfZmlsZTsKKyAgICAgY2hhciAqYXJnczsKKyAgICAgY2hhciAqKmVudjsKK3sKKyAgaW50IGxlbiwgcnNsdDsKKyAgdW5zaWduZWQgbG9uZyBhcmcxLCBhcmcyOworICBjaGFyICphcmdfYnVmOworICBDT1JFX0FERFIgZW50cnlfcG9pbnQ7CisKKyAgaWYgKGV4ZWNfZmlsZSA9PSAwIHx8IGV4ZWNfYmZkID09IDApCisgICBlcnJvciAoIk5vIGV4ZWN1dGFibGUgZmlsZSBzcGVjaWZpZWQuIik7CisKKyAgZW50cnlfcG9pbnQgPSAoQ09SRV9BRERSKSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGV4ZWNfYmZkKTsKKworICBhcm1fcmRpX2tpbGwgKCk7CSAKKyAgcmVtb3ZlX2JyZWFrcG9pbnRzICgpOworICBpbml0X3dhaXRfZm9yX2luZmVyaW9yICgpOworCisgIGxlbiA9IHN0cmxlbiAoZXhlY19maWxlKSArIDEgKyBzdHJsZW4gKGFyZ3MpICsgMSArIC8qc2xvcCovIDEwOworICBhcmdfYnVmID0gKGNoYXIgKikgYWxsb2NhIChsZW4pOworICBhcmdfYnVmWzBdID0gJ1wwJzsKKyAgc3RyY2F0IChhcmdfYnVmLCBleGVjX2ZpbGUpOworICBzdHJjYXQgKGFyZ19idWYsICIgIik7CisgIHN0cmNhdCAoYXJnX2J1ZiwgYXJncyk7CisKKyAgaW5mZXJpb3JfcGlkID0gNDI7CisgIGluc2VydF9icmVha3BvaW50cyAoKTsgIC8qIE5lZWRlZCB0byBnZXQgY29ycmVjdCBpbnN0cnVjdGlvbiBpbiBjYWNoZSAqLworCisgIGlmIChlbnYgIT0gTlVMTCkKKyAgICB7CisgICAgICB3aGlsZSAoKmVudikKKwl7CisJICBpZiAoc3RybmNtcCAoKmVudiwgIk1FTVNJWkU9Iiwgc2l6ZW9mICgiTUVNU0laRT0iKSAtIDEpID09IDApCisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBsb25nIHRvcF9vZl9tZW1vcnk7CisJICAgICAgY2hhciAqZW5kX29mX251bTsKKworCSAgICAgIC8qIFNldCB1cCBtZW1vcnkgbGltaXQgKi8KKwkgICAgICB0b3Bfb2ZfbWVtb3J5ID0gc3RydG91bCAoKmVudiArIHNpemVvZiAoIk1FTVNJWkU9IikgLSAxLAorCQkJCSAgICAgICAmZW5kX29mX251bSwgMCk7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiU2V0dGluZyB0b3Atb2YtbWVtb3J5IHRvIDB4JXhcbiIsCisJCQkgICAgICAgdG9wX29mX21lbW9yeSk7CisJICAKKwkgICAgICByc2x0ID0gYW5nZWxfUkRJX2luZm8gKFJESUluZm9fU2V0VG9wTWVtLCAmdG9wX29mX21lbW9yeSwgJmFyZzIpOworCSAgICAgIGlmIChyc2x0KQorCQl7CisJCSAgcHJpbnRmX2ZpbHRlcmVkICgiUkRJX2luZm86ICVzXG4iLCByZGlfZXJyb3JfbWVzc2FnZSAocnNsdCkpOworCQl9CisJICAgIH0KKwkgIGVudisrOworCX0KKyAgICB9CisKKyAgYXJnMSA9ICh1bnNpZ25lZCBsb25nKSBhcmdfYnVmOworICByc2x0ID0gYW5nZWxfUkRJX2luZm8gKFJESVNldF9DbWRsaW5lLCAvKiAmYXJnMSAqLyAodW5zaWduZWQgbG9uZyAqKWFyZ19idWYsICZhcmcyKTsKKyAgaWYgKHJzbHQpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiUkRJX2luZm86ICVzXG4iLCByZGlfZXJyb3JfbWVzc2FnZSAocnNsdCkpOworICAgIH0KKworICBwcm9jZWVkIChlbnRyeV9wb2ludCwgVEFSR0VUX1NJR05BTF9ERUZBVUxULCAwKTsKK30KKworLyogVGhpcyB0YWtlcyBhIHByb2dyYW0gcHJldmlvdXNseSBhdHRhY2hlZCB0byBhbmQgZGV0YWNoZXMgaXQuICBBZnRlcgorICAgdGhpcyBpcyBkb25lLCBHREIgY2FuIGJlIHVzZWQgdG8gZGVidWcgc29tZSBvdGhlciBwcm9ncmFtLiAgV2UKKyAgIGJldHRlciBub3QgaGF2ZSBsZWZ0IGFueSBicmVha3BvaW50cyBpbiB0aGUgdGFyZ2V0IHByb2dyYW0gb3IgaXQnbGwKKyAgIGRpZSB3aGVuIGl0IGhpdHMgb25lLiAgKi8KKworc3RhdGljIHZvaWQKK2FybV9yZGlfZGV0YWNoIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBwb3BfdGFyZ2V0ICgpOworfQorCisvKiBDbGVhbiB1cCBjb25uZWN0aW9uIHRvIGEgcmVtb3RlIGRlYnVnZ2VyLiAgKi8KKworc3RhdGljIHZvaWQKK2FybV9yZGlfY2xvc2UgKHF1aXR0aW5nKQorICAgICBpbnQgcXVpdHRpbmc7Cit7CisgIGludCByc2x0OworCisgIGlmICghIGNsb3NlZF9hbHJlYWR5KQorICAgIHsKKyAgICAgIHJzbHQgPSBhbmdlbF9SRElfY2xvc2UgKCk7CisgICAgICBpZiAocnNsdCkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCJSRElfY2xvc2U6ICVzXG4iLCByZGlfZXJyb3JfbWVzc2FnZSAocnNsdCkpOworCX0KKyAgICAgIGNsb3NlZF9hbHJlYWR5ID0gMTsKKyAgICAgIGluZmVyaW9yX3BpZCA9IDA7CisgICAgfQorfQorDAorLyogVGVsbCB0aGUgcmVtb3RlIG1hY2hpbmUgdG8gcmVzdW1lLiAgKi8KKworc3RhdGljIHZvaWQKK2FybV9yZGlfcmVzdW1lIChwaWQsIHN0ZXAsIHNpZ2duYWwpCisgICAgIGludCBwaWQsIHN0ZXA7CisgICAgIGVudW0gdGFyZ2V0X3NpZ25hbCBzaWdnbmFsOworeworICBpbnQgcnNsdDsKKyAgUG9pbnRIYW5kbGUgcG9pbnQ7CisKKyAgaWYgKDAgLyogdHVybiBvbiB3aGVuIGhhcmR3YXJlIHN1cHBvcnRzIHNpbmdsZS1zdGVwcGluZyAqLykKKyAgICB7CisgICAgICByc2x0ID0gYW5nZWxfUkRJX3N0ZXAgKDEsICZwb2ludCk7CisgICAgICBpZiAocnNsdCkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCJSRElfc3RlcDogJXNcbiIsIHJkaV9lcnJvcl9tZXNzYWdlIChyc2x0KSk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgaGFuZGxlWzRdOworICAgICAgQ09SRV9BRERSIHBjOworCisgICAgICBpZiAoc3RlcCkKKwl7CisJICBwYyA9IHJlYWRfcmVnaXN0ZXIgKFBDX1JFR05VTSk7CisJICBwYyA9IGFybV9nZXRfbmV4dF9wYyAocGMpOworCSAgYXJtX3JkaV9pbnNlcnRfYnJlYWtwb2ludCAocGMsIGhhbmRsZSk7CisJfQorICAgICAgZXhlY3V0ZV9zdGF0dXMgPSByc2x0ID0gYW5nZWxfUkRJX2V4ZWN1dGUgKCZwb2ludCk7CisgICAgICBpZiAocnNsdCA9PSBSRElFcnJvcl9CcmVha3BvaW50UmVhY2hlZCkKKwk7CisgICAgICBlbHNlIGlmIChyc2x0KQorCXsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlJESV9leGVjdXRlOiAlc1xuIiwgcmRpX2Vycm9yX21lc3NhZ2UgKHJzbHQpKTsKKwl9CisgICAgICBpZiAoc3RlcCkKKwl7CisJICBhcm1fcmRpX3JlbW92ZV9icmVha3BvaW50IChwYywgaGFuZGxlKTsKKwl9CisgICAgfQorfQorDAorLyogU2VuZCBeQyB0byB0YXJnZXQgdG8gaGFsdCBpdC4gIFRhcmdldCB3aWxsIHJlc3BvbmQsIGFuZCBzZW5kIHVzIGEKKyAgIHBhY2tldC4gICovCisKK3N0YXRpYyB2b2lkCithcm1fcmRpX2ludGVycnVwdCAoc2lnbm8pCisgICAgIGludCBzaWdubzsKK3sKK30KKworc3RhdGljIHZvaWQgKCpvZnVuYykoKTsKKworLyogVGhlIHVzZXIgdHlwZWQgXkMgdHdpY2UuICAqLworc3RhdGljIHZvaWQKK2FybV9yZGlfaW50ZXJydXB0X3R3aWNlIChzaWdubykKKyAgICAgaW50IHNpZ25vOworeworfQorCisvKiBBc2sgdGhlIHVzZXIgd2hhdCB0byBkbyB3aGVuIGFuIGludGVycnVwdCBpcyByZWNlaXZlZC4gICovCisKK3N0YXRpYyB2b2lkCitpbnRlcnJ1cHRfcXVlcnkgKCkKK3sKK30KKworLyogV2FpdCB1bnRpbCB0aGUgcmVtb3RlIG1hY2hpbmUgc3RvcHMsIHRoZW4gcmV0dXJuLCBzdG9yaW5nIHN0YXR1cyBpbgorICAgU1RBVFVTIGp1c3QgYXMgYHdhaXQnIHdvdWxkLiAgUmV0dXJucyAicGlkIiAodGhvdWdoIGl0J3Mgbm90IGNsZWFyCisgICB3aGF0LCBpZiBhbnl0aGluZywgdGhhdCBtZWFucyBpbiB0aGUgY2FzZSBvZiB0aGlzIHRhcmdldCkuICAqLworCitzdGF0aWMgaW50Cithcm1fcmRpX3dhaXQgKHBpZCwgc3RhdHVzKQorICAgICBpbnQgcGlkOworICAgICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0YXR1czsKK3sKKyAgc3RhdHVzLT5raW5kID0gKGV4ZWN1dGVfc3RhdHVzID09IFJESUVycm9yX05vRXJyb3IgPworICAgIFRBUkdFVF9XQUlUS0lORF9FWElURUQgOiBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRCk7CisKKyAgLyogY29udmVydCBzdG9wcGVkIGNvZGUgZnJvbSB0YXJnZXQgaW50byByaWdodCBzaWduYWwgKi8KKyAgc3RhdHVzLT52YWx1ZS5zaWcgPSByZGlfZXJyb3Jfc2lnbmFsIChleGVjdXRlX3N0YXR1cyk7CisKKyAgcmV0dXJuIGluZmVyaW9yX3BpZDsKK30KKworLyogUmVhZCB0aGUgcmVtb3RlIHJlZ2lzdGVycyBpbnRvIHRoZSBibG9jayBSRUdTLiAgKi8KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCithcm1fcmRpX2ZldGNoX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgaW50IHJzbHQsIHJkaV9yZWdtYXNrOworICB1bnNpZ25lZCBsb25nIHJhd3JlZywgcmF3cmVnc1szMl07CisgIGNoYXIgY29va2VkcmVnWzRdOworCisgIGlmIChyZWdubyA9PSAtMSkgCisgICAgeworICAgICAgcnNsdCA9IGFuZ2VsX1JESV9DUFVyZWFkICgyNTUsIDB4MjdmZmYsIHJhd3JlZ3MpOworICAgICAgaWYgKHJzbHQpCisJeworCSAgcHJpbnRmX2ZpbHRlcmVkICgiUkRJX0NQVXJlYWQ6ICVzXG4iLCByZGlfZXJyb3JfbWVzc2FnZSAocnNsdCkpOworCX0KKworICAgICAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgMTU7IHJlZ25vKyspCisJeworCSAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoY29va2VkcmVnLCA0LCByYXdyZWdzW3JlZ25vXSk7CisJICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCAoY2hhciAqKSBjb29rZWRyZWcpOworCX0KKyAgICAgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKGNvb2tlZHJlZywgNCwgcmF3cmVnc1sxNV0pOworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChQU19SRUdOVU0sIChjaGFyICopIGNvb2tlZHJlZyk7CisgICAgICBhcm1fcmRpX2ZldGNoX3JlZ2lzdGVycyAoUENfUkVHTlVNKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAocmVnbm8gPT0gUENfUkVHTlVNKQorCXJkaV9yZWdtYXNrID0gUkRJUmVnX1BDOworICAgICAgZWxzZSBpZiAocmVnbm8gPT0gUFNfUkVHTlVNKQorCXJkaV9yZWdtYXNrID0gUkRJUmVnX0NQU1I7CisgICAgICBlbHNlIGlmIChyZWdubyA8IDAgfHwgcmVnbm8gPiAxNSkKKwl7CisJICByYXdyZWcgPSAwOworCSAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgKGNoYXIgKikgJnJhd3JlZyk7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZQorCXJkaV9yZWdtYXNrID0gMSA8PCByZWdubzsKKworICAgICAgcnNsdCA9IGFuZ2VsX1JESV9DUFVyZWFkICgyNTUsIHJkaV9yZWdtYXNrLCAmcmF3cmVnKTsKKyAgICAgIGlmIChyc2x0KQorCXsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlJESV9DUFVyZWFkOiAlc1xuIiwgcmRpX2Vycm9yX21lc3NhZ2UgKHJzbHQpKTsKKwl9CisgICAgICBzdG9yZV91bnNpZ25lZF9pbnRlZ2VyIChjb29rZWRyZWcsIDQsIHJhd3JlZyk7CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCAoY2hhciAqKSBjb29rZWRyZWcpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgCithcm1fcmRpX3ByZXBhcmVfdG9fc3RvcmUgKCkKK3sKKyAgLyogTm90aGluZyB0byBkby4gICovCit9CisKKy8qIFN0b3JlIHJlZ2lzdGVyIFJFR05PLCBvciBhbGwgcmVnaXN0ZXJzIGlmIFJFR05PID09IC0xLCBmcm9tIHRoZSBjb250ZW50cworICAgb2YgUkVHSVNURVJTLiAgRklYTUU6IGlnbm9yZXMgZXJyb3JzLiAgKi8KKworc3RhdGljIHZvaWQKK2FybV9yZGlfc3RvcmVfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBpbnQgcnNsdCwgcmRpX3JlZ21hc2s7CisKKyAgLyogVGhlc2UgbmVlZCB0byBiZSBhYmxlIHRvIHRha2UgJ2Zsb2F0aW5nIHBvaW50IHJlZ2lzdGVyJyBjb250ZW50cyAqLworICB1bnNpZ25lZCBsb25nIHJhd3JlZ1szXSwgcmF3ZXJyZWdbM107CisKKyAgaWYgKHJlZ25vICA9PSAtMSkgCisgICAgeworICAgICAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgTlVNX1JFR1M7IHJlZ25vKyspCisJYXJtX3JkaV9zdG9yZV9yZWdpc3RlcnMgKHJlZ25vKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZWFkX3JlZ2lzdGVyX2dlbiAocmVnbm8sIChjaGFyICopIHJhd3JlZyk7CisgICAgICAvKiBSREkgbWFuaXB1bGF0ZXMgZGF0YSBpbiBob3N0IGJ5dGUgb3JkZXIsIHNvIGNvbnZlcnQgbm93LiAqLworICAgICAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAocmF3ZXJyZWcsIDQsIHJhd3JlZ1swXSk7CisKKyAgICAgIGlmIChyZWdubyA9PSBQQ19SRUdOVU0pCisJcmRpX3JlZ21hc2sgPSBSRElSZWdfUEM7CisgICAgICBlbHNlIGlmIChyZWdubyA9PSBQU19SRUdOVU0pCisJcmRpX3JlZ21hc2sgPSBSRElSZWdfQ1BTUjsKKyAgICAgIGVsc2UgaWYgKHJlZ25vIDwgMCB8fCByZWdubyA+IDE1KQorCXJldHVybjsKKyAgICAgIGVsc2UKKwlyZGlfcmVnbWFzayA9IDEgPDwgcmVnbm87CisKKyAgICAgIHJzbHQgPSBhbmdlbF9SRElfQ1BVd3JpdGUgKDI1NSwgcmRpX3JlZ21hc2ssIHJhd2VycmVnKTsKKyAgICAgIGlmIChyc2x0KQorCXsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlJESV9DUFV3cml0ZTogJXNcbiIsIHJkaV9lcnJvcl9tZXNzYWdlIChyc2x0KSk7CisJfQorICAgIH0KK30KKwwKKy8qIFJlYWQgb3Igd3JpdGUgTEVOIGJ5dGVzIGZyb20gaW5mZXJpb3IgbWVtb3J5IGF0IE1FTUFERFIsCisgICB0cmFuc2ZlcnJpbmcgdG8gb3IgZnJvbSBkZWJ1Z2dlciBhZGRyZXNzIE1ZQUREUi4gIFdyaXRlIHRvIGluZmVyaW9yCisgICBpZiBTSE9VTERfV1JJVEUgaXMgbm9uemVyby4gIFJldHVybnMgbGVuZ3RoIG9mIGRhdGEgd3JpdHRlbiBvcgorICAgcmVhZDsgMCBmb3IgZXJyb3IuICAqLworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIGludAorYXJtX3JkaV94ZmVyX21lbW9yeShtZW1hZGRyLCBteWFkZHIsIGxlbiwgc2hvdWxkX3dyaXRlLCB0YXJnZXQpCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47CisgICAgIGludCBzaG91bGRfd3JpdGU7CisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQ7CQkJLyogaWdub3JlZCAqLworeworICBpbnQgcnNsdCwgaTsKKworICBpZiAoc2hvdWxkX3dyaXRlKQorICAgIHsKKyAgICAgIHJzbHQgPSBhbmdlbF9SRElfd3JpdGUgKG15YWRkciwgbWVtYWRkciwgJmxlbik7CisgICAgICBpZiAocnNsdCkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCJSRElfd3JpdGU6ICVzXG4iLCByZGlfZXJyb3JfbWVzc2FnZSAocnNsdCkpOworCX0KKyAgICB9CisgIGVsc2UgCisgICAgeworICAgICAgcnNsdCA9IGFuZ2VsX1JESV9yZWFkIChtZW1hZGRyLCBteWFkZHIsICZsZW4pOworICAgICAgaWYgKHJzbHQpCisJeworCSAgcHJpbnRmX2ZpbHRlcmVkICgiUkRJX3JlYWQ6ICVzXG4iLCByZGlfZXJyb3JfbWVzc2FnZSAocnNsdCkpOworCSAgbGVuID0gMDsKKwl9CisgICAgfQorICByZXR1cm4gbGVuOworfQorDAorLyogRGlzcGxheSByYW5kb20gaW5mbyBjb2xsZWN0ZWQgZnJvbSB0aGUgdGFyZ2V0LiAgKi8KKworc3RhdGljIHZvaWQKK2FybV9yZGlfZmlsZXNfaW5mbyAoaWdub3JlKQorICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqaWdub3JlOworeworICBjaGFyICpmaWxlID0gIm5vdGhpbmciOworICBpbnQgcnNsdDsKKyAgdW5zaWduZWQgbG9uZyBhcmcxLCBhcmcyOworCisgIHJzbHQgPSBhbmdlbF9SRElfaW5mbyAoUkRJSW5mb19UYXJnZXQsICZhcmcxLCAmYXJnMik7CisgIGlmIChyc2x0KQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlJESV9pbmZvOiAlc1xuIiwgcmRpX2Vycm9yX21lc3NhZ2UgKHJzbHQpKTsKKyAgICB9CisgIGlmIChhcmcxICYgKDEgPDwgMTUpKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlRhcmdldCBzdXBwb3J0cyBUaHVtYiBjb2RlLlxuIik7CisgIGlmIChhcmcxICYgKDEgPDwgMTQpKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlRhcmdldCBjYW4gZG8gcHJvZmlsaW5nLlxuIik7CisgIGlmIChhcmcxICYgKDEgPDwgNCkpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiVGFyZ2V0IGlzIHJlYWwgaGFyZHdhcmUuXG4iKTsKKyAgCisgIHJzbHQgPSBhbmdlbF9SRElfaW5mbyAoUkRJSW5mb19TdGVwLCAmYXJnMSwgJmFyZzIpOworICBpZiAocnNsdCkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJSRElfaW5mbzogJXNcbiIsIHJkaV9lcnJvcl9tZXNzYWdlIChyc2x0KSk7CisgICAgfQorICBwcmludGZfZmlsdGVyZWQgKCJUYXJnZXQgY2FuJXMgc2luZ2xlLXN0ZXAuXG4iLCAoYXJnMSAmIDB4NCA/ICIiIDogIm5vdCIpKTsKKworICByc2x0ID0gYW5nZWxfUkRJX2luZm8gKFJESUluZm9fSWNlYnJlYWtlciwgJmFyZzEsICZhcmcyKTsKKyAgaWYgKHJzbHQpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiUkRJX2luZm86ICVzXG4iLCByZGlfZXJyb3JfbWVzc2FnZSAocnNsdCkpOworICAgIH0KKyAgZWxzZQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlRhcmdldCBpbmNsdWRlcyBhbiBFbWJlZGRlZElDRS5cbiIpOworfQorDAorc3RhdGljIHZvaWQKK2FybV9yZGlfa2lsbCAoKQoreworICBpbnQgcnNsdDsKKworICByc2x0ID0gYW5nZWxfUkRJX29wZW4gKDEsICZnZGJfY29uZmlnLCBOVUxMLCBOVUxMKTsKKyAgaWYgKHJzbHQpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiUkRJX29wZW46ICVzXG4iLCByZGlfZXJyb3JfbWVzc2FnZSAocnNsdCkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2FybV9yZGlfbW91cm5faW5mZXJpb3IgKCkKK3sKKyAgdW5wdXNoX3RhcmdldCAoJmFybV9yZGlfb3BzKTsKKyAgZ2VuZXJpY19tb3Vybl9pbmZlcmlvciAoKTsKK30KKwwKKy8qIFdoaWxlIHRoZSBSREkgbGlicmFyeSBrZWVwcyB0cmFjayBvZiBpdHMgb3duIGJyZWFrcG9pbnRzLCB3ZSBuZWVkCisgICB0byByZW1lbWJlciAiaGFuZGxlcyIgc28gdGhhdCB3ZSBjYW4gZGVsZXRlIHRoZW0gbGF0ZXIuICBTaW5jZQorICAgYnJlYWtwb2ludHMgZ2V0IHVzZWQgZm9yIHN0ZXBwaW5nLCBiZSBjYXJlZnVsIG5vdCB0byBsZWFrIG1lbW9yeQorICAgaGVyZS4gICovCisKK3N0YXRpYyBpbnQKK2FybV9yZGlfaW5zZXJ0X2JyZWFrcG9pbnQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqY29udGVudHNfY2FjaGU7Cit7CisgIGludCByc2x0OworICBQb2ludEhhbmRsZSBwb2ludDsKKyAgc3RydWN0IGxvY2FsX2JwX2xpc3RfZW50cnkgKmVudHJ5OworICBpbnQgdHlwZSA9IFJESVBvaW50X0VROworCisgIGlmIChhcm1fcGNfaXNfdGh1bWIgKGFkZHIpIHx8IGFybV9wY19pc190aHVtYl9kdW1teSAoYWRkcikpCisgICAgdHlwZSB8PSBSRElQb2ludF8xNkJpdDsKKyAgcnNsdCA9IGFuZ2VsX1JESV9zZXRicmVhayAoYWRkciwgdHlwZSwgMCwgJnBvaW50KTsKKyAgaWYgKHJzbHQpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiUkRJX3NldGJyZWFrOiAlc1xuIiwgcmRpX2Vycm9yX21lc3NhZ2UgKHJzbHQpKTsKKyAgICB9CisgIGVudHJ5ID0KKyAgICAoc3RydWN0IGxvY2FsX2JwX2xpc3RfZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbG9jYWxfYnBfbGlzdF9lbnRyeSkpOworICBlbnRyeS0+YWRkciA9IGFkZHI7CisgIGVudHJ5LT5wb2ludCA9IHBvaW50OworICBlbnRyeS0+bmV4dCA9IGxvY2FsX2JwX2xpc3Q7CisgIGxvY2FsX2JwX2xpc3QgPSBlbnRyeTsKKyAgcmV0dXJuIHJzbHQ7Cit9CisKK3N0YXRpYyBpbnQKK2FybV9yZGlfcmVtb3ZlX2JyZWFrcG9pbnQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqY29udGVudHNfY2FjaGU7Cit7CisgIGludCByc2x0OworICBQb2ludEhhbmRsZSBwb2ludDsKKyAgc3RydWN0IGxvY2FsX2JwX2xpc3RfZW50cnkgKmVudHJ5LCAqcHJldmVudHJ5OworCisgIGZvciAoZW50cnkgPSBsb2NhbF9icF9saXN0OyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChlbnRyeS0+YWRkciA9PSBhZGRyKQorCXsKKwkgIGJyZWFrOworCX0KKyAgICAgIHByZXZlbnRyeSA9IGVudHJ5OworICAgIH0KKyAgaWYgKGVudHJ5KQorICAgIHsKKyAgICAgIHJzbHQgPSBhbmdlbF9SRElfY2xlYXJicmVhayAoZW50cnktPnBvaW50KTsKKyAgICAgIGlmIChyc2x0KQorCXsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlJESV9jbGVhcmJyZWFrOiAlc1xuIiwgcmRpX2Vycm9yX21lc3NhZ2UgKHJzbHQpKTsKKwl9CisgICAgICAvKiBEZWxldGUgdGhlIGJyZWFrcG9pbnQgZW50cnkgbG9jYWxseS4gICovCisgICAgICBpZiAoZW50cnkgPT0gbG9jYWxfYnBfbGlzdCkKKwl7CisJICBsb2NhbF9icF9saXN0ID0gZW50cnktPm5leHQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHByZXZlbnRyeS0+bmV4dCA9IGVudHJ5LT5uZXh0OworCX0KKyAgICAgIGZyZWUgKGVudHJ5KTsKKyAgICB9CisgIHJldHVybiAwOworfQorDAorc3RhdGljIGNoYXIgKgorcmRpX2Vycm9yX21lc3NhZ2UgKGVycikKKyAgICAgaW50IGVycjsKK3sKKyAgc3dpdGNoIChlcnIpCisgICAgeworICAgIGNhc2UgUkRJRXJyb3JfTm9FcnJvcjogCisgICAgICByZXR1cm4gIm5vIGVycm9yIjsKKyAgICBjYXNlIFJESUVycm9yX1Jlc2V0OgorICAgICAgcmV0dXJuICJkZWJ1Z2dlZSByZXNldCI7CisgICAgY2FzZSBSRElFcnJvcl9VbmRlZmluZWRJbnN0cnVjdGlvbjoKKyAgICAgIHJldHVybiAidW5kZWZpbmVkIGluc3RydWN0aW9uIjsKKyAgICBjYXNlIFJESUVycm9yX1NvZnR3YXJlSW50ZXJydXB0OgorICAgICAgcmV0dXJuICJTV0kgdHJhcHBlZCI7CisgICAgY2FzZSBSRElFcnJvcl9QcmVmZXRjaEFib3J0OgorICAgICAgcmV0dXJuICJwcmVmZXRjaCBhYm9ydCwgZXhlY3V0aW9uIHJhbiBpbnRvIHVubWFwcGVkIG1lbW9yeT8iOworICAgIGNhc2UgUkRJRXJyb3JfRGF0YUFib3J0OgorICAgICAgcmV0dXJuICJkYXRhIGFib3J0LCBubyBtZW1vcnkgYXQgc3BlY2lmaWVkIGFkZHJlc3M/IjsKKyAgICBjYXNlIFJESUVycm9yX0FkZHJlc3NFeGNlcHRpb246CisgICAgICByZXR1cm4gImFkZHJlc3MgZXhjZXB0aW9uLCBhY2Nlc3MgPjI2Yml0IGluIDI2Yml0IG1vZGUiOworICAgIGNhc2UgUkRJRXJyb3JfSVJROgorICAgICAgcmV0dXJuICJJUlEsIGludGVycnVwdCB0cmFwcGVkIjsKKyAgICBjYXNlIFJESUVycm9yX0ZJUToKKyAgICAgIHJldHVybiAiRklRLCBmYXN0IGludGVycnVwdCB0cmFwcGVkIjsKKyAgICBjYXNlIFJESUVycm9yX0Vycm9yOgorICAgICAgcmV0dXJuICJhIG1pc2NlbGxhbmVvdXMgdHlwZSBvZiBlcnJvciI7CisgICAgY2FzZSBSRElFcnJvcl9CcmFuY2hUaHJvdWdoMDoKKyAgICAgIHJldHVybiAiYnJhbmNoIHRocm91Z2ggbG9jYXRpb24gMCI7CisgICAgY2FzZSBSRElFcnJvcl9Ob3RJbml0aWFsaXNlZDoKKyAgICAgIHJldHVybiAiaW50ZXJuYWwgZXJyb3IsIFJESV9vcGVuIG5vdCBjYWxsZWQgZmlyc3QiOworICAgIGNhc2UgUkRJRXJyb3JfVW5hYmxlVG9Jbml0aWFsaXNlOgorICAgICAgcmV0dXJuICJpbnRlcm5hbCBlcnJvciwgdGFyZ2V0IHdvcmxkIGlzIGJyb2tlbiI7CisgICAgY2FzZSBSRElFcnJvcl9Xcm9uZ0J5dGVTZXg6CisgICAgICByZXR1cm4gIlNlZSBPcGVyYXRvcjogV3JvbmdCeXRlU2V4IjsKKyAgICBjYXNlIFJESUVycm9yX1VuYWJsZVRvVGVybWluYXRlOgorICAgICAgcmV0dXJuICJTZWUgT3BlcmF0b3I6IFVuYWJsZSB0byBUZXJtaW5hdGUiOworICAgIGNhc2UgUkRJRXJyb3JfQmFkSW5zdHJ1Y3Rpb246CisgICAgICByZXR1cm4gImJhZCBpbnN0cnVjdGlvbiwgaWxsZWdhbCB0byBleGVjdXRlIHRoaXMgaW5zdHJ1Y3Rpb24iOworICAgIGNhc2UgUkRJRXJyb3JfSWxsZWdhbEluc3RydWN0aW9uOgorICAgICAgcmV0dXJuICJpbGxlZ2FsIGluc3RydWN0aW9uLCB0aGUgZWZmZWN0IG9mIGV4ZWN1dGluZyBpdCBpcyB1bmRlZmluZWQiOworICAgIGNhc2UgUkRJRXJyb3JfQmFkQ1BVU3RhdGVTZXR0aW5nOgorICAgICAgcmV0dXJuICJpbnRlcm5hbCBlcnJvciwgdHJpZWQgdG8gc2V0IFNQU1Igb2YgdXNlciBtb2RlIjsKKyAgICBjYXNlIFJESUVycm9yX1Vua25vd25Db1BybzoKKyAgICAgIHJldHVybiAidW5rbm93biBjby1wcm9jZXNzb3IiOworICAgIGNhc2UgUkRJRXJyb3JfVW5rbm93bkNvUHJvU3RhdGU6CisgICAgICByZXR1cm4gImNhbm5vdCBleGVjdXRlIGNvLXByb2Nlc3NvciByZXF1ZXN0IjsKKyAgICBjYXNlIFJESUVycm9yX0JhZENvUHJvU3RhdGU6CisgICAgICByZXR1cm4gInJlY29nbml6YWJseSBicm9rZW4gY28tcHJvY2Vzc29yIHJlcXVlc3QiOworICAgIGNhc2UgUkRJRXJyb3JfQmFkUG9pbnRUeXBlOgorICAgICAgcmV0dXJuICJpbnRlcm5hbCBlcnJvciwgYmFkIHBvaW50IHl5cGUiOworICAgIGNhc2UgUkRJRXJyb3JfVW5pbXBsZW1lbnRlZFR5cGU6CisgICAgICByZXR1cm4gImludGVybmFsIGVycm9yLCB1bmltcGxlbWVudGVkIHR5cGUiOworICAgIGNhc2UgUkRJRXJyb3JfQmFkUG9pbnRTaXplOgorICAgICAgcmV0dXJuICJpbnRlcm5hbCBlcnJvciwgYmFkIHBvaW50IHNpemUiOworICAgIGNhc2UgUkRJRXJyb3JfVW5pbXBsZW1lbnRlZFNpemU6CisgICAgICByZXR1cm4gImludGVybmFsIGVycm9yLCB1bmltcGxlbWVudGVkIHNpemUiOworICAgIGNhc2UgUkRJRXJyb3JfTm9Nb3JlUG9pbnRzOgorICAgICAgcmV0dXJuICJsYXN0IGJyZWFrL3dhdGNoIHBvaW50IHdhcyB1c2VkIjsKKyAgICBjYXNlIFJESUVycm9yX0JyZWFrcG9pbnRSZWFjaGVkOgorICAgICAgcmV0dXJuICJicmVha3BvaW50IHJlYWNoZWQiOworICAgIGNhc2UgUkRJRXJyb3JfV2F0Y2hwb2ludEFjY2Vzc2VkOgorICAgICAgcmV0dXJuICJ3YXRjaHBvaW50IGFjY2Vzc2VkIjsKKyAgICBjYXNlIFJESUVycm9yX05vU3VjaFBvaW50OgorICAgICAgcmV0dXJuICJhdHRlbXB0ZWQgdG8gY2xlYXIgbm9uLWV4aXN0ZW50IGJyZWFrL3dhdGNoIHBvaW50IjsKKyAgICBjYXNlIFJESUVycm9yX1Byb2dyYW1GaW5pc2hlZEluU3RlcDoKKyAgICAgIHJldHVybiAiZW5kIG9mIHRoZSBwcm9ncmFtIHJlYWNoZWQgd2hpbGUgc3RlcHBpbmciOworICAgIGNhc2UgUkRJRXJyb3JfVXNlckludGVycnVwdDoKKyAgICAgIHJldHVybiAieW91IHByZXNzZWQgRXNjYXBlIjsKKyAgICBjYXNlIFJESUVycm9yX0NhbnRTZXRQb2ludDoKKyAgICAgIHJldHVybiAibm8gbW9yZSBicmVhay93YXRjaCBwb2ludHMgYXZhaWxhYmxlIjsKKyAgICBjYXNlIFJESUVycm9yX0luY29tcGF0aWJsZVJESUxldmVsczoKKyAgICAgIHJldHVybiAiaW5jb21wYXRpYmxlIFJESSBsZXZlbHMiOworICAgIGNhc2UgUkRJRXJyb3JfTGl0dGxlRW5kaWFuOgorICAgICAgcmV0dXJuICJkZWJ1Z2dlZSBpcyBsaXR0bGUgZW5kaWFuIjsKKyAgICBjYXNlIFJESUVycm9yX0JpZ0VuZGlhbjoKKyAgICAgIHJldHVybiAiZGVidWdnZWUgaXMgYmlnIGVuZGlhbiI7CisgICAgY2FzZSBSRElFcnJvcl9Tb2Z0SW5pdGlhbGlzZUVycm9yOgorICAgICAgcmV0dXJuICJyZWNvdmVyYWJsZSBlcnJvciBpbiBSREkgaW5pdGlhbGl6YXRpb24iOworICAgIGNhc2UgUkRJRXJyb3JfSW5zdWZmaWNpZW50UHJpdmlsZWdlOgorICAgICAgcmV0dXJuICJpbnRlcm5hbCBlcnJvciwgc3VwZXJ2aXNvciBzdGF0ZSBub3QgYWNjZXNzaWJsZSB0byBtb25pdG9yIjsKKyAgICBjYXNlIFJESUVycm9yX1VuaW1wbGVtZW50ZWRNZXNzYWdlOgorICAgICAgcmV0dXJuICJpbnRlcm5hbCBlcnJvciwgdW5pbXBsZW1lbnRlZCBtZXNzYWdlIjsKKyAgICBjYXNlIFJESUVycm9yX1VuZGVmaW5lZE1lc3NhZ2U6CisgICAgICByZXR1cm4gImludGVybmFsIGVycm9yLCB1bmRlZmluZWQgbWVzc2FnZSI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAidW5kZWZpbmVkIGVycm9yIG1lc3NhZ2UsIHNob3VsZCByZXNldCB0YXJnZXQiOyAKKyAgICB9Cit9CisKKy8qIENvbnZlcnQgdGhlIEFSTSBlcnJvciBtZXNzYWdlcyB0byBzaWduYWxzIHRoYXQgR0RCIGtub3dzIGFib3V0LiAgKi8KKworc3RhdGljIGVudW0gdGFyZ2V0X3NpZ25hbAorcmRpX2Vycm9yX3NpZ25hbCAoZXJyKQorICAgICBpbnQgZXJyOworeworICBzd2l0Y2ggKGVycikKKyAgICB7CisgICAgY2FzZSBSRElFcnJvcl9Ob0Vycm9yOgorICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBSRElFcnJvcl9SZXNldDoKKyAgICAgIHJldHVybiBUQVJHRVRfU0lHTkFMX1RFUk07IC8qID8/PyAqLworICAgIGNhc2UgUkRJRXJyb3JfVW5kZWZpbmVkSW5zdHJ1Y3Rpb246CisgICAgICByZXR1cm4gVEFSR0VUX1NJR05BTF9JTEw7CisgICAgY2FzZSBSRElFcnJvcl9Tb2Z0d2FyZUludGVycnVwdDoKKyAgICBjYXNlIFJESUVycm9yX1ByZWZldGNoQWJvcnQ6CisgICAgY2FzZSBSRElFcnJvcl9EYXRhQWJvcnQ6CisgICAgICByZXR1cm4gVEFSR0VUX1NJR05BTF9UUkFQOworICAgIGNhc2UgUkRJRXJyb3JfQWRkcmVzc0V4Y2VwdGlvbjoKKyAgICAgIHJldHVybiBUQVJHRVRfU0lHTkFMX1NFR1Y7CisgICAgY2FzZSBSRElFcnJvcl9JUlE6CisgICAgY2FzZSBSRElFcnJvcl9GSVE6CisgICAgICByZXR1cm4gVEFSR0VUX1NJR05BTF9UUkFQOworICAgIGNhc2UgUkRJRXJyb3JfRXJyb3I6CisgICAgICByZXR1cm4gVEFSR0VUX1NJR05BTF9URVJNOworICAgIGNhc2UgUkRJRXJyb3JfQnJhbmNoVGhyb3VnaDA6CisgICAgICByZXR1cm4gVEFSR0VUX1NJR05BTF9UUkFQOworICAgIGNhc2UgUkRJRXJyb3JfTm90SW5pdGlhbGlzZWQ6CisgICAgY2FzZSBSRElFcnJvcl9VbmFibGVUb0luaXRpYWxpc2U6CisgICAgY2FzZSBSRElFcnJvcl9Xcm9uZ0J5dGVTZXg6CisgICAgY2FzZSBSRElFcnJvcl9VbmFibGVUb1Rlcm1pbmF0ZToKKyAgICAgIHJldHVybiBUQVJHRVRfU0lHTkFMX1VOS05PV047CisgICAgY2FzZSBSRElFcnJvcl9CYWRJbnN0cnVjdGlvbjoKKyAgICBjYXNlIFJESUVycm9yX0lsbGVnYWxJbnN0cnVjdGlvbjoKKyAgICAgIHJldHVybiBUQVJHRVRfU0lHTkFMX0lMTDsKKyAgICBjYXNlIFJESUVycm9yX0JhZENQVVN0YXRlU2V0dGluZzoKKyAgICBjYXNlIFJESUVycm9yX1Vua25vd25Db1BybzoKKyAgICBjYXNlIFJESUVycm9yX1Vua25vd25Db1Byb1N0YXRlOgorICAgIGNhc2UgUkRJRXJyb3JfQmFkQ29Qcm9TdGF0ZToKKyAgICBjYXNlIFJESUVycm9yX0JhZFBvaW50VHlwZToKKyAgICBjYXNlIFJESUVycm9yX1VuaW1wbGVtZW50ZWRUeXBlOgorICAgIGNhc2UgUkRJRXJyb3JfQmFkUG9pbnRTaXplOgorICAgIGNhc2UgUkRJRXJyb3JfVW5pbXBsZW1lbnRlZFNpemU6CisgICAgY2FzZSBSRElFcnJvcl9Ob01vcmVQb2ludHM6CisgICAgICByZXR1cm4gVEFSR0VUX1NJR05BTF9VTktOT1dOOworICAgIGNhc2UgUkRJRXJyb3JfQnJlYWtwb2ludFJlYWNoZWQ6CisgICAgY2FzZSBSRElFcnJvcl9XYXRjaHBvaW50QWNjZXNzZWQ6CisgICAgICByZXR1cm4gVEFSR0VUX1NJR05BTF9UUkFQOworICAgIGNhc2UgUkRJRXJyb3JfTm9TdWNoUG9pbnQ6CisgICAgY2FzZSBSRElFcnJvcl9Qcm9ncmFtRmluaXNoZWRJblN0ZXA6CisgICAgICByZXR1cm4gVEFSR0VUX1NJR05BTF9VTktOT1dOOworICAgIGNhc2UgUkRJRXJyb3JfVXNlckludGVycnVwdDoKKyAgICAgIHJldHVybiBUQVJHRVRfU0lHTkFMX0lOVDsKKyAgICBjYXNlIFJESUVycm9yX0luY29tcGF0aWJsZVJESUxldmVsczoKKyAgICBjYXNlIFJESUVycm9yX0xpdHRsZUVuZGlhbjoKKyAgICBjYXNlIFJESUVycm9yX0JpZ0VuZGlhbjoKKyAgICBjYXNlIFJESUVycm9yX1NvZnRJbml0aWFsaXNlRXJyb3I6CisgICAgY2FzZSBSRElFcnJvcl9JbnN1ZmZpY2llbnRQcml2aWxlZ2U6CisgICAgY2FzZSBSRElFcnJvcl9VbmltcGxlbWVudGVkTWVzc2FnZToKKyAgICBjYXNlIFJESUVycm9yX1VuZGVmaW5lZE1lc3NhZ2U6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBUQVJHRVRfU0lHTkFMX1VOS05PV047IAorICAgIH0KK30KKwwKKy8qIERlZmluZSB0aGUgdGFyZ2V0IG9wZXJhdGlvbnMgc3RydWN0dXJlLiAgKi8KKworc3RhdGljIHZvaWQKK2luaXRfcmRpX29wcyAoKQoreworICBhcm1fcmRpX29wcy50b19zaG9ydG5hbWUgPSAicmRpIjsJCisgIGFybV9yZGlfb3BzLnRvX2xvbmduYW1lID0gIkFSTSBSREkiOworICBhcm1fcmRpX29wcy50b19kb2MgPSAiVXNlIGEgcmVtb3RlIEFSTS1iYXNlZCBjb21wdXRlcjsgdmlhIHRoZSBSREkgbGlicmFyeS5cblwKK1NwZWNpZnkgdGhlIHNlcmlhbCBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvIChlLmcuIC9kZXYvdHR5YSkuIiA7IAorICBhcm1fcmRpX29wcy50b19vcGVuID0gYXJtX3JkaV9vcGVuOwkJCisgIGFybV9yZGlfb3BzLnRvX2Nsb3NlID0gYXJtX3JkaV9jbG9zZTsJCisgIGFybV9yZGlfb3BzLnRvX2RldGFjaCA9IGFybV9yZGlfZGV0YWNoOwkKKyAgYXJtX3JkaV9vcHMudG9fcmVzdW1lID0gYXJtX3JkaV9yZXN1bWU7CQorICBhcm1fcmRpX29wcy50b193YWl0ID0gYXJtX3JkaV93YWl0OwkKKyAgYXJtX3JkaV9vcHMudG9fZmV0Y2hfcmVnaXN0ZXJzID0gYXJtX3JkaV9mZXRjaF9yZWdpc3RlcnM7CisgIGFybV9yZGlfb3BzLnRvX3N0b3JlX3JlZ2lzdGVycyA9IGFybV9yZGlfc3RvcmVfcmVnaXN0ZXJzOworICBhcm1fcmRpX29wcy50b19wcmVwYXJlX3RvX3N0b3JlID0gYXJtX3JkaV9wcmVwYXJlX3RvX3N0b3JlOworICBhcm1fcmRpX29wcy50b194ZmVyX21lbW9yeSA9IGFybV9yZGlfeGZlcl9tZW1vcnk7CisgIGFybV9yZGlfb3BzLnRvX2ZpbGVzX2luZm8gPSBhcm1fcmRpX2ZpbGVzX2luZm87CisgIGFybV9yZGlfb3BzLnRvX2luc2VydF9icmVha3BvaW50ID0gYXJtX3JkaV9pbnNlcnRfYnJlYWtwb2ludDsKKyAgYXJtX3JkaV9vcHMudG9fcmVtb3ZlX2JyZWFrcG9pbnQgPSBhcm1fcmRpX3JlbW92ZV9icmVha3BvaW50OwkKKyAgYXJtX3JkaV9vcHMudG9fa2lsbCA9IGFybV9yZGlfa2lsbDsJCQorICBhcm1fcmRpX29wcy50b19sb2FkID0gZ2VuZXJpY19sb2FkOwkJCisgIGFybV9yZGlfb3BzLnRvX2NyZWF0ZV9pbmZlcmlvciA9IGFybV9yZGlfY3JlYXRlX2luZmVyaW9yOworICBhcm1fcmRpX29wcy50b19tb3Vybl9pbmZlcmlvciA9IGFybV9yZGlfbW91cm5faW5mZXJpb3I7CisgIGFybV9yZGlfb3BzLnRvX3N0cmF0dW0gPSBwcm9jZXNzX3N0cmF0dW07CisgIGFybV9yZGlfb3BzLnRvX2hhc19hbGxfbWVtb3J5ID0gMTsJCisgIGFybV9yZGlfb3BzLnRvX2hhc19tZW1vcnkgPSAxOwkKKyAgYXJtX3JkaV9vcHMudG9faGFzX3N0YWNrID0gMTsJCisgIGFybV9yZGlfb3BzLnRvX2hhc19yZWdpc3RlcnMgPSAxOwkKKyAgYXJtX3JkaV9vcHMudG9faGFzX2V4ZWN1dGlvbiA9IDE7CQorICBhcm1fcmRpX29wcy50b19tYWdpYyA9IE9QU19NQUdJQzsJCit9CisKK3ZvaWQKK19pbml0aWFsaXplX3JlbW90ZV9yZGkgKCkKK3sKKyAgaW5pdF9yZGlfb3BzICgpIDsKKyAgYWRkX3RhcmdldCAoJmFybV9yZGlfb3BzKTsKK30KKworLyogQSBsaXR0bGUgZHVtbXkgdG8gbWFrZSBsaW5raW5nIHdpdGggdGhlIGxpYnJhcnkgc3VjY2VlZC4gKi8KKworaW50IEZhaWwoKSB7IHJldHVybiAwOyB9CmRpZmYgLS1naXQgYS9nZGIvcmVtb3RlLXJkcC5jIGIvZ2RiL3JlbW90ZS1yZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDU5NmE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JlbW90ZS1yZHAuYwpAQCAtMCwwICsxLDE1MTIgQEAKKy8qIFJlbW90ZSBkZWJ1Z2dpbmcgZm9yIHRoZSBBUk0gUkRQIGludGVyZmFjZS4KKyAgIENvcHlyaWdodCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisKKyAqLworCisKKy8qIAorICAgTXVjaCBvZiB0aGlzIGZpbGUgKGluIHBhcnRpY3VsYXIgdGhlIFNXSSBzdHVmZikgaXMgYmFzZWQgb24gY29kZSBieQorICAgRGF2aWQgVGF5bG9yIChkanQxMDAwQHVrLmFjLmNhbS5oZXJtZXMpLgorCisgICBJIGhhY2tlZCBvbiBhbmQgc2ltcGxpZmllZCBpdCBieSByZW1vdmluZyBhIGxvdCBvZiBzZXh5IGZlYXR1cmVzIGhlCisgICBoYWQgYWRkZWQsIGFuZCBzb21lIG9mIHRoZSAodW5peCBzcGVjaWZpYykgd29ya2Fyb3VuZHMgaGUnZCBkb25lCisgICBmb3Igb3RoZXIgR0RCIHByb2JsZW1zIC0gd2hpY2ggaWYgdGhleSBzdGlsbCBleGlzdCBzaG91bGQgYmUgZml4ZWQKKyAgIGluIEdEQiwgbm90IGluIGEgcmVtb3RlLWZvbyB0aGluZyAuICBJIGFsc28gbWFkZSBpdCBjb25mb3JtIG1vcmUgdG8KKyAgIHRoZSBkb2MgSSBoYXZlOyB3aGljaCBtYXkgYmUgd3JvbmcuCisKKyAgIFN0ZXZlIENoYW1iZXJsYWluIChzYWNAY3lnbnVzLmNvbSkuCisgKi8KKworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAid2FpdC5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlICJjb21tYW5kLmgiCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjZWxzZQorI2luY2x1ZGUgPHZhcmFyZ3MuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAicmVtb3RlLXV0aWxzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKworCitleHRlcm4gc3RydWN0IHRhcmdldF9vcHMgcmVtb3RlX3JkcF9vcHM7CitzdGF0aWMgc2VyaWFsX3QgaW87CitzdGF0aWMgaG9zdF9jYWxsYmFjayAqY2FsbGJhY2sgPSAmZGVmYXVsdF9jYWxsYmFjazsKKworc3RydWN0CisgIHsKKyAgICBpbnQgc3RlcF9pbmZvOworICAgIGludCBicmVha19pbmZvOworICAgIGludCBtb2RlbF9pbmZvOworICAgIGludCB0YXJnZXRfaW5mbzsKKyAgICBpbnQgY2FuX3N0ZXA7CisgICAgY2hhciBjb21tYW5kX2xpbmVbMTBdOworICAgIGludCByZGlfbGV2ZWw7CisgICAgaW50IHJkaV9zdG9wcGVkX3N0YXR1czsKKyAgfQorZHM7CisKKworCisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIFJEUCBwcm90b2NvbC4gKi8KKworI2RlZmluZSBSRFBfTU9VVEhGVUxMICAgCQkoMTw8NikKKyNkZWZpbmUgRlBVX0NPUFJPX05VTUJFUiAJCTEKKworI2RlZmluZSBSRFBfT1BFTiAJIAkJMAorI2RlZmluZSBSRFBfT1BFTl9UWVBFX0NPTEQgCQkwCisjZGVmaW5lIFJEUF9PUEVOX1RZUEVfV0FSTSAJCTEKKyNkZWZpbmUgUkRQX09QRU5fVFlQRV9CQVVEUkFURSAgICAgICAgICAyCisKKyNkZWZpbmUgUkRQX09QRU5fQkFVRFJBVEVfOTYwMCAgICAgICAJMQorI2RlZmluZSBSRFBfT1BFTl9CQVVEUkFURV8xOTIwMCAgICAgICAgCTIKKyNkZWZpbmUgUkRQX09QRU5fQkFVRFJBVEVfMzg0MDAgICAgICAgIAkzCisKKyNkZWZpbmUgUkRQX09QRU5fVFlQRV9SRVRVUk5fU0VYCSgxPDwzKQorCisjZGVmaW5lIFJEUF9DTE9TRSAJCQkxCisKKyNkZWZpbmUgUkRQX01FTV9SRUFEIAkJCTIKKworI2RlZmluZSBSRFBfTUVNX1dSSVRFIAkJCTMKKworI2RlZmluZSBSRFBfQ1BVX1JFQUQgCQkJNAorI2RlZmluZSBSRFBfQ1BVX1dSSVRFIAkJCTUKKyNkZWZpbmUgUkRQX0NQVV9SRUFEV1JJVEVfTU9ERV9DVVJSRU5UIDI1NQorI2RlZmluZSBSRFBfQ1BVX1JFQURXUklURV9NQVNLX1BDIAkoMTw8MTYpCisjZGVmaW5lIFJEUF9DUFVfUkVBRFdSSVRFX01BU0tfQ1BTUiAJKDE8PDE3KQorI2RlZmluZSBSRFBfQ1BVX1JFQURXUklURV9NQVNLX1NQU1IgCSgxPDwxOCkKKworI2RlZmluZSBSRFBfQ09QUk9fUkVBRCAgIAkJNgorI2RlZmluZSBSRFBfQ09QUk9fV1JJVEUgCQk3CisjZGVmaW5lIFJEUF9GUFVfUkVBRFdSSVRFX01BU0tfRlBTIAkoMTw8OCkKKworI2RlZmluZSBSRFBfU0VUX0JSRUFLCQkJMHhhCisjZGVmaW5lIFJEUF9TRVRfQlJFQUtfVFlQRV9QQ19FUVVBTCAgICAgMAorI2RlZmluZSBSRFBfU0VUX0JSRUFLX1RZUEVfR0VUX0hBTkRMRSAgICgweDEwKQorCisjZGVmaW5lIFJEUF9DTEVBUl9CUkVBSyAJCTB4YgorCisjZGVmaW5lIFJEUF9FWEVDIAkJCTB4MTAKKyNkZWZpbmUgUkRQX0VYRUNfVFlQRV9TWU5DIAkJMAorCisjZGVmaW5lIFJEUF9TVEVQIAkJCTB4MTEKKworI2RlZmluZSBSRFBfSU5GTyAgCQkJMHgxMgorI2RlZmluZSBSRFBfSU5GT19BQk9VVF9TVEVQIAkJMgorI2RlZmluZSBSRFBfSU5GT19BQk9VVF9TVEVQX0dUXzEJMQorI2RlZmluZSBSRFBfSU5GT19BQk9VVF9TVEVQX1RPX0pNUCAJMgorI2RlZmluZSBSRFBfSU5GT19BQk9VVF9TVEVQXzEJCTQKKyNkZWZpbmUgUkRQX0lORk9fQUJPVVRfVEFSR0VUIAkJMAorI2RlZmluZSBSRFBfSU5GT19BQk9VVF9CUkVBSyAJCTEKKyNkZWZpbmUgUkRQX0lORk9fQUJPVVRfQlJFQUtfQ09NUAkxCisjZGVmaW5lIFJEUF9JTkZPX0FCT1VUX0JSRUFLX1JBTkdFIAkyCisjZGVmaW5lIFJEUF9JTkZPX0FCT1VUX0JSRUFLX0JZVEVfUkVBRCAJNAorI2RlZmluZSBSRFBfSU5GT19BQk9VVF9CUkVBS19IQUxGV09SRF9SRUFEIDgKKyNkZWZpbmUgUkRQX0lORk9fQUJPVVRfQlJFQUtfV09SRF9SRUFEICgxPDw0KQorI2RlZmluZSBSRFBfSU5GT19BQk9VVF9CUkVBS19CWVRFX1dSSVRFICgxPDw1KQorI2RlZmluZSBSRFBfSU5GT19BQk9VVF9CUkVBS19IQUxGV09SRF9XUklURSAoMTw8NikKKyNkZWZpbmUgUkRQX0lORk9fQUJPVVRfQlJFQUtfV09SRF9XUklURSAoMTw8NykKKyNkZWZpbmUgUkRQX0lORk9fQUJPVVRfQlJFQUtfTUFTSyAJKDE8PDgpCisjZGVmaW5lIFJEUF9JTkZPX0FCT1VUX0JSRUFLX1RIUkVBRF9CUkVBSyAoMTw8OSkKKyNkZWZpbmUgUkRQX0lORk9fQUJPVVRfQlJFQUtfVEhSRUFEX1dBVENIICgxPDwxMCkKKyNkZWZpbmUgUkRQX0lORk9fQUJPVVRfQlJFQUtfQ09ORCAJKDE8PDExKQorI2RlZmluZSBSRFBfSU5GT19WRUNUT1JfQ0FUQ0gJCSgweDE4MCkKKyNkZWZpbmUgUkRQX0lORk9fSUNFQlJFQUtFUgkJKDcpCisjZGVmaW5lIFJEUF9JTkZPX1NFVF9DTURMSU5FICAgICAgICAgICAgKDB4MzAwKQorCisjZGVmaW5lIFJEUF9TRUxFQ1RfQ09ORklHCQkoMHgxNikKKyNkZWZpbmUgUkRJX0NvbmZpZ0NQVQkJCTAKKyNkZWZpbmUgUkRJX0NvbmZpZ1N5c3RlbQkJMQorI2RlZmluZSBSRElfTWF0Y2hBbnkJCQkwCisjZGVmaW5lIFJESV9NYXRjaEV4YWN0bHkJCTEKKyNkZWZpbmUgUkRJX01hdGNoTm9FYXJsaWVyCQkyCisKKyNkZWZpbmUgUkRQX1JFU0VUIAkJCTB4N2YKKworLyogUmV0dXJucyBmcm9tIFJEUCAqLworI2RlZmluZSBSRFBfUkVTX1NUT1BQRUQgCQkweDIwCisjZGVmaW5lIFJEUF9SRVNfU1dJIAkJCTB4MjEKKyNkZWZpbmUgUkRQX1JFU19GQVRBTCAJCQkweDVlCisjZGVmaW5lIFJEUF9SRVNfVkFMVUUgCQkJMHg1ZgorI2RlZmluZSBSRFBfUkVTX1ZBTFVFX0xJVFRMRV9FTkRJQU4gICAgIDI0MAorI2RlZmluZSBSRFBfUkVTX1ZBTFVFX0JJR19FTkRJQU4gCTI0MQorI2RlZmluZSBSRFBfUkVTX1JFU0VUCQkJMHg3ZgorI2RlZmluZSBSRFBfUkVTX0FUX0JSRUFLUE9JTlQgICAgCTE0MworI2RlZmluZSBSRFBfUkVTX0lEVU5OTwkJCTB4ZTYKKyNkZWZpbmUgUkRQX09TT3BSZXBseSAgICAgICAgICAgCTB4MTMKKyNkZWZpbmUgUkRQX09TT3BXb3JkICAgICAgICAgICAgCTIKKyNkZWZpbmUgUkRQX09TT3BOb3RoaW5nICAgICAgICAgCTAKKworc3RhdGljIGludCB0aW1lb3V0ID0gMjsKKworc3RhdGljIGNoYXIgKiBjb21tYW5kbGluZSA9IE5VTEw7CisKK3N0YXRpYyBpbnQKK3JlbW90ZV9yZHBfeGZlcl9pbmZlcmlvcl9tZW1vcnkgUEFSQU1TICgoQ09SRV9BRERSIG1lbWFkZHIsCisJCQkJCSBjaGFyICpteWFkZHIsCisJCQkJCSBpbnQgbGVuLAorCQkJCQkgaW50IHdyaXRlLAorCQkJCQkgc3RydWN0IHRhcmdldF9vcHMgKiB0YXJnZXQpKTsKKworCisvKiBTdHVmZiBmb3IgdGFsa2luZyB0byB0aGUgc2VyaWFsIGxheWVyLiAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhcgorZ2V0X2J5dGUgKCkKK3sKKyAgaW50IGMgPSBTRVJJQUxfUkVBRENIQVIgKGlvLCB0aW1lb3V0KTsKKworICBpZiAocmVtb3RlX2RlYnVnKQorICAgIHByaW50ZiAoIlslMDJ4XVxuIiwgYyk7CisKKyAgaWYgKGMgPT0gU0VSSUFMX1RJTUVPVVQpCisgICAgeworICAgICAgaWYgKHRpbWVvdXQgPT0gMCkKKwlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpIGM7CisKKyAgICAgIGVycm9yICgiVGltZW91dCByZWFkaW5nIGZyb20gcmVtb3RlX3N5c3RlbSIpOworICAgIH0KKworICByZXR1cm4gYzsKK30KKworLyogTm90ZSB0aGF0IHRoZSB0YXJnZXQgYWx3YXlzIHNwZWFrcyBsaXR0bGUtZW5kaWFuIHRvIHVzLAorICAgZXZlbiBpZiBpdCdzIGEgYmlnIGVuZGlhbiBtYWNoaW5lLiAqLworc3RhdGljIHVuc2lnbmVkIGludAorZ2V0X3dvcmQgKCkKK3sKKyAgdW5zaWduZWQgaW50IHZhbCA9IDA7CisgIHVuc2lnbmVkIGludCBjOworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IDQ7IG4rKykKKyAgICB7CisgICAgICBjID0gZ2V0X2J5dGUgKCk7CisgICAgICB2YWwgfD0gYyA8PCAobiAqIDgpOworICAgIH0KKyAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQKK3B1dF9ieXRlICh2YWwpCisgICAgIGNoYXIgdmFsOworeworICBpZiAocmVtb3RlX2RlYnVnKQorICAgIHByaW50ZiAoIiglMDJ4KVxuIiwgdmFsKTsKKyAgU0VSSUFMX1dSSVRFIChpbywgJnZhbCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkCitwdXRfd29yZCAodmFsKQorICAgICBpbnQgdmFsOworeworICAvKiBXZSBhbHdheXMgc2VuZCBpbiBsaXR0bGUgZW5kaWFuICovCisgIHVuc2lnbmVkIGNoYXIgYls0XTsKKyAgYlswXSA9IHZhbDsKKyAgYlsxXSA9IHZhbCA+PiA4OworICBiWzJdID0gdmFsID4+IDE2OworICBiWzNdID0gdmFsID4+IDI0OworCisgIGlmIChyZW1vdGVfZGVidWcpCisgICAgcHJpbnRmICgiKCUwNHgpIiwgdmFsKTsKKworICBTRVJJQUxfV1JJVEUgKGlvLCBiLCA0KTsKK30KKworCisKKy8qIFN0dWZmIGZvciB0YWxraW5nIHRvIHRoZSBSRFAgbGF5ZXIuICovCisKKy8qIFRoaXMgaXMgYSBiaXQgbW9yZSBmYW5jeSB0aGF0IG5lZWQgYmUgc28gdGhhdCBpdCBzeW5jcyBldmVuIGluIG5hc3R5IGNhc2VzLgorCisgICBJJ2JlIGJlZW4gdW5hYmxlIHRvIG1ha2UgaXQgcmVsaWFibHkgc3luYyB1cCB3aXRoIHRoZSBjaGFuZ2UKKyAgIGJhdWRyYXRlIG9wZW4gY29tbWFuZC4gIEl0IGxpa2VzIHRvIHNpdCBhbmQgc2F5IGl0J3MgYmVlbiByZXNldCwKKyAgIHdpdGggbm8gbW9yZSBhY3Rpb24uICBTbyBJIHRvb2sgYWxsIHRoYXQgY29kZSBvdXQuICBJJ2QgcmF0aGVyIHN5bmMKKyAgIHJlbGlhYmx5IGF0IDk2MDAgdGhhbiB3YWl0IGZvcmV2ZXIgZm9yIGEgcG9zc2libGUgMTkyMDAgY29ubmVjdGlvbi4KKworICovCitzdGF0aWMgdm9pZAorcmRwX2luaXQgKGNvbGQsIHR0eSkKKyAgICAgaW50IGNvbGQ7CisgICAgIGludCB0dHk7Cit7CisgIGludCBzeW5jID0gMDsKKyAgaW50IHR5cGUgPSBjb2xkID8gUkRQX09QRU5fVFlQRV9DT0xEIDogUkRQX09QRU5fVFlQRV9XQVJNOworICBpbnQgYmF1ZHRyeSA9IDk2MDA7CisKKyAgdGltZV90IG5vdyA9IHRpbWUgKDApOworICB0aW1lX3Qgc3RvcF90aW1lID0gbm93ICsgMTA7CS8qIFRyeSBhbmQgc3luYyBmb3IgMTAgc2Vjb25kcywgdGhlbiBnaXZlIHVwICovCisKKworICB3aGlsZSAodGltZSAoMCkgPCBzdG9wX3RpbWUgJiYgIXN5bmMpCisgICAgeworICAgICAgaW50IHJlc3R5cGU7CisgICAgICBRVUlUOworCisgICAgICBTRVJJQUxfRkxVU0hfSU5QVVQgKGlvKTsKKyAgICAgIFNFUklBTF9GTFVTSF9PVVRQVVQgKGlvKTsKKworICAgICAgaWYgKHR0eSkKKwlwcmludGZfdW5maWx0ZXJlZCAoIlRyeWluZyB0byBjb25uZWN0IGF0ICVkIGJhdWQuXG4iLCBiYXVkdHJ5KTsKKworICAgICAgLyoKKyAgICAgICoqIEl0IHNlZW1zIG5lY2Vzc2FyeSB0byByZXNldCBhbiBFbWJlZGRlZElDRSB0byBnZXQgaXQgZ29pbmcuCisgICAgICAqKiBUaGlzIGhhcyB0aGUgc2lkZSBiZW5lZml0IG9mIGRpc3BsYXlpbmcgdGhlIHN0YXJ0dXAgYmFubmVyLgorICAgICAgKi8KKyAgICAgIGlmIChjb2xkKQorCXsKKwkgIHB1dF9ieXRlIChSRFBfUkVTRVQpOworCSAgd2hpbGUgKChyZXN0eXBlID0gU0VSSUFMX1JFQURDSEFSIChpbywgMSkpID4gMCkKKwkgICAgeworCSAgICAgIHN3aXRjaCAocmVzdHlwZSkKKwkJeworCQljYXNlIFNFUklBTF9USU1FT1VUOgorCQkgIGJyZWFrOworCQljYXNlIFJEUF9SRVNFVDoKKwkJICAvKiBTZW50IGF0IHN0YXJ0IG9mIHJlc2V0IHByb2Nlc3M6IGlnbm9yZSAqLworCQkgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgIHByaW50Zl91bmZpbHRlcmVkICgiJWMiLCBpc2dyYXBoIChyZXN0eXBlKSA/IHJlc3R5cGUgOiAnICcpOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKworCSAgaWYgKHJlc3R5cGUgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIEdvdCBlbmQtb2YtYmFubmVyIG1hcmsgKi8KKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworCSAgICB9CisJfQorCisgICAgICBwdXRfYnl0ZSAoUkRQX09QRU4pOworCisgICAgICBwdXRfYnl0ZSAodHlwZSB8IFJEUF9PUEVOX1RZUEVfUkVUVVJOX1NFWCApOworICAgICAgcHV0X3dvcmQgKDApOworCisgICAgICB3aGlsZSAoIXN5bmMgJiYgKHJlc3R5cGUgPSBTRVJJQUxfUkVBRENIQVIgKGlvLCAxKSkgPiAwKQorCXsKKwkgIGlmIChyZW1vdGVfZGVidWcpCisJICAgIHByaW50Zl91bmZpbHRlcmVkICgiWyUwMnhdXG4iLCByZXN0eXBlKTsKKworCSAgc3dpdGNoIChyZXN0eXBlKQorCSAgICB7CisJICAgIGNhc2UgU0VSSUFMX1RJTUVPVVQ6CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBSRFBfUkVTRVQ6CisJICAgICAgd2hpbGUgKChyZXN0eXBlID0gU0VSSUFMX1JFQURDSEFSIChpbywgMSkpID09IFJEUF9SRVNFVCkKKwkJOworCSAgICAgIGRvCisJCXsKKwkJICBwcmludGZfdW5maWx0ZXJlZCAoIiVjIiwgaXNncmFwaCAocmVzdHlwZSkgPyByZXN0eXBlIDogJyAnKTsKKwkJfQorCSAgICAgIHdoaWxlICgocmVzdHlwZSA9IFNFUklBTF9SRUFEQ0hBUiAoaW8sIDEpKSA+IDApOworCisJICAgICAgaWYgKHR0eSkKKwkJeworCQkgIHByaW50Zl91bmZpbHRlcmVkICgiXG5UaGUgYm9hcmQgaGFzIHNlbnQgbm90aWZpY2F0aW9uIHRoYXQgaXQgd2FzIHJlc2V0LlxuIik7CisJCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCJXYWl0aW5nIGZvciBpdCB0byBzZXR0bGUgZG93bi4uLlxuIik7CisJCX0KKwkgICAgICBzbGVlcCAoMyk7CisJICAgICAgaWYgKHR0eSkKKwkJcHJpbnRmX3VuZmlsdGVyZWQgKCJcblRyeWluZyBhZ2Fpbi5cbiIpOworCSAgICAgIGNvbGQgPSAwOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBSRFBfUkVTX1ZBTFVFOgorCSAgICAgIHsKKwkJaW50IHJlc3ZhbCA9IFNFUklBTF9SRUFEQ0hBUiAoaW8sIDEpOworCisJCWlmIChyZW1vdGVfZGVidWcpCisJCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCJbJTAyeF1cbiIsIHJlc3ZhbCk7CisKKwkJc3dpdGNoIChyZXN2YWwpCisJCSAgeworCQkgIGNhc2UgU0VSSUFMX1RJTUVPVVQ6CisJCSAgICBicmVhazsKKwkJICBjYXNlIFJEUF9SRVNfVkFMVUVfTElUVExFX0VORElBTjoKKwkJICAgIHRhcmdldF9ieXRlX29yZGVyID0gTElUVExFX0VORElBTjsKKwkJICAgIHN5bmMgPSAxOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBSRFBfUkVTX1ZBTFVFX0JJR19FTkRJQU46CisJCSAgICB0YXJnZXRfYnl0ZV9vcmRlciA9IEJJR19FTkRJQU47CisJCSAgICBzeW5jID0gMTsKKwkJICAgIGJyZWFrOworCQkgIGRlZmF1bHQ6CisJCSAgICBicmVhazsKKwkJICB9CisJICAgICAgfQorCSAgICB9CisJfQorICAgIH0KKworICBpZiAoIXN5bmMpCisgICAgeworICAgICAgZXJyb3IgKCJDb3VsZG4ndCByZXNldCB0aGUgYm9hcmQsIHRyeSBwcmVzc2luZyB0aGUgcmVzZXQgYnV0dG9uIik7CisgICAgfQorfQorCisKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKK3ZvaWQKK3NlbmRfcmRwIChjaGFyICp0ZW1wbGF0ZSwuLi4pCisjZWxzZQordm9pZAorc2VuZF9yZHAgKGNoYXIgKnRlbXBsYXRlLCB2YV9hbGlzdCkKKyAgICAgdmFfZGNsCisjZW5kaWYKK3sKKyAgY2hhciBidWZbMjAwXTsKKyAgY2hhciAqZHN0ID0gYnVmOworICB2YV9saXN0IGFsaXN0OworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworICB2YV9zdGFydCAoYWxpc3QsIHRlbXBsYXRlKTsKKyNlbHNlCisgIHZhX3N0YXJ0IChhbGlzdCk7CisjZW5kaWYKKworICB3aGlsZSAoKnRlbXBsYXRlKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCB2YWw7CisgICAgICBpbnQgKnBpOworICAgICAgaW50ICpwc3RhdDsKKyAgICAgIGNoYXIgKnBjOworICAgICAgaW50IGk7CisgICAgICBzd2l0Y2ggKCp0ZW1wbGF0ZSsrKQorCXsKKwljYXNlICdiJzoKKwkgIHZhbCA9IHZhX2FyZyAoYWxpc3QsIGludCk7CisJICAqZHN0KysgPSB2YWw7CisJICBicmVhazsKKwljYXNlICd3JzoKKwkgIHZhbCA9IHZhX2FyZyAoYWxpc3QsIGludCk7CisJICAqZHN0KysgPSB2YWw7CisJICAqZHN0KysgPSB2YWwgPj4gODsKKwkgICpkc3QrKyA9IHZhbCA+PiAxNjsKKwkgICpkc3QrKyA9IHZhbCA+PiAyNDsKKwkgIGJyZWFrOworCWNhc2UgJ1MnOgorCSAgdmFsID0gZ2V0X2J5dGUgKCk7CisJICBpZiAodmFsICE9IFJEUF9SRVNfVkFMVUUpCisJICAgIHsKKwkgICAgICBwcmludGZfdW5maWx0ZXJlZCAoImdvdCBiYWQgcmVzIHZhbHVlIG9mICVkLCAleFxuIiwgdmFsLCB2YWwpOworCSAgICB9CisJICBicmVhazsKKwljYXNlICdWJzoKKwkgIHBzdGF0ID0gdmFfYXJnIChhbGlzdCwgaW50ICopOworCSAgcGkgPSB2YV9hcmcgKGFsaXN0LCBpbnQgKik7CisKKwkgICpwc3RhdCA9IGdldF9ieXRlICgpOworCSAgLyogQ2hlY2sgdGhlIHJlc3VsdCB3YXMgemVybywgaWYgbm90IHJlYWQgdGhlIHN5bmRyb21lICovCisJICBpZiAoKnBzdGF0KQorCSAgICB7CisJICAgICAgKnBpID0gZ2V0X3dvcmQgKCk7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgJ1onOgorCSAgLyogQ2hlY2sgdGhlIHJlc3VsdCBjb2RlICovCisJICBzd2l0Y2ggKGdldF9ieXRlICgpKQorCSAgICB7CisJICAgIGNhc2UgMDoKKwkgICAgICAvKiBTdWNjZXNzICovCisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgMjUzOgorCSAgICAgIC8qIFRhcmdldCBjYW4ndCBkbyBpdDsgbmV2ZXIgbWluZCAqLworCSAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiUkRQOiBJbnN1ZmZpY2llbnQgcHJpdmlsZWdlXG4iKTsKKwkgICAgICByZXR1cm47CisJICAgIGNhc2UgMjU0OgorCSAgICAgIC8qIFRhcmdldCBjYW4ndCBkbyBpdDsgbmV2ZXIgbWluZCAqLworCSAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiUkRQOiBVbmltcGxlbWVudGVkIG1lc3NhZ2VcbiIpOworCSAgICAgIHJldHVybjsKKwkgICAgY2FzZSAyNTU6CisJICAgICAgZXJyb3IgKCJDb21tYW5kIGdhcmJsZWQiKTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBlcnJvciAoIkNvcnJ1cHQgcmVwbHkgZnJvbSB0YXJnZXQiKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSAnVyc6CisJICAvKiBSZWFkIGEgd29yZCBmcm9tIHRoZSB0YXJnZXQgKi8KKwkgIHBpID0gdmFfYXJnIChhbGlzdCwgaW50ICopOworCSAgKnBpID0gZ2V0X3dvcmQgKCk7CisJICBicmVhazsKKwljYXNlICdQJzoKKwkgIC8qIFJlYWQgaW4gc29tZSBieXRlcyBmcm9tIHRoZSB0YXJnZXQuICovCisJICBwYyA9IHZhX2FyZyAoYWxpc3QsIGNoYXIgKik7CisJICB2YWwgPSB2YV9hcmcgKGFsaXN0LCBpbnQpOworCSAgZm9yIChpID0gMDsgaSA8IHZhbDsgaSsrKQorCSAgICB7CisJICAgICAgcGNbaV0gPSBnZXRfYnl0ZSAoKTsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSAncCc6CisJICAvKiBzZW5kIHdoYXQncyBiZWluZyBwb2ludGVkIGF0ICovCisJICBwYyA9IHZhX2FyZyAoYWxpc3QsIGNoYXIgKik7CisJICB2YWwgPSB2YV9hcmcgKGFsaXN0LCBpbnQpOworCSAgZHN0ID0gYnVmOworCSAgU0VSSUFMX1dSSVRFIChpbywgcGMsIHZhbCk7CisJICBicmVhazsKKwljYXNlICctJzoKKwkgIC8qIFNlbmQgd2hhdHMgaW4gdGhlIHF1ZXVlICovCisJICBpZiAoZHN0ICE9IGJ1ZikKKwkgICAgeworCSAgICAgIFNFUklBTF9XUklURSAoaW8sIGJ1ZiwgZHN0IC0gYnVmKTsKKwkgICAgICBkc3QgPSBidWY7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgJ0InOgorCSAgcGkgPSB2YV9hcmcgKGFsaXN0LCBpbnQgKik7CisJICAqcGkgPSBnZXRfYnl0ZSAoKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBhYm9ydCAoKTsKKwl9CisgICAgfQorICB2YV9lbmQgKGFyZ3MpOworCisgIGlmIChkc3QgIT0gYnVmKQorICAgIGFib3J0ICgpOworfQorCisKK3N0YXRpYyBpbnQKK3JkcF93cml0ZSAobWVtYWRkciwgYnVmLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpidWY7CisgICAgIGludCBsZW47Cit7CisgIGludCByZXM7CisgIGludCB2YWw7CisKKyAgc2VuZF9yZHAgKCJid3ctcC1TViIsIFJEUF9NRU1fV1JJVEUsIG1lbWFkZHIsIGxlbiwgYnVmLCBsZW4sICZyZXMsICZ2YWwpOworCisgIGlmIChyZXMpCisgICAgeworICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisgIHJldHVybiBsZW47Cit9CisKKworc3RhdGljIGludAorcmRwX3JlYWQgKG1lbWFkZHIsIGJ1ZiwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqYnVmOworICAgICBpbnQgbGVuOworeworICBpbnQgcmVzOworICBpbnQgdmFsOworICBzZW5kX3JkcCAoImJ3dy1TLVAtViIsCisJICAgIFJEUF9NRU1fUkVBRCwgbWVtYWRkciwgbGVuLAorCSAgICBidWYsIGxlbiwKKwkgICAgJnJlcywgJnZhbCk7CisgIGlmIChyZXMpCisgICAgeworICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyB2b2lkCityZHBfZmV0Y2hfb25lX3JlZ2lzdGVyIChtYXNrLCBidWYpCisgICAgIGludCBtYXNrOworICAgICBjaGFyICpidWY7Cit7CisgIGludCB2YWw7CisgIHNlbmRfcmRwICgiYmJ3LVNXWiIsIFJEUF9DUFVfUkVBRCwgUkRQX0NQVV9SRUFEV1JJVEVfTU9ERV9DVVJSRU5ULCBtYXNrLCAmdmFsKTsKKyAgc3RvcmVfc2lnbmVkX2ludGVnZXIgKGJ1ZiwgNCwgdmFsKTsKK30KKworc3RhdGljIHZvaWQKK3JkcF9mZXRjaF9vbmVfZnB1X3JlZ2lzdGVyIChtYXNrLCBidWYpCisgICAgIGludCBtYXNrOworICAgICBjaGFyICpidWY7Cit7CisjaWYgMAorICAvKiAhISEgU2luY2UgdGhlIFBJRSBib2FyZCBkb2Vzbid0IHdvcmsgYXMgZG9jdW1lbnRlZCwKKyAgICAgYW5kIGl0IGRvZXNuJ3QgaGF2ZSBGUFUgaGFyZHdhcmUgYW55d2F5IGFuZCBzaW5jZSBpdAorICAgICBzbG93cyBldmVyeXRoaW5nIGRvd24sIEkndmUgZGlzYWJsZWQgdGhpcy4gKi8KKyAgaW50IHZhbDsKKyAgaWYgKG1hc2sgPT0gUkRQX0ZQVV9SRUFEV1JJVEVfTUFTS19GUFMpCisgICAgeworICAgICAgLyogdGhpcyBndXkgaXMgb25seSBhIHdvcmQgKi8KKyAgICAgIHNlbmRfcmRwICgiYmJ3LVNXWiIsIFJEUF9DT1BST19SRUFELCBGUFVfQ09QUk9fTlVNQkVSLCBtYXNrLCAmdmFsKTsKKyAgICAgIHN0b3JlX3NpZ25lZF9pbnRlZ2VyIChidWYsIDQsIHZhbCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVGhlcmUgYXJlIDEyIGJ5dGVzIGxvbmcgCisgICAgICAgICAhISBmaXhtZSBhYm91dCBlbmRpYW5uZXNzIAorICAgICAgICovCisgICAgICBpbnQgZHVtbXk7CQkvKiBJJ3ZlIHNlZW4gdGhlc2UgY29tZSBiYWNrIGFzIGZvdXIgd29yZHMgISEgKi8KKyAgICAgIHNlbmRfcmRwICgiYmJ3LVNXV1dXWiIsIFJEUF9DT1BST19SRUFELCBGUFVfQ09QUk9fTlVNQkVSLCBtYXNrLCBidWYgKyAwLCBidWYgKyA0LCBidWYgKyA4LCAmZHVtbXkpOworICAgIH0KKyNlbmRpZgorICBtZW1zZXQgKGJ1ZiwgMCwgTUFYX1JFR0lTVEVSX1JBV19TSVpFKTsKK30KKworCitzdGF0aWMgdm9pZAorcmRwX3N0b3JlX29uZV9yZWdpc3RlciAobWFzaywgYnVmKQorICAgICBpbnQgbWFzazsKKyAgICAgY2hhciAqYnVmOworeworICBpbnQgdmFsID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChidWYsIDQpOworCisgIHNlbmRfcmRwICgiYmJ3dy1TWiIsCisJICAgIFJEUF9DUFVfV1JJVEUsIFJEUF9DUFVfUkVBRFdSSVRFX01PREVfQ1VSUkVOVCwgbWFzaywgdmFsKTsKK30KKworCitzdGF0aWMgdm9pZAorcmRwX3N0b3JlX29uZV9mcHVfcmVnaXN0ZXIgKG1hc2ssIGJ1ZikKKyAgICAgaW50IG1hc2s7CisgICAgIGNoYXIgKmJ1ZjsKK3sKKyNpZiAwCisgIC8qIFNlZSBjb21tZW50IGluIGZldGNoX29uZV9mcHVfcmVnaXN0ZXIgKi8KKyAgaWYgKG1hc2sgPT0gUkRQX0ZQVV9SRUFEV1JJVEVfTUFTS19GUFMpCisgICAgeworICAgICAgaW50IHZhbCA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0KTsKKyAgICAgIC8qIHRoaXMgZ3V5IGlzIG9ubHkgYSB3b3JkICovCisgICAgICBzZW5kX3JkcCAoImJid3ctU1oiLCBSRFBfQ09QUk9fV1JJVEUsCisJCUZQVV9DT1BST19OVU1CRVIsCisJCW1hc2ssIHZhbCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVGhlcmUgYXJlIDEyIGJ5dGVzIGxvbmcgCisgICAgICAgICAhISBmaXhtZSBhYm91dCBlbmRpYW5uZXNzIAorICAgICAgICovCisgICAgICBpbnQgZHVtbXkgPSAwOworICAgICAgLyogSSd2ZSBzZWVuIHRoZXNlIGNvbWUgYXMgZm91ciB3b3Jkcywgbm90IHRoZSB0aHJlZSBhZHZlcnRpemVkICEhICovCisgICAgICBwcmludGYgKCJTZW5kaW5nIG1hc2sgJXhcbiIsIG1hc2spOworICAgICAgc2VuZF9yZHAgKCJiYnd3d3d3LVNaIiwKKwkJUkRQX0NPUFJPX1dSSVRFLAorCQlGUFVfQ09QUk9fTlVNQkVSLAorCQltYXNrLAorCQkqKGludCAqKSAoYnVmICsgMCksCisJCSooaW50ICopIChidWYgKyA0KSwKKwkJKihpbnQgKikgKGJ1ZiArIDgpLAorCQkwKTsKKworICAgICAgcHJpbnRmICgiZG9uZSBtYXNrICV4XG4iLCBtYXNrKTsKKyAgICB9CisjZW5kaWYKK30KKwwKKworLyogQ29udmVydCBiZXR3ZWVuIEdEQiByZXF1ZXN0cyBhbmQgdGhlIFJEUCBsYXllci4gKi8KKworc3RhdGljIHZvaWQKK3JlbW90ZV9yZHBfZmV0Y2hfcmVnaXN0ZXIgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGlmIChyZWdubyA9PSAtMSkKKyAgICB7CisgICAgICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCBOVU1fUkVHUzsgcmVnbm8rKykKKwlyZW1vdGVfcmRwX2ZldGNoX3JlZ2lzdGVyIChyZWdubyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciBidWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKyAgICAgIGlmIChyZWdubyA8IDE1KQorCXJkcF9mZXRjaF9vbmVfcmVnaXN0ZXIgKDEgPDwgcmVnbm8sIGJ1Zik7CisgICAgICBlbHNlIGlmIChyZWdubyA9PSBQQ19SRUdOVU0pCisJcmRwX2ZldGNoX29uZV9yZWdpc3RlciAoUkRQX0NQVV9SRUFEV1JJVEVfTUFTS19QQywgYnVmKTsKKyAgICAgIGVsc2UgaWYgKHJlZ25vID09IFBTX1JFR05VTSkKKwlyZHBfZmV0Y2hfb25lX3JlZ2lzdGVyIChSRFBfQ1BVX1JFQURXUklURV9NQVNLX0NQU1IsIGJ1Zik7CisgICAgICBlbHNlIGlmIChyZWdubyA9PSBGUFNfUkVHTlVNKQorCXJkcF9mZXRjaF9vbmVfZnB1X3JlZ2lzdGVyIChSRFBfRlBVX1JFQURXUklURV9NQVNLX0ZQUywgYnVmKTsKKyAgICAgIGVsc2UgaWYgKHJlZ25vID49IEYwX1JFR05VTSAmJiByZWdubyA8PSBGN19SRUdOVU0pCisJcmRwX2ZldGNoX29uZV9mcHVfcmVnaXN0ZXIgKDEgPDwgKHJlZ25vIC0gRjBfUkVHTlVNKSwgYnVmKTsKKyAgICAgIGVsc2UKKwl7CisJICBwcmludGYgKCJIZWxwIG1lIHdpdGggZmV0Y2ggcmVnICVkXG4iLCByZWdubyk7CisJfQorICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgYnVmKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3JlbW90ZV9yZHBfc3RvcmVfcmVnaXN0ZXIgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGlmIChyZWdubyA9PSAtMSkKKyAgICB7CisgICAgICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCBOVU1fUkVHUzsgcmVnbm8rKykKKwlyZW1vdGVfcmRwX3N0b3JlX3JlZ2lzdGVyIChyZWdubyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciB0bXBbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKyAgICAgIHJlYWRfcmVnaXN0ZXJfZ2VuIChyZWdubywgdG1wKTsKKyAgICAgIGlmIChyZWdubyA8IDE1KQorCXJkcF9zdG9yZV9vbmVfcmVnaXN0ZXIgKDEgPDwgcmVnbm8sIHRtcCk7CisgICAgICBlbHNlIGlmIChyZWdubyA9PSBQQ19SRUdOVU0pCisJcmRwX3N0b3JlX29uZV9yZWdpc3RlciAoUkRQX0NQVV9SRUFEV1JJVEVfTUFTS19QQywgdG1wKTsKKyAgICAgIGVsc2UgaWYgKHJlZ25vID09IFBTX1JFR05VTSkKKwlyZHBfc3RvcmVfb25lX3JlZ2lzdGVyIChSRFBfQ1BVX1JFQURXUklURV9NQVNLX0NQU1IsIHRtcCk7CisgICAgICBlbHNlIGlmIChyZWdubyA+PSBGMF9SRUdOVU0gJiYgcmVnbm8gPD0gRjdfUkVHTlVNKQorCXJkcF9zdG9yZV9vbmVfZnB1X3JlZ2lzdGVyICgxIDw8IChyZWdubyAtIEYwX1JFR05VTSksIHRtcCk7CisgICAgICBlbHNlCisJeworCSAgcHJpbnRmICgiSGVscCBtZSB3aXRoIHJlZyAlZFxuIiwgcmVnbm8pOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCityZW1vdGVfcmRwX2tpbGwgKCkKK3sKKyAgY2FsbGJhY2stPnNodXRkb3duIChjYWxsYmFjayk7Cit9CisKKworc3RhdGljIHZvaWQKK3JkcF9pbmZvICgpCit7CisgIHNlbmRfcmRwICgiYnctUy1XLVoiLCBSRFBfSU5GTywgUkRQX0lORk9fQUJPVVRfU1RFUCwKKwkgICAgJmRzLnN0ZXBfaW5mbyk7CisgIHNlbmRfcmRwICgiYnctUy1XLVoiLCBSRFBfSU5GTywgUkRQX0lORk9fQUJPVVRfQlJFQUssCisJICAgICZkcy5icmVha19pbmZvKTsKKyAgc2VuZF9yZHAgKCJidy1TLVdXLVoiLCBSRFBfSU5GTywgUkRQX0lORk9fQUJPVVRfVEFSR0VULAorCSAgICAmZHMudGFyZ2V0X2luZm8sCisJICAgICZkcy5tb2RlbF9pbmZvKTsKKworICBkcy5jYW5fc3RlcCA9IGRzLnN0ZXBfaW5mbyAmIFJEUF9JTkZPX0FCT1VUX1NURVBfMTsKKworICBkcy5yZGlfbGV2ZWwgPSAoZHMudGFyZ2V0X2luZm8gPj4gNSkgJiAzOworfQorCisKK3N0YXRpYyB2b2lkCityZHBfZXhlY3V0ZV9zdGFydCAoKQoreworICAvKiBTdGFydCBpdCBvZmYsIGJ1dCBkb24ndCB3YWl0IGZvciBpdCAqLworICBzZW5kX3JkcCAoImJiLSIsIFJEUF9FWEVDLCBSRFBfRVhFQ19UWVBFX1NZTkMpOworfQorCisKK3N0YXRpYyB2b2lkCityZHBfc2V0X2NvbW1hbmRfbGluZSAoY29tbWFuZCwgYXJncykKKyAgICAgY2hhciAqIGNvbW1hbmQ7CisgICAgIGNoYXIgKiBhcmdzOworeworICAvKgorICAqKiBXZSBjb3VsZCB1c2UgUkRQX0lORk9fU0VUX0NNRExJTkUgdG8gc2VuZCB0aGlzLCBidXQgRW1iZWRkZWRJQ0Ugc3lzdGVtcworICAqKiBkb24ndCBpbXBsZW1lbnQgdGhhdCwgYW5kIGdldCBhbGwgY29uZnVzZWQgYXQgdGhlIHVuZXhwZWN0ZWQgdGV4dC4KKyAgKiogSW5zdGVhZCwganVzdCBrZWVwIGEgY29weSwgYW5kIHNlbmQgaXQgd2hlbiB0aGUgdGFyZ2V0IGRvZXMgYSBTV0lfR2V0RW52CisgICovCisKKyAgaWYgKGNvbW1hbmRsaW5lICE9IE5VTEwpCisgICAgZnJlZSAoY29tbWFuZGxpbmUpOworCisgIGNvbW1hbmRsaW5lID0gbWFsbG9jIChzdHJsZW4gKGNvbW1hbmQpICsgc3RybGVuIChhcmdzKSArIDIpOworICBpZiAoY29tbWFuZGxpbmUgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJjcHkgKGNvbW1hbmRsaW5lLCBjb21tYW5kKTsKKyAgICAgIHN0cmNhdCAoY29tbWFuZGxpbmUsICIgIik7CisgICAgICBzdHJjYXQgKGNvbW1hbmRsaW5lLCBhcmdzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCityZHBfY2F0Y2hfdmVjdG9ycyAoKQoreworICAvKgorICAqKiBXZSB3YW50IHRoZSB0YXJnZXQgbW9uaXRvciB0byBpbnRlcmNlcHQgdGhlIGFib3J0IHZlY3RvcnMKKyAgKiogaS5lLiBzdG9wIHRoZSBwcm9ncmFtIGlmIGFueSBvZiB0aGVzZSBhcmUgdXNlZC4KKyAgKi8KKyAgc2VuZF9yZHAgKCJid3ctU1oiLCBSRFBfSU5GTywgUkRQX0lORk9fVkVDVE9SX0NBVENILAorCSAgICAvKgorCSAgICAqKiBTcGVjaWZ5IGEgYml0bWFzayBpbmNsdWRpbmcKKwkgICAgKiogIHRoZSByZXNldCB2ZWN0b3IKKwkgICAgKiogIHRoZSB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gdmVjdG9yCisJICAgICoqICB0aGUgcHJlZmV0Y2ggYWJvcnQgdmVjdG9yCisJICAgICoqICB0aGUgZGF0YSBhYm9ydCB2ZWN0b3IKKwkgICAgKiogIHRoZSBhZGRyZXNzIGV4Y2VwdGlvbiB2ZWN0b3IKKwkgICAgKi8KKwkgICAgKDE8PDApfCgxPDwxKXwoMTw8Myl8KDE8PDQpfCgxPDw1KQorCSAgICApOworfQorICAKKworCisjZGVmaW5lIGFfYnl0ZSAxCisjZGVmaW5lIGFfd29yZCAyCisjZGVmaW5lIGFfc3RyaW5nIDMKKworCit0eXBlZGVmIHN0cnVjdAoreworICBDT1JFX0FERFIgbjsKKyAgY29uc3QgY2hhciAqczsKK30KK2FyZ3NpbjsKKworI2RlZmluZSBBQllURSAxCisjZGVmaW5lIEFXT1JEIDIKKyNkZWZpbmUgQVNUUklORyAzCisjZGVmaW5lIEFERFJMRU4gNAorCisjZGVmaW5lIFNXSV9Xcml0ZUMgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFNXSV9Xcml0ZTAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIFNXSV9SZWFkQyAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIFNXSV9DTEkgICAgICAgICAgICAgICAgICAgICAgICAgMHg1CisjZGVmaW5lIFNXSV9HZXRFbnYgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBTV0lfRXhpdCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEKKyNkZWZpbmUgU1dJX0VudGVyT1MgICAgICAgICAgICAgICAgICAgICAweDE2CisKKyNkZWZpbmUgU1dJX0dldEVycm5vICAgICAgICAgICAgICAgICAgICAweDYwCisjZGVmaW5lIFNXSV9DbG9jayAgICAgICAgICAgICAgICAgICAgICAgMHg2MQorCisjZGVmaW5lIFNXSV9UaW1lICAgICAgICAgICAgICAgICAgICAgICAgMHg2MworI2RlZmluZSBTV0lfUmVtb3ZlICAgICAgICAgICAgICAgICAgICAgIDB4NjQKKyNkZWZpbmUgU1dJX1JlbmFtZSAgICAgICAgICAgICAgICAgICAgICAweDY1CisjZGVmaW5lIFNXSV9PcGVuICAgICAgICAgICAgICAgICAgICAgICAgMHg2NgorCisjZGVmaW5lIFNXSV9DbG9zZSAgICAgICAgICAgICAgICAgICAgICAgMHg2OAorI2RlZmluZSBTV0lfV3JpdGUgICAgICAgICAgICAgICAgICAgICAgIDB4NjkKKyNkZWZpbmUgU1dJX1JlYWQgICAgICAgICAgICAgICAgICAgICAgICAweDZhCisjZGVmaW5lIFNXSV9TZWVrICAgICAgICAgICAgICAgICAgICAgICAgMHg2YgorI2RlZmluZSBTV0lfRmxlbiAgICAgICAgICAgICAgICAgICAgICAgIDB4NmMKKworI2RlZmluZSBTV0lfSXNUVFkgICAgICAgICAgICAgICAgICAgICAgIDB4NmUKKyNkZWZpbmUgU1dJX1RtcE5hbSAgICAgICAgICAgICAgICAgICAgICAweDZmCisjZGVmaW5lIFNXSV9JbnN0YWxsSGFuZGxlciAgICAgICAgICAgICAgMHg3MAorI2RlZmluZSBTV0lfR2VuZXJhdGVFcnJvciAgICAgICAgICAgICAgIDB4NzEKKworCisjaWZuZGVmIE9fQklOQVJZCisjZGVmaW5lIE9fQklOQVJZIDAKKyNlbmRpZgorCitzdGF0aWMgaW50IHRyYW5zbGF0ZV9vcGVuX21vZGVbXSA9Cit7CisgIE9fUkRPTkxZLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogInIiICAgKi8KKyAgT19SRE9OTFkrT19CSU5BUlksICAgICAgICAgICAgICAgICAvKiAicmIiICAqLworICBPX1JEV1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJyKyIgICovCisgIE9fUkRXUiAgK09fQklOQVJZLCAgICAgICAgICAgICAgICAgLyogInIrYiIgKi8KKyAgT19XUk9OTFkgICAgICAgICArT19DUkVBVCtPX1RSVU5DLCAvKiAidyIgICAqLworICBPX1dST05MWStPX0JJTkFSWStPX0NSRUFUK09fVFJVTkMsIC8qICJ3YiIgICovCisgIE9fUkRXUiAgICAgICAgICAgK09fQ1JFQVQrT19UUlVOQywgLyogIncrIiAgKi8KKyAgT19SRFdSICArT19CSU5BUlkrT19DUkVBVCtPX1RSVU5DLCAvKiAidytiIiAqLworICBPX1dST05MWSAgICAgICAgICtPX0FQUEVORCtPX0NSRUFULC8qICJhIiAgICovCisgIE9fV1JPTkxZK09fQklOQVJZK09fQVBQRU5EK09fQ1JFQVQsLyogImFiIiAgKi8KKyAgT19SRFdSICAgICAgICAgICArT19BUFBFTkQrT19DUkVBVCwvKiAiYSsiICAqLworICBPX1JEV1IgICtPX0JJTkFSWStPX0FQUEVORCtPX0NSRUFUIC8qICJhK2IiICovCit9OworCitzdGF0aWMgaW50CitleGVjX3N3aSAoc3dpLCBhcmdzKQorICAgICBpbnQgc3dpOworICAgICBhcmdzaW4gKmFyZ3M7Cit7CisgIGludCBpOworICBjaGFyIGM7CisgIHN3aXRjaCAoc3dpKQorICAgIHsKKyAgICBjYXNlIFNXSV9Xcml0ZUM6CisgICAgICBjYWxsYmFjay0+d3JpdGVfc3Rkb3V0IChjYWxsYmFjaywgJmMsIDEpOworICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBTV0lfV3JpdGUwOgorICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ3MtPm47IGkrKykKKwljYWxsYmFjay0+d3JpdGVfc3Rkb3V0IChjYWxsYmFjaywgYXJncy0+cywgc3RybGVuIChhcmdzLT5zKSk7CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIFNXSV9SZWFkQzoKKyAgICAgIGNhbGxiYWNrLT5yZWFkX3N0ZGluIChjYWxsYmFjaywgJmMsIDEpOworICAgICAgYXJncy0+biA9IGM7CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIFNXSV9DTEk6CisgICAgICBhcmdzLT5uID0gY2FsbGJhY2stPnN5c3RlbSAoY2FsbGJhY2ssIGFyZ3MtPnMpOworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBTV0lfR2V0RXJybm86CisgICAgICBhcmdzLT5uID0gY2FsbGJhY2stPmdldF9lcnJubyAoY2FsbGJhY2spOworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBTV0lfVGltZToKKyAgICAgIGFyZ3MtPm4gPSBjYWxsYmFjay0+dGltZSAoY2FsbGJhY2ssIE5VTEwpOworICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIFNXSV9DbG9jayA6CisgICAgICAgLyogcmV0dXJuIG51bWJlciBvZiBjZW50aS1zZWNvbmRzLi4uICovCisgICAgICAgYXJncy0+biA9IAorI2lmZGVmIENMT0NLU19QRVJfU0VDCisgICAgICAgICAgKENMT0NLU19QRVJfU0VDID49IDEwMCkKKyAgICAgICAgICAgICA/IChjbG9jaygpIC8gKENMT0NLU19QRVJfU0VDIC8gMTAwKSkKKyAgICAgICAgICAgICA6ICgoY2xvY2soKSAqIDEwMCkgLyBDTE9DS1NfUEVSX1NFQykgOworI2Vsc2UKKyAgICAgLyogcHJlc3VtZSB1bml4Li4uIGNsb2NrKCkgcmV0dXJucyBtaWNyb3NlY29uZHMgKi8KKyAgICAgICAgICBjbG9jaygpIC8gMTAwMDAgOworI2VuZGlmCisgICAgICAgcmV0dXJuIDEgOworCisgICAgY2FzZSBTV0lfUmVtb3ZlOgorICAgICAgYXJncy0+biA9IGNhbGxiYWNrLT51bmxpbmsgKGNhbGxiYWNrLCBhcmdzLT5zKTsKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgU1dJX1JlbmFtZToKKyAgICAgIGFyZ3MtPm4gPSBjYWxsYmFjay0+cmVuYW1lIChjYWxsYmFjaywgYXJnc1swXS5zLCBhcmdzWzFdLnMpOworICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIFNXSV9PcGVuOgorCS8qIE5vdyB3ZSBuZWVkIHRvIGRlY29kZSB0aGUgRGVtb24gb3BlbiBtb2RlICovCisJaSA9IHRyYW5zbGF0ZV9vcGVuX21vZGVbYXJnc1sxXS5uXTsKKworCS8qIEZpbGVuYW1lICI6dHQiIGlzIHNwZWNpYWw6IGl0IGRlbm90ZXMgc3RkaW4vb3V0ICovCisJaWYgKHN0cmNtcChhcmdzLT5zLCI6dHQiKT09MCkKKwkgIHsKKwkgICAgaWYgKGkgPT0gT19SRE9OTFkgKSAvKiBvcGVuaW5nIHR0eSAiciIgKi8KKwkgICAgICBhcmdzLT5uID0gMCAvKiBzdGRpbiAqLyA7CisJICAgIGVsc2UgCisJICAgICAgYXJncy0+biA9IDEgLyogc3Rkb3V0ICovIDsKKwkgIH0KKwllbHNlCisJICBhcmdzLT5uID0gY2FsbGJhY2stPm9wZW4gKGNhbGxiYWNrLCBhcmdzLT5zLCBpKTsKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBTV0lfQ2xvc2U6CisgICAgICBhcmdzLT5uID0gY2FsbGJhY2stPmNsb3NlIChjYWxsYmFjaywgYXJncy0+bik7CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgU1dJX1dyaXRlOgorICAgICAgLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgKm5vdCogd3JpdHRlbiAqLworICAgICAgYXJncy0+biA9IGFyZ3NbMV0ubiAtCisJY2FsbGJhY2stPndyaXRlIChjYWxsYmFjaywgYXJnc1swXS5uLCBhcmdzWzFdLnMsIGFyZ3NbMV0ubik7CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgU1dJX1JlYWQ6CisgICAgICB7CisJY2hhciAqY29weSA9IGFsbG9jYSAoYXJnc1syXS5uKTsKKwlpbnQgZG9uZSA9IGNhbGxiYWNrLT5yZWFkIChjYWxsYmFjaywgYXJnc1swXS5uLCBjb3B5LCBhcmdzWzJdLm4pOworCWlmIChkb25lID4gMCkKKwkgIHJlbW90ZV9yZHBfeGZlcl9pbmZlcmlvcl9tZW1vcnkgKGFyZ3NbMV0ubiwgY29weSwgZG9uZSwgMSwgMCk7CisJYXJncy0+biA9IGFyZ3NbMl0ubi1kb25lOworCXJldHVybiAxOworICAgICAgfQorCisgICAgY2FzZSBTV0lfU2VlazoKKyAgICAgIC8qIFJldHVybiBub24temVybyBvbiBmYWlsdXJlICovCisgICAgICBhcmdzLT5uID0gY2FsbGJhY2stPmxzZWVrIChjYWxsYmFjaywgYXJnc1swXS5uLCBhcmdzWzFdLm4sIDApIDwgMDsKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBTV0lfRmxlbjoKKyAgICAgIHsKKwlsb25nIG9sZCA9IGNhbGxiYWNrLT5sc2VlayAoY2FsbGJhY2ssIGFyZ3MtPm4sIDAsIFNFRUtfQ1VSKTsKKwlhcmdzLT5uID0gY2FsbGJhY2stPmxzZWVrIChjYWxsYmFjaywgYXJncy0+biwgMCwgU0VFS19FTkQpOworCWNhbGxiYWNrLT5sc2VlayAoY2FsbGJhY2ssIGFyZ3MtPm4sIG9sZCwgMCk7CisJcmV0dXJuIDE7CisgICAgICB9CisKKyAgICBjYXNlIFNXSV9Jc1RUWToKKyAgICAgIGFyZ3MtPm4gPSBjYWxsYmFjay0+aXNhdHR5IChjYWxsYmFjaywgYXJncy0+bik7CisgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgU1dJX0dldEVudjoKKyAgICAgIGlmIChjb21tYW5kbGluZSAhPSBOVUxMKQorCXsKKwkgIGludCBsZW4gPSBzdHJsZW4gKGNvbW1hbmRsaW5lKTsKKwkgIGlmIChsZW4gPiAyNTUpCisJICAgIHsKKwkgICAgICBsZW4gPSAyNTU7CisJICAgICAgY29tbWFuZGxpbmUgWzI1NV09J1wwJzsKKwkgICAgfQorCSAgcmVtb3RlX3JkcF94ZmVyX2luZmVyaW9yX21lbW9yeSAoYXJnc1swXS5uLAorCQkJCQkgICBjb21tYW5kbGluZSwgbGVuKzEsIDEsIDApOworCX0KKyAgICAgIGVsc2UKKwlyZW1vdGVfcmRwX3hmZXJfaW5mZXJpb3JfbWVtb3J5IChhcmdzWzBdLm4sICIiLCAxLCAxLCAwKTsKKyAgICAgIHJldHVybiAxOworICAgICAgCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAoraGFuZGxlX3N3aSAoKQoreworICBhcmdzaW4gYXJnc1szXTsKKyAgY2hhciAqYnVmOworICBpbnQgbGVuOworICBpbnQgY291bnQgPSAwOworCisgIGludCBzd2lubyA9IGdldF93b3JkICgpOworICBpbnQgdHlwZSA9IGdldF9ieXRlICgpOworICB3aGlsZSAodHlwZSAhPSAwKQorICAgIHsKKyAgICAgIHN3aXRjaCAodHlwZSAmIDB4MykKKwl7CisJY2FzZSBBQllURToKKwkgIGFyZ3NbY291bnRdLm4gPSBnZXRfYnl0ZSAoKTsKKwkgIGJyZWFrOworCisJY2FzZSBBV09SRDoKKwkgIGFyZ3NbY291bnRdLm4gPSBnZXRfd29yZCAoKTsKKwkgIGJyZWFrOworCisJY2FzZSBBU1RSSU5HOgorCSAgLyogSWYgdGhlIHdvcmQgaXMgdW5kZXIgMzIgYnl0ZXMgaXQgd2lsbCBiZSBzZW50IG90aGVyd2lzZQorCSAgICAgYW4gYWRkcmVzcyB0byBpdCBpcyBwYXNzZWQuIEFsc286IFNwZWNpYWwgY2FzZSBvZiAyNTUgKi8KKworCSAgbGVuID0gZ2V0X2J5dGUgKCk7CisJICBpZiAobGVuID4gMzIpCisJICAgIHsKKwkgICAgICBpZiAobGVuID09IDI1NSkKKwkJeworCQkgIGxlbiA9IGdldF93b3JkICgpOworCQl9CisJICAgICAgYnVmID0gYWxsb2NhIChsZW4pOworCSAgICAgIHJlbW90ZV9yZHBfeGZlcl9pbmZlcmlvcl9tZW1vcnkgKGdldF93b3JkICgpLAorCQkJCQkgICAgICAgYnVmLAorCQkJCQkgICAgICAgbGVuLAorCQkJCQkgICAgICAgMCwKKwkJCQkJICAgICAgIDApOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpbnQgaTsKKwkgICAgICBidWYgPSBhbGxvY2EgKGxlbiArIDEpOworCSAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJYnVmW2ldID0gZ2V0X2J5dGUgKCk7CisJICAgICAgYnVmW2ldID0gMDsKKwkgICAgfQorCSAgYXJnc1tjb3VudF0ubiA9IGxlbjsKKwkgIGFyZ3NbY291bnRdLnMgPSBidWY7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBlcnJvciAoIlVuaW1wbGVudGVkIFNXSSBhcmd1bWVudCIpOworCX0KKworICAgICAgdHlwZSA9IHR5cGUgPj4gMjsKKyAgICAgIGNvdW50Kys7CisgICAgfQorCisgIGlmIChleGVjX3N3aSAoc3dpbm8sIGFyZ3MpKQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgdHdvIG9wdGlvbnMgaGVyZSByZXBseSB3aXRoIGVpdGhlciBhIGJ5dGUgb3IgYSB3b3JkCisgICAgICAgICB3aGljaCBpcyBzdG9yZWQgaW4gYXJnc1swXS5uLiBUaGVyZSBpcyBubyBoYXJtIGluIHJlcGx5aW5nIHdpdGgKKyAgICAgICAgIGEgd29yZCBhbGwgdGhlIHRpbWUsIHNvIHRoYXRzIHdoYXQgSSBkbyEgKi8KKyAgICAgIHNlbmRfcmRwICgiYmJ3LSIsIFJEUF9PU09wUmVwbHksIFJEUF9PU09wV29yZCwgYXJnc1swXS5uKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzZW5kX3JkcCAoImJiLSIsIFJEUF9PU09wUmVwbHksIFJEUF9PU09wTm90aGluZyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcmRwX2V4ZWN1dGVfZmluaXNoICgpCit7CisgIGludCBydW5uaW5nID0gMTsKKworICB3aGlsZSAocnVubmluZykKKyAgICB7CisgICAgICBpbnQgcmVzOworICAgICAgcmVzID0gU0VSSUFMX1JFQURDSEFSIChpbywgMSk7CisgICAgICB3aGlsZSAocmVzID09IFNFUklBTF9USU1FT1VUKQorCXsKKwkgIFFVSVQ7CisJICBwcmludGZfZmlsdGVyZWQgKCJXYWl0aW5nIGZvciB0YXJnZXQuLlxuIik7CisJICByZXMgPSBTRVJJQUxfUkVBRENIQVIgKGlvLCAxKTsKKwl9CisKKyAgICAgIHN3aXRjaCAocmVzKQorCXsKKwljYXNlIFJEUF9SRVNfU1dJOgorCSAgaGFuZGxlX3N3aSAoKTsKKwkgIGJyZWFrOworCWNhc2UgUkRQX1JFU19WQUxVRToKKwkgIHNlbmRfcmRwICgiQiIsICZkcy5yZGlfc3RvcHBlZF9zdGF0dXMpOworCSAgcnVubmluZyA9IDA7CisJICBicmVhazsKKwljYXNlIFJEUF9SRVNFVDoKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlRhcmdldCByZXNldFxuIik7CisJICBydW5uaW5nID0gMDsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBwcmludGZfZmlsdGVyZWQgKCJJZ25vcmluZyAleFxuIiwgcmVzKTsKKwkgIGJyZWFrOworCX0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3JkcF9leGVjdXRlICgpCit7CisgIHJkcF9leGVjdXRlX3N0YXJ0ICgpOworICByZHBfZXhlY3V0ZV9maW5pc2ggKCk7Cit9CisKK3N0YXRpYyBpbnQKK3JlbW90ZV9yZHBfaW5zZXJ0X2JyZWFrcG9pbnQgKGFkZHIsIHNhdmUpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpzYXZlOworeworICBpbnQgcmVzOworICBpZiAoZHMucmRpX2xldmVsID4gMCkKKyAgICB7CisgICAgICBzZW5kX3JkcCAoImJ3Yi1TV0IiLAorCQlSRFBfU0VUX0JSRUFLLAorCQlhZGRyLAorCQlSRFBfU0VUX0JSRUFLX1RZUEVfUENfRVFVQUwgfCBSRFBfU0VUX0JSRUFLX1RZUEVfR0VUX0hBTkRMRSwKKwkJc2F2ZSwKKwkJJnJlcyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2VuZF9yZHAgKCJid2ItU0IiLAorCQlSRFBfU0VUX0JSRUFLLAorCQlhZGRyLAorCQlSRFBfU0VUX0JSRUFLX1RZUEVfUENfRVFVQUwsCisJCSZyZXMpOworICAgIH0KKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludAorcmVtb3RlX3JkcF9yZW1vdmVfYnJlYWtwb2ludCAoYWRkciwgc2F2ZSkKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGNoYXIgKnNhdmU7Cit7CisgIGludCByZXM7CisgIGlmIChkcy5yZGlfbGV2ZWwgPiAwKQorICAgIHsKKyAgICAgIHNlbmRfcmRwICgiYi1wLVMtQiIsCisJCVJEUF9DTEVBUl9CUkVBSywKKwkJc2F2ZSwgNCwKKwkJJnJlcyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2VuZF9yZHAgKCJidy1TLUIiLAorCQlSRFBfQ0xFQVJfQlJFQUssCisJCWFkZHIsCisJCSZyZXMpOworICAgIH0KKyAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQKK3JkcF9zdGVwICgpCit7CisgIGlmIChkcy5jYW5fc3RlcCAmJiAwKQorICAgIHsKKyAgICAgIC8qIFRoZSBwaWUgYm9hcmQgY2FuJ3QgZG8gc3RlcHMgc28gSSBjYW4ndCB0ZXN0IHRoaXMsIGFuZAorICAgICAgICAgdGhlIG90aGVyIGNvZGUgd2lsbCBhbHdheXMgd29yay4gKi8KKyAgICAgIGludCBzdGF0dXM7CisgICAgICBzZW5kX3JkcCAoImJidy1TLUIiLAorCQlSRFBfU1RFUCwgMCwgMSwKKwkJJnN0YXR1cyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciBoYW5kbGVbNF07CisgICAgICBDT1JFX0FERFIgcGMgPSByZWFkX3JlZ2lzdGVyIChQQ19SRUdOVU0pOworICAgICAgcGMgPSBhcm1fZ2V0X25leHRfcGMgKHBjKTsKKyAgICAgIHJlbW90ZV9yZHBfaW5zZXJ0X2JyZWFrcG9pbnQgKHBjLCAmaGFuZGxlKTsKKyAgICAgIHJkcF9leGVjdXRlICgpOworICAgICAgcmVtb3RlX3JkcF9yZW1vdmVfYnJlYWtwb2ludCAocGMsICZoYW5kbGUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3JlbW90ZV9yZHBfb3BlbiAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IG5vdF9pY2VicmVha2VyOworCisgIGlmICghYXJncykKKyAgICBlcnJvcl9ub19hcmcgKCJzZXJpYWwgcG9ydCBkZXZpY2UgbmFtZSIpOworCisgIGJhdWRfcmF0ZSA9IDk2MDA7CisKKyAgdGFyZ2V0X3ByZW9wZW4gKGZyb21fdHR5KTsKKworICBpbyA9IFNFUklBTF9PUEVOIChhcmdzKTsKKworICBpZiAoIWlvKQorICAgIHBlcnJvcl93aXRoX25hbWUgKGFyZ3MpOworCisgIFNFUklBTF9SQVcgKGlvKTsKKworICByZHBfaW5pdCAoMSwgZnJvbV90dHkpOworCisKKyAgaWYgKGZyb21fdHR5KQorICAgIHsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiUmVtb3RlIFJEUCBkZWJ1Z2dpbmcgdXNpbmcgJXMgYXQgJWQgYmF1ZFxuIiwgYXJncywgYmF1ZF9yYXRlKTsKKyAgICB9CisKKyAgcmRwX2luZm8gKCk7CisKKyAgLyogTmVlZCB0byBzZXQgdXAgdGhlIHZlY3RvciBpbnRlcmNlcHRpb24gc3RhdGUgKi8KKyAgcmRwX2NhdGNoX3ZlY3RvcnMoKTsKKworICAvKgorICAqKiBJZiBpdCdzIGFuIEVtYmVkZGVkSUNFLCB3ZSBuZWVkIHRvIHNldCB0aGUgcHJvY2Vzc29yIGNvbmZpZy4KKyAgKiogQXNzdW1lIHdlIGNhbiBhbHdheXMgaGF2ZSBBUk03VERJLi4uCisgICovCisgIHNlbmRfcmRwICgiYnctU0IiLCBSRFBfSU5GTywgUkRQX0lORk9fSUNFQlJFQUtFUiwgJiBub3RfaWNlYnJlYWtlcik7CisgIGlmICghbm90X2ljZWJyZWFrZXIpCisgICAgeworICAgICAgY29uc3QgY2hhciAqIENQVSA9ICJBUk03VERJIjsKKyAgICAgIGludCBJQ0V2ZXJzaW9uOworICAgICAgaW50IGxlbiA9IHN0cmxlbiAoQ1BVKTsKKyAgICAgIAorICAgICAgc2VuZF9yZHAgKCJiYmJidy1wLVNXWiIsCisJCVJEUF9TRUxFQ1RfQ09ORklHLAorCQlSRElfQ29uZmlnQ1BVLAkvKiBBc3BlY3Q6IHNldCB0aGUgQ1BVICovCisJCWxlbiwJCS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG5hbWUgKi8KKwkJUkRJX01hdGNoQW55LAkvKiBXZSdsbCB0YWtlIHdoYXRldmVyIHdlIGdldCAqLworCQkwLAkJLyogV2UnbGwgdGFrZSB3aGF0ZXZlciB2ZXJzaW9uJ3MgdGhlcmUgKi8KKwkJQ1BVLGxlbiwKKwkJJiBJQ0V2ZXJzaW9uKTsKKyAgICB9CisKKyAgLyogY29tbWFuZCBsaW5lIGluaXRpYWxpc2VkIG9uICdydW4nKi8KKworICBwdXNoX3RhcmdldCAoJiByZW1vdGVfcmRwX29wcyk7CisKKyAgY2FsbGJhY2stPmluaXQgKGNhbGxiYWNrKTsKKyAgZmx1c2hfY2FjaGVkX2ZyYW1lcyAoKTsKKyAgcmVnaXN0ZXJzX2NoYW5nZWQgKCk7CisgIHN0b3BfcGMgPSByZWFkX3BjICgpOworICBzZXRfY3VycmVudF9mcmFtZSAoY3JlYXRlX25ld19mcmFtZSAocmVhZF9mcCAoKSwgc3RvcF9wYykpOworICBzZWxlY3RfZnJhbWUgKGdldF9jdXJyZW50X2ZyYW1lICgpLCAwKTsKKyAgcHJpbnRfc3RhY2tfZnJhbWUgKHNlbGVjdGVkX2ZyYW1lLCAtMSwgMSk7Cit9CisKKworCisvKiBDbG9zZSBvdXQgYWxsIGZpbGVzIGFuZCBsb2NhbCBzdGF0ZSBiZWZvcmUgdGhpcyB0YXJnZXQgbG9zZXMgY29udHJvbC4gKi8KKworc3RhdGljIHZvaWQKK3JlbW90ZV9yZHBfY2xvc2UgKHF1aXR0aW5nKQorICAgICBpbnQgcXVpdHRpbmc7Cit7CisgIGNhbGxiYWNrLT5zaHV0ZG93biAoY2FsbGJhY2spOworICBpZiAoaW8pCisgICAgU0VSSUFMX0NMT1NFIChpbyk7CisgIGlvID0gMDsKK30KKworCisvKiBSZXN1bWUgZXhlY3V0aW9uIG9mIHRoZSB0YXJnZXQgcHJvY2Vzcy4gIFNURVAgc2F5cyB3aGV0aGVyIHRvIHNpbmdsZS1zdGVwCisgICBvciB0byBydW4gZnJlZTsgU0lHR05BTCBpcyB0aGUgc2lnbmFsIHZhbHVlIChlLmcuIFNJR0lOVCkgdG8gYmUgZ2l2ZW4KKyAgIHRvIHRoZSB0YXJnZXQsIG9yIHplcm8gZm9yIG5vIHNpZ25hbC4gICovCisKK3N0YXRpYyB2b2lkCityZW1vdGVfcmRwX3Jlc3VtZSAocGlkLCBzdGVwLCBzaWdnbmFsKQorICAgICBpbnQgcGlkLCBzdGVwOworICAgICBlbnVtIHRhcmdldF9zaWduYWwgc2lnZ25hbDsKK3sKKyAgaWYgKHN0ZXApCisgICAgcmRwX3N0ZXAgKCk7CisgIGVsc2UKKyAgICByZHBfZXhlY3V0ZSAoKTsKK30KKworLyogV2FpdCBmb3IgaW5mZXJpb3IgcHJvY2VzcyB0byBkbyBzb21ldGhpbmcuICBSZXR1cm4gcGlkIG9mIGNoaWxkLAorICAgb3IgLTEgaW4gY2FzZSBvZiBlcnJvcjsgc3RvcmUgc3RhdHVzIHRocm91Z2ggYXJndW1lbnQgcG9pbnRlciBTVEFUVVMsCisgICBqdXN0IGFzIGB3YWl0JyB3b3VsZC4gICovCisKK3N0YXRpYyBpbnQKK3JlbW90ZV9yZHBfd2FpdCAocGlkLCBzdGF0dXMpCisgICAgIGludCBwaWQ7CisgICAgIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqc3RhdHVzOworeworICBzd2l0Y2ggKGRzLnJkaV9zdG9wcGVkX3N0YXR1cykKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIFJEUF9SRVNfUkVTRVQ6CisgICAgY2FzZSBSRFBfUkVTX1NXSToKKyAgICAgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9FWElURUQ7CisgICAgICBzdGF0dXMtPnZhbHVlLmludGVnZXIgPSByZWFkX3JlZ2lzdGVyICgwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUkRQX1JFU19BVF9CUkVBS1BPSU5UOgorICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisgICAgICAvKiBUaGUgc2lnbmFsIGluIHNpZ3JjIGlzIGEgaG9zdCBzaWduYWwuICBUaGF0IHByb2JhYmx5CisgICAgICAgICBzaG91bGQgYmUgZml4ZWQuICAqLworICAgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1RSQVA7CisgICAgICBicmVhazsKKyNpZiAwCisgICAgY2FzZSByZHBfc2lnbmFsbGVkOgorICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NJR05BTExFRDsKKyAgICAgIC8qIFRoZSBzaWduYWwgaW4gc2lncmMgaXMgYSBob3N0IHNpZ25hbC4gIFRoYXQgcHJvYmFibHkKKyAgICAgICAgIHNob3VsZCBiZSBmaXhlZC4gICovCisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IHRhcmdldF9zaWduYWxfZnJvbV9ob3N0IChzaWdyYyk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIH0KKworICByZXR1cm4gaW5mZXJpb3JfcGlkOworfQorCisvKiBHZXQgcmVhZHkgdG8gbW9kaWZ5IHRoZSByZWdpc3RlcnMgYXJyYXkuICBPbiBtYWNoaW5lcyB3aGljaCBzdG9yZQorICAgaW5kaXZpZHVhbCByZWdpc3RlcnMsIHRoaXMgZG9lc24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLiAgT24gbWFjaGluZXMKKyAgIHdoaWNoIHN0b3JlIGFsbCB0aGUgcmVnaXN0ZXJzIGluIG9uZSBmZWxsIHN3b29wLCB0aGlzIG1ha2VzIHN1cmUKKyAgIHRoYXQgcmVnaXN0ZXJzIGNvbnRhaW5zIGFsbCB0aGUgcmVnaXN0ZXJzIGZyb20gdGhlIHByb2dyYW0gYmVpbmcKKyAgIGRlYnVnZ2VkLiAgKi8KKworc3RhdGljIHZvaWQKK3JlbW90ZV9yZHBfcHJlcGFyZV90b19zdG9yZSAoKQoreworICAvKiBEbyBub3RoaW5nLCBzaW5jZSB3ZSBjYW4gc3RvcmUgaW5kaXZpZHVhbCByZWdzICovCit9CisKK3N0YXRpYyBpbnQKK3JlbW90ZV9yZHBfeGZlcl9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuLCB3cml0ZSwgdGFyZ2V0KQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworICAgICBpbnQgd3JpdGU7CisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQ7CS8qIGlnbm9yZWQgKi8KK3sKKyAgLyogSSBpbmZlciBmcm9tIEQgVGF5bG9yJ3MgY29kZSB0aGF0IHRoZXJlJ3MgYSBsaW1pdCBvbiB0aGUgYW1vdW50CisgICAgIHdlIGNhbiB0cmFuc2ZlciBpbiBvbmUgY2h1bmsuLiAqLworICBpbnQgZG9uZSA9IDA7CisgIHdoaWxlIChkb25lIDwgbGVuKQorICAgIHsKKyAgICAgIGludCBqdXN0ZG9uZTsKKyAgICAgIGludCB0aGlzYml0ZSA9IGxlbiAtIGRvbmU7CisgICAgICBpZiAodGhpc2JpdGUgPiBSRFBfTU9VVEhGVUxMKQorCXRoaXNiaXRlID0gUkRQX01PVVRIRlVMTDsKKworICAgICAgUVVJVDsKKworICAgICAgaWYgKHdyaXRlKQorCXsKKwkgIGp1c3Rkb25lID0gcmRwX3dyaXRlIChtZW1hZGRyICsgZG9uZSwgbXlhZGRyICsgZG9uZSwgdGhpc2JpdGUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBqdXN0ZG9uZSA9IHJkcF9yZWFkIChtZW1hZGRyICsgZG9uZSwgbXlhZGRyICsgZG9uZSwgdGhpc2JpdGUpOworCX0KKworICAgICAgZG9uZSArPSBqdXN0ZG9uZTsKKworICAgICAgaWYgKGp1c3Rkb25lICE9IHRoaXNiaXRlKQorCWJyZWFrOworICAgIH0KKyAgcmV0dXJuIGRvbmU7Cit9CisKKworCitzdHJ1Y3QgeW4KK3sKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgaW50IGJpdDsKK307CitzdGF0aWMgc3RydWN0IHluIHN0ZXBpbmZvW10gPQoreworICB7IlN0ZXAgbW9yZSB0aGFuIG9uZSBpbnN0cnVjdGlvbiIsIFJEUF9JTkZPX0FCT1VUX1NURVBfR1RfMX0sCisgIHsiU3RlcCB0byBqdW1wIiwgUkRQX0lORk9fQUJPVVRfU1RFUF9UT19KTVB9LAorICB7IlN0ZXAgb25lIGluc3RydWN0aW9uIiwgUkRQX0lORk9fQUJPVVRfU1RFUF8xfSwKKyAgezB9Cit9OworCitzdGF0aWMgc3RydWN0IHluIGJyZWFraW5mb1tdID0KK3sKKyAgeyJjb21wYXJpc29uIGJyZWFrcG9pbnRzIHN1cHBvcnRlZCIsIFJEUF9JTkZPX0FCT1VUX0JSRUFLX0NPTVB9LAorICB7InJhbmdlIGJyZWFrcG9pbnRzIHN1cHBvcnRlZCIsIFJEUF9JTkZPX0FCT1VUX0JSRUFLX1JBTkdFfSwKKyAgeyJ3YXRjaHBvaW50cyBmb3IgYnl0ZSByZWFkcyBzdXBwb3J0ZWQiLCBSRFBfSU5GT19BQk9VVF9CUkVBS19CWVRFX1JFQUR9LAorICB7IndhdGNocG9pbnRzIGZvciBoYWxmLXdvcmQgcmVhZHMgc3VwcG9ydGVkIiwgUkRQX0lORk9fQUJPVVRfQlJFQUtfSEFMRldPUkRfUkVBRH0sCisgIHsid2F0Y2hwb2ludHMgZm9yIHdvcmQgcmVhZHMgc3VwcG9ydGVkIiwgUkRQX0lORk9fQUJPVVRfQlJFQUtfV09SRF9SRUFEfSwKKyAgeyJ3YXRjaHBvaW50cyBmb3IgYnl0ZSB3cml0ZXMgc3VwcG9ydGVkIiwgUkRQX0lORk9fQUJPVVRfQlJFQUtfQllURV9XUklURX0sCisgIHsid2F0Y2hwb2ludHMgZm9yIGhhbGYtd29yZCB3cml0ZXMgc3VwcG9ydGVkIiwgUkRQX0lORk9fQUJPVVRfQlJFQUtfSEFMRldPUkRfV1JJVEV9LAorICB7IndhdGNocG9pbnRzIGZvciB3b3JkIHdyaXRlcyBzdXBwb3J0ZWQiLCBSRFBfSU5GT19BQk9VVF9CUkVBS19XT1JEX1dSSVRFfSwKKyAgeyJtYXNrIGJyZWFrL3dhdGNoLXBvaW50cyBzdXBwb3J0ZWQiLCBSRFBfSU5GT19BQk9VVF9CUkVBS19NQVNLfSwKK3sidGhyZWFkLXNwZWNpZmljIGJyZWFrcG9pbnRzIHN1cHBvcnRlZCIsIFJEUF9JTkZPX0FCT1VUX0JSRUFLX1RIUkVBRF9CUkVBS30sCit7InRocmVhZC1zcGVjaWZpYyB3YXRjaHBvaW50cyBzdXBwb3J0ZWQiLCBSRFBfSU5GT19BQk9VVF9CUkVBS19USFJFQURfV0FUQ0h9LAorICB7ImNvbmRpdGlvbmFsIGJyZWFrcG9pbnRzIHN1cHBvcnRlZCIsIFJEUF9JTkZPX0FCT1VUX0JSRUFLX0NPTkR9LAorICB7MH0KK307CisKKworc3RhdGljIHZvaWQKK2R1bXBfYml0cyAodCwgaW5mbykKKyAgICAgc3RydWN0IHluICp0OworICAgICBpbnQgaW5mbzsKK3sKKyAgd2hpbGUgKHQtPm5hbWUpCisgICAgeworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCIgICUtNDVzIDogJXNcbiIsIHQtPm5hbWUsIChpbmZvICYgdC0+Yml0KSA/ICJZZXMiIDogIk5vIik7CisgICAgICB0Kys7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcmVtb3RlX3JkcF9maWxlc19pbmZvICh0YXJnZXQpCisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQ7Cit7CisgIHByaW50Zl9maWx0ZXJlZCAoIlRhcmdldCBjYXBhYmlsaXRpZXM6XG4iKTsKKyAgZHVtcF9iaXRzIChzdGVwaW5mbywgZHMuc3RlcF9pbmZvKTsKKyAgZHVtcF9iaXRzIChicmVha2luZm8sIGRzLmJyZWFrX2luZm8pOworICBwcmludGZfdW5maWx0ZXJlZCAoInRhcmdldCBsZXZlbCBSREkgJXhcbiIsIChkcy50YXJnZXRfaW5mbyA+PiA1KSAmIDMpOworfQorCisKK3N0YXRpYyB2b2lkCityZW1vdGVfcmRwX2NyZWF0ZV9pbmZlcmlvciAoZXhlY19maWxlLCBhbGxhcmdzLCBlbnYpCisgICAgIGNoYXIgKiAgZXhlY19maWxlOworICAgICBjaGFyICogIGFsbGFyZ3M7CisgICAgIGNoYXIgKiogZW52OworeworICBDT1JFX0FERFIgZW50cnlfcG9pbnQ7CisKKyAgaWYgKGV4ZWNfZmlsZSA9PSAwIHx8IGV4ZWNfYmZkID09IDApCisgICBlcnJvciAoIk5vIGV4ZWN1dGFibGUgZmlsZSBzcGVjaWZpZWQuIik7CisKKyAgZW50cnlfcG9pbnQgPSAoQ09SRV9BRERSKSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGV4ZWNfYmZkKTsKKworICByZW1vdGVfcmRwX2tpbGwgKCk7CSAKKyAgcmVtb3ZlX2JyZWFrcG9pbnRzICgpOworICBpbml0X3dhaXRfZm9yX2luZmVyaW9yICgpOworCisgIC8qIFRoaXMgZ2l2ZXMgdXMgYSBjaGFuY2UgdG8gc2V0IHVwIHRoZSBjb21tYW5kIGxpbmUgKi8KKyAgcmRwX3NldF9jb21tYW5kX2xpbmUgKGV4ZWNfZmlsZSwgYWxsYXJncyk7CisKKyAgaW5mZXJpb3JfcGlkID0gNDI7CisgIGluc2VydF9icmVha3BvaW50cyAoKTsgIC8qIE5lZWRlZCB0byBnZXQgY29ycmVjdCBpbnN0cnVjdGlvbiBpbiBjYWNoZSAqLworCisgIC8qCisgICoqIFJEUCB0YXJnZXRzIGRvbid0IHByb3ZpZGUgYW55IGZhY2lsaXR5IHRvIHNldCB0aGUgdG9wIG9mIG1lbW9yeSwKKyAgKiogc28gd2UgZG9uJ3QgYm90aGVyIHRvIGxvb2sgZm9yIE1FTVNJWkUgaW4gdGhlIGVudmlyb25tZW50LgorICAqLworCisgIC8qIExldCdzIGdvISAqLworICBwcm9jZWVkIChlbnRyeV9wb2ludCwgVEFSR0VUX1NJR05BTF9ERUZBVUxULCAwKTsKK30KKworLyogQWNjZXB0IGFueSBzdHJheSBydW4vYXR0YWNoIGNvbW1hbmRzICovCitzdGF0aWMgaW50CityZW1vdGVfcmRwX2Nhbl9ydW4oKQoreworICByZXR1cm4gMTsKK30KKworLyogQXR0YWNoIGRvZXNuJ3QgbmVlZCB0byBkbyBhbnl0aGluZyAqLworc3RhdGljIHZvaWQKK3JlbW90ZV9yZHBfYXR0YWNoKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICogYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICByZXR1cm47Cit9CisgIAorLyogRGVmaW5lIHRoZSB0YXJnZXQgc3Vicm91dGluZSBuYW1lcyAqLworCitzdHJ1Y3QgdGFyZ2V0X29wcyByZW1vdGVfcmRwX29wcyA7CisKK3N0YXRpYyB2b2lkIAoraW5pdF9yZW1vdGVfcmRwX29wcyh2b2lkKQoreworICByZW1vdGVfcmRwX29wcy50b19zaG9ydG5hbWUgPSAgICJyZHAiOworICByZW1vdGVfcmRwX29wcy50b19sb25nbmFtZSA9ICAgIlJlbW90ZSBUYXJnZXQgdXNpbmcgdGhlIFJEUHJvdG9jb2wiOworICByZW1vdGVfcmRwX29wcy50b19kb2MgPSAgICJVc2UgYSByZW1vdGUgQVJNIHN5c3RlbSB3aGljaCB1c2VzIHRoZSBBUk0gUmVtb3RlIERlYnVnZ2luZyBQcm90b2NvbCI7CisgIHJlbW90ZV9yZHBfb3BzLnRvX29wZW4gPSAgIHJlbW90ZV9yZHBfb3BlbjsJCisgIHJlbW90ZV9yZHBfb3BzLnRvX2Nsb3NlID0gICByZW1vdGVfcmRwX2Nsb3NlOwkKKyAgcmVtb3RlX3JkcF9vcHMudG9fYXR0YWNoID0gICByZW1vdGVfcmRwX2F0dGFjaDsKKyAgcmVtb3RlX3JkcF9vcHMudG9fcG9zdF9hdHRhY2ggPSBOVUxMOworICByZW1vdGVfcmRwX29wcy50b19yZXF1aXJlX2F0dGFjaCA9IE5VTEw7CisgIHJlbW90ZV9yZHBfb3BzLnRvX2RldGFjaCA9ICAgTlVMTDsKKyAgcmVtb3RlX3JkcF9vcHMudG9fcmVxdWlyZV9kZXRhY2ggPSBOVUxMOwkJCisgIHJlbW90ZV9yZHBfb3BzLnRvX3Jlc3VtZSA9ICAgcmVtb3RlX3JkcF9yZXN1bWU7CisgIHJlbW90ZV9yZHBfb3BzLnRvX3dhaXQgID0gICByZW1vdGVfcmRwX3dhaXQ7CisgIHJlbW90ZV9yZHBfb3BzLnRvX3Bvc3Rfd2FpdCA9IE5VTEw7CQorICByZW1vdGVfcmRwX29wcy50b19mZXRjaF9yZWdpc3RlcnMgID0gICByZW1vdGVfcmRwX2ZldGNoX3JlZ2lzdGVyOworICByZW1vdGVfcmRwX29wcy50b19zdG9yZV9yZWdpc3RlcnMgID0gICByZW1vdGVfcmRwX3N0b3JlX3JlZ2lzdGVyOworICByZW1vdGVfcmRwX29wcy50b19wcmVwYXJlX3RvX3N0b3JlID0gICByZW1vdGVfcmRwX3ByZXBhcmVfdG9fc3RvcmU7CisgIHJlbW90ZV9yZHBfb3BzLnRvX3hmZXJfbWVtb3J5ICA9ICAgcmVtb3RlX3JkcF94ZmVyX2luZmVyaW9yX21lbW9yeTsKKyAgcmVtb3RlX3JkcF9vcHMudG9fZmlsZXNfaW5mbyAgPSAgIHJlbW90ZV9yZHBfZmlsZXNfaW5mbzsKKyAgcmVtb3RlX3JkcF9vcHMudG9faW5zZXJ0X2JyZWFrcG9pbnQgPSAgIHJlbW90ZV9yZHBfaW5zZXJ0X2JyZWFrcG9pbnQ7CisgIHJlbW90ZV9yZHBfb3BzLnRvX3JlbW92ZV9icmVha3BvaW50ID0gICByZW1vdGVfcmRwX3JlbW92ZV9icmVha3BvaW50OworICByZW1vdGVfcmRwX29wcy50b190ZXJtaW5hbF9pbml0ICA9ICAgTlVMTDsJCQorICByZW1vdGVfcmRwX29wcy50b190ZXJtaW5hbF9pbmZlcmlvciA9ICAgTlVMTDsJCQorICByZW1vdGVfcmRwX29wcy50b190ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgPSAgIE5VTEw7CisgIHJlbW90ZV9yZHBfb3BzLnRvX3Rlcm1pbmFsX291cnMgID0gICBOVUxMOwkKKyAgcmVtb3RlX3JkcF9vcHMudG9fdGVybWluYWxfaW5mbyAgPSAgIE5VTEw7CQorICByZW1vdGVfcmRwX29wcy50b19raWxsICA9ICAgcmVtb3RlX3JkcF9raWxsOwkKKyAgcmVtb3RlX3JkcF9vcHMudG9fbG9hZCAgPSAgIGdlbmVyaWNfbG9hZDsJCisgIHJlbW90ZV9yZHBfb3BzLnRvX2xvb2t1cF9zeW1ib2wgPSAgIE5VTEw7CQkJCQorICByZW1vdGVfcmRwX29wcy50b19jcmVhdGVfaW5mZXJpb3IgPSAgIHJlbW90ZV9yZHBfY3JlYXRlX2luZmVyaW9yOworICByZW1vdGVfcmRwX29wcy50b19wb3N0X3N0YXJ0dXBfaW5mZXJpb3IgPSBOVUxMOworICByZW1vdGVfcmRwX29wcy50b19hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yID0gTlVMTDsKKyAgcmVtb3RlX3JkcF9vcHMudG9fY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciA9IE5VTEw7CisgIHJlbW90ZV9yZHBfb3BzLnRvX3Bvc3RfZm9sbG93X2luZmVyaW9yX2J5X2Nsb25lID0gTlVMTDsKKyAgcmVtb3RlX3JkcF9vcHMudG9faW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIHJlbW90ZV9yZHBfb3BzLnRvX3JlbW92ZV9mb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICByZW1vdGVfcmRwX29wcy50b19pbnNlcnRfdmZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIHJlbW90ZV9yZHBfb3BzLnRvX3JlbW92ZV92Zm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgcmVtb3RlX3JkcF9vcHMudG9faGFzX2ZvcmtlZCA9IE5VTEw7CisgIHJlbW90ZV9yZHBfb3BzLnRvX2hhc192Zm9ya2VkID0gTlVMTDsKKyAgcmVtb3RlX3JkcF9vcHMudG9fY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjID0gTlVMTDsKKyAgcmVtb3RlX3JkcF9vcHMudG9fcG9zdF9mb2xsb3dfdmZvcmsgPSBOVUxMOworICByZW1vdGVfcmRwX29wcy50b19pbnNlcnRfZXhlY19jYXRjaHBvaW50ID0gTlVMTDsKKyAgcmVtb3RlX3JkcF9vcHMudG9fcmVtb3ZlX2V4ZWNfY2F0Y2hwb2ludCA9IE5VTEw7CisgIHJlbW90ZV9yZHBfb3BzLnRvX2hhc19leGVjZCA9IE5VTEw7CisgIHJlbW90ZV9yZHBfb3BzLnRvX3JlcG9ydGVkX2V4ZWNfZXZlbnRzX3Blcl9leGVjX2NhbGwgPSBOVUxMOworICByZW1vdGVfcmRwX29wcy50b19oYXNfZXhpdGVkID0gTlVMTDsKKyAgcmVtb3RlX3JkcF9vcHMudG9fbW91cm5faW5mZXJpb3IgPSAgIGdlbmVyaWNfbW91cm5faW5mZXJpb3I7CisgIHJlbW90ZV9yZHBfb3BzLnRvX2Nhbl9ydW4gID0gICByZW1vdGVfcmRwX2Nhbl9ydW47CisgIHJlbW90ZV9yZHBfb3BzLnRvX25vdGljZV9zaWduYWxzID0gICAwOwkKKyAgcmVtb3RlX3JkcF9vcHMudG9fdGhyZWFkX2FsaXZlICA9ICAgMDsJCisgIHJlbW90ZV9yZHBfb3BzLnRvX3N0b3AgID0gICAwOworICByZW1vdGVfcmRwX29wcy50b19waWRfdG9fZXhlY19maWxlID0gTlVMTDsKKyAgcmVtb3RlX3JkcF9vcHMudG9fY29yZV9maWxlX3RvX3N5bV9maWxlID0gTlVMTDsJCQorICByZW1vdGVfcmRwX29wcy50b19zdHJhdHVtID0gICBwcm9jZXNzX3N0cmF0dW07CisgIHJlbW90ZV9yZHBfb3BzLkRPTlRfVVNFID0gICBOVUxMOwkJCisgIHJlbW90ZV9yZHBfb3BzLnRvX2hhc19hbGxfbWVtb3J5ID0gICAxOwkKKyAgcmVtb3RlX3JkcF9vcHMudG9faGFzX21lbW9yeSA9ICAgMTsJCQorICByZW1vdGVfcmRwX29wcy50b19oYXNfc3RhY2sgPSAgIDE7CQkKKyAgcmVtb3RlX3JkcF9vcHMudG9faGFzX3JlZ2lzdGVycyA9ICAgMTsJCisgIHJlbW90ZV9yZHBfb3BzLnRvX2hhc19leGVjdXRpb24gPSAgIDE7CQorICByZW1vdGVfcmRwX29wcy50b19zZWN0aW9ucyA9ICAgTlVMTDsJCQorICByZW1vdGVfcmRwX29wcy50b19zZWN0aW9uc19lbmQgPSAgIE5VTEw7CisgIHJlbW90ZV9yZHBfb3BzLnRvX21hZ2ljID0gICBPUFNfTUFHSUM7Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX3JlbW90ZV9yZHAgKCkKK3sKKyAgaW5pdF9yZW1vdGVfcmRwX29wcygpIDsKKyAgYWRkX3RhcmdldCAoJnJlbW90ZV9yZHBfb3BzKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9yZW1vdGUtc2RzLmMgYi9nZGIvcmVtb3RlLXNkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYjVmNDQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmVtb3RlLXNkcy5jCkBAIC0wLDAgKzEsMTIwNiBAQAorLyogUmVtb3RlIHRhcmdldCBjb21tdW5pY2F0aW9ucyBmb3Igc2VyaWFsLWxpbmUgdGFyZ2V0cyB1c2luZyBTRFMnIHByb3RvY29sLgorICAgQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBpbnRlcmZhY2Ugd2FzIHdyaXR0ZW4gYnkgc3R1ZHlpbmcgdGhlIGJlaGF2aW9yIG9mIHRoZSBTRFMKKyAgIG1vbml0b3Igb24gYW4gQURTIDgyMS84NjAgYm9hcmQsIGFuZCBieSBjb25zdWx0aW5nIHRoZQorICAgZG9jdW1lbnRhdGlvbiBvZiB0aGUgbW9uaXRvciB0aGF0IGlzIGF2YWlsYWJsZSBvbiBNb3Rvcm9sYSdzIHdlYgorICAgc2l0ZS4gIC1zdHMgOC8xMy85NyAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAid2FpdC5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgIm9iamZpbGVzLmgiCisjaW5jbHVkZSAiZ2RiLXN0YWJzLmgiCisjaW5jbHVkZSAiZ2RidGhyZWFkLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImRjYWNoZS5oIgorCisjaWZkZWYgVVNHCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgInNlcmlhbC5oIgorCitleHRlcm4gdm9pZCBfaW5pdGlhbGl6ZV9yZW1vdGVfc2RzIFBBUkFNUyAoKHZvaWQpKTsKKworLyogRGVjbGFyYXRpb25zIG9mIGxvY2FsIGZ1bmN0aW9ucy4gKi8KKworc3RhdGljIGludCBzZHNfd3JpdGVfYnl0ZXMgUEFSQU1TICgoQ09SRV9BRERSLCBjaGFyICosIGludCkpOworCitzdGF0aWMgaW50IHNkc19yZWFkX2J5dGVzIFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgc2RzX2ZpbGVzX2luZm8gUEFSQU1TICgoc3RydWN0IHRhcmdldF9vcHMgKmlnbm9yZSkpOworCitzdGF0aWMgaW50IHNkc194ZmVyX21lbW9yeSBQQVJBTVMgKChDT1JFX0FERFIsIGNoYXIgKiwKKwkJCQkgICAgaW50LCBpbnQsIHN0cnVjdCB0YXJnZXRfb3BzICopKTsKKworc3RhdGljIHZvaWQgc2RzX3ByZXBhcmVfdG9fc3RvcmUgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZCBzZHNfZmV0Y2hfcmVnaXN0ZXJzIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgdm9pZCBzZHNfcmVzdW1lIFBBUkFNUyAoKGludCwgaW50LCBlbnVtIHRhcmdldF9zaWduYWwpKTsKKworc3RhdGljIGludCBzZHNfc3RhcnRfcmVtb3RlIFBBUkFNUyAoKFBUUikpOworCitzdGF0aWMgdm9pZCBzZHNfb3BlbiBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBzZHNfY2xvc2UgUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyB2b2lkIHNkc19zdG9yZV9yZWdpc3RlcnMgUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyB2b2lkIHNkc19tb3VybiBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIHNkc19jcmVhdGVfaW5mZXJpb3IgUEFSQU1TICgoY2hhciAqLCBjaGFyICosIGNoYXIgKiopKTsKKworc3RhdGljIHZvaWQgc2RzX2xvYWQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIGludCBnZXRtZXNzYWdlIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyBpbnQgcHV0bWVzc2FnZSBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCkpOworCitzdGF0aWMgaW50IHNkc19zZW5kIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyBpbnQgcmVhZGNoYXIgUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyBpbnQgc2RzX3dhaXQgUEFSQU1TICgoaW50LCBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKikpOworCitzdGF0aWMgdm9pZCBzZHNfa2lsbCBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyBpbnQgdG9oZXggUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyBpbnQgZnJvbWhleCBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIHZvaWQgc2RzX2RldGFjaCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBzZHNfaW50ZXJydXB0IFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgdm9pZCBzZHNfaW50ZXJydXB0X3R3aWNlIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgdm9pZCBpbnRlcnJ1cHRfcXVlcnkgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgaW50IHJlYWRfZnJhbWUgUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyBpbnQgc2RzX2luc2VydF9icmVha3BvaW50IFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqKSk7CisKK3N0YXRpYyBpbnQgc2RzX3JlbW92ZV9icmVha3BvaW50IFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqKSk7CisKK3N0YXRpYyB2b2lkIGluaXRfc2RzX29wcyBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIHNkc19jb21tYW5kIFBBUkFNUyAoKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkpOworCisvKiBEZWZpbmUgdGhlIHRhcmdldCBvcGVyYXRpb25zIHZlY3Rvci4gKi8KKworc3RhdGljIHN0cnVjdCB0YXJnZXRfb3BzIHNkc19vcHM7CisKKy8qIFRoaXMgd2FzIDUgc2Vjb25kcywgd2hpY2ggaXMgYSBsb25nIHRpbWUgdG8gc2l0IGFuZCB3YWl0LgorICAgVW5sZXNzIHRoaXMgaXMgZ29pbmcgdGhvdWdoIHNvbWUgdGVybWluYWwgc2VydmVyIG9yIG11bHRpcGxleGVyIG9yCisgICBvdGhlciBmb3JtIG9mIGhhaXJ5IHNlcmlhbCBjb25uZWN0aW9uLCBJIHdvdWxkIHRoaW5rIDIgc2Vjb25kcyB3b3VsZAorICAgYmUgcGxlbnR5LiAgKi8KKworc3RhdGljIGludCBzZHNfdGltZW91dCA9IDI7CisKKy8qIERlc2NyaXB0b3IgZm9yIEkvTyB0byByZW1vdGUgbWFjaGluZS4gIEluaXRpYWxpemUgaXQgdG8gTlVMTCBzbworICAgdGhhdCBzZHNfb3BlbiBrbm93cyB0aGF0IHdlIGRvbid0IGhhdmUgYSBmaWxlIG9wZW4gd2hlbiB0aGUgcHJvZ3JhbQorICAgc3RhcnRzLiAgKi8KKworc3RhdGljIHNlcmlhbF90IHNkc19kZXNjID0gTlVMTDsKKworLyogVGhpcyBsaW1pdCBjb21lcyBmcm9tIHRoZSBtb25pdG9yLiAgKi8KKworI2RlZmluZQlQQlVGU0laCTI1MAorCisvKiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkL3dyaXRlIGF0IG9uY2UuICBUaGUgdmFsdWUgaGVyZQorICAgaXMgY2hvc2VuIHRvIGZpbGwgdXAgYSBwYWNrZXQgKHRoZSBoZWFkZXJzIGFjY291bnQgZm9yIHRoZSAzMikuICAqLworI2RlZmluZSBNQVhCVUZCWVRFUyAoKFBCVUZTSVotMzIpLzIpCisKK3N0YXRpYyBpbnQgbmV4dF9tc2dfaWQ7CisKK3N0YXRpYyBpbnQganVzdF9zdGFydGVkOworCitzdGF0aWMgaW50IG1lc3NhZ2VfcGVuZGluZzsKKworDAorLyogQ2xlYW4gdXAgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBkZWJ1Z2dlci4gICovCisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorc2RzX2Nsb3NlIChxdWl0dGluZykKKyAgICAgaW50IHF1aXR0aW5nOworeworICBpZiAoc2RzX2Rlc2MpCisgICAgU0VSSUFMX0NMT1NFIChzZHNfZGVzYyk7CisgIHNkc19kZXNjID0gTlVMTDsKK30KKworLyogU3R1YiBmb3IgY2F0Y2hfZXJyb3JzLiAgKi8KKworc3RhdGljIGludAorc2RzX3N0YXJ0X3JlbW90ZSAoZHVtbXkpCisgICAgIFBUUiBkdW1teTsKK3sKKyAgY2hhciBjOworICB1bnNpZ25lZCBjaGFyIGJ1ZlsyMDBdOworCisgIGltbWVkaWF0ZV9xdWl0ID0gMTsJCS8qIEFsbG93IHVzZXIgdG8gaW50ZXJydXB0IGl0ICovCisKKyAgLyogQWNrIGFueSBwYWNrZXQgd2hpY2ggdGhlIHJlbW90ZSBzaWRlIGhhcyBhbHJlYWR5IHNlbnQuICAqLworICBTRVJJQUxfV1JJVEUgKHNkc19kZXNjLCAieyMqXHJcbiIsIDUpOworICBTRVJJQUxfV1JJVEUgKHNkc19kZXNjLCAieyN9XHJcbiIsIDUpOworCisgIHdoaWxlICgoYyA9IHJlYWRjaGFyICgxKSkgPj0gMCkKKyAgICBwcmludGZfdW5maWx0ZXJlZCAoIiVjIiwgYyk7CisgIHByaW50Zl91bmZpbHRlcmVkICgiXG4iKTsKKworICBuZXh0X21zZ19pZCA9IDI1MTsKKworICBidWZbMF0gPSAyNjsKKyAgc2RzX3NlbmQgKGJ1ZiwgMSk7CisKKyAgYnVmWzBdID0gMDsKKyAgc2RzX3NlbmQgKGJ1ZiwgMSk7CisKKyAgaW1tZWRpYXRlX3F1aXQgPSAwOworCisgIHN0YXJ0X3JlbW90ZSAoKTsJCS8qIEluaXRpYWxpemUgZ2RiIHByb2Nlc3MgbWVjaGFuaXNtcyAqLworICByZXR1cm4gMTsKK30KKworLyogT3BlbiBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgZGVidWdnZXIuCisgICBOQU1FIGlzIHRoZSBmaWxlbmFtZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uLiAgKi8KKworc3RhdGljIERDQUNIRSAqc2RzX2RjYWNoZTsKKworc3RhdGljIHZvaWQKK3Nkc19vcGVuIChuYW1lLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAobmFtZSA9PSAwKQorICAgIGVycm9yICgiVG8gb3BlbiBhIHJlbW90ZSBkZWJ1ZyBjb25uZWN0aW9uLCB5b3UgbmVlZCB0byBzcGVjaWZ5IHdoYXQgc2VyaWFsXG5cCitkZXZpY2UgaXMgYXR0YWNoZWQgdG8gdGhlIHJlbW90ZSBzeXN0ZW0gKGUuZy4gL2Rldi90dHlhKS4iKTsKKworICB0YXJnZXRfcHJlb3BlbiAoZnJvbV90dHkpOworCisgIHVucHVzaF90YXJnZXQgKCZzZHNfb3BzKTsKKworICBzZHNfZGNhY2hlID0gZGNhY2hlX2luaXQgKHNkc19yZWFkX2J5dGVzLCBzZHNfd3JpdGVfYnl0ZXMpOworCisgIHNkc19kZXNjID0gU0VSSUFMX09QRU4gKG5hbWUpOworICBpZiAoIXNkc19kZXNjKQorICAgIHBlcnJvcl93aXRoX25hbWUgKG5hbWUpOworCisgIGlmIChiYXVkX3JhdGUgIT0gLTEpCisgICAgeworICAgICAgaWYgKFNFUklBTF9TRVRCQVVEUkFURSAoc2RzX2Rlc2MsIGJhdWRfcmF0ZSkpCisJeworCSAgU0VSSUFMX0NMT1NFIChzZHNfZGVzYyk7CisJICBwZXJyb3Jfd2l0aF9uYW1lIChuYW1lKTsKKwl9CisgICAgfQorCisKKyAgU0VSSUFMX1JBVyAoc2RzX2Rlc2MpOworCisgIC8qIElmIHRoZXJlIGlzIHNvbWV0aGluZyBzaXR0aW5nIGluIHRoZSBidWZmZXIgd2UgbWlnaHQgdGFrZSBpdCBhcyBhCisgICAgIHJlc3BvbnNlIHRvIGEgY29tbWFuZCwgd2hpY2ggd291bGQgYmUgYmFkLiAgKi8KKyAgU0VSSUFMX0ZMVVNIX0lOUFVUIChzZHNfZGVzYyk7CisKKyAgaWYgKGZyb21fdHR5KQorICAgIHsKKyAgICAgIHB1dHNfZmlsdGVyZWQgKCJSZW1vdGUgZGVidWdnaW5nIHVzaW5nICIpOworICAgICAgcHV0c19maWx0ZXJlZCAobmFtZSk7CisgICAgICBwdXRzX2ZpbHRlcmVkICgiXG4iKTsKKyAgICB9CisgIHB1c2hfdGFyZ2V0ICgmc2RzX29wcyk7CS8qIFN3aXRjaCB0byB1c2luZyByZW1vdGUgdGFyZ2V0IG5vdyAqLworCisgIGp1c3Rfc3RhcnRlZCA9IDE7CisKKyAgLyogU3RhcnQgdGhlIHJlbW90ZSBjb25uZWN0aW9uOyBpZiBlcnJvciAoMCksIGRpc2NhcmQgdGhpcyB0YXJnZXQuCisgICAgIEluIHBhcnRpY3VsYXIsIGlmIHRoZSB1c2VyIHF1aXRzLCBiZSBzdXJlIHRvIGRpc2NhcmQgaXQgKHdlJ2QgYmUKKyAgICAgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlIG90aGVyd2lzZSkuICAqLworICBpZiAoIWNhdGNoX2Vycm9ycyAoc2RzX3N0YXJ0X3JlbW90ZSwgTlVMTCwgCisJCSAgICAgIkNvdWxkbid0IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHJlbW90ZSB0YXJnZXRcbiIsCisJCSAgICAgUkVUVVJOX01BU0tfQUxMKSkKKyAgICBwb3BfdGFyZ2V0ICgpOworfQorCisvKiBUaGlzIHRha2VzIGEgcHJvZ3JhbSBwcmV2aW91c2x5IGF0dGFjaGVkIHRvIGFuZCBkZXRhY2hlcyBpdC4gIEFmdGVyCisgICB0aGlzIGlzIGRvbmUsIEdEQiBjYW4gYmUgdXNlZCB0byBkZWJ1ZyBzb21lIG90aGVyIHByb2dyYW0uICBXZQorICAgYmV0dGVyIG5vdCBoYXZlIGxlZnQgYW55IGJyZWFrcG9pbnRzIGluIHRoZSB0YXJnZXQgcHJvZ3JhbSBvciBpdCdsbAorICAgZGllIHdoZW4gaXQgaGl0cyBvbmUuICAqLworCitzdGF0aWMgdm9pZAorc2RzX2RldGFjaCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgY2hhciBidWZbUEJVRlNJWl07CisKKyAgaWYgKGFyZ3MpCisgICAgZXJyb3IgKCJBcmd1bWVudCBnaXZlbiB0byBcImRldGFjaFwiIHdoZW4gcmVtb3RlbHkgZGVidWdnaW5nLiIpOworCisjaWYgMAorICAvKiBUZWxsIHRoZSByZW1vdGUgdGFyZ2V0IHRvIGRldGFjaC4gICovCisgIHN0cmNweSAoYnVmLCAiRCIpOworICBzZHNfc2VuZCAoYnVmLCAxKTsKKyNlbmRpZgorCisgIHBvcF90YXJnZXQgKCk7CisgIGlmIChmcm9tX3R0eSkKKyAgICBwdXRzX2ZpbHRlcmVkICgiRW5kaW5nIHJlbW90ZSBkZWJ1Z2dpbmcuXG4iKTsKK30KKworLyogQ29udmVydCBoZXggZGlnaXQgQSB0byBhIG51bWJlci4gICovCisKK3N0YXRpYyBpbnQKK2Zyb21oZXggKGEpCisgICAgIGludCBhOworeworICBpZiAoYSA+PSAnMCcgJiYgYSA8PSAnOScpCisgICAgcmV0dXJuIGEgLSAnMCc7CisgIGVsc2UgaWYgKGEgPj0gJ2EnICYmIGEgPD0gJ2YnKQorICAgIHJldHVybiBhIC0gJ2EnICsgMTA7CisgIGVsc2UgCisgICAgZXJyb3IgKCJSZXBseSBjb250YWlucyBpbnZhbGlkIGhleCBkaWdpdCAlZCIsIGEpOworfQorCisvKiBDb252ZXJ0IG51bWJlciBOSUIgdG8gYSBoZXggZGlnaXQuICAqLworCitzdGF0aWMgaW50Cit0b2hleCAobmliKQorICAgICBpbnQgbmliOworeworICBpZiAobmliIDwgMTApCisgICAgcmV0dXJuICcwJytuaWI7CisgIGVsc2UKKyAgICByZXR1cm4gJ2EnK25pYi0xMDsKK30KKworc3RhdGljIGludAordG9iNjQgKGluYnVmLCBvdXRidWYsIGxlbikKKyAgICAgdW5zaWduZWQgY2hhciAqaW5idWY7CisgICAgIGNoYXIgKm91dGJ1ZjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaW50IGksIHN1bTsKKyAgY2hhciAqcDsKKworICBpZiAobGVuICUgMyAhPSAwKQorICAgIGVycm9yICgiYmFkIGxlbmd0aCIpOworCisgIHAgPSBvdXRidWY7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykKKyAgICB7CisgICAgICAvKiBDb2xsZWN0IHRoZSBuZXh0IHRocmVlIGJ5dGVzIGludG8gYSBudW1iZXIuICAqLworICAgICAgc3VtID0gKChsb25nKSAqaW5idWYrKykgPDwgMTY7CisgICAgICBzdW0gfD0gKChsb25nKSAqaW5idWYrKykgPDwgIDg7CisgICAgICBzdW0gfD0gKChsb25nKSAqaW5idWYrKyk7CisKKyAgICAgIC8qIFNwaXQgb3V0IDQgNi1iaXQgZW5jb2RpbmdzLiAgKi8KKyAgICAgICpwKysgPSAoKHN1bSA+PiAxOCkgJiAweDNmKSArICcwJzsKKyAgICAgICpwKysgPSAoKHN1bSA+PiAxMikgJiAweDNmKSArICcwJzsKKyAgICAgICpwKysgPSAoKHN1bSA+PiAgNikgJiAweDNmKSArICcwJzsKKyAgICAgICpwKysgPSAoc3VtICYgMHgzZikgKyAnMCc7CisgICAgfQorICByZXR1cm4gKHAgLSBvdXRidWYpOworfQorCitzdGF0aWMgaW50Citmcm9tYjY0IChpbmJ1Ziwgb3V0YnVmLCBsZW4pCisgICAgIGNoYXIgKmluYnVmLCAqb3V0YnVmOworICAgICBpbnQgbGVuOworeworICBpbnQgaSwgc3VtOworCisgIGlmIChsZW4gJSA0ICE9IDApCisgICAgZXJyb3IgKCJiYWQgbGVuZ3RoIik7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KQorICAgIHsKKyAgICAgIC8qIENvbGxlY3QgNCA2LWJpdCBkaWdpdHMuICAqLworICAgICAgc3VtICA9ICgqaW5idWYrKyAtICcwJykgPDwgMTg7CisgICAgICBzdW0gfD0gKCppbmJ1ZisrIC0gJzAnKSA8PCAxMjsKKyAgICAgIHN1bSB8PSAoKmluYnVmKysgLSAnMCcpIDw8ICA2OworICAgICAgc3VtIHw9ICgqaW5idWYrKyAtICcwJyk7CisKKyAgICAgIC8qIE5vdyB0YWtlIHRoZSByZXN1bHRpbmcgMjQtYml0IG51bWJlciBhbmQgZ2V0IHRocmVlIGJ5dGVzIG91dAorICAgICAgICAgb2YgaXQuICAqLworICAgICAgKm91dGJ1ZisrID0gKHN1bSA+PiAxNikgJiAweGZmOworICAgICAgKm91dGJ1ZisrID0gKHN1bSA+PiAgOCkgJiAweGZmOworICAgICAgKm91dGJ1ZisrID0gc3VtICYgMHhmZjsKKyAgICB9CisKKyAgcmV0dXJuIChsZW4gLyA0KSAqIDM7Cit9CisKKwwKKy8qIFRlbGwgdGhlIHJlbW90ZSBtYWNoaW5lIHRvIHJlc3VtZS4gICovCisKK3N0YXRpYyBlbnVtIHRhcmdldF9zaWduYWwgbGFzdF9zZW50X3NpZ25hbCA9IFRBUkdFVF9TSUdOQUxfMDsKK2ludCBsYXN0X3NlbnRfc3RlcDsKKworc3RhdGljIHZvaWQKK3Nkc19yZXN1bWUgKHBpZCwgc3RlcCwgc2lnZ25hbCkKKyAgICAgaW50IHBpZCwgc3RlcDsKKyAgICAgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ2duYWw7Cit7CisgIHVuc2lnbmVkIGNoYXIgYnVmW1BCVUZTSVpdOworCisgIGRjYWNoZV9mbHVzaCAoc2RzX2RjYWNoZSk7CisKKyAgbGFzdF9zZW50X3NpZ25hbCA9IHNpZ2duYWw7CisgIGxhc3Rfc2VudF9zdGVwID0gc3RlcDsKKworICBidWZbMF0gPSAoc3RlcCA/IDIxIDogMjApOworICBidWZbMV0gPSAwOyAgLyogKHNob3VsZCBiZSBzaWduYWw/KSAqLworCisgIHNkc19zZW5kIChidWYsIDIpOworfQorDAorLyogU2VuZCBhIG1lc3NhZ2UgdG8gdGFyZ2V0IHRvIGhhbHQgaXQuICBUYXJnZXQgd2lsbCByZXNwb25kLCBhbmQgc2VuZAorICAgdXMgYSBtZXNzYWdlIHBlbmRpbmcgbm90aWNlLiAgKi8KKworc3RhdGljIHZvaWQKK3Nkc19pbnRlcnJ1cHQgKHNpZ25vKQorICAgICBpbnQgc2lnbm87Cit7CisgIHVuc2lnbmVkIGNoYXIgYnVmW1BCVUZTSVpdOworCisgIC8qIElmIHRoaXMgZG9lc24ndCB3b3JrLCB0cnkgbW9yZSBzZXZlcmUgc3RlcHMuICAqLworICBzaWduYWwgKHNpZ25vLCBzZHNfaW50ZXJydXB0X3R3aWNlKTsKKyAgCisgIGlmIChyZW1vdGVfZGVidWcpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJzZHNfaW50ZXJydXB0IGNhbGxlZFxuIik7CisKKyAgYnVmWzBdID0gMjU7CisgIHNkc19zZW5kIChidWYsIDEpOworfQorCitzdGF0aWMgdm9pZCAoKm9mdW5jKSgpOworCisvKiBUaGUgdXNlciB0eXBlZCBeQyB0d2ljZS4gICovCisKK3N0YXRpYyB2b2lkCitzZHNfaW50ZXJydXB0X3R3aWNlIChzaWdubykKKyAgICAgaW50IHNpZ25vOworeworICBzaWduYWwgKHNpZ25vLCBvZnVuYyk7CisgIAorICBpbnRlcnJ1cHRfcXVlcnkgKCk7CisKKyAgc2lnbmFsIChzaWdubywgc2RzX2ludGVycnVwdCk7Cit9CisKKy8qIEFzayB0aGUgdXNlciB3aGF0IHRvIGRvIHdoZW4gYW4gaW50ZXJydXB0IGlzIHJlY2VpdmVkLiAgKi8KKworc3RhdGljIHZvaWQKK2ludGVycnVwdF9xdWVyeSAoKQoreworICB0YXJnZXRfdGVybWluYWxfb3VycyAoKTsKKworICBpZiAocXVlcnkgKCJJbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgcHJvZ3JhbS5cblwKK0dpdmUgdXAgKGFuZCBzdG9wIGRlYnVnZ2luZyBpdCk/ICIpKQorICAgIHsKKyAgICAgIHRhcmdldF9tb3Vybl9pbmZlcmlvciAoKTsKKyAgICAgIHJldHVybl90b190b3BfbGV2ZWwgKFJFVFVSTl9RVUlUKTsKKyAgICB9CisKKyAgdGFyZ2V0X3Rlcm1pbmFsX2luZmVyaW9yICgpOworfQorCisvKiBJZiBub256ZXJvLCBpZ25vcmUgdGhlIG5leHQga2lsbC4gICovCitpbnQga2lsbF9rbHVkZ2U7CisKKy8qIFdhaXQgdW50aWwgdGhlIHJlbW90ZSBtYWNoaW5lIHN0b3BzLCB0aGVuIHJldHVybiwgc3RvcmluZyBzdGF0dXMgaW4KKyAgIFNUQVRVUyBqdXN0IGFzIGB3YWl0JyB3b3VsZC4gIFJldHVybnMgInBpZCIgKHRob3VnaCBpdCdzIG5vdCBjbGVhcgorICAgd2hhdCwgaWYgYW55dGhpbmcsIHRoYXQgbWVhbnMgaW4gdGhlIGNhc2Ugb2YgdGhpcyB0YXJnZXQpLiAgKi8KKworc3RhdGljIGludAorc2RzX3dhaXQgKHBpZCwgc3RhdHVzKQorICAgICBpbnQgcGlkOworICAgICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0YXR1czsKK3sKKyAgdW5zaWduZWQgY2hhciBidWZbUEJVRlNJWl07CisgIGludCByZXRsZW47CisKKyAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0VYSVRFRDsKKyAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gMDsKKworICBvZnVuYyA9ICh2b2lkICgqKSgpKSBzaWduYWwgKFNJR0lOVCwgc2RzX2ludGVycnVwdCk7CisKKyAgc2lnbmFsIChTSUdJTlQsIG9mdW5jKTsKKworICBpZiAoanVzdF9zdGFydGVkKQorICAgIHsKKyAgICAgIGp1c3Rfc3RhcnRlZCA9IDA7CisgICAgICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKyAgICAgIHJldHVybiBpbmZlcmlvcl9waWQ7CisgICAgfQorCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGdldG1lc3NhZ2UgKGJ1ZiwgMSk7CisKKyAgICAgIGlmIChtZXNzYWdlX3BlbmRpbmcpCisJeworCSAgYnVmWzBdID0gMjY7CisJICByZXRsZW4gPSBzZHNfc2VuZCAoYnVmLCAxKTsKKwkgIGlmIChyZW1vdGVfZGVidWcpCisJICAgIHsKKwkgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJTaWduYWxzOiAlMDR4ICUwMnggJTAyeFxuIiwKKwkJCQkgICgoaW50KSBidWZbMF0pIDw8IDggKyBidWZbMV0sCisJCQkJICBidWZbMl0sIGJ1ZlszXSk7CisJICAgIH0KKwkgIG1lc3NhZ2VfcGVuZGluZyA9IDA7CisJICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKwkgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQOworCSAgZ290byBnb3Rfc3RhdHVzOworCX0KKyAgICB9CisgZ290X3N0YXR1czoKKyAgcmV0dXJuIGluZmVyaW9yX3BpZDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc3Byc1sxNl07CisKKy8qIFJlYWQgdGhlIHJlbW90ZSByZWdpc3RlcnMgaW50byB0aGUgYmxvY2sgUkVHUy4gICovCisvKiBDdXJyZW50bHkgd2UganVzdCByZWFkIGFsbCB0aGUgcmVnaXN0ZXJzLCBzbyB3ZSBkb24ndCB1c2UgcmVnbm8uICAqLworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3Nkc19mZXRjaF9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHVuc2lnbmVkIGNoYXIgYnVmW1BCVUZTSVpdOworICBpbnQgaSwgcmV0bGVuOworICBjaGFyICpwOworICBjaGFyIHJlZ3NbUkVHSVNURVJfQllURVNdOworCisgIC8qIFVuaW1wbGVtZW50ZWQgcmVnaXN0ZXJzIHJlYWQgYXMgYWxsIGJpdHMgemVyby4gICovCisgIG1lbXNldCAocmVncywgMCwgUkVHSVNURVJfQllURVMpOworCisgIGJ1ZlswXSA9IDE4OworICBidWZbMV0gPSAxOworICBidWZbMl0gPSAwOworICByZXRsZW4gPSBzZHNfc2VuZCAoYnVmLCAzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgNCAqIDY7ICsraSkKKyAgICByZWdzW2kgKyA0ICogMzIgKyA4ICogMzJdID0gYnVmW2ldOworICBmb3IgKGkgPSAwOyBpIDwgNCAqIDQ7ICsraSkKKyAgICBzcHJzW2ldID0gYnVmW2kgKyA0ICogN107CisKKyAgYnVmWzBdID0gMTg7CisgIGJ1ZlsxXSA9IDI7CisgIGJ1ZlsyXSA9IDA7CisgIHJldGxlbiA9IHNkc19zZW5kIChidWYsIDMpOworCisgIGZvciAoaSA9IDA7IGkgPCByZXRsZW47IGkrKykKKyAgICByZWdzW2ldID0gYnVmW2ldOworCisgIC8qIChzaG91bGQgd2FybiBhYm91dCByZXBseSB0b28gc2hvcnQpICovCisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9SRUdTOyBpKyspCisgICAgc3VwcGx5X3JlZ2lzdGVyIChpLCAmcmVnc1tSRUdJU1RFUl9CWVRFKGkpXSk7Cit9CisKKy8qIFByZXBhcmUgdG8gc3RvcmUgcmVnaXN0ZXJzLiAgU2luY2Ugd2UgbWF5IHNlbmQgdGhlbSBhbGwsIHdlIGhhdmUgdG8KKyAgIHJlYWQgb3V0IHRoZSBvbmVzIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIGZpcnN0LiAgKi8KKworc3RhdGljIHZvaWQgCitzZHNfcHJlcGFyZV90b19zdG9yZSAoKQoreworICAvKiBNYWtlIHN1cmUgdGhlIGVudGlyZSByZWdpc3RlcnMgYXJyYXkgaXMgdmFsaWQuICAqLworICByZWFkX3JlZ2lzdGVyX2J5dGVzICgwLCAoY2hhciAqKU5VTEwsIFJFR0lTVEVSX0JZVEVTKTsKK30KKworLyogU3RvcmUgcmVnaXN0ZXIgUkVHTk8sIG9yIGFsbCByZWdpc3RlcnMgaWYgUkVHTk8gPT0gLTEsIGZyb20gdGhlIGNvbnRlbnRzCisgICBvZiBSRUdJU1RFUlMuICBGSVhNRTogaWdub3JlcyBlcnJvcnMuICAqLworCitzdGF0aWMgdm9pZAorc2RzX3N0b3JlX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgdW5zaWduZWQgY2hhciAqcCwgYnVmW1BCVUZTSVpdOworICBpbnQgaTsKKworICAvKiBTdG9yZSBhbGwgdGhlIHNwZWNpYWwtcHVycG9zZSByZWdpc3RlcnMuICAqLworICBwID0gYnVmOworICAqcCsrID0gMTk7CisgICpwKysgPSAxOworICAqcCsrID0gMDsKKyAgKnArKyA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCA0ICogNjsgaSsrKQorICAgICpwKysgPSByZWdpc3RlcnNbaSArIDQgKiAzMiArIDggKiAzMl07CisgIGZvciAoaSA9IDA7IGkgPCA0ICogMTsgaSsrKQorICAgICpwKysgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgNCAqIDQ7IGkrKykKKyAgICAqcCsrID0gc3Byc1tpXTsKKworICBzZHNfc2VuZCAoYnVmLCBwIC0gYnVmKTsKKworICAvKiBTdG9yZSBhbGwgdGhlIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlcnMuICAqLworICBwID0gYnVmOworICAqcCsrID0gMTk7CisgICpwKysgPSAyOworICAqcCsrID0gMDsKKyAgKnArKyA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCA0ICogMzI7IGkrKykKKyAgICAqcCsrID0gcmVnaXN0ZXJzW2ldOworCisgIHNkc19zZW5kIChidWYsIHAgLSBidWYpOworCit9CisMCisvKiBXcml0ZSBtZW1vcnkgZGF0YSBkaXJlY3RseSB0byB0aGUgcmVtb3RlIG1hY2hpbmUuICBUaGlzIGRvZXMgbm90CisgICBpbmZvcm0gdGhlIGRhdGEgY2FjaGU7IHRoZSBkYXRhIGNhY2hlIHVzZXMgdGhpcy4gIE1FTUFERFIgaXMgdGhlCisgICBhZGRyZXNzIGluIHRoZSByZW1vdGUgbWVtb3J5IHNwYWNlLiAgTVlBRERSIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQorICAgYnVmZmVyIGluIG91ciBzcGFjZS4gIExFTiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzLgorCisgICBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCwgb3IgMCBmb3IgZXJyb3IuICAqLworCitzdGF0aWMgaW50CitzZHNfd3JpdGVfYnl0ZXMgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICBpbnQgbWF4X2J1Zl9zaXplOwkJLyogTWF4IHNpemUgb2YgcGFja2V0IG91dHB1dCBidWZmZXIgKi8KKyAgaW50IG9yaWdsZW47CisgIHVuc2lnbmVkIGNoYXIgYnVmW1BCVUZTSVpdOworICBpbnQgdG9kbzsKKyAgaW50IGk7CisKKyAgLyogQ2hvcCB0aGUgdHJhbnNmZXIgZG93biBpZiBuZWNlc3NhcnkgKi8KKworICBtYXhfYnVmX3NpemUgPSAxNTA7CisKKyAgb3JpZ2xlbiA9IGxlbjsKKyAgd2hpbGUgKGxlbiA+IDApCisgICAgeworICAgICAgdG9kbyA9IG1pbiAobGVuLCBtYXhfYnVmX3NpemUpOworCisgICAgICBidWZbMF0gPSAxMzsKKyAgICAgIGJ1ZlsxXSA9IDA7CisgICAgICBidWZbMl0gPSAoaW50KSAobWVtYWRkciA+PiAyNCkgJiAweGZmOworICAgICAgYnVmWzNdID0gKGludCkgKG1lbWFkZHIgPj4gMTYpICYgMHhmZjsKKyAgICAgIGJ1Zls0XSA9IChpbnQpIChtZW1hZGRyID4+ICA4KSAmIDB4ZmY7CisgICAgICBidWZbNV0gPSAoaW50KSAobWVtYWRkciAgICAgICkgJiAweGZmOworICAgICAgYnVmWzZdID0gMTsKKyAgICAgIGJ1Zls3XSA9IDA7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2RvOyBpKyspCisJYnVmW2kgKyA4XSA9IG15YWRkcltpXTsKKworICAgICAgc2RzX3NlbmQgKGJ1ZiwgOCArIHRvZG8pOworCisgICAgICAvKiAoc2hvdWxkIGxvb2sgYXQgcmVzdWx0KSAqLworCisgICAgICBteWFkZHIgKz0gdG9kbzsKKyAgICAgIG1lbWFkZHIgKz0gdG9kbzsKKyAgICAgIGxlbiAtPSB0b2RvOworICAgIH0KKyAgcmV0dXJuIG9yaWdsZW47Cit9CisKKy8qIFJlYWQgbWVtb3J5IGRhdGEgZGlyZWN0bHkgZnJvbSB0aGUgcmVtb3RlIG1hY2hpbmUuICBUaGlzIGRvZXMgbm90CisgICB1c2UgdGhlIGRhdGEgY2FjaGU7IHRoZSBkYXRhIGNhY2hlIHVzZXMgdGhpcy4gIE1FTUFERFIgaXMgdGhlCisgICBhZGRyZXNzIGluIHRoZSByZW1vdGUgbWVtb3J5IHNwYWNlLiAgTVlBRERSIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQorICAgYnVmZmVyIGluIG91ciBzcGFjZS4gIExFTiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzLgorCisgICBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCwgb3IgMCBmb3IgZXJyb3IuICAqLworCitzdGF0aWMgaW50CitzZHNfcmVhZF9ieXRlcyAobWVtYWRkciwgbXlhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47Cit7CisgIGludCBtYXhfYnVmX3NpemU7CQkvKiBNYXggc2l6ZSBvZiBwYWNrZXQgb3V0cHV0IGJ1ZmZlciAqLworICBpbnQgb3JpZ2xlbiwgcmV0bGVuOworICB1bnNpZ25lZCBjaGFyIGJ1ZltQQlVGU0laXTsKKyAgaW50IHRvZG87CisgIGludCBpOworCisgIC8qIENob3AgdGhlIHRyYW5zZmVyIGRvd24gaWYgbmVjZXNzYXJ5ICovCisKKyAgbWF4X2J1Zl9zaXplID0gMTUwOworCisgIG9yaWdsZW4gPSBsZW47CisgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgIHRvZG8gPSBtaW4gKGxlbiwgbWF4X2J1Zl9zaXplKTsKKworICAgICAgYnVmWzBdID0gMTI7CisgICAgICBidWZbMV0gPSAwOworICAgICAgYnVmWzJdID0gKGludCkgKG1lbWFkZHIgPj4gMjQpICYgMHhmZjsKKyAgICAgIGJ1ZlszXSA9IChpbnQpIChtZW1hZGRyID4+IDE2KSAmIDB4ZmY7CisgICAgICBidWZbNF0gPSAoaW50KSAobWVtYWRkciA+PiAgOCkgJiAweGZmOworICAgICAgYnVmWzVdID0gKGludCkgKG1lbWFkZHIgICAgICApICYgMHhmZjsKKyAgICAgIGJ1Zls2XSA9IChpbnQpICh0b2RvID4+IDgpICYgMHhmZjsKKyAgICAgIGJ1Zls3XSA9IChpbnQpICh0b2RvICAgICApICYgMHhmZjsKKyAgICAgIGJ1Zls4XSA9IDE7CisKKyAgICAgIHJldGxlbiA9IHNkc19zZW5kIChidWYsIDkpOworCisgICAgICBpZiAocmV0bGVuIC0gMiAhPSB0b2RvKQorCXsKKwkgIHJldHVybiAwOworCX0KKworICAgICAgLyogUmVwbHkgZGVzY3JpYmVzIG1lbW9yeSBieXRlIGJ5IGJ5dGUuICovCisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2RvOyBpKyspCisJbXlhZGRyW2ldID0gYnVmW2kgKyAyXTsKKworICAgICAgbXlhZGRyICs9IHRvZG87CisgICAgICBtZW1hZGRyICs9IHRvZG87CisgICAgICBsZW4gLT0gdG9kbzsKKyAgICB9CisKKyAgcmV0dXJuIG9yaWdsZW47Cit9CisMCisvKiBSZWFkIG9yIHdyaXRlIExFTiBieXRlcyBmcm9tIGluZmVyaW9yIG1lbW9yeSBhdCBNRU1BRERSLAorICAgdHJhbnNmZXJyaW5nIHRvIG9yIGZyb20gZGVidWdnZXIgYWRkcmVzcyBNWUFERFIuICBXcml0ZSB0byBpbmZlcmlvcgorICAgaWYgU0hPVUxEX1dSSVRFIGlzIG5vbnplcm8uICBSZXR1cm5zIGxlbmd0aCBvZiBkYXRhIHdyaXR0ZW4gb3IKKyAgIHJlYWQ7IDAgZm9yIGVycm9yLiAgKi8KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyBpbnQKK3Nkc194ZmVyX21lbW9yeShtZW1hZGRyLCBteWFkZHIsIGxlbiwgc2hvdWxkX3dyaXRlLCB0YXJnZXQpCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47CisgICAgIGludCBzaG91bGRfd3JpdGU7CisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQ7CQkJLyogaWdub3JlZCAqLworeworICByZXR1cm4gZGNhY2hlX3hmZXJfbWVtb3J5IChzZHNfZGNhY2hlLCBtZW1hZGRyLCBteWFkZHIsIGxlbiwgc2hvdWxkX3dyaXRlKTsKK30KKworDAorc3RhdGljIHZvaWQKK3Nkc19maWxlc19pbmZvIChpZ25vcmUpCisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICppZ25vcmU7Cit7CisgIHB1dHNfZmlsdGVyZWQgKCJEZWJ1Z2dpbmcgb3ZlciBhIHNlcmlhbCBjb25uZWN0aW9uLCB1c2luZyBTRFMgcHJvdG9jb2wuXG4iKTsKK30KKwwKKy8qIFN0dWZmIGZvciBkZWFsaW5nIHdpdGggdGhlIHBhY2tldHMgd2hpY2ggYXJlIHBhcnQgb2YgdGhpcyBwcm90b2NvbC4KKyAgIFNlZSBjb21tZW50IGF0IHRvcCBvZiBmaWxlIGZvciBkZXRhaWxzLiAgKi8KKworLyogUmVhZCBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSB0aGUgcmVtb3RlIGVuZCwgbWFza2luZyBpdCBkb3duIHRvIDcgYml0cy4gKi8KKworc3RhdGljIGludAorcmVhZGNoYXIgKHRpbWVvdXQpCisgICAgIGludCB0aW1lb3V0OworeworICBpbnQgY2g7CisKKyAgY2ggPSBTRVJJQUxfUkVBRENIQVIgKHNkc19kZXNjLCB0aW1lb3V0KTsKKworICBpZiAocmVtb3RlX2RlYnVnID4gMSAmJiBjaCA+PSAwKQorICAgIHByaW50Zl91bmZpbHRlcmVkKCIlYygleCkiLCBjaCwgY2gpOworCisgIHN3aXRjaCAoY2gpCisgICAgeworICAgIGNhc2UgU0VSSUFMX0VPRjoKKyAgICAgIGVycm9yICgiUmVtb3RlIGNvbm5lY3Rpb24gY2xvc2VkIik7CisgICAgY2FzZSBTRVJJQUxfRVJST1I6CisgICAgICBwZXJyb3Jfd2l0aF9uYW1lICgiUmVtb3RlIGNvbW11bmljYXRpb24gZXJyb3IiKTsKKyAgICBjYXNlIFNFUklBTF9USU1FT1VUOgorICAgICAgcmV0dXJuIGNoOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gY2ggJiAweDdmOworICAgIH0KK30KKworLyogQW4gU0RTLXN0eWxlIGNoZWNrc3VtIGlzIGEgc3VtIG9mIHRoZSBieXRlcyBtb2R1bG8gMjUzLiAgKFByZXN1bWFibHkKKyAgIGJlY2F1c2UgMjUzLCAyNTQsIGFuZCAyNTUgYXJlIHNwZWNpYWwgZmxhZ3MgaW4gdGhlIHByb3RvY29sLikgICovCisKK3N0YXRpYyBpbnQKK2NvbXB1dGVfY2hlY2tzdW0gKGNzdW0sIGJ1ZiwgbGVuKQorICAgICBpbnQgY3N1bSwgbGVuOworICAgICBjaGFyICpidWY7Cit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKyAgICBjc3VtICs9ICh1bnNpZ25lZCBjaGFyKSBidWZbaV07CisKKyAgY3N1bSAlPSAyNTM7CisgIHJldHVybiBjc3VtOworfQorCisvKiBTZW5kIHRoZSBjb21tYW5kIGluIEJVRiB0byB0aGUgcmVtb3RlIG1hY2hpbmUsIGFuZCByZWFkIHRoZSByZXBseQorICAgaW50byBCVUYgYWxzby4gICovCisKK3N0YXRpYyBpbnQKK3Nkc19zZW5kIChidWYsIGxlbikKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgICBpbnQgbGVuOworeworICBwdXRtZXNzYWdlIChidWYsIGxlbik7CisKKyAgcmV0dXJuIGdldG1lc3NhZ2UgKGJ1ZiwgMCk7Cit9CisKKy8qIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSByZW1vdGUgbWFjaGluZS4gICovCisKK3N0YXRpYyBpbnQKK3B1dG1lc3NhZ2UgKGJ1ZiwgbGVuKQorICAgICB1bnNpZ25lZCBjaGFyICpidWY7CisgICAgIGludCBsZW47Cit7CisgIGludCBpLCBlbmNsZW47CisgIHVuc2lnbmVkIGNoYXIgY3N1bSA9IDA7CisgIGNoYXIgYnVmMltQQlVGU0laXSwgYnVmM1tQQlVGU0laXTsKKyAgdW5zaWduZWQgY2hhciBoZWFkZXJbM107CisgIGludCBjaDsKKyAgaW50IHRjb3VudCA9IDA7CisgIGNoYXIgKnA7CisKKyAgLyogQ29weSB0aGUgcGFja2V0IGludG8gYnVmZmVyIEJVRjIsIGVuY2Fwc3VsYXRpbmcgaXQKKyAgICAgYW5kIGdpdmluZyBpdCBhIGNoZWNrc3VtLiAgKi8KKworICBpZiAobGVuID4gMTcwKQkJLyogUHJvc2FuaXR5IGNoZWNrICovCisgICAgYWJvcnQoKTsKKworICBpZiAocmVtb3RlX2RlYnVnKQorICAgIHsKKyAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIk1lc3NhZ2UgdG8gc2VuZDogXCIiKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKwlmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICIlMDJ4IiwgYnVmW2ldKTsKKyAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlwiXG4iKTsKKyAgICB9CisKKyAgcCA9IGJ1ZjI7CisgICpwKysgPSAnJCc7CisKKyAgaWYgKGxlbiAlIDMgIT0gMCkKKyAgICB7CisgICAgICBidWZbbGVuXSA9ICdcMCc7CisgICAgICBidWZbbGVuKzFdID0gJ1wwJzsKKyAgICB9CisKKyAgaGVhZGVyWzFdID0gbmV4dF9tc2dfaWQ7CisKKyAgaGVhZGVyWzJdID0gbGVuOworCisgIGNzdW0gPSBjb21wdXRlX2NoZWNrc3VtIChjc3VtLCBidWYsIGxlbik7CisgIGNzdW0gPSBjb21wdXRlX2NoZWNrc3VtIChjc3VtLCBoZWFkZXIgKyAxLCAyKTsKKworICBoZWFkZXJbMF0gPSBjc3VtOworCisgIHRvYjY0IChoZWFkZXIsIHAsIDMpOworICBwICs9IDQ7CisgIGVuY2xlbiA9IHRvYjY0IChidWYsIGJ1ZjMsICgobGVuICsgMikgLyAzKSAqIDMpOworCisgIGZvciAoaSA9IDA7IGkgPCBlbmNsZW47ICsraSkKKyAgICAqcCsrID0gYnVmM1tpXTsKKyAgKnArKyA9ICdccic7CisgICpwKysgPSAnXG4nOworCisgIG5leHRfbXNnX2lkID0gKG5leHRfbXNnX2lkICsgMykgJSAyNDU7CisKKyAgLyogU2VuZCBpdCBvdmVyIGFuZCBvdmVyIHVudGlsIHdlIGdldCBhIHBvc2l0aXZlIGFjay4gICovCisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaW50IHN0YXJ0ZWRfZXJyb3Jfb3V0cHV0ID0gMDsKKworICAgICAgaWYgKHJlbW90ZV9kZWJ1ZykKKwl7CisJICAqcCA9ICdcMCc7CisJICBwcmludGZfdW5maWx0ZXJlZCAoIlNlbmRpbmcgZW5jb2RlZDogXCIlc1wiIiwgYnVmMik7CisJICBwcmludGZfdW5maWx0ZXJlZCAoIiAgKENoZWNrc3VtICVkLCBpZCAlZCwgbGVuZ3RoICVkKVxuIiwKKwkJCSAgICAgaGVhZGVyWzBdLCBoZWFkZXJbMV0sIGhlYWRlclsyXSk7CisJICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCX0KKyAgICAgIGlmIChTRVJJQUxfV1JJVEUgKHNkc19kZXNjLCBidWYyLCBwIC0gYnVmMikpCisJcGVycm9yX3dpdGhfbmFtZSAoInB1dG1lc3NhZ2U6IHdyaXRlIGZhaWxlZCIpOworCisgICAgICByZXR1cm4gMTsKKworICAgIH0KKworfQorCisvKiBDb21lIGhlcmUgYWZ0ZXIgZmluZGluZyB0aGUgc3RhcnQgb2YgdGhlIGZyYW1lLiAgQ29sbGVjdCB0aGUgcmVzdAorICAgaW50byBCVUYuICBSZXR1cm5zIDAgb24gYW55IGVycm9yLCAxIG9uIHN1Y2Nlc3MuICAqLworCitzdGF0aWMgaW50CityZWFkX2ZyYW1lIChidWYpCisgICAgIGNoYXIgKmJ1ZjsKK3sKKyAgY2hhciAqYnA7CisgIGludCBjOworCisgIGJwID0gYnVmOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGMgPSByZWFkY2hhciAoc2RzX3RpbWVvdXQpOworCisgICAgICBzd2l0Y2ggKGMpCisJeworCWNhc2UgU0VSSUFMX1RJTUVPVVQ6CisJICBpZiAocmVtb3RlX2RlYnVnKQorCSAgICBwdXRzX2ZpbHRlcmVkICgiVGltZW91dCBpbiBtaWQtbWVzc2FnZSwgcmV0cnlpbmdcbiIpOworCSAgcmV0dXJuIDA7CisJY2FzZSAnJCc6CisJICBpZiAocmVtb3RlX2RlYnVnKQorCSAgICBwdXRzX2ZpbHRlcmVkICgiU2F3IG5ldyBwYWNrZXQgc3RhcnQgaW4gbWlkZGxlIG9mIG9sZCBvbmVcbiIpOworCSAgcmV0dXJuIDA7CQkvKiBTdGFydCBhIG5ldyBwYWNrZXQsIGNvdW50IHJldHJpZXMgKi8KKwljYXNlICdccic6CisJICBicmVhazsKKworCWNhc2UgJ1xuJzoKKwkgIHsKKwkgICAgKmJwID0gJ1wwMDAnOworCSAgICBpZiAocmVtb3RlX2RlYnVnKQorCSAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlJlY2VpdmVkIGVuY29kZWQ6IFwiJXNcIlxuIiwKKwkJCQkgIGJ1Zik7CisJICAgIHJldHVybiAxOworCSAgfQorCisJZGVmYXVsdDoKKwkgIGlmIChicCA8IGJ1ZiArIFBCVUZTSVogLSAxKQorCSAgICB7CisJICAgICAgKmJwKysgPSBjOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgICpicCA9ICdcMCc7CisJICBwdXRzX2ZpbHRlcmVkICgiTWVzc2FnZSB0b28gbG9uZzogIik7CisJICBwdXRzX2ZpbHRlcmVkIChidWYpOworCSAgcHV0c19maWx0ZXJlZCAoIlxuIik7CisKKwkgIHJldHVybiAwOworCX0KKyAgICB9Cit9CisKKy8qIFJlYWQgYSBwYWNrZXQgZnJvbSB0aGUgcmVtb3RlIG1hY2hpbmUsIHdpdGggZXJyb3IgY2hlY2tpbmcsCisgICBhbmQgc3RvcmUgaXQgaW4gQlVGLiAgQlVGIGlzIGV4cGVjdGVkIHRvIGJlIG9mIHNpemUgUEJVRlNJWi4KKyAgIElmIEZPUkVWRVIsIHdhaXQgZm9yZXZlciByYXRoZXIgdGhhbiB0aW1pbmcgb3V0OyB0aGlzIGlzIHVzZWQKKyAgIHdoaWxlIHRoZSB0YXJnZXQgaXMgZXhlY3V0aW5nIHVzZXIgY29kZS4gICovCisKK3N0YXRpYyBpbnQKK2dldG1lc3NhZ2UgKGJ1ZiwgZm9yZXZlcikKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgICBpbnQgZm9yZXZlcjsKK3sKKyAgaW50IGMsIGMyLCBjMzsKKyAgaW50IHRyaWVzOworICBpbnQgdGltZW91dDsKKyAgaW50IHZhbCwgaSwgbGVuLCBjc3VtOworICB1bnNpZ25lZCBjaGFyIGhlYWRlclszXTsKKyAgdW5zaWduZWQgY2hhciBpbmJ1Zls1MDBdOworCisgIHN0cmNweSAoYnVmLCAidGltZW91dCIpOworCisgIGlmIChmb3JldmVyKQorICAgIHsKKyNpZmRlZiBNQUlOVEVOQU5DRV9DTURTCisgICAgICB0aW1lb3V0ID0gd2F0Y2hkb2cgPiAwID8gd2F0Y2hkb2cgOiAtMTsKKyNlbHNlCisgICAgICB0aW1lb3V0ID0gLTE7CisjZW5kaWYKKyAgICB9CisKKyAgZWxzZQorICAgIHRpbWVvdXQgPSBzZHNfdGltZW91dDsKKworI2RlZmluZSBNQVhfVFJJRVMgMworCisgIGZvciAodHJpZXMgPSAxOyB0cmllcyA8PSBNQVhfVFJJRVM7IHRyaWVzKyspCisgICAgeworICAgICAgLyogVGhpcyBjYW4gbG9vcCBmb3JldmVyIGlmIHRoZSByZW1vdGUgc2lkZSBzZW5kcyB1cyBjaGFyYWN0ZXJzCisJIGNvbnRpbnVvdXNseSwgYnV0IGlmIGl0IHBhdXNlcywgd2UnbGwgZ2V0IGEgemVybyBmcm9tIHJlYWRjaGFyCisJIGJlY2F1c2Ugb2YgdGltZW91dC4gIFRoZW4gd2UnbGwgY291bnQgdGhhdCBhcyBhIHJldHJ5LiAgKi8KKworICAgICAgLyogTm90ZSB0aGF0IHdlIHdpbGwgb25seSB3YWl0IGZvcmV2ZXIgcHJpb3IgdG8gdGhlIHN0YXJ0IG9mIGEgcGFja2V0LgorCSBBZnRlciB0aGF0LCB3ZSBleHBlY3QgY2hhcmFjdGVycyB0byBhcnJpdmUgYXQgYSBicmlzayBwYWNlLiAgVGhleQorCSBzaG91bGQgc2hvdyB1cCB3aXRoaW4gc2RzX3RpbWVvdXQgaW50ZXJ2YWxzLiAgKi8KKworICAgICAgZG8KKwl7CisJICBjID0gcmVhZGNoYXIgKHRpbWVvdXQpOworCisJICBpZiAoYyA9PSBTRVJJQUxfVElNRU9VVCkKKwkgICAgeworI2lmZGVmIE1BSU5URU5BTkNFX0NNRFMKKwkgICAgICBpZiAoZm9yZXZlcikJLyogV2F0Y2hkb2cgd2VudCBvZmYuICBLaWxsIHRoZSB0YXJnZXQuICovCisJCXsKKwkJICB0YXJnZXRfbW91cm5faW5mZXJpb3IgKCk7CisJCSAgZXJyb3IgKCJXYXRjaGRvZyBoYXMgZXhwaXJlZC4gIFRhcmdldCBkZXRhY2hlZC5cbiIpOworCQl9CisjZW5kaWYKKwkgICAgICBpZiAocmVtb3RlX2RlYnVnKQorCQlwdXRzX2ZpbHRlcmVkICgiVGltZWQgb3V0LlxuIik7CisJICAgICAgZ290byByZXRyeTsKKwkgICAgfQorCX0KKyAgICAgIHdoaWxlIChjICE9ICckJyAmJiBjICE9ICd7Jyk7CisKKyAgICAgIC8qIFdlIG1pZ2h0IGhhdmUgc2VlbiBhICJ0cmlncmFwaCIsIGEgc2VxdWVuY2Ugb2YgdGhyZWUgY2hhcmFjdGVycworCSB0aGF0IGluZGljYXRlIHZhcmlvdXMgc29ydHMgb2YgY29tbXVuaWNhdGlvbiBzdGF0ZS4gICovCisKKyAgICAgIGlmIChjID09ICd7JykKKwl7CisJICAvKiBSZWFkIHRoZSBvdGhlciB0d28gY2hhcnMgb2YgdGhlIHRyaWdyYXBoLiAqLworCSAgYzIgPSByZWFkY2hhciAodGltZW91dCk7CisJICBjMyA9IHJlYWRjaGFyICh0aW1lb3V0KTsKKwkgIGlmIChyZW1vdGVfZGVidWcpCisJICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlRyaWdyYXBoICVjJWMlYyByZWNlaXZlZFxuIiwKKwkJCQljLCBjMiwgYzMpOworCSAgaWYgKGMzID09ICcrJykKKwkgICAgeworCSAgICAgIG1lc3NhZ2VfcGVuZGluZyA9IDE7CisJICAgICAgcmV0dXJuIDA7IC8qPz8/PyovCisJICAgIH0KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgdmFsID0gcmVhZF9mcmFtZSAoaW5idWYpOworCisgICAgICBpZiAodmFsID09IDEpCisJeworCSAgZnJvbWI2NCAoaW5idWYsIGhlYWRlciwgNCk7CisJICAvKiAoc2hvdWxkIGNoZWNrIG91dCBvdGhlciBiaXRzKSAqLworCSAgZnJvbWI2NCAoaW5idWYgKyA0LCBidWYsIHN0cmxlbiAoaW5idWYpIC0gNCk7CisKKwkgIGxlbiA9IGhlYWRlclsyXTsKKworCSAgY3N1bSA9IDA7CisJICBjc3VtID0gY29tcHV0ZV9jaGVja3N1bSAoY3N1bSwgYnVmLCBsZW4pOworCSAgY3N1bSA9IGNvbXB1dGVfY2hlY2tzdW0gKGNzdW0sIGhlYWRlciArIDEsIDIpOworCisJICBpZiAoY3N1bSAhPSBoZWFkZXJbMF0pCisJICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKwkJCQkiQ2hlY2tzdW0gbWlzbWF0Y2g6IGNvbXB1dGVkICVkLCByZWNlaXZlZCAlZFxuIiwKKwkJCQljc3VtLCBoZWFkZXJbMF0pOworCisJICBpZiAoaGVhZGVyWzJdID09IDB4ZmYpCisJICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlJlcXVlc3RpbmcgcmVzZW5kLi4uXG4iKTsKKworCSAgaWYgKHJlbW90ZV9kZWJ1ZykKKwkgICAgeworCSAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKwkJCQkgICIuLi4gKEdvdCBjaGVja3N1bSAlZCwgaWQgJWQsIGxlbmd0aCAlZClcbiIsCisJCQkJICBoZWFkZXJbMF0sIGhlYWRlclsxXSwgaGVhZGVyWzJdKTsKKwkgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJNZXNzYWdlIHJlY2VpdmVkOiBcIiIpOworCSAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKwkJeworCQkgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIiUwMngiLCAodW5zaWduZWQgY2hhcikgYnVmW2ldKTsKKwkJfQorCSAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlwiXG4iKTsKKwkgICAgfQorCisJICAvKiBubyBhY2sgcmVxdWlyZWQ/ICovCisJICByZXR1cm4gbGVuOworCX0KKworICAgICAgLyogVHJ5IHRoZSB3aG9sZSB0aGluZyBhZ2Fpbi4gICovCisgICAgcmV0cnk6CisgICAgICAvKiBuZWVkIHRvIGRvIHNvbWV0aGluZyBoZXJlICovCisgICAgfQorCisgIC8qIFdlIGhhdmUgdHJpZWQgaGFyZCBlbm91Z2gsIGFuZCBqdXN0IGNhbid0IHJlY2VpdmUgdGhlIHBhY2tldC4gIEdpdmUgdXAuICovCisKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJJZ25vcmluZyBwYWNrZXQgZXJyb3IsIGNvbnRpbnVpbmcuLi5cbiIpOworICByZXR1cm4gMDsKK30KKwwKK3N0YXRpYyB2b2lkCitzZHNfa2lsbCAoKQoreworICAvKiBEb24ndCB0cnkgdG8gZG8gYW55dGhpbmcgdG8gdGhlIHRhcmdldC4gICovCit9CisKK3N0YXRpYyB2b2lkCitzZHNfbW91cm4gKCkKK3sKKyAgdW5wdXNoX3RhcmdldCAoJnNkc19vcHMpOworICBnZW5lcmljX21vdXJuX2luZmVyaW9yICgpOworfQorCitzdGF0aWMgdm9pZAorc2RzX2NyZWF0ZV9pbmZlcmlvciAoZXhlY19maWxlLCBhcmdzLCBlbnYpCisgICAgIGNoYXIgKmV4ZWNfZmlsZTsKKyAgICAgY2hhciAqYXJnczsKKyAgICAgY2hhciAqKmVudjsKK3sKKyAgaW5mZXJpb3JfcGlkID0gNDIwMDA7CisKKyAgLyogQ2xlYW4gdXAgZnJvbSB0aGUgbGFzdCB0aW1lIHdlIHdlcmUgcnVubmluZy4gICovCisgIGNsZWFyX3Byb2NlZWRfc3RhdHVzICgpOworCisgIC8qIExldCB0aGUgcmVtb3RlIHByb2Nlc3MgcnVuLiAgKi8KKyAgcHJvY2VlZCAoYmZkX2dldF9zdGFydF9hZGRyZXNzIChleGVjX2JmZCksIFRBUkdFVF9TSUdOQUxfMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZHNfbG9hZCAoZmlsZW5hbWUsIGZyb21fdHR5KQorICAgIGNoYXIgKmZpbGVuYW1lOworICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZ2VuZXJpY19sb2FkIChmaWxlbmFtZSwgZnJvbV90dHkpOworCisgIGluZmVyaW9yX3BpZCA9IDA7Cit9CisMCisvKiBUaGUgU0RTIG1vbml0b3IgaGFzIGNvbW1hbmRzIGZvciBicmVha3BvaW50IGluc2VydGlvbiwgYWx0aG91Z2ggaXQKKyAgIGl0IGRvZXNuJ3QgYWN0dWFsbHkgbWFuYWdlIHRoZSBicmVha3BvaW50cywgaXQganVzdCByZXR1cm5zIHRoZQorICAgcmVwbGFjZWQgaW5zdHJ1Y3Rpb24gYmFjayB0byB0aGUgZGVidWdnZXIuICAqLworCitzdGF0aWMgaW50CitzZHNfaW5zZXJ0X2JyZWFrcG9pbnQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqY29udGVudHNfY2FjaGU7Cit7CisgIGludCBpLCByZXRsZW47CisgIHVuc2lnbmVkIGNoYXIgKnAsIGJ1ZltQQlVGU0laXTsKKworICBwID0gYnVmOworICAqcCsrID0gMTY7CisgICpwKysgPSAwOworICAqcCsrID0gKGludCkgKGFkZHIgPj4gMjQpICYgMHhmZjsKKyAgKnArKyA9IChpbnQpIChhZGRyID4+IDE2KSAmIDB4ZmY7CisgICpwKysgPSAoaW50KSAoYWRkciA+PiAgOCkgJiAweGZmOworICAqcCsrID0gKGludCkgKGFkZHIgICAgICApICYgMHhmZjsKKyAgCisgIHJldGxlbiA9IHNkc19zZW5kIChidWYsIHAgLSBidWYpOworCisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpCisgICAgY29udGVudHNfY2FjaGVbaV0gPSBidWZbaSArIDJdOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzZHNfcmVtb3ZlX2JyZWFrcG9pbnQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqY29udGVudHNfY2FjaGU7Cit7CisgIGludCBpLCByZXRsZW47CisgIHVuc2lnbmVkIGNoYXIgKnAsIGJ1ZltQQlVGU0laXTsKKworICBwID0gYnVmOworICAqcCsrID0gMTc7CisgICpwKysgPSAwOworICAqcCsrID0gKGludCkgKGFkZHIgPj4gMjQpICYgMHhmZjsKKyAgKnArKyA9IChpbnQpIChhZGRyID4+IDE2KSAmIDB4ZmY7CisgICpwKysgPSAoaW50KSAoYWRkciA+PiAgOCkgJiAweGZmOworICAqcCsrID0gKGludCkgKGFkZHIgICAgICApICYgMHhmZjsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKKyAgICAqcCsrID0gY29udGVudHNfY2FjaGVbaV07CisKKyAgcmV0bGVuID0gc2RzX3NlbmQgKGJ1ZiwgcCAtIGJ1Zik7CisKKyAgcmV0dXJuIDA7Cit9CisMCitzdGF0aWMgdm9pZCAKK2luaXRfc2RzX29wcyAoKQoreworICBzZHNfb3BzLnRvX3Nob3J0bmFtZSA9ICJzZHMiOworICBzZHNfb3BzLnRvX2xvbmduYW1lID0gIlJlbW90ZSBzZXJpYWwgdGFyZ2V0IHdpdGggU0RTIHByb3RvY29sIjsKKyAgc2RzX29wcy50b19kb2MgPSAiVXNlIGEgcmVtb3RlIGNvbXB1dGVyIHZpYSBhIHNlcmlhbCBsaW5lOyB1c2luZyB0aGUgU0RTIHByb3RvY29sLlxuXAorU3BlY2lmeSB0aGUgc2VyaWFsIGRldmljZSBpdCBpcyBjb25uZWN0ZWQgdG8gKGUuZy4gL2Rldi90dHlhKS4iOworICBzZHNfb3BzLnRvX29wZW4gPSBzZHNfb3BlbjsKKyAgc2RzX29wcy50b19jbG9zZSA9IHNkc19jbG9zZTsKKyAgc2RzX29wcy50b19kZXRhY2ggPSBzZHNfZGV0YWNoOworICBzZHNfb3BzLnRvX3Jlc3VtZSA9IHNkc19yZXN1bWU7CisgIHNkc19vcHMudG9fd2FpdCA9IHNkc193YWl0OworICBzZHNfb3BzLnRvX2ZldGNoX3JlZ2lzdGVycyA9IHNkc19mZXRjaF9yZWdpc3RlcnM7CisgIHNkc19vcHMudG9fc3RvcmVfcmVnaXN0ZXJzID0gc2RzX3N0b3JlX3JlZ2lzdGVyczsKKyAgc2RzX29wcy50b19wcmVwYXJlX3RvX3N0b3JlID0gc2RzX3ByZXBhcmVfdG9fc3RvcmU7CisgIHNkc19vcHMudG9feGZlcl9tZW1vcnkgPSBzZHNfeGZlcl9tZW1vcnk7CisgIHNkc19vcHMudG9fZmlsZXNfaW5mbyA9IHNkc19maWxlc19pbmZvOworICBzZHNfb3BzLnRvX2luc2VydF9icmVha3BvaW50ID0gc2RzX2luc2VydF9icmVha3BvaW50OworICBzZHNfb3BzLnRvX3JlbW92ZV9icmVha3BvaW50ID0gc2RzX3JlbW92ZV9icmVha3BvaW50OworICBzZHNfb3BzLnRvX2tpbGwgPSBzZHNfa2lsbDsKKyAgc2RzX29wcy50b19sb2FkID0gc2RzX2xvYWQ7CisgIHNkc19vcHMudG9fY3JlYXRlX2luZmVyaW9yID0gc2RzX2NyZWF0ZV9pbmZlcmlvcjsKKyAgc2RzX29wcy50b19tb3Vybl9pbmZlcmlvciA9IHNkc19tb3VybjsKKyAgc2RzX29wcy50b19zdHJhdHVtID0gcHJvY2Vzc19zdHJhdHVtOworICBzZHNfb3BzLnRvX2hhc19hbGxfbWVtb3J5ID0gMTsKKyAgc2RzX29wcy50b19oYXNfbWVtb3J5ID0gMTsKKyAgc2RzX29wcy50b19oYXNfc3RhY2sgPSAxOworICBzZHNfb3BzLnRvX2hhc19yZWdpc3RlcnMgPSAxOworICBzZHNfb3BzLnRvX2hhc19leGVjdXRpb24gPSAxOworICBzZHNfb3BzLnRvX21hZ2ljID0gT1BTX01BR0lDOworfQorCisvKiBQdXQgYSBjb21tYW5kIHN0cmluZywgaW4gYXJncywgb3V0IHRvIHRoZSBtb25pdG9yIGFuZCBkaXNwbGF5IHRoZQorICAgcmVwbHkgbWVzc2FnZS4gICovCisKK3N0YXRpYyB2b2lkCitzZHNfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgY2hhciAqcDsKKyAgaW50IGksIGxlbiwgcmV0bGVuOworICB1bnNpZ25lZCBjaGFyIGJ1ZlsxMDAwXTsKKworICAvKiBDb252ZXJ0IGhleGFkZWNpbWFsIGNoYXJzIGludG8gYSBieXRlIGJ1ZmZlci4gICovCisgIHAgPSBhcmdzOworICBsZW4gPSAwOworICB3aGlsZSAoKnAgIT0gJ1wwJykKKyAgICB7CisgICAgICBidWZbbGVuKytdID0gZnJvbWhleCAocFswXSkgKiAxNiArIGZyb21oZXggKHBbMV0pOworICAgICAgaWYgKHBbMV0gPT0gJ1wwJykKKwlicmVhazsKKyAgICAgIHAgKz0gMjsKKyAgICB9CisKKyAgcmV0bGVuID0gc2RzX3NlbmQgKGJ1ZiwgbGVuKTsKKworICBwcmludGZfZmlsdGVyZWQgKCJSZXBseSBpcyAiKTsKKyAgZm9yIChpID0gMDsgaSA8IHJldGxlbjsgKytpKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiUwMngiLCBidWZbaV0pOworICAgIH0gIAorICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9yZW1vdGVfc2RzICgpCit7CisgIGluaXRfc2RzX29wcyAoKTsKKyAgYWRkX3RhcmdldCAoJnNkc19vcHMpOworCisgIGFkZF9zaG93X2Zyb21fc2V0IChhZGRfc2V0X2NtZCAoInNkc3RpbWVvdXQiLCBub19jbGFzcywKKwkJCQkgIHZhcl9pbnRlZ2VyLCAoY2hhciAqKSZzZHNfdGltZW91dCwKKwkJCQkgICJTZXQgdGltZW91dCB2YWx1ZSBmb3Igc2RzIHJlYWQuXG4iLCAmc2V0bGlzdCksCisJCSAgICAgJnNob3dsaXN0KTsKKworICBhZGRfY29tICgic2RzIiwgY2xhc3Nfb2JzY3VyZSwgc2RzX2NvbW1hbmQsCisJICAgIlNlbmQgYSBjb21tYW5kIHRvIHRoZSBTRFMgbW9uaXRvci4iKTsgCit9CmRpZmYgLS1naXQgYS9nZGIvcmVtb3RlLXNpbS5jIGIvZ2RiL3JlbW90ZS1zaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTBmY2VkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JlbW90ZS1zaW0uYwpAQCAtMCwwICsxLDEwMDMgQEAKKy8qIEdlbmVyaWMgcmVtb3RlIGRlYnVnZ2luZyBpbnRlcmZhY2UgZm9yIHNpbXVsYXRvcnMuCisgICBDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorICAgU3RldmUgQ2hhbWJlcmxhaW4gKHNhY0BjeWdudXMuY29tKS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAid2FpdC5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgInRlcm1pbmFsLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAicmVtb3RlLXNpbS5oIgorI2luY2x1ZGUgInJlbW90ZS11dGlscy5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKworLyogUHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZCBkdW1wX21lbSBQQVJBTVMgKChjaGFyICpidWYsIGludCBsZW4pKTsKKworc3RhdGljIHZvaWQgaW5pdF9jYWxsYmFja3MgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZCBlbmRfY2FsbGJhY2tzIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIGludCBnZGJfb3Nfd3JpdGVfc3Rkb3V0IFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgZ2RiX29zX2ZsdXNoX3N0ZG91dCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKKworc3RhdGljIGludCBnZGJfb3Nfd3JpdGVfc3RkZXJyIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgZ2RiX29zX2ZsdXNoX3N0ZGVyciBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKKworc3RhdGljIGludCBnZGJfb3NfcG9sbF9xdWl0IFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKikpOworCisvKiBwcmludGZfZmlsdGVyZWQgaXMgZGVwcmVjaWF0ZWQgKi8KK3N0YXRpYyB2b2lkIGdkYl9vc19wcmludGZfZmlsdGVyZWQgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIC4uLikpOworCitzdGF0aWMgdm9pZCBnZGJfb3NfdnByaW50Zl9maWx0ZXJlZCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworCitzdGF0aWMgdm9pZCBnZGJfb3NfZXZwcmludGZfZmlsdGVyZWQgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKKworc3RhdGljIHZvaWQgZ2RiX29zX2Vycm9yIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKKworc3RhdGljIHZvaWQgZ2Ric2ltX2ZldGNoX3JlZ2lzdGVyIFBBUkFNUyAoKGludCByZWdubykpOworCitzdGF0aWMgdm9pZCBnZGJzaW1fc3RvcmVfcmVnaXN0ZXIgUEFSQU1TICgoaW50IHJlZ25vKSk7CisKK3N0YXRpYyB2b2lkIGdkYnNpbV9raWxsIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQgZ2Ric2ltX2xvYWQgUEFSQU1TICgoY2hhciAqcHJvZywgaW50IGZyb210dHkpKTsKKworc3RhdGljIHZvaWQgZ2Ric2ltX2NyZWF0ZV9pbmZlcmlvciBQQVJBTVMgKChjaGFyICpleGVjX2ZpbGUsIGNoYXIgKmFyZ3MsIGNoYXIgKiplbnYpKTsKKworc3RhdGljIHZvaWQgZ2Ric2ltX29wZW4gUEFSQU1TICgoY2hhciAqYXJncywgaW50IGZyb21fdHR5KSk7CisKK3N0YXRpYyB2b2lkIGdkYnNpbV9jbG9zZSBQQVJBTVMgKChpbnQgcXVpdHRpbmcpKTsKKworc3RhdGljIHZvaWQgZ2Ric2ltX2RldGFjaCBQQVJBTVMgKChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpKTsKKworc3RhdGljIHZvaWQgZ2Ric2ltX3Jlc3VtZSBQQVJBTVMgKChpbnQgcGlkLCBpbnQgc3RlcCwgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ2duYWwpKTsKKworc3RhdGljIGludCBnZGJzaW1fd2FpdCBQQVJBTVMgKChpbnQgcGlkLCBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0YXR1cykpOworCitzdGF0aWMgdm9pZCBnZGJzaW1fcHJlcGFyZV90b19zdG9yZSBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyBpbnQgZ2Ric2ltX3hmZXJfaW5mZXJpb3JfbWVtb3J5IFBBUkFNUyAoKENPUkVfQUREUiBtZW1hZGRyLAorCQkJCQkJY2hhciAqbXlhZGRyLCBpbnQgbGVuLAorCQkJCQkJaW50IHdyaXRlLAorCQkJCQkJc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldCkpOworCitzdGF0aWMgdm9pZCBnZGJzaW1fZmlsZXNfaW5mbyBQQVJBTVMgKChzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0KSk7CisKK3N0YXRpYyB2b2lkIGdkYnNpbV9tb3Vybl9pbmZlcmlvciBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIGdkYnNpbV9zdG9wIFBBUkFNUyAoKHZvaWQpKTsKKwordm9pZCBzaW11bGF0b3JfY29tbWFuZCBQQVJBTVMgKChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpKTsKKworLyogTmFtaW5nIGNvbnZlbnRpb246CisKKyAgIHNpbV8qIGFyZSB0aGUgaW50ZXJmYWNlIHRvIHRoZSBzaW11bGF0b3IgKHNlZSByZW1vdGUtc2ltLmgpLgorICAgZ2Ric2ltXyogYXJlIHN0dWZmIHdoaWNoIGlzIGludGVybmFsIHRvIGdkYi4gICovCisKKy8qIEZvcndhcmQgZGF0YSBkZWNsYXJhdGlvbnMgKi8KK2V4dGVybiBzdHJ1Y3QgdGFyZ2V0X29wcyBnZGJzaW1fb3BzOworCitzdGF0aWMgaW50IHByb2dyYW1fbG9hZGVkID0gMDsKKworLyogV2UgbXVzdCBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlIHNpbXVsYXRvciBoYXMgYmVlbiBvcGVuZWQgb3Igbm90IGJlY2F1c2UKKyAgIEdEQiBjYW4gY2FsbCBhIHRhcmdldCdzIGNsb3NlIHJvdXRpbmUgdHdpY2UsIGJ1dCBzaW1fY2xvc2UgZG9lc24ndCBhbGxvdworICAgdGhpcy4gIFdlIGFsc28gbmVlZCB0byByZWNvcmQgdGhlIHJlc3VsdCBvZiBzaW1fb3BlbiBzbyB3ZSBjYW4gcGFzcyBpdAorICAgYmFjayB0byB0aGUgb3RoZXIgc2ltX2ZvbyByb3V0aW5lcy4gICovCitzdGF0aWMgU0lNX0RFU0MgZ2Ric2ltX2Rlc2MgPSAwOworCitzdGF0aWMgdm9pZAorZHVtcF9tZW0gKGJ1ZiwgbGVuKQorICAgICBjaGFyICpidWY7CisgICAgIGludCBsZW47Cit7CisgIGlmIChsZW4gPD0gOCkKKyAgICB7CisgICAgICBpZiAobGVuID09IDggfHwgbGVuID09IDQpCisJeworCSAgbG9uZyBsWzJdOworCSAgbWVtY3B5IChsLCBidWYsIGxlbik7CisJICBwcmludGZfZmlsdGVyZWQgKCJcdDB4JXgiLCBsWzBdKTsKKwkgIHByaW50Zl9maWx0ZXJlZCAobGVuID09IDggPyAiIDB4JXhcbiIgOiAiXG4iLCBsWzFdKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW50IGk7CisJICBwcmludGZfZmlsdGVyZWQgKCJcdCIpOworCSAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCSAgICBwcmludGZfZmlsdGVyZWQgKCIweCV4ICIsIGJ1ZltpXSk7CisJICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworCX0KKyAgICB9Cit9CisKK3N0YXRpYyBob3N0X2NhbGxiYWNrIGdkYl9jYWxsYmFjazsKK3N0YXRpYyBpbnQgY2FsbGJhY2tzX2luaXRpYWxpemVkID0gMDsKKworLyogSW5pdGlhbGl6ZSBnZGJfY2FsbGJhY2suICAqLworCitzdGF0aWMgdm9pZAoraW5pdF9jYWxsYmFja3MgKCkKK3sKKyAgaWYgKCEgY2FsbGJhY2tzX2luaXRpYWxpemVkKQorICAgIHsKKyAgICAgIGdkYl9jYWxsYmFjayA9IGRlZmF1bHRfY2FsbGJhY2s7CisgICAgICBnZGJfY2FsbGJhY2suaW5pdCAoJmdkYl9jYWxsYmFjayk7CisgICAgICBnZGJfY2FsbGJhY2sud3JpdGVfc3Rkb3V0ID0gZ2RiX29zX3dyaXRlX3N0ZG91dDsKKyAgICAgIGdkYl9jYWxsYmFjay5mbHVzaF9zdGRvdXQgPSBnZGJfb3NfZmx1c2hfc3Rkb3V0OworICAgICAgZ2RiX2NhbGxiYWNrLndyaXRlX3N0ZGVyciA9IGdkYl9vc193cml0ZV9zdGRlcnI7CisgICAgICBnZGJfY2FsbGJhY2suZmx1c2hfc3RkZXJyID0gZ2RiX29zX2ZsdXNoX3N0ZGVycjsKKyAgICAgIGdkYl9jYWxsYmFjay5wcmludGZfZmlsdGVyZWQgPSBnZGJfb3NfcHJpbnRmX2ZpbHRlcmVkOworICAgICAgZ2RiX2NhbGxiYWNrLnZwcmludGZfZmlsdGVyZWQgPSBnZGJfb3NfdnByaW50Zl9maWx0ZXJlZDsKKyAgICAgIGdkYl9jYWxsYmFjay5ldnByaW50Zl9maWx0ZXJlZCA9IGdkYl9vc19ldnByaW50Zl9maWx0ZXJlZDsKKyAgICAgIGdkYl9jYWxsYmFjay5lcnJvciA9IGdkYl9vc19lcnJvcjsKKyAgICAgIGdkYl9jYWxsYmFjay5wb2xsX3F1aXQgPSBnZGJfb3NfcG9sbF9xdWl0OworICAgICAgZ2RiX2NhbGxiYWNrLm1hZ2ljID0gSE9TVF9DQUxMQkFDS19NQUdJQzsKKyAgICAgIGNhbGxiYWNrc19pbml0aWFsaXplZCA9IDE7CisgICAgfQorfQorCisvKiBSZWxlYXNlIGNhbGxiYWNrcyAoZnJlZSByZXNvdXJjZXMgdXNlZCBieSB0aGVtKS4gICovCisKK3N0YXRpYyB2b2lkCitlbmRfY2FsbGJhY2tzICgpCit7CisgIGlmIChjYWxsYmFja3NfaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgZ2RiX2NhbGxiYWNrLnNodXRkb3duICgmZ2RiX2NhbGxiYWNrKTsKKyAgICAgIGNhbGxiYWNrc19pbml0aWFsaXplZCA9IDA7CisgICAgfQorfQorCisvKiBHREIgdmVyc2lvbiBvZiBvc193cml0ZV9zdGRvdXQgY2FsbGJhY2suICAqLworCitzdGF0aWMgaW50IAorZ2RiX29zX3dyaXRlX3N0ZG91dCAocCwgYnVmLCBsZW4pCisgICAgIGhvc3RfY2FsbGJhY2sgKnA7CisgICAgIGNvbnN0IGNoYXIgKmJ1ZjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaW50IGk7CisgIGNoYXIgYlsyXTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIAorICAgIHsKKyAgICAgIGJbMF0gPSBidWZbaV07CisgICAgICBiWzFdID0gMDsKKyAgICAgIGlmICh0YXJnZXRfb3V0cHV0X2hvb2spCisJdGFyZ2V0X291dHB1dF9ob29rIChiKTsKKyAgICAgIGVsc2UKKwlmcHV0c19maWx0ZXJlZCAoYiwgZ2RiX3N0ZG91dCk7CisgICAgfQorICByZXR1cm4gbGVuOworfQorCisvKiBHREIgdmVyc2lvbiBvZiBvc19mbHVzaF9zdGRvdXQgY2FsbGJhY2suICAqLworCitzdGF0aWMgdm9pZAorZ2RiX29zX2ZsdXNoX3N0ZG91dCAocCkKKyAgICAgaG9zdF9jYWxsYmFjayAqcDsKK3sKKyAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKK30KKworLyogR0RCIHZlcnNpb24gb2Ygb3Nfd3JpdGVfc3RkZXJyIGNhbGxiYWNrLiAgKi8KKworc3RhdGljIGludCAKK2dkYl9vc193cml0ZV9zdGRlcnIgKHAsIGJ1ZiwgbGVuKQorICAgICBob3N0X2NhbGxiYWNrICpwOworICAgICBjb25zdCBjaGFyICpidWY7CisgICAgIGludCBsZW47Cit7CisgIGludCBpOworICBjaGFyIGJbMl07CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSAKKyAgICB7CisgICAgICBiWzBdID0gYnVmW2ldOworICAgICAgYlsxXSA9IDA7CisgICAgICBpZiAodGFyZ2V0X291dHB1dF9ob29rKQorCXRhcmdldF9vdXRwdXRfaG9vayAoYik7CisgICAgICBlbHNlCisJZnB1dHNfZmlsdGVyZWQgKGIsIGdkYl9zdGRlcnIpOworICAgIH0KKyAgcmV0dXJuIGxlbjsKK30KKworLyogR0RCIHZlcnNpb24gb2Ygb3NfZmx1c2hfc3RkZXJyIGNhbGxiYWNrLiAgKi8KKworc3RhdGljIHZvaWQKK2dkYl9vc19mbHVzaF9zdGRlcnIgKHApCisgICAgIGhvc3RfY2FsbGJhY2sgKnA7Cit7CisgIGdkYl9mbHVzaCAoZ2RiX3N0ZGVycik7Cit9CisKKy8qIEdEQiB2ZXJzaW9uIG9mIHByaW50Zl9maWx0ZXJlZCBjYWxsYmFjay4gICovCisKKy8qIFZBUkFSR1MgKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCitnZGJfb3NfcHJpbnRmX2ZpbHRlcmVkIChob3N0X2NhbGxiYWNrICpwLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKyNlbHNlCitnZGJfb3NfcHJpbnRmX2ZpbHRlcmVkIChwLCB2YV9hbGlzdCkKKyAgICAgaG9zdF9jYWxsYmFjayAqcDsKKyAgICAgdmFfZGNsCisjZW5kaWYKK3sKKyAgdmFfbGlzdCBhcmdzOworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyNlbHNlCisgIGNoYXIgKmZvcm1hdDsKKworICB2YV9zdGFydCAoYXJncyk7CisgIGZvcm1hdCA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKKyNlbmRpZgorCisgIHZmcHJpbnRmX2ZpbHRlcmVkIChnZGJfc3Rkb3V0LCBmb3JtYXQsIGFyZ3MpOworCisgIHZhX2VuZCAoYXJncyk7Cit9CisKKy8qIEdEQiB2ZXJzaW9uIG9mIGVycm9yIHZwcmludGZfZmlsdGVyZWQuICAqLworCisvKiBWQVJBUkdTICovCitzdGF0aWMgdm9pZAorI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworZ2RiX29zX3ZwcmludGZfZmlsdGVyZWQgKGhvc3RfY2FsbGJhY2sgKnAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKKyNlbHNlCitnZGJfb3NfdnByaW50Zl9maWx0ZXJlZCAocCwgZm9ybWF0LCBhcCkKKyAgICAgaG9zdF9jYWxsYmFjayAqcDsKKyAgICAgY2hhciAqZm9ybWF0OworICAgICB2YV9saXN0IGFwOworI2VuZGlmCit7CisgIHZmcHJpbnRmX2ZpbHRlcmVkIChnZGJfc3Rkb3V0LCBmb3JtYXQsIGFwKTsKK30KKworLyogR0RCIHZlcnNpb24gb2YgZXJyb3IgZXZwcmludGZfZmlsdGVyZWQuICAqLworCisvKiBWQVJBUkdTICovCitzdGF0aWMgdm9pZAorI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworZ2RiX29zX2V2cHJpbnRmX2ZpbHRlcmVkIChob3N0X2NhbGxiYWNrICpwLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCisjZWxzZQorZ2RiX29zX2V2cHJpbnRmX2ZpbHRlcmVkIChwLCBmb3JtYXQsIGFwKQorICAgICBob3N0X2NhbGxiYWNrICpwOworICAgICBjaGFyICpmb3JtYXQ7CisgICAgIHZhX2xpc3QgYXA7CisjZW5kaWYKK3sKKyAgdmZwcmludGZfZmlsdGVyZWQgKGdkYl9zdGRlcnIsIGZvcm1hdCwgYXApOworfQorCisvKiBHREIgdmVyc2lvbiBvZiBlcnJvciBjYWxsYmFjay4gICovCisKKy8qIFZBUkFSR1MgKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCitnZGJfb3NfZXJyb3IgKGhvc3RfY2FsbGJhY2sgKnAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorI2Vsc2UKK2dkYl9vc19lcnJvciAocCwgdmFfYWxpc3QpCisgICAgIGhvc3RfY2FsbGJhY2sgKnA7CisgICAgIHZhX2RjbAorI2VuZGlmCit7CisgIGlmIChlcnJvcl9ob29rKQorICAgICgqZXJyb3JfaG9vaykgKCk7CisgIGVsc2UgCisgICAgeworICAgICAgdmFfbGlzdCBhcmdzOworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworICAgICAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisjZWxzZQorICAgICAgY2hhciAqZm9ybWF0OworCisgICAgICB2YV9zdGFydCAoYXJncyk7CisgICAgICBmb3JtYXQgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7CisjZW5kaWYKKworICAgICAgZXJyb3JfYmVnaW4gKCk7CisgICAgICB2ZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgZm9ybWF0LCBhcmdzKTsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJcbiIpOworICAgICAgdmFfZW5kIChhcmdzKTsKKyAgICAgIHJldHVybl90b190b3BfbGV2ZWwgKFJFVFVSTl9FUlJPUik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZ2Ric2ltX2ZldGNoX3JlZ2lzdGVyIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBzdGF0aWMgaW50IHdhcm5fdXNlciA9IDE7CisgIGlmIChyZWdubyA9PSAtMSkgCisgICAgeworICAgICAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDwgTlVNX1JFR1M7IHJlZ25vKyspCisJZ2Ric2ltX2ZldGNoX3JlZ2lzdGVyIChyZWdubyk7CisgICAgfQorICBlbHNlIGlmIChSRUdJU1RFUl9OQU1FIChyZWdubykgIT0gTlVMTCAmJiAqUkVHSVNURVJfTkFNRSAocmVnbm8pICE9ICdcMCcpCisgICAgeworICAgICAgY2hhciBidWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKyAgICAgIGludCBucl9ieXRlcyA9IHNpbV9mZXRjaF9yZWdpc3RlciAoZ2Ric2ltX2Rlc2MsIHJlZ25vLCBidWYsIFJFR0lTVEVSX1JBV19TSVpFIChyZWdubykpOworICAgICAgaWYgKG5yX2J5dGVzID09IDApCisJLyogcmVnaXN0ZXIgbm90IGFwcGxpY2FibGUsIHN1cHBseSB6ZXJvJ3MgKi8KKwltZW1zZXQgKGJ1ZiwgMCwgTUFYX1JFR0lTVEVSX1JBV19TSVpFKTsKKyAgICAgIGVsc2UgaWYgKG5yX2J5dGVzID4gMCAmJiBucl9ieXRlcyAhPSBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pCisJICAgICAgICYmIHdhcm5fdXNlcikKKwl7CisJICBwcmludGZfdW5maWx0ZXJlZCAoIlNpemUgb2YgcmVnaXN0ZXIgJXMgKCVkKSBpbmNvcnJlY3QgKCVkIGluc3RlYWQgb2YgJWQpKSIsCisJCQkgICAgIFJFR0lTVEVSX05BTUUgKHJlZ25vKSwgcmVnbm8sCisJCQkgICAgIG5yX2J5dGVzLCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pKTsKKwkgIHdhcm5fdXNlciA9IDA7CisJfQorICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgYnVmKTsKKyAgICAgIGlmIChzcl9nZXRfZGVidWcgKCkpCisJeworCSAgcHJpbnRmX2ZpbHRlcmVkICgiZ2Ric2ltX2ZldGNoX3JlZ2lzdGVyOiAlZCIsIHJlZ25vKTsKKwkgIC8qIEZJWE1FOiBXZSBjb3VsZCBwcmludCBzb21ldGhpbmcgbW9yZSBpbnRlbGxpZ2libGUuICAqLworCSAgZHVtcF9tZW0gKGJ1ZiwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ25vKSk7CisJfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorZ2Ric2ltX3N0b3JlX3JlZ2lzdGVyIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBpZiAocmVnbm8gID09IC0xKSAKKyAgICB7CisgICAgICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCBOVU1fUkVHUzsgcmVnbm8rKykKKwlnZGJzaW1fc3RvcmVfcmVnaXN0ZXIgKHJlZ25vKTsKKyAgICB9CisgIGVsc2UgaWYgKFJFR0lTVEVSX05BTUUgKHJlZ25vKSAhPSBOVUxMICYmICpSRUdJU1RFUl9OQU1FIChyZWdubykgIT0gJ1wwJykKKyAgICB7CisgICAgICBjaGFyIHRtcFtNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworICAgICAgaW50IG5yX2J5dGVzOworICAgICAgcmVhZF9yZWdpc3Rlcl9nZW4gKHJlZ25vLCB0bXApOworICAgICAgbnJfYnl0ZXMgPSBzaW1fc3RvcmVfcmVnaXN0ZXIgKGdkYnNpbV9kZXNjLCByZWdubywgdG1wLCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pKTsKKyAgICAgIGlmIChucl9ieXRlcyA+IDAgJiYgbnJfYnl0ZXMgIT0gUkVHSVNURVJfUkFXX1NJWkUgKHJlZ25vKSkKKwlmYXRhbCAoIlJlZ2lzdGVyIHNpemUgZGlmZmVyZW50IHRvIGV4cGVjdGVkIik7CisgICAgICBpZiAoc3JfZ2V0X2RlYnVnICgpKQorCXsKKwkgIHByaW50Zl9maWx0ZXJlZCAoImdkYnNpbV9zdG9yZV9yZWdpc3RlcjogJWQiLCByZWdubyk7CisJICAvKiBGSVhNRTogV2UgY291bGQgcHJpbnQgc29tZXRoaW5nIG1vcmUgaW50ZWxsaWdpYmxlLiAgKi8KKwkgIGR1bXBfbWVtICh0bXAsIFJFR0lTVEVSX1JBV19TSVpFIChyZWdubykpOworCX0KKyAgICB9Cit9CisKKy8qIEtpbGwgdGhlIHJ1bm5pbmcgcHJvZ3JhbS4gIFRoaXMgbWF5IGludm9sdmUgY2xvc2luZyBhbnkgb3BlbiBmaWxlcworICAgYW5kIHJlbGVhc2luZyBvdGhlciByZXNvdXJjZXMgYWNxdWlyZWQgYnkgdGhlIHNpbXVsYXRlZCBwcm9ncmFtLiAgKi8KKworc3RhdGljIHZvaWQKK2dkYnNpbV9raWxsICgpCit7CisgIGlmIChzcl9nZXRfZGVidWcgKCkpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiZ2Ric2ltX2tpbGxcbiIpOworCisgIC8qIFRoZXJlIGlzIG5vIG5lZWQgdG8gYGtpbGwnIHJ1bm5pbmcgc2ltdWxhdG9yIC0gdGhlIHNpbXVsYXRvciBpcworICAgICBub3QgcnVubmluZyAqLworICBpbmZlcmlvcl9waWQgPSAwOworfQorCisvKiBMb2FkIGFuIGV4ZWN1dGFibGUgZmlsZSBpbnRvIHRoZSB0YXJnZXQgcHJvY2Vzcy4gIFRoaXMgaXMgZXhwZWN0ZWQgdG8KKyAgIG5vdCBvbmx5IGJyaW5nIG5ldyBjb2RlIGludG8gdGhlIHRhcmdldCBwcm9jZXNzLCBidXQgYWxzbyB0byB1cGRhdGUKKyAgIEdEQidzIHN5bWJvbCB0YWJsZXMgdG8gbWF0Y2guICAqLworCitzdGF0aWMgdm9pZAorZ2Ric2ltX2xvYWQgKHByb2csIGZyb210dHkpCisgICAgIGNoYXIgKnByb2c7CisgICAgIGludCBmcm9tdHR5OworeworICBpZiAoc3JfZ2V0X2RlYnVnICgpKQorICAgIHByaW50Zl9maWx0ZXJlZCAoImdkYnNpbV9sb2FkOiBwcm9nIFwiJXNcIlxuIiwgcHJvZyk7CisKKyAgaW5mZXJpb3JfcGlkID0gMDsKKworICAvKiBGSVhNRTogV2Ugd2lsbCBwcmludCB0d28gbWVzc2FnZXMgb24gZXJyb3IuCisgICAgIE5lZWQgZXJyb3IgdG8gZWl0aGVyIG5vdCBwcmludCBhbnl0aGluZyBpZiBwYXNzZWQgTlVMTCBvciBuZWVkCisgICAgIGFub3RoZXIgcm91dGluZSB0aGF0IGRvZXNuJ3QgdGFrZSBhbnkgYXJndW1lbnRzLiAgKi8KKyAgaWYgKHNpbV9sb2FkIChnZGJzaW1fZGVzYywgcHJvZywgTlVMTCwgZnJvbXR0eSkgPT0gU0lNX1JDX0ZBSUwpCisgICAgZXJyb3IgKCJ1bmFibGUgdG8gbG9hZCBwcm9ncmFtIik7CisKKyAgLyogRklYTUU6IElmIGEgbG9hZCBjb21tYW5kIHNob3VsZCByZXNldCB0aGUgdGFyZ2V0cyByZWdpc3RlcnMgdGhlbgorICAgICBhIGNhbGwgdG8gc2ltX2NyZWF0ZV9pbmZlcmlvcigpIHNob3VsZCBnbyBoZXJlLiAqLworCisgIHByb2dyYW1fbG9hZGVkID0gMTsKK30KKworCisvKiBTdGFydCBhbiBpbmZlcmlvciBwcm9jZXNzIGFuZCBzZXQgaW5mZXJpb3JfcGlkIHRvIGl0cyBwaWQuCisgICBFWEVDX0ZJTEUgaXMgdGhlIGZpbGUgdG8gcnVuLgorICAgQVJHUyBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBhcmd1bWVudHMgdG8gdGhlIHByb2dyYW0uCisgICBFTlYgaXMgdGhlIGVudmlyb25tZW50IHZlY3RvciB0byBwYXNzLiAgRXJyb3JzIHJlcG9ydGVkIHdpdGggZXJyb3IoKS4KKyAgIE9uIFZ4V29ya3MgYW5kIHZhcmlvdXMgc3RhbmRhbG9uZSBzeXN0ZW1zLCB3ZSBpZ25vcmUgZXhlY19maWxlLiAgKi8KKy8qIFRoaXMgaXMgY2FsbGVkIG5vdCBvbmx5IHdoZW4gd2UgZmlyc3QgYXR0YWNoLCBidXQgYWxzbyB3aGVuIHRoZQorICAgdXNlciB0eXBlcyAicnVuIiBhZnRlciBoYXZpbmcgYXR0YWNoZWQuICAqLworCitzdGF0aWMgdm9pZAorZ2Ric2ltX2NyZWF0ZV9pbmZlcmlvciAoZXhlY19maWxlLCBhcmdzLCBlbnYpCisgICAgIGNoYXIgKmV4ZWNfZmlsZTsKKyAgICAgY2hhciAqYXJnczsKKyAgICAgY2hhciAqKmVudjsKK3sKKyAgaW50IGxlbjsKKyAgY2hhciAqYXJnX2J1ZiwqKmFyZ3Y7CisKKyAgaWYgKGV4ZWNfZmlsZSA9PSAwIHx8IGV4ZWNfYmZkID09IDApCisgICAgd2FybmluZyAoIk5vIGV4ZWN1dGFibGUgZmlsZSBzcGVjaWZpZWQuIik7CisgIGlmICghIHByb2dyYW1fbG9hZGVkKQorICAgIHdhcm5pbmcgKCJObyBwcm9ncmFtIGxvYWRlZC4iKTsKKworICBpZiAoc3JfZ2V0X2RlYnVnICgpKQorICAgIHByaW50Zl9maWx0ZXJlZCAoImdkYnNpbV9jcmVhdGVfaW5mZXJpb3I6IGV4ZWNfZmlsZSBcIiVzXCIsIGFyZ3MgXCIlc1wiXG4iLAorCQkgICAgIChleGVjX2ZpbGUgPyBleGVjX2ZpbGU6ICIoTlVMTCkiKSwKKwkJICAgICBhcmdzKTsKKworICBnZGJzaW1fa2lsbCAoKTsJIAorICByZW1vdmVfYnJlYWtwb2ludHMgKCk7CisgIGluaXRfd2FpdF9mb3JfaW5mZXJpb3IgKCk7CisKKyAgaWYgKGV4ZWNfZmlsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGxlbiA9IHN0cmxlbiAoZXhlY19maWxlKSArIDEgKyBzdHJsZW4gKGFyZ3MpICsgMSArIC8qc2xvcCovIDEwOworICAgICAgYXJnX2J1ZiA9IChjaGFyICopIGFsbG9jYSAobGVuKTsKKyAgICAgIGFyZ19idWZbMF0gPSAnXDAnOworICAgICAgc3RyY2F0IChhcmdfYnVmLCBleGVjX2ZpbGUpOworICAgICAgc3RyY2F0IChhcmdfYnVmLCAiICIpOworICAgICAgc3RyY2F0IChhcmdfYnVmLCBhcmdzKTsKKyAgICAgIGFyZ3YgPSBidWlsZGFyZ3YgKGFyZ19idWYpOworICAgICAgbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVhcmd2LCBhcmd2KTsKKyAgICB9CisgIGVsc2UKKyAgICBhcmd2ID0gTlVMTDsKKyAgc2ltX2NyZWF0ZV9pbmZlcmlvciAoZ2Ric2ltX2Rlc2MsIGV4ZWNfYmZkLCBhcmd2LCBlbnYpOworCisgIGluZmVyaW9yX3BpZCA9IDQyOworICBpbnNlcnRfYnJlYWtwb2ludHMgKCk7IC8qIE5lZWRlZCB0byBnZXQgY29ycmVjdCBpbnN0cnVjdGlvbiBpbiBjYWNoZSAqLworCisgIGNsZWFyX3Byb2NlZWRfc3RhdHVzICgpOworCisgIC8qIE5COiBFbnRyeSBwb2ludCBhbHJlYWR5IHNldCBieSBzaW1fY3JlYXRlX2luZmVyaW9yLiAqLworICBwcm9jZWVkICgoQ09SRV9BRERSKS0xLCBUQVJHRVRfU0lHTkFMX0RFRkFVTFQsIDApOworfQorCisvKiBUaGUgb3BlbiByb3V0aW5lIHRha2VzIHRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzIGZyb20gdGhlIGNvbW1hbmQsCisgICBhbmQgKGlmIHN1Y2Nlc3NmdWwpIHB1c2hlcyBhIG5ldyB0YXJnZXQgb250byB0aGUgc3RhY2suCisgICBUYXJnZXRzIHNob3VsZCBzdXBwbHkgdGhpcyByb3V0aW5lLCBpZiBvbmx5IHRvIHByb3ZpZGUgYW4gZXJyb3IgbWVzc2FnZS4gICovCisvKiBDYWxsZWQgd2hlbiBzZWxlY3RpbmcgdGhlIHNpbXVsYXRvci4gRUc6IChnZGIpIHRhcmdldCBzaW0gbmFtZS4gICovCisKK3N0YXRpYyB2b2lkCitnZGJzaW1fb3BlbiAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IGxlbjsKKyAgY2hhciAqYXJnX2J1ZjsKKyAgY2hhciAqKmFyZ3Y7CisKKyAgaWYgKHNyX2dldF9kZWJ1ZyAoKSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJnZGJzaW1fb3BlbjogYXJncyBcIiVzXCJcbiIsIGFyZ3MgPyBhcmdzIDogIihudWxsKSIpOworCisgIC8qIFJlbW92ZSBjdXJyZW50IHNpbXVsYXRvciBpZiBvbmUgZXhpc3RzLiAgT25seSBkbyB0aGlzIGlmIHRoZSBzaW11bGF0b3IKKyAgICAgaGFzIGJlZW4gb3BlbmVkIGJlY2F1c2Ugc2ltX2Nsb3NlIHJlcXVpcmVzIGl0LgorICAgICBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIHRoZSBjYWxsIHRvIHB1c2hfdGFyZ2V0IGJlbG93IHdpbGwgY2F1c2UKKyAgICAgc2ltX2Nsb3NlIHRvIGJlIGNhbGxlZCBpZiB0aGUgc2ltdWxhdG9yIGlzIGFscmVhZHkgb3BlbiwgYnV0IHB1c2hfdGFyZ2V0CisgICAgIGlzIGNhbGxlZCBhZnRlciBzaW1fb3BlbiEgIFdlIGNhbid0IG1vdmUgdGhlIGNhbGwgdG8gcHVzaF90YXJnZXQgYmVmb3JlCisgICAgIHRoZSBjYWxsIHRvIHNpbV9vcGVuIGJlY2F1c2Ugc2ltX29wZW4gbWF5IGludm9rZSBgZXJyb3InLiAgKi8KKyAgaWYgKGdkYnNpbV9kZXNjICE9IE5VTEwpCisgICAgdW5wdXNoX3RhcmdldCAoJmdkYnNpbV9vcHMpOworCisgIGxlbiA9ICg3ICsgMSAvKiBnZGJzaW0gKi8KKwkgKyBzdHJsZW4gKCIgLUUgbGl0dGxlIikKKwkgKyBzdHJsZW4gKCIgLS1hcmNoaXRlY3R1cmU9eHh4eHh4eHh4eCIpCisJICsgKGFyZ3MgPyBzdHJsZW4gKGFyZ3MpIDogMCkKKwkgKyA1MCkgLyogc2xhY2sgKi87CisgIGFyZ19idWYgPSAoY2hhciAqKSBhbGxvY2EgKGxlbik7CisgIHN0cmNweSAoYXJnX2J1ZiwgImdkYnNpbSIpOyAvKiA3ICovCisgIC8qIFNwZWNpZnkgdGhlIGJ5dGUgb3JkZXIgZm9yIHRoZSB0YXJnZXQgd2hlbiBpdCBpcyBib3RoIHNlbGVjdGFibGUKKyAgICAgYW5kIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIChub3QgYXV0byBkZXRlY3RlZCkuICovCisgIGlmIChUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFX1AKKyAgICAgICYmICFUQVJHRVRfQllURV9PUkRFUl9BVVRPKQorICAgIHsKKyAgICAgIHN3aXRjaCAoVEFSR0VUX0JZVEVfT1JERVIpCisJeworCWNhc2UgQklHX0VORElBTjoKKwkgIHN0cmNhdCAoYXJnX2J1ZiwgIiAtRSBiaWciKTsKKwkgIGJyZWFrOworCWNhc2UgTElUVExFX0VORElBTjoKKwkgIHN0cmNhdCAoYXJnX2J1ZiwgIiAtRSBsaXR0bGUiKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBmYXRhbCAoIlZhbHVlIG9mIFRBUkdFVF9CWVRFX09SREVSIHVua25vd24iKTsKKwl9CisgICAgfQorICAvKiBTcGVjaWZ5IHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHRhcmdldCB3aGVuIGl0IGhhcyBiZWVuCisgICAgIGV4cGxpY2l0bHkgc3BlY2lmaWVkICovCisgIGlmICghVEFSR0VUX0FSQ0hJVEVDVFVSRV9BVVRPKQorICAgIHsKKyAgICAgIHN0cmNhdCAoYXJnX2J1ZiwgIiAtLWFyY2hpdGVjdHVyZT0iKTsKKyAgICAgIHN0cmNhdCAoYXJnX2J1ZiwgVEFSR0VUX0FSQ0hJVEVDVFVSRS0+cHJpbnRhYmxlX25hbWUpOworICAgIH0KKyAgLyogZmluYWxseSwgYW55IGV4cGxpY2l0IGFyZ3MgKi8KKyAgaWYgKGFyZ3MpCisgICAgeworICAgICAgc3RyY2F0IChhcmdfYnVmLCAiICIpOyAvKiAxICovCisgICAgICBzdHJjYXQgKGFyZ19idWYsIGFyZ3MpOworICAgIH0KKyAgYXJndiA9IGJ1aWxkYXJndiAoYXJnX2J1Zik7CisgIGlmIChhcmd2ID09IE5VTEwpCisgICAgZXJyb3IgKCJJbnN1ZmZpY2llbnQgbWVtb3J5IGF2YWlsYWJsZSB0byBhbGxvY2F0ZSBzaW11bGF0b3IgYXJnIGxpc3QuIik7CisgIG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlYXJndiwgYXJndik7CisKKyAgaW5pdF9jYWxsYmFja3MgKCk7CisgIGdkYnNpbV9kZXNjID0gc2ltX29wZW4gKFNJTV9PUEVOX0RFQlVHLCAmZ2RiX2NhbGxiYWNrLCBleGVjX2JmZCwgYXJndik7CisKKyAgaWYgKGdkYnNpbV9kZXNjID09IDApCisgICAgZXJyb3IgKCJ1bmFibGUgdG8gY3JlYXRlIHNpbXVsYXRvciBpbnN0YW5jZSIpOworCisgIHB1c2hfdGFyZ2V0ICgmZ2Ric2ltX29wcyk7CisgIHRhcmdldF9mZXRjaF9yZWdpc3RlcnMgKC0xKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiQ29ubmVjdGVkIHRvIHRoZSBzaW11bGF0b3IuXG4iKTsKK30KKworLyogRG9lcyB3aGF0ZXZlciBjbGVhbnVwIGlzIHJlcXVpcmVkIGZvciBhIHRhcmdldCB0aGF0IHdlIGFyZSBubyBsb25nZXIKKyAgIGdvaW5nIHRvIGJlIGNhbGxpbmcuICBBcmd1bWVudCBzYXlzIHdoZXRoZXIgd2UgYXJlIHF1aXR0aW5nIGdkYiBhbmQKKyAgIHNob3VsZCBub3QgZ2V0IGh1bmcgaW4gY2FzZSBvZiBlcnJvcnMsIG9yIHdoZXRoZXIgd2Ugd2FudCBhIGNsZWFuCisgICB0ZXJtaW5hdGlvbiBldmVuIGlmIGl0IHRha2VzIGEgd2hpbGUuICBUaGlzIHJvdXRpbmUgaXMgYXV0b21hdGljYWxseQorICAgYWx3YXlzIGNhbGxlZCBqdXN0IGJlZm9yZSBhIHJvdXRpbmUgaXMgcG9wcGVkIG9mZiB0aGUgdGFyZ2V0IHN0YWNrLgorICAgQ2xvc2luZyBmaWxlIGRlc2NyaXB0b3JzIGFuZCBmcmVlaW5nIG1lbW9yeSBhcmUgdHlwaWNhbCB0aGluZ3MgaXQgc2hvdWxkCisgICBkby4gICovCisvKiBDbG9zZSBvdXQgYWxsIGZpbGVzIGFuZCBsb2NhbCBzdGF0ZSBiZWZvcmUgdGhpcyB0YXJnZXQgbG9zZXMgY29udHJvbC4gKi8KKworc3RhdGljIHZvaWQKK2dkYnNpbV9jbG9zZSAocXVpdHRpbmcpCisgICAgIGludCBxdWl0dGluZzsKK3sKKyAgaWYgKHNyX2dldF9kZWJ1ZyAoKSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJnZGJzaW1fY2xvc2U6IHF1aXR0aW5nICVkXG4iLCBxdWl0dGluZyk7CisKKyAgcHJvZ3JhbV9sb2FkZWQgPSAwOworCisgIGlmIChnZGJzaW1fZGVzYyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHNpbV9jbG9zZSAoZ2Ric2ltX2Rlc2MsIHF1aXR0aW5nKTsKKyAgICAgIGdkYnNpbV9kZXNjID0gTlVMTDsKKyAgICB9CisKKyAgZW5kX2NhbGxiYWNrcyAoKTsKK30KKworLyogVGFrZXMgYSBwcm9ncmFtIHByZXZpb3VzbHkgYXR0YWNoZWQgdG8gYW5kIGRldGFjaGVzIGl0LgorICAgVGhlIHByb2dyYW0gbWF5IHJlc3VtZSBleGVjdXRpb24gKHNvbWUgdGFyZ2V0cyBkbywgc29tZSBkb24ndCkgYW5kIHdpbGwKKyAgIG5vIGxvbmdlciBzdG9wIG9uIHNpZ25hbHMsIGV0Yy4gIFdlIGJldHRlciBub3QgaGF2ZSBsZWZ0IGFueSBicmVha3BvaW50cworICAgaW4gdGhlIHByb2dyYW0gb3IgaXQnbGwgZGllIHdoZW4gaXQgaGl0cyBvbmUuICBBUkdTIGlzIGFyZ3VtZW50cworICAgdHlwZWQgYnkgdGhlIHVzZXIgKGUuZy4gYSBzaWduYWwgdG8gc2VuZCB0aGUgcHJvY2VzcykuICBGUk9NX1RUWQorICAgc2F5cyB3aGV0aGVyIHRvIGJlIHZlcmJvc2Ugb3Igbm90LiAgKi8KKy8qIFRlcm1pbmF0ZSB0aGUgb3BlbiBjb25uZWN0aW9uIHRvIHRoZSByZW1vdGUgZGVidWdnZXIuCisgICBVc2UgdGhpcyB3aGVuIHlvdSB3YW50IHRvIGRldGFjaCBhbmQgZG8gc29tZXRoaW5nIGVsc2Ugd2l0aCB5b3VyIGdkYi4gICovCisKK3N0YXRpYyB2b2lkCitnZGJzaW1fZGV0YWNoIChhcmdzLGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGlmIChzcl9nZXRfZGVidWcgKCkpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiZ2Ric2ltX2RldGFjaDogYXJncyBcIiVzXCJcbiIsIGFyZ3MpOworCisgIHBvcF90YXJnZXQgKCk7CQkvKiBjYWxscyBnZGJzaW1fY2xvc2UgdG8gZG8gdGhlIHJlYWwgd29yayAqLworICBpZiAoZnJvbV90dHkpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiRW5kaW5nIHNpbXVsYXRvciAlcyBkZWJ1Z2dpbmdcbiIsIHRhcmdldF9zaG9ydG5hbWUpOworfQorIAorLyogUmVzdW1lIGV4ZWN1dGlvbiBvZiB0aGUgdGFyZ2V0IHByb2Nlc3MuICBTVEVQIHNheXMgd2hldGhlciB0byBzaW5nbGUtc3RlcAorICAgb3IgdG8gcnVuIGZyZWU7IFNJR0dOQUwgaXMgdGhlIHNpZ25hbCB2YWx1ZSAoZS5nLiBTSUdJTlQpIHRvIGJlIGdpdmVuCisgICB0byB0aGUgdGFyZ2V0LCBvciB6ZXJvIGZvciBubyBzaWduYWwuICAqLworCitzdGF0aWMgZW51bSB0YXJnZXRfc2lnbmFsIHJlc3VtZV9zaWdnbmFsOworc3RhdGljIGludCByZXN1bWVfc3RlcDsKKworc3RhdGljIHZvaWQKK2dkYnNpbV9yZXN1bWUgKHBpZCwgc3RlcCwgc2lnZ25hbCkKKyAgICAgaW50IHBpZCwgc3RlcDsKKyAgICAgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ2duYWw7Cit7CisgIGlmIChpbmZlcmlvcl9waWQgIT0gNDIpCisgICAgZXJyb3IgKCJUaGUgcHJvZ3JhbSBpcyBub3QgYmVpbmcgcnVuLiIpOworCisgIGlmIChzcl9nZXRfZGVidWcgKCkpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiZ2Ric2ltX3Jlc3VtZTogc3RlcCAlZCwgc2lnbmFsICVkXG4iLCBzdGVwLCBzaWdnbmFsKTsKKworICByZXN1bWVfc2lnZ25hbCA9IHNpZ2duYWw7CisgIHJlc3VtZV9zdGVwID0gc3RlcDsKK30KKworLyogTm90aWZ5IHRoZSBzaW11bGF0b3Igb2YgYW4gYXN5bmNocm9ub3VzIHJlcXVlc3QgdG8gc3RvcC4KKyAgIAorICAgVGhlIHNpbXVsYXRvciBzaGFsbCBlbnN1cmUgdGhhdCB0aGUgc3RvcCByZXF1ZXN0IGlzIGV2ZW50dWFsbHkKKyAgIGRlbGl2ZXJlZCB0byB0aGUgc2ltdWxhdG9yLiAgSWYgdGhlIGNhbGwgaXMgbWFkZSB3aGlsZSB0aGUKKyAgIHNpbXVsYXRvciBpcyBub3QgcnVubmluZyB0aGVuIHRoZSBzdG9wIHJlcXVlc3QgaXMgcHJvY2Vzc2VkIHdoZW4KKyAgIHRoZSBzaW11bGF0b3IgaXMgbmV4dCByZXN1bWVkLgorCisgICBGb3Igc2ltdWxhdG9ycyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLCBqdXN0IGFib3J0ICovCisKK3N0YXRpYyB2b2lkCitnZGJzaW1fc3RvcCAoKQoreworICBpZiAoISBzaW1fc3RvcCAoZ2Ric2ltX2Rlc2MpKQorICAgIHsKKyAgICAgIHF1aXQgKCk7CisgICAgfQorfQorCisvKiBHREIgdmVyc2lvbiBvZiBvc19wb2xsX3F1aXQgY2FsbGJhY2suCisgICBUYWtlbiBmcm9tIGdkYi91dGlsLmMgLSBzaG91bGQgYmUgaW4gYSBsaWJyYXJ5ICovCisKK3N0YXRpYyBpbnQKK2dkYl9vc19wb2xsX3F1aXQgKHApCisgICAgIGhvc3RfY2FsbGJhY2sgKnA7Cit7CisgIG5vdGljZV9xdWl0ICgpOworICBpZiAocXVpdF9mbGFnKSAvKiBnZGIncyBpZGVhIG9mIHF1aXQgKi8KKyAgICB7CisgICAgICBxdWl0X2ZsYWcgPSAwOyAvKiB3ZSd2ZSBzdG9sZW4gaXQgKi8KKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgZWxzZSBpZiAoaW1tZWRpYXRlX3F1aXQpCisgICAgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICByZXR1cm4gMDsKK30KKworLyogV2FpdCBmb3IgaW5mZXJpb3IgcHJvY2VzcyB0byBkbyBzb21ldGhpbmcuICBSZXR1cm4gcGlkIG9mIGNoaWxkLAorICAgb3IgLTEgaW4gY2FzZSBvZiBlcnJvcjsgc3RvcmUgc3RhdHVzIHRocm91Z2ggYXJndW1lbnQgcG9pbnRlciBTVEFUVVMsCisgICBqdXN0IGFzIGB3YWl0JyB3b3VsZC4gKi8KKworc3RhdGljIHZvaWQKK2dkYnNpbV9jbnRybF9jIChzaWdubykKKyAgICAgaW50IHNpZ25vOworeworICBnZGJzaW1fc3RvcCAoKTsKK30KKworc3RhdGljIGludAorZ2Ric2ltX3dhaXQgKHBpZCwgc3RhdHVzKQorICAgICBpbnQgcGlkOworICAgICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0YXR1czsKK3sKKyAgc3RhdGljIFJFVFNJR1RZUEUgKCpwcmV2X3NpZ2ludCkgKCk7CisgIGludCBzaWdyYyA9IDA7CisgIGVudW0gc2ltX3N0b3AgcmVhc29uID0gc2ltX3J1bm5pbmc7CisKKyAgaWYgKHNyX2dldF9kZWJ1ZyAoKSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJnZGJzaW1fd2FpdFxuIik7CisKKyNpZiBkZWZpbmVkIChIQVZFX1NJR0FDVElPTikgJiYgZGVmaW5lZCAoU0FfUkVTVEFSVCkKKyAgeworICAgIHN0cnVjdCBzaWdhY3Rpb24gc2EsIG9zYTsKKyAgICBzYS5zYV9oYW5kbGVyID0gZ2Ric2ltX2NudHJsX2M7CisgICAgc2lnZW1wdHlzZXQgKCZzYS5zYV9tYXNrKTsKKyAgICBzYS5zYV9mbGFncyA9IDA7CisgICAgc2lnYWN0aW9uIChTSUdJTlQsICZzYSwgJm9zYSk7CisgICAgcHJldl9zaWdpbnQgPSBvc2Euc2FfaGFuZGxlcjsKKyAgfQorI2Vsc2UKKyAgcHJldl9zaWdpbnQgPSBzaWduYWwgKFNJR0lOVCwgZ2Ric2ltX2NudHJsX2MpOworI2VuZGlmCisgIHNpbV9yZXN1bWUgKGdkYnNpbV9kZXNjLCByZXN1bWVfc3RlcCwKKwkgICAgICB0YXJnZXRfc2lnbmFsX3RvX2hvc3QgKHJlc3VtZV9zaWdnbmFsKSk7CisgIHNpZ25hbCAoU0lHSU5ULCBwcmV2X3NpZ2ludCk7CisgIHJlc3VtZV9zdGVwID0gMDsKKworICBzaW1fc3RvcF9yZWFzb24gKGdkYnNpbV9kZXNjLCAmcmVhc29uLCAmc2lncmMpOworCisgIHN3aXRjaCAocmVhc29uKQorICAgIHsKKyAgICBjYXNlIHNpbV9leGl0ZWQ6CisgICAgICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVEOworICAgICAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gc2lncmM7CisgICAgICBicmVhazsKKyAgICBjYXNlIHNpbV9zdG9wcGVkOgorICAgICAgc3dpdGNoIChzaWdyYykKKwl7CisJY2FzZSBTSUdBQlJUOgorCSAgcXVpdCAoKTsKKwkgIGJyZWFrOworCWNhc2UgU0lHSU5UOgorCWNhc2UgU0lHVFJBUDoKKwlkZWZhdWx0OgorCSAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisJICAvKiBUaGUgc2lnbmFsIGluIHNpZ3JjIGlzIGEgaG9zdCBzaWduYWwuICBUaGF0IHByb2JhYmx5CisJICAgICBzaG91bGQgYmUgZml4ZWQuICAqLworCSAgc3RhdHVzLT52YWx1ZS5zaWcgPSB0YXJnZXRfc2lnbmFsX2Zyb21faG9zdCAoc2lncmMpOworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBzaW1fc2lnbmFsbGVkOgorICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NJR05BTExFRDsKKyAgICAgIC8qIFRoZSBzaWduYWwgaW4gc2lncmMgaXMgYSBob3N0IHNpZ25hbC4gIFRoYXQgcHJvYmFibHkKKwkgc2hvdWxkIGJlIGZpeGVkLiAgKi8KKyAgICAgIHN0YXR1cy0+dmFsdWUuc2lnID0gdGFyZ2V0X3NpZ25hbF9mcm9tX2hvc3QgKHNpZ3JjKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugc2ltX3J1bm5pbmc6CisgICAgY2FzZSBzaW1fcG9sbGluZzoKKyAgICAgIC8qIEZJWE1FOiBJcyB0aGlzIGNvcnJlY3Q/ICovCisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIGluZmVyaW9yX3BpZDsKK30KKworLyogR2V0IHJlYWR5IHRvIG1vZGlmeSB0aGUgcmVnaXN0ZXJzIGFycmF5LiAgT24gbWFjaGluZXMgd2hpY2ggc3RvcmUKKyAgIGluZGl2aWR1YWwgcmVnaXN0ZXJzLCB0aGlzIGRvZXNuJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gIE9uIG1hY2hpbmVzCisgICB3aGljaCBzdG9yZSBhbGwgdGhlIHJlZ2lzdGVycyBpbiBvbmUgZmVsbCBzd29vcCwgdGhpcyBtYWtlcyBzdXJlCisgICB0aGF0IHJlZ2lzdGVycyBjb250YWlucyBhbGwgdGhlIHJlZ2lzdGVycyBmcm9tIHRoZSBwcm9ncmFtIGJlaW5nCisgICBkZWJ1Z2dlZC4gICovCisKK3N0YXRpYyB2b2lkCitnZGJzaW1fcHJlcGFyZV90b19zdG9yZSAoKQoreworICAvKiBEbyBub3RoaW5nLCBzaW5jZSB3ZSBjYW4gc3RvcmUgaW5kaXZpZHVhbCByZWdzICovCit9CisKK3N0YXRpYyBpbnQKK2dkYnNpbV94ZmVyX2luZmVyaW9yX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4sIHdyaXRlLCB0YXJnZXQpCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47CisgICAgIGludCB3cml0ZTsKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldDsJCQkvKiBpZ25vcmVkICovCit7CisgIGlmICghIHByb2dyYW1fbG9hZGVkKQorICAgIGVycm9yICgiTm8gcHJvZ3JhbSBsb2FkZWQuIik7CisKKyAgaWYgKHNyX2dldF9kZWJ1ZyAoKSkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJnZGJzaW1feGZlcl9pbmZlcmlvcl9tZW1vcnk6IG15YWRkciAweCV4LCBtZW1hZGRyIDB4JXgsIGxlbiAlZCwgd3JpdGUgJWRcbiIsCisJCSAgICAgICBteWFkZHIsIG1lbWFkZHIsIGxlbiwgd3JpdGUpOworICAgICAgaWYgKHNyX2dldF9kZWJ1ZyAoKSAmJiB3cml0ZSkKKwlkdW1wX21lbShteWFkZHIsIGxlbik7CisgICAgfQorCisgIGlmICh3cml0ZSkKKyAgICB7CisgICAgICBsZW4gPSBzaW1fd3JpdGUgKGdkYnNpbV9kZXNjLCBtZW1hZGRyLCBteWFkZHIsIGxlbik7CisgICAgfQorICBlbHNlIAorICAgIHsKKyAgICAgIGxlbiA9IHNpbV9yZWFkIChnZGJzaW1fZGVzYywgbWVtYWRkciwgbXlhZGRyLCBsZW4pOworICAgICAgaWYgKHNyX2dldF9kZWJ1ZyAoKSAmJiBsZW4gPiAwKQorCWR1bXBfbWVtKG15YWRkciwgbGVuKTsKKyAgICB9IAorICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgdm9pZAorZ2Ric2ltX2ZpbGVzX2luZm8gKHRhcmdldCkKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldDsKK3sKKyAgY2hhciAqZmlsZSA9ICJub3RoaW5nIjsKKworICBpZiAoZXhlY19iZmQpCisgICAgZmlsZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGV4ZWNfYmZkKTsKKworICBpZiAoc3JfZ2V0X2RlYnVnICgpKQorICAgIHByaW50Zl9maWx0ZXJlZCAoImdkYnNpbV9maWxlc19pbmZvOiBmaWxlIFwiJXNcIlxuIiwgZmlsZSk7CisKKyAgaWYgKGV4ZWNfYmZkKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlx0QXR0YWNoZWQgdG8gJXMgcnVubmluZyBwcm9ncmFtICVzXG4iLAorCQkgICAgICAgdGFyZ2V0X3Nob3J0bmFtZSwgZmlsZSk7CisgICAgICBzaW1faW5mbyAoZ2Ric2ltX2Rlc2MsIDApOworICAgIH0KK30KKworLyogQ2xlYXIgdGhlIHNpbXVsYXRvcidzIG5vdGlvbiBvZiB3aGF0IHRoZSBicmVhayBwb2ludHMgYXJlLiAgKi8KKworc3RhdGljIHZvaWQKK2dkYnNpbV9tb3Vybl9pbmZlcmlvciAoKSAKK3sgCisgIGlmIChzcl9nZXRfZGVidWcgKCkpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiZ2Ric2ltX21vdXJuX2luZmVyaW9yOlxuIik7CisKKyAgcmVtb3ZlX2JyZWFrcG9pbnRzICgpOworICBnZW5lcmljX21vdXJuX2luZmVyaW9yICgpOworfQorCitzdGF0aWMgaW50CitnZGJzaW1faW5zZXJ0X2JyZWFrcG9pbnQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqY29udGVudHNfY2FjaGU7Cit7CisjaWZkZWYgU0lNX0hBU19CUkVBS1BPSU5UUworICBTSU1fUkMgcmV0Y29kZTsKKworICByZXRjb2RlID0gc2ltX3NldF9icmVha3BvaW50IChnZGJzaW1fZGVzYywgYWRkcik7CisKKyAgc3dpdGNoIChyZXRjb2RlKQorICAgIHsKKyAgICBjYXNlIFNJTV9SQ19PSzoKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgU0lNX1JDX0lOU1VGRklDSUVOVF9SRVNPVVJDRVM6CisgICAgICByZXR1cm4gRU5PTUVNOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRUlPOworICAgIH0KKyNlbHNlCisgIHJldHVybiBtZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50CitnZGJzaW1fcmVtb3ZlX2JyZWFrcG9pbnQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqY29udGVudHNfY2FjaGU7Cit7CisjaWZkZWYgU0lNX0hBU19CUkVBS1BPSU5UUworICBTSU1fUkMgcmV0Y29kZTsKKworICByZXRjb2RlID0gc2ltX2NsZWFyX2JyZWFrcG9pbnQgKGdkYnNpbV9kZXNjLCBhZGRyKTsKKworICBzd2l0Y2ggKHJldGNvZGUpCisgICAgeworICAgIGNhc2UgU0lNX1JDX09LOgorICAgIGNhc2UgU0lNX1JDX1VOS05PV05fQlJFQUtQT0lOVDoKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgU0lNX1JDX0lOU1VGRklDSUVOVF9SRVNPVVJDRVM6CisgICAgICByZXR1cm4gRU5PTUVNOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRUlPOworICAgIH0KKyNlbHNlCisgIHJldHVybiBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKTsKKyNlbmRpZgorfQorCisvKiBQYXNzIHRoZSBjb21tYW5kIGFyZ3VtZW50IHRocm91Z2ggdG8gdGhlIHNpbXVsYXRvciB2ZXJiYXRpbS4gIFRoZQorICAgc2ltdWxhdG9yIG11c3QgZG8gYW55IGNvbW1hbmQgaW50ZXJwcmV0YXRpb24gd29yay4gICovCisKK3ZvaWQKK3NpbXVsYXRvcl9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAoZ2Ric2ltX2Rlc2MgPT0gTlVMTCkKKyAgICB7CisKKyAgICAgIC8qIFBSRVZJT1VTTFk6IFRoZSB1c2VyIG1heSBnaXZlIGEgY29tbWFuZCBiZWZvcmUgdGhlIHNpbXVsYXRvcgorICAgICAgICAgaXMgb3BlbmVkLiBbLi4uXSAoPz8/IGFzc3VtaW5nIG9mIGNvdXJzZSBvbmUgd2lzaGVzIHRvCisgICAgICAgICBjb250aW51ZSB0byBhbGxvdyBjb21tYW5kcyB0byBiZSBzZW50IHRvIHVub3BlbmVkIHNpbXVsYXRvcnMsCisgICAgICAgICB3aGljaCBpc24ndCBlbnRpcmVseSB1bnJlYXNvbmFibGUpLiAqLworCisgICAgICAvKiBUaGUgc2ltdWxhdG9yIGlzIGEgYnVpbHRpbiBhYnN0cmFjdGlvbiBvZiBhIHJlbW90ZSB0YXJnZXQuCisgICAgICAgICBDb25zaXN0ZW50IHdpdGggdGhhdCBtb2RlbCwgYWNjZXNzIHRvIHRoZSBzaW11bGF0b3IsIHZpYSBzaW0KKyAgICAgICAgIGNvbW1hbmRzLCBpcyByZXN0cmljdGVkIHRvIHRoZSBwZXJpb2Qgd2hlbiB0aGUgY2hhbm5lbCB0byB0aGUKKyAgICAgICAgIHNpbXVsYXRvciBpcyBvcGVuLiAqLworCisgICAgICBlcnJvciAoIk5vdCBjb25uZWN0ZWQgdG8gdGhlIHNpbXVsYXRvciB0YXJnZXQiKTsKKyAgICB9CisKKyAgc2ltX2RvX2NvbW1hbmQgKGdkYnNpbV9kZXNjLCBhcmdzKTsKKworICAvKiBJbnZhbGlkYXRlIHRoZSByZWdpc3RlciBjYWNoZSwgaW4gY2FzZSB0aGUgc2ltdWxhdG9yIGNvbW1hbmQgZG9lcworICAgICBzb21ldGhpbmcgZnVubnkuICovCisgIHJlZ2lzdGVyc19jaGFuZ2VkICgpOyAKK30KKworLyogRGVmaW5lIHRoZSB0YXJnZXQgc3Vicm91dGluZSBuYW1lcyAqLworCitzdHJ1Y3QgdGFyZ2V0X29wcyBnZGJzaW1fb3BzIDsKKworc3RhdGljIHZvaWQgCitpbml0X2dkYnNpbV9vcHModm9pZCkKK3sKKyAgZ2Ric2ltX29wcy50b19zaG9ydG5hbWUgPSAgICJzaW0iOwkJCisgIGdkYnNpbV9vcHMudG9fbG9uZ25hbWUgPSAgICJzaW11bGF0b3IiOwkJCisgIGdkYnNpbV9vcHMudG9fZG9jID0gICAiVXNlIHRoZSBjb21waWxlZC1pbiBzaW11bGF0b3IuIjsgIAorICBnZGJzaW1fb3BzLnRvX29wZW4gPSAgIGdkYnNpbV9vcGVuOwkJCisgIGdkYnNpbV9vcHMudG9fY2xvc2UgPSAgIGdkYnNpbV9jbG9zZTsJCQorICBnZGJzaW1fb3BzLnRvX2F0dGFjaCA9ICAgTlVMTDsKKyAgZ2Ric2ltX29wcy50b19wb3N0X2F0dGFjaCA9IE5VTEw7ICAKKyAgZ2Ric2ltX29wcy50b19yZXF1aXJlX2F0dGFjaCA9IE5VTEw7CQorICBnZGJzaW1fb3BzLnRvX2RldGFjaCA9ICAgZ2Ric2ltX2RldGFjaDsKKyAgZ2Ric2ltX29wcy50b19yZXF1aXJlX2RldGFjaCA9IE5VTEw7CQorICBnZGJzaW1fb3BzLnRvX3Jlc3VtZSA9ICAgZ2Ric2ltX3Jlc3VtZTsJCisgIGdkYnNpbV9vcHMudG9fd2FpdCAgPSAgIGdkYnNpbV93YWl0OworICBnZGJzaW1fb3BzLnRvX3Bvc3Rfd2FpdCA9IE5VTEw7CQkKKyAgZ2Ric2ltX29wcy50b19mZXRjaF9yZWdpc3RlcnMgID0gICBnZGJzaW1fZmV0Y2hfcmVnaXN0ZXI7CisgIGdkYnNpbV9vcHMudG9fc3RvcmVfcmVnaXN0ZXJzICA9ICAgZ2Ric2ltX3N0b3JlX3JlZ2lzdGVyOworICBnZGJzaW1fb3BzLnRvX3ByZXBhcmVfdG9fc3RvcmUgPSAgIGdkYnNpbV9wcmVwYXJlX3RvX3N0b3JlOworICBnZGJzaW1fb3BzLnRvX3hmZXJfbWVtb3J5ICA9ICAgZ2Ric2ltX3hmZXJfaW5mZXJpb3JfbWVtb3J5OworICBnZGJzaW1fb3BzLnRvX2ZpbGVzX2luZm8gID0gICBnZGJzaW1fZmlsZXNfaW5mbzsJCisgIGdkYnNpbV9vcHMudG9faW5zZXJ0X2JyZWFrcG9pbnQgPSAgIGdkYnNpbV9pbnNlcnRfYnJlYWtwb2ludDsKKyAgZ2Ric2ltX29wcy50b19yZW1vdmVfYnJlYWtwb2ludCA9ICAgZ2Ric2ltX3JlbW92ZV9icmVha3BvaW50OworICBnZGJzaW1fb3BzLnRvX3Rlcm1pbmFsX2luaXQgID0gICBOVUxMOwkJCisgIGdkYnNpbV9vcHMudG9fdGVybWluYWxfaW5mZXJpb3IgPSAgIE5VTEw7CQkKKyAgZ2Ric2ltX29wcy50b190ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgPSAgIE5VTEw7CisgIGdkYnNpbV9vcHMudG9fdGVybWluYWxfb3VycyAgPSAgIE5VTEw7CisgIGdkYnNpbV9vcHMudG9fdGVybWluYWxfaW5mbyAgPSAgIE5VTEw7CisgIGdkYnNpbV9vcHMudG9fa2lsbCAgPSAgIGdkYnNpbV9raWxsOwkKKyAgZ2Ric2ltX29wcy50b19sb2FkICA9ICAgZ2Ric2ltX2xvYWQ7CQorICBnZGJzaW1fb3BzLnRvX2xvb2t1cF9zeW1ib2wgPSAgIE5VTEw7CQorICBnZGJzaW1fb3BzLnRvX2NyZWF0ZV9pbmZlcmlvciA9ICAgZ2Ric2ltX2NyZWF0ZV9pbmZlcmlvcjsKKyAgZ2Ric2ltX29wcy50b19wb3N0X3N0YXJ0dXBfaW5mZXJpb3IgPSBOVUxMOworICBnZGJzaW1fb3BzLnRvX2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IgPSBOVUxMOworICBnZGJzaW1fb3BzLnRvX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IgPSBOVUxMOworICBnZGJzaW1fb3BzLnRvX3Bvc3RfZm9sbG93X2luZmVyaW9yX2J5X2Nsb25lID0gTlVMTDsKKyAgZ2Ric2ltX29wcy50b19pbnNlcnRfZm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgZ2Ric2ltX29wcy50b19yZW1vdmVfZm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgZ2Ric2ltX29wcy50b19pbnNlcnRfdmZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIGdkYnNpbV9vcHMudG9fcmVtb3ZlX3Zmb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBnZGJzaW1fb3BzLnRvX2hhc19mb3JrZWQgPSBOVUxMOworICBnZGJzaW1fb3BzLnRvX2hhc192Zm9ya2VkID0gTlVMTDsKKyAgZ2Ric2ltX29wcy50b19jYW5fZm9sbG93X3Zmb3JrX3ByaW9yX3RvX2V4ZWMgPSBOVUxMOworICBnZGJzaW1fb3BzLnRvX3Bvc3RfZm9sbG93X3Zmb3JrID0gTlVMTDsKKyAgZ2Ric2ltX29wcy50b19pbnNlcnRfZXhlY19jYXRjaHBvaW50ID0gTlVMTDsKKyAgZ2Ric2ltX29wcy50b19yZW1vdmVfZXhlY19jYXRjaHBvaW50ID0gTlVMTDsKKyAgZ2Ric2ltX29wcy50b19oYXNfZXhlY2QgPSBOVUxMOworICBnZGJzaW1fb3BzLnRvX3JlcG9ydGVkX2V4ZWNfZXZlbnRzX3Blcl9leGVjX2NhbGwgPSBOVUxMOworICBnZGJzaW1fb3BzLnRvX2hhc19leGl0ZWQgPSBOVUxMOworICBnZGJzaW1fb3BzLnRvX21vdXJuX2luZmVyaW9yID0gICBnZGJzaW1fbW91cm5faW5mZXJpb3I7CisgIGdkYnNpbV9vcHMudG9fY2FuX3J1biAgPSAgIDA7CQkJCisgIGdkYnNpbV9vcHMudG9fbm90aWNlX3NpZ25hbHMgPSAgIDA7CQkKKyAgZ2Ric2ltX29wcy50b190aHJlYWRfYWxpdmUgID0gICAwOwkJCisgIGdkYnNpbV9vcHMudG9fc3RvcCAgPSAgIGdkYnNpbV9zdG9wOworICBnZGJzaW1fb3BzLnRvX3BpZF90b19leGVjX2ZpbGUgPSBOVUxMOwkKKyAgZ2Ric2ltX29wcy50b19jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUgPSBOVUxMOwkKKyAgZ2Ric2ltX29wcy50b19zdHJhdHVtID0gICBwcm9jZXNzX3N0cmF0dW07CQorICBnZGJzaW1fb3BzLkRPTlRfVVNFID0gICBOVUxMOwkJCisgIGdkYnNpbV9vcHMudG9faGFzX2FsbF9tZW1vcnkgPSAgIDE7CQorICBnZGJzaW1fb3BzLnRvX2hhc19tZW1vcnkgPSAgIDE7CQorICBnZGJzaW1fb3BzLnRvX2hhc19zdGFjayA9ICAgMTsJCisgIGdkYnNpbV9vcHMudG9faGFzX3JlZ2lzdGVycyA9ICAgMTsJCisgIGdkYnNpbV9vcHMudG9faGFzX2V4ZWN1dGlvbiA9ICAgMTsJCisgIGdkYnNpbV9vcHMudG9fc2VjdGlvbnMgPSAgIE5VTEw7CQorICBnZGJzaW1fb3BzLnRvX3NlY3Rpb25zX2VuZCA9ICAgTlVMTDsJCisgIGdkYnNpbV9vcHMudG9fbWFnaWMgPSAgIE9QU19NQUdJQzsJCisKKyNpZmRlZiBUQVJHRVRfUkVERUZJTkVfREVGQVVMVF9PUFMKKyAgVEFSR0VUX1JFREVGSU5FX0RFRkFVTFRfT1BTICgmZ2Ric2ltX29wcyk7CisjZW5kaWYKK30KKwordm9pZAorX2luaXRpYWxpemVfcmVtb3RlX3NpbSAoKQoreworICBpbml0X2dkYnNpbV9vcHMoKSA7CisgIGFkZF90YXJnZXQgKCZnZGJzaW1fb3BzKTsKKworICBhZGRfY29tICgic2ltIDxjb21tYW5kPiIsIGNsYXNzX29ic2N1cmUsIHNpbXVsYXRvcl9jb21tYW5kLAorCSAgICJTZW5kIGEgY29tbWFuZCB0byB0aGUgc2ltdWxhdG9yLiIpOyAKK30KZGlmZiAtLWdpdCBhL2dkYi9yZW1vdGUtc3QuYyBiL2dkYi9yZW1vdGUtc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWZkYmZhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JlbW90ZS1zdC5jCkBAIC0wLDAgKzEsODc5IEBACisvKiBSZW1vdGUgZGVidWdnaW5nIGludGVyZmFjZSBmb3IgVGFuZGVtIFNUMjAwMCBwaG9uZSBzd2l0Y2gsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LiAgV3JpdHRlbiBieSBKaW0gS2luZ2RvbiBmb3IgQ3lnbnVzLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSB3YXMgZGVyaXZlZCBmcm9tIHJlbW90ZS1lYi5jLCB3aGljaCBkaWQgYSBzaW1pbGFyIGpvYiwgYnV0IGZvcgorICAgYW4gQU1ELTI5SyBydW5uaW5nIEVCTU9OLiAgVGhhdCBmaWxlIHdhcyBpbiB0dXJuIGRlcml2ZWQgZnJvbSByZW1vdGUuYworICAgYXMgbWVudGlvbmVkIGluIHRoZSBmb2xsb3dpbmcgY29tbWVudCAobGVmdCBpbiBmb3IgY29taWMgcmVsaWVmKToKKworICAiVGhpcyBpcyBsaWtlIHJlbW90ZS5jIGJ1dCBpcyBmb3IgYW4gZXNvdGVyaWMgc2l0dWF0aW9uLS0KKyAgIGhhdmluZyBhbiBhMjlrIGJvYXJkIGluIGEgUEMgaG9va2VkIHVwIHRvIGEgdW5peCBtYWNoaW5lIHdpdGgKKyAgIGEgc2VyaWFsIGxpbmUsIGFuZCBydW5uaW5nIGN0dHkgY29tMSBvbiB0aGUgUEMsIHRocm91Z2ggd2hpY2gKKyAgIHRoZSB1bml4IG1hY2hpbmUgY2FuIHJ1biBlYm1vbi4gIE5vdCB0byBtZW50aW9uIHRoYXQgdGhlIFBDCisgICBoYXMgUEMvTkZTLCBzbyBpdCBjYW4gYWNjZXNzIHRoZSBzYW1lIGV4ZWN1dGFibGVzIHRoYXQgZ2RiIGNhbiwKKyAgIG92ZXIgdGhlIG5ldCBpbiByZWFsIHRpbWUuIgorCisgICBJbiByZWFsaXR5LCB0aGlzIG1vZHVsZSB0YWxrcyB0byBhIGRlYnVnIG1vbml0b3IgY2FsbGVkICdTVERFQlVHJywgd2hpY2gKKyAgIHJ1bnMgaW4gYSBwaG9uZSBzd2l0Y2guICBXZSBjb21tdW5pY2F0ZSB3aXRoIFNUREVCVUcgdmlhIGVpdGhlciBhIGRpcmVjdAorICAgc2VyaWFsIGxpbmUsIG9yIGEgVENQIChvciBwb3NzaWJseSBURUxORVQpIHN0cmVhbSB0byBhIHRlcm1pbmFsIG11bHRpcGxleG9yLAorICAgd2hpY2ggaW4gdHVybiB0YWxrcyB0byB0aGUgcGhvbmUgc3dpdGNoLiAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJ3YWl0LmgiCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjZWxzZQorI2luY2x1ZGUgPHZhcmFyZ3MuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlICJzZXJpYWwuaCIKKworZXh0ZXJuIHN0cnVjdCB0YXJnZXRfb3BzIHN0MjAwMF9vcHM7CQkvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCisKK3N0YXRpYyB2b2lkIHN0MjAwMF9jbG9zZSgpOworc3RhdGljIHZvaWQgc3QyMDAwX2ZldGNoX3JlZ2lzdGVyKCk7CitzdGF0aWMgdm9pZCBzdDIwMDBfc3RvcmVfcmVnaXN0ZXIoKTsKKworI2RlZmluZSBMT0dfRklMRSAic3QyMDAwLmxvZyIKKyNpZiBkZWZpbmVkIChMT0dfRklMRSkKK0ZJTEUgKmxvZ19maWxlOworI2VuZGlmCisKK3N0YXRpYyBpbnQgdGltZW91dCA9IDI0OworCisvKiBEZXNjcmlwdG9yIGZvciBJL08gdG8gcmVtb3RlIG1hY2hpbmUuICBJbml0aWFsaXplIGl0IHRvIC0xIHNvIHRoYXQKKyAgIHN0MjAwMF9vcGVuIGtub3dzIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIGZpbGUgb3BlbiB3aGVuIHRoZSBwcm9ncmFtCisgICBzdGFydHMuICAqLworCitzdGF0aWMgc2VyaWFsX3Qgc3QyMDAwX2Rlc2M7CisKKy8qIFNlbmQgZGF0YSB0byBzdGRlYnVnLiAgV29ya3MganVzdCBsaWtlIHByaW50Zi4gKi8KKworc3RhdGljIHZvaWQKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKK3ByaW50Zl9zdGRlYnVnKGNoYXIgKnBhdHRlcm4sIC4uLikKKyNlbHNlCitwcmludGZfc3RkZWJ1Zyh2YV9hbGlzdCkKKyAgICAgdmFfZGNsCisjZW5kaWYKK3sKKyAgdmFfbGlzdCBhcmdzOworICBjaGFyIGJ1ZlsyMDBdOworCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisgIHZhX3N0YXJ0KGFyZ3MsIHBhdHRlcm4pOworI2Vsc2UKKyAgY2hhciAqcGF0dGVybjsKKyAgdmFfc3RhcnQoYXJncyk7CisgIHBhdHRlcm4gPSB2YV9hcmcoYXJncywgY2hhciAqKTsKKyNlbmRpZgorCisgIHZzcHJpbnRmKGJ1ZiwgcGF0dGVybiwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKworICBpZiAoU0VSSUFMX1dSSVRFKHN0MjAwMF9kZXNjLCBidWYsIHN0cmxlbihidWYpKSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlNFUklBTF9XUklURSBmYWlsZWQ6ICVzXG4iLCBzYWZlX3N0cmVycm9yKGVycm5vKSk7Cit9CisKKy8qIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgcmVtb3RlIHN5c3RlbSwgZG9pbmcgYWxsIHRoZSBmYW5jeSB0aW1lb3V0CisgICBzdHVmZi4gICovCisKK3N0YXRpYyBpbnQKK3JlYWRjaGFyKHRpbWVvdXQpCisgICAgIGludCB0aW1lb3V0OworeworICBpbnQgYzsKKworICBjID0gU0VSSUFMX1JFQURDSEFSKHN0MjAwMF9kZXNjLCB0aW1lb3V0KTsKKworI2lmZGVmIExPR19GSUxFCisgIHB1dGMoYyAmIDB4N2YsIGxvZ19maWxlKTsKKyNlbmRpZgorCisgIGlmIChjID49IDApCisgICAgcmV0dXJuIGMgJiAweDdmOworCisgIGlmIChjID09IFNFUklBTF9USU1FT1VUKQorICAgIHsKKyAgICAgIGlmICh0aW1lb3V0ID09IDApCisJcmV0dXJuIGM7CQkvKiBQb2xscyBzaG91bGRuJ3QgZ2VuZXJhdGUgdGltZW91dCBlcnJvcnMgKi8KKworICAgICAgZXJyb3IoIlRpbWVvdXQgcmVhZGluZyBmcm9tIHJlbW90ZSBzeXN0ZW0uIik7CisgICAgfQorCisgIHBlcnJvcl93aXRoX25hbWUoInJlbW90ZS1zdDIwMDAiKTsKK30KKworLyogU2NhbiBpbnB1dCBmcm9tIHRoZSByZW1vdGUgc3lzdGVtLCB1bnRpbCBTVFJJTkcgaXMgZm91bmQuICBJZiBESVNDQVJEIGlzCisgICBub24temVybywgdGhlbiBkaXNjYXJkIG5vbi1tYXRjaGluZyBpbnB1dCwgZWxzZSBwcmludCBpdCBvdXQuCisgICBMZXQgdGhlIHVzZXIgYnJlYWsgb3V0IGltbWVkaWF0ZWx5LiAgKi8KK3N0YXRpYyB2b2lkCitleHBlY3Qoc3RyaW5nLCBkaXNjYXJkKQorICAgICBjaGFyICpzdHJpbmc7CisgICAgIGludCBkaXNjYXJkOworeworICBjaGFyICpwID0gc3RyaW5nOworICBpbnQgYzsKKworICBpbW1lZGlhdGVfcXVpdCA9IDE7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGMgPSByZWFkY2hhcih0aW1lb3V0KTsKKyAgICAgIGlmIChjID09ICpwKyspCisJeworCSAgaWYgKCpwID09ICdcMCcpCisJICAgIHsKKwkgICAgICBpbW1lZGlhdGVfcXVpdCA9IDA7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmICghZGlzY2FyZCkKKwkgICAgeworCSAgICAgIGZ3cml0ZShzdHJpbmcsIDEsIChwIC0gMSkgLSBzdHJpbmcsIHN0ZG91dCk7CisJICAgICAgcHV0Y2hhcigoY2hhciljKTsKKwkgICAgICBmZmx1c2goc3Rkb3V0KTsKKwkgICAgfQorCSAgcCA9IHN0cmluZzsKKwl9CisgICAgfQorfQorCisvKiBLZWVwIGRpc2NhcmRpbmcgaW5wdXQgdW50aWwgd2Ugc2VlIHRoZSBTVERFQlVHIHByb21wdC4KKworICAgVGhlIGNvbnZlbnRpb24gZm9yIGRlYWxpbmcgd2l0aCB0aGUgcHJvbXB0IGlzIHRoYXQgeW91CisgICBvIGdpdmUgeW91ciBjb21tYW5kCisgICBvICp0aGVuKiB3YWl0IGZvciB0aGUgcHJvbXB0LgorCisgICBUaHVzIHRoZSBsYXN0IHRoaW5nIHRoYXQgYSBwcm9jZWR1cmUgZG9lcyB3aXRoIHRoZSBzZXJpYWwgbGluZQorICAgd2lsbCBiZSBhbiBleHBlY3RfcHJvbXB0KCkuICBFeGNlcHRpb246ICBzdDIwMDBfcmVzdW1lIGRvZXMgbm90CisgICB3YWl0IGZvciB0aGUgcHJvbXB0LCBiZWNhdXNlIHRoZSB0ZXJtaW5hbCBpcyBiZWluZyBoYW5kZWQgb3ZlcgorICAgdG8gdGhlIGluZmVyaW9yLiAgSG93ZXZlciwgdGhlIG5leHQgdGhpbmcgd2hpY2ggaGFwcGVucyBhZnRlciB0aGF0CisgICBpcyBhIHN0MjAwMF93YWl0IHdoaWNoIGRvZXMgd2FpdCBmb3IgdGhlIHByb21wdC4KKyAgIE5vdGUgdGhhdCB0aGlzIGluY2x1ZGVzIGFibm9ybWFsIGV4aXQsIGUuZy4gZXJyb3IoKS4gIFRoaXMgaXMKKyAgIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGdldHRpbmcgaW50byBzdGF0ZXMgZnJvbSB3aGljaCB3ZSBjYW4ndAorICAgcmVjb3Zlci4gICovCitzdGF0aWMgdm9pZAorZXhwZWN0X3Byb21wdChkaXNjYXJkKQorICAgICBpbnQgZGlzY2FyZDsKK3sKKyNpZiBkZWZpbmVkIChMT0dfRklMRSkKKyAgLyogVGhpcyBpcyBhIGNvbnZlbmllbnQgcGxhY2UgdG8gZG8gdGhpcy4gIFRoZSBpZGVhIGlzIHRvIGRvIGl0IG9mdGVuCisgICAgIGVub3VnaCB0aGF0IHdlIG5ldmVyIGxvc2UgbXVjaCBkYXRhIGlmIHdlIHRlcm1pbmF0ZSBhYm5vcm1hbGx5LiAgKi8KKyAgZmZsdXNoKGxvZ19maWxlKTsKKyNlbmRpZgorICBleHBlY3QgKCJkYnVnPiAiLCBkaXNjYXJkKTsKK30KKworLyogR2V0IGEgaGV4IGRpZ2l0IGZyb20gdGhlIHJlbW90ZSBzeXN0ZW0gJiByZXR1cm4gaXRzIHZhbHVlLgorICAgSWYgaWdub3JlX3NwYWNlIGlzIG5vbnplcm8sIGlnbm9yZSBzcGFjZXMgKG5vdCBuZXdsaW5lLCB0YWIsIGV0YykuICAqLworc3RhdGljIGludAorZ2V0X2hleF9kaWdpdChpZ25vcmVfc3BhY2UpCisgICAgIGludCBpZ25vcmVfc3BhY2U7Cit7CisgIGludCBjaDsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgY2ggPSByZWFkY2hhcih0aW1lb3V0KTsKKyAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQorCXJldHVybiBjaCAtICcwJzsKKyAgICAgIGVsc2UgaWYgKGNoID49ICdBJyAmJiBjaCA8PSAnRicpCisJcmV0dXJuIGNoIC0gJ0EnICsgMTA7CisgICAgICBlbHNlIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKQorCXJldHVybiBjaCAtICdhJyArIDEwOworICAgICAgZWxzZSBpZiAoY2ggPT0gJyAnICYmIGlnbm9yZV9zcGFjZSkKKwk7CisgICAgICBlbHNlCisJeworCSAgZXhwZWN0X3Byb21wdCgxKTsKKwkgIGVycm9yKCJJbnZhbGlkIGhleCBkaWdpdCBmcm9tIHJlbW90ZSBzeXN0ZW0uIik7CisJfQorICAgIH0KK30KKworLyogR2V0IGEgYnl0ZSBmcm9tIHN0ZGVidWcgYW5kIHB1dCBpdCBpbiAqQllULiAgQWNjZXB0IGFueSBudW1iZXIKKyAgIGxlYWRpbmcgc3BhY2VzLiAgKi8KK3N0YXRpYyB2b2lkCitnZXRfaGV4X2J5dGUgKGJ5dCkKKyAgICAgY2hhciAqYnl0OworeworICBpbnQgdmFsOworCisgIHZhbCA9IGdldF9oZXhfZGlnaXQgKDEpIDw8IDQ7CisgIHZhbCB8PSBnZXRfaGV4X2RpZ2l0ICgwKTsKKyAgKmJ5dCA9IHZhbDsKK30KKworLyogR2V0IE4gMzItYml0IHdvcmRzIGZyb20gcmVtb3RlLCBlYWNoIHByZWNlZGVkIGJ5IGEgc3BhY2UsCisgICBhbmQgcHV0IHRoZW0gaW4gcmVnaXN0ZXJzIHN0YXJ0aW5nIGF0IFJFR05PLiAgKi8KK3N0YXRpYyB2b2lkCitnZXRfaGV4X3JlZ3MgKG4sIHJlZ25vKQorICAgICBpbnQgbjsKKyAgICAgaW50IHJlZ25vOworeworICBsb25nIHZhbDsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7CisgICAgICBpbnQgajsKKyAgICAgIAorICAgICAgdmFsID0gMDsKKyAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisJdmFsID0gKHZhbCA8PCA0KSArIGdldF9oZXhfZGlnaXQgKGogPT0gMCk7CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vKyssIChjaGFyICopICZ2YWwpOworICAgIH0KK30KKworLyogVGhpcyBpcyBjYWxsZWQgbm90IG9ubHkgd2hlbiB3ZSBmaXJzdCBhdHRhY2gsIGJ1dCBhbHNvIHdoZW4gdGhlCisgICB1c2VyIHR5cGVzICJydW4iIGFmdGVyIGhhdmluZyBhdHRhY2hlZC4gICovCitzdGF0aWMgdm9pZAorc3QyMDAwX2NyZWF0ZV9pbmZlcmlvciAoZXhlY2ZpbGUsIGFyZ3MsIGVudikKKyAgICAgY2hhciAqZXhlY2ZpbGU7CisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGludCBlbnRyeV9wdDsKKworICBpZiAoYXJncyAmJiAqYXJncykKKyAgICBlcnJvcigiQ2FuJ3QgcGFzcyBhcmd1bWVudHMgdG8gcmVtb3RlIFNUREVCVUcgcHJvY2VzcyIpOworCisgIGlmIChleGVjZmlsZSA9PSAwIHx8IGV4ZWNfYmZkID09IDApCisgICAgZXJyb3IoIk5vIGV4ZWN1dGFibGUgZmlsZSBzcGVjaWZpZWQiKTsKKworICBlbnRyeV9wdCA9IChpbnQpIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoZXhlY19iZmQpOworCisvKiBUaGUgInByb2Nlc3MiIChib2FyZCkgaXMgYWxyZWFkeSBzdG9wcGVkIGF3YWl0aW5nIG91ciBjb21tYW5kcywgYW5kCisgICB0aGUgcHJvZ3JhbSBpcyBhbHJlYWR5IGRvd25sb2FkZWQuICBXZSBqdXN0IHNldCBpdHMgUEMgYW5kIGdvLiAgKi8KKworICBjbGVhcl9wcm9jZWVkX3N0YXR1cyAoKTsKKworICAvKiBUZWxsIHdhaXRfZm9yX2luZmVyaW9yIHRoYXQgd2UndmUgc3RhcnRlZCBhIG5ldyBwcm9jZXNzLiAgKi8KKyAgaW5pdF93YWl0X2Zvcl9pbmZlcmlvciAoKTsKKworICAvKiBTZXQgdXAgdGhlICJzYXZlZCB0ZXJtaW5hbCBtb2RlcyIgb2YgdGhlIGluZmVyaW9yCisgICAgIGJhc2VkIG9uIHdoYXQgbW9kZXMgd2UgYXJlIHN0YXJ0aW5nIGl0IHdpdGguICAqLworICB0YXJnZXRfdGVybWluYWxfaW5pdCAoKTsKKworICAvKiBJbnN0YWxsIGluZmVyaW9yJ3MgdGVybWluYWwgbW9kZXMuICAqLworICB0YXJnZXRfdGVybWluYWxfaW5mZXJpb3IgKCk7CisKKyAgLyogaW5zZXJ0X3N0ZXBfYnJlYWtwb2ludCAoKTsgIEZJWE1FLCBkbyB3ZSBuZWVkIHRoaXM/ICAqLworICAvKiBMZXQgJ2VyIHJpcC4uLiAqLworICBwcm9jZWVkICgoQ09SRV9BRERSKWVudHJ5X3B0LCBUQVJHRVRfU0lHTkFMX0RFRkFVTFQsIDApOworfQorCisvKiBPcGVuIGEgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBkZWJ1Z2dlci4KKyAgIE5BTUUgaXMgdGhlIGZpbGVuYW1lIHVzZWQgZm9yIGNvbW11bmljYXRpb24uICAqLworCitzdGF0aWMgaW50IGJhdWRyYXRlID0gOTYwMDsKK3N0YXRpYyBjaGFyIGRldl9uYW1lWzEwMF07CisKK3N0YXRpYyB2b2lkCitzdDIwMDBfb3BlbihhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpbnQgbjsKKyAgY2hhciBqdW5rWzEwMF07CisKKyAgdGFyZ2V0X3ByZW9wZW4oZnJvbV90dHkpOworICAKKyAgbiA9IHNzY2FuZihhcmdzLCAiICVzICVkICVzIiwgZGV2X25hbWUsICZiYXVkcmF0ZSwganVuayk7CisKKyAgaWYgKG4gIT0gMikKKyAgICBlcnJvcigiQmFkIGFyZ3VtZW50cy4gIFVzYWdlOiB0YXJnZXQgc3QyMDAwIDxkZXZpY2U+IDxzcGVlZD5cblwKK29yIHRhcmdldCBzdDIwMDAgPGhvc3Q+IDxwb3J0PlxuIik7CisKKyAgc3QyMDAwX2Nsb3NlKDApOworCisgIHN0MjAwMF9kZXNjID0gU0VSSUFMX09QRU4oZGV2X25hbWUpOworCisgIGlmICghc3QyMDAwX2Rlc2MpCisgICAgcGVycm9yX3dpdGhfbmFtZShkZXZfbmFtZSk7CisKKyAgU0VSSUFMX1NFVEJBVURSQVRFKHN0MjAwMF9kZXNjLCBiYXVkcmF0ZSk7CisKKyAgU0VSSUFMX1JBVyhzdDIwMDBfZGVzYyk7CisKKyAgcHVzaF90YXJnZXQoJnN0MjAwMF9vcHMpOworCisjaWYgZGVmaW5lZCAoTE9HX0ZJTEUpCisgIGxvZ19maWxlID0gZm9wZW4gKExPR19GSUxFLCAidyIpOworICBpZiAobG9nX2ZpbGUgPT0gTlVMTCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lIChMT0dfRklMRSk7CisjZW5kaWYKKworICAvKiBIZWxsbz8gIEFyZSB5b3UgdGhlcmU/ICAqLworICBwcmludGZfc3RkZWJ1ZygiXDAwMyIpOwkvKiBeQyB3YWtlcyB1cCBkYnVnICovCisgIAorICBleHBlY3RfcHJvbXB0KDEpOworCisgIGlmIChmcm9tX3R0eSkKKyAgICBwcmludGYoIlJlbW90ZSAlcyBjb25uZWN0ZWQgdG8gJXNcbiIsIHRhcmdldF9zaG9ydG5hbWUsCisJICAgZGV2X25hbWUpOworfQorCisvKiBDbG9zZSBvdXQgYWxsIGZpbGVzIGFuZCBsb2NhbCBzdGF0ZSBiZWZvcmUgdGhpcyB0YXJnZXQgbG9zZXMgY29udHJvbC4gKi8KKworc3RhdGljIHZvaWQKK3N0MjAwMF9jbG9zZSAocXVpdHRpbmcpCisgICAgIGludCBxdWl0dGluZzsKK3sKKyAgU0VSSUFMX0NMT1NFKHN0MjAwMF9kZXNjKTsKKworI2lmIGRlZmluZWQgKExPR19GSUxFKQorICBpZiAobG9nX2ZpbGUpIHsKKyAgICBpZiAoZmVycm9yKGxvZ19maWxlKSkKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd3JpdGluZyBsb2cgZmlsZS5cbiIpOworICAgIGlmIChmY2xvc2UobG9nX2ZpbGUpICE9IDApCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGNsb3NpbmcgbG9nIGZpbGUuXG4iKTsKKyAgfQorI2VuZGlmCit9CisKKy8qIFRlcm1pbmF0ZSB0aGUgb3BlbiBjb25uZWN0aW9uIHRvIHRoZSByZW1vdGUgZGVidWdnZXIuCisgICBVc2UgdGhpcyB3aGVuIHlvdSB3YW50IHRvIGRldGFjaCBhbmQgZG8gc29tZXRoaW5nIGVsc2UKKyAgIHdpdGggeW91ciBnZGIuICAqLworc3RhdGljIHZvaWQKK3N0MjAwMF9kZXRhY2ggKGZyb21fdHR5KQorICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHBvcF90YXJnZXQoKTsJCS8qIGNhbGxzIHN0MjAwMF9jbG9zZSB0byBkbyB0aGUgcmVhbCB3b3JrICovCisgIGlmIChmcm9tX3R0eSkKKyAgICBwcmludGYgKCJFbmRpbmcgcmVtb3RlICVzIGRlYnVnZ2luZ1xuIiwgdGFyZ2V0X3Nob3J0bmFtZSk7Cit9CisgCisvKiBUZWxsIHRoZSByZW1vdGUgbWFjaGluZSB0byByZXN1bWUuICAqLworCitzdGF0aWMgdm9pZAorc3QyMDAwX3Jlc3VtZSAocGlkLCBzdGVwLCBzaWcpCisgICAgIGludCBwaWQsIHN0ZXA7CisgICAgIGVudW0gdGFyZ2V0X3NpZ25hbCBzaWc7Cit7CisgIGlmIChzdGVwKQorICAgIHsKKyAgICAgIHByaW50Zl9zdGRlYnVnICgiU1RcciIpOworICAgICAgLyogV2FpdCBmb3IgdGhlIGVjaG8uICAqLworICAgICAgZXhwZWN0ICgiU1RcciIsIDEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50Zl9zdGRlYnVnICgiR09cciIpOworICAgICAgLyogU3dhbGxvdyB0aGUgZWNoby4gICovCisgICAgICBleHBlY3QgKCJHT1xyIiwgMSk7CisgICAgfQorfQorCisvKiBXYWl0IHVudGlsIHRoZSByZW1vdGUgbWFjaGluZSBzdG9wcywgdGhlbiByZXR1cm4sCisgICBzdG9yaW5nIHN0YXR1cyBpbiBTVEFUVVMganVzdCBhcyBgd2FpdCcgd291bGQuICAqLworCitzdGF0aWMgaW50CitzdDIwMDBfd2FpdCAoc3RhdHVzKQorICAgICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0YXR1czsKK3sKKyAgaW50IG9sZF90aW1lb3V0ID0gdGltZW91dDsKKworICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVEOworICBzdGF0dXMtPnZhbHVlLmludGVnZXIgPSAwOworCisgIHRpbWVvdXQgPSAwOwkJLyogRG9uJ3QgdGltZSBvdXQgLS0gdXNlciBwcm9ncmFtIGlzIHJ1bm5pbmcuICovCisKKyAgZXhwZWN0X3Byb21wdCgwKTsgICAgLyogV2FpdCBmb3IgcHJvbXB0LCBvdXRwdXR0aW5nIGV4dHJhbmVvdXMgdGV4dCAqLworCisgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOworICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVFJBUDsKKworICB0aW1lb3V0ID0gb2xkX3RpbWVvdXQ7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB0aGUgbmFtZSBvZiByZWdpc3RlciBudW1iZXIgUkVHTk8gaW4gdGhlIGZvcm0gaW5wdXQgYW5kIG91dHB1dCBieQorICAgU1RERUJVRy4gIEN1cnJlbnRseSwgUkVHSVNURVJfTkFNRVMganVzdCBoYXBwZW5zIHRvIGNvbnRhaW4gZXhhY3RseSB3aGF0CisgICBTVERFQlVHIHdhbnRzLiAgTGV0cyB0YWtlIGFkdmFudGFnZSBvZiB0aGF0IGp1c3QgYXMgbG9uZyBhcyBwb3NzaWJsZSEgKi8KKworc3RhdGljIGNoYXIgKgorZ2V0X3JlZ19uYW1lIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBzdGF0aWMgY2hhciBidWZbNTBdOworICBjb25zdCBjaGFyICpwOworICBjaGFyICpiOworCisgIGIgPSBidWY7CisKKyAgZm9yIChwID0gUkVHSVNURVJfTkFNRSAocmVnbm8pOyAqcDsgcCsrKQorICAgICpiKysgPSB0b3VwcGVyKCpwKTsKKyAgKmIgPSAnXDAwMCc7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworLyogUmVhZCB0aGUgcmVtb3RlIHJlZ2lzdGVycyBpbnRvIHRoZSBibG9jayBSRUdTLiAgKi8KKworc3RhdGljIHZvaWQKK3N0MjAwMF9mZXRjaF9yZWdpc3RlcnMgKCkKK3sKKyAgaW50IHJlZ25vOworCisgIC8qIFllYWggeWVhaCwgSSBrbm93IHRoaXMgaXMgaG9ycmlibHkgaW5lZmZpY2llbnQuICBCdXQgaXQgaXNuJ3QgZG9uZQorICAgICB2ZXJ5IG9mdGVuLi4uICBJJ2xsIGNsZWFuIGl0IHVwIGxhdGVyLiAgKi8KKworICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPD0gUENfUkVHTlVNOyByZWdubysrKQorICAgIHN0MjAwMF9mZXRjaF9yZWdpc3RlcihyZWdubyk7Cit9CisKKy8qIEZldGNoIHJlZ2lzdGVyIFJFR05PLCBvciBhbGwgcmVnaXN0ZXJzIGlmIFJFR05PIGlzIC0xLgorICAgUmV0dXJucyBlcnJubyB2YWx1ZS4gICovCitzdGF0aWMgdm9pZAorc3QyMDAwX2ZldGNoX3JlZ2lzdGVyIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBpZiAocmVnbm8gPT0gLTEpCisgICAgc3QyMDAwX2ZldGNoX3JlZ2lzdGVycyAoKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgKm5hbWUgPSBnZXRfcmVnX25hbWUgKHJlZ25vKTsKKyAgICAgIHByaW50Zl9zdGRlYnVnICgiRFIgJXNcciIsIG5hbWUpOworICAgICAgZXhwZWN0IChuYW1lLCAxKTsKKyAgICAgIGV4cGVjdCAoIiA6ICIsIDEpOworICAgICAgZ2V0X2hleF9yZWdzICgxLCByZWdubyk7CisgICAgICBleHBlY3RfcHJvbXB0ICgxKTsKKyAgICB9CisgIHJldHVybjsKK30KKworLyogU3RvcmUgdGhlIHJlbW90ZSByZWdpc3RlcnMgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIGJsb2NrIFJFR1MuICAqLworCitzdGF0aWMgdm9pZAorc3QyMDAwX3N0b3JlX3JlZ2lzdGVycyAoKQoreworICBpbnQgcmVnbm87CisKKyAgZm9yIChyZWdubyA9IDA7IHJlZ25vIDw9IFBDX1JFR05VTTsgcmVnbm8rKykKKyAgICBzdDIwMDBfc3RvcmVfcmVnaXN0ZXIocmVnbm8pOworCisgIHJlZ2lzdGVyc19jaGFuZ2VkICgpOworfQorCisvKiBTdG9yZSByZWdpc3RlciBSRUdOTywgb3IgYWxsIGlmIFJFR05PID09IDAuCisgICBSZXR1cm4gZXJybm8gdmFsdWUuICAqLworc3RhdGljIHZvaWQKK3N0MjAwMF9zdG9yZV9yZWdpc3RlciAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgaWYgKHJlZ25vID09IC0xKQorICAgIHN0MjAwMF9zdG9yZV9yZWdpc3RlcnMgKCk7CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludGZfc3RkZWJ1ZyAoIlBSICVzICV4XHIiLCBnZXRfcmVnX25hbWUgKHJlZ25vKSwKKwkJICAgICAgcmVhZF9yZWdpc3RlciAocmVnbm8pKTsKKworICAgICAgZXhwZWN0X3Byb21wdCAoMSk7CisgICAgfQorfQorCisvKiBHZXQgcmVhZHkgdG8gbW9kaWZ5IHRoZSByZWdpc3RlcnMgYXJyYXkuICBPbiBtYWNoaW5lcyB3aGljaCBzdG9yZQorICAgaW5kaXZpZHVhbCByZWdpc3RlcnMsIHRoaXMgZG9lc24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLiAgT24gbWFjaGluZXMKKyAgIHdoaWNoIHN0b3JlIGFsbCB0aGUgcmVnaXN0ZXJzIGluIG9uZSBmZWxsIHN3b29wLCB0aGlzIG1ha2VzIHN1cmUKKyAgIHRoYXQgcmVnaXN0ZXJzIGNvbnRhaW5zIGFsbCB0aGUgcmVnaXN0ZXJzIGZyb20gdGhlIHByb2dyYW0gYmVpbmcKKyAgIGRlYnVnZ2VkLiAgKi8KKworc3RhdGljIHZvaWQKK3N0MjAwMF9wcmVwYXJlX3RvX3N0b3JlICgpCit7CisgIC8qIERvIG5vdGhpbmcsIHNpbmNlIHdlIGNhbiBzdG9yZSBpbmRpdmlkdWFsIHJlZ3MgKi8KK30KKworc3RhdGljIHZvaWQKK3N0MjAwMF9maWxlc19pbmZvICgpCit7CisgIHByaW50ZiAoIlx0QXR0YWNoZWQgdG8gJXMgYXQgJWQgYmF1ZC5cbiIsCisJICBkZXZfbmFtZSwgYmF1ZHJhdGUpOworfQorCisvKiBDb3B5IExFTiBieXRlcyBvZiBkYXRhIGZyb20gZGVidWdnZXIgbWVtb3J5IGF0IE1ZQUREUgorICAgdG8gaW5mZXJpb3IncyBtZW1vcnkgYXQgTUVNQUREUi4gIFJldHVybnMgbGVuZ3RoIG1vdmVkLiAgKi8KK3N0YXRpYyBpbnQKK3N0MjAwMF93cml0ZV9pbmZlcmlvcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgdW5zaWduZWQgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgeworICAgICAgcHJpbnRmX3N0ZGVidWcgKCJQTS5CICV4ICV4XHIiLCBtZW1hZGRyICsgaSwgbXlhZGRyW2ldKTsKKyAgICAgIGV4cGVjdF9wcm9tcHQgKDEpOworICAgIH0KKyAgcmV0dXJuIGxlbjsKK30KKworLyogUmVhZCBMRU4gYnl0ZXMgZnJvbSBpbmZlcmlvciBtZW1vcnkgYXQgTUVNQUREUi4gIFB1dCB0aGUgcmVzdWx0CisgICBhdCBkZWJ1Z2dlciBhZGRyZXNzIE1ZQUREUi4gIFJldHVybnMgbGVuZ3RoIG1vdmVkLiAgKi8KK3N0YXRpYyBpbnQKK3N0MjAwMF9yZWFkX2luZmVyaW9yX21lbW9yeShtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaW50IGk7CisKKyAgLyogTnVtYmVyIG9mIGJ5dGVzIHJlYWQgc28gZmFyLiAgKi8KKyAgaW50IGNvdW50OworCisgIC8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhpcyBwYXNzLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBzdGFydGFkZHI7CisKKyAgLyogTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgaW4gdGhpcyBwYXNzLiAgKi8KKyAgaW50IGxlbl90aGlzX3Bhc3M7CisKKyAgLyogTm90ZSB0aGF0IHRoaXMgY29kZSB3b3JrcyBjb3JyZWN0bHkgaWYgc3RhcnRhZGRyIGlzIGp1c3QgbGVzcworICAgICB0aGFuIFVJTlRfTUFYICh3ZWxsLCByZWFsbHkgQ09SRV9BRERSX01BWCBpZiB0aGVyZSB3YXMgc3VjaCBhCisgICAgIHRoaW5nKS4gIFRoYXQgaXMsIHNvbWV0aGluZyBsaWtlCisgICAgIHN0MjAwMF9yZWFkX2J5dGVzIChDT1JFX0FERFJfTUFYIC0gNCwgZm9vLCA0KQorICAgICB3b3Jrcy0taXQgbmV2ZXIgYWRkcyBsZW4gdG8gbWVtYWRkciBhbmQgZ2V0cyAwLiAgKi8KKyAgLyogSG93ZXZlciwgc29tZXRoaW5nIGxpa2UKKyAgICAgc3QyMDAwX3JlYWRfYnl0ZXMgKENPUkVfQUREUl9NQVggLSAzLCBmb28sIDQpCisgICAgIGRvZXNuJ3QgbmVlZCB0byB3b3JrLiAgRGV0ZWN0IGl0IGFuZCBnaXZlIHVwIGlmIHRoZXJlJ3MgYW4gYXR0ZW1wdAorICAgICB0byBkbyB0aGF0LiAgKi8KKyAgaWYgKCgobWVtYWRkciAtIDEpICsgbGVuKSA8IG1lbWFkZHIpIHsKKyAgICBlcnJubyA9IEVJTzsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgc3RhcnRhZGRyID0gbWVtYWRkcjsKKyAgY291bnQgPSAwOworICB3aGlsZSAoY291bnQgPCBsZW4pCisgICAgeworICAgICAgbGVuX3RoaXNfcGFzcyA9IDE2OworICAgICAgaWYgKChzdGFydGFkZHIgJSAxNikgIT0gMCkKKwlsZW5fdGhpc19wYXNzIC09IHN0YXJ0YWRkciAlIDE2OworICAgICAgaWYgKGxlbl90aGlzX3Bhc3MgPiAobGVuIC0gY291bnQpKQorCWxlbl90aGlzX3Bhc3MgPSAobGVuIC0gY291bnQpOworCisgICAgICBwcmludGZfc3RkZWJ1ZyAoIkRJLkwgJXggJXhcciIsIHN0YXJ0YWRkciwgbGVuX3RoaXNfcGFzcyk7CisgICAgICBleHBlY3QgKCI6ICAiLCAxKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IGxlbl90aGlzX3Bhc3M7IGkrKykKKwlnZXRfaGV4X2J5dGUgKCZteWFkZHJbY291bnQrK10pOworCisgICAgICBleHBlY3RfcHJvbXB0ICgxKTsKKworICAgICAgc3RhcnRhZGRyICs9IGxlbl90aGlzX3Bhc3M7CisgICAgfQorICByZXR1cm4gbGVuOworfQorCisvKiBGSVhNRS1zb21lZGF5ISAgTWVyZ2UgdGhlc2UgdHdvLiAgKi8KK3N0YXRpYyBpbnQKK3N0MjAwMF94ZmVyX2luZmVyaW9yX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4sIHdyaXRlLCB0YXJnZXQpCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47CisgICAgIGludCB3cml0ZTsKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldDsJCS8qIGlnbm9yZWQgKi8KK3sKKyAgaWYgKHdyaXRlKQorICAgIHJldHVybiBzdDIwMDBfd3JpdGVfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbik7CisgIGVsc2UKKyAgICByZXR1cm4gc3QyMDAwX3JlYWRfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkCitzdDIwMDBfa2lsbCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcmV0dXJuOwkJLyogSWdub3JlIGF0dGVtcHRzIHRvIGtpbGwgdGFyZ2V0IHN5c3RlbSAqLworfQorCisvKiBDbGVhbiB1cCB3aGVuIGEgcHJvZ3JhbSBleGl0cy4KKworICAgVGhlIHByb2dyYW0gYWN0dWFsbHkgbGl2ZXMgb24gaW4gdGhlIHJlbW90ZSBwcm9jZXNzb3IncyBSQU0sIGFuZCBtYXkgYmUKKyAgIHJ1biBhZ2FpbiB3aXRob3V0IGEgZG93bmxvYWQuICBEb24ndCBsZWF2ZSBpdCBmdWxsIG9mIGJyZWFrcG9pbnQKKyAgIGluc3RydWN0aW9ucy4gICovCisKK3N0YXRpYyB2b2lkCitzdDIwMDBfbW91cm5faW5mZXJpb3IgKCkKK3sKKyAgcmVtb3ZlX2JyZWFrcG9pbnRzICgpOworICB1bnB1c2hfdGFyZ2V0ICgmc3QyMDAwX29wcyk7CisgIGdlbmVyaWNfbW91cm5faW5mZXJpb3IgKCk7CS8qIERvIGFsbCB0aGUgcHJvcGVyIHRoaW5ncyBub3cgKi8KK30KKworI2RlZmluZSBNQVhfU1RERUJVR19CUkVBS1BPSU5UUyAxNgorCitzdGF0aWMgQ09SRV9BRERSIGJyZWFrYWRkcltNQVhfU1RERUJVR19CUkVBS1BPSU5UU10gPSB7MH07CisKK3N0YXRpYyBpbnQKK3N0MjAwMF9pbnNlcnRfYnJlYWtwb2ludCAoYWRkciwgc2hhZG93KQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqc2hhZG93OworeworICBpbnQgaTsKKyAgQ09SRV9BRERSIGJwX2FkZHIgPSBhZGRyOworICBpbnQgYnBfc2l6ZSA9IDA7CisKKyAgQlJFQUtQT0lOVF9GUk9NX1BDICgmYnBfYWRkciwgJmJwX3NpemUpOworCisgIGZvciAoaSA9IDA7IGkgPD0gTUFYX1NUREVCVUdfQlJFQUtQT0lOVFM7IGkrKykKKyAgICBpZiAoYnJlYWthZGRyW2ldID09IDApCisgICAgICB7CisJYnJlYWthZGRyW2ldID0gYWRkcjsKKworCXN0MjAwMF9yZWFkX2luZmVyaW9yX21lbW9yeSAoYnBfYWRkciwgc2hhZG93LCBicF9zaXplKTsKKwlwcmludGZfc3RkZWJ1ZygiQlIgJXggSFxyIiwgYWRkcik7CisJZXhwZWN0X3Byb21wdCgxKTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICBmcHJpbnRmKHN0ZGVyciwgIlRvbyBtYW55IGJyZWFrcG9pbnRzICg+IDE2KSBmb3IgU1REQlVHXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK3N0MjAwMF9yZW1vdmVfYnJlYWtwb2ludCAoYWRkciwgc2hhZG93KQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqc2hhZG93OworeworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgTUFYX1NUREVCVUdfQlJFQUtQT0lOVFM7IGkrKykKKyAgICBpZiAoYnJlYWthZGRyW2ldID09IGFkZHIpCisgICAgICB7CisJYnJlYWthZGRyW2ldID0gMDsKKworCXByaW50Zl9zdGRlYnVnKCJDQiAlZFxyIiwgaSk7CisJZXhwZWN0X3Byb21wdCgxKTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGZpbmQgYnJlYWtwb2ludCBhc3NvY2lhdGVkIHdpdGggMHgleFxuIiwgYWRkcik7CisgIHJldHVybiAxOworfQorCisKKy8qIFB1dCBhIGNvbW1hbmQgc3RyaW5nLCBpbiBhcmdzLCBvdXQgdG8gU1REQlVHLiAgT3V0cHV0IGZyb20gU1REQlVHIGlzIHBsYWNlZAorICAgb24gdGhlIHVzZXJzIHRlcm1pbmFsIHVudGlsIHRoZSBwcm9tcHQgaXMgc2Vlbi4gKi8KKworc3RhdGljIHZvaWQKK3N0MjAwMF9jb21tYW5kIChhcmdzLCBmcm9tdHR5KQorICAgICBjaGFyCSphcmdzOworICAgICBpbnQJZnJvbXR0eTsKK3sKKyAgaWYgKCFzdDIwMDBfZGVzYykKKyAgICBlcnJvcigic3QyMDAwIHRhcmdldCBub3Qgb3Blbi4iKTsKKyAgCisgIGlmICghYXJncykKKyAgICBlcnJvcigiTWlzc2luZyBjb21tYW5kLiIpOworCQorICBwcmludGZfc3RkZWJ1ZygiJXNcciIsIGFyZ3MpOworICBleHBlY3RfcHJvbXB0KDApOworfQorCisvKiBDb25uZWN0IHRoZSB1c2VyIGRpcmVjdGx5IHRvIFNUREJVRy4gIFRoaXMgY29tbWFuZCBhY3RzIGp1c3QgbGlrZSB0aGUKKyAgICdjdScgb3IgJ3RpcCcgY29tbWFuZC4gIFVzZSA8Q1I+fi4gb3IgPENSPn5eRCB0byBicmVhayBvdXQuICAqLworCisvKnN0YXRpYyBzdHJ1Y3QgdHR5c3RhdGUgdHR5c3RhdGU7Ki8KKworc3RhdGljIHZvaWQKK2NsZWFudXBfdHR5KCkKK3sKKyAgcHJpbnRmKCJcclxuW0V4aXRpbmcgY29ubmVjdCBtb2RlXVxyXG4iKTsKKy8qICBTRVJJQUxfUkVTVE9SRSgwLCAmdHR5c3RhdGUpOyovCit9CisKKyNpZiAwCisvKiBUaGlzIGFsbCBzaG91bGQgbm93IGJlIGluIHNlcmlhbC5jICovCisKK3N0YXRpYyB2b2lkCitjb25uZWN0X2NvbW1hbmQgKGFyZ3MsIGZyb210dHkpCisgICAgIGNoYXIJKmFyZ3M7CisgICAgIGludAlmcm9tdHR5OworeworICBmZF9zZXQgcmVhZGZkczsKKyAgaW50IG51bWZkczsKKyAgaW50IGM7CisgIGNoYXIgY3VyX2VzYyA9IDA7CisKKyAgZG9udF9yZXBlYXQoKTsKKworICBpZiAoc3QyMDAwX2Rlc2MgPCAwKQorICAgIGVycm9yKCJzdDIwMDAgdGFyZ2V0IG5vdCBvcGVuLiIpOworICAKKyAgaWYgKGFyZ3MpCisgICAgZnByaW50ZigiVGhpcyBjb21tYW5kIHRha2VzIG5vIGFyZ3MuICBUaGV5IGhhdmUgYmVlbiBpZ25vcmVkLlxuIik7CisJCisgIHByaW50ZigiW0VudGVyaW5nIGNvbm5lY3QgbW9kZS4gIFVzZSB+LiBvciB+XkQgdG8gZXNjYXBlXVxuIik7CisKKyAgc2VyaWFsX3JhdygwLCAmdHR5c3RhdGUpOworCisgIG1ha2VfY2xlYW51cChjbGVhbnVwX3R0eSwgMCk7CisKKyAgRkRfWkVSTygmcmVhZGZkcyk7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgZG8KKwl7CisJICBGRF9TRVQoMCwgJnJlYWRmZHMpOworCSAgRkRfU0VUKHN0MjAwMF9kZXNjLCAmcmVhZGZkcyk7CisJICBudW1mZHMgPSBzZWxlY3Qoc2l6ZW9mKHJlYWRmZHMpKjgsICZyZWFkZmRzLCAwLCAwLCAwKTsKKwl9CisgICAgICB3aGlsZSAobnVtZmRzID09IDApOworCisgICAgICBpZiAobnVtZmRzIDwgMCkKKwlwZXJyb3Jfd2l0aF9uYW1lKCJzZWxlY3QiKTsKKworICAgICAgaWYgKEZEX0lTU0VUKDAsICZyZWFkZmRzKSkKKwl7CQkJLyogdHR5IGlucHV0LCBzZW5kIHRvIHN0ZGVidWcgKi8KKwkgIGMgPSBnZXRjaGFyKCk7CisJICBpZiAoYyA8IDApCisJICAgIHBlcnJvcl93aXRoX25hbWUoImNvbm5lY3QiKTsKKworCSAgcHJpbnRmX3N0ZGVidWcoIiVjIiwgYyk7CisJICBzd2l0Y2ggKGN1cl9lc2MpCisJICAgIHsKKwkgICAgY2FzZSAwOgorCSAgICAgIGlmIChjID09ICdccicpCisJCWN1cl9lc2MgPSBjOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdccic6CisJICAgICAgaWYgKGMgPT0gJ34nKQorCQljdXJfZXNjID0gYzsKKwkgICAgICBlbHNlCisJCWN1cl9lc2MgPSAwOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICd+JzoKKwkgICAgICBpZiAoYyA9PSAnLicgfHwgYyA9PSAnXDAwNCcpCisJCXJldHVybjsKKwkgICAgICBlbHNlCisJCWN1cl9lc2MgPSAwOworCSAgICB9CisJfQorCisgICAgICBpZiAoRkRfSVNTRVQoc3QyMDAwX2Rlc2MsICZyZWFkZmRzKSkKKwl7CisJICB3aGlsZSAoMSkKKwkgICAgeworCSAgICAgIGMgPSByZWFkY2hhcigwKTsKKwkgICAgICBpZiAoYyA8IDApCisJCWJyZWFrOworCSAgICAgIHB1dGNoYXIoYyk7CisJICAgIH0KKwkgIGZmbHVzaChzdGRvdXQpOworCX0KKyAgICB9Cit9CisjZW5kaWYgLyogMCAqLworCisvKiBEZWZpbmUgdGhlIHRhcmdldCBzdWJyb3V0aW5lIG5hbWVzICovCisKK3N0cnVjdCB0YXJnZXRfb3BzIHN0MjAwMF9vcHMgOworCitzdGF0aWMgdm9pZCAKK2luaXRfc3QyMDAwX29wcyh2b2lkKQoreworICBzdDIwMDBfb3BzLnRvX3Nob3J0bmFtZSA9ICAgInN0MjAwMCI7CisgIHN0MjAwMF9vcHMudG9fbG9uZ25hbWUgPSAgICJSZW1vdGUgc2VyaWFsIFRhbmRlbSBTVDIwMDAgdGFyZ2V0IjsKKyAgc3QyMDAwX29wcy50b19kb2MgPSAgICJVc2UgYSByZW1vdGUgY29tcHV0ZXIgcnVubmluZyBTVERFQlVHIGNvbm5lY3RlZCBieSBhIHNlcmlhbCBsaW5lO1xuXAorb3IgYSBuZXR3b3JrIGNvbm5lY3Rpb24uXG5cCitBcmd1bWVudHMgYXJlIHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UgZm9yIHRoZSBzZXJpYWwgbGluZSxcblwKK3RoZSBzcGVlZCB0byBjb25uZWN0IGF0IGluIGJpdHMgcGVyIHNlY29uZC4iIDsKKyAgc3QyMDAwX29wcy50b19vcGVuID0gICBzdDIwMDBfb3BlbjsKKyAgc3QyMDAwX29wcy50b19jbG9zZSA9ICAgc3QyMDAwX2Nsb3NlOworICBzdDIwMDBfb3BzLnRvX2F0dGFjaCA9ICAgMDsKKyAgc3QyMDAwX3J1bl9vcHMudG9fcG9zdF9hdHRhY2ggPSBOVUxMOworICBzdDIwMDBfb3BzLnRvX3JlcXVpcmVfYXR0YWNoID0gTlVMTDsKKyAgc3QyMDAwX29wcy50b19kZXRhY2ggPSAgIHN0MjAwMF9kZXRhY2g7CisgIHN0MjAwMF9vcHMudG9fcmVxdWlyZV9kZXRhY2ggPSBOVUxMOworICBzdDIwMDBfb3BzLnRvX3Jlc3VtZSA9ICAgc3QyMDAwX3Jlc3VtZTsKKyAgc3QyMDAwX29wcy50b193YWl0ICA9ICAgc3QyMDAwX3dhaXQ7CisgIHN0MjAwMF9vcHMudG9fcG9zdF93YWl0ID0gTlVMTDsKKyAgc3QyMDAwX29wcy50b19mZXRjaF9yZWdpc3RlcnMgID0gICBzdDIwMDBfZmV0Y2hfcmVnaXN0ZXI7CisgIHN0MjAwMF9vcHMudG9fc3RvcmVfcmVnaXN0ZXJzICA9ICAgc3QyMDAwX3N0b3JlX3JlZ2lzdGVyOworICBzdDIwMDBfb3BzLnRvX3ByZXBhcmVfdG9fc3RvcmUgPSAgIHN0MjAwMF9wcmVwYXJlX3RvX3N0b3JlOworICBzdDIwMDBfb3BzLnRvX3hmZXJfbWVtb3J5ICA9ICAgc3QyMDAwX3hmZXJfaW5mZXJpb3JfbWVtb3J5OworICBzdDIwMDBfb3BzLnRvX2ZpbGVzX2luZm8gID0gICBzdDIwMDBfZmlsZXNfaW5mbzsKKyAgc3QyMDAwX29wcy50b19pbnNlcnRfYnJlYWtwb2ludCA9ICAgc3QyMDAwX2luc2VydF9icmVha3BvaW50OworICBzdDIwMDBfb3BzLnRvX3JlbW92ZV9icmVha3BvaW50ID0gICBzdDIwMDBfcmVtb3ZlX2JyZWFrcG9pbnQ7CS8qIEJyZWFrcG9pbnRzICovCisgIHN0MjAwMF9vcHMudG9fdGVybWluYWxfaW5pdCAgPSAgIDA7CisgIHN0MjAwMF9vcHMudG9fdGVybWluYWxfaW5mZXJpb3IgPSAgIDA7CisgIHN0MjAwMF9vcHMudG9fdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ID0gICAwOworICBzdDIwMDBfb3BzLnRvX3Rlcm1pbmFsX291cnMgID0gICAwOworICBzdDIwMDBfb3BzLnRvX3Rlcm1pbmFsX2luZm8gID0gICAwOwkJCQkvKiBUZXJtaW5hbCBoYW5kbGluZyAqLworICBzdDIwMDBfb3BzLnRvX2tpbGwgID0gICBzdDIwMDBfa2lsbDsKKyAgc3QyMDAwX29wcy50b19sb2FkICA9ICAgMDsJCQkJLyogbG9hZCAqLworICBzdDIwMDBfb3BzLnRvX2xvb2t1cF9zeW1ib2wgPSAgIDA7CQkJCS8qIGxvb2t1cF9zeW1ib2wgKi8KKyAgc3QyMDAwX29wcy50b19jcmVhdGVfaW5mZXJpb3IgPSAgIHN0MjAwMF9jcmVhdGVfaW5mZXJpb3I7CisgIHN0MjAwMF9vcHMudG9fcG9zdF9zdGFydHVwX2luZmVyaW9yID0gTlVMTDsKKyAgc3QyMDAwX29wcy50b19hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yID0gTlVMTDsKKyAgc3QyMDAwX29wcy50b19jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yID0gTlVMTDsKKyAgc3QyMDAwX29wcy50b19wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSA9IE5VTEw7CisgIHN0MjAwMF9ydW5fb3BzLnRvX2luc2VydF9mb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBzdDIwMDBfcnVuX29wcy50b19yZW1vdmVfZm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgc3QyMDAwX3J1bl9vcHMudG9faW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBzdDIwMDBfcnVuX29wcy50b19yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIHN0MjAwMF9vcHMudG9faGFzX2ZvcmtlZCA9IE5VTEw7CisgIHN0MjAwMF9vcHMudG9faGFzX3Zmb3JrZWQgPSBOVUxMOworICBzdDIwMDBfcnVuX29wcy50b19jYW5fZm9sbG93X3Zmb3JrX3ByaW9yX3RvX2V4ZWMgPSBOVUxMOworICBzdDIwMDBfb3BzLnRvX3Bvc3RfZm9sbG93X3Zmb3JrID0gTlVMTDsKKyAgc3QyMDAwX3J1bl9vcHMudG9faW5zZXJ0X2V4ZWNfY2F0Y2hwb2ludCA9IE5VTEw7CisgIHN0MjAwMF9ydW5fb3BzLnRvX3JlbW92ZV9leGVjX2NhdGNocG9pbnQgPSBOVUxMOworICBzdDIwMDBfcnVuX29wcy50b19oYXNfZXhlY2QgPSBOVUxMOworICBzdDIwMDBfcnVuX29wcy50b19yZXBvcnRlZF9leGVjX2V2ZW50c19wZXJfZXhlY19jYWxsID0gTlVMTDsKKyAgc3QyMDAwX3J1bl9vcHMudG9faGFzX2V4aXRlZCA9IE5VTEw7CisgIHN0MjAwMF9vcHMudG9fbW91cm5faW5mZXJpb3IgPSAgIHN0MjAwMF9tb3Vybl9pbmZlcmlvcjsKKyAgc3QyMDAwX29wcy50b19jYW5fcnVuICA9ICAgMDsJCQkJLyogY2FuX3J1biAqLworICBzdDIwMDBfb3BzLnRvX25vdGljZV9zaWduYWxzID0gICAwOyAJCQkJLyogbm90aWNlX3NpZ25hbHMgKi8KKyAgc3QyMDAwX29wcy50b190aHJlYWRfYWxpdmUgID0gICAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aHJlYWQgYWxpdmUgKi8KKyAgc3QyMDAwX29wcy50b19zdG9wICA9ICAgMDsJCQkJLyogdG9fc3RvcCAqLworICBzdDIwMDBfb3BzLnRvX3BpZF90b19leGVjX2ZpbGUgPSBOVUxMOworICBzdDIwMDBfcnVuX29wcy50b19jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUgPSBOVUxMOworICBzdDIwMDBfb3BzLnRvX3N0cmF0dW0gPSAgIHByb2Nlc3Nfc3RyYXR1bTsKKyAgc3QyMDAwX29wcy5ET05UX1VTRSA9ICAgMDsJCQkJLyogbmV4dCAqLworICBzdDIwMDBfb3BzLnRvX2hhc19hbGxfbWVtb3J5ID0gICAxOworICBzdDIwMDBfb3BzLnRvX2hhc19tZW1vcnkgPSAgIDE7CisgIHN0MjAwMF9vcHMudG9faGFzX3N0YWNrID0gICAxOworICBzdDIwMDBfb3BzLnRvX2hhc19yZWdpc3RlcnMgPSAgIDE7CisgIHN0MjAwMF9vcHMudG9faGFzX2V4ZWN1dGlvbiA9ICAgMTsJCQkJLyogYWxsIG1lbSwgbWVtLCBzdGFjaywgcmVncywgZXhlYyAqLworICBzdDIwMDBfb3BzLnRvX3NlY3Rpb25zID0gICAwOworICBzdDIwMDBfb3BzLnRvX3NlY3Rpb25zX2VuZCA9ICAgMDsJCQkJLyogU2VjdGlvbiBwb2ludGVycyAqLworICBzdDIwMDBfb3BzLnRvX21hZ2ljID0gICBPUFNfTUFHSUM7CQkJLyogQWx3YXlzIHRoZSBsYXN0IHRoaW5nICovCit9IDsKKwordm9pZAorX2luaXRpYWxpemVfcmVtb3RlX3N0MjAwMCAoKQoreworICBpbml0X3N0MjAwMF9vcHMoKSA7CisgIGFkZF90YXJnZXQgKCZzdDIwMDBfb3BzKTsKKyAgYWRkX2NvbSAoInN0MjAwMCA8Y29tbWFuZD4iLCBjbGFzc19vYnNjdXJlLCBzdDIwMDBfY29tbWFuZCwKKwkgICAiU2VuZCBhIGNvbW1hbmQgdG8gdGhlIFNUREJVRyBtb25pdG9yLiIpOworICBhZGRfY29tICgiY29ubmVjdCIsIGNsYXNzX29ic2N1cmUsIGNvbm5lY3RfY29tbWFuZCwKKwkgICAiQ29ubmVjdCB0aGUgdGVybWluYWwgZGlyZWN0bHkgdXAgdG8gdGhlIFNUREJVRyBjb21tYW5kIG1vbml0b3IuXG5cCitVc2UgPENSPn4uIG9yIDxDUj5+XkQgdG8gYnJlYWsgb3V0LiIpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS11ZGkuYyBiL2dkYi9yZW1vdGUtdWRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5N2JjYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZW1vdGUtdWRpLmMKQEAgLTAsMCArMSwxNjk0IEBACisvKiBSZW1vdGUgZGVidWdnaW5nIGludGVyZmFjZSBmb3IgQU1EIDI5ayBpbnRlcmZhY2VkIHZpYSBVREksIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5MCwgMTk5MiwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgRGFuaWVsIE1hbm4uICBDb250cmlidXRlZCBieSBBTUQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBpcyBsaWtlIHJlbW90ZS5jIGJ1dCB1c2VzIHRoZSBVbml2ZXJzYWwgRGVidWcgSW50ZXJmYWNlIChVREkpIHRvIAorICAgdGFsayB0byB0aGUgdGFyZ2V0IGhhcmR3YXJlIChvciBzaW11bGF0b3IpLiAgVURJIGlzIGEgVENQL0lQIGJhc2VkCisgICBwcm90b2NvbDsgZm9yIGhhcmR3YXJlIHRoYXQgZG9lc24ndCBydW4gVENQLCBhbiBpbnRlcmZhY2UgYWRhcHRlciAKKyAgIGRhZW1vbiB0YWxrcyBVREkgb24gb25lIHNpZGUsIGFuZCB0YWxrcyB0byB0aGUgaGFyZHdhcmUgKHR5cGljYWxseQorICAgb3ZlciBhIHNlcmlhbCBwb3J0KSBvbiB0aGUgb3RoZXIgc2lkZS4KKworIC0gT3JpZ2luYWxseSB3cml0dGVuIGJ5IERhbmllbCBNYW5uIGF0IEFNRCBmb3IgTWluaU1PTiBhbmQgZ2RiIDMuOTEuNi4KKyAtIERhdmlkIFdvb2QgKHdvb2RAbGFiLnVsdHJhLm55dS5lZHUpIGF0IE5ldyBZb3JrIFVuaXZlcnNpdHkgYWRhcHRlZCB0aGlzCisJZmlsZSB0byBnZGIgMy45NS4gIEkgd2FzIHVuYWJsZSB0byBnZXQgdGhpcyB3b3JraW5nIG9uIHN1bjNvczQKKwl3aXRoIHRlcm1pbywgb25seSB3aXRoIHNndHR5LgorIC0gRGFuaWVsIE1hbm4gYXQgQU1EIHRvb2sgdGhlIDMuOTUgYWRhcHRpb25zIGFib3ZlIGFuZCByZXBsYWNlZAorICAgCU1pbmlNT04gaW50ZXJmYWNlIHdpdGggVURJLXAgaW50ZXJmYWNlLgkgICovCisgCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJ3YWl0LmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSAidGVybWluYWwuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICIyOWstc2hhcmUvdWRpL3VkaXByb2MuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiIC8qIEZvciBkb3dubG9hZCBmdW5jdGlvbiAqLworCisvKiBhY2Nlc3MgdGhlIHJlZ2lzdGVyIHN0b3JlIGRpcmVjdGx5LCB3aXRob3V0IGdvaW5nIHRocm91Z2gKKyAgIHRoZSBub3JtYWwgaGFuZGxlciBmdW5jdGlvbnMuIFRoaXMgYXZvaWRzIGFuIGV4dHJhIGRhdGEgY29weS4gICovCisKK2V4dGVybiBpbnQgc3RvcF9zb29uX3F1aWV0bHk7ICAgICAgICAgICAvKiBmb3Igd2FpdF9mb3JfaW5mZXJpb3IgKi8KK2V4dGVybiBzdHJ1Y3QgdmFsdWUgKmNhbGxfZnVuY3Rpb25fYnlfaGFuZCgpOworc3RhdGljIHZvaWQgdWRpX3Jlc3VtZSBQQVJBTVMgKChpbnQgcGlkLCBpbnQgc3RlcCwgZW51bSB0YXJnZXRfc2lnbmFsIHNpZykpOworc3RhdGljIHZvaWQgdWRpX2ZldGNoX3JlZ2lzdGVycyBQQVJBTVMgKChpbnQgcmVnbm8pKTsKK3N0YXRpYyB2b2lkIHVkaV9sb2FkIFBBUkFNUyAoKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkpOworc3RhdGljIHZvaWQgZmV0Y2hfcmVnaXN0ZXIgUEFSQU1TICgoaW50IHJlZ25vKSk7CitzdGF0aWMgdm9pZCB1ZGlfc3RvcmVfcmVnaXN0ZXJzIFBBUkFNUyAoKGludCByZWdubykpOworc3RhdGljIGludCBzdG9yZV9yZWdpc3RlciBQQVJBTVMgKChpbnQgcmVnbm8pKTsKK3N0YXRpYyBpbnQgcmVnbnVtX3RvX3NybnVtIFBBUkFNUyAoKGludCByZWdubykpOworc3RhdGljIHZvaWQgdWRpX2Nsb3NlIFBBUkFNUyAoKGludCBxdWl0dGluZykpOworc3RhdGljIENQVVNwYWNlIHVkaV9tZW1vcnlfc3BhY2UgUEFSQU1TICgoQ09SRV9BRERSIGFkZHIpKTsKK3N0YXRpYyBpbnQgdWRpX3dyaXRlX2luZmVyaW9yX21lbW9yeSBQQVJBTVMgKChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLAorCQkJCQkgICAgICBpbnQgbGVuKSk7CitzdGF0aWMgaW50IHVkaV9yZWFkX2luZmVyaW9yX21lbW9yeSBQQVJBTVMgKChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLAorCQkJCQkgICAgIGludCBsZW4pKTsKK3N0YXRpYyB2b2lkIGRvd25sb2FkIFBBUkFNUyAoKGNoYXIgKmxvYWRfYXJnX3N0cmluZywgaW50IGZyb21fdHR5KSk7CitjaGFyICAgQ29mZkZpbGVOYW1lWzEwMF0gPSAiIjsKKworI2RlZmluZSBGUkVFWkVfTU9ERSAgICAgKHJlYWRfcmVnaXN0ZXIoQ1BTX1JFR05VTSkgJiAweDQwMCkKKyNkZWZpbmUgVVNFX1NIQURPV19QQwkoKHByb2Nlc3Nvcl90eXBlID09IGEyOWtfZnJlZXplX21vZGUpICYmIEZSRUVaRV9NT0RFKQorCitzdGF0aWMgaW50IHRpbWVvdXQgPSA1OworZXh0ZXJuIHN0cnVjdCB0YXJnZXRfb3BzIHVkaV9vcHM7ICAgICAgICAgICAgIC8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KKworLyogU3BlY2lhbCByZWdpc3RlciBlbnVtZXJhdGlvbi4KKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESSBEQVRBKi8KKyNkZWZpbmUJTUFYREFUQQkJMioxMDI0CQkvKiBtYXggVURJW3JlYWQvd3JpdGVdIGJ5dGUgc2l6ZSAqLworLyogRGVzY3JpcHRvciBmb3IgSS9PIHRvIHJlbW90ZSBtYWNoaW5lLiAgSW5pdGlhbGl6ZSBpdCB0byAtMSBzbyB0aGF0CisgICB1ZGlfb3BlbiBrbm93cyB0aGF0IHdlIGRvbid0IGhhdmUgYSBmaWxlIG9wZW4gd2hlbiB0aGUgcHJvZ3JhbQorICAgc3RhcnRzLiAgKi8KKworVURJU2Vzc2lvbklkIHVkaV9zZXNzaW9uX2lkID0gLTE7CitzdGF0aWMgY2hhciAqdWRpX2NvbmZpZ19pZDsKKworQ1BVT2Zmc2V0IElNZW1TdGFydCA9IDA7CitDUFVTaXplVCBJTWVtU2l6ZSA9IDA7CitDUFVPZmZzZXQgRE1lbVN0YXJ0ID0gMDsKK0NQVVNpemVUIERNZW1TaXplID0gMDsKK0NQVU9mZnNldCBSTWVtU3RhcnQgPSAwOworQ1BVU2l6ZVQgUk1lbVNpemUgPSAwOworVURJVUludDMyIENQVVBSTDsKK1VESVVJbnQzMiBDb1Byb2NQUkw7CisKK1VESU1lbW9yeVJhbmdlIGFkZHJlc3NfcmFuZ2VzWzJdOyAvKiBUZXh0IGFuZCBkYXRhICovCitVRElSZXNvdXJjZSBlbnRyeSA9IHswLCAwfTsJLyogRW50cnkgcG9pbnQgKi8KK0NQVVNpemVUIHN0YWNrX3NpemVzWzJdOwkvKiBSZWd1bGFyIGFuZCBtZW1vcnkgc3RhY2tzICovCisKKyNkZWZpbmUJU0JVRl9NQVgJMTAyNAkvKiBtYXhpbXVtIHNpemUgb2Ygc3RyaW5nIGhhbmRsaW5nIGJ1ZmZlciAqLworY2hhciBzYnVmW1NCVUZfTUFYXTsKKwordHlwZWRlZglzdHJ1Y3QgCWJrcHRfZW50cnlfc3RyCit7CisgICAgVURJUmVzb3VyY2UJIEFkZHI7CisgICAgVURJVUludDMyCSBQYXNzQ291bnQ7CisgICAgVURJQnJlYWtUeXBlIFR5cGU7CisgICAgdW5zaWduZWQgaW50IEJyZWFrSWQ7Cit9IGJrcHRfZW50cnlfdDsKKyNkZWZpbmUJCUJLUFRfVEFCTEVfU0laRSA0MAorc3RhdGljIGJrcHRfZW50cnlfdAlia3B0X3RhYmxlW0JLUFRfVEFCTEVfU0laRV07CitleHRlcm4JY2hhcglkZmVfZXJybXNnW107CQkvKiBlcnJvciBzdHJpbmcgKi8KKworLyogbWFsbG9jJ2QgbmFtZSBvZiB0aGUgcHJvZ3JhbSBvbiB0aGUgcmVtb3RlIHN5c3RlbS4gICovCitzdGF0aWMgY2hhciAqcHJvZ19uYW1lID0gTlVMTDsKKworLyogVGhpcyBpcyBjYWxsZWQgbm90IG9ubHkgd2hlbiB3ZSBmaXJzdCBhdHRhY2gsIGJ1dCBhbHNvIHdoZW4gdGhlCisgICB1c2VyIHR5cGVzICJydW4iIGFmdGVyIGhhdmluZyBhdHRhY2hlZC4gICovCisKK3N0YXRpYyB2b2lkCit1ZGlfY3JlYXRlX2luZmVyaW9yIChleGVjZmlsZSwgYXJncywgZW52KQorICAgICBjaGFyICpleGVjZmlsZTsKKyAgICAgY2hhciAqYXJnczsKKyAgICAgY2hhciAqKmVudjsKK3sKKyAgY2hhciAqYXJnczE7CisKKyAgaWYgKGV4ZWNmaWxlKQorICAgIHsKKyAgICAgIGlmIChwcm9nX25hbWUgIT0gTlVMTCkKKwlmcmVlIChwcm9nX25hbWUpOworICAgICAgcHJvZ19uYW1lID0gc2F2ZXN0cmluZyAoZXhlY2ZpbGUsIHN0cmxlbiAoZXhlY2ZpbGUpKTsKKyAgICB9CisgIGVsc2UgaWYgKGVudHJ5Lk9mZnNldCkKKyAgICBleGVjZmlsZSA9ICIiOworICBlbHNlCisgICAgZXJyb3IgKCJObyBpbWFnZSBsb2FkZWQgaW50byB0YXJnZXQuIik7CisKKyAgaWYgKHVkaV9zZXNzaW9uX2lkIDwgMCkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgVElQIGlzIG5vdCBvcGVuLCBvcGVuIGl0LiAgKi8KKyAgICAgIGlmIChVRElDb25uZWN0ICh1ZGlfY29uZmlnX2lkLCAmdWRpX3Nlc3Npb25faWQpKQorCWVycm9yKCJVRElDb25uZWN0KCkgZmFpbGVkOiAlc1xuIiwgZGZlX2Vycm1zZyk7CisgICAgICAvKiBXZSB3aWxsIG5lZWQgdG8gZG93bmxvYWQgdGhlIHByb2dyYW0uICAqLworICAgICAgZW50cnkuT2Zmc2V0ID0gMDsKKyAgICB9CisKKyAgaW5mZXJpb3JfcGlkID0gNDAwMDA7CisKKyAgaWYgKCFlbnRyeS5PZmZzZXQpCisgICAgZG93bmxvYWQoZXhlY2ZpbGUsIDApOworCisgIGFyZ3MxID0gYWxsb2NhIChzdHJsZW4oZXhlY2ZpbGUpICsgc3RybGVuKGFyZ3MpICsgMik7CisKKyAgaWYgKGV4ZWNmaWxlWzBdID09ICdcMCcpCisKKyAgICAvKiBJdCBpcyBlbXB0eS4gIFdlIG5lZWQgdG8gcXVvdGUgaXQgc29tZWhvdywgb3IgZWxzZSB0aGUgdGFyZ2V0CisgICAgICAgd2lsbCB0aGluayB0aGVyZSBpcyBubyBhcmd1bWVudCBiZWluZyBwYXNzZWQgaGVyZS4gIEFjY29yZGluZworICAgICAgIHRvIHRoZSBVREkgc3BlYyBpdCBpcyBxdW90ZWQgImFjY29yZGluZyB0byBUSVAgT1MgcnVsZXMiIHdoaWNoCisgICAgICAgSSBndWVzcyBtZWFucyBxdW90aW5nIGl0IGxpa2UgdGhlIFVuaXggc2hlbGwgc2hvdWxkIHdvcmsKKyAgICAgICAoc291bmRzIHByZXR0eSBib2d1cyB0byBtZS4uLikuICBJbiBmYWN0IGl0IGRvZXNuJ3Qgd29yayAod2l0aAorICAgICAgIGlzc3RpcCBhbnl3YXkpLCBidXQgcGFzc2luZyBpbiB0d28gcXVvdGVzIGFzIHRoZSBhcmd1bWVudCBzZWVtcworICAgICAgIGxpa2UgYSByZWFzb25hYmxlIGVub3VnaCBiZWhhdmlvciBhbnl3YXkgKEkgZ3Vlc3MpLiAgKi8KKworICAgIHN0cmNweSAoYXJnczEsICInJyIpOworICBlbHNlCisgICAgc3RyY3B5IChhcmdzMSwgZXhlY2ZpbGUpOworICBzdHJjYXQgKGFyZ3MxLCAiICIpOworICBzdHJjYXQgKGFyZ3MxLCBhcmdzKTsKKworICBVRElJbml0aWFsaXplUHJvY2VzcyAoYWRkcmVzc19yYW5nZXMsCQkvKiBQcm9jZXNzTWVtb3J5W10gKi8KKwkJCShVRElJbnQpMiwJCS8qIE51bWJlck9mUmFuZ2VzICovCisJCQllbnRyeSwJCQkvKiBFbnRyeVBvaW50ICovCisJCQlzdGFja19zaXplcywJCS8qICpTdGFja1NpemVzICovCisJCQkoVURJSW50KTIsCQkvKiBOdW1iZXJPZlN0YWNrcyAqLworCQkJYXJnczEpOwkJCS8qIEFyZ1N0cmluZyAqLworCisgIGluaXRfd2FpdF9mb3JfaW5mZXJpb3IgKCk7CisgIGNsZWFyX3Byb2NlZWRfc3RhdHVzICgpOworICBwcm9jZWVkICgtMSwgVEFSR0VUX1NJR05BTF9ERUZBVUxULCAwKTsKK30KKworc3RhdGljIHZvaWQKK3VkaV9tb3VybigpCit7CisjaWYgMAorICAvKiBSZXF1aXJpbmcgInRhcmdldCB1ZGkiIGVhY2ggdGltZSB5b3UgcnVuIGlzIGEgbWFqb3IgcGFpbi4gIEkgc3VzcGVjdAorICAgICB0aGlzIHdhcyBqdXN0IGJsaW5keSBjb3BpZWQgZnJvbSByZW1vdGUuYywgaW4gd2hpY2ggInRhcmdldCIgYW5kCisgICAgICJydW4iIGFyZSBjb21iaW5lZC4gIEhhdmluZyBhIHVkaSB0YXJnZXQgd2l0aG91dCBhbiBpbmZlcmlvciBzZWVtcworICAgICB0byB3b3JrIGJldHdlZW4gInRhcmdldCB1ZGkiIGFuZCAicnVuIiwgc28gd2h5IG5vdCBub3c/ICAqLworICBwb3BfdGFyZ2V0ICgpOyAgICAgICAgICAgICAgICAvKiBQb3AgYmFjayB0byBuby1jaGlsZCBzdGF0ZSAqLworI2VuZGlmCisgIC8qIEJ1dCBpZiB3ZSdyZSBnb2luZyB0byB3YW50IHRvIHJ1biBpdCBhZ2Fpbiwgd2UgYmV0dGVyIHJlbW92ZSB0aGUKKyAgICAgYnJlYWtwb2ludHMuLi4gICovCisgIHJlbW92ZV9icmVha3BvaW50cyAoKTsKKyAgZ2VuZXJpY19tb3Vybl9pbmZlcmlvciAoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9PUEVOCisqKiBPcGVuIGEgY29ubmVjdGlvbiB0byByZW1vdGUgVElQLgorICAgTkFNRSBpcyB0aGUgc29ja2V0IGRvbWFpbiB1c2VkIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIFRJUCwKKyAgIHRoZW4gYSBzcGFjZSBhbmQgdGhlIHNvY2tldCBuYW1lIG9yIFRJUC1ob3N0IG5hbWUuCisgICAnPHVkaV91ZGlfY29uZmlnX2lkPicgZm9yIGV4YW1wbGUuCisgKi8KKworLyogWFhYIC0gbmVlZCBjbGVhbnVwcyBmb3IgdWRpY29ubmVjdCBmb3IgdmFyaW91cyBmYWlsdXJlcyEhISAqLworCitzdGF0aWMgdm9pZAordWRpX29wZW4gKG5hbWUsIGZyb21fdHR5KQorICAgICBjaGFyICpuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHVuc2lnbmVkIGludCBwcmw7CisgIGNoYXIgKnA7CisgIGludCBjbnQ7CisgIFVESU1lbW9yeVJhbmdlIEtub3duTWVtb3J5WzEwXTsKKyAgVURJVUludDMyIENoaXBWZXJzaW9uc1sxMF07CisgIFVESUludCBOdW1iZXJPZlJhbmdlcyA9IDEwOworICBVRElJbnQgTnVtYmVyT2ZDaGlwcyA9IDEwOworICBVRElQSWQgUElkOworICBVRElVSW50MzIgVElQSWQsIFRhcmdldElkLCBERkVJZCwgREZFLCBUSVAsIERGRUlQQ0lkLCBUSVBJUENJZDsKKworICB0YXJnZXRfcHJlb3Blbihmcm9tX3R0eSk7CisKKyAgZW50cnkuT2Zmc2V0ID0gMDsKKworICBmb3IgKGNudCA9IDA7IGNudCA8IEJLUFRfVEFCTEVfU0laRTsgY250KyspCisgICAgYmtwdF90YWJsZVtjbnRdLlR5cGUgPSAwOworCisgIGlmICh1ZGlfY29uZmlnX2lkKQorICAgIGZyZWUgKHVkaV9jb25maWdfaWQpOworCisgIGlmICghbmFtZSkKKyAgICBlcnJvcigiVXNhZ2U6IHRhcmdldCB1ZGkgY29uZmlnX2lkLCB3aGVyZSBjb25maWdfaWQgYXBwZWFycyBpbiB1ZGlfc29jIGZpbGUiKTsKKworICB1ZGlfY29uZmlnX2lkID0gc3RyZHVwIChzdHJ0b2sgKG5hbWUsICIgXHQiKSk7CisKKyAgaWYgKFVESUNvbm5lY3QgKHVkaV9jb25maWdfaWQsICZ1ZGlfc2Vzc2lvbl9pZCkpCisgICAgLyogRklYTUU6IFNob3VsZCBzZXQgdWRpX3Nlc3Npb25faWQgdG8gLTEgaGVyZS4gICovCisgICAgZXJyb3IoIlVESUNvbm5lY3QoKSBmYWlsZWQ6ICVzXG4iLCBkZmVfZXJybXNnKTsKKworICBwdXNoX3RhcmdldCAoJnVkaV9vcHMpOworCisgIC8qCisgICoqIEluaXRpYWxpemUgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIChnbG9iYWwpCisgICovCisgIGlmIChVRElHZXRUYXJnZXRDb25maWcgKEtub3duTWVtb3J5LCAmTnVtYmVyT2ZSYW5nZXMsCisJCQkgIENoaXBWZXJzaW9ucywgJk51bWJlck9mQ2hpcHMpKQorICAgIGVycm9yICgiVURJR2V0VGFyZ2V0Q29uZmlnKCkgZmFpbGVkIik7CisgIGlmIChOdW1iZXJPZkNoaXBzID4gMikKKyAgICBmcHJpbnRmX3VuZmlsdGVyZWQoZ2RiX3N0ZGVyciwiVGFyZ2V0IGhhcyBtb3JlIHRoYW4gb25lIHByb2Nlc3NvclxuIik7CisgIGZvciAoY250PTA7IGNudCA8IE51bWJlck9mUmFuZ2VzOyBjbnQrKykKKyAgICB7CisgICAgICBzd2l0Y2goS25vd25NZW1vcnlbY250XS5TcGFjZSkKKwl7CisJZGVmYXVsdDoKKwkgIGZwcmludGZfdW5maWx0ZXJlZChnZGJfc3RkZXJyLCAiVURJR2V0VGFyZ2V0Q29uZmlnKCkgdW5rbm93biBtZW1vcnkgc3BhY2VcbiIpOworCSAgYnJlYWs7CisJY2FzZSBVREkyOUtDUF9TOgorCSAgYnJlYWs7CisJY2FzZSBVREkyOUtJUk9NU3BhY2U6CisJICBSTWVtU3RhcnQgPSBLbm93bk1lbW9yeVtjbnRdLk9mZnNldDsKKwkgIFJNZW1TaXplID0gS25vd25NZW1vcnlbY250XS5TaXplOworCSAgYnJlYWs7CisJY2FzZSBVREkyOUtJUkFNU3BhY2U6CisJICBJTWVtU3RhcnQgPSBLbm93bk1lbW9yeVtjbnRdLk9mZnNldDsKKwkgIElNZW1TaXplID0gS25vd25NZW1vcnlbY250XS5TaXplOworCSAgYnJlYWs7CisJY2FzZSBVREkyOUtEUkFNU3BhY2U6CisJICBETWVtU3RhcnQgPSBLbm93bk1lbW9yeVtjbnRdLk9mZnNldDsKKwkgIERNZW1TaXplID0gS25vd25NZW1vcnlbY250XS5TaXplOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBhMjlrX2dldF9wcm9jZXNzb3JfdHlwZSAoKTsKKworICBpZiAoVURJQ3JlYXRlUHJvY2VzcyAoJlBJZCkpCisgICAgIGZwcmludGZfdW5maWx0ZXJlZChnZGJfc3RkZXJyLCAiVURJQ3JlYXRlUHJvY2VzcygpIGZhaWxlZFxuIik7CisKKyAgLyogUHJpbnQgb3V0IHNvbWUgc3R1ZmYsIGxldHRpbmcgdGhlIHVzZXIgbm93IHdoYXQncyBnb2luZyBvbiAqLworICBpZiAoVURJQ2FwYWJpbGl0aWVzICgmVElQSWQsICZUYXJnZXRJZCwgREZFSWQsIERGRSwgJlRJUCwgJkRGRUlQQ0lkLAorCQkgICAgICAgJlRJUElQQ0lkLCBzYnVmKSkKKyAgICBlcnJvciAoIlVESUNhcGFiaWxpdGllcygpIGZhaWxlZCIpOworICBpZiAoZnJvbV90dHkpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiQ29ubmVjdGVkIHZpYSBVREkgc29ja2V0LFxuXAorIERGRS1JUEMgdmVyc2lvbiAleC4leC4leCAgVElQLUlQQyB2ZXJzaW9uICV4LiV4LiV4ICBUSVAgdmVyc2lvbiAleC4leC4leFxuICVzXG4iLAorCQkgICAgICAgKERGRUlQQ0lkPj44KSYweGYsIChERkVJUENJZD4+NCkmMHhmLCBERkVJUENJZCYweGYsCisJCSAgICAgICAoVElQSVBDSWQ+PjgpJjB4ZiwgKFRJUElQQ0lkPj40KSYweGYsIFRJUElQQ0lkJjB4ZiwKKwkJICAgICAgIChUYXJnZXRJZD4+OCkmMHhmLCAoVGFyZ2V0SWQ+PjQpJjB4ZiwgVGFyZ2V0SWQmMHhmLAorCQkgICAgICAgc2J1Zik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRElfQ0xPU0UKKyAgIENsb3NlIHRoZSBvcGVuIGNvbm5lY3Rpb24gdG8gdGhlIFRJUCBwcm9jZXNzLgorICAgVXNlIHRoaXMgd2hlbiB5b3Ugd2FudCB0byBkZXRhY2ggYW5kIGRvIHNvbWV0aGluZyBlbHNlCisgICB3aXRoIHlvdXIgZ2RiLiAgKi8KK3N0YXRpYyB2b2lkCit1ZGlfY2xvc2UgKHF1aXR0aW5nKQkvKkZJWE1FOiBob3cgaXMgcXVpdHRpbmcgdXNlZCAqLworICAgICBpbnQgcXVpdHRpbmc7Cit7CisgIGlmICh1ZGlfc2Vzc2lvbl9pZCA8IDApCisgICAgcmV0dXJuOworCisgIC8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSBpZiB0aGVyZSBpc24ndCBzb21ldGhpbmcgdmFsaWQgaW4KKyAgICAgdWRpX3Nlc3Npb25faWQuICAqLworCisgIGlmIChVRElEaXNjb25uZWN0ICh1ZGlfc2Vzc2lvbl9pZCwgVURJVGVybWluYXRlU2Vzc2lvbikpCisgICAgeworICAgICAgaWYgKHF1aXR0aW5nKQorCXdhcm5pbmcgKCJVRElEaXNjb25uZWN0KCkgZmFpbGVkIGluIHVkaV9jbG9zZSIpOworICAgICAgZWxzZQorCWVycm9yICgiVURJRGlzY29ubmVjdCgpIGZhaWxlZCBpbiB1ZGlfY2xvc2UiKTsKKyAgICB9CisKKyAgLyogRG8gbm90IHRyeSB0byBjbG9zZSB1ZGlfc2Vzc2lvbl9pZCBhZ2FpbiwgbGF0ZXIgaW4gdGhlIHByb2dyYW0uICAqLworICB1ZGlfc2Vzc2lvbl9pZCA9IC0xOworICBpbmZlcmlvcl9waWQgPSAwOworCisgIHByaW50Zl9maWx0ZXJlZCAoIiAgRW5kaW5nIHJlbW90ZSBkZWJ1Z2dpbmdcbiIpOworfSAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVURJX0FUQUNIICovCisvKiBBdHRhY2ggdG8gYSBwcm9ncmFtIHRoYXQgaXMgYWxyZWFkeSBsb2FkZWQgYW5kIHJ1bm5pbmcgCisgKiBVcG9uIGV4aXRpbmcgdGhlIHByb2Nlc3MncyBleGVjdXRpb24gaXMgc3RvcHBlZC4KKyAqLworc3RhdGljIHZvaWQKK3VkaV9hdHRhY2ggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIFVESVJlc291cmNlCUZyb207CisgIFVESUludDMyCVBDX2FkZHM7CisgIFVESUNvdW50CUNvdW50ID0gMTsKKyAgVURJU2l6ZVQJU2l6ZSA9IDQ7CisgIFVESUNvdW50CUNvdW50RG9uZTsKKyAgVURJQm9vbAlIb3N0RW5kaWFuID0gMDsKKyAgVURJRXJyb3IJZXJyOworCisgIGlmIChhcmdzID09IE5VTEwpCisgICAgZXJyb3Jfbm9fYXJnICgicHJvZ3JhbSB0byBhdHRhY2giKTsKKworICBpZiAodWRpX3Nlc3Npb25faWQgPCAwKQorICAgICAgZXJyb3IgKCJVREkgY29ubmVjdGlvbiBub3Qgb3BlbmVkIHlldCwgdXNlIHRoZSAndGFyZ2V0IHVkaScgY29tbWFuZC5cbiIpOworCQorICBpZiAoZnJvbV90dHkpCisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIkF0dGFjaGluZyB0byByZW1vdGUgcHJvZ3JhbSAlcy4uLlxuIiwgcHJvZ19uYW1lKTsKKworICBVRElTdG9wKCk7CisgIEZyb20uU3BhY2UgPSBVREkyOUtTcGVjaWFsUmVnczsKKyAgRnJvbS5PZmZzZXQgPSAxMTsKKyAgaWYgKGVyciA9IFVESVJlYWQoRnJvbSwgJlBDX2FkZHMsIENvdW50LCBTaXplLCAmQ291bnREb25lLCBIb3N0RW5kaWFuKSkKKyAgICBlcnJvciAoIlVESVJlYWQgZmFpbGVkIGluIHVkaV9hdHRhY2giKTsKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJSZW1vdGUgcHJvY2VzcyBpcyBub3cgaGFsdGVkLCBwYzEgPSAweCV4LlxuIiwgUENfYWRkcyk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRElfREVUQUNIICovCisvKiBUZXJtaW5hdGUgdGhlIG9wZW4gY29ubmVjdGlvbiB0byB0aGUgVElQIHByb2Nlc3MuCisgICBVc2UgdGhpcyB3aGVuIHlvdSB3YW50IHRvIGRldGFjaCBhbmQgZG8gc29tZXRoaW5nIGVsc2UKKyAgIHdpdGggeW91ciBnZGIuICBMZWF2ZSByZW1vdGUgcHJvY2VzcyBydW5uaW5nICh3aXRoIG5vIGJyZWFrcG9pbnRzIHNldCkuICovCitzdGF0aWMgdm9pZAordWRpX2RldGFjaCAoYXJncyxmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworCisgIHJlbW92ZV9icmVha3BvaW50cygpOwkJLyogSnVzdCBpbiBjYXNlIHRoZXJlIHdlcmUgYW55IGxlZnQgaW4gKi8KKworICBpZiAoVURJRGlzY29ubmVjdCAodWRpX3Nlc3Npb25faWQsIFVESUNvbnRpbnVlU2Vzc2lvbikpCisgICAgZXJyb3IgKCJVRElEaXNjb25uZWN0KCkgZmFpbGVkIGluIHVkaV9kZXRhY2giKTsKKworICAvKiBEb24ndCB0cnkgdG8gVURJRGlzY29ubmVjdCBpdCBhZ2FpbiBpbiB1ZGlfY2xvc2UsIHdoaWNoIGlzIGNhbGxlZCBmcm9tCisgICAgIHBvcF90YXJnZXQuICAqLworICB1ZGlfc2Vzc2lvbl9pZCA9IC0xOworICBpbmZlcmlvcl9waWQgPSAwOworCisgIHBvcF90YXJnZXQoKTsKKworICBpZiAoZnJvbV90dHkpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJEZXRhY2hpbmcgZnJvbSBUSVBcbiIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVURJX1JFU1VNRQorKiogVGVsbCB0aGUgcmVtb3RlIG1hY2hpbmUgdG8gcmVzdW1lLiAgKi8KKworc3RhdGljIHZvaWQKK3VkaV9yZXN1bWUgKHBpZCwgc3RlcCwgc2lnKQorICAgICBpbnQgcGlkLCBzdGVwOworICAgICBlbnVtIHRhcmdldF9zaWduYWwgc2lnOworeworICBVRElFcnJvciB0aXBfZXJyb3I7CisgIFVESVVJbnQzMiBTdGVwcyA9IDE7CisgIFVESVN0ZXBUeXBlIFN0ZXBUeXBlID0gVURJU3RlcE5hdHVyYWw7CisgIFVESVJhbmdlIFJhbmdlOworCisgIGlmIChzdGVwKSAJCQkvKiBzdGVwIDEgaW5zdHJ1Y3Rpb24gKi8KKyAgICB7CisgICAgICB0aXBfZXJyb3IgPSBVRElTdGVwIChTdGVwcywgU3RlcFR5cGUsIFJhbmdlKTsKKyAgICAgIGlmICghdGlwX2Vycm9yKQorCXJldHVybjsKKworICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAgIlVESVN0ZXAoKSBlcnJvciA9ICVkXG4iLCB0aXBfZXJyb3IpOworICAgICAgZXJyb3IgKCJmYWlsZWQgaW4gdWRpX3Jlc3VtZSIpOworICAgIH0KKworICBpZiAoVURJRXhlY3V0ZSgpKQorICAgIGVycm9yICgiVURJRXhlY3V0ZSgpIGZhaWxlZCBpbiB1ZGlfcmVzdW1lIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRElfV0FJVAorKiogV2FpdCB1bnRpbCB0aGUgcmVtb3RlIG1hY2hpbmUgc3RvcHMsIHRoZW4gcmV0dXJuLAorICAgc3RvcmluZyBzdGF0dXMgaW4gU1RBVFVTIGp1c3QgYXMgYHdhaXQnIHdvdWxkLiAgKi8KKworc3RhdGljIGludAordWRpX3dhaXQgKHBpZCwgc3RhdHVzKQorICAgICBpbnQgcGlkOworICAgICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0YXR1czsKK3sKKyAgVURJSW50MzIJTWF4VGltZTsKKyAgVURJUElkCVBJZDsKKyAgVURJSW50MzIJU3RvcFJlYXNvbjsKKyAgVURJU2l6ZVQJQ291bnREb25lOworICBpbnQgCQlvbGRfdGltZW91dCA9IHRpbWVvdXQ7CisgIGludCAJCW9sZF9pbW1lZGlhdGVfcXVpdCA9IGltbWVkaWF0ZV9xdWl0OworICBpbnQJCWk7CisKKyAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0VYSVRFRDsKKyAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gMDsKKworLyogd2FpdCBmb3IgbWVzc2FnZSB0byBhcnJpdmUuIEl0IHNob3VsZCBiZToKKyAgSWYgdGhlIHRhcmdldCBzdG9wcyBleGVjdXRpbmcsIHVkaV93YWl0KCkgc2hvdWxkIHJldHVybi4KKyovCisgIHRpbWVvdXQgPSAwOwkJCS8qIFdhaXQgaW5kZWZpbmV0bHkgZm9yIGEgbWVzc2FnZSAqLworICBpbW1lZGlhdGVfcXVpdCA9IDE7ICAgCS8qIEhlbHBzIGFiaWxpdHkgdG8gUVVJVCAqLworCisgIHdoaWxlKDEpCisgICAgeworICAgICAgaSA9IDA7CisgICAgICBNYXhUaW1lID0gVURJV2FpdEZvcmV2ZXI7CisgICAgICBVRElXYWl0KE1heFRpbWUsICZQSWQsICZTdG9wUmVhc29uKTsKKyAgICAgIFFVSVQ7CQkJLyogTGV0IHVzZXIgcXVpdCBpZiB0aGV5IHdhbnQgKi8KKworICAgICAgc3dpdGNoIChTdG9wUmVhc29uICYgVURJR3Jvc3NTdGF0ZSkKKwl7CisJY2FzZSBVRElTdGRvdXRSZWFkeToKKwkgIGlmIChVRElHZXRTdGRvdXQgKHNidWYsIChVRElTaXplVClTQlVGX01BWCwgJkNvdW50RG9uZSkpCisJICAgIC8qIFRoaXMgaXMgc2FpZCB0byBoYXBwZW4gaWYgdGhlIHByb2dyYW0gdHJpZXMgdG8gb3V0cHV0CisJICAgICAgIGEgd2hvbGUgYnVuY2ggb2Ygb3V0cHV0IChtb3JlIHRoYW4gU0JVRl9NQVgsIEkgd291bGQKKwkgICAgICAgZ3Vlc3MpLiAgSXQgZG9lc24ndCBzZWVtIHRvIGhhcHBlbiB3aXRoIHRoZSBzaW11bGF0b3IuICAqLworCSAgICB3YXJuaW5nICgiVURJR2V0U3Rkb3V0KCkgZmFpbGVkIGluIHVkaV93YWl0Iik7CisJICBmd3JpdGUgKHNidWYsIDEsIENvdW50RG9uZSwgc3Rkb3V0KTsKKwkgIGdkYl9mbHVzaChnZGJfc3Rkb3V0KTsKKwkgIGNvbnRpbnVlOworCisJY2FzZSBVRElTdGRlcnJSZWFkeToKKwkgIFVESUdldFN0ZGVyciAoc2J1ZiwgKFVESVNpemVUKVNCVUZfTUFYLCAmQ291bnREb25lKTsKKwkgIGZ3cml0ZSAoc2J1ZiwgMSwgQ291bnREb25lLCBzdGRlcnIpOworCSAgZ2RiX2ZsdXNoKGdkYl9zdGRlcnIpOworCSAgY29udGludWU7CisKKwljYXNlIFVESVN0ZGluTmVlZGVkOgorCSAgeworCSAgICBpbnQgY2g7CisJICAgIGkgPSAwOworCSAgICBkbworCSAgICAgIHsKKwkJY2ggPSBnZXRjaGFyICgpOworCQlpZiAoY2ggPT0gRU9GKQorCQkgIGJyZWFrOworCQlzYnVmW2krK10gPSBjaDsKKwkgICAgICB9IHdoaWxlIChpIDwgU0JVRl9NQVggJiYgY2ggIT0gJ1xuJyk7CisJICAgIFVESVB1dFN0ZGluIChzYnVmLCAoVURJU2l6ZVQpaSwgJkNvdW50RG9uZSk7CisJICAgIGNvbnRpbnVlOworCSAgfQorCisJY2FzZSBVRElSdW5uaW5nOgorCSAgLyogSW4gc3BpdGUgb2YgdGhlIGZhY3QgdGhhdCB3ZSB0b2xkIFVESVdhaXQgdG8gd2FpdCBmb3JldmVyLCBpdCB3aWxsCisJICAgICByZXR1cm4gc3B1cmlvdXNseSBzb21ldGltZXMuICAqLworCWNhc2UgVURJU3RkaW5Nb2RlWDoKKwkgIGNvbnRpbnVlOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgc3dpdGNoIChTdG9wUmVhc29uICYgVURJR3Jvc3NTdGF0ZSkKKyAgICB7CisgICAgY2FzZSBVRElUcmFwcGVkOgorICAgICAgcHJpbnRmX3VuZmlsdGVyZWQoIkFtMjkwKjAgcmVjZWl2ZWQgdmVjdG9yIG51bWJlciAlZFxuIiwgU3RvcFJlYXNvbiA+PiAyNCk7CisJICAKKyAgICAgIHN3aXRjaCAoKFN0b3BSZWFzb24gPj4gOCApICYgMHhmZikKKwl7CisJY2FzZSAwOgkJCS8qIElsbGVnYWwgb3Bjb2RlICovCisJICBwcmludGZfdW5maWx0ZXJlZCgiCShicmVhayBwb2ludClcbiIpOworCSAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisJICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVFJBUDsKKwkgIGJyZWFrOworCWNhc2UgMToJCQkvKiBVbmFsaWduZWQgQWNjZXNzICovCisJICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKwkgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9CVVM7CisJICBicmVhazsKKwljYXNlIDM6CisJY2FzZSA0OgorCSAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisJICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfRlBFOworCSAgYnJlYWs7CisJY2FzZSA1OgkJCS8qIFByb3RlY3Rpb24gVmlvbGF0aW9uICovCisJICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKwkgIC8qIFdoeSBub3QgU0VHVj8gIFdoYXQgaXMgYSBQcm90ZWN0aW9uIFZpb2xhdGlvbj8gICovCisJICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfSUxMOworCSAgYnJlYWs7CisJY2FzZSA2OgorCWNhc2UgNzoKKwljYXNlIDg6CQkJLyogVXNlciBJbnN0cnVjdGlvbiBNYXBwaW5nIE1pc3MgKi8KKwljYXNlIDk6CQkJLyogVXNlciBEYXRhIE1hcHBpbmcgTWlzcyAqLworCWNhc2UgMTA6CQkvKiBTdXBlcnZpc29yIEluc3RydWN0aW9uIE1hcHBpbmcgTWlzcyAqLworCWNhc2UgMTE6CQkvKiBTdXBlcnZpc29yIERhdGEgTWFwcGluZyBNaXNzICovCisJICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKwkgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9TRUdWOworCSAgYnJlYWs7CisJY2FzZSAxMjoKKwljYXNlIDEzOgorCSAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisJICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfSUxMOworCSAgYnJlYWs7CisJY2FzZSAxNDoJCS8qIFRpbWVyICovCisJICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKwkgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9BTFJNOworCSAgYnJlYWs7CisJY2FzZSAxNToJCS8qIFRyYWNlICovCisJICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKwkgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQOworCSAgYnJlYWs7CisJY2FzZSAxNjoJCS8qIElOVFIwICovCisJY2FzZSAxNzoJCS8qIElOVFIxICovCisJY2FzZSAxODoJCS8qIElOVFIyICovCisJY2FzZSAxOToJCS8qIElOVFIzL0ludGVybmFsICovCisJY2FzZSAyMDoJCS8qIFRSQVAwICovCisJY2FzZSAyMToJCS8qIFRSQVAxICovCisJICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKwkgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9JTlQ7CisJICBicmVhazsKKwljYXNlIDIyOgkJLyogRmxvYXRpbmctUG9pbnQgRXhjZXB0aW9uICovCisJICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKwkgIC8qIFdoeSBub3QgRlBFPyAgKi8KKwkgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9JTEw7CisJICBicmVhazsKKwljYXNlIDc3OgkJLyogYXNzZXJ0IDc3ICovCisJICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKwkgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9FWElURUQ7CisJICBzdGF0dXMtPnZhbHVlLmludGVnZXIgPSAwOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgVURJTm90RXhlY3V0aW5nOgorICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVEVSTTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVURJU3RvcHBlZDoKKyAgICAgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOworICAgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1RTVFA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVESVdhcm5lZDoKKyAgICAgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOworICAgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1VSRzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVURJU3RlcHBlZDoKKyAgICBjYXNlIFVESUJyZWFrOgorICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVFJBUDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVURJV2FpdGluZzoKKyAgICAgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOworICAgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1NUT1A7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVESUhhbHRlZDoKKyAgICAgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOworICAgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX0tJTEw7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVESUV4aXRlZDoKKyAgICBkZWZhdWx0OgorICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0VYSVRFRDsKKyAgICAgIHN0YXR1cy0+dmFsdWUuaW50ZWdlciA9IDA7CisgICAgfQorCisgIHRpbWVvdXQgPSBvbGRfdGltZW91dDsJLyogUmVzdG9yZSBvcmlnaW5hbCB0aW1lb3V0IHZhbHVlICovCisgIGltbWVkaWF0ZV9xdWl0ID0gb2xkX2ltbWVkaWF0ZV9xdWl0OworICByZXR1cm4gaW5mZXJpb3JfcGlkOworfQorCisjaWYgMAorLyogSGFuZHkgZm9yIGRlYnVnZ2luZyAqLwordWRpX3BjKCkKK3sKKyAgVURJUmVzb3VyY2UJRnJvbTsKKyAgVURJVUludDMyCSpUbzsKKyAgVURJQ291bnQJQ291bnQ7CisgIFVESVNpemVUCVNpemUgPSA0OworICBVRElDb3VudAlDb3VudERvbmU7CisgIFVESUJvb2wJSG9zdEVuZGlhbiA9IDA7CisgIFVESUVycm9yCWVycjsKKyAgaW50IHBjWzJdOworICB1bnNpZ25lZCBsb25nIG15cmVnc1syNTZdOworICBpbnQgaTsKKworICBGcm9tLlNwYWNlID0gVURJMjlLUEM7CisgIEZyb20uT2Zmc2V0ID0gMDsKKyAgVG8gPSAoVURJVUludDMyICopcGM7CisgIENvdW50ID0gMjsKKworICBlcnIgPSBVRElSZWFkKEZyb20sIFRvLCBDb3VudCwgU2l6ZSwgJkNvdW50RG9uZSwgSG9zdEVuZGlhbik7CisKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJlcnIgPSAlZCwgQ291bnREb25lID0gJWQsIHBjWzBdID0gMHgleCwgcGNbMV0gPSAweCV4XG4iLAorCSAgZXJyLCBDb3VudERvbmUsIHBjWzBdLCBwY1sxXSk7CisKKyAgdWRpX2ZldGNoX3JlZ2lzdGVycygtMSk7CisKKyAgcHJpbnRmX3VuZmlsdGVyZWQoIm90aGVyIHBjMSA9IDB4JXgsIHBjMCA9IDB4JXhcbiIsICooaW50ICopJnJlZ2lzdGVyc1s0ICogUENfUkVHTlVNXSwKKwkgICooaW50ICopJnJlZ2lzdGVyc1s0ICogTlBDX1JFR05VTV0pOworCisgIC8qIE5vdywgcmVhZCBhbGwgdGhlIHJlZ2lzdGVycyBnbG9iYWxseSAqLworCisgIEZyb20uU3BhY2UgPSBVREkyOUtHbG9iYWxSZWdzOworICBGcm9tLk9mZnNldCA9IDA7CisgIGVyciA9IFVESVJlYWQoRnJvbSwgbXlyZWdzLCAyNTYsIDQsICZDb3VudERvbmUsIEhvc3RFbmRpYW4pOworCisgIHByaW50ZiAoImVyciA9ICVkLCBDb3VudERvbmUgPSAlZFxuIiwgZXJyLCBDb3VudERvbmUpOworCisgIHByaW50ZigiXG4iKTsKKworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpICs9IDIpCisgICAgcHJpbnRmKCIlZDpcdCUjMTB4XHQlMTFkXHQlIzEweFx0JTExZFxuIiwgaSwgbXlyZWdzW2ldLCBteXJlZ3NbaV0sCisJICAgbXlyZWdzW2krMV0sIG15cmVnc1tpKzFdKTsKKyAgcHJpbnRmKCJcbiIpOworCisgIHJldHVybiBwY1swXTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRElfRkVUQ0hfUkVHSVNURVJTCisgKiBSZWFkIGEgcmVtb3RlIHJlZ2lzdGVyICdyZWdubycuIAorICogSWYgcmVnbm89PS0xIHRoZW4gcmVhZCBhbGwgdGhlIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIHZvaWQgCit1ZGlfZmV0Y2hfcmVnaXN0ZXJzIChyZWdubykKK2ludAlyZWdubzsKK3sKKyAgVURJUmVzb3VyY2UJRnJvbTsKKyAgVURJVUludDMyCSpUbzsKKyAgVURJQ291bnQJQ291bnQ7CisgIFVESVNpemVUCVNpemUgPSA0OworICBVRElDb3VudAlDb3VudERvbmU7CisgIFVESUJvb2wJSG9zdEVuZGlhbiA9IDA7CisgIFVESUVycm9yCWVycjsKKyAgaW50CQlpOworCisgIGlmIChyZWdubyA+PSAwKSAgeworICAgIGZldGNoX3JlZ2lzdGVyKHJlZ25vKTsKKyAgICByZXR1cm47CisgIH0KKworLyogR3IxL3JzcCAqLworCisgIEZyb20uU3BhY2UgPSBVREkyOUtHbG9iYWxSZWdzOworICBGcm9tLk9mZnNldCA9IDE7CisgIFRvID0gKFVESVVJbnQzMiAqKSZyZWdpc3RlcnNbNCAqIEdSMV9SRUdOVU1dOworICBDb3VudCA9IDE7CisgIGlmIChlcnIgPSBVRElSZWFkKEZyb20sIFRvLCBDb3VudCwgU2l6ZSwgJkNvdW50RG9uZSwgSG9zdEVuZGlhbikpCisgICAgZXJyb3IoIlVESVJlYWQoKSBmYWlsZWQgaW4gdWRpX2ZldGNoX3JlZ2lzdGVycyIpOworCisgIHJlZ2lzdGVyX3ZhbGlkW0dSMV9SRUdOVU1dID0gMTsKKworI2lmIGRlZmluZWQoR1I2NF9SRUdOVU0pCS8qIFJlYWQgZ3I2NC0xMjcgKi8KKworLyogR2xvYmFsIFJlZ2lzdGVycyBncjY0LWdyOTUgKi8gCisKKyAgRnJvbS5TcGFjZSA9IFVESTI5S0dsb2JhbFJlZ3M7CisgIEZyb20uT2Zmc2V0ID0gNjQ7CisgIFRvID0gKFVESVVJbnQzMiAqKSZyZWdpc3RlcnNbNCAqIEdSNjRfUkVHTlVNXTsKKyAgQ291bnQgPSAzMjsKKyAgaWYgKGVyciA9IFVESVJlYWQoRnJvbSwgVG8sIENvdW50LCBTaXplLCAmQ291bnREb25lLCBIb3N0RW5kaWFuKSkKKyAgICBlcnJvcigiVURJUmVhZCgpIGZhaWxlZCBpbiB1ZGlfZmV0Y2hfcmVnaXN0ZXJzIik7CisKKyAgZm9yIChpID0gR1I2NF9SRUdOVU07IGkgPCBHUjY0X1JFR05VTSArIDMyOyBpKyspCisgICAgcmVnaXN0ZXJfdmFsaWRbaV0gPSAxOworCisjZW5kaWYJLyogIEdSNjRfUkVHTlVNICovCisKKy8qIEdsb2JhbCBSZWdpc3RlcnMgZ3I5Ni1ncjEyNyAqLyAKKworICBGcm9tLlNwYWNlID0gVURJMjlLR2xvYmFsUmVnczsKKyAgRnJvbS5PZmZzZXQgPSA5NjsKKyAgVG8gPSAoVURJVUludDMyICopJnJlZ2lzdGVyc1s0ICogR1I5Nl9SRUdOVU1dOworICBDb3VudCA9IDMyOworICBpZiAoZXJyID0gVURJUmVhZChGcm9tLCBUbywgQ291bnQsIFNpemUsICZDb3VudERvbmUsIEhvc3RFbmRpYW4pKQorICAgIGVycm9yKCJVRElSZWFkKCkgZmFpbGVkIGluIHVkaV9mZXRjaF9yZWdpc3RlcnMiKTsKKworICBmb3IgKGkgPSBHUjk2X1JFR05VTTsgaSA8IEdSOTZfUkVHTlVNICsgMzI7IGkrKykKKyAgICByZWdpc3Rlcl92YWxpZFtpXSA9IDE7CisKKy8qIExvY2FsIFJlZ2lzdGVycyAqLworCisgIEZyb20uU3BhY2UgPSBVREkyOUtMb2NhbFJlZ3M7CisgIEZyb20uT2Zmc2V0ID0gMDsKKyAgVG8gPSAoVURJVUludDMyICopJnJlZ2lzdGVyc1s0ICogTFIwX1JFR05VTV07CisgIENvdW50ID0gMTI4OworICBpZiAoZXJyID0gVURJUmVhZChGcm9tLCBUbywgQ291bnQsIFNpemUsICZDb3VudERvbmUsIEhvc3RFbmRpYW4pKQorICAgIGVycm9yKCJVRElSZWFkKCkgZmFpbGVkIGluIHVkaV9mZXRjaF9yZWdpc3RlcnMiKTsKKworICBmb3IgKGkgPSBMUjBfUkVHTlVNOyBpIDwgTFIwX1JFR05VTSArIDEyODsgaSsrKQorICAgIHJlZ2lzdGVyX3ZhbGlkW2ldID0gMTsKKworLyogUHJvdGVjdGVkIFNwZWNpYWwgUmVnaXN0ZXJzICovCisKKyAgRnJvbS5TcGFjZSA9IFVESTI5S1NwZWNpYWxSZWdzOworICBGcm9tLk9mZnNldCA9IDA7CisgIFRvID0gKFVESVVJbnQzMiAqKSZyZWdpc3RlcnNbNCAqIFNSX1JFR05VTSgwKV07CisgIENvdW50ID0gMTU7CisgIGlmIChlcnIgPSBVRElSZWFkKEZyb20sIFRvLCBDb3VudCwgU2l6ZSwgJkNvdW50RG9uZSwgSG9zdEVuZGlhbikpCisgICAgZXJyb3IoIlVESVJlYWQoKSBmYWlsZWQgaW4gdWRpX2ZldGNoX3JlZ2lzdGVycyIpOworCisgIGZvciAoaSA9IFNSX1JFR05VTSgwKTsgaSA8IFNSX1JFR05VTSgwKSArIDE1OyBpKyspCisgICAgcmVnaXN0ZXJfdmFsaWRbaV0gPSAxOworCisgIGlmIChVU0VfU0hBRE9XX1BDKSB7CS8qIExldCByZWdub190b19zcm51bSgpIGhhbmRsZSB0aGUgcmVnaXN0ZXIgbnVtYmVyICovCisgICAgZmV0Y2hfcmVnaXN0ZXIoTlBDX1JFR05VTSk7CisgICAgZmV0Y2hfcmVnaXN0ZXIoUENfUkVHTlVNKTsKKyAgICBmZXRjaF9yZWdpc3RlcihQQzJfUkVHTlVNKTsKKworLyogVW5wcm90ZWN0ZWQgU3BlY2lhbCBSZWdpc3RlcnMgc3IxMjgtc3IxMzUgKi8KKworICAgIEZyb20uU3BhY2UgPSBVREkyOUtTcGVjaWFsUmVnczsKKyAgICBGcm9tLk9mZnNldCA9IDEyODsKKyAgICBUbyA9IChVRElVSW50MzIgKikmcmVnaXN0ZXJzWzQgKiBTUl9SRUdOVU0oMTI4KV07CisgICAgQ291bnQgPSAxMzUtMTI4ICsgMTsKKyAgICBpZiAoZXJyID0gVURJUmVhZChGcm9tLCBUbywgQ291bnQsIFNpemUsICZDb3VudERvbmUsIEhvc3RFbmRpYW4pKQorICAgICAgZXJyb3IoIlVESVJlYWQoKSBmYWlsZWQgaW4gdWRpX2ZldGNoX3JlZ2lzdGVycyIpOworCisgICAgZm9yIChpID0gU1JfUkVHTlVNKDEyOCk7IGkgPCBTUl9SRUdOVU0oMTI4KSArIDEzNS0xMjgrMTsgaSsrKQorICAgICAgcmVnaXN0ZXJfdmFsaWRbaV0gPSAxOworICB9CisKKyAgaWYgKHJlbW90ZV9kZWJ1ZykKKyAgICB7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCgiRmV0Y2hpbmcgYWxsIHJlZ2lzdGVyc1xuIik7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCgiRmV0Y2hpbmcgUEMwID0gMHgleCwgUEMxID0gMHgleCwgUEMyID0gMHgleFxuIiwKKwkgICAgIHJlYWRfcmVnaXN0ZXIoTlBDX1JFR05VTSksIHJlYWRfcmVnaXN0ZXIoUENfUkVHTlVNKSwKKwkgICAgIHJlYWRfcmVnaXN0ZXIoUEMyX1JFR05VTSkpOworICAgIH0KKworICAvKiBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYW55IHdheSB0byBnZXQgdGhlc2UuICAqLworICB7CisgICAgaW50IHZhbCA9IC0xOworICAgIHN1cHBseV9yZWdpc3RlciAoRlBFX1JFR05VTSwgKGNoYXIgKikgJnZhbCk7CisgICAgc3VwcGx5X3JlZ2lzdGVyIChJTlRFX1JFR05VTSwgKGNoYXIgKikgJnZhbCk7CisgICAgc3VwcGx5X3JlZ2lzdGVyIChGUFNfUkVHTlVNLCAoY2hhciAqKSAmdmFsKTsKKyAgICBzdXBwbHlfcmVnaXN0ZXIgKEVYT19SRUdOVU0sIChjaGFyICopICZ2YWwpOworICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRElfU1RPUkVfUkVHSVNURVJTCisqKiBTdG9yZSByZWdpc3RlciByZWdubyBpbnRvIHRoZSB0YXJnZXQuICAKKyAqIElmIHJlZ25vPT0tMSB0aGVuIHN0b3JlIGFsbCB0aGUgcmVnaXN0ZXJzLgorICovCisKK3N0YXRpYyB2b2lkCit1ZGlfc3RvcmVfcmVnaXN0ZXJzIChyZWdubykKK2ludCByZWdubzsKK3sKKyAgVURJVUludDMyCSpGcm9tOworICBVRElSZXNvdXJjZQlUbzsKKyAgVURJQ291bnQJQ291bnQ7CisgIFVESVNpemVUCVNpemUgPSA0OworICBVRElDb3VudAlDb3VudERvbmU7CisgIFVESUJvb2wJSG9zdEVuZGlhbiA9IDA7CisgIAorICBpZiAocmVnbm8gPj0gMCkKKyAgICB7CisgICAgICBzdG9yZV9yZWdpc3RlcihyZWdubyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChyZW1vdGVfZGVidWcpCisgICAgeworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQoIlN0b3JpbmcgYWxsIHJlZ2lzdGVyc1xuIik7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCgiUEMwID0gMHgleCwgUEMxID0gMHgleCwgUEMyID0gMHgleFxuIiwgcmVhZF9yZWdpc3RlcihOUENfUkVHTlVNKSwKKwkgICAgIHJlYWRfcmVnaXN0ZXIoUENfUkVHTlVNKSwgcmVhZF9yZWdpc3RlcihQQzJfUkVHTlVNKSk7CisgICAgfQorCisvKiBHcjEvcnNwICovCisKKyAgRnJvbSA9IChVRElVSW50MzIgKikmcmVnaXN0ZXJzWzQgKiBHUjFfUkVHTlVNXTsKKyAgVG8uU3BhY2UgPSBVREkyOUtHbG9iYWxSZWdzOworICBUby5PZmZzZXQgPSAxOworICBDb3VudCA9IDE7CisgIGlmKFVESVdyaXRlKEZyb20sIFRvLCBDb3VudCwgU2l6ZSwgJkNvdW50RG9uZSwgSG9zdEVuZGlhbikpCisgICAgZXJyb3IoIlVESVdyaXRlKCkgZmFpbGVkIGluIHVkaV9zdG9yZV9yZWdpc2V0cnMiKTsKKworI2lmIGRlZmluZWQoR1I2NF9SRUdOVU0pCisKKy8qIEdsb2JhbCByZWdpc3RlcnMgZ3I2NC1ncjk1ICovCisKKyAgRnJvbSA9IChVRElVSW50MzIgKikmcmVnaXN0ZXJzWzQgKiBHUjY0X1JFR05VTV07CisgIFRvLlNwYWNlID0gVURJMjlLR2xvYmFsUmVnczsKKyAgVG8uT2Zmc2V0ID0gNjQ7CisgIENvdW50ID0gMzI7CisgIGlmKFVESVdyaXRlKEZyb20sIFRvLCBDb3VudCwgU2l6ZSwgJkNvdW50RG9uZSwgSG9zdEVuZGlhbikpCisgICAgZXJyb3IoIlVESVdyaXRlKCkgZmFpbGVkIGluIHVkaV9zdG9yZV9yZWdpc2V0cnMiKTsKKworI2VuZGlmCS8qIEdSNjRfUkVHTlVNICovCisKKy8qIEdsb2JhbCByZWdpc3RlcnMgZ3I5Ni1ncjEyNyAqLworCisgIEZyb20gPSAoVURJVUludDMyICopJnJlZ2lzdGVyc1s0ICogR1I5Nl9SRUdOVU1dOworICBUby5TcGFjZSA9IFVESTI5S0dsb2JhbFJlZ3M7CisgIFRvLk9mZnNldCA9IDk2OworICBDb3VudCA9IDMyOworICBpZihVRElXcml0ZShGcm9tLCBUbywgQ291bnQsIFNpemUsICZDb3VudERvbmUsIEhvc3RFbmRpYW4pKQorICAgIGVycm9yKCJVRElXcml0ZSgpIGZhaWxlZCBpbiB1ZGlfc3RvcmVfcmVnaXNldHJzIik7CisKKy8qIExvY2FsIFJlZ2lzdGVycyAqLworCisgIEZyb20gPSAoVURJVUludDMyICopJnJlZ2lzdGVyc1s0ICogTFIwX1JFR05VTV07CisgIFRvLlNwYWNlID0gVURJMjlLTG9jYWxSZWdzOworICBUby5PZmZzZXQgPSAwOworICBDb3VudCA9IDEyODsKKyAgaWYoVURJV3JpdGUoRnJvbSwgVG8sIENvdW50LCBTaXplLCAmQ291bnREb25lLCBIb3N0RW5kaWFuKSkKKyAgICBlcnJvcigiVURJV3JpdGUoKSBmYWlsZWQgaW4gdWRpX3N0b3JlX3JlZ2lzZXRycyIpOworCisKKy8qIFByb3RlY3RlZCBTcGVjaWFsIFJlZ2lzdGVycyAqLyAvKiBWQUIgdGhyb3VnaCBUTVIgKi8KKworICBGcm9tID0gKFVESVVJbnQzMiAqKSZyZWdpc3RlcnNbNCAqIFNSX1JFR05VTSgwKV07CisgIFRvLlNwYWNlID0gVURJMjlLU3BlY2lhbFJlZ3M7CisgIFRvLk9mZnNldCA9IDA7CisgIENvdW50ID0gMTA7CisgIGlmKFVESVdyaXRlKEZyb20sIFRvLCBDb3VudCwgU2l6ZSwgJkNvdW50RG9uZSwgSG9zdEVuZGlhbikpCisgICAgZXJyb3IoIlVESVdyaXRlKCkgZmFpbGVkIGluIHVkaV9zdG9yZV9yZWdpc2V0cnMiKTsKKworLyogUEMwLCBQQzEsIFBDMiBwb3NzaWJseSBhcyBzaGFkb3cgcmVnaXN0ZXJzICovCisKKyAgRnJvbSA9IChVRElVSW50MzIgKikmcmVnaXN0ZXJzWzQgKiBTUl9SRUdOVU0oMTApXTsKKyAgVG8uU3BhY2UgPSBVREkyOUtTcGVjaWFsUmVnczsKKyAgQ291bnQgPSAzOworICBpZiAoVVNFX1NIQURPV19QQykgCisgICAgVG8uT2Zmc2V0ID0gMjA7CQkJCS8qIFNQQzAgKi8KKyAgZWxzZSAKKyAgICBUby5PZmZzZXQgPSAxMDsJCQkJLyogUEMwICovCisgIGlmKFVESVdyaXRlKEZyb20sIFRvLCBDb3VudCwgU2l6ZSwgJkNvdW50RG9uZSwgSG9zdEVuZGlhbikpCisgICAgZXJyb3IoIlVESVdyaXRlKCkgZmFpbGVkIGluIHVkaV9zdG9yZV9yZWdpc2V0cnMiKTsKKworLyogUEMxIHZpYSBVREkyOUtQQyAqLworCisgIEZyb20gPSAoVURJVUludDMyICopJnJlZ2lzdGVyc1s0ICogUENfUkVHTlVNXTsKKyAgVG8uU3BhY2UgPSBVREkyOUtQQzsKKyAgVG8uT2Zmc2V0ID0gMDsJCQkJLyogUEMxICovCisgIENvdW50ID0gMTsKKyAgaWYgKFVESVdyaXRlIChGcm9tLCBUbywgQ291bnQsIFNpemUsICZDb3VudERvbmUsIEhvc3RFbmRpYW4pKQorICAgIGVycm9yICgiVURJV3JpdGUoKSBmYWlsZWQgaW4gdWRpX3N0b3JlX3JlZ2lzZXRycyIpOworCisgIC8qIExSVSBhbmQgTU1VICovCisKKyAgRnJvbSA9IChVRElVSW50MzIgKikmcmVnaXN0ZXJzWzQgKiBTUl9SRUdOVU0oMTMpXTsKKyAgVG8uU3BhY2UgPSBVREkyOUtTcGVjaWFsUmVnczsKKyAgVG8uT2Zmc2V0ID0gMTM7CisgIENvdW50ID0gMjsKKyAgaWYoVURJV3JpdGUoRnJvbSwgVG8sIENvdW50LCBTaXplLCAmQ291bnREb25lLCBIb3N0RW5kaWFuKSkKKyAgICBlcnJvcigiVURJV3JpdGUoKSBmYWlsZWQgaW4gdWRpX3N0b3JlX3JlZ2lzZXRycyIpOworCisvKiBVbnByb3RlY3RlZCBTcGVjaWFsIFJlZ2lzdGVycyAqLyAKKworICBGcm9tID0gKFVESVVJbnQzMiAqKSZyZWdpc3RlcnNbNCAqIFNSX1JFR05VTSgxMjgpXTsKKyAgVG8uU3BhY2UgPSBVREkyOUtTcGVjaWFsUmVnczsKKyAgVG8uT2Zmc2V0ID0gMTI4OworICBDb3VudCA9IDEzNS0xMjggKzE7CisgIGlmKFVESVdyaXRlKEZyb20sIFRvLCBDb3VudCwgU2l6ZSwgJkNvdW50RG9uZSwgSG9zdEVuZGlhbikpCisgICAgZXJyb3IoIlVESVdyaXRlKCkgZmFpbGVkIGluIHVkaV9zdG9yZV9yZWdpc2V0cnMiKTsKKworICByZWdpc3RlcnNfY2hhbmdlZCAoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVRElfUFJFUEFSRV9UT19TVE9SRSAqLworLyogR2V0IHJlYWR5IHRvIG1vZGlmeSB0aGUgcmVnaXN0ZXJzIGFycmF5LiAgT24gbWFjaGluZXMgd2hpY2ggc3RvcmUKKyAgIGluZGl2aWR1YWwgcmVnaXN0ZXJzLCB0aGlzIGRvZXNuJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gIE9uIG1hY2hpbmVzCisgICB3aGljaCBzdG9yZSBhbGwgdGhlIHJlZ2lzdGVycyBpbiBvbmUgZmVsbCBzd29vcCwgdGhpcyBtYWtlcyBzdXJlCisgICB0aGF0IHJlZ2lzdGVycyBjb250YWlucyBhbGwgdGhlIHJlZ2lzdGVycyBmcm9tIHRoZSBwcm9ncmFtIGJlaW5nCisgICBkZWJ1Z2dlZC4gICovCisKK3N0YXRpYyB2b2lkCit1ZGlfcHJlcGFyZV90b19zdG9yZSAoKQoreworICAvKiBEbyBub3RoaW5nLCBzaW5jZSB3ZSBjYW4gc3RvcmUgaW5kaXZpZHVhbCByZWdzICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFRSQU5TTEFURV9BRERSICovCitzdGF0aWMgQ09SRV9BRERSCit0cmFuc2xhdGVfYWRkcihhZGRyKQorQ09SRV9BRERSIGFkZHI7Cit7CisjaWYgZGVmaW5lZChVTFRSQTMpICYmIGRlZmluZWQoS0VSTkVMX0RFQlVHR0lORykKKyAgICAgICAgLyogQ2hlY2sgZm9yIGEgdmlydHVhbCBhZGRyZXNzIGluIHRoZSBrZXJuZWwgKi8KKyAgICAgICAgLyogQXNzdW1lIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdWJsb2NrIGlzIGluICBwYWRkcl91IHJlZ2lzdGVyICovCisJLyogRklYTUU6IGRvZXNuJ3Qgd29yayBmb3IgdXNlciB2aXJ0dWFsIGFkZHJlc3NlcyAqLworICAgICAgICBpZiAoYWRkciA+PSBVVkFERFIpIHsKKyAgICAgICAgICAgICAgICAvKiBQQUREUl9VIHJlZ2lzdGVyIGhvbGRzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSB1YmxvY2sgKi8KKyAgICAgICAgICAgICAgICBDT1JFX0FERFIgaSA9IChDT1JFX0FERFIpcmVhZF9yZWdpc3RlcihQQUREUl9VX1JFR05VTSk7CisgICAgICAgICAgICAgICAgcmV0dXJuKGkgKyBhZGRyIC0gKENPUkVfQUREUilVVkFERFIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAJcmV0dXJuKGFkZHIpOworICAgICAgICB9CisjZWxzZQorICAgICAgICByZXR1cm4oYWRkcik7CisjZW5kaWYKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9YRkVSX0lORkVSSU9SX01FTU9SWSAqLworLyogRklYTUUhICBNZXJnZSB0aGVzZSB0d28uICAqLworc3RhdGljIGludAordWRpX3hmZXJfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbiwgd3JpdGUpCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47CisgICAgIGludCB3cml0ZTsKK3sKKworICBtZW1hZGRyID0gdHJhbnNsYXRlX2FkZHIobWVtYWRkcik7CisKKyAgaWYgKHdyaXRlKQorICAgIHJldHVybiB1ZGlfd3JpdGVfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbik7CisgIGVsc2UKKyAgICByZXR1cm4gdWRpX3JlYWRfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9GSUxFU19JTkZPICovCitzdGF0aWMgdm9pZAordWRpX2ZpbGVzX2luZm8gKCkKK3sKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcdEF0dGFjaGVkIHRvIFVESSBzb2NrZXQgdG8gJXMiLCB1ZGlfY29uZmlnX2lkKTsKKyAgaWYgKHByb2dfbmFtZSAhPSBOVUxMKQorICAgIHByaW50Zl91bmZpbHRlcmVkICgiYW5kIHJ1bm5pbmcgcHJvZ3JhbSAlcyIsIHByb2dfbmFtZSk7CisgIHByaW50Zl91bmZpbHRlcmVkICgiLlxuIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9JTlNFUlRfQlJFQUtQT0lOVCAqLworc3RhdGljIGludAordWRpX2luc2VydF9icmVha3BvaW50IChhZGRyLCBjb250ZW50c19jYWNoZSkKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGNoYXIgKmNvbnRlbnRzX2NhY2hlOworeworICBpbnQgY250OworICBVRElFcnJvciBlcnI7CisKKyAgZm9yIChjbnQgPSAwOyBjbnQgPCBCS1BUX1RBQkxFX1NJWkU7IGNudCsrKQorICAgIGlmIChia3B0X3RhYmxlW2NudF0uVHlwZSA9PSAwKSAvKiBGaW5kIGZpcnN0IGZyZWUgc2xvdCAqLworICAgICAgYnJlYWs7CisKKyAgaWYoY250ID49IEJLUFRfVEFCTEVfU0laRSkKKyAgICBlcnJvcigiVG9vIG1hbnkgYnJlYWtwb2ludHMgc2V0Iik7CisKKyAgYmtwdF90YWJsZVtjbnRdLkFkZHIuT2Zmc2V0ID0gYWRkcjsKKyAgYmtwdF90YWJsZVtjbnRdLkFkZHIuU3BhY2UgID0gVURJMjlLSVJBTVNwYWNlOworICBia3B0X3RhYmxlW2NudF0uUGFzc0NvdW50ID0gMTsKKyAgYmtwdF90YWJsZVtjbnRdLlR5cGUgPSBVRElCcmVha0ZsYWdFeGVjdXRlOworICAKKyAgZXJyID0gVURJU2V0QnJlYWtwb2ludChia3B0X3RhYmxlW2NudF0uQWRkciwKKwkJCSBia3B0X3RhYmxlW2NudF0uUGFzc0NvdW50LAorCQkJIGJrcHRfdGFibGVbY250XS5UeXBlLAorCQkJICZia3B0X3RhYmxlW2NudF0uQnJlYWtJZCk7CisKKyAgaWYgKGVyciA9PSAwKSByZXR1cm4gMDsJCS8qIFN1Y2Nlc3MgKi8KKworICBia3B0X3RhYmxlW2NudF0uVHlwZSA9IDA7CisgIGVycm9yKCJVRElTZXRCcmVha3BvaW50IHJldHVybmVkIGVycm9yIGNvZGUgJWRcbiIsIGVycik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9SRU1PVkVfQlJFQUtQT0lOVCAqLworc3RhdGljIGludAordWRpX3JlbW92ZV9icmVha3BvaW50IChhZGRyLCBjb250ZW50c19jYWNoZSkKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGNoYXIgKmNvbnRlbnRzX2NhY2hlOworeworICBpbnQgY250OworICBVRElFcnJvciBlcnI7CisKKyAgZm9yIChjbnQgPSAwOyBjbnQgPCBCS1BUX1RBQkxFX1NJWkU7IGNudCsrKQorICAgIGlmIChia3B0X3RhYmxlW2NudF0uQWRkci5PZmZzZXQgPT0gYWRkcikgLyogRmluZCBtYXRjaGluZyBicmVha3BvaW50ICovCisgICAgICBicmVhazsKKworICBpZihjbnQgPj0gQktQVF9UQUJMRV9TSVpFKQorICAgIGVycm9yKCJDYW4ndCBmaW5kIGJyZWFrcG9pbnQgaW4gdGFibGUiKTsKKworICBia3B0X3RhYmxlW2NudF0uVHlwZSA9IDA7CisKKyAgZXJyID0gVURJQ2xlYXJCcmVha3BvaW50KGJrcHRfdGFibGVbY250XS5CcmVha0lkKTsKKyAgaWYgKGVyciA9PSAwKSByZXR1cm4gMDsJLyogU3VjY2VzcyAqLworCisgIGVycm9yKCJVRElDbGVhckJyZWFrcG9pbnQgcmV0dXJuZWQgZXJyb3IgY29kZSAlZFxuIiwgZXJyKTsKK30KKworc3RhdGljIHZvaWQKK3VkaV9raWxsKGFyZyxmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisKKyNpZiAwCisvKgorVURJU3RvcCBkb2VzIG5vdCByZWFsbHkgd29yayBhcyBhZHZlcnRpc2VkLiAgSXQgY2F1c2VzIHRoZSBUSVAgdG8gY2xvc2UgaXQncworY29ubmVjdGlvbiwgd2hpY2ggdXN1YWxseSByZXN1bHRzIGluIEdEQiBkeWluZyB3aXRoIGEgU0lHUElQRS4gIEZvciBub3csIHdlCitqdXN0IGludm9rZSB1ZGlfY2xvc2UsIHdoaWNoIHNlZW1zIHRvIGdldCB0aGluZ3MgcmlnaHQuCisqLworICBVRElTdG9wKCk7CisKKyAgdWRpX3Nlc3Npb25faWQgPSAtMTsKKyAgaW5mZXJpb3JfcGlkID0gMDsKKworICBpZiAoZnJvbV90dHkpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQoIlRhcmdldCBoYXMgYmVlbiBzdG9wcGVkLiIpOworI2VuZGlmIC8qIDAgKi8KKyNpZiAwCisgIHVkaV9jbG9zZSgwKTsKKyAgcG9wX3RhcmdldCgpOworI2VuZGlmIC8qIDAgKi8KKworICAvKiBLZWVwIHRoZSB0YXJnZXQgYXJvdW5kLCBlLmcuIHNvICJydW4iIGNhbiBkbyB0aGUgcmlnaHQgdGhpbmcgd2hlbgorICAgICB3ZSBhcmUgYWxyZWFkeSBkZWJ1Z2dpbmcgc29tZXRoaW5nLiAgKi8KKworICBpZiAoVURJRGlzY29ubmVjdCAodWRpX3Nlc3Npb25faWQsIFVESVRlcm1pbmF0ZVNlc3Npb24pKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJVRElEaXNjb25uZWN0KCkgZmFpbGVkIik7CisgICAgfQorCisgIC8qIERvIG5vdCB0cnkgdG8gY2xvc2UgdWRpX3Nlc3Npb25faWQgYWdhaW4sIGxhdGVyIGluIHRoZSBwcm9ncmFtLiAgKi8KKyAgdWRpX3Nlc3Npb25faWQgPSAtMTsKKyAgaW5mZXJpb3JfcGlkID0gMDsKK30KKworLyogCisgICBMb2FkIGEgcHJvZ3JhbSBpbnRvIHRoZSB0YXJnZXQuICBBcmdzIGFyZTogYHByb2dyYW0ge29wdGlvbnN9Jy4gIFRoZSBvcHRpb25zCisgICBhcmUgdXNlZCB0byBjb250cm9sIGxvYWRpbmcgb2YgdGhlIHByb2dyYW0sIGFuZCBhcmUgTk9UIHBhc3NlZCBvbnRvIHRoZQorICAgbG9hZGVkIGNvZGUgYXMgYXJndW1lbnRzLiAgKFlvdSBuZWVkIHRvIHVzZSB0aGUgYHJ1bicgY29tbWFuZCB0byBkbyB0aGF0LikKKworICAgVGhlIG9wdGlvbnMgYXJlOgorIAkJLW1zICVkCVNldCBtZW0gc3RhY2sgc2l6ZSB0byAlZAorCQktcnMgJWQJU2V0IHJlZ3VsYXIgc3RhY2sgc2l6ZSB0byAlZAorCQktaQlzZW5kIGluaXQgaW5mbyAoZGVmYXVsdCkKKwkJLW5vaQlkb24ndCBzZW5kIGluaXQgaW5mbworCQktW3RUXSAgCUxvYWQgVGV4dCBzZWN0aW9uCisJCS1bZERdCUxvYWQgRGF0YSBzZWN0aW9uCisJCS1bYkJdCUxvYWQgQlNTIHNlY3Rpb24KKwkJLVtsTF0JTG9hZCBMaXQgc2VjdGlvbgorICAqLworCitzdGF0aWMgdm9pZAorZG93bmxvYWQobG9hZF9hcmdfc3RyaW5nLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqbG9hZF9hcmdfc3RyaW5nOworICAgICBpbnQgZnJvbV90dHk7Cit7CisjZGVmaW5lIERFRkFVTFRfTUVNX1NUQUNLX1NJWkUgCQkweDYwMDAKKyNkZWZpbmUgREVGQVVMVF9SRUdfU1RBQ0tfU0laRSAJCTB4MjAwMAorCisgIGNoYXIgKnRva2VuOworICBjaGFyICpmaWxlbmFtZTsKKyAgYXNlY3Rpb24gKnNlY3Rpb247CisgIGJmZCAqcGJmZDsKKyAgVURJRXJyb3IgZXJyOworICBpbnQgbG9hZF90ZXh0ID0gMSwgbG9hZF9kYXRhID0gMSwgbG9hZF9ic3MgPSAxLCBsb2FkX2xpdCA9IDE7CisKKyAgYWRkcmVzc19yYW5nZXNbMF0uU3BhY2UgPSBVREkyOUtJUkFNU3BhY2U7CisgIGFkZHJlc3NfcmFuZ2VzWzBdLk9mZnNldCA9IDB4ZmZmZmZmZmY7CisgIGFkZHJlc3NfcmFuZ2VzWzBdLlNpemUgPSAwOworCisgIGFkZHJlc3NfcmFuZ2VzWzFdLlNwYWNlID0gVURJMjlLRFJBTVNwYWNlOworICBhZGRyZXNzX3Jhbmdlc1sxXS5PZmZzZXQgPSAweGZmZmZmZmZmOworICBhZGRyZXNzX3Jhbmdlc1sxXS5TaXplID0gMDsKKworICBzdGFja19zaXplc1swXSA9IERFRkFVTFRfUkVHX1NUQUNLX1NJWkU7CisgIHN0YWNrX3NpemVzWzFdID0gREVGQVVMVF9NRU1fU1RBQ0tfU0laRTsKKworICBkb250X3JlcGVhdCAoKTsKKworICBmaWxlbmFtZSA9IHN0cnRvayhsb2FkX2FyZ19zdHJpbmcsICIgXHQiKTsKKyAgaWYgKCFmaWxlbmFtZSkKKyAgICBlcnJvciAoIk11c3Qgc3BlY2lmeSBhdCBsZWFzdCBhIGZpbGUgbmFtZSB3aXRoIHRoZSBsb2FkIGNvbW1hbmQiKTsKKworICBmaWxlbmFtZSA9IHRpbGRlX2V4cGFuZCAoZmlsZW5hbWUpOworICBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZnJlZSwgZmlsZW5hbWUpOworCisgIHdoaWxlICh0b2tlbiA9IHN0cnRvayAoTlVMTCwgIiBcdCIpKQorICAgIHsKKyAgICAgIGlmICh0b2tlblswXSA9PSAnLScpCisJeworCSAgdG9rZW4rKzsKKworCSAgaWYgKFNUUkVRICh0b2tlbiwgIm1zIikpCisJICAgIHN0YWNrX3NpemVzWzFdID0gYXRvbCAoc3RydG9rIChOVUxMLCAiIFx0IikpOworCSAgZWxzZSBpZiAoU1RSRVEgKHRva2VuLCAicnMiKSkKKwkgICAgc3RhY2tfc2l6ZXNbMF0gPSBhdG9sIChzdHJ0b2sgKE5VTEwsICIgXHQiKSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBsb2FkX3RleHQgPSBsb2FkX2RhdGEgPSBsb2FkX2JzcyA9IGxvYWRfbGl0ID0gMDsKKworCSAgICAgIHdoaWxlICgqdG9rZW4pCisJCXsKKwkJICBzd2l0Y2ggKCp0b2tlbisrKQorCQkgICAgeworCQkgICAgY2FzZSAndCc6CisJCSAgICBjYXNlICdUJzoKKwkJICAgICAgbG9hZF90ZXh0ID0gMTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlICdkJzoKKwkJICAgIGNhc2UgJ0QnOgorCQkgICAgICBsb2FkX2RhdGEgPSAxOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgJ2InOgorCQkgICAgY2FzZSAnQic6CisJCSAgICAgIGxvYWRfYnNzID0gMTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlICdsJzoKKwkJICAgIGNhc2UgJ0wnOgorCQkgICAgICBsb2FkX2xpdCA9IDE7CisJCSAgICAgIGJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgZXJyb3IgKCJVbmtub3duIFVESSBsb2FkIG9wdGlvbiAtJXMiLCB0b2tlbi0xKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICBwYmZkID0gYmZkX29wZW5yIChmaWxlbmFtZSwgZ251dGFyZ2V0KTsKKworICBpZiAoIXBiZmQpIAorICAgIC8qIEZJWE1FOiBzaG91bGQgYmUgdXNpbmcgYmZkX2Vycm1zZywgbm90IGFzc3VtaW5nIGl0IHdhcworICAgICAgIGJmZF9lcnJvcl9zeXN0ZW1fY2FsbC4gICovCisgICAgcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworICAKKyAgLyogRklYTUU6IHNob3VsZCBiZSBjaGVja2luZyBmb3IgZXJyb3JzIGZyb20gYmZkX2Nsb3NlIChmb3Igb25lIHRoaW5nLAorICAgICBvbiBlcnJvciBpdCBkb2VzIG5vdCBmcmVlIGFsbCB0aGUgc3RvcmFnZSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgIGJmZCkuICAqLworICBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgYmZkX2Nsb3NlLCBwYmZkKTsKKworICBRVUlUOworICBpbW1lZGlhdGVfcXVpdCsrOworCisgIGlmICghYmZkX2NoZWNrX2Zvcm1hdCAocGJmZCwgYmZkX29iamVjdCkpIAorICAgIGVycm9yICgiSXQgZG9lc24ndCBzZWVtIHRvIGJlIGFuIG9iamVjdCBmaWxlIik7CisgIAorICBmb3IgKHNlY3Rpb24gPSBwYmZkLT5zZWN0aW9uczsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpIAorICAgIHsKKyAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHBiZmQsIHNlY3Rpb24pICYgU0VDX0FMTE9DKQorCXsKKwkgIFVESVJlc291cmNlIFRvOworCSAgVURJQ291bnQgQ291bnQ7CisJICB1bnNpZ25lZCBsb25nIHNlY3Rpb25fc2l6ZSwgc2VjdGlvbl9lbmQ7CisJICBjb25zdCBjaGFyICpzZWN0aW9uX25hbWU7CisKKwkgIHNlY3Rpb25fbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChwYmZkLCBzZWN0aW9uKTsKKwkgIGlmIChTVFJFUSAoc2VjdGlvbl9uYW1lLCAiLnRleHQiKSAmJiAhbG9hZF90ZXh0KQorCSAgICBjb250aW51ZTsKKwkgIGVsc2UgaWYgKFNUUkVRIChzZWN0aW9uX25hbWUsICIuZGF0YSIpICYmICFsb2FkX2RhdGEpCisJICAgIGNvbnRpbnVlOworCSAgZWxzZSBpZiAoU1RSRVEgKHNlY3Rpb25fbmFtZSwgIi5ic3MiKSAmJiAhbG9hZF9ic3MpCisJICAgIGNvbnRpbnVlOworCSAgZWxzZSBpZiAoU1RSRVEgKHNlY3Rpb25fbmFtZSwgIi5saXQiKSAmJiAhbG9hZF9saXQpCisJICAgIGNvbnRpbnVlOworCisJICBUby5PZmZzZXQgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChwYmZkLCBzZWN0aW9uKTsKKwkgIHNlY3Rpb25fc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKHBiZmQsIHNlY3Rpb24pOworCSAgc2VjdGlvbl9lbmQgPSBUby5PZmZzZXQgKyBzZWN0aW9uX3NpemU7CisKKwkgIGlmIChzZWN0aW9uX3NpemUgPT0gMCkKKwkgICAgLyogVGhpcyBpcyBuZWVkZWQgYXQgbGVhc3QgaW4gdGhlIEJTUyBjYXNlLCB3aGVyZSB0aGUgY29kZQorCSAgICAgICBiZWxvdyBzdGFydHMgd3JpdGluZyBiZWZvcmUgaXQgZXZlbiBjaGVja3MgdGhlIHNpemUuICAqLworCSAgICBjb250aW51ZTsKKworCSAgcHJpbnRmX3VuZmlsdGVyZWQoIltMb2FkaW5nIHNlY3Rpb24gJXMgYXQgJXggKCVkIGJ5dGVzKV1cbiIsCisJCSBzZWN0aW9uX25hbWUsCisJCSBUby5PZmZzZXQsCisJCSBzZWN0aW9uX3NpemUpOworCisJICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChwYmZkLCBzZWN0aW9uKSAmIFNFQ19DT0RFKQorCSAgICB7CisJICAgICAgVG8uU3BhY2UgPSBVREkyOUtJUkFNU3BhY2U7CisKKwkgICAgICBhZGRyZXNzX3Jhbmdlc1swXS5PZmZzZXQgPSBtaW4gKGFkZHJlc3NfcmFuZ2VzWzBdLk9mZnNldCwKKwkJCQkJICAgICAgVG8uT2Zmc2V0KTsKKwkgICAgICBhZGRyZXNzX3Jhbmdlc1swXS5TaXplID0gbWF4IChhZGRyZXNzX3Jhbmdlc1swXS5TaXplLAorCQkJCQkgICAgc2VjdGlvbl9lbmQKKwkJCQkJICAgIC0gYWRkcmVzc19yYW5nZXNbMF0uT2Zmc2V0KTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgVG8uU3BhY2UgPSBVREkyOUtEUkFNU3BhY2U7CisKKwkgICAgICBhZGRyZXNzX3Jhbmdlc1sxXS5PZmZzZXQgPSBtaW4gKGFkZHJlc3NfcmFuZ2VzWzFdLk9mZnNldCwKKwkJCQkJICAgICAgVG8uT2Zmc2V0KTsKKwkgICAgICBhZGRyZXNzX3Jhbmdlc1sxXS5TaXplID0gbWF4IChhZGRyZXNzX3Jhbmdlc1sxXS5TaXplLAorCQkJCQkgICAgc2VjdGlvbl9lbmQKKwkJCQkJICAgIC0gYWRkcmVzc19yYW5nZXNbMV0uT2Zmc2V0KTsKKwkgICAgfQorCisJICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChwYmZkLCBzZWN0aW9uKSAmIFNFQ19MT0FEKSAvKiBUZXh0LCBkYXRhIG9yIGxpdCAqLworCSAgICB7CisJICAgICAgZmlsZV9wdHIgZnB0cjsKKworCSAgICAgIGZwdHIgPSAwOworCisJICAgICAgd2hpbGUgKHNlY3Rpb25fc2l6ZSA+IDApCisJCXsKKwkJICBjaGFyIGJ1ZmZlclsxMDI0XTsKKworCQkgIENvdW50ID0gbWluIChzZWN0aW9uX3NpemUsIDEwMjQpOworCisJCSAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChwYmZkLCBzZWN0aW9uLCBidWZmZXIsIGZwdHIsCisJCQkJCSAgICBDb3VudCk7CisKKwkJICBlcnIgPSBVRElXcml0ZSAoKFVESUhvc3RNZW1QdHIpYnVmZmVyLCAvKiBGcm9tICovCisJCQkJICBUbywJCQkvKiBUbyAqLworCQkJCSAgQ291bnQsCQkvKiBDb3VudCAqLworCQkJCSAgKFVESVNpemVUKTEsCQkvKiBTaXplICovCisJCQkJICAmQ291bnQsCQkvKiBDb3VudERvbmUgKi8KKwkJCQkgIChVRElCb29sKTApOwkJLyogSG9zdEVuZGlhbiAqLworCQkgIGlmIChlcnIpCisJCSAgICBlcnJvciAoIlVESVdyaXRlIGZhaWxlZCwgZXJyb3IgPSAlZCIsIGVycik7CisKKwkJICBUby5PZmZzZXQgKz0gQ291bnQ7CisJCSAgZnB0ciArPSBDb3VudDsKKwkJICBzZWN0aW9uX3NpemUgLT0gQ291bnQ7CisJCX0KKwkgICAgfQorCSAgZWxzZQkJCS8qIEJTUyAqLworCSAgICB7CisJICAgICAgVURJUmVzb3VyY2UgRnJvbTsKKwkgICAgICB1bnNpZ25lZCBsb25nIHplcm8gPSAwOworCisJICAgICAgLyogV3JpdGUgYSB6ZXJvIGJ5dGUgYXQgdGhlIHZtYSAqLworCSAgICAgIC8qIEZJWE1FOiBCcm9rZW4gZm9yIHNlY3Rpb25zIG9mIDEtMyBieXRlcyAod2UgdGVzdCBmb3IKKwkJIHplcm8gYWJvdmUpLiAgKi8KKwkgICAgICBlcnIgPSBVRElXcml0ZSAoKFVESUhvc3RNZW1QdHIpJnplcm8sCS8qIEZyb20gKi8KKwkJCSAgICAgIFRvLAkJCS8qIFRvICovCisJCQkgICAgICAoVURJQ291bnQpMSwJCS8qIENvdW50ICovCisJCQkgICAgICAoVURJU2l6ZVQpNCwJCS8qIFNpemUgKi8KKwkJCSAgICAgICZDb3VudCwJCQkvKiBDb3VudERvbmUgKi8KKwkJCSAgICAgIChVRElCb29sKTApOwkJLyogSG9zdEVuZGlhbiAqLworCSAgICAgIGlmIChlcnIpCisJCWVycm9yICgiVURJV3JpdGUgZmFpbGVkLCBlcnJvciA9ICVkIiwgZXJyKTsKKworCSAgICAgIEZyb20gPSBUbzsKKwkgICAgICBUby5PZmZzZXQrPTQ7CisKKwkgICAgICAvKiBOb3csIGR1cGxpY2F0ZSBpdCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgQlNTICovCisJICAgICAgZXJyID0gVURJQ29weSAoRnJvbSwJCQkvKiBGcm9tICovCisJCQkgICAgIFRvLAkJCS8qIFRvICovCisJCQkgICAgIChVRElDb3VudCkoc2VjdGlvbl9zaXplLzQgLSAxKSwgLyogQ291bnQgKi8KKwkJCSAgICAgKFVESVNpemVUKTQsCQkvKiBTaXplICovCisJCQkgICAgICZDb3VudCwJCQkvKiBDb3VudERvbmUgKi8KKwkJCSAgICAgKFVESUJvb2wpMSk7CQkvKiBEaXJlY3Rpb24gKi8KKwkgICAgICBpZiAoZXJyKQorCQl7CisJCSAgY2hhciBtZXNzYWdlWzEwMF07CisJCSAgaW50IHhlcnI7CisKKwkJICB4ZXJyID0gVURJR2V0RXJyb3JNc2coZXJyLCAxMDAsIG1lc3NhZ2UsICZDb3VudCk7CisJCSAgaWYgKCF4ZXJyKQorCQkgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiRXJyb3IgaXMgJXNcbiIsIG1lc3NhZ2UpOworCQkgIGVsc2UKKwkJICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgInhlcnIgaXMgJWRcbiIsIHhlcnIpOworCQkgIGVycm9yICgiVURJQ29weSBmYWlsZWQsIGVycm9yID0gJWQiLCBlcnIpOworCQl9CisJICAgIH0KKworCX0KKyAgICB9CisKKyAgZW50cnkuU3BhY2UgPSBVREkyOUtJUkFNU3BhY2U7CisgIGVudHJ5Lk9mZnNldCA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAocGJmZCk7CisgIAorICBpbW1lZGlhdGVfcXVpdC0tOworfQorCisvKiBGdW5jdGlvbiB0byBkb3dubG9hZCBhbiBpbWFnZSBpbnRvIHRoZSByZW1vdGUgdGFyZ2V0LiAgKi8KKworc3RhdGljIHZvaWQKK3VkaV9sb2FkIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBkb3dubG9hZCAoYXJncywgZnJvbV90dHkpOworCisgIC8qIEFzIGEgY29udmVuaWVuY2UsIHBpY2sgdXAgYW55IHN5bWJvbCBpbmZvIHRoYXQgaXMgaW4gdGhlIHByb2dyYW0KKyAgICAgYmVpbmcgbG9hZGVkLiAgTm90ZSB0aGF0IHdlIGFzc3VtZSB0aGF0IHRoZSBwcm9ncmFtIGlzIHRoZWBgbWFpbmxpbmUnJzsKKyAgICAgaWYgdGhpcyBpcyBub3QgYWx3YXlzIHRydWUsIHRoZW4gdGhpcyBjb2RlIHdpbGwgbmVlZCB0byBiZSBhdWdtZW50ZWQuICAqLworICBzeW1ib2xfZmlsZV9hZGQgKHN0cnRvayAoYXJncywgIiBcdCIpLCBmcm9tX3R0eSwgMCwgMSwgMCwgMCwgMCwgMCk7CisKKyAgLyogR2V0dGluZyBuZXcgc3ltYm9scyBtYXkgY2hhbmdlIG91ciBvcGluaW9uIGFib3V0IHdoYXQgaXMKKyAgICAgZnJhbWVsZXNzLiAgKi8KKyAgcmVpbml0X2ZyYW1lX2NhY2hlICgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9XUklURV9JTkZFUklPUl9NRU1PUlkKKyoqIENvcHkgTEVOIGJ5dGVzIG9mIGRhdGEgZnJvbSBkZWJ1Z2dlciBtZW1vcnkgYXQgTVlBRERSCisgICB0byBpbmZlcmlvcidzIG1lbW9yeSBhdCBNRU1BRERSLiAgUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gICovCitzdGF0aWMgaW50Cit1ZGlfd3JpdGVfaW5mZXJpb3JfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaW50CQlud3JpdHRlbiA9IDA7CisgIFVESVVJbnQzMgkqRnJvbTsKKyAgVURJUmVzb3VyY2UJVG87CisgIFVESUNvdW50CUNvdW50OworICBVRElTaXplVAlTaXplID0gMTsKKyAgVURJQ291bnQJQ291bnREb25lID0gMDsKKyAgVURJQm9vbAlIb3N0RW5kaWFuID0gMDsKKyAgCisgIFRvLlNwYWNlID0gdWRpX21lbW9yeV9zcGFjZShtZW1hZGRyKTsKKyAgRnJvbSA9IChVRElVSW50MzIqKW15YWRkcjsKKworICB3aGlsZSAobndyaXR0ZW4gPCBsZW4pCisgIHsJQ291bnQgPSBsZW4gLSBud3JpdHRlbjsKKwlpZiAoQ291bnQgPiBNQVhEQVRBKSBDb3VudCA9IE1BWERBVEE7CisgIAlUby5PZmZzZXQgPSBtZW1hZGRyICsgbndyaXR0ZW47CisgICAgICAgIGlmKFVESVdyaXRlKEZyb20sIFRvLCBDb3VudCwgU2l6ZSwgJkNvdW50RG9uZSwgSG9zdEVuZGlhbikpCisgICAgCXsgIGVycm9yKCJVRElXcml0ZSgpIGZhaWxlZCBpbiB1ZGlfd3JpdGVfaW5mZXJpb3JfbWVtb3J5Iik7CisJICAgYnJlYWs7CQorCX0KKwllbHNlCisgIAl7ICBud3JpdHRlbiArPSBDb3VudERvbmU7CisJICAgRnJvbSArPSBDb3VudERvbmU7CisJfQorICB9CisgIHJldHVybihud3JpdHRlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVESV9SRUFEX0lORkVSSU9SX01FTU9SWQorKiogUmVhZCBMRU4gYnl0ZXMgZnJvbSBpbmZlcmlvciBtZW1vcnkgYXQgTUVNQUREUi4gIFB1dCB0aGUgcmVzdWx0CisgICBhdCBkZWJ1Z2dlciBhZGRyZXNzIE1ZQUREUi4gIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICAqLworc3RhdGljIGludAordWRpX3JlYWRfaW5mZXJpb3JfbWVtb3J5KG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICBpbnQJCW5yZWFkID0gMDsKKyAgVURJUmVzb3VyY2UJRnJvbTsKKyAgVURJVUludDMyCSpUbzsKKyAgVURJQ291bnQJQ291bnQ7CisgIFVESVNpemVUCVNpemUgPSAxOworICBVRElDb3VudAlDb3VudERvbmUgPSAwOworICBVRElCb29sCUhvc3RFbmRpYW4gPSAwOworICBVRElFcnJvcgllcnI7CisgIAorICBGcm9tLlNwYWNlID0gdWRpX21lbW9yeV9zcGFjZShtZW1hZGRyKTsJCisgIFRvID0gKFVESVVJbnQzMiopbXlhZGRyOworCisgIHdoaWxlIChucmVhZCA8IGxlbikKKyAgewlDb3VudCA9IGxlbiAtIG5yZWFkOworCWlmIChDb3VudCA+IE1BWERBVEEpIENvdW50ID0gTUFYREFUQTsKKyAgCUZyb20uT2Zmc2V0ID0gbWVtYWRkciArIG5yZWFkOworICAgICAgICBpZihlcnIgPSBVRElSZWFkKEZyb20sIFRvLCBDb3VudCwgU2l6ZSwgJkNvdW50RG9uZSwgSG9zdEVuZGlhbikpCisgICAgCXsgIGVycm9yKCJVRElSZWFkKCkgZmFpbGVkIGluIHVkaV9yZWFkX2luZmVyaW9yX21lbW9yeSIpOworCSAgIGJyZWFrOwkKKwl9CisJZWxzZQorICAJeyAgbnJlYWQgKz0gQ291bnREb25lOworCSAgIFRvICs9IENvdW50RG9uZTsKKwl9CisgIH0KKyAgcmV0dXJuKG5yZWFkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBXQVJOSU5HCisqLwordWRpX3dhcm5pbmcobnVtKQoraW50CW51bTsKK3sKKyAgICBlcnJvciAoIkVSUk9SIHdoaWxlIGxvYWRpbmcgcHJvZ3JhbSBpbnRvIHJlbW90ZSBUSVA6ICRkXG4iLCBudW0pOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCisvKiBGZXRjaCBhIHNpbmdsZSByZWdpc3RlciBpbmRpY2F0YXRlZCBieSAncmVnbm8nLiAKKyAqIFJldHVybnMgMC8tMSBvbiBzdWNjZXNzL2ZhaWx1cmUuICAKKyAqLworc3RhdGljIHZvaWQKK2ZldGNoX3JlZ2lzdGVyIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBVRElSZXNvdXJjZQlGcm9tOworICBVRElVSW50MzIJVG87CisgIFVESUNvdW50CUNvdW50ID0gMTsKKyAgVURJU2l6ZVQJU2l6ZSA9IDQ7CisgIFVESUNvdW50CUNvdW50RG9uZTsKKyAgVURJQm9vbAlIb3N0RW5kaWFuID0gMDsKKyAgVURJRXJyb3IJZXJyOworICBpbnQgIAkJcmVzdWx0OworCisgIGlmIChyZWdubyA9PSBHUjFfUkVHTlVNKQorICAgIHsKKyAgICAgIEZyb20uU3BhY2UgPSBVREkyOUtHbG9iYWxSZWdzOworICAgICAgRnJvbS5PZmZzZXQgPSAxOworICAgIH0KKyAgZWxzZSBpZiAocmVnbm8gPj0gR1I5Nl9SRUdOVU0gJiYgcmVnbm8gPCBHUjk2X1JFR05VTSArIDMyKQorICAgIHsKKyAgICAgIEZyb20uU3BhY2UgPSBVREkyOUtHbG9iYWxSZWdzOworICAgICAgRnJvbS5PZmZzZXQgPSAocmVnbm8gLSBHUjk2X1JFR05VTSkgKyA5Njs7CisgICAgfQorCisjaWYgZGVmaW5lZChHUjY0X1JFR05VTSkKKworICBlbHNlIGlmIChyZWdubyA+PSBHUjY0X1JFR05VTSAmJiByZWdubyA8IEdSNjRfUkVHTlVNICsgMzIgKQorICAgIHsKKyAgICAgIEZyb20uU3BhY2UgPSBVREkyOUtHbG9iYWxSZWdzOworICAgICAgRnJvbS5PZmZzZXQgPSAocmVnbm8gLSBHUjY0X1JFR05VTSkgKyA2NDsKKyAgICB9CisKKyNlbmRpZgkvKiBHUjY0X1JFR05VTSAqLworCisgIGVsc2UgaWYgKHJlZ25vID49IExSMF9SRUdOVU0gJiYgcmVnbm8gPCBMUjBfUkVHTlVNICsgMTI4KQorICAgIHsKKyAgICAgIEZyb20uU3BhY2UgPSBVREkyOUtMb2NhbFJlZ3M7CisgICAgICBGcm9tLk9mZnNldCA9IChyZWdubyAtIExSMF9SRUdOVU0pOworICAgIH0KKyAgZWxzZSBpZiAocmVnbm8+PUZQRV9SRUdOVU0gJiYgcmVnbm88PUVYT19SRUdOVU0pICAKKyAgICB7CisgICAgICBpbnQgdmFsID0gLTE7CisgICAgICAvKnN1cHBseV9yZWdpc3RlcigxNjAgKyAocmVnbm8gLSBGUEVfUkVHTlVNKSwoY2hhciAqKSAmdmFsKTsqLworICAgICAgc3VwcGx5X3JlZ2lzdGVyKHJlZ25vLCAoY2hhciAqKSAmdmFsKTsKKyAgICAgIHJldHVybjsJCS8qIFByZXRlbmQgU3VjY2VzcyAqLworICAgIH0KKyAgZWxzZSAKKyAgICB7CisgICAgICBGcm9tLlNwYWNlID0gVURJMjlLU3BlY2lhbFJlZ3M7CisgICAgICBGcm9tLk9mZnNldCA9IHJlZ251bV90b19zcm51bShyZWdubyk7IAorICAgIH0KKworICBpZiAoZXJyID0gVURJUmVhZChGcm9tLCAmVG8sIENvdW50LCBTaXplLCAmQ291bnREb25lLCBIb3N0RW5kaWFuKSkKKyAgICBlcnJvcigiVURJUmVhZCgpIGZhaWxlZCBpbiB1ZGlfZmV0Y2hfcmVnaXN0ZXJzIik7CisKKyAgc3VwcGx5X3JlZ2lzdGVyKHJlZ25vLCAoY2hhciAqKSAmVG8pOworCisgIGlmIChyZW1vdGVfZGVidWcpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQoIkZldGNoaW5nIHJlZ2lzdGVyICVzID0gMHgleFxuIiwgUkVHSVNURVJfTkFNRSAocmVnbm8pLCBUbyk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAorLyogU3RvcmUgYSBzaW5nbGUgcmVnaXN0ZXIgaW5kaWNhdGVkIGJ5ICdyZWdubycuIAorICogUmV0dXJucyAwLy0xIG9uIHN1Y2Nlc3MvZmFpbHVyZS4gIAorICovCitzdGF0aWMgaW50CitzdG9yZV9yZWdpc3RlciAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgaW50ICAJCXJlc3VsdDsKKyAgVURJVUludDMyCUZyb207CisgIFVESVJlc291cmNlCVRvOworICBVRElDb3VudAlDb3VudCA9IDE7CisgIFVESVNpemVUCVNpemUgPSA0OworICBVRElDb3VudAlDb3VudERvbmU7CisgIFVESUJvb2wJSG9zdEVuZGlhbiA9IDA7CisKKyAgRnJvbSA9ICByZWFkX3JlZ2lzdGVyIChyZWdubyk7CS8qIGdldCBkYXRhIHZhbHVlICovCisKKyAgaWYgKHJlbW90ZV9kZWJ1ZykKKyAgICBwcmludGZfdW5maWx0ZXJlZCgiU3RvcmluZyByZWdpc3RlciAlcyA9IDB4JXhcbiIsIFJFR0lTVEVSX05BTUUgKHJlZ25vKSwgRnJvbSk7CisKKyAgaWYgKHJlZ25vID09IEdSMV9SRUdOVU0pCisgICAgeworICAgICAgVG8uU3BhY2UgPSBVREkyOUtHbG9iYWxSZWdzOworICAgICAgVG8uT2Zmc2V0ID0gMTsKKyAgICAgIHJlc3VsdCA9IFVESVdyaXRlKCZGcm9tLCBUbywgQ291bnQsIFNpemUsICZDb3VudERvbmUsIEhvc3RFbmRpYW4pOworICAgICAgLyogU2V0dGluZyBHUjEgY2hhbmdlcyB0aGUgbnVtYmVycyBvZiBhbGwgdGhlIGxvY2Fscywgc28gaW52YWxpZGF0ZSB0aGUgCisgICAgICAgKiByZWdpc3RlciBjYWNoZS4gIERvIHRoaXMgKmFmdGVyKiBjYWxsaW5nIHJlYWRfcmVnaXN0ZXIsIGJlY2F1c2Ugd2Ugd2FudCAKKyAgICAgICAqIHJlYWRfcmVnaXN0ZXIgdG8gcmV0dXJuIHRoZSB2YWx1ZSB0aGF0IHdyaXRlX3JlZ2lzdGVyIGhhcyBqdXN0IHN0dWZmZWQgCisgICAgICAgKiBpbnRvIHRoZSByZWdpc3RlcnMgYXJyYXksIG5vdCB0aGUgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyIGZldGNoZWQgZnJvbSAKKyAgICAgICAqIHRoZSBpbmZlcmlvci4gIAorICAgICAgICovCisgICAgICByZWdpc3RlcnNfY2hhbmdlZCAoKTsKKyAgICB9CisjaWYgZGVmaW5lZChHUjY0X1JFR05VTSkKKyAgZWxzZSBpZiAocmVnbm8gPj0gR1I2NF9SRUdOVU0gJiYgcmVnbm8gPCBHUjY0X1JFR05VTSArIDMyICkKKyAgICB7CisgICAgICBUby5TcGFjZSA9IFVESTI5S0dsb2JhbFJlZ3M7CisgICAgICBUby5PZmZzZXQgPSAocmVnbm8gLSBHUjY0X1JFR05VTSkgKyA2NDsKKyAgICAgIHJlc3VsdCA9IFVESVdyaXRlKCZGcm9tLCBUbywgQ291bnQsIFNpemUsICZDb3VudERvbmUsIEhvc3RFbmRpYW4pOworICAgIH0KKyNlbmRpZgkvKiBHUjY0X1JFR05VTSAqLworICBlbHNlIGlmIChyZWdubyA+PSBHUjk2X1JFR05VTSAmJiByZWdubyA8IEdSOTZfUkVHTlVNICsgMzIpCisgICAgeworICAgICAgVG8uU3BhY2UgPSBVREkyOUtHbG9iYWxSZWdzOworICAgICAgVG8uT2Zmc2V0ID0gKHJlZ25vIC0gR1I5Nl9SRUdOVU0pICsgOTY7CisgICAgICByZXN1bHQgPSBVRElXcml0ZSgmRnJvbSwgVG8sIENvdW50LCBTaXplLCAmQ291bnREb25lLCBIb3N0RW5kaWFuKTsKKyAgICB9CisgIGVsc2UgaWYgKHJlZ25vID49IExSMF9SRUdOVU0gJiYgcmVnbm8gPCBMUjBfUkVHTlVNICsgMTI4KQorICAgIHsKKyAgICAgIFRvLlNwYWNlID0gVURJMjlLTG9jYWxSZWdzOworICAgICAgVG8uT2Zmc2V0ID0gKHJlZ25vIC0gTFIwX1JFR05VTSk7CisgICAgICByZXN1bHQgPSBVRElXcml0ZSgmRnJvbSwgVG8sIENvdW50LCBTaXplLCAmQ291bnREb25lLCBIb3N0RW5kaWFuKTsKKyAgICB9CisgIGVsc2UgaWYgKHJlZ25vID49IEZQRV9SRUdOVU0gJiYgcmVnbm8gPD0gRVhPX1JFR05VTSkgIAorICAgIHJldHVybiAwOwkJLyogUHJldGVuZCBTdWNjZXNzICovCisgIGVsc2UgaWYgKHJlZ25vID09IFBDX1JFR05VTSkKKyAgICB7ICAgIAorICAgICAgLyogUEMxIHZpYSBVREkyOUtQQyAqLworCisgICAgICBUby5TcGFjZSA9IFVESTI5S1BDOworICAgICAgVG8uT2Zmc2V0ID0gMDsJCS8qIFBDMSAqLworICAgICAgcmVzdWx0ID0gVURJV3JpdGUgKCZGcm9tLCBUbywgQ291bnQsIFNpemUsICZDb3VudERvbmUsIEhvc3RFbmRpYW4pOworCisgICAgICAvKiBXcml0aW5nIHRvIHRoaXMgbG9jIGFjdHVhbGx5IGNoYW5nZXMgdGhlIHZhbHVlcyBvZiBwYzAgJiBwYzEgKi8KKworICAgICAgcmVnaXN0ZXJfdmFsaWRbUENfUkVHTlVNXSA9IDA7IC8qIHBjMSAqLworICAgICAgcmVnaXN0ZXJfdmFsaWRbTlBDX1JFR05VTV0gPSAwOyAvKiBwYzAgKi8KKyAgICB9CisgIGVsc2UgCS8qIEFuIHVucHJvdGVjdGVkIG9yIHByb3RlY3RlZCBzcGVjaWFsIHJlZ2lzdGVyICovCisgICAgeworICAgICAgVG8uU3BhY2UgPSBVREkyOUtTcGVjaWFsUmVnczsKKyAgICAgIFRvLk9mZnNldCA9IHJlZ251bV90b19zcm51bShyZWdubyk7IAorICAgICAgcmVzdWx0ID0gVURJV3JpdGUoJkZyb20sIFRvLCBDb3VudCwgU2l6ZSwgJkNvdW50RG9uZSwgSG9zdEVuZGlhbik7CisgICAgfQorCisgIGlmIChyZXN1bHQgIT0gMCkKKyAgICBlcnJvcigiVURJV3JpdGUoKSBmYWlsZWQgaW4gc3RvcmVfcmVnaXN0ZXJzIik7CisKKyAgcmV0dXJuIDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBSRUdOVU1fVE9fU1JOVU0gKi8KKy8qIAorICogQ29udmVydCBhIGdkYiBzcGVjaWFsIHJlZ2lzdGVyIG51bWJlciB0byBhIDI5MDAwIHNwZWNpYWwgcmVnaXN0ZXIgbnVtYmVyLgorICovCitzdGF0aWMgaW50CityZWdudW1fdG9fc3JudW0ocmVnbm8pCitpbnQJcmVnbm87Cit7CisJc3dpdGNoKHJlZ25vKSB7CisJCWNhc2UgVkFCX1JFR05VTTogcmV0dXJuKDApOyAKKwkJY2FzZSBPUFNfUkVHTlVNOiByZXR1cm4oMSk7IAorCQljYXNlIENQU19SRUdOVU06IHJldHVybigyKTsgCisJCWNhc2UgQ0ZHX1JFR05VTTogcmV0dXJuKDMpOyAKKwkJY2FzZSBDSEFfUkVHTlVNOiByZXR1cm4oNCk7IAorCQljYXNlIENIRF9SRUdOVU06IHJldHVybig1KTsgCisJCWNhc2UgQ0hDX1JFR05VTTogcmV0dXJuKDYpOyAKKwkJY2FzZSBSQlBfUkVHTlVNOiByZXR1cm4oNyk7IAorCQljYXNlIFRNQ19SRUdOVU06IHJldHVybig4KTsgCisJCWNhc2UgVE1SX1JFR05VTTogcmV0dXJuKDkpOyAKKwkJY2FzZSBOUENfUkVHTlVNOiByZXR1cm4oVVNFX1NIQURPV19QQyA/ICgyMCkgOiAoMTApKTsKKwkJY2FzZSBQQ19SRUdOVU06ICByZXR1cm4oVVNFX1NIQURPV19QQyA/ICgyMSkgOiAoMTEpKTsKKwkJY2FzZSBQQzJfUkVHTlVNOiByZXR1cm4oVVNFX1NIQURPV19QQyA/ICgyMikgOiAoMTIpKTsKKwkJY2FzZSBNTVVfUkVHTlVNOiByZXR1cm4oMTMpOyAKKwkJY2FzZSBMUlVfUkVHTlVNOiByZXR1cm4oMTQpOyAKKwkJY2FzZSBJUENfUkVHTlVNOiByZXR1cm4oMTI4KTsgCisJCWNhc2UgSVBBX1JFR05VTTogcmV0dXJuKDEyOSk7IAorCQljYXNlIElQQl9SRUdOVU06IHJldHVybigxMzApOyAKKwkJY2FzZSBRX1JFR05VTTogICByZXR1cm4oMTMxKTsgCisJCWNhc2UgQUxVX1JFR05VTTogcmV0dXJuKDEzMik7IAorCQljYXNlIEJQX1JFR05VTTogIHJldHVybigxMzMpOyAKKwkJY2FzZSBGQ19SRUdOVU06ICByZXR1cm4oMTM0KTsgCisJCWNhc2UgQ1JfUkVHTlVNOiAgcmV0dXJuKDEzNSk7IAorCQljYXNlIEZQRV9SRUdOVU06IHJldHVybigxNjApOyAKKwkJY2FzZSBJTlRFX1JFR05VTTogcmV0dXJuKDE2MSk7IAorCQljYXNlIEZQU19SRUdOVU06IHJldHVybigxNjIpOyAKKwkJY2FzZSBFWE9fUkVHTlVNOnJldHVybigxNjQpOyAKKwkJZGVmYXVsdDoKKwkJCXJldHVybigyNTUpOwkvKiBGYWlsdXJlID8gKi8KKwl9Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBEZXRlcm1pbmUgdGhlIFRhcmdldCBtZW1vcnkgc3BhY2UgcXVhbGlmaWVyIGJhc2VkIG9uIHRoZSBhZGRyLiAKKyAqIEZJWE1FOiBDYW4ndCBkaXN0aW5ndWlzIElfUk9NL0RfUk9NLiAgCisgKiBGSVhNRTogRG9lc24ndCBrbm93IGFueXRoaW5nIGFib3V0IElfQ0FDSEUvRF9DQUNIRS4KKyAqLworc3RhdGljIENQVVNwYWNlCit1ZGlfbWVtb3J5X3NwYWNlKGFkZHIpCitDT1JFX0FERFIJYWRkcjsKK3sKKwlVRElVSW50MzIgdHN0YXJ0ID0gSU1lbVN0YXJ0OworCVVESVVJbnQzMiB0ZW5kICAgPSB0c3RhcnQgKyBJTWVtU2l6ZTsgIAorCVVESVVJbnQzMiBkc3RhcnQgPSBETWVtU3RhcnQ7CisJVURJVUludDMyIGRlbmQgICA9IHRzdGFydCArIERNZW1TaXplOyAgCisJVURJVUludDMyIHJzdGFydCA9IFJNZW1TdGFydDsKKwlVRElVSW50MzIgcmVuZCAgID0gdHN0YXJ0ICsgUk1lbVNpemU7ICAKKworCWlmICgoKFVESVVJbnQzMilhZGRyID49IHRzdGFydCkgJiYgKChVRElVSW50MzIpYWRkciA8IHRlbmQpKSB7IAorCQlyZXR1cm4gVURJMjlLSVJBTVNwYWNlOworCX0gZWxzZSBpZiAoKChVRElVSW50MzIpYWRkciA+PSBkc3RhcnQpICYmICgoVURJVUludDMyKWFkZHIgPCBkZW5kKSkgeyAKKwkJcmV0dXJuIFVESTI5S0RSQU1TcGFjZTsKKwl9IGVsc2UgaWYgKCgoVURJVUludDMyKWFkZHIgPj0gcnN0YXJ0KSAmJiAoKFVESVVJbnQzMilhZGRyIDwgcmVuZCkpIHsKKwkJLyogRklYTUU6IGhvdyBkbyB3ZSBkZXRlcm1pbmUgYmV0d2VlbiBEX1JPTSBhbmQgSV9ST00gKi8KKwkJcmV0dXJuIFVESTI5S0lST01TcGFjZTsKKwl9IGVsc2UJLyogRklYTUU6IHdoYXQgZG8gbWUgZG8gbm93PyAqLworCQlyZXR1cm4gVURJMjlLRFJBTVNwYWNlOwkvKiBIbW1tISAqLworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNUVUJTCisqLworCit2b2lkICBjb252ZXJ0MTYoKSB7O30KK3ZvaWQgIGNvbnZlcnQzMigpIHs7fQorR0RCX0ZJTEUgKiBFY2hvRmlsZSA9IDA7CQkvKiB1c2VkIGZvciBkZWJ1Z2dpbmcgKi8KK2ludCAgIFF1aWV0TW9kZSA9IDA7CQkvKiB1c2VkIGZvciBkZWJ1Z2dpbmcgKi8KKwwKKyNpZmRlZiBOT19ISUZfU1VQUE9SVAorc2VydmljZV9ISUYobXNnKQorICAgICB1bmlvbiBtc2dfdCAqbXNnOworeworICByZXR1cm4oMCk7CQkJLyogRW11bGF0ZSBhIGZhaWx1cmUgKi8KK30KKyNlbmRpZgorDAorLyogVGFyZ2V0X29wcyB2ZWN0b3IuICBOb3Qgc3RhdGljIGJlY2F1c2UgdGhlcmUgZG9lcyBub3Qgc2VlbSB0byBiZQorICAgYW55IHBvcnRhYmxlIHdheSB0byBkbyBhIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgYSBzdGF0aWMgdmFyaWFibGUuCisgICBUaGUgUlMvNjAwMCBkb2Vzbid0IGxpa2UgImV4dGVybiIgZm9sbG93ZWQgYnkgInN0YXRpYyI7IFN1bk9TCisgICAvYmluL2NjIGRvZXNuJ3QgbGlrZSAic3RhdGljIiB0d2ljZS4gICovCisKK3N0cnVjdCB0YXJnZXRfb3BzIHVkaV9vcHM7CisKK3N0YXRpYyB2b2lkIAoraW5pdF91ZGlfb3BzKHZvaWQpCit7CisgIHVkaV9vcHMudG9fc2hvcnRuYW1lID0gICAgICAgICAidWRpIjsKKyAgdWRpX29wcy50b19sb25nbmFtZSA9IAkiUmVtb3RlIFVESSBjb25uZWN0ZWQgVElQIjsKKyAgdWRpX29wcy50b19kb2MgPSAJIlJlbW90ZSBkZWJ1ZyBhbiBBTUQgMjlrIHVzaW5nIFVESSBzb2NrZXQgY29ubmVjdGlvbiB0byBUSVAgcHJvY2Vzcy5cblwKK0FyZ3VtZW50cyBhcmVcblwKK2Bjb25maWd1cmF0aW9uLWlkIEFGX0lORVQgaG9zdG5hbWUgcG9ydC1udW1iZXInXG5cCitUbyBjb25uZWN0IHZpYSB0aGUgbmV0d29yaywgd2hlcmUgaG9zdG5hbWUgYW5kIHBvcnQtbnVtYmVyIHNwZWNpZnkgdGhlXG5cCitob3N0IGFuZCBwb3J0IHdoZXJlIHlvdSBjYW4gY29ubmVjdCB2aWEgVURJLlxuXAorY29uZmlndXJhdGlvbi1pZCBpcyB1bnVzZWQuXG5cCitcblwKK2Bjb25maWd1cmF0aW9uLWlkIEFGX1VOSVggc29ja2V0LW5hbWUgdGlwLXByb2dyYW0nXG5cCitUbyBjb25uZWN0IHVzaW5nIGEgbG9jYWwgY29ubmVjdGlvbiB0byB0aGUgXCJ0aXAuZXhlXCIgcHJvZ3JhbSB3aGljaCBpc1xuXAorICAgIHN1cHBsaWVkIGJ5IEFNRC4gIElmIHNvY2tldC1uYW1lIHNwZWNpZmllcyBhbiBBRl9VTklYIHNvY2tldCB0aGVuIHRoZVxuXAorICAgIHRpcCBwcm9ncmFtIG11c3QgYWxyZWFkeSBiZSBzdGFydGVkOyBjb25uZWN0IHRvIGl0IHVzaW5nIHRoYXQgc29ja2V0LlxuXAorICAgIElmIG5vdCwgc3RhcnQgdXAgdGlwLXByb2dyYW0sIHdoaWNoIHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgdGlwXG5cCisgICAgcHJvZ3JhbS4gIElmIGFwcHJvcHJpYXRlLCB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZWFyY2hlZC5cblwKKyAgICBjb25maWd1cmF0aW9uLWlkIGlzIHVudXNlZC5cblwKK1xuXAorYGNvbmZpZ3VyYXRpb24taWQnXG5cCisgICAgTG9vayB1cCB0aGUgY29uZmlndXJhdGlvbiBpbiAuL3VkaV9zb2Mgb3IgL2V0Yy91ZGlfc29jLCB3aGljaFxuXAorICAgIGFyZSBmaWxlcyBjb250YWluaW5nIGxpbmVzIGluIHRoZSBhYm92ZSBmb3JtYXRzLiAgY29uZmlndXJhdGlvbi1pZCBpc1xuXAorICAgIHVzZWQgdG8gcGljayB3aGljaCBsaW5lIG9mIHRoZSBmaWxlIHRvIHVzZS4iIDsKKyAgdWRpX29wcy50b19vcGVuID0gICAgICAgICB1ZGlfb3BlbjsKKyAgdWRpX29wcy50b19jbG9zZSA9IAl1ZGlfY2xvc2U7CisgIHVkaV9vcHMudG9fYXR0YWNoID0gICAgICAgICB1ZGlfYXR0YWNoOworICB1ZGlfb3BzLnRvX2RldGFjaCA9IAl1ZGlfZGV0YWNoOworICB1ZGlfb3BzLnRvX3Jlc3VtZSA9IAl1ZGlfcmVzdW1lOworICB1ZGlfb3BzLnRvX3dhaXQgID0gCXVkaV93YWl0OworICB1ZGlfb3BzLnRvX2ZldGNoX3JlZ2lzdGVycyAgPSAgICAgICAgIHVkaV9mZXRjaF9yZWdpc3RlcnM7CisgIHVkaV9vcHMudG9fc3RvcmVfcmVnaXN0ZXJzICA9IAl1ZGlfc3RvcmVfcmVnaXN0ZXJzOworICB1ZGlfb3BzLnRvX3ByZXBhcmVfdG9fc3RvcmUgPSAgICAgICAgIHVkaV9wcmVwYXJlX3RvX3N0b3JlOworICB1ZGlfb3BzLnRvX3hmZXJfbWVtb3J5ICA9ICAgICAgICAgdWRpX3hmZXJfaW5mZXJpb3JfbWVtb3J5OworICB1ZGlfb3BzLnRvX2ZpbGVzX2luZm8gID0gICAgICAgICB1ZGlfZmlsZXNfaW5mbzsKKyAgdWRpX29wcy50b19pbnNlcnRfYnJlYWtwb2ludCA9ICAgICAgICAgdWRpX2luc2VydF9icmVha3BvaW50OworICB1ZGlfb3BzLnRvX3JlbW92ZV9icmVha3BvaW50ID0gCXVkaV9yZW1vdmVfYnJlYWtwb2ludDsKKyAgdWRpX29wcy50b190ZXJtaW5hbF9pbml0ICA9ICAgICAgICAgMDsJCQorICB1ZGlfb3BzLnRvX3Rlcm1pbmFsX2luZmVyaW9yID0gCTA7CQkKKyAgdWRpX29wcy50b190ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgPSAJMDsKKyAgdWRpX29wcy50b190ZXJtaW5hbF9vdXJzICA9IAkwOwkKKyAgdWRpX29wcy50b190ZXJtaW5hbF9pbmZvICA9IAkwOwkKKyAgdWRpX29wcy50b19raWxsICA9ICAgICAgICAgdWRpX2tpbGw7ICAKKyAgdWRpX29wcy50b19sb2FkICA9ICAgICAgICAgdWRpX2xvYWQ7CQorICB1ZGlfb3BzLnRvX2xvb2t1cF9zeW1ib2wgPSAgICAgICAgIDA7IAorICB1ZGlfb3BzLnRvX2NyZWF0ZV9pbmZlcmlvciA9ICAgICAgICAgdWRpX2NyZWF0ZV9pbmZlcmlvcjsKKyAgdWRpX29wcy50b19tb3Vybl9pbmZlcmlvciA9ICAgICAgICAgdWRpX21vdXJuOworICB1ZGlfb3BzLnRvX2Nhbl9ydW4gID0gCTA7CQorICB1ZGlfb3BzLnRvX25vdGljZV9zaWduYWxzID0gCTA7CQorICB1ZGlfb3BzLnRvX3RocmVhZF9hbGl2ZSAgPSAJMDsJCisgIHVkaV9vcHMudG9fc3RvcCAgPSAgICAgICAgIDA7CisgIHVkaV9vcHMudG9fc3RyYXR1bSA9ICAgICAgICAgcHJvY2Vzc19zdHJhdHVtOworICB1ZGlfb3BzLkRPTlRfVVNFID0gCTA7CQkKKyAgdWRpX29wcy50b19oYXNfYWxsX21lbW9yeSA9ICAgICAgICAgMTsKKyAgdWRpX29wcy50b19oYXNfbWVtb3J5ID0gCTE7CQorICB1ZGlfb3BzLnRvX2hhc19zdGFjayA9IAkxOwkKKyAgdWRpX29wcy50b19oYXNfcmVnaXN0ZXJzID0gCTE7CQorICB1ZGlfb3BzLnRvX2hhc19leGVjdXRpb24gPSAJMTsJCisgIHVkaV9vcHMudG9fc2VjdGlvbnMgPSAJMDsJCisgIHVkaV9vcHMudG9fc2VjdGlvbnNfZW5kID0gCTA7CQorICB1ZGlfb3BzLnRvX21hZ2ljID0gCU9QU19NQUdJQzsKK307CisKK3ZvaWQKK19pbml0aWFsaXplX3JlbW90ZV91ZGkgKCkKK3sKKyAgaW5pdF91ZGlfb3BzKCkgOworICBhZGRfdGFyZ2V0ICgmdWRpX29wcyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvcmVtb3RlLXV0aWxzLmMgYi9nZGIvcmVtb3RlLXV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxOTI1NQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZW1vdGUtdXRpbHMuYwpAQCAtMCwwICsxLDY1NCBAQAorLyogR2VuZXJpYyBzdXBwb3J0IGZvciByZW1vdGUgZGVidWdnaW5nIGludGVyZmFjZXMuCisKKyAgIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qICBUaGlzIGZpbGUgYWN0dWFsbHkgY29udGFpbnMgdHdvIGRpc3RpbmN0IGxvZ2ljYWwgInBhY2thZ2VzIi4gIFRoZXkKKyAgICBhcmUgcGFja2FnZWQgdG9nZXRoZXIgaW4gdGhpcyBvbmUgZmlsZSBiZWNhdXNlIHRoZXkgYXJlIHR5cGljYWxseQorICAgIHVzZWQgdG9nZXRoZXIuCisKKyAgICBUaGUgZmlyc3QgcGFja2FnZSBpcyBhbiBhZGRpdGlvbiB0byB0aGUgc2VyaWFsIHBhY2thZ2UuICBUaGUKKyAgICBhZGRpdGlvbiBwcm92aWRlcyByZWFkaW5nIGFuZCB3cml0aW5nIHdpdGggZGVidWdnaW5nIG91dHB1dCBhbmQKKyAgICB0aW1lb3V0cyBiYXNlZCBvbiB1c2VyIHNldHRhYmxlIHZhcmlhYmxlcy4gIFRoZXNlIHJvdXRpbmVzIGFyZQorICAgIGludGVuZGVkIHRvIHN1cHBvcnQgc2VyaWFsIHBvcnQgYmFzZWQgcmVtb3RlIGJhY2tlbmRzLiAgVGhlc2UKKyAgICBmdW5jdGlvbnMgYXJlIHByZWZpeGVkIHdpdGggc3JfLgorCisgICAgVGhlIHNlY29uZCBwYWNrYWdlIGlzIGEgY29sbGVjdGlvbiBvZiBtb3JlIG9yIGxlc3MgZ2VuZXJpYworICAgIGZ1bmN0aW9ucyBmb3IgdXNlIGJ5IHJlbW90ZSBiYWNrZW5kcy4gIFRoZXkgc3VwcG9ydCB1c2VyIHNldHRhYmxlCisgICAgdmFyaWFibGVzIGZvciBkZWJ1Z2dpbmcsIHJldHJpZXMsIGFuZCB0aGUgbGlrZS4gIAorCisgICBUb2RvOgorCisgICAqIGEgcGFzcyB0aHJvdWdoIG1vZGUgYSBsYSBrZXJtaXQgb3IgdGVsbmV0LgorICAgKiBhdXRvYmF1ZC4KKyAgICogYXNrIHJlbW90ZSB0byBjaGFuZ2UgaGlzIGJhdWQgcmF0ZS4KKyAgICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJzZXJpYWwuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiIC8qIGZvciBleGVjX2JmZCAqLworI2luY2x1ZGUgImluZmVyaW9yLmgiIC8qIGZvciBnZW5lcmljX21vdXJuX2luZmVyaW9yICovCisjaW5jbHVkZSAicmVtb3RlLXV0aWxzLmgiCisKKwordm9pZCBfaW5pdGlhbGl6ZV9zcl9zdXBwb3J0IFBBUkFNUyAoKHZvaWQpKTsKKworc3RydWN0IF9zcl9zZXR0aW5ncyBzcl9zZXR0aW5ncyA9IHsKKyAgNCwgLyogdGltZW91dDoKKwlyZW1vdGUtaG1zLmMgaGFkIDIKKwlyZW1vdGUtYnVnLmMgaGFkICJ3aXRoIGEgdGltZW91dCBvZiAyLCB3ZSB0aW1lIG91dCB3YWl0aW5nIGZvcgorCXRoZSBwcm9tcHQgYWZ0ZXIgYW4gcy1yZWNvcmQgZHVtcC4iCisKKwlyZW1vdGUuYyBoYWQgKDIpOiBUaGlzIHdhcyA1IHNlY29uZHMsIHdoaWNoIGlzIGEgbG9uZyB0aW1lIHRvCisJc2l0IGFuZCB3YWl0LiBVbmxlc3MgdGhpcyBpcyBnb2luZyB0aG91Z2ggc29tZSB0ZXJtaW5hbCBzZXJ2ZXIKKwlvciBtdWx0aXBsZXhlciBvciBvdGhlciBmb3JtIG9mIGhhaXJ5IHNlcmlhbCBjb25uZWN0aW9uLCBJCisJd291bGQgdGhpbmsgMiBzZWNvbmRzIHdvdWxkIGJlIHBsZW50eS4KKyovCisKKyAgMTAsIC8qIHJldHJpZXMgKi8KKyAgTlVMTCwJLyogZGV2aWNlICovCisgIE5VTEwsCS8qIGRlc2NyaXB0b3IgKi8KK307CisKK3N0cnVjdCBncl9zZXR0aW5ncyAqZ3Jfc2V0dGluZ3MgPSBOVUxMOworCitzdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChjaGFyICosIGNoYXIgKikpOworc3RhdGljIHZvaWQgc3JfY29tIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCit1c2FnZShwcm90bywganVuaykKKyAgICAgY2hhciAqcHJvdG87CisgICAgIGNoYXIgKmp1bms7Cit7CisgIGlmIChqdW5rICE9IE5VTEwpCisgICAgZnByaW50Zl91bmZpbHRlcmVkKGdkYl9zdGRlcnIsICJVbnJlY29nbml6ZWQgYXJndW1lbnRzOiBgJXMnLlxuIiwganVuayk7CisKKyAgZXJyb3IgKCJVc2FnZTogdGFyZ2V0ICVzIFtERVZJQ0UgW1NQRUVEIFtERUJVR11dXVxuXAord2hlcmUgREVWSUNFIGlzIHRoZSBuYW1lIG9mIGEgZGV2aWNlIG9yIEhPU1Q6UE9SVCIsIHByb3RvLCBwcm90byk7CisKKyAgcmV0dXJuOworfQorCisjZGVmaW5lIENIRUNLRE9ORShwLCBxKSBcCit7IFwKKyAgaWYgKHEgPT0gcCkgXAorICAgIHsgXAorICAgICAgaWYgKCpwID09ICdcMCcpIFwKKwlyZXR1cm47IFwKKyAgICAgIGVsc2UgXAorCXVzYWdlKHByb3RvLCBwKTsgXAorICAgIH0gXAorfQorCit2b2lkCitzcl9zY2FuX2FyZ3MocHJvdG8sIGFyZ3MpCisgICAgIGNoYXIgKnByb3RvOworICAgICBjaGFyICphcmdzOworeworICBpbnQgbjsKKyAgY2hhciAqcCwgKnE7CisKKyAgLyogaWYgbm8gYXJncywgdGhlbiBub3RoaW5nIHRvIGRvLiAqLworICBpZiAoYXJncyA9PSBOVUxMIHx8ICphcmdzID09ICdcMCcpCisgICAgcmV0dXJuOworCisgIC8qIHNjYW4gb2ZmIHdoaXRlIHNwYWNlLiAgKi8KKyAgZm9yIChwID0gYXJnczsgaXNzcGFjZSgqcCk7ICsrcCkgOzsKKworICAvKiBmaW5kIGVuZCBvZiBkZXZpY2UgbmFtZS4gICovCisgIGZvciAocSA9IHA7ICpxICE9ICdcMCcgJiYgIWlzc3BhY2UoKnEpOyArK3EpIDs7CisKKyAgLyogY2hlY2sgZm9yIG1pc3Npbmcgb3IgZW1wdHkgZGV2aWNlIG5hbWUuICAqLworICBDSEVDS0RPTkUocCwgcSk7CisgIHNyX3NldF9kZXZpY2Uoc2F2ZXN0cmluZyhwLCBxIC0gcCkpOworCisgIC8qIGxvb2sgZm9yIGJhdWQgcmF0ZS4gICovCisgIG4gPSBzdHJ0b2wocSwgJnAsIDEwKTsKKworICAvKiBjaGVjayBmb3IgbWlzc2luZyBvciBlbXB0eSBiYXVkIHJhdGUuICAqLworICBDSEVDS0RPTkUocCwgcSk7CisgIGJhdWRfcmF0ZSA9IG47CisKKyAgLyogbG9vayBmb3IgZGVidWcgdmFsdWUuICAqLworICBuID0gc3RydG9sKHAsICZxLCAxMCk7CisKKyAgLyogY2hlY2sgZm9yIG1pc3Npbmcgb3IgZW1wdHkgZGVidWcgdmFsdWUuICAqLworICBDSEVDS0RPTkUocCwgcSk7CisgIHNyX3NldF9kZWJ1ZyhuKTsKKworICAvKiBzY2FuIG9mZiByZW1haW5pbmcgd2hpdGUgc3BhY2UuICAqLworICBmb3IgKHAgPSBxOyBpc3NwYWNlKCpwKTsgKytwKSA7OworCisgIC8qIGlmIG5vdCBlbmQgb2Ygc3RyaW5nLCB0aGVuIHRoZXJlJ3MgdW5yZWNvZ25pemVkIGp1bmsuICovCisgIGlmICgqcCAhPSAnXDAnKQorICAgIHVzYWdlKHByb3RvLCBwKTsKKworICByZXR1cm47Cit9CisKK3ZvaWQKK2dyX2dlbmVyaWNfY2hlY2tpbigpCit7CisgIHNyX3dyaXRlX2NyKCIiKTsKKyAgZ3JfZXhwZWN0X3Byb21wdCgpOworfQorCit2b2lkCitncl9vcGVuKGFyZ3MsIGZyb21fdHR5LCBncikKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworICAgICBzdHJ1Y3QgZ3Jfc2V0dGluZ3MgKmdyOworeworICB0YXJnZXRfcHJlb3Blbihmcm9tX3R0eSk7CisgIHNyX3NjYW5fYXJncyhnci0+b3BzLT50b19zaG9ydG5hbWUsIGFyZ3MpOworICB1bnB1c2hfdGFyZ2V0KGdyLT5vcHMpOworCisgIGdyX3NldHRpbmdzID0gZ3I7CisKKyAgZ3Jfc2V0X2RjYWNoZShkY2FjaGVfaW5pdChnci0+cmVhZGZ1bmMsIGdyLT53cml0ZWZ1bmMpKTsKKworICBpZiAoc3JfZ2V0X2Rlc2MoKSAhPSBOVUxMKQorICAgIGdyX2Nsb3NlICgwKTsKKworICAvKiBJZiBubyBhcmdzIGFyZSBzcGVjaWZpZWQsIHRoZW4gd2UgdXNlIHRoZSBkZXZpY2Ugc3BlY2lmaWVkIGJ5IGEKKyAgICAgcHJldmlvdXMgY29tbWFuZCBvciAic2V0IHJlbW90ZWRldmljZSIuICBCdXQgaWYgdGhlcmUgaXMgbm8KKyAgICAgZGV2aWNlLCBiZXR0ZXIgc3RvcCBub3csIG5vdCBkdW1wIGNvcmUuICAqLworCisgIGlmIChzcl9nZXRfZGV2aWNlICgpID09IE5VTEwpCisgICAgdXNhZ2UgKGdyLT5vcHMtPnRvX3Nob3J0bmFtZSwgTlVMTCk7CisKKyAgc3Jfc2V0X2Rlc2MoU0VSSUFMX09QRU4gKHNyX2dldF9kZXZpY2UoKSkpOworICBpZiAoIXNyX2dldF9kZXNjKCkpCisgICAgcGVycm9yX3dpdGhfbmFtZSgoY2hhciAqKSBzcl9nZXRfZGV2aWNlKCkpOworCisgIGlmIChiYXVkX3JhdGUgIT0gLTEpCisgICAgeworICAgICAgaWYgKFNFUklBTF9TRVRCQVVEUkFURShzcl9nZXRfZGVzYygpLCBiYXVkX3JhdGUpICE9IDApCisJeworCSAgU0VSSUFMX0NMT1NFKHNyX2dldF9kZXNjKCkpOworCSAgcGVycm9yX3dpdGhfbmFtZShzcl9nZXRfZGV2aWNlKCkpOworCX0KKyAgICB9CisKKyAgU0VSSUFMX1JBVyAoc3JfZ2V0X2Rlc2MoKSk7CisKKyAgLyogSWYgdGhlcmUgaXMgc29tZXRoaW5nIHNpdHRpbmcgaW4gdGhlIGJ1ZmZlciB3ZSBtaWdodCB0YWtlIGl0IGFzIGEKKyAgICAgcmVzcG9uc2UgdG8gYSBjb21tYW5kLCB3aGljaCB3b3VsZCBiZSBiYWQuICAqLworICBTRVJJQUxfRkxVU0hfSU5QVVQgKHNyX2dldF9kZXNjICgpKTsKKworICAvKiBkZWZhdWx0IHJldHJpZXMgKi8KKyAgaWYgKHNyX2dldF9yZXRyaWVzKCkgPT0gMCkKKyAgICBzcl9zZXRfcmV0cmllcygxKTsKKworICAvKiBkZWZhdWx0IGNsZWFyIGJyZWFrcG9pbnQgZnVuY3Rpb24gKi8KKyAgaWYgKGdyX3NldHRpbmdzLT5jbGVhcl9hbGxfYnJlYWtwb2ludHMgPT0gTlVMTCkKKyAgICBncl9zZXR0aW5ncy0+Y2xlYXJfYWxsX2JyZWFrcG9pbnRzID0gcmVtb3ZlX2JyZWFrcG9pbnRzOworCisgIGlmIChmcm9tX3R0eSkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJSZW1vdGUgZGVidWdnaW5nIHVzaW5nIGAlcyciLCBzcl9nZXRfZGV2aWNlICgpKTsKKyAgICAgIGlmIChiYXVkX3JhdGUgIT0gLTEpCisJcHJpbnRmX2ZpbHRlcmVkICgiIGF0IGJhdWQgcmF0ZSBvZiAlZCIsCisJCQkgYmF1ZF9yYXRlKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgICAgfQorCisgIHB1c2hfdGFyZ2V0KGdyLT5vcHMpOworICBncl9jaGVja2luKCk7CisgIGdyX2NsZWFyX2FsbF9icmVha3BvaW50cyAoKTsKKyAgcmV0dXJuOworfQorCisvKiBSZWFkIGEgY2hhcmFjdGVyIGZyb20gdGhlIHJlbW90ZSBzeXN0ZW0gbWFza2luZyBpdCBkb3duIHRvIDcgYml0cworICAgYW5kIGRvaW5nIGFsbCB0aGUgZmFuY3kgdGltZW91dCBzdHVmZi4gICovCisKK2ludAorc3JfcmVhZGNoYXIgKCkKK3sKKyAgaW50IGJ1ZjsKKworICBidWYgPSBTRVJJQUxfUkVBRENIQVIgKHNyX2dldF9kZXNjKCksIHNyX2dldF90aW1lb3V0KCkpOworCisgIGlmIChidWYgPT0gU0VSSUFMX1RJTUVPVVQpCisgICAgZXJyb3IgKCJUaW1lb3V0IHJlYWRpbmcgZnJvbSByZW1vdGUgc3lzdGVtLiIpOworCisgIGlmIChzcl9nZXRfZGVidWcoKSA+IDApCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlYyIsIGJ1Zik7CisKKyAgcmV0dXJuIGJ1ZiAmIDB4N2Y7Cit9CisKK2ludAorc3JfcG9sbGNoYXIoKQoreworICBpbnQgYnVmOworCisgIGJ1ZiA9IFNFUklBTF9SRUFEQ0hBUiAoc3JfZ2V0X2Rlc2MoKSwgMCk7CisgIGlmIChidWYgPT0gU0VSSUFMX1RJTUVPVVQpCisgICAgYnVmID0gMDsKKyAgaWYgKHNyX2dldF9kZWJ1ZygpID4gMCkKKyAgICB7CisgICAgICBpZiAoYnVmKQorICAgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIiVjIiwgYnVmKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCI8ZW1wdHkgY2hhcmFjdGVyIHBvbGw+Iik7CisgICAgfQorCisgIHJldHVybiBidWYgJiAweDdmOworfQorCisvKiBLZWVwIGRpc2NhcmRpbmcgaW5wdXQgZnJvbSB0aGUgcmVtb3RlIHN5c3RlbSwgdW50aWwgU1RSSU5HIGlzIGZvdW5kLgorICAgTGV0IHRoZSB1c2VyIGJyZWFrIG91dCBpbW1lZGlhdGVseS4gICovCit2b2lkCitzcl9leHBlY3QgKHN0cmluZykKKyAgICAgY2hhciAqc3RyaW5nOworeworICBjaGFyICpwID0gc3RyaW5nOworCisgIGltbWVkaWF0ZV9xdWl0ID0gMTsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaWYgKHNyX3JlYWRjaGFyICgpID09ICpwKQorCXsKKwkgIHArKzsKKwkgIGlmICgqcCA9PSAnXDAnKQorCSAgICB7CisJICAgICAgaW1tZWRpYXRlX3F1aXQgPSAwOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwlwID0gc3RyaW5nOworICAgIH0KK30KKwordm9pZAorc3Jfd3JpdGUgKGEsIGwpCisgICAgIGNoYXIgKmE7CisgICAgIGludCBsOworeworICBpbnQgaTsKKworICBpZiAoU0VSSUFMX1dSSVRFIChzcl9nZXRfZGVzYygpLCBhLCBsKSAhPSAwKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJzcl93cml0ZTogRXJyb3Igd3JpdGluZyB0byByZW1vdGUiKTsKKworICBpZiAoc3JfZ2V0X2RlYnVnKCkgPiAwKQorICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspCisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIiVjIiwgYVtpXSk7CisKKyAgcmV0dXJuOworfQorCit2b2lkCitzcl93cml0ZV9jciAocykKKyAgICAgY2hhciAqczsKK3sKKyAgc3Jfd3JpdGUgKHMsIHN0cmxlbiAocykpOworICBzcl93cml0ZSAoIlxyIiwgMSk7CisgIHJldHVybjsKK30KKworaW50Citzcl90aW1lZF9yZWFkIChidWYsIG4pCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgaW50IG47Cit7CisgIGludCBpOworICBjaGFyIGM7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgbikKKyAgICB7CisgICAgICBjID0gc3JfcmVhZGNoYXIgKCk7CisKKyAgICAgIGlmIChjID09IDApCisJcmV0dXJuIGk7CisgICAgICBidWZbaV0gPSBjOworICAgICAgaSsrOworCisgICAgfQorICByZXR1cm4gaTsKK30KKworLyogR2V0IGEgaGV4IGRpZ2l0IGZyb20gdGhlIHJlbW90ZSBzeXN0ZW0gJiByZXR1cm4gaXRzIHZhbHVlLiBJZgorICAgaWdub3JlX3NwYWNlIGlzIG5vbnplcm8sIGlnbm9yZSBzcGFjZXMgKG5vdCBuZXdsaW5lLCB0YWIsIGV0YykuICAqLworCitpbnQKK3NyX2dldF9oZXhfZGlnaXQgKGlnbm9yZV9zcGFjZSkKKyAgICAgaW50IGlnbm9yZV9zcGFjZTsKK3sKKyAgaW50IGNoOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGNoID0gc3JfcmVhZGNoYXIgKCk7CisgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKKwlyZXR1cm4gY2ggLSAnMCc7CisgICAgICBlbHNlIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKQorCXJldHVybiBjaCAtICdBJyArIDEwOworICAgICAgZWxzZSBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykKKwlyZXR1cm4gY2ggLSAnYScgKyAxMDsKKyAgICAgIGVsc2UgaWYgKGNoICE9ICcgJyB8fCAhaWdub3JlX3NwYWNlKQorCXsKKwkgIGdyX2V4cGVjdF9wcm9tcHQgKCk7CisJICBlcnJvciAoIkludmFsaWQgaGV4IGRpZ2l0IGZyb20gcmVtb3RlIHN5c3RlbS4iKTsKKwl9CisgICAgfQorfQorCisvKiBHZXQgYSBieXRlIGZyb20gdGhlIHJlbW90ZSBhbmQgcHV0IGl0IGluICpCWVQuICBBY2NlcHQgYW55IG51bWJlcgorICAgbGVhZGluZyBzcGFjZXMuICAqLwordm9pZAorc3JfZ2V0X2hleF9ieXRlIChieXQpCisgICAgIGNoYXIgKmJ5dDsKK3sKKyAgaW50IHZhbDsKKworICB2YWwgPSBzcl9nZXRfaGV4X2RpZ2l0ICgxKSA8PCA0OworICB2YWwgfD0gc3JfZ2V0X2hleF9kaWdpdCAoMCk7CisgICpieXQgPSB2YWw7Cit9CisKKy8qIFJlYWQgYSAzMi1iaXQgaGV4IHdvcmQgZnJvbSB0aGUgcmVtb3RlLCBwcmVjZWRlZCBieSBhIHNwYWNlICAqLworbG9uZworc3JfZ2V0X2hleF93b3JkICgpCit7CisgIGxvbmcgdmFsOworICBpbnQgajsKKworICB2YWwgPSAwOworICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgIHZhbCA9ICh2YWwgPDwgNCkgKyBzcl9nZXRfaGV4X2RpZ2l0IChqID09IDApOworICByZXR1cm4gdmFsOworfQorCisvKiBQdXQgYSBjb21tYW5kIHN0cmluZywgaW4gYXJncywgb3V0IHRvIHRoZSByZW1vdGUuICBUaGUgcmVtb3RlIGlzIGFzc3VtZWQgdG8KKyAgIGJlIGluIHJhdyBtb2RlLCBhbGwgd3JpdGluZy9yZWFkaW5nIGRvbmUgdGhyb3VnaCBkZXNjLgorICAgT3VwdXQgZnJvbSB0aGUgcmVtb3RlIGlzIHBsYWNlZCBvbiB0aGUgdXNlcnMgdGVybWluYWwgdW50aWwgdGhlCisgICBwcm9tcHQgZnJvbSB0aGUgcmVtb3RlIGlzIHNlZW4uCisgICBGSVhNRTogQ2FuJ3QgaGFuZGxlIGNvbW1hbmRzIHRoYXQgdGFrZSBpbnB1dC4gICovCisKK3N0YXRpYyB2b2lkCitzcl9jb20gKGFyZ3MsIGZyb210dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tdHR5OworeworICBzcl9jaGVja19vcGVuICgpOworCisgIGlmICghYXJncykKKyAgICByZXR1cm47CisKKyAgLyogQ2xlYXIgYWxsIGlucHV0IHNvIG9ubHkgY29tbWFuZCByZWxhdGl2ZSBvdXRwdXQgaXMgZGlzcGxheWVkICovCisKKyAgc3Jfd3JpdGVfY3IgKGFyZ3MpOworICBzcl93cml0ZSAoIlwwMzAiLCAxKTsKKyAgcmVnaXN0ZXJzX2NoYW5nZWQgKCk7CisgIGdyX2V4cGVjdF9wcm9tcHQgKCk7Cit9CisKK3ZvaWQKK2dyX2Nsb3NlKHF1aXR0aW5nKQorICAgICBpbnQgcXVpdHRpbmc7Cit7CisgIGdyX2NsZWFyX2FsbF9icmVha3BvaW50cygpOworCisgIGlmIChzcl9pc19vcGVuKCkpCisgICAgeworICAgICAgU0VSSUFMX0NMT1NFIChzcl9nZXRfZGVzYygpKTsKKyAgICAgIHNyX3NldF9kZXNjKE5VTEwpOworICAgIH0KKworICByZXR1cm47Cit9CisKKy8qIGdyX2RldGFjaCgpCisgICB0YWtlcyBhIHByb2dyYW0gcHJldmlvdXNseSBhdHRhY2hlZCB0byBhbmQgZGV0YWNoZXMgaXQuCisgICBXZSBiZXR0ZXIgbm90IGhhdmUgbGVmdCBhbnkgYnJlYWtwb2ludHMKKyAgIGluIHRoZSBwcm9ncmFtIG9yIGl0J2xsIGRpZSB3aGVuIGl0IGhpdHMgb25lLgorICAgQ2xvc2UgdGhlIG9wZW4gY29ubmVjdGlvbiB0byB0aGUgcmVtb3RlIGRlYnVnZ2VyLgorICAgVXNlIHRoaXMgd2hlbiB5b3Ugd2FudCB0byBkZXRhY2ggYW5kIGRvIHNvbWV0aGluZyBlbHNlCisgICB3aXRoIHlvdXIgZ2RiLiAgKi8KKwordm9pZAorZ3JfZGV0YWNoKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGlmIChhcmdzKQorICAgIGVycm9yICgiQXJndW1lbnQgZ2l2ZW4gdG8gXCJkZXRhY2hcIiB3aGVuIHJlbW90ZWx5IGRlYnVnZ2luZy4iKTsKKyAgCisgIGlmIChzcl9pc19vcGVuKCkpCisgICAgZ3JfY2xlYXJfYWxsX2JyZWFrcG9pbnRzICgpOworCisgIHBvcF90YXJnZXQgKCk7CisgIGlmIChmcm9tX3R0eSkKKyAgICBwdXRzX2ZpbHRlcmVkICgiRW5kaW5nIHJlbW90ZSBkZWJ1Z2dpbmcuXG4iKTsKKworICByZXR1cm47Cit9ICAKKwordm9pZAorZ3JfZmlsZXNfaW5mbyAob3BzKQorICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqb3BzOworeworI2lmZGVmIF9fR08zMl9fCisgIHByaW50Zl9maWx0ZXJlZCAoIlx0QXR0YWNoZWQgdG8gRE9TIGFzeW5jdHNyXG4iKTsKKyNlbHNlCisgIHByaW50Zl9maWx0ZXJlZCAoIlx0QXR0YWNoZWQgdG8gJXMiLCBzcl9nZXRfZGV2aWNlKCkpOworICBpZiAoYmF1ZF9yYXRlICE9IC0xKQorICAgIHByaW50Zl9maWx0ZXJlZCAoImF0ICVkIGJhdWQiLCBiYXVkX3JhdGUpOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworI2VuZGlmCisKKyAgaWYgKGV4ZWNfYmZkKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlx0YW5kIHJ1bm5pbmcgcHJvZ3JhbSAlc1xuIiwKKwkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGV4ZWNfYmZkKSk7CisgICAgfQorICBwcmludGZfZmlsdGVyZWQgKCJcdHVzaW5nIHRoZSAlcyBwcm90b2NvbC5cbiIsIG9wcy0+dG9fc2hvcnRuYW1lKTsKK30KKwordm9pZAorZ3JfbW91cm4gKCkKK3sKKyAgZ3JfY2xlYXJfYWxsX2JyZWFrcG9pbnRzICgpOworICB1bnB1c2hfdGFyZ2V0IChncl9nZXRfb3BzKCkpOworICBnZW5lcmljX21vdXJuX2luZmVyaW9yICgpOworfQorCit2b2lkCitncl9raWxsICgpCit7CisgIHJldHVybjsKK30KKworLyogVGhpcyBpcyBjYWxsZWQgbm90IG9ubHkgd2hlbiB3ZSBmaXJzdCBhdHRhY2gsIGJ1dCBhbHNvIHdoZW4gdGhlCisgICB1c2VyIHR5cGVzICJydW4iIGFmdGVyIGhhdmluZyBhdHRhY2hlZC4gICovCit2b2lkCitncl9jcmVhdGVfaW5mZXJpb3IgKGV4ZWNmaWxlLCBhcmdzLCBlbnYpCisgICAgIGNoYXIgKmV4ZWNmaWxlOworICAgICBjaGFyICphcmdzOworICAgICBjaGFyICoqZW52OworeworICBpbnQgZW50cnlfcHQ7CisKKyAgaWYgKGFyZ3MgJiYgKmFyZ3MpCisgICAgZXJyb3IgKCJDYW4ndCBwYXNzIGFyZ3VtZW50cyB0byByZW1vdGUgcHJvY2Vzcy4iKTsKKworICBpZiAoZXhlY2ZpbGUgPT0gMCB8fCBleGVjX2JmZCA9PSAwKQorICAgIGVycm9yICgiTm8gZXhlY3V0YWJsZSBmaWxlIHNwZWNpZmllZCIpOworCisgIGVudHJ5X3B0ID0gKGludCkgYmZkX2dldF9zdGFydF9hZGRyZXNzIChleGVjX2JmZCk7CisgIHNyX2NoZWNrX29wZW4gKCk7CisKKyAgZ3Jfa2lsbCAoKTsKKyAgZ3JfY2xlYXJfYWxsX2JyZWFrcG9pbnRzICgpOworCisgIGluaXRfd2FpdF9mb3JfaW5mZXJpb3IgKCk7CisgIGdyX2NoZWNraW4oKTsKKworICBpbnNlcnRfYnJlYWtwb2ludHMgKCk7CS8qIE5lZWRlZCB0byBnZXQgY29ycmVjdCBpbnN0cnVjdGlvbiBpbiBjYWNoZSAqLworICBwcm9jZWVkIChlbnRyeV9wdCwgLTEsIDApOworfQorCisvKiBHaXZlbiBhIG51bGwgdGVybWluYXRlZCBsaXN0IG9mIHN0cmluZ3MgTElTVCwgcmVhZCB0aGUgaW5wdXQgdW50aWwgd2UgZmluZCBvbmUgb2YKKyAgIHRoZW0uICBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzdHJpbmcgZm91bmQgb3IgLTEgb24gZXJyb3IuICAnPycgbWVhbnMgbWF0Y2gKKyAgIGFueSBzaW5nbGUgY2hhcmFjdGVyLiBOb3RlIHRoYXQgd2l0aCB0aGUgYWxnb3JpdGhtIHdlIHVzZSwgdGhlIGluaXRpYWwKKyAgIGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nIGNhbm5vdCByZWN1ciBpbiB0aGUgc3RyaW5nLCBvciB3ZSB3aWxsIG5vdCBmaW5kIHNvbWUKKyAgIGNhc2VzIG9mIHRoZSBzdHJpbmcgaW4gdGhlIGlucHV0LiAgSWYgUEFTU1RIUk9VR0ggaXMgbm9uLXplcm8sIHRoZW4KKyAgIHBhc3Mgbm9uLW1hdGNoaW5nIGRhdGEgb24uICAqLworCitpbnQKK2dyX211bHRpX3NjYW4gKGxpc3QsIHBhc3N0aHJvdWdoKQorICAgICBjaGFyICpsaXN0W107CisgICAgIGludCBwYXNzdGhyb3VnaDsKK3sKKyAgY2hhciAqc3dhbGxvd2VkID0gTlVMTDsgLyogaG9sZGluZyBhcmVhICovCisgIGNoYXIgKnN3YWxsb3dlZF9wID0gc3dhbGxvd2VkOyAvKiBDdXJyZW50IHBvc2l0aW9uIGluIHN3YWxsb3dlZC4gICovCisgIGludCBjaDsKKyAgaW50IGNoX2hhbmRsZWQ7CisgIGludCBpOworICBpbnQgc3RyaW5nX2NvdW50OworICBpbnQgbWF4X2xlbmd0aDsKKyAgY2hhciAqKnBsaXN0OworCisgIC8qIExvb2sgdGhyb3VnaCB0aGUgc3RyaW5ncy4gIENvdW50IHRoZW0uICBGaW5kIHRoZSBsYXJnZXN0IG9uZSBzbyB3ZSBjYW4KKyAgICAgYWxsb2NhdGUgYSBob2xkaW5nIGFyZWEuICAqLworCisgIGZvciAobWF4X2xlbmd0aCA9IHN0cmluZ19jb3VudCA9IGkgPSAwOworICAgICAgIGxpc3RbaV0gIT0gTlVMTDsKKyAgICAgICArK2ksICsrc3RyaW5nX2NvdW50KQorICAgIHsKKyAgICAgIGludCBsZW5ndGggPSBzdHJsZW4obGlzdFtpXSk7CisKKyAgICAgIGlmIChsZW5ndGggPiBtYXhfbGVuZ3RoKQorCW1heF9sZW5ndGggPSBsZW5ndGg7CisgICAgfQorCisgIC8qIGlmIHdlIGhhdmUgbm8gc3RyaW5ncywgdGhlbiBzb21ldGhpbmcgaXMgd3JvbmcuICovCisgIGlmIChzdHJpbmdfY291bnQgPT0gMCkKKyAgICByZXR1cm4oLTEpOworCisgIC8qIG90aGVyd2lzZSwgd2Ugd2lsbCBuZWVkIGEgaG9sZGluZyBhcmVhIGJpZyBlbm91Z2ggdG8gaG9sZCBhbG1vc3QgdHdvCisgICAgIGNvcGllcyBvZiBvdXIgbGFyZ2VzdCBzdHJpbmcuICAqLworICBzd2FsbG93ZWRfcCA9IHN3YWxsb3dlZCA9IGFsbG9jYShtYXhfbGVuZ3RoIDw8IDEpOworCisgIC8qIGFuZCBhIGxpc3Qgb2YgcG9pbnRlcnMgdG8gY3VycmVudCBzY2FuIHBvaW50cy4gKi8KKyAgcGxpc3QgPSAoY2hhciAqKikgYWxsb2NhIChzdHJpbmdfY291bnQgKiBzaXplb2YoKnBsaXN0KSk7CisKKyAgLyogYW5kIGluaXRpYWxpemUgKi8KKyAgZm9yIChpID0gMDsgaSA8IHN0cmluZ19jb3VudDsgKytpKQorICAgIHBsaXN0W2ldID0gbGlzdFtpXTsKKworICBmb3IgKGNoID0gc3JfcmVhZGNoYXIoKTsgLyogbG9vcCBmb3JldmVyICovIDsgY2ggPSBzcl9yZWFkY2hhcigpKQorICAgIHsKKyAgICAgIFFVSVQ7IC8qIExldCB1c2VyIHF1aXQgYW5kIGxlYXZlIHByb2Nlc3MgcnVubmluZyAqLworICAgICAgY2hfaGFuZGxlZCA9IDA7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpbmdfY291bnQ7ICsraSkKKwl7CisJICBpZiAoY2ggPT0gKnBsaXN0W2ldIHx8ICpwbGlzdFtpXSA9PSAnPycpCisJICAgIHsKKwkgICAgICArK3BsaXN0W2ldOworCSAgICAgIGlmICgqcGxpc3RbaV0gPT0gJ1wwJykKKwkJcmV0dXJuKGkpOworCisJICAgICAgaWYgKCFjaF9oYW5kbGVkKQorCQkqc3dhbGxvd2VkX3ArKyA9IGNoOworCisJICAgICAgY2hfaGFuZGxlZCA9IDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgcGxpc3RbaV0gPSBsaXN0W2ldOworCX0KKworICAgICAgaWYgKCFjaF9oYW5kbGVkKQorCXsKKwkgIGNoYXIgKnA7CisKKwkgIC8qIFByaW50IG91dCBhbnkgY2hhcmFjdGVycyB3aGljaCBoYXZlIGJlZW4gc3dhbGxvd2VkLiAgKi8KKwkgIGlmIChwYXNzdGhyb3VnaCkKKwkgICAgeworCSAgICAgIGZvciAocCA9IHN3YWxsb3dlZDsgcCA8IHN3YWxsb3dlZF9wOyArK3ApCisJCWZwdXRjX3VuZmlsdGVyZWQgKCpwLCBnZGJfc3Rkb3V0KTsKKworCSAgICAgIGZwdXRjX3VuZmlsdGVyZWQgKGNoLCBnZGJfc3Rkb3V0KTsKKwkgICAgfQorCisJICBzd2FsbG93ZWRfcCA9IHN3YWxsb3dlZDsKKwl9CisgICAgfQorI2lmIDAKKyAgLyogTmV2ZXIgcmVhY2hlZC4gICovCisgIHJldHVybigtMSk7CisjZW5kaWYKK30KKworLyogR2V0IHJlYWR5IHRvIG1vZGlmeSB0aGUgcmVnaXN0ZXJzIGFycmF5LiAgT24gbWFjaGluZXMgd2hpY2ggc3RvcmUKKyAgIGluZGl2aWR1YWwgcmVnaXN0ZXJzLCB0aGlzIGRvZXNuJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gIE9uIG1hY2hpbmVzCisgICB3aGljaCBzdG9yZSBhbGwgdGhlIHJlZ2lzdGVycyBpbiBvbmUgZmVsbCBzd29vcCwgdGhpcyBtYWtlcyBzdXJlCisgICB0aGF0IHJlZ2lzdGVycyBjb250YWlucyBhbGwgdGhlIHJlZ2lzdGVycyBmcm9tIHRoZSBwcm9ncmFtIGJlaW5nCisgICBkZWJ1Z2dlZC4gICovCisKK3ZvaWQKK2dyX3ByZXBhcmVfdG9fc3RvcmUgKCkKK3sKKyAgLyogRG8gbm90aGluZywgc2luY2Ugd2UgYXNzdW1lIHdlIGNhbiBzdG9yZSBpbmRpdmlkdWFsIHJlZ3MgKi8KK30KKworLyogUmVhZCBhIHdvcmQgZnJvbSByZW1vdGUgYWRkcmVzcyBBRERSIGFuZCByZXR1cm4gaXQuCisgKiBUaGlzIGdvZXMgdGhyb3VnaCB0aGUgZGF0YSBjYWNoZS4KKyAqLworaW50Citncl9mZXRjaF93b3JkIChhZGRyKQorICAgICBDT1JFX0FERFIgYWRkcjsKK3sKKyAgcmV0dXJuIGRjYWNoZV9mZXRjaCAoZ3JfZ2V0X2RjYWNoZSgpLCBhZGRyKTsKK30KKworLyogV3JpdGUgYSB3b3JkIFdPUkQgaW50byByZW1vdGUgYWRkcmVzcyBBRERSLgorICAgVGhpcyBnb2VzIHRocm91Z2ggdGhlIGRhdGEgY2FjaGUuICAqLworCit2b2lkCitncl9zdG9yZV93b3JkIChhZGRyLCB3b3JkKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgaW50IHdvcmQ7Cit7CisgIGRjYWNoZV9wb2tlIChncl9nZXRfZGNhY2hlKCksIGFkZHIsIHdvcmQpOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9zcl9zdXBwb3J0ICgpCit7CisvKiBGSVhNRS1ub3c6IGlmIHRhcmdldCBpcyBvcGVuLi4uICovCisgIGFkZF9zaG93X2Zyb21fc2V0IChhZGRfc2V0X2NtZCAoInJlbW90ZWRldmljZSIsIG5vX2NsYXNzLAorCQkJCSAgdmFyX2ZpbGVuYW1lLCAoY2hhciAqKSZzcl9zZXR0aW5ncy5kZXZpY2UsCisJCQkJICAiU2V0IGRldmljZSBmb3IgcmVtb3RlIHNlcmlhbCBJL08uXG5cCitUaGlzIGRldmljZSBpcyB1c2VkIGFzIHRoZSBzZXJpYWwgcG9ydCB3aGVuIGRlYnVnZ2luZyB1c2luZyByZW1vdGVcblwKK3RhcmdldHMuIiwgJnNldGxpc3QpLAorCQkgICAgICZzaG93bGlzdCk7CisKKyAgYWRkX2NvbSAoInJlbW90ZSA8Y29tbWFuZD4iLCBjbGFzc19vYnNjdXJlLCBzcl9jb20sCisJICAgIlNlbmQgYSBjb21tYW5kIHRvIHRoZSByZW1vdGUgbW9uaXRvci4iKTsKKworfQpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS11dGlscy5oIGIvZ2RiL3JlbW90ZS11dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZmNkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmVtb3RlLXV0aWxzLmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qIEdlbmVyaWMgc3VwcG9ydCBmb3IgcmVtb3RlIGRlYnVnZ2luZyBpbnRlcmZhY2VzLgorCisgICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIFJFTU9URV9VVElMU19ICisjZGVmaW5lIFJFTU9URV9VVElMU19ICisKKyNpbmNsdWRlICJzZXJpYWwuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJkY2FjaGUuaCIKKworLyogU3R1ZmYgdGhhdCBzaG91bGQgYmUgc2hhcmVkIChhbmQgaGFuZGxlZCBjb25zaXN0ZW50bHkpIGFtb25nIHRoZSB2YXJpb3VzCisgICByZW1vdGUgdGFyZ2V0cy4gICovCisKK3N0cnVjdCBfc3Jfc2V0dGluZ3MgeworICB1bnNpZ25lZCBpbnQgdGltZW91dDsKKworICBpbnQgcmV0cmllczsKKworICBjaGFyICpkZXZpY2U7CisgIHNlcmlhbF90IGRlc2M7CisKK307CisKK2V4dGVybiBzdHJ1Y3QgX3NyX3NldHRpbmdzIHNyX3NldHRpbmdzOworCisvKiBnZXQgYW5kIHNldCBkZWJ1ZyB2YWx1ZS4gKi8KKyNkZWZpbmUgc3JfZ2V0X2RlYnVnKCkJCQkocmVtb3RlX2RlYnVnKQorI2RlZmluZSBzcl9zZXRfZGVidWcobmV3dmFsKQkJKHJlbW90ZV9kZWJ1ZyA9IChuZXd2YWwpKQorCisvKiBnZXQgYW5kIHNldCB0aW1lb3V0LiAqLworI2RlZmluZSBzcl9nZXRfdGltZW91dCgpCQkoc3Jfc2V0dGluZ3MudGltZW91dCkKKyNkZWZpbmUgc3Jfc2V0X3RpbWVvdXQobmV3dmFsKQkJKHNyX3NldHRpbmdzLnRpbWVvdXQgPSAobmV3dmFsKSkKKworLyogZ2V0IGFuZCBzZXQgZGV2aWNlLiAqLworI2RlZmluZSBzcl9nZXRfZGV2aWNlKCkJCQkoc3Jfc2V0dGluZ3MuZGV2aWNlKQorI2RlZmluZSBzcl9zZXRfZGV2aWNlKG5ld3ZhbCkgXAoreyBcCisgICAgaWYgKHNyX3NldHRpbmdzLmRldmljZSkgZnJlZShzcl9zZXR0aW5ncy5kZXZpY2UpOyBcCisgICAgc3Jfc2V0dGluZ3MuZGV2aWNlID0gKG5ld3ZhbCk7IFwKK30KKworLyogZ2V0IGFuZCBzZXQgZGVzY3JpcHRvciB2YWx1ZS4gKi8KKyNkZWZpbmUgc3JfZ2V0X2Rlc2MoKQkJCShzcl9zZXR0aW5ncy5kZXNjKQorI2RlZmluZSBzcl9zZXRfZGVzYyhuZXd2YWwpCQkoc3Jfc2V0dGluZ3MuZGVzYyA9IChuZXd2YWwpKQorCisvKiBnZXQgYW5kIHNldCByZXRyaWVzLiAqLworI2RlZmluZSBzcl9nZXRfcmV0cmllcygpCQkoc3Jfc2V0dGluZ3MucmV0cmllcykKKyNkZWZpbmUgc3Jfc2V0X3JldHJpZXMobmV3dmFsKQkJKHNyX3NldHRpbmdzLnJldHJpZXMgPSAobmV3dmFsKSkKKworI2RlZmluZSBzcl9pc19vcGVuKCkJCQkoc3Jfc2V0dGluZ3MuZGVzYyAhPSBOVUxMKQorCisjZGVmaW5lIHNyX2NoZWNrX29wZW4oKSAJeyBpZiAoIXNyX2lzX29wZW4oKSkgXAorCQkJCSAgICBlcnJvciAoIlJlbW90ZSBkZXZpY2Ugbm90IG9wZW4iKTsgfQorCitzdHJ1Y3QgZ3Jfc2V0dGluZ3MgeworICAvKiBUaGlzIGlzIG91ciBkYXRhIGNhY2hlLiAqLworICBEQ0FDSEUgKmRjYWNoZTsKKyAgY2hhciAqcHJvbXB0OworICBzdHJ1Y3QgdGFyZ2V0X29wcyAqb3BzOworICBpbnQgKCpjbGVhcl9hbGxfYnJlYWtwb2ludHMpUEFSQU1TKCh2b2lkKSk7CisgIG1lbXhmZXJmdW5jIHJlYWRmdW5jOworICBtZW14ZmVyZnVuYyB3cml0ZWZ1bmM7CisgIHZvaWQgKCpjaGVja2luKVBBUkFNUygodm9pZCkpOworfTsKKworZXh0ZXJuIHN0cnVjdCBncl9zZXR0aW5ncyAqZ3Jfc2V0dGluZ3M7CisKKy8qIGdldCBhbmQgc2V0IGRjYWNoZS4gKi8KKyNkZWZpbmUgZ3JfZ2V0X2RjYWNoZSgpCQkJKGdyX3NldHRpbmdzLT5kY2FjaGUpCisjZGVmaW5lIGdyX3NldF9kY2FjaGUobmV3dmFsKQkJKGdyX3NldHRpbmdzLT5kY2FjaGUgPSAobmV3dmFsKSkKKworLyogZ2V0IGFuZCBzZXQgcHJvbXB0LiAqLworI2RlZmluZSBncl9nZXRfcHJvbXB0KCkJCQkoZ3Jfc2V0dGluZ3MtPnByb21wdCkKKyNkZWZpbmUgZ3Jfc2V0X3Byb21wdChuZXd2YWwpCQkoZ3Jfc2V0dGluZ3MtPnByb21wdCA9IChuZXd2YWwpKQorCisvKiBnZXQgYW5kIHNldCBvcHMuICovCisjZGVmaW5lIGdyX2dldF9vcHMoKQkJCShncl9zZXR0aW5ncy0+b3BzKQorI2RlZmluZSBncl9zZXRfb3BzKG5ld3ZhbCkJCShncl9zZXR0aW5ncy0+b3BzID0gKG5ld3ZhbCkpCisKKyNkZWZpbmUgZ3JfY2xlYXJfYWxsX2JyZWFrcG9pbnRzKCkJKChncl9zZXR0aW5ncy0+Y2xlYXJfYWxsX2JyZWFrcG9pbnRzKSgpKQorI2RlZmluZSBncl9jaGVja2luKCkJCQkoKGdyX3NldHRpbmdzLT5jaGVja2luKSgpKQorCisvKiBLZWVwIGRpc2NhcmRpbmcgaW5wdXQgdW50aWwgd2Ugc2VlIHRoZSBwcm9tcHQuCisKKyAgIFRoZSBjb252ZW50aW9uIGZvciBkZWFsaW5nIHdpdGggdGhlIHByb21wdCBpcyB0aGF0IHlvdQorICAgbyBnaXZlIHlvdXIgY29tbWFuZAorICAgbyAqdGhlbiogd2FpdCBmb3IgdGhlIHByb21wdC4KKworICAgVGh1cyB0aGUgbGFzdCB0aGluZyB0aGF0IGEgcHJvY2VkdXJlIGRvZXMgd2l0aCB0aGUgc2VyaWFsIGxpbmUKKyAgIHdpbGwgYmUgYW4gZ3JfZXhwZWN0X3Byb21wdCgpLiAgRXhjZXB0aW9uOiAgcmVzdW1lIGRvZXMgbm90CisgICB3YWl0IGZvciB0aGUgcHJvbXB0LCBiZWNhdXNlIHRoZSB0ZXJtaW5hbCBpcyBiZWluZyBoYW5kZWQgb3ZlcgorICAgdG8gdGhlIGluZmVyaW9yLiAgSG93ZXZlciwgdGhlIG5leHQgdGhpbmcgd2hpY2ggaGFwcGVucyBhZnRlciB0aGF0CisgICBpcyBhIGJ1Z193YWl0IHdoaWNoIGRvZXMgd2FpdCBmb3IgdGhlIHByb21wdC4KKyAgIE5vdGUgdGhhdCB0aGlzIGluY2x1ZGVzIGFibm9ybWFsIGV4aXQsIGUuZy4gZXJyb3IoKS4gIFRoaXMgaXMKKyAgIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGdldHRpbmcgaW50byBzdGF0ZXMgZnJvbSB3aGljaCB3ZSBjYW4ndAorICAgcmVjb3Zlci4gICovCisKKyNkZWZpbmUgZ3JfZXhwZWN0X3Byb21wdCgpCXNyX2V4cGVjdChncl9nZXRfcHJvbXB0KCkpCisKK2ludCBncl9mZXRjaF93b3JkIFBBUkFNUygoQ09SRV9BRERSIGFkZHIpKTsKK2ludCBncl9tdWx0aV9zY2FuIFBBUkFNUygoY2hhciAqbGlzdFtdLCBpbnQgcGFzc3Rocm91Z2gpKTsKK2ludCBzcl9nZXRfaGV4X2RpZ2l0IFBBUkFNUygoaW50IGlnbm9yZV9zcGFjZSkpOworaW50IHNyX3BvbGxjaGFyIFBBUkFNUygodm9pZCkpOworaW50IHNyX3JlYWRjaGFyIFBBUkFNUygodm9pZCkpOworaW50IHNyX3RpbWVkX3JlYWQgUEFSQU1TKChjaGFyICpidWYsIGludCBuKSk7Citsb25nIHNyX2dldF9oZXhfd29yZCBQQVJBTVMoKHZvaWQpKTsKK3ZvaWQgZ3JfY2xvc2UgUEFSQU1TKChpbnQgcXVpdHRpbmcpKTsKK3ZvaWQgZ3JfY3JlYXRlX2luZmVyaW9yIFBBUkFNUygoY2hhciAqZXhlY2ZpbGUsIGNoYXIgKmFyZ3MsIGNoYXIgKiplbnYpKTsKK3ZvaWQgZ3JfZGV0YWNoIFBBUkFNUygoY2hhciAqYXJncywgaW50IGZyb21fdHR5KSk7Cit2b2lkIGdyX2ZpbGVzX2luZm8gUEFSQU1TKChzdHJ1Y3QgdGFyZ2V0X29wcyAqb3BzKSk7Cit2b2lkIGdyX2dlbmVyaWNfY2hlY2tpbiBQQVJBTVMoKHZvaWQpKTsKK3ZvaWQgZ3Jfa2lsbCBQQVJBTVMoKHZvaWQpKTsKK3ZvaWQgZ3JfbW91cm4gUEFSQU1TKCh2b2lkKSk7Cit2b2lkIGdyX3ByZXBhcmVfdG9fc3RvcmUgUEFSQU1TKCh2b2lkKSk7Cit2b2lkIGdyX3N0b3JlX3dvcmQgUEFSQU1TKChDT1JFX0FERFIgYWRkciwgaW50IHdvcmQpKTsKK3ZvaWQgc3JfZXhwZWN0IFBBUkFNUygoY2hhciAqc3RyaW5nKSk7Cit2b2lkIHNyX2dldF9oZXhfYnl0ZSBQQVJBTVMoKGNoYXIgKmJ5dCkpOwordm9pZCBzcl9zY2FuX2FyZ3MgUEFSQU1TKChjaGFyICpwcm90bywgY2hhciAqYXJncykpOwordm9pZCBzcl93cml0ZSBQQVJBTVMoKGNoYXIgKmEsIGludCBsKSk7Cit2b2lkIHNyX3dyaXRlX2NyIFBBUkFNUygoY2hhciAqcykpOworCit2b2lkIGdyX29wZW4gUEFSQU1TKChjaGFyICphcmdzLCBpbnQgZnJvbV90dHksCisJCSAgICAgc3RydWN0IGdyX3NldHRpbmdzICpncl9zZXR0aW5ncykpOyAKK3ZvaWQgZ3JfbG9hZF9pbWFnZSBQQVJBTVMoKGNoYXIqLCBpbnQgZnJvbV90dHkpKTsKKyNlbmRpZiAvKiBSRU1PVEVfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS12eC5jIGIvZ2RiL3JlbW90ZS12eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZDg2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmVtb3RlLXZ4LmMKQEAgLTAsMCArMSwxNDY3IEBACisvKiBNZW1vcnktYWNjZXNzIGFuZCBjb21tYW5kcyBmb3IgcmVtb3RlIFZ4V29ya3MgcHJvY2Vzc2VzLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IChDKSAxOTkwLTk1LCAxOTk3LTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgV2luZCBSaXZlciBTeXN0ZW1zIGFuZCBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJ3YWl0LmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJjb21wbGFpbnRzLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAiYmZkLmgiIC8qIFJlcXVpcmVkIGJ5IG9iamZpbGVzLmguICAqLworI2luY2x1ZGUgInN5bWZpbGUuaCIgLyogUmVxdWlyZWQgYnkgb2JqZmlsZXMuaC4gICovCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJnZGItc3RhYnMuaCIKKworI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2RlZmluZSBtYWxsb2MgYm9nb25fbWFsbG9jCS8qIFN1biBjbGFpbXMgImNoYXIgKm1hbGxvYygpIiBub3Qgdm9pZCAqICovCisjZGVmaW5lIGZyZWUgYm9nb25fZnJlZQkJLyogU3VuIGNsYWltcyAiaW50IGZyZWUoKSIgbm90IHZvaWQgKi8KKyNkZWZpbmUgcmVhbGxvYyBib2dvbl9yZWFsbG9jCS8qIFN1biBjbGFpbXMgImNoYXIgKnJlYWxsb2MoKSIsIG5vdCB2b2lkICogKi8KKyNpbmNsdWRlIDxycGMvcnBjLmg+CisjdW5kZWYgbWFsbG9jCisjdW5kZWYgZnJlZQorI3VuZGVmIHJlYWxsb2MKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgkJLyogVVRlaydzIDxycGMvcnBjLmg+IGRvZXNuJ3QgI2luY2wgdGhpcyAqLworI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSAidngtc2hhcmUvcHRyYWNlLmgiCisjaW5jbHVkZSAidngtc2hhcmUveGRyX3B0cmFjZS5oIgorI2luY2x1ZGUgInZ4LXNoYXJlL3hkcl9sZC5oIgorI2luY2x1ZGUgInZ4LXNoYXJlL3hkcl9yZGIuaCIKKyNpbmNsdWRlICJ2eC1zaGFyZS9kYmdScGNMaWIuaCIKKworI2luY2x1ZGUgPHN5bXRhYi5oPgorCisvKiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlciBpbiBhIHNpbmdsZQorICAgUFRSQUNFX3tSRUFELFdSSVRFfURBVEEgcmVxdWVzdC4gICovCisjZGVmaW5lIFZYX01FTVhGRVJfTUFYIDQwOTYKKworZXh0ZXJuIHZvaWQgdnhfcmVhZF9yZWdpc3RlciAoKTsKK2V4dGVybiB2b2lkIHZ4X3dyaXRlX3JlZ2lzdGVyICgpOworZXh0ZXJuIHZvaWQgc3ltYm9sX2ZpbGVfY29tbWFuZCAoKTsKK2V4dGVybiBpbnQgc3RvcF9zb29uX3F1aWV0bHk7CQkvKiBmb3Igd2FpdF9mb3JfaW5mZXJpb3IgKi8KKworc3RhdGljIGludCBuZXRfc3RlcCAoKTsKK3N0YXRpYyBpbnQgbmV0X3B0cmFjZV9jbG50X2NhbGwgKCk7CS8qIEZvcndhcmQgZGVjbCAqLworc3RhdGljIGVudW0gY2xudF9zdGF0IG5ldF9jbG50X2NhbGwgKCk7CS8qIEZvcndhcmQgZGVjbCAqLworCisvKiBUYXJnZXQgb3BzIHN0cnVjdHVyZSBmb3IgYWNjZXNzaW5nIG1lbW9yeSBhbmQgc3VjaCBvdmVyIHRoZSBuZXQgKi8KKworc3RhdGljIHN0cnVjdCB0YXJnZXRfb3BzIHZ4X29wczsKKworLyogVGFyZ2V0IG9wcyBzdHJ1Y3R1cmUgZm9yIGFjY2Vzc2luZyBWeFdvcmtzIGNoaWxkIHByb2Nlc3NlcyBvdmVyIHRoZSBuZXQgKi8KKworc3RhdGljIHN0cnVjdCB0YXJnZXRfb3BzIHZ4X3J1bl9vcHM7CisKKy8qIFNhdmVkIG5hbWUgb2YgdGFyZ2V0IGhvc3QgYW5kIGNhbGxlZCBmdW5jdGlvbiBmb3IgImluZm8gZmlsZXMiLgorICAgQm90aCBtYWxsb2MnZC4gICovCisKK3N0YXRpYyBjaGFyICp2eF9ob3N0Oworc3RhdGljIGNoYXIgKnZ4X3J1bm5pbmc7CQkvKiBDYWxsZWQgZnVuY3Rpb24gKi8KKworLyogTm9uemVybyBtZWFucyB0YXJnZXQgdGhhdCBpcyBiZWluZyBkZWJ1Z2dlZCByZW1vdGVseSBoYXMgYSBmbG9hdGluZworICAgcG9pbnQgcHJvY2Vzc29yLiAgKi8KKworaW50IHRhcmdldF9oYXNfZnA7CisKKy8qIERlZmF1bHQgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZSBuZXR3b3JrIGlzIGZvcmtpbmcgdXAuICAqLworCitzdGF0aWMgY29uc3QgY2hhciBycGNlcnJbXSA9ICJuZXR3b3JrIHRhcmdldCBkZWJ1Z2dpbmc6ICBycGMgZXJyb3IiOworCitDTElFTlQgKnBDbGllbnQ7ICAgICAgICAgLyogY2xpZW50IHVzZWQgaW4gbmV0IGRlYnVnZ2luZyAqLworc3RhdGljIGludCBwdHJhY2VTb2NrID0gUlBDX0FOWVNPQ0s7CisKK2VudW0gY2xudF9zdGF0IG5ldF9jbG50X2NhbGwoKTsKK3N0YXRpYyB2b2lkIHBhcnNlX2FyZ3MgKCk7CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXZhbCBycGNUaW1lb3V0ID0geyAxMCwgMCB9OworCitzdGF0aWMgY2hhciAqc2tpcF93aGl0ZV9zcGFjZSAoKTsKK3N0YXRpYyBjaGFyICpmaW5kX3doaXRlX3NwYWNlICgpOworIAorLyogVGVsbCB0aGUgVnhXb3JrcyB0YXJnZXQgc3lzdGVtIHRvIGRvd25sb2FkIGEgZmlsZS4KKyAgIFRoZSBsb2FkIGFkZHJlc3NlcyBvZiB0aGUgdGV4dCwgZGF0YSwgYW5kIGJzcyBzZWdtZW50cyBhcmUKKyAgIHN0b3JlZCBpbiAqcFRleHRBZGRyLCAqcERhdGFBZGRyLCBhbmQgKnBCc3NBZGRyIChyZXNwZWN0aXZlbHkpLgorICAgUmV0dXJucyAwIGZvciBzdWNjZXNzLCAtMSBmb3IgZmFpbHVyZS4gICovCisKK3N0YXRpYyBpbnQKK25ldF9sb2FkIChmaWxlbmFtZSwgcFRleHRBZGRyLCBwRGF0YUFkZHIsIHBCc3NBZGRyKQorICAgICBjaGFyICpmaWxlbmFtZTsKKyAgICAgQ09SRV9BRERSICpwVGV4dEFkZHI7CisgICAgIENPUkVfQUREUiAqcERhdGFBZGRyOworICAgICBDT1JFX0FERFIgKnBCc3NBZGRyOworeworICBlbnVtIGNsbnRfc3RhdCBzdGF0dXM7CisgIHN0cnVjdCBsZGZpbGUgbGRzdHJ1Y3Q7CisgIHN0cnVjdCB0aW1ldmFsIGxvYWRfdGltZW91dDsKKworICBtZW1zZXQgKChjaGFyICopICZsZHN0cnVjdCwgJ1wwJywgc2l6ZW9mIChsZHN0cnVjdCkpOworCisgIC8qIFdlIGludm9rZSBjbG50X2NhbGwgKCkgaGVyZSBkaXJlY3RseSwgaW5zdGVhZCBvZiB0aHJvdWdoCisgICAgIG5ldF9jbG50X2NhbGwgKCksIGJlY2F1c2Ugd2UgbmVlZCB0byBzZXQgYSBsYXJnZSB0aW1lb3V0IHZhbHVlLgorICAgICBUaGUgbG9hZCBvbiB0aGUgdGFyZ2V0IHNpZGUgY2FuIHRha2UgcXVpdGUgYSB3aGlsZSwgZWFzaWx5CisgICAgIG1vcmUgdGhhbiAxMCBzZWNvbmRzLiAgVGhlIHVzZXIgY2FuIGtpbGwgdGhpcyBjYWxsIGJ5IHR5cGluZworICAgICBDVFJMLUMgaWYgdGhlcmUgcmVhbGx5IGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBsb2FkLiAgCisKKyAgICAgRG8gbm90IGNoYW5nZSB0aGUgdHZfc2VjIHZhbHVlIHdpdGhvdXQgY2hlY2tpbmcgLS0gc2VsZWN0KCkgaW1wb3NlcworICAgICBhIGxpbWl0IG9mIDEwKio4IG9uIGl0IGZvciBubyBnb29kIHJlYXNvbiB0aGF0IEkgY2FuIHNlZS4uLiAgKi8KKworICBsb2FkX3RpbWVvdXQudHZfc2VjID0gOTk5OTk5OTk7ICAgLyogQSBsYXJnZSBudW1iZXIsIGVmZmVjdGl2ZWx5IGluZi4gKi8KKyAgbG9hZF90aW1lb3V0LnR2X3VzZWMgPSAwOworIAorICBzdGF0dXMgPSBjbG50X2NhbGwgKHBDbGllbnQsIFZYX0xPQUQsIHhkcl93cmFwc3RyaW5nLCAmZmlsZW5hbWUsIHhkcl9sZGZpbGUsCisJCSAgICAgICZsZHN0cnVjdCwgbG9hZF90aW1lb3V0KTsKKworICBpZiAoc3RhdHVzID09IFJQQ19TVUNDRVNTKQorICAgIHsKKyAgICAgIGlmICgqbGRzdHJ1Y3QubmFtZSA9PSAwKQkvKiBsb2FkIGZhaWxlZCBvbiBWeFdvcmtzIHNpZGUgKi8KKwlyZXR1cm4gLTE7CisgICAgICAqcFRleHRBZGRyID0gbGRzdHJ1Y3QudHh0X2FkZHI7CisgICAgICAqcERhdGFBZGRyID0gbGRzdHJ1Y3QuZGF0YV9hZGRyOworICAgICAgKnBCc3NBZGRyID0gbGRzdHJ1Y3QuYnNzX2FkZHI7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIHJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBlcnJubyBpZiBSUEMgZmFpbGVkIG9yIFZ4V29ya3MgY29tcGxhaW5zLiAqLworCitzdGF0aWMgaW50CituZXRfYnJlYWsgKGFkZHIsIHByb2NudW0pCisgICAgIGludCBhZGRyOworICAgICB1X2xvbmcgcHJvY251bTsKK3sKKyAgZW51bSBjbG50X3N0YXQgc3RhdHVzOworICBpbnQgYnJlYWtfc3RhdHVzOworICBScHRyYWNlIHB0cmFjZV9pbjsgIC8qIFhYWCBUaGlzIGlzIHN0dXBpZC4gIEl0IGRvZXNuJ3QgbmVlZCB0byBiZSBhIHB0cmFjZQorCQkJIHN0cnVjdHVyZS4gIEhvdyBhYm91dCBzb21ldGhpbmcgc21hbGxlcj8gKi8KKworICBtZW1zZXQgKChjaGFyICopICZwdHJhY2VfaW4sICdcMCcsIHNpemVvZiAocHRyYWNlX2luKSk7CisgIGJyZWFrX3N0YXR1cyA9IDA7CisKKyAgcHRyYWNlX2luLmFkZHIgPSBhZGRyOworICBwdHJhY2VfaW4ucGlkID0gaW5mZXJpb3JfcGlkOworCisgIHN0YXR1cyA9IG5ldF9jbG50X2NhbGwgKHByb2NudW0sIHhkcl9ycHRyYWNlLCAmcHRyYWNlX2luLCB4ZHJfaW50LAorCQkJICAmYnJlYWtfc3RhdHVzKTsKKworICBpZiAoc3RhdHVzICE9IFJQQ19TVUNDRVNTKQorICAgICAgcmV0dXJuIGVycm5vOworCisgIGlmIChicmVha19zdGF0dXMgPT0gLTEpCisgICAgcmV0dXJuIEVOT01FTTsKKyAgcmV0dXJuIGJyZWFrX3N0YXR1czsJLyogcHJvYmFibHkgKEZJWE1FKSB6ZXJvICovCit9CisKKy8qIHJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBlcnJubyBvdGhlcndpc2UgKi8KKworc3RhdGljIGludAordnhfaW5zZXJ0X2JyZWFrcG9pbnQgKGFkZHIpCisgICAgIGludCBhZGRyOworeworICByZXR1cm4gbmV0X2JyZWFrIChhZGRyLCBWWF9CUkVBS19BREQpOworfQorCisvKiByZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgZXJybm8gb3RoZXJ3aXNlICovCisKK3N0YXRpYyBpbnQKK3Z4X3JlbW92ZV9icmVha3BvaW50IChhZGRyKQorICAgICBpbnQgYWRkcjsKK3sKKyAgcmV0dXJuIG5ldF9icmVhayAoYWRkciwgVlhfQlJFQUtfREVMRVRFKTsKK30KKworLyogU3RhcnQgYW4gaW5mZXJpb3IgcHJvY2VzcyBhbmQgc2V0cyBpbmZlcmlvcl9waWQgdG8gaXRzIHBpZC4KKyAgIEVYRUNfRklMRSBpcyB0aGUgZmlsZSB0byBydW4uCisgICBBTExBUkdTIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cyB0byB0aGUgcHJvZ3JhbS4KKyAgIEVOViBpcyB0aGUgZW52aXJvbm1lbnQgdmVjdG9yIHRvIHBhc3MuCisgICBSZXR1cm5zIHByb2Nlc3MgaWQuICBFcnJvcnMgcmVwb3J0ZWQgd2l0aCBlcnJvcigpLgorICAgT24gVnhXb3Jrcywgd2UgaWdub3JlIGV4ZWNfZmlsZS4gICovCisgCitzdGF0aWMgdm9pZAordnhfY3JlYXRlX2luZmVyaW9yIChleGVjX2ZpbGUsIGFyZ3MsIGVudikKKyAgICAgY2hhciAqZXhlY19maWxlOworICAgICBjaGFyICphcmdzOworICAgICBjaGFyICoqZW52OworeworICBlbnVtIGNsbnRfc3RhdCBzdGF0dXM7CisgIGFyZ19hcnJheSBwYXNzQXJnczsKKyAgVEFTS19TVEFSVCB0YXNrU3RhcnQ7CisKKyAgbWVtc2V0ICgoY2hhciAqKSAmcGFzc0FyZ3MsICdcMCcsIHNpemVvZiAocGFzc0FyZ3MpKTsKKyAgbWVtc2V0ICgoY2hhciAqKSAmdGFza1N0YXJ0LCAnXDAnLCBzaXplb2YgKHRhc2tTdGFydCkpOworCisgIC8qIHBhcnNlIGFyZ3VtZW50cywgcHV0IHRoZW0gaW4gcGFzc0FyZ3MgKi8KKworICBwYXJzZV9hcmdzIChhcmdzLCAmcGFzc0FyZ3MpOworCisgIGlmIChwYXNzQXJncy5hcmdfYXJyYXlfbGVuID09IDApCisgICAgZXJyb3IgKCJZb3UgbXVzdCBzcGVjaWZ5IGEgZnVuY3Rpb24gbmFtZSB0byBydW4sIGFuZCBhcmd1bWVudHMgaWYgYW55Iik7CisKKyAgc3RhdHVzID0gbmV0X2NsbnRfY2FsbCAoUFJPQ0VTU19TVEFSVCwgeGRyX2FyZ19hcnJheSwgJnBhc3NBcmdzLAorCQkJICB4ZHJfVEFTS19TVEFSVCwgJnRhc2tTdGFydCk7CisKKyAgaWYgKChzdGF0dXMgIT0gUlBDX1NVQ0NFU1MpIHx8ICh0YXNrU3RhcnQuc3RhdHVzID09IC0xKSkKKyAgICBlcnJvciAoIkNhbid0IGNyZWF0ZSBwcm9jZXNzIG9uIHJlbW90ZSB0YXJnZXQgbWFjaGluZSIpOworCisgIC8qIFNhdmUgdGhlIG5hbWUgb2YgdGhlIHJ1bm5pbmcgZnVuY3Rpb24gKi8KKyAgdnhfcnVubmluZyA9IHNhdmVzdHJpbmcgKHBhc3NBcmdzLmFyZ19hcnJheV92YWxbMF0sCisJCQkgICBzdHJsZW4gKHBhc3NBcmdzLmFyZ19hcnJheV92YWxbMF0pKTsKKworICBwdXNoX3RhcmdldCAoJnZ4X3J1bl9vcHMpOworICBpbmZlcmlvcl9waWQgPSB0YXNrU3RhcnQucGlkOworCisgIC8qIFdlIHdpbGwgZ2V0IGEgdHJhY2UgdHJhcCBhZnRlciBvbmUgaW5zdHJ1Y3Rpb24uCisgICAgIEluc2VydCBicmVha3BvaW50cyBhbmQgY29udGludWUuICAqLworCisgIGluaXRfd2FpdF9mb3JfaW5mZXJpb3IgKCk7CisKKyAgLyogU2V0IHVwIHRoZSAic2F2ZWQgdGVybWluYWwgbW9kZXMiIG9mIHRoZSBpbmZlcmlvcgorICAgICBiYXNlZCBvbiB3aGF0IG1vZGVzIHdlIGFyZSBzdGFydGluZyBpdCB3aXRoLiAgKi8KKyAgdGFyZ2V0X3Rlcm1pbmFsX2luaXQgKCk7CisKKyAgLyogSW5zdGFsbCBpbmZlcmlvcidzIHRlcm1pbmFsIG1vZGVzLiAgKi8KKyAgdGFyZ2V0X3Rlcm1pbmFsX2luZmVyaW9yICgpOworCisgIHN0b3Bfc29vbl9xdWlldGx5ID0gMTsKKyAgd2FpdF9mb3JfaW5mZXJpb3IgKCk7CQkvKiBHZXQgdGhlIHRhc2sgc3Bhd24gZXZlbnQgKi8KKyAgc3RvcF9zb29uX3F1aWV0bHkgPSAwOworCisgIC8qIGluc2VydF9zdGVwX2JyZWFrcG9pbnQgKCk7ICBGSVhNRSwgZG8gd2UgbmVlZCB0aGlzPyAgKi8KKyAgcHJvY2VlZCAoLTEsIFRBUkdFVF9TSUdOQUxfREVGQVVMVCwgMCk7Cit9CisKKy8qIEZpbGwgQVJHU1RSVUNUIGluIGFyZ2MvYXJndiBmb3JtIHdpdGggdGhlIGFyZ3VtZW50cyBmcm9tIHRoZQorICAgYXJndW1lbnQgc3RyaW5nIEFSR1NUUklORy4gICovCisKK3N0YXRpYyB2b2lkCitwYXJzZV9hcmdzIChhcmdfc3RyaW5nLCBhcmdfc3RydWN0KQorICAgICByZWdpc3RlciBjaGFyICphcmdfc3RyaW5nOworICAgICBhcmdfYXJyYXkgKmFyZ19zdHJ1Y3Q7Cit7CisgIHJlZ2lzdGVyIGludCBhcmdfY291bnQgPSAwOwkvKiBudW1iZXIgb2YgYXJndW1lbnRzICovCisgIHJlZ2lzdGVyIGludCBhcmdfaW5kZXggPSAwOworICByZWdpc3RlciBjaGFyICpwMDsKKyAKKyAgbWVtc2V0ICgoY2hhciAqKSBhcmdfc3RydWN0LCAnXDAnLCBzaXplb2YgKGFyZ19hcnJheSkpOworIAorICAvKiBmaXJzdCBjb3VudCBob3cgbWFueSBhcmd1bWVudHMgdGhlcmUgYXJlICovCisKKyAgcDAgPSBhcmdfc3RyaW5nOworICB3aGlsZSAoKnAwICE9ICdcMCcpCisgICAgeworICAgICAgaWYgKCoocDAgPSBza2lwX3doaXRlX3NwYWNlIChwMCkpID09ICdcMCcpCisJYnJlYWs7CisgICAgICBwMCA9IGZpbmRfd2hpdGVfc3BhY2UgKHAwKTsKKyAgICAgIGFyZ19jb3VudCsrOworICAgIH0KKworICBhcmdfc3RydWN0LT5hcmdfYXJyYXlfbGVuID0gYXJnX2NvdW50OworICBhcmdfc3RydWN0LT5hcmdfYXJyYXlfdmFsID0gKGNoYXIgKiopIHhtYWxsb2MgKChhcmdfY291bnQgKyAxKQorCQkJCQkJICogc2l6ZW9mIChjaGFyICopKTsKKworICAvKiBub3cgY29weSBhcmd1bWVudCBzdHJpbmdzIGludG8gYXJnX3N0cnVjdC4gICovCisKKyAgd2hpbGUgKCooYXJnX3N0cmluZyA9IHNraXBfd2hpdGVfc3BhY2UgKGFyZ19zdHJpbmcpKSkKKyAgICB7CisgICAgICBwMCA9IGZpbmRfd2hpdGVfc3BhY2UgKGFyZ19zdHJpbmcpOworICAgICAgYXJnX3N0cnVjdC0+YXJnX2FycmF5X3ZhbFthcmdfaW5kZXgrK10gPSBzYXZlc3RyaW5nIChhcmdfc3RyaW5nLAorCQkJCQkJCSAgIHAwIC0gYXJnX3N0cmluZyk7CisgICAgICBhcmdfc3RyaW5nID0gcDA7CisgICAgfQorCisgIGFyZ19zdHJ1Y3QtPmFyZ19hcnJheV92YWxbYXJnX2NvdW50XSA9IE5VTEw7Cit9CisKKy8qIEFkdmFuY2UgYSBzdHJpbmcgcG9pbnRlciBhY3Jvc3Mgd2hpdGVzcGFjZSBhbmQgcmV0dXJuIGEgcG9pbnRlcgorICAgdG8gdGhlIGZpcnN0IG5vbi13aGl0ZSBjaGFyYWN0ZXIuICAqLworCitzdGF0aWMgY2hhciAqCitza2lwX3doaXRlX3NwYWNlIChwKQorICAgICByZWdpc3RlciBjaGFyICpwOworeworICB3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcpCisgICAgcCsrOworICByZXR1cm4gcDsKK30KKyAgICAKKy8qIFNlYXJjaCBmb3IgdGhlIGZpcnN0IHVucXVvdGVkIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGluIGEgc3RyaW5nLgorICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNoYXJhY3Rlciwgb3IgdG8gdGhlIG51bGwgdGVybWluYXRvcgorICAgaWYgbm8gd2hpdGVzcGFjZSBpcyBmb3VuZC4gICovCisKK3N0YXRpYyBjaGFyICoKK2ZpbmRfd2hpdGVfc3BhY2UgKHApCisgICAgIHJlZ2lzdGVyIGNoYXIgKnA7Cit7CisgIHJlZ2lzdGVyIGludCBjOworCisgIHdoaWxlICgoYyA9ICpwKSAhPSAnICcgJiYgYyAhPSAnXHQnICYmIGMpCisgICAgeworICAgICAgaWYgKGMgPT0gJ1wnJyB8fCBjID09ICciJykKKwl7CisJICB3aGlsZSAoKisrcCAhPSBjICYmICpwKQorCSAgICB7CisJICAgICAgaWYgKCpwID09ICdcXCcpCisJCXArKzsKKwkgICAgfQorCSAgaWYgKCEqcCkKKwkgICAgYnJlYWs7CisJfQorICAgICAgcCsrOworICAgIH0KKyAgcmV0dXJuIHA7Cit9CisgICAgCisvKiBQb2xsIHRoZSBWeFdvcmtzIHRhcmdldCBzeXN0ZW0gZm9yIGFuIGV2ZW50IHJlbGF0ZWQKKyAgIHRvIHRoZSBkZWJ1Z2dlZCB0YXNrLgorICAgUmV0dXJucyAtMSBpZiByZW1vdGUgd2FpdCBmYWlsZWQsIHRhc2sgc3RhdHVzIG90aGVyd2lzZS4gICovCisKK3N0YXRpYyBpbnQKK25ldF93YWl0IChwRXZlbnQpCisgICAgUkRCX0VWRU5UICpwRXZlbnQ7Cit7CisgICAgaW50IHBpZDsKKyAgICBlbnVtIGNsbnRfc3RhdCBzdGF0dXM7CisKKyAgICBtZW1zZXQgKChjaGFyICopIHBFdmVudCwgJ1wwJywgc2l6ZW9mIChSREJfRVZFTlQpKTsKKworICAgIHBpZCA9IGluZmVyaW9yX3BpZDsKKyAgICBzdGF0dXMgPSBuZXRfY2xudF9jYWxsIChQUk9DRVNTX1dBSVQsIHhkcl9pbnQsICZwaWQsIHhkcl9SREJfRVZFTlQsCisJCQkgICAgcEV2ZW50KTsKKworICAgIC8qIHJldHVybiAoc3RhdHVzID09IFJQQ19TVUNDRVNTKT8gcEV2ZW50LT5zdGF0dXM6IC0xOyAqLworICAgIGlmIChzdGF0dXMgPT0gUlBDX1NVQ0NFU1MpCisgICAgICByZXR1cm4gKChwRXZlbnQtPnN0YXR1cykgPyAxIDogMCk7CisgICAgZWxzZSBpZiAoc3RhdHVzID09IFJQQ19USU1FRE9VVCkKKyAgICAgIHJldHVybiAoMSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuICgtMSk7Cit9CisgICAgCisvKiBTdXNwZW5kIHRoZSByZW1vdGUgdGFzay4KKyAgIFJldHVybnMgLTEgaWYgc3VzcGVuZCBmYWlscyBvbiB0YXJnZXQgc3lzdGVtLCAwIG90aGVyd2lzZS4gICovCisKK3N0YXRpYyBpbnQKK25ldF9xdWl0ICgpCit7CisgIGludCBwaWQ7CisgIGludCBxdWl0X3N0YXR1czsKKyAgZW51bSBjbG50X3N0YXQgc3RhdHVzOworCisgIHF1aXRfc3RhdHVzID0gMDsKKworICAvKiBkb24ndCBsZXQgcmRiVGFzayBzdXNwZW5kIGl0c2VsZiBieSBwYXNzaW5nIGEgcGlkIG9mIDAgKi8KKworICBpZiAoKHBpZCA9IGluZmVyaW9yX3BpZCkgPT0gMCkKKyAgICByZXR1cm4gLTE7CisKKyAgc3RhdHVzID0gbmV0X2NsbnRfY2FsbCAoVlhfVEFTS19TVVNQRU5ELCB4ZHJfaW50LCAmcGlkLCB4ZHJfaW50LAorCQkJICAmcXVpdF9zdGF0dXMpOworCisgIHJldHVybiAoc3RhdHVzID09IFJQQ19TVUNDRVNTKT8gcXVpdF9zdGF0dXM6IC0xOworfQorCisvKiBSZWFkIGEgcmVnaXN0ZXIgb3IgcmVnaXN0ZXJzIGZyb20gdGhlIHJlbW90ZSBzeXN0ZW0uICAqLworCit2b2lkCituZXRfcmVhZF9yZWdpc3RlcnMgKHJlZ19idWYsIGxlbiwgcHJvY251bSkKKyAgICAgY2hhciAqcmVnX2J1ZjsKKyAgICAgaW50IGxlbjsKKyAgICAgdV9sb25nIHByb2NudW07Cit7CisgIGludCBzdGF0dXM7CisgIFJwdHJhY2UgcHRyYWNlX2luOworICBQdHJhY2VfcmV0dXJuIHB0cmFjZV9vdXQ7CisgIENfYnl0ZXMgb3V0X2RhdGE7CisgIGNoYXIgbWVzc2FnZVsxMDBdOworCisgIG1lbXNldCAoKGNoYXIgKikgJnB0cmFjZV9pbiwgJ1wwJywgc2l6ZW9mIChwdHJhY2VfaW4pKTsKKyAgbWVtc2V0ICgoY2hhciAqKSAmcHRyYWNlX291dCwgJ1wwJywgc2l6ZW9mIChwdHJhY2Vfb3V0KSk7CisKKyAgLyogSW5pdGlhbGl6ZSBSUEMgaW5wdXQgYXJndW1lbnQgc3RydWN0dXJlLiAgKi8KKworICBwdHJhY2VfaW4ucGlkID0gaW5mZXJpb3JfcGlkOworICBwdHJhY2VfaW4uaW5mby50dHlwZSA9IE5PSU5GTzsKKworICAvKiBJbml0aWFsaXplIFJQQyByZXR1cm4gdmFsdWUgc3RydWN0dXJlLiAgKi8KKworICBvdXRfZGF0YS5ieXRlcyA9IHJlZ19idWY7CisgIG91dF9kYXRhLmxlbiA9IGxlbjsKKyAgcHRyYWNlX291dC5pbmZvLm1vcmVfZGF0YSA9IChjYWRkcl90KSAmb3V0X2RhdGE7CisKKyAgLyogQ2FsbCBSUEM7IHRha2UgYW4gZXJyb3IgZXhpdCBpZiBhcHByb3ByaWF0ZS4gICovCisKKyAgc3RhdHVzID0gbmV0X3B0cmFjZV9jbG50X2NhbGwgKHByb2NudW0sICZwdHJhY2VfaW4sICZwdHJhY2Vfb3V0KTsKKyAgaWYgKHN0YXR1cykKKyAgICBlcnJvciAocnBjZXJyKTsKKyAgaWYgKHB0cmFjZV9vdXQuc3RhdHVzID09IC0xKQorICAgIHsKKyAgICAgIGVycm5vID0gcHRyYWNlX291dC5lcnJub19udW07CisgICAgICBzcHJpbnRmIChtZXNzYWdlLCAicmVhZGluZyAlcyByZWdpc3RlcnMiLCAocHJvY251bSA9PSBQVFJBQ0VfR0VUUkVHUykKKwkJCQkJCSA/ICJnZW5lcmFsLXB1cnBvc2UiCisJCQkJCQkgOiAiZmxvYXRpbmctcG9pbnQiKTsKKyAgICAgIHBlcnJvcl93aXRoX25hbWUgKG1lc3NhZ2UpOworICAgIH0KK30KKworLyogV3JpdGUgcmVnaXN0ZXIgdmFsdWVzIHRvIGEgVnhXb3JrcyB0YXJnZXQuICBSRUdfQlVGIHBvaW50cyB0byBhIGJ1ZmZlcgorICAgY29udGFpbmluZyB0aGUgcmF3IHJlZ2lzdGVyIHZhbHVlcywgTEVOIGlzIHRoZSBsZW5ndGggb2YgUkVHX0JVRiBpbgorICAgYnl0ZXMsIGFuZCBQUk9DTlVNIGlzIHRoZSBSUEMgcHJvY2VkdXJlIG51bWJlciAoUFRSQUNFX1NFVFJFR1Mgb3IKKyAgIFBUUkFDRV9TRVRGUFJFR1MpLiAgQW4gZXJyb3IgZXhpdCBpcyB0YWtlbiBpZiB0aGUgUlBDIGNhbGwgZmFpbHMgb3IKKyAgIGlmIGFuIGVycm9yIHN0YXR1cyBpcyByZXR1cm5lZCBieSB0aGUgcmVtb3RlIGRlYnVnIHNlcnZlci4gIFRoaXMgaXMKKyAgIGEgdXRpbGl0eSByb3V0aW5lIHVzZWQgYnkgdnhfd3JpdGVfcmVnaXN0ZXIgKCkuICAqLworCit2b2lkCituZXRfd3JpdGVfcmVnaXN0ZXJzIChyZWdfYnVmLCBsZW4sIHByb2NudW0pCisgICAgIGNoYXIgKnJlZ19idWY7CisgICAgIGludCBsZW47CisgICAgIHVfbG9uZyBwcm9jbnVtOworeworICBpbnQgc3RhdHVzOworICBScHRyYWNlIHB0cmFjZV9pbjsKKyAgUHRyYWNlX3JldHVybiBwdHJhY2Vfb3V0OworICBDX2J5dGVzIGluX2RhdGE7CisgIGNoYXIgbWVzc2FnZVsxMDBdOworCisgIG1lbXNldCAoKGNoYXIgKikgJnB0cmFjZV9pbiwgJ1wwJywgc2l6ZW9mIChwdHJhY2VfaW4pKTsKKyAgbWVtc2V0ICgoY2hhciAqKSAmcHRyYWNlX291dCwgJ1wwJywgc2l6ZW9mIChwdHJhY2Vfb3V0KSk7CisKKyAgLyogSW5pdGlhbGl6ZSBSUEMgaW5wdXQgYXJndW1lbnQgc3RydWN0dXJlLiAgKi8KKworICBpbl9kYXRhLmJ5dGVzID0gcmVnX2J1ZjsKKyAgaW5fZGF0YS5sZW4gPSBsZW47CisKKyAgcHRyYWNlX2luLnBpZCA9IGluZmVyaW9yX3BpZDsKKyAgcHRyYWNlX2luLmluZm8udHR5cGUgPSBEQVRBOworICBwdHJhY2VfaW4uaW5mby5tb3JlX2RhdGEgPSAoY2FkZHJfdCkgJmluX2RhdGE7CisKKyAgLyogQ2FsbCBSUEM7IHRha2UgYW4gZXJyb3IgZXhpdCBpZiBhcHByb3ByaWF0ZS4gICovCisKKyAgc3RhdHVzID0gbmV0X3B0cmFjZV9jbG50X2NhbGwgKHByb2NudW0sICZwdHJhY2VfaW4sICZwdHJhY2Vfb3V0KTsKKyAgaWYgKHN0YXR1cykKKyAgICBlcnJvciAocnBjZXJyKTsKKyAgaWYgKHB0cmFjZV9vdXQuc3RhdHVzID09IC0xKQorICAgIHsKKyAgICAgIGVycm5vID0gcHRyYWNlX291dC5lcnJub19udW07CisgICAgICBzcHJpbnRmIChtZXNzYWdlLCAid3JpdGluZyAlcyByZWdpc3RlcnMiLCAocHJvY251bSA9PSBQVFJBQ0VfU0VUUkVHUykKKwkJCQkJCSA/ICJnZW5lcmFsLXB1cnBvc2UiCisJCQkJCQkgOiAiZmxvYXRpbmctcG9pbnQiKTsKKyAgICAgIHBlcnJvcl93aXRoX25hbWUgKG1lc3NhZ2UpOworICAgIH0KK30KKworLyogUHJlcGFyZSB0byBzdG9yZSByZWdpc3RlcnMuICBTaW5jZSB3ZSB3aWxsIHN0b3JlIGFsbCBvZiB0aGVtLAorICAgcmVhZCBvdXQgdGhlaXIgY3VycmVudCB2YWx1ZXMgbm93LiAgKi8KKworc3RhdGljIHZvaWQKK3Z4X3ByZXBhcmVfdG9fc3RvcmUgKCkKK3sKKyAgLyogRmV0Y2ggYWxsIHJlZ2lzdGVycywgaWYgYW55IG9mIHRoZW0gYXJlIG5vdCB5ZXQgZmV0Y2hlZC4gICovCisgIHJlYWRfcmVnaXN0ZXJfYnl0ZXMgKDAsIE5VTEwsIFJFR0lTVEVSX0JZVEVTKTsKK30KKworLyogQ29weSBMRU4gYnl0ZXMgdG8gb3IgZnJvbSByZW1vdGUgaW5mZXJpb3IncyBtZW1vcnkgc3RhcnRpbmcgYXQgTUVNQUREUgorICAgdG8gZGVidWdnZXIgbWVtb3J5IHN0YXJ0aW5nIGF0IE1ZQUREUi4gIFdSSVRFIGlzIHRydWUgaWYgd3JpdGluZyB0byB0aGUKKyAgIGluZmVyaW9yLgorICAgUmVzdWx0IGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciByZWFkICh6ZXJvIGlmIGVycm9yKS4gIFRoZQorICAgcHJvdG9jb2wgYWxsb3dzIHVzIHRvIHJldHVybiBhIG5lZ2F0aXZlIGNvdW50LCBpbmRpY2F0aW5nIHRoYXQgd2UgY2FuJ3QKKyAgIGhhbmRsZSB0aGUgY3VycmVudCBhZGRyZXNzIGJ1dCBjYW4gaGFuZGxlIG9uZSBOIGJ5dGVzIGZ1cnRoZXIsIGJ1dAorICAgdnh3b3JrcyBkb2Vzbid0IGdpdmUgdXMgdGhhdCBpbmZvcm1hdGlvbi4gICovCisKK3N0YXRpYyBpbnQKK3Z4X3hmZXJfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbiwgd3JpdGUsIHRhcmdldCkKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IHdyaXRlOworICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0OwkJCS8qIGlnbm9yZWQgKi8KK3sKKyAgaW50IHN0YXR1czsKKyAgUnB0cmFjZSBwdHJhY2VfaW47CisgIFB0cmFjZV9yZXR1cm4gcHRyYWNlX291dDsKKyAgQ19ieXRlcyBkYXRhOworICBlbnVtIHB0cmFjZXJlcSByZXF1ZXN0OworICBpbnQgbmxlZnQsIG54ZmVyOworCisgIG1lbXNldCAoKGNoYXIgKikgJnB0cmFjZV9pbiwgJ1wwJywgc2l6ZW9mIChwdHJhY2VfaW4pKTsKKyAgbWVtc2V0ICgoY2hhciAqKSAmcHRyYWNlX291dCwgJ1wwJywgc2l6ZW9mIChwdHJhY2Vfb3V0KSk7CisKKyAgcHRyYWNlX2luLnBpZCA9IGluZmVyaW9yX3BpZDsJCS8qIFhYWCBwaWQgdW5uZWNlc3NhcnkgZm9yIFJFQUREQVRBICovCisgIHB0cmFjZV9pbi5hZGRyID0gKGludCkgbWVtYWRkcjsJLyogV2hlcmUgZnJvbSAqLworICBwdHJhY2VfaW4uZGF0YSA9IGxlbjsJCQkvKiBIb3cgbWFueSBieXRlcyAqLworCisgIGlmICh3cml0ZSkKKyAgICB7CisgICAgICBwdHJhY2VfaW4uaW5mby50dHlwZSAgICAgPSBEQVRBOworICAgICAgcHRyYWNlX2luLmluZm8ubW9yZV9kYXRhID0gKGNhZGRyX3QpICZkYXRhOworCisgICAgICBkYXRhLmJ5dGVzID0gKGNhZGRyX3QpIG15YWRkcjsJLyogV2hlcmUgZnJvbSAqLworICAgICAgZGF0YS5sZW4gICA9IGxlbjsJCQkvKiBIb3cgbWFueSBieXRlcyAoYWdhaW4sIGZvciBYRFIpICovCisgICAgICByZXF1ZXN0ID0gUFRSQUNFX1dSSVRFREFUQTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwdHJhY2Vfb3V0LmluZm8ubW9yZV9kYXRhID0gKGNhZGRyX3QpICZkYXRhOworICAgICAgcmVxdWVzdCA9IFBUUkFDRV9SRUFEREFUQTsKKyAgICB9CisgIC8qIExvb3AgdW50aWwgdGhlIGVudGlyZSByZXF1ZXN0IGhhcyBiZWVuIHNhdGlzZmllZCwgdHJhbnNmZXJyaW5nCisgICAgIGF0IG1vc3QgVlhfTUVNWEZFUl9NQVggYnl0ZXMgcGVyIGl0ZXJhdGlvbi4gIEJyZWFrIGZyb20gdGhlIGxvb3AKKyAgICAgaWYgYW4gZXJyb3Igc3RhdHVzIGlzIHJldHVybmVkIGJ5IHRoZSByZW1vdGUgZGVidWcgc2VydmVyLiAgKi8KKworICBubGVmdCA9IGxlbjsKKyAgc3RhdHVzID0gMDsKKworICB3aGlsZSAobmxlZnQgPiAwICYmIHN0YXR1cyA9PSAwKQorICAgIHsKKyAgICAgIG54ZmVyID0gbWluIChubGVmdCwgVlhfTUVNWEZFUl9NQVgpOworCisgICAgICBwdHJhY2VfaW4uYWRkciA9IChpbnQpIG1lbWFkZHI7CisgICAgICBwdHJhY2VfaW4uZGF0YSA9IG54ZmVyOworICAgICAgZGF0YS5ieXRlcyA9IChjYWRkcl90KSBteWFkZHI7CisgICAgICBkYXRhLmxlbiA9IG54ZmVyOworCisgICAgICAvKiBSZXF1ZXN0IGEgYmxvY2sgZnJvbSB0aGUgcmVtb3RlIGRlYnVnIHNlcnZlcjsgaWYgUlBDIGZhaWxzLAorICAgICAgICAgcmVwb3J0IGFuIGVycm9yIGFuZCByZXR1cm4gdG8gZGVidWdnZXIgY29tbWFuZCBsZXZlbC4gICovCisKKyAgICAgIGlmIChuZXRfcHRyYWNlX2NsbnRfY2FsbCAocmVxdWVzdCwgJnB0cmFjZV9pbiwgJnB0cmFjZV9vdXQpKQorICAgICAgICBlcnJvciAocnBjZXJyKTsKKworICAgICAgc3RhdHVzID0gcHRyYWNlX291dC5zdGF0dXM7CisgICAgICBpZiAoc3RhdHVzID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBtZW1hZGRyICs9IG54ZmVyOworICAgICAgICAgIG15YWRkciArPSBueGZlcjsKKyAgICAgICAgICBubGVmdCAtPSBueGZlcjsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogQSB0YXJnZXQtc2lkZSBlcnJvciBoYXMgb2N1cnJlZC4gIFNldCBlcnJubyB0byB0aGUgZXJyb3IKKyAgICAgICAgICAgICBjb2RlIGNob3NlbiBieSB0aGUgdGFyZ2V0IHNvIHRoYXQgYSBsYXRlciBwZXJyb3IgKCkgd2lsbAorICAgICAgICAgICAgIHNheSBzb21ldGhpbmcgbWVhbmluZ2Z1bC4gICovCisKKyAgICAgICAgICBlcnJubyA9IHB0cmFjZV9vdXQuZXJybm9fbnVtOworICAgICAgICB9CisgICAgfQorCisgIC8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkLiAgKi8KKworICByZXR1cm4gKGxlbiAtIG5sZWZ0KTsKK30KKworc3RhdGljIHZvaWQKK3Z4X2ZpbGVzX2luZm8gKCkKK3sKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcdEF0dGFjaGVkIHRvIGhvc3QgYCVzJyIsIHZ4X2hvc3QpOworICBwcmludGZfdW5maWx0ZXJlZCAoIiwgd2hpY2ggaGFzICVzZmxvYXRpbmcgcG9pbnQiLCB0YXJnZXRfaGFzX2ZwPyAiIjogIm5vICIpOworICBwcmludGZfdW5maWx0ZXJlZCAoIi5cbiIpOworfQorCitzdGF0aWMgdm9pZAordnhfcnVuX2ZpbGVzX2luZm8gKCkKK3sKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcdFJ1bm5pbmcgJXMgVnhXb3JrcyBwcm9jZXNzICVzIiwgCisJCSAgICAgdnhfcnVubmluZyA/ICJjaGlsZCIgOiAiYXR0YWNoZWQiLAorCQkgICAgIGxvY2FsX2hleF9zdHJpbmcgKGluZmVyaW9yX3BpZCkpOworICBpZiAodnhfcnVubmluZykKKyAgICBwcmludGZfdW5maWx0ZXJlZCAoIiwgZnVuY3Rpb24gYCVzJyIsIHZ4X3J1bm5pbmcpOworICBwcmludGZfdW5maWx0ZXJlZCgiLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCit2eF9yZXN1bWUgKHBpZCwgc3RlcCwgc2lnZ25hbCkKKyAgICAgaW50IHBpZDsKKyAgICAgaW50IHN0ZXA7CisgICAgIGVudW0gdGFyZ2V0X3NpZ25hbCBzaWdnbmFsOworeworICBpbnQgc3RhdHVzOworICBScHRyYWNlIHB0cmFjZV9pbjsKKyAgUHRyYWNlX3JldHVybiBwdHJhY2Vfb3V0OworICBDT1JFX0FERFIgY29udF9hZGRyOworCisgIGlmIChwaWQgPT0gLTEpCisgICAgcGlkID0gaW5mZXJpb3JfcGlkOworCisgIGlmIChzaWdnbmFsICE9IDAgJiYgc2lnZ25hbCAhPSBzdG9wX3NpZ25hbCkKKyAgICBlcnJvciAoIkNhbm5vdCBzZW5kIHNpZ25hbHMgdG8gVnhXb3JrcyBwcm9jZXNzZXMiKTsKKworICAvKiBTZXQgQ09OVF9BRERSIHRvIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHdlIGFyZSBjb250aW51aW5nLAorICAgICBvciB0byAxIGlmIHdlIGFyZSBjb250aW51aW5nIGZyb20gd2hlcmUgdGhlIHByb2dyYW0gc3RvcHBlZC4KKyAgICAgVGhpcyBjb25mb3JtcyB0byB0cmFkaXRpb25hbCBwdHJhY2UgKCkgdXNhZ2UsIGJ1dCBhdCB0aGUgc2FtZQorICAgICB0aW1lIGhhcyBzcGVjaWFsIG1lYW5pbmcgZm9yIHRoZSBWeFdvcmtzIHJlbW90ZSBkZWJ1ZyBzZXJ2ZXIuCisgICAgIElmIHRoZSBhZGRyZXNzIGlzIG5vdCAxLCB0aGUgc2VydmVyIGtub3dzIHRoYXQgdGhlIHRhcmdldAorICAgICBwcm9ncmFtIGlzIGp1bXBpbmcgdG8gYSBuZXcgYWRkcmVzcywgd2hpY2ggcmVxdWlyZXMgc3BlY2lhbAorICAgICBoYW5kbGluZyBpZiB0aGVyZSBpcyBhIGJyZWFrcG9pbnQgYXQgdGhlIG5ldyBhZGRyZXNzLiAgKi8KKworICBjb250X2FkZHIgPSByZWFkX3JlZ2lzdGVyIChQQ19SRUdOVU0pOworICBpZiAoY29udF9hZGRyID09IHN0b3BfcGMpCisgICAgY29udF9hZGRyID0gMTsKKworICBtZW1zZXQgKChjaGFyICopICZwdHJhY2VfaW4sICdcMCcsIHNpemVvZiAocHRyYWNlX2luKSk7CisgIG1lbXNldCAoKGNoYXIgKikgJnB0cmFjZV9vdXQsICdcMCcsIHNpemVvZiAocHRyYWNlX291dCkpOworCisgIHB0cmFjZV9pbi5waWQgPSBwaWQ7CisgIHB0cmFjZV9pbi5hZGRyID0gY29udF9hZGRyOyAvKiBUYXJnZXQgc2lkZSBpbnNpc3RzIG9uIHRoaXMsIG9yIGl0IHBhbmljcy4gICovCisKKyAgaWYgKHN0ZXApCisgICAgc3RhdHVzID0gbmV0X3N0ZXAoKTsKKyAgZWxzZQorICAgIHN0YXR1cyA9IG5ldF9wdHJhY2VfY2xudF9jYWxsIChQVFJBQ0VfQ09OVCwgJnB0cmFjZV9pbiwgJnB0cmFjZV9vdXQpOworCisgIGlmIChzdGF0dXMpCisgICAgZXJyb3IgKHJwY2Vycik7CisgIGlmIChwdHJhY2Vfb3V0LnN0YXR1cyA9PSAtMSkKKyAgICB7CisgICAgICBlcnJubyA9IHB0cmFjZV9vdXQuZXJybm9fbnVtOworICAgICAgcGVycm9yX3dpdGhfbmFtZSAoIlJlc3VtaW5nIHJlbW90ZSBwcm9jZXNzIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAordnhfbW91cm5faW5mZXJpb3IgKCkKK3sKKyAgcG9wX3RhcmdldCAoKTsJCS8qIFBvcCBiYWNrIHRvIG5vLWNoaWxkIHN0YXRlICovCisgIGdlbmVyaWNfbW91cm5faW5mZXJpb3IgKCk7Cit9CisKKwwKK3N0YXRpYyB2b2lkIHZ4X2FkZF9zeW1ib2xzIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBDT1JFX0FERFIsIENPUkVfQUREUiwKKwkJCQkgICAgQ09SRV9BRERSKSk7CisKK3N0cnVjdCBmaW5kX3NlY3RfYXJncyB7CisgIENPUkVfQUREUiB0ZXh0X3N0YXJ0OworICBDT1JFX0FERFIgZGF0YV9zdGFydDsKKyAgQ09SRV9BRERSIGJzc19zdGFydDsKK307CisKK3N0YXRpYyB2b2lkIGZpbmRfc2VjdCBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgdm9pZCAqKSk7CisKK3N0YXRpYyB2b2lkCitmaW5kX3NlY3QgKGFiZmQsIHNlY3QsIG9iaikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdDsKKyAgICAgUFRSIG9iajsKK3sKKyAgc3RydWN0IGZpbmRfc2VjdF9hcmdzICphcmdzID0gKHN0cnVjdCBmaW5kX3NlY3RfYXJncyAqKW9iajsKKworICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWN0KSAmIChTRUNfQ09ERSAmIFNFQ19SRUFET05MWSkpCisgICAgYXJncy0+dGV4dF9zdGFydCA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3QpOworICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3QpICYgU0VDX0FMTE9DKQorICAgIHsKKyAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3QpICYgU0VDX0xPQUQpCisJeworCSAgLyogRXhjbHVkZSAuY3RvciBhbmQgLmR0b3Igc2VjdGlvbnMgd2hpY2ggaGF2ZSBTRUNfQ09ERSBzZXQgYnV0IG5vdAorCSAgICAgU0VDX0RBVEEuICAqLworCSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdCkgJiBTRUNfREFUQSkKKwkgICAgYXJncy0+ZGF0YV9zdGFydCA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3QpOworCX0KKyAgICAgIGVsc2UKKwlhcmdzLT5ic3Nfc3RhcnQgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit2eF9hZGRfc3ltYm9scyAobmFtZSwgZnJvbV90dHksIHRleHRfYWRkciwgZGF0YV9hZGRyLCBic3NfYWRkcikKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgaW50IGZyb21fdHR5OworICAgICBDT1JFX0FERFIgdGV4dF9hZGRyOworICAgICBDT1JFX0FERFIgZGF0YV9hZGRyOworICAgICBDT1JFX0FERFIgYnNzX2FkZHI7Cit7CisgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKm9mZnM7CisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICBzdHJ1Y3QgZmluZF9zZWN0X2FyZ3Mgc3M7CisKKyAgLyogSXQgbWlnaHQgYmUgbmljZSB0byBzdXBwcmVzcyB0aGUgYnJlYWtwb2ludF9yZV9zZXQgd2hpY2ggaGFwcGVucyBoZXJlCisgICAgIGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIGRvIG9uZSBhZ2FpbiBhZnRlciB0aGUgb2JqZmlsZV9yZWxvY2F0ZS4gICovCisgIG9iamZpbGUgPSBzeW1ib2xfZmlsZV9hZGQgKG5hbWUsIGZyb21fdHR5LCAwLCAwLCAwLCAwLCAwLCAwKTsKKworICAvKiBUaGlzIGlzIGEgKHNsaWdodGx5IGNoZWVzeSkgd2F5IG9mIHN1cGVyY2VkaW5nIHRoZSBvbGQgc3ltYm9scy4gIEEgbGVzcworICAgICBjaGVlc3kgd2F5IHdvdWxkIGJlIHRvIGZpbmQgdGhlIG9iamZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZAorICAgICBmcmVlX29iamZpbGUgaXQuICAqLworICBvYmpmaWxlX3RvX2Zyb250IChvYmpmaWxlKTsKKworICBvZmZzID0gKHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKikKKyAgICBhbGxvY2EgKHNpemVvZiAoc3RydWN0IHNlY3Rpb25fb2Zmc2V0cykKKwkgICAgKyBvYmpmaWxlLT5udW1fc2VjdGlvbnMgKiBzaXplb2YgKG9mZnMtPm9mZnNldHMpKTsKKyAgbWVtY3B5IChvZmZzLCBvYmpmaWxlLT5zZWN0aW9uX29mZnNldHMsCisJICBzaXplb2YgKHN0cnVjdCBzZWN0aW9uX29mZnNldHMpCisJICArIG9iamZpbGUtPm51bV9zZWN0aW9ucyAqIHNpemVvZiAob2Zmcy0+b2Zmc2V0cykpOworCisgIHNzLnRleHRfc3RhcnQgPSAwOworICBzcy5kYXRhX3N0YXJ0ID0gMDsKKyAgc3MuYnNzX3N0YXJ0ID0gMDsKKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChvYmpmaWxlLT5vYmZkLCBmaW5kX3NlY3QsICZzcyk7CisKKyAgLyogQm90aCBDT0ZGIGFuZCBiLm91dCBmcm9udGVuZHMgdXNlIHRoZXNlIFNFQ1RfT0ZGXyogdmFsdWVzLiAgKi8KKyAgQU5PRkZTRVQgKG9mZnMsIFNFQ1RfT0ZGX1RFWFQpID0gdGV4dF9hZGRyIC0gc3MudGV4dF9zdGFydDsKKyAgQU5PRkZTRVQgKG9mZnMsIFNFQ1RfT0ZGX0RBVEEpID0gZGF0YV9hZGRyIC0gc3MuZGF0YV9zdGFydDsKKyAgQU5PRkZTRVQgKG9mZnMsIFNFQ1RfT0ZGX0JTUykgPSBic3NfYWRkciAtIHNzLmJzc19zdGFydDsKKyAgb2JqZmlsZV9yZWxvY2F0ZSAob2JqZmlsZSwgb2Zmcyk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBhZGRpdGlvbiBvZiBpbmNyZW1lbnRhbGx5IGxpbmtlZCBvYmplY3QgZmlsZXMuICAqLworCitzdGF0aWMgdm9pZAordnhfbG9hZF9jb21tYW5kIChhcmdfc3RyaW5nLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnX3N0cmluZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBDT1JFX0FERFIgdGV4dF9hZGRyOworICBDT1JFX0FERFIgZGF0YV9hZGRyOworICBDT1JFX0FERFIgYnNzX2FkZHI7CisKKyAgaWYgKGFyZ19zdHJpbmcgPT0gMCkKKyAgICBlcnJvciAoIlRoZSBsb2FkIGNvbW1hbmQgdGFrZXMgYSBmaWxlIG5hbWUiKTsKKworICBhcmdfc3RyaW5nID0gdGlsZGVfZXhwYW5kIChhcmdfc3RyaW5nKTsKKyAgbWFrZV9jbGVhbnVwIChmcmVlLCBhcmdfc3RyaW5nKTsKKworICBkb250X3JlcGVhdCAoKTsKKworICAvKiBSZWZ1c2UgdG8gbG9hZCB0aGUgbW9kdWxlIGlmIGEgZGVidWdnZWQgdGFzayBpcyBydW5uaW5nLiAgRG9pbmcgc28KKyAgICAgY2FuIGhhdmUgYSBudW1iZXIgb2YgdW5wbGVhc2FudCBjb25zZXF1ZW5jZXMgdG8gdGhlIHJ1bm5pbmcgdGFzay4gICovCisKKyAgaWYgKGluZmVyaW9yX3BpZCAhPSAwICYmIHRhcmdldF9oYXNfZXhlY3V0aW9uKQorICAgIHsKKyAgICAgIGlmIChxdWVyeSAoIllvdSBtYXkgbm90IGxvYWQgYSBtb2R1bGUgd2hpbGUgdGhlIHRhcmdldCB0YXNrIGlzIHJ1bm5pbmcuXG5cCitLaWxsIHRoZSB0YXJnZXQgdGFzaz8gIikpCisgICAgICAgIHRhcmdldF9raWxsICgpOworICAgICAgZWxzZQorICAgICAgICBlcnJvciAoIkxvYWQgY2FuY2VsbGVkLiIpOworICAgIH0KKworICBRVUlUOworICBpbW1lZGlhdGVfcXVpdCsrOworICBpZiAobmV0X2xvYWQgKGFyZ19zdHJpbmcsICZ0ZXh0X2FkZHIsICZkYXRhX2FkZHIsICZic3NfYWRkcikgPT0gLTEpCisgICAgZXJyb3IgKCJMb2FkIGZhaWxlZCBvbiB0YXJnZXQgbWFjaGluZSIpOworICBpbW1lZGlhdGVfcXVpdC0tOworCisgIHZ4X2FkZF9zeW1ib2xzIChhcmdfc3RyaW5nLCBmcm9tX3R0eSwgdGV4dF9hZGRyLCBkYXRhX2FkZHIsIGJzc19hZGRyKTsKKworICAvKiBHZXR0aW5nIG5ldyBzeW1ib2xzIG1heSBjaGFuZ2Ugb3VyIG9waW5pb24gYWJvdXQgd2hhdCBpcworICAgICBmcmFtZWxlc3MuICAqLworICByZWluaXRfZnJhbWVfY2FjaGUgKCk7Cit9CisKKy8qIFNpbmdsZSBzdGVwIHRoZSB0YXJnZXQgcHJvZ3JhbSBhdCB0aGUgc291cmNlIG9yIG1hY2hpbmUgbGV2ZWwuCisgICBUYWtlcyBhbiBlcnJvciBleGl0IGlmIHJwYyBmYWlscy4KKyAgIFJldHVybnMgLTEgaWYgcmVtb3RlIHNpbmdsZS1zdGVwIG9wZXJhdGlvbiBmYWlscywgZWxzZSAwLiAgKi8KKworc3RhdGljIGludAorbmV0X3N0ZXAgKCkKK3sKKyAgZW51bSBjbG50X3N0YXQgc3RhdHVzOworICBpbnQgc3RlcF9zdGF0dXM7CisgIFNPVVJDRV9TVEVQIHNvdXJjZV9zdGVwOworCisgIHNvdXJjZV9zdGVwLnRhc2tJZCA9IGluZmVyaW9yX3BpZDsKKworICBpZiAoc3RlcF9yYW5nZV9lbmQpCisgICAgeworICAgICAgc291cmNlX3N0ZXAuc3RhcnRBZGRyID0gc3RlcF9yYW5nZV9zdGFydDsKKyAgICAgIHNvdXJjZV9zdGVwLmVuZEFkZHIgPSBzdGVwX3JhbmdlX2VuZDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzb3VyY2Vfc3RlcC5zdGFydEFkZHIgPSAwOworICAgICAgc291cmNlX3N0ZXAuZW5kQWRkciA9IDA7CisgICAgfQorCisgIHN0YXR1cyA9IG5ldF9jbG50X2NhbGwgKFZYX1NPVVJDRV9TVEVQLCB4ZHJfU09VUkNFX1NURVAsICZzb3VyY2Vfc3RlcCwKKwkJCSAgeGRyX2ludCwgJnN0ZXBfc3RhdHVzKTsKKworICBpZiAoc3RhdHVzID09IFJQQ19TVUNDRVNTKQorICAgIHJldHVybiBzdGVwX3N0YXR1czsKKyAgZWxzZSAKKyAgICBlcnJvciAocnBjZXJyKTsKK30KKworLyogRW11bGF0ZSBwdHJhY2UgdXNpbmcgUlBDIGNhbGxzIHRvIHRoZSBWeFdvcmtzIHRhcmdldCBzeXN0ZW0uCisgICBSZXR1cm5zIG5vbnplcm8gKC0xKSBpZiBSUEMgc3RhdHVzIHRvIFZ4V29ya3MgaXMgYmFkLCAwIG90aGVyd2lzZS4gICovCisKK3N0YXRpYyBpbnQKK25ldF9wdHJhY2VfY2xudF9jYWxsIChyZXF1ZXN0LCBwUHRyYWNlSW4sIHBQdHJhY2VPdXQpCisgICAgZW51bSBwdHJhY2VyZXEgcmVxdWVzdDsKKyAgICBScHRyYWNlICpwUHRyYWNlSW47CisgICAgUHRyYWNlX3JldHVybiAqcFB0cmFjZU91dDsKK3sKKyAgZW51bSBjbG50X3N0YXQgc3RhdHVzOworCisgIHN0YXR1cyA9IG5ldF9jbG50X2NhbGwgKHJlcXVlc3QsIHhkcl9ycHRyYWNlLCBwUHRyYWNlSW4sIHhkcl9wdHJhY2VfcmV0dXJuLAorCQkJICBwUHRyYWNlT3V0KTsKKworICBpZiAoc3RhdHVzICE9IFJQQ19TVUNDRVNTKQorICAgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAwOworfQorCisvKiBRdWVyeSB0aGUgdGFyZ2V0IGZvciB0aGUgbmFtZSBvZiB0aGUgZmlsZSBmcm9tIHdoaWNoIFZ4V29ya3Mgd2FzCisgICBib290ZWQuICBwQm9vdEZpbGUgaXMgdGhlIGFkZHJlc3Mgb2YgYSBwb2ludGVyIHRvIHRoZSBidWZmZXIgdG8KKyAgIHJlY2VpdmUgdGhlIGZpbGUgbmFtZTsgaWYgdGhlIHBvaW50ZXIgcG9pbnRlZCB0byBieSBwQm9vdEZpbGUgaXMgCisgICBOVUxMLCBtZW1vcnkgZm9yIHRoZSBidWZmZXIgd2lsbCBiZSBhbGxvY2F0ZWQgYnkgWERSLgorICAgUmV0dXJucyAtMSBpZiBycGMgZmFpbGVkLCAwIG90aGVyd2lzZS4gICovCisKK3N0YXRpYyBpbnQKK25ldF9nZXRfYm9vdF9maWxlIChwQm9vdEZpbGUpCisgICAgIGNoYXIgKipwQm9vdEZpbGU7Cit7CisgIGVudW0gY2xudF9zdGF0IHN0YXR1czsKKworICBzdGF0dXMgPSBuZXRfY2xudF9jYWxsIChWWF9CT09UX0ZJTEVfSU5RLCB4ZHJfdm9pZCwgKGNoYXIgKikgMCwKKwkJCSAgeGRyX3dyYXBzdHJpbmcsIHBCb290RmlsZSk7CisgIHJldHVybiAoc3RhdHVzID09IFJQQ19TVUNDRVNTKSA/IDAgOiAtMTsKK30KKworLyogRmV0Y2ggYSBsaXN0IG9mIGxvYWRlZCBvYmplY3QgbW9kdWxlcyBmcm9tIHRoZSBWeFdvcmtzIHRhcmdldC4KKyAgIFJldHVybnMgLTEgaWYgcnBjIGZhaWxlZCwgMCBvdGhlcndpc2UKKyAgIFRoZXJlJ3Mgbm8gd2F5IHRvIGNoZWNrIGlmIHRoZSByZXR1cm5lZCBsb2FkVGFibGUgaXMgY29ycmVjdC4KKyAgIFZ4V29ya3MgZG9lc24ndCBjaGVjayBpdC4gICovCisKK3N0YXRpYyBpbnQKK25ldF9nZXRfc3ltYm9scyAocExvYWRUYWJsZSkKKyAgICAgbGR0YWJsICpwTG9hZFRhYmxlOwkJLyogcmV0dXJuIHBvaW50ZXIgdG8gbGR0YWJsIGhlcmUgKi8KK3sKKyAgZW51bSBjbG50X3N0YXQgc3RhdHVzOworCisgIG1lbXNldCAoKGNoYXIgKikgcExvYWRUYWJsZSwgJ1wwJywgc2l6ZW9mIChzdHJ1Y3QgbGR0YWJsKSk7CisKKyAgc3RhdHVzID0gbmV0X2NsbnRfY2FsbCAoVlhfU1RBVEVfSU5RLCB4ZHJfdm9pZCwgMCwgeGRyX2xkdGFibCwgcExvYWRUYWJsZSk7CisgIHJldHVybiAoc3RhdHVzID09IFJQQ19TVUNDRVNTKSA/IDAgOiAtMTsKK30KKworLyogTG9vayB1cCBhIHN5bWJvbCBpbiB0aGUgVnhXb3JrcyB0YXJnZXQncyBzeW1ib2wgdGFibGUuCisgICBSZXR1cm5zIHN0YXR1cyBvZiBzeW1ib2wgcmVhZCBvbiB0YXJnZXQgc2lkZSAoMD1zdWNjZXNzLCAtMT1mYWlsKQorICAgUmV0dXJucyAtMSBhbmQgY29tcGxhaW4oKXMgaWYgcnBjIGZhaWxzLiAgKi8KKworc3RydWN0IGNvbXBsYWludCBjYW50X2NvbnRhY3RfdGFyZ2V0ID0KKyAgeyJMb3N0IGNvbnRhY3Qgd2l0aCBWeFdvcmtzIHRhcmdldCIsIDAsIDB9OworCitzdGF0aWMgaW50Cit2eF9sb29rdXBfc3ltYm9sIChuYW1lLCBwQWRkcikKKyAgICAgY2hhciAqbmFtZTsJCS8qIHN5bWJvbCBuYW1lICovCisgICAgIENPUkVfQUREUiAqcEFkZHI7Cit7CisgIGVudW0gY2xudF9zdGF0IHN0YXR1czsKKyAgU1lNQk9MX0FERFIgc3ltYm9sQWRkcjsKKworICAqcEFkZHIgPSAwOworICBtZW1zZXQgKChjaGFyICopICZzeW1ib2xBZGRyLCAnXDAnLCBzaXplb2YgKHN5bWJvbEFkZHIpKTsKKworICBzdGF0dXMgPSBuZXRfY2xudF9jYWxsIChWWF9TWU1CT0xfSU5RLCB4ZHJfd3JhcHN0cmluZywgJm5hbWUsCisJCQkgIHhkcl9TWU1CT0xfQUREUiwgJnN5bWJvbEFkZHIpOworICBpZiAoc3RhdHVzICE9IFJQQ19TVUNDRVNTKQorICAgIHsKKyAgICAgIGNvbXBsYWluICgmY2FudF9jb250YWN0X3RhcmdldCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICpwQWRkciA9IHN5bWJvbEFkZHIuYWRkcjsKKyAgcmV0dXJuIHN5bWJvbEFkZHIuc3RhdHVzOworfQorCisvKiBDaGVjayB0byBzZWUgaWYgdGhlIFZ4V29ya3MgdGFyZ2V0IGhhcyBhIGZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yLgorICAgUmV0dXJucyAxIGlmIHRhcmdldCBoYXMgZmxvYXRpbmcgcG9pbnQgcHJvY2Vzc29yLCAwIG90aGVyd2lzZS4KKyAgIENhbGxzIGVycm9yKCkgaWYgcnBjIGZhaWxzLiAgKi8KKworc3RhdGljIGludAorbmV0X2NoZWNrX2Zvcl9mcCAoKQoreworICBlbnVtIGNsbnRfc3RhdCBzdGF0dXM7CisgIGJvb2xfdCBmcCA9IDA7CS8qIHRydWUgaWYgZnAgcHJvY2Vzc29yIGlzIHByZXNlbnQgb24gdGFyZ2V0IGJvYXJkICovCisKKyAgc3RhdHVzID0gbmV0X2NsbnRfY2FsbCAoVlhfRlBfSU5RVUlSRSwgeGRyX3ZvaWQsIDAsIHhkcl9ib29sLCAmZnApOworICBpZiAoc3RhdHVzICE9IFJQQ19TVUNDRVNTKQorICAgIGVycm9yIChycGNlcnIpOworCisgICByZXR1cm4gKGludCkgZnA7Cit9CisKKy8qIEVzdGFibGlzaCBhbiBSUEMgY29ubmVjdGlvbiB3aXRoIHRoZSBWeFdvcmtzIHRhcmdldCBzeXN0ZW0uCisgICBDYWxscyBlcnJvciAoKSBpZiB1bmFibGUgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb24uICAqLworCitzdGF0aWMgdm9pZAorbmV0X2Nvbm5lY3QgKGhvc3QpCisgICAgIGNoYXIgKmhvc3Q7Cit7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBkZXN0QWRkcjsKKyAgc3RydWN0IGhvc3RlbnQgKmRlc3RIb3N0OworICB1bnNpZ25lZCBsb25nIGFkZHI7CisKKyAgLyogR2V0IHRoZSBpbnRlcm5ldCBhZGRyZXNzIGZvciB0aGUgZ2l2ZW4gaG9zdC4gIEFsbG93IGEgbnVtZXJpYworICAgICBJUCBhZGRyZXNzIG9yIGEgaG9zdG5hbWUuICAqLworCisgIGFkZHIgPSBpbmV0X2FkZHIgKGhvc3QpOworICBpZiAoYWRkciA9PSAtMSkKKyAgICB7CisgICAgICBkZXN0SG9zdCA9IChzdHJ1Y3QgaG9zdGVudCAqKSBnZXRob3N0YnluYW1lIChob3N0KTsKKyAgICAgIGlmIChkZXN0SG9zdCA9PSBOVUxMKQorCS8qIEZJWE1FOiBQcm9iYWJseSBzaG91bGQgaW5jbHVkZSBob3N0bmFtZSBoZXJlIGluIHF1b3Rlcy4KKwkgICBGb3IgZXhhbXBsZSBpZiB0aGUgdXNlciB0eXBlcyAidGFyZ2V0IHZ4d29ya3Mgdng5NjAgIiBpdCBzaG91bGQKKwkgICBzYXkgIkludmFsaWQgaG9zdCBgdng5NjAgJy4iIG5vdCBqdXN0ICJJbnZhbGlkIGhvc3RuYW1lIi4gICovCisJZXJyb3IgKCJJbnZhbGlkIGhvc3RuYW1lLiAgQ291bGRuJ3QgZmluZCByZW1vdGUgaG9zdCBhZGRyZXNzLiIpOworICAgICAgYWRkciA9ICogKHVuc2lnbmVkIGxvbmcgKikgZGVzdEhvc3QtPmhfYWRkcjsKKyAgICB9CisKKyAgbWVtc2V0ICgmZGVzdEFkZHIsICdcMCcsIHNpemVvZiAoZGVzdEFkZHIpKTsKKworICBkZXN0QWRkci5zaW5fYWRkci5zX2FkZHIgPSBhZGRyOworICBkZXN0QWRkci5zaW5fZmFtaWx5ICAgICAgPSBBRl9JTkVUOworICBkZXN0QWRkci5zaW5fcG9ydCAgICAgICAgPSAwOwkvKiBzZXQgdG8gYWN0dWFsIHBvcnQgdGhhdCByZW1vdGUKKwkJCSAgICAgICAgICAgcHRyYWNlIGlzIGxpc3RlbmluZyBvbi4gICovCisKKyAgLyogQ3JlYXRlIGEgdGNwIGNsaWVudCB0cmFuc3BvcnQgb24gd2hpY2ggdG8gaXNzdWUKKyAgICAgY2FsbHMgdG8gdGhlIHJlbW90ZSBwdHJhY2Ugc2VydmVyLiAgKi8KKworICBwdHJhY2VTb2NrID0gUlBDX0FOWVNPQ0s7CisgIHBDbGllbnQgPSBjbG50dGNwX2NyZWF0ZSAoJmRlc3RBZGRyLCBSREJQUk9HLCBSREJWRVJTLCAmcHRyYWNlU29jaywgMCwgMCk7CisgIC8qIEZJWE1FLCBoZXJlIGlzIHdoZXJlIHdlIGRlYWwgd2l0aCBkaWZmZXJlbnQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZQorICAgICBwcm90byAqLworCisgIGlmIChwQ2xpZW50ID09IE5VTEwpCisgICAgeworICAgICAgY2xudF9wY3JlYXRlZXJyb3IgKCJcdG5ldF9jb25uZWN0Iik7CisgICAgICBlcnJvciAoIkNvdWxkbid0IGNvbm5lY3QgdG8gcmVtb3RlIHRhcmdldC4iKTsKKyAgICB9Cit9CisMCisvKiBTbGVlcCBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIAorICogKGFzc3VtZWQgdG8gYmUgbGVzcyB0aGFuIDEwMDApLgorICogSWYgc2VsZWN0ICgpIGlzIGludGVycnVwdGVkLCByZXR1cm5zIGltbWVkaWF0ZWx5OworICogdGFrZXMgYW4gZXJyb3IgZXhpdCBpZiBzZWxlY3QgKCkgZmFpbHMgZm9yIHNvbWUgb3RoZXIgcmVhc29uLgorICovCisKK3N0YXRpYyB2b2lkCitzbGVlcF9tcyAobXMpCisgICAgIGxvbmcgbXM7Cit7CisgIHN0cnVjdCB0aW1ldmFsIHNlbGVjdF90aW1lb3V0OworICBpbnQgc3RhdHVzOworCisgIHNlbGVjdF90aW1lb3V0LnR2X3NlYyA9IDA7CisgIHNlbGVjdF90aW1lb3V0LnR2X3VzZWMgPSBtcyAqIDEwMDA7CisKKyAgc3RhdHVzID0gc2VsZWN0ICgwLCAoZmRfc2V0ICopIDAsIChmZF9zZXQgKikgMCwgKGZkX3NldCAqKSAwLAorCQkgICAmc2VsZWN0X3RpbWVvdXQpOworCisgIGlmIChzdGF0dXMgPCAwICYmIGVycm5vICE9IEVJTlRSKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJzZWxlY3QiKTsKK30KKworc3RhdGljIGludAordnhfd2FpdCAocGlkX3RvX3dhaXRfZm9yLCBzdGF0dXMpCisgICAgIGludCBwaWRfdG9fd2FpdF9mb3I7CisgICAgIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqc3RhdHVzOworeworICByZWdpc3RlciBpbnQgcGlkOworICBSREJfRVZFTlQgcmRiRXZlbnQ7CisgIGludCBxdWl0X2ZhaWxlZDsKKworICBkbworICAgIHsKKyAgICAgIC8qIElmIENUUkwtQyBpcyBoaXQgZHVyaW5nIHRoaXMgbG9vcCwKKwkgc3VzcGVuZCB0aGUgaW5mZXJpb3IgcHJvY2Vzcy4gICovCisKKyAgICAgIHF1aXRfZmFpbGVkID0gMDsKKyAgICAgIGlmIChxdWl0X2ZsYWcpCisJeworCSAgcXVpdF9mYWlsZWQgPSAobmV0X3F1aXQgKCkgPT0gLTEpOworCSAgcXVpdF9mbGFnID0gMDsKKwl9CisKKyAgICAgIC8qIElmIGEgbmV0X3F1aXQgKCkgb3IgbmV0X3dhaXQgKCkgY2FsbCBoYXMgZmFpbGVkLAorCSBhbGxvdyB0aGUgdXNlciB0byBicmVhayB0aGUgY29ubmVjdGlvbiB3aXRoIHRoZSB0YXJnZXQuCisJIFdlIGNhbid0IHNpbXBseSBlcnJvciAoKSBvdXQgb2YgdGhpcyBsb29wLCBzaW5jZSB0aGUgCisJIGRhdGEgc3RydWN0dXJlcyByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoZSBpbmZlcmlvcgorCSBhcmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiAgKi8KKworICAgICAgaWYgKHF1aXRfZmFpbGVkIHx8IG5ldF93YWl0ICgmcmRiRXZlbnQpID09IC0xKQorCXsKKwkgIHRlcm1pbmFsX291cnMgKCk7CisJICBpZiAocXVlcnkgKCJDYW4ndCAlcy4gIERpc2Nvbm5lY3QgZnJvbSB0YXJnZXQgc3lzdGVtPyAiLAorCQkgICAgIChxdWl0X2ZhaWxlZCkgPyAic3VzcGVuZCByZW1vdGUgdGFzayIKKwkJICAgICAgICAgICAgICAgICAgIDogImdldCBzdGF0dXMgb2YgcmVtb3RlIHRhc2siKSkKKwkgICAgeworCSAgICAgIHRhcmdldF9tb3Vybl9pbmZlcmlvcigpOworCSAgICAgIGVycm9yICgiVXNlIHRoZSBcInRhcmdldFwiIGNvbW1hbmQgdG8gcmVjb25uZWN0LiIpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB0ZXJtaW5hbF9pbmZlcmlvciAoKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCX0KKyAgICAgIAorICAgICAgcGlkID0gcmRiRXZlbnQudGFza0lkOworICAgICAgaWYgKHBpZCA9PSAwKQorCXsKKwkgIHNsZWVwX21zICgyMDApOwkvKiBGSVhNRSBEb24ndCBraWxsIHRoZSBuZXR3b3JrIHRvbyBiYWRseSAqLworCX0KKyAgICAgIGVsc2UgaWYgKHBpZCAhPSBpbmZlcmlvcl9waWQpCisJZmF0YWwgKCJCYWQgcGlkIGZvciBkZWJ1Z2dlZCB0YXNrOiAlc1xuIiwKKwkgICAgICAgbG9jYWxfaGV4X3N0cmluZygodW5zaWduZWQgbG9uZykgcGlkKSk7CisgICAgfSB3aGlsZSAocGlkID09IDApOworCisgIC8qIFRoZSBtb3N0bHkgbGlrZWx5IGtpbmQuICAqLworICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKworICBzd2l0Y2ggKHJkYkV2ZW50LmV2ZW50VHlwZSkKKyAgICB7CisgICAgY2FzZSBFVkVOVF9FWElUOgorICAgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0VYSVRFRDsKKyAgICAgIC8qIEZJWE1FIGlzIGl0IHBvc3NpYmxlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYQorCSBub3JtYWwgdnMgYWJub3JtYWwgZXhpdCBpbiBWeFdvcmtzPyAqLworICAgICAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFVkVOVF9TVEFSVDoKKyAgICAgIC8qIFRhc2sgd2FzIGp1c3Qgc3RhcnRlZC4gKi8KKyAgICAgIHN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVWRU5UX1NUT1A6CisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVFJBUDsKKyAgICAgIC8qIFhYWCB3YXMgaXQgc3RvcHBlZCBieSBhIHNpZ25hbD8gIGFjdCBhY2NvcmRpbmdseSAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVWRU5UX0JSRUFLOgkJLyogQnJlYWtwb2ludCB3YXMgaGl0LiAqLworICAgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1RSQVA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRVZFTlRfU1VTUEVORDoJCS8qIFRhc2sgd2FzIHN1c3BlbmRlZCwgcHJvYmFibHkgYnkgXkMuICovCisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfSU5UOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVWRU5UX0JVU19FUlI6CQkvKiBUYXNrIG1hZGUgZXZpbCBuYXN0eSByZWZlcmVuY2UuICovCisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfQlVTOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVWRU5UX1pFUk9fRElWOgkvKiBEaXZpc2lvbiBieSB6ZXJvICovCisgICAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfRlBFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVWRU5UX1NJR05BTDoKKyNpZmRlZiBJODA5NjAKKyAgICAgIHN0YXR1cy0+dmFsdWUuc2lnID0gaTk2MF9mYXVsdF90b19zaWduYWwgKHJkYkV2ZW50LnNpZ1R5cGUpOworI2Vsc2UKKyAgICAgIC8qIEJhY2sgaW4gdGhlIG9sZCBkYXlzLCBiZWZvcmUgZW51bSB0YXJnZXRfc2lnbmFsLCB0aGlzIGNvZGUgdXNlZAorCSB0byBhZGQgTlNJRyB0byB0aGUgc2lnbmFsIG51bWJlciBhbmQgY2xhaW0gdGhhdCBQUklOVF9SQU5ET01fU0lHTkFMCisJIHdvdWxkIHRha2UgY2FyZSBvZiBpdC4gIEJ1dCBQUklOVF9SQU5ET01fU0lHTkFMIGhhcyBuZXZlciBiZWVuCisJIGRlZmluZWQgZXhjZXB0IG9uIHRoZSBpOTYwLCBzbyBJIGRvbid0IHJlYWxseSBrbm93IHdoYXQgd2UgYXJlCisJIHN1cHBvc2VkIHRvIGRvIG9uIG90aGVyIGFyY2hpdGVjdHVyZXMuICAqLworICAgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1VOS05PV047CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIH0gLyogc3dpdGNoICovCisgIHJldHVybiBwaWQ7Cit9CisMCitzdGF0aWMgaW50CitzeW1ib2xfc3R1YiAoYXJnKQorICAgICBjaGFyICphcmc7Cit7CisgIHN5bWJvbF9maWxlX2NvbW1hbmQgKGFyZywgMCk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CithZGRfc3ltYm9sX3N0dWIgKGFyZykKKyAgICAgY2hhciAqYXJnOworeworICBzdHJ1Y3QgbGRmaWxlICpwTG9hZEZpbGUgPSAoc3RydWN0IGxkZmlsZSAqKWFyZzsKKworICBwcmludGZfdW5maWx0ZXJlZCgiXHQlczogIiwgcExvYWRGaWxlLT5uYW1lKTsKKyAgdnhfYWRkX3N5bWJvbHMgKHBMb2FkRmlsZS0+bmFtZSwgMCwgcExvYWRGaWxlLT50eHRfYWRkciwKKwkJICBwTG9hZEZpbGUtPmRhdGFfYWRkciwgcExvYWRGaWxlLT5ic3NfYWRkcik7CisgIHByaW50Zl91bmZpbHRlcmVkICgib2tcbiIpOworICByZXR1cm4gMTsKK30KKy8qIFRhcmdldCBjb21tYW5kIGZvciBWeFdvcmtzIHRhcmdldCBzeXN0ZW1zLgorCisgICBVc2VkIGluIHZ4Z2RiLiAgVGFrZXMgdGhlIG5hbWUgb2YgYSByZW1vdGUgdGFyZ2V0IG1hY2hpbmUKKyAgIHJ1bm5pbmcgdnhXb3JrcyBhbmQgY29ubmVjdHMgdG8gaXQgdG8gaW5pdGlhbGl6ZSByZW1vdGUgbmV0d29yaworICAgZGVidWdnaW5nLiAgKi8KKworc3RhdGljIHZvaWQKK3Z4X29wZW4gKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGV4dGVybiBpbnQgY2xvc2UgKCk7CisgIGNoYXIgKmJvb3RGaWxlOworICBleHRlcm4gY2hhciAqc291cmNlX3BhdGg7CisgIHN0cnVjdCBsZHRhYmwgbG9hZFRhYmxlOworICBzdHJ1Y3QgbGRmaWxlICpwTG9hZEZpbGU7CisgIGludCBpOworICBleHRlcm4gQ0xJRU5UICpwQ2xpZW50OworICBpbnQgc3ltYm9sc19hZGRlZCA9IDA7CisKKyAgaWYgKCFhcmdzKQorICAgIGVycm9yX25vX2FyZyAoInRhcmdldCBtYWNoaW5lIG5hbWUiKTsKKworICB0YXJnZXRfcHJlb3BlbiAoZnJvbV90dHkpOworICAKKyAgdW5wdXNoX3RhcmdldCAoJnZ4X29wcyk7CisgIHByaW50Zl91bmZpbHRlcmVkICgiQXR0YWNoaW5nIHJlbW90ZSBtYWNoaW5lIGFjcm9zcyBuZXQuLi5cbiIpOworICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCisgIC8qIEFsbG93IHRoZSB1c2VyIHRvIGtpbGwgdGhlIGNvbm5lY3QgYXR0ZW1wdCBieSB0eXBpbmcgXkMuCisgICAgIFdhaXQgdW50aWwgdGhlIGNhbGwgdG8gdGFyZ2V0X2hhc19mcCAoKSBjb21wbGV0ZXMgYmVmb3JlCisgICAgIGRpc2FsbG93aW5nIGFuIGltbWVkaWF0ZSBxdWl0LCBzaW5jZSBldmVuIGlmIG5ldF9jb25uZWN0ICgpCisgICAgIGlzIHN1Y2Nlc3NmdWwsIHRoZSByZW1vdGUgZGVidWcgc2VydmVyIG1pZ2h0IGJlIGh1bmcuICAqLworCisgIGltbWVkaWF0ZV9xdWl0Kys7CisKKyAgbmV0X2Nvbm5lY3QgKGFyZ3MpOworICB0YXJnZXRfaGFzX2ZwID0gbmV0X2NoZWNrX2Zvcl9mcCAoKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiQ29ubmVjdGVkIHRvICVzLlxuIiwgYXJncyk7CisKKyAgaW1tZWRpYXRlX3F1aXQtLTsKKworICBwdXNoX3RhcmdldCAoJnZ4X29wcyk7CisKKyAgLyogU2F2ZSBhIGNvcHkgb2YgdGhlIHRhcmdldCBob3N0J3MgbmFtZS4gICovCisgIHZ4X2hvc3QgPSBzYXZlc3RyaW5nIChhcmdzLCBzdHJsZW4gKGFyZ3MpKTsKKworICAvKiBGaW5kIG91dCB0aGUgbmFtZSBvZiB0aGUgZmlsZSBmcm9tIHdoaWNoIHRoZSB0YXJnZXQgd2FzIGJvb3RlZAorICAgICBhbmQgbG9hZCBpdHMgc3ltYm9sIHRhYmxlLiAgKi8KKworICBwcmludGZfZmlsdGVyZWQgKCJMb29raW5nIGluIFVuaXggcGF0aCBmb3IgYWxsIGxvYWRlZCBtb2R1bGVzOlxuIik7CisgIGJvb3RGaWxlID0gTlVMTDsKKyAgaWYgKCFuZXRfZ2V0X2Jvb3RfZmlsZSAoJmJvb3RGaWxlKSkKKyAgICB7CisgICAgICBpZiAoKmJvb3RGaWxlKQorCXsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlx0JXM6ICIsIGJvb3RGaWxlKTsKKwkgIC8qIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBrZXJuZWwgaXMgbmV2ZXIgcmVsb2NhdGVkLiAgSG9wZSB0aGF0IGlzIGFuCisJICAgICBhY2N1cmF0ZSBhc3N1bXB0aW9uLiAgKi8KKwkgIGlmIChjYXRjaF9lcnJvcnMKKwkgICAgICAoc3ltYm9sX3N0dWIsCisJICAgICAgIGJvb3RGaWxlLAorCSAgICAgICAiRXJyb3Igd2hpbGUgcmVhZGluZyBzeW1ib2xzIGZyb20gYm9vdCBmaWxlOlxuIiwKKwkgICAgICAgUkVUVVJOX01BU0tfQUxMKSkKKwkgICAgcHV0c19maWx0ZXJlZCAoIm9rXG4iKTsKKwl9CisgICAgICBlbHNlIGlmIChmcm9tX3R0eSkKKwlwcmludGZfdW5maWx0ZXJlZCAoIlZ4V29ya3Mga2VybmVsIHN5bWJvbHMgbm90IGxvYWRlZC5cbiIpOworICAgIH0KKyAgZWxzZQorICAgIGVycm9yICgiQ2FuJ3QgcmV0cmlldmUgYm9vdCBmaWxlIG5hbWUgZnJvbSB0YXJnZXQgbWFjaGluZS4iKTsKKworICBjbG50X2ZyZWVyZXMgKHBDbGllbnQsIHhkcl93cmFwc3RyaW5nLCAmYm9vdEZpbGUpOworCisgIGlmIChuZXRfZ2V0X3N5bWJvbHMgKCZsb2FkVGFibGUpICE9IDApCisgICAgZXJyb3IgKCJDYW4ndCByZWFkIGxvYWRlZCBtb2R1bGVzIGZyb20gdGFyZ2V0IG1hY2hpbmUiKTsKKworICBpID0gMC0xOworICB3aGlsZSAoKytpIDwgbG9hZFRhYmxlLnRibF9zaXplKQorICAgIHsKKyAgICAgIFFVSVQ7CS8qIEZJWE1FLCBhdm9pZHMgY2xudF9mcmVlcmVzIGJlbG93OiAgbWVtIGxlYWsgKi8KKyAgICAgIHBMb2FkRmlsZSA9ICZsb2FkVGFibGUudGJsX2VudCBbaV07CisjaWZkZWYgV1JTX09SSUcKKyAgeworICAgIHJlZ2lzdGVyIGludCBkZXNjOworICAgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisgICAgY2hhciAqZnVsbG5hbWUgPSBOVUxMOworCisgICAgZGVzYyA9IG9wZW5wIChzb3VyY2VfcGF0aCwgMCwgcExvYWRGaWxlLT5uYW1lLCBPX1JET05MWSwgMCwgJmZ1bGxuYW1lKTsKKyAgICBpZiAoZGVzYyA8IDApCisJcGVycm9yX3dpdGhfbmFtZSAocExvYWRGaWxlLT5uYW1lKTsKKyAgICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKGNsb3NlLCBkZXNjKTsKKyAgICBhZGRfZmlsZV9hdF9hZGRyIChmdWxsbmFtZSwgZGVzYywgcExvYWRGaWxlLT50eHRfYWRkciwgcExvYWRGaWxlLT5kYXRhX2FkZHIsCisJCSAgICAgIHBMb2FkRmlsZS0+YnNzX2FkZHIpOworICAgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworICB9CisjZWxzZQorICAgICAgLyogRklYTUU6IElzIHRoZXJlIHNvbWV0aGluZyBiZXR0ZXIgdG8gc2VhcmNoIHRoYW4gdGhlIFBBVEg/IChwcm9iYWJseQorCSBub3QgdGhlIHNvdXJjZSBwYXRoLCBzaW5jZSBzb3VyY2UgbWlnaHQgYmUgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzCisJIHRoYW4gb2JqZWN0cy4gICovCisKKyAgICAgIGlmIChjYXRjaF9lcnJvcnMgKGFkZF9zeW1ib2xfc3R1YiwgKGNoYXIgKilwTG9hZEZpbGUsIChjaGFyICopMCwKKwkJCVJFVFVSTl9NQVNLX0FMTCkpCisJc3ltYm9sc19hZGRlZCA9IDE7CisjZW5kaWYKKyAgICB9CisgIHByaW50Zl9maWx0ZXJlZCAoIkRvbmUuXG4iKTsKKworICBjbG50X2ZyZWVyZXMgKHBDbGllbnQsIHhkcl9sZHRhYmwsICZsb2FkVGFibGUpOworCisgIC8qIEdldHRpbmcgbmV3IHN5bWJvbHMgbWF5IGNoYW5nZSBvdXIgb3BpbmlvbiBhYm91dCB3aGF0IGlzCisgICAgIGZyYW1lbGVzcy4gICovCisgIGlmIChzeW1ib2xzX2FkZGVkKQorICAgIHJlaW5pdF9mcmFtZV9jYWNoZSAoKTsKK30KKwwKKy8qIFRha2VzIGEgdGFzayBzdGFydGVkIHVwIG91dHNpZGUgb2YgZ2RiIGFuZCBgYGF0dGFjaGVzJycgdG8gaXQuCisgICBUaGlzIHN0b3BzIGl0IGNvbGQgaW4gaXRzIHRyYWNrcyBhbmQgYWxsb3dzIHVzIHRvIHN0YXJ0IHRyYWNpbmcgaXQuICAqLworCitzdGF0aWMgdm9pZAordnhfYXR0YWNoIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICB1bnNpZ25lZCBsb25nIHBpZDsKKyAgY2hhciAqY3B0ciA9IDA7CisgIFJwdHJhY2UgcHRyYWNlX2luOworICBQdHJhY2VfcmV0dXJuIHB0cmFjZV9vdXQ7CisgIGludCBzdGF0dXM7CisKKyAgaWYgKCFhcmdzKQorICAgIGVycm9yX25vX2FyZyAoInByb2Nlc3MtaWQgdG8gYXR0YWNoIik7CisKKyAgcGlkID0gc3RydG91bCAoYXJncywgJmNwdHIsIDApOworICBpZiAoKGNwdHIgPT0gYXJncykgfHwgKCpjcHRyICE9ICdcMCcpKQorICAgIGVycm9yICgiSW52YWxpZCBwcm9jZXNzLWlkIC0tIGdpdmUgYSBzaW5nbGUgbnVtYmVyIGluIGRlY2ltYWwgb3IgMHhoZXgiKTsKKworICBpZiAoZnJvbV90dHkpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJBdHRhY2hpbmcgcGlkICVzLlxuIiwKKwkJICAgICAgIGxvY2FsX2hleF9zdHJpbmcoKHVuc2lnbmVkIGxvbmcpIHBpZCkpOworCisgIG1lbXNldCAoKGNoYXIgKikmcHRyYWNlX2luLCAgJ1wwJywgc2l6ZW9mIChwdHJhY2VfaW4pKTsKKyAgbWVtc2V0ICgoY2hhciAqKSZwdHJhY2Vfb3V0LCAnXDAnLCBzaXplb2YgKHB0cmFjZV9vdXQpKTsKKyAgcHRyYWNlX2luLnBpZCA9IHBpZDsKKworICBzdGF0dXMgPSBuZXRfcHRyYWNlX2NsbnRfY2FsbCAoUFRSQUNFX0FUVEFDSCwgJnB0cmFjZV9pbiwgJnB0cmFjZV9vdXQpOworICBpZiAoc3RhdHVzID09IC0xKQorICAgIGVycm9yIChycGNlcnIpOworICBpZiAocHRyYWNlX291dC5zdGF0dXMgPT0gLTEpCisgICAgeworICAgICAgZXJybm8gPSBwdHJhY2Vfb3V0LmVycm5vX251bTsKKyAgICAgIHBlcnJvcl93aXRoX25hbWUgKCJBdHRhY2hpbmcgcmVtb3RlIHByb2Nlc3MiKTsKKyAgICB9CisKKyAgLyogSXQgd29ya2VkLi4uICovCisKKyAgaW5mZXJpb3JfcGlkID0gcGlkOworICBwdXNoX3RhcmdldCAoJnZ4X3J1bl9vcHMpOworCisgIGlmICh2eF9ydW5uaW5nKQorICAgIGZyZWUgKHZ4X3J1bm5pbmcpOworICB2eF9ydW5uaW5nID0gMDsKK30KKworLyogZGV0YWNoX2NvbW1hbmQgLS0KKyAgIHRha2VzIGEgcHJvZ3JhbSBwcmV2aW91c2x5IGF0dGFjaGVkIHRvIGFuZCBkZXRhY2hlcyBpdC4KKyAgIFRoZSBwcm9ncmFtIHJlc3VtZXMgZXhlY3V0aW9uIGFuZCB3aWxsIG5vIGxvbmdlciBzdG9wCisgICBvbiBzaWduYWxzLCBldGMuICBXZSBiZXR0ZXIgbm90IGhhdmUgbGVmdCBhbnkgYnJlYWtwb2ludHMKKyAgIGluIHRoZSBwcm9ncmFtIG9yIGl0J2xsIGRpZSB3aGVuIGl0IGhpdHMgb25lLiAgRm9yIHRoaXMKKyAgIHRvIHdvcmssIGl0IG1heSBiZSBuZWNlc3NhcnkgZm9yIHRoZSBwcm9jZXNzIHRvIGhhdmUgYmVlbgorICAgcHJldmlvdXNseSBhdHRhY2hlZC4gIEl0ICptaWdodCogd29yayBpZiB0aGUgcHJvZ3JhbSB3YXMKKyAgIHN0YXJ0ZWQgdmlhIHRoZSBub3JtYWwgcHRyYWNlIChQVFJBQ0VfVFJBQ0VNRSkuICAqLworCitzdGF0aWMgdm9pZAordnhfZGV0YWNoIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBScHRyYWNlIHB0cmFjZV9pbjsKKyAgUHRyYWNlX3JldHVybiBwdHJhY2Vfb3V0OworICBpbnQgc2lnbmFsID0gMDsKKyAgaW50IHN0YXR1czsKKworICBpZiAoYXJncykKKyAgICBlcnJvciAoIkFyZ3VtZW50IGdpdmVuIHRvIFZ4V29ya3MgXCJkZXRhY2hcIi4iKTsKKworICBpZiAoZnJvbV90dHkpCisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIkRldGFjaGluZyBwaWQgJXMuXG4iLAorCSAgICAgIGxvY2FsX2hleF9zdHJpbmcoKHVuc2lnbmVkIGxvbmcpIGluZmVyaW9yX3BpZCkpOworCisgIGlmIChhcmdzKQkJLyogRklYTUUsIHNob3VsZCBiZSBwb3NzaWJsZSB0byBsZWF2ZSBzdXNwZW5kZWQgKi8KKyAgICBzaWduYWwgPSBhdG9pIChhcmdzKTsKKyAgCisgIG1lbXNldCAoKGNoYXIgKikmcHRyYWNlX2luLCAgJ1wwJywgc2l6ZW9mIChwdHJhY2VfaW4pKTsKKyAgbWVtc2V0ICgoY2hhciAqKSZwdHJhY2Vfb3V0LCAnXDAnLCBzaXplb2YgKHB0cmFjZV9vdXQpKTsKKyAgcHRyYWNlX2luLnBpZCA9IGluZmVyaW9yX3BpZDsKKworICBzdGF0dXMgPSBuZXRfcHRyYWNlX2NsbnRfY2FsbCAoUFRSQUNFX0RFVEFDSCwgJnB0cmFjZV9pbiwgJnB0cmFjZV9vdXQpOworICBpZiAoc3RhdHVzID09IC0xKQorICAgIGVycm9yIChycGNlcnIpOworICBpZiAocHRyYWNlX291dC5zdGF0dXMgPT0gLTEpCisgICAgeworICAgICAgZXJybm8gPSBwdHJhY2Vfb3V0LmVycm5vX251bTsKKyAgICAgIHBlcnJvcl93aXRoX25hbWUgKCJEZXRhY2hpbmcgVnhXb3JrcyBwcm9jZXNzIik7CisgICAgfQorCisgIGluZmVyaW9yX3BpZCA9IDA7CisgIHBvcF90YXJnZXQgKCk7CS8qIGdvIGJhY2sgdG8gbm9uLWV4ZWN1dGluZyBWeFdvcmtzIGNvbm5lY3Rpb24gKi8KK30KKworLyogdnhfa2lsbCAtLSB0YWtlcyBhIHJ1bm5pbmcgdGFzayBhbmQgd2lwZXMgaXQgb3V0LiAgKi8KKworc3RhdGljIHZvaWQKK3Z4X2tpbGwgKCkKK3sKKyAgUnB0cmFjZSBwdHJhY2VfaW47CisgIFB0cmFjZV9yZXR1cm4gcHRyYWNlX291dDsKKyAgaW50IHN0YXR1czsKKworICBwcmludGZfdW5maWx0ZXJlZCAoIktpbGxpbmcgcGlkICVzLlxuIiwgbG9jYWxfaGV4X3N0cmluZygodW5zaWduZWQgbG9uZykgaW5mZXJpb3JfcGlkKSk7CisKKyAgbWVtc2V0ICgoY2hhciAqKSZwdHJhY2VfaW4sICAnXDAnLCBzaXplb2YgKHB0cmFjZV9pbikpOworICBtZW1zZXQgKChjaGFyICopJnB0cmFjZV9vdXQsICdcMCcsIHNpemVvZiAocHRyYWNlX291dCkpOworICBwdHJhY2VfaW4ucGlkID0gaW5mZXJpb3JfcGlkOworCisgIHN0YXR1cyA9IG5ldF9wdHJhY2VfY2xudF9jYWxsIChQVFJBQ0VfS0lMTCwgJnB0cmFjZV9pbiwgJnB0cmFjZV9vdXQpOworICBpZiAoc3RhdHVzID09IC0xKQorICAgIHdhcm5pbmcgKHJwY2Vycik7CisgIGVsc2UgaWYgKHB0cmFjZV9vdXQuc3RhdHVzID09IC0xKQorICAgIHsKKyAgICAgIGVycm5vID0gcHRyYWNlX291dC5lcnJub19udW07CisgICAgICBwZXJyb3Jfd2l0aF9uYW1lICgiS2lsbGluZyBWeFdvcmtzIHByb2Nlc3MiKTsKKyAgICB9CisKKyAgLyogSWYgaXQgZ2l2ZXMgZ29vZCBzdGF0dXMsIHRoZSBwcm9jZXNzIGlzICpnb25lKiwgbm8gZXZlbnRzIHJlbWFpbi4KKyAgICAgSWYgdGhlIGtpbGwgZmFpbGVkLCBhc3N1bWUgdGhlIHByb2Nlc3MgaXMgZ29uZSBhbnlob3cuICAqLworICBpbmZlcmlvcl9waWQgPSAwOworICBwb3BfdGFyZ2V0ICgpOwkvKiBnbyBiYWNrIHRvIG5vbi1leGVjdXRpbmcgVnhXb3JrcyBjb25uZWN0aW9uICovCit9CisKKy8qIENsZWFuIHVwIGZyb20gdGhlIFZ4V29ya3MgcHJvY2VzcyB0YXJnZXQgYXMgaXQgZ29lcyBhd2F5LiAgKi8KKworc3RhdGljIHZvaWQKK3Z4X3Byb2NfY2xvc2UgKHF1aXR0aW5nKQorICAgICBpbnQgcXVpdHRpbmc7Cit7CisgIGluZmVyaW9yX3BpZCA9IDA7CQkvKiBObyBsb25nZXIgaGF2ZSBhIHByb2Nlc3MuICAqLworICBpZiAodnhfcnVubmluZykKKyAgICBmcmVlICh2eF9ydW5uaW5nKTsKKyAgdnhfcnVubmluZyA9IDA7Cit9CisMCisvKiBNYWtlIGFuIFJQQyBjYWxsIHRvIHRoZSBWeFdvcmtzIHRhcmdldC4KKyAgIFJldHVybnMgUlBDIHN0YXR1cy4gICovCisKK3N0YXRpYyBlbnVtIGNsbnRfc3RhdAorbmV0X2NsbnRfY2FsbCAocHJvY051bSwgaW5Qcm9jLCBpbiwgb3V0UHJvYywgb3V0KQorICAgIGVudW0gcHRyYWNlcmVxIHByb2NOdW07CisgICAgeGRycHJvY190IGluUHJvYzsKKyAgICBjaGFyICppbjsKKyAgICB4ZHJwcm9jX3Qgb3V0UHJvYzsKKyAgICBjaGFyICpvdXQ7Cit7CisgIGVudW0gY2xudF9zdGF0IHN0YXR1czsKKyAgCisgIHN0YXR1cyA9IGNsbnRfY2FsbCAocENsaWVudCwgcHJvY051bSwgaW5Qcm9jLCBpbiwgb3V0UHJvYywgb3V0LCBycGNUaW1lb3V0KTsKKworICBpZiAoc3RhdHVzICE9IFJQQ19TVUNDRVNTKQorICAgICAgY2xudF9wZXJybm8gKHN0YXR1cyk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLyogQ2xlYW4gdXAgYmVmb3JlIGxvc2luZyBjb250cm9sLiAgKi8KKworc3RhdGljIHZvaWQKK3Z4X2Nsb3NlIChxdWl0dGluZykKKyAgICAgaW50IHF1aXR0aW5nOworeworICBpZiAocENsaWVudCkKKyAgICBjbG50X2Rlc3Ryb3kgKHBDbGllbnQpOwkvKiBUaGUgbmV0IGNvbm5lY3Rpb24gKi8KKyAgcENsaWVudCA9IDA7CisKKyAgaWYgKHZ4X2hvc3QpCisgICAgZnJlZSAodnhfaG9zdCk7CQkvKiBUaGUgaG9zdG5hbWUgKi8KKyAgdnhfaG9zdCA9IDA7Cit9CisKKy8qIEEgdnhwcm9jZXNzIHRhcmdldCBzaG91bGQgYmUgc3RhcnRlZCB2aWEgInJ1biIgbm90ICJ0YXJnZXQiLiAgKi8KKy8qQVJHU1VTRUQqLworc3RhdGljIHZvaWQKK3Z4X3Byb2Nfb3BlbiAobmFtZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZXJyb3IgKCJVc2UgdGhlIFwicnVuXCIgY29tbWFuZCB0byBzdGFydCBhIFZ4V29ya3MgcHJvY2Vzcy4iKTsKK30KKworc3RhdGljIHZvaWQKK2luaXRfdnhfb3BzICgpCit7CisgIHZ4X29wcy50b19zaG9ydG5hbWUgPSAidnh3b3JrcyI7CisgIHZ4X29wcy50b19sb25nbmFtZSA9ICJWeFdvcmtzIHRhcmdldCBtZW1vcnkgdmlhIFJQQyBvdmVyIFRDUC9JUCI7CisgIHZ4X29wcy50b19kb2MgPSAiVXNlIFZ4V29ya3MgdGFyZ2V0IG1lbW9yeS4gIFxuXAorU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgbWFjaGluZSB0byBjb25uZWN0IHRvLiI7CisgIHZ4X29wcy50b19vcGVuID0gdnhfb3BlbjsKKyAgdnhfb3BzLnRvX2Nsb3NlID0gdnhfY2xvc2U7CisgIHZ4X29wcy50b19hdHRhY2ggPSB2eF9hdHRhY2g7CisgIHZ4X29wcy50b194ZmVyX21lbW9yeSA9IHZ4X3hmZXJfbWVtb3J5OworICB2eF9vcHMudG9fZmlsZXNfaW5mbyA9IHZ4X2ZpbGVzX2luZm87CisgIHZ4X29wcy50b19sb2FkID0gdnhfbG9hZF9jb21tYW5kOworICB2eF9vcHMudG9fbG9va3VwX3N5bWJvbCA9IHZ4X2xvb2t1cF9zeW1ib2w7CisgIHZ4X29wcy50b19jcmVhdGVfaW5mZXJpb3IgPSB2eF9jcmVhdGVfaW5mZXJpb3I7CisgIHZ4X29wcy50b19zdHJhdHVtID0gY29yZV9zdHJhdHVtOworICB2eF9vcHMudG9faGFzX2FsbF9tZW1vcnkgPSAxOworICB2eF9vcHMudG9faGFzX21lbW9yeSA9IDE7CisgIHZ4X29wcy50b19tYWdpYyA9IE9QU19NQUdJQzsJCS8qIEFsd2F5cyB0aGUgbGFzdCB0aGluZyAqLworfTsKKworc3RhdGljIHZvaWQKK2luaXRfdnhfcnVuX29wcyAoKQoreworICB2eF9ydW5fb3BzLnRvX3Nob3J0bmFtZSA9ICJ2eHByb2Nlc3MiOworICB2eF9ydW5fb3BzLnRvX2xvbmduYW1lID0gIlZ4V29ya3MgcHJvY2VzcyI7CisgIHZ4X3J1bl9vcHMudG9fZG9jID0gIlZ4V29ya3MgcHJvY2Vzczsgc3RhcnRlZCBieSB0aGUgXCJydW5cIiBjb21tYW5kLiI7CisgIHZ4X3J1bl9vcHMudG9fb3BlbiA9IHZ4X3Byb2Nfb3BlbjsKKyAgdnhfcnVuX29wcy50b19jbG9zZSA9IHZ4X3Byb2NfY2xvc2U7CisgIHZ4X3J1bl9vcHMudG9fZGV0YWNoID0gdnhfZGV0YWNoOworICB2eF9ydW5fb3BzLnRvX3Jlc3VtZSA9IHZ4X3Jlc3VtZTsKKyAgdnhfcnVuX29wcy50b193YWl0ID0gdnhfd2FpdDsKKyAgdnhfcnVuX29wcy50b19mZXRjaF9yZWdpc3RlcnMgPSB2eF9yZWFkX3JlZ2lzdGVyOworICB2eF9ydW5fb3BzLnRvX3N0b3JlX3JlZ2lzdGVycyA9IHZ4X3dyaXRlX3JlZ2lzdGVyOworICB2eF9ydW5fb3BzLnRvX3ByZXBhcmVfdG9fc3RvcmUgPSB2eF9wcmVwYXJlX3RvX3N0b3JlOworICB2eF9ydW5fb3BzLnRvX3hmZXJfbWVtb3J5ID0gdnhfeGZlcl9tZW1vcnk7CisgIHZ4X3J1bl9vcHMudG9fZmlsZXNfaW5mbyA9IHZ4X3J1bl9maWxlc19pbmZvOworICB2eF9ydW5fb3BzLnRvX2luc2VydF9icmVha3BvaW50ID0gdnhfaW5zZXJ0X2JyZWFrcG9pbnQ7CisgIHZ4X3J1bl9vcHMudG9fcmVtb3ZlX2JyZWFrcG9pbnQgPSB2eF9yZW1vdmVfYnJlYWtwb2ludDsKKyAgdnhfcnVuX29wcy50b19raWxsID0gdnhfa2lsbDsKKyAgdnhfcnVuX29wcy50b19sb2FkID0gdnhfbG9hZF9jb21tYW5kOworICB2eF9ydW5fb3BzLnRvX2xvb2t1cF9zeW1ib2wgPSB2eF9sb29rdXBfc3ltYm9sOworICB2eF9ydW5fb3BzLnRvX21vdXJuX2luZmVyaW9yID0gdnhfbW91cm5faW5mZXJpb3IgOworICB2eF9ydW5fb3BzLnRvX3N0cmF0dW0gPSBwcm9jZXNzX3N0cmF0dW07CisgIHZ4X3J1bl9vcHMudG9faGFzX21lbW9yeSA9IDE7CisgIHZ4X3J1bl9vcHMudG9faGFzX3N0YWNrID0gMTsKKyAgdnhfcnVuX29wcy50b19oYXNfcmVnaXN0ZXJzID0gMTsKKyAgdnhfcnVuX29wcy50b19oYXNfZXhlY3V0aW9uID0gMTsJCisgIHZ4X3J1bl9vcHMudG9fbWFnaWMgPSBPUFNfTUFHSUM7CQorfQorDAordm9pZAorX2luaXRpYWxpemVfdnggKCkKK3sKKyAgaW5pdF92eF9vcHMgKCk7CisgIGFkZF90YXJnZXQgKCZ2eF9vcHMpOworICBpbml0X3Z4X3J1bl9vcHMgKCk7CisgIGFkZF90YXJnZXQgKCZ2eF9ydW5fb3BzKTsKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoInZ4d29ya3MtdGltZW91dCIsIGNsYXNzX3N1cHBvcnQsIHZhcl91aW50ZWdlciwKKwkJICAoY2hhciAqKSAmcnBjVGltZW91dC50dl9zZWMsCisJCSAgIlNldCBzZWNvbmRzIHRvIHdhaXQgZm9yIHJwYyBjYWxscyB0byByZXR1cm4uXG5cCitTZXQgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgZm9yIHJwYyBjYWxscyB0byByZXR1cm4uIiwgJnNldGxpc3QpLAorICAgICAmc2hvd2xpc3QpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS12eDI5ay5jIGIvZ2RiL3JlbW90ZS12eDI5ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZmMyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmVtb3RlLXZ4MjlrLmMKQEAgLTAsMCArMSwxODggQEAKKy8qIEFtMjlrLWRlcGVuZGVudCBwb3J0aW9ucyBvZiB0aGUgUlBDIHByb3RvY29sCisgICB1c2VkIHdpdGggYSBWeFdvcmtzIHRhcmdldCAKKworQ29udHJpYnV0ZWQgYnkgV2luZCBSaXZlciBTeXN0ZW1zLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImRlZnMuaCIKKworI2luY2x1ZGUgInZ4LXNoYXJlL3JlZ1BhY2tldC5oIiAgCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgIndhaXQuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIJCS8qIGZvciBzdHJ1Y3QgY29tcGxhaW50ICovCisKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaWZkZWYgX0FJWCAgICAgICAgICAgICAgICAgICAgIC8qIElCTSBjbGFpbXMgInZvaWQgKm1hbGxvYygpIiBub3QgY2hhciAqICovCisjZGVmaW5lIG1hbGxvYyBib2dvbl9tYWxsb2MKKyNlbmRpZgorCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CQkvKiBVVGVrJ3MgPHJwYy9ycGMuaD4gZG9lc24ndCAjaW5jbCB0aGlzICovCisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlICJ2eC1zaGFyZS9wdHJhY2UuaCIKKyNpbmNsdWRlICJ2eC1zaGFyZS94ZHJfcHRyYWNlLmgiCisjaW5jbHVkZSAidngtc2hhcmUveGRyX2xkLmgiCisjaW5jbHVkZSAidngtc2hhcmUveGRyX3JkYi5oIgorI2luY2x1ZGUgInZ4LXNoYXJlL2RiZ1JwY0xpYi5oIgorCisvKiBnZXQgcmlkIG9mIHZhbHVlLmggaWYgcG9zc2libGUgKi8KKyNpbmNsdWRlIDx2YWx1ZS5oPgorI2luY2x1ZGUgPHN5bXRhYi5oPgorCisvKiBGbGFnIHNldCBpZiB0YXJnZXQgaGFzIGZwdSAqLworCitleHRlcm4gaW50IHRhcmdldF9oYXNfZnA7CisKKy8qIEdlbmVyaWMgcmVnaXN0ZXIgcmVhZC93cml0ZSByb3V0aW5lcyBpbiByZW1vdGUtdnguYy4gICovCisKK2V4dGVybiB2b2lkIG5ldF9yZWFkX3JlZ2lzdGVycyAoKTsKK2V4dGVybiB2b2lkIG5ldF93cml0ZV9yZWdpc3RlcnMgKCk7CisKKy8qIFJlYWQgYSByZWdpc3RlciBvciByZWdpc3RlcnMgZnJvbSB0aGUgVnhXb3JrcyB0YXJnZXQuCisgICBSRUdOTyBpcyB0aGUgcmVnaXN0ZXIgdG8gcmVhZCwgb3IgLTEgZm9yIGFsbDsgY3VycmVudGx5LAorICAgaXQgaXMgaWdub3JlZC4gIEZJWE1FIGxvb2sgYXQgcmVnbm8gdG8gaW1wcm92ZSBlZmZpY2llbmN5LiAgKi8KKwordm9pZAordnhfcmVhZF9yZWdpc3RlciAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgY2hhciBhbTI5a19ncmVnX3BhY2tldFtBTTI5S19HUkVHX1BMRU5dOworICBjaGFyIGFtMjlrX2ZwcmVnX3BhY2tldFtBTTI5S19GUFJFR19QTEVOXTsKKworICAvKiBHZXQgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycy4gIFdoZW4gY29weWluZyB2YWx1ZXMgaW50bworICAgICByZWdpc3RlcnMgW10sIGRvbid0IGFzc3VtZSB0aGF0IGEgbG9jYXRpb24gaW4gcmVnaXN0ZXJzIFtdCisgICAgIGlzIHByb3Blcmx5IGFsaWduZWQgZm9yIHRoZSB0YXJnZXQgZGF0YSB0eXBlLiAgKi8KKworICBuZXRfcmVhZF9yZWdpc3RlcnMgKGFtMjlrX2dyZWdfcGFja2V0LCBBTTI5S19HUkVHX1BMRU4sIFBUUkFDRV9HRVRSRUdTKTsKKworICAvKiBOb3cgY29weSB0aGUgcmVnaXN0ZXIgdmFsdWVzIGludG8gcmVnaXN0ZXJzW10uCisgICAgIE5vdGUgdGhhdCB0aGlzIGNvZGUgZGVwZW5kcyBvbiB0aGUgb3JkZXJpbmcgb2YgdGhlIFJFR05VTXMKKyAgICAgYXMgZGVmaW5lZCBpbiAidG0tMjlrLmgiLiAgKi8KKworICBiY29weSAoJmFtMjlrX2dyZWdfcGFja2V0W0FNMjlLX1JfR1I5Nl0sCisJICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoR1I5Nl9SRUdOVU0pXSwgMTYwICogQU0yOUtfR1JFR19TSVpFKTsKKyAgYmNvcHkgKCZhbTI5a19ncmVnX3BhY2tldFtBTTI5S19SX1ZBQl0sCisJICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoVkFCX1JFR05VTSldLCAxNSAqIEFNMjlLX0dSRUdfU0laRSk7CisgIHJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChJTlRFX1JFR05VTSldID0gYW0yOWtfZ3JlZ19wYWNrZXRbQU0yOUtfUl9JTlRFXTsKKyAgYmNvcHkgKCZhbTI5a19ncmVnX3BhY2tldFtBTTI5S19SX1JTUF0sCisJICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoR1IxX1JFR05VTSldLCA1ICogQU0yOUtfR1JFR19TSVpFKTsKKworICAvKiBQQUQgRm9yIG5vdywgZG9uJ3QgY2FyZSBhYm91dCBleG9wIHJlZ2lzdGVyICovCisKKyAgbWVtc2V0ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEVYT19SRUdOVU0pXSwgJ1wwJywgQU0yOUtfR1JFR19TSVpFKTsKKworICAvKiBJZiB0aGUgdGFyZ2V0IGhhcyBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMsIGZldGNoIHRoZW0uCisgICAgIE90aGVyd2lzZSwgemVybyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgdmFsdWVzIGluCisgICAgIHJlZ2lzdGVyc1tdIGZvciBnb29kIG1lYXN1cmUsIGV2ZW4gdGhvdWdoIHdlIG1pZ2h0IG5vdAorICAgICBuZWVkIHRvLiAgKi8KKworICBpZiAodGFyZ2V0X2hhc19mcCkKKyAgICB7CisgICAgICBuZXRfcmVhZF9yZWdpc3RlcnMgKGFtMjlrX2ZwcmVnX3BhY2tldCwgQU0yOUtfRlBSRUdfUExFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFRSQUNFX0dFVEZQUkVHUyk7CisgICAgICByZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlBFX1JFR05VTSldID0gYW0yOWtfZnByZWdfcGFja2V0W0FNMjlLX1JfRlBFXTsKKyAgICAgIHJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUFNfUkVHTlVNKV0gPSBhbTI5a19mcHJlZ19wYWNrZXRbQU0yOUtfUl9GUFNdOworCisgICAgICAvKiBQQUQgRm9yIG5vdywgZG9uJ3QgY2FyZSBhYm91dCByZWdpc3RlcnMgKD8pIEFJMCB0byBxICovCisKKyAgICAgIG1lbXNldCAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFICgxNjEpXSwgJ1wwJywgMjEgKiBBTTI5S19GUFJFR19TSVpFKTsKKyAgICB9CisgIGVsc2UKKyAgICB7IAorICAgICAgbWVtc2V0ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQRV9SRUdOVU0pXSwgJ1wwJywgQU0yOUtfRlBSRUdfU0laRSk7CisgICAgICBtZW1zZXQgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlBTX1JFR05VTSldLCAnXDAnLCBBTTI5S19GUFJFR19TSVpFKTsKKworICAgICAgLyogUEFEIEZvciBub3csIGRvbid0IGNhcmUgYWJvdXQgcmVnaXN0ZXJzICg/KSBBSTAgdG8gcSAqLworCisgICAgICBtZW1zZXQgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoMTYxKV0sICdcMCcsIDIxICogQU0yOUtfRlBSRUdfU0laRSk7CisgICAgfQorCisgIC8qIE1hcmsgdGhlIHJlZ2lzdGVyIGNhY2hlIHZhbGlkLiAgKi8KKworICByZWdpc3RlcnNfZmV0Y2hlZCAoKTsKK30KKworLyogU3RvcmUgYSByZWdpc3RlciBvciByZWdpc3RlcnMgaW50byB0aGUgVnhXb3JrcyB0YXJnZXQuCisgICBSRUdOTyBpcyB0aGUgcmVnaXN0ZXIgdG8gc3RvcmUsIG9yIC0xIGZvciBhbGw7IGN1cnJlbnRseSwKKyAgIGl0IGlzIGlnbm9yZWQuICBGSVhNRSBsb29rIGF0IHJlZ25vIHRvIGltcHJvdmUgZWZmaWNpZW5jeS4gICovCisKK3ZvaWQKK3Z4X3dyaXRlX3JlZ2lzdGVyIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBjaGFyIGFtMjlrX2dyZWdfcGFja2V0W0FNMjlLX0dSRUdfUExFTl07CisgIGNoYXIgYW0yOWtfZnByZWdfcGFja2V0W0FNMjlLX0ZQUkVHX1BMRU5dOworCisgIC8qIFN0b3JlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMuICBXaGVuIGNvcHlpbmcgdmFsdWVzIGZyb20KKyAgICAgcmVnaXN0ZXJzIFtdLCBkb24ndCBhc3N1bWUgdGhhdCBhIGxvY2F0aW9uIGluIHJlZ2lzdGVycyBbXQorICAgICBpcyBwcm9wZXJseSBhbGlnbmVkIGZvciB0aGUgdGFyZ2V0IGRhdGEgdHlwZS4gICovCisKKyAgYmNvcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoR1I5Nl9SRUdOVU0pXSwKKwkgJmFtMjlrX2dyZWdfcGFja2V0W0FNMjlLX1JfR1I5Nl0sIDE2MCAqIEFNMjlLX0dSRUdfU0laRSk7CisgIGJjb3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKFZBQl9SRUdOVU0pXSwKKwkgJmFtMjlrX2dyZWdfcGFja2V0W0FNMjlLX1JfVkFCXSwgMTUgKiBBTTI5S19HUkVHX1NJWkUpOworICBhbTI5a19ncmVnX3BhY2tldFtBTTI5S19SX0lOVEVdID0gcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKElOVEVfUkVHTlVNKV07CisgIGJjb3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEdSMV9SRUdOVU0pXSwKKwkgJmFtMjlrX2dyZWdfcGFja2V0W0FNMjlLX1JfUlNQXSwgNSAqIEFNMjlLX0dSRUdfU0laRSk7CisKKyAgbmV0X3dyaXRlX3JlZ2lzdGVycyAoYW0yOWtfZ3JlZ19wYWNrZXQsIEFNMjlLX0dSRUdfUExFTiwgUFRSQUNFX1NFVFJFR1MpOworCisgIC8qIFN0b3JlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBpZiB0aGUgdGFyZ2V0IGhhcyB0aGVtLiAgKi8KKworICBpZiAodGFyZ2V0X2hhc19mcCkKKyAgICB7CisgICAgICBhbTI5a19mcHJlZ19wYWNrZXRbQU0yOUtfUl9GUEVdID0gcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQRV9SRUdOVU0pXTsKKyAgICAgIGFtMjlrX2ZwcmVnX3BhY2tldFtBTTI5S19SX0ZQU10gPSByZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlBTX1JFR05VTSldOworCisgICAgICBuZXRfd3JpdGVfcmVnaXN0ZXJzIChhbTI5a19mcHJlZ19wYWNrZXQsIEFNMjlLX0ZQUkVHX1BMRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFJBQ0VfU0VURlBSRUdTKTsKKyAgICB9Cit9CisKKy8qIFZ4V29ya3MgemVyb2VzIGZwIHdoZW4gdGhlIHRhc2sgaXMgaW5pdGlhbGl6ZWQ7IHdlIHVzZSB0aGlzCisgICB0byB0ZXJtaW5hdGUgdGhlIGZyYW1lIGNoYWluLiBDaGFpbiBtZWFucyBoZXJlIHRoZSBub21pbmFsIGFkZHJlc3Mgb2YKKyAgIGEgZnJhbWUsIHRoYXQgaXMsIHRoZSByZXR1cm4gYWRkcmVzcyAobHIwKSBhZGRyZXNzIGluIHRoZSBzdGFjay4gVG8KKyAgIG9idGFpbiB0aGUgZnJhbWUgcG9pbnRlciAobHIxKSBjb250ZW50cywgd2UgbXVzdCBhZGQgNCBieXRlcy4KKyAgIE5vdGUgOiBtYXkgYmUgd2Ugc2hvdWxkIG1vZGlmeSBpbml0X2ZyYW1lX2luZm8oKSB0byBnZXQgdGhlIGZyYW1lIHBvaW50ZXIKKyAgICAgICAgICBhbmQgc3RvcmUgaXQgaW50byB0aGUgZnJhbWVfaW5mbyBzdHJ1Y3QgcmF0aGVyIHRoYW4gcmVhZGluZyBpdHMKKyAgICAgICAgICBjb250ZW50cyB3aGVuIEZSQU1FX0NIQUlOX1ZBTElEIGlzIGludm9rZWQuICovCisKK2ludAordngyOWtfZnJhbWVfY2hhaW5fdmFsaWQgKGNoYWluLCB0aGlzZnJhbWUpCisgICAgIENPUkVfQUREUiBjaGFpbjsKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKnRoaXNmcmFtZTsgICAgICAvKiBub3QgdXNlZCBoZXJlICovCit7CisgICBpbnQgZnBfY29udGVudHM7CisKKyAgIHJlYWRfbWVtb3J5ICgoQ09SRV9BRERSKShjaGFpbiArIDQpLCAoY2hhciAqKSAmZnBfY29udGVudHMsIDQpOworICAgcmV0dXJuIChmcF9jb250ZW50cyAhPSAwKTsKK30KKwpkaWZmIC0tZ2l0IGEvZ2RiL3JlbW90ZS12eDY4LmMgYi9nZGIvcmVtb3RlLXZ4NjguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmNlZGExCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JlbW90ZS12eDY4LmMKQEAgLTAsMCArMSwxNTggQEAKKy8qIDY4ay1kZXBlbmRlbnQgcG9ydGlvbnMgb2YgdGhlIFJQQyBwcm90b2NvbAorICAgdXNlZCB3aXRoIGEgVnhXb3JrcyB0YXJnZXQgCisKK0NvbnRyaWJ1dGVkIGJ5IFdpbmQgUml2ZXIgU3lzdGVtcy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJkZWZzLmgiCisKKyNpbmNsdWRlICJ2eC1zaGFyZS9yZWdQYWNrZXQuaCIgIAorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJ3YWl0LmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCQkvKiBmb3Igc3RydWN0IGNvbXBsYWludCAqLworCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2lmZGVmIF9BSVgJCQkvKiBJQk0gY2xhaW1zICJ2b2lkICptYWxsb2MoKSIgbm90IGNoYXIgKiAqLworI2RlZmluZSBtYWxsb2MgYm9nb25fbWFsbG9jCisjZW5kaWYKKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworI2lmZGVmIF9BSVgKKyN1bmRlZiBtYWxsb2MKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4JCS8qIFVUZWsncyA8cnBjL3JwYy5oPiBkb2Vzbid0ICNpbmNsIHRoaXMgKi8KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgInZ4LXNoYXJlL3B0cmFjZS5oIgorI2luY2x1ZGUgInZ4LXNoYXJlL3hkcl9wdHJhY2UuaCIKKyNpbmNsdWRlICJ2eC1zaGFyZS94ZHJfbGQuaCIKKyNpbmNsdWRlICJ2eC1zaGFyZS94ZHJfcmRiLmgiCisjaW5jbHVkZSAidngtc2hhcmUvZGJnUnBjTGliLmgiCisKKy8qIGdldCByaWQgb2YgdmFsdWUuaCBpZiBwb3NzaWJsZSAqLworI2luY2x1ZGUgPHZhbHVlLmg+CisjaW5jbHVkZSA8c3ltdGFiLmg+CisKKy8qIEZsYWcgc2V0IGlmIHRhcmdldCBoYXMgZnB1ICovCisKK2V4dGVybiBpbnQgdGFyZ2V0X2hhc19mcDsKKworLyogR2VuZXJpYyByZWdpc3RlciByZWFkL3dyaXRlIHJvdXRpbmVzIGluIHJlbW90ZS12eC5jLiAgKi8KKworZXh0ZXJuIHZvaWQgbmV0X3JlYWRfcmVnaXN0ZXJzICgpOworZXh0ZXJuIHZvaWQgbmV0X3dyaXRlX3JlZ2lzdGVycyAoKTsKKworLyogUmVhZCBhIHJlZ2lzdGVyIG9yIHJlZ2lzdGVycyBmcm9tIHRoZSBWeFdvcmtzIHRhcmdldC4KKyAgIFJFR05PIGlzIHRoZSByZWdpc3RlciB0byByZWFkLCBvciAtMSBmb3IgYWxsOyBjdXJyZW50bHksCisgICBpdCBpcyBpZ25vcmVkLiAgRklYTUUgbG9vayBhdCByZWdubyB0byBpbXByb3ZlIGVmZmljaWVuY3kuICAqLworCit2b2lkCit2eF9yZWFkX3JlZ2lzdGVyIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBjaGFyIG1jNjhrX2dyZWdfcGFja2V0W01DNjhLX0dSRUdfUExFTl07CisgIGNoYXIgbWM2OGtfZnByZWdfcGFja2V0W01DNjhLX0ZQUkVHX1BMRU5dOworCisgIC8qIEdldCBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzLiAgKi8KKworICBuZXRfcmVhZF9yZWdpc3RlcnMgKG1jNjhrX2dyZWdfcGFja2V0LCBNQzY4S19HUkVHX1BMRU4sIFBUUkFDRV9HRVRSRUdTKTsKKworICBiY29weSAoJm1jNjhrX2dyZWdfcGFja2V0W01DNjhLX1JfRDBdLCByZWdpc3RlcnMsIDE2ICogTUM2OEtfR1JFR19TSVpFKTsKKyAgYmNvcHkgKCZtYzY4a19ncmVnX3BhY2tldFtNQzY4S19SX1NSXSwgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQU19SRUdOVU0pXSwKKwkgTUM2OEtfR1JFR19TSVpFKTsKKyAgYmNvcHkgKCZtYzY4a19ncmVnX3BhY2tldFtNQzY4S19SX1BDXSwgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQQ19SRUdOVU0pXSwKKwkgTUM2OEtfR1JFR19TSVpFKTsKKworICAvKiBHZXQgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzLCBpZiB0aGUgdGFyZ2V0IHN5c3RlbSBoYXMgdGhlbS4KKyAgICAgT3RoZXJ3aXNlLCB6ZXJvIHRoZW0uICAqLworCisgIGlmICh0YXJnZXRfaGFzX2ZwKQorICAgIHsKKyAgICAgIG5ldF9yZWFkX3JlZ2lzdGVycyAobWM2OGtfZnByZWdfcGFja2V0LCBNQzY4S19GUFJFR19QTEVOLAorCQkJICBQVFJBQ0VfR0VURlBSRUdTKTsKKworICAgICAgYmNvcHkgKCZtYzY4a19mcHJlZ19wYWNrZXRbTUM2OEtfUl9GUDBdLAorCSAgICAgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNKV0sCisJICAgICBNQzY4S19GUFJFR19TSVpFICogOCk7CisgICAgICBiY29weSAoJm1jNjhrX2ZwcmVnX3BhY2tldFtNQzY4S19SX0ZQQ1JdLAorCSAgICAgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUENfUkVHTlVNKV0sCisJICAgICBNQzY4S19GUFJFR19QTEVOIC0gKE1DNjhLX0ZQUkVHX1NJWkUgKiA4KSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYnplcm8gKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLAorCSAgICAgTUM2OEtfRlBSRUdfU0laRSAqIDgpOworICAgICAgYnplcm8gKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlBDX1JFR05VTSldLAorCSAgICAgTUM2OEtfRlBSRUdfUExFTiAtIChNQzY4S19GUFJFR19TSVpFICogOCkpOworICAgIH0KKworICAvKiBNYXJrIHRoZSByZWdpc3RlciBjYWNoZSB2YWxpZC4gICovCisKKyAgcmVnaXN0ZXJzX2ZldGNoZWQgKCk7Cit9CisKKy8qIFN0b3JlIGEgcmVnaXN0ZXIgb3IgcmVnaXN0ZXJzIGludG8gdGhlIFZ4V29ya3MgdGFyZ2V0LgorICAgUkVHTk8gaXMgdGhlIHJlZ2lzdGVyIHRvIHN0b3JlLCBvciAtMSBmb3IgYWxsOyBjdXJyZW50bHksCisgICBpdCBpcyBpZ25vcmVkLiAgRklYTUUgbG9vayBhdCByZWdubyB0byBpbXByb3ZlIGVmZmljaWVuY3kuICAqLworCit2b2lkCit2eF93cml0ZV9yZWdpc3RlciAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgY2hhciBtYzY4a19ncmVnX3BhY2tldFtNQzY4S19HUkVHX1BMRU5dOworICBjaGFyIG1jNjhrX2ZwcmVnX3BhY2tldFtNQzY4S19GUFJFR19QTEVOXTsKKworICAvKiBTdG9yZSBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzLiAgKi8KKworICBiY29weSAocmVnaXN0ZXJzLCAmbWM2OGtfZ3JlZ19wYWNrZXRbTUM2OEtfUl9EMF0sIDE2ICogTUM2OEtfR1JFR19TSVpFKTsKKyAgYmNvcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUFNfUkVHTlVNKV0sCisJICZtYzY4a19ncmVnX3BhY2tldFtNQzY4S19SX1NSXSwgTUM2OEtfR1JFR19TSVpFKTsKKyAgYmNvcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUENfUkVHTlVNKV0sCisJICZtYzY4a19ncmVnX3BhY2tldFtNQzY4S19SX1BDXSwgTUM2OEtfR1JFR19TSVpFKTsKKworICBuZXRfd3JpdGVfcmVnaXN0ZXJzIChtYzY4a19ncmVnX3BhY2tldCwgTUM2OEtfR1JFR19QTEVOLCBQVFJBQ0VfU0VUUkVHUyk7CisKKyAgLyogU3RvcmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGlmIHRoZSB0YXJnZXQgaGFzIHRoZW0uICAqLworCisgIGlmICh0YXJnZXRfaGFzX2ZwKQorICAgIHsKKyAgICAgIGJjb3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pXSwKKwkgICAgICZtYzY4a19mcHJlZ19wYWNrZXRbTUM2OEtfUl9GUDBdLAorCSAgICAgTUM2OEtfRlBSRUdfU0laRSAqIDgpOworICAgICAgYmNvcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlBDX1JFR05VTSldLAorCSAgICAgJm1jNjhrX2ZwcmVnX3BhY2tldFtNQzY4S19SX0ZQQ1JdLAorCSAgICAgTUM2OEtfRlBSRUdfUExFTiAtIChNQzY4S19GUFJFR19TSVpFICogOCkpOworCisgICAgICBuZXRfd3JpdGVfcmVnaXN0ZXJzIChtYzY4a19mcHJlZ19wYWNrZXQsIE1DNjhLX0ZQUkVHX1BMRU4sCisJCQkgICBQVFJBQ0VfU0VURlBSRUdTKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9nZGIvcmVtb3RlLXZ4OTYwLmMgYi9nZGIvcmVtb3RlLXZ4OTYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0ZmJlZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZW1vdGUtdng5NjAuYwpAQCAtMCwwICsxLDE2MyBAQAorLyogaTgwOTYwLWRlcGVuZGVudCBwb3J0aW9ucyBvZiB0aGUgUlBDIHByb3RvY29sCisgICB1c2VkIHdpdGggYSBWeFdvcmtzIHRhcmdldCAKKworQ29udHJpYnV0ZWQgYnkgV2luZCBSaXZlciBTeXN0ZW1zLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImRlZnMuaCIKKworI2luY2x1ZGUgInZ4LXNoYXJlL3JlZ1BhY2tldC5oIiAgCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgIndhaXQuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIJCS8qIGZvciBzdHJ1Y3QgY29tcGxhaW50ICovCisKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaWZkZWYgX0FJWCAgICAgICAgICAgICAgICAgICAgIC8qIElCTSBjbGFpbXMgInZvaWQgKm1hbGxvYygpIiBub3QgY2hhciAqICovCisjZGVmaW5lIG1hbGxvYyBib2dvbl9tYWxsb2MKKyNlbmRpZgorCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CQkvKiBVVGVrJ3MgPHJwYy9ycGMuaD4gZG9lc24ndCAjaW5jbCB0aGlzICovCisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlICJ2eC1zaGFyZS9wdHJhY2UuaCIKKyNpbmNsdWRlICJ2eC1zaGFyZS94ZHJfcHRyYWNlLmgiCisjaW5jbHVkZSAidngtc2hhcmUveGRyX2xkLmgiCisjaW5jbHVkZSAidngtc2hhcmUveGRyX3JkYi5oIgorI2luY2x1ZGUgInZ4LXNoYXJlL2RiZ1JwY0xpYi5oIgorCisvKiBnZXQgcmlkIG9mIHZhbHVlLmggaWYgcG9zc2libGUgKi8KKyNpbmNsdWRlIDx2YWx1ZS5oPgorI2luY2x1ZGUgPHN5bXRhYi5oPgorCisvKiBGbGFnIHNldCBpZiB0YXJnZXQgaGFzIGZwdSAqLworCitleHRlcm4gaW50IHRhcmdldF9oYXNfZnA7CisKKy8qIDk2MCBmbG9hdGluZyBwb2ludCBmb3JtYXQgZGVzY3JpcHRvciwgZnJvbSAiaTk2MC10ZGVwLmMuIiAgKi8KKworZXh0ZXJuIHN0cnVjdCBleHRfZm9ybWF0IGV4dF9mb3JtYXRfaTk2MDsKKworLyogR2VuZXJpYyByZWdpc3RlciByZWFkL3dyaXRlIHJvdXRpbmVzIGluIHJlbW90ZS12eC5jLiAgKi8KKworZXh0ZXJuIHZvaWQgbmV0X3JlYWRfcmVnaXN0ZXJzICgpOworZXh0ZXJuIHZvaWQgbmV0X3dyaXRlX3JlZ2lzdGVycyAoKTsKKworLyogUmVhZCBhIHJlZ2lzdGVyIG9yIHJlZ2lzdGVycyBmcm9tIHRoZSBWeFdvcmtzIHRhcmdldC4KKyAgIFJFR05PIGlzIHRoZSByZWdpc3RlciB0byByZWFkLCBvciAtMSBmb3IgYWxsOyBjdXJyZW50bHksCisgICBpdCBpcyBpZ25vcmVkLiAgRklYTUUgbG9vayBhdCByZWdubyB0byBpbXByb3ZlIGVmZmljaWVuY3kuICAqLworCit2b2lkCit2eF9yZWFkX3JlZ2lzdGVyIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBjaGFyIGk5NjBfZ3JlZ19wYWNrZXRbSTk2MF9HUkVHX1BMRU5dOworICBjaGFyIGk5NjBfZnByZWdfcGFja2V0W0k5NjBfRlBSRUdfUExFTl07CisKKyAgLyogR2V0IGdlbmVyYWwtcHVycG9zZSByZWdpc3RlcnMuICBXaGVuIGNvcHlpbmcgdmFsdWVzIGludG8KKyAgICAgcmVnaXN0ZXJzIFtdLCBkb24ndCBhc3N1bWUgdGhhdCBhIGxvY2F0aW9uIGluIHJlZ2lzdGVycyBbXQorICAgICBpcyBwcm9wZXJseSBhbGlnbmVkIGZvciB0aGUgdGFyZ2V0IGRhdGEgdHlwZS4gICovCisKKyAgbmV0X3JlYWRfcmVnaXN0ZXJzIChpOTYwX2dyZWdfcGFja2V0LCBJOTYwX0dSRUdfUExFTiwgUFRSQUNFX0dFVFJFR1MpOworCisgIGJjb3B5ICgmaTk2MF9ncmVnX3BhY2tldFtJOTYwX1JfUjBdLAorCSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKFIwX1JFR05VTSldLCAxNiAqIEk5NjBfR1JFR19TSVpFKTsKKyAgYmNvcHkgKCZpOTYwX2dyZWdfcGFja2V0W0k5NjBfUl9HMF0sCisJICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRzBfUkVHTlVNKV0sIDE2ICogSTk2MF9HUkVHX1NJWkUpOworICBiY29weSAoJmk5NjBfZ3JlZ19wYWNrZXRbSTk2MF9SX1BDV10sCisJICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUENXX1JFR05VTSldLCBzaXplb2YgKGludCkpOworICBiY29weSAoJmk5NjBfZ3JlZ19wYWNrZXRbSTk2MF9SX0FDV10sCisJICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoQUNXX1JFR05VTSldLCBzaXplb2YgKGludCkpOworICBiY29weSAoJmk5NjBfZ3JlZ19wYWNrZXRbSTk2MF9SX1RDV10sCisJICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoVENXX1JFR05VTSldLCBzaXplb2YgKGludCkpOworCisgIC8qIElmIHRoZSB0YXJnZXQgaGFzIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycywgZmV0Y2ggdGhlbS4KKyAgICAgT3RoZXJ3aXNlLCB6ZXJvIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciB2YWx1ZXMgaW4KKyAgICAgcmVnaXN0ZXJzW10gZm9yIGdvb2QgbWVhc3VyZSwgZXZlbiB0aG91Z2ggd2UgbWlnaHQgbm90CisgICAgIG5lZWQgdG8uICAqLworCisgIGlmICh0YXJnZXRfaGFzX2ZwKQorICAgIHsKKyAgICAgIG5ldF9yZWFkX3JlZ2lzdGVycyAoaTk2MF9mcHJlZ19wYWNrZXQsIEk5NjBfRlBSRUdfUExFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFRSQUNFX0dFVEZQUkVHUyk7CisgICAgICBiY29weSAoJmk5NjBfZnByZWdfcGFja2V0W0k5NjBfUl9GUDBdLCAKKyAgICAgICAgICAgICAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pXSwKKyAgCSAgICAgUkVHSVNURVJfUkFXX1NJWkUgKEZQMF9SRUdOVU0pICogNCk7CisgICAgfQorICBlbHNlCisgICAgYnplcm8gKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLAorICAgICAgICAgICBSRUdJU1RFUl9SQVdfU0laRSAoRlAwX1JFR05VTSkgKiA0KTsKKworICAvKiBNYXJrIHRoZSByZWdpc3RlciBjYWNoZSB2YWxpZC4gICovCisKKyAgcmVnaXN0ZXJzX2ZldGNoZWQgKCk7Cit9CisKKy8qIFN0b3JlIGEgcmVnaXN0ZXIgb3IgcmVnaXN0ZXJzIGludG8gdGhlIFZ4V29ya3MgdGFyZ2V0LgorICAgUkVHTk8gaXMgdGhlIHJlZ2lzdGVyIHRvIHN0b3JlLCBvciAtMSBmb3IgYWxsOyBjdXJyZW50bHksCisgICBpdCBpcyBpZ25vcmVkLiAgRklYTUUgbG9vayBhdCByZWdubyB0byBpbXByb3ZlIGVmZmljaWVuY3kuICAqLworCit2b2lkCit2eF93cml0ZV9yZWdpc3RlciAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgY2hhciBpOTYwX2dyZWdfcGFja2V0W0k5NjBfR1JFR19QTEVOXTsKKyAgY2hhciBpOTYwX2ZwcmVnX3BhY2tldFtJOTYwX0ZQUkVHX1BMRU5dOworCisgIC8qIFN0b3JlIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVycy4gIFdoZW4gY29weWluZyB2YWx1ZXMgZnJvbQorICAgICByZWdpc3RlcnMgW10sIGRvbid0IGFzc3VtZSB0aGF0IGEgbG9jYXRpb24gaW4gcmVnaXN0ZXJzIFtdCisgICAgIGlzIHByb3Blcmx5IGFsaWduZWQgZm9yIHRoZSB0YXJnZXQgZGF0YSB0eXBlLiAgKi8KKworICBiY29weSAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChSMF9SRUdOVU0pXSwKKwkgJmk5NjBfZ3JlZ19wYWNrZXRbSTk2MF9SX1IwXSwgMTYgKiBJOTYwX0dSRUdfU0laRSk7CisgIGJjb3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEcwX1JFR05VTSldLAorCSAmaTk2MF9ncmVnX3BhY2tldFtJOTYwX1JfRzBdLCAxNiAqIEk5NjBfR1JFR19TSVpFKTsKKyAgYmNvcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUENXX1JFR05VTSldLAorCSAmaTk2MF9ncmVnX3BhY2tldFtJOTYwX1JfUENXXSwgc2l6ZW9mIChpbnQpKTsKKyAgYmNvcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoQUNXX1JFR05VTSldLAorCSAmaTk2MF9ncmVnX3BhY2tldFtJOTYwX1JfQUNXXSwgc2l6ZW9mIChpbnQpKTsKKyAgYmNvcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoVENXX1JFR05VTSldLAorCSAmaTk2MF9ncmVnX3BhY2tldFtJOTYwX1JfVENXXSwgc2l6ZW9mIChpbnQpKTsKKworICBuZXRfd3JpdGVfcmVnaXN0ZXJzIChpOTYwX2dyZWdfcGFja2V0LCBJOTYwX0dSRUdfUExFTiwgUFRSQUNFX1NFVFJFR1MpOworCisgIC8qIFN0b3JlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBpZiB0aGUgdGFyZ2V0IGhhcyB0aGVtLiAgKi8KKworICBpZiAodGFyZ2V0X2hhc19mcCkKKyAgICB7CisgICAgICBiY29weSAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNKV0sIAorCSAgICAgJmk5NjBfZnByZWdfcGFja2V0W0k5NjBfUl9GUDBdLAorCSAgICAgUkVHSVNURVJfUkFXX1NJWkUgKEZQMF9SRUdOVU0pICogNCk7CisKKyAgICAgIG5ldF93cml0ZV9yZWdpc3RlcnMgKGk5NjBfZnByZWdfcGFja2V0LCBJOTYwX0ZQUkVHX1BMRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFJBQ0VfU0VURlBSRUdTKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2dkYi9yZW1vdGUtdnhtaXBzLmMgYi9nZGIvcmVtb3RlLXZ4bWlwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NWFjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvcmVtb3RlLXZ4bWlwcy5jCkBAIC0wLDAgKzEsMjAxIEBACisvKiBNSVBTLWRlcGVuZGVudCBwb3J0aW9ucyBvZiB0aGUgUlBDIHByb3RvY29sCisgICB1c2VkIHdpdGggYSBWeFdvcmtzIHRhcmdldCAKKworQ29udHJpYnV0ZWQgYnkgV2luZCBSaXZlciBTeXN0ZW1zLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImRlZnMuaCIKKworI2luY2x1ZGUgInZ4LXNoYXJlL3JlZ1BhY2tldC5oIiAgCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgIndhaXQuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIJCS8qIGZvciBzdHJ1Y3QgY29tcGxhaW50ICovCisKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHJwYy9ycGMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgkJLyogVVRlaydzIDxycGMvcnBjLmg+IGRvZXNuJ3QgI2luY2wgdGhpcyAqLworI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSAidngtc2hhcmUvcHRyYWNlLmgiCisjaW5jbHVkZSAidngtc2hhcmUveGRyX3B0cmFjZS5oIgorI2luY2x1ZGUgInZ4LXNoYXJlL3hkcl9sZC5oIgorI2luY2x1ZGUgInZ4LXNoYXJlL3hkcl9yZGIuaCIKKyNpbmNsdWRlICJ2eC1zaGFyZS9kYmdScGNMaWIuaCIKKworLyogZ2V0IHJpZCBvZiB2YWx1ZS5oIGlmIHBvc3NpYmxlICovCisjaW5jbHVkZSA8dmFsdWUuaD4KKyNpbmNsdWRlIDxzeW10YWIuaD4KKworLyogRmxhZyBzZXQgaWYgdGFyZ2V0IGhhcyBmcHUgKi8KKworZXh0ZXJuIGludCB0YXJnZXRfaGFzX2ZwOworCisvKiBHZW5lcmljIHJlZ2lzdGVyIHJlYWQvd3JpdGUgcm91dGluZXMgaW4gcmVtb3RlLXZ4LmMuICAqLworCitleHRlcm4gdm9pZCBuZXRfcmVhZF9yZWdpc3RlcnMgKCk7CitleHRlcm4gdm9pZCBuZXRfd3JpdGVfcmVnaXN0ZXJzICgpOworCisvKiBSZWFkIGEgcmVnaXN0ZXIgb3IgcmVnaXN0ZXJzIGZyb20gdGhlIFZ4V29ya3MgdGFyZ2V0LgorICAgUkVHTk8gaXMgdGhlIHJlZ2lzdGVyIHRvIHJlYWQsIG9yIC0xIGZvciBhbGw7IGN1cnJlbnRseSwKKyAgIGl0IGlzIGlnbm9yZWQuICBGSVhNRSBsb29rIGF0IHJlZ25vIHRvIGltcHJvdmUgZWZmaWNpZW5jeS4gICovCisKK3ZvaWQKK3Z4X3JlYWRfcmVnaXN0ZXIgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGNoYXIgbWlwc19ncmVnX3BhY2tldFtNSVBTX0dSRUdfUExFTl07CisgIGNoYXIgbWlwc19mcHJlZ19wYWNrZXRbTUlQU19GUFJFR19QTEVOXTsKKworICAvKiBHZXQgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycy4gICovCisKKyAgbmV0X3JlYWRfcmVnaXN0ZXJzIChtaXBzX2dyZWdfcGFja2V0LCBNSVBTX0dSRUdfUExFTiwgUFRSQUNFX0dFVFJFR1MpOworCisgIC8qIHRoaXMgY29kZSBjb3BpZXMgdGhlIHJlZ2lzdGVycyBvYnRhaW5lZCBieSBSUEMgCisgICAgIHN0b3JlZCBpbiBhIHN0cnVjdHVyZShzKSBsaWtlIHRoaXMgOgorICAgICAKKyAgICAJUmVnaXN0ZXIocykJCU9mZnNldChzKQorICAgCWdwIDAtMzEJCQkweDAwCisgICAJaGkJCQkweDgwCisgICAJbG8JCQkweDg0CisgICAJc3IJCQkweDg4CisgICAJcGMJCQkweDhjCisgICAgCisgICAgIGludG8gYSBzdHVjdHVyZSBsaWtlIHRoaXM6CisgICAJCisgICAJMHgwMAlHUCAwLTMxCisgICAJMHg4MCAgIAlTUgorICAgCTB4ODQJTE8KKyAgIAkweDg4CUhJCisgICAJMHg4QwlCQUQgICAgCQktLS0gTm90IGF2YWlsYWJsZSBjdXJyZW50bHkKKyAgIAkweDkwCUNBVVNFICAgIAktLS0gTm90IGF2YWlsYWJsZSBjdXJyZW50bHkKKyAgIAkweDk0CVBDCisgICAJMHg5OAlGUCAwLTMxCisgICAJMHgxMTgJRkNTUgorICAgCTB4MTFDCUZJUiAgICAJCS0tLSBOb3QgYXZhaWxhYmxlIGN1cnJlbnRseQorICAgCTB4MTIwCUZQCSAgICAJLS0tIE5vdCBhdmFpbGFibGUgY3VycmVudGx5CisgICAKKyAgICAgc3RydWN0dXJlIGlzIDB4MTI0ICgyOTIpIGJ5dGVzIGluIGxlbmd0aCAqLworICAgCisgIC8qIENvcHkgdGhlIGdlbmVyYWwgcmVnaXN0ZXJzLiAgKi8KKyAgCisgIGJjb3B5ICgmbWlwc19ncmVnX3BhY2tldFtNSVBTX1JfR1AwXSwgJnJlZ2lzdGVyc1swXSwgMzIgKiBNSVBTX0dSRUdfU0laRSk7CisgIAorICAvKiBDb3B5IFNSLCBMTywgSEksIGFuZCBQQy4gICovCisgIAorICBiY29weSAoJm1pcHNfZ3JlZ19wYWNrZXRbTUlQU19SX1NSXSwKKyAgICAgICAgICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUFNfUkVHTlVNKV0sIE1JUFNfR1JFR19TSVpFKTsKKyAgYmNvcHkgKCZtaXBzX2dyZWdfcGFja2V0W01JUFNfUl9MT10sCisgICAgICAgICAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKExPX1JFR05VTSldLCBNSVBTX0dSRUdfU0laRSk7CisgIGJjb3B5ICgmbWlwc19ncmVnX3BhY2tldFtNSVBTX1JfSEldLAorICAgICAgICAgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChISV9SRUdOVU0pXSwgTUlQU19HUkVHX1NJWkUpOworICBiY29weSAoJm1pcHNfZ3JlZ19wYWNrZXRbTUlQU19SX1BDXSwKKyAgICAgICAgICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUENfUkVHTlVNKV0sIE1JUFNfR1JFR19TSVpFKTsKKyAgCisgIC8qIElmIHRoZSB0YXJnZXQgaGFzIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycywgZmV0Y2ggdGhlbS4KKyAgICAgT3RoZXJ3aXNlLCB6ZXJvIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciB2YWx1ZXMgaW4KKyAgICAgcmVnaXN0ZXJzW10gZm9yIGdvb2QgbWVhc3VyZSwgZXZlbiB0aG91Z2ggd2UgbWlnaHQgbm90CisgICAgIG5lZWQgdG8uICAqLworICAgIAorICBpZiAodGFyZ2V0X2hhc19mcCkKKyAgICB7CisgICAgICBuZXRfcmVhZF9yZWdpc3RlcnMgKG1pcHNfZnByZWdfcGFja2V0LCBNSVBTX0ZQUkVHX1BMRU4sCisJCQkgIFBUUkFDRV9HRVRGUFJFR1MpOworCisgICAgICAvKiBDb3B5IHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMuICAqLworCisgICAgICBiY29weSAoJm1pcHNfZnByZWdfcGFja2V0W01JUFNfUl9GUDBdLCAKKwkgICAgICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLAorCSAgICAgUkVHSVNURVJfUkFXX1NJWkUgKEZQMF9SRUdOVU0pICogMzIpOworCisgICAgICAvKiBDb3B5IHRoZSBmbG9hdGluZyBwb2ludCBjb250cm9sL3N0YXR1cyByZWdpc3RlciAoZnBjc3IpLiAgKi8KKworICAgICAgYmNvcHkgKCZtaXBzX2ZwcmVnX3BhY2tldFtNSVBTX1JfRlBDU1JdLCAKKwkgICAgICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRkNSQ1NfUkVHTlVNKV0sCisJICAgICBSRUdJU1RFUl9SQVdfU0laRSAoRkNSQ1NfUkVHTlVNKSk7CisgICAgfQkKKyAgZWxzZQorICAgIHsJCisgICAgICBiemVybyAoKGNoYXIgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNKV0sCisJICAgICBSRUdJU1RFUl9SQVdfU0laRSAoRlAwX1JFR05VTSkgKiAzMik7CisgICAgICBiemVybyAoKGNoYXIgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGQ1JDU19SRUdOVU0pXSwKKwkgICAgIFJFR0lTVEVSX1JBV19TSVpFIChGQ1JDU19SRUdOVU0pKTsKKyAgICB9CQkKKworICAvKiBNYXJrIHRoZSByZWdpc3RlciBjYWNoZSB2YWxpZC4gICovCisKKyAgcmVnaXN0ZXJzX2ZldGNoZWQgKCk7Cit9CisKKy8qIFN0b3JlIGEgcmVnaXN0ZXIgb3IgcmVnaXN0ZXJzIGludG8gdGhlIFZ4V29ya3MgdGFyZ2V0LgorICAgUkVHTk8gaXMgdGhlIHJlZ2lzdGVyIHRvIHN0b3JlLCBvciAtMSBmb3IgYWxsOyBjdXJyZW50bHksCisgICBpdCBpcyBpZ25vcmVkLiAgRklYTUUgbG9vayBhdCByZWdubyB0byBpbXByb3ZlIGVmZmljaWVuY3kuICAqLworCit2eF93cml0ZV9yZWdpc3RlciAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgY2hhciBtaXBzX2dyZWdfcGFja2V0W01JUFNfR1JFR19QTEVOXTsKKyAgY2hhciBtaXBzX2ZwcmVnX3BhY2tldFtNSVBTX0ZQUkVHX1BMRU5dOworCisgIC8qIFN0b3JlIGdlbmVyYWwgcmVnaXN0ZXJzLiAgKi8KKworICBiY29weSAoJnJlZ2lzdGVyc1swXSwgJm1pcHNfZ3JlZ19wYWNrZXRbTUlQU19SX0dQMF0sIDMyICogTUlQU19HUkVHX1NJWkUpOworICAKKyAgLyogQ29weSBTUiwgTE8sIEhJLCBhbmQgUEMuICAqLworICAKKyAgYmNvcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUFNfUkVHTlVNKV0sCisgICAgICAgICAmbWlwc19ncmVnX3BhY2tldFtNSVBTX1JfU1JdLCBNSVBTX0dSRUdfU0laRSk7CisgIGJjb3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKExPX1JFR05VTSldLAorICAgICAgICAgJm1pcHNfZ3JlZ19wYWNrZXRbTUlQU19SX0xPXSwgTUlQU19HUkVHX1NJWkUpOworICBiY29weSAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChISV9SRUdOVU0pXSwKKyAgICAgICAgICZtaXBzX2dyZWdfcGFja2V0W01JUFNfUl9ISV0sIE1JUFNfR1JFR19TSVpFKTsKKyAgYmNvcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUENfUkVHTlVNKV0sCisgICAgICAgICAmbWlwc19ncmVnX3BhY2tldFtNSVBTX1JfUENdLCBNSVBTX0dSRUdfU0laRSk7CisgIAorICBuZXRfd3JpdGVfcmVnaXN0ZXJzIChtaXBzX2dyZWdfcGFja2V0LCBNSVBTX0dSRUdfUExFTiwgUFRSQUNFX1NFVFJFR1MpOworCisgIC8qIFN0b3JlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBpZiB0aGUgdGFyZ2V0IGhhcyB0aGVtLiAgKi8KKworICBpZiAodGFyZ2V0X2hhc19mcCkKKyAgICB7CisgICAgICAvKiBDb3B5IHRoZSBmbG9hdGluZyBwb2ludCBkYXRhIHJlZ2lzdGVycy4gICovCisKKyAgICAgIGJjb3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pXSwKKwkgICAgICZtaXBzX2ZwcmVnX3BhY2tldFtNSVBTX1JfRlAwXSwgCisJICAgICBSRUdJU1RFUl9SQVdfU0laRSAoRlAwX1JFR05VTSkgKiAzMik7CisKKyAgICAgIC8qIENvcHkgdGhlIGZsb2F0aW5nIHBvaW50IGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyIChmcGNzcikuICAqLworCisgICAgICBiY29weSAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGQ1JDU19SRUdOVU0pXSwKKwkgICAgICZtaXBzX2ZwcmVnX3BhY2tldFtNSVBTX1JfRlBDU1JdLCAKKwkgICAgIFJFR0lTVEVSX1JBV19TSVpFIChGQ1JDU19SRUdOVU0pKTsKKworICAgICAgbmV0X3dyaXRlX3JlZ2lzdGVycyAobWlwc19mcHJlZ19wYWNrZXQsIE1JUFNfRlBSRUdfUExFTiwKKwkJCSAgIFBUUkFDRV9TRVRGUFJFR1MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dkYi9yZW1vdGUtdnhzcGFyYy5jIGIvZ2RiL3JlbW90ZS12eHNwYXJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4MjU0MgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZW1vdGUtdnhzcGFyYy5jCkBAIC0wLDAgKzEsMTk2IEBACisvKiBzcGFyYy1kZXBlbmRlbnQgcG9ydGlvbnMgb2YgdGhlIFJQQyBwcm90b2NvbAorICAgdXNlZCB3aXRoIGEgVnhXb3JrcyB0YXJnZXQgCisKK0NvbnRyaWJ1dGVkIGJ5IFdpbmQgUml2ZXIgU3lzdGVtcy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJkZWZzLmgiCisKKyNpbmNsdWRlICJ2eC1zaGFyZS9yZWdQYWNrZXQuaCIgIAorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJ3YWl0LmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCQkvKiBmb3Igc3RydWN0IGNvbXBsYWludCAqLworCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2lmZGVmIF9BSVggICAgICAgICAgICAgICAgICAgICAvKiBJQk0gY2xhaW1zICJ2b2lkICptYWxsb2MoKSIgbm90IGNoYXIgKiAqLworI2RlZmluZSBtYWxsb2MgYm9nb25fbWFsbG9jCisjZW5kaWYKKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgkJLyogVVRlaydzIDxycGMvcnBjLmg+IGRvZXNuJ3QgI2luY2wgdGhpcyAqLworI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSAidngtc2hhcmUvcHRyYWNlLmgiCisjaW5jbHVkZSAidngtc2hhcmUveGRyX3B0cmFjZS5oIgorI2luY2x1ZGUgInZ4LXNoYXJlL3hkcl9sZC5oIgorI2luY2x1ZGUgInZ4LXNoYXJlL3hkcl9yZGIuaCIKKyNpbmNsdWRlICJ2eC1zaGFyZS9kYmdScGNMaWIuaCIKKworLyogZ2V0IHJpZCBvZiB2YWx1ZS5oIGlmIHBvc3NpYmxlICovCisjaW5jbHVkZSA8dmFsdWUuaD4KKyNpbmNsdWRlIDxzeW10YWIuaD4KKworLyogRmxhZyBzZXQgaWYgdGFyZ2V0IGhhcyBmcHUgKi8KKworZXh0ZXJuIGludCB0YXJnZXRfaGFzX2ZwOworCisvKiBzcGFyYyBmbG9hdGluZyBwb2ludCBmb3JtYXQgZGVzY3JpcHRvciwgZnJvbSAic3BhcmMtdGRlcC5jLiIgICovCisKK2V4dGVybiBzdHJ1Y3QgZXh0X2Zvcm1hdCBleHRfZm9ybWF0X3NwYXJjOworCisvKiBHZW5lcmljIHJlZ2lzdGVyIHJlYWQvd3JpdGUgcm91dGluZXMgaW4gcmVtb3RlLXZ4LmMuICAqLworCitleHRlcm4gdm9pZCBuZXRfcmVhZF9yZWdpc3RlcnMgKCk7CitleHRlcm4gdm9pZCBuZXRfd3JpdGVfcmVnaXN0ZXJzICgpOworCisvKiBSZWFkIGEgcmVnaXN0ZXIgb3IgcmVnaXN0ZXJzIGZyb20gdGhlIFZ4V29ya3MgdGFyZ2V0LgorICAgUkVHTk8gaXMgdGhlIHJlZ2lzdGVyIHRvIHJlYWQsIG9yIC0xIGZvciBhbGw7IGN1cnJlbnRseSwKKyAgIGl0IGlzIGlnbm9yZWQuICBGSVhNRSBsb29rIGF0IHJlZ25vIHRvIGltcHJvdmUgZWZmaWNpZW5jeS4gICovCisKK3ZvaWQKK3Z4X3JlYWRfcmVnaXN0ZXIgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGNoYXIgc3BhcmNfZ3JlZ19wYWNrZXRbU1BBUkNfR1JFR19QTEVOXTsKKyAgY2hhciBzcGFyY19mcHJlZ19wYWNrZXRbU1BBUkNfRlBSRUdfUExFTl07CisgIENPUkVfQUREUiBzcDsKKworICAvKiBHZXQgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycy4gIFdoZW4gY29weWluZyB2YWx1ZXMgaW50bworICAgICByZWdpc3RlcnMgW10sIGRvbid0IGFzc3VtZSB0aGF0IGEgbG9jYXRpb24gaW4gcmVnaXN0ZXJzIFtdCisgICAgIGlzIHByb3Blcmx5IGFsaWduZWQgZm9yIHRoZSB0YXJnZXQgZGF0YSB0eXBlLiAgKi8KKworICBuZXRfcmVhZF9yZWdpc3RlcnMgKHNwYXJjX2dyZWdfcGFja2V0LCBTUEFSQ19HUkVHX1BMRU4sIFBUUkFDRV9HRVRSRUdTKTsKKworICAvKiBOb3cgY29weSB0aGUgcmVnaXN0ZXIgdmFsdWVzIGludG8gcmVnaXN0ZXJzW10uCisgICAgIE5vdGUgdGhhdCB0aGlzIGNvZGUgZGVwZW5kcyBvbiB0aGUgb3JkZXJpbmcgb2YgdGhlIFJFR05VTXMKKyAgICAgYXMgZGVmaW5lZCBpbiAidG0tc3BhcmMuaCIuICAqLworCisgIGJjb3B5ICgmc3BhcmNfZ3JlZ19wYWNrZXRbU1BBUkNfUl9HMF0sCisJICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRzBfUkVHTlVNKV0sIDMyICogU1BBUkNfR1JFR19TSVpFKTsKKyAgYmNvcHkgKCZzcGFyY19ncmVnX3BhY2tldFtTUEFSQ19SX1ldLAorCSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKFlfUkVHTlVNKV0sIDYgKiBTUEFSQ19HUkVHX1NJWkUpOworCisgIC8qIE5vdyB3cml0ZSB0aGUgbG9jYWwgYW5kIGluIHJlZ2lzdGVycyB0byB0aGUgcmVnaXN0ZXIgd2luZG93CisgICAgIHNwaWxsIGFyZWEgaW4gdGhlIGZyYW1lLiAgVnhXb3JrcyBkb2VzIG5vdCBkbyB0aGlzIGZvciB0aGUKKyAgICAgYWN0aXZlIGZyYW1lIGF1dG9tYXRpY2FsbHk7IGl0IGdyZWF0bHkgc2ltcGxpZmllcyBkZWJ1Z2dpbmcKKyAgICAgKEZSQU1FX0ZJTkRfU0FWRURfUkVHUywgaW4gcGFydGljdWxhciwgZGVwZW5kcyBvbiB0aGlzKS4gICovCisKKyAgc3AgPSBleHRyYWN0X2FkZHJlc3MgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoU1BfUkVHTlVNKV0sIAorCVJFR0lTVEVSX1JBV19TSVpFIChDT1JFX0FERFIpKTsKKyAgd3JpdGVfbWVtb3J5IChzcCwgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChMMF9SRUdOVU0pXSwKKwkJMTYgKiBSRUdJU1RFUl9SQVdfU0laRSAoTDBfUkVHTlVNKSk7CisKKyAgLyogSWYgdGhlIHRhcmdldCBoYXMgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLCBmZXRjaCB0aGVtLgorICAgICBPdGhlcndpc2UsIHplcm8gdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHZhbHVlcyBpbgorICAgICByZWdpc3RlcnNbXSBmb3IgZ29vZCBtZWFzdXJlLCBldmVuIHRob3VnaCB3ZSBtaWdodCBub3QKKyAgICAgbmVlZCB0by4gICovCisKKyAgaWYgKHRhcmdldF9oYXNfZnApCisgICAgeworICAgICAgbmV0X3JlYWRfcmVnaXN0ZXJzIChzcGFyY19mcHJlZ19wYWNrZXQsIFNQQVJDX0ZQUkVHX1BMRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBUUkFDRV9HRVRGUFJFR1MpOworICAgICAgYmNvcHkgKCZzcGFyY19mcHJlZ19wYWNrZXRbU1BBUkNfUl9GUDBdLCAKKyAgICAgICAgICAgICAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pXSwgMzIgKiBTUEFSQ19GUFJFR19TSVpFKTsKKyAgICAgIGJjb3B5ICgmc3BhcmNfZnByZWdfcGFja2V0W1NQQVJDX1JfRlNSXSwKKwkgICAgICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlBTX1JFR05VTSldLCAxICogU1BBUkNfRlBSRUdfU0laRSk7CisgICAgfQorICBlbHNlCisgICAgeyAKKyAgICAgIGJ6ZXJvICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pXSwgMzIgKiBTUEFSQ19GUFJFR19TSVpFKTsKKyAgICAgIGJ6ZXJvICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQU19SRUdOVU0pXSwgMSAqIFNQQVJDX0ZQUkVHX1NJWkUpOworICAgIH0KKworICAvKiBNYXJrIHRoZSByZWdpc3RlciBjYWNoZSB2YWxpZC4gICovCisKKyAgcmVnaXN0ZXJzX2ZldGNoZWQgKCk7Cit9CisKKy8qIFN0b3JlIGEgcmVnaXN0ZXIgb3IgcmVnaXN0ZXJzIGludG8gdGhlIFZ4V29ya3MgdGFyZ2V0LgorICAgUkVHTk8gaXMgdGhlIHJlZ2lzdGVyIHRvIHN0b3JlLCBvciAtMSBmb3IgYWxsOyBjdXJyZW50bHksCisgICBpdCBpcyBpZ25vcmVkLiAgRklYTUUgbG9vayBhdCByZWdubyB0byBpbXByb3ZlIGVmZmljaWVuY3kuICAqLworCit2b2lkCit2eF93cml0ZV9yZWdpc3RlciAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgY2hhciBzcGFyY19ncmVnX3BhY2tldFtTUEFSQ19HUkVHX1BMRU5dOworICBjaGFyIHNwYXJjX2ZwcmVnX3BhY2tldFtTUEFSQ19GUFJFR19QTEVOXTsKKyAgaW50IGluX2dwX3JlZ3M7CisgIGludCBpbl9mcF9yZWdzOworICBDT1JFX0FERFIgc3A7CisKKyAgLyogU3RvcmUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycy4gIFdoZW4gY29weWluZyB2YWx1ZXMgZnJvbQorICAgICByZWdpc3RlcnMgW10sIGRvbid0IGFzc3VtZSB0aGF0IGEgbG9jYXRpb24gaW4gcmVnaXN0ZXJzIFtdCisgICAgIGlzIHByb3Blcmx5IGFsaWduZWQgZm9yIHRoZSB0YXJnZXQgZGF0YSB0eXBlLiAgKi8KKworICBpbl9ncF9yZWdzID0gMTsKKyAgaW5fZnBfcmVncyA9IDE7CisgIGlmIChyZWdubyA+PSAwKQorICAgIHsKKyAgICAgIGlmICgoRzBfUkVHTlVNIDw9IHJlZ25vICYmIHJlZ25vIDw9IEk3X1JFR05VTSkKKyAgICAgICAgICB8fCAoWV9SRUdOVU0gPD0gcmVnbm8gJiYgcmVnbm8gPD0gTlBDX1JFR05VTSkpCisJaW5fZnBfcmVncyA9IDA7CisgICAgICBlbHNlCisJaW5fZ3BfcmVncyA9IDA7CisgICAgfQorICBpZiAoaW5fZ3BfcmVncykKKyAgICB7CisgICAgICBiY29weSAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChHMF9SRUdOVU0pXSwKKwkgICAgICZzcGFyY19ncmVnX3BhY2tldFtTUEFSQ19SX0cwXSwgMzIgKiBTUEFSQ19HUkVHX1NJWkUpOworICAgICAgYmNvcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoWV9SRUdOVU0pXSwKKwkgICAgICZzcGFyY19ncmVnX3BhY2tldFtTUEFSQ19SX1ldLCA2ICogU1BBUkNfR1JFR19TSVpFKTsKKworICAgICAgbmV0X3dyaXRlX3JlZ2lzdGVycyAoc3BhcmNfZ3JlZ19wYWNrZXQsIFNQQVJDX0dSRUdfUExFTiwgUFRSQUNFX1NFVFJFR1MpOworCisgICAgICAvKiBJZiB0aGlzIGlzIGEgbG9jYWwgb3IgaW4gcmVnaXN0ZXIsIG9yIHdlJ3JlIHN0b3JpbmcgYWxsCisgICAgICAgICByZWdpc3RlcnMsIHVwZGF0ZSB0aGUgcmVnaXN0ZXIgd2luZG93IHNwaWxsIGFyZWEuICAqLworCisgICAgICBpZiAocmVnbm8gPCAwIHx8IChMMF9SRUdOVU0gPD0gcmVnbm8gJiYgcmVnbm8gPD0gSTdfUkVHTlVNKSkKKyAgICAgICAgeworICAJICBzcCA9IGV4dHJhY3RfYWRkcmVzcyAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChTUF9SRUdOVU0pXSwgCisJCVJFR0lTVEVSX1JBV19TSVpFIChDT1JFX0FERFIpKTsKKwkgIHdyaXRlX21lbW9yeSAoc3AsICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoTDBfUkVHTlVNKV0sCisJCQkxNiAqIFJFR0lTVEVSX1JBV19TSVpFIChMMF9SRUdOVU0pKTsKKwl9CisgICAgfQorCisgIC8qIFN0b3JlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBpZiB0aGUgdGFyZ2V0IGhhcyB0aGVtLiAgKi8KKworICBpZiAoaW5fZnBfcmVncyAmJiB0YXJnZXRfaGFzX2ZwKQorICAgIHsKKyAgICAgIGJjb3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pXSwgCisJICAgICAmc3BhcmNfZnByZWdfcGFja2V0W1NQQVJDX1JfRlAwXSwgMzIgKiBTUEFSQ19GUFJFR19TSVpFKTsKKyAgICAgIGJjb3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQU19SRUdOVU0pXSwgCisJICAgICAmc3BhcmNfZnByZWdfcGFja2V0W1NQQVJDX1JfRlNSXSwgMSAqIFNQQVJDX0ZQUkVHX1NJWkUpOworCisgICAgICBuZXRfd3JpdGVfcmVnaXN0ZXJzIChzcGFyY19mcHJlZ19wYWNrZXQsIFNQQVJDX0ZQUkVHX1BMRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFJBQ0VfU0VURlBSRUdTKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9nZGIvcmVtb3RlLmMgYi9nZGIvcmVtb3RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjViNmY3YwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yZW1vdGUuYwpAQCAtMCwwICsxLDM0NzMgQEAKKy8qIFJlbW90ZSB0YXJnZXQgY29tbXVuaWNhdGlvbnMgZm9yIHNlcmlhbC1saW5lIHRhcmdldHMgaW4gY3VzdG9tIEdEQiBwcm90b2NvbAorICAgQ29weXJpZ2h0IDE5ODgsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogUmVtb3RlIGNvbW11bmljYXRpb24gcHJvdG9jb2wuCisKKyAgIEEgZGVidWcgcGFja2V0IHdob3NlIGNvbnRlbnRzIGFyZSA8ZGF0YT4KKyAgIGlzIGVuY2Fwc3VsYXRlZCBmb3IgdHJhbnNtaXNzaW9uIGluIHRoZSBmb3JtOgorCisJJCA8ZGF0YT4gIyBDU1VNMSBDU1VNMgorCisJPGRhdGE+IG11c3QgYmUgQVNDSUkgYWxwaGFudW1lcmljIGFuZCBjYW5ub3QgaW5jbHVkZSBjaGFyYWN0ZXJzCisJJyQnIG9yICcjJy4gIElmIDxkYXRhPiBzdGFydHMgd2l0aCB0d28gY2hhcmFjdGVycyBmb2xsb3dlZCBieQorCSc6JywgdGhlbiB0aGUgZXhpc3Rpbmcgc3R1YnMgaW50ZXJwcmV0IHRoaXMgYXMgYSBzZXF1ZW5jZSBudW1iZXIuCisKKwlDU1VNMSBhbmQgQ1NVTTIgYXJlIGFzY2lpIGhleCByZXByZXNlbnRhdGlvbiBvZiBhbiA4LWJpdCAKKwljaGVja3N1bSBvZiA8ZGF0YT4sIHRoZSBtb3N0IHNpZ25pZmljYW50IG5pYmJsZSBpcyBzZW50IGZpcnN0LgorCXRoZSBoZXggZGlnaXRzIDAtOSxhLWYgYXJlIHVzZWQuCisKKyAgIFJlY2VpdmVyIHJlc3BvbmRzIHdpdGg6CisKKwkrCS0gaWYgQ1NVTSBpcyBjb3JyZWN0IGFuZCByZWFkeSBmb3IgbmV4dCBwYWNrZXQKKwktCS0gaWYgQ1NVTSBpcyBpbmNvcnJlY3QKKworICAgPGRhdGE+IGlzIGFzIGZvbGxvd3M6CisgICBNb3N0IHZhbHVlcyBhcmUgZW5jb2RlZCBpbiBhc2NpaSBoZXggZGlnaXRzLiAgU2lnbmFsIG51bWJlcnMgYXJlIGFjY29yZGluZworICAgdG8gdGhlIG51bWJlcmluZyBpbiB0YXJnZXQuaC4KKworCVJlcXVlc3QJCVBhY2tldAorCisJc2V0IHRocmVhZAlIY3QuLi4JCVNldCB0aHJlYWQgZm9yIHN1YnNlcXVlbnQgb3BlcmF0aW9ucy4KKwkJCQkJYyA9ICdjJyBmb3IgdGhyZWFkIHVzZWQgaW4gc3RlcCBhbmQgCisJCQkJCWNvbnRpbnVlOyB0Li4uIGNhbiBiZSAtMSBmb3IgYWxsCisJCQkJCXRocmVhZHMuCisJCQkJCWMgPSAnZycgZm9yIHRocmVhZCB1c2VkIGluIG90aGVyCisJCQkJCW9wZXJhdGlvbnMuICBJZiB6ZXJvLCBwaWNrIGEgdGhyZWFkLAorCQkJCQlhbnkgdGhyZWFkLgorCXJlcGx5CQlPSwkJZm9yIHN1Y2Nlc3MKKwkJCUVOTgkJZm9yIGFuIGVycm9yLgorCisJcmVhZCByZWdpc3RlcnMgIGcKKwlyZXBseQkJWFguLi4uWAkJRWFjaCBieXRlIG9mIHJlZ2lzdGVyIGRhdGEKKwkJCQkJaXMgZGVzY3JpYmVkIGJ5IHR3byBoZXggZGlnaXRzLgorCQkJCQlSZWdpc3RlcnMgYXJlIGluIHRoZSBpbnRlcm5hbCBvcmRlcgorCQkJCQlmb3IgR0RCLCBhbmQgdGhlIGJ5dGVzIGluIGEgcmVnaXN0ZXIKKwkJCQkJYXJlIGluIHRoZSBzYW1lIG9yZGVyIHRoZSBtYWNoaW5lIHVzZXMuCisJCQlvciBFTk4JCWZvciBhbiBlcnJvci4KKworCXdyaXRlIHJlZ3MJR1hYLi5YWAkJRWFjaCBieXRlIG9mIHJlZ2lzdGVyIGRhdGEKKwkJCQkJaXMgZGVzY3JpYmVkIGJ5IHR3byBoZXggZGlnaXRzLgorCXJlcGx5CQlPSwkJZm9yIHN1Y2Nlc3MKKwkJCUVOTgkJZm9yIGFuIGVycm9yCisKKyAgICAgICAgd3JpdGUgcmVnCVBuLi4uPXIuLi4JV3JpdGUgcmVnaXN0ZXIgbi4uLiB3aXRoIHZhbHVlIHIuLi4sCisJCQkJCXdoaWNoIGNvbnRhaW5zIHR3byBoZXggZGlnaXRzIGZvciBlYWNoCisJCQkJCWJ5dGUgaW4gdGhlIHJlZ2lzdGVyICh0YXJnZXQgYnl0ZQorCQkJCQlvcmRlcikuCisJcmVwbHkJCU9LCQlmb3Igc3VjY2VzcworCQkJRU5OCQlmb3IgYW4gZXJyb3IKKwkobm90IHN1cHBvcnRlZCBieSBhbGwgc3R1YnMpLgorCisJcmVhZCBtZW0JbUFBLi5BQSxMTExMCUFBLi5BQSBpcyBhZGRyZXNzLCBMTExMIGlzIGxlbmd0aC4KKwlyZXBseQkJWFguLlhYCQlYWC4uWFggaXMgbWVtIGNvbnRlbnRzCisJCQkJCUNhbiBiZSBmZXdlciBieXRlcyB0aGFuIHJlcXVlc3RlZAorCQkJCQlpZiBhYmxlIHRvIHJlYWQgb25seSBwYXJ0IG9mIHRoZSBkYXRhLgorCQkJb3IgRU5OCQlOTiBpcyBlcnJubworCisJd3JpdGUgbWVtCU1BQS4uQUEsTExMTDpYWC4uWFgKKwkJCQkJQUEuLkFBIGlzIGFkZHJlc3MsCisJCQkJCUxMTEwgaXMgbnVtYmVyIG9mIGJ5dGVzLAorCQkJCQlYWC4uWFggaXMgZGF0YQorCXJlcGx5CQlPSwkJZm9yIHN1Y2Nlc3MKKwkJCUVOTgkJZm9yIGFuIGVycm9yICh0aGlzIGluY2x1ZGVzIHRoZSBjYXNlCisJCQkJCXdoZXJlIG9ubHkgcGFydCBvZiB0aGUgZGF0YSB3YXMKKwkJCQkJd3JpdHRlbikuCisKKyAgICAgICAgd3JpdGUgbWVtICAgICAgIFhBQS4uQUEsTExMTDpYWC4uWFgKKyAgICAgICAgIChiaW5hcnkpICAgICAgICAgICAgICAgICAgICAgICBBQS4uQUEgaXMgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTExMIGlzIG51bWJlciBvZiBieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYWC4uWFggaXMgYmluYXJ5IGRhdGEKKyAgICAgICAgcmVwbHkgICAgICAgICAgIE9LICAgICAgICAgICAgICBmb3Igc3VjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgRU5OICAgICAgICAgICAgIGZvciBhbiBlcnJvcgorCisJY29udGludWUJY0FBLi5BQQkJQUEuLkFBIGlzIGFkZHJlc3MgdG8gcmVzdW1lCisJCQkJCUlmIEFBLi5BQSBpcyBvbWl0dGVkLAorCQkJCQlyZXN1bWUgYXQgc2FtZSBhZGRyZXNzLgorCisJc3RlcAkJc0FBLi5BQQkJQUEuLkFBIGlzIGFkZHJlc3MgdG8gcmVzdW1lCisJCQkJCUlmIEFBLi5BQSBpcyBvbWl0dGVkLAorCQkJCQlyZXN1bWUgYXQgc2FtZSBhZGRyZXNzLgorCisJY29udGludWUgd2l0aAlDc2lnO0FBLi5BQQlDb250aW51ZSB3aXRoIHNpZ25hbCBzaWcgKGhleCBzaWduYWwKKwlzaWduYWwJCQkJbnVtYmVyKS4gIElmIDtBQS4uQUEgaXMgb21pdHRlZCwgCisJCQkJCXJlc3VtZSBhdCBzYW1lIGFkZHJlc3MuCisKKwlzdGVwIHdpdGgJU3NpZztBQS4uQUEJTGlrZSAnQycgYnV0IHN0ZXAgbm90IGNvbnRpbnVlLgorCXNpZ25hbAorCisJbGFzdCBzaWduYWwgICAgID8gICAgICAgICAgICAgICBSZXBseSB0aGUgY3VycmVudCByZWFzb24gZm9yIHN0b3BwaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHNhbWUgcmVwbHkgYXMgaXMgZ2VuZXJhdGVkCisJCQkJCWZvciBzdGVwIG9yIGNvbnQgOiBTQUEgd2hlcmUgQUEgaXMgdGhlCisJCQkJCXNpZ25hbCBudW1iZXIuCisKKwlkZXRhY2ggICAgICAgICAgRCAgICAgICAgICAgICAgIFJlcGx5IE9LLgorCisJVGhlcmUgaXMgbm8gaW1tZWRpYXRlIHJlcGx5IHRvIHN0ZXAgb3IgY29udC4KKwlUaGUgcmVwbHkgY29tZXMgd2hlbiB0aGUgbWFjaGluZSBzdG9wcy4KKwlJdCBpcwkJU0FBCQlBQSBpcyB0aGUgc2lnbmFsIG51bWJlci4KKworCW9yLi4uCQlUQUFuLi4uOnIuLi47bi4uLjpyLi4uO24uLi46ci4uLjsKKwkJCQkJQUEgPSBzaWduYWwgbnVtYmVyCisJCQkJCW4uLi4gPSByZWdpc3RlciBudW1iZXIgKGhleCkKKwkJCQkJICByLi4uID0gcmVnaXN0ZXIgY29udGVudHMKKwkJCQkJbi4uLiA9IGB0aHJlYWQnCisJCQkJCSAgci4uLiA9IHRocmVhZCBwcm9jZXNzIElELiAgVGhpcyBpcworCQkJCQkJIGEgaGV4IGludGVnZXIuCisJCQkJCW4uLi4gPSBvdGhlciBzdHJpbmcgbm90IHN0YXJ0aW5nIAorCQkJCQkgICAgd2l0aCB2YWxpZCBoZXggZGlnaXQuCisJCQkJCSAgZ2RiIHNob3VsZCBpZ25vcmUgdGhpcyBuLHIgcGFpcgorCQkJCQkgIGFuZCBnbyBvbiB0byB0aGUgbmV4dC4gIFRoaXMgd2F5CisJCQkJCSAgd2UgY2FuIGV4dGVuZCB0aGUgcHJvdG9jb2wuCisJb3IuLi4JCVdBQQkJVGhlIHByb2Nlc3MgZXhpdGVkLCBhbmQgQUEgaXMKKwkJCQkJdGhlIGV4aXQgc3RhdHVzLiAgVGhpcyBpcyBvbmx5CisJCQkJCWFwcGxpY2FibGUgZm9yIGNlcnRhaW5zIHNvcnRzIG9mCisJCQkJCXRhcmdldHMuCisJb3IuLi4JCVhBQQkJVGhlIHByb2Nlc3MgdGVybWluYXRlZCB3aXRoIHNpZ25hbAorCQkJCQlBQS4KKyAgICAgICAgb3IuLi4gICAgICAgICAgIE9YWC4uWFgJWFguLlhYICBpcyBoZXggZW5jb2Rpbmcgb2YgQVNDSUkgZGF0YS4gVGhpcworCQkJCQljYW4gaGFwcGVuIGF0IGFueSB0aW1lIHdoaWxlIHRoZSAKKwkJCQkJcHJvZ3JhbSBpcyBydW5uaW5nIGFuZCB0aGUgZGVidWdnZXIgCisJCQkJCXNob3VsZCBjb250aW51ZSB0byB3YWl0IGZvciAKKwkJCQkJJ1cnLCAnVCcsIGV0Yy4KKworCXRocmVhZCBhbGl2ZQlUWFgJCUZpbmQgb3V0IGlmIHRoZSB0aHJlYWQgWFggaXMgYWxpdmUuCisJcmVwbHkJCU9LCQl0aHJlYWQgaXMgc3RpbGwgYWxpdmUKKwkJCUVOTgkJdGhyZWFkIGlzIGRlYWQKKwkKKwlyZW1vdGUgcmVzdGFydAlSWFgJCVJlc3RhcnQgdGhlIHJlbW90ZSBzZXJ2ZXIKKworCWV4dGVuZGVkIG9wcyAJIQkJVXNlIHRoZSBleHRlbmRlZCByZW1vdGUgcHJvdG9jb2wuCisJCQkJCVN0aWNreSAtLSBvbmx5IG5lZWRzIHRvIGJlIHNldCBvbmNlLgorCisJa2lsbCByZXF1ZXN0CWsKKworCXRvZ2dsZSBkZWJ1ZwlkCQl0b2dnbGUgZGVidWcgZmxhZyAoc2VlIDM4NiAmIDY4ayBzdHVicykKKwlyZXNldAkJcgkJcmVzZXQgLS0gc2VlIHNwYXJjIHN0dWIuCisJcmVzZXJ2ZWQJPG90aGVyPgkJT24gb3RoZXIgcmVxdWVzdHMsIHRoZSBzdHViIHNob3VsZAorCQkJCQlpZ25vcmUgdGhlIHJlcXVlc3QgYW5kIHNlbmQgYW4gZW1wdHkKKwkJCQkJcmVzcG9uc2UgKCQjPGNoZWNrc3VtPikuICBUaGlzIHdheQorCQkJCQl3ZSBjYW4gZXh0ZW5kIHRoZSBwcm90b2NvbCBhbmQgR0RCCisJCQkJCWNhbiB0ZWxsIHdoZXRoZXIgdGhlIHN0dWIgaXQgaXMKKwkJCQkJdGFsa2luZyB0byB1c2VzIHRoZSBvbGQgb3IgdGhlIG5ldy4KKwlzZWFyY2gJCXRBQTpQUCxNTQlTZWFyY2ggYmFja3dhcmRzIHN0YXJ0aW5nIGF0IGFkZHJlc3MKKwkJCQkJQUEgZm9yIGEgbWF0Y2ggd2l0aCBwYXR0ZXJuIFBQIGFuZAorCQkJCQltYXNrIE1NLiAgUFAgYW5kIE1NIGFyZSA0IGJ5dGVzLgorCQkJCQlOb3Qgc3VwcG9ydGVkIGJ5IGFsbCBzdHVicy4KKworCWdlbmVyYWwgcXVlcnkJcVhYWFgJCVJlcXVlc3QgaW5mbyBhYm91dCBYWFhYLgorCWdlbmVyYWwgc2V0CVFYWFhYPXl5eXkJU2V0IHZhbHVlIG9mIFhYWFggdG8geXl5eS4KKwlxdWVyeSBzZWN0IG9mZnMJcU9mZnNldHMJR2V0IHNlY3Rpb24gb2Zmc2V0cy4gIFJlcGx5IGlzCisJCQkJCVRleHQ9eHh4O0RhdGE9eXl5O0Jzcz16enoKKworCVJlc3BvbnNlcyBjYW4gYmUgcnVuLWxlbmd0aCBlbmNvZGVkIHRvIHNhdmUgc3BhY2UuICBBICcqJyBtZWFucyB0aGF0CisJdGhlIG5leHQgY2hhcmFjdGVyIGlzIGFuIEFTQ0lJIGVuY29kaW5nIGdpdmluZyBhIHJlcGVhdCBjb3VudCB3aGljaAorCXN0YW5kcyBmb3IgdGhhdCBtYW55IHJlcGl0aXRpb25zIG9mIHRoZSBjaGFyYWN0ZXIgcHJlY2VkaW5nIHRoZSAnKicuCisJVGhlIGVuY29kaW5nIGlzIG4rMjksIHlpZWxkaW5nIGEgcHJpbnRhYmxlIGNoYXJhY3RlciB3aGVyZSBuID49MyAKKwkod2hpY2ggaXMgd2hlcmUgcmxlIHN0YXJ0cyB0byB3aW4pLiAgRG9uJ3QgdXNlIGFuIG4gPiAxMjYuCisKKwlTbyAKKwkiMCogIiBtZWFucyB0aGUgc2FtZSBhcyAiMDAwMCIuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJ3YWl0LmgiCisvKiNpbmNsdWRlICJ0ZXJtaW5hbC5oIiovCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJnZGItc3RhYnMuaCIKKyNpbmNsdWRlICJnZGJ0aHJlYWQuaCIKKworI2luY2x1ZGUgImRjYWNoZS5oIgorCisjaWZkZWYgVVNHCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgInNlcmlhbC5oIgorCisvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCByZW1vdGVfd3JpdGVfYnl0ZXMgUEFSQU1TICgoQ09SRV9BRERSIG1lbWFkZHIsCisJCQkJICAgICAgIGNoYXIgKm15YWRkciwgaW50IGxlbikpOworCitzdGF0aWMgaW50IHJlbW90ZV9yZWFkX2J5dGVzIFBBUkFNUyAoKENPUkVfQUREUiBtZW1hZGRyLAorCQkJCSAgICAgIGNoYXIgKm15YWRkciwgaW50IGxlbikpOworCitzdGF0aWMgdm9pZCByZW1vdGVfZmlsZXNfaW5mbyBQQVJBTVMgKChzdHJ1Y3QgdGFyZ2V0X29wcyAqaWdub3JlKSk7CisKK3N0YXRpYyBpbnQgcmVtb3RlX3hmZXJfbWVtb3J5IFBBUkFNUyAoKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICogbXlhZGRyLAorCQkJCSAgICAgICBpbnQgbGVuLCBpbnQgc2hvdWxkX3dyaXRlLAorCQkJCSAgICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqIHRhcmdldCkpOworCitzdGF0aWMgdm9pZCByZW1vdGVfcHJlcGFyZV90b19zdG9yZSBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIHJlbW90ZV9mZXRjaF9yZWdpc3RlcnMgUEFSQU1TICgoaW50IHJlZ25vKSk7CisKK3N0YXRpYyB2b2lkIHJlbW90ZV9yZXN1bWUgUEFSQU1TICgoaW50IHBpZCwgaW50IHN0ZXAsCisJCQkJICAgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ2duYWwpKTsKKworc3RhdGljIGludCByZW1vdGVfc3RhcnRfcmVtb3RlIFBBUkFNUyAoKFBUUikpOworCitzdGF0aWMgdm9pZCByZW1vdGVfb3BlbiBQQVJBTVMgKChjaGFyICpuYW1lLCBpbnQgZnJvbV90dHkpKTsKKworc3RhdGljIHZvaWQgZXh0ZW5kZWRfcmVtb3RlX29wZW4gUEFSQU1TICgoY2hhciAqbmFtZSwgaW50IGZyb21fdHR5KSk7CisKK3N0YXRpYyB2b2lkIHJlbW90ZV9vcGVuXzEgUEFSQU1TICgoY2hhciAqLCBpbnQsIHN0cnVjdCB0YXJnZXRfb3BzICosCisJCQkJICAgaW50IGV4dGVuZGVkX3ApKTsKKworc3RhdGljIHZvaWQgcmVtb3RlX2Nsb3NlIFBBUkFNUyAoKGludCBxdWl0dGluZykpOworCitzdGF0aWMgdm9pZCByZW1vdGVfc3RvcmVfcmVnaXN0ZXJzIFBBUkFNUyAoKGludCByZWdubykpOworCitzdGF0aWMgdm9pZCByZW1vdGVfbW91cm4gUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZCBleHRlbmRlZF9yZW1vdGVfcmVzdGFydCBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIGV4dGVuZGVkX3JlbW90ZV9tb3VybiBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIGV4dGVuZGVkX3JlbW90ZV9jcmVhdGVfaW5mZXJpb3IgUEFSQU1TICgoY2hhciAqLCBjaGFyICosIGNoYXIgKiopKTsKKworc3RhdGljIHZvaWQgcmVtb3RlX21vdXJuXzEgUEFSQU1TICgoc3RydWN0IHRhcmdldF9vcHMgKikpOworCitzdGF0aWMgdm9pZCByZW1vdGVfc2VuZCBQQVJBTVMgKChjaGFyICpidWYpKTsKKworc3RhdGljIGludCByZWFkY2hhciBQQVJBTVMgKChpbnQgdGltZW91dCkpOworCitzdGF0aWMgaW50IHJlbW90ZV93YWl0IFBBUkFNUyAoKGludCBwaWQsIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqIHN0YXR1cykpOworCitzdGF0aWMgdm9pZCByZW1vdGVfa2lsbCBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyBpbnQgdG9oZXggUEFSQU1TICgoaW50IG5pYikpOworCitzdGF0aWMgdm9pZCByZW1vdGVfZGV0YWNoIFBBUkFNUyAoKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkpOworCitzdGF0aWMgdm9pZCByZW1vdGVfaW50ZXJydXB0IFBBUkFNUyAoKGludCBzaWdubykpOworCitzdGF0aWMgdm9pZCBpbnRlcnJ1cHRfcXVlcnkgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZCBzZXRfdGhyZWFkIFBBUkFNUyAoKGludCwgaW50KSk7CisKK3N0YXRpYyBpbnQgcmVtb3RlX3RocmVhZF9hbGl2ZSBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIHZvaWQgZ2V0X29mZnNldHMgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgaW50IHJlYWRfZnJhbWUgUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyBpbnQgcmVtb3RlX2luc2VydF9icmVha3BvaW50IFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqKSk7CisKK3N0YXRpYyBpbnQgcmVtb3RlX3JlbW92ZV9icmVha3BvaW50IFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqKSk7CisKK3N0YXRpYyBpbnQgaGV4bnVtbGVuIFBBUkFNUyAoKFVMT05HRVNUIG51bSkpOworCitzdGF0aWMgdm9pZCBpbml0X3JlbW90ZV9vcHMgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZCBpbml0X2V4dGVuZGVkX3JlbW90ZV9vcHMgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZCByZW1vdGVfc3RvcCBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyBpbnQgaXNoZXggUEFSQU1TICgoaW50IGNoLCBpbnQgKnZhbCkpOworCitzdGF0aWMgaW50IHN0dWJoZXggUEFSQU1TICgoaW50IGNoKSk7CisKK3N0YXRpYyBpbnQgcmVtb3RlX3F1ZXJ5IFBBUkFNUyAoKGludC8qY2hhciovLCBjaGFyICosIGNoYXIgKiwgaW50ICopKTsKKworc3RhdGljIGludCBoZXhudW1zdHIgUEFSQU1TICgoY2hhciAqLCBVTE9OR0VTVCkpOworCitzdGF0aWMgQ09SRV9BRERSIHJlbW90ZV9hZGRyZXNzX21hc2tlZCBQQVJBTVMgKChDT1JFX0FERFIpKTsKKworc3RhdGljIHZvaWQgcHJpbnRfcGFja2V0IFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjcmMzMiBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCwgdW5zaWduZWQgaW50KSk7CisKK3N0YXRpYyB2b2lkIGNvbXBhcmVfc2VjdGlvbnNfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBwYWNrZXRfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgaW50IHN0dWJfdW5wYWNrX2ludCBQQVJBTVMgKChjaGFyICpidWZmLCBpbnQgZmllbGRsZW5ndGgpKTsKKworY2hhciAqdW5wYWNrX3Zhcmxlbl9oZXggUEFSQU1TICgoY2hhciAqYnVmZiwgaW50ICpyZXN1bHQpKTsKKworc3RhdGljIGNoYXIgKnVucGFja19uaWJibGUgUEFSQU1TICgoY2hhciAqYnVmLCBpbnQgKnZhbCkpOworCitzdGF0aWMgY2hhciAqcGFja19uaWJibGUgUEFSQU1TICgoY2hhciAqYnVmLCBpbnQgbmliYmxlKSk7CisKK3N0YXRpYyBjaGFyICpwYWNrX2hleF9ieXRlIFBBUkFNUyAoKGNoYXIgKnBrdCwgaW50Lyp1bnNpZ25lZCBjaGFyKi8gYnl0ZSkpOworCitzdGF0aWMgY2hhciAqdW5wYWNrX2J5dGUgUEFSQU1TICgoY2hhciAqYnVmLCBpbnQgKnZhbHVlKSk7CisKK3N0YXRpYyBjaGFyICpwYWNrX2ludCBQQVJBTVMgKChjaGFyICpidWYsIGludCB2YWx1ZSkpOworCitzdGF0aWMgY2hhciAqdW5wYWNrX2ludCBQQVJBTVMgKChjaGFyICpidWYsIGludCAqdmFsdWUpKTsKKworc3RhdGljIGNoYXIgKnVucGFja19zdHJpbmcgUEFSQU1TICgoY2hhciAqc3JjLCBjaGFyICpkZXN0LCBpbnQgbGVuZ3RoKSk7CisKK3N0YXRpYyBjaGFyICpwYWNrX3RocmVhZGlkIFBBUkFNUyAoKGNoYXIgKnBrdCwgdGhyZWFkcmVmICppZCkpOworCitzdGF0aWMgY2hhciAqdW5wYWNrX3RocmVhZGlkIFBBUkFNUyAoKGNoYXIgKmluYnVmLCB0aHJlYWRyZWYgKmlkKSk7CisKK3ZvaWQgaW50X3RvX3RocmVhZHJlZiBQQVJBTVMgKCh0aHJlYWRyZWYgKmlkLCBpbnQgdmFsdWUpKTsKKworc3RhdGljIGludCB0aHJlYWRyZWZfdG9faW50IFBBUkFNUyAoKHRocmVhZHJlZiAqcmVmKSk7CisKK3N0YXRpYyB2b2lkIGNvcHlfdGhyZWFkcmVmIFBBUkFNUyAoKHRocmVhZHJlZiAqZGVzdCwgdGhyZWFkcmVmICpzcmMpKTsKKworc3RhdGljIGludCB0aHJlYWRtYXRjaCBQQVJBTVMgKCh0aHJlYWRyZWYgKmRlc3QsIHRocmVhZHJlZiAqc3JjKSk7CisKK3N0YXRpYyBjaGFyICpwYWNrX3RocmVhZGluZm9fcmVxdWVzdCBQQVJBTVMgKChjaGFyICpwa3QsIGludCBtb2RlLAorCQkJCQkgICAgICB0aHJlYWRyZWYgKmlkKSk7CisKK3N0YXRpYyBpbnQgcmVtb3RlX3VucGFja190aHJlYWRfaW5mb19yZXNwb25zZSBQQVJBTVMgKChjaGFyICpwa3QsCisJCQkJCQkgICAgICAgdGhyZWFkcmVmICpleHBlY3RlZHJlZiwKKwkJCQkJCSAgICAgICBzdHJ1Y3QgZ2RiX2V4dF90aHJlYWRfaW5mbyAqaW5mbykpOworCisKK3N0YXRpYyBpbnQgcmVtb3RlX2dldF90aHJlYWRpbmZvIFBBUkFNUyAoKHRocmVhZHJlZiAqdGhyZWFkaWQsCisJCQkJCSAgaW50IGZpZWxkc2V0LAkvKlRBRyBtYXNrICovCisJCQkJCSAgc3RydWN0IGdkYl9leHRfdGhyZWFkX2luZm8gKmluZm8pKTsKKworc3RhdGljIGludCBhZGFwdF9yZW1vdGVfZ2V0X3RocmVhZGluZm8gUEFSQU1TICgoZ2RiX3RocmVhZHJlZiAqcmVmLAorCQkJCQkJaW50IHNlbGVjdGlvbiwKKwkJCQkJCXN0cnVjdCBnZGJfZXh0X3RocmVhZF9pbmZvICppbmZvKSk7CisKK3N0YXRpYyBjaGFyICpwYWNrX3RocmVhZGxpc3RfcmVxdWVzdCBQQVJBTVMgKChjaGFyICpwa3QsIGludCBzdGFydGZsYWcsCisJCQkJCSAgICAgIGludCB0aHJlYWRjb3VudCwKKwkJCQkJICAgICAgdGhyZWFkcmVmICpuZXh0dGhyZWFkKSk7CisKK3N0YXRpYyBpbnQgcGFyc2VfdGhyZWFkbGlzdF9yZXNwb25zZSBQQVJBTVMgKChjaGFyICpwa3QsCisJCQkJCSAgICAgIGludCByZXN1bHRfbGltaXQsCisJCQkJCSAgICAgIHRocmVhZHJlZiAqb3JpZ2luYWxfZWNobywKKwkJCQkJICAgICAgdGhyZWFkcmVmICpyZXN1bHRsaXN0LAorCQkJCQkgICAgICBpbnQgKmRvbmVmbGFnKSk7CisKK3N0YXRpYyBpbnQgcmVtb3RlX2dldF90aHJlYWRsaXN0IFBBUkFNUyAoKGludCBzdGFydGZsYWcsCisJCQkJCSAgdGhyZWFkcmVmICpuZXh0dGhyZWFkLAorCQkJCQkgIGludCByZXN1bHRfbGltaXQsCisJCQkJCSAgaW50ICpkb25lLAorCQkJCQkgIGludCAqcmVzdWx0X2NvdW50LAorCQkJCQkgIHRocmVhZHJlZiAqdGhyZWFkbGlzdCkpOworCit0eXBlZGVmIGludCAoKnJtdF90aHJlYWRfYWN0aW9uKSAodGhyZWFkcmVmICpyZWYsIHZvaWQgKmNvbnRleHQpOworCitzdGF0aWMgaW50IHJlbW90ZV90aHJlYWRsaXN0X2l0ZXJhdG9yIFBBUkFNUyAoKHJtdF90aHJlYWRfYWN0aW9uIHN0ZXBmdW5jdGlvbiwKKwkJCQkJICAgICAgIHZvaWQgKmNvbnRleHQsIGludCBsb29wbGltaXQpKTsKKworc3RhdGljIGludCByZW1vdGVfbmV3dGhyZWFkX3N0ZXAgUEFSQU1TICgodGhyZWFkcmVmICpyZWYsIHZvaWQgKmNvbnRleHQpKTsKKworc3RhdGljIGludCByZW1vdGVfY3VycmVudF90aHJlYWQgUEFSQU1TICgoaW50IG9sZHBpZCkpOworCitpbnQgcmVtb3RlX2ZpbmRfbmV3X3RocmVhZHMgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZCByZWNvcmRfY3VycnRocmVhZCBQQVJBTVMgKChpbnQgY3VycnRocmVhZCkpOworCitzdGF0aWMgdm9pZCBpbml0X3JlbW90ZV90aHJlYWRzIFBBUkFNUyAoKHZvaWQpKTsKKworLyogZXhwb3J0ZWQgZnVuY3Rpb25zICovCisKK2V4dGVybiBpbnQgZnJvbWhleCBQQVJBTVMgKChpbnQgYSkpOworCitleHRlcm4gdm9pZCBnZXRwa3QgUEFSQU1TICgoY2hhciAqYnVmLCBpbnQgZm9yZXZlcikpOworCitleHRlcm4gaW50IHB1dHBrdCBQQVJBTVMgKChjaGFyICpidWYpKTsKKworc3RhdGljIGludCBwdXRwa3RfYmluYXJ5IFBBUkFNUyAoKGNoYXIgKmJ1ZiwgaW50IGNudCkpOworCit2b2lkIHJlbW90ZV9jb25zb2xlX291dHB1dCBQQVJBTVMgKChjaGFyICopKTsKKworc3RhdGljIHZvaWQgY2hlY2tfYmluYXJ5X2Rvd25sb2FkIFBBUkFNUyAoKENPUkVfQUREUiBhZGRyKSk7CisKKy8qIERlZmluZSB0aGUgdGFyZ2V0IHN1YnJvdXRpbmUgbmFtZXMgKi8KKwordm9pZCBvcGVuX3JlbW90ZV90YXJnZXQgUEFSQU1TICgoY2hhciAqLCBpbnQsIHN0cnVjdCB0YXJnZXRfb3BzICosIGludCkpOworCit2b2lkIF9pbml0aWFsaXplX3JlbW90ZSBQQVJBTVMgKCh2b2lkKSk7CisKKy8qICovCisKK3N0YXRpYyBzdHJ1Y3QgdGFyZ2V0X29wcyByZW1vdGVfb3BzOworCitzdGF0aWMgc3RydWN0IHRhcmdldF9vcHMgZXh0ZW5kZWRfcmVtb3RlX29wczsKKworc3RhdGljIHN0cnVjdCB0YXJnZXRfdGhyZWFkX3ZlY3RvciByZW1vdGVfdGhyZWFkX3ZlYzsKKworLyogVGhpcyB3YXMgNSBzZWNvbmRzLCB3aGljaCBpcyBhIGxvbmcgdGltZSB0byBzaXQgYW5kIHdhaXQuCisgICBVbmxlc3MgdGhpcyBpcyBnb2luZyB0aG91Z2ggc29tZSB0ZXJtaW5hbCBzZXJ2ZXIgb3IgbXVsdGlwbGV4ZXIgb3IKKyAgIG90aGVyIGZvcm0gb2YgaGFpcnkgc2VyaWFsIGNvbm5lY3Rpb24sIEkgd291bGQgdGhpbmsgMiBzZWNvbmRzIHdvdWxkCisgICBiZSBwbGVudHkuICAqLworCisvKiBDaGFuZ2VkIHRvIGFsbG93IG9wdGlvbiB0byBzZXQgdGltZW91dCB2YWx1ZS4KKyAgIHdhcyBzdGF0aWMgaW50IHJlbW90ZV90aW1lb3V0ID0gMjsgKi8KK2V4dGVybiBpbnQgcmVtb3RlX3RpbWVvdXQ7CisKKy8qIFRoaXMgdmFyaWFibGUgY2hvb3NlcyB3aGV0aGVyIHRvIHNlbmQgYSBeQyBvciBhIGJyZWFrIHdoZW4gdGhlIHVzZXIKKyAgIHJlcXVlc3RzIHByb2dyYW0gaW50ZXJydXB0aW9uLiAgQWx0aG91Z2ggXkMgaXMgdXN1YWxseSB3aGF0IHJlbW90ZQorICAgc3lzdGVtcyBleHBlY3QsIGFuZCB0aGF0IGlzIHRoZSBkZWZhdWx0IGhlcmUsIHNvbWV0aW1lcyBhIGJyZWFrIGlzCisgICBwcmVmZXJhYmxlIGluc3RlYWQuICAqLworCitzdGF0aWMgaW50IHJlbW90ZV9icmVhazsKKworLyogSGFzIHRoZSB1c2VyIGF0dGVtcHRlZCB0byBpbnRlcnJ1cHQgdGhlIHRhcmdldD8gSWYgc28sIHRoZW4gb2ZmZXIKKyAgIHRoZSB1c2VyIHRoZSBvcHBvcnR1bml0eSB0byBiYWlsIG91dCBjb21wbGV0ZWx5IGlmIGhlIGludGVycnVwdHMKKyAgIGFnYWluLiAqLworc3RhdGljIGludCBpbnRlcnJ1cHRlZF9hbHJlYWR5ID0gMDsKKworLyogRGVzY3JpcHRvciBmb3IgSS9PIHRvIHJlbW90ZSBtYWNoaW5lLiAgSW5pdGlhbGl6ZSBpdCB0byBOVUxMIHNvIHRoYXQKKyAgIHJlbW90ZV9vcGVuIGtub3dzIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIGZpbGUgb3BlbiB3aGVuIHRoZSBwcm9ncmFtCisgICBzdGFydHMuICAqLworc3RhdGljIHNlcmlhbF90IHJlbW90ZV9kZXNjID0gTlVMTDsKKworLyogVGhpcyB2YXJpYWJsZSAoYXZhaWxhYmxlIHRvIHRoZSB1c2VyIHZpYSAic2V0IHJlbW90ZWJpbmFyeWRvd25sb2FkIikKKyAgIGRpY3RhdGVzIHdoZXRoZXIgZG93bmxvYWRzIGFyZSBzZW50IGluIGJpbmFyeSAodmlhIHRoZSAnWCcgcGFja2V0KS4KKyAgIFdlIGFzc3VtZSB0aGF0IHRoZSBzdHViIGNhbiwgYW5kIGF0dGVtcHQgdG8gZG8gaXQuIFRoaXMgd2lsbCBiZSBjbGVhcmVkIGlmCisgICB0aGUgc3R1YiBkb2VzIG5vdCB1bmRlcnN0YW5kIGl0LiBUaGlzIHN3aXRjaCBpcyBzdGlsbCBuZWVkZWQsIHRob3VnaAorICAgaW4gY2FzZXMgd2hlbiB0aGUgcGFja2V0IGlzIHN1cHBvcnRlZCBpbiB0aGUgc3R1YiwgYnV0IHRoZSBjb25uZWN0aW9uCisgICBkb2VzIG5vdCBhbGxvdyBpdCAoaS5lLiwgNy1iaXQgc2VyaWFsIGNvbm5lY3Rpb24gb25seSkuICovCitzdGF0aWMgaW50IHJlbW90ZV9iaW5hcnlfZG93bmxvYWQgPSAxOworIAorLyogSGF2ZSB3ZSBhbHJlYWR5IGNoZWNrZWQgd2hldGhlciBiaW5hcnkgZG93bmxvYWRzIHdvcms/ICovCitzdGF0aWMgaW50IHJlbW90ZV9iaW5hcnlfY2hlY2tlZDsKKworLyogSGF2aW5nIHRoaXMgbGFyZ2VyIHRoYW4gNDAwIGNhdXNlcyB1cyB0byBiZSBpbmNvbXBhdGlibGUgd2l0aCBtNjhrLXN0dWIuYworICAgYW5kIGkzODYtc3R1Yi5jLiAgTm9ybWFsbHksIG5vIG9uZSB3b3VsZCBub3RpY2UgYmVjYXVzZSBpdCBvbmx5IG1hdHRlcnMKKyAgIGZvciB3cml0aW5nIGxhcmdlIGNodW5rcyBvZiBtZW1vcnkgKGUuZy4gaW4gZG93bmxvYWRzKS4gIEFsc28sIHRoaXMgbmVlZHMKKyAgIHRvIGJlIG1vcmUgdGhhbiA0MDAgaWYgcmVxdWlyZWQgdG8gaG9sZCB0aGUgcmVnaXN0ZXJzIChzZWUgYmVsb3csIHdoZXJlCisgICB3ZSByb3VuZCBpdCB1cCBiYXNlZCBvbiBSRUdJU1RFUl9CWVRFUykuICAqLworI2RlZmluZQlQQlVGU0laCTQwMAorCisvKiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkL3dyaXRlIGF0IG9uY2UuICBUaGUgdmFsdWUgaGVyZQorICAgaXMgY2hvc2VuIHRvIGZpbGwgdXAgYSBwYWNrZXQgKHRoZSBoZWFkZXJzIGFjY291bnQgZm9yIHRoZSAzMikuICAqLworI2RlZmluZSBNQVhCVUZCWVRFUyAoKFBCVUZTSVotMzIpLzIpCisKKy8qIFJvdW5kIHVwIFBCVUZTSVogdG8gaG9sZCBhbGwgdGhlIHJlZ2lzdGVycywgYXQgbGVhc3QuICAqLworLyogVGhlIGJsYW5rIGxpbmUgYWZ0ZXIgdGhlICNpZiBzZWVtcyB0byBiZSByZXF1aXJlZCB0byB3b3JrIGFyb3VuZCBhCisgICBidWcgaW4gSFAncyBQQSBjb21waWxlci4gICovCisjaWYgUkVHSVNURVJfQllURVMgPiBNQVhCVUZCWVRFUworCisjdW5kZWYgUEJVRlNJWgorI2RlZmluZQlQQlVGU0laCShSRUdJU1RFUl9CWVRFUyAqIDIgKyAzMikKKyNlbmRpZgorCisKKy8qIFRoaXMgdmFyaWFibGUgc2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHRhcmdldAorICAgaW4gYSBzaW5nbGUgcGFja2V0LiAgTm9ybWFsbHkgUEJVRlNJWiBpcyBzYXRpc2ZhY3RvcnksIGJ1dCBzb21lCisgICB0YXJnZXRzIG5lZWQgc21hbGxlciB2YWx1ZXMgKHBlcmhhcHMgYmVjYXVzZSB0aGUgcmVjZWl2aW5nIGVuZAorICAgaXMgc2xvdykuICAqLworCitzdGF0aWMgaW50IHJlbW90ZV93cml0ZV9zaXplID0gUEJVRlNJWjsKKworLyogVGhpcyB2YXJpYWJsZSBzZXRzIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhbiBhZGRyZXNzIHRoYXQgYXJlIHRvIGJlCisgICBzZW50IGluIGEgbWVtb3J5ICgiTSIgb3IgIm0iKSBwYWNrZXQuICBOb3JtYWxseSwgYWZ0ZXIgc3RyaXBwaW5nCisgICBsZWFkaW5nIHplcm9zLCB0aGUgZW50aXJlIGFkZHJlc3Mgd291bGQgYmUgc2VudC4gVGhpcyB2YXJpYWJsZQorICAgcmVzdHJpY3RzIHRoZSBhZGRyZXNzIHRvIFJFTU9URV9BRERSRVNTX1NJWkUgYml0cy4gIEhJU1RPUlk6IFRoZQorICAgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvZiByZW1vdGUuYyByZXN0cmljdGVkIHRoZSBhZGRyZXNzIHNlbnQgaW4KKyAgIG1lbW9yeSBwYWNrZXRzIHRvIGBgaG9zdDo6c2l6ZW9mIGxvbmcnJyBieXRlcyAtICh0eXBpY2FsbHkgMzIKKyAgIGJpdHMpLiAgQ29uc2VxdWVudGx5LCBmb3IgNjQgYml0IHRhcmdldHMsIHRoZSB1cHBlciAzMiBiaXRzIG9mIGFuCisgICBhZGRyZXNzIHdhcyBuZXZlciBzZW50LiAgU2luY2UgZml4aW5nIHRoaXMgYnVnIG1heSBjYXVzZSBhIGJyZWFrIGluCisgICBzb21lIHJlbW90ZSB0YXJnZXRzIHRoaXMgdmFyaWFibGUgaXMgcHJpbmNpcGx5IHByb3ZpZGVkIHRvCisgICBmYWNpbGl0YXRlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICovCisKK3N0YXRpYyBpbnQgcmVtb3RlX2FkZHJlc3Nfc2l6ZTsKKworLyogVGhpcyBpcyB0aGUgc2l6ZSAoaW4gY2hhcnMpIG9mIHRoZSBmaXJzdCByZXNwb25zZSB0byB0aGUgYGcnIGNvbW1hbmQuICBUaGlzCisgICBpcyB1c2VkIHRvIGxpbWl0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkgcmVhZCBhbmQgd3JpdGUgY29tbWFuZHMgdG8gcHJldmVudAorICAgc3R1YiBidWZmZXJzIGZyb20gb3ZlcmZsb3dpbmcuICBUaGUgc2l6ZSBkb2VzIG5vdCBpbmNsdWRlIGhlYWRlcnMgYW5kCisgICB0cmFpbGVycywgaXQgaXMgb25seSB0aGUgcGF5bG9hZCBzaXplLiAqLworCitzdGF0aWMgaW50IHJlbW90ZV9yZWdpc3Rlcl9idWZfc2l6ZSA9IDA7CisKKy8qIFNob3VsZCB3ZSB0cnkgdGhlICdQJyByZXF1ZXN0PyAgSWYgdGhpcyBpcyBzZXQgdG8gb25lIHdoZW4gdGhlIHN0dWIKKyAgIGRvZXNuJ3Qgc3VwcG9ydCAnUCcsIHRoZSBvbmx5IGNvbnNlcXVlbmNlIGlzIHNvbWUgdW5uZWNlc3NhcnkgdHJhZmZpYy4gICovCitzdGF0aWMgaW50IHN0dWJfc3VwcG9ydHNfUCA9IDE7CisKKy8qIFRoZXNlIGFyZSBwb2ludGVycyB0byBob29rIGZ1bmN0aW9ucyB0aGF0IG1heSBiZSBzZXQgaW4gb3JkZXIgdG8KKyAgIG1vZGlmeSByZXN1bWUvd2FpdCBiZWhhdmlvciBmb3IgYSBwYXJ0aWN1bGFyIGFyY2hpdGVjdHVyZS4gICovCisKK3ZvaWQgKCp0YXJnZXRfcmVzdW1lX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKK3ZvaWQgKCp0YXJnZXRfd2FpdF9sb29wX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKKworDAorCisvKiBUaGVzZSBhcmUgdGhlIHRocmVhZHMgd2hpY2ggd2UgbGFzdCBzZW50IHRvIHRoZSByZW1vdGUgc3lzdGVtLgorICAgLTEgZm9yIGFsbCBvciAtMiBmb3Igbm90IHNlbnQgeWV0LiAgKi8KK3N0YXRpYyBpbnQgZ2VuZXJhbF90aHJlYWQ7CitzdGF0aWMgaW50IGNvbnRfdGhyZWFkOworCisvKiBDYWxsIHRoaXMgZnVuY3Rpb24gYXMgYSByZXN1bHQgb2YKKyAgIDEpIEEgaGFsdCBpbmRpY2F0aW9uIChUIHBhY2tldCkgY29udGFpbmluZyBhIHRocmVhZCBpZAorICAgMikgQSBkaXJlY3QgcXVlcnkgb2YgY3VycnRocmVhZAorICAgMykgU3VjY2Vzc2Z1bCBleGVjdXRpb24gb2Ygc2V0IHRocmVhZAorICovCisKK3N0YXRpYyB2b2lkCityZWNvcmRfY3VycnRocmVhZCAoY3VycnRocmVhZCkKKyAgICAgaW50IGN1cnJ0aHJlYWQ7Cit7CisjaWYgMAkvKiB0YXJnZXRfd2FpdCBtdXN0IG5vdCBtb2RpZnkgaW5mZXJpb3JfcGlkISAqLworICBpbmZlcmlvcl9waWQgPSBjdXJydGhyZWFkOworI2VuZGlmCisgIGdlbmVyYWxfdGhyZWFkID0gY3VycnRocmVhZDsKKyNpZiAwCS8qIHNldHRpbmcgY29udF90aHJlYWQgaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgCisJICAgZnJvbSBoYXZpbmcgdGhlIHRhcmdldCByZXBvcnQgaXRzIHRocmVhZCBpZC4gICovCisgIGNvbnRfdGhyZWFkID0gY3VycnRocmVhZDsKKyNlbmRpZgorICAvKiBJZiB0aGlzIGlzIGEgbmV3IHRocmVhZCwgYWRkIGl0IHRvIEdEQidzIHRocmVhZCBsaXN0LgorICAgICBJZiB3ZSBsZWF2ZSBpdCB1cCB0byBXRkkgdG8gZG8gdGhpcywgYmFkIHRoaW5ncyB3aWxsIGhhcHBlbi4gICovCisgIGlmICghaW5fdGhyZWFkX2xpc3QgKGN1cnJ0aHJlYWQpKQorICAgIGFkZF90aHJlYWQgKGN1cnJ0aHJlYWQpOworfQorCisjZGVmaW5lIE1BR0lDX05VTExfUElEIDQyMDAwCisKK3N0YXRpYyB2b2lkCitzZXRfdGhyZWFkICh0aCwgZ2VuKQorICAgICBpbnQgdGg7CisgICAgIGludCBnZW47Cit7CisgIGNoYXIgYnVmW1BCVUZTSVpdOworICBpbnQgc3RhdGUgPSBnZW4gPyBnZW5lcmFsX3RocmVhZCA6IGNvbnRfdGhyZWFkOworCisgIGlmIChzdGF0ZSA9PSB0aCkKKyAgICByZXR1cm47CisKKyAgYnVmWzBdID0gJ0gnOworICBidWZbMV0gPSBnZW4gPyAnZycgOiAnYyc7CisgIGlmICh0aCA9PSBNQUdJQ19OVUxMX1BJRCkKKyAgICB7CisgICAgICBidWZbMl0gPSAnMCc7CisgICAgICBidWZbM10gPSAnXDAnOworICAgIH0KKyAgZWxzZSBpZiAodGggPCAwKQorICAgIHNwcmludGYgKCZidWZbMl0sICItJXgiLCAtdGgpOworICBlbHNlCisgICAgc3ByaW50ZiAoJmJ1ZlsyXSwgIiV4IiwgdGgpOworICBwdXRwa3QgKGJ1Zik7CisgIGdldHBrdCAoYnVmLCAwKTsKKyAgaWYgKGdlbikKKyAgICBnZW5lcmFsX3RocmVhZCA9IHRoOworICBlbHNlCisgICAgY29udF90aHJlYWQgPSB0aDsKK30KKwwKKy8qICBSZXR1cm4gbm9uemVybyBpZiB0aGUgdGhyZWFkIFRIIGlzIHN0aWxsIGFsaXZlIG9uIHRoZSByZW1vdGUgc3lzdGVtLiAgKi8KKworc3RhdGljIGludAorcmVtb3RlX3RocmVhZF9hbGl2ZSAodGgpCisgICAgIGludCB0aDsKK3sKKyAgY2hhciBidWZbUEJVRlNJWl07CisKKyAgYnVmWzBdID0gJ1QnOworICBpZiAodGggPCAwKQorICAgIHNwcmludGYgKCZidWZbMV0sICItJTA4eCIsIC10aCk7CisgIGVsc2UKKyAgICBzcHJpbnRmICgmYnVmWzFdLCAiJTA4eCIsIHRoKTsKKyAgcHV0cGt0IChidWYpOworICBnZXRwa3QgKGJ1ZiwgMCk7CisgIHJldHVybiAoYnVmWzBdID09ICdPJyAmJiBidWZbMV0gPT0gJ0snKTsKK30KKworLyogQWJvdXQgdGhlc2UgZXh0ZW5kZWQgdGhyZWFkbGlzdCBhbmQgdGhyZWFkaW5mbyBwYWNrZXRzLiAgVGhleSBhcmUKKyAgIHZhcmlhYmxlIGxlbmd0aCBwYWNrZXRzIGJ1dCwgdGhlIGZpZWxkcyB3aXRoaW4gdGhlbSBhcmUgb2Z0ZW4gZml4ZWQKKyAgIGxlbmd0aC4gIFRoZXkgYXJlIHJlZHVuZGVudCBlbm91Z2ggdG8gc2VuZCBvdmVyIFVEUCBhcyBpcyB0aGUKKyAgIHJlbW90ZSBwcm90b2NvbCBpbiBnZW5lcmFsLiAgVGhlcmUgaXMgYSBtYXRjaGluZyB1bml0IHRlc3QgbW9kdWxlCisgICBpbiBsaWJzdHViLiAgKi8KKworI2RlZmluZSBCVUZfVEhSRUFEX0lEX1NJWkUgKE9QQVFVRVRIUkVBREJZVEVTKjIpCisKKy8qIGVuY29kZSA2NCBiaXRzIGluIDE2IGNoYXJzIG9mIGhleCAqLworCitzdGF0aWMgY29uc3QgY2hhciBoZXhjaGFyc1tdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCitzdGF0aWMgaW50Citpc2hleCAoY2gsIHZhbCkKKyAgICAgaW50IGNoOworICAgICBpbnQgKnZhbDsKK3sKKyAgaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKQorICAgIHsKKyAgICAgICp2YWwgPSBjaCAtICdhJyArIDEwOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBpZiAoKGNoID49ICdBJykgJiYgKGNoIDw9ICdGJykpCisgICAgeworICAgICAgKnZhbCA9IGNoIC0gJ0EnICsgMTA7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIGlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkKKyAgICB7CisgICAgICAqdmFsID0gY2ggLSAnMCc7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzdHViaGV4IChjaCkKKyAgICAgaW50IGNoOworeworICBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykKKyAgICByZXR1cm4gY2ggLSAnYScgKyAxMDsKKyAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCisgICAgcmV0dXJuIGNoIC0gJzAnOworICBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykKKyAgICByZXR1cm4gY2ggLSAnQScgKyAxMDsKKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50CitzdHViX3VucGFja19pbnQgKGJ1ZmYsIGZpZWxkbGVuZ3RoKQorICAgICBjaGFyICpidWZmOworICAgICBpbnQgZmllbGRsZW5ndGg7Cit7CisgIGludCBuaWJibGU7CisgIGludCByZXR2YWwgPSAwOworCisgIHdoaWxlIChmaWVsZGxlbmd0aCkKKyAgICB7CisgICAgICBuaWJibGUgPSBzdHViaGV4ICgqYnVmZisrKTsKKyAgICAgIHJldHZhbCB8PSBuaWJibGU7CisgICAgICBmaWVsZGxlbmd0aC0tOworICAgICAgaWYgKGZpZWxkbGVuZ3RoKQorCXJldHZhbCA9IHJldHZhbCA8PCA0OworICAgIH0KKyAgcmV0dXJuIHJldHZhbDsKK30KKworY2hhciAqCit1bnBhY2tfdmFybGVuX2hleCAoYnVmZiwgcmVzdWx0KQorICAgICBjaGFyICpidWZmOwkJLyogcGFja2V0IHRvIHBhcnNlICovCisgICAgIGludCAqcmVzdWx0OworeworICBpbnQgbmliYmxlOworICBpbnQgcmV0dmFsID0gMDsKKworICB3aGlsZSAoaXNoZXggKCpidWZmLCAmbmliYmxlKSkKKyAgICB7CisgICAgICBidWZmKys7CisgICAgICByZXR2YWwgPSByZXR2YWwgPDwgNDsKKyAgICAgIHJldHZhbCB8PSBuaWJibGUgJiAweDBmOworICAgIH0KKyAgKnJlc3VsdCA9IHJldHZhbDsKKyAgcmV0dXJuIGJ1ZmY7Cit9CisKK3N0YXRpYyBjaGFyICoKK3VucGFja19uaWJibGUgKGJ1ZiwgdmFsKQorICAgICBjaGFyICpidWY7CisgICAgIGludCAqdmFsOworeworICBpc2hleCAoKmJ1ZisrLCB2YWwpOworICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhciAqCitwYWNrX25pYmJsZSAoYnVmLCBuaWJibGUpCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgaW50IG5pYmJsZTsKK3sKKyAgKmJ1ZisrID0gaGV4Y2hhcnNbKG5pYmJsZSAmIDB4MGYpXTsKKyAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGNoYXIgKgorcGFja19oZXhfYnl0ZSAocGt0LCBieXRlKQorICAgICBjaGFyICpwa3Q7CisgICAgIGludCBieXRlOworeworICAqcGt0KysgPSBoZXhjaGFyc1soYnl0ZSA+PiA0KSAmIDB4Zl07CisgICpwa3QrKyA9IGhleGNoYXJzWyhieXRlICYgMHhmKV07CisgIHJldHVybiBwa3Q7Cit9CisKK3N0YXRpYyBjaGFyICoKK3VucGFja19ieXRlIChidWYsIHZhbHVlKQorICAgICBjaGFyICpidWY7CisgICAgIGludCAqdmFsdWU7Cit7CisgICp2YWx1ZSA9IHN0dWJfdW5wYWNrX2ludCAoYnVmLCAyKTsKKyAgcmV0dXJuIGJ1ZiArIDI7Cit9CisKK3N0YXRpYyBjaGFyICoKK3BhY2tfaW50IChidWYsIHZhbHVlKQorICAgICBjaGFyICpidWY7CisgICAgIGludCB2YWx1ZTsKK3sKKyAgYnVmID0gcGFja19oZXhfYnl0ZSAoYnVmLCAodmFsdWUgPj4gMjQpICYgMHhmZik7CisgIGJ1ZiA9IHBhY2tfaGV4X2J5dGUgKGJ1ZiwgKHZhbHVlID4+IDE2KSAmIDB4ZmYpOworICBidWYgPSBwYWNrX2hleF9ieXRlIChidWYsICh2YWx1ZSA+PiA4KSAmIDB4MGZmKTsKKyAgYnVmID0gcGFja19oZXhfYnl0ZSAoYnVmLCAodmFsdWUgJiAweGZmKSk7CisgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICoKK3VucGFja19pbnQgKGJ1ZiwgdmFsdWUpCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgaW50ICp2YWx1ZTsKK3sKKyAgKnZhbHVlID0gc3R1Yl91bnBhY2tfaW50IChidWYsIDgpOworICByZXR1cm4gYnVmICsgODsKK30KKworI2lmIDAgLyogY3VycmVudGx5IHVudXNlZCwgdW5jb21tZW50IHdoZW4gbmVlZGVkICovCitzdGF0aWMgY2hhciAqcGFja19zdHJpbmcgUEFSQU1TICgoY2hhciAqcGt0LCBjaGFyICpzdHJpbmcpKTsKKworc3RhdGljIGNoYXIgKgorcGFja19zdHJpbmcgKHBrdCwgc3RyaW5nKQorICAgICBjaGFyICpwa3Q7CisgICAgIGNoYXIgKnN0cmluZzsKK3sKKyAgY2hhciBjaDsKKyAgaW50IGxlbjsKKworICBsZW4gPSBzdHJsZW4gKHN0cmluZyk7CisgIGlmIChsZW4gPiAyMDApCisgICAgbGVuID0gMjAwOwkJCS8qIEJpZ2dlciB0aGFuIG1vc3QgR0RCIHBhY2tldHMsIGp1bms/Pz8gKi8KKyAgcGt0ID0gcGFja19oZXhfYnl0ZSAocGt0LCBsZW4pOworICB3aGlsZSAobGVuLS0gPiAwKQorICAgIHsKKyAgICAgIGNoID0gKnN0cmluZysrOworICAgICAgaWYgKChjaCA9PSAnXDAnKSB8fCAoY2ggPT0gJyMnKSkKKwljaCA9ICcqJzsJCS8qIFByb3RlY3QgZW5jYXBzdWxhdGlvbiAqLworICAgICAgKnBrdCsrID0gY2g7CisgICAgfQorICByZXR1cm4gcGt0OworfQorI2VuZGlmIC8qIDAgKHVudXNlZCkgKi8KKworc3RhdGljIGNoYXIgKgordW5wYWNrX3N0cmluZyAoc3JjLCBkZXN0LCBsZW5ndGgpCisgICAgIGNoYXIgKnNyYzsKKyAgICAgY2hhciAqZGVzdDsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgd2hpbGUgKGxlbmd0aC0tKQorICAgICpkZXN0KysgPSAqc3JjKys7CisgICpkZXN0ID0gJ1wwJzsKKyAgcmV0dXJuIHNyYzsKK30KKworc3RhdGljIGNoYXIgKgorcGFja190aHJlYWRpZCAocGt0LCBpZCkKKyAgICAgY2hhciAqcGt0OworICAgICB0aHJlYWRyZWYgKmlkOworeworICBjaGFyICpsaW1pdDsKKyAgdW5zaWduZWQgY2hhciAqYWx0aWQ7CisKKyAgYWx0aWQgPSAodW5zaWduZWQgY2hhciAqKSBpZDsKKyAgbGltaXQgPSBwa3QgKyBCVUZfVEhSRUFEX0lEX1NJWkU7CisgIHdoaWxlIChwa3QgPCBsaW1pdCkKKyAgICBwa3QgPSBwYWNrX2hleF9ieXRlIChwa3QsICphbHRpZCsrKTsKKyAgcmV0dXJuIHBrdDsKK30KKworCitzdGF0aWMgY2hhciAqCit1bnBhY2tfdGhyZWFkaWQgKGluYnVmLCBpZCkKKyAgICAgY2hhciAqaW5idWY7CisgICAgIHRocmVhZHJlZiAqaWQ7Cit7CisgIGNoYXIgKmFsdHJlZjsKKyAgY2hhciAqbGltaXQgPSBpbmJ1ZiArIEJVRl9USFJFQURfSURfU0laRTsKKyAgaW50IHgsIHk7CisKKyAgYWx0cmVmID0gKGNoYXIgKikgaWQ7CisKKyAgd2hpbGUgKGluYnVmIDwgbGltaXQpCisgICAgeworICAgICAgeCA9IHN0dWJoZXggKCppbmJ1ZisrKTsKKyAgICAgIHkgPSBzdHViaGV4ICgqaW5idWYrKyk7CisgICAgICAqYWx0cmVmKysgPSAoeCA8PCA0KSB8IHk7CisgICAgfQorICByZXR1cm4gaW5idWY7Cit9CisKKy8qIEV4dGVybmFsbHksIHRocmVhZHJlZnMgYXJlIDY0IGJpdHMgYnV0IGludGVybmFsbHksIHRoZXkgYXJlIHN0aWxsCisgICBpbnRzLiBUaGlzIGlzIGR1ZSB0byBhIG1pc21hdGNoIG9mIHNwZWNpZmljYXRpb25zLiAgV2Ugd291bGQgbGlrZQorICAgdG8gdXNlIDY0Yml0IHRocmVhZCByZWZlcmVuY2VzIGludGVybmFsbHkuICBUaGlzIGlzIGFuIGFkYXB0ZXIKKyAgIGZ1bmN0aW9uLiAgKi8KKwordm9pZAoraW50X3RvX3RocmVhZHJlZiAoaWQsIHZhbHVlKQorICAgICB0aHJlYWRyZWYgKmlkOworICAgICBpbnQgdmFsdWU7Cit7CisgIHVuc2lnbmVkIGNoYXIgKnNjYW47CisKKyAgc2NhbiA9ICh1bnNpZ25lZCBjaGFyICopIGlkOworICB7CisgICAgaW50IGkgPSA0OworICAgIHdoaWxlIChpLS0pCisgICAgICAqc2NhbisrID0gMDsKKyAgfQorICAqc2NhbisrID0gKHZhbHVlID4+IDI0KSAmIDB4ZmY7CisgICpzY2FuKysgPSAodmFsdWUgPj4gMTYpICYgMHhmZjsKKyAgKnNjYW4rKyA9ICh2YWx1ZSA+PiA4KSAmIDB4ZmY7CisgICpzY2FuKysgPSAodmFsdWUgJiAweGZmKTsKK30KKworc3RhdGljIGludAordGhyZWFkcmVmX3RvX2ludCAocmVmKQorICAgICB0aHJlYWRyZWYgKnJlZjsKK3sKKyAgaW50IGksIHZhbHVlID0gMDsKKyAgdW5zaWduZWQgY2hhciAqc2NhbjsKKworICBzY2FuID0gKGNoYXIgKikgcmVmOworICBzY2FuICs9IDQ7CisgIGkgPSA0OworICB3aGlsZSAoaS0tID4gMCkKKyAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgoKnNjYW4rKykgJiAweGZmKTsKKyAgcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZAorY29weV90aHJlYWRyZWYgKGRlc3QsIHNyYykKKyAgICAgdGhyZWFkcmVmICpkZXN0OworICAgICB0aHJlYWRyZWYgKnNyYzsKK3sKKyAgaW50IGk7CisgIHVuc2lnbmVkIGNoYXIgKmNzcmMsICpjZGVzdDsKKworICBjc3JjID0gKHVuc2lnbmVkIGNoYXIgKikgc3JjOworICBjZGVzdCA9ICh1bnNpZ25lZCBjaGFyICopIGRlc3Q7CisgIGkgPSA4OworICB3aGlsZSAoaS0tKQorICAgICpjZGVzdCsrID0gKmNzcmMrKzsKK30KKworc3RhdGljIGludAordGhyZWFkbWF0Y2ggKGRlc3QsIHNyYykKKyAgICAgdGhyZWFkcmVmICpkZXN0OworICAgICB0aHJlYWRyZWYgKnNyYzsKK3sKKyAgLyogdGhpbmdzIGFyZSBicm9rZW4gcmlnaHQgbm93LCBzbyBqdXN0IGFzc3VtZSB3ZSBnb3QgYSBtYXRjaCAqLworI2lmIDAKKyAgdW5zaWduZWQgY2hhciAqc3JjcCwgKmRlc3RwOworICBpbnQgaSwgcmVzdWx0OworICBzcmNwID0gKGNoYXIgKikgc3JjOworICBkZXN0cCA9IChjaGFyICopIGRlc3Q7CisKKyAgcmVzdWx0ID0gMTsKKyAgd2hpbGUgKGktLSA+IDApCisgICAgcmVzdWx0ICY9ICgqc3JjcCsrID09ICpkZXN0cCsrKSA/IDEgOiAwOworICByZXR1cm4gcmVzdWx0OworI2VuZGlmCisgIHJldHVybiAxOworfQorCisvKgorICB0aHJlYWRpZDoxLCAgICAgICAgIyBhbHdheXMgcmVxdWVzdCB0aHJlYWRpZAorICBjb250ZXh0X2V4aXN0czoyLAorICBkaXNwbGF5OjQsCisgIHVuaXF1ZV9uYW1lOjgsCisgIG1vcmVfZGlzcGxheToxNgorKi8KKworLyogRW5jb2Rpbmc6ICAnUSc6OCwnUCc6OCxtYXNrOjMyLHRocmVhZGlkOjY0ICovCisKK3N0YXRpYyBjaGFyICoKK3BhY2tfdGhyZWFkaW5mb19yZXF1ZXN0IChwa3QsIG1vZGUsIGlkKQorICAgICBjaGFyICpwa3Q7CisgICAgIGludCBtb2RlOworICAgICB0aHJlYWRyZWYgKmlkOworeworICAqcGt0KysgPSAncSc7CQkJLyogSW5mbyBRdWVyeSAqLworICAqcGt0KysgPSAnUCc7CQkJLyogcHJvY2VzcyBvciB0aHJlYWQgaW5mbyAqLworICBwa3QgPSBwYWNrX2ludCAocGt0LCBtb2RlKTsJLyogbW9kZSAqLworICBwa3QgPSBwYWNrX3RocmVhZGlkIChwa3QsIGlkKTsJLyogdGhyZWFkaWQgKi8KKyAgKnBrdCA9ICdcMCc7CQkJLyogdGVybWluYXRlICovCisgIHJldHVybiBwa3Q7Cit9CisKKy8qIFRoZXNlIHZhbHVlcyB0YWcgdGhlIGZpZWxkcyBpbiBhIHRocmVhZCBpbmZvIHJlc3BvbnNlIHBhY2tldCAqLworLyogVGFnZ2luZyB0aGUgZmllbGRzIGFsbG93cyB1cyB0byByZXF1ZXN0IHNwZWNpZmljIGZpZWxkcyBhbmQgdG8KKyAgIGFkZCBtb3JlIGZpZWxkcyBhcyB0aW1lIGdvZXMgYnkgKi8KKworI2RlZmluZSBUQUdfVEhSRUFESUQgMSAgICAgIC8qIEVjaG8gdGhlIHRocmVhZCBpZGVudGlmaWVyICovCisjZGVmaW5lIFRBR19FWElTVFMgMiAgICAgICAgLyogSXMgdGhpcyBwcm9jZXNzIGRlZmluZWQgZW5vdWdoIHRvCisJCQkgICAgICAgZmV0Y2ggcmVnaXN0ZXJzIGFuZCBpdHMgc3RhY2sgKi8KKyNkZWZpbmUgVEFHX0RJU1BMQVkgNCAgICAgICAvKiBBIHNob3J0IHRoaW5nIG1heWJlIHRvIHB1dCBvbiBhIHdpbmRvdyAqLworI2RlZmluZSBUQUdfVEhSRUFETkFNRSA4ICAgIC8qIHN0cmluZywgbWFwcyAxLXRvLTEgd2l0aCBhIHRocmVhZCBpcyAqLworI2RlZmluZSBUQUdfTU9SRURJU1BMQVkgMTYgIC8qIFdoYXRldmVyIHRoZSBrZXJuZWwgd2FudHMgdG8gc2F5IGFib3V0IAorCQkJICAgICAgIHRoZSBwcm9jZXNzKi8KKworc3RhdGljIGludAorcmVtb3RlX3VucGFja190aHJlYWRfaW5mb19yZXNwb25zZSAocGt0LCBleHBlY3RlZHJlZiwgaW5mbykKKyAgICAgY2hhciAqcGt0OworICAgICB0aHJlYWRyZWYgKmV4cGVjdGVkcmVmOworICAgICBzdHJ1Y3QgZ2RiX2V4dF90aHJlYWRfaW5mbyAqaW5mbzsKK3sKKyAgaW50IG1hc2ssIGxlbmd0aDsKKyAgdW5zaWduZWQgaW50IHRhZzsKKyAgdGhyZWFkcmVmIHJlZjsKKyAgY2hhciAqbGltaXQgPSBwa3QgKyBQQlVGU0laOyAgLyogcGxhdXNhYmxlIHBhcnNpbmcgbGltaXQgKi8KKyAgaW50IHJldHZhbCA9IDE7CisKKyAgLyogaW5mby0+dGhyZWFkaWQgPSAwOyBGSVhNRTogaW1wbGVtZW50IHplcm9fdGhyZWFkcmVmICovCisgIGluZm8tPmFjdGl2ZSA9IDA7CisgIGluZm8tPmRpc3BsYXlbMF0gPSAnXDAnOworICBpbmZvLT5zaG9ydG5hbWVbMF0gPSAnXDAnOworICBpbmZvLT5tb3JlX2Rpc3BsYXlbMF0gPSAnXDAnOworCisgIC8qIEFzc3VtZSB0aGUgY2hhcmFjdGVycyBpbmRpY2F0aW5nIHRoZSBwYWNrZXQgdHlwZSBoYXZlIGJlZW4gc3RyaXBwZWQgKi8KKyAgcGt0ID0gdW5wYWNrX2ludCAocGt0LCAmbWFzayk7CS8qIGFyZyBtYXNrICovCisgIHBrdCA9IHVucGFja190aHJlYWRpZCAocGt0LCAmcmVmKTsKKworICBpZiAobWFzayA9PSAwKQorICAgIHdhcm5pbmcgKCJJbmNvbXBsZXRlIHJlc3BvbnNlIHRvIHRocmVhZGluZm8gcmVxdWVzdFxuIik7CisgIGlmICghdGhyZWFkbWF0Y2ggKCZyZWYsIGV4cGVjdGVkcmVmKSkKKyAgICB7CQkJCS8qIFRoaXMgaXMgYW4gYW5zd2VyIHRvIGEgZGlmZmVyZW50IHJlcXVlc3QgKi8KKyAgICAgIHdhcm5pbmcgKCJFUlJPUiBSTVQgVGhyZWFkIGluZm8gbWlzbWF0Y2hcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBjb3B5X3RocmVhZHJlZiAoJmluZm8tPnRocmVhZGlkLCAmcmVmKTsKKworICAvKiBMb29wIG9uIHRhZ2dlZCBmaWVsZHMgLCB0cnkgdG8gYmFpbCBpZiBzb210aGluZyBnb2VzIHdyb25nICovCisKKyAgd2hpbGUgKChwa3QgPCBsaW1pdCkgJiYgbWFzayAmJiAqcGt0KQkvKiBwYWNrZXRzIGFyZSB0ZXJtaW5hdGVkIHdpdGggbnVsbHMgKi8KKyAgICB7CisgICAgICBwa3QgPSB1bnBhY2tfaW50IChwa3QsICZ0YWcpOwkvKiB0YWcgKi8KKyAgICAgIHBrdCA9IHVucGFja19ieXRlIChwa3QsICZsZW5ndGgpOwkJLyogbGVuZ3RoICovCisgICAgICBpZiAoISh0YWcgJiBtYXNrKSkJLyogdGFncyBvdXQgb2Ygc3luY2ggd2l0aCBtYXNrICovCisJeworCSAgd2FybmluZyAoIkVSUk9SIFJNVDogdGhyZWFkaW5mbyB0YWcgbWlzbWF0Y2hcbiIpOworCSAgcmV0dmFsID0gMDsKKwkgIGJyZWFrOworCX0KKyAgICAgIGlmICh0YWcgPT0gVEFHX1RIUkVBRElEKQorCXsKKwkgIGlmIChsZW5ndGggIT0gMTYpCisJICAgIHsKKwkgICAgICB3YXJuaW5nICgiRVJST1IgUk1UOiBsZW5ndGggb2YgdGhyZWFkaWQgaXMgbm90IDE2XG4iKTsKKwkgICAgICByZXR2YWwgPSAwOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBwa3QgPSB1bnBhY2tfdGhyZWFkaWQgKHBrdCwgJnJlZik7CisJICBtYXNrID0gbWFzayAmIH5UQUdfVEhSRUFESUQ7CisJICBjb250aW51ZTsKKwl9CisgICAgICBpZiAodGFnID09IFRBR19FWElTVFMpCisJeworCSAgaW5mby0+YWN0aXZlID0gc3R1Yl91bnBhY2tfaW50IChwa3QsIGxlbmd0aCk7CisJICBwa3QgKz0gbGVuZ3RoOworCSAgbWFzayA9IG1hc2sgJiB+KFRBR19FWElTVFMpOworCSAgaWYgKGxlbmd0aCA+IDgpCisJICAgIHsKKwkgICAgICB3YXJuaW5nICgiRVJST1IgUk1UOiAnZXhpc3RzJyBsZW5ndGggdG9vIGxvbmdcbiIpOworCSAgICAgIHJldHZhbCA9IDA7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIGlmICh0YWcgPT0gVEFHX1RIUkVBRE5BTUUpCisJeworCSAgcGt0ID0gdW5wYWNrX3N0cmluZyAocGt0LCAmaW5mby0+c2hvcnRuYW1lWzBdLCBsZW5ndGgpOworCSAgbWFzayA9IG1hc2sgJiB+VEFHX1RIUkVBRE5BTUU7CisJICBjb250aW51ZTsKKwl9CisgICAgICBpZiAodGFnID09IFRBR19ESVNQTEFZKQorCXsKKwkgIHBrdCA9IHVucGFja19zdHJpbmcgKHBrdCwgJmluZm8tPmRpc3BsYXlbMF0sIGxlbmd0aCk7CisJICBtYXNrID0gbWFzayAmIH5UQUdfRElTUExBWTsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIGlmICh0YWcgPT0gVEFHX01PUkVESVNQTEFZKQorCXsKKwkgIHBrdCA9IHVucGFja19zdHJpbmcgKHBrdCwgJmluZm8tPm1vcmVfZGlzcGxheVswXSwgbGVuZ3RoKTsKKwkgIG1hc2sgPSBtYXNrICYgflRBR19NT1JFRElTUExBWTsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIHdhcm5pbmcgKCJFUlJPUiBSTVQ6IHVua25vd24gdGhyZWFkIGluZm8gdGFnXG4iKTsKKyAgICAgIGJyZWFrOwkJCS8qIE5vdCBhIHRhZyB3ZSBrbm93IGFib3V0ICovCisgICAgfQorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CityZW1vdGVfZ2V0X3RocmVhZGluZm8gKHRocmVhZGlkLCBmaWVsZHNldCwgaW5mbykKKyAgICAgdGhyZWFkcmVmICp0aHJlYWRpZDsKKyAgICAgaW50IGZpZWxkc2V0OwkJLyogVEFHIG1hc2sgKi8KKyAgICAgc3RydWN0IGdkYl9leHRfdGhyZWFkX2luZm8gKmluZm87Cit7CisgIGludCByZXN1bHQ7CisgIGNoYXIgdGhyZWFkaW5mb19wa3RbUEJVRlNJWl07CisKKyAgcGFja190aHJlYWRpbmZvX3JlcXVlc3QgKHRocmVhZGluZm9fcGt0LCBmaWVsZHNldCwgdGhyZWFkaWQpOworICBwdXRwa3QgKHRocmVhZGluZm9fcGt0KTsKKyAgZ2V0cGt0ICh0aHJlYWRpbmZvX3BrdCwgMCk7CisgIHJlc3VsdCA9IHJlbW90ZV91bnBhY2tfdGhyZWFkX2luZm9fcmVzcG9uc2UgKHRocmVhZGluZm9fcGt0ICsgMiwgdGhyZWFkaWQsCisJCQkJCSAgICAgICBpbmZvKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogVW5mb3J0dW5hdGVseSwgNjEgYml0IHRocmVhZC1pZHMgYXJlIGJpZ2dlciB0aGFuIHRoZSBpbnRlcm5hbAorICAgcmVwcmVzZW50YXRpb24gb2YgYSB0aHJlYWRpZC4gICovCisKK3N0YXRpYyBpbnQKK2FkYXB0X3JlbW90ZV9nZXRfdGhyZWFkaW5mbyAocmVmLCBzZWxlY3Rpb24sIGluZm8pCisgICAgIGdkYl90aHJlYWRyZWYgKnJlZjsKKyAgICAgaW50IHNlbGVjdGlvbjsKKyAgICAgc3RydWN0IGdkYl9leHRfdGhyZWFkX2luZm8gKmluZm87Cit7CisgIHRocmVhZHJlZiBsY2xyZWY7CisKKyAgaW50X3RvX3RocmVhZHJlZiAoJmxjbHJlZiwgKnJlZik7CisgIHJldHVybiByZW1vdGVfZ2V0X3RocmVhZGluZm8gKCZsY2xyZWYsIHNlbGVjdGlvbiwgaW5mbyk7Cit9CisKKy8qICAgIEZvcm1hdDogaSdRJzo4LGkiTCI6OCxpbml0ZmxhZzo4LGJhdGNoc2l6ZToxNixsYXN0dGhyZWFkaWQ6MzIgICAqLworCitzdGF0aWMgY2hhciAqCitwYWNrX3RocmVhZGxpc3RfcmVxdWVzdCAocGt0LCBzdGFydGZsYWcsIHRocmVhZGNvdW50LCBuZXh0dGhyZWFkKQorICAgICBjaGFyICpwa3Q7CisgICAgIGludCBzdGFydGZsYWc7CisgICAgIGludCB0aHJlYWRjb3VudDsKKyAgICAgdGhyZWFkcmVmICpuZXh0dGhyZWFkOworeworICAqcGt0KysgPSAncSc7CQkJLyogaW5mbyBxdWVyeSBwYWNrZXQgKi8KKyAgKnBrdCsrID0gJ0wnOwkJCS8qIFByb2Nlc3MgTElTVCBvciB0aHJlYWRMSVNUIHJlcXVlc3QgKi8KKyAgcGt0ID0gcGFja19uaWJibGUgKHBrdCwgc3RhcnRmbGFnKTsJLyogaW5pdGZsYWcgMSBieXRlcyAqLworICBwa3QgPSBwYWNrX2hleF9ieXRlIChwa3QsIHRocmVhZGNvdW50KTsJLyogdGhyZWFkY291bnQgMiBieXRlcyAqLworICBwa3QgPSBwYWNrX3RocmVhZGlkIChwa3QsIG5leHR0aHJlYWQpOwkvKiA2NCBiaXQgdGhyZWFkIGlkZW50aWZpZXIgKi8KKyAgKnBrdCA9ICdcMCc7CisgIHJldHVybiBwa3Q7Cit9CisKKy8qIEVuY29kaW5nOiAgICdxJzo4LCdNJzo4LGNvdW50OjE2LGRvbmU6OCxhcmd0aHJlYWRpZDo2NCwodGhyZWFkaWQ6NjQpKiAqLworCitzdGF0aWMgaW50CitwYXJzZV90aHJlYWRsaXN0X3Jlc3BvbnNlIChwa3QsIHJlc3VsdF9saW1pdCwgb3JpZ2luYWxfZWNobywgcmVzdWx0bGlzdCwKKwkJCSAgIGRvbmVmbGFnKQorICAgICBjaGFyICpwa3Q7CisgICAgIGludCByZXN1bHRfbGltaXQ7CisgICAgIHRocmVhZHJlZiAqb3JpZ2luYWxfZWNobzsKKyAgICAgdGhyZWFkcmVmICpyZXN1bHRsaXN0OworICAgICBpbnQgKmRvbmVmbGFnOworeworICBjaGFyICpsaW1pdDsKKyAgaW50IGNvdW50LCByZXN1bHRjb3VudCwgZG9uZTsKKworICByZXN1bHRjb3VudCA9IDA7CisgIC8qIEFzc3VtZSB0aGUgJ3EnIGFuZCAnTSBjaGFycyBoYXZlIGJlZW4gc3RyaXBwZWQuICAqLworICBsaW1pdCA9IHBrdCArIChQQlVGU0laIC0gQlVGX1RIUkVBRF9JRF9TSVpFKTsJLyogZG9uZSBwYXJzZSBwYXN0IGhlcmUgKi8KKyAgcGt0ID0gdW5wYWNrX2J5dGUgKHBrdCwgJmNvdW50KTsJLyogY291bnQgZmllbGQgKi8KKyAgcGt0ID0gdW5wYWNrX25pYmJsZSAocGt0LCAmZG9uZSk7CisgIC8qIFRoZSBmaXJzdCB0aHJlYWRpZCBpcyB0aGUgYXJndW1lbnQgdGhyZWFkaWQuICAqLworICBwa3QgPSB1bnBhY2tfdGhyZWFkaWQgKHBrdCwgb3JpZ2luYWxfZWNobyk7CS8qIHNob3VsZCBtYXRjaCBxdWVyeSBwYWNrZXQgKi8KKyAgd2hpbGUgKChjb3VudC0tID4gMCkgJiYgKHBrdCA8IGxpbWl0KSkKKyAgICB7CisgICAgICBwa3QgPSB1bnBhY2tfdGhyZWFkaWQgKHBrdCwgcmVzdWx0bGlzdCsrKTsKKyAgICAgIGlmIChyZXN1bHRjb3VudCsrID49IHJlc3VsdF9saW1pdCkKKwlicmVhazsKKyAgICB9CisgIGlmIChkb25lZmxhZykKKyAgICAqZG9uZWZsYWcgPSBkb25lOworICByZXR1cm4gcmVzdWx0Y291bnQ7Cit9CisKK3N0YXRpYyBpbnQKK3JlbW90ZV9nZXRfdGhyZWFkbGlzdCAoc3RhcnRmbGFnLCBuZXh0dGhyZWFkLCByZXN1bHRfbGltaXQsCisJCSAgICAgICBkb25lLCByZXN1bHRfY291bnQsIHRocmVhZGxpc3QpCisgICAgIGludCBzdGFydGZsYWc7CisgICAgIHRocmVhZHJlZiAqbmV4dHRocmVhZDsKKyAgICAgaW50IHJlc3VsdF9saW1pdDsKKyAgICAgaW50ICpkb25lOworICAgICBpbnQgKnJlc3VsdF9jb3VudDsKKyAgICAgdGhyZWFkcmVmICp0aHJlYWRsaXN0OworCit7CisgIHN0YXRpYyB0aHJlYWRyZWYgZWNob19uZXh0dGhyZWFkOworICBjaGFyIHRocmVhZGxpc3RfcGFja2V0W1BCVUZTSVpdOworICBjaGFyIHRfcmVzcG9uc2VbUEJVRlNJWl07CisgIGludCByZXN1bHQgPSAxOworCisgIC8qIFRyYW5jYXRlIHJlc3VsdCBsaW1pdCB0byBiZSBzbWFsbGVyIHRoYW4gdGhlIHBhY2tldCBzaXplICovCisgIGlmICgoKChyZXN1bHRfbGltaXQgKyAxKSAqIEJVRl9USFJFQURfSURfU0laRSkgKyAxMCkgPj0gUEJVRlNJWikKKyAgICByZXN1bHRfbGltaXQgPSAoUEJVRlNJWiAvIEJVRl9USFJFQURfSURfU0laRSkgLSAyOworCisgIHBhY2tfdGhyZWFkbGlzdF9yZXF1ZXN0ICh0aHJlYWRsaXN0X3BhY2tldCwKKwkJCSAgIHN0YXJ0ZmxhZywgcmVzdWx0X2xpbWl0LCBuZXh0dGhyZWFkKTsKKyAgcHV0cGt0ICh0aHJlYWRsaXN0X3BhY2tldCk7CisgIGdldHBrdCAodF9yZXNwb25zZSwgMCk7CisKKyAgKnJlc3VsdF9jb3VudCA9CisgICAgcGFyc2VfdGhyZWFkbGlzdF9yZXNwb25zZSAodF9yZXNwb25zZSArIDIsIHJlc3VsdF9saW1pdCwgJmVjaG9fbmV4dHRocmVhZCwKKwkJCSAgICAgICB0aHJlYWRsaXN0LCBkb25lKTsKKworICBpZiAoIXRocmVhZG1hdGNoICgmZWNob19uZXh0dGhyZWFkLCBuZXh0dGhyZWFkKSkKKyAgICB7CisgICAgICAvKiBGSVhNRTogVGhpcyBpcyBhIGdvb2QgcmVhc29uIHRvIGRyb3AgdGhlIHBhY2tldCAqLworICAgICAgLyogUG9zc2FibHksIHRoZXJlIGlzIGEgZHVwbGljYXRlIHJlc3BvbnNlICovCisgICAgICAvKiBQb3NzYWJpbGl0aWVzIDoKKyAgICAgICAgIHJldHJhbnNtaXQgaW1tZWRpYXRseSAtIHJhY2UgY29uZGl0aW9ucworICAgICAgICAgcmV0cmFuc21pdCBhZnRlciB0aW1lb3V0IC0geWVzCisgICAgICAgICBleGl0CisgICAgICAgICB3YWl0IGZvciBwYWNrZXQsIHRoZW4gZXhpdAorICAgICAgICovCisgICAgICB3YXJuaW5nICgiSE1NOiB0aHJlYWRsaXN0IGRpZCBub3QgZWNobyBhcmcgdGhyZWFkLCBkcm9wcGluZyBpdFxuIik7CisgICAgICByZXR1cm4gMDsJCQkvKiBJIGNob29zZSBzaW1wbHkgZXhpdGluZyAqLworICAgIH0KKyAgaWYgKCpyZXN1bHRfY291bnQgPD0gMCkKKyAgICB7CisgICAgICBpZiAoKmRvbmUgIT0gMSkKKwl7CisJICB3YXJuaW5nICgiUk1UIEVSUk9SIDogZmFpbGVkIHRvIGdldCByZW1vdGUgdGhyZWFkIGxpc3RcbiIpOworCSAgcmVzdWx0ID0gMDsKKwl9CisgICAgICByZXR1cm4gcmVzdWx0OwkJLyogYnJlYWs7ICovCisgICAgfQorICBpZiAoKnJlc3VsdF9jb3VudCA+IHJlc3VsdF9saW1pdCkKKyAgICB7CisgICAgICAqcmVzdWx0X2NvdW50ID0gMDsKKyAgICAgIHdhcm5pbmcgKCJSTVQgRVJST1I6IHRocmVhZGxpc3QgcmVzcG9uc2UgbG9uZ2VyIHRoYW4gcmVxdWVzdGVkXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gcmVtb3RlIGFuZCB0aHJlYWRzLCByZW1vdGVzIHVwcGVyIGludGVyZmFjZSAqLworCisvKiByZW1vdGVfZmluZF9uZXdfdGhyZWFkcyByZXRyaWV2ZXMgdGhlIHRocmVhZCBsaXN0IGFuZCBmb3IgZWFjaAorICAgdGhyZWFkIGluIHRoZSBsaXN0LCBsb29rcyB1cCB0aGUgdGhyZWFkIGluIEdEQidzIGludGVybmFsIGxpc3QsCisgICBhZGluZyB0aGUgdGhyZWFkIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuICBUaGlzIGludm9sdmVzCisgICBnZXR0aW5nIHBhcnRpYWwgdGhyZWFkIGxpc3RzIGZyb20gdGhlIHJlbW90ZSB0YXJnZXQgc28sIHBvbGxpbmcgdGhlCisgICBxdWl0X2ZsYWcgaXMgcmVxdWlyZWQuICAqLworCisKKy8qIEFib3V0IHRoaXMgbWFueSB0aHJlYWRpc2RzIGZpdCBpbiBhIHBhY2tldC4gKi8KKworI2RlZmluZSBNQVhUSFJFQURMSVNUUkVTVUxUUyAzMgorCitzdGF0aWMgaW50CityZW1vdGVfdGhyZWFkbGlzdF9pdGVyYXRvciAoc3RlcGZ1bmN0aW9uLCBjb250ZXh0LCBsb29wbGltaXQpCisgICAgIHJtdF90aHJlYWRfYWN0aW9uIHN0ZXBmdW5jdGlvbjsKKyAgICAgdm9pZCAqY29udGV4dDsKKyAgICAgaW50IGxvb3BsaW1pdDsKK3sKKyAgaW50IGRvbmUsIGksIHJlc3VsdF9jb3VudDsKKyAgaW50IHN0YXJ0ZmxhZyA9IDE7CisgIGludCByZXN1bHQgPSAxOworICBpbnQgbG9vcGNvdW50ID0gMDsKKyAgc3RhdGljIHRocmVhZHJlZiBuZXh0dGhyZWFkOworICBzdGF0aWMgdGhyZWFkcmVmIHJlc3VsdHRocmVhZGxpc3RbTUFYVEhSRUFETElTVFJFU1VMVFNdOworCisgIGRvbmUgPSAwOworICB3aGlsZSAoIWRvbmUpCisgICAgeworICAgICAgaWYgKGxvb3Bjb3VudCsrID4gbG9vcGxpbWl0KQorCXsKKwkgIHJlc3VsdCA9IDA7CisJICB3YXJuaW5nICgiUmVtb3RlIGZldGNoIHRocmVhZGxpc3QgLWluZmluaXRlIGxvb3AtXG4iKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGlmICghcmVtb3RlX2dldF90aHJlYWRsaXN0IChzdGFydGZsYWcsICZuZXh0dGhyZWFkLCBNQVhUSFJFQURMSVNUUkVTVUxUUywKKwkJCQkgICZkb25lLCAmcmVzdWx0X2NvdW50LCByZXN1bHR0aHJlYWRsaXN0KSkKKwl7CisJICByZXN1bHQgPSAwOworCSAgYnJlYWs7CisJfQorICAgICAgLyogY2xlYXIgZm9yIGxhdGVyIGl0ZXJhdGlvbnMgKi8KKyAgICAgIHN0YXJ0ZmxhZyA9IDA7CisgICAgICAvKiBTZXR1cCB0byByZXN1bWUgbmV4dCBiYXRjaCBvZiB0aHJlYWQgcmVmZXJlbmNlcywgc2V0IG5leHR0aHJlYWQuICAqLworICAgICAgaWYgKHJlc3VsdF9jb3VudCA+PSAxKQorCWNvcHlfdGhyZWFkcmVmICgmbmV4dHRocmVhZCwgJnJlc3VsdHRocmVhZGxpc3RbcmVzdWx0X2NvdW50IC0gMV0pOworICAgICAgaSA9IDA7CisgICAgICB3aGlsZSAocmVzdWx0X2NvdW50LS0pCisJaWYgKCEocmVzdWx0ID0gKCpzdGVwZnVuY3Rpb24pICgmcmVzdWx0dGhyZWFkbGlzdFtpKytdLCBjb250ZXh0KSkpCisJICBicmVhazsKKyAgICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKK3JlbW90ZV9uZXd0aHJlYWRfc3RlcCAocmVmLCBjb250ZXh0KQorICAgICB0aHJlYWRyZWYgKnJlZjsKKyAgICAgdm9pZCAqY29udGV4dDsKK3sKKyAgaW50IHBpZDsKKworICBwaWQgPSB0aHJlYWRyZWZfdG9faW50IChyZWYpOworICBpZiAoIWluX3RocmVhZF9saXN0IChwaWQpKQorICAgIGFkZF90aHJlYWQgKHBpZCk7CisgIHJldHVybiAxOwkJCS8qIGNvbnRpbnVlIGl0ZXJhdG9yICovCit9CisKKyNkZWZpbmUgQ1JBWllfTUFYX1RIUkVBRFMgMTAwMAorCitzdGF0aWMgaW50CityZW1vdGVfY3VycmVudF90aHJlYWQgKG9sZHBpZCkKKyAgICAgaW50IG9sZHBpZDsKK3sKKyAgY2hhciBidWZbUEJVRlNJWl07CisKKyAgcHV0cGt0ICgicUMiKTsKKyAgZ2V0cGt0IChidWYsIDApOworICBpZiAoYnVmWzBdID09ICdRJyAmJiBidWZbMV0gPT0gJ0MnKQorICAgIHJldHVybiBzdHJ0b2wgKCZidWZbMl0sIE5VTEwsIDE2KTsKKyAgZWxzZQorICAgIHJldHVybiBvbGRwaWQ7Cit9CisKK2ludAorcmVtb3RlX2ZpbmRfbmV3X3RocmVhZHMgKCkKK3sKKyAgaW50IHJldDsKKworICByZXQgPSByZW1vdGVfdGhyZWFkbGlzdF9pdGVyYXRvciAocmVtb3RlX25ld3RocmVhZF9zdGVwLCAwLCAKKwkJCQkgICAgQ1JBWllfTUFYX1RIUkVBRFMpOworICBpZiAoaW5mZXJpb3JfcGlkID09IE1BR0lDX05VTExfUElEKQkvKiBhY2sgYWNrIGFjayAqLworICAgIGluZmVyaW9yX3BpZCA9IHJlbW90ZV9jdXJyZW50X3RocmVhZCAoaW5mZXJpb3JfcGlkKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgdGhyZWFkIHZlY3RvciB3aGljaCBpcyB1c2VkIGJ5IHRocmVhZHMuYyAqLworLyogVGhlIHRocmVhZCBzdHViIGlzIGEgcGFja2FnZSwgaXQgaGFzIGFuIGluaXRpYWxpemVyICovCisKK3N0YXRpYyB2b2lkCitpbml0X3JlbW90ZV90aHJlYWRzICgpCit7CisgIHJlbW90ZV90aHJlYWRfdmVjLmZpbmRfbmV3X3RocmVhZHMgPSByZW1vdGVfZmluZF9uZXdfdGhyZWFkczsKKyAgcmVtb3RlX3RocmVhZF92ZWMuZ2V0X3RocmVhZF9pbmZvID0gYWRhcHRfcmVtb3RlX2dldF90aHJlYWRpbmZvOworfQorCisMCisvKiAgUmVzdGFydCB0aGUgcmVtb3RlIHNpZGU7IHRoaXMgaXMgYW4gZXh0ZW5kZWQgcHJvdG9jb2wgb3BlcmF0aW9uLiAgKi8KKworc3RhdGljIHZvaWQKK2V4dGVuZGVkX3JlbW90ZV9yZXN0YXJ0ICgpCit7CisgIGNoYXIgYnVmW1BCVUZTSVpdOworCisgIC8qIFNlbmQgdGhlIHJlc3RhcnQgY29tbWFuZDsgZm9yIHJlYXNvbnMgSSBkb24ndCB1bmRlcnN0YW5kIHRoZQorICAgICByZW1vdGUgc2lkZSByZWFsbHkgZXhwZWN0cyBhIG51bWJlciBhZnRlciB0aGUgIlIiLiAgKi8KKyAgYnVmWzBdID0gJ1InOworICBzcHJpbnRmICgmYnVmWzFdLCAiJXgiLCAwKTsKKyAgcHV0cGt0IChidWYpOworCisgIC8qIE5vdyBxdWVyeSBmb3Igc3RhdHVzIHNvIHRoaXMgbG9va3MganVzdCBsaWtlIHdlIHJlc3RhcnRlZAorICAgICBnZGJzZXJ2ZXIgZnJvbSBzY3JhdGNoLiAgKi8KKyAgcHV0cGt0ICgiPyIpOworICBnZXRwa3QgKGJ1ZiwgMCk7Cit9CisMCisvKiBDbGVhbiB1cCBjb25uZWN0aW9uIHRvIGEgcmVtb3RlIGRlYnVnZ2VyLiAgKi8KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCityZW1vdGVfY2xvc2UgKHF1aXR0aW5nKQorICAgICBpbnQgcXVpdHRpbmc7Cit7CisgIGlmIChyZW1vdGVfZGVzYykKKyAgICBTRVJJQUxfQ0xPU0UgKHJlbW90ZV9kZXNjKTsKKyAgcmVtb3RlX2Rlc2MgPSBOVUxMOworfQorCisvKiBRdWVyeSB0aGUgcmVtb3RlIHNpZGUgZm9yIHRoZSB0ZXh0LCBkYXRhIGFuZCBic3Mgb2Zmc2V0cy4gKi8KKworc3RhdGljIHZvaWQKK2dldF9vZmZzZXRzICgpCit7CisgIGNoYXIgYnVmW1BCVUZTSVpdLCAqcHRyOworICBpbnQgbG9zZTsKKyAgQ09SRV9BRERSIHRleHRfYWRkciwgZGF0YV9hZGRyLCBic3NfYWRkcjsKKyAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqb2ZmczsKKworICBwdXRwa3QgKCJxT2Zmc2V0cyIpOworCisgIGdldHBrdCAoYnVmLCAwKTsKKworICBpZiAoYnVmWzBdID09ICdcMDAwJykKKyAgICByZXR1cm47CQkJLyogUmV0dXJuIHNpbGVudGx5LiAgU3R1YiBkb2Vzbid0IHN1cHBvcnQKKwkJCQkgICB0aGlzIGNvbW1hbmQuICovCisgIGlmIChidWZbMF0gPT0gJ0UnKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJSZW1vdGUgZmFpbHVyZSByZXBseTogJXMiLCBidWYpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBQaWNrIHVwIGVhY2ggZmllbGQgaW4gdHVybi4gIFRoaXMgdXNlZCB0byBiZSBkb25lIHdpdGggc2NhbmYsIGJ1dAorICAgICBzY2FuZiB3aWxsIG1ha2UgdHJvdWJsZSBpZiBDT1JFX0FERFIgc2l6ZSBkb2Vzbid0IG1hdGNoCisgICAgIGNvbnZlcnNpb24gZGlyZWN0aXZlcyBjb3JyZWN0bHkuICBUaGUgZm9sbG93aW5nIGNvZGUgd2lsbCB3b3JrCisgICAgIHdpdGggYW55IHNpemUgb2YgQ09SRV9BRERSLiAgKi8KKyAgdGV4dF9hZGRyID0gZGF0YV9hZGRyID0gYnNzX2FkZHIgPSAwOworICBwdHIgPSBidWY7CisgIGxvc2UgPSAwOworCisgIGlmIChzdHJuY21wIChwdHIsICJUZXh0PSIsIDUpID09IDApCisgICAgeworICAgICAgcHRyICs9IDU7CisgICAgICAvKiBEb24ndCB1c2Ugc3RydG9sLCBjb3VsZCBsb3NlIG9uIGJpZyB2YWx1ZXMuICAqLworICAgICAgd2hpbGUgKCpwdHIgJiYgKnB0ciAhPSAnOycpCisJdGV4dF9hZGRyID0gKHRleHRfYWRkciA8PCA0KSArIGZyb21oZXggKCpwdHIrKyk7CisgICAgfQorICBlbHNlCisgICAgbG9zZSA9IDE7CisKKyAgaWYgKCFsb3NlICYmIHN0cm5jbXAgKHB0ciwgIjtEYXRhPSIsIDYpID09IDApCisgICAgeworICAgICAgcHRyICs9IDY7CisgICAgICB3aGlsZSAoKnB0ciAmJiAqcHRyICE9ICc7JykKKwlkYXRhX2FkZHIgPSAoZGF0YV9hZGRyIDw8IDQpICsgZnJvbWhleCAoKnB0cisrKTsKKyAgICB9CisgIGVsc2UKKyAgICBsb3NlID0gMTsKKworICBpZiAoIWxvc2UgJiYgc3RybmNtcCAocHRyLCAiO0Jzcz0iLCA1KSA9PSAwKQorICAgIHsKKyAgICAgIHB0ciArPSA1OworICAgICAgd2hpbGUgKCpwdHIgJiYgKnB0ciAhPSAnOycpCisJYnNzX2FkZHIgPSAoYnNzX2FkZHIgPDwgNCkgKyBmcm9taGV4ICgqcHRyKyspOworICAgIH0KKyAgZWxzZQorICAgIGxvc2UgPSAxOworCisgIGlmIChsb3NlKQorICAgIGVycm9yICgiTWFsZm9ybWVkIHJlc3BvbnNlIHRvIG9mZnNldCBxdWVyeSwgJXMiLCBidWYpOworCisgIGlmIChzeW1maWxlX29iamZpbGUgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgb2ZmcyA9IChzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICopIGFsbG9jYSAoc2l6ZW9mIChzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzKQorCQkJCQkgICAgKyBzeW1maWxlX29iamZpbGUtPm51bV9zZWN0aW9ucworCQkJCQkgICAgKiBzaXplb2YgKG9mZnMtPm9mZnNldHMpKTsKKyAgbWVtY3B5IChvZmZzLCBzeW1maWxlX29iamZpbGUtPnNlY3Rpb25fb2Zmc2V0cywKKwkgIHNpemVvZiAoc3RydWN0IHNlY3Rpb25fb2Zmc2V0cykKKwkgICsgc3ltZmlsZV9vYmpmaWxlLT5udW1fc2VjdGlvbnMKKwkgICogc2l6ZW9mIChvZmZzLT5vZmZzZXRzKSk7CisKKyAgQU5PRkZTRVQgKG9mZnMsIFNFQ1RfT0ZGX1RFWFQpID0gdGV4dF9hZGRyOworCisgIC8qIFRoaXMgaXMgYSB0ZW1wb3Jhcnkga2x1ZGdlIHRvIGZvcmNlIGRhdGEgYW5kIGJzcyB0byB1c2UgdGhlIHNhbWUgb2Zmc2V0cworICAgICBiZWNhdXNlIHRoYXQncyB3aGF0IG5sbWNvbnYgZG9lcyBub3cuICBUaGUgcmVhbCBzb2x1dGlvbiByZXF1aXJlcyBjaGFuZ2VzCisgICAgIHRvIHRoZSBzdHViIGFuZCByZW1vdGUuYyB0aGF0IEkgZG9uJ3QgaGF2ZSB0aW1lIHRvIGRvIHJpZ2h0IG5vdy4gICovCisKKyAgQU5PRkZTRVQgKG9mZnMsIFNFQ1RfT0ZGX0RBVEEpID0gZGF0YV9hZGRyOworICBBTk9GRlNFVCAob2ZmcywgU0VDVF9PRkZfQlNTKSA9IGRhdGFfYWRkcjsKKworICBvYmpmaWxlX3JlbG9jYXRlIChzeW1maWxlX29iamZpbGUsIG9mZnMpOworfQorCisvKiBTdHViIGZvciBjYXRjaF9lcnJvcnMuICAqLworCitzdGF0aWMgaW50CityZW1vdGVfc3RhcnRfcmVtb3RlIChkdW1teSkKKyAgICAgUFRSIGR1bW15OworeworICBpbW1lZGlhdGVfcXVpdCA9IDE7CQkvKiBBbGxvdyB1c2VyIHRvIGludGVycnVwdCBpdCAqLworCisgIC8qIEFjayBhbnkgcGFja2V0IHdoaWNoIHRoZSByZW1vdGUgc2lkZSBoYXMgYWxyZWFkeSBzZW50LiAgKi8KKyAgU0VSSUFMX1dSSVRFIChyZW1vdGVfZGVzYywgIisiLCAxKTsKKworICAvKiBMZXQgdGhlIHN0dWIga25vdyB0aGF0IHdlIHdhbnQgaXQgdG8gcmV0dXJuIHRoZSB0aHJlYWQuICAqLworICBzZXRfdGhyZWFkICgtMSwgMCk7CisKKyAgaW5mZXJpb3JfcGlkID0gcmVtb3RlX2N1cnJlbnRfdGhyZWFkIChpbmZlcmlvcl9waWQpOworCisgIGdldF9vZmZzZXRzICgpOwkJLyogR2V0IHRleHQsIGRhdGEgJiBic3Mgb2Zmc2V0cyAqLworCisgIHB1dHBrdCAoIj8iKTsJCQkvKiBpbml0aWF0ZSBhIHF1ZXJ5IGZyb20gcmVtb3RlIG1hY2hpbmUgKi8KKyAgaW1tZWRpYXRlX3F1aXQgPSAwOworCisgIHN0YXJ0X3JlbW90ZSAoKTsJCS8qIEluaXRpYWxpemUgZ2RiIHByb2Nlc3MgbWVjaGFuaXNtcyAqLworICByZXR1cm4gMTsKK30KKworLyogT3BlbiBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgZGVidWdnZXIuCisgICBOQU1FIGlzIHRoZSBmaWxlbmFtZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uLiAgKi8KKworc3RhdGljIHZvaWQKK3JlbW90ZV9vcGVuIChuYW1lLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICByZW1vdGVfb3Blbl8xIChuYW1lLCBmcm9tX3R0eSwgJnJlbW90ZV9vcHMsIDApOworfQorCisvKiBPcGVuIGEgY29ubmVjdGlvbiB0byBhIHJlbW90ZSBkZWJ1Z2dlciB1c2luZyB0aGUgZXh0ZW5kZWQKKyAgIHJlbW90ZSBnZGIgcHJvdG9jb2wuICBOQU1FIGlzIHRoZSBmaWxlbmFtZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uLiAgKi8KKworc3RhdGljIHZvaWQKK2V4dGVuZGVkX3JlbW90ZV9vcGVuIChuYW1lLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICByZW1vdGVfb3Blbl8xIChuYW1lLCBmcm9tX3R0eSwgJmV4dGVuZGVkX3JlbW90ZV9vcHMsIDEvKmV4dGVuZGVkX3AqLyk7Cit9CisKKy8qIEdlbmVyaWMgY29kZSBmb3Igb3BlbmluZyBhIGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgdGFyZ2V0LiAgKi8KKworc3RhdGljIERDQUNIRSAqcmVtb3RlX2RjYWNoZTsKKworc3RhdGljIHZvaWQKK3JlbW90ZV9vcGVuXzEgKG5hbWUsIGZyb21fdHR5LCB0YXJnZXQsIGV4dGVuZGVkX3ApCisgICAgIGNoYXIgKm5hbWU7CisgICAgIGludCBmcm9tX3R0eTsKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldDsKKyAgICAgaW50IGV4dGVuZGVkX3A7Cit7CisgIGlmIChuYW1lID09IDApCisgICAgZXJyb3IgKCJUbyBvcGVuIGEgcmVtb3RlIGRlYnVnIGNvbm5lY3Rpb24sIHlvdSBuZWVkIHRvIHNwZWNpZnkgd2hhdFxuXAorc2VyaWFsIGRldmljZSBpcyBhdHRhY2hlZCB0byB0aGUgcmVtb3RlIHN5c3RlbSAoZS5nLiAvZGV2L3R0eWEpLiIpOworCisgIHRhcmdldF9wcmVvcGVuIChmcm9tX3R0eSk7CisKKyAgdW5wdXNoX3RhcmdldCAodGFyZ2V0KTsKKworICByZW1vdGVfZGNhY2hlID0gZGNhY2hlX2luaXQgKHJlbW90ZV9yZWFkX2J5dGVzLCByZW1vdGVfd3JpdGVfYnl0ZXMpOworCisgIHJlbW90ZV9kZXNjID0gU0VSSUFMX09QRU4gKG5hbWUpOworICBpZiAoIXJlbW90ZV9kZXNjKQorICAgIHBlcnJvcl93aXRoX25hbWUgKG5hbWUpOworCisgIGlmIChiYXVkX3JhdGUgIT0gLTEpCisgICAgeworICAgICAgaWYgKFNFUklBTF9TRVRCQVVEUkFURSAocmVtb3RlX2Rlc2MsIGJhdWRfcmF0ZSkpCisJeworCSAgU0VSSUFMX0NMT1NFIChyZW1vdGVfZGVzYyk7CisJICBwZXJyb3Jfd2l0aF9uYW1lIChuYW1lKTsKKwl9CisgICAgfQorCisKKyAgU0VSSUFMX1JBVyAocmVtb3RlX2Rlc2MpOworCisgIC8qIElmIHRoZXJlIGlzIHNvbWV0aGluZyBzaXR0aW5nIGluIHRoZSBidWZmZXIgd2UgbWlnaHQgdGFrZSBpdCBhcyBhCisgICAgIHJlc3BvbnNlIHRvIGEgY29tbWFuZCwgd2hpY2ggd291bGQgYmUgYmFkLiAgKi8KKyAgU0VSSUFMX0ZMVVNIX0lOUFVUIChyZW1vdGVfZGVzYyk7CisKKyAgaWYgKGZyb21fdHR5KQorICAgIHsKKyAgICAgIHB1dHNfZmlsdGVyZWQgKCJSZW1vdGUgZGVidWdnaW5nIHVzaW5nICIpOworICAgICAgcHV0c19maWx0ZXJlZCAobmFtZSk7CisgICAgICBwdXRzX2ZpbHRlcmVkICgiXG4iKTsKKyAgICB9CisgIHB1c2hfdGFyZ2V0ICh0YXJnZXQpOwkvKiBTd2l0Y2ggdG8gdXNpbmcgcmVtb3RlIHRhcmdldCBub3cgKi8KKworICAvKiBUaGUgdGFyZ2V0IHZlY3RvciBkb2VzIG5vdCBoYXZlIHRoZSB0aHJlYWQgZnVuY3Rpb25zIGluIGl0IHlldCwKKyAgICAgc28gd2UgdXNlIHRoaXMgZnVuY3Rpb24gdG8gY2FsbCBiYWNrIGludG8gdGhlIHRocmVhZCBtb2R1bGUgYW5kCisgICAgIHJlZ2lzdGVyIHRoZSB0aHJlYWQgdmVjdG9yIGFuZCBpdHMgY29udGFpbmVkIGZ1bmN0aW9ucy4gKi8KKyAgYmluZF90YXJnZXRfdGhyZWFkX3ZlY3RvciAoJnJlbW90ZV90aHJlYWRfdmVjKTsKKworICAvKiBTdGFydCBvdXQgYnkgdHJ5aW5nIHRoZSAnUCcgcmVxdWVzdCB0byBzZXQgcmVnaXN0ZXJzLiAgV2Ugc2V0CisgICAgIHRoaXMgZWFjaCB0aW1lIHRoYXQgd2Ugb3BlbiBhIG5ldyB0YXJnZXQgc28gdGhhdCBpZiB0aGUgdXNlcgorICAgICBzd2l0Y2hlcyBmcm9tIG9uZSBzdHViIHRvIGFub3RoZXIsIHdlIGNhbiAoaWYgdGhlIHRhcmdldCBpcworICAgICBjbG9zZWQgYW5kIHJlb3BlbmVkKSBjb3BlLiAgKi8KKyAgc3R1Yl9zdXBwb3J0c19QID0gMTsKKworICBnZW5lcmFsX3RocmVhZCA9IC0yOworICBjb250X3RocmVhZCA9IC0yOworCisgIC8qIEZvcmNlIHJlbW90ZV93cml0ZV9ieXRlcyB0byBjaGVjayB3aGV0aGVyIHRhcmdldCBzdXBwb3J0cworICAgICBiaW5hcnkgZG93bmxvYWRpbmcuICovCisgIHJlbW90ZV9iaW5hcnlfY2hlY2tlZCA9IDA7CisKKyAgLyogV2l0aG91dCB0aGlzLCBzb21lIGNvbW1hbmRzIHdoaWNoIHJlcXVpcmUgYW4gYWN0aXZlIHRhcmdldCAoc3VjaAorICAgICBhcyBraWxsKSB3b24ndCB3b3JrLiAgVGhpcyB2YXJpYWJsZSBzZXJ2ZXMgKGF0IGxlYXN0KSBkb3VibGUgZHV0eQorICAgICBhcyBib3RoIHRoZSBwaWQgb2YgdGhlIHRhcmdldCBwcm9jZXNzIChpZiBpdCBoYXMgc3VjaCksIGFuZCBhcyBhCisgICAgIGZsYWcgaW5kaWNhdGluZyB0aGF0IGEgdGFyZ2V0IGlzIGFjdGl2ZS4gIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQKKyAgICAgYmUgc3BsaXQgb3V0IGludG8gc2VwZXJhdGUgdmFyaWFibGVzLCBlc3BlY2lhbGx5IHNpbmNlIEdEQiB3aWxsCisgICAgIHNvbWVkYXkgaGF2ZSBhIG5vdGlvbiBvZiBkZWJ1Z2dpbmcgc2V2ZXJhbCBwcm9jZXNzZXMuICAqLworCisgIGluZmVyaW9yX3BpZCA9IE1BR0lDX05VTExfUElEOworICAvKiBTdGFydCB0aGUgcmVtb3RlIGNvbm5lY3Rpb247IGlmIGVycm9yICgwKSwgZGlzY2FyZCB0aGlzIHRhcmdldC4KKyAgICAgSW4gcGFydGljdWxhciwgaWYgdGhlIHVzZXIgcXVpdHMsIGJlIHN1cmUgdG8gZGlzY2FyZCBpdAorICAgICAod2UnZCBiZSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUgb3RoZXJ3aXNlKS4gICovCisgIGlmICghY2F0Y2hfZXJyb3JzIChyZW1vdGVfc3RhcnRfcmVtb3RlLCBOVUxMLCAKKwkJICAgICAiQ291bGRuJ3QgZXN0YWJsaXNoIGNvbm5lY3Rpb24gdG8gcmVtb3RlIHRhcmdldFxuIiwgCisJCSAgICAgUkVUVVJOX01BU0tfQUxMKSkKKyAgICB7CisgICAgICBwb3BfdGFyZ2V0ICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoZXh0ZW5kZWRfcCkKKyAgICB7CisgICAgICAvKiB0ZWxsIHRoZSByZW1vdGUgdGhhdCB3ZSdyZSB1c2luZyB0aGUgZXh0ZW5kZWQgcHJvdG9jb2wuICAqLworICAgICAgY2hhciBidWZbUEJVRlNJWl07CisgICAgICBwdXRwa3QgKCIhIik7CisgICAgICBnZXRwa3QgKGJ1ZiwgMCk7CisgICAgfQorfQorCisvKiBUaGlzIHRha2VzIGEgcHJvZ3JhbSBwcmV2aW91c2x5IGF0dGFjaGVkIHRvIGFuZCBkZXRhY2hlcyBpdC4gIEFmdGVyCisgICB0aGlzIGlzIGRvbmUsIEdEQiBjYW4gYmUgdXNlZCB0byBkZWJ1ZyBzb21lIG90aGVyIHByb2dyYW0uICBXZQorICAgYmV0dGVyIG5vdCBoYXZlIGxlZnQgYW55IGJyZWFrcG9pbnRzIGluIHRoZSB0YXJnZXQgcHJvZ3JhbSBvciBpdCdsbAorICAgZGllIHdoZW4gaXQgaGl0cyBvbmUuICAqLworCitzdGF0aWMgdm9pZAorcmVtb3RlX2RldGFjaCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgY2hhciBidWZbUEJVRlNJWl07CisKKyAgaWYgKGFyZ3MpCisgICAgZXJyb3IgKCJBcmd1bWVudCBnaXZlbiB0byBcImRldGFjaFwiIHdoZW4gcmVtb3RlbHkgZGVidWdnaW5nLiIpOworCisgIC8qIFRlbGwgdGhlIHJlbW90ZSB0YXJnZXQgdG8gZGV0YWNoLiAgKi8KKyAgc3RyY3B5IChidWYsICJEIik7CisgIHJlbW90ZV9zZW5kIChidWYpOworCisgIHBvcF90YXJnZXQgKCk7CisgIGlmIChmcm9tX3R0eSkKKyAgICBwdXRzX2ZpbHRlcmVkICgiRW5kaW5nIHJlbW90ZSBkZWJ1Z2dpbmcuXG4iKTsKK30KKworLyogQ29udmVydCBoZXggZGlnaXQgQSB0byBhIG51bWJlci4gICovCisKK2ludAorZnJvbWhleCAoYSkKKyAgICAgaW50IGE7Cit7CisgIGlmIChhID49ICcwJyAmJiBhIDw9ICc5JykKKyAgICByZXR1cm4gYSAtICcwJzsKKyAgZWxzZSBpZiAoYSA+PSAnYScgJiYgYSA8PSAnZicpCisgICAgcmV0dXJuIGEgLSAnYScgKyAxMDsKKyAgZWxzZSBpZiAoYSA+PSAnQScgJiYgYSA8PSAnRicpCisgICAgcmV0dXJuIGEgLSAnQScgKyAxMDsKKyAgZWxzZSAKKyAgICBlcnJvciAoIlJlcGx5IGNvbnRhaW5zIGludmFsaWQgaGV4IGRpZ2l0ICVkIiwgYSk7Cit9CisKKy8qIENvbnZlcnQgbnVtYmVyIE5JQiB0byBhIGhleCBkaWdpdC4gICovCisKK3N0YXRpYyBpbnQKK3RvaGV4IChuaWIpCisgICAgIGludCBuaWI7Cit7CisgIGlmIChuaWIgPCAxMCkKKyAgICByZXR1cm4gJzAnK25pYjsKKyAgZWxzZQorICAgIHJldHVybiAnYScrbmliLTEwOworfQorDAorLyogVGVsbCB0aGUgcmVtb3RlIG1hY2hpbmUgdG8gcmVzdW1lLiAgKi8KKworc3RhdGljIGVudW0gdGFyZ2V0X3NpZ25hbCBsYXN0X3NlbnRfc2lnbmFsID0gVEFSR0VUX1NJR05BTF8wOworCitzdGF0aWMgaW50IGxhc3Rfc2VudF9zdGVwOworCitzdGF0aWMgdm9pZAorcmVtb3RlX3Jlc3VtZSAocGlkLCBzdGVwLCBzaWdnbmFsKQorICAgICBpbnQgcGlkLCBzdGVwOworICAgICBlbnVtIHRhcmdldF9zaWduYWwgc2lnZ25hbDsKK3sKKyAgY2hhciBidWZbUEJVRlNJWl07CisKKyAgaWYgKHBpZCA9PSAtMSkKKyAgICBzZXRfdGhyZWFkICgwLCAwKTsJCS8qIHJ1biBhbnkgdGhyZWFkICovCisgIGVsc2UKKyAgICBzZXRfdGhyZWFkIChwaWQsIDApOwkvKiBydW4gdGhpcyB0aHJlYWQgKi8KKworICBkY2FjaGVfZmx1c2ggKHJlbW90ZV9kY2FjaGUpOworCisgIGxhc3Rfc2VudF9zaWduYWwgPSBzaWdnbmFsOworICBsYXN0X3NlbnRfc3RlcCA9IHN0ZXA7CisKKyAgLyogQSBob29rIGZvciB3aGVuIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nIGF0IHRoZSBsYXN0IG1vbWVudCBiZWZvcmUKKyAgICAgcmVzdW1wdGlvbi4gICovCisgIGlmICh0YXJnZXRfcmVzdW1lX2hvb2spCisgICAgKCp0YXJnZXRfcmVzdW1lX2hvb2spICgpOworCisgIGlmIChzaWdnbmFsICE9IFRBUkdFVF9TSUdOQUxfMCkKKyAgICB7CisgICAgICBidWZbMF0gPSBzdGVwID8gJ1MnIDogJ0MnOworICAgICAgYnVmWzFdID0gdG9oZXggKCgoaW50KXNpZ2duYWwgPj4gNCkgJiAweGYpOworICAgICAgYnVmWzJdID0gdG9oZXggKChpbnQpc2lnZ25hbCAmIDB4Zik7CisgICAgICBidWZbM10gPSAnXDAnOworICAgIH0KKyAgZWxzZQorICAgIHN0cmNweSAoYnVmLCBzdGVwID8gInMiOiAiYyIpOworCisgIHB1dHBrdCAoYnVmKTsKK30KKwwKKy8qIFNlbmQgXkMgdG8gdGFyZ2V0IHRvIGhhbHQgaXQuICBUYXJnZXQgd2lsbCByZXNwb25kLCBhbmQgc2VuZCB1cyBhCisgICBwYWNrZXQuICAqLworCitzdGF0aWMgdm9pZCAoKm9mdW5jKSBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIHZvaWQKK3JlbW90ZV9pbnRlcnJ1cHQgKHNpZ25vKQorICAgICBpbnQgc2lnbm87Cit7CisgIHJlbW90ZV9zdG9wICgpOworICBzaWduYWwgKHNpZ25vLCByZW1vdGVfaW50ZXJydXB0KTsKK30KKyAgCitzdGF0aWMgdm9pZAorcmVtb3RlX3N0b3AgKCkKK3sKKyAgaWYgKCFpbnRlcnJ1cHRlZF9hbHJlYWR5KQorICAgIHsKKyAgICAgIC8qIFNlbmQgYSBicmVhayBvciBhIF5DLCBkZXBlbmRpbmcgb24gdXNlciBwcmVmZXJlbmNlLiAgKi8KKyAgICAgIGludGVycnVwdGVkX2FscmVhZHkgPSAxOworCisgICAgICBpZiAocmVtb3RlX2RlYnVnKQorICAgICAgICBwcmludGZfdW5maWx0ZXJlZCAoInJlbW90ZV9zdG9wIGNhbGxlZFxuIik7CisKKyAgICAgIGlmIChyZW1vdGVfYnJlYWspCisgICAgICAgIFNFUklBTF9TRU5EX0JSRUFLIChyZW1vdGVfZGVzYyk7CisgICAgICBlbHNlCisgICAgICAgIFNFUklBTF9XUklURSAocmVtb3RlX2Rlc2MsICJcMDAzIiwgMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2lnbmFsIChTSUdJTlQsIG9mdW5jKTsKKyAgICAgIGludGVycnVwdF9xdWVyeSAoKTsKKyAgICAgIHNpZ25hbCAoU0lHSU5ULCByZW1vdGVfaW50ZXJydXB0KTsKKyAgICAgIGludGVycnVwdGVkX2FscmVhZHkgPSAwOworICAgIH0KK30KKworLyogQXNrIHRoZSB1c2VyIHdoYXQgdG8gZG8gd2hlbiBhbiBpbnRlcnJ1cHQgaXMgcmVjZWl2ZWQuICAqLworCitzdGF0aWMgdm9pZAoraW50ZXJydXB0X3F1ZXJ5ICgpCit7CisgIHRhcmdldF90ZXJtaW5hbF9vdXJzICgpOworCisgIGlmIChxdWVyeSAoIkludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBwcm9ncmFtLlxuXAorR2l2ZSB1cCAoYW5kIHN0b3AgZGVidWdnaW5nIGl0KT8gIikpCisgICAgeworICAgICAgdGFyZ2V0X21vdXJuX2luZmVyaW9yICgpOworICAgICAgcmV0dXJuX3RvX3RvcF9sZXZlbCAoUkVUVVJOX1FVSVQpOworICAgIH0KKworICB0YXJnZXRfdGVybWluYWxfaW5mZXJpb3IgKCk7Cit9CisKKy8qIElmIG5vbnplcm8sIGlnbm9yZSB0aGUgbmV4dCBraWxsLiAgKi8KKworaW50IGtpbGxfa2x1ZGdlOworCit2b2lkCityZW1vdGVfY29uc29sZV9vdXRwdXQgKG1zZykKKyAgICAgY2hhciAqbXNnOworeworICBjaGFyICpwOworCisgIGZvciAocCA9IG1zZzsgKnA7IHAgKz0yKSAKKyAgICB7CisgICAgICBjaGFyIHRiWzJdOworICAgICAgY2hhciBjID0gZnJvbWhleCAocFswXSkgKiAxNiArIGZyb21oZXggKHBbMV0pOworICAgICAgdGJbMF0gPSBjOworICAgICAgdGJbMV0gPSAwOworICAgICAgaWYgKHRhcmdldF9vdXRwdXRfaG9vaykKKwl0YXJnZXRfb3V0cHV0X2hvb2sgKHRiKTsKKyAgICAgIGVsc2UgCisJZnB1dHNfZmlsdGVyZWQgKHRiLCBnZGJfc3Rkb3V0KTsKKyAgICB9Cit9CisKKy8qIFdhaXQgdW50aWwgdGhlIHJlbW90ZSBtYWNoaW5lIHN0b3BzLCB0aGVuIHJldHVybiwgc3RvcmluZyBzdGF0dXMgaW4KKyAgIFNUQVRVUyBqdXN0IGFzIGB3YWl0JyB3b3VsZC4gIFJldHVybnMgInBpZCIgKHRob3VnaCBpdCdzIG5vdCBjbGVhcgorICAgd2hhdCwgaWYgYW55dGhpbmcsIHRoYXQgbWVhbnMgaW4gdGhlIGNhc2Ugb2YgdGhpcyB0YXJnZXQpLiAgKi8KKworc3RhdGljIGludAorcmVtb3RlX3dhaXQgKHBpZCwgc3RhdHVzKQorICAgICBpbnQgcGlkOworICAgICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0YXR1czsKK3sKKyAgdW5zaWduZWQgY2hhciBidWZbUEJVRlNJWl07CisgIGludCB0aHJlYWRfbnVtID0gLTE7CisKKyAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0VYSVRFRDsKKyAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gMDsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyICpwOworCisgICAgICBpbnRlcnJ1cHRlZF9hbHJlYWR5ID0gMDsKKyAgICAgIG9mdW5jID0gc2lnbmFsIChTSUdJTlQsIHJlbW90ZV9pbnRlcnJ1cHQpOworICAgICAgZ2V0cGt0ICgoY2hhciAqKSBidWYsIDEpOworICAgICAgc2lnbmFsIChTSUdJTlQsIG9mdW5jKTsKKworICAgICAgLyogVGhpcyBpcyBhIGhvb2sgZm9yIHdoZW4gd2UgbmVlZCB0byBkbyBzb21ldGhpbmcgKHBlcmhhcHMgdGhlCisJIGNvbGxlY3Rpb24gb2YgdHJhY2UgZGF0YSkgZXZlcnkgdGltZSB0aGUgdGFyZ2V0IHN0b3BzLiAgKi8KKyAgICAgIGlmICh0YXJnZXRfd2FpdF9sb29wX2hvb2spCisJKCp0YXJnZXRfd2FpdF9sb29wX2hvb2spICgpOworCisgICAgICBzd2l0Y2ggKGJ1ZlswXSkKKwl7CisJY2FzZSAnRSc6CQkvKiBFcnJvciBvZiBzb21lIHNvcnQgKi8KKwkgIHdhcm5pbmcgKCJSZW1vdGUgZmFpbHVyZSByZXBseTogJXMiLCBidWYpOworCSAgY29udGludWU7CisJY2FzZSAnVCc6CQkvKiBTdGF0dXMgd2l0aCBQQywgU1AsIEZQLCAuLi4gKi8KKwkgIHsKKwkgICAgaW50IGk7CisJICAgIGxvbmcgcmVnbm87CisJICAgIGNoYXIgcmVnc1tNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworCisJICAgIC8qIEV4cGVkaXRlZCByZXBseSwgY29udGFpbmluZyBTaWduYWwsIHtyZWdubywgcmVnfSByZXBlYXQgKi8KKwkgICAgLyogIGZvcm1hdCBpczogICdUc3NuLi4uOnIuLi47bi4uLjpyLi4uO24uLi46ci4uLjsjY2MnLCB3aGVyZQorCQlzcyA9IHNpZ25hbCBudW1iZXIKKwkJbi4uLiA9IHJlZ2lzdGVyIG51bWJlcgorCQlyLi4uID0gcmVnaXN0ZXIgY29udGVudHMKKwkJKi8KKwkgICAgcCA9ICZidWZbM107CS8qIGFmdGVyIFR4eCAqLworCisJICAgIHdoaWxlICgqcCkKKwkgICAgICB7CisJCXVuc2lnbmVkIGNoYXIgKnAxOworCQljaGFyICpwX3RlbXA7CisKKwkJLyogUmVhZCB0aGUgcmVnaXN0ZXIgbnVtYmVyICovCisJCXJlZ25vID0gc3RydG9sICgoY29uc3QgY2hhciAqKSBwLCAmcF90ZW1wLCAxNik7CisJCXAxID0gKHVuc2lnbmVkIGNoYXIgKilwX3RlbXA7CisKKwkJaWYgKHAxID09IHApIC8qIE5vIHJlZ2lzdGVyIG51bWJlciBwcmVzZW50IGhlcmUgKi8KKwkJICB7CisJCSAgICBwMSA9ICh1bnNpZ25lZCBjaGFyICopIHN0cmNociAoKGNvbnN0IGNoYXIgKikgcCwgJzonKTsKKwkJICAgIGlmIChwMSA9PSBOVUxMKQorCQkgICAgICB3YXJuaW5nICgiTWFsZm9ybWVkIHBhY2tldChhKSAobWlzc2luZyBjb2xvbik6ICVzXG5cCitQYWNrZXQ6ICclcydcbiIsCisJCQkgICAgICAgcCwgYnVmKTsKKwkJICAgIGlmIChzdHJuY21wICgoY29uc3QgY2hhciAqKSBwLCAidGhyZWFkIiwgcDEgLSBwKSA9PSAwKQorCQkgICAgICB7CisJCQlwX3RlbXAgPSB1bnBhY2tfdmFybGVuX2hleCAoKytwMSwgJnRocmVhZF9udW0pOworCQkJcmVjb3JkX2N1cnJ0aHJlYWQgKHRocmVhZF9udW0pOworCQkJcCA9ICh1bnNpZ25lZCBjaGFyICopIHBfdGVtcDsKKwkJICAgICAgfQorCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIHAgPSBwMTsKKworCQkgICAgaWYgKCpwKysgIT0gJzonKQorCQkgICAgICB3YXJuaW5nICgiTWFsZm9ybWVkIHBhY2tldChiKSAobWlzc2luZyBjb2xvbik6ICVzXG5cCitQYWNrZXQ6ICclcydcbiIsCisJCQkgICAgICAgcCwgYnVmKTsKKworCQkgICAgaWYgKHJlZ25vID49IE5VTV9SRUdTKQorCQkgICAgICB3YXJuaW5nICgiUmVtb3RlIHNlbnQgYmFkIHJlZ2lzdGVyIG51bWJlciAlbGQ6ICVzXG5cCitQYWNrZXQ6ICclcydcbiIsCisJCQkgICAgICAgcmVnbm8sIHAsIGJ1Zik7CisKKwkJICAgIGZvciAoaSA9IDA7IGkgPCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pOyBpKyspCisJCSAgICAgIHsKKwkJCWlmIChwWzBdID09IDAgfHwgcFsxXSA9PSAwKQorCQkJICB3YXJuaW5nICgiUmVtb3RlIHJlcGx5IGlzIHRvbyBzaG9ydDogJXMiLCBidWYpOworCQkJcmVnc1tpXSA9IGZyb21oZXggKHBbMF0pICogMTYgKyBmcm9taGV4IChwWzFdKTsKKwkJCXAgKz0gMjsKKwkJICAgICAgfQorCQkgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgcmVncyk7CisJCSAgfQorCisJCWlmICgqcCsrICE9ICc7JykKKwkJICB7CisJCSAgICB3YXJuaW5nICgiUmVtb3RlIHJlZ2lzdGVyIGJhZGx5IGZvcm1hdHRlZDogJXMiLCBidWYpOworCQkgICAgd2FybmluZyAoIiAgICAgICAgICAgIGhlcmU6ICVzIixwKTsKKwkJICB9CisJICAgICAgfQorCSAgfQorCSAgLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAnUyc6CQkvKiBPbGQgc3R5bGUgc3RhdHVzLCBqdXN0IHNpZ25hbCBvbmx5ICovCisJICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKwkgIHN0YXR1cy0+dmFsdWUuc2lnID0gKGVudW0gdGFyZ2V0X3NpZ25hbCkKKwkgICAgKCgoZnJvbWhleCAoYnVmWzFdKSkgPDwgNCkgKyAoZnJvbWhleCAoYnVmWzJdKSkpOworCisJICBnb3RvIGdvdF9zdGF0dXM7CisJY2FzZSAnVyc6CQkvKiBUYXJnZXQgZXhpdGVkICovCisJICB7CisJICAgIC8qIFRoZSByZW1vdGUgcHJvY2VzcyBleGl0ZWQuICAqLworCSAgICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVEOworCSAgICBzdGF0dXMtPnZhbHVlLmludGVnZXIgPSAoZnJvbWhleCAoYnVmWzFdKSA8PCA0KSArIGZyb21oZXggKGJ1ZlsyXSk7CisJICAgIGdvdG8gZ290X3N0YXR1czsKKwkgIH0KKwljYXNlICdYJzoKKwkgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TSUdOQUxMRUQ7CisJICBzdGF0dXMtPnZhbHVlLnNpZyA9IChlbnVtIHRhcmdldF9zaWduYWwpCisJICAgICgoKGZyb21oZXggKGJ1ZlsxXSkpIDw8IDQpICsgKGZyb21oZXggKGJ1ZlsyXSkpKTsKKwkgIGtpbGxfa2x1ZGdlID0gMTsKKworCSAgZ290byBnb3Rfc3RhdHVzOworCWNhc2UgJ08nOgkJLyogQ29uc29sZSBvdXRwdXQgKi8KKwkgIHJlbW90ZV9jb25zb2xlX291dHB1dCAoYnVmICsgMSk7CisJICBjb250aW51ZTsKKwljYXNlICdcMCc6CisJICBpZiAobGFzdF9zZW50X3NpZ25hbCAhPSBUQVJHRVRfU0lHTkFMXzApCisJICAgIHsKKwkgICAgICAvKiBaZXJvIGxlbmd0aCByZXBseSBtZWFucyB0aGF0IHdlIHRyaWVkICdTJyBvciAnQycgYW5kCisJCSB0aGUgcmVtb3RlIHN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgaXQuICAqLworCSAgICAgIHRhcmdldF90ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgKCk7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkCisJCSgiQ2FuJ3Qgc2VuZCBzaWduYWxzIHRvIHRoaXMgcmVtb3RlIHN5c3RlbS4gICVzIG5vdCBzZW50LlxuIiwKKwkJIHRhcmdldF9zaWduYWxfdG9fbmFtZSAobGFzdF9zZW50X3NpZ25hbCkpOworCSAgICAgIGxhc3Rfc2VudF9zaWduYWwgPSBUQVJHRVRfU0lHTkFMXzA7CisJICAgICAgdGFyZ2V0X3Rlcm1pbmFsX2luZmVyaW9yICgpOworCisJICAgICAgc3RyY3B5ICgoY2hhciAqKSBidWYsIGxhc3Rfc2VudF9zdGVwID8gInMiIDogImMiKTsKKwkgICAgICBwdXRwa3QgKChjaGFyICopIGJ1Zik7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIC8qIGVsc2UgZmFsbHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCSAgd2FybmluZyAoIkludmFsaWQgcmVtb3RlIHJlcGx5OiAlcyIsIGJ1Zik7CisJICBjb250aW51ZTsKKwl9CisgICAgfQorIGdvdF9zdGF0dXM6CisgIGlmICh0aHJlYWRfbnVtICE9IC0xKQorICAgIHsKKyAgICAgIC8qIEluaXRpYWwgdGhyZWFkIHZhbHVlIGNhbiBvbmx5IGJlIGFjcXVpcmVkIHZpYSB3YWl0LCBzbyBkZWFsIHdpdGgKKwkgdGhpcyBtYXJrZXIgd2hpY2ggaXMgdXNlZCBiZWZvcmUgdGhlIGZpcnN0IHRocmVhZCB2YWx1ZSBpcworCSBhY3F1aXJlZC4gICovCisgICAgICBpZiAoaW5mZXJpb3JfcGlkID09IE1BR0lDX05VTExfUElEKQorCXsKKwkgIGluZmVyaW9yX3BpZCA9IHRocmVhZF9udW07CisJICBpZiAoIWluX3RocmVhZF9saXN0IChpbmZlcmlvcl9waWQpKQorCSAgICBhZGRfdGhyZWFkIChpbmZlcmlvcl9waWQpOworCX0KKyAgICAgIHJldHVybiB0aHJlYWRfbnVtOworICAgIH0KKyAgcmV0dXJuIGluZmVyaW9yX3BpZDsKK30KKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHJlZ2lzdGVycyB0aGlzIHN0dWIgaW1wbGVtZW50cy4gICovCisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfYnl0ZXNfZm91bmQ7CisKKy8qIFJlYWQgdGhlIHJlbW90ZSByZWdpc3RlcnMgaW50byB0aGUgYmxvY2sgUkVHUy4gICovCisvKiBDdXJyZW50bHkgd2UganVzdCByZWFkIGFsbCB0aGUgcmVnaXN0ZXJzLCBzbyB3ZSBkb24ndCB1c2UgcmVnbm8uICAqLworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3JlbW90ZV9mZXRjaF9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGNoYXIgYnVmW1BCVUZTSVpdOworICBpbnQgaTsKKyAgY2hhciAqcDsKKyAgY2hhciByZWdzW1JFR0lTVEVSX0JZVEVTXTsKKworICBzZXRfdGhyZWFkIChpbmZlcmlvcl9waWQsIDEpOworCisgIHNwcmludGYgKGJ1ZiwgImciKTsKKyAgcmVtb3RlX3NlbmQgKGJ1Zik7CisKKyAgaWYgKHJlbW90ZV9yZWdpc3Rlcl9idWZfc2l6ZSA9PSAwKQorICAgIHJlbW90ZV9yZWdpc3Rlcl9idWZfc2l6ZSA9IHN0cmxlbiAoYnVmKTsKKworICAvKiBVbmltcGxlbWVudGVkIHJlZ2lzdGVycyByZWFkIGFzIGFsbCBiaXRzIHplcm8uICAqLworICBtZW1zZXQgKHJlZ3MsIDAsIFJFR0lTVEVSX0JZVEVTKTsKKworICAvKiBXZSBjYW4gZ2V0IG91dCBvZiBzeW5jaCBpbiB2YXJpb3VzIGNhc2VzLiAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlcgorICAgICBpbiB0aGUgYnVmZmVyIGlzIG5vdCBhIGhleCBjaGFyYWN0ZXIsIGFzc3VtZSB0aGF0IGhhcyBoYXBwZW5lZAorICAgICBhbmQgdHJ5IHRvIGZldGNoIGFub3RoZXIgcGFja2V0IHRvIHJlYWQuICAqLworICB3aGlsZSAoKGJ1ZlswXSA8ICcwJyB8fCBidWZbMF0gPiAnOScpCisJICYmIChidWZbMF0gPCAnYScgfHwgYnVmWzBdID4gJ2YnKQorCSAmJiBidWZbMF0gIT0gJ3gnKQkvKiBOZXc6IHVuYXZhaWxhYmxlIHJlZ2lzdGVyIHZhbHVlICovCisgICAgeworICAgICAgaWYgKHJlbW90ZV9kZWJ1ZykKKwlwcmludGZfdW5maWx0ZXJlZCAoIkJhZCByZWdpc3RlciBwYWNrZXQ7IGZldGNoaW5nIGEgbmV3IHBhY2tldFxuIik7CisgICAgICBnZXRwa3QgKGJ1ZiwgMCk7CisgICAgfQorCisgIC8qIFJlcGx5IGRlc2NyaWJlcyByZWdpc3RlcnMgYnl0ZSBieSBieXRlLCBlYWNoIGJ5dGUgZW5jb2RlZCBhcyB0d28KKyAgICAgaGV4IGNoYXJhY3RlcnMuICBTdWNrIHRoZW0gYWxsIHVwLCB0aGVuIHN1cHBseSB0aGVtIHRvIHRoZQorICAgICByZWdpc3RlciBjYWNoZWluZy9zdG9yYWdlIG1lY2hhbmlzbS4gICovCisKKyAgcCA9IGJ1ZjsKKyAgZm9yIChpID0gMDsgaSA8IFJFR0lTVEVSX0JZVEVTOyBpKyspCisgICAgeworICAgICAgaWYgKHBbMF0gPT0gMCkKKwlicmVhazsKKyAgICAgIGlmIChwWzFdID09IDApCisJeworCSAgd2FybmluZyAoIlJlbW90ZSByZXBseSBpcyBvZiBvZGQgbGVuZ3RoOiAlcyIsIGJ1Zik7CisJICAvKiBEb24ndCBjaGFuZ2UgcmVnaXN0ZXJfYnl0ZXNfZm91bmQgaW4gdGhpcyBjYXNlLCBhbmQgZG9uJ3QKKwkgICAgIHByaW50IGEgc2Vjb25kIHdhcm5pbmcuICAqLworCSAgZ290byBzdXBwbHlfdGhlbTsKKwl9CisgICAgICBpZiAocFswXSA9PSAneCcgJiYgcFsxXSA9PSAneCcpCisJcmVnc1tpXSA9IDA7CS8qICd4JyAqLworICAgICAgZWxzZQorCXJlZ3NbaV0gPSBmcm9taGV4IChwWzBdKSAqIDE2ICsgZnJvbWhleCAocFsxXSk7CisgICAgICBwICs9IDI7CisgICAgfQorCisgIGlmIChpICE9IHJlZ2lzdGVyX2J5dGVzX2ZvdW5kKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyX2J5dGVzX2ZvdW5kID0gaTsKKyNpZmRlZiBSRUdJU1RFUl9CWVRFU19PSworICAgICAgaWYgKCFSRUdJU1RFUl9CWVRFU19PSyAoaSkpCisJd2FybmluZyAoIlJlbW90ZSByZXBseSBpcyB0b28gc2hvcnQ6ICVzIiwgYnVmKTsKKyNlbmRpZgorICAgIH0KKyAgCisgIHN1cHBseV90aGVtOgorICBmb3IgKGkgPSAwOyBpIDwgTlVNX1JFR1M7IGkrKykKKyAgeworICAgIHN1cHBseV9yZWdpc3RlciAoaSwgJnJlZ3NbUkVHSVNURVJfQllURShpKV0pOworICAgIGlmIChidWZbUkVHSVNURVJfQllURShpKSAqIDJdID09ICd4JykKKyAgICAgIHJlZ2lzdGVyX3ZhbGlkW2ldID0gLTE7CS8qIHJlZ2lzdGVyIHZhbHVlIG5vdCBhdmFpbGFibGUgKi8KKyAgfQorfQorCisvKiBQcmVwYXJlIHRvIHN0b3JlIHJlZ2lzdGVycy4gIFNpbmNlIHdlIG1heSBzZW5kIHRoZW0gYWxsICh1c2luZyBhCisgICAnRycgcmVxdWVzdCksIHdlIGhhdmUgdG8gcmVhZCBvdXQgdGhlIG9uZXMgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UKKyAgIGZpcnN0LiAgKi8KKworc3RhdGljIHZvaWQgCityZW1vdGVfcHJlcGFyZV90b19zdG9yZSAoKQoreworICAvKiBNYWtlIHN1cmUgdGhlIGVudGlyZSByZWdpc3RlcnMgYXJyYXkgaXMgdmFsaWQuICAqLworICByZWFkX3JlZ2lzdGVyX2J5dGVzICgwLCAoY2hhciAqKU5VTEwsIFJFR0lTVEVSX0JZVEVTKTsKK30KKworLyogU3RvcmUgcmVnaXN0ZXIgUkVHTk8sIG9yIGFsbCByZWdpc3RlcnMgaWYgUkVHTk8gPT0gLTEsIGZyb20gdGhlIGNvbnRlbnRzCisgICBvZiBSRUdJU1RFUlMuICBGSVhNRTogaWdub3JlcyBlcnJvcnMuICAqLworCitzdGF0aWMgdm9pZAorcmVtb3RlX3N0b3JlX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgY2hhciBidWZbUEJVRlNJWl07CisgIGludCBpOworICBjaGFyICpwOworCisgIHNldF90aHJlYWQgKGluZmVyaW9yX3BpZCwgMSk7CisKKyAgaWYgKHJlZ25vID49IDAgJiYgc3R1Yl9zdXBwb3J0c19QKQorICAgIHsKKyAgICAgIC8qIFRyeSBzdG9yaW5nIGEgc2luZ2xlIHJlZ2lzdGVyLiAgKi8KKyAgICAgIGNoYXIgKnJlZ3A7CisKKyAgICAgIHNwcmludGYgKGJ1ZiwgIlAleD0iLCByZWdubyk7CisgICAgICBwID0gYnVmICsgc3RybGVuIChidWYpOworICAgICAgcmVncCA9ICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnbm8pXTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbm8pOyArK2kpCisJeworCSAgKnArKyA9IHRvaGV4ICgocmVncFtpXSA+PiA0KSAmIDB4Zik7CisJICAqcCsrID0gdG9oZXggKHJlZ3BbaV0gJiAweGYpOworCX0KKyAgICAgICpwID0gJ1wwJzsKKyAgICAgIHJlbW90ZV9zZW5kIChidWYpOworICAgICAgaWYgKGJ1ZlswXSAhPSAnXDAnKQorCXsKKwkgIC8qIFRoZSBzdHViIHVuZGVyc3RhbmRzIHRoZSAnUCcgcmVxdWVzdC4gIFdlIGFyZSBkb25lLiAgKi8KKwkgIHJldHVybjsKKwl9CisKKyAgICAgIC8qIFRoZSBzdHViIGRvZXMgbm90IHN1cHBvcnQgdGhlICdQJyByZXF1ZXN0LiAgVXNlICdHJyBpbnN0ZWFkLAorCSBhbmQgZG9uJ3QgdHJ5IHVzaW5nICdQJyBpbiB0aGUgZnV0dXJlIChpdCB3aWxsIGp1c3Qgd2FzdGUgb3VyCisJIHRpbWUpLiAgKi8KKyAgICAgIHN0dWJfc3VwcG9ydHNfUCA9IDA7CisgICAgfQorCisgIGJ1ZlswXSA9ICdHJzsKKworICAvKiBDb21tYW5kIGRlc2NyaWJlcyByZWdpc3RlcnMgYnl0ZSBieSBieXRlLAorICAgICBlYWNoIGJ5dGUgZW5jb2RlZCBhcyB0d28gaGV4IGNoYXJhY3RlcnMuICAqLworCisgIHAgPSBidWYgKyAxOworICAvKiByZW1vdGVfcHJlcGFyZV90b19zdG9yZSBpbnN1cmVzIHRoYXQgcmVnaXN0ZXJfYnl0ZXNfZm91bmQgZ2V0cyBzZXQuICAqLworICBmb3IgKGkgPSAwOyBpIDwgcmVnaXN0ZXJfYnl0ZXNfZm91bmQ7IGkrKykKKyAgICB7CisgICAgICAqcCsrID0gdG9oZXggKChyZWdpc3RlcnNbaV0gPj4gNCkgJiAweGYpOworICAgICAgKnArKyA9IHRvaGV4IChyZWdpc3RlcnNbaV0gJiAweGYpOworICAgIH0KKyAgKnAgPSAnXDAnOworCisgIHJlbW90ZV9zZW5kIChidWYpOworfQorCisvKiBVc2Ugb2YgdGhlIGRhdGEgY2FjaGUgKnVzZWQqIHRvIGJlIGRpc2FibGVkIGJlY2F1c2UgaXQgbG9zZXMgZm9yIGxvb2tpbmcKKyAgIGF0IGFuZCBjaGFuZ2luZyBoYXJkd2FyZSBJL08gcG9ydHMgYW5kIHRoZSBsaWtlLiAgQWNjZXB0aW5nIGB2b2xhdGlsZScKKyAgIHdvdWxkIHBlcmhhcHMgYmUgb25lIHdheSB0byBmaXggaXQuICBBbm90aGVyIGlkZWEgd291bGQgYmUgdG8gdXNlIHRoZQorICAgZXhlY3V0YWJsZSBmaWxlIGZvciB0aGUgdGV4dCBzZWdtZW50IChmb3IgYWxsIFNFQ19DT0RFIHNlY3Rpb25zPworICAgRm9yIGFsbCBTRUNfUkVBRE9OTFkgc2VjdGlvbnM/KS4gIFRoaXMgaGFzIHByb2JsZW1zIGlmIHlvdSB3YW50IHRvCisgICBhY3R1YWxseSBzZWUgd2hhdCB0aGUgbWVtb3J5IGNvbnRhaW5zIChlLmcuIHNlbGYtbW9kaWZ5aW5nIGNvZGUsCisgICBjbG9iYmVyZWQgbWVtb3J5LCB1c2VyIGRvd25sb2FkZWQgdGhlIHdyb25nIHRoaW5nKS4gIAorCisgICBCZWNhdXNlIGl0IHNwZWVkcyBzbyBtdWNoIHVwLCBpdCdzIG5vdyBlbmFibGVkLCBpZiB5b3UncmUgcGxheWluZworICAgd2l0aCByZWdpc3RlcnMgeW91IHR1cm4gaXQgb2YgKHNldCByZW1vdGVjYWNoZSAwKS4gICovCisKKy8qIFJlYWQgYSB3b3JkIGZyb20gcmVtb3RlIGFkZHJlc3MgQUREUiBhbmQgcmV0dXJuIGl0LgorICAgVGhpcyBnb2VzIHRocm91Z2ggdGhlIGRhdGEgY2FjaGUuICAqLworCisjaWYgMAkvKiB1bnVzZWQ/ICovCitzdGF0aWMgaW50CityZW1vdGVfZmV0Y2hfd29yZCAoYWRkcikKKyAgICAgQ09SRV9BRERSIGFkZHI7Cit7CisgIHJldHVybiBkY2FjaGVfZmV0Y2ggKHJlbW90ZV9kY2FjaGUsIGFkZHIpOworfQorCisvKiBXcml0ZSBhIHdvcmQgV09SRCBpbnRvIHJlbW90ZSBhZGRyZXNzIEFERFIuCisgICBUaGlzIGdvZXMgdGhyb3VnaCB0aGUgZGF0YSBjYWNoZS4gICovCisKK3N0YXRpYyB2b2lkCityZW1vdGVfc3RvcmVfd29yZCAoYWRkciwgd29yZCkKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGludCB3b3JkOworeworICBkY2FjaGVfcG9rZSAocmVtb3RlX2RjYWNoZSwgYWRkciwgd29yZCk7Cit9CisjZW5kaWYJLyogMCAodW51c2VkPykgKi8KKworDAorCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBoZXggZGlnaXRzIGluIG51bS4gICovCisKK3N0YXRpYyBpbnQKK2hleG51bWxlbiAobnVtKQorICAgICBVTE9OR0VTVCBudW07Cit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IG51bSAhPSAwOyBpKyspCisgICAgbnVtID4+PSA0OworCisgIHJldHVybiBtYXggKGksIDEpOworfQorCisvKiBTZXQgQlVGIHRvIHRoZSBoZXggZGlnaXRzIHJlcHJlc2VudGluZyBOVU0uICAqLworCitzdGF0aWMgaW50CitoZXhudW1zdHIgKGJ1ZiwgbnVtKQorICAgICBjaGFyICpidWY7CisgICAgIFVMT05HRVNUIG51bTsKK3sKKyAgaW50IGk7CisgIGludCBsZW4gPSBoZXhudW1sZW4gKG51bSk7CisKKyAgYnVmW2xlbl0gPSAnXDAnOworCisgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIGJ1ZltpXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIiBbKG51bSAmIDB4ZildOworICAgICAgbnVtID4+PSA0OworICAgIH0KKworICByZXR1cm4gbGVuOworfQorCisvKiBNYXNrIGFsbCBidXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IFJFTU9URV9BRERSRVNTX1NJWkUgYml0cy4gKi8KKworc3RhdGljIENPUkVfQUREUgorcmVtb3RlX2FkZHJlc3NfbWFza2VkIChhZGRyKQorICAgICBDT1JFX0FERFIgYWRkcjsKK3sKKyAgaWYgKHJlbW90ZV9hZGRyZXNzX3NpemUgPiAwCisgICAgICAmJiByZW1vdGVfYWRkcmVzc19zaXplIDwgKHNpemVvZiAoVUxPTkdFU1QpICogOCkpCisgICAgeworICAgICAgLyogT25seSBjcmVhdGUgYSBtYXNrIHdoZW4gdGhhdCBtYXNrIGNhbiBzYWZlbHkgYmUgY29uc3RydWN0ZWQKKyAgICAgICAgIGluIGEgVUxPTkdFU1QgdmFyaWFibGUuICovCisgICAgICBVTE9OR0VTVCBtYXNrID0gMTsKKyAgICAgIG1hc2sgPSAobWFzayA8PCByZW1vdGVfYWRkcmVzc19zaXplKSAtIDE7CisgICAgICBhZGRyICY9IG1hc2s7CisgICAgfQorICByZXR1cm4gYWRkcjsKK30KKworLyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJlbW90ZSB0YXJnZXQgc3VwcG9ydHMgYmluYXJ5IGRvd25sb2FkaW5nLgorICAgVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgc2VuZGluZyBhIG5vLW9wIG1lbW9yeSB3cml0ZSBvZiB6ZXJvIGxlbmd0aAorICAgdG8gdGhlIHRhcmdldCBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuIEl0IGRvZXMgbm90IHN1ZmZpY2UgdG8gc2VuZAorICAgdGhlIHdob2xlIHBhY2tldCwgc2luY2UgbWFueSBzdHVicyBzdHJpcCB0aGUgZWlnaHRoIGJpdCBhbmQgc3Vic2VxdWVudGx5CisgICBjb21wdXRlIGEgd3JvbmcgY2hlY2tzdW0sIHdoaWNoIGNhdXNlcyByZWFsIGhhdm9jIHdpdGggcmVtb3RlX3dyaXRlX2J5dGVzLiAqLworc3RhdGljIHZvaWQKK2NoZWNrX2JpbmFyeV9kb3dubG9hZCAoYWRkcikKKyAgICAgQ09SRV9BRERSIGFkZHI7Cit7CisgIGlmIChyZW1vdGVfYmluYXJ5X2Rvd25sb2FkICYmICFyZW1vdGVfYmluYXJ5X2NoZWNrZWQpCisgICAgeworICAgICAgY2hhciBidWZbUEJVRlNJWl0sICpwOworICAgICAgcmVtb3RlX2JpbmFyeV9jaGVja2VkID0gMTsKKworICAgICAgcCA9IGJ1ZjsKKyAgICAgICpwKysgPSAnWCc7CisgICAgICBwICs9IGhleG51bXN0ciAocCwgKFVMT05HRVNUKSBhZGRyKTsKKyAgICAgICpwKysgPSAnLCc7CisgICAgICBwICs9IGhleG51bXN0ciAocCwgKFVMT05HRVNUKSAwKTsKKyAgICAgICpwKysgPSAnOic7CisgICAgICAqcCA9ICdcMCc7CisKKyAgICAgIHB1dHBrdF9iaW5hcnkgKGJ1ZiwgKGludCkgKHAgLSBidWYpKTsKKyAgICAgIGdldHBrdCAoYnVmLCAwKTsKKworICAgICAgaWYgKGJ1ZlswXSA9PSAnXDAnKQorCXJlbW90ZV9iaW5hcnlfZG93bmxvYWQgPSAwOworICAgIH0KKworICBpZiAocmVtb3RlX2RlYnVnKQorICAgIHsKKyAgICAgIGlmIChyZW1vdGVfYmluYXJ5X2Rvd25sb2FkKQorCXByaW50Zl91bmZpbHRlcmVkICgiYmluYXJ5IGRvd25sb2FkaW5nIHN1cHBwb3J0ZWQgYnkgdGFyZ2V0XG4iKTsKKyAgICAgIGVsc2UKKwlwcmludGZfdW5maWx0ZXJlZCAoImJpbmFyeSBkb3dubG9hZGluZyBOT1Qgc3VwcHBvcnRlZCBieSB0YXJnZXRcbiIpOworICAgIH0KK30KKworLyogV3JpdGUgbWVtb3J5IGRhdGEgZGlyZWN0bHkgdG8gdGhlIHJlbW90ZSBtYWNoaW5lLgorICAgVGhpcyBkb2VzIG5vdCBpbmZvcm0gdGhlIGRhdGEgY2FjaGU7IHRoZSBkYXRhIGNhY2hlIHVzZXMgdGhpcy4KKyAgIE1FTUFERFIgaXMgdGhlIGFkZHJlc3MgaW4gdGhlIHJlbW90ZSBtZW1vcnkgc3BhY2UuCisgICBNWUFERFIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBpbiBvdXIgc3BhY2UuCisgICBMRU4gaXMgdGhlIG51bWJlciBvZiBieXRlcy4KKworICAgUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQsIG9yIDAgZm9yIGVycm9yLiAgKi8KKworc3RhdGljIGludAorcmVtb3RlX3dyaXRlX2J5dGVzIChtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaW50IG1heF9idWZfc2l6ZTsJCS8qIE1heCBzaXplIG9mIHBhY2tldCBvdXRwdXQgYnVmZmVyICovCisgIGludCBvcmlnbGVuOworCisgIC8qIFZlcmlmeSB0aGF0IHRoZSB0YXJnZXQgY2FuIHN1cHBvcnQgYSBiaW5hcnkgZG93bmxvYWQgKi8KKyAgY2hlY2tfYmluYXJ5X2Rvd25sb2FkIChtZW1hZGRyKTsKKworICAvKiBDaG9wIHRoZSB0cmFuc2ZlciBkb3duIGlmIG5lY2Vzc2FyeSAqLworCisgIG1heF9idWZfc2l6ZSA9IG1pbiAocmVtb3RlX3dyaXRlX3NpemUsIFBCVUZTSVopOworICBpZiAocmVtb3RlX3JlZ2lzdGVyX2J1Zl9zaXplICE9IDApCisgICAgbWF4X2J1Zl9zaXplID0gbWluIChtYXhfYnVmX3NpemUsIHJlbW90ZV9yZWdpc3Rlcl9idWZfc2l6ZSk7CisKKyAgLyogU3VidHJhY3QgaGVhZGVyIG92ZXJoZWFkIGZyb20gbWF4IHBheWxvYWQgc2l6ZSAtICRNPG1lbWFkZHI+LDxsZW4+OiNubiAqLworICBtYXhfYnVmX3NpemUgLT0gMiArIGhleG51bWxlbiAobWVtYWRkciArIGxlbiAtIDEpICsgMSArIGhleG51bWxlbiAobGVuKSArIDQ7CisKKyAgb3JpZ2xlbiA9IGxlbjsKKyAgd2hpbGUgKGxlbiA+IDApCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciBidWZbUEJVRlNJWl07CisgICAgICB1bnNpZ25lZCBjaGFyICpwLCAqcGxlbjsKKyAgICAgIGludCB0b2RvOworICAgICAgaW50IGk7CisKKyAgICAgIC8qIGNvbnN0cnVjdCAiTSI8bWVtYWRkcj4iLCI8bGVuPiI6IiAqLworICAgICAgLyogc3ByaW50ZiAoYnVmLCAiTSVseCwleDoiLCAodW5zaWduZWQgbG9uZykgbWVtYWRkciwgdG9kbyk7ICovCisgICAgICBtZW1hZGRyID0gcmVtb3RlX2FkZHJlc3NfbWFza2VkIChtZW1hZGRyKTsKKyAgICAgIHAgPSBidWY7CisgICAgICBpZiAocmVtb3RlX2JpbmFyeV9kb3dubG9hZCkKKwl7CisJICAqcCsrID0gJ1gnOworCSAgdG9kbyA9IG1pbiAobGVuLCBtYXhfYnVmX3NpemUpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAqcCsrID0gJ00nOworCSAgdG9kbyA9IG1pbiAobGVuLCBtYXhfYnVmX3NpemUgLyAyKTsgLyogbnVtIGJ5dGVzIHRoYXQgd2lsbCBmaXQgKi8KKwl9CisKKyAgICAgIHAgKz0gaGV4bnVtc3RyIChwLCAoVUxPTkdFU1QpIG1lbWFkZHIpOworICAgICAgKnArKyA9ICcsJzsKKworICAgICAgcGxlbiA9IHA7CQkvKiByZW1lbWJlciB3aGVyZSBsZW4gZmllbGQgZ29lcyAqLworICAgICAgcCArPSBoZXhudW1zdHIgKHAsIChVTE9OR0VTVCkgdG9kbyk7CisgICAgICAqcCsrID0gJzonOworICAgICAgKnAgPSAnXDAnOworCisgICAgICAvKiBXZSBzZW5kIHRhcmdldCBzeXN0ZW0gdmFsdWVzIGJ5dGUgYnkgYnl0ZSwgaW4gaW5jcmVhc2luZyBieXRlCisJIGFkZHJlc3NlcywgZWFjaCBieXRlIGVuY29kZWQgYXMgdHdvIGhleCBjaGFyYWN0ZXJzIChvciBvbmUKKwkgYmluYXJ5IGNoYXJhY3RlcikuICAqLworICAgICAgaWYgKHJlbW90ZV9iaW5hcnlfZG93bmxvYWQpCisJeworICAgICAgICAgIGludCBlc2NhcGVkID0gMDsKKyAgICAgICAgICBmb3IgKGkgPSAwOyAKKwkgICAgICAgKGkgPCB0b2RvKSAmJiAoaSArIGVzY2FwZWQpIDwgKG1heF9idWZfc2l6ZSAtIDIpOworCSAgICAgICBpKyspIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzd2l0Y2ggKG15YWRkcltpXSAmIDB4ZmYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJyQnOgorICAgICAgICAgICAgICAgIGNhc2UgJyMnOgorICAgICAgICAgICAgICAgIGNhc2UgMHg3ZDoKKyAgICAgICAgICAgICAgICAgIC8qIFRoZXNlIG11c3QgYmUgZXNjYXBlZCAqLworICAgICAgICAgICAgICAgICAgZXNjYXBlZCsrOworICAgICAgICAgICAgICAgICAgKnArKyA9IDB4N2Q7CisgICAgICAgICAgICAgICAgICAqcCsrID0gKG15YWRkcltpXSAmIDB4ZmYpIF4gMHgyMDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAqcCsrID0gbXlhZGRyW2ldICYgMHhmZjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCSAgaWYgKGkgPCB0b2RvKQorCSAgICB7CisJICAgICAgLyogRXNjYXBlIGNoYXJzIGhhdmUgZmlsbGVkIHVwIHRoZSBidWZmZXIgcHJlbWF0dXJlbHksIAorCQkgYW5kIHdlIGhhdmUgYWN0dWFsbHkgc2VudCBmZXdlciBieXRlcyB0aGFuIHBsYW5uZWQuCisJCSBGaXgtdXAgdGhlIGxlbmd0aCBmaWVsZCBvZiB0aGUgcGFja2V0LiAgKi8KKworCSAgICAgIC8qIEZJWE1FOiB3aWxsIGZhaWwgaWYgbmV3IGxlbiBpcyBhIHNob3J0ZXIgc3RyaW5nIHRoYW4gCisJCSBvbGQgbGVuLiAgKi8KKworCSAgICAgIHBsZW4gKz0gaGV4bnVtc3RyIChwbGVuLCAoVUxPTkdFU1QpIGkpOworCSAgICAgICpwbGVuKysgPSAnOic7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgZm9yIChpID0gMDsgaSA8IHRvZG87IGkrKykKKwkgICAgeworCSAgICAgICpwKysgPSB0b2hleCAoKG15YWRkcltpXSA+PiA0KSAmIDB4Zik7CisJICAgICAgKnArKyA9IHRvaGV4IChteWFkZHJbaV0gJiAweGYpOworCSAgICB9CisJICAqcCA9ICdcMCc7CisJfQorCisgICAgICBwdXRwa3RfYmluYXJ5IChidWYsIChpbnQpIChwIC0gYnVmKSk7CisgICAgICBnZXRwa3QgKGJ1ZiwgMCk7CisKKyAgICAgIGlmIChidWZbMF0gPT0gJ0UnKQorCXsKKwkgIC8qIFRoZXJlIGlzIG5vIGNvcnJlc3BvbmRhbmNlIGJldHdlZW4gd2hhdCB0aGUgcmVtb3RlIHByb3RvY29sIHVzZXMKKwkgICAgIGZvciBlcnJvcnMgYW5kIGVycm5vIGNvZGVzLiAgV2Ugd291bGQgbGlrZSBhIGNsZWFuZXIgd2F5IG9mCisJICAgICByZXByZXNlbnRpbmcgZXJyb3JzIChiaWcgZW5vdWdoIHRvIGluY2x1ZGUgZXJybm8gY29kZXMsIGJmZF9lcnJvcgorCSAgICAgY29kZXMsIGFuZCBvdGhlcnMpLiAgQnV0IGZvciBub3cganVzdCByZXR1cm4gRUlPLiAgKi8KKwkgIGVycm5vID0gRUlPOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICAvKiBJbmNyZW1lbnQgYnkgaSwgbm90IGJ5IHRvZG8sIGluIGNhc2UgZXNjYXBlIGNoYXJzIAorCSBjYXVzZWQgdXMgdG8gc2VuZCBmZXdlciBieXRlcyB0aGFuIHdlJ2QgcGxhbm5lZC4gICovCisgICAgICBteWFkZHIgICs9IGk7CisgICAgICBtZW1hZGRyICs9IGk7CisgICAgICBsZW4gICAgIC09IGk7CisgICAgfQorICByZXR1cm4gb3JpZ2xlbjsKK30KKworLyogUmVhZCBtZW1vcnkgZGF0YSBkaXJlY3RseSBmcm9tIHRoZSByZW1vdGUgbWFjaGluZS4KKyAgIFRoaXMgZG9lcyBub3QgdXNlIHRoZSBkYXRhIGNhY2hlOyB0aGUgZGF0YSBjYWNoZSB1c2VzIHRoaXMuCisgICBNRU1BRERSIGlzIHRoZSBhZGRyZXNzIGluIHRoZSByZW1vdGUgbWVtb3J5IHNwYWNlLgorICAgTVlBRERSIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBidWZmZXIgaW4gb3VyIHNwYWNlLgorICAgTEVOIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMuCisKKyAgIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkLCBvciAwIGZvciBlcnJvci4gICovCisKK3N0YXRpYyBpbnQKK3JlbW90ZV9yZWFkX2J5dGVzIChtZW1hZGRyLCBteWFkZHIsIGxlbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaW50IG1heF9idWZfc2l6ZTsJCS8qIE1heCBzaXplIG9mIHBhY2tldCBvdXRwdXQgYnVmZmVyICovCisgIGludCBvcmlnbGVuOworCisgIC8qIENob3AgdGhlIHRyYW5zZmVyIGRvd24gaWYgbmVjZXNzYXJ5ICovCisKKyAgbWF4X2J1Zl9zaXplID0gbWluIChyZW1vdGVfd3JpdGVfc2l6ZSwgUEJVRlNJWik7CisgIGlmIChyZW1vdGVfcmVnaXN0ZXJfYnVmX3NpemUgIT0gMCkKKyAgICBtYXhfYnVmX3NpemUgPSBtaW4gKG1heF9idWZfc2l6ZSwgcmVtb3RlX3JlZ2lzdGVyX2J1Zl9zaXplKTsKKworICBvcmlnbGVuID0gbGVuOworICB3aGlsZSAobGVuID4gMCkKKyAgICB7CisgICAgICBjaGFyIGJ1ZltQQlVGU0laXTsKKyAgICAgIGNoYXIgKnA7CisgICAgICBpbnQgdG9kbzsKKyAgICAgIGludCBpOworCisgICAgICB0b2RvID0gbWluIChsZW4sIG1heF9idWZfc2l6ZSAvIDIpOyAvKiBudW0gYnl0ZXMgdGhhdCB3aWxsIGZpdCAqLworCisgICAgICAvKiBjb25zdHJ1Y3QgIm0iPG1lbWFkZHI+IiwiPGxlbj4iICovCisgICAgICAvKiBzcHJpbnRmIChidWYsICJtJWx4LCV4IiwgKHVuc2lnbmVkIGxvbmcpIG1lbWFkZHIsIHRvZG8pOyAqLworICAgICAgbWVtYWRkciA9IHJlbW90ZV9hZGRyZXNzX21hc2tlZCAobWVtYWRkcik7CisgICAgICBwID0gYnVmOworICAgICAgKnArKyA9ICdtJzsKKyAgICAgIHAgKz0gaGV4bnVtc3RyIChwLCAoVUxPTkdFU1QpIG1lbWFkZHIpOworICAgICAgKnArKyA9ICcsJzsKKyAgICAgIHAgKz0gaGV4bnVtc3RyIChwLCAoVUxPTkdFU1QpIHRvZG8pOworICAgICAgKnAgPSAnXDAnOworCisgICAgICBwdXRwa3QgKGJ1Zik7CisgICAgICBnZXRwa3QgKGJ1ZiwgMCk7CisKKyAgICAgIGlmIChidWZbMF0gPT0gJ0UnKQorCXsKKwkgIC8qIFRoZXJlIGlzIG5vIGNvcnJlc3BvbmRhbmNlIGJldHdlZW4gd2hhdCB0aGUgcmVtb3RlIHByb3RvY29sIHVzZXMKKwkgICAgIGZvciBlcnJvcnMgYW5kIGVycm5vIGNvZGVzLiAgV2Ugd291bGQgbGlrZSBhIGNsZWFuZXIgd2F5IG9mCisJICAgICByZXByZXNlbnRpbmcgZXJyb3JzIChiaWcgZW5vdWdoIHRvIGluY2x1ZGUgZXJybm8gY29kZXMsIGJmZF9lcnJvcgorCSAgICAgY29kZXMsIGFuZCBvdGhlcnMpLiAgQnV0IGZvciBub3cganVzdCByZXR1cm4gRUlPLiAgKi8KKwkgIGVycm5vID0gRUlPOworCSAgcmV0dXJuIDA7CisJfQorCisgIC8qIFJlcGx5IGRlc2NyaWJlcyBtZW1vcnkgYnl0ZSBieSBieXRlLAorICAgICBlYWNoIGJ5dGUgZW5jb2RlZCBhcyB0d28gaGV4IGNoYXJhY3RlcnMuICAqLworCisgICAgICBwID0gYnVmOworICAgICAgZm9yIChpID0gMDsgaSA8IHRvZG87IGkrKykKKwl7CisJICBpZiAocFswXSA9PSAwIHx8IHBbMV0gPT0gMCkKKwkgICAgLyogUmVwbHkgaXMgc2hvcnQuICBUaGlzIG1lYW5zIHRoYXQgd2Ugd2VyZSBhYmxlIHRvIHJlYWQKKwkgICAgICAgb25seSBwYXJ0IG9mIHdoYXQgd2Ugd2FudGVkIHRvLiAgKi8KKwkgICAgcmV0dXJuIGkgKyAob3JpZ2xlbiAtIGxlbik7CisJICBteWFkZHJbaV0gPSBmcm9taGV4IChwWzBdKSAqIDE2ICsgZnJvbWhleCAocFsxXSk7CisJICBwICs9IDI7CisJfQorICAgICAgbXlhZGRyICs9IHRvZG87CisgICAgICBtZW1hZGRyICs9IHRvZG87CisgICAgICBsZW4gLT0gdG9kbzsKKyAgICB9CisgIHJldHVybiBvcmlnbGVuOworfQorDAorLyogUmVhZCBvciB3cml0ZSBMRU4gYnl0ZXMgZnJvbSBpbmZlcmlvciBtZW1vcnkgYXQgTUVNQUREUiwKKyAgIHRyYW5zZmVycmluZyB0byBvciBmcm9tIGRlYnVnZ2VyIGFkZHJlc3MgTVlBRERSLiAgV3JpdGUgdG8gaW5mZXJpb3IKKyAgIGlmIFNIT1VMRF9XUklURSBpcyBub256ZXJvLiAgUmV0dXJucyBsZW5ndGggb2YgZGF0YSB3cml0dGVuIG9yCisgICByZWFkOyAwIGZvciBlcnJvci4gICovCisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgaW50CityZW1vdGVfeGZlcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuLCBzaG91bGRfd3JpdGUsIHRhcmdldCkKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IHNob3VsZF93cml0ZTsKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldDsJCQkvKiBpZ25vcmVkICovCit7CisjaWZkZWYgUkVNT1RFX1RSQU5TTEFURV9YRkVSX0FERFJFU1MKKyAgQ09SRV9BRERSIHRhcmdhZGRyOworICBpbnQgdGFyZ2xlbjsKKyAgUkVNT1RFX1RSQU5TTEFURV9YRkVSX0FERFJFU1MgKG1lbWFkZHIsIGxlbiwgdGFyZ2FkZHIsIHRhcmdsZW4pOworICBpZiAodGFyZ2xlbiA9PSAwKQorICAgIHJldHVybiAwOworICBtZW1hZGRyID0gdGFyZ2FkZHI7CisgIGxlbiA9IHRhcmdsZW47CisjZW5kaWYKKworICByZXR1cm4gZGNhY2hlX3hmZXJfbWVtb3J5IChyZW1vdGVfZGNhY2hlLCBtZW1hZGRyLCBteWFkZHIsCisJCQkgICAgIGxlbiwgc2hvdWxkX3dyaXRlKTsKK30KKworICAgCisjaWYgMAorLyogRW5hYmxlIGFmdGVyIDQuMTIuICAqLworCit2b2lkCityZW1vdGVfc2VhcmNoIChsZW4sIGRhdGEsIG1hc2ssIHN0YXJ0YWRkciwgaW5jcmVtZW50LCBsb3JhbmdlLCBoaXJhbmdlCisJICAgICAgIGFkZHJfZm91bmQsIGRhdGFfZm91bmQpCisgICAgIGludCBsZW47CisgICAgIGNoYXIgKmRhdGE7CisgICAgIGNoYXIgKm1hc2s7CisgICAgIENPUkVfQUREUiBzdGFydGFkZHI7CisgICAgIGludCBpbmNyZW1lbnQ7CisgICAgIENPUkVfQUREUiBsb3JhbmdlOworICAgICBDT1JFX0FERFIgaGlyYW5nZTsKKyAgICAgQ09SRV9BRERSICphZGRyX2ZvdW5kOworICAgICBjaGFyICpkYXRhX2ZvdW5kOworeworICBpZiAoaW5jcmVtZW50ID09IC00ICYmIGxlbiA9PSA0KQorICAgIHsKKyAgICAgIGxvbmcgbWFza19sb25nLCBkYXRhX2xvbmc7CisgICAgICBsb25nIGRhdGFfZm91bmRfbG9uZzsKKyAgICAgIENPUkVfQUREUiBhZGRyX3dlX2ZvdW5kOworICAgICAgY2hhciBidWZbUEJVRlNJWl07CisgICAgICBsb25nIHJldHVybmVkX2xvbmdbMl07CisgICAgICBjaGFyICpwOworCisgICAgICBtYXNrX2xvbmcgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKG1hc2ssIGxlbik7CisgICAgICBkYXRhX2xvbmcgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGRhdGEsIGxlbik7CisgICAgICBzcHJpbnRmIChidWYsICJ0JXg6JXgsJXgiLCBzdGFydGFkZHIsIGRhdGFfbG9uZywgbWFza19sb25nKTsKKyAgICAgIHB1dHBrdCAoYnVmKTsKKyAgICAgIGdldHBrdCAoYnVmLCAwKTsKKyAgICAgIGlmIChidWZbMF0gPT0gJ1wwJykKKwl7CisJICAvKiBUaGUgc3R1YiBkb2Vzbid0IHN1cHBvcnQgdGhlICd0JyByZXF1ZXN0LiAgV2UgbWlnaHQgd2FudCB0bworCSAgICAgcmVtZW1iZXIgdGhpcyBmYWN0LCBidXQgb24gdGhlIG90aGVyIGhhbmQgdGhlIHN0dWIgY291bGQgYmUKKwkgICAgIHN3aXRjaGVkIG9uIHVzLiAgTWF5YmUgd2Ugc2hvdWxkIHJlbWVtYmVyIGl0IG9ubHkgdW50aWwKKwkgICAgIHRoZSBuZXh0ICJ0YXJnZXQgcmVtb3RlIi4gICovCisJICBnZW5lcmljX3NlYXJjaCAobGVuLCBkYXRhLCBtYXNrLCBzdGFydGFkZHIsIGluY3JlbWVudCwgbG9yYW5nZSwKKwkJCSAgaGlyYW5nZSwgYWRkcl9mb3VuZCwgZGF0YV9mb3VuZCk7CisJICByZXR1cm47CisJfQorCisgICAgICBpZiAoYnVmWzBdID09ICdFJykKKwkvKiBUaGVyZSBpcyBubyBjb3JyZXNwb25kYW5jZSBiZXR3ZWVuIHdoYXQgdGhlIHJlbW90ZSBwcm90b2NvbCB1c2VzCisJICAgZm9yIGVycm9ycyBhbmQgZXJybm8gY29kZXMuICBXZSB3b3VsZCBsaWtlIGEgY2xlYW5lciB3YXkgb2YKKwkgICByZXByZXNlbnRpbmcgZXJyb3JzIChiaWcgZW5vdWdoIHRvIGluY2x1ZGUgZXJybm8gY29kZXMsIGJmZF9lcnJvcgorCSAgIGNvZGVzLCBhbmQgb3RoZXJzKS4gIEJ1dCBmb3Igbm93IGp1c3QgdXNlIEVJTy4gICovCisJbWVtb3J5X2Vycm9yIChFSU8sIHN0YXJ0YWRkcik7CisgICAgICBwID0gYnVmOworICAgICAgYWRkcl93ZV9mb3VuZCA9IDA7CisgICAgICB3aGlsZSAoKnAgIT0gJ1wwJyAmJiAqcCAhPSAnLCcpCisJYWRkcl93ZV9mb3VuZCA9IChhZGRyX3dlX2ZvdW5kIDw8IDQpICsgZnJvbWhleCAoKnArKyk7CisgICAgICBpZiAoKnAgPT0gJ1wwJykKKwllcnJvciAoIlByb3RvY29sIGVycm9yOiBzaG9ydCByZXR1cm4gZm9yIHNlYXJjaCIpOworCisgICAgICBkYXRhX2ZvdW5kX2xvbmcgPSAwOworICAgICAgd2hpbGUgKCpwICE9ICdcMCcgJiYgKnAgIT0gJywnKQorCWRhdGFfZm91bmRfbG9uZyA9IChkYXRhX2ZvdW5kX2xvbmcgPDwgNCkgKyBmcm9taGV4ICgqcCsrKTsKKyAgICAgIC8qIElnbm9yZSBhbnl0aGluZyBhZnRlciB0aGlzIGNvbW1hLCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMuICAqLworCisgICAgICBpZiAoYWRkcl93ZV9mb3VuZCA8IGxvcmFuZ2UgfHwgYWRkcl93ZV9mb3VuZCA+PSBoaXJhbmdlKQorCXsKKwkgICphZGRyX2ZvdW5kID0gMDsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgICphZGRyX2ZvdW5kID0gYWRkcl93ZV9mb3VuZDsKKyAgICAgICpkYXRhX2ZvdW5kID0gc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoZGF0YV93ZV9mb3VuZCwgbGVuKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGdlbmVyaWNfc2VhcmNoIChsZW4sIGRhdGEsIG1hc2ssIHN0YXJ0YWRkciwgaW5jcmVtZW50LCBsb3JhbmdlLAorCQkgIGhpcmFuZ2UsIGFkZHJfZm91bmQsIGRhdGFfZm91bmQpOworfQorI2VuZGlmIC8qIDAgKi8KKwwKK3N0YXRpYyB2b2lkCityZW1vdGVfZmlsZXNfaW5mbyAoaWdub3JlKQorICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqaWdub3JlOworeworICBwdXRzX2ZpbHRlcmVkICgiRGVidWdnaW5nIGEgdGFyZ2V0IG92ZXIgYSBzZXJpYWwgbGluZS5cbiIpOworfQorDAorLyogU3R1ZmYgZm9yIGRlYWxpbmcgd2l0aCB0aGUgcGFja2V0cyB3aGljaCBhcmUgcGFydCBvZiB0aGlzIHByb3RvY29sLgorICAgU2VlIGNvbW1lbnQgYXQgdG9wIG9mIGZpbGUgZm9yIGRldGFpbHMuICAqLworCisvKiBSZWFkIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIHRoZSByZW1vdGUgZW5kLCBtYXNraW5nIGl0IGRvd24gdG8gNyBiaXRzLiAqLworCitzdGF0aWMgaW50CityZWFkY2hhciAodGltZW91dCkKKyAgICAgaW50IHRpbWVvdXQ7Cit7CisgIGludCBjaDsKKworICBjaCA9IFNFUklBTF9SRUFEQ0hBUiAocmVtb3RlX2Rlc2MsIHRpbWVvdXQpOworCisgIHN3aXRjaCAoY2gpCisgICAgeworICAgIGNhc2UgU0VSSUFMX0VPRjoKKyAgICAgIGVycm9yICgiUmVtb3RlIGNvbm5lY3Rpb24gY2xvc2VkIik7CisgICAgY2FzZSBTRVJJQUxfRVJST1I6CisgICAgICBwZXJyb3Jfd2l0aF9uYW1lICgiUmVtb3RlIGNvbW11bmljYXRpb24gZXJyb3IiKTsKKyAgICBjYXNlIFNFUklBTF9USU1FT1VUOgorICAgICAgcmV0dXJuIGNoOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gY2ggJiAweDdmOworICAgIH0KK30KKworLyogU2VuZCB0aGUgY29tbWFuZCBpbiBCVUYgdG8gdGhlIHJlbW90ZSBtYWNoaW5lLCBhbmQgcmVhZCB0aGUgcmVwbHkKKyAgIGludG8gQlVGLiAgUmVwb3J0IGFuIGVycm9yIGlmIHdlIGdldCBhbiBlcnJvciByZXBseS4gICovCisKK3N0YXRpYyB2b2lkCityZW1vdGVfc2VuZCAoYnVmKQorICAgICBjaGFyICpidWY7Cit7CisgIHB1dHBrdCAoYnVmKTsKKyAgZ2V0cGt0IChidWYsIDApOworCisgIGlmIChidWZbMF0gPT0gJ0UnKQorICAgIGVycm9yICgiUmVtb3RlIGZhaWx1cmUgcmVwbHk6ICVzIiwgYnVmKTsKK30KKworLyogRGlzcGxheSBhIG51bGwtdGVybWluYXRlZCBwYWNrZXQgb24gc3Rkb3V0LCBmb3IgZGVidWdnaW5nLCB1c2luZyBDCisgICBzdHJpbmcgbm90YXRpb24uICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfcGFja2V0IChidWYpCisgICAgIGNoYXIgKmJ1ZjsKK3sKKyAgcHV0c19maWx0ZXJlZCAoIlwiIik7CisgIHdoaWxlICgqYnVmKQorICAgIGdkYl9wcmludGNoYXIgKCpidWYrKywgZ2RiX3N0ZG91dCwgJyInKTsKKyAgcHV0c19maWx0ZXJlZCAoIlwiIik7Cit9CisKK2ludAorcHV0cGt0IChidWYpCisgICAgIGNoYXIgKmJ1ZjsKK3sKKyAgcmV0dXJuIHB1dHBrdF9iaW5hcnkgKGJ1Ziwgc3RybGVuIChidWYpKTsKK30KKworLyogU2VuZCBhIHBhY2tldCB0byB0aGUgcmVtb3RlIG1hY2hpbmUsIHdpdGggZXJyb3IgY2hlY2tpbmcuICBUaGUgZGF0YQorICAgb2YgdGhlIHBhY2tldCBpcyBpbiBCVUYuICBUaGUgc3RyaW5nIGluIEJVRiBjYW4gYmUgYXQgbW9zdCAgUEJVRlNJWiAtIDUKKyAgIHRvIGFjY291bnQgZm9yIHRoZSAkLCAjIGFuZCBjaGVja3N1bSwgYW5kIGZvciBhIHBvc3NpYmxlIC8wIGlmIHdlIGFyZQorICAgZGVidWdnaW5nIChyZW1vdGVfZGVidWcpIGFuZCB3YW50IHRvIHByaW50IHRoZSBzZW50IHBhY2tldCBhcyBhIHN0cmluZyAqLworCitzdGF0aWMgaW50CitwdXRwa3RfYmluYXJ5IChidWYsIGNudCkKKyAgICAgY2hhciAqYnVmOworICAgICBpbnQgY250OworeworICBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciBjc3VtID0gMDsKKyAgY2hhciBidWYyW1BCVUZTSVpdOworICBpbnQgY2g7CisgIGludCB0Y291bnQgPSAwOworICBjaGFyICpwOworCisgIC8qIENvcHkgdGhlIHBhY2tldCBpbnRvIGJ1ZmZlciBCVUYyLCBlbmNhcHN1bGF0aW5nIGl0CisgICAgIGFuZCBnaXZpbmcgaXQgYSBjaGVja3N1bS4gICovCisKKyAgaWYgKGNudCA+IChpbnQpIHNpemVvZiAoYnVmMikgLSA1KQkJLyogUHJvc2FuaXR5IGNoZWNrICovCisgICAgYWJvcnQgKCk7CisKKyAgcCA9IGJ1ZjI7CisgICpwKysgPSAnJCc7CisKKyAgZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKQorICAgIHsKKyAgICAgIGNzdW0gKz0gYnVmW2ldOworICAgICAgKnArKyA9IGJ1ZltpXTsKKyAgICB9CisgICpwKysgPSAnIyc7CisgICpwKysgPSB0b2hleCAoKGNzdW0gPj4gNCkgJiAweGYpOworICAqcCsrID0gdG9oZXggKGNzdW0gJiAweGYpOworCisgIC8qIFNlbmQgaXQgb3ZlciBhbmQgb3ZlciB1bnRpbCB3ZSBnZXQgYSBwb3NpdGl2ZSBhY2suICAqLworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGludCBzdGFydGVkX2Vycm9yX291dHB1dCA9IDA7CisKKyAgICAgIGlmIChyZW1vdGVfZGVidWcpCisJeworCSAgKnAgPSAnXDAnOworCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCJTZW5kaW5nIHBhY2tldDogJXMuLi4iLCBidWYyKTsKKwkgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisJfQorICAgICAgaWYgKFNFUklBTF9XUklURSAocmVtb3RlX2Rlc2MsIGJ1ZjIsIHAgLSBidWYyKSkKKwlwZXJyb3Jfd2l0aF9uYW1lICgicHV0cGt0OiB3cml0ZSBmYWlsZWQiKTsKKworICAgICAgLyogcmVhZCB1bnRpbCBlaXRoZXIgYSB0aW1lb3V0IG9jY3VycyAoLTIpIG9yICcrJyBpcyByZWFkICovCisgICAgICB3aGlsZSAoMSkKKwl7CisJICBjaCA9IHJlYWRjaGFyIChyZW1vdGVfdGltZW91dCk7CisKKyAJICBpZiAocmVtb3RlX2RlYnVnKQorCSAgICB7CisJICAgICAgc3dpdGNoIChjaCkKKwkJeworCQljYXNlICcrJzoKKwkJY2FzZSBTRVJJQUxfVElNRU9VVDoKKwkJY2FzZSAnJCc6CisJCSAgaWYgKHN0YXJ0ZWRfZXJyb3Jfb3V0cHV0KQorCQkgICAgeworCQkgICAgICBwdXRjaGFyX3VuZmlsdGVyZWQgKCdcbicpOworCQkgICAgICBzdGFydGVkX2Vycm9yX291dHB1dCA9IDA7CisJCSAgICB9CisJCX0KKwkgICAgfQorCisJICBzd2l0Y2ggKGNoKQorCSAgICB7CisJICAgIGNhc2UgJysnOgorCSAgICAgIGlmIChyZW1vdGVfZGVidWcpCisJCXByaW50Zl91bmZpbHRlcmVkICgiQWNrXG4iKTsKKwkgICAgICByZXR1cm4gMTsKKwkgICAgY2FzZSBTRVJJQUxfVElNRU9VVDoKKwkgICAgICB0Y291bnQgKys7CisJICAgICAgaWYgKHRjb3VudCA+IDMpCisJCXJldHVybiAwOworCSAgICAgIGJyZWFrOwkJLyogUmV0cmFuc21pdCBidWZmZXIgKi8KKwkgICAgY2FzZSAnJCc6CisJICAgICAgeworCQljaGFyIGp1bmtidWZbUEJVRlNJWl07CisKKwkgICAgICAvKiBJdCdzIHByb2JhYmx5IGFuIG9sZCByZXNwb25zZSwgYW5kIHdlJ3JlIG91dCBvZiBzeW5jLgorCQkgSnVzdCBnb2JibGUgdXAgdGhlIHBhY2tldCBhbmQgaWdub3JlIGl0LiAgKi8KKwkJZ2V0cGt0IChqdW5rYnVmLCAwKTsKKwkJY29udGludWU7CQkvKiBOb3csIGdvIGxvb2sgZm9yICsgKi8KKwkgICAgICB9CisJICAgIGRlZmF1bHQ6CisJICAgICAgaWYgKHJlbW90ZV9kZWJ1ZykKKwkJeworCQkgIGlmICghc3RhcnRlZF9lcnJvcl9vdXRwdXQpCisJCSAgICB7CisJCSAgICAgIHN0YXJ0ZWRfZXJyb3Jfb3V0cHV0ID0gMTsKKwkJICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJwdXRwa3Q6IEp1bms6ICIpOworCQkgICAgfQorCQkgIHB1dGNoYXJfdW5maWx0ZXJlZCAoY2ggJiAwMTc3KTsKKwkJfQorCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICBicmVhazsJCS8qIEhlcmUgdG8gcmV0cmFuc21pdCAqLworCX0KKworI2lmIDAKKyAgICAgIC8qIFRoaXMgaXMgd3JvbmcuICBJZiBkb2luZyBhIGxvbmcgYmFja3RyYWNlLCB0aGUgdXNlciBzaG91bGQgYmUKKwkgYWJsZSB0byBnZXQgb3V0IG5leHQgdGltZSB3ZSBjYWxsIFFVSVQsIHdpdGhvdXQgYW55dGhpbmcgYXMKKwkgdmlvbGVudCBhcyBpbnRlcnJ1cHRfcXVlcnkuICBJZiB3ZSB3YW50IHRvIHByb3ZpZGUgYSB3YXkgb3V0IG9mCisJIGhlcmUgd2l0aG91dCBnZXR0aW5nIHRvIHRoZSBuZXh0IFFVSVQsIGl0IHNob3VsZCBiZSBiYXNlZCBvbgorCSBoaXR0aW5nIF5DIHR3aWNlIGFzIGluIHJlbW90ZV93YWl0LiAgKi8KKyAgICAgIGlmIChxdWl0X2ZsYWcpCisJeworCSAgcXVpdF9mbGFnID0gMDsKKwkgIGludGVycnVwdF9xdWVyeSAoKTsKKwl9CisjZW5kaWYKKyAgICB9Cit9CisKKy8qIENvbWUgaGVyZSBhZnRlciBmaW5kaW5nIHRoZSBzdGFydCBvZiB0aGUgZnJhbWUuICBDb2xsZWN0IHRoZSByZXN0CisgICBpbnRvIEJVRiwgdmVyaWZ5aW5nIHRoZSBjaGVja3N1bSwgbGVuZ3RoLCBhbmQgaGFuZGxpbmcgcnVuLWxlbmd0aAorICAgY29tcHJlc3Npb24uICBSZXR1cm5zIDAgb24gYW55IGVycm9yLCAxIG9uIHN1Y2Nlc3MuICAqLworCitzdGF0aWMgaW50CityZWFkX2ZyYW1lIChidWYpCisgICAgIGNoYXIgKmJ1ZjsKK3sKKyAgdW5zaWduZWQgY2hhciBjc3VtOworICBjaGFyICpicDsKKyAgaW50IGM7CisKKyAgY3N1bSA9IDA7CisgIGJwID0gYnVmOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGMgPSByZWFkY2hhciAocmVtb3RlX3RpbWVvdXQpOworCisgICAgICBzd2l0Y2ggKGMpCisJeworCWNhc2UgU0VSSUFMX1RJTUVPVVQ6CisJICBpZiAocmVtb3RlX2RlYnVnKQorCSAgICBwdXRzX2ZpbHRlcmVkICgiVGltZW91dCBpbiBtaWQtcGFja2V0LCByZXRyeWluZ1xuIik7CisJICByZXR1cm4gMDsKKwljYXNlICckJzoKKwkgIGlmIChyZW1vdGVfZGVidWcpCisJICAgIHB1dHNfZmlsdGVyZWQgKCJTYXcgbmV3IHBhY2tldCBzdGFydCBpbiBtaWRkbGUgb2Ygb2xkIG9uZVxuIik7CisJICByZXR1cm4gMDsJCS8qIFN0YXJ0IGEgbmV3IHBhY2tldCwgY291bnQgcmV0cmllcyAqLworCWNhc2UgJyMnOgorCSAgeworCSAgICB1bnNpZ25lZCBjaGFyIHBrdGNzdW07CisKKwkgICAgKmJwID0gJ1wwMDAnOworCisJICAgIHBrdGNzdW0gPSBmcm9taGV4IChyZWFkY2hhciAocmVtb3RlX3RpbWVvdXQpKSA8PCA0OworCSAgICBwa3Rjc3VtIHw9IGZyb21oZXggKHJlYWRjaGFyIChyZW1vdGVfdGltZW91dCkpOworCisJICAgIGlmIChjc3VtID09IHBrdGNzdW0pCisJICAgICAgcmV0dXJuIDE7CisKKwkgICAgaWYgKHJlbW90ZV9kZWJ1ZykgCisJICAgICAgeworCQlwcmludGZfZmlsdGVyZWQgKCJCYWQgY2hlY2tzdW0sIHNlbnRzdW09MHgleCwgY3N1bT0weCV4LCBidWY9IiwKKwkJCQkgcGt0Y3N1bSwgY3N1bSk7CisJCXB1dHNfZmlsdGVyZWQgKGJ1Zik7CisJCXB1dHNfZmlsdGVyZWQgKCJcbiIpOworCSAgICAgIH0KKwkgICAgcmV0dXJuIDA7CisJICB9CisJY2FzZSAnKic6CQkvKiBSdW4gbGVuZ3RoIGVuY29kaW5nICovCisJICBjc3VtICs9IGM7CisJICBjID0gcmVhZGNoYXIgKHJlbW90ZV90aW1lb3V0KTsKKwkgIGNzdW0gKz0gYzsKKwkgIGMgPSBjIC0gJyAnICsgMzsJLyogQ29tcHV0ZSByZXBlYXQgY291bnQgKi8KKworCisJICBpZiAoYyA+IDAgJiYgYyA8IDI1NSAmJiBicCArIGMgLSAxIDwgYnVmICsgUEJVRlNJWiAtIDEpCisJICAgIHsKKwkgICAgICBtZW1zZXQgKGJwLCAqKGJwIC0gMSksIGMpOworCSAgICAgIGJwICs9IGM7CisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgKmJwID0gJ1wwJzsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlJlcGVhdCBjb3VudCAlZCB0b28gbGFyZ2UgZm9yIGJ1ZmZlcjogIiwgYyk7CisJICBwdXRzX2ZpbHRlcmVkIChidWYpOworCSAgcHV0c19maWx0ZXJlZCAoIlxuIik7CisJICByZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJICBpZiAoYnAgPCBidWYgKyBQQlVGU0laIC0gMSkKKwkgICAgeworCSAgICAgICpicCsrID0gYzsKKwkgICAgICBjc3VtICs9IGM7CisJICAgICAgY29udGludWU7CisJICAgIH0KKworCSAgKmJwID0gJ1wwJzsKKwkgIHB1dHNfZmlsdGVyZWQgKCJSZW1vdGUgcGFja2V0IHRvbyBsb25nOiAiKTsKKwkgIHB1dHNfZmlsdGVyZWQgKGJ1Zik7CisJICBwdXRzX2ZpbHRlcmVkICgiXG4iKTsKKworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KK30KKworLyogUmVhZCBhIHBhY2tldCBmcm9tIHRoZSByZW1vdGUgbWFjaGluZSwgd2l0aCBlcnJvciBjaGVja2luZywgYW5kCisgICBzdG9yZSBpdCBpbiBCVUYuICBCVUYgaXMgZXhwZWN0ZWQgdG8gYmUgb2Ygc2l6ZSBQQlVGU0laLiAgSWYKKyAgIEZPUkVWRVIsIHdhaXQgZm9yZXZlciByYXRoZXIgdGhhbiB0aW1pbmcgb3V0OyB0aGlzIGlzIHVzZWQgd2hpbGUKKyAgIHRoZSB0YXJnZXQgaXMgZXhlY3V0aW5nIHVzZXIgY29kZS4gICovCisKK3ZvaWQKK2dldHBrdCAoYnVmLCBmb3JldmVyKQorICAgICBjaGFyICpidWY7CisgICAgIGludCBmb3JldmVyOworeworICBpbnQgYzsKKyAgaW50IHRyaWVzOworICBpbnQgdGltZW91dDsKKyAgaW50IHZhbDsKKworICBzdHJjcHkgKGJ1ZiwidGltZW91dCIpOworCisgIGlmIChmb3JldmVyKQorICAgIHsKKyNpZmRlZiBNQUlOVEVOQU5DRV9DTURTCisgICAgICB0aW1lb3V0ID0gd2F0Y2hkb2cgPiAwID8gd2F0Y2hkb2cgOiAtMTsKKyNlbHNlCisgICAgICB0aW1lb3V0ID0gLTE7CisjZW5kaWYKKyAgICB9CisKKyAgZWxzZQorICAgIHRpbWVvdXQgPSByZW1vdGVfdGltZW91dDsKKworI2RlZmluZSBNQVhfVFJJRVMgMworCisgIGZvciAodHJpZXMgPSAxOyB0cmllcyA8PSBNQVhfVFJJRVM7IHRyaWVzKyspCisgICAgeworICAgICAgLyogVGhpcyBjYW4gbG9vcCBmb3JldmVyIGlmIHRoZSByZW1vdGUgc2lkZSBzZW5kcyB1cyBjaGFyYWN0ZXJzCisJIGNvbnRpbnVvdXNseSwgYnV0IGlmIGl0IHBhdXNlcywgd2UnbGwgZ2V0IGEgemVybyBmcm9tIHJlYWRjaGFyCisJIGJlY2F1c2Ugb2YgdGltZW91dC4gIFRoZW4gd2UnbGwgY291bnQgdGhhdCBhcyBhIHJldHJ5LiAgKi8KKworICAgICAgLyogTm90ZSB0aGF0IHdlIHdpbGwgb25seSB3YWl0IGZvcmV2ZXIgcHJpb3IgdG8gdGhlIHN0YXJ0IG9mIGEgcGFja2V0LgorCSBBZnRlciB0aGF0LCB3ZSBleHBlY3QgY2hhcmFjdGVycyB0byBhcnJpdmUgYXQgYSBicmlzayBwYWNlLiAgVGhleQorCSBzaG91bGQgc2hvdyB1cCB3aXRoaW4gcmVtb3RlX3RpbWVvdXQgaW50ZXJ2YWxzLiAgKi8KKworICAgICAgZG8KKwl7CisJICBjID0gcmVhZGNoYXIgKHRpbWVvdXQpOworCisJICBpZiAoYyA9PSBTRVJJQUxfVElNRU9VVCkKKwkgICAgeworI2lmZGVmIE1BSU5URU5BTkNFX0NNRFMKKwkgICAgICBpZiAoZm9yZXZlcikJLyogV2F0Y2hkb2cgd2VudCBvZmYuICBLaWxsIHRoZSB0YXJnZXQuICovCisJCXsKKwkJICB0YXJnZXRfbW91cm5faW5mZXJpb3IgKCk7CisJCSAgZXJyb3IgKCJXYXRjaGRvZyBoYXMgZXhwaXJlZC4gIFRhcmdldCBkZXRhY2hlZC5cbiIpOworCQl9CisjZW5kaWYKKwkgICAgICBpZiAocmVtb3RlX2RlYnVnKQorCQlwdXRzX2ZpbHRlcmVkICgiVGltZWQgb3V0LlxuIik7CisJICAgICAgZ290byByZXRyeTsKKwkgICAgfQorCX0KKyAgICAgIHdoaWxlIChjICE9ICckJyk7CisKKyAgICAgIC8qIFdlJ3ZlIGZvdW5kIHRoZSBzdGFydCBvZiBhIHBhY2tldCwgbm93IGNvbGxlY3QgdGhlIGRhdGEuICAqLworCisgICAgICB2YWwgPSByZWFkX2ZyYW1lIChidWYpOworCisgICAgICBpZiAodmFsID09IDEpCisJeworCSAgaWYgKHJlbW90ZV9kZWJ1ZykKKwkgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3Rkb3V0LCAiUGFja2V0IHJlY2VpdmVkOiAlc1xuIiwgYnVmKTsKKwkgIFNFUklBTF9XUklURSAocmVtb3RlX2Rlc2MsICIrIiwgMSk7CisJICByZXR1cm47CisJfQorCisgICAgICAvKiBUcnkgdGhlIHdob2xlIHRoaW5nIGFnYWluLiAgKi8KKyAgICByZXRyeToKKyAgICAgIFNFUklBTF9XUklURSAocmVtb3RlX2Rlc2MsICItIiwgMSk7CisgICAgfQorCisgIC8qIFdlIGhhdmUgdHJpZWQgaGFyZCBlbm91Z2gsIGFuZCBqdXN0IGNhbid0IHJlY2VpdmUgdGhlIHBhY2tldC4gIEdpdmUgdXAuICovCisKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJJZ25vcmluZyBwYWNrZXQgZXJyb3IsIGNvbnRpbnVpbmcuLi5cbiIpOworICBTRVJJQUxfV1JJVEUgKHJlbW90ZV9kZXNjLCAiKyIsIDEpOworfQorDAorc3RhdGljIHZvaWQKK3JlbW90ZV9raWxsICgpCit7CisgIC8qIEZvciBzb21lIG15c3RlcmlvdXMgcmVhc29uLCB3YWl0X2Zvcl9pbmZlcmlvciBjYWxscyBraWxsIGluc3RlYWQgb2YKKyAgICAgbW91cm4gYWZ0ZXIgaXQgZ2V0cyBUQVJHRVRfV0FJVEtJTkRfU0lHTkFMTEVELiAgV29yayBhcm91bmQgaXQuICAqLworICBpZiAoa2lsbF9rbHVkZ2UpCisgICAgeworICAgICAga2lsbF9rbHVkZ2UgPSAwOworICAgICAgdGFyZ2V0X21vdXJuX2luZmVyaW9yICgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBVc2UgY2F0Y2hfZXJyb3JzIHNvIHRoZSB1c2VyIGNhbiBxdWl0IGZyb20gZ2RiIGV2ZW4gd2hlbiB3ZSBhcmVuJ3Qgb24KKyAgICAgc3BlYWtpbmcgdGVybXMgd2l0aCB0aGUgcmVtb3RlIHN5c3RlbS4gICovCisgIGNhdGNoX2Vycm9ycyAoKGNhdGNoX2Vycm9yc19mdHlwZSAqKSBwdXRwa3QsICJrIiwgIiIsIFJFVFVSTl9NQVNLX0VSUk9SKTsKKworICAvKiBEb24ndCB3YWl0IGZvciBpdCB0byBkaWUuICBJJ20gbm90IHJlYWxseSBzdXJlIGl0IG1hdHRlcnMgd2hldGhlcgorICAgICB3ZSBkbyBvciBub3QuICBGb3IgdGhlIGV4aXN0aW5nIHN0dWJzLCBraWxsIGlzIGEgbm9vcC4gICovCisgIHRhcmdldF9tb3Vybl9pbmZlcmlvciAoKTsKK30KKworc3RhdGljIHZvaWQKK3JlbW90ZV9tb3VybiAoKQoreworICByZW1vdGVfbW91cm5fMSAoJnJlbW90ZV9vcHMpOworfQorCitzdGF0aWMgdm9pZAorZXh0ZW5kZWRfcmVtb3RlX21vdXJuICgpCit7CisgIC8qIFdlIGRvIF9ub3RfIHdhbnQgdG8gbW91cm4gdGhlIHRhcmdldCBsaWtlIHRoaXM7IHRoaXMgd2lsbAorICAgICByZW1vdmUgdGhlIGV4dGVuZGVkIHJlbW90ZSB0YXJnZXQgIGZyb20gdGhlIHRhcmdldCBzdGFjaywKKyAgICAgYW5kIHRoZSBuZXh0IHRpbWUgdGhlIHVzZXIgc2F5cyAicnVuIiBpdCdsbCBmYWlsLiAKKworICAgICBGSVhNRTogV2hhdCBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gaGVyZT8gICovCisjaWYgMAorICByZW1vdGVfbW91cm5fMSAoJmV4dGVuZGVkX3JlbW90ZV9vcHMpOworI2VuZGlmCit9CisKKy8qIFdvcmtlciBmdW5jdGlvbiBmb3IgcmVtb3RlX21vdXJuLiAgKi8KK3N0YXRpYyB2b2lkCityZW1vdGVfbW91cm5fMSAodGFyZ2V0KQorICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0OworeworICB1bnB1c2hfdGFyZ2V0ICh0YXJnZXQpOworICBnZW5lcmljX21vdXJuX2luZmVyaW9yICgpOworfQorCisvKiBJbiB0aGUgZXh0ZW5kZWQgcHJvdG9jb2wgd2Ugd2FudCB0byBiZSBhYmxlIHRvIGRvIHRoaW5ncyBsaWtlCisgICAicnVuIiBhbmQgaGF2ZSB0aGVtIGJhc2ljYWxseSB3b3JrIGFzIGV4cGVjdGVkLiAgU28gd2UgbmVlZAorICAgYSBzcGVjaWFsIGNyZWF0ZV9pbmZlcmlvciBmdW5jdGlvbi4gCisKKyAgIEZJWE1FOiBPbmUgZGF5IGFkZCBzdXBwb3J0IGZvciBjaGFuZ2luZyB0aGUgZXhlYyBmaWxlCisgICB3ZSdyZSBkZWJ1Z2dpbmcsIGFyZ3VtZW50cyBhbmQgYW4gZW52aXJvbm1lbnQuICAqLworCitzdGF0aWMgdm9pZAorZXh0ZW5kZWRfcmVtb3RlX2NyZWF0ZV9pbmZlcmlvciAoZXhlY19maWxlLCBhcmdzLCBlbnYpCisgICAgIGNoYXIgKmV4ZWNfZmlsZTsKKyAgICAgY2hhciAqYXJnczsKKyAgICAgY2hhciAqKmVudjsKK3sKKyAgLyogUmlwIG91dCB0aGUgYnJlYWtwb2ludHM7IHdlJ2xsIHJlaW5zZXJ0IHRoZW0gYWZ0ZXIgcmVzdGFydGluZworICAgICB0aGUgcmVtb3RlIHNlcnZlci4gICovCisgIHJlbW92ZV9icmVha3BvaW50cyAoKTsKKworICAvKiBOb3cgcmVzdGFydCB0aGUgcmVtb3RlIHNlcnZlci4gICovCisgIGV4dGVuZGVkX3JlbW90ZV9yZXN0YXJ0ICgpOworCisgIC8qIE5vdyBwdXQgdGhlIGJyZWFrcG9pbnRzIGJhY2sgaW4uICBUaGlzIHdheSB3ZSdyZSBzYWZlIGlmIHRoZQorICAgICByZXN0YXJ0IGZ1bmN0aW9uIHdvcmtzIHZpYSBhIHVuaXggZm9yayBvbiB0aGUgcmVtb3RlIHNpZGUuICAqLworICBpbnNlcnRfYnJlYWtwb2ludHMgKCk7CisKKyAgLyogQ2xlYW4gdXAgZnJvbSB0aGUgbGFzdCB0aW1lIHdlIHdlcmUgcnVubmluZy4gICovCisgIGNsZWFyX3Byb2NlZWRfc3RhdHVzICgpOworCisgIC8qIExldCB0aGUgcmVtb3RlIHByb2Nlc3MgcnVuLiAgKi8KKyAgcHJvY2VlZCAoLTEsIFRBUkdFVF9TSUdOQUxfMCwgMCk7Cit9CisKKwwKKy8qIE9uIHNvbWUgbWFjaGluZXMsIGUuZy4gNjhrLCB3ZSBtYXkgdXNlIGEgZGlmZmVyZW50IGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24KKyAgIHRoYW4gb3RoZXIgdGFyZ2V0czsgaW4gdGhvc2UgdXNlIFJFTU9URV9CUkVBS1BPSU5UIGluc3RlYWQgb2YganVzdAorICAgQlJFQUtQT0lOVC4gIEFsc28sIGJpLWVuZGlhbiB0YXJnZXRzIG1heSBkZWZpbmUgTElUVExFX1JFTU9URV9CUkVBS1BPSU5UCisgICBhbmQgQklHX1JFTU9URV9CUkVBS1BPSU5ULiAgSWYgbm9uZSBvZiB0aGVzZSBhcmUgZGVmaW5lZCwgd2UganVzdCBjYWxsCisgICB0aGUgc3RhbmRhcmQgcm91dGluZXMgdGhhdCBhcmUgaW4gbWVtLWJyZWFrLmMuICAqLworCisvKiBGSVhNRSwgdGhlc2Ugb3VnaHQgdG8gYmUgZG9uZSBpbiBhIG1vcmUgZHluYW1pYyBmYXNoaW9uLiAgRm9yIGluc3RhbmNlLAorICAgdGhlIGNob2ljZSBvZiBicmVha3BvaW50IGluc3RydWN0aW9uIGFmZmVjdHMgdGFyZ2V0IHByb2dyYW0gZGVzaWduIGFuZAorICAgdmljZSB2ZXJzYSwgYW5kIGJ5IG1ha2luZyBpdCB1c2VyLXR3ZWFrYWJsZSwgdGhlIHNwZWNpYWwgY29kZSBoZXJlCisgICBnb2VzIGF3YXkgYW5kIHdlIG5lZWQgZmV3ZXIgc3BlY2lhbCBHREIgY29uZmlndXJhdGlvbnMuICAqLworCisjaWYgZGVmaW5lZCAoTElUVExFX1JFTU9URV9CUkVBS1BPSU5UKSAmJiBkZWZpbmVkIChCSUdfUkVNT1RFX0JSRUFLUE9JTlQpICYmICFkZWZpbmVkKFJFTU9URV9CUkVBS1BPSU5UKQorI2RlZmluZSBSRU1PVEVfQlJFQUtQT0lOVAorI2VuZGlmCisKKyNpZmRlZiBSRU1PVEVfQlJFQUtQT0lOVAorCisvKiBJZiB0aGUgdGFyZ2V0IGlzbid0IGJpLWVuZGlhbiwganVzdCBwcmV0ZW5kIGl0IGlzLiAgKi8KKyNpZiAhZGVmaW5lZCAoTElUVExFX1JFTU9URV9CUkVBS1BPSU5UKSAmJiAhZGVmaW5lZCAoQklHX1JFTU9URV9CUkVBS1BPSU5UKQorI2RlZmluZSBMSVRUTEVfUkVNT1RFX0JSRUFLUE9JTlQgUkVNT1RFX0JSRUFLUE9JTlQKKyNkZWZpbmUgQklHX1JFTU9URV9CUkVBS1BPSU5UIFJFTU9URV9CUkVBS1BPSU5UCisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYmlnX2JyZWFrX2luc25bXSA9IEJJR19SRU1PVEVfQlJFQUtQT0lOVDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxpdHRsZV9icmVha19pbnNuW10gPSBMSVRUTEVfUkVNT1RFX0JSRUFLUE9JTlQ7CisKKyNlbmRpZiAvKiBSRU1PVEVfQlJFQUtQT0lOVCAqLworCisvKiBJbnNlcnQgYSBicmVha3BvaW50IG9uIHRhcmdldHMgdGhhdCBkb24ndCBoYXZlIGFueSBiZXR0ZXIgYnJlYWtwb2ludAorICAgc3VwcG9ydC4gIFdlIHJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSB0YXJnZXQgbG9jYXRpb24gYW5kIHN0YXNoIGl0LAorICAgdGhlbiBvdmVyd3JpdGUgaXQgd2l0aCBhIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uICBBRERSIGlzIHRoZSB0YXJnZXQKKyAgIGxvY2F0aW9uIGluIHRoZSB0YXJnZXQgbWFjaGluZS4gIENPTlRFTlRTX0NBQ0hFIGlzIGEgcG9pbnRlciB0byAKKyAgIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHNhdmluZyB0aGUgdGFyZ2V0IGNvbnRlbnRzLiAgSXQgaXMgZ3VhcmFudGVlZAorICAgYnkgdGhlIGNhbGxlciB0byBiZSBsb25nIGVub3VnaCB0byBzYXZlIHNpemVvZiBCUkVBS1BPSU5UIGJ5dGVzICh0aGlzCisgICBpcyBhY2NvbXBsaXNoZWQgdmlhIEJSRUFLUE9JTlRfTUFYKS4gICovCisKK3N0YXRpYyBpbnQKK3JlbW90ZV9pbnNlcnRfYnJlYWtwb2ludCAoYWRkciwgY29udGVudHNfY2FjaGUpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpjb250ZW50c19jYWNoZTsKK3sKKyNpZmRlZiBSRU1PVEVfQlJFQUtQT0lOVAorICBpbnQgdmFsOworCisgIHZhbCA9IHRhcmdldF9yZWFkX21lbW9yeSAoYWRkciwgY29udGVudHNfY2FjaGUsIHNpemVvZiBiaWdfYnJlYWtfaW5zbik7CisKKyAgaWYgKHZhbCA9PSAwKQorICAgIHsKKyAgICAgIGlmIChUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQorCXZhbCA9IHRhcmdldF93cml0ZV9tZW1vcnkgKGFkZHIsIChjaGFyICopIGJpZ19icmVha19pbnNuLAorCQkJCSAgIHNpemVvZiBiaWdfYnJlYWtfaW5zbik7CisgICAgICBlbHNlCisJdmFsID0gdGFyZ2V0X3dyaXRlX21lbW9yeSAoYWRkciwgKGNoYXIgKikgbGl0dGxlX2JyZWFrX2luc24sCisJCQkJICAgc2l6ZW9mIGxpdHRsZV9icmVha19pbnNuKTsKKyAgICB9CisKKyAgcmV0dXJuIHZhbDsKKyNlbHNlCisgIHJldHVybiBtZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKTsKKyNlbmRpZiAvKiBSRU1PVEVfQlJFQUtQT0lOVCAqLworfQorCitzdGF0aWMgaW50CityZW1vdGVfcmVtb3ZlX2JyZWFrcG9pbnQgKGFkZHIsIGNvbnRlbnRzX2NhY2hlKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgY2hhciAqY29udGVudHNfY2FjaGU7Cit7CisjaWZkZWYgUkVNT1RFX0JSRUFLUE9JTlQKKyAgcmV0dXJuIHRhcmdldF93cml0ZV9tZW1vcnkgKGFkZHIsIGNvbnRlbnRzX2NhY2hlLCBzaXplb2YgYmlnX2JyZWFrX2luc24pOworI2Vsc2UKKyAgcmV0dXJuIG1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludCAoYWRkciwgY29udGVudHNfY2FjaGUpOworI2VuZGlmIC8qIFJFTU9URV9CUkVBS1BPSU5UICovCit9CisKKy8qIFNvbWUgdGFyZ2V0cyBhcmUgb25seSBjYXBhYmxlIG9mIGRvaW5nIGRvd25sb2FkcywgYW5kIGFmdGVyd2FyZHMKKyAgIHRoZXkgc3dpdGNoIHRvIHRoZSByZW1vdGUgc2VyaWFsIHByb3RvY29sLiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcworICAgYSBjbGVhbiB3YXkgdG8gZ2V0IGZyb20gdGhlIGRvd25sb2FkIHRhcmdldCB0byB0aGUgcmVtb3RlIHRhcmdldC4KKyAgIEl0J3MgYmFzaWNhbGx5IGp1c3QgYSB3cmFwcGVyIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBleHBvc2UgYW55CisgICBvZiB0aGUgaW50ZXJuYWwgd29ya2luZ3Mgb2YgcmVtb3RlLmMuCisKKyAgIFByaW9yIHRvIGNhbGxpbmcgdGhpcyByb3V0aW5lLCB5b3Ugc2hvdWxkIHNodXRkb3duIHRoZSBjdXJyZW50CisgICB0YXJnZXQgY29kZSwgZWxzZSB5b3Ugd2lsbCBnZXQgdGhlICJBIHByb2dyYW0gaXMgYmVpbmcgZGVidWdnZWQKKyAgIGFscmVhZHkuLi4iIG1lc3NhZ2UuICBVc3VhbGx5IGEgY2FsbCB0byBwb3BfdGFyZ2V0KCkgc3VmZmljZXMuICAqLworCit2b2lkCitwdXNoX3JlbW90ZV90YXJnZXQgKG5hbWUsIGZyb21fdHR5KQorICAgICBjaGFyICpuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHByaW50Zl9maWx0ZXJlZCAoIlN3aXRjaGluZyB0byByZW1vdGUgcHJvdG9jb2xcbiIpOworICByZW1vdGVfb3BlbiAobmFtZSwgZnJvbV90dHkpOworfQorCisvKiBPdGhlciB0YXJnZXRzIHdhbnQgdG8gdXNlIHRoZSBlbnRpcmUgcmVtb3RlIHNlcmlhbCBtb2R1bGUgYnV0IHdpdGgKKyAgIGNlcnRhaW4gcmVtb3RlX29wcyBvdmVycmlkZGVuLiAqLworCit2b2lkCitvcGVuX3JlbW90ZV90YXJnZXQgKG5hbWUsIGZyb21fdHR5LCB0YXJnZXQsIGV4dGVuZGVkX3ApCisgICAgIGNoYXIgKm5hbWU7CisgICAgIGludCBmcm9tX3R0eTsKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldDsKKyAgICAgaW50IGV4dGVuZGVkX3A7Cit7CisgIHByaW50Zl9maWx0ZXJlZCAoIlNlbGVjdGluZyB0aGUgJXNyZW1vdGUgcHJvdG9jb2xcbiIsCisJCSAgIChleHRlbmRlZF9wID8gImV4dGVuZGVkLSIgOiAiIikpOworICByZW1vdGVfb3Blbl8xIChuYW1lLCBmcm9tX3R0eSwgdGFyZ2V0LCBleHRlbmRlZF9wKTsKK30KKworLyogVGFibGUgdXNlZCBieSB0aGUgY3JjMzIgZnVuY3Rpb24gdG8gY2FsY3VhdGUgdGhlIGNoZWNrc3VtLiAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjcmMzMl90YWJsZVsyNTZdID0gezAsIDB9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZworY3JjMzIgKGJ1ZiwgbGVuLCBjcmMpCisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICAgaW50IGxlbjsKKyAgICAgdW5zaWduZWQgaW50IGNyYzsKK3sKKyAgaWYgKCEgY3JjMzJfdGFibGVbMV0pCisgICAgeworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgQ1JDIHRhYmxlIGFuZCB0aGUgZGVjb2RpbmcgdGFibGUuICovCisgICAgICBpbnQgaSwgajsKKyAgICAgIHVuc2lnbmVkIGludCBjOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKGMgPSBpIDw8IDI0LCBqID0gODsgaiA+IDA7IC0taikKKyAgICAgICAgICAgIGMgPSBjICYgMHg4MDAwMDAwMCA/IChjIDw8IDEpIF4gMHgwNGMxMWRiNyA6IChjIDw8IDEpOworICAgICAgICAgIGNyYzMyX3RhYmxlW2ldID0gYzsKKyAgICAgICAgfQorICAgIH0KKworICB3aGlsZSAobGVuLS0pCisgICAgeworICAgICAgY3JjID0gKGNyYyA8PCA4KSBeIGNyYzMyX3RhYmxlWygoY3JjID4+IDI0KSBeICpidWYpICYgMjU1XTsKKyAgICAgIGJ1ZisrOworICAgIH0KKyAgcmV0dXJuIGNyYzsKK30KKworLyogY29tcGFyZS1zZWN0aW9ucyBjb21tYW5kCisKKyAgIFdpdGggbm8gYXJndW1lbnRzLCBjb21wYXJlcyBlYWNoIGxvYWRhYmxlIHNlY3Rpb24gaW4gdGhlIGV4ZWMgYmZkCisgICB3aXRoIHRoZSBzYW1lIG1lbW9yeSByYW5nZSBvbiB0aGUgdGFyZ2V0LCBhbmQgcmVwb3J0cyBtaXNtYXRjaGVzLgorICAgVXNlZnVsIGZvciB2ZXJpZnlpbmcgdGhlIGltYWdlIG9uIHRoZSB0YXJnZXQgYWdhaW5zdCB0aGUgZXhlYyBmaWxlLgorICAgRGVwZW5kcyBvbiB0aGUgdGFyZ2V0IHVuZGVyc3RhbmRpbmcgdGhlIG5ldyAicUNSQzoiIHJlcXVlc3QuICAqLworCitzdGF0aWMgdm9pZAorY29tcGFyZV9zZWN0aW9uc19jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBhc2VjdGlvbiAqczsKKyAgdW5zaWduZWQgbG9uZyBob3N0X2NyYywgdGFyZ2V0X2NyYzsKKyAgZXh0ZXJuIGJmZCAqZXhlY19iZmQ7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisgIGNoYXIgKnRtcCwgKnNlY3RkYXRhLCAqc2VjdG5hbWUsIGJ1ZltQQlVGU0laXTsKKyAgYmZkX3NpemVfdHlwZSBzaXplOworICBiZmRfdm1hIGxtYTsKKyAgaW50IG1hdGNoZWQgPSAwOworICBpbnQgbWlzbWF0Y2hlZCA9IDA7CisKKyAgaWYgKCFleGVjX2JmZCkKKyAgICBlcnJvciAoImNvbW1hbmQgY2Fubm90IGJlIHVzZWQgd2l0aG91dCBhbiBleGVjIGZpbGUiKTsKKyAgaWYgKCFjdXJyZW50X3RhcmdldC50b19zaG9ydG5hbWUgfHwKKyAgICAgIHN0cmNtcCAoY3VycmVudF90YXJnZXQudG9fc2hvcnRuYW1lLCAicmVtb3RlIikgIT0gMCkKKyAgICBlcnJvciAoImNvbW1hbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHJlbW90ZSB0YXJnZXQiKTsKKworICBmb3IgKHMgPSBleGVjX2JmZC0+c2VjdGlvbnM7IHM7IHMgPSBzLT5uZXh0KSAKKyAgICB7CisgICAgICBpZiAoIShzLT5mbGFncyAmIFNFQ19MT0FEKSkKKwljb250aW51ZTsJLyogc2tpcCBub24tbG9hZGFibGUgc2VjdGlvbiAqLworCisgICAgICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzKTsKKyAgICAgIGlmIChzaXplID09IDApCisJY29udGludWU7CS8qIHNraXAgemVyby1sZW5ndGggc2VjdGlvbiAqLworCisgICAgICBzZWN0bmFtZSA9IChjaGFyICopIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChleGVjX2JmZCwgcyk7CisgICAgICBpZiAoYXJncyAmJiBzdHJjbXAgKGFyZ3MsIHNlY3RuYW1lKSAhPSAwKQorCWNvbnRpbnVlOwkvKiBub3QgdGhlIHNlY3Rpb24gc2VsZWN0ZWQgYnkgdXNlciAqLworCisgICAgICBtYXRjaGVkID0gMTsJLyogZG8gdGhpcyBzZWN0aW9uICovCisgICAgICBsbWEgPSBzLT5sbWE7CisgICAgICAvKiBGSVhNRTogYXNzdW1lcyBsbWEgY2FuIGZpdCBpbnRvIGxvbmcgKi8KKyAgICAgIHNwcmludGYgKGJ1ZiwgInFDUkM6JWx4LCVseCIsIChsb25nKSBsbWEsIChsb25nKSBzaXplKTsKKyAgICAgIHB1dHBrdCAoYnVmKTsKKworICAgICAgLyogYmUgY2xldmVyOyBjb21wdXRlIHRoZSBob3N0X2NyYyBiZWZvcmUgd2FpdGluZyBmb3IgdGFyZ2V0IHJlcGx5ICovCisgICAgICBzZWN0ZGF0YSA9IHhtYWxsb2MgKHNpemUpOworICAgICAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwIChmcmVlLCBzZWN0ZGF0YSk7CisgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGV4ZWNfYmZkLCBzLCBzZWN0ZGF0YSwgMCwgc2l6ZSk7CisgICAgICBob3N0X2NyYyA9IGNyYzMyICgodW5zaWduZWQgY2hhciAqKSBzZWN0ZGF0YSwgc2l6ZSwgMHhmZmZmZmZmZik7CisKKyAgICAgIGdldHBrdCAoYnVmLCAwKTsKKyAgICAgIGlmIChidWZbMF0gPT0gJ0UnKQorCWVycm9yICgidGFyZ2V0IG1lbW9yeSBmYXVsdCwgc2VjdGlvbiAlcywgcmFuZ2UgMHglMDh4IC0tIDB4JTA4eCIsCisJICAgICAgIHNlY3RuYW1lLCBsbWEsIGxtYSArIHNpemUpOworICAgICAgaWYgKGJ1ZlswXSAhPSAnQycpCisJZXJyb3IgKCJyZW1vdGUgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24iKTsKKworICAgICAgZm9yICh0YXJnZXRfY3JjID0gMCwgdG1wID0gJmJ1ZlsxXTsgKnRtcDsgdG1wKyspCisJdGFyZ2V0X2NyYyA9IHRhcmdldF9jcmMgKiAxNiArIGZyb21oZXggKCp0bXApOworCisgICAgICBwcmludGZfZmlsdGVyZWQgKCJTZWN0aW9uICVzLCByYW5nZSAweCUwOHggLS0gMHglMDh4OiAiLAorCQkgICAgICAgc2VjdG5hbWUsIGxtYSwgbG1hICsgc2l6ZSk7CisgICAgICBpZiAoaG9zdF9jcmMgPT0gdGFyZ2V0X2NyYykKKwlwcmludGZfZmlsdGVyZWQgKCJtYXRjaGVkLlxuIik7CisgICAgICBlbHNlCisgICAgICAgeworCSBwcmludGZfZmlsdGVyZWQgKCJNSVMtTUFUQ0hFRCFcbiIpOworCSBtaXNtYXRjaGVkKys7CisgICAgICAgfQorCisgICAgICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKKyAgICB9CisgIGlmIChtaXNtYXRjaGVkID4gMCkKKyAgICB3YXJuaW5nICgiT25lIG9yIG1vcmUgc2VjdGlvbnMgb2YgdGhlIHJlbW90ZSBleGVjdXRhYmxlIGRvZXMgbm90IG1hdGNoXG5cCit0aGUgbG9hZGVkIGZpbGVcbiIpOworICBpZiAoYXJncyAmJiAhbWF0Y2hlZCkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJObyBsb2FkZWQgc2VjdGlvbiBuYW1lZCAnJXMnLlxuIiwgYXJncyk7Cit9CisKK3N0YXRpYyBpbnQKK3JlbW90ZV9xdWVyeSAocXVlcnlfdHlwZSwgYnVmLCBvdXRidWYsIGJ1ZnNpeikKKyAgICAgaW50IHF1ZXJ5X3R5cGU7CisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgY2hhciAqb3V0YnVmOworICAgICBpbnQgKmJ1ZnNpejsKK3sKKyAgaW50IGk7CisgIGNoYXIgYnVmMltQQlVGU0laXTsKKyAgY2hhciAqcDIgPSAmYnVmMlswXTsKKyAgY2hhciAqcCA9IGJ1ZjsKKworICBpZiAoISBidWZzaXopCisgICAgZXJyb3IgKCJudWxsIHBvaW50ZXIgdG8gcmVtb3RlIGJ1ZmVyIHNpemUgc3BlY2lmaWVkIik7CisKKyAgLyogbWluaW11bSBvdXRidWYgc2l6ZSBpcyBQQlVGU0laRSAtIGlmIGJ1ZnNpeiBpcyBub3QgbGFyZ2UgZW5vdWdoIGxldCAKKyAgICAgdGhlIGNhbGxlciBrbm93IGFuZCByZXR1cm4gd2hhdCB0aGUgbWluaW11bSBzaXplIGlzICAgKi8KKyAgLyogTm90ZTogYSB6ZXJvIGJ1ZnNpeiBjYW4gYmUgdXNlZCB0byBxdWVyeSB0aGUgbWluaW11bSBidWZmZXIgc2l6ZSAqLworICBpZiAoICpidWZzaXogPCBQQlVGU0laICkKKyAgICB7CisgICAgICAqYnVmc2l6ID0gUEJVRlNJWjsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgLyogZXhjZXB0IGZvciBxdWVyeWluZyB0aGUgbWluaW11bSBidWZmZXIgc2l6ZSwgdGFyZ2V0IG11c3QgYmUgb3BlbiAqLworICBpZiAoISByZW1vdGVfZGVzYykKKyAgICBlcnJvciAoInJlbW90ZSBxdWVyeSBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0YXJnZXQgb3BlbiIpOworCisgIC8qIHdlIG9ubHkgdGFrZSB1cHBlcmNhc2UgbGV0dGVycyBhcyBxdWVyeSB0eXBlcywgYXQgbGVhc3QgZm9yIG5vdyAqLworICBpZiAoIChxdWVyeV90eXBlIDwgJ0EnKSB8fCAocXVlcnlfdHlwZSA+ICdaJykgKQorICAgIGVycm9yICgiaW52YWxpZCByZW1vdGUgcXVlcnkgdHlwZSIpOworCisgIGlmICghIGJ1ZikKKyAgICBlcnJvciAoIm51bGwgcmVtb3RlIHF1ZXJ5IHNwZWNpZmllZCIpOworCisgIGlmICghIG91dGJ1ZikKKyAgICBlcnJvciAoInJlbW90ZSBxdWVyeSByZXF1aXJlcyBhIGJ1ZmZlciB0byByZWNlaXZlIGRhdGEiKTsKKworICBvdXRidWZbMF0gPSAnXDAnOworCisgICpwMisrID0gJ3EnOworICAqcDIrKyA9IHF1ZXJ5X3R5cGU7CisKKyAgLyogd2UgdXNlZCBvbmUgYnVmZmVyIGNoYXIgZm9yIHRoZSByZW1vdGUgcHJvdG9jb2wgcSBjb21tYW5kIGFuZCBhbm90aGVyCisgICAgIGZvciB0aGUgcXVlcnkgdHlwZS4gIEFzIHRoZSByZW1vdGUgcHJvdG9jb2wgZW5jYXBzdWxhdGlvbiB1c2VzIDQgY2hhcnMKKyAgICAgcGx1cyBvbmUgZXh0cmEgaW4gY2FzZSB3ZSBhcmUgZGVidWdnaW5nIChyZW1vdGVfZGVidWcpLAorICAgICB3ZSBoYXZlIFBCVUZaSVogLSA3IGxlZnQgdG8gcGFjayB0aGUgcXVlcnkgc3RyaW5nICovCisgIGkgPSAwOworICB3aGlsZSAoIGJ1ZltpXSAmJiAoaSA8IChQQlVGU0laIC0gOCkpICkKKyAgICB7CisgICAgICAvKiBiYWQgY2FsbGVyIG1heSBoYXZlIHNlbnQgZm9yYmlkZGVuIGNoYXJhY3RlcnMgKi8KKyAgICAgIGlmICggKCFpc3ByaW50KGJ1ZltpXSkpIHx8IChidWZbaV0gPT0gJyQnKSB8fCAoYnVmW2ldID09ICcjJykgKQorICAgICAgICBlcnJvciAoImlsbGVnYWwgY2hhcmFjdGVycyBpbiBxdWVyeSBzdHJpbmciKTsKKworICAgICAgKnAyKysgPSBidWZbaV07CisgICAgICBpKys7CisgICAgfQorICAqcDIgPSBidWZbaV07CisKKyAgaWYgKCBidWZbaV0gKQorICAgIGVycm9yICgicXVlcnkgbGFyZ2VyIHRoYW4gYXZhaWxhYmxlIGJ1ZmZlciIpOworCisgIGkgPSBwdXRwa3QgKGJ1ZjIpOworICBpZiAoIGkgPCAwICkgcmV0dXJuIGk7CisKKyAgZ2V0cGt0IChvdXRidWYsIDApOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorcGFja2V0X2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoYXIgYnVmW1BCVUZTSVpdOworCisgIGlmICghIHJlbW90ZV9kZXNjKQorICAgIGVycm9yICgiY29tbWFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggcmVtb3RlIHRhcmdldCIpOworCisgIGlmICghIGFyZ3MpCisgICAgZXJyb3IgKCJyZW1vdGUtcGFja2V0IGNvbW1hbmQgcmVxdWlyZXMgcGFja2V0IHRleHQgYXMgYXJndW1lbnQiKTsKKworICBwdXRzX2ZpbHRlcmVkICgic2VuZGluZzogIik7CisgIHByaW50X3BhY2tldCAoYXJncyk7CisgIHB1dHNfZmlsdGVyZWQgKCJcbiIpOworICBwdXRwa3QgKGFyZ3MpOworCisgIGdldHBrdCAoYnVmLCAwKTsKKyAgcHV0c19maWx0ZXJlZCAoInJlY2VpdmVkOiAiKTsKKyAgcHJpbnRfcGFja2V0IChidWYpOworICBwdXRzX2ZpbHRlcmVkICgiXG4iKTsKK30KKworI2lmIDAKKy8qIC0tLS0tLS0tLSBVTklUX1RFU1QgZm9yIFRIUkVBRCBvcmllbnRlZCBQQUNLRVRTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgZGlzcGxheV90aHJlYWRfaW5mbyBQQVJBTVMgKChzdHJ1Y3QgZ2RiX2V4dF90aHJlYWRfaW5mbyAqaW5mbykpOworCitzdGF0aWMgdm9pZCB0aHJlYWRzZXRfdGVzdF9jbWQgUEFSQU1TICgoY2hhciAqY21kLCBpbnQgdHR5KSk7CisKK3N0YXRpYyB2b2lkIHRocmVhZGFsaXZlX3Rlc3QgUEFSQU1TICgoY2hhciAqY21kLCBpbnQgdHR5KSk7CisKK3N0YXRpYyB2b2lkIHRocmVhZGxpc3RfdGVzdF9jbWQgUEFSQU1TICgoY2hhciAqY21kLCBpbnQgdHR5KSk7CisKK2ludCBnZXRfYW5kX2Rpc3BsYXlfdGhyZWFkaW5mbyBQQVJBTVMgKCh0aHJlYWRyZWYgKnJlZikpOworCitzdGF0aWMgdm9pZCB0aHJlYWRpbmZvX3Rlc3RfY21kIFBBUkFNUyAoKGNoYXIgKmNtZCwgaW50IHR0eSkpOworCitzdGF0aWMgaW50IHRocmVhZF9kaXNwbGF5X3N0ZXAgUEFSQU1TICgodGhyZWFkcmVmICpyZWYsIHZvaWQgKmNvbnRleHQpKTsKKworc3RhdGljIHZvaWQgdGhyZWFkbGlzdF91cGRhdGVfdGVzdF9jbWQgUEFSQU1TICgoY2hhciAqY21kLCBpbnQgdHR5KSk7CisKK3N0YXRpYyB2b2lkIGluaXRfcmVtb3RlX3RocmVhZHRlc3RzIFBBUkFNUyAoKHZvaWQpKTsKKworI2RlZmluZSBTQU1QTEVfVEhSRUFEICAweDA1MDYwNzA4ICAvKiBUcnVuY2F0ZWQgNjQgYml0IHRocmVhZGlkICovCisKK3N0YXRpYyB2b2lkCit0aHJlYWRzZXRfdGVzdF9jbWQgKGNtZCwgdHR5KQorICAgICBjaGFyICpjbWQ7CisgICAgIGludCB0dHk7Cit7CisgIGludCBzYW1wbGVfdGhyZWFkID0gU0FNUExFX1RIUkVBRDsKKworICBwcmludGZfZmlsdGVyZWQgKCJSZW1vdGUgdGhyZWFkc2V0IHRlc3RcbiIpOworICBzZXRfdGhyZWFkIChzYW1wbGVfdGhyZWFkLCAxKTsKK30KKworCitzdGF0aWMgdm9pZAordGhyZWFkYWxpdmVfdGVzdCAoY21kLCB0dHkpCisgICAgIGNoYXIgKmNtZDsKKyAgICAgaW50IHR0eTsKK3sKKyAgaW50IHNhbXBsZV90aHJlYWQgPSBTQU1QTEVfVEhSRUFEOworCisgIGlmIChyZW1vdGVfdGhyZWFkX2FsaXZlIChzYW1wbGVfdGhyZWFkKSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJQQVNTOiBUaHJlYWQgYWxpdmUgdGVzdFxuIik7CisgIGVsc2UKKyAgICBwcmludGZfZmlsdGVyZWQgKCJGQUlMOiBUaHJlYWQgYWxpdmUgdGVzdFxuIik7Cit9CisKK3ZvaWQgb3V0cHV0X3RocmVhZGlkIFBBUkFNUyAoKGNoYXIgKnRpdGxlLCB0aHJlYWRyZWYgKiByZWYpKTsKKwordm9pZAorb3V0cHV0X3RocmVhZGlkICh0aXRsZSwgcmVmKQorICAgICBjaGFyICp0aXRsZTsKKyAgICAgdGhyZWFkcmVmICpyZWY7Cit7CisgIGNoYXIgaGV4aWRbMjBdOworCisgIHBhY2tfdGhyZWFkaWQgKCZoZXhpZFswXSwgcmVmKTsJLyogQ29udmVydCB0aHJlZWFkIGlkIGludG8gaGV4ICovCisgIGhleGlkWzE2XSA9IDA7CisgIHByaW50Zl9maWx0ZXJlZCAoIiVzICAlc1xuIiwgdGl0bGUsICgmaGV4aWRbMF0pKTsKK30KKworc3RhdGljIHZvaWQKK3RocmVhZGxpc3RfdGVzdF9jbWQgKGNtZCwgdHR5KQorICAgICBjaGFyICpjbWQ7CisgICAgIGludCB0dHk7Cit7CisgIGludCBzdGFydGZsYWcgPSAxOworICB0aHJlYWRyZWYgbmV4dHRocmVhZDsKKyAgaW50IGRvbmUsIHJlc3VsdF9jb3VudDsKKyAgdGhyZWFkcmVmIHRocmVhZGxpc3RbM107CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiUmVtb3RlIFRocmVhZGxpc3QgdGVzdFxuIik7CisgIGlmICghcmVtb3RlX2dldF90aHJlYWRsaXN0IChzdGFydGZsYWcsICZuZXh0dGhyZWFkLCAzLCAmZG9uZSwKKwkJCSAgICAgICZyZXN1bHRfY291bnQsICZ0aHJlYWRsaXN0WzBdKSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJGQUlMOiB0aHJlYWRsaXN0IHRlc3RcbiIpOworICBlbHNlCisgICAgeworICAgICAgdGhyZWFkcmVmICpzY2FuID0gdGhyZWFkbGlzdDsKKyAgICAgIHRocmVhZHJlZiAqbGltaXQgPSBzY2FuICsgcmVzdWx0X2NvdW50OworCisgICAgICB3aGlsZSAoc2NhbiA8IGxpbWl0KQorCW91dHB1dF90aHJlYWRpZCAoIiB0aHJlYWQgIiwgc2NhbisrKTsKKyAgICB9Cit9CisKK3ZvaWQKK2Rpc3BsYXlfdGhyZWFkX2luZm8gKGluZm8pCisgICAgIHN0cnVjdCBnZGJfZXh0X3RocmVhZF9pbmZvICppbmZvOworeworICBvdXRwdXRfdGhyZWFkaWQgKCJUaHJlYWRpZDogIiwgJmluZm8tPnRocmVhZGlkKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiTmFtZTogJXNcbiAiLCBpbmZvLT5zaG9ydG5hbWUpOworICBwcmludGZfZmlsdGVyZWQgKCJTdGF0ZTogJXNcbiIsIGluZm8tPmRpc3BsYXkpOworICBwcmludGZfZmlsdGVyZWQgKCJvdGhlcjogJXNcblxuIiwgaW5mby0+bW9yZV9kaXNwbGF5KTsKK30KKworaW50CitnZXRfYW5kX2Rpc3BsYXlfdGhyZWFkaW5mbyAocmVmKQorICAgICB0aHJlYWRyZWYgKnJlZjsKK3sKKyAgaW50IHJlc3VsdDsKKyAgaW50IHNldDsKKyAgc3RydWN0IGdkYl9leHRfdGhyZWFkX2luZm8gdGhyZWFkaW5mbzsKKworICBzZXQgPSBUQUdfVEhSRUFESUQgfCBUQUdfRVhJU1RTIHwgVEFHX1RIUkVBRE5BTUUKKyAgICB8IFRBR19NT1JFRElTUExBWSB8IFRBR19ESVNQTEFZOworICBpZiAoMCAhPSAocmVzdWx0ID0gcmVtb3RlX2dldF90aHJlYWRpbmZvIChyZWYsIHNldCwgJnRocmVhZGluZm8pKSkKKyAgICBkaXNwbGF5X3RocmVhZF9pbmZvICgmdGhyZWFkaW5mbyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJlYWRpbmZvX3Rlc3RfY21kIChjbWQsIHR0eSkKKyAgICAgY2hhciAqY21kOworICAgICBpbnQgdHR5OworeworICBpbnQgYXRocmVhZCA9IFNBTVBMRV9USFJFQUQ7CisgIHRocmVhZHJlZiB0aHJlYWQ7CisgIGludCBzZXQ7CisKKyAgaW50X3RvX3RocmVhZHJlZiAoJnRocmVhZCwgYXRocmVhZCk7CisgIHByaW50Zl9maWx0ZXJlZCAoIlJlbW90ZSBUaHJlYWRpbmZvIHRlc3RcbiIpOworICBpZiAoIWdldF9hbmRfZGlzcGxheV90aHJlYWRpbmZvICgmdGhyZWFkKSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJGQUlMIGNhbm5vdCBnZXQgdGhyZWFkIGluZm9cbiIpOworfQorCitzdGF0aWMgaW50Cit0aHJlYWRfZGlzcGxheV9zdGVwIChyZWYsIGNvbnRleHQpCisgICAgIHRocmVhZHJlZiAqcmVmOworICAgICB2b2lkICpjb250ZXh0OworeworICAvKiBvdXRwdXRfdGhyZWFkaWQoIiB0aHJlYWRzdGVwICIscmVmKTsgKi8vKiBzaW1wbGUgdGVzdCAqLworICByZXR1cm4gZ2V0X2FuZF9kaXNwbGF5X3RocmVhZGluZm8gKHJlZik7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJlYWRsaXN0X3VwZGF0ZV90ZXN0X2NtZCAoY21kLCB0dHkpCisgICAgIGNoYXIgKmNtZDsKKyAgICAgaW50IHR0eTsKK3sKKyAgcHJpbnRmX2ZpbHRlcmVkICgiUmVtb3RlIFRocmVhZGxpc3QgdXBkYXRlIHRlc3RcbiIpOworICByZW1vdGVfdGhyZWFkbGlzdF9pdGVyYXRvciAodGhyZWFkX2Rpc3BsYXlfc3RlcCwgMCwgQ1JBWllfTUFYX1RIUkVBRFMpOworfQorCitzdGF0aWMgdm9pZAoraW5pdF9yZW1vdGVfdGhyZWFkdGVzdHMgKHZvaWQpCit7CisgIGFkZF9jb20gKCJ0bGlzdCIsIGNsYXNzX29ic2N1cmUsIHRocmVhZGxpc3RfdGVzdF9jbWQsCisgICAgICJGZXRjaCBhbmQgcHJpbnQgdGhlIHJlbW90ZSBsaXN0IG9mIHRocmVhZCBpZGVudGlmaWVycywgb25lIHBrdCBvbmx5Iik7CisgIGFkZF9jb20gKCJ0aW5mbyIsIGNsYXNzX29ic2N1cmUsIHRocmVhZGluZm9fdGVzdF9jbWQsCisJICAgIkZldGNoIGFuZCBkaXNwbGF5IGluZm8gYWJvdXQgb25lIHRocmVhZCIpOworICBhZGRfY29tICgidHNldCIsIGNsYXNzX29ic2N1cmUsIHRocmVhZHNldF90ZXN0X2NtZCwKKwkgICAiVGVzdCBzZXR0aW5nIHRvIGEgZGlmZmVyZW50IHRocmVhZCIpOworICBhZGRfY29tICgidHVwZCIsIGNsYXNzX29ic2N1cmUsIHRocmVhZGxpc3RfdXBkYXRlX3Rlc3RfY21kLAorCSAgICJJdGVyYXRlIHRocm91Z2ggdXBkYXRpbmcgYWxsIHJlbW90ZSB0aHJlYWQgaW5mbyIpOworICBhZGRfY29tICgidGFsaXZlIiwgY2xhc3Nfb2JzY3VyZSwgdGhyZWFkYWxpdmVfdGVzdCwKKwkgICAiIFJlbW90ZSB0aHJlYWQgYWxpdmUgdGVzdCAiKTsKK30KKworI2VuZGlmIC8qIDAgKi8KKworc3RhdGljIHZvaWQKK2luaXRfcmVtb3RlX29wcyAoKQoreworICByZW1vdGVfb3BzLnRvX3Nob3J0bmFtZSA9ICJyZW1vdGUiOwkJCisgIHJlbW90ZV9vcHMudG9fbG9uZ25hbWUgPSAiUmVtb3RlIHNlcmlhbCB0YXJnZXQgaW4gZ2RiLXNwZWNpZmljIHByb3RvY29sIjsKKyAgcmVtb3RlX29wcy50b19kb2MgPSAKKyAgICAiVXNlIGEgcmVtb3RlIGNvbXB1dGVyIHZpYSBhIHNlcmlhbCBsaW5lLCB1c2luZyBhIGdkYi1zcGVjaWZpYyBwcm90b2NvbC5cblwKK1NwZWNpZnkgdGhlIHNlcmlhbCBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvIChlLmcuIC9kZXYvdHR5YSkuIjsgIAorICByZW1vdGVfb3BzLnRvX29wZW4gPSByZW1vdGVfb3BlbjsJCQorICByZW1vdGVfb3BzLnRvX2Nsb3NlID0gcmVtb3RlX2Nsb3NlOwkJCisgIHJlbW90ZV9vcHMudG9fZGV0YWNoID0gcmVtb3RlX2RldGFjaDsKKyAgcmVtb3RlX29wcy50b19yZXN1bWUgPSByZW1vdGVfcmVzdW1lOwkKKyAgcmVtb3RlX29wcy50b193YWl0ID0gcmVtb3RlX3dhaXQ7CisgIHJlbW90ZV9vcHMudG9fZmV0Y2hfcmVnaXN0ZXJzID0gcmVtb3RlX2ZldGNoX3JlZ2lzdGVyczsKKyAgcmVtb3RlX29wcy50b19zdG9yZV9yZWdpc3RlcnMgPSByZW1vdGVfc3RvcmVfcmVnaXN0ZXJzOworICByZW1vdGVfb3BzLnRvX3ByZXBhcmVfdG9fc3RvcmUgPSByZW1vdGVfcHJlcGFyZV90b19zdG9yZTsKKyAgcmVtb3RlX29wcy50b194ZmVyX21lbW9yeSA9IHJlbW90ZV94ZmVyX21lbW9yeTsJCisgIHJlbW90ZV9vcHMudG9fZmlsZXNfaW5mbyA9IHJlbW90ZV9maWxlc19pbmZvOwkKKyAgcmVtb3RlX29wcy50b19pbnNlcnRfYnJlYWtwb2ludCA9IHJlbW90ZV9pbnNlcnRfYnJlYWtwb2ludDsKKyAgcmVtb3RlX29wcy50b19yZW1vdmVfYnJlYWtwb2ludCA9IHJlbW90ZV9yZW1vdmVfYnJlYWtwb2ludDsKKyAgcmVtb3RlX29wcy50b19raWxsID0gcmVtb3RlX2tpbGw7CQkKKyAgcmVtb3RlX29wcy50b19sb2FkID0gZ2VuZXJpY19sb2FkOwkJCisgIHJlbW90ZV9vcHMudG9fbW91cm5faW5mZXJpb3IgPSByZW1vdGVfbW91cm47CisgIHJlbW90ZV9vcHMudG9fdGhyZWFkX2FsaXZlID0gcmVtb3RlX3RocmVhZF9hbGl2ZTsKKyAgcmVtb3RlX29wcy50b19zdG9wID0gcmVtb3RlX3N0b3A7CisgIHJlbW90ZV9vcHMudG9fcXVlcnkgPSByZW1vdGVfcXVlcnk7CisgIHJlbW90ZV9vcHMudG9fc3RyYXR1bSA9IHByb2Nlc3Nfc3RyYXR1bTsKKyAgcmVtb3RlX29wcy50b19oYXNfYWxsX21lbW9yeSA9IDE7CQorICByZW1vdGVfb3BzLnRvX2hhc19tZW1vcnkgPSAxOwkKKyAgcmVtb3RlX29wcy50b19oYXNfc3RhY2sgPSAxOwkKKyAgcmVtb3RlX29wcy50b19oYXNfcmVnaXN0ZXJzID0gMTsJCisgIHJlbW90ZV9vcHMudG9faGFzX2V4ZWN1dGlvbiA9IDE7CQorICByZW1vdGVfb3BzLnRvX2hhc190aHJlYWRfY29udHJvbCA9IHRjX3NjaGVkbG9jazsgLyogY2FuIGxvY2sgc2NoZWR1bGVyICovCisgIHJlbW90ZV9vcHMudG9fbWFnaWMgPSBPUFNfTUFHSUM7CQorfQorCisvKiBTZXQgdXAgdGhlIGV4dGVuZGVkIHJlbW90ZSB2ZWN0b3IgYnkgbWFraW5nIGEgY29weSBvZiB0aGUgc3RhbmRhcmQKKyAgIHJlbW90ZSB2ZWN0b3IgYW5kIGFkZGluZyB0byBpdC4gICovCisKK3N0YXRpYyB2b2lkCitpbml0X2V4dGVuZGVkX3JlbW90ZV9vcHMgKCkKK3sKKyAgZXh0ZW5kZWRfcmVtb3RlX29wcyA9IHJlbW90ZV9vcHM7CisKKyAgZXh0ZW5kZWRfcmVtb3RlX29wcy50b19zaG9ydG5hbWUgPSAiZXh0ZW5kZWQtcmVtb3RlIjsJCisgIGV4dGVuZGVkX3JlbW90ZV9vcHMudG9fbG9uZ25hbWUgPSAKKyAgICAiRXh0ZW5kZWQgcmVtb3RlIHNlcmlhbCB0YXJnZXQgaW4gZ2RiLXNwZWNpZmljIHByb3RvY29sIjsKKyAgZXh0ZW5kZWRfcmVtb3RlX29wcy50b19kb2MgPSAKKyAgICAiVXNlIGEgcmVtb3RlIGNvbXB1dGVyIHZpYSBhIHNlcmlhbCBsaW5lLCB1c2luZyBhIGdkYi1zcGVjaWZpYyBwcm90b2NvbC5cblwKK1NwZWNpZnkgdGhlIHNlcmlhbCBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvIChlLmcuIC9kZXYvdHR5YSkuIiwKKyAgZXh0ZW5kZWRfcmVtb3RlX29wcy50b19vcGVuID0gZXh0ZW5kZWRfcmVtb3RlX29wZW47CQorICBleHRlbmRlZF9yZW1vdGVfb3BzLnRvX2NyZWF0ZV9pbmZlcmlvciA9IGV4dGVuZGVkX3JlbW90ZV9jcmVhdGVfaW5mZXJpb3I7CisgIGV4dGVuZGVkX3JlbW90ZV9vcHMudG9fbW91cm5faW5mZXJpb3IgPSBleHRlbmRlZF9yZW1vdGVfbW91cm47Cit9IAorCit2b2lkCitfaW5pdGlhbGl6ZV9yZW1vdGUgKCkKK3sKKyAgaW5pdF9yZW1vdGVfb3BzICgpOworICBhZGRfdGFyZ2V0ICgmcmVtb3RlX29wcyk7CisKKyAgaW5pdF9leHRlbmRlZF9yZW1vdGVfb3BzICgpOworICBhZGRfdGFyZ2V0ICgmZXh0ZW5kZWRfcmVtb3RlX29wcyk7CisgIGluaXRfcmVtb3RlX3RocmVhZHMgKCk7CisjaWYgMAorICBpbml0X3JlbW90ZV90aHJlYWR0ZXN0cyAoKTsKKyNlbmRpZgorCisgIGFkZF9jbWQgKCJjb21wYXJlLXNlY3Rpb25zIiwgY2xhc3Nfb2JzY3VyZSwgY29tcGFyZV9zZWN0aW9uc19jb21tYW5kLCAKKwkgICAiQ29tcGFyZSBzZWN0aW9uIGRhdGEgb24gdGFyZ2V0IHRvIHRoZSBleGVjIGZpbGUuXG5cCitBcmd1bWVudCBpcyBhIHNpbmdsZSBzZWN0aW9uIG5hbWUgKGRlZmF1bHQ6IGFsbCBsb2FkZWQgc2VjdGlvbnMpLiIsIAorCSAgICZjbWRsaXN0KTsKKworICBhZGRfY21kICgicGFja2V0IiwgY2xhc3NfbWFpbnRlbmFuY2UsIHBhY2tldF9jb21tYW5kLAorCSAgICJTZW5kIGFuIGFyYml0cmFyeSBwYWNrZXQgdG8gYSByZW1vdGUgdGFyZ2V0LlxuXAorICAgbWFpbnRlbmFuY2UgcGFja2V0IFRFWFRcblwKK0lmIEdEQiBpcyB0YWxraW5nIHRvIGFuIGluZmVyaW9yIHZpYSB0aGUgR0RCIHNlcmlhbCBwcm90b2NvbCwgdGhlblxuXAordGhpcyBjb21tYW5kIHNlbmRzIHRoZSBzdHJpbmcgVEVYVCB0byB0aGUgaW5mZXJpb3IsIGFuZCBkaXNwbGF5cyB0aGVcblwKK3Jlc3BvbnNlIHBhY2tldC4gIEdEQiBzdXBwbGllcyB0aGUgaW5pdGlhbCBgJCcgY2hhcmFjdGVyLCBhbmQgdGhlXG5cCit0ZXJtaW5hdGluZyBgIycgY2hhcmFjdGVyIGFuZCBjaGVja3N1bS4iLAorCSAgICZtYWludGVuYW5jZWxpc3QpOworCisgIGFkZF9zaG93X2Zyb21fc2V0IAorICAgIChhZGRfc2V0X2NtZCAoInJlbW90ZXRpbWVvdXQiLCBub19jbGFzcywKKwkJICB2YXJfaW50ZWdlciwgKGNoYXIgKikmcmVtb3RlX3RpbWVvdXQsCisJCSAgIlNldCB0aW1lb3V0IHZhbHVlIGZvciByZW1vdGUgcmVhZC5cbiIsCisJCSAgJnNldGxpc3QpLAorICAgICAmc2hvd2xpc3QpOworCisgIGFkZF9zaG93X2Zyb21fc2V0IAorICAgIChhZGRfc2V0X2NtZCAoInJlbW90ZWJyZWFrIiwgbm9fY2xhc3MsCisJCSAgdmFyX2ludGVnZXIsIChjaGFyICopJnJlbW90ZV9icmVhaywKKwkJICAiU2V0IHdoZXRoZXIgdG8gc2VuZCBicmVhayBpZiBpbnRlcnJ1cHRlZC5cbiIsCisJCSAgJnNldGxpc3QpLAorICAgICAmc2hvd2xpc3QpOworCisgIGFkZF9zaG93X2Zyb21fc2V0IAorICAgIChhZGRfc2V0X2NtZCAoInJlbW90ZXdyaXRlc2l6ZSIsIG5vX2NsYXNzLAorCQkgIHZhcl9pbnRlZ2VyLCAoY2hhciAqKSZyZW1vdGVfd3JpdGVfc2l6ZSwKKwkJICAiU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBwZXIgbWVtb3J5IHdyaXRlIHBhY2tldC5cbiIsCisJCSAgJnNldGxpc3QpLAorICAgICAmc2hvd2xpc3QpOworCisgIHJlbW90ZV9hZGRyZXNzX3NpemUgPSBUQVJHRVRfUFRSX0JJVDsKKyAgYWRkX3Nob3dfZnJvbV9zZXQgCisgICAgKGFkZF9zZXRfY21kICgicmVtb3RlYWRkcmVzc3NpemUiLCBjbGFzc19vYnNjdXJlLAorCQkgIHZhcl9pbnRlZ2VyLCAoY2hhciAqKSZyZW1vdGVfYWRkcmVzc19zaXplLAorCQkgICJTZXQgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgYWRkcmVzcyAoaW4gYml0cykgXAoraW4gYSBtZW1vcnkgcGFja2V0LlxuIiwKKwkJICAmc2V0bGlzdCksCisgICAgICZzaG93bGlzdCk7ICAKKworICBhZGRfc2hvd19mcm9tX3NldCAoYWRkX3NldF9jbWQgKCJyZW1vdGViaW5hcnlkb3dubG9hZCIsIG5vX2NsYXNzLAorCQkJCSAgdmFyX2Jvb2xlYW4sIChjaGFyICopICZyZW1vdGVfYmluYXJ5X2Rvd25sb2FkLAorCQkJCSAgIlNldCBiaW5hcnkgZG93bmxvYWRzLlxuIiwgJnNldGxpc3QpLAorCQkgICAgICZzaG93bGlzdCk7Cit9CmRpZmYgLS1naXQgYS9nZGIvcmVwbHlfbWlnX2hhY2suYXdrIGIvZ2RiL3JlcGx5X21pZ19oYWNrLmF3awpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTBhNDBjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JlcGx5X21pZ19oYWNrLmF3awpAQCAtMCwwICsxLDEyMyBAQAorIyBSZXBseSBzZXJ2ZXIgbWlnLW91dHB1dCBtYXNzYWdlcgorIworIyAgIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgICBXcml0dGVuIGJ5IE1pbGVzIEJhZGVyIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0CisjICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorIworIyBUaGlzIGF3ayBzY3JpcHQgaGFja3MgdGhlIG91dHB1dCBvZiBtaWctZ2VuZXJhdGVkIHJlcGx5IHNlcnZlciBjb2RlCisjIHNvIHRoYXQgaXQgYWxsb3dzIHJlcGxpZXMgd2l0aCBqdXN0IHRoZSBlcnJvci1jb2RlIGluIHRoZW0gKGFzIHRoaXMgaXMKKyMgaG93IG1pZyByZXR1cm5zIGVycm9ycykuCisjCisjIEl0IGlzIGhpZ2hseSwgaGlnaGx5LCBkZXBlbmRlbnQgb24gdGhlIGV4YWN0IGZvcm1hdCBvZiBtaWcgb3V0cHV0LiAgSWNrLgorIworCitCRUdJTiB7IHBhcnNlX3BoYXNlID0gMDsgfQorCisvXn0vIHsgcGFyc2VfcGhhc2UgPSAwOyB9CisKK3BhcnNlX3BoYXNlID09IDAgJiYgL15taWdfaW50ZXJuYWwgdm9pZCBfWFthLXpBLVowLTlfXSpfcmVwbHkvIHsKKyAgIyBUaGUgc3RhcnQgb2YgYSBtaWcgc2VydmVyIHJvdXRpbmUuICBSZXNldCBldmVyeXRoaW5nLiAgTm90ZSB0aGF0IHdlIG9ubHkKKyAgIyBtZXNzIHdpdGggcnBjcyB0aGF0IGhhdmUgdGhlIHN1ZmZpeCBgX3JlcGx5Jy4KKyAgbnVtX2FyZ3MgPSAwOworICBudW1fY2hlY2tzID0gMDsKKyAgcGFyc2VfcGhhc2UgPSAxOworICBwcmludDsgbmV4dDsKK30KKworcGFyc2VfcGhhc2UgPT0gMSAmJiAvXltcdCBdKnR5cGVkZWYgc3RydWN0LyB7CisgICMgVGhlIGZpcnN0IHN0cnVjdHVyZSBpbiB0aGUgc2VydmVyIHJvdXRpbmUgc2hvdWxkIGRlc2NyaWJlIHRoZSBhcmd1bWVudHMKKyAgcGFyc2VfcGhhc2UgPSAyOworICBwcmludDsgbmV4dDsKK30KKworcGFyc2VfcGhhc2UgPT0gMiB7CisgICMgVGhlIG1lc3NhZ2UgaGVhZGVyIGZpZWxkIGluIHRoZSBhcmdzIHN0cnVjdHVyZSwgd2hpY2ggc2tpcC4KKyAgcGFyc2VfcGhhc2UgPSAzOworICBwcmludDsgbmV4dDsKK30KKworcGFyc2VfcGhhc2UgPT0gMyAmJiAvfS8geworICAjIFRoZSBhcmdzIHN0cnVjdHVyZSBpcyBvdmVyLgorICBpZiAobnVtX2FyZ3MgPiAxKQorICAgIHBhcnNlX3BoYXNlID0gNTsKKyAgZWxzZQorICAgICMgVGhlcmUncyBubyBleHRyYSBhcmdzIHRoYXQgY291bGQgc2NyZXcgdXAgdGhlIG5vcm1hbCBtZWNoYW5pc20gZm9yCisgICAgIyBlcnJvciByZXR1cm5zLCBzbyB3ZSBkb24ndCBoYXZlIHRvIGluc2VydCBhbnkgbmV3IGNvZGUuCisgICAgcGFyc2VfcGhhc2UgPSAwOworICBwcmludDsgbmV4dDsKK30KKworcGFyc2VfcGhhc2UgPT0gMyB7CisgICMgVGhlIHR5cGUgZmllbGQgZm9yIGFuIGFyZ3VtZW50LgorICBhcmdfdHlwZV9jb2RlX25hbWVbbnVtX2FyZ3NdID0gJDI7CisgIHN1YiAoLzskLywgIiIsIGFyZ190eXBlX2NvZGVfbmFtZVtudW1fYXJnc10pICMgR2V0IHJpZCBvZiB0aGUgc2VtaS1jb2xvbgorICBwYXJzZV9waGFzZSA9IDQ7CisgIHByaW50OyBuZXh0OworfQorCitwYXJzZV9waGFzZSA9PSA0IHsKKyAgIyBUaGUgdmFsdWUgZmllbGQgZm9yIGFuIGFyZ3VtZW50LgorICBhcmdfbmFtZVtudW1fYXJnc10gPSAkMjsKKyAgc3ViICgvOyQvLCAiIiwgYXJnX25hbWVbbnVtX2FyZ3NdKSAjIEdldCByaWQgb2YgdGhlIHNlbWktY29sb24KKyAgYXJnX3R5cGVbbnVtX2FyZ3NdID0gJDE7CisgIG51bV9hcmdzKys7CisgIHBhcnNlX3BoYXNlID0gMzsKKyAgcHJpbnQ7IG5leHQ7Cit9CisKK3BhcnNlX3BoYXNlID09IDUgJiYgL15bIFx0XSpzdGF0aWMgY29uc3QgbWFjaF9tc2dfdHlwZV90LyB7CisgICMgVGhlIHR5cGUgY2hlY2sgc3RydWN0dXJlIGZvciBhbiBhcmd1bWVudC4KKyAgYXJnX2NoZWNrX25hbWVbbnVtX2NoZWNrc10gPSAkNDsKKyAgbnVtX2NoZWNrcysrOworICBwcmludDsgbmV4dDsKK30KKworcGFyc2VfcGhhc2UgPT0gNSAmJiAvXlsgXHRdKm1pZ19leHRlcm5hbCBrZXJuX3JldHVybl90LyB7CisgICMgVGhlIGRlY2xhcmF0aW9uIG9mIHRoZSB1c2VyIHNlcnZlciBmdW5jdGlvbiBmb3IgdGhpcyBycGMuCisgIHVzZXJfZnVuY3Rpb25fbmFtZSA9ICQzOworICBwcmludDsgbmV4dDsKK30KKworcGFyc2VfcGhhc2UgPT0gNSAmJiAvXiNpZlsgXHRdVHlwZUNoZWNrLyB7CisgICMgVGhlIGZpcnN0IGFyZ3MgdHlwZSBjaGVja2luZyBzdGF0ZW1lbnQ7IHdlIG5lZWQgdG8gaW5zZXJ0IG91ciBjaHVuayBvZgorICAjIGNvZGUgdGhhdCBieXBhc3NlcyBhbGwgdGhlIHR5cGUgY2hlY2tzIGlmIHRoaXMgaXMgYW4gZXJyb3IgcmV0dXJuLCBhZnRlcgorICAjIHdoaWNoIHdlJ3JlIGRvbmUgdW50aWwgd2UgZ2V0IHRvIHRoZSBuZXh0IGZ1bmN0aW9uLiAgSGFuZGlseSwgdGhlIHNpemUKKyAgIyBvZiBtaWcncyBSZXBseSBzdHJ1Y3R1cmUgaXMgYWxzbyB0aGUgc2l6ZSBvZiB0aGUgYWx0ZXJuYXRlIFJlcXVlc3QgCisgICMgc3RydWN0dXJlIHRoYXQgd2Ugd2FudCB0byBjaGVjayBmb3IuCisgIHByaW50ICJcdGlmIChJbjBQLT5IZWFkLm1zZ2hfc2l6ZSA9PSBzaXplb2YgKFJlcGx5KSI7CisgIHByaW50ICJcdCAgICAmJiAhIChJbjBQLT5IZWFkLm1zZ2hfYml0cyAmIE1BQ0hfTVNHSF9CSVRTX0NPTVBMRVgpIjsKKyAgcHJpbnQgIlx0ICAgICYmICooaW50ICopJkluMFAtPiIgYXJnX3R5cGVfY29kZV9uYW1lWzBdICIgPT0gKihpbnQgKikmIiBhcmdfY2hlY2tfbmFtZVswXTsKKyAgcHJpbnQgIlx0ICAgICYmIEluMFAtPiIgYXJnX25hbWVbMF0gIiAhPSAwKSI7CisgIHByaW50ICJcdCAgLyogRXJyb3IgcmV0dXJuLCBvbmx5IHRoZSBlcnJvciBjb2RlIGFyZ3VtZW50IGlzIHBhc3NlZC4gICovIjsKKyAgcHJpbnQgIlx0ICB7IjsKKyAgIyBGb3JjZSB0aGUgZnVuY3Rpb24gaW50byBhIHR5cGUgdGhhdCBvbmx5IHRha2VzIHRoZSBmaXJzdCB0d28gYXJncywgdmlhCisgICMgdGhlIHRlbXAgdmFyaWFibGUgU0ZVTiAoaXMgdGhlcmUgYW5vdGhlciB3YXkgdG8gY29ycmVjdGx5IGRvIHRoaXMgY2FzdD8pLgorICAjIFRoaXMgaXMgcG9zc2libHkgYm9ndXMsIGJ1dCBlYXNpZXIgdGhhbiBzdXBwbHlpbmcgYm9ndXMgdmFsdWVzIGZvciBhbGwKKyAgIyB0aGUgb3RoZXIgYXJncyAod2UgY2FuJ3QganVzdCBwYXNzIDAgZm9yIHRoZW0sIGFzIHRoZXkgbWlnaHQgbm90IGJlIHNjYWxhcikuCisgIHByaW50ZiAoIlx0ICAgIGtlcm5fcmV0dXJuX3QgKCpzZnVuKShtYWNoX3BvcnRfdCIpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2FyZ3M7IGkrKykKKyAgICBwcmludGYgKCIsICVzIiwgYXJnX3R5cGVbaV0pOworICBwcmludGYgKCIpID0gJXM7XG4iLCB1c2VyX2Z1bmN0aW9uX25hbWUpOworICBwcmludCAiXHQgICAgT3V0UC0+UmV0Q29kZSA9ICgqKGtlcm5fcmV0dXJuX3QgKCopKG1hY2hfcG9ydF90LCBrZXJuX3JldHVybl90KSlzZnVuKSAoSW4wUC0+SGVhZC5tc2doX3JlcXVlc3RfcG9ydCwgSW4wUC0+IiBhcmdfbmFtZVswXSAiKTsiOworICBwcmludCAiXHQgICAgcmV0dXJuOyI7CisgIHByaW50ICJcdCAgfSI7CisgIHByaW50ICIiOworICBwYXJzZV9waGFzZSA9IDA7CisgIHByaW50OyBuZXh0OworfQorCit7IHByaW50OyB9CmRpZmYgLS1naXQgYS9nZGIvcm9tNjhrLXJvbS5jIGIvZ2RiL3JvbTY4ay1yb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzFkMjk5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3JvbTY4ay1yb20uYwpAQCAtMCwwICsxLDE2OSBAQAorLyogUmVtb3RlIHRhcmdldCBnbHVlIGZvciB0aGUgUk9NNjhLIFJPTSBtb25pdG9yLgorICAgQ29weXJpZ2h0IDE5ODgsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAibW9uaXRvci5oIgorI2luY2x1ZGUgInNlcmlhbC5oIgorCitzdGF0aWMgdm9pZCByb202OGtfb3BlbiBQQVJBTVMgKChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpKTsKKworc3RhdGljIHZvaWQKK3JvbTY4a19zdXBwbHlfcmVnaXN0ZXIgKHJlZ25hbWUsIHJlZ25hbWVsZW4sIHZhbCwgdmFsbGVuKQorICAgICBjaGFyICpyZWduYW1lOworICAgICBpbnQgcmVnbmFtZWxlbjsKKyAgICAgY2hhciAqdmFsOworICAgICBpbnQgdmFsbGVuOworeworICBpbnQgbnVtcmVnczsKKyAgaW50IHJlZ25vOworCisgIG51bXJlZ3MgPSAxOworICByZWdubyA9IC0xOworCisgIGlmIChyZWduYW1lbGVuID09IDIpCisgICAgc3dpdGNoIChyZWduYW1lWzBdKQorICAgICAgeworICAgICAgY2FzZSAnUyc6CisJaWYgKHJlZ25hbWVbMV0gPT0gJ1InKQorCSAgcmVnbm8gPSBQU19SRUdOVU07CisJYnJlYWs7CisgICAgICBjYXNlICdQJzoKKwlpZiAocmVnbmFtZVsxXSA9PSAnQycpCisJICByZWdubyA9IFBDX1JFR05VTTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ0QnOgorCWlmIChyZWduYW1lWzFdICE9ICdSJykKKwkgIGJyZWFrOworCXJlZ25vID0gRDBfUkVHTlVNOworCW51bXJlZ3MgPSA4OworCWJyZWFrOworICAgICAgY2FzZSAnQSc6CisJaWYgKHJlZ25hbWVbMV0gIT0gJ1InKQorCSAgYnJlYWs7CisJcmVnbm8gPSBBMF9SRUdOVU07CisJbnVtcmVncyA9IDc7CisJYnJlYWs7CisgICAgICB9CisgIGVsc2UgaWYgKHJlZ25hbWVsZW4gPT0gMykKKyAgICBzd2l0Y2ggKHJlZ25hbWVbMF0pCisgICAgICB7CisgICAgICBjYXNlICdJJzoKKwlpZiAocmVnbmFtZVsxXSA9PSAnUycgJiYgcmVnbmFtZVsyXSA9PSAnUCcpCisJICByZWdubyA9IFNQX1JFR05VTTsKKyAgICAgIH0KKworICBpZiAocmVnbm8gPj0gMCkKKyAgICB3aGlsZSAobnVtcmVncy0tID4gMCkKKyAgICAgIHZhbCA9IG1vbml0b3Jfc3VwcGx5X3JlZ2lzdGVyIChyZWdubysrLCB2YWwpOworfQorCisvKiBUaGlzIGFycmF5IG9mIHJlZ2lzdGVycyBuZWVkIHRvIG1hdGNoIHRoZSBpbmRleGVzIHVzZWQgYnkgR0RCLgorICAgVGhpcyBleGlzdHMgYmVjYXVzZSB0aGUgdmFyaW91cyBST00gbW9uaXRvcnMgdXNlIGRpZmZlcmVudCBzdHJpbmdzCisgICB0aGFuIGRvZXMgR0RCLCBhbmQgZG9uJ3QgbmVjZXNzYXJpbHkgc3VwcG9ydCBhbGwgdGhlIHJlZ2lzdGVycworICAgZWl0aGVyLiBTbywgdHlwaW5nICJpbmZvIHJlZyBzcCIgYmVjb21lcyBhICJyMzAiLiAgKi8KKworc3RhdGljIGNoYXIgKnJvbTY4a19yZWduYW1lc1tOVU1fUkVHU10gPSB7CisgICJEMCIsICJEMSIsICJEMiIsICJEMyIsICJENCIsICJENSIsICJENiIsICJENyIsCisgICJBMCIsICJBMSIsICJBMiIsICJBMyIsICJBNCIsICJBNSIsICJBNiIsICJJU1AiLAorICAiU1IiLCAiUEMiIH07CisKKy8qIERlZmluZSB0aGUgbW9uaXRvciBjb21tYW5kIHN0cmluZ3MuIFNpbmNlIHRoZXNlIGFyZSBwYXNzZWQgZGlyZWN0bHkKKyAgIHRocm91Z2ggdG8gYSBwcmludGYgc3R5bGUgZnVuY3Rpb24sIHdlIG1heSBpbmNsdWRlIGZvcm1hdHRpbmcKKyAgIHN0cmluZ3MuIFdlIGFsc28gbmVlZCBhIENSIG9yIExGIG9uIHRoZSBlbmQuICAqLworCitzdGF0aWMgc3RydWN0IHRhcmdldF9vcHMgcm9tNjhrX29wczsKKworc3RhdGljIGNoYXIgKnJvbTY4a19pbml0c1tdID0geyIuXHJcciIsIE5VTEx9OyAvKiBFeGl0cyBwbS9wciAmIGRvd25sb2FkIGNtZHMgKi8KKworc3RhdGljIHN0cnVjdCBtb25pdG9yX29wcyByb202OGtfY21kcyA7CisKK3N0YXRpYyB2b2lkIAoraW5pdF9yb202OGtfY21kcyh2b2lkKQoreworICByb202OGtfY21kcy5mbGFncyA9ICAgMDsKKyAgcm9tNjhrX2NtZHMuaW5pdCA9ICAgcm9tNjhrX2luaXRzOyAvKiBtb25pdG9yIGluaXQgc3RyaW5nICovCisgIHJvbTY4a19jbWRzLmNvbnQgPSAgICJnb1xyIjsKKyAgcm9tNjhrX2NtZHMuc3RlcCA9ICAgInN0XHIiOworICByb202OGtfY21kcy5zdG9wID0gICBOVUxMOworICByb202OGtfY21kcy5zZXRfYnJlYWsgPSAgICJkYiAleFxyIjsKKyAgcm9tNjhrX2NtZHMuY2xyX2JyZWFrID0gICAiY2IgJXhcciI7CisgIHJvbTY4a19jbWRzLmNscl9hbGxfYnJlYWsgPSAgICJjYiAqXHIiOworICByb202OGtfY21kcy5maWxsID0gICAiZm0gJXggJXggJXhcciI7CisgIHJvbTY4a19jbWRzLnNldG1lbS5jbWRiID0gICAgICJwbSAleCAleFxyIjsKKyAgcm9tNjhrX2NtZHMuc2V0bWVtLmNtZHcgPSAgICAgInBtO3cgJXggJXhcciI7CisgIHJvbTY4a19jbWRzLnNldG1lbS5jbWRsID0gICAgICJwbTtsICV4ICV4XHIiOworICByb202OGtfY21kcy5zZXRtZW0uY21kbGwgPSAgICAgTlVMTDsKKyAgcm9tNjhrX2NtZHMuc2V0bWVtLnJlc3BfZGVsaW0gPSAgICAgTlVMTDsKKyAgcm9tNjhrX2NtZHMuc2V0bWVtLnRlcm0gPSAgICAgTlVMTDsKKyAgcm9tNjhrX2NtZHMuc2V0bWVtLnRlcm1fY21kID0gICAgIE5VTEw7CisgIHJvbTY4a19jbWRzLmdldG1lbS5jbWRiID0gICAgICJkbSAleCAleFxyIjsKKyAgcm9tNjhrX2NtZHMuZ2V0bWVtLmNtZHcgPSAgICAgImRtO3cgJXggJXhcciI7CisgIHJvbTY4a19jbWRzLmdldG1lbS5jbWRsID0gICAgICJkbTtsICV4ICV4XHIiOworICByb202OGtfY21kcy5nZXRtZW0uY21kbGwgPSAgICAgTlVMTDsKKyAgcm9tNjhrX2NtZHMuZ2V0bWVtLnJlc3BfZGVsaW0gPSAgICAgIiAgIjsKKyAgcm9tNjhrX2NtZHMuZ2V0bWVtLnRlcm0gPSAgICAgTlVMTDsKKyAgICByb202OGtfY21kcy5nZXRtZW0udGVybV9jbWQgPSAgICAgTlVMTDsKKyAgcm9tNjhrX2NtZHMuc2V0cmVnLmNtZCA9ICAgICAicHIgJXMgJXhcciI7CisgIHJvbTY4a19jbWRzLnNldHJlZy5yZXNwX2RlbGltID0gICAgIE5VTEw7CisgIHJvbTY4a19jbWRzLnNldHJlZy50ZXJtID0gICAgIE5VTEw7CisgIHJvbTY4a19jbWRzLnNldHJlZy50ZXJtX2NtZCA9ICAgICBOVUxMIDsKKyAgcm9tNjhrX2NtZHMuZ2V0cmVnLmNtZCA9ICAgICAicHIgJXNcciIgOworICByb202OGtfY21kcy5nZXRyZWcucmVzcF9kZWxpbSA9ICAgICAiOiAgIiA7CisgIHJvbTY4a19jbWRzLmdldHJlZy50ZXJtID0gICAgICI9ICIgOworICByb202OGtfY21kcy5nZXRyZWcudGVybV9jbWQgPSAgICAgIjtcciIgOworICByb202OGtfY21kcy5kdW1wX3JlZ2lzdGVycyA9ICAgImRyXHIiIDsKKyAgcm9tNjhrX2NtZHMucmVnaXN0ZXJfcGF0dGVybiA9CisgICAgIlxcKFxcdytcXCk9XFwoWzAtOWEtZkEtRl0rXFwoICtbMC05YS1mQS1GXStcXGJcXCkqXFwpIiA7CisgIHJvbTY4a19jbWRzLnN1cHBseV9yZWdpc3RlciA9ICAgcm9tNjhrX3N1cHBseV9yZWdpc3RlcjsKKyAgcm9tNjhrX2NtZHMubG9hZF9yb3V0aW5lID0gICBOVUxMOworICByb202OGtfY21kcy5sb2FkID0gICAiZGNcciI7CisgIHJvbTY4a19jbWRzLmxvYWRyZXNwID0gICAiV2FpdGluZyBmb3IgUy1yZWNvcmRzIGZyb20gaG9zdDsuLiAiOworICByb202OGtfY21kcy5wcm9tcHQgPSAgICJST002OEsgOi0+ICI7CisgIHJvbTY4a19jbWRzLmxpbmVfdGVybSA9ICAgIlxyIjsKKyAgcm9tNjhrX2NtZHMuY21kX2VuZCA9ICAgIjtcciI7CisgIHJvbTY4a19jbWRzLnRhcmdldCA9ICAgJnJvbTY4a19vcHM7CisgIHJvbTY4a19jbWRzLnN0b3BiaXRzID0gICBTRVJJQUxfMV9TVE9QQklUUzsKKyAgcm9tNjhrX2NtZHMucmVnbmFtZXMgPSAgIHJvbTY4a19yZWduYW1lczsKKyAgcm9tNjhrX2NtZHMubWFnaWMgPSAgIE1PTklUT1JfT1BTX01BR0lDIDsKK30gLyogaW5pdF9yb202OGtfY21kcyAqLworCitzdGF0aWMgdm9pZAorcm9tNjhrX29wZW4gKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIG1vbml0b3Jfb3BlbiAoYXJncywgJnJvbTY4a19jbWRzLCBmcm9tX3R0eSk7Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX3JvbTY4ayAoKQoreworICBpbml0X3JvbTY4a19jbWRzKCkgOworICBpbml0X21vbml0b3Jfb3BzICgmcm9tNjhrX29wcyk7CisKKyAgcm9tNjhrX29wcy50b19zaG9ydG5hbWUgPSAicm9tNjhrIjsKKyAgcm9tNjhrX29wcy50b19sb25nbmFtZSA9ICJSb202OGsgZGVidWcgbW9uaXRvciBmb3IgdGhlIElEUCBFdmFsIGJvYXJkIjsKKyAgcm9tNjhrX29wcy50b19kb2MgPSAiRGVidWcgb24gYSBNb3Rvcm9sYSBJRFAgZXZhbCBib2FyZCBydW5uaW5nIHRoZSBST002OEsgbW9uaXRvci5cblwKK1NwZWNpZnkgdGhlIHNlcmlhbCBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvIChlLmcuIC9kZXYvdHR5YSkuIjsKKyAgcm9tNjhrX29wcy50b19vcGVuID0gcm9tNjhrX29wZW47CisKKyAgYWRkX3RhcmdldCAoJnJvbTY4a19vcHMpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3JzNjAwMC1uYXQuYyBiL2dkYi9yczYwMDAtbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc0YTM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yczYwMDAtbmF0LmMKQEAgLTAsMCArMSw4NDUgQEAKKy8qIElCTSBSUy82MDAwIG5hdGl2ZS1kZXBlbmRlbnQgY29kZSBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTEsIDE5OTIsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgKKwkgICAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAieGNvZmZzb2xpYi5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIKKyNpbmNsdWRlICJvYmpmaWxlcy5oIgorI2luY2x1ZGUgImxpYmJmZC5oIiAgLyogRm9yIGJmZF9jYWNoZV9sb29rdXAgKEZJWE1FKSAqLworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImdkYi1zdGFicy5oIgorCisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorI2luY2x1ZGUgPHN5cy9yZWcuaD4KKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9kaXIuaD4KKyNpbmNsdWRlIDxzeXMvdXNlci5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDxhLm91dC5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSAiZ2RiX3N0YXQuaCIKKyNpbmNsdWRlIDxzeXMvY29yZS5oPgorI2luY2x1ZGUgPHN5cy9sZHIuaD4KKworZXh0ZXJuIGludCBlcnJubzsKKworZXh0ZXJuIHN0cnVjdCB2bWFwICogbWFwX3ZtYXAgUEFSQU1TICgoYmZkICpiZiwgYmZkICphcmNoKSk7CisKK2V4dGVybiBzdHJ1Y3QgdGFyZ2V0X29wcyBleGVjX29wczsKKworc3RhdGljIHZvaWQKK3ZtYXBfZXhlYyBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkCit2bWFwX2xkaW5mbyBQQVJBTVMgKChzdHJ1Y3QgbGRfaW5mbyAqKSk7CisKK3N0YXRpYyBzdHJ1Y3Qgdm1hcCAqCithZGRfdm1hcCBQQVJBTVMgKChzdHJ1Y3QgbGRfaW5mbyAqKSk7CisKK3N0YXRpYyBpbnQKK29iamZpbGVfc3ltYm9sX2FkZCBQQVJBTVMgKChjaGFyICopKTsKKworc3RhdGljIHZvaWQKK3ZtYXBfc3ltdGFiIFBBUkFNUyAoKHN0cnVjdCB2bWFwICopKTsKKworc3RhdGljIHZvaWQKK2ZldGNoX2NvcmVfcmVnaXN0ZXJzIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgaW50LCBpbnQsIENPUkVfQUREUikpOworCitzdGF0aWMgdm9pZAorZXhlY19vbmVfZHVtbXlfaW5zbiBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkCitmaXh1cF9icmVha3BvaW50cyBQQVJBTVMgKChDT1JFX0FERFIgbG93LCBDT1JFX0FERFIgaGlnaCwgQ09SRV9BRERSIGRlbHRhKSk7CisKKy8qIENvbnZlcnNpb24gZnJvbSBnZGItdG8tc3lzdGVtIHNwZWNpYWwgcHVycG9zZSByZWdpc3RlciBudW1iZXJzLi4gKi8KKworc3RhdGljIGludCBzcGVjaWFsX3JlZ3NbXSA9IHsKKyAgSUFSLAkJCQkvKiBQQ19SRUdOVU0JKi8KKyAgTVNSLAkJCQkvKiBQU19SRUdOVU0JKi8KKyAgQ1IsCQkJCS8qIENSX1JFR05VTQkqLworICBMUiwJCQkJLyogTFJfUkVHTlVNCSovCisgIENUUiwJCQkJLyogQ1RSX1JFR05VTQkqLworICBYRVIsCQkJCS8qIFhFUl9SRUdOVU0gICAqLworICBNUQkJCQkvKiBNUV9SRUdOVU0JKi8KK307CisKK3ZvaWQKK2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pCisgIGludCByZWdubzsKK3sKKyAgaW50IGlpOworICBleHRlcm4gY2hhciByZWdpc3RlcnNbXTsKKworICBpZiAocmVnbm8gPCAwKSB7CQkJLyogZm9yIGFsbCByZWdpc3RlcnMgKi8KKworICAgIC8qIHJlYWQgMzIgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycy4gKi8KKworICAgIGZvciAoaWk9MDsgaWkgPCAzMjsgKytpaSkKKyAgICAgICooaW50KikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKGlpKV0gPSAKKwlwdHJhY2UgKFBUX1JFQURfR1BSLCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSBpaSwgMCwgMCk7CisKKyAgICAvKiByZWFkIGdlbmVyYWwgcHVycG9zZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMuICovCisKKyAgICBmb3IgKGlpPTA7IGlpIDwgMzI7ICsraWkpCisgICAgICBwdHJhY2UgKFBUX1JFQURfRlBSLCBpbmZlcmlvcl9waWQsIAorCSAgICAgIChQVFJBQ0VfQVJHM19UWVBFKSAmcmVnaXN0ZXJzIFtSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNK2lpKV0sCisJICAgICAgRlBSMCtpaSwgMCk7CisKKyAgICAvKiByZWFkIHNwZWNpYWwgcmVnaXN0ZXJzLiAqLworICAgIGZvciAoaWk9MDsgaWkgPD0gTEFTVF9VSVNBX1NQX1JFR05VTS1GSVJTVF9VSVNBX1NQX1JFR05VTTsgKytpaSkKKyAgICAgICooaW50KikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZJUlNUX1VJU0FfU1BfUkVHTlVNK2lpKV0gPSAKKwlwdHJhY2UgKFBUX1JFQURfR1BSLCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSBzcGVjaWFsX3JlZ3NbaWldLAorCQkwLCAwKTsKKworICAgIHJlZ2lzdGVyc19mZXRjaGVkICgpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIGVsc2UgYW4gaW5kaXZpZHVhbCByZWdpc3RlciBpcyBhZGRyZXNzZWQuICovCisKKyAgZWxzZSBpZiAocmVnbm8gPCBGUDBfUkVHTlVNKSB7CQkvKiBhIEdQUiAqLworICAgICooaW50KikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ25vKV0gPQorCXB0cmFjZSAoUFRfUkVBRF9HUFIsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIHJlZ25vLCAwLCAwKTsKKyAgfQorICBlbHNlIGlmIChyZWdubyA8PSBGUExBU1RfUkVHTlVNKSB7CQkvKiBhIEZQUiAqLworICAgIHB0cmFjZSAoUFRfUkVBRF9GUFIsIGluZmVyaW9yX3BpZCwKKwkgICAgKFBUUkFDRV9BUkczX1RZUEUpICZyZWdpc3RlcnMgW1JFR0lTVEVSX0JZVEUgKHJlZ25vKV0sCisJICAgIChyZWduby1GUDBfUkVHTlVNK0ZQUjApLCAwKTsKKyAgfQorICBlbHNlIGlmIChyZWdubyA8PSBMQVNUX1VJU0FfU1BfUkVHTlVNKSB7IC8qIGEgc3BlY2lhbCByZWdpc3RlciAqLworICAgICooaW50KikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ25vKV0gPQorCXB0cmFjZSAoUFRfUkVBRF9HUFIsIGluZmVyaW9yX3BpZCwKKwkJKFBUUkFDRV9BUkczX1RZUEUpIHNwZWNpYWxfcmVnc1tyZWduby1GSVJTVF9VSVNBX1NQX1JFR05VTV0sCisJCTAsIDApOworICB9CisgIGVsc2UKKyAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsIAorCQkJImdkYiBlcnJvcjogcmVnaXN0ZXIgbm8gJWQgbm90IGltcGxlbWVudGVkLlxuIiwKKwkJCXJlZ25vKTsKKworICByZWdpc3Rlcl92YWxpZCBbcmVnbm9dID0gMTsKK30KKworLyogU3RvcmUgb3VyIHJlZ2lzdGVyIHZhbHVlcyBiYWNrIGludG8gdGhlIGluZmVyaW9yLgorICAgSWYgUkVHTk8gaXMgLTEsIGRvIHRoaXMgZm9yIGFsbCByZWdpc3RlcnMuCisgICBPdGhlcndpc2UsIFJFR05PIHNwZWNpZmllcyB3aGljaCByZWdpc3RlciAoc28gd2UgY2FuIHNhdmUgdGltZSkuICAqLworCit2b2lkCitzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGV4dGVybiBjaGFyIHJlZ2lzdGVyc1tdOworCisgIGVycm5vID0gMDsKKworICBpZiAocmVnbm8gPT0gLTEpCisgICAgewkJCS8qIGZvciBhbGwgcmVnaXN0ZXJzLi4JKi8KKyAgICAgIGludCBpaTsKKworICAgICAgIC8qIGV4ZWN1dGUgb25lIGR1bW15IGluc3RydWN0aW9uICh3aGljaCBpcyBhIGJyZWFrcG9pbnQpIGluIGluZmVyaW9yCisgICAgICAgICAgcHJvY2Vzcy4gU28gZ2l2ZSBrZXJuZWwgYSBjaGFuY2UgdG8gZG8gaW50ZXJuYWwgaG91c2Uga2VlcGluZy4KKwkgIE90aGVyd2lzZSB0aGUgZm9sbG93aW5nIHB0cmFjZSgyKSBjYWxscyB3aWxsIG1lc3MgdXAgdXNlciBzdGFjaworCSAgc2luY2Uga2VybmVsIHdpbGwgZ2V0IGNvbmZ1c2VkIGFib3V0IHRoZSBib3R0b20gb2YgdGhlIHN0YWNrICglc3ApICovCisKKyAgICAgICBleGVjX29uZV9kdW1teV9pbnNuICgpOworCisgICAgICAvKiB3cml0ZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIGZpcnN0ISAqLworICAgICAgZm9yICggaWk9R1BSMDsgaWk8PUdQUjMxOyArK2lpKQorCXsKKwkgIHB0cmFjZSAoUFRfV1JJVEVfR1BSLCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSBpaSwKKwkJICAqKGludCopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChpaSldLCAwKTsKKwkgIGlmIChlcnJubykKKwkgICAgeyAKKwkgICAgICBwZXJyb3IgKCJwdHJhY2Ugd3JpdGVfZ3ByIik7CisJICAgICAgZXJybm8gPSAwOworCSAgICB9CisJfQorCisgICAgICAvKiB3cml0ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgbm93LiAqLworICAgICAgZm9yICggaWk9MDsgaWkgPCAzMjsgKytpaSkKKwl7CisJICBwdHJhY2UgKFBUX1dSSVRFX0ZQUiwgaW5mZXJpb3JfcGlkLCAKKwkJICAoUFRSQUNFX0FSRzNfVFlQRSkgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNK2lpKV0sCisJCSAgRlBSMCtpaSwgMCk7CisJICBpZiAoZXJybm8pCisJICAgIHsKKwkgICAgICBwZXJyb3IgKCJwdHJhY2Ugd3JpdGVfZnByIik7CisJICAgICAgZXJybm8gPSAwOworCSAgICB9CisJfQorCisgICAgICAvKiB3cml0ZSBzcGVjaWFsIHJlZ2lzdGVycy4gKi8KKyAgICAgIGZvciAoaWk9MDsgaWkgPD0gTEFTVF9VSVNBX1NQX1JFR05VTS1GSVJTVF9VSVNBX1NQX1JFR05VTTsgKytpaSkKKwl7CisJICBwdHJhY2UgKFBUX1dSSVRFX0dQUiwgaW5mZXJpb3JfcGlkLAorCQkgIChQVFJBQ0VfQVJHM19UWVBFKSBzcGVjaWFsX3JlZ3NbaWldLAorCQkgICooaW50KikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZJUlNUX1VJU0FfU1BfUkVHTlVNK2lpKV0sCisJCSAgMCk7CisJICBpZiAoZXJybm8pCisJICAgIHsKKwkgICAgICBwZXJyb3IgKCJwdHJhY2Ugd3JpdGVfZ3ByIik7CisJICAgICAgZXJybm8gPSAwOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBlbHNlLCBhIHNwZWNpZmljIHJlZ2lzdGVyIG51bWJlciBpcyBnaXZlbi4uLiAqLworCisgIGVsc2UgaWYgKHJlZ25vIDwgRlAwX1JFR05VTSkJCQkvKiBhIEdQUiAqLworICAgIHsKKyAgICAgIHB0cmFjZSAoUFRfV1JJVEVfR1BSLCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSByZWdubywKKwkgICAgICAqKGludCopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChyZWdubyldLCAwKTsKKyAgICB9CisKKyAgZWxzZSBpZiAocmVnbm8gPD0gRlBMQVNUX1JFR05VTSkJCS8qIGEgRlBSICovCisgICAgeworICAgICAgcHRyYWNlIChQVF9XUklURV9GUFIsIGluZmVyaW9yX3BpZCwgCisJICAgICAgKFBUUkFDRV9BUkczX1RZUEUpICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnbm8pXSwKKwkgICAgICByZWdubyAtIEZQMF9SRUdOVU0gKyBGUFIwLCAwKTsKKyAgICB9CisKKyAgZWxzZSBpZiAocmVnbm8gPD0gTEFTVF9VSVNBX1NQX1JFR05VTSkgLyogYSBzcGVjaWFsIHJlZ2lzdGVyICovCisgICAgeworICAgICAgcHRyYWNlIChQVF9XUklURV9HUFIsIGluZmVyaW9yX3BpZCwKKwkgICAgICAoUFRSQUNFX0FSRzNfVFlQRSkgc3BlY2lhbF9yZWdzIFtyZWduby1GSVJTVF9VSVNBX1NQX1JFR05VTV0sCisJICAgICAgKihpbnQqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAocmVnbm8pXSwgMCk7CisgICAgfQorCisgIGVsc2UKKyAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsCisJCQkiR2RiIGVycm9yOiByZWdpc3RlciBubyAlZCBub3QgaW1wbGVtZW50ZWQuXG4iLAorCQkJcmVnbm8pOworCisgIGlmIChlcnJubykKKyAgICB7CisgICAgICBwZXJyb3IgKCJwdHJhY2Ugd3JpdGUiKTsKKyAgICAgIGVycm5vID0gMDsKKyAgICB9Cit9CisKKy8qIEV4ZWN1dGUgb25lIGR1bW15IGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIHdheSB3ZSBnaXZlIHRoZSBrZXJuZWwKKyAgIGEgY2hhbmNlIHRvIGRvIHNvbWUgaG91c2VrZWVwaW5nIGFuZCB1cGRhdGUgaW5mZXJpb3IncyBpbnRlcm5hbCBkYXRhLAorICAgaW5jbHVkaW5nIHVfYXJlYS4gKi8KKworc3RhdGljIHZvaWQKK2V4ZWNfb25lX2R1bW15X2luc24gKCkKK3sKKyNkZWZpbmUJRFVNTVlfSU5TTl9BRERSCShURVhUX1NFR01FTlRfQkFTRSkrMHgyMDAKKworICBjaGFyIHNoYWRvd19jb250ZW50c1tCUkVBS1BPSU5UX01BWF07CS8qIFN0YXNoIG9sZCBia3B0IGFkZHIgY29udGVudHMgKi8KKyAgaW50IHN0YXR1cywgcGlkOworICBDT1JFX0FERFIgcHJldl9wYzsKKworICAvKiBXZSBwbGFudCBvbmUgZHVtbXkgYnJlYWtwb2ludCBpbnRvIERVTU1ZX0lOU05fQUREUiBhZGRyZXNzLiBXZQorICAgICBhc3N1bWUgdGhhdCB0aGlzIGFkZHJlc3Mgd2lsbCBuZXZlciBiZSBleGVjdXRlZCBhZ2FpbiBieSB0aGUgcmVhbAorICAgICBjb2RlLiAqLworCisgIHRhcmdldF9pbnNlcnRfYnJlYWtwb2ludCAoRFVNTVlfSU5TTl9BRERSLCBzaGFkb3dfY29udGVudHMpOworCisgIGVycm5vID0gMDsKKworICAvKiBZb3UgbWlnaHQgdGhpbmsgdGhpcyBjb3VsZCBiZSBkb25lIHdpdGggYSBzaW5nbGUgcHRyYWNlIGNhbGwsIGFuZAorICAgICB5b3UnZCBiZSBjb3JyZWN0IGZvciBqdXN0IGFib3V0IGV2ZXJ5IHBsYXRmb3JtIEkndmUgZXZlciB3b3JrZWQKKyAgICAgb24uICBIb3dldmVyLCByczYwMDAtaWJtLWFpeDQuMS4zIHNlZW1zIHRvIGhhdmUgc2NyZXdlZCB0aGlzIHVwIC0tCisgICAgIHRoZSBpbmZlcmlvciBuZXZlciBoaXRzIHRoZSBicmVha3BvaW50IChpdCdzIGFsc28gd29ydGggbm90aW5nCisgICAgIHBvd2VycGMtaWJtLWFpeDQuMS4zIHdvcmtzIGNvcnJlY3RseSkuICAqLworICBwcmV2X3BjID0gcmVhZF9wYyAoKTsKKyAgd3JpdGVfcGMgKERVTU1ZX0lOU05fQUREUik7CisgIHB0cmFjZSAoUFRfQ09OVElOVUUsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpMSwgMCwgMCk7CisKKyAgaWYgKGVycm5vKQorICAgIHBlcnJvciAoInB0X2NvbnRpbnVlIik7CisKKyAgZG8geworICAgIHBpZCA9IHdhaXQgKCZzdGF0dXMpOworICB9IHdoaWxlIChwaWQgIT0gaW5mZXJpb3JfcGlkKTsKKyAgICAKKyAgd3JpdGVfcGMgKHByZXZfcGMpOworICB0YXJnZXRfcmVtb3ZlX2JyZWFrcG9pbnQgKERVTU1ZX0lOU05fQUREUiwgc2hhZG93X2NvbnRlbnRzKTsKK30KKworc3RhdGljIHZvaWQKK2ZldGNoX2NvcmVfcmVnaXN0ZXJzIChjb3JlX3JlZ19zZWN0LCBjb3JlX3JlZ19zaXplLCB3aGljaCwgcmVnX2FkZHIpCisgICAgIGNoYXIgKmNvcmVfcmVnX3NlY3Q7CisgICAgIHVuc2lnbmVkIGNvcmVfcmVnX3NpemU7CisgICAgIGludCB3aGljaDsKKyAgICAgQ09SRV9BRERSIHJlZ19hZGRyOwkvKiBVbnVzZWQgaW4gdGhpcyB2ZXJzaW9uICovCit7CisgIC8qIGZldGNoIEdQUnMgYW5kIHNwZWNpYWwgcmVnaXN0ZXJzIGZyb20gdGhlIGZpcnN0IHJlZ2lzdGVyIHNlY3Rpb24KKyAgICAgaW4gY29yZSBiZmQuICovCisgIGlmICh3aGljaCA9PSAwKQorICAgIHsKKyAgICAgIC8qIGNvcHkgR1BScyBmaXJzdC4gKi8KKyAgICAgIG1lbWNweSAocmVnaXN0ZXJzLCBjb3JlX3JlZ19zZWN0LCAzMiAqIDQpOworCisgICAgICAvKiBnZGIncyBpbnRlcm5hbCByZWdpc3RlciB0ZW1wbGF0ZSBhbmQgYmZkJ3MgcmVnaXN0ZXIgc2VjdGlvbiBsYXlvdXQKKwkgc2hvdWxkIHNoYXJlIGEgY29tbW9uIGluY2x1ZGUgZmlsZS4gRklYTUVtZ28gKi8KKyAgICAgIC8qIHRoZW4gY29tZXMgc3BlY2lhbCByZWdpc3Rlcy4gVGhleSBhcmUgc3VwcG9zZWQgdG8gYmUgaW4gdGhlIHNhbWUKKwkgb3JkZXIgaW4gZ2RiIHRlbXBsYXRlIGFuZCBiZmQgYC5yZWcnIHNlY3Rpb24uICovCisgICAgICBjb3JlX3JlZ19zZWN0ICs9ICgzMiAqIDQpOworICAgICAgbWVtY3B5ICgmcmVnaXN0ZXJzIFtSRUdJU1RFUl9CWVRFIChGSVJTVF9VSVNBX1NQX1JFR05VTSldLCAKKwkgICAgICBjb3JlX3JlZ19zZWN0LCAKKwkgICAgICAoTEFTVF9VSVNBX1NQX1JFR05VTSAtIEZJUlNUX1VJU0FfU1BfUkVHTlVNICsgMSkgKiA0KTsKKyAgICB9CisKKyAgLyogZmV0Y2ggZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGZyb20gcmVnaXN0ZXIgc2VjdGlvbiAyIGluIGNvcmUgYmZkLiAqLworICBlbHNlIGlmICh3aGljaCA9PSAyKQorICAgIG1lbWNweSAoJnJlZ2lzdGVycyBbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLCBjb3JlX3JlZ19zZWN0LCAzMiAqIDgpOworCisgIGVsc2UKKyAgICBmcHJpbnRmX3VuZmlsdGVyZWQgCisgICAgICAoZ2RiX3N0ZGVyciwgCisgICAgICAgIkdkYiBlcnJvcjogdW5rbm93biBwYXJhbWV0ZXIgdG8gZmV0Y2hfY29yZV9yZWdpc3RlcnMoKS5cbiIpOworfQorDAorLyogaGFuZGxlIHN5bWJvbCB0cmFuc2xhdGlvbiBvbiB2bWFwcGluZyAqLworCitzdGF0aWMgdm9pZAordm1hcF9zeW10YWIgKHZwKQorICAgICByZWdpc3RlciBzdHJ1Y3Qgdm1hcCAqdnA7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpuZXdfb2Zmc2V0czsKKyAgaW50IGk7CisgIAorICBvYmpmaWxlID0gdnAtPm9iamZpbGU7CisgIGlmIChvYmpmaWxlID09IE5VTEwpCisgICAgeworICAgICAgLyogT0ssIGl0J3Mgbm90IGFuIG9iamZpbGUgd2Ugb3BlbmVkIG91cnNlbHZlcy4KKwkgQ3VycmVudGx5LCB0aGF0IGNhbiBvbmx5IGhhcHBlbiB3aXRoIHRoZSBleGVjIGZpbGUsIHNvCisJIHJlbG9jYXRlIHRoZSBzeW1ib2xzIGZvciB0aGUgc3ltZmlsZS4gICovCisgICAgICBpZiAoc3ltZmlsZV9vYmpmaWxlID09IE5VTEwpCisJcmV0dXJuOworICAgICAgb2JqZmlsZSA9IHN5bWZpbGVfb2JqZmlsZTsKKyAgICB9CisKKyAgbmV3X29mZnNldHMgPSBhbGxvY2EKKyAgICAoc2l6ZW9mIChzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzKQorICAgICArIHNpemVvZiAobmV3X29mZnNldHMtPm9mZnNldHMpICogb2JqZmlsZS0+bnVtX3NlY3Rpb25zKTsKKworICBmb3IgKGkgPSAwOyBpIDwgb2JqZmlsZS0+bnVtX3NlY3Rpb25zOyArK2kpCisgICAgQU5PRkZTRVQgKG5ld19vZmZzZXRzLCBpKSA9IEFOT0ZGU0VUIChvYmpmaWxlLT5zZWN0aW9uX29mZnNldHMsIGkpOworICAKKyAgLyogVGhlIHN5bWJvbHMgaW4gdGhlIG9iamVjdCBmaWxlIGFyZSBsaW5rZWQgdG8gdGhlIFZNQSBvZiB0aGUgc2VjdGlvbiwKKyAgICAgcmVsb2NhdGUgdGhlbSBWTUEgcmVsYXRpdmUuICAqLworICBBTk9GRlNFVCAobmV3X29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpID0gdnAtPnRzdGFydCAtIHZwLT50dm1hOworICBBTk9GRlNFVCAobmV3X29mZnNldHMsIFNFQ1RfT0ZGX0RBVEEpID0gdnAtPmRzdGFydCAtIHZwLT5kdm1hOworICBBTk9GRlNFVCAobmV3X29mZnNldHMsIFNFQ1RfT0ZGX0JTUykgPSB2cC0+ZHN0YXJ0IC0gdnAtPmR2bWE7CisKKyAgb2JqZmlsZV9yZWxvY2F0ZSAob2JqZmlsZSwgbmV3X29mZnNldHMpOworfQorDAorLyogQWRkIHN5bWJvbHMgZm9yIGFuIG9iamZpbGUuICAqLworCitzdGF0aWMgaW50CitvYmpmaWxlX3N5bWJvbF9hZGQgKGFyZykKKyAgICAgY2hhciAqYXJnOworeworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqID0gKHN0cnVjdCBvYmpmaWxlICopIGFyZzsKKworICBzeW1zX2Zyb21fb2JqZmlsZSAob2JqLCAwLCAwLCAwKTsKKyAgbmV3X3N5bWZpbGVfb2JqZmlsZSAob2JqLCAwLCAwKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIEFkZCBhIG5ldyB2bWFwIGVudHJ5IGJhc2VkIG9uIGxkaW5mbygpIGluZm9ybWF0aW9uLgorCisgICBJZiBsZGktPmxkaW5mb19mZCBpcyBub3QgdmFsaWQgKGUuZy4gdGhpcyBzdHJ1Y3QgbGRfaW5mbyBpcyBmcm9tIGEKKyAgIGNvcmUgZmlsZSksIHRoZSBjYWxsZXIgc2hvdWxkIHNldCBpdCB0byAtMSwgYW5kIHdlIHdpbGwgb3BlbiB0aGUgZmlsZS4KKworICAgUmV0dXJuIHRoZSB2bWFwIG5ldyBlbnRyeS4gICovCisKK3N0YXRpYyBzdHJ1Y3Qgdm1hcCAqCithZGRfdm1hcCAobGRpKQorICAgICByZWdpc3RlciBzdHJ1Y3QgbGRfaW5mbyAqbGRpOyAKK3sKKyAgYmZkICphYmZkLCAqbGFzdDsKKyAgcmVnaXN0ZXIgY2hhciAqbWVtLCAqb2JqbmFtZTsKKyAgc3RydWN0IG9iamZpbGUgKm9iajsKKyAgc3RydWN0IHZtYXAgKnZwOworCisgIC8qIFRoaXMgbGRpIHN0cnVjdHVyZSB3YXMgYWxsb2NhdGVkIHVzaW5nIGFsbG9jYSgpIGluIAorICAgICB4Y29mZl9yZWxvY2F0ZV9zeW10YWIoKS4gTm93IHdlIG5lZWQgdG8gaGF2ZSBwZXJzaXN0ZW50IG9iamVjdCAKKyAgICAgYW5kIG1lbWJlciBuYW1lcywgc28gd2Ugc2hvdWxkIHNhdmUgdGhlbS4gKi8KKworICBtZW0gPSBsZGktPmxkaW5mb19maWxlbmFtZSArIHN0cmxlbiAobGRpLT5sZGluZm9fZmlsZW5hbWUpICsgMTsKKyAgbWVtID0gc2F2ZXN0cmluZyAobWVtLCBzdHJsZW4gKG1lbSkpOworICBvYmpuYW1lID0gc2F2ZXN0cmluZyAobGRpLT5sZGluZm9fZmlsZW5hbWUsIHN0cmxlbiAobGRpLT5sZGluZm9fZmlsZW5hbWUpKTsKKworICBpZiAobGRpLT5sZGluZm9fZmQgPCAwKQorICAgIC8qIE5vdGUgdGhhdCB0aGlzIG9wZW5zIGl0IG9uY2UgZm9yIGV2ZXJ5IG1lbWJlcjsgYSBwb3NzaWJsZQorICAgICAgIGVuaGFuY2VtZW50IHdvdWxkIGJlIHRvIG9ubHkgb3BlbiBpdCBvbmNlIGZvciBldmVyeSBvYmplY3QuICAqLworICAgIGFiZmQgPSBiZmRfb3BlbnIgKG9iam5hbWUsIGdudXRhcmdldCk7CisgIGVsc2UKKyAgICBhYmZkID0gYmZkX2Zkb3BlbnIgKG9iam5hbWUsIGdudXRhcmdldCwgbGRpLT5sZGluZm9fZmQpOworICBpZiAoIWFiZmQpCisgICAgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiBgJXMnIGFzIGFuIGV4ZWN1dGFibGUgZmlsZTogJXMiLAorCSAgIG9iam5hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKworICAvKiBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBvYmplY3QgZmlsZSAqLworCisgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKKyAgICB2cCA9IG1hcF92bWFwIChhYmZkLCAwKTsKKworICBlbHNlIGlmIChiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfYXJjaGl2ZSkpCisgICAgeworICAgICAgbGFzdCA9IDA7CisgICAgICAvKiBGSVhNRT8/PyBhbSBJIHRvc3NpbmcgQkZEcz8gIGJmZD8gKi8KKyAgICAgIHdoaWxlICgobGFzdCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIGxhc3QpKSkKKwlpZiAoU1RSRVEgKG1lbSwgbGFzdC0+ZmlsZW5hbWUpKQorCSAgYnJlYWs7CisKKyAgICAgIGlmICghbGFzdCkKKwl7CisJICBiZmRfY2xvc2UgKGFiZmQpOworCSAgLyogRklYTUUgLS0gc2hvdWxkIGJlIGVycm9yICovCisJICB3YXJuaW5nICgiXCIlc1wiOiBtZW1iZXIgXCIlc1wiIG1pc3NpbmcuIiwgYWJmZC0+ZmlsZW5hbWUsIG1lbSk7CisJICByZXR1cm4gMDsKKwl9CisKKyAgICAgIGlmICghYmZkX2NoZWNrX2Zvcm1hdChsYXN0LCBiZmRfb2JqZWN0KSkKKwl7CisJICBiZmRfY2xvc2UgKGxhc3QpOwkvKiBYWFg/Pz8JKi8KKwkgIGdvdG8gb2JqX2VycjsKKwl9CisKKyAgICAgIHZwID0gbWFwX3ZtYXAgKGxhc3QsIGFiZmQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICBvYmpfZXJyOgorICAgICAgYmZkX2Nsb3NlIChhYmZkKTsKKyAgICAgIGVycm9yICgiXCIlc1wiOiBub3QgaW4gZXhlY3V0YWJsZSBmb3JtYXQ6ICVzLiIsCisJICAgICBvYmpuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgICAvKk5PVFJFQUNIRUQqLworICAgIH0KKyAgb2JqID0gYWxsb2NhdGVfb2JqZmlsZSAodnAtPmJmZCwgMCwgMCwgMCk7CisgIHZwLT5vYmpmaWxlID0gb2JqOworCisjaWZuZGVmIFNPTElCX1NZTUJPTFNfTUFOVUFMCisgIGlmIChjYXRjaF9lcnJvcnMgKG9iamZpbGVfc3ltYm9sX2FkZCwgKGNoYXIgKilvYmosCisJCSAgICAiRXJyb3Igd2hpbGUgcmVhZGluZyBzaGFyZWQgbGlicmFyeSBzeW1ib2xzOlxuIiwKKwkJICAgIFJFVFVSTl9NQVNLX0FMTCkpCisgICAgeworICAgICAgLyogTm90ZSB0aGlzIGlzIG9ubHkgZG9uZSBpZiBzeW1ib2wgcmVhZGluZyB3YXMgc3VjY2Vzc2Z1bC4gICovCisgICAgICB2bWFwX3N5bXRhYiAodnApOworICAgICAgdnAtPmxvYWRlZCA9IDE7CisgICAgfQorI2VuZGlmCisgIHJldHVybiB2cDsKK30KKwwKKy8qIHVwZGF0ZSBWTUFQIGluZm8gd2l0aCBsZGluZm8oKSBpbmZvcm1hdGlvbgorICAgSW5wdXQgaXMgcHRyIHRvIGxkaW5mbygpIHJlc3VsdHMuICAqLworCitzdGF0aWMgdm9pZAordm1hcF9sZGluZm8gKGxkaSkKKyAgICAgcmVnaXN0ZXIgc3RydWN0IGxkX2luZm8gKmxkaTsKK3sKKyAgc3RydWN0IHN0YXQgaWksIHZpOworICByZWdpc3RlciBzdHJ1Y3Qgdm1hcCAqdnA7CisgIGludCBnb3Rfb25lLCByZXRyaWVkOworICBpbnQgZ290X2V4ZWNfZmlsZSA9IDA7CisKKyAgLyogRm9yIGVhY2ggKmxkaSwgc2VlIGlmIHdlIGhhdmUgYSBjb3JyZXNwb25kaW5nICp2cC4KKyAgICAgSWYgc28sIHVwZGF0ZSB0aGUgbWFwcGluZywgYW5kIHN5bWJvbCB0YWJsZS4KKyAgICAgSWYgbm90LCBhZGQgYW4gZW50cnkgYW5kIHN5bWJvbCB0YWJsZS4gICovCisKKyAgZG8geworICAgIGNoYXIgKm5hbWUgPSBsZGktPmxkaW5mb19maWxlbmFtZTsKKyAgICBjaGFyICptZW1iID0gbmFtZSArIHN0cmxlbihuYW1lKSArIDE7CisKKyAgICByZXRyaWVkID0gMDsKKworICAgIGlmIChmc3RhdCAobGRpLT5sZGluZm9fZmQsICZpaSkgPCAwKQorICAgICAgeworCS8qIFRoZSBrZXJuZWwgc2V0cyBsZF9pbmZvIHRvIC0xLCBpZiB0aGUgcHJvY2VzcyBpcyBzdGlsbCB1c2luZyB0aGUKKwkgICBvYmplY3QsIGFuZCB0aGUgb2JqZWN0IGlzIHJlbW92ZWQuIEtlZXAgdGhlIHN5bWJvbCBpbmZvIGZvciB0aGUKKwkgICByZW1vdmVkIG9iamVjdCBhbmQgaXNzdWUgYSB3YXJuaW5nLiAgKi8KKwl3YXJuaW5nICgiJXMgKGZkPSVkKSBoYXMgZGlzYXBwZWFyZWQsIGtlZXBpbmcgaXRzIHN5bWJvbHMiLAorCQkgbmFtZSwgbGRpLT5sZGluZm9fZmQpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgcmV0cnk6CisgICAgZm9yIChnb3Rfb25lID0gMCwgdnAgPSB2bWFwOyB2cDsgdnAgPSB2cC0+bnh0KQorICAgICAgeworCXN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworCisJLyogRmlyc3QgdHJ5IHRvIGZpbmQgYSBgdnAnLCB3aGljaCBpcyB0aGUgc2FtZSBhcyBpbiBsZGluZm8uCisJICAgSWYgbm90IHRoZSBzYW1lLCBqdXN0IGNvbnRpbnVlIGFuZCBncmVwIHRoZSBuZXh0IGB2cCcuIElmIHNhbWUsCisJICAgcmVsb2NhdGUgaXRzIHRzdGFydCwgdGVuZCwgZHN0YXJ0LCBkZW5kIHZhbHVlcy4gSWYgbm8gc3VjaCBgdnAnCisJICAgZm91bmQsIGdldCBvdXQgb2YgdGhpcyBmb3IgbG9vcCwgYWRkIHRoaXMgbGRpIGVudHJ5IGFzIGEgbmV3IHZtYXAKKwkgICAoYWRkX3ZtYXApIGFuZCBjb21lIGJhY2ssIGZpbmQgaXRzIGB2cCcgYW5kIHNvIG9uLi4uICovCisKKwkvKiBUaGUgZmlsZW5hbWVzIGFyZSBub3QgYWx3YXlzIHN1ZmZpY2llbnQgdG8gbWF0Y2ggb24uICovCisKKwlpZiAoKG5hbWVbMF0gPT0gJy8nICYmICFTVFJFUShuYW1lLCB2cC0+bmFtZSkpCisJICAgIHx8IChtZW1iWzBdICYmICFTVFJFUShtZW1iLCB2cC0+bWVtYmVyKSkpCisJICBjb250aW51ZTsKKworCS8qIFNlZSBpZiB3ZSBhcmUgcmVmZXJyaW5nIHRvIHRoZSBzYW1lIGZpbGUuCisJICAgV2UgaGF2ZSB0byBjaGVjayBvYmpmaWxlLT5vYmZkLCBzeW1maWxlLmM6cmVyZWFkX3N5bWJvbHMgbWlnaHQKKwkgICBoYXZlIHVwZGF0ZWQgdGhlIG9iZmQgYWZ0ZXIgYSBjaGFuZ2UuICAqLworCW9iamZpbGUgPSB2cC0+b2JqZmlsZSA9PSBOVUxMID8gc3ltZmlsZV9vYmpmaWxlIDogdnAtPm9iamZpbGU7CisJaWYgKG9iamZpbGUgPT0gTlVMTAorCSAgICB8fCBvYmpmaWxlLT5vYmZkID09IE5VTEwKKwkgICAgfHwgYmZkX3N0YXQgKG9iamZpbGUtPm9iZmQsICZ2aSkgPCAwKQorCSAgeworCSAgICB3YXJuaW5nICgiVW5hYmxlIHRvIHN0YXQgJXMsIGtlZXBpbmcgaXRzIHN5bWJvbHMiLCBuYW1lKTsKKwkgICAgY29udGludWU7CisJICB9CisKKwlpZiAoaWkuc3RfZGV2ICE9IHZpLnN0X2RldiB8fCBpaS5zdF9pbm8gIT0gdmkuc3RfaW5vKQorCSAgY29udGludWU7CisKKwlpZiAoIXJldHJpZWQpCisJICBjbG9zZSAobGRpLT5sZGluZm9fZmQpOworCisJKytnb3Rfb25lOworCisJLyogRm91bmQgYSBjb3JyZXNwb25kaW5nIFZNQVAuICBSZW1hcCEgICovCisKKwkvKiBXZSBjYW4gYXNzdW1lIHBvaW50ZXIgPT0gQ09SRV9BRERSLCB0aGlzIGNvZGUgaXMgbmF0aXZlIG9ubHkuICAqLworCXZwLT50c3RhcnQgPSAoQ09SRV9BRERSKSBsZGktPmxkaW5mb190ZXh0b3JnOworCXZwLT50ZW5kICAgPSB2cC0+dHN0YXJ0ICsgbGRpLT5sZGluZm9fdGV4dHNpemU7CisJdnAtPmRzdGFydCA9IChDT1JFX0FERFIpIGxkaS0+bGRpbmZvX2RhdGFvcmc7CisJdnAtPmRlbmQgICA9IHZwLT5kc3RhcnQgKyBsZGktPmxkaW5mb19kYXRhc2l6ZTsKKworCS8qIFRoZSBydW4gdGltZSBsb2FkZXIgbWFwcyB0aGUgZmlsZSBoZWFkZXIgaW4gYWRkaXRpb24gdG8gdGhlIHRleHQKKwkgICBzZWN0aW9uIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaGVhZGVyIGluIGxkaW5mb190ZXh0b3JnLgorCSAgIEFkanVzdCB0aGUgdGV4dCBzdGFydCBhZGRyZXNzIHRvIHBvaW50IHRvIHRoZSByZWFsIHN0YXJ0IGFkZHJlc3MKKwkgICBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgKi8KKwl2cC0+dHN0YXJ0ICs9IHZwLT50b2ZmczsKKworCS8qIFRoZSBvYmpmaWxlIGlzIG9ubHkgTlVMTCBmb3IgdGhlIGV4ZWMgZmlsZS4gICovCisJaWYgKHZwLT5vYmpmaWxlID09IE5VTEwpCisJICBnb3RfZXhlY19maWxlID0gMTsKKworCS8qIHJlbG9jYXRlIHN5bWJvbCB0YWJsZShzKS4gKi8KKwl2bWFwX3N5bXRhYiAodnApOworCisJLyogVGhlcmUgbWF5IGJlIG1vcmUsIHNvIHdlIGRvbid0IGJyZWFrIG91dCBvZiB0aGUgbG9vcC4gICovCisgICAgICB9CisKKyAgICAvKiBpZiB0aGVyZSB3YXMgbm8gbWF0Y2hpbmcgKnZwLCB3ZSBtdXN0IHBlcmZvcmNlIGNyZWF0ZSB0aGUgc3Vja2VyKHMpICovCisgICAgaWYgKCFnb3Rfb25lICYmICFyZXRyaWVkKQorICAgICAgeworCWFkZF92bWFwIChsZGkpOworCSsrcmV0cmllZDsKKwlnb3RvIHJldHJ5OworICAgICAgfQorICB9IHdoaWxlIChsZGktPmxkaW5mb19uZXh0CisJICAgJiYgKGxkaSA9ICh2b2lkICopIChsZGktPmxkaW5mb19uZXh0ICsgKGNoYXIgKikgbGRpKSkpOworCisgIC8qIElmIHdlIGRvbid0IGZpbmQgdGhlIHN5bWZpbGVfb2JqZmlsZSBhbnl3aGVyZSBpbiB0aGUgbGRpbmZvLCBpdAorICAgICBpcyB1bmxpa2VseSB0aGF0IHRoZSBzeW1ib2wgZmlsZSBpcyByZWxvY2F0ZWQgdG8gdGhlIHByb3BlcgorICAgICBhZGRyZXNzLiAgQW5kIHdlIG1pZ2h0IGhhdmUgYXR0YWNoZWQgdG8gYSBwcm9jZXNzIHdoaWNoIGlzCisgICAgIHJ1bm5pbmcgYSBkaWZmZXJlbnQgY29weSBvZiB0aGUgc2FtZSBleGVjdXRhYmxlLiAgKi8KKyAgaWYgKHN5bWZpbGVfb2JqZmlsZSAhPSBOVUxMICYmICFnb3RfZXhlY19maWxlKQorICAgIHsKKyAgICAgIHdhcm5pbmdfYmVnaW4gKCk7CisgICAgICBmcHV0c191bmZpbHRlcmVkICgiU3ltYm9sIGZpbGUgIiwgZ2RiX3N0ZGVycik7CisgICAgICBmcHV0c191bmZpbHRlcmVkIChzeW1maWxlX29iamZpbGUtPm5hbWUsIGdkYl9zdGRlcnIpOworICAgICAgZnB1dHNfdW5maWx0ZXJlZCAoIlxuaXMgbm90IG1hcHBlZDsgZGlzY2FyZGluZyBpdC5cblwKK0lmIGluIGZhY3QgdGhhdCBmaWxlIGhhcyBzeW1ib2xzIHdoaWNoIHRoZSBtYXBwZWQgZmlsZXMgbGlzdGVkIGJ5XG5cCitcImluZm8gZmlsZXNcIiBsYWNrLCB5b3UgY2FuIGxvYWQgc3ltYm9scyB3aXRoIHRoZSBcInN5bWJvbC1maWxlXCIgb3JcblwKK1wiYWRkLXN5bWJvbC1maWxlXCIgY29tbWFuZHMgKG5vdGUgdGhhdCB5b3UgbXVzdCB0YWtlIGNhcmUgb2YgcmVsb2NhdGluZ1xuXAorc3ltYm9scyB0byB0aGUgcHJvcGVyIGFkZHJlc3MpLlxuIiwgZ2RiX3N0ZGVycik7CisgICAgICBmcmVlX29iamZpbGUgKHN5bWZpbGVfb2JqZmlsZSk7CisgICAgICBzeW1maWxlX29iamZpbGUgPSBOVUxMOworICAgIH0KKyAgYnJlYWtwb2ludF9yZV9zZXQgKCk7Cit9CisMCisvKiBBcyB3ZWxsIGFzIHN5bWJvbCB0YWJsZXMsIGV4ZWNfc2VjdGlvbnMgbmVlZCByZWxvY2F0aW9uLiBBZnRlcgorICAgdGhlIGluZmVyaW9yIHByb2Nlc3MnIHRlcm1pbmF0aW9uLCB0aGVyZSB3aWxsIGJlIGEgcmVsb2NhdGVkIHN5bWJvbAorICAgdGFibGUgZXhpc3Qgd2l0aCBubyBjb3JyZXNwb25kaW5nIGluZmVyaW9yIHByb2Nlc3MuIEF0IHRoYXQgdGltZSwgd2UKKyAgIG5lZWQgdG8gdXNlIGBleGVjJyBiZmQsIHJhdGhlciB0aGFuIHRoZSBpbmZlcmlvciBwcm9jZXNzJ3MgbWVtb3J5IHNwYWNlCisgICB0byBsb29rIHVwIHN5bWJvbHMuCisKKyAgIGBleGVjX3NlY3Rpb25zJyBuZWVkIHRvIGJlIHJlbG9jYXRlZCBvbmx5IG9uY2UsIGFzIGxvbmcgYXMgdGhlIGV4ZWMKKyAgIGZpbGUgcmVtYWlucyB1bmNoYW5nZWQuCisqLworCitzdGF0aWMgdm9pZAordm1hcF9leGVjICgpCit7CisgIHN0YXRpYyBiZmQgKmV4ZWNiZmQ7CisgIGludCBpOworCisgIGlmIChleGVjYmZkID09IGV4ZWNfYmZkKQorICAgIHJldHVybjsKKworICBleGVjYmZkID0gZXhlY19iZmQ7CisKKyAgaWYgKCF2bWFwIHx8ICFleGVjX29wcy50b19zZWN0aW9ucykKKyAgICBlcnJvciAoInZtYXBfZXhlYzogdm1hcCBvciBleGVjX29wcy50b19zZWN0aW9ucyA9PSAwXG4iKTsKKworICBmb3IgKGk9MDsgJmV4ZWNfb3BzLnRvX3NlY3Rpb25zW2ldIDwgZXhlY19vcHMudG9fc2VjdGlvbnNfZW5kOyBpKyspCisgICAgeworICAgICAgaWYgKFNUUkVRKCIudGV4dCIsIGV4ZWNfb3BzLnRvX3NlY3Rpb25zW2ldLnRoZV9iZmRfc2VjdGlvbi0+bmFtZSkpCisJeworCSAgZXhlY19vcHMudG9fc2VjdGlvbnNbaV0uYWRkciArPSB2bWFwLT50c3RhcnQgLSB2bWFwLT50dm1hOworCSAgZXhlY19vcHMudG9fc2VjdGlvbnNbaV0uZW5kYWRkciArPSB2bWFwLT50c3RhcnQgLSB2bWFwLT50dm1hOworCX0KKyAgICAgIGVsc2UgaWYgKFNUUkVRKCIuZGF0YSIsIGV4ZWNfb3BzLnRvX3NlY3Rpb25zW2ldLnRoZV9iZmRfc2VjdGlvbi0+bmFtZSkpCisJeworCSAgZXhlY19vcHMudG9fc2VjdGlvbnNbaV0uYWRkciArPSB2bWFwLT5kc3RhcnQgLSB2bWFwLT5kdm1hOworCSAgZXhlY19vcHMudG9fc2VjdGlvbnNbaV0uZW5kYWRkciArPSB2bWFwLT5kc3RhcnQgLSB2bWFwLT5kdm1hOworCX0KKyAgICAgIGVsc2UgaWYgKFNUUkVRKCIuYnNzIiwgZXhlY19vcHMudG9fc2VjdGlvbnNbaV0udGhlX2JmZF9zZWN0aW9uLT5uYW1lKSkKKwl7CisJICBleGVjX29wcy50b19zZWN0aW9uc1tpXS5hZGRyICs9IHZtYXAtPmRzdGFydCAtIHZtYXAtPmR2bWE7CisJICBleGVjX29wcy50b19zZWN0aW9uc1tpXS5lbmRhZGRyICs9IHZtYXAtPmRzdGFydCAtIHZtYXAtPmR2bWE7CisJfQorICAgIH0KK30KKwwKKy8qIHhjb2ZmX3JlbG9jYXRlX3N5bXRhYiAtCWhvb2sgZm9yIHN5bWJvbCB0YWJsZSByZWxvY2F0aW9uLgorICAgYWxzbyByZWFkcyBzaGFyZWQgbGlicmFyaWVzLi4gKi8KKwordm9pZAoreGNvZmZfcmVsb2NhdGVfc3ltdGFiIChwaWQpCisgICAgIHVuc2lnbmVkIGludCBwaWQ7Cit7CisjZGVmaW5lCU1BWF9MT0FEX1NFR1MgNjQJCS8qIG1heGltdW0gbnVtYmVyIG9mIGxvYWQgc2VnbWVudHMgKi8KKworICBzdHJ1Y3QgbGRfaW5mbyAqbGRpOworCisgIGxkaSA9ICh2b2lkICopIGFsbG9jYShNQVhfTE9BRF9TRUdTICogc2l6ZW9mICgqbGRpKSk7CisKKyAgLyogQWNjb3JkaW5nIHRvIG15IGh1bWJsZSB0aGVvcnksIEFJWCBoYXMgc29tZSB0aW1pbmcgcHJvYmxlbXMgYW5kCisgICAgIHdoZW4gdGhlIHVzZXIgc3RhY2sgZ3Jvd3MsIGtlcm5lbCBkb2Vzbid0IHVwZGF0ZSBzdGFjayBpbmZvIGluIHRpbWUKKyAgICAgYW5kIHB0cmFjZSBjYWxscyBzdGVwIG9uIHVzZXIgc3RhY2suIFRoYXQgaXMgd2h5IHdlIHNsZWVwIGhlcmUgYSBsaXR0bGUsCisgICAgIGFuZCBnaXZlIGtlcm5lbCB0byB1cGRhdGUgaXRzIGludGVybmFscy4gKi8KKworICB1c2xlZXAgKDM2MDAwKTsKKworICBlcnJubyA9IDA7CisgIHB0cmFjZSAoUFRfTERJTkZPLCBwaWQsIChQVFJBQ0VfQVJHM19UWVBFKSBsZGksCisJICBNQVhfTE9BRF9TRUdTICogc2l6ZW9mKCpsZGkpLCAoaW50ICopIGxkaSk7CisgIGlmIChlcnJubykKKyAgICBwZXJyb3Jfd2l0aF9uYW1lICgicHRyYWNlIGxkaW5mbyIpOworCisgIHZtYXBfbGRpbmZvIChsZGkpOworCisgIC8qIHJlbG9jYXRlIHRoZSBleGVjIGFuZCBjb3JlIHNlY3Rpb25zIGFzIHdlbGwuICovCisgIHZtYXBfZXhlYyAoKTsKK30KKwwKKy8qIENvcmUgZmlsZSBzdHVmZi4gICovCisKKy8qIFJlbG9jYXRlIHN5bXRhYnMgYW5kIHJlYWQgaW4gc2hhcmVkIGxpYnJhcnkgaW5mbywgYmFzZWQgb24gc3ltYm9scworICAgZnJvbSB0aGUgY29yZSBmaWxlLiAgKi8KKwordm9pZAoreGNvZmZfcmVsb2NhdGVfY29yZSAodGFyZ2V0KQorICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0OworeworLyogT2Zmc2V0IG9mIG1lbWJlciBNRU1CRVIgaW4gYSBzdHJ1Y3Qgb2YgdHlwZSBUWVBFLiAgKi8KKyNpZm5kZWYgb2Zmc2V0b2YKKyNkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKGludCkgJigoVFlQRSAqKTApLT5NRU1CRVIpCisjZW5kaWYKKworLyogU2l6ZSBvZiBhIHN0cnVjdCBsZF9pbmZvIGV4Y2VwdCBmb3IgdGhlIHZhcmlhYmxlLWxlbmd0aCBmaWxlbmFtZS4gICovCisjZGVmaW5lIExESU5GT19TSVpFIChvZmZzZXRvZiAoc3RydWN0IGxkX2luZm8sIGxkaW5mb19maWxlbmFtZSkpCisKKyAgc2VjX3B0ciBsZGluZm9fc2VjOworICBpbnQgb2Zmc2V0ID0gMDsKKyAgc3RydWN0IGxkX2luZm8gKmxkaXA7CisgIHN0cnVjdCB2bWFwICp2cDsKKworICAvKiBBbGxvY2F0ZWQgc2l6ZSBvZiBidWZmZXIuICAqLworICBpbnQgYnVmZmVyX3NpemUgPSBMRElORk9fU0laRTsKKyAgY2hhciAqYnVmZmVyID0geG1hbGxvYyAoYnVmZmVyX3NpemUpOworICBzdHJ1Y3QgY2xlYW51cCAqb2xkID0gbWFrZV9jbGVhbnVwIChmcmVlX2N1cnJlbnRfY29udGVudHMsICZidWZmZXIpOworICAgIAorICAvKiBGSVhNRSwgdGhpcyByZXN0cmljdGlvbiBzaG91bGQgbm90IGV4aXN0LiAgRm9yIG5vdywgdGhvdWdoIEknbGwKKyAgICAgYXZvaWQgY29yZWR1bXBzIHdpdGggZXJyb3IoKSBwZW5kaW5nIGEgcmVhbCBmaXguICAqLworICBpZiAodm1hcCA9PSBOVUxMKQorICAgIGVycm9yCisgICAgICAoIkNhbid0IGRlYnVnIGEgY29yZSBmaWxlIHdpdGhvdXQgYW4gZXhlY3V0YWJsZSBmaWxlIChvbiB0aGUgUlMvNjAwMCkiKTsKKyAgCisgIGxkaW5mb19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoY29yZV9iZmQsICIubGRpbmZvIik7CisgIGlmIChsZGluZm9fc2VjID09IE5VTEwpCisgICAgeworICAgIGJmZF9lcnI6CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChnZGJfc3RkZXJyLCAiQ291bGRuJ3QgZ2V0IGxkaW5mbyBmcm9tIGNvcmUgZmlsZTogJXNcbiIsCisJCQliZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgICBkb19jbGVhbnVwcyAob2xkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGRvCisgICAgeworICAgICAgaW50IGk7CisgICAgICBpbnQgbmFtZXNfZm91bmQgPSAwOworCisgICAgICAvKiBSZWFkIGluIGV2ZXJ5dGhpbmcgYnV0IHRoZSBuYW1lLiAgKi8KKyAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGNvcmVfYmZkLCBsZGluZm9fc2VjLCBidWZmZXIsCisJCQkJICAgIG9mZnNldCwgTERJTkZPX1NJWkUpID09IDApCisJZ290byBiZmRfZXJyOworCisgICAgICAvKiBOb3cgdGhlIG5hbWUuICAqLworICAgICAgaSA9IExESU5GT19TSVpFOworICAgICAgZG8KKwl7CisJICBpZiAoaSA9PSBidWZmZXJfc2l6ZSkKKwkgICAgeworCSAgICAgIGJ1ZmZlcl9zaXplICo9IDI7CisJICAgICAgYnVmZmVyID0geHJlYWxsb2MgKGJ1ZmZlciwgYnVmZmVyX3NpemUpOworCSAgICB9CisJICBpZiAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChjb3JlX2JmZCwgbGRpbmZvX3NlYywgJmJ1ZmZlcltpXSwKKwkJCQkJb2Zmc2V0ICsgaSwgMSkgPT0gMCkKKwkgICAgZ290byBiZmRfZXJyOworCSAgaWYgKGJ1ZmZlcltpKytdID09ICdcMCcpCisJICAgICsrbmFtZXNfZm91bmQ7CisJfSB3aGlsZSAobmFtZXNfZm91bmQgPCAyKTsKKworICAgICAgbGRpcCA9IChzdHJ1Y3QgbGRfaW5mbyAqKSBidWZmZXI7CisKKyAgICAgIC8qIENhbid0IHVzZSBhIGZpbGUgZGVzY3JpcHRvciBmcm9tIHRoZSBjb3JlIGZpbGU7IG5lZWQgdG8gb3BlbiBpdC4gICovCisgICAgICBsZGlwLT5sZGluZm9fZmQgPSAtMTsKKyAgICAgIAorICAgICAgLyogVGhlIGZpcnN0IGxkaW5mbyBpcyBmb3IgdGhlIGV4ZWMgZmlsZSwgYWxsb2NhdGVkIGVsc2V3aGVyZS4gICovCisgICAgICBpZiAob2Zmc2V0ID09IDApCisJdnAgPSB2bWFwOworICAgICAgZWxzZQorCXZwID0gYWRkX3ZtYXAgKGxkaXApOworCisgICAgICBvZmZzZXQgKz0gbGRpcC0+bGRpbmZvX25leHQ7CisKKyAgICAgIC8qIFdlIGNhbiBhc3N1bWUgcG9pbnRlciA9PSBDT1JFX0FERFIsIHRoaXMgY29kZSBpcyBuYXRpdmUgb25seS4gICovCisgICAgICB2cC0+dHN0YXJ0ID0gKENPUkVfQUREUikgbGRpcC0+bGRpbmZvX3RleHRvcmc7CisgICAgICB2cC0+dGVuZCA9IHZwLT50c3RhcnQgKyBsZGlwLT5sZGluZm9fdGV4dHNpemU7CisgICAgICB2cC0+ZHN0YXJ0ID0gKENPUkVfQUREUikgbGRpcC0+bGRpbmZvX2RhdGFvcmc7CisgICAgICB2cC0+ZGVuZCA9IHZwLT5kc3RhcnQgKyBsZGlwLT5sZGluZm9fZGF0YXNpemU7CisKKyAgICAgIC8qIFRoZSBydW4gdGltZSBsb2FkZXIgbWFwcyB0aGUgZmlsZSBoZWFkZXIgaW4gYWRkaXRpb24gdG8gdGhlIHRleHQKKwkgc2VjdGlvbiBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGhlYWRlciBpbiBsZGluZm9fdGV4dG9yZy4KKwkgQWRqdXN0IHRoZSB0ZXh0IHN0YXJ0IGFkZHJlc3MgdG8gcG9pbnQgdG8gdGhlIHJlYWwgc3RhcnQgYWRkcmVzcworCSBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgKi8KKyAgICAgIHZwLT50c3RhcnQgKz0gdnAtPnRvZmZzOworCisgICAgICAvKiBVbmxlc3MgdGhpcyBpcyB0aGUgZXhlYyBmaWxlLAorCSBhZGQgb3VyIHNlY3Rpb25zIHRvIHRoZSBzZWN0aW9uIHRhYmxlIGZvciB0aGUgY29yZSB0YXJnZXQuICAqLworICAgICAgaWYgKHZwICE9IHZtYXApCisJeworCSAgaW50IGNvdW50OworCSAgc3RydWN0IHNlY3Rpb25fdGFibGUgKnN0cDsKKwkgIGludCB1cGRhdGVfY29yZW9wczsKKworCSAgLyogV2UgbXVzdCB1cGRhdGUgdGhlIHRvX3NlY3Rpb25zIGZpZWxkIGluIHRoZSBjb3JlX29wcyBzdHJ1Y3R1cmUKKwkgICAgIG5vdyB0byBhdm9pZCBkYW5nbGluZyBwb2ludGVyIGRlcmVmZXJlbmNlcy4gICovCisJICB1cGRhdGVfY29yZW9wcyA9IGNvcmVfb3BzLnRvX3NlY3Rpb25zID09IHRhcmdldC0+dG9fc2VjdGlvbnM7CisJICAKKwkgIGNvdW50ID0gdGFyZ2V0LT50b19zZWN0aW9uc19lbmQgLSB0YXJnZXQtPnRvX3NlY3Rpb25zOworCSAgY291bnQgKz0gMjsKKwkgIHRhcmdldC0+dG9fc2VjdGlvbnMgPSAoc3RydWN0IHNlY3Rpb25fdGFibGUgKikKKwkgICAgeHJlYWxsb2MgKHRhcmdldC0+dG9fc2VjdGlvbnMsCisJCSAgICAgIHNpemVvZiAoc3RydWN0IHNlY3Rpb25fdGFibGUpICogY291bnQpOworCSAgdGFyZ2V0LT50b19zZWN0aW9uc19lbmQgPSB0YXJnZXQtPnRvX3NlY3Rpb25zICsgY291bnQ7CisKKwkgIC8qIFVwZGF0ZSB0aGUgdG9fc2VjdGlvbnMgZmllbGQgaW4gdGhlIGNvcmVfb3BzIHN0cnVjdHVyZQorCSAgICAgaWYgbmVlZGVkLiAgKi8KKwkgIGlmICh1cGRhdGVfY29yZW9wcykKKwkgICAgeworCSAgICAgIGNvcmVfb3BzLnRvX3NlY3Rpb25zID0gdGFyZ2V0LT50b19zZWN0aW9uczsKKwkgICAgICBjb3JlX29wcy50b19zZWN0aW9uc19lbmQgPSB0YXJnZXQtPnRvX3NlY3Rpb25zX2VuZDsKKwkgICAgfQorCSAgc3RwID0gdGFyZ2V0LT50b19zZWN0aW9uc19lbmQgLSAyOworCisJICBzdHAtPmJmZCA9IHZwLT5iZmQ7CisJICBzdHAtPnRoZV9iZmRfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdHAtPmJmZCwgIi50ZXh0Iik7CisJICBzdHAtPmFkZHIgPSB2cC0+dHN0YXJ0OworCSAgc3RwLT5lbmRhZGRyID0gdnAtPnRlbmQ7CisJICBzdHArKzsKKwkgIAorCSAgc3RwLT5iZmQgPSB2cC0+YmZkOworCSAgc3RwLT50aGVfYmZkX3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3RwLT5iZmQsICIuZGF0YSIpOworCSAgc3RwLT5hZGRyID0gdnAtPmRzdGFydDsKKwkgIHN0cC0+ZW5kYWRkciA9IHZwLT5kZW5kOworCX0KKworICAgICAgdm1hcF9zeW10YWIgKHZwKTsKKyAgICB9IHdoaWxlIChsZGlwLT5sZGluZm9fbmV4dCAhPSAwKTsKKyAgdm1hcF9leGVjICgpOworICBicmVha3BvaW50X3JlX3NldCAoKTsKKyAgZG9fY2xlYW51cHMgKG9sZCk7Cit9CisKK2ludAora2VybmVsX3Vfc2l6ZSAoKQoreworICByZXR1cm4gKHNpemVvZiAoc3RydWN0IHVzZXIpKTsKK30KKwwKKy8qIFVuZGVyIEFJWCwgd2UgaGF2ZSB0byBwYXNzIHRoZSBjb3JyZWN0IFRPQyBwb2ludGVyIHRvIGEgZnVuY3Rpb24KKyAgIHdoZW4gY2FsbGluZyBmdW5jdGlvbnMgaW4gdGhlIGluZmVyaW9yLgorICAgV2UgdHJ5IHRvIGZpbmQgdGhlIHJlbGF0aXZlIHRvYyBvZmZzZXQgb2YgdGhlIG9iamZpbGUgY29udGFpbmluZyBQQworICAgYW5kIGFkZCB0aGUgY3VycmVudCBsb2FkIGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VnbWVudCBmcm9tIHRoZSB2bWFwLiAgKi8KKworc3RhdGljIENPUkVfQUREUgorZmluZF90b2NfYWRkcmVzcyAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgc3RydWN0IHZtYXAgKnZwOworCisgIGZvciAodnAgPSB2bWFwOyB2cDsgdnAgPSB2cC0+bnh0KQorICAgIHsKKyAgICAgIGlmIChwYyA+PSB2cC0+dHN0YXJ0ICYmIHBjIDwgdnAtPnRlbmQpCisJeworCSAgLyogdnAtPm9iamZpbGUgaXMgb25seSBOVUxMIGZvciB0aGUgZXhlYyBmaWxlLiAgKi8KKwkgIHJldHVybiB2cC0+ZHN0YXJ0ICsgZ2V0X3RvY19vZmZzZXQgKHZwLT5vYmpmaWxlID09IE5VTEwKKwkJCQkJICAgICAgPyBzeW1maWxlX29iamZpbGUKKwkJCQkJICAgICAgOiB2cC0+b2JqZmlsZSk7CisJfQorICAgIH0KKyAgZXJyb3IgKCJVbmFibGUgdG8gZmluZCBUT0MgZW50cnkgZm9yIHBjIDB4JXhcbiIsIHBjKTsKK30KKwwKKy8qIFJlZ2lzdGVyIHRoYXQgd2UgYXJlIGFibGUgdG8gaGFuZGxlIHJzNjAwMCBjb3JlIGZpbGUgZm9ybWF0cy4gKi8KKworc3RhdGljIHN0cnVjdCBjb3JlX2ZucyByczYwMDBfY29yZV9mbnMgPQoreworICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKKyAgZmV0Y2hfY29yZV9yZWdpc3RlcnMsCisgIE5VTEwKK307CisKK3ZvaWQKK19pbml0aWFsaXplX2NvcmVfcnM2MDAwICgpCit7CisgIC8qIEluaXRpYWxpemUgaG9vayBpbiByczYwMDAtdGRlcC5jIGZvciBkZXRlcm1pbmluZyB0aGUgVE9DIGFkZHJlc3Mgd2hlbgorICAgICBjYWxsaW5nIGZ1bmN0aW9ucyBpbiB0aGUgaW5mZXJpb3IuICAqLworICBmaW5kX3RvY19hZGRyZXNzX2hvb2sgPSAmZmluZF90b2NfYWRkcmVzczsKKworICAvKiBGb3IgbmF0aXZlIGNvbmZpZ3VyYXRpb25zLCB3aGVyZSB0aGlzIG1vZHVsZSBpcyBpbmNsdWRlZCwgaW5mb3JtCisgICAgIHRoZSB4Y29mZnNvbGliIG1vZHVsZSB3aGVyZSBpdCBjYW4gZmluZCB0aGUgZnVuY3Rpb24gZm9yIHN5bWJvbCB0YWJsZQorICAgICByZWxvY2F0aW9uIGF0IHJ1bnRpbWUuICovCisgIHhjb2ZmX3JlbG9jYXRlX3N5bXRhYl9ob29rID0gJnhjb2ZmX3JlbG9jYXRlX3N5bXRhYjsKKyAgYWRkX2NvcmVfZm5zICgmcnM2MDAwX2NvcmVfZm5zKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9yczYwMDAtdGRlcC5jIGIvZ2RiL3JzNjAwMC10ZGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmMWRmMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9yczYwMDAtdGRlcC5jCkBAIC0wLDAgKzEsMTgwMCBAQAorLyogVGFyZ2V0LWRlcGVuZGVudCBjb2RlIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIKKyNpbmNsdWRlICJvYmpmaWxlcy5oIgorI2luY2x1ZGUgInhjb2Zmc29saWIuaCIKKworZXh0ZXJuIGludCBlcnJubzsKKworLyogQnJlYWtwb2ludCBzaGFkb3dzIGZvciB0aGUgc2luZ2xlIHN0ZXAgaW5zdHJ1Y3Rpb25zIHdpbGwgYmUga2VwdCBoZXJlLiAqLworCitzdGF0aWMgc3RydWN0IHNzdGVwX2JyZWFrcyB7CisgIC8qIEFkZHJlc3MsIG9yIDAgaWYgdGhpcyBpcyBub3QgaW4gdXNlLiAgKi8KKyAgQ09SRV9BRERSIGFkZHJlc3M7CisgIC8qIFNoYWRvdyBjb250ZW50cy4gICovCisgIGNoYXIgZGF0YVs0XTsKK30gc3RlcEJyZWFrc1syXTsKKworLyogSG9vayBmb3IgZGV0ZXJtaW5pbmcgdGhlIFRPQyBhZGRyZXNzIHdoZW4gY2FsbGluZyBmdW5jdGlvbnMgaW4gdGhlCisgICBpbmZlcmlvciB1bmRlciBBSVguIFRoZSBpbml0aWFsaXphdGlvbiBjb2RlIGluIHJzNjAwMC1uYXQuYyBzZXRzCisgICB0aGlzIGhvb2sgdG8gcG9pbnQgdG8gZmluZF90b2NfYWRkcmVzcy4gICovCisKK0NPUkVfQUREUiAoKmZpbmRfdG9jX2FkZHJlc3NfaG9vaykgUEFSQU1TICgoQ09SRV9BRERSKSkgPSBOVUxMOworCisvKiBTdGF0aWMgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworCitzdGF0aWMgQ09SRV9BRERSIGJyYW5jaF9kZXN0IFBBUkFNUyAoKGludCBvcGNvZGUsIGludCBpbnN0ciwgQ09SRV9BRERSIHBjLAorCQkJCSAgICAgIENPUkVfQUREUiBzYWZldHkpKTsKKworc3RhdGljIHZvaWQgZnJhbWVfZ2V0X3NhdmVkX3JlZ3MgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKmZpLAorCQkJCQkgIHN0cnVjdCByczYwMDBfZnJhbWVkYXRhICpmZGF0YXApKTsKKworc3RhdGljIHZvaWQgcG9wX2R1bW15X2ZyYW1lIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIENPUkVfQUREUiBmcmFtZV9pbml0aWFsX3N0YWNrX2FkZHJlc3MgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworCisvKiBGaWxsIGluIGZpLT5zYXZlZF9yZWdzICovCisKK3N0cnVjdCBmcmFtZV9leHRyYV9pbmZvCit7CisgIC8qIEZ1bmN0aW9ucyBjYWxsaW5nIGFsbG9jYSgpIGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIHN0YWNrCisgICAgIHBvaW50ZXIuIFdlIG5lZWQgdG8gdXNlIGluaXRpYWwgc3RhY2sgcG9pbnRlciAod2hpY2ggaXMgc2F2ZWQgaW4KKyAgICAgcjMxIGJ5IGdjYykgaW4gc3VjaCBjYXNlcy4gSWYgYSBjb21waWxlciBlbWl0cyB0cmFjZWJhY2sgdGFibGUsCisgICAgIHRoZW4gd2Ugc2hvdWxkIHVzZSB0aGUgYWxsb2NhIHJlZ2lzdGVyIHNwZWNpZmllZCBpbiB0cmFjZWJhY2sKKyAgICAgdGFibGUuIEZJWE1FLiAqLworICBDT1JFX0FERFIgaW5pdGlhbF9zcDsJCQkvKiBpbml0aWFsIHN0YWNrIHBvaW50ZXIuICovCit9OworCit2b2lkCityczYwMDBfaW5pdF9leHRyYV9mcmFtZV9pbmZvIChmcm9tbGVhZiwgZmkpCisgICAgIGludCBmcm9tbGVhZjsKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworeworICBmaS0+ZXh0cmFfaW5mbyA9IChzdHJ1Y3QgZnJhbWVfZXh0cmFfaW5mbyopCisgICAgZnJhbWVfb2JzdGFja19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZnJhbWVfZXh0cmFfaW5mbykpOworICBmaS0+ZXh0cmFfaW5mby0+aW5pdGlhbF9zcCA9IDA7CisgIGlmIChmaS0+bmV4dCAhPSAoQ09SRV9BRERSKSAwCisgICAgICAmJiBmaS0+cGMgPCBURVhUX1NFR01FTlRfQkFTRSkKKyAgICAvKiBXZSdyZSBpbiBnZXRfcHJldl9mcmFtZV9pbmZvICovCisgICAgLyogYW5kIHRoaXMgaXMgYSBzcGVjaWFsIHNpZ25hbCBmcmFtZS4gICovCisgICAgLyogKGZpLT5wYyB3aWxsIGJlIHNvbWUgbG93IGFkZHJlc3MgaW4gdGhlIGtlcm5lbCwgKi8KKyAgICAvKiAgdG8gd2hpY2ggdGhlIHNpZ25hbCBoYW5kbGVyIHJldHVybnMpLiAgKi8KKyAgICBmaS0+c2lnbmFsX2hhbmRsZXJfY2FsbGVyID0gMTsKK30KKworCit2b2lkCityczYwMDBfZnJhbWVfaW5pdF9zYXZlZF9yZWdzIChmaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworeworICBmcmFtZV9nZXRfc2F2ZWRfcmVncyAoZmksIE5VTEwpOworfQorCitDT1JFX0FERFIKK3JzNjAwMF9mcmFtZV9hcmdzX2FkZHJlc3MgKGZpKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7Cit7CisgIGlmIChmaS0+ZXh0cmFfaW5mby0+aW5pdGlhbF9zcCAhPSAwKQorICAgIHJldHVybiBmaS0+ZXh0cmFfaW5mby0+aW5pdGlhbF9zcDsKKyAgZWxzZQorICAgIHJldHVybiBmcmFtZV9pbml0aWFsX3N0YWNrX2FkZHJlc3MgKGZpKTsKK30KKworCisvKiBDYWxjdWxhdGUgdGhlIGRlc3RpbmF0aW9uIG9mIGEgYnJhbmNoL2p1bXAuICBSZXR1cm4gLTEgaWYgbm90IGEgYnJhbmNoLiAgKi8KKworc3RhdGljIENPUkVfQUREUgorYnJhbmNoX2Rlc3QgKG9wY29kZSwgaW5zdHIsIHBjLCBzYWZldHkpCisgICAgIGludCBvcGNvZGU7CisgICAgIGludCBpbnN0cjsKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBDT1JFX0FERFIgc2FmZXR5OworeworICBDT1JFX0FERFIgZGVzdDsKKyAgaW50IGltbWVkaWF0ZTsKKyAgaW50IGFic29sdXRlOworICBpbnQgZXh0X29wOworCisgIGFic29sdXRlID0gKGludCkgKChpbnN0ciA+PiAxKSAmIDEpOworCisgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgIGNhc2UgMTgJOgorCWltbWVkaWF0ZSA9ICgoaW5zdHIgJiB+MykgPDwgNikgPj4gNjsJLyogYnIgdW5jb25kaXRpb25hbCAqLworCWlmIChhYnNvbHV0ZSkKKwkgIGRlc3QgPSBpbW1lZGlhdGU7CQorCWVsc2UKKwkgIGRlc3QgPSBwYyArIGltbWVkaWF0ZTsKKwlicmVhazsKKworICAgICBjYXNlIDE2CTogIAorICAgICAgICBpbW1lZGlhdGUgPSAoKGluc3RyICYgfjMpIDw8IDE2KSA+PiAxNjsJLyogYnIgY29uZGl0aW9uYWwgKi8KKwlpZiAoYWJzb2x1dGUpCisJICBkZXN0ID0gaW1tZWRpYXRlOwkKKwllbHNlCisJICBkZXN0ID0gcGMgKyBpbW1lZGlhdGU7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgMTkJOgorCWV4dF9vcCA9IChpbnN0cj4+MSkgJiAweDNmZjsKKworCWlmIChleHRfb3AgPT0gMTYpCQkJLyogYnIgY29uZGl0aW9uYWwgcmVnaXN0ZXIgKi8KKwkgIHsKKwkgICAgZGVzdCA9IHJlYWRfcmVnaXN0ZXIgKExSX1JFR05VTSkgJiB+MzsKKworCSAgICAvKiBJZiB3ZSBhcmUgYWJvdXQgdG8gcmV0dXJuIGZyb20gYSBzaWduYWwgaGFuZGxlciwgZGVzdCBpcworCSAgICAgICBzb21ldGhpbmcgbGlrZSAweDNjOTAuICBUaGUgY3VycmVudCBmcmFtZSBpcyBhIHNpZ25hbCBoYW5kbGVyCisJICAgICAgIGNhbGxlciBmcmFtZSwgdXBvbiBjb21wbGV0aW9uIG9mIHRoZSBzaWdyZXR1cm4gc3lzdGVtIGNhbGwKKwkgICAgICAgZXhlY3V0aW9uIHdpbGwgcmV0dXJuIHRvIHRoZSBzYXZlZCBQQyBpbiB0aGUgZnJhbWUuICAqLworCSAgICBpZiAoZGVzdCA8IFRFWFRfU0VHTUVOVF9CQVNFKQorCSAgICAgIHsKKwkJc3RydWN0IGZyYW1lX2luZm8gKmZpOworCisJCWZpID0gZ2V0X2N1cnJlbnRfZnJhbWUgKCk7CisJCWlmIChmaSAhPSBOVUxMKQorCQkgIGRlc3QgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChmaS0+ZnJhbWUgKyBTSUdfRlJBTUVfUENfT0ZGU0VULAorCQkJCQkgICAgICA0KTsKKwkgICAgICB9CisJICB9CisKKwllbHNlIGlmIChleHRfb3AgPT0gNTI4KQkJCS8qIGJyIGNvbmQgdG8gY291bnQgcmVnICovCisJICB7CisJICAgIGRlc3QgPSByZWFkX3JlZ2lzdGVyIChDVFJfUkVHTlVNKSAmIH4zOworCisJICAgIC8qIElmIHdlIGFyZSBhYm91dCB0byBleGVjdXRlIGEgc3lzdGVtIGNhbGwsIGRlc3QgaXMgc29tZXRoaW5nCisJICAgICAgIGxpa2UgMHgyMmZjIG9yIDB4M2IwMC4gIFVwb24gY29tcGxldGlvbiB0aGUgc3lzdGVtIGNhbGwKKwkgICAgICAgd2lsbCByZXR1cm4gdG8gdGhlIGFkZHJlc3MgaW4gdGhlIGxpbmsgcmVnaXN0ZXIuICAqLworCSAgICBpZiAoZGVzdCA8IFRFWFRfU0VHTUVOVF9CQVNFKQorCSAgICAgIGRlc3QgPSByZWFkX3JlZ2lzdGVyIChMUl9SRUdOVU0pICYgfjM7CisJICB9CisJZWxzZSByZXR1cm4gLTE7IAorCWJyZWFrOworCQorICAgICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gKGRlc3QgPCBURVhUX1NFR01FTlRfQkFTRSkgPyBzYWZldHkgOiBkZXN0OworfQorCisKKy8qIFNlcXVlbmNlIG9mIGJ5dGVzIGZvciBicmVha3BvaW50IGluc3RydWN0aW9uLiAgKi8KKworI2RlZmluZSBCSUdfQlJFQUtQT0lOVCB7IDB4N2QsIDB4ODIsIDB4MTAsIDB4MDggfQorI2RlZmluZSBMSVRUTEVfQlJFQUtQT0lOVCB7IDB4MDgsIDB4MTAsIDB4ODIsIDB4N2QgfQorCit1bnNpZ25lZCBjaGFyICoKK3JzNjAwMF9icmVha3BvaW50X2Zyb21fcGMgKGJwX2FkZHIsIGJwX3NpemUpCisgICAgIENPUkVfQUREUiAqYnBfYWRkcjsKKyAgICAgaW50ICpicF9zaXplOworeworICBzdGF0aWMgdW5zaWduZWQgY2hhciBiaWdfYnJlYWtwb2ludFtdID0gQklHX0JSRUFLUE9JTlQ7CisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGxpdHRsZV9icmVha3BvaW50W10gPSBMSVRUTEVfQlJFQUtQT0lOVDsKKyAgKmJwX3NpemUgPSA0OworICBpZiAoVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKKyAgICByZXR1cm4gYmlnX2JyZWFrcG9pbnQ7CisgIGVsc2UKKyAgICByZXR1cm4gbGl0dGxlX2JyZWFrcG9pbnQ7Cit9CisKKworLyogQUlYIGRvZXMgbm90IHN1cHBvcnQgUFRfU1RFUC4gU2ltdWxhdGUgaXQuICovCisKK3ZvaWQKK3JzNjAwMF9zb2Z0d2FyZV9zaW5nbGVfc3RlcCAoc2lnbmFsLCBpbnNlcnRfYnJlYWtwb2ludHNfcCkKKyAgICAgdW5zaWduZWQgaW50IHNpZ25hbDsKKyAgICAgaW50IGluc2VydF9icmVha3BvaW50c19wOworeworI2RlZmluZQlJTlNOTEVOKE9QQ09ERSkJIDQKKworICBzdGF0aWMgY2hhciBsZV9icmVha3BbXSA9IExJVFRMRV9CUkVBS1BPSU5UOworICBzdGF0aWMgY2hhciBiZV9icmVha3BbXSA9IEJJR19CUkVBS1BPSU5UOworICBjaGFyICpicmVha3AgPSBUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOID8gYmVfYnJlYWtwIDogbGVfYnJlYWtwOworICBpbnQgaWksIGluc247CisgIENPUkVfQUREUiBsb2M7CisgIENPUkVfQUREUiBicmVha3NbMl07CisgIGludCBvcGNvZGU7CisKKyAgaWYgKGluc2VydF9icmVha3BvaW50c19wKSB7CisKKyAgICBsb2MgPSByZWFkX3BjICgpOworCisgICAgaW5zbiA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKGxvYywgNCk7CisKKyAgICBicmVha3NbMF0gPSBsb2MgKyBJTlNOTEVOKGluc24pOworICAgIG9wY29kZSA9IGluc24gPj4gMjY7CisgICAgYnJlYWtzWzFdID0gYnJhbmNoX2Rlc3QgKG9wY29kZSwgaW5zbiwgbG9jLCBicmVha3NbMF0pOworCisgICAgLyogRG9uJ3QgcHV0IHR3byBicmVha3BvaW50cyBvbiB0aGUgc2FtZSBhZGRyZXNzLiAqLworICAgIGlmIChicmVha3NbMV0gPT0gYnJlYWtzWzBdKQorICAgICAgYnJlYWtzWzFdID0gLTE7CisKKyAgICBzdGVwQnJlYWtzWzFdLmFkZHJlc3MgPSAwOworCisgICAgZm9yIChpaT0wOyBpaSA8IDI7ICsraWkpIHsKKworICAgICAgLyogaWdub3JlIGludmFsaWQgYnJlYWtwb2ludC4gKi8KKyAgICAgIGlmICggYnJlYWtzW2lpXSA9PSAtMSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHJlYWRfbWVtb3J5IChicmVha3NbaWldLCBzdGVwQnJlYWtzW2lpXS5kYXRhLCA0KTsKKworICAgICAgd3JpdGVfbWVtb3J5IChicmVha3NbaWldLCBicmVha3AsIDQpOworICAgICAgc3RlcEJyZWFrc1tpaV0uYWRkcmVzcyA9IGJyZWFrc1tpaV07CisgICAgfSAgCisKKyAgfSBlbHNlIHsKKworICAgIC8qIHJlbW92ZSBzdGVwIGJyZWFrcG9pbnRzLiAqLworICAgIGZvciAoaWk9MDsgaWkgPCAyOyArK2lpKQorICAgICAgaWYgKHN0ZXBCcmVha3NbaWldLmFkZHJlc3MgIT0gMCkKKyAgICAgICAgd3JpdGVfbWVtb3J5IAorICAgICAgICAgICAoc3RlcEJyZWFrc1tpaV0uYWRkcmVzcywgc3RlcEJyZWFrc1tpaV0uZGF0YSwgNCk7CisKKyAgfQorICBlcnJubyA9IDA7CQkJLyogRklYTUUsIGRvbid0IGlnbm9yZSBlcnJvcnMhICovCisJCQkvKiBXaGF0IGVycm9ycz8gIHtyZWFkLHdyaXRlfV9tZW1vcnkgY2FsbCBlcnJvcigpLiAgKi8KK30KKworCisvKiByZXR1cm4gcGMgdmFsdWUgYWZ0ZXIgc2tpcHBpbmcgYSBmdW5jdGlvbiBwcm9sb2d1ZSBhbmQgYWxzbyByZXR1cm4KKyAgIGluZm9ybWF0aW9uIGFib3V0IGEgZnVuY3Rpb24gZnJhbWUuCisKKyAgIGluIHN0cnVjdCByczYwMDBfZnJhbWVkYXRhIGZkYXRhOgorICAgIC0gZnJhbWVsZXNzIGlzIFRSVUUsIGlmIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYSBmcmFtZS4KKyAgICAtIG5vc2F2ZWRwYyBpcyBUUlVFLCBpZiBmdW5jdGlvbiBkb2VzIG5vdCBzYXZlICVwYyB2YWx1ZSBpbiBpdHMgZnJhbWUuCisgICAgLSBvZmZzZXQgaXMgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGlzIHN0YWNrIGZyYW1lIC0tLSB0aGUgYW1vdW50IGJ5CisgICAgICB3aGljaCB3ZSBkZWNyZW1lbnQgdGhlIHNwIHRvIGFsbG9jYXRlIHRoZSBmcmFtZS4KKyAgICAtIHNhdmVkX2dwciBpcyB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBzYXZlZCBncHIuCisgICAgLSBzYXZlZF9mcHIgaXMgdGhlIG51bWJlciBvZiB0aGUgZmlyc3Qgc2F2ZWQgZnByLgorICAgIC0gYWxsb2NhX3JlZyBpcyB0aGUgbnVtYmVyIG9mIHRoZSByZWdpc3RlciB1c2VkIGZvciBhbGxvY2EoKSBoYW5kbGluZy4KKyAgICAgIE90aGVyd2lzZSAtMS4KKyAgICAtIGdwcl9vZmZzZXQgaXMgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3Qgc2F2ZWQgZ3ByIGZyb20gdGhlIHByZXZpb3VzIGZyYW1lLgorICAgIC0gZnByX29mZnNldCBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBzYXZlZCBmcHIgZnJvbSB0aGUgcHJldmlvdXMgZnJhbWUuCisgICAgLSBscl9vZmZzZXQgaXMgdGhlIG9mZnNldCBvZiB0aGUgc2F2ZWQgbHIKKyAgICAtIGNyX29mZnNldCBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBzYXZlZCBjcgorKi8KKworI2RlZmluZSBTSUdORURfU0hPUlQoeCkgCQkJCQkJXAorICAoKHNpemVvZiAoc2hvcnQpID09IDIpCQkJCQkJXAorICAgPyAoKGludCkoc2hvcnQpKHgpKQkJCQkJCQlcCisgICA6ICgoaW50KSgoKCh4KSAmIDB4ZmZmZikgXiAweDgwMDApIC0gMHg4MDAwKSkpCisKKyNkZWZpbmUgR0VUX1NSQ19SRUcoeCkgKCgoeCkgPj4gMjEpICYgMHgxZikKKworQ09SRV9BRERSCitza2lwX3Byb2xvZ3VlIChwYywgZmRhdGEpCisgICAgIENPUkVfQUREUiBwYzsKKyAgICAgc3RydWN0IHJzNjAwMF9mcmFtZWRhdGEgKmZkYXRhOyAKK3sKKyAgQ09SRV9BRERSIG9yaWdfcGMgPSBwYzsKKyAgY2hhciBidWZbNF07CisgIHVuc2lnbmVkIGxvbmcgb3A7CisgIGxvbmcgb2Zmc2V0ID0gMDsKKyAgaW50IGxyX3JlZyA9IDA7CisgIGludCBjcl9yZWcgPSAwOworICBpbnQgcmVnOworICBpbnQgZnJhbWVwID0gMDsKKyAgaW50IG1pbmltYWxfdG9jX2xvYWRlZCA9IDA7CisgIHN0YXRpYyBzdHJ1Y3QgcnM2MDAwX2ZyYW1lZGF0YSB6ZXJvX2ZyYW1lOworCisgICpmZGF0YSA9IHplcm9fZnJhbWU7CisgIGZkYXRhLT5zYXZlZF9ncHIgPSAtMTsKKyAgZmRhdGEtPnNhdmVkX2ZwciA9IC0xOworICBmZGF0YS0+YWxsb2NhX3JlZyA9IC0xOworICBmZGF0YS0+ZnJhbWVsZXNzID0gMTsKKyAgZmRhdGEtPm5vc2F2ZWRwYyA9IDE7CisKKyAgaWYgKHRhcmdldF9yZWFkX21lbW9yeSAocGMsIGJ1ZiwgNCkpCisgICAgcmV0dXJuIHBjOwkJCS8qIENhbid0IGFjY2VzcyBpdCAtLSBhc3N1bWUgbm8gcHJvbG9ndWUuICovCisKKyAgLyogQXNzdW1lIHRoYXQgc3Vic2VxdWVudCBmZXRjaGVzIGNhbiBmYWlsIHdpdGggbG93IHByb2JhYmlsaXR5LiAgKi8KKyAgcGMgLT0gNDsKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBwYyArPSA0OworICAgICAgb3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgNCk7CisKKyAgICAgIGlmICgob3AgJiAweGZjMWZmZmZmKSA9PSAweDdjMDgwMmE2KSB7CQkvKiBtZmxyIFJ4ICovCisJbHJfcmVnID0gKG9wICYgMHgwM2UwMDAwMCkgfCAweDkwMDEwMDAwOworCWNvbnRpbnVlOworCisgICAgICB9IGVsc2UgaWYgKChvcCAmIDB4ZmMxZmZmZmYpID09IDB4N2MwMDAwMjYpIHsJLyogbWZjciBSeCAqLworCWNyX3JlZyA9IChvcCAmIDB4MDNlMDAwMDApIHwgMHg5MDAxMDAwMDsKKwljb250aW51ZTsKKworICAgICAgfSBlbHNlIGlmICgob3AgJiAweGZjMWYwMDAwKSA9PSAweGQ4MDEwMDAwKSB7CS8qIHN0ZmQgUngsTlVNKHIxKSAqLworCXJlZyA9IEdFVF9TUkNfUkVHIChvcCk7CisJaWYgKGZkYXRhLT5zYXZlZF9mcHIgPT0gLTEgfHwgZmRhdGEtPnNhdmVkX2ZwciA+IHJlZykgeworCSAgZmRhdGEtPnNhdmVkX2ZwciA9IHJlZzsKKwkgIGZkYXRhLT5mcHJfb2Zmc2V0ID0gU0lHTkVEX1NIT1JUIChvcCkgKyBvZmZzZXQ7CisJfQorCWNvbnRpbnVlOworCisgICAgICB9IGVsc2UgaWYgKCgob3AgJiAweGZjMWYwMDAwKSA9PSAweGJjMDEwMDAwKSB8fCAJLyogc3RtIFJ4LCBOVU0ocjEpICovCisJCSAoKG9wICYgMHhmYzFmMDAwMCkgPT0gMHg5MDAxMDAwMCAmJgkvKiBzdCByeCxOVU0ocjEpLCAKKwkJCQkJCQkgICByeCA+PSByMTMgKi8KKwkJICAob3AgJiAweDAzZTAwMDAwKSA+PSAweDAxYTAwMDAwKSkgeworCisJcmVnID0gR0VUX1NSQ19SRUcgKG9wKTsKKwlpZiAoZmRhdGEtPnNhdmVkX2dwciA9PSAtMSB8fCBmZGF0YS0+c2F2ZWRfZ3ByID4gcmVnKSB7CisJICBmZGF0YS0+c2F2ZWRfZ3ByID0gcmVnOworCSAgZmRhdGEtPmdwcl9vZmZzZXQgPSBTSUdORURfU0hPUlQgKG9wKSArIG9mZnNldDsKKwl9CisJY29udGludWU7CisKKyAgICAgIH0gZWxzZSBpZiAoKG9wICYgMHhmZmZmMDAwMCkgPT0gMHgzYzAwMDAwMCkgewkvKiBhZGRpcyAwLDAsTlVNLCB1c2VkCisJCQkJCQkJICAgZm9yID49IDMyayBmcmFtZXMgKi8KKwlmZGF0YS0+b2Zmc2V0ID0gKG9wICYgMHgwMDAwZmZmZikgPDwgMTY7CisJZmRhdGEtPmZyYW1lbGVzcyA9IDA7CisJY29udGludWU7CisKKyAgICAgIH0gZWxzZSBpZiAoKG9wICYgMHhmZmZmMDAwMCkgPT0gMHg2MDAwMDAwMCkgewkvKiBvcmkgMCwwLE5VTSwgMm5kIGhhCisJCQkJCQkJICAgbGYgb2YgPj0gMzJrIGZyYW1lcyAqLworCWZkYXRhLT5vZmZzZXQgfD0gKG9wICYgMHgwMDAwZmZmZik7CisJZmRhdGEtPmZyYW1lbGVzcyA9IDA7CisJY29udGludWU7CisKKyAgICAgIH0gZWxzZSBpZiAoKG9wICYgMHhmZmZmMDAwMCkgPT0gbHJfcmVnKSB7CQkvKiBzdCBSeCxOVU0ocjEpIAorCQkJCQkJCSAgIHdoZXJlIFJ4ID09IGxyICovCisJZmRhdGEtPmxyX29mZnNldCA9IFNJR05FRF9TSE9SVCAob3ApICsgb2Zmc2V0OworCWZkYXRhLT5ub3NhdmVkcGMgPSAwOworCWxyX3JlZyA9IDA7CisJY29udGludWU7CisKKyAgICAgIH0gZWxzZSBpZiAoKG9wICYgMHhmZmZmMDAwMCkgPT0gY3JfcmVnKSB7CQkvKiBzdCBSeCxOVU0ocjEpIAorCQkJCQkJCSAgIHdoZXJlIFJ4ID09IGNyICovCisJZmRhdGEtPmNyX29mZnNldCA9IFNJR05FRF9TSE9SVCAob3ApICsgb2Zmc2V0OworCWNyX3JlZyA9IDA7CisJY29udGludWU7CisKKyAgICAgIH0gZWxzZSBpZiAob3AgPT0gMHg0ODAwMDAwNSkgewkJCS8qIGJsIC4rNCB1c2VkIGluIAorCQkJCQkJCSAgIC1tcmVsb2NhdGFibGUgKi8KKwljb250aW51ZTsKKworICAgICAgfSBlbHNlIGlmIChvcCA9PSAweDQ4MDAwMDA0KSB7CQkJLyogYiAuKzQgKHhsYykgKi8KKwlicmVhazsKKworICAgICAgfSBlbHNlIGlmICgoKG9wICYgMHhmZmZmMDAwMCkgPT0gMHg4MDFlMDAwMCB8fAkvKiBsd3ogMCxOVU0ocjMwKSwgdXNlZAorCQkJCQkJCSAgIGluIFYuNCAtbXJlbG9jYXRhYmxlICovCisJCSAgb3AgPT0gMHg3ZmMwZjIxNCkgJiYJCQkvKiBhZGQgcjMwLHIwLHIzMCwgdXNlZAorCQkJCQkJCSAgIGluIFYuNCAtbXJlbG9jYXRhYmxlICovCisJCSBscl9yZWcgPT0gMHg5MDFlMDAwMCkgeworCWNvbnRpbnVlOworCisgICAgICB9IGVsc2UgaWYgKChvcCAmIDB4ZmZmZjAwMDApID09IDB4M2ZjMDAwMDAgfHwJLyogYWRkaXMgMzAsMCxmb29AaGEsIHVzZWQKKwkJCQkJCQkgICBpbiBWLjQgLW1taW5pbWFsLXRvYyAqLworCQkgKG9wICYgMHhmZmZmMDAwMCkgPT0gMHgzYmRlMDAwMCkgewkvKiBhZGRpIDMwLDMwLGZvb0BsICovCisJY29udGludWU7CisKKyAgICAgIH0gZWxzZSBpZiAoKG9wICYgMHhmYzAwMDAwMCkgPT0gMHg0ODAwMDAwMCkgewkvKiBibCBmb28sIAorCQkJCQkJCSAgIHRvIHNhdmUgZnBycz8/PyAqLworCisJZmRhdGEtPmZyYW1lbGVzcyA9IDA7CisJLyogRG9uJ3Qgc2tpcCBvdmVyIHRoZSBzdWJyb3V0aW5lIGNhbGwgaWYgaXQgaXMgbm90IHdpdGhpbiB0aGUgZmlyc3QKKwkgICB0aHJlZSBpbnN0cnVjdGlvbnMgb2YgdGhlIHByb2xvZ3VlLiAgKi8KKwlpZiAoKHBjIC0gb3JpZ19wYykgPiA4KQorCSAgYnJlYWs7CisKKwlvcCA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjKzQsIDQpOworCisJLyogQXQgdGhpcyBwb2ludCwgbWFrZSBzdXJlIHRoaXMgaXMgbm90IGEgdHJhbXBvbGluZSBmdW5jdGlvbgorCSAgIChhIGZ1bmN0aW9uIHRoYXQgc2ltcGx5IGNhbGxzIGFub3RoZXIgZnVuY3Rpb25zLCBhbmQgbm90aGluZyBlbHNlKS4KKwkgICBJZiB0aGUgbmV4dCBpcyBub3QgYSBub3AsIHRoaXMgYnJhbmNoIHdhcyBwYXJ0IG9mIHRoZSBmdW5jdGlvbgorCSAgIHByb2xvZ3VlLiAqLworCisJaWYgKG9wID09IDB4NGRlZjdiODIgfHwgb3AgPT0gMCkJCS8qIGNyb3JjIDE1LCAxNSwgMTUgKi8KKwkgIGJyZWFrOwkJCQkJLyogZG9uJ3Qgc2tpcCBvdmVyIAorCQkJCQkJCSAgIHRoaXMgYnJhbmNoICovCisJY29udGludWU7CisKKyAgICAgIC8qIHVwZGF0ZSBzdGFjayBwb2ludGVyICovCisgICAgICB9IGVsc2UgaWYgKChvcCAmIDB4ZmZmZjAwMDApID09IDB4OTQyMTAwMDApIHsJLyogc3R1IHIxLE5VTShyMSkgKi8KKwlmZGF0YS0+ZnJhbWVsZXNzID0gMDsKKwlmZGF0YS0+b2Zmc2V0ID0gU0lHTkVEX1NIT1JUIChvcCk7CisJb2Zmc2V0ID0gZmRhdGEtPm9mZnNldDsKKwljb250aW51ZTsKKworICAgICAgfSBlbHNlIGlmIChvcCA9PSAweDdjMjEwMTZlKSB7CQkJLyogc3R3dXggMSwxLDAgKi8KKwlmZGF0YS0+ZnJhbWVsZXNzID0gMDsKKwlvZmZzZXQgPSBmZGF0YS0+b2Zmc2V0OworCWNvbnRpbnVlOworCisgICAgICAvKiBMb2FkIHVwIG1pbmltYWwgdG9jIHBvaW50ZXIgKi8KKyAgICAgIH0gZWxzZSBpZiAoKG9wID4+IDIyKSA9PSAweDIwZgorCSAgICAgICAgICYmICEgbWluaW1hbF90b2NfbG9hZGVkKSB7CS8qIGwgcjMxLC4uLiBvciBsIHIzMCwuLi4gKi8KKwltaW5pbWFsX3RvY19sb2FkZWQgPSAxOworCWNvbnRpbnVlOworCisgICAgICAvKiBzdG9yZSBwYXJhbWV0ZXJzIGluIHN0YWNrICovCisgICAgICB9IGVsc2UgaWYgKChvcCAmIDB4ZmMxZjAwMDApID09IDB4OTAwMTAwMDAgfHwJLyogc3QgcngsTlVNKHIxKSAqLworCQkgKG9wICYgMHhmYzFmMDAwMCkgPT0gMHhkODAxMDAwMCB8fAkvKiBzdGZkIFJ4LE5VTShyMSkgKi8KKwkJIChvcCAmIDB4ZmMxZjAwMDApID09IDB4ZmMwMTAwMDApIHsJLyogZnJzcCwgZnA/LE5VTShyMSkgKi8KKwljb250aW51ZTsKKworICAgICAgLyogc3RvcmUgcGFyYW1ldGVycyBpbiBzdGFjayB2aWEgZnJhbWUgcG9pbnRlciAqLworICAgICAgfSBlbHNlIGlmIChmcmFtZXAgJiYKKwkJICgob3AgJiAweGZjMWYwMDAwKSA9PSAweDkwMWYwMDAwIHx8CS8qIHN0IHJ4LE5VTShyMSkgKi8KKwkJIChvcCAmIDB4ZmMxZjAwMDApID09IDB4ZDgxZjAwMDAgfHwJLyogc3RmZCBSeCxOVU0ocjEpICovCisJCSAob3AgJiAweGZjMWYwMDAwKSA9PSAweGZjMWYwMDAwKSkgewkvKiBmcnNwLCBmcD8sTlVNKHIxKSAqLworCWNvbnRpbnVlOworCisgICAgICAvKiBTZXQgdXAgZnJhbWUgcG9pbnRlciAqLworICAgICAgfSBlbHNlIGlmIChvcCA9PSAweDYwM2YwMDAwCQkJLyogb3JpbCByMzEsIHIxLCAweDAgKi8KKwkJIHx8IG9wID09IDB4N2MzZjBiNzgpIHsJCQkvKiBtciByMzEsIHIxICovCisJZmRhdGEtPmZyYW1lbGVzcyA9IDA7CisJZnJhbWVwID0gMTsKKwlmZGF0YS0+YWxsb2NhX3JlZyA9IDMxOworCWNvbnRpbnVlOworCisgICAgICAvKiBBbm90aGVyIHdheSB0byBzZXQgdXAgdGhlIGZyYW1lIHBvaW50ZXIuICAqLworICAgICAgfSBlbHNlIGlmICgob3AgJiAweGZjMWZmZmZmKSA9PSAweDM4MDEwMDAwKSB7CS8qIGFkZGkgclgsIHIxLCAweDAgKi8KKwlmZGF0YS0+ZnJhbWVsZXNzID0gMDsKKwlmcmFtZXAgPSAxOworCWZkYXRhLT5hbGxvY2FfcmVnID0gKG9wICYgfjB4MzgwMTAwMDApID4+IDIxOworCWNvbnRpbnVlOworCisgICAgICB9IGVsc2UgeworCWJyZWFrOworICAgICAgfQorICAgIH0KKworI2lmIDAKKy8qIEkgaGF2ZSBwcm9ibGVtcyB3aXRoIHNraXBwaW5nIG92ZXIgX19tYWluKCkgdGhhdCBJIG5lZWQgdG8gYWRkcmVzcworICogc29tZXRpbWUuIFByZXZpb3VzbHksIEkgdXNlZCB0byB1c2UgbWlzY19mdW5jdGlvbl92ZWN0b3Igd2hpY2gKKyAqIGRpZG4ndCB3b3JrIGFzIHdlbGwgYXMgSSB3YW50ZWQgdG8gYmUuICAtTUdPICovCisKKyAgLyogSWYgdGhlIGZpcnN0IHRoaW5nIGFmdGVyIHNraXBwaW5nIGEgcHJvbG9nIGlzIGEgYnJhbmNoIHRvIGEgZnVuY3Rpb24sCisgICAgIHRoaXMgbWlnaHQgYmUgYSBjYWxsIHRvIGFuIGluaXRpYWxpemVyIGluIG1haW4oKSwgaW50cm9kdWNlZCBieSBnY2MyLgorICAgICBXZSdkIGxpa2UgdG8gc2tpcCBvdmVyIGl0IGFzIHdlbGwuIEZvcnR1bmF0ZWx5LCB4bGMgZG9lcyBzb21lIGV4dHJhCisgICAgIHdvcmsgYmVmb3JlIGNhbGxpbmcgYSBmdW5jdGlvbiByaWdodCBhZnRlciBhIHByb2xvZ3VlLCB0aHVzIHdlIGNhbgorICAgICBzaW5nbGUgb3V0IHN1Y2ggZ2NjMiBiZWhhdmlvdXIuICovCisgICAgIAorCisgIGlmICgob3AgJiAweGZjMDAwMDAxKSA9PSAweDQ4MDAwMDAxKSB7IC8qIGJsIGZvbywgYW4gaW5pdGlhbGl6ZXIgZnVuY3Rpb24/ICovCisgICAgb3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYys0LCA0KTsKKworICAgIGlmIChvcCA9PSAweDRkZWY3YjgyKSB7CQkvKiBjcm9yIDB4ZiwgMHhmLCAweGYgKG5vcCkgKi8KKworICAgICAgLyogY2hlY2sgYW5kIHNlZSBpZiB3ZSBhcmUgaW4gbWFpbi4gSWYgc28sIHNraXAgb3ZlciB0aGlzIGluaXRpYWxpemVyCisgICAgICAgICBmdW5jdGlvbiBhcyB3ZWxsLiAqLworCisgICAgICB0bXAgPSBmaW5kX3BjX21pc2NfZnVuY3Rpb24gKHBjKTsKKyAgICAgIGlmICh0bXAgPj0gMCAmJiBTVFJFUSAobWlzY19mdW5jdGlvbl92ZWN0b3IgW3RtcF0ubmFtZSwgIm1haW4iKSkKKyAgICAgICAgcmV0dXJuIHBjICsgODsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiAwICovCisgCisgIGZkYXRhLT5vZmZzZXQgPSAtIGZkYXRhLT5vZmZzZXQ7CisgIHJldHVybiBwYzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBTdXBwb3J0IGZvciBjcmVhdGluZyBwdXNoaW5kIGEgZHVtbXkgZnJhbWUgaW50byB0aGUgc3RhY2ssIGFuZCBwb3BwaW5nCisgIGZyYW1lcywgZXRjLiAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSB0b3RhbCBzaXplIG9mIGR1bW15IGZyYW1lIGlzIDQzNiwgd2hpY2ggaXM7CisKKwkzMiBncHIncwktIDEyOCBieXRlcworCTMyIGZwcidzCS0gMjU2ICAgIgorCTcgIHRoZSByZXN0CS0gMjggICAgIgorCWFuZCAyNCBleHRyYSBieXRlcyBmb3IgdGhlIGNhbGxlZSdzIGxpbmsgYXJlYS4gVGhlIGxhc3QgMjQgYnl0ZXMKKwlmb3IgdGhlIGxpbmsgYXJlYSBtaWdodCBub3QgYmUgbmVjZXNzYXJ5LCBzaW5jZSBpdCB3aWxsIGJlIHRha2VuCisJY2FyZSBvZiBieSBwdXNoX2FyZ3VtZW50cygpLiAqLworCisjZGVmaW5lIERVTU1ZX0ZSQU1FX1NJWkUgNDM2CisKKyNkZWZpbmUJRFVNTVlfRlJBTUVfQUREUl9TSVpFIDEwCisKKy8qIE1ha2Ugc3VyZSB5b3UgaW5pdGlhbGl6ZSB0aGVzZSBpbiBzb21ld2hlcmUsIGluIGNhc2UgZ2RiIGdpdmVzIHVwIHdoYXQgaXQKKyAgIHdhcyBkZWJ1Z2dpbmcgYW5kIHN0YXJ0cyBkZWJ1Z2dpbmcgc29tZXRoaW5nIGVsc2UuIEZJWE1FaWJtICovCisKK3N0YXRpYyBpbnQgZHVtbXlfZnJhbWVfY291bnQgPSAwOworc3RhdGljIGludCBkdW1teV9mcmFtZV9zaXplID0gMDsKK3N0YXRpYyBDT1JFX0FERFIgKmR1bW15X2ZyYW1lX2FkZHIgPSAwOworCitleHRlcm4gaW50IHN0b3Bfc3RhY2tfZHVtbXk7CisKKy8qIHB1c2ggYSBkdW1teSBmcmFtZSBpbnRvIHN0YWNrLCBzYXZlIGFsbCByZWdpc3Rlci4gQ3VycmVudGx5IHdlIGFyZSBzYXZpbmcKKyAgIG9ubHkgZ3ByJ3MgYW5kIGZwcidzLCB3aGljaCBpcyBub3QgZ29vZCBlbm91Z2ghIEZJWE1FbWdvICovCisgICAKK3ZvaWQKK3B1c2hfZHVtbXlfZnJhbWUgKCkKK3sKKyAgLyogc3RhY2sgcG9pbnRlci4gICovCisgIENPUkVfQUREUiBzcDsKKyAgLyogU2FtZSB0aGluZywgdGFyZ2V0IGJ5dGUgb3JkZXIuICAqLworICBjaGFyIHNwX3RhcmdbNF07CisKKyAgLyogbGluayByZWdpc3Rlci4gICovCisgIENPUkVfQUREUiBwYzsKKyAgLyogU2FtZSB0aGluZywgdGFyZ2V0IGJ5dGUgb3JkZXIuICAqLworICBjaGFyIHBjX3RhcmdbNF07CisgIAorICAvKiBOZWVkZWQgdG8gZmlndXJlIG91dCB3aGVyZSB0byBzYXZlIHRoZSBkdW1teSBsaW5rIGFyZWEuCisgICAgIEZJWE1FOiBUaGVyZSBzaG91bGQgYmUgYW4gZWFzaWVyIHdheSB0byBkbyB0aGlzLCBubz8gIHRpZW1hbm4gOS85Lzk1LiAgKi8KKyAgc3RydWN0IHJzNjAwMF9mcmFtZWRhdGEgZmRhdGE7CisKKyAgaW50IGlpOworCisgIHRhcmdldF9mZXRjaF9yZWdpc3RlcnMgKC0xKTsKKworICBpZiAoZHVtbXlfZnJhbWVfY291bnQgPj0gZHVtbXlfZnJhbWVfc2l6ZSkgeworICAgIGR1bW15X2ZyYW1lX3NpemUgKz0gRFVNTVlfRlJBTUVfQUREUl9TSVpFOworICAgIGlmIChkdW1teV9mcmFtZV9hZGRyKQorICAgICAgZHVtbXlfZnJhbWVfYWRkciA9IChDT1JFX0FERFIqKSB4cmVhbGxvYyAKKyAgICAgICAgKGR1bW15X2ZyYW1lX2FkZHIsIHNpemVvZihDT1JFX0FERFIpICogKGR1bW15X2ZyYW1lX3NpemUpKTsKKyAgICBlbHNlCisgICAgICBkdW1teV9mcmFtZV9hZGRyID0gKENPUkVfQUREUiopIAorCXhtYWxsb2MgKHNpemVvZihDT1JFX0FERFIpICogKGR1bW15X2ZyYW1lX3NpemUpKTsKKyAgfQorICAKKyAgc3AgPSByZWFkX3JlZ2lzdGVyKFNQX1JFR05VTSk7CisgIHBjID0gcmVhZF9yZWdpc3RlcihQQ19SRUdOVU0pOworICBzdG9yZV9hZGRyZXNzIChwY190YXJnLCA0LCBwYyk7CisKKyAgc2tpcF9wcm9sb2d1ZSAoZ2V0X3BjX2Z1bmN0aW9uX3N0YXJ0IChwYyksICZmZGF0YSk7CisKKyAgZHVtbXlfZnJhbWVfYWRkciBbZHVtbXlfZnJhbWVfY291bnQrK10gPSBzcDsKKworICAvKiBCZSBjYXJlZnVsISBJZiB0aGUgc3RhY2sgcG9pbnRlciBpcyBub3QgZGVjcmVtZW50ZWQgZmlyc3QsIHRoZW4ga2VybmVsIAorICAgICB0aGlua3MgaGUgaXMgZnJlZSB0byB1c2UgdGhlIHNwYWNlIHVuZGVybmVhdGggaXQuIEFuZCBrZXJuZWwgYWN0dWFsbHkgCisgICAgIHVzZXMgdGhhdCBhcmVhIGZvciBJUEMgcHVycG9zZXMgd2hlbiBleGVjdXRpbmcgcHRyYWNlKDIpIGNhbGxzLiBTbyAKKyAgICAgYmVmb3JlIHdyaXRpbmcgcmVnaXN0ZXIgdmFsdWVzIGludG8gdGhlIG5ldyBmcmFtZSwgZGVjcmVtZW50IGFuZCB1cGRhdGUKKyAgICAgJXNwIGZpcnN0IGluIG9yZGVyIHRvIHNlY3VyZSB5b3VyIGZyYW1lLiAqLworCisgIC8qIEZJWE1FOiBXZSBkb24ndCBjaGVjayBpZiB0aGUgc3RhY2sgcmVhbGx5IGhhcyB0aGlzIG11Y2ggc3BhY2UuCisgICAgIFRoaXMgaXMgYSBwcm9ibGVtIG9uIHRoZSBwcGMgc2ltdWxhdG9yICh3aGljaCBvbmx5IGdyYW50cyBvbmUgcGFnZQorICAgICAoNDA5NiBieXRlcykgYnkgZGVmYXVsdC4gICovCisKKyAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgc3AtRFVNTVlfRlJBTUVfU0laRSk7CisKKyAgLyogZ2RiIHJlbGllcyBvbiB0aGUgc3RhdGUgb2YgY3VycmVudF9mcmFtZS4gV2UnZCBiZXR0ZXIgdXBkYXRlIGl0LAorICAgICBvdGhlcndpc2UgdGhpbmdzIGxpa2UgZG9fcmVnaXN0ZXJzX2luZm8oKSB3b3VsZG4ndCB3b3JrIHByb3Blcmx5ISAqLworCisgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7CisKKyAgLyogc2F2ZSBwcm9ncmFtIGNvdW50ZXIgaW4gbGluayByZWdpc3RlcidzIHNwYWNlLiAqLworICB3cml0ZV9tZW1vcnkgKHNwICsgKGZkYXRhLmxyX29mZnNldCA/IGZkYXRhLmxyX29mZnNldCA6IERFRkFVTFRfTFJfU0FWRSksCisJICAgICAgICBwY190YXJnLCA0KTsKKworICAvKiBzYXZlIGFsbCBmbG9hdGluZyBwb2ludCBhbmQgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyBoZXJlLiAqLworCisgIC8qIGZwcidzLCBmMC4uZjMxICovCisgIGZvciAoaWkgPSAwOyBpaSA8IDMyOyArK2lpKQorICAgIHdyaXRlX21lbW9yeSAoc3AtOC0oaWkqOCksICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoMzEtaWkrRlAwX1JFR05VTSldLCA4KTsKKworICAvKiBncHIncyByMC4ucjMxICovCisgIGZvciAoaWk9MTsgaWkgPD0zMjsgKytpaSkKKyAgICB3cml0ZV9tZW1vcnkgKHNwLTI1Ni0oaWkqNCksICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoMzItaWkpXSwgNCk7CisKKyAgLyogc28gZmFyLCAzMioyICsgMzIgd29yZHMgPSAzODQgYnl0ZXMgaGF2ZSBiZWVuIHdyaXR0ZW4uIAorICAgICA3IGV4dHJhIHJlZ2lzdGVycyBpbiBvdXIgcmVnaXN0ZXIgc2V0OiBwYywgcHMsIGNuZCwgbHIsIGNudCwgeGVyLCBtcSAqLworCisgIGZvciAoaWk9MTsgaWkgPD0gKExBU1RfVUlTQV9TUF9SRUdOVU0tRklSU1RfVUlTQV9TUF9SRUdOVU0rMSk7ICsraWkpIHsKKyAgICB3cml0ZV9tZW1vcnkgKHNwLTM4NC0oaWkqNCksIAorCQkgICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlBMQVNUX1JFR05VTSArIGlpKV0sIDQpOworICB9CisKKyAgLyogU2F2ZSBzcCBvciBzbyBjYWxsZWQgYmFjayBjaGFpbiByaWdodCBoZXJlLiAqLworICBzdG9yZV9hZGRyZXNzIChzcF90YXJnLCA0LCBzcCk7CisgIHdyaXRlX21lbW9yeSAoc3AtRFVNTVlfRlJBTUVfU0laRSwgc3BfdGFyZywgNCk7CisgIHNwIC09IERVTU1ZX0ZSQU1FX1NJWkU7CisKKyAgLyogQW5kIGZpbmFsbHksIHRoaXMgaXMgdGhlIGJhY2sgY2hhaW4uICovCisgIHdyaXRlX21lbW9yeSAoc3ArOCwgcGNfdGFyZywgNCk7Cit9CisKKworLyogUG9wIGEgZHVtbXkgZnJhbWUuCisKKyAgIEluIHJzNjAwMCB3aGVuIHdlIHB1c2ggYSBkdW1teSBmcmFtZSwgd2Ugc2F2ZSBhbGwgb2YgdGhlIHJlZ2lzdGVycy4gVGhpcworICAgaXMgdXN1YWxseSBkb25lIGJlZm9yZSB1c2VyIGNhbGxzIGEgZnVuY3Rpb24gZXhwbGljaXRseS4KKworICAgQWZ0ZXIgYSBkdW1teSBmcmFtZSBpcyBwdXNoZWQsIHNvbWUgaW5zdHJ1Y3Rpb25zIGFyZSBjb3BpZWQgaW50byBzdGFjaywKKyAgIGFuZCBzdGFjayBwb2ludGVyIGlzIGRlY3JlbWVudGVkIGV2ZW4gbW9yZS4gIFNpbmNlIHdlIGRvbid0IGhhdmUgYSBmcmFtZQorICAgcG9pbnRlciB0byBnZXQgYmFjayB0byB0aGUgcGFyZW50IGZyYW1lIG9mIHRoZSBkdW1teSwgd2Ugc3RhcnQgaGF2aW5nCisgICB0cm91YmxlIHBvcGluZyBpdC4gIFRoZXJlZm9yZSwgd2Uga2VlcCBhIGR1bW15IGZyYW1lIHN0YWNrLCBrZWVwaW5nCisgICBhZGRyZXNzZXMgb2YgZHVtbXkgZnJhbWVzIGFzIHN1Y2guICBXaGVuIHBvcGluZyBoYXBwZW5zIGFuZCB3aGVuIHdlCisgICBkZXRlY3QgdGhhdCB3YXMgYSBkdW1teSBmcmFtZSwgd2UgcG9wIGl0IGJhY2sgdG8gaXRzIHBhcmVudCBieSB1c2luZworICAgZHVtbXkgZnJhbWUgc3RhY2sgKGBkdW1teV9mcmFtZV9hZGRyJyBhcnJheSkuIAorCitGSVhNRTogIFRoaXMgd2hvbGUgY29uY2VwdCBpcyBicm9rZW4uICBZb3Ugc2hvdWxkIGJlIGFibGUgdG8gZGV0ZWN0CithIGR1bW15IHN0YWNrIGZyYW1lICpvbiB0aGUgdXNlcidzIHN0YWNrIGl0c2VsZiouICBXaGVuIHlvdSBkbywKK3RoZW4geW91IGtub3cgdGhlIGZvcm1hdCBvZiB0aGF0IHN0YWNrIGZyYW1lIC0tIGluY2x1ZGluZyBpdHMKK3NhdmVkIFNQIHJlZ2lzdGVyISAgVGhlcmUgc2hvdWxkICpub3QqIGJlIGEgc2VwYXJhdGUgc3RhY2sgaW4gdGhlCitHREIgcHJvY2VzcyB0aGF0IGtlZXBzIHRyYWNrIG9mIHRoZXNlIGR1bW15IGZyYW1lcyEgIC0tIGdudUBjeWdudXMuY29tIEF1ZzkyCisgKi8KKyAgIAorc3RhdGljIHZvaWQKK3BvcF9kdW1teV9mcmFtZSAoKQoreworICBDT1JFX0FERFIgc3AsIHBjOworICBpbnQgaWk7CisgIHNwID0gZHVtbXlfZnJhbWVfYWRkciBbLS1kdW1teV9mcmFtZV9jb3VudF07CisKKyAgLyogcmVzdG9yZSBhbGwgZnByJ3MuICovCisgIGZvciAoaWkgPSAxOyBpaSA8PSAzMjsgKytpaSkKKyAgICByZWFkX21lbW9yeSAoc3AtKGlpKjgpLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKDMyLWlpK0ZQMF9SRUdOVU0pXSwgOCk7CisKKyAgLyogcmVzdG9yZSBhbGwgZ3ByJ3MgKi8KKyAgZm9yIChpaT0xOyBpaSA8PSAzMjsgKytpaSkgeworICAgIHJlYWRfbWVtb3J5IChzcC0yNTYtKGlpKjQpLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKDMyLWlpKV0sIDQpOworICB9CisKKyAgLyogcmVzdG9yZSB0aGUgcmVzdCBvZiB0aGUgcmVnaXN0ZXJzLiAqLworICBmb3IgKGlpPTE7IGlpIDw9KExBU1RfVUlTQV9TUF9SRUdOVU0tRklSU1RfVUlTQV9TUF9SRUdOVU0rMSk7ICsraWkpCisgICAgcmVhZF9tZW1vcnkgKHNwLTM4NC0oaWkqNCksCisgICAgCQkmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQTEFTVF9SRUdOVU0gKyBpaSldLCA0KTsKKworICByZWFkX21lbW9yeSAoc3AtKERVTU1ZX0ZSQU1FX1NJWkUtOCksIAorCSAgICAgICAmcmVnaXN0ZXJzIFtSRUdJU1RFUl9CWVRFKFBDX1JFR05VTSldLCA0KTsKKworICAvKiB3aGVuIGEgZHVtbXkgZnJhbWUgd2FzIGJlaW5nIHB1c2hlZCwgd2UgaGFkIHRvIGRlY3JlbWVudCAlc3AgZmlyc3QsIGluIAorICAgICBvcmRlciB0byBzZWN1cmUgYXN0YWNrIHNwYWNlLiBUaHVzLCBzYXZlZCAlc3AgKG9yICVyMSkgdmFsdWUsIGlzIG5vdCB0aGUKKyAgICAgb25lIHdlIHNob3VsZCByZXN0b3JlLiBDaGFuZ2UgaXQgd2l0aCB0aGUgb25lIHdlIG5lZWQuICovCisKKyAgbWVtY3B5ICgmcmVnaXN0ZXJzIFtSRUdJU1RFUl9CWVRFKEZQX1JFR05VTSldLCAoY2hhciAqKSAmc3AsIHNpemVvZiAoaW50KSk7CisKKyAgLyogTm93IHdlIGNhbiByZXN0b3JlIGFsbCByZWdpc3RlcnMuICovCisKKyAgdGFyZ2V0X3N0b3JlX3JlZ2lzdGVycyAoLTEpOworICBwYyA9IHJlYWRfcGMgKCk7CisgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7Cit9CisKKworLyogcG9wIHRoZSBpbm5lcm1vc3QgZnJhbWUsIGdvIGJhY2sgdG8gdGhlIGNhbGxlci4gKi8KKwordm9pZAorcG9wX2ZyYW1lICgpCit7CisgIENPUkVfQUREUiBwYywgbHIsIHNwLCBwcmV2X3NwOwkJLyogJXBjLCAlbHIsICVzcCAqLworICBzdHJ1Y3QgcnM2MDAwX2ZyYW1lZGF0YSBmZGF0YTsKKyAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lID0gZ2V0X2N1cnJlbnRfZnJhbWUgKCk7CisgIGludCBhZGRyLCBpaTsKKworICBwYyA9IHJlYWRfcGMgKCk7CisgIHNwID0gRlJBTUVfRlAgKGZyYW1lKTsKKworICBpZiAoc3RvcF9zdGFja19kdW1teSkKKyAgICB7CisjaWZkZWYgVVNFX0dFTkVSSUNfRFVNTVlfRlJBTUVTCisgICAgICBnZW5lcmljX3BvcF9kdW1teV9mcmFtZSAoKTsKKyAgICAgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7CisgICAgICByZXR1cm47CisjZWxzZQorICAgICAgaWYgKGR1bW15X2ZyYW1lX2NvdW50KSAKKwlwb3BfZHVtbXlfZnJhbWUgKCk7CisgICAgICByZXR1cm47CisjZW5kaWYKKyAgICB9CisKKyAgLyogTWFrZSBzdXJlIHRoYXQgYWxsIHJlZ2lzdGVycyBhcmUgdmFsaWQuICAqLworICByZWFkX3JlZ2lzdGVyX2J5dGVzICgwLCBOVUxMLCBSRUdJU1RFUl9CWVRFUyk7CisKKyAgLyogZmlndXJlIG91dCBwcmV2aW91cyAlcGMgdmFsdWUuIElmIHRoZSBmdW5jdGlvbiBpcyBmcmFtZWxlc3MsIGl0IGlzIAorICAgICBzdGlsbCBpbiB0aGUgbGluayByZWdpc3Rlciwgb3RoZXJ3aXNlIHdhbGsgdGhlIGZyYW1lcyBhbmQgcmV0cmlldmUgdGhlCisgICAgIHNhdmVkICVwYyB2YWx1ZSBpbiB0aGUgcHJldmlvdXMgZnJhbWUuICovCisKKyAgYWRkciA9IGdldF9wY19mdW5jdGlvbl9zdGFydCAoZnJhbWUtPnBjKTsKKyAgKHZvaWQpIHNraXBfcHJvbG9ndWUgKGFkZHIsICZmZGF0YSk7CisKKyAgaWYgKGZkYXRhLmZyYW1lbGVzcykKKyAgICBwcmV2X3NwID0gc3A7CisgIGVsc2UKKyAgICBwcmV2X3NwID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoc3AsIDQpOworICBpZiAoZmRhdGEubHJfb2Zmc2V0ID09IDApCisgICAgbHIgPSByZWFkX3JlZ2lzdGVyIChMUl9SRUdOVU0pOworICBlbHNlCisgICAgbHIgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwcmV2X3NwICsgZmRhdGEubHJfb2Zmc2V0LCA0KTsKKworICAvKiByZXNldCAlcGMgdmFsdWUuICovCisgIHdyaXRlX3JlZ2lzdGVyIChQQ19SRUdOVU0sIGxyKTsKKworICAvKiByZXNldCByZWdpc3RlciB2YWx1ZXMgaWYgYW55IHdhcyBzYXZlZCBlYXJsaWVyLiAqLworCisgIGlmIChmZGF0YS5zYXZlZF9ncHIgIT0gLTEpCisgICAgeworICAgICAgYWRkciA9IHByZXZfc3AgKyBmZGF0YS5ncHJfb2Zmc2V0OworICAgICAgZm9yIChpaSA9IGZkYXRhLnNhdmVkX2dwcjsgaWkgPD0gMzE7ICsraWkpIHsKKwlyZWFkX21lbW9yeSAoYWRkciwgJnJlZ2lzdGVycyBbUkVHSVNURVJfQllURSAoaWkpXSwgNCk7CisJYWRkciArPSA0OworICAgICAgfQorICAgIH0KKworICBpZiAoZmRhdGEuc2F2ZWRfZnByICE9IC0xKQorICAgIHsKKyAgICAgIGFkZHIgPSBwcmV2X3NwICsgZmRhdGEuZnByX29mZnNldDsKKyAgICAgIGZvciAoaWkgPSBmZGF0YS5zYXZlZF9mcHI7IGlpIDw9IDMxOyArK2lpKSB7CisJcmVhZF9tZW1vcnkgKGFkZHIsICZyZWdpc3RlcnMgW1JFR0lTVEVSX0JZVEUgKGlpK0ZQMF9SRUdOVU0pXSwgOCk7CisJYWRkciArPSA4OworICAgICAgfQorICAgIH0KKworICB3cml0ZV9yZWdpc3RlciAoU1BfUkVHTlVNLCBwcmV2X3NwKTsKKyAgdGFyZ2V0X3N0b3JlX3JlZ2lzdGVycyAoLTEpOworICBmbHVzaF9jYWNoZWRfZnJhbWVzICgpOworfQorCisvKiBmaXh1cCB0aGUgY2FsbCBzZXF1ZW5jZSBvZiBhIGR1bW15IGZ1bmN0aW9uLCB3aXRoIHRoZSByZWFsIGZ1bmN0aW9uIGFkZHJlc3MuCisgICBpdHMgYXJndW1ldHMgd2lsbCBiZSBwYXNzZWQgYnkgZ2RiLiAqLworCit2b2lkCityczYwMDBfZml4X2NhbGxfZHVtbXkgKGR1bW15bmFtZSwgcGMsIGZ1biwgbmFyZ3MsIGFyZ3MsIHR5cGUsIGdjY19wKQorICAgICBjaGFyICpkdW1teW5hbWU7CisgICAgIENPUkVfQUREUiBwYzsKKyAgICAgQ09SRV9BRERSIGZ1bjsKKyAgICAgaW50IG5hcmdzOworICAgICB2YWx1ZV9wdHIgKmFyZ3M7CisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBpbnQgZ2NjX3A7Cit7CisjZGVmaW5lCVRPQ19BRERSX09GRlNFVAkJMjAKKyNkZWZpbmUJVEFSR0VUX0FERFJfT0ZGU0VUCTI4CisKKyAgaW50IGlpOworICBDT1JFX0FERFIgdGFyZ2V0X2FkZHI7CisKKyAgaWYgKGZpbmRfdG9jX2FkZHJlc3NfaG9vayAhPSBOVUxMKQorICAgIHsKKyAgICAgIENPUkVfQUREUiB0b2N2YWx1ZTsKKworICAgICAgdG9jdmFsdWUgPSAoKmZpbmRfdG9jX2FkZHJlc3NfaG9vaykgKGZ1bik7CisgICAgICBpaSAgPSAqKGludCopKChjaGFyKilkdW1teW5hbWUgKyBUT0NfQUREUl9PRkZTRVQpOworICAgICAgaWkgPSAoaWkgJiAweGZmZmYwMDAwKSB8ICh0b2N2YWx1ZSA+PiAxNik7CisgICAgICAqKGludCopKChjaGFyKilkdW1teW5hbWUgKyBUT0NfQUREUl9PRkZTRVQpID0gaWk7CisKKyAgICAgIGlpICA9ICooaW50KikoKGNoYXIqKWR1bW15bmFtZSArIFRPQ19BRERSX09GRlNFVCs0KTsKKyAgICAgIGlpID0gKGlpICYgMHhmZmZmMDAwMCkgfCAodG9jdmFsdWUgJiAweDAwMDBmZmZmKTsKKyAgICAgICooaW50KikoKGNoYXIqKWR1bW15bmFtZSArIFRPQ19BRERSX09GRlNFVCs0KSA9IGlpOworICAgIH0KKworICB0YXJnZXRfYWRkciA9IGZ1bjsKKyAgaWkgID0gKihpbnQqKSgoY2hhciopZHVtbXluYW1lICsgVEFSR0VUX0FERFJfT0ZGU0VUKTsKKyAgaWkgPSAoaWkgJiAweGZmZmYwMDAwKSB8ICh0YXJnZXRfYWRkciA+PiAxNik7CisgICooaW50KikoKGNoYXIqKWR1bW15bmFtZSArIFRBUkdFVF9BRERSX09GRlNFVCkgPSBpaTsKKworICBpaSAgPSAqKGludCopKChjaGFyKilkdW1teW5hbWUgKyBUQVJHRVRfQUREUl9PRkZTRVQrNCk7CisgIGlpID0gKGlpICYgMHhmZmZmMDAwMCkgfCAodGFyZ2V0X2FkZHIgJiAweDAwMDBmZmZmKTsKKyAgKihpbnQqKSgoY2hhciopZHVtbXluYW1lICsgVEFSR0VUX0FERFJfT0ZGU0VUKzQpID0gaWk7Cit9CisKKy8qIFBhc3MgdGhlIGFyZ3VtZW50cyBpbiBlaXRoZXIgcmVnaXN0ZXJzLCBvciBpbiB0aGUgc3RhY2suIEluIFJTNjAwMCwKKyAgIHRoZSBmaXJzdCBlaWdodCB3b3JkcyBvZiB0aGUgYXJndW1lbnQgbGlzdCAodGhhdCBtaWdodCBiZSBsZXNzIHRoYW4KKyAgIGVpZ2h0IHBhcmFtZXRlcnMgaWYgc29tZSBwYXJhbWV0ZXJzIG9jY3VweSBtb3JlIHRoYW4gb25lIHdvcmQpIGFyZQorICAgcGFzc2VkIGluIHIzLi5yMTEgcmVnaXN0ZXJzLiAgZmxvYXQgYW5kIGRvdWJsZSBwYXJhbWV0ZXJzIGFyZQorICAgcGFzc2VkIGluIGZwcidzLCBpbiBhZGRpdGlvbiB0byB0aGF0LiBSZXN0IG9mIHRoZSBwYXJhbWV0ZXJzIGlmIGFueQorICAgYXJlIHBhc3NlZCBpbiB1c2VyIHN0YWNrLiBUaGVyZSBtaWdodCBiZSBjYXNlcyBpbiB3aGljaCBoYWxmIG9mIHRoZQorICAgcGFyYW1ldGVyIGlzIGNvcGllZCBpbnRvIHJlZ2lzdGVycywgdGhlIG90aGVyIGhhbGYgaXMgcHVzaGVkIGludG8KKyAgIHN0YWNrLgorCisgICBJZiB0aGUgZnVuY3Rpb24gaXMgcmV0dXJuaW5nIGEgc3RydWN0dXJlLCB0aGVuIHRoZSByZXR1cm4gYWRkcmVzcyBpcyBwYXNzZWQKKyAgIGluIHIzLCB0aGVuIHRoZSBmaXJzdCA3IHdvcmRzIG9mIHRoZSBwYXJhbWV0ZXJzIGNhbiBiZSBwYXNzZWQgaW4gcmVnaXN0ZXJzLAorICAgc3RhcnRpbmcgZnJvbSByNC4gKi8KKworQ09SRV9BRERSCitwdXNoX2FyZ3VtZW50cyAobmFyZ3MsIGFyZ3MsIHNwLCBzdHJ1Y3RfcmV0dXJuLCBzdHJ1Y3RfYWRkcikKKyAgICAgaW50IG5hcmdzOworICAgICB2YWx1ZV9wdHIgKmFyZ3M7CisgICAgIENPUkVfQUREUiBzcDsKKyAgICAgaW50IHN0cnVjdF9yZXR1cm47CisgICAgIENPUkVfQUREUiBzdHJ1Y3RfYWRkcjsKK3sKKyAgaW50IGlpOworICBpbnQgbGVuID0gMDsKKyAgaW50IGFyZ25vOwkJCQkJLyogY3VycmVudCBhcmd1bWVudCBudW1iZXIgKi8KKyAgaW50IGFyZ2J5dGVzOwkJCQkJLyogY3VycmVudCBhcmd1bWVudCBieXRlICovCisgIGNoYXIgdG1wX2J1ZmZlciBbNTBdOworICBpbnQgZl9hcmdubyA9IDA7CQkJCS8qIGN1cnJlbnQgZmxvYXRpbmcgcG9pbnQgYXJnbm8gKi8KKworICB2YWx1ZV9wdHIgYXJnID0gMDsKKyAgc3RydWN0IHR5cGUgKnR5cGU7CisKKyAgQ09SRV9BRERSIHNhdmVkX3NwOworCisjaWZuZGVmIFVTRV9HRU5FUklDX0RVTU1ZX0ZSQU1FUworICBpZiAoIGR1bW15X2ZyYW1lX2NvdW50IDw9IDApCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJGQVRBTCBFUlJPUiAtcHVzaF9hcmd1bWVudHMoKSEgZnJhbWUgbm90IGZvdW5kISFcbiIpOworI2VuZGlmCS8qIEdFTkVSSUNfRFVNTVlfRlJBTUVTICovCisKKyAgLyogVGhlIGZpcnN0IGVpZ2h0IHdvcmRzIG9mIHRoZXIgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gcmVnaXN0ZXJzLiBDb3B5CisgICAgIHRoZW0gYXBwcm9wcmlhdGVseS4KKworICAgICBJZiB0aGUgZnVuY3Rpb24gaXMgcmV0dXJuaW5nIGEgYHN0cnVjdCcsIHRoZW4gdGhlIGZpcnN0IHdvcmQgKHdoaWNoIAorICAgICB3aWxsIGJlIHBhc3NlZCBpbiByMykgaXMgdXNlZCBmb3Igc3RydWN0IHJldHVybiBhZGRyZXNzLiBJbiB0aGF0CisgICAgIGNhc2Ugd2Ugc2hvdWxkIGFkdmFuY2Ugb25lIHdvcmQgYW5kIHN0YXJ0IGZyb20gcjQgcmVnaXN0ZXIgdG8gY29weSAKKyAgICAgcGFyYW1ldGVycy4gKi8KKworICBpaSA9ICBzdHJ1Y3RfcmV0dXJuID8gMSA6IDA7CisKKy8qIAorZWZmZWN0aXZlbHkgaW5kaXJlY3QgY2FsbC4uLiBnY2MgZG9lcy4uLgorCityZXR1cm5fdmFsIGV4YW1wbGUoIGZsb2F0LCBpbnQpOworCitlYWJpOiAKKyAgICBmbG9hdCBpbiBmcDAsIGludCBpbiByMworICAgIG9mZnNldCBvZiBzdGFjayBvbiBvdmVyZmxvdyA4LzE2CisgICAgZm9yIHZhcmFyZ3MsIG11c3QgZ28gYnkgdHlwZS4KK3Bvd2VyIG9wZW46CisgICAgZmxvYXQgaW4gcjMmcjQsIGludCBpbiByNQorICAgIG9mZnNldCBvZiBzdGFjayBvbiBvdmVyZmxvdyBkaWZmZXJlbnQgCitib3RoOiAKKyAgICByZXR1cm4gaW4gcjMgb3IgZjAuICBJZiBubyBmbG9hdCwgbXVzdCBzdHVkeSBob3cgZ2NjIGVtdWxhdGVzIGZsb2F0czsKKyAgICBwYXkgYXR0ZW50aW9uIHRvIGFyZyBwcm9tb3Rpb24uICAKKyAgICBVc2VyIG1heSBoYXZlIHRvIGNhc3RcYXJncyB0byBoYW5kbGUgcHJvbW90aW9uIGNvcnJlY3RseSAKKyAgICBzaW5jZSBnZGIgd29uJ3Qga25vdyBpZiBwcm90b3R5cGUgc3VwcGxpZWQgb3Igbm90LgorKi8KKworICBmb3IgKGFyZ25vPTAsIGFyZ2J5dGVzPTA7IGFyZ25vIDwgbmFyZ3MgJiYgaWk8ODsgKytpaSkgeworCisgICAgYXJnID0gYXJnc1thcmdub107CisgICAgdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZykpOworICAgIGxlbiA9IFRZUEVfTEVOR1RIICh0eXBlKTsKKworICAgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9GTFQpIHsKKworICAgICAgLyogZmxvYXRpbmcgcG9pbnQgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gZnByJ3MsIGFzIHdlbGwgYXMgZ3ByJ3MuCisgICAgICAgICBUaGVyZSBhcmUgMTMgZnByJ3MgcmVzZXJ2ZWQgZm9yIHBhc3NpbmcgcGFyYW1ldGVycy4gQXQgdGhpcyBwb2ludAorICAgICAgICAgdGhlcmUgaXMgbm8gd2F5IHdlIHdvdWxkIHJ1biBvdXQgb2YgdGhlbS4gKi8KKworICAgICAgaWYgKGxlbiA+IDgpCisgICAgICAgIHByaW50Zl91bmZpbHRlcmVkICgKKyJGYXRhbCBFcnJvcjogYSBmbG9hdGluZyBwb2ludCBwYXJhbWV0ZXIgIyVkIHdpdGggYSBzaXplID4gOCBpcyBmb3VuZCFcbiIsIGFyZ25vKTsKKworICAgICAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoRlAwX1JFR05VTSArIDEgKyBmX2FyZ25vKV0sIAorCSAgICAgIFZBTFVFX0NPTlRFTlRTIChhcmcpLCAKKwkgICAgICBsZW4pOworICAgICAgKytmX2FyZ25vOworICAgIH0KKworICAgIGlmIChsZW4gPiA0KSB7CisKKyAgICAgIC8qIEFyZ3VtZW50IHRha2VzIG1vcmUgdGhhbiBvbmUgcmVnaXN0ZXIuICovCisgICAgICB3aGlsZSAoYXJnYnl0ZXMgPCBsZW4pIHsKKwltZW1zZXQgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURShpaSszKV0sIDAsIHNpemVvZihpbnQpKTsKKwltZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURShpaSszKV0sIAorCQkoKGNoYXIqKVZBTFVFX0NPTlRFTlRTIChhcmcpKSthcmdieXRlcywgCisJCShsZW4gLSBhcmdieXRlcykgPiA0ID8gNCA6IGxlbiAtIGFyZ2J5dGVzKTsKKwkrK2lpLCBhcmdieXRlcyArPSA0OworCisJaWYgKGlpID49IDgpCisJICBnb3RvIHJhbl9vdXRfb2ZfcmVnaXN0ZXJzX2Zvcl9hcmd1bWVudHM7CisgICAgICB9CisgICAgICBhcmdieXRlcyA9IDA7CisgICAgICAtLWlpOworICAgIH0KKyAgICBlbHNlIHsgICAgICAgIC8qIEFyZ3VtZW50IGNhbiBmaXQgaW4gb25lIHJlZ2lzdGVyLiBObyBwcm9ibGVtLiAqLworICAgICAgbWVtc2V0ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoaWkrMyldLCAwLCBzaXplb2YoaW50KSk7CisgICAgICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURShpaSszKV0sIFZBTFVFX0NPTlRFTlRTIChhcmcpLCBsZW4pOworICAgIH0KKyAgICArK2FyZ25vOworICB9CisKK3Jhbl9vdXRfb2ZfcmVnaXN0ZXJzX2Zvcl9hcmd1bWVudHM6CisKKyNpZmRlZiBVU0VfR0VORVJJQ19EVU1NWV9GUkFNRVMKKyAgc2F2ZWRfc3AgPSByZWFkX3NwICgpOworI2Vsc2UKKyAgLyogbG9jYXRpb24gZm9yIDggcGFyYW1ldGVycyBhcmUgYWx3YXlzIHJlc2VydmVkLiAqLworICBzcCAtPSA0ICogODsKKworICAvKiBhbm90aGVyIHNpeCB3b3JkcyBmb3IgYmFjayBjaGFpbiwgVE9DIHJlZ2lzdGVyLCBsaW5rIHJlZ2lzdGVyLCBldGMuICovCisgIHNwIC09IDI0OworI2VuZGlmCS8qIEdFTkVSSUNfRFVNTVlfRlJBTUVTICovCisgIC8qIGlmIHRoZXJlIGFyZSBtb3JlIGFyZ3VtZW50cywgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZW0gaW4gCisgICAgIHRoZSBzdGFjaywgdGhlbiBwdXNoIHRoZW0gc3RhcnRpbmcgZnJvbSB0aGUgbmludGggb25lLiAqLworCisgIGlmICgoYXJnbm8gPCBuYXJncykgfHwgYXJnYnl0ZXMpIHsKKyAgICBpbnQgc3BhY2UgPSAwLCBqajsKKworICAgIGlmIChhcmdieXRlcykgeworICAgICAgc3BhY2UgKz0gKChsZW4gLSBhcmdieXRlcyArIDMpICYgLTQpOworICAgICAgamogPSBhcmdubyArIDE7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGpqID0gYXJnbm87CisKKyAgICBmb3IgKDsgamogPCBuYXJnczsgKytqaikgeworICAgICAgdmFsdWVfcHRyIHZhbCA9IGFyZ3NbampdOworICAgICAgc3BhY2UgKz0gKChUWVBFX0xFTkdUSCAoVkFMVUVfVFlQRSAodmFsKSkpICsgMykgJiAtNDsKKyAgICB9CisKKyAgICAvKiBhZGQgbG9jYXRpb24gcmVxdWlyZWQgZm9yIHRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzICovCisgICAgc3BhY2UgPSAoc3BhY2UgKyA3KSAmIC04OworICAgIHNwIC09IHNwYWNlOworCisgICAgLyogVGhpcyBpcyBhbm90aGVyIGluc3RhbmNlIHdlIG5lZWQgdG8gYmUgY29uY2VybmVkIGFib3V0IHNlY3VyaW5nIG91cgorCXN0YWNrIHNwYWNlLiBJZiB3ZSB3cml0ZSBhbnl0aGluZyB1bmRlcm5lYXRoICVzcCAocjEpLCB3ZSBtaWdodCBjb25mbGljdAorCXdpdGggdGhlIGtlcm5lbCB3aG8gdGhpbmtzIGhlIGlzIGZyZWUgdG8gdXNlIHRoaXMgYXJlYS4gU28sIHVwZGF0ZSAlc3AKKwlmaXJzdCBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gKi8KKworICAgIHdyaXRlX3JlZ2lzdGVyIChTUF9SRUdOVU0sIHNwKTsKKworICAgIC8qIGlmIHRoZSBsYXN0IGFyZ3VtZW50IGNvcGllZCBpbnRvIHRoZSByZWdpc3RlcnMgZGlkbid0IGZpdCB0aGVyZSAKKyAgICAgICBjb21wbGV0ZWx5LCBwdXNoIHRoZSByZXN0IG9mIGl0IGludG8gc3RhY2suICovCisKKyAgICBpZiAoYXJnYnl0ZXMpIHsKKyAgICAgIHdyaXRlX21lbW9yeSAoc3ArMjQrKGlpKjQpLCAKKwkJICAgICgoY2hhciopVkFMVUVfQ09OVEVOVFMgKGFyZykpK2FyZ2J5dGVzLCAKKwkJICAgIGxlbiAtIGFyZ2J5dGVzKTsKKyAgICAgICsrYXJnbm87CisgICAgICBpaSArPSAoKGxlbiAtIGFyZ2J5dGVzICsgMykgJiAtNCkgLyA0OworICAgIH0KKworICAgIC8qIHB1c2ggdGhlIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cyBpbnRvIHN0YWNrLiAqLworICAgIGZvciAoOyBhcmdubyA8IG5hcmdzOyArK2FyZ25vKSB7CisKKyAgICAgIGFyZyA9IGFyZ3NbYXJnbm9dOworICAgICAgdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZykpOworICAgICAgbGVuID0gVFlQRV9MRU5HVEggKHR5cGUpOworCisKKyAgICAgIC8qIGZsb2F0IHR5cGVzIHNob3VsZCBiZSBwYXNzZWQgaW4gZnByJ3MsIGFzIHdlbGwgYXMgaW4gdGhlIHN0YWNrLiAqLworICAgICAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX0ZMVCAmJiBmX2FyZ25vIDwgMTMpIHsKKworICAgICAgICBpZiAobGVuID4gOCkKKyAgICAgICAgICBwcmludGZfdW5maWx0ZXJlZCAoCisiRmF0YWwgRXJyb3I6IGEgZmxvYXRpbmcgcG9pbnQgcGFyYW1ldGVyICMlZCB3aXRoIGEgc2l6ZSA+IDggaXMgZm91bmQhXG4iLCBhcmdubyk7CisKKyAgICAgICAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoRlAwX1JFR05VTSArIDEgKyBmX2FyZ25vKV0sIAorCQlWQUxVRV9DT05URU5UUyAoYXJnKSwgCisJCWxlbik7CisgICAgICAgICsrZl9hcmdubzsKKyAgICAgIH0KKworICAgICAgd3JpdGVfbWVtb3J5IChzcCsyNCsoaWkqNCksIChjaGFyICopIFZBTFVFX0NPTlRFTlRTIChhcmcpLCBsZW4pOworICAgICAgaWkgKz0gKChsZW4gKyAzKSAmIC00KSAvIDQ7CisgICAgfQorICB9CisgIGVsc2UKKyAgICAvKiBTZWN1cmUgc3RhY2sgYXJlYXMgZmlyc3QsIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAqLworICAgIHdyaXRlX3JlZ2lzdGVyIChTUF9SRUdOVU0sIHNwKTsKKworI2lmbmRlZiBVU0VfR0VORVJJQ19EVU1NWV9GUkFNRVMKKy8qIHdlIHdhbnQgdG8gY29weSAyNCBieXRlcyBvZiB0YXJnZXQncyBmcmFtZSB0byBkdW1teSdzIGZyYW1lLAorICAgdGhlbiBzZXQgYmFjayBjaGFpbiB0byBwb2ludCB0byBuZXcgZnJhbWUuICovCisKKyAgc2F2ZWRfc3AgPSBkdW1teV9mcmFtZV9hZGRyIFtkdW1teV9mcmFtZV9jb3VudCAtIDFdOworICByZWFkX21lbW9yeSAoc2F2ZWRfc3AsIHRtcF9idWZmZXIsIDI0KTsKKyAgd3JpdGVfbWVtb3J5IChzcCwgdG1wX2J1ZmZlciwgMjQpOworI2VuZGlmCS8qIEdFTkVSSUNfRFVNTVlfRlJBTUVTICovCisKKyAgLyogc2V0IGJhY2sgY2hhaW4gcHJvcGVybHkgKi8KKyAgc3RvcmVfYWRkcmVzcyAodG1wX2J1ZmZlciwgNCwgc2F2ZWRfc3ApOworICB3cml0ZV9tZW1vcnkgKHNwLCB0bXBfYnVmZmVyLCA0KTsKKworICB0YXJnZXRfc3RvcmVfcmVnaXN0ZXJzICgtMSk7CisgIHJldHVybiBzcDsKK30KKyNpZmRlZiBFTEZfT0JKRUNUX0ZPUk1BVAorCisvKiBGdW5jdGlvbjogcHBjX3B1c2hfcmV0dXJuX2FkZHJlc3MgKHBjLCBzcCkKKyAgIFNldCB1cCB0aGUgcmV0dXJuIGFkZHJlc3MgZm9yIHRoZSBpbmZlcmlvciBmdW5jdGlvbiBjYWxsLiAqLworCitDT1JFX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorcHBjX3B1c2hfcmV0dXJuX2FkZHJlc3MgKHBjLCBzcCkKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBDT1JFX0FERFIgc3A7Cit7CisgIHdyaXRlX3JlZ2lzdGVyIChMUl9SRUdOVU0sIENBTExfRFVNTVlfQUREUkVTUyAoKSk7CisgIHJldHVybiBzcDsKK30KKworI2VuZGlmCisKKy8qIGEgZ2l2ZW4gcmV0dXJuIHZhbHVlIGluIGByZWdidWYnIHdpdGggYSB0eXBlIGB2YWx0eXBlJywgZXh0cmFjdCBhbmQgY29weSBpdHMKKyAgIHZhbHVlIGludG8gYHZhbGJ1ZicgKi8KKwordm9pZAorZXh0cmFjdF9yZXR1cm5fdmFsdWUgKHZhbHR5cGUsIHJlZ2J1ZiwgdmFsYnVmKQorICAgICBzdHJ1Y3QgdHlwZSAqdmFsdHlwZTsKKyAgICAgY2hhciByZWdidWZbUkVHSVNURVJfQllURVNdOworICAgICBjaGFyICp2YWxidWY7Cit7CisgIGludCBvZmZzZXQgPSAwOworCisgIGlmIChUWVBFX0NPREUgKHZhbHR5cGUpID09IFRZUEVfQ09ERV9GTFQpIHsKKworICAgIGRvdWJsZSBkZDsgZmxvYXQgZmY7CisgICAgLyogZmxvYXRzIGFuZCBkb3VibGVzIGFyZSByZXR1cm5lZCBpbiBmcHIxLiBmcHIncyBoYXZlIGEgc2l6ZSBvZiA4IGJ5dGVzLgorICAgICAgIFdlIG5lZWQgdG8gdHJ1bmNhdGUgdGhlIHJldHVybiB2YWx1ZSBpbnRvIGZsb2F0IHNpemUgKDQgYnl0ZSkgaWYKKyAgICAgICBuZWNlc3NhcnkuICovCisKKyAgICBpZiAoVFlQRV9MRU5HVEggKHZhbHR5cGUpID4gNCkgCQkvKiB0aGlzIGlzIGEgZG91YmxlICovCisgICAgICBtZW1jcHkgKHZhbGJ1ZiwgCisJICAgICAgJnJlZ2J1ZltSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNICsgMSldLAorCSAgICAgIFRZUEVfTEVOR1RIICh2YWx0eXBlKSk7CisgICAgZWxzZSB7CQkvKiBmbG9hdCAqLworICAgICAgbWVtY3B5ICgmZGQsICZyZWdidWZbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSArIDEpXSwgOCk7CisgICAgICBmZiA9IChmbG9hdClkZDsKKyAgICAgIG1lbWNweSAodmFsYnVmLCAmZmYsIHNpemVvZihmbG9hdCkpOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICAvKiByZXR1cm4gdmFsdWUgaXMgY29waWVkIHN0YXJ0aW5nIGZyb20gcjMuICovCisgICAgaWYgKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4KKwkmJiBUWVBFX0xFTkdUSCAodmFsdHlwZSkgPCBSRUdJU1RFUl9SQVdfU0laRSAoMykpCisgICAgICBvZmZzZXQgPSBSRUdJU1RFUl9SQVdfU0laRSAoMykgLSBUWVBFX0xFTkdUSCAodmFsdHlwZSk7CisKKyAgICBtZW1jcHkgKHZhbGJ1ZiwgCisJICAgIHJlZ2J1ZiArIFJFR0lTVEVSX0JZVEUgKDMpICsgb2Zmc2V0LAorCSAgICBUWVBFX0xFTkdUSCAodmFsdHlwZSkpOworICB9Cit9CisKKworLyoga2VlcCBzdHJ1Y3R1cmUgcmV0dXJuIGFkZHJlc3MgaW4gdGhpcyB2YXJpYWJsZS4KKyAgIEZJWE1FOiAgVGhpcyBpcyBhIGhvcnJpZCBrbHVkZ2Ugd2hpY2ggc2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIGNvbnRpbnVlCisgICBsaXZpbmcuICBUaGlzIG9ubHkgYWxsb3dzIGEgc2luZ2xlIG5lc3RlZCBjYWxsIHRvIGEgc3RydWN0dXJlLXJldHVybmluZworICAgZnVuY3Rpb24uICBDb21lIG9uLCBndXlzISAgLS0gZ251QGN5Z251cy5jb20sIEF1ZyA5MiAgKi8KKworQ09SRV9BRERSIHJzNjAwMF9zdHJ1Y3RfcmV0dXJuX2FkZHJlc3M7CisKKworLyogSW5kaXJlY3QgZnVuY3Rpb24gY2FsbHMgdXNlIGEgcGllY2Ugb2YgdHJhbXBvbGluZSBjb2RlIHRvIGRvIGNvbnRleHQKKyAgIHN3aXRjaGluZywgaS5lLiB0byBzZXQgdGhlIG5ldyBUT0MgdGFibGUuIFNraXAgc3VjaCBjb2RlIGlmIHdlIGFyZSBvbgorICAgaXRzIGZpcnN0IGluc3RydWN0aW9uIChhcyB3aGVuIHdlIGhhdmUgc2luZ2xlLXN0ZXBwZWQgdG8gaGVyZSkuIAorICAgQWxzbyBza2lwIHNoYXJlZCBsaWJyYXJ5IHRyYW1wb2xpbmUgY29kZSAod2hpY2ggaXMgZGlmZmVyZW50IGZyb20KKyAgIGluZGlyZWN0IGZ1bmN0aW9uIGNhbGwgdHJhbXBvbGluZXMpLgorICAgUmVzdWx0IGlzIGRlc2lyZWQgUEMgdG8gc3RlcCB1bnRpbCwgb3IgTlVMTCBpZiB3ZSBhcmUgbm90IGluCisgICB0cmFtcG9saW5lIGNvZGUuICAqLworCitDT1JFX0FERFIKK3NraXBfdHJhbXBvbGluZV9jb2RlIChwYykKKyAgICAgQ09SRV9BRERSIHBjOworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaWksIG9wOworICBDT1JFX0FERFIgc29saWJfdGFyZ2V0X3BjOworCisgIHN0YXRpYyB1bnNpZ25lZCB0cmFtcG9saW5lX2NvZGVbXSA9IHsKKwkweDgwMGIwMDAwLAkJCS8qICAgICBsICAgcjAsMHgwKHIxMSkJKi8KKwkweDkwNDEwMDE0LAkJCS8qICAgIHN0ICAgcjIsMHgxNChyMSkJKi8KKwkweDdjMDkwM2E2LAkJCS8qIG10Y3RyICAgcjAJCSovCisJMHg4MDRiMDAwNCwJCQkvKiAgICAgbCAgIHIyLDB4NChyMTEpCSovCisJMHg4MTZiMDAwOCwJCQkvKiAgICAgbCAgcjExLDB4OChyMTEpCSovCisJMHg0ZTgwMDQyMCwJCQkvKiAgYmN0cgkJKi8KKwkweDRlODAwMDIwLAkJCS8qICAgIGJyCQkqLworCTAKKyAgfTsKKworICAvKiBJZiBwYyBpcyBpbiBhIHNoYXJlZCBsaWJyYXJ5IHRyYW1wb2xpbmUsIHJldHVybiBpdHMgdGFyZ2V0LiAgKi8KKyAgc29saWJfdGFyZ2V0X3BjID0gZmluZF9zb2xpYl90cmFtcG9saW5lX3RhcmdldCAocGMpOworICBpZiAoc29saWJfdGFyZ2V0X3BjKQorICAgIHJldHVybiBzb2xpYl90YXJnZXRfcGM7CisKKyAgZm9yIChpaT0wOyB0cmFtcG9saW5lX2NvZGVbaWldOyArK2lpKSB7CisgICAgb3AgID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMgKyAoaWkqNCksIDQpOworICAgIGlmIChvcCAhPSB0cmFtcG9saW5lX2NvZGUgW2lpXSkKKyAgICAgIHJldHVybiAwOworICB9CisgIGlpID0gcmVhZF9yZWdpc3RlciAoMTEpOwkJLyogcjExIGhvbGRzIGRlc3RpbmF0aW9uIGFkZHIJKi8KKyAgcGMgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChpaSwgNCk7CS8qIChyMTEpIHZhbHVlCQkJKi8KKyAgcmV0dXJuIHBjOworfQorCisvKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIEZJIGhhcyBhIGZyYW1lIG9uIHRoZSBzdGFjayBvciBub3QuICAqLworCitpbnQKK2ZyYW1lbGVzc19mdW5jdGlvbl9pbnZvY2F0aW9uIChmaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworeworICBDT1JFX0FERFIgZnVuY19zdGFydDsKKyAgc3RydWN0IHJzNjAwMF9mcmFtZWRhdGEgZmRhdGE7CisKKyAgLyogRG9uJ3QgZXZlbiB0aGluayBhYm91dCBmcmFtZWxlc3NuZXNzIGV4Y2VwdCBvbiB0aGUgaW5uZXJtb3N0IGZyYW1lCisgICAgIG9yIGlmIHRoZSBmdW5jdGlvbiB3YXMgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuICAqLworICBpZiAoZmktPm5leHQgIT0gTlVMTCAmJiAhZmktPm5leHQtPnNpZ25hbF9oYW5kbGVyX2NhbGxlcikKKyAgICByZXR1cm4gMDsKKyAgCisgIGZ1bmNfc3RhcnQgPSBnZXRfcGNfZnVuY3Rpb25fc3RhcnQgKGZpLT5wYyk7CisKKyAgLyogSWYgd2UgZmFpbGVkIHRvIGZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiwgaXQgaXMgYSBtaXN0YWtlCisgICAgIHRvIGluc3BlY3QgdGhlIGluc3RydWN0aW9ucy4gKi8KKworICBpZiAoIWZ1bmNfc3RhcnQpCisgICAgeworICAgICAgLyogQSBmcmFtZSB3aXRoIGEgemVybyBQQyBpcyB1c3VhbGx5IGNyZWF0ZWQgYnkgZGVyZWZlcmVuY2luZyBhIE5VTEwKKwkgZnVuY3Rpb24gcG9pbnRlciwgbm9ybWFsbHkgY2F1c2luZyBhbiBpbW1lZGlhdGUgY29yZSBkdW1wIG9mIHRoZQorCSBpbmZlcmlvci4gTWFyayBmdW5jdGlvbiBhcyBmcmFtZWxlc3MsIGFzIHRoZSBpbmZlcmlvciBoYXMgbm8gY2hhbmNlCisJIG9mIHNldHRpbmcgdXAgYSBzdGFjayBmcmFtZS4gICovCisgICAgICBpZiAoZmktPnBjID09IDApCisJcmV0dXJuIDE7CisgICAgICBlbHNlCisJcmV0dXJuIDA7CisgICAgfQorCisgICh2b2lkKSBza2lwX3Byb2xvZ3VlIChmdW5jX3N0YXJ0LCAmZmRhdGEpOworICByZXR1cm4gZmRhdGEuZnJhbWVsZXNzOworfQorCisvKiBSZXR1cm4gdGhlIFBDIHNhdmVkIGluIGEgZnJhbWUgKi8KKwordW5zaWduZWQgbG9uZworZnJhbWVfc2F2ZWRfcGMgKGZpKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7Cit7CisgIENPUkVfQUREUiBmdW5jX3N0YXJ0OworICBzdHJ1Y3QgcnM2MDAwX2ZyYW1lZGF0YSBmZGF0YTsKKworICBpZiAoZmktPnNpZ25hbF9oYW5kbGVyX2NhbGxlcikKKyAgICByZXR1cm4gcmVhZF9tZW1vcnlfaW50ZWdlciAoZmktPmZyYW1lICsgU0lHX0ZSQU1FX1BDX09GRlNFVCwgNCk7CisKKyNpZmRlZiBVU0VfR0VORVJJQ19EVU1NWV9GUkFNRVMKKyAgaWYgKFBDX0lOX0NBTExfRFVNTVkgKGZpLT5wYywgZmktPmZyYW1lLCBmaS0+ZnJhbWUpKQorICAgIHJldHVybiBnZW5lcmljX3JlYWRfcmVnaXN0ZXJfZHVtbXkoZmktPnBjLCBmaS0+ZnJhbWUsIFBDX1JFR05VTSk7CisjZW5kaWYJLyogR0VORVJJQ19EVU1NWV9GUkFNRVMgKi8KKworICBmdW5jX3N0YXJ0ID0gZ2V0X3BjX2Z1bmN0aW9uX3N0YXJ0IChmaS0+cGMpOworCisgIC8qIElmIHdlIGZhaWxlZCB0byBmaW5kIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24sIGl0IGlzIGEgbWlzdGFrZQorICAgICB0byBpbnNwZWN0IHRoZSBpbnN0cnVjdGlvbnMuICovCisgIGlmICghZnVuY19zdGFydCkKKyAgICByZXR1cm4gMDsKKworICAodm9pZCkgc2tpcF9wcm9sb2d1ZSAoZnVuY19zdGFydCwgJmZkYXRhKTsKKworICBpZiAoZmRhdGEubHJfb2Zmc2V0ID09IDAgJiYgZmktPm5leHQgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZmktPm5leHQtPnNpZ25hbF9oYW5kbGVyX2NhbGxlcikKKwlyZXR1cm4gcmVhZF9tZW1vcnlfaW50ZWdlciAoZmktPm5leHQtPmZyYW1lICsgU0lHX0ZSQU1FX0xSX09GRlNFVCwgNCk7CisgICAgICBlbHNlCisJcmV0dXJuIHJlYWRfbWVtb3J5X2ludGVnZXIgKHJzNjAwMF9mcmFtZV9jaGFpbiAoZmkpICsgREVGQVVMVF9MUl9TQVZFLAorCQkJCSAgICA0KTsKKyAgICB9CisKKyAgaWYgKGZkYXRhLmxyX29mZnNldCA9PSAwKQorICAgIHJldHVybiByZWFkX3JlZ2lzdGVyIChMUl9SRUdOVU0pOworCisgIHJldHVybiByZWFkX21lbW9yeV9pbnRlZ2VyIChyczYwMDBfZnJhbWVfY2hhaW4gKGZpKSArIGZkYXRhLmxyX29mZnNldCwgNCk7Cit9CisKKy8qIElmIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBGSSBhcmUgbm90IGtub3duIHlldCwgcmVhZCBhbmQgY2FjaGUgdGhlbS4KKyAgICZGREFUQVAgY29udGFpbnMgcnM2MDAwX2ZyYW1lZGF0YTsgVERBVEFQIGNhbiBiZSBOVUxMLAorICAgaW4gd2hpY2ggY2FzZSB0aGUgZnJhbWVkYXRhIGFyZSByZWFkLiAgKi8KKworc3RhdGljIHZvaWQKK2ZyYW1lX2dldF9zYXZlZF9yZWdzIChmaSwgZmRhdGFwKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7CisgICAgIHN0cnVjdCByczYwMDBfZnJhbWVkYXRhICpmZGF0YXA7Cit7CisgIGludCBpaTsKKyAgQ09SRV9BRERSIGZyYW1lX2FkZHI7IAorICBzdHJ1Y3QgcnM2MDAwX2ZyYW1lZGF0YSB3b3JrX2ZkYXRhOworCisgIGlmIChmaS0+c2F2ZWRfcmVncykKKyAgICByZXR1cm47CisgIAorICBpZiAoZmRhdGFwID09IE5VTEwpCisgICAgeworICAgICAgZmRhdGFwID0gJndvcmtfZmRhdGE7CisgICAgICAodm9pZCkgc2tpcF9wcm9sb2d1ZSAoZ2V0X3BjX2Z1bmN0aW9uX3N0YXJ0IChmaS0+cGMpLCBmZGF0YXApOworICAgIH0KKworICBmcmFtZV9zYXZlZF9yZWdzX3phbGxvYyAoZmkpOworCisgIC8qIElmIHRoZXJlIHdlcmUgYW55IHNhdmVkIHJlZ2lzdGVycywgZmlndXJlIG91dCBwYXJlbnQncyBzdGFjaworICAgICBwb2ludGVyLiAqLworICAvKiBUaGUgZm9sbG93aW5nIGlzIHRydWUgb25seSBpZiB0aGUgZnJhbWUgZG9lc24ndCBoYXZlIGEgY2FsbCB0bworICAgICBhbGxvY2EoKSwgRklYTUUuICovCisKKyAgaWYgKGZkYXRhcC0+c2F2ZWRfZnByID09IDAgJiYgZmRhdGFwLT5zYXZlZF9ncHIgPT0gMAorICAgICAgJiYgZmRhdGFwLT5scl9vZmZzZXQgPT0gMCAmJiBmZGF0YXAtPmNyX29mZnNldCA9PSAwKQorICAgIGZyYW1lX2FkZHIgPSAwOworICBlbHNlIGlmIChmaS0+cHJldiAmJiBmaS0+cHJldi0+ZnJhbWUpCisgICAgZnJhbWVfYWRkciA9IGZpLT5wcmV2LT5mcmFtZTsKKyAgZWxzZQorICAgIGZyYW1lX2FkZHIgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChmaS0+ZnJhbWUsIDQpOworICAKKyAgLyogaWYgIT0gLTEsIGZkYXRhcC0+c2F2ZWRfZnByIGlzIHRoZSBzbWFsbGVzdCBudW1iZXIgb2Ygc2F2ZWRfZnByLgorICAgICBBbGwgZnByJ3MgZnJvbSBzYXZlZF9mcHIgdG8gZnAzMSBhcmUgc2F2ZWQuICAqLworCisgIGlmIChmZGF0YXAtPnNhdmVkX2ZwciA+PSAwKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgaW50IGZwcl9vZmZzZXQgPSBmcmFtZV9hZGRyICsgZmRhdGFwLT5mcHJfb2Zmc2V0OworICAgICAgZm9yIChpID0gZmRhdGFwLT5zYXZlZF9mcHI7IGkgPCAzMjsgaSsrKQorCXsKKwkgIGZpLT5zYXZlZF9yZWdzIFtGUDBfUkVHTlVNICsgaV0gPSBmcHJfb2Zmc2V0OworCSAgZnByX29mZnNldCArPSA4OworCX0KKyAgICB9CisKKyAgLyogaWYgIT0gLTEsIGZkYXRhcC0+c2F2ZWRfZ3ByIGlzIHRoZSBzbWFsbGVzdCBudW1iZXIgb2Ygc2F2ZWRfZ3ByLgorICAgICBBbGwgZ3ByJ3MgZnJvbSBzYXZlZF9ncHIgdG8gZ3ByMzEgYXJlIHNhdmVkLiAgKi8KKworICBpZiAoZmRhdGFwLT5zYXZlZF9ncHIgPj0gMCkKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIGludCBncHJfb2Zmc2V0ID0gZnJhbWVfYWRkciArIGZkYXRhcC0+Z3ByX29mZnNldDsKKyAgICAgIGZvciAoaSA9IGZkYXRhcC0+c2F2ZWRfZ3ByOyBpIDwgMzI7IGkrKykKKwl7CisJICBmaS0+c2F2ZWRfcmVncyBbaV0gPSBncHJfb2Zmc2V0OworCSAgZ3ByX29mZnNldCArPSA0OworCX0KKyAgICB9CisKKyAgLyogSWYgIT0gMCwgZmRhdGFwLT5jcl9vZmZzZXQgaXMgdGhlIG9mZnNldCBmcm9tIHRoZSBmcmFtZSB0aGF0IGhvbGRzCisgICAgIHRoZSBDUi4gICovCisgIGlmIChmZGF0YXAtPmNyX29mZnNldCAhPSAwKQorICAgIGZpLT5zYXZlZF9yZWdzIFtDUl9SRUdOVU1dID0gZnJhbWVfYWRkciArIGZkYXRhcC0+Y3Jfb2Zmc2V0OworCisgIC8qIElmICE9IDAsIGZkYXRhcC0+bHJfb2Zmc2V0IGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUgZnJhbWUgdGhhdCBob2xkcworICAgICB0aGUgTFIuICAqLworICBpZiAoZmRhdGFwLT5scl9vZmZzZXQgIT0gMCkKKyAgICBmaS0+c2F2ZWRfcmVncyBbTFJfUkVHTlVNXSA9IGZyYW1lX2FkZHIgKyBmZGF0YXAtPmxyX29mZnNldDsKK30KKworLyogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIGEgZnJhbWUuIFRoaXMgaXMgdGhlIGluaXRhbCAlc3AgdmFsdWUgd2hlbiB0aGUgZnJhbWUKKyAgIHdhcyBmaXJzdCBhbGxvY2F0ZWQuIEZvciBmdW5jdGlvbnMgY2FsbGluZyBhbGxvY2EoKSwgaXQgbWlnaHQgYmUgc2F2ZWQgaW4KKyAgIGFuIGFsbG9jYSByZWdpc3Rlci4gKi8KKworc3RhdGljIENPUkVfQUREUgorZnJhbWVfaW5pdGlhbF9zdGFja19hZGRyZXNzIChmaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworeworICBDT1JFX0FERFIgdG1wYWRkcjsKKyAgc3RydWN0IHJzNjAwMF9mcmFtZWRhdGEgZmRhdGE7CisgIHN0cnVjdCBmcmFtZV9pbmZvICpjYWxsZWVfZmk7CisKKyAgLyogaWYgdGhlIGluaXRpYWwgc3RhY2sgcG9pbnRlciAoZnJhbWUgYWRkcmVzcykgb2YgdGhpcyBmcmFtZSBpcyBrbm93biwKKyAgICAganVzdCByZXR1cm4gaXQuICovCisKKyAgaWYgKGZpLT5leHRyYV9pbmZvLT5pbml0aWFsX3NwKQorICAgIHJldHVybiBmaS0+ZXh0cmFfaW5mby0+aW5pdGlhbF9zcDsKKworICAvKiBmaW5kIG91dCBpZiB0aGlzIGZ1bmN0aW9uIGlzIHVzaW5nIGFuIGFsbG9jYSByZWdpc3Rlci4uICovCisKKyAgKHZvaWQpIHNraXBfcHJvbG9ndWUgKGdldF9wY19mdW5jdGlvbl9zdGFydCAoZmktPnBjKSwgJmZkYXRhKTsKKworICAvKiBpZiBzYXZlZCByZWdpc3RlcnMgb2YgdGhpcyBmcmFtZSBhcmUgbm90IGtub3duIHlldCwgcmVhZCBhbmQgY2FjaGUgdGhlbS4gKi8KKworICBpZiAoIWZpLT5zYXZlZF9yZWdzKQorICAgIGZyYW1lX2dldF9zYXZlZF9yZWdzIChmaSwgJmZkYXRhKTsKKworICAvKiBJZiBubyBhbGxvY2EgcmVnaXN0ZXIgdXNlZCwgdGhlbiBmaS0+ZnJhbWUgaXMgdGhlIHZhbHVlIG9mIHRoZSAlc3AgZm9yCisgICAgIHRoaXMgZnJhbWUsIGFuZCBpdCBpcyBnb29kIGVub3VnaC4gKi8KKworICBpZiAoZmRhdGEuYWxsb2NhX3JlZyA8IDApCisgICAgeworICAgICAgZmktPmV4dHJhX2luZm8tPmluaXRpYWxfc3AgPSBmaS0+ZnJhbWU7CisgICAgICByZXR1cm4gZmktPmV4dHJhX2luZm8tPmluaXRpYWxfc3A7CisgICAgfQorCisgIC8qIFRoaXMgZnVuY3Rpb24gaGFzIGFuIGFsbG9jYSByZWdpc3Rlci4gSWYgdGhpcyBpcyB0aGUgdG9wLW1vc3QgZnJhbWUKKyAgICAgKHdpdGggdGhlIGxvd2VzdCBhZGRyZXNzKSwgdGhlIHZhbHVlIGluIGFsbG9jYSByZWdpc3RlciBpcyBnb29kLiAqLworCisgIGlmICghZmktPm5leHQpCisgICAgcmV0dXJuIGZpLT5leHRyYV9pbmZvLT5pbml0aWFsX3NwID0gcmVhZF9yZWdpc3RlciAoZmRhdGEuYWxsb2NhX3JlZyk7ICAgICAKKworICAvKiBPdGhlcndpc2UsIHRoaXMgaXMgYSBjYWxsZXIgZnJhbWUuIENhbGxlZSBoYXMgdXN1YWxseSBhbHJlYWR5IHNhdmVkCisgICAgIHJlZ2lzdGVycywgYnV0IHRoZXJlIGFyZSBleGNlcHRpb25zIChzdWNoIGFzIHdoZW4gdGhlIGNhbGxlZQorICAgICBoYXMgbm8gcGFyYW1ldGVycykuIEZpbmQgdGhlIGFkZHJlc3MgaW4gd2hpY2ggY2FsbGVyJ3MgYWxsb2NhCisgICAgIHJlZ2lzdGVyIGlzIHNhdmVkLiAqLworCisgIGZvciAoY2FsbGVlX2ZpID0gZmktPm5leHQ7IGNhbGxlZV9maTsgY2FsbGVlX2ZpID0gY2FsbGVlX2ZpLT5uZXh0KSB7CisKKyAgICBpZiAoIWNhbGxlZV9maS0+c2F2ZWRfcmVncykKKyAgICAgIGZyYW1lX2dldF9zYXZlZF9yZWdzIChjYWxsZWVfZmksIE5VTEwpOworCisgICAgLyogdGhpcyBpcyB0aGUgYWRkcmVzcyBpbiB3aGljaCBhbGxvY2EgcmVnaXN0ZXIgaXMgc2F2ZWQuICovCisKKyAgICB0bXBhZGRyID0gY2FsbGVlX2ZpLT5zYXZlZF9yZWdzIFtmZGF0YS5hbGxvY2FfcmVnXTsKKyAgICBpZiAodG1wYWRkcikgeworICAgICAgZmktPmV4dHJhX2luZm8tPmluaXRpYWxfc3AgPSByZWFkX21lbW9yeV9pbnRlZ2VyICh0bXBhZGRyLCA0KTsgCisgICAgICByZXR1cm4gZmktPmV4dHJhX2luZm8tPmluaXRpYWxfc3A7CisgICAgfQorCisgICAgLyogR28gbG9vayBpbnRvIGRlZXBlciBsZXZlbHMgb2YgdGhlIGZyYW1lIGNoYWluIHRvIHNlZSBpZiBhbnkgb25lIG9mCisgICAgICAgdGhlIGNhbGxlZXMgaGFzIHNhdmVkIGFsbG9jYSByZWdpc3Rlci4gKi8KKyAgfQorCisgIC8qIElmIGFsbG9jYSByZWdpc3RlciB3YXMgbm90IHNhdmVkLCBieSB0aGUgY2FsbGVlIChvciBhbnkgb2YgaXRzIGNhbGxlZXMpCisgICAgIHRoZW4gdGhlIHZhbHVlIGluIHRoZSByZWdpc3RlciBpcyBzdGlsbCBnb29kLiAqLworCisgIGZpLT5leHRyYV9pbmZvLT5pbml0aWFsX3NwID0gcmVhZF9yZWdpc3RlciAoZmRhdGEuYWxsb2NhX3JlZyk7CisgIHJldHVybiBmaS0+ZXh0cmFfaW5mby0+aW5pdGlhbF9zcDsKK30KKworQ09SRV9BRERSCityczYwMDBfZnJhbWVfY2hhaW4gKHRoaXNmcmFtZSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKnRoaXNmcmFtZTsKK3sKKyAgQ09SRV9BRERSIGZwOworCisjaWZkZWYgVVNFX0dFTkVSSUNfRFVNTVlfRlJBTUVTCisgIGlmIChQQ19JTl9DQUxMX0RVTU1ZICh0aGlzZnJhbWUtPnBjLCB0aGlzZnJhbWUtPmZyYW1lLCB0aGlzZnJhbWUtPmZyYW1lKSkKKyAgICByZXR1cm4gdGhpc2ZyYW1lLT5mcmFtZTsJLyogZHVtbXkgZnJhbWUgc2FtZSBhcyBjYWxsZXIncyBmcmFtZSAqLworI2VuZGlmCS8qIEdFTkVSSUNfRFVNTVlfRlJBTUVTICovCisKKyAgaWYgKGluc2lkZV9lbnRyeV9maWxlICh0aGlzZnJhbWUtPnBjKSB8fCAKKyAgICAgIHRoaXNmcmFtZS0+cGMgPT0gZW50cnlfcG9pbnRfYWRkcmVzcyAoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAodGhpc2ZyYW1lLT5zaWduYWxfaGFuZGxlcl9jYWxsZXIpCisgICAgZnAgPSByZWFkX21lbW9yeV9pbnRlZ2VyICh0aGlzZnJhbWUtPmZyYW1lICsgU0lHX0ZSQU1FX0ZQX09GRlNFVCwgNCk7CisgIGVsc2UgaWYgKHRoaXNmcmFtZS0+bmV4dCAhPSBOVUxMCisJICAgJiYgdGhpc2ZyYW1lLT5uZXh0LT5zaWduYWxfaGFuZGxlcl9jYWxsZXIKKwkgICAmJiBmcmFtZWxlc3NfZnVuY3Rpb25faW52b2NhdGlvbiAodGhpc2ZyYW1lKSkKKyAgICAvKiBBIGZyYW1lbGVzcyBmdW5jdGlvbiBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCBkaWQgbm90IGNoYW5nZSB0aGUKKyAgICAgICBmcmFtZSBwb2ludGVyLiAgKi8KKyAgICBmcCA9IEZSQU1FX0ZQICh0aGlzZnJhbWUpOworICBlbHNlCisgICAgZnAgPSByZWFkX21lbW9yeV9pbnRlZ2VyICgodGhpc2ZyYW1lKS0+ZnJhbWUsIDQpOworCisjaWZkZWYgVVNFX0dFTkVSSUNfRFVNTVlfRlJBTUVTCisgIHsKKyAgICBDT1JFX0FERFIgZnBwLCBscjsKKworICAgIGxyID0gcmVhZF9yZWdpc3RlciAoTFJfUkVHTlVNKTsKKyAgICBpZiAobHIgPT0gZW50cnlfcG9pbnRfYWRkcmVzcyAoKSkKKyAgICAgIGlmIChmcCAhPSAwICYmIChmcHAgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChmcCwgNCkpICE9IDApCisJaWYgKFBDX0lOX0NBTExfRFVNTVkgKGxyLCBmcHAsIGZwcCkpCisJICByZXR1cm4gZnBwOworICB9CisjZW5kaWYJLyogR0VORVJJQ19EVU1NWV9GUkFNRVMgKi8KKyAgcmV0dXJuIGZwOworfQorDAorLyogUmV0dXJuIG5vbnplcm8gaWYgQUREUiAoYSBmdW5jdGlvbiBwb2ludGVyKSBpcyBpbiB0aGUgZGF0YSBzcGFjZSBhbmQKKyAgIGlzIHRoZXJlZm9yZSBhIHNwZWNpYWwgZnVuY3Rpb24gcG9pbnRlci4gICovCisKK2ludAoraXNfbWFnaWNfZnVuY3Rpb25fcG9pbnRlciAoYWRkcikKKyAgICAgQ09SRV9BRERSIGFkZHI7Cit7CisgIHN0cnVjdCBvYmpfc2VjdGlvbiAqczsKKworICBzID0gZmluZF9wY19zZWN0aW9uIChhZGRyKTsKKyAgaWYgKHMgJiYgcy0+dGhlX2JmZF9zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBHREJfVEFSR0VUX1BPV0VSUEMKK2ludAorZ2RiX3ByaW50X2luc25fcG93ZXJwYyAobWVtYWRkciwgaW5mbykKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICBpZiAoVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKKyAgICByZXR1cm4gcHJpbnRfaW5zbl9iaWdfcG93ZXJwYyAobWVtYWRkciwgaW5mbyk7CisgIGVsc2UKKyAgICByZXR1cm4gcHJpbnRfaW5zbl9saXR0bGVfcG93ZXJwYyAobWVtYWRkciwgaW5mbyk7Cit9CisjZW5kaWYKKworLyogRnVuY3Rpb246IGdldF9zYXZlZF9yZWdpc3RlcgorICAgSnVzdCBjYWxsIHRoZSBnZW5lcmljX2dldF9zYXZlZF9yZWdpc3RlciBmdW5jdGlvbi4gICovCisKKyNpZmRlZiBVU0VfR0VORVJJQ19EVU1NWV9GUkFNRVMKK3ZvaWQKK2dldF9zYXZlZF9yZWdpc3RlciAocmF3X2J1ZmZlciwgb3B0aW1pemVkLCBhZGRycCwgZnJhbWUsIHJlZ251bSwgbHZhbCkKKyAgICAgY2hhciAqcmF3X2J1ZmZlcjsKKyAgICAgaW50ICpvcHRpbWl6ZWQ7CisgICAgIENPUkVfQUREUiAqYWRkcnA7CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKKyAgICAgaW50IHJlZ251bTsKKyAgICAgZW51bSBsdmFsX3R5cGUgKmx2YWw7Cit7CisgIGdlbmVyaWNfZ2V0X3NhdmVkX3JlZ2lzdGVyIChyYXdfYnVmZmVyLCBvcHRpbWl6ZWQsIGFkZHJwLCAKKwkJCSAgICAgIGZyYW1lLCByZWdudW0sIGx2YWwpOworfQorI2VuZGlmCisKKworDAorLyogSGFuZGxpbmcgdGhlIHZhcmlvdXMgUG93ZXJQQy9SUzYwMDAgdmFyaWFudHMuICAqLworCisKKy8qIFRoZSBhcnJheXMgaGVyZSBjYWxsZWQgcmVnaXN0ZXJfbmFtZXNfTVVNQkxFIGhvbGQgbmFtZXMgdGhhdCAKKyAgIHRoZSByczYwMDBfcmVnaXN0ZXJfbmFtZSBmdW5jdGlvbiByZXR1cm5zLgorCisgICBGb3IgZWFjaCBmYW1pbHkgb2YgUFBDIHZhcmlhbnRzLCBJJ3ZlIHRyaWVkIHRvIGlzb2xhdGUgb3V0IHRoZQorICAgY29tbW9uIHJlZ2lzdGVycyBhbmQgcHV0IHRoZW0gdXAgZnJvbnQsIHNvIHRoYXQgYXMgbG9uZyBhcyB5b3UgZ2V0CisgICB0aGUgZ2VuZXJhbCBmYW1pbHkgcmlnaHQsIEdEQiB3aWxsIGNvcnJlY3RseSBpZGVudGlmeSB0aGUgcmVnaXN0ZXJzCisgICBjb21tb24gdG8gdGhhdCBmYW1pbHkuICBUaGUgY29tbW9uIHJlZ2lzdGVyIHNldHMgYXJlOgorCisgICBGb3IgdGhlIDYweCBmYW1pbHk6IGhpZDAgaGlkMSBpYWJyIGRhYnIgcGlyCisKKyAgIEZvciB0aGUgNTA1IGFuZCA4NjAgZmFtaWx5OiBlaWUgZWlkIG5yaQorCisgICBGb3IgdGhlIDQwMyBhbmQgNDAzR0M6IGljZGJkciBlc3IgZGVhciBldnByIGNkYmNyIHRzciB0Y3IgcGl0IHRiaGkKKwl0YmxvIHNycjIgc3JyMyBkYnNyIGRiY3IgaWFjMSBpYWMyIGRhYzEgZGFjMiBkY2NyIGljY3IgcGJsMQorCXBidTEgcGJsMiBwYnUyCisKKyAgIE1vc3Qgb2YgdGhlc2UgcmVnaXN0ZXIgZ3JvdXBzIGFyZW4ndCBhbnl0aGluZyBmb3JtYWwuICBJIGFycml2ZWQgYXQKKyAgIHRoZW0gYnkgbG9va2luZyBhdCB0aGUgcmVnaXN0ZXJzIHRoYXQgb2NjdXJyZWQgaW4gbW9yZSB0aGFuIG9uZQorICAgcHJvY2Vzc29yLiAgKi8KKworLyogVUlTQSByZWdpc3RlciBuYW1lcyBjb21tb24gYWNyb3NzIGFsbCBhcmNoaXRlY3R1cmVzLCBpbmNsdWRpbmcgUE9XRVIuICAqLworCisjZGVmaW5lIENPTU1PTl9VSVNBX1JFR19OQU1FUyBcCisgIC8qICAwICovICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsICBcCisgIC8qICA4ICovICJyOCIsICJyOSIsICJyMTAiLCJyMTEiLCJyMTIiLCJyMTMiLCJyMTQiLCJyMTUiLCBcCisgIC8qIDE2ICovICJyMTYiLCJyMTciLCJyMTgiLCJyMTkiLCJyMjAiLCJyMjEiLCJyMjIiLCJyMjMiLCBcCisgIC8qIDI0ICovICJyMjQiLCJyMjUiLCJyMjYiLCJyMjciLCJyMjgiLCJyMjkiLCJyMzAiLCJyMzEiLCBcCisgIC8qIDMyICovICJmMCIsICJmMSIsICJmMiIsICJmMyIsICJmNCIsICJmNSIsICJmNiIsICJmNyIsICBcCisgIC8qIDQwICovICJmOCIsICJmOSIsICJmMTAiLCJmMTEiLCJmMTIiLCJmMTMiLCJmMTQiLCJmMTUiLCBcCisgIC8qIDQ4ICovICJmMTYiLCJmMTciLCJmMTgiLCJmMTkiLCJmMjAiLCJmMjEiLCJmMjIiLCJmMjMiLCBcCisgIC8qIDU2ICovICJmMjQiLCJmMjUiLCJmMjYiLCJmMjciLCJmMjgiLCJmMjkiLCJmMzAiLCJmMzEiLCBcCisgIC8qIDY0ICovICJwYyIsICJwcyIKKworLyogVUlTQS1sZXZlbCBTUFIgbmFtZXMgZm9yIFBvd2VyUEMuICAqLworI2RlZmluZSBQUENfVUlTQV9TUFJfTkFNRVMgXAorICAvKiA2NiAqLyAiY3IiLCAgImxyIiwgImN0ciIsICJ4ZXIiLCAiIgorCisvKiBTZWdtZW50IHJlZ2lzdGVyIG5hbWVzLCBmb3IgUG93ZXJQQy4gICovCisjZGVmaW5lIFBQQ19TRUdNRU5UX1JFR19OQU1FUyBcCisgIC8qIDcxICovICJzcjAiLCAic3IxIiwgInNyMiIsICAic3IzIiwgICJzcjQiLCAgInNyNSIsICAic3I2IiwgICJzcjciLCBcCisgIC8qIDc5ICovICJzcjgiLCAic3I5IiwgInNyMTAiLCAic3IxMSIsICJzcjEyIiwgInNyMTMiLCAic3IxNCIsICJzcjE1IgorCisvKiBPRUEgU1BSIG5hbWVzIGZvciAzMi1iaXQgUG93ZXJQQyBpbXBsZW1lbnRhdGlvbnMuCisgICBUaGUgYmxhbmsgc3BhY2UgaXMgZm9yICJhc3IiLCB3aGljaCBpcyBvbmx5IHByZXNlbnQgb24gNjQtYml0CisgICBpbXBsZW1lbnRhdGlvbnMuICAqLworI2RlZmluZSBQUENfMzJfT0VBX1NQUl9OQU1FUyBcCisgIC8qICA4NyAqLyAicHZyIiwgXAorICAvKiAgODggKi8gImliYXQwdSIsICJpYmF0MGwiLCAiaWJhdDF1IiwgImliYXQxbCIsIFwKKyAgLyogIDkyICovICJpYmF0MnUiLCAiaWJhdDJsIiwgImliYXQzdSIsICJpYmF0M2wiLCBcCisgIC8qICA5NiAqLyAiZGJhdDB1IiwgImRiYXQwbCIsICJkYmF0MXUiLCAiZGJhdDFsIiwgXAorICAvKiAxMDAgKi8gImRiYXQydSIsICJkYmF0MmwiLCAiZGJhdDN1IiwgImRiYXQzbCIsIFwKKyAgLyogMTA0ICovICJzZHIxIiwgIiIsICJkYXIiLCAiZHNpc3IiLCAic3ByZzAiLCAic3ByZzEiLCAic3ByZzIiLCAic3ByZzMiLFwKKyAgLyogMTEyICovICJzcnIwIiwgInNycjEiLCAidGJsIiwgInRidSIsICJkZWMiLCAiZGFiciIsICJlYXIiCisKKy8qIEZvciB0aGUgUlM2MDAwLCB3ZSBvbmx5IGNvdmVyIHVzZXItbGV2ZWwgU1BSJ3MuICAqLworY2hhciAqcmVnaXN0ZXJfbmFtZXNfcnM2MDAwW10gPQoreworICBDT01NT05fVUlTQV9SRUdfTkFNRVMsCisgIC8qIDY2ICovICJjbmQiLCAibHIiLCAiY250IiwgInhlciIsICJtcSIKK307CisKKy8qIGEgVUlTQS1vbmx5IHZpZXcgb2YgdGhlIFBvd2VyUEMuICAqLworY2hhciAqcmVnaXN0ZXJfbmFtZXNfdWlzYVtdID0KK3sKKyAgQ09NTU9OX1VJU0FfUkVHX05BTUVTLAorICBQUENfVUlTQV9TUFJfTkFNRVMKK307CisKK2NoYXIgKnJlZ2lzdGVyX25hbWVzXzQwM1tdID0KK3sgCisgIENPTU1PTl9VSVNBX1JFR19OQU1FUywKKyAgUFBDX1VJU0FfU1BSX05BTUVTLAorICBQUENfU0VHTUVOVF9SRUdfTkFNRVMsCisgIFBQQ18zMl9PRUFfU1BSX05BTUVTLAorICAvKiAxMTkgKi8gImljZGJkciIsICJlc3IiLCAiZGVhciIsICJldnByIiwgImNkYmNyIiwgInRzciIsICJ0Y3IiLCAicGl0IiwgCisgIC8qIDEyNyAqLyAidGJoaSIsICJ0YmxvIiwgInNycjIiLCAic3JyMyIsICJkYnNyIiwgImRiY3IiLCAiaWFjMSIsICJpYWMyIiwgCisgIC8qIDEzNSAqLyAiZGFjMSIsICJkYWMyIiwgImRjY3IiLCAiaWNjciIsICJwYmwxIiwgInBidTEiLCAicGJsMiIsICJwYnUyIgorfTsKKworY2hhciAqcmVnaXN0ZXJfbmFtZXNfNDAzR0NbXSA9Cit7IAorICBDT01NT05fVUlTQV9SRUdfTkFNRVMsCisgIFBQQ19VSVNBX1NQUl9OQU1FUywKKyAgUFBDX1NFR01FTlRfUkVHX05BTUVTLAorICBQUENfMzJfT0VBX1NQUl9OQU1FUywKKyAgLyogMTE5ICovICJpY2RiZHIiLCAiZXNyIiwgImRlYXIiLCAiZXZwciIsICJjZGJjciIsICJ0c3IiLCAidGNyIiwgInBpdCIsIAorICAvKiAxMjcgKi8gInRiaGkiLCAidGJsbyIsICJzcnIyIiwgInNycjMiLCAiZGJzciIsICJkYmNyIiwgImlhYzEiLCAiaWFjMiIsIAorICAvKiAxMzUgKi8gImRhYzEiLCAiZGFjMiIsICJkY2NyIiwgImljY3IiLCAicGJsMSIsICJwYnUxIiwgInBibDIiLCAicGJ1MiIsIAorICAvKiAxNDMgKi8gInpwciIsICJwaWQiLCAic2dyIiwgImRjd3IiLCAidGJodSIsICJ0Ymx1IgorfTsKKworY2hhciAqcmVnaXN0ZXJfbmFtZXNfNTA1W10gPQoreyAKKyAgQ09NTU9OX1VJU0FfUkVHX05BTUVTLAorICBQUENfVUlTQV9TUFJfTkFNRVMsCisgIFBQQ19TRUdNRU5UX1JFR19OQU1FUywKKyAgUFBDXzMyX09FQV9TUFJfTkFNRVMsCisgIC8qIDExOSAqLyAiZWllIiwgImVpZCIsICJucmkiCit9OworCitjaGFyICpyZWdpc3Rlcl9uYW1lc184NjBbXSA9Cit7IAorICBDT01NT05fVUlTQV9SRUdfTkFNRVMsCisgIFBQQ19VSVNBX1NQUl9OQU1FUywKKyAgUFBDX1NFR01FTlRfUkVHX05BTUVTLAorICBQUENfMzJfT0VBX1NQUl9OQU1FUywKKyAgLyogMTE5ICovICJlaWUiLCAiZWlkIiwgIm5yaSIsICJjbXBhIiwgImNtcGIiLCAiY21wYyIsICJjbXBkIiwgImljciIsIAorICAvKiAxMjcgKi8gImRlciIsICJjb3VudGEiLCAiY291bnRiIiwgImNtcGUiLCAiY21wZiIsICJjbXBnIiwgImNtcGgiLCAKKyAgLyogMTM0ICovICJsY3RybDEiLCAibGN0cmwyIiwgImljdHJsIiwgImJhciIsICJpY19jc3QiLCAiaWNfYWRyIiwgImljX2RhdCIsIAorICAvKiAxNDEgKi8gImRjX2NzdCIsICJkY19hZHIiLCAiZGNfZGF0IiwgImRwZHIiLCAiZHBpciIsICJpbW1yIiwgIm1pX2N0ciIsIAorICAvKiAxNDggKi8gIm1pX2FwIiwgIm1pX2VwbiIsICJtaV90d2MiLCAibWlfcnBuIiwgIm1kX2N0ciIsICJtX2Nhc2lkIiwgCisgIC8qIDE1NCAqLyAibWRfYXAiLCAibWRfZXBuIiwgIm1kX3R3YiIsICJtZF90d2MiLCAibWRfcnBuIiwgIm1fdHciLCAKKyAgLyogMTYwICovICJtaV9kYmNhbSIsICJtaV9kYnJhbTAiLCAibWlfZGJyYW0xIiwgIm1kX2RiY2FtIiwgIm1kX2RicmFtMCIsIAorICAvKiAxNjUgKi8gIm1kX2RicmFtMSIKK307CisKKy8qIE5vdGUgdGhhdCB0aGUgNjAxIGhhcyBkaWZmZXJlbnQgcmVnaXN0ZXIgbnVtYmVycyBmb3IgcmVhZGluZyBhbmQKKyAgIHdyaXRpbmcgUlRDVSBhbmQgUlRDTC4gIEhvd2V2ZXIsIGhvdyBvbmUgcmVhZHMgYW5kIHdyaXRlcyBhCisgICByZWdpc3RlciBpcyB0aGUgc3R1YidzIHByb2JsZW0uICAqLworY2hhciAqcmVnaXN0ZXJfbmFtZXNfNjAxW10gPQoreyAKKyAgQ09NTU9OX1VJU0FfUkVHX05BTUVTLAorICBQUENfVUlTQV9TUFJfTkFNRVMsCisgIFBQQ19TRUdNRU5UX1JFR19OQU1FUywKKyAgUFBDXzMyX09FQV9TUFJfTkFNRVMsCisgIC8qIDExOSAqLyAiaGlkMCIsICJoaWQxIiwgImlhYnIiLCAiZGFiciIsICJwaXIiLCAibXEiLCAicnRjdSIsIAorICAvKiAxMjYgKi8gInJ0Y2wiCit9OworCitjaGFyICpyZWdpc3Rlcl9uYW1lc182MDJbXSA9Cit7IAorICBDT01NT05fVUlTQV9SRUdfTkFNRVMsCisgIFBQQ19VSVNBX1NQUl9OQU1FUywKKyAgUFBDX1NFR01FTlRfUkVHX05BTUVTLAorICBQUENfMzJfT0VBX1NQUl9OQU1FUywKKyAgLyogMTE5ICovICJoaWQwIiwgImhpZDEiLCAiaWFiciIsICIiLCAiIiwgInRjciIsICJpYnIiLCAiZXNhc3NyIiwgInNlYnIiLCAKKyAgLyogMTI4ICovICJzZXIiLCAic3AiLCAibHQiCit9OworCitjaGFyICpyZWdpc3Rlcl9uYW1lc182MDNbXSA9Cit7IAorICBDT01NT05fVUlTQV9SRUdfTkFNRVMsCisgIFBQQ19VSVNBX1NQUl9OQU1FUywKKyAgUFBDX1NFR01FTlRfUkVHX05BTUVTLAorICBQUENfMzJfT0VBX1NQUl9OQU1FUywKKyAgLyogMTE5ICovICJoaWQwIiwgImhpZDEiLCAiaWFiciIsICIiLCAiIiwgImRtaXNzIiwgImRjbXAiLCAiaGFzaDEiLCAKKyAgLyogMTI3ICovICJoYXNoMiIsICJpbWlzcyIsICJpY21wIiwgInJwYSIKK307CisKK2NoYXIgKnJlZ2lzdGVyX25hbWVzXzYwNFtdID0KK3sgCisgIENPTU1PTl9VSVNBX1JFR19OQU1FUywKKyAgUFBDX1VJU0FfU1BSX05BTUVTLAorICBQUENfU0VHTUVOVF9SRUdfTkFNRVMsCisgIFBQQ18zMl9PRUFfU1BSX05BTUVTLAorICAvKiAxMTkgKi8gImhpZDAiLCAiaGlkMSIsICJpYWJyIiwgImRhYnIiLCAicGlyIiwgIm1tY3IwIiwgInBtYzEiLCAicG1jMiIsIAorICAvKiAxMjcgKi8gInNpYSIsICJzZGEiCit9OworCitjaGFyICpyZWdpc3Rlcl9uYW1lc183NTBbXSA9Cit7IAorICBDT01NT05fVUlTQV9SRUdfTkFNRVMsCisgIFBQQ19VSVNBX1NQUl9OQU1FUywKKyAgUFBDX1NFR01FTlRfUkVHX05BTUVTLAorICBQUENfMzJfT0VBX1NQUl9OQU1FUywKKyAgLyogMTE5ICovICJoaWQwIiwgImhpZDEiLCAiaWFiciIsICJkYWJyIiwgIiIsICJ1bW1jcjAiLCAidXBtYzEiLCAidXBtYzIiLCAKKyAgLyogMTI3ICovICJ1c2lhIiwgInVtbWNyMSIsICJ1cG1jMyIsICJ1cG1jNCIsICJtbWNyMCIsICJwbWMxIiwgInBtYzIiLCAKKyAgLyogMTM0ICovICJzaWEiLCAibW1jcjEiLCAicG1jMyIsICJwbWM0IiwgImwyY3IiLCAiaWN0YyIsICJ0aHJtMSIsICJ0aHJtMiIsIAorICAvKiAxNDIgKi8gInRocm0zIgorfTsKKworCisvKiBJbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgcHJvY2Vzc29yIHZhcmlhbnQuICAqLworc3RydWN0IHZhcmlhbnQKK3sKKyAgLyogTmFtZSBvZiB0aGlzIHZhcmlhbnQuICAqLworICBjaGFyICpuYW1lOworCisgIC8qIEVuZ2xpc2ggZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlhbnQuICAqLworICBjaGFyICpkZXNjcmlwdGlvbjsKKworICAvKiBUYWJsZSBvZiByZWdpc3RlciBuYW1lczsgcmVnaXN0ZXJzW1JdIGlzIHRoZSBuYW1lIG9mIHRoZSByZWdpc3RlcgorICAgICBudW1iZXIgUi4gICovCisgIGludCBudW1fcmVnaXN0ZXJzOworICBjaGFyICoqcmVnaXN0ZXJzOworfTsKKworI2RlZmluZSBudW1fcmVnaXN0ZXJzKGxpc3QpIChzaXplb2YgKGxpc3QpIC8gc2l6ZW9mKChsaXN0KVswXSkpCisKKworLyogSW5mb3JtYXRpb24gaW4gdGhpcyB0YWJsZSBjb21lcyBmcm9tIHRoZSBmb2xsb3dpbmcgd2ViIHNpdGVzOgorICAgSUJNOiAgICAgICBodHRwOi8vd3d3LmNoaXBzLmlibS5jb206ODAvcHJvZHVjdHMvZW1iZWRkZWQvCisgICBNb3Rvcm9sYTogIGh0dHA6Ly93d3cubW90LmNvbS9TUFMvUG93ZXJQQy8KKworICAgSSdtIHN1cmUgSSd2ZSBnb3Qgc29tZSBvZiB0aGUgdmFyaWFudCBkZXNjcmlwdGlvbnMgbm90IHF1aXRlIHJpZ2h0LgorICAgUGxlYXNlIHJlcG9ydCBhbnkgaW5hY2N1cmFjaWVzIHlvdSBmaW5kIHRvIEdEQidzIG1haW50YWluZXIuCisKKyAgIElmIHlvdSBhZGQgZW50cmllcyB0byB0aGlzIHRhYmxlLCBwbGVhc2UgYmUgc3VyZSB0byBhbGxvdyB0aGUgbmV3CisgICB2YWx1ZSBhcyBhbiBhcmd1bWVudCB0byB0aGUgLS13aXRoLWNwdSBmbGFnLCBpbiBjb25maWd1cmUuaW4uICAqLworCitzdGF0aWMgc3RydWN0IHZhcmlhbnQKK3ZhcmlhbnRzW10gPQoreworICB7ICJwcGMtdWlzYSIsICJQb3dlclBDIFVJU0EgLSBhIFBQQyBwcm9jZXNzb3IgYXMgdmlld2VkIGJ5IHVzZXItbGV2ZWwgY29kZSIsCisgICAgbnVtX3JlZ2lzdGVycyAocmVnaXN0ZXJfbmFtZXNfdWlzYSksICAgcmVnaXN0ZXJfbmFtZXNfdWlzYSB9LAorICB7ICJyczYwMDAiLCAiSUJNIFJTNjAwMCAoXCJQT1dFUlwiKSBhcmNoaXRlY3R1cmUsIHVzZXItbGV2ZWwgdmlldyIsCisgICAgbnVtX3JlZ2lzdGVycyAocmVnaXN0ZXJfbmFtZXNfcnM2MDAwKSwgcmVnaXN0ZXJfbmFtZXNfcnM2MDAwIH0sCisgIHsgIjQwMyIsICJJQk0gUG93ZXJQQyA0MDMiLAorICAgIG51bV9yZWdpc3RlcnMgKHJlZ2lzdGVyX25hbWVzXzQwMyksICAgcmVnaXN0ZXJfbmFtZXNfNDAzIH0sCisgIHsgIjQwM0dDIiwgIklCTSBQb3dlclBDIDQwM0dDIiwKKyAgICBudW1fcmVnaXN0ZXJzIChyZWdpc3Rlcl9uYW1lc180MDNHQyksIHJlZ2lzdGVyX25hbWVzXzQwM0dDIH0sCisgIHsgIjUwNSIsICJNb3Rvcm9sYSBQb3dlclBDIDUwNSIsCisgICAgbnVtX3JlZ2lzdGVycyAocmVnaXN0ZXJfbmFtZXNfNTA1KSwgICByZWdpc3Rlcl9uYW1lc181MDUgfSwKKyAgeyAiODYwIiwgIk1vdG9yb2xhIFBvd2VyUEMgODYwIG9yIDg1MCIsCisgICAgbnVtX3JlZ2lzdGVycyAocmVnaXN0ZXJfbmFtZXNfODYwKSwgICByZWdpc3Rlcl9uYW1lc184NjAgfSwKKyAgeyAiNjAxIiwgIk1vdG9yb2xhIFBvd2VyUEMgNjAxIiwKKyAgICBudW1fcmVnaXN0ZXJzIChyZWdpc3Rlcl9uYW1lc182MDEpLCAgIHJlZ2lzdGVyX25hbWVzXzYwMSB9LAorICB7ICI2MDIiLCAiTW90b3JvbGEgUG93ZXJQQyA2MDIiLAorICAgIG51bV9yZWdpc3RlcnMgKHJlZ2lzdGVyX25hbWVzXzYwMiksICAgcmVnaXN0ZXJfbmFtZXNfNjAyIH0sCisgIHsgIjYwMyIsICJNb3Rvcm9sYS9JQk0gUG93ZXJQQyA2MDMgb3IgNjAzZSIsCisgICAgbnVtX3JlZ2lzdGVycyAocmVnaXN0ZXJfbmFtZXNfNjAzKSwgICByZWdpc3Rlcl9uYW1lc182MDMgfSwKKyAgeyAiNjA0IiwgIk1vdG9yb2xhIFBvd2VyUEMgNjA0IG9yIDYwNGUiLAorICAgIG51bV9yZWdpc3RlcnMgKHJlZ2lzdGVyX25hbWVzXzYwNCksICAgcmVnaXN0ZXJfbmFtZXNfNjA0IH0sCisgIHsgIjc1MCIsICJNb3Rvcm9sYS9JQk0gUG93ZXJQQyA3NTAgb3IgNzUwIiwKKyAgICBudW1fcmVnaXN0ZXJzIChyZWdpc3Rlcl9uYW1lc183NTApLCAgIHJlZ2lzdGVyX25hbWVzXzc1MCB9LAorICB7IDAsIDAsIDAsIDAgfQorfTsKKworCitzdGF0aWMgc3RydWN0IHZhcmlhbnQgKmN1cnJlbnRfdmFyaWFudDsKKworY2hhciAqCityczYwMDBfcmVnaXN0ZXJfbmFtZSAoaW50IGkpCit7CisgIGlmIChpIDwgMCB8fCBpID49IE5VTV9SRUdTKQorICAgIGVycm9yICgiR0RCIGJ1ZzogcnM2MDAwLXRkZXAuYyAocnM2MDAwX3JlZ2lzdGVyX25hbWUpOiBzdHJhbmdlIHJlZ2lzdGVyIG51bWJlciIpOworCisgIHJldHVybiAoKGkgPCBjdXJyZW50X3ZhcmlhbnQtPm51bV9yZWdpc3RlcnMpCisJICA/IGN1cnJlbnRfdmFyaWFudC0+cmVnaXN0ZXJzW2ldCisJICA6ICIiKTsKK30KKworCitzdGF0aWMgdm9pZAoraW5zdGFsbF92YXJpYW50IChzdHJ1Y3QgdmFyaWFudCAqdikKK3sKKyAgY3VycmVudF92YXJpYW50ID0gdjsKK30KKworCisvKiBMb29rIHVwIHRoZSB2YXJpYW50IG5hbWVkIE5BTUUgaW4gdGhlIGB2YXJpYW50cycgdGFibGUuICBSZXR1cm4gYQorICAgcG9pbnRlciB0byB0aGUgc3RydWN0IHZhcmlhbnQsIG9yIG51bGwgaWYgd2UgY291bGRuJ3QgZmluZCBpdC4gICovCitzdGF0aWMgc3RydWN0IHZhcmlhbnQgKgorZmluZF92YXJpYW50X2J5X25hbWUgKGNoYXIgKm5hbWUpCit7CisgIGludCBpOworICAKKyAgZm9yIChpID0gMDsgdmFyaWFudHNbaV0ubmFtZTsgaSsrKQorICAgIGlmICghIHN0cmNtcCAobmFtZSwgdmFyaWFudHNbaV0ubmFtZSkpCisgICAgICByZXR1cm4gJnZhcmlhbnRzW2ldOworCisgIHJldHVybiAwOworfQorCisKKy8qIEluc3RhbGwgdGhlIFBQQy9SUzYwMDAgdmFyaWFudCBuYW1lZCBOQU1FIGluIHRoZSBgdmFyaWFudHMnIHRhYmxlLgorICAgUmV0dXJuIHplcm8gaWYgd2UgaW5zdGFsbGVkIGl0IHN1Y2Nlc3NmdWxseSwgb3IgYSBub24temVybyB2YWx1ZSBpZgorICAgd2UgY291bGRuJ3QgZG8gaXQuCisKKyAgIFRoaXMgbWlnaHQgYmUgdXNlZnVsIHRvIGNvZGUgb3V0c2lkZSB0aGlzIGZpbGUsIHdoaWNoIGRvZXNuJ3Qgd2FudAorICAgdG8gZGVwZW5kIG9uIHRoZSBleGFjdCBpbmRpY2VzIG9mIHRoZSBlbnRyaWVzIGluIHRoZSBgdmFyaWFudHMnCisgICB0YWJsZS4gIEp1c3QgbWFrZSBpdCBub24tc3RhdGljIGlmIHlvdSB3YW50IHRoYXQuICAqLworc3RhdGljIGludAoraW5zdGFsbF92YXJpYW50X2J5X25hbWUgKGNoYXIgKm5hbWUpCit7CisgIHN0cnVjdCB2YXJpYW50ICp2ID0gZmluZF92YXJpYW50X2J5X25hbWUgKG5hbWUpOworCisgIGlmICh2KQorICAgIHsKKyAgICAgIGluc3RhbGxfdmFyaWFudCAodik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgdm9pZAorbGlzdF92YXJpYW50cyAoKQoreworICBpbnQgaTsKKworICBwcmludGZfZmlsdGVyZWQgKCJHREIga25vd3MgYWJvdXQgdGhlIGZvbGxvd2luZyBQb3dlclBDIGFuZCBSUzYwMDAgdmFyaWFudHM6XG4iKTsKKworICBmb3IgKGkgPSAwOyB2YXJpYW50c1tpXS5uYW1lOyBpKyspCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiICAlLThzICAlc1xuIiwKKwkJICAgICB2YXJpYW50c1tpXS5uYW1lLCB2YXJpYW50c1tpXS5kZXNjcmlwdGlvbik7Cit9CisKKworc3RhdGljIHZvaWQKK3Nob3dfY3VycmVudF92YXJpYW50ICgpCit7CisgIHByaW50Zl9maWx0ZXJlZCAoIlBvd2VyUEMgLyBSUzYwMDAgcHJvY2Vzc29yIHZhcmlhbnQgaXMgc2V0IHRvIGAlcycuXG4iLAorCQkgICBjdXJyZW50X3ZhcmlhbnQtPm5hbWUpOworfQorCisKK3N0YXRpYyB2b2lkCitzZXRfcHJvY2Vzc29yIChjaGFyICphcmcsIGludCBmcm9tX3R0eSkKK3sKKyAgaW50IGk7CisKKyAgaWYgKCEgYXJnIHx8IGFyZ1swXSA9PSAnXDAnKQorICAgIHsKKyAgICAgIGxpc3RfdmFyaWFudHMgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChpbnN0YWxsX3ZhcmlhbnRfYnlfbmFtZSAoYXJnKSkKKyAgICB7CisgICAgICBlcnJvcl9iZWdpbiAoKTsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKGdkYl9zdGRlcnIsCisJCQkiYCVzJyBpcyBub3QgYSByZWNvZ25pemVkIFBvd2VyUEMgLyBSUzYwMDAgdmFyaWFudCBuYW1lLlxuXG4iLCBhcmcpOworICAgICAgbGlzdF92YXJpYW50cyAoKTsKKyAgICAgIHJldHVybl90b190b3BfbGV2ZWwgKFJFVFVSTl9FUlJPUik7CisgICAgfQorCisgIHNob3dfY3VycmVudF92YXJpYW50ICgpOworfQorCitzdGF0aWMgdm9pZAorc2hvd19wcm9jZXNzb3IgKGNoYXIgKmFyZywgaW50IGZyb21fdHR5KQoreworICBzaG93X2N1cnJlbnRfdmFyaWFudCAoKTsKK30KKworCisMCisvKiBJbml0aWFsaXphdGlvbiBjb2RlLiAgKi8KKwordm9pZAorX2luaXRpYWxpemVfcnM2MDAwX3RkZXAgKCkKK3sKKyAgLyogRklYTUUsIHRoaXMgc2hvdWxkIG5vdCBiZSBkZWNpZGVkIHZpYSBpZmRlZi4gKi8KKyNpZmRlZiBHREJfVEFSR0VUX1BPV0VSUEMKKyAgdG1fcHJpbnRfaW5zbiA9IGdkYl9wcmludF9pbnNuX3Bvd2VycGM7CisjZWxzZQorICB0bV9wcmludF9pbnNuID0gcHJpbnRfaW5zbl9yczYwMDA7CisjZW5kaWYKKworICAvKiBJIGRvbid0IHRoaW5rIHdlIHNob3VsZCB1c2UgdGhlIHNldC9zaG93IGNvbW1hbmQgYXJyYW5nZW1lbnQKKyAgICAgaGVyZSwgYmVjYXVzZSB0aGUgd2F5IHRoYXQncyBpbXBsZW1lbnRlZCBtYWtlcyBpdCBoYXJkIHRvIGRvIHRoZQorICAgICBlcnJvciBjaGVja2luZyB3ZSB3YW50IGluIGEgcmVhc29uYWJsZSB3YXkuICBTbyB3ZSBqdXN0IGFkZCB0aGVtCisgICAgIGFzIHR3byBzZXBhcmF0ZSBjb21tYW5kcy4gICovCisgIGFkZF9jbWQgKCJwcm9jZXNzb3IiLCBjbGFzc19zdXBwb3J0LCBzZXRfcHJvY2Vzc29yLAorCSAgICJgc2V0IHByb2Nlc3NvciBOQU1FJyBzZXRzIHRoZSBQb3dlclBDL1JTNjAwMCB2YXJpYW50IHRvIE5BTUUuXG5cCitJZiB5b3Ugc2V0IHRoaXMsIEdEQiB3aWxsIGtub3cgYWJvdXQgdGhlIHNwZWNpYWwtcHVycG9zZSByZWdpc3RlcnMgdGhhdCBhcmVcblwKK2F2YWlsYWJsZSBvbiB0aGUgZ2l2ZW4gdmFyaWFudC5cblwKK1R5cGUgYHNldCBwcm9jZXNzb3InIGFsb25lIGZvciBhIGxpc3Qgb2YgcmVjb2duaXplZCB2YXJpYW50IG5hbWVzLiIsCisJICAgJnNldGxpc3QpOworICBhZGRfY21kICgicHJvY2Vzc29yIiwgY2xhc3Nfc3VwcG9ydCwgc2hvd19wcm9jZXNzb3IsCisJICAgIlNob3cgdGhlIHZhcmlhbnQgb2YgdGhlIFBvd2VyUEMgb3IgUlM2MDAwIHByb2Nlc3NvciBpbiB1c2UuXG5cCitVc2UgYHNldCBwcm9jZXNzb3InIHRvIGNoYW5nZSB0aGlzLiIsCisJICAgJnNob3dsaXN0KTsKKworICAvKiBTZXQgdGhlIGN1cnJlbnQgUFBDIHByb2Nlc3NvciB2YXJpYW50LiAgKi8KKyAgeworICAgIGludCBzdGF0dXMgPSAxOworCisjaWZkZWYgVEFSR0VUX0NQVV9ERUZBVUxUCisgICAgc3RhdHVzID0gaW5zdGFsbF92YXJpYW50X2J5X25hbWUgKFRBUkdFVF9DUFVfREVGQVVMVCk7CisjZW5kaWYKKworICAgIGlmIChzdGF0dXMpCisgICAgICB7CisjaWZkZWYgR0RCX1RBUkdFVF9QT1dFUlBDCisJaW5zdGFsbF92YXJpYW50X2J5X25hbWUgKCJwcGMtdWlzYSIpOworI2Vsc2UKKwlpbnN0YWxsX3ZhcmlhbnRfYnlfbmFtZSAoInJzNjAwMCIpOworI2VuZGlmCisgICAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dkYi9zYWJlci5zdXBwcmVzcyBiL2dkYi9zYWJlci5zdXBwcmVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGRhMWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3NhYmVyLnN1cHByZXNzCkBAIC0wLDAgKzEsNDUxIEBACisKKworLyogT3B0aW9ucyBmb3IgcHJvamVjdCAqLwordW5zZXRvcHQgYW5zaQorc2V0b3B0IGF1dG9fY29tcGlsZQordW5zZXRvcHQgYXV0b19yZWxvYWQKK3NldG9wdCBhdXRvX3JlcGxhY2UKK3Vuc2V0b3B0IGJhdGNoX2xvYWQKK3Vuc2V0b3B0IGJhdGNoX3J1bgordW5zZXRvcHQgY2NfcHJvZworc2V0b3B0IGNjYXJncyAgICAgICAgICAgICAgIC1nCit1bnNldG9wdCBjcmVhdGVfZmlsZQordW5zZXRvcHQgZGVidWdfY2hpbGQKK3Vuc2V0b3B0IGVjaG8KK3NldG9wdCBlZGl0X2pvYnMgICAgICAgICAgICA1Cit1bnNldG9wdCBlaWdodF9iaXQKK3NldG9wdCBsaW5lX2VkaXQKK3NldG9wdCBsaW5lX21ldGEKK3NldG9wdCBsaW50X2xvYWQgICAgICAgICAgICAyCitzZXRvcHQgbGludF9ydW4gICAgICAgICAgICAgMgorc2V0b3B0IGxpc3RfYWN0aW9uCitzZXRvcHQgbG9hZF9mbGFncyAgICAgICAgICAgLUkuIC1nIC1JLi4gLUkuLi92eC1zaGFyZQordW5zZXRvcHQgbG9uZ19ub3RfaW50Cit1bnNldG9wdCBtYWtlX2FyZ3MKK3NldG9wdCBtYWtlX2hmaWxlcwordW5zZXRvcHQgbWFrZV9vZmZzZXQKK3Vuc2V0b3B0IG1ha2VfcHJvZworc2V0b3B0IG1ha2Vfc3ltYm9sICAgICAgICAgICMKK3NldG9wdCBtZW1fY29uZmlnICAgICAgICAgICAxNjM4NAordW5zZXRvcHQgbWVtX3RyYWNlCitzZXRvcHQgbnVtX3Byb2MgICAgICAgICAgICAgMQordW5zZXRvcHQgcGFnZV9jbWRzCitzZXRvcHQgcGFnZV9saXN0ICAgICAgICAgICAgMTkKK3Vuc2V0b3B0IHBhZ2VfbG9hZAordW5zZXRvcHQgcGF0aAorc2V0b3B0IHByb3RvX3BhdGggICAgICAgICAgIC4gL3MyL3NhYmVyX2RpcjMwL3N1bjQtNDAvcHJvdG8gL3MyL3NhYmVyX2RpcjMwL3N1bjQtNDAvLi4vY29tbW9uL3Byb3RvCit1bnNldG9wdCBwcmVwcm9jZXNzb3IKK3NldG9wdCBwcm9ncmFtX25hbWUgICAgICAgICBhLm91dAordW5zZXRvcHQgcHJpbnRfY3VzdG9tCitzZXRvcHQgcHJpbnRfcG9pbnRlcgorc2V0b3B0IHByaW50X3N0cmluZyAgICAgICAgIDIwCit1bnNldG9wdCBzYXZlX21lbW9yeQorc2V0b3B0IHNicmtfc2l6ZSAgICAgICAgICAgIDEwNDg1NzYKK3NldG9wdCBzcmNfZXJyICAgICAgICAgICAgICAzCitzZXRvcHQgc3JjX3N0ZXAgICAgICAgICAgICAgMQorc2V0b3B0IHNyY19zdG9wICAgICAgICAgICAgIDMKK3NldG9wdCBzeXNfbG9hZF9mbGFncyAgICAgICAtTC9saWIgLUwvdXNyL2xpYiAtTC91c3IvbG9jYWwvbGliIC1JL3Vzci9pbmNsdWRlIC1EdW5peCAtRHN1biAtRHNwYXJjCit1bnNldG9wdCB0YWJfc3RvcAordW5zZXRvcHQgdGVyc2Vfc3VwcHJlc3MKK3Vuc2V0b3B0IHRlcnNlX3doZXJlCitzZXRvcHQgdW5zZXRfdmFsdWUgICAgICAgICAgMTkxCit1bnNldG9wdCB3aW5fZm9ya19ub2R1cAorc2V0b3B0IHdpbl9ub19yYWlzZQordW5zZXRvcHQgd2luX21lc3NhZ2VfbGlzdAordW5zZXRvcHQgd2luX3Byb2plY3RfbGlzdAorLyogU3VwcHJlc3Npb25zIGZvciBwcm9qZWN0ICovCitzdXBwcmVzcyA2IGluIHJlYWRfaHVnZV9udW1iZXIgCisvKiBPdmVyL3VuZGVyZmxvdyA8cGx1cz4gKi8KK3N1cHByZXNzIDggaW4gcmVhZF9odWdlX251bWJlciAKKy8qIE92ZXIvdW5kZXJmbG93IDxtdWx0aXBseT4gKi8KK3N1cHByZXNzIDIyIAorLyogUG9pbnRlciBzdWJ0cmFjdGlvbiAqLworc3VwcHJlc3MgMjIgaW4gZnJlZV9hbGxfcHN5bXRhYnMgCisvKiBQb2ludGVyIHN1YnRyYWN0aW9uICovCitzdXBwcmVzcyAyMiBpbiBmcmVlX2FsbF9zeW10YWJzIAorLyogUG9pbnRlciBzdWJ0cmFjdGlvbiAqLworc3VwcHJlc3MgNTYgaW4gcHJpbnRfc3RyaW5nIAorLyogSW5mb3JtYXRpb24gbG9zdCA8ZnVuY3Rpb24+ICovCitzdXBwcmVzcyA2NSAiLi4vYmZkL2JmZC5jIjozNzkgCisvKiBUb28gbWFueSBmdW5jdGlvbiBhcmd1bWVudHMgKi8KK3N1cHByZXNzIDY1IG9uIHByaW50Zl9maWx0ZXJlZCAKKy8qIFRvbyBtYW55IGZ1bmN0aW9uIGFyZ3VtZW50cyAqLworc3VwcHJlc3MgNjUgb24gZnByaW50Zl9maWx0ZXJlZCAKKy8qIFRvbyBtYW55IGZ1bmN0aW9uIGFyZ3VtZW50cyAqLworc3VwcHJlc3MgNjUgb24gdmZwcmludGZfZmlsdGVyZWQgCisvKiBUb28gbWFueSBmdW5jdGlvbiBhcmd1bWVudHMgKi8KK3N1cHByZXNzIDY1IG9uIHF1ZXJ5IAorLyogVG9vIG1hbnkgZnVuY3Rpb24gYXJndW1lbnRzICovCitzdXBwcmVzcyA2NSBvbiBmYXRhbF9kdW1wX2NvcmUgCisvKiBUb28gbWFueSBmdW5jdGlvbiBhcmd1bWVudHMgKi8KK3N1cHByZXNzIDY1IG9uIGZhdGFsIAorLyogVG9vIG1hbnkgZnVuY3Rpb24gYXJndW1lbnRzICovCitzdXBwcmVzcyA2NSBvbiBlcnJvciAKKy8qIFRvbyBtYW55IGZ1bmN0aW9uIGFyZ3VtZW50cyAqLworc3VwcHJlc3MgNjUgb24gbm9wcm9jZXNzIAorLyogVG9vIG1hbnkgZnVuY3Rpb24gYXJndW1lbnRzICovCitzdXBwcmVzcyA2NSAKKy8qIFRvbyBtYW55IGZ1bmN0aW9uIGFyZ3VtZW50cyAqLworc3VwcHJlc3MgNjYgb24gc2F5IAorLyogVG9vIGZldyBmdW5jdGlvbiBhcmd1bWVudHMgKi8KK3N1cHByZXNzIDY2IG9uIHByaW50Zl9maWx0ZXJlZCAKKy8qIFRvbyBmZXcgZnVuY3Rpb24gYXJndW1lbnRzICovCitzdXBwcmVzcyA2NiBvbiBmcHJpbnRmX2ZpbHRlcmVkIAorLyogVG9vIGZldyBmdW5jdGlvbiBhcmd1bWVudHMgKi8KK3N1cHByZXNzIDY2IG9uIHZmcHJpbnRmX2ZpbHRlcmVkIAorLyogVG9vIGZldyBmdW5jdGlvbiBhcmd1bWVudHMgKi8KK3N1cHByZXNzIDY2IG9uIHF1ZXJ5IAorLyogVG9vIGZldyBmdW5jdGlvbiBhcmd1bWVudHMgKi8KK3N1cHByZXNzIDY2IG9uIGZhdGFsX2R1bXBfY29yZSAKKy8qIFRvbyBmZXcgZnVuY3Rpb24gYXJndW1lbnRzICovCitzdXBwcmVzcyA2NiBvbiBmYXRhbCAKKy8qIFRvbyBmZXcgZnVuY3Rpb24gYXJndW1lbnRzICovCitzdXBwcmVzcyA2NiBvbiBlcnJvciAKKy8qIFRvbyBmZXcgZnVuY3Rpb24gYXJndW1lbnRzICovCitzdXBwcmVzcyA2NyBvbiBwcmludGZfZmlsdGVyZWQgCisvKiBTaWduZWQvdW5zaWduZWQgYXJndW1lbnQgbWlzbWF0Y2ggKi8KK3N1cHByZXNzIDY3IG9uIGZwcmludGZfZmlsdGVyZWQgCisvKiBTaWduZWQvdW5zaWduZWQgYXJndW1lbnQgbWlzbWF0Y2ggKi8KK3N1cHByZXNzIDY3IG9uIHZmcHJpbnRmX2ZpbHRlcmVkIAorLyogU2lnbmVkL3Vuc2lnbmVkIGFyZ3VtZW50IG1pc21hdGNoICovCitzdXBwcmVzcyA2NyBvbiBxdWVyeSAKKy8qIFNpZ25lZC91bnNpZ25lZCBhcmd1bWVudCBtaXNtYXRjaCAqLworc3VwcHJlc3MgNjcgb24gZmF0YWxfZHVtcF9jb3JlIAorLyogU2lnbmVkL3Vuc2lnbmVkIGFyZ3VtZW50IG1pc21hdGNoICovCitzdXBwcmVzcyA2NyBvbiBmYXRhbCAKKy8qIFNpZ25lZC91bnNpZ25lZCBhcmd1bWVudCBtaXNtYXRjaCAqLworc3VwcHJlc3MgNjcgb24gZXJyb3IgCisvKiBTaWduZWQvdW5zaWduZWQgYXJndW1lbnQgbWlzbWF0Y2ggKi8KK3N1cHByZXNzIDY3IAorLyogU2lnbmVkL3Vuc2lnbmVkIGFyZ3VtZW50IG1pc21hdGNoICovCitzdXBwcmVzcyA2OCBvbiBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgCisvKiBCZW5pZ24gYXJndW1lbnQgbWlzbWF0Y2ggKi8KK3N1cHByZXNzIDY4IG9uIF9kb19nZXRibG9uZyAKKy8qIEJlbmlnbiBhcmd1bWVudCBtaXNtYXRjaCAqLworc3VwcHJlc3MgNjggb24gc3VwcGx5X3JlZ2lzdGVyIAorLyogQmVuaWduIGFyZ3VtZW50IG1pc21hdGNoICovCitzdXBwcmVzcyA2OCBvbiB0YXJnZXRfd3JpdGVfbWVtb3J5IAorLyogQmVuaWduIGFyZ3VtZW50IG1pc21hdGNoICovCitzdXBwcmVzcyA2OCBvbiB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAKKy8qIEJlbmlnbiBhcmd1bWVudCBtaXNtYXRjaCAqLworc3VwcHJlc3MgNjggb24gcmVhZF9yZWdpc3Rlcl9ieXRlcyAKKy8qIEJlbmlnbiBhcmd1bWVudCBtaXNtYXRjaCAqLworc3VwcHJlc3MgNjggb24gcmVhZF9tZW1vcnkgCisvKiBCZW5pZ24gYXJndW1lbnQgbWlzbWF0Y2ggKi8KK3N1cHByZXNzIDY4IG9uIHNheSAKKy8qIEJlbmlnbiBhcmd1bWVudCBtaXNtYXRjaCAqLworc3VwcHJlc3MgNjggb24gcHJpbnRmX2ZpbHRlcmVkIAorLyogQmVuaWduIGFyZ3VtZW50IG1pc21hdGNoICovCitzdXBwcmVzcyA2OCBvbiBmcHJpbnRmX2ZpbHRlcmVkIAorLyogQmVuaWduIGFyZ3VtZW50IG1pc21hdGNoICovCitzdXBwcmVzcyA2OCBvbiB2ZnByaW50Zl9maWx0ZXJlZCAKKy8qIEJlbmlnbiBhcmd1bWVudCBtaXNtYXRjaCAqLworc3VwcHJlc3MgNjggb24gcXVlcnkgCisvKiBCZW5pZ24gYXJndW1lbnQgbWlzbWF0Y2ggKi8KK3N1cHByZXNzIDY4IG9uIGZhdGFsX2R1bXBfY29yZSAKKy8qIEJlbmlnbiBhcmd1bWVudCBtaXNtYXRjaCAqLworc3VwcHJlc3MgNjggb24gZmF0YWwgCisvKiBCZW5pZ24gYXJndW1lbnQgbWlzbWF0Y2ggKi8KK3N1cHByZXNzIDY4IG9uIGVycm9yIAorLyogQmVuaWduIGFyZ3VtZW50IG1pc21hdGNoICovCitzdXBwcmVzcyA2OCBpbiBmaW5kX3NvbGliIAorLyogQmVuaWduIGFyZ3VtZW50IG1pc21hdGNoICovCitzdXBwcmVzcyA2OCBvbiBjaGlsZF93YWl0IAorLyogQmVuaWduIGFyZ3VtZW50IG1pc21hdGNoICovCitzdXBwcmVzcyA2OCBvbiB4cmVhbGxvYyAKKy8qIEJlbmlnbiBhcmd1bWVudCBtaXNtYXRjaCAqLworc3VwcHJlc3MgNjggb24gbXlyZWFkIAorLyogQmVuaWduIGFyZ3VtZW50IG1pc21hdGNoICovCitzdXBwcmVzcyA2OCBpbiBkb19jbGVhbnVwcyAKKy8qIEJlbmlnbiBhcmd1bWVudCBtaXNtYXRjaCAqLworc3VwcHJlc3MgNjggb24gbWFrZV9jbGVhbnVwIAorLyogQmVuaWduIGFyZ3VtZW50IG1pc21hdGNoICovCitzdXBwcmVzcyA2OCBvbiB0YXJnZXRfcmVhZF9tZW1vcnkgCisvKiBCZW5pZ24gYXJndW1lbnQgbWlzbWF0Y2ggKi8KK3N1cHByZXNzIDY5IG9uIHByaW50Zl9maWx0ZXJlZCAKKy8qIFNlcmlvdXMgYXJndW1lbnQgbWlzbWF0Y2ggKi8KK3N1cHByZXNzIDY5IG9uIGZwcmludGZfZmlsdGVyZWQgCisvKiBTZXJpb3VzIGFyZ3VtZW50IG1pc21hdGNoICovCitzdXBwcmVzcyA2OSBvbiB2ZnByaW50Zl9maWx0ZXJlZCAKKy8qIFNlcmlvdXMgYXJndW1lbnQgbWlzbWF0Y2ggKi8KK3N1cHByZXNzIDY5IG9uIHF1ZXJ5IAorLyogU2VyaW91cyBhcmd1bWVudCBtaXNtYXRjaCAqLworc3VwcHJlc3MgNjkgb24gZmF0YWxfZHVtcF9jb3JlIAorLyogU2VyaW91cyBhcmd1bWVudCBtaXNtYXRjaCAqLworc3VwcHJlc3MgNjkgb24gZmF0YWwgCisvKiBTZXJpb3VzIGFyZ3VtZW50IG1pc21hdGNoICovCitzdXBwcmVzcyA2OSBvbiBlcnJvciAKKy8qIFNlcmlvdXMgYXJndW1lbnQgbWlzbWF0Y2ggKi8KK3N1cHByZXNzIDcwIG9uIHByaW50Zl9maWx0ZXJlZCAKKy8qIFBhc3NpbmcgaWxsZWdhbCBlbnVtZXJhdGlvbiB2YWx1ZSAqLworc3VwcHJlc3MgNzAgb24gZnByaW50Zl9maWx0ZXJlZCAKKy8qIFBhc3NpbmcgaWxsZWdhbCBlbnVtZXJhdGlvbiB2YWx1ZSAqLworc3VwcHJlc3MgNzAgb24gdmZwcmludGZfZmlsdGVyZWQgCisvKiBQYXNzaW5nIGlsbGVnYWwgZW51bWVyYXRpb24gdmFsdWUgKi8KK3N1cHByZXNzIDcwIG9uIHF1ZXJ5IAorLyogUGFzc2luZyBpbGxlZ2FsIGVudW1lcmF0aW9uIHZhbHVlICovCitzdXBwcmVzcyA3MCBvbiBmYXRhbF9kdW1wX2NvcmUgCisvKiBQYXNzaW5nIGlsbGVnYWwgZW51bWVyYXRpb24gdmFsdWUgKi8KK3N1cHByZXNzIDcwIG9uIGZhdGFsIAorLyogUGFzc2luZyBpbGxlZ2FsIGVudW1lcmF0aW9uIHZhbHVlICovCitzdXBwcmVzcyA3MCBvbiBlcnJvciAKKy8qIFBhc3NpbmcgaWxsZWdhbCBlbnVtZXJhdGlvbiB2YWx1ZSAqLworc3VwcHJlc3MgODAgb24gZmlyc3RfbGlua19tYXBfbWVtYmVyIAorLyogUmV0dXJuaW5nIGludmFsaWQgcG9pbnRlciAqLworc3VwcHJlc3MgMTEwIGluIHByaW50Zl9maWx0ZXJlZCAKKy8qIFNpZ25lZC91bnNpZ25lZCBtZW1vcnkgcmV0cmlldmFsICovCitzdXBwcmVzcyAxMTAgaW4gZnByaW50Zl9maWx0ZXJlZCAKKy8qIFNpZ25lZC91bnNpZ25lZCBtZW1vcnkgcmV0cmlldmFsICovCitzdXBwcmVzcyAxMTAgaW4gdmZwcmludGZfZmlsdGVyZWQgCisvKiBTaWduZWQvdW5zaWduZWQgbWVtb3J5IHJldHJpZXZhbCAqLworc3VwcHJlc3MgMTEwIGluIHF1ZXJ5IAorLyogU2lnbmVkL3Vuc2lnbmVkIG1lbW9yeSByZXRyaWV2YWwgKi8KK3N1cHByZXNzIDExMCBpbiBmYXRhbF9kdW1wX2NvcmUgCisvKiBTaWduZWQvdW5zaWduZWQgbWVtb3J5IHJldHJpZXZhbCAqLworc3VwcHJlc3MgMTEwIGluIGZhdGFsIAorLyogU2lnbmVkL3Vuc2lnbmVkIG1lbW9yeSByZXRyaWV2YWwgKi8KK3N1cHByZXNzIDExMCBpbiBlcnJvciAKKy8qIFNpZ25lZC91bnNpZ25lZCBtZW1vcnkgcmV0cmlldmFsICovCitzdXBwcmVzcyAxMTIgaW4gcHJpbnRmX2ZpbHRlcmVkIAorLyogTWVtb3J5IHJldHJpZXZhbCAqLworc3VwcHJlc3MgMTEyIGluIGZwcmludGZfZmlsdGVyZWQgCisvKiBNZW1vcnkgcmV0cmlldmFsICovCitzdXBwcmVzcyAxMTIgaW4gdmZwcmludGZfZmlsdGVyZWQgCisvKiBNZW1vcnkgcmV0cmlldmFsICovCitzdXBwcmVzcyAxMTIgaW4gcXVlcnkgCisvKiBNZW1vcnkgcmV0cmlldmFsICovCitzdXBwcmVzcyAxMTIgaW4gZmF0YWxfZHVtcF9jb3JlIAorLyogTWVtb3J5IHJldHJpZXZhbCAqLworc3VwcHJlc3MgMTEyIGluIGZhdGFsIAorLyogTWVtb3J5IHJldHJpZXZhbCAqLworc3VwcHJlc3MgMTEyIGluIGVycm9yIAorLyogTWVtb3J5IHJldHJpZXZhbCAqLworc3VwcHJlc3MgMTEyIAorLyogTWVtb3J5IHJldHJpZXZhbCAqLworc3VwcHJlc3MgMTEyIC4uL3N5bXRhYi5jIAorLyogTWVtb3J5IHJldHJpZXZhbCAqLworc3VwcHJlc3MgMTEyIGluIGNoaWxkX3hmZXJfbWVtb3J5IAorLyogTWVtb3J5IHJldHJpZXZhbCAqLworc3VwcHJlc3MgMTY1IGluIGZyYW1lX3NhdmVkX3BjIAorLyogRGVyZWZlcmVuY2UgKi8KK3N1cHByZXNzIDE2NSBpbiBnZXRfcHJldl9mcmFtZV9pbmZvIAorLyogRGVyZWZlcmVuY2UgKi8KK3N1cHByZXNzIDE2NyBpbiBnZXRfcHJldl9mcmFtZV9pbmZvIAorLyogU2VsZWN0aW9uICovCitzdXBwcmVzcyAxNjcgaW4gZnJhbWVfc2F2ZWRfcGMgCisvKiBTZWxlY3Rpb24gKi8KK3N1cHByZXNzIDQ0MiBpbiB0cnlfYmF1ZHJhdGUgCisvKiBFc2NhcGUgaGFzIG51bGwgdmFsdWUgKi8KK3N1cHByZXNzIDUyOSBpbiByZWFkX3JhbmdlX3R5cGUgCisvKiBTdGF0ZW1lbnQgbm90IHJlYWNoZWQgKi8KK3N1cHByZXNzIDUyOSBpbiBwcm9jZXNzX29uZV9zeW1ib2wgCisvKiBTdGF0ZW1lbnQgbm90IHJlYWNoZWQgKi8KK3N1cHByZXNzIDUyOSBpbiB1bnBhY2tfZG91YmxlIAorLyogU3RhdGVtZW50IG5vdCByZWFjaGVkICovCitzdXBwcmVzcyA1MjkgaW4gd2FpdF9mb3JfaW5mZXJpb3IgCisvKiBTdGF0ZW1lbnQgbm90IHJlYWNoZWQgKi8KK3N1cHByZXNzIDUyOSBpbiBkb19yZWdpc3RlcnNfaW5mbyAKKy8qIFN0YXRlbWVudCBub3QgcmVhY2hlZCAqLworc3VwcHJlc3MgNTI5IGluIHZhbHVlX2Zyb21fcmVnaXN0ZXIgCisvKiBTdGF0ZW1lbnQgbm90IHJlYWNoZWQgKi8KK3N1cHByZXNzIDUyOSBpbiBzb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vayAKKy8qIENvbnN0YW50IGluIGNvbmRpdGlvbmFsICovCitzdXBwcmVzcyA1MzAgCisvKiBFbXB0eSBib2R5IG9mIHN0YXRlbWVudCAqLworc3VwcHJlc3MgNTQ2IGluIG5ldF9xdWl0IAorLyogRnVuY3Rpb24gZXhpdHMgdGhyb3VnaCBib3R0b20gKi8KK3N1cHByZXNzIDU0NiBpbiBuZXRfd2FpdCAKKy8qIEZ1bmN0aW9uIGV4aXRzIHRocm91Z2ggYm90dG9tICovCitzdXBwcmVzcyA1NDYgaW4gdnhfcmVtb3ZlX2JyZWFrcG9pbnQgCisvKiBGdW5jdGlvbiBleGl0cyB0aHJvdWdoIGJvdHRvbSAqLworc3VwcHJlc3MgNTQ2IGluIHZ4X2luc2VydF9icmVha3BvaW50IAorLyogRnVuY3Rpb24gZXhpdHMgdGhyb3VnaCBib3R0b20gKi8KK3N1cHByZXNzIDU0NiBpbiB2YWx1ZV9sZXNzIAorLyogRnVuY3Rpb24gZXhpdHMgdGhyb3VnaCBib3R0b20gKi8KK3N1cHByZXNzIDU0NiBpbiB2YWx1ZV9lcXVhbCAKKy8qIEZ1bmN0aW9uIGV4aXRzIHRocm91Z2ggYm90dG9tICovCitzdXBwcmVzcyA1NDYgaW4gdW5wYWNrX2xvbmcgCisvKiBGdW5jdGlvbiBleGl0cyB0aHJvdWdoIGJvdHRvbSAqLworc3VwcHJlc3MgNTU4IGluIHNvbGliX2NyZWF0ZV9pbmZlcmlvcl9ob29rIAorLyogQ29uc3RhbnQgaW4gY29uZGl0aW9uYWwgKi8KK3N1cHByZXNzIDU1OCBpbiByZWFkX3JhbmdlX3R5cGUgCisvKiBDb25zdGFudCBpbiBjb25kaXRpb25hbCAqLworc3VwcHJlc3MgNTU4IGluIHByb2Nlc3Nfb25lX3N5bWJvbCAKKy8qIENvbnN0YW50IGluIGNvbmRpdGlvbmFsICovCitzdXBwcmVzcyA1NTggaW4gcmVhZF9kYnhfc3ltdGFiIAorLyogQ29uc3RhbnQgaW4gY29uZGl0aW9uYWwgKi8KK3N1cHByZXNzIDU1OCBpbiB2eF93cml0ZV9yZWdpc3RlciAKKy8qIENvbnN0YW50IGluIGNvbmRpdGlvbmFsICovCitzdXBwcmVzcyA1NTggaW4gdnhfcmVhZF9yZWdpc3RlciAKKy8qIENvbnN0YW50IGluIGNvbmRpdGlvbmFsICovCitzdXBwcmVzcyA1NTggaW4gdW5wYWNrX2RvdWJsZSAKKy8qIENvbnN0YW50IGluIGNvbmRpdGlvbmFsICovCitzdXBwcmVzcyA1NTggaW4gd2FpdF9mb3JfaW5mZXJpb3IgCisvKiBDb25zdGFudCBpbiBjb25kaXRpb25hbCAqLworc3VwcHJlc3MgNTU4IGluIGRvX3JlZ2lzdGVyc19pbmZvIAorLyogQ29uc3RhbnQgaW4gY29uZGl0aW9uYWwgKi8KK3N1cHByZXNzIDU1OCBpbiB2YWx1ZV9mcm9tX3JlZ2lzdGVyIAorLyogQ29uc3RhbnQgaW4gY29uZGl0aW9uYWwgKi8KK3N1cHByZXNzIDU1OCBpbiBhZGRfZW51bV9wc3ltYm9sIAorLyogQ29uc3RhbnQgaW4gY29uZGl0aW9uYWwgKi8KK3N1cHByZXNzIDU1OCBpbiBhZGRfcGFydGlhbF9zeW1ib2wgCisvKiBDb25zdGFudCBpbiBjb25kaXRpb25hbCAqLworc3VwcHJlc3MgNTU4IG1mcmVlLmMKKy8qIENvbnN0YW50IGluIGNvbmRpdGlvbmFsICovCitzdXBwcmVzcyA1NTggbW1hbGxvYy5jCisvKiBDb25zdGFudCBpbiBjb25kaXRpb25hbCAqLworc3VwcHJlc3MgNTU4IG1yZWFsbG9jLmMKKy8qIENvbnN0YW50IGluIGNvbmRpdGlvbmFsICovCitzdXBwcmVzcyA1NjAgaW4gc29saWJfYWRkcmVzcyAKKy8qIEFzc2lnbm1lbnQgd2l0aGluIGNvbmRpdGlvbmFsICovCitzdXBwcmVzcyA1NjAgaW4gc29saWJfaW5mbyAKKy8qIEFzc2lnbm1lbnQgd2l0aGluIGNvbmRpdGlvbmFsICovCitzdXBwcmVzcyA1NjAgaW4gc29saWJfYWRkIAorLyogQXNzaWdubWVudCB3aXRoaW4gY29uZGl0aW9uYWwgKi8KK3N1cHByZXNzIDU2MCBpbiByZWFkX3R5cGUgCisvKiBBc3NpZ25tZW50IHdpdGhpbiBjb25kaXRpb25hbCAqLworc3VwcHJlc3MgNTYwIGluIHR5cGVfcHJpbnRfYmFzZSAKKy8qIEFzc2lnbm1lbnQgd2l0aGluIGNvbmRpdGlvbmFsICovCitzdXBwcmVzcyA1NjAgaW4gdHlwZV9wcmludF9kZXJpdmF0aW9uX2luZm8gCisvKiBBc3NpZ25tZW50IHdpdGhpbiBjb25kaXRpb25hbCAqLworc3VwcHJlc3MgNTYwIGluIGJsb2NrX2RlcHRoIAorLyogQXNzaWdubWVudCB3aXRoaW4gY29uZGl0aW9uYWwgKi8KK3N1cHByZXNzIDU2MCBpbiBzZWxlY3Rfc291cmNlX3N5bXRhYiAKKy8qIEFzc2lnbm1lbnQgd2l0aGluIGNvbmRpdGlvbmFsICovCitzdXBwcmVzcyA1NjAgaW4gY2xlYXJfdmFsdWVfaGlzdG9yeSAKKy8qIEFzc2lnbm1lbnQgd2l0aGluIGNvbmRpdGlvbmFsICovCitzdXBwcmVzcyA1NjAgaW4gY2xlYXJfZGlzcGxheXMgCisvKiBBc3NpZ25tZW50IHdpdGhpbiBjb25kaXRpb25hbCAqLworc3VwcHJlc3MgNTYwIGluIGluaXRpYWxpemVfbWFpbiAKKy8qIEFzc2lnbm1lbnQgd2l0aGluIGNvbmRpdGlvbmFsICovCitzdXBwcmVzcyA1NjAgaW4gZWNob19jb21tYW5kIAorLyogQXNzaWdubWVudCB3aXRoaW4gY29uZGl0aW9uYWwgKi8KK3N1cHByZXNzIDU2MCBpbiB1bnNldF9pbl9lbnZpcm9uIAorLyogQXNzaWdubWVudCB3aXRoaW4gY29uZGl0aW9uYWwgKi8KK3N1cHByZXNzIDU2MCBpbiBzZXRfaW5fZW52aXJvbiAKKy8qIEFzc2lnbm1lbnQgd2l0aGluIGNvbmRpdGlvbmFsICovCitzdXBwcmVzcyA1NjAgaW4gZ2V0X2luX2Vudmlyb24gCisvKiBBc3NpZ25tZW50IHdpdGhpbiBjb25kaXRpb25hbCAqLworc3VwcHJlc3MgNTYwIGluIGRvX3NldHNob3dfY29tbWFuZCAKKy8qIEFzc2lnbm1lbnQgd2l0aGluIGNvbmRpdGlvbmFsICovCitzdXBwcmVzcyA1NjAgaW4gYnJlYWtwb2ludF8xIAorLyogQXNzaWdubWVudCB3aXRoaW4gY29uZGl0aW9uYWwgKi8KK3N1cHByZXNzIDU5MCBvbiBzaWcgCisvKiBVbnVzZWQgZm9ybWFsIHBhcmFtZXRlciAqLworc3VwcHJlc3MgNTkwIGluIG5pbmR5X2NyZWF0ZV9pbmZlcmlvciAKKy8qIFVudXNlZCBmb3JtYWwgcGFyYW1ldGVyICovCitzdXBwcmVzcyA1OTAgaW4gYWRkX3RvX3NlY3Rpb25fdGFibGUgCisvKiBVbnVzZWQgZm9ybWFsIHBhcmFtZXRlciAqLworc3VwcHJlc3MgNTkwIGluIHZ4X2NyZWF0ZV9pbmZlcmlvciAKKy8qIFVudXNlZCBmb3JtYWwgcGFyYW1ldGVyICovCitzdXBwcmVzcyA1OTAgaW4gaG9zdF9jb252ZXJ0X2Zyb21fdmlydHVhbCAKKy8qIFVudXNlZCBmb3JtYWwgcGFyYW1ldGVyICovCitzdXBwcmVzcyA1OTAgaW4gaG9zdF9jb252ZXJ0X3RvX3ZpcnR1YWwgCisvKiBVbnVzZWQgZm9ybWFsIHBhcmFtZXRlciAqLworc3VwcHJlc3MgNTkwIG9uIHNpZ2duYWwgCisvKiBVbnVzZWQgZm9ybWFsIHBhcmFtZXRlciAqLworc3VwcHJlc3MgNTkwIGluIGluaXRfc2lnIAorLyogVW51c2VkIGZvcm1hbCBwYXJhbWV0ZXIgKi8KK3N1cHByZXNzIDU5MCBpbiBuaW5keV9yZXN1bWUgCisvKiBVbnVzZWQgZm9ybWFsIHBhcmFtZXRlciAqLworc3VwcHJlc3MgNTkwIGluIHNldF9oaXN0b3J5X3NpemVfY29tbWFuZCAKKy8qIFVudXNlZCBmb3JtYWwgcGFyYW1ldGVyICovCitzdXBwcmVzcyA1OTAgaW4gbm90X2p1c3RfaGVscF9jbGFzc19jb21tYW5kIAorLyogVW51c2VkIGZvcm1hbCBwYXJhbWV0ZXIgKi8KK3N1cHByZXNzIDU5MCBvbiByZWdubyAKKy8qIFVudXNlZCBmb3JtYWwgcGFyYW1ldGVyICovCitzdXBwcmVzcyA1OTAgb24gZnJvbV90dHkgCisvKiBVbnVzZWQgZm9ybWFsIHBhcmFtZXRlciAqLworc3VwcHJlc3MgNTkwIG9uIGFyZ3MgCisvKiBVbnVzZWQgZm9ybWFsIHBhcmFtZXRlciAqLworc3VwcHJlc3MgNTkwIGluIHByb2Nlc3Nfc3ltYm9sX3BhaXIgCisvKiBVbnVzZWQgZm9ybWFsIHBhcmFtZXRlciAqLworc3VwcHJlc3MgNTkxIGluIHByaW50X3NjYWxhcl9mb3JtYXR0ZWQgCisvKiBVbnVzZWQgYXV0b21hdGljIHZhcmlhYmxlICovCitzdXBwcmVzcyA1OTIgb24gcmNzaWQgCisvKiBVbnVzZWQgc3RhdGljICovCitzdXBwcmVzcyA1OTQgaW4gY2FsbF9mdW5jdGlvbl9ieV9oYW5kIAorLyogU2V0IGJ1dCBub3QgdXNlZCAqLworc3VwcHJlc3MgNTk0IGluIHJlY29yZF9sYXRlc3RfdmFsdWUgCisvKiBTZXQgYnV0IG5vdCB1c2VkICovCitzdXBwcmVzcyA1OTQgaW4gYnBzdGF0X3N0b3Bfc3RhdHVzIAorLyogU2V0IGJ1dCBub3QgdXNlZCAqLworc3VwcHJlc3MgNTk1IGluIGNvZmZzdHJpcCAKKy8qIFVzZWQgYmVmb3JlIHNldCAqLworc3VwcHJlc3MgNjUyIC4uL2luY2x1ZGUvYmZkLmggCisvKiBEZWNsYXJhdGlvbiBoYXMgbm8gZWZmZWN0ICovCitzdXBwcmVzcyA2NTIgL3Vzci9pbmNsdWRlL21hY2hpbmUvcmVnLmggCisvKiBEZWNsYXJhdGlvbiBoYXMgbm8gZWZmZWN0ICovCitzdXBwcmVzcyA2NTIgL3Vzci9pbmNsdWRlL3N1bjQvcmVnLmggCisvKiBEZWNsYXJhdGlvbiBoYXMgbm8gZWZmZWN0ICovCitzdXBwcmVzcyA2OCBvbiBjb21wbGFpbgorLyogQmVuaWduIHR5cGUgbWlzbWF0Y2ggKi8KK3N1cHByZXNzIDMgaW4gcmVhZF9yYW5nZV90eXBlCisvKiBPdmVyL3VuZGVyZmxvdyB1bmFyeSBtaW51cyAqLworc3VwcHJlc3MgNDQyIC4uL2JmZC9hcmNoaXZlLmMKKy8qIFwwIGluIHN0cmluZyAqLworc3VwcHJlc3MgNTU4IC4uL2JmZC9iLm91dC5jCisvKiBDb25kaXRpb25hbCBpZiBhbHdheXMgdHJ1ZSAqLworc3VwcHJlc3MgNTU4IC4uL2JmZC9jb2Zmc3dhcC5jCisvKiBDb25kaXRpb25hbCBpZiBhbHdheXMgdHJ1ZSAtLSBiZmRfaF9wdXRfeCAqLworc3VwcHJlc3MgNTI5IC4uL2JmZC9jb2Zmc3dhcC5jCisvKiBTdG10IHVucmVhY2ggLS0gYmZkX2hfcHV0X3ggKi8KK3N1cHByZXNzIDU5MCAuLi9iZmQvZWNvZmYuYworLyogRm9ybWFsIHBhcmFtZXRlciBub3QgdXNlZCAqLworc3VwcHJlc3MgNTkwIG9uIGlnbm9yZQorLyogRm9ybWFsIHBhcmFtIG5vdCB1c2VkICovCitzdXBwcmVzcyA1OTAgb24gaWdub3JlX2V4ZWNfYmZkCisvKiBGb3JtYWwgcGFyYW0gbm90IHVzZWQgKi8KK3N1cHByZXNzIDU5MCBvbiBpZ25vcmVfY29yZV9iZmQKKy8qIEZvcm1hbCBwYXJhbSBub3QgdXNlZCAqLworc3VwcHJlc3MgNTkwIG9uIGlnbm9yZV9pbnB1dF9zZWN0aW9uCisvKiBGb3JtYWwgcGFyYW0gbm90IHVzZWQgKi8KK3N1cHByZXNzIDU5MCBvbiBpZ25vcmVfbmV3c2VjdAorLyogRm9ybWFsIHBhcmFtIG5vdCB1c2VkICovCitzdXBwcmVzcyA1OTAgb24gaWdub3JlX2FiZmQKKy8qIEZvcm1hbCBwYXJhbSBub3QgdXNlZCAqLworc3VwcHJlc3MgNTkwIG9uIGlnbm9yZV9zeW1ib2wKKy8qIEZvcm1hbCBwYXJhbSBub3QgdXNlZCAqLworc3VwcHJlc3MgNTkwIG9uIGlnbm9yZV9zeW1ib2xzCisvKiBGb3JtYWwgcGFyYW0gbm90IHVzZWQgKi8KK3N1cHByZXNzIDU5MCBvbiBzaWdubworLyogRm9ybWFsIHBhcmFtIG5vdCB1c2VkICovCitzdXBwcmVzcyA2NTIKKy8qIFRoZSBkZWNsYXJhdGlvbiBoYXMgbm8gZWZmZWN0ICovCitzdXBwcmVzcyA0NDIgaW4gLi4vYmZkL2FyY2hpdmUuYworLyogRXNjYXBlIHNlcXVlbmNlIGluIHN0cmluZyBsaXRlcmFsIGhhcyBudWxsIHZhbHVlICovCisKKy8qIFNpZ25hbHMgY2F1Z2h0IGFuZCBpZ25vcmVkICovCitjYXRjaCBIVVAKK2NhdGNoIFFVSVQKK2NhdGNoIElMTAorY2F0Y2ggVFJBUAorY2F0Y2ggSU9UCitjYXRjaCBFTVQKK2NhdGNoIEZQRQorY2F0Y2ggS0lMTAorY2F0Y2ggQlVTCitjYXRjaCBTRUdWCitjYXRjaCBTWVMKK2NhdGNoIFBJUEUKK2NhdGNoIFRFUk0KK2NhdGNoIFVSRworY2F0Y2ggU1RPUAorY2F0Y2ggVFNUUAorY2F0Y2ggVFRJTgorY2F0Y2ggVFRPVQorY2F0Y2ggSU8KK2NhdGNoIFhDUFUKK2NhdGNoIFhGU1oKK2NhdGNoIFZUQUxSTQorY2F0Y2ggUFJPRgorY2F0Y2ggTE9TVAorY2F0Y2ggVVNSMQorY2F0Y2ggVVNSMgoraWdub3JlIElOVAoraWdub3JlIEFMUk0KK2lnbm9yZSBDT05UCitpZ25vcmUgQ0hMRAoraWdub3JlIFdJTkNICisKKy8qIFN0YXR1cyBvZiBwcm9qZWN0ICovCmRpZmYgLS1naXQgYS9nZGIvc2NtLWV4cC5jIGIvZ2RiL3NjbS1leHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzk5NTYzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3NjbS1leHAuYwpAQCAtMCwwICsxLDQyMyBAQAorLyogU2NoZW1lL0d1aWxlIGxhbmd1YWdlIHN1cHBvcnQgcm91dGluZXMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAicGFyc2VyLWRlZnMuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAiYy1sYW5nLmgiCisjaW5jbHVkZSAic2NtLWxhbmcuaCIKKyNpbmNsdWRlICJzY20tdGFncy5oIgorCisjZGVmaW5lIFVTRV9FWFBSU1RSSU5HIDAKKworc3RhdGljIHZvaWQgc2NtX2xyZWFkcGFyZW4gUEFSQU1TICgoaW50KSk7CitzdGF0aWMgaW50IHNjbV9za2lwX3dzIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHNjbV9yZWFkX3Rva2VuIFBBUkFNUyAoKGludCwgaW50KSk7CitzdGF0aWMgTE9OR0VTVCBzY21faXN0cmluZzJudW1iZXIgUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCkpOworc3RhdGljIExPTkdFU1Qgc2NtX2lzdHIyaW50IFBBUkFNUyAoKGNoYXIgKiwgaW50LCBpbnQpKTsKK3N0YXRpYyB2b2lkIHNjbV9scmVhZHIgUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyBMT05HRVNUCitzY21faXN0cjJpbnQoc3RyLCBsZW4sIHJhZGl4KQorICAgICBjaGFyICpzdHI7CisgICAgIGludCBsZW47CisgICAgIGludCByYWRpeDsKK3sKKyAgaW50IGkgPSAwOworICBMT05HRVNUIGludW0gPSAwOworICBpbnQgYzsKKyAgaW50IHNpZ24gPSAwOworCisgIGlmICgwID49IGxlbikgcmV0dXJuIFNDTV9CT09MX0Y7CS8qIHplcm8gc2NtX2xlbmd0aCAqLworICBzd2l0Y2ggKHN0clswXSkKKyAgICB7CQkvKiBsZWFkaW5nIHNpZ24gKi8KKyAgICBjYXNlICctJzoKKyAgICBjYXNlICcrJzoKKyAgICAgIHNpZ24gPSBzdHJbMF07CisgICAgICBpZiAoKytpPT1sZW4pCisJcmV0dXJuIFNDTV9CT09MX0Y7IC8qIGJhZCBpZiBsb25lIGArJyBvciBgLScgKi8KKyAgICB9CisgIGRvIHsKKyAgICBzd2l0Y2ggKGMgPSBzdHJbaSsrXSkgeworICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKyAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisgICAgICBjID0gYyAtICcwJzsKKyAgICAgIGdvdG8gYWNjdW11bGF0ZTsKKyAgICBjYXNlICdBJzogY2FzZSAnQic6IGNhc2UgJ0MnOiBjYXNlICdEJzogY2FzZSAnRSc6IGNhc2UgJ0YnOgorICAgICAgYyA9IGMtJ0EnKzEwOworICAgICAgZ290byBhY2N1bXVsYXRlOworICAgIGNhc2UgJ2EnOiBjYXNlICdiJzogY2FzZSAnYyc6IGNhc2UgJ2QnOiBjYXNlICdlJzogY2FzZSAnZic6CisgICAgICBjID0gYy0nYScrMTA7CisgICAgYWNjdW11bGF0ZToKKyAgICAgIGlmIChjID49IHJhZGl4KSByZXR1cm4gU0NNX0JPT0xfRjsgLyogYmFkIGRpZ2l0IGZvciByYWRpeCAqLworICAgICAgaW51bSAqPSByYWRpeDsKKyAgICAgIGludW0gKz0gYzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gU0NNX0JPT0xfRjsJCS8qIG5vdCBhIGRpZ2l0ICovCisgICAgfQorICB9IHdoaWxlIChpIDwgbGVuKTsKKyAgaWYgKHNpZ24gPT0gJy0nKQorICAgIGludW0gPSAtaW51bTsKKyAgcmV0dXJuIFNDTV9NQUtJTlVNIChpbnVtKTsKK30KKworc3RhdGljIExPTkdFU1QKK3NjbV9pc3RyaW5nMm51bWJlcihzdHIsIGxlbiwgcmFkaXgpCisgICAgIGNoYXIgKnN0cjsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IHJhZGl4OworeworICBpbnQgaSA9IDA7CisgIGNoYXIgZXggPSAwOworICBjaGFyIGV4X3AgPSAwLCByeF9wID0gMDsJLyogT25seSBhbGxvdyAxIGV4YWN0bmVzcyBhbmQgMSByYWRpeCBwcmVmaXggKi8KKyNpZiAwCisgIFNDTSByZXM7CisjZW5kaWYKKyAgaWYgKGxlbj09MSkKKyAgICBpZiAoKnN0cj09JysnIHx8ICpzdHI9PSctJykgLyogQ2F0Y2hlcyBsb25lIGArJyBhbmQgYC0nIGZvciBzcGVlZCAqLworICAgICAgcmV0dXJuIFNDTV9CT09MX0Y7CisKKyAgd2hpbGUgKChsZW4taSkgPj0gMiAgJiYgIHN0cltpXT09JyMnICYmICsraSkKKyAgICBzd2l0Y2ggKHN0cltpKytdKSB7CisgICAgY2FzZSAnYic6IGNhc2UgJ0InOiAgaWYgKHJ4X3ArKykgcmV0dXJuIFNDTV9CT09MX0Y7IHJhZGl4ID0gMjsgIGJyZWFrOworICAgIGNhc2UgJ28nOiBjYXNlICdPJzogIGlmIChyeF9wKyspIHJldHVybiBTQ01fQk9PTF9GOyByYWRpeCA9IDg7ICBicmVhazsKKyAgICBjYXNlICdkJzogY2FzZSAnRCc6ICBpZiAocnhfcCsrKSByZXR1cm4gU0NNX0JPT0xfRjsgcmFkaXggPSAxMDsgYnJlYWs7CisgICAgY2FzZSAneCc6IGNhc2UgJ1gnOiAgaWYgKHJ4X3ArKykgcmV0dXJuIFNDTV9CT09MX0Y7IHJhZGl4ID0gMTY7IGJyZWFrOworICAgIGNhc2UgJ2knOiBjYXNlICdJJzogIGlmIChleF9wKyspIHJldHVybiBTQ01fQk9PTF9GOyBleCA9IDI7ICAgICBicmVhazsKKyAgICBjYXNlICdlJzogY2FzZSAnRSc6ICBpZiAoZXhfcCsrKSByZXR1cm4gU0NNX0JPT0xfRjsgZXggPSAxOyAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogIHJldHVybiBTQ01fQk9PTF9GOworICAgIH0KKworICBzd2l0Y2ggKGV4KSB7CisgIGNhc2UgMToKKyAgICByZXR1cm4gc2NtX2lzdHIyaW50KCZzdHJbaV0sIGxlbi1pLCByYWRpeCk7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gc2NtX2lzdHIyaW50KCZzdHJbaV0sIGxlbi1pLCByYWRpeCk7CisjaWYgMAorICAgIGlmIE5GQUxTRVAocmVzKSByZXR1cm4gcmVzOworI2lmZGVmIEZMT0FUUworICBjYXNlIDI6IHJldHVybiBzY21faXN0cjJmbG8oJnN0cltpXSwgbGVuLWksIHJhZGl4KTsKKyNlbmRpZgorI2VuZGlmCisgIH0KKyAgcmV0dXJuIFNDTV9CT09MX0Y7Cit9CisKK3N0YXRpYyB2b2lkCitzY21fcmVhZF90b2tlbiAoYywgd2VpcmQpCisgICAgIGludCBjOworICAgICBpbnQgd2VpcmQ7Cit7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGMgPSAqbGV4cHRyKys7CisgICAgICBzd2l0Y2ggKGMpCisJeworCWNhc2UgJ1snOgorCWNhc2UgJ10nOgorCWNhc2UgJygnOgorCWNhc2UgJyknOgorCWNhc2UgJ1wiJzoKKwljYXNlICc7JzoKKwljYXNlICcgJzogIGNhc2UgJ1x0JzogIGNhc2UgJ1xyJzogIGNhc2UgJ1xmJzoKKwljYXNlICdcbic6CisJICBpZiAod2VpcmQpCisJICAgIGdvdG8gZGVmYXVsdF9jYXNlOworCWNhc2UgJ1wwJzogIC8qIEVuZCBvZiBsaW5lICovCisJZW9mX2Nhc2U6CisJICAtLWxleHB0cjsKKwkgIHJldHVybjsKKwljYXNlICdcXCc6CisJICBpZiAoIXdlaXJkKQorCSAgICBnb3RvIGRlZmF1bHRfY2FzZTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGMgPSAqbGV4cHRyKys7CisJICAgICAgaWYgKGMgPT0gJ1wwJykKKwkJZ290byBlb2ZfY2FzZTsKKwkgICAgICBlbHNlCisJCWdvdG8gZGVmYXVsdF9jYXNlOworCSAgICB9CisJY2FzZSAnfSc6CisJICBpZiAoIXdlaXJkKQorCSAgICBnb3RvIGRlZmF1bHRfY2FzZTsKKworCSAgYyA9ICpsZXhwdHIrKzsKKwkgIGlmIChjID09ICcjJykKKwkgICAgcmV0dXJuOworCSAgZWxzZQorCSAgICB7CisJICAgICAgLS1sZXhwdHI7CisJICAgICAgYyA9ICd9JzsKKwkgICAgICBnb3RvIGRlZmF1bHRfY2FzZTsKKwkgICAgfQorCisJZGVmYXVsdDoKKwlkZWZhdWx0X2Nhc2U6CisJICA7CisJfQorICAgIH0KK30KKworc3RhdGljIGludCAKK3NjbV9za2lwX3dzICgpCit7CisgIHJlZ2lzdGVyIGludCBjOworICB3aGlsZSAoMSkKKyAgICBzd2l0Y2ggKChjID0gKmxleHB0cisrKSkKKyAgICAgIHsKKyAgICAgIGNhc2UgJ1wwJzoKKyAgICAgIGdvdGVvZjoKKwlyZXR1cm4gYzsKKyAgICAgIGNhc2UgJzsnOgorICAgICAgbHA6CisJc3dpdGNoICgoYyA9ICpsZXhwdHIrKykpCisJICB7CisJICBjYXNlICdcMCc6CisJICAgIGdvdG8gZ290ZW9mOworCSAgZGVmYXVsdDoKKwkgICAgZ290byBscDsKKwkgIGNhc2UgJ1xuJzoKKwkgICAgYnJlYWs7CisJICB9CisgICAgICBjYXNlICcgJzogIGNhc2UgJ1x0JzogIGNhc2UgJ1xyJzogIGNhc2UgJ1xmJzogIGNhc2UgJ1xuJzoKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJcmV0dXJuIGM7CisgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzY21fbHJlYWRwYXJlbiAoc2tpcHBpbmcpCisgICAgIGludCBza2lwcGluZzsKK3sKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBpbnQgYyA9IHNjbV9za2lwX3dzICgpOworICAgICAgaWYgKCcpJyA9PSBjIHx8ICddJyA9PSBjKQorCXJldHVybjsKKyAgICAgIC0tbGV4cHRyOworICAgICAgaWYgKGMgPT0gJ1wwJykKKwllcnJvciAoIm1pc3NpbmcgY2xvc2UgcGFyZW4iKTsKKyAgICAgIHNjbV9scmVhZHIgKHNraXBwaW5nKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzY21fbHJlYWRyIChza2lwcGluZykKKyAgICAgaW50IHNraXBwaW5nOworeworICBpbnQgYywgajsKKyAgc3RydWN0IHN0b2tlbiBzdHI7CisgIExPTkdFU1Qgc3ZhbHVlID0gMDsKKyB0cnlhZ2FpbjoKKyAgYyA9ICpsZXhwdHIrKzsKKyAgc3dpdGNoIChjKQorICAgIHsKKyAgICBjYXNlICdcMCc6CisgICAgICBsZXhwdHItLTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlICdbJzoKKyAgICBjYXNlICcoJzoKKyAgICAgIHNjbV9scmVhZHBhcmVuIChza2lwcGluZyk7CisgICAgICByZXR1cm47CisgICAgY2FzZSAnXSc6CisgICAgY2FzZSAnKSc6CisgICAgICBlcnJvciAoInVuZXhwZWN0ZWQgI1xcJWMiLCBjKTsKKyAgICAgIGdvdG8gdHJ5YWdhaW47CisgICAgY2FzZSAnXCcnOgorICAgIGNhc2UgJ2AnOgorICAgICAgc3RyLnB0ciA9IGxleHB0ciAtIDE7CisgICAgICBzY21fbHJlYWRyIChza2lwcGluZyk7CisgICAgICBpZiAoIXNraXBwaW5nKQorCXsKKwkgIHZhbHVlX3B0ciB2YWwgPSBzY21fZXZhbHVhdGVfc3RyaW5nIChzdHIucHRyLCBsZXhwdHIgLSBzdHIucHRyKTsKKwkgIGlmICghaXNfc2NtdmFsdWVfdHlwZSAoVkFMVUVfVFlQRSAodmFsKSkpCisJICAgIGVycm9yICgicXVvdGVkIHNjbSBmb3JtIHlpZWxkcyBub24tU0NNIHZhbHVlIik7CisJICBzdmFsdWUgPSBleHRyYWN0X3NpZ25lZF9pbnRlZ2VyIChWQUxVRV9DT05URU5UUyAodmFsKSwKKwkJCQkJICAgVFlQRV9MRU5HVEggKFZBTFVFX1RZUEUgKHZhbCkpKTsKKwkgIGdvdG8gaGFuZGxlX2ltbWVkaWF0ZTsKKwl9CisgICAgICByZXR1cm47CisgICAgY2FzZSAnLCc6CisgICAgICBjID0gKmxleHB0cisrOworICAgICAgaWYgKCdAJyAhPSBjKQorCWxleHB0ci0tOworICAgICAgc2NtX2xyZWFkciAoc2tpcHBpbmcpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgJyMnOgorICAgICAgYyA9ICpsZXhwdHIrKzsKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAnWyc6CisJY2FzZSAnKCc6CisJICBzY21fbHJlYWRwYXJlbiAoc2tpcHBpbmcpOworCSAgcmV0dXJuOworCWNhc2UgJ3QnOiAgY2FzZSAnVCc6CisJICBzdmFsdWUgPSBTQ01fQk9PTF9UOworCSAgZ290byBoYW5kbGVfaW1tZWRpYXRlOworCWNhc2UgJ2YnOiAgY2FzZSAnRic6CisJICBzdmFsdWUgPSBTQ01fQk9PTF9GOworCSAgZ290byBoYW5kbGVfaW1tZWRpYXRlOworCWNhc2UgJ2InOiAgY2FzZSAnQic6CisJY2FzZSAnbyc6ICBjYXNlICdPJzoKKwljYXNlICdkJzogIGNhc2UgJ0QnOgorCWNhc2UgJ3gnOiAgY2FzZSAnWCc6CisJY2FzZSAnaSc6ICBjYXNlICdJJzoKKwljYXNlICdlJzogIGNhc2UgJ0UnOgorCSAgbGV4cHRyLS07CisJICBjID0gJyMnOworCSAgZ290byBudW07CisJY2FzZSAnKic6IC8qIGJpdHZlY3RvciAqLworCSAgc2NtX3JlYWRfdG9rZW4gKGMsIDApOworCSAgcmV0dXJuOworCWNhc2UgJ3snOgorCSAgc2NtX3JlYWRfdG9rZW4gKGMsIDEpOworCSAgcmV0dXJuOworCWNhc2UgJ1xcJzogLyogY2hhcmFjdGVyICovCisJICBjID0gKmxleHB0cisrOworCSAgc2NtX3JlYWRfdG9rZW4gKGMsIDApOworCSAgcmV0dXJuOworCWNhc2UgJ3wnOgorCSAgaiA9IDE7CQkvKiBoZXJlIGogaXMgdGhlIGNvbW1lbnQgbmVzdGluZyBkZXB0aCAqLworCWxwOgorCSAgYyA9ICpsZXhwdHIrKzsKKwlscGM6CisJICBzd2l0Y2ggKGMpCisJICAgIHsKKwkgICAgY2FzZSAnXDAnOgorCSAgICAgIGVycm9yICgidW5iYWxhbmNlZCBjb21tZW50Iik7CisJICAgIGRlZmF1bHQ6CisJICAgICAgZ290byBscDsKKwkgICAgY2FzZSAnfCc6CisJICAgICAgaWYgKCcjJyAhPSAoYyA9ICpsZXhwdHIrKykpCisJCWdvdG8gbHBjOworCSAgICAgIGlmICgtLWopCisJCWdvdG8gbHA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJyMnOgorCSAgICAgIGlmICgnfCcgIT0gKGMgPSAqbGV4cHRyKyspKQorCQlnb3RvIGxwYzsKKwkgICAgICArK2o7CisJICAgICAgZ290byBscDsKKwkgICAgfQorCSAgZ290byB0cnlhZ2FpbjsKKwljYXNlICcuJzoKKwlkZWZhdWx0OgorI2lmIDAKKwljYWxsc2hycDoKKyNlbmRpZgorCSAgc2NtX2xyZWFkciAoc2tpcHBpbmcpOworCSAgcmV0dXJuOworCX0KKyAgICBjYXNlICdcIic6CisgICAgICB3aGlsZSAoJ1wiJyAhPSAoYyA9ICpsZXhwdHIrKykpCisJeworCSAgaWYgKGMgPT0gJ1xcJykKKwkgICAgc3dpdGNoIChjID0gKmxleHB0cisrKQorCSAgICAgIHsKKwkgICAgICBjYXNlICdcMCc6CisJCWVycm9yICgibm9uLXRlcm1pbmF0ZWQgc3RyaW5nIGxpdGVyYWwiKTsKKwkgICAgICBjYXNlICdcbic6CisJCWNvbnRpbnVlOworCSAgICAgIGNhc2UgJzAnOgorCSAgICAgIGNhc2UgJ2YnOgorCSAgICAgIGNhc2UgJ24nOgorCSAgICAgIGNhc2UgJ3InOgorCSAgICAgIGNhc2UgJ3QnOgorCSAgICAgIGNhc2UgJ2EnOgorCSAgICAgIGNhc2UgJ3YnOgorCQlicmVhazsKKwkgICAgICB9CisJfQorICAgICAgcmV0dXJuOworICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKyAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisgICAgY2FzZSAnLic6CisgICAgY2FzZSAnLSc6CisgICAgY2FzZSAnKyc6CisgICAgbnVtOgorICAgICAgeworCXN0ci5wdHIgPSBsZXhwdHItMTsKKwlzY21fcmVhZF90b2tlbiAoYywgMCk7CisJaWYgKCFza2lwcGluZykKKwkgIHsKKwkgICAgc3ZhbHVlID0gc2NtX2lzdHJpbmcybnVtYmVyIChzdHIucHRyLCBsZXhwdHIgLSBzdHIucHRyLCAxMCk7CisJICAgIGlmIChzdmFsdWUgIT0gU0NNX0JPT0xfRikKKwkgICAgICBnb3RvIGhhbmRsZV9pbW1lZGlhdGU7CisJICAgIGdvdG8gdG9rOworCSAgfQorICAgICAgfQorICAgICAgcmV0dXJuOworICAgIGNhc2UgJzonOgorICAgICAgc2NtX3JlYWRfdG9rZW4gKCctJywgMCk7CisgICAgICByZXR1cm47CisjaWYgMAorICAgIGRvX3N5bWJvbDoKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBzdHIucHRyID0gbGV4cHRyLTE7CisgICAgICBzY21fcmVhZF90b2tlbiAoYywgMCk7CisgICAgdG9rOgorICAgICAgaWYgKCFza2lwcGluZykKKwl7CisJICBzdHIubGVuZ3RoID0gbGV4cHRyIC0gc3RyLnB0cjsKKwkgIGlmIChzdHIucHRyWzBdID09ICckJykKKwkgICAgeworCSAgICAgIHdyaXRlX2RvbGxhcl92YXJpYWJsZSAoc3RyKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9OQU1FKTsKKwkgIHdyaXRlX2V4cF9zdHJpbmcgKHN0cik7CisJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTkFNRSk7CisJfQorICAgICAgcmV0dXJuOworICAgIH0KKyBoYW5kbGVfaW1tZWRpYXRlOgorICBpZiAoIXNraXBwaW5nKQorICAgIHsKKyAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKKyAgICAgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX3NjbSk7CisgICAgICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKHN2YWx1ZSk7CisgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7CisgICAgfQorfQorCitpbnQKK3NjbV9wYXJzZSAoKQoreworICBjaGFyKiBzdGFydDsKKyAgd2hpbGUgKCpsZXhwdHIgPT0gJyAnKQorICAgIGxleHB0cisrOworICBzdGFydCA9IGxleHB0cjsKKyAgc2NtX2xyZWFkciAoVVNFX0VYUFJTVFJJTkcpOworI2lmIFVTRV9FWFBSU1RSSU5HCisgIHN0ci5sZW5ndGggPSBsZXhwdHIgLSBzdGFydDsKKyAgc3RyLnB0ciA9IHN0YXJ0OworICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRVhQUlNUUklORyk7CisgIHdyaXRlX2V4cF9zdHJpbmcgKHN0cik7CisgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9FWFBSU1RSSU5HKTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dkYi9zY20tbGFuZy5jIGIvZ2RiL3NjbS1sYW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzMWJhNAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9zY20tbGFuZy5jCkBAIC0wLDAgKzEsMjc0IEBACisvKiBTY2hlbWUvR3VpbGUgbGFuZ3VhZ2Ugc3VwcG9ydCByb3V0aW5lcyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJwYXJzZXItZGVmcy5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJjLWxhbmcuaCIKKyNpbmNsdWRlICJzY20tbGFuZy5oIgorI2luY2x1ZGUgInNjbS10YWdzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKworc3RhdGljIHZhbHVlX3B0ciBldmFsdWF0ZV9zdWJleHBfc2NtIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIHN0cnVjdCBleHByZXNzaW9uICosCisJCQkJCSAgICAgIGludCAqLCBlbnVtIG5vc2lkZSkpOworc3RhdGljIHZhbHVlX3B0ciBzY21fbG9va3VwX25hbWUgUEFSQU1TICgoY2hhciAqKSk7CitzdGF0aWMgaW50IGluX2V2YWxfYyBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBzY21fcHJpbnRzdHIgUEFSQU1TICgoR0RCX0ZJTEUgKnN0cmVhbSwgY2hhciAqc3RyaW5nLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLCBpbnQgd2lkdGgsIGludCBmb3JjZV9lbGxpcHNlcykpOworCitleHRlcm4gc3RydWN0IHR5cGUgKiogQ09OU1RfUFRSIChjX2J1aWx0aW5fdHlwZXNbXSk7CisKK3N0cnVjdCB0eXBlICpidWlsdGluX3R5cGVfc2NtOworCit2b2lkCitzY21fcHJpbnRjaGFyIChjLCBzdHJlYW0pCisgICAgIGludCBjOworICAgICBHREJfRklMRSAqc3RyZWFtOworeworICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIjXFwlYyIsIGMpOworfQorCitzdGF0aWMgdm9pZAorc2NtX3ByaW50c3RyIChzdHJlYW0sIHN0cmluZywgbGVuZ3RoLCB3aWR0aCwgZm9yY2VfZWxsaXBzZXMpCisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGNoYXIgKnN0cmluZzsKKyAgICAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyAgICAgaW50IHdpZHRoOworICAgICBpbnQgZm9yY2VfZWxsaXBzZXM7Cit7CisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlwiJXNcIiIsIHN0cmluZyk7Cit9CisKK2ludAoraXNfc2NtdmFsdWVfdHlwZSAodHlwZSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9JTlQKKyAgICAgICYmIFRZUEVfTkFNRSAodHlwZSkgJiYgc3RyY21wIChUWVBFX05BTUUgKHR5cGUpLCAiU0NNIikgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBHZXQgdGhlIElOREVYJ3RoIFNDTSB2YWx1ZSwgYXNzdW1pbmcgU1ZBTFVFIGlzIHRoZSBhZGRyZXNzCisgICBvZiB0aGUgMCd0aCBvbmUuICAqLworCitMT05HRVNUCitzY21fZ2V0X2ZpZWxkIChzdmFsdWUsIGluZGV4KQorICAgICBMT05HRVNUIHN2YWx1ZTsKKyAgICAgaW50IGluZGV4OworeworICBjaGFyIGJ1ZmZlclsyMF07CisgIHJlYWRfbWVtb3J5IChTQ00yUFRSIChzdmFsdWUpICsgaW5kZXggKiBUWVBFX0xFTkdUSCAoYnVpbHRpbl90eXBlX3NjbSksCisJICAgICAgIGJ1ZmZlciwgVFlQRV9MRU5HVEggKGJ1aWx0aW5fdHlwZV9zY20pKTsKKyAgcmV0dXJuIGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKGJ1ZmZlciwgVFlQRV9MRU5HVEggKGJ1aWx0aW5fdHlwZV9zY20pKTsKK30KKworLyogVW5wYWNrIGEgdmFsdWUgb2YgdHlwZSBUWVBFIGluIGJ1ZmZlciBWQUxBRERSIGFzIGFuIGludGVnZXIKKyAgIChpZiBDT05URVhUID09IFRZUEVfQ09ERV9JTiksIGEgcG9pbnRlciAoQ09OVEVYVCA9PSBUWVBFX0NPREVfUFRSKSwKKyAgIG9yIEJvb2xlYW4gKENPTlRFWFQgPT0gVFlQRV9DT0RFX0JPT0wpLiAgKi8KKworTE9OR0VTVAorc2NtX3VucGFjayAodHlwZSwgdmFsYWRkciwgY29udGV4dCkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGNoYXIgKnZhbGFkZHI7CisgICAgIGVudW0gdHlwZV9jb2RlIGNvbnRleHQ7Cit7CisgIGlmIChpc19zY212YWx1ZV90eXBlICh0eXBlKSkKKyAgICB7CisgICAgICBMT05HRVNUIHN2YWx1ZSA9IGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKHZhbGFkZHIsIFRZUEVfTEVOR1RIICh0eXBlKSk7CisgICAgICBpZiAoY29udGV4dCA9PSBUWVBFX0NPREVfQk9PTCkKKwl7CisJICBpZiAoc3ZhbHVlID09IFNDTV9CT09MX0YpCisJICAgIHJldHVybiAwOworCSAgZWxzZQorCSAgICByZXR1cm4gMTsKKwl9CisgICAgICBzd2l0Y2ggKDcgJiAoaW50KSBzdmFsdWUpCisJeworCWNhc2UgMjogIGNhc2UgNjogLyogZml4bnVtICovCisJICByZXR1cm4gc3ZhbHVlID4+IDI7CisJY2FzZSA0OiAvKiBvdGhlciBpbW1lZGlhdGUgdmFsdWUgKi8KKwkgIGlmIChTQ01fSUNIUlAgKHN2YWx1ZSkpIC8qIGNoYXJhY3RlciAqLworCSAgICByZXR1cm4gU0NNX0lDSFIgKHN2YWx1ZSk7CisJICBlbHNlIGlmIChTQ01fSUZMQUdQIChzdmFsdWUpKQorCSAgICB7CisJICAgICAgc3dpdGNoICgoaW50KSBzdmFsdWUpCisJCXsKKyNpZm5kZWYgU0lDUAorCQljYXNlIFNDTV9FT0w6CisjZW5kaWYKKwkJY2FzZSBTQ01fQk9PTF9GOgorCQkgIHJldHVybiAwOworCQljYXNlIFNDTV9CT09MX1Q6CisJCSAgcmV0dXJuIDE7CisJCX0KKwkgICAgfQorCSAgZXJyb3IgKCJWYWx1ZSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaW50ZWdlci4iKTsKKwlkZWZhdWx0OgorCSAgcmV0dXJuIHN2YWx1ZTsKKwl9CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIHVucGFja19sb25nICh0eXBlLCB2YWxhZGRyKTsKK30KKworLyogVHJ1ZSBpZiB3ZSdyZSBjb3JyZWN0bHkgaW4gR3VpbGUncyBldmFsLmMgKHRoZSBldmFsdWF0b3IgYW5kIGFwcGx5KS4gKi8KKworc3RhdGljIGludAoraW5fZXZhbF9jICgpCit7CisgIGlmIChjdXJyZW50X3NvdXJjZV9zeW10YWIgJiYgY3VycmVudF9zb3VyY2Vfc3ltdGFiLT5maWxlbmFtZSkKKyAgICB7CisgICAgICBjaGFyICpmaWxlbmFtZSA9IGN1cnJlbnRfc291cmNlX3N5bXRhYi0+ZmlsZW5hbWU7CisgICAgICBpbnQgbGVuID0gc3RybGVuIChmaWxlbmFtZSk7CisgICAgICBpZiAobGVuID49IDYgJiYgc3RyY21wIChmaWxlbmFtZSArIGxlbiAtIDYsICJldmFsLmMiKSA9PSAwKQorCXJldHVybiAxOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIExvb2t1cCBhIHZhbHVlIGZvciB0aGUgdmFyaWFibGUgbmFtZWQgU1RSLgorICAgRmlyc3QgbG9va3VwIGluIFNjaGVtZSBjb250ZXh0ICh1c2luZyB0aGUgc2NtX2xvb2t1cF9jc3RyIGluZmVyaW9yCisgICBmdW5jdGlvbiksIHRoZW4gdHJ5IGxvb2t1cF9zeW1ib2wgZm9yIGNvbXBpbGVkIHZhcmlhYmxlcy4gKi8KKworc3RhdGljIHZhbHVlX3B0cgorc2NtX2xvb2t1cF9uYW1lIChzdHIpCisgICAgIGNoYXIgKnN0cjsKK3sKKyAgdmFsdWVfcHRyIGFyZ3NbM107CisgIGludCBsZW4gPSBzdHJsZW4gKHN0cik7CisgIHZhbHVlX3B0ciBmdW5jLCB2YWw7CisgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgYXJnc1swXSA9IHZhbHVlX2FsbG9jYXRlX3NwYWNlX2luX2luZmVyaW9yIChsZW4pOworICBhcmdzWzFdID0gdmFsdWVfZnJvbV9sb25nZXN0IChidWlsdGluX3R5cGVfaW50LCBsZW4pOworICB3cml0ZV9tZW1vcnkgKHZhbHVlX2FzX2xvbmcgKGFyZ3NbMF0pLCBzdHIsIGxlbik7CisKKyAgaWYgKGluX2V2YWxfYyAoKQorICAgICAgJiYgKHN5bSA9IGxvb2t1cF9zeW1ib2wgKCJlbnYiLAorCQkJICAgICAgIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywKKwkJCSAgICAgICBWQVJfTkFNRVNQQUNFLCAoaW50ICopIE5VTEwsCisJCQkgICAgICAgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpKSAhPSBOVUxMKQorICAgIGFyZ3NbMl0gPSB2YWx1ZV9vZl92YXJpYWJsZSAoc3ltLCBleHByZXNzaW9uX2NvbnRleHRfYmxvY2spOworICBlbHNlCisgICAgLyogRklYTUUgaW4gdGhpcyBjYXNlLCB3ZSBzaG91bGQgdHJ5IGxvb2t1cF9zeW1ib2wgZmlyc3QgKi8KKyAgICBhcmdzWzJdID0gdmFsdWVfZnJvbV9sb25nZXN0IChidWlsdGluX3R5cGVfc2NtLCBTQ01fRU9MKTsKKworICBmdW5jID0gZmluZF9mdW5jdGlvbl9pbl9pbmZlcmlvciAoInNjbV9sb29rdXBfY3N0ciIpOworICB2YWwgPSBjYWxsX2Z1bmN0aW9uX2J5X2hhbmQgKGZ1bmMsIDMsIGFyZ3MpOworICBpZiAoIXZhbHVlX2xvZ2ljYWxfbm90ICh2YWwpKQorICAgIHJldHVybiB2YWx1ZV9pbmQgKHZhbCk7CisKKyAgc3ltID0gbG9va3VwX3N5bWJvbCAoc3RyLAorCQkgICAgICAgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrLAorCQkgICAgICAgVkFSX05BTUVTUEFDRSwgKGludCAqKSBOVUxMLAorCQkgICAgICAgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpOworICBpZiAoc3ltKQorICAgIHJldHVybiB2YWx1ZV9vZl92YXJpYWJsZSAoc3ltLCBOVUxMKTsKKyAgZXJyb3IgKCJObyBzeW1ib2wgXCIlc1wiIGluIGN1cnJlbnQgY29udGV4dC4iKTsKK30KKwordmFsdWVfcHRyCitzY21fZXZhbHVhdGVfc3RyaW5nIChzdHIsIGxlbikKKyAgICAgY2hhciAqc3RyOyBpbnQgbGVuOworeworICB2YWx1ZV9wdHIgZnVuYzsKKyAgdmFsdWVfcHRyIGFkZHIgPSB2YWx1ZV9hbGxvY2F0ZV9zcGFjZV9pbl9pbmZlcmlvciAobGVuICsgMSk7CisgIExPTkdFU1QgaWFkZHIgPSB2YWx1ZV9hc19sb25nIChhZGRyKTsKKyAgd3JpdGVfbWVtb3J5IChpYWRkciwgc3RyLCBsZW4pOworICAvKiBGSVhNRSAtIHNob3VsZCBmaW5kIGFuZCBwYXNzIGVudiAqLworICB3cml0ZV9tZW1vcnkgKGlhZGRyICsgbGVuLCAiIiwgMSk7CisgIGZ1bmMgPSBmaW5kX2Z1bmN0aW9uX2luX2luZmVyaW9yICgic2NtX2V2c3RyIik7CisgIHJldHVybiBjYWxsX2Z1bmN0aW9uX2J5X2hhbmQgKGZ1bmMsIDEsICZhZGRyKTsKK30KKworc3RhdGljIHZhbHVlX3B0cgorZXZhbHVhdGVfc3ViZXhwX3NjbSAoZXhwZWN0X3R5cGUsIGV4cCwgcG9zLCBub3NpZGUpCisgICAgIHN0cnVjdCB0eXBlICpleHBlY3RfdHlwZTsKKyAgICAgcmVnaXN0ZXIgc3RydWN0IGV4cHJlc3Npb24gKmV4cDsKKyAgICAgcmVnaXN0ZXIgaW50ICpwb3M7CisgICAgIGVudW0gbm9zaWRlIG5vc2lkZTsKK3sKKyAgZW51bSBleHBfb3Bjb2RlIG9wID0gZXhwLT5lbHRzWypwb3NdLm9wY29kZTsKKyAgaW50IGxlbiwgcGM7ICBjaGFyICpzdHI7CisgIHN3aXRjaCAob3ApCisgICAgeworICAgIGNhc2UgT1BfTkFNRToKKyAgICAgIHBjID0gKCpwb3MpKys7CisgICAgICBsZW4gPSBsb25nZXN0X3RvX2ludCAoZXhwLT5lbHRzW3BjICsgMV0ubG9uZ2NvbnN0KTsKKyAgICAgICgqcG9zKSArPSAzICsgQllURVNfVE9fRVhQX0VMRU0gKGxlbiArIDEpOworICAgICAgaWYgKG5vc2lkZSA9PSBFVkFMX1NLSVApCisJZ290byBub3NpZGVyZXQ7CisgICAgICBzdHIgPSAmZXhwLT5lbHRzW3BjICsgMl0uc3RyaW5nOworICAgICAgcmV0dXJuIHNjbV9sb29rdXBfbmFtZSAoc3RyKTsKKyAgICBjYXNlIE9QX0VYUFJTVFJJTkc6CisgICAgICBwYyA9ICgqcG9zKSsrOworICAgICAgbGVuID0gbG9uZ2VzdF90b19pbnQgKGV4cC0+ZWx0c1twYyArIDFdLmxvbmdjb25zdCk7CisgICAgICAoKnBvcykgKz0gMyArIEJZVEVTX1RPX0VYUF9FTEVNIChsZW4gKyAxKTsKKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9TS0lQKQorCWdvdG8gbm9zaWRlcmV0OworICAgICAgc3RyID0gJmV4cC0+ZWx0c1twYyArIDJdLnN0cmluZzsKKyAgICAgIHJldHVybiBzY21fZXZhbHVhdGVfc3RyaW5nIChzdHIsIGxlbik7CisgICAgZGVmYXVsdDogOworICAgIH0KKyAgcmV0dXJuIGV2YWx1YXRlX3N1YmV4cF9zdGFuZGFyZCAoZXhwZWN0X3R5cGUsIGV4cCwgcG9zLCBub3NpZGUpOworIG5vc2lkZXJldDoKKyAgcmV0dXJuIHZhbHVlX2Zyb21fbG9uZ2VzdCAoYnVpbHRpbl90eXBlX2xvbmcsIChMT05HRVNUKSAxKTsKK30KKworY29uc3Qgc3RydWN0IGxhbmd1YWdlX2RlZm4gc2NtX2xhbmd1YWdlX2RlZm4gPSB7CisgICJzY2hlbWUiLAkJCS8qIExhbmd1YWdlIG5hbWUgKi8KKyAgbGFuZ3VhZ2Vfc2NtLAorICBjX2J1aWx0aW5fdHlwZXMsCisgIHJhbmdlX2NoZWNrX29mZiwKKyAgdHlwZV9jaGVja19vZmYsCisgIHNjbV9wYXJzZSwKKyAgY19lcnJvciwKKyAgZXZhbHVhdGVfc3ViZXhwX3NjbSwKKyAgc2NtX3ByaW50Y2hhciwJCS8qIFByaW50IGEgY2hhcmFjdGVyIGNvbnN0YW50ICovCisgIHNjbV9wcmludHN0ciwJCQkvKiBGdW5jdGlvbiB0byBwcmludCBzdHJpbmcgY29uc3RhbnQgKi8KKyAgTlVMTCwJCQkJLyogRnVuY3Rpb24gdG8gcHJpbnQgYSBzaW5nbGUgY2hhcmFjdGVyICovCisgIE5VTEwsCQkJCS8qIENyZWF0ZSBmdW5kYW1lbnRhbCB0eXBlIGluIHRoaXMgbGFuZ3VhZ2UgKi8KKyAgY19wcmludF90eXBlLAkJCS8qIFByaW50IGEgdHlwZSB1c2luZyBhcHByb3ByaWF0ZSBzeW50YXggKi8KKyAgc2NtX3ZhbF9wcmludCwJCS8qIFByaW50IGEgdmFsdWUgdXNpbmcgYXBwcm9wcmlhdGUgc3ludGF4ICovCisgIHNjbV92YWx1ZV9wcmludCwJCS8qIFByaW50IGEgdG9wLWxldmVsIHZhbHVlICovCisgIHsiIiwgICAgICIiLCAgICAiIiwgICIifSwJLyogQmluYXJ5IGZvcm1hdCBpbmZvICovCisgIHsiI28lbG8iLCAgIiNvIiwgICAibyIsICIifSwJLyogT2N0YWwgZm9ybWF0IGluZm8gKi8KKyAgeyIlbGQiLCAgICIiLCAgICAiZCIsICIifSwJLyogRGVjaW1hbCBmb3JtYXQgaW5mbyAqLworICB7IiN4JWxYIiwgIiNYIiwgICJYIiwgIiJ9LAkvKiBIZXggZm9ybWF0IGluZm8gKi8KKyAgTlVMTCwJCQkJLyogZXhwcmVzc2lvbiBvcGVyYXRvcnMgZm9yIHByaW50aW5nICovCisgIDEsCQkJCS8qIGMtc3R5bGUgYXJyYXlzICovCisgIDAsCQkJCS8qIFN0cmluZyBsb3dlciBib3VuZCAqLworICAmYnVpbHRpbl90eXBlX2NoYXIsCQkvKiBUeXBlIG9mIHN0cmluZyBlbGVtZW50cyAqLyAKKyAgTEFOR19NQUdJQworfTsKKwordm9pZAorX2luaXRpYWxpemVfc2NoZW1lX2xhbmd1YWdlICgpCit7CisgIGFkZF9sYW5ndWFnZSAoJnNjbV9sYW5ndWFnZV9kZWZuKTsKKyAgYnVpbHRpbl90eXBlX3NjbSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwKKwkJCQlUQVJHRVRfTE9OR19CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkJMCwgIlNDTSIsIChzdHJ1Y3Qgb2JqZmlsZSAqKSBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9zY20tbGFuZy5oIGIvZ2RiL3NjbS1sYW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4YTJhYgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9zY20tbGFuZy5oCkBAIC0wLDAgKzEsNTAgQEAKKyNkZWZpbmUgU0lDUAorI2luY2x1ZGUgInNjbS10YWdzLmgiCisjdW5kZWYgU0NNX05DRUxMUAorI2RlZmluZSBTQ01fTkNFTExQKHgpIAkoKFNDTV9TSVpFLTEpICYgKGludCkoeCkpCisjZGVmaW5lIFNDTV9JVEFHOF9EQVRBKFgpCSgoWCk+PjgpCisjZGVmaW5lIFNDTV9JQ0hSKHgpCSgodW5zaWduZWQgY2hhcilTQ01fSVRBRzhfREFUQSh4KSkKKyNkZWZpbmUgU0NNX0lDSFJQKHgpICAgIChTQ01fSVRBRzgoeCkgPT0gc2NtX3RjOF9jaGFyKQorI2RlZmluZSBzY21fdGM4X2NoYXIgMHhmNAorI2RlZmluZSBTQ01fSUZMQUdQKG4pICAgICAgICAgICAgKCgweDg3ICYgKGludCkobikpPT00KQorI2RlZmluZSBTQ01fSVNZTU5VTShuKSAgICAgICAgICAgKChpbnQpKChuKT4+OSkpCisjZGVmaW5lIFNDTV9JU1lNQ0hBUlMobikgICAgICAgICAoc2NtX2lzeW1uYW1lc1tTQ01fSVNZTU5VTShuKV0pCisjZGVmaW5lIFNDTV9JTE9DUChuKSAgICAgICAgICAgICAoKDB4ZmYgJiAoaW50KShuKSk9PTB4ZmMpCisjZGVmaW5lIFNDTV9JVEFHOChYKSAgICAgICAgICAgICAoKGludCkoWCkgJiAweGZmKQorI2RlZmluZSBTQ01fVFlQNyh4KSAgICAgICAgICAgICAgKDB4N2YgJiAoaW50KVNDTV9DQVIoeCkpCisjZGVmaW5lIFNDTV9MRU5HVEgoeCkgKCgodW5zaWduZWQgbG9uZylTQ01fQ0FSKHgpKT4+OCkKKyNkZWZpbmUgU0NNX05DT05TUCh4KSAoMSAmIChpbnQpU0NNX0NBUih4KSkKKyNkZWZpbmUgU0NNX05FQ09OU1AoeCkgKFNDTV9OQ09OU1AoeCkgJiYgKDEgIT0gU0NNX1RZUDMoeCkpKQorI2RlZmluZSBTQ01fQ0FSKHgpIHNjbV9nZXRfZmllbGQgKHgsIDApCisjZGVmaW5lIFNDTV9DRFIoeCkgc2NtX2dldF9maWVsZCAoeCwgMSkKKyNkZWZpbmUgU0NNX1ZFTFRTKHgpICgoU0NNICopU0NNX0NEUih4KSkKKyNkZWZpbmUgU0NNX0NMT1NDQVIoeCkgKFNDTV9DQVIoeCktc2NtX3RjM19jbG9zdXJlKQorI2RlZmluZSBTQ01fQ09ERSh4KSBTQ01fQ0FSKFNDTV9DTE9TQ0FSICh4KSkKKyNkZWZpbmUgU0NNX01BS0lOVU0oeCkgKCgoeCk8PDIpKzJMKQorCisjaWZkZWYgX19TVERDX18JCS8qIEZvcndhcmQgZGVjbHMgZm9yIHByb3RvdHlwZXMgKi8KK3N0cnVjdCB2YWx1ZTsKKyNlbmRpZgorCitleHRlcm4gaW50IHNjbV92YWx1ZV9wcmludCBQQVJBTVMgKChzdHJ1Y3QgdmFsdWUgKiwgR0RCX0ZJTEUqLAorCQkJCSAgICBpbnQsIGVudW0gdmFsX3ByZXR0eXByaW50KSk7CisKK2V4dGVybiBpbnQgc2NtX3ZhbF9wcmludCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSosIGNoYXIqLCBpbnQsIENPUkVfQUREUiwgR0RCX0ZJTEUqLAorCQkJCSBpbnQsIGludCwgaW50LCBlbnVtIHZhbF9wcmV0dHlwcmludCkpOworCitleHRlcm4gTE9OR0VTVCBzY21fZ2V0X2ZpZWxkIFBBUkFNUyAoKExPTkdFU1QsIGludCkpOworCitleHRlcm4gdm9pZCBzY21fc2NtdmFsX3ByaW50IFBBUkFNUyAoKExPTkdFU1QsIEdEQl9GSUxFICosCisJCQkJICAgICBpbnQsIGludCwgaW50LCBlbnVtIHZhbF9wcmV0dHlwcmludCkpOworCitleHRlcm4gaW50IGlzX3NjbXZhbHVlX3R5cGUgUEFSQU1TICgoc3RydWN0IHR5cGUqKSk7CisKK2V4dGVybiB2b2lkIHNjbV9wcmludGNoYXIgUEFSQU1TICgoaW50LCBHREJfRklMRSopKTsKKworZXh0ZXJuIHN0cnVjdCB2YWx1ZSAqIHNjbV9ldmFsdWF0ZV9zdHJpbmcgUEFSQU1TICgoY2hhciosIGludCkpOworCitleHRlcm4gc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9zY207CisKK2V4dGVybiBpbnQgc2NtX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIExPTkdFU1Qgc2NtX3VucGFjayBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBjaGFyICosIGVudW0gdHlwZV9jb2RlKSk7CmRpZmYgLS1naXQgYS9nZGIvc2NtLXRhZ3MuaCBiL2dkYi9zY20tdGFncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZTQ1Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvc2NtLXRhZ3MuaApAQCAtMCwwICsxLDM4NSBAQAorLyogVGhpcyBpcyBhIG1pbmltYWxseSBlZGl0ZWQgdmVyc2lvbiBvZiBHdWlsZSdzIHRhZ3MuaC4gKi8KKy8qIGNsYXNzZXM6IGhfZmlsZXMgKi8KKworI2lmbmRlZiBUQUdTSAorI2RlZmluZSBUQUdTSAorLyoJQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcyBwZXJtaXNzaW9uCisgKiBmb3IgYWRkaXRpb25hbCB1c2VzIG9mIHRoZSB0ZXh0IGNvbnRhaW5lZCBpbiBpdHMgcmVsZWFzZSBvZiBHVUlMRS4KKyAqCisgKiBUaGUgZXhjZXB0aW9uIGlzIHRoYXQsIGlmIHlvdSBsaW5rIHRoZSBHVUlMRSBsaWJyYXJ5IHdpdGggb3RoZXIgZmlsZXMKKyAqIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcyBkb2VzIG5vdCBieSBpdHNlbGYgY2F1c2UgdGhlCisgKiByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqIFlvdXIgdXNlIG9mIHRoYXQgZXhlY3V0YWJsZSBpcyBpbiBubyB3YXkgcmVzdHJpY3RlZCBvbiBhY2NvdW50IG9mCisgKiBsaW5raW5nIHRoZSBHVUlMRSBsaWJyYXJ5IGNvZGUgaW50byBpdC4KKyAqCisgKiBUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBob3dldmVyIGludmFsaWRhdGUgYW55IG90aGVyIHJlYXNvbnMgd2h5CisgKiB0aGUgZXhlY3V0YWJsZSBmaWxlIG1pZ2h0IGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIFRoaXMgZXhjZXB0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY29kZSByZWxlYXNlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgbmFtZSBHVUlMRS4gIElmIHlvdSBjb3B5CisgKiBjb2RlIGZyb20gb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHJlbGVhc2VzIGludG8gYSBjb3B5IG9mCisgKiBHVUlMRSwgYXMgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgcGVybWl0cywgdGhlIGV4Y2VwdGlvbiBkb2VzCisgKiBub3QgYXBwbHkgdG8gdGhlIGNvZGUgdGhhdCB5b3UgYWRkIGluIHRoaXMgd2F5LiAgVG8gYXZvaWQgbWlzbGVhZGluZworICogYW55b25lIGFzIHRvIHRoZSBzdGF0dXMgb2Ygc3VjaCBtb2RpZmllZCBmaWxlcywgeW91IG11c3QgZGVsZXRlCisgKiB0aGlzIGV4Y2VwdGlvbiBub3RpY2UgZnJvbSB0aGVtLgorICoKKyAqIElmIHlvdSB3cml0ZSBtb2RpZmljYXRpb25zIG9mIHlvdXIgb3duIGZvciBHVUlMRSwgaXQgaXMgeW91ciBjaG9pY2UKKyAqIHdoZXRoZXIgdG8gcGVybWl0IHRoaXMgZXhjZXB0aW9uIHRvIGFwcGx5IHRvIHlvdXIgbW9kaWZpY2F0aW9ucy4KKyAqIElmIHlvdSBkbyBub3Qgd2lzaCB0aGF0LCBkZWxldGUgdGhpcyBleGNlcHRpb24gbm90aWNlLiAgCisgKi8KKwwKKworLyoqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBmb3JtYXQgb2YgU0NNIHZhbHVlcyBhbmQgY29ucyBwYWlycy4gIAorICoqIEl0IGlzIGhlcmUgdGhhdCB0YWcgYml0cyBhcmUgYXNzaWduZWQgZm9yIHZhcmlvdXMgcHVycG9zZXMuCisgKiovCisKKwwKKy8qIFRocmVlIEJpdCBUYWdzCisgKgorICogMDAwIC0tIGEgbm9uLWltbWVkaWF0ZSB2YWx1ZS4gIFBvaW50cyBpbnRvIHRoZSBwYWlyIGhlYXAuICAKKyAqCisgKiAwMDEgLS0gYSBnbG9jIChpLmUuLCBhIHJlc29sdmVkIGdsb2JhbCB2YXJpYWJsZSBpbiBhIENBUiBpbiBhIGNvZGUgZ3JhcGgpCisgKgkgIG9yIHRoZSBDQVIgb2YgYW4gb2JqZWN0IGhhbmRsZSAoaS5lLiwgdGhlIHRhZ2dlZCBwb2ludGVyIHRvIHRoZQorICoJICB2dGFibGUgcGFydCBvZiBhIHVzZXItZGVmaW5lZCBvYmplY3QpLgorICoKKyAqICAgICAgICBJZiBYIGhhcyB0aGlzIHRhZywgdGhlIHZhbHVlIGF0IENEQVIoWCAtIDEpIGRpc3Rpbmd1aXNoZXMKKyAqCSAgZ2xvY3MgZnJvbSBvYmplY3QgaGFuZGxlcy4gIFRoZSBkaXN0aW5jdGlvbiBvbmx5IG5lZWRzCisgKgkgIHRvIGJlIG1hZGUgaW4gYSBmZXcgcGxhY2VzLiAgT25seSBhIGZldyBwYXJ0cyBvZiB0aGUgY29kZSBrbm93CisgKgkgIGFib3V0IGdsb2NzLiAgSW4gbW9zdCBjYXNlcywgd2hlbiBhIHZhbHVlIGluIHRoZSBDQVIgb2YgYSBwYWlyCisgKgkgIGhhcyB0aGUgdGFnIDAwMSwgaXQgbWVhbnMgdGhhdCB0aGUgcGFpciBpcyBhbiBvYmplY3QgaGFuZGxlLgorICoKKyAqIDAxMCAtLSB0aGUgdGFnIGZvciBpbW1lZGlhdGUsIGV4YWN0IGludGVnZXJzLiAKKyAqCisgKiAwMTEgLS0gaW4gdGhlIENBUiBvZiBhIHBhaXIsIHRoaXMgdGFnIGluZGljYXRlcyB0aGF0IHRoZSBwYWlyIGlzIGEgY2xvc3VyZS4KKyAqCSAgVGhlIHJlbWFpbmluZyBiaXRzIG9mIHRoZSBDQVIgYXJlIGEgcG9pbnRlciBpbnRvIHRoZSBwYWlyIGhlYXAKKyAqIAkgIHRvIHRoZSBjb2RlIGdyYXBoIGZvciB0aGUgY2xvc3VyZS4KKyAqCisgKiAxeHkgLS0gYW4gZXh0ZW5zaW9uIHRhZyB3aGljaCBtZWFucyB0aGF0IHRoZXJlIGlzIGEgZml2ZSBvciBzaXggYml0CisgKgkgIHRhZyB0byB0aGUgbGVmdCBvZiB0aGUgbG93IHRocmVlIGJpdHMuICBTZWUgdGhlIG5pY2UgZGlhZ3JhbXMKKyAqCSAgaW4gLi4vZG9jL2NvZGUuZG9jIGlmIHlvdSB3YW50IHRvIGtub3cgd2hhdCB0aGUgYml0cyBtZWFuLgorICovCisKKwwKKworCisKKyNkZWZpbmUgc2NtX3RjM19jb25zCQkwCisjZGVmaW5lIHNjbV90YzNfY29uc19nbG9jCTEKKyNkZWZpbmUgc2NtX3RjM19jbG9zdXJlCQkzCisKKyNkZWZpbmUgc2NtX3RjN19zc3ltYm9sCQk1CisjZGVmaW5lIHNjbV90YzdfbXN5bWJvbAkJNworI2RlZmluZSBzY21fdGM3X3N0cmluZwkJMTMKKyNkZWZpbmUgc2NtX3RjN19idmVjdAkJMTUKKyNkZWZpbmUgc2NtX3RjN192ZWN0b3IJCTIxCisjZGVmaW5lIHNjbV90YzdfbHZlY3RvcgkJMjMKKyNkZWZpbmUgc2NtX3RjN19pdmVjdAkJMjkKKyNkZWZpbmUgc2NtX3RjN191dmVjdAkJMzEKKy8qIHNwYXJlIDM3IDM5ICovCisjZGVmaW5lIHNjbV90YzdfZnZlY3QJCTQ1CisjZGVmaW5lIHNjbV90YzdfZHZlY3QJCTQ3CisjZGVmaW5lIHNjbV90YzdfY3ZlY3QJCTUzCisjZGVmaW5lIHNjbV90YzdfcG9ydAkJNTUKKyNkZWZpbmUgc2NtX3RjN19jb250aW4JCTYxCisjZGVmaW5lIHNjbV90YzdfY2NsbwkJNjMKKy8qIHNwYXJlIDY5IDcxIDc3IDc5ICovCisjZGVmaW5lIHNjbV90Yzdfc3Vicl8wCQk4NQorI2RlZmluZSBzY21fdGM3X3N1YnJfMQkJODcKKyNkZWZpbmUgc2NtX3RjN19jeHIJCTkzCisjZGVmaW5lIHNjbV90Yzdfc3Vicl8zCQk5NQorI2RlZmluZSBzY21fdGM3X3N1YnJfMgkJMTAxCisjZGVmaW5lIHNjbV90YzdfYXN1YnIJCTEwMworI2RlZmluZSBzY21fdGM3X3N1YnJfMW8JCTEwOQorI2RlZmluZSBzY21fdGM3X3N1YnJfMm8JCTExMQorI2RlZmluZSBzY21fdGM3X2xzdWJyXzIJCTExNworI2RlZmluZSBzY21fdGM3X2xzdWJyCQkxMTkKKyNkZWZpbmUgc2NtX3RjN19ycHN1YnIJCTEyNQorCisjZGVmaW5lIHNjbV90Yzdfc21vYgkJMTI3CisjZGVmaW5lIHNjbV90Y19mcmVlX2NlbGwJMTI3CisKKyNkZWZpbmUgc2NtX3RjMTZfZmxvCQkweDAxN2YKKyNkZWZpbmUgc2NtX3RjX2ZsbwkJMHgwMTdmTAorCisjZGVmaW5lIFNDTV9SRUFMX1BBUlQJCSgxTDw8MTYpCisjZGVmaW5lIFNDTV9JTUFHX1BBUlQJCSgyTDw8MTYpCisjZGVmaW5lIHNjbV90Y19kYmxyCQkoc2NtX3RjMTZfZmxvfFJFQUxfUEFSVCkKKyNkZWZpbmUgc2NtX3RjX2RibGMJCShzY21fdGMxNl9mbG98UkVBTF9QQVJUfElNQUdfUEFSVCkKKworI2RlZmluZSBzY21fdGMxNl9iaWdwb3MJCTB4MDI3ZgorI2RlZmluZSBzY21fdGMxNl9iaWduZWcJCTB4MDM3ZgorCisjZGVmaW5lIHNjbV90YzE2X2Zwb3J0IAkJKHNjbV90YzdfcG9ydCArIDAqMjU2TCkKKyNkZWZpbmUgc2NtX3RjMTZfcGlwZSAJCShzY21fdGM3X3BvcnQgKyAxKjI1NkwpCisjZGVmaW5lIHNjbV90YzE2X3N0cnBvcnQJKHNjbV90YzdfcG9ydCArIDIqMjU2TCkKKyNkZWZpbmUgc2NtX3RjMTZfc2Zwb3J0IAkoc2NtX3RjN19wb3J0ICsgMyoyNTZMKQorCisKKworLyogRm9yIGNvbnMgcGFpcnMgd2l0aCBpbW1lZGlhdGUgdmFsdWVzIGluIHRoZSBDQVIgKi8KKyNkZWZpbmUgc2NtX3Rjc19jb25zX2ltY2FyIDI6Y2FzZSA0OmNhc2UgNjpjYXNlIDEwOlwKKyBjYXNlIDEyOmNhc2UgMTQ6Y2FzZSAxODpjYXNlIDIwOlwKKyBjYXNlIDIyOmNhc2UgMjY6Y2FzZSAyODpjYXNlIDMwOlwKKyBjYXNlIDM0OmNhc2UgMzY6Y2FzZSAzODpjYXNlIDQyOlwKKyBjYXNlIDQ0OmNhc2UgNDY6Y2FzZSA1MDpjYXNlIDUyOlwKKyBjYXNlIDU0OmNhc2UgNTg6Y2FzZSA2MDpjYXNlIDYyOlwKKyBjYXNlIDY2OmNhc2UgNjg6Y2FzZSA3MDpjYXNlIDc0OlwKKyBjYXNlIDc2OmNhc2UgNzg6Y2FzZSA4MjpjYXNlIDg0OlwKKyBjYXNlIDg2OmNhc2UgOTA6Y2FzZSA5MjpjYXNlIDk0OlwKKyBjYXNlIDk4OmNhc2UgMTAwOmNhc2UgMTAyOmNhc2UgMTA2OlwKKyBjYXNlIDEwODpjYXNlIDExMDpjYXNlIDExNDpjYXNlIDExNjpcCisgY2FzZSAxMTg6Y2FzZSAxMjI6Y2FzZSAxMjQ6Y2FzZSAxMjYKKworLyogRm9yIGNvbnMgcGFpcnMgd2l0aCBub24taW1tZWRpYXRlIHZhbHVlcyBpbiB0aGUgQ0FSICovCisjZGVmaW5lIHNjbV90Y3NfY29uc19uaW1jYXIgMDpjYXNlIDg6Y2FzZSAxNjpjYXNlIDI0OlwKKyBjYXNlIDMyOmNhc2UgNDA6Y2FzZSA0ODpjYXNlIDU2OlwKKyBjYXNlIDY0OmNhc2UgNzI6Y2FzZSA4MDpjYXNlIDg4OlwKKyBjYXNlIDk2OmNhc2UgMTA0OmNhc2UgMTEyOmNhc2UgMTIwCisKKy8qIEEgQ09OU19HTE9DIG9jY3VycyBpbiBjb2RlLiAgSXQncyBDQVIgaXMgYSBwb2ludGVyIHRvIHRoZQorICogQ0RSIG9mIGEgdmFyaWFibGUuICBUaGUgbG93IG9yZGVyIGJpdHMgb2YgdGhlIENBUiBhcmUgMDAxLgorICogVGhlIENEUiBvZiB0aGUgZ2xvYyBpcyB0aGUgY29kZSBjb250aW51YXRpb24uCisgKi8KKyNkZWZpbmUgc2NtX3Rjc19jb25zX2dsb2MgMTpjYXNlIDk6Y2FzZSAxNzpjYXNlIDI1OlwKKyBjYXNlIDMzOmNhc2UgNDE6Y2FzZSA0OTpjYXNlIDU3OlwKKyBjYXNlIDY1OmNhc2UgNzM6Y2FzZSA4MTpjYXNlIDg5OlwKKyBjYXNlIDk3OmNhc2UgMTA1OmNhc2UgMTEzOmNhc2UgMTIxCisKKyNkZWZpbmUgc2NtX3Rjc19jbG9zdXJlcyAgIDM6Y2FzZSAxMTpjYXNlIDE5OmNhc2UgMjc6XAorIGNhc2UgMzU6Y2FzZSA0MzpjYXNlIDUxOmNhc2UgNTk6XAorIGNhc2UgNjc6Y2FzZSA3NTpjYXNlIDgzOmNhc2UgOTE6XAorIGNhc2UgOTk6Y2FzZSAxMDc6Y2FzZSAxMTU6Y2FzZSAxMjMKKworI2RlZmluZSBzY21fdGNzX3N1YnJzIHNjbV90YzdfYXN1YnI6Y2FzZSBzY21fdGM3X3N1YnJfMDpjYXNlIHNjbV90Yzdfc3Vicl8xOmNhc2Ugc2NtX3RjN19jeHI6XAorIGNhc2Ugc2NtX3RjN19zdWJyXzM6Y2FzZSBzY21fdGM3X3N1YnJfMjpjYXNlIHNjbV90YzdfcnBzdWJyOmNhc2Ugc2NtX3RjN19zdWJyXzFvOlwKKyBjYXNlIHNjbV90Yzdfc3Vicl8ybzpjYXNlIHNjbV90YzdfbHN1YnJfMjpjYXNlIHNjbV90YzdfbHN1YnIKKworI2RlZmluZSBzY21fdGNzX3N5bWJvbHMgc2NtX3RjN19zc3ltYm9sOmNhc2Ugc2NtX3RjN19tc3ltYm9sCisKKyNkZWZpbmUgc2NtX3Rjc19iaWdudW1zIHRjMTZfYmlncG9zOmNhc2UgdGMxNl9iaWduZWcKKworDAorCisvKiBSZWZlcmVuY2VzIHRvIG9iamVjdHMgYXJlIG9mIHR5cGUgU0NNLiAgVmFsdWVzIG1heSBiZSBub24taW1tZWRpYXRlCisgKiAocG9pbnRlcnMpIG9yIGltbWVkaWF0ZSAoZW5jb2RlZCwgaW1tdXRhYmxlLCBzY2FsYXIgdmFsdWVzIHRoYXQgZml0CisgKiBpbiBhbiBTQ00gdmFyaWFibGUpLgorICovCisKK3R5cGVkZWYgbG9uZyBTQ007CisKKy8qIENyYXkgbWFjaGluZXMgaGF2ZSBwb2ludGVycyB0aGF0IGFyZSBpbmNyZW1lbnRlZCBvbmNlIGZvciBlYWNoIHdvcmQsCisgKiByYXRoZXIgdGhhbiBlYWNoIGJ5dGUsIHRoZSAzIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBlbmNvZGUgdGhlIGJ5dGUKKyAqIHdpdGhpbiB0aGUgd29yZC4gIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGRlYWwgd2l0aCB0aGlzIGJ5IHN0b3JpbmcgdGhlCisgKiBuYXRpdmUgQ3JheSBwb2ludGVycyBsaWtlIHRoZSBvbmVzIHRoYXQgbG9va3MgbGlrZSBzY20gZXhwZWN0cy4gIFRoaXMKKyAqIGlzIGRvbmUgZm9yIGFueSBwb2ludGVycyB0aGF0IG1pZ2h0IGFwcGVhciBpbiB0aGUgY2FyIG9mIGEgc2NtX2NlbGwsIHBvaW50ZXJzCisgKiB0byBzY21fdmVjdG9yIGVsdHMsIGZ1bmN0aW9ucywgJmMgYXJlIG5vdCBtdW5nZWQuCisgKi8KKyNpZmRlZiBfVU5JQ09TCisjIGRlZmluZSBTQ00yUFRSKHgpICgoaW50KSh4KSA+PiAzKQorIyBkZWZpbmUgUFRSMlNDTSh4KSAoKChTQ00pKHgpKSA8PCAzKQorIyBkZWZpbmUgU0NNX1BPSU5URVJTX01VTkdFRAorI2Vsc2UKKyMgZGVmaW5lIFNDTTJQVFIoeCkgKHgpCisjIGRlZmluZSBQVFIyU0NNKHgpICgoU0NNKSh4KSkKKyNlbmRpZiAvKiBkZWYgX1VOSUNPUyAqLworCisMCisKKy8qIEltbWVkaWF0ZT8gUHJlZGljYXRlcyAKKyAqLworI2RlZmluZSBTQ01fSU1QKHgpIAkoNiAmIChpbnQpKHgpKQorI2RlZmluZSBTQ01fTklNUCh4KSAJKCFTQ01fSU1QKHgpKQorCisMCisKK2VudW0gc2NtX3RhZ3MKK3sKKyAgc2NtX3RjOF9jaGFyID0gMHhmNAorfTsKKworI2RlZmluZSBTQ01fSVRBRzgoWCkJCSgoaW50KShYKSAmIDB4ZmYpCisjZGVmaW5lIFNDTV9NQUtFX0lUQUc4KFgsIFRBRykJKCgoWCk8PDgpICsgVEFHKQorI2RlZmluZSBTQ01fSVRBRzhfREFUQShYKQkoKFgpPj44KQorCisKKwwKKy8qIExvY2FsIEVudmlyb25tZW50IFN0cnVjdHVyZQorICovCisjZGVmaW5lIFNDTV9JTE9DUChuKQkJKCgweGZmICYgKGludCkobikpPT0weGZjKQorI2RlZmluZSBTQ01fSUxPQzAwCQkoMHgwMDAwMDBmY0wpCisjZGVmaW5lIFNDTV9JRElOQwkJKDB4MDAxMDAwMDBMKQorI2RlZmluZSBTQ01fSUNEUgkJKDB4MDAwODAwMDBMKQorI2RlZmluZSBTQ01fSUZSSU5DCQkoMHgwMDAwMDEwMEwpCisjZGVmaW5lIFNDTV9JRFNUTVNLCQkoLVNDTV9JRElOQykKKyNkZWZpbmUgU0NNX0lGUkFNRShuKSAJCSgoaW50KSgoU0NNX0lDRFItU0NNX0lGUklOQyk+PjgpICYgKChpbnQpKG4pPj44KSkKKyNkZWZpbmUgU0NNX0lESVNUKG4pIAkJKCgodW5zaWduZWQgbG9uZykobikpPj4yMCkKKyNkZWZpbmUgU0NNX0lDRFJQKG4pIAkJKFNDTV9JQ0RSICYgKG4pKQorCisMCisvKiBJbW1lZGlhdGUgU3ltYm9scywgU3BlY2lhbCBTeW1ib2xzLCBGbGFncyAodmFyaW91cyBjb25zdGFudHMpLgorICovCisKKy8qIElTWU1QIHRlc3RzIGZvciBJU1BDU1lNIGFuZCBJU1lNICovCisjZGVmaW5lIFNDTV9JU1lNUChuKSAJCSgoMHgxODcgJiAoaW50KShuKSk9PTQpCisKKy8qIElGTEFHUCB0ZXN0cyBmb3IgSVNQQ1NZTSwgSVNZTSBhbmQgSUZMQUcgKi8KKyNkZWZpbmUgU0NNX0lGTEFHUChuKSAJCSgoMHg4NyAmIChpbnQpKG4pKT09NCkKKyNkZWZpbmUgU0NNX0lTWU1OVU0obikgCQkoKGludCkoKG4pPj45KSkKKyNkZWZpbmUgU0NNX0lTWU1DSEFSUyhuKSAJKHNjbV9pc3ltbmFtZXNbU0NNX0lTWU1OVU0obildKQorI2RlZmluZSBTQ01fTUFLU1BDU1lNKG4pIAkoKChuKTw8OSkrKChuKTw8MykrNEwpCisjZGVmaW5lIFNDTV9NQUtJU1lNKG4pIAkJKCgobik8PDkpKzB4NzRMKQorI2RlZmluZSBTQ01fTUFLSUZMQUcobikgCSgoKG4pPDw5KSsweDE3NEwpCisKKy8qIFRoaXMgdGFibGUgbXVzdCBhZ3JlZSB3aXRoIHRoZSBkZWNsYXJhdGlvbnMgCisgKiBpbiByZXBsLmM6IHtOYW1lcyBvZiBpbW1lZGlhdGUgc3ltYm9sc30uCisgKgorICogVGhlc2UgYXJlIHVzZWQgb25seSBpbiBldmFsIGJ1dCB0aGVpciB2YWx1ZXMKKyAqIGhhdmUgdG8gYmUgYWxsb2NhdGVkIGhlcmUuCisgKgorICovCisKKyNkZWZpbmUgU0NNX0lNX0FORAkJU0NNX01BS1NQQ1NZTSgwKQorI2RlZmluZSBTQ01fSU1fQkVHSU4JCVNDTV9NQUtTUENTWU0oMSkKKyNkZWZpbmUgU0NNX0lNX0NBU0UJCVNDTV9NQUtTUENTWU0oMikKKyNkZWZpbmUgU0NNX0lNX0NPTkQJCVNDTV9NQUtTUENTWU0oMykKKyNkZWZpbmUgU0NNX0lNX0RPCQlTQ01fTUFLU1BDU1lNKDQpCisjZGVmaW5lIFNDTV9JTV9JRgkJU0NNX01BS1NQQ1NZTSg1KQorI2RlZmluZSBTQ01fSU1fTEFNQkRBCQlTQ01fTUFLU1BDU1lNKDYpCisjZGVmaW5lIFNDTV9JTV9MRVQJCVNDTV9NQUtTUENTWU0oNykKKyNkZWZpbmUgU0NNX0lNX0xFVFNUQVIJCVNDTV9NQUtTUENTWU0oOCkKKyNkZWZpbmUgU0NNX0lNX0xFVFJFQwkJU0NNX01BS1NQQ1NZTSg5KQorI2RlZmluZSBTQ01fSU1fT1IJCVNDTV9NQUtTUENTWU0oMTApCisjZGVmaW5lIFNDTV9JTV9RVU9URQkJU0NNX01BS1NQQ1NZTSgxMSkKKyNkZWZpbmUgU0NNX0lNX1NFVAkJU0NNX01BS1NQQ1NZTSgxMikKKyNkZWZpbmUgU0NNX0lNX0RFRklORQkJU0NNX01BS1NQQ1NZTSgxMykKKyNkZWZpbmUgU0NNX0lNX0FQUExZCQlTQ01fTUFLSVNZTSgxNCkKKyNkZWZpbmUgU0NNX0lNX0NPTlQJCVNDTV9NQUtJU1lNKDE1KQorI2RlZmluZSBTQ01fTlVNX0lTWU1TIDE2CisKKy8qIEltcG9ydGFudCBpbW1lZGlhdGVzCisgKi8KKworI2RlZmluZSBTQ01fQk9PTF9GCQlTQ01fTUFLSUZMQUcoU0NNX05VTV9JU1lNUyswKQorI2RlZmluZSBTQ01fQk9PTF9UIAkJU0NNX01BS0lGTEFHKFNDTV9OVU1fSVNZTVMrMSkKKyNkZWZpbmUgU0NNX1VOREVGSU5FRAkgCVNDTV9NQUtJRkxBRyhTQ01fTlVNX0lTWU1TKzIpCisjZGVmaW5lIFNDTV9FT0ZfVkFMIAkJU0NNX01BS0lGTEFHKFNDTV9OVU1fSVNZTVMrMykKKworI2lmZGVmIFNJQ1AKKyNkZWZpbmUgU0NNX0VPTCAJCVNDTV9CT09MX0YKKyNlbHNlCisjZGVmaW5lIFNDTV9FT0wJCQlTQ01fTUFLSUZMQUcoU0NNX05VTV9JU1lNUys0KQorI2VuZGlmCisKKyNkZWZpbmUgU0NNX1VOU1BFQ0lGSUVECQlTQ01fTUFLSUZMQUcoU0NNX05VTV9JU1lNUys1KQorCisMCisKKy8qIEhlYXAgUGFpcnMgYW5kIHRoZSBFbXB0eSBMaXN0IFByZWRpY2F0ZXMKKyAqLworI2RlZmluZSBTQ01fTlVMTFAoeCkgCShTQ01fRU9MID09ICh4KSkKKyNkZWZpbmUgU0NNX05OVUxMUCh4KSAJKFNDTV9FT0wgIT0gKHgpKQorI2RlZmluZSBTQ01fQ0VMTFAoeCkgCSghU0NNX05DRUxMUCh4KSkKKyNkZWZpbmUgU0NNX05DRUxMUCh4KSAJKChzaXplb2Yoc2NtX2NlbGwpLTEpICYgKGludCkoeCkpCisKKworDAorI2RlZmluZSBTQ01fVU5CTkRQKHgpIAkoU0NNX1VOREVGSU5FRD09KHgpKQorCisMCisKKy8qIFRlc3RpbmcgYW5kIENoYW5naW5nIEdDIE1hcmtzIGluIFZhcmlvdXMgU3RhbmRhcmQgUG9zaXRpb25zCisgKi8KKyNkZWZpbmUgU0NNX0dDTUFSS1AoeCkgCQkoMSAmIChpbnQpU0NNX0NEUih4KSkKKyNkZWZpbmUgU0NNX0dDOE1BUktQKHgpIAkoMHg4MCAmIChpbnQpU0NNX0NBUih4KSkKKyNkZWZpbmUgU0NNX1NFVEdDTUFSSyh4KSAJKFNDTV9DRFIoeCkgfD0gMSkKKyNkZWZpbmUgU0NNX0NMUkdDTUFSSyh4KSAJKFNDTV9DRFIoeCkgJj0gfjFMKQorI2RlZmluZSBTQ01fU0VUR0M4TUFSSyh4KSAJKFNDTV9DQVIoeCkgfD0gMHg4MCkKKyNkZWZpbmUgU0NNX0NMUkdDOE1BUksoeCkgCShTQ01fQ0FSKHgpICY9IH4weDgwTCkKKworDAorLyogRXh0cmFjdGluZyBUYWcgQml0cywgV2l0aCBvciBXaXRob3V0IEdDIFNhZmV0eSBhbmQgT3B0aW9uYWwgQml0cworICovCisjZGVmaW5lIFNDTV9UWVAzKHgpIAkJKDcgJiAoaW50KVNDTV9DQVIoeCkpCisjZGVmaW5lIFNDTV9UWVA3KHgpIAkJKDB4N2YgJiAoaW50KVNDTV9DQVIoeCkpCisjZGVmaW5lIFNDTV9UWVA3Uyh4KSAJCSgweDdkICYgKGludClTQ01fQ0FSKHgpKQorI2RlZmluZSBTQ01fVFlQMTYoeCkgCQkoMHhmZmZmICYgKGludClTQ01fQ0FSKHgpKQorI2RlZmluZSBTQ01fVFlQMTZTKHgpIAkJKDB4ZmVmZiAmIChpbnQpU0NNX0NBUih4KSkKKyNkZWZpbmUgU0NNX0dDVFlQMTYoeCkgCQkoMHhmZjdmICYgKGludClTQ01fQ0FSKHgpKQorCisMCisvKiBUd28gc2xpZ2h0bHkgZXh0ZW5zaWJsZSB0eXBlczogc21vYnMgYW5kIHB0b2JzLgorICoKKyAqLworI2RlZmluZSBTQ01fU01PQk5VTSh4KSAoMHgwZmYgJiAoQ0FSKHgpPj44KSk7CisjZGVmaW5lIFNDTV9QVE9CTlVNKHgpICgweDBmZiAmIChDQVIoeCk+PjgpKTsKKworCisMCisKKyNkZWZpbmUgU0NNX0RJUlAoeCkgKFNDTV9OSU1QKHgpICYmIChUWVAxNih4KT09KHNjbV90YzE2X2RpcikpKQorI2RlZmluZSBTQ01fT1BESVJQKHgpIChTQ01fTklNUCh4KSAmJiAoQ0FSKHgpPT0oc2NtX3RjMTZfZGlyIHwgT1BOKSkpCisKKwwKKworLyogTHZlY3RvcnMgCisgKi8KKyNkZWZpbmUgU0NNX0xWRUNUT1JQKHgpIChUWVA3KHgpPT10YzdfbHZlY3RvcikKKworDAorI2lmIDAKKwwKKy8qIFNvY2tldHMgCisgKi8KKyNkZWZpbmUgdGNfc29ja2V0ICh0YzdfcG9ydCB8IE9QTikKKyNkZWZpbmUgU0NNX1NPQ0tQKHgpICgoKDB4N2YgfCBPUE4gfCBSRE5HIHwgV1JUTkcpICYgQ0FSKHgpKT09KHRjX3NvY2tldCkpCisjZGVmaW5lIFNDTV9TT0NLVFlQKHgpIChDQVIoeCk+PjI0KQorCisMCisKK2V4dGVybiBpbnQgc2NtX3RjMTZfa2V5X3ZlY3RvcjsKKyNkZWZpbmUgU0NNX0tFWVZFQ1AoWCkgICAoc2NtX3RjMTZfa2V5X3ZlY3RvciA9PSBUWVAxNiAoWCkpCisjZGVmaW5lIFNDTV9LRVlWRUNMRU4oT0JKKSAoKCh1bnNpZ25lZCBsb25nKUNBUiAob2JqKSkgPj4gMTYpCisKKwwKKyNkZWZpbmUgU0NNX01BTExPQ0RBVEEob2JqKSAoKGNoYXIgKilDRFIob2JqKSkKKyNkZWZpbmUgU0NNX01BTExPQ0xFTihvYmopICgoKHVuc2lnbmVkIGxvbmcpQ0FSIChvYmopKSA+PiAxNikKKyNkZWZpbmUgU0NNX1dPUkREQVRBKG9iaikgIChDRFIgKG9iaikpCisKKworI2RlZmluZSBTQ01fQllURUNPREVQKFgpICgoVFlQNyAoWCkgPT0gdGM3X2NjbG8pICYmIChDQ0xPX1NVQlIgKFgpID09IHJiX3Byb2MpKQorI2RlZmluZSBTQ01fQllURUNPREVfQ09OU1RBTlRTKFgpIChWRUxUUyhYKVsxXSkKKyNkZWZpbmUgU0NNX0JZVEVDT0RFX0NPREUoWCkgKFZFTFRTKFgpWzJdKQorI2RlZmluZSBTQ01fQllURUNPREVfTkFNRShYKSAoVkVMVFMoWClbM10pCisjZGVmaW5lIFNDTV9CWVRFQ09ERV9CQ09ERShYKSAoVkVMVFMoWClbNF0pCisjZGVmaW5lIFNDTV9CWVRFQ09ERV9FTFRTIDUKKworDAorI2RlZmluZSBTQ01fRlJFRVAoeCkgKENBUih4KT09dGNfZnJlZV9jZWxsKQorI2RlZmluZSBTQ01fTkZSRUVQKHgpICghRlJFRVAoeCkpCisMCisjZW5kaWYgLyogMCovCisMCisjaWZkZWYgX19TVERDX18KKworI2Vsc2UgLyogU1REQyAqLworCisjZW5kaWYgLyogU1REQyAqLworCisKKyNlbmRpZiAgLyogVEFHU0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9zY20tdmFscHJpbnQuYyBiL2dkYi9zY20tdmFscHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWFjYzY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3NjbS12YWxwcmludC5jCkBAIC0wLDAgKzEsNDIyIEBACisvKiBTY2hlbWUvR3VpbGUgbGFuZ3VhZ2Ugc3VwcG9ydCByb3V0aW5lcyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJwYXJzZXItZGVmcy5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJzY20tbGFuZy5oIgorI2luY2x1ZGUgInZhbHByaW50LmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorCisvKiBGSVhNRTogU2hvdWxkIGJlIGluIGEgaGVhZGVyIGZpbGUgdGhhdCB3ZSBpbXBvcnQuICovCitleHRlcm4gaW50CitjX3ZhbF9wcmludCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBjaGFyICosIGludCwgQ09SRV9BRERSLCBHREJfRklMRSAqLCBpbnQsIGludCwKKwkJICAgICBpbnQsIGVudW0gdmFsX3ByZXR0eXByaW50KSk7CisKK3N0YXRpYyB2b2lkIHNjbV9pcHJ1ayBQQVJBTVMgKChjaGFyICosIExPTkdFU1QsIEdEQl9GSUxFICopKTsKK3N0YXRpYyB2b2lkIHNjbV9zY21saXN0X3ByaW50IFBBUkFNUyAoKExPTkdFU1QsIEdEQl9GSUxFICosIGludCwgaW50LAorCQkJCSAgICAgIGludCwgZW51bSB2YWxfcHJldHR5cHJpbnQpKTsKK3N0YXRpYyBpbnQgc2NtX2luZmVyaW9yX3ByaW50IFBBUkFNUyAoKExPTkdFU1QsIEdEQl9GSUxFICosIGludCwgaW50LAorCQkJCSAgICAgICBpbnQsIGVudW0gdmFsX3ByZXR0eXByaW50KSk7CisKKy8qIFByaW50cyB0aGUgU0NNIHZhbHVlIFZBTFVFIGJ5IGludm9raW5nIHRoZSBpbmZlcmlvciwgaWYgYXBwcm9wcmFpdGUuCisgICBSZXR1cm5zID49IDAgb24gc3VjY2VzOyAgcmV0dW5yIC0xIGlmIHRoZSBpbmZlcmlvciBjYW5ub3Qvc2hvdWxkIG5vdAorICAgcHJpbnQgVkFMVUUuICovCisKK3N0YXRpYyBpbnQKK3NjbV9pbmZlcmlvcl9wcmludCAodmFsdWUsIHN0cmVhbSwgZm9ybWF0LCBkZXJlZl9yZWYsIHJlY3Vyc2UsIHByZXR0eSkKKyAgICAgTE9OR0VTVCB2YWx1ZTsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgaW50IGZvcm1hdDsKKyAgICAgaW50IGRlcmVmX3JlZjsKKyAgICAgaW50IHJlY3Vyc2U7CisgICAgIGVudW0gdmFsX3ByZXR0eXByaW50IHByZXR0eTsKK3sKKyAgcmV0dXJuIC0xOworfQorCisvKiB7TmFtZXMgb2YgaW1tZWRpYXRlIHN5bWJvbHN9CisgKiBUaGlzIHRhYmxlIG11c3QgYWdyZWUgd2l0aCB0aGUgZGVjbGFyYXRpb25zIGluIHNjbS5oOiB7SW1tZWRpYXRlIFN5bWJvbHN9LiovCisKK3N0YXRpYyBjaGFyICpzY21faXN5bW5hbWVzW10gPQoreworICAvKiBUaGlzIHRhYmxlIG11c3QgYWdyZWUgd2l0aCB0aGUgZGVjbGFyYXRpb25zICovCisgICJhbmQiLAorICAiYmVnaW4iLAorICAiY2FzZSIsCisgICJjb25kIiwKKyAgImRvIiwKKyAgImlmIiwKKyAgImxhbWJkYSIsCisgICJsZXQiLAorICAibGV0KiIsCisgICJsZXRyZWMiLAorICAib3IiLAorICAicXVvdGUiLAorICAic2V0ISIsCisgICJkZWZpbmUiLAorI2lmIDAKKyAgImxpdGVyYWwtdmFyaWFibGUtcmVmIiwKKyAgImxpdGVyYWwtdmFyaWFibGUtc2V0ISIsCisjZW5kaWYKKyAgImFwcGx5IiwKKyAgImNhbGwtd2l0aC1jdXJyZW50LWNvbnRpbnVhdGlvbiIsCisKKyAvKiB1c2VyIHZpc2libGUgSVNZTVMgKi8KKyAvKiBvdGhlciBrZXl3b3JkcyAqLworIC8qIEZsYWdzICovCisKKyAgIiNmIiwKKyAgIiN0IiwKKyAgIiM8dW5kZWZpbmVkPiIsCisgICIjPGVvZj4iLAorICAiKCkiLAorICAiIzx1bnNwZWNpZmllZD4iCit9OworCitzdGF0aWMgdm9pZAorc2NtX3NjbWxpc3RfcHJpbnQgKHN2YWx1ZSwgc3RyZWFtLCBmb3JtYXQsIGRlcmVmX3JlZiwgcmVjdXJzZSwgcHJldHR5KQorICAgICBMT05HRVNUIHN2YWx1ZTsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgaW50IGZvcm1hdDsKKyAgICAgaW50IGRlcmVmX3JlZjsKKyAgICAgaW50IHJlY3Vyc2U7CisgICAgIGVudW0gdmFsX3ByZXR0eXByaW50IHByZXR0eTsKK3sKKyAgdW5zaWduZWQgaW50IG1vcmUgPSBwcmludF9tYXg7CisgIGlmIChyZWN1cnNlID4gNikKKyAgICB7CisgICAgICBmcHV0c19maWx0ZXJlZCAoIi4uLiIsIHN0cmVhbSk7CisgICAgICByZXR1cm47CisgICAgfQorICBzY21fc2NtdmFsX3ByaW50IChTQ01fQ0FSIChzdmFsdWUpLCBzdHJlYW0sIGZvcm1hdCwKKwkJICAgIGRlcmVmX3JlZiwgcmVjdXJzZSArIDEsIHByZXR0eSk7CisgIHN2YWx1ZSA9IFNDTV9DRFIgKHN2YWx1ZSk7CisgIGZvciAoOyBTQ01fTklNUCAoc3ZhbHVlKTsgc3ZhbHVlID0gU0NNX0NEUiAoc3ZhbHVlKSkKKyAgICB7CisgICAgICBpZiAoU0NNX05FQ09OU1AgKHN2YWx1ZSkpCisJYnJlYWs7CisgICAgICBmcHV0c19maWx0ZXJlZCAoIiAiLCBzdHJlYW0pOworICAgICAgaWYgKC0tbW9yZSA9PSAwKQorCXsKKwkgIGZwdXRzX2ZpbHRlcmVkICgiLi4uIiwgc3RyZWFtKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBzY21fc2NtdmFsX3ByaW50IChTQ01fQ0FSIChzdmFsdWUpLCBzdHJlYW0sIGZvcm1hdCwKKwkJCWRlcmVmX3JlZiwgcmVjdXJzZSArIDEsIHByZXR0eSk7CisgICAgfQorICBpZiAoU0NNX05OVUxMUCAoc3ZhbHVlKSkKKyAgICB7CisgICAgICBmcHV0c19maWx0ZXJlZCAoIiAuICIsIHN0cmVhbSk7CisgICAgICBzY21fc2NtdmFsX3ByaW50IChzdmFsdWUsIHN0cmVhbSwgZm9ybWF0LAorCQkJZGVyZWZfcmVmLCByZWN1cnNlICsgMSwgcHJldHR5KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzY21faXBydWsgKGhkciwgcHRyLCBzdHJlYW0pCisgICAgIGNoYXIgKmhkcjsKKyAgICAgTE9OR0VTVCBwdHI7CisgICAgIEdEQl9GSUxFICpzdHJlYW07Cit7CisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiM8dW5rbm93bi0lcyIsIGhkcik7CisjZGVmaW5lIFNDTV9TSVpFIFRZUEVfTEVOR1RIIChidWlsdGluX3R5cGVfc2NtKQorICBpZiAoU0NNX0NFTExQIChwdHIpKQorICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiAoMHglbHggLiAweCVseCkgQCIsCisJCSAgICAgIChsb25nKSBTQ01fQ0FSIChwdHIpLCAobG9uZykgU0NNX0NEUiAocHRyKSk7CisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiAweCV4PiIsIHB0cik7Cit9CisKK3ZvaWQKK3NjbV9zY212YWxfcHJpbnQgKHN2YWx1ZSwgc3RyZWFtLCBmb3JtYXQsIGRlcmVmX3JlZiwgcmVjdXJzZSwgcHJldHR5KQorICAgICBMT05HRVNUIHN2YWx1ZTsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgaW50IGZvcm1hdDsKKyAgICAgaW50IGRlcmVmX3JlZjsKKyAgICAgaW50IHJlY3Vyc2U7CisgICAgIGVudW0gdmFsX3ByZXR0eXByaW50IHByZXR0eTsKK3sKKyB0YWxvb3A6CisgIHN3aXRjaCAoNyAmIChpbnQpIHN2YWx1ZSkKKyAgICB7CisgICAgY2FzZSAyOgorICAgIGNhc2UgNjoKKyAgICAgIHByaW50X2xvbmdlc3QgKHN0cmVhbSwgZm9ybWF0ID8gZm9ybWF0IDogJ2QnLCAxLCBzdmFsdWUgPj4gMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBpZiAoU0NNX0lDSFJQIChzdmFsdWUpKQorCXsKKwkgIHN2YWx1ZSA9IFNDTV9JQ0hSIChzdmFsdWUpOworCSAgc2NtX3ByaW50Y2hhciAoc3ZhbHVlLCBzdHJlYW0pOworCSAgYnJlYWs7CisJfQorICAgICAgZWxzZSBpZiAoU0NNX0lGTEFHUCAoc3ZhbHVlKQorCSAgICAgICAmJiAoU0NNX0lTWU1OVU0gKHN2YWx1ZSkKKwkJICAgPCAoc2l6ZW9mIHNjbV9pc3ltbmFtZXMgLyBzaXplb2YgKGNoYXIgKikpKSkKKwl7CisJICBmcHV0c19maWx0ZXJlZCAoU0NNX0lTWU1DSEFSUyAoc3ZhbHVlKSwgc3RyZWFtKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGVsc2UgaWYgKFNDTV9JTE9DUCAoc3ZhbHVlKSkKKwl7CisJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIjQCVsZCVjJWxkIiwKKwkJCSAgICAobG9uZykgU0NNX0lGUkFNRSAoc3ZhbHVlKSwKKwkJCSAgICBTQ01fSUNEUlAgKHN2YWx1ZSkgPyAnLScgOiAnKycsCisJCQkgICAgKGxvbmcpIFNDTV9JRElTVCAoc3ZhbHVlKSk7CisJICBicmVhazsKKwl9CisgICAgICBlbHNlCisJZ290byBpZGVmOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgLyogZ2xvYyAqLworICAgICAgc3ZhbHVlID0gU0NNX0NBUiAoc3ZhbHVlIC0gMSk7CisgICAgICBnb3RvIHRhbG9vcDsKKyAgICBkZWZhdWx0OgorICAgIGlkZWY6CisgICAgICBzY21faXBydWsgKCJpbW1lZGlhdGUiLCBzdmFsdWUsIHN0cmVhbSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDA6CisKKyAgICAgIHN3aXRjaCAoU0NNX1RZUDcgKHN2YWx1ZSkpCisJeworCWNhc2Ugc2NtX3Rjc19jb25zX2dsb2M6CisJICBpZiAoU0NNX0NEUiAoU0NNX0NBUiAoc3ZhbHVlKSAtIDFMKSA9PSAwKQorCSAgICB7CisjaWYgMAorCSAgICAgIFNDTSBuYW1lOworI2VuZGlmCisJICAgICAgZnB1dHNfZmlsdGVyZWQgKCIjPGxhdHRlICIsIHN0cmVhbSk7CisjaWYgMQorCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiPz8/Iiwgc3RyZWFtKTsKKyNlbHNlCisJICAgICAgbmFtZSA9ICgoU0NNIG4qKShTVFJVQ1RfVFlQRSggZXhwKSkpW3N0cnVjdF9pX25hbWVdOworCSAgICAgIHNjbV9sZndyaXRlIChDSEFSUyAobmFtZSksCisJCQkgICAoc2l6ZXQpIHNpemVvZiAoY2hhciksCisJCQkgICAoc2l6ZXQpIExFTkdUSCAobmFtZSksCisJCQkgICBwb3J0KTsKKyNlbmRpZgorCSAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiAjWCVsWD4iLCBzdmFsdWUpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJY2FzZSBzY21fdGNzX2NvbnNfaW1jYXI6CisJY2FzZSBzY21fdGNzX2NvbnNfbmltY2FyOgorCSAgZnB1dHNfZmlsdGVyZWQgKCIoIiwgc3RyZWFtKTsKKwkgIHNjbV9zY21saXN0X3ByaW50IChzdmFsdWUsIHN0cmVhbSwgZm9ybWF0LAorCQkJICAgICBkZXJlZl9yZWYsIHJlY3Vyc2UgKyAxLCBwcmV0dHkpOworCSAgZnB1dHNfZmlsdGVyZWQgKCIpIiwgc3RyZWFtKTsKKwkgIGJyZWFrOworCWNhc2Ugc2NtX3Rjc19jbG9zdXJlczoKKwkgIGZwdXRzX2ZpbHRlcmVkICgiIzxDTE9TVVJFICIsIHN0cmVhbSk7CisJICBzY21fc2NtbGlzdF9wcmludCAoU0NNX0NPREUgKHN2YWx1ZSksIHN0cmVhbSwgZm9ybWF0LAorCQkJICAgICBkZXJlZl9yZWYsIHJlY3Vyc2UgKyAxLCBwcmV0dHkpOworCSAgZnB1dHNfZmlsdGVyZWQgKCI+Iiwgc3RyZWFtKTsKKwkgIGJyZWFrOworCWNhc2Ugc2NtX3RjN19zdHJpbmc6CisJICB7CisJICAgIGludCBsZW4gPSBTQ01fTEVOR1RIIChzdmFsdWUpOworCSAgICBDT1JFX0FERFIgYWRkciA9IChDT1JFX0FERFIpIFNDTV9DRFIgKHN2YWx1ZSk7CisJICAgIGludCBpOworCSAgICBpbnQgZG9uZSA9IDA7CisJICAgIGludCBidWZfc2l6ZTsKKwkgICAgY2hhciBidWZmZXJbNjRdOworCSAgICBpbnQgdHJ1bmNhdGUgPSBwcmludF9tYXggJiYgbGVuID4gKGludCkgcHJpbnRfbWF4OworCSAgICBpZiAodHJ1bmNhdGUpCisJICAgICAgbGVuID0gcHJpbnRfbWF4OworCSAgICBmcHV0c19maWx0ZXJlZCAoIlwiIiwgc3RyZWFtKTsKKwkgICAgZm9yICg7IGRvbmUgPCBsZW47IGRvbmUgKz0gYnVmX3NpemUpCisJICAgICAgeworCQlidWZfc2l6ZSA9IG1pbiAobGVuIC0gZG9uZSwgNjQpOworCQlyZWFkX21lbW9yeSAoYWRkciArIGRvbmUsIGJ1ZmZlciwgYnVmX3NpemUpOworCQkKKwkJZm9yIChpID0gMDsgaSA8IGJ1Zl9zaXplOyArK2kpCisJCSAgc3dpdGNoIChidWZmZXJbaV0pCisJCSAgICB7CisJCSAgICBjYXNlICdcIic6CisJCSAgICBjYXNlICdcXCc6CisJCSAgICAgIGZwdXRzX2ZpbHRlcmVkICgiXFwiLCBzdHJlYW0pOworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJWMiLCBidWZmZXJbaV0pOworCQkgICAgfQorCSAgICAgIH0KKwkgICAgZnB1dHNfZmlsdGVyZWQgKHRydW5jYXRlID8gIi4uLlwiIiA6ICJcIiIsIHN0cmVhbSk7CisJICAgIGJyZWFrOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSBzY21fdGNzX3N5bWJvbHM6CisJICB7CisJICAgIGludCBsZW4gPSBTQ01fTEVOR1RIIChzdmFsdWUpOworCisJICAgIGNoYXIgKiBzdHIgPSAoY2hhciopIGFsbG9jYSAobGVuKTsKKwkgICAgcmVhZF9tZW1vcnkgKFNDTV9DRFIgKHN2YWx1ZSksIHN0ciwgbGVuICsgMSk7CisJICAgIC8qIFNob3VsZCBoYW5kbGUgd2VpcmQgY2hhcmFjdGVycyBGSVhNRSAqLworCSAgICBzdHJbbGVuXSA9ICdcMCc7CisJICAgIGZwdXRzX2ZpbHRlcmVkIChzdHIsIHN0cmVhbSk7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2Ugc2NtX3RjN192ZWN0b3I6CisJICB7CisJICAgIGludCBsZW4gPSBTQ01fTEVOR1RIIChzdmFsdWUpOworCSAgICBpbnQgaTsKKwkgICAgTE9OR0VTVCBlbGVtZW50cyA9IFNDTV9DRFIoc3ZhbHVlKTsKKwkgICAgZnB1dHNfZmlsdGVyZWQgKCIjKCIsIHN0cmVhbSk7CisJICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKwkgICAgICB7CisJCWlmIChpID4gMCkKKwkJICBmcHV0c19maWx0ZXJlZCAoIiAiLCBzdHJlYW0pOworCQlzY21fc2NtdmFsX3ByaW50IChzY21fZ2V0X2ZpZWxkIChlbGVtZW50cywgaSksIHN0cmVhbSwgZm9ybWF0LAorCQkJCSAgZGVyZWZfcmVmLCByZWN1cnNlICsgMSwgcHJldHR5KTsKKwkgICAgICB9CisJICAgIGZwdXRzX2ZpbHRlcmVkICgiKSIsIHN0cmVhbSk7CisJICB9CisJICBicmVhazsKKyNpZiAwCisJY2FzZSB0YzdfbHZlY3RvcjoKKwkgIHsKKwkgICAgU0NNIHJlc3VsdDsKKwkgICAgU0NNIGhvb2s7CisJICAgIGhvb2sgPSBzY21fZ2V0X2x2ZWN0b3JfaG9vayAoZXhwLCBMVl9QUklOVF9GTik7CisJICAgIGlmIChob29rID09IEJPT0xfRikKKwkgICAgICB7CisJCXNjbV9wdXRzICgiIzxsb2NrZWQtdmVjdG9yICIsIHBvcnQpOworCQlzY21faW50cHJpbnQoQ0RSKGV4cCksIDE2LCBwb3J0KTsKKwkJc2NtX3B1dHMgKCI+IiwgcG9ydCk7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlyZXN1bHQKKwkJICA9IHNjbV9hcHBseSAoaG9vaywKKwkJCSAgICAgICBzY21fbGlzdGlmeSAoZXhwLCBwb3J0LCAod3JpdGluZyA/IEJPT0xfVCA6IEJPT0xfRiksCisJCQkJCSAgICBTQ01fVU5ERUZJTkVEKSwKKwkJCSAgICAgICBFT0wpOworCQlpZiAocmVzdWx0ID09IEJPT0xfRikKKwkJICBnb3RvIHB1bms7CisJICAgICAgfQorCSAgICBicmVhazsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgdGM3X2J2ZWN0OgorCWNhc2UgdGM3X2l2ZWN0OgorCWNhc2UgdGM3X3V2ZWN0OgorCWNhc2UgdGM3X2Z2ZWN0OgorCWNhc2UgdGM3X2R2ZWN0OgorCWNhc2UgdGM3X2N2ZWN0OgorCSAgc2NtX3JhcHJpbjEgKGV4cCwgcG9ydCwgd3JpdGluZyk7CisJICBicmVhazsKKyNlbmRpZgorCWNhc2Ugc2NtX3Rjc19zdWJyczoKKwkgIHsKKwkgICAgaW50IGluZGV4ID0gU0NNX0NBUiAoc3ZhbHVlKSA+PiA4OworI2lmIDEKKwkgICAgY2hhciBzdHJbMjBdOworCSAgICBzcHJpbnRmIChzdHIsICIjJWQiLCBpbmRleCk7CisjZWxzZQorCSAgICBjaGFyICpzdHIgPSBpbmRleCA/IFNDTV9DSEFSUyAoc2NtX2hlYXBfb3JnK2luZGV4KSA6ICIiOworI2RlZmluZSBTQ01fQ0hBUlMoeCkgKChjaGFyICopKFNDTV9DRFIoeCkpKQorCSAgICBjaGFyICpzdHIgPSBDSEFSUyAoU05BTUUgKGV4cCkpOworI2VuZGlmCisJICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiM8cHJpbWl0aXZlLXByb2NlZHVyZSAlcz4iLAorCQkJICAgICAgc3RyKTsKKwkgIH0KKwkgIGJyZWFrOworI2lmIDAKKyNpZmRlZiBDQ0xPCisJY2FzZSB0YzdfY2NsbzoKKwkgIHNjbV9wdXRzICgiIzxjb21waWxlZC1jbG9zdXJlICIsIHBvcnQpOworCSAgc2NtX2lwcmluMSAoQ0NMT19TVUJSIChleHApLCBwb3J0LCB3cml0aW5nKTsKKwkgIHNjbV9wdXRjICgnPicsIHBvcnQpOworCSAgYnJlYWs7CisjZW5kaWYKKwljYXNlIHRjN19jb250aW46CisJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIjPGNvbnRpbnVhdGlvbiAlZCBAICNYJWx4ID4iLAorCQkJICAgIExFTkdUSCAoc3ZhbHVlKSwKKwkJCSAgICAobG9uZykgQ0hBUlMgKHN2YWx1ZSkpOworCSAgYnJlYWs7CisJY2FzZSB0YzdfcG9ydDoKKwkgIGkgPSBQVE9CTlVNIChleHApOworCSAgaWYgKGkgPCBzY21fbnVtcHRvYiAmJiBzY21fcHRvYnNbaV0ucHJpbnQgJiYgKHNjbV9wdG9ic1tpXS5wcmludCkgKGV4cCwgcG9ydCwgd3JpdGluZykpCisJICAgIGJyZWFrOworCSAgZ290byBwdW5rOworCWNhc2UgdGM3X3Ntb2I6CisJICBpID0gU01PQk5VTSAoZXhwKTsKKwkgIGlmIChpIDwgc2NtX251bXNtb2IgJiYgc2NtX3Ntb2JzW2ldLnByaW50CisJICAgICAgJiYgKHNjbV9zbW9ic1tpXS5wcmludCkgKGV4cCwgcG9ydCwgd3JpdGluZykpCisJICAgIGJyZWFrOworCSAgZ290byBwdW5rOworI2VuZGlmCisJZGVmYXVsdDoKKyNpZiAwCisJcHVuazoKKyNlbmRpZgorCSAgc2NtX2lwcnVrICgidHlwZSIsIHN2YWx1ZSwgc3RyZWFtKTsKKwl9CisgICAgICBicmVhazsKKyAgICB9Cit9CisKK2ludAorc2NtX3ZhbF9wcmludCAodHlwZSwgdmFsYWRkciwgZW1iZWRkZWRfb2Zmc2V0LCBhZGRyZXNzLAorICAgICAgICAgICAgICAgc3RyZWFtLCBmb3JtYXQsIGRlcmVmX3JlZiwgcmVjdXJzZSwgcHJldHR5KQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgY2hhciAqdmFsYWRkcjsKKyAgICAgaW50IGVtYmVkZGVkX29mZnNldDsKKyAgICAgQ09SRV9BRERSIGFkZHJlc3M7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGludCBmb3JtYXQ7CisgICAgIGludCBkZXJlZl9yZWY7CisgICAgIGludCByZWN1cnNlOworICAgICBlbnVtIHZhbF9wcmV0dHlwcmludCBwcmV0dHk7Cit7CisgIGlmIChpc19zY212YWx1ZV90eXBlICh0eXBlKSkKKyAgICB7CisgICAgICBMT05HRVNUIHN2YWx1ZSA9IGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKHZhbGFkZHIsIFRZUEVfTEVOR1RIICh0eXBlKSk7CisgICAgICBpZiAoc2NtX2luZmVyaW9yX3ByaW50IChzdmFsdWUsIHN0cmVhbSwgZm9ybWF0LAorCQkJICAgICAgZGVyZWZfcmVmLCByZWN1cnNlLCBwcmV0dHkpID49IDApCisJeworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzY21fc2NtdmFsX3ByaW50IChzdmFsdWUsIHN0cmVhbSwgZm9ybWF0LAorCQkJICAgICAgZGVyZWZfcmVmLCByZWN1cnNlLCBwcmV0dHkpOworCX0KKworICAgICAgZ2RiX2ZsdXNoIChzdHJlYW0pOworICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZXR1cm4gY192YWxfcHJpbnQgKHR5cGUsIHZhbGFkZHIsIDAsIGFkZHJlc3MsIHN0cmVhbSwgZm9ybWF0LAorCQkJICBkZXJlZl9yZWYsIHJlY3Vyc2UsIHByZXR0eSk7CisgICAgfQorfQorCitpbnQKK3NjbV92YWx1ZV9wcmludCAodmFsLCBzdHJlYW0sIGZvcm1hdCwgcHJldHR5KQorICAgICB2YWx1ZV9wdHIgdmFsOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgZm9ybWF0OworICAgICBlbnVtIHZhbF9wcmV0dHlwcmludCBwcmV0dHk7Cit7CisgIHJldHVybiAodmFsX3ByaW50IChWQUxVRV9UWVBFICh2YWwpLCBWQUxVRV9DT05URU5UUyAodmFsKSwgMCwKKwkJICAgICBWQUxVRV9BRERSRVNTICh2YWwpLCBzdHJlYW0sIGZvcm1hdCwgMSwgMCwgcHJldHR5KSk7Cit9CmRpZmYgLS1naXQgYS9nZGIvc2VyLWU3a3BjLmMgYi9nZGIvc2VyLWU3a3BjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlNWRiOQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9zZXItZTdrcGMuYwpAQCAtMCwwICsxLDQ3MCBAQAorLyogUmVtb3RlIHNlcmlhbCBpbnRlcmZhY2UgdXNpbmcgSGl0YWNoaSBFNzAwMCBQQyBJU0EgY2FyZCBpbiBhIFBDCisgICBDb3B5cmlnaHQgMTk5NCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWYgZGVmaW5lZCBfX0dPMzJfXyB8fCBkZWZpbmVkIF9XSU4zMgorI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJzZXJpYWwuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisKKy8qIE1TVkMgdXNlcyBzdHJuaWNtcCBpbnN0ZWFkIG9mIHN0cm5jYXNlY21wICovCisjaWZkZWYgX01TQ19WRVIKKyNkZWZpbmUgc3RybmNhc2VjbXAgc3RybmljbXAKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmZGVmIF9fR08zMl9fCisjaW5jbHVkZSA8c3lzL2Rvcy5oPgorI2VuZGlmCisKK3N0YXRpYyBpbnQgZTcwMDBwY19vcGVuIFBBUkFNUyAoKHNlcmlhbF90IHNjYiwgY29uc3QgY2hhciAqbmFtZSkpOworc3RhdGljIHZvaWQgZTcwMDBwY19yYXcgUEFSQU1TICgoc2VyaWFsX3Qgc2NiKSk7CitzdGF0aWMgaW50IGU3MDAwcGNfcmVhZGNoYXIgUEFSQU1TICgoc2VyaWFsX3Qgc2NiLCBpbnQgdGltZW91dCkpOworc3RhdGljIGludCBlNzAwMHBjX3NldGJhdWRyYXRlIFBBUkFNUyAoKHNlcmlhbF90IHNjYiwgaW50IHJhdGUpKTsKK3N0YXRpYyBpbnQgZTcwMDBwY193cml0ZSBQQVJBTVMgKChzZXJpYWxfdCBzY2IsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbikpOworc3RhdGljIHZvaWQgZTcwMDBwY19jbG9zZSBQQVJBTVMgKChzZXJpYWxfdCBzY2IpKTsKK3N0YXRpYyBzZXJpYWxfdHR5c3RhdGUgZTcwMDBwY19nZXRfdHR5X3N0YXRlIFBBUkFNUyAoKHNlcmlhbF90IHNjYikpOworc3RhdGljIGludCBlNzAwMHBjX3NldF90dHlfc3RhdGUgUEFSQU1TICgoc2VyaWFsX3Qgc2NiLCBzZXJpYWxfdHR5c3RhdGUgc3RhdGUpKTsKKworI2RlZmluZSBPRkZfRFBEIAkweDAwMDAKKyNkZWZpbmUgT0ZGX0REUCAJMHgxMDAwCisjZGVmaW5lIE9GRl9DUEQgCTB4MjAwMAorI2RlZmluZSBPRkZfQ0RQIAkweDI0MDAKKyNkZWZpbmUgT0ZGX0ZBICAJMHgzMDAwCisjZGVmaW5lIE9GRl9GQiAgCTB4MzAwMgorI2RlZmluZSBPRkZfRkMgIAkweDMwMDQKKyNkZWZpbmUgT0ZGX0lSUVRPRAkweDMwMDgKKyNkZWZpbmUgT0ZGX0lSUVRPUCAJMHgzMDBhCisjZGVmaW5lIE9GRl9SRUFEWSAgCTB4MzAwYworI2RlZmluZSBPRkZfUE9OICAgIAkweDMwMGUKKworI2RlZmluZSBJRExFICAgICAgIDB4MDAwMCAgICAgICAgICAgCisjZGVmaW5lIENNRF9DSSAgICAgMHg0MzQ5ICAgICAgICAgICAKKyNkZWZpbmUgQ01EX0NPICAgICAweDQzNGYgICAgICAgICAgIAorI2RlZmluZSBDTURfTE8gICAgIDB4NGM0ZiAgICAgICAgICAgCisjZGVmaW5lIENNRF9MUyAgICAgMHg0YzUzICAgICAgICAgICAKKyNkZWZpbmUgQ01EX1NWICAgICAweDUzNTYgICAgICAgICAgIAorI2RlZmluZSBDTURfU1MgICAgIDB4NTM1MyAgICAgICAgICAgCisjZGVmaW5lIENNRF9PSyAgICAgMHg0ZjRiICAgICAgICAgICAKKyNkZWZpbmUgQ01EX0VSICAgICAweDQ1NTIgICAgICAgICAgIAorI2RlZmluZSBDTURfTkYgICAgIDB4NGU0NiAgICAgICAgICAgCisjZGVmaW5lIENNRF9BQiAgICAgMHg0MTQyICAgICAgICAgICAKKyNkZWZpbmUgQ01EX0VEICAgICAweDQ1NDQgICAgICAgICAgIAorI2RlZmluZSBDTURfQ0UgICAgIDB4NDM0NSAgICAgICAgICAgCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZhOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXJxdG9kOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVhZHk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBmYjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNwZCA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjZHAgOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVhZHk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwb247CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcnF0b3A7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBib2FyZF9hdDsKKworI2lmZGVmIF9fR08zMl9fCisKKyNkZWZpbmUgU0VUX0JZVEUoeCx5KSAgIHsgY2hhciBfYnVmID0geTtkb3NtZW1wdXQoJl9idWYsMSwgeCk7fQorI2RlZmluZSBTRVRfV09SRCh4LHkpICAgeyBzaG9ydCBfYnVmID0geTtkb3NtZW1wdXQoJl9idWYsMiwgeCk7fQorI2RlZmluZSBHRVRfQllURSh4KSAgICAgKCBkb3NtZW1nZXQoeCwxLCZiYiksIGJiKQorI2RlZmluZSBHRVRfV09SRCh4KSAgICAgKCBkb3NtZW1nZXQoeCwyLCZzYiksIHNiKQorc3RhdGljIHVuc2lnbmVkIGNoYXIgYmI7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc2I7CisKKyNlbHNlIC8qIHdpbjMyICovCisKKyNkZWZpbmUgU0VUX0JZVEUoeCx5KSAgICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSh4KSA9ICh5KQorI2RlZmluZSBTRVRfV09SRCh4LHkpICAgKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSh4KSA9ICh5KQorI2RlZmluZSBHRVRfQllURSh4KSAgICAgKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSh4KSkKKyNkZWZpbmUgR0VUX1dPUkQoeCkgICAgICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKHgpKQorI2RlZmluZSBkb3NtZW1nZXQoRlJPTSwgTEVOLCBUTykgbWVtY3B5ICgodm9pZCAqKShUTyksICh2b2lkICopKEZST00pLCAoTEVOKSkKKyNkZWZpbmUgZG9zbWVtcHV0KEZST00sIExFTiwgVE8pIG1lbWNweSAoKHZvaWQgKikoVE8pLCAodm9pZCAqKShGUk9NKSwgKExFTikpCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzdyAKK3sKKyAgaW50IHN3OworICBpbnQgYWRkcjsKK30gc2lnc1tdID0geworICB7MHgxNCwgMHhkMDAwMH0sCisgIHsweDE1LCAweGQ0MDAwfSwKKyAgezB4MTYsIDB4ZDgwMDB9LAorICB7MHgxNywgMHhkYzAwMH0sCisgIDB9OworCisjaWZkZWYgX01TQ19WRVIKKy8qIEdldCB0aGUgYmFzZSBvZiB0aGUgZGF0YSBzZWdtZW50LiAgVGhpcyBpcyBuZWVkZWQgdG8gY2FsY3VsYXRlIHRoZSBvZmZzZXQKKyAgIGJldHdlZW4gZGF0YSBzZWdtZW50IGFkZHJlc3NlcyBhbmQgdGhlIGJhc2Ugb2YgbGluZWFyIG1lbW9yeSwgd2hpY2ggaXMgd2hlcmUKKyAgIGRldmljZSByZWdpc3RlcnMgcmVzaWRlLiAgTm90ZSB0aGF0IHRoaXMgaXMgcmVhbGx5IG9ubHkgbmVjZXNzYXJ5IGZvcgorICAgV2luMzJzLCBzaW5jZSBXaW45NSBhbmQgTlQga2VlcCB0aGUgZGF0YSBzZWdtZW50IGF0IGxpbmVhciAwLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2dldF9kc19iYXNlICh2b2lkKQoreworICB1bnNpZ25lZCBzaG9ydCBkc3ZhbDsKKyAgTERUX0VOVFJZIGxkdDsKKyAgdW5zaWduZWQgbG9uZyBkc2Jhc2U7CisKKyAgX19hc20KKyAgICB7CisgICAgICBtb3YgZHN2YWwsZHMKKyAgICB9CisKKyAgZHNiYXNlID0gMDsKKworICBHZXRUaHJlYWRTZWxlY3RvckVudHJ5IChHZXRDdXJyZW50VGhyZWFkKCksIGRzdmFsLCAmbGR0KTsKKworICBkc2Jhc2UgPSBsZHQuSGlnaFdvcmQuQml0cy5CYXNlSGkgPDwgMjQgfCBsZHQuSGlnaFdvcmQuQml0cy5CYXNlTWlkIDw8IDE2CisJICAgICB8IGxkdC5CYXNlTG93OworCisgIHJldHVybiBkc2Jhc2U7Cit9CisjZWxzZSAvKiAhX01TQ19WRVIgKi8KKyNkZWZpbmUgZ2V0X2RzX2Jhc2UoKSAwCisjZW5kaWYgLyogX01TQ19WRVIgKi8gCisKK3N0YXRpYyBpbnQKK2U3MDAwcGNfaW5pdCAoKQoreworICBpbnQgdHJ5OworICB1bnNpZ25lZCBsb25nIGRzYmFzZTsKKyAgCisgIGRzYmFzZSA9IGdldF9kc19iYXNlICgpOworCisgIC8qIExvb2sgYXJvdW5kIGluIG1lbW9yeSBmb3IgdGhlIGJvYXJkJ3Mgc2lnbmF0dXJlICovCisKKyAgZm9yICh0cnkgPSAwOyBzaWdzW3RyeV0uc3c7IHRyeSsrKQorICAgIHsKKyAgICAgIGludCB2YWw7CisgICAgICBib2FyZF9hdCA9IHNpZ3NbdHJ5XS5hZGRyIC0gZHNiYXNlOworICAgICAgZmEgPSBib2FyZF9hdCArIE9GRl9GQTsKKyAgICAgIGZiID0gYm9hcmRfYXQgKyBPRkZfRkI7CisgICAgICBjcGQgPSBib2FyZF9hdCArIE9GRl9DUEQ7CisgICAgICBjZHAgPSBib2FyZF9hdCArIE9GRl9DRFA7CisgICAgICByZWFkeSA9Ym9hcmRfYXQgKyBPRkZfUkVBRFk7CisgICAgICBwb24gPSBib2FyZF9hdCArIE9GRl9QT047CSAgICAgIAorICAgICAgaXJxdG9wID0gYm9hcmRfYXQgKyBPRkZfSVJRVE9QOworICAgICAgaXJxdG9kID0gYm9hcmRfYXQgKyBPRkZfSVJRVE9EOworICAgICAgCisgICAgICB2YWwgPSBHRVRfV09SRCAocmVhZHkpOworCisgICAgICBpZiAodmFsID09ICgweGFhYTAgIHwgc2lnc1t0cnldLnN3KSkKKwl7CisJICBpZiAoR0VUX1dPUkQgKHBvbikgJiAweGYpCisJICAgIHsKKwkgICAgICBTRVRfV09SRCAoZmEsIDApOworCSAgICAgIFNFVF9XT1JEIChmYiwgMCk7CisKKwkgICAgICBTRVRfV09SRCAoaXJxdG9wLCAxKTsgLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGZyb20gZTcwMDAgKi8KKwkgICAgICBTRVRfV09SRCAocmVhZHksIDEpOworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuQ29ubmVjdGVkIHRvIHRoZSBFNzAwMFBDIGF0IGFkZHJlc3MgMHgleFxuIiwgCisJCQkgICAgICAgc2lnc1t0cnldLmFkZHIpOworCSAgICAgIHJldHVybiAxOwkgICAgICAKKwkgICAgfQorCSAgZXJyb3IgKCJUaGUgRTcwMDAgUEMgYm9hcmQgaXMgd29ya2luZywgYnV0IHRoZSBFNzAwMCBpcyB0dXJuZWQgb2ZmLlxuIik7CisJICByZXR1cm4gMDsKKwl9CisgICAgfQorCisgIGVycm9yICgiR0RCIGNhbm5vdCBjb25uZWN0IHRvIHRoZSBFNzAwMCBQQyBib2FyZCwgY2hlY2sgdGhhdCBpdCBpcyBpbnN0YWxsZWRcblwKK2FuZCB0aGF0IHRoZSBzd2l0Y2ggc2V0dGluZ3MgYXJlIGNvcnJlY3QuICBTb21lIG90aGVyIERPUyBwcm9ncmFtcyBjYW4gXG5cCitzdG9wIHRoZSBib2FyZCBmcm9tIHdvcmtpbmcuICBUcnkgc3RhcnRpbmcgZnJvbSBhIHZlcnkgbWluaW1hbCBib290LCBcblwKK3BlcmhhcHMgeW91IG5lZWQgdG8gZGlzYWJsZSBFTU0zODYgb3ZlciB0aGUgcmVnaW9uIHdoZXJlIHRoZSBib2FyZCBoYXNcblwKK2l0cyBJL08gc3BhY2UsIHJlbW92ZSBvdGhlciB1bm5lZWRlZCBjYXJkcywgZXRjIGV0Y1xuIik7CisgIHJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgcGJ1Zl9zaXplOworc3RhdGljIGludCBwYnVmX2luZGV4OworCisvKiBSZXR1cm4gbmV4dCBieXRlIGZyb20gY2RwLiAgSWYgbm8gbW9yZSwgdGhlbiByZXR1cm4gLTEuICAqLworCitzdGF0aWMgaW50IAorZTcwMDBfZ2V0ICh2b2lkKQoreworICBzdGF0aWMgY2hhciBwYnVmWzEwMDBdOworICBjaGFyIHRtcFsxMDAwXTsKKyAgaW50IHg7CisKKyAgaWYgKHBidWZfaW5kZXggPCBwYnVmX3NpemUpIAorICAgIHsKKyAgICAgIHggPSBwYnVmW3BidWZfaW5kZXgrK107CisgICAgfQorICBlbHNlIGlmICgoR0VUX1dPUkQgKGZiKSAmIDEpKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgcGJ1Zl9zaXplID0gR0VUX1dPUkQgKGNkcCArIDIpOworCisgICAgICBkb3NtZW1nZXQgKGNkcCArIDgsIHBidWZfc2l6ZSArIDEsIHRtcCk7CisKKyAgICAgIC8qIFRlbGwgdGhlIEU3MDAwIHdlJ3ZlIGVhdGVuICovCisgICAgICBTRVRfV09SRCAoZmIsIDApOwkKKyAgICAgIC8qIFN3YXAgaXQgYXJvdW5kICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgcGJ1Zl9zaXplOyBpKyspIAorCXsKKwkgIHBidWZbaV0gPSB0bXBbaV4xXTsKKwl9CisgICAgICBwYnVmX2luZGV4ID0gMDsKKyAgICAgIHggPSAgcGJ1ZltwYnVmX2luZGV4KytdOworICAgIH0KKyAgZWxzZSAKKyAgICB7IAorICAgICAgeCA9IC0xOworICAgIH0KKyAgcmV0dXJuIHg7Cit9CisKKy8qIFdvcmtzIGp1c3QgbGlrZSByZWFkKCksIGV4Y2VwdCB0aGF0IGl0IHRha2VzIGEgVElNRU9VVCBpbiBzZWNvbmRzLiAgTm90ZQorICAgdGhhdCBUSU1FT1VUID09IDAgaXMgYSBwb2xsLCBhbmQgVElNRU9VVCA9PSAtMSBtZWFucyB3YWl0IGZvcmV2ZXIuICovCisKK3N0YXRpYyBpbnQKK2Rvc2FzeW5jX3JlYWQgKGZkLCBidWYsIGxlbiwgdGltZW91dCkKKyAgICAgaW50IGZkOworICAgICBjaGFyICpidWY7CisgICAgIGludCBsZW47CisgICAgIGludCB0aW1lb3V0OworCit7CisgIGxvbmcgbm93OworICBsb25nIHRoZW47CisgIGludCBpID0gMDsKKworICAvKiBUaGVuIGxvb2sgZm9yIHNvbWUgbW9yZSBpZiB3ZSdyZSBzdGlsbCBodW5ncnkgKi8KKyAgdGltZSAoJm5vdyk7CisgIHRoZW4gPSBub3cgKyB0aW1lb3V0OworICB3aGlsZSAoaSA8IGxlbikKKyAgICB7CisgICAgICBpbnQgY2ggPSBlNzAwMF9nZXQoKTsKKyAgICAgIAorICAgICAgLyogV2hpbGUgdGhlcmUncyByb29tIGluIHRoZSBidWZmZXIsIGFuZCB3ZSd2ZSBhbHJlYWR5CisJIHJlYWQgdGhlIHN0dWZmIGluLCBzdWNrIGl0IG92ZXIgKi8KKyAgICAgIGlmIChjaCAhPSAtMSkgCisJeworCSAgYnVmW2krK10gPSBjaDsKKwkgIHdoaWxlIChpIDwgbGVuICYmIHBidWZfaW5kZXggPCBwYnVmX3NpemUgKQorCSAgICB7CisJICAgICAgY2ggPSBlNzAwMF9nZXQoKTsKKwkgICAgICBpZiAoY2ggPT0gLTEpCisJCWJyZWFrOworCSAgICAgIGJ1ZltpKytdID0gY2g7CisJICAgIH0KKwl9CisKKyAgICAgIHRpbWUgKCZub3cpOworCisgICAgICBpZiAodGltZW91dCA9PSAwKQorCXJldHVybiBpOworICAgICAgaWYgKG5vdyA+PSB0aGVuICYmIHRpbWVvdXQgPiAwKQorCXsKKwkgIHJldHVybiBpOworCX0KKyAgICB9CisgIHJldHVybiBsZW47Cit9CisKKworc3RhdGljIGludAorZG9zYXN5bmNfd3JpdGUgKGZkLCBidWYsIGxlbikKKyAgICAgaW50IGZkOworICAgICBjb25zdCBjaGFyICpidWY7CisgICAgIGludCBsZW47Cit7CisgIGludCBpOworICBjaGFyIGR1bW15WzEwMDBdOyAgCisgIAorICAvKiBDb25zdHJ1Y3QgY29weSBsb2NhbGx5ICovCisgICgoc2hvcnQgKilkdW1teSlbMF0gPSBDTURfQ0k7CisgICgoc2hvcnQgKilkdW1teSlbMV0gPSBsZW47CisgICgoc2hvcnQgKilkdW1teSlbMl0gPSAwOworICAoKHNob3J0ICopZHVtbXkpWzNdID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IGxlbiA7IGkrKykgCisgICAgeworICAgICAgZHVtbXlbOCArIGkgXiAxXSA9IGJ1ZltpXTsKKyAgICB9CisKKyAgLyogV2FpdCBmb3IgdGhlIGNhcmQgdG8gZ2V0IHJlYWR5ICovCisgIHdoaWxlIChHRVRfV09SRCAoZmEpICYgMSkgOworCisgIC8qIEJsYXN0IG9udG8gdGhlIElTQSBjYXJkICovCisgIGRvc21lbXB1dCAoZHVtbXksIDggKyBsZW4gKyAxLCAgY3BkKTsKKworICBTRVRfV09SRCAoZmEsIDEpOworICBTRVRfV09SRCAoaXJxdG9kLCAxKTsgLyogSW50ZXJydXB0IHRoZSBFNzAwMCAqLworCisgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQKK2U3MDAwcGNfb3BlbiAoc2NiLCBuYW1lKQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGlmIChzdHJuY2FzZWNtcCAobmFtZSwgInBjIiwgMikgIT0gMCkKKyAgICB7CisgICAgICBlcnJubyA9IEVOT0VOVDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgc2NiLT5mZCA9IGU3MDAwcGNfaW5pdCAoKTsKKworICBpZiAoIXNjYi0+ZmQpCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitlNzAwMHBjX25vb3AgKHNjYikKKyAgICAgc2VyaWFsX3Qgc2NiOworeworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2U3MDAwcGNfcmF3IChzY2IpCisgICAgIHNlcmlhbF90IHNjYjsKK3sKKyAgLyogQWx3YXlzIGluIHJhdyBtb2RlICovCit9CisKK3N0YXRpYyBpbnQKK2U3MDAwcGNfcmVhZGNoYXIgKHNjYiwgdGltZW91dCkKKyAgICAgc2VyaWFsX3Qgc2NiOworICAgICBpbnQgdGltZW91dDsKK3sKKyAgY2hhciBidWY7CisKKyB0b3A6CisKKyAgaWYgKGRvc2FzeW5jX3JlYWQgKHNjYi0+ZmQsICZidWYsIDEsIHRpbWVvdXQpKQorICAgIHsKKyAgICAgIGlmIChidWYgPT0gMCkgZ290byB0b3A7CisgICAgICByZXR1cm4gYnVmOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiBTRVJJQUxfVElNRU9VVDsKK30KKworc3RydWN0IGU3MDAwcGNfdHR5c3RhdGUgeworICBpbnQgZHVtbXk7Cit9OworCisvKiBlNzAwMHBjX3tnZXQgc2V0fV90dHlfc3RhdGUoKSBhcmUgYm90aCBkdW1teXMgdG8gZmlsbCBvdXQgdGhlIGZ1bmN0aW9uCisgICB2ZWN0b3IuICBTb21lZGF5LCB0aGV5IG1heSBkbyBzb21ldGhpbmcgcmVhbC4uLiAqLworCitzdGF0aWMgc2VyaWFsX3R0eXN0YXRlCitlNzAwMHBjX2dldF90dHlfc3RhdGUgKHNjYikKKyAgICAgc2VyaWFsX3Qgc2NiOworeworICBzdHJ1Y3QgZTcwMDBwY190dHlzdGF0ZSAqc3RhdGU7CisKKyAgc3RhdGUgPSAoc3RydWN0IGU3MDAwcGNfdHR5c3RhdGUgKikgeG1hbGxvYyAoc2l6ZW9mICpzdGF0ZSk7CisKKyAgcmV0dXJuIChzZXJpYWxfdHR5c3RhdGUpIHN0YXRlOworfQorCitzdGF0aWMgaW50CitlNzAwMHBjX3NldF90dHlfc3RhdGUgKHNjYiwgdHR5c3RhdGUpCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgc2VyaWFsX3R0eXN0YXRlIHR0eXN0YXRlOworeworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZTcwMDBwY19ub2ZsdXNoX3NldF90dHlfc3RhdGUgKHNjYiwgbmV3X3R0eXN0YXRlLCBvbGRfdHR5c3RhdGUpCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgc2VyaWFsX3R0eXN0YXRlIG5ld190dHlzdGF0ZTsKKyAgICAgc2VyaWFsX3R0eXN0YXRlIG9sZF90dHlzdGF0ZTsKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitlNzAwMHBjX3ByaW50X3R0eV9zdGF0ZSAoc2NiLCB0dHlzdGF0ZSkKKyAgICAgc2VyaWFsX3Qgc2NiOworICAgICBzZXJpYWxfdHR5c3RhdGUgdHR5c3RhdGU7Cit7CisgIC8qIE5vdGhpbmcgdG8gcHJpbnQuICAqLworICByZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK2U3MDAwcGNfc2V0YmF1ZHJhdGUgKHNjYiwgcmF0ZSkKKyAgICAgc2VyaWFsX3Qgc2NiOworICAgICBpbnQgcmF0ZTsKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2U3MDAwcGNfd3JpdGUgKHNjYiwgc3RyLCBsZW4pCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgY29uc3QgY2hhciAqc3RyOworICAgICBpbnQgbGVuOworeworICBkb3Nhc3luY193cml0ZSAoc2NiLT5mZCwgc3RyLCBsZW4pOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZTcwMDBwY19jbG9zZSAoc2NiKQorICAgICBzZXJpYWxfdCBzY2I7Cit7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VyaWFsX29wcyBlNzAwMHBjX29wcyA9Cit7CisgICJwYyIsCisgIDAsCisgIGU3MDAwcGNfb3BlbiwKKyAgZTcwMDBwY19jbG9zZSwKKyAgZTcwMDBwY19yZWFkY2hhciwKKyAgZTcwMDBwY193cml0ZSwKKyAgZTcwMDBwY19ub29wLAkJCS8qIGZsdXNoIG91dHB1dCAqLworICBlNzAwMHBjX25vb3AsCQkJLyogZmx1c2ggaW5wdXQgKi8KKyAgZTcwMDBwY19ub29wLAkJCS8qIHNlbmQgYnJlYWsgLS0gY3VycmVudGx5IHVzZWQgb25seSBmb3IgbmluZHkgKi8KKyAgZTcwMDBwY19yYXcsCisgIGU3MDAwcGNfZ2V0X3R0eV9zdGF0ZSwKKyAgZTcwMDBwY19zZXRfdHR5X3N0YXRlLAorICBlNzAwMHBjX3ByaW50X3R0eV9zdGF0ZSwKKyAgZTcwMDBwY19ub2ZsdXNoX3NldF90dHlfc3RhdGUsCisgIGU3MDAwcGNfc2V0YmF1ZHJhdGUsCisgIGU3MDAwcGNfbm9vcCwJCQkvKiB3YWl0IGZvciBvdXRwdXQgdG8gZHJhaW4gKi8KK307CisKK3ZvaWQKK19pbml0aWFsaXplX3Nlcl9lNzAwMHBjICgpCit7CisgIHNlcmlhbF9hZGRfaW50ZXJmYWNlICgmZTcwMDBwY19vcHMpOworfQorI2Vsc2UKKwordm9pZAorX2luaXRpYWxpemVfc2VyX2U3MDAwcGMgKCkKK3sKKworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvc2VyLWdvMzIuYyBiL2dkYi9zZXItZ28zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzYxNjEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvc2VyLWdvMzIuYwpAQCAtMCwwICsxLDk1OCBAQAorLyogUmVtb3RlIHNlcmlhbCBpbnRlcmZhY2UgZm9yIGxvY2FsIChoYXJkd2lyZWQpIHNlcmlhbCBwb3J0cyBmb3IKKyAgIEdPMzIuICBDb3B5cmlnaHQgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgQ29udHJpYnV0ZWQgYnkgTmlnZWwgU3RlcGhlbnMsIEFsZ29yaXRobWljcyBMdGQuIChuaWdlbEBhbGdvci5jby51aykuCisKKyAgIFRoaXMgdmVyc2lvbiB1c2VzIERQTUkgaW50ZXJydXB0cyB0byBoYW5kbGUgYnVmZmVyZWQgaS9vIAorICAgd2l0aG91dCB0aGUgc2VwYXJhdGUgImFzeW5jdHNyIiBwcm9ncmFtLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuICAKKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJzZXJpYWwuaCIKKworCisvKgorICogTlMxNjU1MCBVQVJUIHJlZ2lzdGVycworICovCisKKyNkZWZpbmUgQ09NMUFERFIJMHgzZjgKKyNkZWZpbmUgQ09NMkFERFIJMHgyZjgKKyNkZWZpbmUgQ09NM0FERFIJMHgzZTgKKyNkZWZpbmUgQ09NNEFERFIJMHgzZTAKKworI2RlZmluZQljb21fZGF0YQkwCS8qIGRhdGEgcmVnaXN0ZXIgKFIvVykgKi8KKyNkZWZpbmUJY29tX2RsYmwJMAkvKiBkaXZpc29yIGxhdGNoIGxvdyAoVykgKi8KKyNkZWZpbmUJY29tX2llcgkJMQkvKiBpbnRlcnJ1cHQgZW5hYmxlIChXKSAqLworI2RlZmluZQljb21fZGxiaAkxCS8qIGRpdmlzb3IgbGF0Y2ggaGlnaCAoVykgKi8KKyNkZWZpbmUJY29tX2lpcgkJMgkvKiBpbnRlcnJ1cHQgaWRlbnRpZmljYXRpb24gKFIpICovCisjZGVmaW5lCWNvbV9maWZvCTIJLyogRklGTyBjb250cm9sIChXKSAqLworI2RlZmluZQljb21fbGN0bAkzCS8qIGxpbmUgY29udHJvbCByZWdpc3RlciAoUi9XKSAqLworI2RlZmluZQljb21fY2ZjcgkzCS8qIGxpbmUgY29udHJvbCByZWdpc3RlciAoUi9XKSAqLworI2RlZmluZQljb21fbWNyCQk0CS8qIG1vZGVtIGNvbnRyb2wgcmVnaXN0ZXIgKFIvVykgKi8KKyNkZWZpbmUJY29tX2xzcgkJNQkvKiBsaW5lIHN0YXR1cyByZWdpc3RlciAoUi9XKSAqLworI2RlZmluZQljb21fbXNyCQk2CS8qIG1vZGVtIHN0YXR1cyByZWdpc3RlciAoUi9XKSAqLworCisvKgorICogQ29uc3RhbnRzIGZvciBjb21wdXRpbmcgMTYgYml0IGJhdWQgcmF0ZSBkaXZpc29yIChsb3dlciBieXRlCisgKiBpbiBjb21fZGxibCwgdXBwZXIgaW4gY29tX2RsYmgpIGZyb20gMS44NDMyTUh6IGNyeXN0YWwuICBEaXZpc29yIGlzCisgKiAxLjg0MzIgTUh6IC8gKDE2ICogWCkgZm9yIFggYnBzLiAgSWYgdGhlIGJhdWQgcmF0ZSBjYW4ndCBiZSBzZXQKKyAqIHRvIHdpdGhpbiArLSAoZGVzaXJlZF9yYXRlKlNQRUVEX1RPTEVSQU5DRS8xMDAwKSBicHMsIHdlIGZhaWwuCisgKi8KKyNkZWZpbmUgQ09NVElDSwkJKDE4NDMyMDAvMTYpCisjZGVmaW5lIFNQRUVEX1RPTEVSQU5DRQkzMAkvKiB0aG91c2FuZHRoczsgcmVhbCA9PSBkZXNpcmVkICstIDMuMCUgKi8KKworLyogaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworI2RlZmluZQlJRVJfRVJYUkRZCTB4MQkvKiBpbnQgb24gcnggcmVhZHkgKi8KKyNkZWZpbmUJSUVSX0VUWFJEWQkweDIJLyogaW50IG9uIHR4IHJlYWR5ICovCisjZGVmaW5lCUlFUl9FUkxTCTB4NAkvKiBpbnQgb24gbGluZSBzdGF0dXMgY2hhbmdlICovCisjZGVmaW5lCUlFUl9FTVNDCTB4OAkvKiBpbnQgb24gbW9kZW0gc3RhdHVzIGNoYW5nZSAqLworCisvKiBpbnRlcnJ1cHQgaWRlbnRpZmljYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUJSUlSX0ZJRk9fTUFTSwkweGMwCS8qIHNldCBpZiBGSUZPcyBhcmUgZW5hYmxlZCAqLworI2RlZmluZQlJSVJfSU1BU0sJMHhmCS8qIGludGVycnVwdCBjYXVzZSBtYXNrICovCisjZGVmaW5lCUlJUl9OT1BFTkQJMHgxCS8qIG5vdGhpbmcgcGVuZGluZyAqLworI2RlZmluZQlJSVJfUkxTCQkweDYJLyogcmVjZWl2ZSBsaW5lIHN0YXR1cyAqLworI2RlZmluZQlJSVJfUlhSRFkJMHg0CS8qIHJlY2VpdmUgcmVhZHkgKi8KKyNkZWZpbmUJSUlSX1JYVE9VVAkweGMJLyogcmVjZWl2ZSB0aW1lb3V0ICovCisjZGVmaW5lCUlJUl9UWFJEWQkweDIJLyogdHJhbnNtaXQgcmVhZHkgKi8KKyNkZWZpbmUJSUlSX01MU0MJMHgwCS8qIG1vZGVtIHN0YXR1cyAqLworCisKKy8qIGZpZm8gY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZQlGSUZPX0VOQUJMRQkweDAxCS8qIGVuYWJsZSBmaWZvICovCisjZGVmaW5lCUZJRk9fUkNWX1JTVAkweDAyCS8qIHJlc2V0IHJlY2VpdmUgZmlmbyAqLworI2RlZmluZQlGSUZPX1hNVF9SU1QJMHgwNAkvKiByZXNldCB0cmFuc21pdCBmaWZvICovCisjZGVmaW5lCUZJRk9fRE1BX01PREUJMHgwOAkvKiBlbmFibGUgZG1hIG1vZGUgKi8KKyNkZWZpbmUJRklGT19UUklHR0VSXzEJMHgwMAkvKiB0cmlnZ2VyIGF0IDEgY2hhciAqLworI2RlZmluZQlGSUZPX1RSSUdHRVJfNAkweDQwCS8qIHRyaWdnZXIgYXQgNCBjaGFycyAqLworI2RlZmluZQlGSUZPX1RSSUdHRVJfOAkweDgwCS8qIHRyaWdnZXIgYXQgOCBjaGFycyAqLworI2RlZmluZQlGSUZPX1RSSUdHRVJfMTQJMHhjMAkvKiB0cmlnZ2VyIGF0IDE0IGNoYXJzICovCisKKy8qIGNoYXJhY3RlciBmb3JtYXQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZQlDRkNSX0RMQUIJMHg4MAkvKiBkaXZpc29yIGxhdGNoICovCisjZGVmaW5lCUNGQ1JfU0JSRUFLCTB4NDAJLyogc2VuZCBicmVhayAqLworI2RlZmluZQlDRkNSX1BaRVJPCTB4MzAJLyogemVybyBwYXJpdHkgKi8KKyNkZWZpbmUJQ0ZDUl9QT05FCTB4MjAJLyogb25lIHBhcml0eSAqLworI2RlZmluZQlDRkNSX1BFVkVOCTB4MTAJLyogZXZlbiBwYXJpdHkgKi8KKyNkZWZpbmUJQ0ZDUl9QT0RECTB4MDAJLyogb2RkIHBhcml0eSAqLworI2RlZmluZQlDRkNSX1BFTkFCCTB4MDgJLyogcGFyaXR5IGVuYWJsZSAqLworI2RlZmluZQlDRkNSX1NUT1BCCTB4MDQJLyogMiBzdG9wIGJpdHMgKi8KKyNkZWZpbmUJQ0ZDUl84QklUUwkweDAzCS8qIDggZGF0YSBiaXRzICovCisjZGVmaW5lCUNGQ1JfN0JJVFMJMHgwMgkvKiA3IGRhdGEgYml0cyAqLworI2RlZmluZQlDRkNSXzZCSVRTCTB4MDEJLyogNiBkYXRhIGJpdHMgKi8KKyNkZWZpbmUJQ0ZDUl81QklUUwkweDAwCS8qIDUgZGF0YSBiaXRzICovCisKKy8qIG1vZGVtIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJTUNSX0xPT1BCQUNLCTB4MTAJLyogbG9vcGJhY2sgKi8KKyNkZWZpbmUJTUNSX0lFTkFCTEUJMHgwOAkvKiBvdXRwdXQgMiA9IGludCBlbmFibGUgKi8KKyNkZWZpbmUJTUNSX0RSUwkJMHgwNAkvKiBvdXRwdXQgMSA9IHh4eCAqLworI2RlZmluZQlNQ1JfUlRTCQkweDAyCS8qIGVuYWJsZSBSVFMgKi8KKyNkZWZpbmUJTUNSX0RUUgkJMHgwMQkvKiBlbmFibGUgRFRSICovCisKKy8qIGxpbmUgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCUxTUl9SQ1ZfRklGTwkweDgwCS8qIGVycm9yIGluIHJlY2VpdmUgZmlmbyAqLworI2RlZmluZQlMU1JfVFNSRQkweDQwCS8qIHRyYW5zbWl0dGVyIGVtcHR5ICovCisjZGVmaW5lCUxTUl9UWFJEWQkweDIwCS8qIHRyYW5zbWl0dGVyIHJlYWR5ICovCisjZGVmaW5lCUxTUl9CSQkJMHgxMAkvKiBicmVhayBkZXRlY3RlZCAqLworI2RlZmluZQlMU1JfRkUJCTB4MDgJLyogZnJhbWluZyBlcnJvciAqLworI2RlZmluZQlMU1JfUEUJCTB4MDQJLyogcGFyaXR5IGVycm9yICovCisjZGVmaW5lCUxTUl9PRQkJMHgwMgkvKiBvdmVycnVuIGVycm9yICovCisjZGVmaW5lCUxTUl9SWFJEWQkweDAxCS8qIHJlY2VpdmVyIHJlYWR5ICovCisjZGVmaW5lCUxTUl9SQ1ZfTUFTSwkweDFmCisKKy8qIG1vZGVtIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZQlNU1JfRENECQkweDgwCisjZGVmaW5lCU1TUl9SSQkJMHg0MAorI2RlZmluZQlNU1JfRFNSCQkweDIwCisjZGVmaW5lCU1TUl9DVFMJCTB4MTAKKyNkZWZpbmUJTVNSX0REQ0QJMHgwOAorI2RlZmluZQlNU1JfVEVSSQkweDA0CisjZGVmaW5lCU1TUl9ERFNSCTB4MDIKKyNkZWZpbmUJTVNSX0RDVFMJMHgwMQorCisjaW5jbHVkZSA8c3lzL2Rvcy5oPgorI2luY2x1ZGUgPHN5cy9nbzMyLmg+CisjaW5jbHVkZSA8c3lzL2RwbWkuaD4KKworLyogRFBNSSBDb21tdW5pY2F0aW9uICovCitzdGF0aWMgdW5pb24gUkVHUyBkcG1pX3JlZ3M7CitzdGF0aWMgc3RydWN0IFNSRUdTIGRwbWlfc3JlZ3M7CisKKy8qIDE2NTUwIHJ4IGZpZm8gdHJpZ2dlciBwb2ludCAqLworI2RlZmluZSBGSUZPX1RSSUdHRVIJRklGT19UUklHR0VSXzQKKworLyogaW5wdXQgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgQ0JTSVpFCTQwOTYKKworLyogcmV0dXJuIHJhdyAxOEh6IGNsb2NrIGNvdW50ICovCitleHRlcm4gbG9uZyByYXdjbG9jayAodm9pZCk7CisKKyNkZWZpbmUgUkFXSFoJMTgKKworI2lmZGVmIERPU19TVEFUUworI2RlZmluZSBDTlRfUlgJCTE2CisjZGVmaW5lIENOVF9UWAkJMTcKKyNkZWZpbmUgQ05UX1NUUkFZCTE4CisjZGVmaW5lIENOVF9PUlVOCTE5CisjZGVmaW5lIE5DTlQJCTIwCisKK3N0YXRpYyBpbnQJaW50cmNudDsKK3N0YXRpYyBpbnQJY250c1tOQ05UXTsKK3N0YXRpYyBjaGFyCSpjbnRuYW1lc1tOQ05UXSA9IHsKKyAgLyogaC93IGludGVycnVwdCBjb3VudHMuICovCisgICJtbHNjIiwJIm5vcGVuZCIsCSJ0eHJkeSIsCSI/MyIsCisgICJyeHJkeSIsCSI/NSIsCQkicmxzIiwgCQkiPzciLCAKKyAgIj84IiwgCSI/OSIsIAkJIj9hIiwgCQkiP2IiLCAKKyAgInJ4dG91dCIsIAkiP2QiLCAJCSI/ZSIsCQkiP2YiLCAKKyAgLyogcy93IGNvdW50cy4gKi8KKyAgInJ4Y250IiwJInR4Y250IiwJInN0cmF5IiwJInN3b2ZsbyIKK307CisKKyNkZWZpbmUgQ09VTlQoeCkgY250c1t4XSsrCisjZWxzZQorI2RlZmluZSBDT1VOVCh4KSAKKyNlbmRpZgorCisvKiBNYWluIGludGVycnVwdCBjb250cm9sbGVyIHBvcnQgYWRkcmVzc2VzLiAqLworI2RlZmluZSBJQ1VfQkFTRQkweDIwCisjZGVmaW5lIElDVV9PQ1cyCShJQ1VfQkFTRSArIDApCisjZGVmaW5lIElDVV9NQVNLCShJQ1VfQkFTRSArIDEpCisKKy8qIE9yaWdpbmFsIGludGVycnVwdCBjb250cm9sbGVyIG1hc2sgcmVnaXN0ZXIuICovCit1bnNpZ25lZCBjaGFyCWljdV9vbGRtYXNrOworCisvKiBNYXhpbXVtIG9mIDggaW50ZXJydXB0cyAod2UgZG9uJ3QgaGFuZGxlIHRoZSBzbGF2ZSBpY3UgeWV0KS4gKi8KKyNkZWZpbmUgTklOVFIJOAorCitzdGF0aWMgc3RydWN0IGludHJ1cHQKK3sgIAorICBjaGFyCQkJaW51c2U7CisgIHN0cnVjdCBkb3NfdHR5c3RhdGUJKnBvcnQ7CisgIF9nbzMyX2RwbWlfc2VnaW5mbwlvbGRfcm1oYW5kbGVyOworICBfZ28zMl9kcG1pX3NlZ2luZm8Jb2xkX3BtaGFuZGxlcjsKKyAgX2dvMzJfZHBtaV9zZWdpbmZvCW5ld19ybWhhbmRsZXI7CisgIF9nbzMyX2RwbWlfc2VnaW5mbwluZXdfcG1oYW5kbGVyOworICBfZ28zMl9kcG1pX3JlZ2lzdGVycwlyZWdzOworfSBpbnRydXB0c1tOSU5UUl07CisKKworc3RhdGljIHN0cnVjdCBkb3NfdHR5c3RhdGUKK3sKKyAgaW50CQliYXNlOworICBpbnQJCWlycTsKKyAgaW50CQlyZWZjbnQ7CisgIHN0cnVjdCBpbnRydXB0ICppbnRydXB0OworICBpbnQJCWZpZm87CisgIGludAkJYmF1ZHJhdGU7CisgIHVuc2lnbmVkIGNoYXIJY2J1ZltDQlNJWkVdOworICB1bnNpZ25lZCBpbnQJZmlyc3Q7CisgIHVuc2lnbmVkIGludAljb3VudDsKKyAgaW50CQl0eGJ1c3k7CisgIHVuc2lnbmVkIGNoYXIJb2xkX21jcjsKKyAgaW50CQlmZXJyOworICBpbnQJCXBlcnI7CisgIGludAkJb2ZsbzsKKyAgaW50CQltc3I7Cit9IHBvcnRzWzRdID0geworICB7Q09NMUFERFIsIDR9LCAKKyAge0NPTTJBRERSLCAzfSwgCisgIHtDT00zQUREUiwgNH0sIAorICB7Q09NNEFERFIsIDN9Cit9OworCitzdGF0aWMgaW50IGRvc19vcGVuIFBBUkFNUyAoKHNlcmlhbF90IHNjYiwgY29uc3QgY2hhciAqbmFtZSkpOworc3RhdGljIHZvaWQgZG9zX3JhdyBQQVJBTVMgKChzZXJpYWxfdCBzY2IpKTsKK3N0YXRpYyBpbnQgZG9zX3JlYWRjaGFyIFBBUkFNUyAoKHNlcmlhbF90IHNjYiwgaW50IHRpbWVvdXQpKTsKK3N0YXRpYyBpbnQgZG9zX3NldGJhdWRyYXRlIFBBUkFNUyAoKHNlcmlhbF90IHNjYiwgaW50IHJhdGUpKTsKK3N0YXRpYyBpbnQgZG9zX3dyaXRlIFBBUkFNUyAoKHNlcmlhbF90IHNjYiwgY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKSk7CitzdGF0aWMgdm9pZCBkb3NfY2xvc2UgUEFSQU1TICgoc2VyaWFsX3Qgc2NiKSk7CitzdGF0aWMgc2VyaWFsX3R0eXN0YXRlIGRvc19nZXRfdHR5X3N0YXRlIFBBUkFNUyAoKHNlcmlhbF90IHNjYikpOworc3RhdGljIGludCBkb3Nfc2V0X3R0eV9zdGF0ZSBQQVJBTVMgKChzZXJpYWxfdCBzY2IsIHNlcmlhbF90dHlzdGF0ZSBzdGF0ZSkpOworc3RhdGljIGludCBkb3NfYmF1ZGNvbnYgUEFSQU1TICgoaW50IHJhdGUpKTsKKworI2RlZmluZSBpbmIocCxhKQlpbnBvcnRiKChwKS0+YmFzZSArIChhKSkKKyNkZWZpbmUgb3V0YihwLGEsdikJb3V0cG9ydGIoKHApLT5iYXNlICsgKGEpLCAodikpCisjZGVmaW5lIGRpc2FibGUoKQlhc20gdm9sYXRpbGUgKCJjbGkiKTsKKyNkZWZpbmUgZW5hYmxlKCkJYXNtIHZvbGF0aWxlICgic3RpIik7CisKKworc3RhdGljIGludAorZG9zX2dldGMgKHBvcnQpCisgICAgIHZvbGF0aWxlIHN0cnVjdCBkb3NfdHR5c3RhdGUgKnBvcnQ7Cit7CisgICAgaW50IGM7CisKKyAgICBpZiAocG9ydC0+Y291bnQgPT0gMCkKKyAgICAgIHJldHVybiAtMTsKKworICAgIGMgPSBwb3J0LT5jYnVmW3BvcnQtPmZpcnN0XTsKKyAgICBkaXNhYmxlICgpOworICAgIHBvcnQtPmZpcnN0ID0gKHBvcnQtPmZpcnN0ICsgMSkgJiAoQ0JTSVpFIC0gMSk7CisgICAgcG9ydC0+Y291bnQtLTsKKyAgICBlbmFibGUgKCk7CisgICAgcmV0dXJuIGM7Cit9CisgICAgCisKK3N0YXRpYyBpbnQgCitkb3NfcHV0YyAoYywgcG9ydCkKKyAgICAgaW50IGM7CisgICAgIHN0cnVjdCBkb3NfdHR5c3RhdGUgKnBvcnQ7Cit7CisgICAgaWYgKHBvcnQtPmNvdW50ID49IENCU0laRSAtIDEpCisJcmV0dXJuIC0xOworICAgIHBvcnQtPmNidWZbKHBvcnQtPmZpcnN0ICsgcG9ydC0+Y291bnQpICYgKENCU0laRSAtIDEpXSA9IGM7CisgICAgcG9ydC0+Y291bnQrKzsKKyAgICByZXR1cm4gMDsKK30KKworDAorCitzdGF0aWMgdm9pZAorZG9zX2NvbWlzciAoaXJxKQorICAgICBpbnQgaXJxOworeworICBzdHJ1Y3QgZG9zX3R0eXN0YXRlICpwb3J0OworICB1bnNpZ25lZCBjaGFyIGlpciwgbHNyLCBjOworCisgIGRpc2FibGUgKCk7CQkJLyogUGFyYW5vaWEgKi8KKyAgb3V0cG9ydGIgKElDVV9PQ1cyLCAweDIwKTsJLyogRW5kLU9mLUludGVycnVwdCAqLworI2lmZGVmIERPU19TVEFUUworICArK2ludHJjbnQ7CisjZW5kaWYKKworICBwb3J0ID0gaW50cnVwdHNbaXJxXS5wb3J0OworICBpZiAoIXBvcnQpIAorICAgIHsKKyAgICAgIENPVU5UIChDTlRfU1RSQVkpOworICAgICAgcmV0dXJuOwkJLyogbm90IG9wZW4gKi8KKyAgICB9CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaWlyID0gaW5iIChwb3J0LCBjb21faWlyKSAmIElJUl9JTUFTSzsKKyAgICAgIHN3aXRjaCAoaWlyKSAKKwl7CisJICAKKwljYXNlIElJUl9STFM6CisJICBsc3IgPSBpbmIgKHBvcnQsIGNvbV9sc3IpOworCSAgZ290byByeDsKKwkgIAorCWNhc2UgSUlSX1JYVE9VVDoKKwljYXNlIElJUl9SWFJEWToKKwkgIGxzciA9IDA7CisJICAKKyAgICAgIHJ4OgorCSAgZG8gCisJICAgIHsKKwkgICAgICBjID0gaW5iIChwb3J0LCBjb21fZGF0YSk7CisJICAgICAgaWYgKGxzciAmIChMU1JfQkkgfCBMU1JfRkUgfCBMU1JfUEUgfCBMU1JfT0UpKQorCQl7CisJCSAgaWYgKGxzciAmIChMU1JfQkkgfCBMU1JfRkUpKQorCQkgICAgcG9ydC0+ZmVycisrOworCQkgIGVsc2UgaWYgKGxzciAmIExTUl9QRSkKKwkJICAgIHBvcnQtPnBlcnIrKzsKKwkJICBpZiAobHNyICYgTFNSX09FKQorCQkgICAgcG9ydC0+b2ZsbysrOworCQl9CisKKwkgICAgICBpZiAoZG9zX3B1dGMgKGMsIHBvcnQpIDwgMCkKKwkJeworCQkgIENPVU5UIChDTlRfT1JVTik7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBDT1VOVCAoQ05UX1JYKTsKKwkJfQorCSAgICB9CisJICB3aGlsZSAoKGxzciA9IGluYiAocG9ydCwgY29tX2xzcikpICYgTFNSX1JYUkRZKTsKKwkgIGJyZWFrOworCSAgCisJY2FzZSBJSVJfTUxTQzoKKwkgIC8qIGNvdWxkIGJlIHVzZWQgdG8gZmxvd2NvbnRyb2wgVHggKi8KKwkgIHBvcnQtPm1zciA9IGluYiAocG9ydCwgY29tX21zcik7CisJICBicmVhazsKKwkgIAorCWNhc2UgSUlSX1RYUkRZOgorCSAgcG9ydC0+dHhidXN5ID0gMDsKKwkgIGJyZWFrOworCisJY2FzZSBJSVJfTk9QRU5EOgorCSAgLyogbm8gbW9yZSBwZW5kaW5nIGludGVycnVwdHMsIGFsbCBkb25lICovCisJICByZXR1cm47CisKKwlkZWZhdWx0OgorCSAgLyogdW5leHBlY3RlZCBpbnRlcnJ1cHQsIGlnbm9yZSAqLworCSAgYnJlYWs7CisJfQorICAgICAgQ09VTlQgKGlpcik7CisgICAgfSAKK30KKworI2lmZGVmIF9fU1REQ19fCisjZGVmaW5lIElTUk5BTUUoeCkgZG9zX2NvbWlzciMjeAorI2Vsc2UKKyNkZWZpbmUgSVNSTkFNRSh4KSBkb3NfY29taXNyLyoqL3gKKyNlbmRpZgorI2RlZmluZSBJU1IoeCkgc3RhdGljIHZvaWQgSVNSTkFNRSh4KSgpIHtkb3NfY29taXNyKHgpO30KKworSVNSKDApIElTUigxKSBJU1IoMikgSVNSKDMpCitJU1IoNCkgSVNSKDUpIElTUig2KSBJU1IoNykKKwordHlwZWRlZiB2b2lkICgqaXNyX3QpKCk7CisKK3N0YXRpYyBpc3JfdCBpc3JzW05JTlRSXSA9IHsKKyAgSVNSTkFNRSgwKSwgSVNSTkFNRSgxKSwgSVNSTkFNRSgyKSwgSVNSTkFNRSgzKSwKKyAgSVNSTkFNRSg0KSwgSVNSTkFNRSg1KSwgSVNSTkFNRSg2KSwgSVNSTkFNRSg3KQorfTsKKworDAorCitzdGF0aWMgc3RydWN0IGludHJ1cHQgKgorZG9zX2hvb2tpcnEgKGlycSkKKyAgICAgdW5zaWduZWQgaW50IGlycTsKK3sKKyAgc3RydWN0IGludHJ1cHQgKmludHI7CisgIHVuc2lnbmVkIGludCB2ZWM7CisgIGlzcl90IGlzcjsKKworICBpZiAoaXJxID49IE5JTlRSKQorICAgIHJldHVybiAwOworCisgIGludHIgPSAmaW50cnVwdHNbaXJxXTsKKyAgaWYgKGludHItPmludXNlKQorICAgIHJldHVybiAwOworICAKKyAgdmVjID0gMHgwOCArIGlycTsKKyAgaXNyID0gaXNyc1tpcnFdOworCisgIC8qIHNldHVwIHJlYWwgbW9kZSBoYW5kbGVyICovCisgIF9nbzMyX2RwbWlfZ2V0X3JlYWxfbW9kZV9pbnRlcnJ1cHRfdmVjdG9yICh2ZWMsICZpbnRyLT5vbGRfcm1oYW5kbGVyKTsKKworICBpbnRyLT5uZXdfcm1oYW5kbGVyLnBtX3NlbGVjdG9yID0gX2dvMzJfbXlfY3MoKTsKKyAgaW50ci0+bmV3X3JtaGFuZGxlci5wbV9vZmZzZXQgPSAodV9sb25nKWlzcjsKKyAgaWYgKF9nbzMyX2RwbWlfYWxsb2NhdGVfcmVhbF9tb2RlX2NhbGxiYWNrX2lyZXQgKCZpbnRyLT5uZXdfcm1oYW5kbGVyLAorCQkJCQkJICAgJmludHItPnJlZ3MpKQorICAgIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoX2dvMzJfZHBtaV9zZXRfcmVhbF9tb2RlX2ludGVycnVwdF92ZWN0b3IgKHZlYywgJmludHItPm5ld19ybWhhbmRsZXIpKQorICAgIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAgIAorICAvKiBzZXR1cCBwcm90ZWN0ZWQgbW9kZSBoYW5kbGVyICovCisgIF9nbzMyX2RwbWlfZ2V0X3Byb3RlY3RlZF9tb2RlX2ludGVycnVwdF92ZWN0b3IodmVjLCAmaW50ci0+b2xkX3BtaGFuZGxlcik7CisKKyAgaW50ci0+bmV3X3BtaGFuZGxlci5wbV9zZWxlY3RvciA9IF9nbzMyX215X2NzKCk7CisgIGludHItPm5ld19wbWhhbmRsZXIucG1fb2Zmc2V0ID0gKHVfbG9uZylpc3I7CisgIF9nbzMyX2RwbWlfYWxsb2NhdGVfaXJldF93cmFwcGVyICgmaW50ci0+bmV3X3BtaGFuZGxlcik7CisKKyAgaWYgKF9nbzMyX2RwbWlfc2V0X3Byb3RlY3RlZF9tb2RlX2ludGVycnVwdF92ZWN0b3IodmVjLCAmaW50ci0+bmV3X3BtaGFuZGxlcikpCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIHNldHVwIGludGVycnVwdCBjb250cm9sbGVyIG1hc2sgKi8KKyAgZGlzYWJsZSAoKTsKKyAgb3V0cG9ydGIgKElDVV9NQVNLLCBpbnBvcnRiIChJQ1VfTUFTSykgJiB+KDEgPDwgaXJxKSk7CisgIGVuYWJsZSAoKTsKKworICBpbnRyLT5pbnVzZSA9IDE7CisgIHJldHVybiBpbnRyOworfQorCisKK3N0YXRpYyB2b2lkCitkb3NfdW5ob29raXJxIChpbnRyKQorICAgICBzdHJ1Y3QgaW50cnVwdCAqaW50cjsKK3sKKyAgdW5zaWduZWQgaW50IGlycSwgdmVjOworICB1bnNpZ25lZCBjaGFyIG1hc2s7CisKKyAgaXJxID0gaW50ciAtIGludHJ1cHRzOworICB2ZWMgPSAweDA4ICsgaXJxOworCisgIC8qIHJlc3RvcmUgb2xkIGludGVycnVwdCBtYXNrIGJpdCAqLworICBtYXNrID0gMSA8PCBpcnE7CisgIGRpc2FibGUgKCk7CisgIG91dHBvcnRiIChJQ1VfTUFTSywgaW5wb3J0YiAoSUNVX01BU0spIHwgKG1hc2sgJiBpY3Vfb2xkbWFzaykpOworICBlbmFibGUgKCk7CisKKyAgLyogcmVtb3ZlIHJlYWwgbW9kZSBoYW5kbGVyICovCisgIF9nbzMyX2RwbWlfc2V0X3JlYWxfbW9kZV9pbnRlcnJ1cHRfdmVjdG9yICh2ZWMsICZpbnRyLT5vbGRfcm1oYW5kbGVyKTsKKyAgX2dvMzJfZHBtaV9mcmVlX3JlYWxfbW9kZV9jYWxsYmFjayAoJmludHItPm5ld19ybWhhbmRsZXIpOworICAgICAgCisgIC8qIHJlbW92ZSBwcm90ZWN0ZWQgbW9kZSBoYW5kbGVyICovCisgIF9nbzMyX2RwbWlfc2V0X3Byb3RlY3RlZF9tb2RlX2ludGVycnVwdF92ZWN0b3IgKHZlYywgJmludHItPm9sZF9wbWhhbmRsZXIpOworICBfZ28zMl9kcG1pX2ZyZWVfaXJldF93cmFwcGVyICgmaW50ci0+bmV3X3BtaGFuZGxlcik7CisgIGludHItPmludXNlID0gMDsKK30KKworDAorCitzdGF0aWMgaW50Citkb3Nfb3BlbiAoc2NiLCBuYW1lKQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHN0cnVjdCBkb3NfdHR5c3RhdGUgKnBvcnQ7CisgIGludCBmZCwgaTsKKworICBpZiAoc3RybmNhc2VjbXAgKG5hbWUsICIvZGV2LyIsIDUpID09IDApCisgICAgbmFtZSArPSA1OworICBlbHNlIGlmIChzdHJuY2FzZWNtcCAobmFtZSwgIlxcZGV2XFwiLCA1KSA9PSAwKQorICAgIG5hbWUgKz0gNTsKKworICBpZiAoc3RybGVuIChuYW1lKSAhPSA0IHx8IHN0cm5jYXNlY21wIChuYW1lLCAiY29tIiwgMykgIT0gMCkKKyAgICB7CisgICAgICBlcnJubyA9IEVOT0VOVDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKG5hbWVbM10gPCAnMScgfHwgbmFtZVszXSA+ICc0JykKKyAgICB7CisgICAgICBlcnJubyA9IEVOT0VOVDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgZmQgPSBuYW1lWzNdIC0gJzEnOworICBwb3J0ID0gJnBvcnRzW2ZkXTsKKyAgaWYgKHBvcnQtPnJlZmNudCsrID4gMCkKKyAgICB7CisgICAgICAvKiBEZXZpY2UgYWxyZWFkeSBvcGVuZWQgYW5vdGhlciB1c2VyLiAgSnVzdCBwb2ludCBhdCBpdC4gKi8KKyAgICAgIHNjYi0+ZmQgPSBmZDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBmb3JjZSBhY2Nlc3MgdG8gSUQgcmVnICovCisgIG91dGIocG9ydCwgY29tX2NmY3IsIDApOworICBvdXRiKHBvcnQsIGNvbV9paXIsIDApOworICBmb3IgKGkgPSAwOyBpIDwgMTc7IGkrKykgeworICAgIGlmICgoaW5iKHBvcnQsIGNvbV9paXIpICYgMHgzOCkgPT0gMCkKKyAgICAgIGdvdG8gb2s7CisgICAgKHZvaWQpIGluYihwb3J0LCBjb21fZGF0YSk7IC8qIGNsZWFyIHJlY3YgKi8KKyAgfQorICBlcnJubyA9IEVOT0RFVjsKKyAgcmV0dXJuIC0xOworCitvazoKKyAgLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyBpbiBjaGlwICovCisgIG91dGIocG9ydCwgY29tX2llciwgMCk7CisKKyAgLyogdGVudGF0aXZlbHkgZW5hYmxlIDE2NTUwIGZpZm8sIGFuZCBzZWUgaWYgaXQgcmVzcG9uZHMgKi8KKyAgb3V0Yihwb3J0LCBjb21fZmlmbywgRklGT19FTkFCTEV8RklGT19SQ1ZfUlNUfEZJRk9fWE1UX1JTVHxGSUZPX1RSSUdHRVIpOworICBzbGVlcCgxKTsKKyAgcG9ydC0+ZmlmbyA9ICgoaW5iKHBvcnQsIGNvbV9paXIpICYgSUlSX0ZJRk9fTUFTSykgPT0gSUlSX0ZJRk9fTUFTSyk7CisKKyAgLyogY2xlYXIgcGVuZGluZyBzdGF0dXMgcmVwb3J0cy4gKi8KKyAgKHZvaWQpIGluYihwb3J0LCBjb21fbHNyKTsKKyAgKHZvaWQpIGluYihwb3J0LCBjb21fbXNyKTsKKworICAvKiBlbmFibGUgZXh0ZXJuYWwgaW50ZXJydXB0IGdhdGUgKHRvIGF2b2lkIGZsb2F0aW5nIElSUSkgKi8KKyAgb3V0Yihwb3J0LCBjb21fbWNyLCBNQ1JfSUVOQUJMRSk7CisKKyAgLyogaG9vayB1cCBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgaW5pdGlhbGlzZSBpY3UgKi8KKyAgcG9ydC0+aW50cnVwdCA9IGRvc19ob29raXJxIChwb3J0LT5pcnEpOworICBpZiAoIXBvcnQtPmludHJ1cHQpCisgICAgeworICAgICAgb3V0Yihwb3J0LCBjb21fbWNyLCAwKTsKKyAgICAgIG91dGIocG9ydCwgY29tX2ZpZm8sIDApOworICAgICAgZXJybm8gPSBFTk9ERVY7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGRpc2FibGUgKCk7CisKKyAgLyogcmVjb3JkIHBvcnQgKi8KKyAgcG9ydC0+aW50cnVwdC0+cG9ydCA9IHBvcnQ7IAorICBzY2ItPmZkID0gZmQ7CisKKyAgLyogY2xlYXIgcnggYnVmZmVyLCB0eCBidXN5IGZsYWcgYW5kIG92ZXJmbG93IGNvdW50ICovCisgIHBvcnQtPmZpcnN0ID0gcG9ydC0+Y291bnQgPSAwOworICBwb3J0LT50eGJ1c3kgPSAwOworICBwb3J0LT5vZmxvID0gMDsKKworICAvKiBzZXQgZGVmYXVsdCBiYXVkIHJhdGUgYW5kIG1vZGU6IDk2MDAsOCxuLDEgKi8KKyAgaSA9IGRvc19iYXVkY29udiAocG9ydC0+YmF1ZHJhdGUgPSA5NjAwKTsKKyAgb3V0Yihwb3J0LCBjb21fY2ZjciwgQ0ZDUl9ETEFCKTsKKyAgb3V0Yihwb3J0LCBjb21fZGxibCwgaSAmIDB4ZmYpOworICBvdXRiKHBvcnQsIGNvbV9kbGJoLCBpID4+IDgpOworICBvdXRiKHBvcnQsIGNvbV9jZmNyLCBDRkNSXzhCSVRTKTsKKworICAvKiBlbmFibGUgYWxsIGludGVycnVwdHMgKi8KKyAgb3V0Yihwb3J0LCBjb21faWVyLCBJRVJfRVRYUkRZIHwgSUVSX0VSWFJEWSB8IElFUl9FUkxTIHwgSUVSX0VNU0MpOworCisgIC8qIGVuYWJsZSBEVFIgJiBSVFMgKi8KKyAgb3V0Yihwb3J0LCBjb21fbWNyLCBNQ1JfRFRSIHwgTUNSX1JUUyB8IE1DUl9JRU5BQkxFKTsKKworICBlbmFibGUgKCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQKK2Rvc19jbG9zZSAoc2NiKQorICAgICBzZXJpYWxfdCBzY2I7Cit7CisgICAgc3RydWN0IGRvc190dHlzdGF0ZSAqcG9ydDsKKyAgICBzdHJ1Y3QgaW50cnVwdCAqaW50cnVwdDsKKworICAgIGlmICghc2NiKQorICAgICAgcmV0dXJuOworCisgICAgcG9ydCA9ICZwb3J0c1tzY2ItPmZkXTsKKworICAgIGlmIChwb3J0LT5yZWZjbnQtLSA+IDEpCisgICAgICByZXR1cm47CisKKyAgICBpZiAoIShpbnRydXB0ID0gcG9ydC0+aW50cnVwdCkpCisgICAgICByZXR1cm47CisKKyAgICAvKiBkaXNhYmxlIGludGVycnVwdHMsIGZpZm8sIGZsb3cgY29udHJvbCAqLworICAgIGRpc2FibGUgKCk7CisgICAgcG9ydC0+aW50cnVwdCA9IDA7CisgICAgaW50cnVwdC0+cG9ydCA9IDA7CisgICAgb3V0Yihwb3J0LCBjb21fZmlmbywgMCk7CisgICAgb3V0Yihwb3J0LCBjb21faWVyLCAwKTsKKyAgICBlbmFibGUgKCk7CisKKyAgICAvKiB1bmhvb2sgaGFuZGxlciwgYW5kIGRpc2FibGUgaW50ZXJydXB0IGdhdGUgKi8KKyAgICBkb3NfdW5ob29raXJxIChpbnRydXB0KTsKKyAgICBvdXRiKHBvcnQsIGNvbV9tY3IsIDApOworCisgICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93IGVycm9ycyAqLworICAgIGlmIChwb3J0LT5vZmxvKQorICAgICAgeworCWZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKwkJCSAgICAiU2VyaWFsIGlucHV0IG92ZXJydW5zIG9jY3VycmVkLlxuIik7CisJZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiVGhpcyBzeXN0ZW0gJXMgaGFuZGxlICVkIGJhdWQuXG4iLAorCQkJICAgIHBvcnQtPmZpZm8gPyAiY2Fubm90IiA6ICJuZWVkcyBhIDE2NTUwIHRvIiwKKwkJCSAgICBwb3J0LT5iYXVkcmF0ZSk7CisgICAgICB9Cit9CisKKwwKKworc3RhdGljIGludAorZG9zX25vb3AgKHNjYikKKyAgICAgc2VyaWFsX3Qgc2NiOworeworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2Rvc19yYXcgKHNjYikKKyAgICAgc2VyaWFsX3Qgc2NiOworeworICAvKiBBbHdheXMgaW4gcmF3IG1vZGUgKi8KK30KKworc3RhdGljIGludAorZG9zX3JlYWRjaGFyIChzY2IsIHRpbWVvdXQpCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgaW50IHRpbWVvdXQ7Cit7CisgIHN0cnVjdCBkb3NfdHR5c3RhdGUgKnBvcnQgPSAmcG9ydHNbc2NiLT5mZF07CisgIGxvbmcgdGhlbjsKKyAgaW50IGM7CisKKyAgdGhlbiA9IHJhd2Nsb2NrKCkgKyAodGltZW91dCAqIFJBV0haKTsKKyAgd2hpbGUgKChjID0gZG9zX2dldGMgKHBvcnQpKSA8IDApCisgICAgeworICAgICAgaWYgKHRpbWVvdXQgPj0gMCAmJiAocmF3Y2xvY2sgKCkgLSB0aGVuKSA+PSAwKQorCXJldHVybiBTRVJJQUxfVElNRU9VVDsKKyAgICAgIG5vdGljZV9xdWl0ICgpOworICAgIH0KKworICByZXR1cm4gYzsKK30KKworCitzdGF0aWMgc2VyaWFsX3R0eXN0YXRlCitkb3NfZ2V0X3R0eV9zdGF0ZSAoc2NiKQorICAgICBzZXJpYWxfdCBzY2I7Cit7CisgIHN0cnVjdCBkb3NfdHR5c3RhdGUgKnBvcnQgPSAmcG9ydHNbc2NiLT5mZF07CisgIHN0cnVjdCBkb3NfdHR5c3RhdGUgKnN0YXRlOworCisgIHN0YXRlID0gKHN0cnVjdCBkb3NfdHR5c3RhdGUgKikgeG1hbGxvYyAoc2l6ZW9mICpzdGF0ZSk7CisgICpzdGF0ZSA9ICpwb3J0OworICByZXR1cm4gKHNlcmlhbF90dHlzdGF0ZSkgc3RhdGU7Cit9CisKK3N0YXRpYyBpbnQKK2Rvc19zZXRfdHR5X3N0YXRlIChzY2IsIHR0eXN0YXRlKQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIHNlcmlhbF90dHlzdGF0ZSB0dHlzdGF0ZTsKK3sKKyAgc3RydWN0IGRvc190dHlzdGF0ZSAqc3RhdGU7CisKKyAgc3RhdGUgPSAoc3RydWN0IGRvc190dHlzdGF0ZSAqKSB0dHlzdGF0ZTsKKyAgZG9zX3NldGJhdWRyYXRlIChzY2IsIHN0YXRlLT5iYXVkcmF0ZSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Citkb3Nfbm9mbHVzaF9zZXRfdHR5X3N0YXRlIChzY2IsIG5ld190dHlzdGF0ZSwgb2xkX3R0eXN0YXRlKQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIHNlcmlhbF90dHlzdGF0ZSBuZXdfdHR5c3RhdGU7CisgICAgIHNlcmlhbF90dHlzdGF0ZSBvbGRfdHR5c3RhdGU7Cit7CisgIHN0cnVjdCBkb3NfdHR5c3RhdGUgKnN0YXRlOworCisgIHN0YXRlID0gKHN0cnVjdCBkb3NfdHR5c3RhdGUgKikgbmV3X3R0eXN0YXRlOworICBkb3Nfc2V0YmF1ZHJhdGUgKHNjYiwgc3RhdGUtPmJhdWRyYXRlKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2Rvc19mbHVzaF9pbnB1dCAoc2NiKQorICAgICBzZXJpYWxfdCBzY2I7Cit7CisgIHN0cnVjdCBkb3NfdHR5c3RhdGUgKnBvcnQgPSAmcG9ydHNbc2NiLT5mZF07CisgIGRpc2FibGUoKTsKKyAgcG9ydC0+Zmlyc3QgPSBwb3J0LT5jb3VudCA9IDA7CisgIGlmIChwb3J0LT5maWZvKQorICAgIG91dGIocG9ydCwgY29tX2ZpZm8sIEZJRk9fRU5BQkxFfEZJRk9fUkNWX1JTVHxGSUZPX1RSSUdHRVIpOworICBlbmFibGUoKTsKK30KKworc3RhdGljIHZvaWQKK2Rvc19wcmludF90dHlfc3RhdGUgKHNjYiwgdHR5c3RhdGUpCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgc2VyaWFsX3R0eXN0YXRlIHR0eXN0YXRlOworeworICAvKiBOb3RoaW5nIHRvIHByaW50ICovCisgIHJldHVybjsKK30KKworc3RhdGljIGludAorZG9zX2JhdWRjb252IChyYXRlKQorICAgICBpbnQgcmF0ZTsKK3sKKyAgbG9uZyB4LCBlcnI7CisgIAorICBpZiAocmF0ZSA8PSAwKSAKKyAgICByZXR1cm4gLTE7CisKKyNkZWZpbmUgZGl2cm5kKG4sIHEpCSgoKG4pICogMiAvIChxKSArIDEpIC8gMikgLyogZGl2aWRlIGFuZCByb3VuZCBvZmYgKi8KKyAgeCA9IGRpdnJuZChDT01USUNLLCByYXRlKTsKKyAgaWYgKHggPD0gMCkKKyAgICByZXR1cm4gLTE7CisgIAorICBlcnIgPSBkaXZybmQoMTAwMCAqIENPTVRJQ0ssIHggKiByYXRlKSAtIDEwMDA7CisgIGlmIChlcnIgPCAwKQorICAgIGVyciA9IC1lcnI7CisgIGlmIChlcnIgPiBTUEVFRF9UT0xFUkFOQ0UpCisgICAgcmV0dXJuIC0xOworI3VuZGVmIGRpdnJuZAorICByZXR1cm4geDsKK30KKworCitzdGF0aWMgaW50Citkb3Nfc2V0YmF1ZHJhdGUgKHNjYiwgcmF0ZSkKKyAgICAgc2VyaWFsX3Qgc2NiOworICAgICBpbnQgcmF0ZTsKK3sKKyAgICBzdHJ1Y3QgZG9zX3R0eXN0YXRlICpwb3J0ID0gJnBvcnRzW3NjYi0+ZmRdOworCisgICAgaWYgKHBvcnQtPmJhdWRyYXRlICE9IHJhdGUpIAorICAgICAgeworCWludCB4OworCXVuc2lnbmVkIGNoYXIgY2ZjcjsKKworCXggPSBkb3NfYmF1ZGNvbnYgKHJhdGUpOworCWlmICh4IDw9IDApCisJICB7CisJICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIiVkOiBpbXBvc3NpYmxlIGJhdWRyYXRlXG4iLCByYXRlKTsKKwkgICAgZXJybm8gPSBFSU5WQUw7CisJICAgIHJldHVybiAtMTsKKwkgIH0KKworCWRpc2FibGUgKCk7CisJY2ZjciA9IGluYiAocG9ydCwgY29tX2NmY3IpOworCisJb3V0Yihwb3J0LCBjb21fY2ZjciwgQ0ZDUl9ETEFCKTsKKwlvdXRiKHBvcnQsIGNvbV9kbGJsLCB4ICYgMHhmZik7CisJb3V0Yihwb3J0LCBjb21fZGxiaCwgeCA+PiA4KTsKKwlvdXRiKHBvcnQsIGNvbV9jZmNyLCBjZmNyKTsKKwlwb3J0LT5iYXVkcmF0ZSA9IHJhdGU7CisJZW5hYmxlICgpOworICAgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2Rvc19zZXRzdG9wYml0cyAoc2NiLCBudW0pCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgaW50IG51bTsKK3sKKyAgICBzdHJ1Y3QgZG9zX3R0eXN0YXRlICpwb3J0ID0gJnBvcnRzW3NjYi0+ZmRdOworICAgIHVuc2lnbmVkIGNoYXIgY2ZjcjsKKworICAgIGRpc2FibGUgKCk7CisgICAgY2ZjciA9IGluYiAocG9ydCwgY29tX2NmY3IpOworCisgICAgc3dpdGNoIChudW0pCisgICAgICB7CisgICAgICBjYXNlIFNFUklBTF8xX1NUT1BCSVRTOgorCW91dGIgKHBvcnQsIGNvbV9jZmNyLCBjZmNyICYgfkNGQ1JfU1RPUEIpOworCWJyZWFrOworICAgICAgY2FzZSBTRVJJQUxfMV9BTkRfQV9IQUxGX1NUT1BCSVRTOgorICAgICAgY2FzZSBTRVJJQUxfMl9TVE9QQklUUzoKKwlvdXRiIChwb3J0LCBjb21fY2ZjciwgY2ZjciB8IENGQ1JfU1RPUEIpOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwllbmFibGUgKCk7CisJcmV0dXJuIDE7CisgICAgICB9CisgICAgZW5hYmxlICgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2Rvc193cml0ZSAoc2NiLCBzdHIsIGxlbikKKyAgICAgc2VyaWFsX3Qgc2NiOworICAgICBjb25zdCBjaGFyICpzdHI7CisgICAgIGludCBsZW47Cit7CisgIHZvbGF0aWxlIHN0cnVjdCBkb3NfdHR5c3RhdGUgKnBvcnQgPSAmcG9ydHNbc2NiLT5mZF07CisgIGludCBmaWZvc2l6ZSA9IHBvcnQtPmZpZm8gPyAxNiA6IDE7CisgIGxvbmcgdGhlbjsKKyAgaW50IGNudDsKKworICAgd2hpbGUgKGxlbiA+IDApIAorICAgICB7CisJLyogc2VuZCB0aGUgZGF0YSwgZmlmb3NpemUgYnl0ZXMgYXQgYSB0aW1lICovCisJY250ID0gZmlmb3NpemUgPiBsZW4gPyBsZW4gOiBmaWZvc2l6ZTsKKwlwb3J0LT50eGJ1c3kgPSAxOworCW91dHBvcnRzYiAocG9ydC0+YmFzZSArIGNvbV9kYXRhLCBzdHIsIGNudCk7CisJc3RyICs9IGNudDsKKwlsZW4gLT0gY250OworI2lmZGVmIERPU19TVEFUUworCWNudHNbQ05UX1RYXSArPSBjbnQ7CisjZW5kaWYKKwkvKiB3YWl0IGZvciB0cmFuc21pc3Npb24gdG8gY29tcGxldGUgKG1heCAxIHNlYykgKi8KKwl0aGVuID0gcmF3Y2xvY2soKSArIFJBV0haOworCXdoaWxlIChwb3J0LT50eGJ1c3kpCisJICB7CisJICAgIGlmICgocmF3Y2xvY2sgKCkgLSB0aGVuKSA+PSAwKQorCSAgICAgIHsKKwkJICBlcnJubyA9IEVJTzsKKwkJICByZXR1cm4gU0VSSUFMX0VSUk9SOworCSAgICAgIH0KKwkgIH0KKyAgICB9CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2Rvc19zZW5kYnJlYWsgKHNjYikKKyAgICAgc2VyaWFsX3Qgc2NiOworeworICB2b2xhdGlsZSBzdHJ1Y3QgZG9zX3R0eXN0YXRlICpwb3J0ID0gJnBvcnRzW3NjYi0+ZmRdOworICB1bnNpZ25lZCBjaGFyIGNmY3I7CisgIGxvbmcgdGhlbjsKKworICBjZmNyID0gaW5iKHBvcnQsIGNvbV9jZmNyKTsKKyAgb3V0Yihwb3J0LCBjb21fY2ZjciwgY2ZjciB8IENGQ1JfU0JSRUFLKTsKKworICAvKiAwLjI1IHNlYyBkZWxheSAqLworICB0aGVuID0gcmF3Y2xvY2sgKCkgKyBSQVdIWiAvIDQ7CisgIHdoaWxlICgocmF3Y2xvY2sgKCkgLSB0aGVuKSA8IDApCisgICAgY29udGludWU7CisKKyAgb3V0Yihwb3J0LCBjb21fY2ZjciwgY2Zjcik7CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc2VyaWFsX29wcyBkb3Nfb3BzID0KK3sKKyAgImhhcmR3aXJlIiwKKyAgMCwKKyAgZG9zX29wZW4sCisgIGRvc19jbG9zZSwKKyAgZG9zX3JlYWRjaGFyLAorICBkb3Nfd3JpdGUsCisgIGRvc19ub29wLAkJCS8qIGZsdXNoIG91dHB1dCAqLworICBkb3NfZmx1c2hfaW5wdXQsCisgIGRvc19zZW5kYnJlYWssCisgIGRvc19yYXcsCisgIGRvc19nZXRfdHR5X3N0YXRlLAorICBkb3Nfc2V0X3R0eV9zdGF0ZSwKKyAgZG9zX3ByaW50X3R0eV9zdGF0ZSwKKyAgZG9zX25vZmx1c2hfc2V0X3R0eV9zdGF0ZSwKKyAgZG9zX3NldGJhdWRyYXRlLAorICBkb3Nfc2V0c3RvcGJpdHMsCisgIGRvc19ub29wLAkJCS8qIHdhaXQgZm9yIG91dHB1dCB0byBkcmFpbiAqLworfTsKKworCitzdGF0aWMgdm9pZAorZG9zX2luZm8gKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBzdHJ1Y3QgZG9zX3R0eXN0YXRlICpwb3J0OworICBpbnQgaTsKKworICBmb3IgKHBvcnQgPSBwb3J0czsgcG9ydCA8ICZwb3J0c1s0XTsgcG9ydCsrKSAKKyAgICB7CisgICAgICBpZiAocG9ydC0+YmF1ZHJhdGUgPT0gMCkKKwljb250aW51ZTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlBvcnQ6XHRDT00lZCAoJXNhY3RpdmUpXG4iLCBwb3J0IC0gcG9ydHMgKyAxLAorCQkgICAgICAgcG9ydC0+aW50cnVwdCA/ICIiIDogIm5vdCAiKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkFkZHI6XHQweCUwM3ggKGlycSAlZClcbiIsIHBvcnQtPmJhc2UsIHBvcnQtPmlycSk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIxNjU1MDpcdCVzXG4iLCBwb3J0LT5maWZvID8gInllcyIgOiAibm8iKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlNwZWVkOlx0JWQgYmF1ZFxuIiwgcG9ydC0+YmF1ZHJhdGUpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiRXJyczpcdGZyYW1pbmcgJWQgcGFyaXR5ICVkIG92ZXJmbG93ICVkXG5cbiIsIAorCQkgICAgICAgcG9ydC0+ZmVyciwgcG9ydC0+cGVyciwgcG9ydC0+b2Zsbyk7CisgICAgfQorCisjaWZkZWYgRE9TX1NUQVRTCisgIHByaW50Zl9maWx0ZXJlZCAoIlxuVG90YWwgaW50ZXJydXB0czogJWRcbiIsIGludHJjbnQpOworICBmb3IgKGkgPSAwOyBpIDwgTkNOVDsgaSsrKQorICAgIGlmIChjbnRzW2ldKQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiJXM6XHQlZFxuIiwgY250bmFtZXNbaV0sIGNudHNbaV0pOworI2VuZGlmCit9CisKKwordm9pZAorX2luaXRpYWxpemVfc2VyX2RvcyAoKQoreworICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqYzsKKworICBzZXJpYWxfYWRkX2ludGVyZmFjZSAoJmRvc19vcHMpOworCisgIC8qIFNhdmUgb3JpZ2luYWwgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIuICovCisgIGljdV9vbGRtYXNrID0gaW5wb3J0YiAoSUNVX01BU0spOworCisgIC8qIE1hcmsgZml4ZWQgbW90aGVyYm9hcmQgaXJxcyBhcyBpbnVzZS4gKi8KKyAgaW50cnVwdHNbMF0uaW51c2UgPQkJLyogdGltZXIgdGljayAqLworICAgIGludHJ1cHRzWzFdLmludXNlID0JCS8qIGtleWJvYXJkICovCisgICAgICBpbnRydXB0c1syXS5pbnVzZSA9IDE7CS8qIHNsYXZlIGljdSAqLworICAgIAorICBhZGRfc2hvd19mcm9tX3NldCAoCisgICAgYWRkX3NldF9jbWQgKCJjb20xYmFzZSIsIGNsYXNzX29ic2N1cmUsIHZhcl96aW50ZWdlciwKKwkJIChjaGFyICopICZwb3J0c1swXS5iYXNlLAorCQkgIlNldCBDT00xIGJhc2UgaS9vIHBvcnQgYWRkcmVzcy4iLAorCQkgJnNldGxpc3QpLAorCSZzaG93bGlzdCk7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQgKAorICAgIGFkZF9zZXRfY21kICgiY29tMWlycSIsIGNsYXNzX29ic2N1cmUsIHZhcl96aW50ZWdlciwKKwkJIChjaGFyICopICZwb3J0c1swXS5pcnEsCisJCSAiU2V0IENPTTEgaW50ZXJydXB0IHJlcXVlc3QuIiwKKwkJICZzZXRsaXN0KSwKKwkmc2hvd2xpc3QpOworCisgIGFkZF9zaG93X2Zyb21fc2V0ICgKKyAgICBhZGRfc2V0X2NtZCAoImNvbTJiYXNlIiwgY2xhc3Nfb2JzY3VyZSwgdmFyX3ppbnRlZ2VyLAorCQkgKGNoYXIgKikgJnBvcnRzWzFdLmJhc2UsCisJCSAiU2V0IENPTTIgYmFzZSBpL28gcG9ydCBhZGRyZXNzLiIsCisJCSAmc2V0bGlzdCksCisJJnNob3dsaXN0KTsKKworICBhZGRfc2hvd19mcm9tX3NldCAoCisgICAgYWRkX3NldF9jbWQgKCJjb20yaXJxIiwgY2xhc3Nfb2JzY3VyZSwgdmFyX3ppbnRlZ2VyLAorCQkgKGNoYXIgKikgJnBvcnRzWzFdLmlycSwKKwkJICJTZXQgQ09NMiBpbnRlcnJ1cHQgcmVxdWVzdC4iLAorCQkgJnNldGxpc3QpLAorCSZzaG93bGlzdCk7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQgKAorICAgIGFkZF9zZXRfY21kICgiY29tM2Jhc2UiLCBjbGFzc19vYnNjdXJlLCB2YXJfemludGVnZXIsCisJCSAoY2hhciAqKSAmcG9ydHNbMl0uYmFzZSwKKwkJICJTZXQgQ09NMyBiYXNlIGkvbyBwb3J0IGFkZHJlc3MuIiwKKwkJICZzZXRsaXN0KSwKKwkmc2hvd2xpc3QpOworCisgIGFkZF9zaG93X2Zyb21fc2V0ICgKKyAgICBhZGRfc2V0X2NtZCAoImNvbTNpcnEiLCBjbGFzc19vYnNjdXJlLCB2YXJfemludGVnZXIsCisJCSAoY2hhciAqKSAmcG9ydHNbMl0uaXJxLAorCQkgIlNldCBDT00zIGludGVycnVwdCByZXF1ZXN0LiIsCisJCSAmc2V0bGlzdCksCisJJnNob3dsaXN0KTsKKworICBhZGRfc2hvd19mcm9tX3NldCAoCisgICAgYWRkX3NldF9jbWQgKCJjb200YmFzZSIsIGNsYXNzX29ic2N1cmUsIHZhcl96aW50ZWdlciwKKwkJIChjaGFyICopICZwb3J0c1szXS5iYXNlLAorCQkgIlNldCBDT000IGJhc2UgaS9vIHBvcnQgYWRkcmVzcy4iLAorCQkgJnNldGxpc3QpLAorCSZzaG93bGlzdCk7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQgKAorICAgIGFkZF9zZXRfY21kICgiY29tNGlycSIsIGNsYXNzX29ic2N1cmUsIHZhcl96aW50ZWdlciwKKwkJIChjaGFyICopICZwb3J0c1szXS5pcnEsCisJCSAiU2V0IENPTTQgaW50ZXJydXB0IHJlcXVlc3QuIiwKKwkJICZzZXRsaXN0KSwKKwkmc2hvd2xpc3QpOworCisgIGFkZF9pbmZvICgic2VyaWFsIiwgZG9zX2luZm8sCisJICAgICJQcmludCBET1Mgc2VyaWFsIHBvcnQgc3RhdHVzLiIpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Nlci1tYWMuYyBiL2dkYi9zZXItbWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYwMDQwZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9zZXItbWFjLmMKQEAgLTAsMCArMSwzNjIgQEAKKy8qIFJlbW90ZSBzZXJpYWwgaW50ZXJmYWNlIGZvciBsb2NhbCAoaGFyZHdpcmVkKSBzZXJpYWwgcG9ydHMgZm9yIE1hY2ludG9zaC4KKyAgIENvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuICBXcml0dGVuIGJ5IFN0YW4gU2hlYnMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJzZXJpYWwuaCIKKworI2luY2x1ZGUgPFR5cGVzLmg+CisjaW5jbHVkZSA8RGV2aWNlcy5oPgorLyogVGhpcyBpcyB0aGUgcmVndWxhciBNYWMgU2VyaWFsLmgsIGJ1dCBjb3BpZWQgdG8gYSBkaWZmZXJlbnQgbmFtZQorICAgc28gYXMgbm90IHRvIGdldCBjb25mdXNlZCB3aXRoIHRoZSBHREIgc2VyaWFsLmggYWJvdmUuICAqLworI2luY2x1ZGUgIk1hY1NlcmlhbC5oIgorCisvKiBUaGlzIGlzIHVudXNlZCBmb3Igbm93LiAgV2UganVzdCByZXR1cm4gYSBwbGFjZWhvbGRlci4gKi8KKworc3RydWN0IG1hY190dHlzdGF0ZQorICB7CisgICAgaW50IGJvZ3VzOworICB9OworCitzdGF0aWMgaW50IG1hY19vcGVuIFBBUkFNUyAoKHNlcmlhbF90IHNjYiwgY29uc3QgY2hhciAqbmFtZSkpOworc3RhdGljIHZvaWQgbWFjX3JhdyBQQVJBTVMgKChzZXJpYWxfdCBzY2IpKTsKK3N0YXRpYyBpbnQgbWFjX3JlYWRjaGFyIFBBUkFNUyAoKHNlcmlhbF90IHNjYiwgaW50IHRpbWVvdXQpKTsKK3N0YXRpYyBpbnQgbWFjX3NldGJhdWRyYXRlIFBBUkFNUyAoKHNlcmlhbF90IHNjYiwgaW50IHJhdGUpKTsKK3N0YXRpYyBpbnQgbWFjX3dyaXRlIFBBUkFNUyAoKHNlcmlhbF90IHNjYiwgY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKSk7CitzdGF0aWMgdm9pZCBtYWNfY2xvc2UgUEFSQU1TICgoc2VyaWFsX3Qgc2NiKSk7CitzdGF0aWMgc2VyaWFsX3R0eXN0YXRlIG1hY19nZXRfdHR5X3N0YXRlIFBBUkFNUyAoKHNlcmlhbF90IHNjYikpOworc3RhdGljIGludCBtYWNfc2V0X3R0eV9zdGF0ZSBQQVJBTVMgKChzZXJpYWxfdCBzY2IsIHNlcmlhbF90dHlzdGF0ZSBzdGF0ZSkpOworc3RhdGljIGNoYXIgKmFwdHIgUEFSQU1TICgoc2hvcnQgcCkpOworCitzaG9ydCBpbnB1dF9yZWZudW07CitzaG9ydCBvdXRwdXRfcmVmbnVtOworCitjaGFyICptYWNfaW5wdXRfYnVmZmVyOworY2hhciAqbWFjX291dHB1dF9idWZmZXI7CisKK3N0YXRpYyBpbnQKK21hY19vcGVuIChzY2IsIG5hbWUpCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgT1NFcnIgZXJyOworCisgIC8qIEFsbG9jIGJ1ZmZlciBzcGFjZSBmaXJzdCAtIHRoYXQgd2F5IGFueSBhbGxvY2F0aW9uIGZhaWx1cmVzIGFyZQorICAgICBpbnRlcmNlcHRlZCBiZWZvcmUgdGhlIHNlcmlhbCBkcml2ZXIgZ2V0cyBpbnZvbHZlZC4gKi8KKyAgaWYgKG1hY19pbnB1dF9idWZmZXIgPT0gTlVMTCkKKyAgICBtYWNfaW5wdXRfYnVmZmVyID0gKGNoYXIgKikgeG1hbGxvYyAoNDA5Nik7CisgIC8qIE1hdGNoIG9uIGEgbmFtZSBhbmQgb3BlbiBhIHBvcnQuICovCisgIGlmIChzdHJjbXAgKG5hbWUsICJtb2RlbSIpID09IDApCisgICAgeworICAgICAgZXJyID0gT3BlbkRyaXZlciAoIlxwLkFJbiIsICZpbnB1dF9yZWZudW0pOworICAgICAgaWYgKGVyciAhPSAwKQorCXsKKwkgIHJldHVybiAoLTEpOworCX0KKyAgICAgIGVyciA9IE9wZW5Ecml2ZXIgKCJccC5BT3V0IiwgJm91dHB1dF9yZWZudW0pOworICAgICAgaWYgKGVyciAhPSAwKQorCXsKKwkgIENsb3NlRHJpdmVyIChpbnB1dF9yZWZudW0pOworCSAgcmV0dXJuICgtMSk7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAicHJpbnRlciIpID09IDApCisgICAgeworICAgICAgZXJyID0gT3BlbkRyaXZlciAoIlxwLkJJbiIsICZpbnB1dF9yZWZudW0pOworICAgICAgaWYgKGVyciAhPSAwKQorCXsKKwkgIHJldHVybiAoLTEpOworCX0KKyAgICAgIGVyciA9IE9wZW5Ecml2ZXIgKCJccC5CT3V0IiwgJm91dHB1dF9yZWZudW0pOworICAgICAgaWYgKGVyciAhPSAwKQorCXsKKwkgIENsb3NlRHJpdmVyIChpbnB1dF9yZWZudW0pOworCSAgcmV0dXJuICgtMSk7CisJfQorICAgICAgLyogZmFrZSAqLworICAgICAgc2NiLT5mZCA9IDE7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBlcnJvciAoIllvdSBtdXN0IHNwZWNpZnkgYSB2YWxpZCBzZXJpYWwgcG9ydCBuYW1lOyB5b3VyIGNob2ljZXMgYXJlIGBtb2RlbScgb3IgYHByaW50ZXInLiIpOworICAgICAgZXJybm8gPSBFTk9FTlQ7CisgICAgICByZXR1cm4gKC0xKTsKKyAgICB9CisgIC8qIFdlIGdvdCBzb21ldGhpbmcgb3Blbi4gKi8KKyAgaWYgKDEgLyogdXNpbmcgY3VzdG9tIGJ1ZmZlciAqLykKKyAgICBTZXJTZXRCdWYgKGlucHV0X3JlZm51bSwgbWFjX2lucHV0X2J1ZmZlciwgNDA5Nik7CisgIC8qIFNldCB0byBhIEdEQi1wcmVmZXJyZWQgc3RhdGUuICovCisgIFNlclJlc2V0IChpbnB1dF9yZWZudW0sICBzdG9wMTB8bm9QYXJpdHl8ZGF0YTh8YmF1ZDk2MDApOworICBTZXJSZXNldCAob3V0cHV0X3JlZm51bSwgc3RvcDEwfG5vUGFyaXR5fGRhdGE4fGJhdWQ5NjAwKTsKKyAgeworICAgIENudHJsUGFyYW0gY2I7CisgICAgc3RydWN0IFNlclNoayAqaGFuZHNoYWtlOworCisgICAgY2IuaW9DUmVmTnVtID0gb3V0cHV0X3JlZm51bTsKKyAgICBjYi5jc0NvZGUgPSAxNDsKKyAgICBoYW5kc2hha2UgPSAoc3RydWN0IFNlclNoayAqKSAmY2IuY3NQYXJhbVswXTsKKyAgICBoYW5kc2hha2UtPmZYT24gPSAwOworICAgIGhhbmRzaGFrZS0+ZkNUUyA9IDA7CisgICAgaGFuZHNoYWtlLT54T24gPSAwOworICAgIGhhbmRzaGFrZS0+eE9mZiA9IDA7CisgICAgaGFuZHNoYWtlLT5lcnJzID0gMDsKKyAgICBoYW5kc2hha2UtPmV2dHMgPSAwOworICAgIGhhbmRzaGFrZS0+ZkluWCA9IDA7CisgICAgaGFuZHNoYWtlLT5mRFRSID0gMDsKKyAgICBlcnIgPSBQQkNvbnRyb2wgKChQYXJtQmxrUHRyKSAmY2IsIDApOworICAgIGlmIChlcnIgPCAwKQorICAgICAgcmV0dXJuICgtMSk7CisgIH0KKyAgLyogZmFrZSAqLworICBzY2ItPmZkID0gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK21hY19ub29wIChzY2IpCisgICAgIHNlcmlhbF90IHNjYjsKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCittYWNfcmF3IChzY2IpCisgICAgIHNlcmlhbF90IHNjYjsKK3sKKyAgLyogQWx3YXlzIGVmZmVjdGl2ZWx5IGluIHJhdyBtb2RlLiAqLworfQorCisvKiBSZWFkIGEgY2hhcmFjdGVyIHdpdGggdXNlci1zcGVjaWZpZWQgdGltZW91dC4gIFRJTUVPVVQgaXMgbnVtYmVyIG9mIHNlY29uZHMKKyAgIHRvIHdhaXQsIG9yIC0xIHRvIHdhaXQgZm9yZXZlci4gIFVzZSB0aW1lb3V0IG9mIDAgdG8gZWZmZWN0IGEgcG9sbC4gIFJldHVybnMKKyAgIGNoYXIgaWYgc3VjY2Vzc2Z1bC4gIFJldHVybnMgLTIgaWYgdGltZW91dCBleHBpcmVkLCBFT0YgaWYgbGluZSBkcm9wcGVkCisgICBkZWFkLCBvciAtMyBmb3IgYW55IG90aGVyIGVycm9yIChzZWUgZXJybm8gaW4gdGhhdCBjYXNlKS4gKi8KKworc3RhdGljIGludAorbWFjX3JlYWRjaGFyIChzY2IsIHRpbWVvdXQpCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgaW50IHRpbWVvdXQ7Cit7CisgIGludCBzdGF0dXMsIG47CisgIC8qIHRpbWVfdCAqLyB1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWUsIG5vdzsKKyAgT1NFcnIgZXJyOworICBDbnRybFBhcmFtIGNiOworICBJT1BhcmFtIHBiOworCisgIGlmIChzY2ItPmJ1ZmNudC0tID4gMCkKKyAgICByZXR1cm4gKnNjYi0+YnVmcCsrOworCisgIHRpbWUgKCZzdGFydF90aW1lKTsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBjYi5pb0NSZWZOdW0gPSBpbnB1dF9yZWZudW07CisgICAgICBjYi5jc0NvZGUgPSAyOworICAgICAgZXJyID0gUEJTdGF0dXMgKChQYXJtQmxrUHRyKSAmY2IsIDApOworICAgICAgaWYgKGVyciA8IDApCisJcmV0dXJuIFNFUklBTF9FUlJPUjsKKyAgICAgIG4gPSAqKChsb25nICopICZjYi5jc1BhcmFtWzBdKTsKKyAgICAgIGlmIChuID4gMCkKKwl7CisJICBwYi5pb1JlZk51bSA9IGlucHV0X3JlZm51bTsKKwkgIHBiLmlvQnVmZmVyID0gKFB0cikgKHNjYi0+YnVmKTsKKwkgIHBiLmlvUmVxQ291bnQgPSAobiA+IDY0ID8gNjQgOiBuKTsKKwkgIGVyciA9IFBCUmVhZCAoKFBhcm1CbGtQdHIpICZwYiwgMCk7CisJICBpZiAoZXJyIDwgMCkKKwkgICAgcmV0dXJuIFNFUklBTF9FUlJPUjsKKwkgIHNjYi0+YnVmY250ID0gcGIuaW9SZXFDb3VudDsKKwkgIHNjYi0+YnVmY250LS07CisJICBzY2ItPmJ1ZnAgPSBzY2ItPmJ1ZjsKKwkgIHJldHVybiAqc2NiLT5idWZwKys7CisJfQorICAgICAgZWxzZSBpZiAodGltZW91dCA9PSAwKQorCXJldHVybiBTRVJJQUxfVElNRU9VVDsKKyAgICAgIGVsc2UgaWYgKHRpbWVvdXQgPT0gLTEpCisJOworICAgICAgZWxzZQorCXsKKwkgIHRpbWUgKCZub3cpOworCSAgaWYgKG5vdyA+IHN0YXJ0X3RpbWUgKyB0aW1lb3V0KQorCSAgICByZXR1cm4gU0VSSUFMX1RJTUVPVVQ7CisJfQorICAgICAgUFJPR1JFU1MgKDEpOworICAgIH0KK30KKworLyogbWFjX3tnZXQgc2V0fV90dHlfc3RhdGUoKSBhcmUgYm90aCBkdW1teXMgdG8gZmlsbCBvdXQgdGhlIGZ1bmN0aW9uCisgICB2ZWN0b3IuICBTb21lZGF5LCB0aGV5IG1heSBkbyBzb21ldGhpbmcgcmVhbC4uLiAqLworCitzdGF0aWMgc2VyaWFsX3R0eXN0YXRlCittYWNfZ2V0X3R0eV9zdGF0ZSAoc2NiKQorICAgICBzZXJpYWxfdCBzY2I7Cit7CisgIHN0cnVjdCBtYWNfdHR5c3RhdGUgKnN0YXRlOworCisgIHN0YXRlID0gKHN0cnVjdCBtYWNfdHR5c3RhdGUgKikgeG1hbGxvYyAoc2l6ZW9mICpzdGF0ZSk7CisKKyAgcmV0dXJuIChzZXJpYWxfdHR5c3RhdGUpIHN0YXRlOworfQorCitzdGF0aWMgaW50CittYWNfc2V0X3R0eV9zdGF0ZSAoc2NiLCB0dHlzdGF0ZSkKKyAgICAgc2VyaWFsX3Qgc2NiOworICAgICBzZXJpYWxfdHR5c3RhdGUgdHR5c3RhdGU7Cit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CittYWNfbm9mbHVzaF9zZXRfdHR5X3N0YXRlIChzY2IsIG5ld190dHlzdGF0ZSwgb2xkX3R0eXN0YXRlKQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIHNlcmlhbF90dHlzdGF0ZSBuZXdfdHR5c3RhdGU7CisgICAgIHNlcmlhbF90dHlzdGF0ZSBvbGRfdHR5c3RhdGU7Cit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbWFjX3ByaW50X3R0eV9zdGF0ZSAoc2NiLCB0dHlzdGF0ZSkKKyAgICAgc2VyaWFsX3Qgc2NiOworICAgICBzZXJpYWxfdHR5c3RhdGUgdHR5c3RhdGU7Cit7CisgIC8qIE5vdGhpbmcgdG8gcHJpbnQuICAqLworICByZXR1cm47Cit9CisKKy8qIElmIHRoZXJlIGlzIGEgdHJpY2t5IGZvcm11bGEgdG8gcmVsYXRlIHJlYWwgYmF1ZCByYXRlcworICAgdG8gd2hhdCB0aGUgc2VyaWFsIGRyaXZlciB3YW50cywgd2Ugc2hvdWxkIHVzZSBpdC4gIFVudGlsCisgICB3ZSBnZXQgb25lLCB0aGlzIHRhYmxlIHdpbGwgaGF2ZSB0byBkby4gICovCisKK3N0YXRpYyBzdHJ1Y3QgeworICBpbnQgcmVhbF9yYXRlOworICBpbnQgYml0czsKK30gbWFjX2JhdWRfcmF0ZV90YWJsZVtdID0geworICB7IDU3NjAwLCBiYXVkNTc2MDAgfSwKKyAgeyAzODQwMCwgMSB9LAorICB7IDE5MjAwLCBiYXVkMTkyMDAgfSwKKyAgeyA5NjAwLCBiYXVkOTYwMCB9LAorICB7IDcyMDAsIGJhdWQ3MjAwIH0sCisgIHsgNDgwMCwgYmF1ZDQ4MDAgfSwKKyAgeyAzNjAwLCBiYXVkMzYwMCB9LAorICB7IDI0MDAsIGJhdWQyNDAwIH0sCisgIHsgMTgwMCwgYmF1ZDE4MDAgfSwKKyAgeyAxMjAwLCBiYXVkMTIwMCB9LAorICB7IDYwMCwgYmF1ZDYwMCB9LAorICB7IDMwMCwgYmF1ZDMwMCB9LAorICB7IDAsIDAgfQorfTsKKworc3RhdGljIGludAorbWFjX3NldF9iYXVkX3JhdGUgKHNjYiwgcmF0ZSkKKyAgICAgc2VyaWFsX3Qgc2NiOworICAgICBpbnQgcmF0ZTsKK3sKKyAgaW50IGksIGJpdHM7CisKKyAgZm9yIChpID0gMDsgbWFjX2JhdWRfcmF0ZV90YWJsZVtpXS5yZWFsX3JhdGUgIT0gMDsgKytpKQorICAgIHsKKyAgICAgIGlmIChtYWNfYmF1ZF9yYXRlX3RhYmxlW2ldLnJlYWxfcmF0ZSA9PSByYXRlKQorCXsKKwkgIGJpdHMgPSBtYWNfYmF1ZF9yYXRlX3RhYmxlW2ldLmJpdHM7CisJICBicmVhazsKKwl9CisgICAgfQorICBTZXJSZXNldCAoaW5wdXRfcmVmbnVtLCAgc3RvcDEwfG5vUGFyaXR5fGRhdGE4fGJpdHMpOworICBTZXJSZXNldCAob3V0cHV0X3JlZm51bSwgc3RvcDEwfG5vUGFyaXR5fGRhdGE4fGJpdHMpOworfQorCitzdGF0aWMgaW50CittYWNfc2V0X3N0b3BfYml0cyAoc2NiLCBudW0pCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgaW50IG51bTsKK3sKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBmaXJzdF9tYWNfd3JpdGUgPSAwOworCitzdGF0aWMgaW50CittYWNfd3JpdGUgKHNjYiwgc3RyLCBsZW4pCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgY29uc3QgY2hhciAqc3RyOworICAgICBpbnQgbGVuOworeworICBPU0VyciBlcnI7CisgIElPUGFyYW0gcGI7CisKKyAgaWYgKGZpcnN0X21hY193cml0ZSsrIDwgNCkKKyAgICB7CisgICAgICBzbGVlcCAoMSk7CisgICAgfQorICBwYi5pb1JlZk51bSA9IG91dHB1dF9yZWZudW07CisgIHBiLmlvQnVmZmVyID0gKFB0cikgc3RyOworICBwYi5pb1JlcUNvdW50ID0gbGVuOworICBlcnIgPSBQQldyaXRlICgoUGFybUJsa1B0cikgJnBiLCAwKTsKKyAgaWYgKGVyciA8IDApCisgICAgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK21hY19jbG9zZSAoc2VyaWFsX3Qgc2NiKQoreworICBpZiAoaW5wdXRfcmVmbnVtKQorICAgIHsKKyAgICAgIGlmICgxIC8qIGN1c3RvbSBidWZmZXIgKi8pCisJU2VyU2V0QnVmIChpbnB1dF9yZWZudW0sIG1hY19pbnB1dF9idWZmZXIsIDApOworICAgICAgQ2xvc2VEcml2ZXIgKGlucHV0X3JlZm51bSk7CisgICAgICBpbnB1dF9yZWZudW0gPSAwOworICAgIH0KKyAgaWYgKG91dHB1dF9yZWZudW0pCisgICAgeworICAgICAgaWYgKDAgLyogY3VzdG9tIGJ1ZmZlciAqLykKKwlTZXJTZXRCdWYgKGlucHV0X3JlZm51bSwgbWFjX291dHB1dF9idWZmZXIsIDApOworICAgICAgQ2xvc2VEcml2ZXIgKG91dHB1dF9yZWZudW0pOworICAgICAgb3V0cHV0X3JlZm51bSA9IDA7CisgICAgfQorfQorCitzdGF0aWMgc3RydWN0IHNlcmlhbF9vcHMgbWFjX29wcyA9Cit7CisgICJoYXJkd2lyZSIsCisgIDAsCisgIG1hY19vcGVuLAorICBtYWNfY2xvc2UsCisgIG1hY19yZWFkY2hhciwKKyAgbWFjX3dyaXRlLAorICBtYWNfbm9vcCwJCQkvKiBmbHVzaCBvdXRwdXQgKi8KKyAgbWFjX25vb3AsCQkJLyogZmx1c2ggaW5wdXQgKi8KKyAgbWFjX25vb3AsCQkJLyogc2VuZCBicmVhayAtLSBjdXJyZW50bHkgb25seSBmb3IgbmluZHkgKi8KKyAgbWFjX3JhdywKKyAgbWFjX2dldF90dHlfc3RhdGUsCisgIG1hY19zZXRfdHR5X3N0YXRlLAorICBtYWNfcHJpbnRfdHR5X3N0YXRlLAorICBtYWNfbm9mbHVzaF9zZXRfdHR5X3N0YXRlLAorICBtYWNfc2V0X2JhdWRfcmF0ZSwKKyAgbWFjX3NldF9zdG9wX2JpdHMsCisgIG1hY19ub29wLAkJCS8qIHdhaXQgZm9yIG91dHB1dCB0byBkcmFpbiAqLworfTsKKwordm9pZAorX2luaXRpYWxpemVfc2VyX21hYyAoKQoreworICBzZXJpYWxfYWRkX2ludGVyZmFjZSAoJm1hY19vcHMpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Nlci1vY2QuYyBiL2dkYi9zZXItb2NkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcxZjg0ZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9zZXItb2NkLmMKQEAgLTAsMCArMSwyMDkgQEAKKy8qIFJlbW90ZSBzZXJpYWwgaW50ZXJmYWNlIGZvciBNYWNyYWlnb3IgU3lzdGVtcyBpbXBsZW1lbnRhdGlvbiBvZgorCU9uLUNoaXAgRGVidWdnaW5nIHVzaW5nIHNlcmlhbCB0YXJnZXQgYm94IG9yIHNlcmlhbCB3aWdnbGVyCisKKyAgIENvcHlyaWdodCAxOTk0LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic2VyaWFsLmgiCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworc3RhdGljIGludCBzZXJfb2NkX29wZW4gUEFSQU1TICgoc2VyaWFsX3Qgc2NiLCBjb25zdCBjaGFyICpuYW1lKSk7CitzdGF0aWMgdm9pZCBzZXJfb2NkX3JhdyBQQVJBTVMgKChzZXJpYWxfdCBzY2IpKTsKK3N0YXRpYyBpbnQgc2VyX29jZF9yZWFkY2hhciBQQVJBTVMgKChzZXJpYWxfdCBzY2IsIGludCB0aW1lb3V0KSk7CitzdGF0aWMgaW50IHNlcl9vY2Rfc2V0YmF1ZHJhdGUgUEFSQU1TICgoc2VyaWFsX3Qgc2NiLCBpbnQgcmF0ZSkpOworc3RhdGljIGludCBzZXJfb2NkX3dyaXRlIFBBUkFNUyAoKHNlcmlhbF90IHNjYiwgY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKSk7CitzdGF0aWMgdm9pZCBzZXJfb2NkX2Nsb3NlIFBBUkFNUyAoKHNlcmlhbF90IHNjYikpOworc3RhdGljIHNlcmlhbF90dHlzdGF0ZSBzZXJfb2NkX2dldF90dHlfc3RhdGUgUEFSQU1TICgoc2VyaWFsX3Qgc2NiKSk7CitzdGF0aWMgaW50IHNlcl9vY2Rfc2V0X3R0eV9zdGF0ZSBQQVJBTVMgKChzZXJpYWxfdCBzY2IsIHNlcmlhbF90dHlzdGF0ZSBzdGF0ZSkpOworCisjaWZkZWYgX1dJTjMyCisvKiBPbiBXaW5kb3dzLCB0aGlzIGZ1bmN0aW9uIHBvaW50ZXIgaXMgaW5pdGlhbGl6ZWQgdG8gYSBmdW5jdGlvbiBpbgorICAgdGhlIHdpZ2dsZXIgRExMLiAgKi8KK3N0YXRpYyBpbnQgKCpkbGxfZG9fY29tbWFuZCkgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjaGFyICopKTsKKyNlbmRpZgorCitzdGF0aWMgaW50CitvY2Rfb3BlbiAoc2NiLCBuYW1lKQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisjaWZkZWYgX1dJTjMyCisgIC8qIEZpbmQgdGhlIHdpZ2dsZXIgRExMIHdoaWNoIHRhbGtzIHRvIHRoZSBib2FyZC4gICovCisgIGlmIChkbGxfZG9fY29tbWFuZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIEhJTlNUQU5DRSBoYW5kbGU7CisKKyAgICAgIC8qIEZJWE1FOiBTaG91bGQgdGhlIHVzZXIgYmUgYWJsZSB0byBjb25maWd1cmUgdGhpcz8gICovCisgICAgICBoYW5kbGUgPSBMb2FkTGlicmFyeSAoIldpZ2dsZXJzLmRsbCIpOworICAgICAgaWYgKGhhbmRsZSA9PSBOVUxMKQorCWVycm9yICgiQ2FuJ3QgbG9hZCBXaWdnbGVycy5kbGwiKTsKKworICAgICAgZGxsX2RvX2NvbW1hbmQgPSAoKGludCAoKikgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjaGFyICopKSkKKwkJCUdldFByb2NBZGRyZXNzIChoYW5kbGUsICJkb19jb21tYW5kIikpOworICAgICAgaWYgKGRsbF9kb19jb21tYW5kID09IE5VTEwpCisJZXJyb3IgKCJDYW4ndCBmaW5kIGRvX2NvbW1hbmQgZnVuY3Rpb24gaW4gV2lnZ2xlcnMuZGxsIik7CisgICAgfQorI2Vsc2UKKyAgLyogTm8gd2lnZ2xlciBETExzIG9uIFVuaXggeWV0LCBmYWlsLiAgKi8KKyAgZXJyb3IgKCJXaWdnbGVyIGxpYnJhcnkgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyB0eXBlIG9mIGhvc3QuIik7CisjZW5kaWYgLyogX1dJTjMyICovCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitvY2Rfbm9vcCAoc2NiKQorICAgICBzZXJpYWxfdCBzY2I7Cit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorb2NkX3JhdyAoc2NiKQorICAgICBzZXJpYWxfdCBzY2I7Cit7CisgIC8qIEFsd2F5cyBpbiByYXcgbW9kZSAqLworfQorCitzdGF0aWMgdm9pZAorb2NkX3JlYWRyZW1vdGUgKCkKK3sKK30KKworLyogV2UgbmVlZCBhIGJ1ZmZlciB0byBzdG9yZSByZXNwb25zZXMgZnJvbSB0aGUgV2lnZ2xlcnMuZGxsICovCisjZGVmaW5lIFdJR0dMRVJfQlVGRl9TSVpFIDUxMgordW5zaWduZWQgY2hhciBmcm9tX3dpZ2dsZXJfYnVmZmVyW1dJR0dMRVJfQlVGRl9TSVpFXTsKK3Vuc2lnbmVkIGNoYXIgKiB3aWdnbGVyX2J1ZmZlcl9wdHI7CS8qIGN1cnIgc3BvdCBpbiBidWZmZXIgKi8KKworc3RhdGljIGludAorb2NkX3JlYWRjaGFyIChzY2IsIHRpbWVvdXQpCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgaW50IHRpbWVvdXQ7Cit7CisgIC8qIENhdGNoIGF0dGVtcHRzIGF0IHJlYWRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKyAgaWYgKHdpZ2dsZXJfYnVmZmVyX3B0ciA+CisgICAgICAgICAgICAgIChmcm9tX3dpZ2dsZXJfYnVmZmVyICsgKHNpemVvZiAoY2hhciAqKSAqIFdJR0dMRVJfQlVGRl9TSVpFKSkpCisgICAgZXJyb3IgKCJvY2RfcmVhZGNoYXIgYXNrZWQgdG8gcmVhZCBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciEiKTsKKworICByZXR1cm4gKGludCkgKndpZ2dsZXJfYnVmZmVyX3B0cisrOyAvKiByZXR1cm4gY3VyciBjaGFyIGFuZCBpbmNyZW1lbnQgcHRyICovCit9CisKK3N0cnVjdCBvY2RfdHR5c3RhdGUgeworICBpbnQgZHVtbXk7Cit9OworCisvKiBvY2Rfe2dldCBzZXR9X3R0eV9zdGF0ZSgpIGFyZSBib3RoIGR1bW15cyB0byBmaWxsIG91dCB0aGUgZnVuY3Rpb24KKyAgIHZlY3Rvci4gIFNvbWVkYXksIHRoZXkgbWF5IGRvIHNvbWV0aGluZyByZWFsLi4uICovCisKK3N0YXRpYyBzZXJpYWxfdHR5c3RhdGUKK29jZF9nZXRfdHR5X3N0YXRlIChzY2IpCisgICAgIHNlcmlhbF90IHNjYjsKK3sKKyAgc3RydWN0IG9jZF90dHlzdGF0ZSAqc3RhdGU7CisKKyAgc3RhdGUgPSAoc3RydWN0IG9jZF90dHlzdGF0ZSAqKSB4bWFsbG9jIChzaXplb2YgKnN0YXRlKTsKKworICByZXR1cm4gKHNlcmlhbF90dHlzdGF0ZSkgc3RhdGU7Cit9CisKK3N0YXRpYyBpbnQKK29jZF9zZXRfdHR5X3N0YXRlIChzY2IsIHR0eXN0YXRlKQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIHNlcmlhbF90dHlzdGF0ZSB0dHlzdGF0ZTsKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK29jZF9ub2ZsdXNoX3NldF90dHlfc3RhdGUgKHNjYiwgbmV3X3R0eXN0YXRlLCBvbGRfdHR5c3RhdGUpCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgc2VyaWFsX3R0eXN0YXRlIG5ld190dHlzdGF0ZTsKKyAgICAgc2VyaWFsX3R0eXN0YXRlIG9sZF90dHlzdGF0ZTsKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitvY2RfcHJpbnRfdHR5X3N0YXRlIChzY2IsIHR0eXN0YXRlKQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIHNlcmlhbF90dHlzdGF0ZSB0dHlzdGF0ZTsKK3sKKyAgLyogTm90aGluZyB0byBwcmludC4gICovCisgIHJldHVybjsKK30KKworc3RhdGljIGludAorb2NkX3NldGJhdWRyYXRlIChzY2IsIHJhdGUpCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgaW50IHJhdGU7Cit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitvY2Rfd3JpdGUgKHNjYiwgc3RyLCBsZW4pCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgY29uc3QgY2hhciAqc3RyOworICAgICBpbnQgbGVuOworeworICBjaGFyIGM7CisKKyNpZmRlZiBfV0lOMzIgCisgIC8qIHNlbmQgcGFja2V0IHRvIFdpZ2dsZXJzLmRsbCBhbmQgc3RvcmUgcmVzcG9uc2Ugc28gd2UgY2FuIGdpdmUgaXQgdG8KKwlyZW1vdGUtd2lnZ2xlci5jIHdoZW4gZ2V0X3BhY2tldCBpcyBydW4gKi8KKyAgZGxsX2RvX2NvbW1hbmQgKHN0ciwgZnJvbV93aWdnbGVyX2J1ZmZlcik7CisgIHdpZ2dsZXJfYnVmZmVyX3B0ciA9IGZyb21fd2lnZ2xlcl9idWZmZXI7CisjZW5kaWYKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK29jZF9jbG9zZSAoc2NiKQorICAgICBzZXJpYWxfdCBzY2I7Cit7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VyaWFsX29wcyBvY2Rfb3BzID0KK3sKKyAgIm9jZCIsCisgIDAsCisgIG9jZF9vcGVuLAorICBvY2RfY2xvc2UsCisgIG9jZF9yZWFkY2hhciwKKyAgb2NkX3dyaXRlLAorICBvY2Rfbm9vcCwJCS8qIGZsdXNoIG91dHB1dCAqLworICBvY2Rfbm9vcCwJCS8qIGZsdXNoIGlucHV0ICovCisgIG9jZF9ub29wLAkJLyogc2VuZCBicmVhayAtLSBjdXJyZW50bHkgdXNlZCBvbmx5IGZvciBuaW5keSAqLworICBvY2RfcmF3LAorICBvY2RfZ2V0X3R0eV9zdGF0ZSwKKyAgb2NkX3NldF90dHlfc3RhdGUsCisgIG9jZF9wcmludF90dHlfc3RhdGUsCisgIG9jZF9ub2ZsdXNoX3NldF90dHlfc3RhdGUsCisgIG9jZF9zZXRiYXVkcmF0ZSwKKyAgb2NkX25vb3AsCQkvKiB3YWl0IGZvciBvdXRwdXQgdG8gZHJhaW4gKi8KK307CisKK3ZvaWQKK19pbml0aWFsaXplX3Nlcl9vY2RfYmRtICgpCit7CisgIHNlcmlhbF9hZGRfaW50ZXJmYWNlICgmb2NkX29wcyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvc2VyLXRjcC5jIGIvZ2RiL3Nlci10Y3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTUxMzM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Nlci10Y3AuYwpAQCAtMCwwICsxLDM1OCBAQAorLyogU2VyaWFsIGludGVyZmFjZSBmb3IgcmF3IFRDUCBjb25uZWN0aW9ucyBvbiBVbip4IGxpa2Ugc3lzdGVtcworICAgQ29weXJpZ2h0IDE5OTIsIDE5OTMsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJzZXJpYWwuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2lmbmRlZiBfX0NZR1dJTjMyX18KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzaWduYWxzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorCitzdHJ1Y3QgdGNwX3R0eXN0YXRlCit7CisgIGludCBib2d1czsKK307CisKK3N0YXRpYyBpbnQgdGNwX29wZW4gUEFSQU1TICgoc2VyaWFsX3Qgc2NiLCBjb25zdCBjaGFyICpuYW1lKSk7CitzdGF0aWMgdm9pZCB0Y3BfcmF3IFBBUkFNUyAoKHNlcmlhbF90IHNjYikpOworc3RhdGljIGludCB3YWl0X2ZvciBQQVJBTVMgKChzZXJpYWxfdCBzY2IsIGludCB0aW1lb3V0KSk7CitzdGF0aWMgaW50IHRjcF9yZWFkY2hhciBQQVJBTVMgKChzZXJpYWxfdCBzY2IsIGludCB0aW1lb3V0KSk7CitzdGF0aWMgaW50IHRjcF9zZXRiYXVkcmF0ZSBQQVJBTVMgKChzZXJpYWxfdCBzY2IsIGludCByYXRlKSk7CitzdGF0aWMgaW50IHRjcF9zZXRzdG9wYml0cyBQQVJBTVMgKChzZXJpYWxfdCBzY2IsIGludCBudW0pKTsKK3N0YXRpYyBpbnQgdGNwX3dyaXRlIFBBUkFNUyAoKHNlcmlhbF90IHNjYiwgY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKSk7CisvKiBGSVhNRTogc3RhdGljIHZvaWQgdGNwX3Jlc3RvcmUgUEFSQU1TICgoc2VyaWFsX3Qgc2NiKSk7ICovCitzdGF0aWMgdm9pZCB0Y3BfY2xvc2UgUEFSQU1TICgoc2VyaWFsX3Qgc2NiKSk7CitzdGF0aWMgc2VyaWFsX3R0eXN0YXRlIHRjcF9nZXRfdHR5X3N0YXRlIFBBUkFNUyAoKHNlcmlhbF90IHNjYikpOworc3RhdGljIGludCB0Y3Bfc2V0X3R0eV9zdGF0ZSBQQVJBTVMgKChzZXJpYWxfdCBzY2IsIHNlcmlhbF90dHlzdGF0ZSBzdGF0ZSkpOworc3RhdGljIGludCB0Y3BfcmV0dXJuXzAgUEFSQU1TICgoc2VyaWFsX3QpKTsKK3N0YXRpYyBpbnQgdGNwX25vZmx1c2hfc2V0X3R0eV9zdGF0ZSBQQVJBTVMgKChzZXJpYWxfdCwgc2VyaWFsX3R0eXN0YXRlLAorCQkJCQkgICAgICBzZXJpYWxfdHR5c3RhdGUpKTsKK3N0YXRpYyB2b2lkIHRjcF9wcmludF90dHlfc3RhdGUgUEFSQU1TICgoc2VyaWFsX3QsIHNlcmlhbF90dHlzdGF0ZSkpOworCit2b2lkIF9pbml0aWFsaXplX3Nlcl90Y3AgUEFSQU1TICgodm9pZCkpOworCisvKiBPcGVuIHVwIGEgcmF3IHRjcCBzb2NrZXQgKi8KKworc3RhdGljIGludAordGNwX29wZW4oc2NiLCBuYW1lKQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIGNoYXIgKnBvcnRfc3RyOworICBpbnQgcG9ydDsKKyAgc3RydWN0IGhvc3RlbnQgKmhvc3RlbnQ7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBzb2NrYWRkcjsKKyAgaW50IHRtcDsKKyAgY2hhciBob3N0bmFtZVsxMDBdOworICBzdHJ1Y3QgcHJvdG9lbnQgKnByb3RvZW50OworICBpbnQgaTsKKworICBwb3J0X3N0ciA9IHN0cmNociAobmFtZSwgJzonKTsKKworICBpZiAoIXBvcnRfc3RyKQorICAgIGVycm9yICgidGNwX29wZW46IE5vIGNvbG9uIGluIGhvc3QgbmFtZSEiKTsgLyogU2hvdWxkbid0IGV2ZXIgaGFwcGVuICovCisKKyAgdG1wID0gbWluIChwb3J0X3N0ciAtIG5hbWUsIChpbnQpIHNpemVvZiBob3N0bmFtZSAtIDEpOworICBzdHJuY3B5IChob3N0bmFtZSwgbmFtZSwgdG1wKTsgLyogRG9uJ3Qgd2FudCBjb2xvbiAqLworICBob3N0bmFtZVt0bXBdID0gJ1wwMDAnOwkvKiBUaWUgb2ZmIGhvc3QgbmFtZSAqLworICBwb3J0ID0gYXRvaSAocG9ydF9zdHIgKyAxKTsKKworICBob3N0ZW50ID0gZ2V0aG9zdGJ5bmFtZSAoaG9zdG5hbWUpOworCisgIGlmICghaG9zdGVudCkKKyAgICB7CisgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICIlczogdW5rbm93biBob3N0XG4iLCBob3N0bmFtZSk7CisgICAgICBlcnJubyA9IEVOT0VOVDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgZm9yIChpID0gMTsgaSA8PSAxNTsgaSsrKQorICAgIHsKKyAgICAgIHNjYi0+ZmQgPSBzb2NrZXQgKFBGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgICAgIGlmIChzY2ItPmZkIDwgMCkKKwlyZXR1cm4gLTE7CisKKyAgICAgIC8qIEFsbG93IHJhcGlkIHJldXNlIG9mIHRoaXMgcG9ydC4gKi8KKyAgICAgIHRtcCA9IDE7CisgICAgICBzZXRzb2Nrb3B0IChzY2ItPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChjaGFyICopJnRtcCwgc2l6ZW9mKHRtcCkpOworCisgICAgICAvKiBFbmFibGUgVENQIGtlZXAgYWxpdmUgcHJvY2Vzcy4gKi8KKyAgICAgIHRtcCA9IDE7CisgICAgICBzZXRzb2Nrb3B0IChzY2ItPmZkLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIChjaGFyICopJnRtcCwgc2l6ZW9mKHRtcCkpOworCisgICAgICBzb2NrYWRkci5zaW5fZmFtaWx5ID0gUEZfSU5FVDsKKyAgICAgIHNvY2thZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisgICAgICBtZW1jcHkgKCZzb2NrYWRkci5zaW5fYWRkci5zX2FkZHIsIGhvc3RlbnQtPmhfYWRkciwKKwkgICAgICBzaXplb2YgKHN0cnVjdCBpbl9hZGRyKSk7CisKKyAgICAgIGlmICghY29ubmVjdCAoc2NiLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc29ja2FkZHIsIHNpemVvZihzb2NrYWRkcikpKQorCWJyZWFrOworCisgICAgICBjbG9zZSAoc2NiLT5mZCk7CisgICAgICBzY2ItPmZkID0gLTE7CisKKy8qIFdlIHJldHJ5IGZvciBFQ09OTlJFRlVTRUQgYmVjYXVzZSB0aGF0IGlzIG9mdGVuIGEgdGVtcG9yYXJ5IGNvbmRpdGlvbiwgd2hpY2gKKyAgIGhhcHBlbnMgd2hlbiB0aGUgc2VydmVyIGlzIGJlaW5nIHJlc3RhcnRlZC4gICovCisKKyAgICAgIGlmIChlcnJubyAhPSBFQ09OTlJFRlVTRUQpCisJcmV0dXJuIC0xOworCisgICAgICBzbGVlcCAoMSk7CisgICAgfQorCisgIHByb3RvZW50ID0gZ2V0cHJvdG9ieW5hbWUgKCJ0Y3AiKTsKKyAgaWYgKCFwcm90b2VudCkKKyAgICByZXR1cm4gLTE7CisKKyAgdG1wID0gMTsKKyAgaWYgKHNldHNvY2tvcHQgKHNjYi0+ZmQsIHByb3RvZW50LT5wX3Byb3RvLCBUQ1BfTk9ERUxBWSwKKwkJICAoY2hhciAqKSZ0bXAsIHNpemVvZih0bXApKSkKKyAgICByZXR1cm4gLTE7CisKKyAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwkvKiBJZiB3ZSBkb24ndCBkbyB0aGlzLCB0aGVuIEdEQiBzaW1wbHkgZXhpdHMKKwkJCQkgICB3aGVuIHRoZSByZW1vdGUgc2lkZSBkaWVzLiAgKi8KKworICByZXR1cm4gMDsKK30KKworc3RhdGljIHNlcmlhbF90dHlzdGF0ZQordGNwX2dldF90dHlfc3RhdGUoc2NiKQorICAgICBzZXJpYWxfdCBzY2I7Cit7CisgIHN0cnVjdCB0Y3BfdHR5c3RhdGUgKnN0YXRlOworCisgIHN0YXRlID0gKHN0cnVjdCB0Y3BfdHR5c3RhdGUgKil4bWFsbG9jKHNpemVvZiAqc3RhdGUpOworCisgIHJldHVybiAoc2VyaWFsX3R0eXN0YXRlKXN0YXRlOworfQorCitzdGF0aWMgaW50Cit0Y3Bfc2V0X3R0eV9zdGF0ZShzY2IsIHR0eXN0YXRlKQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIHNlcmlhbF90dHlzdGF0ZSB0dHlzdGF0ZTsKK3sKKyAgc3RydWN0IHRjcF90dHlzdGF0ZSAqc3RhdGU7CisKKyAgc3RhdGUgPSAoc3RydWN0IHRjcF90dHlzdGF0ZSAqKXR0eXN0YXRlOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0Y3BfcmV0dXJuXzAgKHNjYikKKyAgICAgc2VyaWFsX3Qgc2NiOworeworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3RjcF9yYXcoc2NiKQorICAgICBzZXJpYWxfdCBzY2I7Cit7CisgIHJldHVybjsJCQkvKiBBbHdheXMgaW4gcmF3IG1vZGUgKi8KK30KKworLyogV2FpdCBmb3IgaW5wdXQgb24gc2NiLCB3aXRoIHRpbWVvdXQgc2Vjb25kcy4gIFJldHVybnMgMCBvbiBzdWNjZXNzLAorICAgb3RoZXJ3aXNlIFNFUklBTF9USU1FT1VUIG9yIFNFUklBTF9FUlJPUi4KKworICAgRm9yIHRlcm1pb3tzfSwgd2UgYWN0dWFsbHkganVzdCBzZXR1cCBWVElNRSBpZiBuZWNlc3NhcnksIGFuZCBsZXQgdGhlCisgICB0aW1lb3V0IG9jY3VyIGluIHRoZSByZWFkKCkgaW4gdGNwX3JlYWQoKS4KKyAqLworCitzdGF0aWMgaW50Cit3YWl0X2ZvciAoc2NiLCB0aW1lb3V0KQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIGludCB0aW1lb3V0OworeworICBpbnQgbnVtZmRzOworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgZmRfc2V0IHJlYWRmZHMsIGV4Y2VwdGZkczsKKworICBGRF9aRVJPICgmcmVhZGZkcyk7CisgIEZEX1pFUk8gKCZleGNlcHRmZHMpOworCisgIHR2LnR2X3NlYyA9IHRpbWVvdXQ7CisgIHR2LnR2X3VzZWMgPSAwOworCisgIEZEX1NFVChzY2ItPmZkLCAmcmVhZGZkcyk7CisgIEZEX1NFVChzY2ItPmZkLCAmZXhjZXB0ZmRzKTsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAodGltZW91dCA+PSAwKQorCW51bWZkcyA9IHNlbGVjdChzY2ItPmZkKzEsICZyZWFkZmRzLCAwLCAmZXhjZXB0ZmRzLCAmdHYpOworICAgICAgZWxzZQorCW51bWZkcyA9IHNlbGVjdChzY2ItPmZkKzEsICZyZWFkZmRzLCAwLCAmZXhjZXB0ZmRzLCAwKTsKKworICAgICAgaWYgKG51bWZkcyA8PSAwKQorICAgICAgICB7CisJICBpZiAobnVtZmRzID09IDApCisJICAgIHJldHVybiBTRVJJQUxfVElNRU9VVDsKKwkgIGVsc2UgaWYgKGVycm5vID09IEVJTlRSKQorCSAgICBjb250aW51ZTsKKwkgIGVsc2UKKwkgICAgcmV0dXJuIFNFUklBTF9FUlJPUjsJLyogR290IGFuIGVycm9yIGZyb20gc2VsZWN0IG9yIHBvbGwgKi8KKyAgICAgICAgfQorCisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qIFJlYWQgYSBjaGFyYWN0ZXIgd2l0aCB1c2VyLXNwZWNpZmllZCB0aW1lb3V0LiAgVElNRU9VVCBpcyBudW1iZXIgb2Ygc2Vjb25kcworICAgdG8gd2FpdCwgb3IgLTEgdG8gd2FpdCBmb3JldmVyLiAgVXNlIHRpbWVvdXQgb2YgMCB0byBlZmZlY3QgYSBwb2xsLiAgUmV0dXJucworICAgY2hhciBpZiBzdWNjZXNzZnVsLiAgUmV0dXJucyAtMiBpZiB0aW1lb3V0IGV4cGlyZWQsIEVPRiBpZiBsaW5lIGRyb3BwZWQKKyAgIGRlYWQsIG9yIC0zIGZvciBhbnkgb3RoZXIgZXJyb3IgKHNlZSBlcnJubyBpbiB0aGF0IGNhc2UpLiAqLworCitzdGF0aWMgaW50Cit0Y3BfcmVhZGNoYXIgKHNjYiwgdGltZW91dCkKKyAgICAgc2VyaWFsX3Qgc2NiOworICAgICBpbnQgdGltZW91dDsKK3sKKyAgaW50IHN0YXR1czsKKworICBpZiAoc2NiLT5idWZjbnQtLSA+IDApCisgICAgcmV0dXJuICpzY2ItPmJ1ZnArKzsKKworICBzdGF0dXMgPSB3YWl0X2ZvcihzY2IsIHRpbWVvdXQpOworCisgIGlmIChzdGF0dXMgPCAwKQorICAgIHJldHVybiBzdGF0dXM7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgc2NiLT5idWZjbnQgPSByZWFkKHNjYi0+ZmQsIHNjYi0+YnVmLCBCVUZTSVopOworICAgICAgaWYgKHNjYi0+YnVmY250ICE9IC0xIHx8IGVycm5vICE9IEVJTlRSKQorCWJyZWFrOworICAgIH0KKworICBpZiAoc2NiLT5idWZjbnQgPD0gMCkKKyAgICB7CisgICAgICBpZiAoc2NiLT5idWZjbnQgPT0gMCkKKyAgICAgICAgcmV0dXJuIFNFUklBTF9USU1FT1VUOwkvKiAwIGNoYXJzIG1lYW5zIHRpbWVvdXQgW21heSBuZWVkIHRvCisJCQkJICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIEVPRiAmIHRpbWVvdXRzCisJCQkJICAgICBzb21lZGF5XSAqLworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gU0VSSUFMX0VSUk9SOwkvKiBHb3QgYW4gZXJyb3IgZnJvbSByZWFkICovCisgICAgfQorCisgIHNjYi0+YnVmY250LS07CisgIHNjYi0+YnVmcCA9IHNjYi0+YnVmOworICByZXR1cm4gKnNjYi0+YnVmcCsrOworfQorCitzdGF0aWMgaW50Cit0Y3Bfbm9mbHVzaF9zZXRfdHR5X3N0YXRlIChzY2IsIG5ld190dHlzdGF0ZSwgb2xkX3R0eXN0YXRlKQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIHNlcmlhbF90dHlzdGF0ZSBuZXdfdHR5c3RhdGU7CisgICAgIHNlcmlhbF90dHlzdGF0ZSBvbGRfdHR5c3RhdGU7Cit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAordGNwX3ByaW50X3R0eV9zdGF0ZSAoc2NiLCB0dHlzdGF0ZSkKKyAgICAgc2VyaWFsX3Qgc2NiOworICAgICBzZXJpYWxfdHR5c3RhdGUgdHR5c3RhdGU7Cit7CisgIC8qIE5vdGhpbmcgdG8gcHJpbnQuICAqLworICByZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK3RjcF9zZXRiYXVkcmF0ZShzY2IsIHJhdGUpCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgaW50IHJhdGU7Cit7CisgIHJldHVybiAwOwkJCS8qIE5ldmVyIGZhaWxzISAqLworfQorCitzdGF0aWMgaW50Cit0Y3Bfc2V0c3RvcGJpdHMoc2NiLCBudW0pCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgaW50IG51bTsKK3sKKyAgcmV0dXJuIDA7CQkJLyogTmV2ZXIgZmFpbHMhICovCit9CisKK3N0YXRpYyBpbnQKK3RjcF93cml0ZShzY2IsIHN0ciwgbGVuKQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIGNvbnN0IGNoYXIgKnN0cjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaW50IGNjOworCisgIHdoaWxlIChsZW4gPiAwKQorICAgIHsKKyAgICAgIGNjID0gd3JpdGUoc2NiLT5mZCwgc3RyLCBsZW4pOworCisgICAgICBpZiAoY2MgPCAwKQorCXJldHVybiAxOworICAgICAgbGVuIC09IGNjOworICAgICAgc3RyICs9IGNjOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit0Y3BfY2xvc2Uoc2NiKQorICAgICBzZXJpYWxfdCBzY2I7Cit7CisgIGlmIChzY2ItPmZkIDwgMCkKKyAgICByZXR1cm47CisKKyAgY2xvc2Uoc2NiLT5mZCk7CisgIHNjYi0+ZmQgPSAtMTsKK30KKworc3RhdGljIHN0cnVjdCBzZXJpYWxfb3BzIHRjcF9vcHMgPQoreworICAidGNwIiwKKyAgMCwKKyAgdGNwX29wZW4sCisgIHRjcF9jbG9zZSwKKyAgdGNwX3JlYWRjaGFyLAorICB0Y3Bfd3JpdGUsCisgIHRjcF9yZXR1cm5fMCwgLyogZmx1c2ggb3V0cHV0ICovCisgIHRjcF9yZXR1cm5fMCwgLyogZmx1c2ggaW5wdXQgKi8KKyAgdGNwX3JldHVybl8wLCAvKiBzZW5kIGJyZWFrICovCisgIHRjcF9yYXcsCisgIHRjcF9nZXRfdHR5X3N0YXRlLAorICB0Y3Bfc2V0X3R0eV9zdGF0ZSwKKyAgdGNwX3ByaW50X3R0eV9zdGF0ZSwKKyAgdGNwX25vZmx1c2hfc2V0X3R0eV9zdGF0ZSwKKyAgdGNwX3NldGJhdWRyYXRlLAorICB0Y3Bfc2V0c3RvcGJpdHMsCisgIHRjcF9yZXR1cm5fMCwJLyogd2FpdCBmb3Igb3V0cHV0IHRvIGRyYWluICovCit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9zZXJfdGNwICgpCit7CisgIHNlcmlhbF9hZGRfaW50ZXJmYWNlICgmdGNwX29wcyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvc2VyLXVuaXguYyBiL2dkYi9zZXItdW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNzljOTQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvc2VyLXVuaXguYwpAQCAtMCwwICsxLDgwOCBAQAorLyogU2VyaWFsIGludGVyZmFjZSBmb3IgbG9jYWwgKGhhcmR3aXJlZCkgc2VyaWFsIHBvcnRzIG9uIFVuKnggbGlrZSBzeXN0ZW1zCisgICBDb3B5cmlnaHQgMTk5MiwgMTk5MywgMTk5NCwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgInNlcmlhbC5oIgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAidGVybWluYWwuaCIKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVEVSTUlPUworCitzdHJ1Y3QgaGFyZHdpcmVfdHR5c3RhdGUKK3sKKyAgc3RydWN0IHRlcm1pb3MgdGVybWlvczsKK307CisjZW5kaWYgLyogdGVybWlvcyAqLworCisjaWZkZWYgSEFWRV9URVJNSU8KKworLyogSXQgaXMgYmVsaWV2ZWQgdGhhdCBhbGwgc3lzdGVtcyB3aGljaCBoYXZlIGFkZGVkIGpvYiBjb250cm9sIHRvIFNWUjMKKyAgIChlLmcuIHNjbykgaGF2ZSBhbHNvIGFkZGVkIHRlcm1pb3MuICBFdmVuIGlmIG5vdCwgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQKKyAgIGFsbCB0aGUgdmFyaWF0aW9ucyAoVElPQ0dQR1JQIHZzLiBUQ0dFVFBHUlAsIGV0Yy4pIHdvdWxkIGJlIHByZXR0eQorICAgYmV3aWxkZXJpbmcuICBTbyB3ZSBkb24ndCBhdHRlbXB0IGl0LiAgKi8KKworc3RydWN0IGhhcmR3aXJlX3R0eXN0YXRlCit7CisgIHN0cnVjdCB0ZXJtaW8gdGVybWlvOworfTsKKyNlbmRpZiAvKiB0ZXJtaW8gKi8KKworI2lmZGVmIEhBVkVfU0dUVFkKKy8qIE5lZWRlZCBmb3IgdGhlIGNvZGUgd2hpY2ggdXNlcyBzZWxlY3QoKS4gIFdlIHdvdWxkIGluY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyAgIHRvbyBpZiBpdCBleGlzdGVkIG9uIGFsbCBzeXN0ZW1zLiAgKi8KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCitzdHJ1Y3QgaGFyZHdpcmVfdHR5c3RhdGUKK3sKKyAgc3RydWN0IHNndHR5YiBzZ3R0eWI7CisgIHN0cnVjdCB0Y2hhcnMgdGM7CisgIHN0cnVjdCBsdGNoYXJzIGx0YzsKKyAgLyogTGluZSBkaXNjaXBsaW5lIGZsYWdzLiAgKi8KKyAgaW50IGxtb2RlOworfTsKKyNlbmRpZiAvKiBzZ3R0eSAqLworCitzdGF0aWMgaW50IGhhcmR3aXJlX29wZW4gUEFSQU1TICgoc2VyaWFsX3Qgc2NiLCBjb25zdCBjaGFyICpuYW1lKSk7CitzdGF0aWMgdm9pZCBoYXJkd2lyZV9yYXcgUEFSQU1TICgoc2VyaWFsX3Qgc2NiKSk7CitzdGF0aWMgaW50IHdhaXRfZm9yIFBBUkFNUyAoKHNlcmlhbF90IHNjYiwgaW50IHRpbWVvdXQpKTsKK3N0YXRpYyBpbnQgaGFyZHdpcmVfcmVhZGNoYXIgUEFSQU1TICgoc2VyaWFsX3Qgc2NiLCBpbnQgdGltZW91dCkpOworc3RhdGljIGludCByYXRlX3RvX2NvZGUgUEFSQU1TICgoaW50IHJhdGUpKTsKK3N0YXRpYyBpbnQgaGFyZHdpcmVfc2V0YmF1ZHJhdGUgUEFSQU1TICgoc2VyaWFsX3Qgc2NiLCBpbnQgcmF0ZSkpOworc3RhdGljIGludCBoYXJkd2lyZV93cml0ZSBQQVJBTVMgKChzZXJpYWxfdCBzY2IsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbikpOworc3RhdGljIHZvaWQgaGFyZHdpcmVfY2xvc2UgUEFSQU1TICgoc2VyaWFsX3Qgc2NiKSk7CitzdGF0aWMgaW50IGdldF90dHlfc3RhdGUgUEFSQU1TICgoc2VyaWFsX3Qgc2NiLCBzdHJ1Y3QgaGFyZHdpcmVfdHR5c3RhdGUgKnN0YXRlKSk7CitzdGF0aWMgaW50IHNldF90dHlfc3RhdGUgUEFSQU1TICgoc2VyaWFsX3Qgc2NiLCBzdHJ1Y3QgaGFyZHdpcmVfdHR5c3RhdGUgKnN0YXRlKSk7CitzdGF0aWMgc2VyaWFsX3R0eXN0YXRlIGhhcmR3aXJlX2dldF90dHlfc3RhdGUgUEFSQU1TICgoc2VyaWFsX3Qgc2NiKSk7CitzdGF0aWMgaW50IGhhcmR3aXJlX3NldF90dHlfc3RhdGUgUEFSQU1TICgoc2VyaWFsX3Qgc2NiLCBzZXJpYWxfdHR5c3RhdGUgc3RhdGUpKTsKK3N0YXRpYyBpbnQgaGFyZHdpcmVfbm9mbHVzaF9zZXRfdHR5X3N0YXRlIFBBUkFNUyAoKHNlcmlhbF90LCBzZXJpYWxfdHR5c3RhdGUsCisJCQkJCQkgICBzZXJpYWxfdHR5c3RhdGUpKTsKK3N0YXRpYyB2b2lkIGhhcmR3aXJlX3ByaW50X3R0eV9zdGF0ZSBQQVJBTVMgKChzZXJpYWxfdCwgc2VyaWFsX3R0eXN0YXRlKSk7CitzdGF0aWMgaW50IGhhcmR3aXJlX2RyYWluX291dHB1dCBQQVJBTVMgKChzZXJpYWxfdCkpOworc3RhdGljIGludCBoYXJkd2lyZV9mbHVzaF9vdXRwdXQgUEFSQU1TICgoc2VyaWFsX3QpKTsKK3N0YXRpYyBpbnQgaGFyZHdpcmVfZmx1c2hfaW5wdXQgUEFSQU1TICgoc2VyaWFsX3QpKTsKK3N0YXRpYyBpbnQgaGFyZHdpcmVfc2VuZF9icmVhayBQQVJBTVMgKChzZXJpYWxfdCkpOworc3RhdGljIGludCBoYXJkd2lyZV9zZXRzdG9wYml0cyBQQVJBTVMgKChzZXJpYWxfdCwgaW50KSk7CisKK3ZvaWQgX2luaXRpYWxpemVfc2VyX2hhcmR3aXJlIFBBUkFNUyAoKHZvaWQpKTsKKworI2lmZGVmIF9fQ1lHV0lOMzJfXworZXh0ZXJuIHZvaWQgKCp1aV9sb29wX2hvb2spIFBBUkFNUyAoKGludCkpOworI2VuZGlmCisKKy8qIE9wZW4gdXAgYSByZWFsIGxpdmUgZGV2aWNlIGZvciBzZXJpYWwgSS9PICovCisKK3N0YXRpYyBpbnQKK2hhcmR3aXJlX29wZW4oc2NiLCBuYW1lKQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHNjYi0+ZmQgPSBvcGVuIChuYW1lLCBPX1JEV1IpOworICBpZiAoc2NiLT5mZCA8IDApCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitnZXRfdHR5X3N0YXRlIChzY2IsIHN0YXRlKQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIHN0cnVjdCBoYXJkd2lyZV90dHlzdGF0ZSAqc3RhdGU7Cit7CisjaWZkZWYgSEFWRV9URVJNSU9TCisgIGlmICh0Y2dldGF0dHIoc2NiLT5mZCwgJnN0YXRlLT50ZXJtaW9zKSA8IDApCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAwOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1RFUk1JTworICBpZiAoaW9jdGwgKHNjYi0+ZmQsIFRDR0VUQSwgJnN0YXRlLT50ZXJtaW8pIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHJldHVybiAwOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NHVFRZCisgIGlmIChpb2N0bCAoc2NiLT5mZCwgVElPQ0dFVFAsICZzdGF0ZS0+c2d0dHliKSA8IDApCisgICAgcmV0dXJuIC0xOworICBpZiAoaW9jdGwgKHNjYi0+ZmQsIFRJT0NHRVRDLCAmc3RhdGUtPnRjKSA8IDApCisgICAgcmV0dXJuIC0xOworICBpZiAoaW9jdGwgKHNjYi0+ZmQsIFRJT0NHTFRDLCAmc3RhdGUtPmx0YykgPCAwKQorICAgIHJldHVybiAtMTsKKyAgaWYgKGlvY3RsIChzY2ItPmZkLCBUSU9DTEdFVCwgJnN0YXRlLT5sbW9kZSkgPCAwKQorICAgIHJldHVybiAtMTsKKworICByZXR1cm4gMDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50CitzZXRfdHR5X3N0YXRlKHNjYiwgc3RhdGUpCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgc3RydWN0IGhhcmR3aXJlX3R0eXN0YXRlICpzdGF0ZTsKK3sKKyNpZmRlZiBIQVZFX1RFUk1JT1MKKyAgaWYgKHRjc2V0YXR0cihzY2ItPmZkLCBUQ1NBTk9XLCAmc3RhdGUtPnRlcm1pb3MpIDwgMCkKKyAgICByZXR1cm4gLTE7CisKKyAgcmV0dXJuIDA7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVEVSTUlPCisgIGlmIChpb2N0bCAoc2NiLT5mZCwgVENTRVRBLCAmc3RhdGUtPnRlcm1pbykgPCAwKQorICAgIHJldHVybiAtMTsKKyAgcmV0dXJuIDA7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU0dUVFkKKyAgaWYgKGlvY3RsIChzY2ItPmZkLCBUSU9DU0VUTiwgJnN0YXRlLT5zZ3R0eWIpIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIGlmIChpb2N0bCAoc2NiLT5mZCwgVElPQ1NFVEMsICZzdGF0ZS0+dGMpIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIGlmIChpb2N0bCAoc2NiLT5mZCwgVElPQ1NMVEMsICZzdGF0ZS0+bHRjKSA8IDApCisgICAgcmV0dXJuIC0xOworICBpZiAoaW9jdGwgKHNjYi0+ZmQsIFRJT0NMU0VULCAmc3RhdGUtPmxtb2RlKSA8IDApCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBzZXJpYWxfdHR5c3RhdGUKK2hhcmR3aXJlX2dldF90dHlfc3RhdGUoc2NiKQorICAgICBzZXJpYWxfdCBzY2I7Cit7CisgIHN0cnVjdCBoYXJkd2lyZV90dHlzdGF0ZSAqc3RhdGU7CisKKyAgc3RhdGUgPSAoc3RydWN0IGhhcmR3aXJlX3R0eXN0YXRlICopeG1hbGxvYyhzaXplb2YgKnN0YXRlKTsKKworICBpZiAoZ2V0X3R0eV9zdGF0ZShzY2IsIHN0YXRlKSkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gKHNlcmlhbF90dHlzdGF0ZSlzdGF0ZTsKK30KKworc3RhdGljIGludAoraGFyZHdpcmVfc2V0X3R0eV9zdGF0ZShzY2IsIHR0eXN0YXRlKQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIHNlcmlhbF90dHlzdGF0ZSB0dHlzdGF0ZTsKK3sKKyAgc3RydWN0IGhhcmR3aXJlX3R0eXN0YXRlICpzdGF0ZTsKKworICBzdGF0ZSA9IChzdHJ1Y3QgaGFyZHdpcmVfdHR5c3RhdGUgKil0dHlzdGF0ZTsKKworICByZXR1cm4gc2V0X3R0eV9zdGF0ZShzY2IsIHN0YXRlKTsKK30KKworc3RhdGljIGludAoraGFyZHdpcmVfbm9mbHVzaF9zZXRfdHR5X3N0YXRlIChzY2IsIG5ld190dHlzdGF0ZSwgb2xkX3R0eXN0YXRlKQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIHNlcmlhbF90dHlzdGF0ZSBuZXdfdHR5c3RhdGU7CisgICAgIHNlcmlhbF90dHlzdGF0ZSBvbGRfdHR5c3RhdGU7Cit7CisgIHN0cnVjdCBoYXJkd2lyZV90dHlzdGF0ZSBuZXdfc3RhdGU7CisjaWZkZWYgSEFWRV9TR1RUWQorICBzdHJ1Y3QgaGFyZHdpcmVfdHR5c3RhdGUgKnN0YXRlID0gKHN0cnVjdCBoYXJkd2lyZV90dHlzdGF0ZSAqKSBvbGRfdHR5c3RhdGU7CisjZW5kaWYKKworICBuZXdfc3RhdGUgPSAqKHN0cnVjdCBoYXJkd2lyZV90dHlzdGF0ZSAqKW5ld190dHlzdGF0ZTsKKworICAvKiBEb24ndCBjaGFuZ2UgaW4gb3Igb3V0IG9mIHJhdyBtb2RlOyB3ZSBkb24ndCB3YW50IHRvIGZsdXNoIGlucHV0LgorICAgICB0ZXJtaW8gYW5kIHRlcm1pb3MgaGF2ZSBubyBzdWNoIHJlc3RyaWN0aW9uOyBmb3IgdGhlbSBmbHVzaGluZyBpbnB1dAorICAgICBpcyBzZXBhcmF0ZSBmcm9tIHNldHRpbmcgdGhlIGF0dHJpYnV0ZXMuICAqLworCisjaWZkZWYgSEFWRV9TR1RUWQorICBpZiAoc3RhdGUtPnNndHR5Yi5zZ19mbGFncyAmIFJBVykKKyAgICBuZXdfc3RhdGUuc2d0dHliLnNnX2ZsYWdzIHw9IFJBVzsKKyAgZWxzZQorICAgIG5ld19zdGF0ZS5zZ3R0eWIuc2dfZmxhZ3MgJj0gflJBVzsKKworICAvKiBJJ20gbm90IHN1cmUgd2hldGhlciB0aGlzIGlzIG5lY2Vzc2FyeTsgdGhlIG1hbnBhZ2UganVzdCBtZW50aW9ucworICAgICBSQVcgbm90IENCUkVBSy4gICovCisgIGlmIChzdGF0ZS0+c2d0dHliLnNnX2ZsYWdzICYgQ0JSRUFLKQorICAgIG5ld19zdGF0ZS5zZ3R0eWIuc2dfZmxhZ3MgfD0gQ0JSRUFLOworICBlbHNlCisgICAgbmV3X3N0YXRlLnNndHR5Yi5zZ19mbGFncyAmPSB+Q0JSRUFLOworI2VuZGlmCisKKyAgcmV0dXJuIHNldF90dHlfc3RhdGUgKHNjYiwgJm5ld19zdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitoYXJkd2lyZV9wcmludF90dHlfc3RhdGUgKHNjYiwgdHR5c3RhdGUpCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgc2VyaWFsX3R0eXN0YXRlIHR0eXN0YXRlOworeworICBzdHJ1Y3QgaGFyZHdpcmVfdHR5c3RhdGUgKnN0YXRlID0gKHN0cnVjdCBoYXJkd2lyZV90dHlzdGF0ZSAqKSB0dHlzdGF0ZTsKKyAgaW50IGk7CisKKyNpZmRlZiBIQVZFX1RFUk1JT1MKKyAgcHJpbnRmX2ZpbHRlcmVkICgiY19pZmxhZyA9IDB4JXgsIGNfb2ZsYWcgPSAweCV4LFxuIiwKKwkJICAgc3RhdGUtPnRlcm1pb3MuY19pZmxhZywgc3RhdGUtPnRlcm1pb3MuY19vZmxhZyk7CisgIHByaW50Zl9maWx0ZXJlZCAoImNfY2ZsYWcgPSAweCV4LCBjX2xmbGFnID0gMHgleFxuIiwKKwkJICAgc3RhdGUtPnRlcm1pb3MuY19jZmxhZywgc3RhdGUtPnRlcm1pb3MuY19sZmxhZyk7CisjaWYgMAorICAvKiBUaGlzIG5vdCBpbiBQT1NJWCwgYW5kIGlzIG5vdCByZWFsbHkgZG9jdW1lbnRlZCBieSB0aG9zZSBzeXN0ZW1zCisgICAgIHdoaWNoIGhhdmUgaXQgKGF0IGxlYXN0IG5vdCBTdW4pLiAgKi8KKyAgcHJpbnRmX2ZpbHRlcmVkICgiY19saW5lID0gMHgleC5cbiIsIHN0YXRlLT50ZXJtaW9zLmNfbGluZSk7CisjZW5kaWYKKyAgcHJpbnRmX2ZpbHRlcmVkICgiY19jYzogIik7CisgIGZvciAoaSA9IDA7IGkgPCBOQ0NTOyBpICs9IDEpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiMHgleCAiLCBzdGF0ZS0+dGVybWlvcy5jX2NjW2ldKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9URVJNSU8KKyAgcHJpbnRmX2ZpbHRlcmVkICgiY19pZmxhZyA9IDB4JXgsIGNfb2ZsYWcgPSAweCV4LFxuIiwKKwkJICAgc3RhdGUtPnRlcm1pby5jX2lmbGFnLCBzdGF0ZS0+dGVybWlvLmNfb2ZsYWcpOworICBwcmludGZfZmlsdGVyZWQgKCJjX2NmbGFnID0gMHgleCwgY19sZmxhZyA9IDB4JXgsIGNfbGluZSA9IDB4JXguXG4iLAorCQkgICBzdGF0ZS0+dGVybWlvLmNfY2ZsYWcsIHN0YXRlLT50ZXJtaW8uY19sZmxhZywKKwkJICAgc3RhdGUtPnRlcm1pby5jX2xpbmUpOworICBwcmludGZfZmlsdGVyZWQgKCJjX2NjOiAiKTsKKyAgZm9yIChpID0gMDsgaSA8IE5DQzsgaSArPSAxKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIjB4JXggIiwgc3RhdGUtPnRlcm1pby5jX2NjW2ldKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TR1RUWQorICBwcmludGZfZmlsdGVyZWQgKCJzZ3R0eWIuc2dfZmxhZ3MgPSAweCV4LlxuIiwgc3RhdGUtPnNndHR5Yi5zZ19mbGFncyk7CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgidGNoYXJzOiAiKTsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpc2l6ZW9mIChzdHJ1Y3QgdGNoYXJzKTsgaSsrKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIjB4JXggIiwgKCh1bnNpZ25lZCBjaGFyICopJnN0YXRlLT50YylbaV0pOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworCisgIHByaW50Zl9maWx0ZXJlZCAoImx0Y2hhcnM6ICIpOworICBmb3IgKGkgPSAwOyBpIDwgKGludClzaXplb2YgKHN0cnVjdCBsdGNoYXJzKTsgaSsrKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIjB4JXggIiwgKCh1bnNpZ25lZCBjaGFyICopJnN0YXRlLT5sdGMpW2ldKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKworICBwcmludGZfZmlsdGVyZWQgKCJsbW9kZTogIDB4JXhcbiIsIHN0YXRlLT5sbW9kZSk7CisjZW5kaWYKK30KKworLyogV2FpdCBmb3IgdGhlIG91dHB1dCB0byBkcmFpbiBhd2F5LCBhcyBvcHBvc2VkIHRvIGZsdXNoaW5nIChkaXNjYXJkaW5nKSBpdCAqLworCitzdGF0aWMgaW50CitoYXJkd2lyZV9kcmFpbl9vdXRwdXQgKHNjYikKKyAgICAgc2VyaWFsX3Qgc2NiOworeworI2lmZGVmIEhBVkVfVEVSTUlPUworICByZXR1cm4gdGNkcmFpbiAoc2NiLT5mZCk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVEVSTUlPCisgIHJldHVybiBpb2N0bCAoc2NiLT5mZCwgVENTQlJLLCAxKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TR1RUWQorICAvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgYW5kIHRoZW4gcmVzdG9yZSBpdCB1c2luZyBUSU9DU0VUUCwKKyAgICAgd2hpY2ggc2hvdWxkIGNhdXNlIHRoZSBvdXRwdXQgdG8gZHJhaW4gYW5kIHBlbmRpbmcgaW5wdXQKKyAgICAgdG8gYmUgZGlzY2FyZGVkLiAqLworICB7CisgICAgc3RydWN0IGhhcmR3aXJlX3R0eXN0YXRlIHN0YXRlOworICAgIGlmIChnZXRfdHR5X3N0YXRlIChzY2IsICZzdGF0ZSkpCisgICAgICB7CisJcmV0dXJuICgtMSk7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCXJldHVybiAoaW9jdGwgKHNjYi0+ZmQsIFRJT0NTRVRQLCAmc3RhdGUuc2d0dHliKSk7CisgICAgICB9CisgIH0KKyNlbmRpZiAgCit9CisKK3N0YXRpYyBpbnQKK2hhcmR3aXJlX2ZsdXNoX291dHB1dCAoc2NiKQorICAgICBzZXJpYWxfdCBzY2I7Cit7CisjaWZkZWYgSEFWRV9URVJNSU9TCisgIHJldHVybiB0Y2ZsdXNoIChzY2ItPmZkLCBUQ09GTFVTSCk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVEVSTUlPCisgIHJldHVybiBpb2N0bCAoc2NiLT5mZCwgVENGTFNILCAxKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TR1RUWQorICAvKiBUaGlzIGZsdXNoZXMgYm90aCBpbnB1dCBhbmQgb3V0cHV0LCBidXQgd2UgY2FuJ3QgZG8gYmV0dGVyLiAgKi8KKyAgcmV0dXJuIGlvY3RsIChzY2ItPmZkLCBUSU9DRkxVU0gsIDApOworI2VuZGlmICAKK30KKworc3RhdGljIGludAoraGFyZHdpcmVfZmx1c2hfaW5wdXQgKHNjYikKKyAgICAgc2VyaWFsX3Qgc2NiOworeworICBzY2ItPmJ1ZmNudCA9IDA7CisgIHNjYi0+YnVmcCA9IHNjYi0+YnVmOworCisjaWZkZWYgSEFWRV9URVJNSU9TCisgIHJldHVybiB0Y2ZsdXNoIChzY2ItPmZkLCBUQ0lGTFVTSCk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVEVSTUlPCisgIHJldHVybiBpb2N0bCAoc2NiLT5mZCwgVENGTFNILCAwKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TR1RUWQorICAvKiBUaGlzIGZsdXNoZXMgYm90aCBpbnB1dCBhbmQgb3V0cHV0LCBidXQgd2UgY2FuJ3QgZG8gYmV0dGVyLiAgKi8KKyAgcmV0dXJuIGlvY3RsIChzY2ItPmZkLCBUSU9DRkxVU0gsIDApOworI2VuZGlmICAKK30KKworc3RhdGljIGludAoraGFyZHdpcmVfc2VuZF9icmVhayAoc2NiKQorICAgICBzZXJpYWxfdCBzY2I7Cit7CisjaWZkZWYgSEFWRV9URVJNSU9TCisgIHJldHVybiB0Y3NlbmRicmVhayAoc2NiLT5mZCwgMCk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVEVSTUlPCisgIHJldHVybiBpb2N0bCAoc2NiLT5mZCwgVENTQlJLLCAwKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TR1RUWQorICB7CisgICAgaW50IHN0YXR1czsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworCisgICAgc3RhdHVzID0gaW9jdGwgKHNjYi0+ZmQsIFRJT0NTQlJLLCAwKTsKKworICAgIC8qIENhbid0IHVzZSB1c2xlZXA7IGl0IGRvZXNuJ3QgZXhpc3QgaW4gQlNEIDQuMi4gICovCisgICAgLyogTm90ZSB0aGF0IGlmIHRoaXMgc2VsZWN0KCkgaXMgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwgaXQgd2lsbCBub3Qgd2FpdAorICAgICAgIHRoZSBmdWxsIGxlbmd0aCBvZiB0aW1lLiAgSSB0aGluayB0aGF0IGlzIE9LLiAgKi8KKyAgICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgdGltZW91dC50dl91c2VjID0gMjUwMDAwOworICAgIHNlbGVjdCAoMCwgMCwgMCwgMCwgJnRpbWVvdXQpOworICAgIHN0YXR1cyA9IGlvY3RsIChzY2ItPmZkLCBUSU9DQ0JSSywgMCk7CisgICAgcmV0dXJuIHN0YXR1czsKKyAgfQorI2VuZGlmICAKK30KKworc3RhdGljIHZvaWQKK2hhcmR3aXJlX3JhdyhzY2IpCisgICAgIHNlcmlhbF90IHNjYjsKK3sKKyAgc3RydWN0IGhhcmR3aXJlX3R0eXN0YXRlIHN0YXRlOworCisgIGlmIChnZXRfdHR5X3N0YXRlKHNjYiwgJnN0YXRlKSkKKyAgICBmcHJpbnRmX3VuZmlsdGVyZWQoZ2RiX3N0ZGVyciwgImdldF90dHlfc3RhdGUgZmFpbGVkOiAlc1xuIiwgc2FmZV9zdHJlcnJvcihlcnJubykpOworCisjaWZkZWYgSEFWRV9URVJNSU9TCisgIHN0YXRlLnRlcm1pb3MuY19pZmxhZyA9IDA7CisgIHN0YXRlLnRlcm1pb3MuY19vZmxhZyA9IDA7CisgIHN0YXRlLnRlcm1pb3MuY19sZmxhZyA9IDA7CisgIHN0YXRlLnRlcm1pb3MuY19jZmxhZyAmPSB+KENTSVpFfFBBUkVOQik7CisgIHN0YXRlLnRlcm1pb3MuY19jZmxhZyB8PSBDTE9DQUwgfCBDUzg7CisgIHN0YXRlLnRlcm1pb3MuY19jY1tWTUlOXSA9IDA7CisgIHN0YXRlLnRlcm1pb3MuY19jY1tWVElNRV0gPSAwOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1RFUk1JTworICBzdGF0ZS50ZXJtaW8uY19pZmxhZyA9IDA7CisgIHN0YXRlLnRlcm1pby5jX29mbGFnID0gMDsKKyAgc3RhdGUudGVybWlvLmNfbGZsYWcgPSAwOworICBzdGF0ZS50ZXJtaW8uY19jZmxhZyAmPSB+KENTSVpFfFBBUkVOQik7CisgIHN0YXRlLnRlcm1pby5jX2NmbGFnIHw9IENMT0NBTCB8IENTODsKKyAgc3RhdGUudGVybWlvLmNfY2NbVk1JTl0gPSAwOworICBzdGF0ZS50ZXJtaW8uY19jY1tWVElNRV0gPSAwOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NHVFRZCisgIHN0YXRlLnNndHR5Yi5zZ19mbGFncyB8PSBSQVcgfCBBTllQOworICBzdGF0ZS5zZ3R0eWIuc2dfZmxhZ3MgJj0gfihDQlJFQUsgfCBFQ0hPKTsKKyNlbmRpZgorCisgIHNjYi0+Y3VycmVudF90aW1lb3V0ID0gMDsKKworICBpZiAoc2V0X3R0eV9zdGF0ZSAoc2NiLCAmc3RhdGUpKQorICAgIGZwcmludGZfdW5maWx0ZXJlZChnZGJfc3RkZXJyLCAic2V0X3R0eV9zdGF0ZSBmYWlsZWQ6ICVzXG4iLCBzYWZlX3N0cmVycm9yKGVycm5vKSk7Cit9CisKKy8qIFdhaXQgZm9yIGlucHV0IG9uIHNjYiwgd2l0aCB0aW1lb3V0IHNlY29uZHMuICBSZXR1cm5zIDAgb24gc3VjY2VzcywKKyAgIG90aGVyd2lzZSBTRVJJQUxfVElNRU9VVCBvciBTRVJJQUxfRVJST1IuCisKKyAgIEZvciB0ZXJtaW97c30sIHdlIGFjdHVhbGx5IGp1c3Qgc2V0dXAgVlRJTUUgaWYgbmVjZXNzYXJ5LCBhbmQgbGV0IHRoZQorICAgdGltZW91dCBvY2N1ciBpbiB0aGUgcmVhZCgpIGluIGhhcmR3aXJlX3JlYWQoKS4KKyAqLworCitzdGF0aWMgaW50Cit3YWl0X2ZvcihzY2IsIHRpbWVvdXQpCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgaW50IHRpbWVvdXQ7Cit7CisjaWZuZGVmIF9fQ1lHV0lOMzJfXworICBzY2ItPnRpbWVvdXRfcmVtYWluaW5nID0gMDsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TR1RUWQorICB7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZmRfc2V0IHJlYWRmZHM7CisKKyAgICBGRF9aRVJPICgmcmVhZGZkcyk7CisKKyAgICB0di50dl9zZWMgPSB0aW1lb3V0OworICAgIHR2LnR2X3VzZWMgPSAwOworCisgICAgRkRfU0VUKHNjYi0+ZmQsICZyZWFkZmRzKTsKKworICAgIHdoaWxlICgxKQorICAgICAgeworCWludCBudW1mZHM7CisKKwlpZiAodGltZW91dCA+PSAwKQorCSAgbnVtZmRzID0gc2VsZWN0KHNjYi0+ZmQrMSwgJnJlYWRmZHMsIDAsIDAsICZ0dik7CisJZWxzZQorCSAgbnVtZmRzID0gc2VsZWN0KHNjYi0+ZmQrMSwgJnJlYWRmZHMsIDAsIDAsIDApOworCisJaWYgKG51bWZkcyA8PSAwKQorCSAgaWYgKG51bWZkcyA9PSAwKQorCSAgICByZXR1cm4gU0VSSUFMX1RJTUVPVVQ7CisJICBlbHNlIGlmIChlcnJubyA9PSBFSU5UUikKKwkgICAgY29udGludWU7CisJICBlbHNlCisJICAgIHJldHVybiBTRVJJQUxfRVJST1I7CS8qIEdvdCBhbiBlcnJvciBmcm9tIHNlbGVjdCBvciBwb2xsICovCisKKwlyZXR1cm4gMDsKKyAgICAgIH0KKyAgfQorI2VuZGlmCS8qIEhBVkVfU0dUVFkgKi8KKworI2lmIGRlZmluZWQgSEFWRV9URVJNSU8gfHwgZGVmaW5lZCBIQVZFX1RFUk1JT1MKKyAgaWYgKHRpbWVvdXQgPT0gc2NiLT5jdXJyZW50X3RpbWVvdXQpCisgICAgcmV0dXJuIDA7CisKKyAgc2NiLT5jdXJyZW50X3RpbWVvdXQgPSB0aW1lb3V0OworCisgIHsKKyAgICBzdHJ1Y3QgaGFyZHdpcmVfdHR5c3RhdGUgc3RhdGU7CisKKyAgICBpZiAoZ2V0X3R0eV9zdGF0ZShzY2IsICZzdGF0ZSkpCisgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQoZ2RiX3N0ZGVyciwgImdldF90dHlfc3RhdGUgZmFpbGVkOiAlc1xuIiwgc2FmZV9zdHJlcnJvcihlcnJubykpOworCisjaWZkZWYgSEFWRV9URVJNSU9TCisgICAgaWYgKHRpbWVvdXQgPCAwKQorICAgICAgeworCS8qIE5vIHRpbWVvdXQuICAqLworCXN0YXRlLnRlcm1pb3MuY19jY1tWVElNRV0gPSAwOworCXN0YXRlLnRlcm1pb3MuY19jY1tWTUlOXSA9IDE7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCXN0YXRlLnRlcm1pb3MuY19jY1tWTUlOXSA9IDA7CisJc3RhdGUudGVybWlvcy5jX2NjW1ZUSU1FXSA9IHRpbWVvdXQgKiAxMDsKKwlpZiAoc3RhdGUudGVybWlvcy5jX2NjW1ZUSU1FXSAhPSB0aW1lb3V0ICogMTApCisJICB7CisKKwkgICAgLyogSWYgY19jYyBpcyBhbiA4LWJpdCBzaWduZWQgY2hhcmFjdGVyLCB3ZSBjYW4ndCBnbyAKKwkgICAgICAgYmlnZ2VyIHRoYW4gdGhpcy4gIElmIGl0IGlzIGFsd2F5cyB1bnNpZ25lZCwgd2UgY291bGQgdXNlCisJICAgICAgIDI1LiAgKi8KKworCSAgICBzY2ItPmN1cnJlbnRfdGltZW91dCA9IDEyOworCSAgICBzdGF0ZS50ZXJtaW9zLmNfY2NbVlRJTUVdID0gc2NiLT5jdXJyZW50X3RpbWVvdXQgKiAxMDsKKwkgICAgc2NiLT50aW1lb3V0X3JlbWFpbmluZyA9IHRpbWVvdXQgLSBzY2ItPmN1cnJlbnRfdGltZW91dDsKKwkgIH0KKyAgICAgIH0KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9URVJNSU8KKyAgICBpZiAodGltZW91dCA8IDApCisgICAgICB7CisJLyogTm8gdGltZW91dC4gICovCisJc3RhdGUudGVybWlvLmNfY2NbVlRJTUVdID0gMDsKKwlzdGF0ZS50ZXJtaW8uY19jY1tWTUlOXSA9IDE7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCXN0YXRlLnRlcm1pby5jX2NjW1ZNSU5dID0gMDsKKwlzdGF0ZS50ZXJtaW8uY19jY1tWVElNRV0gPSB0aW1lb3V0ICogMTA7CisJaWYgKHN0YXRlLnRlcm1pby5jX2NjW1ZUSU1FXSAhPSB0aW1lb3V0ICogMTApCisJICB7CisJICAgIC8qIElmIGNfY2MgaXMgYW4gOC1iaXQgc2lnbmVkIGNoYXJhY3Rlciwgd2UgY2FuJ3QgZ28gCisJICAgICAgIGJpZ2dlciB0aGFuIHRoaXMuICBJZiBpdCBpcyBhbHdheXMgdW5zaWduZWQsIHdlIGNvdWxkIHVzZQorCSAgICAgICAyNS4gICovCisKKwkgICAgc2NiLT5jdXJyZW50X3RpbWVvdXQgPSAxMjsKKwkgICAgc3RhdGUudGVybWlvLmNfY2NbVlRJTUVdID0gc2NiLT5jdXJyZW50X3RpbWVvdXQgKiAxMDsKKwkgICAgc2NiLT50aW1lb3V0X3JlbWFpbmluZyA9IHRpbWVvdXQgLSBzY2ItPmN1cnJlbnRfdGltZW91dDsKKwkgIH0KKyAgICAgIH0KKyNlbmRpZgorCisgICAgaWYgKHNldF90dHlfc3RhdGUgKHNjYiwgJnN0YXRlKSkKKyAgICAgIGZwcmludGZfdW5maWx0ZXJlZChnZGJfc3RkZXJyLCAic2V0X3R0eV9zdGF0ZSBmYWlsZWQ6ICVzXG4iLCBzYWZlX3N0cmVycm9yKGVycm5vKSk7CisKKyAgICByZXR1cm4gMDsKKyAgfQorI2VuZGlmCS8qIEhBVkVfVEVSTUlPIHx8IEhBVkVfVEVSTUlPUyAqLworfQorCisvKiBSZWFkIGEgY2hhcmFjdGVyIHdpdGggdXNlci1zcGVjaWZpZWQgdGltZW91dC4gIFRJTUVPVVQgaXMgbnVtYmVyIG9mIHNlY29uZHMKKyAgIHRvIHdhaXQsIG9yIC0xIHRvIHdhaXQgZm9yZXZlci4gIFVzZSB0aW1lb3V0IG9mIDAgdG8gZWZmZWN0IGEgcG9sbC4gIFJldHVybnMKKyAgIGNoYXIgaWYgc3VjY2Vzc2Z1bC4gIFJldHVybnMgU0VSSUFMX1RJTUVPVVQgaWYgdGltZW91dCBleHBpcmVkLCBFT0YgaWYgbGluZQorICAgZHJvcHBlZCBkZWFkLCBvciBTRVJJQUxfRVJST1IgZm9yIGFueSBvdGhlciBlcnJvciAoc2VlIGVycm5vIGluIHRoYXQgY2FzZSkuICAqLworc3RhdGljIGludAoraGFyZHdpcmVfcmVhZGNoYXIgKHNjYiwgdGltZW91dCkKKyAgICAgc2VyaWFsX3Qgc2NiOworICAgICBpbnQgdGltZW91dDsKK3sKKyAgaW50IHN0YXR1czsKKyNpZmRlZiBfX0NZR1dJTjMyX18KKyAgaW50IHQ7CisjZW5kaWYKKworICBpZiAoc2NiLT5idWZjbnQtLSA+IDApCisgICAgcmV0dXJuICpzY2ItPmJ1ZnArKzsKKworI2lmZGVmIF9fQ1lHV0lOMzJfXworICBpZiAodGltZW91dCA+IDApCisgICAgdGltZW91dCsrOworI2VuZGlmCisKKyAgd2hpbGUgKDEpCisgICAgeworI2lmZGVmIF9fQ1lHV0lOMzJfXworICAgICAgdCA9IHRpbWVvdXQgPT0gMCA/IDAgOiAxOworICAgICAgc2NiLT50aW1lb3V0X3JlbWFpbmluZyA9IHRpbWVvdXQgPCAwID8gdGltZW91dCA6IHRpbWVvdXQgLSB0OworICAgICAgc3RhdHVzID0gd2FpdF9mb3IgKHNjYiwgdCk7CisKKyAgICAgIC8qIC0yIG1lYW5zIGRpc2FibGUgdGltZXIgKi8KKyAgICAgIGlmICh1aV9sb29wX2hvb2spCisgICAgICAgIHVpX2xvb3BfaG9vayAoLTIpOworI2Vsc2UKKyAgICAgIHN0YXR1cyA9IHdhaXRfZm9yIChzY2IsIHRpbWVvdXQpOworI2VuZGlmCisgICAgICBpZiAoc3RhdHVzIDwgMCkKKwlyZXR1cm4gc3RhdHVzOworCisgICAgICBzY2ItPmJ1ZmNudCA9IHJlYWQgKHNjYi0+ZmQsIHNjYi0+YnVmLCBCVUZTSVopOworCisgICAgICBpZiAoc2NiLT5idWZjbnQgPD0gMCkKKwl7CisJICBpZiAoc2NiLT5idWZjbnQgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIFplcm8gY2hhcmFjdGVycyBtZWFucyB0aW1lb3V0IChpdCBjb3VsZCBhbHNvIGJlIEVPRiwgYnV0CisJCSB3ZSBkb24ndCAoeWV0IGF0IGxlYXN0KSBkaXN0aW5ndWlzaCkuICAqLworCSAgICAgIGlmIChzY2ItPnRpbWVvdXRfcmVtYWluaW5nID4gMCkKKwkJeworCQkgIHRpbWVvdXQgPSBzY2ItPnRpbWVvdXRfcmVtYWluaW5nOworCQkgIGNvbnRpbnVlOworCQl9CisjaWZkZWYgX19DWUdXSU4zMl9fCisgICAgICAgICAgZWxzZSBpZiAoc2NiLT50aW1lb3V0X3JlbWFpbmluZyA8IDApCisgICAgICAgICAgICBjb250aW51ZTsKKyNlbmRpZgorCSAgICAgIGVsc2UKKwkJcmV0dXJuIFNFUklBTF9USU1FT1VUOworCSAgICB9CisJICBlbHNlIGlmIChlcnJubyA9PSBFSU5UUikKKwkgICAgY29udGludWU7CisJICBlbHNlCisJICAgIHJldHVybiBTRVJJQUxfRVJST1I7CS8qIEdvdCBhbiBlcnJvciBmcm9tIHJlYWQgKi8KKwl9CisKKyAgICAgIHNjYi0+YnVmY250LS07CisgICAgICBzY2ItPmJ1ZnAgPSBzY2ItPmJ1ZjsKKyAgICAgIHJldHVybiAqc2NiLT5idWZwKys7CisgICAgfQorfQorCisjaWZuZGVmIEIxOTIwMAorI2RlZmluZSBCMTkyMDAgRVhUQQorI2VuZGlmCisKKyNpZm5kZWYgQjM4NDAwCisjZGVmaW5lIEIzODQwMCBFWFRCCisjZW5kaWYKKworLyogVHJhbnNsYXRlIGJhdWQgcmF0ZXMgZnJvbSBpbnRlZ2VycyB0byBkYW1uIEJfY29kZXMuICBVbml4IHNob3VsZAorICAgaGF2ZSBvdXRncm93biB0aGlzIGNyYXAgeWVhcnMgYWdvLCBidXQgZXZlbiBQT1NJWCB3b3VsZG4ndCBidWNrIGl0LiAgKi8KKworc3RhdGljIHN0cnVjdAoreworICBpbnQgcmF0ZTsKKyAgaW50IGNvZGU7Cit9CitiYXVkdGFiW10gPQoreworICB7NTAsIEI1MH0sCisgIHs3NSwgQjc1fSwKKyAgezExMCwgQjExMH0sCisgIHsxMzQsIEIxMzR9LAorICB7MTUwLCBCMTUwfSwKKyAgezIwMCwgQjIwMH0sCisgIHszMDAsIEIzMDB9LAorICB7NjAwLCBCNjAwfSwKKyAgezEyMDAsIEIxMjAwfSwKKyAgezE4MDAsIEIxODAwfSwKKyAgezI0MDAsIEIyNDAwfSwKKyAgezQ4MDAsIEI0ODAwfSwKKyAgezk2MDAsIEI5NjAwfSwKKyAgezE5MjAwLCBCMTkyMDB9LAorICB7Mzg0MDAsIEIzODQwMH0sCisjaWZkZWYgQjU3NjAwCisgIHs1NzYwMCwgQjU3NjAwfSwKKyNlbmRpZgorI2lmZGVmIEIxMTUyMDAKKyAgezExNTIwMCwgQjExNTIwMH0sCisjZW5kaWYKKyNpZmRlZiBCMjMwNDAwCisgIHsyMzA0MDAsIEIyMzA0MDB9LAorI2VuZGlmCisjaWZkZWYgQjQ2MDgwMAorICB7NDYwODAwLCBCNDYwODAwfSwKKyNlbmRpZgorICB7LTEsIC0xfSwKK307CisKK3N0YXRpYyBpbnQgCityYXRlX3RvX2NvZGUocmF0ZSkKKyAgICAgaW50IHJhdGU7Cit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGJhdWR0YWJbaV0ucmF0ZSAhPSAtMTsgaSsrKQorICAgIGlmIChyYXRlID09IGJhdWR0YWJbaV0ucmF0ZSkgIAorICAgICAgcmV0dXJuIGJhdWR0YWJbaV0uY29kZTsKKworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK2hhcmR3aXJlX3NldGJhdWRyYXRlKHNjYiwgcmF0ZSkKKyAgICAgc2VyaWFsX3Qgc2NiOworICAgICBpbnQgcmF0ZTsKK3sKKyAgc3RydWN0IGhhcmR3aXJlX3R0eXN0YXRlIHN0YXRlOworCisgIGlmIChnZXRfdHR5X3N0YXRlKHNjYiwgJnN0YXRlKSkKKyAgICByZXR1cm4gLTE7CisKKyNpZmRlZiBIQVZFX1RFUk1JT1MKKyAgY2ZzZXRvc3BlZWQgKCZzdGF0ZS50ZXJtaW9zLCByYXRlX3RvX2NvZGUgKHJhdGUpKTsKKyAgY2ZzZXRpc3BlZWQgKCZzdGF0ZS50ZXJtaW9zLCByYXRlX3RvX2NvZGUgKHJhdGUpKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9URVJNSU8KKyNpZm5kZWYgQ0lCQVVECisjZGVmaW5lIENJQkFVRCBDQkFVRAorI2VuZGlmCisKKyAgc3RhdGUudGVybWlvLmNfY2ZsYWcgJj0gfihDQkFVRCB8IENJQkFVRCk7CisgIHN0YXRlLnRlcm1pby5jX2NmbGFnIHw9IHJhdGVfdG9fY29kZSAocmF0ZSk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU0dUVFkKKyAgc3RhdGUuc2d0dHliLnNnX2lzcGVlZCA9IHJhdGVfdG9fY29kZSAocmF0ZSk7CisgIHN0YXRlLnNndHR5Yi5zZ19vc3BlZWQgPSByYXRlX3RvX2NvZGUgKHJhdGUpOworI2VuZGlmCisKKyAgcmV0dXJuIHNldF90dHlfc3RhdGUgKHNjYiwgJnN0YXRlKTsKK30KKworc3RhdGljIGludAoraGFyZHdpcmVfc2V0c3RvcGJpdHMoc2NiLCBudW0pCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgaW50IG51bTsKK3sKKyAgc3RydWN0IGhhcmR3aXJlX3R0eXN0YXRlIHN0YXRlOworICBpbnQgbmV3Yml0OworCisgIGlmIChnZXRfdHR5X3N0YXRlKHNjYiwgJnN0YXRlKSkKKyAgICByZXR1cm4gLTE7CisKKyAgc3dpdGNoIChudW0pCisgICAgeworICAgIGNhc2UgU0VSSUFMXzFfU1RPUEJJVFM6CisgICAgICBuZXdiaXQgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTRVJJQUxfMV9BTkRfQV9IQUxGX1NUT1BCSVRTOgorICAgIGNhc2UgU0VSSUFMXzJfU1RPUEJJVFM6CisgICAgICBuZXdiaXQgPSAxOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAxOworICAgIH0KKworI2lmZGVmIEhBVkVfVEVSTUlPUworICBpZiAoIW5ld2JpdCkKKyAgICBzdGF0ZS50ZXJtaW9zLmNfY2ZsYWcgJj0gfkNTVE9QQjsKKyAgZWxzZQorICAgIHN0YXRlLnRlcm1pb3MuY19jZmxhZyB8PSBDU1RPUEI7IC8qIHR3byBiaXRzICovCisjZW5kaWYKKworI2lmZGVmIEhBVkVfVEVSTUlPCisgIGlmICghbmV3Yml0KQorICAgIHN0YXRlLnRlcm1pby5jX2NmbGFnICY9IH5DU1RPUEI7CisgIGVsc2UKKyAgICBzdGF0ZS50ZXJtaW8uY19jZmxhZyB8PSBDU1RPUEI7IC8qIHR3byBiaXRzICovCisjZW5kaWYKKworI2lmZGVmIEhBVkVfU0dUVFkKKyAgcmV0dXJuIDA7CQkJLyogc2d0dHkgZG9lc24ndCBzdXBwb3J0IHRoaXMgKi8KKyNlbmRpZgorCisgIHJldHVybiBzZXRfdHR5X3N0YXRlIChzY2IsICZzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2hhcmR3aXJlX3dyaXRlKHNjYiwgc3RyLCBsZW4pCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgY29uc3QgY2hhciAqc3RyOworICAgICBpbnQgbGVuOworeworICBpbnQgY2M7CisKKyAgd2hpbGUgKGxlbiA+IDApCisgICAgeworICAgICAgY2MgPSB3cml0ZShzY2ItPmZkLCBzdHIsIGxlbik7CisKKyAgICAgIGlmIChjYyA8IDApCisJcmV0dXJuIDE7CisgICAgICBsZW4gLT0gY2M7CisgICAgICBzdHIgKz0gY2M7CisgICAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2hhcmR3aXJlX2Nsb3NlKHNjYikKKyAgICAgc2VyaWFsX3Qgc2NiOworeworICBpZiAoc2NiLT5mZCA8IDApCisgICAgcmV0dXJuOworCisgIGNsb3NlKHNjYi0+ZmQpOworICBzY2ItPmZkID0gLTE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VyaWFsX29wcyBoYXJkd2lyZV9vcHMgPQoreworICAiaGFyZHdpcmUiLAorICAwLAorICBoYXJkd2lyZV9vcGVuLAorICBoYXJkd2lyZV9jbG9zZSwKKyAgaGFyZHdpcmVfcmVhZGNoYXIsCisgIGhhcmR3aXJlX3dyaXRlLAorICBoYXJkd2lyZV9mbHVzaF9vdXRwdXQsCisgIGhhcmR3aXJlX2ZsdXNoX2lucHV0LAorICBoYXJkd2lyZV9zZW5kX2JyZWFrLAorICBoYXJkd2lyZV9yYXcsCisgIGhhcmR3aXJlX2dldF90dHlfc3RhdGUsCisgIGhhcmR3aXJlX3NldF90dHlfc3RhdGUsCisgIGhhcmR3aXJlX3ByaW50X3R0eV9zdGF0ZSwKKyAgaGFyZHdpcmVfbm9mbHVzaF9zZXRfdHR5X3N0YXRlLAorICBoYXJkd2lyZV9zZXRiYXVkcmF0ZSwKKyAgaGFyZHdpcmVfc2V0c3RvcGJpdHMsCisgIGhhcmR3aXJlX2RyYWluX291dHB1dCwJLyogd2FpdCBmb3Igb3V0cHV0IHRvIGRyYWluICovCit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9zZXJfaGFyZHdpcmUgKCkKK3sKKyAgc2VyaWFsX2FkZF9pbnRlcmZhY2UgKCZoYXJkd2lyZV9vcHMpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3NlcmlhbC5jIGIvZ2RiL3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNDIwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvc2VyaWFsLmMKQEAgLTAsMCArMSw1MjYgQEAKKy8qIEdlbmVyaWMgc2VyaWFsIGludGVyZmFjZSByb3V0aW5lcworICAgQ29weXJpZ2h0IDE5OTIsIDE5OTMsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgInNlcmlhbC5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKworLyogTGlua2VkIGxpc3Qgb2Ygc2VyaWFsIEkvTyBoYW5kbGVycyAqLworCitzdGF0aWMgc3RydWN0IHNlcmlhbF9vcHMgKnNlcmlhbF9vcHNfbGlzdCA9IE5VTEw7CisKKy8qIFRoaXMgaXMgdGhlIGxhc3Qgc2VyaWFsIHN0cmVhbSBvcGVuZWQuICBVc2VkIGJ5IGNvbm5lY3QgY29tbWFuZC4gKi8KKworc3RhdGljIHNlcmlhbF90IGxhc3Rfc2VyaWFsX29wZW5lZCA9IE5VTEw7CisKKy8qIFBvaW50ZXIgdG8gbGlzdCBvZiBzY2Incy4gKi8KKworc3RhdGljIHNlcmlhbF90IHNjYl9iYXNlOworCisvKiBOb24tTlVMTCBnaXZlcyBmaWxlbmFtZSB3aGljaCBjb250YWlucyBhIHJlY29yZGluZyBvZiB0aGUgcmVtb3RlIHNlc3Npb24sCisgICBzdWl0YWJsZSBmb3IgcGxheWJhY2sgYnkgZ2Ric2VydmVyLiAqLworCitzdGF0aWMgY2hhciAqc2VyaWFsX2xvZ2ZpbGUgPSBOVUxMOworc3RhdGljIEdEQl9GSUxFICpzZXJpYWxfbG9nZnAgPSBOVUxMOworCitzdGF0aWMgc3RydWN0IHNlcmlhbF9vcHMgKnNlcmlhbF9pbnRlcmZhY2VfbG9va3VwIFBBUkFNUyAoKGNoYXIgKikpOworc3RhdGljIHZvaWQgc2VyaWFsX2xvZ2NoYXIgUEFSQU1TICgoaW50LCBpbnQsIGludCkpOworc3RhdGljIGNoYXIgbG9nYmFzZV9oZXhbXSA9ICJoZXgiOworc3RhdGljIGNoYXIgbG9nYmFzZV9vY3RhbFtdID0gIm9jdGFsIjsKK3N0YXRpYyBjaGFyIGxvZ2Jhc2VfYXNjaWlbXSA9ICJhc2NpaSI7CitzdGF0aWMgY2hhciAqbG9nYmFzZV9lbnVtc1tdID0ge2xvZ2Jhc2VfaGV4LCBsb2diYXNlX29jdGFsLCBsb2diYXNlX2FzY2lpLCBOVUxMfTsKK3N0YXRpYyBjaGFyICpzZXJpYWxfbG9nYmFzZSA9IGxvZ2Jhc2VfYXNjaWk7CisKKwwKK3N0YXRpYyBpbnQgc2VyaWFsX2N1cnJlbnRfdHlwZSA9IDA7CisKKy8qIExvZyBjaGFyIENIIG9mIHR5cGUgQ0hUWVBFLCB3aXRoIFRJTUVPVVQgKi8KKworLyogRGVmaW5lIGJvZ3VzIGNoYXIgdG8gcmVwcmVzZW50IGEgQlJFQUsuICBTaG91bGQgYmUgY2FyZWZ1bCB0byBjaG9vc2UgYSB2YWx1ZQorICAgdGhhdCBjYW4ndCBiZSBjb25mdXNlZCB3aXRoIGEgbm9ybWFsIGNoYXIsIG9yIGFuIGVycm9yIGNvZGUuICAqLworI2RlZmluZSBTRVJJQUxfQlJFQUsgMTIzNQorCitzdGF0aWMgdm9pZAorc2VyaWFsX2xvZ2NoYXIgKGNoX3R5cGUsIGNoLCB0aW1lb3V0KQorICAgICBpbnQgY2hfdHlwZTsKKyAgICAgaW50IGNoOworICAgICBpbnQgdGltZW91dDsKK3sKKyAgaWYgKGNoX3R5cGUgIT0gc2VyaWFsX2N1cnJlbnRfdHlwZSkKKyAgICB7CisgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKHNlcmlhbF9sb2dmcCwgIlxuJWMgIiwgY2hfdHlwZSk7CisgICAgICBzZXJpYWxfY3VycmVudF90eXBlID0gY2hfdHlwZTsKKyAgICB9CisKKyAgaWYgKHNlcmlhbF9sb2diYXNlICE9IGxvZ2Jhc2VfYXNjaWkpCisgICAgZnB1dGNfdW5maWx0ZXJlZCAoJyAnLCBzZXJpYWxfbG9nZnApOworCisgIHN3aXRjaCAoY2gpCisgICAgeworICAgIGNhc2UgU0VSSUFMX1RJTUVPVVQ6CisgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKHNlcmlhbF9sb2dmcCwgIjxUaW1lb3V0OiAlZCBzZWNvbmRzPiIsIHRpbWVvdXQpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgU0VSSUFMX0VSUk9SOgorICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChzZXJpYWxfbG9nZnAsICI8RXJyb3I6ICVzPiIsIHNhZmVfc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBTRVJJQUxfRU9GOgorICAgICAgZnB1dHNfdW5maWx0ZXJlZCAoIjxFb2Y+Iiwgc2VyaWFsX2xvZ2ZwKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFNFUklBTF9CUkVBSzoKKyAgICAgIGZwdXRzX3VuZmlsdGVyZWQgKCI8QnJlYWs+Iiwgc2VyaWFsX2xvZ2ZwKTsKKyAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKHNlcmlhbF9sb2diYXNlID09IGxvZ2Jhc2VfaGV4KQorCWZwcmludGZfdW5maWx0ZXJlZCAoc2VyaWFsX2xvZ2ZwLCAiJTAyeCIsIGNoICYgMHhmZik7CisgICAgICBlbHNlIGlmIChzZXJpYWxfbG9nYmFzZSA9PSBsb2diYXNlX29jdGFsKQorCWZwcmludGZfdW5maWx0ZXJlZCAoc2VyaWFsX2xvZ2ZwLCAiJTAzbyIsIGNoICYgMHhmZik7CisgICAgICBlbHNlCisJc3dpdGNoIChjaCkKKwkgIHsKKwkgIGNhc2UgJ1xcJzoJZnB1dHNfdW5maWx0ZXJlZCAoIlxcXFwiLCBzZXJpYWxfbG9nZnApOyBicmVhazsJCisJICBjYXNlICdcYic6CWZwdXRzX3VuZmlsdGVyZWQgKCJcXGIiLCBzZXJpYWxfbG9nZnApOyBicmVhazsJCisJICBjYXNlICdcZic6CWZwdXRzX3VuZmlsdGVyZWQgKCJcXGYiLCBzZXJpYWxfbG9nZnApOyBicmVhazsJCisJICBjYXNlICdcbic6CWZwdXRzX3VuZmlsdGVyZWQgKCJcXG4iLCBzZXJpYWxfbG9nZnApOyBicmVhazsJCisJICBjYXNlICdccic6CWZwdXRzX3VuZmlsdGVyZWQgKCJcXHIiLCBzZXJpYWxfbG9nZnApOyBicmVhazsJCisJICBjYXNlICdcdCc6CWZwdXRzX3VuZmlsdGVyZWQgKCJcXHQiLCBzZXJpYWxfbG9nZnApOyBicmVhazsJCisJICBjYXNlICdcdic6CWZwdXRzX3VuZmlsdGVyZWQgKCJcXHYiLCBzZXJpYWxfbG9nZnApOyBicmVhazsJCisJICBkZWZhdWx0OglmcHJpbnRmX3VuZmlsdGVyZWQgKHNlcmlhbF9sb2dmcCwgaXNwcmludCAoY2gpID8gIiVjIiA6ICJcXHglMDJ4IiwgY2ggJiAweEZGKTsgYnJlYWs7CisJICB9CisgICAgfQorfQorCit2b2lkCitzZXJpYWxfbG9nX2NvbW1hbmQgKGNtZCkKKyAgICAgY29uc3QgY2hhciAqY21kOworeworICBpZiAoIXNlcmlhbF9sb2dmcCkKKyAgICByZXR1cm47CisKKyAgc2VyaWFsX2N1cnJlbnRfdHlwZSA9ICdjJzsKKworICBmcHV0c191bmZpbHRlcmVkICgiXG5jICIsIHNlcmlhbF9sb2dmcCk7CisgIGZwdXRzX3VuZmlsdGVyZWQgKGNtZCwgc2VyaWFsX2xvZ2ZwKTsKKworICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgbG9nIGZpbGUgaXMgYXMgdXAtdG8tZGF0ZSBhcyBwb3NzaWJsZSwKKyAgICAgaW4gY2FzZSB3ZSBhcmUgZ2V0dGluZyByZWFkeSB0byBkdW1wIGNvcmUgb3Igc29tZXRoaW5nLiAqLworICBnZGJfZmx1c2ggKHNlcmlhbF9sb2dmcCk7Cit9CisKK2ludAorc2VyaWFsX3dyaXRlIChzY2IsIHN0ciwgbGVuKQorICAgICBzZXJpYWxfdCBzY2I7CisgICAgIGNvbnN0IGNoYXIgKnN0cjsKKyAgICAgaW50IGxlbjsKK3sKKyAgaWYgKHNlcmlhbF9sb2dmcCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCBjb3VudDsKKworICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbGVuOyBjb3VudCsrKQorCXNlcmlhbF9sb2djaGFyICgndycsIHN0cltjb3VudF0gJiAweGZmLCAwKTsKKworICAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGxvZyBmaWxlIGlzIGFzIHVwLXRvLWRhdGUgYXMgcG9zc2libGUsCisJIGluIGNhc2Ugd2UgYXJlIGdldHRpbmcgcmVhZHkgdG8gZHVtcCBjb3JlIG9yIHNvbWV0aGluZy4gKi8KKyAgICAgIGdkYl9mbHVzaCAoc2VyaWFsX2xvZ2ZwKTsKKyAgICB9CisKKyAgcmV0dXJuIChzY2IgLT4gb3BzIC0+IHdyaXRlIChzY2IsIHN0ciwgbGVuKSk7Cit9CisKK2ludAorc2VyaWFsX3JlYWRjaGFyIChzY2IsIHRpbWVvdXQpCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgaW50IHRpbWVvdXQ7Cit7CisgIGludCBjaDsKKworICBjaCA9IHNjYiAtPiBvcHMgLT4gcmVhZGNoYXIgKHNjYiwgdGltZW91dCk7CisgIGlmIChzZXJpYWxfbG9nZnAgIT0gTlVMTCkKKyAgICB7CisgICAgICBzZXJpYWxfbG9nY2hhciAoJ3InLCBjaCwgdGltZW91dCk7CisKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBsb2cgZmlsZSBpcyBhcyB1cC10by1kYXRlIGFzIHBvc3NpYmxlLAorCSBpbiBjYXNlIHdlIGFyZSBnZXR0aW5nIHJlYWR5IHRvIGR1bXAgY29yZSBvciBzb21ldGhpbmcuICovCisgICAgICBnZGJfZmx1c2ggKHNlcmlhbF9sb2dmcCk7CisgICAgfQorCisgIHJldHVybiAoY2gpOworfQorCitpbnQKK3NlcmlhbF9zZW5kX2JyZWFrIChzY2IpCisgICAgIHNlcmlhbF90IHNjYjsKK3sKKyAgaWYgKHNlcmlhbF9sb2dmcCAhPSBOVUxMKQorICAgIHNlcmlhbF9sb2djaGFyICgndycsIFNFUklBTF9CUkVBSywgMCk7CisKKyAgcmV0dXJuIChzY2IgLT4gb3BzIC0+IHNlbmRfYnJlYWsgKHNjYikpOworfQorCitzdGF0aWMgc3RydWN0IHNlcmlhbF9vcHMgKgorc2VyaWFsX2ludGVyZmFjZV9sb29rdXAgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIHN0cnVjdCBzZXJpYWxfb3BzICpvcHM7CisKKyAgZm9yIChvcHMgPSBzZXJpYWxfb3BzX2xpc3Q7IG9wczsgb3BzID0gb3BzLT5uZXh0KQorICAgIGlmIChzdHJjbXAgKG5hbWUsIG9wcy0+bmFtZSkgPT0gMCkKKyAgICAgIHJldHVybiBvcHM7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK3NlcmlhbF9hZGRfaW50ZXJmYWNlKG9wdGFibGUpCisgICAgIHN0cnVjdCBzZXJpYWxfb3BzICpvcHRhYmxlOworeworICBvcHRhYmxlLT5uZXh0ID0gc2VyaWFsX29wc19saXN0OworICBzZXJpYWxfb3BzX2xpc3QgPSBvcHRhYmxlOworfQorCisvKiBPcGVuIHVwIGEgZGV2aWNlIG9yIGEgbmV0d29yayBzb2NrZXQsIGRlcGVuZGluZyB1cG9uIHRoZSBzeW50YXggb2YgTkFNRS4gKi8KKworc2VyaWFsX3QKK3NlcmlhbF9vcGVuIChuYW1lKQorICAgICBjb25zdCBjaGFyICpuYW1lOworeworICBzZXJpYWxfdCBzY2I7CisgIHN0cnVjdCBzZXJpYWxfb3BzICpvcHM7CisKKyAgZm9yIChzY2IgPSBzY2JfYmFzZTsgc2NiOyBzY2IgPSBzY2ItPm5leHQpCisgICAgaWYgKHNjYi0+bmFtZSAmJiBzdHJjbXAgKHNjYi0+bmFtZSwgbmFtZSkgPT0gMCkKKyAgICAgIHsKKwlzY2ItPnJlZmNudCsrOworCXJldHVybiBzY2I7CisgICAgICB9CisKKyAgaWYgKHN0cmNtcCAobmFtZSwgIm9jZCIpID09IDApCisgICAgb3BzID0gc2VyaWFsX2ludGVyZmFjZV9sb29rdXAgKCJvY2QiKTsKKyAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAicGMiKSA9PSAwKQorICAgIG9wcyA9IHNlcmlhbF9pbnRlcmZhY2VfbG9va3VwICgicGMiKTsKKyAgZWxzZSBpZiAoc3RyY2hyIChuYW1lLCAnOicpKQorICAgIG9wcyA9IHNlcmlhbF9pbnRlcmZhY2VfbG9va3VwICgidGNwIik7CisgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICJscHQiLCAzKSA9PSAwKQorICAgIG9wcyA9IHNlcmlhbF9pbnRlcmZhY2VfbG9va3VwICgicGFyYWxsZWwiKTsKKyAgZWxzZQorICAgIG9wcyA9IHNlcmlhbF9pbnRlcmZhY2VfbG9va3VwICgiaGFyZHdpcmUiKTsKKworICBpZiAoIW9wcykKKyAgICByZXR1cm4gTlVMTDsKKworICBzY2IgPSAoc2VyaWFsX3QpeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgX3NlcmlhbF90KSk7CisKKyAgc2NiLT5vcHMgPSBvcHM7CisKKyAgc2NiLT5idWZjbnQgPSAwOworICBzY2ItPmJ1ZnAgPSBzY2ItPmJ1ZjsKKworICBpZiAoc2NiLT5vcHMtPm9wZW4oc2NiLCBuYW1lKSkKKyAgICB7CisgICAgICBmcmVlIChzY2IpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHNjYi0+bmFtZSA9IHN0cnNhdmUgKG5hbWUpOworICBzY2ItPm5leHQgPSBzY2JfYmFzZTsKKyAgc2NiLT5yZWZjbnQgPSAxOworICBzY2JfYmFzZSA9IHNjYjsKKworICBsYXN0X3NlcmlhbF9vcGVuZWQgPSBzY2I7CisKKyAgaWYgKHNlcmlhbF9sb2dmaWxlICE9IE5VTEwpCisgICAgeworICAgICAgc2VyaWFsX2xvZ2ZwID0gZ2RiX2ZvcGVuIChzZXJpYWxfbG9nZmlsZSwgInciKTsKKyAgICAgIGlmIChzZXJpYWxfbG9nZnAgPT0gTlVMTCkKKwlwZXJyb3Jfd2l0aF9uYW1lIChzZXJpYWxfbG9nZmlsZSk7CisgICAgfQorCisgIHJldHVybiBzY2I7Cit9CisKK3NlcmlhbF90CitzZXJpYWxfZmRvcGVuIChmZCkKKyAgICAgY29uc3QgaW50IGZkOworeworICBzZXJpYWxfdCBzY2I7CisgIHN0cnVjdCBzZXJpYWxfb3BzICpvcHM7CisKKyAgZm9yIChzY2IgPSBzY2JfYmFzZTsgc2NiOyBzY2IgPSBzY2ItPm5leHQpCisgICAgaWYgKHNjYi0+ZmQgPT0gZmQpCisgICAgICB7CisJc2NiLT5yZWZjbnQrKzsKKwlyZXR1cm4gc2NiOworICAgICAgfQorCisgIG9wcyA9IHNlcmlhbF9pbnRlcmZhY2VfbG9va3VwICgiaGFyZHdpcmUiKTsKKworICBpZiAoIW9wcykKKyAgICByZXR1cm4gTlVMTDsKKworICBzY2IgPSAoc2VyaWFsX3QpeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgX3NlcmlhbF90KSk7CisKKyAgc2NiLT5vcHMgPSBvcHM7CisKKyAgc2NiLT5idWZjbnQgPSAwOworICBzY2ItPmJ1ZnAgPSBzY2ItPmJ1ZjsKKworICBzY2ItPmZkID0gZmQ7CisKKyAgc2NiLT5uYW1lID0gTlVMTDsKKyAgc2NiLT5uZXh0ID0gc2NiX2Jhc2U7CisgIHNjYi0+cmVmY250ID0gMTsKKyAgc2NiX2Jhc2UgPSBzY2I7CisKKyAgbGFzdF9zZXJpYWxfb3BlbmVkID0gc2NiOworCisgIHJldHVybiBzY2I7Cit9CisKK3ZvaWQKK3NlcmlhbF9jbG9zZSAoc2NiLCByZWFsbHlfY2xvc2UpCisgICAgIHNlcmlhbF90IHNjYjsKKyAgICAgaW50IHJlYWxseV9jbG9zZTsKK3sKKyAgc2VyaWFsX3QgdG1wX3NjYjsKKworICBsYXN0X3NlcmlhbF9vcGVuZWQgPSBOVUxMOworCisgIGlmIChzZXJpYWxfbG9nZnApCisgICAgeworICAgICAgZnB1dHNfdW5maWx0ZXJlZCAoIlxuRW5kIG9mIGxvZ1xuIiwgc2VyaWFsX2xvZ2ZwKTsKKyAgICAgIHNlcmlhbF9jdXJyZW50X3R5cGUgPSAwOworCisgICAgICAvKiBYWFggLSBXaGF0IGlmIHNlcmlhbF9sb2dmcCA9PSBnZGJfc3Rkb3V0IG9yIGdkYl9zdGRlcnI/ICovCisgICAgICBnZGJfZmNsb3NlICgmc2VyaWFsX2xvZ2ZwKTsgCisgICAgICBzZXJpYWxfbG9nZnAgPSBOVUxMOworICAgIH0KKworLyogVGhpcyBpcyBib2d1cy4gIEl0J3Mgbm90IG91ciBmYXVsdCBpZiB5b3UgcGFzcyB1cyBhIGJhZCBzY2IuLi4hICBSb2IsIHlvdQorICAgc2hvdWxkIGZpeCB5b3VyIGNvZGUgaW5zdGVhZC4gICovCisKKyAgaWYgKCFzY2IpCisgICAgcmV0dXJuOworCisgIHNjYi0+cmVmY250LS07CisgIGlmIChzY2ItPnJlZmNudCA+IDApCisgICAgcmV0dXJuOworCisgIGlmIChyZWFsbHlfY2xvc2UpCisgICAgc2NiLT5vcHMtPmNsb3NlIChzY2IpOworCisgIGlmIChzY2ItPm5hbWUpCisgICAgZnJlZSAoc2NiLT5uYW1lKTsKKworICBpZiAoc2NiX2Jhc2UgPT0gc2NiKQorICAgIHNjYl9iYXNlID0gc2NiX2Jhc2UtPm5leHQ7CisgIGVsc2UKKyAgICBmb3IgKHRtcF9zY2IgPSBzY2JfYmFzZTsgdG1wX3NjYjsgdG1wX3NjYiA9IHRtcF9zY2ItPm5leHQpCisgICAgICB7CisJaWYgKHRtcF9zY2ItPm5leHQgIT0gc2NiKQorCSAgY29udGludWU7CisKKwl0bXBfc2NiLT5uZXh0ID0gdG1wX3NjYi0+bmV4dC0+bmV4dDsKKwlicmVhazsKKyAgICAgIH0KKworICBmcmVlKHNjYik7Cit9CisKKyNpZiAwCisvKgorVGhlIGNvbm5lY3QgY29tbWFuZCBpcyAjaWYgMCBiZWNhdXNlIEkgaGFkbid0IHRob3VnaHQgb2YgYW4gZWxlZ2FudAord2F5IHRvIHdhaXQgZm9yIEkvTyBvbiB0d28gc2VyaWFsX3QncyBzaW11bHRhbmVvdXNseS4gIFR3byBzb2x1dGlvbnMKK2NhbWUgdG8gbWluZDoKKworCTEpIEZvcmssIGFuZCBoYXZlIGhhdmUgb25lIGZvcmsgaGFuZGxlIHRoZSB0byB1c2VyIGRpcmVjdGlvbiwKKwkgICBhbmQgaGF2ZSB0aGUgb3RoZXIgaGFuZCB0aGUgdG8gdGFyZ2V0IGRpcmVjdGlvbi4gIFRoaXMKKwkgICBvYnZpb3VzbHkgd29uJ3QgY3V0IGl0IGZvciBNU0RPUy4KKworCTIpIFVzZSBzb21ldGhpbmcgbGlrZSBzZWxlY3QuICBUaGlzIGFzc3VtZXMgdGhhdCBzdGRpbiBhbmQKKwkgICB0aGUgdGFyZ2V0IHNpZGUgY2FuIGJvdGggYmUgd2FpdGVkIG9uIHZpYSB0aGUgc2FtZQorCSAgIG1lY2hhbmlzbS4gIFRoaXMgbWF5IG5vdCBiZSB0cnVlIGZvciBET1MsIGlmIEdEQiBpcworCSAgIHRhbGtpbmcgdG8gdGhlIHRhcmdldCB2aWEgYSBUQ1Agc29ja2V0LgorLWdyb3NzbWFuLCA4IEp1biA5MworKi8KKworLyogQ29ubmVjdCB0aGUgdXNlciBkaXJlY3RseSB0byB0aGUgcmVtb3RlIHN5c3RlbS4gIFRoaXMgY29tbWFuZCBhY3RzIGp1c3QgbGlrZQorICAgdGhlICdjdScgb3IgJ3RpcCcgY29tbWFuZC4gIFVzZSA8Q1I+fi4gb3IgPENSPn5eRCB0byBicmVhayBvdXQuICAqLworCitzdGF0aWMgc2VyaWFsX3QgdHR5X2Rlc2M7CQkvKiBDb250cm9sbGluZyB0ZXJtaW5hbCAqLworCitzdGF0aWMgdm9pZAorY2xlYW51cF90dHkodHR5c3RhdGUpCisgICAgIHNlcmlhbF90dHlzdGF0ZSB0dHlzdGF0ZTsKK3sKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcclxuW0V4aXRpbmcgY29ubmVjdCBtb2RlXVxyXG4iKTsKKyAgU0VSSUFMX1NFVF9UVFlfU1RBVEUgKHR0eV9kZXNjLCB0dHlzdGF0ZSk7CisgIGZyZWUgKHR0eXN0YXRlKTsKKyAgU0VSSUFMX0NMT1NFICh0dHlfZGVzYyk7Cit9CisKK3N0YXRpYyB2b2lkCitjb25uZWN0X2NvbW1hbmQgKGFyZ3MsIGZyb210dHkpCisgICAgIGNoYXIJKmFyZ3M7CisgICAgIGludAlmcm9tdHR5OworeworICBpbnQgYzsKKyAgY2hhciBjdXJfZXNjID0gMDsKKyAgc2VyaWFsX3R0eXN0YXRlIHR0eXN0YXRlOworICBzZXJpYWxfdCBwb3J0X2Rlc2M7CQkvKiBUVFkgcG9ydCAqLworCisgIGRvbnRfcmVwZWF0KCk7CisKKyAgaWYgKGFyZ3MpCisgICAgZnByaW50Zl91bmZpbHRlcmVkKGdkYl9zdGRlcnIsICJUaGlzIGNvbW1hbmQgdGFrZXMgbm8gYXJncy4gIFRoZXkgaGF2ZSBiZWVuIGlnbm9yZWQuXG4iKTsKKwkKKyAgcHJpbnRmX3VuZmlsdGVyZWQoIltFbnRlcmluZyBjb25uZWN0IG1vZGUuICBVc2Ugfi4gb3Igfl5EIHRvIGVzY2FwZV1cbiIpOworCisgIHR0eV9kZXNjID0gU0VSSUFMX0ZET1BFTiAoMCk7CisgIHBvcnRfZGVzYyA9IGxhc3Rfc2VyaWFsX29wZW5lZDsKKworICB0dHlzdGF0ZSA9IFNFUklBTF9HRVRfVFRZX1NUQVRFICh0dHlfZGVzYyk7CisKKyAgU0VSSUFMX1JBVyAodHR5X2Rlc2MpOworICBTRVJJQUxfUkFXIChwb3J0X2Rlc2MpOworCisgIG1ha2VfY2xlYW51cCAoY2xlYW51cF90dHksIHR0eXN0YXRlKTsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpbnQgbWFzazsKKworICAgICAgbWFzayA9IFNFUklBTF9XQUlUXzIgKHR0eV9kZXNjLCBwb3J0X2Rlc2MsIC0xKTsKKworICAgICAgaWYgKG1hc2sgJiAyKQorCXsJCQkvKiB0dHkgaW5wdXQgKi8KKwkgIGNoYXIgY3g7CisKKwkgIHdoaWxlICgxKQorCSAgICB7CisJICAgICAgYyA9IFNFUklBTF9SRUFEQ0hBUih0dHlfZGVzYywgMCk7CisKKwkgICAgICBpZiAoYyA9PSBTRVJJQUxfVElNRU9VVCkKKwkJICBicmVhazsKKworCSAgICAgIGlmIChjIDwgMCkKKwkJcGVycm9yX3dpdGhfbmFtZSgiY29ubmVjdCIpOworCisJICAgICAgY3ggPSBjOworCSAgICAgIFNFUklBTF9XUklURShwb3J0X2Rlc2MsICZjeCwgMSk7CisKKwkgICAgICBzd2l0Y2ggKGN1cl9lc2MpCisJCXsKKwkJY2FzZSAwOgorCQkgIGlmIChjID09ICdccicpCisJCSAgICBjdXJfZXNjID0gYzsKKwkJICBicmVhazsKKwkJY2FzZSAnXHInOgorCQkgIGlmIChjID09ICd+JykKKwkJICAgIGN1cl9lc2MgPSBjOworCQkgIGVsc2UKKwkJICAgIGN1cl9lc2MgPSAwOworCQkgIGJyZWFrOworCQljYXNlICd+JzoKKwkJICBpZiAoYyA9PSAnLicgfHwgYyA9PSAnXDAwNCcpCisJCSAgICByZXR1cm47CisJCSAgZWxzZQorCQkgICAgY3VyX2VzYyA9IDA7CisJCX0KKwkgICAgfQorCX0KKworICAgICAgaWYgKG1hc2sgJiAxKQorCXsJCQkvKiBQb3J0IGlucHV0ICovCisJICBjaGFyIGN4OworCisJICB3aGlsZSAoMSkKKwkgICAgeworCSAgICAgIGMgPSBTRVJJQUxfUkVBRENIQVIocG9ydF9kZXNjLCAwKTsKKworCSAgICAgIGlmIChjID09IFNFUklBTF9USU1FT1VUKQorCQkgIGJyZWFrOworCisJICAgICAgaWYgKGMgPCAwKQorCQlwZXJyb3Jfd2l0aF9uYW1lKCJjb25uZWN0Iik7CisKKwkgICAgICBjeCA9IGM7CisKKwkgICAgICBTRVJJQUxfV1JJVEUodHR5X2Rlc2MsICZjeCwgMSk7CisJICAgIH0KKwl9CisgICAgfQorfQorI2VuZGlmIC8qIDAgKi8KKworLyogVkFSQVJHUyAqLwordm9pZAorI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworc2VyaWFsX3ByaW50ZiAoc2VyaWFsX3QgZGVzYywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisjZWxzZQorc2VyaWFsX3ByaW50ZiAodmFfYWxpc3QpCisgICAgIHZhX2RjbAorI2VuZGlmCit7CisgIHZhX2xpc3QgYXJnczsKKyAgY2hhciAqYnVmOworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyNlbHNlCisgIHNlcmlhbF90IGRlc2M7CisgIGNoYXIgKmZvcm1hdDsKKworICB2YV9zdGFydCAoYXJncyk7CisgIGRlc2MgPSB2YV9hcmcgKGFyZ3MsIHNlcmlhbF90KTsKKyAgZm9ybWF0ID0gdmFfYXJnIChhcmdzLCBjaGFyICopOworI2VuZGlmCisKKyAgdmFzcHJpbnRmICgmYnVmLCBmb3JtYXQsIGFyZ3MpOworICBTRVJJQUxfV1JJVEUgKGRlc2MsIGJ1Ziwgc3RybGVuIChidWYpKTsKKworICBmcmVlIChidWYpOworICB2YV9lbmQgKGFyZ3MpOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9zZXJpYWwgKCkKK3sKKyNpZiAwCisgIGFkZF9jb20gKCJjb25uZWN0IiwgY2xhc3Nfb2JzY3VyZSwgY29ubmVjdF9jb21tYW5kLAorCSAgICJDb25uZWN0IHRoZSB0ZXJtaW5hbCBkaXJlY3RseSB1cCB0byB0aGUgY29tbWFuZCBtb25pdG9yLlxuXAorVXNlIDxDUj5+LiBvciA8Q1I+fl5EIHRvIGJyZWFrIG91dC4iKTsKKyNlbmRpZiAvKiAwICovCisKKyAgYWRkX3Nob3dfZnJvbV9zZXQgCisgICAgKGFkZF9zZXRfY21kICgicmVtb3RlbG9nZmlsZSIsIG5vX2NsYXNzLAorCQkgIHZhcl9maWxlbmFtZSwgKGNoYXIgKikgJnNlcmlhbF9sb2dmaWxlLAorCQkgICJTZXQgZmlsZW5hbWUgZm9yIHJlbW90ZSBzZXNzaW9uIHJlY29yZGluZy5cblwKK1RoaXMgZmlsZSBpcyB1c2VkIHRvIHJlY29yZCB0aGUgcmVtb3RlIHNlc3Npb24gZm9yIGZ1dHVyZSBwbGF5YmFja1xuXAorYnkgZ2Ric2VydmVyLiIsIAorCQkgICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKKworICBhZGRfc2hvd19mcm9tX3NldCAKKyAgICAoYWRkX3NldF9lbnVtX2NtZCAoInJlbW90ZWxvZ2Jhc2UiLCBub19jbGFzcywKKwkJICAgICAgIGxvZ2Jhc2VfZW51bXMsIChjaGFyICopICZzZXJpYWxfbG9nYmFzZSwKKwkJICAgICAgICJTZXQgbnVtZXJpY2FsIGJhc2UgZm9yIHJlbW90ZSBzZXNzaW9uIGxvZ2dpbmciLAorCQkgICAgICAgJnNldGxpc3QpLAorICAgICAmc2hvd2xpc3QpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3NlcmlhbC5oIGIvZ2RiL3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MzMyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvc2VyaWFsLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qIFJlbW90ZSBzZXJpYWwgc3VwcG9ydCBpbnRlcmZhY2UgZGVmaW5pdGlvbnMgZm9yIEdEQiwgdGhlIEdOVSBEZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgU0VSSUFMX0gKKyNkZWZpbmUgU0VSSUFMX0gKKworLyogVGVybWluYWwgc3RhdGUgcG9pbnRlci4gIFRoaXMgaXMgc3BlY2lmaWMgdG8gZWFjaCB0eXBlIG9mIGludGVyZmFjZS4gKi8KKwordHlwZWRlZiBQVFIgc2VyaWFsX3R0eXN0YXRlOworCitzdHJ1Y3QgX3NlcmlhbF90Cit7CisgIGludCBmZDsJCQkvKiBGaWxlIGRlc2NyaXB0b3IgKi8KKyAgc3RydWN0IHNlcmlhbF9vcHMgKm9wczsJLyogRnVuY3Rpb24gdmVjdG9yICovCisgIHNlcmlhbF90dHlzdGF0ZSB0dHlzdGF0ZTsJLyogTm90IHVzZWQgKHlldCkgKi8KKyAgaW50IGJ1ZmNudDsJCQkvKiBBbW91bnQgb2YgZGF0YSBpbiByZWNlaXZlIGJ1ZmZlciAqLworICB1bnNpZ25lZCBjaGFyICpidWZwOwkJLyogQ3VycmVudCBieXRlICovCisgIHVuc2lnbmVkIGNoYXIgYnVmW0JVRlNJWl07CS8qIERhIGJ1ZmZlciBpdHNlbGYgKi8KKyAgaW50IGN1cnJlbnRfdGltZW91dDsJCS8qICh0ZXJtaW97c30gb25seSksIGxhc3QgdmFsdWUgb2YgVlRJTUUgKi8KKyAgLyogc2VyLXVuaXguYyB0ZXJtaW97LHN9IG9ubHksIHdlIHN0aWxsIG5lZWQgdG8gd2FpdCBmb3IgdGhpcyBtYW55IG1vcmUKKyAgICAgc2Vjb25kcy4gICovCisgIGludCB0aW1lb3V0X3JlbWFpbmluZzsKKyAgY2hhciAqbmFtZTsJCQkvKiBUaGUgbmFtZSBvZiB0aGUgZGV2aWNlIG9yIGhvc3QgKi8KKyAgc3RydWN0IF9zZXJpYWxfdCAqbmV4dDsJLyogUG9pbnRlciB0byB0aGUgbmV4dCBzZXJpYWxfdCAqLworICBpbnQgcmVmY250OwkJCS8qIE51bWJlciBvZiBwb2ludGVycyB0byB0aGlzIGJsb2NrICovCit9OworCit0eXBlZGVmIHN0cnVjdCBfc2VyaWFsX3QgKnNlcmlhbF90OworCitzdHJ1Y3Qgc2VyaWFsX29wcyB7CisgIGNoYXIgKm5hbWU7CisgIHN0cnVjdCBzZXJpYWxfb3BzICpuZXh0OworICBpbnQgKCpvcGVuKSBQQVJBTVMgKChzZXJpYWxfdCwgY29uc3QgY2hhciAqbmFtZSkpOworICB2b2lkICgqY2xvc2UpIFBBUkFNUyAoKHNlcmlhbF90KSk7CisgIGludCAoKnJlYWRjaGFyKSBQQVJBTVMgKChzZXJpYWxfdCwgaW50IHRpbWVvdXQpKTsKKyAgaW50ICgqd3JpdGUpIFBBUkFNUyAoKHNlcmlhbF90LCBjb25zdCBjaGFyICpzdHIsIGludCBsZW4pKTsKKyAgLyogRGlzY2FyZCBwZW5kaW5nIG91dHB1dCAqLworICBpbnQgKCpmbHVzaF9vdXRwdXQpIFBBUkFNUyAoKHNlcmlhbF90KSk7CisgIC8qIERpc2NhcmQgcGVuZGluZyBpbnB1dCAqLworICBpbnQgKCpmbHVzaF9pbnB1dCkgUEFSQU1TICgoc2VyaWFsX3QpKTsKKyAgaW50ICgqc2VuZF9icmVhaykgUEFSQU1TICgoc2VyaWFsX3QpKTsKKyAgdm9pZCAoKmdvX3JhdykgUEFSQU1TICgoc2VyaWFsX3QpKTsKKyAgc2VyaWFsX3R0eXN0YXRlICgqZ2V0X3R0eV9zdGF0ZSkgUEFSQU1TICgoc2VyaWFsX3QpKTsKKyAgaW50ICgqc2V0X3R0eV9zdGF0ZSkgUEFSQU1TICgoc2VyaWFsX3QsIHNlcmlhbF90dHlzdGF0ZSkpOworICB2b2lkICgqcHJpbnRfdHR5X3N0YXRlKSBQQVJBTVMgKChzZXJpYWxfdCwgc2VyaWFsX3R0eXN0YXRlKSk7CisgIGludCAoKm5vZmx1c2hfc2V0X3R0eV9zdGF0ZSkKKyAgICBQQVJBTVMgKChzZXJpYWxfdCwgc2VyaWFsX3R0eXN0YXRlLCBzZXJpYWxfdHR5c3RhdGUpKTsKKyAgaW50ICgqc2V0YmF1ZHJhdGUpIFBBUkFNUyAoKHNlcmlhbF90LCBpbnQgcmF0ZSkpOworICBpbnQgKCpzZXRzdG9wYml0cykgUEFSQU1TICgoc2VyaWFsX3QsIGludCBudW0pKTsKKyAgLyogV2FpdCBmb3Igb3V0cHV0IHRvIGRyYWluICovCisgIGludCAoKmRyYWluX291dHB1dCkgUEFSQU1TICgoc2VyaWFsX3QpKTsKK307CisKKy8qIEFkZCBhIG5ldyBzZXJpYWwgaW50ZXJmYWNlIHRvIHRoZSBpbnRlcmZhY2UgbGlzdCAqLworCit2b2lkIHNlcmlhbF9hZGRfaW50ZXJmYWNlIFBBUkFNUyAoKHN0cnVjdCBzZXJpYWxfb3BzICpvcHRhYmxlKSk7CisKK3NlcmlhbF90IHNlcmlhbF9vcGVuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKKworc2VyaWFsX3Qgc2VyaWFsX2Zkb3BlbiBQQVJBTVMgKChjb25zdCBpbnQgZmQpKTsKKworLyogRm9yIG1vc3Qgcm91dGluZXMsIGlmIGEgZmFpbHVyZSBpcyBpbmRpY2F0ZWQsIHRoZW4gZXJybm8gc2hvdWxkIGJlCisgICBleGFtaW5lZC4gICovCisKKy8qIFRyeSB0byBvcGVuIE5BTUUuICBSZXR1cm5zIGEgbmV3IHNlcmlhbF90IG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4KKyAqLworCisjZGVmaW5lIFNFUklBTF9PUEVOKE5BTUUpIHNlcmlhbF9vcGVuKE5BTUUpCisKKy8qIE9wZW4gYSBuZXcgc2VyaWFsIHN0cmVhbSB1c2luZyBhIGZpbGUgaGFuZGxlLiAgKi8KKworI2RlZmluZSBTRVJJQUxfRkRPUEVOKEZEKSBzZXJpYWxfZmRvcGVuKEZEKQorCisvKiBBbGxvdyBwZW5kaW5nIG91dHB1dCB0byBkcmFpbi4gKi8KKworI2RlZmluZSBTRVJJQUxfRFJBSU5fT1VUUFVUKFNFUklBTF9UKSBcCisgICgoU0VSSUFMX1QpLT5vcHMtPmRyYWluX291dHB1dCgoU0VSSUFMX1QpKSkKKyAgCisvKiBGbHVzaCAoZGlzY2FyZCkgcGVuZGluZyBvdXRwdXQuICBNaWdodCBhbHNvIGZsdXNoIGlucHV0IChpZiB0aGlzIHN5c3RlbSBjYW4ndCBmbHVzaAorICAgb25seSBvdXRwdXQpLiAgKi8KKworI2RlZmluZSBTRVJJQUxfRkxVU0hfT1VUUFVUKFNFUklBTF9UKSBcCisgICgoU0VSSUFMX1QpLT5vcHMtPmZsdXNoX291dHB1dCgoU0VSSUFMX1QpKSkKKworLyogRmx1c2ggcGVuZGluZyBpbnB1dC4gIE1pZ2h0IGFsc28gZmx1c2ggb3V0cHV0IChpZiB0aGlzIHN5c3RlbSBjYW4ndCBmbHVzaAorICAgb25seSBpbnB1dCkuICAqLworCisjZGVmaW5lIFNFUklBTF9GTFVTSF9JTlBVVChTRVJJQUxfVClcCisgICgoKihTRVJJQUxfVCktPm9wcy0+Zmx1c2hfaW5wdXQpICgoU0VSSUFMX1QpKSkKKworLyogU2VuZCBhIGJyZWFrIGJldHdlZW4gMC4yNSBhbmQgMC41IHNlY29uZHMgbG9uZy4gICovCisKK2V4dGVybiBpbnQgc2VyaWFsX3NlbmRfYnJlYWsgUEFSQU1TICgoc2VyaWFsX3Qgc2NiKSk7CisKKyNkZWZpbmUgU0VSSUFMX1NFTkRfQlJFQUsoU0VSSUFMX1QpIHNlcmlhbF9zZW5kX2JyZWFrIChTRVJJQUxfVCkKKworLyogVHVybiB0aGUgcG9ydCBpbnRvIHJhdyBtb2RlLiAqLworCisjZGVmaW5lIFNFUklBTF9SQVcoU0VSSUFMX1QpIChTRVJJQUxfVCktPm9wcy0+Z29fcmF3KChTRVJJQUxfVCkpCisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gYSBuZXdseSBtYWxsb2MnZCB0dHlzdGF0ZSBjb250YWluaW5nIHRoZSBzdGF0ZQorICAgb2YgdGhlIHR0eS4gICovCisjZGVmaW5lIFNFUklBTF9HRVRfVFRZX1NUQVRFKFNFUklBTF9UKSAoU0VSSUFMX1QpLT5vcHMtPmdldF90dHlfc3RhdGUoKFNFUklBTF9UKSkKKworLyogU2V0IHRoZSBzdGF0ZSBvZiB0aGUgdHR5IHRvIFRUWVNUQVRFLiAgVGhlIGNoYW5nZSBpcyBpbW1lZGlhdGUuCisgICBXaGVuIGNoYW5naW5nIHRvIG9yIGZyb20gcmF3IG1vZGUsIGlucHV0IG1pZ2h0IGJlIGRpc2NhcmRlZC4KKyAgIFJldHVybnMgMCBmb3Igc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgZm9yIGVycm9yIChpbiB3aGljaCBjYXNlIGVycm5vCisgICBjb250YWlucyB0aGUgZXJyb3IpLiAgKi8KKyNkZWZpbmUgU0VSSUFMX1NFVF9UVFlfU1RBVEUoU0VSSUFMX1QsIFRUWVNUQVRFKSAoU0VSSUFMX1QpLT5vcHMtPnNldF90dHlfc3RhdGUoKFNFUklBTF9UKSwgKFRUWVNUQVRFKSkKKworLyogcHJpbnRmX2ZpbHRlcmVkIGEgdXNlci1jb21wcmVoZW5zaWJsZSBkZXNjcmlwdGlvbiBvZiB0dHlzdGF0ZS4gICovCisjZGVmaW5lIFNFUklBTF9QUklOVF9UVFlfU1RBVEUoU0VSSUFMX1QsIFRUWVNUQVRFKSBcCisgICgoKigoU0VSSUFMX1QpLT5vcHMtPnByaW50X3R0eV9zdGF0ZSkpICgoU0VSSUFMX1QpLCAoVFRZU1RBVEUpKSkKKworLyogU2V0IHRoZSB0dHkgc3RhdGUgdG8gTkVXX1RUWVNUQVRFLCB3aGVyZSBPTERfVFRZU1RBVEUgaXMgdGhlCisgICBjdXJyZW50IHN0YXRlIChnZW5lcmFsbHkgb2J0YWluZWQgZnJvbSBhIHJlY2VudCBjYWxsIHRvCisgICBTRVJJQUxfR0VUX1RUWV9TVEFURSksIGJ1dCBiZSBjYXJlZnVsIG5vdCB0byBkaXNjYXJkIGFueSBpbnB1dC4KKyAgIFRoaXMgbWVhbnMgdGhhdCB3ZSBuZXZlciBzd2l0Y2ggaW4gb3Igb3V0IG9mIHJhdyBtb2RlLCBldmVuCisgICBpZiBORVdfVFRZU1RBVEUgc3BlY2lmaWVzIGEgc3dpdGNoLiAgKi8KKyNkZWZpbmUgU0VSSUFMX05PRkxVU0hfU0VUX1RUWV9TVEFURShTRVJJQUxfVCwgTkVXX1RUWVNUQVRFLCBPTERfVFRZU1RBVEUpIFwKKyAgKCgqKChTRVJJQUxfVCktPm9wcy0+bm9mbHVzaF9zZXRfdHR5X3N0YXRlKSkgXAorICAgICgoU0VSSUFMX1QpLCAoTkVXX1RUWVNUQVRFKSwgKE9MRF9UVFlTVEFURSkpKQorCisvKiBSZWFkIG9uZSBjaGFyIGZyb20gdGhlIHNlcmlhbCBkZXZpY2Ugd2l0aCBUSU1FT1VUIHNlY29uZHMgdG8gd2FpdAorICAgb3IgLTEgdG8gd2FpdCBmb3JldmVyLiAgVXNlIHRpbWVvdXQgb2YgMCB0byBlZmZlY3QgYSBwb2xsLiBSZXR1cm5zCisgICBjaGFyIGlmIG9rLCBlbHNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvZGVzLiAgTm90ZSB0aGF0IGFsbCBlcnJvcgorICAgY29kZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgPCAwLiAgKi8KKworI2RlZmluZSBTRVJJQUxfRVJST1IgLTEJCS8qIEdlbmVyYWwgZXJyb3IsIHNlZSBlcnJubyBmb3IgZGV0YWlscyAqLworI2RlZmluZSBTRVJJQUxfVElNRU9VVCAtMgorI2RlZmluZSBTRVJJQUxfRU9GIC0zCisKK2V4dGVybiBpbnQgc2VyaWFsX3JlYWRjaGFyIFBBUkFNUyAoKHNlcmlhbF90IHNjYiwgaW50IHRpbWVvdXQpKTsKKworI2RlZmluZSBTRVJJQUxfUkVBRENIQVIoU0VSSUFMX1QsIFRJTUVPVVQpICBzZXJpYWxfcmVhZGNoYXIgKFNFUklBTF9ULCBUSU1FT1VUKQorCisvKiBTZXQgdGhlIGJhdWRyYXRlIHRvIHRoZSBkZWNpbWFsIHZhbHVlIHN1cHBsaWVkLiAgUmV0dXJucyAwIGZvciBzdWNjZXNzLAorICAgLTEgZm9yIGZhaWx1cmUuICAqLworCisjZGVmaW5lIFNFUklBTF9TRVRCQVVEUkFURShTRVJJQUxfVCwgUkFURSkgKChTRVJJQUxfVCktPm9wcy0+c2V0YmF1ZHJhdGUoKFNFUklBTF9UKSwgUkFURSkpCisKKy8qIFNldCB0aGUgbnVtYmVyIG9mIHN0b3AgYml0cyB0byB0aGUgdmFsdWUgc3BlY2lmaWVkLiAgUmV0dXJucyAwIGZvciBzdWNjZXNzLAorICAgLTEgZm9yIGZhaWx1cmUuICAqLworCisjZGVmaW5lIFNFUklBTF8xX1NUT1BCSVRTIDEKKyNkZWZpbmUgU0VSSUFMXzFfQU5EX0FfSEFMRl9TVE9QQklUUyAyIC8qIDEuNSBiaXRzLCBzbmlja2VyLi4uICovCisjZGVmaW5lIFNFUklBTF8yX1NUT1BCSVRTIDMKKworI2RlZmluZSBTRVJJQUxfU0VUU1RPUEJJVFMoU0VSSUFMX1QsIE5VTSkgKChTRVJJQUxfVCktPm9wcy0+c2V0c3RvcGJpdHMoKFNFUklBTF9UKSwgTlVNKSkKKworLyogV3JpdGUgTEVOIGNoYXJzIGZyb20gU1RSSU5HIHRvIHRoZSBwb3J0IFNFUklBTF9ULiAgUmV0dXJucyAwIGZvcgorICAgc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuICAqLworCitleHRlcm4gaW50IHNlcmlhbF93cml0ZSBQQVJBTVMgKChzZXJpYWxfdCBzY2IsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbikpOworCisjZGVmaW5lIFNFUklBTF9XUklURShTRVJJQUxfVCwgU1RSSU5HLExFTikgIHNlcmlhbF93cml0ZSAoU0VSSUFMX1QsIFNUUklORywgTEVOKQorCisvKiBQdXNoIG91dCBhbGwgYnVmZmVycywgY2xvc2UgdGhlIGRldmljZSBhbmQgZGVzdHJveSBTRVJJQUxfVC4gKi8KKworZXh0ZXJuIHZvaWQgc2VyaWFsX2Nsb3NlIFBBUkFNUyAoKHNlcmlhbF90LCBpbnQpKTsKKworI2RlZmluZSBTRVJJQUxfQ0xPU0UoU0VSSUFMX1QpIHNlcmlhbF9jbG9zZShTRVJJQUxfVCwgMSkKKworLyogUHVzaCBvdXQgYWxsIGJ1ZmZlcnMgYW5kIGRlc3Ryb3kgU0VSSUFMX1Qgd2l0aG91dCBjbG9zaW5nIHRoZSBkZXZpY2UuICAqLworCisjZGVmaW5lIFNFUklBTF9VTl9GRE9QRU4oU0VSSUFMX1QpIHNlcmlhbF9jbG9zZShTRVJJQUxfVCwgMCkKKworZXh0ZXJuIHZvaWQgc2VyaWFsX3ByaW50ZiBQQVJBTVMgKChzZXJpYWxfdCBkZXNjLCBjb25zdCBjaGFyICosIC4uLikpCisgICAgIEFUVFJfRk9STUFUKHByaW50ZiwgMiwgMyk7CisKKy8qIEZpbGUgaW4gd2hpY2ggdG8gcmVjb3JkIHRoZSByZW1vdGUgZGVidWdnaW5nIHNlc3Npb24gKi8KKworZXh0ZXJuIHZvaWQgc2VyaWFsX2xvZ19jb21tYW5kIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOworCisjZW5kaWYgLyogU0VSSUFMX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi9zaC1zdHViLmMgYi9nZGIvc2gtc3R1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMzZjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvc2gtc3R1Yi5jCkBAIC0wLDAgKzEsMTU0OSBAQAorLyogc2gtc3R1Yi5jIC0tIGRlYnVnZ2luZyBzdHViIGZvciB0aGUgSGl0YWNoaS1TSC4gCisKKyBOT1RFISEgVGhpcyBjb2RlIGhhcyB0byBiZSBjb21waWxlZCB3aXRoIG9wdGltaXphdGlvbiwgb3RoZXJ3aXNlIHRoZSAKKyBmdW5jdGlvbiBpbmxpbmluZyB3aGljaCBnZW5lcmF0ZXMgdGhlIGV4Y2VwdGlvbiBoYW5kbGVycyB3b24ndCB3b3JrLgorIAorKi8KKworLyogICBUaGlzIGlzIG9yaWdpbmFsbHkgYmFzZWQgb24gYW4gbTY4ayBzb2Z0d2FyZSBzdHViIHdyaXR0ZW4gYnkgR2xlbm4KKyAgICAgRW5nZWwgYXQgSFAsIGJ1dCBoYXMgY2hhbmdlZCBxdWl0ZSBhIGJpdC4gCisKKyAgICAgTW9kaWZpY2F0aW9ucyBmb3IgdGhlIFNIIGJ5IEJlbiBMZWUgYW5kIFN0ZXZlIENoYW1iZXJsYWluCisKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwkJVEhJUyBTT0ZUV0FSRSBJUyBOT1QgQ09QWVJJR0hURUQKKworICAgSFAgb2ZmZXJzIHRoZSBmb2xsb3dpbmcgZm9yIHVzZSBpbiB0aGUgcHVibGljIGRvbWFpbi4gIEhQIG1ha2VzIG5vCisgICB3YXJyYW50eSB3aXRoIHJlZ2FyZCB0byB0aGUgc29mdHdhcmUgb3IgaXQncyBwZXJmb3JtYW5jZSBhbmQgdGhlCisgICB1c2VyIGFjY2VwdHMgdGhlIHNvZnR3YXJlICJBUyBJUyIgd2l0aCBhbGwgZmF1bHRzLgorCisgICBIUCBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgV0lUSCBSRUdBUkQKKyAgIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBSZW1vdGUgY29tbXVuaWNhdGlvbiBwcm90b2NvbC4KKworICAgQSBkZWJ1ZyBwYWNrZXQgd2hvc2UgY29udGVudHMgYXJlIDxkYXRhPgorICAgaXMgZW5jYXBzdWxhdGVkIGZvciB0cmFuc21pc3Npb24gaW4gdGhlIGZvcm06CisKKwkkIDxkYXRhPiAjIENTVU0xIENTVU0yCisKKwk8ZGF0YT4gbXVzdCBiZSBBU0NJSSBhbHBoYW51bWVyaWMgYW5kIGNhbm5vdCBpbmNsdWRlIGNoYXJhY3RlcnMKKwknJCcgb3IgJyMnLiAgSWYgPGRhdGE+IHN0YXJ0cyB3aXRoIHR3byBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5CisJJzonLCB0aGVuIHRoZSBleGlzdGluZyBzdHVicyBpbnRlcnByZXQgdGhpcyBhcyBhIHNlcXVlbmNlIG51bWJlci4KKworCUNTVU0xIGFuZCBDU1VNMiBhcmUgYXNjaWkgaGV4IHJlcHJlc2VudGF0aW9uIG9mIGFuIDgtYml0IAorCWNoZWNrc3VtIG9mIDxkYXRhPiwgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgbmliYmxlIGlzIHNlbnQgZmlyc3QuCisJdGhlIGhleCBkaWdpdHMgMC05LGEtZiBhcmUgdXNlZC4KKworICAgUmVjZWl2ZXIgcmVzcG9uZHMgd2l0aDoKKworCSsJLSBpZiBDU1VNIGlzIGNvcnJlY3QgYW5kIHJlYWR5IGZvciBuZXh0IHBhY2tldAorCS0JLSBpZiBDU1VNIGlzIGluY29ycmVjdAorCisgICA8ZGF0YT4gaXMgYXMgZm9sbG93czoKKyAgIEFsbCB2YWx1ZXMgYXJlIGVuY29kZWQgaW4gYXNjaWkgaGV4IGRpZ2l0cy4KKworCVJlcXVlc3QJCVBhY2tldAorCisJcmVhZCByZWdpc3RlcnMgIGcKKwlyZXBseQkJWFguLi4uWAkJRWFjaCBieXRlIG9mIHJlZ2lzdGVyIGRhdGEKKwkJCQkJaXMgZGVzY3JpYmVkIGJ5IHR3byBoZXggZGlnaXRzLgorCQkJCQlSZWdpc3RlcnMgYXJlIGluIHRoZSBpbnRlcm5hbCBvcmRlcgorCQkJCQlmb3IgR0RCLCBhbmQgdGhlIGJ5dGVzIGluIGEgcmVnaXN0ZXIKKwkJCQkJYXJlIGluIHRoZSBzYW1lIG9yZGVyIHRoZSBtYWNoaW5lIHVzZXMuCisJCQlvciBFTk4JCWZvciBhbiBlcnJvci4KKworCXdyaXRlIHJlZ3MJR1hYLi5YWAkJRWFjaCBieXRlIG9mIHJlZ2lzdGVyIGRhdGEKKwkJCQkJaXMgZGVzY3JpYmVkIGJ5IHR3byBoZXggZGlnaXRzLgorCXJlcGx5CQlPSwkJZm9yIHN1Y2Nlc3MKKwkJCUVOTgkJZm9yIGFuIGVycm9yCisKKyAgICAgICAgd3JpdGUgcmVnCVBuLi4uPXIuLi4JV3JpdGUgcmVnaXN0ZXIgbi4uLiB3aXRoIHZhbHVlIHIuLi4sCisJCQkJCXdoaWNoIGNvbnRhaW5zIHR3byBoZXggZGlnaXRzIGZvciBlYWNoCisJCQkJCWJ5dGUgaW4gdGhlIHJlZ2lzdGVyICh0YXJnZXQgYnl0ZQorCQkJCQlvcmRlcikuCisJcmVwbHkJCU9LCQlmb3Igc3VjY2VzcworCQkJRU5OCQlmb3IgYW4gZXJyb3IKKwkobm90IHN1cHBvcnRlZCBieSBhbGwgc3R1YnMpLgorCisJcmVhZCBtZW0JbUFBLi5BQSxMTExMCUFBLi5BQSBpcyBhZGRyZXNzLCBMTExMIGlzIGxlbmd0aC4KKwlyZXBseQkJWFguLlhYCQlYWC4uWFggaXMgbWVtIGNvbnRlbnRzCisJCQkJCUNhbiBiZSBmZXdlciBieXRlcyB0aGFuIHJlcXVlc3RlZAorCQkJCQlpZiBhYmxlIHRvIHJlYWQgb25seSBwYXJ0IG9mIHRoZSBkYXRhLgorCQkJb3IgRU5OCQlOTiBpcyBlcnJubworCisJd3JpdGUgbWVtCU1BQS4uQUEsTExMTDpYWC4uWFgKKwkJCQkJQUEuLkFBIGlzIGFkZHJlc3MsCisJCQkJCUxMTEwgaXMgbnVtYmVyIG9mIGJ5dGVzLAorCQkJCQlYWC4uWFggaXMgZGF0YQorCXJlcGx5CQlPSwkJZm9yIHN1Y2Nlc3MKKwkJCUVOTgkJZm9yIGFuIGVycm9yICh0aGlzIGluY2x1ZGVzIHRoZSBjYXNlCisJCQkJCXdoZXJlIG9ubHkgcGFydCBvZiB0aGUgZGF0YSB3YXMKKwkJCQkJd3JpdHRlbikuCisKKwljb250CQljQUEuLkFBCQlBQS4uQUEgaXMgYWRkcmVzcyB0byByZXN1bWUKKwkJCQkJSWYgQUEuLkFBIGlzIG9taXR0ZWQsCisJCQkJCXJlc3VtZSBhdCBzYW1lIGFkZHJlc3MuCisKKwlzdGVwCQlzQUEuLkFBCQlBQS4uQUEgaXMgYWRkcmVzcyB0byByZXN1bWUKKwkJCQkJSWYgQUEuLkFBIGlzIG9taXR0ZWQsCisJCQkJCXJlc3VtZSBhdCBzYW1lIGFkZHJlc3MuCisKKwlsYXN0IHNpZ25hbCAgICAgPyAgICAgICAgICAgICAgIFJlcGx5IHRoZSBjdXJyZW50IHJlYXNvbiBmb3Igc3RvcHBpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgc2FtZSByZXBseSBhcyBpcyBnZW5lcmF0ZWQKKwkJCQkJZm9yIHN0ZXAgb3IgY29udCA6IFNBQSB3aGVyZSBBQSBpcyB0aGUKKwkJCQkJc2lnbmFsIG51bWJlci4KKworCVRoZXJlIGlzIG5vIGltbWVkaWF0ZSByZXBseSB0byBzdGVwIG9yIGNvbnQuCisJVGhlIHJlcGx5IGNvbWVzIHdoZW4gdGhlIG1hY2hpbmUgc3RvcHMuCisJSXQgaXMJCVNBQQkJQUEgaXMgdGhlICJzaWduYWwgbnVtYmVyIgorCisJb3IuLi4JCVRBQW4uLi46ci4uLjtuOnIuLi47bi4uLjpyLi4uOworCQkJCQlBQSA9IHNpZ25hbCBudW1iZXIKKwkJCQkJbi4uLiA9IHJlZ2lzdGVyIG51bWJlcgorCQkJCQlyLi4uID0gcmVnaXN0ZXIgY29udGVudHMKKwlvci4uLgkJV0FBCQlUaGUgcHJvY2VzcyBleGl0ZWQsIGFuZCBBQSBpcworCQkJCQl0aGUgZXhpdCBzdGF0dXMuICBUaGlzIGlzIG9ubHkKKwkJCQkJYXBwbGljYWJsZSBmb3IgY2VydGFpbnMgc29ydHMgb2YKKwkJCQkJdGFyZ2V0cy4KKwlraWxsIHJlcXVlc3QJaworCisJdG9nZ2xlIGRlYnVnCWQJCXRvZ2dsZSBkZWJ1ZyBmbGFnIChzZWUgMzg2ICYgNjhrIHN0dWJzKQorCXJlc2V0CQlyCQlyZXNldCAtLSBzZWUgc3BhcmMgc3R1Yi4KKwlyZXNlcnZlZAk8b3RoZXI+CQlPbiBvdGhlciByZXF1ZXN0cywgdGhlIHN0dWIgc2hvdWxkCisJCQkJCWlnbm9yZSB0aGUgcmVxdWVzdCBhbmQgc2VuZCBhbiBlbXB0eQorCQkJCQlyZXNwb25zZSAoJCM8Y2hlY2tzdW0+KS4gIFRoaXMgd2F5CisJCQkJCXdlIGNhbiBleHRlbmQgdGhlIHByb3RvY29sIGFuZCBHREIKKwkJCQkJY2FuIHRlbGwgd2hldGhlciB0aGUgc3R1YiBpdCBpcworCQkJCQl0YWxraW5nIHRvIHVzZXMgdGhlIG9sZCBvciB0aGUgbmV3LgorCXNlYXJjaAkJdEFBOlBQLE1NCVNlYXJjaCBiYWNrd2FyZHMgc3RhcnRpbmcgYXQgYWRkcmVzcworCQkJCQlBQSBmb3IgYSBtYXRjaCB3aXRoIHBhdHRlcm4gUFAgYW5kCisJCQkJCW1hc2sgTU0uICBQUCBhbmQgTU0gYXJlIDQgYnl0ZXMuCisJCQkJCU5vdCBzdXBwb3J0ZWQgYnkgYWxsIHN0dWJzLgorCisJZ2VuZXJhbCBxdWVyeQlxWFhYWAkJUmVxdWVzdCBpbmZvIGFib3V0IFhYWFguCisJZ2VuZXJhbCBzZXQJUVhYWFg9eXl5eQlTZXQgdmFsdWUgb2YgWFhYWCB0byB5eXl5LgorCXF1ZXJ5IHNlY3Qgb2ZmcwlxT2Zmc2V0cwlHZXQgc2VjdGlvbiBvZmZzZXRzLiAgUmVwbHkgaXMKKwkJCQkJVGV4dD14eHg7RGF0YT15eXk7QnNzPXp6egorCWNvbnNvbGUgb3V0cHV0CU90ZXh0CQlTZW5kIHRleHQgdG8gc3Rkb3V0LiAgT25seSBjb21lcyBmcm9tCisJCQkJCXJlbW90ZSB0YXJnZXQuCisKKwlSZXNwb25zZXMgY2FuIGJlIHJ1bi1sZW5ndGggZW5jb2RlZCB0byBzYXZlIHNwYWNlLiAgQSAnKicgbWVhbnMgdGhhdAorCXRoZSBuZXh0IGNoYXJhY3RlciBpcyBhbiBBU0NJSSBlbmNvZGluZyBnaXZpbmcgYSByZXBlYXQgY291bnQgd2hpY2gKKwlzdGFuZHMgZm9yIHRoYXQgbWFueSByZXBpdGl0aW9ucyBvZiB0aGUgY2hhcmFjdGVyIHByZWNlZGluZyB0aGUgJyonLgorCVRoZSBlbmNvZGluZyBpcyBuKzI5LCB5aWVsZGluZyBhIHByaW50YWJsZSBjaGFyYWN0ZXIgd2hlcmUgbiA+PTMgCisJKHdoaWNoIGlzIHdoZXJlIHJsZSBzdGFydHMgdG8gd2luKS4gIERvbid0IHVzZSBhbiBuID4gMTI2LiAKKworCVNvIAorCSIwKiAiIG1lYW5zIHRoZSBzYW1lIGFzICIwMDAwIi4gICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworCisKKyNkZWZpbmUgQ09ORF9CUl9NQVNLCTB4ZmYwMAorI2RlZmluZSBVQ09ORF9EQlJfTUFTSwkweGUwMDAKKyNkZWZpbmUgVUNPTkRfUkJSX01BU0sJMHhmMGRmCisjZGVmaW5lIFRSQVBBX01BU0sJCTB4ZmYwMAorCisjZGVmaW5lIENPTkRfRElTUAkJMHgwMGZmCisjZGVmaW5lIFVDT05EX0RJU1AJCTB4MGZmZgorI2RlZmluZSBVQ09ORF9SRUcJCTB4MGYwMAorCisjZGVmaW5lIEJGX0lOU1RSCQkweDhiMDAKKyNkZWZpbmUgQlRfSU5TVFIJCTB4ODkwMAorI2RlZmluZSBCUkFfSU5TVFIJCTB4YTAwMAorI2RlZmluZSBCU1JfSU5TVFIJCTB4YjAwMAorI2RlZmluZSBKTVBfSU5TVFIJCTB4NDAyYgorI2RlZmluZSBKU1JfSU5TVFIJCTB4NDAwYgorI2RlZmluZSBSVFNfSU5TVFIJCTB4MDAwYgorI2RlZmluZSBSVEVfSU5TVFIJCTB4MDAyYgorI2RlZmluZSBUUkFQQV9JTlNUUgkJMHhjMzAwCisKKyNkZWZpbmUgU1NURVBfSU5TVFIJCTB4YzNmZgorCisjZGVmaW5lIFRfQklUX01BU0sJCTB4MDAwMQorLyoKKyAqIEJVRk1BWCBkZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGluYm91bmQvb3V0Ym91bmQKKyAqIGJ1ZmZlcnMgYXQgbGVhc3QgTlVNUkVHQllURVMqMiBhcmUgbmVlZGVkIGZvciByZWdpc3RlciBwYWNrZXRzCisgKi8KKyNkZWZpbmUgQlVGTUFYIDEwMjQKKworLyoKKyAqIE51bWJlciBvZiBieXRlcyBmb3IgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgTlVNUkVHQllURVMgMTEyCQkvKiA5MiAqLworCisvKgorICogdHlwZWRlZgorICovCit0eXBlZGVmIHZvaWQgKCpGdW5jdGlvbikgKCk7CisKKy8qCisgKiBGb3J3YXJkIGRlY2xhcmF0aW9ucworICovCisKK3N0YXRpYyBpbnQgaGV4IChjaGFyKTsKK3N0YXRpYyBjaGFyICptZW0yaGV4IChjaGFyICosIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBjaGFyICpoZXgybWVtIChjaGFyICosIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgaGV4VG9JbnQgKGNoYXIgKiosIGludCAqKTsKK3N0YXRpYyB2b2lkIGdldHBhY2tldCAoY2hhciAqKTsKK3N0YXRpYyB2b2lkIHB1dHBhY2tldCAoY2hhciAqKTsKK3N0YXRpYyB2b2lkIGhhbmRsZV9idXNlcnJvciAodm9pZCk7CitzdGF0aWMgaW50IGNvbXB1dGVTaWduYWwgKGludCBleGNlcHRpb25WZWN0b3IpOworc3RhdGljIHZvaWQgaGFuZGxlX2V4Y2VwdGlvbiAoaW50IGV4Y2VwdGlvblZlY3Rvcik7Cit2b2lkIGluaXRfc2VyaWFsKCk7CisKK3ZvaWQgcHV0RGVidWdDaGFyIChjaGFyKTsKK2NoYXIgZ2V0RGVidWdDaGFyICh2b2lkKTsKKworLyogVGhlc2UgYXJlIGluIHRoZSBmaWxlIGJ1dCBpbiBhc20gc3RhdGVtZW50cyBzbyB0aGUgY29tcGlsZXIgY2FuJ3Qgc2VlIHRoZW0gKi8KK3ZvaWQgY2F0Y2hfZXhjZXB0aW9uXzQgKHZvaWQpOwordm9pZCBjYXRjaF9leGNlcHRpb25fNiAodm9pZCk7Cit2b2lkIGNhdGNoX2V4Y2VwdGlvbl85ICh2b2lkKTsKK3ZvaWQgY2F0Y2hfZXhjZXB0aW9uXzEwICh2b2lkKTsKK3ZvaWQgY2F0Y2hfZXhjZXB0aW9uXzExICh2b2lkKTsKK3ZvaWQgY2F0Y2hfZXhjZXB0aW9uXzMyICh2b2lkKTsKK3ZvaWQgY2F0Y2hfZXhjZXB0aW9uXzMzICh2b2lkKTsKK3ZvaWQgY2F0Y2hfZXhjZXB0aW9uXzI1NSAodm9pZCk7CisKKworCisjZGVmaW5lIGNhdGNoX2V4Y2VwdGlvbl9yYW5kb20gY2F0Y2hfZXhjZXB0aW9uXzI1NSAvKiBUcmVhdCBhbGwgb2RkIG9uZXMgbGlrZSAyNTUgKi8KKwordm9pZCBicmVha3BvaW50ICh2b2lkKTsKKworCisjZGVmaW5lIGluaXRfc3RhY2tfc2l6ZSA4KjEwMjQgIC8qIGlmIHlvdSBjaGFuZ2UgdGhpcyB5b3Ugc2hvdWxkIGFsc28gbW9kaWZ5IEJJTklUICovCisjZGVmaW5lIHN0dWJfc3RhY2tfc2l6ZSA4KjEwMjQKKworaW50IGluaXRfc3RhY2tbaW5pdF9zdGFja19zaXplXSBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbiAoInN0YWNrIikpKSA9IHswfTsKK2ludCBzdHViX3N0YWNrW3N0dWJfc3RhY2tfc2l6ZV0gX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24gKCJzdGFjayIpKSkgPSB7MH07CisKK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICB2b2lkICgqZnVuY19jb2xkKSAoKTsKKyAgICBpbnQgKnN0YWNrX2NvbGQ7CisgICAgdm9pZCAoKmZ1bmNfd2FybSkgKCk7CisgICAgaW50ICpzdGFja193YXJtOworICAgIHZvaWQgKCooaGFuZGxlclsyNTYgLSA0XSkpICgpOworICB9Cit2ZWNfdHlwZTsKKworCit2b2lkIElOSVQgKCk7Cit2b2lkIEJJTklUICgpOworCisvKiBXaGVuIHlvdSBsaW5rIHRha2UgY2FyZSB0aGF0IHRoaXMgaXMgYXQgYWRkcmVzcyAwIC0KKyAgIG9yIHdoZXJldmVyIHlvdXIgdmJyIHBvaW50cyAqLworCisjZGVmaW5lIENQVV9CVVNfRVJST1JfVkVDICA5CisjZGVmaW5lIERNQV9CVVNfRVJST1JfVkVDIDEwCisjZGVmaW5lIE5NSV9WRUMgICAgICAgICAgIDExCisjZGVmaW5lIElOVkFMSURfSU5TTl9WRUMgICA0CisjZGVmaW5lIElOVkFMSURfU0xPVF9WRUMgICA2CisjZGVmaW5lIFRSQVBfVkVDICAgICAgICAgIDMyCisjZGVmaW5lIElPX1ZFQyAgICAgICAgICAgIDMzCisjZGVmaW5lIFVTRVJfVkVDICAgICAgICAgMjU1CisKKworI2RlZmluZSBCQ1IgICgqKHZvbGF0aWxlIHNob3J0ICopKDB4MDVGRkZGQTApKSAvKiBCdXMgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBCQVMgICgweDgwMCkJCQkJLyogQnl0ZSBhY2Nlc3Mgc2VsZWN0ICovCisjZGVmaW5lIFdDUjEgKCoodm9sYXRpbGUgc2hvcnQgKikoMHgwNWZmZmZBMikpIC8qIFdhaXQgc3RhdGUgY29udHJvbCByZWdpc3RlciAqLworCitjb25zdCB2ZWNfdHlwZSB2ZWN0YWJsZSA9Cit7IAorICAmQklOSVQsCQkJLyogMDogUG93ZXItb24gcmVzZXQgUEMgKi8KKyAgaW5pdF9zdGFjayArIGluaXRfc3RhY2tfc2l6ZSwgLyogMTogUG93ZXItb24gcmVzZXQgU1AgKi8KKyAgJkJJTklULAkJCS8qIDI6IE1hbnVhbCByZXNldCBQQyAqLworICBpbml0X3N0YWNrICsgaW5pdF9zdGFja19zaXplLCAvKiAzOiBNYW51YWwgcmVzZXQgU1AgKi8KK3sKKyAgJmNhdGNoX2V4Y2VwdGlvbl80LAkJLyogNDogR2VuZXJhbCBpbnZhbGlkIGluc3RydWN0aW9uICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiA1OiBSZXNlcnZlZCBmb3Igc3lzdGVtICovCisgICZjYXRjaF9leGNlcHRpb25fNiwJCS8qIDY6IEludmFsaWQgc2xvdCBpbnN0cnVjdGlvbiAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogNzogUmVzZXJ2ZWQgZm9yIHN5c3RlbSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogODogUmVzZXJ2ZWQgZm9yIHN5c3RlbSAqLworICAmY2F0Y2hfZXhjZXB0aW9uXzksCQkvKiA5OiBDUFUgYnVzIGVycm9yICovCisgICZjYXRjaF9leGNlcHRpb25fMTAsCQkvKiAxMDogRE1BIGJ1cyBlcnJvciAqLworICAmY2F0Y2hfZXhjZXB0aW9uXzExLAkJLyogMTE6IE5NSSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogMTI6IFVzZXIgYnJlYWsgKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDEzOiBSZXNlcnZlZCBmb3Igc3lzdGVtICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiAxNDogUmVzZXJ2ZWQgZm9yIHN5c3RlbSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogMTU6IFJlc2VydmVkIGZvciBzeXN0ZW0gKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDE2OiBSZXNlcnZlZCBmb3Igc3lzdGVtICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiAxNzogUmVzZXJ2ZWQgZm9yIHN5c3RlbSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogMTg6IFJlc2VydmVkIGZvciBzeXN0ZW0gKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDE5OiBSZXNlcnZlZCBmb3Igc3lzdGVtICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiAyMDogUmVzZXJ2ZWQgZm9yIHN5c3RlbSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogMjE6IFJlc2VydmVkIGZvciBzeXN0ZW0gKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDIyOiBSZXNlcnZlZCBmb3Igc3lzdGVtICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiAyMzogUmVzZXJ2ZWQgZm9yIHN5c3RlbSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogMjQ6IFJlc2VydmVkIGZvciBzeXN0ZW0gKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDI1OiBSZXNlcnZlZCBmb3Igc3lzdGVtICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiAyNjogUmVzZXJ2ZWQgZm9yIHN5c3RlbSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogMjc6IFJlc2VydmVkIGZvciBzeXN0ZW0gKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDI4OiBSZXNlcnZlZCBmb3Igc3lzdGVtICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiAyOTogUmVzZXJ2ZWQgZm9yIHN5c3RlbSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogMzA6IFJlc2VydmVkIGZvciBzeXN0ZW0gKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDMxOiBSZXNlcnZlZCBmb3Igc3lzdGVtICovCisgICZjYXRjaF9leGNlcHRpb25fMzIsCQkvKiAzMjogVHJhcCBpbnN0ciAodXNlciB2ZWN0b3JzKSAqLworICAmY2F0Y2hfZXhjZXB0aW9uXzMzLAkJLyogMzM6IFRyYXAgaW5zdHIgKHVzZXIgdmVjdG9ycykgKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDM0OiBUcmFwIGluc3RyICh1c2VyIHZlY3RvcnMpICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiAzNTogVHJhcCBpbnN0ciAodXNlciB2ZWN0b3JzKSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogMzY6IFRyYXAgaW5zdHIgKHVzZXIgdmVjdG9ycykgKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDM3OiBUcmFwIGluc3RyICh1c2VyIHZlY3RvcnMpICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiAzODogVHJhcCBpbnN0ciAodXNlciB2ZWN0b3JzKSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogMzk6IFRyYXAgaW5zdHIgKHVzZXIgdmVjdG9ycykgKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDQwOiBUcmFwIGluc3RyICh1c2VyIHZlY3RvcnMpICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiA0MTogVHJhcCBpbnN0ciAodXNlciB2ZWN0b3JzKSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogNDI6IFRyYXAgaW5zdHIgKHVzZXIgdmVjdG9ycykgKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDQzOiBUcmFwIGluc3RyICh1c2VyIHZlY3RvcnMpICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiA0NDogVHJhcCBpbnN0ciAodXNlciB2ZWN0b3JzKSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogNDU6IFRyYXAgaW5zdHIgKHVzZXIgdmVjdG9ycykgKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDQ2OiBUcmFwIGluc3RyICh1c2VyIHZlY3RvcnMpICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiA0NzogVHJhcCBpbnN0ciAodXNlciB2ZWN0b3JzKSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogNDg6IFRyYXAgaW5zdHIgKHVzZXIgdmVjdG9ycykgKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDQ5OiBUcmFwIGluc3RyICh1c2VyIHZlY3RvcnMpICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiA1MDogVHJhcCBpbnN0ciAodXNlciB2ZWN0b3JzKSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogNTE6IFRyYXAgaW5zdHIgKHVzZXIgdmVjdG9ycykgKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDUyOiBUcmFwIGluc3RyICh1c2VyIHZlY3RvcnMpICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiA1MzogVHJhcCBpbnN0ciAodXNlciB2ZWN0b3JzKSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogNTQ6IFRyYXAgaW5zdHIgKHVzZXIgdmVjdG9ycykgKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDU1OiBUcmFwIGluc3RyICh1c2VyIHZlY3RvcnMpICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiA1NjogVHJhcCBpbnN0ciAodXNlciB2ZWN0b3JzKSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogNTc6IFRyYXAgaW5zdHIgKHVzZXIgdmVjdG9ycykgKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDU4OiBUcmFwIGluc3RyICh1c2VyIHZlY3RvcnMpICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiA1OTogVHJhcCBpbnN0ciAodXNlciB2ZWN0b3JzKSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogNjA6IFRyYXAgaW5zdHIgKHVzZXIgdmVjdG9ycykgKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDYxOiBUcmFwIGluc3RyICh1c2VyIHZlY3RvcnMpICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiA2MjogVHJhcCBpbnN0ciAodXNlciB2ZWN0b3JzKSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogNjM6IFRyYXAgaW5zdHIgKHVzZXIgdmVjdG9ycykgKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDY0OiBJUlEwICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiA2NTogSVJRMSAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogNjY6IElSUTIgKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDY3OiBJUlEzICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiA2ODogSVJRNCAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwJLyogNjk6IElSUTUgKi8KKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCS8qIDcwOiBJUlE2ICovCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAkvKiA3MTogSVJRNyAqLworICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uX3JhbmRvbSwKKyAgICAgJmNhdGNoX2V4Y2VwdGlvbl9yYW5kb20sCisgICAgICZjYXRjaF9leGNlcHRpb25fcmFuZG9tLAorICAgICAmY2F0Y2hfZXhjZXB0aW9uXzI1NX19OworCisKK2NoYXIgaW5fbm1pOyAgIC8qIFNldCB3aGVuIGhhbmRsaW5nIGFuIE5NSSwgc28gd2UgZG9uJ3QgcmVlbnRlciAqLworaW50IGRvZmF1bHQ7ICAvKiBOb24gemVybywgYnVzIGVycm9ycyB3aWxsIHJhaXNlIGV4Y2VwdGlvbiAqLworCitpbnQgKnN0dWJfc3A7CisKKy8qIGRlYnVnID4gMCBwcmludHMgaWxsLWZvcm1lZCBjb21tYW5kcyBpbiB2YWxpZCBwYWNrZXRzICYgY2hlY2tzdW0gZXJyb3JzICovCitpbnQgcmVtb3RlX2RlYnVnOworCisvKiBqdW1wIGJ1ZmZlciB1c2VkIGZvciBzZXRqbXAvbG9uZ2ptcCAqLworam1wX2J1ZiByZW1jb21FbnY7CisKK2VudW0gcmVnbmFtZXMKKyAgeworICAgIFIwLCBSMSwgUjIsIFIzLCBSNCwgUjUsIFI2LCBSNywKKyAgICBSOCwgUjksIFIxMCwgUjExLCBSMTIsIFIxMywgUjE0LAorICAgIFIxNSwgUEMsIFBSLCBHQlIsIFZCUiwgTUFDSCwgTUFDTCwgU1IsCisgICAgVElDS1MsIFNUQUxMUywgQ1lDTEVTLCBJTlNUUywgUExSCisgIH07CisKK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBzaG9ydCAqbWVtQWRkcjsKKyAgICBzaG9ydCBvbGRJbnN0cjsKKyAgfQorc3RlcERhdGE7CisKK2ludCByZWdpc3RlcnNbTlVNUkVHQllURVMgLyA0XTsKK3N0ZXBEYXRhIGluc3RyQnVmZmVyOworY2hhciBzdGVwcGVkOworc3RhdGljIGNvbnN0IGNoYXIgaGV4Y2hhcnNbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKK2NoYXIgcmVtY29tSW5CdWZmZXJbQlVGTUFYXTsKK2NoYXIgcmVtY29tT3V0QnVmZmVyW0JVRk1BWF07CisKK2NoYXIgaGlnaGhleChpbnQgIHgpCit7CisgIHJldHVybiBoZXhjaGFyc1soeCA+PiA0KSAmIDB4Zl07Cit9CisKK2NoYXIgbG93aGV4KGludCAgeCkKK3sKKyAgcmV0dXJuIGhleGNoYXJzW3ggJiAweGZdOworfQorCisvKgorICogQXNzZW1ibHkgbWFjcm9zCisgKi8KKworI2RlZmluZSBCUkVBS1BPSU5UKCkgICBhc20oInRyYXBhCSMweDIwIjo6KTsKKworCisvKgorICogUm91dGluZXMgdG8gaGFuZGxlIGhleCBkYXRhCisgKi8KKworc3RhdGljIGludAoraGV4IChjaGFyIGNoKQoreworICBpZiAoKGNoID49ICdhJykgJiYgKGNoIDw9ICdmJykpCisgICAgcmV0dXJuIChjaCAtICdhJyArIDEwKTsKKyAgaWYgKChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpKQorICAgIHJldHVybiAoY2ggLSAnMCcpOworICBpZiAoKGNoID49ICdBJykgJiYgKGNoIDw9ICdGJykpCisgICAgcmV0dXJuIChjaCAtICdBJyArIDEwKTsKKyAgcmV0dXJuICgtMSk7Cit9CisKKy8qIGNvbnZlcnQgdGhlIG1lbW9yeSwgcG9pbnRlZCB0byBieSBtZW0gaW50byBoZXgsIHBsYWNpbmcgcmVzdWx0IGluIGJ1ZiAqLworLyogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbGFzdCBjaGFyIHB1dCBpbiBidWYgKG51bGwpICovCitzdGF0aWMgY2hhciAqCittZW0yaGV4IChjaGFyICptZW0sIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworICBpbnQgaTsKKyAgaW50IGNoOworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICBjaCA9ICptZW0rKzsKKyAgICAgICpidWYrKyA9IGhpZ2hoZXggKGNoKTsKKyAgICAgICpidWYrKyA9IGxvd2hleCAoY2gpOworICAgIH0KKyAgKmJ1ZiA9IDA7CisgIHJldHVybiAoYnVmKTsKK30KKworLyogY29udmVydCB0aGUgaGV4IGFycmF5IHBvaW50ZWQgdG8gYnkgYnVmIGludG8gYmluYXJ5LCB0byBiZSBwbGFjZWQgaW4gbWVtICovCisvKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGxhc3QgYnl0ZSB3cml0dGVuICovCisKK3N0YXRpYyBjaGFyICoKK2hleDJtZW0gKGNoYXIgKmJ1ZiwgY2hhciAqbWVtLCBpbnQgY291bnQpCit7CisgIGludCBpOworICB1bnNpZ25lZCBjaGFyIGNoOworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICBjaCA9IGhleCAoKmJ1ZisrKSA8PCA0OworICAgICAgY2ggPSBjaCArIGhleCAoKmJ1ZisrKTsKKyAgICAgICptZW0rKyA9IGNoOworICAgIH0KKyAgcmV0dXJuIChtZW0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFdISUxFIFdFIEZJTkQgTklDRSBIRVggQ0hBUlMsIEJVSUxEIEFOIElOVCAqLworLyogUkVUVVJOIE5VTUJFUiBPRiBDSEFSUyBQUk9DRVNTRUQgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2hleFRvSW50IChjaGFyICoqcHRyLCBpbnQgKmludFZhbHVlKQoreworICBpbnQgbnVtQ2hhcnMgPSAwOworICBpbnQgaGV4VmFsdWU7CisKKyAgKmludFZhbHVlID0gMDsKKworICB3aGlsZSAoKipwdHIpCisgICAgeworICAgICAgaGV4VmFsdWUgPSBoZXggKCoqcHRyKTsKKyAgICAgIGlmIChoZXhWYWx1ZSA+PSAwKQorCXsKKwkgICppbnRWYWx1ZSA9ICgqaW50VmFsdWUgPDwgNCkgfCBoZXhWYWx1ZTsKKwkgIG51bUNoYXJzKys7CisJfQorICAgICAgZWxzZQorCWJyZWFrOworCisgICAgICAoKnB0cikrKzsKKyAgICB9CisKKyAgcmV0dXJuIChudW1DaGFycyk7Cit9CisKKy8qCisgKiBSb3V0aW5lcyB0byBnZXQgYW5kIHB1dCBwYWNrZXRzCisgKi8KKworLyogc2NhbiBmb3IgdGhlIHNlcXVlbmNlICQ8ZGF0YT4jPGNoZWNrc3VtPiAgICAgKi8KKworc3RhdGljCit2b2lkCitnZXRwYWNrZXQgKGNoYXIgKmJ1ZmZlcikKK3sKKyAgdW5zaWduZWQgY2hhciBjaGVja3N1bTsKKyAgdW5zaWduZWQgY2hhciB4bWl0Y3N1bTsKKyAgaW50IGk7CisgIGludCBjb3VudDsKKyAgY2hhciBjaDsKKyAgZG8KKyAgICB7CisgICAgICAvKiB3YWl0IGFyb3VuZCBmb3IgdGhlIHN0YXJ0IGNoYXJhY3RlciwgaWdub3JlIGFsbCBvdGhlciBjaGFyYWN0ZXJzICovCisgICAgICB3aGlsZSAoKGNoID0gZ2V0RGVidWdDaGFyICgpKSAhPSAnJCcpOworICAgICAgY2hlY2tzdW0gPSAwOworICAgICAgeG1pdGNzdW0gPSAtMTsKKworICAgICAgY291bnQgPSAwOworCisgICAgICAvKiBub3csIHJlYWQgdW50aWwgYSAjIG9yIGVuZCBvZiBidWZmZXIgaXMgZm91bmQgKi8KKyAgICAgIHdoaWxlIChjb3VudCA8IEJVRk1BWCkKKwl7CisJICBjaCA9IGdldERlYnVnQ2hhciAoKTsKKwkgIGlmIChjaCA9PSAnIycpCisJICAgIGJyZWFrOworCSAgY2hlY2tzdW0gPSBjaGVja3N1bSArIGNoOworCSAgYnVmZmVyW2NvdW50XSA9IGNoOworCSAgY291bnQgPSBjb3VudCArIDE7CisJfQorICAgICAgYnVmZmVyW2NvdW50XSA9IDA7CisKKyAgICAgIGlmIChjaCA9PSAnIycpCisJeworCSAgeG1pdGNzdW0gPSBoZXggKGdldERlYnVnQ2hhciAoKSkgPDwgNDsKKwkgIHhtaXRjc3VtICs9IGhleCAoZ2V0RGVidWdDaGFyICgpKTsKKwkgIGlmIChjaGVja3N1bSAhPSB4bWl0Y3N1bSkKKwkgICAgcHV0RGVidWdDaGFyICgnLScpOwkvKiBmYWlsZWQgY2hlY2tzdW0gKi8KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHB1dERlYnVnQ2hhciAoJysnKTsJLyogc3VjY2Vzc2Z1bCB0cmFuc2ZlciAqLworCSAgICAgIC8qIGlmIGEgc2VxdWVuY2UgY2hhciBpcyBwcmVzZW50LCByZXBseSB0aGUgc2VxdWVuY2UgSUQgKi8KKwkgICAgICBpZiAoYnVmZmVyWzJdID09ICc6JykKKwkJeworCQkgIHB1dERlYnVnQ2hhciAoYnVmZmVyWzBdKTsKKwkJICBwdXREZWJ1Z0NoYXIgKGJ1ZmZlclsxXSk7CisJCSAgLyogcmVtb3ZlIHNlcXVlbmNlIGNoYXJzIGZyb20gYnVmZmVyICovCisJCSAgY291bnQgPSBzdHJsZW4gKGJ1ZmZlcik7CisJCSAgZm9yIChpID0gMzsgaSA8PSBjb3VudDsgaSsrKQorCQkgICAgYnVmZmVyW2kgLSAzXSA9IGJ1ZmZlcltpXTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgd2hpbGUgKGNoZWNrc3VtICE9IHhtaXRjc3VtKTsKKworfQorCisKKy8qIHNlbmQgdGhlIHBhY2tldCBpbiBidWZmZXIuICBUaGUgaG9zdCBnZXQncyBvbmUgY2hhbmNlIHRvIHJlYWQgaXQuCisgICBUaGlzIHJvdXRpbmUgZG9lcyBub3Qgd2FpdCBmb3IgYSBwb3NpdGl2ZSBhY2tub3dsZWRnZS4gICovCisKK3N0YXRpYyB2b2lkCitwdXRwYWNrZXQgKHJlZ2lzdGVyIGNoYXIgKmJ1ZmZlcikKK3sKKyAgcmVnaXN0ZXIgIGludCBjaGVja3N1bTsKKyAgcmVnaXN0ZXIgIGludCBjb3VudDsKKworICAvKiAgJDxwYWNrZXQgaW5mbz4jPGNoZWNrc3VtPi4gKi8KKyAgZG8KKyAgICB7CisgICAgICBjaGFyICpzcmMgPSBidWZmZXI7CisgICAgICBwdXREZWJ1Z0NoYXIgKCckJyk7CisgICAgICBjaGVja3N1bSA9IDA7CisKKyAgICAgIHdoaWxlICgqc3JjKQorCXsKKwkgIGludCBydW5sZW47CisKKwkgIC8qIERvIHJ1biBsZW5ndGggZW5jb2RpbmcgKi8KKwkgIGZvciAocnVubGVuID0gMDsgcnVubGVuIDwgMTAwOyBydW5sZW4gKyspIAorCSAgICB7CisJICAgICAgaWYgKHNyY1swXSAhPSBzcmNbcnVubGVuXSkgCisJCXsKKwkJICBpZiAocnVubGVuID4gMykgCisJCSAgICB7CisJCSAgICAgIGludCBlbmNvZGU7CisJCSAgICAgIC8qIEdvdCBhIHVzZWZ1bCBhbW91bnQgKi8KKwkJICAgICAgcHV0RGVidWdDaGFyICgqc3JjKTsKKwkJICAgICAgY2hlY2tzdW0gKz0gKnNyYzsKKwkJICAgICAgcHV0RGVidWdDaGFyICgnKicpOworCQkgICAgICBjaGVja3N1bSArPSAnKic7CisJCSAgICAgIGNoZWNrc3VtICs9IChlbmNvZGUgPSBydW5sZW4gKyAnICcgLSA0KTsKKwkJICAgICAgcHV0RGVidWdDaGFyIChlbmNvZGUpOworCQkgICAgICBzcmMgKz0gcnVubGVuOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgcHV0RGVidWdDaGFyICgqc3JjKTsKKwkJICAgICAgY2hlY2tzdW0gKz0gKnNyYzsKKwkJICAgICAgc3JjKys7CisJCSAgICB9CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKworCisgICAgICBwdXREZWJ1Z0NoYXIgKCcjJyk7CisgICAgICBwdXREZWJ1Z0NoYXIgKGhpZ2hoZXgoY2hlY2tzdW0pKTsKKyAgICAgIHB1dERlYnVnQ2hhciAobG93aGV4KGNoZWNrc3VtKSk7CisgICAgfQorICB3aGlsZSAgKGdldERlYnVnQ2hhcigpICE9ICcrJyk7CisKK30KKworCisvKiBhIGJ1cyBlcnJvciBoYXMgb2NjdXJyZWQsIHBlcmZvcm0gYSBsb25nam1wCisgICB0byByZXR1cm4gZXhlY3V0aW9uIGFuZCBhbGxvdyBoYW5kbGluZyBvZiB0aGUgZXJyb3IgKi8KKwordm9pZAoraGFuZGxlX2J1c2Vycm9yICh2b2lkKQoreworICBsb25nam1wIChyZW1jb21FbnYsIDEpOworfQorCisvKgorICogdGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgU0gtMSBleGNlcHRpb24gbnVtYmVyIGFuZCBhdHRlbXB0cyB0bworICogdHJhbnNsYXRlIHRoaXMgbnVtYmVyIGludG8gYSB1bml4IGNvbXBhdGlibGUgc2lnbmFsIHZhbHVlCisgKi8KK3N0YXRpYyBpbnQKK2NvbXB1dGVTaWduYWwgKGludCBleGNlcHRpb25WZWN0b3IpCit7CisgIGludCBzaWd2YWw7CisgIHN3aXRjaCAoZXhjZXB0aW9uVmVjdG9yKQorICAgIHsKKyAgICBjYXNlIElOVkFMSURfSU5TTl9WRUM6CisgICAgICBzaWd2YWwgPSA0OworICAgICAgYnJlYWs7CQkJCisgICAgY2FzZSBJTlZBTElEX1NMT1RfVkVDOgorICAgICAgc2lndmFsID0gNDsKKyAgICAgIGJyZWFrOwkJCQorICAgIGNhc2UgQ1BVX0JVU19FUlJPUl9WRUM6CisgICAgICBzaWd2YWwgPSAxMDsKKyAgICAgIGJyZWFrOwkJCQorICAgIGNhc2UgRE1BX0JVU19FUlJPUl9WRUM6CisgICAgICBzaWd2YWwgPSAxMDsKKyAgICAgIGJyZWFrOwkKKyAgICBjYXNlIE5NSV9WRUM6CisgICAgICBzaWd2YWwgPSAyOworICAgICAgYnJlYWs7CQorCisgICAgY2FzZSBUUkFQX1ZFQzoKKyAgICBjYXNlIFVTRVJfVkVDOgorICAgICAgc2lndmFsID0gNTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHNpZ3ZhbCA9IDc7CQkvKiAic29mdHdhcmUgZ2VuZXJhdGVkIiovCisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAoc2lndmFsKTsKK30KKwordm9pZAorZG9TU3RlcCAodm9pZCkKK3sKKyAgc2hvcnQgKmluc3RyTWVtOworICBpbnQgZGlzcGxhY2VtZW50OworICBpbnQgcmVnOworICB1bnNpZ25lZCBzaG9ydCBvcGNvZGU7CisKKyAgaW5zdHJNZW0gPSAoc2hvcnQgKikgcmVnaXN0ZXJzW1BDXTsKKworICBvcGNvZGUgPSAqaW5zdHJNZW07CisgIHN0ZXBwZWQgPSAxOworCisgIGlmICgob3Bjb2RlICYgQ09ORF9CUl9NQVNLKSA9PSBCVF9JTlNUUikKKyAgICB7CisgICAgICBpZiAocmVnaXN0ZXJzW1NSXSAmIFRfQklUX01BU0spCisJeworCSAgZGlzcGxhY2VtZW50ID0gKG9wY29kZSAmIENPTkRfRElTUCkgPDwgMTsKKwkgIGlmIChkaXNwbGFjZW1lbnQgJiAweDgwKQorCSAgICBkaXNwbGFjZW1lbnQgfD0gMHhmZmZmZmYwMDsKKwkgIC8qCisJCSAgICogUmVtZW1iZXIgUEMgcG9pbnRzIHRvIHNlY29uZCBpbnN0ci4KKwkJICAgKiBhZnRlciBQQyBvZiBicmFuY2ggLi4uIHNvIGFkZCA0CisJCSAgICovCisJICBpbnN0ck1lbSA9IChzaG9ydCAqKSAocmVnaXN0ZXJzW1BDXSArIGRpc3BsYWNlbWVudCArIDQpOworCX0KKyAgICAgIGVsc2UKKwlpbnN0ck1lbSArPSAxOworICAgIH0KKyAgZWxzZSBpZiAoKG9wY29kZSAmIENPTkRfQlJfTUFTSykgPT0gQkZfSU5TVFIpCisgICAgeworICAgICAgaWYgKHJlZ2lzdGVyc1tTUl0gJiBUX0JJVF9NQVNLKQorCWluc3RyTWVtICs9IDE7CisgICAgICBlbHNlCisJeworCSAgZGlzcGxhY2VtZW50ID0gKG9wY29kZSAmIENPTkRfRElTUCkgPDwgMTsKKwkgIGlmIChkaXNwbGFjZW1lbnQgJiAweDgwKQorCSAgICBkaXNwbGFjZW1lbnQgfD0gMHhmZmZmZmYwMDsKKwkgIC8qCisJCSAgICogUmVtZW1iZXIgUEMgcG9pbnRzIHRvIHNlY29uZCBpbnN0ci4KKwkJICAgKiBhZnRlciBQQyBvZiBicmFuY2ggLi4uIHNvIGFkZCA0CisJCSAgICovCisJICBpbnN0ck1lbSA9IChzaG9ydCAqKSAocmVnaXN0ZXJzW1BDXSArIGRpc3BsYWNlbWVudCArIDQpOworCX0KKyAgICB9CisgIGVsc2UgaWYgKChvcGNvZGUgJiBVQ09ORF9EQlJfTUFTSykgPT0gQlJBX0lOU1RSKQorICAgIHsKKyAgICAgIGRpc3BsYWNlbWVudCA9IChvcGNvZGUgJiBVQ09ORF9ESVNQKSA8PCAxOworICAgICAgaWYgKGRpc3BsYWNlbWVudCAmIDB4MDgwMCkKKwlkaXNwbGFjZW1lbnQgfD0gMHhmZmZmZjAwMDsKKworICAgICAgLyoKKwkgICAqIFJlbWVtYmVyIFBDIHBvaW50cyB0byBzZWNvbmQgaW5zdHIuCisJICAgKiBhZnRlciBQQyBvZiBicmFuY2ggLi4uIHNvIGFkZCA0CisJICAgKi8KKyAgICAgIGluc3RyTWVtID0gKHNob3J0ICopIChyZWdpc3RlcnNbUENdICsgZGlzcGxhY2VtZW50ICsgNCk7CisgICAgfQorICBlbHNlIGlmICgob3Bjb2RlICYgVUNPTkRfUkJSX01BU0spID09IEpTUl9JTlNUUikKKyAgICB7CisgICAgICByZWcgPSAoY2hhcikgKChvcGNvZGUgJiBVQ09ORF9SRUcpID4+IDgpOworCisgICAgICBpbnN0ck1lbSA9IChzaG9ydCAqKSByZWdpc3RlcnNbcmVnXTsKKyAgICB9CisgIGVsc2UgaWYgKG9wY29kZSA9PSBSVFNfSU5TVFIpCisgICAgaW5zdHJNZW0gPSAoc2hvcnQgKikgcmVnaXN0ZXJzW1BSXTsKKyAgZWxzZSBpZiAob3Bjb2RlID09IFJURV9JTlNUUikKKyAgICBpbnN0ck1lbSA9IChzaG9ydCAqKSByZWdpc3RlcnNbMTVdOworICBlbHNlIGlmICgob3Bjb2RlICYgVFJBUEFfTUFTSykgPT0gVFJBUEFfSU5TVFIpCisgICAgaW5zdHJNZW0gPSAoc2hvcnQgKikgKChvcGNvZGUgJiB+VFJBUEFfTUFTSykgPDwgMik7CisgIGVsc2UKKyAgICBpbnN0ck1lbSArPSAxOworCisgIGluc3RyQnVmZmVyLm1lbUFkZHIgPSBpbnN0ck1lbTsKKyAgaW5zdHJCdWZmZXIub2xkSW5zdHIgPSAqaW5zdHJNZW07CisgICppbnN0ck1lbSA9IFNTVEVQX0lOU1RSOworfQorCisKKy8qIFVuZG8gdGhlIGVmZmVjdCBvZiBhIHByZXZpb3VzIGRvU1N0ZXAuICBJZiB3ZSBzaW5nbGUgc3RlcHBlZCwKKyAgIHJlc3RvcmUgdGhlIG9sZCBpbnN0cnVjdGlvbi4gKi8KKwordm9pZAordW5kb1NTdGVwICh2b2lkKQoreworICBpZiAoc3RlcHBlZCkKKyAgICB7ICBzaG9ydCAqaW5zdHJNZW07CisgICAgICBpbnN0ck1lbSA9IGluc3RyQnVmZmVyLm1lbUFkZHI7CisgICAgICAqaW5zdHJNZW0gPSBpbnN0ckJ1ZmZlci5vbGRJbnN0cjsKKyAgICB9CisgIHN0ZXBwZWQgPSAwOworfQorCisvKgorVGhpcyBmdW5jdGlvbiBkb2VzIGFsbCBleGNlcHRpb24gaGFuZGxpbmcuICBJdCBvbmx5IGRvZXMgdHdvIHRoaW5ncyAtCitpdCBmaWd1cmVzIG91dCB3aHkgaXQgd2FzIGNhbGxlZCBhbmQgdGVsbHMgZ2RiLCBhbmQgdGhlbiBpdCByZWFjdHMKK3RvIGdkYidzIHJlcXVlc3RzLgorCitXaGVuIGluIHRoZSBtb25pdG9yIG1vZGUgd2UgdGFsayBhIGh1bWFuIG9uIHRoZSBzZXJpYWwgbGluZSByYXRoZXIgdGhhbiBnZGIuCisKKyovCisKKwordm9pZAorZ2RiX2hhbmRsZV9leGNlcHRpb24gKGludCBleGNlcHRpb25WZWN0b3IpCit7CisgIGludCBzaWd2YWw7CisgIGludCBhZGRyLCBsZW5ndGg7CisgIGNoYXIgKnB0cjsKKworICAvKiByZXBseSB0byBob3N0IHRoYXQgYW4gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCAqLworICBzaWd2YWwgPSBjb21wdXRlU2lnbmFsIChleGNlcHRpb25WZWN0b3IpOworICByZW1jb21PdXRCdWZmZXJbMF0gPSAnUyc7CisgIHJlbWNvbU91dEJ1ZmZlclsxXSA9IGhpZ2hoZXgoc2lndmFsKTsKKyAgcmVtY29tT3V0QnVmZmVyWzJdID0gbG93aGV4IChzaWd2YWwpOworICByZW1jb21PdXRCdWZmZXJbM10gPSAwOworCisgIHB1dHBhY2tldCAocmVtY29tT3V0QnVmZmVyKTsKKworICAvKgorICAgKiBleGNlcHRpb24gMjU1IGluZGljYXRlcyBhIHNvZnR3YXJlIHRyYXAKKyAgICogaW5zZXJ0ZWQgaW4gcGxhY2Ugb2YgY29kZSAuLi4gc28gYmFjayB1cAorICAgKiBQQyBieSBvbmUgaW5zdHJ1Y3Rpb24sIHNpbmNlIHRoaXMgaW5zdHJ1Y3Rpb24KKyAgICogd2lsbCBsYXRlciBiZSByZXBsYWNlZCBieSBpdHMgb3JpZ2luYWwgb25lIQorICAgKi8KKyAgaWYgKGV4Y2VwdGlvblZlY3RvciA9PSAweGZmCisgICAgICB8fCBleGNlcHRpb25WZWN0b3IgPT0gMHgyMCkKKyAgICByZWdpc3RlcnNbUENdIC09IDI7CisKKyAgLyoKKyAgICogRG8gdGhlIHRoYW5ncyBuZWVkZWQgdG8gdW5kbworICAgKiBhbnkgc3RlcHBpbmcgd2UgbWF5IGhhdmUgZG9uZSEKKyAgICovCisgIHVuZG9TU3RlcCAoKTsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICByZW1jb21PdXRCdWZmZXJbMF0gPSAwOworICAgICAgZ2V0cGFja2V0IChyZW1jb21JbkJ1ZmZlcik7CisKKyAgICAgIHN3aXRjaCAocmVtY29tSW5CdWZmZXJbMF0pCisJeworCWNhc2UgJz8nOgorCSAgcmVtY29tT3V0QnVmZmVyWzBdID0gJ1MnOworCSAgcmVtY29tT3V0QnVmZmVyWzFdID0gaGlnaGhleCAoc2lndmFsKTsKKwkgIHJlbWNvbU91dEJ1ZmZlclsyXSA9IGxvd2hleCAoc2lndmFsKTsKKwkgIHJlbWNvbU91dEJ1ZmZlclszXSA9IDA7CisJICBicmVhazsKKwljYXNlICdkJzoKKwkgIHJlbW90ZV9kZWJ1ZyA9ICEocmVtb3RlX2RlYnVnKTsJLyogdG9nZ2xlIGRlYnVnIGZsYWcgKi8KKwkgIGJyZWFrOworCWNhc2UgJ2cnOgkJLyogcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgQ1BVIHJlZ2lzdGVycyAqLworCSAgbWVtMmhleCAoKGNoYXIgKikgcmVnaXN0ZXJzLCByZW1jb21PdXRCdWZmZXIsIE5VTVJFR0JZVEVTKTsKKwkgIGJyZWFrOworCWNhc2UgJ0cnOgkJLyogc2V0IHRoZSB2YWx1ZSBvZiB0aGUgQ1BVIHJlZ2lzdGVycyAtIHJldHVybiBPSyAqLworCSAgaGV4Mm1lbSAoJnJlbWNvbUluQnVmZmVyWzFdLCAoY2hhciAqKSByZWdpc3RlcnMsIE5VTVJFR0JZVEVTKTsKKwkgIHN0cmNweSAocmVtY29tT3V0QnVmZmVyLCAiT0siKTsKKwkgIGJyZWFrOworCisJICAvKiBtQUEuLkFBLExMTEwgIFJlYWQgTExMTCBieXRlcyBhdCBhZGRyZXNzIEFBLi5BQSAqLworCWNhc2UgJ20nOgorCSAgaWYgKHNldGptcCAocmVtY29tRW52KSA9PSAwKQorCSAgICB7CisJICAgICAgZG9mYXVsdCA9IDA7CisJICAgICAgLyogVFJZLCBUTyBSRUFEICV4LCV4LiAgSUYgU1VDQ0VFRCwgU0VUIFBUUiA9IDAgKi8KKwkgICAgICBwdHIgPSAmcmVtY29tSW5CdWZmZXJbMV07CisJICAgICAgaWYgKGhleFRvSW50ICgmcHRyLCAmYWRkcikpCisJCWlmICgqKHB0cisrKSA9PSAnLCcpCisJCSAgaWYgKGhleFRvSW50ICgmcHRyLCAmbGVuZ3RoKSkKKwkJICAgIHsKKwkJICAgICAgcHRyID0gMDsKKwkJICAgICAgbWVtMmhleCAoKGNoYXIgKikgYWRkciwgcmVtY29tT3V0QnVmZmVyLCBsZW5ndGgpOworCQkgICAgfQorCSAgICAgIGlmIChwdHIpCisJCXN0cmNweSAocmVtY29tT3V0QnVmZmVyLCAiRTAxIik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgc3RyY3B5IChyZW1jb21PdXRCdWZmZXIsICJFMDMiKTsKKworCSAgLyogcmVzdG9yZSBoYW5kbGVyIGZvciBidXMgZXJyb3IgKi8KKwkgIGRvZmF1bHQgPSAxOworCSAgYnJlYWs7CisKKwkgIC8qIE1BQS4uQUEsTExMTDogV3JpdGUgTExMTCBieXRlcyBhdCBhZGRyZXNzIEFBLkFBIHJldHVybiBPSyAqLworCWNhc2UgJ00nOgorCSAgaWYgKHNldGptcCAocmVtY29tRW52KSA9PSAwKQorCSAgICB7CisJICAgICAgZG9mYXVsdCA9IDA7CisKKwkgICAgICAvKiBUUlksIFRPIFJFQUQgJyV4LCV4OicuICBJRiBTVUNDRUVELCBTRVQgUFRSID0gMCAqLworCSAgICAgIHB0ciA9ICZyZW1jb21JbkJ1ZmZlclsxXTsKKwkgICAgICBpZiAoaGV4VG9JbnQgKCZwdHIsICZhZGRyKSkKKwkJaWYgKCoocHRyKyspID09ICcsJykKKwkJICBpZiAoaGV4VG9JbnQgKCZwdHIsICZsZW5ndGgpKQorCQkgICAgaWYgKCoocHRyKyspID09ICc6JykKKwkJICAgICAgeworCQkJaGV4Mm1lbSAocHRyLCAoY2hhciAqKSBhZGRyLCBsZW5ndGgpOworCQkJcHRyID0gMDsKKwkJCXN0cmNweSAocmVtY29tT3V0QnVmZmVyLCAiT0siKTsKKwkJICAgICAgfQorCSAgICAgIGlmIChwdHIpCisJCXN0cmNweSAocmVtY29tT3V0QnVmZmVyLCAiRTAyIik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgc3RyY3B5IChyZW1jb21PdXRCdWZmZXIsICJFMDMiKTsKKworCSAgLyogcmVzdG9yZSBoYW5kbGVyIGZvciBidXMgZXJyb3IgKi8KKwkgIGRvZmF1bHQgPSAxOworCSAgYnJlYWs7CisKKwkgIC8qIGNBQS4uQUEgICAgQ29udGludWUgYXQgYWRkcmVzcyBBQS4uQUEob3B0aW9uYWwpICovCisJICAvKiBzQUEuLkFBICAgU3RlcCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBBQS4uQUEob3B0aW9uYWwpICovCisJY2FzZSAnYyc6CisJY2FzZSAncyc6CisJICB7CisJICAgIC8qIHRSWSwgdG8gcmVhZCBvcHRpb25hbCBwYXJhbWV0ZXIsIHBjIHVuY2hhbmdlZCBpZiBubyBwYXJtICovCisJICAgIHB0ciA9ICZyZW1jb21JbkJ1ZmZlclsxXTsKKwkgICAgaWYgKGhleFRvSW50ICgmcHRyLCAmYWRkcikpCisJICAgICAgcmVnaXN0ZXJzW1BDXSA9IGFkZHI7CisKKwkgICAgaWYgKHJlbWNvbUluQnVmZmVyWzBdID09ICdzJykKKwkgICAgICBkb1NTdGVwICgpOworCSAgfQorCSAgcmV0dXJuOworCSAgYnJlYWs7CisKKwkgIC8qIGtpbGwgdGhlIHByb2dyYW0gKi8KKwljYXNlICdrJzoJCS8qIGRvIG5vdGhpbmcgKi8KKwkgIGJyZWFrOworCX0JCQkvKiBzd2l0Y2ggKi8KKworICAgICAgLyogcmVwbHkgdG8gdGhlIHJlcXVlc3QgKi8KKyAgICAgIHB1dHBhY2tldCAocmVtY29tT3V0QnVmZmVyKTsKKyAgICB9Cit9CisKKworI2RlZmluZSBHREJDT09LSUUgMHg1YWMgCitzdGF0aWMgaW50IGluZ2RibW9kZTsKKy8qIFdlJ3ZlIGhhZCBhbiBleGNlcHRpb24gLSBjaG9vc2UgdG8gZ28gaW50byB0aGUgbW9uaXRvciBvcgorICAgdGhlIGdkYiBzdHViICovCit2b2lkIGhhbmRsZV9leGNlcHRpb24oaW50IGV4Y2VwdGlvblZlY3RvcikKK3sKKyNpZmRlZiBNT05JVE9SCisgICAgaWYgKGluZ2RibW9kZSAhPSBHREJDT09LSUUpCisgICAgICBtb25pdG9yX2hhbmRsZV9leGNlcHRpb24gKGV4Y2VwdGlvblZlY3Rvcik7CisgICAgZWxzZSAKKyNlbmRpZgorICAgICAgZ2RiX2hhbmRsZV9leGNlcHRpb24gKGV4Y2VwdGlvblZlY3Rvcik7CisKK30KKwordm9pZAorZ2RiX21vZGUoKQoreworICBpbmdkYm1vZGUgPSBHREJDT09LSUU7CisgIGJyZWFrcG9pbnQoKTsKK30KKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZSBhIGJyZWFrcG9pbnQgZXhjZXB0aW9uLiAgSXQgaXMgdXNlZCBhdCB0aGUKKyAgIGJlZ2lubmluZyBvZiBhIHByb2dyYW0gdG8gc3luYyB1cCB3aXRoIGEgZGVidWdnZXIgYW5kIGNhbiBiZSB1c2VkCisgICBvdGhlcndpc2UgYXMgYSBxdWljayBtZWFucyB0byBzdG9wIHByb2dyYW0gZXhlY3V0aW9uIGFuZCAiYnJlYWsiIGludG8KKyAgIHRoZSBkZWJ1Z2dlci4gKi8KKwordm9pZAorYnJlYWtwb2ludCAodm9pZCkKK3sKKyAgICAgIEJSRUFLUE9JTlQgKCk7Cit9CisKK2FzbSAoIl9CSU5JVDogbW92LmwgIEwxLHIxNSIpOworYXNtICgiYnJhIF9JTklUIik7Cithc20gKCJub3AiKTsKK2FzbSAoIkwxOiAubG9uZyBfaW5pdF9zdGFjayArIDgqMTAyNCo0Iik7Cit2b2lkCitJTklUICh2b2lkKQoreworICAvKiBGaXJzdCB0dXJuIG9uIHRoZSByYW0gKi8KKyAgV0NSMSAgPSAwOyAgICAvKiBOZXZlciBzYW1wbGUgd2FpdCAqLworICBCQ1IgPSBCQVM7ICAgIC8qIHVzZSBsb3dieXRlL2hpZ2ggYnl0ZSAqLworCisgIGluaXRfc2VyaWFsKCk7CisKKyNpZmRlZiBNT05JVE9SCisgIHJlc2V0X2hvb2sgKCk7CisjZW5kaWYKKworCisgIGluX25taSA9IDA7CisgIGRvZmF1bHQgPSAxOworICBzdGVwcGVkID0gMDsKKworICBzdHViX3NwID0gc3R1Yl9zdGFjayArIHN0dWJfc3RhY2tfc2l6ZTsKKyAgYnJlYWtwb2ludCAoKTsKKworICB3aGlsZSAoMSkKKyAgICA7Cit9CisKKworc3RhdGljIHZvaWQgc3IoKQoreworCisKKyAgLyogQ2FsbGluZyBSZXNldCBkb2VzIHRoZSBzYW1lIGFzIHByZXNzaW5nIHRoZSBidXR0b24gKi8KKyAgYXNtICgiLmdsb2JhbCBfUmVzZXQKKyAgICAgICAgLmdsb2JhbCBfV2FybVJlc2V0CitfUmVzZXQ6CitfV2FybVJlc2V0OgorICAgICAgICAgbW92LmwgTF9zcCxyMTUKKyAgICAgICAgIGJyYSAgIF9JTklUCisgICAgICAgICBub3AKKyAgICAgICAgIC5hbGlnbiAyCitMX3NwOiAgICAubG9uZyBfaW5pdF9zdGFjayArIDgwMDAiKTsKKworICBhc20oInNhdmVSZWdpc3RlcnM6CisJbW92LmwJQChMX3JlZywgcGMpLCByMAorCW1vdi5sCUByMTUrLCByMQkJCQkhIHBvcCBSMAorCW1vdi5sCXIyLCBAKDB4MDgsIHIwKQkJCQkhIHNhdmUgUjIKKwltb3YubAlyMSwgQHIwCQkJCQkhIHNhdmUgUjAKKwltb3YubAlAcjE1KywgcjEJCQkJISBwb3AgUjEKKwltb3YubAlyMywgQCgweDBjLCByMCkJCQkJISBzYXZlIFIzCisJbW92LmwJcjEsIEAoMHgwNCwgcjApCQkJCSEgc2F2ZSBSMQorCW1vdi5sCXI0LCBAKDB4MTAsIHIwKQkJCQkhIHNhdmUgUjQKKwltb3YubAlyNSwgQCgweDE0LCByMCkJCQkJISBzYXZlIFI1CisJbW92LmwJcjYsIEAoMHgxOCwgcjApCQkJCSEgc2F2ZSBSNgorCW1vdi5sCXI3LCBAKDB4MWMsIHIwKQkJCQkhIHNhdmUgUjcKKwltb3YubAlyOCwgQCgweDIwLCByMCkJCQkJISBzYXZlIFI4CisJbW92LmwJcjksIEAoMHgyNCwgcjApCQkJCSEgc2F2ZSBSOQorCW1vdi5sCXIxMCwgQCgweDI4LCByMCkJCQkhIHNhdmUgUjEwCisJbW92LmwJcjExLCBAKDB4MmMsIHIwKQkJCSEgc2F2ZSBSMTEKKwltb3YubAlyMTIsIEAoMHgzMCwgcjApCQkJISBzYXZlIFIxMgorCW1vdi5sCXIxMywgQCgweDM0LCByMCkJCQkhIHNhdmUgUjEzCisJbW92LmwJcjE0LCBAKDB4MzgsIHIwKQkJCSEgc2F2ZSBSMTQKKwltb3YubAlAcjE1KywgcjQJCQkJISBzYXZlIGFyZyB0byBoYW5kbGVFeGNlcHRpb24KKwlhZGQJIzgsIHIxNQkJCQkJISBoaWRlIFBDL1NSIHZhbHVlcyBvbiBzdGFjaworCW1vdi5sCXIxNSwgQCgweDNjLCByMCkJCQkhIHNhdmUgUjE1CisJYWRkCSMtOCwgcjE1CQkJCSEgc2F2ZSBzdGlsbCBuZWVkcyBvbGQgU1AgdmFsdWUKKwlhZGQJIzkyLCByMAkJCQkJISByZWFkanVzdCByZWdpc3RlciBwb2ludGVyCisJbW92CXIxNSwgcjIKKwlhZGQJIzQsIHIyCisJbW92LmwJQHIyLCByMgkJCQkJISBSMiBoYXMgU1IKKwltb3YubAlAcjE1LCByMQkJCQkhIFIxIGhhcyBQQworCW1vdi5sCXIyLCBALXIwCQkJCSEgc2F2ZSBTUgorCXN0cy5sCW1hY2wsIEAtcjAJCQkJISBzYXZlIE1BQ0wKKwlzdHMubAltYWNoLCBALXIwCQkJCSEgc2F2ZSBNQUNICisJc3RjLmwJdmJyLCBALXIwCQkJCSEgc2F2ZSBWQlIKKwlzdGMubAlnYnIsIEAtcjAJCQkJISBzYXZlIEdCUgorCXN0cy5sCXByLCBALXIwCQkJCSEgc2F2ZSBQUgorCW1vdi5sCUAoTF9zdHVic3RhY2ssIHBjKSwgcjIKKwltb3YubAlAKExfaGRsX2V4Y2VwdCwgcGMpLCByMworCW1vdi5sCUByMiwgcjE1CisJanNyCUByMworCW1vdi5sCXIxLCBALXIwCQkJCSEgc2F2ZSBQQworCW1vdi5sCUAoTF9zdHVic3RhY2ssIHBjKSwgcjAKKwltb3YubAlAKExfcmVnLCBwYyksIHIxCisJYnJhCXJlc3RvcmVSZWdpc3RlcnMKKwltb3YubAlyMTUsIEByMAkJCQkhIHNhdmUgX19zdHViX3N0YWNrCisJCisJLmFsaWduIDIKK0xfcmVnOgorCS5sb25nCV9yZWdpc3RlcnMKK0xfc3R1YnN0YWNrOgorCS5sb25nCV9zdHViX3NwCitMX2hkbF9leGNlcHQ6CisJLmxvbmcJX2hhbmRsZV9leGNlcHRpb24iKTsKKworfQorCitzdGF0aWMgdm9pZCBycigpCit7Cithc20oIgorCS5hbGlnbiAyCQorICAgICAgICAuZ2xvYmFsIF9yZXN1bWUKK19yZXN1bWU6CisJbW92CXI0LHIxCityZXN0b3JlUmVnaXN0ZXJzOgorCWFkZAkjOCwgcjEJCQkJCQkhIHNraXAgdG8gUjIKKwltb3YubAlAcjErLCByMgkJCQkJISByZXN0b3JlIFIyCisJbW92LmwJQHIxKywgcjMJCQkJCSEgcmVzdG9yZSBSMworCW1vdi5sCUByMSssIHI0CQkJCQkhIHJlc3RvcmUgUjQKKwltb3YubAlAcjErLCByNQkJCQkJISByZXN0b3JlIFI1CisJbW92LmwJQHIxKywgcjYJCQkJCSEgcmVzdG9yZSBSNgorCW1vdi5sCUByMSssIHI3CQkJCQkhIHJlc3RvcmUgUjcKKwltb3YubAlAcjErLCByOAkJCQkJISByZXN0b3JlIFI4CisJbW92LmwJQHIxKywgcjkJCQkJCSEgcmVzdG9yZSBSOQorCW1vdi5sCUByMSssIHIxMAkJCQkJISByZXN0b3JlIFIxMAorCW1vdi5sCUByMSssIHIxMQkJCQkJISByZXN0b3JlIFIxMQorCW1vdi5sCUByMSssIHIxMgkJCQkJISByZXN0b3JlIFIxMgorCW1vdi5sCUByMSssIHIxMwkJCQkJISByZXN0b3JlIFIxMworCW1vdi5sCUByMSssIHIxNAkJCQkJISByZXN0b3JlIFIxNAorCW1vdi5sCUByMSssIHIxNQkJCQkJISByZXN0b3JlIHByb2dyYW1zIHN0YWNrCisJbW92LmwJQHIxKywgcjAKKwlhZGQJIy04LCByMTUJCQkJCSEgdW5jb3ZlciBQQy9TUiBvbiBzdGFjayAKKwltb3YubAlyMCwgQHIxNQkJCQkJISByZXN0b3JlIFBDIG9udG8gc3RhY2sKKwlsZHMubAlAcjErLCBwcgkJCQkJISByZXN0b3JlIFBSCisJbGRjLmwJQHIxKywgZ2JyCQkJCQkhIHJlc3RvcmUgR0JSCQkKKwlsZGMubAlAcjErLCB2YnIJCQkJCSEgcmVzdG9yZSBWQlIKKwlsZHMubAlAcjErLCBtYWNoCQkJCQkhIHJlc3RvcmUgTUFDSAorCWxkcy5sCUByMSssIG1hY2wJCQkJCSEgcmVzdG9yZSBNQUNMCisJbW92LmwJQHIxLCByMAkKKwlhZGQJIy04OCwgcjEJCQkJCSEgcmVhZGp1c3QgcmVnIHBvaW50ZXIgdG8gUjEKKwltb3YubAlyMCwgQCg0LCByMTUpCQkJCQkhIHJlc3RvcmUgU1Igb250byBzdGFjays0CisJbW92LmwJcjIsIEAtcjE1CisJbW92LmwJTF9pbl9ubWksIHIwCisJbW92CQkjMCwgcjIKKwltb3YuYglyMiwgQHIwCisJbW92LmwJQHIxNSssIHIyCisJbW92LmwJQHIxKywgcjAJCQkJCSEgcmVzdG9yZSBSMAorCXJ0ZQorCW1vdi5sCUByMSwgcjEJCQkJCQkhIHJlc3RvcmUgUjEKKworIik7Cit9CisKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBjb2RlX2Zvcl9jYXRjaF9leGNlcHRpb24oaW50IG4pIAoreworICBhc20oIgkJLmdsb2JsCV9jYXRjaF9leGNlcHRpb25fJU8wIiA6IDogImkiIChuKSAJCQkJKTsgCisgIGFzbSgiCV9jYXRjaF9leGNlcHRpb25fJU8wOiIgOjogImkiIChuKSAgICAgIAkJCQkJCSk7CisKKyAgYXNtKCIJCWFkZAkjLTQsIHIxNSAJCQkJISByZXNlcnZlIHNwb3Qgb24gc3RhY2sgIik7CisgIGFzbSgiCQltb3YubAlyMSwgQC1yMTUJCQkJISBwdXNoIFIxCQkiKTsKKworICBpZiAobiA9PSBOTUlfVkVDKSAKKyAgICB7CisgICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIE5NSSAtIG1ha2Ugc3VyZSB0aGF0IHRoZXkgZG9uJ3QgbmVzdCAqLworICAgICAgYXNtKCIJbW92LmwJcjAsIEAtcjE1CQkJCQkhIHB1c2ggUjAiKTsKKyAgICAgIGFzbSgiCW1vdi5sCUxfaW5fbm1pLCByMCIpOworICAgICAgYXNtKCIJdGFzLmIJQHIwCQkJCQkJISBGZW5kIG9mZiBhZ2FpbnN0IGFkZHRubCBOTUlzIik7CisgICAgICBhc20oIglidAkJbm9OTUkiKTsKKyAgICAgIGFzbSgiCW1vdi5sCUByMTUrLCByMCIpOworICAgICAgYXNtKCIJbW92LmwJQHIxNSssIHIxIik7CisgICAgICBhc20oIglhZGQJCSM0LCByMTUiKTsKKyAgICAgIGFzbSgiCXJ0ZSIpOworICAgICAgYXNtKCIJbm9wIik7CisgICAgICBhc20oIi5hbGlnbiAyIik7CisgICAgICBhc20oIkxfaW5fbm1pOiAubG9uZwlfaW5fbm1pIik7CisgICAgICBhc20oIm5vTk1JOiIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKworICAgICAgaWYgKG4gPT0gQ1BVX0JVU19FUlJPUl9WRUMpCisJeworCSAgLyogRXhjZXB0aW9uIDkgKGJ1cyBlcnJvcnMpIGFyZSBkaXNhc2JsZWFibGUgLSBzbyB0aGF0IHlvdQorCSAgICAgY2FuIHByb2JlIG1lbW9yeSBhbmQgZ2V0IHplcm8gaW5zdGVhZCBvZiBhIGZhdWx0LgorCSAgICAgQmVjYXVzZSB0aGUgdmVjdG9yIHRhYmxlIG1heSBiZSBpbiBST00gd2UgZG9uJ3QgcmV2ZWN0b3IKKwkgICAgIHRoZSBpbnRlcnJ1cHQgbGlrZSBhbGwgdGhlIG90aGVyIHN0dWJzLCB3ZSBjaGVjayBpbiBoZXJlCisJICAgICAqLworCSAgYXNtKCJtb3YubAlMX2RvZmF1bHQscjEiKTsKKwkgIGFzbSgibW92LmwJQHIxLHIxIik7CisJICBhc20oInRzdAlyMSxyMSIpOworCSAgYXNtKCJiZglmYXVsdGF3YXkiKTsKKwkgIGFzbSgiYnNyCV9oYW5kbGVfYnVzZXJyb3IiKTsKKwkgIGFzbSgiLmFsaWduCTIiKTsKKwkgIGFzbSgiTF9kb2ZhdWx0OiAubG9uZyBfZG9mYXVsdCIpOworCSAgYXNtKCJmYXVsdGF3YXk6Iik7CisJfQorICAgICAgYXNtKCIJCW1vdgkjMTU8PDQsIHIxCQkJCQkJCSIpOworICAgICAgYXNtKCIJCWxkYwlyMSwgc3IJCQkJCSEgZGlzYWJsZSBpbnRlcnJ1cHRzCSIpOworICAgICAgYXNtKCIJCW1vdi5sCXIwLCBALXIxNQkJCQkhIHB1c2ggUjAJCSIpOworICAgIH0KKworICAvKiBQcmVwYXJlIGZvciBzYXZpbmcgY29udGV4dCwgd2UndmUgYWxyZWFkeSBwdXNoZWQgcjAgYW5kIHIxLCBzdGljayBleGNlcHRpb24gbnVtYmVyCisgICAgIGludG8gdGhlIGZyYW1lICovCisgIGFzbSgiCQltb3YJcjE1LCByMAkJCQkJCQkJIik7CisgIGFzbSgiCQlhZGQJIzgsIHIwCQkJCQkJCQkiKTsKKyAgYXNtKCIJCW1vdgklMCxyMSIgOjogImkiIChuKSAgICAgICAgCQkJCQkpOworICBhc20oIgkJZXh0dS5iICByMSxyMQkJCQkJCQkJIik7CisgIGFzbSgiCQlicmEJc2F2ZVJlZ2lzdGVycwkJCQkhIHNhdmUgcmVnaXN0ZXIgdmFsdWVzCSIpOworICBhc20oIgkJbW92LmwJcjEsIEByMAkJCQkJISBzYXZlIGV4Y2VwdGlvbiAjIAkiKTsKK30KKworCitzdGF0aWMgIHZvaWQKK2V4Y2VwdGlvbnMoKQoreworICBjb2RlX2Zvcl9jYXRjaF9leGNlcHRpb24gKENQVV9CVVNfRVJST1JfVkVDKTsKKyAgY29kZV9mb3JfY2F0Y2hfZXhjZXB0aW9uIChETUFfQlVTX0VSUk9SX1ZFQyk7CisgIGNvZGVfZm9yX2NhdGNoX2V4Y2VwdGlvbiAoSU5WQUxJRF9JTlNOX1ZFQyk7CisgIGNvZGVfZm9yX2NhdGNoX2V4Y2VwdGlvbiAoSU5WQUxJRF9TTE9UX1ZFQyk7CisgIGNvZGVfZm9yX2NhdGNoX2V4Y2VwdGlvbiAoTk1JX1ZFQyk7CisgIGNvZGVfZm9yX2NhdGNoX2V4Y2VwdGlvbiAoVFJBUF9WRUMpOworICBjb2RlX2Zvcl9jYXRjaF9leGNlcHRpb24gKFVTRVJfVkVDKTsKKyAgY29kZV9mb3JfY2F0Y2hfZXhjZXB0aW9uIChJT19WRUMpOworfQorCisKKworCisKKworLyogU3VwcG9ydCBmb3IgU2VyaWFsIEkvTyB1c2luZyBvbiBjaGlwIHVhcnQgKi8KKworI2RlZmluZSBTTVIwICgqKHZvbGF0aWxlIGNoYXIgKikoMHgwNUZGRkVDMCkpIC8qIENoYW5uZWwgMCAgc2VyaWFsIG1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQlJSMCAoKih2b2xhdGlsZSBjaGFyICopKDB4MDVGRkZFQzEpKSAvKiBDaGFubmVsIDAgIGJpdCByYXRlIHJlZ2lzdGVyICovCisjZGVmaW5lIFNDUjAgKCoodm9sYXRpbGUgY2hhciAqKSgweDA1RkZGRUMyKSkgLyogQ2hhbm5lbCAwICBzZXJpYWwgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBURFIwICgqKHZvbGF0aWxlIGNoYXIgKikoMHgwNUZGRkVDMykpIC8qIENoYW5uZWwgMCAgdHJhbnNtaXQgZGF0YSByZWdpc3RlciAqLworI2RlZmluZSBTU1IwICgqKHZvbGF0aWxlIGNoYXIgKikoMHgwNUZGRkVDNCkpIC8qIENoYW5uZWwgMCAgc2VyaWFsIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBSRFIwICgqKHZvbGF0aWxlIGNoYXIgKikoMHgwNUZGRkVDNSkpIC8qIENoYW5uZWwgMCAgcmVjZWl2ZSBkYXRhIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgU01SMSAoKih2b2xhdGlsZSBjaGFyICopKDB4MDVGRkZFQzgpKSAvKiBDaGFubmVsIDEgIHNlcmlhbCBtb2RlIHJlZ2lzdGVyICovCisjZGVmaW5lIEJSUjEgKCoodm9sYXRpbGUgY2hhciAqKSgweDA1RkZGRUM5KSkgLyogQ2hhbm5lbCAxICBiaXQgcmF0ZSByZWdpc3RlciAqLworI2RlZmluZSBTQ1IxICgqKHZvbGF0aWxlIGNoYXIgKikoMHgwNUZGRkVDQSkpIC8qIENoYW5uZWwgMSAgc2VyaWFsIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVERSMSAoKih2b2xhdGlsZSBjaGFyICopKDB4MDVGRkZFQ0IpKSAvKiBDaGFubmVsIDEgIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1NSMSAoKih2b2xhdGlsZSBjaGFyICopKDB4MDVGRkZFQ0MpKSAvKiBDaGFubmVsIDEgIHNlcmlhbCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkRSMSAoKih2b2xhdGlsZSBjaGFyICopKDB4MDVGRkZFQ0QpKSAvKiBDaGFubmVsIDEgIHJlY2VpdmUgZGF0YSByZWdpc3RlciAqLworCisvKgorICogU2VyaWFsIG1vZGUgcmVnaXN0ZXIgYml0cworICovCisKKyNkZWZpbmUgU1lOQ19NT0RFIAkJMHg4MAorI2RlZmluZSBTRVZFTl9CSVRfREFUQSAJCTB4NDAKKyNkZWZpbmUgUEFSSVRZX09OCQkweDIwCisjZGVmaW5lIE9ERF9QQVJJVFkJCTB4MTAKKyNkZWZpbmUgU1RPUF9CSVRTXzIJCTB4MDgKKyNkZWZpbmUgRU5BQkxFX01VTFRJUAkJMHgwNAorI2RlZmluZSBQSElfNjQJCQkweDAzCisjZGVmaW5lIFBISV8xNgkJCTB4MDIKKyNkZWZpbmUgUEhJXzQJCQkweDAxCisKKy8qCisgKiBTZXJpYWwgY29udHJvbCByZWdpc3RlciBiaXRzCisgKi8KKyNkZWZpbmUgU0NJX1RJRQkJCQkweDgwCS8qIFRyYW5zbWl0IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgU0NJX1JJRQkJCQkweDQwCS8qIFJlY2VpdmUgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBTQ0lfVEUJCQkJMHgyMAkvKiBUcmFuc21pdCBlbmFibGUgKi8KKyNkZWZpbmUgU0NJX1JFCQkJCTB4MTAJLyogUmVjZWl2ZSBlbmFibGUgKi8KKyNkZWZpbmUgU0NJX01QSUUJCQkweDA4CS8qIE11bHRpcHJvY2Vzc29yIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgU0NJX1RFSUUJCQkweDA0CS8qIFRyYW5zbWl0IGVuZCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIFNDSV9DS0UxCQkJMHgwMgkvKiBDbG9jayBlbmFibGUgMSAqLworI2RlZmluZSBTQ0lfQ0tFMAkJCTB4MDEJLyogQ2xvY2sgZW5hYmxlIDAgKi8KKworLyoKKyAqIFNlcmlhbCBzdGF0dXMgcmVnaXN0ZXIgYml0cworICovCisjZGVmaW5lIFNDSV9URFJFCQkJMHg4MAkvKiBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5ICovCisjZGVmaW5lIFNDSV9SRFJGCQkJMHg0MAkvKiBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgZnVsbCAqLworI2RlZmluZSBTQ0lfT1JFUgkJCTB4MjAJLyogT3ZlcnJ1biBlcnJvciAqLworI2RlZmluZSBTQ0lfRkVSCQkJCTB4MTAJLyogRnJhbWluZyBlcnJvciAqLworI2RlZmluZSBTQ0lfUEVSCQkJCTB4MDgJLyogUGFyaXR5IGVycm9yICovCisjZGVmaW5lIFNDSV9URU5ECQkJMHgwNAkvKiBUcmFuc21pdCBlbmQgKi8KKyNkZWZpbmUgU0NJX01QQgkJCQkweDAyCS8qIE11bHRpcHJvY2Vzc29yIGJpdCAqLworI2RlZmluZSBTQ0lfTVBCVAkJCTB4MDEJLyogTXVsdGlwcm9jZXNzb3IgYml0IHRyYW5zZmVyICovCisKKworLyoKKyAqIFBvcnQgQiBJTyBSZWdpc3RlciAoUEJJT1IpCisgKi8KKyNkZWZpbmUJUEJJT1IgCQkoKih2b2xhdGlsZSBjaGFyICopKDB4MDVGRkZGQzYpKQorI2RlZmluZQlQQjE1SU9SIAkweDgwMDAKKyNkZWZpbmUJUEIxNElPUiAJMHg0MDAwCisjZGVmaW5lCVBCMTNJT1IgCTB4MjAwMAorI2RlZmluZQlQQjEySU9SIAkweDEwMDAKKyNkZWZpbmUJUEIxMUlPUiAJMHgwODAwCisjZGVmaW5lCVBCMTBJT1IgCTB4MDQwMAorI2RlZmluZQlQQjlJT1IgCQkweDAyMDAKKyNkZWZpbmUJUEI4SU9SIAkJMHgwMTAwCisjZGVmaW5lCVBCN0lPUiAJCTB4MDA4MAorI2RlZmluZQlQQjZJT1IgCQkweDAwNDAKKyNkZWZpbmUJUEI1SU9SIAkJMHgwMDIwCisjZGVmaW5lCVBCNElPUiAJCTB4MDAxMAorI2RlZmluZQlQQjNJT1IgCQkweDAwMDgKKyNkZWZpbmUJUEIySU9SIAkJMHgwMDA0CisjZGVmaW5lCVBCMUlPUiAJCTB4MDAwMgorI2RlZmluZQlQQjBJT1IgCQkweDAwMDEKKworLyoKKyAqIFBvcnQgQiBDb250cm9sIFJlZ2lzdGVyIChQQkNSMSkKKyAqLworI2RlZmluZQlQQkNSMSAJCSgqKHZvbGF0aWxlIHNob3J0ICopKDB4MDVGRkZGQ0MpKQorI2RlZmluZQlQQjE1TUQxIAkweDgwMDAKKyNkZWZpbmUJUEIxNU1EMCAJMHg0MDAwCisjZGVmaW5lCVBCMTRNRDEgCTB4MjAwMAorI2RlZmluZQlQQjE0TUQwIAkweDEwMDAKKyNkZWZpbmUJUEIxM01EMSAJMHgwODAwCisjZGVmaW5lCVBCMTNNRDAgCTB4MDQwMAorI2RlZmluZQlQQjEyTUQxIAkweDAyMDAKKyNkZWZpbmUJUEIxMk1EMCAJMHgwMTAwCisjZGVmaW5lCVBCMTFNRDEgCTB4MDA4MAorI2RlZmluZQlQQjExTUQwIAkweDAwNDAKKyNkZWZpbmUJUEIxME1EMSAJMHgwMDIwCisjZGVmaW5lCVBCMTBNRDAgCTB4MDAxMAorI2RlZmluZQlQQjlNRDEgCQkweDAwMDgKKyNkZWZpbmUJUEI5TUQwIAkJMHgwMDA0CisjZGVmaW5lCVBCOE1EMSAJCTB4MDAwMgorI2RlZmluZQlQQjhNRDAgCQkweDAwMDEKKworI2RlZmluZQlQQjE1TUQgCQlQQjE1TUQxfFBCMTRNRDAKKyNkZWZpbmUJUEIxNE1EIAkJUEIxNE1EMXxQQjE0TUQwCisjZGVmaW5lCVBCMTNNRCAJCVBCMTNNRDF8UEIxM01EMAorI2RlZmluZQlQQjEyTUQgCQlQQjEyTUQxfFBCMTJNRDAKKyNkZWZpbmUJUEIxMU1EIAkJUEIxMU1EMXxQQjExTUQwCisjZGVmaW5lCVBCMTBNRCAJCVBCMTBNRDF8UEIxME1EMAorI2RlZmluZQlQQjlNRCAJCVBCOU1EMXxQQjlNRDAKKyNkZWZpbmUJUEI4TUQgCQlQQjhNRDF8UEI4TUQwCisKKyNkZWZpbmUgUEJfVFhEMSAJUEIxMU1EMQorI2RlZmluZSBQQl9SWEQxIAlQQjEwTUQxCisjZGVmaW5lIFBCX1RYRDAgCVBCOU1EMQorI2RlZmluZSBQQl9SWEQwIAlQQjhNRDEKKworLyoKKyAqIFBvcnQgQiBDb250cm9sIFJlZ2lzdGVyIChQQkNSMikKKyAqLworI2RlZmluZQlQQkNSMiAJMHgwNUZGRkZDRQorI2RlZmluZQlQQjdNRDEgCTB4ODAwMAorI2RlZmluZQlQQjdNRDAgCTB4NDAwMAorI2RlZmluZQlQQjZNRDEgCTB4MjAwMAorI2RlZmluZQlQQjZNRDAgCTB4MTAwMAorI2RlZmluZQlQQjVNRDEgCTB4MDgwMAorI2RlZmluZQlQQjVNRDAgCTB4MDQwMAorI2RlZmluZQlQQjRNRDEgCTB4MDIwMAorI2RlZmluZQlQQjRNRDAgCTB4MDEwMAorI2RlZmluZQlQQjNNRDEgCTB4MDA4MAorI2RlZmluZQlQQjNNRDAgCTB4MDA0MAorI2RlZmluZQlQQjJNRDEgCTB4MDAyMAorI2RlZmluZQlQQjJNRDAgCTB4MDAxMAorI2RlZmluZQlQQjFNRDEgCTB4MDAwOAorI2RlZmluZQlQQjFNRDAgCTB4MDAwNAorI2RlZmluZQlQQjBNRDEgCTB4MDAwMgorI2RlZmluZQlQQjBNRDAgCTB4MDAwMQorCQorI2RlZmluZQlQQjdNRCAJUEI3TUQxfFBCN01EMAorI2RlZmluZQlQQjZNRCAJUEI2TUQxfFBCNk1EMAorI2RlZmluZQlQQjVNRCAJUEI1TUQxfFBCNU1EMAorI2RlZmluZQlQQjRNRCAJUEI0TUQxfFBCNE1EMAorI2RlZmluZQlQQjNNRCAJUEIzTUQxfFBCM01EMAorI2RlZmluZQlQQjJNRCAJUEIyTUQxfFBCMk1EMAorI2RlZmluZQlQQjFNRCAJUEIxTUQxfFBCMU1EMAorI2RlZmluZQlQQjBNRCAJUEIwTUQxfFBCME1EMAorCisKKyNpZmRlZiBNSFoKKyNkZWZpbmUgQlBTCQkJMzIgKiA5NjAwICogTUhaIC8gKCBCQVVEICogMTApCisjZWxzZQorI2RlZmluZSBCUFMJCQkzMgkvKiA5NjAwIGZvciAxMCBNaHogKi8KKyNlbmRpZgorCit2b2lkIGhhbmRsZUVycm9yIChjaGFyIHRoZVNTUik7CisKK3ZvaWQKK25vcCAoKQoreworCit9Cit2b2lkIAoraW5pdF9zZXJpYWwoKQoreworICBpbnQgaTsKKworICAvKiBDbGVhciBURSBhbmQgUkUgaW4gQ2hhbm5lbCAxJ3MgU0NSICAgKi8KKyAgU0NSMSAmPSB+KFNDSV9URSB8IFNDSV9SRSk7CisKKyAgLyogU2V0IGNvbW11bmljYXRpb24gdG8gYmUgYXN5bmMsIDgtYml0IGRhdGEsIG5vIHBhcml0eSwgMSBzdG9wIGJpdCBhbmQgdXNlIGludGVybmFsIGNsb2NrICovCisKKyAgU01SMSA9IDA7CisgIEJSUjEgPSBCUFM7CisKKyAgU0NSMSAmPSB+KFNDSV9DS0UxIHwgU0NJX0NLRTApOworCisgIC8qIGxldCB0aGUgaGFyZHdhcmUgc2V0dGxlICovCisKKyAgZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykKKyAgICBub3AgKCk7CisKKyAgLyogVHVybiBvbiBpbiBhbmQgb3V0ICovCisgIFNDUjEgfD0gU0NJX1JFIHwgU0NJX1RFOworCisgIC8qIFNldCB0aGUgUEZDIHRvIG1ha2UgUlhEMSAocGluIFBCOCkgYW4gaW5wdXQgcGluIGFuZCBUWEQxIChwaW4gUEI5KSBhbiBvdXRwdXQgcGluICovCisgIFBCQ1IxICY9IH4oUEJfVFhEMSB8IFBCX1JYRDEpOworICBQQkNSMSB8PSBQQl9UWEQxIHwgUEJfUlhEMTsKK30KKworCitpbnQKK2dldERlYnVnQ2hhclJlYWR5ICh2b2lkKQoreworICBjaGFyIG15U1NSOworICBteVNTUiA9IFNTUjEgJiAoIFNDSV9QRVIgfCBTQ0lfRkVSIHwgU0NJX09SRVIgKTsKKyAgaWYgKCBteVNTUiApCisgICAgaGFuZGxlRXJyb3IgKCBteVNTUiApOworICByZXR1cm4gU1NSMSAmIFNDSV9SRFJGIDsKK30KKworY2hhciAKK2dldERlYnVnQ2hhciAodm9pZCkKK3sKKyAgY2hhciBjaDsKKyAgY2hhciBteVNTUjsKKworICB3aGlsZSAoICEgZ2V0RGVidWdDaGFyUmVhZHkoKSkKKyAgICA7CisKKyAgY2ggPSBSRFIxOworICBTU1IxICY9IH5TQ0lfUkRSRjsKKworICBteVNTUiA9IFNTUjEgJiAoU0NJX1BFUiB8IFNDSV9GRVIgfCBTQ0lfT1JFUik7CisKKyAgaWYgKG15U1NSKQorICAgIGhhbmRsZUVycm9yIChteVNTUik7CisKKyAgcmV0dXJuIGNoOworfQorCitpbnQgCitwdXREZWJ1Z0NoYXJSZWFkeSgpCit7CisgIHJldHVybiAoU1NSMSAmIFNDSV9URFJFKTsKK30KKwordm9pZAorcHV0RGVidWdDaGFyIChjaGFyIGNoKQoreworICB3aGlsZSAoIXB1dERlYnVnQ2hhclJlYWR5KCkpCisgICAgOworCisgIC8qCisgICAqIFdyaXRlIGRhdGEgaW50byBURFIgYW5kIGNsZWFyIFREUkUKKyAgICovCisgIFREUjEgPSBjaDsKKyAgU1NSMSAmPSB+U0NJX1REUkU7Cit9CisKK3ZvaWQgCitoYW5kbGVFcnJvciAoY2hhciB0aGVTU1IpCit7CisgIFNTUjEgJj0gfihTQ0lfT1JFUiB8IFNDSV9QRVIgfCBTQ0lfRkVSKTsKK30KKwpkaWZmIC0tZ2l0IGEvZ2RiL3NoLXRkZXAuYyBiL2dkYi9zaC10ZGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5NDUwNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9zaC10ZGVwLmMKQEAgLTAsMCArMSw3MjggQEAKKy8qIFRhcmdldC1kZXBlbmRlbnQgY29kZSBmb3IgSGl0YWNoaSBTdXBlci1ILCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyoKKyBDb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbgorICAgICAgICAgICAgICAgIHNhY0BjeWdudXMuY29tCisgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJkaXMtYXNtLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIJCS8qIGZvciBCRUZPUkVfVEVYVF9FTkQgZXRjLiAqLworI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKworLyogQSBzZXQgb2Ygb3JpZ2luYWwgbmFtZXMsIHRvIGJlIHVzZWQgd2hlbiByZXN0b3JpbmcgYmFjayB0byBnZW5lcmljCisgICByZWdpc3RlcnMgZnJvbSBhIHNwZWNpZmljIHNldC4gICovCisKK3N0YXRpYyBjaGFyICpzaF9nZW5lcmljX3JlZ19uYW1lc1tdID0geworICAicjAiLCAgICJyMSIsICAgInIyIiwgICAicjMiLCAgICJyNCIsICAgInI1IiwgICAicjYiLCAgICJyNyIsCisgICJyOCIsICAgInI5IiwgICAicjEwIiwgICJyMTEiLCAgInIxMiIsICAicjEzIiwgICJyMTQiLCAgInIxNSIsCisgICJwYyIsICAgInByIiwgICAiZ2JyIiwgICJ2YnIiLCAgIm1hY2giLCAibWFjbCIsICJzciIsCisgICJmcHVsIiwgImZwc2NyIiwKKyAgImZyMCIsICAiZnIxIiwgICJmcjIiLCAgImZyMyIsICAiZnI0IiwgICJmcjUiLCAgImZyNiIsICAiZnI3IiwKKyAgImZyOCIsICAiZnI5IiwgICJmcjEwIiwgImZyMTEiLCAiZnIxMiIsICJmcjEzIiwgImZyMTQiLCAiZnIxNSIsCisgICJzc3IiLCAgInNwYyIsCisgICJyMGIwIiwgInIxYjAiLCAicjJiMCIsICJyM2IwIiwgInI0YjAiLCAicjViMCIsICJyNmIwIiwgInI3YjAiLAorICAicjBiMSIsICJyMWIxIiwgInIyYjEiLCAicjNiMSIsICJyNGIxIiwgInI1YjEiLCAicjZiMSIsICJyN2IxIiwKK307CisKK3N0YXRpYyBjaGFyICpzaF9yZWdfbmFtZXNbXSA9IHsKKyAgInIwIiwgICAicjEiLCAgICJyMiIsICAgInIzIiwgICAicjQiLCAgICJyNSIsICAgInI2IiwgICAicjciLAorICAicjgiLCAgICJyOSIsICAgInIxMCIsICAicjExIiwgICJyMTIiLCAgInIxMyIsICAicjE0IiwgICJyMTUiLAorICAicGMiLCAgICJwciIsICAgImdiciIsICAidmJyIiwgICJtYWNoIiwgIm1hY2wiLCAic3IiLAorICAiIiwgICAgICIiLAorICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLAorICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLAorICAiIiwgICAgICIiLAorICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLAorICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLAorfTsKKworc3RhdGljIGNoYXIgKnNoM19yZWdfbmFtZXNbXSA9IHsKKyAgInIwIiwgICAicjEiLCAgICJyMiIsICAgInIzIiwgICAicjQiLCAgICJyNSIsICAgInI2IiwgICAicjciLAorICAicjgiLCAgICJyOSIsICAgInIxMCIsICAicjExIiwgICJyMTIiLCAgInIxMyIsICAicjE0IiwgICJyMTUiLAorICAicGMiLCAgICJwciIsICAgImdiciIsICAidmJyIiwgICJtYWNoIiwgIm1hY2wiLCAic3IiLAorICAiIiwgICAgICIiLAorICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLAorICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLAorICAic3NyIiwgICJzcGMiLAorICAicjBiMCIsICJyMWIwIiwgInIyYjAiLCAicjNiMCIsICJyNGIwIiwgInI1YjAiLCAicjZiMCIsICJyN2IwIiwKKyAgInIwYjEiLCAicjFiMSIsICJyMmIxIiwgInIzYjEiLCAicjRiMSIsICJyNWIxIiwgInI2YjEiLCAicjdiMSIKK307CisKK3N0YXRpYyBjaGFyICpzaDNlX3JlZ19uYW1lc1tdID0geworICAicjAiLCAgICJyMSIsICAgInIyIiwgICAicjMiLCAgICJyNCIsICAgInI1IiwgICAicjYiLCAgICJyNyIsCisgICJyOCIsICAgInI5IiwgICAicjEwIiwgICJyMTEiLCAgInIxMiIsICAicjEzIiwgICJyMTQiLCAgInIxNSIsCisgICJwYyIsICAgInByIiwgICAiZ2JyIiwgICJ2YnIiLCAgIm1hY2giLCAibWFjbCIsICJzciIsCisgICJmcHVsIiwgImZwc2NyIiwKKyAgImZyMCIsICAiZnIxIiwgICJmcjIiLCAgImZyMyIsICAiZnI0IiwgICJmcjUiLCAgImZyNiIsICAiZnI3IiwKKyAgImZyOCIsICAiZnI5IiwgICJmcjEwIiwgImZyMTEiLCAiZnIxMiIsICJmcjEzIiwgImZyMTQiLCAiZnIxNSIsCisgICJzc3IiLCAgInNwYyIsCisgICJyMGIwIiwgInIxYjAiLCAicjJiMCIsICJyM2IwIiwgInI0YjAiLCAicjViMCIsICJyNmIwIiwgInI3YjAiLAorICAicjBiMSIsICJyMWIxIiwgInIyYjEiLCAicjNiMSIsICJyNGIxIiwgInI1YjEiLCAicjZiMSIsICJyN2IxIiwKK307CisKK2NoYXIgKipzaF9yZWdpc3Rlcl9uYW1lcyA9IHNoX2dlbmVyaWNfcmVnX25hbWVzOworCisKK3N0cnVjdCB7CisgIGNoYXIgKipyZWduYW1lczsKKyAgaW50IG1hY2g7Cit9IHNoX3Byb2Nlc3Nvcl90eXBlX3RhYmxlW10gPSB7CisgIHsgc2hfcmVnX25hbWVzLCBiZmRfbWFjaF9zaCB9LAorICB7IHNoM19yZWdfbmFtZXMsIGJmZF9tYWNoX3NoMyB9LAorICB7IHNoM2VfcmVnX25hbWVzLCBiZmRfbWFjaF9zaDNlIH0sCisgIHsgTlVMTCwgMCB9Cit9OworCisvKiBQcm9sb2d1ZSBsb29rcyBsaWtlCisgICBbbW92LmwJPHJlZ3M+LEAtcjE1XS4uLgorICAgW3N0cy5sCXByLEAtcjE1XQorICAgW21vdi5sCXIxNCxALXIxNV0KKyAgIFttb3YJCXIxNSxyMTRdCisqLworCisjZGVmaW5lIElTX1NUUyh4KSAgCQkoKHgpID09IDB4NGYyMikKKyNkZWZpbmUgSVNfUFVTSCh4KSAJCSgoKHgpICYgMHhmZjBmKSA9PSAweDJmMDYpCisjZGVmaW5lIEdFVF9QVVNIRURfUkVHKHgpICAJKCgoeCkgPj4gNCkgJiAweGYpCisjZGVmaW5lIElTX01PVl9TUF9GUCh4KSAgCSgoeCkgPT0gMHg2ZWYzKQorI2RlZmluZSBJU19BRERfU1AoeCkgCQkoKCh4KSAmIDB4ZmYwMCkgPT0gMHg3ZjAwKQorI2RlZmluZSBJU19NT1ZfUjMoeCkgCQkoKCh4KSAmIDB4ZmYwMCkgPT0gMHgxYTAwKQorI2RlZmluZSBJU19TSExMX1IzKHgpCQkoKHgpID09IDB4NDMwMCkKKyNkZWZpbmUgSVNfQUREX1IzU1AoeCkJCSgoeCkgPT0gMHgzZjNjKQorI2RlZmluZSBJU19GTU9WKHgpCQkoKCh4KSAmIDB4ZjAwZikgPT0gMHhmMDBiKQorI2RlZmluZSBGUFNDUl9TWgkJKDEgPDwgMjApCisKKworLyogU2hvdWxkIGNhbGxfZnVuY3Rpb24gYWxsb2NhdGUgc3RhY2sgc3BhY2UgZm9yIGEgc3RydWN0IHJldHVybj8gICovCitpbnQKK3NoX3VzZV9zdHJ1Y3RfY29udmVudGlvbiAoZ2NjX3AsIHR5cGUpCisgICAgIGludCBnY2NfcDsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7Cit7CisgIHJldHVybiAoVFlQRV9MRU5HVEggKHR5cGUpID4gMSk7Cit9CisKKworLyogU2tpcCBhbnkgcHJvbG9ndWUgYmVmb3JlIHRoZSBndXRzIG9mIGEgZnVuY3Rpb24gKi8KKworQ09SRV9BRERSCitzaF9za2lwX3Byb2xvZ3VlIChzdGFydF9wYykKKyAgICAgQ09SRV9BRERSIHN0YXJ0X3BjOworeworICBpbnQgdzsKKworICB3ID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoc3RhcnRfcGMsIDIpOworICB3aGlsZSAoSVNfU1RTICh3KQorCSB8fCBJU19GTU9WICh3KQorCSB8fCBJU19QVVNIICh3KQorCSB8fCBJU19NT1ZfU1BfRlAgKHcpCisJIHx8IElTX01PVl9SMyAodykKKwkgfHwgSVNfQUREX1IzU1AgKHcpCisJIHx8IElTX0FERF9TUCAodykKKwkgfHwgSVNfU0hMTF9SMyAodykpCisgICAgeworICAgICAgc3RhcnRfcGMgKz0gMjsKKyAgICAgIHcgPSByZWFkX21lbW9yeV9pbnRlZ2VyIChzdGFydF9wYywgMik7CisgICAgfQorCisgIHJldHVybiBzdGFydF9wYzsKK30KKworLyogRGlzYXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24uICAqLworCitpbnQKK2dkYl9wcmludF9pbnNuX3NoIChtZW1hZGRyLCBpbmZvKQorICAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIGlmIChUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQorICAgIHJldHVybiBwcmludF9pbnNuX3NoIChtZW1hZGRyLCBpbmZvKTsKKyAgZWxzZQorICAgIHJldHVybiBwcmludF9pbnNuX3NobCAobWVtYWRkciwgaW5mbyk7Cit9CisKKy8qIEdpdmVuIGEgR0RCIGZyYW1lLCBkZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24ncyBmcmFtZS4KKyAgIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBHREIgZnJhbWUgc3RydWN0LCBhbmQgdGhlbgorICAgSU5JVF9FWFRSQV9GUkFNRV9JTkZPIGFuZCBJTklUX0ZSQU1FX1BDIHdpbGwgYmUgY2FsbGVkIGZvciB0aGUgbmV3IGZyYW1lLgorCisgICBGb3IgdXMsIHRoZSBmcmFtZSBhZGRyZXNzIGlzIGl0cyBzdGFjayBwb2ludGVyIHZhbHVlLCBzbyB3ZSBsb29rIHVwCisgICB0aGUgZnVuY3Rpb24gcHJvbG9ndWUgdG8gZGV0ZXJtaW5lIHRoZSBjYWxsZXIncyBzcCB2YWx1ZSwgYW5kIHJldHVybiBpdC4gICovCisKK0NPUkVfQUREUgorc2hfZnJhbWVfY2hhaW4gKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIGlmIChQQ19JTl9DQUxMX0RVTU1ZIChmcmFtZS0+cGMsIGZyYW1lLT5mcmFtZSwgZnJhbWUtPmZyYW1lKSkKKyAgICByZXR1cm4gZnJhbWUtPmZyYW1lOwkvKiBkdW1teSBmcmFtZSBzYW1lIGFzIGNhbGxlcidzIGZyYW1lICovCisgIGlmICghaW5zaWRlX2VudHJ5X2ZpbGUgKGZyYW1lLT5wYykpCisgICAgcmV0dXJuIHJlYWRfbWVtb3J5X2ludGVnZXIgKEZSQU1FX0ZQIChmcmFtZSkgKyBmcmFtZS0+Zl9vZmZzZXQsIDQpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEZpbmQgUkVHTlVNIG9uIHRoZSBzdGFjay4gIE90aGVyd2lzZSwgaXQncyBpbiBhbiBhY3RpdmUgcmVnaXN0ZXIuICBPbmUgdGhpbmcKKyAgIHdlIG1pZ2h0IHdhbnQgdG8gZG8gaGVyZSBpcyB0byBjaGVjayBSRUdOVU0gYWdhaW5zdCB0aGUgY2xvYmJlciBtYXNrLCBhbmQKKyAgIHNvbWVob3cgZmxhZyBpdCBhcyBpbnZhbGlkIGlmIGl0IGlzbid0IHNhdmVkIG9uIHRoZSBzdGFjayBzb21ld2hlcmUuICBUaGlzCisgICB3b3VsZCBwcm92aWRlIGEgZ3JhY2VmdWwgZmFpbHVyZSBtb2RlIHdoZW4gdHJ5aW5nIHRvIGdldCB0aGUgdmFsdWUgb2YKKyAgIGNhbGxlci1zYXZlcyByZWdpc3RlcnMgZm9yIGFuIGlubmVyIGZyYW1lLiAgKi8KKworQ09SRV9BRERSCitzaF9maW5kX2NhbGxlcnNfcmVnIChmaSwgcmVnbnVtKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7CisgICAgIGludCByZWdudW07Cit7CisgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzIGZzcjsKKworICBmb3IgKDsgZmk7IGZpID0gZmktPm5leHQpCisgICAgaWYgKFBDX0lOX0NBTExfRFVNTVkgKGZpLT5wYywgZmktPmZyYW1lLCBmaS0+ZnJhbWUpKQorICAgICAgLyogV2hlbiB0aGUgY2FsbGVyIHJlcXVlc3RzIFBSIGZyb20gdGhlIGR1bW15IGZyYW1lLCB3ZSByZXR1cm4gUEMgYmVjYXVzZQorCSB0aGF0J3Mgd2hlcmUgdGhlIHByZXZpb3VzIHJvdXRpbmUgYXBwZWFycyB0byBoYXZlIGRvbmUgYSBjYWxsIGZyb20uICovCisgICAgICByZXR1cm4gZ2VuZXJpY19yZWFkX3JlZ2lzdGVyX2R1bW15IChmaS0+cGMsIGZpLT5mcmFtZSwgcmVnbnVtKTsKKyAgICBlbHNlIAorICAgICAgeworCUZSQU1FX0ZJTkRfU0FWRURfUkVHUyhmaSwgZnNyKTsKKwlpZiAoZnNyLnJlZ3NbcmVnbnVtXSAhPSAwKQorCSAgcmV0dXJuIHJlYWRfbWVtb3J5X2ludGVnZXIgKGZzci5yZWdzW3JlZ251bV0sIAorCQkJCSAgICAgIFJFR0lTVEVSX1JBV19TSVpFKHJlZ251bSkpOworICAgICAgfQorICByZXR1cm4gcmVhZF9yZWdpc3RlciAocmVnbnVtKTsKK30KKworLyogUHV0IGhlcmUgdGhlIGNvZGUgdG8gc3RvcmUsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywgdGhlCisgICBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4KKyAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbAorICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDogdGhlIGFkZHJlc3Mgd2UKKyAgIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4gKi8KKwordm9pZAorc2hfZnJhbWVfZmluZF9zYXZlZF9yZWdzIChmaSwgZnNyKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7CisgICAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICpmc3I7Cit7CisgIGludCB3aGVyZVtOVU1fUkVHU107CisgIGludCBybjsKKyAgaW50IGhhdmVfZnAgPSAwOworICBpbnQgZGVwdGg7CisgIGludCBwYzsKKyAgaW50IG9wYzsKKyAgaW50IGluc247CisgIGludCByM192YWwgPSAwOworICBjaGFyICogZHVtbXlfcmVncyA9IGdlbmVyaWNfZmluZF9kdW1teV9mcmFtZSAoZmktPnBjLCBmaS0+ZnJhbWUpOworCisgIGlmIChkdW1teV9yZWdzKQorICAgIHsKKyAgICAgIC8qIERBTkdFUiEgIFRoaXMgaXMgT05MWSBnb2luZyB0byB3b3JrIGlmIHRoZSBjaGFyIGJ1ZmZlciBmb3JtYXQgb2YKKwkgdGhlIHNhdmVkIHJlZ2lzdGVycyBpcyBieXRlLWZvci1ieXRlIGlkZW50aWNhbCB0byB0aGUgCisJIENPUkVfQUREUiByZWdzW05VTV9SRUdTXSBmb3JtYXQgdXNlZCBieSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyEgKi8KKyAgICAgIG1lbWNweSAoJmZzci0+cmVncywgZHVtbXlfcmVncywgc2l6ZW9mKGZzcikpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBvcGMgPSBwYyA9IGdldF9wY19mdW5jdGlvbl9zdGFydCAoZmktPnBjKTsKKworICBpbnNuID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDIpOworCisgIGZpLT5sZWFmX2Z1bmN0aW9uID0gMTsKKyAgZmktPmZfb2Zmc2V0ID0gMDsKKworICBmb3IgKHJuID0gMDsgcm4gPCBOVU1fUkVHUzsgcm4rKykKKyAgICB3aGVyZVtybl0gPSAtMTsKKworICBkZXB0aCA9IDA7CisKKyAgLyogTG9vcCBhcm91bmQgZXhhbWluaW5nIHRoZSBwcm9sb2d1ZSBpbnNucyB1bnRpbCB3ZSBmaW5kIHNvbWV0aGluZworICAgICB0aGF0IGRvZXMgbm90IGFwcGVhciB0byBiZSBwYXJ0IG9mIHRoZSBwcm9sb2d1ZS4gIEJ1dCBnaXZlIHVwCisgICAgIGFmdGVyIDIwIG9mIHRoZW0sIHNpbmNlIHdlJ3JlIGdldHRpbmcgc2lsbHkgdGhlbi4gKi8KKworICB3aGlsZSAocGMgPCBvcGMgKyAyMCAqIDIpCisgICAgeworICAgICAgLyogU2VlIHdoZXJlIHRoZSByZWdpc3RlcnMgd2lsbCBiZSBzYXZlZCB0byAqLworICAgICAgaWYgKElTX1BVU0ggKGluc24pKQorCXsKKwkgIHBjICs9IDI7CisJICBybiA9IEdFVF9QVVNIRURfUkVHIChpbnNuKTsKKwkgIHdoZXJlW3JuXSA9IGRlcHRoOworCSAgaW5zbiA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAyKTsKKwkgIGRlcHRoICs9IDQ7CisJfQorICAgICAgZWxzZSBpZiAoSVNfU1RTIChpbnNuKSkKKwl7CisJICBwYyArPSAyOworCSAgd2hlcmVbUFJfUkVHTlVNXSA9IGRlcHRoOworCSAgaW5zbiA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKHBjLCAyKTsKKwkgIC8qIElmIHdlJ3JlIHN0b3JpbmcgdGhlIHByIHRoZW4gdGhpcyBpc24ndCBhIGxlYWYgKi8KKwkgIGZpLT5sZWFmX2Z1bmN0aW9uID0gMDsKKwkgIGRlcHRoICs9IDQ7CisJfQorICAgICAgZWxzZSBpZiAoSVNfTU9WX1IzIChpbnNuKSkKKwl7CisJICByM192YWwgPSAoKGluc24gJiAweGZmKSBeIDB4ODApIC0gMHg4MDsKKwkgIHBjICs9IDI7CisJICBpbnNuID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDIpOworCX0KKyAgICAgIGVsc2UgaWYgKElTX1NITExfUjMgKGluc24pKQorCXsKKwkgIHIzX3ZhbCA8PD0gMTsKKwkgIHBjICs9IDI7CisJICBpbnNuID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDIpOworCX0KKyAgICAgIGVsc2UgaWYgKElTX0FERF9SM1NQIChpbnNuKSkKKwl7CisJICBkZXB0aCArPSAtcjNfdmFsOworCSAgcGMgKz0gMjsKKwkgIGluc24gPSByZWFkX21lbW9yeV9pbnRlZ2VyIChwYywgMik7CisJfQorICAgICAgZWxzZSBpZiAoSVNfQUREX1NQIChpbnNuKSkKKwl7CisJICBwYyArPSAyOworCSAgZGVwdGggLT0gKChpbnNuICYgMHhmZikgXiAweDgwKSAtIDB4ODA7CisJICBpbnNuID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDIpOworCX0KKyAgICAgIGVsc2UgaWYgKElTX0ZNT1YgKGluc24pKQorCXsKKwkgIHBjICs9IDI7CisJICBpbnNuID0gcmVhZF9tZW1vcnlfaW50ZWdlciAocGMsIDIpOworCSAgaWYgKHJlYWRfcmVnaXN0ZXIgKEZQU0NSX1JFR05VTSkgJiBGUFNDUl9TWikKKwkgICAgeworCSAgICAgIGRlcHRoICs9IDg7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGRlcHRoICs9IDQ7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJYnJlYWs7CisgICAgfQorCisgIC8qIE5vdyB3ZSBrbm93IGhvdyBkZWVwIHRoaW5ncyBhcmUsIHdlIGNhbiB3b3JrIG91dCB0aGVpciBhZGRyZXNzZXMgKi8KKworICBmb3IgKHJuID0gMDsgcm4gPCBOVU1fUkVHUzsgcm4rKykKKyAgICB7CisgICAgICBpZiAod2hlcmVbcm5dID49IDApCisJeworCSAgaWYgKHJuID09IEZQX1JFR05VTSkKKwkgICAgaGF2ZV9mcCA9IDE7CisKKwkgIGZzci0+cmVnc1tybl0gPSBmaS0+ZnJhbWUgLSB3aGVyZVtybl0gKyBkZXB0aCAtIDQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZzci0+cmVnc1tybl0gPSAwOworCX0KKyAgICB9CisKKyAgaWYgKGhhdmVfZnApCisgICAgeworICAgICAgZnNyLT5yZWdzW1NQX1JFR05VTV0gPSByZWFkX21lbW9yeV9pbnRlZ2VyIChmc3ItPnJlZ3NbRlBfUkVHTlVNXSwgNCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZnNyLT5yZWdzW1NQX1JFR05VTV0gPSBmaS0+ZnJhbWUgLSA0OworICAgIH0KKworICBmaS0+Zl9vZmZzZXQgPSBkZXB0aCAtIHdoZXJlW0ZQX1JFR05VTV0gLSA0OworICAvKiBXb3JrIG91dCB0aGUgcmV0dXJuIHBjIC0gZWl0aGVyIGZyb20gdGhlIHNhdmVkIHByIG9yIHRoZSBwcgorICAgICB2YWx1ZSAqLworfQorCisvKiBpbml0aWFsaXplIHRoZSBleHRyYSBpbmZvIHNhdmVkIGluIGEgRlJBTUUgKi8KKwordm9pZAorc2hfaW5pdF9leHRyYV9mcmFtZV9pbmZvIChmcm9tbGVhZiwgZmkpCisgICAgIGludCBmcm9tbGVhZjsKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworeworICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyBmc3I7CisKKyAgaWYgKGZpLT5uZXh0KQorICAgIGZpLT5wYyA9IEZSQU1FX1NBVkVEX1BDIChmaS0+bmV4dCk7CisKKyAgaWYgKFBDX0lOX0NBTExfRFVNTVkgKGZpLT5wYywgZmktPmZyYW1lLCBmaS0+ZnJhbWUpKQorICAgIHsKKyAgICAgIC8qIFdlIG5lZWQgdG8gc2V0dXAgZmktPmZyYW1lIGhlcmUgYmVjYXVzZSBydW5fc3RhY2tfZHVtbXkgZ2V0cyBpdCB3cm9uZworCSBieSBhc3N1bWluZyBpdCdzIGFsd2F5cyBGUC4gICovCisgICAgICBmaS0+ZnJhbWUgICAgID0gZ2VuZXJpY19yZWFkX3JlZ2lzdGVyX2R1bW15IChmaS0+cGMsIGZpLT5mcmFtZSwgCisJCQkJCQkgICBTUF9SRUdOVU0pOworICAgICAgZmktPnJldHVybl9wYyA9IGdlbmVyaWNfcmVhZF9yZWdpc3Rlcl9kdW1teSAoZmktPnBjLCBmaS0+ZnJhbWUsIAorCQkJCQkJICAgUENfUkVHTlVNKTsKKyAgICAgIGZpLT5mX29mZnNldCA9IC0oQ0FMTF9EVU1NWV9MRU5HVEggKyA0KTsKKyAgICAgIGZpLT5sZWFmX2Z1bmN0aW9uID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBGUkFNRV9GSU5EX1NBVkVEX1JFR1MgKGZpLCBmc3IpOworICAgICAgZmktPnJldHVybl9wYyA9IHNoX2ZpbmRfY2FsbGVyc19yZWcgKGZpLCBQUl9SRUdOVU0pOworICAgIH0KK30KKworLyogRGlzY2FyZCBmcm9tIHRoZSBzdGFjayB0aGUgaW5uZXJtb3N0IGZyYW1lLAorICAgcmVzdG9yaW5nIGFsbCBzYXZlZCByZWdpc3RlcnMuICAqLworCit2b2lkCitzaF9wb3BfZnJhbWUgKCkKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lID0gZ2V0X2N1cnJlbnRfZnJhbWUgKCk7CisgIHJlZ2lzdGVyIENPUkVfQUREUiBmcDsKKyAgcmVnaXN0ZXIgaW50IHJlZ251bTsKKyAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgZnNyOworCisgIGlmIChQQ19JTl9DQUxMX0RVTU1ZIChmcmFtZS0+cGMsIGZyYW1lLT5mcmFtZSwgZnJhbWUtPmZyYW1lKSkKKyAgICBnZW5lcmljX3BvcF9kdW1teV9mcmFtZSAoKTsKKyAgZWxzZQorICB7CisgICAgZnAgPSBGUkFNRV9GUCAoZnJhbWUpOworICAgIGdldF9mcmFtZV9zYXZlZF9yZWdzIChmcmFtZSwgJmZzcik7CisKKyAgICAvKiBDb3B5IHJlZ3MgZnJvbSB3aGVyZSB0aGV5IHdlcmUgc2F2ZWQgaW4gdGhlIGZyYW1lICovCisgICAgZm9yIChyZWdudW0gPSAwOyByZWdudW0gPCBOVU1fUkVHUzsgcmVnbnVtKyspCisgICAgICBpZiAoZnNyLnJlZ3NbcmVnbnVtXSkKKwl3cml0ZV9yZWdpc3RlciAocmVnbnVtLCByZWFkX21lbW9yeV9pbnRlZ2VyIChmc3IucmVnc1tyZWdudW1dLCA0KSk7CisKKyAgICB3cml0ZV9yZWdpc3RlciAoUENfUkVHTlVNLCBmcmFtZS0+cmV0dXJuX3BjKTsKKyAgICB3cml0ZV9yZWdpc3RlciAoU1BfUkVHTlVNLCBmcCArIDQpOworICB9CisgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7Cit9CisKKy8qIEZ1bmN0aW9uOiBwdXNoX2FyZ3VtZW50cworICAgU2V0dXAgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBmb3IgY2FsbGluZyBhIGZ1bmN0aW9uIGluIHRoZSBpbmZlcmlvci4KKworICAgT24gdGhlIEhpdGFjaGkgU0ggYXJjaGl0ZWN0dXJlLCB0aGVyZSBhcmUgZm91ciByZWdpc3RlcnMgKFI0IHRvIFI3KQorICAgd2hpY2ggYXJlIGRlZGljYXRlZCBmb3IgcGFzc2luZyBmdW5jdGlvbiBhcmd1bWVudHMuICBVcCB0byB0aGUgZmlyc3QKKyAgIGZvdXIgYXJndW1lbnRzIChkZXBlbmRpbmcgb24gc2l6ZSkgbWF5IGdvIGludG8gdGhlc2UgcmVnaXN0ZXJzLgorICAgVGhlIHJlc3QgZ28gb24gdGhlIHN0YWNrLgorCisgICBBcmd1bWVudHMgdGhhdCBhcmUgc21hbGxlciB0aGFuIDQgYnl0ZXMgd2lsbCBzdGlsbCB0YWtlIHVwIGEgd2hvbGUKKyAgIHJlZ2lzdGVyIG9yIGEgd2hvbGUgMzItYml0IHdvcmQgb24gdGhlIHN0YWNrLCBhbmQgd2lsbCBiZSAKKyAgIHJpZ2h0LWp1c3RpZmllZCBpbiB0aGUgcmVnaXN0ZXIgb3IgdGhlIHN0YWNrIHdvcmQuICBUaGlzIGluY2x1ZGVzCisgICBjaGFycywgc2hvcnRzLCBhbmQgc21hbGwgYWdncmVnYXRlIHR5cGVzLgorCisgICBBcmd1bWVudHMgdGhhdCBhcmUgbGFyZ2VyIHRoYW4gNCBieXRlcyBtYXkgYmUgc3BsaXQgYmV0d2VlbiB0d28gb3IgCisgICBtb3JlIHJlZ2lzdGVycy4gIElmIHRoZXJlIGFyZSBub3QgZW5vdWdoIHJlZ2lzdGVycyBmcmVlLCBhbiBhcmd1bWVudAorICAgbWF5IGJlIHBhc3NlZCBwYXJ0bHkgaW4gYSByZWdpc3RlciAob3IgcmVnaXN0ZXJzKSwgYW5kIHBhcnRseSBvbiB0aGUKKyAgIHN0YWNrLiAgVGhpcyBpbmNsdWRlcyBkb3VibGVzLCBsb25nIGxvbmdzLCBhbmQgbGFyZ2VyIGFnZ3JlZ2F0ZXMuIAorICAgQXMgZmFyIGFzIEkga25vdywgdGhlcmUgaXMgbm8gdXBwZXIgbGltaXQgdG8gdGhlIHNpemUgb2YgYWdncmVnYXRlcyAKKyAgIHRoYXQgd2lsbCBiZSBwYXNzZWQgaW4gdGhpcyB3YXk7IGluIG90aGVyIHdvcmRzLCB0aGUgY29udmVudGlvbiBvZiAKKyAgIHBhc3NpbmcgYSBwb2ludGVyIHRvIGEgbGFyZ2UgYWdncmVnYXRlIGluc3RlYWQgb2YgYSBjb3B5IGlzIG5vdCB1c2VkLgorCisgICBBbiBleGNlcHRpb25hbCBjYXNlIGV4aXN0cyBmb3Igc3RydWN0IGFyZ3VtZW50cyAoYW5kIHBvc3NpYmx5IG90aGVyCisgICBhZ2dyZWdhdGVzIHN1Y2ggYXMgYXJyYXlzKSBpZiB0aGUgc2l6ZSBpcyBsYXJnZXIgdGhhbiA0IGJ5dGVzIGJ1dCAKKyAgIG5vdCBhIG11bHRpcGxlIG9mIDQgYnl0ZXMuICBJbiB0aGlzIGNhc2UgdGhlIGFyZ3VtZW50IGlzIG5ldmVyIHNwbGl0IAorICAgYmV0d2VlbiB0aGUgcmVnaXN0ZXJzIGFuZCB0aGUgc3RhY2ssIGJ1dCBpbnN0ZWFkIGlzIGNvcGllZCBpbiBpdHMKKyAgIGVudGlyZXR5IG9udG8gdGhlIHN0YWNrLCBBTkQgYWxzbyBjb3BpZWQgaW50byBhcyBtYW55IHJlZ2lzdGVycyBhcyAKKyAgIHRoZXJlIGlzIHJvb20gZm9yLiAgSW4gb3RoZXIgd29yZHMsIHNwYWNlIGluIHJlZ2lzdGVycyBwZXJtaXR0aW5nLCAKKyAgIHR3byBjb3BpZXMgb2YgdGhlIHNhbWUgYXJndW1lbnQgYXJlIHBhc3NlZCBpbi4gIEFzIGZhciBhcyBJIGNhbiB0ZWxsLAorICAgb25seSB0aGUgb25lIG9uIHRoZSBzdGFjayBpcyB1c2VkLCBhbHRob3VnaCB0aGF0IG1heSBiZSBhIGZ1bmN0aW9uIAorICAgb2YgdGhlIGxldmVsIG9mIGNvbXBpbGVyIG9wdGltaXphdGlvbi4gIEkgc3VzcGVjdCB0aGlzIGlzIGEgY29tcGlsZXIKKyAgIGJ1Zy4gIEFyZ3VtZW50cyBvZiB0aGVzZSBvZGQgc2l6ZXMgYXJlIGxlZnQtanVzdGlmaWVkIHdpdGhpbiB0aGUgCisgICB3b3JkIChhcyBvcHBvc2VkIHRvIGFyZ3VtZW50cyBzbWFsbGVyIHRoYW4gNCBieXRlcywgd2hpY2ggYXJlIAorICAgcmlnaHQtanVzdGlmaWVkKS4KKyAKKworICAgSWYgdGhlIGZ1bmN0aW9uIGlzIHRvIHJldHVybiBhbiBhZ2dyZWdhdGUgdHlwZSBzdWNoIGFzIGEgc3RydWN0LCBpdCAKKyAgIGlzIGVpdGhlciByZXR1cm5lZCBpbiB0aGUgbm9ybWFsIHJldHVybiB2YWx1ZSByZWdpc3RlciBSMCAoaWYgaXRzIAorICAgc2l6ZSBpcyBubyBncmVhdGVyIHRoYW4gb25lIGJ5dGUpLCBvciBlbHNlIHRoZSBjYWxsZXIgbXVzdCBhbGxvY2F0ZQorICAgc3BhY2UgaW50byB3aGljaCB0aGUgY2FsbGVlIHdpbGwgY29weSB0aGUgcmV0dXJuIHZhbHVlIChpZiB0aGUgc2l6ZQorICAgaXMgZ3JlYXRlciB0aGFuIG9uZSBieXRlKS4gIEluIHRoaXMgY2FzZSwgYSBwb2ludGVyIHRvIHRoZSByZXR1cm4gCisgICB2YWx1ZSBsb2NhdGlvbiBpcyBwYXNzZWQgaW50byB0aGUgY2FsbGVlIGluIHJlZ2lzdGVyIFIyLCB3aGljaCBkb2VzIAorICAgbm90IGRpc3BsYWNlIGFueSBvZiB0aGUgb3RoZXIgYXJndW1lbnRzIHBhc3NlZCBpbiB2aWEgcmVnaXN0ZXJzIFI0CisgICB0byBSNy4gICAqLworCitDT1JFX0FERFIKK3NoX3B1c2hfYXJndW1lbnRzIChuYXJncywgYXJncywgc3AsIHN0cnVjdF9yZXR1cm4sIHN0cnVjdF9hZGRyKQorICAgICBpbnQgbmFyZ3M7CisgICAgIHZhbHVlX3B0ciAqYXJnczsKKyAgICAgQ09SRV9BRERSIHNwOworICAgICB1bnNpZ25lZCBjaGFyIHN0cnVjdF9yZXR1cm47CisgICAgIENPUkVfQUREUiBzdHJ1Y3RfYWRkcjsKK3sKKyAgaW50IHN0YWNrX29mZnNldCwgc3RhY2tfYWxsb2M7CisgIGludCBhcmdyZWc7CisgIGludCBhcmdudW07CisgIHN0cnVjdCB0eXBlICp0eXBlOworICBDT1JFX0FERFIgcmVndmFsOworICBjaGFyICp2YWw7CisgIGNoYXIgdmFsYnVmWzRdOworICBpbnQgbGVuOworICBpbnQgb2RkX3NpemVkX3N0cnVjdDsKKworICAvKiBmaXJzdCBmb3JjZSBzcCB0byBhIDQtYnl0ZSBhbGlnbm1lbnQgKi8KKyAgc3AgPSBzcCAmIH4zOworCisgIC8qIFRoZSAic3RydWN0IHJldHVybiBwb2ludGVyIiBwc2V1ZG8tYXJndW1lbnQgaGFzIGl0cyBvd24gZGVkaWNhdGVkIAorICAgICByZWdpc3RlciAqLworICBpZiAoc3RydWN0X3JldHVybikKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChTVFJVQ1RfUkVUVVJOX1JFR05VTSwgc3RydWN0X2FkZHIpOworCisgIC8qIE5vdyBtYWtlIHN1cmUgdGhlcmUncyBzcGFjZSBvbiB0aGUgc3RhY2sgKi8KKyAgZm9yIChhcmdudW0gPSAwLCBzdGFja19hbGxvYyA9IDA7CisgICAgICAgYXJnbnVtIDwgbmFyZ3M7IGFyZ251bSsrKQorICAgIHN0YWNrX2FsbG9jICs9ICgoVFlQRV9MRU5HVEgoVkFMVUVfVFlQRShhcmdzW2FyZ251bV0pKSArIDMpICYgfjMpOworICBzcCAtPSBzdGFja19hbGxvYzsgICAgLyogbWFrZSByb29tIG9uIHN0YWNrIGZvciBhcmdzICovCisKKworICAvKiBOb3cgbG9hZCBhcyBtYW55IGFzIHBvc3NpYmxlIG9mIHRoZSBmaXJzdCBhcmd1bWVudHMgaW50bworICAgICByZWdpc3RlcnMsIGFuZCBwdXNoIHRoZSByZXN0IG9udG8gdGhlIHN0YWNrLiAgVGhlcmUgYXJlIDE2IGJ5dGVzCisgICAgIGluIGZvdXIgcmVnaXN0ZXJzIGF2YWlsYWJsZS4gIExvb3AgdGhydSBhcmdzIGZyb20gZmlyc3QgdG8gbGFzdC4gICovCisKKyAgYXJncmVnID0gQVJHMF9SRUdOVU07CisgIGZvciAoYXJnbnVtID0gMCwgc3RhY2tfb2Zmc2V0ID0gMDsgYXJnbnVtIDwgbmFyZ3M7IGFyZ251bSsrKQorICAgIHsKKyAgICAgIHR5cGUgPSBWQUxVRV9UWVBFIChhcmdzW2FyZ251bV0pOworICAgICAgbGVuICA9IFRZUEVfTEVOR1RIICh0eXBlKTsKKyAgICAgIG1lbXNldCh2YWxidWYsIDAsIHNpemVvZih2YWxidWYpKTsKKyAgICAgIGlmIChsZW4gPCA0KQorICAgICAgICB7IC8qIHZhbHVlIGdldHMgcmlnaHQtanVzdGlmaWVkIGluIHRoZSByZWdpc3RlciBvciBzdGFjayB3b3JkICovCisgICAgICAgICAgbWVtY3B5KHZhbGJ1ZiArICg0IC0gbGVuKSwgCisJCSAoY2hhciAqKSBWQUxVRV9DT05URU5UUyAoYXJnc1thcmdudW1dKSwgbGVuKTsKKyAgICAgICAgICB2YWwgPSB2YWxidWY7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgdmFsID0gKGNoYXIgKikgVkFMVUVfQ09OVEVOVFMgKGFyZ3NbYXJnbnVtXSk7CisKKyAgICAgIGlmIChsZW4gPiA0ICYmIChsZW4gJiAzKSAhPSAwKQorCW9kZF9zaXplZF9zdHJ1Y3QgPSAxOwkJLyogc3VjaCBzdHJ1Y3RzIGdvIGVudGlyZWx5IG9uIHN0YWNrICovCisgICAgICBlbHNlIAorCW9kZF9zaXplZF9zdHJ1Y3QgPSAwOworICAgICAgd2hpbGUgKGxlbiA+IDApCisJeworCSAgaWYgKGFyZ3JlZyA+IEFSR0xBU1RfUkVHTlVNIHx8IG9kZF9zaXplZF9zdHJ1Y3QpCisJICAgIHsJCQkJLyogbXVzdCBnbyBvbiB0aGUgc3RhY2sgKi8KKwkgICAgICB3cml0ZV9tZW1vcnkgKHNwICsgc3RhY2tfb2Zmc2V0LCB2YWwsIDQpOworCSAgICAgIHN0YWNrX29mZnNldCArPSA0OworCSAgICB9CisJICAvKiBOT1RFIFdFTEwhISEhISAgVGhpcyBpcyBub3QgYW4gImVsc2UgaWYiIGNsYXVzZSEhIQorCSAgICAgVGhhdCdzIGJlY2F1c2Ugc29tZSAqJl4lJCB0aGluZ3MgZ2V0IHBhc3NlZCBvbiB0aGUgc3RhY2sKKwkgICAgIEFORCBpbiB0aGUgcmVnaXN0ZXJzISAgICovCisJICBpZiAoYXJncmVnIDw9IEFSR0xBU1RfUkVHTlVNKQorCSAgICB7CQkJCS8qIHRoZXJlJ3Mgcm9vbSBpbiBhIHJlZ2lzdGVyICovCisJICAgICAgcmVndmFsID0gZXh0cmFjdF9hZGRyZXNzICh2YWwsIFJFR0lTVEVSX1JBV19TSVpFKGFyZ3JlZykpOworCSAgICAgIHdyaXRlX3JlZ2lzdGVyIChhcmdyZWcrKywgcmVndmFsKTsKKwkgICAgfQorCSAgLyogU3RvcmUgdGhlIHZhbHVlIDQgYnl0ZXMgYXQgYSB0aW1lLiAgVGhpcyBtZWFucyB0aGF0IHRoaW5ncworCSAgICAgbGFyZ2VyIHRoYW4gNCBieXRlcyBtYXkgZ28gcGFydGx5IGluIHJlZ2lzdGVycyBhbmQgcGFydGx5CisJICAgICBvbiB0aGUgc3RhY2suICAqLworCSAgbGVuIC09IFJFR0lTVEVSX1JBV19TSVpFKGFyZ3JlZyk7CisJICB2YWwgKz0gUkVHSVNURVJfUkFXX1NJWkUoYXJncmVnKTsKKwl9CisgICAgfQorICByZXR1cm4gc3A7Cit9CisKKy8qIEZ1bmN0aW9uOiBwdXNoX3JldHVybl9hZGRyZXNzIChwYykKKyAgIFNldCB1cCB0aGUgcmV0dXJuIGFkZHJlc3MgZm9yIHRoZSBpbmZlcmlvciBmdW5jdGlvbiBjYWxsLgorICAgTmVlZGVkIGZvciB0YXJnZXRzIHdoZXJlIHdlIGRvbid0IGFjdHVhbGx5IGV4ZWN1dGUgYSBKU1IvQlNSIGluc3RydWN0aW9uICovCisKK0NPUkVfQUREUgorc2hfcHVzaF9yZXR1cm5fYWRkcmVzcyAocGMsIHNwKQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIENPUkVfQUREUiBzcDsKK3sKKyAgd3JpdGVfcmVnaXN0ZXIgKFBSX1JFR05VTSwgQ0FMTF9EVU1NWV9BRERSRVNTICgpKTsKKyAgcmV0dXJuIHNwOworfQorCisvKiBGdW5jdGlvbjogZml4X2NhbGxfZHVtbXkKKyAgIFBva2UgdGhlIGNhbGxlZSBmdW5jdGlvbidzIGFkZHJlc3MgaW50byB0aGUgZGVzdGluYXRpb24gcGFydCBvZiAKKyAgIHRoZSBDQUxMX0RVTU1ZLiAgVGhlIGFkZHJlc3MgaXMgYWN0dWFsbHkgc3RvcmVkIGluIGEgZGF0YSB3b3JkIAorICAgZm9sbG93aW5nIHRoZSBhY3R1YWx5IENBTExfRFVNTVkgaW5zdHJ1Y3Rpb25zLCB3aGljaCB3aWxsIGxvYWQKKyAgIGl0IGludG8gYSByZWdpc3RlciB1c2luZyBQQy1yZWxhdGl2ZSBhZGRyZXNzaW5nLiAgVGhpcyBmdW5jdGlvbgorICAgZXhwZWN0cyB0aGUgQ0FMTF9EVU1NWSB0byBsb29rIGxpa2UgdGhpczoKKworICAgICAgICBtb3YudyBAKDIsUEMpLCBSOAorICAgICAgICBqc3IgICBAUjgKKyAgICAgICAgbm9wCisgICAgICAgIHRyYXAKKyAgICAgICAgPGRlc3RpbmF0aW9uPgorICAqLworCisjaWYgMAordm9pZAorc2hfZml4X2NhbGxfZHVtbXkgKGR1bW15LCBwYywgZnVuLCBuYXJncywgYXJncywgdHlwZSwgZ2NjX3ApCisgICAgIGNoYXIgKmR1bW15OworICAgICBDT1JFX0FERFIgcGM7CisgICAgIENPUkVfQUREUiBmdW47CisgICAgIGludCBuYXJnczsKKyAgICAgdmFsdWVfcHRyICphcmdzOworICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgaW50IGdjY19wOworeworICAqKHVuc2lnbmVkIGxvbmcgKikgKGR1bW15ICsgOCkgPSBmdW47Cit9CisjZW5kaWYKKworLyogRnVuY3Rpb246IGdldF9zYXZlZF9yZWdpc3RlcgorICAgSnVzdCBjYWxsIHRoZSBnZW5lcmljX2dldF9zYXZlZF9yZWdpc3RlciBmdW5jdGlvbi4gICovCisKK3ZvaWQKK2dldF9zYXZlZF9yZWdpc3RlciAocmF3X2J1ZmZlciwgb3B0aW1pemVkLCBhZGRycCwgZnJhbWUsIHJlZ251bSwgbHZhbCkKKyAgICAgY2hhciAqcmF3X2J1ZmZlcjsKKyAgICAgaW50ICpvcHRpbWl6ZWQ7CisgICAgIENPUkVfQUREUiAqYWRkcnA7CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKKyAgICAgaW50IHJlZ251bTsKKyAgICAgZW51bSBsdmFsX3R5cGUgKmx2YWw7Cit7CisgIGdlbmVyaWNfZ2V0X3NhdmVkX3JlZ2lzdGVyIChyYXdfYnVmZmVyLCBvcHRpbWl6ZWQsIGFkZHJwLCAKKwkJCSAgICAgIGZyYW1lLCByZWdudW0sIGx2YWwpOworfQorCisKKy8qIE1vZGlmeSB0aGUgYWN0dWFsIHByb2Nlc3NvciB0eXBlLiAqLworCitpbnQKK3NoX3RhcmdldF9hcmNoaXRlY3R1cmVfaG9vayAoYXApCisgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXA7Cit7CisgIGludCBpLCBqOworCisgIGlmIChhcC0+YXJjaCAhPSBiZmRfYXJjaF9zaCkKKyAgICByZXR1cm4gMDsKKworICBmb3IgKGkgPSAwOyBzaF9wcm9jZXNzb3JfdHlwZV90YWJsZVtpXS5yZWduYW1lcyAhPSBOVUxMOyBpKyspCisgICAgeworICAgICAgaWYgKHNoX3Byb2Nlc3Nvcl90eXBlX3RhYmxlW2ldLm1hY2ggPT0gYXAtPm1hY2gpCisJeworCSAgc2hfcmVnaXN0ZXJfbmFtZXMgPSBzaF9wcm9jZXNzb3JfdHlwZV90YWJsZVtpXS5yZWduYW1lczsKKwkgIHJldHVybiAxOworCX0KKyAgICB9CisKKyAgZmF0YWwgKCJBcmNoaXRlY3R1cmUgYCVzJyB1bnJlY29uaXplZCIsIGFwLT5wcmludGFibGVfbmFtZSk7Cit9CisKKy8qIFByaW50IHRoZSByZWdpc3RlcnMgaW4gYSBmb3JtIHNpbWlsYXIgdG8gdGhlIEU3MDAwICovCisKK3N0YXRpYyB2b2lkCitzaF9zaG93X3JlZ3MgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGludCBjcHU7CisgIGlmIChUQVJHRVRfQVJDSElURUNUVVJFLT5hcmNoID09IGJmZF9hcmNoX3NoKQorICAgIGNwdSA9IFRBUkdFVF9BUkNISVRFQ1RVUkUtPm1hY2g7CisgIGVsc2UKKyAgICBjcHUgPSAwOworCisgIHByaW50Zl9maWx0ZXJlZCAoIlBDPSUwOHggU1I9JTA4eCBQUj0lMDh4IE1BQ0g9JTA4eCBNQUNITD0lMDh4XG4iLAorCQkgICByZWFkX3JlZ2lzdGVyIChQQ19SRUdOVU0pLAorCQkgICByZWFkX3JlZ2lzdGVyIChTUl9SRUdOVU0pLAorCQkgICByZWFkX3JlZ2lzdGVyIChQUl9SRUdOVU0pLAorCQkgICByZWFkX3JlZ2lzdGVyIChNQUNIX1JFR05VTSksCisJCSAgIHJlYWRfcmVnaXN0ZXIgKE1BQ0xfUkVHTlVNKSk7CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiR0JSPSUwOHggVkJSPSUwOHgiLAorICAgICAgICAgICAgICAgICAgIHJlYWRfcmVnaXN0ZXIgKEdCUl9SRUdOVU0pLAorICAgICAgICAgICAgICAgICAgIHJlYWRfcmVnaXN0ZXIgKFZCUl9SRUdOVU0pKTsKKyAgaWYgKGNwdSA9PSBiZmRfbWFjaF9zaDMgfHwgY3B1ID09IGJmZF9tYWNoX3NoM2UpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiIFNTUj0lMDh4IFNQQz0lMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoU1NSX1JFR05VTSksCisgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfcmVnaXN0ZXIgKFNQQ19SRUdOVU0pKTsKKyAgICAgIGlmIChjcHUgPT0gYmZkX21hY2hfc2gzZSkKKyAgICAgICAgeworICAgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiBGUFVMPSUwOHggRlBTQ1I9JTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3JlZ2lzdGVyIChGUFVMX1JFR05VTSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3JlZ2lzdGVyIChGUFNDUl9SRUdOVU0pKTsKKyAgICAgICAgfQorICAgIH0KKworICBwcmludGZfZmlsdGVyZWQgKCJcblIwLVI3ICAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCisJCSAgIHJlYWRfcmVnaXN0ZXIgKDApLAorCQkgICByZWFkX3JlZ2lzdGVyICgxKSwKKwkJICAgcmVhZF9yZWdpc3RlciAoMiksCisJCSAgIHJlYWRfcmVnaXN0ZXIgKDMpLAorCQkgICByZWFkX3JlZ2lzdGVyICg0KSwKKwkJICAgcmVhZF9yZWdpc3RlciAoNSksCisJCSAgIHJlYWRfcmVnaXN0ZXIgKDYpLAorCQkgICByZWFkX3JlZ2lzdGVyICg3KSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIlI4LVIxNSAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCisJCSAgIHJlYWRfcmVnaXN0ZXIgKDgpLAorCQkgICByZWFkX3JlZ2lzdGVyICg5KSwKKwkJICAgcmVhZF9yZWdpc3RlciAoMTApLAorCQkgICByZWFkX3JlZ2lzdGVyICgxMSksCisJCSAgIHJlYWRfcmVnaXN0ZXIgKDEyKSwKKwkJICAgcmVhZF9yZWdpc3RlciAoMTMpLAorCQkgICByZWFkX3JlZ2lzdGVyICgxNCksCisJCSAgIHJlYWRfcmVnaXN0ZXIgKDE1KSk7CisgIGlmIChjcHUgPT0gYmZkX21hY2hfc2gzZSkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJGUDAtRlA3ICAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfcmVnaXN0ZXIgKEZQMF9SRUdOVU0gKyAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoRlAwX1JFR05VTSArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICByZWFkX3JlZ2lzdGVyIChGUDBfUkVHTlVNICsgMiksCisgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfcmVnaXN0ZXIgKEZQMF9SRUdOVU0gKyAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoRlAwX1JFR05VTSArIDQpLAorICAgICAgICAgICAgICAgICAgICAgICByZWFkX3JlZ2lzdGVyIChGUDBfUkVHTlVNICsgNSksCisgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfcmVnaXN0ZXIgKEZQMF9SRUdOVU0gKyA2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoRlAwX1JFR05VTSArIDcpKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkZQOC1GUDE1ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9yZWdpc3RlciAoRlAwX1JFR05VTSArIDgpLAorICAgICAgICAgICAgICAgICAgICAgICByZWFkX3JlZ2lzdGVyIChGUDBfUkVHTlVNICsgOSksCisgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfcmVnaXN0ZXIgKEZQMF9SRUdOVU0gKyAxMCksCisgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfcmVnaXN0ZXIgKEZQMF9SRUdOVU0gKyAxMSksCisgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfcmVnaXN0ZXIgKEZQMF9SRUdOVU0gKyAxMiksCisgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfcmVnaXN0ZXIgKEZQMF9SRUdOVU0gKyAxMyksCisgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfcmVnaXN0ZXIgKEZQMF9SRUdOVU0gKyAxNCksCisgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfcmVnaXN0ZXIgKEZQMF9SRUdOVU0gKyAxNSkpOworICAgIH0KK30KKworLyogRnVuY3Rpb246IGV4dHJhY3RfcmV0dXJuX3ZhbHVlCisgICBGaW5kIGEgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgaW4gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVycyAoaW4gcmVnYnVmKSwKKyAgIGFuZCBjb3B5IGl0IGludG8gdmFsYnVmLiAgKi8KKwordm9pZAorc2hfZXh0cmFjdF9yZXR1cm5fdmFsdWUgKHR5cGUsIHJlZ2J1ZiwgdmFsYnVmKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgdm9pZCAqcmVnYnVmOworICAgICB2b2lkICp2YWxidWY7Cit7CisgIGludCBsZW4gPSBUWVBFX0xFTkdUSCh0eXBlKTsKKworICBpZiAobGVuIDw9IDQpCisgICAgbWVtY3B5ICh2YWxidWYsICgoY2hhciAqKSByZWdidWYpICsgNCAtIGxlbiwgbGVuKTsKKyAgZWxzZSBpZiAobGVuIDw9IDgpCisgICAgbWVtY3B5ICh2YWxidWYsICgoY2hhciAqKSByZWdidWYpICsgOCAtIGxlbiwgbGVuKTsKKyAgZWxzZQorICAgIGVycm9yICgiYmFkIHNpemUgZm9yIHJldHVybiB2YWx1ZSIpOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9zaF90ZGVwICgpCit7CisgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjOworCisgIHRtX3ByaW50X2luc24gPSBnZGJfcHJpbnRfaW5zbl9zaDsKKworICB0YXJnZXRfYXJjaGl0ZWN0dXJlX2hvb2sgPSBzaF90YXJnZXRfYXJjaGl0ZWN0dXJlX2hvb2s7CisKKyAgYWRkX2NvbSAoInJlZ3MiLCBjbGFzc192YXJzLCBzaF9zaG93X3JlZ3MsICJQcmludCBhbGwgcmVnaXN0ZXJzIik7Cit9CmRpZmYgLS1naXQgYS9nZGIvc2gzLXJvbS5jIGIvZ2RiL3NoMy1yb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjRhYTY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3NoMy1yb20uYwpAQCAtMCwwICsxLDM5MiBAQAorLyogUmVtb3RlIHRhcmdldCBnbHVlIGZvciB0aGUgSGl0YWNoaSBTSC0zIFJPTSBtb25pdG9yLgorICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAibW9uaXRvci5oIgorI2luY2x1ZGUgInNlcmlhbC5oIgorI2luY2x1ZGUgInNyZWMuaCIKKworc3RhdGljIHNlcmlhbF90IHBhcmFsbGVsOworc3RhdGljIGludCBwYXJhbGxlbF9pbl91c2U7CisKK3N0YXRpYyB2b2lkIHNoM19vcGVuIFBBUkFNUyAoKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkpOworCitzdGF0aWMgdm9pZAorc2gzX3N1cHBseV9yZWdpc3RlciAocmVnbmFtZSwgcmVnbmFtZWxlbiwgdmFsLCB2YWxsZW4pCisgICAgIGNoYXIgKnJlZ25hbWU7CisgICAgIGludCByZWduYW1lbGVuOworICAgICBjaGFyICp2YWw7CisgICAgIGludCB2YWxsZW47Cit7CisgIGludCBudW1yZWdzOworICBpbnQgcmVnbm87CisKKyAgbnVtcmVncyA9IDE7CisgIHJlZ25vID0gLTE7CisKKyAgaWYgKHJlZ25hbWVsZW4gPT0gMikKKyAgICB7CisgICAgICBzd2l0Y2ggKHJlZ25hbWVbMF0pCisJeworCWNhc2UgJ1MnOgorCSAgaWYgKHJlZ25hbWVbMV0gPT0gJ1InKQorCSAgICByZWdubyA9IFNSX1JFR05VTTsKKwkgIGJyZWFrOworCWNhc2UgJ1AnOgorCSAgaWYgKHJlZ25hbWVbMV0gPT0gJ0MnKQorCSAgICByZWdubyA9IFBDX1JFR05VTTsKKwkgIGVsc2UgaWYgKHJlZ25hbWVbMV0gPT0gJ1InKQorCSAgICByZWdubyA9IFBSX1JFR05VTTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIGVsc2UgaWYgKHJlZ25hbWVsZW4gPT0gMykKKyAgICB7CisgICAgICBzd2l0Y2ggKHJlZ25hbWVbMF0pCisJeworCWNhc2UgJ0cnOgorCWNhc2UgJ1YnOgorCSAgaWYgKHJlZ25hbWVbMV0gPT0gJ0InICYmIHJlZ25hbWVbMl0gPT0gJ1InKQorCSAgICBpZiAocmVnbmFtZVswXSA9PSAnRycpCisJICAgICAgcmVnbm8gPSBWQlJfUkVHTlVNOworCSAgICBlbHNlCisJICAgICAgcmVnbm8gPSBHQlJfUkVHTlVNOworCSAgYnJlYWs7CisJY2FzZSAnUyc6CisJICBpZiAocmVnbmFtZVsxXSA9PSAnUycgJiYgcmVnbmFtZVsyXSA9PSAnUicpCisJICAgIHJlZ25vID0gU1NSX1JFR05VTTsKKwkgIGVsc2UgaWYgKHJlZ25hbWVbMV0gPT0gJ1AnICYmIHJlZ25hbWVbMl0gPT0gJ0MnKQorCSAgICByZWdubyA9IFNQQ19SRUdOVU07CisJICBicmVhazsKKwl9CisgICAgfQorICBlbHNlIGlmIChyZWduYW1lbGVuID09IDQpCisgICAgeworICAgICAgc3dpdGNoIChyZWduYW1lWzBdKQorCXsKKwljYXNlICdNJzoKKwkgIGlmIChyZWduYW1lWzFdID09ICdBJyAmJiByZWduYW1lWzJdID09ICdDJykKKwkgICAgaWYgKHJlZ25hbWVbM10gPT0gJ0gnKQorCSAgICAgIHJlZ25vID0gTUFDSF9SRUdOVU07CisJICAgIGVsc2UgaWYgKHJlZ25hbWVbM10gPT0gJ0wnKQorCSAgICAgIHJlZ25vID0gTUFDTF9SRUdOVU07CisJICBicmVhazsKKwljYXNlICdSJzoKKwkgIGlmIChyZWduYW1lWzFdID09ICcwJyAmJiByZWduYW1lWzJdID09ICctJyAmJiByZWduYW1lWzNdID09ICc3JykKKwkgICAgeworCSAgICAgIHJlZ25vID0gUjBfUkVHTlVNOworCSAgICAgIG51bXJlZ3MgPSA4OworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZSBpZiAocmVnbmFtZWxlbiA9PSA1KQorICAgIHsKKyAgICAgIGlmIChyZWduYW1lWzFdID09ICc4JyAmJiByZWduYW1lWzJdID09ICctJyAmJiByZWduYW1lWzNdID09ICcxJworCSAgJiYgcmVnbmFtZVs0XSA9PSc1JykKKwl7CisJICByZWdubyA9IFIwX1JFR05VTSArIDg7CisJICBudW1yZWdzID0gODsKKwl9CisgICAgfQorICBlbHNlIGlmIChyZWduYW1lbGVuID09IDE3KQorICAgIHsKKyAgICB9CisKKyAgaWYgKHJlZ25vID49IDApCisgICAgd2hpbGUgKG51bXJlZ3MtLSA+IDApCisgICAgICB2YWwgPSBtb25pdG9yX3N1cHBseV9yZWdpc3RlciAocmVnbm8rKywgdmFsKTsKK30KKworc3RhdGljIHZvaWQKK3NoM19sb2FkIChkZXNjLCBmaWxlLCBoYXNobWFyaykKKyAgICAgc2VyaWFsX3QgZGVzYzsKKyAgICAgY2hhciAqZmlsZTsKKyAgICAgaW50IGhhc2htYXJrOworeworICBpZiAocGFyYWxsZWxfaW5fdXNlKSAKKyAgICB7CisgICAgICBtb25pdG9yX3ByaW50ZigicGw7c1xyIik7CisgICAgICBsb2FkX3NyZWMgKHBhcmFsbGVsLCBmaWxlLCAwLCA4MCwgU1JFQ19BTEwsIGhhc2htYXJrLCBOVUxMKTsKKyAgICAgIG1vbml0b3JfZXhwZWN0X3Byb21wdCAoTlVMTCwgMCk7CisgICAgfQorICBlbHNlIAorICAgIHsKKyAgICAgIG1vbml0b3JfcHJpbnRmICgiaWw7czp4XHIiKTsKKyAgICAgIG1vbml0b3JfZXhwZWN0ICgiXDAwNSIsIE5VTEwsIDApOyAvKiBMb29rIGZvciBFTlEgKi8KKyAgICAgIFNFUklBTF9XUklURSAoZGVzYywgIlwwMDYiLCAxKTsgLyogU2VuZCBBQ0sgKi8KKyAgICAgIG1vbml0b3JfZXhwZWN0ICgiTE8geFxyIiwgTlVMTCwgMCk7IC8qIExvb2sgZm9yIGZpbGVuYW1lICovCisKKyAgICAgIGxvYWRfc3JlYyAoZGVzYywgZmlsZSwgMCwgODAsIFNSRUNfQUxMLCBoYXNobWFyaywgTlVMTCk7CisKKyAgICAgIG1vbml0b3JfZXhwZWN0ICgiXDAwNSIsIE5VTEwsIDApOyAvKiBMb29rIGZvciBFTlEgKi8KKyAgICAgIFNFUklBTF9XUklURSAoZGVzYywgIlwwMDYiLCAxKTsgLyogU2VuZCBBQ0sgKi8KKyAgICAgIG1vbml0b3JfZXhwZWN0X3Byb21wdCAoTlVMTCwgMCk7CisgICAgfQorfQorCisvKiBUaGlzIGFycmF5IG9mIHJlZ2lzdGVycyBuZWVkIHRvIG1hdGNoIHRoZSBpbmRleGVzIHVzZWQgYnkgR0RCLgorICAgVGhpcyBleGlzdHMgYmVjYXVzZSB0aGUgdmFyaW91cyBST00gbW9uaXRvcnMgdXNlIGRpZmZlcmVudCBzdHJpbmdzCisgICB0aGFuIGRvZXMgR0RCLCBhbmQgZG9uJ3QgbmVjZXNzYXJpbHkgc3VwcG9ydCBhbGwgdGhlIHJlZ2lzdGVycworICAgZWl0aGVyLiBTbywgdHlwaW5nICJpbmZvIHJlZyBzcCIgYmVjb21lcyBhICJyMzAiLiAgKi8KKworc3RhdGljIGNoYXIgKnNoM19yZWduYW1lc1tOVU1fUkVHU10gPSB7CisgICJSMCIsICJSMSIsICJSMiIsICAiUjMiLCAiUjQiLCAgIlI1IiwgICAiUjYiLCAgIlI3IiwKKyAgIlI4IiwgIlI5IiwgIlIxMCIsICJSMTEiLCJSMTIiLCAiUjEzIiwgICJSMTQiLCAiUjE1IiwKKyAgIlBDIiwgIlBSIiwgIkdCUiIsICJWQlIiLCJNQUNIIiwiTUFDTCIsICJTUiIsCisgIE5VTEwsIE5VTEwsCisgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICJTU1IiLCAiU1BDIiwKKyAgIlIwX0JBTkswIiwgIlIxX0JBTkswIiwgIlIyX0JBTkswIiwgIlIzX0JBTkswIiwKKyAgIlI0X0JBTkswIiwgIlI1X0JBTkswIiwgIlI2X0JBTkswIiwgIlI3X0JBTkswIiwKKyAgIlIwX0JBTksxIiwgIlIxX0JBTksxIiwgIlIyX0JBTksxIiwgIlIzX0JBTksxIiwKKyAgIlI0X0JBTksxIiwgIlI1X0JBTksxIiwgIlI2X0JBTksxIiwgIlI3X0JBTksxIgorfTsKKworc3RhdGljIGNoYXIgKnNoM2VfcmVnbmFtZXNbTlVNX1JFR1NdID0geworICAiUjAiLCAiUjEiLCAiUjIiLCAgIlIzIiwgIlI0IiwgICJSNSIsICAgIlI2IiwgICJSNyIsCisgICJSOCIsICJSOSIsICJSMTAiLCAiUjExIiwiUjEyIiwgIlIxMyIsICAiUjE0IiwgIlIxNSIsCisgICJQQyIsICJQUiIsICJHQlIiLCAiVkJSIiwiTUFDSCIsIk1BQ0wiLCAiU1IiLAorICAiRlBVTCIsICJGUFNDUiIsCisgICJGUjAiLCAiRlIxIiwgIkZSMiIsICJGUjMiLCAiRlI0IiwgIkZSNSIsICJGUjYiLCAiRlI3IiwKKyAgIkZSOCIsICJGUjkiLCAiRlIxMCIsICJGUjExIiwgIkZSMTIiLCAiRlIxMyIsICJGUjE0IiwgIkZSMTUiLAorICAiU1NSIiwiU1BDIiwKKyAgIlIwX0JBTkswIiwgIlIxX0JBTkswIiwgIlIyX0JBTkswIiwgIlIzX0JBTkswIiwKKyAgIlI0X0JBTkswIiwgIlI1X0JBTkswIiwgIlI2X0JBTkswIiwgIlI3X0JBTkswIiwKKyAgIlIwX0JBTksxIiwgIlIxX0JBTksxIiwgIlIyX0JBTksxIiwgIlIzX0JBTksxIiwKKyAgIlI0X0JBTksxIiwgIlI1X0JBTksxIiwgIlI2X0JBTksxIiwgIlI3X0JBTksxIgorfTsKKworLyogRGVmaW5lIHRoZSBtb25pdG9yIGNvbW1hbmQgc3RyaW5ncy4gU2luY2UgdGhlc2UgYXJlIHBhc3NlZCBkaXJlY3RseQorICAgdGhyb3VnaCB0byBhIHByaW50ZiBzdHlsZSBmdW5jdGlvbiwgd2UgbWF5IGluY2x1ZGUgZm9ybWF0dGluZworICAgc3RyaW5ncy4gV2UgYWxzbyBuZWVkIGEgQ1Igb3IgTEYgb24gdGhlIGVuZC4gICovCisKK3N0YXRpYyBzdHJ1Y3QgdGFyZ2V0X29wcyBzaDNfb3BzLCBzaDNlX29wczsKKworc3RhdGljIGNoYXIgKnNoM19pbml0c1tdID0geyJcMDAzIiwgTlVMTH07IC8qIEV4aXRzIHN1Yi1jb21tYW5kIG1vZGUgJiBkb3dubG9hZCBjbWRzICovCisKK3N0YXRpYyBzdHJ1Y3QgbW9uaXRvcl9vcHMgc2gzX2NtZHMgOworCitzdGF0aWMgdm9pZCAKK2luaXRfc2gzX2NtZHModm9pZCkKK3sKKyAgc2gzX2NtZHMuZmxhZ3MgPSAgIE1PX0NMUl9CUkVBS19VU0VTX0FERFIgfCBNT19HRVRNRU1fUkVBRF9TSU5HTEUgOwkvKiBmbGFncyAqLworICBzaDNfY21kcy5pbml0ID0gICBzaDNfaW5pdHM7CQkvKiBtb25pdG9yIGluaXQgc3RyaW5nICovCisgIHNoM19jbWRzLmNvbnQgPSAgICJnXHIiOwkJLyogY29udGludWUgY29tbWFuZCAqLworICBzaDNfY21kcy5zdGVwID0gICAic1xyIjsJCS8qIHNpbmdsZSBzdGVwICovCisgIHNoM19jbWRzLnN0b3AgPSAgICJcMDAzIjsJCS8qIEludGVycnVwdCBwcm9ncmFtICovCisgIHNoM19jbWRzLnNldF9icmVhayA9ICAgImIgJXhcciI7CS8qIHNldCBhIGJyZWFrcG9pbnQgKi8KKyAgc2gzX2NtZHMuY2xyX2JyZWFrID0gICAiYiAtJXhcciI7CS8qIGNsZWFyIGEgYnJlYWtwb2ludCAqLworICBzaDNfY21kcy5jbHJfYWxsX2JyZWFrID0gICAiYiAtXHIiOwkvKiBjbGVhciBhbGwgYnJlYWtwb2ludHMgKi8KKyAgc2gzX2NtZHMuZmlsbCA9ICAgImYgJXggQCV4ICV4XHIiOwkJLyogZmlsbCAoc3RhcnQgbGVuIHZhbCkgKi8KKyAgc2gzX2NtZHMuc2V0bWVtLmNtZGIgPSAgICAgIm0gJXggJXhcciI7CS8qIHNldG1lbS5jbWRiIChhZGRyLCB2YWx1ZSkgKi8KKyAgc2gzX2NtZHMuc2V0bWVtLmNtZHcgPSAgICAgIm0gJXggJXg7d1xyIjsJLyogc2V0bWVtLmNtZHcgKGFkZHIsIHZhbHVlKSAqLworICBzaDNfY21kcy5zZXRtZW0uY21kbCA9ICAgICAibSAleCAleDtsXHIiOwkvKiBzZXRtZW0uY21kbCAoYWRkciwgdmFsdWUpICovCisgIHNoM19jbWRzLnNldG1lbS5jbWRsbCA9ICAgICBOVUxMOwkJLyogc2V0bWVtLmNtZGxsIChhZGRyLCB2YWx1ZSkgKi8KKyAgc2gzX2NtZHMuc2V0bWVtLnJlc3BfZGVsaW0gPSAgICAgTlVMTDsJLyogc2V0cmVnLnJlc3BfZGVsaW0gKi8KKyAgc2gzX2NtZHMuc2V0bWVtLnRlcm0gPSAgICAgTlVMTDsJCS8qIHNldHJlZy50ZXJtICovCisgIHNoM19jbWRzLnNldG1lbS50ZXJtX2NtZCA9ICAgICBOVUxMOwkJLyogc2V0cmVnLnRlcm1fY21kICovCisgIHNoM19jbWRzLmdldG1lbS5jbWRiID0gICAgICJtICV4XHIiOwkJLyogZ2V0bWVtLmNtZGIgKGFkZHIsIGxlbikgKi8KKyAgc2gzX2NtZHMuZ2V0bWVtLmNtZHcgPSAgICAgIm0gJXg7d1xyIjsJLyogZ2V0bWVtLmNtZHcgKGFkZHIsIGxlbikgKi8KKyAgc2gzX2NtZHMuZ2V0bWVtLmNtZGwgPSAgICAgIm0gJXg7bFxyIjsJLyogZ2V0bWVtLmNtZGwgKGFkZHIsIGxlbikgKi8KKyAgc2gzX2NtZHMuZ2V0bWVtLmNtZGxsID0gICAgIE5VTEw7CQkvKiBnZXRtZW0uY21kbGwgKGFkZHIsIGxlbikgKi8KKyAgc2gzX2NtZHMuZ2V0bWVtLnJlc3BfZGVsaW0gPSAgICAgIl4gWzAtOUEtRl0rICI7IC8qIGdldG1lbS5yZXNwX2RlbGltICovCisgIHNoM19jbWRzLmdldG1lbS50ZXJtID0gICAgICI/ICI7CQkvKiBnZXRtZW0udGVybSAqLworICBzaDNfY21kcy5nZXRtZW0udGVybV9jbWQgPSAgICAgIi5cciI7CQkvKiBnZXRtZW0udGVybV9jbWQgKi8KKyAgc2gzX2NtZHMuc2V0cmVnLmNtZCA9ICAgICAiLiVzICV4XHIiOwkJLyogc2V0cmVnLmNtZCAobmFtZSwgdmFsdWUpICovCisgIHNoM19jbWRzLnNldHJlZy5yZXNwX2RlbGltID0gICAgIE5VTEw7CS8qIHNldHJlZy5yZXNwX2RlbGltICovCisgIHNoM19jbWRzLnNldHJlZy50ZXJtID0gICAgIE5VTEw7CQkvKiBzZXRyZWcudGVybSAqLworICBzaDNfY21kcy5zZXRyZWcudGVybV9jbWQgPSAgICAgTlVMTDsJCS8qIHNldHJlZy50ZXJtX2NtZCAqLworICBzaDNfY21kcy5nZXRyZWcuY21kID0gICAgICIuJXNcciI7CQkvKiBnZXRyZWcuY21kIChuYW1lKSAqLworICBzaDNfY21kcy5nZXRyZWcucmVzcF9kZWxpbSA9ICAgICAiPSI7CQkvKiBnZXRyZWcucmVzcF9kZWxpbSAqLworICBzaDNfY21kcy5nZXRyZWcudGVybSA9ICAgICAiPyAiOwkJLyogZ2V0cmVnLnRlcm0gKi8KKyAgc2gzX2NtZHMuZ2V0cmVnLnRlcm1fY21kID0gICAgICIuXHIiCTsJLyogZ2V0cmVnLnRlcm1fY21kICovCisgIHNoM19jbWRzLmR1bXBfcmVnaXN0ZXJzID0gICAiclxyIjsJCS8qIGR1bXBfcmVnaXN0ZXJzICovCisgIHNoM19jbWRzLnJlZ2lzdGVyX3BhdHRlcm4gPSAJIlxcKFxcdytcXCk9XFwoWzAtOWEtZkEtRl0rXFwoICtbMC05YS1mQS1GXStcXGJcXCkqXFwpIjsKKyAgc2gzX2NtZHMuc3VwcGx5X3JlZ2lzdGVyID0gIHNoM19zdXBwbHlfcmVnaXN0ZXIgOwkvKiBzdXBwbHlfcmVnaXN0ZXIgKi8KKyAgc2gzX2NtZHMubG9hZF9yb3V0aW5lID0gICBzaDNfbG9hZDsJCS8qIGxvYWRfcm91dGluZSAqLworICBzaDNfY21kcy5sb2FkID0gICBOVUxMOwkJCS8qIGRvd25sb2FkIGNvbW1hbmQgKi8KKyAgc2gzX2NtZHMubG9hZHJlc3AgPSAgIE5VTEw7CQkJLyogTG9hZCByZXNwb25zZSAqLworICBzaDNfY21kcy5wcm9tcHQgPSAgICJcbjoiOwkJCS8qIG1vbml0b3IgY29tbWFuZCBwcm9tcHQgKi8KKyAgc2gzX2NtZHMubGluZV90ZXJtID0gICAiXHIiOwkJCS8qIGVuZC1vZi1saW5lIHRlcm1pbmF0b3IgKi8KKyAgc2gzX2NtZHMuY21kX2VuZCA9ICAgIi5cciI7CQkJLyogb3B0aW9uYWwgY29tbWFuZCB0ZXJtaW5hdG9yICovCisgIHNoM19jbWRzLnRhcmdldCA9ICAgJnNoM19vcHM7CQkJLyogdGFyZ2V0IG9wZXJhdGlvbnMgKi8KKyAgc2gzX2NtZHMuc3RvcGJpdHMgPSAgIFNFUklBTF8xX1NUT1BCSVRTOwkvKiBudW1iZXIgb2Ygc3RvcCBiaXRzICovCisgIHNoM19jbWRzLnJlZ25hbWVzID0gICBzaDNfcmVnbmFtZXM7CQkvKiByZWdpc3RlcnMgbmFtZXMgKi8KKyAgc2gzX2NtZHMubWFnaWMgPSAgIE1PTklUT1JfT1BTX01BR0lDCTsJLyogbWFnaWMgKi8KK30gLyogaW5pdF9zaDNfY21kcyAqLworCisvKiBUaGlzIG1vbml0b3Igc3RydWN0dXJlIGlzIGlkZW50aWNhbCBleGNlcHQgZm9yIGEgY291cGxlIHNsb3RzLCBzbworICAgd2Ugd2lsbCBmaWxsIGl0IGluIGZyb20gdGhlIGJhc2Ugc3RydWN0dXJlIHdoZW4gbmVlZGVkLiAgKi8KKworc3RhdGljIHN0cnVjdCBtb25pdG9yX29wcyBzaDNlX2NtZHM7CisKK3N0YXRpYyB2b2lkCitzaDNfb3BlbiAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgY2hhciAqc2VyaWFsX3BvcnRfbmFtZSA9IGFyZ3M7CisgIGNoYXIgKnBhcmFsbGVsX3BvcnRfbmFtZSA9IDA7CisKKyAgaWYgKGFyZ3MpIAorICAgIHsKKyAgICAgIGNoYXIgKmN1cnNvciA9IHNlcmlhbF9wb3J0X25hbWUgPSBzdHJzYXZlIChhcmdzKTsKKworICAgICAgd2hpbGUgKCpjdXJzb3IgJiYgKmN1cnNvciAhPSAnICcpCisgCWN1cnNvcisrOworCisgICAgICBpZiAoKmN1cnNvcikKKwkqY3Vyc29yKysgPSAwOworCisgICAgICB3aGlsZSAoKmN1cnNvciA9PSAnICcpCisJY3Vyc29yKys7CisKKyAgICAgIGlmICgqY3Vyc29yKQorCXBhcmFsbGVsX3BvcnRfbmFtZSA9IGN1cnNvcjsKKyAgICB9CisKKyAgbW9uaXRvcl9vcGVuIChzZXJpYWxfcG9ydF9uYW1lLCAmc2gzX2NtZHMsIGZyb21fdHR5KTsKKworICBpZiAocGFyYWxsZWxfcG9ydF9uYW1lKQorICAgIHsKKyAgICAgIHBhcmFsbGVsID0gU0VSSUFMX09QRU4gKHBhcmFsbGVsX3BvcnRfbmFtZSk7CisKKyAgICAgIGlmICghcGFyYWxsZWwpCisJcGVycm9yX3dpdGhfbmFtZSAoIlVuYWJsZSB0byBvcGVuIHBhcmFsbGVsIHBvcnQuIik7CisKKyAgICAgIHBhcmFsbGVsX2luX3VzZSA9IDE7CisgICAgfQorCisgIC8qIElmIHdlIGNvbm5lY3RlZCBzdWNjZXNzZnVsbHksIHdlIGtub3cgdGhlIHByb2Nlc3NvciBpcyBhbiBTSDMuICAqLworICBzZXRfYXJjaGl0ZWN0dXJlX2Zyb21fYXJjaF9tYWNoIChiZmRfYXJjaF9zaCwgYmZkX21hY2hfc2gzKTsKK30KKworCitzdGF0aWMgdm9pZAorc2gzZV9vcGVuIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjaGFyICpzZXJpYWxfcG9ydF9uYW1lID0gYXJnczsKKyAgY2hhciAqcGFyYWxsZWxfcG9ydF9uYW1lID0gMDsKKworICBpZiAoYXJncykgCisgICAgeworICAgICAgY2hhciAqY3Vyc29yID0gc2VyaWFsX3BvcnRfbmFtZSA9IHN0cnNhdmUgKGFyZ3MpOworCisgICAgICB3aGlsZSAoKmN1cnNvciAmJiAqY3Vyc29yICE9ICcgJykKKyAJY3Vyc29yKys7CisKKyAgICAgIGlmICgqY3Vyc29yKQorCSpjdXJzb3IrKyA9IDA7CisKKyAgICAgIHdoaWxlICgqY3Vyc29yID09ICcgJykKKwljdXJzb3IrKzsKKworICAgICAgaWYgKCpjdXJzb3IpCisJcGFyYWxsZWxfcG9ydF9uYW1lID0gY3Vyc29yOworICAgIH0KKworICAvKiBTZXQgdXAgdGhlIFNILTNFIG1vbml0b3IgY29tbWFuZHMgc3RydWN0dXJlLiAgKi8KKworICBtZW1jcHkgKCZzaDNlX2NtZHMsICZzaDNfY21kcywgc2l6ZW9mIChzdHJ1Y3QgbW9uaXRvcl9vcHMpKTsKKworICBzaDNlX2NtZHMudGFyZ2V0ID0gJnNoM2Vfb3BzOworICBzaDNlX2NtZHMucmVnbmFtZXMgPSBzaDNlX3JlZ25hbWVzOworCisgIG1vbml0b3Jfb3BlbiAoc2VyaWFsX3BvcnRfbmFtZSwgJnNoM2VfY21kcywgZnJvbV90dHkpOworCisgIGlmIChwYXJhbGxlbF9wb3J0X25hbWUpCisgICAgeworICAgICAgcGFyYWxsZWwgPSBTRVJJQUxfT1BFTiAocGFyYWxsZWxfcG9ydF9uYW1lKTsKKworICAgICAgaWYgKCFwYXJhbGxlbCkKKwlwZXJyb3Jfd2l0aF9uYW1lICgiVW5hYmxlIHRvIG9wZW4gcGFyYWxsZWwgcG9ydC4iKTsKKworICAgICAgcGFyYWxsZWxfaW5fdXNlID0gMTsKKyAgICB9CisKKyAgLyogSWYgd2UgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseSwgd2Uga25vdyB0aGUgcHJvY2Vzc29yIGlzIGFuIFNIM0UuICAqLworICBzZXRfYXJjaGl0ZWN0dXJlX2Zyb21fYXJjaF9tYWNoIChiZmRfYXJjaF9zaCwgYmZkX21hY2hfc2gzKTsKK30KKworc3RhdGljIHZvaWQKK3NoM19jbG9zZSAocXVpdHRpbmcpCisgICAgIGludCBxdWl0dGluZzsKK3sKKyAgbW9uaXRvcl9jbG9zZSAocXVpdHRpbmcpOworICBpZiAocGFyYWxsZWxfaW5fdXNlKSB7CisgICAgU0VSSUFMX0NMT1NFIChwYXJhbGxlbCk7CisgICAgcGFyYWxsZWxfaW5fdXNlID0gMDsKKyAgfQorfQorCit2b2lkCitfaW5pdGlhbGl6ZV9zaDNfcm9tICgpCit7CisgIGluaXRfc2gzX2NtZHMoKSA7CisgIGluaXRfbW9uaXRvcl9vcHMgKCZzaDNfb3BzKTsKKworICBzaDNfb3BzLnRvX3Nob3J0bmFtZSA9ICJzaDMiOworICBzaDNfb3BzLnRvX2xvbmduYW1lID0gIkhpdGFjaGkgU0gtMyByb20gbW9uaXRvciI7CisKKyAgc2gzX29wcy50b19kb2MgPSAKKyNpZmRlZiBfV0lORE9XUworICAvKiBPbiB3aW5kb3dzIHdlIGNhbiB0YWxrIHRocm91Z2ggdGhlIHBhcmFsbGVsIHBvcnQgdG9vLiAqLworICAgICJEZWJ1ZyBvbiBhIEhpdGFjaGkgZXZhbCBib2FyZCBydW5uaW5nIHRoZSBTSC0zIHJvbSBtb25pdG9yLlxuIgorICAgICJTcGVjaWZ5IHRoZSBzZXJpYWwgZGV2aWNlIGl0IGlzIGNvbm5lY3RlZCB0byAoZS5nLiBjb20yKS5cbiIKKyAgICAiSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBwYXJhbGxlbCBwb3J0IHRvIGRvd25sb2FkIHRvIGl0LCBzcGVjaWZ5IHRoYXRcbiIKKyAgICAiYXMgdGhlIHNlY29uZCBhcmd1bWVudC4gKGUuZy4gbHB0MSkiOworI2Vsc2UKKyAgICAiRGVidWcgb24gYSBIaXRhY2hpIGV2YWwgYm9hcmQgcnVubmluZyB0aGUgU0gtMyByb20gbW9uaXRvci5cblwKK1NwZWNpZnkgdGhlIHNlcmlhbCBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvIChlLmcuIC9kZXYvdHR5YSkuIjsKKyNlbmRpZgorCisgIHNoM19vcHMudG9fb3BlbiA9IHNoM19vcGVuOworICBzaDNfb3BzLnRvX2Nsb3NlID0gc2gzX2Nsb3NlOworCisgIGFkZF90YXJnZXQgKCZzaDNfb3BzKTsKKworICAvKiBTZXR1cCB0aGUgU0gzZSwgd2hpY2ggaGFzIGZsb2F0IHJlZ2lzdGVycy4gICovCisKKyAgaW5pdF9tb25pdG9yX29wcyAoJnNoM2Vfb3BzKTsKKworICBzaDNlX29wcy50b19zaG9ydG5hbWUgPSAic2gzZSI7CisgIHNoM2Vfb3BzLnRvX2xvbmduYW1lID0gIkhpdGFjaGkgU0gtM0Ugcm9tIG1vbml0b3IiOworCisgIHNoM2Vfb3BzLnRvX2RvYyA9IAorI2lmZGVmIF9XSU5ET1dTCisgIC8qIE9uIHdpbmRvd3Mgd2UgY2FuIHRhbGsgdGhyb3VnaCB0aGUgcGFyYWxsZWwgcG9ydCB0b28uICovCisgICAgIkRlYnVnIG9uIGEgSGl0YWNoaSBldmFsIGJvYXJkIHJ1bm5pbmcgdGhlIFNILTNFIHJvbSBtb25pdG9yLlxuIgorICAgICJTcGVjaWZ5IHRoZSBzZXJpYWwgZGV2aWNlIGl0IGlzIGNvbm5lY3RlZCB0byAoZS5nLiBjb20yKS5cbiIKKyAgICAiSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBwYXJhbGxlbCBwb3J0IHRvIGRvd25sb2FkIHRvIGl0LCBzcGVjaWZ5IHRoYXRcbiIKKyAgICAiYXMgdGhlIHNlY29uZCBhcmd1bWVudC4gKGUuZy4gbHB0MSkiOworI2Vsc2UKKyAgICAiRGVidWcgb24gYSBIaXRhY2hpIGV2YWwgYm9hcmQgcnVubmluZyB0aGUgU0gtM0Ugcm9tIG1vbml0b3IuXG5cCitTcGVjaWZ5IHRoZSBzZXJpYWwgZGV2aWNlIGl0IGlzIGNvbm5lY3RlZCB0byAoZS5nLiAvZGV2L3R0eWEpLiI7CisjZW5kaWYKKworICBzaDNlX29wcy50b19vcGVuID0gc2gzZV9vcGVuOworICBzaDNlX29wcy50b19jbG9zZSA9IHNoM19jbG9zZTsKKworICBhZGRfdGFyZ2V0ICgmc2gzZV9vcHMpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3NpZ25hbHMuaCBiL2dkYi9zaWduYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzNDhiNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9zaWduYWxzLmgKQEAgLTAsMCArMSwyNyBAQAorLyogU2lnbmFsIGhhbmRsZXIgZGVmaW5pdGlvbnMgZm9yIEdEQiwgdGhlIEdOVSBEZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKy8qICBUaGlzIGZpbGUgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIGluY2x1ZGluZyA8c2lnbmFsLmg+IGV4Y2VwdCB0aGF0IGl0CisgICAgZWxpbWluYXRlcyBjZXJ0YWluIHNpZ25hbCBuYW1lcyB3aGVuIGpvYiBjb250cm9sIGlzIG5vdCBzdXBwb3J0ZWQsCisgICAgKG9yLCBvbiBzb21lIHN5c3RlbXMsIHdoZW4gam9iIGNvbnRyb2wgaXMgdGhlcmUgYnV0IGRvZXNuJ3Qgd29yaworICAgIHRoZSB3YXkgR0RCIGV4cGVjdHMgaXQgdG8gd29yaykuICAqLworLyogVGhpcyBoYXMgYmVlbiBzdXBlcmNlZGVkIGJ5IHRoZSBqb2JfY29udHJvbCB2YXJpYWJsZSBpbiBzZXJpYWwuaC4gICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KZGlmZiAtLWdpdCBhL2dkYi9zb2wtdGhyZWFkLmMgYi9nZGIvc29sLXRocmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZTYyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvc29sLXRocmVhZC5jCkBAIC0wLDAgKzEsMTY3MyBAQAorLyogTG93IGxldmVsIGludGVyZmFjZSBmb3IgZGVidWdnaW5nIFNvbGFyaXMgdGhyZWFkcyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBhIHNvcnQgb2YgaGFsZiB0YXJnZXQgdGhhdCBzaXRzIGJldHdlZW4gdGhlCisgICBtYWNoaW5lLWluZGVwZW5kZW50IHBhcnRzIG9mIEdEQiBhbmQgdGhlIC9wcm9jIGludGVyZmFjZSAocHJvY2ZzLmMpIHRvCisgICBwcm92aWRlIGFjY2VzcyB0byB0aGUgU29sYXJpcyB1c2VyLW1vZGUgdGhyZWFkIGltcGxlbWVudGF0aW9uLgorCisgICBTb2xhcmlzIHRocmVhZHMgYXJlIHRydWUgdXNlci1tb2RlIHRocmVhZHMsIHdoaWNoIGFyZSBpbnZva2VkIHZpYSB0aGUgdGhyXyoKKyAgIGFuZCBwdGhyZWFkXyogKG5hdGl2ZSBhbmQgUG9zaXggcmVzcGVjdGl2bHkpIGludGVyZmFjZXMuICBUaGVzZSBhcmUgbW9zdGx5CisgICBpbXBsZW1lbnRlZCBpbiB1c2VyLXNwYWNlLCB3aXRoIGFsbCB0aHJlYWQgY29udGV4dCBrZXB0IGluIHZhcmlvdXMKKyAgIHN0cnVjdHVyZXMgdGhhdCBsaXZlIGluIHRoZSB1c2VyJ3MgaGVhcC4gIFRoZXNlIHNob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aAorICAgbGlnaHR3ZWlnaHQgcHJvY2Vzc2VzIChMV1BzKSwgd2hpY2ggYXJlIGltcGxlbWVudGVkIGJ5IHRoZSBrZXJuZWwsIGFuZAorICAgc2NoZWR1bGVkIHdpdGhvdXQgZXhwbGljaXQgaW50ZXJ2ZW50aW9uIGJ5IHRoZSBwcm9jZXNzLgorCisgICBKdXN0IHRvIGNvbmZ1c2UgdGhpbmdzIGEgbGl0dGxlLCBTb2xhcmlzIHRocmVhZHMgKGJvdGggbmF0aXZlIGFuZCBQb3NpeCkgYXJlCisgICBhY3R1YWxseSBpbXBsZW1lbnRlZCB1c2luZyBMV1BzLiAgSW4gZ2VuZXJhbCwgdGhlcmUgYXJlIGdvaW5nIHRvIGJlIG1vcmUKKyAgIHRocmVhZHMgdGhhbiBMV1BzLiAgVGhlcmUgaXMgbm8gZml4ZWQgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBhIHRocmVhZCBhbmQgYW4KKyAgIExXUC4gIFdoZW4gYSB0aHJlYWQgd2FudHMgdG8gcnVuLCBpdCBnZXRzIHNjaGVkdWxlZCBvbnRvIHRoZSBmaXJzdCBhdmFpbGFibGUKKyAgIExXUCBhbmQgY2FuIHRoZXJlZm9yZSBtaWdyYXRlIGZyb20gb25lIExXUCB0byBhbm90aGVyIGFzIHRpbWUgZ29lcyBvbi4gIEEKKyAgIHNsZWVwaW5nIHRocmVhZCBtYXkgbm90IGJlIGFzc29jaWF0ZWQgd2l0aCBhbiBMV1AgYXQgYWxsIQorCisgICBUbyBtYWtlIGl0IHBvc3NpYmxlIHRvIG1lc3Mgd2l0aCB0aHJlYWRzLCBTdW4gcHJvdmlkZXMgYSBsaWJyYXJ5IGNhbGxlZAorICAgbGlidGhyZWFkX2RiLnNvLjEgKG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGxpYnRocmVhZF9kYi5zby4wLCB3aGljaCBkb2Vzbid0CisgICBoYXZlIGEgcHVibGlzaGVkIGludGVyZmFjZSkuICBUaGlzIGludGVyZmFjZSBoYXMgYW4gdXBwZXIgcGFydCwgd2hpY2ggaXQKKyAgIHByb3ZpZGVzLCBhbmQgYSBsb3dlciBwYXJ0IHdoaWNoIEkgcHJvdmlkZS4gIFRoZSB1cHBlciBwYXJ0IGNvbnNpc3RzIG9mIHRoZQorICAgdGRfKiByb3V0aW5lcywgd2hpY2ggYWxsb3cgbWUgdG8gZmluZCBhbGwgdGhlIHRocmVhZHMsIHF1ZXJ5IHRoZWlyIHN0YXRlLAorICAgZXRjLi4uICBUaGUgbG93ZXIgcGFydCBjb25zaXN0cyBvZiBhbGwgb2YgdGhlIHBzXyosIHdoaWNoIGFyZSB1c2VkIGJ5IHRoZQorICAgdGRfKiByb3V0aW5lcyB0byByZWFkL3dyaXRlIG1lbW9yeSwgbWFuaXB1bGF0ZSBMV1BzLCBsb29rdXAgc3ltYm9scywgZXRjLi4uCisgICBUaGUgcHNfKiByb3V0aW5lcyBhY3R1YWxseSBkbyBtb3N0IG9mIHRoZWlyIHdvcmsgYnkgY2FsbGluZyBmdW5jdGlvbnMgaW4KKyAgIHByb2Nmcy5jLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlIDx0aHJlYWQuaD4KKyNpbmNsdWRlIDxwcm9jX3NlcnZpY2UuaD4KKyNpbmNsdWRlIDx0aHJlYWRfZGIuaD4KKyNpbmNsdWRlICJnZGJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgImdkYmNtZC5oIgorCitleHRlcm4gc3RydWN0IHRhcmdldF9vcHMgc29sX3RocmVhZF9vcHM7IC8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK2V4dGVybiBzdHJ1Y3QgdGFyZ2V0X29wcyBzb2xfY29yZV9vcHM7IC8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KKworLyogcGxhY2UgdG8gc3RvcmUgY29yZV9vcHMgYmVmb3JlIHdlIG92ZXJ3cml0ZSBpdCAqLworc3RhdGljIHN0cnVjdCB0YXJnZXRfb3BzIG9yaWdfY29yZV9vcHM7CisKK3N0cnVjdCB0YXJnZXRfb3BzIHNvbF90aHJlYWRfb3BzOworc3RydWN0IHRhcmdldF9vcHMgc29sX2NvcmVfb3BzOworCitleHRlcm4gaW50IHByb2Nmc19zdXBwcmVzc19ydW47CitleHRlcm4gc3RydWN0IHRhcmdldF9vcHMgcHJvY2ZzX29wczsgLyogdGFyZ2V0IHZlY3RvciBmb3IgcHJvY2ZzLmMgKi8KK2V4dGVybiBzdHJ1Y3QgdGFyZ2V0X29wcyBjb3JlX29wczsgLyogdGFyZ2V0IHZlY3RvciBmb3IgY29yZWxvdy5jICovCitleHRlcm4gY2hhciAqcHJvY2ZzX3BpZF90b19zdHIgUEFSQU1TICgoaW50IHBpZCkpOworCisvKiBOb3RlIHRoYXQgdGhlc2UgcHJvdG90eXBlcyBkaWZmZXIgc2xpZ2h0bHkgZnJvbSB0aG9zZSB1c2VkIGluIHByb2Nmcy5jCisgICBmb3Igb2YgdHdvIHJlYXNvbnMuICBPbmUsIHdlIGNhbid0IHVzZSBncmVnc2V0X3QsIGFzIHRoYXQncyBnb3QgYSB3aG9sZQorICAgZGlmZmVyZW50IG1lYW5pbmcgdW5kZXIgU29sYXJpcyAoYWxzbywgc2VlIGFib3ZlKS4gIFR3bywgd2UgY2FuJ3QgdXNlIHRoZQorICAgcG9pbnRlciBmb3JtIGhlcmUgYXMgdGhlc2UgYXJlIGFjdHVhbGx5IGFycmF5cyBvZiBpbnRzIChmb3IgU3BhcmMncyBhdAorICAgbGVhc3QpLCBhbmQgYXJlIGF1dG9tYXRpY2FsbHkgY29lcmNlZCBpbnRvIHBvaW50ZXJzIHRvIGludHMgd2hlbiB1c2VkIGFzCisgICBwYXJhbWV0ZXJzLiAgVGhhdCBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIGF2b2lkIGEgY29tcGlsZXIgd2FybmluZyB3aGVuCisgICBwYXNzaW5nIHBye2cgZnB9cmVnc2V0X3QncyBmcm9tIGEgcGFyYW1ldGVyIHRvIGFuIGFyZ3VtZW50IG9mIG9uZSBvZgorICAgdGhlc2UgZnVuY3Rpb25zLiAgKi8KKworZXh0ZXJuIHZvaWQgc3VwcGx5X2dyZWdzZXQgUEFSQU1TICgoY29uc3QgcHJncmVnc2V0X3QpKTsKK2V4dGVybiB2b2lkIGZpbGxfZ3JlZ3NldCBQQVJBTVMgKChwcmdyZWdzZXRfdCwgaW50KSk7CitleHRlcm4gdm9pZCBzdXBwbHlfZnByZWdzZXQgUEFSQU1TICgoY29uc3QgcHJmcHJlZ3NldF90ICopKTsKK2V4dGVybiB2b2lkIGZpbGxfZnByZWdzZXQgUEFSQU1TICgocHJmcHJlZ3NldF90ICosIGludCkpOworCisvKiBUaGlzIHN0cnVjdCBpcyBkZWZpbmVkIGJ5IHVzLCBidXQgbWFpbmx5IHVzZWQgZm9yIHRoZSBwcm9jX3NlcnZpY2UgaW50ZXJmYWNlLgorICAgV2UgZG9uJ3QgaGF2ZSBtdWNoIHVzZSBmb3IgaXQsIGV4Y2VwdCBhcyBhIGhhbmR5IHBsYWNlIHRvIGdldCBhIHJlYWwgcGlkCisgICBmb3IgbWVtb3J5IGFjY2Vzc2VzLiAgKi8KKworc3RydWN0IHBzX3Byb2NoYW5kbGUKK3sKKyAgcGlkX3QgcGlkOworfTsKKworc3RydWN0IHN0cmluZ19tYXAKK3sKKyAgaW50IG51bTsKKyAgY2hhciAqc3RyOworfTsKKworc3RhdGljIHN0cnVjdCBwc19wcm9jaGFuZGxlIG1haW5fcGg7CitzdGF0aWMgdGRfdGhyYWdlbnRfdCAqbWFpbl90YTsKK3N0YXRpYyBpbnQgc29sX3RocmVhZF9hY3RpdmUgPSAwOworCitzdGF0aWMgc3RydWN0IGNsZWFudXAgKiBzYXZlX2luZmVyaW9yX3BpZCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCByZXN0b3JlX2luZmVyaW9yX3BpZCBQQVJBTVMgKChpbnQgcGlkKSk7CitzdGF0aWMgY2hhciAqdGRfZXJyX3N0cmluZyBQQVJBTVMgKCh0ZF9lcnJfZSBlcnJjb2RlKSk7CitzdGF0aWMgY2hhciAqdGRfc3RhdGVfc3RyaW5nIFBBUkFNUyAoKHRkX3Rocl9zdGF0ZV9lIHN0YXRlY29kZSkpOworc3RhdGljIGludCAgdGhyZWFkX3RvX2x3cCBQQVJBTVMgKChpbnQgdGhyZWFkX2lkLCBpbnQgZGVmYXVsdF9sd3ApKTsKK3N0YXRpYyB2b2lkIHNvbF90aHJlYWRfcmVzdW1lIFBBUkFNUyAoKGludCBwaWQsIGludCBzdGVwLAorCQkJCSAgICAgICBlbnVtIHRhcmdldF9zaWduYWwgc2lnbm8pKTsKK3N0YXRpYyBpbnQgbHdwX3RvX3RocmVhZCBQQVJBTVMgKChpbnQgbHdwKSk7CitzdGF0aWMgaW50IHNvbF90aHJlYWRfYWxpdmUgUEFSQU1TICgoaW50IHBpZCkpOworc3RhdGljIHZvaWQgc29sX2NvcmVfY2xvc2UgUEFSQU1TICgoaW50IHF1aXR0aW5nKSk7CisKK3N0YXRpYyB2b2lkIGluaXRfc29sX3RocmVhZF9vcHMgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgaW5pdF9zb2xfY29yZV9vcHMgUEFSQU1TICgodm9pZCkpOworCisjZGVmaW5lIFRIUkVBRF9GTEFHIDB4ODAwMDAwMDAKKyNkZWZpbmUgaXNfdGhyZWFkKEFSRykgKCgoQVJHKSAmIFRIUkVBRF9GTEFHKSAhPSAwKQorI2RlZmluZSBpc19sd3AoQVJHKSAoKChBUkcpICYgVEhSRUFEX0ZMQUcpID09IDApCisjZGVmaW5lIEdFVF9MV1AoTFdQX0lEKSAoVElER0VUKExXUF9JRCkpCisjZGVmaW5lIEdFVF9USFJFQUQoVEhSRUFEX0lEKSAoKChUSFJFQURfSUQpID4+IDE2KSAmIDB4N2ZmZikKKyNkZWZpbmUgQlVJTERfTFdQKExXUF9JRCwgUElEKSAoKExXUF9JRCkgPDwgMTYgfCAoUElEKSkKKyNkZWZpbmUgQlVJTERfVEhSRUFEKFRIUkVBRF9JRCwgUElEKSAoVEhSRUFEX0ZMQUcgfCBCVUlMRF9MV1AgKFRIUkVBRF9JRCwgUElEKSkKKworLyogUG9pbnRlcnMgdG8gcm91dGluZXMgZnJvbSBsaXRocmVhZF9kYiByZXNvbHZlZCBieSBkbG9wZW4oKSAqLworCitzdGF0aWMgdm9pZAorICAoKnBfdGRfbG9nKSAoY29uc3QgaW50IG9uX29mZik7CitzdGF0aWMgdGRfZXJyX2UKKyAgKCpwX3RkX3RhX25ldykgKGNvbnN0IHN0cnVjdCBwc19wcm9jaGFuZGxlICpwaF9wLCB0ZF90aHJhZ2VudF90ICoqdGFfcHApOworc3RhdGljIHRkX2Vycl9lCisgICgqcF90ZF90YV9kZWxldGUpICh0ZF90aHJhZ2VudF90ICp0YV9wKTsKK3N0YXRpYyB0ZF9lcnJfZQorICAoKnBfdGRfaW5pdCkgKHZvaWQpOworc3RhdGljIHRkX2Vycl9lCisgICgqcF90ZF90YV9nZXRfcGgpIChjb25zdCB0ZF90aHJhZ2VudF90ICp0YV9wLCBzdHJ1Y3QgcHNfcHJvY2hhbmRsZSAqKnBoX3BwKTsKK3N0YXRpYyB0ZF9lcnJfZQorICAoKnBfdGRfdGFfZ2V0X250aHJlYWRzKSAoY29uc3QgdGRfdGhyYWdlbnRfdCAqdGFfcCwgaW50ICpudGhyZWFkX3ApOworc3RhdGljIHRkX2Vycl9lCisgICgqcF90ZF90YV90c2RfaXRlcikgKGNvbnN0IHRkX3RocmFnZW50X3QgKnRhX3AsIHRkX2tleV9pdGVyX2YgKmNiLCB2b2lkICpjYmRhdGFfcCk7CitzdGF0aWMgdGRfZXJyX2UKKyAgKCpwX3RkX3RhX3Rocl9pdGVyKSAoY29uc3QgdGRfdGhyYWdlbnRfdCAqdGFfcCwgdGRfdGhyX2l0ZXJfZiAqY2IsIHZvaWQgKmNiZGF0YV9wLCB0ZF90aHJfc3RhdGVfZSBzdGF0ZSwKKwkJICAgICAgIGludCB0aV9wcmksIHNpZ3NldF90ICp0aV9zaWdtYXNrX3AsIHVuc2lnbmVkIHRpX3VzZXJfZmxhZ3MpOworc3RhdGljIHRkX2Vycl9lCisgICgqcF90ZF90aHJfdmFsaWRhdGUpIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqdGhfcCk7CitzdGF0aWMgdGRfZXJyX2UKKyAgKCpwX3RkX3Rocl90c2QpIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqdGhfcCwgY29uc3QgdGhyZWFkX2tleV90IGtleSwgdm9pZCAqKmRhdGFfcHApOworc3RhdGljIHRkX2Vycl9lCisgICgqcF90ZF90aHJfZ2V0X2luZm8pIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqdGhfcCwgdGRfdGhyaW5mb190ICp0aV9wKTsKK3N0YXRpYyB0ZF9lcnJfZQorICAoKnBfdGRfdGhyX2dldGZwcmVncykgKGNvbnN0IHRkX3RocmhhbmRsZV90ICp0aF9wLCBwcmZwcmVnc2V0X3QgKmZwcmVnc2V0KTsKK3N0YXRpYyB0ZF9lcnJfZQorICAoKnBfdGRfdGhyX2dldHhyZWdzaXplKSAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKnRoX3AsIGludCAqeHJlZ3NpemUpOworc3RhdGljIHRkX2Vycl9lCisgICgqcF90ZF90aHJfZ2V0eHJlZ3MpIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqdGhfcCwgY29uc3QgY2FkZHJfdCB4cmVnc2V0KTsKK3N0YXRpYyB0ZF9lcnJfZQorICAoKnBfdGRfdGhyX3NpZ3NldG1hc2spIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqdGhfcCwgY29uc3Qgc2lnc2V0X3QgdGlfc2lnbWFzayk7CitzdGF0aWMgdGRfZXJyX2UKKyAgKCpwX3RkX3Rocl9zZXRwcmlvKSAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKnRoX3AsIGNvbnN0IGludCB0aV9wcmkpOworc3RhdGljIHRkX2Vycl9lCisgICgqcF90ZF90aHJfc2V0c2lncGVuZGluZykgKGNvbnN0IHRkX3RocmhhbmRsZV90ICp0aF9wLCBjb25zdCB1Y2hhcl90IHRpX3BlbmRpbmdfZmxhZywgY29uc3Qgc2lnc2V0X3QgdGlfcGVuZGluZyk7CitzdGF0aWMgdGRfZXJyX2UKKyAgKCpwX3RkX3Rocl9zZXRmcHJlZ3MpIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqdGhfcCwgY29uc3QgcHJmcHJlZ3NldF90ICpmcHJlZ3NldCk7CitzdGF0aWMgdGRfZXJyX2UKKyAgKCpwX3RkX3Rocl9zZXR4cmVncykgKGNvbnN0IHRkX3RocmhhbmRsZV90ICp0aF9wLCBjb25zdCBjYWRkcl90IHhyZWdzZXQpOworc3RhdGljIHRkX2Vycl9lCisgICgqcF90ZF90YV9tYXBfaWQydGhyKSAoY29uc3QgdGRfdGhyYWdlbnRfdCAqdGFfcCwgdGhyZWFkX3QgdGlkLCB0ZF90aHJoYW5kbGVfdCAqdGhfcCk7CitzdGF0aWMgdGRfZXJyX2UKKyAgKCpwX3RkX3RhX21hcF9sd3AydGhyKSAoY29uc3QgdGRfdGhyYWdlbnRfdCAqdGFfcCwgbHdwaWRfdCBsd3BpZCwgdGRfdGhyaGFuZGxlX3QgKnRoX3ApOworc3RhdGljIHRkX2Vycl9lCisgICgqcF90ZF90aHJfZ2V0Z3JlZ3MpIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqdGhfcCwgcHJncmVnc2V0X3QgcmVnc2V0KTsKK3N0YXRpYyB0ZF9lcnJfZQorICAoKnBfdGRfdGhyX3NldGdyZWdzKSAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKnRoX3AsIGNvbnN0IHByZ3JlZ3NldF90IHJlZ3NldCk7CisMCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJdGRfZXJyX3N0cmluZyAtIENvbnZlcnQgYSB0aHJlYWRfZGIgZXJyb3IgY29kZSB0byBhIHN0cmluZworCitTWU5PUFNJUworCisJY2hhciAqIHRkX2Vycl9zdHJpbmcgKGVycmNvZGUpCisKK0RFU0NSSVBUSU9OCisKKwlSZXR1cm4gdGhlIHRocmVhZF9kYiBlcnJvciBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGVycmNvZGUuICBJZiBlcnJjb2RlCisJaXMgdW5rbm93biwgdGhlbiByZXR1cm4gYSBtZXNzYWdlLgorCisgKi8KKworc3RhdGljIGNoYXIgKgordGRfZXJyX3N0cmluZyAoZXJyY29kZSkKKyAgICAgdGRfZXJyX2UgZXJyY29kZTsKK3sKKyAgc3RhdGljIHN0cnVjdCBzdHJpbmdfbWFwCisgICAgdGRfZXJyX3RhYmxlW10gPSB7CisgICAgICB7VERfT0ssCQkiZ2VuZXJpYyBcImNhbGwgc3VjY2VlZGVkXCIifSwKKyAgICAgIHtURF9FUlIsCQkiZ2VuZXJpYyBlcnJvci4ifSwKKyAgICAgIHtURF9OT1RIUiwJIm5vIHRocmVhZCBjYW4gYmUgZm91bmQgdG8gc2F0aXNmeSBxdWVyeSJ9LAorICAgICAge1REX05PU1YsCQkibm8gc3luY2guIHZhcmlhYmxlIGNhbiBiZSBmb3VuZCB0byBzYXRpc2Z5IHF1ZXJ5In0sCisgICAgICB7VERfTk9MV1AsCSJubyBsd3AgY2FuIGJlIGZvdW5kIHRvIHNhdGlzZnkgcXVlcnkifSwKKyAgICAgIHtURF9CQURQSCwJImludmFsaWQgcHJvY2VzcyBoYW5kbGUifSwKKyAgICAgIHtURF9CQURUSCwJImludmFsaWQgdGhyZWFkIGhhbmRsZSJ9LAorICAgICAge1REX0JBRFNILAkiaW52YWxpZCBzeW5jaHJvbml6YXRpb24gaGFuZGxlIn0sCisgICAgICB7VERfQkFEVEEsCSJpbnZhbGlkIHRocmVhZCBhZ2VudCJ9LAorICAgICAge1REX0JBREtFWSwJImludmFsaWQga2V5In0sCisgICAgICB7VERfTk9NU0csCSJ0ZF90aHJfZXZlbnRfZ2V0bXNnKCkgY2FsbGVkIHdoZW4gdGhlcmUgd2FzIG5vIG1lc3NhZ2UifSwKKyAgICAgIHtURF9OT0ZQUkVHUywJIkZQVSByZWdpc3RlciBzZXQgbm90IGF2YWlsYWJsZSBmb3IgZ2l2ZW4gdGhyZWFkIn0sCisgICAgICB7VERfTk9MSUJUSFJFQUQsCSJhcHBsaWNhdGlvbiBub3QgbGlua2VkIHdpdGggbGlidGhyZWFkIn0sCisgICAgICB7VERfTk9FVkVOVCwJInJlcXVlc3RlZCBldmVudCBpcyBub3Qgc3VwcG9ydGVkIn0sCisgICAgICB7VERfTk9DQVBBQiwJImNhcGFiaWxpdHkgbm90IGF2YWlsYWJsZSJ9LAorICAgICAge1REX0RCRVJSLAkiRGVidWdnZXIgc2VydmljZSBmYWlsZWQifSwKKyAgICAgIHtURF9OT0FQTElDLAkiT3BlcmF0aW9uIG5vdCBhcHBsaWNhYmxlIHRvIn0sCisgICAgICB7VERfTk9UU0QsCSJObyB0aHJlYWQgc3BlY2lmaWMgZGF0YSBmb3IgdGhpcyB0aHJlYWQifSwKKyAgICAgIHtURF9NQUxMT0MsCSJNYWxsb2MgZmFpbGVkIn0sCisgICAgICB7VERfUEFSVElBTFJFRywJIk9ubHkgcGFydCBvZiByZWdpc3RlciBzZXQgd2FzIHdyaXRlbi9yZWFkIn0sCisgICAgICB7VERfTk9YUkVHUywJIlggcmVnaXN0ZXIgc2V0IG5vdCBhdmFpbGFibGUgZm9yIGdpdmVuIHRocmVhZCJ9CisgICAgfTsKKyAgY29uc3QgaW50IHRkX2Vycl9zaXplID0gc2l6ZW9mIHRkX2Vycl90YWJsZSAvIHNpemVvZiAoc3RydWN0IHN0cmluZ19tYXApOworICBpbnQgaTsKKyAgc3RhdGljIGNoYXIgYnVmWzUwXTsKKworICBmb3IgKGkgPSAwOyBpIDwgdGRfZXJyX3NpemU7IGkrKykKKyAgICBpZiAodGRfZXJyX3RhYmxlW2ldLm51bSA9PSBlcnJjb2RlKQorICAgICAgcmV0dXJuIHRkX2Vycl90YWJsZVtpXS5zdHI7CisJCSAgCisgIHNwcmludGYgKGJ1ZiwgIlVua25vd24gdGhyZWFkX2RiIGVycm9yIGNvZGU6ICVkIiwgZXJyY29kZSk7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKwwKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwl0ZF9zdGF0ZV9zdHJpbmcgLSBDb252ZXJ0IGEgdGhyZWFkX2RiIHN0YXRlIGNvZGUgdG8gYSBzdHJpbmcKKworU1lOT1BTSVMKKworCWNoYXIgKiB0ZF9zdGF0ZV9zdHJpbmcgKHN0YXRlY29kZSkKKworREVTQ1JJUFRJT04KKworCVJldHVybiB0aGUgdGhyZWFkX2RiIHN0YXRlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggc3RhdGVjb2RlLiAgSWYKKwlzdGF0ZWNvZGUgaXMgdW5rbm93biwgdGhlbiByZXR1cm4gYSBtZXNzYWdlLgorCisgKi8KKworc3RhdGljIGNoYXIgKgordGRfc3RhdGVfc3RyaW5nIChzdGF0ZWNvZGUpCisgICAgIHRkX3Rocl9zdGF0ZV9lIHN0YXRlY29kZTsKK3sKKyAgc3RhdGljIHN0cnVjdCBzdHJpbmdfbWFwCisgICAgdGRfdGhyX3N0YXRlX3RhYmxlW10gPSB7CisgICAgICB7VERfVEhSX0FOWV9TVEFURSwgImFueSBzdGF0ZSJ9LAorICAgICAge1REX1RIUl9VTktOT1dOLAkidW5rbm93biJ9LAorICAgICAge1REX1RIUl9TVE9QUEVELAkic3RvcHBlZCJ9LAorICAgICAge1REX1RIUl9SVU4sCSJydW4ifSwKKyAgICAgIHtURF9USFJfQUNUSVZFLAkiYWN0aXZlIn0sCisgICAgICB7VERfVEhSX1pPTUJJRSwJInpvbWJpZSJ9LAorICAgICAge1REX1RIUl9TTEVFUCwJInNsZWVwIn0sCisgICAgICB7VERfVEhSX1NUT1BQRURfQVNMRUVQLCAic3RvcHBlZCBhc2xlZXAifQorICAgIH07CisgIGNvbnN0IGludCB0ZF90aHJfc3RhdGVfdGFibGVfc2l6ZSA9IHNpemVvZiB0ZF90aHJfc3RhdGVfdGFibGUgLyBzaXplb2YgKHN0cnVjdCBzdHJpbmdfbWFwKTsKKyAgaW50IGk7CisgIHN0YXRpYyBjaGFyIGJ1Zls1MF07CisKKyAgZm9yIChpID0gMDsgaSA8IHRkX3Rocl9zdGF0ZV90YWJsZV9zaXplOyBpKyspCisgICAgaWYgKHRkX3Rocl9zdGF0ZV90YWJsZVtpXS5udW0gPT0gc3RhdGVjb2RlKQorICAgICAgcmV0dXJuIHRkX3Rocl9zdGF0ZV90YWJsZVtpXS5zdHI7CisJCSAgCisgIHNwcmludGYgKGJ1ZiwgIlVua25vd24gdGhyZWFkX2RiIHN0YXRlIGNvZGU6ICVkIiwgc3RhdGVjb2RlKTsKKworICByZXR1cm4gYnVmOworfQorDAorLyoKKworTE9DQUwgRlVOQ1RJT04KKworCXRocmVhZF90b19sd3AgLSBDb252ZXJ0IGEgUG9zaXggb3IgU29sYXJpcyB0aHJlYWQgaWQgdG8gYSBMV1AgaWQuCisKK1NZTk9QU0lTCisKKwlpbnQgdGhyZWFkX3RvX2x3cCAodGhyZWFkX2lkLCBkZWZhdWx0X2x3cCkKKworREVTQ1JJUFRJT04KKworCVRoaXMgZnVuY3Rpb24gY29udmVydHMgYSBQb3NpeCBvciBTb2xhcmlzIHRocmVhZCBpZCB0byBhIGxpZ2h0d2VpZ2h0CisJcHJvY2VzcyBpZC4gIElmIHRocmVhZF9pZCBpcyBub24tZXhpc3RlbnQsIHRoYXQncyBhbiBlcnJvci4gIElmIGl0J3MKKwlhbiBpbmFjdGl2ZSB0aHJlYWQsIHRoZW4gd2UgcmV0dXJuIGRlZmF1bHRfbHdwLgorCitOT1RFUworCisJVGhpcyBmdW5jdGlvbiBwcm9iYWJseSBzaG91bGRuJ3QgY2FsbCBlcnJvcigpLi4uCisKKyAqLworCitzdGF0aWMgaW50Cit0aHJlYWRfdG9fbHdwICh0aHJlYWRfaWQsIGRlZmF1bHRfbHdwKQorICAgICBpbnQgdGhyZWFkX2lkOworICAgICBpbnQgZGVmYXVsdF9sd3A7Cit7CisgIHRkX3RocmluZm9fdCB0aTsKKyAgdGRfdGhyaGFuZGxlX3QgdGg7CisgIHRkX2Vycl9lIHZhbDsKKworICBpZiAoaXNfbHdwICh0aHJlYWRfaWQpKQorICAgIHJldHVybiB0aHJlYWRfaWQ7CQkJLyogSXQncyBhbHJlYWR5IGFuIExXUCBpZCAqLworCisgIC8qIEl0J3MgYSB0aHJlYWQuICBDb252ZXJ0IHRvIGx3cCAqLworCisgIHZhbCA9IHBfdGRfdGFfbWFwX2lkMnRociAobWFpbl90YSwgR0VUX1RIUkVBRCAodGhyZWFkX2lkKSwgJnRoKTsKKyAgaWYgKHZhbCA9PSBURF9OT1RIUikKKyAgICByZXR1cm4gLTE7CQkvKiB0aHJlYWQgbXVzdCBoYXZlIHRlcm1pbmF0ZWQgKi8KKyAgZWxzZSBpZiAodmFsICE9IFREX09LKQorICAgIGVycm9yICgidGhyZWFkX3RvX2x3cDogdGRfdGFfbWFwX2lkMnRociAlcyIsIHRkX2Vycl9zdHJpbmcgKHZhbCkpOworCisgIHZhbCA9IHBfdGRfdGhyX2dldF9pbmZvICgmdGgsICZ0aSk7CisgIGlmICh2YWwgPT0gVERfTk9USFIpCisgICAgcmV0dXJuIC0xOwkJLyogdGhyZWFkIG11c3QgaGF2ZSB0ZXJtaW5hdGVkICovCisgIGVsc2UgaWYgKHZhbCAhPSBURF9PSykKKyAgICBlcnJvciAoInRocmVhZF90b19sd3A6IHRkX3Rocl9nZXRfaW5mbzogJXMiLCB0ZF9lcnJfc3RyaW5nICh2YWwpKTsKKworICBpZiAodGkudGlfc3RhdGUgIT0gVERfVEhSX0FDVElWRSkKKyAgICB7CisgICAgICBpZiAoZGVmYXVsdF9sd3AgIT0gLTEpCisJcmV0dXJuIGRlZmF1bHRfbHdwOworICAgICAgZXJyb3IgKCJ0aHJlYWRfdG9fbHdwOiB0aHJlYWQgc3RhdGUgbm90IGFjdGl2ZTogJXMiLAorCSAgICAgdGRfc3RhdGVfc3RyaW5nICh0aS50aV9zdGF0ZSkpOworICAgIH0KKworICByZXR1cm4gQlVJTERfTFdQICh0aS50aV9saWQsIFBJREdFVCAodGhyZWFkX2lkKSk7Cit9CisMCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJbHdwX3RvX3RocmVhZCAtIENvbnZlcnQgYSBMV1AgaWQgdG8gYSBQb3NpeCBvciBTb2xhcmlzIHRocmVhZCBpZC4KKworU1lOT1BTSVMKKworCWludCBsd3BfdG9fdGhyZWFkIChsd3BfaWQpCisKK0RFU0NSSVBUSU9OCisKKwlUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGEgbGlnaHR3ZWlnaHQgcHJvY2VzcyBpZCB0byBhIFBvc2l4IG9yIFNvbGFyaXMKKwl0aHJlYWQgaWQuICBJZiB0aHJlYWRfaWQgaXMgbm9uLWV4aXN0ZW50LCB0aGF0J3MgYW4gZXJyb3IuCisKK05PVEVTCisKKwlUaGlzIGZ1bmN0aW9uIHByb2JhYmx5IHNob3VsZG4ndCBjYWxsIGVycm9yKCkuLi4KKworICovCisKK3N0YXRpYyBpbnQKK2x3cF90b190aHJlYWQgKGx3cCkKKyAgICAgaW50IGx3cDsKK3sKKyAgdGRfdGhyaW5mb190IHRpOworICB0ZF90aHJoYW5kbGVfdCB0aDsKKyAgdGRfZXJyX2UgdmFsOworCisgIGlmIChpc190aHJlYWQgKGx3cCkpCisgICAgcmV0dXJuIGx3cDsJCQkvKiBJdCdzIGFscmVhZHkgYSB0aHJlYWQgaWQgKi8KKworICAvKiBJdCdzIGFuIGx3cC4gIENvbnZlcnQgaXQgdG8gYSB0aHJlYWQgaWQuICAqLworCisgIGlmICghc29sX3RocmVhZF9hbGl2ZSAobHdwKSkKKyAgICByZXR1cm4gLTE7CQkJLyogZGVmdW5jdCBsd3AgKi8KKworICB2YWwgPSBwX3RkX3RhX21hcF9sd3AydGhyIChtYWluX3RhLCBHRVRfTFdQIChsd3ApLCAmdGgpOworICBpZiAodmFsID09IFREX05PVEhSKQorICAgIHJldHVybiAtMTsJCS8qIHRocmVhZCBtdXN0IGhhdmUgdGVybWluYXRlZCAqLworICBlbHNlIGlmICh2YWwgIT0gVERfT0spCisgICAgZXJyb3IgKCJsd3BfdG9fdGhyZWFkOiB0ZF90YV9tYXBfbHdwMnRocjogJXMuIiwgdGRfZXJyX3N0cmluZyAodmFsKSk7CisKKyAgdmFsID0gcF90ZF90aHJfdmFsaWRhdGUgKCZ0aCk7CisgIGlmICh2YWwgPT0gVERfTk9USFIpCisgICAgcmV0dXJuIGx3cDsJCQkvKiBsaWJ0aHJlYWQgZG9lc24ndCBrbm93IGFib3V0IGl0LCBqdXN0IHJldHVybiBsd3AgKi8KKyAgZWxzZSBpZiAodmFsICE9IFREX09LKQorICAgIGVycm9yICgibHdwX3RvX3RocmVhZDogdGRfdGhyX3ZhbGlkYXRlOiAlcy4iLCB0ZF9lcnJfc3RyaW5nICh2YWwpKTsKKworICB2YWwgPSBwX3RkX3Rocl9nZXRfaW5mbyAoJnRoLCAmdGkpOworICBpZiAodmFsID09IFREX05PVEhSKQorICAgIHJldHVybiAtMTsJCS8qIHRocmVhZCBtdXN0IGhhdmUgdGVybWluYXRlZCAqLworICBlbHNlIGlmICh2YWwgIT0gVERfT0spCisgICAgZXJyb3IgKCJsd3BfdG9fdGhyZWFkOiB0ZF90aHJfZ2V0X2luZm86ICVzLiIsIHRkX2Vycl9zdHJpbmcgKHZhbCkpOworCisgIHJldHVybiBCVUlMRF9USFJFQUQgKHRpLnRpX3RpZCwgUElER0VUIChsd3ApKTsKK30KKwwKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlzYXZlX2luZmVyaW9yX3BpZCAtIFNhdmUgaW5mZXJpb3JfcGlkIG9uIHRoZSBjbGVhbnVwIGxpc3QKKwlyZXN0b3JlX2luZmVyaW9yX3BpZCAtIFJlc3RvcmUgaW5mZXJpb3JfcGlkIGZyb20gdGhlIGNsZWFudXAgbGlzdAorCitTWU5PUFNJUworCisJc3RydWN0IGNsZWFudXAgKnNhdmVfaW5mZXJpb3JfcGlkICgpCisJdm9pZCByZXN0b3JlX2luZmVyaW9yX3BpZCAoaW50IHBpZCkKKworREVTQ1JJUFRJT04KKworCVRoZXNlIHR3byBmdW5jdGlvbnMgYWN0IGluIHVuaXNvbiB0byByZXN0b3JlIGluZmVyaW9yX3BpZCBpbgorCWNhc2Ugb2YgYW4gZXJyb3IuCisKK05PVEVTCisKKwlpbmZlcmlvcl9waWQgaXMgYSBnbG9iYWwgdmFyaWFibGUgdGhhdCBuZWVkcyB0byBiZSBjaGFuZ2VkIGJ5IG1hbnkgb2YKKwl0aGVzZSByb3V0aW5lcyBiZWZvcmUgY2FsbGluZyBmdW5jdGlvbnMgaW4gcHJvY2ZzLmMuICBJbiBvcmRlciB0bworCWd1YXJhbnRlZSB0aGF0IGluZmVyaW9yX3BpZCBnZXRzIHJlc3RvcmVkIChpbiBjYXNlIG9mIGVycm9ycyksIHlvdQorCW5lZWQgdG8gY2FsbCBzYXZlX2luZmVyaW9yX3BpZCBiZWZvcmUgY2hhbmdpbmcgaXQuICBBdCB0aGUgZW5kIG9mIHRoZQorCWZ1bmN0aW9uLCB5b3Ugc2hvdWxkIGludm9rZSBkb19jbGVhbnVwcyB0byByZXN0b3JlIGl0LgorCisgKi8KKworCitzdGF0aWMgc3RydWN0IGNsZWFudXAgKgorc2F2ZV9pbmZlcmlvcl9waWQgKCkKK3sKKyAgcmV0dXJuIG1ha2VfY2xlYW51cCAocmVzdG9yZV9pbmZlcmlvcl9waWQsIGluZmVyaW9yX3BpZCk7Cit9CisKK3N0YXRpYyB2b2lkCityZXN0b3JlX2luZmVyaW9yX3BpZCAocGlkKQorICAgICBpbnQgcGlkOworeworICBpbmZlcmlvcl9waWQgPSBwaWQ7Cit9CisMCisKKy8qIE1vc3QgdGFyZ2V0IHZlY3RvciBmdW5jdGlvbnMgZnJvbSBoZXJlIG9uIGFjdHVhbGx5IGp1c3QgcGFzcyB0aHJvdWdoIHRvCisgICBwcm9jZnMuYywgYXMgdGhleSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpZmljIGZvciB0aHJlYWRzLiAgKi8KKworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3NvbF90aHJlYWRfb3BlbiAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHByb2Nmc19vcHMudG9fb3BlbiAoYXJnLCBmcm9tX3R0eSk7Cit9CisKKy8qIEF0dGFjaCB0byBwcm9jZXNzIFBJRCwgdGhlbiBpbml0aWFsaXplIGZvciBkZWJ1Z2dpbmcgaXQKKyAgIGFuZCB3YWl0IGZvciB0aGUgdHJhY2UtdHJhcCB0aGF0IHJlc3VsdHMgZnJvbSBhdHRhY2hpbmcuICAqLworCitzdGF0aWMgdm9pZAorc29sX3RocmVhZF9hdHRhY2ggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHByb2Nmc19vcHMudG9fYXR0YWNoIChhcmdzLCBmcm9tX3R0eSk7CisgIC8qIE11c3QgZ2V0IHN5bWJvbHMgZnJvbSBzb2xpYnMgYmVmb3JlIGxpYnRocmVhZF9kYiBjYW4gcnVuISAqLworICBTT0xJQl9BREQgKChjaGFyICopMCwgZnJvbV90dHksIChzdHJ1Y3QgdGFyZ2V0X29wcyAqKTApOworICBpZiAoc29sX3RocmVhZF9hY3RpdmUpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgic29sLXRocmVhZCBhY3RpdmUuXG4iKTsKKyAgICAgIG1haW5fcGgucGlkID0gaW5mZXJpb3JfcGlkOyAvKiBTYXZlIGZvciB4ZmVyX21lbW9yeSAqLworICAgICAgcHVzaF90YXJnZXQgKCZzb2xfdGhyZWFkX29wcyk7CisgICAgICBpbmZlcmlvcl9waWQgPSBsd3BfdG9fdGhyZWFkIChpbmZlcmlvcl9waWQpOworICAgICAgaWYgKGluZmVyaW9yX3BpZCA9PSAtMSkKKwlpbmZlcmlvcl9waWQgPSBtYWluX3BoLnBpZDsKKyAgICAgIGVsc2UKKwlhZGRfdGhyZWFkIChpbmZlcmlvcl9waWQpOworICAgIH0KKyAgLyogWFhYIC0gbWlnaHQgd2FudCB0byBpdGVyYXRlIG92ZXIgYWxsIHRoZSB0aHJlYWRzIGFuZCByZWdpc3RlciB0aGVtLiAqLworfQorCisvKiBUYWtlIGEgcHJvZ3JhbSBwcmV2aW91c2x5IGF0dGFjaGVkIHRvIGFuZCBkZXRhY2hlcyBpdC4KKyAgIFRoZSBwcm9ncmFtIHJlc3VtZXMgZXhlY3V0aW9uIGFuZCB3aWxsIG5vIGxvbmdlciBzdG9wCisgICBvbiBzaWduYWxzLCBldGMuICBXZSdkIGJldHRlciBub3QgaGF2ZSBsZWZ0IGFueSBicmVha3BvaW50cworICAgaW4gdGhlIHByb2dyYW0gb3IgaXQnbGwgZGllIHdoZW4gaXQgaGl0cyBvbmUuICBGb3IgdGhpcworICAgdG8gd29yaywgaXQgbWF5IGJlIG5lY2Vzc2FyeSBmb3IgdGhlIHByb2Nlc3MgdG8gaGF2ZSBiZWVuCisgICBwcmV2aW91c2x5IGF0dGFjaGVkLiAgSXQgKm1pZ2h0KiB3b3JrIGlmIHRoZSBwcm9ncmFtIHdhcworICAgc3RhcnRlZCB2aWEgdGhlIG5vcm1hbCBwdHJhY2UgKFBUUkFDRV9UUkFDRU1FKS4gICovCisKK3N0YXRpYyB2b2lkCitzb2xfdGhyZWFkX2RldGFjaCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgdW5wdXNoX3RhcmdldCAoJnNvbF90aHJlYWRfb3BzKTsKKyAgcHJvY2ZzX29wcy50b19kZXRhY2ggKGFyZ3MsIGZyb21fdHR5KTsKK30KKworLyogUmVzdW1lIGV4ZWN1dGlvbiBvZiBwcm9jZXNzIFBJRC4gIElmIFNURVAgaXMgbm96ZXJvLCB0aGVuCisgICBqdXN0IHNpbmdsZSBzdGVwIGl0LiAgSWYgU0lHTkFMIGlzIG5vbnplcm8sIHJlc3RhcnQgaXQgd2l0aCB0aGF0CisgICBzaWduYWwgYWN0aXZhdGVkLiAgV2UgbWF5IGhhdmUgdG8gY29udmVydCBwaWQgZnJvbSBhIHRocmVhZC1pZCB0byBhbiBMV1AgaWQKKyAgIGZvciBwcm9jZnMuICAqLworCitzdGF0aWMgdm9pZAorc29sX3RocmVhZF9yZXN1bWUgKHBpZCwgc3RlcCwgc2lnbm8pCisgICAgIGludCBwaWQ7CisgICAgIGludCBzdGVwOworICAgICBlbnVtIHRhcmdldF9zaWduYWwgc2lnbm87Cit7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisKKyAgb2xkX2NoYWluID0gc2F2ZV9pbmZlcmlvcl9waWQgKCk7CisKKyAgaW5mZXJpb3JfcGlkID0gdGhyZWFkX3RvX2x3cCAoaW5mZXJpb3JfcGlkLCBtYWluX3BoLnBpZCk7CisgIGlmIChpbmZlcmlvcl9waWQgPT0gLTEpCisgICAgaW5mZXJpb3JfcGlkID0gcHJvY2ZzX2ZpcnN0X2F2YWlsYWJsZSAoKTsKKworICBpZiAocGlkICE9IC0xKQorICAgIHsKKyAgICAgIGludCBzYXZlX3BpZCA9IHBpZDsKKworICAgICAgcGlkID0gdGhyZWFkX3RvX2x3cCAocGlkLCAtMik7CisgICAgICBpZiAocGlkID09IC0yKQkJLyogSW5hY3RpdmUgdGhyZWFkICovCisJZXJyb3IgKCJUaGlzIHZlcnNpb24gb2YgU29sYXJpcyBjYW4ndCBzdGFydCBpbmFjdGl2ZSB0aHJlYWRzLiIpOworICAgICAgaWYgKGluZm9fdmVyYm9zZSAmJiBwaWQgPT0gLTEpCisJd2FybmluZyAoIlNwZWNpZmllZCB0aHJlYWQgJWQgc2VlbXMgdG8gaGF2ZSB0ZXJtaW5hdGVkIiwgCisJCSBHRVRfVEhSRUFEIChzYXZlX3BpZCkpOworICAgIH0KKworICBwcm9jZnNfb3BzLnRvX3Jlc3VtZSAocGlkLCBzdGVwLCBzaWdubyk7CisKKyAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7Cit9CisKKy8qIFdhaXQgZm9yIGFueSB0aHJlYWRzIHRvIHN0b3AuICBXZSBtYXkgaGF2ZSB0byBjb252ZXJ0IFBJRCBmcm9tIGEgdGhyZWFkIGlkCisgICB0byBhIExXUCBpZCwgYW5kIHZpY2UgdmVyc2Egb24gdGhlIHdheSBvdXQuICAqLworCitzdGF0aWMgaW50Citzb2xfdGhyZWFkX3dhaXQgKHBpZCwgb3Vyc3RhdHVzKQorICAgICBpbnQgcGlkOworICAgICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKm91cnN0YXR1czsKK3sKKyAgaW50IHJ0bnZhbDsKKyAgaW50IHNhdmVfcGlkOworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworCisgIHNhdmVfcGlkID0gaW5mZXJpb3JfcGlkOworICBvbGRfY2hhaW4gPSBzYXZlX2luZmVyaW9yX3BpZCAoKTsKKworICBpbmZlcmlvcl9waWQgPSB0aHJlYWRfdG9fbHdwIChpbmZlcmlvcl9waWQsIG1haW5fcGgucGlkKTsKKyAgaWYgKGluZmVyaW9yX3BpZCA9PSAtMSkKKyAgICBpbmZlcmlvcl9waWQgPSBwcm9jZnNfZmlyc3RfYXZhaWxhYmxlICgpOworCisgIGlmIChwaWQgIT0gLTEpCisgICAgeworICAgICAgaW50IHNhdmVfcGlkID0gcGlkOworCisgICAgICBwaWQgPSB0aHJlYWRfdG9fbHdwIChwaWQsIC0yKTsKKyAgICAgIGlmIChwaWQgPT0gLTIpCQkvKiBJbmFjdGl2ZSB0aHJlYWQgKi8KKwllcnJvciAoIlRoaXMgdmVyc2lvbiBvZiBTb2xhcmlzIGNhbid0IHN0YXJ0IGluYWN0aXZlIHRocmVhZHMuIik7CisgICAgICBpZiAoaW5mb192ZXJib3NlICYmIHBpZCA9PSAtMSkKKwl3YXJuaW5nICgiU3BlY2lmaWVkIHRocmVhZCAlZCBzZWVtcyB0byBoYXZlIHRlcm1pbmF0ZWQiLCAKKwkJIEdFVF9USFJFQUQgKHNhdmVfcGlkKSk7CisgICAgfQorCisgIHJ0bnZhbCA9IHByb2Nmc19vcHMudG9fd2FpdCAocGlkLCBvdXJzdGF0dXMpOworCisgIGlmIChvdXJzdGF0dXMtPmtpbmQgIT0gVEFSR0VUX1dBSVRLSU5EX0VYSVRFRCkKKyAgICB7CisgICAgICAvKiBNYXAgdGhlIExXUCBvZiBpbnRlcmVzdCBiYWNrIHRvIHRoZSBhcHByb3ByaWF0ZSB0aHJlYWQgSUQgKi8KKyAgICAgIHJ0bnZhbCA9IGx3cF90b190aHJlYWQgKHJ0bnZhbCk7CisgICAgICBpZiAocnRudmFsID09IC0xKQorCXJ0bnZhbCA9IHNhdmVfcGlkOworCisgICAgICAvKiBTZWUgaWYgd2UgaGF2ZSBhIG5ldyB0aHJlYWQgKi8KKyAgICAgIGlmIChpc190aHJlYWQgKHJ0bnZhbCkKKwkgICYmIHJ0bnZhbCAhPSBzYXZlX3BpZAorCSAgJiYgIWluX3RocmVhZF9saXN0IChydG52YWwpKQorCXsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIltOZXcgJXNdXG4iLCB0YXJnZXRfcGlkX3RvX3N0ciAocnRudmFsKSk7CisJICBhZGRfdGhyZWFkIChydG52YWwpOworCX0KKyAgICB9CisKKyAgLyogRHVyaW5nIHByb2Nlc3MgaW5pdGlhbGl6YXRpb24sIHdlIG1heSBnZXQgaGVyZSB3aXRob3V0IHRoZSB0aHJlYWQgcGFja2FnZQorICAgICBiZWluZyBpbml0aWFsaXplZCwgc2luY2UgdGhhdCBjYW4gb25seSBoYXBwZW4gYWZ0ZXIgd2UndmUgZm91bmQgdGhlIHNoYXJlZAorICAgICBsaWJzLiAgKi8KKworICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKKworICByZXR1cm4gcnRudmFsOworfQorCitzdGF0aWMgdm9pZAorc29sX3RocmVhZF9mZXRjaF9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHRocmVhZF90IHRocmVhZDsKKyAgdGRfdGhyaGFuZGxlX3QgdGhhbmRsZTsKKyAgdGRfZXJyX2UgdmFsOworICBwcmdyZWdzZXRfdCBncmVnc2V0OworICBwcmZwcmVnc2V0X3QgZnByZWdzZXQ7CisjaWYgMAorICBpbnQgeHJlZ3NpemU7CisgIGNhZGRyX3QgeHJlZ3NldDsKKyNlbmRpZgorCisgIGlmICghaXNfdGhyZWFkIChpbmZlcmlvcl9waWQpKQorICAgIHsgLyogTFdQOiBwYXNzIHRoZSByZXF1ZXN0IG9uIHRvIHByb2Nmcy5jICovCisgICAgICBpZiAodGFyZ2V0X2hhc19leGVjdXRpb24pCisJcHJvY2ZzX29wcy50b19mZXRjaF9yZWdpc3RlcnMgKHJlZ25vKTsKKyAgICAgIGVsc2UKKwlvcmlnX2NvcmVfb3BzLnRvX2ZldGNoX3JlZ2lzdGVycyAocmVnbm8pOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBTb2xhcmlzIHRocmVhZDogY29udmVydCBpbmZlcmlvcl9waWQgaW50byBhIHRkX3RocmhhbmRsZV90ICovCisKKyAgdGhyZWFkID0gR0VUX1RIUkVBRCAoaW5mZXJpb3JfcGlkKTsKKworICBpZiAodGhyZWFkID09IDApCisgICAgZXJyb3IgKCJzb2xfdGhyZWFkX2ZldGNoX3JlZ2lzdGVyczogIHRocmVhZCA9PSAwIik7CisKKyAgdmFsID0gcF90ZF90YV9tYXBfaWQydGhyIChtYWluX3RhLCB0aHJlYWQsICZ0aGFuZGxlKTsKKyAgaWYgKHZhbCAhPSBURF9PSykKKyAgICBlcnJvciAoInNvbF90aHJlYWRfZmV0Y2hfcmVnaXN0ZXJzOiB0ZF90YV9tYXBfaWQydGhyOiAlcyIsCisJICAgdGRfZXJyX3N0cmluZyAodmFsKSk7CisKKyAgLyogR2V0IHRoZSBpbnRlZ2VyIHJlZ3MgKi8KKworICB2YWwgPSBwX3RkX3Rocl9nZXRncmVncyAoJnRoYW5kbGUsIGdyZWdzZXQpOworICBpZiAodmFsICE9IFREX09LCisgICAgICAmJiB2YWwgIT0gVERfUEFSVElBTFJFRykKKyAgICBlcnJvciAoInNvbF90aHJlYWRfZmV0Y2hfcmVnaXN0ZXJzOiB0ZF90aHJfZ2V0Z3JlZ3MgJXMiLAorCSAgIHRkX2Vycl9zdHJpbmcgKHZhbCkpOworCisgIC8qIEZvciB0aGUgc3BhcmMsIFREX1BBUlRJQUxSRUcgbWVhbnMgdGhhdCBvbmx5IGkwLT5pNywgbDAtPmw3LCBwYyBhbmQgc3AKKyAgICAgYXJlIHNhdmVkIChieSBhIHRocmVhZCBjb250ZXh0IHN3aXRjaCkuICAqLworCisgIC8qIEFuZCwgbm93IHRoZSBmcCByZWdzICovCisKKyAgdmFsID0gcF90ZF90aHJfZ2V0ZnByZWdzICgmdGhhbmRsZSwgJmZwcmVnc2V0KTsKKyAgaWYgKHZhbCAhPSBURF9PSworICAgICAgJiYgdmFsICE9IFREX05PRlBSRUdTKQorICAgIGVycm9yICgic29sX3RocmVhZF9mZXRjaF9yZWdpc3RlcnM6IHRkX3Rocl9nZXRmcHJlZ3MgJXMiLAorCSAgIHRkX2Vycl9zdHJpbmcgKHZhbCkpOworCisvKiBOb3RlIHRoYXQgd2UgbXVzdCBjYWxsIHN1cHBseV97ZyBmcH1yZWdzZXQgKmFmdGVyKiBjYWxsaW5nIHRoZSB0ZCByb3V0aW5lcworICAgYmVjYXVzZSB0aGUgdGQgcm91dGluZXMgY2FsbCBwc19sZ2V0KiB3aGljaCBhZmZlY3QgdGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhlCisgICByZWdpc3RlcnMgYXJyYXkuICAqLworCisgIHN1cHBseV9ncmVnc2V0IChncmVnc2V0KTsKKyAgc3VwcGx5X2ZwcmVnc2V0ICgmZnByZWdzZXQpOworCisjaWYgMAorLyogdGhyZWFkX2RiIGRvZXNuJ3Qgc2VlbSB0byBoYW5kbGUgdGhpcyByaWdodCAqLworICB2YWwgPSB0ZF90aHJfZ2V0eHJlZ3NpemUgKCZ0aGFuZGxlLCAmeHJlZ3NpemUpOworICBpZiAodmFsICE9IFREX09LICYmIHZhbCAhPSBURF9OT1hSRUdTKQorICAgIGVycm9yICgic29sX3RocmVhZF9mZXRjaF9yZWdpc3RlcnM6IHRkX3Rocl9nZXR4cmVnc2l6ZSAlcyIsCisJICAgdGRfZXJyX3N0cmluZyAodmFsKSk7CisKKyAgaWYgKHZhbCA9PSBURF9PSykKKyAgICB7CisgICAgICB4cmVnc2V0ID0gYWxsb2NhICh4cmVnc2l6ZSk7CisgICAgICB2YWwgPSB0ZF90aHJfZ2V0eHJlZ3MgKCZ0aGFuZGxlLCB4cmVnc2V0KTsKKyAgICAgIGlmICh2YWwgIT0gVERfT0spCisJZXJyb3IgKCJzb2xfdGhyZWFkX2ZldGNoX3JlZ2lzdGVyczogdGRfdGhyX2dldHhyZWdzICVzIiwKKwkgICAgICAgdGRfZXJyX3N0cmluZyAodmFsKSk7CisgICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitzb2xfdGhyZWFkX3N0b3JlX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgdGhyZWFkX3QgdGhyZWFkOworICB0ZF90aHJoYW5kbGVfdCB0aGFuZGxlOworICB0ZF9lcnJfZSB2YWw7CisgIHByZ3JlZ3NldF90IHJlZ3NldDsKKyAgcHJmcHJlZ3NldF90IGZwcmVnc2V0OworI2lmIDAKKyAgaW50IHhyZWdzaXplOworICBjYWRkcl90IHhyZWdzZXQ7CisjZW5kaWYKKworICBpZiAoIWlzX3RocmVhZCAoaW5mZXJpb3JfcGlkKSkKKyAgICB7IC8qIExXUDogcGFzcyB0aGUgcmVxdWVzdCBvbiB0byBwcm9jZnMuYyAqLworICAgICAgcHJvY2ZzX29wcy50b19zdG9yZV9yZWdpc3RlcnMgKHJlZ25vKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogU29sYXJpcyB0aHJlYWQ6IGNvbnZlcnQgaW5mZXJpb3JfcGlkIGludG8gYSB0ZF90aHJoYW5kbGVfdCAqLworCisgIHRocmVhZCA9IEdFVF9USFJFQUQgKGluZmVyaW9yX3BpZCk7CisKKyAgdmFsID0gcF90ZF90YV9tYXBfaWQydGhyIChtYWluX3RhLCB0aHJlYWQsICZ0aGFuZGxlKTsKKyAgaWYgKHZhbCAhPSBURF9PSykKKyAgICBlcnJvciAoInNvbF90aHJlYWRfc3RvcmVfcmVnaXN0ZXJzOiB0ZF90YV9tYXBfaWQydGhyICVzIiwKKwkgICB0ZF9lcnJfc3RyaW5nICh2YWwpKTsKKworICBpZiAocmVnbm8gIT0gLTEpCisgICAgewkJCQkvKiBOb3Qgd3JpdGluZyBhbGwgdGhlIHJlZ3MgKi8KKyAgICAgIC8qIHNhdmUgbmV3IHJlZ2lzdGVyIHZhbHVlICovCisgICAgICBjaGFyIG9sZF92YWx1ZVtSRUdJU1RFUl9TSVpFXTsKKyAgICAgIG1lbWNweShvbGRfdmFsdWUsICYgcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUocmVnbm8pXSwgUkVHSVNURVJfU0laRSk7CisKKyAgICAgIHZhbCA9IHBfdGRfdGhyX2dldGdyZWdzICgmdGhhbmRsZSwgcmVnc2V0KTsKKyAgICAgIGlmICh2YWwgIT0gVERfT0spCisJZXJyb3IgKCJzb2xfdGhyZWFkX3N0b3JlX3JlZ2lzdGVyczogdGRfdGhyX2dldGdyZWdzICVzIiwKKwkgICAgICAgdGRfZXJyX3N0cmluZyAodmFsKSk7CisgICAgICB2YWwgPSBwX3RkX3Rocl9nZXRmcHJlZ3MgKCZ0aGFuZGxlLCAmZnByZWdzZXQpOworICAgICAgaWYgKHZhbCAhPSBURF9PSykKKwllcnJvciAoInNvbF90aHJlYWRfc3RvcmVfcmVnaXN0ZXJzOiB0ZF90aHJfZ2V0ZnByZWdzICVzIiwKKwkgICAgICAgdGRfZXJyX3N0cmluZyAodmFsKSk7CisKKyAgICAgIC8qIHJlc3RvcmUgbmV3IHJlZ2lzdGVyIHZhbHVlICovCisgICAgICBtZW1jcHkoJiByZWdpc3RlcnNbUkVHSVNURVJfQllURShyZWdubyldLCBvbGRfdmFsdWUsIFJFR0lTVEVSX1NJWkUpOworCisjaWYgMAorLyogdGhyZWFkX2RiIGRvZXNuJ3Qgc2VlbSB0byBoYW5kbGUgdGhpcyByaWdodCAqLworICAgICAgdmFsID0gdGRfdGhyX2dldHhyZWdzaXplICgmdGhhbmRsZSwgJnhyZWdzaXplKTsKKyAgICAgIGlmICh2YWwgIT0gVERfT0sgJiYgdmFsICE9IFREX05PWFJFR1MpCisJZXJyb3IgKCJzb2xfdGhyZWFkX3N0b3JlX3JlZ2lzdGVyczogdGRfdGhyX2dldHhyZWdzaXplICVzIiwKKwkgICAgICAgdGRfZXJyX3N0cmluZyAodmFsKSk7CisKKyAgICAgIGlmICh2YWwgPT0gVERfT0spCisJeworCSAgeHJlZ3NldCA9IGFsbG9jYSAoeHJlZ3NpemUpOworCSAgdmFsID0gdGRfdGhyX2dldHhyZWdzICgmdGhhbmRsZSwgeHJlZ3NldCk7CisJICBpZiAodmFsICE9IFREX09LKQorCSAgICBlcnJvciAoInNvbF90aHJlYWRfc3RvcmVfcmVnaXN0ZXJzOiB0ZF90aHJfZ2V0eHJlZ3MgJXMiLAorCQkgICB0ZF9lcnJfc3RyaW5nICh2YWwpKTsKKwl9CisjZW5kaWYKKyAgICB9CisKKyAgZmlsbF9ncmVnc2V0IChyZWdzZXQsIHJlZ25vKTsKKyAgZmlsbF9mcHJlZ3NldCAoJmZwcmVnc2V0LCByZWdubyk7CisKKyAgdmFsID0gcF90ZF90aHJfc2V0Z3JlZ3MgKCZ0aGFuZGxlLCByZWdzZXQpOworICBpZiAodmFsICE9IFREX09LKQorICAgIGVycm9yICgic29sX3RocmVhZF9zdG9yZV9yZWdpc3RlcnM6IHRkX3Rocl9zZXRncmVncyAlcyIsCisJICAgdGRfZXJyX3N0cmluZyAodmFsKSk7CisgIHZhbCA9IHBfdGRfdGhyX3NldGZwcmVncyAoJnRoYW5kbGUsICZmcHJlZ3NldCk7CisgIGlmICh2YWwgIT0gVERfT0spCisgICAgZXJyb3IgKCJzb2xfdGhyZWFkX3N0b3JlX3JlZ2lzdGVyczogdGRfdGhyX3NldGZwcmVncyAlcyIsCisJICAgdGRfZXJyX3N0cmluZyAodmFsKSk7CisKKyNpZiAwCisvKiB0aHJlYWRfZGIgZG9lc24ndCBzZWVtIHRvIGhhbmRsZSB0aGlzIHJpZ2h0ICovCisgIHZhbCA9IHRkX3Rocl9nZXR4cmVnc2l6ZSAoJnRoYW5kbGUsICZ4cmVnc2l6ZSk7CisgIGlmICh2YWwgIT0gVERfT0sgJiYgdmFsICE9IFREX05PWFJFR1MpCisgICAgZXJyb3IgKCJzb2xfdGhyZWFkX3N0b3JlX3JlZ2lzdGVyczogdGRfdGhyX2dldHhyZWdzaXplICVzIiwKKwkgICB0ZF9lcnJfc3RyaW5nICh2YWwpKTsKKworICAvKiBTaG91bGQgcHJvYmFibHkgZG8gc29tZXRoaW5nIGFib3V0IHdyaXRpbmcgdGhlIHhyZWdzIGhlcmUsIGJ1dCB3aGF0IGFyZQorICAgICB0aGV5PyAqLworI2VuZGlmCit9CisKKy8qIEdldCByZWFkeSB0byBtb2RpZnkgdGhlIHJlZ2lzdGVycyBhcnJheS4gIE9uIG1hY2hpbmVzIHdoaWNoIHN0b3JlCisgICBpbmRpdmlkdWFsIHJlZ2lzdGVycywgdGhpcyBkb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuICBPbiBtYWNoaW5lcworICAgd2hpY2ggc3RvcmUgYWxsIHRoZSByZWdpc3RlcnMgaW4gb25lIGZlbGwgc3dvb3AsIHRoaXMgbWFrZXMgc3VyZQorICAgdGhhdCByZWdpc3RlcnMgY29udGFpbnMgYWxsIHRoZSByZWdpc3RlcnMgZnJvbSB0aGUgcHJvZ3JhbSBiZWluZworICAgZGVidWdnZWQuICAqLworCitzdGF0aWMgdm9pZAorc29sX3RocmVhZF9wcmVwYXJlX3RvX3N0b3JlICgpCit7CisgIHByb2Nmc19vcHMudG9fcHJlcGFyZV90b19zdG9yZSAoKTsKK30KKworc3RhdGljIGludAorc29sX3RocmVhZF94ZmVyX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4sIGRvd3JpdGUsIHRhcmdldCkKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IGRvd3JpdGU7CisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQ7IC8qIGlnbm9yZWQgKi8KK3sKKyAgaW50IHJldHZhbDsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKworICBvbGRfY2hhaW4gPSBzYXZlX2luZmVyaW9yX3BpZCAoKTsKKworICBpZiAoaXNfdGhyZWFkIChpbmZlcmlvcl9waWQpIHx8CQkvKiBBIHRocmVhZCAqLworICAgICAgIXRhcmdldF90aHJlYWRfYWxpdmUgKGluZmVyaW9yX3BpZCkpCS8qIEFuIGx3cCwgYnV0IG5vdCBhbGl2ZSAqLworICAgIGluZmVyaW9yX3BpZCA9IHByb2Nmc19maXJzdF9hdmFpbGFibGUgKCk7CS8qIEZpbmQgYW55IGxpdmUgbHdwLiAgKi8KKyAgLyogTm90ZTogZG9uJ3QgbmVlZCB0byBjYWxsIHN3aXRjaF90b190aHJlYWQ7IHdlJ3JlIGp1c3QgcmVhZGluZyBtZW1vcnkuICAqLworCisgIGlmICh0YXJnZXRfaGFzX2V4ZWN1dGlvbikKKyAgICByZXR2YWwgPSBwcm9jZnNfb3BzLnRvX3hmZXJfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbiwgZG93cml0ZSwgdGFyZ2V0KTsKKyAgZWxzZQorICAgIHJldHZhbCA9IG9yaWdfY29yZV9vcHMudG9feGZlcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuLAorCQkJCQkgICBkb3dyaXRlLCB0YXJnZXQpOworCisgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIFByaW50IHN0YXR1cyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHdlJ3JlIGFjY2Vzc2luZy4gICovCisKK3N0YXRpYyB2b2lkCitzb2xfdGhyZWFkX2ZpbGVzX2luZm8gKGlnbm9yZSkKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKmlnbm9yZTsKK3sKKyAgcHJvY2ZzX29wcy50b19maWxlc19pbmZvIChpZ25vcmUpOworfQorCitzdGF0aWMgdm9pZAorc29sX3RocmVhZF9raWxsX2luZmVyaW9yICgpCit7CisgIHByb2Nmc19vcHMudG9fa2lsbCAoKTsKK30KKworc3RhdGljIHZvaWQKK3NvbF90aHJlYWRfbm90aWNlX3NpZ25hbHMgKHBpZCkKKyAgICAgaW50IHBpZDsKK3sKKyAgcHJvY2ZzX29wcy50b19ub3RpY2Vfc2lnbmFscyAoUElER0VUIChwaWQpKTsKK30KKworLyogRm9yayBhbiBpbmZlcmlvciBwcm9jZXNzLCBhbmQgc3RhcnQgZGVidWdnaW5nIGl0IHdpdGggL3Byb2MuICAqLworCitzdGF0aWMgdm9pZAorc29sX3RocmVhZF9jcmVhdGVfaW5mZXJpb3IgKGV4ZWNfZmlsZSwgYWxsYXJncywgZW52KQorICAgICBjaGFyICpleGVjX2ZpbGU7CisgICAgIGNoYXIgKmFsbGFyZ3M7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIHByb2Nmc19vcHMudG9fY3JlYXRlX2luZmVyaW9yIChleGVjX2ZpbGUsIGFsbGFyZ3MsIGVudik7CisKKyAgaWYgKHNvbF90aHJlYWRfYWN0aXZlICYmIGluZmVyaW9yX3BpZCAhPSAwKQorICAgIHsKKyAgICAgIG1haW5fcGgucGlkID0gaW5mZXJpb3JfcGlkOyAvKiBTYXZlIGZvciB4ZmVyX21lbW9yeSAqLworCisgICAgICBwdXNoX3RhcmdldCAoJnNvbF90aHJlYWRfb3BzKTsKKworICAgICAgaW5mZXJpb3JfcGlkID0gbHdwX3RvX3RocmVhZCAoaW5mZXJpb3JfcGlkKTsKKyAgICAgIGlmIChpbmZlcmlvcl9waWQgPT0gLTEpCisJaW5mZXJpb3JfcGlkID0gbWFpbl9waC5waWQ7CisKKyAgICAgIGFkZF90aHJlYWQgKGluZmVyaW9yX3BpZCk7CisgICAgfQorfQorCisvKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5ldmVyIGEgbmV3IHN5bWJvbCB0YWJsZSBpcyByZWFkIGluLCBvciB3aGVuIGFsbAorICAgc3ltYm9sIHRhYmxlcyBhcmUgcmVtb3ZlZC4gIGxpYnRocmVhZF9kYiBjYW4gb25seSBiZSBpbml0aWFsaXplZCB3aGVuIGl0CisgICBmaW5kcyB0aGUgcmlnaHQgdmFyaWFibGVzIGluIGxpYnRocmVhZC5zby4gIFNpbmNlIGl0J3MgYSBzaGFyZWQgbGlicmFyeSwKKyAgIHRob3NlIHZhcmlhYmxlcyBkb24ndCBzaG93IHVwIHVudGlsIHRoZSBsaWJyYXJ5IGdldHMgbWFwcGVkIGFuZCB0aGUgc3ltYm9sCisgICB0YWJsZSBpcyByZWFkIGluLiAgKi8KKwordm9pZAorc29sX3RocmVhZF9uZXdfb2JqZmlsZSAob2JqZmlsZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHRkX2Vycl9lIHZhbDsKKworICBpZiAoIW9iamZpbGUpCisgICAgeworICAgICAgc29sX3RocmVhZF9hY3RpdmUgPSAwOworCisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIGRvbid0IGRvIGFueXRoaW5nIGlmIGluaXQgZmFpbGVkIHRvIHJlc29sdmUgdGhlIGxpYnRocmVhZF9kYiBsaWJyYXJ5ICovCisgIGlmICghcHJvY2ZzX3N1cHByZXNzX3J1bikKKyAgICByZXR1cm47CisKKyAgLyogTm93LCBpbml0aWFsaXplIHRoZSB0aHJlYWQgZGVidWdnaW5nIGxpYnJhcnkuICBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYWZ0ZXIKKyAgICAgdGhlIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvY2F0ZWQgYmVjYXVzZSBpdCBuZWVkcyBpbmZvcm1hdGlvbiBmcm9tIHRoZQorICAgICB1c2VyJ3MgdGhyZWFkIGxpYnJhcnkuICAqLworCisgIHZhbCA9IHBfdGRfaW5pdCAoKTsKKyAgaWYgKHZhbCAhPSBURF9PSykKKyAgICBlcnJvciAoInRhcmdldF9uZXdfb2JqZmlsZTogdGRfaW5pdDogJXMiLCB0ZF9lcnJfc3RyaW5nICh2YWwpKTsKKworICB2YWwgPSBwX3RkX3RhX25ldyAoJm1haW5fcGgsICZtYWluX3RhKTsKKyAgaWYgKHZhbCA9PSBURF9OT0xJQlRIUkVBRCkKKyAgICByZXR1cm47CisgIGVsc2UgaWYgKHZhbCAhPSBURF9PSykKKyAgICBlcnJvciAoInRhcmdldF9uZXdfb2JqZmlsZTogdGRfdGFfbmV3OiAlcyIsIHRkX2Vycl9zdHJpbmcgKHZhbCkpOworCisgIHNvbF90aHJlYWRfYWN0aXZlID0gMTsKK30KKworLyogQ2xlYW4gdXAgYWZ0ZXIgdGhlIGluZmVyaW9yIGRpZXMuICAqLworCitzdGF0aWMgdm9pZAorc29sX3RocmVhZF9tb3Vybl9pbmZlcmlvciAoKQoreworICB1bnB1c2hfdGFyZ2V0ICgmc29sX3RocmVhZF9vcHMpOworICBwcm9jZnNfb3BzLnRvX21vdXJuX2luZmVyaW9yICgpOworfQorCisvKiBNYXJrIG91ciB0YXJnZXQtc3RydWN0IGFzIGVsaWdpYmxlIGZvciBzdHJheSAicnVuIiBhbmQgImF0dGFjaCIgY29tbWFuZHMuICAqLworCitzdGF0aWMgaW50Citzb2xfdGhyZWFkX2Nhbl9ydW4gKCkKK3sKKyAgcmV0dXJuIHByb2Nmc19zdXBwcmVzc19ydW47Cit9CisKKy8qIAorCitMT0NBTCBGVU5DVElPTgorCisJc29sX3RocmVhZF9hbGl2ZSAgICAgLSB0ZXN0IHRocmVhZCBmb3IgImFsaXZlbmVzcyIKKworU1lOT1BTSVMKKworCXN0YXRpYyBib29sIHNvbF90aHJlYWRfYWxpdmUgKGludCBwaWQpOworCitERVNDUklQVElPTgorCisJcmV0dXJucyB0cnVlIGlmIHRocmVhZCBzdGlsbCBhY3RpdmUgaW4gaW5mZXJpb3IuCisKKyAqLworCitzdGF0aWMgaW50Citzb2xfdGhyZWFkX2FsaXZlIChwaWQpCisgICAgIGludCBwaWQ7Cit7CisgIGlmIChpc190aHJlYWQgKHBpZCkpCQkvKiBub24ta2VybmVsIHRocmVhZCAqLworICAgIHsKKyAgICAgIHRkX2Vycl9lIHZhbDsKKyAgICAgIHRkX3RocmhhbmRsZV90IHRoOworCisgICAgICBwaWQgPSBHRVRfVEhSRUFEIChwaWQpOworICAgICAgaWYgKCh2YWwgPSBwX3RkX3RhX21hcF9pZDJ0aHIgKG1haW5fdGEsIHBpZCwgJnRoKSkgIT0gVERfT0spCisJcmV0dXJuIDA7CS8qIHRocmVhZCBub3QgZm91bmQgKi8KKyAgICAgIGlmICgodmFsID0gcF90ZF90aHJfdmFsaWRhdGUgKCZ0aCkpICE9IFREX09LKQorCXJldHVybiAwOwkvKiB0aHJlYWQgbm90IHZhbGlkICovCisgICAgICByZXR1cm4gMTsJCS8qIGtub3duIHRocmVhZDogcmV0dXJuIHRydWUgKi8KKyAgICB9CisgIGVsc2UJCQkvKiBrZXJuZWwgdGhyZWFkIChMV1ApOiBsZXQgcHJvY2ZzIHRlc3QgaXQgKi8KKyAgICB7CisgICAgICBpZiAodGFyZ2V0X2hhc19leGVjdXRpb24pCisJcmV0dXJuIHByb2Nmc19vcHMudG9fdGhyZWFkX2FsaXZlIChwaWQpOworICAgICAgZWxzZQorCXJldHVybiBvcmlnX2NvcmVfb3BzLnRvX3RocmVhZF9hbGl2ZSAocGlkKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzb2xfdGhyZWFkX3N0b3AgKCkKK3sKKyAgcHJvY2ZzX29wcy50b19zdG9wICgpOworfQorDAorLyogVGhlc2Ugcm91dGluZXMgaW1wbGVtZW50IHRoZSBsb3dlciBoYWxmIG9mIHRoZSB0aHJlYWRfZGIgaW50ZXJmYWNlLiAgSWU6IHRoZQorICAgcHNfKiByb3V0aW5lcy4gICovCisKKy8qIFZhcmlvdXMgdmVyc2lvbnMgb2YgPHByb2Nfc2VydmljZS5oPiBoYXZlIHNsaWdodGx5CisgICBkaWZmZXJlbnQgZnVuY3Rpb24gcHJvdG90eXBlcy4gIEluIHBhcnRpY3VsYXIsIHdlIGhhdmUKKworICAgICAgTkVXRVIJCSAgICAJT0xERVIKKyAgICAgIHN0cnVjdCBwc19wcm9jaGFuZGxlICogIAljb25zdCBzdHJ1Y3QgcHNfcHJvY2hhbmRsZSAqCisgICAgICB2b2lkKgkJCWNoYXIqCisgICAgICBjb25zdCB2b2lkKgkJY2hhcioKKyAgICAgIGludAkJCXNpemVfdAorCisgICBXaGljaCBvbmUgeW91IGhhdmUgZGVwZW5kcyBvbiBzb2xhcmlzIHZlcnNpb24gYW5kIHdoYXQKKyAgIHBhdGNoZXMgeW91J3ZlIGFwcGxpZWQuICBPbiB0aGUgdGhlb3J5IHRoYXQgdGhlcmUgYXJlCisgICBvbmx5IHR3byBtYWpvciB2YXJpYW50cywgd2UgaGF2ZSBjb25maWd1cmUgY2hlY2sgdGhlCisgICBwcm90b3R5cGUgb2YgcHNfcGR3cml0ZSAoKSwgYW5kIHVzZSB0aGF0IGluZm8gdG8gbWFrZQorICAgYXBwcm9wcmlhdGUgdHlwZWRlZnMgaGVyZS4gKi8KKworI2lmZGVmIFBST0NfU0VSVklDRV9JU19PTEQKK3R5cGVkZWYgY29uc3Qgc3RydWN0IHBzX3Byb2NoYW5kbGUgKiBnZGJfcHNfcHJvY2hhbmRsZV90OwordHlwZWRlZiBjaGFyICogZ2RiX3BzX3JlYWRfYnVmX3Q7Cit0eXBlZGVmIGNoYXIgKiBnZGJfcHNfd3JpdGVfYnVmX3Q7Cit0eXBlZGVmIGludCBnZGJfcHNfc2l6ZV90OworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IHBzX3Byb2NoYW5kbGUgKiBnZGJfcHNfcHJvY2hhbmRsZV90OwordHlwZWRlZiB2b2lkICogZ2RiX3BzX3JlYWRfYnVmX3Q7Cit0eXBlZGVmIGNvbnN0IHZvaWQgKiBnZGJfcHNfd3JpdGVfYnVmX3Q7Cit0eXBlZGVmIHNpemVfdCBnZGJfcHNfc2l6ZV90OworI2VuZGlmCisKKworLyogVGhlIG5leHQgZm91ciByb3V0aW5lcyBhcmUgY2FsbGVkIGJ5IHRocmVhZF9kYiB0byB0ZWxsIHVzIHRvIHN0b3AgYW5kIHN0b3AKKyAgIGEgcGFydGljdWxhciBwcm9jZXNzIG9yIGx3cC4gIFNpbmNlIEdEQiBlbnN1cmVzIHRoYXQgdGhlc2UgYXJlIGFsbCBzdG9wcGVkCisgICBieSB0aGUgdGltZSB3ZSBjYWxsIGFueXRoaW5nIGluIHRocmVhZF9kYiwgdGhlc2Ugcm91dGluZXMgbmVlZCB0byBkbworICAgbm90aGluZy4gICovCisKK3BzX2Vycl9lCitwc19wc3RvcCAoZ2RiX3BzX3Byb2NoYW5kbGVfdCBwaCkKK3sKKyAgcmV0dXJuIFBTX09LOworfQorCitwc19lcnJfZQorcHNfcGNvbnRpbnVlIChnZGJfcHNfcHJvY2hhbmRsZV90IHBoKQoreworICByZXR1cm4gUFNfT0s7Cit9CisKK3BzX2Vycl9lCitwc19sc3RvcCAoZ2RiX3BzX3Byb2NoYW5kbGVfdCBwaCwgbHdwaWRfdCBsd3BpZCkKK3sKKyAgcmV0dXJuIFBTX09LOworfQorCitwc19lcnJfZQorcHNfbGNvbnRpbnVlIChnZGJfcHNfcHJvY2hhbmRsZV90IHBoLCBsd3BpZF90IGx3cGlkKQoreworICByZXR1cm4gUFNfT0s7Cit9CisKK3BzX2Vycl9lCitwc19wZ2xvYmFsX2xvb2t1cCAoZ2RiX3BzX3Byb2NoYW5kbGVfdCBwaCwgY29uc3QgY2hhciAqbGRfb2JqZWN0X25hbWUsCisJCSAgIGNvbnN0IGNoYXIgKmxkX3N5bWJvbF9uYW1lLCBwYWRkcl90ICpsZF9zeW1ib2xfYWRkcikKK3sKKyAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptczsKKworICBtcyA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAobGRfc3ltYm9sX25hbWUsIE5VTEwsIE5VTEwpOworCisgIGlmICghbXMpCisgICAgcmV0dXJuIFBTX05PU1lNOworCisgICpsZF9zeW1ib2xfYWRkciA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtcyk7CisKKyAgcmV0dXJuIFBTX09LOworfQorCisvKiBDb21tb24gcm91dGluZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBtZW1vcnkuICAqLworCitzdGF0aWMgcHNfZXJyX2UKK3J3X2NvbW1vbiAoaW50IGRvd3JpdGUsIGNvbnN0IHN0cnVjdCBwc19wcm9jaGFuZGxlICpwaCwgcGFkZHJfdCBhZGRyLAorCSAgIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisKKyAgb2xkX2NoYWluID0gc2F2ZV9pbmZlcmlvcl9waWQgKCk7CisKKyAgaWYgKGlzX3RocmVhZCAoaW5mZXJpb3JfcGlkKSB8fAkJLyogQSB0aHJlYWQgKi8KKyAgICAgICF0YXJnZXRfdGhyZWFkX2FsaXZlIChpbmZlcmlvcl9waWQpKQkvKiBBbiBsd3AsIGJ1dCBub3QgYWxpdmUgKi8KKyAgICBpbmZlcmlvcl9waWQgPSBwcm9jZnNfZmlyc3RfYXZhaWxhYmxlICgpOwkvKiBGaW5kIGFueSBsaXZlIGx3cC4gICovCisgIC8qIE5vdGU6IGRvbid0IG5lZWQgdG8gY2FsbCBzd2l0Y2hfdG9fdGhyZWFkOyB3ZSdyZSBqdXN0IHJlYWRpbmcgbWVtb3J5LiAgKi8KKworICB3aGlsZSAoc2l6ZSA+IDApCisgICAgeworICAgICAgaW50IGNjOworCisgICAgICBpZiAodGFyZ2V0X2hhc19leGVjdXRpb24pCisJY2MgPSBwcm9jZnNfb3BzLnRvX3hmZXJfbWVtb3J5IChhZGRyLCBidWYsIHNpemUsIGRvd3JpdGUsICZwcm9jZnNfb3BzKTsKKyAgICAgIGVsc2UKKwljYyA9IG9yaWdfY29yZV9vcHMudG9feGZlcl9tZW1vcnkgKGFkZHIsIGJ1Ziwgc2l6ZSwgZG93cml0ZSwgJmNvcmVfb3BzKTsKKworICAgICAgaWYgKGNjIDwgMCkKKwl7CisJICBpZiAoZG93cml0ZSA9PSAwKQorCSAgICBwcmludF9zeXNfZXJybXNnICgicndfY29tbW9uICgpOiByZWFkIiwgZXJybm8pOworCSAgZWxzZQorCSAgICBwcmludF9zeXNfZXJybXNnICgicndfY29tbW9uICgpOiB3cml0ZSIsIGVycm5vKTsKKworCSAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisKKwkgIHJldHVybiBQU19FUlI7CisJfQorICAgICAgc2l6ZSAtPSBjYzsKKyAgICAgIGJ1ZiArPSBjYzsKKyAgICB9CisKKyAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisKKyAgcmV0dXJuIFBTX09LOworfQorCitwc19lcnJfZQorcHNfcGRyZWFkIChnZGJfcHNfcHJvY2hhbmRsZV90IHBoLCBwYWRkcl90IGFkZHIsCisJICAgZ2RiX3BzX3JlYWRfYnVmX3QgYnVmLCBnZGJfcHNfc2l6ZV90IHNpemUpCit7CisgIHJldHVybiByd19jb21tb24gKDAsIHBoLCBhZGRyLCBidWYsIHNpemUpOworfQorCitwc19lcnJfZQorcHNfcGR3cml0ZSAoZ2RiX3BzX3Byb2NoYW5kbGVfdCBwaCwgcGFkZHJfdCBhZGRyLAorCSAgICBnZGJfcHNfd3JpdGVfYnVmX3QgYnVmLCBnZGJfcHNfc2l6ZV90IHNpemUpCit7CisgIHJldHVybiByd19jb21tb24gKDEsIHBoLCBhZGRyLCAoY2hhciopIGJ1Ziwgc2l6ZSk7Cit9CisKK3BzX2Vycl9lCitwc19wdHJlYWQgKGdkYl9wc19wcm9jaGFuZGxlX3QgcGgsIHBhZGRyX3QgYWRkciwKKwkgICBnZGJfcHNfcmVhZF9idWZfdCBidWYsIGdkYl9wc19zaXplX3Qgc2l6ZSkKK3sKKyAgcmV0dXJuIHJ3X2NvbW1vbiAoMCwgcGgsIGFkZHIsIGJ1Ziwgc2l6ZSk7Cit9CisKK3BzX2Vycl9lCitwc19wdHdyaXRlIChnZGJfcHNfcHJvY2hhbmRsZV90IHBoLCBwYWRkcl90IGFkZHIsCisJICAgIGdkYl9wc193cml0ZV9idWZfdCBidWYsIGdkYl9wc19zaXplX3Qgc2l6ZSkKK3sKKyAgcmV0dXJuIHJ3X2NvbW1vbiAoMSwgcGgsIGFkZHIsIChjaGFyKikgYnVmLCBzaXplKTsKK30KKworLyogR2V0IGludGVnZXIgcmVncyAqLworCitwc19lcnJfZQorcHNfbGdldHJlZ3MgKGdkYl9wc19wcm9jaGFuZGxlX3QgcGgsIGx3cGlkX3QgbHdwaWQsCisJICAgICBwcmdyZWdzZXRfdCBncmVnc2V0KQoreworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworCisgIG9sZF9jaGFpbiA9IHNhdmVfaW5mZXJpb3JfcGlkICgpOworCisgIGluZmVyaW9yX3BpZCA9IEJVSUxEX0xXUCAobHdwaWQsIFBJREdFVCAoaW5mZXJpb3JfcGlkKSk7CisgIAorICBpZiAodGFyZ2V0X2hhc19leGVjdXRpb24pCisgICAgcHJvY2ZzX29wcy50b19mZXRjaF9yZWdpc3RlcnMgKC0xKTsKKyAgZWxzZQorICAgIG9yaWdfY29yZV9vcHMudG9fZmV0Y2hfcmVnaXN0ZXJzICgtMSk7CisgIGZpbGxfZ3JlZ3NldCAoZ3JlZ3NldCwgLTEpOworCisgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworCisgIHJldHVybiBQU19PSzsKK30KKworLyogU2V0IGludGVnZXIgcmVncyAqLworCitwc19lcnJfZQorcHNfbHNldHJlZ3MgKGdkYl9wc19wcm9jaGFuZGxlX3QgcGgsIGx3cGlkX3QgbHdwaWQsCisJICAgICBjb25zdCBwcmdyZWdzZXRfdCBncmVnc2V0KQoreworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworCisgIG9sZF9jaGFpbiA9IHNhdmVfaW5mZXJpb3JfcGlkICgpOworCisgIGluZmVyaW9yX3BpZCA9IEJVSUxEX0xXUCAobHdwaWQsIFBJREdFVCAoaW5mZXJpb3JfcGlkKSk7CisgIAorICBzdXBwbHlfZ3JlZ3NldCAoZ3JlZ3NldCk7CisgIGlmICh0YXJnZXRfaGFzX2V4ZWN1dGlvbikKKyAgICBwcm9jZnNfb3BzLnRvX3N0b3JlX3JlZ2lzdGVycyAoLTEpOworICBlbHNlCisgICAgb3JpZ19jb3JlX29wcy50b19zdG9yZV9yZWdpc3RlcnMgKC0xKTsKKworICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKKworICByZXR1cm4gUFNfT0s7Cit9CisKK3ZvaWQKK3BzX3Bsb2cgKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7CisKKyAgdmZwcmludGZfZmlsdGVyZWQgKGdkYl9zdGRlcnIsIGZtdCwgYXJncyk7Cit9CisKKy8qIEdldCBzaXplIG9mIGV4dHJhIHJlZ2lzdGVyIHNldC4gIEN1cnJlbnRseSBhIG5vb3AuICAqLworCitwc19lcnJfZQorcHNfbGdldHhyZWdzaXplIChnZGJfcHNfcHJvY2hhbmRsZV90IHBoLCBsd3BpZF90IGx3cGlkLCBpbnQgKnhyZWdzaXplKQoreworI2lmIDAKKyAgaW50IGx3cF9mZDsKKyAgaW50IHJlZ3NpemU7CisgIHBzX2Vycl9lIHZhbDsKKworICB2YWwgPSBnZXRfbHdwX2ZkIChwaCwgbHdwaWQsICZsd3BfZmQpOworICBpZiAodmFsICE9IFBTX09LKQorICAgIHJldHVybiB2YWw7CisKKyAgaWYgKGlvY3RsIChsd3BfZmQsIFBJT0NHWFJFR1NJWkUsICZyZWdzaXplKSkKKyAgICB7CisgICAgICBpZiAoZXJybm8gPT0gRUlOVkFMKQorCXJldHVybiBQU19OT0ZSRUdTOwkvKiBYWFggV3JvbmcgY29kZSwgYnV0IHRoaXMgaXMgdGhlIGNsb3Nlc3QKKwkJCQkgICB0aGluZyBpbiBwcm9jX3NlcnZpY2UuaCAgKi8KKworICAgICAgcHJpbnRfc3lzX2Vycm1zZyAoInBzX2xnZXR4cmVnc2l6ZSAoKTogUElPQ0dYUkVHU0laRSIsIGVycm5vKTsKKyAgICAgIHJldHVybiBQU19FUlI7CisgICAgfQorI2VuZGlmCisKKyAgcmV0dXJuIFBTX09LOworfQorCisvKiBHZXQgZXh0cmEgcmVnaXN0ZXIgc2V0LiAgQ3VycmVudGx5IGEgbm9vcC4gICovCisKK3BzX2Vycl9lCitwc19sZ2V0eHJlZ3MgKGdkYl9wc19wcm9jaGFuZGxlX3QgcGgsIGx3cGlkX3QgbHdwaWQsIGNhZGRyX3QgeHJlZ3NldCkKK3sKKyNpZiAwCisgIGludCBsd3BfZmQ7CisgIHBzX2Vycl9lIHZhbDsKKworICB2YWwgPSBnZXRfbHdwX2ZkIChwaCwgbHdwaWQsICZsd3BfZmQpOworICBpZiAodmFsICE9IFBTX09LKQorICAgIHJldHVybiB2YWw7CisKKyAgaWYgKGlvY3RsIChsd3BfZmQsIFBJT0NHWFJFRywgeHJlZ3NldCkpCisgICAgeworICAgICAgcHJpbnRfc3lzX2Vycm1zZyAoInBzX2xnZXR4cmVncyAoKTogUElPQ0dYUkVHIiwgZXJybm8pOworICAgICAgcmV0dXJuIFBTX0VSUjsKKyAgICB9CisjZW5kaWYKKworICByZXR1cm4gUFNfT0s7Cit9CisKKy8qIFNldCBleHRyYSByZWdpc3RlciBzZXQuICBDdXJyZW50bHkgYSBub29wLiAgKi8KKworcHNfZXJyX2UKK3BzX2xzZXR4cmVncyAoZ2RiX3BzX3Byb2NoYW5kbGVfdCBwaCwgbHdwaWRfdCBsd3BpZCwgY2FkZHJfdCB4cmVnc2V0KQoreworI2lmIDAKKyAgaW50IGx3cF9mZDsKKyAgcHNfZXJyX2UgdmFsOworCisgIHZhbCA9IGdldF9sd3BfZmQgKHBoLCBsd3BpZCwgJmx3cF9mZCk7CisgIGlmICh2YWwgIT0gUFNfT0spCisgICAgcmV0dXJuIHZhbDsKKworICBpZiAoaW9jdGwgKGx3cF9mZCwgUElPQ1NYUkVHLCB4cmVnc2V0KSkKKyAgICB7CisgICAgICBwcmludF9zeXNfZXJybXNnICgicHNfbHNldHhyZWdzICgpOiBQSU9DU1hSRUciLCBlcnJubyk7CisgICAgICByZXR1cm4gUFNfRVJSOworICAgIH0KKyNlbmRpZgorCisgIHJldHVybiBQU19PSzsKK30KKworLyogR2V0IGZsb2F0aW5nLXBvaW50IHJlZ3MuICAqLworCitwc19lcnJfZQorcHNfbGdldGZwcmVncyAoZ2RiX3BzX3Byb2NoYW5kbGVfdCBwaCwgbHdwaWRfdCBsd3BpZCwKKwkgICAgICAgcHJmcHJlZ3NldF90ICpmcHJlZ3NldCkKK3sKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKworICBvbGRfY2hhaW4gPSBzYXZlX2luZmVyaW9yX3BpZCAoKTsKKworICBpbmZlcmlvcl9waWQgPSBCVUlMRF9MV1AgKGx3cGlkLCBQSURHRVQgKGluZmVyaW9yX3BpZCkpOworCisgIGlmICh0YXJnZXRfaGFzX2V4ZWN1dGlvbikKKyAgICBwcm9jZnNfb3BzLnRvX2ZldGNoX3JlZ2lzdGVycyAoLTEpOworICBlbHNlCisgICAgb3JpZ19jb3JlX29wcy50b19mZXRjaF9yZWdpc3RlcnMgKC0xKTsKKyAgZmlsbF9mcHJlZ3NldCAoZnByZWdzZXQsIC0xKTsKKworICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKKworICByZXR1cm4gUFNfT0s7Cit9CisKKy8qIFNldCBmbG9hdGluZy1wb2ludCByZWdzLiAgKi8KKworcHNfZXJyX2UKK3BzX2xzZXRmcHJlZ3MgKGdkYl9wc19wcm9jaGFuZGxlX3QgcGgsIGx3cGlkX3QgbHdwaWQsCisJICAgICAgIGNvbnN0IHByZnByZWdzZXRfdCAqZnByZWdzZXQpCit7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisKKyAgb2xkX2NoYWluID0gc2F2ZV9pbmZlcmlvcl9waWQgKCk7CisKKyAgaW5mZXJpb3JfcGlkID0gQlVJTERfTFdQIChsd3BpZCwgUElER0VUIChpbmZlcmlvcl9waWQpKTsKKyAgCisgIHN1cHBseV9mcHJlZ3NldCAoZnByZWdzZXQpOworICBpZiAodGFyZ2V0X2hhc19leGVjdXRpb24pCisgICAgcHJvY2ZzX29wcy50b19zdG9yZV9yZWdpc3RlcnMgKC0xKTsKKyAgZWxzZQorICAgIG9yaWdfY29yZV9vcHMudG9fc3RvcmVfcmVnaXN0ZXJzICgtMSk7CisKKyAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisKKyAgcmV0dXJuIFBTX09LOworfQorCisjaWZkZWYgVE1fSTM4NlNPTDJfSAorCisvKiBHZXQgbG9jYWwgZGVzY3JpcHRvciB0YWJsZS4gICovCisKKyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+CisjaW5jbHVkZSA8c3lzL3JlZy5oPgorI2luY2x1ZGUgPHN5cy9zeXNpODYuaD4KKworc3RhdGljIGludCBubGR0X2FsbG9jYXRlZCA9IDA7CitzdGF0aWMgc3RydWN0IHNzZCAqbGR0X2J1ZnAgPSBOVUxMOworCitwc19lcnJfZQorcHNfbGdldExEVCAoZ2RiX3BzX3Byb2NoYW5kbGVfdCBwaCwgbHdwaWRfdCBsd3BpZCwKKwkgICAgc3RydWN0IHNzZCAqcGxkdCkKK3sKKyAgZ3JlZ3NldF90IGdyZWdzZXQ7CisgIGludCBsd3BfZmQ7CisgIHBzX2Vycl9lIHZhbDsKKyAgaW50IG5sZHQ7CisgIGludCBpOworCisgIC8qIEdldCBwcm9jZnMgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgTFdQLiAgKi8KKyAgbHdwX2ZkID0gcHJvY2ZzX2dldF9waWRfZmQgKEJVSUxEX0xXUCAobHdwaWQsIFBJREdFVCAoaW5mZXJpb3JfcGlkKSkpOworICBpZiAobHdwX2ZkIDwgMCkKKyAgICByZXR1cm4gUFNfQkFETElEOworCisgIC8qIEZldGNoIHJlZ2lzdGVycyB1bmQgTERUIGRlc2NyaXB0b3JzLiAgKi8KKyAgaWYgKGlvY3RsIChsd3BfZmQsIFBJT0NHUkVHLCAmZ3JlZ3NldCkgPT0gLTEpCisgICAgcmV0dXJuIFBTX0VSUjsKKworICBpZiAoaW9jdGwgKGx3cF9mZCwgUElPQ05MRFQsICZubGR0KSA9PSAtMSkKKyAgICByZXR1cm4gUFNfRVJSOworCisgIGlmIChubGR0X2FsbG9jYXRlZCA8IG5sZHQpCisgICAgeworICAgICAgbGR0X2J1ZnAKKwk9IChzdHJ1Y3Qgc3NkICopIHhyZWFsbG9jIChsZHRfYnVmcCwgKG5sZHQgKyAxKSAqIHNpemVvZiAoc3RydWN0IHNzZCkpOworICAgICAgbmxkdF9hbGxvY2F0ZWQgPSBubGR0OworICAgIH0KKworICBpZiAoaW9jdGwgKGx3cF9mZCwgUElPQ0xEVCwgbGR0X2J1ZnApID09IC0xKQorICAgIHJldHVybiBQU19FUlI7CisKKyAgLyogU2VhcmNoIExEVCBmb3IgdGhlIExXUCB2aWEgcmVnaXN0ZXIgR1MuICAqLworICBmb3IgKGkgPSAwOyBpIDwgbmxkdDsgaSsrKQorICAgIHsKKyAgICAgIGlmIChsZHRfYnVmcFtpXS5zZWwgPT0gKGdyZWdzZXRbR1NdICYgMHhmZmZmKSkKKwl7CisJICAqcGxkdCA9IGxkdF9idWZwW2ldOworCSAgcmV0dXJuIFBTX09LOworCX0KKyAgICB9CisKKyAgLyogTERUIG5vdCBmb3VuZC4gICovCisgIHJldHVybiBQU19FUlI7Cit9ICAgICAgICAKKyNlbmRpZiAvKiBUTV9JMzg2U09MMl9IICovCisMCisvKiBDb252ZXJ0IGEgcGlkIHRvIHByaW50YWJsZSBmb3JtLiAqLworCitjaGFyICoKK3NvbGFyaXNfcGlkX3RvX3N0ciAocGlkKQorICAgICBpbnQgcGlkOworeworICBzdGF0aWMgY2hhciBidWZbMTAwXTsKKworICAvKiBpbiBjYXNlIGluaXQgZmFpbGVkIHRvIHJlc29sdmUgdGhlIGxpYnRocmVhZF9kYiBsaWJyYXJ5ICovCisgIGlmICghcHJvY2ZzX3N1cHByZXNzX3J1bikKKyAgICByZXR1cm4gcHJvY2ZzX3BpZF90b19zdHIgKHBpZCk7CisKKyAgaWYgKGlzX3RocmVhZCAocGlkKSkKKyAgICB7CisgICAgICBpbnQgbHdwOworCisgICAgICBsd3AgPSB0aHJlYWRfdG9fbHdwIChwaWQsIC0yKTsKKworICAgICAgaWYgKGx3cCA9PSAtMSkKKwlzcHJpbnRmIChidWYsICJUaHJlYWQgJWQgKGRlZnVuY3QpIiwgR0VUX1RIUkVBRCAocGlkKSk7CisgICAgICBlbHNlIGlmIChsd3AgIT0gLTIpCisJc3ByaW50ZiAoYnVmLCAiVGhyZWFkICVkIChMV1AgJWQpIiwgR0VUX1RIUkVBRCAocGlkKSwgR0VUX0xXUCAobHdwKSk7CisgICAgICBlbHNlCisJc3ByaW50ZiAoYnVmLCAiVGhyZWFkICVkICAgICAgICAiLCBHRVRfVEhSRUFEIChwaWQpKTsKKyAgICB9CisgIGVsc2UgaWYgKEdFVF9MV1AgKHBpZCkgIT0gMCkKKyAgICBzcHJpbnRmIChidWYsICJMV1AgICAgJWQgICAgICAgICIsIEdFVF9MV1AgKHBpZCkpOworICBlbHNlCisgICAgc3ByaW50ZiAoYnVmLCAicHJvY2VzcyAlZCAgICAiLCBQSURHRVQgKHBpZCkpOworCisgIHJldHVybiBidWY7Cit9CisMCisKKy8qIFdvcmtlciBiZWUgZm9yIGZpbmRfbmV3X3RocmVhZHMKKyAgIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgb25jZSBwZXIgVVNFUiB0aHJlYWQgKGkuZS4sIG5vdAorICAga2VybmVsKSB0aHJlYWQuICovCisKK3N0YXRpYyBpbnQKK3NvbF9maW5kX25ld190aHJlYWRzX2NhbGxiYWNrKHRoLCBpZ25vcmVkKQorICAgICBjb25zdCB0ZF90aHJoYW5kbGVfdCAqdGg7CisgICAgIHZvaWQgKmlnbm9yZWQ7Cit7CisgIHRkX2Vycl9lIHJldHZhbDsKKyAgdGRfdGhyaW5mb190IHRpOworICBpbnQgcGlkOworCisgIGlmICgocmV0dmFsID0gcF90ZF90aHJfZ2V0X2luZm8odGgsICZ0aSkpICE9IFREX09LKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIHBpZCA9IEJVSUxEX1RIUkVBRCh0aS50aV90aWQsIFBJREdFVChpbmZlcmlvcl9waWQpKTsKKyAgaWYgKCFpbl90aHJlYWRfbGlzdChwaWQpKQorICAgIGFkZF90aHJlYWQocGlkKTsKKworICByZXR1cm4gMDsKK30KKwordm9pZAorc29sX2ZpbmRfbmV3X3RocmVhZHMoKQoreworICAvKiBkb24ndCBkbyBhbnl0aGluZyBpZiBpbml0IGZhaWxlZCB0byByZXNvbHZlIHRoZSBsaWJ0aHJlYWRfZGIgbGlicmFyeSAqLworICBpZiAoIXByb2Nmc19zdXBwcmVzc19ydW4pCisgICAgcmV0dXJuOworCisgIGlmIChpbmZlcmlvcl9waWQgPT0gLTEpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkKCJObyBwcm9jZXNzLlxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICBwX3RkX3RhX3Rocl9pdGVyIChtYWluX3RhLCBzb2xfZmluZF9uZXdfdGhyZWFkc19jYWxsYmFjaywgKHZvaWQgKikwLAorCQkgICAgVERfVEhSX0FOWV9TVEFURSwgVERfVEhSX0xPV0VTVF9QUklPUklUWSwKKwkJICAgIFREX1NJR05PX01BU0ssIFREX1RIUl9BTllfVVNFUl9GTEFHUyk7Cit9CisKK3N0YXRpYyB2b2lkCitzb2xfY29yZV9vcGVuIChmaWxlbmFtZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmZpbGVuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIG9yaWdfY29yZV9vcHMudG9fb3BlbiAoZmlsZW5hbWUsIGZyb21fdHR5KTsKK30KKworc3RhdGljIHZvaWQKK3NvbF9jb3JlX2Nsb3NlIChxdWl0dGluZykKKyAgICAgaW50IHF1aXR0aW5nOworeworICBvcmlnX2NvcmVfb3BzLnRvX2Nsb3NlIChxdWl0dGluZyk7Cit9CisKK3N0YXRpYyB2b2lkCitzb2xfY29yZV9kZXRhY2ggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHVucHVzaF90YXJnZXQgKCZjb3JlX29wcyk7CisgIG9yaWdfY29yZV9vcHMudG9fZGV0YWNoIChhcmdzLCBmcm9tX3R0eSk7Cit9CisKK3N0YXRpYyB2b2lkCitzb2xfY29yZV9maWxlc19pbmZvICh0KQorICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdDsKK3sKKyAgb3JpZ19jb3JlX29wcy50b19maWxlc19pbmZvICh0KTsKK30KKworI2lmZGVmIE1BSU5URU5BTkNFX0NNRFMKKy8qIFdvcmtlciBiZWUgZm9yIGluZm8gc29sLXRocmVhZCBjb21tYW5kLiAgVGhpcyBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQKKyAgIGdldHMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggU29sYXJpcyB0aHJlYWQgKGllLiBub3Qga2VybmVsIHRocmVhZCkgaW4gdGhlIAorICAgaW5mZXJpb3IuICBQcmludCBhbnl0aGluZyBpbnRlcmVzdGluZyB0aGF0IHdlIGNhbiB0aGluayBvZi4gICovCisKK3N0YXRpYyBpbnQgCitpbmZvX2NiICh0aCwgcykKKyAgICAgY29uc3QgdGRfdGhyaGFuZGxlX3QgKnRoOworICAgICB2b2lkICpzOworeworICB0ZF9lcnJfZSByZXQ7CisgIHRkX3RocmluZm9fdCB0aTsKKyAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltOworCisgIGlmICgocmV0ID0gcF90ZF90aHJfZ2V0X2luZm8gKHRoLCAmdGkpKSA9PSBURF9PSykKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIlcyB0aHJlYWQgIyVkLCBsd3AgJWQsICIsIAorCQkgICAgICAgdGkudGlfdHlwZSA9PSBURF9USFJfU1lTVEVNID8gInN5c3RlbSIgOiAidXNlciAgIiwgCisJCSAgICAgICB0aS50aV90aWQsIHRpLnRpX2xpZCk7CisgICAgICBzd2l0Y2ggKHRpLnRpX3N0YXRlKSB7CisJZGVmYXVsdDoKKwljYXNlIFREX1RIUl9VTktOT1dOOiBwcmludGZfZmlsdGVyZWQgKCI8dW5rbm93biBzdGF0ZT4iKTsJYnJlYWs7CisJY2FzZSBURF9USFJfU1RPUFBFRDogcHJpbnRmX2ZpbHRlcmVkICgiKHN0b3BwZWQpIik7CWJyZWFrOworCWNhc2UgVERfVEhSX1JVTjogICAgIHByaW50Zl9maWx0ZXJlZCAoIihydW4pICAgICIpOwlicmVhazsKKwljYXNlIFREX1RIUl9BQ1RJVkU6ICBwcmludGZfZmlsdGVyZWQgKCIoYWN0aXZlKSAiKTsJYnJlYWs7CisJY2FzZSBURF9USFJfWk9NQklFOiAgcHJpbnRmX2ZpbHRlcmVkICgiKHpvbWJpZSkgIik7CWJyZWFrOworCWNhc2UgVERfVEhSX1NMRUVQOiAgIHByaW50Zl9maWx0ZXJlZCAoIihhc2xlZXApICIpOwlicmVhazsKKwljYXNlIFREX1RIUl9TVE9QUEVEX0FTTEVFUDogCisJICBwcmludGZfZmlsdGVyZWQgKCIoc3RvcHBlZCBhc2xlZXApIik7CQkJYnJlYWs7CisgICAgICB9CisgICAgICAvKiBQcmludCB0aHJfY3JlYXRlIHN0YXJ0IGZ1bmN0aW9uOiAqLworICAgICAgaWYgKHRpLnRpX3N0YXJ0ZnVuYyAhPSAwKQorCWlmIChtc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjICh0aS50aV9zdGFydGZ1bmMpKQorCSAgcHJpbnRmX2ZpbHRlcmVkICgiICAgc3RhcnRmdW5jOiAlc1xuIiwgU1lNQk9MX05BTUUgKG1zeW0pKTsKKwllbHNlCisJICBwcmludGZfZmlsdGVyZWQgKCIgICBzdGFydGZ1bmM6IDB4JTA4eFxuIiwgdGkudGlfc3RhcnRmdW5jKTsKKworICAgICAgLyogSWYgdGhyZWFkIGlzIGFzbGVlcCwgcHJpbnQgZnVuY3Rpb24gdGhhdCB3ZW50IHRvIHNsZWVwOiAqLworICAgICAgaWYgKHRpLnRpX3N0YXRlID09IFREX1RIUl9TTEVFUCkKKwlpZiAobXN5bSA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbF9ieV9wYyAodGkudGlfcGMpKQorCSAgcHJpbnRmX2ZpbHRlcmVkICgiIC0gU2xlZXAgZnVuYzogJXNcbiIsIFNZTUJPTF9OQU1FIChtc3ltKSk7CisJZWxzZQorCSAgcHJpbnRmX2ZpbHRlcmVkICgiIC0gU2xlZXAgZnVuYzogMHglMDh4XG4iLCB0aS50aV9zdGFydGZ1bmMpOworCisgICAgICAvKiBXcmFwIHVwIGxpbmUsIGlmIG5lY2Vzc2FyeSAqLworICAgICAgaWYgKHRpLnRpX3N0YXRlICE9IFREX1RIUl9TTEVFUCAmJiB0aS50aV9zdGFydGZ1bmMgPT0gMCkKKwlwcmludGZfZmlsdGVyZWQgKCJcbiIpOwkvKiBkb24ndCB5b3UgaGF0ZSBjb3VudGluZyBuZXdsaW5lcz8gKi8KKyAgICB9CisgIGVsc2UKKyAgICB3YXJuaW5nICgiaW5mbyBzb2wtdGhyZWFkOiBmYWlsZWQgdG8gZ2V0IGluZm8gZm9yIHRocmVhZC4iKTsKKworICByZXR1cm4gMDsgICAgCit9CisKKy8qIExpc3Qgc29tZSBzdGF0ZSBhYm91dCBlYWNoIFNvbGFyaXMgdXNlciB0aHJlYWQgaW4gdGhlIGluZmVyaW9yLiAgKi8KKworc3RhdGljIHZvaWQKK2luZm9fc29sdGhyZWFkcyAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcF90ZF90YV90aHJfaXRlciAobWFpbl90YSwgaW5mb19jYiwgYXJncywgCisJCSAgICBURF9USFJfQU5ZX1NUQVRFLCBURF9USFJfTE9XRVNUX1BSSU9SSVRZLAorCQkgICAgVERfU0lHTk9fTUFTSywgVERfVEhSX0FOWV9VU0VSX0ZMQUdTKTsKK30KKyNlbmRpZiAvKiBNQUlOVEVOQU5DRV9DTURTICovCisKK3N0YXRpYyBpbnQKK2lnbm9yZSAoYWRkciwgY29udGVudHMpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpjb250ZW50czsKK3sKKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQKK2luaXRfc29sX3RocmVhZF9vcHMgKCkKK3sKKyAgc29sX3RocmVhZF9vcHMudG9fc2hvcnRuYW1lID0gInNvbGFyaXMtdGhyZWFkcyI7CisgIHNvbF90aHJlYWRfb3BzLnRvX2xvbmduYW1lID0gIlNvbGFyaXMgdGhyZWFkcyBhbmQgcHRocmVhZC4iOworICBzb2xfdGhyZWFkX29wcy50b19kb2MgPSAiU29sYXJpcyB0aHJlYWRzIGFuZCBwdGhyZWFkIHN1cHBvcnQuIjsKKyAgc29sX3RocmVhZF9vcHMudG9fb3BlbiA9IHNvbF90aHJlYWRfb3BlbjsKKyAgc29sX3RocmVhZF9vcHMudG9fY2xvc2UgPSAwOworICBzb2xfdGhyZWFkX29wcy50b19hdHRhY2ggPSBzb2xfdGhyZWFkX2F0dGFjaDsKKyAgc29sX3RocmVhZF9vcHMudG9fZGV0YWNoID0gc29sX3RocmVhZF9kZXRhY2g7CisgIHNvbF90aHJlYWRfb3BzLnRvX3Jlc3VtZSA9IHNvbF90aHJlYWRfcmVzdW1lOworICBzb2xfdGhyZWFkX29wcy50b193YWl0ID0gc29sX3RocmVhZF93YWl0OworICBzb2xfdGhyZWFkX29wcy50b19mZXRjaF9yZWdpc3RlcnMgPSBzb2xfdGhyZWFkX2ZldGNoX3JlZ2lzdGVyczsKKyAgc29sX3RocmVhZF9vcHMudG9fc3RvcmVfcmVnaXN0ZXJzID0gc29sX3RocmVhZF9zdG9yZV9yZWdpc3RlcnM7CisgIHNvbF90aHJlYWRfb3BzLnRvX3ByZXBhcmVfdG9fc3RvcmUgPSBzb2xfdGhyZWFkX3ByZXBhcmVfdG9fc3RvcmU7CisgIHNvbF90aHJlYWRfb3BzLnRvX3hmZXJfbWVtb3J5ID0gc29sX3RocmVhZF94ZmVyX21lbW9yeTsKKyAgc29sX3RocmVhZF9vcHMudG9fZmlsZXNfaW5mbyA9IHNvbF90aHJlYWRfZmlsZXNfaW5mbzsKKyAgc29sX3RocmVhZF9vcHMudG9faW5zZXJ0X2JyZWFrcG9pbnQgPSBtZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQ7CisgIHNvbF90aHJlYWRfb3BzLnRvX3JlbW92ZV9icmVha3BvaW50ID0gbWVtb3J5X3JlbW92ZV9icmVha3BvaW50OworICBzb2xfdGhyZWFkX29wcy50b190ZXJtaW5hbF9pbml0ID0gdGVybWluYWxfaW5pdF9pbmZlcmlvcjsKKyAgc29sX3RocmVhZF9vcHMudG9fdGVybWluYWxfaW5mZXJpb3IgPSB0ZXJtaW5hbF9pbmZlcmlvcjsKKyAgc29sX3RocmVhZF9vcHMudG9fdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ID0gdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0OworICBzb2xfdGhyZWFkX29wcy50b190ZXJtaW5hbF9vdXJzID0gdGVybWluYWxfb3VyczsKKyAgc29sX3RocmVhZF9vcHMudG9fdGVybWluYWxfaW5mbyA9IGNoaWxkX3Rlcm1pbmFsX2luZm87CisgIHNvbF90aHJlYWRfb3BzLnRvX2tpbGwgPSBzb2xfdGhyZWFkX2tpbGxfaW5mZXJpb3I7CisgIHNvbF90aHJlYWRfb3BzLnRvX2xvYWQgPSAwOworICBzb2xfdGhyZWFkX29wcy50b19sb29rdXBfc3ltYm9sID0gMDsKKyAgc29sX3RocmVhZF9vcHMudG9fY3JlYXRlX2luZmVyaW9yID0gc29sX3RocmVhZF9jcmVhdGVfaW5mZXJpb3I7CisgIHNvbF90aHJlYWRfb3BzLnRvX21vdXJuX2luZmVyaW9yID0gc29sX3RocmVhZF9tb3Vybl9pbmZlcmlvcjsKKyAgc29sX3RocmVhZF9vcHMudG9fY2FuX3J1biA9IHNvbF90aHJlYWRfY2FuX3J1bjsKKyAgc29sX3RocmVhZF9vcHMudG9fbm90aWNlX3NpZ25hbHMgPSBzb2xfdGhyZWFkX25vdGljZV9zaWduYWxzOworICBzb2xfdGhyZWFkX29wcy50b190aHJlYWRfYWxpdmUgPSBzb2xfdGhyZWFkX2FsaXZlOworICBzb2xfdGhyZWFkX29wcy50b19zdG9wID0gc29sX3RocmVhZF9zdG9wOworICBzb2xfdGhyZWFkX29wcy50b19zdHJhdHVtID0gcHJvY2Vzc19zdHJhdHVtOworICBzb2xfdGhyZWFkX29wcy50b19oYXNfYWxsX21lbW9yeSA9IDE7CisgIHNvbF90aHJlYWRfb3BzLnRvX2hhc19tZW1vcnkgPSAxOworICBzb2xfdGhyZWFkX29wcy50b19oYXNfc3RhY2sgPSAxOworICBzb2xfdGhyZWFkX29wcy50b19oYXNfcmVnaXN0ZXJzID0gMTsKKyAgc29sX3RocmVhZF9vcHMudG9faGFzX2V4ZWN1dGlvbiA9IDE7CisgIHNvbF90aHJlYWRfb3BzLnRvX2hhc190aHJlYWRfY29udHJvbCA9IHRjX25vbmU7CisgIHNvbF90aHJlYWRfb3BzLnRvX3NlY3Rpb25zID0gMDsKKyAgc29sX3RocmVhZF9vcHMudG9fc2VjdGlvbnNfZW5kID0gMDsKKyAgc29sX3RocmVhZF9vcHMudG9fbWFnaWMgPSBPUFNfTUFHSUM7Cit9CisKKworc3RhdGljIHZvaWQKK2luaXRfc29sX2NvcmVfb3BzICgpCit7CisgIHNvbF9jb3JlX29wcy50b19zaG9ydG5hbWUgID0gInNvbGFyaXMtY29yZSI7CisgIHNvbF9jb3JlX29wcy50b19sb25nbmFtZSAgPSAiU29sYXJpcyBjb3JlIHRocmVhZHMgYW5kIHB0aHJlYWQuIjsKKyAgc29sX2NvcmVfb3BzLnRvX2RvYyAgPSAiU29sYXJpcyB0aHJlYWRzIGFuZCBwdGhyZWFkIHN1cHBvcnQgZm9yIGNvcmUgZmlsZXMuIjsKKyAgc29sX2NvcmVfb3BzLnRvX29wZW4gID0gc29sX2NvcmVfb3BlbjsKKyAgc29sX2NvcmVfb3BzLnRvX2Nsb3NlICA9IHNvbF9jb3JlX2Nsb3NlOworICBzb2xfY29yZV9vcHMudG9fYXR0YWNoICA9IHNvbF90aHJlYWRfYXR0YWNoOworICBzb2xfY29yZV9vcHMudG9fZGV0YWNoICA9IHNvbF9jb3JlX2RldGFjaDsKKyAgLyogc29sX2NvcmVfb3BzLnRvX3Jlc3VtZSAgPSAwOyAqLworICAvKiBzb2xfY29yZV9vcHMudG9fd2FpdCAgPSAwOwkgKi8KKyAgc29sX2NvcmVfb3BzLnRvX2ZldGNoX3JlZ2lzdGVycyAgPSBzb2xfdGhyZWFkX2ZldGNoX3JlZ2lzdGVyczsKKyAgLyogc29sX2NvcmVfb3BzLnRvX3N0b3JlX3JlZ2lzdGVycyAgPSAwOyAqLworICAvKiBzb2xfY29yZV9vcHMudG9fcHJlcGFyZV90b19zdG9yZSAgPSAwOyAqLworICBzb2xfY29yZV9vcHMudG9feGZlcl9tZW1vcnkgID0gc29sX3RocmVhZF94ZmVyX21lbW9yeTsKKyAgc29sX2NvcmVfb3BzLnRvX2ZpbGVzX2luZm8gID0gc29sX2NvcmVfZmlsZXNfaW5mbzsKKyAgc29sX2NvcmVfb3BzLnRvX2luc2VydF9icmVha3BvaW50ICA9IGlnbm9yZTsKKyAgc29sX2NvcmVfb3BzLnRvX3JlbW92ZV9icmVha3BvaW50ICA9IGlnbm9yZTsKKyAgLyogc29sX2NvcmVfb3BzLnRvX3Rlcm1pbmFsX2luaXQgID0gMDsgKi8KKyAgLyogc29sX2NvcmVfb3BzLnRvX3Rlcm1pbmFsX2luZmVyaW9yICA9IDA7ICovCisgIC8qIHNvbF9jb3JlX29wcy50b190ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgID0gMDsgKi8KKyAgLyogc29sX2NvcmVfb3BzLnRvX3Rlcm1pbmFsX291cnMgID0gMDsgKi8KKyAgLyogc29sX2NvcmVfb3BzLnRvX3Rlcm1pbmFsX2luZm8gID0gMDsgKi8KKyAgLyogc29sX2NvcmVfb3BzLnRvX2tpbGwgID0gMDsgKi8KKyAgLyogc29sX2NvcmVfb3BzLnRvX2xvYWQgID0gMDsgKi8KKyAgLyogc29sX2NvcmVfb3BzLnRvX2xvb2t1cF9zeW1ib2wgID0gMDsgKi8KKyAgc29sX2NvcmVfb3BzLnRvX2NyZWF0ZV9pbmZlcmlvciAgPSBzb2xfdGhyZWFkX2NyZWF0ZV9pbmZlcmlvcjsKKyAgc29sX2NvcmVfb3BzLnRvX3N0cmF0dW0gID0gY29yZV9zdHJhdHVtOworICBzb2xfY29yZV9vcHMudG9faGFzX2FsbF9tZW1vcnkgID0gMDsKKyAgc29sX2NvcmVfb3BzLnRvX2hhc19tZW1vcnkgID0gMTsKKyAgc29sX2NvcmVfb3BzLnRvX2hhc19zdGFjayAgPSAxOworICBzb2xfY29yZV9vcHMudG9faGFzX3JlZ2lzdGVycyAgPSAxOworICBzb2xfY29yZV9vcHMudG9faGFzX2V4ZWN1dGlvbiAgPSAwOworICBzb2xfY29yZV9vcHMudG9faGFzX3RocmVhZF9jb250cm9sICA9IHRjX25vbmU7CisgIHNvbF9jb3JlX29wcy50b19zZWN0aW9ucyAgPSAwOworICBzb2xfY29yZV9vcHMudG9fc2VjdGlvbnNfZW5kICA9IDA7CisgIHNvbF9jb3JlX29wcy50b19tYWdpYyAgPSBPUFNfTUFHSUM7Cit9CisKKy8qIHdlIHN1cHByZXNzIHRoZSBjYWxsIHRvIGFkZF90YXJnZXQgb2YgY29yZV9vcHMgaW4gY29yZWxvdyBiZWNhdXNlCisgICBpZiB0aGVyZSBhcmUgdHdvIHRhcmdldHMgaW4gdGhlIHN0cmF0dW0gY29yZV9zdHJhdHVtLCBmaW5kX2NvcmVfdGFyZ2V0CisgICB3b24ndCBrbm93IHdoaWNoIG9uZSB0byByZXR1cm4uICBzZWUgY29yZWxvdy5jIGZvciBhbiBhZGRpdG9uYWwKKyAgIGNvbW1lbnQgb24gY29yZW9wc19zdXBwcmVzc190YXJnZXQuICovCitpbnQgY29yZW9wc19zdXBwcmVzc190YXJnZXQgPSAxOworCit2b2lkCitfaW5pdGlhbGl6ZV9zb2xfdGhyZWFkICgpCit7CisgIHZvaWQgKmRsaGFuZGxlOworCisgIGluaXRfc29sX3RocmVhZF9vcHMgKCk7CisgIGluaXRfc29sX2NvcmVfb3BzICgpOworCisgIGRsaGFuZGxlID0gZGxvcGVuICgibGlidGhyZWFkX2RiLnNvLjEiLCBSVExEX05PVyk7CisgIGlmICghZGxoYW5kbGUpCisgICAgZ290byBkaWU7CisKKyNkZWZpbmUgcmVzb2x2ZShYKSBcCisgIGlmICghKHBfIyNYID0gZGxzeW0gKGRsaGFuZGxlLCAjWCkpKSBcCisgICAgZ290byBkaWU7CisKKyAgcmVzb2x2ZSAodGRfbG9nKTsKKyAgcmVzb2x2ZSAodGRfdGFfbmV3KTsKKyAgcmVzb2x2ZSAodGRfdGFfZGVsZXRlKTsKKyAgcmVzb2x2ZSAodGRfaW5pdCk7CisgIHJlc29sdmUgKHRkX3RhX2dldF9waCk7CisgIHJlc29sdmUgKHRkX3RhX2dldF9udGhyZWFkcyk7CisgIHJlc29sdmUgKHRkX3RhX3RzZF9pdGVyKTsKKyAgcmVzb2x2ZSAodGRfdGFfdGhyX2l0ZXIpOworICByZXNvbHZlICh0ZF90aHJfdmFsaWRhdGUpOworICByZXNvbHZlICh0ZF90aHJfdHNkKTsKKyAgcmVzb2x2ZSAodGRfdGhyX2dldF9pbmZvKTsKKyAgcmVzb2x2ZSAodGRfdGhyX2dldGZwcmVncyk7CisgIHJlc29sdmUgKHRkX3Rocl9nZXR4cmVnc2l6ZSk7CisgIHJlc29sdmUgKHRkX3Rocl9nZXR4cmVncyk7CisgIHJlc29sdmUgKHRkX3Rocl9zaWdzZXRtYXNrKTsKKyAgcmVzb2x2ZSAodGRfdGhyX3NldHByaW8pOworICByZXNvbHZlICh0ZF90aHJfc2V0c2lncGVuZGluZyk7CisgIHJlc29sdmUgKHRkX3Rocl9zZXRmcHJlZ3MpOworICByZXNvbHZlICh0ZF90aHJfc2V0eHJlZ3MpOworICByZXNvbHZlICh0ZF90YV9tYXBfaWQydGhyKTsKKyAgcmVzb2x2ZSAodGRfdGFfbWFwX2x3cDJ0aHIpOworICByZXNvbHZlICh0ZF90aHJfZ2V0Z3JlZ3MpOworICByZXNvbHZlICh0ZF90aHJfc2V0Z3JlZ3MpOworCisgIGFkZF90YXJnZXQgKCZzb2xfdGhyZWFkX29wcyk7CisKKyAgcHJvY2ZzX3N1cHByZXNzX3J1biA9IDE7CisKKyNpZmRlZiBNQUlOVEVOQU5DRV9DTURTCisgIGFkZF9jbWQgKCJzb2wtdGhyZWFkcyIsIGNsYXNzX21haW50ZW5hbmNlLCBpbmZvX3NvbHRocmVhZHMsIAorCSAgICAiU2hvdyBpbmZvIG9uIFNvbGFyaXMgdXNlciB0aHJlYWRzLlxuIiwgJm1haW50ZW5hbmNlaW5mb2xpc3QpOworI2VuZGlmIC8qIE1BSU5URU5BTkNFX0NNRFMgKi8KKworICBtZW1jcHkoJm9yaWdfY29yZV9vcHMsICZjb3JlX29wcywgc2l6ZW9mIChzdHJ1Y3QgdGFyZ2V0X29wcykpOworICBtZW1jcHkoJmNvcmVfb3BzLCAmc29sX2NvcmVfb3BzLCBzaXplb2YgKHN0cnVjdCB0YXJnZXRfb3BzKSk7CisgIGFkZF90YXJnZXQgKCZjb3JlX29wcyk7CisKKyAgcmV0dXJuOworCisgZGllOgorCisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIltHREIgd2lsbCBub3QgYmUgYWJsZSB0byBkZWJ1ZyB1c2VyLW1vZGUgdGhyZWFkczogJXNdXG4iLCBkbGVycm9yICgpKTsKKworICBpZiAoZGxoYW5kbGUpCisgICAgZGxjbG9zZSAoZGxoYW5kbGUpOworCisgIC8qIGFsbG93IHRoZSB1c2VyIHRvIGRlYnVnIG5vbi10aHJlYWRlZCBjb3JlIGZpbGVzICovCisgIGFkZF90YXJnZXQoJmNvcmVfb3BzKTsKKworICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9nZGIvc29saWIuYyBiL2dkYi9zb2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNmZkNGEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvc29saWIuYwpAQCAtMCwwICsxLDE4ODggQEAKKy8qIEhhbmRsZSBTdW5PUyBhbmQgU1ZSNCBzaGFyZWQgbGlicmFyaWVzIGZvciBHREIsIHRoZSBHTlUgRGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTgsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2luY2x1ZGUgImRlZnMuaCIKKworLyogVGhpcyBmaWxlIGlzIG9ubHkgY29tcGlsYWJsZSBpZiBsaW5rLmggaXMgYXZhaWxhYmxlLiAqLworCisjaWZkZWYgSEFWRV9MSU5LX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZuZGVmIFNWUjRfU0hBUkVEX0xJQlMKKyAvKiBTdW5PUyBzaGFyZWQgbGlicyBuZWVkIHRoZSBubGlzdCBzdHJ1Y3R1cmUuICAqLworI2luY2x1ZGUgPGEub3V0Lmg+IAorI2Vsc2UKKyNpbmNsdWRlICJlbGYvZXh0ZXJuYWwuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bGluay5oPgorCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgIm9iamZpbGVzLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImdudS1yZWdleC5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiZW52aXJvbi5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisKKyNkZWZpbmUgTUFYX1BBVEhfU0laRSA1MTIJCS8qIEZJWE1FOiBTaG91bGQgYmUgZHluYW1pYyAqLworCisvKiBPbiBTVlI0IHN5c3RlbXMsIGEgbGlzdCBvZiBzeW1ib2xzIGluIHRoZSBkeW5hbWljIGxpbmtlciB3aGVyZQorICAgR0RCIGNhbiB0cnkgdG8gcGxhY2UgYSBicmVha3BvaW50IHRvIG1vbml0b3Igc2hhcmVkIGxpYnJhcnkKKyAgIGV2ZW50cy4KKworICAgSWYgbm9uZSBvZiB0aGVzZSBzeW1ib2xzIGFyZSBmb3VuZCwgb3Igb3RoZXIgZXJyb3JzIG9jY3VyLCB0aGVuCisgICBTVlI0IHN5c3RlbXMgd2lsbCBmYWxsIGJhY2sgdG8gdXNpbmcgYSBzeW1ib2wgYXMgdGhlICJzdGFydHVwCisgICBtYXBwaW5nIGNvbXBsZXRlIiBicmVha3BvaW50IGFkZHJlc3MuICAqLworCisjaWZkZWYgU1ZSNF9TSEFSRURfTElCUworc3RhdGljIGNoYXIgKnNvbGliX2JyZWFrX25hbWVzW10gPSB7CisgICJyX2RlYnVnX3N0YXRlIiwKKyAgIl9yX2RlYnVnX3N0YXRlIiwKKyAgIl9kbF9kZWJ1Z19zdGF0ZSIsCisgICJydGxkX2RiX2RsYWN0aXZpdHkiLAorICBOVUxMCit9OworI2VuZGlmCisKKyNkZWZpbmUgQktQVF9BVF9TWU1CT0wgMQorCisjaWYgZGVmaW5lZCAoQktQVF9BVF9TWU1CT0wpICYmIGRlZmluZWQgKFNWUjRfU0hBUkVEX0xJQlMpCitzdGF0aWMgY2hhciAqYmtwdF9uYW1lc1tdID0geworI2lmZGVmIFNPTElCX0JLUFRfTkFNRQorICBTT0xJQl9CS1BUX05BTUUsCQkvKiBQcmVmZXIgY29uZmlndXJlZCBuYW1lIGlmIGl0IGV4aXN0cy4gKi8KKyNlbmRpZgorICAiX3N0YXJ0IiwKKyAgIm1haW4iLAorICBOVUxMCit9OworI2VuZGlmCisKKy8qIFN5bWJvbHMgd2hpY2ggYXJlIHVzZWQgdG8gbG9jYXRlIHRoZSBiYXNlIG9mIHRoZSBsaW5rIG1hcCBzdHJ1Y3R1cmVzLiAqLworCisjaWZuZGVmIFNWUjRfU0hBUkVEX0xJQlMKK3N0YXRpYyBjaGFyICpkZWJ1Z19iYXNlX3N5bWJvbHNbXSA9IHsKKyAgIl9EWU5BTUlDIiwKKyAgIl9EWU5BTUlDX19NR0MiLAorICBOVUxMCit9OworI2VuZGlmCisKK3N0YXRpYyBjaGFyICptYWluX25hbWVfbGlzdFtdID0geworICAibWFpbl8kbWFpbiIsCisgIE5VTEwKK307CisKKy8qIGxvY2FsIGRhdGEgZGVjbGFyYXRpb25zICovCisKKyNpZm5kZWYgU1ZSNF9TSEFSRURfTElCUworCisjZGVmaW5lIExNX0FERFIoc28pICgoc28pIC0+IGxtLmxtX2FkZHIpCisjZGVmaW5lIExNX05FWFQoc28pICgoc28pIC0+IGxtLmxtX25leHQpCisjZGVmaW5lIExNX05BTUUoc28pICgoc28pIC0+IGxtLmxtX25hbWUpCisvKiBUZXN0IGZvciBmaXJzdCBsaW5rIG1hcCBlbnRyeTsgZmlyc3QgZW50cnkgaXMgYSBzaGFyZWQgbGlicmFyeS4gKi8KKyNkZWZpbmUgSUdOT1JFX0ZJUlNUX0xJTktfTUFQX0VOVFJZKHgpICgwKQorc3RhdGljIHN0cnVjdCBsaW5rX2R5bmFtaWMgZHluYW1pY19jb3B5Oworc3RhdGljIHN0cnVjdCBsaW5rX2R5bmFtaWNfMiBsZF8yX2NvcHk7CitzdGF0aWMgc3RydWN0IGxkX2RlYnVnIGRlYnVnX2NvcHk7CitzdGF0aWMgQ09SRV9BRERSIGRlYnVnX2FkZHI7CitzdGF0aWMgQ09SRV9BRERSIGZsYWdfYWRkcjsKKworI2Vsc2UJLyogU1ZSNF9TSEFSRURfTElCUyAqLworCisjZGVmaW5lIExNX0FERFIoc28pICgoc28pIC0+IGxtLmxfYWRkcikKKyNkZWZpbmUgTE1fTkVYVChzbykgKChzbykgLT4gbG0ubF9uZXh0KQorI2RlZmluZSBMTV9OQU1FKHNvKSAoKHNvKSAtPiBsbS5sX25hbWUpCisvKiBUZXN0IGZvciBmaXJzdCBsaW5rIG1hcCBlbnRyeTsgZmlyc3QgZW50cnkgaXMgdGhlIGV4ZWMtZmlsZS4gKi8KKyNkZWZpbmUgSUdOT1JFX0ZJUlNUX0xJTktfTUFQX0VOVFJZKHgpICgoeCkubF9wcmV2ID09IE5VTEwpCitzdGF0aWMgc3RydWN0IHJfZGVidWcgZGVidWdfY29weTsKK2NoYXIgc2hhZG93X2NvbnRlbnRzW0JSRUFLUE9JTlRfTUFYXTsJLyogU3Rhc2ggb2xkIGJrcHQgYWRkciBjb250ZW50cyAqLworCisjZW5kaWYJLyogIVNWUjRfU0hBUkVEX0xJQlMgKi8KKworc3RydWN0IHNvX2xpc3QgeworICBzdHJ1Y3Qgc29fbGlzdCAqbmV4dDsJCQkvKiBuZXh0IHN0cnVjdHVyZSBpbiBsaW5rZWQgbGlzdCAqLworICBzdHJ1Y3QgbGlua19tYXAgbG07CQkJLyogY29weSBvZiBsaW5rIG1hcCBmcm9tIGluZmVyaW9yICovCisgIHN0cnVjdCBsaW5rX21hcCAqbG1hZGRyOwkJLyogYWRkciBpbiBpbmZlcmlvciBsbSB3YXMgcmVhZCBmcm9tICovCisgIENPUkVfQUREUiBsbWVuZDsJCQkvKiB1cHBlciBhZGRyIGJvdW5kIG9mIG1hcHBlZCBvYmplY3QgKi8KKyAgY2hhciBzb19uYW1lW01BWF9QQVRIX1NJWkVdOwkJLyogc2hhcmVkIG9iamVjdCBsaWIgbmFtZSAoRklYTUUpICovCisgIGNoYXIgc3ltYm9sc19sb2FkZWQ7CQkJLyogZmxhZzogc3ltYm9scyByZWFkIGluIHlldD8gKi8KKyAgY2hhciBmcm9tX3R0eTsJCQkvKiBmbGFnOiBwcmludCBtc2dzPyAqLworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsJCS8qIG9iamZpbGUgZm9yIGxvYWRlZCBsaWIgKi8KKyAgc3RydWN0IHNlY3Rpb25fdGFibGUgKnNlY3Rpb25zOworICBzdHJ1Y3Qgc2VjdGlvbl90YWJsZSAqc2VjdGlvbnNfZW5kOworICBzdHJ1Y3Qgc2VjdGlvbl90YWJsZSAqdGV4dHNlY3Rpb247CisgIGJmZCAqYWJmZDsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc29fbGlzdCAqc29fbGlzdF9oZWFkOwkvKiBMaXN0IG9mIGtub3duIHNoYXJlZCBvYmplY3RzICovCitzdGF0aWMgQ09SRV9BRERSIGRlYnVnX2Jhc2U7CQkvKiBCYXNlIG9mIGR5bmFtaWMgbGlua2VyIHN0cnVjdHVyZXMgKi8KK3N0YXRpYyBDT1JFX0FERFIgYnJlYWtwb2ludF9hZGRyOwkvKiBBZGRyZXNzIHdoZXJlIGVuZCBia3B0IGlzIHNldCAqLworCitzdGF0aWMgaW50IHNvbGliX2NsZWFudXBfcXVldWVkID0gMDsgICAgLyogbWFrZV9ydW5fY2xlYW51cCBjYWxsZWQgKi8KKworZXh0ZXJuIGludAorZmRtYXRjaCBQQVJBTVMgKChpbnQsIGludCkpOwkJLyogSW4gbGliaWJlcnR5ICovCisKKy8qIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQKK2RvX2NsZWFyX3NvbGliIFBBUkFNUyAoKFBUUikpOworCitzdGF0aWMgaW50CittYXRjaF9tYWluIFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgdm9pZAorc3BlY2lhbF9zeW1ib2xfaGFuZGxpbmcgUEFSQU1TICgoc3RydWN0IHNvX2xpc3QgKikpOworCitzdGF0aWMgdm9pZAorc2hhcmVkbGlicmFyeV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyBpbnQKK2VuYWJsZV9icmVhayBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkCitpbmZvX3NoYXJlZGxpYnJhcnlfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgaW50IHN5bWJvbF9hZGRfc3R1YiBQQVJBTVMgKChQVFIpKTsKKworc3RhdGljIHN0cnVjdCBzb19saXN0ICoKK2ZpbmRfc29saWIgUEFSQU1TICgoc3RydWN0IHNvX2xpc3QgKikpOworCitzdGF0aWMgc3RydWN0IGxpbmtfbWFwICoKK2ZpcnN0X2xpbmtfbWFwX21lbWJlciBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyBDT1JFX0FERFIKK2xvY2F0ZV9iYXNlIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIGludCBzb2xpYl9tYXBfc2VjdGlvbnMgUEFSQU1TICgoUFRSKSk7CisKKyNpZmRlZiBTVlI0X1NIQVJFRF9MSUJTCisKK3N0YXRpYyBDT1JFX0FERFIKK2VsZl9sb2NhdGVfYmFzZSBQQVJBTVMgKCh2b2lkKSk7CisKKyNlbHNlCisKK3N0YXRpYyBpbnQKK2Rpc2FibGVfYnJlYWsgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZAorYWxsb2NhdGVfcnRfY29tbW9uX29iamZpbGUgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZAorc29saWJfYWRkX2NvbW1vbl9zeW1ib2xzIFBBUkFNUyAoKHN0cnVjdCBydGNfc3ltYiAqKSk7CisKKyNlbmRpZgorCit2b2lkIF9pbml0aWFsaXplX3NvbGliIFBBUkFNUyAoKHZvaWQpKTsKKworLyogSWYgbm9uLXplcm8sIHRoaXMgaXMgYSBwcmVmaXggdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBmcm9udCBvZiB0aGUgbmFtZQorICAgc2hhcmVkIGxpYnJhcmllcyB3aXRoIGFuIGFic29sdXRlIGZpbGVuYW1lIGZvciBsb2FkaW5nLiAgKi8KK3N0YXRpYyBjaGFyICpzb2xpYl9hYnNvbHV0ZV9wcmVmaXggPSBOVUxMOworCisvKiBJZiBub24tZW1wdHksIHRoaXMgaXMgYSBzZWFyY2ggcGF0aCBmb3IgbG9hZGluZyBub24tYWJzb2x1dGUgc2hhcmVkIGxpYnJhcnkKKyAgIHN5bWJvbCBmaWxlcy4gIFRoaXMgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgUEFUSAorICAgYW5kIExEX0xJQlJBUllfUEFUSC4gICovCitzdGF0aWMgY2hhciAqc29saWJfc2VhcmNoX3BhdGggPSBOVUxMOworCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJc29saWJfbWFwX3NlY3Rpb25zIC0tIG9wZW4gYmZkIGFuZCBidWlsZCBzZWN0aW9ucyBmb3Igc2hhcmVkIGxpYgorCitTWU5PUFNJUworCisJc3RhdGljIGludCBzb2xpYl9tYXBfc2VjdGlvbnMgKHN0cnVjdCBzb19saXN0ICpzbykKKworREVTQ1JJUFRJT04KKworCUdpdmVuIGEgcG9pbnRlciB0byBvbmUgb2YgdGhlIHNoYXJlZCBvYmplY3RzIGluIG91ciBsaXN0CisJb2YgbWFwcGVkIG9iamVjdHMsIHVzZSB0aGUgcmVjb3JkZWQgbmFtZSB0byBvcGVuIGEgYmZkCisJZGVzY3JpcHRvciBmb3IgdGhlIG9iamVjdCwgYnVpbGQgYSBzZWN0aW9uIHRhYmxlLCBhbmQgdGhlbgorCXJlbG9jYXRlIGFsbCB0aGUgc2VjdGlvbiBhZGRyZXNzZXMgYnkgdGhlIGJhc2UgYWRkcmVzcyBhdAorCXdoaWNoIHRoZSBzaGFyZWQgb2JqZWN0IHdhcyBtYXBwZWQuCisKK0ZJWE1FUworCisJSW4gbW9zdCAoYWxsPykgY2FzZXMgdGhlIHNoYXJlZCBvYmplY3QgZmlsZSBuYW1lIHJlY29yZGVkIGluIHRoZQorCWR5bmFtaWMgbGlua2FnZSB0YWJsZXMgd2lsbCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBwYXRobmFtZS4gIEZvcgorCWNhc2VzIHdoZXJlIGl0IGlzbid0LCBkbyB3ZSByZWFsbHkgbWltaWMgdGhlIHN5c3RlbXMgc2VhcmNoCisJbWVjaGFuaXNtIGNvcnJlY3RseSBpbiB0aGUgYmVsb3cgY29kZSAocGFydGljdWxhcmx5IHRoZSB0aWxkZQorCWV4cGFuc2lvbiBzdHVmZj8pLgorICovCisKK3N0YXRpYyBpbnQKK3NvbGliX21hcF9zZWN0aW9ucyAoYXJnKQorICAgICBQVFIgYXJnOworeworICBzdHJ1Y3Qgc29fbGlzdCAqc28gPSAoc3RydWN0IHNvX2xpc3QgKikgYXJnOwkvKiBjYXRjaF9lcnJvcnMgYm9nb24gKi8KKyAgY2hhciAqZmlsZW5hbWU7CisgIGNoYXIgKnNjcmF0Y2hfcGF0aG5hbWU7CisgIGludCBzY3JhdGNoX2NoYW47CisgIHN0cnVjdCBzZWN0aW9uX3RhYmxlICpwOworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworICBiZmQgKmFiZmQ7CisgIAorICBmaWxlbmFtZSA9IHRpbGRlX2V4cGFuZCAoc28gLT4gc29fbmFtZSk7CisgIAorICBpZiAoc29saWJfYWJzb2x1dGVfcHJlZml4ICYmIFJPT1RFRF9QIChmaWxlbmFtZSkpCisgICAgLyogUHJlZml4IHNoYXJlZCBsaWJyYXJpZXMgd2l0aCBhYnNvbHV0ZSBmaWxlbmFtZXMgd2l0aAorICAgICAgIFNPTElCX0FCU09MVVRFX1BSRUZJWC4gICovCisgICAgeworICAgICAgY2hhciAqcGZ4ZWRfZm47CisgICAgICBpbnQgcGZ4X2xlbjsKKworICAgICAgcGZ4X2xlbiA9IHN0cmxlbiAoc29saWJfYWJzb2x1dGVfcHJlZml4KTsKKworICAgICAgLyogUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMuICAqLworICAgICAgd2hpbGUgKHBmeF9sZW4gPiAwICYmIFNMQVNIX1AgKHNvbGliX2Fic29sdXRlX3ByZWZpeFtwZnhfbGVuIC0gMV0pKQorCXBmeF9sZW4tLTsKKworICAgICAgcGZ4ZWRfZm4gPSB4bWFsbG9jIChwZnhfbGVuICsgc3RybGVuIChmaWxlbmFtZSkgKyAxKTsKKyAgICAgIHN0cmNweSAocGZ4ZWRfZm4sIHNvbGliX2Fic29sdXRlX3ByZWZpeCk7CisgICAgICBzdHJjYXQgKHBmeGVkX2ZuLCBmaWxlbmFtZSk7CisgICAgICBmcmVlIChmaWxlbmFtZSk7CisKKyAgICAgIGZpbGVuYW1lID0gcGZ4ZWRfZm47CisgICAgfQorCisgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoZnJlZSwgZmlsZW5hbWUpOworCisgIHNjcmF0Y2hfY2hhbiA9IC0xOworCisgIGlmIChzb2xpYl9zZWFyY2hfcGF0aCkKKyAgICBzY3JhdGNoX2NoYW4gPSBvcGVucCAoc29saWJfc2VhcmNoX3BhdGgsCisJCQkgIDEsIGZpbGVuYW1lLCBPX1JET05MWSwgMCwgJnNjcmF0Y2hfcGF0aG5hbWUpOworICBpZiAoc2NyYXRjaF9jaGFuIDwgMCkKKyAgICBzY3JhdGNoX2NoYW4gPSBvcGVucCAoZ2V0X2luX2Vudmlyb24gKGluZmVyaW9yX2Vudmlyb24sICJQQVRIIiksIAorCQkJICAxLCBmaWxlbmFtZSwgT19SRE9OTFksIDAsICZzY3JhdGNoX3BhdGhuYW1lKTsKKyAgaWYgKHNjcmF0Y2hfY2hhbiA8IDApCisgICAgeworICAgICAgc2NyYXRjaF9jaGFuID0gb3BlbnAgKGdldF9pbl9lbnZpcm9uIAorCQkJICAgIChpbmZlcmlvcl9lbnZpcm9uLCAiTERfTElCUkFSWV9QQVRIIiksIAorCQkJICAgIDEsIGZpbGVuYW1lLCBPX1JET05MWSwgMCwgJnNjcmF0Y2hfcGF0aG5hbWUpOworICAgIH0KKyAgaWYgKHNjcmF0Y2hfY2hhbiA8IDApCisgICAgeworICAgICAgcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworICAgIH0KKyAgLyogTGVhdmUgc2NyYXRjaF9wYXRobmFtZSBhbGxvY2F0ZWQuICBhYmZkLT5uYW1lIHdpbGwgcG9pbnQgdG8gaXQuICAqLworCisgIGFiZmQgPSBiZmRfZmRvcGVuciAoc2NyYXRjaF9wYXRobmFtZSwgZ251dGFyZ2V0LCBzY3JhdGNoX2NoYW4pOworICBpZiAoIWFiZmQpCisgICAgeworICAgICAgY2xvc2UgKHNjcmF0Y2hfY2hhbik7CisgICAgICBlcnJvciAoIkNvdWxkIG5vdCBvcGVuIGAlcycgYXMgYW4gZXhlY3V0YWJsZSBmaWxlOiAlcyIsCisJICAgICBzY3JhdGNoX3BhdGhuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgfQorICAvKiBMZWF2ZSBiZmQgb3BlbiwgY29yZV94ZmVyX21lbW9yeSBhbmQgImluZm8gZmlsZXMiIG5lZWQgaXQuICAqLworICBzbyAtPiBhYmZkID0gYWJmZDsKKyAgYWJmZCAtPiBjYWNoZWFibGUgPSB0cnVlOworCisgIC8qIGNvcHkgZnVsbCBwYXRoIG5hbWUgaW50byBzb19uYW1lLCBzbyB0aGF0IGxhdGVyIHN5bWJvbF9maWxlX2FkZCBjYW4gZmluZAorICAgICBpdCAqLworICBpZiAoc3RybGVuIChzY3JhdGNoX3BhdGhuYW1lKSA+PSBNQVhfUEFUSF9TSVpFKQorICAgIGVycm9yICgiRnVsbCBwYXRoIG5hbWUgbGVuZ3RoIG9mIHNoYXJlZCBsaWJyYXJ5IGV4Y2VlZHMgTUFYX1BBVEhfU0laRSBpbiBzb19saXN0IHN0cnVjdHVyZS4iKTsKKyAgc3RyY3B5IChzby0+c29fbmFtZSwgc2NyYXRjaF9wYXRobmFtZSk7CisKKyAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKKyAgICB7CisgICAgICBlcnJvciAoIlwiJXNcIjogbm90IGluIGV4ZWN1dGFibGUgZm9ybWF0OiAlcy4iLAorCSAgICAgc2NyYXRjaF9wYXRobmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICAgIH0KKyAgaWYgKGJ1aWxkX3NlY3Rpb25fdGFibGUgKGFiZmQsICZzbyAtPiBzZWN0aW9ucywgJnNvIC0+IHNlY3Rpb25zX2VuZCkpCisgICAgeworICAgICAgZXJyb3IgKCJDYW4ndCBmaW5kIHRoZSBmaWxlIHNlY3Rpb25zIGluIGAlcyc6ICVzIiwgCisJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICAgIH0KKworICBmb3IgKHAgPSBzbyAtPiBzZWN0aW9uczsgcCA8IHNvIC0+IHNlY3Rpb25zX2VuZDsgcCsrKQorICAgIHsKKyAgICAgIC8qIFJlbG9jYXRlIHRoZSBzZWN0aW9uIGJpbmRpbmcgYWRkcmVzc2VzIGFzIHJlY29yZGVkIGluIHRoZSBzaGFyZWQKKwkgb2JqZWN0J3MgZmlsZSBieSB0aGUgYmFzZSBhZGRyZXNzIHRvIHdoaWNoIHRoZSBvYmplY3Qgd2FzIGFjdHVhbGx5CisJIG1hcHBlZC4gKi8KKyAgICAgIHAgLT4gYWRkciArPSAoQ09SRV9BRERSKSBMTV9BRERSIChzbyk7CisgICAgICBwIC0+IGVuZGFkZHIgKz0gKENPUkVfQUREUikgTE1fQUREUiAoc28pOworICAgICAgc28gLT4gbG1lbmQgPSAoQ09SRV9BRERSKSBtYXggKHAgLT4gZW5kYWRkciwgc28gLT4gbG1lbmQpOworICAgICAgaWYgKFNUUkVRIChwIC0+IHRoZV9iZmRfc2VjdGlvbiAtPiBuYW1lLCAiLnRleHQiKSkKKwl7CisJICBzbyAtPiB0ZXh0c2VjdGlvbiA9IHA7CisJfQorICAgIH0KKworICAvKiBGcmVlIHRoZSBmaWxlIG5hbWVzLCBjbG9zZSB0aGUgZmlsZSBub3cuICAqLworICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKKworICByZXR1cm4gKDEpOworfQorCisjaWZuZGVmIFNWUjRfU0hBUkVEX0xJQlMKKworLyogQWxsb2NhdGUgdGhlIHJ1bnRpbWUgY29tbW9uIG9iamVjdCBmaWxlLiAgKi8KKworc3RhdGljIHZvaWQKK2FsbG9jYXRlX3J0X2NvbW1vbl9vYmpmaWxlICgpCit7CisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICBzdHJ1Y3Qgb2JqZmlsZSAqbGFzdF9vbmU7CisKKyAgb2JqZmlsZSA9IChzdHJ1Y3Qgb2JqZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBvYmpmaWxlKSk7CisgIG1lbXNldCAob2JqZmlsZSwgMCwgc2l6ZW9mIChzdHJ1Y3Qgb2JqZmlsZSkpOworICBvYmpmaWxlIC0+IG1kID0gTlVMTDsKKyAgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb24gKCZvYmpmaWxlIC0+IHBzeW1ib2xfY2FjaGUuY2FjaGUsIDAsIDAsCisJCQkgICAgICB4bWFsbG9jLCBmcmVlKTsKKyAgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb24gKCZvYmpmaWxlIC0+IHBzeW1ib2xfb2JzdGFjaywgMCwgMCwgeG1hbGxvYywKKwkJCSAgICAgIGZyZWUpOworICBvYnN0YWNrX3NwZWNpZnlfYWxsb2NhdGlvbiAoJm9iamZpbGUgLT4gc3ltYm9sX29ic3RhY2ssIDAsIDAsIHhtYWxsb2MsCisJCQkgICAgICBmcmVlKTsKKyAgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb24gKCZvYmpmaWxlIC0+IHR5cGVfb2JzdGFjaywgMCwgMCwgeG1hbGxvYywKKwkJCSAgICAgIGZyZWUpOworICBvYmpmaWxlIC0+IG5hbWUgPSBtc3Ryc2F2ZSAob2JqZmlsZSAtPiBtZCwgInJ0X2NvbW1vbiIpOworCisgIC8qIEFkZCB0aGlzIGZpbGUgb250byB0aGUgdGFpbCBvZiB0aGUgbGlua2VkIGxpc3Qgb2Ygb3RoZXIgc3VjaCBmaWxlcy4gKi8KKworICBvYmpmaWxlIC0+IG5leHQgPSBOVUxMOworICBpZiAob2JqZWN0X2ZpbGVzID09IE5VTEwpCisgICAgb2JqZWN0X2ZpbGVzID0gb2JqZmlsZTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAobGFzdF9vbmUgPSBvYmplY3RfZmlsZXM7CisJICAgbGFzdF9vbmUgLT4gbmV4dDsKKwkgICBsYXN0X29uZSA9IGxhc3Rfb25lIC0+IG5leHQpOworICAgICAgbGFzdF9vbmUgLT4gbmV4dCA9IG9iamZpbGU7CisgICAgfQorCisgIHJ0X2NvbW1vbl9vYmpmaWxlID0gb2JqZmlsZTsKK30KKworLyogUmVhZCBhbGwgZHluYW1pY2FsbHkgbG9hZGVkIGNvbW1vbiBzeW1ib2wgZGVmaW5pdGlvbnMgZnJvbSB0aGUgaW5mZXJpb3IKKyAgIGFuZCBwdXQgdGhlbSBpbnRvIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZSBmb3IgdGhlIHJ1bnRpbWUgY29tbW9uCisgICBvYmpmaWxlLiAgKi8KKworc3RhdGljIHZvaWQKK3NvbGliX2FkZF9jb21tb25fc3ltYm9scyAocnRjX3N5bXApCisgICAgc3RydWN0IHJ0Y19zeW1iICpydGNfc3ltcDsKK3sKKyAgc3RydWN0IHJ0Y19zeW1iIGluZmVyaW9yX3J0Y19zeW1iOworICBzdHJ1Y3Qgbmxpc3QgaW5mZXJpb3JfcnRjX25saXN0OworICBpbnQgbGVuOworICBjaGFyICpuYW1lOworCisgIC8qIFJlbW92ZSBhbnkgcnVudGltZSBjb21tb24gc3ltYm9scyBmcm9tIHByZXZpb3VzIHJ1bnMuICAqLworCisgIGlmIChydF9jb21tb25fb2JqZmlsZSAhPSBOVUxMICYmIHJ0X2NvbW1vbl9vYmpmaWxlIC0+IG1pbmltYWxfc3ltYm9sX2NvdW50KQorICAgIHsKKyAgICAgIG9ic3RhY2tfZnJlZSAoJnJ0X2NvbW1vbl9vYmpmaWxlIC0+IHN5bWJvbF9vYnN0YWNrLCAwKTsKKyAgICAgIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uICgmcnRfY29tbW9uX29iamZpbGUgLT4gc3ltYm9sX29ic3RhY2ssIDAsIDAsCisJCQkJICB4bWFsbG9jLCBmcmVlKTsKKyAgICAgIHJ0X2NvbW1vbl9vYmpmaWxlIC0+IG1pbmltYWxfc3ltYm9sX2NvdW50ID0gMDsKKyAgICAgIHJ0X2NvbW1vbl9vYmpmaWxlIC0+IG1zeW1ib2xzID0gTlVMTDsKKyAgICB9CisKKyAgaW5pdF9taW5pbWFsX3N5bWJvbF9jb2xsZWN0aW9uICgpOworICBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZGlzY2FyZF9taW5pbWFsX3N5bWJvbHMsIDApOworCisgIHdoaWxlIChydGNfc3ltcCkKKyAgICB7CisgICAgICByZWFkX21lbW9yeSAoKENPUkVfQUREUikgcnRjX3N5bXAsCisJCSAgIChjaGFyICopICZpbmZlcmlvcl9ydGNfc3ltYiwKKwkJICAgc2l6ZW9mIChpbmZlcmlvcl9ydGNfc3ltYikpOworICAgICAgcmVhZF9tZW1vcnkgKChDT1JFX0FERFIpIGluZmVyaW9yX3J0Y19zeW1iLnJ0Y19zcCwKKwkJICAgKGNoYXIgKikgJmluZmVyaW9yX3J0Y19ubGlzdCwKKwkJICAgc2l6ZW9mKGluZmVyaW9yX3J0Y19ubGlzdCkpOworICAgICAgaWYgKGluZmVyaW9yX3J0Y19ubGlzdC5uX3R5cGUgPT0gTl9DT01NKQorCXsKKwkgIC8qIEZJWE1FOiBUaGUgbGVuZ3RoIG9mIHRoZSBzeW1ib2wgbmFtZSBpcyBub3QgYXZhaWxhYmxlLCBidXQgaW4gdGhlCisJICAgICBjdXJyZW50IGltcGxlbWVudGF0aW9uIHRoZSBjb21tb24gc3ltYm9sIGlzIGFsbG9jYXRlZCBpbW1lZGlhdGVseQorCSAgICAgYmVoaW5kIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuICovCisJICBsZW4gPSBpbmZlcmlvcl9ydGNfbmxpc3Qubl92YWx1ZSAtIGluZmVyaW9yX3J0Y19ubGlzdC5uX3VuLm5fc3RyeDsKKworCSAgbmFtZSA9IHhtYWxsb2MgKGxlbik7CisJICByZWFkX21lbW9yeSAoKENPUkVfQUREUikgaW5mZXJpb3JfcnRjX25saXN0Lm5fdW4ubl9uYW1lLCBuYW1lLCBsZW4pOworCisJICAvKiBBbGxvY2F0ZSB0aGUgcnVudGltZSBjb21tb24gb2JqZmlsZSBpZiBuZWNlc3NhcnkuICovCisJICBpZiAocnRfY29tbW9uX29iamZpbGUgPT0gTlVMTCkKKwkgICAgYWxsb2NhdGVfcnRfY29tbW9uX29iamZpbGUgKCk7CisKKwkgIHByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9sIChuYW1lLCBpbmZlcmlvcl9ydGNfbmxpc3Qubl92YWx1ZSwKKwkJCQkgICAgICBtc3RfYnNzLCBydF9jb21tb25fb2JqZmlsZSk7CisJICBmcmVlIChuYW1lKTsKKwl9CisgICAgICBydGNfc3ltcCA9IGluZmVyaW9yX3J0Y19zeW1iLnJ0Y19uZXh0OworICAgIH0KKworICAvKiBJbnN0YWxsIGFueSBtaW5pbWFsIHN5bWJvbHMgdGhhdCBoYXZlIGJlZW4gY29sbGVjdGVkIGFzIHRoZSBjdXJyZW50CisgICAgIG1pbmltYWwgc3ltYm9scyBmb3IgdGhlIHJ1bnRpbWUgY29tbW9uIG9iamZpbGUuICAqLworCisgIGluc3RhbGxfbWluaW1hbF9zeW1ib2xzIChydF9jb21tb25fb2JqZmlsZSk7Cit9CisKKyNlbmRpZgkvKiBTVlI0X1NIQVJFRF9MSUJTICovCisKKworI2lmZGVmIFNWUjRfU0hBUkVEX0xJQlMKKworc3RhdGljIENPUkVfQUREUgorYmZkX2xvb2t1cF9zeW1ib2wgUEFSQU1TICgoYmZkICosIGNoYXIgKikpOworCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJYmZkX2xvb2t1cF9zeW1ib2wgLS0gbG9va3VwIHRoZSB2YWx1ZSBmb3IgYSBzcGVjaWZpYyBzeW1ib2wKKworU1lOT1BTSVMKKworCUNPUkVfQUREUiBiZmRfbG9va3VwX3N5bWJvbCAoYmZkICphYmZkLCBjaGFyICpzeW1uYW1lKQorCitERVNDUklQVElPTgorCisJQW4gZXhwZW5zaXZlIHdheSB0byBsb29rdXAgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIHN5bWJvbCBmb3IKKwliZmQncyB0aGF0IGFyZSBvbmx5IHRlbXBvcmFyeSBhbnl3YXkuICBUaGlzIGlzIHVzZWQgYnkgdGhlCisJc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCB0byBmaW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBkZWJ1Z2dlcgorCWludGVyZmFjZSBzdHJ1Y3R1cmVzIGluIHRoZSBzaGFyZWQgbGlicmFyeS4KKworCU5vdGUgdGhhdCAwIGlzIHNwZWNpZmljYWxseSBhbGxvd2VkIGFzIGFuIGVycm9yIHJldHVybiAobm8KKwlzdWNoIHN5bWJvbCkuCisqLworCitzdGF0aWMgQ09SRV9BRERSCitiZmRfbG9va3VwX3N5bWJvbCAoYWJmZCwgc3ltbmFtZSkKKyAgICAgYmZkICphYmZkOworICAgICBjaGFyICpzeW1uYW1lOworeworICB1bnNpZ25lZCBpbnQgc3RvcmFnZV9uZWVkZWQ7CisgIGFzeW1ib2wgKnN5bTsKKyAgYXN5bWJvbCAqKnN5bWJvbF90YWJsZTsKKyAgdW5zaWduZWQgaW50IG51bWJlcl9vZl9zeW1ib2xzOworICB1bnNpZ25lZCBpbnQgaTsKKyAgc3RydWN0IGNsZWFudXAgKmJhY2tfdG87CisgIENPUkVfQUREUiBzeW1hZGRyID0gMDsKKyAgCisgIHN0b3JhZ2VfbmVlZGVkID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOworCisgIGlmIChzdG9yYWdlX25lZWRlZCA+IDApCisgICAgeworICAgICAgc3ltYm9sX3RhYmxlID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN0b3JhZ2VfbmVlZGVkKTsKKyAgICAgIGJhY2tfdG8gPSBtYWtlX2NsZWFudXAgKGZyZWUsIChQVFIpc3ltYm9sX3RhYmxlKTsKKyAgICAgIG51bWJlcl9vZl9zeW1ib2xzID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIHN5bWJvbF90YWJsZSk7IAorICAKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2Zfc3ltYm9sczsgaSsrKQorCXsKKwkgIHN5bSA9ICpzeW1ib2xfdGFibGUrKzsKKwkgIGlmIChTVFJFUSAoc3ltIC0+IG5hbWUsIHN5bW5hbWUpKQorCSAgICB7CisJICAgICAgLyogQmZkIHN5bWJvbHMgYXJlIHNlY3Rpb24gcmVsYXRpdmUuICovCisJICAgICAgc3ltYWRkciA9IHN5bSAtPiB2YWx1ZSArIHN5bSAtPiBzZWN0aW9uIC0+IHZtYTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGRvX2NsZWFudXBzIChiYWNrX3RvKTsKKyAgICB9CisgIHJldHVybiAoc3ltYWRkcik7Cit9CisKKyNpZmRlZiBIQU5ETEVfU1ZSNF9FWEVDX0VNVUxBVE9SUworCisvKgorCVNvbGFyaXMgQkNQICh0aGUgcGFydCBvZiBTb2xhcmlzIHdoaWNoIGFsbG93cyBpdCB0byBydW4gU3VuT1M0CisJYS5vdXQgZmlsZXMpIHRocm93cyBpbiBhbm90aGVyIHdyaW5rbGUuIFNvbGFyaXMgZG9lcyBub3QgZmlsbAorCWluIHRoZSB1c3VhbCBhLm91dCBsaW5rIG1hcCBzdHJ1Y3R1cmVzIHdoZW4gcnVubmluZyBCQ1AgcHJvZ3JhbXMsCisJdGhlIG9ubHkgd2F5IHRvIGdldCBhdCB0aGVtIGlzIHZpYSBncm9waW5nIGFyb3VuZCBpbiB0aGUgZHluYW1pYworCWxpbmtlci4KKwlUaGUgZHluYW1pYyBsaW5rZXIgYW5kIGl0J3Mgc3RydWN0dXJlcyBhcmUgbG9jYXRlZCBpbiB0aGUgc2hhcmVkCisJQyBsaWJyYXJ5LCB3aGljaCBnZXRzIHJ1biBhcyB0aGUgZXhlY3V0YWJsZSdzICJpbnRlcnByZXRlciIgYnkKKwl0aGUga2VybmVsLgorCisJTm90ZSB0aGF0IHdlIGNhbiBhc3N1bWUgbm90aGluZyBhYm91dCB0aGUgcHJvY2VzcyBzdGF0ZSBhdCB0aGUgdGltZQorCXdlIG5lZWQgdG8gZmluZCB0aGVzZSBzdHJ1Y3R1cmVzLiAgV2UgbWF5IGJlIHN0b3BwZWQgb24gdGhlIGZpcnN0CisJaW5zdHJ1Y3Rpb24gb2YgdGhlIGludGVycHJldGVyIChDIHNoYXJlZCBsaWJyYXJ5KSwgdGhlIGZpcnN0CisJaW5zdHJ1Y3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUgaXRzZWxmLCBvciBzb21ld2hlcmUgZWxzZSBlbnRpcmVseQorCShpZiB3ZSBhdHRhY2hlZCB0byB0aGUgcHJvY2VzcyBmb3IgZXhhbXBsZSkuCisqLworCitzdGF0aWMgY2hhciAqZGVidWdfYmFzZV9zeW1ib2xzW10gPSB7CisgICJyX2RlYnVnIiwJLyogU29sYXJpcyAyLjMgKi8KKyAgIl9yX2RlYnVnIiwJLyogU29sYXJpcyAyLjEsIDIuMiAqLworICBOVUxMCit9OworCitzdGF0aWMgaW50Citsb29rX2Zvcl9iYXNlIFBBUkFNUyAoKGludCwgQ09SRV9BRERSKSk7CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlsb29rX2Zvcl9iYXNlIC0tIGV4YW1pbmUgZmlsZSBmb3IgZWFjaCBtYXBwZWQgYWRkcmVzcyBzZWdtZW50CisKK1NZTk9QU1lTCisKKwlzdGF0aWMgaW50IGxvb2tfZm9yX2Jhc2UgKGludCBmZCwgQ09SRV9BRERSIGJhc2VhZGRyKQorCitERVNDUklQVElPTgorCisJVGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gcHJvY19pdGVyYXRlX292ZXJfbWFwcGluZ3MsIHdoaWNoCisJY2F1c2VzIGl0IHRvIGdldCBjYWxsZWQgb25jZSBmb3IgZWFjaCBtYXBwZWQgYWRkcmVzcyBzcGFjZSwgd2l0aAorCWFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZSBtYXBwZWQgdG8gdGhhdCBzcGFjZSwgYW5kIHRoZQorCWJhc2UgYWRkcmVzcyBvZiB0aGF0IG1hcHBlZCBzcGFjZS4KKworCU91ciBqb2IgaXMgdG8gZmluZCB0aGUgZGVidWcgYmFzZSBzeW1ib2wgaW4gdGhlIGZpbGUgdGhhdCB0aGlzCisJZmQgaXMgb3BlbiBvbiwgaWYgaXQgZXhpc3RzLCBhbmQgaWYgc28sIGluaXRpYWxpemUgdGhlIGR5bmFtaWMKKwlsaW5rZXIgc3RydWN0dXJlIGJhc2UgYWRkcmVzcyBkZWJ1Z19iYXNlLgorCisJTm90ZSB0aGF0IHRoaXMgaXMgYSBjb21wdXRhdGlvbmFsbHkgZXhwZW5zaXZlIHByb3Bvc2l0aW9uLCBzaW5jZQorCXdlIGJhc2ljYWxseSBoYXZlIHRvIG9wZW4gYSBiZmQgb24gZXZlcnkgY2FsbCwgc28gd2Ugc3BlY2lmaWNhbGx5CisJYXZvaWQgb3BlbmluZyB0aGUgZXhlYyBmaWxlLgorICovCisKK3N0YXRpYyBpbnQKK2xvb2tfZm9yX2Jhc2UgKGZkLCBiYXNlYWRkcikKKyAgICAgaW50IGZkOworICAgICBDT1JFX0FERFIgYmFzZWFkZHI7Cit7CisgIGJmZCAqaW50ZXJwX2JmZDsKKyAgQ09SRV9BRERSIGFkZHJlc3MgPSAwOworICBjaGFyICoqc3ltYm9scDsKKworICAvKiBJZiB0aGUgZmQgaXMgLTEsIHRoZW4gdGhlcmUgaXMgbm8gZmlsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMKKyAgICAgbWFwcGVkIG1lbW9yeSBzZWdtZW50LCBzbyBza2lwIGl0LiAgQWxzbywgaWYgdGhlIGZkIGNvcnJlc3BvbmRzCisgICAgIHRvIHRoZSBleGVjIGZpbGUsIHNraXAgaXQgYXMgd2VsbC4gKi8KKworICBpZiAoZmQgPT0gLTEKKyAgICAgIHx8IChleGVjX2JmZCAhPSBOVUxMCisJICAmJiBmZG1hdGNoIChmaWxlbm8gKChGSUxFICopKGV4ZWNfYmZkIC0+IGlvc3RyZWFtKSksIGZkKSkpCisgICAgeworICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisKKyAgLyogVHJ5IHRvIG9wZW4gd2hhdGV2ZXIgcmFuZG9tIGZpbGUgdGhpcyBmZCBjb3JyZXNwb25kcyB0by4gIE5vdGUgdGhhdAorICAgICB3ZSBoYXZlIG5vIHdheSBjdXJyZW50bHkgdG8gZmluZCB0aGUgZmlsZW5hbWUuICBEb24ndCBncmlwZSBhYm91dAorICAgICBhbnkgcHJvYmxlbXMgd2UgbWlnaHQgaGF2ZSwganVzdCBmYWlsLiAqLworCisgIGlmICgoaW50ZXJwX2JmZCA9IGJmZF9mZG9wZW5yICgidW5uYW1lZCIsIGdudXRhcmdldCwgZmQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiAoMCk7CisgICAgfQorICBpZiAoIWJmZF9jaGVja19mb3JtYXQgKGludGVycF9iZmQsIGJmZF9vYmplY3QpKQorICAgIHsKKyAgICAgIC8qIEZJWE1FLWxlYWs6IG9uIGZhaWx1cmUsIG1pZ2h0IG5vdCBmcmVlIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoCisJIGludGVycF9iZmQuICAqLworICAgICAgYmZkX2Nsb3NlIChpbnRlcnBfYmZkKTsKKyAgICAgIHJldHVybiAoMCk7CisgICAgfQorCisgIC8qIE5vdyB0cnkgdG8gZmluZCBvdXIgZGVidWcgYmFzZSBzeW1ib2wgaW4gdGhpcyBmaWxlLCB3aGljaCB3ZSBhdAorICAgICBsZWFzdCBrbm93IHRvIGJlIGEgdmFsaWQgRUxGIGV4ZWN1dGFibGUgb3Igc2hhcmVkIGxpYnJhcnkuICovCisKKyAgZm9yIChzeW1ib2xwID0gZGVidWdfYmFzZV9zeW1ib2xzOyAqc3ltYm9scCAhPSBOVUxMOyBzeW1ib2xwKyspCisgICAgeworICAgICAgYWRkcmVzcyA9IGJmZF9sb29rdXBfc3ltYm9sIChpbnRlcnBfYmZkLCAqc3ltYm9scCk7CisgICAgICBpZiAoYWRkcmVzcyAhPSAwKQorCXsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIGlmIChhZGRyZXNzID09IDApCisgICAgeworICAgICAgLyogRklYTUUtbGVhazogb24gZmFpbHVyZSwgbWlnaHQgbm90IGZyZWUgYWxsIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGgKKwkgaW50ZXJwX2JmZC4gICovCisgICAgICBiZmRfY2xvc2UgKGludGVycF9iZmQpOworICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisKKyAgLyogRXVyZWthISAgV2UgZm91bmQgdGhlIHN5bWJvbC4gIEJ1dCBub3cgd2UgbWF5IG5lZWQgdG8gcmVsb2NhdGUgaXQKKyAgICAgYnkgdGhlIGJhc2UgYWRkcmVzcy4gIElmIHRoZSBzeW1ib2wncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIGJhc2UKKyAgICAgYWRkcmVzcyBvZiB0aGUgc2hhcmVkIGxpYnJhcnksIHRoZW4gaXQgaGFzbid0IHlldCBiZWVuIHJlbG9jYXRlZAorICAgICBieSB0aGUgZHluYW1pYyBsaW5rZXIsIGFuZCB3ZSBoYXZlIHRvIGRvIGl0IG91cnNlbGYuICBGSVhNRTogTm90ZQorICAgICB0aGF0IHdlIG1ha2UgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgZmlyc3Qgc2VnbWVudCB0aGF0IGNvcnJlc3BvbmRzCisgICAgIHRvIHRoZSBzaGFyZWQgbGlicmFyeSBoYXMgdGhlIGJhc2UgYWRkcmVzcyB0byB3aGljaCB0aGUgbGlicmFyeQorICAgICB3YXMgcmVsb2NhdGVkLiAqLworCisgIGlmIChhZGRyZXNzIDwgYmFzZWFkZHIpCisgICAgeworICAgICAgYWRkcmVzcyArPSBiYXNlYWRkcjsKKyAgICB9CisgIGRlYnVnX2Jhc2UgPSBhZGRyZXNzOworICAvKiBGSVhNRS1sZWFrOiBvbiBmYWlsdXJlLCBtaWdodCBub3QgZnJlZSBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aAorICAgICBpbnRlcnBfYmZkLiAgKi8KKyAgYmZkX2Nsb3NlIChpbnRlcnBfYmZkKTsKKyAgcmV0dXJuICgxKTsKK30KKyNlbmRpZiAvKiBIQU5ETEVfU1ZSNF9FWEVDX0VNVUxBVE9SUyAqLworCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJZWxmX2xvY2F0ZV9iYXNlIC0tIGxvY2F0ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIGR5bmFtaWMgbGlua2VyIHN0cnVjdHMKKwlmb3IgU1ZSNCBlbGYgdGFyZ2V0cy4KKworU1lOT1BTSVMKKworCUNPUkVfQUREUiBlbGZfbG9jYXRlX2Jhc2UgKHZvaWQpCisKK0RFU0NSSVBUSU9OCisKKwlGb3IgU1ZSNCBlbGYgdGFyZ2V0cyB0aGUgYWRkcmVzcyBvZiB0aGUgZHluYW1pYyBsaW5rZXIncyBydW50aW1lCisJc3RydWN0dXJlIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGR5bmFtaWMgaW5mbyBzZWN0aW9uIGluIHRoZQorCWV4ZWN1dGFibGUgZmlsZS4gIFRoZSBkeW5hbWljIHNlY3Rpb24gaXMgYWxzbyBtYXBwZWQgaW50byB0aGUKKwlpbmZlcmlvciBhZGRyZXNzIHNwYWNlLiAgQmVjYXVzZSB0aGUgcnVudGltZSBsb2FkZXIgZmlsbHMgaW4gdGhlCisJcmVhbCBhZGRyZXNzIGJlZm9yZSBzdGFydGluZyB0aGUgaW5mZXJpb3IsIHdlIGhhdmUgdG8gcmVhZCBpbiB0aGUKKwlkeW5hbWljIGluZm8gc2VjdGlvbiBmcm9tIHRoZSBpbmZlcmlvciBhZGRyZXNzIHNwYWNlLgorCUlmIHRoZXJlIGFyZSBhbnkgZXJyb3JzIHdoaWxlIHRyeWluZyB0byBmaW5kIHRoZSBhZGRyZXNzLCB3ZQorCXNpbGVudGx5IHJldHVybiAwLCBvdGhlcndpc2UgdGhlIGZvdW5kIGFkZHJlc3MgaXMgcmV0dXJuZWQuCisKKyAqLworCitzdGF0aWMgQ09SRV9BRERSCitlbGZfbG9jYXRlX2Jhc2UgKCkKK3sKKyAgc2VjX3B0ciBkeW5pbmZvX3NlY3Q7CisgIGludCBkeW5pbmZvX3NlY3Rfc2l6ZTsKKyAgQ09SRV9BRERSIGR5bmluZm9fYWRkcjsKKyAgY2hhciAqYnVmOworICBjaGFyICpidWZlbmQ7CisKKyAgLyogRmluZCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gICovCisgIGR5bmluZm9fc2VjdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChleGVjX2JmZCwgIi5keW5hbWljIik7CisgIGlmIChkeW5pbmZvX3NlY3QgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKyAgZHluaW5mb19hZGRyID0gYmZkX3NlY3Rpb25fdm1hIChleGVjX2JmZCwgZHluaW5mb19zZWN0KTsKKworICAvKiBSZWFkIGluIC5keW5hbWljIHNlY3Rpb24sIHNpbGVudGx5IGlnbm9yZSBlcnJvcnMuICAqLworICBkeW5pbmZvX3NlY3Rfc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGV4ZWNfYmZkLCBkeW5pbmZvX3NlY3QpOworICBidWYgPSBhbGxvY2EgKGR5bmluZm9fc2VjdF9zaXplKTsKKyAgaWYgKHRhcmdldF9yZWFkX21lbW9yeSAoZHluaW5mb19hZGRyLCBidWYsIGR5bmluZm9fc2VjdF9zaXplKSkKKyAgICByZXR1cm4gMDsKKworICAvKiBGaW5kIHRoZSBEVF9ERUJVRyBlbnRyeSBpbiB0aGUgdGhlIC5keW5hbWljIHNlY3Rpb24uCisgICAgIEZvciBtaXBzIGVsZiB3ZSBsb29rIGZvciBEVF9NSVBTX1JMRF9NQVAsIG1pcHMgZWxmIGFwcGFyZW50bHkgaGFzCisgICAgIG5vIERUX0RFQlVHIGVudHJpZXMuICAqLworI2lmbmRlZiBUQVJHRVRfRUxGNjQKKyAgZm9yIChidWZlbmQgPSBidWYgKyBkeW5pbmZvX3NlY3Rfc2l6ZTsKKyAgICAgICBidWYgPCBidWZlbmQ7CisgICAgICAgYnVmICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfRHluKSkKKyAgICB7CisgICAgICBFbGYzMl9FeHRlcm5hbF9EeW4gKnhfZHlucCA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKilidWY7CisgICAgICBsb25nIGR5bl90YWc7CisgICAgICBDT1JFX0FERFIgZHluX3B0cjsKKworICAgICAgZHluX3RhZyA9IGJmZF9oX2dldF8zMiAoZXhlY19iZmQsIChiZmRfYnl0ZSAqKSB4X2R5bnAtPmRfdGFnKTsKKyAgICAgIGlmIChkeW5fdGFnID09IERUX05VTEwpCisJYnJlYWs7CisgICAgICBlbHNlIGlmIChkeW5fdGFnID09IERUX0RFQlVHKQorCXsKKwkgIGR5bl9wdHIgPSBiZmRfaF9nZXRfMzIgKGV4ZWNfYmZkLCAoYmZkX2J5dGUgKikgeF9keW5wLT5kX3VuLmRfcHRyKTsKKwkgIHJldHVybiBkeW5fcHRyOworCX0KKyNpZmRlZiBEVF9NSVBTX1JMRF9NQVAKKyAgICAgIGVsc2UgaWYgKGR5bl90YWcgPT0gRFRfTUlQU19STERfTUFQKQorCXsKKwkgIGNoYXIgcGJ1ZltUQVJHRVRfUFRSX0JJVCAvIEhPU1RfQ0hBUl9CSVRdOworCisJICAvKiBEVF9NSVBTX1JMRF9NQVAgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBhZGRyZXNzCisJICAgICBvZiB0aGUgZHluYW1pYyBsaW5rIHN0cnVjdHVyZS4gICovCisJICBkeW5fcHRyID0gYmZkX2hfZ2V0XzMyIChleGVjX2JmZCwgKGJmZF9ieXRlICopIHhfZHlucC0+ZF91bi5kX3B0cik7CisJICBpZiAodGFyZ2V0X3JlYWRfbWVtb3J5IChkeW5fcHRyLCBwYnVmLCBzaXplb2YgKHBidWYpKSkKKwkgICAgcmV0dXJuIDA7CisJICByZXR1cm4gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChwYnVmLCBzaXplb2YgKHBidWYpKTsKKwl9CisjZW5kaWYKKyAgICB9CisjZWxzZSAvKiBFTEY2NCAqLworICBmb3IgKGJ1ZmVuZCA9IGJ1ZiArIGR5bmluZm9fc2VjdF9zaXplOworICAgICAgIGJ1ZiA8IGJ1ZmVuZDsKKyAgICAgICBidWYgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9EeW4pKQorICAgIHsKKyAgICAgIEVsZjY0X0V4dGVybmFsX0R5biAqeF9keW5wID0gKEVsZjY0X0V4dGVybmFsX0R5biAqKWJ1ZjsKKyAgICAgIGxvbmcgZHluX3RhZzsKKyAgICAgIENPUkVfQUREUiBkeW5fcHRyOworCisgICAgICBkeW5fdGFnID0gYmZkX2hfZ2V0XzY0IChleGVjX2JmZCwgKGJmZF9ieXRlICopIHhfZHlucC0+ZF90YWcpOworICAgICAgaWYgKGR5bl90YWcgPT0gRFRfTlVMTCkKKwlicmVhazsKKyAgICAgIGVsc2UgaWYgKGR5bl90YWcgPT0gRFRfREVCVUcpCisJeworCSAgZHluX3B0ciA9IGJmZF9oX2dldF82NCAoZXhlY19iZmQsIChiZmRfYnl0ZSAqKSB4X2R5bnAtPmRfdW4uZF9wdHIpOworCSAgcmV0dXJuIGR5bl9wdHI7CisJfQorICAgIH0KKyNlbmRpZgorCisgIC8qIERUX0RFQlVHIGVudHJ5IG5vdCBmb3VuZC4gICovCisgIHJldHVybiAwOworfQorCisjZW5kaWYJLyogU1ZSNF9TSEFSRURfTElCUyAqLworCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJbG9jYXRlX2Jhc2UgLS0gbG9jYXRlIHRoZSBiYXNlIGFkZHJlc3Mgb2YgZHluYW1pYyBsaW5rZXIgc3RydWN0cworCitTWU5PUFNJUworCisJQ09SRV9BRERSIGxvY2F0ZV9iYXNlICh2b2lkKQorCitERVNDUklQVElPTgorCisJRm9yIGJvdGggdGhlIFN1bk9TIGFuZCBTVlI0IHNoYXJlZCBsaWJyYXJ5IGltcGxlbWVudGF0aW9ucywgaWYgdGhlCisJaW5mZXJpb3IgZXhlY3V0YWJsZSBoYXMgYmVlbiBsaW5rZWQgZHluYW1pY2FsbHksIHRoZXJlIGlzIGEgc2luZ2xlCisJYWRkcmVzcyBzb21ld2hlcmUgaW4gdGhlIGluZmVyaW9yJ3MgZGF0YSBzcGFjZSB3aGljaCBpcyB0aGUga2V5IHRvCisJbG9jYXRpbmcgYWxsIG9mIHRoZSBkeW5hbWljIGxpbmtlcidzIHJ1bnRpbWUgc3RydWN0dXJlcy4gIFRoaXMKKwlhZGRyZXNzIGlzIHRoZSB2YWx1ZSBvZiB0aGUgZGVidWcgYmFzZSBzeW1ib2wuICBUaGUgam9iIG9mIHRoaXMKKwlmdW5jdGlvbiBpcyB0byBmaW5kIGFuZCByZXR1cm4gdGhhdCBhZGRyZXNzLCBvciB0byByZXR1cm4gMCBpZiB0aGVyZQorCWlzIG5vIHN1Y2ggYWRkcmVzcyAodGhlIGV4ZWN1dGFibGUgaXMgc3RhdGljYWxseSBsaW5rZWQgZm9yIGV4YW1wbGUpLgorCisJRm9yIFN1bk9TLCB0aGUgam9iIGlzIGFsbW9zdCB0cml2aWFsLCBzaW5jZSB0aGUgZHluYW1pYyBsaW5rZXIgYW5kCisJYWxsIG9mIGl0J3Mgc3RydWN0dXJlcyBhcmUgc3RhdGljYWxseSBsaW5rZWQgdG8gdGhlIGV4ZWN1dGFibGUgYXQKKwlsaW5rIHRpbWUuICBUaHVzIHRoZSBzeW1ib2wgZm9yIHRoZSBhZGRyZXNzIHdlIGFyZSBsb29raW5nIGZvciBoYXMKKwlhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlIGZvciB0aGUgZXhlY3V0YWJsZSdzCisJb2JqZmlsZSBhdCB0aGUgdGltZSB0aGUgc3ltYm9sIGZpbGUncyBzeW1ib2xzIHdlcmUgcmVhZCwgYW5kIGFsbCB3ZQorCWhhdmUgdG8gZG8gaXMgbG9vayBpdCB1cCB0aGVyZS4gIE5vdGUgdGhhdCB3ZSBleHBsaWNpdGx5IGRvIE5PVCB3YW50CisJdG8gZmluZCB0aGUgY29waWVzIGluIHRoZSBzaGFyZWQgbGlicmFyeS4KKworCVRoZSBTVlI0IHZlcnNpb24gaXMgYSBiaXQgbW9yZSBjb21wbGljYXRlZCBiZWNhdXNlIHRoZSBhZGRyZXNzCisJaXMgY29udGFpbmVkIHNvbWV3aGVyZSBpbiB0aGUgZHluYW1pYyBpbmZvIHNlY3Rpb24uICBXZSBoYXZlIHRvIGdvCisJdG8gYSBsb3QgbW9yZSB3b3JrIHRvIGRpc2NvdmVyIHRoZSBhZGRyZXNzIG9mIHRoZSBkZWJ1ZyBiYXNlIHN5bWJvbC4KKwlCZWNhdXNlIG9mIHRoaXMgY29tcGxleGl0eSwgd2UgY2FjaGUgdGhlIHZhbHVlIHdlIGZpbmQgYW5kIHJldHVybiB0aGF0CisJdmFsdWUgb24gc3Vic2VxdWVudCBpbnZvY2F0aW9ucy4gIE5vdGUgdGhlcmUgaXMgbm8gY29weSBpbiB0aGUKKwlleGVjdXRhYmxlIHN5bWJvbCB0YWJsZXMuCisKKyAqLworCitzdGF0aWMgQ09SRV9BRERSCitsb2NhdGVfYmFzZSAoKQoreworCisjaWZuZGVmIFNWUjRfU0hBUkVEX0xJQlMKKworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisgIENPUkVfQUREUiBhZGRyZXNzID0gMDsKKyAgY2hhciAqKnN5bWJvbHA7CisKKyAgLyogRm9yIFN1bk9TLCB3ZSB3YW50IHRvIGxpbWl0IHRoZSBzZWFyY2ggZm9yIHRoZSBkZWJ1ZyBiYXNlIHN5bWJvbCB0byB0aGUKKyAgICAgZXhlY3V0YWJsZSBiZWluZyBkZWJ1Z2dlZCwgc2luY2UgdGhlcmUgaXMgYSBkdXBsaWNhdGUgbmFtZWQgc3ltYm9sIGluIHRoZQorICAgICBzaGFyZWQgbGlicmFyeS4gIFdlIGRvbid0IHdhbnQgdGhlIHNoYXJlZCBsaWJyYXJ5IHZlcnNpb25zLiAqLworCisgIGZvciAoc3ltYm9scCA9IGRlYnVnX2Jhc2Vfc3ltYm9sczsgKnN5bWJvbHAgIT0gTlVMTDsgc3ltYm9scCsrKQorICAgIHsKKyAgICAgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKCpzeW1ib2xwLCBOVUxMLCBzeW1maWxlX29iamZpbGUpOworICAgICAgaWYgKChtc3ltYm9sICE9IE5VTEwpICYmIChTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCkgIT0gMCkpCisJeworCSAgYWRkcmVzcyA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKTsKKwkgIHJldHVybiAoYWRkcmVzcyk7CisJfQorICAgIH0KKyAgcmV0dXJuICgwKTsKKworI2Vsc2UJLyogU1ZSNF9TSEFSRURfTElCUyAqLworCisgIC8qIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgY3VycmVudGx5IHZhbGlkIGFkZHJlc3MsIGFuZCBpZiBzbywgYXZvaWQKKyAgICAgZG9pbmcgYWxsIHRoaXMgd29yayBhZ2FpbiBhbmQganVzdCByZXR1cm4gdGhlIGNhY2hlZCBhZGRyZXNzLiAgSWYKKyAgICAgd2UgaGF2ZSBubyBjYWNoZWQgYWRkcmVzcywgdHJ5IHRvIGxvY2F0ZSBpdCBpbiB0aGUgZHluYW1pYyBpbmZvCisgICAgIHNlY3Rpb24gZm9yIEVMRiBleGVjdXRhYmxlcy4gICovCisKKyAgaWYgKGRlYnVnX2Jhc2UgPT0gMCkKKyAgICB7CisgICAgICBpZiAoZXhlY19iZmQgIT0gTlVMTAorCSAgJiYgYmZkX2dldF9mbGF2b3VyIChleGVjX2JmZCkgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKKwlkZWJ1Z19iYXNlID0gZWxmX2xvY2F0ZV9iYXNlICgpOworI2lmZGVmIEhBTkRMRV9TVlI0X0VYRUNfRU1VTEFUT1JTCisgICAgICAvKiBUcnkgaXQgdGhlIGhhcmQgd2F5IGZvciBlbXVsYXRlZCBleGVjdXRhYmxlcy4gICovCisgICAgICBlbHNlIGlmIChpbmZlcmlvcl9waWQgIT0gMCAmJiB0YXJnZXRfaGFzX2V4ZWN1dGlvbikKKwlwcm9jX2l0ZXJhdGVfb3Zlcl9tYXBwaW5ncyAobG9va19mb3JfYmFzZSk7CisjZW5kaWYKKyAgICB9CisgIHJldHVybiAoZGVidWdfYmFzZSk7CisKKyNlbmRpZgkvKiAhU1ZSNF9TSEFSRURfTElCUyAqLworCit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlmaXJzdF9saW5rX21hcF9tZW1iZXIgLS0gbG9jYXRlIGZpcnN0IG1lbWJlciBpbiBkeW5hbWljIGxpbmtlcidzIG1hcAorCitTWU5PUFNJUworCisJc3RhdGljIHN0cnVjdCBsaW5rX21hcCAqZmlyc3RfbGlua19tYXBfbWVtYmVyICh2b2lkKQorCitERVNDUklQVElPTgorCisJUmVhZCBpbiBhIGNvcHkgb2YgdGhlIGZpcnN0IG1lbWJlciBpbiB0aGUgaW5mZXJpb3IncyBkeW5hbWljCisJbGluayBtYXAgZnJvbSB0aGUgaW5mZXJpb3IncyBkeW5hbWljIGxpbmtlciBzdHJ1Y3R1cmVzLCBhbmQgcmV0dXJuCisJYSBwb2ludGVyIHRvIHRoZSBjb3B5IGluIG91ciBhZGRyZXNzIHNwYWNlLgorKi8KKworc3RhdGljIHN0cnVjdCBsaW5rX21hcCAqCitmaXJzdF9saW5rX21hcF9tZW1iZXIgKCkKK3sKKyAgc3RydWN0IGxpbmtfbWFwICpsbSA9IE5VTEw7CisKKyNpZm5kZWYgU1ZSNF9TSEFSRURfTElCUworCisgIHJlYWRfbWVtb3J5IChkZWJ1Z19iYXNlLCAoY2hhciAqKSAmZHluYW1pY19jb3B5LCBzaXplb2YgKGR5bmFtaWNfY29weSkpOworICBpZiAoZHluYW1pY19jb3B5LmxkX3ZlcnNpb24gPj0gMikKKyAgICB7CisgICAgICAvKiBJdCBpcyBhIHZlcnNpb24gdGhhdCB3ZSBjYW4gZGVhbCB3aXRoLCBzbyByZWFkIGluIHRoZSBzZWNvbmRhcnkKKwkgc3RydWN0dXJlIGFuZCBmaW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBsaW5rIG1hcCBsaXN0IGZyb20gaXQuICovCisgICAgICByZWFkX21lbW9yeSAoKENPUkVfQUREUikgZHluYW1pY19jb3B5LmxkX3VuLmxkXzIsIChjaGFyICopICZsZF8yX2NvcHksCisJCSAgIHNpemVvZiAoc3RydWN0IGxpbmtfZHluYW1pY18yKSk7CisgICAgICBsbSA9IGxkXzJfY29weS5sZF9sb2FkZWQ7CisgICAgfQorCisjZWxzZQkvKiBTVlI0X1NIQVJFRF9MSUJTICovCisKKyAgcmVhZF9tZW1vcnkgKGRlYnVnX2Jhc2UsIChjaGFyICopICZkZWJ1Z19jb3B5LCBzaXplb2YgKHN0cnVjdCByX2RlYnVnKSk7CisgIC8qIEZJWE1FOiAgUGVyaGFwcyB3ZSBzaG91bGQgdmFsaWRhdGUgdGhlIGluZm8gc29tZWhvdywgcGVyaGFwcyBieQorICAgICBjaGVja2luZyByX3ZlcnNpb24gZm9yIGEga25vd24gdmVyc2lvbiBudW1iZXIsIG9yIHJfc3RhdGUgZm9yCisgICAgIFJUX0NPTlNJU1RFTlQuICovCisgIGxtID0gZGVidWdfY29weS5yX21hcDsKKworI2VuZGlmCS8qICFTVlI0X1NIQVJFRF9MSUJTICovCisKKyAgcmV0dXJuIChsbSk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlmaW5kX3NvbGliIC0tIHN0ZXAgdGhyb3VnaCBsaXN0IG9mIHNoYXJlZCBvYmplY3RzCisKK1NZTk9QU0lTCisKKwlzdHJ1Y3Qgc29fbGlzdCAqZmluZF9zb2xpYiAoc3RydWN0IHNvX2xpc3QgKnNvX2xpc3RfcHRyKQorCitERVNDUklQVElPTgorCisJVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIHJvdXRpbmUgd2hpY2ggZmluZHMgdGhlIG5hbWVzIG9mIGFueQorCWxvYWRlZCAiaW1hZ2VzIiBpbiB0aGUgY3VycmVudCBwcm9jZXNzLiBUaGUgYXJndW1lbnQgaW4gbXVzdCBiZQorCU5VTEwgb24gdGhlIGZpcnN0IGNhbGwsIGFuZCB0aGVuIHRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIHBhc3NlZAorCWluIG9uIHN1YnNlcXVlbnQgY2FsbHMuIFRoaXMgcHJvdmlkZXMgdGhlIGNhcGFiaWxpdHkgdG8gInN0ZXAiIGRvd24KKwl0aGUgbGlzdCBvZiBsb2FkZWQgb2JqZWN0cy4gT24gdGhlIGxhc3Qgb2JqZWN0LCBhIE5VTEwgdmFsdWUgaXMKKwlyZXR1cm5lZC4KKworCVRoZSBhcmcgYW5kIHJldHVybiB2YWx1ZSBhcmUgInN0cnVjdCBsaW5rX21hcCIgcG9pbnRlcnMsIGFzIGRlZmluZWQKKwlpbiA8bGluay5oPi4KKyAqLworCitzdGF0aWMgc3RydWN0IHNvX2xpc3QgKgorZmluZF9zb2xpYiAoc29fbGlzdF9wdHIpCisgICAgIHN0cnVjdCBzb19saXN0ICpzb19saXN0X3B0cjsJLyogTGFzdCBsbSBvciBOVUxMIGZvciBmaXJzdCBvbmUgKi8KK3sKKyAgc3RydWN0IHNvX2xpc3QgKnNvX2xpc3RfbmV4dCA9IE5VTEw7CisgIHN0cnVjdCBsaW5rX21hcCAqbG0gPSBOVUxMOworICBzdHJ1Y3Qgc29fbGlzdCAqbmV3OworICAKKyAgaWYgKHNvX2xpc3RfcHRyID09IE5VTEwpCisgICAgeworICAgICAgLyogV2UgYXJlIHNldHRpbmcgdXAgZm9yIGEgbmV3IHNjYW4gdGhyb3VnaCB0aGUgbG9hZGVkIGltYWdlcy4gKi8KKyAgICAgIGlmICgoc29fbGlzdF9uZXh0ID0gc29fbGlzdF9oZWFkKSA9PSBOVUxMKQorCXsKKwkgIC8qIFdlIGhhdmUgbm90IGFscmVhZHkgcmVhZCBpbiB0aGUgZHluYW1pYyBsaW5raW5nIHN0cnVjdHVyZXMKKwkgICAgIGZyb20gdGhlIGluZmVyaW9yLCBsb29rdXAgdGhlIGFkZHJlc3Mgb2YgdGhlIGJhc2Ugc3RydWN0dXJlLiAqLworCSAgZGVidWdfYmFzZSA9IGxvY2F0ZV9iYXNlICgpOworCSAgaWYgKGRlYnVnX2Jhc2UgIT0gMCkKKwkgICAgeworCSAgICAgIC8qIFJlYWQgdGhlIGJhc2Ugc3RydWN0dXJlIGluIGFuZCBmaW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdAorCQkgbGluayBtYXAgbGlzdCBtZW1iZXIuICovCisJICAgICAgbG0gPSBmaXJzdF9saW5rX21hcF9tZW1iZXIgKCk7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogV2UgaGF2ZSBiZWVuIGNhbGxlZCBiZWZvcmUsIGFuZCBhcmUgaW4gdGhlIHByb2Nlc3Mgb2Ygd2Fsa2luZworCSB0aGUgc2hhcmVkIGxpYnJhcnkgbGlzdC4gIEFkdmFuY2UgdG8gdGhlIG5leHQgc2hhcmVkIG9iamVjdC4gKi8KKyAgICAgIGlmICgobG0gPSBMTV9ORVhUIChzb19saXN0X3B0cikpID09IE5VTEwpCisJeworCSAgLyogV2UgaGF2ZSBoaXQgdGhlIGVuZCBvZiB0aGUgbGlzdCwgc28gY2hlY2sgdG8gc2VlIGlmIGFueSB3ZXJlCisJICAgICBhZGRlZCwgYnV0IGJlIHF1aWV0IGlmIHdlIGNhbid0IHJlYWQgZnJvbSB0aGUgdGFyZ2V0IGFueSBtb3JlLiAqLworCSAgaW50IHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAoKENPUkVfQUREUikgc29fbGlzdF9wdHIgLT4gbG1hZGRyLAorCQkJCQkgICAoY2hhciAqKSAmKHNvX2xpc3RfcHRyIC0+IGxtKSwKKwkJCQkJICAgc2l6ZW9mIChzdHJ1Y3QgbGlua19tYXApKTsKKwkgIGlmIChzdGF0dXMgPT0gMCkKKwkgICAgeworCSAgICAgIGxtID0gTE1fTkVYVCAoc29fbGlzdF9wdHIpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBsbSA9IE5VTEw7CisJICAgIH0KKwl9CisgICAgICBzb19saXN0X25leHQgPSBzb19saXN0X3B0ciAtPiBuZXh0OworICAgIH0KKyAgaWYgKChzb19saXN0X25leHQgPT0gTlVMTCkgJiYgKGxtICE9IE5VTEwpKQorICAgIHsKKyAgICAgIC8qIEdldCBuZXh0IGxpbmsgbWFwIHN0cnVjdHVyZSBmcm9tIGluZmVyaW9yIGltYWdlIGFuZCBidWlsZCBhIGxvY2FsCisJIGFiYnJldmlhdGVkIGxvYWRfbWFwIHN0cnVjdHVyZSAqLworICAgICAgbmV3ID0gKHN0cnVjdCBzb19saXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNvX2xpc3QpKTsKKyAgICAgIG1lbXNldCAoKGNoYXIgKikgbmV3LCAwLCBzaXplb2YgKHN0cnVjdCBzb19saXN0KSk7CisgICAgICBuZXcgLT4gbG1hZGRyID0gbG07CisgICAgICAvKiBBZGQgdGhlIG5ldyBub2RlIGFzIHRoZSBuZXh0IG5vZGUgaW4gdGhlIGxpc3QsIG9yIGFzIHRoZSByb290CisJIG5vZGUgaWYgdGhpcyBpcyB0aGUgZmlyc3Qgb25lLiAqLworICAgICAgaWYgKHNvX2xpc3RfcHRyICE9IE5VTEwpCisJeworCSAgc29fbGlzdF9wdHIgLT4gbmV4dCA9IG5ldzsKKwl9CisgICAgICBlbHNlCisJeworCSAgc29fbGlzdF9oZWFkID0gbmV3OworCisJICBpZiAoISBzb2xpYl9jbGVhbnVwX3F1ZXVlZCkKKwkgICAgeworCSAgICAgIG1ha2VfcnVuX2NsZWFudXAgKGRvX2NsZWFyX3NvbGliLCBOVUxMKTsKKwkgICAgICBzb2xpYl9jbGVhbnVwX3F1ZXVlZCA9IDE7CisJICAgIH0KKwkgIAorCX0gICAgICAKKyAgICAgIHNvX2xpc3RfbmV4dCA9IG5ldzsKKyAgICAgIHJlYWRfbWVtb3J5ICgoQ09SRV9BRERSKSBsbSwgKGNoYXIgKikgJihuZXcgLT4gbG0pLAorCQkgICBzaXplb2YgKHN0cnVjdCBsaW5rX21hcCkpOworICAgICAgLyogRm9yIFNWUjQgdmVyc2lvbnMsIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgbGluayBtYXAgaXMgZm9yIHRoZQorCSBpbmZlcmlvciBleGVjdXRhYmxlLCBzbyB3ZSBtdXN0IGlnbm9yZSBpdC4gIEZvciBzb21lIHZlcnNpb25zIG9mCisJIFNWUjQsIGl0IGhhcyBubyBuYW1lLiAgRm9yIG90aGVycyAoU29sYXJpcyAyLjMgZm9yIGV4YW1wbGUpLCBpdAorCSBkb2VzIGhhdmUgYSBuYW1lLCBzbyB3ZSBjYW4gbm8gbG9uZ2VyIHVzZSBhIG1pc3NpbmcgbmFtZSB0bworCSBkZWNpZGUgd2hlbiB0byBpZ25vcmUgaXQuICovCisgICAgICBpZiAoIUlHTk9SRV9GSVJTVF9MSU5LX01BUF9FTlRSWSAobmV3IC0+IGxtKSkKKwl7CisJICBpbnQgZXJyY29kZTsKKwkgIGNoYXIgKmJ1ZmZlcjsKKwkgIHRhcmdldF9yZWFkX3N0cmluZyAoKENPUkVfQUREUikgTE1fTkFNRSAobmV3KSwgJmJ1ZmZlciwKKwkJCSAgICAgIE1BWF9QQVRIX1NJWkUgLSAxLCAmZXJyY29kZSk7CisJICBpZiAoZXJyY29kZSAhPSAwKQorCSAgICB7CisJICAgICAgd2FybmluZyAoImZpbmRfc29saWI6IENhbid0IHJlYWQgcGF0aG5hbWUgZm9yIGxvYWQgbWFwOiAlc1xuIiwKKwkJICAgICAgIHNhZmVfc3RyZXJyb3IgKGVycmNvZGUpKTsKKwkgICAgICByZXR1cm4gKHNvX2xpc3RfbmV4dCk7CisJICAgIH0KKwkgIHN0cm5jcHkgKG5ldyAtPiBzb19uYW1lLCBidWZmZXIsIE1BWF9QQVRIX1NJWkUgLSAxKTsKKwkgIG5ldyAtPiBzb19uYW1lW01BWF9QQVRIX1NJWkUgLSAxXSA9ICdcMCc7CisJICBmcmVlIChidWZmZXIpOworCSAgY2F0Y2hfZXJyb3JzIChzb2xpYl9tYXBfc2VjdGlvbnMsIG5ldywKKwkJCSJFcnJvciB3aGlsZSBtYXBwaW5nIHNoYXJlZCBsaWJyYXJ5IHNlY3Rpb25zOlxuIiwKKwkJCVJFVFVSTl9NQVNLX0FMTCk7CisJfSAgICAgIAorICAgIH0KKyAgcmV0dXJuIChzb19saXN0X25leHQpOworfQorCisvKiBBIHNtYWxsIHN0dWIgdG8gZ2V0IHVzIHBhc3QgdGhlIGFyZy1wYXNzaW5nIHBpbmhvbGUgb2YgY2F0Y2hfZXJyb3JzLiAgKi8KKworc3RhdGljIGludAorc3ltYm9sX2FkZF9zdHViIChhcmcpCisgICAgIFBUUiBhcmc7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb19saXN0ICpzbyA9IChzdHJ1Y3Qgc29fbGlzdCAqKSBhcmc7CS8qIGNhdGNoX2VycnMgYm9nb24gKi8KKyAgQ09SRV9BRERSIHRleHRfYWRkciA9IDA7CisKKyAgaWYgKHNvIC0+IHRleHRzZWN0aW9uKQorICAgIHRleHRfYWRkciA9IHNvIC0+IHRleHRzZWN0aW9uIC0+IGFkZHI7CisgIGVsc2UgaWYgKHNvIC0+IGFiZmQgIT0gTlVMTCkKKyAgICB7CisgICAgICBhc2VjdGlvbiAqbG93ZXN0X3NlY3Q7CisKKyAgICAgIC8qIElmIHdlIGRpZG4ndCBmaW5kIGEgbWFwcGVkIG5vbiB6ZXJvIHNpemVkIC50ZXh0IHNlY3Rpb24sIHNldCB1cAorCSB0ZXh0X2FkZHIgc28gdGhhdCB0aGUgcmVsb2NhdGlvbiBpbiBzeW1ib2xfZmlsZV9hZGQgZG9lcyBubyBoYXJtLiAgKi8KKworICAgICAgbG93ZXN0X3NlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc28gLT4gYWJmZCwgIi50ZXh0Iik7CisgICAgICBpZiAobG93ZXN0X3NlY3QgPT0gTlVMTCkKKwliZmRfbWFwX292ZXJfc2VjdGlvbnMgKHNvIC0+IGFiZmQsIGZpbmRfbG93ZXN0X3NlY3Rpb24sCisJCQkgICAgICAgKFBUUikgJmxvd2VzdF9zZWN0KTsKKyAgICAgIGlmIChsb3dlc3Rfc2VjdCkKKwl0ZXh0X2FkZHIgPSBiZmRfc2VjdGlvbl92bWEgKHNvIC0+IGFiZmQsIGxvd2VzdF9zZWN0KQorCQkgICAgKyAoQ09SRV9BRERSKSBMTV9BRERSIChzbyk7CisgICAgfQorICAKKyAgQUxMX09CSkZJTEVTIChzbyAtPiBvYmpmaWxlKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKHNvIC0+IG9iamZpbGUgLT4gbmFtZSwgc28gLT4gc29fbmFtZSkgPT0gMCkKKwlyZXR1cm4gMTsKKyAgICB9CisgIHNvIC0+IG9iamZpbGUgPQorICAgIHN5bWJvbF9maWxlX2FkZCAoc28gLT4gc29fbmFtZSwgc28gLT4gZnJvbV90dHksCisJCSAgICAgdGV4dF9hZGRyLAorCQkgICAgIDAsIDAsIDAsIDAsIDEpOworICByZXR1cm4gKDEpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgdGhlIHNvIG5hbWUgdG8gc2VlIGlmIG1hdGNoZXMgdGhlIG1haW4gbGlzdC4KKyAgIEluIHNvbWUgc3lzdGVtIHRoZSBtYWluIG9iamVjdCBpcyBpbiB0aGUgbGlzdCwgd2hpY2ggd2Ugd2FudCB0byBleGNsdWRlICovCisKK3N0YXRpYyBpbnQgbWF0Y2hfbWFpbiAoc29uYW1lKQorICAgIGNoYXIgKnNvbmFtZTsKK3sKKyAgY2hhciAqKm1haW5wOworCisgIGZvciAobWFpbnAgPSBtYWluX25hbWVfbGlzdDsgKm1haW5wICE9IE5VTEw7IG1haW5wKyspCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoc29uYW1lLCAqbWFpbnApID09IDApCisJcmV0dXJuICgxKTsKKyAgICB9CisKKyAgcmV0dXJuICgwKTsKK30KKworLyoKKworR0xPQkFMIEZVTkNUSU9OCisKKwlzb2xpYl9hZGQgLS0gYWRkIGEgc2hhcmVkIGxpYnJhcnkgZmlsZSB0byB0aGUgc3ltdGFiIGFuZCBzZWN0aW9uIGxpc3QKKworU1lOT1BTSVMKKworCXZvaWQgc29saWJfYWRkIChjaGFyICphcmdfc3RyaW5nLCBpbnQgZnJvbV90dHksCisJCQlzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0KQorCitERVNDUklQVElPTgorCisqLworCit2b2lkCitzb2xpYl9hZGQgKGFyZ19zdHJpbmcsIGZyb21fdHR5LCB0YXJnZXQpCisgICAgIGNoYXIgKmFyZ19zdHJpbmc7CisgICAgIGludCBmcm9tX3R0eTsKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldDsKK3sJCisgIHJlZ2lzdGVyIHN0cnVjdCBzb19saXN0ICpzbyA9IE5VTEw7ICAgCS8qIGxpbmsgbWFwIHN0YXRlIHZhcmlhYmxlICovCisKKyAgLyogTGFzdCBzaGFyZWQgbGlicmFyeSB0aGF0IHdlIHJlYWQuICAqLworICBzdHJ1Y3Qgc29fbGlzdCAqc29fbGFzdCA9IE5VTEw7CisKKyAgY2hhciAqcmVfZXJyOworICBpbnQgY291bnQ7CisgIGludCBvbGQ7CisgIAorICBpZiAoKHJlX2VyciA9IHJlX2NvbXAgKGFyZ19zdHJpbmcgPyBhcmdfc3RyaW5nIDogIi4iKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBlcnJvciAoIkludmFsaWQgcmVnZXhwOiAlcyIsIHJlX2Vycik7CisgICAgfQorICAKKyAgLyogQWRkIHRoZSBzaGFyZWQgbGlicmFyeSBzZWN0aW9ucyB0byB0aGUgc2VjdGlvbiB0YWJsZSBvZiB0aGUKKyAgICAgc3BlY2lmaWVkIHRhcmdldCwgaWYgYW55LiAgKi8KKyAgaWYgKHRhcmdldCkKKyAgICB7CisgICAgICAvKiBDb3VudCBob3cgbWFueSBuZXcgc2VjdGlvbl90YWJsZSBlbnRyaWVzIHRoZXJlIGFyZS4gICovCisgICAgICBzbyA9IE5VTEw7CisgICAgICBjb3VudCA9IDA7CisgICAgICB3aGlsZSAoKHNvID0gZmluZF9zb2xpYiAoc28pKSAhPSBOVUxMKQorCXsKKwkgIGlmIChzbyAtPiBzb19uYW1lWzBdICYmICFtYXRjaF9tYWluIChzbyAtPiBzb19uYW1lKSkKKwkgICAgeworCSAgICAgIGNvdW50ICs9IHNvIC0+IHNlY3Rpb25zX2VuZCAtIHNvIC0+IHNlY3Rpb25zOworCSAgICB9CisJfQorICAgICAgCisgICAgICBpZiAoY291bnQpCisJeworCSAgaW50IHVwZGF0ZV9jb3Jlb3BzOworCisJICAvKiBXZSBtdXN0IHVwZGF0ZSB0aGUgdG9fc2VjdGlvbnMgZmllbGQgaW4gdGhlIGNvcmVfb3BzIHN0cnVjdHVyZQorCSAgICAgaGVyZSwgb3RoZXJ3aXNlIHdlIGRlcmVmZXJlbmNlIGEgcG90ZW50aWFsIGRhbmdsaW5nIHBvaW50ZXIKKwkgICAgIGZvciBlYWNoIGNhbGwgdG8gdGFyZ2V0X3JlYWQvd3JpdGVfbWVtb3J5IHdpdGhpbiB0aGlzIHJvdXRpbmUuICAqLworCSAgdXBkYXRlX2NvcmVvcHMgPSBjb3JlX29wcy50b19zZWN0aW9ucyA9PSB0YXJnZXQtPnRvX3NlY3Rpb25zOworICAgICAgICAgIAkgICAgIAorCSAgLyogUmVhbGxvY2F0ZSB0aGUgdGFyZ2V0J3Mgc2VjdGlvbiB0YWJsZSBpbmNsdWRpbmcgdGhlIG5ldyBzaXplLiAgKi8KKwkgIGlmICh0YXJnZXQgLT4gdG9fc2VjdGlvbnMpCisJICAgIHsKKwkgICAgICBvbGQgPSB0YXJnZXQgLT4gdG9fc2VjdGlvbnNfZW5kIC0gdGFyZ2V0IC0+IHRvX3NlY3Rpb25zOworCSAgICAgIHRhcmdldCAtPiB0b19zZWN0aW9ucyA9IChzdHJ1Y3Qgc2VjdGlvbl90YWJsZSAqKQorCQl4cmVhbGxvYyAoKGNoYXIgKil0YXJnZXQgLT4gdG9fc2VjdGlvbnMsCisJCQkgKHNpemVvZiAoc3RydWN0IHNlY3Rpb25fdGFibGUpKSAqIChjb3VudCArIG9sZCkpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBvbGQgPSAwOworCSAgICAgIHRhcmdldCAtPiB0b19zZWN0aW9ucyA9IChzdHJ1Y3Qgc2VjdGlvbl90YWJsZSAqKQorCQl4bWFsbG9jICgoc2l6ZW9mIChzdHJ1Y3Qgc2VjdGlvbl90YWJsZSkpICogY291bnQpOworCSAgICB9CisJICB0YXJnZXQgLT4gdG9fc2VjdGlvbnNfZW5kID0gdGFyZ2V0IC0+IHRvX3NlY3Rpb25zICsgKGNvdW50ICsgb2xkKTsKKwkgIAorCSAgLyogVXBkYXRlIHRoZSB0b19zZWN0aW9ucyBmaWVsZCBpbiB0aGUgY29yZV9vcHMgc3RydWN0dXJlCisJICAgICBpZiBuZWVkZWQuICAqLworCSAgaWYgKHVwZGF0ZV9jb3Jlb3BzKQorCSAgICB7CisJICAgICAgY29yZV9vcHMudG9fc2VjdGlvbnMgPSB0YXJnZXQtPnRvX3NlY3Rpb25zOworCSAgICAgIGNvcmVfb3BzLnRvX3NlY3Rpb25zX2VuZCA9IHRhcmdldC0+dG9fc2VjdGlvbnNfZW5kOworCSAgICB9CisKKwkgIC8qIEFkZCB0aGVzZSBzZWN0aW9uIHRhYmxlIGVudHJpZXMgdG8gdGhlIHRhcmdldCdzIHRhYmxlLiAgKi8KKwkgIHdoaWxlICgoc28gPSBmaW5kX3NvbGliIChzbykpICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBpZiAoc28gLT4gc29fbmFtZVswXSkKKwkJeworCQkgIGNvdW50ID0gc28gLT4gc2VjdGlvbnNfZW5kIC0gc28gLT4gc2VjdGlvbnM7CisJCSAgbWVtY3B5ICgoY2hhciAqKSAodGFyZ2V0IC0+IHRvX3NlY3Rpb25zICsgb2xkKSwKKwkJCSAgc28gLT4gc2VjdGlvbnMsIAorCQkJICAoc2l6ZW9mIChzdHJ1Y3Qgc2VjdGlvbl90YWJsZSkpICogY291bnQpOworCQkgIG9sZCArPSBjb3VudDsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgCisgIC8qIE5vdyBhZGQgdGhlIHN5bWJvbCBmaWxlcy4gICovCisgIHdoaWxlICgoc28gPSBmaW5kX3NvbGliIChzbykpICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHNvIC0+IHNvX25hbWVbMF0gJiYgcmVfZXhlYyAoc28gLT4gc29fbmFtZSkgJiYgCisgICAgICAhbWF0Y2hfbWFpbiAoc28gLT4gc29fbmFtZSkpCisJeworCSAgc28gLT4gZnJvbV90dHkgPSBmcm9tX3R0eTsKKwkgIGlmIChzbyAtPiBzeW1ib2xzX2xvYWRlZCkKKwkgICAgeworCSAgICAgIGlmIChmcm9tX3R0eSkKKwkJeworCQkgIHByaW50Zl91bmZpbHRlcmVkICgiU3ltYm9scyBhbHJlYWR5IGxvYWRlZCBmb3IgJXNcbiIsIHNvIC0+IHNvX25hbWUpOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKGNhdGNoX2Vycm9ycworCQkgICAoc3ltYm9sX2FkZF9zdHViLCBzbywKKwkJICAgICJFcnJvciB3aGlsZSByZWFkaW5nIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbHM6XG4iLAorCQkgICAgUkVUVVJOX01BU0tfQUxMKSkKKwkgICAgeworCSAgICAgIHNvX2xhc3QgPSBzbzsKKwkgICAgICBzbyAtPiBzeW1ib2xzX2xvYWRlZCA9IDE7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIEdldHRpbmcgbmV3IHN5bWJvbHMgbWF5IGNoYW5nZSBvdXIgb3BpbmlvbiBhYm91dCB3aGF0IGlzCisgICAgIGZyYW1lbGVzcy4gICovCisgIGlmIChzb19sYXN0KQorICAgIHJlaW5pdF9mcmFtZV9jYWNoZSAoKTsKKworICBpZiAoc29fbGFzdCkKKyAgICBzcGVjaWFsX3N5bWJvbF9oYW5kbGluZyAoc29fbGFzdCk7Cit9CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlpbmZvX3NoYXJlZGxpYnJhcnlfY29tbWFuZCAtLSBjb2RlIGZvciAiaW5mbyBzaGFyZWRsaWJyYXJ5IgorCitTWU5PUFNJUworCisJc3RhdGljIHZvaWQgaW5mb19zaGFyZWRsaWJyYXJ5X2NvbW1hbmQgKCkKKworREVTQ1JJUFRJT04KKworCVdhbGsgdGhyb3VnaCB0aGUgc2hhcmVkIGxpYnJhcnkgbGlzdCBhbmQgcHJpbnQgaW5mb3JtYXRpb24KKwlhYm91dCBlYWNoIGF0dGFjaGVkIGxpYnJhcnkuCisqLworCitzdGF0aWMgdm9pZAoraW5mb19zaGFyZWRsaWJyYXJ5X2NvbW1hbmQgKGlnbm9yZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmlnbm9yZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICByZWdpc3RlciBzdHJ1Y3Qgc29fbGlzdCAqc28gPSBOVUxMOyAgCS8qIGxpbmsgbWFwIHN0YXRlIHZhcmlhYmxlICovCisgIGludCBoZWFkZXJfZG9uZSA9IDA7CisgIGludCBhZGRyX3dpZHRoOworICBjaGFyICphZGRyX2ZtdDsKKworICBpZiAoZXhlY19iZmQgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIk5vIGV4ZWMgZmlsZS5cbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworI2lmbmRlZiBUQVJHRVRfRUxGNjQKKyAgYWRkcl93aWR0aCA9IDgrNDsKKyAgYWRkcl9mbXQgPSAiMDhsIjsKKyNlbHNlCisgIGFkZHJfd2lkdGggPSAxNis0OworICBhZGRyX2ZtdCA9ICIwMTZsIjsKKyNlbmRpZgorCisgIHdoaWxlICgoc28gPSBmaW5kX3NvbGliIChzbykpICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHNvIC0+IHNvX25hbWVbMF0pCisJeworCSAgaWYgKCFoZWFkZXJfZG9uZSkKKwkgICAgeworCSAgICAgIHByaW50Zl91bmZpbHRlcmVkKCIlLSpzJS0qcyUtMTJzJXNcbiIsIGFkZHJfd2lkdGgsICJGcm9tIiwKKwkJCQlhZGRyX3dpZHRoLCAiVG8iLCAiU3ltcyBSZWFkIiwKKwkJCQkiU2hhcmVkIE9iamVjdCBMaWJyYXJ5Iik7CisJICAgICAgaGVhZGVyX2RvbmUrKzsKKwkgICAgfQorCisJICBwcmludGZfdW5maWx0ZXJlZCAoIiUtKnMiLCBhZGRyX3dpZHRoLAorCQkgIGxvY2FsX2hleF9zdHJpbmdfY3VzdG9tICgodW5zaWduZWQgbG9uZykgTE1fQUREUiAoc28pLAorCQkJCQkgICBhZGRyX2ZtdCkpOworCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlLSpzIiwgYWRkcl93aWR0aCwKKwkJICBsb2NhbF9oZXhfc3RyaW5nX2N1c3RvbSAoKHVuc2lnbmVkIGxvbmcpIHNvIC0+IGxtZW5kLAorCQkJCQkgICBhZGRyX2ZtdCkpOworCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlLTEycyIsIHNvIC0+IHN5bWJvbHNfbG9hZGVkID8gIlllcyIgOiAiTm8iKTsKKwkgIHByaW50Zl91bmZpbHRlcmVkICgiJXNcbiIsICBzbyAtPiBzb19uYW1lKTsKKwl9CisgICAgfQorICBpZiAoc29fbGlzdF9oZWFkID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJObyBzaGFyZWQgbGlicmFyaWVzIGxvYWRlZCBhdCB0aGlzIHRpbWUuXG4iKTsJCisgICAgfQorfQorCisvKgorCitHTE9CQUwgRlVOQ1RJT04KKworCXNvbGliX2FkZHJlc3MgLS0gY2hlY2sgdG8gc2VlIGlmIGFuIGFkZHJlc3MgaXMgaW4gYSBzaGFyZWQgbGliCisKK1NZTk9QU0lTCisKKwljaGFyICogc29saWJfYWRkcmVzcyAoQ09SRV9BRERSIGFkZHJlc3MpCisKK0RFU0NSSVBUSU9OCisKKwlQcm92aWRlcyBhIGhvb2sgZm9yIG90aGVyIGdkYiByb3V0aW5lcyB0byBkaXNjb3ZlciB3aGV0aGVyIG9yCisJbm90IGEgcGFydGljdWxhciBhZGRyZXNzIGlzIHdpdGhpbiB0aGUgbWFwcGVkIGFkZHJlc3Mgc3BhY2Ugb2YKKwlhIHNoYXJlZCBsaWJyYXJ5LiAgQW55IGFkZHJlc3MgYmV0d2VlbiB0aGUgYmFzZSBtYXBwaW5nIGFkZHJlc3MKKwlhbmQgdGhlIGZpcnN0IGFkZHJlc3MgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGxhc3QgbWFwcGluZywgaXMKKwljb25zaWRlcmVkIHRvIGJlIHdpdGhpbiB0aGUgc2hhcmVkIGxpYnJhcnkgYWRkcmVzcyBzcGFjZSwgZm9yCisJb3VyIHB1cnBvc2VzLgorCisJRm9yIGV4YW1wbGUsIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgYXQgb25lIHBvaW50IHRvIGRpc2FibGUKKwlicmVha3BvaW50cyB3aGljaCBhcmUgaW4gc2hhcmVkIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgY3VycmVudGx5CisJbWFwcGVkIGluLgorICovCisKK2NoYXIgKgorc29saWJfYWRkcmVzcyAoYWRkcmVzcykKKyAgICAgQ09SRV9BRERSIGFkZHJlc3M7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBzb19saXN0ICpzbyA9IDA7ICAgCS8qIGxpbmsgbWFwIHN0YXRlIHZhcmlhYmxlICovCisgIAorICB3aGlsZSAoKHNvID0gZmluZF9zb2xpYiAoc28pKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChzbyAtPiBzb19uYW1lWzBdKQorCXsKKwkgIGlmICgoYWRkcmVzcyA+PSAoQ09SRV9BRERSKSBMTV9BRERSIChzbykpICYmCisJICAgICAgKGFkZHJlc3MgPCAoQ09SRV9BRERSKSBzbyAtPiBsbWVuZCkpCisJICAgIHJldHVybiAoc28tPnNvX25hbWUpOworCX0KKyAgICB9CisgIHJldHVybiAoMCk7Cit9CisKKy8qIENhbGxlZCBieSBmcmVlX2FsbF9zeW10YWJzICovCisKK3ZvaWQgCitjbGVhcl9zb2xpYigpCit7CisgIHN0cnVjdCBzb19saXN0ICpuZXh0OworICBjaGFyICpiZmRfZmlsZW5hbWU7CisgIAorICB3aGlsZSAoc29fbGlzdF9oZWFkKQorICAgIHsKKyAgICAgIGlmIChzb19saXN0X2hlYWQgLT4gc2VjdGlvbnMpCisJeworCSAgZnJlZSAoKFBUUilzb19saXN0X2hlYWQgLT4gc2VjdGlvbnMpOworCX0KKyAgICAgIGlmIChzb19saXN0X2hlYWQgLT4gYWJmZCkKKwl7CisJICBiZmRfZmlsZW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChzb19saXN0X2hlYWQgLT4gYWJmZCk7CisJICBpZiAoIWJmZF9jbG9zZSAoc29fbGlzdF9oZWFkIC0+IGFiZmQpKQorCSAgICB3YXJuaW5nICgiY2Fubm90IGNsb3NlIFwiJXNcIjogJXMiLAorCQkgICAgIGJmZF9maWxlbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCX0KKyAgICAgIGVsc2UKKwkvKiBUaGlzIGhhcHBlbnMgZm9yIHRoZSBleGVjdXRhYmxlIG9uIFNWUjQuICAqLworCWJmZF9maWxlbmFtZSA9IE5VTEw7CisKKyAgICAgIG5leHQgPSBzb19saXN0X2hlYWQgLT4gbmV4dDsKKyAgICAgIGlmIChiZmRfZmlsZW5hbWUpCisJZnJlZSAoKFBUUiliZmRfZmlsZW5hbWUpOworICAgICAgZnJlZSAoKFBUUilzb19saXN0X2hlYWQpOworICAgICAgc29fbGlzdF9oZWFkID0gbmV4dDsKKyAgICB9CisgIGRlYnVnX2Jhc2UgPSAwOworfQorCitzdGF0aWMgdm9pZAorZG9fY2xlYXJfc29saWIgKGR1bW15KQorICAgICBQVFIgZHVtbXk7Cit7CisgIHNvbGliX2NsZWFudXBfcXVldWVkID0gMDsKKyAgY2xlYXJfc29saWIgKCk7Cit9CisKKyNpZmRlZiBTVlI0X1NIQVJFRF9MSUJTCisKKy8qIFJldHVybiAxIGlmIFBDIGxpZXMgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHJlc29sdXRpb24gY29kZSBvZiB0aGUKKyAgIFNWUjQgcnVuIHRpbWUgbG9hZGVyLiAgKi8KKworc3RhdGljIENPUkVfQUREUiBpbnRlcnBfdGV4dF9zZWN0X2xvdzsKK3N0YXRpYyBDT1JFX0FERFIgaW50ZXJwX3RleHRfc2VjdF9oaWdoOworc3RhdGljIENPUkVfQUREUiBpbnRlcnBfcGx0X3NlY3RfbG93Oworc3RhdGljIENPUkVfQUREUiBpbnRlcnBfcGx0X3NlY3RfaGlnaDsKKworaW50Citpbl9zdnI0X2R5bnN5bV9yZXNvbHZlX2NvZGUgKHBjKQorICAgICBDT1JFX0FERFIgcGM7Cit7CisgIHJldHVybiAoKHBjID49IGludGVycF90ZXh0X3NlY3RfbG93ICYmIHBjIDwgaW50ZXJwX3RleHRfc2VjdF9oaWdoKQorCSAgfHwgKHBjID49IGludGVycF9wbHRfc2VjdF9sb3cgJiYgcGMgPCBpbnRlcnBfcGx0X3NlY3RfaGlnaCkKKwkgIHx8IGluX3BsdF9zZWN0aW9uIChwYywgTlVMTCkpOworfQorI2VuZGlmCisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlkaXNhYmxlX2JyZWFrIC0tIHJlbW92ZSB0aGUgIm1hcHBpbmcgY2hhbmdlZCIgYnJlYWtwb2ludAorCitTWU5PUFNJUworCisJc3RhdGljIGludCBkaXNhYmxlX2JyZWFrICgpCisKK0RFU0NSSVBUSU9OCisKKwlSZW1vdmVzIHRoZSBicmVha3BvaW50IHRoYXQgZ2V0cyBoaXQgd2hlbiB0aGUgZHluYW1pYyBsaW5rZXIKKwljb21wbGV0ZXMgYSBtYXBwaW5nIGNoYW5nZS4KKworKi8KKworI2lmbmRlZiBTVlI0X1NIQVJFRF9MSUJTCisKK3N0YXRpYyBpbnQKK2Rpc2FibGVfYnJlYWsgKCkKK3sKKyAgaW50IHN0YXR1cyA9IDE7CisKKyNpZm5kZWYgU1ZSNF9TSEFSRURfTElCUworCisgIGludCBpbl9kZWJ1Z2dlciA9IDA7CisgIAorICAvKiBSZWFkIHRoZSBkZWJ1Z2dlciBzdHJ1Y3R1cmUgZnJvbSB0aGUgaW5mZXJpb3IgdG8gcmV0cmlldmUgdGhlCisgICAgIGFkZHJlc3Mgb2YgdGhlIGJyZWFrcG9pbnQgYW5kIHRoZSBvcmlnaW5hbCBjb250ZW50cyBvZiB0aGUKKyAgICAgYnJlYWtwb2ludCBhZGRyZXNzLiAgUmVtb3ZlIHRoZSBicmVha3BvaW50IGJ5IHdyaXRpbmcgdGhlIG9yaWdpbmFsCisgICAgIGNvbnRlbnRzIGJhY2suICovCisKKyAgcmVhZF9tZW1vcnkgKGRlYnVnX2FkZHIsIChjaGFyICopICZkZWJ1Z19jb3B5LCBzaXplb2YgKGRlYnVnX2NvcHkpKTsKKworICAvKiBTZXQgYGluX2RlYnVnZ2VyJyB0byB6ZXJvIG5vdy4gKi8KKworICB3cml0ZV9tZW1vcnkgKGZsYWdfYWRkciwgKGNoYXIgKikgJmluX2RlYnVnZ2VyLCBzaXplb2YgKGluX2RlYnVnZ2VyKSk7CisKKyAgYnJlYWtwb2ludF9hZGRyID0gKENPUkVfQUREUikgZGVidWdfY29weS5sZGRfYnBfYWRkcjsKKyAgd3JpdGVfbWVtb3J5IChicmVha3BvaW50X2FkZHIsIChjaGFyICopICZkZWJ1Z19jb3B5LmxkZF9icF9pbnN0LAorCQlzaXplb2YgKGRlYnVnX2NvcHkubGRkX2JwX2luc3QpKTsKKworI2Vsc2UJLyogU1ZSNF9TSEFSRURfTElCUyAqLworCisgIC8qIE5vdGUgdGhhdCBicmVha3BvaW50IGFkZHJlc3MgYW5kIG9yaWdpbmFsIGNvbnRlbnRzIGFyZSBpbiBvdXIgYWRkcmVzcworICAgICBzcGFjZSwgc28gd2UganVzdCBuZWVkIHRvIHdyaXRlIHRoZSBvcmlnaW5hbCBjb250ZW50cyBiYWNrLiAqLworCisgIGlmIChtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQgKGJyZWFrcG9pbnRfYWRkciwgc2hhZG93X2NvbnRlbnRzKSAhPSAwKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IDA7CisgICAgfQorCisjZW5kaWYJLyogIVNWUjRfU0hBUkVEX0xJQlMgKi8KKworICAvKiBGb3IgdGhlIFNWUjQgdmVyc2lvbiwgd2UgYWx3YXlzIGtub3cgdGhlIGJyZWFrcG9pbnQgYWRkcmVzcy4gIEZvciB0aGUKKyAgICAgU3VuT1MgdmVyc2lvbiB3ZSBkb24ndCBrbm93IGl0IHVudGlsIHRoZSBhYm92ZSBjb2RlIGlzIGV4ZWN1dGVkLgorICAgICBHcnVtYmxlIGlmIHdlIGFyZSBzdG9wcGVkIGFueXdoZXJlIGJlc2lkZXMgdGhlIGJyZWFrcG9pbnQgYWRkcmVzcy4gKi8KKworICBpZiAoc3RvcF9wYyAhPSBicmVha3BvaW50X2FkZHIpCisgICAgeworICAgICAgd2FybmluZyAoInN0b3BwZWQgYXQgdW5rbm93biBicmVha3BvaW50IHdoaWxlIGhhbmRsaW5nIHNoYXJlZCBsaWJyYXJpZXMiKTsKKyAgICB9CisKKyAgcmV0dXJuIChzdGF0dXMpOworfQorCisjZW5kaWYJLyogI2lmZGVmIFNWUjRfU0hBUkVEX0xJQlMgKi8KKworLyoKKworTE9DQUwgRlVOQ1RJT04KKworCWVuYWJsZV9icmVhayAtLSBhcnJhbmdlIGZvciBkeW5hbWljIGxpbmtlciB0byBoaXQgYnJlYWtwb2ludAorCitTWU5PUFNJUworCisJaW50IGVuYWJsZV9icmVhayAodm9pZCkKKworREVTQ1JJUFRJT04KKworCUJvdGggdGhlIFN1bk9TIGFuZCB0aGUgU1ZSNCBkeW5hbWljIGxpbmtlcnMgaGF2ZSwgYXMgcGFydCBvZiB0aGVpcgorCWRlYnVnZ2VyIGludGVyZmFjZSwgc3VwcG9ydCBmb3IgYXJyYW5naW5nIGZvciB0aGUgaW5mZXJpb3IgdG8gaGl0CisJYSBicmVha3BvaW50IGFmdGVyIG1hcHBpbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJpZXMuICBUaGlzIGZ1bmN0aW9uCisJZW5hYmxlcyB0aGF0IGJyZWFrcG9pbnQuCisKKwlGb3IgU3VuT1MsIHRoZXJlIGlzIGEgc3BlY2lhbCBmbGFnIGxvY2F0aW9uIChpbl9kZWJ1Z2dlcikgd2hpY2ggd2UKKwlzZXQgdG8gMS4gIFdoZW4gdGhlIGR5bmFtaWMgbGlua2VyIHNlZXMgdGhpcyBmbGFnIHNldCwgaXQgd2lsbCBzZXQKKwlhIGJyZWFrcG9pbnQgYXQgYSBsb2NhdGlvbiBrbm93biBvbmx5IHRvIGl0c2VsZiwgYWZ0ZXIgc2F2aW5nIHRoZQorCW9yaWdpbmFsIGNvbnRlbnRzIG9mIHRoYXQgcGxhY2UgYW5kIHRoZSBicmVha3BvaW50IGFkZHJlc3MgaXRzZWxmLAorCWluIGl0J3Mgb3duIGludGVybmFsIHN0cnVjdHVyZXMuICBXaGVuIHdlIHJlc3VtZSB0aGUgaW5mZXJpb3IsIGl0CisJd2lsbCBldmVudHVhbGx5IHRha2UgYSBTSUdUUkFQIHdoZW4gaXQgcnVucyBpbnRvIHRoZSBicmVha3BvaW50LgorCVdlIGhhbmRsZSB0aGlzIChpbiBhIGRpZmZlcmVudCBwbGFjZSkgYnkgcmVzdG9yaW5nIHRoZSBjb250ZW50cyBvZgorCXRoZSBicmVha3BvaW50ZWQgbG9jYXRpb24gKHdoaWNoIGlzIG9ubHkga25vd24gYWZ0ZXIgaXQgc3RvcHMpLAorCWNoYXNpbmcgYXJvdW5kIHRvIGxvY2F0ZSB0aGUgc2hhcmVkIGxpYnJhcmllcyB0aGF0IGhhdmUgYmVlbgorCWxvYWRlZCwgdGhlbiByZXN1bWluZy4KKworCUZvciBTVlI0LCB0aGUgZGVidWdnZXIgaW50ZXJmYWNlIHN0cnVjdHVyZSBjb250YWlucyBhIG1lbWJlciAocl9icmspCisJd2hpY2ggaXMgc3RhdGljYWxseSBpbml0aWFsaXplZCBhdCB0aGUgdGltZSB0aGUgc2hhcmVkIGxpYnJhcnkgaXMKKwlidWlsdCwgdG8gdGhlIG9mZnNldCBvZiBhIGZ1bmN0aW9uIChfcl9kZWJ1Z19zdGF0ZSkgd2hpY2ggaXMgZ3VhcmFuLQorCXRlZWQgdG8gYmUgY2FsbGVkIG9uY2UgYmVmb3JlIG1hcHBpbmcgaW4gYSBsaWJyYXJ5LCBhbmQgYWdhaW4gd2hlbgorCXRoZSBtYXBwaW5nIGlzIGNvbXBsZXRlLiAgQXQgdGhlIHRpbWUgd2UgYXJlIGV4YW1pbmluZyB0aGlzIG1lbWJlciwKKwlpdCBjb250YWlucyBvbmx5IHRoZSB1bnJlbG9jYXRlZCBvZmZzZXQgb2YgdGhlIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlCisJdG8gZG8gb3VyIG93biByZWxvY2F0aW9uLiAgTGF0ZXIsIHdoZW4gdGhlIGR5bmFtaWMgbGlua2VyIGFjdHVhbGx5CisJcnVucywgaXQgcmVsb2NhdGVzIHJfYnJrIHRvIGJlIHRoZSBhY3R1YWwgYWRkcmVzcyBvZiBfcl9kZWJ1Z19zdGF0ZSgpLgorCisJVGhlIGRlYnVnZ2VyIGludGVyZmFjZSBzdHJ1Y3R1cmUgYWxzbyBjb250YWlucyBhbiBlbnVtZXJhdGlvbiB3aGljaAorCWlzIHNldCB0byBlaXRoZXIgUlRfQUREIG9yIFJUX0RFTEVURSBwcmlvciB0byBjaGFuZ2luZyB0aGUgbWFwcGluZywKKwlkZXBlbmRpbmcgdXBvbiB3aGV0aGVyIG9yIG5vdCB0aGUgbGlicmFyeSBpcyBiZWluZyBtYXBwZWQgb3IgdW5tYXBwZWQsCisJYW5kIHRoZW4gc2V0IHRvIFJUX0NPTlNJU1RFTlQgYWZ0ZXIgdGhlIGxpYnJhcnkgaXMgbWFwcGVkL3VubWFwcGVkLgorKi8KKworc3RhdGljIGludAorZW5hYmxlX2JyZWFrICgpCit7CisgIGludCBzdWNjZXNzID0gMDsKKworI2lmbmRlZiBTVlI0X1NIQVJFRF9MSUJTCisKKyAgaW50IGo7CisgIGludCBpbl9kZWJ1Z2dlcjsKKworICAvKiBHZXQgbGlua19keW5hbWljIHN0cnVjdHVyZSAqLworCisgIGogPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGRlYnVnX2Jhc2UsIChjaGFyICopICZkeW5hbWljX2NvcHksCisJCQkgIHNpemVvZiAoZHluYW1pY19jb3B5KSk7CisgIGlmIChqKQorICAgIHsKKyAgICAgIC8qIHVucmVhZGFibGUgKi8KKyAgICAgIHJldHVybiAoMCk7CisgICAgfQorCisgIC8qIENhbGMgYWRkcmVzcyBvZiBkZWJ1Z2dlciBpbnRlcmZhY2Ugc3RydWN0dXJlICovCisKKyAgZGVidWdfYWRkciA9IChDT1JFX0FERFIpIGR5bmFtaWNfY29weS5sZGQ7CisKKyAgLyogQ2FsYyBhZGRyZXNzIG9mIGBpbl9kZWJ1Z2dlcicgbWVtYmVyIG9mIGRlYnVnZ2VyIGludGVyZmFjZSBzdHJ1Y3R1cmUgKi8KKworICBmbGFnX2FkZHIgPSBkZWJ1Z19hZGRyICsgKENPUkVfQUREUikgKChjaGFyICopICZkZWJ1Z19jb3B5LmxkZF9pbl9kZWJ1Z2dlciAtCisJCQkJCShjaGFyICopICZkZWJ1Z19jb3B5KTsKKworICAvKiBXcml0ZSBhIHZhbHVlIG9mIDEgdG8gdGhpcyBtZW1iZXIuICAqLworCisgIGluX2RlYnVnZ2VyID0gMTsKKyAgd3JpdGVfbWVtb3J5IChmbGFnX2FkZHIsIChjaGFyICopICZpbl9kZWJ1Z2dlciwgc2l6ZW9mIChpbl9kZWJ1Z2dlcikpOworICBzdWNjZXNzID0gMTsKKworI2Vsc2UJLyogU1ZSNF9TSEFSRURfTElCUyAqLworCisjaWZkZWYgQktQVF9BVF9TWU1CT0wKKworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisgIGNoYXIgKipia3B0X25hbWVwOworICBhc2VjdGlvbiAqaW50ZXJwX3NlY3Q7CisKKyAgLyogRmlyc3QsIHJlbW92ZSBhbGwgdGhlIHNvbGliIGV2ZW50IGJyZWFrcG9pbnRzLiAgVGhlaXIgYWRkcmVzc2VzCisgICAgIG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSByYW4gdGhlIHByb2dyYW0uICAqLworICByZW1vdmVfc29saWJfZXZlbnRfYnJlYWtwb2ludHMgKCk7CisKKyNpZmRlZiBTVlI0X1NIQVJFRF9MSUJTCisgIGludGVycF90ZXh0X3NlY3RfbG93ID0gaW50ZXJwX3RleHRfc2VjdF9oaWdoID0gMDsKKyAgaW50ZXJwX3BsdF9zZWN0X2xvdyA9IGludGVycF9wbHRfc2VjdF9oaWdoID0gMDsKKworICAvKiBGaW5kIHRoZSAuaW50ZXJwIHNlY3Rpb247IGlmIG5vdCBmb3VuZCwgd2FybiB0aGUgdXNlciBhbmQgZHJvcAorICAgICBpbnRvIHRoZSBvbGQgYnJlYWtwb2ludCBhdCBzeW1ib2wgY29kZS4gICovCisgIGludGVycF9zZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGV4ZWNfYmZkLCAiLmludGVycCIpOworICBpZiAoaW50ZXJwX3NlY3QpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGludGVycF9zZWN0X3NpemU7CisgICAgICBjaGFyICpidWY7CisgICAgICBDT1JFX0FERFIgbG9hZF9hZGRyOworICAgICAgYmZkICp0bXBfYmZkOworICAgICAgQ09SRV9BRERSIHN5bV9hZGRyID0gMDsKKworICAgICAgLyogUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiBpbnRvIGEgbG9jYWwgYnVmZmVyOworCSB0aGUgY29udGVudHMgc3BlY2lmeSB0aGUgZHluYW1pYyBsaW5rZXIgdGhpcyBwcm9ncmFtIHVzZXMuICAqLworICAgICAgaW50ZXJwX3NlY3Rfc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGV4ZWNfYmZkLCBpbnRlcnBfc2VjdCk7CisgICAgICBidWYgPSBhbGxvY2EgKGludGVycF9zZWN0X3NpemUpOworICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChleGVjX2JmZCwgaW50ZXJwX3NlY3QsCisJCQkJYnVmLCAwLCBpbnRlcnBfc2VjdF9zaXplKTsKKworICAgICAgLyogTm93IHdlIG5lZWQgdG8gZmlndXJlIG91dCB3aGVyZSB0aGUgZHluYW1pYyBsaW5rZXIgd2FzCisJIGxvYWRlZCBzbyB0aGF0IHdlIGNhbiBsb2FkIGl0cyBzeW1ib2xzIGFuZCBwbGFjZSBhIGJyZWFrcG9pbnQKKwkgaW4gdGhlIGR5bmFtaWMgbGlua2VyIGl0c2VsZi4KKworCSBUaGlzIGFkZHJlc3MgaXMgc3RvcmVkIG9uIHRoZSBzdGFjay4gIEhvd2V2ZXIsIEkndmUgYmVlbiB1bmFibGUKKwkgdG8gZmluZCBhbnkgbWFnaWMgZm9ybXVsYSB0byBmaW5kIGl0IGZvciBTb2xhcmlzIChhcHBlYXJzIHRvCisJIGJlIHRyaXZpYWwgb24gR05VL0xpbnV4KS4gIFRoZXJlZm9yZSwgd2UgaGF2ZSB0byB0cnkgYW4gYWx0ZXJuYXRlCisJIG1lY2hhbmlzbSB0byBmaW5kIHRoZSBkeW5hbWljIGxpbmtlcidzIGJhc2UgYWRkcmVzcy4gICovCisgICAgICB0bXBfYmZkID0gYmZkX29wZW5yIChidWYsIGdudXRhcmdldCk7CisgICAgICBpZiAodG1wX2JmZCA9PSBOVUxMKQorCWdvdG8gYmtwdF9hdF9zeW1ib2w7CisKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgZHluYW1pYyBsaW5rZXIncyByZWFsbHkgYSB1c2VmdWwgb2JqZWN0LiAgKi8KKyAgICAgIGlmICghYmZkX2NoZWNrX2Zvcm1hdCAodG1wX2JmZCwgYmZkX29iamVjdCkpCisJeworCSAgd2FybmluZyAoIlVuYWJsZSB0byBncm9rIGR5bmFtaWMgbGlua2VyICVzIGFzIGFuIG9iamVjdCBmaWxlIiwgYnVmKTsKKwkgIGJmZF9jbG9zZSAodG1wX2JmZCk7CisJICBnb3RvIGJrcHRfYXRfc3ltYm9sOworCX0KKworICAgICAgLyogV2UgZmluZCB0aGUgZHluYW1pYyBsaW5rZXIncyBiYXNlIGFkZHJlc3MgYnkgZXhhbWluaW5nIHRoZQorCSBjdXJyZW50IHBjICh3aGljaCBwb2ludCBhdCB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBkeW5hbWljCisJIGxpbmtlcikgYW5kIHN1YnRyYWN0aW5nIHRoZSBvZmZzZXQgb2YgdGhlIGVudHJ5IHBvaW50LiAgKi8KKyAgICAgIGxvYWRfYWRkciA9IHJlYWRfcGMgKCkgLSB0bXBfYmZkLT5zdGFydF9hZGRyZXNzOworCisgICAgICAvKiBSZWNvcmQgdGhlIHJlbG9jYXRlZCBzdGFydCBhbmQgZW5kIGFkZHJlc3Mgb2YgdGhlIGR5bmFtaWMgbGlua2VyCisJIHRleHQgYW5kIHBsdCBzZWN0aW9uIGZvciBpbl9zdnI0X2R5bnN5bV9yZXNvbHZlX2NvZGUuICAqLworICAgICAgaW50ZXJwX3NlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAodG1wX2JmZCwgIi50ZXh0Iik7CisgICAgICBpZiAoaW50ZXJwX3NlY3QpCisJeworCSAgaW50ZXJwX3RleHRfc2VjdF9sb3cgPQorCSAgICBiZmRfc2VjdGlvbl92bWEgKHRtcF9iZmQsIGludGVycF9zZWN0KSArIGxvYWRfYWRkcjsKKwkgIGludGVycF90ZXh0X3NlY3RfaGlnaCA9CisJICAgIGludGVycF90ZXh0X3NlY3RfbG93ICsgYmZkX3NlY3Rpb25fc2l6ZSAodG1wX2JmZCwgaW50ZXJwX3NlY3QpOworCX0KKyAgICAgIGludGVycF9zZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHRtcF9iZmQsICIucGx0Iik7CisgICAgICBpZiAoaW50ZXJwX3NlY3QpCisJeworCSAgaW50ZXJwX3BsdF9zZWN0X2xvdyA9CisJICAgIGJmZF9zZWN0aW9uX3ZtYSAodG1wX2JmZCwgaW50ZXJwX3NlY3QpICsgbG9hZF9hZGRyOworCSAgaW50ZXJwX3BsdF9zZWN0X2hpZ2ggPQorCSAgICBpbnRlcnBfcGx0X3NlY3RfbG93ICsgYmZkX3NlY3Rpb25fc2l6ZSAodG1wX2JmZCwgaW50ZXJwX3NlY3QpOworCX0KKworICAgICAgLyogTm93IHRyeSB0byBzZXQgYSBicmVha3BvaW50IGluIHRoZSBkeW5hbWljIGxpbmtlci4gICovCisgICAgICBmb3IgKGJrcHRfbmFtZXAgPSBzb2xpYl9icmVha19uYW1lczsgKmJrcHRfbmFtZXAgIT0gTlVMTDsgYmtwdF9uYW1lcCsrKQorCXsKKwkgIHN5bV9hZGRyID0gYmZkX2xvb2t1cF9zeW1ib2wgKHRtcF9iZmQsICpia3B0X25hbWVwKTsKKwkgIGlmIChzeW1fYWRkciAhPSAwKQorCSAgICBicmVhazsKKwl9CisKKyAgICAgIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgdGVtcG9yYXJ5IGJmZC4gICovCisgICAgICBiZmRfY2xvc2UgKHRtcF9iZmQpOworCisgICAgICBpZiAoc3ltX2FkZHIgIT0gMCkKKwl7CisJICBjcmVhdGVfc29saWJfZXZlbnRfYnJlYWtwb2ludCAobG9hZF9hZGRyICsgc3ltX2FkZHIpOworCSAgcmV0dXJuIDE7CisJfQorCisgICAgICAvKiBGb3Igd2hhdGV2ZXIgcmVhc29uIHdlIGNvdWxkbid0IHNldCBhIGJyZWFrcG9pbnQgaW4gdGhlIGR5bmFtaWMKKwkgbGlua2VyLiAgV2FybiBhbmQgZHJvcCBpbnRvIHRoZSBvbGQgY29kZS4gICovCitia3B0X2F0X3N5bWJvbDoKKyAgICAgIHdhcm5pbmcgKCJVbmFibGUgdG8gZmluZCBkeW5hbWljIGxpbmtlciBicmVha3BvaW50IGZ1bmN0aW9uLlxuR0RCIHdpbGwgYmUgdW5hYmxlIHRvIGRlYnVnIHNoYXJlZCBsaWJyYXJ5IGluaXRpYWxpemVyc1xuYW5kIHRyYWNrIGV4cGxpY2l0bHkgbG9hZGVkIGR5bmFtaWMgY29kZS4iKTsKKyAgICB9CisjZW5kaWYKKworICAvKiBTY2FuIHRocm91Z2ggdGhlIGxpc3Qgb2Ygc3ltYm9scywgdHJ5aW5nIHRvIGxvb2sgdXAgdGhlIHN5bWJvbCBhbmQKKyAgICAgc2V0IGEgYnJlYWtwb2ludCB0aGVyZS4gIFRlcm1pbmF0ZSBsb29wIHdoZW4gd2UvaWYgd2Ugc3VjY2VlZC4gKi8KKworICBicmVha3BvaW50X2FkZHIgPSAwOworICBmb3IgKGJrcHRfbmFtZXAgPSBia3B0X25hbWVzOyAqYmtwdF9uYW1lcCAhPSBOVUxMOyBia3B0X25hbWVwKyspCisgICAgeworICAgICAgbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoKmJrcHRfbmFtZXAsIE5VTEwsIHN5bWZpbGVfb2JqZmlsZSk7CisgICAgICBpZiAoKG1zeW1ib2wgIT0gTlVMTCkgJiYgKFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKSAhPSAwKSkKKwl7CisJICBjcmVhdGVfc29saWJfZXZlbnRfYnJlYWtwb2ludCAoU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpKTsKKwkgIHJldHVybiAxOworCX0KKyAgICB9CisKKyAgLyogTm90aGluZyBnb29kIGhhcHBlbmVkLiAgKi8KKyAgc3VjY2VzcyA9IDA7CisKKyNlbmRpZgkvKiBCS1BUX0FUX1NZTUJPTCAqLworCisjZW5kaWYJLyogIVNWUjRfU0hBUkVEX0xJQlMgKi8KKworICByZXR1cm4gKHN1Y2Nlc3MpOworfQorICAKKy8qCisgIAorR0xPQkFMIEZVTkNUSU9OCisgIAorCXNvbGliX2NyZWF0ZV9pbmZlcmlvcl9ob29rIC0tIHNoYXJlZCBsaWJyYXJ5IHN0YXJ0dXAgc3VwcG9ydAorICAKK1NZTk9QU0lTCisgIAorCXZvaWQgc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2soKQorICAKK0RFU0NSSVBUSU9OCisgIAorCVdoZW4gZ2RiIHN0YXJ0cyB1cCB0aGUgaW5mZXJpb3IsIGl0IG51cnNlcyBpdCBhbG9uZyAodGhyb3VnaCB0aGUKKwlzaGVsbCkgdW50aWwgaXQgaXMgcmVhZHkgdG8gZXhlY3V0ZSBpdCdzIGZpcnN0IGluc3RydWN0aW9uLiAgQXQgdGhpcworCXBvaW50LCB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHZpYSBleHBhbnNpb24gb2YgdGhlIG1hY3JvCisJU09MSUJfQ1JFQVRFX0lORkVSSU9SX0hPT0suCisKKwlGb3IgU3VuT1MgZXhlY3V0YWJsZXMsIHRoaXMgZmlyc3QgaW5zdHJ1Y3Rpb24gaXMgdHlwaWNhbGx5IHRoZQorCW9uZSBhdCAiX3N0YXJ0Iiwgb3IgYSBzaW1pbGFyIHRleHQgbGFiZWwsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgorCXRoZSBleGVjdXRhYmxlIGlzIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgbGlua2VkLiAgVGhlIHJ1bnRpbWUKKwlzdGFydHVwIGNvZGUgdGFrZXMgY2FyZSBvZiBkeW5hbWljYWxseSBsaW5raW5nIGluIGFueSBzaGFyZWQKKwlsaWJyYXJpZXMsIG9uY2UgZ2RiIGFsbG93cyB0aGUgaW5mZXJpb3IgdG8gY29udGludWUuCisKKwlGb3IgU1ZSNCBleGVjdXRhYmxlcywgdGhpcyBmaXJzdCBpbnN0cnVjdGlvbiBpcyBlaXRoZXIgdGhlIGZpcnN0CisJaW5zdHJ1Y3Rpb24gaW4gdGhlIGR5bmFtaWMgbGlua2VyIChmb3IgZHluYW1pY2FsbHkgbGlua2VkCisJZXhlY3V0YWJsZXMpIG9yIHRoZSBpbnN0cnVjdGlvbiBhdCAic3RhcnQiIGZvciBzdGF0aWNhbGx5IGxpbmtlZAorCWV4ZWN1dGFibGVzLiAgRm9yIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcywgdGhlIHN5c3RlbQorCWZpcnN0IGV4ZWMncyAvbGliL2xpYmMuc28uTiwgd2hpY2ggY29udGFpbnMgdGhlIGR5bmFtaWMgbGlua2VyLAorCWFuZCBzdGFydHMgaXQgcnVubmluZy4gIFRoZSBkeW5hbWljIGxpbmtlciBtYXBzIGluIGFueSBuZWVkZWQKKwlzaGFyZWQgbGlicmFyaWVzLCBtYXBzIGluIHRoZSBhY3R1YWwgdXNlciBleGVjdXRhYmxlLCBhbmQgdGhlbgorCWp1bXBzIHRvICJzdGFydCIgaW4gdGhlIHVzZXIgZXhlY3V0YWJsZS4KKworCUZvciBib3RoIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBTVlI0IHNoYXJlZCBsaWJyYXJpZXMsIHdlCisJY2FuIGFycmFuZ2UgdG8gY29vcGVyYXRlIHdpdGggdGhlIGR5bmFtaWMgbGlua2VyIHRvIGRpc2NvdmVyIHRoZQorCW5hbWVzIG9mIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCBhcmUgZHluYW1pY2FsbHkgbGlua2VkLCBhbmQgdGhlCisJYmFzZSBhZGRyZXNzZXMgdG8gd2hpY2ggdGhleSBhcmUgbGlua2VkLgorCisJVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZGlzY292ZXJpbmcgdGhvc2UgbmFtZXMgYW5kCisJYWRkcmVzc2VzLCBhbmQgc2F2aW5nIHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlbSB0byBhbGxvdworCXRoZWlyIHN5bWJvbHMgdG8gYmUgcmVhZCBhdCBhIGxhdGVyIHRpbWUuCisKK0ZJWE1FCisKKwlCZXR3ZWVuIGVuYWJsZV9icmVhaygpIGFuZCBkaXNhYmxlX2JyZWFrKCksIHRoaXMgY29kZSBkb2VzIG5vdAorCXByb3Blcmx5IGhhbmRsZSBoaXR0aW5nIGJyZWFrcG9pbnRzIHdoaWNoIHRoZSB1c2VyIG1pZ2h0IGhhdmUKKwlzZXQgaW4gdGhlIHN0YXJ0dXAgY29kZSBvciBpbiB0aGUgZHluYW1pYyBsaW5rZXIgaXRzZWxmLiAgUHJvcGVyCisJaGFuZGxpbmcgd2lsbCBwcm9iYWJseSBoYXZlIHRvIHdhaXQgdW50aWwgdGhlIGltcGxlbWVudGF0aW9uIGlzCisJY2hhbmdlZCB0byB1c2UgdGhlICJicmVha3BvaW50IGhhbmRsZXIgZnVuY3Rpb24iIG1ldGhvZC4KKworCUFsc28sIHdoYXQgaWYgY2hpbGQgaGFzIGV4aXQoKWVkPyAgTXVzdCBleGl0IGxvb3Agc29tZWhvdy4KKyAgKi8KKwordm9pZCAKK3NvbGliX2NyZWF0ZV9pbmZlcmlvcl9ob29rKCkKK3sKKyAgLyogSWYgd2UgYXJlIHVzaW5nIHRoZSBCS1BUX0FUX1NZTUJPTCBjb2RlLCB0aGVuIHdlIGRvbid0IG5lZWQgdGhlIGJhc2UKKyAgICAgeWV0LiAgSW4gZmFjdCwgaW4gdGhlIGNhc2Ugb2YgYSBTdW5PUzQgZXhlY3V0YWJsZSBiZWluZyBydW4gb24KKyAgICAgU29sYXJpcywgd2UgY2FuJ3QgZ2V0IGl0IHlldC4gIGZpbmRfc29saWIgd2lsbCBnZXQgaXQgd2hlbiBpdCBuZWVkcworICAgICBpdC4gICovCisjaWYgIShkZWZpbmVkIChTVlI0X1NIQVJFRF9MSUJTKSAmJiBkZWZpbmVkIChCS1BUX0FUX1NZTUJPTCkpCisgIGlmICgoZGVidWdfYmFzZSA9IGxvY2F0ZV9iYXNlICgpKSA9PSAwKQorICAgIHsKKyAgICAgIC8qIENhbid0IGZpbmQgdGhlIHN5bWJvbCBvciB0aGUgZXhlY3V0YWJsZSBpcyBzdGF0aWNhbGx5IGxpbmtlZC4gKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICBpZiAoIWVuYWJsZV9icmVhayAoKSkKKyAgICB7CisgICAgICB3YXJuaW5nICgic2hhcmVkIGxpYnJhcnkgaGFuZGxlciBmYWlsZWQgdG8gZW5hYmxlIGJyZWFrcG9pbnQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiAhZGVmaW5lZChTVlI0X1NIQVJFRF9MSUJTKSB8fCBkZWZpbmVkKF9TQ09fRFMpCisgIC8qIFNDTyBhbmQgU3VuT1MgbmVlZCB0aGUgbG9vcCBiZWxvdywgb3RoZXIgc3lzdGVtcyBzaG91bGQgYmUgdXNpbmcgdGhlCisgICAgIHNwZWNpYWwgc2hhcmVkIGxpYnJhcnkgYnJlYWtwb2ludHMgYW5kIHRoZSBzaGFyZWQgbGlicmFyeSBicmVha3BvaW50CisgICAgIHNlcnZpY2Ugcm91dGluZS4KKworICAgICBOb3cgcnVuIHRoZSB0YXJnZXQuICBJdCB3aWxsIGV2ZW50dWFsbHkgaGl0IHRoZSBicmVha3BvaW50LCBhdAorICAgICB3aGljaCBwb2ludCBhbGwgb2YgdGhlIGxpYnJhcmllcyB3aWxsIGhhdmUgYmVlbiBtYXBwZWQgaW4gYW5kIHdlCisgICAgIGNhbiBnbyBncm92ZWxpbmcgYXJvdW5kIGluIHRoZSBkeW5hbWljIGxpbmtlciBzdHJ1Y3R1cmVzIHRvIGZpbmQKKyAgICAgb3V0IHdoYXQgd2UgbmVlZCB0byBrbm93IGFib3V0IHRoZW0uICovCisKKyAgY2xlYXJfcHJvY2VlZF9zdGF0dXMgKCk7CisgIHN0b3Bfc29vbl9xdWlldGx5ID0gMTsKKyAgc3RvcF9zaWduYWwgPSBUQVJHRVRfU0lHTkFMXzA7CisgIGRvCisgICAgeworICAgICAgdGFyZ2V0X3Jlc3VtZSAoLTEsIDAsIHN0b3Bfc2lnbmFsKTsKKyAgICAgIHdhaXRfZm9yX2luZmVyaW9yICgpOworICAgIH0KKyAgd2hpbGUgKHN0b3Bfc2lnbmFsICE9IFRBUkdFVF9TSUdOQUxfVFJBUCk7CisgIHN0b3Bfc29vbl9xdWlldGx5ID0gMDsKKworI2lmICFkZWZpbmVkKF9TQ09fRFMpCisgIC8qIFdlIGFyZSBub3cgZWl0aGVyIGF0IHRoZSAibWFwcGluZyBjb21wbGV0ZSIgYnJlYWtwb2ludCAob3Igc29tZXdoZXJlCisgICAgIGVsc2UsIGEgY29uZGl0aW9uIHdlIGFyZW4ndCBwcmVwYXJlZCB0byBkZWFsIHdpdGggYW55d2F5KSwgc28gYWRqdXN0CisgICAgIHRoZSBQQyBhcyBuZWNlc3NhcnkgYWZ0ZXIgYSBicmVha3BvaW50LCBkaXNhYmxlIHRoZSBicmVha3BvaW50LCBhbmQKKyAgICAgYWRkIGFueSBzaGFyZWQgbGlicmFyaWVzIHRoYXQgd2VyZSBtYXBwZWQgaW4uICovCisKKyAgaWYgKERFQ1JfUENfQUZURVJfQlJFQUspCisgICAgeworICAgICAgc3RvcF9wYyAtPSBERUNSX1BDX0FGVEVSX0JSRUFLOworICAgICAgd3JpdGVfcmVnaXN0ZXIgKFBDX1JFR05VTSwgc3RvcF9wYyk7CisgICAgfQorCisgIGlmICghZGlzYWJsZV9icmVhayAoKSkKKyAgICB7CisgICAgICB3YXJuaW5nICgic2hhcmVkIGxpYnJhcnkgaGFuZGxlciBmYWlsZWQgdG8gZGlzYWJsZSBicmVha3BvaW50Iik7CisgICAgfQorCisgIGlmIChhdXRvX3NvbGliX2FkZCkKKyAgICBzb2xpYl9hZGQgKChjaGFyICopIDAsIDAsIChzdHJ1Y3QgdGFyZ2V0X29wcyAqKSAwKTsKKyNlbmRpZiAvKiAhIF9TQ09fRFMgKi8KKyNlbmRpZgorfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJc3BlY2lhbF9zeW1ib2xfaGFuZGxpbmcgLS0gYWRkaXRpb25hbCBzaGFyZWQgbGlicmFyeSBzeW1ib2wgaGFuZGxpbmcKKworU1lOT1BTSVMKKworCXZvaWQgc3BlY2lhbF9zeW1ib2xfaGFuZGxpbmcgKHN0cnVjdCBzb19saXN0ICpzbykKKworREVTQ1JJUFRJT04KKworCU9uY2UgdGhlIHN5bWJvbHMgZnJvbSBhIHNoYXJlZCBvYmplY3QgaGF2ZSBiZWVuIGxvYWRlZCBpbiB0aGUgdXN1YWwKKwl3YXksIHdlIGFyZSBjYWxsZWQgdG8gZG8gYW55IHN5c3RlbSBzcGVjaWZpYyBzeW1ib2wgaGFuZGxpbmcgdGhhdCAKKwlpcyBuZWVkZWQuCisKKwlGb3IgU3VuT1M0LCB0aGlzIGNvbnNpc3RzIG9mIGdydW5naW5nIGFyb3VuZCBpbiB0aGUgZHluYW1pYworCWxpbmtlcnMgc3RydWN0dXJlcyB0byBmaW5kIHN5bWJvbCBkZWZpbml0aW9ucyBmb3IgImNvbW1vbiIgc3ltYm9scworCWFuZCBhZGRpbmcgdGhlbSB0byB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGUgZm9yIHRoZSBydW50aW1lIGNvbW1vbgorCW9iamZpbGUuCisKKyovCisKK3N0YXRpYyB2b2lkCitzcGVjaWFsX3N5bWJvbF9oYW5kbGluZyAoc28pCitzdHJ1Y3Qgc29fbGlzdCAqc287Cit7CisjaWZuZGVmIFNWUjRfU0hBUkVEX0xJQlMKKyAgaW50IGo7CisKKyAgaWYgKGRlYnVnX2FkZHIgPT0gMCkKKyAgICB7CisgICAgICAvKiBHZXQgbGlua19keW5hbWljIHN0cnVjdHVyZSAqLworCisgICAgICBqID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChkZWJ1Z19iYXNlLCAoY2hhciAqKSAmZHluYW1pY19jb3B5LAorCQkJICAgICAgc2l6ZW9mIChkeW5hbWljX2NvcHkpKTsKKyAgICAgIGlmIChqKQorCXsKKwkgIC8qIHVucmVhZGFibGUgKi8KKwkgIHJldHVybjsKKwl9CisKKyAgICAgIC8qIENhbGMgYWRkcmVzcyBvZiBkZWJ1Z2dlciBpbnRlcmZhY2Ugc3RydWN0dXJlICovCisgICAgICAvKiBGSVhNRSwgdGhpcyBuZWVkcyB3b3JrIGZvciBjcm9zcy1kZWJ1Z2dpbmcgb2YgY29yZSBmaWxlcworCSAoYnl0ZW9yZGVyLCBzaXplLCBhbGlnbm1lbnQsIGV0YykuICAqLworCisgICAgICBkZWJ1Z19hZGRyID0gKENPUkVfQUREUikgZHluYW1pY19jb3B5LmxkZDsKKyAgICB9CisKKyAgLyogUmVhZCB0aGUgZGVidWdnZXIgc3RydWN0dXJlIGZyb20gdGhlIGluZmVyaW9yLCBqdXN0IHRvIG1ha2Ugc3VyZQorICAgICB3ZSBoYXZlIGEgY3VycmVudCBjb3B5LiAqLworCisgIGogPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGRlYnVnX2FkZHIsIChjaGFyICopICZkZWJ1Z19jb3B5LAorCQkJICBzaXplb2YgKGRlYnVnX2NvcHkpKTsKKyAgaWYgKGopCisgICAgcmV0dXJuOwkJLyogdW5yZWFkYWJsZSAqLworCisgIC8qIEdldCBjb21tb24gc3ltYm9sIGRlZmluaXRpb25zIGZvciB0aGUgbG9hZGVkIG9iamVjdC4gKi8KKworICBpZiAoZGVidWdfY29weS5sZGRfY3ApCisgICAgeworICAgICAgc29saWJfYWRkX2NvbW1vbl9zeW1ib2xzIChkZWJ1Z19jb3B5LmxkZF9jcCk7CisgICAgfQorCisjZW5kaWYJLyogIVNWUjRfU0hBUkVEX0xJQlMgKi8KK30KKworCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJc2hhcmVkbGlicmFyeV9jb21tYW5kIC0tIGhhbmRsZSBjb21tYW5kIHRvIGV4cGxpY2l0bHkgYWRkIGxpYnJhcnkKKworU1lOT1BTSVMKKworCXN0YXRpYyB2b2lkIHNoYXJlZGxpYnJhcnlfY29tbWFuZCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQorCitERVNDUklQVElPTgorCisqLworCitzdGF0aWMgdm9pZAorc2hhcmVkbGlicmFyeV9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKK2NoYXIgKmFyZ3M7CitpbnQgZnJvbV90dHk7Cit7CisgIGRvbnRfcmVwZWF0ICgpOworICBzb2xpYl9hZGQgKGFyZ3MsIGZyb21fdHR5LCAoc3RydWN0IHRhcmdldF9vcHMgKikgMCk7Cit9CisKKyNlbmRpZiAvKiBIQVZFX0xJTktfSCAqLworCit2b2lkCitfaW5pdGlhbGl6ZV9zb2xpYigpCit7CisjaWZkZWYgSEFWRV9MSU5LX0gKKworICBhZGRfY29tICgic2hhcmVkbGlicmFyeSIsIGNsYXNzX2ZpbGVzLCBzaGFyZWRsaWJyYXJ5X2NvbW1hbmQsCisJICAgIkxvYWQgc2hhcmVkIG9iamVjdCBsaWJyYXJ5IHN5bWJvbHMgZm9yIGZpbGVzIG1hdGNoaW5nIFJFR0VYUC4iKTsKKyAgYWRkX2luZm8gKCJzaGFyZWRsaWJyYXJ5IiwgaW5mb19zaGFyZWRsaWJyYXJ5X2NvbW1hbmQsIAorCSAgICAiU3RhdHVzIG9mIGxvYWRlZCBzaGFyZWQgb2JqZWN0IGxpYnJhcmllcy4iKTsKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoImF1dG8tc29saWItYWRkIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX3ppbnRlZ2VyLAorCQkgIChjaGFyICopICZhdXRvX3NvbGliX2FkZCwKKwkJICAiU2V0IGF1dG9sb2FkaW5nIG9mIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbHMuXG5cCitJZiBub256ZXJvLCBzeW1ib2xzIGZyb20gYWxsIHNoYXJlZCBvYmplY3QgbGlicmFyaWVzIHdpbGwgYmUgbG9hZGVkXG5cCithdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGluZmVyaW9yIGJlZ2lucyBleGVjdXRpb24gb3Igd2hlbiB0aGUgZHluYW1pYyBsaW5rZXJcblwKK2luZm9ybXMgZ2RiIHRoYXQgYSBuZXcgbGlicmFyeSBoYXMgYmVlbiBsb2FkZWQuICBPdGhlcndpc2UsIHN5bWJvbHNcblwKK211c3QgYmUgbG9hZGVkIG1hbnVhbGx5LCB1c2luZyBgc2hhcmVkbGlicmFyeScuIiwKKwkJICAmc2V0bGlzdCksCisgICAgICZzaG93bGlzdCk7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQKKyAgICAoYWRkX3NldF9jbWQgKCJzb2xpYi1hYnNvbHV0ZS1wcmVmaXgiLCBjbGFzc19zdXBwb3J0LCB2YXJfZmlsZW5hbWUsCisJCSAgKGNoYXIgKikgJnNvbGliX2Fic29sdXRlX3ByZWZpeCwKKwkJICAiU2V0IHByZWZpeCBmb3IgbG9hZGluZyBhYnNvbHV0ZSBzaGFyZWQgbGlicmFyeSBzeW1ib2wgZmlsZXMuXG5cCitGb3Igb3RoZXIgKHJlbGF0aXZlKSBmaWxlcywgeW91IGNhbiBhZGQgdmFsdWVzIHVzaW5nIGBzZXQgc29saWItc2VhcmNoLXBhdGgnLiIsCisJCSAgJnNldGxpc3QpLAorICAgICAmc2hvd2xpc3QpOworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoInNvbGliLXNlYXJjaC1wYXRoIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX3N0cmluZywKKwkJICAoY2hhciAqKSAmc29saWJfc2VhcmNoX3BhdGgsCisJCSAgIlNldCB0aGUgc2VhcmNoIHBhdGggZm9yIGxvYWRpbmcgbm9uLWFic29sdXRlIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbCBmaWxlcy5cblwKK1RoaXMgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgUEFUSCBhbmQgTERfTElCUkFSWV9QQVRILiIsCisJCSAgJnNldGxpc3QpLAorICAgICAmc2hvd2xpc3QpOworCisjZW5kaWYgLyogSEFWRV9MSU5LX0ggKi8KK30KZGlmZiAtLWdpdCBhL2dkYi9zb2xpYi5oIGIvZ2RiL3NvbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFmZWY0OAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9zb2xpYi5oCkBAIC0wLDAgKzEsMjAzIEBACisvKiBTaGFyZWQgbGlicmFyeSBkZWNsYXJhdGlvbnMgZm9yIEdEQiwgdGhlIEdOVSBEZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZkZWYgX19TVERDX18JCS8qIEZvcndhcmQgZGVjbCdzIGZvciBwcm90b3R5cGVzICovCitzdHJ1Y3QgdGFyZ2V0X29wczsKKyNlbmRpZgorCisvKiBDYWxsZWQgd2hlbiB3ZSBmcmVlIGFsbCBzeW10YWJzLCB0byBmcmVlIHRoZSBzaGFyZWQgbGlicmFyeSBpbmZvcm1hdGlvbgorICAgYXMgd2VsbC4gKi8KKworI2RlZmluZSBDTEVBUl9TT0xJQgkJCWNsZWFyX3NvbGliCisKK2V4dGVybiB2b2lkCitjbGVhcl9zb2xpYiBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIENhbGxlZCB0byBhZGQgc3ltYm9scyBmcm9tIGEgc2hhcmVkIGxpYnJhcnkgdG8gZ2RiJ3Mgc3ltYm9sIHRhYmxlLiAqLworCisjZGVmaW5lIFNPTElCX0FERChmaWxlbmFtZSwgZnJvbV90dHksIHRhcmcpIFwKKyAgICBzb2xpYl9hZGQgKGZpbGVuYW1lLCBmcm9tX3R0eSwgdGFyZykKKworZXh0ZXJuIHZvaWQKK3NvbGliX2FkZCBQQVJBTVMgKChjaGFyICosIGludCwgc3RydWN0IHRhcmdldF9vcHMgKikpOworCisvKiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgaW5mZXJpb3Igc3RhcnRzIHVwLCB0byBkaXNjb3ZlciB0aGUgbmFtZXMKKyAgIG9mIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCBhcmUgZHluYW1pY2FsbHkgbGlua2VkLCB0aGUgYmFzZSBhZGRyZXNzZXMgdG8KKyAgIHdoaWNoIHRoZXkgYXJlIGxpbmtlZCwgYW5kIHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gdG8gcmVhZCBpbiB0aGVpciBzeW1ib2xzCisgICBhdCBhIGxhdGVyIHRpbWUuICovCisKKyNkZWZpbmUgU09MSUJfQ1JFQVRFX0lORkVSSU9SX0hPT0soUElEKQlzb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vaygpCisKKy8qIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byByZW1vdmUgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiBkZWJ1Z2dlciBhbmQKKyAgIGR5bmFtaWMgbGlua2VyIHRoYXQgd2FzIGVzdGFibGlzaGVkIGJ5IFNPTElCX0NSRUFURV9JTkZFUklPUl9IT09LLgorICAgKFRoaXMgb3BlcmF0aW9uIGRvZXMgbm90IHJlbW92ZSBzaGFyZWQgbGlicmFyeSBpbmZvcm1hdGlvbiBmcm9tCisgICB0aGUgZGVidWdnZXIsIGFzIENMRUFSX1NPTElCIGRvZXMuKQorCisgICBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgcHJlc2VudGx5IG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyB0YXJnZXQuCisgICAqLworI2RlZmluZSBTT0xJQl9SRU1PVkVfSU5GRVJJT1JfSE9PSyhQSUQpICgwKQorCitleHRlcm4gdm9pZAorc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2sgUEFSQU1TKCh2b2lkKSk7CS8qIHNvbGliLmMgKi8KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlICJjYXRjaCBsb2FkIiBjb21tYW5kLiAgSXQgYWxsb3dzCisgICB0aGUgZGVidWdnZXIgdG8gYmUgbm90aWZpZWQgYnkgdGhlIGR5bmFtaWMgbGlua2VyIHdoZW4gYSBzcGVjaWZpZWQKKyAgIGxpYnJhcnkgZmlsZSAob3IgYW55IGxpYnJhcnkgZmlsZSwgaWYgZmlsZW5hbWUgaXMgTlVMTCkgaXMgbG9hZGVkLgorCisgICBQcmVzZW50bHksIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAqLworI2RlZmluZSBTT0xJQl9DUkVBVEVfQ0FUQ0hfTE9BRF9IT09LKHBpZCx0ZW1wZmxhZyxmaWxlbmFtZSxjb25kX3N0cmluZykgXAorICAgZXJyb3IoImNhdGNoIG9mIGxpYnJhcnkgbG9hZHMvdW5sb2FkcyBub3QgeWV0IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0iKQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgImNhdGNoIHVubG9hZCIgY29tbWFuZC4gIEl0IGFsbG93cworICAgdGhlIGRlYnVnZ2VyIHRvIGJlIG5vdGlmaWVkIGJ5IHRoZSBkeW5hbWljIGxpbmtlciB3aGVuIGEgc3BlY2lmaWVkCisgICBsaWJyYXJ5IGZpbGUgKG9yIGFueSBsaWJyYXJ5IGZpbGUsIGlmIGZpbGVuYW1lIGlzIE5VTEwpIGlzIHVubG9hZGVkLgorCisgICBQcmVzZW50bHksIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAqLworI2RlZmluZSBTT0xJQl9DUkVBVEVfQ0FUQ0hfVU5MT0FEX0hPT0socGlkLHRlbXBmbGFnLGZpbGVuYW1lLGNvbmRfc3RyaW5nKSBcCisgICBlcnJvcigiY2F0Y2ggb2YgbGlicmFyeSBsb2Fkcy91bmxvYWRzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgb24gdGhpcyBwbGF0Zm9ybSIpCisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBUUlVFIGlmIHRoZSBkeW5hbWljIGxpbmtlciBoYXMganVzdCByZXBvcnRlZAorICAgYSBsb2FkIG9mIGEgbGlicmFyeS4KKworICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIHRoZSBpbmZlcmlvciBoYXMgc3RvcHBlZCBpbgorICAgdGhlIGR5bmFtaWMgbGlua2VyIGhvb2ssIG9yIHVuZGVmaW5lZCByZXN1bHRzIGFyZSBndWFyYW50ZWVkLgorCisgICBQcmVzZW50bHksIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAqLworCisvKgorI2RlZmluZSBTT0xJQl9IQVZFX0xPQURfRVZFTlQocGlkKSBcCisgICAgZXJyb3IoImNhdGNoIG9mIGxpYnJhcnkgbG9hZHMvdW5sb2FkcyBub3QgeWV0IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0iKQorKi8KKworI2RlZmluZSBTT0xJQl9IQVZFX0xPQURfRVZFTlQocGlkKSBcCisoMCkKKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgcGF0aG5hbWUgb2YgdGhlIGR5bmFtaWNhbGx5LWxpbmtlZCBsaWJyYXJ5IHRoYXQgaGFzIGp1c3QgYmVlbiBsb2FkZWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIG9ubHkgd2hlbiBTT0xJQl9IQVZFX0xPQURfRVZFTlQgaXMgVFJVRSwKKyAgIG9yIHVuZGVmaW5lZCByZXN1bHRzIGFyZSBndWFyYW50ZWVkLgorCisgICBUaGlzIHN0cmluZydzIGNvbnRlbnRzIGFyZSBvbmx5IHZhbGlkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBpbmZlcmlvcgorICAgaGFzIHN0b3BwZWQgaW4gdGhlIGR5bmFtaWMgbGlua2VyIGhvb2ssIGFuZCBiZWNvbWVzIGludmFsaWQgYXMgc29vbgorICAgYXMgdGhlIGluZmVyaW9yIGlzIGNvbnRpbnVlZC4gIENsaWVudHMgc2hvdWxkIG1ha2UgYSBjb3B5IG9mIHRoaXMKKyAgIHN0cmluZyBpZiB0aGV5IHdpc2ggdG8gY29udGludWUgdGhlIGluZmVyaW9yIGFuZCB0aGVuIGFjY2VzcyB0aGUgc3RyaW5nLgorCisgICBQcmVzZW50bHksIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAqLworCisvKgorI2RlZmluZSBTT0xJQl9MT0FERURfTElCUkFSWV9QQVRITkFNRShwaWQpIFwKKyAgIGVycm9yKCJjYXRjaCBvZiBsaWJyYXJ5IGxvYWRzL3VubG9hZHMgbm90IHlldCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtIikKKyovCisKKyNkZWZpbmUgU09MSUJfTE9BREVEX0xJQlJBUllfUEFUSE5BTUUocGlkKSBcCisoMCkKKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIFRSVUUgaWYgdGhlIGR5bmFtaWMgbGlua2VyIGhhcyBqdXN0IHJlcG9ydGVkCisgICBhbiB1bmxvYWQgb2YgYSBsaWJyYXJ5LgorCisgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gdGhlIGluZmVyaW9yIGhhcyBzdG9wcGVkIGluCisgICB0aGUgZHluYW1pYyBsaW5rZXIgaG9vaywgb3IgdW5kZWZpbmVkIHJlc3VsdHMgYXJlIGd1YXJhbnRlZWQuCisKKyAgIFByZXNlbnRseSwgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBpbXBsZW1lbnRlZC4KKyAgICovCisvKgorI2RlZmluZSBTT0xJQl9IQVZFX1VOTE9BRF9FVkVOVChwaWQpIFwKKyAgIGVycm9yKCJjYXRjaCBvZiBsaWJyYXJ5IGxvYWRzL3VubG9hZHMgbm90IHlldCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtIikKKyovCisKKyNkZWZpbmUgU09MSUJfSEFWRV9VTkxPQURfRVZFTlQocGlkKSBcCisoMCkKKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgcGF0aG5hbWUgb2YgdGhlIGR5bmFtaWNhbGx5LWxpbmtlZCBsaWJyYXJ5IHRoYXQgaGFzIGp1c3QgYmVlbiB1bmxvYWRlZC4KKworICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIFNPTElCX0hBVkVfVU5MT0FEX0VWRU5UIGlzIFRSVUUsCisgICBvciB1bmRlZmluZWQgcmVzdWx0cyBhcmUgZ3VhcmFudGVlZC4KKworICAgVGhpcyBzdHJpbmcncyBjb250ZW50cyBhcmUgb25seSB2YWxpZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgaW5mZXJpb3IKKyAgIGhhcyBzdG9wcGVkIGluIHRoZSBkeW5hbWljIGxpbmtlciBob29rLCBhbmQgYmVjb21lcyBpbnZhbGlkIGFzIHNvb24KKyAgIGFzIHRoZSBpbmZlcmlvciBpcyBjb250aW51ZWQuICBDbGllbnRzIHNob3VsZCBtYWtlIGEgY29weSBvZiB0aGlzCisgICBzdHJpbmcgaWYgdGhleSB3aXNoIHRvIGNvbnRpbnVlIHRoZSBpbmZlcmlvciBhbmQgdGhlbiBhY2Nlc3MgdGhlIHN0cmluZy4KKworICAgUHJlc2VudGx5LCB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGltcGxlbWVudGVkLgorICAgKi8KKy8qCisjZGVmaW5lIFNPTElCX1VOTE9BREVEX0xJQlJBUllfUEFUSE5BTUUocGlkKSBcCisgICBlcnJvcigiY2F0Y2ggb2YgbGlicmFyeSBsb2Fkcy91bmxvYWRzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgb24gdGhpcyBwbGF0Zm9ybSIpCisqLworCisjZGVmaW5lIFNPTElCX1VOTE9BREVEX0xJQlJBUllfUEFUSE5BTUUocGlkKSBcCisoMCkKKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIFRSVUUgaWYgcGMgaXMgdGhlIGFkZHJlc3Mgb2YgYW4gaW5zdHJ1Y3Rpb24gdGhhdAorICAgbGllcyB3aXRoaW4gdGhlIGR5bmFtaWMgbGlua2VyIChzdWNoIGFzIHRoZSBldmVudCBob29rLCBvciB0aGUgZGxkCisgICBpdHNlbGYpLgorCisgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gYSBkeW5hbWljIGxpbmtlciBldmVudCBoYXMgYmVlbgorICAgY2F1Z2h0LCBhbmQgdGhlIGluZmVyaW9yIGlzIGJlaW5nIHN0ZXBwZWQgb3V0IG9mIHRoZSBob29rLCBvciB1bmRlZmluZWQKKyAgIHJlc3VsdHMgYXJlIGd1YXJhbnRlZWQuCisKKyAgIFByZXNlbnRseSwgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBpbXBsZW1lbnRlZC4KKyAgICovCisKKy8qCisjZGVmaW5lIFNPTElCX0lOX0RZTkFNSUNfTElOS0VSKHBpZCxwYykgXAorICAgZXJyb3IoImNhdGNoIG9mIGxpYnJhcnkgbG9hZHMvdW5sb2FkcyBub3QgeWV0IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0iKQorKi8KKworI2RlZmluZSBTT0xJQl9JTl9EWU5BTUlDX0xJTktFUihwaWQscGMpIFwKKygwKQorCisvKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIGluZmVyaW9yIGlzIGtpbGxlZCwgYW5kIHRoZSBwcm9ncmFtCisgICByZXN0YXJ0ZWQuICBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBDTEVBUl9TT0xJQiwgaW4gdGhhdCBpdCBkb2Vzbid0IGRpc2NhcmQKKyAgIGFueSBzeW1ib2wgdGFibGVzLgorCisgICBQcmVzZW50bHksIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAqLworI2RlZmluZSBTT0xJQl9SRVNUQVJUKCkgXAorICAoMCkKKworLyogSWYgd2UgY2FuJ3Qgc2V0IGEgYnJlYWtwb2ludCwgYW5kIGl0J3MgaW4gYSBzaGFyZWQgbGlicmFyeSwganVzdAorICAgZGlzYWJsZSBpdC4gICovCisKKyNkZWZpbmUgRElTQUJMRV9VTlNFVFRBQkxFX0JSRUFLKGFkZHIpCShzb2xpYl9hZGRyZXNzKGFkZHIpICE9IE5VTEwpCisKK2V4dGVybiBjaGFyICoKK3NvbGliX2FkZHJlc3MgUEFSQU1TICgoQ09SRV9BRERSKSk7CQkvKiBzb2xpYi5jICovCisKKy8qIElmIEFERFIgbGllcyBpbiBhIHNoYXJlZCBsaWJyYXJ5LCByZXR1cm4gaXRzIG5hbWUuICAqLworCisjZGVmaW5lIFBDX1NPTElCKGFkZHIpCXNvbGliX2FkZHJlc3MgKGFkZHIpCisKKyNpZmRlZiBTVlI0X1NIQVJFRF9MSUJTCisKKy8qIFJldHVybiAxIGlmIFBDIGxpZXMgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHJlc29sdXRpb24gY29kZSBvZiB0aGUKKyAgIFNWUjQgcnVuIHRpbWUgbG9hZGVyLiAgKi8KKworI2RlZmluZSBJTl9TT0xJQl9EWU5TWU1fUkVTT0xWRV9DT0RFKHBjKSBpbl9zdnI0X2R5bnN5bV9yZXNvbHZlX2NvZGUgKHBjKQorCitleHRlcm4gaW50Citpbl9zdnI0X2R5bnN5bV9yZXNvbHZlX2NvZGUgUEFSQU1TICgoQ09SRV9BRERSKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2RiL3NvbXJlYWQuYyBiL2dkYi9zb21yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzYWJkMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9zb21yZWFkLmMKQEAgLTAsMCArMSw4MDMgQEAKKy8qIFJlYWQgSFAgUEEvUmlzYyBvYmplY3QgZmlsZXMgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTkxLCAxOTkyLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggYXQgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlIDxzeW1zLmg+CisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgIm9iamZpbGVzLmgiCisjaW5jbHVkZSAiYnVpbGRzeW0uaCIKKyNpbmNsdWRlICJzdGFic3JlYWQuaCIKKyNpbmNsdWRlICJnZGItc3RhYnMuaCIKKyNpbmNsdWRlICJjb21wbGFpbnRzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImRlbWFuZ2xlLmgiCisjaW5jbHVkZSAic29tLmgiCisjaW5jbHVkZSAibGliaHBwYS5oIgorCisvKiBWYXJpb3VzIHRoaW5ncyB3ZSBtaWdodCBjb21wbGFpbiBhYm91dC4uLiAqLworCitzdGF0aWMgdm9pZAorc29tX3N5bWZpbGVfaW5pdCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCitzb21fbmV3X2luaXQgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZAorc29tX3N5bWZpbGVfcmVhZCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICosIGludCkpOworCitzdGF0aWMgdm9pZAorc29tX3N5bWZpbGVfZmluaXNoIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQKK3NvbV9zeW10YWJfcmVhZCBQQVJBTVMgKChiZmQgKiwgc3RydWN0IG9iamZpbGUgKiwKKwkJCSBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICopKTsKKworc3RhdGljIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKgorc29tX3N5bWZpbGVfb2Zmc2V0cyBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBDT1JFX0FERFIpKTsKKworLyogRklYTUU6IFRoZXNlIHNob3VsZCByZWFsbHkgYmUgaW4gYSBjb21tb24gaGVhZGVyIHNvbWV3aGVyZSAqLworCitleHRlcm4gdm9pZAoraHByZWFkX2J1aWxkX3BzeW10YWJzIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKiwgaW50KSk7CisKK2V4dGVybiB2b2lkCitocHJlYWRfc3ltZmlsZV9maW5pc2ggUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOworCitleHRlcm4gdm9pZAoraHByZWFkX3N5bWZpbGVfaW5pdCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK2V4dGVybiB2b2lkCitkb19weGRiIFBBUkFNUyAoKGJmZCAqKSk7CisKKy8qCisKK0xPQ0FMIEZVTkNUSU9OCisKKwlzb21fc3ltdGFiX3JlYWQgLS0gcmVhZCB0aGUgc3ltYm9sIHRhYmxlIG9mIGEgU09NIGZpbGUKKworU1lOT1BTSVMKKworCXZvaWQgc29tX3N5bXRhYl9yZWFkIChiZmQgKmFiZmQsIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlLAorCQkJICAgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzKQorCitERVNDUklQVElPTgorCisJR2l2ZW4gYW4gb3BlbiBiZmQsIGEgYmFzZSBhZGRyZXNzIHRvIHJlbG9jYXRlIHN5bWJvbHMgdG8sIGFuZCBhCisJZmxhZyB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGJmZCBpcyBmb3IgYW4gZXhlY3V0YWJsZQorCW9yIG5vdCAobWF5IGJlIHNoYXJlZCBsaWJyYXJ5IGZvciBleGFtcGxlKSwgYWRkIGFsbCB0aGUgZ2xvYmFsCisJZnVuY3Rpb24gYW5kIGRhdGEgc3ltYm9scyB0byB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGUuCisqLworCitzdGF0aWMgdm9pZAorc29tX3N5bXRhYl9yZWFkIChhYmZkLCBvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKK3sKKyAgdW5zaWduZWQgaW50IG51bWJlcl9vZl9zeW1ib2xzOworICBpbnQgdmFsLCBkeW5hbWljOworICBjaGFyICpzdHJpbmd0YWI7CisgIGFzZWN0aW9uICpzaGxpYl9pbmZvOworICBzdHJ1Y3Qgc3ltYm9sX2RpY3Rpb25hcnlfcmVjb3JkICpidWYsICpidWZwLCAqZW5kYnVmcDsKKyAgY2hhciAqc3ltbmFtZTsKKyAgQ09OU1QgaW50IHN5bXNpemUgPSBzaXplb2YgKHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQpOworICBDT1JFX0FERFIgdGV4dF9vZmZzZXQsIGRhdGFfb2Zmc2V0OworCisKKyAgdGV4dF9vZmZzZXQgPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCAwKTsKKyAgZGF0YV9vZmZzZXQgPSBBTk9GRlNFVCAoc2VjdGlvbl9vZmZzZXRzLCAxKTsKKworICBudW1iZXJfb2Zfc3ltYm9scyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOworCisgIGJ1ZiA9IGFsbG9jYSAoc3ltc2l6ZSAqIG51bWJlcl9vZl9zeW1ib2xzKTsKKyAgYmZkX3NlZWsgKGFiZmQsIG9ial9zb21fc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCk7CisgIHZhbCA9IGJmZF9yZWFkIChidWYsIHN5bXNpemUgKiBudW1iZXJfb2Zfc3ltYm9scywgMSwgYWJmZCk7CisgIGlmICh2YWwgIT0gc3ltc2l6ZSAqIG51bWJlcl9vZl9zeW1ib2xzKQorICAgIGVycm9yICgiQ291bGRuJ3QgcmVhZCBzeW1ib2wgZGljdGlvbmFyeSEiKTsKKworICBzdHJpbmd0YWIgPSBhbGxvY2EgKG9ial9zb21fc3RyaW5ndGFiX3NpemUgKGFiZmQpKTsKKyAgYmZkX3NlZWsgKGFiZmQsIG9ial9zb21fc3RyX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCk7CisgIHZhbCA9IGJmZF9yZWFkIChzdHJpbmd0YWIsIG9ial9zb21fc3RyaW5ndGFiX3NpemUgKGFiZmQpLCAxLCBhYmZkKTsKKyAgaWYgKHZhbCAhPSBvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSkKKyAgICBlcnJvciAoIkNhbid0IHJlYWQgaW4gSFAgc3RyaW5nIHRhYmxlLiIpOworCisgIC8qIFdlIG5lZWQgdG8gZGV0ZXJtaW5lIGlmIG9iamZpbGUgaXMgYSBkeW5hbWljIGV4ZWN1dGFibGUgKHNvIHdlCisgICAgIGNhbiBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIFNUX0VOVFJZIHZzIFNUX0NPREUgc3ltYm9scykuCisKKyAgICAgVGhlcmUncyBub3RoaW5nIGluIHRoZSBoZWFkZXIgd2hpY2ggZWFzaWx5IGFsbG93cyB1cyB0byBkbworICAgICB0aGlzLiAgVGhlIG9ubHkgcmVsaWFibGUgd2F5IEkga25vdyBvZiBpcyB0byBjaGVjayBmb3IgdGhlCisgICAgIGV4aXN0YW5jZSBvZiBhICRTSExJQl9JTkZPJCBzZWN0aW9uIHdpdGggYSBub24temVybyBzaXplLiAgKi8KKyAgLyogVGhlIGNvZGUgYmVsb3cgaXMgbm90IGEgcmVsaWFibGUgd2F5IHRvIGNoZWNrIHdoZXRoZXIgYW4KKyAgICogZXhlY3V0YWJsZSBpcyBkeW5hbWljLCBzbyBJIGNvbW1lbnRlZCBpdCBvdXQgLSBSVAorICAgKiBzaGxpYl9pbmZvID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG9iamZpbGUtPm9iZmQsICIkU0hMSUJfSU5GTyQiKTsKKyAgICogaWYgKHNobGliX2luZm8pCisgICAqICAgZHluYW1pYyA9IChiZmRfc2VjdGlvbl9zaXplIChvYmpmaWxlLT5vYmZkLCBzaGxpYl9pbmZvKSAhPSAwKTsKKyAgICogZWxzZQorICAgKiAgIGR5bmFtaWMgPSAwOworICAgKi8KKyAgLyogSSByZXBsYWNlZCB0aGUgY29kZSB3aXRoIGEgc2ltcGxlIGNoZWNrIGZvciB0ZXh0IG9mZnNldCBub3QgYmVpbmcKKyAgICogemVyby4gU3RpbGwgbm90IDEwMCUgcmVsaWFibGUsIGJ1dCBhIG1vcmUgcmVsaWFibGUgd2F5IG9mIGFza2luZworICAgKiAiaXMgdGhpcyBhIGR5bmFtaWMgZXhlY3V0YWJsZT8iIHRoYW4gdGhlIGFib3ZlLiBSVAorICAgKi8KKyAgZHluYW1pYyA9ICh0ZXh0X29mZnNldCAhPSAwKTsKKworICBlbmRidWZwID0gYnVmICsgbnVtYmVyX29mX3N5bWJvbHM7CisgIGZvciAoYnVmcCA9IGJ1ZjsgYnVmcCA8IGVuZGJ1ZnA7ICsrYnVmcCkKKyAgICB7CisgICAgICBlbnVtIG1pbmltYWxfc3ltYm9sX3R5cGUgbXNfdHlwZTsKKworICAgICAgUVVJVDsKKworICAgICAgc3dpdGNoIChidWZwLT5zeW1ib2xfc2NvcGUpCisJeworCWNhc2UgU1NfVU5JVkVSU0FMOgorCWNhc2UgU1NfRVhURVJOQUw6CisJICBzd2l0Y2ggKGJ1ZnAtPnN5bWJvbF90eXBlKQorCSAgICB7CisJICAgIGNhc2UgU1RfU1lNX0VYVDoKKwkgICAgY2FzZSBTVF9BUkdfRVhUOgorCSAgICAgIGNvbnRpbnVlOworCisJICAgIGNhc2UgU1RfQ09ERToKKwkgICAgY2FzZSBTVF9QUklfUFJPRzoKKwkgICAgY2FzZSBTVF9TRUNfUFJPRzoKKwkgICAgY2FzZSBTVF9NSUxMSUNPREU6CisJICAgICAgc3ltbmFtZSA9IGJ1ZnAtPm5hbWUubl9zdHJ4ICsgc3RyaW5ndGFiOworCSAgICAgIG1zX3R5cGUgPSBtc3RfdGV4dDsKKwkgICAgICBidWZwLT5zeW1ib2xfdmFsdWUgKz0gdGV4dF9vZmZzZXQ7CisjaWZkZWYgU01BU0hfVEVYVF9BRERSRVNTCisJICAgICAgU01BU0hfVEVYVF9BRERSRVNTIChidWZwLT5zeW1ib2xfdmFsdWUpOworI2VuZGlmCisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBTVF9FTlRSWToKKwkgICAgICBzeW1uYW1lID0gYnVmcC0+bmFtZS5uX3N0cnggKyBzdHJpbmd0YWI7CisJICAgICAgLyogRm9yIGEgZHluYW1pYyBleGVjdXRhYmxlLCBTVF9FTlRSWSBzeW1ib2xzIGFyZQorCQkgdGhlIHN0dWJzLCB3aGlsZSB0aGUgU1RfQ09ERSBzeW1ib2wgaXMgdGhlIHJlYWwKKwkJIGZ1bmN0aW9uLiAgKi8KKwkgICAgICBpZiAoZHluYW1pYykKKwkJbXNfdHlwZSA9IG1zdF9zb2xpYl90cmFtcG9saW5lOworCSAgICAgIGVsc2UKKwkJbXNfdHlwZSA9IG1zdF90ZXh0OworCSAgICAgIGJ1ZnAtPnN5bWJvbF92YWx1ZSArPSB0ZXh0X29mZnNldDsKKyNpZmRlZiBTTUFTSF9URVhUX0FERFJFU1MKKwkgICAgICBTTUFTSF9URVhUX0FERFJFU1MgKGJ1ZnAtPnN5bWJvbF92YWx1ZSk7CisjZW5kaWYKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIFNUX1NUVUI6CisJICAgICAgc3ltbmFtZSA9IGJ1ZnAtPm5hbWUubl9zdHJ4ICsgc3RyaW5ndGFiOworCSAgICAgIG1zX3R5cGUgPSBtc3Rfc29saWJfdHJhbXBvbGluZTsKKwkgICAgICBidWZwLT5zeW1ib2xfdmFsdWUgKz0gdGV4dF9vZmZzZXQ7CisjaWZkZWYgU01BU0hfVEVYVF9BRERSRVNTCisJICAgICAgU01BU0hfVEVYVF9BRERSRVNTIChidWZwLT5zeW1ib2xfdmFsdWUpOworI2VuZGlmCisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBTVF9EQVRBOgorCSAgICAgIHN5bW5hbWUgPSBidWZwLT5uYW1lLm5fc3RyeCArIHN0cmluZ3RhYjsKKwkgICAgICBidWZwLT5zeW1ib2xfdmFsdWUgKz0gZGF0YV9vZmZzZXQ7CisJICAgICAgbXNfdHlwZSA9IG1zdF9kYXRhOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICBicmVhazsKKworI2lmIDAKKwkgIC8qIFNTX0dMT0JBTCBhbmQgU1NfTE9DQUwgYXJlIHR3byBuYW1lcyBmb3IgdGhlIHNhbWUgdGhpbmcgKCEpLiAgKi8KKwljYXNlIFNTX0dMT0JBTDoKKyNlbmRpZgorCWNhc2UgU1NfTE9DQUw6CisJICBzd2l0Y2ggKGJ1ZnAtPnN5bWJvbF90eXBlKQorCSAgICB7CisJICAgIGNhc2UgU1RfU1lNX0VYVDoKKwkgICAgY2FzZSBTVF9BUkdfRVhUOgorCSAgICAgIGNvbnRpbnVlOworCisJICAgIGNhc2UgU1RfQ09ERToKKwkgICAgICBzeW1uYW1lID0gYnVmcC0+bmFtZS5uX3N0cnggKyBzdHJpbmd0YWI7CisJICAgICAgbXNfdHlwZSA9IG1zdF9maWxlX3RleHQ7CisJICAgICAgYnVmcC0+c3ltYm9sX3ZhbHVlICs9IHRleHRfb2Zmc2V0OworI2lmZGVmIFNNQVNIX1RFWFRfQUREUkVTUworCSAgICAgIFNNQVNIX1RFWFRfQUREUkVTUyAoYnVmcC0+c3ltYm9sX3ZhbHVlKTsKKyNlbmRpZgorCisJICAgIGNoZWNrX3N0cmFuZ2VfbmFtZXM6CisJICAgICAgLyogVXRhaCBHQ0MgMi41LCBGU0YgR0NDIDIuNiBhbmQgbGF0ZXIgZ2VuZXJhdGUgY29ycmVjdCBsb2NhbAorCQkgbGFiZWwgcHJlZml4ZXMgZm9yIHN0YWJzLCBjb25zdGFudCBkYXRhLCBldGMuICBTbyB3ZSBuZWVkCisJCSBvbmx5IGZpbHRlciBvdXQgTCQgc3ltYm9scyB3aGljaCBhcmUgbGVmdCBpbiBkdWUgdG8KKwkJIGxpbWl0YXRpb25zIGluIGhvdyBHQVMgZ2VuZXJhdGVzIFNPTSByZWxvY2F0aW9ucy4KKworCQkgV2hlbiBsaW5raW5nIGluIHRoZSBIUFVYIEMtbGlicmFyeSB0aGUgSFAgbGlua2VyIGhhcworCQkgdGhlIG5hc3R5IGhhYml0IG9mIHBsYWNpbmcgc2VjdGlvbiBzeW1ib2xzIGZyb20gdGhlIGxpdGVyYWwKKwkJIHN1YnNwYWNlcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBwcm9ncmFtJ3MgdGV4dC4gIEZpbHRlcgorCQkgdGhvc2Ugb3V0IGFzIGJlc3Qgd2UgY2FuLiAgQ2hlY2sgZm9yIGZpcnN0IGFuZCBsYXN0IGNoYXJhY3RlcgorCQkgYmVpbmcgJyQnLiAKKworCQkgQW5kIGZpbmFsbHksIHRoZSBuZXdlciBIUCBjb21waWxlcnMgZW1pdCBjcnVkIGxpa2UgJFBJQ19mb28kTgorCQkgaW4gc29tZSBjaXJjdW1zdGFuY2UgKFBJQyBjb2RlIEkgZ3Vlc3MpLiAgSXQncyBhbHNvIGNsYWltZWQKKwkJIHRoYXQgdGhleSBlbWl0IEQkIHN5bWJvbHMgdG9vLiAgV2hhdCBzdHVwaWRpdHkuICAqLworCSAgICAgIGlmICgoc3ltbmFtZVswXSA9PSAnTCcgJiYgc3ltbmFtZVsxXSA9PSAnJCcpCisJCSAgfHwgKHN5bW5hbWVbMF0gPT0gJyQnICYmIHN5bW5hbWVbc3RybGVuKHN5bW5hbWUpIC0gMV0gPT0gJyQnKQorCQkgIHx8IChzeW1uYW1lWzBdID09ICdEJyAmJiBzeW1uYW1lWzFdID09ICckJykKKwkJICB8fCAoc3RybmNtcCAoc3ltbmFtZSwgIiRQSUMiLCA0KSA9PSAwKSkKKwkJY29udGludWU7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBTVF9QUklfUFJPRzoKKwkgICAgY2FzZSBTVF9TRUNfUFJPRzoKKwkgICAgY2FzZSBTVF9NSUxMSUNPREU6CisJICAgICAgc3ltbmFtZSA9IGJ1ZnAtPm5hbWUubl9zdHJ4ICsgc3RyaW5ndGFiOworCSAgICAgIG1zX3R5cGUgPSBtc3RfZmlsZV90ZXh0OworCSAgICAgIGJ1ZnAtPnN5bWJvbF92YWx1ZSArPSB0ZXh0X29mZnNldDsKKyNpZmRlZiBTTUFTSF9URVhUX0FERFJFU1MKKwkgICAgICBTTUFTSF9URVhUX0FERFJFU1MgKGJ1ZnAtPnN5bWJvbF92YWx1ZSk7CisjZW5kaWYKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIFNUX0VOVFJZOgorCSAgICAgIHN5bW5hbWUgPSBidWZwLT5uYW1lLm5fc3RyeCArIHN0cmluZ3RhYjsKKwkgICAgICAvKiBGb3IgYSBkeW5hbWljIGV4ZWN1dGFibGUsIFNUX0VOVFJZIHN5bWJvbHMgYXJlCisJCSB0aGUgc3R1YnMsIHdoaWxlIHRoZSBTVF9DT0RFIHN5bWJvbCBpcyB0aGUgcmVhbAorCQkgZnVuY3Rpb24uICAqLworCSAgICAgIGlmIChkeW5hbWljKQorCQltc190eXBlID0gbXN0X3NvbGliX3RyYW1wb2xpbmU7CisJICAgICAgZWxzZQorCQltc190eXBlID0gbXN0X2ZpbGVfdGV4dDsKKwkgICAgICBidWZwLT5zeW1ib2xfdmFsdWUgKz0gdGV4dF9vZmZzZXQ7CisjaWZkZWYgU01BU0hfVEVYVF9BRERSRVNTCisJICAgICAgU01BU0hfVEVYVF9BRERSRVNTIChidWZwLT5zeW1ib2xfdmFsdWUpOworI2VuZGlmCisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBTVF9TVFVCOgorCSAgICAgIHN5bW5hbWUgPSBidWZwLT5uYW1lLm5fc3RyeCArIHN0cmluZ3RhYjsKKwkgICAgICBtc190eXBlID0gbXN0X3NvbGliX3RyYW1wb2xpbmU7CisJICAgICAgYnVmcC0+c3ltYm9sX3ZhbHVlICs9IHRleHRfb2Zmc2V0OworI2lmZGVmIFNNQVNIX1RFWFRfQUREUkVTUworCSAgICAgIFNNQVNIX1RFWFRfQUREUkVTUyAoYnVmcC0+c3ltYm9sX3ZhbHVlKTsKKyNlbmRpZgorCSAgICAgIGJyZWFrOworCisKKwkgICAgY2FzZSBTVF9EQVRBOgorCSAgICAgIHN5bW5hbWUgPSBidWZwLT5uYW1lLm5fc3RyeCArIHN0cmluZ3RhYjsKKwkgICAgICBidWZwLT5zeW1ib2xfdmFsdWUgKz0gZGF0YV9vZmZzZXQ7CisJICAgICAgbXNfdHlwZSA9IG1zdF9maWxlX2RhdGE7CisJICAgICAgZ290byBjaGVja19zdHJhbmdlX25hbWVzOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIGJyZWFrOworCisJLyogVGhpcyBjYW4gaGFwcGVuIGZvciBjb21tb24gc3ltYm9scyB3aGVuIC1FIGlzIHBhc3NlZCB0byB0aGUKKwkgICBmaW5hbCBsaW5rLiAgTm8gaWRlYSBfd2h5XyB0aGF0IHdvdWxkIG1ha2UgdGhlIGxpbmtlciBmb3JjZQorCSAgIGNvbW1vbiBzeW1ib2xzIHRvIGhhdmUgYW4gU1NfVU5TQVQgc2NvcGUsIGJ1dCBpdCBkb2VzLgorCisJICAgVGhpcyBhbHNvIGhhcHBlbnMgZm9yIHdlYWsgc3ltYm9scywgYnV0IHRoZWlyIHR5cGUgaXMKKwkgICBTVF9EQVRBLiAgKi8KKwljYXNlIFNTX1VOU0FUOgorCSAgc3dpdGNoIChidWZwLT5zeW1ib2xfdHlwZSkKKwkgICAgeworCSAgICAgIGNhc2UgU1RfU1RPUkFHRToKKwkgICAgICBjYXNlIFNUX0RBVEE6CisJCXN5bW5hbWUgPSBidWZwLT5uYW1lLm5fc3RyeCArIHN0cmluZ3RhYjsKKwkJYnVmcC0+c3ltYm9sX3ZhbHVlICs9IGRhdGFfb2Zmc2V0OworCQltc190eXBlID0gbXN0X2RhdGE7CisJCWJyZWFrOworCisJICAgICAgZGVmYXVsdDoKKwkJY29udGludWU7CisJICAgIH0KKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYgKGJ1ZnAtPm5hbWUubl9zdHJ4ID4gb2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCkpCisJZXJyb3IgKCJJbnZhbGlkIHN5bWJvbCBkYXRhOyBiYWQgSFAgc3RyaW5nIHRhYmxlIG9mZnNldDogJWQiLAorCSAgICAgICBidWZwLT5uYW1lLm5fc3RyeCk7CisKKyAgICAgIHByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9sIChzeW1uYW1lLCBidWZwLT5zeW1ib2xfdmFsdWUsIG1zX3R5cGUsIAorCQkJCSAgb2JqZmlsZSk7CisgICAgfQorfQorCisvKiBTY2FuIGFuZCBidWlsZCBwYXJ0aWFsIHN5bWJvbHMgZm9yIGEgc3ltYm9sIGZpbGUuCisgICBXZSBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYnkgYSBjYWxsIHRvIHNvbV9zeW1maWxlX2luaXQsIHdoaWNoIAorICAgY3VycmVudGx5IGRvZXMgbm90aGluZy4KKworICAgU0VDVElPTl9PRkZTRVRTIGlzIGEgc2V0IG9mIG9mZnNldHMgdG8gYXBwbHkgdG8gcmVsb2NhdGUgdGhlIHN5bWJvbHMKKyAgIGluIGVhY2ggc2VjdGlvbi4gIFRoaXMgaXMgaWdub3JlZCwgYXMgaXQgaXNuJ3QgbmVlZGVkIGZvciBTT00uCisKKyAgIE1BSU5MSU5FIGlzIHRydWUgaWYgd2UgYXJlIHJlYWRpbmcgdGhlIG1haW4gc3ltYm9sCisgICB0YWJsZSAoYXMgb3Bwb3NlZCB0byBhIHNoYXJlZCBsaWIgb3IgZHluYW1pY2FsbHkgbG9hZGVkIGZpbGUpLgorCisgICBUaGlzIGZ1bmN0aW9uIG9ubHkgZG9lcyB0aGUgbWluaW11bSB3b3JrIG5lY2Vzc2FyeSBmb3IgbGV0dGluZyB0aGUKKyAgIHVzZXIgIm5hbWUiIHRoaW5ncyBzeW1ib2xpY2FsbHk7IGl0IGRvZXMgbm90IHJlYWQgdGhlIGVudGlyZSBzeW10YWIuCisgICBJbnN0ZWFkLCBpdCByZWFkcyB0aGUgZXh0ZXJuYWwgYW5kIHN0YXRpYyBzeW1ib2xzIGFuZCBwdXRzIHRoZW0gaW4gcGFydGlhbAorICAgc3ltYm9sIHRhYmxlcy4gIFdoZW4gbW9yZSBleHRlbnNpdmUgaW5mb3JtYXRpb24gaXMgcmVxdWVzdGVkIG9mIGEKKyAgIGZpbGUsIHRoZSBjb3JyZXNwb25kaW5nIHBhcnRpYWwgc3ltYm9sIHRhYmxlIGlzIG11dGF0ZWQgaW50byBhIGZ1bGwKKyAgIGZsZWRnZWQgc3ltYm9sIHRhYmxlIGJ5IGdvaW5nIGJhY2sgYW5kIHJlYWRpbmcgdGhlIHN5bWJvbHMKKyAgIGZvciByZWFsLgorCisgICBXZSBsb29rIGZvciBzZWN0aW9ucyB3aXRoIHNwZWNpZmljIG5hbWVzLCB0byB0ZWxsIHVzIHdoYXQgZGVidWcKKyAgIGZvcm1hdCB0byBsb29rIGZvcjogIEZJWE1FISEhCisKKyAgIHNvbXN0YWJfYnVpbGRfcHN5bXRhYnMoKSBoYW5kbGVzIFNUQUJTIHN5bWJvbHMuCisKKyAgIE5vdGUgdGhhdCBTT00gZmlsZXMgaGF2ZSBhICJtaW5pbWFsIiBzeW1ib2wgdGFibGUsIHdoaWNoIGlzIHZhZ3VlbHkKKyAgIHJlbWluaXNjZW50IG9mIGEgQ09GRiBzeW1ib2wgdGFibGUsIGJ1dCBoYXMgb25seSB0aGUgbWluaW1hbCBpbmZvcm1hdGlvbgorICAgbmVjZXNzYXJ5IGZvciBsaW5raW5nLiAgV2UgcHJvY2VzcyB0aGlzIGFsc28sIGFuZCB1c2UgdGhlIGluZm9ybWF0aW9uIHRvCisgICBidWlsZCBnZGIncyBtaW5pbWFsIHN5bWJvbCB0YWJsZS4gIFRoaXMgZ2l2ZXMgdXMgc29tZSBtaW5pbWFsIGRlYnVnZ2luZworICAgY2FwYWJpbGl0eSBldmVuIGZvciBmaWxlcyBjb21waWxlZCB3aXRob3V0IC1nLiAgKi8KKworc3RhdGljIHZvaWQKK3NvbV9zeW1maWxlX3JlYWQgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywgbWFpbmxpbmUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHM7CisgICAgIGludCBtYWlubGluZTsKK3sKKyAgYmZkICphYmZkID0gb2JqZmlsZS0+b2JmZDsKKyAgc3RydWN0IGNsZWFudXAgKmJhY2tfdG87CisKKyAgZG9fcHhkYiAoc3ltZmlsZV9iZmRfb3BlbiAob2JqZmlsZS0+bmFtZSkpOworCisgIGluaXRfbWluaW1hbF9zeW1ib2xfY29sbGVjdGlvbiAoKTsKKyAgYmFja190byA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBkaXNjYXJkX21pbmltYWxfc3ltYm9scywgMCk7CisKKyAgLyogUmVhZCBpbiB0aGUgaW1wb3J0IGxpc3QgYW5kIHRoZSBleHBvcnQgbGlzdC4gIEN1cnJlbnRseQorICAgICB0aGUgZXhwb3J0IGxpc3QgaXNuJ3QgdXNlZDsgdGhlIGltcG9ydCBsaXN0IGlzIHVzZWQgaW4KKyAgICAgaHAtc3ltdGFiLXJlYWQuYyB0byBoYW5kbGUgc3RhdGljIHZhcnMgZGVjbGFyZWQgaW4gb3RoZXIKKyAgICAgc2hhcmVkIGxpYnJhcmllcy4gKi8KKyAgaW5pdF9pbXBvcnRfc3ltYm9scyAob2JqZmlsZSk7CisjaWYgMCAgIC8qIEV4cG9ydCBzeW1ib2xzIG5vdCB1c2VkIHRvZGF5IDE5OTctMDgtMDUgKi8gCisgIGluaXRfZXhwb3J0X3N5bWJvbHMgKG9iamZpbGUpOworI2Vsc2UKKyAgb2JqZmlsZS0+ZXhwb3J0X2xpc3QgPSBOVUxMOworICBvYmpmaWxlLT5leHBvcnRfbGlzdF9zaXplID0gMDsKKyNlbmRpZgorCisgIC8qIFByb2Nlc3MgdGhlIG5vcm1hbCBTT00gc3ltYm9sIHRhYmxlIGZpcnN0LiAKKyAgICAgVGhpcyByZWFkcyBpbiB0aGUgRE5UVCBhbmQgc3RyaW5nIHRhYmxlLCBidXQgZG9lc24ndAorICAgICBhY3R1YWxseSBzY2FuIHRoZSBETlRULiBJdCBkb2VzIHNjYW4gdGhlIGxpbmtlciBzeW1ib2wKKyAgICAgdGFibGUgYW5kIHRodXMgYnVpbGQgdXAgYSAibWluaW1hbCBzeW1ib2wgdGFibGUiLiAqLworIAorICBzb21fc3ltdGFiX3JlYWQgKGFiZmQsIG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cyk7CisKKyAgLyogTm93IHJlYWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3RhYnMgZGVidWcgc2VjdGlvbnMuCisgICAgIFRoaXMgaXMgYSBuby1vcCBmb3IgU09NLgorICAgICBQZXJoYXBzIGl0IGlzIGludGVuZGVkIGZvciBzb21lIGtpbmQgb2YgbWl4ZWQgU1RBQlMvU09NCisgICAgIHNpdHVhdGlvbj8gKi8gICAgCisgIHN0YWJzZWN0X2J1aWxkX3BzeW10YWJzIChvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMsIG1haW5saW5lLAorCQkJICAgIiRHREJfU1lNQk9MUyQiLCAiJEdEQl9TVFJJTkdTJCIsICIkVEVYVCQiKTsKKworICAvKiBOb3cgcmVhZCB0aGUgbmF0aXZlIGRlYnVnIGluZm9ybWF0aW9uLiAKKyAgICAgVGhpcyBidWlsZHMgdGhlIHBzeW10YWIuIFRoaXMgdXNlZCB0byBiZSBkb25lIHZpYSBhIHNjYW4gb2YKKyAgICAgdGhlIEROVFQsIGJ1dCBpcyBub3cgZG9uZSB2aWEgdGhlIFBYREItYnVpbHQgcXVpY2stbG9va3VwIHRhYmxlcworICAgICB0b2dldGhlciB3aXRoIGEgc2NhbiBvZiB0aGUgR05UVC4gU2VlIGhwLXBzeW10YWItcmVhZC5jLiAqLworICBocHJlYWRfYnVpbGRfcHN5bXRhYnMgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywgbWFpbmxpbmUpOworCisgIC8qIEluc3RhbGwgYW55IG1pbmltYWwgc3ltYm9scyB0aGF0IGhhdmUgYmVlbiBjb2xsZWN0ZWQgYXMgdGhlIGN1cnJlbnQKKyAgICAgbWluaW1hbCBzeW1ib2xzIGZvciB0aGlzIG9iamZpbGUuIAorICAgICBGdXJ0aGVyIHN5bWJvbC1yZWFkaW5nIGlzIGRvbmUgaW5jcmVtZW50YWxseSwgZmlsZS1ieS1maWxlLAorICAgICBpbiBhIHN0ZXAga25vd24gYXMgInBzeW10YWItdG8tc3ltdGFiIiBleHBhbnNpb24uIGhwLXN5bXRhYi1yZWFkLmMKKyAgICAgY29udGFpbnMgdGhlIGNvZGUgdG8gZG8gdGhlIGFjdHVhbCBETlRUIHNjYW5uaW5nIGFuZCBzeW10YWIgYnVpbGRpbmcuICovCisgIGluc3RhbGxfbWluaW1hbF9zeW1ib2xzIChvYmpmaWxlKTsKKworICAvKiBGb3JjZSBocHBhLXRkZXAuYyB0byByZS1yZWFkIHRoZSB1bndpbmQgZGVzY3JpcHRvcnMuICAqLworICBvYmpmaWxlLT5vYmpfcHJpdmF0ZSA9IE5VTEw7CisgIGRvX2NsZWFudXBzIChiYWNrX3RvKTsKK30KKworLyogSW5pdGlhbGl6ZSBhbnl0aGluZyB0aGF0IG5lZWRzIGluaXRpYWxpemluZyB3aGVuIGEgY29tcGxldGVseSBuZXcgc3ltYm9sCisgICBmaWxlIGlzIHNwZWNpZmllZCAobm90IGp1c3QgYWRkaW5nIHNvbWUgc3ltYm9scyBmcm9tIGFub3RoZXIgZmlsZSwgZS5nLiBhCisgICBzaGFyZWQgbGlicmFyeSkuCisKKyAgIFdlIHJlaW5pdGlhbGl6ZSBidWlsZHN5bSwgc2luY2Ugd2UgbWF5IGJlIHJlYWRpbmcgc3RhYnMgZnJvbSBhIFNPTSBmaWxlLiAgKi8KKworc3RhdGljIHZvaWQKK3NvbV9uZXdfaW5pdCAoaWdub3JlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqaWdub3JlOworeworICBzdGFic3JlYWRfbmV3X2luaXQgKCk7CisgIGJ1aWxkc3ltX25ld19pbml0ICgpOworfQorCisvKiBQZXJmb3JtIGFueSBsb2NhbCBjbGVhbnVwcyByZXF1aXJlZCB3aGVuIHdlIGFyZSBkb25lIHdpdGggYSBwYXJ0aWN1bGFyCisgICBvYmpmaWxlLiAgSS5FLCB3ZSBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgZGlzY2FyZGluZyBhbGwgc3ltYm9sIGluZm9ybWF0aW9uCisgICBmb3IgYW4gb2JqZmlsZSwgZnJlZWluZyB1cCBhbGwgbWVtb3J5IGhlbGQgZm9yIGl0LCBhbmQgdW5saW5raW5nIHRoZQorICAgb2JqZmlsZSBzdHJ1Y3QgZnJvbSB0aGUgZ2xvYmFsIGxpc3Qgb2Yga25vd24gb2JqZmlsZXMuICovCisKK3N0YXRpYyB2b2lkCitzb21fc3ltZmlsZV9maW5pc2ggKG9iamZpbGUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBpZiAob2JqZmlsZSAtPiBzeW1fc3RhYl9pbmZvICE9IE5VTEwpCisgICAgeworICAgICAgbWZyZWUgKG9iamZpbGUgLT4gbWQsIG9iamZpbGUgLT4gc3ltX3N0YWJfaW5mbyk7CisgICAgfQorICBocHJlYWRfc3ltZmlsZV9maW5pc2ggKG9iamZpbGUpOworfQorCisvKiBTT00gc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgcmVhZGluZyBzeW1ib2xzLiAgKi8KKworc3RhdGljIHZvaWQKK3NvbV9zeW1maWxlX2luaXQgKG9iamZpbGUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICAvKiBTT00gb2JqZWN0cyBtYXkgYmUgcmVvcmRlcmVkLCBzbyBzZXQgT0JKRl9SRU9SREVSRUQuICBJZiB3ZQorICAgICBmaW5kIHRoaXMgY2F1c2VzIGEgc2lnbmlmaWNhbnQgc2xvd2Rvd24gaW4gZ2RiIHRoZW4gd2UgY291bGQKKyAgICAgc2V0IGl0IGluIHRoZSBkZWJ1ZyBzeW1ib2wgcmVhZGVycyBvbmx5IHdoZW4gbmVjZXNzYXJ5LiAgKi8KKyAgb2JqZmlsZS0+ZmxhZ3MgfD0gT0JKRl9SRU9SREVSRUQ7CisgIGhwcmVhZF9zeW1maWxlX2luaXQgKG9iamZpbGUpOworfQorCisvKiBTT00gc3BlY2lmaWMgcGFyc2luZyByb3V0aW5lIGZvciBzZWN0aW9uIG9mZnNldHMuCisKKyAgIFBsYWluIGFuZCBzaW1wbGUgZm9yIG5vdy4gICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICoKK3NvbV9zeW1maWxlX29mZnNldHMgKG9iamZpbGUsIGFkZHIpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBDT1JFX0FERFIgYWRkcjsKK3sKKyAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworICBpbnQgaTsKKworICBvYmpmaWxlLT5udW1fc2VjdGlvbnMgPSBTRUNUX09GRl9NQVg7CisgIHNlY3Rpb25fb2Zmc2V0cyA9IChzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICopCisgICAgb2JzdGFja19hbGxvYyAoJm9iamZpbGUgLT4gcHN5bWJvbF9vYnN0YWNrLCBTSVpFT0ZfU0VDVElPTl9PRkZTRVRTKTsKKworICAvKiBGaXJzdCBzZWUgaWYgd2UncmUgYSBzaGFyZWQgbGlicmFyeS4gIElmIHNvLCBnZXQgdGhlIHNlY3Rpb24KKyAgICAgb2Zmc2V0cyBmcm9tIHRoZSBsaWJyYXJ5LCBlbHNlIGdldCB0aGVtIGZyb20gYWRkci4gICovCisgIGlmICghc29tX3NvbGliX3NlY3Rpb25fb2Zmc2V0cyAob2JqZmlsZSwgc2VjdGlvbl9vZmZzZXRzKSkKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgU0VDVF9PRkZfTUFYOyBpKyspCisJQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgaSkgPSBhZGRyOworICAgIH0KKworICByZXR1cm4gc2VjdGlvbl9vZmZzZXRzOworfQorCisKKworLyogQ2hlY2sgaWYgYSBnaXZlbiBzeW1ib2wgTkFNRSBpcyBpbiB0aGUgaW1wb3J0IGxpc3QKKyAgIG9mIE9CSkZJTEUuCisgICAxID0+IHRydWUsIDAgPT4gZmFsc2UKKyAgIFRoaXMgaXMgdXNlZCBpbiBocF9zeW10YWJfcmVhZC5jIHRvIGRlYWwgd2l0aCBzdGF0aWMgdmFyaWFibGVzCisgICB0aGF0IGFyZSBkZWZpbmVkIGluIGEgZGlmZmVyZW50IHNoYXJlZCBsaWJyYXJ5IHRoYW4gdGhlIG9uZQorICAgd2hvc2Ugc3ltYm9scyBhcmUgYmVpbmcgcHJvY2Vzc2VkLiAqLyAKKworaW50IGlzX2luX2ltcG9ydF9saXN0IChuYW1lLCBvYmpmaWxlKQorICBjaGFyICogbmFtZTsKKyAgc3RydWN0IG9iamZpbGUgKiBvYmpmaWxlOworeworICByZWdpc3RlciBpbnQgaTsKKworICBpZiAoIW9iamZpbGUgfHwKKyAgICAgICFuYW1lIHx8CisgICAgICAhKm5hbWUpCisgICAgcmV0dXJuIDA7CisKKyAgZm9yIChpPTA7IGkgPCBvYmpmaWxlLT5pbXBvcnRfbGlzdF9zaXplOyBpKyspCisgICAgaWYgKG9iamZpbGUtPmltcG9ydF9saXN0W2ldICYmIFNUUkVRIChuYW1lLCBvYmpmaWxlLT5pbXBvcnRfbGlzdFtpXSkpCisgICAgICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworCisvKiBSZWFkIGluIGFuZCBpbml0aWFsaXplIHRoZSBTT00gaW1wb3J0IGxpc3Qgd2hpY2ggaXMgcHJlc2VudAorICAgZm9yIGFsbCBleGVjdXRhYmxlcyBhbmQgc2hhcmVkIGxpYnJhcmllcy4gIFRoZSBpbXBvcnQgbGlzdAorICAgY29uc2lzdHMgb2YgdGhlIHN5bWJvbHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBpbiBPQkpGSUxFIGJ1dAorICAgbm90IGRlZmluZWQgdGhlcmUuICAoVmFyaWFibGVzIHRoYXQgYXJlIGltcG9ydGVkIGFyZSBkZWFsdAorICAgd2l0aCBhcyAibG9jX2luZGlyZWN0IiB2YXJzLikKKyAgIFJldHVybiB2YWx1ZSA9IG51bWJlciBvZiBpbXBvcnQgc3ltYm9scyByZWFkIGluLiAqLworaW50Citpbml0X2ltcG9ydF9zeW1ib2xzIChvYmpmaWxlKQorICBzdHJ1Y3Qgb2JqZmlsZSAqIG9iamZpbGU7Cit7CisgIHVuc2lnbmVkIGludCBpbXBvcnRfbGlzdDsKKyAgdW5zaWduZWQgaW50IGltcG9ydF9saXN0X3NpemU7CisgIHVuc2lnbmVkIGludCBzdHJpbmdfdGFibGU7CisgIHVuc2lnbmVkIGludCBzdHJpbmdfdGFibGVfc2l6ZTsKKyAgY2hhciAqIHN0cmluZ19idWZmZXI7CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBpbnQgajsKKyAgcmVnaXN0ZXIgaW50IGs7CisgIGFzZWN0aW9uICogdGV4dF9zZWN0aW9uOyAgICAgIC8qIHNlY3Rpb24gaGFuZGxlICovIAorICB1bnNpZ25lZCBpbnQgZGxfaGVhZGVyWzEyXTsgICAvKiBTT00gZXhlY3V0YWJsZSBoZWFkZXIgKi8gCisKKyAgLyogQSBzdHJ1Y3QgZm9yIGFuIGVudHJ5IGluIHRoZSBTT00gaW1wb3J0IGxpc3QgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBuYW1lOyAgICAgICAgICAgICAgLyogaW5kZXggaW50byB0aGUgc3RyaW5nIHRhYmxlICovIAorICAgIHNob3J0IGRvbnRfY2FyZTE7ICAgICAgLyogd2UgZG9uJ3QgdXNlIHRoaXMgKi8gCisgICAgdW5zaWduZWQgY2hhciB0eXBlOyAgICAvKiAwID0gTlVMTCwgMiA9IERhdGEsIDMgPSBDb2RlLCA3ID0gU3RvcmFnZSwgMTMgPSBQbGFiZWwgKi8gCisgICAgdW5zaWduZWQgaW50IHJlc2VydmVkMiA6IDg7IC8qIG5vdCB1c2VkICovIAorICB9IFNvbUltcG9ydEVudHJ5OworCisgIC8qIFdlIHJlYWQgMTAwIGVudHJpZXMgaW4gYXQgYSB0aW1lIGZyb20gdGhlIGRpc2sgZmlsZS4gKi8gCisjIGRlZmluZSBTT01fUkVBRF9JTVBPUlRTX05VTSAgICAgICAgIDEwMAorIyBkZWZpbmUgU09NX1JFQURfSU1QT1JUU19DSFVOS19TSVpFICAoc2l6ZW9mIChTb21JbXBvcnRFbnRyeSkgKiBTT01fUkVBRF9JTVBPUlRTX05VTSkKKyAgU29tSW1wb3J0RW50cnkgYnVmZmVyW1NPTV9SRUFEX0lNUE9SVFNfTlVNXTsKKyAgCisgIC8qIEluaXRpYWxpemUgaW4gY2FzZSB3ZSBlcnJvciBvdXQgKi8KKyAgb2JqZmlsZS0+aW1wb3J0X2xpc3QgPSBOVUxMOworICBvYmpmaWxlLT5pbXBvcnRfbGlzdF9zaXplID0gMDsKKworI2lmIDAgIC8qIERFQlVHR0lORyAqLworICBwcmludGYgKCJQcm9jZXNzaW5nIGltcG9ydCBsaXN0IGZvciAlc1xuIiwgb2JqZmlsZS0+bmFtZSk7CisjZW5kaWYKKworICAvKiBJdCBkb2Vzbid0IHdvcmssIGZvciBzb21lIHJlYXNvbiwgdG8gcmVhZCBpbiBzcGFjZSAkVEVYVCQ7CisgICAgIHRoZSBzdWJzcGFjZSAkU0hMSUJfSU5GTyQgaGFzIHRvIGJlIHVzZWQuICBTb21lIEJGRCBxdWlyaz8gcGFpLzE5OTctMDgtMDUgKi8gCisgIHRleHRfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvYmpmaWxlLT5vYmZkLCAiJFNITElCX0lORk8kIik7CisgIGlmICghdGV4dF9zZWN0aW9uKQorICAgIHJldHVybiAwOworICAvKiBHZXQgdGhlIFNPTSBleGVjdXRhYmxlIGhlYWRlciAqLyAKKyAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChvYmpmaWxlLT5vYmZkLCB0ZXh0X3NlY3Rpb24sIGRsX2hlYWRlciwgMCwgMTIgKiBzaXplb2YgKGludCkpOworCisgIC8qIENoZWNrIGhlYWRlciB2ZXJzaW9uIG51bWJlciBmb3IgMTAueCBIUC1VWCAqLworICAvKiBDdXJyZW50bHkgd2UgZGVhbCBvbmx5IHdpdGggMTAueCBzeXN0ZW1zOyBvbiA5LnggdGhlIHZlcnNpb24gIyBpcyA4OTA2MDkxMi4KKyAgICAgRklYTUU6IENoYW5nZSBmb3IgZnV0dXJlIEhQLVVYIHJlbGVhc2VzIGFuZCBtb2RzIHRvIHRoZSBTT00gZXhlY3V0YWJsZSBmb3JtYXQgKi8gCisgIGlmIChkbF9oZWFkZXJbMF0gIT0gOTMwOTIxMTIpCisgICAgcmV0dXJuIDA7CisgIAorICBpbXBvcnRfbGlzdCA9IGRsX2hlYWRlcls0XTsgICAgIAorICBpbXBvcnRfbGlzdF9zaXplID0gZGxfaGVhZGVyWzVdOworICBpZiAoIWltcG9ydF9saXN0X3NpemUpCisgICAgcmV0dXJuIDA7CisgIHN0cmluZ190YWJsZSA9IGRsX2hlYWRlclsxMF07ICAgICAKKyAgc3RyaW5nX3RhYmxlX3NpemUgPSBkbF9oZWFkZXJbMTFdOworICBpZiAoIXN0cmluZ190YWJsZV9zaXplKQorICAgIHJldHVybiAwOworCisgIC8qIFN1Y2sgaW4gU09NIHN0cmluZyB0YWJsZSAqLyAKKyAgc3RyaW5nX2J1ZmZlciA9IChjaGFyICopIHhtYWxsb2MgKHN0cmluZ190YWJsZV9zaXplKTsKKyAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChvYmpmaWxlLT5vYmZkLCB0ZXh0X3NlY3Rpb24sIHN0cmluZ19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RhYmxlLCBzdHJpbmdfdGFibGVfc2l6ZSk7CisKKyAgLyogQWxsb2NhdGUgaW1wb3J0IGxpc3QgaW4gdGhlIHBzeW1ib2wgb2JzdGFjazsgdGhpcyBoYXMgbm90aGluZworICAgICB0byBkbyB3aXRoIHBzeW1ib2xzLCBqdXN0IGEgbWF0dGVyIG9mIGNvbnZlbmllbmNlLiAgV2Ugd2FudCB0aGUKKyAgICAgaW1wb3J0IGxpc3QgdG8gYmUgZnJlZWQgd2hlbiB0aGUgb2JqZmlsZSBpcyBkZWFsbG9jYXRlZCAqLyAKKyAgb2JqZmlsZS0+aW1wb3J0X2xpc3QKKyAgICA9IChJbXBvcnRFbnRyeSAqKSBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+cHN5bWJvbF9vYnN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRfbGlzdF9zaXplICogc2l6ZW9mIChJbXBvcnRFbnRyeSkpOworCisgIC8qIFJlYWQgaW4gdGhlIGltcG9ydCBlbnRyaWVzLCBhIGJ1bmNoIGF0IGEgdGltZSAqLyAKKyAgZm9yIChqPTAsIGs9MDsKKyAgICAgICBqIDwgKGltcG9ydF9saXN0X3NpemUgLyBTT01fUkVBRF9JTVBPUlRTX05VTSk7CisgICAgICAgaisrKQorICAgIHsKKyAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAob2JqZmlsZS0+b2JmZCwgdGV4dF9zZWN0aW9uLCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydF9saXN0ICsgaiAqIFNPTV9SRUFEX0lNUE9SVFNfQ0hVTktfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09NX1JFQURfSU1QT1JUU19DSFVOS19TSVpFKTsKKyAgICAgIGZvciAoaT0wOyBpIDwgU09NX1JFQURfSU1QT1JUU19OVU07IGkrKywgaysrKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGJ1ZmZlcltpXS50eXBlICE9ICh1bnNpZ25lZCBjaGFyKSAwKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgb2JqZmlsZS0+aW1wb3J0X2xpc3Rba10KKyAgICAgICAgICAgICAgICA9IChjaGFyICopIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5wc3ltYm9sX29ic3RhY2ssIHN0cmxlbiAoc3RyaW5nX2J1ZmZlciArIGJ1ZmZlcltpXS5uYW1lKSArIDEpOworICAgICAgICAgICAgICBzdHJjcHkgKG9iamZpbGUtPmltcG9ydF9saXN0W2tdLCBzdHJpbmdfYnVmZmVyICsgYnVmZmVyW2ldLm5hbWUpOworICAgICAgICAgICAgICAvKiBTb21lIGRheSB3ZSBtaWdodCB3YW50IHRvIHJlY29yZCB0aGUgdHlwZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gdG9vICovIAorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgLyogbnVsbCB0eXBlICovIAorICAgICAgICAgICAgb2JqZmlsZS0+aW1wb3J0X2xpc3Rba10gPSBOVUxMOworICAgICAgICAgIAorI2lmIDAgLyogREVCVUdHSU5HICovCisgICAgICAgICAgcHJpbnRmICgiSW1wb3J0IFN0cmluZyAlZDolZCAoJWQpLCB0eXBlICVkIGlzICVzXG4iLCBqLCBpLCBrLAorICAgICAgICAgICAgICAgICAgKGludCkgYnVmZmVyW2ldLnR5cGUsIG9iamZpbGUtPmltcG9ydF9saXN0W2tdKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgIC8qIEdldCB0aGUgbGVmdG92ZXJzICovIAorICBpZiAoayA8IGltcG9ydF9saXN0X3NpemUpCisgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChvYmpmaWxlLT5vYmZkLCB0ZXh0X3NlY3Rpb24sIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydF9saXN0ICsgayAqIHNpemVvZiAoU29tSW1wb3J0RW50cnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGltcG9ydF9saXN0X3NpemUgLSBrKSAqIHNpemVvZiAoU29tSW1wb3J0RW50cnkpKTsKKyAgZm9yIChpPTA7IGsgPCBpbXBvcnRfbGlzdF9zaXplOyBpKyssIGsrKykKKyAgICB7CisgICAgICBpZiAoYnVmZmVyW2ldLnR5cGUgIT0gKHVuc2lnbmVkIGNoYXIpIDApCisgICAgICAgIHsKKyAgICAgICAgICBvYmpmaWxlLT5pbXBvcnRfbGlzdFtrXQorICAgICAgICAgICAgPSAoY2hhciAqKSBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+cHN5bWJvbF9vYnN0YWNrLCBzdHJsZW4gKHN0cmluZ19idWZmZXIgKyBidWZmZXJbaV0ubmFtZSkgKyAxKTsKKyAgICAgICAgICBzdHJjcHkgKG9iamZpbGUtPmltcG9ydF9saXN0W2tdLCBzdHJpbmdfYnVmZmVyICsgYnVmZmVyW2ldLm5hbWUpOworICAgICAgICAgIC8qIFNvbWUgZGF5IHdlIG1pZ2h0IHdhbnQgdG8gcmVjb3JkIHRoZSB0eXBlIGFuZCBvdGhlciBpbmZvcm1hdGlvbiB0b28gKi8gCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgb2JqZmlsZS0+aW1wb3J0X2xpc3Rba10gPSBOVUxMOworI2lmIDAgLyogREVCVUdHSU5HICovIAorICAgICAgcHJpbnRmICgiSW1wb3J0IFN0cmluZyBGOiVkICglZCksIHR5cGUgJWQsIGlzICVzXG4iLCBpLCBrLAorICAgICAgICAgICAgICAoaW50KSBidWZmZXJbaV0udHlwZSwgb2JqZmlsZS0+aW1wb3J0X2xpc3Rba10pOworI2VuZGlmCisgICAgfQorCisgIG9iamZpbGUtPmltcG9ydF9saXN0X3NpemUgPSBpbXBvcnRfbGlzdF9zaXplOworICBmcmVlIChzdHJpbmdfYnVmZmVyKTsKKyAgcmV0dXJuIGltcG9ydF9saXN0X3NpemU7Cit9CisKKy8qIFJlYWQgaW4gYW5kIGluaXRpYWxpemUgdGhlIFNPTSBleHBvcnQgbGlzdCB3aGljaCBpcyBwcmVzZW50CisgICBmb3IgYWxsIGV4ZWN1dGFibGVzIGFuZCBzaGFyZWQgbGlicmFyaWVzLiAgVGhlIGltcG9ydCBsaXN0CisgICBjb25zaXN0cyBvZiB0aGUgc3ltYm9scyB0aGF0IGFyZSByZWZlcmVuY2VkIGluIE9CSkZJTEUgYnV0CisgICBub3QgZGVmaW5lZCB0aGVyZS4gIChWYXJpYWJsZXMgdGhhdCBhcmUgaW1wb3J0ZWQgYXJlIGRlYWx0CisgICB3aXRoIGFzICJsb2NfaW5kaXJlY3QiIHZhcnMuKQorICAgUmV0dXJuIHZhbHVlID0gbnVtYmVyIG9mIGltcG9ydCBzeW1ib2xzIHJlYWQgaW4uICovCitpbnQKK2luaXRfZXhwb3J0X3N5bWJvbHMgKG9iamZpbGUpCisgIHN0cnVjdCBvYmpmaWxlICogb2JqZmlsZTsKK3sKKyAgdW5zaWduZWQgaW50IGV4cG9ydF9saXN0OworICB1bnNpZ25lZCBpbnQgZXhwb3J0X2xpc3Rfc2l6ZTsKKyAgdW5zaWduZWQgaW50IHN0cmluZ190YWJsZTsKKyAgdW5zaWduZWQgaW50IHN0cmluZ190YWJsZV9zaXplOworICBjaGFyICogc3RyaW5nX2J1ZmZlcjsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIGludCBqOworICByZWdpc3RlciBpbnQgazsKKyAgYXNlY3Rpb24gKiB0ZXh0X3NlY3Rpb247ICAgIC8qIHNlY3Rpb24gaGFuZGxlICovICAKKyAgdW5zaWduZWQgaW50IGRsX2hlYWRlclsxMl07IC8qIFNPTSBleGVjdXRhYmxlIGhlYWRlciAqLyAKKworICAvKiBBIHN0cnVjdCBmb3IgYW4gZW50cnkgaW4gdGhlIFNPTSBleHBvcnQgbGlzdCAqLworICB0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IG5leHQ7ICAgIC8qIGZvciBoYXNoIHRhYmxlIHVzZSAtLSB3ZSBkb24ndCB1c2UgdGhpcyAqLyAKKyAgICBpbnQgbmFtZTsgICAgLyogaW5kZXggaW50byBzdHJpbmcgdGFibGUgKi8gCisgICAgaW50IHZhbHVlOyAgIC8qIG9mZnNldCBvciBwbGFiZWwgKi8KKyAgICBpbnQgZG9udF9jYXJlMTsgICAgIC8qIG5vdCB1c2VkICovIAorICAgIHVuc2lnbmVkIGNoYXIgdHlwZTsgLyogMCA9IE5VTEwsIDIgPSBEYXRhLCAzID0gQ29kZSwgNyA9IFN0b3JhZ2UsIDEzID0gUGxhYmVsICovIAorICAgIGNoYXIgZG9udF9jYXJlMjsgICAgLyogbm90IHVzZWQgKi8gCisgICAgc2hvcnQgZG9udF9jYXJlMzsgICAvKiBub3QgdXNlZCAqLyAKKyAgfSBTb21FeHBvcnRFbnRyeTsKKworICAvKiBXZSByZWFkIDEwMCBlbnRyaWVzIGluIGF0IGEgdGltZSBmcm9tIHRoZSBkaXNrIGZpbGUuICovIAorIyBkZWZpbmUgU09NX1JFQURfRVhQT1JUU19OVU0gICAgICAgICAxMDAgIAorIyBkZWZpbmUgU09NX1JFQURfRVhQT1JUU19DSFVOS19TSVpFICAoc2l6ZW9mIChTb21FeHBvcnRFbnRyeSkgKiBTT01fUkVBRF9FWFBPUlRTX05VTSkKKyAgU29tRXhwb3J0RW50cnkgYnVmZmVyW1NPTV9SRUFEX0VYUE9SVFNfTlVNXTsKKworICAvKiBJbml0aWFsaXplIGluIGNhc2Ugd2UgZXJyb3Igb3V0ICovCisgIG9iamZpbGUtPmV4cG9ydF9saXN0ID0gTlVMTDsKKyAgb2JqZmlsZS0+ZXhwb3J0X2xpc3Rfc2l6ZSA9IDA7CisKKyNpZiAwICAvKiBERUJVR0dJTkcgKi8KKyAgcHJpbnRmICgiUHJvY2Vzc2luZyBleHBvcnQgbGlzdCBmb3IgJXNcbiIsIG9iamZpbGUtPm5hbWUpOworI2VuZGlmCisKKyAgLyogSXQgZG9lc24ndCB3b3JrLCBmb3Igc29tZSByZWFzb24sIHRvIHJlYWQgaW4gc3BhY2UgJFRFWFQkOworICAgICB0aGUgc3Vic3BhY2UgJFNITElCX0lORk8kIGhhcyB0byBiZSB1c2VkLiAgU29tZSBCRkQgcXVpcms/IHBhaS8xOTk3LTA4LTA1ICovIAorICB0ZXh0X3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob2JqZmlsZS0+b2JmZCwgIiRTSExJQl9JTkZPJCIpOworICBpZiAoIXRleHRfc2VjdGlvbikKKyAgICByZXR1cm4gMDsKKyAgLyogR2V0IHRoZSBTT00gZXhlY3V0YWJsZSBoZWFkZXIgKi8gCisgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAob2JqZmlsZS0+b2JmZCwgdGV4dF9zZWN0aW9uLCBkbF9oZWFkZXIsIDAsIDEyICogc2l6ZW9mIChpbnQpKTsKKworICAvKiBDaGVjayBoZWFkZXIgdmVyc2lvbiBudW1iZXIgZm9yIDEwLnggSFAtVVggKi8KKyAgLyogQ3VycmVudGx5IHdlIGRlYWwgb25seSB3aXRoIDEwLnggc3lzdGVtczsgb24gOS54IHRoZSB2ZXJzaW9uICMgaXMgODkwNjA5MTIuCisgICAgIEZJWE1FOiBDaGFuZ2UgZm9yIGZ1dHVyZSBIUC1VWCByZWxlYXNlcyBhbmQgbW9kcyB0byB0aGUgU09NIGV4ZWN1dGFibGUgZm9ybWF0ICovIAorICBpZiAoZGxfaGVhZGVyWzBdICE9IDkzMDkyMTEyKQorICAgIHJldHVybiAwOworICAKKyAgZXhwb3J0X2xpc3QgPSBkbF9oZWFkZXJbOF07ICAgICAgCisgIGV4cG9ydF9saXN0X3NpemUgPSBkbF9oZWFkZXJbOV07IAorICBpZiAoIWV4cG9ydF9saXN0X3NpemUpCisgICAgcmV0dXJuIDA7CisgIHN0cmluZ190YWJsZSA9IGRsX2hlYWRlclsxMF07ICAgICAKKyAgc3RyaW5nX3RhYmxlX3NpemUgPSBkbF9oZWFkZXJbMTFdOworICBpZiAoIXN0cmluZ190YWJsZV9zaXplKQorICAgIHJldHVybiAwOworCisgIC8qIFN1Y2sgaW4gU09NIHN0cmluZyB0YWJsZSAqLyAKKyAgc3RyaW5nX2J1ZmZlciA9IChjaGFyICopIHhtYWxsb2MgKHN0cmluZ190YWJsZV9zaXplKTsKKyAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChvYmpmaWxlLT5vYmZkLCB0ZXh0X3NlY3Rpb24sIHN0cmluZ19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RhYmxlLCBzdHJpbmdfdGFibGVfc2l6ZSk7CisKKyAgLyogQWxsb2NhdGUgZXhwb3J0IGxpc3QgaW4gdGhlIHBzeW1ib2wgb2JzdGFjazsgdGhpcyBoYXMgbm90aGluZworICAgICB0byBkbyB3aXRoIHBzeW1ib2xzLCBqdXN0IGEgbWF0dGVyIG9mIGNvbnZlbmllbmNlLiAgV2Ugd2FudCB0aGUKKyAgICAgZXhwb3J0IGxpc3QgdG8gYmUgZnJlZWQgd2hlbiB0aGUgb2JqZmlsZSBpcyBkZWFsbG9jYXRlZCAqLyAKKyAgb2JqZmlsZS0+ZXhwb3J0X2xpc3QKKyAgICA9IChFeHBvcnRFbnRyeSAqKSAgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnBzeW1ib2xfb2JzdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0X2xpc3Rfc2l6ZSAqIHNpemVvZiAoRXhwb3J0RW50cnkpKTsKKworICAvKiBSZWFkIGluIHRoZSBleHBvcnQgZW50cmllcywgYSBidW5jaCBhdCBhIHRpbWUgKi8gCisgIGZvciAoaj0wLCBrPTA7CisgICAgICAgaiA8IChleHBvcnRfbGlzdF9zaXplIC8gU09NX1JFQURfRVhQT1JUU19OVU0pOworICAgICAgIGorKykKKyAgICB7CisgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKG9iamZpbGUtPm9iZmQsIHRleHRfc2VjdGlvbiwgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRfbGlzdCArIGogKiBTT01fUkVBRF9FWFBPUlRTX0NIVU5LX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTV9SRUFEX0VYUE9SVFNfQ0hVTktfU0laRSk7CisgICAgICBmb3IgKGk9MDsgaSA8IFNPTV9SRUFEX0VYUE9SVFNfTlVNOyBpKyssIGsrKykKKyAgICAgICAgeworICAgICAgICAgIGlmIChidWZmZXJbaV0udHlwZSAhPSAodW5zaWduZWQgY2hhcikgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgb2JqZmlsZS0+ZXhwb3J0X2xpc3Rba10ubmFtZQorICAgICAgICAgICAgICAgID0gKGNoYXIgKikgb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnBzeW1ib2xfb2JzdGFjaywgc3RybGVuIChzdHJpbmdfYnVmZmVyICsgYnVmZmVyW2ldLm5hbWUpICsgMSk7CisgICAgICAgICAgICAgIHN0cmNweSAob2JqZmlsZS0+ZXhwb3J0X2xpc3Rba10ubmFtZSwgc3RyaW5nX2J1ZmZlciArIGJ1ZmZlcltpXS5uYW1lKTsKKyAgICAgICAgICAgICAgb2JqZmlsZS0+ZXhwb3J0X2xpc3Rba10uYWRkcmVzcyA9IGJ1ZmZlcltpXS52YWx1ZTsKKyAgICAgICAgICAgICAgLyogU29tZSBkYXkgd2UgbWlnaHQgd2FudCB0byByZWNvcmQgdGhlIHR5cGUgYW5kIG90aGVyIGluZm9ybWF0aW9uIHRvbyAqLyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIC8qIG51bGwgdHlwZSAqLyAKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgIG9iamZpbGUtPmV4cG9ydF9saXN0W2tdLm5hbWUgPSBOVUxMOworICAgICAgICAgICAgICBvYmpmaWxlLT5leHBvcnRfbGlzdFtrXS5hZGRyZXNzID0gMDsKKyAgICAgICAgICAgIH0KKyNpZiAwIC8qIERFQlVHR0lORyAqLworICAgICAgICAgIHByaW50ZiAoIkV4cG9ydCBTdHJpbmcgJWQ6JWQgKCVkKSwgdHlwZSAlZCBpcyAlc1xuIiwgaiwgaSwgaywKKyAgICAgICAgICAgICAgICAgIChpbnQpIGJ1ZmZlcltpXS50eXBlLCBvYmpmaWxlLT5leHBvcnRfbGlzdFtrXS5uYW1lKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgIC8qIEdldCB0aGUgbGVmdG92ZXJzICovIAorICBpZiAoayA8IGV4cG9ydF9saXN0X3NpemUpCisgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChvYmpmaWxlLT5vYmZkLCB0ZXh0X3NlY3Rpb24sIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydF9saXN0ICsgayAqIHNpemVvZiAoU29tRXhwb3J0RW50cnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cG9ydF9saXN0X3NpemUgLSBrKSAqIHNpemVvZiAoU29tRXhwb3J0RW50cnkpKTsKKyAgZm9yIChpPTA7IGsgPCBleHBvcnRfbGlzdF9zaXplOyBpKyssIGsrKykKKyAgICB7CisgICAgICBpZiAoYnVmZmVyW2ldLnR5cGUgIT0gKHVuc2lnbmVkIGNoYXIpIDApCisgICAgICAgIHsKKyAgICAgICAgICBvYmpmaWxlLT5leHBvcnRfbGlzdFtrXS5uYW1lCisgICAgICAgICAgICA9IChjaGFyICopIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5wc3ltYm9sX29ic3RhY2ssIHN0cmxlbiAoc3RyaW5nX2J1ZmZlciArIGJ1ZmZlcltpXS5uYW1lKSArIDEpOworICAgICAgICAgIHN0cmNweSAob2JqZmlsZS0+ZXhwb3J0X2xpc3Rba10ubmFtZSwgc3RyaW5nX2J1ZmZlciArIGJ1ZmZlcltpXS5uYW1lKTsKKyAgICAgICAgICAvKiBTb21lIGRheSB3ZSBtaWdodCB3YW50IHRvIHJlY29yZCB0aGUgdHlwZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gdG9vICovIAorICAgICAgICAgIG9iamZpbGUtPmV4cG9ydF9saXN0W2tdLmFkZHJlc3MgPSBidWZmZXJbaV0udmFsdWU7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIG9iamZpbGUtPmV4cG9ydF9saXN0W2tdLm5hbWUgPSBOVUxMOworICAgICAgICAgIG9iamZpbGUtPmV4cG9ydF9saXN0W2tdLmFkZHJlc3MgPSAwOworICAgICAgICB9CisjaWYgMCAvKiBERUJVR0dJTkcgKi8gCisgICAgICBwcmludGYgKCJFeHBvcnQgU3RyaW5nIEY6JWQgKCVkKSwgdHlwZSAlZCwgdmFsdWUgJXggaXMgJXNcbiIsIGksIGssCisgICAgICAgICAgICAgIChpbnQpIGJ1ZmZlcltpXS50eXBlLCBidWZmZXJbaV0udmFsdWUsIG9iamZpbGUtPmV4cG9ydF9saXN0W2tdLm5hbWUpOworI2VuZGlmCisgICAgfQorCisgIG9iamZpbGUtPmV4cG9ydF9saXN0X3NpemUgPSBleHBvcnRfbGlzdF9zaXplOworICBmcmVlIChzdHJpbmdfYnVmZmVyKTsKKyAgcmV0dXJuIGV4cG9ydF9saXN0X3NpemU7Cit9CisKKworDAorLyogUmVnaXN0ZXIgdGhhdCB3ZSBhcmUgYWJsZSB0byBoYW5kbGUgU09NIG9iamVjdCBmaWxlIGZvcm1hdHMuICAqLworCitzdGF0aWMgc3RydWN0IHN5bV9mbnMgc29tX3N5bV9mbnMgPQoreworICBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyLAorICBzb21fbmV3X2luaXQsCQkvKiBzeW1fbmV3X2luaXQ6IGluaXQgYW55dGhpbmcgZ2JsIHRvIGVudGlyZSBzeW10YWIgKi8KKyAgc29tX3N5bWZpbGVfaW5pdCwJLyogc3ltX2luaXQ6IHJlYWQgaW5pdGlhbCBpbmZvLCBzZXR1cCBmb3Igc3ltX3JlYWQoKSAqLworICBzb21fc3ltZmlsZV9yZWFkLAkvKiBzeW1fcmVhZDogcmVhZCBhIHN5bWJvbCBmaWxlIGludG8gc3ltdGFiICovCisgIHNvbV9zeW1maWxlX2ZpbmlzaCwJLyogc3ltX2ZpbmlzaDogZmluaXNoZWQgd2l0aCBmaWxlLCBjbGVhbnVwICovCisgIHNvbV9zeW1maWxlX29mZnNldHMsCS8qIHN5bV9vZmZzZXRzOiAgVHJhbnNsYXRlIGV4dC4gdG8gaW50LiByZWxvY2F0aW9uICovCisgIE5VTEwJCQkvKiBuZXh0OiBwb2ludGVyIHRvIG5leHQgc3RydWN0IHN5bV9mbnMgKi8KK307CisKK3ZvaWQKK19pbml0aWFsaXplX3NvbXJlYWQgKCkKK3sKKyAgYWRkX3N5bXRhYl9mbnMgKCZzb21fc3ltX2Zucyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvc29tc29saWIuYyBiL2dkYi9zb21zb2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MDE3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvc29tc29saWIuYwpAQCAtMCwwICsxLDE2NDAgQEAKKy8qIEhhbmRsZSBIUCBTT00gc2hhcmVkIGxpYnJhcmllcyBmb3IgR0RCLCB0aGUgR05VIERlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5OTMsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCitXcml0dGVuIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcml0eSBvZiBVdGFoCithbmQgYnkgQ3lnbnVzIFN1cHBvcnQuICAqLworCisKKyNpbmNsdWRlICJkZWZzLmgiCisKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInNvbS5oIgorI2luY2x1ZGUgImxpYmhwcGEuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiYnJlYWtwb2ludC5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIKKyNpbmNsdWRlICJvYmpmaWxlcy5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiZ2RiLXN0YWJzLmgiCisjaW5jbHVkZSAiZ2RiX3N0YXQuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJhc3NlcnQuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2lmbmRlZiBPX0JJTkFSWQorI2RlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKworLyogVW5jb21tZW50IHRoaXMgdG8gdHVybiBvbiBzb21lIGRlYnVnZ2luZyBvdXRwdXQuCisgKi8KKworLyogI2RlZmluZSBTT0xJQl9ERUJVRworICovCisgCisvKiBEZWZpbmVkIGluIGV4ZWMuYzsgdXNlZCB0byBwcmV2ZW50IGRhbmdsaW5nIHBvaW50ZXIgYnVnLgorICovCitleHRlcm4gc3RydWN0IHRhcmdldF9vcHMgZXhlY19vcHM7CisKKy8qIFRoaXMgbGl2ZXMgaW4gaHBwYS10ZGVwLmMuICovCitleHRlcm4gc3RydWN0IHVud2luZF90YWJsZV9lbnRyeSAqZmluZF91bndpbmRfZW50cnkgUEFSQU1TICgoQ09SRV9BRERSIHBjKSk7CisKKy8qIFRoZXNlIG91Z2h0IHRvIGJlIGRlZmluZWQgaW4gc29tZSBwdWJsaWMgaW50ZXJmYWNlLCBidXQgYXJlbid0LiAgVGhleQorICAgZGVmaW5lIHRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGJpdHMgaW4gdGhlIGRpc3Rpbmd1aXNoZWQgX19kbGRfZmxhZ3MKKyAgIHZhcmlhYmxlIHRoYXQgaXMgZGVjbGFyZWQgaW4gZXZlcnkgZGVidWdnYWJsZSBhLm91dCBvbiBIUC1VWCwgYW5kIHRoYXQKKyAgIGlzIHNoYXJlZCBiZXR3ZWVuIHRoZSBkZWJ1Z2dlciBhbmQgdGhlIGR5bmFtaWMgbGlua2VyLgorICAgKi8KKyNkZWZpbmUgRExEX0ZMQUdTX01BUFBSSVZBVEUgICAgMHgxCisjZGVmaW5lIERMRF9GTEFHU19IT09LVkFMSUQgICAgIDB4MgorI2RlZmluZSBETERfRkxBR1NfTElTVFZBTElEICAgICAweDQKKyNkZWZpbmUgRExEX0ZMQUdTX0JPUl9FTkFCTEUgICAgMHg4CisKKy8qIFRPRE86CisKKyAgICogTW9zdCBvZiB0aGlzIGNvZGUgc2hvdWxkIHdvcmsgZm9yIGhwMzAwIHNoYXJlZCBsaWJyYXJpZXMuICBEb2VzCisgICBhbnlvbmUgY2FyZSBlbm91Z2ggdG8gd2VlZCBvdXQgYW55IFNPTS1pc21zLgorCisgICAqIFN1cHBvcnQgZm9yIGhwdXg4IGR5bmFtaWMgbGlua2VyLiAgKi8KKworLyogVGhlIGJhc2ljIHN0cnVjdHVyZSB3aGljaCBkZXNjcmliZXMgYSBkeW5hbWljYWxseSBsb2FkZWQgb2JqZWN0LiAgVGhpcworICAgZGF0YSBzdHJ1Y3R1cmUgaXMgcHJpdmF0ZSB0byB0aGUgZHluYW1pYyBsaW5rZXIgYW5kIGlzbid0IGZvdW5kIGluCisgICBhbnkgSFBVWCBpbmNsdWRlIGZpbGUuICAqLworCitzdHJ1Y3Qgc29tX3NvbGliX21hcHBlZF9lbnRyeQoreworICAvKiBUaGUgbmFtZSBvZiB0aGUgbGlicmFyeS4gICovCisgIGNoYXIgKm5hbWU7CisKKyAgLyogVmVyc2lvbiBvZiB0aGlzIHN0cnVjdHVyZSAoaXQgaXMgZXhwZWN0ZWQgdG8gY2hhbmdlIGFnYWluIGluIGhwdXgxMCkuICAqLworICB1bnNpZ25lZCBjaGFyIHN0cnVjdF92ZXJzaW9uOworCisgIC8qIEJpbmRpbmcgbW9kZSBmb3IgdGhpcyBsaWJyYXJ5LiAgKi8KKyAgdW5zaWduZWQgY2hhciBiaW5kX21vZGU7CisKKyAgLyogVmVyc2lvbiBvZiB0aGlzIGxpYnJhcnkuICAqLworICBzaG9ydCBsaWJyYXJ5X3ZlcnNpb247CisKKyAgLyogU3RhcnQgb2YgdGV4dCBhZGRyZXNzLAorICAgKiBsaW5rLXRpbWUgdGV4dCBsb2NhdGlvbiAobGVuZ3RoIG9mIHRleHQgYXJlYSksCisgICAqIGVuZCBvZiB0ZXh0IGFkZHJlc3MuICAqLworICBDT1JFX0FERFIgdGV4dF9hZGRyOworICBDT1JFX0FERFIgdGV4dF9saW5rX2FkZHI7CisgIENPUkVfQUREUiB0ZXh0X2VuZDsKKworICAvKiBTdGFydCBvZiBkYXRhLCBzdGFydCBvZiBic3MgYW5kIGVuZCBvZiBkYXRhLiAgKi8KKyAgQ09SRV9BRERSIGRhdGFfc3RhcnQ7CisgIENPUkVfQUREUiBic3Nfc3RhcnQ7CisgIENPUkVfQUREUiBkYXRhX2VuZDsKKworICAvKiBWYWx1ZSBvZiBsaW5rYWdlIHBvaW50ZXIgKCVyMTkpLiAgKi8KKyAgQ09SRV9BRERSIGdvdF92YWx1ZTsKKworICAvKiBOZXh0IGVudHJ5LiAgKi8KKyAgc3RydWN0IHNvbV9zb2xpYl9tYXBwZWRfZW50cnkgKm5leHQ7CisKKyAgLyogVGhlcmUgYXJlIG90aGVyIGZpZWxkcywgYnV0IEkgZG9uJ3QgaGF2ZSBpbmZvcm1hdGlvbiBhcyB0byB3aGF0IGlzCisgICAgIGNvbnRhaW5lZCBpbiB0aGVtLiAgKi8KKworICAvKiBGb3IgdmVyc2lvbnMgZnJvbSBIUFVYLTEwLjMwIGFuZCB1cCAqLworCisgIC8qIEFkZHJlc3MgaW4gdGFyZ2V0IG9mIG9mZnNldCBmcm9tIHRocmVhZC1sb2NhbCByZWdpc3RlciBvZgorICAgKiBzdGFydCBvZiB0aGlzIHRocmVhZCdzIGRhdGEuICBJLmUuLCB0aGUgZmlyc3QgdGhyZWFkLWxvY2FsCisgICAqIHZhcmlhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkgc3RhcnRzIGF0ICoodHNkX3N0YXJ0X2FkZHIpCisgICAqIGZyb20gdGhhdCBhcmVhIHBvaW50ZWQgdG8gYnkgY3IyNyAobXBzZnVfaGkpLgorICAgKgorICAgKiBXZSBkbyB0aGUgaW5kaXJlY3Rpb24gYXMgc29vbiBhcyB3ZSByZWFkIGl0LCBzbyBmcm9tIHRoZW4KKyAgICogb24gaXQncyB0aGUgb2Zmc2V0IGl0c2VsZi4KKyAgICovCisgIENPUkVfQUREUiB0c2Rfc3RhcnRfYWRkcjsKKworICAvKiBGb2xsb3dpbmcgdGhpcyBhcmUgbG9uZ3dvcmRzIGhvbGRpbmc6CisgICAqCisgICAqID8sID8sID8sIHB0ciB0byAtMSwgcHRyIHRvLTEsIHB0ciB0byBsaWIgbmFtZSAobGVhZiBuYW1lKSwKKyAgICogcHRyIHRvIF9fZGF0YV9zdGFydCwgcHRyIHRvIF9fZGF0YV9lbmQKKyAgICovCisKKyAgCit9OworCisvKiBBIHN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mIGFsbCB0aGUga25vd24gc2hhcmVkIG9iamVjdHMuICAqLworc3RydWN0IHNvX2xpc3QKK3sKKyAgc3RydWN0IHNvbV9zb2xpYl9tYXBwZWRfZW50cnkgc29tX3NvbGliOworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgYmZkICphYmZkOworICBzdHJ1Y3Qgc2VjdGlvbl90YWJsZSAqc2VjdGlvbnM7CisgIHN0cnVjdCBzZWN0aW9uX3RhYmxlICpzZWN0aW9uc19lbmQ7CisvKiBlbHo6IGFkZGVkIHRoaXMgZmllbGQgdG8gc3RvcmUgdGhlIGFkZHJlc3MgaW4gdGFyZ2V0IHNwYWNlIChpbiB0aGUKKyAgIGxpYnJhcnkpIG9mIHRoZSBsaWJyYXJ5IGRlc2NyaXB0b3IgKGhhbmRsZSkgd2hpY2ggd2UgcmVhZCBpbnRvCisgICBzb21fc29saWJfbWFwcGVkX2VudHJ5IHN0cnVjdHVyZSovCisgIENPUkVfQUREUiBzb2xpYl9hZGRyOworICBzdHJ1Y3Qgc29fbGlzdCAqbmV4dDsKKyAgCit9OworCitzdGF0aWMgc3RydWN0IHNvX2xpc3QgKnNvX2xpc3RfaGVhZDsKKworCisvKiBUaGlzIGlzIHRoZSBjdW11bGF0aXZlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHN5bWJvbCB0YWJsZXMgb2YgYWxsCisgICBzaGFyZWQgb2JqZWN0cyBvbiB0aGUgc29fbGlzdF9oZWFkIGxpc3QuICAoV2hlbiB3ZSBzYXkgc2l6ZSwgaGVyZQorICAgd2UgbWVhbiBvZiB0aGUgaW5mb3JtYXRpb24gYmVmb3JlIGl0IGlzIGJyb3VnaHQgaW50byBtZW1vcnkgYW5kCisgICBwb3RlbnRpYWxseSBleHBhbmRlZCBieSBHREIuKSAgV2hlbiBhZGRpbmcgYSBuZXcgc2hsaWIsIHRoaXMgdmFsdWUKKyAgIGlzIGNvbXBhcmVkIGFnYWluc3QgdGhlIHRocmVzaG9sZCBzaXplLCBoZWxkIGJ5IGF1dG9fc29saWJfYWRkCisgICAoaW4gbWVnYWJ5dGVzKS4gIElmIGFkZGluZyBzeW1ib2xzIGZvciB0aGUgbmV3IHNobGliIHdvdWxkIGNhdXNlCisgICB0aGUgdG90YWwgc2l6ZSB0byBleGNlZWQgdGhlIHRocmVzaG9sZCwgdGhlbiB0aGUgbmV3IHNobGliJ3Mgc3ltYm9scworICAgYXJlIG5vdCBsb2FkZWQuCisgICAqLworc3RhdGljIExPTkdFU1QgIHNvbV9zb2xpYl90b3RhbF9zdF9zaXplOworCisvKiBXaGVuIHRoZSB0aHJlc2hvbGQgaXMgcmVhY2hlZCBmb3IgYW55IHNobGliLCB3ZSByZWZ1c2UgdG8gYWRkCisgICBzeW1ib2xzIGZvciBzdWJzZXF1ZW50IHNobGlicywgZXZlbiBpZiB0aG9zZSBzaGxpYnMnIHN5bWJvbHMgd291bGQKKyAgIGJlIHNtYWxsIGVub3VnaCB0byBmaXQgdW5kZXIgdGhlIHRocmVzaG9sZC4gIChBbHRob3VnaCB0aGlzIG1heQorICAgcmVzdWx0IGluIG9uZSwgZWFybHkgbGFyZ2Ugc2hsaWIgcHJldmVudGluZyB0aGUgbG9hZGluZyBvZiBsYXRlciwKKyAgIHNtYWxsbGVyIHNobGlicycgc3ltYm9scywgaXQgYWxsb3dzIHVzIHRvIGlzc3VlIG9uZSBpbmZvcm1hdGlvbmFsCisgICBtZXNzYWdlLiAgVGhlIGFsdGVybmF0aXZlLCB0byBpc3N1ZSBhIG1lc3NhZ2UgZm9yIGVhY2ggc2hsaWIgd2hvc2UKKyAgIHN5bWJvbHMgYXJlbid0IGxvYWRlZCwgY291bGQgYmUgYSBiaWcgYW5ub3lhbmNlIHdoZXJlIHRoZSB0aHJlc2hvbGQKKyAgIGlzIGV4Y2VlZGVkIGR1ZSB0byBhIHZlcnkgbGFyZ2UgbnVtYmVyIG9mIHNobGlicy4pCisgICAqLworc3RhdGljIGludCAgc29tX3NvbGliX3N0X3NpemVfdGhyZXNob2xkX2V4Y2VlZGVkOworCisvKiBUaGVzZSBhZGRyZXNzZXMgc2hvdWxkIGJlIGZpbGxlZCBpbiBieSBzb21fc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2suCisgICBUaGV5IGFyZSBhbHNvIHVzZWQgZWxzZXdoZXJlIGluIHRoaXMgbW9kdWxlLgorICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgQ09SRV9BRERSICBhZGRyZXNzOworICBzdHJ1Y3QgdW53aW5kX3RhYmxlX2VudHJ5ICogIHVud2luZDsKK30gYWRkcl9hbmRfdW53aW5kX3Q7CisKKy8qIFdoZW4gYWRkaW5nIGZpZWxkcywgYmUgc3VyZSB0byBjbGVhciB0aGVtIGluIF9pbml0aWFsaXplX3NvbV9zb2xpYi4gKi8KK3N0YXRpYyBzdHJ1Y3QgeworICBib29sZWFuICBpc192YWxpZDsKKyAgYWRkcl9hbmRfdW53aW5kX3QgIGhvb2s7CisgIGFkZHJfYW5kX3Vud2luZF90ICBob29rX3N0dWI7CisgIGFkZHJfYW5kX3Vud2luZF90ICBsb2FkOworICBhZGRyX2FuZF91bndpbmRfdCAgbG9hZF9zdHViOworICBhZGRyX2FuZF91bndpbmRfdCAgdW5sb2FkOworICBhZGRyX2FuZF91bndpbmRfdCAgdW5sb2FkMjsKKyAgYWRkcl9hbmRfdW53aW5kX3QgIHVubG9hZF9zdHViOworfSBkbGRfY2FjaGU7CisKKworCitzdGF0aWMgdm9pZCBzb21fc2hhcmVkbGlicmFyeV9pbmZvX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgc29tX3NvbGliX3NoYXJlZGxpYnJhcnlfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgTE9OR0VTVAorc29tX3NvbGliX3NpemVvZl9zeW1ib2xfdGFibGUgKGZpbGVuYW1lKQorICBjaGFyICogIGZpbGVuYW1lOworeworICBiZmQgKiAgYWJmZDsKKyAgaW50ICBkZXNjOworICBjaGFyICogIGFic29sdXRlX25hbWU7CisgIExPTkdFU1QgIHN0X3NpemUgPSAoTE9OR0VTVCkgMDsKKyAgYXNlY3Rpb24gKiAgc2VjdDsKKworICAvKiBXZSBiZWxpZXZlIHRoYXQgZmlsZW5hbWUgd2FzIGhhbmRlZCB0byB1cyBieSB0aGUgZHluYW1pYyBsaW5rZXIsIGFuZAorICAgICBpcyB0aGVyZWZvcmUgYWx3YXlzIGFuIGFic29sdXRlIHBhdGguCisgICAgICovCisgIGRlc2MgPSBvcGVucCAoZ2V0ZW52ICgiUEFUSCIpLCAxLCBmaWxlbmFtZSwgT19SRE9OTFkgfCBPX0JJTkFSWSwgMCwgJmFic29sdXRlX25hbWUpOworICBpZiAoZGVzYyA8IDApCisgICAgeworICAgICAgcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworICAgIH0KKyAgZmlsZW5hbWUgPSBhYnNvbHV0ZV9uYW1lOworCisgIGFiZmQgPSBiZmRfZmRvcGVuciAoZmlsZW5hbWUsIGdudXRhcmdldCwgZGVzYyk7CisgIGlmICghIGFiZmQpCisgICAgeworICAgICAgY2xvc2UgKGRlc2MpOworICAgICAgbWFrZV9jbGVhbnVwIChmcmVlLCBmaWxlbmFtZSk7CisgICAgICBlcnJvciAoIlwiJXNcIjogY2FuJ3Qgb3BlbiB0byByZWFkIHN5bWJvbHM6ICVzLiIsIGZpbGVuYW1lLAorCSAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICAgIH0KKyAgCisgIGlmICghYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkpICAgLyogUmVhZHMgaW4gc2VjdGlvbiBpbmZvICovCisgICAgeworICAgICAgYmZkX2Nsb3NlIChhYmZkKTsJLyogVGhpcyBhbHNvIGNsb3NlcyBkZXNjICovCisgICAgICBtYWtlX2NsZWFudXAgKGZyZWUsIGZpbGVuYW1lKTsKKyAgICAgIGVycm9yICgiXCIlc1wiOiBjYW4ndCByZWFkIHN5bWJvbHM6ICVzLiIsIGZpbGVuYW1lLAorCSAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICAgIH0KKworICAvKiBTdW0gdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIHNlY3Rpb25zIHRoYXQgY29tcG9zZSBkZWJ1ZyBpbmZvLiAqLworCisgIC8qIFRoaXMgY29udGFpbnMgbm9uLURPQyBpbmZvcm1hdGlvbi4gKi8KKyAgc2VjdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiJERFQlVHJCIpOworICBpZiAoc2VjdCkKKyAgICBzdF9zaXplICs9IChMT05HRVNUKSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0KTsKKworICAvKiBUaGlzIGNvbnRhaW5zIERPQyBpbmZvcm1hdGlvbi4gKi8KKyAgc2VjdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiJFBJTkZPJCIpOworICBpZiAoc2VjdCkKKyAgICBzdF9zaXplICs9IChMT05HRVNUKSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0KTsKKworICBiZmRfY2xvc2UgKGFiZmQpOwkvKiBUaGlzIGFsc28gY2xvc2VzIGRlc2MgKi8KKyAgZnJlZSAoZmlsZW5hbWUpOworCisgIC8qIFVuZm9ydHVuYXRlbHksIGp1c3Qgc3VtbWluZyB0aGUgc2l6ZXMgb2YgdmFyaW91cyBkZWJ1ZyBpbmZvCisgICAgIHNlY3Rpb25zIGlzbid0IGEgdmVyeSBhY2N1cmF0ZSBtZWFzdXJlbWVudCBvZiBob3cgbXVjaCBoZWFwCisgICAgIHNwYWNlIHRoZSBkZWJ1Z2dlciB3aWxsIG5lZWQgdG8gaG9sZCB0aGVtLiAgSXQgYWxzbyBkb2Vzbid0CisgICAgIGFjY291bnQgZm9yIHNwYWNlIG5lZWRlZCBieSBsaW5rZXIgKGFrYSAibWluaW1hbCIpIHN5bWJvbHMuCisKKyAgICAgQW5lY2RvdGFsIGV2aWRlbmNlIHN1Z2dlc3RzIHRoYXQganVzdCBzdW1taW5nIHRoZSBzaXplcyBvZgorICAgICBkZWJ1Zy1pbmZvLXJlbGF0ZWQgc2VjdGlvbnMgdW5kZXJzdGF0ZXMgdGhlIGhlYXAgc3BhY2UgbmVlZGVkCisgICAgIHRvIHJlcHJlc2VudCBpdCBpbnRlcm5hbGx5IGJ5IGFib3V0IGFuIG9yZGVyIG9mIG1hZ25pdHVkZS4KKworICAgICBTaW5jZSBpdCdzIG5vdCBleGFjdGx5IGJyYWluIHN1cmdlcnkgd2UncmUgZG9pbmcgaGVyZSwgcmF0aGVyCisgICAgIHRoYW4gYXR0ZW1wdCB0byBtb3JlIGFjY3VyYXRlbHkgbWVhc3VyZSB0aGUgc2l6ZSBvZiBhIHNobGliJ3MKKyAgICAgc3ltYm9sIHRhYmxlIGluIEdEQidzIGhlYXAsIHdlJ2xsIGp1c3QgYXBwbHkgYSAxMHggZnVkZ2UtCisgICAgIGZhY3RvciB0byB0aGUgZGVidWcgaW5mbyBzZWN0aW9ucycgc2l6ZS1zdW0uICBObywgdGhpcyBkb2Vzbid0CisgICAgIGFjY291bnQgZm9yIG1pbmltYWwgc3ltYm9scyBpbiBub24tZGVidWdnYWJsZSBzaGxpYnMuICBCdXQgaXQKKyAgICAgYWxsIHJvdWdobHkgd2FzaGVzIG91dCBpbiB0aGUgZW5kLgorICAgICAqLworICByZXR1cm4gc3Rfc2l6ZSAqIChMT05HRVNUKSAxMDsKK30KKworCitzdGF0aWMgdm9pZAorc29tX3NvbGliX2FkZF9zb2xpYl9vYmpmaWxlIChzbywgbmFtZSwgZnJvbV90dHksIHRleHRfYWRkcikKKyAgc3RydWN0IHNvX2xpc3QgKiAgc287CisgIGNoYXIgKiAgbmFtZTsKKyAgaW50ICBmcm9tX3R0eTsKKyAgQ09SRV9BRERSICB0ZXh0X2FkZHI7Cit7CisgIG9ial9wcml2YXRlX2RhdGFfdCAqb2JqX3ByaXZhdGU7CisgIAorICBzby0+b2JqZmlsZSA9IHN5bWJvbF9maWxlX2FkZCAobmFtZSwgZnJvbV90dHksIHRleHRfYWRkciwgMCwgMCwgMCwgMCwgMSk7CisgIHNvLT5hYmZkID0gc28tPm9iamZpbGUtPm9iZmQ7CisKKyAgLyogTWFyayB0aGlzIGFzIGEgc2hhcmVkIGxpYnJhcnkgYW5kIHNhdmUgcHJpdmF0ZSBkYXRhLgorICAgKi8KKyAgc28tPm9iamZpbGUtPmZsYWdzIHw9IE9CSkZfU0hBUkVEOworCisgIGlmKCBzby0+b2JqZmlsZS0+b2JqX3ByaXZhdGUgPT0gTlVMTCApCisgICAgeworICAgICAgb2JqX3ByaXZhdGUgPSAob2JqX3ByaXZhdGVfZGF0YV90ICopCisgICAgICAgICAgICAgICAgICAgICAgICBvYnN0YWNrX2FsbG9jKCAmc28tPm9iamZpbGUtPnBzeW1ib2xfb2JzdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggb2JqX3ByaXZhdGVfZGF0YV90ICkpOworICAgICAgb2JqX3ByaXZhdGUtPnVud2luZF9pbmZvID0gTlVMTDsKKyAgICAgIG9ial9wcml2YXRlLT5zb19pbmZvICAgICA9IE5VTEw7CisgICAgICBzby0+b2JqZmlsZS0+b2JqX3ByaXZhdGUgPSAoUFRSKSBvYmpfcHJpdmF0ZTsKKyAgIH0KKworICBvYmpfcHJpdmF0ZSA9IChvYmpfcHJpdmF0ZV9kYXRhX3QgKikgc28tPm9iamZpbGUtPm9ial9wcml2YXRlOworICBvYmpfcHJpdmF0ZS0+c29faW5mbyA9IHNvOworCisgIGlmICghYmZkX2NoZWNrX2Zvcm1hdCAoc28tPmFiZmQsIGJmZF9vYmplY3QpKQorICAgIHsKKyAgICAgIGVycm9yICgiXCIlc1wiOiBub3QgaW4gZXhlY3V0YWJsZSBmb3JtYXQ6ICVzLiIsCisgICAgICAgICAgICAgbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorc29tX3NvbGliX2xvYWRfc3ltYm9scyAoc28sIG5hbWUsIGZyb21fdHR5LCB0ZXh0X2FkZHIsIHRhcmdldCkKKyAgc3RydWN0IHNvX2xpc3QgKiAgc287CisgIGNoYXIgKiAgbmFtZTsKKyAgaW50ICBmcm9tX3R0eTsKKyAgQ09SRV9BRERSICB0ZXh0X2FkZHI7CisgIHN0cnVjdCB0YXJnZXRfb3BzICogIHRhcmdldDsKK3sKKyAgc3RydWN0IHNlY3Rpb25fdGFibGUgKiAgcDsKKyAgaW50ICBzdGF0dXM7CisgIGNoYXIgIGJ1Zls0XTsKKyAgQ09SRV9BRERSICBwcmVzdW1lZF9kYXRhX3N0YXJ0OworCisjaWZkZWYgU09MSUJfREVCVUcKKyAgcHJpbnRmKCAiLS1BZGRpbmcgc3ltYm9scyBmb3Igc2hhcmVkIGxpYnJhcnkgXCIlc1wiXG4iLCBuYW1lICk7CisjZW5kaWYKKworICBzb21fc29saWJfYWRkX3NvbGliX29iamZpbGUgKHNvLCBuYW1lLCBmcm9tX3R0eSwgdGV4dF9hZGRyKTsKKworICAvKiBOb3cgd2UgbmVlZCB0byBidWlsZCBhIHNlY3Rpb24gdGFibGUgZm9yIHRoaXMgbGlicmFyeSBzaW5jZQorICAgICB3ZSBtaWdodCBiZSBkZWJ1Z2dpbmcgYSBjb3JlIGZpbGUgZnJvbSBhIGR5bmFtaWNhbGx5IGxpbmtlZAorICAgICBleGVjdXRhYmxlIGluIHdoaWNoIHRoZSBsaWJyYXJpZXMgd2VyZSBub3QgcHJpdmF0ZWx5IG1hcHBlZC4gICovCisgIGlmIChidWlsZF9zZWN0aW9uX3RhYmxlIChzby0+YWJmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzby0+c2VjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc28tPnNlY3Rpb25zX2VuZCkpCisgICAgeworICAgICAgZXJyb3IgKCJVbmFibGUgdG8gYnVpbGQgc2VjdGlvbiB0YWJsZSBmb3Igc2hhcmVkIGxpYnJhcnlcbi4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogUmVsb2NhdGUgYWxsIHRoZSBzZWN0aW9ucyBiYXNlZCBvbiB3aGVyZSB0aGV5IGdvdCBsb2FkZWQuICAqLworICBmb3IgKHAgPSBzby0+c2VjdGlvbnM7IHAgPCBzby0+c2VjdGlvbnNfZW5kOyBwKyspCisgICAgeworICAgICAgaWYgKHAtPnRoZV9iZmRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKKyAgICAgICAgeworICAgICAgICAgIHAtPmFkZHIgKz0gQU5PRkZTRVQgKHNvLT5vYmpmaWxlLT5zZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOworICAgICAgICAgIHAtPmVuZGFkZHIgKz0gQU5PRkZTRVQgKHNvLT5vYmpmaWxlLT5zZWN0aW9uX29mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChwLT50aGVfYmZkX3NlY3Rpb24tPmZsYWdzICYgU0VDX0RBVEEpCisgICAgICAgIHsKKyAgICAgICAgICBwLT5hZGRyICs9IEFOT0ZGU0VUIChzby0+b2JqZmlsZS0+c2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9EQVRBKTsKKyAgICAgICAgICBwLT5lbmRhZGRyICs9IEFOT0ZGU0VUIChzby0+b2JqZmlsZS0+c2VjdGlvbl9vZmZzZXRzLCBTRUNUX09GRl9EQVRBKTsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBOb3cgc2VlIGlmIHdlIG5lZWQgdG8gbWFwIGluIHRoZSB0ZXh0IGFuZCBkYXRhIGZvciB0aGlzIHNoYXJlZAorICAgICBsaWJyYXJ5IChmb3IgZXhhbXBsZSBkZWJ1Z2dpbmcgYSBjb3JlIGZpbGUgd2hpY2ggZG9lcyBub3QgdXNlCisgICAgIHByaXZhdGUgc2hhcmVkIGxpYnJhcmllcy4pLiAKKworICAgICBDYXJlZnVsbHkgcGVlayBhdCB0aGUgZmlyc3QgdGV4dCBhZGRyZXNzIGluIHRoZSBsaWJyYXJ5LiAgSWYgdGhlCisgICAgIHJlYWQgc3VjY2VlZHMsIHRoZW4gdGhlIGxpYnJhcmllcyB3ZXJlIHByaXZhdGVseSBtYXBwZWQgYW5kIHdlcmUKKyAgICAgaW5jbHVkZWQgaW4gdGhlIGNvcmUgZHVtcCBmaWxlLgorCisgICAgIElmIHRoZSBwZWVrIGZhaWxlZCwgdGhlbiB0aGUgbGlicmFyaWVzIHdlcmUgbm90IHByaXZhdGVseSBtYXBwZWQKKyAgICAgYW5kIGFyZSBub3QgaW4gdGhlIGNvcmUgZmlsZSwgd2UnbGwgaGF2ZSB0byByZWFkIHRoZW0gaW4gb3Vyc2VsdmVzLiAgKi8KKyAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5ICh0ZXh0X2FkZHIsIGJ1ZiwgNCk7CisgIGlmIChzdGF0dXMgIT0gMCkKKyAgICB7CisgICAgICBpbnQgb2xkLCBuZXc7CisgICAgICBpbnQgdXBkYXRlX2NvcmVvcHM7CisgICAgICBpbnQgdXBkYXRlX2V4ZWNvcHM7CisKKyAgICAgIC8qIFdlIG11c3QgdXBkYXRlIHRoZSB0b19zZWN0aW9ucyBmaWVsZCBpbiB0aGUgY29yZV9vcHMgc3RydWN0dXJlCisgICAgICAgICBoZXJlLCBvdGhlcndpc2Ugd2UgZGVyZWZlcmVuY2UgYSBwb3RlbnRpYWwgZGFuZ2xpbmcgcG9pbnRlcgorICAgICAgICAgZm9yIGVhY2ggY2FsbCB0byB0YXJnZXRfcmVhZC93cml0ZV9tZW1vcnkgd2l0aGluIHRoaXMgcm91dGluZS4gICovCisgICAgICB1cGRhdGVfY29yZW9wcyA9IGNvcmVfb3BzLnRvX3NlY3Rpb25zID09IHRhcmdldC0+dG9fc2VjdGlvbnM7CisKKyAgICAgIC8qIERpdHRvIGV4ZWNfb3BzICh0aGlzIHdhcyBhIGJ1ZykuCisgICAgICAgKi8KKyAgICAgIHVwZGF0ZV9leGVjb3BzID0gZXhlY19vcHMudG9fc2VjdGlvbnMgPT0gdGFyZ2V0LT50b19zZWN0aW9uczsKKworICAgICAgbmV3ID0gc28tPnNlY3Rpb25zX2VuZCAtIHNvLT5zZWN0aW9uczsKKyAgICAgIC8qIEFkZCBzZWN0aW9ucyBmcm9tIHRoZSBzaGFyZWQgbGlicmFyeSB0byB0aGUgY29yZSB0YXJnZXQuICAqLworICAgICAgaWYgKHRhcmdldC0+dG9fc2VjdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICBvbGQgPSB0YXJnZXQtPnRvX3NlY3Rpb25zX2VuZCAtIHRhcmdldC0+dG9fc2VjdGlvbnM7CisgICAgICAgICAgdGFyZ2V0LT50b19zZWN0aW9ucyA9IChzdHJ1Y3Qgc2VjdGlvbl90YWJsZSAqKQorICAgICAgICAgICAgeHJlYWxsb2MgKChjaGFyICopdGFyZ2V0LT50b19zZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAoKHNpemVvZiAoc3RydWN0IHNlY3Rpb25fdGFibGUpKSAqIChvbGQgKyBuZXcpKSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIG9sZCA9IDA7CisgICAgICAgICAgdGFyZ2V0LT50b19zZWN0aW9ucyA9IChzdHJ1Y3Qgc2VjdGlvbl90YWJsZSAqKQorICAgICAgICAgICAgeG1hbGxvYyAoKHNpemVvZiAoc3RydWN0IHNlY3Rpb25fdGFibGUpKSAqIG5ldyk7CisgICAgICAgIH0KKyAgICAgIHRhcmdldC0+dG9fc2VjdGlvbnNfZW5kID0gKHRhcmdldC0+dG9fc2VjdGlvbnMgKyBvbGQgKyBuZXcpOworCisgICAgICAvKiBVcGRhdGUgdGhlIHRvX3NlY3Rpb25zIGZpZWxkIGluIHRoZSBjb3JlX29wcyBzdHJ1Y3R1cmUKKyAgICAgICAgIGlmIG5lZWRlZCwgZGl0dG8gZXhlY19vcHMuICAqLworICAgICAgaWYgKHVwZGF0ZV9jb3Jlb3BzKQorICAgICAgICB7CisgICAgICAgICAgY29yZV9vcHMudG9fc2VjdGlvbnMgPSB0YXJnZXQtPnRvX3NlY3Rpb25zOworICAgICAgICAgIGNvcmVfb3BzLnRvX3NlY3Rpb25zX2VuZCA9IHRhcmdldC0+dG9fc2VjdGlvbnNfZW5kOworICAgICAgICB9CisKKyAgICAgIGlmICh1cGRhdGVfZXhlY29wcykKKyAgICAgICAgeworICAgICAgICAgIGV4ZWNfb3BzLnRvX3NlY3Rpb25zID0gdGFyZ2V0LT50b19zZWN0aW9uczsKKyAgICAgICAgICBleGVjX29wcy50b19zZWN0aW9uc19lbmQgPSB0YXJnZXQtPnRvX3NlY3Rpb25zX2VuZDsKKyAgICAgICAgfQorCisgICAgICAvKiBDb3B5IG92ZXIgdGhlIG9sZCBkYXRhIGJlZm9yZSBpdCBnZXRzIGNsb2JiZXJlZC4gICovCisgICAgICBtZW1jcHkgKChjaGFyICopKHRhcmdldC0+dG9fc2VjdGlvbnMgKyBvbGQpLAorICAgICAgICAgICAgICBzby0+c2VjdGlvbnMsCisgICAgICAgICAgICAgICgoc2l6ZW9mIChzdHJ1Y3Qgc2VjdGlvbl90YWJsZSkpICogbmV3KSk7CisgICAgfQorfQorCisKKy8qIEFkZCBzeW1ib2xzIGZyb20gc2hhcmVkIGxpYnJhcmllcyBpbnRvIHRoZSBzeW10YWIgbGlzdCwgdW5sZXNzIHRoZQorICAgc2l6ZSB0aHJlc2hvbGQgKHNwZWNpZmllZCBieSBhdXRvX3NvbGliX2FkZCwgaW4gbWVnYWJ5dGVzKSB3b3VsZAorICAgYmUgZXhjZWVkZWQuICAqLworCit2b2lkCitzb21fc29saWJfYWRkIChhcmdfc3RyaW5nLCBmcm9tX3R0eSwgdGFyZ2V0KQorICAgICBjaGFyICphcmdfc3RyaW5nOworICAgICBpbnQgZnJvbV90dHk7CisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQ7Cit7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbDsKKyAgc3RydWN0IHNvX2xpc3QgKnNvX2xpc3RfdGFpbDsKKyAgQ09SRV9BRERSIGFkZHI7CisgIGFzZWN0aW9uICpzaGxpYl9pbmZvOworICBpbnQgc3RhdHVzOworICB1bnNpZ25lZCBpbnQgZGxkX2ZsYWdzOworICBjaGFyIGJ1Zls0XSwgKnJlX2VycjsKKyAgaW50ICB0aHJlc2hvbGRfd2FybmluZ19naXZlbiA9IDA7CisKKyAgLyogRmlyc3QgdmFsaWRhdGUgb3VyIGFyZ3VtZW50cy4gICovCisgIGlmICgocmVfZXJyID0gcmVfY29tcCAoYXJnX3N0cmluZyA/IGFyZ19zdHJpbmcgOiAiLiIpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGVycm9yICgiSW52YWxpZCByZWdleHA6ICVzIiwgcmVfZXJyKTsKKyAgICB9CisKKyAgLyogSWYgd2UncmUgZGVidWdnaW5nIGEgY29yZSBmaWxlLCBvciBoYXZlIGF0dGFjaGVkIHRvIGEgcnVubmluZworICAgICBwcm9jZXNzLCB0aGVuIHNvbV9zb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vayB3aWxsIG5vdCBoYXZlIGJlZW4KKyAgICAgY2FsbGVkLgorCisgICAgIFdlIG5lZWQgdG8gZmlyc3QgZGV0ZXJtaW5lIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGR5bmFtaWNhbGx5CisgICAgIGxpbmtlZCBleGVjdXRhYmxlLiAgSWYgbm90LCB0aGVuIHJldHVybiB3aXRob3V0IGFuIGVycm9yIG9yIHdhcm5pbmcuCisKKyAgICAgV2UgYWxzbyBuZWVkIHRvIGV4YW1pbmUgX19kbGRfZmxhZ3MgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzaGFyZWQgbGlicmFyeQorICAgICBsaXN0IGlzIHZhbGlkIGFuZCB0byBkZXRlcm1pbmUgaWYgdGhlIGxpYnJhcmllcyBoYXZlIGJlZW4gcHJpdmF0ZWx5CisgICAgIG1hcHBlZC4gICovCisgIGlmIChzeW1maWxlX29iamZpbGUgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogRmlyc3Qgc2VlIGlmIHRoZSBvYmpmaWxlIHdhcyBkeW5hbWljYWxseSBsaW5rZWQuICAqLworICBzaGxpYl9pbmZvID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN5bWZpbGVfb2JqZmlsZS0+b2JmZCwgIiRTSExJQl9JTkZPJCIpOworICBpZiAoIXNobGliX2luZm8pCisgICAgcmV0dXJuOworCisgIC8qIEl0J3MgZ290IGEgJFNITElCX0lORk8kIHNlY3Rpb24sIG1ha2Ugc3VyZSBpdCdzIG5vdCBlbXB0eS4gICovCisgIGlmIChiZmRfc2VjdGlvbl9zaXplIChzeW1maWxlX29iamZpbGUtPm9iZmQsIHNobGliX2luZm8pID09IDApCisgICAgcmV0dXJuOworCisgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKCJfX2RsZF9mbGFncyIsIE5VTEwsIE5VTEwpOworICBpZiAobXN5bWJvbCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGVycm9yICgiVW5hYmxlIHRvIGZpbmQgX19kbGRfZmxhZ3Mgc3ltYm9sIGluIG9iamVjdCBmaWxlLlxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGFkZHIgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCk7CisgIC8qIFJlYWQgdGhlIGN1cnJlbnQgY29udGVudHMuICAqLworICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGFkZHIsIGJ1ZiwgNCk7CisgIGlmIChzdGF0dXMgIT0gMCkKKyAgICB7CisgICAgICBlcnJvciAoIlVuYWJsZSB0byByZWFkIF9fZGxkX2ZsYWdzXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGRsZF9mbGFncyA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0KTsKKworICAvKiBfX2RsZF9saXN0IG1heSBub3QgYmUgdmFsaWQuICBJZiBub3QsIHRoZW4gd2UgcHVudCwgd2FybmluZyB0aGUgdXNlciBpZgorICAgICB3ZSB3ZXJlIGNhbGxlZCBhcyBhIHJlc3VsdCBvZiB0aGUgYWRkLXN5bWZpbGUgY29tbWFuZC4KKyAgICAgKi8KKyAgaWYgKChkbGRfZmxhZ3MgJiBETERfRkxBR1NfTElTVFZBTElEKSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChmcm9tX3R0eSkKKyAgICAgICAgZXJyb3IgKCJfX2RsZF9saXN0IGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8gX19kbGRfZmxhZ3MuXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogSWYgdGhlIGxpYnJhcmllcyB3ZXJlIG5vdCBtYXBwZWQgcHJpdmF0ZSwgd2FybiB0aGUgdXNlci4gICovCisgIGlmICgoZGxkX2ZsYWdzICYgRExEX0ZMQUdTX01BUFBSSVZBVEUpID09IDApCisgICAgd2FybmluZyAoIlRoZSBzaGFyZWQgbGlicmFyaWVzIHdlcmUgbm90IHByaXZhdGVseSBtYXBwZWQ7IHNldHRpbmcgYVxuYnJlYWtwb2ludCBpbiBhIHNoYXJlZCBsaWJyYXJ5IHdpbGwgbm90IHdvcmsgdW50aWwgeW91IHJlcnVuIHRoZSBwcm9ncmFtLlxuIik7CisKKyAgbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoIl9fZGxkX2xpc3QiLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCFtc3ltYm9sKQorICAgIHsKKyAgICAgIC8qIE9sZGVyIGNydDAubyBmaWxlcyAoaHB1eDgpIGRvbid0IGhhdmUgX19kbGRfbGlzdCBhcyBhIHN5bWJvbCwKKwkgYnV0IHRoZSBkYXRhIGlzIHN0aWxsIGF2YWlsYWJsZSBpZiB5b3Uga25vdyB3aGVyZSB0byBsb29rLiAgKi8KKyAgICAgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKCJfX2RsZF9mbGFncyIsIE5VTEwsIE5VTEwpOworICAgICAgaWYgKCFtc3ltYm9sKQorCXsKKwkgIGVycm9yICgiVW5hYmxlIHRvIGZpbmQgZHluYW1pYyBsaWJyYXJ5IGxpc3QuXG4iKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBhZGRyID0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpIC0gODsKKyAgICB9CisgIGVsc2UKKyAgICBhZGRyID0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpOworCisgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAoYWRkciwgYnVmLCA0KTsKKyAgaWYgKHN0YXR1cyAhPSAwKQorICAgIHsKKyAgICAgIGVycm9yICgiVW5hYmxlIHRvIGZpbmQgZHluYW1pYyBsaWJyYXJ5IGxpc3QuXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYWRkciA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0KTsKKworICAvKiBJZiBhZGRyIGlzIHplcm8sIHRoZW4gd2UncmUgdXNpbmcgYW4gb2xkIGR5bmFtaWMgbG9hZGVyIHdoaWNoCisgICAgIGRvZXNuJ3QgbWFpbnRhaW4gX19kbGRfbGlzdC4gIFdlJ2xsIGhhdmUgdG8gdXNlIGEgY29tcGxldGVseQorICAgICBkaWZmZXJlbnQgYXBwcm9hY2ggdG8gZ2V0IHNoYXJlZCBsaWJyYXJ5IGluZm9ybWF0aW9uLiAgKi8KKyAgaWYgKGFkZHIgPT0gMCkKKyAgICBnb3RvIG9sZF9kbGQ7CisKKyAgLyogVXNpbmcgdGhlIGluZm9ybWF0aW9uIGluIF9fZGxkX2xpc3QgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QKKyAgICAgdG8gZ2V0IGF0IHNoYXJlZCBsaWJyYXJ5IGluZm9ybWF0aW9uLiAgSXQgZG9lc24ndCBkZXBlbmQgb24KKyAgICAgYW55IGZ1bmN0aW9ucyBpbiAvb3B0L2xhbmd0b29scy9saWIvZW5kLm8gYW5kIGhhcyBhIGNoYW5jZSBvZiB3b3JraW5nCisgICAgIHdpdGggaHB1eDEwIHdoZW4gaXQgaXMgcmVsZWFzZWQuICAqLworICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGFkZHIsIGJ1ZiwgNCk7CisgIGlmIChzdGF0dXMgIT0gMCkKKyAgICB7CisgICAgICBlcnJvciAoIlVuYWJsZSB0byBmaW5kIGR5bmFtaWMgbGlicmFyeSBsaXN0LlxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIGFkZHIgbm93IGhvbGRzIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgZHluYW1pYworICAgICBsaWJyYXJ5IGxpc3QuICAqLworICBhZGRyID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChidWYsIDQpOworCisgIC8qIE5vdyB0aGF0IHdlIGhhdmUgYSBwb2ludGVyIHRvIHRoZSBkeW5hbWljIGxpYnJhcnkgbGlzdCwgd2FsaworICAgICB0aHJvdWdoIGl0IGFuZCBhZGQgdGhlIHN5bWJvbHMgZm9yIGVhY2ggbGlicmFyeS4gICovCisKKyAgc29fbGlzdF90YWlsID0gc29fbGlzdF9oZWFkOworICAvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2Ygc2hhcmVkIG9iamVjdHMuICAqLworICB3aGlsZSAoc29fbGlzdF90YWlsICYmIHNvX2xpc3RfdGFpbC0+bmV4dCkKKyAgICBzb19saXN0X3RhaWwgPSBzb19saXN0X3RhaWwtPm5leHQ7CisKKyNpZmRlZiBTT0xJQl9ERUJVRworICBwcmludGYoICItLUFib3V0IHRvIHJlYWQgc2hhcmVkIGxpYnJhcnkgbGlzdCBkYXRhXG4iICk7CisjZW5kaWYKKworICAvKiAiYWRkciIgd2lsbCBhbHdheXMgcG9pbnQgdG8gdGhlIGJhc2Ugb2YgdGhlCisgICAqIGN1cnJlbnQgZGF0YSBlbnRyeSBkZXNjcmliaW5nIHRoZSBjdXJyZW50CisgICAqIHNoYXJlZCBsaWJyYXJ5LgorICAgKi8KKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgQ09SRV9BRERSIG5hbWVfYWRkciwgdGV4dF9hZGRyOworICAgICAgdW5zaWduZWQgaW50IG5hbWVfbGVuOworICAgICAgY2hhciAqbmFtZTsKKyAgICAgIHN0cnVjdCBzb19saXN0ICpuZXdfc287CisgICAgICBzdHJ1Y3Qgc29fbGlzdCAqc29fbGlzdCA9IHNvX2xpc3RfaGVhZDsKKyAgICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7CisgICAgICBMT05HRVNUICBzdF9zaXplOworICAgICAgaW50ICBpc19tYWluX3Byb2dyYW07CisKKyAgICAgIGlmIChhZGRyID09IDApCisJYnJlYWs7CisKKyAgICAgIC8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIG5hbWUgb2YgdGhpcyBsaWJyYXJ5LiAgKi8KKyAgICAgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAoYWRkciwgYnVmLCA0KTsKKyAgICAgIGlmIChzdGF0dXMgIT0gMCkKKwlnb3RvIGVycjsKKworICAgICAgbmFtZV9hZGRyID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChidWYsIDQpOworICAgICAgbmFtZV9sZW4gPSAwOworICAgICAgd2hpbGUgKDEpCisJeworCSAgdGFyZ2V0X3JlYWRfbWVtb3J5IChuYW1lX2FkZHIgKyBuYW1lX2xlbiwgYnVmLCAxKTsKKwkgIGlmIChzdGF0dXMgIT0gMCkKKwkgICAgZ290byBlcnI7CisKKwkgIG5hbWVfbGVuKys7CisJICBpZiAoKmJ1ZiA9PSAnXDAnKQorCSAgICBicmVhazsKKwl9CisgICAgICBuYW1lID0gYWxsb2NhIChuYW1lX2xlbik7CisgICAgICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKG5hbWVfYWRkciwgbmFtZSwgbmFtZV9sZW4pOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCWdvdG8gZXJyOworCisgICAgICAvKiBTZWUgaWYgd2UndmUgYWxyZWFkeSBsb2FkZWQgc29tZXRoaW5nIHdpdGggdGhpcyBuYW1lLiAgKi8KKyAgICAgIHdoaWxlIChzb19saXN0KQorCXsKKwkgIGlmICghc3RyY21wIChzb19saXN0LT5zb21fc29saWIubmFtZSwgbmFtZSkpCisJICAgIGJyZWFrOworCSAgc29fbGlzdCA9IHNvX2xpc3QtPm5leHQ7CisJfQorCisgICAgICAvKiBTZWUgaWYgdGhlIGZpbGUgZXhpc3RzLiAgSWYgbm90LCBnaXZlIGEgd2FybmluZywgYnV0IGRvbid0CisJIGRpZS4gICovCisgICAgICBzdGF0dXMgPSBzdGF0IChuYW1lLCAmc3RhdGJ1Zik7CisgICAgICBpZiAoc3RhdHVzID09IC0xKQorCXsKKwkgIHdhcm5pbmcgKCJDYW4ndCBmaW5kIGZpbGUgJXMgcmVmZXJlbmNlZCBpbiBkbGRfbGlzdC4iLCBuYW1lKTsKKworCSAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChhZGRyICsgMzYsIGJ1ZiwgNCk7CisJICBpZiAoc3RhdHVzICE9IDApCisJICAgIGdvdG8gZXJyOworCisJICBhZGRyID0gKENPUkVfQUREUikgZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChidWYsIDQpOyAgICAgICAgICAKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogSWYgd2UndmUgYWxyZWFkeSBsb2FkZWQgdGhpcyBvbmUgb3IgaXQncyB0aGUgbWFpbiBwcm9ncmFtLCBza2lwIGl0LiAgKi8KKyAgICAgIGlzX21haW5fcHJvZ3JhbSA9IChzdHJjbXAgKG5hbWUsIHN5bWZpbGVfb2JqZmlsZS0+bmFtZSkgPT0gMCk7CisgICAgICBpZiAoc29fbGlzdCB8fCBpc19tYWluX3Byb2dyYW0pCisJeworICAgICAgICAgIC8qIFRoaXMgaXMgdGhlICJuZXh0IiBwb2ludGVyIGluIHRoZSBzdHJjdXR1cmUuCisgICAgICAgICAgICovCisJICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGFkZHIgKyAzNiwgYnVmLCA0KTsKKwkgIGlmIChzdGF0dXMgIT0gMCkKKwkgICAgZ290byBlcnI7CisKKwkgIGFkZHIgPSAoQ09SRV9BRERSKSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgNCk7CisKKyAgICAgICAgICAvKiBSZWNvcmQgdGhlIG1haW4gcHJvZ3JhbSdzIHN5bWJvbCB0YWJsZSBzaXplLiAqLworICAgICAgICAgIGlmIChpc19tYWluX3Byb2dyYW0gJiYgIXNvX2xpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHN0X3NpemUgPSBzb21fc29saWJfc2l6ZW9mX3N5bWJvbF90YWJsZSAobmFtZSk7CisgICAgICAgICAgICAgIHNvbV9zb2xpYl90b3RhbF9zdF9zaXplICs9IHN0X3NpemU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBXYXMgdGhpcyBhIHNobGliIHRoYXQgd2Ugbm90ZWQgYnV0IGRpZG4ndCBsb2FkIHRoZSBzeW1ib2xzIGZvcj8KKyAgICAgICAgICAgICBJZiBzbywgd2VyZSB3ZSBpbnZva2VkIHRoaXMgdGltZSBmcm9tIHRoZSBjb21tYW5kLWxpbmUsIHZpYQorICAgICAgICAgICAgIGEgJ3NoYXJlZGxpYnJhcnknIG9yICdhZGQtc3ltYm9sLWZpbGUnIGNvbW1hbmQ/ICBJZiB5ZXMgdG8KKyAgICAgICAgICAgICBib3RoLCB3ZSdkIGJldHRlciBsb2FkIHRoZSBzeW1ib2xzIHRoaXMgdGltZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgIGlmIChmcm9tX3R0eSAmJiBzb19saXN0ICYmICFpc19tYWluX3Byb2dyYW0gJiYgKHNvX2xpc3QtPm9iamZpbGUgPT0gTlVMTCkpCisgICAgICAgICAgICBzb21fc29saWJfbG9hZF9zeW1ib2xzIChzb19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fdHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29fbGlzdC0+c29tX3NvbGliLnRleHRfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7CisKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgbmFtZSA9IG9ic2F2ZXN0cmluZyAobmFtZSwgbmFtZV9sZW4gLSAxLAorCQkJICAgJnN5bWZpbGVfb2JqZmlsZS0+c3ltYm9sX29ic3RhY2spOworCisgICAgICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGFkZHIgKyA4LCBidWYsIDQpOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCWdvdG8gZXJyOworCisgICAgICB0ZXh0X2FkZHIgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgNCk7CisKKyAgICAgIG5ld19zbyA9IChzdHJ1Y3Qgc29fbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzb19saXN0KSk7CisgICAgICBtZW1zZXQgKChjaGFyICopbmV3X3NvLCAwLCBzaXplb2YgKHN0cnVjdCBzb19saXN0KSk7CisgICAgICBpZiAoc29fbGlzdF9oZWFkID09IE5VTEwpCisJeworCSAgc29fbGlzdF9oZWFkID0gbmV3X3NvOworCSAgc29fbGlzdF90YWlsID0gbmV3X3NvOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzb19saXN0X3RhaWwtPm5leHQgPSBuZXdfc287CisJICBzb19saXN0X3RhaWwgPSBuZXdfc287CisJfQorCisgICAgICAvKiBGaWxsIGluIGFsbCB0aGUgZW50cmllcyBpbiBHREIncyBzaGFyZWQgbGlicmFyeSBsaXN0LgorICAgICAgICovCisgICAgICAgCisgICAgICBuZXdfc28tPnNvbGliX2FkZHIgPSBhZGRyOworICAgICAgbmV3X3NvLT5zb21fc29saWIubmFtZSA9IG5hbWU7CisgICAgICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGFkZHIgKyA0LCBidWYsIDQpOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCWdvdG8gZXJyOworCisgICAgICBuZXdfc28tPnNvbV9zb2xpYi5zdHJ1Y3RfdmVyc2lvbiA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYnVmICsgMywgMSk7CisgICAgICBuZXdfc28tPnNvbV9zb2xpYi5iaW5kX21vZGUgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiArIDIsIDEpOworICAgICAgICAvKiBGb2xsb3dpbmcgaXMgImhpZ2ggd2F0ZXIgbWFyayIsIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIKKyAgICAgICAgICogc2VlbiwgcmF0aGVyIHRoYW4gcGxhaW4gdmVyc2lvbiBudW1iZXIuCisgICAgICAgICAqLworICAgICAgbmV3X3NvLT5zb21fc29saWIubGlicmFyeV92ZXJzaW9uID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChidWYsIDIpOworICAgICAgbmV3X3NvLT5zb21fc29saWIudGV4dF9hZGRyID0gdGV4dF9hZGRyOworCisgICAgICAgIC8qIFE6IFdoYXQgYWJvdXQgbG9uZ3dvcmQgYXQgImFkZHIgKyA4Ij8KKyAgICAgICAgICogQTogSXQncyByZWFkIGFib3ZlLCBvdXQgb2Ygb3JkZXIsIGludG8gInRleHRfYWRkciIuCisgICAgICAgICAqLworCisgICAgICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGFkZHIgKyAxMiwgYnVmLCA0KTsKKyAgICAgIGlmIChzdGF0dXMgIT0gMCkKKwlnb3RvIGVycjsKKworICAgICAgbmV3X3NvLT5zb21fc29saWIudGV4dF9saW5rX2FkZHIgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgNCk7CisKKyAgICAgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAoYWRkciArIDE2LCBidWYsIDQpOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCWdvdG8gZXJyOworCisgICAgICBuZXdfc28tPnNvbV9zb2xpYi50ZXh0X2VuZCA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0KTsKKworICAgICAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChhZGRyICsgMjAsIGJ1ZiwgNCk7CisgICAgICBpZiAoc3RhdHVzICE9IDApCisJZ290byBlcnI7CisKKyAgICAgIG5ld19zby0+c29tX3NvbGliLmRhdGFfc3RhcnQgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgNCk7CisKKyAgICAgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAoYWRkciArIDI0LCBidWYsIDQpOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCWdvdG8gZXJyOworCisgICAgICBuZXdfc28tPnNvbV9zb2xpYi5ic3Nfc3RhcnQgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgNCk7CisKKyAgICAgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAoYWRkciArIDI4LCBidWYsIDQpOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCWdvdG8gZXJyOworCisgICAgICBuZXdfc28tPnNvbV9zb2xpYi5kYXRhX2VuZCA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0KTsKKworICAgICAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChhZGRyICsgMzIsIGJ1ZiwgNCk7CisgICAgICBpZiAoc3RhdHVzICE9IDApCisJZ290byBlcnI7CisKKyAgICAgIG5ld19zby0+c29tX3NvbGliLmdvdF92YWx1ZSA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0KTsKKworICAgICAgc3RhdHVzID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChhZGRyICsgMzYsIGJ1ZiwgNCk7CisgICAgICBpZiAoc3RhdHVzICE9IDApCisJZ290byBlcnI7CisKKyAgICAgIG5ld19zby0+c29tX3NvbGliLm5leHQgPSAodm9pZCAqKWV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0KTsKKworICAgICAgLyogTm90ZSB0aGF0IHdlIGRvbid0IHJlLXNldCAiYWRkciIgdG8gdGhlIG5leHQgcG9pbnRlcgorICAgICAgICogdW50aWwgYWZ0ZXIgd2UndmUgcmVhZCB0aGUgdHJhaWxpbmcgZGF0YS4KKyAgICAgICAqLworCisgICAgICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGFkZHIgKyA0MCwgYnVmLCA0KTsKKyAgICAgIG5ld19zby0+c29tX3NvbGliLnRzZF9zdGFydF9hZGRyID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChidWYsIDQpOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorICAgICAgICBnb3RvIGVycjsKKworICAgICAgLyogTm93IGluZGlyZWN0IHZpYSB0aGF0IHZhbHVlIQorICAgICAgICovCisgICAgICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKG5ld19zby0+c29tX3NvbGliLnRzZF9zdGFydF9hZGRyLCBidWYsIDQpOworICAgICAgbmV3X3NvLT5zb21fc29saWIudHNkX3N0YXJ0X2FkZHIgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgNCk7CisgICAgICBpZiAoc3RhdHVzICE9IDApCisgICAgICAgIGdvdG8gZXJyOworI2lmZGVmIFNPTElCX0RFQlVHCisgICAgICBwcmludGYoICJcbisgbGlicmFyeSBcIiVzXCIgaXMgZGVzY3JpYmVkIGF0IDB4JXhcbiIsIG5hbWUsIGFkZHIgKTsKKyAgICAgIHByaW50ZiggIiAgJ3ZlcnNpb24nIGlzICVkXG4iLCAgICAgICAgICBuZXdfc28tPnNvbV9zb2xpYi5zdHJ1Y3RfdmVyc2lvbiApOworICAgICAgcHJpbnRmKCAiICAnYmluZF9tb2RlJyBpcyAlZFxuIiwgICAgICAgIG5ld19zby0+c29tX3NvbGliLmJpbmRfbW9kZSApOworICAgICAgcHJpbnRmKCAiICAnbGlicmFyeV92ZXJzaW9uJyBpcyAlZFxuIiwgIG5ld19zby0+c29tX3NvbGliLmxpYnJhcnlfdmVyc2lvbiApOworICAgICAgcHJpbnRmKCAiICAndGV4dF9hZGRyJyBpcyAweCV4XG4iLCAgICAgIG5ld19zby0+c29tX3NvbGliLnRleHRfYWRkciApOworICAgICAgcHJpbnRmKCAiICAndGV4dF9saW5rX2FkZHInIGlzIDB4JXhcbiIsIG5ld19zby0+c29tX3NvbGliLnRleHRfbGlua19hZGRyICk7CisgICAgICBwcmludGYoICIgICd0ZXh0X2VuZCcgaXMgMHgleFxuIiwgICAgICAgbmV3X3NvLT5zb21fc29saWIudGV4dF9lbmQgKTsKKyAgICAgIHByaW50ZiggIiAgJ2RhdGFfc3RhcnQnIGlzIDB4JXhcbiIsICAgICBuZXdfc28tPnNvbV9zb2xpYi5kYXRhX3N0YXJ0ICk7CisgICAgICBwcmludGYoICIgICdic3Nfc3RhcnQnIGlzIDB4JXhcbiIsICAgICAgbmV3X3NvLT5zb21fc29saWIuYnNzX3N0YXJ0ICk7CisgICAgICBwcmludGYoICIgICdkYXRhX2VuZCcgaXMgMHgleFxuIiwgICAgICAgbmV3X3NvLT5zb21fc29saWIuZGF0YV9lbmQgKTsKKyAgICAgIHByaW50ZiggIiAgJ2dvdF92YWx1ZScgaXMgJXhcbiIsICAgICAgICBuZXdfc28tPnNvbV9zb2xpYi5nb3RfdmFsdWUgKTsKKyAgICAgIHByaW50ZiggIiAgJ25leHQnIGlzIDB4JXhcbiIsICAgICAgICAgICBuZXdfc28tPnNvbV9zb2xpYi5uZXh0ICk7CisgICAgICBwcmludGYoICIgICd0c2Rfc3RhcnRfYWRkcicgaXMgMHgleFxuIiwgbmV3X3NvLT5zb21fc29saWIudHNkX3N0YXJ0X2FkZHIgKTsKKyNlbmRpZgorCisgICAgICAvKiBHbyBvbiB0byB0aGUgbmV4dCBzaGFyZWQgbGlicmFyeSBkZXNjcmlwdG9yLgorICAgICAgICovCisgICAgICBhZGRyID0gKENPUkVfQUREUiluZXdfc28tPnNvbV9zb2xpYi5uZXh0OworCisKKworICAgICAgLyogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBlc3NlbnRpYWxseSBob29rZWQgdGhlIHNobGliIGludG8gdGhlCisgICAgICAgICAiaW5mbyBzaGFyZSIgY29tbWFuZC4gIEhvd2V2ZXIsIHdlIGhhdmVuJ3QgeWV0IGxvYWRlZCBpdHMKKyAgICAgICAgIHN5bWJvbCB0YWJsZS4gIFdlIG11c3Qgbm93IGRlY2lkZSB3aGV0aGVyIHdlIG91Z2h0IHRvLCBpLmUuLAorICAgICAgICAgd2hldGhlciBkb2luZyBzbyB3b3VsZCBleGNlZWQgdGhlIHN5bWJvbCB0YWJsZSBzaXplIHRocmVzaG9sZC4KKworICAgICAgICAgSWYgdGhlIHRocmVzaG9sZCBoYXMganVzdCBub3cgYmVlbiBleGNlZWRlZCwgdGhlbiB3ZSdsbCBpc3N1ZQorICAgICAgICAgYSB3YXJuaW5nIG1lc3NhZ2UgKHdoaWNoIGV4cGxhaW5zIGhvdyB0byBsb2FkIHN5bWJvbHMgbWFudWFsbHksCisgICAgICAgICBpZiB0aGUgdXNlciBzbyBkZXNpcmVzKS4KKworICAgICAgICAgSWYgdGhlIHRocmVzaG9sZCBoYXMganVzdCBub3cgb3IgcHJldmlvdXNseSBiZWVuIGV4Y2VlZGVkLAorICAgICAgICAgd2UnbGwganVzdCBhZGQgdGhlIHNobGliIHRvIHRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcywgYnV0IHdvbid0CisgICAgICAgICBhY3R1YWxseSBsb2FkIGl0cyBzeW1ib2xzLiAgKFRoaXMgaXMgbW9yZSB1c2VmdWwgdGhhbiBpdCBtaWdodAorICAgICAgICAgc291bmQsIGZvciBpdCBhbGxvd3MgdXMgdG8gZS5nLiwgc3RpbGwgbG9hZCBhbmQgdXNlIHRoZSBzaGxpYnMnCisgICAgICAgICB1bndpbmQgaW5mb3JtYXRpb24gZm9yIHN0YWNrIHRyYWNlYmFja3MuKQorICAgICAgICAgKi8KKworICAgICAgLyogTm90ZSB0aGF0IHdlIERPTidUIHdhbnQgdG8gcHJlY2x1ZGUgdGhlIHVzZXIgZnJvbSB1c2luZyB0aGUKKyAgICAgICAgIGFkZC1zeW1ib2wtZmlsZSBjb21tYW5kISAgVGh1cywgd2Ugb25seSB3b3JyeSBhYm91dCB0aGUgdGhyZXNob2xkCisgICAgICAgICB3aGVuIHdlJ3JlIGludm9rZWQgZm9yIG90aGVyIHJlYXNvbnMuCisgICAgICAgICAqLworICAgICAgc3Rfc2l6ZSA9IHNvbV9zb2xpYl9zaXplb2Zfc3ltYm9sX3RhYmxlIChuYW1lKTsKKyAgICAgIHNvbV9zb2xpYl9zdF9zaXplX3RocmVzaG9sZF9leGNlZWRlZCA9CisgICAgICAgICFmcm9tX3R0eSAmJgorICAgICAgICAoKHN0X3NpemUgKyBzb21fc29saWJfdG90YWxfc3Rfc2l6ZSkgPiAoYXV0b19zb2xpYl9hZGQgKiAoTE9OR0VTVCkxMDAwMDAwKSk7CisKKyAgICAgIGlmIChzb21fc29saWJfc3Rfc2l6ZV90aHJlc2hvbGRfZXhjZWVkZWQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoISB0aHJlc2hvbGRfd2FybmluZ19naXZlbikKKyAgICAgICAgICAgIHdhcm5pbmcgKCJTeW1ib2xzIGZvciBzb21lIGxpYnJhcmllcyBoYXZlIG5vdCBiZWVuIGxvYWRlZCwgYmVjYXVzZVxuZG9pbmcgc28gd291bGQgZXhjZWVkIHRoZSBzaXplIHRocmVzaG9sZCBzcGVjaWZpZWQgYnkgYXV0by1zb2xpYi1hZGQuXG5UbyBtYW51YWxseSBsb2FkIHN5bWJvbHMsIHVzZSB0aGUgJ3NoYXJlZGxpYnJhcnknIGNvbW1hbmQuXG5UbyByYWlzZSB0aGUgdGhyZXNob2xkLCBzZXQgYXV0by1zb2xpYi1hZGQgdG8gYSBsYXJnZXIgdmFsdWUgYW5kIHJlcnVuXG50aGUgcHJvZ3JhbS5cbiIpOworICAgICAgICAgIHRocmVzaG9sZF93YXJuaW5nX2dpdmVuID0gMTsKKworICAgICAgICAgIC8qIFdlJ2xsIHN0aWxsIG1ha2Ugbm90ZSBvZiB0aGlzIHNobGliLCBldmVuIGlmIHdlIGRvbid0CisgICAgICAgICAgICAgcmVhZCBpdHMgc3ltYm9scy4gIFRoaXMgYWxsb3dzIHVzIHRvIHVzZSBpdHMgdW53aW5kCisgICAgICAgICAgICAgaW5mb3JtYXRpb24gd2VsbCBlbm91Z2ggdG8ga25vdyBob3cgdG8gZS5nLiwgY29ycmVjdGx5CisgICAgICAgICAgICAgZG8gYSB0cmFjZWJhY2sgZnJvbSBhIFBDIHdpdGhpbiB0aGUgc2hsaWIsIGV2ZW4gaWYgd2UKKyAgICAgICAgICAgICBjYW4ndCBzeW1ib2xpemUgdGhvc2UgUENzLi4uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICBzb21fc29saWJfYWRkX3NvbGliX29iamZpbGUgKG5ld19zbywgbmFtZSwgZnJvbV90dHksIHRleHRfYWRkcik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgc29tX3NvbGliX3RvdGFsX3N0X3NpemUgKz0gc3Rfc2l6ZTsKKworICAgICAgLyogVGhpcyBmaWxscyBpbiBuZXdfc28tPm9iamZpbGUsIGFtb25nIG90aGVycy4gKi8KKyAgICAgIHNvbV9zb2xpYl9sb2FkX3N5bWJvbHMgKG5ld19zbywgbmFtZSwgZnJvbV90dHksIHRleHRfYWRkciwgdGFyZ2V0KTsKKyAgICB9CisKKyNpZmRlZiBTT0xJQl9ERUJVRworICAgIHByaW50ZiggIi0tRG9uZSByZWFkaW5nIHNoYXJlZCBsaWJyYXJ5IGRhdGFcbiIgKTsKKyNlbmRpZgorCisgIC8qIEdldHRpbmcgbmV3IHN5bWJvbHMgbWF5IGNoYW5nZSBvdXIgb3BpbmlvbiBhYm91dCB3aGF0IGlzCisgICAgIGZyYW1lbGVzcy4gICovCisgIHJlaW5pdF9mcmFtZV9jYWNoZSAoKTsKKyAgcmV0dXJuOworCitvbGRfZGxkOgorICBlcnJvciAoIkRlYnVnZ2luZyBkeW5hbWljIGV4ZWN1dGFibGVzIGxvYWRlZCB2aWEgdGhlIGhwdXg4IGRsZC5zbCBpcyBub3Qgc3VwcG9ydGVkLlxuIik7CisgIHJldHVybjsKKworZXJyOgorICBlcnJvciAoIkVycm9yIHdoaWxlIHJlYWRpbmcgZHluYW1pYyBsaWJyYXJ5IGxpc3QuXG4iKTsKKyAgcmV0dXJuOworfQorCisKKy8qIFRoaXMgaG9vayBnZXRzIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlCisgICBpbmZlcmlvciBwcm9jZXNzIGlzIGV4ZWN1dGVkLgorCisgICBUaGlzIGlzIG91ciBvcHBvcnR1bml0eSB0byBzZXQgbWFnaWMgZmxhZ3MgaW4gdGhlIGluZmVyaW9yIHNvCisgICB0aGF0IEdEQiBjYW4gYmUgbm90aWZpZWQgd2hlbiBhIHNoYXJlZCBsaWJyYXJ5IGlzIG1hcHBlZCBpbiBhbmQKKyAgIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRoYXQgYSBwcml2YXRlIGNvcHkgb2YgdGhlIGxpYnJhcnkgaXMKKyAgIG5lZWRlZCAoc28gR0RCIGNhbiBzZXQgYnJlYWtwb2ludHMgaW4gdGhlIGxpYnJhcnkpLgorCisgICBfX2RsZF9mbGFncyBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIG1hZ2ljIGZsYWdzOyBhcyBvZiB0aGlzIGltcGxlbWVudGF0aW9uCisgICB0aGVyZSBhcmUgMyBmbGFncyBvZiBpbnRlcmVzdDoKKworICAgYml0IDAgd2hlbiBzZXQgaW5kaWNhdGVzIHRoYXQgcHJpdmF0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcmllcyBhcmUgbmVlZGVkCisgICBiaXQgMSB3aGVuIHNldCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbGJhY2sgaG9vayByb3V0aW5lIGlzIHZhbGlkCisgICBiaXQgMiB3aGVuIHNldCBpbmRpY2F0ZXMgdGhhdCB0aGUgZHluYW1pYyBsaW5rZXIgc2hvdWxkIG1haW50YWluIHRoZQorICAgICAgICAgX19kbGRfbGlzdCBzdHJ1Y3R1cmUgd2hlbiBsb2FkaW5nL3VubG9hZGluZyBsaWJyYXJpZXMuCisKKyAgIE5vdGUgdGhhdCBzaGFyZWQgbGlicmFyaWVzIGFyZSBub3QgbWFwcGVkIGluIGF0IHRoaXMgdGltZSwgc28gd2UgaGF2ZQorICAgcnVuIHRoZSBpbmZlcmlvciB1bnRpbCB0aGUgbGlicmFyaWVzIGFyZSBtYXBwZWQgaW4uICBUeXBpY2FsbHkgdGhpcworICAgbWVhbnMgcnVubmluZyB1bnRpbCB0aGUgIl9zdGFydCIgaXMgY2FsbGVkLiAgKi8KKwordm9pZAorc29tX3NvbGliX2NyZWF0ZV9pbmZlcmlvcl9ob29rKCkKK3sKKyAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sOworICB1bnNpZ25lZCBpbnQgZGxkX2ZsYWdzLCBzdGF0dXMsIGhhdmVfZW5kbzsKKyAgYXNlY3Rpb24gKnNobGliX2luZm87CisgIGNoYXIgYnVmWzRdOworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgQ09SRV9BRERSIGFuYWRkcjsKKworICAvKiBGaXJzdCwgcmVtb3ZlIGFsbCB0aGUgc29saWIgZXZlbnQgYnJlYWtwb2ludHMuICBUaGVpciBhZGRyZXNzZXMKKyAgICAgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHJhbiB0aGUgcHJvZ3JhbS4gICovCisgIHJlbW92ZV9zb2xpYl9ldmVudF9icmVha3BvaW50cyAoKTsKKworICBpZiAoc3ltZmlsZV9vYmpmaWxlID09IE5VTEwpCisgICAgcmV0dXJuOyAKKworICAvKiBGaXJzdCBzZWUgaWYgdGhlIG9iamZpbGUgd2FzIGR5bmFtaWNhbGx5IGxpbmtlZC4gICovCisgIHNobGliX2luZm8gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3ltZmlsZV9vYmpmaWxlLT5vYmZkLCAiJFNITElCX0lORk8kIik7CisgIGlmICghc2hsaWJfaW5mbykKKyAgICByZXR1cm47CisKKyAgLyogSXQncyBnb3QgYSAkU0hMSUJfSU5GTyQgc2VjdGlvbiwgbWFrZSBzdXJlIGl0J3Mgbm90IGVtcHR5LiAgKi8KKyAgaWYgKGJmZF9zZWN0aW9uX3NpemUgKHN5bWZpbGVfb2JqZmlsZS0+b2JmZCwgc2hsaWJfaW5mbykgPT0gMCkKKyAgICByZXR1cm47CisKKyAgaGF2ZV9lbmRvID0gMDsKKyAgLyogU2xhbSB0aGUgcGlkIG9mIHRoZSBwcm9jZXNzIGludG8gX19kX3BpZDsgZmFpbGluZyBpcyBvbmx5IGEgd2FybmluZyEgICovCisgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKCJfX2RfcGlkIiwgTlVMTCwgc3ltZmlsZV9vYmpmaWxlKTsKKyAgaWYgKG1zeW1ib2wgPT0gTlVMTCkKKyAgICB7CisgICAgICB3YXJuaW5nICgiVW5hYmxlIHRvIGZpbmQgX19kX3BpZCBzeW1ib2wgaW4gb2JqZWN0IGZpbGUuIik7CisgICAgICB3YXJuaW5nICgiU3VnZ2VzdCBsaW5raW5nIHdpdGggL29wdC9sYW5ndG9vbHMvbGliL2VuZC5vLiIpOworICAgICAgd2FybmluZyAoIkdEQiB3aWxsIGJlIHVuYWJsZSB0byB0cmFjayBzaGxfbG9hZC9zaGxfdW5sb2FkIGNhbGxzIik7CisgICAgICBnb3RvIGtlZXBfZ29pbmc7CisgICAgfQorCisgIGFuYWRkciA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKTsKKyAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0LCBpbmZlcmlvcl9waWQpOworICBzdGF0dXMgPSB0YXJnZXRfd3JpdGVfbWVtb3J5IChhbmFkZHIsIGJ1ZiwgNCk7CisgIGlmIChzdGF0dXMgIT0gMCkKKyAgICB7CisgICAgICB3YXJuaW5nICgiVW5hYmxlIHRvIHdyaXRlIF9fZF9waWQiKTsKKyAgICAgIHdhcm5pbmcgKCJTdWdnZXN0IGxpbmtpbmcgd2l0aCAvb3B0L2xhbmd0b29scy9saWIvZW5kLm8uIik7CisgICAgICB3YXJuaW5nICgiR0RCIHdpbGwgYmUgdW5hYmxlIHRvIHRyYWNrIHNobF9sb2FkL3NobF91bmxvYWQgY2FsbHMiKTsKKyAgICAgIGdvdG8ga2VlcF9nb2luZzsKKyAgICB9CisKKyAgLyogR2V0IHRoZSB2YWx1ZSBvZiBfRExEX0hPT0sgKGFuIGV4cG9ydCBzdHViKSBhbmQgcHV0IGl0IGluIF9fZGxkX2hvb2s7CisgICAgIFRoaXMgd2lsbCBmb3JjZSB0aGUgZHluYW1pYyBsaW5rZXIgdG8gY2FsbCBfX2RfdHJhcCB3aGVuIHNpZ25pZmljYW50CisgICAgIGV2ZW50cyBvY2N1ci4KKworICAgICBOb3RlIHRoYXQgdGhlIGFib3ZlIGlzIHRoZSBwcmUtSFAtVVggOS4wIGJlaGF2aW91ci4gIEF0IDkuMCBhbmQgYWJvdmUsCisgICAgIHRoZSBkbGQgcHJvdmlkZXMgYW4gZXhwb3J0IHN0dWIgbmFtZWQgIl9fZF90cmFwIiBhcyB3ZWxsIGFzIHRoZQorICAgICBmdW5jdGlvbiBuYW1lZCAiX19kX3RyYXAiIGl0c2VsZiwgYnV0IGRvZXNuJ3QgcHJvdmlkZSAiX0RMRF9IT09LIi4KKyAgICAgV2UnbGwgbG9vayBmaXJzdCBmb3IgdGhlIG9sZCBmbGF2b3IgYW5kIHRoZW4gdGhlIG5ldy4KKyAgICAgKi8KKyAgbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoIl9ETERfSE9PSyIsIE5VTEwsIHN5bWZpbGVfb2JqZmlsZSk7CisgIGlmIChtc3ltYm9sID09IE5VTEwpCisgICAgICBtc3ltYm9sID0gbG9va3VwX21pbmltYWxfc3ltYm9sICgiX19kX3RyYXAiLCBOVUxMLCBzeW1maWxlX29iamZpbGUpOworICBpZiAobXN5bWJvbCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJVbmFibGUgdG8gZmluZCBfRExEX0hPT0sgc3ltYm9sIGluIG9iamVjdCBmaWxlLiIpOworICAgICAgd2FybmluZyAoIlN1Z2dlc3QgbGlua2luZyB3aXRoIC9vcHQvbGFuZ3Rvb2xzL2xpYi9lbmQuby4iKTsKKyAgICAgIHdhcm5pbmcgKCJHREIgd2lsbCBiZSB1bmFibGUgdG8gdHJhY2sgc2hsX2xvYWQvc2hsX3VubG9hZCBjYWxscyIpOworICAgICAgZ290byBrZWVwX2dvaW5nOworICAgIH0KKyAgYW5hZGRyID0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpOworICBkbGRfY2FjaGUuaG9vay5hZGRyZXNzID0gYW5hZGRyOworCisgIC8qIEdycnIsIHRoaXMgbWlnaHQgbm90IGJlIGFuIGV4cG9ydCBzeW1ib2whICBXZSBoYXZlIHRvIGZpbmQgdGhlCisgICAgIGV4cG9ydCBzdHViLiAgKi8KKyAgQUxMX09CSkZJTEVTIChvYmpmaWxlKQorICAgIHsKKyAgICAgIHN0cnVjdCB1bndpbmRfdGFibGVfZW50cnkgKnU7CisgICAgICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2wyOworCisgICAgICAvKiBXaGF0IGEgY3JvY2suICAqLworICAgICAgbXN5bWJvbDIgPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfc29saWJfdHJhbXBvbGluZSAoU1lNQk9MX05BTUUgKG1zeW1ib2wpLAorCQkJCQkJCSBOVUxMLCBvYmpmaWxlKTsKKyAgICAgIC8qIEZvdW5kIGEgc3ltYm9sIHdpdGggdGhlIHJpZ2h0IG5hbWUuICAqLworICAgICAgaWYgKG1zeW1ib2wyKQorCXsKKwkgIHN0cnVjdCB1bndpbmRfdGFibGVfZW50cnkgKnU7CisJICAvKiBJdCBtdXN0IGJlIGEgc2hhcmVkIGxpYnJhcnkgdHJhbXBvbGluZS4gICovCisJICBpZiAoU1lNQk9MX1RZUEUgKG1zeW1ib2wyKSAhPSBtc3Rfc29saWJfdHJhbXBvbGluZSkKKwkgICAgY29udGludWU7CisKKwkgIC8qIEl0IG11c3QgYWxzbyBiZSBhbiBleHBvcnQgc3R1Yi4gICovCisJICB1ID0gZmluZF91bndpbmRfZW50cnkgKFNZTUJPTF9WQUxVRSAobXN5bWJvbDIpKTsKKwkgIGlmICghdSB8fCB1LT5zdHViX3Vud2luZC5zdHViX3R5cGUgIT0gRVhQT1JUKQorCSAgICBjb250aW51ZTsKKworCSAgLyogT0suICBMb29rcyBsaWtlIHRoZSBjb3JyZWN0IGltcG9ydCBzdHViLiAgKi8KKwkgIGFuYWRkciA9IFNZTUJPTF9WQUxVRSAobXN5bWJvbDIpOworICAgICAgICAgIGRsZF9jYWNoZS5ob29rX3N0dWIuYWRkcmVzcyA9IGFuYWRkcjsKKwl9CisgICAgfQorICBzdG9yZV91bnNpZ25lZF9pbnRlZ2VyIChidWYsIDQsIGFuYWRkcik7CisKKyAgbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoIl9fZGxkX2hvb2siLCBOVUxMLCBzeW1maWxlX29iamZpbGUpOworICBpZiAobXN5bWJvbCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJVbmFibGUgdG8gZmluZCBfX2RsZF9ob29rIHN5bWJvbCBpbiBvYmplY3QgZmlsZS4iKTsKKyAgICAgIHdhcm5pbmcgKCJTdWdnZXN0IGxpbmtpbmcgd2l0aCAvb3B0L2xhbmd0b29scy9saWIvZW5kLm8uIik7CisgICAgICB3YXJuaW5nICgiR0RCIHdpbGwgYmUgdW5hYmxlIHRvIHRyYWNrIHNobF9sb2FkL3NobF91bmxvYWQgY2FsbHMiKTsKKyAgICAgIGdvdG8ga2VlcF9nb2luZzsKKyAgICB9CisgIGFuYWRkciA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKTsKKyAgc3RhdHVzID0gdGFyZ2V0X3dyaXRlX21lbW9yeSAoYW5hZGRyLCBidWYsIDQpOworICAKKyAgLyogTm93IHNldCBhIHNobGliX2V2ZW50IGJyZWFrcG9pbnQgYXQgX19kX3RyYXAgc28gd2UgY2FuIHRyYWNrCisgICAgIHNpZ25pZmljYW50IHNoYXJlZCBsaWJyYXJ5IGV2ZW50cy4gICovCisgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKCJfX2RfdHJhcCIsIE5VTEwsIHN5bWZpbGVfb2JqZmlsZSk7CisgIGlmIChtc3ltYm9sID09IE5VTEwpCisgICAgeworICAgICAgd2FybmluZyAoIlVuYWJsZSB0byBmaW5kIF9fZGxkX2RfdHJhcCBzeW1ib2wgaW4gb2JqZWN0IGZpbGUuIik7CisgICAgICB3YXJuaW5nICgiU3VnZ2VzdCBsaW5raW5nIHdpdGggL29wdC9sYW5ndG9vbHMvbGliL2VuZC5vLiIpOworICAgICAgd2FybmluZyAoIkdEQiB3aWxsIGJlIHVuYWJsZSB0byB0cmFjayBzaGxfbG9hZC9zaGxfdW5sb2FkIGNhbGxzIik7CisgICAgICBnb3RvIGtlZXBfZ29pbmc7CisgICAgfQorICBjcmVhdGVfc29saWJfZXZlbnRfYnJlYWtwb2ludCAoU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpKTsKKworICAvKiBXZSBoYXZlIGFsbCB0aGUgc3VwcG9ydCB1c3VhbGx5IGZvdW5kIGluIGVuZC5vLCBzbyB3ZSBjYW4gdHJhY2sKKyAgICAgc2hsX2xvYWQgYW5kIHNobF91bmxvYWQgY2FsbHMuICAqLworICBoYXZlX2VuZG8gPSAxOworCitrZWVwX2dvaW5nOgorCisgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiBfX2RsZF9mbGFncywgaWYgbm8gc3VjaCBzeW1ib2wgZXhpc3RzLCB0aGVuIHdlIGNhbgorICAgICBub3QgZGVidWcgdGhlIHNoYXJlZCBjb2RlLiAgKi8KKyAgbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoIl9fZGxkX2ZsYWdzIiwgTlVMTCwgTlVMTCk7CisgIGlmIChtc3ltYm9sID09IE5VTEwpCisgICAgeworICAgICAgZXJyb3IgKCJVbmFibGUgdG8gZmluZCBfX2RsZF9mbGFncyBzeW1ib2wgaW4gb2JqZWN0IGZpbGUuXG4iKTsKKyAgICB9CisKKyAgYW5hZGRyID0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpOworCisgIC8qIFJlYWQgdGhlIGN1cnJlbnQgY29udGVudHMuICAqLworICBzdGF0dXMgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKGFuYWRkciwgYnVmLCA0KTsKKyAgaWYgKHN0YXR1cyAhPSAwKQorICAgIHsKKyAgICAgIGVycm9yICgiVW5hYmxlIHRvIHJlYWQgX19kbGRfZmxhZ3NcbiIpOworICAgIH0KKyAgZGxkX2ZsYWdzID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChidWYsIDQpOworCisgIC8qIFR1cm4gb24gdGhlIGZsYWdzIHdlIGNhcmUgYWJvdXQuICAqLworICBkbGRfZmxhZ3MgfD0gRExEX0ZMQUdTX01BUFBSSVZBVEU7CisgIGlmIChoYXZlX2VuZG8pCisgICAgZGxkX2ZsYWdzIHw9IERMRF9GTEFHU19IT09LVkFMSUQ7CisgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgNCwgZGxkX2ZsYWdzKTsKKyAgc3RhdHVzID0gdGFyZ2V0X3dyaXRlX21lbW9yeSAoYW5hZGRyLCBidWYsIDQpOworICBpZiAoc3RhdHVzICE9IDApCisgICAgeworICAgICAgZXJyb3IgKCJVbmFibGUgdG8gd3JpdGUgX19kbGRfZmxhZ3NcbiIpOworICAgIH0KKworICAvKiBOb3cgZmluZCB0aGUgYWRkcmVzcyBvZiBfc3RhcnQgYW5kIHNldCBhIGJyZWFrcG9pbnQgdGhlcmUuIAorICAgICBXZSBzdGlsbCBuZWVkIHRoaXMgY29kZSBmb3IgdHdvIHJlYXNvbnM6CisKKwkqIE5vdCBhbGwgc2l0ZXMgaGF2ZSAvb3B0L2xhbmd0b29scy9saWIvZW5kLm8sIHNvIGl0J3Mgbm90IGFsd2F5cworCXBvc3NpYmxlIHRvIHRyYWNrIHRoZSBkeW5hbWljIGxpbmtlcidzIGV2ZW50cy4KKworCSogQXQgdGhpcyB0aW1lIG5vIGV2ZW50cyBhcmUgdHJpZ2dlcmVkIGZvciBzaGFyZWQgbGlicmFyaWVzCisJbG9hZGVkIGF0IHN0YXJ0dXAgdGltZSAod2hhdCBhIGNyb2NrKS4gICovCisJCisgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKCJfc3RhcnQiLCBOVUxMLCBzeW1maWxlX29iamZpbGUpOworICBpZiAobXN5bWJvbCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGVycm9yICgiVW5hYmxlIHRvIGZpbmQgX3N0YXJ0IHN5bWJvbCBpbiBvYmplY3QgZmlsZS5cbiIpOworICAgIH0KKworICBhbmFkZHIgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCk7CisKKyAgLyogTWFrZSB0aGUgYnJlYWtwb2ludCBhdCAiX3N0YXJ0IiBhIHNoYXJlZCBsaWJyYXJ5IGV2ZW50IGJyZWFrcG9pbnQuICAqLworICBjcmVhdGVfc29saWJfZXZlbnRfYnJlYWtwb2ludCAoYW5hZGRyKTsKKworICAvKiBXaXBlIG91dCBhbGwga25vd2xlZGdlIG9mIG9sZCBzaGFyZWQgbGlicmFyaWVzIHNpbmNlIHRoZWlyCisgICAgIG1hcHBpbmcgY2FuIGNoYW5nZSBmcm9tIG9uZSBleGVjIHRvIGFub3RoZXIhICAqLworICB3aGlsZSAoc29fbGlzdF9oZWFkKQorICAgIHsKKyAgICAgIHN0cnVjdCBzb19saXN0ICp0ZW1wOworCisgICAgICB0ZW1wID0gc29fbGlzdF9oZWFkOworICAgICAgZnJlZSAoc29fbGlzdF9oZWFkKTsKKyAgICAgIHNvX2xpc3RfaGVhZCA9IHRlbXAtPm5leHQ7CisgICAgfQorICBjbGVhcl9zeW10YWJfdXNlcnMgKCk7Cit9CisKKworc3RhdGljIHZvaWQKK3Jlc2V0X2luZmVyaW9yX3BpZCAoc2F2ZWRfaW5mZXJpb3JfcGlkKQorICBpbnQgIHNhdmVkX2luZmVyaW9yX3BpZDsKK3sKKyAgaW5mZXJpb3JfcGlkID0gc2F2ZWRfaW5mZXJpb3JfcGlkOworfQorCisKKy8qIFRoaXMgb3BlcmF0aW9uIHJlbW92ZXMgdGhlICJob29rIiBiZXR3ZWVuIEdEQiBhbmQgdGhlIGR5bmFtaWMgbGlua2VyLAorICAgd2hpY2ggY2F1c2VzIHRoZSBkbGQgdG8gbm90aWZ5IEdEQiBvZiBzaGFyZWQgbGlicmFyeSBldmVudHMuCisKKyAgIEFmdGVyIHRoaXMgb3BlcmF0aW9uIGNvbXBsZXRlcywgdGhlIGRsZCB3aWxsIG5vIGxvbmdlciBub3RpZnkgR0RCIG9mCisgICBzaGFyZWQgbGlicmFyeSBldmVudHMuICBUbyByZXN1bWUgbm90aWZpY2F0aW9ucywgR0RCIG11c3QgY2FsbAorICAgc29tX3NvbGliX2NyZWF0ZV9pbmZlcmlvcl9ob29rLgorCisgICBUaGlzIG9wZXJhdGlvbiBkb2VzIG5vdCByZW1vdmUgYW55IGtub3dsZWRnZSBvZiBzaGFyZWQgbGlicmFyaWVzIHdoaWNoCisgICBHREIgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIG5vdGlmaWVkIG9mLgorICAgKi8KK3ZvaWQKK3NvbV9zb2xpYl9yZW1vdmVfaW5mZXJpb3JfaG9vayAocGlkKQorICBpbnQgIHBpZDsKK3sKKyAgQ09SRV9BRERSICBhZGRyOworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKiAgbXN5bWJvbDsKKyAgaW50ICBzdGF0dXM7CisgIGNoYXIgIGRsZF9mbGFnc19idWZmZXIgW1RBUkdFVF9JTlRfQklUL1RBUkdFVF9DSEFSX0JJVF07CisgIHVuc2lnbmVkIGludCAgZGxkX2ZsYWdzX3ZhbHVlOworICBpbnQgIHNhdmVkX2luZmVyaW9yX3BpZCA9IGluZmVyaW9yX3BpZDsKKyAgc3RydWN0IGNsZWFudXAgKiAgb2xkX2NsZWFudXBzID0gbWFrZV9jbGVhbnVwIChyZXNldF9pbmZlcmlvcl9waWQsIHNhdmVkX2luZmVyaW9yX3BpZCk7CisKKyAgLyogRW5zdXJlIHRoYXQgd2UncmUgcmVhbGx5IG9wZXJhdGluZyBvbiB0aGUgc3BlY2lmaWVkIHByb2Nlc3MuICovCisgIGluZmVyaW9yX3BpZCA9IHBpZDsKKworICAvKiBXZSB3b24ndCBib3RoZXIgdG8gcmVtb3ZlIHRoZSBzb2xpYiBicmVha3BvaW50cyBmcm9tIHRoaXMgcHJvY2Vzcy4KKworICAgICBJbiBmYWN0LCBvbiBQQTY0IHRoZSBicmVha3BvaW50IGlzIGhhcmQtY29kZWQgaW50byB0aGUgZGxkIGNhbGxiYWNrLAorICAgICBhbmQgdGh1cyB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gcmVtb3ZlIGl0LgorCisgICAgIFJhdGhlciwgd2UnbGwgbWVyZWx5IGNsZWFyIHRoZSBkbGRfZmxhZ3MgYml0IHRoYXQgZW5hYmxlcyBjYWxsYmFja3MuCisgICAgICovCisgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKCJfX2RsZF9mbGFncyIsIE5VTEwsIE5VTEwpOworCisgIGFkZHIgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCk7CisgIHN0YXR1cyA9IHRhcmdldF9yZWFkX21lbW9yeSAoYWRkciwgZGxkX2ZsYWdzX2J1ZmZlciwgVEFSR0VUX0lOVF9CSVQvVEFSR0VUX0NIQVJfQklUKTsKKworICBkbGRfZmxhZ3NfdmFsdWUgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGRsZF9mbGFnc19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChkbGRfZmxhZ3NfdmFsdWUpKTsKKworICBkbGRfZmxhZ3NfdmFsdWUgJj0gfkRMRF9GTEFHU19IT09LVkFMSUQ7CisgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKGRsZF9mbGFnc19idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoZGxkX2ZsYWdzX3ZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGxkX2ZsYWdzX3ZhbHVlKTsKKyAgc3RhdHVzID0gdGFyZ2V0X3dyaXRlX21lbW9yeSAoYWRkciwgZGxkX2ZsYWdzX2J1ZmZlciwgVEFSR0VUX0lOVF9CSVQvVEFSR0VUX0NIQVJfQklUKTsKKworICBkb19jbGVhbnVwcyAob2xkX2NsZWFudXBzKTsKK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBicmVha3BvaW50IG9uIHRoZSBkeW5hbWljIGxpbmtlciBob29rLCB3aGljaAorICAgaXMgY2FsbGVkIHdoZW4gZS5nLiwgYSBzaGxfbG9hZCBvciBzaGxfdW5sb2FkIGNhbGwgaXMgbWFkZS4gIFRoaXMKKyAgIGJyZWFrcG9pbnQgd2lsbCBvbmx5IHRyaWdnZXIgd2hlbiBhIHNobF9sb2FkIGNhbGwgaXMgbWFkZS4KKworICAgSWYgZmlsZW5hbWUgaXMgTlVMTCwgdGhlbiBsb2FkcyBvZiBhbnkgZGxsIHdpbGwgYmUgY2F1Z2h0LiAgRWxzZSwKKyAgIG9ubHkgbG9hZHMgb2YgdGhlIGZpbGUgd2hvc2UgcGF0aG5hbWUgaXMgdGhlIHN0cmluZyBjb250YWluZWQgYnkKKyAgIGZpbGVuYW1lIHdpbGwgYmUgY2F1Z2h0LgorCisgICBVbmRlZmluZWQgYmVoYXZpb3VyIGlzIGd1YXJhbnRlZWQgaWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlCisgICBzb21fc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2suCisgICAqLwordm9pZAorc29tX3NvbGliX2NyZWF0ZV9jYXRjaF9sb2FkX2hvb2sgKHBpZCwgdGVtcGZsYWcsIGZpbGVuYW1lLCBjb25kX3N0cmluZykKKyAgaW50ICBwaWQ7CisgIGludCAgdGVtcGZsYWc7CisgIGNoYXIgKiAgZmlsZW5hbWU7CisgIGNoYXIgKiAgY29uZF9zdHJpbmc7Cit7CisgIGNyZWF0ZV9zb2xpYl9sb2FkX2V2ZW50X2JyZWFrcG9pbnQgKCJfX2RfdHJhcCIsIHRlbXBmbGFnLCBmaWxlbmFtZSwgY29uZF9zdHJpbmcpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBicmVha3BvaW50IG9uIHRoZSBkeW5hbWljIGxpbmtlciBob29rLCB3aGljaAorICAgaXMgY2FsbGVkIHdoZW4gZS5nLiwgYSBzaGxfbG9hZCBvciBzaGxfdW5sb2FkIGNhbGwgaXMgbWFkZS4gIFRoaXMKKyAgIGJyZWFrcG9pbnQgd2lsbCBvbmx5IHRyaWdnZXIgd2hlbiBhIHNobF91bmxvYWQgY2FsbCBpcyBtYWRlLgorCisgICBJZiBmaWxlbmFtZSBpcyBOVUxMLCB0aGVuIHVubG9hZHMgb2YgYW55IGRsbCB3aWxsIGJlIGNhdWdodC4gIEVsc2UsCisgICBvbmx5IHVubG9hZHMgb2YgdGhlIGZpbGUgd2hvc2UgcGF0aG5hbWUgaXMgdGhlIHN0cmluZyBjb250YWluZWQgYnkKKyAgIGZpbGVuYW1lIHdpbGwgYmUgY2F1Z2h0LgorCisgICBVbmRlZmluZWQgYmVoYXZpb3VyIGlzIGd1YXJhbnRlZWQgaWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlCisgICBzb21fc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2suCisgICAqLwordm9pZAorc29tX3NvbGliX2NyZWF0ZV9jYXRjaF91bmxvYWRfaG9vayAocGlkLCB0ZW1wZmxhZywgZmlsZW5hbWUsIGNvbmRfc3RyaW5nKQorICBpbnQgIHBpZDsKKyAgaW50ICB0ZW1wZmxhZzsKKyAgY2hhciAqICBmaWxlbmFtZTsKKyAgY2hhciAqICBjb25kX3N0cmluZzsKK3sKKyAgY3JlYXRlX3NvbGliX3VubG9hZF9ldmVudF9icmVha3BvaW50ICgiX19kX3RyYXAiLCB0ZW1wZmxhZywgZmlsZW5hbWUsIGNvbmRfc3RyaW5nKTsKK30KKworaW50Citzb21fc29saWJfaGF2ZV9sb2FkX2V2ZW50IChwaWQpCisgIGludCAgcGlkOworeworICBDT1JFX0FERFIgIGV2ZW50X2tpbmQ7CisKKyAgZXZlbnRfa2luZCA9IHJlYWRfcmVnaXN0ZXIgKEFSRzBfUkVHTlVNKTsKKyAgcmV0dXJuIChldmVudF9raW5kID09IFNITF9MT0FEKTsKK30KKworaW50Citzb21fc29saWJfaGF2ZV91bmxvYWRfZXZlbnQgKHBpZCkKKyAgaW50ICBwaWQ7Cit7CisgIENPUkVfQUREUiAgZXZlbnRfa2luZDsKKworICBldmVudF9raW5kID0gcmVhZF9yZWdpc3RlciAoQVJHMF9SRUdOVU0pOworICByZXR1cm4gKGV2ZW50X2tpbmQgPT0gU0hMX1VOTE9BRCk7Cit9CisKK3N0YXRpYyBjaGFyICoKK3NvbV9zb2xpYl9saWJyYXJ5X3BhdGhuYW1lIChwaWQpCisgIGludCAgcGlkOworeworICBDT1JFX0FERFIgIGRsbF9oYW5kbGVfYWRkcmVzczsKKyAgQ09SRV9BRERSICBkbGxfcGF0aG5hbWVfYWRkcmVzczsKKyAgc3RydWN0IHNvbV9zb2xpYl9tYXBwZWRfZW50cnkgIGRsbF9kZXNjcmlwdG9yOworICBjaGFyICogIHA7CisgIHN0YXRpYyBjaGFyICBkbGxfcGF0aG5hbWUgWzEwMjRdOworCisgIC8qIFJlYWQgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBuZXdseS1sb2FkZWQgbGlicmFyeS4gKi8KKyAgZGxsX2hhbmRsZV9hZGRyZXNzID0gcmVhZF9yZWdpc3RlciAoQVJHMV9SRUdOVU0pOworICByZWFkX21lbW9yeSAoZGxsX2hhbmRsZV9hZGRyZXNzLCAoY2hhciAqKSAmZGxsX2Rlc2NyaXB0b3IsIHNpemVvZiAoZGxsX2Rlc2NyaXB0b3IpKTsKKworICAvKiBXZSBjYW4gZmluZCBhIHBvaW50ZXIgdG8gdGhlIGRsbCdzIHBhdGhuYW1lIHdpdGhpbiB0aGUgZGVzY3JpcHRvci4gKi8KKyAgZGxsX3BhdGhuYW1lX2FkZHJlc3MgPSAoQ09SRV9BRERSKSBkbGxfZGVzY3JpcHRvci5uYW1lOworICAKKyAgLyogUmVhZCB0aGUgcGF0aG5hbWUsIG9uZSBieXRlIGF0IGEgdGltZS4gKi8KKyAgcCA9IGRsbF9wYXRobmFtZTsKKyAgZm9yICg7OykKKyAgICB7CisgICAgICBjaGFyICBiOworICAgICAgcmVhZF9tZW1vcnkgKGRsbF9wYXRobmFtZV9hZGRyZXNzKyssIChjaGFyICopICZiLCAxKTsKKyAgICAgICpwKysgPSBiOworICAgICAgaWYgKGIgPT0gJ1wwJykKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBkbGxfcGF0aG5hbWU7Cit9CisKK2NoYXIgKgorc29tX3NvbGliX2xvYWRlZF9saWJyYXJ5X3BhdGhuYW1lIChwaWQpCisgIGludCAgcGlkOworeworICBpZiAoISBzb21fc29saWJfaGF2ZV9sb2FkX2V2ZW50IChwaWQpKQorICAgIGVycm9yICgiTXVzdCBoYXZlIGEgbG9hZCBldmVudCB0byB1c2UgdGhpcyBxdWVyeSIpOworCisgIHJldHVybiBzb21fc29saWJfbGlicmFyeV9wYXRobmFtZSAocGlkKTsKK30KKworY2hhciAqCitzb21fc29saWJfdW5sb2FkZWRfbGlicmFyeV9wYXRobmFtZSAocGlkKQorICBpbnQgIHBpZDsKK3sKKyAgaWYgKCEgc29tX3NvbGliX2hhdmVfdW5sb2FkX2V2ZW50IChwaWQpKQorICAgIGVycm9yICgiTXVzdCBoYXZlIGFuIHVubG9hZCBldmVudCB0byB1c2UgdGhpcyBxdWVyeSIpOworCisgIHJldHVybiBzb21fc29saWJfbGlicmFyeV9wYXRobmFtZSAocGlkKTsKK30KKworc3RhdGljIHZvaWQKK3NvbV9zb2xpYl9kZXNpcmVfZHluYW1pY19saW5rZXJfc3ltYm9scyAoKQoreworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgc3RydWN0IHVud2luZF90YWJsZV9lbnRyeSAqdTsKKyAgc3RydWN0IG1pbmltYWxfc3ltYm9sICogIGRsZF9tc3ltYm9sOworCisgIC8qIERvIHdlIGFscmVhZHkga25vdyB0aGUgdmFsdWUgb2YgdGhlc2Ugc3ltYm9scz8gIElmIHNvLCB0aGVuCisgICAgIHdlJ3ZlIG5vIHdvcmsgdG8gZG8uCisKKyAgICAgKElmIHlvdSBhZGQgY2xhdXNlcyB0byB0aGlzIHRlc3QsIGJlIHN1cmUgdG8gbGlrZXdpc2UgdXBkYXRlIHRoZQorICAgICB0ZXN0IHdpdGhpbiB0aGUgbG9vcC4pCisgICAgICovCisgIGlmIChkbGRfY2FjaGUuaXNfdmFsaWQpCisgICAgcmV0dXJuOworCisgIEFMTF9PQkpGSUxFUyAob2JqZmlsZSkKKyAgICB7CisgICAgICBkbGRfbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoInNobF9sb2FkIiwgTlVMTCwgb2JqZmlsZSk7CisgICAgICBpZiAoZGxkX21zeW1ib2wgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGRsZF9jYWNoZS5sb2FkLmFkZHJlc3MgPSBTWU1CT0xfVkFMVUUgKGRsZF9tc3ltYm9sKTsKKyAgICAgICAgICBkbGRfY2FjaGUubG9hZC51bndpbmQgPSBmaW5kX3Vud2luZF9lbnRyeSAoZGxkX2NhY2hlLmxvYWQuYWRkcmVzcyk7CisgICAgICAgIH0KKworICAgICAgZGxkX21zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfc29saWJfdHJhbXBvbGluZSAoInNobF9sb2FkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpmaWxlKTsKKyAgICAgIGlmIChkbGRfbXN5bWJvbCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKFNZTUJPTF9UWVBFIChkbGRfbXN5bWJvbCkgPT0gbXN0X3NvbGliX3RyYW1wb2xpbmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHUgPSBmaW5kX3Vud2luZF9lbnRyeSAoU1lNQk9MX1ZBTFVFIChkbGRfbXN5bWJvbCkpOworICAgICAgICAgICAgICBpZiAoKHUgIT0gTlVMTCkgJiYgKHUtPnN0dWJfdW53aW5kLnN0dWJfdHlwZSA9PSBFWFBPUlQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGRsZF9jYWNoZS5sb2FkX3N0dWIuYWRkcmVzcyA9IFNZTUJPTF9WQUxVRSAoZGxkX21zeW1ib2wpOworICAgICAgICAgICAgICAgICAgZGxkX2NhY2hlLmxvYWRfc3R1Yi51bndpbmQgPSB1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICBkbGRfbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoInNobF91bmxvYWQiLCBOVUxMLCBvYmpmaWxlKTsKKyAgICAgIGlmIChkbGRfbXN5bWJvbCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGxkX2NhY2hlLnVubG9hZC5hZGRyZXNzID0gU1lNQk9MX1ZBTFVFIChkbGRfbXN5bWJvbCk7CisgICAgICAgICAgZGxkX2NhY2hlLnVubG9hZC51bndpbmQgPSBmaW5kX3Vud2luZF9lbnRyeSAoZGxkX2NhY2hlLnVubG9hZC5hZGRyZXNzKTsKKworICAgICAgICAgIC8qID8/cmVocmF1ZXI6IEknbSBub3Qgc3VyZSBleGFjdGx5IHdoYXQgdGhpcyBpcywgYnV0IGl0IGFwcGVhcnMKKyAgICAgICAgICAgICB0aGF0IG9uIHNvbWUgSFBVWCAxMC54IHZlcnNpb25zLCB0aGVyZSdzIHR3byB1bndpbmQgcmVnaW9ucyB0bworICAgICAgICAgICAgIGNvdmVyIHRoZSBib2R5IG9mICJzaGxfdW5sb2FkIiwgdGhlIHNlY29uZCBiZWluZyA0IGJ5dGVzIHBhc3QKKyAgICAgICAgICAgICB0aGUgZW5kIG9mIHRoZSBmaXJzdC4gIFRoaXMgaXMgYSBsYXJnZSBoYWNrIHRvIGhhbmRsZSB0aGF0CisgICAgICAgICAgICAgY2FzZSwgYnV0IHNpbmNlIEkgZG9uJ3Qgc2VlbSB0byBoYXZlIGFueSBsZWdpdGltYXRlIHdheSB0bworICAgICAgICAgICAgIGxvb2sgZm9yIHRoaXMgdGhpbmcgdmlhIHRoZSBzeW1ib2wgdGFibGUuLi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgIGlmIChkbGRfY2FjaGUudW5sb2FkLnVud2luZCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB1ID0gZmluZF91bndpbmRfZW50cnkgKGRsZF9jYWNoZS51bmxvYWQudW53aW5kLT5yZWdpb25fZW5kICsgNCk7CisgICAgICAgICAgICAgIGlmICh1ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZGxkX2NhY2hlLnVubG9hZDIuYWRkcmVzcyA9IHUtPnJlZ2lvbl9zdGFydDsKKyAgICAgICAgICAgICAgICAgIGRsZF9jYWNoZS51bmxvYWQyLnVud2luZCA9IHU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGRsZF9tc3ltYm9sID0gbG9va3VwX21pbmltYWxfc3ltYm9sX3NvbGliX3RyYW1wb2xpbmUgKCJzaGxfdW5sb2FkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpmaWxlKTsKKyAgICAgIGlmIChkbGRfbXN5bWJvbCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKFNZTUJPTF9UWVBFIChkbGRfbXN5bWJvbCkgPT0gbXN0X3NvbGliX3RyYW1wb2xpbmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHUgPSBmaW5kX3Vud2luZF9lbnRyeSAoU1lNQk9MX1ZBTFVFIChkbGRfbXN5bWJvbCkpOworICAgICAgICAgICAgICBpZiAoKHUgIT0gTlVMTCkgJiYgKHUtPnN0dWJfdW53aW5kLnN0dWJfdHlwZSA9PSBFWFBPUlQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGRsZF9jYWNoZS51bmxvYWRfc3R1Yi5hZGRyZXNzID0gU1lNQk9MX1ZBTFVFIChkbGRfbXN5bWJvbCk7CisgICAgICAgICAgICAgICAgICBkbGRfY2FjaGUudW5sb2FkX3N0dWIudW53aW5kID0gdTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgLyogRGlkIHdlIGZpbmQgZXZlcnl0aGluZyB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgc28sIHN0b3AuICovCisgICAgICBpZiAoKGRsZF9jYWNoZS5sb2FkLmFkZHJlc3MgIT0gTlVMTCkgJiYgKGRsZF9jYWNoZS5sb2FkX3N0dWIuYWRkcmVzcyAhPSBOVUxMKQorICAgICAgICAgICYmIChkbGRfY2FjaGUudW5sb2FkLmFkZHJlc3MgIT0gTlVMTCkgJiYgKGRsZF9jYWNoZS51bmxvYWRfc3R1Yi5hZGRyZXNzICE9IE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgZGxkX2NhY2hlLmlzX3ZhbGlkID0gMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICBkbGRfY2FjaGUuaG9vay51bndpbmQgPSBmaW5kX3Vud2luZF9lbnRyeSAoZGxkX2NhY2hlLmhvb2suYWRkcmVzcyk7CisgIGRsZF9jYWNoZS5ob29rX3N0dWIudW53aW5kID0gZmluZF91bndpbmRfZW50cnkgKGRsZF9jYWNoZS5ob29rX3N0dWIuYWRkcmVzcyk7CisKKyAgLyogV2UncmUgcHJlcGFyZWQgbm90IHRvIGZpbmQgc29tZSBvZiB0aGVzZSBzeW1ib2xzLCB3aGljaCBpcyB3aHkKKyAgICAgdGhpcyBmdW5jdGlvbiBpcyBhICJkZXNpcmUiIG9wZXJhdGlvbiwgYW5kIG5vdCBhICJyZXF1aXJlIi4KKyAgICAgKi8KK30KKworaW50Citzb21fc29saWJfaW5fZHluYW1pY19saW5rZXIgKHBpZCwgcGMpCisgIGludCAgcGlkOworICBDT1JFX0FERFIgIHBjOworeworICBzdHJ1Y3QgdW53aW5kX3RhYmxlX2VudHJ5ICogIHVfcGM7CisKKyAgLyogQXJlIHdlIGluIHRoZSBkbGQgaXRzZWxmPworCisgICAgID8/cmVocmF1ZXI6IExhcmdlIGhhY2sgLS0gV2UnbGwgYXNzdW1lIHRoYXQgYW55IGFkZHJlc3MgaW4gYQorICAgICBzaGFyZWQgdGV4dCByZWdpb24gaXMgdGhlIGRsZCdzIHRleHQuICBUaGlzIHdvdWxkIG9idmlvdXNseQorICAgICBmYWxsIGRvd24gaWYgdGhlIHVzZXIgYXR0YWNoZWQgdG8gYSBwcm9jZXNzLCB3aG9zZSBzaGxpYnMKKyAgICAgd2VyZW4ndCBtYXBwZWQgdG8gYSAod3JpdGVhYmxlKSBwcml2YXRlIHJlZ2lvbi4gIEhvd2V2ZXIsIGluCisgICAgIHRoYXQgY2FzZSB0aGUgZGVidWdnZXIgcHJvYmFibHkgaXNuJ3QgYWJsZSB0byBzZXQgdGhlIGZ1bmRhbWVudGFsCisgICAgIGJyZWFrcG9pbnQgaW4gdGhlIGRsZCBjYWxsYmFjayBhbnl3YXlzLCBzbyB0aGlzIGhhY2sgc2hvdWxkIGJlCisgICAgIHNhZmUuCisgICAgICovCisgIGlmICgocGMgJiAoQ09SRV9BRERSKSAweGMwMDAwMDAwKSA9PSAoQ09SRV9BRERSKSAweGMwMDAwMDAwKQorICAgIHJldHVybiAxOworCisgIC8qIENhY2hlIHRoZSBhZGRyZXNzIG9mIHNvbWUgc3ltYm9scyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBkeW5hbWljCisgICAgIGxpbmtlciwgaWYgbm90IGFscmVhZHkga25vd24uCisgICAgICovCisgIHNvbV9zb2xpYl9kZXNpcmVfZHluYW1pY19saW5rZXJfc3ltYm9scyAoKTsKKworICAvKiBBcmUgd2UgaW4gdGhlIGRsZCBjYWxsYmFjaz8gIE9yIGl0cyBleHBvcnQgc3R1Yj8gKi8KKyAgdV9wYyA9IGZpbmRfdW53aW5kX2VudHJ5IChwYyk7CisgIGlmICh1X3BjID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCh1X3BjID09IGRsZF9jYWNoZS5ob29rLnVud2luZCkgfHwgKHVfcGMgPT0gZGxkX2NhY2hlLmhvb2tfc3R1Yi51bndpbmQpKQorICAgIHJldHVybiAxOworCisgIC8qIE9yIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIGRsZCAoaS5lLiwgInNobF9sb2FkIiBvciBmcmllbmRzKT8gKi8KKyAgaWYgKCh1X3BjID09IGRsZF9jYWNoZS5sb2FkLnVud2luZCkKKyAgICAgIHx8ICh1X3BjID09IGRsZF9jYWNoZS51bmxvYWQudW53aW5kKQorICAgICAgfHwgKHVfcGMgPT0gZGxkX2NhY2hlLnVubG9hZDIudW53aW5kKQorICAgICAgfHwgKHVfcGMgPT0gZGxkX2NhY2hlLmxvYWRfc3R1Yi51bndpbmQpCisgICAgICB8fCAodV9wYyA9PSBkbGRfY2FjaGUudW5sb2FkX3N0dWIudW53aW5kKSkKKyAgICByZXR1cm4gMTsKKworICAvKiBBcHBhcmVudGx5IHRoaXMgYWRkcmVzcyBpc24ndCBwYXJ0IG9mIHRoZSBkbGQncyB0ZXh0LiAqLworICByZXR1cm4gMDsKK30KKworCisvKiBSZXR1cm4gdGhlIEdPVCB2YWx1ZSBmb3IgdGhlIHNoYXJlZCBsaWJyYXJ5IGluIHdoaWNoIEFERFIgYmVsb25ncy4gIElmCisgICBBRERSIGlzbid0IGluIGFueSBrbm93biBzaGFyZWQgbGlicmFyeSwgcmV0dXJuIHplcm8uICAqLworCitDT1JFX0FERFIKK3NvbV9zb2xpYl9nZXRfZ290X2J5X3BjIChhZGRyKQorICAgICBDT1JFX0FERFIgYWRkcjsKK3sKKyAgc3RydWN0IHNvX2xpc3QgKnNvX2xpc3QgPSBzb19saXN0X2hlYWQ7CisgIENPUkVfQUREUiBnb3RfdmFsdWUgPSAwOworCisgIHdoaWxlIChzb19saXN0KQorICAgIHsKKyAgICAgIGlmIChzb19saXN0LT5zb21fc29saWIudGV4dF9hZGRyIDw9IGFkZHIKKwkgICYmIHNvX2xpc3QtPnNvbV9zb2xpYi50ZXh0X2VuZCA+IGFkZHIpCisJeworCSAgZ290X3ZhbHVlID0gc29fbGlzdC0+c29tX3NvbGliLmdvdF92YWx1ZTsKKwkgIGJyZWFrOworCX0KKyAgICAgIHNvX2xpc3QgPSBzb19saXN0LT5uZXh0OworICAgIH0KKyAgcmV0dXJuIGdvdF92YWx1ZTsKK30KKworLyogIGVsejoKKyAgIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgaGFuZGxlIG9mIHRoZSBzaGFyZWQgbGlicmFyeQorICAgaW4gd2hpY2ggQUREUiBiZWxvbmdzLiAgSWYKKyAgIEFERFIgaXNuJ3QgaW4gYW55IGtub3duIHNoYXJlZCBsaWJyYXJ5LCByZXR1cm4gemVyby4gICovCisvKiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gaHBwYV9maXhfY2FsbF9kdW1teSBpbiBocHBhLXRkZXAuYyovCisKK0NPUkVfQUREUgorc29tX3NvbGliX2dldF9zb2xpYl9ieV9wYyAoYWRkcikKKyAgICAgQ09SRV9BRERSIGFkZHI7Cit7CisgIHN0cnVjdCBzb19saXN0ICpzb19saXN0ID0gc29fbGlzdF9oZWFkOworCisgIHdoaWxlIChzb19saXN0KQorICAgIHsKKyAgICAgIGlmIChzb19saXN0LT5zb21fc29saWIudGV4dF9hZGRyIDw9IGFkZHIKKwkgICYmIHNvX2xpc3QtPnNvbV9zb2xpYi50ZXh0X2VuZCA+IGFkZHIpCisgICAgICAgIHsKKwkgIGJyZWFrOworICAgICAgICB9CisgICAgICBzb19saXN0ID0gc29fbGlzdC0+bmV4dDsKKyAgICB9CisgIGlmIChzb19saXN0KQorICAgcmV0dXJuIHNvX2xpc3QtPnNvbGliX2FkZHI7CisgIGVsc2UKKyAgIHJldHVybiAwOworfQorCisKK2ludAorc29tX3NvbGliX3NlY3Rpb25fb2Zmc2V0cyAob2JqZmlsZSwgb2Zmc2V0cykKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKm9mZnNldHM7Cit7CisgIHN0cnVjdCBzb19saXN0ICpzb19saXN0ID0gc29fbGlzdF9oZWFkOworCisgIHdoaWxlIChzb19saXN0KQorICAgIHsKKyAgICAgIC8qIE9oIHdoYXQgYSBwYWluISAgV2UgbmVlZCB0aGUgb2Zmc2V0cyBiZWZvcmUgc29fbGlzdC0+b2JqZmlsZQorCSBpcyB2YWxpZC4gIFRoZSBCRkRzIHdpbGwgbmV2ZXIgbWF0Y2guICBNYWtlIGEgYmVzdCBndWVzcy4gICovCisgICAgICBpZiAoc3Ryc3RyIChvYmpmaWxlLT5uYW1lLCBzb19saXN0LT5zb21fc29saWIubmFtZSkpCisJeworCSAgYXNlY3Rpb24gKnByaXZhdGVfc2VjdGlvbjsKKworCSAgLyogVGhlIHRleHQgb2Zmc2V0IGlzIGVhc3kuICAqLworCSAgQU5PRkZTRVQgKG9mZnNldHMsIFNFQ1RfT0ZGX1RFWFQpCisJICAgID0gKHNvX2xpc3QtPnNvbV9zb2xpYi50ZXh0X2FkZHIKKwkgICAgICAgLSBzb19saXN0LT5zb21fc29saWIudGV4dF9saW5rX2FkZHIpOworCSAgQU5PRkZTRVQgKG9mZnNldHMsIFNFQ1RfT0ZGX1JPREFUQSkKKwkgICAgPSBBTk9GRlNFVCAob2Zmc2V0cywgU0VDVF9PRkZfVEVYVCk7CisKKwkgIC8qIFdlIHNob3VsZCBsb29rIGF0IHByZXN1bWVkX2RwIGluIHRoZSBTT00gaGVhZGVyLCBidXQKKwkgICAgIHRoYXQncyBub3QgZWFzaWx5IGF2YWlsYWJsZS4gIFRoaXMgc2hvdWxkIGJlIE9LIHRob3VnaC4gICovCisJICBwcml2YXRlX3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob2JqZmlsZS0+b2JmZCwKKwkJCQkJCSAgICAgIiRQUklWQVRFJCIpOworCSAgaWYgKCFwcml2YXRlX3NlY3Rpb24pCisJICAgIHsKKwkgICAgICB3YXJuaW5nICgiVW5hYmxlIHRvIGZpbmQgJFBSSVZBVEUkIGluIHNoYXJlZCBsaWJyYXJ5ISIpOworCSAgICAgIEFOT0ZGU0VUIChvZmZzZXRzLCBTRUNUX09GRl9EQVRBKSA9IDA7CisJICAgICAgQU5PRkZTRVQgKG9mZnNldHMsIFNFQ1RfT0ZGX0JTUykgPSAwOworCSAgICAgIHJldHVybiAxOworCSAgICB9CisJICBBTk9GRlNFVCAob2Zmc2V0cywgU0VDVF9PRkZfREFUQSkKKwkgICAgPSAoc29fbGlzdC0+c29tX3NvbGliLmRhdGFfc3RhcnQgLSBwcml2YXRlX3NlY3Rpb24tPnZtYSk7CisJICBBTk9GRlNFVCAob2Zmc2V0cywgU0VDVF9PRkZfQlNTKQorCSAgICA9IEFOT0ZGU0VUIChvZmZzZXRzLCBTRUNUX09GRl9EQVRBKTsKKwkgIHJldHVybiAxOworCX0KKyAgICAgIHNvX2xpc3QgPSBzb19saXN0LT5uZXh0OworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIER1bXAgaW5mb3JtYXRpb24gYWJvdXQgYWxsIHRoZSBjdXJyZW50bHkgbG9hZGVkIHNoYXJlZCBsaWJyYXJpZXMuICAqLworCitzdGF0aWMgdm9pZAorc29tX3NoYXJlZGxpYnJhcnlfaW5mb19jb21tYW5kIChpZ25vcmUsIGZyb21fdHR5KQorICAgICBjaGFyICppZ25vcmU7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgc3RydWN0IHNvX2xpc3QgKnNvX2xpc3QgPSBzb19saXN0X2hlYWQ7CisKKyAgaWYgKGV4ZWNfYmZkID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJubyBleGVjIGZpbGUuXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHNvX2xpc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIk5vIHNoYXJlZCBsaWJyYXJpZXMgbG9hZGVkIGF0IHRoaXMgdGltZS5cbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBwcmludGZfdW5maWx0ZXJlZCAoIlNoYXJlZCBPYmplY3QgTGlicmFyaWVzXG4iKTsKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCIgICAgJS0xMnMlLTEycyUtMTJzJS0xMnMlLTEycyUtMTJzXG4iLAorCQkgICAgICIgIGZsYWdzIiwgIiAgdHN0YXJ0IiwgIiAgIHRlbmQiLCAiICBkc3RhcnQiLCAiICAgZGVuZCIsICIgICBkbHQiKTsKKyAgd2hpbGUgKHNvX2xpc3QpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGZsYWdzOworCisgICAgICBmbGFncyA9IHNvX2xpc3QtPnNvbV9zb2xpYi5zdHJ1Y3RfdmVyc2lvbiA8PCAyNDsKKyAgICAgIGZsYWdzIHw9IHNvX2xpc3QtPnNvbV9zb2xpYi5iaW5kX21vZGUgPDwgMTY7CisgICAgICBmbGFncyB8PSBzb19saXN0LT5zb21fc29saWIubGlicmFyeV92ZXJzaW9uOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlcyIsIHNvX2xpc3QtPnNvbV9zb2xpYi5uYW1lKTsKKyAgICAgIGlmIChzb19saXN0LT5vYmpmaWxlID09IE5VTEwpCisgICAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiICAoc3ltYm9scyBub3QgbG9hZGVkKSIpOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcbiIpOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCIgICAgJS0xMnMiLCBsb2NhbF9oZXhfc3RyaW5nX2N1c3RvbSAoZmxhZ3MsICIwOGwiKSk7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIiUtMTJzIiwKKwkgICAgICBsb2NhbF9oZXhfc3RyaW5nX2N1c3RvbSAoc29fbGlzdC0+c29tX3NvbGliLnRleHRfYWRkciwgIjA4bCIpKTsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiJS0xMnMiLAorCSAgICAgIGxvY2FsX2hleF9zdHJpbmdfY3VzdG9tIChzb19saXN0LT5zb21fc29saWIudGV4dF9lbmQsICIwOGwiKSk7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIiUtMTJzIiwKKwkgICAgICBsb2NhbF9oZXhfc3RyaW5nX2N1c3RvbSAoc29fbGlzdC0+c29tX3NvbGliLmRhdGFfc3RhcnQsICIwOGwiKSk7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIiUtMTJzIiwKKwkgICAgICBsb2NhbF9oZXhfc3RyaW5nX2N1c3RvbSAoc29fbGlzdC0+c29tX3NvbGliLmRhdGFfZW5kLCAiMDhsIikpOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlLTEyc1xuIiwKKwkgICAgICBsb2NhbF9oZXhfc3RyaW5nX2N1c3RvbSAoc29fbGlzdC0+c29tX3NvbGliLmdvdF92YWx1ZSwgIjA4bCIpKTsKKyAgICAgIHNvX2xpc3QgPSBzb19saXN0LT5uZXh0OworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3NvbV9zb2xpYl9zaGFyZWRsaWJyYXJ5X2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGRvbnRfcmVwZWF0ICgpOworICBzb21fc29saWJfYWRkIChhcmdzLCBmcm9tX3R0eSwgKHN0cnVjdCB0YXJnZXRfb3BzICopIDApOworfQorCisKKworY2hhciAqCitzb21fc29saWJfYWRkcmVzcyAoYWRkcikKKyAgQ09SRV9BRERSICBhZGRyOworeworICBzdHJ1Y3Qgc29fbGlzdCAqICBzbyA9IHNvX2xpc3RfaGVhZDsKKworICB3aGlsZSAoc28pCisgICAgeworICAgICAgLyogSXMgdGhpcyBhZGRyZXNzIHdpdGhpbiB0aGlzIHNobGliJ3MgdGV4dCByYW5nZT8gIElmIHNvLAorICAgICAgICAgcmV0dXJuIHRoZSBzaGxpYidzIG5hbWUuCisgICAgICAgICAqLworICAgICAgaWYgKChhZGRyID49IHNvLT5zb21fc29saWIudGV4dF9hZGRyKSAmJiAoYWRkciA8PSBzby0+c29tX3NvbGliLnRleHRfZW5kKSkKKyAgICAgICAgcmV0dXJuIHNvLT5zb21fc29saWIubmFtZTsKKworICAgICAgLyogTm9wZSwga2VlcCBsb29raW5nLi4uICovCisgICAgICBzbyA9IHNvLT5uZXh0OworICAgIH0KKworICAvKiBObywgd2UgY291bGRuJ3QgcHJvdmUgdGhhdCB0aGUgYWRkcmVzcyBpcyB3aXRoaW4gYSBzaGxpYi4gKi8KKyAgcmV0dXJuIE5VTEw7Cit9CisKKwordm9pZAorc29tX3NvbGliX3Jlc3RhcnQgKCkKK3sKKyAgc3RydWN0IHNvX2xpc3QgKiAgc2wgPSBzb19saXN0X2hlYWQ7CisKKyAgLyogQmVmb3JlIHRoZSBzaGxpYiBpbmZvIHZhbmlzaGVzLCB1c2UgaXQgdG8gZGlzYWJsZSBhbnkgYnJlYWtwb2ludHMKKyAgICAgdGhhdCBtYXkgc3RpbGwgYmUgYWN0aXZlIGluIHRob3NlIHNobGlicy4KKyAgICAgKi8KKyAgZGlzYWJsZV9icmVha3BvaW50c19pbl9zaGxpYnMgKDApOworCisgIC8qIERpc2NhcmQgYWxsIHRoZSBzaGxpYiBkZXNjcmlwdG9ycy4KKyAgICAgKi8KKyAgd2hpbGUgKHNsKQorICAgIHsKKyAgICAgIHN0cnVjdCBzb19saXN0ICogIG5leHRfc2wgPSBzbC0+bmV4dDsKKyAgICAgIGZyZWUgKHNsKTsKKyAgICAgIHNsID0gbmV4dF9zbDsKKyAgICB9CisgIHNvX2xpc3RfaGVhZCA9IE5VTEw7CisKKyAgc29tX3NvbGliX3RvdGFsX3N0X3NpemUgPSAoTE9OR0VTVCkgMDsKKyAgc29tX3NvbGliX3N0X3NpemVfdGhyZXNob2xkX2V4Y2VlZGVkID0gMDsKKworICBkbGRfY2FjaGUuaXNfdmFsaWQgPSAwOworCisgIGRsZF9jYWNoZS5ob29rLmFkZHJlc3MgPSAwOworICBkbGRfY2FjaGUuaG9vay51bndpbmQgPSBOVUxMOworCisgIGRsZF9jYWNoZS5ob29rX3N0dWIuYWRkcmVzcyA9IDA7CisgIGRsZF9jYWNoZS5ob29rX3N0dWIudW53aW5kID0gTlVMTDsKKworICBkbGRfY2FjaGUubG9hZC5hZGRyZXNzID0gMDsKKyAgZGxkX2NhY2hlLmxvYWQudW53aW5kID0gTlVMTDsKKworICBkbGRfY2FjaGUubG9hZF9zdHViLmFkZHJlc3MgPSAwOworICBkbGRfY2FjaGUubG9hZF9zdHViLnVud2luZCA9IE5VTEw7CisKKyAgZGxkX2NhY2hlLnVubG9hZC5hZGRyZXNzID0gMDsKKyAgZGxkX2NhY2hlLnVubG9hZC51bndpbmQgPSBOVUxMOworCisgIGRsZF9jYWNoZS51bmxvYWQyLmFkZHJlc3MgPSAwOworICBkbGRfY2FjaGUudW5sb2FkMi51bndpbmQgPSBOVUxMOworCisgIGRsZF9jYWNoZS51bmxvYWRfc3R1Yi5hZGRyZXNzID0gMDsKKyAgZGxkX2NhY2hlLnVubG9hZF9zdHViLnVud2luZCA9IE5VTEw7Cit9CisKKworCit2b2lkCitfaW5pdGlhbGl6ZV9zb21fc29saWIgKCkKK3sKKyAgYWRkX2NvbSAoInNoYXJlZGxpYnJhcnkiLCBjbGFzc19maWxlcywgc29tX3NvbGliX3NoYXJlZGxpYnJhcnlfY29tbWFuZCwKKyAgICAgICAgICAgIkxvYWQgc2hhcmVkIG9iamVjdCBsaWJyYXJ5IHN5bWJvbHMgZm9yIGZpbGVzIG1hdGNoaW5nIFJFR0VYUC4iKTsKKyAgYWRkX2luZm8gKCJzaGFyZWRsaWJyYXJ5Iiwgc29tX3NoYXJlZGxpYnJhcnlfaW5mb19jb21tYW5kLAorCSAgICAiU3RhdHVzIG9mIGxvYWRlZCBzaGFyZWQgb2JqZWN0IGxpYnJhcmllcy4iKTsKKyAgYWRkX3Nob3dfZnJvbV9zZXQKKyAgICAoYWRkX3NldF9jbWQgKCJhdXRvLXNvbGliLWFkZCIsIGNsYXNzX3N1cHBvcnQsIHZhcl96aW50ZWdlciwKKwkJICAoY2hhciAqKSAmYXV0b19zb2xpYl9hZGQsCisJCSAgIlNldCBhdXRvbG9hZGluZyBzaXplIHRocmVzaG9sZCAoaW4gbWVnYWJ5dGVzKSBvZiBzaGFyZWQgbGlicmFyeSBzeW1ib2xzLlxuXAorSWYgbm9uemVybywgc3ltYm9scyBmcm9tIGFsbCBzaGFyZWQgb2JqZWN0IGxpYnJhcmllcyB3aWxsIGJlIGxvYWRlZFxuXAorYXV0b21hdGljYWxseSB3aGVuIHRoZSBpbmZlcmlvciBiZWdpbnMgZXhlY3V0aW9uIG9yIHdoZW4gdGhlIGR5bmFtaWMgbGlua2VyXG5cCitpbmZvcm1zIGdkYiB0aGF0IGEgbmV3IGxpYnJhcnkgaGFzIGJlZW4gbG9hZGVkLCB1bnRpbCB0aGUgc3ltYm9sIHRhYmxlXG5cCitvZiB0aGUgcHJvZ3JhbSBhbmQgbGlicmFyaWVzIGV4Y2VlZHMgdGhpcyB0aHJlc2hvbGQuXG5cCitPdGhlcndpc2UsIHN5bWJvbHMgbXVzdCBiZSBsb2FkZWQgbWFudWFsbHksIHVzaW5nIGBzaGFyZWRsaWJyYXJ5Jy4iLAorCQkgICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKKworICAvKiA/P3JlaHJhdWVyOiBPbiBIUC1VWCwgdGhlIGtlcm5lbCBwYXJhbWV0ZXIgTUFYRFNJWiBsaW1pdHMgaG93IG11Y2gKKyAgICAgZGF0YSBzcGFjZSBhIHByb2Nlc3MgY2FuIHVzZS4gIFdlIG91Z2h0IHRvIGJlIHJlYWRpbmcgTUFYRFNJWiBhbmQKKyAgICAgc2V0dGluZyBhdXRvX3NvbGliX2FkZCB0byBzb21lIGxhcmdlIGZyYWN0aW9uIG9mIHRoYXQgdmFsdWUuICBJZgorICAgICBub3QgdGhhdCwgd2UgbWF5YmUgb3VnaHQgdG8gYmUgc2V0dGluZyBpdCBzbWFsbGVyIHRoYW4gdGhlIGRlZmF1bHQKKyAgICAgZm9yIE1BWERTSVogKHRoYXQgYmVpbmcgNjRNYiwgSSBiZWxpZXZlKS4gIEhvd2V2ZXIsIFsxXSB0aGlzIHRocmVzaG9sZAorICAgICBpcyBvbmx5IGNydWRlbHkgYXBwcm94aW1hdGVkIHJhdGhlciB0aGFuIGFjdHVhbGx5IG1lYXN1cmVkLCBhbmQgWzJdCisgICAgIDUwIE1ieXRlcyBpcyB0b28gc21hbGwgZm9yIGRlYnVnZ2luZyBnZGIgaXRzZWxmLiAgVGh1cywgdGhlIGFyYml0cmFyeQorICAgICAxMDAgZmlndXJlLgorICAgICAqLworICBhdXRvX3NvbGliX2FkZCA9IDEwMDsgLyogTWVnYWJ5dGVzICovCisKKyAgc29tX3NvbGliX3Jlc3RhcnQgKCk7Cit9CisKKy8qIEdldCBzb21lIEhQVVgtc3BlY2lmaWMgZGF0YSBmcm9tIGEgc2hhcmVkIGxpYi4KKyAqLworQ09SRV9BRERSCitzb19saWJfdGhyZWFkX3N0YXJ0X2FkZHIoIHNvICkKKyAgICBzdHJ1Y3Qgc29fbGlzdCAqc287Cit7CisgICAgcmV0dXJuIHNvLT5zb21fc29saWIudHNkX3N0YXJ0X2FkZHI7Cit9CmRpZmYgLS1naXQgYS9nZGIvc29tc29saWIuaCBiL2dkYi9zb21zb2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NjkxNjkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvc29tc29saWIuaApAQCAtMCwwICsxLDE3NyBAQAorLyogSFAgU09NIFNoYXJlZCBsaWJyYXJ5IGRlY2xhcmF0aW9ucyBmb3IgR0RCLCB0aGUgR05VIERlYnVnZ2VyLgorICAgQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJpdHkgb2YgVXRhaAorYW5kIGJ5IEN5Z251cyBTdXBwb3J0LiAgKi8KKworI2lmZGVmIF9fU1REQ19fCQkvKiBGb3J3YXJkIGRlY2wncyBmb3IgcHJvdG90eXBlcyAqLworc3RydWN0IHRhcmdldF9vcHM7CitzdHJ1Y3Qgb2JqZmlsZTsKK3N0cnVjdCBzZWN0aW9uX29mZnNldHM7CisjZW5kaWYKKworLyogQ2FsbGVkIHRvIGFkZCBzeW1ib2xzIGZyb20gYSBzaGFyZWQgbGlicmFyeSB0byBnZGIncyBzeW1ib2wgdGFibGUuICovCisKKyNkZWZpbmUgU09MSUJfQUREKGZpbGVuYW1lLCBmcm9tX3R0eSwgdGFyZykgXAorICAgIHNvbV9zb2xpYl9hZGQgKGZpbGVuYW1lLCBmcm9tX3R0eSwgdGFyZykKKworZXh0ZXJuIHZvaWQKK3NvbV9zb2xpYl9hZGQgUEFSQU1TICgoY2hhciAqLCBpbnQsIHN0cnVjdCB0YXJnZXRfb3BzICopKTsKKworZXh0ZXJuIENPUkVfQUREUgorc29tX3NvbGliX2dldF9nb3RfYnlfcGMgUEFSQU1TICgoQ09SRV9BRERSKSk7CisKK2V4dGVybiBpbnQKK3NvbV9zb2xpYl9zZWN0aW9uX29mZnNldHMgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqKSk7CisKKy8qIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBpbmZlcmlvciBzdGFydHMgdXAsIHRvIGRpc2NvdmVyIHRoZSBuYW1lcworICAgb2Ygc2hhcmVkIGxpYnJhcmllcyB0aGF0IGFyZSBkeW5hbWljYWxseSBsaW5rZWQsIHRoZSBiYXNlIGFkZHJlc3NlcyB0bworICAgd2hpY2ggdGhleSBhcmUgbGlua2VkLCBhbmQgc3VmZmljaWVudCBpbmZvcm1hdGlvbiB0byByZWFkIGluIHRoZWlyIHN5bWJvbHMKKyAgIGF0IGEgbGF0ZXIgdGltZS4gKi8KKworI2RlZmluZSBTT0xJQl9DUkVBVEVfSU5GRVJJT1JfSE9PSyhQSUQpCXNvbV9zb2xpYl9jcmVhdGVfaW5mZXJpb3JfaG9vaygpCisKK2V4dGVybiB2b2lkCitzb21fc29saWJfY3JlYXRlX2luZmVyaW9yX2hvb2sgUEFSQU1TKCh2b2lkKSk7CisKKy8qIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byByZW1vdmUgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiBkZWJ1Z2dlciBhbmQKKyAgIGR5bmFtaWMgbGlua2VyIHRoYXQgd2FzIGVzdGFibGlzaGVkIGJ5IFNPTElCX0NSRUFURV9JTkZFUklPUl9IT09LLgorICAgKFRoaXMgb3BlcmF0aW9uIGRvZXMgbm90IHJlbW92ZSBzaGFyZWQgbGlicmFyeSBpbmZvcm1hdGlvbiBmcm9tCisgICB0aGUgZGVidWdnZXIsIGFzIENMRUFSX1NPTElCIGRvZXMuKQorICAgKi8KKyNkZWZpbmUgU09MSUJfUkVNT1ZFX0lORkVSSU9SX0hPT0soUElEKSBzb21fc29saWJfcmVtb3ZlX2luZmVyaW9yX2hvb2soUElEKQorCitleHRlcm4gdm9pZAorc29tX3NvbGliX3JlbW92ZV9pbmZlcmlvcl9ob29rIFBBUkFNUygoaW50KSk7CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSAiY2F0Y2ggbG9hZCIgY29tbWFuZC4gIEl0IGFsbG93cworICAgdGhlIGRlYnVnZ2VyIHRvIGJlIG5vdGlmaWVkIGJ5IHRoZSBkeW5hbWljIGxpbmtlciB3aGVuIGEgc3BlY2lmaWVkCisgICBsaWJyYXJ5IGZpbGUgKG9yIGFueSBsaWJyYXJ5IGZpbGUsIGlmIGZpbGVuYW1lIGlzIE5VTEwpIGlzIGxvYWRlZC4KKyAgICovCisjZGVmaW5lIFNPTElCX0NSRUFURV9DQVRDSF9MT0FEX0hPT0socGlkLHRlbXBmbGFnLCBmaWxlbmFtZSxjb25kX3N0cmluZykgXAorICAgc29tX3NvbGliX2NyZWF0ZV9jYXRjaF9sb2FkX2hvb2sgKHBpZCwgdGVtcGZsYWcsIGZpbGVuYW1lLCBjb25kX3N0cmluZykKKworZXh0ZXJuIHZvaWQKK3NvbV9zb2xpYl9jcmVhdGVfY2F0Y2hfbG9hZF9ob29rIFBBUkFNUygoaW50LCBpbnQsIGNoYXIgKiwgY2hhciAqKSk7CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSAiY2F0Y2ggdW5sb2FkIiBjb21tYW5kLiAgSXQgYWxsb3dzCisgICB0aGUgZGVidWdnZXIgdG8gYmUgbm90aWZpZWQgYnkgdGhlIGR5bmFtaWMgbGlua2VyIHdoZW4gYSBzcGVjaWZpZWQKKyAgIGxpYnJhcnkgZmlsZSAob3IgYW55IGxpYnJhcnkgZmlsZSwgaWYgZmlsZW5hbWUgaXMgTlVMTCkgaXMgdW5sb2FkZWQuCisgICAqLworI2RlZmluZSBTT0xJQl9DUkVBVEVfQ0FUQ0hfVU5MT0FEX0hPT0socGlkLHRlbXBmbGFnLGZpbGVuYW1lLCBjb25kX3N0cmluZykgXAorICAgc29tX3NvbGliX2NyZWF0ZV9jYXRjaF91bmxvYWRfaG9vayAocGlkLCB0ZW1wZmxhZywgZmlsZW5hbWUsIGNvbmRfc3RyaW5nKQorCitleHRlcm4gdm9pZAorc29tX3NvbGliX2NyZWF0ZV9jYXRjaF91bmxvYWRfaG9vayBQQVJBTVMoKGludCwgaW50LCBjaGFyICosIGNoYXIgKikpOworCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgVFJVRSBpZiB0aGUgZHluYW1pYyBsaW5rZXIgaGFzIGp1c3QgcmVwb3J0ZWQKKyAgIGEgbG9hZCBvZiBhIGxpYnJhcnkuCisKKyAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgaW5mZXJpb3IgaGFzIHN0b3BwZWQgaW4KKyAgIHRoZSBkeW5hbWljIGxpbmtlciBob29rLCBvciB1bmRlZmluZWQgcmVzdWx0cyBhcmUgZ3VhcmFudGVlZC4KKyAgICovCisjZGVmaW5lIFNPTElCX0hBVkVfTE9BRF9FVkVOVChwaWQpIFwKKyAgIHNvbV9zb2xpYl9oYXZlX2xvYWRfZXZlbnQgKHBpZCkKKworZXh0ZXJuIGludAorc29tX3NvbGliX2hhdmVfbG9hZF9ldmVudCBQQVJBTVMoKGludCkpOworCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgICBwYXRobmFtZSBvZiB0aGUgZHluYW1pY2FsbHktbGlua2VkIGxpYnJhcnkgdGhhdCBoYXMganVzdCBiZWVuIGxvYWRlZC4KKworICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIFNPTElCX0hBVkVfTE9BRF9FVkVOVCBpcyBUUlVFLAorICAgb3IgdW5kZWZpbmVkIHJlc3VsdHMgYXJlIGd1YXJhbnRlZWQuCisKKyAgIFRoaXMgc3RyaW5nJ3MgY29udGVudHMgYXJlIG9ubHkgdmFsaWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGluZmVyaW9yCisgICBoYXMgc3RvcHBlZCBpbiB0aGUgZHluYW1pYyBsaW5rZXIgaG9vaywgYW5kIGJlY29tZXMgaW52YWxpZCBhcyBzb29uCisgICBhcyB0aGUgaW5mZXJpb3IgaXMgY29udGludWVkLiAgQ2xpZW50cyBzaG91bGQgbWFrZSBhIGNvcHkgb2YgdGhpcworICAgc3RyaW5nIGlmIHRoZXkgd2lzaCB0byBjb250aW51ZSB0aGUgaW5mZXJpb3IgYW5kIHRoZW4gYWNjZXNzIHRoZSBzdHJpbmcuCisgICAqLworI2RlZmluZSBTT0xJQl9MT0FERURfTElCUkFSWV9QQVRITkFNRShwaWQpIFwKKyAgIHNvbV9zb2xpYl9sb2FkZWRfbGlicmFyeV9wYXRobmFtZSAocGlkKQorCitleHRlcm4gY2hhciAqCitzb21fc29saWJfbG9hZGVkX2xpYnJhcnlfcGF0aG5hbWUgUEFSQU1TKChpbnQpKTsKKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIFRSVUUgaWYgdGhlIGR5bmFtaWMgbGlua2VyIGhhcyBqdXN0IHJlcG9ydGVkCisgICBhbiB1bmxvYWQgb2YgYSBsaWJyYXJ5LgorCisgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCBvbmx5IHdoZW4gdGhlIGluZmVyaW9yIGhhcyBzdG9wcGVkIGluCisgICB0aGUgZHluYW1pYyBsaW5rZXIgaG9vaywgb3IgdW5kZWZpbmVkIHJlc3VsdHMgYXJlIGd1YXJhbnRlZWQuCisgICAqLworI2RlZmluZSBTT0xJQl9IQVZFX1VOTE9BRF9FVkVOVChwaWQpIFwKKyAgIHNvbV9zb2xpYl9oYXZlX3VubG9hZF9ldmVudCAocGlkKQorCitleHRlcm4gaW50Citzb21fc29saWJfaGF2ZV91bmxvYWRfZXZlbnQgUEFSQU1TKChpbnQpKTsKKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgcGF0aG5hbWUgb2YgdGhlIGR5bmFtaWNhbGx5LWxpbmtlZCBsaWJyYXJ5IHRoYXQgaGFzIGp1c3QgYmVlbiB1bmxvYWRlZC4KKworICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgb25seSB3aGVuIFNPTElCX0hBVkVfVU5MT0FEX0VWRU5UIGlzIFRSVUUsCisgICBvciB1bmRlZmluZWQgcmVzdWx0cyBhcmUgZ3VhcmFudGVlZC4KKworICAgVGhpcyBzdHJpbmcncyBjb250ZW50cyBhcmUgb25seSB2YWxpZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgaW5mZXJpb3IKKyAgIGhhcyBzdG9wcGVkIGluIHRoZSBkeW5hbWljIGxpbmtlciBob29rLCBhbmQgYmVjb21lcyBpbnZhbGlkIGFzIHNvb24KKyAgIGFzIHRoZSBpbmZlcmlvciBpcyBjb250aW51ZWQuICBDbGllbnRzIHNob3VsZCBtYWtlIGEgY29weSBvZiB0aGlzCisgICBzdHJpbmcgaWYgdGhleSB3aXNoIHRvIGNvbnRpbnVlIHRoZSBpbmZlcmlvciBhbmQgdGhlbiBhY2Nlc3MgdGhlIHN0cmluZy4KKyAgICovCisjZGVmaW5lIFNPTElCX1VOTE9BREVEX0xJQlJBUllfUEFUSE5BTUUocGlkKSBcCisgICBzb21fc29saWJfdW5sb2FkZWRfbGlicmFyeV9wYXRobmFtZSAocGlkKQorCitleHRlcm4gY2hhciAqCitzb21fc29saWJfdW5sb2FkZWRfbGlicmFyeV9wYXRobmFtZSBQQVJBTVMoKGludCkpOworCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgVFJVRSBpZiBwYyBpcyB0aGUgYWRkcmVzcyBvZiBhbiBpbnN0cnVjdGlvbiB0aGF0CisgICBsaWVzIHdpdGhpbiB0aGUgZHluYW1pYyBsaW5rZXIgKHN1Y2ggYXMgdGhlIGV2ZW50IGhvb2ssIG9yIHRoZSBkbGQKKyAgIGl0c2VsZikuCisKKyAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIG9ubHkgd2hlbiBhIGR5bmFtaWMgbGlua2VyIGV2ZW50IGhhcyBiZWVuCisgICBjYXVnaHQsIGFuZCB0aGUgaW5mZXJpb3IgaXMgYmVpbmcgc3RlcHBlZCBvdXQgb2YgdGhlIGhvb2ssIG9yIHVuZGVmaW5lZAorICAgcmVzdWx0cyBhcmUgZ3VhcmFudGVlZC4KKyAgICovCisjZGVmaW5lIFNPTElCX0lOX0RZTkFNSUNfTElOS0VSKHBpZCxwYykgXAorICAgc29tX3NvbGliX2luX2R5bmFtaWNfbGlua2VyIChwaWQsIHBjKQorCitleHRlcm4gaW50Citzb21fc29saWJfaW5fZHluYW1pY19saW5rZXIgUEFSQU1TKChpbnQsIENPUkVfQUREUikpOworCisvKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIGluZmVyaW9yIGlzIGtpbGxlZCwgYW5kIHRoZSBwcm9ncmFtCisgICByZXN0YXJ0ZWQuICBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBDTEVBUl9TT0xJQiwgaW4gdGhhdCBpdCBkb2Vzbid0IGRpc2NhcmQKKyAgIGFueSBzeW1ib2wgdGFibGVzLgorCisgICBQcmVzZW50bHksIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAqLworI2RlZmluZSBTT0xJQl9SRVNUQVJUKCkgXAorICAgc29tX3NvbGliX3Jlc3RhcnQgKCkKKworZXh0ZXJuIHZvaWQKK3NvbV9zb2xpYl9yZXN0YXJ0IFBBUkFNUygodm9pZCkpOworCisvKiBJZiB3ZSBjYW4ndCBzZXQgYSBicmVha3BvaW50LCBhbmQgaXQncyBpbiBhIHNoYXJlZCBsaWJyYXJ5LCBqdXN0CisgICBkaXNhYmxlIGl0LiAgKi8KKworI2RlZmluZSBESVNBQkxFX1VOU0VUVEFCTEVfQlJFQUsoYWRkcikJKHNvbV9zb2xpYl9hZGRyZXNzKGFkZHIpICE9IE5VTEwpCisKK2V4dGVybiBjaGFyICoKK3NvbV9zb2xpYl9hZGRyZXNzIFBBUkFNUyAoKENPUkVfQUREUikpOwkJLyogc29tc29saWIuYyAqLworCisvKiBJZiBBRERSIGxpZXMgaW4gYSBzaGFyZWQgbGlicmFyeSwgcmV0dXJuIGl0cyBuYW1lLiAgKi8KKworI2RlZmluZSBQQ19TT0xJQihhZGRyKQlzb21fc29saWJfYWRkcmVzcyAoYWRkcikKZGlmZiAtLWdpdCBhL2dkYi9zb3VyY2UuYyBiL2dkYi9zb3VyY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmU5NzQyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3NvdXJjZS5jCkBAIC0wLDAgKzEsMTcyNCBAQAorLyogTGlzdCBsaW5lcyBvZiBzb3VyY2UgZmlsZXMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTg2LCA4NywgODgsIDg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJjb21tYW5kLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImdkYl9zdGF0LmgiCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAiZ251LXJlZ2V4LmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgIm9iamZpbGVzLmgiCisjaW5jbHVkZSAiYW5ub3RhdGUuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorCisjaWZkZWYgQ1JMRl9TT1VSQ0VfRklMRVMKKworLyogRGVmaW5lIENSTEZfU09VUkNFX0ZJTEVTIGluIGFuIHhtLSouaCBmaWxlIGlmIHNvdXJjZSBmaWxlcyBvbiB0aGUKKyAgIGhvc3QgdXNlIFxyXG4gcmF0aGVyIHRoYW4ganVzdCBcbi4gIERlZmluaW5nIENSTEZfU09VUkNFX0ZJTEVTIGlzCisgICBtdWNoIGZhc3RlciB0aGFuIGRlZmluaW5nIExTRUVLX05PVF9MSU5FQVIuICAqLworCisjaWZuZGVmIE9fQklOQVJZCisjZGVmaW5lIE9fQklOQVJZIDAKKyNlbmRpZgorCisjZGVmaW5lIE9QRU5fTU9ERSAoT19SRE9OTFkgfCBPX0JJTkFSWSkKKyNkZWZpbmUgRkRPUEVOX01PREUgRk9QRU5fUkIKKworI2Vsc2UgLyogISBkZWZpbmVkIChDUkxGX1NPVVJDRV9GSUxFUykgKi8KKworI2RlZmluZSBPUEVOX01PREUgT19SRE9OTFkKKyNkZWZpbmUgRkRPUEVOX01PREUgRk9QRU5fUlQKKworI2VuZGlmIC8qICEgZGVmaW5lZCAoQ1JMRl9TT1VSQ0VfRklMRVMpICovCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCisKK2ludCBvcGVuX3NvdXJjZV9maWxlIFBBUkFNUyAoKHN0cnVjdCBzeW10YWIgKikpOworCit2b2lkIGZpbmRfc291cmNlX2xpbmVzIFBBUkFNUyAoKHN0cnVjdCBzeW10YWIgKiwgaW50KSk7CisgIAorLyogUHJvdG90eXBlcyBmb3IgZXhwb3J0ZWQgZnVuY3Rpb25zLiAqLworCit2b2lkIF9pbml0aWFsaXplX3NvdXJjZSBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gKi8KKworc3RhdGljIGludCBnZXRfZmlsZW5hbWVfYW5kX2NoYXJwb3MgUEFSQU1TICgoc3RydWN0IHN5bXRhYiAqLCBjaGFyICoqKSk7CisKK3N0YXRpYyB2b2lkIHJldmVyc2Vfc2VhcmNoX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgZm9yd2FyZF9zZWFyY2hfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBsaW5lX2luZm8gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgbGlzdF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGFtYmlndW91c19saW5lX3NwZWMgUEFSQU1TICgoc3RydWN0IHN5bXRhYnNfYW5kX2xpbmVzICopKTsKKworc3RhdGljIHZvaWQgc291cmNlX2luZm8gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgc2hvd19kaXJlY3RvcmllcyBQQVJBTVMgKChjaGFyICosIGludCkpOworCisvKiBQYXRoIG9mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3Igc291cmNlIGZpbGVzLgorICAgU2FtZSBmb3JtYXQgYXMgdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUncyB2YWx1ZS4gICovCisKK2NoYXIgKnNvdXJjZV9wYXRoOworCisvKiBTeW10YWIgb2YgZGVmYXVsdCBmaWxlIGZvciBsaXN0aW5nIGxpbmVzIG9mLiAgKi8KKworc3RydWN0IHN5bXRhYiAqY3VycmVudF9zb3VyY2Vfc3ltdGFiOworCisvKiBEZWZhdWx0IG5leHQgbGluZSB0byBsaXN0LiAgKi8KKworaW50IGN1cnJlbnRfc291cmNlX2xpbmU7CisKKy8qIERlZmF1bHQgbnVtYmVyIG9mIGxpbmVzIHRvIHByaW50IHdpdGggY29tbWFuZHMgbGlrZSAibGlzdCIuCisgICBUaGlzIGlzIGJhc2VkIG9uIGd1ZXNzaW5nIGhvdyBtYW55IGxvbmcgKGkuZS4gbW9yZSB0aGFuIGNoYXJzX3Blcl9saW5lCisgICBjaGFyYWN0ZXJzKSBsaW5lcyB0aGVyZSB3aWxsIGJlLiAgVG8gYmUgY29tcGxldGVseSBjb3JyZWN0LCAibGlzdCIKKyAgIGFuZCBmcmllbmRzIHNob3VsZCBiZSByZXdyaXR0ZW4gdG8gY291bnQgY2hhcmFjdGVycyBhbmQgc2VlIHdoZXJlCisgICB0aGluZ3MgYXJlIHdyYXBwaW5nLCBidXQgdGhhdCB3b3VsZCBiZSBhIGZhaXIgYW1vdW50IG9mIHdvcmsuICAqLworCitpbnQgbGluZXNfdG9fbGlzdCA9IDEwOworCisvKiBMaW5lIG51bWJlciBvZiBsYXN0IGxpbmUgcHJpbnRlZC4gIERlZmF1bHQgZm9yIHZhcmlvdXMgY29tbWFuZHMuCisgICBjdXJyZW50X3NvdXJjZV9saW5lIGlzIHVzdWFsbHksIGJ1dCBub3QgYWx3YXlzLCB0aGUgc2FtZSBhcyB0aGlzLiAgKi8KKworc3RhdGljIGludCBsYXN0X2xpbmVfbGlzdGVkOworCisvKiBGaXJzdCBsaW5lIG51bWJlciBsaXN0ZWQgYnkgbGFzdCBsaXN0aW5nIGNvbW1hbmQuICAqLworCitzdGF0aWMgaW50IGZpcnN0X2xpbmVfbGlzdGVkOworCisvKiBTYXZlcyB0aGUgbmFtZSBvZiB0aGUgbGFzdCBzb3VyY2UgZmlsZSB2aXNpdGVkIGFuZCBhIHBvc3NpYmxlIGVycm9yIGNvZGUuCisgICBVc2VkIHRvIHByZXZlbnQgcmVwZWF0aW5nIGFubm95aW5nICJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3JpZXMiIG1zZ3MgKi8KKworc3RhdGljIHN0cnVjdCBzeW10YWIgKmxhc3Rfc291cmNlX3Zpc2l0ZWQgPSBOVUxMOworc3RhdGljIGludCBsYXN0X3NvdXJjZV9lcnJvciA9IDA7CisKKwwKKy8qIFNldCB0aGUgc291cmNlIGZpbGUgZGVmYXVsdCBmb3IgdGhlICJsaXN0IiBjb21tYW5kIHRvIGJlIFMuCisKKyAgIElmIFMgaXMgTlVMTCwgYW5kIHdlIGRvbid0IGhhdmUgYSBkZWZhdWx0LCBmaW5kIG9uZS4gIFRoaXMKKyAgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGFjdHVhbGx5IHRyaWVzIHRvIHVzZSB0aGUKKyAgIGRlZmF1bHQsIHNpbmNlIHdlIHByb2R1Y2UgYW4gZXJyb3IgaWYgd2UgY2FuJ3QgZmluZCBhIHJlYXNvbmFibGUKKyAgIGRlZmF1bHQuICBBbHNvLCBzaW5jZSB0aGlzIGNhbiBjYXVzZSBzeW1ib2xzIHRvIGJlIHJlYWQsIGRvaW5nIGl0CisgICBiZWZvcmUgd2UgbmVlZCB0byB3b3VsZCBtYWtlIHRoaW5ncyBzbG93ZXIgdGhhbiBuZWNlc3NhcnkuICAqLworCit2b2lkCitzZWxlY3Rfc291cmNlX3N5bXRhYiAocykKKyAgICAgcmVnaXN0ZXIgc3RydWN0IHN5bXRhYiAqczsKK3sKKyAgc3RydWN0IHN5bXRhYnNfYW5kX2xpbmVzIHNhbHM7CisgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOworICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzOworICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKmNzX3BzdCA9IDA7CisgIHN0cnVjdCBvYmpmaWxlICpvZnA7CisgIAorICBpZiAocykKKyAgICB7CisgICAgICBjdXJyZW50X3NvdXJjZV9zeW10YWIgPSBzOworICAgICAgY3VycmVudF9zb3VyY2VfbGluZSA9IDE7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChjdXJyZW50X3NvdXJjZV9zeW10YWIpCisgICAgcmV0dXJuOworCisgIC8qIE1ha2UgdGhlIGRlZmF1bHQgcGxhY2UgdG8gbGlzdCBiZSB0aGUgZnVuY3Rpb24gYG1haW4nCisgICAgIGlmIG9uZSBleGlzdHMuICAqLworICBpZiAobG9va3VwX3N5bWJvbCAoIm1haW4iLCAwLCBWQVJfTkFNRVNQQUNFLCAwLCBOVUxMKSkKKyAgICB7CisgICAgICBzYWxzID0gZGVjb2RlX2xpbmVfc3BlYyAoIm1haW4iLCAxKTsKKyAgICAgIHNhbCA9IHNhbHMuc2Fsc1swXTsKKyAgICAgIGZyZWUgKHNhbHMuc2Fscyk7CisgICAgICBjdXJyZW50X3NvdXJjZV9zeW10YWIgPSBzYWwuc3ltdGFiOworICAgICAgY3VycmVudF9zb3VyY2VfbGluZSA9IG1heCAoc2FsLmxpbmUgLSAobGluZXNfdG9fbGlzdCAtIDEpLCAxKTsKKyAgICAgIGlmIChjdXJyZW50X3NvdXJjZV9zeW10YWIpCisgICAgICAgIHJldHVybjsKKyAgICB9CisgIAorICAvKiBBbGwgcmlnaHQ7IGZpbmQgdGhlIGxhc3QgZmlsZSBpbiB0aGUgc3ltdGFiIGxpc3QgKGlnbm9yaW5nIC5oJ3MpLiAgKi8KKworICBjdXJyZW50X3NvdXJjZV9saW5lID0gMTsKKworICBmb3IgKG9mcCA9IG9iamVjdF9maWxlczsgb2ZwICE9IE5VTEw7IG9mcCA9IG9mcCAtPiBuZXh0KQorICAgIHsKKyAgICAgIGZvciAocyA9IG9mcCAtPiBzeW10YWJzOyBzOyBzID0gcy0+bmV4dCkKKwl7CisJICBjaGFyICpuYW1lID0gcyAtPiBmaWxlbmFtZTsKKwkgIGludCBsZW4gPSBzdHJsZW4gKG5hbWUpOworCSAgaWYgKCEgKGxlbiA+IDIgJiYgKFNUUkVRICgmbmFtZVtsZW4gLSAyXSwgIi5oIikpKSkKKwkgICAgeworCSAgICAgIGN1cnJlbnRfc291cmNlX3N5bXRhYiA9IHM7CisJICAgIH0KKwl9CisgICAgfQorICBpZiAoY3VycmVudF9zb3VyY2Vfc3ltdGFiKQorICAgIHJldHVybjsKKworICAvKiBIb3dhYm91dCB0aGUgcGFydGlhbCBzeW1ib2wgdGFibGVzPyAqLworCisgIGZvciAob2ZwID0gb2JqZWN0X2ZpbGVzOyBvZnAgIT0gTlVMTDsgb2ZwID0gb2ZwIC0+IG5leHQpCisgICAgeworICAgICAgZm9yIChwcyA9IG9mcCAtPiBwc3ltdGFiczsgcHMgIT0gTlVMTDsgcHMgPSBwcyAtPiBuZXh0KQorCXsKKwkgIGNoYXIgKm5hbWUgPSBwcyAtPiBmaWxlbmFtZTsKKwkgIGludCBsZW4gPSBzdHJsZW4gKG5hbWUpOworCSAgaWYgKCEgKGxlbiA+IDIgJiYgKFNUUkVRICgmbmFtZVtsZW4gLSAyXSwgIi5oIikpKSkKKwkgICAgeworCSAgICAgIGNzX3BzdCA9IHBzOworCSAgICB9CisJfQorICAgIH0KKyAgaWYgKGNzX3BzdCkKKyAgICB7CisgICAgICBpZiAoY3NfcHN0IC0+IHJlYWRpbikKKwl7CisJICBmYXRhbCAoIkludGVybmFsOiBzZWxlY3Rfc291cmNlX3N5bXRhYjogcmVhZGluIHBzdCBmb3VuZCBhbmQgbm8gc3ltdGFicy4iKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgY3VycmVudF9zb3VyY2Vfc3ltdGFiID0gUFNZTVRBQl9UT19TWU1UQUIgKGNzX3BzdCk7CisJfQorICAgIH0KKyAgaWYgKGN1cnJlbnRfc291cmNlX3N5bXRhYikKKyAgICByZXR1cm47CisKKyAgZXJyb3IgKCJDYW4ndCBmaW5kIGEgZGVmYXVsdCBzb3VyY2UgZmlsZSIpOworfQorDAorc3RhdGljIHZvaWQKK3Nob3dfZGlyZWN0b3JpZXMgKGlnbm9yZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmlnbm9yZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICBwdXRzX2ZpbHRlcmVkICgiU291cmNlIGRpcmVjdG9yaWVzIHNlYXJjaGVkOiAiKTsKKyAgcHV0c19maWx0ZXJlZCAoc291cmNlX3BhdGgpOworICBwdXRzX2ZpbHRlcmVkICgiXG4iKTsKK30KKworLyogRm9yZ2V0IHdoYXQgd2UgbGVhcm5lZCBhYm91dCBsaW5lIHBvc2l0aW9ucyBpbiBzb3VyY2UgZmlsZXMsIGFuZAorICAgd2hpY2ggZGlyZWN0b3JpZXMgY29udGFpbiB0aGVtOyBtdXN0IGNoZWNrIGFnYWluIG5vdyBzaW5jZSBmaWxlcworICAgbWF5IGJlIGZvdW5kIGluIGEgZGlmZmVyZW50IGRpcmVjdG9yeSBub3cuICAqLworCit2b2lkCitmb3JnZXRfY2FjaGVkX3NvdXJjZV9pbmZvICgpCit7CisgIHJlZ2lzdGVyIHN0cnVjdCBzeW10YWIgKnM7CisgIHJlZ2lzdGVyIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworCisgIGZvciAob2JqZmlsZSA9IG9iamVjdF9maWxlczsgb2JqZmlsZSAhPSBOVUxMOyBvYmpmaWxlID0gb2JqZmlsZSAtPiBuZXh0KQorICAgIHsKKyAgICAgIGZvciAocyA9IG9iamZpbGUgLT4gc3ltdGFiczsgcyAhPSBOVUxMOyBzID0gcyAtPiBuZXh0KQorCXsKKwkgIGlmIChzIC0+IGxpbmVfY2hhcnBvcyAhPSBOVUxMKQorCSAgICB7CisJICAgICAgbWZyZWUgKG9iamZpbGUgLT4gbWQsIHMgLT4gbGluZV9jaGFycG9zKTsKKwkgICAgICBzIC0+IGxpbmVfY2hhcnBvcyA9IE5VTEw7CisJICAgIH0KKwkgIGlmIChzIC0+IGZ1bGxuYW1lICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBtZnJlZSAob2JqZmlsZSAtPiBtZCwgcyAtPiBmdWxsbmFtZSk7CisJICAgICAgcyAtPiBmdWxsbmFtZSA9IE5VTEw7CisJICAgIH0KKwl9CisgICAgfQorfQorCit2b2lkCitpbml0X3NvdXJjZV9wYXRoICgpCit7CisgIGNoYXIgYnVmWzIwXTsKKworICBzcHJpbnRmIChidWYsICIkY2RpciVjJGN3ZCIsIERJUk5BTUVfU0VQQVJBVE9SKTsKKyAgc291cmNlX3BhdGggPSBzdHJzYXZlIChidWYpOworICBmb3JnZXRfY2FjaGVkX3NvdXJjZV9pbmZvICgpOworfQorCisvKiBBZGQgemVybyBvciBtb3JlIGRpcmVjdG9yaWVzIHRvIHRoZSBmcm9udCBvZiB0aGUgc291cmNlIHBhdGguICAqLworIAordm9pZAorZGlyZWN0b3J5X2NvbW1hbmQgKGRpcm5hbWUsIGZyb21fdHR5KQorICAgICBjaGFyICpkaXJuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGRvbnRfcmVwZWF0ICgpOworICAvKiBGSVhNRSwgdGhpcyBnb2VzIHRvICJkZWxldGUgZGlyIi4uLiAqLworICBpZiAoZGlybmFtZSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChxdWVyeSAoIlJlaW5pdGlhbGl6ZSBzb3VyY2UgcGF0aCB0byBlbXB0eT8gIikpCisJeworCSAgZnJlZSAoc291cmNlX3BhdGgpOworCSAgaW5pdF9zb3VyY2VfcGF0aCAoKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbW9kX3BhdGggKGRpcm5hbWUsICZzb3VyY2VfcGF0aCk7CisgICAgICBsYXN0X3NvdXJjZV92aXNpdGVkID0gTlVMTDsKKyAgICB9CisgIGlmIChmcm9tX3R0eSkKKyAgICBzaG93X2RpcmVjdG9yaWVzICgoY2hhciAqKTAsIGZyb21fdHR5KTsKKyAgZm9yZ2V0X2NhY2hlZF9zb3VyY2VfaW5mbyAoKTsKK30KKworLyogQWRkIHplcm8gb3IgbW9yZSBkaXJlY3RvcmllcyB0byB0aGUgZnJvbnQgb2YgYW4gYXJiaXRyYXJ5IHBhdGguICAqLworCit2b2lkCittb2RfcGF0aCAoZGlybmFtZSwgd2hpY2hfcGF0aCkKKyAgICAgY2hhciAqZGlybmFtZTsKKyAgICAgY2hhciAqKndoaWNoX3BhdGg7Cit7CisgIGNoYXIgKm9sZCA9ICp3aGljaF9wYXRoOworICBpbnQgcHJlZml4ID0gMDsKKworICBpZiAoZGlybmFtZSA9PSAwKQorICAgIHJldHVybjsKKworICBkaXJuYW1lID0gc3Ryc2F2ZSAoZGlybmFtZSk7CisgIG1ha2VfY2xlYW51cCAoZnJlZSwgZGlybmFtZSk7CisKKyAgZG8KKyAgICB7CisgICAgICBjaGFyICpuYW1lID0gZGlybmFtZTsKKyAgICAgIHJlZ2lzdGVyIGNoYXIgKnA7CisgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKKworICAgICAgeworCWNoYXIgKnNlcGFyYXRvciA9IHN0cmNociAobmFtZSwgRElSTkFNRV9TRVBBUkFUT1IpOworCWNoYXIgKnNwYWNlID0gc3RyY2hyIChuYW1lLCAnICcpOworCWNoYXIgKnRhYiA9IHN0cmNociAobmFtZSwgJ1x0Jyk7CisKKwlpZiAoc2VwYXJhdG9yID09IDAgJiYgc3BhY2UgPT0gMCAmJiB0YWIgPT0gIDApCisJICBwID0gZGlybmFtZSA9IG5hbWUgKyBzdHJsZW4gKG5hbWUpOworCWVsc2UKKwkgIHsKKwkgICAgcCA9IDA7CisJICAgIGlmIChzZXBhcmF0b3IgIT0gMCAmJiAocCA9PSAwIHx8IHNlcGFyYXRvciA8IHApKQorCSAgICAgIHAgPSBzZXBhcmF0b3I7CisJICAgIGlmIChzcGFjZSAhPSAwICYmIChwID09IDAgfHwgc3BhY2UgPCBwKSkKKwkgICAgICBwID0gc3BhY2U7CisJICAgIGlmICh0YWIgIT0gMCAmJiAocCA9PSAwIHx8IHRhYiA8IHApKQorCSAgICAgIHAgPSB0YWI7CisJICAgIGRpcm5hbWUgPSBwICsgMTsKKwkgICAgd2hpbGUgKCpkaXJuYW1lID09IERJUk5BTUVfU0VQQVJBVE9SCisJCSAgIHx8ICpkaXJuYW1lID09ICcgJworCQkgICB8fCAqZGlybmFtZSA9PSAnXHQnKQorCSAgICAgICsrZGlybmFtZTsKKwkgIH0KKyAgICAgIH0KKworI2lmbmRlZiBfV0lOMzIgCisgICAgICAvKiBPbiB3aW4zMiBoOlwgaXMgZGlmZmVyZW50IHRvIGg6ICovCisgICAgICBpZiAoU0xBU0hfUCAocFstMV0pKQorCS8qIFNpZ2guICJmb28vIiA9PiAiZm9vIiAqLworCS0tcDsKKyNlbmRpZgorICAgICAgKnAgPSAnXDAnOworCisgICAgICB3aGlsZSAocFstMV0gPT0gJy4nKQorCXsKKwkgIGlmIChwIC0gbmFtZSA9PSAxKQorCSAgICB7CisJICAgICAgLyogIi4iID0+IGdldHdkICgpLiAgKi8KKwkgICAgICBuYW1lID0gY3VycmVudF9kaXJlY3Rvcnk7CisJICAgICAgZ290byBhcHBlbmQ7CisJICAgIH0KKwkgIGVsc2UgaWYgKFNMQVNIX1AgKHBbLTJdKSkKKwkgICAgeworCSAgICAgIGlmIChwIC0gbmFtZSA9PSAyKQorCQl7CisJCSAgLyogIi8uIiA9PiAiLyIuICAqLworCQkgICotLXAgPSAnXDAnOworCQkgIGdvdG8gYXBwZW5kOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogIi4uLmZvby8uIiA9PiAiLi4uZm9vIi4gICovCisJCSAgcCAtPSAyOworCQkgICpwID0gJ1wwJzsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIGJyZWFrOworCX0KKworICAgICAgaWYgKG5hbWVbMF0gPT0gJ34nKQorCW5hbWUgPSB0aWxkZV9leHBhbmQgKG5hbWUpOworICAgICAgZWxzZSBpZiAoIVJPT1RFRF9QIChuYW1lKSAmJiBuYW1lWzBdICE9ICckJykgCisJICBuYW1lID0gY29uY2F0IChjdXJyZW50X2RpcmVjdG9yeSwgU0xBU0hfU1RSSU5HLCBuYW1lLCBOVUxMKTsKKyAgICAgIGVsc2UKKwluYW1lID0gc2F2ZXN0cmluZyAobmFtZSwgcCAtIG5hbWUpOworICAgICAgbWFrZV9jbGVhbnVwIChmcmVlLCBuYW1lKTsKKworICAgICAgLyogVW5sZXNzIGl0J3MgYSB2YXJpYWJsZSwgY2hlY2sgZXhpc3RlbmNlLiAgKi8KKyAgICAgIGlmIChuYW1lWzBdICE9ICckJykgeworCS8qIFRoZXNlIGFyZSB3YXJuaW5ncywgbm90IGVycm9ycywgc2luY2Ugd2UgZG9uJ3Qgd2FudCBhCisJICAgbm9uLWV4aXN0ZW50IGRpcmVjdG9yeSBpbiBhIC5nZGJpbml0IGZpbGUgdG8gc3RvcCBwcm9jZXNzaW5nCisJICAgb2YgdGhlIC5nZGJpbml0IGZpbGUuCisKKwkgICBXaGV0aGVyIHRoZXkgZ2V0IGFkZGVkIHRvIHRoZSBwYXRoIGlzIG1vcmUgZGViYXRhYmxlLiAgQ3VycmVudAorCSAgIGFuc3dlciBpcyB5ZXMsIGluIGNhc2UgdGhlIHVzZXIgd2FudHMgdG8gZ28gbWFrZSB0aGUgZGlyZWN0b3J5CisJICAgb3Igd2hhdGV2ZXIuICBJZiB0aGUgZGlyZWN0b3J5IGNvbnRpbnVlcyB0byBub3QgZXhpc3Qvbm90IGJlCisJICAgYSBkaXJlY3RvcnkvZXRjLCB0aGVuIGhhdmluZyB0aGVtIGluIHRoZSBwYXRoIHNob3VsZCBiZQorCSAgIGhhcm1sZXNzLiAgKi8KKwlpZiAoc3RhdCAobmFtZSwgJnN0KSA8IDApCisJICB7CisJICAgIGludCBzYXZlX2Vycm5vID0gZXJybm87CisJICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIldhcm5pbmc6ICIpOworCSAgICBwcmludF9zeXNfZXJybXNnIChuYW1lLCBzYXZlX2Vycm5vKTsKKwkgIH0KKwllbHNlIGlmICgoc3Quc3RfbW9kZSAmIFNfSUZNVCkgIT0gU19JRkRJUikKKwkgIHdhcm5pbmcgKCIlcyBpcyBub3QgYSBkaXJlY3RvcnkuIiwgbmFtZSk7CisgICAgICB9CisKKyAgICBhcHBlbmQ6CisgICAgICB7CisJcmVnaXN0ZXIgdW5zaWduZWQgaW50IGxlbiA9IHN0cmxlbiAobmFtZSk7CisKKwlwID0gKndoaWNoX3BhdGg7CisJd2hpbGUgKDEpCisJICB7CisJICAgIGlmICghc3RybmNtcCAocCwgbmFtZSwgbGVuKQorCQkmJiAocFtsZW5dID09ICdcMCcgfHwgcFtsZW5dID09IERJUk5BTUVfU0VQQVJBVE9SKSkKKwkgICAgICB7CisJCS8qIEZvdW5kIGl0IGluIHRoZSBzZWFyY2ggcGF0aCwgcmVtb3ZlIG9sZCBjb3B5ICovCisJCWlmIChwID4gKndoaWNoX3BhdGgpCisJCSAgcC0tOwkJCS8qIEJhY2sgb3ZlciBsZWFkaW5nIHNlcGFyYXRvciAqLworCQlpZiAocHJlZml4ID4gcCAtICp3aGljaF9wYXRoKQorCQkgIGdvdG8gc2tpcF9kdXA7CS8qIFNhbWUgZGlyIHR3aWNlIGluIG9uZSBjbWQgKi8KKwkJc3RyY3B5IChwLCAmcFtsZW4rMV0pOwkvKiBDb3B5IGZyb20gbmV4dCBcMCBvciAgOiAqLworCSAgICAgIH0KKwkgICAgcCA9IHN0cmNociAocCwgRElSTkFNRV9TRVBBUkFUT1IpOworCSAgICBpZiAocCAhPSAwKQorCSAgICAgICsrcDsKKwkgICAgZWxzZQorCSAgICAgIGJyZWFrOworCSAgfQorCWlmIChwID09IDApCisJICB7CisJICAgIGNoYXIgdGlueWJ1ZlsyXTsKKworCSAgICB0aW55YnVmWzBdID0gRElSTkFNRV9TRVBBUkFUT1I7CisJICAgIHRpbnlidWZbMV0gPSAnXDAnOworCisJICAgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSB0YWNrZWQgb24gYSBuYW1lKHMpIGluIHRoaXMgY29tbWFuZCwJCQkgICBiZSBzdXJlIHRoZXkgc3RheSBvbiB0aGUgZnJvbnQgYXMgd2UgdGFjayBvbiBzb21lIG1vcmUuICAqLworCSAgICBpZiAocHJlZml4KQorCSAgICAgIHsKKwkJY2hhciAqdGVtcCwgYzsKKworCQljID0gb2xkW3ByZWZpeF07CisJCW9sZFtwcmVmaXhdID0gJ1wwJzsKKwkJdGVtcCA9IGNvbmNhdCAob2xkLCB0aW55YnVmLCBuYW1lLCBOVUxMKTsKKwkJb2xkW3ByZWZpeF0gPSBjOworCQkqd2hpY2hfcGF0aCA9IGNvbmNhdCAodGVtcCwgIiIsICZvbGRbcHJlZml4XSwgTlVMTCk7CisJCXByZWZpeCA9IHN0cmxlbiAodGVtcCk7CisJCWZyZWUgKHRlbXApOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJKndoaWNoX3BhdGggPSBjb25jYXQgKG5hbWUsIChvbGRbMF0gPyB0aW55YnVmIDogb2xkKSwgb2xkLCBOVUxMKTsKKwkJcHJlZml4ID0gc3RybGVuIChuYW1lKTsKKwkgICAgICB9CisJICAgIGZyZWUgKG9sZCk7CisJICAgIG9sZCA9ICp3aGljaF9wYXRoOworCSAgfQorICAgICAgfQorICBza2lwX2R1cDogOworICAgIH0gd2hpbGUgKCpkaXJuYW1lICE9ICdcMCcpOworfQorCisKK3N0YXRpYyB2b2lkCitzb3VyY2VfaW5mbyAoaWdub3JlLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqaWdub3JlOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBzeW10YWIgKnMgPSBjdXJyZW50X3NvdXJjZV9zeW10YWI7CisKKyAgaWYgKCFzKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCgiTm8gY3VycmVudCBzb3VyY2UgZmlsZS5cbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgcHJpbnRmX2ZpbHRlcmVkICgiQ3VycmVudCBzb3VyY2UgZmlsZSBpcyAlc1xuIiwgcy0+ZmlsZW5hbWUpOworICBpZiAocy0+ZGlybmFtZSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJDb21waWxhdGlvbiBkaXJlY3RvcnkgaXMgJXNcbiIsIHMtPmRpcm5hbWUpOworICBpZiAocy0+ZnVsbG5hbWUpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiTG9jYXRlZCBpbiAlc1xuIiwgcy0+ZnVsbG5hbWUpOworICBpZiAocy0+bmxpbmVzKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIkNvbnRhaW5zICVkIGxpbmUlcy5cbiIsIHMtPm5saW5lcywKKwkJICAgICBzLT5ubGluZXMgPT0gMSA/ICIiIDogInMiKTsKKworICBwcmludGZfZmlsdGVyZWQgKCJTb3VyY2UgbGFuZ3VhZ2UgaXMgJXMuXG4iLCBsYW5ndWFnZV9zdHIgKHMtPmxhbmd1YWdlKSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIkNvbXBpbGVkIHdpdGggJXMgZGVidWdnaW5nIGZvcm1hdC5cbiIsIHMtPmRlYnVnZm9ybWF0KTsKK30KKworCisMCisvKiBPcGVuIGEgZmlsZSBuYW1lZCBTVFJJTkcsIHNlYXJjaGluZyBwYXRoIFBBVEggKGRpciBuYW1lcyBzZXAgYnkgc29tZSBjaGFyKQorICAgdXNpbmcgbW9kZSBNT0RFIGFuZCBwcm90ZWN0aW9uIGJpdHMgUFJPVCBpbiB0aGUgY2FsbHMgdG8gb3Blbi4KKworICAgSWYgVFJZX0NXRF9GSVJTVCwgdHJ5IHRvIG9wZW4gLi9TVFJJTkcgYmVmb3JlIHNlYXJjaGluZyBQQVRILgorICAgKGllIHByZXRlbmQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgUEFUSCBpcyAiLiIpLiAgVGhpcyBhbHNvIGluZGljYXRlcworICAgdGhhdCBhIHNsYXNoIGluIFNUUklORyBkaXNhYmxlcyBzZWFyY2hpbmcgb2YgdGhlIHBhdGggKHRoaXMgaXMKKyAgIHNvIHRoYXQgImV4ZWMtZmlsZSAuL2ZvbyIgb3IgInN5bWJvbC1maWxlIC4vZm9vIiBpbnN1cmVzIHRoYXQgeW91CisgICBnZXQgdGhhdCBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgZm9vIG9yIGFuIGVycm9yIG1lc3NhZ2UpLgorCisgICBJZiBGSUxFTkFNRURfT1BFTkVEIGlzIG5vbi1udWxsLCBzZXQgaXQgdG8gYSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nIG5hbWluZworICAgdGhlIGFjdHVhbCBmaWxlIG9wZW5lZCAodGhpcyBzdHJpbmcgd2lsbCBhbHdheXMgc3RhcnQgd2l0aCBhICIvIi4gIFdlCisgICBoYXZlIHRvIHRha2Ugc3BlY2lhbCBwYWlucyB0byBhdm9pZCBkb3VibGluZyB0aGUgIi8iIGJldHdlZW4gdGhlIGRpcmVjdG9yeQorICAgYW5kIHRoZSBmaWxlLCBzaWdoISAgRW1hY3MgZ2V0cyBjb25mdXp6ZWQgYnkgdGhpcyB3aGVuIHdlIHByaW50IHRoZQorICAgc291cmNlIGZpbGUgbmFtZSEhISAKKworICAgSWYgYSBmaWxlIGlzIGZvdW5kLCByZXR1cm4gdGhlIGRlc2NyaXB0b3IuCisgICBPdGhlcndpc2UsIHJldHVybiAtMSwgd2l0aCBlcnJubyBzZXQgZm9yIHRoZSBsYXN0IG5hbWUgd2UgdHJpZWQgdG8gb3Blbi4gICovCisKKy8qICA+Pj4+IFRoaXMgc2hvdWxkIG9ubHkgYWxsb3cgZmlsZXMgb2YgY2VydGFpbiB0eXBlcywKKyAgICA+Pj4+ICBlZyBleGVjdXRhYmxlLCBub24tZGlyZWN0b3J5ICovCitpbnQKK29wZW5wIChwYXRoLCB0cnlfY3dkX2ZpcnN0LCBzdHJpbmcsIG1vZGUsIHByb3QsIGZpbGVuYW1lX29wZW5lZCkKKyAgICAgY2hhciAqcGF0aDsKKyAgICAgaW50IHRyeV9jd2RfZmlyc3Q7CisgICAgIGNoYXIgKnN0cmluZzsKKyAgICAgaW50IG1vZGU7CisgICAgIGludCBwcm90OworICAgICBjaGFyICoqZmlsZW5hbWVfb3BlbmVkOworeworICByZWdpc3RlciBpbnQgZmQ7CisgIHJlZ2lzdGVyIGNoYXIgKmZpbGVuYW1lOworICByZWdpc3RlciBjaGFyICpwLCAqcDE7CisgIHJlZ2lzdGVyIGludCBsZW47CisgIGludCBhbGxvY2xlbjsKKworICBpZiAoIXBhdGgpCisgICAgcGF0aCA9ICIuIjsKKworI2lmZGVmIF9XSU4zMgorICBtb2RlIHw9IE9fQklOQVJZOworI2VuZGlmCisKKyAgaWYgKHRyeV9jd2RfZmlyc3QgfHwgU0xBU0hfUCAoc3RyaW5nWzBdKSkKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIGZpbGVuYW1lID0gc3RyaW5nOworICAgICAgZmQgPSBvcGVuIChmaWxlbmFtZSwgbW9kZSwgcHJvdCk7CisgICAgICBpZiAoZmQgPj0gMCkKKwlnb3RvIGRvbmU7CisgICAgICBmb3IgKGkgPSAwOyBzdHJpbmdbaV07IGkrKykKKwlpZiAoU0xBU0hfUCAoc3RyaW5nW2ldKSkKKwkgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgLyogLi9mb28gPT4gZm9vICovCisgIHdoaWxlIChzdHJpbmdbMF0gPT0gJy4nICYmIFNMQVNIX1AgKHN0cmluZ1sxXSkpCisgICAgc3RyaW5nICs9IDI7CisKKyAgYWxsb2NsZW4gPSBzdHJsZW4gKHBhdGgpICsgc3RybGVuIChzdHJpbmcpICsgMjsKKyAgZmlsZW5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKGFsbG9jbGVuKTsKKyAgZmQgPSAtMTsKKyAgZm9yIChwID0gcGF0aDsgcDsgcCA9IHAxID8gcDEgKyAxIDogMCkKKyAgICB7CisgICAgICBwMSA9IChjaGFyICopIHN0cmNociAocCwgRElSTkFNRV9TRVBBUkFUT1IpOworICAgICAgaWYgKHAxKQorCWxlbiA9IHAxIC0gcDsKKyAgICAgIGVsc2UKKwlsZW4gPSBzdHJsZW4gKHApOworCisgICAgICBpZiAobGVuID09IDQgJiYgcFswXSA9PSAnJCcgJiYgcFsxXSA9PSAnYycKKwkgICYmIHBbMl0gPT0gJ3cnICYmIHBbM10gPT0gJ2QnKSB7CisJLyogTmFtZSBpcyAkY3dkIC0tIGluc2VydCBjdXJyZW50IGRpcmVjdG9yeSBuYW1lIGluc3RlYWQuICAqLworCWludCBuZXdsZW47CisKKwkvKiBGaXJzdCwgcmVhbGxvYyB0aGUgZmlsZW5hbWUgYnVmZmVyIGlmIHRvbyBzaG9ydC4gKi8KKwlsZW4gPSBzdHJsZW4gKGN1cnJlbnRfZGlyZWN0b3J5KTsKKwluZXdsZW4gPSBsZW4gKyBzdHJsZW4gKHN0cmluZykgKyAyOworCWlmIChuZXdsZW4gPiBhbGxvY2xlbikgeworCSAgYWxsb2NsZW4gPSBuZXdsZW47CisJICBmaWxlbmFtZSA9IChjaGFyICopIGFsbG9jYSAoYWxsb2NsZW4pOworCX0KKwlzdHJjcHkgKGZpbGVuYW1lLCBjdXJyZW50X2RpcmVjdG9yeSk7CisgICAgICB9IGVsc2UgeworCS8qIE5vcm1hbCBmaWxlIG5hbWUgaW4gcGF0aCAtLSBqdXN0IHVzZSBpdC4gICovCisJc3RybmNweSAoZmlsZW5hbWUsIHAsIGxlbik7CisJZmlsZW5hbWVbbGVuXSA9IDA7CisgICAgICB9CisKKyAgICAgIC8qIFJlbW92ZSB0cmFpbGluZyBzbGFzaGVzICovCisgICAgICB3aGlsZSAobGVuID4gMCAmJiBTTEFTSF9QIChmaWxlbmFtZVtsZW4tMV0pKQorCWZpbGVuYW1lWy0tbGVuXSA9IDA7CisKKyAgICAgIHN0cmNhdCAoZmlsZW5hbWUrbGVuLCBTTEFTSF9TVFJJTkcpOworICAgICAgc3RyY2F0IChmaWxlbmFtZSwgc3RyaW5nKTsKKworICAgICAgZmQgPSBvcGVuIChmaWxlbmFtZSwgbW9kZSk7CisgICAgICBpZiAoZmQgPj0gMCkgYnJlYWs7CisgICAgfQorCisgZG9uZToKKyAgaWYgKGZpbGVuYW1lX29wZW5lZCkKKyAgICB7CisgICAgICBpZiAoZmQgPCAwKQorCSpmaWxlbmFtZV9vcGVuZWQgPSAoY2hhciAqKSAwOworICAgICAgZWxzZSBpZiAoUk9PVEVEX1AgKGZpbGVuYW1lKSkKKwkqZmlsZW5hbWVfb3BlbmVkID0gc2F2ZXN0cmluZyAoZmlsZW5hbWUsIHN0cmxlbiAoZmlsZW5hbWUpKTsKKyAgICAgIGVsc2UKKwl7CisJICAvKiBCZXdhcmUgdGhlIC8vIG15IHNvbiwgdGhlIEVtYWNzIGJhcmZzLCB0aGUgYm90Y2ggdGhhdCBjYXRjaC4uLiAqLworCSAgCisJICAqZmlsZW5hbWVfb3BlbmVkID0gY29uY2F0IChjdXJyZW50X2RpcmVjdG9yeSwgCisJCQkJICAgICBTTEFTSF9DSEFSCisJCQkJICAgICA9PSBjdXJyZW50X2RpcmVjdG9yeVtzdHJsZW4oY3VycmVudF9kaXJlY3RvcnkpLTFdIAorICAJCQkJICAgICA/ICIiOiBTTEFTSF9TVFJJTkcsCisJCQkJICAgICBmaWxlbmFtZSwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgTVBXCisgIC8qIFRoaXMgaXMgYSBkZWJ1Z2dpbmcgaGFjayB0aGF0IGNhbiBnbyBhd2F5IHdoZW4gYWxsIGNvbWJpbmF0aW9ucworICAgICBvZiBNYWMgYW5kIFVuaXggbmFtZXMgYXJlIGhhbmRsZWQgcmVhc29uYWJseS4gICovCisgIHsKKyAgICBleHRlcm4gaW50IGRlYnVnX29wZW5wOworCisgICAgaWYgKGRlYnVnX29wZW5wKQorICAgICAgeworCXByaW50Zigib3BlbnAgb24gJXMsIHBhdGggJXMgbW9kZSAlZCBwcm90ICVkXG4gIHJldHVybmVkICVkIiwKKwkgICAgICAgc3RyaW5nLCBwYXRoLCBtb2RlLCBwcm90LCBmZCk7CisJaWYgKCpmaWxlbmFtZV9vcGVuZWQpCisJICBwcmludGYoIiAoZmlsZW5hbWUgaXMgJXMpIiwgKmZpbGVuYW1lX29wZW5lZCk7CisJcHJpbnRmKCJcbiIpOworICAgICAgfQorICB9CisjZW5kaWYgLyogTVBXICovCisKKyAgcmV0dXJuIGZkOworfQorCisgCisvKiBUaGlzIGlzIGVzc2VudGlhbGx5IGEgY29udmVuaWVuY2UsIGZvciBjbGllbnRzIHRoYXQgd2FudCB0aGUgYmVoYXZpb3VyCisgICBvZiBvcGVucCwgdXNpbmcgc291cmNlX3BhdGgsIGJ1dCB0aGF0IHJlYWxseSBkb24ndCB3YW50IHRoZSBmaWxlIHRvIGJlCisgICBvcGVuZWQgYnV0IHdhbnQgaW5zdGVhZCBqdXN0IHRvIGtub3cgd2hhdCB0aGUgZnVsbCBwYXRobmFtZSBpcyAoYXMKKyAgIHF1YWxpZmllZCBhZ2FpbnN0IHNvdXJjZV9wYXRoKS4KKworICAgVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMgc2VhcmNoZWQgZmlyc3QuCisKKyAgIElmIHRoZSBmaWxlIHdhcyBmb3VuZCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIDEsIGFuZCBGVUxMX1BBVEhOQU1FIGlzCisgICBzZXQgdG8gdGhlIGZ1bGx5LXF1YWxpZmllZCBwYXRobmFtZS4KKworICAgRWxzZSwgdGhpcyBmdW5jdGlvbnMgcmV0dXJucyAwLCBhbmQgRlVMTF9QQVRITkFNRSBpcyBzZXQgdG8gTlVMTC4KKyAgICovCitpbnQKK3NvdXJjZV9mdWxsX3BhdGhfb2YgKGZpbGVuYW1lLCBmdWxsX3BhdGhuYW1lKQorICBjaGFyICogIGZpbGVuYW1lOworICBjaGFyICoqICBmdWxsX3BhdGhuYW1lOworeworICBpbnQgIGZkOworCisgIGZkID0gb3BlbnAgKHNvdXJjZV9wYXRoLCAxLCBmaWxlbmFtZSwgT19SRE9OTFksIDAsIGZ1bGxfcGF0aG5hbWUpOworICBpZiAoZmQgPCAwKQorICAgIHsKKyAgICAgICpmdWxsX3BhdGhuYW1lID0gTlVMTDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBjbG9zZSAoZmQpOworICByZXR1cm4gMTsKK30KKworCisvKiBPcGVuIGEgc291cmNlIGZpbGUgZ2l2ZW4gYSBzeW10YWIgUy4gIFJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3Igb3IKKyAgIG5lZ2F0aXZlIG51bWJlciBmb3IgZXJyb3IuICAqLworCitpbnQKK29wZW5fc291cmNlX2ZpbGUgKHMpCisgICAgIHN0cnVjdCBzeW10YWIgKnM7Cit7CisgIGNoYXIgKnBhdGggPSBzb3VyY2VfcGF0aDsKKyAgY2hhciAqcDsKKyAgaW50IHJlc3VsdDsKKyAgY2hhciAqZnVsbG5hbWU7CisKKyAgLyogUXVpY2sgd2F5IG91dCBpZiB3ZSBhbHJlYWR5IGtub3cgaXRzIGZ1bGwgbmFtZSAqLworICBpZiAocy0+ZnVsbG5hbWUpIAorICAgIHsKKyAgICAgIHJlc3VsdCA9IG9wZW4gKHMtPmZ1bGxuYW1lLCBPUEVOX01PREUpOworICAgICAgaWYgKHJlc3VsdCA+PSAwKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgLyogRGlkbid0IHdvcmsgLS0gZnJlZSBvbGQgb25lLCB0cnkgYWdhaW4uICovCisgICAgICBtZnJlZSAocy0+b2JqZmlsZS0+bWQsIHMtPmZ1bGxuYW1lKTsKKyAgICAgIHMtPmZ1bGxuYW1lID0gTlVMTDsKKyAgICB9CisKKyAgaWYgKHMtPmRpcm5hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBSZXBsYWNlIGEgcGF0aCBlbnRyeSBvZiAgJGNkaXIgIHdpdGggdGhlIGNvbXBpbGF0aW9uIGRpcmVjdG9yeSBuYW1lICovCisjZGVmaW5lCWNkaXJfbGVuCTUKKyAgICAgIC8qIFdlIGNhc3Qgc3Ryc3RyJ3MgcmVzdWx0IGluIGNhc2UgYW4gQU5TSWhvbGUgaGFzIG1hZGUgaXQgY29uc3QsCisJIHdoaWNoIHByb2R1Y2VzIGEgInJlcXVpcmVkIHdhcm5pbmciIHdoZW4gYXNzaWduZWQgdG8gYSBub25jb25zdC4gKi8KKyAgICAgIHAgPSAoY2hhciAqKXN0cnN0ciAoc291cmNlX3BhdGgsICIkY2RpciIpOworICAgICAgaWYgKHAgJiYgKHAgPT0gcGF0aCB8fCBwWy0xXSA9PSBESVJOQU1FX1NFUEFSQVRPUikKKwkgICAgJiYgKHBbY2Rpcl9sZW5dID09IERJUk5BTUVfU0VQQVJBVE9SIHx8IHBbY2Rpcl9sZW5dID09ICdcMCcpKQorCXsKKwkgIGludCBsZW47CisKKwkgIHBhdGggPSAoY2hhciAqKQorCSAgICBhbGxvY2EgKHN0cmxlbiAoc291cmNlX3BhdGgpICsgMSArIHN0cmxlbiAocy0+ZGlybmFtZSkgKyAxKTsKKwkgIGxlbiA9IHAgLSBzb3VyY2VfcGF0aDsKKwkgIHN0cm5jcHkgKHBhdGgsIHNvdXJjZV9wYXRoLCBsZW4pOwkJLyogQmVmb3JlICRjZGlyICovCisJICBzdHJjcHkgKHBhdGggKyBsZW4sIHMtPmRpcm5hbWUpOwkJLyogbmV3IHN0dWZmICovCisJICBzdHJjYXQgKHBhdGggKyBsZW4sIHNvdXJjZV9wYXRoICsgbGVuICsgY2Rpcl9sZW4pOyAvKiBBZnRlciAkY2RpciAqLworCX0KKyAgICB9CisKKyAgcmVzdWx0ID0gb3BlbnAgKHBhdGgsIDAsIHMtPmZpbGVuYW1lLCBPUEVOX01PREUsIDAsICZzLT5mdWxsbmFtZSk7CisgIGlmIChyZXN1bHQgPCAwKQorICAgIHsKKyAgICAgIC8qIERpZG4ndCB3b3JrLiAgVHJ5IHVzaW5nIGp1c3QgdGhlIGJhc2VuYW1lLiAqLworICAgICAgcCA9IGJhc2VuYW1lIChzLT5maWxlbmFtZSk7CisgICAgICBpZiAocCAhPSBzLT5maWxlbmFtZSkKKwlyZXN1bHQgPSBvcGVucCAocGF0aCwgMCwgcCwgT1BFTl9NT0RFLCAwLCAmcy0+ZnVsbG5hbWUpOworICAgIH0KKyNpZmRlZiBNUFcKKyAgaWYgKHJlc3VsdCA8IDApCisgICAgeworICAgICAgLyogRGlkbid0IHdvcmsuICBUcnkgdXNpbmcganVzdCB0aGUgTVBXIGJhc2VuYW1lLiAqLworICAgICAgcCA9IChjaGFyICopIG1wd19iYXNlbmFtZSAocy0+ZmlsZW5hbWUpOworICAgICAgaWYgKHAgIT0gcy0+ZmlsZW5hbWUpCisJcmVzdWx0ID0gb3BlbnAgKHBhdGgsIDAsIHAsIE9QRU5fTU9ERSwgMCwgJnMtPmZ1bGxuYW1lKTsKKyAgICB9CisgIGlmIChyZXN1bHQgPCAwKQorICAgIHsKKyAgICAgIC8qIERpZG4ndCB3b3JrLiAgVHJ5IHVzaW5nIHRoZSBtaXhlZCBVbml4L01QVyBiYXNlbmFtZS4gKi8KKyAgICAgIHAgPSAoY2hhciAqKSBtcHdfbWl4ZWRfYmFzZW5hbWUgKHMtPmZpbGVuYW1lKTsKKyAgICAgIGlmIChwICE9IHMtPmZpbGVuYW1lKQorCXJlc3VsdCA9IG9wZW5wIChwYXRoLCAwLCBwLCBPUEVOX01PREUsIDAsICZzLT5mdWxsbmFtZSk7CisgICAgfQorI2VuZGlmIC8qIE1QVyAqLworCisgIGlmIChyZXN1bHQgPj0gMCkKKyAgICB7CisgICAgICBmdWxsbmFtZSA9IHMtPmZ1bGxuYW1lOworICAgICAgcy0+ZnVsbG5hbWUgPSBtc3Ryc2F2ZSAocy0+b2JqZmlsZS0+bWQsIHMtPmZ1bGxuYW1lKTsKKyAgICAgIGZyZWUgKGZ1bGxuYW1lKTsKKyAgICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIFJldHVybiB0aGUgcGF0aCB0byB0aGUgc291cmNlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHN5bXRhYi4gIFJldHVybnMgTlVMTAorICAgaWYgbm8gc3ltdGFiLiAgKi8KKworY2hhciAqCitzeW10YWJfdG9fZmlsZW5hbWUgKHMpCisgICAgIHN0cnVjdCBzeW10YWIgKnM7Cit7CisgIGludCBmZDsKKworICBpZiAoIXMpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogSWYgd2UndmUgc2VlbiB0aGUgZmlsZSBiZWZvcmUsIGp1c3QgcmV0dXJuIGZ1bGxuYW1lLiAqLworCisgIGlmIChzLT5mdWxsbmFtZSkKKyAgICByZXR1cm4gcy0+ZnVsbG5hbWU7CisKKyAgLyogVHJ5IG9wZW5pbmcgdGhlIGZpbGUgdG8gc2V0dXAgZnVsbG5hbWUgKi8KKworICBmZCA9IG9wZW5fc291cmNlX2ZpbGUgKHMpOworICBpZiAoZmQgPCAwKQorICAgIHJldHVybiBzLT5maWxlbmFtZTsJCS8qIEZpbGUgbm90IGZvdW5kLiAgSnVzdCB1c2Ugc2hvcnQgbmFtZSAqLworCisgIC8qIEZvdW5kIHRoZSBmaWxlLiAgQ2xlYW51cCBhbmQgcmV0dXJuIHRoZSBmdWxsIG5hbWUgKi8KKworICBjbG9zZSAoZmQpOworICByZXR1cm4gcy0+ZnVsbG5hbWU7Cit9CisKKwwKKy8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgdGFibGUgUy0+bGluZV9jaGFycG9zIHRoYXQgcmVjb3JkcworICAgdGhlIHBvc2l0aW9ucyBvZiB0aGUgbGluZXMgaW4gdGhlIHNvdXJjZSBmaWxlLCB3aGljaCBpcyBhc3N1bWVkCisgICB0byBiZSBvcGVuIG9uIGRlc2NyaXB0b3IgREVTQy4KKyAgIEFsbCBzZXQgUy0+bmxpbmVzIHRvIHRoZSBudW1iZXIgb2Ygc3VjaCBsaW5lcy4gICovCisKK3ZvaWQKK2ZpbmRfc291cmNlX2xpbmVzIChzLCBkZXNjKQorICAgICBzdHJ1Y3Qgc3ltdGFiICpzOworICAgICBpbnQgZGVzYzsKK3sKKyAgc3RydWN0IHN0YXQgc3Q7CisgIHJlZ2lzdGVyIGNoYXIgKmRhdGEsICpwLCAqZW5kOworICBpbnQgbmxpbmVzID0gMDsKKyAgaW50IGxpbmVzX2FsbG9jYXRlZCA9IDEwMDA7CisgIGludCAqbGluZV9jaGFycG9zOworICBsb25nIG10aW1lID0gMDsKKyAgaW50IHNpemU7CisKKyAgbGluZV9jaGFycG9zID0gKGludCAqKSB4bW1hbGxvYyAocyAtPiBvYmpmaWxlIC0+IG1kLAorCQkJCSAgIGxpbmVzX2FsbG9jYXRlZCAqIHNpemVvZiAoaW50KSk7CisgIGlmIChmc3RhdCAoZGVzYywgJnN0KSA8IDApCisgICAgcGVycm9yX3dpdGhfbmFtZSAocy0+ZmlsZW5hbWUpOworCisgIGlmIChzICYmIHMtPm9iamZpbGUgJiYgcy0+b2JqZmlsZS0+b2JmZCkKKyAgICBtdGltZSA9IGJmZF9nZXRfbXRpbWUocy0+b2JqZmlsZS0+b2JmZCk7CisgIGVsc2UgaWYgKGV4ZWNfYmZkKQorICAgIG10aW1lID0gYmZkX2dldF9tdGltZShleGVjX2JmZCk7CisKKyAgaWYgKG10aW1lICYmIG10aW1lIDwgc3Quc3RfbXRpbWUpCisgICAgeworICAgICAgaWYgKHR1aV92ZXJzaW9uKQorCXByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgICAgICB3YXJuaW5nKCJTb3VyY2UgZmlsZSBpcyBtb3JlIHJlY2VudCB0aGFuIGV4ZWN1dGFibGUuXG4iKTsKKyAgICB9CisKKyNpZmRlZiBMU0VFS19OT1RfTElORUFSCisgIHsKKyAgICBjaGFyIGM7CisKKyAgICAvKiBIYXZlIHRvIHJlYWQgaXQgYnl0ZSBieSBieXRlIHRvIGZpbmQgb3V0IHdoZXJlIHRoZSBjaGFycyBsaXZlICovCisKKyAgICBsaW5lX2NoYXJwb3NbMF0gPSBsc2VlayAoZGVzYywgMCwgU0VFS19DVVIpOworICAgIG5saW5lcyA9IDE7CisgICAgd2hpbGUgKG15cmVhZChkZXNjLCAmYywgMSk+MCkgCisgICAgICB7CisJaWYgKGMgPT0gJ1xuJykgCisJICB7CisJICAgIGlmIChubGluZXMgPT0gbGluZXNfYWxsb2NhdGVkKSAKKwkgICAgICB7CisJCWxpbmVzX2FsbG9jYXRlZCAqPSAyOworCQlsaW5lX2NoYXJwb3MgPQorCQkgIChpbnQgKikgeG1yZWFsbG9jIChzIC0+IG9iamZpbGUgLT4gbWQsIChjaGFyICopIGxpbmVfY2hhcnBvcywKKwkJCQkgICAgIHNpemVvZiAoaW50KSAqIGxpbmVzX2FsbG9jYXRlZCk7CisJICAgICAgfQorCSAgICBsaW5lX2NoYXJwb3NbbmxpbmVzKytdID0gbHNlZWsgKGRlc2MsIDAsIFNFRUtfQ1VSKTsKKwkgIH0KKyAgICAgIH0KKyAgfQorI2Vsc2UgLyogbHNlZWsgbGluZWFyLiAgKi8KKyAgeworICAgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2xlYW51cHM7CisKKyAgICAvKiBzdF9zaXplIG1pZ2h0IGJlIGEgbGFyZ2UgdHlwZSwgYnV0IHdlIG9ubHkgc3VwcG9ydCBzb3VyY2UgZmlsZXMgd2hvc2UgCisgICAgICAgc2l6ZSBmaXRzIGluIGFuIGludC4gICovCisgICAgc2l6ZSA9IChpbnQpIHN0LnN0X3NpemU7CisKKyAgICAvKiBVc2UgbWFsbG9jLCBub3QgYWxsb2NhLCBiZWNhdXNlIHRoaXMgbWF5IGJlIHByZXR0eSBsYXJnZSwgYW5kIHdlIG1heQorICAgICAgIHJ1biBpbnRvIHZhcmlvdXMga2luZHMgb2YgbGltaXRzIG9uIHN0YWNrIHNpemUuICAqLworICAgIGRhdGEgPSAoY2hhciAqKSB4bWFsbG9jIChzaXplKTsKKyAgICBvbGRfY2xlYW51cHMgPSBtYWtlX2NsZWFudXAgKGZyZWUsIGRhdGEpOworCisgICAgLyogUmVhc3NpZ24gYHNpemUnIHRvIHJlc3VsdCBvZiByZWFkIGZvciBzeXN0ZW1zIHdoZXJlIFxyXG4gLT4gXG4uICAqLworICAgIHNpemUgPSBteXJlYWQgKGRlc2MsIGRhdGEsIHNpemUpOworICAgIGlmIChzaXplIDwgMCkKKyAgICAgIHBlcnJvcl93aXRoX25hbWUgKHMtPmZpbGVuYW1lKTsKKyAgICBlbmQgPSBkYXRhICsgc2l6ZTsKKyAgICBwID0gZGF0YTsKKyAgICBsaW5lX2NoYXJwb3NbMF0gPSAwOworICAgIG5saW5lcyA9IDE7CisgICAgd2hpbGUgKHAgIT0gZW5kKQorICAgICAgeworCWlmICgqcCsrID09ICdcbicKKwkgICAgLyogQSBuZXdsaW5lIGF0IHRoZSBlbmQgZG9lcyBub3Qgc3RhcnQgYSBuZXcgbGluZS4gICovCisJICAgICYmIHAgIT0gZW5kKQorCSAgeworCSAgICBpZiAobmxpbmVzID09IGxpbmVzX2FsbG9jYXRlZCkKKwkgICAgICB7CisJCWxpbmVzX2FsbG9jYXRlZCAqPSAyOworCQlsaW5lX2NoYXJwb3MgPQorCQkgIChpbnQgKikgeG1yZWFsbG9jIChzIC0+IG9iamZpbGUgLT4gbWQsIChjaGFyICopIGxpbmVfY2hhcnBvcywKKwkJCQkgICAgIHNpemVvZiAoaW50KSAqIGxpbmVzX2FsbG9jYXRlZCk7CisJICAgICAgfQorCSAgICBsaW5lX2NoYXJwb3NbbmxpbmVzKytdID0gcCAtIGRhdGE7CisJICB9CisgICAgICB9CisgICAgZG9fY2xlYW51cHMgKG9sZF9jbGVhbnVwcyk7CisgIH0KKyNlbmRpZiAvKiBsc2VlayBsaW5lYXIuICAqLworICBzLT5ubGluZXMgPSBubGluZXM7CisgIHMtPmxpbmVfY2hhcnBvcyA9CisgICAoaW50ICopIHhtcmVhbGxvYyAocyAtPiBvYmpmaWxlIC0+IG1kLCAoY2hhciAqKSBsaW5lX2NoYXJwb3MsCisJCSAgICAgIG5saW5lcyAqIHNpemVvZiAoaW50KSk7CisKK30KKworLyogUmV0dXJuIHRoZSBjaGFyYWN0ZXIgcG9zaXRpb24gb2YgYSBsaW5lIExJTkUgaW4gc3ltdGFiIFMuCisgICBSZXR1cm4gMCBpZiBhbnl0aGluZyBpcyBpbnZhbGlkLiAgKi8KKworI2lmIDAJLyogQ3VycmVudGx5IHVudXNlZCAqLworCitpbnQKK3NvdXJjZV9saW5lX2NoYXJwb3MgKHMsIGxpbmUpCisgICAgIHN0cnVjdCBzeW10YWIgKnM7CisgICAgIGludCBsaW5lOworeworICBpZiAoIXMpIHJldHVybiAwOworICBpZiAoIXMtPmxpbmVfY2hhcnBvcyB8fCBsaW5lIDw9IDApIHJldHVybiAwOworICBpZiAobGluZSA+IHMtPm5saW5lcykKKyAgICBsaW5lID0gcy0+bmxpbmVzOworICByZXR1cm4gcy0+bGluZV9jaGFycG9zW2xpbmUgLSAxXTsKK30KKworLyogUmV0dXJuIHRoZSBsaW5lIG51bWJlciBvZiBjaGFyYWN0ZXIgcG9zaXRpb24gUE9TIGluIHN5bXRhYiBTLiAgKi8KKworaW50Citzb3VyY2VfY2hhcnBvc19saW5lIChzLCBjaHIpCisgICAgcmVnaXN0ZXIgc3RydWN0IHN5bXRhYiAqczsKKyAgICByZWdpc3RlciBpbnQgY2hyOworeworICByZWdpc3RlciBpbnQgbGluZSA9IDA7CisgIHJlZ2lzdGVyIGludCAqbG5wOworICAgIAorICBpZiAocyA9PSAwIHx8IHMtPmxpbmVfY2hhcnBvcyA9PSAwKSByZXR1cm4gMDsKKyAgbG5wID0gcy0+bGluZV9jaGFycG9zOworICAvKiBGaWxlcyBhcmUgdXN1YWxseSBzaG9ydCwgc28gc2VxdWVudGlhbCBzZWFyY2ggaXMgT2sgKi8KKyAgd2hpbGUgKGxpbmUgPCBzLT5ubGluZXMgICYmICpsbnAgPD0gY2hyKQorICAgIHsKKyAgICAgIGxpbmUrKzsKKyAgICAgIGxucCsrOworICAgIH0KKyAgaWYgKGxpbmUgPj0gcy0+bmxpbmVzKQorICAgIGxpbmUgPSBzLT5ubGluZXM7CisgIHJldHVybiBsaW5lOworfQorCisjZW5kaWYJLyogMCAqLworCisMCisvKiBHZXQgZnVsbCBwYXRobmFtZSBhbmQgbGluZSBudW1iZXIgcG9zaXRpb25zIGZvciBhIHN5bXRhYi4KKyAgIFJldHVybiBub256ZXJvIGlmIGxpbmUgbnVtYmVycyBtYXkgaGF2ZSBjaGFuZ2VkLgorICAgU2V0ICpGVUxMTkFNRSB0byBhY3R1YWwgbmFtZSBvZiB0aGUgZmlsZSBhcyBmb3VuZCBieSBgb3BlbnAnLAorICAgb3IgdG8gMCBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQuICAqLworCitzdGF0aWMgaW50CitnZXRfZmlsZW5hbWVfYW5kX2NoYXJwb3MgKHMsIGZ1bGxuYW1lKQorICAgICBzdHJ1Y3Qgc3ltdGFiICpzOworICAgICBjaGFyICoqZnVsbG5hbWU7Cit7CisgIHJlZ2lzdGVyIGludCBkZXNjLCBsaW5lbnVtc19jaGFuZ2VkID0gMDsKKyAgCisgIGRlc2MgPSBvcGVuX3NvdXJjZV9maWxlIChzKTsKKyAgaWYgKGRlc2MgPCAwKQorICAgIHsKKyAgICAgIGlmIChmdWxsbmFtZSkKKwkqZnVsbG5hbWUgPSBOVUxMOworICAgICAgcmV0dXJuIDA7CisgICAgfSAgCisgIGlmIChmdWxsbmFtZSkKKyAgICAqZnVsbG5hbWUgPSBzLT5mdWxsbmFtZTsKKyAgaWYgKHMtPmxpbmVfY2hhcnBvcyA9PSAwKSBsaW5lbnVtc19jaGFuZ2VkID0gMTsKKyAgaWYgKGxpbmVudW1zX2NoYW5nZWQpIGZpbmRfc291cmNlX2xpbmVzIChzLCBkZXNjKTsKKyAgY2xvc2UgKGRlc2MpOworICByZXR1cm4gbGluZW51bXNfY2hhbmdlZDsKK30KKworLyogUHJpbnQgdGV4dCBkZXNjcmliaW5nIHRoZSBmdWxsIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIFMKKyAgIGFuZCB0aGUgbGluZSBudW1iZXIgTElORSBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVyIHBvc2l0aW9uLgorICAgVGhlIHRleHQgc3RhcnRzIHdpdGggdHdvIEN0cmwteiBzbyB0aGF0IHRoZSBFbWFjcy1HREIgaW50ZXJmYWNlCisgICBjYW4gZWFzaWx5IGZpbmQgaXQuCisKKyAgIE1JRF9TVEFURU1FTlQgaXMgbm9uemVybyBpZiB0aGUgUEMgaXMgbm90IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhhdCBsaW5lLgorCisgICBSZXR1cm4gMSBpZiBzdWNjZXNzZnVsLCAwIGlmIGNvdWxkIG5vdCBmaW5kIHRoZSBmaWxlLiAgKi8KKworaW50CitpZGVudGlmeV9zb3VyY2VfbGluZSAocywgbGluZSwgbWlkX3N0YXRlbWVudCwgcGMpCisgICAgIHN0cnVjdCBzeW10YWIgKnM7CisgICAgIGludCBsaW5lOworICAgICBpbnQgbWlkX3N0YXRlbWVudDsKKyAgICAgQ09SRV9BRERSIHBjOworeworICBpZiAocy0+bGluZV9jaGFycG9zID09IDApCisgICAgZ2V0X2ZpbGVuYW1lX2FuZF9jaGFycG9zIChzLCAoY2hhciAqKilOVUxMKTsKKyAgaWYgKHMtPmZ1bGxuYW1lID09IDApCisgICAgcmV0dXJuIDA7CisgIGlmIChsaW5lID4gcy0+bmxpbmVzKQorICAgIC8qIERvbid0IGluZGV4IG9mZiB0aGUgZW5kIG9mIHRoZSBsaW5lX2NoYXJwb3MgYXJyYXkuICAqLworICAgIHJldHVybiAwOworICBhbm5vdGF0ZV9zb3VyY2UgKHMtPmZ1bGxuYW1lLCBsaW5lLCBzLT5saW5lX2NoYXJwb3NbbGluZSAtIDFdLAorCQkgICBtaWRfc3RhdGVtZW50LCBwYyk7CisKKyAgY3VycmVudF9zb3VyY2VfbGluZSA9IGxpbmU7CisgIGZpcnN0X2xpbmVfbGlzdGVkID0gbGluZTsKKyAgbGFzdF9saW5lX2xpc3RlZCA9IGxpbmU7CisgIGN1cnJlbnRfc291cmNlX3N5bXRhYiA9IHM7CisgIHJldHVybiAxOworfQorCisMCisvKiBQcmludCBzb3VyY2UgbGluZXMgZnJvbSB0aGUgZmlsZSBvZiBzeW10YWIgUywKKyAgIHN0YXJ0aW5nIHdpdGggbGluZSBudW1iZXIgTElORSBhbmQgc3RvcHBpbmcgYmVmb3JlIGxpbmUgbnVtYmVyIFNUT1BMSU5FLiAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfc291cmNlX2xpbmVzX2Jhc2UgKHMsIGxpbmUsIHN0b3BsaW5lLCBub2Vycm9yKQorICAgICBzdHJ1Y3Qgc3ltdGFiICpzOworICAgICBpbnQgbGluZSwgc3RvcGxpbmU7CisgICAgIGludCBub2Vycm9yOworeworICByZWdpc3RlciBpbnQgYzsKKyAgcmVnaXN0ZXIgaW50IGRlc2M7CisgIHJlZ2lzdGVyIEZJTEUgKnN0cmVhbTsKKyAgaW50IG5saW5lcyA9IHN0b3BsaW5lIC0gbGluZTsKKworICAvKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UgY2FuIG9wZW4gdGhlIGZpbGUsIHNldCBjdXJyZW50X3NvdXJjZV9zeW10YWIuICovCisgIGN1cnJlbnRfc291cmNlX3N5bXRhYiA9IHM7CisgIGN1cnJlbnRfc291cmNlX2xpbmUgPSBsaW5lOworICBmaXJzdF9saW5lX2xpc3RlZCA9IGxpbmU7CisKKworICAvKiBPbmx5IHByaW50cyAiTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIgb25jZSAqLworICBpZiAoKHMgIT0gbGFzdF9zb3VyY2VfdmlzaXRlZCkgfHwgKCEgbGFzdF9zb3VyY2VfZXJyb3IpKQorICAgIHsKKyAgICAgIGxhc3Rfc291cmNlX3Zpc2l0ZWQgPSBzOworICAgICAgZGVzYyA9IG9wZW5fc291cmNlX2ZpbGUgKHMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRlc2MgPSBsYXN0X3NvdXJjZV9lcnJvcjsKKyAgICAgIG5vZXJyb3IgPSAxOworICAgIH0KKworICBpZiAoZGVzYyA8IDApCisgICAgeworICAgICAgbGFzdF9zb3VyY2VfZXJyb3IgPSBkZXNjOworCisgICAgICBpZiAoISBub2Vycm9yKQorICAgICAgICB7CisJICBjaGFyICpuYW1lID0gYWxsb2NhIChzdHJsZW4gKHMtPmZpbGVuYW1lKSArIDEwMCk7CisJICBzcHJpbnRmIChuYW1lLCAiJWRcdCVzIiwgbGluZSwgcy0+ZmlsZW5hbWUpOworCSAgcHJpbnRfc3lzX2Vycm1zZyAobmFtZSwgZXJybm8pOworCX0KKyAgICAgIGVsc2UKKwlwcmludGZfZmlsdGVyZWQgKCIlZFx0aW4gJXNcbiIsIGxpbmUsIHMtPmZpbGVuYW1lKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICBsYXN0X3NvdXJjZV9lcnJvciA9IDA7CisKKyAgaWYgKHMtPmxpbmVfY2hhcnBvcyA9PSAwKQorICAgIGZpbmRfc291cmNlX2xpbmVzIChzLCBkZXNjKTsKKworICBpZiAobGluZSA8IDEgfHwgbGluZSA+IHMtPm5saW5lcykKKyAgICB7CisgICAgICBjbG9zZSAoZGVzYyk7CisgICAgICBlcnJvciAoIkxpbmUgbnVtYmVyICVkIG91dCBvZiByYW5nZTsgJXMgaGFzICVkIGxpbmVzLiIsCisJICAgICBsaW5lLCBzLT5maWxlbmFtZSwgcy0+bmxpbmVzKTsKKyAgICB9CisKKyAgaWYgKGxzZWVrIChkZXNjLCBzLT5saW5lX2NoYXJwb3NbbGluZSAtIDFdLCAwKSA8IDApCisgICAgeworICAgICAgY2xvc2UgKGRlc2MpOworICAgICAgcGVycm9yX3dpdGhfbmFtZSAocy0+ZmlsZW5hbWUpOworICAgIH0KKworICBzdHJlYW0gPSBmZG9wZW4gKGRlc2MsIEZET1BFTl9NT0RFKTsKKyAgY2xlYXJlcnIgKHN0cmVhbSk7CisKKyAgd2hpbGUgKG5saW5lcy0tID4gMCkKKyAgICB7CisgICAgICBjID0gZmdldGMgKHN0cmVhbSk7CisgICAgICBpZiAoYyA9PSBFT0YpIGJyZWFrOworICAgICAgbGFzdF9saW5lX2xpc3RlZCA9IGN1cnJlbnRfc291cmNlX2xpbmU7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIlZFx0IiwgY3VycmVudF9zb3VyY2VfbGluZSsrKTsKKyAgICAgIGRvCisJeworCSAgaWYgKGMgPCAwNDAgJiYgYyAhPSAnXHQnICYmIGMgIT0gJ1xuJyAmJiBjICE9ICdccicpCisJICAgIHByaW50Zl9maWx0ZXJlZCAoIl4lYyIsIGMgKyAwMTAwKTsKKwkgIGVsc2UgaWYgKGMgPT0gMDE3NykKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgiXj8iKTsKKyNpZmRlZiBDUkxGX1NPVVJDRV9GSUxFUworCSAgZWxzZSBpZiAoYyA9PSAnXHInKQorCSAgICB7CisJICAgICAgLyogSnVzdCBza2lwIFxyIGNoYXJhY3RlcnMuICAqLworCSAgICB9CisjZW5kaWYKKwkgIGVsc2UKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgiJWMiLCBjKTsKKwl9IHdoaWxlIChjICE9ICdcbicgJiYgKGMgPSBmZ2V0YyAoc3RyZWFtKSkgPj0gMCk7CisgICAgfQorCisgIGZjbG9zZSAoc3RyZWFtKTsKK30KKwwKKy8qIFNob3cgc291cmNlIGxpbmVzIGZyb20gdGhlIGZpbGUgb2Ygc3ltdGFiIFMsIHN0YXJ0aW5nIHdpdGggbGluZQorICAgbnVtYmVyIExJTkUgYW5kIHN0b3BwaW5nIGJlZm9yZSBsaW5lIG51bWJlciBTVE9QTElORS4gIElmIHRoaXMgaXMgdGhlCisgICBub3QgdGhlIGNvbW1hbmQgbGluZSB2ZXJzaW9uLCB0aGVuIHRoZSBzb3VyY2UgaXMgc2hvd24gaW4gdGhlIHNvdXJjZQorICAgd2luZG93IG90aGVyd2lzZSBpdCBpcyBzaW1wbHkgcHJpbnRlZCAqLworCit2b2lkIAorcHJpbnRfc291cmNlX2xpbmVzIChzLCBsaW5lLCBzdG9wbGluZSwgbm9lcnJvcikKKyAgICBzdHJ1Y3Qgc3ltdGFiICpzOworICAgIGludCBsaW5lLCBzdG9wbGluZSwgbm9lcnJvcjsKK3sKKyNpZiBkZWZpbmVkKFRVSSkKKyAgaWYgKCF0dWlfdmVyc2lvbiB8fCAKKyAgICAgIG1fd2luUHRySXNOdWxsKHNyY1dpbikgfHwgIXNyY1dpbi0+Z2VuZXJpYy5pc1Zpc2libGUgKQorICAgIHByaW50X3NvdXJjZV9saW5lc19iYXNlKHMsIGxpbmUsIHN0b3BsaW5lLCBub2Vycm9yKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIFR1aUdlbldpbkluZm9QdHIgbG9jYXRvciA9IGxvY2F0b3JXaW5JbmZvUHRyKCk7CisgICAgICBleHRlcm4gdm9pZCB0dWlfdkFkZFdpblRvTGF5b3V0IFBBUkFNUyAoKHZhX2xpc3QpKTsKKyAgICAgIGV4dGVybiB2b2lkIHR1aV92VXBkYXRlU291cmNlV2luZG93c1dpdGhMaW5lIFBBUkFNUyAoKHZhX2xpc3QpKTsKKworICAgIC8qIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSBjYW4gb3BlbiB0aGUgZmlsZSwKKyAgICAgICBzZXQgY3VycmVudF9zb3VyY2Vfc3ltdGFiLiAqLworICAgIGN1cnJlbnRfc291cmNlX3N5bXRhYiA9IHM7CisgICAgY3VycmVudF9zb3VyY2VfbGluZSA9IGxpbmU7CisgICAgZmlyc3RfbGluZV9saXN0ZWQgPSBsaW5lOworCisgICAgLyogbWFrZSBzdXJlIHRoYXQgdGhlIHNvdXJjZSB3aW5kb3cgaXMgZGlzcGxheWVkICovCisgICAgdHVpRG8oKFR1aU9wYXF1ZUZ1bmNQdHIpdHVpX3ZBZGRXaW5Ub0xheW91dCwgU1JDX1dJTik7CisKKyAgICB0dWlEbygoVHVpT3BhcXVlRnVuY1B0cil0dWlfdlVwZGF0ZVNvdXJjZVdpbmRvd3NXaXRoTGluZSwgcywgbGluZSk7CisgICAgdHVpRG8oKFR1aU9wYXF1ZUZ1bmNQdHIpdHVpX3ZVcGRhdGVMb2NhdG9yRmlsZW5hbWUsIHMtPmZpbGVuYW1lKTsKKyAgfQorI2Vsc2UKKyAgcHJpbnRfc291cmNlX2xpbmVzX2Jhc2UocywgbGluZSwgc3RvcGxpbmUsIG5vZXJyb3IpOworI2VuZGlmCit9CisMCisKKworLyogUHJpbnQgYSBsaXN0IG9mIGZpbGVzIGFuZCBsaW5lIG51bWJlcnMgd2hpY2ggYSB1c2VyIG1heSBjaG9vc2UgZnJvbQorICBpbiBvcmRlciB0byBsaXN0IGEgZnVuY3Rpb24gd2hpY2ggd2FzIHNwZWNpZmllZCBhbWJpZ3VvdXNseSAoYXMgd2l0aAorICBgbGlzdCBjbGFzc25hbWU6Om92ZXJsb2FkZWRmdW5jbmFtZScsIGZvciBleGFtcGxlKS4gIFRoZSB2ZWN0b3IgaW4KKyAgU0FMUyBwcm92aWRlcyB0aGUgZmlsZW5hbWVzIGFuZCBsaW5lIG51bWJlcnMuICAqLworCitzdGF0aWMgdm9pZAorYW1iaWd1b3VzX2xpbmVfc3BlYyAoc2FscykKKyAgICAgc3RydWN0IHN5bXRhYnNfYW5kX2xpbmVzICpzYWxzOworeworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2Fscy0+bmVsdHM7ICsraSkKKyAgICBwcmludGZfZmlsdGVyZWQoImZpbGU6IFwiJXNcIiwgbGluZSBudW1iZXI6ICVkXG4iLAorCQkgICAgc2Fscy0+c2Fsc1tpXS5zeW10YWItPmZpbGVuYW1lLCBzYWxzLT5zYWxzW2ldLmxpbmUpOworfQorCitzdGF0aWMgdm9pZAorbGlzdF9jb21tYW5kIChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgc3RydWN0IHN5bXRhYnNfYW5kX2xpbmVzIHNhbHMsIHNhbHNfZW5kOworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbCwgc2FsX2VuZDsKKyAgc3RydWN0IHN5bWJvbCAqc3ltOworICBjaGFyICphcmcxOworICBpbnQgbm9fZW5kID0gMTsKKyAgaW50IGR1bW15X2VuZCA9IDA7CisgIGludCBkdW1teV9iZWcgPSAwOworICBpbnQgbGluZW51bV9iZWcgPSAwOworICBjaGFyICpwOworCisgIGlmICghaGF2ZV9mdWxsX3N5bWJvbHMgKCkgJiYgIWhhdmVfcGFydGlhbF9zeW1ib2xzKCkpCisgICAgZXJyb3IgKCJObyBzeW1ib2wgdGFibGUgaXMgbG9hZGVkLiAgVXNlIHRoZSBcImZpbGVcIiBjb21tYW5kLiIpOworCisgIC8qIFB1bGwgaW4gYSBjdXJyZW50IHNvdXJjZSBzeW10YWIgaWYgbmVjZXNzYXJ5ICovCisgIGlmIChjdXJyZW50X3NvdXJjZV9zeW10YWIgPT0gMCAmJgorICAgICAgKGFyZyA9PSAwIHx8IGFyZ1swXSA9PSAnKycgfHwgYXJnWzBdID09ICctJykpCisgICAgc2VsZWN0X3NvdXJjZV9zeW10YWIgKDApOworCisgIC8qICJsIiBvciAibCArIiBsaXN0cyBuZXh0IHRlbiBsaW5lcy4gICovCisKKyAgaWYgKGFyZyA9PSAwIHx8IFNUUkVRIChhcmcsICIrIikpCisgICAgeworICAgICAgaWYgKGN1cnJlbnRfc291cmNlX3N5bXRhYiA9PSAwKQorCWVycm9yICgiTm8gZGVmYXVsdCBzb3VyY2UgZmlsZSB5ZXQuICBEbyBcImhlbHAgbGlzdFwiLiIpOworICAgICAgcHJpbnRfc291cmNlX2xpbmVzIChjdXJyZW50X3NvdXJjZV9zeW10YWIsIGN1cnJlbnRfc291cmNlX2xpbmUsCisJCQkgIGN1cnJlbnRfc291cmNlX2xpbmUgKyBsaW5lc190b19saXN0LCAwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogImwgLSIgbGlzdHMgcHJldmlvdXMgdGVuIGxpbmVzLCB0aGUgb25lcyBiZWZvcmUgdGhlIHRlbiBqdXN0IGxpc3RlZC4gICovCisgIGlmIChTVFJFUSAoYXJnLCAiLSIpKQorICAgIHsKKyAgICAgIGlmIChjdXJyZW50X3NvdXJjZV9zeW10YWIgPT0gMCkKKwllcnJvciAoIk5vIGRlZmF1bHQgc291cmNlIGZpbGUgeWV0LiAgRG8gXCJoZWxwIGxpc3RcIi4iKTsKKyAgICAgIHByaW50X3NvdXJjZV9saW5lcyAoY3VycmVudF9zb3VyY2Vfc3ltdGFiLAorCQkJICBtYXggKGZpcnN0X2xpbmVfbGlzdGVkIC0gbGluZXNfdG9fbGlzdCwgMSksCisJCQkgIGZpcnN0X2xpbmVfbGlzdGVkLCAwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogTm93IGlmIHRoZXJlIGlzIG9ubHkgb25lIGFyZ3VtZW50LCBkZWNvZGUgaXQgaW4gU0FMCisgICAgIGFuZCBzZXQgTk9fRU5ELgorICAgICBJZiB0aGVyZSBhcmUgdHdvIGFyZ3VtZW50cywgZGVjb2RlIHRoZW0gaW4gU0FMIGFuZCBTQUxfRU5ECisgICAgIGFuZCBjbGVhciBOT19FTkQ7IGhvd2V2ZXIsIGlmIG9uZSBvZiB0aGUgYXJndW1lbnRzIGlzIGJsYW5rLAorICAgICBzZXQgRFVNTVlfQkVHIG9yIERVTU1ZX0VORCB0byByZWNvcmQgdGhhdCBmYWN0LiAgKi8KKworICBhcmcxID0gYXJnOworICBpZiAoKmFyZzEgPT0gJywnKQorICAgIGR1bW15X2JlZyA9IDE7CisgIGVsc2UKKyAgICB7CisgICAgICBzYWxzID0gZGVjb2RlX2xpbmVfMSAoJmFyZzEsIDAsIDAsIDAsIDApOworCisgICAgICBpZiAoISBzYWxzLm5lbHRzKSByZXR1cm47ICAvKiAgQysrICAqLworICAgICAgaWYgKHNhbHMubmVsdHMgPiAxKQorCXsKKwkgIGFtYmlndW91c19saW5lX3NwZWMgKCZzYWxzKTsKKwkgIGZyZWUgKHNhbHMuc2Fscyk7CisJICByZXR1cm47CisJfQorCisgICAgICBzYWwgPSBzYWxzLnNhbHNbMF07CisgICAgICBmcmVlIChzYWxzLnNhbHMpOworICAgIH0KKworICAvKiBSZWNvcmQgd2hldGhlciB0aGUgQkVHIGFyZyBpcyBhbGwgZGlnaXRzLiAgKi8KKworICBmb3IgKHAgPSBhcmc7IHAgIT0gYXJnMSAmJiAqcCA+PSAnMCcgJiYgKnAgPD0gJzknOyBwKyspOworICBsaW5lbnVtX2JlZyA9IChwID09IGFyZzEpOworCisgIHdoaWxlICgqYXJnMSA9PSAnICcgfHwgKmFyZzEgPT0gJ1x0JykKKyAgICBhcmcxKys7CisgIGlmICgqYXJnMSA9PSAnLCcpCisgICAgeworICAgICAgbm9fZW5kID0gMDsKKyAgICAgIGFyZzErKzsKKyAgICAgIHdoaWxlICgqYXJnMSA9PSAnICcgfHwgKmFyZzEgPT0gJ1x0JykKKwlhcmcxKys7CisgICAgICBpZiAoKmFyZzEgPT0gMCkKKwlkdW1teV9lbmQgPSAxOworICAgICAgZWxzZQorCXsKKwkgIGlmIChkdW1teV9iZWcpCisJICAgIHNhbHNfZW5kID0gZGVjb2RlX2xpbmVfMSAoJmFyZzEsIDAsIDAsIDAsIDApOworCSAgZWxzZQorCSAgICBzYWxzX2VuZCA9IGRlY29kZV9saW5lXzEgKCZhcmcxLCAwLCBzYWwuc3ltdGFiLCBzYWwubGluZSwgMCk7CisJICBpZiAoc2Fsc19lbmQubmVsdHMgPT0gMCkgCisJICAgIHJldHVybjsKKwkgIGlmIChzYWxzX2VuZC5uZWx0cyA+IDEpCisJICAgIHsKKwkgICAgICBhbWJpZ3VvdXNfbGluZV9zcGVjICgmc2Fsc19lbmQpOworCSAgICAgIGZyZWUgKHNhbHNfZW5kLnNhbHMpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgc2FsX2VuZCA9IHNhbHNfZW5kLnNhbHNbMF07CisJICBmcmVlIChzYWxzX2VuZC5zYWxzKTsKKwl9CisgICAgfQorCisgIGlmICgqYXJnMSkKKyAgICBlcnJvciAoIkp1bmsgYXQgZW5kIG9mIGxpbmUgc3BlY2lmaWNhdGlvbi4iKTsKKworICBpZiAoIW5vX2VuZCAmJiAhZHVtbXlfYmVnICYmICFkdW1teV9lbmQKKyAgICAgICYmIHNhbC5zeW10YWIgIT0gc2FsX2VuZC5zeW10YWIpCisgICAgZXJyb3IgKCJTcGVjaWZpZWQgc3RhcnQgYW5kIGVuZCBhcmUgaW4gZGlmZmVyZW50IGZpbGVzLiIpOworICBpZiAoZHVtbXlfYmVnICYmIGR1bW15X2VuZCkKKyAgICBlcnJvciAoIlR3byBlbXB0eSBhcmdzIGRvIG5vdCBzYXkgd2hhdCBsaW5lcyB0byBsaXN0LiIpOworIAorICAvKiBpZiBsaW5lIHdhcyBzcGVjaWZpZWQgYnkgYWRkcmVzcywKKyAgICAgZmlyc3QgcHJpbnQgZXhhY3RseSB3aGljaCBsaW5lLCBhbmQgd2hpY2ggZmlsZS4KKyAgICAgSW4gdGhpcyBjYXNlLCBzYWwuc3ltdGFiID09IDAgbWVhbnMgYWRkcmVzcyBpcyBvdXRzaWRlCisgICAgIG9mIGFsbCBrbm93biBzb3VyY2UgZmlsZXMsIG5vdCB0aGF0IHVzZXIgZmFpbGVkIHRvIGdpdmUgYSBmaWxlbmFtZS4gICovCisgIGlmICgqYXJnID09ICcqJykKKyAgICB7CisgICAgICBpZiAoc2FsLnN5bXRhYiA9PSAwKQorCS8qIEZJWE1FLTMyeDY0LS1hc3N1bWVzIHNhbC5wYyBmaXRzIGluIGxvbmcuICAqLworCWVycm9yICgiTm8gc291cmNlIGZpbGUgZm9yIGFkZHJlc3MgJXMuIiwKKwkJbG9jYWxfaGV4X3N0cmluZygodW5zaWduZWQgbG9uZykgc2FsLnBjKSk7CisgICAgICBzeW0gPSBmaW5kX3BjX2Z1bmN0aW9uIChzYWwucGMpOworICAgICAgaWYgKHN5bSkKKwl7CisJICBwcmludF9hZGRyZXNzX251bWVyaWMgKHNhbC5wYywgMSwgZ2RiX3N0ZG91dCk7CisJICBwcmludGZfZmlsdGVyZWQgKCIgaXMgaW4gIik7CisJICBmcHV0c19maWx0ZXJlZCAoU1lNQk9MX1NPVVJDRV9OQU1FIChzeW0pLCBnZGJfc3Rkb3V0KTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIiAoJXM6JWQpLlxuIiwgc2FsLnN5bXRhYi0+ZmlsZW5hbWUsIHNhbC5saW5lKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcHJpbnRfYWRkcmVzc19udW1lcmljIChzYWwucGMsIDEsIGdkYl9zdGRvdXQpOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiIGlzIGF0ICVzOiVkLlxuIiwKKwkJCSAgIHNhbC5zeW10YWItPmZpbGVuYW1lLCBzYWwubGluZSk7CisJfQorICAgIH0KKworICAvKiBJZiBsaW5lIHdhcyBub3Qgc3BlY2lmaWVkIGJ5IGp1c3QgYSBsaW5lIG51bWJlciwKKyAgICAgYW5kIGl0IGRvZXMgbm90IGltcGx5IGEgc3ltdGFiLCBpdCBtdXN0IGJlIGFuIHVuZGVidWdnYWJsZSBzeW1ib2wKKyAgICAgd2hpY2ggbWVhbnMgbm8gc291cmNlIGNvZGUuICAqLworCisgIGlmICghIGxpbmVudW1fYmVnICYmIHNhbC5zeW10YWIgPT0gMCkKKyAgICBlcnJvciAoIk5vIGxpbmUgbnVtYmVyIGtub3duIGZvciAlcy4iLCBhcmcpOworCisgIC8qIElmIHRoaXMgY29tbWFuZCBpcyByZXBlYXRlZCB3aXRoIFJFVCwKKyAgICAgdHVybiBpdCBpbnRvIHRoZSBuby1hcmcgdmFyaWFudC4gICovCisKKyAgaWYgKGZyb21fdHR5KQorICAgICphcmcgPSAwOworCisgIGlmIChkdW1teV9iZWcgJiYgc2FsX2VuZC5zeW10YWIgPT0gMCkKKyAgICBlcnJvciAoIk5vIGRlZmF1bHQgc291cmNlIGZpbGUgeWV0LiAgRG8gXCJoZWxwIGxpc3RcIi4iKTsKKyAgaWYgKGR1bW15X2JlZykKKyAgICBwcmludF9zb3VyY2VfbGluZXMgKHNhbF9lbmQuc3ltdGFiLAorCQkJbWF4IChzYWxfZW5kLmxpbmUgLSAobGluZXNfdG9fbGlzdCAtIDEpLCAxKSwKKwkJCXNhbF9lbmQubGluZSArIDEsIDApOworICBlbHNlIGlmIChzYWwuc3ltdGFiID09IDApCisgICAgZXJyb3IgKCJObyBkZWZhdWx0IHNvdXJjZSBmaWxlIHlldC4gIERvIFwiaGVscCBsaXN0XCIuIik7CisgIGVsc2UgaWYgKG5vX2VuZCkKKyAgICBpZiAobGluZXNfdG9fbGlzdCAlIDIgPT0gMCkgCisgICAgICBwcmludF9zb3VyY2VfbGluZXMgKHNhbC5zeW10YWIsCisJCQkgIG1heCAoc2FsLmxpbmUgLSAobGluZXNfdG9fbGlzdCAvIDIpLCAxKSwKKwkJCSAgc2FsLmxpbmUgKyAobGluZXNfdG9fbGlzdCAvIDIpLCAwKTsKKyAgICBlbHNlCisgICAgICAvKiBJZiBsaW5lc190b19saXN0IGlzIG9kZCwgdGhlbiB3ZSByb3VuZCBkb3duIGluCisgICAgICAgKiBvbmUgb2YgdGhlIGxpbmVzX3RvX2xpc3QvMiBjb21wdXRhdGlvbnMsIHJvdW5kIHVwIGluCisgICAgICAgKiB0aGUgb3RoZXIsIHNvIHRoZSB0b3RhbCB3aW5kb3cgc2l6ZSBhcm91bmQgdGhlIHNwZWNpZmllZAorICAgICAgICogbGluZSBjb21lcyBvdXQgcmlnaHQuCisgICAgICAgKi8KKyAgICAgIHByaW50X3NvdXJjZV9saW5lcyAoc2FsLnN5bXRhYiwKKwkJCW1heCAoc2FsLmxpbmUgLSAobGluZXNfdG9fbGlzdCAvIDIpLCAxKSwKKwkJCXNhbC5saW5lICsgKCgxK2xpbmVzX3RvX2xpc3QpIC8gMiksIDApOworICBlbHNlCisgICAgcHJpbnRfc291cmNlX2xpbmVzIChzYWwuc3ltdGFiLCBzYWwubGluZSwKKwkJCShkdW1teV9lbmQKKwkJCSA/IHNhbC5saW5lICsgbGluZXNfdG9fbGlzdAorCQkJIDogc2FsX2VuZC5saW5lICsgMSksCisJCQkwKTsKK30KKwwKKy8qIFByaW50IGluZm8gb24gcmFuZ2Ugb2YgcGMncyBpbiBhIHNwZWNpZmllZCBsaW5lLiAgKi8KKworc3RhdGljIHZvaWQKK2xpbmVfaW5mbyAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCBzeW10YWJzX2FuZF9saW5lcyBzYWxzOworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKyAgQ09SRV9BRERSIHN0YXJ0X3BjLCBlbmRfcGM7CisgIGludCBpOworCisgIElOSVRfU0FMICgmc2FsKTsJLyogaW5pdGlhbGl6ZSB0byB6ZXJvZXMgKi8KKworICBpZiAoYXJnID09IDApCisgICAgeworICAgICAgc2FsLnN5bXRhYiA9IGN1cnJlbnRfc291cmNlX3N5bXRhYjsKKyAgICAgIHNhbC5saW5lID0gbGFzdF9saW5lX2xpc3RlZDsKKyAgICAgIHNhbHMubmVsdHMgPSAxOworICAgICAgc2Fscy5zYWxzID0gKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgKikKKwl4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUpKTsKKyAgICAgIHNhbHMuc2Fsc1swXSA9IHNhbDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzYWxzID0gZGVjb2RlX2xpbmVfc3BlY18xIChhcmcsIDApOworICAgICAgCisgICAgICBkb250X3JlcGVhdCAoKTsKKyAgICB9CisKKyAgLyogQysrICBNb3JlIHRoYW4gb25lIGxpbmUgbWF5IGhhdmUgYmVlbiBzcGVjaWZpZWQsIGFzIHdoZW4gdGhlIHVzZXIKKyAgICAgc3BlY2lmaWVzIGFuIG92ZXJsb2FkZWQgZnVuY3Rpb24gbmFtZS4gUHJpbnQgaW5mbyBvbiB0aGVtIGFsbC4gKi8KKyAgZm9yIChpID0gMDsgaSA8IHNhbHMubmVsdHM7IGkrKykKKyAgICB7CisgICAgICBzYWwgPSBzYWxzLnNhbHNbaV07CisgICAgICAKKyAgICAgIGlmIChzYWwuc3ltdGFiID09IDApCisJeworCSAgcHJpbnRmX2ZpbHRlcmVkICgiTm8gbGluZSBudW1iZXIgaW5mb3JtYXRpb24gYXZhaWxhYmxlIik7CisJICBpZiAoc2FsLnBjICE9IDApCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGlzIHVzZWZ1bCBmb3IgImluZm8gbGluZSAqMHg3ZjM0Ii4gIElmIHdlIGNhbid0IHRlbGwgdGhlCisJCSB1c2VyIGFib3V0IGEgc291cmNlIGxpbmUsIGF0IGxlYXN0IGxldCB0aGVtIGhhdmUgdGhlIHN5bWJvbGljCisJCSBhZGRyZXNzLiAgKi8KKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCIgZm9yIGFkZHJlc3MgIik7CisJICAgICAgd3JhcF9oZXJlICgiICAiKTsKKwkgICAgICBwcmludF9hZGRyZXNzIChzYWwucGMsIGdkYl9zdGRvdXQpOworCSAgICB9CisJICBlbHNlCisJICAgIHByaW50Zl9maWx0ZXJlZCAoIi4iKTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisJfQorICAgICAgZWxzZSBpZiAoc2FsLmxpbmUgPiAwCisJICAgICAgICYmIGZpbmRfbGluZV9wY19yYW5nZSAoc2FsLCAmc3RhcnRfcGMsICZlbmRfcGMpKQorCXsKKwkgIGlmIChzdGFydF9wYyA9PSBlbmRfcGMpCisJICAgIHsKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCJMaW5lICVkIG9mIFwiJXNcIiIsCisJCQkgICAgICAgc2FsLmxpbmUsIHNhbC5zeW10YWItPmZpbGVuYW1lKTsKKwkgICAgICB3cmFwX2hlcmUgKCIgICIpOworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiBpcyBhdCBhZGRyZXNzICIpOworCSAgICAgIHByaW50X2FkZHJlc3MgKHN0YXJ0X3BjLCBnZGJfc3Rkb3V0KTsKKwkgICAgICB3cmFwX2hlcmUgKCIgICIpOworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiBidXQgY29udGFpbnMgbm8gY29kZS5cbiIpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCJMaW5lICVkIG9mIFwiJXNcIiIsCisJCQkgICAgICAgc2FsLmxpbmUsIHNhbC5zeW10YWItPmZpbGVuYW1lKTsKKwkgICAgICB3cmFwX2hlcmUgKCIgICIpOworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiBzdGFydHMgYXQgYWRkcmVzcyAiKTsKKwkgICAgICBwcmludF9hZGRyZXNzIChzdGFydF9wYywgZ2RiX3N0ZG91dCk7CisJICAgICAgd3JhcF9oZXJlICgiICAiKTsKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCIgYW5kIGVuZHMgYXQgIik7CisJICAgICAgcHJpbnRfYWRkcmVzcyAoZW5kX3BjLCBnZGJfc3Rkb3V0KTsKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCIuXG4iKTsKKwkgICAgfQorCisJICAvKiB4L2kgc2hvdWxkIGRpc3BsYXkgdGhpcyBsaW5lJ3MgY29kZS4gICovCisJICBzZXRfbmV4dF9hZGRyZXNzIChzdGFydF9wYyk7CisKKwkgIC8qIFJlcGVhdGluZyAiaW5mbyBsaW5lIiBzaG91bGQgZG8gdGhlIGZvbGxvd2luZyBsaW5lLiAgKi8KKwkgIGxhc3RfbGluZV9saXN0ZWQgPSBzYWwubGluZSArIDE7CisKKwkgIC8qIElmIHRoaXMgaXMgdGhlIG9ubHkgbGluZSwgc2hvdyB0aGUgc291cmNlIGNvZGUuICBJZiBpdCBjb3VsZAorCSAgICAgbm90IGZpbmQgdGhlIGZpbGUsIGRvbid0IGRvIGFueXRoaW5nIHNwZWNpYWwuICAqLworCSAgaWYgKGFubm90YXRpb25fbGV2ZWwgJiYgc2Fscy5uZWx0cyA9PSAxKQorCSAgICBpZGVudGlmeV9zb3VyY2VfbGluZSAoc2FsLnN5bXRhYiwgc2FsLmxpbmUsIDAsIHN0YXJ0X3BjKTsKKwl9CisgICAgICBlbHNlCisJLyogSXMgdGhlcmUgYW55IGNhc2UgaW4gd2hpY2ggd2UgZ2V0IGhlcmUsIGFuZCBoYXZlIGFuIGFkZHJlc3MKKwkgICB3aGljaCB0aGUgdXNlciB3b3VsZCB3YW50IHRvIHNlZT8gIElmIHdlIGhhdmUgZGVidWdnaW5nIHN5bWJvbHMKKwkgICBhbmQgbm8gbGluZSBudW1iZXJzPyAgKi8KKwlwcmludGZfZmlsdGVyZWQgKCJMaW5lIG51bWJlciAlZCBpcyBvdXQgb2YgcmFuZ2UgZm9yIFwiJXNcIi5cbiIsCisJCQkgc2FsLmxpbmUsIHNhbC5zeW10YWItPmZpbGVuYW1lKTsKKyAgICB9CisgIGZyZWUgKHNhbHMuc2Fscyk7Cit9CisMCisvKiBDb21tYW5kcyB0byBzZWFyY2ggdGhlIHNvdXJjZSBmaWxlIGZvciBhIHJlZ2V4cC4gICovCisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorZm9yd2FyZF9zZWFyY2hfY29tbWFuZCAocmVnZXgsIGZyb21fdHR5KQorICAgICBjaGFyICpyZWdleDsKKyAgICAgaW50IGZyb21fdHR5OworeworICByZWdpc3RlciBpbnQgYzsKKyAgcmVnaXN0ZXIgaW50IGRlc2M7CisgIHJlZ2lzdGVyIEZJTEUgKnN0cmVhbTsKKyAgaW50IGxpbmU7CisgIGNoYXIgKm1zZzsKKworI2lmIGRlZmluZWQoVFVJKQorICAvKiAKKyAgKiogSWYgdGhpcyBpcyB0aGUgVFVJLCBzZWFyY2ggZnJvbSB0aGUgZmlyc3QgbGluZSBkaXNwbGF5ZWQgaW4gCisgICoqIHRoZSBzb3VyY2Ugd2luZG93LCBvdGhlcndpc2UsIHNlYXJjaCBmcm9tIGxhc3RfbGluZV9saXN0ZWQrMSAKKyAgKiogaW4gY3VycmVudF9zb3VyY2Vfc3ltdGFiIAorICAqLworICBpZiAoIXR1aV92ZXJzaW9uKQorICAgIGxpbmUgPSBsYXN0X2xpbmVfbGlzdGVkOworICBlbHNlCisgICAgeworICAgICAgaWYgKHNyY1dpbi0+Z2VuZXJpYy5pc1Zpc2libGUgJiYgc3JjV2luLT5nZW5lcmljLmNvbnRlbnRTaXplID4gMCkKKyAgICAgICAgbGluZSA9ICgoVHVpV2luQ29udGVudCkKKyAgICAgICAgICAgIHNyY1dpbi0+Z2VuZXJpYy5jb250ZW50KVswXS0+d2hpY2hFbGVtZW50LnNvdXJjZS5saW5lT3JBZGRyLmxpbmVObzsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHByaW50Zl9maWx0ZXJlZCgiTm8gc291cmNlIGRpc3BsYXllZC5cbkV4cHJlc3Npb24gbm90IGZvdW5kLlxuIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICBsaW5lKys7CisjZWxzZQorICBsaW5lID0gbGFzdF9saW5lX2xpc3RlZCArIDE7CisjZW5kaWYKKworICBtc2cgPSAoY2hhciAqKSByZV9jb21wIChyZWdleCk7CisgIGlmIChtc2cpCisgICAgZXJyb3IgKG1zZyk7CisKKyAgaWYgKGN1cnJlbnRfc291cmNlX3N5bXRhYiA9PSAwKQorICAgIHNlbGVjdF9zb3VyY2Vfc3ltdGFiICgwKTsKKworICBkZXNjID0gb3Blbl9zb3VyY2VfZmlsZSAoY3VycmVudF9zb3VyY2Vfc3ltdGFiKTsKKyAgaWYgKGRlc2MgPCAwKQorICAgIHBlcnJvcl93aXRoX25hbWUgKGN1cnJlbnRfc291cmNlX3N5bXRhYi0+ZmlsZW5hbWUpOworCisgIGlmIChjdXJyZW50X3NvdXJjZV9zeW10YWItPmxpbmVfY2hhcnBvcyA9PSAwKQorICAgIGZpbmRfc291cmNlX2xpbmVzIChjdXJyZW50X3NvdXJjZV9zeW10YWIsIGRlc2MpOworCisgIGlmIChsaW5lIDwgMSB8fCBsaW5lID4gY3VycmVudF9zb3VyY2Vfc3ltdGFiLT5ubGluZXMpCisgICAgeworICAgICAgY2xvc2UgKGRlc2MpOworICAgICAgZXJyb3IgKCJFeHByZXNzaW9uIG5vdCBmb3VuZCIpOworICAgIH0KKworICBpZiAobHNlZWsgKGRlc2MsIGN1cnJlbnRfc291cmNlX3N5bXRhYi0+bGluZV9jaGFycG9zW2xpbmUgLSAxXSwgMCkgPCAwKQorICAgIHsKKyAgICAgIGNsb3NlIChkZXNjKTsKKyAgICAgIHBlcnJvcl93aXRoX25hbWUgKGN1cnJlbnRfc291cmNlX3N5bXRhYi0+ZmlsZW5hbWUpOworICAgIH0KKworICBzdHJlYW0gPSBmZG9wZW4gKGRlc2MsIEZET1BFTl9NT0RFKTsKKyAgY2xlYXJlcnIgKHN0cmVhbSk7CisgIHdoaWxlICgxKSB7CisgICAgc3RhdGljIGNoYXIgKmJ1ZiA9IE5VTEw7CisgICAgcmVnaXN0ZXIgY2hhciAqcDsKKyAgICBpbnQgY3Vyc2l6ZSwgbmV3c2l6ZTsKKworICAgIGN1cnNpemUgPSAyNTY7CisgICAgYnVmID0geG1hbGxvYyAoY3Vyc2l6ZSk7CisgICAgcCA9IGJ1ZjsKKworICAgIGMgPSBnZXRjIChzdHJlYW0pOworICAgIGlmIChjID09IEVPRikKKyAgICAgIGJyZWFrOworICAgIGRvIHsKKyAgICAgICpwKysgPSBjOworICAgICAgaWYgKHAgLSBidWYgPT0gY3Vyc2l6ZSkKKwl7CisJICBuZXdzaXplID0gY3Vyc2l6ZSArIGN1cnNpemUgLyAyOworCSAgYnVmID0geHJlYWxsb2MgKGJ1ZiwgbmV3c2l6ZSk7CisJICBwID0gYnVmICsgY3Vyc2l6ZTsKKwkgIGN1cnNpemUgPSBuZXdzaXplOworCX0KKyAgICB9IHdoaWxlIChjICE9ICdcbicgJiYgKGMgPSBnZXRjIChzdHJlYW0pKSA+PSAwKTsKKworICAgIC8qIHdlIG5vdyBoYXZlIGEgc291cmNlIGxpbmUgaW4gYnVmLCBudWxsIHRlcm1pbmF0ZSBhbmQgbWF0Y2ggKi8KKyAgICAqcCA9IDA7CisgICAgaWYgKHJlX2V4ZWMgKGJ1ZikgPiAwKQorICAgICAgeworCS8qIE1hdGNoISAqLworCWZjbG9zZSAoc3RyZWFtKTsKKwlpZiAodHVpX3ZlcnNpb24pCisgICAgICAgICAgcHJpbnRfc291cmNlX2xpbmVzX2Jhc2UgKGN1cnJlbnRfc291cmNlX3N5bXRhYiwgbGluZSwgbGluZSsxLCAwKTsKKwlwcmludF9zb3VyY2VfbGluZXMgKGN1cnJlbnRfc291cmNlX3N5bXRhYiwgbGluZSwgbGluZSsxLCAwKTsKKwlzZXRfaW50ZXJuYWx2YXIgKGxvb2t1cF9pbnRlcm5hbHZhciAoIl8iKSwKKwkJCSB2YWx1ZV9mcm9tX2xvbmdlc3QgKGJ1aWx0aW5fdHlwZV9pbnQsCisJCQkJCSAgICAgKExPTkdFU1QpIGxpbmUpKTsKKwljdXJyZW50X3NvdXJjZV9saW5lID0gbWF4IChsaW5lIC0gbGluZXNfdG9fbGlzdCAvIDIsIDEpOworCXJldHVybjsKKyAgICAgIH0KKyAgICBsaW5lKys7CisgIH0KKworICBwcmludGZfZmlsdGVyZWQgKCJFeHByZXNzaW9uIG5vdCBmb3VuZFxuIik7CisgIGZjbG9zZSAoc3RyZWFtKTsKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCityZXZlcnNlX3NlYXJjaF9jb21tYW5kIChyZWdleCwgZnJvbV90dHkpCisgICAgIGNoYXIgKnJlZ2V4OworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHJlZ2lzdGVyIGludCBjOworICByZWdpc3RlciBpbnQgZGVzYzsKKyAgcmVnaXN0ZXIgRklMRSAqc3RyZWFtOworICBpbnQgbGluZTsKKyAgY2hhciAqbXNnOworI2lmIGRlZmluZWQoVFVJKQorICAvKgorICAqKiBJZiB0aGlzIGlzIHRoZSBUVUksIHNlYXJjaCBmcm9tIHRoZSBmaXJzdCBsaW5lIGRpc3BsYXllZCBpbgorICAqKiB0aGUgc291cmNlIHdpbmRvdywgb3RoZXJ3aXNlLCBzZWFyY2ggZnJvbSBsYXN0X2xpbmVfbGlzdGVkLTEKKyAgKiogaW4gY3VycmVudF9zb3VyY2Vfc3ltdGFiCisgICovCisgIGlmICghdHVpX3ZlcnNpb24pCisgICAgbGluZSA9IGxhc3RfbGluZV9saXN0ZWQ7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoc3JjV2luLT5nZW5lcmljLmlzVmlzaWJsZSAmJiBzcmNXaW4tPmdlbmVyaWMuY29udGVudFNpemUgPiAwKQorICAgICAgICBsaW5lID0gKChUdWlXaW5Db250ZW50KQorICAgICAgICAgICAgc3JjV2luLT5nZW5lcmljLmNvbnRlbnQpWzBdLT53aGljaEVsZW1lbnQuc291cmNlLmxpbmVPckFkZHIubGluZU5vOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmX2ZpbHRlcmVkKCJObyBzb3VyY2UgZGlzcGxheWVkLlxuRXhwcmVzc2lvbiBub3QgZm91bmQuXG4iKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgIGxpbmUtLTsKKyNlbHNlCisgIGxpbmUgPSBsYXN0X2xpbmVfbGlzdGVkIC0gMTsKKyNlbmRpZgorCisgIG1zZyA9IChjaGFyICopIHJlX2NvbXAgKHJlZ2V4KTsKKyAgaWYgKG1zZykKKyAgICBlcnJvciAobXNnKTsKKworICBpZiAoY3VycmVudF9zb3VyY2Vfc3ltdGFiID09IDApCisgICAgc2VsZWN0X3NvdXJjZV9zeW10YWIgKDApOworCisgIGRlc2MgPSBvcGVuX3NvdXJjZV9maWxlIChjdXJyZW50X3NvdXJjZV9zeW10YWIpOworICBpZiAoZGVzYyA8IDApCisgICAgcGVycm9yX3dpdGhfbmFtZSAoY3VycmVudF9zb3VyY2Vfc3ltdGFiLT5maWxlbmFtZSk7CisKKyAgaWYgKGN1cnJlbnRfc291cmNlX3N5bXRhYi0+bGluZV9jaGFycG9zID09IDApCisgICAgZmluZF9zb3VyY2VfbGluZXMgKGN1cnJlbnRfc291cmNlX3N5bXRhYiwgZGVzYyk7CisKKyAgaWYgKGxpbmUgPCAxIHx8IGxpbmUgPiBjdXJyZW50X3NvdXJjZV9zeW10YWItPm5saW5lcykKKyAgICB7CisgICAgICBjbG9zZSAoZGVzYyk7CisgICAgICBlcnJvciAoIkV4cHJlc3Npb24gbm90IGZvdW5kIik7CisgICAgfQorCisgIGlmIChsc2VlayAoZGVzYywgY3VycmVudF9zb3VyY2Vfc3ltdGFiLT5saW5lX2NoYXJwb3NbbGluZSAtIDFdLCAwKSA8IDApCisgICAgeworICAgICAgY2xvc2UgKGRlc2MpOworICAgICAgcGVycm9yX3dpdGhfbmFtZSAoY3VycmVudF9zb3VyY2Vfc3ltdGFiLT5maWxlbmFtZSk7CisgICAgfQorCisgIHN0cmVhbSA9IGZkb3BlbiAoZGVzYywgRkRPUEVOX01PREUpOworICBjbGVhcmVyciAoc3RyZWFtKTsKKyAgd2hpbGUgKGxpbmUgPiAxKQorICAgIHsKKy8qIEZJWE1FISEhICBXZSB3YWxrIHJpZ2h0IG9mZiB0aGUgZW5kIG9mIGJ1ZiBpZiB3ZSBnZXQgYSBsb25nIGxpbmUhISEgKi8KKyAgICAgIGNoYXIgYnVmWzQwOTZdOwkJLyogU2hvdWxkIGJlIHJlYXNvbmFibGU/Pz8gKi8KKyAgICAgIHJlZ2lzdGVyIGNoYXIgKnAgPSBidWY7CisKKyAgICAgIGMgPSBnZXRjIChzdHJlYW0pOworICAgICAgaWYgKGMgPT0gRU9GKQorCWJyZWFrOworICAgICAgZG8geworCSpwKysgPSBjOworICAgICAgfSB3aGlsZSAoYyAhPSAnXG4nICYmIChjID0gZ2V0YyAoc3RyZWFtKSkgPj0gMCk7CisKKyAgICAgIC8qIFdlIG5vdyBoYXZlIGEgc291cmNlIGxpbmUgaW4gYnVmOyBudWxsIHRlcm1pbmF0ZSBhbmQgbWF0Y2guICAqLworICAgICAgKnAgPSAwOworICAgICAgaWYgKHJlX2V4ZWMgKGJ1ZikgPiAwKQorCXsKKwkgIC8qIE1hdGNoISAqLworCSAgZmNsb3NlIChzdHJlYW0pOworICAgICAgICAgIGlmICh0dWlfdmVyc2lvbikKKyAgICAgICAgICAgIHByaW50X3NvdXJjZV9saW5lc19iYXNlIChjdXJyZW50X3NvdXJjZV9zeW10YWIsIGxpbmUsIGxpbmUrMSwgMCk7CisJICBwcmludF9zb3VyY2VfbGluZXMgKGN1cnJlbnRfc291cmNlX3N5bXRhYiwgbGluZSwgbGluZSsxLCAwKTsKKwkgIHNldF9pbnRlcm5hbHZhciAobG9va3VwX2ludGVybmFsdmFyICgiXyIpLAorCQkJICAgdmFsdWVfZnJvbV9sb25nZXN0IChidWlsdGluX3R5cGVfaW50LAorCQkJCQkgICAgICAgKExPTkdFU1QpIGxpbmUpKTsKKwkgIGN1cnJlbnRfc291cmNlX2xpbmUgPSBtYXggKGxpbmUgLSBsaW5lc190b19saXN0IC8gMiwgMSk7CisJICByZXR1cm47CisJfQorICAgICAgbGluZS0tOworICAgICAgaWYgKGZzZWVrIChzdHJlYW0sIGN1cnJlbnRfc291cmNlX3N5bXRhYi0+bGluZV9jaGFycG9zW2xpbmUgLSAxXSwgMCkgPCAwKQorCXsKKwkgIGZjbG9zZSAoc3RyZWFtKTsKKwkgIHBlcnJvcl93aXRoX25hbWUgKGN1cnJlbnRfc291cmNlX3N5bXRhYi0+ZmlsZW5hbWUpOworCX0KKyAgICB9CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiRXhwcmVzc2lvbiBub3QgZm91bmRcbiIpOworICBmY2xvc2UgKHN0cmVhbSk7CisgIHJldHVybjsKK30KKwwKK3ZvaWQKK19pbml0aWFsaXplX3NvdXJjZSAoKQoreworICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqYzsKKyAgY3VycmVudF9zb3VyY2Vfc3ltdGFiID0gMDsKKyAgaW5pdF9zb3VyY2VfcGF0aCAoKTsKKworICAvKiBUaGUgaW50ZW50aW9uIGlzIHRvIHVzZSBQT1NJWCBCYXNpYyBSZWd1bGFyIEV4cHJlc3Npb25zLgorICAgICBBbHdheXMgdXNlIHRoZSBHTlUgcmVnZXggcm91dGluZSBmb3IgY29uc2lzdGVuY3kgYWNyb3NzIGFsbCBob3N0cy4KKyAgICAgT3VyIGN1cnJlbnQgR05VIHJlZ2V4LmMgZG9lcyBub3QgaGF2ZSBhbGwgdGhlIFBPU0lYIGZlYXR1cmVzLCBzbyB0aGlzIGlzCisgICAgIGp1c3QgYW4gYXBwcm94aW1hdGlvbi4gICovCisgIHJlX3NldF9zeW50YXggKFJFX1NZTlRBWF9HUkVQKTsKKworICBjID0gYWRkX2NtZCAoImRpcmVjdG9yeSIsIGNsYXNzX2ZpbGVzLCBkaXJlY3RvcnlfY29tbWFuZCwKKwkgICAiQWRkIGRpcmVjdG9yeSBESVIgdG8gYmVnaW5uaW5nIG9mIHNlYXJjaCBwYXRoIGZvciBzb3VyY2UgZmlsZXMuXG5cCitGb3JnZXQgY2FjaGVkIGluZm8gb24gc291cmNlIGZpbGUgbG9jYXRpb25zIGFuZCBsaW5lIHBvc2l0aW9ucy5cblwKK0RJUiBjYW4gYWxzbyBiZSAkY3dkIGZvciB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgb3IgJGNkaXIgZm9yIHRoZVxuXAorZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBzb3VyY2UgZmlsZSB3YXMgY29tcGlsZWQgaW50byBvYmplY3QgY29kZS5cblwKK1dpdGggbm8gYXJndW1lbnQsIHJlc2V0IHRoZSBzZWFyY2ggcGF0aCB0byAkY2RpcjokY3dkLCB0aGUgZGVmYXVsdC4iLAorCSAgICAgICAmY21kbGlzdCk7CisKKyAgaWYgKGRieF9jb21tYW5kcykKKyAgICBhZGRfY29tX2FsaWFzKCJ1c2UiLCAiZGlyZWN0b3J5IiwgY2xhc3NfZmlsZXMsIDApOworCisgIGMtPmNvbXBsZXRlciA9IGZpbGVuYW1lX2NvbXBsZXRlcjsKKworICBhZGRfY21kICgiZGlyZWN0b3JpZXMiLCBub19jbGFzcywgc2hvd19kaXJlY3RvcmllcywKKwkgICAiQ3VycmVudCBzZWFyY2ggcGF0aCBmb3IgZmluZGluZyBzb3VyY2UgZmlsZXMuXG5cCiskY3dkIGluIHRoZSBwYXRoIG1lYW5zIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LlxuXAorJGNkaXIgaW4gdGhlIHBhdGggbWVhbnMgdGhlIGNvbXBpbGF0aW9uIGRpcmVjdG9yeSBvZiB0aGUgc291cmNlIGZpbGUuIiwKKwkgICAmc2hvd2xpc3QpOworCisgIGlmICh4ZGJfY29tbWFuZHMpCisgICAgeworICAgICAgYWRkX2NvbV9hbGlhcygiRCIsICJkaXJlY3RvcnkiLCBjbGFzc19maWxlcywgMCk7CisgICAgICBhZGRfY21kICgibGQiLCBub19jbGFzcywgc2hvd19kaXJlY3RvcmllcywKKwkgICAiQ3VycmVudCBzZWFyY2ggcGF0aCBmb3IgZmluZGluZyBzb3VyY2UgZmlsZXMuXG5cCiskY3dkIGluIHRoZSBwYXRoIG1lYW5zIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LlxuXAorJGNkaXIgaW4gdGhlIHBhdGggbWVhbnMgdGhlIGNvbXBpbGF0aW9uIGRpcmVjdG9yeSBvZiB0aGUgc291cmNlIGZpbGUuIiwKKwkgICAmY21kbGlzdCk7CisgICAgfQorCisgIGFkZF9pbmZvICgic291cmNlIiwgc291cmNlX2luZm8sCisJICAgICJJbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBzb3VyY2UgZmlsZS4iKTsKKworICBhZGRfaW5mbyAoImxpbmUiLCBsaW5lX2luZm8sCisJICAgIGNvbmNhdCAoIkNvcmUgYWRkcmVzc2VzIG9mIHRoZSBjb2RlIGZvciBhIHNvdXJjZSBsaW5lLlxuXAorTGluZSBjYW4gYmUgc3BlY2lmaWVkIGFzXG5cCisgIExJTkVOVU0sIHRvIGxpc3QgYXJvdW5kIHRoYXQgbGluZSBpbiBjdXJyZW50IGZpbGUsXG5cCisgIEZJTEU6TElORU5VTSwgdG8gbGlzdCBhcm91bmQgdGhhdCBsaW5lIGluIHRoYXQgZmlsZSxcblwKKyAgRlVOQ1RJT04sIHRvIGxpc3QgYXJvdW5kIGJlZ2lubmluZyBvZiB0aGF0IGZ1bmN0aW9uLFxuXAorICBGSUxFOkZVTkNUSU9OLCB0byBkaXN0aW5ndWlzaCBhbW9uZyBsaWtlLW5hbWVkIHN0YXRpYyBmdW5jdGlvbnMuXG5cCisiLCAiXAorRGVmYXVsdCBpcyB0byBkZXNjcmliZSB0aGUgbGFzdCBzb3VyY2UgbGluZSB0aGF0IHdhcyBsaXN0ZWQuXG5cblwKK1RoaXMgc2V0cyB0aGUgZGVmYXVsdCBhZGRyZXNzIGZvciBcInhcIiB0byB0aGUgbGluZSdzIGZpcnN0IGluc3RydWN0aW9uXG5cCitzbyB0aGF0IFwieC9pXCIgc3VmZmljZXMgdG8gc3RhcnQgZXhhbWluaW5nIHRoZSBtYWNoaW5lIGNvZGUuXG5cCitUaGUgYWRkcmVzcyBpcyBhbHNvIHN0b3JlZCBhcyB0aGUgdmFsdWUgb2YgXCIkX1wiLiIsIE5VTEwpKTsKKworICBhZGRfY29tICgiZm9yd2FyZC1zZWFyY2giLCBjbGFzc19maWxlcywgZm9yd2FyZF9zZWFyY2hfY29tbWFuZCwKKwkgICAiU2VhcmNoIGZvciByZWd1bGFyIGV4cHJlc3Npb24gKHNlZSByZWdleCgzKSkgZnJvbSBsYXN0IGxpbmUgbGlzdGVkLlxuXAorVGhlIG1hdGNoaW5nIGxpbmUgbnVtYmVyIGlzIGFsc28gc3RvcmVkIGFzIHRoZSB2YWx1ZSBvZiBcIiRfXCIuIik7CisgIGFkZF9jb21fYWxpYXMgKCJzZWFyY2giLCAiZm9yd2FyZC1zZWFyY2giLCBjbGFzc19maWxlcywgMCk7CisKKyAgYWRkX2NvbSAoInJldmVyc2Utc2VhcmNoIiwgY2xhc3NfZmlsZXMsIHJldmVyc2Vfc2VhcmNoX2NvbW1hbmQsCisJICAgIlNlYXJjaCBiYWNrd2FyZCBmb3IgcmVndWxhciBleHByZXNzaW9uIChzZWUgcmVnZXgoMykpIGZyb20gbGFzdCBsaW5lIGxpc3RlZC5cblwKK1RoZSBtYXRjaGluZyBsaW5lIG51bWJlciBpcyBhbHNvIHN0b3JlZCBhcyB0aGUgdmFsdWUgb2YgXCIkX1wiLiIpOworCisgIGlmICh4ZGJfY29tbWFuZHMpCisgICAgeworICAgICAgYWRkX2NvbV9hbGlhcygiLyIsICJmb3J3YXJkLXNlYXJjaCIsIGNsYXNzX2ZpbGVzLCAwKTsKKyAgICAgIGFkZF9jb21fYWxpYXMoIj8iLCAicmV2ZXJzZS1zZWFyY2giLCBjbGFzc19maWxlcywgMCk7CisgICAgfQorCisgIGFkZF9jb20gKCJsaXN0IiwgY2xhc3NfZmlsZXMsIGxpc3RfY29tbWFuZCwKKwkgICBjb25jYXQgKCJMaXN0IHNwZWNpZmllZCBmdW5jdGlvbiBvciBsaW5lLlxuXAorV2l0aCBubyBhcmd1bWVudCwgbGlzdHMgdGVuIG1vcmUgbGluZXMgYWZ0ZXIgb3IgYXJvdW5kIHByZXZpb3VzIGxpc3RpbmcuXG5cCitcImxpc3QgLVwiIGxpc3RzIHRoZSB0ZW4gbGluZXMgYmVmb3JlIGEgcHJldmlvdXMgdGVuLWxpbmUgbGlzdGluZy5cblwKK09uZSBhcmd1bWVudCBzcGVjaWZpZXMgYSBsaW5lLCBhbmQgdGVuIGxpbmVzIGFyZSBsaXN0ZWQgYXJvdW5kIHRoYXQgbGluZS5cblwKK1R3byBhcmd1bWVudHMgd2l0aCBjb21tYSBiZXR3ZWVuIHNwZWNpZnkgc3RhcnRpbmcgYW5kIGVuZGluZyBsaW5lcyB0byBsaXN0LlxuXAorIiwgIlwKK0xpbmVzIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlc2Ugd2F5czpcblwKKyAgTElORU5VTSwgdG8gbGlzdCBhcm91bmQgdGhhdCBsaW5lIGluIGN1cnJlbnQgZmlsZSxcblwKKyAgRklMRTpMSU5FTlVNLCB0byBsaXN0IGFyb3VuZCB0aGF0IGxpbmUgaW4gdGhhdCBmaWxlLFxuXAorICBGVU5DVElPTiwgdG8gbGlzdCBhcm91bmQgYmVnaW5uaW5nIG9mIHRoYXQgZnVuY3Rpb24sXG5cCisgIEZJTEU6RlVOQ1RJT04sIHRvIGRpc3Rpbmd1aXNoIGFtb25nIGxpa2UtbmFtZWQgc3RhdGljIGZ1bmN0aW9ucy5cblwKKyAgKkFERFJFU1MsIHRvIGxpc3QgYXJvdW5kIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhhdCBhZGRyZXNzLlxuXAorV2l0aCB0d28gYXJncyBpZiBvbmUgaXMgZW1wdHkgaXQgc3RhbmRzIGZvciB0ZW4gbGluZXMgYXdheSBmcm9tIHRoZSBvdGhlciBhcmcuIiwgTlVMTCkpOworCisgIGlmICgheGRiX2NvbW1hbmRzKQorICAgIGFkZF9jb21fYWxpYXMgKCJsIiwgImxpc3QiLCBjbGFzc19maWxlcywgMSk7CisgIGVsc2UKKyAgICBhZGRfY29tX2FsaWFzICgidiIsICJsaXN0IiwgY2xhc3NfZmlsZXMsIDEpOworCisgIGlmIChkYnhfY29tbWFuZHMpCisgICAgYWRkX2NvbV9hbGlhcyAoImZpbGUiLCAibGlzdCIsIGNsYXNzX2ZpbGVzLCAxKTsKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoImxpc3RzaXplIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX3VpbnRlZ2VyLAorCQkgIChjaGFyICopJmxpbmVzX3RvX2xpc3QsCisJIlNldCBudW1iZXIgb2Ygc291cmNlIGxpbmVzIGdkYiB3aWxsIGxpc3QgYnkgZGVmYXVsdC4iLAorCQkgICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKK30KZGlmZiAtLWdpdCBhL2dkYi9zcGFyYy1uYXQuYyBiL2dkYi9zcGFyYy1uYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjVmOGJmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3NwYXJjLW5hdC5jCkBAIC0wLDAgKzEsMzI4IEBACisvKiBGdW5jdGlvbnMgc3BlY2lmaWMgdG8gcnVubmluZyBnZGIgbmF0aXZlIG9uIGEgU1BBUkMgcnVubmluZyBTdW5PUzQuCisgICBDb3B5cmlnaHQgMTk4OSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSA8YXNtL3JlZy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3VzZXIuaD4KKworLyogV2UgZG9uJ3Qgc3RvcmUgYWxsIHJlZ2lzdGVycyBpbW1lZGlhdGVseSB3aGVuIHJlcXVlc3RlZCwgc2luY2UgdGhleQorICAgZ2V0IHNlbnQgb3ZlciBpbiBsYXJnZSBjaHVua3MgYW55d2F5LiAgSW5zdGVhZCwgd2UgYWNjdW11bGF0ZSBtb3N0CisgICBvZiB0aGUgY2hhbmdlcyBhbmQgc2VuZCB0aGVtIG92ZXIgb25jZS4gICJkZWZlcnJlZF9zdG9yZXMiIGtlZXBzCisgICB0cmFjayBvZiB3aGljaCBzZXRzIG9mIHJlZ2lzdGVycyB3ZSBoYXZlIGxvY2FsbHktY2hhbmdlZCBjb3BpZXMgb2YsCisgICBzbyB3ZSBvbmx5IG5lZWQgc2VuZCB0aGUgZ3JvdXBzIHRoYXQgaGF2ZSBjaGFuZ2VkLiAgKi8KKworI2RlZmluZQlJTlRfUkVHUwkxCisjZGVmaW5lCVNUQUNLX1JFR1MJMgorI2RlZmluZQlGUF9SRUdTCQk0CisKK3N0YXRpYyB2b2lkCitmZXRjaF9jb3JlX3JlZ2lzdGVycyBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGludCwgaW50LCBDT1JFX0FERFIpKTsKKworLyogRmV0Y2ggb25lIG9yIG1vcmUgcmVnaXN0ZXJzIGZyb20gdGhlIGluZmVyaW9yLiAgUkVHTk8gPT0gLTEgdG8gZ2V0CisgICB0aGVtIGFsbC4gIFdlIGFjdHVhbGx5IGZldGNoIG1vcmUgdGhhbiByZXF1ZXN0ZWQsIHdoZW4gY29udmVuaWVudCwKKyAgIG1hcmtpbmcgdGhlbSBhcyB2YWxpZCBzbyB3ZSB3b24ndCBmZXRjaCB0aGVtIGFnYWluLiAgKi8KKwordm9pZAorZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBzdHJ1Y3QgcmVncyBpbmZlcmlvcl9yZWdpc3RlcnM7CisgIHN0cnVjdCBmcF9zdGF0dXMgaW5mZXJpb3JfZnBfcmVnaXN0ZXJzOworICBpbnQgaTsKKworICAvKiBXZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHdpdGggZGVmZXJyZWQgc3RvcmVzLCBiZWNhdXNlIGEgcHJlcmVxdWlzaXRlCisgICAgIGZvciB3cml0aW5nIHJlZ3MgaXMgdG8gaGF2ZSBmZXRjaGVkIHRoZW0gYWxsIChQUkVQQVJFX1RPX1NUT1JFKSwgc2lnaC4gICovCisgIGlmIChkZWZlcnJlZF9zdG9yZXMpIGFib3J0KCk7CisKKyAgRE9fREVGRVJSRURfU1RPUkVTOworCisgIC8qIEdsb2JhbCBhbmQgT3V0IHJlZ3MgYXJlIGZldGNoZWQgZGlyZWN0bHksIGFzIHdlbGwgYXMgdGhlIGNvbnRyb2wKKyAgICAgcmVnaXN0ZXJzLiAgSWYgd2UncmUgZ2V0dGluZyBvbmUgb2YgdGhlIGluIG9yIGxvY2FsIHJlZ3MsCisgICAgIGFuZCB0aGUgc3RhY2sgcG9pbnRlciBoYXMgbm90IHlldCBiZWVuIGZldGNoZWQsCisgICAgIHdlIGhhdmUgdG8gZG8gdGhhdCBmaXJzdCwgc2luY2UgdGhleSdyZSBmb3VuZCBpbiBtZW1vcnkgcmVsYXRpdmUKKyAgICAgdG8gdGhlIHN0YWNrIHBvaW50ZXIuICAqLworICBpZiAocmVnbm8gPCBPN19SRUdOVU0gIC8qIGluY2x1ZGluZyAtMSAqLworICAgICAgfHwgcmVnbm8gPj0gWV9SRUdOVU0KKyAgICAgIHx8ICghcmVnaXN0ZXJfdmFsaWRbU1BfUkVHTlVNXSAmJiByZWdubyA8IEk3X1JFR05VTSkpCisgICAgeworICAgICAgaWYgKDAgIT0gcHRyYWNlIChQVFJBQ0VfR0VUUkVHUywgaW5mZXJpb3JfcGlkLAorCQkgICAgICAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9yZWdpc3RlcnMsIDApKQorCXBlcnJvcigicHRyYWNlX2dldHJlZ3MiKTsKKyAgICAgIAorICAgICAgcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKDApXSA9IDA7CisgICAgICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoMSldLCAmaW5mZXJpb3JfcmVnaXN0ZXJzLnJfZzEsCisJICAgICAgMTUgKiBSRUdJU1RFUl9SQVdfU0laRSAoRzBfUkVHTlVNKSk7CisgICAgICAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUFNfUkVHTlVNKV0gPSBpbmZlcmlvcl9yZWdpc3RlcnMucl9wczsgCisgICAgICAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUENfUkVHTlVNKV0gPSBpbmZlcmlvcl9yZWdpc3RlcnMucl9wYzsKKyAgICAgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChOUENfUkVHTlVNKV0gPSBpbmZlcmlvcl9yZWdpc3RlcnMucl9ucGM7CisgICAgICAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoWV9SRUdOVU0pXSA9IGluZmVyaW9yX3JlZ2lzdGVycy5yX3k7CisKKyAgICAgIGZvciAoaSA9IEcwX1JFR05VTTsgaSA8PSBPN19SRUdOVU07IGkrKykKKwlyZWdpc3Rlcl92YWxpZFtpXSA9IDE7CisgICAgICByZWdpc3Rlcl92YWxpZFtZX1JFR05VTV0gPSAxOworICAgICAgcmVnaXN0ZXJfdmFsaWRbUFNfUkVHTlVNXSA9IDE7CisgICAgICByZWdpc3Rlcl92YWxpZFtQQ19SRUdOVU1dID0gMTsKKyAgICAgIHJlZ2lzdGVyX3ZhbGlkW05QQ19SRUdOVU1dID0gMTsKKyAgICAgIC8qIElmIHdlIGRvbid0IHNldCB0aGVzZSB2YWxpZCwgcmVhZF9yZWdpc3Rlcl9ieXRlcygpIHJlcmVhZHMKKwkgYWxsIHRoZSByZWdzIGV2ZXJ5IHRpbWUgaXQgaXMgY2FsbGVkISAgRklYTUUuICAqLworICAgICAgcmVnaXN0ZXJfdmFsaWRbV0lNX1JFR05VTV0gPSAxOwkvKiBOb3QgdHJ1ZSB5ZXQsIEZJWE1FICovCisgICAgICByZWdpc3Rlcl92YWxpZFtUQlJfUkVHTlVNXSA9IDE7CS8qIE5vdCB0cnVlIHlldCwgRklYTUUgKi8KKyAgICAgIHJlZ2lzdGVyX3ZhbGlkW0NQU19SRUdOVU1dID0gMTsJLyogTm90IHRydWUgeWV0LCBGSVhNRSAqLworICAgIH0KKworICAvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KKyAgaWYgKHJlZ25vID09IC0xIHx8CisgICAgICByZWdubyA9PSBGUFNfUkVHTlVNIHx8CisgICAgICAocmVnbm8gPj0gRlAwX1JFR05VTSAmJiByZWdubyA8PSBGUDBfUkVHTlVNICsgMzEpKQorICAgIHsKKyAgICAgIGlmICgwICE9IHB0cmFjZSAoUFRSQUNFX0dFVEZQUkVHUywgaW5mZXJpb3JfcGlkLAorCQkgICAgICAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9mcF9yZWdpc3RlcnMsCisJCSAgICAgICAwKSkKKwkgICAgcGVycm9yKCJwdHJhY2VfZ2V0ZnByZWdzIik7CisgICAgICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLCAmaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLAorCSAgICAgIHNpemVvZiBpbmZlcmlvcl9mcF9yZWdpc3RlcnMuZnB1X2ZyKTsKKyAgICAgIG1lbWNweSAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUFNfUkVHTlVNKV0sCisJICAgICAmaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLkZwdV9mc3IsCisJICAgICBzaXplb2YgKEZQVV9GU1JfVFlQRSkpOworICAgICAgZm9yIChpID0gRlAwX1JFR05VTTsgaSA8PSBGUDBfUkVHTlVNKzMxOyBpKyspCisJcmVnaXN0ZXJfdmFsaWRbaV0gPSAxOworICAgICAgcmVnaXN0ZXJfdmFsaWRbRlBTX1JFR05VTV0gPSAxOworICAgIH0KKworICAvKiBUaGVzZSByZWdzIGFyZSBzYXZlZCBvbiB0aGUgc3RhY2sgYnkgdGhlIGtlcm5lbC4gIE9ubHkgcmVhZCB0aGVtCisgICAgIGFsbCAoMTYgcHRyYWNlIGNhbGxzISkgaWYgd2UgcmVhbGx5IG5lZWQgdGhlbS4gICovCisgIGlmIChyZWdubyA9PSAtMSkKKyAgICB7CisgICAgICB0YXJnZXRfcmVhZF9tZW1vcnkgKCooQ09SRV9BRERSKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKFNQX1JFR05VTSldLAorCQkgICAgICAgICAgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChMMF9SRUdOVU0pXSwKKwkJCSAgMTYqUkVHSVNURVJfUkFXX1NJWkUgKEwwX1JFR05VTSkpOworICAgICAgZm9yIChpID0gTDBfUkVHTlVNOyBpIDw9IEk3X1JFR05VTTsgaSsrKQorCXJlZ2lzdGVyX3ZhbGlkW2ldID0gMTsKKyAgICB9CisgIGVsc2UgaWYgKHJlZ25vID49IEwwX1JFR05VTSAmJiByZWdubyA8PSBJN19SRUdOVU0pCisgICAgeworICAgICAgQ09SRV9BRERSIHNwID0gKihDT1JFX0FERFIqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoU1BfUkVHTlVNKV07CisgICAgICBpID0gUkVHSVNURVJfQllURSAocmVnbm8pOworICAgICAgaWYgKHJlZ2lzdGVyX3ZhbGlkW3JlZ25vXSkKKwlwcmludGZfdW5maWx0ZXJlZCgicmVnaXN0ZXIgJWQgdmFsaWQgYW5kIHJlYWRcbiIsIHJlZ25vKTsKKyAgICAgIHRhcmdldF9yZWFkX21lbW9yeSAoc3AgKyBpIC0gUkVHSVNURVJfQllURSAoTDBfUkVHTlVNKSwKKwkJCSAgJnJlZ2lzdGVyc1tpXSwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ25vKSk7CisgICAgICByZWdpc3Rlcl92YWxpZFtyZWdub10gPSAxOworICAgIH0KK30KKworLyogU3RvcmUgb3VyIHJlZ2lzdGVyIHZhbHVlcyBiYWNrIGludG8gdGhlIGluZmVyaW9yLgorICAgSWYgUkVHTk8gaXMgLTEsIGRvIHRoaXMgZm9yIGFsbCByZWdpc3RlcnMuCisgICBPdGhlcndpc2UsIFJFR05PIHNwZWNpZmllcyB3aGljaCByZWdpc3RlciAoc28gd2UgY2FuIHNhdmUgdGltZSkuICAqLworCit2b2lkCitzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHN0cnVjdCByZWdzIGluZmVyaW9yX3JlZ2lzdGVyczsKKyAgc3RydWN0IGZwX3N0YXR1cyBpbmZlcmlvcl9mcF9yZWdpc3RlcnM7CisgIGludCB3YW5uYV9zdG9yZSA9IElOVF9SRUdTICsgU1RBQ0tfUkVHUyArIEZQX1JFR1M7CisKKyAgLyogRmlyc3QgZGVjaWRlIHdoaWNoIHBpZWNlcyBvZiBtYWNoaW5lLXN0YXRlIHdlIG5lZWQgdG8gbW9kaWZ5LiAgCisgICAgIERlZmF1bHQgZm9yIHJlZ25vID09IC0xIGNhc2UgaXMgYWxsIHBpZWNlcy4gICovCisgIGlmIChyZWdubyA+PSAwKQorICAgIGlmIChGUDBfUkVHTlVNIDw9IHJlZ25vICYmIHJlZ25vIDwgRlAwX1JFR05VTSArIDMyKQorICAgICAgeworCXdhbm5hX3N0b3JlID0gRlBfUkVHUzsKKyAgICAgIH0KKyAgICBlbHNlIAorICAgICAgeworCWlmIChyZWdubyA9PSBTUF9SRUdOVU0pCisJICB3YW5uYV9zdG9yZSA9IElOVF9SRUdTICsgU1RBQ0tfUkVHUzsKKwllbHNlIGlmIChyZWdubyA8IEwwX1JFR05VTSB8fCByZWdubyA+IEk3X1JFR05VTSkKKwkgIHdhbm5hX3N0b3JlID0gSU5UX1JFR1M7CisJZWxzZSBpZiAocmVnbm8gPT0gRlBTX1JFR05VTSkKKwkgIHdhbm5hX3N0b3JlID0gRlBfUkVHUzsKKwllbHNlCisJICB3YW5uYV9zdG9yZSA9IFNUQUNLX1JFR1M7CisgICAgICB9CisKKyAgLyogU2VlIGlmIHdlJ3JlIGZvcmNpbmcgdGhlIHN0b3JlcyB0byBoYXBwZW4gbm93LCBvciBkZWZlcnJpbmcuICovCisgIGlmIChyZWdubyA9PSAtMikKKyAgICB7CisgICAgICB3YW5uYV9zdG9yZSA9IGRlZmVycmVkX3N0b3JlczsKKyAgICAgIGRlZmVycmVkX3N0b3JlcyA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHdhbm5hX3N0b3JlID09IFNUQUNLX1JFR1MpCisJeworCSAgLyogRmFsbCB0aHJvdWdoIGFuZCBqdXN0IHN0b3JlIG9uZSBzdGFjayByZWcuICBJZiB3ZSBkZWZlcnJlZAorCSAgICAgaXQsIHdlJ2QgaGF2ZSB0byBzdG9yZSB0aGVtIGFsbCwgb3IgcmVtZW1iZXIgbW9yZSBpbmZvLiAgKi8KKwl9CisgICAgICBlbHNlCisJeworCSAgZGVmZXJyZWRfc3RvcmVzIHw9IHdhbm5hX3N0b3JlOworCSAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgaWYgKHdhbm5hX3N0b3JlICYgU1RBQ0tfUkVHUykKKyAgICB7CisgICAgICBDT1JFX0FERFIgc3AgPSAqKENPUkVfQUREUiAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoU1BfUkVHTlVNKV07CisKKyAgICAgIGlmIChyZWdubyA8IDAgfHwgcmVnbm8gPT0gU1BfUkVHTlVNKQorCXsKKwkgIGlmICghcmVnaXN0ZXJfdmFsaWRbTDBfUkVHTlVNKzVdKSBhYm9ydCgpOworCSAgdGFyZ2V0X3dyaXRlX21lbW9yeSAoc3AsIAorCQkJICAgICAgICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoTDBfUkVHTlVNKV0sCisJCQkgICAgICAgMTYqUkVHSVNURVJfUkFXX1NJWkUgKEwwX1JFR05VTSkpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoIXJlZ2lzdGVyX3ZhbGlkW3JlZ25vXSkgYWJvcnQoKTsKKwkgIHRhcmdldF93cml0ZV9tZW1vcnkgKHNwICsgUkVHSVNURVJfQllURSAocmVnbm8pIC0gUkVHSVNURVJfQllURSAoTDBfUkVHTlVNKSwKKwkJCSAgICAgICAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ25vKV0sCisJCQkgICAgICAgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ25vKSk7CisJfQorCQorICAgIH0KKworICBpZiAod2FubmFfc3RvcmUgJiBJTlRfUkVHUykKKyAgICB7CisgICAgICBpZiAoIXJlZ2lzdGVyX3ZhbGlkW0cxX1JFR05VTV0pIGFib3J0KCk7CisKKyAgICAgIG1lbWNweSAoJmluZmVyaW9yX3JlZ2lzdGVycy5yX2cxLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEcxX1JFR05VTSldLAorCSAgICAgIDE1ICogUkVHSVNURVJfUkFXX1NJWkUgKEcxX1JFR05VTSkpOworCisgICAgICBpbmZlcmlvcl9yZWdpc3RlcnMucl9wcyA9CisJKihpbnQgKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKFBTX1JFR05VTSldOworICAgICAgaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcGMgPQorCSooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQQ19SRUdOVU0pXTsKKyAgICAgIGluZmVyaW9yX3JlZ2lzdGVycy5yX25wYyA9CisJKihpbnQgKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKE5QQ19SRUdOVU0pXTsKKyAgICAgIGluZmVyaW9yX3JlZ2lzdGVycy5yX3kgPQorCSooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChZX1JFR05VTSldOworCisgICAgICBpZiAoMCAhPSBwdHJhY2UgKFBUUkFDRV9TRVRSRUdTLCBpbmZlcmlvcl9waWQsCisJCSAgICAgICAoUFRSQUNFX0FSRzNfVFlQRSkgJmluZmVyaW9yX3JlZ2lzdGVycywgMCkpCisJcGVycm9yKCJwdHJhY2Vfc2V0cmVncyIpOworICAgIH0KKworICBpZiAod2FubmFfc3RvcmUgJiBGUF9SRUdTKQorICAgIHsKKyAgICAgIGlmICghcmVnaXN0ZXJfdmFsaWRbRlAwX1JFR05VTSs5XSkgYWJvcnQoKTsKKyAgICAgIG1lbWNweSAoJmluZmVyaW9yX2ZwX3JlZ2lzdGVycywgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNKV0sCisJICAgICAgc2l6ZW9mIGluZmVyaW9yX2ZwX3JlZ2lzdGVycy5mcHVfZnIpOworICAgICAgbWVtY3B5ICgmaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLkZwdV9mc3IsIAorCSAgICAgICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlBTX1JFR05VTSldLCBzaXplb2YgKEZQVV9GU1JfVFlQRSkpOworICAgICAgaWYgKDAgIT0KKwkgcHRyYWNlIChQVFJBQ0VfU0VURlBSRUdTLCBpbmZlcmlvcl9waWQsCisJCSAoUFRSQUNFX0FSRzNfVFlQRSkgJmluZmVyaW9yX2ZwX3JlZ2lzdGVycywgMCkpCisJIHBlcnJvcigicHRyYWNlX3NldGZwcmVncyIpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorZmV0Y2hfY29yZV9yZWdpc3RlcnMgKGNvcmVfcmVnX3NlY3QsIGNvcmVfcmVnX3NpemUsIHdoaWNoLCBpZ25vcmUpCisgIGNoYXIgKmNvcmVfcmVnX3NlY3Q7CisgIHVuc2lnbmVkIGNvcmVfcmVnX3NpemU7CisgIGludCB3aGljaDsKKyAgQ09SRV9BRERSIGlnbm9yZTsJLyogcmVnIGFkZHIsIHVudXNlZCBpbiB0aGlzIHZlcnNpb24gKi8KK3sKKworICBpZiAod2hpY2ggPT0gMCkgeworCisgICAgLyogSW50ZWdlciByZWdpc3RlcnMgKi8KKworI2RlZmluZSBncmVncyAoKHN0cnVjdCByZWdzICopY29yZV9yZWdfc2VjdCkKKyAgICAvKiBHMCAqYWx3YXlzKiBob2xkcyAwLiAgKi8KKyAgICAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoMCldID0gMDsKKworICAgIC8qIFRoZSBnbG9iYWxzIGFuZCBvdXRwdXQgcmVnaXN0ZXJzLiAgKi8KKyAgICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRzFfUkVHTlVNKV0sICZncmVncy0+cl9nMSwgCisJICAgIDE1ICogUkVHSVNURVJfUkFXX1NJWkUgKEcxX1JFR05VTSkpOworICAgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQU19SRUdOVU0pXSA9IGdyZWdzLT5yX3BzOworICAgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQQ19SRUdOVU0pXSA9IGdyZWdzLT5yX3BjOworICAgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChOUENfUkVHTlVNKV0gPSBncmVncy0+cl9ucGM7CisgICAgKihpbnQgKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKFlfUkVHTlVNKV0gPSBncmVncy0+cl95OworCisgICAgLyogTXkgYmVzdCBndWVzcyBhdCB3aGVyZSB0byBnZXQgdGhlIGxvY2FscyBhbmQgaW5wdXQKKyAgICAgICByZWdpc3RlcnMgaXMgZXhhY3RseSB3aGVyZSB0aGV5IHVzdWFsbHkgYXJlLCByaWdodCBhYm92ZQorICAgICAgIHRoZSBzdGFjayBwb2ludGVyLiAgSWYgdGhlIGNvcmUgZHVtcCB3YXMgY2F1c2VkIGJ5IGEgYnVzIGVycm9yCisgICAgICAgZnJvbSBibG93aW5nIGF3YXkgdGhlIHN0YWNrIHBvaW50ZXIgKGFzIGlzIHBvc3NpYmxlKSB0aGVuIHRoaXMKKyAgICAgICB3b24ndCB3b3JrLCBidXQgaXQncyB3b3J0aCB0aGUgdHJ5LiAqLworICAgIHsKKyAgICAgIGludCBzcDsKKworICAgICAgc3AgPSAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoU1BfUkVHTlVNKV07CisgICAgICBpZiAoMCAhPSB0YXJnZXRfcmVhZF9tZW1vcnkgKHNwLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEwwX1JFR05VTSldLCAKKwkJCSAgMTYgKiBSRUdJU1RFUl9SQVdfU0laRSAoTDBfUkVHTlVNKSkpCisJeworCSAgLyogZnByaW50Zl91bmZpbHRlcmVkIHNvIHVzZXIgY2FuIHN0aWxsIHVzZSBnZGIgKi8KKwkgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKwkJICAgIkNvdWxkbid0IHJlYWQgaW5wdXQgYW5kIGxvY2FsIHJlZ2lzdGVycyBmcm9tIGNvcmUgZmlsZVxuIik7CisJfQorICAgIH0KKyAgfSBlbHNlIGlmICh3aGljaCA9PSAyKSB7CisKKyAgICAvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBmcHVyZWdzICAoKHN0cnVjdCBmcHUgKikgY29yZV9yZWdfc2VjdCkKKyAgICBpZiAoY29yZV9yZWdfc2l6ZSA+PSBzaXplb2YgKHN0cnVjdCBmcHUpKQorICAgICAgeworCW1lbWNweSAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNKV0sIGZwdXJlZ3MtPmZwdV9yZWdzLAorCQlzaXplb2YgKGZwdXJlZ3MtPmZwdV9yZWdzKSk7CisJbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQU19SRUdOVU0pXSwgJmZwdXJlZ3MtPmZwdV9mc3IsCisJCXNpemVvZiAoRlBVX0ZTUl9UWVBFKSk7CisgICAgICB9CisgICAgZWxzZQorICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiQ291bGRuJ3QgcmVhZCBmbG9hdCByZWdzIGZyb20gY29yZSBmaWxlXG4iKTsKKyAgfQorfQorCitpbnQKK2tlcm5lbF91X3NpemUgKCkKK3sKKyAgcmV0dXJuIChzaXplb2YgKHN0cnVjdCB1c2VyKSk7Cit9CisKKwwKKy8qIFJlZ2lzdGVyIHRoYXQgd2UgYXJlIGFibGUgdG8gaGFuZGxlIHNwYXJjIGNvcmUgZmlsZSBmb3JtYXRzLgorICAgRklYTUU6IGlzIHRoaXMgcmVhbGx5IGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyPyAqLworCitzdGF0aWMgc3RydWN0IGNvcmVfZm5zIHNwYXJjX2NvcmVfZm5zID0KK3sKKyAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCisgIGZldGNoX2NvcmVfcmVnaXN0ZXJzLAorICBOVUxMCit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9jb3JlX3NwYXJjICgpCit7CisgIGFkZF9jb3JlX2ZucyAoJnNwYXJjX2NvcmVfZm5zKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9zcGFyYy1zdHViLmMgYi9nZGIvc3BhcmMtc3R1Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTY1YzIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvc3BhcmMtc3R1Yi5jCkBAIC0wLDAgKzEsODQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJCVRISVMgU09GVFdBUkUgSVMgTk9UIENPUFlSSUdIVEVECisKKyAgIEhQIG9mZmVycyB0aGUgZm9sbG93aW5nIGZvciB1c2UgaW4gdGhlIHB1YmxpYyBkb21haW4uICBIUCBtYWtlcyBubworICAgd2FycmFudHkgd2l0aCByZWdhcmQgdG8gdGhlIHNvZnR3YXJlIG9yIGl0J3MgcGVyZm9ybWFuY2UgYW5kIHRoZQorICAgdXNlciBhY2NlcHRzIHRoZSBzb2Z0d2FyZSAiQVMgSVMiIHdpdGggYWxsIGZhdWx0cy4KKworICAgSFAgRElTQ0xBSU1TIEFOWSBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIFdJVEggUkVHQVJECisgICBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAgIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgSGVhZGVyOiByZW1jb20uYyx2IDEuMzQgOTEvMDMvMDkgMTI6Mjk6NDkgZ2xlbm5lIEV4cCAkCisgKgorICogIE1vZHVsZSBuYW1lOiByZW1jb20uYyAkCisgKiAgUmV2aXNpb246IDEuMzQgJAorICogIERhdGU6IDkxLzAzLzA5IDEyOjI5OjQ5ICQKKyAqICBDb250cmlidXRvcjogICAgIExha2UgU3RldmVucyBJbnN0cnVtZW50IERpdmlzaW9uJAorICoKKyAqICBEZXNjcmlwdGlvbjogICAgIGxvdyBsZXZlbCBzdXBwb3J0IGZvciBnZGIgZGVidWdnZXIuICQKKyAqCisgKiAgQ29uc2lkZXJhdGlvbnM6ICBvbmx5IHdvcmtzIG9uIHRhcmdldCBoYXJkd2FyZSAkCisgKgorICogIFdyaXR0ZW4gYnk6ICAgICAgR2xlbm4gRW5nZWwgJAorICogIE1vZHVsZVN0YXRlOiAgICAgRXhwZXJpbWVudGFsICQKKyAqCisgKiAgTk9URVM6ICAgICAgICAgICBTZWUgQmVsb3cgJAorICoKKyAqICBNb2RpZmllZCBmb3IgU1BBUkMgYnkgU3R1IEdyb3NzbWFuLCBDeWdudXMgU3VwcG9ydC4KKyAqCisgKiAgVGhpcyBjb2RlIGhhcyBiZWVuIGV4dGVuc2l2ZWx5IHRlc3RlZCBvbiB0aGUgRnVqaXRzdSBTUEFSQ2xpdGUgZGVtbyBib2FyZC4KKyAqCisgKiAgVG8gZW5hYmxlIGRlYnVnZ2VyIHN1cHBvcnQsIHR3byB0aGluZ3MgbmVlZCB0byBoYXBwZW4uICBPbmUsIGEKKyAqICBjYWxsIHRvIHNldF9kZWJ1Z190cmFwcygpIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBhbGxvdyBhbnkgYnJlYWtwb2ludHMKKyAqICBvciBlcnJvciBjb25kaXRpb25zIHRvIGJlIHByb3Blcmx5IGludGVyY2VwdGVkIGFuZCByZXBvcnRlZCB0byBnZGIuCisgKiAgVHdvLCBhIGJyZWFrcG9pbnQgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkIHRvIGJlZ2luIGNvbW11bmljYXRpb24uICBUaGlzCisgKiAgaXMgbW9zdCBlYXNpbHkgYWNjb21wbGlzaGVkIGJ5IGEgY2FsbCB0byBicmVha3BvaW50KCkuICBCcmVha3BvaW50KCkKKyAqICBzaW11bGF0ZXMgYSBicmVha3BvaW50IGJ5IGV4ZWN1dGluZyBhIHRyYXAgIzEuCisgKgorICoqKioqKioqKioqKioKKyAqCisgKiAgICBUaGUgZm9sbG93aW5nIGdkYiBjb21tYW5kcyBhcmUgc3VwcG9ydGVkOgorICoKKyAqIGNvbW1hbmQgICAgICAgICAgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuIHZhbHVlCisgKgorICogICAgZyAgICAgICAgICAgICByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBDUFUgcmVnaXN0ZXJzICBoZXggZGF0YSBvciBFTk4KKyAqICAgIEcgICAgICAgICAgICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgQ1BVIHJlZ2lzdGVycyAgICAgT0sgb3IgRU5OCisgKgorICogICAgbUFBLi5BQSxMTExMICBSZWFkIExMTEwgYnl0ZXMgYXQgYWRkcmVzcyBBQS4uQUEgICAgICBoZXggZGF0YSBvciBFTk4KKyAqICAgIE1BQS4uQUEsTExMTDogV3JpdGUgTExMTCBieXRlcyBhdCBhZGRyZXNzIEFBLkFBICAgICAgT0sgb3IgRU5OCisgKgorICogICAgYyAgICAgICAgICAgICBSZXN1bWUgYXQgY3VycmVudCBhZGRyZXNzICAgICAgICAgICAgICBTTk4gICAoIHNpZ25hbCBOTikKKyAqICAgIGNBQS4uQUEgICAgICAgQ29udGludWUgYXQgYWRkcmVzcyBBQS4uQUEgICAgICAgICAgICAgU05OCisgKgorICogICAgcyAgICAgICAgICAgICBTdGVwIG9uZSBpbnN0cnVjdGlvbiAgICAgICAgICAgICAgICAgICBTTk4KKyAqICAgIHNBQS4uQUEgICAgICAgU3RlcCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBBQS4uQUEgICAgICAgU05OCisgKgorICogICAgayAgICAgICAgICAgICBraWxsCisgKgorICogICAgPyAgICAgICAgICAgICBXaGF0IHdhcyB0aGUgbGFzdCBzaWd2YWwgPyAgICAgICAgICAgICBTTk4gICAoc2lnbmFsIE5OKQorICoKKyAqICAgIGJCQi4uQkIJICAgIFNldCBiYXVkIHJhdGUgdG8gQkIuLkJCCQkgICBPSyBvciBCTk4sIHRoZW4gc2V0cworICoJCQkJCQkJICAgYmF1ZCByYXRlCisgKgorICogQWxsIGNvbW1hbmRzIGFuZCByZXNwb25zZXMgYXJlIHNlbnQgd2l0aCBhIHBhY2tldCB3aGljaCBpbmNsdWRlcyBhCisgKiBjaGVja3N1bS4gIEEgcGFja2V0IGNvbnNpc3RzIG9mCisgKgorICogJDxwYWNrZXQgaW5mbz4jPGNoZWNrc3VtPi4KKyAqCisgKiB3aGVyZQorICogPHBhY2tldCBpbmZvPiA6OiA8Y2hhcmFjdGVycyByZXByZXNlbnRpbmcgdGhlIGNvbW1hbmQgb3IgcmVzcG9uc2U+CisgKiA8Y2hlY2tzdW0+ICAgIDo6IDwgdHdvIGhleCBkaWdpdHMgY29tcHV0ZWQgYXMgbW9kdWxvIDI1NiBzdW0gb2YgPHBhY2tldGluZm8+PgorICoKKyAqIFdoZW4gYSBwYWNrZXQgaXMgcmVjZWl2ZWQsIGl0IGlzIGZpcnN0IGFja25vd2xlZGdlZCB3aXRoIGVpdGhlciAnKycgb3IgJy0nLgorICogJysnIGluZGljYXRlcyBhIHN1Y2Nlc3NmdWwgdHJhbnNmZXIuICAnLScgaW5kaWNhdGVzIGEgZmFpbGVkIHRyYW5zZmVyLgorICoKKyAqIEV4YW1wbGU6CisgKgorICogSG9zdDogICAgICAgICAgICAgICAgICBSZXBseToKKyAqICRtMCwxMCMyYSAgICAgICAgICAgICAgICskMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUjNDIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZXh0ZXJuYWwgbG93LWxldmVsIHN1cHBvcnQgcm91dGluZXMKKyAqLworCitleHRlcm4gdm9pZCBwdXREZWJ1Z0NoYXIoKTsJLyogd3JpdGUgYSBzaW5nbGUgY2hhcmFjdGVyICAgICAgKi8KK2V4dGVybiBpbnQgZ2V0RGVidWdDaGFyKCk7CS8qIHJlYWQgYW5kIHJldHVybiBhIHNpbmdsZSBjaGFyICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCVUZNQVggZGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBpbmJvdW5kL291dGJvdW5kIGJ1ZmZlcnMqLworLyogYXQgbGVhc3QgTlVNUkVHQllURVMqMiBhcmUgbmVlZGVkIGZvciByZWdpc3RlciBwYWNrZXRzICovCisjZGVmaW5lIEJVRk1BWCAyMDQ4CisKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwkvKiAhMCBtZWFucyB3ZSd2ZSBiZWVuIGluaXRpYWxpemVkICovCisKK3N0YXRpYyB2b2lkIHNldF9tZW1fZmF1bHRfdHJhcCgpOworCitzdGF0aWMgY29uc3QgY2hhciBoZXhjaGFyc1tdPSIwMTIzNDU2Nzg5YWJjZGVmIjsKKworI2RlZmluZSBOVU1SRUdTIDcyCisKKy8qIE51bWJlciBvZiBieXRlcyBvZiByZWdpc3RlcnMuICAqLworI2RlZmluZSBOVU1SRUdCWVRFUyAoTlVNUkVHUyAqIDQpCitlbnVtIHJlZ25hbWVzIHtHMCwgRzEsIEcyLCBHMywgRzQsIEc1LCBHNiwgRzcsCisJCSBPMCwgTzEsIE8yLCBPMywgTzQsIE81LCBTUCwgTzcsCisJCSBMMCwgTDEsIEwyLCBMMywgTDQsIEw1LCBMNiwgTDcsCisJCSBJMCwgSTEsIEkyLCBJMywgSTQsIEk1LCBGUCwgSTcsCisKKwkJIEYwLCBGMSwgRjIsIEYzLCBGNCwgRjUsIEY2LCBGNywKKwkJIEY4LCBGOSwgRjEwLCBGMTEsIEYxMiwgRjEzLCBGMTQsIEYxNSwKKwkJIEYxNiwgRjE3LCBGMTgsIEYxOSwgRjIwLCBGMjEsIEYyMiwgRjIzLAorCQkgRjI0LCBGMjUsIEYyNiwgRjI3LCBGMjgsIEYyOSwgRjMwLCBGMzEsCisJCSBZLCBQU1IsIFdJTSwgVEJSLCBQQywgTlBDLCBGUFNSLCBDUFNSIH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEFTU0VNQkxZIENPREUgTUFDUk9TICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAJCQkJCQkJCQkgICAqLworCitleHRlcm4gdm9pZCB0cmFwX2xvdygpOworCithc20oIgorCS5yZXNlcnZlIHRyYXBzdGFjaywgMTAwMCAqIDQsIFwiYnNzXCIsIDgKKworCS5kYXRhCisJLmFsaWduCTQKKworaW5fdHJhcF9oYW5kbGVyOgorCS53b3JkCTAKKworCS50ZXh0CisJLmFsaWduIDQKKworISBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFueSBTUEFSQyB0cmFwIChleGNlcHQgd2luZG93IG92ZXJmbG93IG9yCishIHVuZGVyZmxvdykgb2NjdXJzLiAgSXQgbWFrZXMgc3VyZSB0aGF0IHRoZSBpbnZhbGlkIHJlZ2lzdGVyIHdpbmRvdyBpcyBzdGlsbAorISBhdmFpbGFibGUgYmVmb3JlIGp1bXBpbmcgaW50byBDIGNvZGUuICBJdCB3aWxsIGFsc28gcmVzdG9yZSB0aGUgd29ybGQgaWYgeW91CishIHJldHVybiBmcm9tIGhhbmRsZV9leGNlcHRpb24uCisKKwkuZ2xvYmwgX3RyYXBfbG93CitfdHJhcF9sb3c6CisJbW92CSVwc3IsICVsMAorCW1vdgkld2ltLCAlbDMKKworCXNybAklbDMsICVsMCwgJWw0CQkhIHdpbSA+PiBjd3AKKwljbXAJJWw0LCAxCisJYm5lCXdpbmRvd19maW5lCQkhIEJyYW5jaCBpZiBub3QgaW4gdGhlIGludmFsaWQgd2luZG93CisJbm9wCisKKyEgSGFuZGxlIHdpbmRvdyBvdmVyZmxvdworCisJbW92CSVnMSwgJWw0CQkhIFNhdmUgZzEsIHdlIHVzZSBpdCB0byBob2xkIHRoZSB3aW0KKwlzcmwJJWwzLCAxLCAlZzEJCSEgUm90YXRlIHdpbSByaWdodAorCXRzdAklZzEKKwliZwlnb29kX3dpbQkJISBCcmFuY2ggaWYgbmV3IHdpbSBpcyBub24temVybworCW5vcAorCishIEF0IHRoaXMgcG9pbnQsIHdlIG5lZWQgdG8gYnJpbmcgYSAxIGludG8gdGhlIGhpZ2ggb3JkZXIgYml0IG9mIHRoZSB3aW0uCishIFNpbmNlIHdlIGRvbid0IHdhbnQgdG8gbWFrZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIG51bWJlciBvZiByZWdpc3RlcgorISB3aW5kb3dzLCB3ZSBmaWd1cmUgaXQgb3V0IGR5bmFtaWNhbGx5IHNvIGFzIHRvIHNldHVwIHRoZSB3aW0gY29ycmVjdGx5LgorCisJbm90CSVnMQkJCSEgRmlsbCBnMSB3aXRoIG9uZXMKKwltb3YJJWcxLCAld2ltCQkhIEZpbGwgdGhlIHdpbSB3aXRoIG9uZXMKKwlub3AKKwlub3AKKwlub3AKKwltb3YJJXdpbSwgJWcxCQkhIFJlYWQgYmFjayB0aGUgd2ltCisJaW5jCSVnMQkJCSEgTm93IGcxIGhhcyAxIGp1c3QgdG8gbGVmdCBvZiB3aW0KKwlzcmwJJWcxLCAxLCAlZzEJCSEgTm93IHB1dCAxIGF0IHRvcCBvZiB3aW0KKwltb3YJJWcwLCAld2ltCQkhIENsZWFyIHdpbSBzbyB0aGF0IHN1YnNlcXVlbnQgc2F2ZQorCW5vcAkJCQkhICB3b24ndCB0cmFwCisJbm9wCisJbm9wCisKK2dvb2Rfd2ltOgorCXNhdmUJJWcwLCAlZzAsICVnMAkJISBTbGlwIGludG8gbmV4dCB3aW5kb3cKKwltb3YJJWcxLCAld2ltCQkhIEluc3RhbGwgdGhlIG5ldyB3aW0KKworCXN0ZAklbDAsIFslc3AgKyAwICogNF0JISBzYXZlIEwgJiBJIHJlZ2lzdGVycworCXN0ZAklbDIsIFslc3AgKyAyICogNF0KKwlzdGQJJWw0LCBbJXNwICsgNCAqIDRdCisJc3RkCSVsNiwgWyVzcCArIDYgKiA0XQorCisJc3RkCSVpMCwgWyVzcCArIDggKiA0XQorCXN0ZAklaTIsIFslc3AgKyAxMCAqIDRdCisJc3RkCSVpNCwgWyVzcCArIDEyICogNF0KKwlzdGQJJWk2LCBbJXNwICsgMTQgKiA0XQorCisJcmVzdG9yZQkJCQkhIEdvIGJhY2sgdG8gdHJhcCB3aW5kb3cuCisJbW92CSVsNCwgJWcxCQkhIFJlc3RvcmUgJWcxCisKK3dpbmRvd19maW5lOgorCXNldGhpCSVoaShpbl90cmFwX2hhbmRsZXIpLCAlbDQKKwlsZAlbJWxvKGluX3RyYXBfaGFuZGxlcikgKyAlbDRdLCAlbDUKKwl0c3QJJWw1CisJYmcJcmVjdXJzaXZlX3RyYXAKKwlpbmMJJWw1CisKKwlzZXQJdHJhcHN0YWNrKzEwMDAqNCwgJXNwCSEgU3dpdGNoIHRvIHRyYXAgc3RhY2sKKworcmVjdXJzaXZlX3RyYXA6CisJc3QJJWw1LCBbJWxvKGluX3RyYXBfaGFuZGxlcikgKyAlbDRdCisJc3ViCSVzcCwoMTYrMSs2KzErNzIpKjQsJXNwCSEgTWFrZSByb29tIGZvciBpbnB1dCAmIGxvY2FscworIAkJCQkJISArIGhpZGRlbiBhcmcgKyBhcmcgc3BpbGwKKwkJCQkJISArIGRvdWJsZXdvcmQgYWxpZ25tZW50CisJCQkJCSEgKyByZWdpc3RlcnNbNzJdIGxvY2FsIHZhcgorCisJc3RkCSVnMCwgWyVzcCArICgyNCArIDApICogNF0gISByZWdpc3RlcnNbR3hdCisJc3RkCSVnMiwgWyVzcCArICgyNCArIDIpICogNF0KKwlzdGQJJWc0LCBbJXNwICsgKDI0ICsgNCkgKiA0XQorCXN0ZAklZzYsIFslc3AgKyAoMjQgKyA2KSAqIDRdCisKKwlzdGQJJWkwLCBbJXNwICsgKDI0ICsgOCkgKiA0XSAhIHJlZ2lzdGVyc1tPeF0KKwlzdGQJJWkyLCBbJXNwICsgKDI0ICsgMTApICogNF0KKwlzdGQJJWk0LCBbJXNwICsgKDI0ICsgMTIpICogNF0KKwlzdGQJJWk2LCBbJXNwICsgKDI0ICsgMTQpICogNF0KKwkJCQkJISBGMC0+RjMxIG5vdCBpbXBsZW1lbnRlZAorCW1vdgkleSwgJWw0CisJbW92CSV0YnIsICVsNQorCXN0CSVsNCwgWyVzcCArICgyNCArIDY0KSAqIDRdICEgWQorCXN0CSVsMCwgWyVzcCArICgyNCArIDY1KSAqIDRdICEgUFNSCisJc3QJJWwzLCBbJXNwICsgKDI0ICsgNjYpICogNF0gISBXSU0KKwlzdAklbDUsIFslc3AgKyAoMjQgKyA2NykgKiA0XSAhIFRCUgorCXN0CSVsMSwgWyVzcCArICgyNCArIDY4KSAqIDRdICEgUEMKKwlzdAklbDIsIFslc3AgKyAoMjQgKyA2OSkgKiA0XSAhIE5QQworCisJCQkJCSEgQ1BTUiBhbmQgRlBTUiBub3QgaW1wbAorCisJb3IJJWwwLCAweGYyMCwgJWw0CisJbW92CSVsNCwgJXBzcgkJISBUdXJuIG9uIHRyYXBzLCBkaXNhYmxlIGludGVycnVwdHMKKworCWNhbGwJX2hhbmRsZV9leGNlcHRpb24KKwlhZGQJJXNwLCAyNCAqIDQsICVvMAkhIFBhc3MgYWRkcmVzcyBvZiByZWdpc3RlcnMKKworISBSZWxvYWQgYWxsIG9mIHRoZSByZWdpc3RlcnMgdGhhdCBhcmVuJ3Qgb24gdGhlIHN0YWNrCisKKwlsZAlbJXNwICsgKDI0ICsgMSkgKiA0XSwgJWcxICEgcmVnaXN0ZXJzW0d4XQorCWxkZAlbJXNwICsgKDI0ICsgMikgKiA0XSwgJWcyCisJbGRkCVslc3AgKyAoMjQgKyA0KSAqIDRdLCAlZzQKKwlsZGQJWyVzcCArICgyNCArIDYpICogNF0sICVnNgorCisJbGRkCVslc3AgKyAoMjQgKyA4KSAqIDRdLCAlaTAgISByZWdpc3RlcnNbT3hdCisJbGRkCVslc3AgKyAoMjQgKyAxMCkgKiA0XSwgJWkyCisJbGRkCVslc3AgKyAoMjQgKyAxMikgKiA0XSwgJWk0CisJbGRkCVslc3AgKyAoMjQgKyAxNCkgKiA0XSwgJWk2CisKKwlsZGQJWyVzcCArICgyNCArIDY0KSAqIDRdLCAlbDAgISBZICYgUFNSCisJbGRkCVslc3AgKyAoMjQgKyA2OCkgKiA0XSwgJWwyICEgUEMgJiBOUEMKKworCXJlc3RvcmUJCQkJISBFbnN1cmUgdGhhdCBwcmV2aW91cyB3aW5kb3cgaXMgdmFsaWQKKwlzYXZlCSVnMCwgJWcwLCAlZzAJCSEgIGJ5IGNhdXNpbmcgYSB3aW5kb3dfdW5kZXJmbG93IHRyYXAKKworCW1vdgklbDAsICV5CisJbW92CSVsMSwgJXBzcgkJISBNYWtlIHN1cmUgdGhhdCB0cmFwcyBhcmUgZGlzYWJsZWQKKwkJCQkJISBmb3IgcmV0dAorCisJc2V0aGkJJWhpKGluX3RyYXBfaGFuZGxlciksICVsNAorCWxkCVslbG8oaW5fdHJhcF9oYW5kbGVyKSArICVsNF0sICVsNQorCWRlYwklbDUKKwlzdAklbDUsIFslbG8oaW5fdHJhcF9oYW5kbGVyKSArICVsNF0KKworCWptcGwJJWwyLCAlZzAJCSEgUmVzdG9yZSBvbGQgUEMKKwlyZXR0CSVsMwkJCSEgUmVzdG9yZSBvbGQgblBDCisiKTsKKworLyogQ29udmVydCBjaCBmcm9tIGEgaGV4IGRpZ2l0IHRvIGFuIGludCAqLworCitzdGF0aWMgaW50CitoZXgoY2gpCisgICAgIHVuc2lnbmVkIGNoYXIgY2g7Cit7CisgIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKQorICAgIHJldHVybiBjaC0nYScrMTA7CisgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQorICAgIHJldHVybiBjaC0nMCc7CisgIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKQorICAgIHJldHVybiBjaC0nQScrMTA7CisgIHJldHVybiAtMTsKK30KKworLyogc2NhbiBmb3IgdGhlIHNlcXVlbmNlICQ8ZGF0YT4jPGNoZWNrc3VtPiAgICAgKi8KKworc3RhdGljIHZvaWQKK2dldHBhY2tldChidWZmZXIpCisgICAgIGNoYXIgKmJ1ZmZlcjsKK3sKKyAgdW5zaWduZWQgY2hhciBjaGVja3N1bTsKKyAgdW5zaWduZWQgY2hhciB4bWl0Y3N1bTsKKyAgaW50IGk7CisgIGludCBjb3VudDsKKyAgdW5zaWduZWQgY2hhciBjaDsKKworICBkbworICAgIHsKKyAgICAgIC8qIHdhaXQgYXJvdW5kIGZvciB0aGUgc3RhcnQgY2hhcmFjdGVyLCBpZ25vcmUgYWxsIG90aGVyIGNoYXJhY3RlcnMgKi8KKyAgICAgIHdoaWxlICgoY2ggPSAoZ2V0RGVidWdDaGFyKCkgJiAweDdmKSkgIT0gJyQnKSA7CisKKyAgICAgIGNoZWNrc3VtID0gMDsKKyAgICAgIHhtaXRjc3VtID0gLTE7CisKKyAgICAgIGNvdW50ID0gMDsKKworICAgICAgLyogbm93LCByZWFkIHVudGlsIGEgIyBvciBlbmQgb2YgYnVmZmVyIGlzIGZvdW5kICovCisgICAgICB3aGlsZSAoY291bnQgPCBCVUZNQVgpCisJeworCSAgY2ggPSBnZXREZWJ1Z0NoYXIoKSAmIDB4N2Y7CisJICBpZiAoY2ggPT0gJyMnKQorCSAgICBicmVhazsKKwkgIGNoZWNrc3VtID0gY2hlY2tzdW0gKyBjaDsKKwkgIGJ1ZmZlcltjb3VudF0gPSBjaDsKKwkgIGNvdW50ID0gY291bnQgKyAxOworCX0KKworICAgICAgaWYgKGNvdW50ID49IEJVRk1BWCkKKwljb250aW51ZTsKKworICAgICAgYnVmZmVyW2NvdW50XSA9IDA7CisKKyAgICAgIGlmIChjaCA9PSAnIycpCisJeworCSAgeG1pdGNzdW0gPSBoZXgoZ2V0RGVidWdDaGFyKCkgJiAweDdmKSA8PCA0OworCSAgeG1pdGNzdW0gfD0gaGV4KGdldERlYnVnQ2hhcigpICYgMHg3Zik7CisjaWYgMAorCSAgLyogSHVtYW5zIHNob3VsZG4ndCBoYXZlIHRvIGZpZ3VyZSBvdXQgY2hlY2tzdW1zIHRvIHR5cGUgdG8gaXQuICovCisJICBwdXREZWJ1Z0NoYXIgKCcrJyk7CisJICByZXR1cm47CisjZW5kaWYKKwkgIGlmIChjaGVja3N1bSAhPSB4bWl0Y3N1bSkKKwkgICAgcHV0RGVidWdDaGFyKCctJyk7CS8qIGZhaWxlZCBjaGVja3N1bSAqLworCSAgZWxzZQorCSAgICB7CisJICAgICAgcHV0RGVidWdDaGFyKCcrJyk7IC8qIHN1Y2Nlc3NmdWwgdHJhbnNmZXIgKi8KKwkgICAgICAvKiBpZiBhIHNlcXVlbmNlIGNoYXIgaXMgcHJlc2VudCwgcmVwbHkgdGhlIHNlcXVlbmNlIElEICovCisJICAgICAgaWYgKGJ1ZmZlclsyXSA9PSAnOicpCisJCXsKKwkJICBwdXREZWJ1Z0NoYXIoYnVmZmVyWzBdKTsKKwkJICBwdXREZWJ1Z0NoYXIoYnVmZmVyWzFdKTsKKwkJICAvKiByZW1vdmUgc2VxdWVuY2UgY2hhcnMgZnJvbSBidWZmZXIgKi8KKwkJICBjb3VudCA9IHN0cmxlbihidWZmZXIpOworCQkgIGZvciAoaT0zOyBpIDw9IGNvdW50OyBpKyspCisJCSAgICBidWZmZXJbaS0zXSA9IGJ1ZmZlcltpXTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgd2hpbGUgKGNoZWNrc3VtICE9IHhtaXRjc3VtKTsKK30KKworLyogc2VuZCB0aGUgcGFja2V0IGluIGJ1ZmZlci4gICovCisKK3N0YXRpYyB2b2lkCitwdXRwYWNrZXQoYnVmZmVyKQorICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7Cit7CisgIHVuc2lnbmVkIGNoYXIgY2hlY2tzdW07CisgIGludCBjb3VudDsKKyAgdW5zaWduZWQgY2hhciBjaDsKKworICAvKiAgJDxwYWNrZXQgaW5mbz4jPGNoZWNrc3VtPi4gKi8KKyAgZG8KKyAgICB7CisgICAgICBwdXREZWJ1Z0NoYXIoJyQnKTsKKyAgICAgIGNoZWNrc3VtID0gMDsKKyAgICAgIGNvdW50ID0gMDsKKworICAgICAgd2hpbGUgKGNoID0gYnVmZmVyW2NvdW50XSkKKwl7CisJICBwdXREZWJ1Z0NoYXIoY2gpOworCSAgY2hlY2tzdW0gKz0gY2g7CisJICBjb3VudCArPSAxOworCX0KKworICAgICAgcHV0RGVidWdDaGFyKCcjJyk7CisgICAgICBwdXREZWJ1Z0NoYXIoaGV4Y2hhcnNbY2hlY2tzdW0gPj4gNF0pOworICAgICAgcHV0RGVidWdDaGFyKGhleGNoYXJzW2NoZWNrc3VtICYgMHhmXSk7CisKKyAgICB9CisgIHdoaWxlICgoZ2V0RGVidWdDaGFyKCkgJiAweDdmKSAhPSAnKycpOworfQorCitzdGF0aWMgY2hhciByZW1jb21JbkJ1ZmZlcltCVUZNQVhdOworc3RhdGljIGNoYXIgcmVtY29tT3V0QnVmZmVyW0JVRk1BWF07CisKKy8qIEluZGljYXRlIHRvIGNhbGxlciBvZiBtZW0yaGV4IG9yIGhleDJtZW0gdGhhdCB0aGVyZSBoYXMgYmVlbiBhbgorICAgZXJyb3IuICAqLworc3RhdGljIHZvbGF0aWxlIGludCBtZW1fZXJyID0gMDsKKworLyogQ29udmVydCB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgbWVtIGludG8gaGV4LCBwbGFjaW5nIHJlc3VsdCBpbiBidWYuCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBsYXN0IGNoYXIgcHV0IGluIGJ1ZiAobnVsbCksIGluIGNhc2Ugb2YgbWVtIGZhdWx0LAorICogcmV0dXJuIDAuCisgKiBJZiBNQVlfRkFVTFQgaXMgbm9uLXplcm8sIHRoZW4gd2Ugd2lsbCBoYW5kbGUgbWVtb3J5IGZhdWx0cyBieSByZXR1cm5pbmcKKyAqIGEgMCwgZWxzZSB0cmVhdCBhIGZhdWx0IGxpa2UgYW55IG90aGVyIGZhdWx0IGluIHRoZSBzdHViLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK21lbTJoZXgobWVtLCBidWYsIGNvdW50LCBtYXlfZmF1bHQpCisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbTsKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgICBpbnQgY291bnQ7CisgICAgIGludCBtYXlfZmF1bHQ7Cit7CisgIHVuc2lnbmVkIGNoYXIgY2g7CisKKyAgc2V0X21lbV9mYXVsdF90cmFwKG1heV9mYXVsdCk7CisKKyAgd2hpbGUgKGNvdW50LS0gPiAwKQorICAgIHsKKyAgICAgIGNoID0gKm1lbSsrOworICAgICAgaWYgKG1lbV9lcnIpCisJcmV0dXJuIDA7CisgICAgICAqYnVmKysgPSBoZXhjaGFyc1tjaCA+PiA0XTsKKyAgICAgICpidWYrKyA9IGhleGNoYXJzW2NoICYgMHhmXTsKKyAgICB9CisKKyAgKmJ1ZiA9IDA7CisKKyAgc2V0X21lbV9mYXVsdF90cmFwKDApOworCisgIHJldHVybiBidWY7Cit9CisKKy8qIGNvbnZlcnQgdGhlIGhleCBhcnJheSBwb2ludGVkIHRvIGJ5IGJ1ZiBpbnRvIGJpbmFyeSB0byBiZSBwbGFjZWQgaW4gbWVtCisgKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjaGFyYWN0ZXIgQUZURVIgdGhlIGxhc3QgYnl0ZSB3cml0dGVuICovCisKK3N0YXRpYyBjaGFyICoKK2hleDJtZW0oYnVmLCBtZW0sIGNvdW50LCBtYXlfZmF1bHQpCisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICAgdW5zaWduZWQgY2hhciAqbWVtOworICAgICBpbnQgY291bnQ7CisgICAgIGludCBtYXlfZmF1bHQ7Cit7CisgIGludCBpOworICB1bnNpZ25lZCBjaGFyIGNoOworCisgIHNldF9tZW1fZmF1bHRfdHJhcChtYXlfZmF1bHQpOworCisgIGZvciAoaT0wOyBpPGNvdW50OyBpKyspCisgICAgeworICAgICAgY2ggPSBoZXgoKmJ1ZisrKSA8PCA0OworICAgICAgY2ggfD0gaGV4KCpidWYrKyk7CisgICAgICAqbWVtKysgPSBjaDsKKyAgICAgIGlmIChtZW1fZXJyKQorCXJldHVybiAwOworICAgIH0KKworICBzZXRfbWVtX2ZhdWx0X3RyYXAoMCk7CisKKyAgcmV0dXJuIG1lbTsKK30KKworLyogVGhpcyB0YWJsZSBjb250YWlucyB0aGUgbWFwcGluZyBiZXR3ZWVuIFNQQVJDIGhhcmR3YXJlIHRyYXAgdHlwZXMsIGFuZAorICAgc2lnbmFscywgd2hpY2ggYXJlIHByaW1hcmlseSB3aGF0IEdEQiB1bmRlcnN0YW5kcy4gIEl0IGFsc28gaW5kaWNhdGVzCisgICB3aGljaCBoYXJkd2FyZSB0cmFwcyB3ZSBuZWVkIHRvIGNvbW1hbmRlZXIgd2hlbiBpbml0aWFsaXppbmcgdGhlIHN0dWIuICovCisKK3N0YXRpYyBzdHJ1Y3QgaGFyZF90cmFwX2luZm8KK3sKKyAgdW5zaWduZWQgY2hhciB0dDsJCS8qIFRyYXAgdHlwZSBjb2RlIGZvciBTUEFSQ2xpdGUgKi8KKyAgdW5zaWduZWQgY2hhciBzaWdubzsJCS8qIFNpZ25hbCB0aGF0IHdlIG1hcCB0aGlzIHRyYXAgaW50byAqLworfSBoYXJkX3RyYXBfaW5mb1tdID0geworICB7MSwgU0lHU0VHVn0sCQkJLyogaW5zdHJ1Y3Rpb24gYWNjZXNzIGVycm9yICovCisgIHsyLCBTSUdJTEx9LAkJCS8qIHByaXZpbGVnZWQgaW5zdHJ1Y3Rpb24gKi8KKyAgezMsIFNJR0lMTH0sCQkJLyogaWxsZWdhbCBpbnN0cnVjdGlvbiAqLworICB7NCwgU0lHRU1UfSwJCQkvKiBmcCBkaXNhYmxlZCAqLworICB7MzYsIFNJR0VNVH0sCQkJLyogY3AgZGlzYWJsZWQgKi8KKyAgezcsIFNJR0JVU30sCQkJLyogbWVtIGFkZHJlc3Mgbm90IGFsaWduZWQgKi8KKyAgezksIFNJR1NFR1Z9LAkJCS8qIGRhdGEgYWNjZXNzIGV4Y2VwdGlvbiAqLworICB7MTAsIFNJR0VNVH0sCQkJLyogdGFnIG92ZXJmbG93ICovCisgIHsxMjgrMSwgU0lHVFJBUH0sCQkvKiB0YSAxIC0gbm9ybWFsIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gKi8KKyAgezAsIDB9CQkJLyogTXVzdCBiZSBsYXN0ICovCit9OworCisvKiBTZXQgdXAgZXhjZXB0aW9uIGhhbmRsZXJzIGZvciB0cmFjaW5nIGFuZCBicmVha3BvaW50cyAqLworCit2b2lkCitzZXRfZGVidWdfdHJhcHMoKQoreworICBzdHJ1Y3QgaGFyZF90cmFwX2luZm8gKmh0OworCisgIGZvciAoaHQgPSBoYXJkX3RyYXBfaW5mbzsgaHQtPnR0ICYmIGh0LT5zaWdubzsgaHQrKykKKyAgICBleGNlcHRpb25IYW5kbGVyKGh0LT50dCwgdHJhcF9sb3cpOworCisgIC8qIEluIGNhc2UgR0RCIGlzIHN0YXJ0ZWQgYmVmb3JlIHVzLCBhY2sgYW55IHBhY2tldHMgKHByZXN1bWFibHkKKyAgICAgIiQ/I3h4Iikgc2l0dGluZyB0aGVyZS4gICovCisKKyAgcHV0RGVidWdDaGFyICgnKycpOworCisgIGluaXRpYWxpemVkID0gMTsKK30KKworYXNtICgiCishIFRyYXAgaGFuZGxlciBmb3IgbWVtb3J5IGVycm9ycy4gIFRoaXMganVzdCBzZXRzIG1lbV9lcnIgdG8gYmUgbm9uLXplcm8uICBJdAorISBhc3N1bWVzIHRoYXQgJWwxIGlzIG5vbi16ZXJvLiAgVGhpcyBzaG91bGQgYmUgc2FmZSwgYXMgaXQgaXMgZG91YnRmdWwgdGhhdAorISAwIHdvdWxkIGV2ZXIgY29udGFpbiBjb2RlIHRoYXQgY291bGQgbWVtIGZhdWx0LiAgVGhpcyByb3V0aW5lIHdpbGwgc2tpcAorISBwYXN0IHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbiBhZnRlciBzZXR0aW5nIG1lbV9lcnIuCisKKwkudGV4dAorCS5hbGlnbiA0CisKK19mbHRyX3NldF9tZW1fZXJyOgorCXNldGhpICVoaShfbWVtX2VyciksICVsMAorCXN0ICVsMSwgWyVsMCArICVsbyhfbWVtX2VycildCisJam1wbCAlbDIsICVnMAorCXJldHQgJWwyKzQKKyIpOworCitzdGF0aWMgdm9pZAorc2V0X21lbV9mYXVsdF90cmFwKGVuYWJsZSkKKyAgICAgaW50IGVuYWJsZTsKK3sKKyAgZXh0ZXJuIHZvaWQgZmx0cl9zZXRfbWVtX2VycigpOworICBtZW1fZXJyID0gMDsKKworICBpZiAoZW5hYmxlKQorICAgIGV4Y2VwdGlvbkhhbmRsZXIoOSwgZmx0cl9zZXRfbWVtX2Vycik7CisgIGVsc2UKKyAgICBleGNlcHRpb25IYW5kbGVyKDksIHRyYXBfbG93KTsKK30KKworLyogQ29udmVydCB0aGUgU1BBUkMgaGFyZHdhcmUgdHJhcCB0eXBlIGNvZGUgdG8gYSB1bml4IHNpZ25hbCBudW1iZXIuICovCisKK3N0YXRpYyBpbnQKK2NvbXB1dGVTaWduYWwodHQpCisgICAgIGludCB0dDsKK3sKKyAgc3RydWN0IGhhcmRfdHJhcF9pbmZvICpodDsKKworICBmb3IgKGh0ID0gaGFyZF90cmFwX2luZm87IGh0LT50dCAmJiBodC0+c2lnbm87IGh0KyspCisgICAgaWYgKGh0LT50dCA9PSB0dCkKKyAgICAgIHJldHVybiBodC0+c2lnbm87CisKKyAgcmV0dXJuIFNJR0hVUDsJCS8qIGRlZmF1bHQgZm9yIHRoaW5ncyB3ZSBkb24ndCBrbm93IGFib3V0ICovCit9CisKKy8qCisgKiBXaGlsZSB3ZSBmaW5kIG5pY2UgaGV4IGNoYXJzLCBidWlsZCBhbiBpbnQuCisgKiBSZXR1cm4gbnVtYmVyIG9mIGNoYXJzIHByb2Nlc3NlZC4KKyAqLworCitzdGF0aWMgaW50CitoZXhUb0ludChjaGFyICoqcHRyLCBpbnQgKmludFZhbHVlKQoreworICBpbnQgbnVtQ2hhcnMgPSAwOworICBpbnQgaGV4VmFsdWU7CisKKyAgKmludFZhbHVlID0gMDsKKworICB3aGlsZSAoKipwdHIpCisgICAgeworICAgICAgaGV4VmFsdWUgPSBoZXgoKipwdHIpOworICAgICAgaWYgKGhleFZhbHVlIDwgMCkKKwlicmVhazsKKworICAgICAgKmludFZhbHVlID0gKCppbnRWYWx1ZSA8PCA0KSB8IGhleFZhbHVlOworICAgICAgbnVtQ2hhcnMgKys7CisKKyAgICAgICgqcHRyKSsrOworICAgIH0KKworICByZXR1cm4gKG51bUNoYXJzKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBhbGwgY29tbWFuZCBwcm9jZXNpbmcgZm9yIGludGVyZmFjaW5nIHRvIGdkYi4gIEl0CisgKiByZXR1cm5zIDEgaWYgeW91IHNob3VsZCBza2lwIHRoZSBpbnN0cnVjdGlvbiBhdCB0aGUgdHJhcCBhZGRyZXNzLCAwCisgKiBvdGhlcndpc2UuCisgKi8KKworZXh0ZXJuIHZvaWQgYnJlYWtpbnN0KCk7CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfZXhjZXB0aW9uIChyZWdpc3RlcnMpCisgICAgIHVuc2lnbmVkIGxvbmcgKnJlZ2lzdGVyczsKK3sKKyAgaW50IHR0OwkJCS8qIFRyYXAgdHlwZSAqLworICBpbnQgc2lndmFsOworICBpbnQgYWRkcjsKKyAgaW50IGxlbmd0aDsKKyAgY2hhciAqcHRyOworICB1bnNpZ25lZCBsb25nICpzcDsKKworLyogRmlyc3QsIHdlIG11c3QgZm9yY2UgYWxsIG9mIHRoZSB3aW5kb3dzIHRvIGJlIHNwaWxsZWQgb3V0ICovCisKKyAgYXNtKCIJc2F2ZSAlc3AsIC02NCwgJXNwCisJc2F2ZSAlc3AsIC02NCwgJXNwCisJc2F2ZSAlc3AsIC02NCwgJXNwCisJc2F2ZSAlc3AsIC02NCwgJXNwCisJc2F2ZSAlc3AsIC02NCwgJXNwCisJc2F2ZSAlc3AsIC02NCwgJXNwCisJc2F2ZSAlc3AsIC02NCwgJXNwCisJc2F2ZSAlc3AsIC02NCwgJXNwCisJcmVzdG9yZQorCXJlc3RvcmUKKwlyZXN0b3JlCisJcmVzdG9yZQorCXJlc3RvcmUKKwlyZXN0b3JlCisJcmVzdG9yZQorCXJlc3RvcmUKKyIpOworCisgIGlmIChyZWdpc3RlcnNbUENdID09ICh1bnNpZ25lZCBsb25nKWJyZWFraW5zdCkKKyAgICB7CisgICAgICByZWdpc3RlcnNbUENdID0gcmVnaXN0ZXJzW05QQ107CisgICAgICByZWdpc3RlcnNbTlBDXSArPSA0OworICAgIH0KKworICBzcCA9ICh1bnNpZ25lZCBsb25nICopcmVnaXN0ZXJzW1NQXTsKKworICB0dCA9IChyZWdpc3RlcnNbVEJSXSA+PiA0KSAmIDB4ZmY7CisKKyAgLyogcmVwbHkgdG8gaG9zdCB0aGF0IGFuIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgKi8KKyAgc2lndmFsID0gY29tcHV0ZVNpZ25hbCh0dCk7CisgIHB0ciA9IHJlbWNvbU91dEJ1ZmZlcjsKKworICAqcHRyKysgPSAnVCc7CisgICpwdHIrKyA9IGhleGNoYXJzW3NpZ3ZhbCA+PiA0XTsKKyAgKnB0cisrID0gaGV4Y2hhcnNbc2lndmFsICYgMHhmXTsKKworICAqcHRyKysgPSBoZXhjaGFyc1tQQyA+PiA0XTsKKyAgKnB0cisrID0gaGV4Y2hhcnNbUEMgJiAweGZdOworICAqcHRyKysgPSAnOic7CisgIHB0ciA9IG1lbTJoZXgoKGNoYXIgKikmcmVnaXN0ZXJzW1BDXSwgcHRyLCA0LCAwKTsKKyAgKnB0cisrID0gJzsnOworCisgICpwdHIrKyA9IGhleGNoYXJzW0ZQID4+IDRdOworICAqcHRyKysgPSBoZXhjaGFyc1tGUCAmIDB4Zl07CisgICpwdHIrKyA9ICc6JzsKKyAgcHRyID0gbWVtMmhleChzcCArIDggKyA2LCBwdHIsIDQsIDApOyAvKiBGUCAqLworICAqcHRyKysgPSAnOyc7CisKKyAgKnB0cisrID0gaGV4Y2hhcnNbU1AgPj4gNF07CisgICpwdHIrKyA9IGhleGNoYXJzW1NQICYgMHhmXTsKKyAgKnB0cisrID0gJzonOworICBwdHIgPSBtZW0yaGV4KChjaGFyICopJnNwLCBwdHIsIDQsIDApOworICAqcHRyKysgPSAnOyc7CisKKyAgKnB0cisrID0gaGV4Y2hhcnNbTlBDID4+IDRdOworICAqcHRyKysgPSBoZXhjaGFyc1tOUEMgJiAweGZdOworICAqcHRyKysgPSAnOic7CisgIHB0ciA9IG1lbTJoZXgoKGNoYXIgKikmcmVnaXN0ZXJzW05QQ10sIHB0ciwgNCwgMCk7CisgICpwdHIrKyA9ICc7JzsKKworICAqcHRyKysgPSBoZXhjaGFyc1tPNyA+PiA0XTsKKyAgKnB0cisrID0gaGV4Y2hhcnNbTzcgJiAweGZdOworICAqcHRyKysgPSAnOic7CisgIHB0ciA9IG1lbTJoZXgoKGNoYXIgKikmcmVnaXN0ZXJzW083XSwgcHRyLCA0LCAwKTsKKyAgKnB0cisrID0gJzsnOworCisgICpwdHIrKyA9IDA7CisKKyAgcHV0cGFja2V0KHJlbWNvbU91dEJ1ZmZlcik7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgcmVtY29tT3V0QnVmZmVyWzBdID0gMDsKKworICAgICAgZ2V0cGFja2V0KHJlbWNvbUluQnVmZmVyKTsKKyAgICAgIHN3aXRjaCAocmVtY29tSW5CdWZmZXJbMF0pCisJeworCWNhc2UgJz8nOgorCSAgcmVtY29tT3V0QnVmZmVyWzBdID0gJ1MnOworCSAgcmVtY29tT3V0QnVmZmVyWzFdID0gaGV4Y2hhcnNbc2lndmFsID4+IDRdOworCSAgcmVtY29tT3V0QnVmZmVyWzJdID0gaGV4Y2hhcnNbc2lndmFsICYgMHhmXTsKKwkgIHJlbWNvbU91dEJ1ZmZlclszXSA9IDA7CisJICBicmVhazsKKworCWNhc2UgJ2QnOgorCQkJCS8qIHRvZ2dsZSBkZWJ1ZyBmbGFnICovCisJICBicmVhazsKKworCWNhc2UgJ2cnOgkJLyogcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgQ1BVIHJlZ2lzdGVycyAqLworCSAgeworCSAgICBwdHIgPSByZW1jb21PdXRCdWZmZXI7CisJICAgIHB0ciA9IG1lbTJoZXgoKGNoYXIgKilyZWdpc3RlcnMsIHB0ciwgMTYgKiA0LCAwKTsgLyogRyAmIE8gcmVncyAqLworCSAgICBwdHIgPSBtZW0yaGV4KHNwICsgMCwgcHRyLCAxNiAqIDQsIDApOyAvKiBMICYgSSByZWdzICovCisJICAgIG1lbXNldChwdHIsICcwJywgMzIgKiA4KTsgLyogRmxvYXRpbmcgcG9pbnQgKi8KKwkgICAgbWVtMmhleCgoY2hhciAqKSZyZWdpc3RlcnNbWV0sCisJCSAgICBwdHIgKyAzMiAqIDQgKiAyLAorCQkgICAgOCAqIDQsCisJCSAgICAwKTsJCS8qIFksIFBTUiwgV0lNLCBUQlIsIFBDLCBOUEMsIEZQU1IsIENQU1IgKi8KKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSAnRyc6CSAgIC8qIHNldCB0aGUgdmFsdWUgb2YgdGhlIENQVSByZWdpc3RlcnMgLSByZXR1cm4gT0sgKi8KKwkgIHsKKwkgICAgdW5zaWduZWQgbG9uZyAqbmV3c3AsIHBzcjsKKworCSAgICBwc3IgPSByZWdpc3RlcnNbUFNSXTsKKworCSAgICBwdHIgPSAmcmVtY29tSW5CdWZmZXJbMV07CisJICAgIGhleDJtZW0ocHRyLCAoY2hhciAqKXJlZ2lzdGVycywgMTYgKiA0LCAwKTsgLyogRyAmIE8gcmVncyAqLworCSAgICBoZXgybWVtKHB0ciArIDE2ICogNCAqIDIsIHNwICsgMCwgMTYgKiA0LCAwKTsgLyogTCAmIEkgcmVncyAqLworCSAgICBoZXgybWVtKHB0ciArIDY0ICogNCAqIDIsIChjaGFyICopJnJlZ2lzdGVyc1tZXSwKKwkJICAgIDggKiA0LCAwKTsJLyogWSwgUFNSLCBXSU0sIFRCUiwgUEMsIE5QQywgRlBTUiwgQ1BTUiAqLworCisJICAgIC8qIFNlZSBpZiB0aGUgc3RhY2sgcG9pbnRlciBoYXMgbW92ZWQuICBJZiBzbywgdGhlbiBjb3B5IHRoZSBzYXZlZAorCSAgICAgICBsb2NhbHMgYW5kIGlucyB0byB0aGUgbmV3IGxvY2F0aW9uLiAgVGhpcyBrZWVwcyB0aGUgd2luZG93CisJICAgICAgIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgcm91dGluZXMgaGFwcHkuICAqLworCisJICAgIG5ld3NwID0gKHVuc2lnbmVkIGxvbmcgKilyZWdpc3RlcnNbU1BdOworCSAgICBpZiAoc3AgIT0gbmV3c3ApCisJICAgICAgc3AgPSBtZW1jcHkobmV3c3AsIHNwLCAxNiAqIDQpOworCisJICAgIC8qIERvbid0IGFsbG93IENXUCB0byBiZSBtb2RpZmllZC4gKi8KKworCSAgICBpZiAocHNyICE9IHJlZ2lzdGVyc1tQU1JdKQorCSAgICAgIHJlZ2lzdGVyc1tQU1JdID0gKHBzciAmIDB4MWYpIHwgKHJlZ2lzdGVyc1tQU1JdICYgfjB4MWYpOworCisJICAgIHN0cmNweShyZW1jb21PdXRCdWZmZXIsIk9LIik7CisJICB9CisJICBicmVhazsKKworCWNhc2UgJ20nOgkgIC8qIG1BQS4uQUEsTExMTCAgUmVhZCBMTExMIGJ5dGVzIGF0IGFkZHJlc3MgQUEuLkFBICovCisJICAvKiBUcnkgdG8gcmVhZCAleCwleC4gICovCisKKwkgIHB0ciA9ICZyZW1jb21JbkJ1ZmZlclsxXTsKKworCSAgaWYgKGhleFRvSW50KCZwdHIsICZhZGRyKQorCSAgICAgICYmICpwdHIrKyA9PSAnLCcKKwkgICAgICAmJiBoZXhUb0ludCgmcHRyLCAmbGVuZ3RoKSkKKwkgICAgeworCSAgICAgIGlmIChtZW0yaGV4KChjaGFyICopYWRkciwgcmVtY29tT3V0QnVmZmVyLCBsZW5ndGgsIDEpKQorCQlicmVhazsKKworCSAgICAgIHN0cmNweSAocmVtY29tT3V0QnVmZmVyLCAiRTAzIik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgc3RyY3B5KHJlbWNvbU91dEJ1ZmZlciwiRTAxIik7CisJICBicmVhazsKKworCWNhc2UgJ00nOiAvKiBNQUEuLkFBLExMTEw6IFdyaXRlIExMTEwgYnl0ZXMgYXQgYWRkcmVzcyBBQS5BQSByZXR1cm4gT0sgKi8KKwkgIC8qIFRyeSB0byByZWFkICcleCwleDonLiAgKi8KKworCSAgcHRyID0gJnJlbWNvbUluQnVmZmVyWzFdOworCisJICBpZiAoaGV4VG9JbnQoJnB0ciwgJmFkZHIpCisJICAgICAgJiYgKnB0cisrID09ICcsJworCSAgICAgICYmIGhleFRvSW50KCZwdHIsICZsZW5ndGgpCisJICAgICAgJiYgKnB0cisrID09ICc6JykKKwkgICAgeworCSAgICAgIGlmIChoZXgybWVtKHB0ciwgKGNoYXIgKilhZGRyLCBsZW5ndGgsIDEpKQorCQlzdHJjcHkocmVtY29tT3V0QnVmZmVyLCAiT0siKTsKKwkgICAgICBlbHNlCisJCXN0cmNweShyZW1jb21PdXRCdWZmZXIsICJFMDMiKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBzdHJjcHkocmVtY29tT3V0QnVmZmVyLCAiRTAyIik7CisJICBicmVhazsKKworCWNhc2UgJ2MnOiAgICAvKiBjQUEuLkFBICAgIENvbnRpbnVlIGF0IGFkZHJlc3MgQUEuLkFBKG9wdGlvbmFsKSAqLworCSAgLyogdHJ5IHRvIHJlYWQgb3B0aW9uYWwgcGFyYW1ldGVyLCBwYyB1bmNoYW5nZWQgaWYgbm8gcGFybSAqLworCisJICBwdHIgPSAmcmVtY29tSW5CdWZmZXJbMV07CisJICBpZiAoaGV4VG9JbnQoJnB0ciwgJmFkZHIpKQorCSAgICB7CisJICAgICAgcmVnaXN0ZXJzW1BDXSA9IGFkZHI7CisJICAgICAgcmVnaXN0ZXJzW05QQ10gPSBhZGRyICsgNDsKKwkgICAgfQorCisvKiBOZWVkIHRvIGZsdXNoIHRoZSBpbnN0cnVjdGlvbiBjYWNoZSBoZXJlLCBhcyB3ZSBtYXkgaGF2ZSBkZXBvc2l0ZWQgYQorICAgYnJlYWtwb2ludCwgYW5kIHRoZSBpY2FjaGUgcHJvYmFibHkgaGFzIG5vIHdheSBvZiBrbm93aW5nIHRoYXQgYSBkYXRhIHJlZiB0bworICAgc29tZSBsb2NhdGlvbiBtYXkgaGF2ZSBjaGFuZ2VkIHNvbWV0aGluZyB0aGF0IGlzIGluIHRoZSBpbnN0cnVjdGlvbiBjYWNoZS4KKyAqLworCisJICBmbHVzaF9pX2NhY2hlKCk7CisJICByZXR1cm47CisKKwkgIC8qIGtpbGwgdGhlIHByb2dyYW0gKi8KKwljYXNlICdrJyA6CQkvKiBkbyBub3RoaW5nICovCisJICBicmVhazsKKyNpZiAwCisJY2FzZSAndCc6CQkvKiBUZXN0IGZlYXR1cmUgKi8KKwkgIGFzbSAoIiBzdGQgJWYzMCxbJXNwXSIpOworCSAgYnJlYWs7CisjZW5kaWYKKwljYXNlICdyJzoJCS8qIFJlc2V0ICovCisJICBhc20gKCJjYWxsIDAKKwkJbm9wICIpOworCSAgYnJlYWs7CisKKyNpZiAwCitEaXNhYmxlZCB1bnRpbCB3ZSBjYW4gdW5zY3JldyB0aGlzIHByb3Blcmx5CisKKwljYXNlICdiJzoJICAvKiBiQkIuLi4gIFNldCBiYXVkIHJhdGUgdG8gQkIuLi4gKi8KKwkgIHsKKwkgICAgaW50IGJhdWRyYXRlOworCSAgICBleHRlcm4gdm9pZCBzZXRfdGltZXJfMygpOworCisJICAgIHB0ciA9ICZyZW1jb21JbkJ1ZmZlclsxXTsKKwkgICAgaWYgKCFoZXhUb0ludCgmcHRyLCAmYmF1ZHJhdGUpKQorCSAgICAgIHsKKwkJc3RyY3B5KHJlbWNvbU91dEJ1ZmZlciwiQjAxIik7CisJCWJyZWFrOworCSAgICAgIH0KKworCSAgICAvKiBDb252ZXJ0IGJhdWQgcmF0ZSB0byB1YXJ0IGNsb2NrIGRpdmlkZXIgKi8KKwkgICAgc3dpdGNoIChiYXVkcmF0ZSkKKwkgICAgICB7CisJICAgICAgY2FzZSAzODQwMDoKKwkJYmF1ZHJhdGUgPSAxNjsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAxOTIwMDoKKwkJYmF1ZHJhdGUgPSAzMzsKKwkJYnJlYWs7CisJICAgICAgY2FzZSA5NjAwOgorCQliYXVkcmF0ZSA9IDY1OworCQlicmVhazsKKwkgICAgICBkZWZhdWx0OgorCQlzdHJjcHkocmVtY29tT3V0QnVmZmVyLCJCMDIiKTsKKwkJZ290byB4MTsKKwkgICAgICB9CisKKwkgICAgcHV0cGFja2V0KCJPSyIpOwkvKiBBY2sgYmVmb3JlIGNoYW5naW5nIHNwZWVkICovCisJICAgIHNldF90aW1lcl8zKGJhdWRyYXRlKTsgLyogU2V0IGl0ICovCisJICB9Cit4MToJICBicmVhazsKKyNlbmRpZgorCX0JCQkvKiBzd2l0Y2ggKi8KKworICAgICAgLyogcmVwbHkgdG8gdGhlIHJlcXVlc3QgKi8KKyAgICAgIHB1dHBhY2tldChyZW1jb21PdXRCdWZmZXIpOworICAgIH0KK30KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIGdlbmVyYXRlIGEgYnJlYWtwb2ludCBleGNlcHRpb24uICBJdCBpcyB1c2VkIGF0IHRoZQorICAgYmVnaW5uaW5nIG9mIGEgcHJvZ3JhbSB0byBzeW5jIHVwIHdpdGggYSBkZWJ1Z2dlciBhbmQgY2FuIGJlIHVzZWQKKyAgIG90aGVyd2lzZSBhcyBhIHF1aWNrIG1lYW5zIHRvIHN0b3AgcHJvZ3JhbSBleGVjdXRpb24gYW5kICJicmVhayIgaW50bworICAgdGhlIGRlYnVnZ2VyLiAqLworCit2b2lkCiticmVha3BvaW50KCkKK3sKKyAgaWYgKCFpbml0aWFsaXplZCkKKyAgICByZXR1cm47CisKKyAgYXNtKCIJLmdsb2JsIF9icmVha2luc3QKKworCV9icmVha2luc3Q6IHRhIDEKKyAgICAgICIpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3NwYXJjLXRkZXAuYyBiL2dkYi9zcGFyYy10ZGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzYjMyYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9zcGFyYy10ZGVwLmMKQEAgLTAsMCArMSwyMTIwIEBACisvKiBUYXJnZXQtZGVwZW5kZW50IGNvZGUgZm9yIHRoZSBTUEFSQyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qID8/PyBTdXBwb3J0IGZvciBjYWxsaW5nIGZ1bmN0aW9ucyBmcm9tIGdkYiBpbiBzcGFyYzY0IGlzIHVuZmluaXNoZWQuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJvYnN0YWNrLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisKKyNpZmRlZglVU0VfUFJPQ19GUworI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorCisjaWYgZGVmaW5lZChUQVJHRVRfU1BBUkNMRVQpIHx8IGRlZmluZWQoVEFSR0VUX1NQQVJDTElURSkKKyNkZWZpbmUgU1BBUkNfSEFTX0ZQVSAwCisjZWxzZQorI2RlZmluZSBTUEFSQ19IQVNfRlBVIDEKKyNlbmRpZgorCisjaWZkZWYgR0RCX1RBUkdFVF9JU19TUEFSQzY0CisjZGVmaW5lIEZQX1JFR0lTVEVSX0JZVEVTICg2NCAqIDQpCisjZWxzZQorI2RlZmluZSBGUF9SRUdJU1RFUl9CWVRFUyAoMzIgKiA0KQorI2VuZGlmCisKKy8qIElmIG5vdCBkZWZpbmVkLCBhc3N1bWUgMzIgYml0IHNwYXJjLiAgKi8KKyNpZm5kZWYgRlBfTUFYX1JFR05VTQorI2RlZmluZSBGUF9NQVhfUkVHTlVNIChGUDBfUkVHTlVNICsgMzIpCisjZW5kaWYKKworI2RlZmluZSBTUEFSQ19JTlRSRUdfU0laRSAoUkVHSVNURVJfUkFXX1NJWkUgKEcwX1JFR05VTSkpCisKKy8qIEZyb20gaW5mcnVuLmMgKi8KK2V4dGVybiBpbnQgc3RvcF9hZnRlcl90cmFwOworCisvKiBXZSBkb24ndCBzdG9yZSBhbGwgcmVnaXN0ZXJzIGltbWVkaWF0ZWx5IHdoZW4gcmVxdWVzdGVkLCBzaW5jZSB0aGV5CisgICBnZXQgc2VudCBvdmVyIGluIGxhcmdlIGNodW5rcyBhbnl3YXkuICBJbnN0ZWFkLCB3ZSBhY2N1bXVsYXRlIG1vc3QKKyAgIG9mIHRoZSBjaGFuZ2VzIGFuZCBzZW5kIHRoZW0gb3ZlciBvbmNlLiAgImRlZmVycmVkX3N0b3JlcyIga2VlcHMKKyAgIHRyYWNrIG9mIHdoaWNoIHNldHMgb2YgcmVnaXN0ZXJzIHdlIGhhdmUgbG9jYWxseS1jaGFuZ2VkIGNvcGllcyBvZiwKKyAgIHNvIHdlIG9ubHkgbmVlZCBzZW5kIHRoZSBncm91cHMgdGhhdCBoYXZlIGNoYW5nZWQuICAqLworCitpbnQgZGVmZXJyZWRfc3RvcmVzID0gMDsJLyogQ3VtdWxhdGVzIHN0b3JlcyB3ZSB3YW50IHRvIGRvIGV2ZW50dWFsbHkuICovCisKKworLyogU29tZSBtYWNoaW5lcywgc3VjaCBhcyBGdWppdHN1IFNQQVJDbGl0ZSA4NngsIGhhdmUgYSBiaS1lbmRpYW4gbW9kZQorICAgd2hlcmUgaW5zdHJ1Y3Rpb25zIGFyZSBiaWctZW5kaWFuIGFuZCBkYXRhIGFyZSBsaXR0bGUtZW5kaWFuLgorICAgVGhpcyBmbGFnIGlzIHNldCB3aGVuIHdlIGRldGVjdCB0aGF0IHRoZSB0YXJnZXQgaXMgb2YgdGhpcyB0eXBlLiAqLworCitpbnQgYmlfZW5kaWFuID0gMDsKKworCisvKiBGZXRjaCBhIHNpbmdsZSBpbnN0cnVjdGlvbi4gIEV2ZW4gb24gYmktZW5kaWFuIG1hY2hpbmVzCisgICBzdWNoIGFzIHNwYXJjODZ4LCBpbnN0cnVjdGlvbnMgYXJlIGFsd2F5cyBiaWctZW5kaWFuLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2ZldGNoX2luc3RydWN0aW9uIChwYykKKyAgICAgQ09SRV9BRERSIHBjOworeworICB1bnNpZ25lZCBsb25nIHJldHZhbDsKKyAgaW50IGk7CisgIHVuc2lnbmVkIGNoYXIgYnVmWzRdOworCisgIHJlYWRfbWVtb3J5IChwYywgYnVmLCBzaXplb2YgKGJ1ZikpOworCisgIC8qIFN0YXJ0IGF0IHRoZSBtb3N0IHNpZ25pZmljYW50IGVuZCBvZiB0aGUgaW50ZWdlciwgYW5kIHdvcmsgdG93YXJkcworICAgICB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQuICAqLworICByZXR2YWwgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChidWYpOyArK2kpCisgICAgcmV0dmFsID0gKHJldHZhbCA8PCA4KSB8IGJ1ZltpXTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworCisvKiBCcmFuY2hlcyB3aXRoIHByZWRpY3Rpb24gYXJlIHRyZWF0ZWQgbGlrZSB0aGVpciBub24tcHJlZGljdGluZyBjb3VzaW5zLiAgKi8KKy8qIEZJWE1FOiBXaGF0IGFib3V0IGZsb2F0aW5nIHBvaW50IGJyYW5jaGVzPyAgKi8KKworLyogTWFjcm9zIHRvIGV4dHJhY3QgZmllbGRzIGZyb20gc3BhcmMgaW5zdHJ1Y3Rpb25zLiAgKi8KKyNkZWZpbmUgWF9PUChpKSAoKChpKSA+PiAzMCkgJiAweDMpCisjZGVmaW5lIFhfUkQoaSkgKCgoaSkgPj4gMjUpICYgMHgxZikKKyNkZWZpbmUgWF9BKGkpICgoKGkpID4+IDI5KSAmIDEpCisjZGVmaW5lIFhfQ09ORChpKSAoKChpKSA+PiAyNSkgJiAweGYpCisjZGVmaW5lIFhfT1AyKGkpICgoKGkpID4+IDIyKSAmIDB4NykKKyNkZWZpbmUgWF9JTU0yMihpKSAoKGkpICYgMHgzZmZmZmYpCisjZGVmaW5lIFhfT1AzKGkpICgoKGkpID4+IDE5KSAmIDB4M2YpCisjZGVmaW5lIFhfUlMxKGkpICgoKGkpID4+IDE0KSAmIDB4MWYpCisjZGVmaW5lIFhfSShpKSAoKChpKSA+PiAxMykgJiAxKQorI2RlZmluZSBYX0lNTTEzKGkpICgoaSkgJiAweDFmZmYpCisvKiBTaWduIGV4dGVuc2lvbiBtYWNyb3MuICAqLworI2RlZmluZSBYX1NJTU0xMyhpKSAoKFhfSU1NMTMgKGkpIF4gMHgxMDAwKSAtIDB4MTAwMCkKKyNkZWZpbmUgWF9ESVNQMjIoaSkgKChYX0lNTTIyIChpKSBeIDB4MjAwMDAwKSAtIDB4MjAwMDAwKQorI2RlZmluZSBYX0NDKGkpICgoKGkpID4+IDIwKSAmIDMpCisjZGVmaW5lIFhfUChpKSAoKChpKSA+PiAxOSkgJiAxKQorI2RlZmluZSBYX0RJU1AxOShpKSAoKCgoaSkgJiAweDdmZmZmKSBeIDB4NDAwMDApIC0gMHg0MDAwMCkKKyNkZWZpbmUgWF9SQ09ORChpKSAoKChpKSA+PiAyNSkgJiA3KQorI2RlZmluZSBYX0RJU1AxNihpKSAoKCgoKChpKSA+PiA2KSAmJiAweGMwMDApIHwgKChpKSAmIDB4M2ZmZikpIF4gMHg4MDAwKSAtIDB4ODAwMCkKKyNkZWZpbmUgWF9GQ04oaSkgKCgoaSkgPj4gMjUpICYgMzEpCisKK3R5cGVkZWYgZW51bQoreworICBFcnJvciwgbm90X2JyYW5jaCwgYmljYywgYmljY2EsIGJhLCBiYWEsIHRpY2MsIHRhLAorI2lmZGVmIEdEQl9UQVJHRVRfSVNfU1BBUkM2NAorICBkb25lX3JldHJ5CisjZW5kaWYKK30gYnJhbmNoX3R5cGU7CisKKy8qIFNpbXVsYXRlIHNpbmdsZS1zdGVwIHB0cmFjZSBjYWxsIGZvciBzdW40LiAgQ29kZSB3cml0dGVuIGJ5IEdhcnkKKyAgIEJlaWhsIChiZWlobEBtY2MuY29tKS4gICovCisKKy8qIG5wYzQgYW5kIG5leHRfcGMgZGVzY3JpYmUgdGhlIHNpdHVhdGlvbiBhdCB0aGUgdGltZSB0aGF0IHRoZQorICAgc3RlcC1icmVha3BvaW50IHdhcyBzZXQsIG5vdCBuZWNlc3NhcnkgdGhlIGN1cnJlbnQgdmFsdWUgb2YgTlBDX1JFR05VTS4gICovCitzdGF0aWMgQ09SRV9BRERSIG5leHRfcGMsIG5wYzQsIHRhcmdldDsKK3N0YXRpYyBpbnQgYnJrbnBjNCwgYnJrdHJnOwordHlwZWRlZiBjaGFyIGJpbnNuX3F1YW50dW1bQlJFQUtQT0lOVF9NQVhdOworc3RhdGljIGJpbnNuX3F1YW50dW0gYnJlYWtfbWVtWzNdOworCitzdGF0aWMgYnJhbmNoX3R5cGUgaXNicmFuY2ggUEFSQU1TICgobG9uZywgQ09SRV9BRERSLCBDT1JFX0FERFIgKikpOworCisvKiBzaW5nbGVfc3RlcCgpIGlzIGNhbGxlZCBqdXN0IGJlZm9yZSB3ZSB3YW50IHRvIHJlc3VtZSB0aGUgaW5mZXJpb3IsCisgICBpZiB3ZSB3YW50IHRvIHNpbmdsZS1zdGVwIGl0IGJ1dCB0aGVyZSBpcyBubyBoYXJkd2FyZSBvciBrZXJuZWwgc2luZ2xlLXN0ZXAKKyAgIHN1cHBvcnQgKGFzIG9uIGFsbCBTUEFSQ3MpLiAgV2UgZmluZCBhbGwgdGhlIHBvc3NpYmxlIHRhcmdldHMgb2YgdGhlCisgICBjb21pbmcgaW5zdHJ1Y3Rpb24gYW5kIGJyZWFrcG9pbnQgdGhlbS4KKworICAgc2luZ2xlX3N0ZXAgaXMgYWxzbyBjYWxsZWQganVzdCBhZnRlciB0aGUgaW5mZXJpb3Igc3RvcHMuICBJZiB3ZSBoYWQKKyAgIHNldCB1cCBhIHNpbXVsYXRlZCBzaW5nbGUtc3RlcCwgd2UgdW5kbyBvdXIgZGFtYWdlLiAgKi8KKwordm9pZAorc3BhcmNfc29mdHdhcmVfc2luZ2xlX3N0ZXAgKGlnbm9yZSwgaW5zZXJ0X2JyZWFrcG9pbnRzX3ApCisgICAgIGVudW0gdGFyZ2V0X3NpZ25hbCBpZ25vcmU7IC8qIHBpZCwgYnV0IHdlIGRvbid0IG5lZWQgaXQgKi8KKyAgICAgaW50IGluc2VydF9icmVha3BvaW50c19wOworeworICBicmFuY2hfdHlwZSBicjsKKyAgQ09SRV9BRERSIHBjOworICBsb25nIHBjX2luc3RydWN0aW9uOworCisgIGlmIChpbnNlcnRfYnJlYWtwb2ludHNfcCkKKyAgICB7CisgICAgICAvKiBBbHdheXMgc2V0IGJyZWFrcG9pbnQgZm9yIE5QQy4gICovCisgICAgICBuZXh0X3BjID0gcmVhZF9yZWdpc3RlciAoTlBDX1JFR05VTSk7CisgICAgICBucGM0ID0gbmV4dF9wYyArIDQ7IC8qIGJyYW5jaCBub3QgdGFrZW4gKi8KKworICAgICAgdGFyZ2V0X2luc2VydF9icmVha3BvaW50IChuZXh0X3BjLCBicmVha19tZW1bMF0pOworICAgICAgLyogcHJpbnRmX3VuZmlsdGVyZWQgKCJzZXQgYnJlYWsgYXQgJXhcbiIsbmV4dF9wYyk7ICovCisKKyAgICAgIHBjID0gcmVhZF9yZWdpc3RlciAoUENfUkVHTlVNKTsKKyAgICAgIHBjX2luc3RydWN0aW9uID0gZmV0Y2hfaW5zdHJ1Y3Rpb24gKHBjKTsKKyAgICAgIGJyID0gaXNicmFuY2ggKHBjX2luc3RydWN0aW9uLCBwYywgJnRhcmdldCk7CisgICAgICBicmtucGM0ID0gYnJrdHJnID0gMDsKKworICAgICAgaWYgKGJyID09IGJpY2NhKQorCXsKKwkgIC8qIENvbmRpdGlvbmFsIGFubnVsbGVkIGJyYW5jaCB3aWxsIGVpdGhlciBlbmQgdXAgYXQKKwkgICAgIG5wYyAoaWYgdGFrZW4pIG9yIGF0IG5wYys0IChpZiBub3QgdGFrZW4pLgorCSAgICAgVHJhcCBucGMrNC4gICovCisJICBicmtucGM0ID0gMTsKKwkgIHRhcmdldF9pbnNlcnRfYnJlYWtwb2ludCAobnBjNCwgYnJlYWtfbWVtWzFdKTsKKwl9CisgICAgICBlbHNlIGlmIChiciA9PSBiYWEgJiYgdGFyZ2V0ICE9IG5leHRfcGMpCisJeworCSAgLyogVW5jb25kaXRpb25hbCBhbm51bGxlZCBicmFuY2ggd2lsbCBhbHdheXMgZW5kIHVwIGF0CisJICAgICB0aGUgdGFyZ2V0LiAgKi8KKwkgIGJya3RyZyA9IDE7CisJICB0YXJnZXRfaW5zZXJ0X2JyZWFrcG9pbnQgKHRhcmdldCwgYnJlYWtfbWVtWzJdKTsKKwl9CisjaWZkZWYgR0RCX1RBUkdFVF9JU19TUEFSQzY0CisgICAgICBlbHNlIGlmIChiciA9PSBkb25lX3JldHJ5KQorCXsKKwkgIGJya3RyZyA9IDE7CisJICB0YXJnZXRfaW5zZXJ0X2JyZWFrcG9pbnQgKHRhcmdldCwgYnJlYWtfbWVtWzJdKTsKKwl9CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBSZW1vdmUgYnJlYWtwb2ludHMgKi8KKyAgICAgIHRhcmdldF9yZW1vdmVfYnJlYWtwb2ludCAobmV4dF9wYywgYnJlYWtfbWVtWzBdKTsKKworICAgICAgaWYgKGJya25wYzQpCisJdGFyZ2V0X3JlbW92ZV9icmVha3BvaW50IChucGM0LCBicmVha19tZW1bMV0pOworCisgICAgICBpZiAoYnJrdHJnKQorCXRhcmdldF9yZW1vdmVfYnJlYWtwb2ludCAodGFyZ2V0LCBicmVha19tZW1bMl0pOworICAgIH0KK30KKwwKKy8qIENhbGwgdGhpcyBmb3IgZWFjaCBuZXdseSBjcmVhdGVkIGZyYW1lLiAgRm9yIFNQQVJDLCB3ZSBuZWVkIHRvIGNhbGN1bGF0ZQorICAgdGhlIGJvdHRvbSBvZiB0aGUgZnJhbWUsIGFuZCBkbyBzb21lIGV4dHJhIHdvcmsgaWYgdGhlIHByb2xvZ3VlCisgICBoYXMgYmVlbiBnZW5lcmF0ZWQgdmlhIHRoZSAtbWZsYXQgb3B0aW9uIHRvIEdDQy4gIEluIHBhcnRpY3VsYXIsCisgICB3ZSBuZWVkIHRvIGtub3cgd2hlcmUgdGhlIHByZXZpb3VzIGZwIGFuZCB0aGUgcGMgaGF2ZSBiZWVuIHN0YXNoZWQsCisgICBzaW5jZSB0aGVpciBleGFjdCBwb3NpdGlvbiB3aXRoaW4gdGhlIGZyYW1lIG1heSB2YXJ5LiAgKi8KKwordm9pZAorc3BhcmNfaW5pdF9leHRyYV9mcmFtZV9pbmZvIChmcm9tbGVhZiwgZmkpCisgICAgIGludCBmcm9tbGVhZjsKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworeworICBjaGFyICpuYW1lOworICBDT1JFX0FERFIgcHJvbG9ndWVfc3RhcnQsIHByb2xvZ3VlX2VuZDsKKyAgaW50IGluc247CisKKyAgZmktPmJvdHRvbSA9CisgICAgKGZpLT5uZXh0ID8KKyAgICAgKGZpLT5mcmFtZSA9PSBmaS0+bmV4dC0+ZnJhbWUgPyBmaS0+bmV4dC0+Ym90dG9tIDogZmktPm5leHQtPmZyYW1lKSA6CisgICAgIHJlYWRfc3AgKCkpOworCisgIC8qIElmIGZpLT5uZXh0IGlzIE5VTEwsIHRoZW4gd2UgYWxyZWFkeSBzZXQgLT5mcmFtZSBieSBwYXNzaW5nIHJlYWRfZnAoKQorICAgICB0byBjcmVhdGVfbmV3X2ZyYW1lLiAgKi8KKyAgaWYgKGZpLT5uZXh0KQorICAgIHsKKyAgICAgIGNoYXIgYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisKKyAgICAgIC8qIENvbXB1dGUgLT5mcmFtZSBhcyBpZiBub3QgZmxhdC4gIElmIGl0IGlzIGZsYXQsIHdlJ2xsIGNoYW5nZQorCSBpdCBsYXRlci4gICovCisgICAgICBpZiAoZmktPm5leHQtPm5leHQgIT0gTlVMTAorCSAgJiYgKGZpLT5uZXh0LT5uZXh0LT5zaWduYWxfaGFuZGxlcl9jYWxsZXIKKwkgICAgICB8fCBmcmFtZV9pbl9kdW1teSAoZmktPm5leHQtPm5leHQpKQorCSAgJiYgZnJhbWVsZXNzX2xvb2tfZm9yX3Byb2xvZ3VlIChmaS0+bmV4dCkpCisJeworCSAgLyogQSBmcmFtZWxlc3MgZnVuY3Rpb24gaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwgZGlkIG5vdCBjaGFuZ2UKKwkgICAgIHRoZSBmcmFtZSBwb2ludGVyLCBmaXggdXAgZnJhbWUgcG9pbnRlciBhY2NvcmRpbmdseS4gICovCisJICBmaS0+ZnJhbWUgPSBGUkFNRV9GUCAoZmktPm5leHQpOworCSAgZmktPmJvdHRvbSA9IGZpLT5uZXh0LT5ib3R0b207CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFNob3VsZCB3ZSBhZGp1c3QgZm9yIHN0YWNrIGJpYXMgaGVyZT8gKi8KKwkgIGdldF9zYXZlZF9yZWdpc3RlciAoYnVmLCAwLCAwLCBmaSwgRlBfUkVHTlVNLCAwKTsKKwkgIGZpLT5mcmFtZSA9IGV4dHJhY3RfYWRkcmVzcyAoYnVmLCBSRUdJU1RFUl9SQVdfU0laRSAoRlBfUkVHTlVNKSk7CisjaWZkZWYgR0RCX1RBUkdFVF9JU19TUEFSQzY0CisJICBpZiAoZmktPmZyYW1lICYgMSkKKwkgICAgZmktPmZyYW1lICs9IDIwNDc7CisjZW5kaWYKKwkgIAorCX0KKyAgICB9CisKKyAgLyogRGVjaWRlIHdoZXRoZXIgdGhpcyBpcyBhIGZ1bmN0aW9uIHdpdGggYSBgYGZsYXQgcmVnaXN0ZXIgd2luZG93JycKKyAgICAgZnJhbWUuICBGb3Igc3VjaCBmdW5jdGlvbnMsIHRoZSBmcmFtZSBwb2ludGVyIGlzIGFjdHVhbGx5IGluICVpNy4gICovCisgIGZpLT5mbGF0ID0gMDsKKyAgZmktPmluX3Byb2xvZ3VlID0gMDsKKyAgaWYgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAoZmktPnBjLCAmbmFtZSwgJnByb2xvZ3VlX3N0YXJ0LCAmcHJvbG9ndWVfZW5kKSkKKyAgICB7CisgICAgICAvKiBTZWUgaWYgdGhlIGZ1bmN0aW9uIHN0YXJ0cyB3aXRoIGFuIGFkZCAod2hpY2ggd2lsbCBiZSBvZiBhCisJIG5lZ2F0aXZlIG51bWJlciBpZiBhIGZsYXQgZnJhbWUpIHRvIHRoZSBzcC4gIEZJWE1FOiBEb2VzIG5vdAorCSBoYW5kbGUgbGFyZ2UgZnJhbWVzIHdoaWNoIHdpbGwgbmVlZCBtb3JlIHRoYW4gb25lIGluc3RydWN0aW9uCisJIHRvIGFkanVzdCB0aGUgc3AuICAqLworICAgICAgaW5zbiA9IGZldGNoX2luc3RydWN0aW9uIChwcm9sb2d1ZV9zdGFydCwgNCk7CisgICAgICBpZiAoWF9PUCAoaW5zbikgPT0gMiAmJiBYX1JEIChpbnNuKSA9PSAxNCAmJiBYX09QMyAoaW5zbikgPT0gMAorCSAgJiYgWF9JIChpbnNuKSAmJiBYX1NJTU0xMyAoaW5zbikgPCAwKQorCXsKKwkgIGludCBvZmZzZXQgPSBYX1NJTU0xMyAoaW5zbik7CisKKwkgIC8qIFRoZW4gbG9vayBmb3IgYSBzYXZlIG9mICVpNyBpbnRvIHRoZSBmcmFtZS4gICovCisJICBpbnNuID0gZmV0Y2hfaW5zdHJ1Y3Rpb24gKHByb2xvZ3VlX3N0YXJ0ICsgNCk7CisJICBpZiAoWF9PUCAoaW5zbikgPT0gMworCSAgICAgICYmIFhfUkQgKGluc24pID09IDMxCisJICAgICAgJiYgWF9PUDMgKGluc24pID09IDQKKwkgICAgICAmJiBYX1JTMSAoaW5zbikgPT0gMTQpCisJICAgIHsKKwkgICAgICBjaGFyIGJ1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworCisJICAgICAgLyogV2UgZGVmaW5pdGVseSBoYXZlIGEgZmxhdCBmcmFtZSBub3cuICAqLworCSAgICAgIGZpLT5mbGF0ID0gMTsKKworCSAgICAgIGZpLT5zcF9vZmZzZXQgPSBvZmZzZXQ7CisKKwkgICAgICAvKiBPdmVyd3JpdGUgdGhlIGZyYW1lJ3MgYWRkcmVzcyB3aXRoIHRoZSB2YWx1ZSBpbiAlaTcuICAqLworCSAgICAgIGdldF9zYXZlZF9yZWdpc3RlciAoYnVmLCAwLCAwLCBmaSwgSTdfUkVHTlVNLCAwKTsKKwkgICAgICBmaS0+ZnJhbWUgPSBleHRyYWN0X2FkZHJlc3MgKGJ1ZiwgUkVHSVNURVJfUkFXX1NJWkUgKEk3X1JFR05VTSkpOworI2lmZGVmIEdEQl9UQVJHRVRfSVNfU1BBUkM2NAorCSAgICAgIGlmIChmaS0+ZnJhbWUgJiAxKQorCQlmaS0+ZnJhbWUgKz0gMjA0NzsKKyNlbmRpZgorCSAgICAgIC8qIFJlY29yZCB3aGVyZSB0aGUgZnAgZ290IHNhdmVkLiAgKi8KKwkgICAgICBmaS0+ZnBfYWRkciA9IGZpLT5mcmFtZSArIGZpLT5zcF9vZmZzZXQgKyBYX1NJTU0xMyAoaW5zbik7CisKKwkgICAgICAvKiBBbHNvIHRyeSB0byBjb2xsZWN0IHdoZXJlIHRoZSBwYyBnb3Qgc2F2ZWQgdG8uICAqLworCSAgICAgIGZpLT5wY19hZGRyID0gMDsKKwkgICAgICBpbnNuID0gZmV0Y2hfaW5zdHJ1Y3Rpb24gKHByb2xvZ3VlX3N0YXJ0ICsgMTIpOworCSAgICAgIGlmIChYX09QIChpbnNuKSA9PSAzCisJCSAgJiYgWF9SRCAoaW5zbikgPT0gMTUKKwkJICAmJiBYX09QMyAoaW5zbikgPT0gNAorCQkgICYmIFhfUlMxIChpbnNuKSA9PSAxNCkKKwkJZmktPnBjX2FkZHIgPSBmaS0+ZnJhbWUgKyBmaS0+c3Bfb2Zmc2V0ICsgWF9TSU1NMTMgKGluc24pOworCSAgICB9CisJfQorCWVsc2UKKwkgIHsKKwkgICAgLyogQ2hlY2sgaWYgdGhlIFBDIGlzIGluIHRoZSBmdW5jdGlvbiBwcm9sb2d1ZSBiZWZvcmUgYSBTQVZFCisJICAgICAgIGluc3RydWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkIHlldC4gIElmIHNvLCBzZXQgdGhlIGZyYW1lCisJICAgICAgIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzdGFjayBwb2ludGVyIGFuZCBzZXQKKwkgICAgICAgdGhlIGluX3Byb2xvZ3VlIGZsYWcuICAqLworCSAgICBDT1JFX0FERFIgYWRkcjsKKwkgICAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CisKKwkgICAgc2FsID0gZmluZF9wY19saW5lIChwcm9sb2d1ZV9zdGFydCwgMCk7CisJICAgIGlmIChzYWwubGluZSA9PSAwKQkJCS8qIG5vIGxpbmUgaW5mbywgdXNlIFBDICovCisJICAgICAgcHJvbG9ndWVfZW5kID0gZmktPnBjOworCSAgICBlbHNlIGlmIChzYWwuZW5kIDwgcHJvbG9ndWVfZW5kKQorCSAgICAgIHByb2xvZ3VlX2VuZCA9IHNhbC5lbmQ7CisJICAgIGlmIChmaS0+cGMgPCBwcm9sb2d1ZV9lbmQpCisJICAgICAgeworCQlmb3IgKGFkZHIgPSBwcm9sb2d1ZV9zdGFydDsgYWRkciA8IGZpLT5wYzsgYWRkciArPSA0KQorCQkgIHsKKwkJICAgIGluc24gPSByZWFkX21lbW9yeV9pbnRlZ2VyIChhZGRyLCA0KTsKKwkJICAgIGlmIChYX09QIChpbnNuKSA9PSAyICYmIFhfT1AzIChpbnNuKSA9PSAweDNjKQorCQkgICAgICBicmVhazsJCQkvKiBTQVZFIHNlZW4sIHN0b3Agc2VhcmNoaW5nICovCisJCSAgfQorCQlpZiAoYWRkciA+PSBmaS0+cGMpCisJCSAgeworCQkgICAgZmktPmluX3Byb2xvZ3VlID0gMTsKKwkJICAgIGZpLT5mcmFtZSA9IHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSk7CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKyAgICB9CisgIGlmIChmaS0+bmV4dCAmJiBmaS0+ZnJhbWUgPT0gMCkKKyAgICB7CisgICAgICAvKiBLbHVkZ2UgdG8gY2F1c2UgaW5pdF9wcmV2X2ZyYW1lX2luZm8gdG8gZGVzdHJveSB0aGUgbmV3IGZyYW1lLiAgKi8KKyAgICAgIGZpLT5mcmFtZSA9IGZpLT5uZXh0LT5mcmFtZTsKKyAgICAgIGZpLT5wYyA9IGZpLT5uZXh0LT5wYzsKKyAgICB9Cit9CisKK0NPUkVfQUREUgorc3BhcmNfZnJhbWVfY2hhaW4gKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7Cit7CisgIC8qIFZhbHVlIHRoYXQgd2lsbCBjYXVzZSBGUkFNRV9DSEFJTl9WQUxJRCB0byBub3Qgd29ycnkgYWJvdXQgdGhlIGNoYWluCisgICAgIHZhbHVlLiAgSWYgaXQgcmVhbHkgaXMgemVybywgd2UgZGV0ZWN0IGl0IGxhdGVyIGluCisgICAgIHNwYXJjX2luaXRfcHJldl9mcmFtZS4gICovCisgIHJldHVybiAoQ09SRV9BRERSKTE7Cit9CisKK0NPUkVfQUREUgorc3BhcmNfZXh0cmFjdF9zdHJ1Y3RfdmFsdWVfYWRkcmVzcyAocmVnYnVmKQorICAgICBjaGFyIHJlZ2J1ZltSRUdJU1RFUl9CWVRFU107Cit7CisgIHJldHVybiBleHRyYWN0X2FkZHJlc3MgKHJlZ2J1ZiArIFJFR0lTVEVSX0JZVEUgKE8wX1JFR05VTSksCisJCQkgIFJFR0lTVEVSX1JBV19TSVpFIChPMF9SRUdOVU0pKTsKK30KKworLyogRmluZCB0aGUgcGMgc2F2ZWQgaW4gZnJhbWUgRlJBTUUuICAqLworCitDT1JFX0FERFIKK3NwYXJjX2ZyYW1lX3NhdmVkX3BjIChmcmFtZSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworeworICBjaGFyIGJ1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworICBDT1JFX0FERFIgYWRkcjsKKworICBpZiAoZnJhbWUtPnNpZ25hbF9oYW5kbGVyX2NhbGxlcikKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIHRoZSBzaWduYWwgdHJhbXBvbGluZSBmcmFtZS4KKwkgR2V0IHRoZSBzYXZlZCBQQyBmcm9tIHRoZSBzaWdjb250ZXh0IHN0cnVjdHVyZS4gICovCisKKyNpZm5kZWYgU0lHQ09OVEVYVF9QQ19PRkZTRVQKKyNkZWZpbmUgU0lHQ09OVEVYVF9QQ19PRkZTRVQgMTIKKyNlbmRpZgorCisgICAgICBDT1JFX0FERFIgc2lnY29udGV4dF9hZGRyOworICAgICAgY2hhciBzY2J1ZltUQVJHRVRfUFRSX0JJVCAvIEhPU1RfQ0hBUl9CSVRdOworICAgICAgaW50IHNhdmVkX3BjX29mZnNldCA9IFNJR0NPTlRFWFRfUENfT0ZGU0VUOworICAgICAgY2hhciAqbmFtZSA9IE5VTEw7CisKKyAgICAgIC8qIFNvbGFyaXMyIHVjYnNpZ3ZlY2hhbmRsZXIgcGFzc2VzIGEgcG9pbnRlciB0byBhIHNpZ2NvbnRleHQKKwkgYXMgdGhlIHRoaXJkIHBhcmFtZXRlci4gIFRoZSBvZmZzZXQgdG8gdGhlIHNhdmVkIHBjIGlzIDEyLiAgKi8KKyAgICAgIGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAoZnJhbWUtPnBjLCAmbmFtZSwKKwkJCQkoQ09SRV9BRERSICopTlVMTCwoQ09SRV9BRERSICopTlVMTCk7CisgICAgICBpZiAobmFtZSAmJiBTVFJFUSAobmFtZSwgInVjYnNpZ3ZlY2hhbmRsZXIiKSkKKwlzYXZlZF9wY19vZmZzZXQgPSAxMjsKKworICAgICAgLyogVGhlIHNpZ2NvbnRleHQgYWRkcmVzcyBpcyBjb250YWluZWQgaW4gcmVnaXN0ZXIgTzIuICAqLworICAgICAgZ2V0X3NhdmVkX3JlZ2lzdGVyIChidWYsIChpbnQgKilOVUxMLCAoQ09SRV9BRERSICopTlVMTCwKKwkJCSAgZnJhbWUsIE8wX1JFR05VTSArIDIsIChlbnVtIGx2YWxfdHlwZSAqKU5VTEwpOworICAgICAgc2lnY29udGV4dF9hZGRyID0gZXh0cmFjdF9hZGRyZXNzIChidWYsIFJFR0lTVEVSX1JBV19TSVpFIChPMF9SRUdOVU0gKyAyKSk7CisKKyAgICAgIC8qIERvbid0IGNhdXNlIGEgbWVtb3J5X2Vycm9yIHdoZW4gYWNjZXNzaW5nIHNpZ2NvbnRleHQgaW4gY2FzZSB0aGUKKwkgc3RhY2sgbGF5b3V0IGhhcyBjaGFuZ2VkIG9yIHRoZSBzdGFjayBpcyBjb3JydXB0LiAgKi8KKyAgICAgIHRhcmdldF9yZWFkX21lbW9yeSAoc2lnY29udGV4dF9hZGRyICsgc2F2ZWRfcGNfb2Zmc2V0LAorCQkJICBzY2J1Ziwgc2l6ZW9mIChzY2J1ZikpOworICAgICAgcmV0dXJuIGV4dHJhY3RfYWRkcmVzcyAoc2NidWYsIHNpemVvZiAoc2NidWYpKTsKKyAgICB9CisgIGVsc2UgaWYgKGZyYW1lLT5pbl9wcm9sb2d1ZSB8fAorCSAgIChmcmFtZS0+bmV4dCAhPSBOVUxMCisJICAgICYmIChmcmFtZS0+bmV4dC0+c2lnbmFsX2hhbmRsZXJfY2FsbGVyCisJICAgICAgICB8fCBmcmFtZV9pbl9kdW1teSAoZnJhbWUtPm5leHQpKQorCSAgICAmJiBmcmFtZWxlc3NfbG9va19mb3JfcHJvbG9ndWUgKGZyYW1lKSkpCisgICAgeworICAgICAgLyogQSBmcmFtZWxlc3MgZnVuY3Rpb24gaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwgZGlkIG5vdCBzYXZlCisJIHRoZSBQQywgaXQgaXMgc3RpbGwgaW4gJW83LiAgKi8KKyAgICAgIGdldF9zYXZlZF9yZWdpc3RlciAoYnVmLCAoaW50ICopTlVMTCwgKENPUkVfQUREUiAqKU5VTEwsCisJCQkgIGZyYW1lLCBPN19SRUdOVU0sIChlbnVtIGx2YWxfdHlwZSAqKU5VTEwpOworICAgICAgcmV0dXJuIFBDX0FESlVTVCAoZXh0cmFjdF9hZGRyZXNzIChidWYsIFNQQVJDX0lOVFJFR19TSVpFKSk7CisgICAgfQorICBpZiAoZnJhbWUtPmZsYXQpCisgICAgYWRkciA9IGZyYW1lLT5wY19hZGRyOworICBlbHNlCisgICAgYWRkciA9IGZyYW1lLT5ib3R0b20gKyBGUkFNRV9TQVZFRF9JMCArCisgICAgICBTUEFSQ19JTlRSRUdfU0laRSAqIChJN19SRUdOVU0gLSBJMF9SRUdOVU0pOworCisgIGlmIChhZGRyID09IDApCisgICAgLyogQSBmbGF0IGZyYW1lIGxlYWYgZnVuY3Rpb24gbWlnaHQgbm90IHNhdmUgdGhlIFBDIGFueXdoZXJlLAorICAgICAgIGp1c3QgbGVhdmUgaXQgaW4gJW83LiAgKi8KKyAgICByZXR1cm4gUENfQURKVVNUIChyZWFkX3JlZ2lzdGVyIChPN19SRUdOVU0pKTsKKworICByZWFkX21lbW9yeSAoYWRkciwgYnVmLCBTUEFSQ19JTlRSRUdfU0laRSk7CisgIHJldHVybiBQQ19BREpVU1QgKGV4dHJhY3RfYWRkcmVzcyAoYnVmLCBTUEFSQ19JTlRSRUdfU0laRSkpOworfQorCisvKiBTaW5jZSBhbiBpbmRpdmlkdWFsIGZyYW1lIGluIHRoZSBmcmFtZSBjYWNoZSBpcyBkZWZpbmVkIGJ5IHR3bworICAgYXJndW1lbnRzIChhIGZyYW1lIHBvaW50ZXIgYW5kIGEgc3RhY2sgcG9pbnRlciksIHdlIG5lZWQgdHdvCisgICBhcmd1bWVudHMgdG8gZ2V0IGluZm8gZm9yIGFuIGFyYml0cmFyeSBzdGFjayBmcmFtZS4gIFRoaXMgcm91dGluZQorICAgdGFrZXMgdHdvIGFyZ3VtZW50cyBhbmQgbWFrZXMgdGhlIGNhY2hlZCBmcmFtZXMgbG9vayBhcyBpZiB0aGVzZQorICAgdHdvIGFyZ3VtZW50cyBkZWZpbmVkIGEgZnJhbWUgb24gdGhlIGNhY2hlLiAgVGhpcyBhbGxvd3MgdGhlIHJlc3QKKyAgIG9mIGluZm8gZnJhbWUgdG8gZXh0cmFjdCB0aGUgaW1wb3J0YW50IGFyZ3VtZW50cyB3aXRob3V0CisgICBkaWZmaWN1bHR5LiAgKi8KKworc3RydWN0IGZyYW1lX2luZm8gKgorc2V0dXBfYXJiaXRyYXJ5X2ZyYW1lIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgQ09SRV9BRERSICphcmd2OworeworICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7CisKKyAgaWYgKGFyZ2MgIT0gMikKKyAgICBlcnJvciAoIlNwYXJjIGZyYW1lIHNwZWNpZmljYXRpb25zIHJlcXVpcmUgdHdvIGFyZ3VtZW50czogZnAgYW5kIHNwIik7CisKKyAgZnJhbWUgPSBjcmVhdGVfbmV3X2ZyYW1lIChhcmd2WzBdLCAwKTsKKworICBpZiAoIWZyYW1lKQorICAgIGZhdGFsICgiaW50ZXJuYWw6IGNyZWF0ZV9uZXdfZnJhbWUgcmV0dXJuZWQgaW52YWxpZCBmcmFtZSIpOworICAKKyAgZnJhbWUtPmJvdHRvbSA9IGFyZ3ZbMV07CisgIGZyYW1lLT5wYyA9IEZSQU1FX1NBVkVEX1BDIChmcmFtZSk7CisgIHJldHVybiBmcmFtZTsKK30KKworLyogR2l2ZW4gYSBwYyB2YWx1ZSwgc2tpcCBpdCBmb3J3YXJkIHBhc3QgdGhlIGZ1bmN0aW9uIHByb2xvZ3VlIGJ5CisgICBkaXNhc3NlbWJsaW5nIGluc3RydWN0aW9ucyB0aGF0IGFwcGVhciB0byBiZSBhIHByb2xvZ3VlLgorCisgICBJZiBGUkFNRUxFU1NfUCBpcyBzZXQsIHdlIGFyZSBvbmx5IHRlc3RpbmcgdG8gc2VlIGlmIHRoZSBmdW5jdGlvbgorICAgaXMgZnJhbWVsZXNzLiAgVGhpcyBhbGxvd3MgYSBxdWlja2VyIGFuc3dlci4KKworICAgVGhpcyByb3V0aW5lIHNob3VsZCBiZSBtb3JlIHNwZWNpZmljIGluIGl0cyBhY3Rpb25zOyBtYWtpbmcgc3VyZQorICAgdGhhdCBpdCB1c2VzIHRoZSBzYW1lIHJlZ2lzdGVyIGluIHRoZSBpbml0aWFsIHByb2xvZ3VlIHNlY3Rpb24uICAqLworCitzdGF0aWMgQ09SRV9BRERSIGV4YW1pbmVfcHJvbG9ndWUgUEFSQU1TICgoQ09SRV9BRERSLCBpbnQsIHN0cnVjdCBmcmFtZV9pbmZvICosCisJCQkJCSAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICopKTsKKworc3RhdGljIENPUkVfQUREUiAKK2V4YW1pbmVfcHJvbG9ndWUgKHN0YXJ0X3BjLCBmcmFtZWxlc3NfcCwgZmksIHNhdmVkX3JlZ3MpCisgICAgIENPUkVfQUREUiBzdGFydF9wYzsKKyAgICAgaW50IGZyYW1lbGVzc19wOworICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7CisgICAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICpzYXZlZF9yZWdzOworeworICBpbnQgaW5zbjsKKyAgaW50IGRlc3QgPSAtMTsKKyAgQ09SRV9BRERSIHBjID0gc3RhcnRfcGM7CisgIGludCBpc19mbGF0ID0gMDsKKworICBpbnNuID0gZmV0Y2hfaW5zdHJ1Y3Rpb24gKHBjKTsKKworICAvKiBSZWNvZ25pemUgdGhlIGBzZXRoaScgaW5zbiBhbmQgcmVjb3JkIGl0cyBkZXN0aW5hdGlvbi4gICovCisgIGlmIChYX09QIChpbnNuKSA9PSAwICYmIFhfT1AyIChpbnNuKSA9PSA0KQorICAgIHsKKyAgICAgIGRlc3QgPSBYX1JEIChpbnNuKTsKKyAgICAgIHBjICs9IDQ7CisgICAgICBpbnNuID0gZmV0Y2hfaW5zdHJ1Y3Rpb24gKHBjKTsKKyAgICB9CisKKyAgLyogUmVjb2duaXplIGFuIGFkZCBpbW1lZGlhdGUgdmFsdWUgdG8gcmVnaXN0ZXIgdG8gZWl0aGVyICVnMSBvcgorICAgICB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgcmVjb3JkZWQgYWJvdmUuICBBY3R1YWxseSwgdGhpcyBtaWdodAorICAgICB3ZWxsIHJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBhcml0aG1ldGljIG9wZXJhdGlvbnMuCisgICAgIEl0IGRvZXNuJ3QgY2hlY2sgdGhhdCByczEgPT0gcmQgYmVjYXVzZSBpbiB0aGVvcnkgInN1YiAlZzAsIDUsICVnMSIKKyAgICAgZm9sbG93ZWQgYnkgInNhdmUgJXNwLCAlZzEsICVzcCIgaXMgYSB2YWxpZCBwcm9sb2d1ZSAoTm90IHRoYXQKKyAgICAgSSBpbWFnaW5lIGFueSBjb21waWxlciByZWFsbHkgZG9lcyB0aGF0LCBob3dldmVyKS4gICovCisgIGlmIChYX09QIChpbnNuKSA9PSAyCisgICAgICAmJiBYX0kgKGluc24pCisgICAgICAmJiAoWF9SRCAoaW5zbikgPT0gMSB8fCBYX1JEIChpbnNuKSA9PSBkZXN0KSkKKyAgICB7CisgICAgICBwYyArPSA0OworICAgICAgaW5zbiA9IGZldGNoX2luc3RydWN0aW9uIChwYyk7CisgICAgfQorCisgIC8qIFJlY29nbml6ZSBhbnkgU0FWRSBpbnNuLiAgKi8KKyAgaWYgKFhfT1AgKGluc24pID09IDIgJiYgWF9PUDMgKGluc24pID09IDYwKQorICAgIHsKKyAgICAgIHBjICs9IDQ7CisgICAgICBpZiAoZnJhbWVsZXNzX3ApCQkJLyogSWYgdGhlIHNhdmUgaXMgYWxsIHdlIGNhcmUgYWJvdXQsICovCisJcmV0dXJuIHBjOwkJCS8qIHJldHVybiBiZWZvcmUgZG9pbmcgbW9yZSB3b3JrICovCisgICAgICBpbnNuID0gZmV0Y2hfaW5zdHJ1Y3Rpb24gKHBjKTsKKyAgICB9CisgIC8qIFJlY29nbml6ZSBhZGQgdG8gJXNwLiAgKi8KKyAgZWxzZSBpZiAoWF9PUCAoaW5zbikgPT0gMiAmJiBYX1JEIChpbnNuKSA9PSAxNCAmJiBYX09QMyAoaW5zbikgPT0gMCkKKyAgICB7CisgICAgICBwYyArPSA0OworICAgICAgaWYgKGZyYW1lbGVzc19wKQkJCS8qIElmIHRoZSBhZGQgaXMgYWxsIHdlIGNhcmUgYWJvdXQsICovCisJcmV0dXJuIHBjOwkJCS8qIHJldHVybiBiZWZvcmUgZG9pbmcgbW9yZSB3b3JrICovCisgICAgICBpc19mbGF0ID0gMTsKKyAgICAgIGluc24gPSBmZXRjaF9pbnN0cnVjdGlvbiAocGMpOworICAgICAgLyogUmVjb2duaXplIHN0b3JlIG9mIGZyYW1lIHBvaW50ZXIgKGk3KS4gICovCisgICAgICBpZiAoWF9PUCAoaW5zbikgPT0gMworCSAgJiYgWF9SRCAoaW5zbikgPT0gMzEKKwkgICYmIFhfT1AzIChpbnNuKSA9PSA0CisJICAmJiBYX1JTMSAoaW5zbikgPT0gMTQpCisJeworCSAgcGMgKz0gNDsKKwkgIGluc24gPSBmZXRjaF9pbnN0cnVjdGlvbiAocGMpOworCisJICAvKiBSZWNvZ25pemUgc3ViICVzcCwgPGFueXRoaW5nPiwgJWk3LiAgKi8KKwkgIGlmIChYX09QIChpbnNuKSA9PSAgMgorCSAgICAgICYmIFhfT1AzIChpbnNuKSA9PSA0CisJICAgICAgJiYgWF9SUzEgKGluc24pID09IDE0CisJICAgICAgJiYgWF9SRCAoaW5zbikgPT0gMzEpCisJICAgIHsKKwkgICAgICBwYyArPSA0OworCSAgICAgIGluc24gPSBmZXRjaF9pbnN0cnVjdGlvbiAocGMpOworCSAgICB9CisJICBlbHNlCisJICAgIHJldHVybiBwYzsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIHBjOworICAgIH0KKyAgZWxzZQorICAgIC8qIFdpdGhvdXQgYSBzYXZlIG9yIGFkZCBpbnN0cnVjdGlvbiwgaXQncyBub3QgYSBwcm9sb2d1ZS4gICovCisgICAgcmV0dXJuIHN0YXJ0X3BjOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIC8qIFJlY29nbml6ZSBzdG9yZXMgaW50byB0aGUgZnJhbWUgZnJvbSB0aGUgaW5wdXQgcmVnaXN0ZXJzLgorCSBUaGlzIHJlY29nbml6ZXMgYWxsIG5vbiBhbHRlcm5hdGUgc3RvcmVzIG9mIGlucHV0IHJlZ2lzdGVyLAorCSBpbnRvIGEgbG9jYXRpb24gb2Zmc2V0IGZyb20gdGhlIGZyYW1lIHBvaW50ZXIuICAqLworICAgICAgaWYgKChYX09QIChpbnNuKSA9PSAzCisJICAgJiYgKFhfT1AzIChpbnNuKSAmIDB4M2MpID09IDQgLyogU3RvcmUsIG5vbi1hbHRlcm5hdGUuICAqLworCSAgICYmIChYX1JEIChpbnNuKSAmIDB4MTgpID09IDB4MTggLyogSW5wdXQgcmVnaXN0ZXIuICAqLworCSAgICYmIFhfSSAoaW5zbikJCS8qIEltbWVkaWF0ZSBtb2RlLiAgKi8KKwkgICAmJiBYX1JTMSAoaW5zbikgPT0gMzAJLyogT2ZmIG9mIGZyYW1lIHBvaW50ZXIuICAqLworCSAgIC8qIEludG8gcmVzZXJ2ZWQgc3RhY2sgc3BhY2UuICAqLworCSAgICYmIFhfU0lNTTEzIChpbnNuKSA+PSAweDQ0CisJICAgJiYgWF9TSU1NMTMgKGluc24pIDwgMHg1YikpCisJOworICAgICAgZWxzZSBpZiAoaXNfZmxhdAorCSAgICAgICAmJiBYX09QIChpbnNuKSA9PSAzCisJICAgICAgICYmIFhfT1AzIChpbnNuKSA9PSA0CisJICAgICAgICYmIFhfUlMxIChpbnNuKSA9PSAxNAorCSAgICAgICApCisJeworCSAgaWYgKHNhdmVkX3JlZ3MgJiYgWF9JIChpbnNuKSkKKwkgICAgc2F2ZWRfcmVncy0+cmVnc1tYX1JEIChpbnNuKV0gPQorCSAgICAgIGZpLT5mcmFtZSArIGZpLT5zcF9vZmZzZXQgKyBYX1NJTU0xMyAoaW5zbik7CisJfQorICAgICAgZWxzZQorCWJyZWFrOworICAgICAgcGMgKz0gNDsKKyAgICAgIGluc24gPSBmZXRjaF9pbnN0cnVjdGlvbiAocGMpOworICAgIH0KKworICByZXR1cm4gcGM7Cit9CisKK0NPUkVfQUREUiAKK3NraXBfcHJvbG9ndWUgKHN0YXJ0X3BjLCBmcmFtZWxlc3NfcCkKKyAgICAgQ09SRV9BRERSIHN0YXJ0X3BjOworICAgICBpbnQgZnJhbWVsZXNzX3A7Cit7CisgIHJldHVybiBleGFtaW5lX3Byb2xvZ3VlIChzdGFydF9wYywgZnJhbWVsZXNzX3AsIE5VTEwsIE5VTEwpOworfQorCisvKiBDaGVjayBpbnN0cnVjdGlvbiBhdCBBRERSIHRvIHNlZSBpZiBpdCBpcyBhIGJyYW5jaC4KKyAgIEFsbCBub24tYW5udWxsZWQgaW5zdHJ1Y3Rpb25zIHdpbGwgZ28gdG8gTlBDIG9yIHdpbGwgdHJhcC4KKyAgIFNldCAqVEFSR0VUIGlmIHdlIGZpbmQgYSBjYW5kaWRhdGUgYnJhbmNoOyBzZXQgdG8gemVybyBpZiBub3QuCisKKyAgIFRoaXMgaXNuJ3Qgc3RhdGljIGFzIGl0J3MgdXNlZCBieSByZW1vdGUtc2Euc3BhcmMuYy4gICovCisKK3N0YXRpYyBicmFuY2hfdHlwZQoraXNicmFuY2ggKGluc3RydWN0aW9uLCBhZGRyLCB0YXJnZXQpCisgICAgIGxvbmcgaW5zdHJ1Y3Rpb247CisgICAgIENPUkVfQUREUiBhZGRyLCAqdGFyZ2V0OworeworICBicmFuY2hfdHlwZSB2YWwgPSBub3RfYnJhbmNoOworICBsb25nIGludCBvZmZzZXQgPSAwOwkJLyogTXVzdCBiZSBzaWduZWQgZm9yIHNpZ24tZXh0ZW5kLiAgKi8KKworICAqdGFyZ2V0ID0gMDsKKworICBpZiAoWF9PUCAoaW5zdHJ1Y3Rpb24pID09IDAKKyAgICAgICYmIChYX09QMiAoaW5zdHJ1Y3Rpb24pID09IDIKKwkgIHx8IFhfT1AyIChpbnN0cnVjdGlvbikgPT0gNgorCSAgfHwgWF9PUDIgKGluc3RydWN0aW9uKSA9PSAxCisJICB8fCBYX09QMiAoaW5zdHJ1Y3Rpb24pID09IDMKKwkgIHx8IFhfT1AyIChpbnN0cnVjdGlvbikgPT0gNQorI2lmbmRlZiBHREJfVEFSR0VUX0lTX1NQQVJDNjQKKwkgIHx8IFhfT1AyIChpbnN0cnVjdGlvbikgPT0gNworI2VuZGlmCisJICApKQorICAgIHsKKyAgICAgIGlmIChYX0NPTkQgKGluc3RydWN0aW9uKSA9PSA4KQorCXZhbCA9IFhfQSAoaW5zdHJ1Y3Rpb24pID8gYmFhIDogYmE7CisgICAgICBlbHNlCisJdmFsID0gWF9BIChpbnN0cnVjdGlvbikgPyBiaWNjYSA6IGJpY2M7CisgICAgICBzd2l0Y2ggKFhfT1AyIChpbnN0cnVjdGlvbikpCisJeworCWNhc2UgMjoKKwljYXNlIDY6CisjaWZuZGVmIEdEQl9UQVJHRVRfSVNfU1BBUkM2NAorCWNhc2UgNzoKKyNlbmRpZgorCSAgb2Zmc2V0ID0gNCAqIFhfRElTUDIyIChpbnN0cnVjdGlvbik7CisJICBicmVhazsKKwljYXNlIDE6CisJY2FzZSA1OgorCSAgb2Zmc2V0ID0gNCAqIFhfRElTUDE5IChpbnN0cnVjdGlvbik7CisJICBicmVhazsKKwljYXNlIDM6CisJICBvZmZzZXQgPSA0ICogWF9ESVNQMTYgKGluc3RydWN0aW9uKTsKKwkgIGJyZWFrOworCX0KKyAgICAgICp0YXJnZXQgPSBhZGRyICsgb2Zmc2V0OworICAgIH0KKyNpZmRlZiBHREJfVEFSR0VUX0lTX1NQQVJDNjQKKyAgZWxzZSBpZiAoWF9PUCAoaW5zdHJ1Y3Rpb24pID09IDIKKwkgICAmJiBYX09QMyAoaW5zdHJ1Y3Rpb24pID09IDYyKQorICAgIHsKKyAgICAgIGlmIChYX0ZDTiAoaW5zdHJ1Y3Rpb24pID09IDApCisJeworCSAgLyogZG9uZSAqLworCSAgKnRhcmdldCA9IHJlYWRfcmVnaXN0ZXIgKFROUENfUkVHTlVNKTsKKwkgIHZhbCA9IGRvbmVfcmV0cnk7CisJfQorICAgICAgZWxzZSBpZiAoWF9GQ04gKGluc3RydWN0aW9uKSA9PSAxKQorCXsKKwkgIC8qIHJldHJ5ICovCisJICAqdGFyZ2V0ID0gcmVhZF9yZWdpc3RlciAoVFBDX1JFR05VTSk7CisJICB2YWwgPSBkb25lX3JldHJ5OworCX0KKyAgICB9CisjZW5kaWYKKworICByZXR1cm4gdmFsOworfQorDAorLyogRmluZCByZWdpc3RlciBudW1iZXIgUkVHTlVNIHJlbGF0aXZlIHRvIEZSQU1FIGFuZCBwdXQgaXRzCisgICAocmF3KSBjb250ZW50cyBpbiAqUkFXX0JVRkZFUi4gIFNldCAqT1BUSU1JWkVEIGlmIHRoZSB2YXJpYWJsZQorICAgd2FzIG9wdGltaXplZCBvdXQgKGFuZCB0aHVzIGNhbid0IGJlIGZldGNoZWQpLiAgSWYgdGhlIHZhcmlhYmxlCisgICB3YXMgZmV0Y2hlZCBmcm9tIG1lbW9yeSwgc2V0ICpBRERSUCB0byB3aGVyZSBpdCB3YXMgZmV0Y2hlZCBmcm9tLAorICAgb3RoZXJ3aXNlIGl0IHdhcyBmZXRjaGVkIGZyb20gYSByZWdpc3Rlci4KKworICAgVGhlIGFyZ3VtZW50IFJBV19CVUZGRVIgbXVzdCBwb2ludCB0byBhbGlnbmVkIG1lbW9yeS4gICovCisKK3ZvaWQKK2dldF9zYXZlZF9yZWdpc3RlciAocmF3X2J1ZmZlciwgb3B0aW1pemVkLCBhZGRycCwgZnJhbWUsIHJlZ251bSwgbHZhbCkKKyAgICAgY2hhciAqcmF3X2J1ZmZlcjsKKyAgICAgaW50ICpvcHRpbWl6ZWQ7CisgICAgIENPUkVfQUREUiAqYWRkcnA7CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKKyAgICAgaW50IHJlZ251bTsKKyAgICAgZW51bSBsdmFsX3R5cGUgKmx2YWw7Cit7CisgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTE7CisgIENPUkVfQUREUiBhZGRyOworCisgIGlmICghdGFyZ2V0X2hhc19yZWdpc3RlcnMpCisgICAgZXJyb3IgKCJObyByZWdpc3RlcnMuIik7CisKKyAgaWYgKG9wdGltaXplZCkKKyAgICAqb3B0aW1pemVkID0gMDsKKworICBhZGRyID0gMDsKKworICAvKiBGSVhNRSBUaGlzIGNvZGUgZXh0cmFjdGVkIGZyb20gaW5mY21kLmM7IHNob3VsZCBwdXQgZWxzZXdoZXJlISAqLworICBpZiAoZnJhbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBlcnJvciAoIk5vIHNlbGVjdGVkIGZyYW1lLiIpOyAqLworICAgICAgaWYgKCF0YXJnZXRfaGFzX3JlZ2lzdGVycykKKyAgICAgICAgZXJyb3IgKCJUaGUgcHJvZ3JhbSBoYXMgbm8gcmVnaXN0ZXJzIG5vdy4iKTsKKyAgICAgIGlmIChzZWxlY3RlZF9mcmFtZSA9PSBOVUxMKSAKKyAgICAgICAgZXJyb3IgKCJObyBzZWxlY3RlZCBmcmFtZS4iKTsKKyAgICAgIC8qIFRyeSB0byB1c2Ugc2VsZWN0ZWQgZnJhbWUgKi8KKyAgICAgIGZyYW1lID0gZ2V0X3ByZXZfZnJhbWUgKHNlbGVjdGVkX2ZyYW1lKTsgIAorICAgICAgaWYgKGZyYW1lID09IDApCisgICAgICAgIGVycm9yICgiQ21kIG5vdCBtZWFuaW5nZnVsIGluIHRoZSBvdXRlcm1vc3QgZnJhbWUuIik7IAorICAgIH0KKworCisgIGZyYW1lMSA9IGZyYW1lLT5uZXh0OworCisgIC8qIEdldCBzYXZlZCBQQyBmcm9tIHRoZSBmcmFtZSBpbmZvIGlmIG5vdCBpbiBpbm5lcm1vc3QgZnJhbWUuICAqLworICBpZiAocmVnbnVtID09IFBDX1JFR05VTSAmJiBmcmFtZTEgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobHZhbCAhPSBOVUxMKQorCSpsdmFsID0gbm90X2x2YWw7CisgICAgICBpZiAocmF3X2J1ZmZlciAhPSBOVUxMKQorCXsKKwkgIC8qIFB1dCBpdCBiYWNrIGluIHRhcmdldCBmb3JtYXQuICAqLworCSAgc3RvcmVfYWRkcmVzcyAocmF3X2J1ZmZlciwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ251bSksIGZyYW1lLT5wYyk7CisJfQorICAgICAgaWYgKGFkZHJwICE9IE5VTEwpCisJKmFkZHJwID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgd2hpbGUgKGZyYW1lMSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChmcmFtZTEtPnBjID49IChmcmFtZTEtPmJvdHRvbSA/IGZyYW1lMS0+Ym90dG9tIDoKKwkJCSByZWFkX3NwICgpKQorCSAgJiYgZnJhbWUxLT5wYyA8PSBGUkFNRV9GUCAoZnJhbWUxKSkKKwl7CisJICAvKiBEdW1teSBmcmFtZS4gIEFsbCBidXQgdGhlIHdpbmRvdyByZWdzIGFyZSBpbiB0aGVyZSBzb21ld2hlcmUuCisJICAgICBUaGUgd2luZG93IHJlZ2lzdGVycyBhcmUgc2F2ZWQgb24gdGhlIHN0YWNrLCBqdXN0IGxpa2UgaW4gYQorCSAgICAgbm9ybWFsIGZyYW1lLiAgKi8KKwkgIGlmIChyZWdudW0gPj0gRzFfUkVHTlVNICYmIHJlZ251bSA8IEcxX1JFR05VTSArIDcpCisJICAgIGFkZHIgPSBmcmFtZTEtPmZyYW1lICsgKHJlZ251bSAtIEcwX1JFR05VTSkgKiBTUEFSQ19JTlRSRUdfU0laRQorCSAgICAgIC0gKEZQX1JFR0lTVEVSX0JZVEVTICsgOCAqIFNQQVJDX0lOVFJFR19TSVpFKTsKKwkgIGVsc2UgaWYgKHJlZ251bSA+PSBJMF9SRUdOVU0gJiYgcmVnbnVtIDwgSTBfUkVHTlVNICsgOCkKKwkgICAgYWRkciA9IChmcmFtZTEtPnByZXYtPmJvdHRvbQorCQkgICAgKyAocmVnbnVtIC0gSTBfUkVHTlVNKSAqIFNQQVJDX0lOVFJFR19TSVpFCisJCSAgICArIEZSQU1FX1NBVkVEX0kwKTsKKwkgIGVsc2UgaWYgKHJlZ251bSA+PSBMMF9SRUdOVU0gJiYgcmVnbnVtIDwgTDBfUkVHTlVNICsgOCkKKwkgICAgYWRkciA9IChmcmFtZTEtPnByZXYtPmJvdHRvbQorCQkgICAgKyAocmVnbnVtIC0gTDBfUkVHTlVNKSAqIFNQQVJDX0lOVFJFR19TSVpFCisJCSAgICArIEZSQU1FX1NBVkVEX0wwKTsKKwkgIGVsc2UgaWYgKHJlZ251bSA+PSBPMF9SRUdOVU0gJiYgcmVnbnVtIDwgTzBfUkVHTlVNICsgOCkKKwkgICAgYWRkciA9IGZyYW1lMS0+ZnJhbWUgKyAocmVnbnVtIC0gTzBfUkVHTlVNKSAqIFNQQVJDX0lOVFJFR19TSVpFCisJICAgICAgLSAoRlBfUkVHSVNURVJfQllURVMgKyAxNiAqIFNQQVJDX0lOVFJFR19TSVpFKTsKKyNpZmRlZiBGUDBfUkVHTlVNCisJICBlbHNlIGlmIChyZWdudW0gPj0gRlAwX1JFR05VTSAmJiByZWdudW0gPCBGUDBfUkVHTlVNICsgMzIpCisJICAgIGFkZHIgPSBmcmFtZTEtPmZyYW1lICsgKHJlZ251bSAtIEZQMF9SRUdOVU0pICogNAorCSAgICAgIC0gKEZQX1JFR0lTVEVSX0JZVEVTKTsKKyNpZmRlZiBHREJfVEFSR0VUX0lTX1NQQVJDNjQKKwkgIGVsc2UgaWYgKHJlZ251bSA+PSBGUDBfUkVHTlVNICsgMzIgJiYgcmVnbnVtIDwgRlBfTUFYX1JFR05VTSkKKwkgICAgYWRkciA9IGZyYW1lMS0+ZnJhbWUgKyAzMiAqIDQgKyAocmVnbnVtIC0gRlAwX1JFR05VTSAtIDMyKSAqIDgKKwkgICAgICAtIChGUF9SRUdJU1RFUl9CWVRFUyk7CisjZW5kaWYKKyNlbmRpZiAvKiBGUDBfUkVHTlVNICovCisJICBlbHNlIGlmIChyZWdudW0gPj0gWV9SRUdOVU0gJiYgcmVnbnVtIDwgTlVNX1JFR1MpCisJICAgIGFkZHIgPSBmcmFtZTEtPmZyYW1lICsgKHJlZ251bSAtIFlfUkVHTlVNKSAqIFNQQVJDX0lOVFJFR19TSVpFCisJICAgICAgLSAoRlBfUkVHSVNURVJfQllURVMgKyAyNCAqIFNQQVJDX0lOVFJFR19TSVpFKTsKKwl9CisgICAgICBlbHNlIGlmIChmcmFtZTEtPmZsYXQpCisJeworCisJICBpZiAocmVnbnVtID09IFJQX1JFR05VTSkKKwkgICAgYWRkciA9IGZyYW1lMS0+cGNfYWRkcjsKKwkgIGVsc2UgaWYgKHJlZ251bSA9PSBJN19SRUdOVU0pCisJICAgIGFkZHIgPSBmcmFtZTEtPmZwX2FkZHI7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBDT1JFX0FERFIgZnVuY19zdGFydDsKKwkgICAgICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyByZWdzOworCSAgICAgIG1lbXNldCAoJnJlZ3MsIDAsIHNpemVvZiAocmVncykpOworCisJICAgICAgZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIChmcmFtZTEtPnBjLCBOVUxMLCAmZnVuY19zdGFydCwgTlVMTCk7CisJICAgICAgZXhhbWluZV9wcm9sb2d1ZSAoZnVuY19zdGFydCwgMCwgZnJhbWUxLCAmcmVncyk7CisJICAgICAgYWRkciA9IHJlZ3MucmVnc1tyZWdudW1dOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIE5vcm1hbCBmcmFtZS4gIExvY2FsIGFuZCBJbiByZWdpc3RlcnMgYXJlIHNhdmVkIG9uIHN0YWNrLiAgKi8KKwkgIGlmIChyZWdudW0gPj0gSTBfUkVHTlVNICYmIHJlZ251bSA8IEkwX1JFR05VTSArIDgpCisJICAgIGFkZHIgPSAoZnJhbWUxLT5wcmV2LT5ib3R0b20KKwkJICAgICsgKHJlZ251bSAtIEkwX1JFR05VTSkgKiBTUEFSQ19JTlRSRUdfU0laRQorCQkgICAgKyBGUkFNRV9TQVZFRF9JMCk7CisJICBlbHNlIGlmIChyZWdudW0gPj0gTDBfUkVHTlVNICYmIHJlZ251bSA8IEwwX1JFR05VTSArIDgpCisJICAgIGFkZHIgPSAoZnJhbWUxLT5wcmV2LT5ib3R0b20KKwkJICAgICsgKHJlZ251bSAtIEwwX1JFR05VTSkgKiBTUEFSQ19JTlRSRUdfU0laRQorCQkgICAgKyBGUkFNRV9TQVZFRF9MMCk7CisJICBlbHNlIGlmIChyZWdudW0gPj0gTzBfUkVHTlVNICYmIHJlZ251bSA8IE8wX1JFR05VTSArIDgpCisJICAgIHsKKwkgICAgICAvKiBPdXRzIGJlY29tZSBpbnMuICAqLworCSAgICAgIGdldF9zYXZlZF9yZWdpc3RlciAocmF3X2J1ZmZlciwgb3B0aW1pemVkLCBhZGRycCwgZnJhbWUxLAorCQkJCSAgKHJlZ251bSAtIE8wX1JFR05VTSArIEkwX1JFR05VTSksIGx2YWwpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0KKyAgICAgIGlmIChhZGRyICE9IDApCisJYnJlYWs7CisgICAgICBmcmFtZTEgPSBmcmFtZTEtPm5leHQ7CisgICAgfQorICBpZiAoYWRkciAhPSAwKQorICAgIHsKKyAgICAgIGlmIChsdmFsICE9IE5VTEwpCisJKmx2YWwgPSBsdmFsX21lbW9yeTsKKyAgICAgIGlmIChyZWdudW0gPT0gU1BfUkVHTlVNKQorCXsKKwkgIGlmIChyYXdfYnVmZmVyICE9IE5VTEwpCisJICAgIHsKKwkgICAgICAvKiBQdXQgaXQgYmFjayBpbiB0YXJnZXQgZm9ybWF0LiAgKi8KKwkgICAgICBzdG9yZV9hZGRyZXNzIChyYXdfYnVmZmVyLCBSRUdJU1RFUl9SQVdfU0laRSAocmVnbnVtKSwgYWRkcik7CisJICAgIH0KKwkgIGlmIChhZGRycCAhPSBOVUxMKQorCSAgICAqYWRkcnAgPSAwOworCSAgcmV0dXJuOworCX0KKyAgICAgIGlmIChyYXdfYnVmZmVyICE9IE5VTEwpCisJcmVhZF9tZW1vcnkgKGFkZHIsIHJhd19idWZmZXIsIFJFR0lTVEVSX1JBV19TSVpFIChyZWdudW0pKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAobHZhbCAhPSBOVUxMKQorCSpsdmFsID0gbHZhbF9yZWdpc3RlcjsKKyAgICAgIGFkZHIgPSBSRUdJU1RFUl9CWVRFIChyZWdudW0pOworICAgICAgaWYgKHJhd19idWZmZXIgIT0gTlVMTCkKKwlyZWFkX3JlZ2lzdGVyX2dlbiAocmVnbnVtLCByYXdfYnVmZmVyKTsKKyAgICB9CisgIGlmIChhZGRycCAhPSBOVUxMKQorICAgICphZGRycCA9IGFkZHI7Cit9CisKKy8qIFB1c2ggYW4gZW1wdHkgc3RhY2sgZnJhbWUsIGFuZCByZWNvcmQgaW4gaXQgdGhlIGN1cnJlbnQgUEMsIHJlZ3MsIGV0Yy4KKworICAgV2Ugc2F2ZSB0aGUgbm9uLXdpbmRvd2VkIHJlZ2lzdGVycyBhbmQgdGhlIGlucy4gIFRoZSBsb2NhbHMgYW5kIG91dHMKKyAgIGFyZSBuZXc7IHRoZXkgZG9uJ3QgbmVlZCB0byBiZSBzYXZlZC4gVGhlIGkncyBhbmQgbCdzIG9mCisgICB0aGUgbGFzdCBmcmFtZSB3ZXJlIGFscmVhZHkgc2F2ZWQgb24gdGhlIHN0YWNrLiAgKi8KKworLyogRGVmaW5pdGVseSBzZWUgdG0tc3BhcmMuaCBmb3IgbW9yZSBkb2Mgb2YgdGhlIGZyYW1lIGZvcm1hdCBoZXJlLiAgKi8KKworI2lmZGVmIEdEQl9UQVJHRVRfSVNfU1BBUkM2NAorI2RlZmluZSBEVU1NWV9SRUdfU0FWRV9PRkZTRVQgKDEyOCArIDE2KQorI2Vsc2UKKyNkZWZpbmUgRFVNTVlfUkVHX1NBVkVfT0ZGU0VUIDB4NjAKKyNlbmRpZgorCisvKiBTZWUgdG0tc3BhcmMuaCBmb3IgaG93IHRoaXMgaXMgY2FsY3VsYXRlZC4gICovCisjaWZkZWYgRlAwX1JFR05VTQorI2RlZmluZSBEVU1NWV9TVEFDS19SRUdfQlVGX1NJWkUgXAorKCgoOCs4KzgpICogU1BBUkNfSU5UUkVHX1NJWkUpICsgRlBfUkVHSVNURVJfQllURVMpCisjZWxzZQorI2RlZmluZSBEVU1NWV9TVEFDS19SRUdfQlVGX1NJWkUgXAorKCgoOCs4KzgpICogU1BBUkNfSU5UUkVHX1NJWkUpICkKKyNlbmRpZiAvKiBGUDBfUkVHTlVNICovCisjZGVmaW5lIERVTU1ZX1NUQUNLX1NJWkUgKERVTU1ZX1NUQUNLX1JFR19CVUZfU0laRSArIERVTU1ZX1JFR19TQVZFX09GRlNFVCkKKwordm9pZAorc3BhcmNfcHVzaF9kdW1teV9mcmFtZSAoKQoreworICBDT1JFX0FERFIgc3AsIG9sZF9zcDsKKyAgY2hhciByZWdpc3Rlcl90ZW1wW0RVTU1ZX1NUQUNLX1NJWkVdOworCisgIG9sZF9zcCA9IHNwID0gcmVhZF9zcCAoKTsKKworI2lmZGVmIEdEQl9UQVJHRVRfSVNfU1BBUkM2NAorICAvKiBQQywgTlBDLCBDQ1IsIEZTUiwgRlBSUywgWSwgQVNJICovCisgIHJlYWRfcmVnaXN0ZXJfYnl0ZXMgKFJFR0lTVEVSX0JZVEUgKFBDX1JFR05VTSksICZyZWdpc3Rlcl90ZW1wWzBdLAorCQkgICAgICAgUkVHSVNURVJfUkFXX1NJWkUgKFBDX1JFR05VTSkgKiA3KTsKKyAgcmVhZF9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSAoUFNUQVRFX1JFR05VTSksICZyZWdpc3Rlcl90ZW1wWzhdLAorCQkgICAgICAgUkVHSVNURVJfUkFXX1NJWkUgKFBTVEFURV9SRUdOVU0pKTsKKyAgLyogRklYTUU6IG5vdCBzdXJlIHdoYXQgbmVlZHMgdG8gYmUgc2F2ZWQgaGVyZS4gICovCisjZWxzZQorICAvKiBZLCBQUywgV0lNLCBUQlIsIFBDLCBOUEMsIEZQUywgQ1BTIHJlZ3MgKi8KKyAgcmVhZF9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSAoWV9SRUdOVU0pLCAmcmVnaXN0ZXJfdGVtcFswXSwKKwkJICAgICAgIFJFR0lTVEVSX1JBV19TSVpFIChZX1JFR05VTSkgKiA4KTsKKyNlbmRpZgorCisgIHJlYWRfcmVnaXN0ZXJfYnl0ZXMgKFJFR0lTVEVSX0JZVEUgKE8wX1JFR05VTSksCisJCSAgICAgICAmcmVnaXN0ZXJfdGVtcFs4ICogU1BBUkNfSU5UUkVHX1NJWkVdLAorCQkgICAgICAgU1BBUkNfSU5UUkVHX1NJWkUgKiA4KTsKKworICByZWFkX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFIChHMF9SRUdOVU0pLAorCQkgICAgICAgJnJlZ2lzdGVyX3RlbXBbMTYgKiBTUEFSQ19JTlRSRUdfU0laRV0sCisJCSAgICAgICBTUEFSQ19JTlRSRUdfU0laRSAqIDgpOworCisjaWZkZWYgRlAwX1JFR05VTQorICByZWFkX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNKSwKKwkJICAgICAgICZyZWdpc3Rlcl90ZW1wWzI0ICogU1BBUkNfSU5UUkVHX1NJWkVdLAorCQkgICAgICAgRlBfUkVHSVNURVJfQllURVMpOworI2VuZGlmIC8qIEZQMF9SRUdOVU0gKi8KKworICBzcCAtPSBEVU1NWV9TVEFDS19TSVpFOworCisgIHdyaXRlX3NwIChzcCk7CisKKyAgd3JpdGVfbWVtb3J5IChzcCArIERVTU1ZX1JFR19TQVZFX09GRlNFVCwgJnJlZ2lzdGVyX3RlbXBbMF0sCisJCURVTU1ZX1NUQUNLX1JFR19CVUZfU0laRSk7CisKKyAgaWYgKHN0cmNtcCAodGFyZ2V0X3Nob3J0bmFtZSwgInNpbSIpICE9IDApCisgICAgeworICAgICAgd3JpdGVfZnAgKG9sZF9zcCk7CisKKyAgICAgIC8qIFNldCByZXR1cm4gYWRkcmVzcyByZWdpc3RlciBmb3IgdGhlIGNhbGwgZHVtbXkgdG8gdGhlIGN1cnJlbnQgUEMuICAqLworICAgICAgd3JpdGVfcmVnaXN0ZXIgKEk3X1JFR05VTSwgcmVhZF9wYygpIC0gOCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogVGhlIGNhbGwgZHVtbXkgd2lsbCB3cml0ZSB0aGlzIHZhbHVlIHRvIEZQIGJlZm9yZSBleGVjdXRpbmcKKyAgICAgICAgIHRoZSAnc2F2ZScuICBUaGlzIGVuc3VyZXMgdGhhdCByZWdpc3RlciB3aW5kb3cgZmx1c2hlcyB3b3JrCisJIGNvcnJlY3RseSBpbiB0aGUgc2ltdWxhdG9yLiAgKi8KKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChHMF9SRUdOVU0rMSwgcmVhZF9yZWdpc3RlciAoRlBfUkVHTlVNKSk7CisgICAgCisgICAgICAvKiBUaGUgY2FsbCBkdW1teSB3aWxsIHdyaXRlIHRoaXMgdmFsdWUgdG8gRlAgYWZ0ZXIgZXhlY3V0aW5nCisgICAgICAgICB0aGUgJ3NhdmUnLiAqLworICAgICAgd3JpdGVfcmVnaXN0ZXIgKEcwX1JFR05VTSsyLCBvbGRfc3ApOworICAgIAorICAgICAgLyogVGhlIGNhbGwgZHVtbXkgd2lsbCB3cml0ZSB0aGlzIHZhbHVlIHRvIHRoZSByZXR1cm4gYWRkcmVzcyAoJWk3KSBhZnRlcgorCSBleGVjdXRpbmcgdGhlICdzYXZlJy4gKi8KKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChHMF9SRUdOVU0rMywgcmVhZF9wYygpIC0gOCk7CisgICAgCisgICAgICAvKiBTZXQgdGhlIEZQIHRoYXQgdGhlIGNhbGwgZHVtbXkgd2lsbCBiZSB1c2luZyBhZnRlciB0aGUgJ3NhdmUnLgorCSBUaGlzIG1ha2VzIGJhY2t0cmFjZXMgZnJvbSBhbiBpbmZlcmlvciBmdW5jdGlvbiBjYWxsIHdvcmsgcHJvcGVybHkuICAqLworICAgICAgd3JpdGVfcmVnaXN0ZXIgKEZQX1JFR05VTSwgb2xkX3NwKTsKKyAgICB9Cit9CisKKy8qIHNwYXJjX2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyAoKS4gIFRoaXMgZnVuY3Rpb24gaXMgaGVyZSBvbmx5IGJlY2F1c2UKKyAgIHBvcF9mcmFtZSB1c2VzIGl0LiAgTm90ZSB0aGVyZSBpcyBhbiBpbnRlcmVzdGluZyBjb3JuZXIgY2FzZSB3aGljaAorICAgSSB0aGluayBmZXcgcG9ydHMgb2YgR0RCIGdldCByaWdodC0taWYgeW91IGFyZSBwb3BwaW5nIGEgZnJhbWUKKyAgIHdoaWNoIGRvZXMgbm90IHNhdmUgc29tZSByZWdpc3RlciB0aGF0ICppcyogc2F2ZWQgYnkgYSBtb3JlIGlubmVyCisgICBmcmFtZSAoc3VjaCBhIGZyYW1lIHdpbGwgbmV2ZXIgYmUgYSBkdW1teSBmcmFtZSBiZWNhdXNlIGR1bW15CisgICBmcmFtZXMgc2F2ZSBhbGwgcmVnaXN0ZXJzKS4gIFJld3JpdGluZyBwb3BfZnJhbWUgdG8gdXNlCisgICBnZXRfc2F2ZWRfcmVnaXN0ZXIgd291bGQgc29sdmUgdGhpcyBwcm9ibGVtIGFuZCBhbHNvIGdldCByaWQgb2YgdGhlCisgICB1Z2x5IGR1cGxpY2F0aW9uIGJldHdlZW4gc3BhcmNfZnJhbWVfZmluZF9zYXZlZF9yZWdzIGFuZAorICAgZ2V0X3NhdmVkX3JlZ2lzdGVyLgorCisgICBTdG9yZXMsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywKKyAgIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4KKyAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbAorICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDoKKyAgIHRoZSBhZGRyZXNzIHdlIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4KKworICAgTm90ZSB0aGF0IG9uIHJlZ2lzdGVyIHdpbmRvdyBtYWNoaW5lcywgd2UgYXJlIGN1cnJlbnRseSBtYWtpbmcgdGhlCisgICBhc3N1bXB0aW9uIHRoYXQgd2luZG93IHJlZ2lzdGVycyBhcmUgYmVpbmcgc2F2ZWQgc29tZXdoZXJlIGluIHRoZQorICAgZnJhbWUgaW4gd2hpY2ggdGhleSBhcmUgYmVpbmcgdXNlZC4gIElmIHRoZXkgYXJlIHN0b3JlZCBpbiBhbgorICAgaW5mZXJpb3IgZnJhbWUsIGZpbmRfc2F2ZWRfcmVnaXN0ZXIgd2lsbCBicmVhay4KKworICAgT24gdGhlIFN1biA0LCB0aGUgb25seSB0aW1lIGFsbCByZWdpc3RlcnMgYXJlIHNhdmVkIGlzIHdoZW4KKyAgIGEgZHVtbXkgZnJhbWUgaXMgaW52b2x2ZWQuICBPdGhlcndpc2UsIHRoZSBvbmx5IHNhdmVkIHJlZ2lzdGVycworICAgYXJlIHRoZSBMT0NBTCBhbmQgSU4gcmVnaXN0ZXJzIHdoaWNoIGFyZSBzYXZlZCBhcyBhIHJlc3VsdAorICAgb2YgdGhlICJzYXZlL3Jlc3RvcmUiIG9wY29kZXMuICBUaGlzIGNvbmRpdGlvbiBpcyBkZXRlcm1pbmVkCisgICBieSBhZGRyZXNzIHJhdGhlciB0aGFuIGJ5IHZhbHVlLgorCisgICBUaGUgInBjIiBpcyBub3Qgc3RvcmVkIGluIGEgZnJhbWUgb24gdGhlIFNQQVJDLiAgKFdoYXQgaXMgc3RvcmVkCisgICBpcyBhIHJldHVybiBhZGRyZXNzIG1pbnVzIDguKSAgc3BhcmNfcG9wX2ZyYW1lIGtub3dzIGhvdyB0bworICAgZGVhbCB3aXRoIHRoYXQuICBPdGhlciByb3V0aW5lcyBtaWdodCBvciBtaWdodCBub3QuCisKKyAgIFNlZSB0bS1zcGFyYy5oIChQVVNIX0RVTU1ZX0ZSQU1FIGFuZCBmcmllbmRzKSBmb3IgQ1JJVElDQUwgaW5mb3JtYXRpb24KKyAgIGFib3V0IGhvdyB0aGlzIHdvcmtzLiAgKi8KKworc3RhdGljIHZvaWQgc3BhcmNfZnJhbWVfZmluZF9zYXZlZF9yZWdzIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICosCisJCQkJCQkgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgKikpOworCitzdGF0aWMgdm9pZAorc3BhcmNfZnJhbWVfZmluZF9zYXZlZF9yZWdzIChmaSwgc2F2ZWRfcmVnc19hZGRyKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7CisgICAgIHN0cnVjdCBmcmFtZV9zYXZlZF9yZWdzICpzYXZlZF9yZWdzX2FkZHI7Cit7CisgIHJlZ2lzdGVyIGludCByZWdudW07CisgIENPUkVfQUREUiBmcmFtZV9hZGRyID0gRlJBTUVfRlAgKGZpKTsKKworICBpZiAoIWZpKQorICAgIGZhdGFsICgiQmFkIGZyYW1lIGluZm8gc3RydWN0IGluIEZSQU1FX0ZJTkRfU0FWRURfUkVHUyIpOworCisgIG1lbXNldCAoc2F2ZWRfcmVnc19hZGRyLCAwLCBzaXplb2YgKCpzYXZlZF9yZWdzX2FkZHIpKTsKKworICBpZiAoZmktPnBjID49IChmaS0+Ym90dG9tID8gZmktPmJvdHRvbSA6CisJCSAgIHJlYWRfc3AgKCkpCisgICAgICAmJiBmaS0+cGMgPD0gRlJBTUVfRlAoZmkpKQorICAgIHsKKyAgICAgIC8qIER1bW15IGZyYW1lLiAgQWxsIGJ1dCB0aGUgd2luZG93IHJlZ3MgYXJlIGluIHRoZXJlIHNvbWV3aGVyZS4gKi8KKyAgICAgIGZvciAocmVnbnVtID0gRzFfUkVHTlVNOyByZWdudW0gPCBHMV9SRUdOVU0rNzsgcmVnbnVtKyspCisJc2F2ZWRfcmVnc19hZGRyLT5yZWdzW3JlZ251bV0gPQorCSAgZnJhbWVfYWRkciArIChyZWdudW0gLSBHMF9SRUdOVU0pICogU1BBUkNfSU5UUkVHX1NJWkUKKwkgICAgLSBEVU1NWV9TVEFDS19SRUdfQlVGX1NJWkUgKyAxNiAqIFNQQVJDX0lOVFJFR19TSVpFOworICAgICAgZm9yIChyZWdudW0gPSBJMF9SRUdOVU07IHJlZ251bSA8IEkwX1JFR05VTSs4OyByZWdudW0rKykKKwlzYXZlZF9yZWdzX2FkZHItPnJlZ3NbcmVnbnVtXSA9CisJICBmcmFtZV9hZGRyICsgKHJlZ251bSAtIEkwX1JFR05VTSkgKiBTUEFSQ19JTlRSRUdfU0laRQorCSAgICAtIERVTU1ZX1NUQUNLX1JFR19CVUZfU0laRSArIDggKiBTUEFSQ19JTlRSRUdfU0laRTsKKyNpZmRlZiBGUDBfUkVHTlVNCisgICAgICBmb3IgKHJlZ251bSA9IEZQMF9SRUdOVU07IHJlZ251bSA8IEZQMF9SRUdOVU0gKyAzMjsgcmVnbnVtKyspCisJc2F2ZWRfcmVnc19hZGRyLT5yZWdzW3JlZ251bV0gPQorCSAgZnJhbWVfYWRkciArIChyZWdudW0gLSBGUDBfUkVHTlVNKSAqIDQKKwkgICAgLSBEVU1NWV9TVEFDS19SRUdfQlVGX1NJWkUgKyAyNCAqIFNQQVJDX0lOVFJFR19TSVpFOworI2lmZGVmIEdEQl9UQVJHRVRfSVNfU1BBUkM2NAorICAgICAgZm9yIChyZWdudW0gPSBGUDBfUkVHTlVNICsgMzI7IHJlZ251bSA8IEZQX01BWF9SRUdOVU07IHJlZ251bSsrKQorCXNhdmVkX3JlZ3NfYWRkci0+cmVnc1tyZWdudW1dID0KKwkgIGZyYW1lX2FkZHIgKyAzMiAqIDQgKyAocmVnbnVtIC0gRlAwX1JFR05VTSAtIDMyKSAqIDQKKwkgICAgLSBEVU1NWV9TVEFDS19SRUdfQlVGX1NJWkUgKyAyNCAqIFNQQVJDX0lOVFJFR19TSVpFOworI2VuZGlmCisjZW5kaWYgLyogRlAwX1JFR05VTSAqLworI2lmZGVmIEdEQl9UQVJHRVRfSVNfU1BBUkM2NAorICAgICAgZm9yIChyZWdudW0gPSBQQ19SRUdOVU07IHJlZ251bSA8IFBDX1JFR05VTSArIDc7IHJlZ251bSsrKQorCXsKKwkgIHNhdmVkX3JlZ3NfYWRkci0+cmVnc1tyZWdudW1dID0KKwkgICAgZnJhbWVfYWRkciArIChyZWdudW0gLSBQQ19SRUdOVU0pICogU1BBUkNfSU5UUkVHX1NJWkUgCisJICAgICAgLSBEVU1NWV9TVEFDS19SRUdfQlVGX1NJWkU7CisJfQorICAgICAgc2F2ZWRfcmVnc19hZGRyLT5yZWdzW1BTVEFURV9SRUdOVU1dID0gCisJZnJhbWVfYWRkciArIDggKiBTUEFSQ19JTlRSRUdfU0laRSAtIERVTU1ZX1NUQUNLX1JFR19CVUZfU0laRTsKKyNlbHNlCisgICAgICBmb3IgKHJlZ251bSA9IFlfUkVHTlVNOyByZWdudW0gPCBOVU1fUkVHUzsgcmVnbnVtKyspCisJc2F2ZWRfcmVnc19hZGRyLT5yZWdzW3JlZ251bV0gPQorCSAgZnJhbWVfYWRkciArIChyZWdudW0gLSBZX1JFR05VTSkgKiBTUEFSQ19JTlRSRUdfU0laRSAKKwkgICAgLSBEVU1NWV9TVEFDS19SRUdfQlVGX1NJWkU7CisjZW5kaWYKKyAgICAgIGZyYW1lX2FkZHIgPSBmaS0+Ym90dG9tID8KKwlmaS0+Ym90dG9tIDogcmVhZF9zcCAoKTsKKyAgICB9CisgIGVsc2UgaWYgKGZpLT5mbGF0KQorICAgIHsKKyAgICAgIENPUkVfQUREUiBmdW5jX3N0YXJ0OworICAgICAgZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uIChmaS0+cGMsIE5VTEwsICZmdW5jX3N0YXJ0LCBOVUxMKTsKKyAgICAgIGV4YW1pbmVfcHJvbG9ndWUgKGZ1bmNfc3RhcnQsIDAsIGZpLCBzYXZlZF9yZWdzX2FkZHIpOworCisgICAgICAvKiBGbGF0IHJlZ2lzdGVyIHdpbmRvdyBmcmFtZS4gICovCisgICAgICBzYXZlZF9yZWdzX2FkZHItPnJlZ3NbUlBfUkVHTlVNXSA9IGZpLT5wY19hZGRyOworICAgICAgc2F2ZWRfcmVnc19hZGRyLT5yZWdzW0k3X1JFR05VTV0gPSBmaS0+ZnBfYWRkcjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3JtYWwgZnJhbWUuICBKdXN0IExvY2FsIGFuZCBJbiByZWdpc3RlcnMgKi8KKyAgICAgIGZyYW1lX2FkZHIgPSBmaS0+Ym90dG9tID8KKwlmaS0+Ym90dG9tIDogcmVhZF9zcCAoKTsKKyAgICAgIGZvciAocmVnbnVtID0gTDBfUkVHTlVNOyByZWdudW0gPCBMMF9SRUdOVU0rODsgcmVnbnVtKyspCisJc2F2ZWRfcmVnc19hZGRyLT5yZWdzW3JlZ251bV0gPQorCSAgKGZyYW1lX2FkZHIgKyAocmVnbnVtIC0gTDBfUkVHTlVNKSAqIFNQQVJDX0lOVFJFR19TSVpFCisJICAgKyBGUkFNRV9TQVZFRF9MMCk7CisgICAgICBmb3IgKHJlZ251bSA9IEkwX1JFR05VTTsgcmVnbnVtIDwgSTBfUkVHTlVNKzg7IHJlZ251bSsrKQorCXNhdmVkX3JlZ3NfYWRkci0+cmVnc1tyZWdudW1dID0KKwkgIChmcmFtZV9hZGRyICsgKHJlZ251bSAtIEkwX1JFR05VTSkgKiBTUEFSQ19JTlRSRUdfU0laRQorCSAgICsgRlJBTUVfU0FWRURfSTApOworICAgIH0KKyAgaWYgKGZpLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChmaS0+ZmxhdCkKKwl7CisJICBzYXZlZF9yZWdzX2FkZHItPnJlZ3NbTzdfUkVHTlVNXSA9IGZpLT5wY19hZGRyOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBQdWxsIG9mZiBlaXRoZXIgdGhlIG5leHQgZnJhbWUgcG9pbnRlciBvciB0aGUgc3RhY2sgcG9pbnRlciAqLworCSAgQ09SRV9BRERSIG5leHRfbmV4dF9mcmFtZV9hZGRyID0KKwkgICAgKGZpLT5uZXh0LT5ib3R0b20gPworCSAgICAgZmktPm5leHQtPmJvdHRvbSA6CisJICAgICByZWFkX3NwICgpKTsKKwkgIGZvciAocmVnbnVtID0gTzBfUkVHTlVNOyByZWdudW0gPCBPMF9SRUdOVU0rODsgcmVnbnVtKyspCisJICAgIHNhdmVkX3JlZ3NfYWRkci0+cmVnc1tyZWdudW1dID0KKwkgICAgICAobmV4dF9uZXh0X2ZyYW1lX2FkZHIKKwkgICAgICAgKyAocmVnbnVtIC0gTzBfUkVHTlVNKSAqIFNQQVJDX0lOVFJFR19TSVpFCisJICAgICAgICsgRlJBTUVfU0FWRURfSTApOworCX0KKyAgICB9CisgIC8qIE90aGVyd2lzZSwgd2hhdGV2ZXIgd2Ugd291bGQgZ2V0IGZyb20gcHRyYWNlKEdFVFJFR1MpIGlzIGFjY3VyYXRlICovCisgIC8qIEZJWE1FIC0tIHNob3VsZCB0aGlzIGFkanVzdCBmb3IgdGhlIHNwYXJjNjQgb2Zmc2V0PyAqLworICBzYXZlZF9yZWdzX2FkZHItPnJlZ3NbU1BfUkVHTlVNXSA9IEZSQU1FX0ZQIChmaSk7Cit9CisKKy8qIERpc2NhcmQgZnJvbSB0aGUgc3RhY2sgdGhlIGlubmVybW9zdCBmcmFtZSwgcmVzdG9yaW5nIGFsbCBzYXZlZCByZWdpc3RlcnMuCisKKyAgIE5vdGUgdGhhdCB0aGUgdmFsdWVzIHN0b3JlZCBpbiBmc3IgYnkgZ2V0X2ZyYW1lX3NhdmVkX3JlZ3MgYXJlICppbgorICAgdGhlIGNvbnRleHQgb2YgdGhlIGNhbGxlZCBmcmFtZSouICBXaGF0IHRoaXMgbWVhbnMgaXMgdGhhdCB0aGUgaQorICAgcmVncyBvZiBmc3IgbXVzdCBiZSByZXN0b3JlZCBpbnRvIHRoZSBvIHJlZ3Mgb2YgdGhlIChjYWxsaW5nKSBmcmFtZSB0aGF0CisgICB3ZSBwb3AgaW50by4gIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIG91dHB1dCByZWdzIG9mIHRoZSBjYWxsaW5nIGZyYW1lLAorICAgc2luY2UgdW5sZXNzIGl0J3MgYSBkdW1teSBmcmFtZSwgaXQgd29uJ3QgaGF2ZSBhbnkgb3V0cHV0IHJlZ3MgaW4gaXQuCisKKyAgIFdlIG5ldmVyIGhhdmUgdG8gYm90aGVyIHdpdGggJWwgKGxvY2FsKSByZWdzLCBzaW5jZSB0aGUgY2FsbGVkIHJvdXRpbmUncworICAgbG9jYWxzIGdldCB0b3NzZWQsIGFuZCB0aGUgY2FsbGluZyByb3V0aW5lJ3MgbG9jYWxzIGFyZSBhbHJlYWR5IHNhdmVkCisgICBvbiBpdHMgc3RhY2suICAqLworCisvKiBEZWZpbml0ZWx5IHNlZSB0bS1zcGFyYy5oIGZvciBtb3JlIGRvYyBvZiB0aGUgZnJhbWUgZm9ybWF0IGhlcmUuICAqLworCit2b2lkCitzcGFyY19wb3BfZnJhbWUgKCkKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lID0gZ2V0X2N1cnJlbnRfZnJhbWUgKCk7CisgIHJlZ2lzdGVyIENPUkVfQUREUiBwYzsKKyAgc3RydWN0IGZyYW1lX3NhdmVkX3JlZ3MgZnNyOworICBjaGFyIHJhd19idWZmZXJbUkVHSVNURVJfQllURVNdOworICBpbnQgcmVnbnVtOworCisgIHNwYXJjX2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyAoZnJhbWUsICZmc3IpOworI2lmZGVmIEZQMF9SRUdOVU0KKyAgaWYgKGZzci5yZWdzW0ZQMF9SRUdOVU1dKQorICAgIHsKKyAgICAgIHJlYWRfbWVtb3J5IChmc3IucmVnc1tGUDBfUkVHTlVNXSwgcmF3X2J1ZmZlciwgRlBfUkVHSVNURVJfQllURVMpOworICAgICAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKFJFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pLAorCQkJICAgIHJhd19idWZmZXIsIEZQX1JFR0lTVEVSX0JZVEVTKTsKKyAgICB9CisjaWZuZGVmIEdEQl9UQVJHRVRfSVNfU1BBUkM2NAorICBpZiAoZnNyLnJlZ3NbRlBTX1JFR05VTV0pCisgICAgeworICAgICAgcmVhZF9tZW1vcnkgKGZzci5yZWdzW0ZQU19SRUdOVU1dLCByYXdfYnVmZmVyLCA0KTsKKyAgICAgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFIChGUFNfUkVHTlVNKSwgcmF3X2J1ZmZlciwgNCk7CisgICAgfQorICBpZiAoZnNyLnJlZ3NbQ1BTX1JFR05VTV0pCisgICAgeworICAgICAgcmVhZF9tZW1vcnkgKGZzci5yZWdzW0NQU19SRUdOVU1dLCByYXdfYnVmZmVyLCA0KTsKKyAgICAgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFIChDUFNfUkVHTlVNKSwgcmF3X2J1ZmZlciwgNCk7CisgICAgfQorI2VuZGlmCisjZW5kaWYgLyogRlAwX1JFR05VTSAqLworICBpZiAoZnNyLnJlZ3NbRzFfUkVHTlVNXSkKKyAgICB7CisgICAgICByZWFkX21lbW9yeSAoZnNyLnJlZ3NbRzFfUkVHTlVNXSwgcmF3X2J1ZmZlciwgNyAqIFNQQVJDX0lOVFJFR19TSVpFKTsKKyAgICAgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFIChHMV9SRUdOVU0pLCByYXdfYnVmZmVyLAorCQkJICAgIDcgKiBTUEFSQ19JTlRSRUdfU0laRSk7CisgICAgfQorCisgIGlmIChmcmFtZS0+ZmxhdCkKKyAgICB7CisgICAgICAvKiBFYWNoIHJlZ2lzdGVyIG1pZ2h0IG9yIG1pZ2h0IG5vdCBoYXZlIGJlZW4gc2F2ZWQsIG5lZWQgdG8gdGVzdAorCSBpbmRpdmlkdWFsbHkuICAqLworICAgICAgZm9yIChyZWdudW0gPSBMMF9SRUdOVU07IHJlZ251bSA8IEwwX1JFR05VTSArIDg7ICsrcmVnbnVtKQorCWlmIChmc3IucmVnc1tyZWdudW1dKQorCSAgd3JpdGVfcmVnaXN0ZXIgKHJlZ251bSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnNyLnJlZ3NbcmVnbnVtXSwKKwkJCQkJCSAgICAgICBTUEFSQ19JTlRSRUdfU0laRSkpOworICAgICAgZm9yIChyZWdudW0gPSBJMF9SRUdOVU07IHJlZ251bSA8IEkwX1JFR05VTSArIDg7ICsrcmVnbnVtKQorCWlmIChmc3IucmVnc1tyZWdudW1dKQorCSAgd3JpdGVfcmVnaXN0ZXIgKHJlZ251bSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnNyLnJlZ3NbcmVnbnVtXSwKKwkJCQkJCSAgICAgICBTUEFSQ19JTlRSRUdfU0laRSkpOworCisgICAgICAvKiBIYW5kbGUgYWxsIG91dHMgZXhjZXB0IHN0YWNrIHBvaW50ZXIgKG8wLW81OyBvNykuICAqLworICAgICAgZm9yIChyZWdudW0gPSBPMF9SRUdOVU07IHJlZ251bSA8IE8wX1JFR05VTSArIDY7ICsrcmVnbnVtKQorCWlmIChmc3IucmVnc1tyZWdudW1dKQorCSAgd3JpdGVfcmVnaXN0ZXIgKHJlZ251bSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnNyLnJlZ3NbcmVnbnVtXSwKKwkJCQkJCSAgICAgICBTUEFSQ19JTlRSRUdfU0laRSkpOworICAgICAgaWYgKGZzci5yZWdzW08wX1JFR05VTSArIDddKQorCXdyaXRlX3JlZ2lzdGVyIChPMF9SRUdOVU0gKyA3LAorCQkJcmVhZF9tZW1vcnlfaW50ZWdlciAoZnNyLnJlZ3NbTzBfUkVHTlVNICsgN10sCisJCQkJCSAgICAgU1BBUkNfSU5UUkVHX1NJWkUpKTsKKworICAgICAgd3JpdGVfc3AgKGZyYW1lLT5mcmFtZSk7CisgICAgfQorICBlbHNlIGlmIChmc3IucmVnc1tJMF9SRUdOVU1dKQorICAgIHsKKyAgICAgIENPUkVfQUREUiBzcDsKKworICAgICAgY2hhciByZWdfdGVtcFtSRUdJU1RFUl9CWVRFU107CisKKyAgICAgIHJlYWRfbWVtb3J5IChmc3IucmVnc1tJMF9SRUdOVU1dLCByYXdfYnVmZmVyLCA4ICogU1BBUkNfSU5UUkVHX1NJWkUpOworCisgICAgICAvKiBHZXQgdGhlIGlucyBhbmQgbG9jYWxzIHdoaWNoIHdlIGFyZSBhYm91dCB0byByZXN0b3JlLiAgSnVzdAorCSBtb3ZpbmcgdGhlIHN0YWNrIHBvaW50ZXIgaXMgYWxsIHRoYXQgaXMgcmVhbGx5IG5lZWRlZCwgZXhjZXB0CisJIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyBpcyB0aGVuIGdvaW5nIHRvIHdyaXRlIHRoZSBpbnMgYW5kCisJIGxvY2FscyBmcm9tIHRoZSByZWdpc3RlcnMgYXJyYXksIHNvIHdlIG5lZWQgdG8gbXVjayB3aXRoIHRoZQorCSByZWdpc3RlcnMgYXJyYXkuICAqLworICAgICAgc3AgPSBmc3IucmVnc1tTUF9SRUdOVU1dOworI2lmZGVmIEdEQl9UQVJHRVRfSVNfU1BBUkM2NAorICAgICAgaWYgKHNwICYgMSkKKwlzcCArPSAyMDQ3OworI2VuZGlmCisgICAgICByZWFkX21lbW9yeSAoc3AsIHJlZ190ZW1wLCBTUEFSQ19JTlRSRUdfU0laRSAqIDE2KTsKKworICAgICAgLyogUmVzdG9yZSB0aGUgb3V0IHJlZ2lzdGVycy4KKwkgQW1vbmcgb3RoZXIgdGhpbmdzIHRoaXMgd3JpdGVzIHRoZSBuZXcgc3RhY2sgcG9pbnRlci4gICovCisgICAgICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSAoTzBfUkVHTlVNKSwgcmF3X2J1ZmZlciwKKwkJCSAgICBTUEFSQ19JTlRSRUdfU0laRSAqIDgpOworCisgICAgICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSAoTDBfUkVHTlVNKSwgcmVnX3RlbXAsCisJCQkgICAgU1BBUkNfSU5UUkVHX1NJWkUgKiAxNik7CisgICAgfQorI2lmbmRlZiBHREJfVEFSR0VUX0lTX1NQQVJDNjQKKyAgaWYgKGZzci5yZWdzW1BTX1JFR05VTV0pCisgICAgd3JpdGVfcmVnaXN0ZXIgKFBTX1JFR05VTSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnNyLnJlZ3NbUFNfUkVHTlVNXSwgNCkpOworI2VuZGlmCisgIGlmIChmc3IucmVnc1tZX1JFR05VTV0pCisgICAgd3JpdGVfcmVnaXN0ZXIgKFlfUkVHTlVNLCByZWFkX21lbW9yeV9pbnRlZ2VyIChmc3IucmVnc1tZX1JFR05VTV0sIFJFR0lTVEVSX1JBV19TSVpFIChZX1JFR05VTSkpKTsKKyAgaWYgKGZzci5yZWdzW1BDX1JFR05VTV0pCisgICAgeworICAgICAgLyogRXhwbGljaXRseSBzcGVjaWZpZWQgUEMgKGFuZCBtYXliZSBOUEMpIC0tIGp1c3QgcmVzdG9yZSB0aGVtLiAqLworICAgICAgd3JpdGVfcmVnaXN0ZXIgKFBDX1JFR05VTSwgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnNyLnJlZ3NbUENfUkVHTlVNXSwKKwkJCQkJCSAgICAgIFJFR0lTVEVSX1JBV19TSVpFIChQQ19SRUdOVU0pKSk7CisgICAgICBpZiAoZnNyLnJlZ3NbTlBDX1JFR05VTV0pCisJd3JpdGVfcmVnaXN0ZXIgKE5QQ19SRUdOVU0sCisJCQlyZWFkX21lbW9yeV9pbnRlZ2VyIChmc3IucmVnc1tOUENfUkVHTlVNXSwKKwkJCQkJICAgICBSRUdJU1RFUl9SQVdfU0laRSAoTlBDX1JFR05VTSkpKTsKKyAgICB9CisgIGVsc2UgaWYgKGZyYW1lLT5mbGF0KQorICAgIHsKKyAgICAgIGlmIChmcmFtZS0+cGNfYWRkcikKKwlwYyA9IFBDX0FESlVTVCAoKENPUkVfQUREUikKKwkJCXJlYWRfbWVtb3J5X2ludGVnZXIgKGZyYW1lLT5wY19hZGRyLAorCQkJCQkgICAgIFJFR0lTVEVSX1JBV19TSVpFIChQQ19SRUdOVU0pKSk7CisgICAgICBlbHNlCisJeworCSAgLyogSSB0aGluayB0aGlzIGhhcHBlbnMgb25seSBpbiB0aGUgaW5uZXJtb3N0IGZyYW1lLCBpZiBzbyB0aGVuCisJICAgICBpdCBpcyBhIGNvbXBsaWNhdGVkIHdheSBvZiBzYXlpbmcKKwkgICAgICJwYyA9IHJlYWRfcmVnaXN0ZXIgKE83X1JFR05VTSk7Ii4gICovCisJICBjaGFyIGJ1ZltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworCSAgZ2V0X3NhdmVkX3JlZ2lzdGVyIChidWYsIDAsIDAsIGZyYW1lLCBPN19SRUdOVU0sIDApOworCSAgcGMgPSBQQ19BREpVU1QgKGV4dHJhY3RfYWRkcmVzcworCQkJICAoYnVmLCBSRUdJU1RFUl9SQVdfU0laRSAoTzdfUkVHTlVNKSkpOworCX0KKworICAgICAgd3JpdGVfcmVnaXN0ZXIgKFBDX1JFR05VTSwgIHBjKTsKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChOUENfUkVHTlVNLCBwYyArIDQpOworICAgIH0KKyAgZWxzZSBpZiAoZnNyLnJlZ3NbSTdfUkVHTlVNXSkKKyAgICB7CisgICAgICAvKiBSZXR1cm4gYWRkcmVzcyBpbiAlaTcgLS0gYWRqdXN0IGl0LCB0aGVuIHJlc3RvcmUgUEMgYW5kIE5QQyBmcm9tIGl0ICovCisgICAgICBwYyA9IFBDX0FESlVTVCAoKENPUkVfQUREUikgcmVhZF9tZW1vcnlfaW50ZWdlciAoZnNyLnJlZ3NbSTdfUkVHTlVNXSwKKwkJCQkJCSAgICAgICBTUEFSQ19JTlRSRUdfU0laRSkpOworICAgICAgd3JpdGVfcmVnaXN0ZXIgKFBDX1JFR05VTSwgIHBjKTsKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChOUENfUkVHTlVNLCBwYyArIDQpOworICAgIH0KKyAgZmx1c2hfY2FjaGVkX2ZyYW1lcyAoKTsKK30KKworLyogT24gdGhlIFN1biA0IHVuZGVyIFN1bk9TLCB0aGUgY29tcGlsZSB3aWxsIGxlYXZlIGEgZmFrZSBpbnNuIHdoaWNoCisgICBlbmNvZGVzIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBiZWluZyByZXR1cm5lZC4gIElmIHdlIGRldGVjdCBzdWNoCisgICBhIGZha2UgaW5zbiwgc3RlcCBwYXN0IGl0LiAgKi8KKworQ09SRV9BRERSCitzcGFyY19wY19hZGp1c3QocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgdW5zaWduZWQgbG9uZyBpbnNuOworICBjaGFyIGJ1Zls0XTsKKyAgaW50IGVycjsKKworICBlcnIgPSB0YXJnZXRfcmVhZF9tZW1vcnkgKHBjICsgOCwgYnVmLCA0KTsKKyAgaW5zbiA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAoYnVmLCA0KTsKKyAgaWYgKChlcnIgPT0gMCkgJiYgKGluc24gJiAweGZmYzAwMDAwKSA9PSAwKQorICAgIHJldHVybiBwYysxMjsKKyAgZWxzZQorICAgIHJldHVybiBwYys4OworfQorCisvKiBJZiBwYyBpcyBpbiBhIHNoYXJlZCBsaWJyYXJ5IHRyYW1wb2xpbmUsIHJldHVybiBpdHMgdGFyZ2V0LgorICAgVGhlIFN1bk9zIDQueCBsaW5rZXIgcmV3cml0ZXMgdGhlIGp1bXAgdGFibGUgZW50cmllcyBmb3IgUElDCisgICBjb21waWxlZCBtb2R1bGVzIGluIHRoZSBtYWluIGV4ZWN1dGFibGUgdG8gYnlwYXNzIHRoZSBkeW5hbWljIGxpbmtlcgorICAgd2l0aCBqdW1wcyBvZiB0aGUgZm9ybQorCXNldGhpICVoaShhZGRyKSwlZzEKKwlqbXAgJWcxKyVsbyhhZGRyKQorICAgYW5kIHJlbW92ZXMgdGhlIGNvcnJlc3BvbmRpbmcganVtcCB0YWJsZSByZWxvY2F0aW9uIGVudHJ5IGluIHRoZQorICAgZHluYW1pYyByZWxvY2F0aW9ucy4KKyAgIGZpbmRfc29saWJfdHJhbXBvbGluZV90YXJnZXQgcmVsaWVzIG9uIHRoZSBwcmVzZW5jZSBvZiB0aGUganVtcAorICAgdGFibGUgcmVsb2NhdGlvbiBlbnRyeSwgc28gd2UgaGF2ZSB0byBkZXRlY3QgdGhlc2UganVtcCBpbnN0cnVjdGlvbnMKKyAgIGJ5IGhhbmQuICAqLworCitDT1JFX0FERFIKK3N1bm9zNF9za2lwX3RyYW1wb2xpbmVfY29kZSAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgdW5zaWduZWQgbG9uZyBpbnNuMTsKKyAgY2hhciBidWZbNF07CisgIGludCBlcnI7CisKKyAgZXJyID0gdGFyZ2V0X3JlYWRfbWVtb3J5IChwYywgYnVmLCA0KTsKKyAgaW5zbjEgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgNCk7CisgIGlmIChlcnIgPT0gMCAmJiAoaW5zbjEgJiAweGZmYzAwMDAwKSA9PSAweDAzMDAwMDAwKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjI7CisKKyAgICAgIGVyciA9IHRhcmdldF9yZWFkX21lbW9yeSAocGMgKyA0LCBidWYsIDQpOworICAgICAgaW5zbjIgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZiwgNCk7CisgICAgICBpZiAoZXJyID09IDAgJiYgKGluc24yICYgMHhmZmZmZTAwMCkgPT0gMHg4MWMwNjAwMCkKKwl7CisJICBDT1JFX0FERFIgdGFyZ2V0X3BjID0gKGluc24xICYgMHgzZmZmZmYpIDw8IDEwOworCSAgaW50IGRlbHRhID0gaW5zbjIgJiAweDFmZmY7CisKKwkgIC8qIFNpZ24gZXh0ZW5kIHRoZSBkaXNwbGFjZW1lbnQuICAqLworCSAgaWYgKGRlbHRhICYgMHgxMDAwKQorCSAgICBkZWx0YSB8PSB+MHgxZmZmOworCSAgcmV0dXJuIHRhcmdldF9wYyArIGRlbHRhOworCX0KKyAgICB9CisgIHJldHVybiBmaW5kX3NvbGliX3RyYW1wb2xpbmVfdGFyZ2V0IChwYyk7Cit9CisMCisjaWZkZWYgVVNFX1BST0NfRlMJLyogVGFyZ2V0IGRlcGVuZGVudCBzdXBwb3J0IGZvciAvcHJvYyAqLworCisvKiAgVGhlIC9wcm9jIGludGVyZmFjZSBkaXZpZGVzIHRoZSB0YXJnZXQgbWFjaGluZSdzIHJlZ2lzdGVyIHNldCB1cCBpbnRvCisgICAgdHdvIGRpZmZlcmVudCBzZXRzLCB0aGUgZ2VuZXJhbCByZWdpc3RlciBzZXQgKGdyZWdzZXQpIGFuZCB0aGUgZmxvYXRpbmcKKyAgICBwb2ludCByZWdpc3RlciBzZXQgKGZwcmVnc2V0KS4gIEZvciBlYWNoIHNldCwgdGhlcmUgaXMgYW4gaW9jdGwgdG8gZ2V0CisgICAgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgc2V0IGFuZCBhbm90aGVyIGlvY3RsIHRvIHNldCB0aGUgY3VycmVudCB2YWx1ZXMuCisKKyAgICBUaGUgYWN0dWFsIHN0cnVjdHVyZSBwYXNzZWQgdGhyb3VnaCB0aGUgaW9jdGwgaW50ZXJmYWNlIGlzLCBvZiBjb3Vyc2UsCisgICAgbmF0dXJhbGx5IG1hY2hpbmUgZGVwZW5kZW50LCBhbmQgaXMgZGlmZmVyZW50IGZvciBlYWNoIHNldCBvZiByZWdpc3RlcnMuCisgICAgRm9yIHRoZSBzcGFyYyBmb3IgZXhhbXBsZSwgdGhlIGdlbmVyYWwgcmVnaXN0ZXIgc2V0IGlzIHR5cGljYWxseSBkZWZpbmVkCisgICAgYnk6CisKKwl0eXBlZGVmIGludCBncmVnc2V0X3RbMzhdOworCisJI2RlZmluZQlSX0cwCTAKKwkuLi4KKwkjZGVmaW5lCVJfVEJSCTM3CisKKyAgICBhbmQgdGhlIGZsb2F0aW5nIHBvaW50IHNldCBieToKKworCXR5cGVkZWYgc3RydWN0IHByZnByZWdzZXQgeworCQl1bmlvbiB7IAorCQkJdV9sb25nICBwcl9yZWdzWzMyXTsgCisJCQlkb3VibGUgIHByX2RyZWdzWzE2XTsKKwkJfSBwcl9mcjsKKwkJdm9pZCAqICBwcl9maWxsZXI7CisJCXVfbG9uZyAgcHJfZnNyOworCQl1X2NoYXIgIHByX3FjbnQ7CisJCXVfY2hhciAgcHJfcV9lbnRyeXNpemU7CisJCXVfY2hhciAgcHJfZW47CisJCXVfbG9uZyAgcHJfcVs2NF07CisJfSBwcmZwcmVnc2V0X3Q7CisKKyAgICBUaGVzZSByb3V0aW5lcyBwcm92aWRlIHRoZSBwYWNraW5nIGFuZCB1bnBhY2tpbmcgb2YgZ3JlZ3NldF90IGFuZAorICAgIGZwcmVnc2V0X3QgZm9ybWF0dGVkIGRhdGEuCisKKyAqLworCisvKiBHaXZlbiBhIHBvaW50ZXIgdG8gYSBnZW5lcmFsIHJlZ2lzdGVyIHNldCBpbiAvcHJvYyBmb3JtYXQgKGdyZWdzZXRfdCAqKSwKKyAgIHVucGFjayB0aGUgcmVnaXN0ZXIgY29udGVudHMgYW5kIHN1cHBseSB0aGVtIGFzIGdkYidzIGlkZWEgb2YgdGhlIGN1cnJlbnQKKyAgIHJlZ2lzdGVyIHZhbHVlcy4gKi8KKwordm9pZAorc3VwcGx5X2dyZWdzZXQgKGdyZWdzZXRwKQorcHJncmVnc2V0X3QgKmdyZWdzZXRwOworeworICByZWdpc3RlciBpbnQgcmVnaTsKKyAgcmVnaXN0ZXIgcHJncmVnX3QgKnJlZ3AgPSAocHJncmVnX3QgKikgZ3JlZ3NldHA7CisgIHN0YXRpYyBjaGFyIHplcm9idWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXSA9IHswfTsKKworICAvKiBHREIgcmVnaXN0ZXIgbnVtYmVycyBmb3IgR24sIE9uLCBMbiwgSW4gYWxsIG1hdGNoIC9wcm9jIHJlZyBudW1iZXJzLiAgKi8KKyAgZm9yIChyZWdpID0gRzBfUkVHTlVNIDsgcmVnaSA8PSBJN19SRUdOVU0gOyByZWdpKyspCisgICAgeworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdpLCAoY2hhciAqKSAocmVncCArIHJlZ2kpKTsKKyAgICB9CisKKyAgLyogVGhlc2UgcmVxdWlyZSBhIGJpdCBtb3JlIGNhcmUuICAqLworICBzdXBwbHlfcmVnaXN0ZXIgKFBTX1JFR05VTSwgKGNoYXIgKikgKHJlZ3AgKyBSX1BTKSk7CisgIHN1cHBseV9yZWdpc3RlciAoUENfUkVHTlVNLCAoY2hhciAqKSAocmVncCArIFJfUEMpKTsKKyAgc3VwcGx5X3JlZ2lzdGVyIChOUENfUkVHTlVNLChjaGFyICopIChyZWdwICsgUl9uUEMpKTsKKyAgc3VwcGx5X3JlZ2lzdGVyIChZX1JFR05VTSwgIChjaGFyICopIChyZWdwICsgUl9ZKSk7CisKKyAgLyogRmlsbCBpbmFjY2Vzc2libGUgcmVnaXN0ZXJzIHdpdGggemVyby4gICovCisgIHN1cHBseV9yZWdpc3RlciAoV0lNX1JFR05VTSwgemVyb2J1Zik7CisgIHN1cHBseV9yZWdpc3RlciAoVEJSX1JFR05VTSwgemVyb2J1Zik7CisgIHN1cHBseV9yZWdpc3RlciAoQ1BTX1JFR05VTSwgemVyb2J1Zik7Cit9CisKK3ZvaWQKK2ZpbGxfZ3JlZ3NldCAoZ3JlZ3NldHAsIHJlZ25vKQorcHJncmVnc2V0X3QgKmdyZWdzZXRwOworaW50IHJlZ25vOworeworICBpbnQgcmVnaTsKKyAgcmVnaXN0ZXIgcHJncmVnX3QgKnJlZ3AgPSAocHJncmVnX3QgKikgZ3JlZ3NldHA7CisKKyAgZm9yIChyZWdpID0gMCA7IHJlZ2kgPD0gUl9JNyA7IHJlZ2krKykKKyAgICB7CisgICAgICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gcmVnaSkpCisJeworCSAgKihyZWdwICsgcmVnaSkgPSAqKGludCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ2kpXTsKKwl9CisgICAgfQorICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gUFNfUkVHTlVNKSkKKyAgICB7CisgICAgICAqKHJlZ3AgKyBSX1BTKSA9ICooaW50ICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUFNfUkVHTlVNKV07CisgICAgfQorICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gUENfUkVHTlVNKSkKKyAgICB7CisgICAgICAqKHJlZ3AgKyBSX1BDKSA9ICooaW50ICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUENfUkVHTlVNKV07CisgICAgfQorICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gTlBDX1JFR05VTSkpCisgICAgeworICAgICAgKihyZWdwICsgUl9uUEMpID0gKihpbnQgKikgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChOUENfUkVHTlVNKV07CisgICAgfQorICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gWV9SRUdOVU0pKQorICAgIHsKKyAgICAgICoocmVncCArIFJfWSkgPSAqKGludCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKFlfUkVHTlVNKV07CisgICAgfQorfQorCisjaWYgZGVmaW5lZCAoRlAwX1JFR05VTSkKKworLyogIEdpdmVuIGEgcG9pbnRlciB0byBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHNldCBpbiAvcHJvYyBmb3JtYXQKKyAgICAoZnByZWdzZXRfdCAqKSwgdW5wYWNrIHRoZSByZWdpc3RlciBjb250ZW50cyBhbmQgc3VwcGx5IHRoZW0gYXMgZ2RiJ3MKKyAgICBpZGVhIG9mIHRoZSBjdXJyZW50IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHZhbHVlcy4gKi8KKwordm9pZCAKK3N1cHBseV9mcHJlZ3NldCAoZnByZWdzZXRwKQorcHJmcHJlZ3NldF90ICpmcHJlZ3NldHA7Cit7CisgIHJlZ2lzdGVyIGludCByZWdpOworICBjaGFyICpmcm9tOworICAKKyAgZm9yIChyZWdpID0gRlAwX1JFR05VTSA7IHJlZ2kgPCBGUF9NQVhfUkVHTlVNIDsgcmVnaSsrKQorICAgIHsKKyAgICAgIGZyb20gPSAoY2hhciAqKSAmZnByZWdzZXRwLT5wcl9mci5wcl9yZWdzW3JlZ2ktRlAwX1JFR05VTV07CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ2ksIGZyb20pOworICAgIH0KKyAgc3VwcGx5X3JlZ2lzdGVyIChGUFNfUkVHTlVNLCAoY2hhciAqKSAmKGZwcmVnc2V0cC0+cHJfZnNyKSk7Cit9CisKKy8qICBHaXZlbiBhIHBvaW50ZXIgdG8gYSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBzZXQgaW4gL3Byb2MgZm9ybWF0CisgICAgKGZwcmVnc2V0X3QgKiksIHVwZGF0ZSB0aGUgcmVnaXN0ZXIgc3BlY2lmaWVkIGJ5IFJFR05PIGZyb20gZ2RiJ3MgaWRlYQorICAgIG9mIHRoZSBjdXJyZW50IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHNldC4gIElmIFJFR05PIGlzIC0xLCB1cGRhdGUKKyAgICB0aGVtIGFsbC4gKi8KKy8qID8/PyBUaGlzIHdpbGwgcHJvYmFibHkgbmVlZCBzb21lIGNoYW5nZXMgZm9yIHNwYXJjNjQuICAqLworCit2b2lkCitmaWxsX2ZwcmVnc2V0IChmcHJlZ3NldHAsIHJlZ25vKQorcHJmcHJlZ3NldF90ICpmcHJlZ3NldHA7CitpbnQgcmVnbm87Cit7CisgIGludCByZWdpOworICBjaGFyICp0bzsKKyAgY2hhciAqZnJvbTsKKworICBmb3IgKHJlZ2kgPSBGUDBfUkVHTlVNIDsgcmVnaSA8IEZQX01BWF9SRUdOVU0gOyByZWdpKyspCisgICAgeworICAgICAgaWYgKChyZWdubyA9PSAtMSkgfHwgKHJlZ25vID09IHJlZ2kpKQorCXsKKwkgIGZyb20gPSAoY2hhciAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKHJlZ2kpXTsKKwkgIHRvID0gKGNoYXIgKikgJmZwcmVnc2V0cC0+cHJfZnIucHJfcmVnc1tyZWdpLUZQMF9SRUdOVU1dOworCSAgbWVtY3B5ICh0bywgZnJvbSwgUkVHSVNURVJfUkFXX1NJWkUgKHJlZ2kpKTsKKwl9CisgICAgfQorICBpZiAoKHJlZ25vID09IC0xKSB8fCAocmVnbm8gPT0gRlBTX1JFR05VTSkpCisgICAgeworICAgICAgZnByZWdzZXRwLT5wcl9mc3IgPSAqKGludCAqKSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQU19SRUdOVU0pXTsKKyAgICB9Cit9CisKKyNlbmRpZgkvKiBkZWZpbmVkIChGUDBfUkVHTlVNKSAqLworCisjZW5kaWYgIC8qIFVTRV9QUk9DX0ZTICovCisKKworI2lmZGVmIEdFVF9MT05HSk1QX1RBUkdFVAorCisvKiBGaWd1cmUgb3V0IHdoZXJlIHRoZSBsb25nam1wIHdpbGwgbGFuZC4gIFdlIGV4cGVjdCB0aGF0IHdlIGhhdmUganVzdCBlbnRlcmVkCisgICBsb25nam1wIGFuZCBoYXZlbid0IHlldCBzZXR1cCB0aGUgc3RhY2sgZnJhbWUsIHNvIHRoZSBhcmdzIGFyZSBzdGlsbCBpbiB0aGUKKyAgIG91dHB1dCByZWdzLiAgJW8wIChPMF9SRUdOVU0pIHBvaW50cyBhdCB0aGUgam1wX2J1ZiBzdHJ1Y3R1cmUgZnJvbSB3aGljaCB3ZQorICAgZXh0cmFjdCB0aGUgcGMgKEpCX1BDKSB0aGF0IHdlIHdpbGwgbGFuZCBhdC4gIFRoZSBwYyBpcyBjb3BpZWQgaW50byBBRERSLgorICAgVGhpcyByb3V0aW5lIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzICovCisKK2ludAorZ2V0X2xvbmdqbXBfdGFyZ2V0IChwYykKKyAgICAgQ09SRV9BRERSICpwYzsKK3sKKyAgQ09SRV9BRERSIGpiX2FkZHI7CisjZGVmaW5lIExPTkdKTVBfVEFSR0VUX1NJWkUgNAorICBjaGFyIGJ1ZltMT05HSk1QX1RBUkdFVF9TSVpFXTsKKworICBqYl9hZGRyID0gcmVhZF9yZWdpc3RlciAoTzBfUkVHTlVNKTsKKworICBpZiAodGFyZ2V0X3JlYWRfbWVtb3J5IChqYl9hZGRyICsgSkJfUEMgKiBKQl9FTEVNRU5UX1NJWkUsIGJ1ZiwKKwkJCSAgTE9OR0pNUF9UQVJHRVRfU0laRSkpCisgICAgcmV0dXJuIDA7CisKKyAgKnBjID0gZXh0cmFjdF9hZGRyZXNzIChidWYsIExPTkdKTVBfVEFSR0VUX1NJWkUpOworCisgIHJldHVybiAxOworfQorI2VuZGlmIC8qIEdFVF9MT05HSk1QX1RBUkdFVCAqLworDAorI2lmZGVmIFNUQVRJQ19UUkFOU0ZPUk1fTkFNRQorLyogU3VuUFJPICgzLjAgYXQgbGVhc3QpLCBlbmNvZGVzIHRoZSBzdGF0aWMgdmFyaWFibGVzLiAgVGhpcyBpcyBub3QKKyAgIHJlbGF0ZWQgdG8gQysrIG1hbmdsaW5nLCBpdCBpcyBkb25lIGZvciBDIHRvby4gICovCisKK2NoYXIgKgorc3VucHJvX3N0YXRpY190cmFuc2Zvcm1fbmFtZSAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgY2hhciAqcDsKKyAgaWYgKG5hbWVbMF0gPT0gJyQnKQorICAgIHsKKyAgICAgIC8qIEZvciBmaWxlLWxvY2FsIHN0YXRpY3MgdGhlcmUgd2lsbCBiZSBhIGRvbGxhciBzaWduLCBhIGJ1bmNoCisJIG9mIGp1bmsgKHRoZSBjb250ZW50cyBvZiB3aGljaCBtYXRjaCBhIHN0cmluZyBnaXZlbiBpbiB0aGUKKwkgTl9PUFQpLCBhIHBlcmlvZCBhbmQgdGhlIG5hbWUuICBGb3IgZnVuY3Rpb24tbG9jYWwgc3RhdGljcworCSB0aGVyZSB3aWxsIGJlIGEgYnVuY2ggb2YganVuayAod2hpY2ggc2VlbXMgdG8gY2hhbmdlIHRoZQorCSBzZWNvbmQgY2hhcmFjdGVyIGZyb20gJ0EnIHRvICdCJyksIGEgcGVyaW9kLCB0aGUgbmFtZSBvZiB0aGUKKwkgZnVuY3Rpb24sIGFuZCB0aGUgbmFtZS4gIFNvIGp1c3Qgc2tpcCBldmVyeXRoaW5nIGJlZm9yZSB0aGUKKwkgbGFzdCBwZXJpb2QuICAqLworICAgICAgcCA9IHN0cnJjaHIgKG5hbWUsICcuJyk7CisgICAgICBpZiAocCAhPSBOVUxMKQorCW5hbWUgPSBwICsgMTsKKyAgICB9CisgIHJldHVybiBuYW1lOworfQorI2VuZGlmIC8qIFNUQVRJQ19UUkFOU0ZPUk1fTkFNRSAqLworDAorCisvKiBVdGlsaXRpZXMgZm9yIHByaW50aW5nIHJlZ2lzdGVycy4KKyAgIFBhZ2UgbnVtYmVycyByZWZlciB0byB0aGUgU1BBUkMgQXJjaGl0ZWN0dXJlIE1hbnVhbC4gICovCisKK3N0YXRpYyB2b2lkIGR1bXBfY2NyZWcgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2R1bXBfY2NyZWcgKHJlZywgdmFsKQorICAgICBjaGFyICpyZWc7CisgICAgIGludCB2YWw7Cit7CisgIC8qIHBhZ2UgNDEgKi8KKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlczolcywlcywlcywlcyIsIHJlZywKKwkgIHZhbCAmIDggPyAiTiIgOiAiTk4iLAorCSAgdmFsICYgNCA/ICJaIiA6ICJOWiIsCisJICB2YWwgJiAyID8gIk8iIDogIk5PIiwKKwkgIHZhbCAmIDEgPyAiQyIgOiAiTkMiCisgICk7Cit9CisKK3N0YXRpYyBjaGFyICoKK2RlY29kZV9hc2kgKHZhbCkKKyAgICAgaW50IHZhbDsKK3sKKyAgLyogcGFnZSA3MiAqLworICBzd2l0Y2ggKHZhbCkKKyAgICB7CisgICAgY2FzZSA0IDogcmV0dXJuICJBU0lfTlVDTEVVUyI7CisgICAgY2FzZSAweDBjIDogcmV0dXJuICJBU0lfTlVDTEVVU19MSVRUTEUiOworICAgIGNhc2UgMHgxMCA6IHJldHVybiAiQVNJX0FTX0lGX1VTRVJfUFJJTUFSWSI7CisgICAgY2FzZSAweDExIDogcmV0dXJuICJBU0lfQVNfSUZfVVNFUl9TRUNPTkRBUlkiOworICAgIGNhc2UgMHgxOCA6IHJldHVybiAiQVNJX0FTX0lGX1VTRVJfUFJJTUFSWV9MSVRUTEUiOworICAgIGNhc2UgMHgxOSA6IHJldHVybiAiQVNJX0FTX0lGX1VTRVJfU0VDT05EQVJZX0xJVFRMRSI7CisgICAgY2FzZSAweDgwIDogcmV0dXJuICJBU0lfUFJJTUFSWSI7CisgICAgY2FzZSAweDgxIDogcmV0dXJuICJBU0lfU0VDT05EQVJZIjsKKyAgICBjYXNlIDB4ODIgOiByZXR1cm4gIkFTSV9QUklNQVJZX05PRkFVTFQiOworICAgIGNhc2UgMHg4MyA6IHJldHVybiAiQVNJX1NFQ09OREFSWV9OT0ZBVUxUIjsKKyAgICBjYXNlIDB4ODggOiByZXR1cm4gIkFTSV9QUklNQVJZX0xJVFRMRSI7CisgICAgY2FzZSAweDg5IDogcmV0dXJuICJBU0lfU0VDT05EQVJZX0xJVFRMRSI7CisgICAgY2FzZSAweDhhIDogcmV0dXJuICJBU0lfUFJJTUFSWV9OT0ZBVUxUX0xJVFRMRSI7CisgICAgY2FzZSAweDhiIDogcmV0dXJuICJBU0lfU0VDT05EQVJZX05PRkFVTFRfTElUVExFIjsKKyAgICBkZWZhdWx0IDogcmV0dXJuIE5VTEw7CisgICAgfQorfQorCisvKiBQUklOVF9SRUdJU1RFUl9IT09LIHJvdXRpbmUuCisgICBQcmV0dHkgcHJpbnQgdmFyaW91cyByZWdpc3RlcnMuICAqLworLyogRklYTUU6IFdvdWxkIGJlIG5pY2UgaWYgdGhpcyBkaWQgc29tZSBmYW5jeSB0aGluZ3MgZm9yIDMyIGJpdCBzcGFyYy4gICovCisKK3ZvaWQKK3NwYXJjX3ByaW50X3JlZ2lzdGVyX2hvb2sgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIFVMT05HRVNUIHZhbDsKKworICAvKiBIYW5kbGUgZG91YmxlL3F1YWQgdmVyc2lvbnMgb2YgbG93ZXIgMzIgZnAgcmVncy4gICovCisgIGlmIChyZWdubyA+PSBGUDBfUkVHTlVNICYmIHJlZ25vIDwgRlAwX1JFR05VTSArIDMyCisgICAgICAmJiAocmVnbm8gJiAxKSA9PSAwKQorICAgIHsKKyAgICAgIGNoYXIgdmFsdWVbMTZdOworCisgICAgICBpZiAoIXJlYWRfcmVsYXRpdmVfcmVnaXN0ZXJfcmF3X2J5dGVzIChyZWdubywgdmFsdWUpCisJICAmJiAhcmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMgKHJlZ25vICsgMSwgdmFsdWUgKyA0KSkKKwl7CisJICBwcmludGZfdW5maWx0ZXJlZCAoIlx0Iik7CisJICBwcmludF9mbG9hdGluZyAodmFsdWUsIGJ1aWx0aW5fdHlwZV9kb3VibGUsIGdkYl9zdGRvdXQpOworCX0KKyNpZiAwIC8qIEZJWE1FOiBnZGIgZG9lc24ndCBoYW5kbGUgbG9uZyBkb3VibGVzICovCisgICAgICBpZiAoKHJlZ25vICYgMykgPT0gMCkKKwl7CisJICBpZiAoIXJlYWRfcmVsYXRpdmVfcmVnaXN0ZXJfcmF3X2J5dGVzIChyZWdubyArIDIsIHZhbHVlICsgOCkKKwkgICAgICAmJiAhcmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMgKHJlZ25vICsgMywgdmFsdWUgKyAxMikpCisJICAgIHsKKwkgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIlx0Iik7CisJICAgICAgcHJpbnRfZmxvYXRpbmcgKHZhbHVlLCBidWlsdGluX3R5cGVfbG9uZ19kb3VibGUsIGdkYl9zdGRvdXQpOworCSAgICB9CisJfQorI2VuZGlmCisgICAgICByZXR1cm47CisgICAgfQorCisjaWYgMCAvKiBGSVhNRTogZ2RiIGRvZXNuJ3QgaGFuZGxlIGxvbmcgZG91YmxlcyAqLworICAvKiBQcmludCB1cHBlciBmcCByZWdzIGFzIGxvbmcgZG91YmxlIGlmIGFwcHJvcHJpYXRlLiAgKi8KKyAgaWYgKHJlZ25vID49IEZQMF9SRUdOVU0gKyAzMiAmJiByZWdubyA8IEZQX01BWF9SRUdOVU0KKyAgICAgIC8qIFdlIHRlc3QgZm9yIGV2ZW4gbnVtYmVyZWQgcmVncyBhbmQgbm90IGEgbXVsdGlwbGUgb2YgNCBiZWNhdXNlCisJIHRoZSB1cHBlciBmcCByZWdzIGFyZSByZWNvcmRlZCBhcyBkb3VibGVzLiAgKi8KKyAgICAgICYmIChyZWdubyAmIDEpID09IDApCisgICAgeworICAgICAgY2hhciB2YWx1ZVsxNl07CisKKyAgICAgIGlmICghcmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMgKHJlZ25vLCB2YWx1ZSkKKwkgICYmICFyZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyAocmVnbm8gKyAxLCB2YWx1ZSArIDgpKQorCXsKKwkgIHByaW50Zl91bmZpbHRlcmVkICgiXHQiKTsKKwkgIHByaW50X2Zsb2F0aW5nICh2YWx1ZSwgYnVpbHRpbl90eXBlX2xvbmdfZG91YmxlLCBnZGJfc3Rkb3V0KTsKKwl9CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgLyogRklYTUU6IFNvbWUgb2YgdGhlc2UgYXJlIHByaXZpbGVkZ2VkIHJlZ2lzdGVycy4KKyAgICAgTm90IHN1cmUgaG93IHRoZXkgc2hvdWxkIGJlIGhhbmRsZWQuICAqLworCisjZGVmaW5lIEJJVFMobiwgbWFzaykgKChpbnQpICgoKHZhbCkgPj4gKG4pKSAmIChtYXNrKSkpCisKKyAgdmFsID0gcmVhZF9yZWdpc3RlciAocmVnbm8pOworCisgIC8qIHBhZ2VzIDQwIC0gNjAgKi8KKyAgc3dpdGNoIChyZWdubykKKyAgICB7CisjaWZkZWYgR0RCX1RBUkdFVF9JU19TUEFSQzY0CisgICAgY2FzZSBDQ1JfUkVHTlVNIDoKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkKCJcdCIpOworICAgICAgZHVtcF9jY3JlZyAoInhjYyIsIHZhbCA+PiA0KTsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkKCIsICIpOworICAgICAgZHVtcF9jY3JlZyAoImljYyIsIHZhbCAmIDE1KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBSU19SRUdOVU0gOgorICAgICAgcHJpbnRmICgiXHRmZWY6JWQsIGR1OiVkLCBkbDolZCIsCisJICAgICAgQklUUyAoMiwgMSksIEJJVFMgKDEsIDEpLCBCSVRTICgwLCAxKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZTUl9SRUdOVU0gOgorICAgICAgeworCXN0YXRpYyBjaGFyICpmY2NbNF0gPSB7ICI9IiwgIjwiLCAiPiIsICI/IiB9OworCXN0YXRpYyBjaGFyICpyZFs0XSA9IHsgIk4iLCAiMCIsICIrIiwgIi0iIH07CisJLyogTG9uZywgeWVzLCBidXQgSSdkIHJhdGhlciBsZWF2ZSBpdCBhcyBpcyBhbmQgdXNlIGEgd2lkZSBzY3JlZW4uICAqLworCXByaW50ZiAoIlx0MDolcywgMTolcywgMjolcywgMzolcywgcmQ6JXMsIHRlbTolZCwgbnM6JWQsIHZlcjolZCwgZnR0OiVkLCBxbmU6JWQsIGFleGM6JWQsIGNleGM6JWQiLAorCQlmY2NbQklUUyAoMTAsIDMpXSwgZmNjW0JJVFMgKDMyLCAzKV0sCisJCWZjY1tCSVRTICgzNCwgMyldLCBmY2NbQklUUyAoMzYsIDMpXSwKKwkJcmRbQklUUyAoMzAsIDMpXSwgQklUUyAoMjMsIDMxKSwgQklUUyAoMjIsIDEpLCBCSVRTICgxNywgNyksCisJCUJJVFMgKDE0LCA3KSwgQklUUyAoMTMsIDEpLCBCSVRTICg1LCAzMSksIEJJVFMgKDAsIDMxKSk7CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBBU0lfUkVHTlVNIDoKKyAgICAgIHsKKwljaGFyICphc2kgPSBkZWNvZGVfYXNpICh2YWwpOworCWlmIChhc2kgIT0gTlVMTCkKKwkgIHByaW50ZiAoIlx0JXMiLCBhc2kpOworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgVkVSX1JFR05VTSA6CisgICAgICBwcmludGYgKCJcdG1hbnVmOiVkLCBpbXBsOiVkLCBtYXNrOiVkLCBtYXh0bDolZCwgbWF4d2luOiVkIiwKKwkgICAgICBCSVRTICg0OCwgMHhmZmZmKSwgQklUUyAoMzIsIDB4ZmZmZiksCisJICAgICAgQklUUyAoMjQsIDB4ZmYpLCBCSVRTICg4LCAweGZmKSwgQklUUyAoMCwgMzEpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNUQVRFX1JFR05VTSA6CisgICAgICB7CisJc3RhdGljIGNoYXIgKm1tWzRdID0geyAidHNvIiwgInBzbyIsICJyc28iLCAiPyIgfTsKKwlwcmludGYgKCJcdGNsZTolZCwgdGxlOiVkLCBtbTolcywgcmVkOiVkLCBwZWY6JWQsIGFtOiVkLCBwcml2OiVkLCBpZTolZCwgYWc6JWQiLAorCQlCSVRTICg5LCAxKSwgQklUUyAoOCwgMSksIG1tW0JJVFMgKDYsIDMpXSwgQklUUyAoNSwgMSksCisJCUJJVFMgKDQsIDEpLCBCSVRTICgzLCAxKSwgQklUUyAoMiwgMSksIEJJVFMgKDEsIDEpLAorCQlCSVRTICgwLCAxKSk7CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBUU1RBVEVfUkVHTlVNIDoKKyAgICAgIC8qIEZJWE1FOiBwcmludCBhbGwgND8gKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFRfUkVHTlVNIDoKKyAgICAgIC8qIEZJWE1FOiBwcmludCBhbGwgND8gKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFBDX1JFR05VTSA6CisgICAgICAvKiBGSVhNRTogcHJpbnQgYWxsIDQ/ICovCisgICAgICBicmVhazsKKyAgICBjYXNlIFROUENfUkVHTlVNIDoKKyAgICAgIC8qIEZJWE1FOiBwcmludCBhbGwgND8gKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgV1NUQVRFX1JFR05VTSA6CisgICAgICBwcmludGYgKCJcdG90aGVyOiVkLCBub3JtYWw6JWQiLCBCSVRTICgzLCA3KSwgQklUUyAoMCwgNykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDV1BfUkVHTlVNIDoKKyAgICAgIHByaW50ZiAoIlx0JWQiLCBCSVRTICgwLCAzMSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU5TQVZFX1JFR05VTSA6CisgICAgICBwcmludGYgKCJcdCUtMmQgYmVmb3JlIHNwaWxsIiwgQklUUyAoMCwgMzEpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FOUkVTVE9SRV9SRUdOVU0gOgorICAgICAgcHJpbnRmICgiXHQlLTJkIGJlZm9yZSBmaWxsIiwgQklUUyAoMCwgMzEpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0xFQU5XSU5fUkVHTlVNIDoKKyAgICAgIHByaW50ZiAoIlx0JS0yZCBiZWZvcmUgY2xlYW4iLCBCSVRTICgwLCAzMSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPVEhFUldJTl9SRUdOVU0gOgorICAgICAgcHJpbnRmICgiXHQlZCIsIEJJVFMgKDAsIDMxKSk7CisgICAgICBicmVhazsKKyNlbHNlCisgICAgY2FzZSBQU19SRUdOVU06CisgICAgICBwcmludGYgKCJcdGljYzolYyVjJWMlYywgcGlsOiVkLCBzOiVkLCBwczolZCwgZXQ6JWQsIGN3cDolZCIsCisJICAgICAgQklUUyAoMjMsIDEpID8gJ04nIDogJy0nLCBCSVRTICgyMiwgMSkgPyAnWicgOiAnLScsCisJICAgICAgQklUUyAoMjEsIDEpID8gJ1YnIDogJy0nLCBCSVRTICgyMCwgMSkgPyAnQycgOiAnLScsCisJICAgICAgQklUUyAoOCwgMTUpLCBCSVRTICg3LCAxKSwgQklUUyAoNiwgMSksIEJJVFMgKDUsIDEpLAorCSAgICAgIEJJVFMgKDAsIDMxKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQU19SRUdOVU06CisgICAgICB7CisJc3RhdGljIGNoYXIgKmZjY1s0XSA9IHsgIj0iLCAiPCIsICI+IiwgIj8iIH07CisJc3RhdGljIGNoYXIgKnJkWzRdID0geyAiTiIsICIwIiwgIisiLCAiLSIgfTsKKwkvKiBMb25nLCB5ZXMsIGJ1dCBJJ2QgcmF0aGVyIGxlYXZlIGl0IGFzIGlzIGFuZCB1c2UgYSB3aWRlIHNjcmVlbi4gICovCisJcHJpbnRmICgiXHRyZDolcywgdGVtOiVkLCBuczolZCwgdmVyOiVkLCBmdHQ6JWQsIHFuZTolZCwgIgorCQkiZmNjOiVzLCBhZXhjOiVkLCBjZXhjOiVkIiwKKwkJcmRbQklUUyAoMzAsIDMpXSwgQklUUyAoMjMsIDMxKSwgQklUUyAoMjIsIDEpLCBCSVRTICgxNywgNyksCisJCUJJVFMgKDE0LCA3KSwgQklUUyAoMTMsIDEpLCBmY2NbQklUUyAoMTAsIDMpXSwgQklUUyAoNSwgMzEpLAorCQlCSVRTICgwLCAzMSkpOworCWJyZWFrOworICAgICAgfQorCisjZW5kaWYJLyogR0RCX1RBUkdFVF9JU19TUEFSQzY0ICovCisgICAgfQorCisjdW5kZWYgQklUUworfQorDAoraW50CitnZGJfcHJpbnRfaW5zbl9zcGFyYyAobWVtYWRkciwgaW5mbykKKyAgICAgYmZkX3ZtYSBtZW1hZGRyOworICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICAvKiBJdCdzIG5lY2Vzc2FyeSB0byBvdmVycmlkZSBtYWNoIGFnYWluIGJlY2F1c2UgcHJpbnRfaW5zbiBtZXNzZXMgaXQgdXAuICovCisgIGluZm8tPm1hY2ggPSBUTV9QUklOVF9JTlNOX01BQ0g7CisgIHJldHVybiBwcmludF9pbnNuX3NwYXJjIChtZW1hZGRyLCBpbmZvKTsKK30KKwwKKy8qIFRoZSBTUEFSQyBwYXNzZXMgdGhlIGFyZ3VtZW50cyBvbiB0aGUgc3RhY2s7IGFyZ3VtZW50cyBzbWFsbGVyCisgICB0aGFuIGFuIGludCBhcmUgcHJvbW90ZWQgdG8gYW4gaW50LiAgKi8KKworQ09SRV9BRERSCitzcGFyY19wdXNoX2FyZ3VtZW50cyAobmFyZ3MsIGFyZ3MsIHNwLCBzdHJ1Y3RfcmV0dXJuLCBzdHJ1Y3RfYWRkcikKKyAgICAgaW50IG5hcmdzOworICAgICB2YWx1ZV9wdHIgKmFyZ3M7CisgICAgIENPUkVfQUREUiBzcDsKKyAgICAgaW50IHN0cnVjdF9yZXR1cm47CisgICAgIENPUkVfQUREUiBzdHJ1Y3RfYWRkcjsKK3sKKyAgaW50IGk7CisgIGludCBhY2N1bXVsYXRlX3NpemUgPSAwOworICBzdHJ1Y3Qgc3BhcmNfYXJnCisgICAgeworICAgICAgY2hhciAqY29udGVudHM7CisgICAgICBpbnQgbGVuOworICAgICAgaW50IG9mZnNldDsKKyAgICB9OworICBzdHJ1Y3Qgc3BhcmNfYXJnICpzcGFyY19hcmdzID0KKyAgICAgIChzdHJ1Y3Qgc3BhcmNfYXJnKilhbGxvY2EgKG5hcmdzICogc2l6ZW9mIChzdHJ1Y3Qgc3BhcmNfYXJnKSk7CisgIHN0cnVjdCBzcGFyY19hcmcgKm1fYXJnOworCisgIC8qIFByb21vdGUgYXJndW1lbnRzIGlmIG5lY2Vzc2FyeSwgYW5kIGNhbGN1bGF0ZSB0aGVpciBzdGFjayBvZmZzZXRzCisgICAgIGFuZCBzaXplcy4gKi8KKyAgZm9yIChpID0gMCwgbV9hcmcgPSBzcGFyY19hcmdzOyBpIDwgbmFyZ3M7IGkrKywgbV9hcmcrKykKKyAgICB7CisgICAgICB2YWx1ZV9wdHIgYXJnID0gYXJnc1tpXTsKKyAgICAgIHN0cnVjdCB0eXBlICphcmdfdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZykpOworICAgICAgLyogQ2FzdCBhcmd1bWVudCB0byBsb25nIGlmIG5lY2Vzc2FyeSBhcyB0aGUgY29tcGlsZXIgZG9lcyBpdCB0b28uICAqLworICAgICAgc3dpdGNoIChUWVBFX0NPREUgKGFyZ190eXBlKSkKKwl7CisJY2FzZSBUWVBFX0NPREVfSU5UOgorCWNhc2UgVFlQRV9DT0RFX0JPT0w6CisJY2FzZSBUWVBFX0NPREVfQ0hBUjoKKwljYXNlIFRZUEVfQ09ERV9SQU5HRToKKwljYXNlIFRZUEVfQ09ERV9FTlVNOgorCSAgaWYgKFRZUEVfTEVOR1RIIChhcmdfdHlwZSkgPCBUWVBFX0xFTkdUSCAoYnVpbHRpbl90eXBlX2xvbmcpKQorCSAgICB7CisJICAgICAgYXJnX3R5cGUgPSBidWlsdGluX3R5cGVfbG9uZzsKKwkgICAgICBhcmcgPSB2YWx1ZV9jYXN0IChhcmdfdHlwZSwgYXJnKTsKKwkgICAgfQorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGJyZWFrOworCX0KKyAgICAgIG1fYXJnLT5sZW4gPSBUWVBFX0xFTkdUSCAoYXJnX3R5cGUpOworICAgICAgbV9hcmctPm9mZnNldCA9IGFjY3VtdWxhdGVfc2l6ZTsKKyAgICAgIGFjY3VtdWxhdGVfc2l6ZSA9IChhY2N1bXVsYXRlX3NpemUgKyBtX2FyZy0+bGVuICsgMykgJiB+MzsKKyAgICAgIG1fYXJnLT5jb250ZW50cyA9IFZBTFVFX0NPTlRFTlRTKGFyZyk7CisgICAgfQorCisgIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIGFyZ3VtZW50cyBvbiB0aGUgc3RhY2suICAqLworICBhY2N1bXVsYXRlX3NpemUgKz0gQ0FMTF9EVU1NWV9TVEFDS19BREpVU1Q7CisgIHNwID0gKChzcCAtIGFjY3VtdWxhdGVfc2l6ZSkgJiB+NykgKyBDQUxMX0RVTU1ZX1NUQUNLX0FESlVTVDsKKworICAvKiBgUHVzaCcgYXJndW1lbnRzIG9uIHRoZSBzdGFjay4gICovCisgIGZvciAoaSA9IG5hcmdzOyBtX2FyZy0tLCAtLWkgPj0gMDsgKQorICAgIHdyaXRlX21lbW9yeShzcCArIG1fYXJnLT5vZmZzZXQsIG1fYXJnLT5jb250ZW50cywgbV9hcmctPmxlbik7CisKKyAgcmV0dXJuIHNwOworfQorCisKKy8qIEV4dHJhY3QgZnJvbSBhbiBhcnJheSBSRUdCVUYgY29udGFpbmluZyB0aGUgKHJhdykgcmVnaXN0ZXIgc3RhdGUKKyAgIGEgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIG9mIHR5cGUgVFlQRSwgYW5kIGNvcHkgdGhhdCwgaW4gdmlydHVhbCBmb3JtYXQsCisgICBpbnRvIFZBTEJVRi4gICovCisKK3ZvaWQKK3NwYXJjX2V4dHJhY3RfcmV0dXJuX3ZhbHVlICh0eXBlLCByZWdidWYsIHZhbGJ1ZikKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGNoYXIgKnJlZ2J1ZjsKKyAgICAgY2hhciAqdmFsYnVmOworeworICBpbnQgdHlwZWxlbiA9IFRZUEVfTEVOR1RIICh0eXBlKTsKKyAgaW50IHJlZ3NpemUgPSBSRUdJU1RFUl9SQVdfU0laRSAoTzBfUkVHTlVNKTsKKworICBpZiAoVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfRkxUICYmIFNQQVJDX0hBU19GUFUpCisgICAgbWVtY3B5ICh2YWxidWYsICZyZWdidWYgW1JFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pXSwgdHlwZWxlbik7CisgIGVsc2UKKyAgICBtZW1jcHkgKHZhbGJ1ZiwKKwkgICAgJnJlZ2J1ZiBbTzBfUkVHTlVNICogcmVnc2l6ZSArCisJCSAgICAgKHR5cGVsZW4gPj0gcmVnc2l6ZQorCQkgICAgICB8fCBUQVJHRVRfQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOID8gMAorCQkJIDogcmVnc2l6ZSAtIHR5cGVsZW4pXSwKKwkgICAgdHlwZWxlbik7Cit9CisKKworLyogV3JpdGUgaW50byBhcHByb3ByaWF0ZSByZWdpc3RlcnMgYSBmdW5jdGlvbiByZXR1cm4gdmFsdWUKKyAgIG9mIHR5cGUgVFlQRSwgZ2l2ZW4gaW4gdmlydHVhbCBmb3JtYXQuICBPbiBTUEFSQ3Mgd2l0aCBGUFVzLAorICAgZmxvYXQgdmFsdWVzIGFyZSByZXR1cm5lZCBpbiAlZjAgKGFuZCAlZjEpLiAgSW4gYWxsIG90aGVyIGNhc2VzLAorICAgdmFsdWVzIGFyZSByZXR1cm5lZCBpbiByZWdpc3RlciAlbzAuICAqLworCit2b2lkCitzcGFyY19zdG9yZV9yZXR1cm5fdmFsdWUgKHR5cGUsIHZhbGJ1ZikKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGNoYXIgKnZhbGJ1ZjsKK3sKKyAgaW50IHJlZ25vOworICBjaGFyIGJ1ZmZlcltNQVhfUkVHSVNURVJfUkFXX1NJWkVdOworCisgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9GTFQgJiYgU1BBUkNfSEFTX0ZQVSkKKyAgICAvKiBGbG9hdGluZy1wb2ludCB2YWx1ZXMgYXJlIHJldHVybmVkIGluIHRoZSByZWdpc3RlciBwYWlyICovCisgICAgLyogZm9ybWVkIGJ5ICVmMCBhbmQgJWYxIChkb3VibGVzIGFyZSwgYW55d2F5KS4gICovCisgICAgcmVnbm8gPSBGUDBfUkVHTlVNOworICBlbHNlCisgICAgLyogT3RoZXIgdmFsdWVzIGFyZSByZXR1cm5lZCBpbiByZWdpc3RlciAlbzAuICAqLworICAgIHJlZ25vID0gTzBfUkVHTlVNOworCisgIC8qIEFkZCBsZWFkaW5nIHplcm9zIHRvIHRoZSB2YWx1ZS4gKi8KKyAgaWYgKFRZUEVfTEVOR1RIICh0eXBlKSA8IFJFR0lTVEVSX1JBV19TSVpFKHJlZ25vKSkKKyAgICB7CisgICAgICBiemVybyAoYnVmZmVyLCBSRUdJU1RFUl9SQVdfU0laRShyZWdubykpOworICAgICAgbWVtY3B5IChidWZmZXIgKyBSRUdJU1RFUl9SQVdfU0laRShyZWdubykgLSBUWVBFX0xFTkdUSCAodHlwZSksIHZhbGJ1ZiwKKwkgICAgICBUWVBFX0xFTkdUSCAodHlwZSkpOworICAgICAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKFJFR0lTVEVSX0JZVEUgKHJlZ25vKSwgYnVmZmVyLCAKKwkJCSAgICBSRUdJU1RFUl9SQVdfU0laRShyZWdubykpOworICAgIH0KKyAgZWxzZQorICAgIHdyaXRlX3JlZ2lzdGVyX2J5dGVzIChSRUdJU1RFUl9CWVRFIChyZWdubyksIHZhbGJ1ZiwgVFlQRV9MRU5HVEggKHR5cGUpKTsKK30KKworCisvKiBJbnNlcnQgdGhlIGZ1bmN0aW9uIGFkZHJlc3MgaW50byBhIGNhbGwgZHVtbXkgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UKKyAgIHN0b3JlZCBhdCBEVU1NWS4KKworICAgRm9yIHN0cnVjdHMgYW5kIHVuaW9ucywgaWYgdGhlIGZ1bmN0aW9uIHdhcyBjb21waWxlZCB3aXRoIFN1biBjYywKKyAgIGl0IGV4cGVjdHMgJ3VuaW1wJyBhZnRlciB0aGUgY2FsbC4gIEJ1dCBnY2MgZG9lc24ndCB1c2UgdGhhdAorICAgKHR3aXN0ZWQpIGNvbnZlbnRpb24uICBTbyBsZWF2ZSBhIG5vcCB0aGVyZSBmb3IgZ2NjIChGSVhfQ0FMTF9EVU1NWQorICAgY2FuIGFzc3VtZSBpdCBpcyBvcGVyYXRpbmcgb24gYSBwcmlzdGluZSBDQUxMX0RVTU1ZLCBub3Qgb25lIHRoYXQKKyAgIGhhcyBhbHJlYWR5IGJlZW4gY3VzdG9taXplZCBmb3IgYSBkaWZmZXJlbnQgZnVuY3Rpb24pLiAgKi8KKwordm9pZAorc3BhcmNfZml4X2NhbGxfZHVtbXkgKGR1bW15LCBwYywgZnVuLCB2YWx1ZV90eXBlLCB1c2luZ19nY2MpCisgICAgIGNoYXIgKmR1bW15OworICAgICBDT1JFX0FERFIgcGM7CisgICAgIENPUkVfQUREUiBmdW47CisgICAgIHN0cnVjdCB0eXBlICp2YWx1ZV90eXBlOworICAgICBpbnQgdXNpbmdfZ2NjOworeworICBpbnQgaTsKKworICAvKiBTdG9yZSB0aGUgcmVsYXRpdmUgYWRkZHJlc3Mgb2YgdGhlIHRhcmdldCBmdW5jdGlvbiBpbnRvIHRoZQorICAgICAnY2FsbCcgaW5zdHJ1Y3Rpb24uICovCisgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKGR1bW15ICsgQ0FMTF9EVU1NWV9DQUxMX09GRlNFVCwgNCwKKwkJCSAgKDB4NDAwMDAwMDAKKwkJCSAgIHwgKCgoZnVuIC0gKHBjICsgQ0FMTF9EVU1NWV9DQUxMX09GRlNFVCkpID4+IDIpCisJCQkgICAgICAgJiAweDNmZmZmZmZmKSkpOworCisgIC8qIENvbXBseSB3aXRoIHN0cmFuZ2UgU3VuIGNjIGNhbGxpbmcgY29udmVudGlvbiBmb3Igc3RydWN0LXJldHVybmluZworICAgICBmdW5jdGlvbnMuICAqLworICBpZiAoIXVzaW5nX2djYworICAgICAgJiYgKFRZUEVfQ09ERSAodmFsdWVfdHlwZSkgPT0gVFlQRV9DT0RFX1NUUlVDVAorCSAgfHwgVFlQRV9DT0RFICh2YWx1ZV90eXBlKSA9PSBUWVBFX0NPREVfVU5JT04pKQorICAgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKGR1bW15ICsgQ0FMTF9EVU1NWV9DQUxMX09GRlNFVCArIDgsIDQsCisJCQkgICAgVFlQRV9MRU5HVEggKHZhbHVlX3R5cGUpICYgMHgxZmZmKTsKKworI2lmbmRlZiBHREJfVEFSR0VUX0lTX1NQQVJDNjQKKyAgLyogSWYgdGhpcyBpcyBub3QgYSBzaW11bGF0b3IgdGFyZ2V0LCBjaGFuZ2UgdGhlIGZpcnN0IGZvdXIgaW5zdHJ1Y3Rpb25zCisgICAgIG9mIHRoZSBjYWxsIGR1bW15IHRvIE5PUHMuICBUaG9zZSBpbnN0cnVjdGlvbnMgaW5jbHVkZSBhICdzYXZlJworICAgICBpbnN0cnVjdGlvbiBhbmQgYXJlIGRlc2lnbmVkIHRvIHdvcmsgYXJvdW5kIHByb2JsZW1zIHdpdGggcmVnaXN0ZXIKKyAgICAgd2luZG93IGZsdXNoaW5nIGluIHRoZSBzaW11bGF0b3IuICovCisgIGlmIChzdHJjbXAgKHRhcmdldF9zaG9ydG5hbWUsICJzaW0iKSAhPSAwKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoZHVtbXkgKyAoaSAqIDQpLCA0LCAweDAxMDAwMDAwKTsKKyAgICB9CisjZW5kaWYKKworICAvKiBJZiB0aGlzIGlzIGEgYmktZW5kaWFuIHRhcmdldCwgR0RCIGhhcyB3cml0dGVuIHRoZSBjYWxsIGR1bW15CisgICAgIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuICBXZSBtdXN0IGJ5dGUtc3dhcCBpdCBiYWNrIHRvIGJpZy1lbmRpYW4uICovCisgIGlmIChiaV9lbmRpYW4pCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IENBTExfRFVNTVlfTEVOR1RIOyBpICs9IDQpCisJeworCSAgY2hhciB0bXAgPSBkdW1teSBbaV07CisJICBkdW1teSBbaV0gPSBkdW1teSBbaSszXTsKKwkgIGR1bW15IFtpKzNdID0gdG1wOworCSAgdG1wID0gZHVtbXkgW2krMV07CisJICBkdW1teSBbaSsxXSA9IGR1bW15IFtpKzJdOworCSAgZHVtbXkgW2krMl0gPSB0bXA7CisJfQorICAgIH0KK30KKworCisvKiBTZXQgdGFyZ2V0IGJ5dGUgb3JkZXIgYmFzZWQgb24gbWFjaGluZSB0eXBlLiAqLworCitzdGF0aWMgaW50CitzcGFyY190YXJnZXRfYXJjaGl0ZWN0dXJlX2hvb2sgKGFwKQorICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFwOworeworICBpbnQgaSwgajsKKworICBpZiAoYXAtPm1hY2ggPT0gYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlKQorICAgIHsKKyAgICAgIGlmIChUQVJHRVRfQllURV9PUkRFUl9TRUxFQ1RBQkxFX1ApCisJeworCSAgdGFyZ2V0X2J5dGVfb3JkZXIgPSBMSVRUTEVfRU5ESUFOOworCSAgYmlfZW5kaWFuID0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgd2FybmluZyAoIlRoaXMgR0RCIGRvZXMgbm90IHN1cHBvcnQgbGl0dGxlIGVuZGlhbiBzcGFyY2xpdGUuIik7CisJfQorICAgIH0KKyAgZWxzZQorICAgIGJpX2VuZGlhbiA9IDA7CisgIHJldHVybiAxOworfQorCisMCit2b2lkCitfaW5pdGlhbGl6ZV9zcGFyY190ZGVwICgpCit7CisgIHRtX3ByaW50X2luc24gPSBnZGJfcHJpbnRfaW5zbl9zcGFyYzsKKyAgdG1fcHJpbnRfaW5zbl9pbmZvLm1hY2ggPSBUTV9QUklOVF9JTlNOX01BQ0g7ICAvKiBTZWxlY3RzIHNwYXJjL3NwYXJjbGl0ZSAqLworICB0YXJnZXRfYXJjaGl0ZWN0dXJlX2hvb2sgPSBzcGFyY190YXJnZXRfYXJjaGl0ZWN0dXJlX2hvb2s7Cit9CisKKworI2lmZGVmIEdEQl9UQVJHRVRfSVNfU1BBUkM2NAorCisvKiBDb21wZW5zYXRlIGZvciBzdGFjayBiaWFzLiBOb3RlIHRoYXQgd2UgY3VycmVudGx5IGRvbid0IGhhbmRsZSBtaXhlZAorICAgMzIvNjQgYml0IGNvZGUuICovCitDT1JFX0FERFIKK3NwYXJjNjRfcmVhZF9zcCAoKQoreworICBDT1JFX0FERFIgc3AgPSByZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pOworCisgIGlmIChzcCAmIDEpCisgICAgc3AgKz0gMjA0NzsKKyAgcmV0dXJuIHNwOworfQorCitDT1JFX0FERFIKK3NwYXJjNjRfcmVhZF9mcCAoKQoreworICBDT1JFX0FERFIgZnAgPSByZWFkX3JlZ2lzdGVyIChGUF9SRUdOVU0pOworCisgIGlmIChmcCAmIDEpCisgICAgZnAgKz0gMjA0NzsKKyAgcmV0dXJuIGZwOworfQorCit2b2lkCitzcGFyYzY0X3dyaXRlX3NwICh2YWwpCisgICAgIENPUkVfQUREUiB2YWw7Cit7CisgIENPUkVfQUREUiBvbGRzcCA9IHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSk7CisgIGlmIChvbGRzcCAmIDEpCisgICAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgdmFsIC0gMjA0Nyk7CisgIGVsc2UKKyAgICB3cml0ZV9yZWdpc3RlciAoU1BfUkVHTlVNLCB2YWwpOworfQorCit2b2lkCitzcGFyYzY0X3dyaXRlX2ZwICh2YWwpCisgICAgIENPUkVfQUREUiB2YWw7Cit7CisgIENPUkVfQUREUiBvbGRmcCA9IHJlYWRfcmVnaXN0ZXIgKEZQX1JFR05VTSk7CisgIGlmIChvbGRmcCAmIDEpCisgICAgd3JpdGVfcmVnaXN0ZXIgKEZQX1JFR05VTSwgdmFsIC0gMjA0Nyk7CisgIGVsc2UKKyAgICB3cml0ZV9yZWdpc3RlciAoRlBfUkVHTlVNLCB2YWwpOworfQorCisvKiBUaGUgU1BBUkMgNjQgQUJJIHBhc3NlcyBmbG9hdGluZy1wb2ludCBhcmd1bWVudHMgaW4gRlAwLTMxLiBUaGV5IGFyZQorICAgYWxzbyBjb3BpZWQgb250byB0aGUgc3RhY2sgaW4gdGhlIGNvcnJlY3QgcGxhY2VzLiAqLworCitDT1JFX0FERFIKK3NwNjRfcHVzaF9hcmd1bWVudHMgKG5hcmdzLCBhcmdzLCBzcCwgc3RydWN0X3JldHVybiwgc3RydWN0X3JldGFkZHIpCisgICAgIGludCBuYXJnczsKKyAgICAgdmFsdWVfcHRyICphcmdzOworICAgICBDT1JFX0FERFIgc3A7CisgICAgIHVuc2lnbmVkIGNoYXIgc3RydWN0X3JldHVybjsKKyAgICAgQ09SRV9BRERSIHN0cnVjdF9yZXRhZGRyOworeworICBpbnQgeDsKKyAgaW50IHJlZ251bSA9IDA7CisgIENPUkVfQUREUiB0ZW1wc3A7CisgIAorICBzcCA9IChzcCAmIH4oKCh1bnNpZ25lZCBsb25nKVRZUEVfTEVOR1RIIChidWlsdGluX3R5cGVfbG9uZykpIC0gMVVMKSk7CisKKyAgLyogRmlndXJlIG91dCBob3cgbXVjaCBzcGFjZSB3ZSdsbCBuZWVkLiAqLworICBmb3IgKHggPSBuYXJncyAtIDE7IHggPj0gMDsgeC0tKQorICAgIHsKKyAgICAgIGludCBsZW4gPSBUWVBFX0xFTkdUSCAoY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnc1t4XSkpKTsKKyAgICAgIHZhbHVlX3B0ciBjb3B5YXJnID0gYXJnc1t4XTsKKyAgICAgIGludCBjb3B5bGVuID0gbGVuOworCisgICAgICAvKiBUaGlzIGNvZGUgaXMsIG9mIGNvdXJzZSwgbm8gbG9uZ2VyIGNvcnJlY3QuICovCisgICAgICBpZiAoY29weWxlbiA8IFRZUEVfTEVOR1RIIChidWlsdGluX3R5cGVfbG9uZykpCisJeworCSAgY29weWFyZyA9IHZhbHVlX2Nhc3QoYnVpbHRpbl90eXBlX2xvbmcsIGNvcHlhcmcpOworICAgICAgICAgIGNvcHlsZW4gPSBUWVBFX0xFTkdUSCAoYnVpbHRpbl90eXBlX2xvbmcpOworICAgICAgICB9CisgICAgICBzcCAtPSBjb3B5bGVuOworICAgIH0KKworICAvKiBSb3VuZCBkb3duLiAqLworICBzcCA9IHNwICYgfjc7CisgIHRlbXBzcCA9IHNwOworCisgIC8qIE5vdyB3cml0ZSB0aGUgYXJndW1lbnRzIG9udG8gdGhlIHN0YWNrLCB3aGlsZSB3cml0aW5nIEZQIGFyZ3VtZW50cworICAgICBpbnRvIHRoZSBGUCByZWdpc3RlcnMuICovCisgIGZvciAoeCA9IDA7IHggPCBuYXJnczsgeCsrKQorICAgIHsKKyAgICAgIGludCBsZW4gPSBUWVBFX0xFTkdUSCAoY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnc1t4XSkpKTsKKyAgICAgIHZhbHVlX3B0ciBjb3B5YXJnID0gYXJnc1t4XTsKKyAgICAgIGludCBjb3B5bGVuID0gbGVuOworCisgICAgICAvKiBUaGlzIGNvZGUgaXMsIG9mIGNvdXJzZSwgbm8gbG9uZ2VyIGNvcnJlY3QuICovCisgICAgICBpZiAoY29weWxlbiA8IFRZUEVfTEVOR1RIIChidWlsdGluX3R5cGVfbG9uZykpCisJeworCSAgY29weWFyZyA9IHZhbHVlX2Nhc3QoYnVpbHRpbl90eXBlX2xvbmcsIGNvcHlhcmcpOworICAgICAgICAgIGNvcHlsZW4gPSBUWVBFX0xFTkdUSCAoYnVpbHRpbl90eXBlX2xvbmcpOworICAgICAgICB9CisgICAgICB3cml0ZV9tZW1vcnkgKHRlbXBzcCwgVkFMVUVfQ09OVEVOVFMgKGNvcHlhcmcpLCBjb3B5bGVuKTsKKyAgICAgIHRlbXBzcCArPSBjb3B5bGVuOworICAgICAgaWYgKFRZUEVfQ09ERSAoVkFMVUVfVFlQRSAoYXJnc1t4XSkpID09IFRZUEVfQ09ERV9GTFQgJiYgcmVnbnVtIDwgMzIpCisJeworCSAgLyogVGhpcyBnZXRzIGNvcGllZCBpbnRvIGEgRlAgcmVnaXN0ZXIuICovCisJICBpbnQgbmV4dHJlZyA9IHJlZ251bSArIDI7CisJICBjaGFyICpkYXRhID0gVkFMVUVfQ09OVEVOVFMgKGFyZ3NbeF0pOworCSAgLyogRmxvYXRzIGdvIGludG8gdGhlIGxvd2VyIGhhbGYgb2YgYSBGUCByZWdpc3RlciBwYWlyOyBxdWFkcworCSAgICAgdXNlIDIgcGFpcnMuICovCisKKwkgIGlmIChsZW4gPT0gMTYpCisJICAgIG5leHRyZWcgKz0gMjsKKwkgIGVsc2UgaWYgKGxlbiA9PSA0KQorCSAgICByZWdudW0rKzsKKworCSAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKFJFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0gKyByZWdudW0pLAorCQkJCWRhdGEsCisJCQkJbGVuKTsKKwkgIHJlZ251bSA9IG5leHRyZWc7CisJfQorICAgIH0KKyAgcmV0dXJuIHNwOworfQorCisvKiBWYWx1ZXMgPD0gMzIgYnl0ZXMgYXJlIHJldHVybmVkIGluIG8wLW8zIChmbG9hdGluZy1wb2ludCB2YWx1ZXMgYXJlCisgICByZXR1cm5lZCBpbiBmMC1mMykuICovCit2b2lkCitzcGFyYzY0X2V4dHJhY3RfcmV0dXJuX3ZhbHVlICh0eXBlLCByZWdidWYsIHZhbGJ1ZiwgYml0b2Zmc2V0KQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgY2hhciAqcmVnYnVmOworICAgICBjaGFyICp2YWxidWY7CisgICAgIGludCBiaXRvZmZzZXQ7Cit7CisgIGludCB0eXBlbGVuID0gVFlQRV9MRU5HVEggKHR5cGUpOworICBpbnQgcmVnc2l6ZSA9IFJFR0lTVEVSX1JBV19TSVpFIChPMF9SRUdOVU0pOworCisgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9GTFQgJiYgU1BBUkNfSEFTX0ZQVSkKKyAgICB7CisgICAgICBtZW1jcHkgKHZhbGJ1ZiwgJnJlZ2J1ZiBbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLCB0eXBlbGVuKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKFRZUEVfQ09ERSAodHlwZSkgIT0gVFlQRV9DT0RFX1NUUlVDVAorICAgICAgfHwgKFRZUEVfTEVOR1RIICh0eXBlKSA+IDMyKSkKKyAgICB7CisgICAgICBtZW1jcHkgKHZhbGJ1ZiwKKwkgICAgICAmcmVnYnVmIFtPMF9SRUdOVU0gKiByZWdzaXplICsKKwkJICAgICAgKHR5cGVsZW4gPj0gcmVnc2l6ZSA/IDAgOiByZWdzaXplIC0gdHlwZWxlbildLAorCSAgICAgIHR5cGVsZW4pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgKm8wID0gJnJlZ2J1ZltPMF9SRUdOVU0gKiByZWdzaXplXTsKKyAgICAgIGNoYXIgKmYwID0gJnJlZ2J1ZltGUDBfUkVHTlVNICogcmVnc2l6ZV07CisgICAgICBpbnQgeDsKKworICAgICAgZm9yICh4ID0gMDsgeCA8IFRZUEVfTkZJRUxEUyAodHlwZSk7IHgrKykKKwl7CisJICBzdHJ1Y3QgZmllbGQgKmYgPSAmVFlQRV9GSUVMRFModHlwZSlbeF07CisJICAvKiBGSVhNRTogV2UgbWF5IG5lZWQgdG8gaGFuZGxlIHN0YXRpYyBmaWVsZHMgaGVyZS4gKi8KKwkgIGludCB3aGljaHJlZyA9IChmLT5sb2MuYml0cG9zICsgYml0b2Zmc2V0KSAvIDMyOworCSAgaW50IHJlbWFpbmRlciA9ICgoZi0+bG9jLmJpdHBvcyArIGJpdG9mZnNldCkgJSAzMikgLyA4OworCSAgaW50IHdoZXJlID0gKGYtPmxvYy5iaXRwb3MgKyBiaXRvZmZzZXQpIC8gODsKKwkgIGludCBzaXplID0gVFlQRV9MRU5HVEggKGYtPnR5cGUpOworCSAgaW50IHR5cGVjb2RlID0gVFlQRV9DT0RFIChmLT50eXBlKTsKKworCSAgaWYgKHR5cGVjb2RlID09IFRZUEVfQ09ERV9TVFJVQ1QpCisJICAgIHsKKwkgICAgICBzcGFyYzY0X2V4dHJhY3RfcmV0dXJuX3ZhbHVlIChmLT50eXBlLAorCQkJCQkgICAgcmVnYnVmLAorCQkJCQkgICAgdmFsYnVmLAorCQkJCQkgICAgYml0b2Zmc2V0ICsgZi0+bG9jLmJpdHBvcyk7CisJICAgIH0KKwkgIGVsc2UgaWYgKHR5cGVjb2RlID09IFRZUEVfQ09ERV9GTFQpCisJICAgIHsKKwkgICAgICBtZW1jcHkgKHZhbGJ1ZiArIHdoZXJlLCAmZjBbd2hpY2hyZWcgKiA0XSArIHJlbWFpbmRlciwgc2l6ZSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG1lbWNweSAodmFsYnVmICsgd2hlcmUsICZvMFt3aGljaHJlZyAqIDRdICsgcmVtYWluZGVyLCBzaXplKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2dkYi9zcGFyY2wtc3R1Yi5jIGIvZ2RiL3NwYXJjbC1zdHViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc5OTRmZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9zcGFyY2wtc3R1Yi5jCkBAIC0wLDAgKzEsMTAyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCQlUSElTIFNPRlRXQVJFIElTIE5PVCBDT1BZUklHSFRFRAorCisgICBIUCBvZmZlcnMgdGhlIGZvbGxvd2luZyBmb3IgdXNlIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgSFAgbWFrZXMgbm8KKyAgIHdhcnJhbnR5IHdpdGggcmVnYXJkIHRvIHRoZSBzb2Z0d2FyZSBvciBpdCdzIHBlcmZvcm1hbmNlIGFuZCB0aGUKKyAgIHVzZXIgYWNjZXB0cyB0aGUgc29mdHdhcmUgIkFTIElTIiB3aXRoIGFsbCBmYXVsdHMuCisKKyAgIEhQIERJU0NMQUlNUyBBTlkgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBXSVRIIFJFR0FSRAorICAgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEhlYWRlcjogcmVtY29tLmMsdiAxLjM0IDkxLzAzLzA5IDEyOjI5OjQ5IGdsZW5uZSBFeHAgJAorICoKKyAqICBNb2R1bGUgbmFtZTogcmVtY29tLmMgJAorICogIFJldmlzaW9uOiAxLjM0ICQKKyAqICBEYXRlOiA5MS8wMy8wOSAxMjoyOTo0OSAkCisgKiAgQ29udHJpYnV0b3I6ICAgICBMYWtlIFN0ZXZlbnMgSW5zdHJ1bWVudCBEaXZpc2lvbiQKKyAqCisgKiAgRGVzY3JpcHRpb246ICAgICBsb3cgbGV2ZWwgc3VwcG9ydCBmb3IgZ2RiIGRlYnVnZ2VyLiAkCisgKgorICogIENvbnNpZGVyYXRpb25zOiAgb25seSB3b3JrcyBvbiB0YXJnZXQgaGFyZHdhcmUgJAorICoKKyAqICBXcml0dGVuIGJ5OiAgICAgIEdsZW5uIEVuZ2VsICQKKyAqICBNb2R1bGVTdGF0ZTogICAgIEV4cGVyaW1lbnRhbCAkCisgKgorICogIE5PVEVTOiAgICAgICAgICAgU2VlIEJlbG93ICQKKyAqCisgKiAgTW9kaWZpZWQgZm9yIFNQQVJDIGJ5IFN0dSBHcm9zc21hbiwgQ3lnbnVzIFN1cHBvcnQuCisgKiAgQmFzZWQgb24gc3BhcmMtc3R1Yi5jLCBpdCdzIG1vZGlmaWVkIGZvciBTUEFSQ2xpdGUgRGVidWcgVW5pdCBoYXJkd2FyZQorICogIGJyZWFrcG9pbnQgc3VwcG9ydCB0byBjcmVhdGUgc3BhcmNsaXRlLXN0dWIuYywgYnkgS3VuZyBIc3UsIEN5Z251cyBTdXBwb3J0LgorICoKKyAqICBUaGlzIGNvZGUgaGFzIGJlZW4gZXh0ZW5zaXZlbHkgdGVzdGVkIG9uIHRoZSBGdWppdHN1IFNQQVJDbGl0ZSBkZW1vIGJvYXJkLgorICoKKyAqICBUbyBlbmFibGUgZGVidWdnZXIgc3VwcG9ydCwgdHdvIHRoaW5ncyBuZWVkIHRvIGhhcHBlbi4gIE9uZSwgYQorICogIGNhbGwgdG8gc2V0X2RlYnVnX3RyYXBzKCkgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGFsbG93IGFueSBicmVha3BvaW50cworICogIG9yIGVycm9yIGNvbmRpdGlvbnMgdG8gYmUgcHJvcGVybHkgaW50ZXJjZXB0ZWQgYW5kIHJlcG9ydGVkIHRvIGdkYi4KKyAqICBUd28sIGEgYnJlYWtwb2ludCBuZWVkcyB0byBiZSBnZW5lcmF0ZWQgdG8gYmVnaW4gY29tbXVuaWNhdGlvbi4gIFRoaXMKKyAqICBpcyBtb3N0IGVhc2lseSBhY2NvbXBsaXNoZWQgYnkgYSBjYWxsIHRvIGJyZWFrcG9pbnQoKS4gIEJyZWFrcG9pbnQoKQorICogIHNpbXVsYXRlcyBhIGJyZWFrcG9pbnQgYnkgZXhlY3V0aW5nIGEgdHJhcCAjMS4KKyAqCisgKioqKioqKioqKioqKgorICoKKyAqICAgIFRoZSBmb2xsb3dpbmcgZ2RiIGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQ6CisgKgorICogY29tbWFuZCAgICAgICAgICBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4gdmFsdWUKKyAqCisgKiAgICBnICAgICAgICAgICAgIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIENQVSByZWdpc3RlcnMgIGhleCBkYXRhIG9yIEVOTgorICogICAgRyAgICAgICAgICAgICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBDUFUgcmVnaXN0ZXJzICAgICBPSyBvciBFTk4KKyAqCisgKiAgICBtQUEuLkFBLExMTEwgIFJlYWQgTExMTCBieXRlcyBhdCBhZGRyZXNzIEFBLi5BQSAgICAgIGhleCBkYXRhIG9yIEVOTgorICogICAgTUFBLi5BQSxMTExMOiBXcml0ZSBMTExMIGJ5dGVzIGF0IGFkZHJlc3MgQUEuQUEgICAgICBPSyBvciBFTk4KKyAqCisgKiAgICBjICAgICAgICAgICAgIFJlc3VtZSBhdCBjdXJyZW50IGFkZHJlc3MgICAgICAgICAgICAgIFNOTiAgICggc2lnbmFsIE5OKQorICogICAgY0FBLi5BQSAgICAgICBDb250aW51ZSBhdCBhZGRyZXNzIEFBLi5BQSAgICAgICAgICAgICBTTk4KKyAqCisgKiAgICBzICAgICAgICAgICAgIFN0ZXAgb25lIGluc3RydWN0aW9uICAgICAgICAgICAgICAgICAgIFNOTgorICogICAgc0FBLi5BQSAgICAgICBTdGVwIG9uZSBpbnN0cnVjdGlvbiBmcm9tIEFBLi5BQSAgICAgICBTTk4KKyAqCisgKiAgICBrICAgICAgICAgICAgIGtpbGwKKyAqCisgKiAgICA/ICAgICAgICAgICAgIFdoYXQgd2FzIHRoZSBsYXN0IHNpZ3ZhbCA/ICAgICAgICAgICAgIFNOTiAgIChzaWduYWwgTk4pCisgKgorICogICAgYkJCLi5CQgkgICAgU2V0IGJhdWQgcmF0ZSB0byBCQi4uQkIJCSAgIE9LIG9yIEJOTiwgdGhlbiBzZXRzCisgKgkJCQkJCQkgICBiYXVkIHJhdGUKKyAqCisgKiBBbGwgY29tbWFuZHMgYW5kIHJlc3BvbnNlcyBhcmUgc2VudCB3aXRoIGEgcGFja2V0IHdoaWNoIGluY2x1ZGVzIGEKKyAqIGNoZWNrc3VtLiAgQSBwYWNrZXQgY29uc2lzdHMgb2YKKyAqCisgKiAkPHBhY2tldCBpbmZvPiM8Y2hlY2tzdW0+LgorICoKKyAqIHdoZXJlCisgKiA8cGFja2V0IGluZm8+IDo6IDxjaGFyYWN0ZXJzIHJlcHJlc2VudGluZyB0aGUgY29tbWFuZCBvciByZXNwb25zZT4KKyAqIDxjaGVja3N1bT4gICAgOjogPCB0d28gaGV4IGRpZ2l0cyBjb21wdXRlZCBhcyBtb2R1bG8gMjU2IHN1bSBvZiA8cGFja2V0aW5mbz4+CisgKgorICogV2hlbiBhIHBhY2tldCBpcyByZWNlaXZlZCwgaXQgaXMgZmlyc3QgYWNrbm93bGVkZ2VkIHdpdGggZWl0aGVyICcrJyBvciAnLScuCisgKiAnKycgaW5kaWNhdGVzIGEgc3VjY2Vzc2Z1bCB0cmFuc2Zlci4gICctJyBpbmRpY2F0ZXMgYSBmYWlsZWQgdHJhbnNmZXIuCisgKgorICogRXhhbXBsZToKKyAqCisgKiBIb3N0OiAgICAgICAgICAgICAgICAgIFJlcGx5OgorICogJG0wLDEwIzJhICAgICAgICAgICAgICAgKyQwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNSM0MgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3BhcmNsaXRlLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBleHRlcm5hbCBsb3ctbGV2ZWwgc3VwcG9ydCByb3V0aW5lcworICovCisKK2V4dGVybiB2b2lkIHB1dERlYnVnQ2hhciAoaW50IGMpOyAvKiB3cml0ZSBhIHNpbmdsZSBjaGFyYWN0ZXIgICAgICAqLworZXh0ZXJuIGludCBnZXREZWJ1Z0NoYXIgKHZvaWQpOwkvKiByZWFkIGFuZCByZXR1cm4gYSBzaW5nbGUgY2hhciAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQlVGTUFYIGRlZmluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gaW5ib3VuZC9vdXRib3VuZCBidWZmZXJzKi8KKy8qIGF0IGxlYXN0IE5VTVJFR0JZVEVTKjIgYXJlIG5lZWRlZCBmb3IgcmVnaXN0ZXIgcGFja2V0cyAqLworI2RlZmluZSBCVUZNQVggMjA0OAorCitzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsJLyogITAgbWVhbnMgd2UndmUgYmVlbiBpbml0aWFsaXplZCAqLworCitleHRlcm4gdm9pZCBicmVha2luc3QgKCk7CitzdGF0aWMgdm9pZCBzZXRfbWVtX2ZhdWx0X3RyYXAgKGludCBlbmFibGUpOworc3RhdGljIHZvaWQgZ2V0X2luX2JyZWFrX21vZGUgKHZvaWQpOworCitzdGF0aWMgY29uc3QgY2hhciBoZXhjaGFyc1tdPSIwMTIzNDU2Nzg5YWJjZGVmIjsKKworI2RlZmluZSBOVU1SRUdTIDgwIAorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2YgcmVnaXN0ZXJzLiAgKi8KKyNkZWZpbmUgTlVNUkVHQllURVMgKE5VTVJFR1MgKiA0KQorZW51bSByZWduYW1lcyB7RzAsIEcxLCBHMiwgRzMsIEc0LCBHNSwgRzYsIEc3LAorCQkgTzAsIE8xLCBPMiwgTzMsIE80LCBPNSwgU1AsIE83LAorCQkgTDAsIEwxLCBMMiwgTDMsIEw0LCBMNSwgTDYsIEw3LAorCQkgSTAsIEkxLCBJMiwgSTMsIEk0LCBJNSwgRlAsIEk3LAorCisJCSBGMCwgRjEsIEYyLCBGMywgRjQsIEY1LCBGNiwgRjcsCisJCSBGOCwgRjksIEYxMCwgRjExLCBGMTIsIEYxMywgRjE0LCBGMTUsCisJCSBGMTYsIEYxNywgRjE4LCBGMTksIEYyMCwgRjIxLCBGMjIsIEYyMywKKwkJIEYyNCwgRjI1LCBGMjYsIEYyNywgRjI4LCBGMjksIEYzMCwgRjMxLAorCQkgWSwgUFNSLCBXSU0sIFRCUiwgUEMsIE5QQywgRlBTUiwgQ1BTUiwKKwkJIERJQTEsIERJQTIsIEREQTEsIEREQTIsIEREVjEsIEREVjIsIERDUiwgRFNSIH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogIEFTU0VNQkxZIENPREUgTUFDUk9TICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAJCQkJCQkJCQkgICAqLworCitleHRlcm4gdm9pZCB0cmFwX2xvdygpOworCisvKiBDcmVhdGUgcHJpdmF0ZSBjb3BpZXMgb2YgY29tbW9uIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBzdHViLiAgVGhpcyBwcmV2ZW50cworICAgbmFzdHkgaW50ZXJhY3Rpb25zIGJldHdlZW4gYXBwIGNvZGUgYW5kIHRoZSBzdHViIChmb3IgaW5zdGFuY2UgaWYgdXNlciBzdGVwcworICAgaW50byBzdHJsZW4sIGV0Yy4uKSAqLworCitzdGF0aWMgaW50CitzdHJsZW4gKGNvbnN0IGNoYXIgKnMpCit7CisgIGNvbnN0IGNoYXIgKnMxID0gczsKKworICB3aGlsZSAoKnMxKysgIT0gJ1wwMDAnKTsKKworICByZXR1cm4gczEgLSBzOworfQorCitzdGF0aWMgY2hhciAqCitzdHJjcHkgKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKQoreworICBjaGFyICpyZXR2YWwgPSBkc3Q7CisKKyAgd2hpbGUgKCgqZHN0KysgPSAqc3JjKyspICE9ICdcMDAwJyk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgKgorbWVtY3B5ICh2b2lkICp2ZHN0LCBjb25zdCB2b2lkICp2c3JjLCBpbnQgbikKK3sKKyAgY2hhciAqZHN0ID0gdmRzdDsKKyAgY29uc3QgY2hhciAqc3JjID0gdnNyYzsKKyAgY2hhciAqcmV0dmFsID0gZHN0OworCisgIHdoaWxlIChuLS0gPiAwKQorICAgICpkc3QrKyA9ICpzcmMrKzsKKworICByZXR1cm4gcmV0dmFsOworfQorCithc20oIgorCS5yZXNlcnZlIHRyYXBzdGFjaywgMTAwMCAqIDQsIFwiYnNzXCIsIDgKKworCS5kYXRhCisJLmFsaWduCTQKKworaW5fdHJhcF9oYW5kbGVyOgorCS53b3JkCTAKKworCS50ZXh0CisJLmFsaWduIDQKKworISBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFueSBTUEFSQyB0cmFwIChleGNlcHQgd2luZG93IG92ZXJmbG93IG9yCishIHVuZGVyZmxvdykgb2NjdXJzLiAgSXQgbWFrZXMgc3VyZSB0aGF0IHRoZSBpbnZhbGlkIHJlZ2lzdGVyIHdpbmRvdyBpcyBzdGlsbAorISBhdmFpbGFibGUgYmVmb3JlIGp1bXBpbmcgaW50byBDIGNvZGUuICBJdCB3aWxsIGFsc28gcmVzdG9yZSB0aGUgd29ybGQgaWYgeW91CishIHJldHVybiBmcm9tIGhhbmRsZV9leGNlcHRpb24uCishCishIE9uIGVudHJ5LCB0cmFwX2xvdyBleHBlY3RzIGwxIGFuZCBsMiB0byBjb250YWluIHBjIGFuZCBucGMgcmVzcGVjdGl2bHkuCishIFJlZ2lzdGVyIHVzYWdlIHRocm91Z2hvdXQgdGhlIHJvdXRpbmUgaXMgYXMgZm9sbG93czoKKyEKKyEJbDAgLSBwc3IKKyEJbDEgLSBwYworIQlsMiAtIG5wYworIQlsMyAtIHdpbQorIQlsNCAtIHNjcmF0Y2ggYW5kIHkgcmVnCishCWw1IC0gc2NyYXRjaCBhbmQgdGJyCishCWw2IC0gdW51c2VkCishCWw3IC0gdW51c2VkCisKKwkuZ2xvYmwgX3RyYXBfbG93CitfdHJhcF9sb3c6CisJbW92CSVwc3IsICVsMAorCW1vdgkld2ltLCAlbDMKKworCXNybAklbDMsICVsMCwgJWw0CQkhIHdpbSA+PiBjd3AKKwljbXAJJWw0LCAxCisJYm5lCXdpbmRvd19maW5lCQkhIEJyYW5jaCBpZiBub3QgaW4gdGhlIGludmFsaWQgd2luZG93CisJbm9wCisKKyEgSGFuZGxlIHdpbmRvdyBvdmVyZmxvdworCisJbW92CSVnMSwgJWw0CQkhIFNhdmUgZzEsIHdlIHVzZSBpdCB0byBob2xkIHRoZSB3aW0KKwlzcmwJJWwzLCAxLCAlZzEJCSEgUm90YXRlIHdpbSByaWdodAorCXRzdAklZzEKKwliZwlnb29kX3dpbQkJISBCcmFuY2ggaWYgbmV3IHdpbSBpcyBub24temVybworCW5vcAorCishIEF0IHRoaXMgcG9pbnQsIHdlIG5lZWQgdG8gYnJpbmcgYSAxIGludG8gdGhlIGhpZ2ggb3JkZXIgYml0IG9mIHRoZSB3aW0uCishIFNpbmNlIHdlIGRvbid0IHdhbnQgdG8gbWFrZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIG51bWJlciBvZiByZWdpc3RlcgorISB3aW5kb3dzLCB3ZSBmaWd1cmUgaXQgb3V0IGR5bmFtaWNhbGx5IHNvIGFzIHRvIHNldHVwIHRoZSB3aW0gY29ycmVjdGx5LgorCisJbm90CSVnMQkJCSEgRmlsbCBnMSB3aXRoIG9uZXMKKwltb3YJJWcxLCAld2ltCQkhIEZpbGwgdGhlIHdpbSB3aXRoIG9uZXMKKwlub3AKKwlub3AKKwlub3AKKwltb3YJJXdpbSwgJWcxCQkhIFJlYWQgYmFjayB0aGUgd2ltCisJaW5jCSVnMQkJCSEgTm93IGcxIGhhcyAxIGp1c3QgdG8gbGVmdCBvZiB3aW0KKwlzcmwJJWcxLCAxLCAlZzEJCSEgTm93IHB1dCAxIGF0IHRvcCBvZiB3aW0KKwltb3YJJWcwLCAld2ltCQkhIENsZWFyIHdpbSBzbyB0aGF0IHN1YnNlcXVlbnQgc2F2ZQorCW5vcAkJCQkhICB3b24ndCB0cmFwCisJbm9wCisJbm9wCisKK2dvb2Rfd2ltOgorCXNhdmUJJWcwLCAlZzAsICVnMAkJISBTbGlwIGludG8gbmV4dCB3aW5kb3cKKwltb3YJJWcxLCAld2ltCQkhIEluc3RhbGwgdGhlIG5ldyB3aW0KKworCXN0ZAklbDAsIFslc3AgKyAwICogNF0JISBzYXZlIEwgJiBJIHJlZ2lzdGVycworCXN0ZAklbDIsIFslc3AgKyAyICogNF0KKwlzdGQJJWw0LCBbJXNwICsgNCAqIDRdCisJc3RkCSVsNiwgWyVzcCArIDYgKiA0XQorCisJc3RkCSVpMCwgWyVzcCArIDggKiA0XQorCXN0ZAklaTIsIFslc3AgKyAxMCAqIDRdCisJc3RkCSVpNCwgWyVzcCArIDEyICogNF0KKwlzdGQJJWk2LCBbJXNwICsgMTQgKiA0XQorCisJcmVzdG9yZQkJCQkhIEdvIGJhY2sgdG8gdHJhcCB3aW5kb3cuCisJbW92CSVsNCwgJWcxCQkhIFJlc3RvcmUgJWcxCisKK3dpbmRvd19maW5lOgorCXNldGhpCSVoaShpbl90cmFwX2hhbmRsZXIpLCAlbDQKKwlsZAlbJWxvKGluX3RyYXBfaGFuZGxlcikgKyAlbDRdLCAlbDUKKwl0c3QJJWw1CisJYmcJcmVjdXJzaXZlX3RyYXAKKwlpbmMJJWw1CisKKwlzZXQJdHJhcHN0YWNrKzEwMDAqNCwgJXNwCSEgU3dpdGNoIHRvIHRyYXAgc3RhY2sKKworcmVjdXJzaXZlX3RyYXA6CisJc3QJJWw1LCBbJWxvKGluX3RyYXBfaGFuZGxlcikgKyAlbDRdCisJc3ViCSVzcCwoMTYrMSs2KzErODApKjQsJXNwCSEgTWFrZSByb29tIGZvciBpbnB1dCAmIGxvY2FscworIAkJCQkJISArIGhpZGRlbiBhcmcgKyBhcmcgc3BpbGwKKwkJCQkJISArIGRvdWJsZXdvcmQgYWxpZ25tZW50CisJCQkJCSEgKyByZWdpc3RlcnNbNzJdIGxvY2FsIHZhcgorCisJc3RkCSVnMCwgWyVzcCArICgyNCArIDApICogNF0gISByZWdpc3RlcnNbR3hdCisJc3RkCSVnMiwgWyVzcCArICgyNCArIDIpICogNF0KKwlzdGQJJWc0LCBbJXNwICsgKDI0ICsgNCkgKiA0XQorCXN0ZAklZzYsIFslc3AgKyAoMjQgKyA2KSAqIDRdCisKKwlzdGQJJWkwLCBbJXNwICsgKDI0ICsgOCkgKiA0XSAhIHJlZ2lzdGVyc1tPeF0KKwlzdGQJJWkyLCBbJXNwICsgKDI0ICsgMTApICogNF0KKwlzdGQJJWk0LCBbJXNwICsgKDI0ICsgMTIpICogNF0KKwlzdGQJJWk2LCBbJXNwICsgKDI0ICsgMTQpICogNF0KKworCW1vdgkleSwgJWw0CisJbW92CSV0YnIsICVsNQorCXN0CSVsNCwgWyVzcCArICgyNCArIDY0KSAqIDRdICEgWQorCXN0CSVsMCwgWyVzcCArICgyNCArIDY1KSAqIDRdICEgUFNSCisJc3QJJWwzLCBbJXNwICsgKDI0ICsgNjYpICogNF0gISBXSU0KKwlzdAklbDUsIFslc3AgKyAoMjQgKyA2NykgKiA0XSAhIFRCUgorCXN0CSVsMSwgWyVzcCArICgyNCArIDY4KSAqIDRdICEgUEMKKwlzdAklbDIsIFslc3AgKyAoMjQgKyA2OSkgKiA0XSAhIE5QQworCisJb3IJJWwwLCAweGYyMCwgJWw0CisJbW92CSVsNCwgJXBzcgkJISBUdXJuIG9uIHRyYXBzLCBkaXNhYmxlIGludGVycnVwdHMKKworCXNldAkweDEwMDAsICVsMQorCWJ0c3QJJWwxLCAlbDAJCSEgRlAgZW5hYmxlZD8KKwliZQlub19mcHN0b3JlCisJbm9wCisKKyEgTXVzdCBzYXZlIGZzciBmaXJzdCwgdG8gZmx1c2ggdGhlIEZRLiAgVGhpcyBtYXkgY2F1c2UgYSBkZWZlcnJlZCBmcCB0cmFwLCBzbworISB0cmFwcyBtdXN0IGJlIGVuYWJsZWQgdG8gYWxsb3cgdGhlIHRyYXAgaGFuZGxlciB0byBjbGVhbiB0aGluZ3MgdXAuCisKKwlzdAklZnNyLCBbJXNwICsgKDI0ICsgNzApICogNF0KKworCXN0ZAklZjAsIFslc3AgKyAoMjQgKyAzMikgKiA0XQorCXN0ZAklZjIsIFslc3AgKyAoMjQgKyAzNCkgKiA0XQorCXN0ZAklZjQsIFslc3AgKyAoMjQgKyAzNikgKiA0XQorCXN0ZAklZjYsIFslc3AgKyAoMjQgKyAzOCkgKiA0XQorCXN0ZAklZjgsIFslc3AgKyAoMjQgKyA0MCkgKiA0XQorCXN0ZAklZjEwLCBbJXNwICsgKDI0ICsgNDIpICogNF0KKwlzdGQJJWYxMiwgWyVzcCArICgyNCArIDQ0KSAqIDRdCisJc3RkCSVmMTQsIFslc3AgKyAoMjQgKyA0NikgKiA0XQorCXN0ZAklZjE2LCBbJXNwICsgKDI0ICsgNDgpICogNF0KKwlzdGQJJWYxOCwgWyVzcCArICgyNCArIDUwKSAqIDRdCisJc3RkCSVmMjAsIFslc3AgKyAoMjQgKyA1MikgKiA0XQorCXN0ZAklZjIyLCBbJXNwICsgKDI0ICsgNTQpICogNF0KKwlzdGQJJWYyNCwgWyVzcCArICgyNCArIDU2KSAqIDRdCisJc3RkCSVmMjYsIFslc3AgKyAoMjQgKyA1OCkgKiA0XQorCXN0ZAklZjI4LCBbJXNwICsgKDI0ICsgNjApICogNF0KKwlzdGQJJWYzMCwgWyVzcCArICgyNCArIDYyKSAqIDRdCitub19mcHN0b3JlOgorCisJY2FsbAlfaGFuZGxlX2V4Y2VwdGlvbgorCWFkZAklc3AsIDI0ICogNCwgJW8wCSEgUGFzcyBhZGRyZXNzIG9mIHJlZ2lzdGVycworCishIFJlbG9hZCBhbGwgb2YgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZW4ndCBvbiB0aGUgc3RhY2sKKworCWxkCVslc3AgKyAoMjQgKyAxKSAqIDRdLCAlZzEgISByZWdpc3RlcnNbR3hdCisJbGRkCVslc3AgKyAoMjQgKyAyKSAqIDRdLCAlZzIKKwlsZGQJWyVzcCArICgyNCArIDQpICogNF0sICVnNAorCWxkZAlbJXNwICsgKDI0ICsgNikgKiA0XSwgJWc2CisKKwlsZGQJWyVzcCArICgyNCArIDgpICogNF0sICVpMCAhIHJlZ2lzdGVyc1tPeF0KKwlsZGQJWyVzcCArICgyNCArIDEwKSAqIDRdLCAlaTIKKwlsZGQJWyVzcCArICgyNCArIDEyKSAqIDRdLCAlaTQKKwlsZGQJWyVzcCArICgyNCArIDE0KSAqIDRdLCAlaTYKKworCisJbGRkCVslc3AgKyAoMjQgKyA2NCkgKiA0XSwgJWwwICEgWSAmIFBTUgorCWxkZAlbJXNwICsgKDI0ICsgNjgpICogNF0sICVsMiAhIFBDICYgTlBDCisKKwlzZXQJMHgxMDAwLCAlbDUKKwlidHN0CSVsNSwgJWwxCQkhIEZQIGVuYWJsZWQ/CisJYmUJbm9fZnByZWxvYWQKKwlub3AKKworCWxkZAlbJXNwICsgKDI0ICsgMzIpICogNF0sICVmMAorCWxkZAlbJXNwICsgKDI0ICsgMzQpICogNF0sICVmMgorCWxkZAlbJXNwICsgKDI0ICsgMzYpICogNF0sICVmNAorCWxkZAlbJXNwICsgKDI0ICsgMzgpICogNF0sICVmNgorCWxkZAlbJXNwICsgKDI0ICsgNDApICogNF0sICVmOAorCWxkZAlbJXNwICsgKDI0ICsgNDIpICogNF0sICVmMTAKKwlsZGQJWyVzcCArICgyNCArIDQ0KSAqIDRdLCAlZjEyCisJbGRkCVslc3AgKyAoMjQgKyA0NikgKiA0XSwgJWYxNAorCWxkZAlbJXNwICsgKDI0ICsgNDgpICogNF0sICVmMTYKKwlsZGQJWyVzcCArICgyNCArIDUwKSAqIDRdLCAlZjE4CisJbGRkCVslc3AgKyAoMjQgKyA1MikgKiA0XSwgJWYyMAorCWxkZAlbJXNwICsgKDI0ICsgNTQpICogNF0sICVmMjIKKwlsZGQJWyVzcCArICgyNCArIDU2KSAqIDRdLCAlZjI0CisJbGRkCVslc3AgKyAoMjQgKyA1OCkgKiA0XSwgJWYyNgorCWxkZAlbJXNwICsgKDI0ICsgNjApICogNF0sICVmMjgKKwlsZGQJWyVzcCArICgyNCArIDYyKSAqIDRdLCAlZjMwCisKKwlsZAlbJXNwICsgKDI0ICsgNzApICogNF0sICVmc3IKK25vX2ZwcmVsb2FkOgorCisJcmVzdG9yZQkJCQkhIEVuc3VyZSB0aGF0IHByZXZpb3VzIHdpbmRvdyBpcyB2YWxpZAorCXNhdmUJJWcwLCAlZzAsICVnMAkJISAgYnkgY2F1c2luZyBhIHdpbmRvd191bmRlcmZsb3cgdHJhcAorCisJbW92CSVsMCwgJXkKKwltb3YJJWwxLCAlcHNyCQkhIE1ha2Ugc3VyZSB0aGF0IHRyYXBzIGFyZSBkaXNhYmxlZAorCQkJCQkhIGZvciByZXR0CisJc2V0aGkJJWhpKGluX3RyYXBfaGFuZGxlciksICVsNAorCWxkCVslbG8oaW5fdHJhcF9oYW5kbGVyKSArICVsNF0sICVsNQorCWRlYwklbDUKKwlzdAklbDUsIFslbG8oaW5fdHJhcF9oYW5kbGVyKSArICVsNF0KKworCWptcGwJJWwyLCAlZzAJCSEgUmVzdG9yZSBvbGQgUEMKKwlyZXR0CSVsMwkJCSEgUmVzdG9yZSBvbGQgblBDCisiKTsKKworLyogQ29udmVydCBjaCBmcm9tIGEgaGV4IGRpZ2l0IHRvIGFuIGludCAqLworCitzdGF0aWMgaW50CitoZXgoY2gpCisgICAgIHVuc2lnbmVkIGNoYXIgY2g7Cit7CisgIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKQorICAgIHJldHVybiBjaC0nYScrMTA7CisgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQorICAgIHJldHVybiBjaC0nMCc7CisgIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKQorICAgIHJldHVybiBjaC0nQScrMTA7CisgIHJldHVybiAtMTsKK30KKworLyogc2NhbiBmb3IgdGhlIHNlcXVlbmNlICQ8ZGF0YT4jPGNoZWNrc3VtPiAgICAgKi8KKworc3RhdGljIHZvaWQKK2dldHBhY2tldChidWZmZXIpCisgICAgIGNoYXIgKmJ1ZmZlcjsKK3sKKyAgdW5zaWduZWQgY2hhciBjaGVja3N1bTsKKyAgdW5zaWduZWQgY2hhciB4bWl0Y3N1bTsKKyAgaW50IGk7CisgIGludCBjb3VudDsKKyAgdW5zaWduZWQgY2hhciBjaDsKKworICBkbworICAgIHsKKyAgICAgIC8qIHdhaXQgYXJvdW5kIGZvciB0aGUgc3RhcnQgY2hhcmFjdGVyLCBpZ25vcmUgYWxsIG90aGVyIGNoYXJhY3RlcnMgKi8KKyAgICAgIHdoaWxlICgoY2ggPSAoZ2V0RGVidWdDaGFyKCkgJiAweDdmKSkgIT0gJyQnKSA7CisKKyAgICAgIGNoZWNrc3VtID0gMDsKKyAgICAgIHhtaXRjc3VtID0gLTE7CisKKyAgICAgIGNvdW50ID0gMDsKKworICAgICAgLyogbm93LCByZWFkIHVudGlsIGEgIyBvciBlbmQgb2YgYnVmZmVyIGlzIGZvdW5kICovCisgICAgICB3aGlsZSAoY291bnQgPCBCVUZNQVgpCisJeworCSAgY2ggPSBnZXREZWJ1Z0NoYXIoKSAmIDB4N2Y7CisJICBpZiAoY2ggPT0gJyMnKQorCSAgICBicmVhazsKKwkgIGNoZWNrc3VtID0gY2hlY2tzdW0gKyBjaDsKKwkgIGJ1ZmZlcltjb3VudF0gPSBjaDsKKwkgIGNvdW50ID0gY291bnQgKyAxOworCX0KKworICAgICAgaWYgKGNvdW50ID49IEJVRk1BWCkKKwljb250aW51ZTsKKworICAgICAgYnVmZmVyW2NvdW50XSA9IDA7CisKKyAgICAgIGlmIChjaCA9PSAnIycpCisJeworCSAgeG1pdGNzdW0gPSBoZXgoZ2V0RGVidWdDaGFyKCkgJiAweDdmKSA8PCA0OworCSAgeG1pdGNzdW0gfD0gaGV4KGdldERlYnVnQ2hhcigpICYgMHg3Zik7CisjaWYgMAorCSAgLyogSHVtYW5zIHNob3VsZG4ndCBoYXZlIHRvIGZpZ3VyZSBvdXQgY2hlY2tzdW1zIHRvIHR5cGUgdG8gaXQuICovCisJICBwdXREZWJ1Z0NoYXIgKCcrJyk7CisJICByZXR1cm47CisjZW5kaWYKKwkgIGlmIChjaGVja3N1bSAhPSB4bWl0Y3N1bSkKKwkgICAgcHV0RGVidWdDaGFyKCctJyk7CS8qIGZhaWxlZCBjaGVja3N1bSAqLworCSAgZWxzZQorCSAgICB7CisJICAgICAgcHV0RGVidWdDaGFyKCcrJyk7IC8qIHN1Y2Nlc3NmdWwgdHJhbnNmZXIgKi8KKwkgICAgICAvKiBpZiBhIHNlcXVlbmNlIGNoYXIgaXMgcHJlc2VudCwgcmVwbHkgdGhlIHNlcXVlbmNlIElEICovCisJICAgICAgaWYgKGJ1ZmZlclsyXSA9PSAnOicpCisJCXsKKwkJICBwdXREZWJ1Z0NoYXIoYnVmZmVyWzBdKTsKKwkJICBwdXREZWJ1Z0NoYXIoYnVmZmVyWzFdKTsKKwkJICAvKiByZW1vdmUgc2VxdWVuY2UgY2hhcnMgZnJvbSBidWZmZXIgKi8KKwkJICBjb3VudCA9IHN0cmxlbihidWZmZXIpOworCQkgIGZvciAoaT0zOyBpIDw9IGNvdW50OyBpKyspCisJCSAgICBidWZmZXJbaS0zXSA9IGJ1ZmZlcltpXTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgd2hpbGUgKGNoZWNrc3VtICE9IHhtaXRjc3VtKTsKK30KKworLyogc2VuZCB0aGUgcGFja2V0IGluIGJ1ZmZlci4gICovCisKK3N0YXRpYyB2b2lkCitwdXRwYWNrZXQoYnVmZmVyKQorICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7Cit7CisgIHVuc2lnbmVkIGNoYXIgY2hlY2tzdW07CisgIGludCBjb3VudDsKKyAgdW5zaWduZWQgY2hhciBjaDsKKworICAvKiAgJDxwYWNrZXQgaW5mbz4jPGNoZWNrc3VtPi4gKi8KKyAgZG8KKyAgICB7CisgICAgICBwdXREZWJ1Z0NoYXIoJyQnKTsKKyAgICAgIGNoZWNrc3VtID0gMDsKKyAgICAgIGNvdW50ID0gMDsKKworICAgICAgd2hpbGUgKGNoID0gYnVmZmVyW2NvdW50XSkKKwl7CisJICBwdXREZWJ1Z0NoYXIgKGNoKTsKKwkgIGNoZWNrc3VtICs9IGNoOworCSAgY291bnQgKz0gMTsKKwl9CisKKyAgICAgIHB1dERlYnVnQ2hhcignIycpOworICAgICAgcHV0RGVidWdDaGFyKGhleGNoYXJzW2NoZWNrc3VtID4+IDRdKTsKKyAgICAgIHB1dERlYnVnQ2hhcihoZXhjaGFyc1tjaGVja3N1bSAmIDB4Zl0pOworCisgICAgfQorICB3aGlsZSAoKGdldERlYnVnQ2hhcigpICYgMHg3ZikgIT0gJysnKTsKK30KKworc3RhdGljIGNoYXIgcmVtY29tSW5CdWZmZXJbQlVGTUFYXTsKK3N0YXRpYyBjaGFyIHJlbWNvbU91dEJ1ZmZlcltCVUZNQVhdOworCisvKiBJbmRpY2F0ZSB0byBjYWxsZXIgb2YgbWVtMmhleCBvciBoZXgybWVtIHRoYXQgdGhlcmUgaGFzIGJlZW4gYW4KKyAgIGVycm9yLiAgKi8KK3N0YXRpYyB2b2xhdGlsZSBpbnQgbWVtX2VyciA9IDA7CisKKy8qIENvbnZlcnQgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IG1lbSBpbnRvIGhleCwgcGxhY2luZyByZXN1bHQgaW4gYnVmLgorICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbGFzdCBjaGFyIHB1dCBpbiBidWYgKG51bGwpLCBpbiBjYXNlIG9mIG1lbSBmYXVsdCwKKyAqIHJldHVybiAwLgorICogSWYgTUFZX0ZBVUxUIGlzIG5vbi16ZXJvLCB0aGVuIHdlIHdpbGwgaGFuZGxlIG1lbW9yeSBmYXVsdHMgYnkgcmV0dXJuaW5nCisgKiBhIDAsIGVsc2UgdHJlYXQgYSBmYXVsdCBsaWtlIGFueSBvdGhlciBmYXVsdCBpbiB0aGUgc3R1Yi4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCittZW0yaGV4KG1lbSwgYnVmLCBjb3VudCwgbWF5X2ZhdWx0KQorICAgICB1bnNpZ25lZCBjaGFyICptZW07CisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICAgaW50IGNvdW50OworICAgICBpbnQgbWF5X2ZhdWx0OworeworICB1bnNpZ25lZCBjaGFyIGNoOworCisgIHNldF9tZW1fZmF1bHRfdHJhcChtYXlfZmF1bHQpOworCisgIHdoaWxlIChjb3VudC0tID4gMCkKKyAgICB7CisgICAgICBjaCA9ICptZW0rKzsKKyAgICAgIGlmIChtZW1fZXJyKQorCXJldHVybiAwOworICAgICAgKmJ1ZisrID0gaGV4Y2hhcnNbY2ggPj4gNF07CisgICAgICAqYnVmKysgPSBoZXhjaGFyc1tjaCAmIDB4Zl07CisgICAgfQorCisgICpidWYgPSAwOworCisgIHNldF9tZW1fZmF1bHRfdHJhcCgwKTsKKworICByZXR1cm4gYnVmOworfQorCisvKiBjb252ZXJ0IHRoZSBoZXggYXJyYXkgcG9pbnRlZCB0byBieSBidWYgaW50byBiaW5hcnkgdG8gYmUgcGxhY2VkIGluIG1lbQorICogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIEFGVEVSIHRoZSBsYXN0IGJ5dGUgd3JpdHRlbiAqLworCitzdGF0aWMgY2hhciAqCitoZXgybWVtKGJ1ZiwgbWVtLCBjb3VudCwgbWF5X2ZhdWx0KQorICAgICB1bnNpZ25lZCBjaGFyICpidWY7CisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbTsKKyAgICAgaW50IGNvdW50OworICAgICBpbnQgbWF5X2ZhdWx0OworeworICBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciBjaDsKKworICBzZXRfbWVtX2ZhdWx0X3RyYXAobWF5X2ZhdWx0KTsKKworICBmb3IgKGk9MDsgaTxjb3VudDsgaSsrKQorICAgIHsKKyAgICAgIGNoID0gaGV4KCpidWYrKykgPDwgNDsKKyAgICAgIGNoIHw9IGhleCgqYnVmKyspOworICAgICAgKm1lbSsrID0gY2g7CisgICAgICBpZiAobWVtX2VycikKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgc2V0X21lbV9mYXVsdF90cmFwKDApOworCisgIHJldHVybiBtZW07Cit9CisKKy8qIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIG1hcHBpbmcgYmV0d2VlbiBTUEFSQyBoYXJkd2FyZSB0cmFwIHR5cGVzLCBhbmQKKyAgIHNpZ25hbHMsIHdoaWNoIGFyZSBwcmltYXJpbHkgd2hhdCBHREIgdW5kZXJzdGFuZHMuICBJdCBhbHNvIGluZGljYXRlcworICAgd2hpY2ggaGFyZHdhcmUgdHJhcHMgd2UgbmVlZCB0byBjb21tYW5kZWVyIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBzdHViLiAqLworCitzdGF0aWMgc3RydWN0IGhhcmRfdHJhcF9pbmZvCit7CisgIHVuc2lnbmVkIGNoYXIgdHQ7CQkvKiBUcmFwIHR5cGUgY29kZSBmb3IgU1BBUkNsaXRlICovCisgIHVuc2lnbmVkIGNoYXIgc2lnbm87CQkvKiBTaWduYWwgdGhhdCB3ZSBtYXAgdGhpcyB0cmFwIGludG8gKi8KK30gaGFyZF90cmFwX2luZm9bXSA9IHsKKyAgezB4MDEsIFNJR1NFR1Z9LAkJLyogaW5zdHJ1Y3Rpb24gYWNjZXNzIGVycm9yICovCisgIHsweDAyLCBTSUdJTEx9LAkJLyogcHJpdmlsZWdlZCBpbnN0cnVjdGlvbiAqLworICB7MHgwMywgU0lHSUxMfSwJCS8qIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gKi8KKyAgezB4MDQsIFNJR0VNVH0sCQkvKiBmcCBkaXNhYmxlZCAqLworICB7MHgwNywgU0lHQlVTfSwJCS8qIG1lbSBhZGRyZXNzIG5vdCBhbGlnbmVkICovCisgIHsweDA5LCBTSUdTRUdWfSwJCS8qIGRhdGEgYWNjZXNzIGV4Y2VwdGlvbiAqLworICB7MHgwYSwgU0lHRU1UfSwJCS8qIHRhZyBvdmVyZmxvdyAqLworICB7MHgyMCwgU0lHQlVTfSwJCS8qIHIgcmVnaXN0ZXIgYWNjZXNzIGVycm9yICovCisgIHsweDIxLCBTSUdCVVN9LAkJLyogaW5zdHJ1Y3Rpb24gYWNjZXNzIGVycm9yICovCisgIHsweDI0LCBTSUdFTVR9LAkJLyogY3AgZGlzYWJsZWQgKi8KKyAgezB4MjksIFNJR0JVU30sCQkvKiBkYXRhIGFjY2VzcyBlcnJvciAqLworICB7MHgyYSwgU0lHRlBFfSwJCS8qIGRpdmlkZSBieSB6ZXJvICovCisgIHsweDJiLCBTSUdCVVN9LAkJLyogZGF0YSBzdG9yZSBlcnJvciAqLworICB7MHg4MCsxLCBTSUdUUkFQfSwJCS8qIHRhIDEgLSBub3JtYWwgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiAqLworICB7MHhmZiwgU0lHVFJBUH0sCQkvKiBoYXJkd2FyZSBicmVha3BvaW50ICovCisgIHswLCAwfQkJCS8qIE11c3QgYmUgbGFzdCAqLworfTsKKworLyogU2V0IHVwIGV4Y2VwdGlvbiBoYW5kbGVycyBmb3IgdHJhY2luZyBhbmQgYnJlYWtwb2ludHMgKi8KKwordm9pZAorc2V0X2RlYnVnX3RyYXBzKCkKK3sKKyAgc3RydWN0IGhhcmRfdHJhcF9pbmZvICpodDsKKworLyogT25seSBzZXR1cCBmcCB0cmFwcyBpZiB0aGUgRlAgaXMgZGlzYWJsZWQuICAqLworCisgIGZvciAoaHQgPSBoYXJkX3RyYXBfaW5mbzsKKyAgICAgICBodC0+dHQgIT0gMCAmJiBodC0+c2lnbm8gIT0gMDsKKyAgICAgICBodCsrKQorICAgIGlmIChodC0+dHQgIT0gNCB8fCAhIChyZWFkX3BzciAoKSAmIDB4MTAwMCkpCisgICAgICBleGNlcHRpb25IYW5kbGVyKGh0LT50dCwgdHJhcF9sb3cpOworCisgIC8qIEluIGNhc2UgR0RCIGlzIHN0YXJ0ZWQgYmVmb3JlIHVzLCBhY2sgYW55IHBhY2tldHMgKHByZXN1bWFibHkKKyAgICAgIiQ/I3h4Iikgc2l0dGluZyB0aGVyZS4gICovCisKKyAgcHV0RGVidWdDaGFyICgnKycpOworCisgIGluaXRpYWxpemVkID0gMTsKK30KKworYXNtICgiCishIFRyYXAgaGFuZGxlciBmb3IgbWVtb3J5IGVycm9ycy4gIFRoaXMganVzdCBzZXRzIG1lbV9lcnIgdG8gYmUgbm9uLXplcm8uICBJdAorISBhc3N1bWVzIHRoYXQgJWwxIGlzIG5vbi16ZXJvLiAgVGhpcyBzaG91bGQgYmUgc2FmZSwgYXMgaXQgaXMgZG91YnRmdWwgdGhhdAorISAwIHdvdWxkIGV2ZXIgY29udGFpbiBjb2RlIHRoYXQgY291bGQgbWVtIGZhdWx0LiAgVGhpcyByb3V0aW5lIHdpbGwgc2tpcAorISBwYXN0IHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbiBhZnRlciBzZXR0aW5nIG1lbV9lcnIuCisKKwkudGV4dAorCS5hbGlnbiA0CisKK19mbHRyX3NldF9tZW1fZXJyOgorCXNldGhpICVoaShfbWVtX2VyciksICVsMAorCXN0ICVsMSwgWyVsMCArICVsbyhfbWVtX2VycildCisJam1wbCAlbDIsICVnMAorCXJldHQgJWwyKzQKKyIpOworCitzdGF0aWMgdm9pZAorc2V0X21lbV9mYXVsdF90cmFwKGVuYWJsZSkKKyAgICAgaW50IGVuYWJsZTsKK3sKKyAgZXh0ZXJuIHZvaWQgZmx0cl9zZXRfbWVtX2VycigpOworICBtZW1fZXJyID0gMDsKKworICBpZiAoZW5hYmxlKQorICAgIGV4Y2VwdGlvbkhhbmRsZXIoOSwgZmx0cl9zZXRfbWVtX2Vycik7CisgIGVsc2UKKyAgICBleGNlcHRpb25IYW5kbGVyKDksIHRyYXBfbG93KTsKK30KKworYXNtICgiCisJLnRleHQKKwkuYWxpZ24gNAorCitfZHVtbXlfaHdfYnJlYWtwb2ludDoKKwlqbXBsICVsMiwgJWcwCisJcmV0dCAlbDIrNAorCW5vcAorCW5vcAorIik7CisKK3N0YXRpYyB2b2lkCitnZXRfaW5fYnJlYWtfbW9kZSgpCit7CisgIGV4dGVybiB2b2lkIGR1bW15X2h3X2JyZWFrcG9pbnQoKTsKKworICBleGNlcHRpb25IYW5kbGVyICgyNTUsIGR1bW15X2h3X2JyZWFrcG9pbnQpOworCisgIGFzbSAoInRhIDI1NSIpOworCisgIGV4Y2VwdGlvbkhhbmRsZXIgKDI1NSwgdHJhcF9sb3cpOworfQorCisvKiBDb252ZXJ0IHRoZSBTUEFSQyBoYXJkd2FyZSB0cmFwIHR5cGUgY29kZSB0byBhIHVuaXggc2lnbmFsIG51bWJlci4gKi8KKworc3RhdGljIGludAorY29tcHV0ZVNpZ25hbCh0dCkKKyAgICAgaW50IHR0OworeworICBzdHJ1Y3QgaGFyZF90cmFwX2luZm8gKmh0OworCisgIGZvciAoaHQgPSBoYXJkX3RyYXBfaW5mbzsgaHQtPnR0ICYmIGh0LT5zaWdubzsgaHQrKykKKyAgICBpZiAoaHQtPnR0ID09IHR0KQorICAgICAgcmV0dXJuIGh0LT5zaWdubzsKKworICByZXR1cm4gU0lHSFVQOwkJLyogZGVmYXVsdCBmb3IgdGhpbmdzIHdlIGRvbid0IGtub3cgYWJvdXQgKi8KK30KKworLyoKKyAqIFdoaWxlIHdlIGZpbmQgbmljZSBoZXggY2hhcnMsIGJ1aWxkIGFuIGludC4KKyAqIFJldHVybiBudW1iZXIgb2YgY2hhcnMgcHJvY2Vzc2VkLgorICovCisKK3N0YXRpYyBpbnQKK2hleFRvSW50KGNoYXIgKipwdHIsIGludCAqaW50VmFsdWUpCit7CisgIGludCBudW1DaGFycyA9IDA7CisgIGludCBoZXhWYWx1ZTsKKworICAqaW50VmFsdWUgPSAwOworCisgIHdoaWxlICgqKnB0cikKKyAgICB7CisgICAgICBoZXhWYWx1ZSA9IGhleCgqKnB0cik7CisgICAgICBpZiAoaGV4VmFsdWUgPCAwKQorCWJyZWFrOworCisgICAgICAqaW50VmFsdWUgPSAoKmludFZhbHVlIDw8IDQpIHwgaGV4VmFsdWU7CisgICAgICBudW1DaGFycyArKzsKKworICAgICAgKCpwdHIpKys7CisgICAgfQorCisgIHJldHVybiAobnVtQ2hhcnMpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIGFsbCBjb21tYW5kIHByb2Nlc2luZyBmb3IgaW50ZXJmYWNpbmcgdG8gZ2RiLiAgSXQKKyAqIHJldHVybnMgMSBpZiB5b3Ugc2hvdWxkIHNraXAgdGhlIGluc3RydWN0aW9uIGF0IHRoZSB0cmFwIGFkZHJlc3MsIDAKKyAqIG90aGVyd2lzZS4KKyAqLworCitzdGF0aWMgdm9pZAoraGFuZGxlX2V4Y2VwdGlvbiAocmVnaXN0ZXJzKQorICAgICB1bnNpZ25lZCBsb25nICpyZWdpc3RlcnM7Cit7CisgIGludCB0dDsJCQkvKiBUcmFwIHR5cGUgKi8KKyAgaW50IHNpZ3ZhbDsKKyAgaW50IGFkZHI7CisgIGludCBsZW5ndGg7CisgIGNoYXIgKnB0cjsKKyAgdW5zaWduZWQgbG9uZyAqc3A7CisgIHVuc2lnbmVkIGxvbmcgZHNyOworCisvKiBGaXJzdCwgd2UgbXVzdCBmb3JjZSBhbGwgb2YgdGhlIHdpbmRvd3MgdG8gYmUgc3BpbGxlZCBvdXQgKi8KKworICBhc20oIglzYXZlICVzcCwgLTY0LCAlc3AKKwlzYXZlICVzcCwgLTY0LCAlc3AKKwlzYXZlICVzcCwgLTY0LCAlc3AKKwlzYXZlICVzcCwgLTY0LCAlc3AKKwlzYXZlICVzcCwgLTY0LCAlc3AKKwlzYXZlICVzcCwgLTY0LCAlc3AKKwlzYXZlICVzcCwgLTY0LCAlc3AKKwlzYXZlICVzcCwgLTY0LCAlc3AKKwlyZXN0b3JlCisJcmVzdG9yZQorCXJlc3RvcmUKKwlyZXN0b3JlCisJcmVzdG9yZQorCXJlc3RvcmUKKwlyZXN0b3JlCisJcmVzdG9yZQorIik7CisKKyAgZ2V0X2luX2JyZWFrX21vZGUgKCk7CQkvKiBFbmFibGUgRFNVIHJlZ2lzdGVyIHdyaXRlcyAqLworCisgIHJlZ2lzdGVyc1tESUExXSA9IHJlYWRfYXNpICgxLCAweGZmMDApOworICByZWdpc3RlcnNbRElBMl0gPSByZWFkX2FzaSAoMSwgMHhmZjA0KTsKKyAgcmVnaXN0ZXJzW0REQTFdID0gcmVhZF9hc2kgKDEsIDB4ZmYwOCk7CisgIHJlZ2lzdGVyc1tEREEyXSA9IHJlYWRfYXNpICgxLCAweGZmMGMpOworICByZWdpc3RlcnNbRERWMV0gPSByZWFkX2FzaSAoMSwgMHhmZjEwKTsKKyAgcmVnaXN0ZXJzW0REVjJdID0gcmVhZF9hc2kgKDEsIDB4ZmYxNCk7CisgIHJlZ2lzdGVyc1tEQ1JdID0gcmVhZF9hc2kgKDEsIDB4ZmYxOCk7CisgIHJlZ2lzdGVyc1tEU1JdID0gcmVhZF9hc2kgKDEsIDB4ZmYxYyk7CisKKyAgaWYgKHJlZ2lzdGVyc1tQQ10gPT0gKHVuc2lnbmVkIGxvbmcpYnJlYWtpbnN0KQorICAgIHsKKyAgICAgIHJlZ2lzdGVyc1tQQ10gPSByZWdpc3RlcnNbTlBDXTsKKyAgICAgIHJlZ2lzdGVyc1tOUENdICs9IDQ7CisgICAgfQorICBzcCA9ICh1bnNpZ25lZCBsb25nICopcmVnaXN0ZXJzW1NQXTsKKworICBkc3IgPSAodW5zaWduZWQgbG9uZylyZWdpc3RlcnNbRFNSXTsKKyAgaWYgKGRzciAmIDB4M2MpCisgICAgdHQgPSAyNTU7CisgIGVsc2UKKyAgICB0dCA9IChyZWdpc3RlcnNbVEJSXSA+PiA0KSAmIDB4ZmY7CisKKyAgLyogcmVwbHkgdG8gaG9zdCB0aGF0IGFuIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgKi8KKyAgc2lndmFsID0gY29tcHV0ZVNpZ25hbCh0dCk7CisgIHB0ciA9IHJlbWNvbU91dEJ1ZmZlcjsKKworICAqcHRyKysgPSAnVCc7CisgICpwdHIrKyA9IGhleGNoYXJzW3NpZ3ZhbCA+PiA0XTsKKyAgKnB0cisrID0gaGV4Y2hhcnNbc2lndmFsICYgMHhmXTsKKworICAqcHRyKysgPSBoZXhjaGFyc1tQQyA+PiA0XTsKKyAgKnB0cisrID0gaGV4Y2hhcnNbUEMgJiAweGZdOworICAqcHRyKysgPSAnOic7CisgIHB0ciA9IG1lbTJoZXgoKGNoYXIgKikmcmVnaXN0ZXJzW1BDXSwgcHRyLCA0LCAwKTsKKyAgKnB0cisrID0gJzsnOworCisgICpwdHIrKyA9IGhleGNoYXJzW0ZQID4+IDRdOworICAqcHRyKysgPSBoZXhjaGFyc1tGUCAmIDB4Zl07CisgICpwdHIrKyA9ICc6JzsKKyAgcHRyID0gbWVtMmhleChzcCArIDggKyA2LCBwdHIsIDQsIDApOyAvKiBGUCAqLworICAqcHRyKysgPSAnOyc7CisKKyAgKnB0cisrID0gaGV4Y2hhcnNbU1AgPj4gNF07CisgICpwdHIrKyA9IGhleGNoYXJzW1NQICYgMHhmXTsKKyAgKnB0cisrID0gJzonOworICBwdHIgPSBtZW0yaGV4KChjaGFyICopJnNwLCBwdHIsIDQsIDApOworICAqcHRyKysgPSAnOyc7CisKKyAgKnB0cisrID0gaGV4Y2hhcnNbTlBDID4+IDRdOworICAqcHRyKysgPSBoZXhjaGFyc1tOUEMgJiAweGZdOworICAqcHRyKysgPSAnOic7CisgIHB0ciA9IG1lbTJoZXgoKGNoYXIgKikmcmVnaXN0ZXJzW05QQ10sIHB0ciwgNCwgMCk7CisgICpwdHIrKyA9ICc7JzsKKworICAqcHRyKysgPSBoZXhjaGFyc1tPNyA+PiA0XTsKKyAgKnB0cisrID0gaGV4Y2hhcnNbTzcgJiAweGZdOworICAqcHRyKysgPSAnOic7CisgIHB0ciA9IG1lbTJoZXgoKGNoYXIgKikmcmVnaXN0ZXJzW083XSwgcHRyLCA0LCAwKTsKKyAgKnB0cisrID0gJzsnOworCisgICpwdHIrKyA9IDA7CisKKyAgcHV0cGFja2V0KHJlbWNvbU91dEJ1ZmZlcik7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgcmVtY29tT3V0QnVmZmVyWzBdID0gMDsKKworICAgICAgZ2V0cGFja2V0KHJlbWNvbUluQnVmZmVyKTsKKyAgICAgIHN3aXRjaCAocmVtY29tSW5CdWZmZXJbMF0pCisJeworCWNhc2UgJz8nOgorCSAgcmVtY29tT3V0QnVmZmVyWzBdID0gJ1MnOworCSAgcmVtY29tT3V0QnVmZmVyWzFdID0gaGV4Y2hhcnNbc2lndmFsID4+IDRdOworCSAgcmVtY29tT3V0QnVmZmVyWzJdID0gaGV4Y2hhcnNbc2lndmFsICYgMHhmXTsKKwkgIHJlbWNvbU91dEJ1ZmZlclszXSA9IDA7CisJICBicmVhazsKKworCWNhc2UgJ2QnOgorCQkJCS8qIHRvZ2dsZSBkZWJ1ZyBmbGFnICovCisJICBicmVhazsKKworCWNhc2UgJ2cnOgkJLyogcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgQ1BVIHJlZ2lzdGVycyAqLworCSAgbWVtY3B5ICgmcmVnaXN0ZXJzW0wwXSwgc3AsIDE2ICogNCk7IC8qIENvcHkgTCAmIEkgcmVncyBmcm9tIHN0YWNrICovCisJICBtZW0yaGV4ICgoY2hhciAqKXJlZ2lzdGVycywgcmVtY29tT3V0QnVmZmVyLCBOVU1SRUdCWVRFUywgMCk7CisJICBicmVhazsKKworCWNhc2UgJ0cnOgkJLyogU2V0IHRoZSB2YWx1ZSBvZiBhbGwgcmVnaXN0ZXJzICovCisJY2FzZSAnUCc6CQkvKiBTZXQgdGhlIHZhbHVlIG9mIG9uZSByZWdpc3RlciAqLworCSAgeworCSAgICB1bnNpZ25lZCBsb25nICpuZXdzcCwgcHNyOworCisJICAgIHBzciA9IHJlZ2lzdGVyc1tQU1JdOworCisJICAgIHB0ciA9ICZyZW1jb21JbkJ1ZmZlclsxXTsKKworCSAgICBpZiAocmVtY29tSW5CdWZmZXJbMF0gPT0gJ1AnKQorCSAgICAgIHsKKwkJaW50IHJlZ25vOworCisJCWlmIChoZXhUb0ludCAoJnB0ciwgJnJlZ25vKQorCQkgICAgJiYgKnB0cisrID09ICc9JykKKwkJICBpZiAocmVnbm8gPj0gTDAgJiYgcmVnbm8gPD0gSTcpCisJCSAgICBoZXgybWVtIChwdHIsIHNwICsgcmVnbm8gLSBMMCwgNCwgMCk7CisJCSAgZWxzZQorCQkgICAgaGV4Mm1lbSAocHRyLCAoY2hhciAqKSZyZWdpc3RlcnNbcmVnbm9dLCA0LCAwKTsKKwkJZWxzZQorCQkgIHsKKwkJICAgIHN0cmNweSAocmVtY29tT3V0QnVmZmVyLCAiUDAxIik7CisJCSAgICBicmVhazsKKwkJICB9CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQloZXgybWVtIChwdHIsIChjaGFyICopcmVnaXN0ZXJzLCBOVU1SRUdCWVRFUywgMCk7CisJCW1lbWNweSAoc3AsICZyZWdpc3RlcnNbTDBdLCAxNiAqIDQpOyAvKiBDb3B5IEwgJiBJIHJlZ3MgdG8gc3RhY2sgKi8KKwkgICAgICB9CisKKwkgICAgLyogU2VlIGlmIHRoZSBzdGFjayBwb2ludGVyIGhhcyBtb3ZlZC4gIElmIHNvLCB0aGVuIGNvcHkgdGhlIHNhdmVkCisJICAgICAgIGxvY2FscyBhbmQgaW5zIHRvIHRoZSBuZXcgbG9jYXRpb24uICBUaGlzIGtlZXBzIHRoZSB3aW5kb3cKKwkgICAgICAgb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyByb3V0aW5lcyBoYXBweS4gICovCisKKwkgICAgbmV3c3AgPSAodW5zaWduZWQgbG9uZyAqKXJlZ2lzdGVyc1tTUF07CisJICAgIGlmIChzcCAhPSBuZXdzcCkKKwkgICAgICBzcCA9IG1lbWNweShuZXdzcCwgc3AsIDE2ICogNCk7CisKKwkgICAgLyogRG9uJ3QgYWxsb3cgQ1dQIHRvIGJlIG1vZGlmaWVkLiAqLworCisJICAgIGlmIChwc3IgIT0gcmVnaXN0ZXJzW1BTUl0pCisJICAgICAgcmVnaXN0ZXJzW1BTUl0gPSAocHNyICYgMHgxZikgfCAocmVnaXN0ZXJzW1BTUl0gJiB+MHgxZik7CisKKwkgICAgc3RyY3B5KHJlbWNvbU91dEJ1ZmZlciwiT0siKTsKKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSAnbSc6CSAgLyogbUFBLi5BQSxMTExMICBSZWFkIExMTEwgYnl0ZXMgYXQgYWRkcmVzcyBBQS4uQUEgKi8KKwkgIC8qIFRyeSB0byByZWFkICV4LCV4LiAgKi8KKworCSAgcHRyID0gJnJlbWNvbUluQnVmZmVyWzFdOworCisJICBpZiAoaGV4VG9JbnQoJnB0ciwgJmFkZHIpCisJICAgICAgJiYgKnB0cisrID09ICcsJworCSAgICAgICYmIGhleFRvSW50KCZwdHIsICZsZW5ndGgpKQorCSAgICB7CisJICAgICAgaWYgKG1lbTJoZXgoKGNoYXIgKilhZGRyLCByZW1jb21PdXRCdWZmZXIsIGxlbmd0aCwgMSkpCisJCWJyZWFrOworCisJICAgICAgc3RyY3B5IChyZW1jb21PdXRCdWZmZXIsICJFMDMiKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBzdHJjcHkocmVtY29tT3V0QnVmZmVyLCJFMDEiKTsKKwkgIGJyZWFrOworCisJY2FzZSAnTSc6IC8qIE1BQS4uQUEsTExMTDogV3JpdGUgTExMTCBieXRlcyBhdCBhZGRyZXNzIEFBLkFBIHJldHVybiBPSyAqLworCSAgLyogVHJ5IHRvIHJlYWQgJyV4LCV4OicuICAqLworCisJICBwdHIgPSAmcmVtY29tSW5CdWZmZXJbMV07CisKKwkgIGlmIChoZXhUb0ludCgmcHRyLCAmYWRkcikKKwkgICAgICAmJiAqcHRyKysgPT0gJywnCisJICAgICAgJiYgaGV4VG9JbnQoJnB0ciwgJmxlbmd0aCkKKwkgICAgICAmJiAqcHRyKysgPT0gJzonKQorCSAgICB7CisJICAgICAgaWYgKGhleDJtZW0ocHRyLCAoY2hhciAqKWFkZHIsIGxlbmd0aCwgMSkpCisJCXN0cmNweShyZW1jb21PdXRCdWZmZXIsICJPSyIpOworCSAgICAgIGVsc2UKKwkJc3RyY3B5KHJlbWNvbU91dEJ1ZmZlciwgIkUwMyIpOworCSAgICB9CisJICBlbHNlCisJICAgIHN0cmNweShyZW1jb21PdXRCdWZmZXIsICJFMDIiKTsKKwkgIGJyZWFrOworCisJY2FzZSAnYyc6ICAgIC8qIGNBQS4uQUEgICAgQ29udGludWUgYXQgYWRkcmVzcyBBQS4uQUEob3B0aW9uYWwpICovCisJICAvKiB0cnkgdG8gcmVhZCBvcHRpb25hbCBwYXJhbWV0ZXIsIHBjIHVuY2hhbmdlZCBpZiBubyBwYXJtICovCisKKwkgIHB0ciA9ICZyZW1jb21JbkJ1ZmZlclsxXTsKKwkgIGlmIChoZXhUb0ludCgmcHRyLCAmYWRkcikpCisJICAgIHsKKwkgICAgICByZWdpc3RlcnNbUENdID0gYWRkcjsKKwkgICAgICByZWdpc3RlcnNbTlBDXSA9IGFkZHIgKyA0OworCSAgICB9CisKKy8qIE5lZWQgdG8gZmx1c2ggdGhlIGluc3RydWN0aW9uIGNhY2hlIGhlcmUsIGFzIHdlIG1heSBoYXZlIGRlcG9zaXRlZCBhCisgICBicmVha3BvaW50LCBhbmQgdGhlIGljYWNoZSBwcm9iYWJseSBoYXMgbm8gd2F5IG9mIGtub3dpbmcgdGhhdCBhIGRhdGEgcmVmIHRvCisgICBzb21lIGxvY2F0aW9uIG1heSBoYXZlIGNoYW5nZWQgc29tZXRoaW5nIHRoYXQgaXMgaW4gdGhlIGluc3RydWN0aW9uIGNhY2hlLgorICovCisKKwkgIGZsdXNoX2lfY2FjaGUgKCk7CisKKwkgIGlmICghKHJlZ2lzdGVyc1tEU1JdICYgMHgxKSAvKiBEU1UgZW5hYmxlZD8gKi8KKwkgICAgICAmJiAhKHJlZ2lzdGVyc1tEQ1JdICYgMHgyMDApKSAvKiBBcmUgd2UgaW4gYnJlYWsgc3RhdGU/ICovCisJICAgIHsJCQkvKiBZZXMsIHNldCB0aGUgRFNVIHJlZ3MgKi8KKwkgICAgICB3cml0ZV9hc2kgKDEsIDB4ZmYwMCwgcmVnaXN0ZXJzW0RJQTFdKTsKKwkgICAgICB3cml0ZV9hc2kgKDEsIDB4ZmYwNCwgcmVnaXN0ZXJzW0RJQTJdKTsKKwkgICAgICB3cml0ZV9hc2kgKDEsIDB4ZmYwOCwgcmVnaXN0ZXJzW0REQTFdKTsKKwkgICAgICB3cml0ZV9hc2kgKDEsIDB4ZmYwYywgcmVnaXN0ZXJzW0REQTJdKTsKKwkgICAgICB3cml0ZV9hc2kgKDEsIDB4ZmYxMCwgcmVnaXN0ZXJzW0REVjFdKTsKKwkgICAgICB3cml0ZV9hc2kgKDEsIDB4ZmYxNCwgcmVnaXN0ZXJzW0REVjJdKTsKKwkgICAgICB3cml0ZV9hc2kgKDEsIDB4ZmYxYywgcmVnaXN0ZXJzW0RTUl0pOworCSAgICAgIHdyaXRlX2FzaSAoMSwgMHhmZjE4LCByZWdpc3RlcnNbRENSXSB8IDB4MjAwKTsgLyogQ2xlYXIgYnJlYWsgKi8KKwkgICAgfQorCisJICByZXR1cm47CisKKwkgIC8qIGtpbGwgdGhlIHByb2dyYW0gKi8KKwljYXNlICdrJyA6CQkvKiBkbyBub3RoaW5nICovCisJICBicmVhazsKKyNpZiAwCisJY2FzZSAndCc6CQkvKiBUZXN0IGZlYXR1cmUgKi8KKwkgIGFzbSAoIiBzdGQgJWYzMCxbJXNwXSIpOworCSAgYnJlYWs7CisjZW5kaWYKKwljYXNlICdyJzoJCS8qIFJlc2V0ICovCisJICBhc20gKCJjYWxsIDAKKwkJbm9wICIpOworCSAgYnJlYWs7CisKKyNpZiAwCitEaXNhYmxlZCB1bnRpbCB3ZSBjYW4gdW5zY3JldyB0aGlzIHByb3Blcmx5CisKKwljYXNlICdiJzoJICAvKiBiQkIuLi4gIFNldCBiYXVkIHJhdGUgdG8gQkIuLi4gKi8KKwkgIHsKKwkgICAgaW50IGJhdWRyYXRlOworCSAgICBleHRlcm4gdm9pZCBzZXRfdGltZXJfMygpOworCisJICAgIHB0ciA9ICZyZW1jb21JbkJ1ZmZlclsxXTsKKwkgICAgaWYgKCFoZXhUb0ludCgmcHRyLCAmYmF1ZHJhdGUpKQorCSAgICAgIHsKKwkJc3RyY3B5KHJlbWNvbU91dEJ1ZmZlciwiQjAxIik7CisJCWJyZWFrOworCSAgICAgIH0KKworCSAgICAvKiBDb252ZXJ0IGJhdWQgcmF0ZSB0byB1YXJ0IGNsb2NrIGRpdmlkZXIgKi8KKwkgICAgc3dpdGNoIChiYXVkcmF0ZSkKKwkgICAgICB7CisJICAgICAgY2FzZSAzODQwMDoKKwkJYmF1ZHJhdGUgPSAxNjsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAxOTIwMDoKKwkJYmF1ZHJhdGUgPSAzMzsKKwkJYnJlYWs7CisJICAgICAgY2FzZSA5NjAwOgorCQliYXVkcmF0ZSA9IDY1OworCQlicmVhazsKKwkgICAgICBkZWZhdWx0OgorCQlzdHJjcHkocmVtY29tT3V0QnVmZmVyLCJCMDIiKTsKKwkJZ290byB4MTsKKwkgICAgICB9CisKKwkgICAgcHV0cGFja2V0KCJPSyIpOwkvKiBBY2sgYmVmb3JlIGNoYW5naW5nIHNwZWVkICovCisJICAgIHNldF90aW1lcl8zKGJhdWRyYXRlKTsgLyogU2V0IGl0ICovCisJICB9Cit4MToJICBicmVhazsKKyNlbmRpZgorCX0JCQkvKiBzd2l0Y2ggKi8KKworICAgICAgLyogcmVwbHkgdG8gdGhlIHJlcXVlc3QgKi8KKyAgICAgIHB1dHBhY2tldChyZW1jb21PdXRCdWZmZXIpOworICAgIH0KK30KKworLyogVGhpcyBmdW5jdGlvbiB3aWxsIGdlbmVyYXRlIGEgYnJlYWtwb2ludCBleGNlcHRpb24uICBJdCBpcyB1c2VkIGF0IHRoZQorICAgYmVnaW5uaW5nIG9mIGEgcHJvZ3JhbSB0byBzeW5jIHVwIHdpdGggYSBkZWJ1Z2dlciBhbmQgY2FuIGJlIHVzZWQKKyAgIG90aGVyd2lzZSBhcyBhIHF1aWNrIG1lYW5zIHRvIHN0b3AgcHJvZ3JhbSBleGVjdXRpb24gYW5kICJicmVhayIgaW50bworICAgdGhlIGRlYnVnZ2VyLiAqLworCit2b2lkCiticmVha3BvaW50KCkKK3sKKyAgaWYgKCFpbml0aWFsaXplZCkKKyAgICByZXR1cm47CisKKyAgYXNtKCIJLmdsb2JsIF9icmVha2luc3QKKworCV9icmVha2luc3Q6IHRhIDEKKyAgICAgICIpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3NwYXJjbC10ZGVwLmMgYi9nZGIvc3BhcmNsLXRkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzliZjMwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3NwYXJjbC10ZGVwLmMKQEAgLTAsMCArMSw5NzAgQEAKKy8qIFRhcmdldCBkZXBlbmRlbnQgY29kZSBmb3IgdGhlIEZ1aml0c3UgU1BBUkNsaXRlIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAiYnJlYWtwb2ludC5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgInNlcmlhbC5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWYgKCFkZWZpbmVkKF9fR08zMl9fKSAmJiAhZGVmaW5lZChfV0lOMzIpKSB8fCBkZWZpbmVkKF9fQ1lHV0lOMzJfXykKKyNkZWZpbmUgSEFWRV9TT0NLRVRTCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCB0YXJnZXRfb3BzIHNwYXJjbGl0ZV9vcHM7CS8qIEZvcndhcmQgZGVjbCAqLworZXh0ZXJuIHN0cnVjdCB0YXJnZXRfb3BzIHJlbW90ZV9vcHM7CisKK3N0YXRpYyBjaGFyICpyZW1vdGVfdGFyZ2V0X25hbWUgPSBOVUxMOworc3RhdGljIHNlcmlhbF90IHJlbW90ZV9kZXNjID0gTlVMTDsKK3N0YXRpYyBpbnQgc2VyaWFsX2ZsYWc7CisjaWZkZWYgSEFWRV9TT0NLRVRTCitzdGF0aWMgaW50IHVkcF9mZCA9IC0xOworI2VuZGlmCisKK3N0YXRpYyBzZXJpYWxfdCBvcGVuX3R0eSBQQVJBTVMgKChjaGFyICpuYW1lKSk7CitzdGF0aWMgaW50IHNlbmRfcmVzcCBQQVJBTVMgKChzZXJpYWxfdCBkZXNjLCBjaGFyIGMpKTsKK3N0YXRpYyB2b2lkIGNsb3NlX3R0eSBQQVJBTVMgKChpbnQgaWdub3JlKSk7CisjaWZkZWYgSEFWRV9TT0NLRVRTCitzdGF0aWMgaW50IHJlY3ZfdWRwX2J1ZiBQQVJBTVMgKChpbnQgZmQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50IHRpbWVvdXQpKTsKK3N0YXRpYyBpbnQgc2VuZF91ZHBfYnVmIFBBUkFNUyAoKGludCBmZCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHNwYXJjbGl0ZV9vcGVuIFBBUkFNUyAoKGNoYXIgKm5hbWUsIGludCBmcm9tX3R0eSkpOworc3RhdGljIHZvaWQgc3BhcmNsaXRlX2Nsb3NlIFBBUkFNUyAoKGludCBxdWl0dGluZykpOworc3RhdGljIHZvaWQgZG93bmxvYWQgUEFSQU1TICgoY2hhciAqdGFyZ2V0X25hbWUsIGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSwKKwkJCSAgICAgIHZvaWQgKCp3cml0ZV9yb3V0aW5lKSAoYmZkICpmcm9tX2JmZCwKKwkJCQkJCSAgICAgYXNlY3Rpb24gKmZyb21fc2VjLAorCQkJCQkJICAgICBmaWxlX3B0ciBmcm9tX2FkZHIsCisJCQkJCQkgICAgIGJmZF92bWEgdG9fYWRkciwgaW50IGxlbiksCisJCQkgICAgICB2b2lkICgqc3RhcnRfcm91dGluZSkgKGJmZF92bWEgZW50cnkpKSk7CitzdGF0aWMgdm9pZCBzcGFyY2xpdGVfc2VyaWFsX3N0YXJ0IFBBUkFNUyAoKGJmZF92bWEgZW50cnkpKTsKK3N0YXRpYyB2b2lkIHNwYXJjbGl0ZV9zZXJpYWxfd3JpdGUgUEFSQU1TICgoYmZkICpmcm9tX2JmZCwgYXNlY3Rpb24gKmZyb21fc2VjLAorCQkJCQkgICAgZmlsZV9wdHIgZnJvbV9hZGRyLAorCQkJCQkgICAgYmZkX3ZtYSB0b19hZGRyLCBpbnQgbGVuKSk7CisjaWZkZWYgSEFWRV9TT0NLRVRTCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgY2FsY19jaGVja3N1bSBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICpidWZmZXIsCisJCQkJCSAgICAgaW50IGNvdW50KSk7CitzdGF0aWMgdm9pZCBzcGFyY2xpdGVfdWRwX3N0YXJ0IFBBUkFNUyAoKGJmZF92bWEgZW50cnkpKTsKK3N0YXRpYyB2b2lkIHNwYXJjbGl0ZV91ZHBfd3JpdGUgUEFSQU1TICgoYmZkICpmcm9tX2JmZCwgYXNlY3Rpb24gKmZyb21fc2VjLAorCQkJCQkgZmlsZV9wdHIgZnJvbV9hZGRyLCBiZmRfdm1hIHRvX2FkZHIsCisJCQkJCSBpbnQgbGVuKSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHNwYXJjbGl0ZV9kb3dubG9hZCBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSwgaW50IGZyb21fdHR5KSk7CisKKyNkZWZpbmUgRERBMl9TVVBfQVNJCQkweGIwMDAwMDAKKyNkZWZpbmUgRERBMV9TVVBfQVNJCQkweGIwMDAwCisKKyNkZWZpbmUgRERBMl9BU0lfTUFTSyAJCTB4ZmYwMDAwMDAKKyNkZWZpbmUgRERBMV9BU0lfTUFTSyAJCTB4ZmYwMDAwIAorI2RlZmluZSBESUEyX1NVUF9NT0RFIAkJMHg4MDAwCisjZGVmaW5lIERJQTFfU1VQX01PREUgCQkweDQwMDAKKyNkZWZpbmUgRERBMl9FTkFCTEUgCQkweDEwMAorI2RlZmluZSBEREExX0VOQUJMRSAJCTB4ODAKKyNkZWZpbmUgRElBMl9FTkFCTEUgCQkweDQwCisjZGVmaW5lIERJQTFfRU5BQkxFIAkJMHgyMAorI2RlZmluZSBEU0lOR0xFX1NURVAgCQkweDEwCQkvKiBub3QgdXNlZCAqLworI2RlZmluZSBERFZfVFlQRV9NQVNLIAkJMHhjCisjZGVmaW5lIEREVl9UWVBFX0xPQUQgCQkweDAKKyNkZWZpbmUgRERWX1RZUEVfU1RPUkUgCQkweDQKKyNkZWZpbmUgRERWX1RZUEVfQUNDRVNTIAkweDgKKyNkZWZpbmUgRERWX1RZUEVfQUxXQVlTCQkweGMKKyNkZWZpbmUgRERWX0NPTkQJCTB4MgorI2RlZmluZSBERFZfTUFTSwkJMHgxCisKK2ludAorc3BhcmNsaXRlX2luc2VydF93YXRjaHBvaW50IChhZGRyLCBsZW4sIHR5cGUpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBpbnQgbGVuOworICAgICBpbnQgdHlwZTsKK3sKKyAgQ09SRV9BRERSIGRjcjsKKworICBkY3IgPSByZWFkX3JlZ2lzdGVyIChEQ1JfUkVHTlVNKTsKKworICBpZiAoIShkY3IgJiBEREExX0VOQUJMRSkpCisgICAgeworICAgICAgd3JpdGVfcmVnaXN0ZXIgKEREQTFfUkVHTlVNLCBhZGRyKTsKKyAgICAgIGRjciAmPSB+KEREQTFfQVNJX01BU0sgfCBERFZfVFlQRV9NQVNLKTsKKyAgICAgIGRjciB8PSAoRERBMV9TVVBfQVNJIHwgRERBMV9FTkFCTEUpOworICAgICAgaWYgKHR5cGUgPT0gMSkKKwl7CisJICB3cml0ZV9yZWdpc3RlciAoRERWMV9SRUdOVU0sIDApOworCSAgd3JpdGVfcmVnaXN0ZXIgKEREVjJfUkVHTlVNLCAweGZmZmZmZmZmKTsKKwkgIGRjciB8PSAoRERWX1RZUEVfTE9BRCAmICh+RERWX0NPTkQgJiB+RERWX01BU0spKTsKKwl9ICAgCisgICAgICBlbHNlIGlmICh0eXBlID09IDApCisJeworCSAgd3JpdGVfcmVnaXN0ZXIgKEREVjFfUkVHTlVNLCAwKTsKKwkgIHdyaXRlX3JlZ2lzdGVyIChERFYyX1JFR05VTSwgMHhmZmZmZmZmZik7CisJICBkY3IgfD0gKEREVl9UWVBFX1NUT1JFICYgKH5ERFZfQ09ORCAmIH5ERFZfTUFTSykpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB3cml0ZV9yZWdpc3RlciAoRERWMV9SRUdOVU0sIDApOworCSAgd3JpdGVfcmVnaXN0ZXIgKEREVjJfUkVHTlVNLCAweGZmZmZmZmZmKTsKKwkgIGRjciB8PSAoRERWX1RZUEVfQUNDRVNTKTsKKwl9CisgICAgICB3cml0ZV9yZWdpc3RlciAoRENSX1JFR05VTSwgZGNyKTsKKyAgICB9CisgIGVsc2UgaWYgKCEoZGNyICYgRERBMl9FTkFCTEUpKQorICAgIHsKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChEREEyX1JFR05VTSwgYWRkcik7CisgICAgICBkY3IgJj0gfihEREEyX0FTSV9NQVNLICYgRERWX1RZUEVfTUFTSyk7CisgICAgICBkY3IgfD0gKEREQTJfU1VQX0FTSSB8IEREQTJfRU5BQkxFKTsKKyAgICAgIGlmICh0eXBlID09IDEpCisJeworCSAgd3JpdGVfcmVnaXN0ZXIgKEREVjFfUkVHTlVNLCAwKTsKKwkgIHdyaXRlX3JlZ2lzdGVyIChERFYyX1JFR05VTSwgMHhmZmZmZmZmZik7CisJICBkY3IgfD0gKEREVl9UWVBFX0xPQUQgJiB+RERWX0NPTkQgJiB+RERWX01BU0spOworCX0KKyAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMCkKKwl7CisJICB3cml0ZV9yZWdpc3RlciAoRERWMV9SRUdOVU0sIDApOworCSAgd3JpdGVfcmVnaXN0ZXIgKEREVjJfUkVHTlVNLCAweGZmZmZmZmZmKTsKKwkgIGRjciB8PSAoRERWX1RZUEVfU1RPUkUgJiB+RERWX0NPTkQgJiB+RERWX01BU0spOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB3cml0ZV9yZWdpc3RlciAoRERWMV9SRUdOVU0sIDApOworCSAgd3JpdGVfcmVnaXN0ZXIgKEREVjJfUkVHTlVNLCAweGZmZmZmZmZmKTsKKwkgIGRjciB8PSAoRERWX1RZUEVfQUNDRVNTKTsKKwl9CisgICAgICB3cml0ZV9yZWdpc3RlciAoRENSX1JFR05VTSwgZGNyKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gLTE7CisKKyAgcmV0dXJuIDA7Cit9IAorCitpbnQKK3NwYXJjbGl0ZV9yZW1vdmVfd2F0Y2hwb2ludCAoYWRkciwgbGVuLCB0eXBlKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IHR5cGU7Cit7CisgIENPUkVfQUREUiBkY3IsIGRkYTEsIGRkYTI7CisKKyAgZGNyID0gcmVhZF9yZWdpc3RlciAoRENSX1JFR05VTSk7CisgIGRkYTEgPSByZWFkX3JlZ2lzdGVyIChEREExX1JFR05VTSk7CisgIGRkYTIgPSByZWFkX3JlZ2lzdGVyIChEREEyX1JFR05VTSk7CisKKyAgaWYgKChkY3IgJiBEREExX0VOQUJMRSkgJiYgYWRkciA9PSBkZGExKQorICAgIHdyaXRlX3JlZ2lzdGVyIChEQ1JfUkVHTlVNLCAoZGNyICYgfkREQTFfRU5BQkxFKSk7CisgIGVsc2UgaWYgKChkY3IgJiBEREEyX0VOQUJMRSkgJiYgYWRkciA9PSBkZGEyKQorICAgIHdyaXRlX3JlZ2lzdGVyIChEQ1JfUkVHTlVNLCAoZGNyICYgfkREQTJfRU5BQkxFKSk7CisgIGVsc2UKKyAgICByZXR1cm4gLTE7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorc3BhcmNsaXRlX2luc2VydF9od19icmVha3BvaW50IChhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBpbnQgbGVuOworeworICBDT1JFX0FERFIgZGNyOworCisgIGRjciA9IHJlYWRfcmVnaXN0ZXIgKERDUl9SRUdOVU0pOworICAKKyAgaWYgKCEoZGNyICYgRElBMV9FTkFCTEUpKQorICAgIHsKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChESUExX1JFR05VTSwgYWRkcik7CisgICAgICB3cml0ZV9yZWdpc3RlciAoRENSX1JFR05VTSwgKGRjciB8IERJQTFfRU5BQkxFIHwgRElBMV9TVVBfTU9ERSkpOworICAgIH0KKyAgZWxzZSBpZiAoIShkY3IgJiBESUEyX0VOQUJMRSkpCisgICAgeworICAgICAgd3JpdGVfcmVnaXN0ZXIgKERJQTJfUkVHTlVNLCBhZGRyKTsKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChEQ1JfUkVHTlVNLCAoZGNyIHwgRElBMl9FTkFCTEUgfCBESUEyX1NVUF9NT0RFKSk7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAwOworfQorCitpbnQKK3NwYXJjbGl0ZV9yZW1vdmVfaHdfYnJlYWtwb2ludCAoYWRkciwgc2hhZG93KQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgaW50IHNoYWRvdzsKK3sKKyAgQ09SRV9BRERSIGRjciwgZGlhMSwgZGlhMjsKKworICBkY3IgPSByZWFkX3JlZ2lzdGVyIChEQ1JfUkVHTlVNKTsKKyAgZGlhMSA9IHJlYWRfcmVnaXN0ZXIgKERJQTFfUkVHTlVNKTsKKyAgZGlhMiA9IHJlYWRfcmVnaXN0ZXIgKERJQTJfUkVHTlVNKTsKKyAgCisgIGlmICgoZGNyICYgRElBMV9FTkFCTEUpICYmIGFkZHIgPT0gZGlhMSkKKyAgICB3cml0ZV9yZWdpc3RlciAoRENSX1JFR05VTSwgKGRjciAmIH5ESUExX0VOQUJMRSkpOworICBlbHNlIGlmICgoZGNyICYgRElBMl9FTkFCTEUpICYmIGFkZHIgPT0gZGlhMikKKyAgICB3cml0ZV9yZWdpc3RlciAoRENSX1JFR05VTSwgKGRjciAmIH5ESUEyX0VOQUJMRSkpOworICBlbHNlCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAwOworfQorCitpbnQKK3NwYXJjbGl0ZV9jaGVja193YXRjaF9yZXNvdXJjZXMgKHR5cGUsIGNudCwgb3QpCisgICAgIGludCB0eXBlOworICAgICBpbnQgY250OworICAgICBpbnQgb3Q7Cit7CisgIC8qIFdhdGNocG9pbnRzIG5vdCBzdXBwb3J0ZWQgb24gc2ltdWxhdG9yLiAgKi8KKyAgaWYgKHN0cmNtcCAodGFyZ2V0X3Nob3J0bmFtZSwgInNpbSIpID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHR5cGUgPT0gYnBfaGFyZHdhcmVfYnJlYWtwb2ludCkKKyAgICB7CisgICAgICBpZiAoVEFSR0VUX0hXX0JSRUFLX0xJTUlUID09IDApCisJcmV0dXJuIDA7CisgICAgICBlbHNlIGlmIChjbnQgPD0gVEFSR0VUX0hXX0JSRUFLX0xJTUlUKQorCXJldHVybiAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChUQVJHRVRfSFdfV0FUQ0hfTElNSVQgPT0gMCkKKwlyZXR1cm4gMDsKKyAgICAgIGVsc2UgaWYgKG90KQorCXJldHVybiAtMTsKKyAgICAgIGVsc2UgaWYgKGNudCA8PSBUQVJHRVRfSFdfV0FUQ0hfTElNSVQpCisJcmV0dXJuIDE7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKK0NPUkVfQUREUgorc3BhcmNsaXRlX3N0b3BwZWRfZGF0YV9hZGRyZXNzICgpCit7CisgIENPUkVfQUREUiBkc3IsIGRkYTEsIGRkYTI7CisKKyAgZHNyID0gcmVhZF9yZWdpc3RlciAoRFNSX1JFR05VTSk7CisgIGRkYTEgPSByZWFkX3JlZ2lzdGVyIChEREExX1JFR05VTSk7CisgIGRkYTIgPSByZWFkX3JlZ2lzdGVyIChEREEyX1JFR05VTSk7CisKKyAgaWYgKGRzciAmIDB4MTApCisgICAgcmV0dXJuIGRkYTE7CisgIGVsc2UgaWYgKGRzciAmIDB4MjApCisgICAgcmV0dXJuIGRkYTI7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKwwKK3N0YXRpYyBzZXJpYWxfdAorb3Blbl90dHkgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIHNlcmlhbF90IGRlc2M7CisKKyAgZGVzYyA9IFNFUklBTF9PUEVOIChuYW1lKTsKKyAgaWYgKCFkZXNjKQorICAgIHBlcnJvcl93aXRoX25hbWUgKG5hbWUpOworCisgIGlmIChiYXVkX3JhdGUgIT0gLTEpCisgICAgeworICAgICAgaWYgKFNFUklBTF9TRVRCQVVEUkFURSAoZGVzYywgYmF1ZF9yYXRlKSkKKwl7CisJICBTRVJJQUxfQ0xPU0UgKGRlc2MpOworCSAgcGVycm9yX3dpdGhfbmFtZSAobmFtZSk7CisJfQorICAgIH0KKworICBTRVJJQUxfUkFXIChkZXNjKTsKKworICBTRVJJQUxfRkxVU0hfSU5QVVQgKGRlc2MpOworCisgIHJldHVybiBkZXNjOworfQorCisvKiBSZWFkIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIHRoZSByZW1vdGUgZW5kLCBtYXNraW5nIGl0IGRvd24gdG8gNyBiaXRzLiAqLworCitzdGF0aWMgaW50CityZWFkY2hhciAoZGVzYywgdGltZW91dCkKKyAgICAgc2VyaWFsX3QgZGVzYzsKKyAgICAgaW50IHRpbWVvdXQ7Cit7CisgIGludCBjaDsKKyAgY2hhciBzWzEwXTsKKworICBjaCA9IFNFUklBTF9SRUFEQ0hBUiAoZGVzYywgdGltZW91dCk7CisKKyAgc3dpdGNoIChjaCkKKyAgICB7CisgICAgY2FzZSBTRVJJQUxfRU9GOgorICAgICAgZXJyb3IgKCJTUEFSQ2xpdGUgcmVtb3RlIGNvbm5lY3Rpb24gY2xvc2VkIik7CisgICAgY2FzZSBTRVJJQUxfRVJST1I6CisgICAgICBwZXJyb3Jfd2l0aF9uYW1lICgiU1BBUkNsaXRlIGNvbW11bmljYXRpb24gZXJyb3IiKTsKKyAgICBjYXNlIFNFUklBTF9USU1FT1VUOgorICAgICAgZXJyb3IgKCJTUEFSQ2xpdGUgcmVtb3RlIHRpbWVvdXQiKTsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKHJlbW90ZV9kZWJ1ZyA+IDApCisJeworCSAgc3ByaW50ZiAocywgIlslMDJ4XSIsIGNoICYgMHhmZik7CisJICBwdXRzX2RlYnVnICgicmVhZCAtLT4iLCBzLCAiPC0tIik7CisJfQorICAgICAgcmV0dXJuIGNoOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2RlYnVnX3NlcmlhbF93cml0ZSAoZGVzYywgYnVmLCBsZW4pCisgICAgIHNlcmlhbF90IGRlc2M7CisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgaW50IGxlbjsKK3sKKyAgY2hhciBzWzEwXTsKKworICBTRVJJQUxfV1JJVEUgKGRlc2MsIGJ1ZiwgbGVuKTsKKyAgaWYgKHJlbW90ZV9kZWJ1ZyA+IDApCisgICAgeworICAgICAgd2hpbGUgKGxlbi0tID4gMCkKKwl7CisJICBzcHJpbnRmIChzLCAiWyUwMnhdIiwgKmJ1ZiAmIDB4ZmYpOworCSAgcHV0c19kZWJ1ZyAoIlNlbnQgLS0+IiwgcywgIjwtLSIpOworCSAgYnVmKys7CisJfQorICAgIH0KK30KKworCitzdGF0aWMgaW50CitzZW5kX3Jlc3AgKGRlc2MsIGMpCisgICAgIHNlcmlhbF90IGRlc2M7CisgICAgIGNoYXIgYzsKK3sKKyAgZGVidWdfc2VyaWFsX3dyaXRlIChkZXNjLCAmYywgMSk7CisgIHJldHVybiByZWFkY2hhciAoZGVzYywgcmVtb3RlX3RpbWVvdXQpOworfQorCitzdGF0aWMgdm9pZAorY2xvc2VfdHR5IChpZ25vcmUpCisgICAgIGludCBpZ25vcmU7Cit7CisgIGlmICghcmVtb3RlX2Rlc2MpCisgICAgcmV0dXJuOworCisgIFNFUklBTF9DTE9TRSAocmVtb3RlX2Rlc2MpOworCisgIHJlbW90ZV9kZXNjID0gTlVMTDsKK30KKworI2lmZGVmIEhBVkVfU09DS0VUUworc3RhdGljIGludAorcmVjdl91ZHBfYnVmIChmZCwgYnVmLCBsZW4sIHRpbWVvdXQpCisgICAgIGludCBmZCwgbGVuOworICAgICB1bnNpZ25lZCBjaGFyICpidWY7CisgICAgIGludCB0aW1lb3V0OworeworICBpbnQgY2M7CisgIGZkX3NldCByZWFkZmRzOworCisgIEZEX1pFUk8gKCZyZWFkZmRzKTsKKyAgRkRfU0VUIChmZCwgJnJlYWRmZHMpOworCisgIGlmICh0aW1lb3V0ID49IDApCisgICAgeworICAgICAgc3RydWN0IHRpbWV2YWwgdGltZWJ1ZjsKKworICAgICAgdGltZWJ1Zi50dl9zZWMgPSB0aW1lb3V0OworICAgICAgdGltZWJ1Zi50dl91c2VjID0gMDsKKyAgICAgIGNjID0gc2VsZWN0IChmZCArIDEsICZyZWFkZmRzLCAwLCAwLCAmdGltZWJ1Zik7CisgICAgfQorICBlbHNlCisgICAgY2MgPSBzZWxlY3QgKGZkICsgMSwgJnJlYWRmZHMsIDAsIDAsIDApOworCisgIGlmIChjYyA9PSAwKQorICAgIHJldHVybiAwOworCisgIGlmIChjYyAhPSAxKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJyZWN2X3VkcF9idWY6IEJhZCByZXR1cm4gdmFsdWUgZnJvbSBzZWxlY3Q6Iik7CisKKyAgY2MgPSByZWN2IChmZCwgYnVmLCBsZW4sIDApOworCisgIGlmIChjYyA8IDApCisgICAgcGVycm9yX3dpdGhfbmFtZSAoIkdvdCBhbiBlcnJvciBmcm9tIHJlY3Y6ICIpOworfQorCitzdGF0aWMgaW50CitzZW5kX3VkcF9idWYgKGZkLCBidWYsIGxlbikKKyAgICAgaW50IGZkLCBsZW47CisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKK3sKKyAgaW50IGNjOworCisgIGNjID0gc2VuZCAoZmQsIGJ1ZiwgbGVuLCAwKTsKKworICBpZiAoY2MgPT0gbGVuKQorICAgIHJldHVybjsKKworICBpZiAoY2MgPCAwKQorICAgIHBlcnJvcl93aXRoX25hbWUgKCJHb3QgYW4gZXJyb3IgZnJvbSBzZW5kOiAiKTsKKworICBlcnJvciAoIlNob3J0IGNvdW50IGluIHNlbmQ6IHRyaWVkICVkLCBzZW50ICVkXG4iLCBsZW4sIGNjKTsKK30KKyNlbmRpZiAvKiBIQVZFX1NPQ0tFVFMgKi8KKworc3RhdGljIHZvaWQKK3NwYXJjbGl0ZV9vcGVuIChuYW1lLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworICBpbnQgYzsKKyAgY2hhciAqcDsKKworICBpZiAoIW5hbWUpCisgICAgZXJyb3IgKCJZb3UgbmVlZCB0byBzcGVjaWZ5IHdoYXQgZGV2aWNlIG9yIGhvc3RuYW1lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgU3BhcmNMaXRlIGJvYXJkLiIpOworCisgIHRhcmdldF9wcmVvcGVuIChmcm9tX3R0eSk7CisKKyAgdW5wdXNoX3RhcmdldCAoJnNwYXJjbGl0ZV9vcHMpOworCisgIGlmIChyZW1vdGVfdGFyZ2V0X25hbWUpCisgICAgZnJlZSAocmVtb3RlX3RhcmdldF9uYW1lKTsKKworICByZW1vdGVfdGFyZ2V0X25hbWUgPSBzdHJzYXZlIChuYW1lKTsKKworICAvKiBXZSBuZWVkIGEgJ3NlcmlhbCcgb3IgJ3VkcCcga2V5d29yZCB0byBkaXNhbWJpZ3VhdGUgaG9zdDpwb3J0LCB3aGljaCBjYW4KKyAgICAgbWVhbiBlaXRoZXIgYSBzZXJpYWwgcG9ydCBvbiBhIHRlcm1pbmFsIHNlcnZlciwgb3IgdGhlIElQIGFkZHJlc3Mgb2YgYQorICAgICBTUEFSQ2xpdGUgZGVtbyBib2FyZC4gIElmIHRoZXJlJ3Mgbm8gY29sb24sIHRoZW4gaXQgcHJldHR5IG11Y2ggaGFzIHRvIGJlCisgICAgIGEgbG9jYWwgZGV2aWNlIChleGNlcHQgZm9yIERPUy4uLiBncnJtYmxlKSAqLworCisgIHAgPSBzdHJjaHIgKG5hbWUsICcgJyk7CisKKyAgaWYgKHApCisgICAgeworICAgICAgKnArKyA9ICdcMDAwJzsKKyAgICAgIHdoaWxlICgoKnAgIT0gJ1wwMDAnKSAmJiBpc3NwYWNlICgqcCkpIHArKzsKKworICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICJzZXJpYWwiLCBzdHJsZW4gKG5hbWUpKSA9PSAwKQorCXNlcmlhbF9mbGFnID0gMTsKKyAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICJ1ZHAiLCBzdHJsZW4gKG5hbWUpKSA9PSAwKQorCXNlcmlhbF9mbGFnID0gMDsKKyAgICAgIGVsc2UKKwllcnJvciAoIk11c3Qgc3BlY2lmeSBlaXRoZXIgYHNlcmlhbCcgb3IgYHVkcCcuIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcCA9IG5hbWU7CisKKyAgICAgIGlmICghc3RyY2hyIChuYW1lLCAnOicpKQorCXNlcmlhbF9mbGFnID0gMTsJLyogTm8gY29sb24gaXMgdW5hbWJpZ3VvdXMgKGxvY2FsIGRldmljZSkgKi8KKyAgICAgIGVsc2UKKwllcnJvciAoIlVzYWdlOiB0YXJnZXQgc3BhcmNsaXRlIHNlcmlhbCAvZGV2L3R0eWJcblwKK29yOiB0YXJnZXQgc3BhcmNsaXRlIHVkcCBob3N0Iik7CisgICAgfQorCisgIGlmIChzZXJpYWxfZmxhZykKKyAgICB7CisgICAgICByZW1vdGVfZGVzYyA9IG9wZW5fdHR5IChwKTsKKworICAgICAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGNsb3NlX3R0eSwgMCk7CisKKyAgICAgIGMgPSBzZW5kX3Jlc3AgKHJlbW90ZV9kZXNjLCAweDAwKTsKKworICAgICAgaWYgKGMgIT0gMHhhYSkKKwllcnJvciAoIlVua25vd24gcmVzcG9uc2UgKDB4JXgpIGZyb20gU3BhcmNMaXRlLiAgVHJ5IHJlc2V0dGluZyB0aGUgYm9hcmQuIiwKKwkgICAgICAgYyk7CisKKyAgICAgIGMgPSBzZW5kX3Jlc3AgKHJlbW90ZV9kZXNjLCAweDU1KTsKKworICAgICAgaWYgKGMgIT0gMHg1NSkKKwllcnJvciAoIlNwYXJjbGl0ZSBhcHBlYXJzIHRvIGJlIGlsbC4iKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisjaWZkZWYgSEFWRV9TT0NLRVRTCisgICAgICBzdHJ1Y3QgaG9zdGVudCAqaGU7CisgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja2FkZHI7CisgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxMDBdOworICAgICAgaW50IGNjOworCisgICAgICAvKiBTZXR1cCB0aGUgc29ja2V0LiAgTXVzdCBiZSByYXcgVURQLiAqLworCisgICAgICBoZSA9IGdldGhvc3RieW5hbWUgKHApOworCisgICAgICBpZiAoIWhlKQorCWVycm9yICgiTm8gc3VjaCBob3N0ICVzLiIsIHApOworCisgICAgICB1ZHBfZmQgPSBzb2NrZXQgKFBGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCisgICAgICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKGNsb3NlLCB1ZHBfZmQpOworCisgICAgICBzb2NrYWRkci5zaW5fZmFtaWx5ID0gUEZfSU5FVDsKKyAgICAgIHNvY2thZGRyLnNpbl9wb3J0ID0gaHRvbnMoNzAwMCk7CisgICAgICBtZW1jcHkgKCZzb2NrYWRkci5zaW5fYWRkci5zX2FkZHIsIGhlLT5oX2FkZHIsIHNpemVvZiAoc3RydWN0IGluX2FkZHIpKTsKKworICAgICAgaWYgKGNvbm5lY3QgKHVkcF9mZCwgJnNvY2thZGRyLCBzaXplb2Yoc29ja2FkZHIpKSkKKwlwZXJyb3Jfd2l0aF9uYW1lICgiQ29ubmVjdCBmYWlsZWQiKTsKKworICAgICAgYnVmZmVyWzBdID0gMHg1OworICAgICAgYnVmZmVyWzFdID0gMDsKKworICAgICAgc2VuZF91ZHBfYnVmICh1ZHBfZmQsIGJ1ZmZlciwgMik7CS8qIFJlcXVlc3QgdmVyc2lvbiAqLworICAgICAgY2MgPSByZWN2X3VkcF9idWYgKHVkcF9mZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgNSk7IC8qIEdldCByZXNwb25zZSAqLworICAgICAgaWYgKGNjID09IDApCisJZXJyb3IgKCJTUEFSQ2xpdGUgaXNuJ3QgcmVzcG9uZGluZy4iKTsKKworICAgICAgaWYgKGNjIDwgMykKKwllcnJvciAoIlNQQVJDbGl0ZSBhcHBlYXJzIHRvIGJlIGlsbC4iKTsKKyNlbHNlCisgICAgICBlcnJvciAoIlVEUCBkb3dubG9hZGluZyBpcyBub3Qgc3VwcG9ydGVkIGZvciBET1MgaG9zdHMuIik7CisjZW5kaWYgLyogSEFWRV9TT0NLRVRTICovCisgICAgfQorCisgIHByaW50Zl91bmZpbHRlcmVkICgiW1NQQVJDbGl0ZSBhcHBlYXJzIHRvIGJlIGFsaXZlXVxuIik7CisKKyAgcHVzaF90YXJnZXQgKCZzcGFyY2xpdGVfb3BzKTsKKworICBkaXNjYXJkX2NsZWFudXBzIChvbGRfY2hhaW4pOworCisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK3NwYXJjbGl0ZV9jbG9zZSAocXVpdHRpbmcpCisgICAgIGludCBxdWl0dGluZzsKK3sKKyAgaWYgKHNlcmlhbF9mbGFnKQorICAgIGNsb3NlX3R0eSAoMCk7CisjaWZkZWYgSEFWRV9TT0NLRVRTCisgIGVsc2UKKyAgICBpZiAodWRwX2ZkICE9IC0xKQorICAgICAgY2xvc2UgKHVkcF9mZCk7CisjZW5kaWYKK30KKworI2RlZmluZSBMT0FEX0FERFJFU1MgMHg0MDAwMDAwMAorCitzdGF0aWMgdm9pZAorZG93bmxvYWQgKHRhcmdldF9uYW1lLCBhcmdzLCBmcm9tX3R0eSwgd3JpdGVfcm91dGluZSwgc3RhcnRfcm91dGluZSkKKyAgICAgY2hhciAqdGFyZ2V0X25hbWU7CisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKKyAgICAgdm9pZCAoKndyaXRlX3JvdXRpbmUpIFBBUkFNUyAoKGJmZCAqZnJvbV9iZmQsIGFzZWN0aW9uICpmcm9tX3NlYywKKwkJCQkgICAgZmlsZV9wdHIgZnJvbV9hZGRyLCBiZmRfdm1hIHRvX2FkZHIsIGludCBsZW4pKTsKKyAgICAgdm9pZCAoKnN0YXJ0X3JvdXRpbmUpIFBBUkFNUyAoKGJmZF92bWEgZW50cnkpKTsKK3sKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKyAgYXNlY3Rpb24gKnNlY3Rpb247CisgIGJmZCAqcGJmZDsKKyAgYmZkX3ZtYSBlbnRyeTsKKyAgaW50IGk7CisjZGVmaW5lIFdSSVRFU0laRSAxMDI0CisgIGNoYXIgKmZpbGVuYW1lOworICBpbnQgcXVpZXQ7CisgIGludCBub3N0YXJ0OworCisgIHF1aWV0ID0gMDsKKyAgbm9zdGFydCA9IDA7CisgIGZpbGVuYW1lID0gTlVMTDsKKworICB3aGlsZSAoKmFyZ3MgIT0gJ1wwMDAnKQorICAgIHsKKyAgICAgIGNoYXIgKmFyZzsKKworICAgICAgd2hpbGUgKGlzc3BhY2UgKCphcmdzKSkgYXJncysrOworCisgICAgICBhcmcgPSBhcmdzOworCisgICAgICB3aGlsZSAoKCphcmdzICE9ICdcMDAwJykgJiYgIWlzc3BhY2UgKCphcmdzKSkgYXJncysrOworCisgICAgICBpZiAoKmFyZ3MgIT0gJ1wwMDAnKQorCSphcmdzKysgPSAnXDAwMCc7CisKKyAgICAgIGlmICgqYXJnICE9ICctJykKKwlmaWxlbmFtZSA9IGFyZzsKKyAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGFyZywgIi1xdWlldCIsIHN0cmxlbiAoYXJnKSkgPT0gMCkKKwlxdWlldCA9IDE7CisgICAgICBlbHNlIGlmIChzdHJuY21wIChhcmcsICItbm9zdGFydCIsIHN0cmxlbiAoYXJnKSkgPT0gMCkKKwlub3N0YXJ0ID0gMTsKKyAgICAgIGVsc2UKKwllcnJvciAoInVua25vd24gb3B0aW9uIGAlcyciLCBhcmcpOworICAgIH0KKworICBpZiAoIWZpbGVuYW1lKQorICAgIGZpbGVuYW1lID0gZ2V0X2V4ZWNfZmlsZSAoMSk7CisKKyAgcGJmZCA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIGdudXRhcmdldCk7CisgIGlmIChwYmZkID09IE5VTEwpCisgICAgeworICAgICAgcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGJmZF9jbG9zZSwgcGJmZCk7CisKKyAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0IChwYmZkLCBiZmRfb2JqZWN0KSkgCisgICAgZXJyb3IgKCJcIiVzXCIgaXMgbm90IGFuIG9iamVjdCBmaWxlOiAlcyIsIGZpbGVuYW1lLAorCSAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKworICBmb3IgKHNlY3Rpb24gPSBwYmZkLT5zZWN0aW9uczsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpIAorICAgIHsKKyAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHBiZmQsIHNlY3Rpb24pICYgU0VDX0xPQUQpCisJeworCSAgYmZkX3ZtYQlzZWN0aW9uX2FkZHJlc3M7CisJICBiZmRfc2l6ZV90eXBlIHNlY3Rpb25fc2l6ZTsKKwkgIGZpbGVfcHRyCWZwdHI7CisJICBjb25zdCBjaGFyICAgKnNlY3Rpb25fbmFtZTsKKworCSAgc2VjdGlvbl9uYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUocGJmZCwgc2VjdGlvbik7CisKKwkgIHNlY3Rpb25fYWRkcmVzcyA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKHBiZmQsIHNlY3Rpb24pOworCisJICAvKiBBZGp1c3Qgc2VjdGlvbnMgZnJvbSBhLm91dCBmaWxlcywgc2luY2UgdGhleSBkb24ndAorCSAgICAgY2FycnkgdGhlaXIgYWRkcmVzc2VzIHdpdGguICAqLworCSAgaWYgKGJmZF9nZXRfZmxhdm91ciAocGJmZCkgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCisJICAgIHsKKwkgICAgICBpZiAoc3RyY21wIChzZWN0aW9uX25hbWUsICIudGV4dCIpID09IDApCisJCXNlY3Rpb25fYWRkcmVzcyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAocGJmZCk7CisJICAgICAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uX25hbWUsICIuZGF0YSIpID09IDApCisJCXsKKwkJICAvKiBSZWFkIHRoZSBmaXJzdCA4IGJ5dGVzIG9mIHRoZSBkYXRhIHNlY3Rpb24uCisJCSAgICAgVGhlcmUgc2hvdWxkIGJlIHRoZSBzdHJpbmcgJ0RhVGEnIGZvbGxvd2VkIGJ5CisJCSAgICAgYSB3b3JkIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCBzZWN0aW9uIGFkZHJlc3MuICovCisJCSAgc3RydWN0IGRhdGFfbWFya2VyCisJCSAgeworCQkgICAgY2hhciBzaWduYXR1cmVbNF07CS8qICdEYVRhJyAqLworCQkgICAgdW5zaWduZWQgY2hhciBzZGF0YVs0XTsJLyogJnNkYXRhICovCisJCSAgfSBtYXJrZXI7CisJCSAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChwYmZkLCBzZWN0aW9uLCAmbWFya2VyLCAwLAorCQkJCQkgICAgc2l6ZW9mIChtYXJrZXIpKTsKKwkJICBpZiAoc3RybmNtcCAobWFya2VyLnNpZ25hdHVyZSwgIkRhVGEiLCA0KSA9PSAwKQorCQkgICAgeworCQkgICAgICBpZiAoVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKKwkJCXNlY3Rpb25fYWRkcmVzcyA9IGJmZF9nZXRiMzIgKG1hcmtlci5zZGF0YSk7CisJCSAgICAgIGVsc2UKKwkJCXNlY3Rpb25fYWRkcmVzcyA9IGJmZF9nZXRsMzIgKG1hcmtlci5zZGF0YSk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCisJICBzZWN0aW9uX3NpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3Rpb24pOworCisJICBpZiAoIXF1aWV0KQorCSAgICBwcmludGZfZmlsdGVyZWQgKCJbTG9hZGluZyBzZWN0aW9uICVzIGF0IDB4JXggKCVkIGJ5dGVzKV1cbiIsCisJCQkgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChwYmZkLCBzZWN0aW9uKSwKKwkJCSAgICAgc2VjdGlvbl9hZGRyZXNzLAorCQkJICAgICBzZWN0aW9uX3NpemUpOworCisJICBmcHRyID0gMDsKKwkgIHdoaWxlIChzZWN0aW9uX3NpemUgPiAwKQorCSAgICB7CisJICAgICAgaW50IGNvdW50OworCSAgICAgIHN0YXRpYyBjaGFyIGluZHNbXSA9ICJ8Ly1cXCI7CisJICAgICAgc3RhdGljIGludCBrID0gMDsKKworCSAgICAgIFFVSVQ7CisKKwkgICAgICBjb3VudCA9IG1pbiAoc2VjdGlvbl9zaXplLCBXUklURVNJWkUpOworCisJICAgICAgd3JpdGVfcm91dGluZSAocGJmZCwgc2VjdGlvbiwgZnB0ciwgc2VjdGlvbl9hZGRyZXNzLCBjb3VudCk7CisKKwkgICAgICBpZiAoIXF1aWV0KQorCQl7CisJCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcciVjIiwgaW5kc1trKysgJSA0XSk7CisJCSAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwkJfQorCisJICAgICAgc2VjdGlvbl9hZGRyZXNzICs9IGNvdW50OworCSAgICAgIGZwdHIgKz0gY291bnQ7CisJICAgICAgc2VjdGlvbl9zaXplIC09IGNvdW50OworCSAgICB9CisJfQorICAgIH0KKworICBpZiAoIW5vc3RhcnQpCisgICAgeworICAgICAgZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKHBiZmQpOworCisgICAgICBpZiAoIXF1aWV0KQorCXByaW50Zl91bmZpbHRlcmVkICgiW1N0YXJ0aW5nICVzIGF0IDB4JXhdXG4iLCBmaWxlbmFtZSwgZW50cnkpOworCisgICAgICBzdGFydF9yb3V0aW5lIChlbnRyeSk7CisgICAgfQorCisgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworfQorCitzdGF0aWMgdm9pZAorc3BhcmNsaXRlX3NlcmlhbF9zdGFydCAoZW50cnkpCisgICAgIGJmZF92bWEgZW50cnk7Cit7CisgIGNoYXIgYnVmZmVyWzVdOworICBpbnQgaTsKKworICBidWZmZXJbMF0gPSAweDAzOworICBzdG9yZV91bnNpZ25lZF9pbnRlZ2VyIChidWZmZXIgKyAxLCA0LCBlbnRyeSk7CisKKyAgZGVidWdfc2VyaWFsX3dyaXRlIChyZW1vdGVfZGVzYywgYnVmZmVyLCAxICsgNCk7CisgIGkgPSByZWFkY2hhciAocmVtb3RlX2Rlc2MsIHJlbW90ZV90aW1lb3V0KTsKKyAgaWYgKGkgIT0gMHg1NSkKKyAgICBlcnJvciAoIkNhbid0IHN0YXJ0IFNwYXJjTGl0ZS4gIEVycm9yIGNvZGUgJWRcbiIsIGkpOworfQorCitzdGF0aWMgdm9pZAorc3BhcmNsaXRlX3NlcmlhbF93cml0ZSAoZnJvbV9iZmQsIGZyb21fc2VjLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGxlbikKKyAgICAgYmZkICpmcm9tX2JmZDsKKyAgICAgYXNlY3Rpb24gKmZyb21fc2VjOworICAgICBmaWxlX3B0ciBmcm9tX2FkZHI7CisgICAgIGJmZF92bWEgdG9fYWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgY2hhciBidWZmZXJbNCArIDQgKyBXUklURVNJWkVdOyAvKiBhZGRyICsgbGVuICsgZGF0YSAqLworICB1bnNpZ25lZCBjaGFyIGNoZWNrc3VtOworICBpbnQgaTsKKworICBzdG9yZV91bnNpZ25lZF9pbnRlZ2VyIChidWZmZXIsIDQsIHRvX2FkZHIpOyAvKiBBZGRyZXNzICovCisgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKGJ1ZmZlciArIDQsIDQsIGxlbik7IC8qIExlbmd0aCAqLworCisgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoZnJvbV9iZmQsIGZyb21fc2VjLCBidWZmZXIgKyA4LCBmcm9tX2FkZHIsIGxlbik7CisKKyAgY2hlY2tzdW0gPSAwOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgY2hlY2tzdW0gKz0gYnVmZmVyWzggKyBpXTsKKworICBpID0gc2VuZF9yZXNwIChyZW1vdGVfZGVzYywgMHgwMSk7CisKKyAgaWYgKGkgIT0gMHg1YSkKKyAgICBlcnJvciAoIkJhZCByZXNwb25zZSBmcm9tIGxvYWQgY29tbWFuZCAoMHgleCkiLCBpKTsKKworICBkZWJ1Z19zZXJpYWxfd3JpdGUgKHJlbW90ZV9kZXNjLCBidWZmZXIsIDQgKyA0ICsgbGVuKTsKKyAgaSA9IHJlYWRjaGFyIChyZW1vdGVfZGVzYywgcmVtb3RlX3RpbWVvdXQpOworCisgIGlmIChpICE9IGNoZWNrc3VtKQorICAgIGVycm9yICgiQmFkIGNoZWNrc3VtIGZyb20gbG9hZCBjb21tYW5kICgweCV4KSIsIGkpOworfQorCisjaWZkZWYgSEFWRV9TT0NLRVRTCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorY2FsY19jaGVja3N1bSAoYnVmZmVyLCBjb3VudCkKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICAgICBpbnQgY291bnQ7Cit7CisgIHVuc2lnbmVkIHNob3J0IGNoZWNrc3VtOworCisgIGNoZWNrc3VtID0gMDsKKyAgZm9yICg7IGNvdW50ID4gMDsgY291bnQgLT0gMiwgYnVmZmVyICs9IDIpCisgICAgY2hlY2tzdW0gKz0gKCpidWZmZXIgPDwgOCkgfCAqKGJ1ZmZlciArIDEpOworCisgIGlmIChjb3VudCAhPSAwKQorICAgIGNoZWNrc3VtICs9ICpidWZmZXIgPDwgODsKKworICByZXR1cm4gY2hlY2tzdW07Cit9CisKK3N0YXRpYyB2b2lkCitzcGFyY2xpdGVfdWRwX3N0YXJ0IChlbnRyeSkKKyAgICAgYmZkX3ZtYSBlbnRyeTsKK3sKKyAgdW5zaWduZWQgY2hhciBidWZmZXJbNl07CisgIGludCBpOworCisgIGJ1ZmZlclswXSA9IDB4MzsKKyAgYnVmZmVyWzFdID0gMDsKKyAgYnVmZmVyWzJdID0gZW50cnkgPj4gMjQ7CisgIGJ1ZmZlclszXSA9IGVudHJ5ID4+IDE2OworICBidWZmZXJbNF0gPSBlbnRyeSA+PiA4OworICBidWZmZXJbNV0gPSBlbnRyeTsKKworICBzZW5kX3VkcF9idWYgKHVkcF9mZCwgYnVmZmVyLCA2KTsgLyogU2VuZCBzdGFydCBhZGRyICovCisgIGkgPSByZWN2X3VkcF9idWYgKHVkcF9mZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgLTEpOyAvKiBHZXQgcmVzcG9uc2UgKi8KKworICBpZiAoaSA8IDEgfHwgYnVmZmVyWzBdICE9IDB4NTUpCisgICAgZXJyb3IgKCJGYWlsZWQgdG8gdGFrZSBzdGFydCBhZGRyZXNzLiIpOworfQorCitzdGF0aWMgdm9pZAorc3BhcmNsaXRlX3VkcF93cml0ZSAoZnJvbV9iZmQsIGZyb21fc2VjLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGxlbikKKyAgICAgYmZkICpmcm9tX2JmZDsKKyAgICAgYXNlY3Rpb24gKmZyb21fc2VjOworICAgICBmaWxlX3B0ciBmcm9tX2FkZHI7CisgICAgIGJmZF92bWEgdG9fYWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgdW5zaWduZWQgY2hhciBidWZmZXJbMjAwMF07CisgIHVuc2lnbmVkIHNob3J0IGNoZWNrc3VtOworICBzdGF0aWMgaW50IHBrdF9udW0gPSAwOworICBzdGF0aWMgdW5zaWduZWQgbG9uZyBvbGRfYWRkciA9IC0xOworICBpbnQgaTsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAodG9fYWRkciAhPSBvbGRfYWRkcikKKwl7CisJICBidWZmZXJbMF0gPSAweDE7CS8qIExvYWQgY29tbWFuZCAqLworCSAgYnVmZmVyWzFdID0gMHgxOwkvKiBMb2FkaW5nIGFkZHJlc3MgKi8KKwkgIGJ1ZmZlclsyXSA9IHRvX2FkZHIgPj4gMjQ7CisJICBidWZmZXJbM10gPSB0b19hZGRyID4+IDE2OworCSAgYnVmZmVyWzRdID0gdG9fYWRkciA+PiA4OworCSAgYnVmZmVyWzVdID0gdG9fYWRkcjsKKworCSAgY2hlY2tzdW0gPSAwOworCSAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkgICAgY2hlY2tzdW0gKz0gYnVmZmVyW2ldOworCSAgY2hlY2tzdW0gJj0gMHhmZjsKKworCSAgc2VuZF91ZHBfYnVmICh1ZHBfZmQsIGJ1ZmZlciwgNik7CisJICBpID0gcmVjdl91ZHBfYnVmICh1ZHBfZmQsIGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgLTEpOworCisJICBpZiAoaSA8IDEpCisJICAgIGVycm9yICgiR290IGJhY2sgc2hvcnQgY2hlY2tzdW0gZm9yIGxvYWQgYWRkci4iKTsKKworCSAgaWYgKGNoZWNrc3VtICE9IGJ1ZmZlclswXSkKKwkgICAgZXJyb3IgKCJHb3QgYmFjayBiYWQgY2hlY2tzdW0gZm9yIGxvYWQgYWRkci4iKTsKKworCSAgcGt0X251bSA9IDA7CQkvKiBMb2FkIGFkZHIgcmVzZXRzIHBhY2tldCBzZXEgIyAqLworCSAgb2xkX2FkZHIgPSB0b19hZGRyOworCX0KKworICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChmcm9tX2JmZCwgZnJvbV9zZWMsIGJ1ZmZlciArIDYsIGZyb21fYWRkciwKKwkJCQlsZW4pOworCisgICAgICBjaGVja3N1bSA9IGNhbGNfY2hlY2tzdW0gKGJ1ZmZlciArIDYsIGxlbik7CisKKyAgICAgIGJ1ZmZlclswXSA9IDB4MTsJCS8qIExvYWQgY29tbWFuZCAqLworICAgICAgYnVmZmVyWzFdID0gMHgyOwkJLyogTG9hZGluZyBkYXRhICovCisgICAgICBidWZmZXJbMl0gPSBwa3RfbnVtID4+IDg7CisgICAgICBidWZmZXJbM10gPSBwa3RfbnVtOworICAgICAgYnVmZmVyWzRdID0gY2hlY2tzdW0gPj4gODsKKyAgICAgIGJ1ZmZlcls1XSA9IGNoZWNrc3VtOworCisgICAgICBzZW5kX3VkcF9idWYgKHVkcF9mZCwgYnVmZmVyLCBsZW4gKyA2KTsKKyAgICAgIGkgPSByZWN2X3VkcF9idWYgKHVkcF9mZCwgYnVmZmVyLCBzaXplb2YgYnVmZmVyLCAzKTsKKworICAgICAgaWYgKGkgPT0gMCkKKwl7CisJICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJzZW5kX2RhdGE6IHRpbWVvdXQgc2VuZGluZyAlZCBieXRlcyB0byBhZGRyZXNzIDB4JXggcmV0cnlpbmdcbiIsIGxlbiwgdG9fYWRkcik7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmIChidWZmZXJbMF0gIT0gMHhmZikKKwllcnJvciAoIkdvdCBiYWNrIGJhZCByZXNwb25zZSBmb3IgbG9hZCBkYXRhLiIpOworCisgICAgICBvbGRfYWRkciArPSBsZW47CisgICAgICBwa3RfbnVtKys7CisKKyAgICAgIHJldHVybjsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBIQVZFX1NPQ0tFVFMgKi8KKworc3RhdGljIHZvaWQKK3NwYXJjbGl0ZV9kb3dubG9hZCAoZmlsZW5hbWUsIGZyb21fdHR5KQorICAgICBjaGFyICpmaWxlbmFtZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAoIXNlcmlhbF9mbGFnKQorI2lmZGVmIEhBVkVfU09DS0VUUworICAgIGRvd25sb2FkIChyZW1vdGVfdGFyZ2V0X25hbWUsIGZpbGVuYW1lLCBmcm9tX3R0eSwgc3BhcmNsaXRlX3VkcF93cml0ZSwKKwkgICAgICBzcGFyY2xpdGVfdWRwX3N0YXJ0KTsKKyNlbHNlCisgICAgYWJvcnQgKCk7CQkJLyogc3BhcmNsaXRlX29wZW4gc2hvdWxkIHByZXZlbnQgdGhpcyEgKi8KKyNlbmRpZgorICBlbHNlCisgICAgZG93bmxvYWQgKHJlbW90ZV90YXJnZXRfbmFtZSwgZmlsZW5hbWUsIGZyb21fdHR5LCBzcGFyY2xpdGVfc2VyaWFsX3dyaXRlLAorCSAgICAgIHNwYXJjbGl0ZV9zZXJpYWxfc3RhcnQpOworfQorDAorLyogRGVmaW5lIHRoZSB0YXJnZXQgc3Vicm91dGluZSBuYW1lcyAqLworCitzdGF0aWMgc3RydWN0IHRhcmdldF9vcHMgc3BhcmNsaXRlX29wcyA7CisKK3N0YXRpYyB2b2lkIAoraW5pdF9zcGFyY2xpdGVfb3BzKHZvaWQpCit7CisgIHNwYXJjbGl0ZV9vcHMudG9fc2hvcnRuYW1lID0gICAic3BhcmNsaXRlIjsJCQorICBzcGFyY2xpdGVfb3BzLnRvX2xvbmduYW1lID0gICAiU1BBUkNsaXRlIHJlbW90ZSB0YXJnZXQiOworICBzcGFyY2xpdGVfb3BzLnRvX2RvYyA9ICAgIlVzZSBhIHJlbW90ZSBTUEFSQ2xpdGUgdGFyZ2V0IGJvYXJkIHZpYSBhIHNlcmlhbCBsaW5lOyB1c2luZyBhIGdkYi1zcGVjaWZpYyBwcm90b2NvbC5cblwKK1NwZWNpZnkgdGhlIHNlcmlhbCBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvIChlLmcuIC9kZXYvdHR5YSkuIjsgIAorICBzcGFyY2xpdGVfb3BzLnRvX29wZW4gPSAgIHNwYXJjbGl0ZV9vcGVuOwkKKyAgc3BhcmNsaXRlX29wcy50b19jbG9zZSA9ICAgc3BhcmNsaXRlX2Nsb3NlOwkKKyAgc3BhcmNsaXRlX29wcy50b19hdHRhY2ggPSAgIDA7CQorICBzcGFyY2xpdGVfb3BzLnRvX3Bvc3RfYXR0YWNoID0gTlVMTDsKKyAgc3BhcmNsaXRlX29wcy50b19yZXF1aXJlX2F0dGFjaCA9IE5VTEw7CisgIHNwYXJjbGl0ZV9vcHMudG9fZGV0YWNoID0gICAwOworICBzcGFyY2xpdGVfb3BzLnRvX3JlcXVpcmVfZGV0YWNoID0gTlVMTDsJCisgIHNwYXJjbGl0ZV9vcHMudG9fcmVzdW1lID0gICAwOwkKKyAgc3BhcmNsaXRlX29wcy50b193YWl0ICA9ICAgMDsKKyAgc3BhcmNsaXRlX29wcy50b19wb3N0X3dhaXQgPSBOVUxMOwkJCisgIHNwYXJjbGl0ZV9vcHMudG9fZmV0Y2hfcmVnaXN0ZXJzICA9ICAgMDsKKyAgc3BhcmNsaXRlX29wcy50b19zdG9yZV9yZWdpc3RlcnMgID0gICAwOworICBzcGFyY2xpdGVfb3BzLnRvX3ByZXBhcmVfdG9fc3RvcmUgPSAgIDA7CisgIHNwYXJjbGl0ZV9vcHMudG9feGZlcl9tZW1vcnkgID0gICAwOwkJCisgIHNwYXJjbGl0ZV9vcHMudG9fZmlsZXNfaW5mbyAgPSAgIDA7CQkKKyAgc3BhcmNsaXRlX29wcy50b19pbnNlcnRfYnJlYWtwb2ludCA9ICAgMDsJCisgIHNwYXJjbGl0ZV9vcHMudG9fcmVtb3ZlX2JyZWFrcG9pbnQgPSAgIDA7CQorICBzcGFyY2xpdGVfb3BzLnRvX3Rlcm1pbmFsX2luaXQgID0gICAwOwkKKyAgc3BhcmNsaXRlX29wcy50b190ZXJtaW5hbF9pbmZlcmlvciA9ICAgMDsJCisgIHNwYXJjbGl0ZV9vcHMudG9fdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ID0gICAwOworICBzcGFyY2xpdGVfb3BzLnRvX3Rlcm1pbmFsX291cnMgID0gICAwOwkJCisgIHNwYXJjbGl0ZV9vcHMudG9fdGVybWluYWxfaW5mbyAgPSAgIDA7CQkKKyAgc3BhcmNsaXRlX29wcy50b19raWxsICA9ICAgMDsJCQkKKyAgc3BhcmNsaXRlX29wcy50b19sb2FkICA9ICAgc3BhcmNsaXRlX2Rvd25sb2FkOworICBzcGFyY2xpdGVfb3BzLnRvX2xvb2t1cF9zeW1ib2wgPSAgIDA7CQkKKyAgc3BhcmNsaXRlX29wcy50b19jcmVhdGVfaW5mZXJpb3IgPSAgIDA7CisgIHNwYXJjbGl0ZV9vcHMudG9fcG9zdF9zdGFydHVwX2luZmVyaW9yID0gTlVMTDsKKyAgc3BhcmNsaXRlX29wcy50b19hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yID0gTlVMTDsKKyAgc3BhcmNsaXRlX29wcy50b19jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yID0gTlVMTDsKKyAgc3BhcmNsaXRlX29wcy50b19wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSA9IE5VTEw7CisgIHNwYXJjbGl0ZV9vcHMudG9faW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIHNwYXJjbGl0ZV9vcHMudG9fcmVtb3ZlX2ZvcmtfY2F0Y2hwb2ludCA9IE5VTEw7CisgIHNwYXJjbGl0ZV9vcHMudG9faW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQgPSBOVUxMOworICBzcGFyY2xpdGVfb3BzLnRvX3JlbW92ZV92Zm9ya19jYXRjaHBvaW50ID0gTlVMTDsKKyAgc3BhcmNsaXRlX29wcy50b19oYXNfZm9ya2VkID0gTlVMTDsKKyAgc3BhcmNsaXRlX29wcy50b19oYXNfdmZvcmtlZCA9IE5VTEw7CisgIHNwYXJjbGl0ZV9vcHMudG9fY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjID0gTlVMTDsKKyAgc3BhcmNsaXRlX29wcy50b19wb3N0X2ZvbGxvd192Zm9yayA9IE5VTEw7CQorICBzcGFyY2xpdGVfb3BzLnRvX2luc2VydF9leGVjX2NhdGNocG9pbnQgPSBOVUxMOworICBzcGFyY2xpdGVfb3BzLnRvX3JlbW92ZV9leGVjX2NhdGNocG9pbnQgPSBOVUxMOworICBzcGFyY2xpdGVfb3BzLnRvX2hhc19leGVjZCA9IE5VTEw7CisgIHNwYXJjbGl0ZV9vcHMudG9fcmVwb3J0ZWRfZXhlY19ldmVudHNfcGVyX2V4ZWNfY2FsbCA9IE5VTEw7CisgIHNwYXJjbGl0ZV9vcHMudG9faGFzX2V4aXRlZCA9IE5VTEw7CisgIHNwYXJjbGl0ZV9vcHMudG9fbW91cm5faW5mZXJpb3IgPSAgIDA7CQorICBzcGFyY2xpdGVfb3BzLnRvX2Nhbl9ydW4gID0gICAwOwkJCisgIHNwYXJjbGl0ZV9vcHMudG9fbm90aWNlX3NpZ25hbHMgPSAgIDA7CQorICBzcGFyY2xpdGVfb3BzLnRvX3RocmVhZF9hbGl2ZSAgPSAgIDA7CQkKKyAgc3BhcmNsaXRlX29wcy50b19zdG9wICA9ICAgMDsKKyAgc3BhcmNsaXRlX29wcy50b19waWRfdG9fZXhlY19maWxlID0gTlVMTDsJCisgIHNwYXJjbGl0ZV9vcHMudG9fY29yZV9maWxlX3RvX3N5bV9maWxlID0gTlVMTDsJCQorICBzcGFyY2xpdGVfb3BzLnRvX3N0cmF0dW0gPSAgIGRvd25sb2FkX3N0cmF0dW07CisgIHNwYXJjbGl0ZV9vcHMuRE9OVF9VU0UgPSAgIDA7CQkJCisgIHNwYXJjbGl0ZV9vcHMudG9faGFzX2FsbF9tZW1vcnkgPSAgIDA7CQorICBzcGFyY2xpdGVfb3BzLnRvX2hhc19tZW1vcnkgPSAgIDA7CQkKKyAgc3BhcmNsaXRlX29wcy50b19oYXNfc3RhY2sgPSAgIDA7CQkKKyAgc3BhcmNsaXRlX29wcy50b19oYXNfcmVnaXN0ZXJzID0gICAwOwkJCisgIHNwYXJjbGl0ZV9vcHMudG9faGFzX2V4ZWN1dGlvbiA9ICAgMDsJCQorICBzcGFyY2xpdGVfb3BzLnRvX3NlY3Rpb25zID0gICAwOwkJCisgIHNwYXJjbGl0ZV9vcHMudG9fc2VjdGlvbnNfZW5kID0gICAwOwkJCisgIHNwYXJjbGl0ZV9vcHMudG9fbWFnaWMgPSAgIE9QU19NQUdJQwk7CQorfSAvKiBpbml0X3NwYXJjbGl0ZV9vcHMgKi8KKwordm9pZAorX2luaXRpYWxpemVfc3BhcmNsX3RkZXAgKCkKK3sKKyAgaW5pdF9zcGFyY2xpdGVfb3BzKCkgOworICBhZGRfdGFyZ2V0ICgmc3BhcmNsaXRlX29wcyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvc3BhcmNsZXQtcm9tLmMgYi9nZGIvc3BhcmNsZXQtcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyY2NhMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9zcGFyY2xldC1yb20uYwpAQCAtMCwwICsxLDI5NiBAQAorLyogUmVtb3RlIHRhcmdldCBnbHVlIGZvciB0aGUgU1BBUkMgU3BhcmNsZXQgUk9NIG1vbml0b3IuCisgICBDb3B5cmlnaHQgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorI2luY2x1ZGUgIm1vbml0b3IuaCIKKyNpbmNsdWRlICJzZXJpYWwuaCIKKyNpbmNsdWRlICJzcmVjLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIiAvKiBmb3IgZ2VuZXJpY19sb2FkICovCisjaW5jbHVkZSA8dGltZS5oPgorCitleHRlcm4gdm9pZCByZXBvcnRfdHJhbnNmZXJfcGVyZm9ybWFuY2UgUEFSQU1TICgodW5zaWduZWQgbG9uZywgdGltZV90LCB0aW1lX3QpKTsKKworc3RhdGljIHN0cnVjdCB0YXJnZXRfb3BzIHNwYXJjbGV0X29wczsKKworc3RhdGljIHZvaWQgc3BhcmNsZXRfb3BlbiBQQVJBTVMgKChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpKTsKKworLyogVGhpcyBhcnJheSBvZiByZWdpc3RlcnMgbmVlZCB0byBtYXRjaCB0aGUgaW5kZXhlcyB1c2VkIGJ5IEdEQi4KKyAgIFRoaXMgZXhpc3RzIGJlY2F1c2UgdGhlIHZhcmlvdXMgUk9NIG1vbml0b3JzIHVzZSBkaWZmZXJlbnQgc3RyaW5ncworICAgdGhhbiBkb2VzIEdEQiwgYW5kIGRvbid0IG5lY2Vzc2FyaWx5IHN1cHBvcnQgYWxsIHRoZSByZWdpc3RlcnMKKyAgIGVpdGhlci4gU28sIHR5cGluZyAiaW5mbyByZWcgc3AiIGJlY29tZXMgYSAicjMwIi4gICovCisKKy8qUFNSIDB4MDAwMDAwODAgIGltcGwgdmVyIGljYyBBVyBMRSBFRSBFQyBFRiBQSUwgUyBQUyBFVCBDV1AgIFdJTQorICAgICAgICAgICAgICAgIDB4MCAgMHgwIDB4MCAgMCAgMCAgMCAgMCAgMCAweDAgMSAgMCAgMCAweDAwIDB4MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwMDAwMTAKKyAgICAgICBJTlMgICAgICAgIExPQ0FMUyAgICAgICBPVVRTICAgICAgR0xPQkFMUworIDAgIDB4MDAwMDAwMDAgIDB4MDAwMDAwMDAgIDB4MDAwMDAwMDAgIDB4MDAwMDAwMDAKKyAxICAweDAwMDAwMDAwICAweDAwMDAwMDAwICAweDAwMDAwMDAwICAweDAwMDAwMDAwCisgMiAgMHgwMDAwMDAwMCAgMHgwMDAwMDAwMCAgMHgwMDAwMDAwMCAgMHgwMDAwMDAwMAorIDMgIDB4MDAwMDAwMDAgIDB4MDAwMDAwMDAgIDB4MDAwMDAwMDAgIDB4MDAwMDAwMDAKKyA0ICAweDAwMDAwMDAwICAweDAwMDAwMDAwICAweDAwMDAwMDAwICAweDAwMDAwMDAwCisgNSAgMHgwMDAwMDAwMCAgMHgwMDAwMTAwMCAgMHgwMDAwMDAwMCAgMHgwMDAwMDAwMAorIDYgIDB4MDAwMDAwMDAgIDB4MDAwMDAwMDAgIDB4MTIzZjAwMDAgIDB4MDAwMDAwMDAKKyA3ICAweDAwMDAwMDAwICAweDAwMDAwMDAwICAweDAwMDAwMDAwICAweDAwMDAwMDAwCitwYzogIDB4MTIwMTAwMDAgMHgwMDAwMDAwMCAgICB1bmltcAorbnBjOiAweDEyMDEwMDA0IDB4MDAwMDEwMDAgICAgdW5pbXAgICAgIDB4MTAwMAordGJyOiAweDAwMDAwMDAwCit5OiAgIDB4MDAwMDAwMDAKKyovCisvKiB0aGVzZSBjb3JyZXNwb25kIHRvIHRoZSBvZmZzZXRzIGZyb20gdG0tKiBmaWxlcyBmcm9tIGNvbmZpZyBkaXJlY3RvcmllcyAqLworCisvKiBpcyB3aW0gcGFydCBvZiBwc3I/PyAqLworLyogbW9uaXRvciB3YW50cyBsb3dlciBjYXNlICovCitzdGF0aWMgY2hhciAqc3BhcmNsZXRfcmVnbmFtZXNbTlVNX1JFR1NdID0gUkVHSVNURVJfTkFNRVM7CisKKworLyogRnVuY3Rpb246IHNwYXJjbGV0X3N1cHBseV9yZWdpc3RlcgorICAgSnVzdCByZXR1cm5zIHdpdGggbm8gYWN0aW9uLgorICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCwgYmVjYXVzZSBwYXJzZV9yZWdpc3Rlcl9kdW1wIChtb25pdG9yLmMpCisgICBleHBlY3RzIHRvIGJlIGFibGUgdG8gY2FsbCBpdC4gIElmIHdlIGRvbid0IHN1cHBseSBzb21ldGhpbmcsIGl0IHdpbGwKKyAgIGNhbGwgYSBudWxsIHBvaW50ZXIgYW5kIGNvcmUtZHVtcC4gIFNpbmNlIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgCisgICBhY3R1YWxseSBkbyBhbnl0aGluZywgR0RCIHdpbGwgcmVxdWVzdCB0aGUgcmVnaXN0ZXJzIGluZGl2aWR1YWxseS4gICovCisKK3N0YXRpYyB2b2lkCitzcGFyY2xldF9zdXBwbHlfcmVnaXN0ZXIgKHJlZ25hbWUsIHJlZ25hbWVsZW4sIHZhbCwgdmFsbGVuKQorICAgICBjaGFyICpyZWduYW1lOworICAgICBpbnQgcmVnbmFtZWxlbjsKKyAgICAgY2hhciAqdmFsOworICAgICBpbnQgdmFsbGVuOworeworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitzcGFyY2xldF9sb2FkIChkZXNjLCBmaWxlLCBoYXNobWFyaykKKyAgICAgc2VyaWFsX3QgZGVzYzsKKyAgICAgY2hhciAqZmlsZTsKKyAgICAgaW50IGhhc2htYXJrOworeworICBiZmQgKmFiZmQ7CisgIGFzZWN0aW9uICpzOworICBpbnQgaTsKKyAgQ09SRV9BRERSIGxvYWRfb2Zmc2V0OworICB0aW1lX3Qgc3RhcnRfdGltZSwgZW5kX3RpbWU7CisgIHVuc2lnbmVkIGxvbmcgZGF0YV9jb3VudCA9IDA7CisKKyAgLyogZW5hYmxlIHVzZXIgdG8gc3BlY2lmeSBhZGRyZXNzIGZvciBkb3dubG9hZGluZyBhcyAybmQgYXJnIHRvIGxvYWQgKi8KKworICBpID0gc3NjYW5mKGZpbGUsICIlKnMgMHglbHgiLCAmbG9hZF9vZmZzZXQpOworICBpZiAoaSA+PSAxICkgCisgICAgeworICAgICAgY2hhciAqcDsKKworICAgICAgZm9yIChwID0gZmlsZTsgKnAgIT0gJ1wwMDAnICYmICFpc3NwYWNlICgqcCk7IHArKyk7CisKKyAgICAgICpwID0gJ1wwMDAnOworICAgIH0KKyAgZWxzZQorICAgIGxvYWRfb2Zmc2V0ID0gMDsKKworICBhYmZkID0gYmZkX29wZW5yIChmaWxlLCAwKTsKKyAgaWYgKCFhYmZkKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlVuYWJsZSB0byBvcGVuIGZpbGUgJXNcbiIsIGZpbGUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkgPT0gMCkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJGaWxlIGlzIG5vdCBhbiBvYmplY3QgZmlsZVxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICAKKyAgc3RhcnRfdGltZSA9IHRpbWUgKE5VTEwpOworCisgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKKyAgICBpZiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkKKyAgICAgIHsKKwliZmRfc2l6ZV90eXBlIHNlY3Rpb25fc2l6ZTsKKwliZmRfdm1hIHZtYTsKKworCXZtYSA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHMpICsgbG9hZF9vZmZzZXQ7CisJc2VjdGlvbl9zaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcyk7CisKKwlkYXRhX2NvdW50ICs9IHNlY3Rpb25fc2l6ZTsKKworCXByaW50Zl9maWx0ZXJlZCAoIiVzXHQ6IDB4JTR4IC4uIDB4JTR4ICAiLAorCQkJIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzKSwgdm1hLAorCQkJIHZtYSArIHNlY3Rpb25fc2l6ZSk7CisJZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKworCW1vbml0b3JfcHJpbnRmICgibG9hZCBjIHIgJXggJXhcciIsIHZtYSwgc2VjdGlvbl9zaXplKTsKKworCW1vbml0b3JfZXhwZWN0ICgibG9hZDogbG9hZGluZyAiLCBOVUxMLCAwKTsKKwltb25pdG9yX2V4cGVjdCAoIlxyIiwgTlVMTCwgMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2VjdGlvbl9zaXplOyBpICs9IDIwNDgpCisJICB7CisJICAgIGludCBudW1ieXRlczsKKwkgICAgY2hhciBidWZbMjA0OF07CisKKwkgICAgbnVtYnl0ZXMgPSBtaW4gKHNpemVvZiBidWYsIHNlY3Rpb25fc2l6ZSAtIGkpOworCisJICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgYnVmLCBpLCBudW1ieXRlcyk7CisKKwkgICAgU0VSSUFMX1dSSVRFIChkZXNjLCBidWYsIG51bWJ5dGVzKTsKKworCSAgICBpZiAoaGFzaG1hcmspCisJICAgICAgeworCQlwdXRjaGFyX3VuZmlsdGVyZWQgKCcjJyk7CisJCWdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisJICAgICAgfQorCSAgfQkJCS8qIFBlci1wYWNrZXQgKG9yIFMtcmVjb3JkKSBsb29wICovCisKKwltb25pdG9yX2V4cGVjdF9wcm9tcHQgKE5VTEwsIDApOworCisJcHV0Y2hhcl91bmZpbHRlcmVkICgnXG4nKTsKKyAgICAgIH0JCQkJLyogTG9hZGFibGUgc2VjdGlvbnMgKi8KKworICBtb25pdG9yX3ByaW50ZiAoInJlZyBwYyAleFxyIiwgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSk7CisgIG1vbml0b3JfZXhwZWN0X3Byb21wdCAoTlVMTCwgMCk7CisgIG1vbml0b3JfcHJpbnRmICgicmVnIG5wYyAleFxyIiwgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSArIDQpOworICBtb25pdG9yX2V4cGVjdF9wcm9tcHQgKE5VTEwsIDApOworCisgIG1vbml0b3JfcHJpbnRmICgicnVuXHIiKTsKKworICBlbmRfdGltZSA9IHRpbWUgKE5VTEwpOworCisgIGlmIChoYXNobWFyaykgCisgICAgcHV0Y2hhcl91bmZpbHRlcmVkICgnXG4nKTsKKworICByZXBvcnRfdHJhbnNmZXJfcGVyZm9ybWFuY2UgKGRhdGFfY291bnQsIHN0YXJ0X3RpbWUsIGVuZF90aW1lKTsKKworICBwb3BfdGFyZ2V0ICgpOworICBwdXNoX3JlbW90ZV90YXJnZXQgKG1vbml0b3JfZ2V0X2Rldl9uYW1lICgpLCAxKTsKKworICByZXR1cm5fdG9fdG9wX2xldmVsIChSRVRVUk5fUVVJVCk7Cit9CisKKy8qIERlZmluZSB0aGUgbW9uaXRvciBjb21tYW5kIHN0cmluZ3MuIFNpbmNlIHRoZXNlIGFyZSBwYXNzZWQgZGlyZWN0bHkKKyAgIHRocm91Z2ggdG8gYSBwcmludGYgc3R5bGUgZnVuY3Rpb24sIHdlIG1heSBpbmNsdWRlIGZvcm1hdHRpbmcKKyAgIHN0cmluZ3MuIFdlIGFsc28gbmVlZCBhIENSIG9yIExGIG9uIHRoZSBlbmQuICAqLworCisvKiBuZWVkIHRvIHBhdXNlIHRoZSBtb25pdG9yIGZvciB0aW1pbmcgcmVhc29ucywgc28gc2xvdyBpdCBkb3duICovCisKK3N0YXRpYyBjaGFyICpzcGFyY2xldF9pbml0c1tdID0geyJcblxyXHJcbiIsIE5VTEx9OworCitzdGF0aWMgc3RydWN0IG1vbml0b3Jfb3BzIHNwYXJjbGV0X2NtZHMgOworCitzdGF0aWMgdm9pZCAKK2luaXRfc3BhcmNsZXRfY21kcyh2b2lkKQoreworICBzcGFyY2xldF9jbWRzLmZsYWdzID0gICBNT19DTFJfQlJFQUtfVVNFU19BRERSIHwKKyAgICBNT19IRVhfUFJFRklYICAgICAgICAgIHwKKyAgICBNT19OT19FQ0hPX09OX09QRU4gICAgIHwKKyAgICBNT19OT19FQ0hPX09OX1NFVE1FTSAgIHwKKyAgICBNT19SVU5fRklSU1RfVElNRSAgICAgIHwKKyAgICBNT19HRVRNRU1fUkVBRF9TSU5HTEUgOwkvKiBmbGFncyAqLworICBzcGFyY2xldF9jbWRzLmluaXQgPSAgIHNwYXJjbGV0X2luaXRzOwkJLyogSW5pdCBzdHJpbmdzICovCisgIHNwYXJjbGV0X2NtZHMuY29udCA9ICAgImNvbnRcciI7CQkJLyogY29udGludWUgY29tbWFuZCAqLworICBzcGFyY2xldF9jbWRzLnN0ZXAgPSAgICJzdGVwXHIiOwkJCS8qIHNpbmdsZSBzdGVwICovCisgIHNwYXJjbGV0X2NtZHMuc3RvcCA9ICAgIlxyIjsJCQkJLyogYnJlYWsgaW50ZXJydXB0cyB0aGUgcHJvZ3JhbSAqLworICBzcGFyY2xldF9jbWRzLnNldF9icmVhayA9ICAgIiticCAleFxyIjsJCS8qIHNldCBhIGJyZWFrcG9pbnQgKi8KKyAgc3BhcmNsZXRfY21kcy5jbHJfYnJlYWsgPSAgIi1icCAleFxyIiA7CQkvKiBjYW4ndCB1c2UgImJyIiBiZWNhdXNlIG9ubHkgMiBodyBicHMgYXJlIHN1cHBvcnRlZCAqLworICBzcGFyY2xldF9jbWRzLmNscl9hbGxfYnJlYWsgPSAgICItYnAgJXhcciI7CQkvKiBjbGVhciBhIGJyZWFrcG9pbnQgKi8KKyAgIi1icFxyIiA7CQkJLyogY2xlYXIgYWxsIGJyZWFrcG9pbnRzICovCisgIHNwYXJjbGV0X2NtZHMuZmlsbCA9ICAgImZpbGwgJXggLW4gJXggLXYgJXggLWJcciI7CS8qIGZpbGwgKHN0YXJ0IGxlbmd0aCB2YWwpICovCisgIC8qIGNhbid0IHVzZSAiZmkiIGJlY2F1c2UgaXQgdGFrZXMgd29yZHMsIG5vdCBieXRlcyAqLworICAvKiBleCBbYWRkcl0gWy1uIGNvdW50XSBbLWJ8LXN8LWxdICAgICAgICAgIGRlZmF1bHQ6IGV4IGN1ciAtbiAxIC1iICovCisgIHNwYXJjbGV0X2NtZHMuc2V0bWVtLmNtZGIgPSAgICAgImV4ICV4IC1iXHIleFxycVxyIjsJLyogc2V0bWVtLmNtZGIgKGFkZHIsIHZhbHVlKSAqLworICBzcGFyY2xldF9jbWRzLnNldG1lbS5jbWR3ID0gICAgICJleCAleCAtc1xyJXhccnFcciI7CS8qIHNldG1lbS5jbWR3IChhZGRyLCB2YWx1ZSkgKi8KKyAgc3BhcmNsZXRfY21kcy5zZXRtZW0uY21kbCA9ICAgICAiZXggJXggLWxcciV4XHJxXHIiOyAgLyogc2V0bWVtLmNtZGwgKGFkZHIsIHZhbHVlKSAqLworICBzcGFyY2xldF9jbWRzLnNldG1lbS5jbWRsbCA9ICAgICBOVUxMOwkJLyogc2V0bWVtLmNtZGxsIChhZGRyLCB2YWx1ZSkgKi8KKyAgc3BhcmNsZXRfY21kcy5zZXRtZW0ucmVzcF9kZWxpbSA9ICAgICBOVUxMOyAvKiI6ICIgKi8JLyogc2V0bWVtLnJlc3BfZGVsaW0gKi8KKyAgc3BhcmNsZXRfY21kcy5zZXRtZW0udGVybSA9ICAgICBOVUxMOyAvKiI/ICIgKi8JLyogc2V0bWVtLnRlcm0gKi8KKyAgc3BhcmNsZXRfY21kcy5zZXRtZW0udGVybV9jbWQgPSAgICAgTlVMTDsgLyoicVxyIiAqLwkvKiBzZXRtZW0udGVybV9jbWQgKi8KKyAgLyogc2luY2UgdGhlIHBhcnNpbmcgb2YgbXVsdGlwbGUgYnl0ZXMgaXMgZGlmZmljdWx0IGR1ZSB0bworICAgICBpbnRlcnNwZXJzZWQgYWRkcmVzc2VzLCB3ZSdsbCBvbmx5IHJlYWQgMSB2YWx1ZSBhdCBhIHRpbWUsCisgICAgIGV2ZW4gdGhvIHRoZXNlIGNhbiBoYW5kbGUgYSBjb3VudCAqLworICAvKiB3ZSBjYW4gdXNlIC1uIHRvIHNldCBjb3VudCB0byByZWFkLCBidXQgbWF5IGhhdmUgdG8gcGFyc2U/ICovCisgIHNwYXJjbGV0X2NtZHMuZ2V0bWVtLmNtZGIgPSAgICAgImV4ICV4IC1uIDEgLWJcciI7CS8qIGdldG1lbS5jbWRiIChhZGRyLCAjYnl0ZXMpICovCisgIHNwYXJjbGV0X2NtZHMuZ2V0bWVtLmNtZHcgPSAgICAgImV4ICV4IC1uIDEgLXNcciI7CS8qIGdldG1lbS5jbWR3IChhZGRyLCAjc3dvcmRzKSAqLworICBzcGFyY2xldF9jbWRzLmdldG1lbS5jbWRsID0gICAgICJleCAleCAtbiAxIC1sXHIiOwkvKiBnZXRtZW0uY21kbCAoYWRkciwgI3dvcmRzKSAqLworICBzcGFyY2xldF9jbWRzLmdldG1lbS5jbWRsbCA9ICAgICBOVUxMOwkJLyogZ2V0bWVtLmNtZGxsIChhZGRyLCAjZHdvcmRzKSAqLworICBzcGFyY2xldF9jbWRzLmdldG1lbS5yZXNwX2RlbGltID0gICAgICI6ICI7CQkvKiBnZXRtZW0ucmVzcF9kZWxpbSAqLworICBzcGFyY2xldF9jbWRzLmdldG1lbS50ZXJtID0gICAgIE5VTEw7CQkJLyogZ2V0bWVtLnRlcm0gKi8KKyAgc3BhcmNsZXRfY21kcy5nZXRtZW0udGVybV9jbWQgPSAgICAgTlVMTDsJCS8qIGdldG1lbS50ZXJtX2NtZCAqLworICBzcGFyY2xldF9jbWRzLnNldHJlZy5jbWQgPSAgICAgInJlZyAlcyAweCV4XHIiOwkvKiBzZXRyZWcuY21kIChuYW1lLCB2YWx1ZSkgKi8KKyAgc3BhcmNsZXRfY21kcy5zZXRyZWcucmVzcF9kZWxpbSA9ICAgICBOVUxMOwkJLyogc2V0cmVnLnJlc3BfZGVsaW0gKi8KKyAgc3BhcmNsZXRfY21kcy5zZXRyZWcudGVybSA9ICAgICBOVUxMOwkJCS8qIHNldHJlZy50ZXJtICovCisgIHNwYXJjbGV0X2NtZHMuc2V0cmVnLnRlcm1fY21kID0gIE5VTEwgOwkJLyogc2V0cmVnLnRlcm1fY21kICovCisgIHNwYXJjbGV0X2NtZHMuZ2V0cmVnLmNtZCA9ICAgICAicmVnICVzXHIiOwkJLyogZ2V0cmVnLmNtZCAobmFtZSkgKi8KKyAgc3BhcmNsZXRfY21kcy5nZXRyZWcucmVzcF9kZWxpbSA9ICAgICAiICI7CQkvKiBnZXRyZWcucmVzcF9kZWxpbSAqLworICBzcGFyY2xldF9jbWRzLmdldHJlZy50ZXJtID0gICAgIE5VTEw7CQkJLyogZ2V0cmVnLnRlcm0gKi8KKyAgc3BhcmNsZXRfY21kcy5nZXRyZWcudGVybV9jbWQgPSAgICAgTlVMTDsJCS8qIGdldHJlZy50ZXJtX2NtZCAqLworICBzcGFyY2xldF9jbWRzLmR1bXBfcmVnaXN0ZXJzID0gICAicmVnXHIiOwkJLyogZHVtcF9yZWdpc3RlcnMgKi8KKyAgc3BhcmNsZXRfY21kcy5yZWdpc3Rlcl9wYXR0ZXJuID0gICAiXFwoXFx3K1xcKT1cXChbMC05YS1mQS1GXStcXCkiOwkvKiByZWdpc3Rlcl9wYXR0ZXJuICovCisgIHNwYXJjbGV0X2NtZHMuc3VwcGx5X3JlZ2lzdGVyID0gICBzcGFyY2xldF9zdXBwbHlfcmVnaXN0ZXI7CS8qIHN1cHBseV9yZWdpc3RlciAqLworICBzcGFyY2xldF9jbWRzLmxvYWRfcm91dGluZSA9ICAgc3BhcmNsZXRfbG9hZDsJCS8qIGxvYWRfcm91dGluZSAqLworICBzcGFyY2xldF9jbWRzLmxvYWQgPSAgIE5VTEw7CQkJCS8qIGRvd25sb2FkIGNvbW1hbmQgKHNyZWNzIG9uIGNvbnNvbGUpICovCisgIHNwYXJjbGV0X2NtZHMubG9hZHJlc3AgPSAgIE5VTEw7CQkJLyogbG9hZCByZXNwb25zZSAqLworICBzcGFyY2xldF9jbWRzLnByb21wdCA9ICAgIm1vbml0b3I+IjsJCQkvKiBtb25pdG9yIGNvbW1hbmQgcHJvbXB0ICovCisgIC8qIHlpa2VzISAgZ2RiIGNvcmUgZHVtcHMgd2l0aG91dCB0aGlzIGRlbGltaXRvciEhICovCisgIHNwYXJjbGV0X2NtZHMubGluZV90ZXJtID0gICAiXHIiOwkJCS8qIGVuZC1vZi1jb21tYW5kIGRlbGltaXRvciAqLworICBzcGFyY2xldF9jbWRzLmNtZF9lbmQgPSAgIE5VTEw7CQkJLyogb3B0aW9uYWwgY29tbWFuZCB0ZXJtaW5hdG9yICovCisgIHNwYXJjbGV0X2NtZHMudGFyZ2V0ID0gICAmc3BhcmNsZXRfb3BzOwkJLyogdGFyZ2V0IG9wZXJhdGlvbnMgKi8KKyAgc3BhcmNsZXRfY21kcy5zdG9wYml0cyA9ICAgU0VSSUFMXzFfU1RPUEJJVFM7CQkvKiBudW1iZXIgb2Ygc3RvcCBiaXRzICovCisgIHNwYXJjbGV0X2NtZHMucmVnbmFtZXMgPSAgIHNwYXJjbGV0X3JlZ25hbWVzOwkJLyogcmVnaXN0ZXJzIG5hbWVzICovCisgIHNwYXJjbGV0X2NtZHMubWFnaWMgPSAgIE1PTklUT1JfT1BTX01BR0lDIDsJLyogbWFnaWMgKi8KK307CisKK3N0YXRpYyB2b2lkCitzcGFyY2xldF9vcGVuIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBtb25pdG9yX29wZW4gKGFyZ3MsICZzcGFyY2xldF9jbWRzLCBmcm9tX3R0eSk7Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX3NwYXJjbGV0ICgpCit7CisgIGludCBpOworICBpbml0X3NwYXJjbGV0X2NtZHMoKSA7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9SRUdTOyBpKyspCisgICAgaWYgKHNwYXJjbGV0X3JlZ25hbWVzW2ldWzBdID09ICdjJyB8fAorCXNwYXJjbGV0X3JlZ25hbWVzW2ldWzBdID09ICdhJykKKyAgICAgIHNwYXJjbGV0X3JlZ25hbWVzW2ldID0gMDsJCS8qIG1vbiBjYW4ndCByZXBvcnQgYyogb3IgYSogcmVncyAqLworCisgIHNwYXJjbGV0X3JlZ25hbWVzWzBdID0gMDsJCS8qIG1vbiB3b24ndCByZXBvcnQgJUcwICovCisKKyAgaW5pdF9tb25pdG9yX29wcyAoJnNwYXJjbGV0X29wcyk7CisgIHNwYXJjbGV0X29wcy50b19zaG9ydG5hbWUgPSAic3BhcmNsZXQiOyAvKiBmb3IgdGhlIHRhcmdldCBjb21tYW5kICovCisgIHNwYXJjbGV0X29wcy50b19sb25nbmFtZSA9ICJTUEFSQyBTcGFyY2xldCBtb25pdG9yIjsKKyAgLyogdXNlIFNXIGJyZWFrczsgdGFyZ2V0IG9ubHkgc3VwcG9ydHMgMiBIVyBicmVha3BvaW50cyAqLworICBzcGFyY2xldF9vcHMudG9faW5zZXJ0X2JyZWFrcG9pbnQgPSBtZW1vcnlfaW5zZXJ0X2JyZWFrcG9pbnQ7IAorICBzcGFyY2xldF9vcHMudG9fcmVtb3ZlX2JyZWFrcG9pbnQgPSBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQ7IAorCisgIHNwYXJjbGV0X29wcy50b19kb2MgPSAKKyAgICAiVXNlIGEgYm9hcmQgcnVubmluZyB0aGUgU3BhcmNsZXQgZGVidWcgbW9uaXRvci5cblwKK1NwZWNpZnkgdGhlIHNlcmlhbCBkZXZpY2UgaXQgaXMgY29ubmVjdGVkIHRvIChlLmcuIC9kZXYvdHR5YSkuIjsKKworICBzcGFyY2xldF9vcHMudG9fb3BlbiA9IHNwYXJjbGV0X29wZW47CisgIGFkZF90YXJnZXQgKCZzcGFyY2xldF9vcHMpOworfQorCmRpZmYgLS1naXQgYS9nZGIvc3BhcmNsZXQtc3R1Yi5jIGIvZ2RiL3NwYXJjbGV0LXN0dWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2Y2NzBiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3NwYXJjbGV0LXN0dWIuYwpAQCAtMCwwICsxLDEyMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwkJVEhJUyBTT0ZUV0FSRSBJUyBOT1QgQ09QWVJJR0hURUQKKworICAgSFAgb2ZmZXJzIHRoZSBmb2xsb3dpbmcgZm9yIHVzZSBpbiB0aGUgcHVibGljIGRvbWFpbi4gIEhQIG1ha2VzIG5vCisgICB3YXJyYW50eSB3aXRoIHJlZ2FyZCB0byB0aGUgc29mdHdhcmUgb3IgaXQncyBwZXJmb3JtYW5jZSBhbmQgdGhlCisgICB1c2VyIGFjY2VwdHMgdGhlIHNvZnR3YXJlICJBUyBJUyIgd2l0aCBhbGwgZmF1bHRzLgorCisgICBIUCBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgV0lUSCBSRUdBUkQKKyAgIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICAgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBIZWFkZXI6IHJlbWNvbS5jLHYgMS4zNCA5MS8wMy8wOSAxMjoyOTo0OSBnbGVubmUgRXhwICQKKyAqCisgKiAgTW9kdWxlIG5hbWU6IHJlbWNvbS5jICQKKyAqICBSZXZpc2lvbjogMS4zNCAkCisgKiAgRGF0ZTogOTEvMDMvMDkgMTI6Mjk6NDkgJAorICogIENvbnRyaWJ1dG9yOiAgICAgTGFrZSBTdGV2ZW5zIEluc3RydW1lbnQgRGl2aXNpb24kCisgKgorICogIERlc2NyaXB0aW9uOiAgICAgbG93IGxldmVsIHN1cHBvcnQgZm9yIGdkYiBkZWJ1Z2dlci4gJAorICoKKyAqICBDb25zaWRlcmF0aW9uczogIG9ubHkgd29ya3Mgb24gdGFyZ2V0IGhhcmR3YXJlICQKKyAqCisgKiAgV3JpdHRlbiBieTogICAgICBHbGVubiBFbmdlbCAkCisgKiAgTW9kdWxlU3RhdGU6ICAgICBFeHBlcmltZW50YWwgJAorICoKKyAqICBOT1RFUzogICAgICAgICAgIFNlZSBCZWxvdyAkCisgKgorICogIE1vZGlmaWVkIGZvciBTUEFSQyBieSBTdHUgR3Jvc3NtYW4sIEN5Z251cyBTdXBwb3J0LgorICogIEJhc2VkIG9uIHNwYXJjLXN0dWIuYywgaXQncyBtb2RpZmllZCBmb3IgU1BBUkNsaXRlIERlYnVnIFVuaXQgaGFyZHdhcmUKKyAqICBicmVha3BvaW50IHN1cHBvcnQgdG8gY3JlYXRlIHNwYXJjbGl0ZS1zdHViLmMsIGJ5IEt1bmcgSHN1LCBDeWdudXMgU3VwcG9ydC4KKyAqCisgKiAgVGhpcyBjb2RlIGhhcyBiZWVuIGV4dGVuc2l2ZWx5IHRlc3RlZCBvbiB0aGUgRnVqaXRzdSBTUEFSQ2xpdGUgZGVtbyBib2FyZC4KKyAqCisgKiAgVG8gZW5hYmxlIGRlYnVnZ2VyIHN1cHBvcnQsIHR3byB0aGluZ3MgbmVlZCB0byBoYXBwZW4uICBPbmUsIGEKKyAqICBjYWxsIHRvIHNldF9kZWJ1Z190cmFwcygpIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBhbGxvdyBhbnkgYnJlYWtwb2ludHMKKyAqICBvciBlcnJvciBjb25kaXRpb25zIHRvIGJlIHByb3Blcmx5IGludGVyY2VwdGVkIGFuZCByZXBvcnRlZCB0byBnZGIuCisgKiAgVHdvLCBhIGJyZWFrcG9pbnQgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkIHRvIGJlZ2luIGNvbW11bmljYXRpb24uICBUaGlzCisgKiAgaXMgbW9zdCBlYXNpbHkgYWNjb21wbGlzaGVkIGJ5IGEgY2FsbCB0byBicmVha3BvaW50KCkuICBCcmVha3BvaW50KCkKKyAqICBzaW11bGF0ZXMgYSBicmVha3BvaW50IGJ5IGV4ZWN1dGluZyBhIHRyYXAgIzEuCisgKgorICoqKioqKioqKioqKioKKyAqCisgKiAgICBUaGUgZm9sbG93aW5nIGdkYiBjb21tYW5kcyBhcmUgc3VwcG9ydGVkOgorICoKKyAqIGNvbW1hbmQgICAgICAgICAgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuIHZhbHVlCisgKgorICogICAgZyAgICAgICAgICAgICByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBDUFUgcmVnaXN0ZXJzICBoZXggZGF0YSBvciBFTk4KKyAqICAgIEcgICAgICAgICAgICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgQ1BVIHJlZ2lzdGVycyAgICAgT0sgb3IgRU5OCisgKiAgICBQICAgICAgICAgICAgIHNldCB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgQ1BVIHJlZ2lzdGVyIE9LIG9yIFAwMSAoPz8/KQorICoKKyAqICAgIG1BQS4uQUEsTExMTCAgUmVhZCBMTExMIGJ5dGVzIGF0IGFkZHJlc3MgQUEuLkFBICAgICAgaGV4IGRhdGEgb3IgRU5OCisgKiAgICBNQUEuLkFBLExMTEw6IFdyaXRlIExMTEwgYnl0ZXMgYXQgYWRkcmVzcyBBQS5BQSAgICAgIE9LIG9yIEVOTgorICoKKyAqICAgIGMgICAgICAgICAgICAgUmVzdW1lIGF0IGN1cnJlbnQgYWRkcmVzcyAgICAgICAgICAgICAgU05OICAgKCBzaWduYWwgTk4pCisgKiAgICBjQUEuLkFBICAgICAgIENvbnRpbnVlIGF0IGFkZHJlc3MgQUEuLkFBICAgICAgICAgICAgIFNOTgorICoKKyAqICAgIHMgICAgICAgICAgICAgU3RlcCBvbmUgaW5zdHJ1Y3Rpb24gICAgICAgICAgICAgICAgICAgU05OCisgKiAgICBzQUEuLkFBICAgICAgIFN0ZXAgb25lIGluc3RydWN0aW9uIGZyb20gQUEuLkFBICAgICAgIFNOTgorICoKKyAqICAgIGsgICAgICAgICAgICAga2lsbAorICoKKyAqICAgID8gICAgICAgICAgICAgV2hhdCB3YXMgdGhlIGxhc3Qgc2lndmFsID8gICAgICAgICAgICAgU05OICAgKHNpZ25hbCBOTikKKyAqCisgKiAgICBiQkIuLkJCCSAgICBTZXQgYmF1ZCByYXRlIHRvIEJCLi5CQgkJICAgT0sgb3IgQk5OLCB0aGVuIHNldHMKKyAqCQkJCQkJCSAgIGJhdWQgcmF0ZQorICoKKyAqIEFsbCBjb21tYW5kcyBhbmQgcmVzcG9uc2VzIGFyZSBzZW50IHdpdGggYSBwYWNrZXQgd2hpY2ggaW5jbHVkZXMgYQorICogY2hlY2tzdW0uICBBIHBhY2tldCBjb25zaXN0cyBvZgorICoKKyAqICQ8cGFja2V0IGluZm8+IzxjaGVja3N1bT4uCisgKgorICogd2hlcmUKKyAqIDxwYWNrZXQgaW5mbz4gOjogPGNoYXJhY3RlcnMgcmVwcmVzZW50aW5nIHRoZSBjb21tYW5kIG9yIHJlc3BvbnNlPgorICogPGNoZWNrc3VtPiAgICA6OiA8dHdvIGhleCBkaWdpdHMgY29tcHV0ZWQgYXMgbW9kdWxvIDI1NiBzdW0gb2YgPHBhY2tldGluZm8+PgorICoKKyAqIFdoZW4gYSBwYWNrZXQgaXMgcmVjZWl2ZWQsIGl0IGlzIGZpcnN0IGFja25vd2xlZGdlZCB3aXRoIGVpdGhlciAnKycgb3IgJy0nLgorICogJysnIGluZGljYXRlcyBhIHN1Y2Nlc3NmdWwgdHJhbnNmZXIuICAnLScgaW5kaWNhdGVzIGEgZmFpbGVkIHRyYW5zZmVyLgorICoKKyAqIEV4YW1wbGU6CisgKgorICogSG9zdDogICAgICAgICAgICAgICAgICBSZXBseToKKyAqICRtMCwxMCMyYSAgICAgICAgICAgICAgICskMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUjNDIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZXh0ZXJuYWwgbG93LWxldmVsIHN1cHBvcnQgcm91dGluZXMKKyAqLworCitleHRlcm4gdm9pZCBwdXREZWJ1Z0NoYXIoKTsJLyogd3JpdGUgYSBzaW5nbGUgY2hhcmFjdGVyICAgICAgKi8KK2V4dGVybiBpbnQgZ2V0RGVidWdDaGFyKCk7CS8qIHJlYWQgYW5kIHJldHVybiBhIHNpbmdsZSBjaGFyICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCVUZNQVggZGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBpbmJvdW5kL291dGJvdW5kIGJ1ZmZlcnMqLworLyogYXQgbGVhc3QgTlVNUkVHQllURVMqMiBhcmUgbmVlZGVkIGZvciByZWdpc3RlciBwYWNrZXRzICovCisjZGVmaW5lIEJVRk1BWCAyMDQ4CisKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwkvKiAhMCBtZWFucyB3ZSd2ZSBiZWVuIGluaXRpYWxpemVkICovCitzdGF0aWMgaW50IHJlbW90ZV9kZWJ1ZyA9IDA7CS8qIHR1cm4gb24gdmVyYm9zZSBkZWJ1Z2dpbmcgKi8KKworZXh0ZXJuIHZvaWQgYnJlYWtpbnN0KCk7Cit2b2lkIF9jcHJpbnQoKTsKK3N0YXRpYyB2b2lkIGh3X2JyZWFrcG9pbnQoKTsKK3N0YXRpYyB2b2lkIHNldF9tZW1fZmF1bHRfdHJhcCgpOworc3RhdGljIHZvaWQgZ2V0X2luX2JyZWFrX21vZGUoKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICptZW0yaGV4KCk7CisKK3N0YXRpYyBjb25zdCBjaGFyIGhleGNoYXJzW109IjAxMjM0NTY3ODlhYmNkZWYiOworCisjZGVmaW5lIE5VTVJFR1MgMTIxCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNhdmVkX3N0YWNrX3BvaW50ZXI7CisKKy8qIE51bWJlciBvZiBieXRlcyBvZiByZWdpc3RlcnMuICAqLworI2RlZmluZSBOVU1SRUdCWVRFUyAoTlVNUkVHUyAqIDQpCitlbnVtIHJlZ25hbWVzIHsgRzAsIEcxLCBHMiwgRzMsIEc0LCBHNSwgRzYsIEc3LAorCQlPMCwgTzEsIE8yLCBPMywgTzQsIE81LCBTUCwgTzcsCisJCUwwLCBMMSwgTDIsIEwzLCBMNCwgTDUsIEw2LCBMNywKKwkJSTAsIEkxLCBJMiwgSTMsIEk0LCBJNSwgRlAsIEk3LAorCisJCUYwLCBGMSwgRjIsIEYzLCBGNCwgRjUsIEY2LCBGNywKKwkJRjgsIEY5LCBGMTAsIEYxMSwgRjEyLCBGMTMsIEYxNCwgRjE1LAorCQlGMTYsIEYxNywgRjE4LCBGMTksIEYyMCwgRjIxLCBGMjIsIEYyMywKKwkJRjI0LCBGMjUsIEYyNiwgRjI3LCBGMjgsIEYyOSwgRjMwLCBGMzEsCisKKwkJWSwgUFNSLCBXSU0sIFRCUiwgUEMsIE5QQywgRlBTUiwgQ1BTUiwKKwkJQ0NTUiwgQ0NQUiwgQ0NDUkNSLCBDQ09SLCBDQ09CUiwgQ0NJQlIsIENDSVIsIFVOVVNFRDEsCisKKwkJQVNSMSwgQVNSMTUsIEFTUjE3LCBBU1IxOCwgQVNSMTksIEFTUjIwLCBBU1IyMSwgQVNSMjIsIAorCQkvKiB0aGUgZm9sbG93aW5nIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCAqLworCQlBV1IwLCAgQVdSMSwgIEFXUjIsICBBV1IzLCAgQVdSNCwgIEFXUjUsICBBV1I2LCAgQVdSNywgIAorCQlBV1I4LCAgQVdSOSwgIEFXUjEwLCBBV1IxMSwgQVdSMTIsIEFXUjEzLCBBV1IxNCwgQVdSMTUsICAKKwkJQVdSMTYsIEFXUjE3LCBBV1IxOCwgQVdSMTksIEFXUjIwLCBBV1IyMSwgQVdSMjIsIEFXUjIzLCAgCisJCUFXUjI0LCBBV1IyNSwgQVdSMjYsIEFXUjI3LCBBV1IyOCwgQVdSMjksIEFXUjMwLCBBV1IzMSwgIAorCQlBUFNSCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICBBU1NFTUJMWSBDT0RFIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogCQkJCQkJCQkJICAgKi8KKworZXh0ZXJuIHZvaWQgdHJhcF9sb3coKTsKKworYXNtKCIKKwkucmVzZXJ2ZSB0cmFwc3RhY2ssIDEwMDAgKiA0LCBcImJzc1wiLCA4CisKKwkuZGF0YQorCS5hbGlnbgk0CisKK2luX3RyYXBfaGFuZGxlcjoKKwkud29yZAkwCisKKwkudGV4dAorCS5hbGlnbiA0CisKKyEgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhbnkgU1BBUkMgdHJhcCAoZXhjZXB0IHdpbmRvdyBvdmVyZmxvdyBvcgorISB1bmRlcmZsb3cpIG9jY3Vycy4gIEl0IG1ha2VzIHN1cmUgdGhhdCB0aGUgaW52YWxpZCByZWdpc3RlciB3aW5kb3cgaXMgc3RpbGwKKyEgYXZhaWxhYmxlIGJlZm9yZSBqdW1waW5nIGludG8gQyBjb2RlLiAgSXQgd2lsbCBhbHNvIHJlc3RvcmUgdGhlIHdvcmxkIGlmIHlvdQorISByZXR1cm4gZnJvbSBoYW5kbGVfZXhjZXB0aW9uLgorIQorISBPbiBlbnRyeSwgdHJhcF9sb3cgZXhwZWN0cyBsMSBhbmQgbDIgdG8gY29udGFpbiBwYyBhbmQgbnBjIHJlc3BlY3Rpdmx5LgorCisJLmdsb2JsIF90cmFwX2xvdworX3RyYXBfbG93OgorCW1vdgklcHNyLCAlbDAKKwltb3YJJXdpbSwgJWwzCisKKwlzcmwJJWwzLCAlbDAsICVsNAkJISB3aW0gPj4gY3dwCisJYW5kCSVsNCwgMHhmZiwgJWw0CQkhIE1hc2sgb2ZmIHdpbmRvd3MgMjgsIDI5CisJY21wCSVsNCwgMQorCWJuZQl3aW5kb3dfZmluZQkJISBCcmFuY2ggaWYgbm90IGluIHRoZSBpbnZhbGlkIHdpbmRvdworCW5vcAorCishIEhhbmRsZSB3aW5kb3cgb3ZlcmZsb3cKKworCW1vdgklZzEsICVsNAkJISBTYXZlIGcxLCB3ZSB1c2UgaXQgdG8gaG9sZCB0aGUgd2ltCisJc3JsCSVsMywgMSwgJWcxCQkhIFJvdGF0ZSB3aW0gcmlnaHQKKwlhbmQJJWcxLCAweGZmLCAlZzEJCSEgTWFzayBvZmYgd2luZG93cyAyOCwgMjkKKwl0c3QJJWcxCisJYmcJZ29vZF93aW0JCSEgQnJhbmNoIGlmIG5ldyB3aW0gaXMgbm9uLXplcm8KKwlub3AKKworISBBdCB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIGJyaW5nIGEgMSBpbnRvIHRoZSBoaWdoIG9yZGVyIGJpdCBvZiB0aGUgd2ltLgorISBTaW5jZSB3ZSBkb24ndCB3YW50IHRvIG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZSBudW1iZXIgb2YgcmVnaXN0ZXIKKyEgd2luZG93cywgd2UgZmlndXJlIGl0IG91dCBkeW5hbWljYWxseSBzbyBhcyB0byBzZXR1cCB0aGUgd2ltIGNvcnJlY3RseS4KKworCSEgVGhlIG5vcm1hbCB3YXkgZG9lc24ndCB3b3JrIG9uIHRoZSBzcGFyY2xldCBhcyByZWdpc3RlciB3aW5kb3dzCisJISAyOCBhbmQgMjkgYXJlIHNwZWNpYWwgcHVycG9zZSB3aW5kb3dzLgorCSFub3QJJWcxCQkJISBGaWxsIGcxIHdpdGggb25lcworCSFtb3YJJWcxLCAld2ltCQkhIEZpbGwgdGhlIHdpbSB3aXRoIG9uZXMKKwkhbm9wCisJIW5vcAorCSFub3AKKwkhbW92CSV3aW0sICVnMQkJISBSZWFkIGJhY2sgdGhlIHdpbQorCSFpbmMJJWcxCQkJISBOb3cgZzEgaGFzIDEganVzdCB0byBsZWZ0IG9mIHdpbQorCSFzcmwJJWcxLCAxLCAlZzEJCSEgTm93IHB1dCAxIGF0IHRvcCBvZiB3aW0KKworCW1vdgkweDgwLCAlZzEJCSEgSGFjayBmb3Igc3BhcmNsZXQKKworCSEgVGhpcyBkb2Vzbid0IHdvcmsgb24gdGhlIHNwYXJjbGV0LgorCSFtb3YJJWcwLCAld2ltCQkhIENsZWFyIHdpbSBzbyB0aGF0IHN1YnNlcXVlbnQgc2F2ZQorCQkJCQkhICB3b24ndCB0cmFwCisJYW5kbgklbDMsIDB4ZmYsICVsNQkJISBDbGVhciB3aW0gYnV0IG5vdCB3aW5kb3dzIDI4LCAyOQorCW1vdgklbDUsICV3aW0KKwlub3AKKwlub3AKKwlub3AKKworZ29vZF93aW06CisJc2F2ZQklZzAsICVnMCwgJWcwCQkhIFNsaXAgaW50byBuZXh0IHdpbmRvdworCW1vdgklZzEsICV3aW0JCSEgSW5zdGFsbCB0aGUgbmV3IHdpbQorCisJc3RkCSVsMCwgWyVzcCArIDAgKiA0XQkhIHNhdmUgTCAmIEkgcmVnaXN0ZXJzCisJc3RkCSVsMiwgWyVzcCArIDIgKiA0XQorCXN0ZAklbDQsIFslc3AgKyA0ICogNF0KKwlzdGQJJWw2LCBbJXNwICsgNiAqIDRdCisKKwlzdGQJJWkwLCBbJXNwICsgOCAqIDRdCisJc3RkCSVpMiwgWyVzcCArIDEwICogNF0KKwlzdGQJJWk0LCBbJXNwICsgMTIgKiA0XQorCXN0ZAklaTYsIFslc3AgKyAxNCAqIDRdCisKKwlyZXN0b3JlCQkJCSEgR28gYmFjayB0byB0cmFwIHdpbmRvdy4KKwltb3YJJWw0LCAlZzEJCSEgUmVzdG9yZSAlZzEKKword2luZG93X2ZpbmU6CisJc2V0aGkJJWhpKGluX3RyYXBfaGFuZGxlciksICVsNAorCWxkCVslbG8oaW5fdHJhcF9oYW5kbGVyKSArICVsNF0sICVsNQorCXRzdAklbDUKKwliZwlyZWN1cnNpdmVfdHJhcAorCWluYwklbDUKKworCXNldAl0cmFwc3RhY2srMTAwMCo0LCAlc3AJISBTd2l0Y2ggdG8gdHJhcCBzdGFjaworCityZWN1cnNpdmVfdHJhcDoKKwlzdAklbDUsIFslbG8oaW5fdHJhcF9oYW5kbGVyKSArICVsNF0KKwlzdWIJJXNwLCgxNisxKzYrMSs4OCkqNCwlc3AgISBNYWtlIHJvb20gZm9yIGlucHV0ICYgbG9jYWxzCisgCQkJCQkhICsgaGlkZGVuIGFyZyArIGFyZyBzcGlsbAorCQkJCQkhICsgZG91Ymxld29yZCBhbGlnbm1lbnQKKwkJCQkJISArIHJlZ2lzdGVyc1sxMjFdCisKKwlzdGQJJWcwLCBbJXNwICsgKDI0ICsgMCkgKiA0XSAhIHJlZ2lzdGVyc1tHeF0KKwlzdGQJJWcyLCBbJXNwICsgKDI0ICsgMikgKiA0XQorCXN0ZAklZzQsIFslc3AgKyAoMjQgKyA0KSAqIDRdCisJc3RkCSVnNiwgWyVzcCArICgyNCArIDYpICogNF0KKworCXN0ZAklaTAsIFslc3AgKyAoMjQgKyA4KSAqIDRdICEgcmVnaXN0ZXJzW094XQorCXN0ZAklaTIsIFslc3AgKyAoMjQgKyAxMCkgKiA0XQorCXN0ZAklaTQsIFslc3AgKyAoMjQgKyAxMikgKiA0XQorCXN0ZAklaTYsIFslc3AgKyAoMjQgKyAxNCkgKiA0XQorCisJISBGUCByZWdzIChzcGFyY2xldCBkb2Vzbid0IGhhdmUgZnB1KQorCisJbW92CSV5LCAlbDQKKwltb3YJJXRiciwgJWw1CisJc3QJJWw0LCBbJXNwICsgKDI0ICsgNjQpICogNF0gISBZCisJc3QJJWwwLCBbJXNwICsgKDI0ICsgNjUpICogNF0gISBQU1IKKwlzdAklbDMsIFslc3AgKyAoMjQgKyA2NikgKiA0XSAhIFdJTQorCXN0CSVsNSwgWyVzcCArICgyNCArIDY3KSAqIDRdICEgVEJSCisJc3QJJWwxLCBbJXNwICsgKDI0ICsgNjgpICogNF0gISBQQworCXN0CSVsMiwgWyVzcCArICgyNCArIDY5KSAqIDRdICEgTlBDCisJCQkJCSEgQ1BTUiBhbmQgRlBTUiBub3QgaW1wbAorCW9yCSVsMCwgMHhmMjAsICVsNAorCW1vdgklbDQsICVwc3IJCSEgVHVybiBvbiB0cmFwcywgZGlzYWJsZSBpbnRlcnJ1cHRzCisJbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKworISBTYXZlIGNvcHJvY2Vzc29yIHN0YXRlLgorISBTZWUgU0svZGVtby9oZGxjX2RlbW8vbGRjX3N3YXBfY29udGV4dC5TLgorCisJbW92CSVwc3IsICVsMAorCXNldGhpCSVoaSgweDIwMDApLCAlbDUJCSEgRUMgYml0IGluIFBTUgorCW9yCSVsNSwgJWwwLCAlbDUKKwltb3YJJWw1LCAlcHNyCQkJISBlbmFibGUgY29wcm9jZXNzb3IKKwlub3AJCQkhIDMgbm9wcyBhZnRlciB3cml0ZSB0byAlcHNyIChuZWVkZWQ/KQorCW5vcAorCW5vcAorCWNyZGN4dAklY2NzciwgJWwxCQkJISBjYXB0dXJlIENDU1IKKwltb3YJMHg2LCAlbDIKKwljd3JjeHQJJWwyLCAlY2NzcgkhIHNldCBDQ1Agc3RhdGUgbWFjaGluZSBmb3IgQ0NGUgorCWNyZGN4dAklY2NmciwgJWwyCQkJISBjYXB0dXJlIENDT1IKKwljd3JjeHQJJWwyLCAlY2NmcgkJCSEgdGlja2xlICBDQ0ZSCisJY3JkY3h0CSVjY2ZyLCAlbDMJCQkhIGNhcHR1cmUgQ0NPQlIKKwljd3JjeHQJJWwzLCAlY2NmcgkJCSEgdGlja2xlICBDQ0ZSCisJY3JkY3h0CSVjY2ZyLCAlbDQJCQkhIGNhcHR1cmUgQ0NJQlIKKwljd3JjeHQJJWw0LCAlY2NmcgkJCSEgdGlja2xlICBDQ0ZSCisJY3JkY3h0CSVjY2ZyLCAlbDUJCQkhIGNhcHR1cmUgQ0NJUgorCWN3cmN4dAklbDUsICVjY2ZyCQkJISB0aWNrbGUgIENDRlIKKwljcmRjeHQJJWNjcHIsICVsNgkJCSEgY2FwdHVyZSBDQ1BSCisJY3JkY3h0CSVjY2NyY3IsICVsNwkJCSEgY2FwdHVyZSBDQ0NSQ1IKKwlzdAklbDEsIFslc3AgKyAoMjQgKyA3MikgKiA0XQkhIHNhdmUgQ0NTUgorCXN0CSVsMiwgWyVzcCArICgyNCArIDc1KSAqIDRdCSEgc2F2ZSBDQ09SCisJc3QJJWwzLCBbJXNwICsgKDI0ICsgNzYpICogNF0JISBzYXZlIENDT0JSCisJc3QJJWw0LCBbJXNwICsgKDI0ICsgNzcpICogNF0JISBzYXZlIENDSUJSCisJc3QJJWw1LCBbJXNwICsgKDI0ICsgNzgpICogNF0JISBzYXZlIENDSVIKKwlzdAklbDYsIFslc3AgKyAoMjQgKyA3MykgKiA0XQkhIHNhdmUgQ0NQUgorCXN0CSVsNywgWyVzcCArICgyNCArIDc0KSAqIDRdCSEgc2F2ZSBDQ0NSQ1IKKwltb3YJJWwwLCAlcHNyIAkJCSEgcmVzdG9yZSBvcmlnaW5hbCBQU1IKKwlub3AJCQkhIDMgbm9wcyBhZnRlciB3cml0ZSB0byAlcHNyIChuZWVkZWQ/KQorCW5vcAorCW5vcAorCishIEVuZCBvZiBzYXZpbmcgY29wcm9jZXNzb3Igc3RhdGUuCishIFNhdmUgYXNyIHJlZ3MKKworISBQYXJ0IG9mIHRoaXMgaXMgc2lsbHkgLS0gd2Ugc2hvdWxkIG5vdCBkaXNwbGF5IEFTUjE1IG9yIEFTUjE5IGF0IGFsbC4KKworCXNldGhpCSVoaSgweDAxMDAwMDAwKSwgJWw2CisJc3QJJWw2LCBbJXNwICsgKDI0ICsgODEpICogNF0JISBBU1IxNSA9PSBOT1AKKwlzZXRoaQklaGkoMHhkZWFkYzBkZSksICVsNgorCW9yCSVsNiwgJWxvKDB4ZGVhZGMwZGUpLCAlbDYKKwlzdAklbDYsIFslc3AgKyAoMjQgKyA4NCkgKiA0XQkhIEFTUjE5ID09IERFQURDMERFCisKKwlyZAklYXNyMSwgJWw0CisJc3QJJWw0LCBbJXNwICsgKDI0ICsgODApICogNF0KKyEJcmQJJWFzcjE1LCAlbDQJCQkhIG11c3Qgbm90IHJlYWQgQVNSMTUKKyEJc3QJJWw0LCBbJXNwICsgKDI0ICsgODEpICogNF0JISAoaWxsZWdhbCBpbnN0ciB0cmFwKQorCXJkCSVhc3IxNywgJWw0CisJc3QJJWw0LCBbJXNwICsgKDI0ICsgODIpICogNF0KKwlyZAklYXNyMTgsICVsNAorCXN0CSVsNCwgWyVzcCArICgyNCArIDgzKSAqIDRdCishCXJkCSVhc3IxOSwgJWw0CQkJISBtdXN0IG5vdCByZWFkIGFzcjE5CishCXN0CSVsNCwgWyVzcCArICgyNCArIDg0KSAqIDRdCSEgKGhhbHRzIHRoZSBDUFUpCisJcmQJJWFzcjIwLCAlbDQKKwlzdAklbDQsIFslc3AgKyAoMjQgKyA4NSkgKiA0XQorCXJkCSVhc3IyMSwgJWw0CisJc3QJJWw0LCBbJXNwICsgKDI0ICsgODYpICogNF0KKwlyZAklYXNyMjIsICVsNAorCXN0CSVsNCwgWyVzcCArICgyNCArIDg3KSAqIDRdCisKKyEgRW5kIG9mIHNhdmluZyBhc3IgcmVncworCisJY2FsbAlfaGFuZGxlX2V4Y2VwdGlvbgorCWFkZAklc3AsIDI0ICogNCwgJW8wCSEgUGFzcyBhZGRyZXNzIG9mIHJlZ2lzdGVycworCishIFJlbG9hZCBhbGwgb2YgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZW4ndCBvbiB0aGUgc3RhY2sKKworCWxkCVslc3AgKyAoMjQgKyAxKSAqIDRdLCAlZzEgISByZWdpc3RlcnNbR3hdCisJbGRkCVslc3AgKyAoMjQgKyAyKSAqIDRdLCAlZzIKKwlsZGQJWyVzcCArICgyNCArIDQpICogNF0sICVnNAorCWxkZAlbJXNwICsgKDI0ICsgNikgKiA0XSwgJWc2CisKKwlsZGQJWyVzcCArICgyNCArIDgpICogNF0sICVpMCAhIHJlZ2lzdGVyc1tPeF0KKwlsZGQJWyVzcCArICgyNCArIDEwKSAqIDRdLCAlaTIKKwlsZGQJWyVzcCArICgyNCArIDEyKSAqIDRdLCAlaTQKKwlsZGQJWyVzcCArICgyNCArIDE0KSAqIDRdLCAlaTYKKworCSEgRlAgcmVncyAoc3BhcmNsZXQgZG9lc24ndCBoYXZlIGZwdSkKKworISBVcGRhdGUgdGhlIGNvcHJvY2Vzc29yIHJlZ2lzdGVycy4KKyEgU2VlIFNLL2RlbW8vaGRsY19kZW1vL2xkY19zd2FwX2NvbnRleHQuUy4KKworCW1vdgklcHNyLCAlbDAKKwlzZXRoaQklaGkoMHgyMDAwKSwgJWw1CQkhIEVDIGJpdCBpbiBQU1IKKwlvcgklbDUsICVsMCwgJWw1CisJbW92CSVsNSwgJXBzcgkJCSEgZW5hYmxlIGNvcHJvY2Vzc29yCisJbm9wCQkJISAzIG5vcHMgYWZ0ZXIgd3JpdGUgdG8gJXBzciAobmVlZGVkPykKKwlub3AKKwlub3AKKworCW1vdiAweDYsICVsMgorCWN3cmN4dAklbDIsICVjY3NyCSEgc2V0IENDUCBzdGF0ZSBtYWNoaW5lIGZvciBDQ0ZSCisKKwlsZAlbJXNwICsgKDI0ICsgNzIpICogNF0sICVsMQkhIHNhdmVkIENDU1IKKwlsZAlbJXNwICsgKDI0ICsgNzUpICogNF0sICVsMgkhIHNhdmVkIENDT1IKKwlsZAlbJXNwICsgKDI0ICsgNzYpICogNF0sICVsMwkhIHNhdmVkIENDT0JSCisJbGQJWyVzcCArICgyNCArIDc3KSAqIDRdLCAlbDQJISBzYXZlZCBDQ0lCUgorCWxkCVslc3AgKyAoMjQgKyA3OCkgKiA0XSwgJWw1CSEgc2F2ZWQgQ0NJUgorCWxkCVslc3AgKyAoMjQgKyA3MykgKiA0XSwgJWw2CSEgc2F2ZWQgQ0NQUgorCWxkCVslc3AgKyAoMjQgKyA3NCkgKiA0XSwgJWw3CSEgc2F2ZWQgQ0NDUkNSCisKKwljd3JjeHQJJWwyLCAlY2NmcgkJCSEgcmVzdG9yZSBDQ09SCisJY3dyY3h0CSVsMywgJWNjZnIJCQkhIHJlc3RvcmUgQ0NPQlIKKwljd3JjeHQJJWw0LCAlY2NmcgkJCSEgcmVzdG9yZSBDQ0lCUgorCWN3cmN4dAklbDUsICVjY2ZyCQkJISByZXN0b3JlIENDSVIKKwljd3JjeHQJJWw2LCAlY2NwcgkJCSEgcmVzdG9yZSBDQ1BSCisJY3dyY3h0CSVsNywgJWNjY3JjcgkJCSEgcmVzdG9yZSBDQ0NSQ1IKKwljd3JjeHQJJWwxLCAlY2NzcgkJCSEgcmVzdG9yZSBDQ1NSCisKKwltb3YgJWwwLCAlcHNyCQkJCSEgcmVzdG9yZSBQU1IKKwlub3AJCSEgMyBub3BzIGFmdGVyIHdyaXRlIHRvICVwc3IgKG5lZWRlZD8pCisJbm9wCisJbm9wCisKKyEgRW5kIG9mIGNvcHJvY2Vzc29yIGhhbmRsaW5nIHN0dWZmLgorISBVcGRhdGUgYXNyIHJlZ3MKKworCWxkCVslc3AgKyAoMjQgKyA4MCkgKiA0XSwgJWw0CisJd3IJJWw0LCAlYXNyMQorIQlsZAlbJXNwICsgKDI0ICsgODEpICogNF0sICVsNAkhIGNhbid0IHdyaXRlIGFzcjE1CishCXdyCSVsNCwgJWFzcjE1CisJbGQJWyVzcCArICgyNCArIDgyKSAqIDRdLCAlbDQKKwl3cgklbDQsICVhc3IxNworCWxkCVslc3AgKyAoMjQgKyA4MykgKiA0XSwgJWw0CisJd3IJJWw0LCAlYXNyMTgKKyEJbGQJWyVzcCArICgyNCArIDg0KSAqIDRdLCAlbDQJISBjYW4ndCB3cml0ZSBhc3IxOQorIQl3cgklbDQsICVhc3IxOQorIQlsZAlbJXNwICsgKDI0ICsgODUpICogNF0sICVsNAkhIGNhbid0IHdyaXRlIGFzcjIwCishCXdyCSVsNCwgJWFzcjIwCishCWxkCVslc3AgKyAoMjQgKyA4NikgKiA0XSwgJWw0CSEgY2FuJ3Qgd3JpdGUgYXNyMjEKKyEJd3IJJWw0LCAlYXNyMjEKKwlsZAlbJXNwICsgKDI0ICsgODcpICogNF0sICVsNAorCXdyCSVsNCwgJWFzcjIyCisKKyEgRW5kIG9mIHJlc3RvcmluZyBhc3IgcmVncworCisKKwlsZGQJWyVzcCArICgyNCArIDY0KSAqIDRdLCAlbDAgISBZICYgUFNSCisJbGRkCVslc3AgKyAoMjQgKyA2OCkgKiA0XSwgJWwyICEgUEMgJiBOUEMKKworCXJlc3RvcmUJCQkJISBFbnN1cmUgdGhhdCBwcmV2aW91cyB3aW5kb3cgaXMgdmFsaWQKKwlzYXZlCSVnMCwgJWcwLCAlZzAJCSEgIGJ5IGNhdXNpbmcgYSB3aW5kb3dfdW5kZXJmbG93IHRyYXAKKworCW1vdgklbDAsICV5CisJbW92CSVsMSwgJXBzcgkJISBNYWtlIHN1cmUgdGhhdCB0cmFwcyBhcmUgZGlzYWJsZWQKKwkJCQkJISBmb3IgcmV0dAorCW5vcAkhIDMgbm9wcyBhZnRlciB3cml0ZSB0byAlcHNyIChuZWVkZWQ/KQorCW5vcAorCW5vcAorCisJc2V0aGkJJWhpKGluX3RyYXBfaGFuZGxlciksICVsNAorCWxkCVslbG8oaW5fdHJhcF9oYW5kbGVyKSArICVsNF0sICVsNQorCWRlYwklbDUKKwlzdAklbDUsIFslbG8oaW5fdHJhcF9oYW5kbGVyKSArICVsNF0KKworCWptcGwJJWwyLCAlZzAJCSEgUmVzdG9yZSBvbGQgUEMKKwlyZXR0CSVsMwkJCSEgUmVzdG9yZSBvbGQgblBDCisiKTsKKworLyogQ29udmVydCBjaCBmcm9tIGEgaGV4IGRpZ2l0IHRvIGFuIGludCAqLworCitzdGF0aWMgaW50CitoZXgoY2gpCisgICAgIHVuc2lnbmVkIGNoYXIgY2g7Cit7CisgIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKQorICAgIHJldHVybiBjaC0nYScrMTA7CisgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQorICAgIHJldHVybiBjaC0nMCc7CisgIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKQorICAgIHJldHVybiBjaC0nQScrMTA7CisgIHJldHVybiAtMTsKK30KKworLyogc2NhbiBmb3IgdGhlIHNlcXVlbmNlICQ8ZGF0YT4jPGNoZWNrc3VtPiAgICAgKi8KKworc3RhdGljIHZvaWQKK2dldHBhY2tldChidWZmZXIpCisgICAgIGNoYXIgKmJ1ZmZlcjsKK3sKKyAgdW5zaWduZWQgY2hhciBjaGVja3N1bTsKKyAgdW5zaWduZWQgY2hhciB4bWl0Y3N1bTsKKyAgaW50IGk7CisgIGludCBjb3VudDsKKyAgdW5zaWduZWQgY2hhciBjaDsKKworICBkbworICAgIHsKKyAgICAgIC8qIHdhaXQgYXJvdW5kIGZvciB0aGUgc3RhcnQgY2hhcmFjdGVyLCBpZ25vcmUgYWxsIG90aGVyIGNoYXJhY3RlcnMgKi8KKyAgICAgIHdoaWxlICgoY2ggPSAoZ2V0RGVidWdDaGFyKCkgJiAweDdmKSkgIT0gJyQnKSAKKwk7CisKKyAgICAgIGNoZWNrc3VtID0gMDsKKyAgICAgIHhtaXRjc3VtID0gLTE7CisKKyAgICAgIGNvdW50ID0gMDsKKworICAgICAgLyogbm93LCByZWFkIHVudGlsIGEgIyBvciBlbmQgb2YgYnVmZmVyIGlzIGZvdW5kICovCisgICAgICB3aGlsZSAoY291bnQgPCBCVUZNQVgpCisJeworCSAgY2ggPSBnZXREZWJ1Z0NoYXIoKSAmIDB4N2Y7CisJICBpZiAoY2ggPT0gJyMnKQorCSAgICBicmVhazsKKwkgIGNoZWNrc3VtID0gY2hlY2tzdW0gKyBjaDsKKwkgIGJ1ZmZlcltjb3VudF0gPSBjaDsKKwkgIGNvdW50ID0gY291bnQgKyAxOworCX0KKworICAgICAgaWYgKGNvdW50ID49IEJVRk1BWCkKKwljb250aW51ZTsKKworICAgICAgYnVmZmVyW2NvdW50XSA9IDA7CisKKyAgICAgIGlmIChjaCA9PSAnIycpCisJeworCSAgeG1pdGNzdW0gPSBoZXgoY2ggPSBnZXREZWJ1Z0NoYXIoKSAmIDB4N2YpIDw8IDQ7CisJICB4bWl0Y3N1bSB8PSBoZXgoY2ggPSBnZXREZWJ1Z0NoYXIoKSAmIDB4N2YpOworCisJICBpZiAoY2hlY2tzdW0gIT0geG1pdGNzdW0pCisJICAgIHB1dERlYnVnQ2hhcignLScpOwkvKiBmYWlsZWQgY2hlY2tzdW0gKi8KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHB1dERlYnVnQ2hhcignKycpOyAvKiBzdWNjZXNzZnVsIHRyYW5zZmVyICovCisJICAgICAgLyogaWYgYSBzZXF1ZW5jZSBjaGFyIGlzIHByZXNlbnQsIHJlcGx5IHRoZSBzZXF1ZW5jZSBJRCAqLworCSAgICAgIGlmIChidWZmZXJbMl0gPT0gJzonKQorCQl7CisJCSAgcHV0RGVidWdDaGFyKGJ1ZmZlclswXSk7CisJCSAgcHV0RGVidWdDaGFyKGJ1ZmZlclsxXSk7CisJCSAgLyogcmVtb3ZlIHNlcXVlbmNlIGNoYXJzIGZyb20gYnVmZmVyICovCisJCSAgY291bnQgPSBzdHJsZW4oYnVmZmVyKTsKKwkJICBmb3IgKGk9MzsgaSA8PSBjb3VudDsgaSsrKQorCQkgICAgYnVmZmVyW2ktM10gPSBidWZmZXJbaV07CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgIHdoaWxlIChjaGVja3N1bSAhPSB4bWl0Y3N1bSk7Cit9CisKKy8qIHNlbmQgdGhlIHBhY2tldCBpbiBidWZmZXIuICAqLworCitzdGF0aWMgdm9pZAorcHV0cGFja2V0KGJ1ZmZlcikKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworeworICB1bnNpZ25lZCBjaGFyIGNoZWNrc3VtOworICBpbnQgY291bnQ7CisgIHVuc2lnbmVkIGNoYXIgY2g7CisKKyAgLyogICQ8cGFja2V0IGluZm8+IzxjaGVja3N1bT4uICovCisgIGRvCisgICAgeworICAgICAgcHV0RGVidWdDaGFyKCckJyk7CisgICAgICBjaGVja3N1bSA9IDA7CisgICAgICBjb3VudCA9IDA7CisKKyAgICAgIHdoaWxlIChjaCA9IGJ1ZmZlcltjb3VudF0pCisJeworCSAgcHV0RGVidWdDaGFyKGNoKTsKKwkgIGNoZWNrc3VtICs9IGNoOworCSAgY291bnQgKz0gMTsKKwl9CisKKyAgICAgIHB1dERlYnVnQ2hhcignIycpOworICAgICAgcHV0RGVidWdDaGFyKGhleGNoYXJzW2NoZWNrc3VtID4+IDRdKTsKKyAgICAgIHB1dERlYnVnQ2hhcihoZXhjaGFyc1tjaGVja3N1bSAmIDB4Zl0pOworCisgICAgfQorICB3aGlsZSAoKGdldERlYnVnQ2hhcigpICYgMHg3ZikgIT0gJysnKTsKK30KKworc3RhdGljIGNoYXIgcmVtY29tSW5CdWZmZXJbQlVGTUFYXTsKK3N0YXRpYyBjaGFyIHJlbWNvbU91dEJ1ZmZlcltCVUZNQVhdOworCisvKiBJbmRpY2F0ZSB0byBjYWxsZXIgb2YgbWVtMmhleCBvciBoZXgybWVtIHRoYXQgdGhlcmUgaGFzIGJlZW4gYW4KKyAgIGVycm9yLiAgKi8KK3N0YXRpYyB2b2xhdGlsZSBpbnQgbWVtX2VyciA9IDA7CisKKy8qIENvbnZlcnQgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IG1lbSBpbnRvIGhleCwgcGxhY2luZyByZXN1bHQgaW4gYnVmLgorICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbGFzdCBjaGFyIHB1dCBpbiBidWYgKG51bGwpLCBpbiBjYXNlIG9mIG1lbSBmYXVsdCwKKyAqIHJldHVybiAwLgorICogSWYgTUFZX0ZBVUxUIGlzIG5vbi16ZXJvLCB0aGVuIHdlIHdpbGwgaGFuZGxlIG1lbW9yeSBmYXVsdHMgYnkgcmV0dXJuaW5nCisgKiBhIDAsIGVsc2UgdHJlYXQgYSBmYXVsdCBsaWtlIGFueSBvdGhlciBmYXVsdCBpbiB0aGUgc3R1Yi4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCittZW0yaGV4KG1lbSwgYnVmLCBjb3VudCwgbWF5X2ZhdWx0KQorICAgICB1bnNpZ25lZCBjaGFyICptZW07CisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICAgaW50IGNvdW50OworICAgICBpbnQgbWF5X2ZhdWx0OworeworICB1bnNpZ25lZCBjaGFyIGNoOworCisgIHNldF9tZW1fZmF1bHRfdHJhcChtYXlfZmF1bHQpOworCisgIHdoaWxlIChjb3VudC0tID4gMCkKKyAgICB7CisgICAgICBjaCA9ICptZW0rKzsKKyAgICAgIGlmIChtZW1fZXJyKQorCXJldHVybiAwOworICAgICAgKmJ1ZisrID0gaGV4Y2hhcnNbY2ggPj4gNF07CisgICAgICAqYnVmKysgPSBoZXhjaGFyc1tjaCAmIDB4Zl07CisgICAgfQorCisgICpidWYgPSAwOworCisgIHNldF9tZW1fZmF1bHRfdHJhcCgwKTsKKworICByZXR1cm4gYnVmOworfQorCisvKiBjb252ZXJ0IHRoZSBoZXggYXJyYXkgcG9pbnRlZCB0byBieSBidWYgaW50byBiaW5hcnkgdG8gYmUgcGxhY2VkIGluIG1lbQorICogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIEFGVEVSIHRoZSBsYXN0IGJ5dGUgd3JpdHRlbiAqLworCitzdGF0aWMgY2hhciAqCitoZXgybWVtKGJ1ZiwgbWVtLCBjb3VudCwgbWF5X2ZhdWx0KQorICAgICB1bnNpZ25lZCBjaGFyICpidWY7CisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbTsKKyAgICAgaW50IGNvdW50OworICAgICBpbnQgbWF5X2ZhdWx0OworeworICBpbnQgaTsKKyAgdW5zaWduZWQgY2hhciBjaDsKKworICBzZXRfbWVtX2ZhdWx0X3RyYXAobWF5X2ZhdWx0KTsKKworICBmb3IgKGk9MDsgaTxjb3VudDsgaSsrKQorICAgIHsKKyAgICAgIGNoID0gaGV4KCpidWYrKykgPDwgNDsKKyAgICAgIGNoIHw9IGhleCgqYnVmKyspOworICAgICAgKm1lbSsrID0gY2g7CisgICAgICBpZiAobWVtX2VycikKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgc2V0X21lbV9mYXVsdF90cmFwKDApOworCisgIHJldHVybiBtZW07Cit9CisKKy8qIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIG1hcHBpbmcgYmV0d2VlbiBTUEFSQyBoYXJkd2FyZSB0cmFwIHR5cGVzLCBhbmQKKyAgIHNpZ25hbHMsIHdoaWNoIGFyZSBwcmltYXJpbHkgd2hhdCBHREIgdW5kZXJzdGFuZHMuICBJdCBhbHNvIGluZGljYXRlcworICAgd2hpY2ggaGFyZHdhcmUgdHJhcHMgd2UgbmVlZCB0byBjb21tYW5kZWVyIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBzdHViLiAqLworCitzdGF0aWMgc3RydWN0IGhhcmRfdHJhcF9pbmZvCit7CisgIHVuc2lnbmVkIGNoYXIgdHQ7CQkvKiBUcmFwIHR5cGUgY29kZSBmb3IgU1BBUkNsaXRlICovCisgIHVuc2lnbmVkIGNoYXIgc2lnbm87CQkvKiBTaWduYWwgdGhhdCB3ZSBtYXAgdGhpcyB0cmFwIGludG8gKi8KK30gaGFyZF90cmFwX2luZm9bXSA9IHsKKyAgezEsIFNJR1NFR1Z9LAkJCS8qIGluc3RydWN0aW9uIGFjY2VzcyBleGNlcHRpb24gKi8KKyAgezB4M2IsIFNJR1NFR1Z9LAkJLyogaW5zdHJ1Y3Rpb24gYWNjZXNzIGVycm9yICovCisgIHsyLCBTSUdJTEx9LAkJCS8qIGlsbGVnYWwgICAgaW5zdHJ1Y3Rpb24gKi8KKyAgezMsIFNJR0lMTH0sCQkJLyogcHJpdmlsZWdlZCBpbnN0cnVjdGlvbiAqLworICB7NCwgU0lHRU1UfSwJCQkvKiBmcCBkaXNhYmxlZCAqLworICB7MHgyNCwgU0lHRU1UfSwJCS8qIGNwIGRpc2FibGVkICovCisgIHs3LCBTSUdCVVN9LAkJCS8qIG1lbSBhZGRyZXNzIG5vdCBhbGlnbmVkICovCisgIHsweDI5LCBTSUdTRUdWfSwJCS8qIGRhdGEgYWNjZXNzIGV4Y2VwdGlvbiAqLworICB7MTAsIFNJR0VNVH0sCQkJLyogdGFnIG92ZXJmbG93ICovCisgIHsxMjgrMSwgU0lHVFJBUH0sCQkvKiB0YSAxIC0gbm9ybWFsIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gKi8KKyAgezAsIDB9CQkJLyogTXVzdCBiZSBsYXN0ICovCit9OworCisvKiBTZXQgdXAgZXhjZXB0aW9uIGhhbmRsZXJzIGZvciB0cmFjaW5nIGFuZCBicmVha3BvaW50cyAqLworCit2b2lkCitzZXRfZGVidWdfdHJhcHMoKQoreworICBzdHJ1Y3QgaGFyZF90cmFwX2luZm8gKmh0OworCisgIGZvciAoaHQgPSBoYXJkX3RyYXBfaW5mbzsgaHQtPnR0ICYmIGh0LT5zaWdubzsgaHQrKykKKyAgICBleGNlcHRpb25IYW5kbGVyKGh0LT50dCwgdHJhcF9sb3cpOworCisgIC8qIEluIGNhc2UgR0RCIGlzIHN0YXJ0ZWQgYmVmb3JlIHVzLCBhY2sgYW55IHBhY2tldHMgKHByZXN1bWFibHkKKyAgICAgIiQ/I3h4Iikgc2l0dGluZyB0aGVyZS4gICovCisgIHB1dERlYnVnQ2hhciAoJysnKTsKKworICBpbml0aWFsaXplZCA9IDE7Cit9CisKK2FzbSAoIgorISBUcmFwIGhhbmRsZXIgZm9yIG1lbW9yeSBlcnJvcnMuICBUaGlzIGp1c3Qgc2V0cyBtZW1fZXJyIHRvIGJlIG5vbi16ZXJvLiAgSXQKKyEgYXNzdW1lcyB0aGF0ICVsMSBpcyBub24temVyby4gIFRoaXMgc2hvdWxkIGJlIHNhZmUsIGFzIGl0IGlzIGRvdWJ0ZnVsIHRoYXQKKyEgMCB3b3VsZCBldmVyIGNvbnRhaW4gY29kZSB0aGF0IGNvdWxkIG1lbSBmYXVsdC4gIFRoaXMgcm91dGluZSB3aWxsIHNraXAKKyEgcGFzdCB0aGUgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24gYWZ0ZXIgc2V0dGluZyBtZW1fZXJyLgorCisJLnRleHQKKwkuYWxpZ24gNAorCitfZmx0cl9zZXRfbWVtX2VycjoKKwlzZXRoaSAlaGkoX21lbV9lcnIpLCAlbDAKKwlzdCAlbDEsIFslbDAgKyAlbG8oX21lbV9lcnIpXQorCWptcGwgJWwyLCAlZzAKKwlyZXR0ICVsMis0CisiKTsKKworc3RhdGljIHZvaWQKK3NldF9tZW1fZmF1bHRfdHJhcChlbmFibGUpCisgICAgIGludCBlbmFibGU7Cit7CisgIGV4dGVybiB2b2lkIGZsdHJfc2V0X21lbV9lcnIoKTsKKyAgbWVtX2VyciA9IDA7CisKKyAgaWYgKGVuYWJsZSkKKyAgICBleGNlcHRpb25IYW5kbGVyKDB4MjksIGZsdHJfc2V0X21lbV9lcnIpOworICBlbHNlCisgICAgZXhjZXB0aW9uSGFuZGxlcigweDI5LCB0cmFwX2xvdyk7Cit9CisKK2FzbSAoIgorCS50ZXh0CisJLmFsaWduIDQKKworX2R1bW15X2h3X2JyZWFrcG9pbnQ6CisJam1wbCAlbDIsICVnMAorCXJldHQgJWwyKzQKKwlub3AKKwlub3AKKyIpOworCitzdGF0aWMgdm9pZAorc2V0X2h3X2JyZWFrcG9pbnRfdHJhcChlbmFibGUpCisgICAgIGludCBlbmFibGU7Cit7CisgIGV4dGVybiB2b2lkIGR1bW15X2h3X2JyZWFrcG9pbnQoKTsKKworICBpZiAoZW5hYmxlKQorICAgIGV4Y2VwdGlvbkhhbmRsZXIoMjU1LCBkdW1teV9od19icmVha3BvaW50KTsKKyAgZWxzZQorICAgIGV4Y2VwdGlvbkhhbmRsZXIoMjU1LCB0cmFwX2xvdyk7Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfaW5fYnJlYWtfbW9kZSgpCit7CisjaWYgMAorICBpbnQgeDsKKyAgbWVzZygiZ2V0X2luX2JyZWFrX21vZGUsIHNwID0gIik7CisgIHBoZXgoJngpOworI2VuZGlmCisgIHNldF9od19icmVha3BvaW50X3RyYXAoMSk7CisKKyAgYXNtKCIKKyAgICAgICAgc2V0aGkgICAlaGkoMHhmZjEwKSwgJWw0CisgICAgICAgIG9yICAgICAgJWw0LCAlbG8oMHhmZjEwKSwgJWw0CisJc3RhIAklZzAsIFslbDRdMHgxCQorCW5vcAorCW5vcAorCW5vcAorICAgICAgIik7CisKKyAgc2V0X2h3X2JyZWFrcG9pbnRfdHJhcCgwKTsKK30KKworLyogQ29udmVydCB0aGUgU1BBUkMgaGFyZHdhcmUgdHJhcCB0eXBlIGNvZGUgdG8gYSB1bml4IHNpZ25hbCBudW1iZXIuICovCisKK3N0YXRpYyBpbnQKK2NvbXB1dGVTaWduYWwodHQpCisgICAgIGludCB0dDsKK3sKKyAgc3RydWN0IGhhcmRfdHJhcF9pbmZvICpodDsKKworICBmb3IgKGh0ID0gaGFyZF90cmFwX2luZm87IGh0LT50dCAmJiBodC0+c2lnbm87IGh0KyspCisgICAgaWYgKGh0LT50dCA9PSB0dCkKKyAgICAgIHJldHVybiBodC0+c2lnbm87CisKKyAgcmV0dXJuIFNJR0hVUDsJCS8qIGRlZmF1bHQgZm9yIHRoaW5ncyB3ZSBkb24ndCBrbm93IGFib3V0ICovCit9CisKKy8qCisgKiBXaGlsZSB3ZSBmaW5kIG5pY2UgaGV4IGNoYXJzLCBidWlsZCBhbiBpbnQuCisgKiBSZXR1cm4gbnVtYmVyIG9mIGNoYXJzIHByb2Nlc3NlZC4KKyAqLworCitzdGF0aWMgaW50CitoZXhUb0ludChjaGFyICoqcHRyLCBpbnQgKmludFZhbHVlKQoreworICBpbnQgbnVtQ2hhcnMgPSAwOworICBpbnQgaGV4VmFsdWU7CisKKyAgKmludFZhbHVlID0gMDsKKworICB3aGlsZSAoKipwdHIpCisgICAgeworICAgICAgaGV4VmFsdWUgPSBoZXgoKipwdHIpOworICAgICAgaWYgKGhleFZhbHVlIDwgMCkKKwlicmVhazsKKworICAgICAgKmludFZhbHVlID0gKCppbnRWYWx1ZSA8PCA0KSB8IGhleFZhbHVlOworICAgICAgbnVtQ2hhcnMgKys7CisKKyAgICAgICgqcHRyKSsrOworICAgIH0KKworICByZXR1cm4gKG51bUNoYXJzKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBhbGwgY29tbWFuZCBwcm9jZXNpbmcgZm9yIGludGVyZmFjaW5nIHRvIGdkYi4gIEl0CisgKiByZXR1cm5zIDEgaWYgeW91IHNob3VsZCBza2lwIHRoZSBpbnN0cnVjdGlvbiBhdCB0aGUgdHJhcCBhZGRyZXNzLCAwCisgKiBvdGhlcndpc2UuCisgKi8KKworc3RhdGljIHZvaWQKK2hhbmRsZV9leGNlcHRpb24gKHJlZ2lzdGVycykKKyAgICAgdW5zaWduZWQgbG9uZyAqcmVnaXN0ZXJzOworeworICBpbnQgdHQ7CQkJLyogVHJhcCB0eXBlICovCisgIGludCBzaWd2YWw7CisgIGludCBhZGRyOworICBpbnQgbGVuZ3RoOworICBjaGFyICpwdHI7CisgIHVuc2lnbmVkIGxvbmcgKnNwOworICB1bnNpZ25lZCBsb25nIGRzcjsKKworLyogRmlyc3QsIHdlIG11c3QgZm9yY2UgYWxsIG9mIHRoZSB3aW5kb3dzIHRvIGJlIHNwaWxsZWQgb3V0ICovCisKKyAgYXNtKCIKKwkhIFVnaC4gIHNwYXJjbGV0IGhhcyBicm9rZW4gc2F2ZQorCSFzYXZlICVzcCwgLTY0LCAlc3AKKwlzYXZlCisJYWRkICVmcCwtNjQsJXNwCisJIXNhdmUgJXNwLCAtNjQsICVzcAorCXNhdmUKKwlhZGQgJWZwLC02NCwlc3AKKwkhc2F2ZSAlc3AsIC02NCwgJXNwCisJc2F2ZQorCWFkZCAlZnAsLTY0LCVzcAorCSFzYXZlICVzcCwgLTY0LCAlc3AKKwlzYXZlCisJYWRkICVmcCwtNjQsJXNwCisJIXNhdmUgJXNwLCAtNjQsICVzcAorCXNhdmUKKwlhZGQgJWZwLC02NCwlc3AKKwkhc2F2ZSAlc3AsIC02NCwgJXNwCisJc2F2ZQorCWFkZCAlZnAsLTY0LCVzcAorCSFzYXZlICVzcCwgLTY0LCAlc3AKKwlzYXZlCisJYWRkICVmcCwtNjQsJXNwCisJIXNhdmUgJXNwLCAtNjQsICVzcAorCXNhdmUKKwlhZGQgJWZwLC02NCwlc3AKKwlyZXN0b3JlCisJcmVzdG9yZQorCXJlc3RvcmUKKwlyZXN0b3JlCisJcmVzdG9yZQorCXJlc3RvcmUKKwlyZXN0b3JlCisJcmVzdG9yZQorIik7CisKKyAgaWYgKHJlZ2lzdGVyc1tQQ10gPT0gKHVuc2lnbmVkIGxvbmcpYnJlYWtpbnN0KQorICAgIHsKKyAgICAgIHJlZ2lzdGVyc1tQQ10gPSByZWdpc3RlcnNbTlBDXTsKKyAgICAgIHJlZ2lzdGVyc1tOUENdICs9IDQ7CisgICAgfQorICBzcCA9ICh1bnNpZ25lZCBsb25nICopcmVnaXN0ZXJzW1NQXTsKKworICB0dCA9IChyZWdpc3RlcnNbVEJSXSA+PiA0KSAmIDB4ZmY7CisKKyAgLyogcmVwbHkgdG8gaG9zdCB0aGF0IGFuIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgKi8KKyAgc2lndmFsID0gY29tcHV0ZVNpZ25hbCh0dCk7CisgIHB0ciA9IHJlbWNvbU91dEJ1ZmZlcjsKKworICAqcHRyKysgPSAnVCc7CisgICpwdHIrKyA9IGhleGNoYXJzW3NpZ3ZhbCA+PiA0XTsKKyAgKnB0cisrID0gaGV4Y2hhcnNbc2lndmFsICYgMHhmXTsKKworICAqcHRyKysgPSBoZXhjaGFyc1tQQyA+PiA0XTsKKyAgKnB0cisrID0gaGV4Y2hhcnNbUEMgJiAweGZdOworICAqcHRyKysgPSAnOic7CisgIHB0ciA9IG1lbTJoZXgoKGNoYXIgKikmcmVnaXN0ZXJzW1BDXSwgcHRyLCA0LCAwKTsKKyAgKnB0cisrID0gJzsnOworCisgICpwdHIrKyA9IGhleGNoYXJzW0ZQID4+IDRdOworICAqcHRyKysgPSBoZXhjaGFyc1tGUCAmIDB4Zl07CisgICpwdHIrKyA9ICc6JzsKKyAgcHRyID0gbWVtMmhleChzcCArIDggKyA2LCBwdHIsIDQsIDApOyAvKiBGUCAqLworICAqcHRyKysgPSAnOyc7CisKKyAgKnB0cisrID0gaGV4Y2hhcnNbU1AgPj4gNF07CisgICpwdHIrKyA9IGhleGNoYXJzW1NQICYgMHhmXTsKKyAgKnB0cisrID0gJzonOworICBwdHIgPSBtZW0yaGV4KChjaGFyICopJnNwLCBwdHIsIDQsIDApOworICAqcHRyKysgPSAnOyc7CisKKyAgKnB0cisrID0gaGV4Y2hhcnNbTlBDID4+IDRdOworICAqcHRyKysgPSBoZXhjaGFyc1tOUEMgJiAweGZdOworICAqcHRyKysgPSAnOic7CisgIHB0ciA9IG1lbTJoZXgoKGNoYXIgKikmcmVnaXN0ZXJzW05QQ10sIHB0ciwgNCwgMCk7CisgICpwdHIrKyA9ICc7JzsKKworICAqcHRyKysgPSBoZXhjaGFyc1tPNyA+PiA0XTsKKyAgKnB0cisrID0gaGV4Y2hhcnNbTzcgJiAweGZdOworICAqcHRyKysgPSAnOic7CisgIHB0ciA9IG1lbTJoZXgoKGNoYXIgKikmcmVnaXN0ZXJzW083XSwgcHRyLCA0LCAwKTsKKyAgKnB0cisrID0gJzsnOworCisgICpwdHIrKyA9IDA7CisKKyAgcHV0cGFja2V0KHJlbWNvbU91dEJ1ZmZlcik7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgcmVtY29tT3V0QnVmZmVyWzBdID0gMDsKKworICAgICAgZ2V0cGFja2V0KHJlbWNvbUluQnVmZmVyKTsKKyAgICAgIHN3aXRjaCAocmVtY29tSW5CdWZmZXJbMF0pCisJeworCWNhc2UgJz8nOgorCSAgcmVtY29tT3V0QnVmZmVyWzBdID0gJ1MnOworCSAgcmVtY29tT3V0QnVmZmVyWzFdID0gaGV4Y2hhcnNbc2lndmFsID4+IDRdOworCSAgcmVtY29tT3V0QnVmZmVyWzJdID0gaGV4Y2hhcnNbc2lndmFsICYgMHhmXTsKKwkgIHJlbWNvbU91dEJ1ZmZlclszXSA9IDA7CisJICBicmVhazsKKworCWNhc2UgJ2QnOgorCSAgcmVtb3RlX2RlYnVnID0gIShyZW1vdGVfZGVidWcpOwkvKiB0b2dnbGUgZGVidWcgZmxhZyAqLworCSAgYnJlYWs7CisKKwljYXNlICdnJzoJCS8qIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIENQVSByZWdpc3RlcnMgKi8KKwkgIHsKKwkgICAgcHRyID0gcmVtY29tT3V0QnVmZmVyOworCSAgICBwdHIgPSBtZW0yaGV4KChjaGFyICopcmVnaXN0ZXJzLCBwdHIsIDE2ICogNCwgMCk7IC8qIEcgJiBPIHJlZ3MgKi8KKwkgICAgcHRyID0gbWVtMmhleChzcCArIDAsIHB0ciwgMTYgKiA0LCAwKTsgLyogTCAmIEkgcmVncyAqLworCSAgICBtZW1zZXQocHRyLCAnMCcsIDMyICogOCk7IC8qIEZsb2F0aW5nIHBvaW50ICovCisJICAgIHB0ciA9IG1lbTJoZXgoKGNoYXIgKikmcmVnaXN0ZXJzW1ldLAorCQkgICAgcHRyICsgMzIgKiA0ICogMiwKKwkJICAgIDggKiA0LAorCQkgICAgMCk7IC8qIFksIFBTUiwgV0lNLCBUQlIsIFBDLCBOUEMsIEZQU1IsIENQU1IgKi8KKwkgICAgcHRyID0gbWVtMmhleCgoY2hhciAqKSZyZWdpc3RlcnNbQ0NTUl0sCisJCSAgICBwdHIsCisJCSAgICA4ICogNCwKKwkJICAgIDApOyAvKiBDQ1NSLCBDQ1BSLCBDQ0NSQ1IsIENDT1IsIENDT0JSLCBDQ0lCUiwgQ0NJUiAqLworCSAgICBwdHIgPSBtZW0yaGV4KChjaGFyICopJnJlZ2lzdGVyc1tBU1IxXSwKKwkJICAgIHB0ciwKKwkJICAgIDggKiA0LAorCQkgICAgMCk7IC8qIEFTUjEsQVNSMTUsQVNSMTcsQVNSMTgsQVNSMTksQVNSMjAsQVNSMjEsQVNSMjIgKi8KKyNpZiAwIC8qIG5vdCBpbXBsZW1lbnRlZCAqLworCSAgICBwdHIgPSBtZW0yaGV4KChjaGFyICopICZyZWdpc3RlcnNbQVdSMF0sIAorCQkgICAgcHRyLCAKKwkJICAgIDMyICogNCwgCisJCSAgICAwKTsgLyogQWx0ZXJuYXRlIFdpbmRvdyBSZWdpc3RlcnMgKi8KKyNlbmRpZgorCSAgfQorCSAgYnJlYWs7CisKKwljYXNlICdHJzoJLyogc2V0IHZhbHVlIG9mIGFsbCB0aGUgQ1BVIHJlZ2lzdGVycyAtIHJldHVybiBPSyAqLworCWNhc2UgJ1AnOgkvKiBzZXQgdmFsdWUgb2Ygb25lIENQVSByZWdpc3RlciAgICAgIC0gcmV0dXJuIE9LICovCisJICB7CisJICAgIHVuc2lnbmVkIGxvbmcgKm5ld3NwLCBwc3I7CisKKwkgICAgcHNyID0gcmVnaXN0ZXJzW1BTUl07CisKKwkgICAgcHRyID0gJnJlbWNvbUluQnVmZmVyWzFdOworCisJICAgIGlmIChyZW1jb21JbkJ1ZmZlclswXSA9PSAnUCcpCS8qIGRvIGEgc2luZ2xlIHJlZ2lzdGVyICovCisJICAgICAgeworCQlpbnQgcmVnbm87CisgCisgICAgICAgICAgICAgICAgaWYgKGhleFRvSW50ICgmcHRyLCAmcmVnbm8pCisgICAgICAgICAgICAgICAgICAgICYmICpwdHIrKyA9PSAnPScpCisgICAgICAgICAgICAgICAgICBpZiAocmVnbm8gPj0gTDAgJiYgcmVnbm8gPD0gSTcpCisgICAgICAgICAgICAgICAgICAgIGhleDJtZW0gKHB0ciwgc3AgKyByZWdubyAtIEwwLCA0LCAwKTsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaGV4Mm1lbSAocHRyLCAoY2hhciAqKSZyZWdpc3RlcnNbcmVnbm9dLCA0LCAwKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmNweSAocmVtY29tT3V0QnVmZmVyLCAiUDAxIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJaGV4Mm1lbShwdHIsIChjaGFyICopcmVnaXN0ZXJzLCAxNiAqIDQsIDApOyAvKiBHICYgTyByZWdzICovCisJCWhleDJtZW0ocHRyICsgMTYgKiA0ICogMiwgc3AgKyAwLCAxNiAqIDQsIDApOyAvKiBMICYgSSByZWdzICovCisJCWhleDJtZW0ocHRyICsgNjQgKiA0ICogMiwgKGNoYXIgKikmcmVnaXN0ZXJzW1ldLAorCQkJOCAqIDQsIDApOyAvKiBZLFBTUixXSU0sVEJSLFBDLE5QQyxGUFNSLENQU1IgKi8KKwkJaGV4Mm1lbShwdHIgKyA3MiAqIDQgKiAyLCAoY2hhciAqKSZyZWdpc3RlcnNbQ0NTUl0sCisJCQk4ICogNCwgMCk7IC8qIENDU1IsQ0NQUixDQ0NSQ1IsQ0NPUixDQ09CUixDQ0lCUixDQ0lSICovCisJCWhleDJtZW0ocHRyICsgODAgKiA0ICogMiwgKGNoYXIgKikmcmVnaXN0ZXJzW0FTUjFdLAorCQkJOCAqIDQsIDApOyAvKiBBU1IxIC4uLiBBU1IyMiAqLworI2lmIDAgLyogbm90IGltcGxlbWVudGVkICovCisJCWhleDJtZW0ocHRyICsgODggKiA0ICogMiwgKGNoYXIgKikmcmVnaXN0ZXJzW0FXUjBdLAorCQkJOCAqIDQsIDApOyAvKiBBbHRlcm5hdGUgV2luZG93IFJlZ2lzdGVycyAqLworI2VuZGlmCisJICAgICAgfQorCSAgICAvKiBTZWUgaWYgdGhlIHN0YWNrIHBvaW50ZXIgaGFzIG1vdmVkLiAgSWYgc28sIHRoZW4gY29weSB0aGUgc2F2ZWQKKwkgICAgICAgbG9jYWxzIGFuZCBpbnMgdG8gdGhlIG5ldyBsb2NhdGlvbi4gIFRoaXMga2VlcHMgdGhlIHdpbmRvdworCSAgICAgICBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHJvdXRpbmVzIGhhcHB5LiAgKi8KKworCSAgICBuZXdzcCA9ICh1bnNpZ25lZCBsb25nICopcmVnaXN0ZXJzW1NQXTsKKwkgICAgaWYgKHNwICE9IG5ld3NwKQorCSAgICAgIHNwID0gbWVtY3B5KG5ld3NwLCBzcCwgMTYgKiA0KTsKKworCSAgICAvKiBEb24ndCBhbGxvdyBDV1AgdG8gYmUgbW9kaWZpZWQuICovCisKKwkgICAgaWYgKHBzciAhPSByZWdpc3RlcnNbUFNSXSkKKwkgICAgICByZWdpc3RlcnNbUFNSXSA9IChwc3IgJiAweDFmKSB8IChyZWdpc3RlcnNbUFNSXSAmIH4weDFmKTsKKworCSAgICBzdHJjcHkocmVtY29tT3V0QnVmZmVyLCJPSyIpOworCSAgfQorCSAgYnJlYWs7CisKKwljYXNlICdtJzoJICAvKiBtQUEuLkFBLExMTEwgIFJlYWQgTExMTCBieXRlcyBhdCBhZGRyZXNzIEFBLi5BQSAqLworCSAgLyogVHJ5IHRvIHJlYWQgJXgsJXguICAqLworCisJICBwdHIgPSAmcmVtY29tSW5CdWZmZXJbMV07CisKKwkgIGlmIChoZXhUb0ludCgmcHRyLCAmYWRkcikKKwkgICAgICAmJiAqcHRyKysgPT0gJywnCisJICAgICAgJiYgaGV4VG9JbnQoJnB0ciwgJmxlbmd0aCkpCisJICAgIHsKKwkgICAgICBpZiAobWVtMmhleCgoY2hhciAqKWFkZHIsIHJlbWNvbU91dEJ1ZmZlciwgbGVuZ3RoLCAxKSkKKwkJYnJlYWs7CisKKwkgICAgICBzdHJjcHkgKHJlbWNvbU91dEJ1ZmZlciwgIkUwMyIpOworCSAgICB9CisJICBlbHNlCisJICAgIHN0cmNweShyZW1jb21PdXRCdWZmZXIsIkUwMSIpOworCSAgYnJlYWs7CisKKwljYXNlICdNJzogLyogTUFBLi5BQSxMTExMOiBXcml0ZSBMTExMIGJ5dGVzIGF0IGFkZHJlc3MgQUEuQUEgcmV0dXJuIE9LICovCisJICAvKiBUcnkgdG8gcmVhZCAnJXgsJXg6Jy4gICovCisKKwkgIHB0ciA9ICZyZW1jb21JbkJ1ZmZlclsxXTsKKworCSAgaWYgKGhleFRvSW50KCZwdHIsICZhZGRyKQorCSAgICAgICYmICpwdHIrKyA9PSAnLCcKKwkgICAgICAmJiBoZXhUb0ludCgmcHRyLCAmbGVuZ3RoKQorCSAgICAgICYmICpwdHIrKyA9PSAnOicpCisJICAgIHsKKwkgICAgICBpZiAoaGV4Mm1lbShwdHIsIChjaGFyICopYWRkciwgbGVuZ3RoLCAxKSkKKwkJc3RyY3B5KHJlbWNvbU91dEJ1ZmZlciwgIk9LIik7CisJICAgICAgZWxzZQorCQlzdHJjcHkocmVtY29tT3V0QnVmZmVyLCAiRTAzIik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgc3RyY3B5KHJlbWNvbU91dEJ1ZmZlciwgIkUwMiIpOworCSAgYnJlYWs7CisKKwljYXNlICdjJzogICAgLyogY0FBLi5BQSAgICBDb250aW51ZSBhdCBhZGRyZXNzIEFBLi5BQShvcHRpb25hbCkgKi8KKwkgIC8qIHRyeSB0byByZWFkIG9wdGlvbmFsIHBhcmFtZXRlciwgcGMgdW5jaGFuZ2VkIGlmIG5vIHBhcm0gKi8KKworCSAgcHRyID0gJnJlbWNvbUluQnVmZmVyWzFdOworCSAgaWYgKGhleFRvSW50KCZwdHIsICZhZGRyKSkKKwkgICAgeworCSAgICAgIHJlZ2lzdGVyc1tQQ10gPSBhZGRyOworCSAgICAgIHJlZ2lzdGVyc1tOUENdID0gYWRkciArIDQ7CisJICAgIH0KKworLyogTmVlZCB0byBmbHVzaCB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUgaGVyZSwgYXMgd2UgbWF5IGhhdmUgZGVwb3NpdGVkIGEKKyAgIGJyZWFrcG9pbnQsIGFuZCB0aGUgaWNhY2hlIHByb2JhYmx5IGhhcyBubyB3YXkgb2Yga25vd2luZyB0aGF0IGEgZGF0YSByZWYgdG8KKyAgIHNvbWUgbG9jYXRpb24gbWF5IGhhdmUgY2hhbmdlZCBzb21ldGhpbmcgdGhhdCBpcyBpbiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUuCisgKi8KKworCSAgZmx1c2hfaV9jYWNoZSgpOworCSAgcmV0dXJuOworCisJICAvKiBraWxsIHRoZSBwcm9ncmFtICovCisJY2FzZSAnaycgOgkJLyogZG8gbm90aGluZyAqLworCSAgYnJlYWs7CisjaWYgMAorCWNhc2UgJ3QnOgkJLyogVGVzdCBmZWF0dXJlICovCisJICBhc20gKCIgc3RkICVmMzAsWyVzcF0iKTsKKwkgIGJyZWFrOworI2VuZGlmCisJY2FzZSAncic6CQkvKiBSZXNldCAqLworCSAgYXNtICgiY2FsbCAwCisJCW5vcCAiKTsKKwkgIGJyZWFrOworCisjaWYgMAorRGlzYWJsZWQgdW50aWwgd2UgY2FuIHVuc2NyZXcgdGhpcyBwcm9wZXJseQorCisJY2FzZSAnYic6CSAgLyogYkJCLi4uICBTZXQgYmF1ZCByYXRlIHRvIEJCLi4uICovCisJICB7CisJICAgIGludCBiYXVkcmF0ZTsKKwkgICAgZXh0ZXJuIHZvaWQgc2V0X3RpbWVyXzMoKTsKKworCSAgICBwdHIgPSAmcmVtY29tSW5CdWZmZXJbMV07CisJICAgIGlmICghaGV4VG9JbnQoJnB0ciwgJmJhdWRyYXRlKSkKKwkgICAgICB7CisJCXN0cmNweShyZW1jb21PdXRCdWZmZXIsIkIwMSIpOworCQlicmVhazsKKwkgICAgICB9CisKKwkgICAgLyogQ29udmVydCBiYXVkIHJhdGUgdG8gdWFydCBjbG9jayBkaXZpZGVyICovCisJICAgIHN3aXRjaCAoYmF1ZHJhdGUpCisJICAgICAgeworCSAgICAgIGNhc2UgMzg0MDA6CisJCWJhdWRyYXRlID0gMTY7CisJCWJyZWFrOworCSAgICAgIGNhc2UgMTkyMDA6CisJCWJhdWRyYXRlID0gMzM7CisJCWJyZWFrOworCSAgICAgIGNhc2UgOTYwMDoKKwkJYmF1ZHJhdGUgPSA2NTsKKwkJYnJlYWs7CisJICAgICAgZGVmYXVsdDoKKwkJc3RyY3B5KHJlbWNvbU91dEJ1ZmZlciwiQjAyIik7CisJCWdvdG8geDE7CisJICAgICAgfQorCisJICAgIHB1dHBhY2tldCgiT0siKTsJLyogQWNrIGJlZm9yZSBjaGFuZ2luZyBzcGVlZCAqLworCSAgICBzZXRfdGltZXJfMyhiYXVkcmF0ZSk7IC8qIFNldCBpdCAqLworCSAgfQoreDE6CSAgYnJlYWs7CisjZW5kaWYKKwl9CQkJLyogc3dpdGNoICovCisKKyAgICAgIC8qIHJlcGx5IHRvIHRoZSByZXF1ZXN0ICovCisgICAgICBwdXRwYWNrZXQocmVtY29tT3V0QnVmZmVyKTsKKyAgICB9Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZSBhIGJyZWFrcG9pbnQgZXhjZXB0aW9uLiAgSXQgaXMgdXNlZCBhdCB0aGUKKyAgIGJlZ2lubmluZyBvZiBhIHByb2dyYW0gdG8gc3luYyB1cCB3aXRoIGEgZGVidWdnZXIgYW5kIGNhbiBiZSB1c2VkCisgICBvdGhlcndpc2UgYXMgYSBxdWljayBtZWFucyB0byBzdG9wIHByb2dyYW0gZXhlY3V0aW9uIGFuZCAiYnJlYWsiIGludG8KKyAgIHRoZSBkZWJ1Z2dlci4gKi8KKwordm9pZAorYnJlYWtwb2ludCgpCit7CisgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgcmV0dXJuOworCisgIGFzbSgiCS5nbG9ibCBfYnJlYWtpbnN0CisKKwlfYnJlYWtpbnN0OiB0YSAxCisgICAgICAiKTsKK30KKworc3RhdGljIHZvaWQKK2h3X2JyZWFrcG9pbnQoKQoreworICBhc20oIgorICAgICAgdGEgMTI3CisgICAgICAiKTsKK30KKworI2lmIDAgLyogZXhwZXJpbWVudGFsIGFuZCBuZXZlciBmaW5pc2hlZCwgbGVmdCBoZXJlIGZvciByZWZlcmVuY2UgKi8KK3N0YXRpYyB2b2lkCitzcGxldF90ZW1wKHZvaWQpCit7CisgIGFzbSgiCXN1Ygklc3AsKDE2KzErNisxKzEyMSkqNCwlc3AgISBNYWtlIHJvb20gZm9yIGlucHV0ICYgbG9jYWxzCisgCQkJCQkhICsgaGlkZGVuIGFyZyArIGFyZyBzcGlsbAorCQkJCQkhICsgZG91Ymxld29yZCBhbGlnbm1lbnQKKwkJCQkJISArIHJlZ2lzdGVyc1sxMjFdCisKKyEgTGVhdmUgYSB0cmFpbCBvZiBicmVhZGNydW1icyEgKHNhdmUgcmVnaXN0ZXIgc2F2ZSBhcmVhIGZvciBkZWJ1Z2dpbmcpCisJbW92CSVzcCwgJWwwCisJYWRkCSVsMCwgMjQqNCwgJWwwCisJc2V0aGkJJWhpKF9kZWJ1Z19yZWdpc3RlcnMpLCAlbDEKKwlzdAklbDAsIFslbG8oX2RlYnVnX3JlZ2lzdGVycykgKyAlbDFdCisKKyEgU2F2ZSB0aGUgQWx0ZXJuYXRlIFJlZ2lzdGVyIFNldDogKG5vdCBpbXBsZW1lbnRlZCB5ZXQpCishICAgIFRvIHNhdmUgdGhlIEFsdGVybmF0ZSBSZWdpc3RlciBzZXQsIHdlIG11c3Q6CishICAgIDEpIFNhdmUgdGhlIGN1cnJlbnQgU1AgaW4gc29tZSBnbG9iYWwgbG9jYXRpb24uCishICAgIDIpIFN3YXAgdGhlIHJlZ2lzdGVyIHNldHMuCishICAgIDMpIFNhdmUgdGhlIEFsdGVybmF0ZSBTUCBpbiB0aGUgWSByZWdpc3RlcgorISAgICA0KSBGZXRjaCB0aGUgU1AgdGhhdCB3ZSBzYXZlZCBpbiBzdGVwIDEuCishICAgIDUpIFVzZSB0aGF0IHRvIHNhdmUgdGhlIHJlc3Qgb2YgdGhlIHJlZ3MgKG5vdCBmb3JnZXR0aW5nIEFTUCBpbiBZKQorISAgICA2KSBSZXN0b3JlIHRoZSBBbHRlcm5hdGUgU1AgZnJvbSBZCishICAgIDcpIFN3YXAgdGhlIHJlZ2lzdGVycyBiYWNrLgorCishIDEpIENvcHkgdGhlIGN1cnJlbnQgc3RhY2sgcG9pbnRlciB0byBnbG9iYWwgX1NBVkVEX1NUQUNLX1BPSU5URVI6CisJc2V0aGkJJWhpKF9zYXZlZF9zdGFja19wb2ludGVyKSwgJWwwCisJc3QJJXNwLCBbJWxvKF9zYXZlZF9zdGFja19wb2ludGVyKSArICVsMF0KKworISAyKSBTd2FwIHRoZSByZWdpc3RlciBzZXRzOgorCW1vdgklcHNyLCAlbDEKKwlzZXRoaQklaGkoMHgxMDAwMCksICVsMgorCXhvcgklbDEsICVsMiwgJWwxCisJbW92CSVsMSwgJXBzcgorCW5vcAkJCSEgMyBub3BzIGFmdGVyIHdyaXRlIHRvICVwc3IgKG5lZWRlZD8pCisJbm9wCisJbm9wCisKKyEgMykgU2F2ZSBBbHRlcm5hdGUgTDAgaW4gWQorCXdyCSVsMCwgMCwgJXkKKworISA0KSBMb2FkIGZvcm1lciBTUCBpbnRvIGFsdGVybmF0ZSBTUCwgdXNpbmcgTDAKKwlzZXRoaQklaGkoX3NhdmVkX3N0YWNrX3BvaW50ZXIpLCAlbDAKKwlvcgklbG8oX3NhdmVkX3N0YWNrX3BvaW50ZXIpLCAlbDAsICVsMAorCXN3YXAJWyVsMF0sICVzcAorCishIDQuNSkgUmVzdG9yZSBhbHRlcm5hdGUgTDAKKwlyZAkleSwgJWwwCisKKyEgNSkgU2F2ZSB0aGUgQWx0ZXJuYXRlIFdpbmRvdyBSZWdpc3RlcnMKKwlzdAklcjAsIFslc3AgKyAoMjQgKyA4OCkgKiA0XQkhIEFXUjAKKwlzdAklcjEsIFslc3AgKyAoMjQgKyA4OSkgKiA0XQkhIEFXUjEKKwlzdAklcjIsIFslc3AgKyAoMjQgKyA5MCkgKiA0XQkhIEFXUjIKKwlzdAklcjMsIFslc3AgKyAoMjQgKyA5MSkgKiA0XQkhIEFXUjMKKwlzdAklcjQsIFslc3AgKyAoMjQgKyA5MikgKiA0XQkhIEFXUjQKKwlzdAklcjUsIFslc3AgKyAoMjQgKyA5MykgKiA0XQkhIEFXUjUKKwlzdAklcjYsIFslc3AgKyAoMjQgKyA5NCkgKiA0XQkhIEFXUjYKKwlzdAklcjcsIFslc3AgKyAoMjQgKyA5NSkgKiA0XQkhIEFXUjcKKwlzdAklcjgsIFslc3AgKyAoMjQgKyA5NikgKiA0XQkhIEFXUjgKKwlzdAklcjksIFslc3AgKyAoMjQgKyA5NykgKiA0XQkhIEFXUjkKKwlzdAklcjEwLCBbJXNwICsgKDI0ICsgOTgpICogNF0JISBBV1IxMAorCXN0CSVyMTEsIFslc3AgKyAoMjQgKyA5OSkgKiA0XQkhIEFXUjExCisJc3QJJXIxMiwgWyVzcCArICgyNCArIDEwMCkgKiA0XQkhIEFXUjEyCisJc3QJJXIxMywgWyVzcCArICgyNCArIDEwMSkgKiA0XQkhIEFXUjEzCishCXN0CSVyMTQsIFslc3AgKyAoMjQgKyAxMDIpICogNF0JISBBV1IxNAkoU1ApCisJc3QJJXIxNSwgWyVzcCArICgyNCArIDEwMykgKiA0XQkhIEFXUjE1CisJc3QJJXIxNiwgWyVzcCArICgyNCArIDEwNCkgKiA0XQkhIEFXUjE2CisJc3QJJXIxNywgWyVzcCArICgyNCArIDEwNSkgKiA0XQkhIEFXUjE3CisJc3QJJXIxOCwgWyVzcCArICgyNCArIDEwNikgKiA0XQkhIEFXUjE4CisJc3QJJXIxOSwgWyVzcCArICgyNCArIDEwNykgKiA0XQkhIEFXUjE5CisJc3QJJXIyMCwgWyVzcCArICgyNCArIDEwOCkgKiA0XQkhIEFXUjIwCisJc3QJJXIyMSwgWyVzcCArICgyNCArIDEwOSkgKiA0XQkhIEFXUjIxCisJc3QJJXIyMiwgWyVzcCArICgyNCArIDExMCkgKiA0XQkhIEFXUjIyCisJc3QJJXIyMywgWyVzcCArICgyNCArIDExMSkgKiA0XQkhIEFXUjIzCisJc3QJJXIyNCwgWyVzcCArICgyNCArIDExMikgKiA0XQkhIEFXUjI0CisJc3QJJXIyNSwgWyVzcCArICgyNCArIDExMykgKiA0XQkhIEFXUjI1CisJc3QJJXIyNiwgWyVzcCArICgyNCArIDExNCkgKiA0XQkhIEFXUjI2CisJc3QJJXIyNywgWyVzcCArICgyNCArIDExNSkgKiA0XQkhIEFXUjI3CisJc3QJJXIyOCwgWyVzcCArICgyNCArIDExNikgKiA0XQkhIEFXUjI4CisJc3QJJXIyOSwgWyVzcCArICgyNCArIDExNykgKiA0XQkhIEFXUjI5CisJc3QJJXIzMCwgWyVzcCArICgyNCArIDExOCkgKiA0XQkhIEFXUjMwCisJc3QJJXIzMSwgWyVzcCArICgyNCArIDExOSkgKiA0XQkhIEFXUjIxCisKKyEgR2V0IHRoZSBBbHRlcm5hdGUgUFNSIChJIGhvcGUuLi4pCisKKwlyZAklcHNyLCAlbDIKKwlzdAklbDIsIFslc3AgKyAoMjQgKyAxMjApICogNF0JISBBUFNSCisKKyEgRG9uJ3QgZm9yZ2V0IHRoZSBhbHRlcm5hdGUgc3RhY2sgcG9pbnRlcgorCisJcmQJJXksICVsMworCXN0CSVsMywgWyVzcCArICgyNCArIDEwMikgKiA0XQkhIEFXUjE0IChTUCkKKworISA2KSBSZXN0b3JlIHRoZSBBbHRlcm5hdGUgU1AgKHNhdmVkIGluIFkpCisKKwlyZAkleSwgJW82CisKKworISA3KSBTd2FwIHRoZSByZWdpc3RlcnMgYmFjazoKKworCW1vdgklcHNyLCAlbDEKKwlzZXRoaQklaGkoMHgxMDAwMCksICVsMgorCXhvcgklbDEsICVsMiwgJWwxCisJbW92CSVsMSwgJXBzcgorCW5vcAkJCSEgMyBub3BzIGFmdGVyIHdyaXRlIHRvICVwc3IgKG5lZWRlZD8pCisJbm9wCisJbm9wCisiKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvc3JlYy5oIGIvZ2RiL3NyZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjUzZTAzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3NyZWMuaApAQCAtMCwwICsxLDM2IEBACisvKiBTLXJlY29yZCBkb3dubG9hZCBzdXBwb3J0IGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCit2b2lkIGxvYWRfc3JlYyBQQVJBTVMgKChzZXJpYWxfdCBkZXNjLCBjb25zdCBjaGFyICpmaWxlLCBiZmRfdm1hIGxvYWRfb2Zmc2V0LAorCQkJaW50IG1heHJlY3NpemUsIGludCBmbGFncywgaW50IGhhc2htYXJrLAorCQkJaW50ICgqd2FpdGFjaykodm9pZCkpKTsKKworLyogUy1yZWNvcmQgY2FwYWJpbGl0eSBmbGFncyAqLworCisvKiBXaGljaCByZWNvcmQgdHlwZXMgYXJlIHN1cHBvcnRlZCAqLworI2RlZmluZSBTUkVDXzJfQllURV9BRERSIDB4MDAwMDAwMDEKKyNkZWZpbmUgU1JFQ18zX0JZVEVfQUREUiAweDAwMDAwMDAyCisjZGVmaW5lIFNSRUNfNF9CWVRFX0FERFIgMHgwMDAwMDAwNAorI2RlZmluZSBTUkVDX1RFUk1fU0hJRlQgMworCisjZGVmaW5lIFNSRUNfQUxMIChTUkVDXzJfQllURV9BRERSIHwgU1JFQ18zX0JZVEVfQUREUiB8IFNSRUNfNF9CWVRFX0FERFIgXAorCQkgIHwgKChTUkVDXzJfQllURV9BRERSIHwgU1JFQ18zX0JZVEVfQUREUiB8IFNSRUNfNF9CWVRFX0FERFIpIFwKKwkJICAgICA8PCBTUkVDX1RFUk1fU0hJRlQpKQorCisjZGVmaW5lIFNSRUNfQklOQVJZCTB4MDAwMDAwNDAgLyogU3VwcG9ydHMgYmluYXJ5IGZvcm0gb2YgUy1yZWNvcmRzICovCmRpZmYgLS1naXQgYS9nZGIvc3RhYnNyZWFkLmMgYi9nZGIvc3RhYnNyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVkMzFlMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9zdGFic3JlYWQuYwpAQCAtMCwwICsxLDUyMDcgQEAKKy8qIFN1cHBvcnQgcm91dGluZXMgZm9yIGRlY29kaW5nICJzdGFicyIgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvcm1hdC4KKyAgIENvcHlyaWdodCAxOTg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgICAgICAgICAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBTdXBwb3J0IHJvdXRpbmVzIGZvciByZWFkaW5nIGFuZCBkZWNvZGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4KKyAgIHRoZSAic3RhYnMiIGZvcm1hdC4gIFRoaXMgZm9ybWF0IGlzIHVzZWQgd2l0aCBtYW55IHN5c3RlbXMgdGhhdCB1c2UKKyAgIHRoZSBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQsIGFzIHdlbGwgYXMgc29tZSBzeXN0ZW1zIHRoYXQgdXNlCisgICBDT0ZGIG9yIEVMRiB3aGVyZSB0aGUgc3RhYnMgZGF0YSBpcyBwbGFjZWQgaW4gYSBzcGVjaWFsIHNlY3Rpb24uCisgICBBdm9pZCBwbGFjaW5nIGFueSBvYmplY3QgZmlsZSBmb3JtYXQgc3BlY2lmaWMgY29kZSBpbiB0aGlzIGZpbGUuICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCS8qIFdlIGFsd2F5cyB1c2UgR05VIHN0YWJzLCBub3QgbmF0aXZlICovCisjaW5jbHVkZSAibGliYW91dC5oIgorI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCisjaW5jbHVkZSAiZ2RiLXN0YWJzLmgiCisjaW5jbHVkZSAiYnVpbGRzeW0uaCIKKyNpbmNsdWRlICJjb21wbGFpbnRzLmgiCisjaW5jbHVkZSAiZGVtYW5nbGUuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworLyogQXNrIHN0YWJzcmVhZC5oIHRvIGRlZmluZSB0aGUgdmFycyBpdCBub3JtYWxseSBkZWNsYXJlcyBgZXh0ZXJuJy4gICovCisjZGVmaW5lCUVYVEVSTgkvKiovCisjaW5jbHVkZSAic3RhYnNyZWFkLmgiCQkvKiBPdXIgb3duIGRlY2xhcmF0aW9ucyAqLworI3VuZGVmCUVYVEVSTgorCisvKiBUaGUgcm91dGluZXMgdGhhdCByZWFkIGFuZCBwcm9jZXNzIGEgY29tcGxldGUgc3RhYnMgZm9yIGEgQyBzdHJ1Y3Qgb3IgCisgICBDKysgY2xhc3MgcGFzcyBsaXN0cyBvZiBkYXRhIG1lbWJlciBmaWVsZHMgYW5kIGxpc3RzIG9mIG1lbWJlciBmdW5jdGlvbgorICAgZmllbGRzIGluIGFuIGluc3RhbmNlIG9mIGEgZmllbGRfaW5mbyBzdHJ1Y3R1cmUsIGFzIGRlZmluZWQgYmVsb3cuCisgICBUaGlzIGlzIHBhcnQgb2Ygc29tZSByZW9yZ2FuaXphdGlvbiBvZiBsb3cgbGV2ZWwgQysrIHN1cHBvcnQgYW5kIGlzCisgICBleHBlY3RlZCB0byBldmVudHVhbGx5IGdvIGF3YXkuLi4gKEZJWE1FKSAqLworCitzdHJ1Y3QgZmllbGRfaW5mbworeworICBzdHJ1Y3QgbmV4dGZpZWxkCisgICAgeworICAgICAgc3RydWN0IG5leHRmaWVsZCAqbmV4dDsKKworICAgICAgLyogVGhpcyBpcyB0aGUgcmF3IHZpc2liaWxpdHkgZnJvbSB0aGUgc3RhYi4gIEl0IGlzIG5vdCBjaGVja2VkCisJIGZvciBiZWluZyBvbmUgb2YgdGhlIHZpc2liaWxpdGllcyB3ZSByZWNvZ25pemUsIHNvIGNvZGUgd2hpY2gKKwkgZXhhbWluZXMgdGhpcyBmaWVsZCBiZXR0ZXIgYmUgYWJsZSB0byBkZWFsLiAgKi8KKyAgICAgIGludCB2aXNpYmlsaXR5OworCisgICAgICBzdHJ1Y3QgZmllbGQgZmllbGQ7CisgICAgfSAqbGlzdDsKKyAgc3RydWN0IG5leHRfZm5maWVsZGxpc3QKKyAgICB7CisgICAgICBzdHJ1Y3QgbmV4dF9mbmZpZWxkbGlzdCAqbmV4dDsKKyAgICAgIHN0cnVjdCBmbl9maWVsZGxpc3QgZm5fZmllbGRsaXN0OworICAgIH0gKmZubGlzdDsKK307CisKK3N0YXRpYyB2b2lkCityZWFkX29uZV9zdHJ1Y3RfZmllbGQgUEFSQU1TICgoc3RydWN0IGZpZWxkX2luZm8gKiwgY2hhciAqKiwgY2hhciAqLAorCQkJICAgICAgIHN0cnVjdCB0eXBlICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIGNoYXIgKiAKK2dldF9zdWJzdHJpbmcgUEFSQU1TICgoY2hhciAqKiwgaW50KSk7CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitkYnhfYWxsb2NfdHlwZSBQQVJBTVMgKChpbnQgWzJdLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyBsb25nIHJlYWRfaHVnZV9udW1iZXIgUEFSQU1TICgoY2hhciAqKiwgaW50LCBpbnQgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKmVycm9yX3R5cGUgUEFSQU1TICgoY2hhciAqKiwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZAorcGF0Y2hfYmxvY2tfc3RhYnMgUEFSQU1TICgoc3RydWN0IHBlbmRpbmcgKiwgc3RydWN0IHBlbmRpbmdfc3RhYnMgKiwKKwkJCSAgIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQKK2ZpeF9jb21tb25fYmxvY2sgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqLCBpbnQpKTsKKworc3RhdGljIGludAorcmVhZF90eXBlX251bWJlciBQQVJBTVMgKChjaGFyICoqLCBpbnQgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorcmVhZF9yYW5nZV90eXBlIFBBUkFNUyAoKGNoYXIgKiosIGludCBbMl0sIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICoKK3JlYWRfc3VuX2J1aWx0aW5fdHlwZSBQQVJBTVMgKChjaGFyICoqLCBpbnQgWzJdLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCityZWFkX3N1bl9mbG9hdGluZ190eXBlIFBBUkFNUyAoKGNoYXIgKiosIGludCBbMl0sIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICoKK3JlYWRfZW51bV90eXBlIFBBUkFNUyAoKGNoYXIgKiosIHN0cnVjdCB0eXBlICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHN0cnVjdCB0eXBlICoKK3JzNjAwMF9idWlsdGluX3R5cGUgUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyBpbnQKK3JlYWRfbWVtYmVyX2Z1bmN0aW9ucyBQQVJBTVMgKChzdHJ1Y3QgZmllbGRfaW5mbyAqLCBjaGFyICoqLCBzdHJ1Y3QgdHlwZSAqLAorCQkJICAgICAgIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIGludAorcmVhZF9zdHJ1Y3RfZmllbGRzIFBBUkFNUyAoKHN0cnVjdCBmaWVsZF9pbmZvICosIGNoYXIgKiosIHN0cnVjdCB0eXBlICosCisJCQkgICAgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgaW50CityZWFkX2Jhc2VjbGFzc2VzIFBBUkFNUyAoKHN0cnVjdCBmaWVsZF9pbmZvICosIGNoYXIgKiosIHN0cnVjdCB0eXBlICosCisJCQkgIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIGludAorcmVhZF90aWxkZV9maWVsZHMgUEFSQU1TICgoc3RydWN0IGZpZWxkX2luZm8gKiwgY2hhciAqKiwgc3RydWN0IHR5cGUgKiwKKwkJCSAgIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIGludAorYXR0YWNoX2ZuX2ZpZWxkc190b190eXBlIFBBUkFNUyAoKHN0cnVjdCBmaWVsZF9pbmZvICosIHN0cnVjdCB0eXBlICopKTsKKworc3RhdGljIGludAorYXR0YWNoX2ZpZWxkc190b190eXBlIFBBUkFNUyAoKHN0cnVjdCBmaWVsZF9pbmZvICosIHN0cnVjdCB0eXBlICosCisJCQkgICAgICAgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorcmVhZF9zdHJ1Y3RfdHlwZSBQQVJBTVMgKChjaGFyICoqLCBzdHJ1Y3QgdHlwZSAqLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCityZWFkX2FycmF5X3R5cGUgUEFSQU1TICgoY2hhciAqKiwgc3RydWN0IHR5cGUgKiwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgc3RydWN0IHR5cGUgKioKK3JlYWRfYXJncyBQQVJBTVMgKChjaGFyICoqLCBpbnQsIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIGludAorcmVhZF9jcHBfYWJicmV2IFBBUkFNUyAoKHN0cnVjdCBmaWVsZF9pbmZvICosIGNoYXIgKiosIHN0cnVjdCB0eXBlICosCisJCQkgc3RydWN0IG9iamZpbGUgKikpOworCisvKiBuZXcgZnVuY3Rpb25zIGFkZGVkIGZvciBjZnJvbnQgc3VwcG9ydCAqLworCitzdGF0aWMgaW50Citjb3B5X2Nmcm9udF9zdHJ1Y3RfZmllbGRzIFBBUkFNUyAoKHN0cnVjdCBmaWVsZF9pbmZvICosIHN0cnVjdCB0eXBlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIGNoYXIgKgorZ2V0X2Nmcm9udF9tZXRob2RfcGh5c25hbWUgUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyBpbnQKK3JlYWRfY2Zyb250X2Jhc2VjbGFzc2VzIFBBUkFNUyAoKHN0cnVjdCBmaWVsZF9pbmZvICosIGNoYXIgKiosIAorCQkJCSBzdHJ1Y3QgdHlwZSAqLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyBpbnQKK3JlYWRfY2Zyb250X3N0YXRpY19maWVsZHMgUEFSQU1TICgoc3RydWN0IGZpZWxkX2luZm8gKiwgY2hhcioqLAorCQkJCSAgIHN0cnVjdCB0eXBlICosIHN0cnVjdCBvYmpmaWxlICopKTsKK3N0YXRpYyBpbnQKK3JlYWRfY2Zyb250X21lbWJlcl9mdW5jdGlvbnMgUEFSQU1TICgoc3RydWN0IGZpZWxkX2luZm8gKiwgY2hhciAqKiwgCisJCQkJICAgICAgc3RydWN0IHR5cGUgKiwgc3RydWN0IG9iamZpbGUgKikpOworCisvKiBlbmQgbmV3IGZ1bmN0aW9ucyBhZGRlZCBmb3IgY2Zyb250IHN1cHBvcnQgKi8KKworc3RhdGljIHZvaWQKK2FkZF9saXZlX3JhbmdlIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIHN0cnVjdCBzeW1ib2wgKiwgCisJCQlDT1JFX0FERFIsIENPUkVfQUREUikpOworCitzdGF0aWMgaW50CityZXNvbHZlX2xpdmVfcmFuZ2UgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgc3RydWN0IHN5bWJvbCAqLCBjaGFyICopKTsKKworc3RhdGljIGludAorcHJvY2Vzc19yZWZlcmVuY2UgUEFSQU1TICgoY2hhciAqKnN0cmluZykpOworCitzdGF0aWMgQ09SRV9BRERSCityZWZfc2VhcmNoX3ZhbHVlIFBBUkFNUyAoKGludCByZWZudW0pKTsKKworc3RhdGljIGludAorcmVzb2x2ZV9zeW1ib2xfcmVmZXJlbmNlIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIHN0cnVjdCBzeW1ib2wgKiwgY2hhciAqKSk7CisKK3N0YXRpYyBjb25zdCBjaGFyIHZwdHJfbmFtZVtdID0geyAnXycsJ3YnLCdwJywndCcsJ3InLENQTFVTX01BUktFUiwnXDAnIH07CitzdGF0aWMgY29uc3QgY2hhciB2Yl9uYW1lW10gPSAgIHsgJ18nLCd2JywnYicsQ1BMVVNfTUFSS0VSLCdcMCcgfTsKKworLyogRGVmaW5lIHRoaXMgYXMgMSBpZiBhIHBjYyBkZWNsYXJhdGlvbiBvZiBhIGNoYXIgb3Igc2hvcnQgYXJndW1lbnQKKyAgIGdpdmVzIHRoZSBjb3JyZWN0IGFkZHJlc3MuICBPdGhlcndpc2UgYXNzdW1lIHBjYyBnaXZlcyB0aGUKKyAgIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgaW50LCB3aGljaCBpcyBub3QgdGhlIHNhbWUgb24gYQorICAgYmlnLWVuZGlhbiBtYWNoaW5lLiAgKi8KKworI2lmbmRlZiBCRUxJRVZFX1BDQ19QUk9NT1RJT04KKyNkZWZpbmUgQkVMSUVWRV9QQ0NfUFJPTU9USU9OIDAKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCBpbnZhbGlkX2NwcF9hYmJyZXZfY29tcGxhaW50ID0KKyAgeyJpbnZhbGlkIEMrKyBhYmJyZXZpYXRpb24gYCVzJyIsIDAsIDB9OworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCBpbnZhbGlkX2NwcF90eXBlX2NvbXBsYWludCA9CisgIHsiQysrIGFiYnJldmlhdGVkIHR5cGUgbmFtZSB1bmtub3duIGF0IHN5bXRhYiBwb3MgJWQiLCAwLCAwfTsKKworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgbWVtYmVyX2ZuX2NvbXBsYWludCA9CisgIHsibWVtYmVyIGZ1bmN0aW9uIHR5cGUgbWlzc2luZywgZ290ICclYyciLCAwLCAwfTsKKworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgY29uc3Rfdm9sX2NvbXBsYWludCA9CisgIHsiY29uc3Qvdm9sYXRpbGUgaW5kaWNhdG9yIG1pc3NpbmcsIGdvdCAnJWMnIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGVycm9yX3R5cGVfY29tcGxhaW50ID0KKyAgeyJkZWJ1ZyBpbmZvIG1pc21hdGNoIGJldHdlZW4gY29tcGlsZXIgYW5kIGRlYnVnZ2VyIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGludmFsaWRfbWVtYmVyX2NvbXBsYWludCA9CisgIHsiaW52YWxpZCAobWluaW1hbCkgbWVtYmVyIHR5cGUgZGF0YSBmb3JtYXQgYXQgc3ltdGFiIHBvcyAlZC4iLCAwLCAwfTsKKworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgcmFuZ2VfdHlwZV9iYXNlX2NvbXBsYWludCA9CisgIHsiYmFzZSB0eXBlICVkIG9mIHJhbmdlIHR5cGUgaXMgbm90IGRlZmluZWQiLCAwLCAwfTsKKworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgcmVnX3ZhbHVlX2NvbXBsYWludCA9CisgIHsicmVnaXN0ZXIgbnVtYmVyICVkIHRvbyBsYXJnZSAobWF4ICVkKSBpbiBzeW1ib2wgJXMiLCAwLCAwfTsKKworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgdnRibF9ub3Rmb3VuZF9jb21wbGFpbnQgPQorICB7InZpcnR1YWwgZnVuY3Rpb24gdGFibGUgcG9pbnRlciBub3QgZm91bmQgd2hlbiBkZWZpbmluZyBjbGFzcyBgJXMnIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IHVucmVjb2duaXplZF9jcGx1c19uYW1lX2NvbXBsYWludCA9CisgIHsiVW5rbm93biBDKysgc3ltYm9sIG5hbWUgYCVzJyIsIDAsIDB9OworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCByczYwMDBfYnVpbHRpbl9jb21wbGFpbnQgPQorICB7IlVua25vd24gYnVpbHRpbiB0eXBlICVkIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IHVucmVzb2x2ZWRfc3ltX2NoYWluX2NvbXBsYWludCA9CisgIHsiJXM6IGNvbW1vbiBibG9jayBgJXMnIGZyb20gZ2xvYmFsX3N5bV9jaGFpbiB1bnJlc29sdmVkIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IHN0YWJzX2dlbmVyYWxfY29tcGxhaW50ID0KKyAgeyIlcyIsIDAsIDB9OworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCBscnNfZ2VuZXJhbF9jb21wbGFpbnQgPQorICB7IiVzIiwgMCwgMH07CisKKy8qIE1ha2UgYSBsaXN0IG9mIGZvcndhcmQgcmVmZXJlbmNlcyB3aGljaCBoYXZlbid0IGJlZW4gZGVmaW5lZC4gICovCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqKnVuZGVmX3R5cGVzOworc3RhdGljIGludCB1bmRlZl90eXBlc19hbGxvY2F0ZWQ7CitzdGF0aWMgaW50IHVuZGVmX3R5cGVzX2xlbmd0aDsKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpjdXJyZW50X3N5bWJvbCA9IE5VTEw7CisKKy8qIENoZWNrIGZvciBhbmQgaGFuZGxlIGNyZXRpbm91cyBzdGFicyBzeW1ib2wgbmFtZSBjb250aW51YXRpb24hICAqLworI2RlZmluZSBTVEFCU19DT05USU5VRShwcCxvYmpmaWxlKQkJCQlcCisgIGRvIHsJCQkJCQkJXAorICAgIGlmICgqKihwcCkgPT0gJ1xcJyB8fCAoKioocHApID09ICc/JyAmJiAoKihwcCkpWzFdID09ICdcMCcpKSBcCisgICAgICAqKHBwKSA9IG5leHRfc3ltYm9sX3RleHQgKG9iamZpbGUpOwlcCisgIH0gd2hpbGUgKDApCisMCisvKiBGSVhNRTogVGhlc2UgcHJvYmFibHkgc2hvdWxkIGJlIG91ciBvd24gdHlwZXMgKGxpa2UgcnM2MDAwX2J1aWx0aW5fdHlwZQorICAgaGFzIGl0cyBvd24gdHlwZXMpIHJhdGhlciB0aGFuIGJ1aWx0aW5fdHlwZV8qLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqKm9zOWtfdHlwZV92ZWN0b3JbXSA9IHsKKwkwLAorCSZidWlsdGluX3R5cGVfaW50LAorCSZidWlsdGluX3R5cGVfY2hhciwKKwkmYnVpbHRpbl90eXBlX2xvbmcsCisJJmJ1aWx0aW5fdHlwZV9zaG9ydCwKKwkmYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2NoYXIsCisJJmJ1aWx0aW5fdHlwZV91bnNpZ25lZF9zaG9ydCwKKwkmYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmcsCisJJmJ1aWx0aW5fdHlwZV91bnNpZ25lZF9pbnQsCisJJmJ1aWx0aW5fdHlwZV9mbG9hdCwKKwkmYnVpbHRpbl90eXBlX2RvdWJsZSwKKwkmYnVpbHRpbl90eXBlX3ZvaWQsCisJJmJ1aWx0aW5fdHlwZV9sb25nX2RvdWJsZQorfTsKKworc3RhdGljIHZvaWQgb3M5a19pbml0X3R5cGVfdmVjdG9yIFBBUkFNUyAoKHN0cnVjdCB0eXBlICoqKSk7CisKK3N0YXRpYyB2b2lkCitvczlrX2luaXRfdHlwZV92ZWN0b3IodHYpCisgICAgc3RydWN0IHR5cGUgKip0djsKK3sKKyAgaW50IGk7CisgIGZvciAoaT0wOyBpPHNpemVvZihvczlrX3R5cGVfdmVjdG9yKS9zaXplb2Yoc3RydWN0IHR5cGUgKiopOyBpKyspCisgICAgdHZbaV0gPSAob3M5a190eXBlX3ZlY3RvcltpXSA9PSAwID8gMCA6ICoob3M5a190eXBlX3ZlY3RvcltpXSkpOworfQorCisvKiBMb29rIHVwIGEgZGJ4IHR5cGUtbnVtYmVyIHBhaXIuICBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHNsb3QKKyAgIHdoZXJlIHRoZSB0eXBlIGZvciB0aGF0IG51bWJlci1wYWlyIGlzIHN0b3JlZC4KKyAgIFRoZSBudW1iZXItcGFpciBpcyBpbiBUWVBFTlVNUy4KKworICAgVGhpcyBjYW4gYmUgdXNlZCBmb3IgZmluZGluZyB0aGUgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBwYWlyCisgICBvciBmb3IgYXNzb2NpYXRpbmcgYSBuZXcgdHlwZSB3aXRoIHRoZSBwYWlyLiAgKi8KKworc3RydWN0IHR5cGUgKioKK2RieF9sb29rdXBfdHlwZSAodHlwZW51bXMpCisgICAgIGludCB0eXBlbnVtc1syXTsKK3sKKyAgcmVnaXN0ZXIgaW50IGZpbGVudW0gPSB0eXBlbnVtc1swXTsKKyAgcmVnaXN0ZXIgaW50IGluZGV4ID0gdHlwZW51bXNbMV07CisgIHVuc2lnbmVkIG9sZF9sZW47CisgIHJlZ2lzdGVyIGludCByZWFsX2ZpbGVudW07CisgIHJlZ2lzdGVyIHN0cnVjdCBoZWFkZXJfZmlsZSAqZjsKKyAgaW50IGZfb3JpZ19sZW5ndGg7CisKKyAgaWYgKGZpbGVudW0gPT0gLTEpCQkvKiAtMSwtMSBpcyBmb3IgdGVtcG9yYXJ5IHR5cGVzLiAgKi8KKyAgICByZXR1cm4gMDsKKworICBpZiAoZmlsZW51bSA8IDAgfHwgZmlsZW51bSA+PSBuX3RoaXNfb2JqZWN0X2hlYWRlcl9maWxlcykKKyAgICB7CisgICAgICBzdGF0aWMgc3RydWN0IGNvbXBsYWludCBtc2cgPSB7IlwKK0ludmFsaWQgc3ltYm9sIGRhdGE6IHR5cGUgbnVtYmVyICglZCwlZCkgb3V0IG9mIHJhbmdlIGF0IHN5bXRhYiBwb3MgJWQuIiwKKwkJCQkwLCAwfTsKKyAgICAgIGNvbXBsYWluICgmbXNnLCBmaWxlbnVtLCBpbmRleCwgc3ltbnVtKTsKKyAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOworICAgIH0KKworICBpZiAoZmlsZW51bSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChpbmRleCA8IDApCisJeworCSAgLyogQ2FsbGVyIHdhbnRzIGFkZHJlc3Mgb2YgYWRkcmVzcyBvZiB0eXBlLiAgV2UgdGhpbmsKKwkgICAgIHRoYXQgbmVnYXRpdmUgKHJzNmsgYnVpbHRpbikgdHlwZXMgd2lsbCBuZXZlciBhcHBlYXIgYXMKKwkgICAgICJsdmFsdWVzIiwgKG5vciBzaG91bGQgdGhleSksIHNvIHdlIHN0dWZmIHRoZSByZWFsIHR5cGUKKwkgICAgIHBvaW50ZXIgaW50byBhIHRlbXAsIGFuZCByZXR1cm4gaXRzIGFkZHJlc3MuICBJZiByZWZlcmVuY2VkLAorCSAgICAgdGhpcyB3aWxsIGRvIHRoZSByaWdodCB0aGluZy4gICovCisJICBzdGF0aWMgc3RydWN0IHR5cGUgKnRlbXBfdHlwZTsKKworCSAgdGVtcF90eXBlID0gcnM2MDAwX2J1aWx0aW5fdHlwZShpbmRleCk7CisJICByZXR1cm4gJnRlbXBfdHlwZTsKKwl9CisKKyAgICAgIC8qIFR5cGUgaXMgZGVmaW5lZCBvdXRzaWRlIG9mIGhlYWRlciBmaWxlcy4KKwkgRmluZCBpdCBpbiB0aGlzIG9iamVjdCBmaWxlJ3MgdHlwZSB2ZWN0b3IuICAqLworICAgICAgaWYgKGluZGV4ID49IHR5cGVfdmVjdG9yX2xlbmd0aCkKKwl7CisJICBvbGRfbGVuID0gdHlwZV92ZWN0b3JfbGVuZ3RoOworCSAgaWYgKG9sZF9sZW4gPT0gMCkKKwkgICAgeworCSAgICAgIHR5cGVfdmVjdG9yX2xlbmd0aCA9IElOSVRJQUxfVFlQRV9WRUNUT1JfTEVOR1RIOworCSAgICAgIHR5cGVfdmVjdG9yID0gKHN0cnVjdCB0eXBlICoqKQorCQl4bWFsbG9jICh0eXBlX3ZlY3Rvcl9sZW5ndGggKiBzaXplb2YgKHN0cnVjdCB0eXBlICopKTsKKwkgICAgfQorCSAgd2hpbGUgKGluZGV4ID49IHR5cGVfdmVjdG9yX2xlbmd0aCkKKwkgICAgeworCSAgICAgIHR5cGVfdmVjdG9yX2xlbmd0aCAqPSAyOworCSAgICB9CisJICB0eXBlX3ZlY3RvciA9IChzdHJ1Y3QgdHlwZSAqKikKKwkgICAgeHJlYWxsb2MgKChjaGFyICopIHR5cGVfdmVjdG9yLAorCQkgICAgICAodHlwZV92ZWN0b3JfbGVuZ3RoICogc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSkpOworCSAgbWVtc2V0ICgmdHlwZV92ZWN0b3Jbb2xkX2xlbl0sIDAsCisJCSAgKHR5cGVfdmVjdG9yX2xlbmd0aCAtIG9sZF9sZW4pICogc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSk7CisKKwkgIGlmIChvczlrX3N0YWJzKQorCSAgICAvKiBEZWFsIHdpdGggT1M5MDAwIGZ1bmRhbWVudGFsIHR5cGVzLiAgKi8KKwkgICAgb3M5a19pbml0X3R5cGVfdmVjdG9yICh0eXBlX3ZlY3Rvcik7CisJfQorICAgICAgcmV0dXJuICgmdHlwZV92ZWN0b3JbaW5kZXhdKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZWFsX2ZpbGVudW0gPSB0aGlzX29iamVjdF9oZWFkZXJfZmlsZXNbZmlsZW51bV07CisKKyAgICAgIGlmIChyZWFsX2ZpbGVudW0gPj0gTl9IRUFERVJfRklMRVMgKGN1cnJlbnRfb2JqZmlsZSkpCisJeworCSAgc3RydWN0IHR5cGUgKnRlbXBfdHlwZTsKKwkgIHN0cnVjdCB0eXBlICoqdGVtcF90eXBlX3A7CisKKwkgIHdhcm5pbmcgKCJHREIgaW50ZXJuYWwgZXJyb3I6IGJhZCByZWFsX2ZpbGVudW0iKTsKKworCWVycm9yX3JldHVybjoKKwkgIHRlbXBfdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0VSUk9SLCAwLCAwLCBOVUxMLCBOVUxMKTsKKwkgIHRlbXBfdHlwZV9wID0gKHN0cnVjdCB0eXBlICoqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCB0eXBlICopKTsKKwkgICp0ZW1wX3R5cGVfcCA9IHRlbXBfdHlwZTsKKwkgIHJldHVybiB0ZW1wX3R5cGVfcDsKKwl9CisKKyAgICAgIGYgPSBIRUFERVJfRklMRVMgKGN1cnJlbnRfb2JqZmlsZSkgKyByZWFsX2ZpbGVudW07CisKKyAgICAgIGZfb3JpZ19sZW5ndGggPSBmLT5sZW5ndGg7CisgICAgICBpZiAoaW5kZXggPj0gZl9vcmlnX2xlbmd0aCkKKwl7CisJICB3aGlsZSAoaW5kZXggPj0gZi0+bGVuZ3RoKQorCSAgICB7CisJICAgICAgZi0+bGVuZ3RoICo9IDI7CisJICAgIH0KKwkgIGYtPnZlY3RvciA9IChzdHJ1Y3QgdHlwZSAqKikKKwkgICAgeHJlYWxsb2MgKChjaGFyICopIGYtPnZlY3RvciwgZi0+bGVuZ3RoICogc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSk7CisJICBtZW1zZXQgKCZmLT52ZWN0b3JbZl9vcmlnX2xlbmd0aF0sIDAsCisJCSAgKGYtPmxlbmd0aCAtIGZfb3JpZ19sZW5ndGgpICogc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSk7CisJfQorICAgICAgcmV0dXJuICgmZi0+dmVjdG9yW2luZGV4XSk7CisgICAgfQorfQorCisvKiBNYWtlIHN1cmUgdGhlcmUgaXMgYSB0eXBlIGFsbG9jYXRlZCBmb3IgdHlwZSBudW1iZXJzIFRZUEVOVU1TCisgICBhbmQgcmV0dXJuIHRoZSB0eXBlIG9iamVjdC4KKyAgIFRoaXMgY2FuIGNyZWF0ZSBhbiBlbXB0eSAoemVyb2VkKSB0eXBlIG9iamVjdC4KKyAgIFRZUEVOVU1TIG1heSBiZSAoLTEsIC0xKSB0byByZXR1cm4gYSBuZXcgdHlwZSBvYmplY3QgdGhhdCBpcyBub3QKKyAgIHB1dCBpbnRvIHRoZSB0eXBlIHZlY3RvciwgYW5kIHNvIG1heSBub3QgYmUgcmVmZXJyZWQgdG8gYnkgbnVtYmVyLiAqLworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorZGJ4X2FsbG9jX3R5cGUgKHR5cGVudW1zLCBvYmpmaWxlKQorICAgICBpbnQgdHlwZW51bXNbMl07CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqKnR5cGVfYWRkcjsKKworICBpZiAodHlwZW51bXNbMF0gPT0gLTEpCisgICAgeworICAgICAgcmV0dXJuIChhbGxvY190eXBlIChvYmpmaWxlKSk7CisgICAgfQorCisgIHR5cGVfYWRkciA9IGRieF9sb29rdXBfdHlwZSAodHlwZW51bXMpOworCisgIC8qIElmIHdlIGFyZSByZWZlcnJpbmcgdG8gYSB0eXBlIG5vdCBrbm93biBhdCBhbGwgeWV0LAorICAgICBhbGxvY2F0ZSBhbiBlbXB0eSB0eXBlIGZvciBpdC4KKyAgICAgV2Ugd2lsbCBmaWxsIGl0IGluIGxhdGVyIGlmIHdlIGZpbmQgb3V0IGhvdy4gICovCisgIGlmICgqdHlwZV9hZGRyID09IDApCisgICAgeworICAgICAgKnR5cGVfYWRkciA9IGFsbG9jX3R5cGUgKG9iamZpbGUpOworICAgIH0KKworICByZXR1cm4gKCp0eXBlX2FkZHIpOworfQorCisvKiBmb3IgYWxsIHRoZSBzdGFicyBpbiBhIGdpdmVuIHN0YWIgdmVjdG9yLCBidWlsZCBhcHByb3ByaWF0ZSB0eXBlcyAKKyAgIGFuZCBmaXggdGhlaXIgc3ltYm9scyBpbiBnaXZlbiBzeW1ib2wgdmVjdG9yLiAqLworCitzdGF0aWMgdm9pZAorcGF0Y2hfYmxvY2tfc3RhYnMgKHN5bWJvbHMsIHN0YWJzLCBvYmpmaWxlKQorICAgICBzdHJ1Y3QgcGVuZGluZyAqc3ltYm9sczsKKyAgICAgc3RydWN0IHBlbmRpbmdfc3RhYnMgKnN0YWJzOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaW50IGlpOworICBjaGFyICpuYW1lOworICBjaGFyICpwcDsKKyAgc3RydWN0IHN5bWJvbCAqc3ltOworCisgIGlmIChzdGFicykKKyAgICB7CisgICAgICAKKyAgICAgIC8qIGZvciBhbGwgdGhlIHN0YWIgZW50cmllcywgZmluZCB0aGVpciBjb3JyZXNwb25kaW5nIHN5bWJvbHMgYW5kIAorCSBwYXRjaCB0aGVpciB0eXBlcyEgKi8KKyAgICAgIAorICAgICAgZm9yIChpaSA9IDA7IGlpIDwgc3RhYnMtPmNvdW50OyArK2lpKQorCXsKKwkgIG5hbWUgPSBzdGFicy0+c3RhYltpaV07CisJICBwcCA9IChjaGFyKikgc3RyY2hyIChuYW1lLCAnOicpOworCSAgd2hpbGUgKHBwWzFdID09ICc6JykKKwkgICAgeworCSAgICAgICBwcCArPSAyOworCSAgICAgICBwcCA9IChjaGFyICopc3RyY2hyKHBwLCAnOicpOworCSAgICB9CisJICBzeW0gPSBmaW5kX3N5bWJvbF9pbl9saXN0IChzeW1ib2xzLCBuYW1lLCBwcC1uYW1lKTsKKwkgIGlmICghc3ltKQorCSAgICB7CisJICAgICAgLyogRklYTUUtbWF5YmU6IGl0IHdvdWxkIGJlIG5pY2UgaWYgd2Ugbm90aWNlZCB3aGV0aGVyCisJCSB0aGUgdmFyaWFibGUgd2FzIGRlZmluZWQgKmFueXdoZXJlKiwgbm90IGp1c3Qgd2hldGhlcgorCQkgaXQgaXMgZGVmaW5lZCBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuICBCdXQgbmVpdGhlcgorCQkgeGxjIG9yIEdDQyBzZWVtIHRvIG5lZWQgc3VjaCBhIGRlZmluaXRpb24sIGFuZCB1bnRpbAorCQkgd2UgZG8gcHN5bXRhYnMgKHNvIHRoYXQgdGhlIG1pbmltYWwgc3ltYm9scyBmcm9tIGFsbAorCQkgY29tcGlsYXRpb24gdW5pdHMgYXJlIGF2YWlsYWJsZSBub3cpLCBJJ20gbm90IHN1cmUKKwkJIGhvdyB0byBnZXQgdGhlIGluZm9ybWF0aW9uLiAgKi8KKworCSAgICAgIC8qIE9uIHhjb2ZmLCBpZiBhIGdsb2JhbCBpcyBkZWZpbmVkIGFuZCBuZXZlciByZWZlcmVuY2VkLAorCQkgbGQgd2lsbCByZW1vdmUgaXQgZnJvbSB0aGUgZXhlY3V0YWJsZS4gIFRoZXJlIGlzIHRoZW4KKwkJIGEgTl9HU1lNIHN0YWIgZm9yIGl0LCBidXQgbm8gcmVndWxhciAoQ19FWFQpIHN5bWJvbC4gICovCisJICAgICAgc3ltID0gKHN0cnVjdCBzeW1ib2wgKikKKwkJb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrLAorCQkJICAgICAgIHNpemVvZiAoc3RydWN0IHN5bWJvbCkpOworCisJICAgICAgbWVtc2V0IChzeW0sIDAsIHNpemVvZiAoc3RydWN0IHN5bWJvbCkpOworCSAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworCSAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19PUFRJTUlaRURfT1VUOworCSAgICAgIFNZTUJPTF9OQU1FIChzeW0pID0KKwkJb2JzYXZlc3RyaW5nIChuYW1lLCBwcCAtIG5hbWUsICZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjayk7CisJICAgICAgcHAgKz0gMjsKKwkgICAgICBpZiAoKihwcC0xKSA9PSAnRicgfHwgKihwcC0xKSA9PSAnZicpCisJCXsKKwkJICAvKiBJIGRvbid0IHRoaW5rIHRoZSBsaW5rZXIgZG9lcyB0aGlzIHdpdGggZnVuY3Rpb25zLAorCQkgICAgIHNvIGFzIGZhciBhcyBJIGtub3cgdGhpcyBpcyBuZXZlciBleGVjdXRlZC4KKwkJICAgICBCdXQgaXQgZG9lc24ndCBodXJ0IHRvIGNoZWNrLiAgKi8KKwkJICBTWU1CT0xfVFlQRSAoc3ltKSA9CisJCSAgICBsb29rdXBfZnVuY3Rpb25fdHlwZSAocmVhZF90eXBlICgmcHAsIG9iamZpbGUpKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIFNZTUJPTF9UWVBFIChzeW0pID0gcmVhZF90eXBlICgmcHAsIG9iamZpbGUpOworCQl9CisJICAgICAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZnbG9iYWxfc3ltYm9scyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHBwICs9IDI7CisJICAgICAgaWYgKCoocHAtMSkgPT0gJ0YnIHx8ICoocHAtMSkgPT0gJ2YnKQorCQl7CisJCSAgU1lNQk9MX1RZUEUgKHN5bSkgPQorCQkgICAgbG9va3VwX2Z1bmN0aW9uX3R5cGUgKHJlYWRfdHlwZSAoJnBwLCBvYmpmaWxlKSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBTWU1CT0xfVFlQRSAoc3ltKSA9IHJlYWRfdHlwZSAoJnBwLCBvYmpmaWxlKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KK30KKworDAorLyogUmVhZCBhIG51bWJlciBieSB3aGljaCBhIHR5cGUgaXMgcmVmZXJyZWQgdG8gaW4gZGJ4IGRhdGEsCisgICBvciBwZXJoYXBzIHJlYWQgYSBwYWlyIChGSUxFTlVNLCBUWVBFTlVNKSBpbiBwYXJlbnRoZXNlcy4KKyAgIEp1c3QgYSBzaW5nbGUgbnVtYmVyIE4gaXMgZXF1aXZhbGVudCB0byAoMCxOKS4KKyAgIFJldHVybiB0aGUgdHdvIG51bWJlcnMgYnkgc3RvcmluZyB0aGVtIGluIHRoZSB2ZWN0b3IgVFlQRU5VTVMuCisgICBUWVBFTlVNUyB3aWxsIHRoZW4gYmUgdXNlZCBhcyBhbiBhcmd1bWVudCB0byBkYnhfbG9va3VwX3R5cGUuCisKKyAgIFJldHVybnMgMCBmb3Igc3VjY2VzcywgLTEgZm9yIGVycm9yLiAgKi8KKworc3RhdGljIGludAorcmVhZF90eXBlX251bWJlciAocHAsIHR5cGVudW1zKQorICAgICByZWdpc3RlciBjaGFyICoqcHA7CisgICAgIHJlZ2lzdGVyIGludCAqdHlwZW51bXM7Cit7CisgIGludCBuYml0czsKKyAgaWYgKCoqcHAgPT0gJygnKQorICAgIHsKKyAgICAgICgqcHApKys7CisgICAgICB0eXBlbnVtc1swXSA9IHJlYWRfaHVnZV9udW1iZXIgKHBwLCAnLCcsICZuYml0cyk7CisgICAgICBpZiAobmJpdHMgIT0gMCkgcmV0dXJuIC0xOworICAgICAgdHlwZW51bXNbMV0gPSByZWFkX2h1Z2VfbnVtYmVyIChwcCwgJyknLCAmbmJpdHMpOworICAgICAgaWYgKG5iaXRzICE9IDApIHJldHVybiAtMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB0eXBlbnVtc1swXSA9IDA7CisgICAgICB0eXBlbnVtc1sxXSA9IHJlYWRfaHVnZV9udW1iZXIgKHBwLCAwLCAmbmJpdHMpOworICAgICAgaWYgKG5iaXRzICE9IDApIHJldHVybiAtMTsKKyAgICB9CisgIHJldHVybiAwOworfQorCisMCisjaWYgIWRlZmluZWQgKFJFR19TVFJVQ1RfSEFTX0FERFIpCisjZGVmaW5lIFJFR19TVFJVQ1RfSEFTX0FERFIoZ2NjX3AsdHlwZSkgMAorI2VuZGlmCisKKyNkZWZpbmUgVklTSUJJTElUWV9QUklWQVRFCScwJwkvKiBTdGFicyBjaGFyYWN0ZXIgZm9yIHByaXZhdGUgZmllbGQgKi8KKyNkZWZpbmUgVklTSUJJTElUWV9QUk9URUNURUQJJzEnCS8qIFN0YWJzIGNoYXJhY3RlciBmb3IgcHJvdGVjdGVkIGZsZCAqLworI2RlZmluZSBWSVNJQklMSVRZX1BVQkxJQwknMicJLyogU3RhYnMgY2hhcmFjdGVyIGZvciBwdWJsaWMgZmllbGQgKi8KKyNkZWZpbmUgVklTSUJJTElUWV9JR05PUkUJJzknCS8qIE9wdGltaXplZCBvdXQgb3IgemVybyBsZW5ndGggKi8KKworI2RlZmluZSBDRlJPTlRfVklTSUJJTElUWV9QUklWQVRFCScyJwkvKiBTdGFicyBjaGFyYWN0ZXIgZm9yIHByaXZhdGUgZmllbGQgKi8KKyNkZWZpbmUgQ0ZST05UX1ZJU0lCSUxJVFlfUFVCTElDCScxJwkvKiBTdGFicyBjaGFyYWN0ZXIgZm9yIHB1YmxpYyBmaWVsZCAqLworCisvKiBUaGlzIGNvZGUgYWRkZWQgdG8gc3VwcG9ydCBwYXJzaW5nIG9mIEFSTS9DZnJvbnQgc3RhYnMgc3RyaW5ncyAqLworCisvKiBHZXQgc3Vic3RyaW5nIGZyb20gc3RyaW5nIHVwIHRvIGNoYXIgYywgYWR2YW5jZSBzdHJpbmcgcG9pbnRlciBwYXN0CisgICBzdWlic3RyaW5nLiAqLworCitzdGF0aWMgY2hhciAqIAorZ2V0X3N1YnN0cmluZyAocCwgYykKKyAgY2hhciAqKiBwOworICBpbnQgYzsKK3sKKyAgY2hhciAqc3RyOworICBzdHIgPSAqcDsKKyAgKnAgPSBzdHJjaHIgKCpwLCBjKTsKKyAgaWYgKCpwKSAKKyAgICB7CisgICAgICAqKnAgPSAwOworICAgICAgKCpwKSsrOworICAgIH0KKyAgZWxzZSAKKyAgICBzdHIgPSAwOworICByZXR1cm4gc3RyOworfQorCisvKiBQaHlzbmFtZSBnZXRzIHN0cmNhdCdkIG9udG8gc25hbWUgaW4gb3JkZXIgdG8gcmVjcmVhdGUgdGhlIG1hbmdsZWQKKyAgIG5hbWUgKHNlZSBmdW50aW9uIGdkYl9tYW5nbGVfbmFtZSBpbiBnZGJ0eXBlcy5jKS4gIEZvciBjZnJvbnQsIG1ha2UKKyAgIHRoZSBwaHlzbmFtZSBsb29rIGxpa2UgdGhhdCBvZiBnKysgLSB0YWtlIG91dCB0aGUgaW5pdGlhbCBtYW5nbGluZworICAgZWc6IGZvciBzbmFtZT0iYSIgYW5kIGZuYW1lPSJmb29fXzFhRlBGc19pIiByZXR1cm4gIkZQRnNfaSIgKi8KKworc3RhdGljIGNoYXIgKiAKK2dldF9jZnJvbnRfbWV0aG9kX3BoeXNuYW1lIChmbmFtZSkKKyAgY2hhciAqZm5hbWU7Cit7CisgIGludCBsZW4gPSAwOworICAvKiBGSVhNRSB3b3VsZCBsaWtlIHRvIG1ha2UgdGhpcyBnZW5lcmljIGZvciBnKysgdG9vLCBidXQgCisgICAgIHRoYXQgaXMgYWxyZWFkeSBoYW5kbGVkIGluIHJlYWRfbWVtYmVyX2Z1bmNjdGlvbnMgKi8KKyAgY2hhciAqIHAgPSBmbmFtZTsKKworICAvKiBzZWFyY2ggYWhlYWQgdG8gZmluZCB0aGUgc3RhcnQgb2YgdGhlIG1hbmdsZWQgc3VmZml4ICovCisgIGlmICgqcCA9PSAnXycgJiYgKihwKzEpPT0nXycpIC8qIGNvbXBpbGVyIGdlbmVyYXRlZDsgcHJvYmFibHkgYSBjdG9yL2R0b3IgKi8KKyAgICBwICs9IDI7ICAJCQorICB3aGlsZSAocCAmJiAodW5zaWduZWQpICgocCsxKSAtIGZuYW1lKSA8IHN0cmxlbiAoZm5hbWUpICYmICoocCsxKSAhPSAnXycpCisgICAgcCA9IHN0cmNociAocCwgJ18nKTsKKyAgaWYgKCEocCAmJiAqcCA9PSAnXycgJiYgKihwKzEpID09ICdfJykpIAorICAgIGVycm9yICgiSW52YWxpZCBtYW5nbGVkIGZ1bmN0aW9uIG5hbWUgJXMiLGZuYW1lKTsKKyAgcCArPSAyOyAvKiBhZHZhbmNlIHBhc3QgJ19fJyAqLworCisgIC8qIHN0cnVjdCBuYW1lIGxlbmd0aCBhbmQgbmFtZSBvZiB0eXBlIHNob3VsZCBjb21lIG5leHQ7IGFkdmFuY2UgcGFzdCBpdCAqLworICB3aGlsZSAoaXNkaWdpdCAoKnApKQorICAgIHsKKyAgICAgIGxlbiA9IGxlbiAqIDEwICsgKCpwIC0gJzAnKTsKKyAgICAgIHArKzsKKyAgICB9CisgIHAgKz0gbGVuOworCisgIHJldHVybiBwOworfQorCisvKiBSZWFkIGJhc2UgY2xhc3NlcyB3aXRoaW4gY2Zyb250IGNsYXNzIGRlZmluaXRpb24uCisgICBlZzogQTpaY0E7MUBCcHViIHYyQEJ2aXJwcmk7X19jdF9fMUFGdiBmdW5jX18xQUZ2ICpzZnVuY19fMUFGdiA7YXNfXzFBIDs7CisgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eCisKKyAgICAgICBBOlpjQTs7Zm9vcHJpX18xQUZ2IGZvb3Byb19fMUFGdiBfX2N0X18xQUZ2IF9fY3RfXzFBRlJDMUEgZm9vcHViX18xQUZ2IDs7OworICAgICAgICAgICAgIF4KKyAgICovCisKK3N0YXRpYyBpbnQKK3JlYWRfY2Zyb250X2Jhc2VjbGFzc2VzIChmaXAsIHBwLCB0eXBlLCBvYmpmaWxlKSAKKyAgc3RydWN0IGZpZWxkX2luZm8gKmZpcDsKKyAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgIGNoYXIgKiogcHA7CisgIHN0cnVjdCB0eXBlICp0eXBlOworeworICBzdGF0aWMgc3RydWN0IGNvbXBsYWludCBtc2dfdW5rbm93biA9IHsiXAorCSBVbnN1cHBvcnRlZCB0b2tlbiBpbiBzdGFicyBzdHJpbmcgJXMuXG4iLAorCQkgIDAsIDB9OworICBzdGF0aWMgc3RydWN0IGNvbXBsYWludCBtc2dfbm90Zm91bmQgPSB7IlwKKwkgICAgICAgICAgIFVuYWJsZSB0byBmaW5kIGJhc2UgdHlwZSBmb3IgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwfTsKKyAgaW50IGJudW0gPSAwOworICBjaGFyICogcDsKKyAgaW50IGk7CisgIHN0cnVjdCBuZXh0ZmllbGQgKm5ldzsKKworICBpZiAoKipwcCA9PSAnOycpCQkvKiBubyBiYXNlIGNsYXNzZXM7IHJldHVybiAqLworICAgIHsKKyAgICAgICsrKCpwcCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgLyogZmlyc3QgY291bnQgYmFzZSBjbGFzc2VzIHNvIHdlIGNhbiBhbGxvY2F0ZSBzcGFjZSBiZWZvcmUgcGFyc2luZyAqLworICBmb3IgKHAgPSAqcHA7IHAgJiYgKnAgJiYgKnAgIT0gJzsnOyBwKyspCisgICAgeworICAgICAgaWYgKCpwID09ICcgJykKKwlibnVtKys7CisgICAgfQorICBibnVtKys7CS8qIGFkZCBvbmUgbW9yZSBmb3IgbGFzdCBvbmUgKi8KKworICAvKiBub3cgcGFyc2UgdGhlIGJhc2UgY2xhc3NlcyB1bnRpbCB3ZSBnZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtZXRob2RzIAorICAgICAoY29kZSBleHRyYWN0ZWQgYW5kIG11bmdlZCBmcm9tIHJlYWRfYmFzZWNsYXNzZXMpICovCisgIEFMTE9DQVRFX0NQTFVTX1NUUlVDVF9UWVBFICh0eXBlKTsKKyAgVFlQRV9OX0JBU0VDTEFTU0VTKHR5cGUpID0gYm51bTsKKworICAvKiBhbGxvY2F0ZSBzcGFjZSAqLworICB7CisgICAgaW50IG51bV9ieXRlcyA9IEJfQllURVMgKFRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSkpOworICAgIGNoYXIgKnBvaW50ZXI7CisKKyAgICBwb2ludGVyID0gKGNoYXIgKikgVFlQRV9BTExPQyAodHlwZSwgbnVtX2J5dGVzKTsKKyAgICBUWVBFX0ZJRUxEX1ZJUlRVQUxfQklUUyAodHlwZSkgPSAoQl9UWVBFICopIHBvaW50ZXI7CisgIH0KKyAgQl9DTFJBTEwgKFRZUEVfRklFTERfVklSVFVBTF9CSVRTICh0eXBlKSwgVFlQRV9OX0JBU0VDTEFTU0VTICh0eXBlKSk7CisKKyAgZm9yIChpID0gMDsgaSA8IFRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSk7IGkrKykKKyAgICB7CisgICAgICBuZXcgPSAoc3RydWN0IG5leHRmaWVsZCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBuZXh0ZmllbGQpKTsKKyAgICAgIG1ha2VfY2xlYW51cCAoZnJlZSwgbmV3KTsKKyAgICAgIG1lbXNldCAobmV3LCAwLCBzaXplb2YgKHN0cnVjdCBuZXh0ZmllbGQpKTsKKyAgICAgIG5ldyAtPiBuZXh0ID0gZmlwIC0+IGxpc3Q7CisgICAgICBmaXAgLT4gbGlzdCA9IG5ldzsKKyAgICAgIEZJRUxEX0JJVFNJWkUgKG5ldy0+ZmllbGQpID0gMDsgLyogdGhpcyBzaG91bGQgYmUgYW4gdW5wYWNrZWQgZmllbGQhICovCisKKyAgICAgIFNUQUJTX0NPTlRJTlVFIChwcCwgb2JqZmlsZSk7CisKKyAgICAgIC8qIHZpcnR1YWw/ICBlZzogdjJAQnZpciAqLworICAgICAgaWYgKCoqcHA9PSd2JykKKyAgICAgICAgeworICAgICAgICAgIFNFVF9UWVBFX0ZJRUxEX1ZJUlRVQUwgKHR5cGUsIGkpOworICAgICAgICAgICsrKCpwcCk7CisJfQorCisgICAgICAvKiBhY2Nlc3M/ICBlZzogMkBCdmlyICovCisJLyogTm90ZTogcHJvdGVjdGVkIGluaGVyaXRhbmNlIG5vdCBzdXBwb3J0ZWQgaW4gY2Zyb250ICovCisgICAgICBzd2l0Y2ggKCooKnBwKSsrKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSBDRlJPTlRfVklTSUJJTElUWV9QUklWQVRFOgorICAgICAgICAgICAgbmV3IC0+IHZpc2liaWxpdHkgPSBWSVNJQklMSVRZX1BSSVZBVEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIENGUk9OVF9WSVNJQklMSVRZX1BVQkxJQzoKKyAgICAgICAgICAgIG5ldyAtPiB2aXNpYmlsaXR5ID0gVklTSUJJTElUWV9QVUJMSUM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogQmFkIHZpc2liaWxpdHkgZm9ybWF0LiAgQ29tcGxhaW4gYW5kIHRyZWF0IGl0IGFzCisgICAgICAgICAgICAgICBwdWJsaWMuICAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBzdGF0aWMgc3RydWN0IGNvbXBsYWludCBtc2cgPSB7CisgICAgICAgICAgICAgICAgIlVua25vd24gdmlzaWJpbGl0eSBgJWMnIGZvciBiYXNlY2xhc3MiLCAwLCAwfTsKKyAgICAgICAgICAgICAgY29tcGxhaW4gKCZtc2csIG5ldyAtPiB2aXNpYmlsaXR5KTsKKyAgICAgICAgICAgICAgbmV3IC0+IHZpc2liaWxpdHkgPSBWSVNJQklMSVRZX1BVQkxJQzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvKiAiQCIgY29tZXMgbmV4dCAtIGVnOiBAQnZpciAqLworICAgICAgaWYgKCoqcHAhPSdAJykKKyAgICAgICAgeworICAgICAgICAgIGNvbXBsYWluICgmbXNnX3Vua25vd24sICpwcCk7CisgICAgICAgICAgcmV0dXJuIDE7CisJfQorICAgICAgKysoKnBwKTsKKworCisgICAgICAgIC8qIFNldCB0aGUgYml0IG9mZnNldCBvZiB0aGUgcG9ydGlvbiBvZiB0aGUgb2JqZWN0IGNvcnJlc3BvbmRpbmcgCisJICAgdG8gdGhpcyBiYXNlY2xhc3MuICBBbHdheXMgemVybyBpbiB0aGUgYWJzZW5jZSBvZgorICAgICAgICAgICBtdWx0aXBsZSBpbmhlcml0YW5jZS4gICovCisgCS8qIFVuYWJsZSB0byByZWFkIGJpdCBwb3NpdGlvbiBmcm9tIHN0YWJzOworCSAgIEFzc3VtaW5nIG5vIG11bHRpcGxlIGluaGVyaXRhbmNlIGZvciBub3cgRklYTUUhICovCisJLyogV2UgbWF5IGhhdmUgcmVhZCB0aGlzIGluIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbjsKKwkgICBub3cgd2Ugc2hvdWxkIGZpeHVwIHRoZSBtZW1iZXJzIHRvIGJlIHRoZSBhY3R1YWwgYmFzZSBjbGFzc2VzICovCisgICAgICAgIEZJRUxEX0JJVFBPUyAobmV3LT5maWVsZCkgPSAwOworCisJLyogR2V0IHRoZSBiYXNlIGNsYXNzIG5hbWUgYW5kIHR5cGUgKi8KKwkgIHsKKyAgCSAgICBjaGFyICogYm5hbWU7CQkvKiBiYXNlIGNsYXNzIG5hbWUgKi8KKyAgCSAgICBzdHJ1Y3Qgc3ltYm9sICogYnN5bTsJLyogYmFzZSBjbGFzcyAqLworCSAgICBjaGFyICogcDEsICogcDI7CisJICAgIHAxID0gc3RyY2hyICgqcHAsJyAnKTsKKwkgICAgcDIgPSBzdHJjaHIgKCpwcCwnOycpOworCSAgICBpZiAocDE8cDIpCisgICAgICAgICAgICAgIGJuYW1lID0gZ2V0X3N1YnN0cmluZyAocHAsJyAnKTsKKwkgICAgZWxzZQorICAgICAgICAgICAgICBibmFtZSA9IGdldF9zdWJzdHJpbmcgKHBwLCc7Jyk7CisgICAgICAgICAgICBpZiAoIWJuYW1lIHx8ICEqYm5hbWUpCisJICAgICAgeworCSAgICAgICAgY29tcGxhaW4gKCZtc2dfdW5rbm93biwgKnBwKTsKKwkJcmV0dXJuIDE7CisJICAgICAgfQorCSAgICAvKiBGSVhNRSEgYXR0YWNoIGJhc2UgaW5mbyB0byB0eXBlICovCisJICAgIGJzeW0gPSBsb29rdXBfc3ltYm9sIChibmFtZSwgMCwgU1RSVUNUX05BTUVTUEFDRSwgMCwgMCk7IC8qZGVtYW5nbGVkX25hbWUqLworCSAgICBpZiAoYnN5bSkgCisJICAgICAgeworCSAgICAgICAgbmV3IC0+IGZpZWxkLnR5cGUgPSBTWU1CT0xfVFlQRShic3ltKTsKKyAgICAgIAkJbmV3IC0+IGZpZWxkLm5hbWUgPSB0eXBlX25hbWVfbm9fdGFnIChuZXcgLT4gZmllbGQudHlwZSk7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCSAgICAgICAgY29tcGxhaW4gKCZtc2dfbm90Zm91bmQsICpwcCk7CisJCXJldHVybiAxOworCSAgICAgIH0KKwkgIH0KKworICAgICAgLyogSWYgbW9yZSBiYXNlIGNsYXNzZXMgdG8gcGFyc2UsIGxvb3AgYWdhaW4uCisgICAgICAgICBXZSBhdGUgdGhlIGxhc3QgJyAnIG9yICc7JyBpbiBnZXRfc3Vic3RyaW5nLAorICAgICAgICAgc28gb24gZXhpdCB3ZSB3aWxsIGhhdmUgc2tpcHBlZCB0aGUgdHJhaWxpbmcgJzsnICovCisgICAgICAvKiBpZiBpbnZhbGlkLCByZXR1cm4gMDsgYWRkIGNvZGUgdG8gZGV0ZWN0ICAtIEZJWE1FISAqLworICAgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qIHJlYWQgY2Zyb250IG1lbWJlciBmdW5jdGlvbnMuCisgICBwcCBwb2ludHMgdG8gc3RyaW5nIHN0YXJ0aW5nIHdpdGggbGlzdCBvZiBmdW5jdGlvbnMKKyAgIGVnOiBBOlpjQTsxQEJwdWIgdjJAQnZpcnByaTtfX2N0X18xQUZ2IGZ1bmNfXzFBRnYgKnNmdW5jX18xQUZ2IDthc19fMUEgOzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4gCisgICAgICAgQTpaY0E7O2Zvb3ByaV9fMUFGdiBmb29wcm9fXzFBRnYgX19jdF9fMUFGdiBfX2N0X18xQUZSQzFBIGZvb3B1Yl9fMUFGdiA7OzsKKyAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4gCisqLworCitzdGF0aWMgaW50CityZWFkX2Nmcm9udF9tZW1iZXJfZnVuY3Rpb25zIChmaXAsIHBwLCB0eXBlLCBvYmpmaWxlKQorICAgICBzdHJ1Y3QgZmllbGRfaW5mbyAqZmlwOworICAgICBjaGFyICoqcHA7CisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgLyogVGhpcyBjb2RlIGV4dHJhY3RlZCBmcm9tIHJlYWRfbWVtYmVyX2Z1bmN0aW9ucyAKKyAgICAgc28gYXMgdG8gZG8gdGhlIHNpbWlsYXIgdGhpbmcgZm9yIG91ciBmdW5jcyAqLworCisgIGludCBuZm5fZmllbGRzID0gMDsKKyAgaW50IGxlbmd0aCA9IDA7CisgIC8qIFRvdGFsIG51bWJlciBvZiBtZW1iZXIgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcyBjbGFzcy4gIElmIHRoZSBjbGFzcworICAgICBkZWZpbmVzIHR3byBgZicgZnVuY3Rpb25zLCBhbmQgb25lIGBnJyBmdW5jdGlvbiwgdGhlbiB0aGlzIHdpbGwgaGF2ZQorICAgICB0aGUgdmFsdWUgMy4gICovCisgIGludCB0b3RhbF9sZW5ndGggPSAwOworICBpbnQgaTsKKyAgc3RydWN0IG5leHRfZm5maWVsZAorICAgIHsKKyAgICAgIHN0cnVjdCBuZXh0X2ZuZmllbGQgKm5leHQ7CisgICAgICBzdHJ1Y3QgZm5fZmllbGQgZm5fZmllbGQ7CisgICAgfSAqc3VibGlzdDsKKyAgc3RydWN0IHR5cGUgKmxvb2tfYWhlYWRfdHlwZTsKKyAgc3RydWN0IG5leHRfZm5maWVsZGxpc3QgKm5ld19mbmxpc3Q7CisgIHN0cnVjdCBuZXh0X2ZuZmllbGQgKm5ld19zdWJsaXN0OworICBjaGFyICptYWluX2ZuX25hbWU7CisgIGNoYXIgKiBmbmFtZTsKKyAgc3RydWN0IHN5bWJvbCAqIHJlZl9mdW5jID0gMDsKKyAgICAgIAorICAvKiBQcm9jZXNzIGVhY2ggbGlzdCB1bnRpbCB3ZSBmaW5kIHRoZSBlbmQgb2YgdGhlIG1lbWJlciBmdW5jdGlvbnMuCisgICAgIGVnOiBwID0gIl9fY3RfXzFBRnYgZm9vX18xQUZ2IDs7OyIgKi8KKworICBTVEFCU19DT05USU5VRSAocHAsIG9iamZpbGUpOyAJCS8qIGhhbmRsZSBcXCAqLworCisgIHdoaWxlICgqKnBwICE9ICc7JyAmJiAoZm5hbWUgPSBnZXRfc3Vic3RyaW5nIChwcCwgJyAnKSwgZm5hbWUpKSAKKyAgICB7CisgICAgICBpbnQgaXNfc3RhdGljID0gMDsKKyAgICAgIGludCBzdWJsaXN0X2NvdW50ID0gMDsKKyAgICAgIGNoYXIgKiBwbmFtZTsKKyAgICAgIGlmIChmbmFtZVswXSA9PSAnKicpICAgICAgLyogc3RhdGljIG1lbWJlciAqLworICAgICAgICB7CisgICAgICAgICAgaXNfc3RhdGljPTE7CisgICAgICAgICAgc3VibGlzdF9jb3VudCsrOworICAgICAgICAgIGZuYW1lKys7CisgICAgICAgIH0KKyAgICAgIHJlZl9mdW5jID0gbG9va3VwX3N5bWJvbCAoZm5hbWUsIDAsIFZBUl9OQU1FU1BBQ0UsIDAsIDApOyAvKiBkZW1hbmdsZWQgbmFtZSAqLworICAgICAgaWYgKCFyZWZfZnVuYykgCisgICAgICAgIHsKKyAgICAgICAgICBzdGF0aWMgc3RydWN0IGNvbXBsYWludCBtc2cgPSB7IlwKKyAgICAgIAkJVW5hYmxlIHRvIGZpbmQgZnVuY3Rpb24gc3ltYm9sIGZvciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMH07CisJICBjb21wbGFpbiAoJm1zZywgZm5hbWUpOworCSAgY29udGludWU7CisJfQorICAgICAgc3VibGlzdCA9IE5VTEw7CisgICAgICBsb29rX2FoZWFkX3R5cGUgPSBOVUxMOworICAgICAgbGVuZ3RoID0gMDsKKyAgICAgICAgICAKKyAgICAgIG5ld19mbmxpc3QgPSAoc3RydWN0IG5leHRfZm5maWVsZGxpc3QgKikKKyAgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG5leHRfZm5maWVsZGxpc3QpKTsKKyAgICAgIG1ha2VfY2xlYW51cCAoZnJlZSwgbmV3X2ZubGlzdCk7CisgICAgICBtZW1zZXQgKG5ld19mbmxpc3QsIDAsIHNpemVvZiAoc3RydWN0IG5leHRfZm5maWVsZGxpc3QpKTsKKyAgICAgICAgICAKKyAgICAgIC8qIFRoZSBmb2xsb3dpbmcgaXMgY29kZSB0byB3b3JrIGFyb3VuZCBjZnJvbnQgZ2VuZXJhdGVkIHN0YWJzLgorICAgICAgICAgVGhlIHN0YWJzIGNvbnRhaW5zIGZ1bGwgbWFuZ2xlZCBuYW1lIGZvciBlYWNoIGZpZWxkLgorICAgICAgICAgV2UgdHJ5IHRvIGRlbWFuZ2xlIHRoZSBuYW1lIGFuZCBleHRyYWN0IHRoZSBmaWVsZCBuYW1lIG91dCBvZiBpdC4gICovCisgICAgICB7CisgICAgICAgIGNoYXIgKmRlbSwgKmRlbV9wLCAqZGVtX2FyZ3M7CisgICAgICAgIGludCBkZW1fbGVuOworICAgICAgICBkZW0gPSBjcGx1c19kZW1hbmdsZSAoZm5hbWUsIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKKyAgICAgICAgaWYgKGRlbSAhPSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRlbV9wID0gc3RycmNociAoZGVtLCAnOicpOworICAgICAgICAgICAgaWYgKGRlbV9wICE9IDAgJiYgKihkZW1fcC0xKSA9PSAnOicpCisgICAgICAgICAgICAgIGRlbV9wKys7CisJICAgIC8qIGdldCByaWQgb2YgYXJncyAqLworICAgICAgICAgICAgZGVtX2FyZ3MgPSBzdHJjaHIgKGRlbV9wLCAnKCcpOworCSAgICBpZiAoZGVtX2FyZ3MgPT0gTlVMTCkKKwkgICAgICBkZW1fbGVuID0gc3RybGVuIChkZW1fcCk7CisJICAgIGVsc2UKKyAgICAgIAkgICAgICBkZW1fbGVuID0gZGVtX2FyZ3MgLSBkZW1fcDsKKyAgICAgICAgICAgIG1haW5fZm5fbmFtZSA9CisgICAgICAgICAgICAgICAgICAgb2JzYXZlc3RyaW5nIChkZW1fcCwgZGVtX2xlbiwgJm9iamZpbGUgLT4gdHlwZV9vYnN0YWNrKTsKKyAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBtYWluX2ZuX25hbWUgPQorICAgICAgICAgICAgICAgICAgIG9ic2F2ZXN0cmluZyAoZm5hbWUsIHN0cmxlbiAoZm5hbWUpLCAmb2JqZmlsZSAtPiB0eXBlX29ic3RhY2spOworICAgICAgICAgIH0KKyAgICAgIH0gLyogZW5kIG9mIGNvZGUgZm9yIGNmcm9udCB3b3JrIGFyb3VuZCAqLworCisgICAgbmV3X2ZubGlzdCAtPiBmbl9maWVsZGxpc3QubmFtZSA9IG1haW5fZm5fbmFtZTsKKyAgICAgIAorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogU2V0IHVwIHRoZSBzdWJsaXN0cworICAgICAgIFN1Ymxpc3RzIGFyZSBzdHVmZiBsaWtlIGFyZ3MsIHN0YXRpYywgdmlzaWJpbGl0eSwgZXRjLgorICAgICAgIHNvIGluIEFSTSwgd2UgaGF2ZSB0byBzZXQgdGhhdCBpbmZvIHNvbWUgb3RoZXIgd2F5LgorICAgICAgIE11bHRpcGxlIHN1Ymxpc3RzIGhhcHBlbiBpZiBvdmVybG9hZGluZworICAgICAgIGVnOiBmb286OjI2PSMjMTs6OzJBLjsKKyAgICAgICBJbiBnKyssIHdlJ2QgbG9vcCBoZXJlIHRocnUgYWxsIHRoZSBzdWJsaXN0cy4uLiAgKi8KKworICAgIG5ld19zdWJsaXN0ID0KKyAgICAJKHN0cnVjdCBuZXh0X2ZuZmllbGQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbmV4dF9mbmZpZWxkKSk7CisgICAgbWFrZV9jbGVhbnVwIChmcmVlLCBuZXdfc3VibGlzdCk7CisgICAgbWVtc2V0IChuZXdfc3VibGlzdCwgMCwgc2l6ZW9mIChzdHJ1Y3QgbmV4dF9mbmZpZWxkKSk7CisJICAKKyAgICAvKiBlYXQgMTsgZnJvbSA6OzJBLjsgKi8KKyAgICBuZXdfc3VibGlzdCAtPiBmbl9maWVsZC50eXBlID0gU1lNQk9MX1RZUEUocmVmX2Z1bmMpOyAvKiBub3JtYWxseSB0YWtlcyBhIHJlYWRfdHlwZSAqLworICAgIC8qIE1ha2UgdGhpcyB0eXBlIGxvb2sgbGlrZSBhIG1ldGhvZCBzdHViIGZvciBnZGIgKi8KKyAgICBUWVBFX0ZMQUdTIChuZXdfc3VibGlzdCAtPiBmbl9maWVsZC50eXBlKSB8PSBUWVBFX0ZMQUdfU1RVQjsKKyAgICBUWVBFX0NPREUgKG5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLnR5cGUpID0gVFlQRV9DT0RFX01FVEhPRDsKKworICAgIC8qIElmIHRoaXMgaXMganVzdCBhIHN0dWIsIHRoZW4gd2UgZG9uJ3QgaGF2ZSB0aGUgcmVhbCBuYW1lIGhlcmUuICovCisgICAgaWYgKFRZUEVfRkxBR1MgKG5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLnR5cGUpICYgVFlQRV9GTEFHX1NUVUIpCisgICAgICB7CisgICAgICAgIGlmICghVFlQRV9ET01BSU5fVFlQRSAobmV3X3N1Ymxpc3QgLT4gZm5fZmllbGQudHlwZSkpCisgICAgICAgIFRZUEVfRE9NQUlOX1RZUEUgKG5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLnR5cGUpID0gdHlwZTsKKyAgICAgICAgbmV3X3N1Ymxpc3QgLT4gZm5fZmllbGQuaXNfc3R1YiA9IDE7CisgICAgICB9CisKKyAgICAvKiBwaHlzbmFtZSB1c2VkIGxhdGVyIGluIG1hbmdsaW5nOyBlZyBQRnNfaSw1IGZvciBmb29fXzFhRlBGc19pIAorICAgICAgIHBoeXNuYW1lIGdldHMgc3RyY2F0J2QgaW4gb3JkZXIgdG8gcmVjcmVhdGUgdGhlIG9udG8gbWFuZ2xlZCBuYW1lICovCisgICAgcG5hbWUgPSBnZXRfY2Zyb250X21ldGhvZF9waHlzbmFtZSAoZm5hbWUpOworICAgIG5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLnBoeXNuYW1lID0gc2F2ZXN0cmluZyAocG5hbWUsIHN0cmxlbiAocG5hbWUpKTsKKyAgICAgIAorCisgICAgLyogU2V0IHRoaXMgbWVtYmVyIGZ1bmN0aW9uJ3MgdmlzaWJpbGl0eSBmaWVsZHMuIAorICAgICAgIFVuYWJsZSB0byBkaXN0aW5ndWlzaCBhY2Nlc3MgZnJvbSBzdGFicyBkZWZpbml0aW9uIQorICAgICAgICAgQXNzdW1pbmcgcHVibGljIGZvciBub3cuICBGSVhNRSEKKwkgKGZvciBwcml2YXRlLCBzZXQgbmV3X3N1Ymxpc3QtPmZuX2ZpZWxkLmlzX3ByaXZhdGUgPSAxLAorCSBmb3IgcHVibGljLCBzZXQgbmV3X3N1Ymxpc3QtPmZuX2ZpZWxkLmlzX3Byb3RlY3RlZCA9IDEpICovCisgICAgICAgCisgICAgLyogVW5hYmxlIHRvIGRpc3Rpbmd1aXNoIGNvbnN0L3ZvbGF0aWxlIGZyb20gc3RhYnMgZGVmaW5pdGlvbiEKKyAgICAgICBBc3N1bWluZyBub3JtYWwgZm9yIG5vdy4gIEZJWE1FISAqLworCisgICAgbmV3X3N1Ymxpc3QgLT4gZm5fZmllbGQuaXNfY29uc3QgPSAwOworICAgIG5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLmlzX3ZvbGF0aWxlID0gMDsJLyogdm9sYXRpbGUgbm90IGltcGxlbWVudGVkIGluIGNmcm9udCAqLworCSAgCisgICAgLyogU2V0IHZpcnR1YWwvc3RhdGljIGZ1bmN0aW9uIGluZm8KKyAgICAgICBIb3cgdG8gZ2V0IHZ0YWJsZSBvZmZzZXRzID8gCisgICAgICAgQXNzdW1pbmcgbm9ybWFsIGZvciBub3cgRklYTUUhISAKKyAgICAgICBGb3IgdnRhYmxlcywgZmlndXJlIG91dCBmcm9tIHdoZW5jZSB0aGlzIHZpcnR1YWwgZnVuY3Rpb24gY2FtZS4KKyAgICAgICBJdCBtYXkgYmVsb25nIHRvIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgb2YKKyAgICAgICBvbmUgb2YgaXRzIGJhc2VjbGFzc2VzLgorCSBzZXQ6CisJICAgbmV3X3N1Ymxpc3QgLT4gZm5fZmllbGQudm9mZnNldCA9IHZ0YWJsZSBvZmZzZXQsCisJICAgbmV3X3N1Ymxpc3QgLT4gZm5fZmllbGQuZmNvbnRleHQgPSBsb29rX2FoZWFkX3R5cGU7CisJICAgd2hlcmUgbG9va19haGVhZF90eXBlIGlzIHR5cGUgb2YgYmFzZWNsYXNzICovCisgICAgaWYgKGlzX3N0YXRpYykKKyAgICAgIG5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLnZvZmZzZXQgPSBWT0ZGU0VUX1NUQVRJQzsKKyAgICBlbHNlIAkJCQkvKiBub3JtYWwgbWVtYmVyIGZ1bmN0aW9uLiAgKi8KKyAgICAgIG5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLnZvZmZzZXQgPSAwOworICAgIG5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLmZjb250ZXh0ID0gMDsKKyAKKworICAgIC8qIFByZXBhcmUgbmV3IHN1Ymxpc3QgKi8KKyAgICBuZXdfc3VibGlzdCAtPiBuZXh0ID0gc3VibGlzdDsKKyAgICBzdWJsaXN0ID0gbmV3X3N1Ymxpc3Q7CisgICAgbGVuZ3RoKys7CisKKyAgICAvKiBJbiBnKyssIHdlIGxvb3AgdGh1IHN1Ymxpc3RzIC0gbm93IHdlIHNldCBmcm9tIGZ1bmN0aW9ucy4gKi8KKyAgICBuZXdfZm5saXN0IC0+IGZuX2ZpZWxkbGlzdC5mbl9maWVsZHMgPSAoc3RydWN0IGZuX2ZpZWxkICopCisgICAgICAgICBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZSAtPiB0eXBlX29ic3RhY2ssIAorICAgICAJICAgICAgIHNpemVvZiAoc3RydWN0IGZuX2ZpZWxkKSAqIGxlbmd0aCk7CisgICAgbWVtc2V0IChuZXdfZm5saXN0IC0+IGZuX2ZpZWxkbGlzdC5mbl9maWVsZHMsIDAsCisgICAgICAgICAgIHNpemVvZiAoc3RydWN0IGZuX2ZpZWxkKSAqIGxlbmd0aCk7CisgICAgZm9yIChpID0gbGVuZ3RoOyAoaS0tLCBzdWJsaXN0KTsgc3VibGlzdCA9IHN1Ymxpc3QgLT4gbmV4dCkKKyAgICAgIHsKKyAgICAgICAgbmV3X2ZubGlzdCAtPiBmbl9maWVsZGxpc3QuZm5fZmllbGRzW2ldID0gc3VibGlzdCAtPiBmbl9maWVsZDsKKyAgICAgIH0KKyAgICAgIAorICAgIG5ld19mbmxpc3QgLT4gZm5fZmllbGRsaXN0Lmxlbmd0aCA9IGxlbmd0aDsKKyAgICBuZXdfZm5saXN0IC0+IG5leHQgPSBmaXAgLT4gZm5saXN0OworICAgIGZpcCAtPiBmbmxpc3QgPSBuZXdfZm5saXN0OworICAgIG5mbl9maWVsZHMrKzsKKyAgICB0b3RhbF9sZW5ndGggKz0gbGVuZ3RoOworICAgIFNUQUJTX0NPTlRJTlVFIChwcCwgb2JqZmlsZSk7IC8qIGhhbmRsZSBcXCAqLworICB9IC8qIGVuZCBvZiBsb29wICovCisKKyAgaWYgKG5mbl9maWVsZHMpCisgICAgeworICAgICAgLyogdHlwZSBzaG91bGQgYWxyZWFkeSBoYXZlIHNwYWNlICovCisgICAgICBUWVBFX0ZOX0ZJRUxETElTVFMgKHR5cGUpID0gKHN0cnVjdCBmbl9maWVsZGxpc3QgKikKKyAgICAgIFRZUEVfQUxMT0MgKHR5cGUsIHNpemVvZiAoc3RydWN0IGZuX2ZpZWxkbGlzdCkgKiBuZm5fZmllbGRzKTsKKyAgICAgIG1lbXNldCAoVFlQRV9GTl9GSUVMRExJU1RTICh0eXBlKSwgMCwKKyAgICAgICAgIAlzaXplb2YgKHN0cnVjdCBmbl9maWVsZGxpc3QpICogbmZuX2ZpZWxkcyk7CisgICAgICBUWVBFX05GTl9GSUVMRFMgKHR5cGUpID0gbmZuX2ZpZWxkczsKKyAgICAgIFRZUEVfTkZOX0ZJRUxEU19UT1RBTCAodHlwZSkgPSB0b3RhbF9sZW5ndGg7CisgICAgfQorCisgIC8qIGVuZCBvZiBzY29wZSBmb3IgcmVhZGluZyBtZW1iZXIgZnVuYyAqLworCisgIC8qIGVnOiAiOzsiICovCisKKyAgLyogU2tpcCB0cmFpbGluZyAnOycgYW5kIGJ1bXAgY291bnQgb2YgbnVtYmVyIG9mIGZpZWxkcyBzZWVuICovCisgIGlmICgqKnBwID09ICc7JykKKyAgICAoKnBwKSsrOworICBlbHNlCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCisvKiBUaGlzIHJvdXRpbmUgZml4ZXMgdXAgcGFydGlhbCBjZnJvbnQgdHlwZXMgdGhhdCB3ZXJlIGNyZWF0ZWQKKyAgIHdoaWxlIHBhcnNpbmcgdGhlIHN0YWJzLiAgVGhlIG1haW4gbmVlZCBmb3IgdGhpcyBmdW5jdGlvbiBpcworICAgdG8gYWRkIGluZm9ybWF0aW9uIHN1Y2ggYXMgbWV0aG9kcyB0byBjbGFzc2VzLgorICAgRXhhbXBsZXMgb2YgInAiOiAic0E7O19fY3RfXzFBRnYgZm9vX18xQUZ2IDs7OyIgKi8KK2ludAorcmVzb2x2ZV9jZnJvbnRfY29udGludWF0aW9uIChvYmpmaWxlLCBzeW0sIHApCisgIHN0cnVjdCBvYmpmaWxlICogb2JqZmlsZTsKKyAgc3RydWN0IHN5bWJvbCAqIHN5bTsKKyAgY2hhciAqIHA7Cit7CisgIHN0cnVjdCBzeW1ib2wgKiByZWZfc3ltPTA7CisgIGNoYXIgKiBzbmFtZTsKKyAgLyogc25hcmZlZCBmcm9tIHJlYWRfc3RydWN0X3R5cGUgKi8KKyAgc3RydWN0IGZpZWxkX2luZm8gZmk7CisgIHN0cnVjdCB0eXBlICp0eXBlOworICBzdHJ1Y3QgY2xlYW51cCAqYmFja190bzsKKworICAvKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGZpIGlzbid0IGd1bm5hIGNvbmZsaWN0IHdpdGggc3RydWN0IAorICAgICBpbiBjYXNlIHN0cnVjdCBhbHJlYWR5IGhhZCBzb21lIGZuZnMgKi8KKyAgZmkubGlzdCA9IE5VTEw7CisgIGZpLmZubGlzdCA9IE5VTEw7ICAgICAgIAorICBiYWNrX3RvID0gbWFrZV9jbGVhbnVwIChudWxsX2NsZWFudXAsIDApOworCisgIC8qIFdlIG9ubHkgYWNjZXB0IHN0cnVjdHMsIGNsYXNzZXMgYW5kIHVuaW9ucyBhdCB0aGUgbW9tZW50LiAKKyAgICAgT3RoZXIgY29udGludWF0aW9uIHR5cGVzIGluY2x1ZGUgdCAodHlwZWRlZiksIHIgKGxvbmcgZGJsKSwgLi4uIAorICAgICBXZSBtYXkgd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgdGhlbSBhcyB3ZWxsOyAKKyAgICAgcmlnaHQgbm93IHRoZXkgYXJlIGhhbmRsZWQgYnkgZHVwbGljYXRpbmcgdGhlIHN5bWJvbCBpbmZvcm1hdGlvbiAKKyAgICAgaW50byB0aGUgdHlwZSBpbmZvcm1hdGlvbiAoc2VlIGRlZmluZV9zeW1ib2wpICovCisgIGlmICgqcCAhPSAncycgICAgICAgLyogc3RydWN0cyAqLworICAgICYmICpwICE9ICdjJyAgICAgIC8qIGNsYXNzICovCisgICAgJiYgKnAgIT0gJ3UnKSAgICAgLyogdW5pb24gKi8KKyAgICByZXR1cm4gMDsgIC8qIG9ubHkgaGFuZGxlIEMrKyB0eXBlcyAqLworICBwKys7ICAKKworICAvKiBHZXQgc3ltYm9sIHR5cHMgbmFtZSBhbmQgdmFsaWRhdGUgCisgICAgIGVnOiBwID0gIkE7O19fY3RfXzFBRnYgZm9vX18xQUZ2IDs7OyIgKi8KKyAgc25hbWUgPSBnZXRfc3Vic3RyaW5nICgmcCwgJzsnKTsKKyAgaWYgKCFzbmFtZSB8fCBzdHJjbXAgKHNuYW1lLCBTWU1CT0xfTkFNRShzeW0pKSkKKyAgICBlcnJvciAoIkludGVybmFsIGVycm9yOiBiYXNlIHN5bWJvbCB0eXBlIG5hbWUgZG9lcyBub3QgbWF0Y2hcbiIpOworCisgIC8qIEZpbmQgc3ltYm9sJ3MgaW50ZXJuYWwgZ2RiIHJlZmVyZW5jZSB1c2luZyBkZW1hbmdsZWRfbmFtZS4KKyAgICAgVGhpcyBpcyB0aGUgcmVhbCBzeW0gdGhhdCB3ZSB3YW50OyAKKyAgICAgc3ltIHdhcyBhIHRlbXAgaGFjayB0byBtYWtlIGRlYnVnZ2VyIGhhcHB5ICovCisgIHJlZl9zeW0gPSBsb29rdXBfc3ltYm9sIChTWU1CT0xfTkFNRShzeW0pLCAwLCBTVFJVQ1RfTkFNRVNQQUNFLCAwLCAwKTsgCisgIHR5cGUgPSBTWU1CT0xfVFlQRShyZWZfc3ltKTsKKworCisgIC8qIE5vdyByZWFkIHRoZSBiYXNlY2xhc3NlcywgaWYgYW55LCByZWFkIHRoZSByZWd1bGFyIEMgc3RydWN0IG9yIEMrKworICAgICBjbGFzcyBtZW1iZXIgZmllbGRzLCBhdHRhY2ggdGhlIGZpZWxkcyB0byB0aGUgdHlwZSwgcmVhZCB0aGUgQysrCisgICAgIG1lbWJlciBmdW5jdGlvbnMsIGF0dGFjaCB0aGVtIHRvIHRoZSB0eXBlLCBhbmQgdGhlbiByZWFkIGFueSB0aWxkZQorICAgICBmaWVsZCAoYmFzZWNsYXNzIHNwZWNpZmllciBmb3IgdGhlIGNsYXNzIGhvbGRpbmcgdGhlIG1haW4gdnRhYmxlKS4gKi8KKworICBpZiAoIXJlYWRfY2Zyb250X2Jhc2VjbGFzc2VzICgmZmksICZwLCB0eXBlLCBvYmpmaWxlKQorICAgICAgLyogZysrIGRvZXMgdGhpcyBuZXh0LCBidXQgY2Zyb250IGFscmVhZHkgZGlkIHRoaXM6IAorCSAgICB8fCAhcmVhZF9zdHJ1Y3RfZmllbGRzICgmZmksICZwLCB0eXBlLCBvYmpmaWxlKSAqLworICAgICAgfHwgIWNvcHlfY2Zyb250X3N0cnVjdF9maWVsZHMgKCZmaSwgdHlwZSwgb2JqZmlsZSkKKyAgICAgIHx8ICFyZWFkX2Nmcm9udF9tZW1iZXJfZnVuY3Rpb25zICgmZmksICZwLCB0eXBlLCBvYmpmaWxlKQorICAgICAgfHwgIXJlYWRfY2Zyb250X3N0YXRpY19maWVsZHMgKCZmaSwgJnAsIHR5cGUsIG9iamZpbGUpCisgICAgICB8fCAhYXR0YWNoX2ZpZWxkc190b190eXBlICgmZmksIHR5cGUsIG9iamZpbGUpCisgICAgICB8fCAhYXR0YWNoX2ZuX2ZpZWxkc190b190eXBlICgmZmksIHR5cGUpCisgICAgICAvKiBnKysgZG9lcyB0aGlzIG5leHQsIGJ1dCBjZnJvbnQgZG9lc24ndCBzZWVtIHRvIGhhdmUgdGhpczogCisgICAgICAJCXx8ICFyZWFkX3RpbGRlX2ZpZWxkcyAoJmZpLCAmcCwgdHlwZSwgb2JqZmlsZSkgKi8KKyAgICAgICkKKyAgICB7CisgICAgICB0eXBlID0gZXJyb3JfdHlwZSAoJnAsIG9iamZpbGUpOworICAgIH0KKworICBkb19jbGVhbnVwcyAoYmFja190byk7CisgIHJldHVybiAwOyAgCit9CisvKiBFbmQgb2YgY29kZSBhZGRlZCB0byBzdXBwb3J0IHBhcnNpbmcgb2YgQVJNL0Nmcm9udCBzdGFicyBzdHJpbmdzICovCisKKworLyogVGhpcyByb3V0aW5lIGZpeGVzIHVwIHN5bWJvbCByZWZlcmVuY2VzL2FsaWFzZXMgdG8gcG9pbnQgdG8gdGhlIG9yaWdpbmFsCisgICBzeW1ib2wgZGVmaW5pdGlvbi4gIFJldHVybnMgMCBvbiBmYWlsdXJlLCBub24temVybyBvbiBzdWNjZXNzLiAgKi8KKworc3RhdGljIGludAorcmVzb2x2ZV9zeW1ib2xfcmVmZXJlbmNlIChvYmpmaWxlLCBzeW0sIHApCisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIGNoYXIgKnA7Cit7CisgIGludCByZWZudW07CisgIHN0cnVjdCBzeW1ib2wgKnJlZl9zeW09MDsKKyAgc3RydWN0IGFsaWFzX2xpc3QgKmFsaWFzOworCisgIC8qIElmIHRoaXMgaXMgbm90IGEgc3ltYm9sIHJlZmVyZW5jZSByZXR1cm4gbm93LiAgKi8KKyAgaWYgKCpwICE9ICcjJykKKyAgICByZXR1cm4gMDsgIAorCisgIC8qIFVzZSAiIzxudW0+IiBhcyB0aGUgbmFtZTsgd2UnbGwgZml4IHRoZSBuYW1lIGxhdGVyLgorICAgICBXZSBzdG9yZWQgdGhlIG9yaWdpbmFsIHN5bWJvbCBuYW1lIGFzICIjPGlkPj08bmFtZT4iCisgICAgIHNvIHdlIGNhbiBub3cgc2VhcmNoIGZvciAiIzxpZD4iIHRvIHJlc29sdmluZyB0aGUgcmVmZXJlbmNlLgorICAgICBXZSdsbCBmaXggdGhlIG5hbWVzIGxhdGVyIGJ5IHJlbW92aW5nIHRoZSAiIzxpZD4iIG9yICIjPGlkPj0iICovCisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvKiBHZXQgdGhlIHJlZmVyZW5jZSBpZCBudW1iZXIsIGFuZCAKKyAgICAgYWR2YW5jZSBwIHBhc3QgdGhlIG5hbWVzIHNvIHdlIGNhbiBwYXJzZSB0aGUgcmVzdC4gCisgICAgICAgZWc6IGlkPTIgZm9yIHAgOiAiMj0iLCAiMj16OnIoMCwxKSIgIjI6cigwLDEpO2woIzUsIzYpLGwoIzcsIzQpIiAqLworICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgLyogVGhpcyBnZXRzIHJlZmVyZW5jZSBuYW1lIGZyb20gc3RyaW5nLiAgc3ltIG1heSBub3QgaGF2ZSBhIG5hbWUuICovCisKKyAgLyogR2V0IHRoZSByZWZlcmVuY2UgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVmZXJlbmNlIGlkIGluIHRoZQorICAgICBnZGIgc3RhYiBzdHJpbmcuICBGcm9tIHRoYXQgcmVmZXJlbmNlIG51bWJlciwgZ2V0IHRoZSBtYWluL3ByaW1hcnkKKyAgICAgc3ltYm9sIGZvciB0aGlzIGFsaWFzLiAgKi8KKyAgcmVmbnVtID0gcHJvY2Vzc19yZWZlcmVuY2UgKCZwKTsKKyAgcmVmX3N5bSA9IHJlZl9zZWFyY2ggKHJlZm51bSk7CisgIGlmICghcmVmX3N5bSkKKyAgICB7CisgICAgICBjb21wbGFpbiAoJmxyc19nZW5lcmFsX2NvbXBsYWludCwgInN5bWJvbCBmb3IgcmVmZXJlbmNlIG5vdCBmb3VuZCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIFBhcnNlIHRoZSBzdGFiIG9mIHRoZSByZWZlcmVuY2luZyBzeW1ib2wKKyAgICAgbm93IHRoYXQgd2UgaGF2ZSB0aGUgcmVmZXJlbmNlZCBzeW1ib2wuCisgICAgIEFkZCBpdCBhcyBhIG5ldyBzeW1ib2wgYW5kIGEgbGluayBiYWNrIHRvIHRoZSByZWZlcmVuY2VkIHN5bWJvbC4KKyAgICAgZWc6IHAgOiAiPSIsICI9ejpyKDAsMSkiICI6cigwLDEpO2woIzUsIzYpLGwoIzcsIzQpIiAqLworCisKKyAgLyogSWYgdGhlIHN0YWIgc3ltYm9sIHRhYmxlIGFuZCBzdHJpbmcgY29udGFpbjoKKyAgICAgICAgIFJTWU0gICAwICAgICAgNSAgICAgIDAwMDAwMDAwIDg2OCAgICAjMTU9ejpyKDAsMSkKKyAgICAgICAgIExCUkFDICAwICAgICAgMCAgICAgIDAwMDAwMDAwIDg5OSAgICAjNT0KKyAgICAgICAgIFNMSU5FICAwICAgICAgMTYgICAgIDAwMDAwMDAzIDkyMyAgICAjNj0KKyAgICAgVGhlbiB0aGUgc2FtZSBzeW1ib2xzIGNhbiBiZSBsYXRlciByZWZlcmVuY2VkIGJ5OgorICAgICAgICAgUlNZTSAgIDAgICAgICA1ICAgICAgMDAwMDAwMDAgOTI3ICAgICMxNTpyKDAsMSk7bCgjNSwjNikKKyAgICAgVGhpcyBpcyB1c2VkIGluIGxpdmUgcmFuZ2Ugc3BsaXR0aW5nIHRvOgorICAgICAxKSBzcGVjaWZ5IHRoYXQgYSBzeW1ib2wgKCMxNSkgaXMgYWN0dWFsbHkganVzdCBhIG5ldyBzdG9yYWdlIAorICAgICAgICBjbGFzcyBmb3IgYSBzeW1ib2wgKCMxNT16KSB3aGljaCB3YXMgcHJldmlvdXNseSBkZWZpbmVkLgorICAgICAyKSBzcGVjaWZ5IHRoYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kaW5nIHJhbmdlcyBmb3IgYSBzeW1ib2wgCisgICAgICAgICgjMTUpIGFyZSB0aGUgdmFsdWVzIG9mIHRoZSBiZWdpbm5pbmcgKCM1KSBhbmQgZW5kaW5nICgjNikgCisgICAgICAgIHN5bWJvbHMuICovCisgICAgICAgCisgICAvKiBSZWFkIG51bWJlciBhcyByZWZlcmVuY2UgaWQuCisgICAgICBlZzogcCA6ICI9IiwgIj16OnIoMCwxKSIgIjpyKDAsMSk7bCgjNSwjNiksbCgjNywjNCkiICovCisgICAvKiBGSVhNRSEgTWlnaHQgSSB3YW50IHRvIHVzZSBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfT1BUSU1JWkVEX09VVDsKKyAgICAgIGluIGNhc2Ugb2YgImwoMCwwKSI/ICovCisKKyAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgLyogQWRkIHRoaXMgc3ltYm9sIHRvIHRoZSByZWZlcmVuY2UgbGlzdC4gICAgICAgICAgICovCisgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICBhbGlhcyA9IChzdHJ1Y3QgYWxpYXNfbGlzdCAqKSBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+dHlwZV9vYnN0YWNrLAorCQkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbGlzdCkpOworICBpZiAoIWFsaWFzKQorICAgIHsKKyAgICAgIGNvbXBsYWluICgmbHJzX2dlbmVyYWxfY29tcGxhaW50LCAiVW5hYmxlIHRvIGFsbG9jYXRlIGFsaWFzIGxpc3QgbWVtb3J5Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgYWxpYXMtPm5leHQgPSAwOworICBhbGlhcy0+c3ltID0gc3ltOworCisgIGlmICghU1lNQk9MX0FMSUFTRVMgKHJlZl9zeW0pKQorICAgIHsKKyAgICAgIFNZTUJPTF9BTElBU0VTIChyZWZfc3ltKSA9IGFsaWFzOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCBhbGlhc19saXN0ICp0ZW1wOworCisgICAgICAvKiBHZXQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gICovCisgICAgICBmb3IgKHRlbXAgPSBTWU1CT0xfQUxJQVNFUyAocmVmX3N5bSk7CisJICAgdGVtcC0+bmV4dDsKKwkgICB0ZW1wID0gdGVtcC0+bmV4dCkKKwk7CisgICAgICB0ZW1wLT5uZXh0ID0gYWxpYXM7CisgICAgfQorCisgICAvKiBXYW50IHRvIGZpeCB1cCBuYW1lIHNvIHRoYXQgb3RoZXIgZnVuY3Rpb25zIChlZy4gdmFsb3BzKQorICAgICAgd2lsbCBjb3JyZWN0bHkgcHJpbnQgdGhlIG5hbWUuCisgICAgICBEb24ndCBhZGRfc3ltYm9sX3RvX2xpc3Qgc28gdGhhdCBsb29rdXBfc3ltYm9sIHdvbid0IGZpbmQgaXQuCisgICAgICBub3BlLi4uIG5lZWRlZCBmb3IgZml4dXBzLiAqLworICAgU1lNQk9MX05BTUUgKHN5bSkgPSBTWU1CT0xfTkFNRSAocmVmX3N5bSk7CisKKyAgLyogRG9uZSEgICovCisgIHJldHVybiAxOworfQorCisvKiBTdHJ1Y3R1cmUgZm9yIHN0b3JpbmcgcG9pbnRlcnMgdG8gcmVmZXJlbmNlIGRlZmluaXRpb25zIGZvciBmYXN0IGxvb2t1cCAKKyAgIGR1cmluZyAicHJvY2Vzc19sYXRlciIuICovCisKK3N0cnVjdCByZWZfbWFwCit7CisgIGNoYXIgKnN0YWJzOworICBDT1JFX0FERFIgdmFsdWU7CisgIHN0cnVjdCBzeW1ib2wgKnN5bTsKK307CisKKyNkZWZpbmUgTUFYX0NIVU5LX1JFRlMgMTAwCisjZGVmaW5lIFJFRl9DSFVOS19TSVpFIChNQVhfQ0hVTktfUkVGUyAqIHNpemVvZiAoc3RydWN0IHJlZl9tYXApKQorI2RlZmluZSBSRUZfTUFQX1NJWkUocmVmX2NodW5rKSAoKHJlZl9jaHVuaykgKiBSRUZfQ0hVTktfU0laRSkKKworc3RhdGljIHN0cnVjdCByZWZfbWFwICpyZWZfbWFwOwkKKworLyogUHRyIHRvIGZyZWUgY2VsbCBpbiBjaHVuaydzIGxpbmtlZCBsaXN0LiAqLworc3RhdGljIGludCByZWZfY291bnQgPSAwOwkKKworLyogTnVtYmVyIG9mIGNodW5rcyBtYWxsb2NlZC4gKi8KK3N0YXRpYyBpbnQgcmVmX2NodW5rID0gMDsKKworLyogQ3JlYXRlIGFycmF5IG9mIHBvaW50ZXJzIG1hcHBpbmcgcmVmaWRzIHRvIHN5bWJvbHMgYW5kIHN0YWIgc3RyaW5ncy4KKyAgIEFkZCBwb2ludGVycyB0byByZWZlcmVuY2UgZGVmaW5pdGlvbiBzeW1ib2xzIGFuZC9vciB0aGVpciB2YWx1ZXMgYXMgd2UgCisgICBmaW5kIHRoZW0sIHVzaW5nIHRoZWlyIHJlZmVyZW5jZSBudW1iZXJzIGFzIG91ciBpbmRleC4gCisgICBUaGVzZSB3aWxsIGJlIHVzZWQgbGF0ZXIgd2hlbiB3ZSByZXNvbHZlIHJlZmVyZW5jZXMuICovCit2b2lkCityZWZfYWRkIChyZWZudW0sIHN5bSwgc3RhYnMsIHZhbHVlKQorICAgICBpbnQgcmVmbnVtOworICAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgICAgIGNoYXIgKnN0YWJzOworICAgICBDT1JFX0FERFIgdmFsdWU7Cit7CisgIGlmIChyZWZfY291bnQgPT0gMCkKKyAgICByZWZfY2h1bmsgPSAwOworICBpZiAocmVmbnVtID49IHJlZl9jb3VudCkKKyAgICByZWZfY291bnQgPSByZWZudW0gKyAxOworICBpZiAocmVmX2NvdW50ID4gcmVmX2NodW5rICogTUFYX0NIVU5LX1JFRlMpCisgICAgeworICAgICAgaW50IG5ld19zbG90cyA9IHJlZl9jb3VudCAtIHJlZl9jaHVuayAqIE1BWF9DSFVOS19SRUZTOyAKKyAgICAgIGludCBuZXdfY2h1bmtzID0gbmV3X3Nsb3RzIC8gTUFYX0NIVU5LX1JFRlMgKyAxOworICAgICAgcmVmX21hcCA9IChzdHJ1Y3QgcmVmX21hcCAqKQorCXhyZWFsbG9jIChyZWZfbWFwLCBSRUZfTUFQX1NJWkUgKHJlZl9jaHVuayArIG5ld19jaHVua3MpKTsKKyAgICAgIG1lbXNldCAocmVmX21hcCArIHJlZl9jaHVuayAqIE1BWF9DSFVOS19SRUZTLCAwLCBuZXdfY2h1bmtzICogUkVGX0NIVU5LX1NJWkUpOworICAgICAgcmVmX2NodW5rICs9IG5ld19jaHVua3M7CisgICAgfQorICByZWZfbWFwW3JlZm51bV0uc3RhYnMgPSBzdGFiczsKKyAgcmVmX21hcFtyZWZudW1dLnN5bSA9IHN5bTsKKyAgcmVmX21hcFtyZWZudW1dLnZhbHVlID0gdmFsdWU7Cit9CisKKy8qIFJldHVybiBkZWZpbmVkIHN5bSBmb3IgdGhlIHJlZmVyZW5jZSBSRUZOVU0uICAqLworc3RydWN0IHN5bWJvbCAqCityZWZfc2VhcmNoIChyZWZudW0pCisgICAgIGludCByZWZudW07Cit7CisgIGlmIChyZWZudW0gPCAwIHx8IHJlZm51bSA+IHJlZl9jb3VudCkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHJlZl9tYXBbcmVmbnVtXS5zeW07Cit9CisKKy8qIFJldHVybiB2YWx1ZSBmb3IgdGhlIHJlZmVyZW5jZSBSRUZOVU0uICAqLworCitzdGF0aWMgQ09SRV9BRERSCityZWZfc2VhcmNoX3ZhbHVlIChyZWZudW0pCisgICAgIGludCByZWZudW07Cit7CisgIGlmIChyZWZudW0gPCAwIHx8IHJlZm51bSA+IHJlZl9jb3VudCkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHJlZl9tYXBbcmVmbnVtXS52YWx1ZTsKK30KKyAgIAorLyogUGFyc2UgYSByZWZlcmVuY2UgaWQgaW4gU1RSSU5HIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZworICAgcmVmZXJlbmNlIG51bWJlci4gIE1vdmUgU1RSSU5HIGJleW9uZCB0aGUgcmVmZXJlbmNlIGlkLiAgKi8KKworc3RhdGljIGludCAKK3Byb2Nlc3NfcmVmZXJlbmNlIChzdHJpbmcpCisgICAgY2hhciAqKnN0cmluZzsKK3sKKyAgY2hhciAqcDsKKyAgaW50IHJlZm51bSA9IDA7CisKKyAgaWYgKCoqc3RyaW5nICE9ICcjJykgCisgICAgcmV0dXJuIDA7CQorICAgICAKKyAgLyogQWR2YW5jZSBiZXlvbmQgdGhlIGluaXRpYWwgJyMnLiAgKi8KKyAgcCA9ICpzdHJpbmcgKyAxOworCisgIC8qIFJlYWQgbnVtYmVyIGFzIHJlZmVyZW5jZSBpZC4gKi8KKyAgd2hpbGUgKCpwICYmIGlzZGlnaXQgKCpwKSkKKyAgICB7CisgICAgICByZWZudW0gPSByZWZudW0gKiAxMCArICpwIC0gJzAnOworICAgICAgcCsrOworICAgIH0KKyAgKnN0cmluZyA9IHA7CisgIHJldHVybiByZWZudW07Cit9CisKKy8qIElmIFNUUklORyBkZWZpbmVzIGEgcmVmZXJlbmNlLCBzdG9yZSBhd2F5IGEgcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIAorICAgZGVmaW5pdGlvbiBmb3IgbGF0ZXIgdXNlLiAgUmV0dXJuIHRoZSByZWZlcmVuY2UgbnVtYmVyLiAgKi8KKworaW50CitzeW1ib2xfcmVmZXJlbmNlX2RlZmluZWQgKHN0cmluZykKKyAgICAgY2hhciAqKnN0cmluZzsKK3sKKyAgY2hhciAqcCA9ICpzdHJpbmc7CisgIGludCByZWZudW0gPSAwOworCisgIHJlZm51bSA9IHByb2Nlc3NfcmVmZXJlbmNlICgmcCk7CisKKyAgLyogRGVmaW5pbmcgc3ltYm9scyBlbmQgaW4gJz0nICovCisgIGlmICgqcCA9PSAnPScpIAorICAgIHsKKyAgICAgIC8qIFN5bWJvbCBpcyBiZWluZyBkZWZpbmVkIGhlcmUuICovIAorICAgICAgKnN0cmluZyA9IHAgKyAxOworICAgICAgcmV0dXJuIHJlZm51bTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBNdXN0IGJlIGEgcmVmZXJlbmNlLiAgIEVpdGhlciB0aGUgc3ltYm9sIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCwKKyAgICAgICAgIG9yIHRoaXMgaXMgYSBmb3J3YXJkIHJlZmVyZW5jZSB0byBpdC4gICovCisgICAgICAqc3RyaW5nID0gcDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKKy8qIEFSR1NVU0VEICovCitzdHJ1Y3Qgc3ltYm9sICoKK2RlZmluZV9zeW1ib2wgKHZhbHUsIHN0cmluZywgZGVzYywgdHlwZSwgb2JqZmlsZSkKKyAgICAgQ09SRV9BRERSIHZhbHU7CisgICAgIGNoYXIgKnN0cmluZzsKKyAgICAgaW50IGRlc2M7CisgICAgIGludCB0eXBlOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bWJvbCAqc3ltOworICBjaGFyICpwID0gKGNoYXIgKikgc3RyY2hyIChzdHJpbmcsICc6Jyk7CisgIGludCBkZWZ0eXBlOworICBpbnQgc3lub255bSA9IDA7CisgIHJlZ2lzdGVyIGludCBpOworCisgIC8qIFdlIHdvdWxkIGxpa2UgdG8gZWxpbWluYXRlIG5hbWVsZXNzIHN5bWJvbHMsIGJ1dCBrZWVwIHRoZWlyIHR5cGVzLgorICAgICBFLmcuIHN0YWIgZW50cnkgIjp0MTA9KjIiIHNob3VsZCBwcm9kdWNlIGEgdHlwZSAxMCwgd2hpY2ggaXMgYSBwb2ludGVyCisgICAgIHRvIHR5cGUgMiwgYnV0LCBzaG91bGQgbm90IGNyZWF0ZSBhIHN5bWJvbCB0byBhZGRyZXNzIHRoYXQgdHlwZS4gU2luY2UKKyAgICAgdGhlIHN5bWJvbCB3aWxsIGJlIG5hbWVsZXNzLCB0aGVyZSBpcyBubyB3YXkgYW55IHVzZXIgY2FuIHJlZmVyIHRvIGl0LiAqLworCisgIGludCBuYW1lbGVzczsKKworICAvKiBJZ25vcmUgc3ltcyB3aXRoIGVtcHR5IG5hbWVzLiAgKi8KKyAgaWYgKHN0cmluZ1swXSA9PSAwKQorICAgIHJldHVybiAwOworCisgIC8qIElnbm9yZSBvbGQtc3R5bGUgc3ltYm9scyBmcm9tIGNjIC1nbyAgKi8KKyAgaWYgKHAgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICB3aGlsZSAocFsxXSA9PSAnOicpCisgICAgeworICAgICAgIHAgKz0gMjsKKyAgICAgICBwID0gc3RyY2hyIChwLCAnOicpOworICAgIH0KKworICAvKiBJZiBhIG5hbWVsZXNzIHN0YWIgZW50cnksIGFsbCB3ZSBuZWVkIGlzIHRoZSB0eXBlLCBub3QgdGhlIHN5bWJvbC4KKyAgICAgZS5nLiAiOnQxMD0qMiIgb3IgYSBuYW1lbGVzcyBlbnVtIGxpa2UgIiA6VDE2PWVyZWQ6MCxncmVlbjoxLGJsdWU6Miw7IiAqLworICBuYW1lbGVzcyA9IChwID09IHN0cmluZyB8fCAoKHN0cmluZ1swXSA9PSAnICcpICYmIChzdHJpbmdbMV0gPT0gJzonKSkpOworCisgIGN1cnJlbnRfc3ltYm9sID0gc3ltID0gKHN0cnVjdCBzeW1ib2wgKikgCisgICAgb2JzdGFja19hbGxvYyAoJm9iamZpbGUgLT4gc3ltYm9sX29ic3RhY2ssIHNpemVvZiAoc3RydWN0IHN5bWJvbCkpOworICBtZW1zZXQgKHN5bSwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisKKyAgc3dpdGNoICh0eXBlICYgTl9UWVBFKQorICAgIHsKKyAgICBjYXNlIE5fVEVYVDoKKyAgICAgIFNZTUJPTF9TRUNUSU9OKHN5bSkgPSBTRUNUX09GRl9URVhUOworICAgICAgYnJlYWs7CisgICAgY2FzZSBOX0RBVEE6CisgICAgICBTWU1CT0xfU0VDVElPTihzeW0pID0gU0VDVF9PRkZfREFUQTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTl9CU1M6CisgICAgICBTWU1CT0xfU0VDVElPTihzeW0pID0gU0VDVF9PRkZfQlNTOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChwcm9jZXNzaW5nX2djY19jb21waWxhdGlvbikKKyAgICB7CisgICAgICAvKiBHQ0MgMi54IHB1dHMgdGhlIGxpbmUgbnVtYmVyIGluIGRlc2MuICBTdW5PUyBhcHBhcmVudGx5IHB1dHMgaW4gdGhlCisJIG51bWJlciBvZiBieXRlcyBvY2N1cGllZCBieSBhIHR5cGUgb3Igb2JqZWN0LCB3aGljaCB3ZSBpZ25vcmUuICAqLworICAgICAgU1lNQk9MX0xJTkUoc3ltKSA9IGRlc2M7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgU1lNQk9MX0xJTkUoc3ltKSA9IDA7CQkJLyogdW5rbm93biAqLworICAgIH0KKworICBpZiAoaXNfY3BsdXNfbWFya2VyIChzdHJpbmdbMF0pKQorICAgIHsKKyAgICAgIC8qIFNwZWNpYWwgR05VIEMrKyBuYW1lcy4gICovCisgICAgICBzd2l0Y2ggKHN0cmluZ1sxXSkKKwl7CisJICBjYXNlICd0JzoKKwkgICAgU1lNQk9MX05BTUUgKHN5bSkgPSBvYnNhdmVzdHJpbmcgKCJ0aGlzIiwgc3RybGVuICgidGhpcyIpLAorCQkJCQkgICAgICAmb2JqZmlsZSAtPiBzeW1ib2xfb2JzdGFjayk7CisJICAgIGJyZWFrOworCisJICBjYXNlICd2JzogLyogJHZ0YmxfcHRyX3R5cGUgKi8KKwkgICAgLyogV2FzOiBTWU1CT0xfTkFNRSAoc3ltKSA9ICJ2cHRyIjsgKi8KKwkgICAgZ290byBub3JtYWw7CisKKwkgIGNhc2UgJ2UnOgorCSAgICBTWU1CT0xfTkFNRSAoc3ltKSA9IG9ic2F2ZXN0cmluZyAoImVoX3Rocm93Iiwgc3RybGVuICgiZWhfdGhyb3ciKSwKKwkJCQkJICAgICAgJm9iamZpbGUgLT4gc3ltYm9sX29ic3RhY2spOworCSAgICBicmVhazsKKworCSAgY2FzZSAnXyc6CisJICAgIC8qIFRoaXMgd2FzIGFuIGFub255bW91cyB0eXBlIHRoYXQgd2FzIG5ldmVyIGZpeGVkIHVwLiAgKi8KKwkgICAgZ290byBub3JtYWw7CisKKyNpZmRlZiBTVEFUSUNfVFJBTlNGT1JNX05BTUUKKwkgIGNhc2UgJ1gnOgorCSAgICAvKiBTdW5QUk8gKDMuMCBhdCBsZWFzdCkgc3RhdGljIHZhcmlhYmxlIGVuY29kaW5nLiAgKi8KKwkgICAgZ290byBub3JtYWw7CisjZW5kaWYKKworCSAgZGVmYXVsdDoKKwkgICAgY29tcGxhaW4gKCZ1bnJlY29nbml6ZWRfY3BsdXNfbmFtZV9jb21wbGFpbnQsIHN0cmluZyk7CisJICAgIGdvdG8gbm9ybWFsOwkJLyogRG8gKnNvbWV0aGluZyogd2l0aCBpdCAqLworCX0KKyAgICB9CisgIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnIycpCisgICAgeworICAgICAgLyogU3BlY2lhbCBHTlUgQyBleHRlbnNpb24gZm9yIHJlZmVyZW5jaW5nIHN5bWJvbHMuICAqLworICAgICAgY2hhciAqczsKKyAgICAgIGludCByZWZudW0sIG5sZW47CisKKyAgICAgIC8qIElmIFNUUklORyBkZWZpbmVzIGEgbmV3IHJlZmVyZW5jZSBpZCwgdGhlbiBhZGQgaXQgdG8gdGhlCisJIHJlZmVyZW5jZSBtYXAuICBFbHNlIGl0IG11c3QgYmUgcmVmZXJyaW5nIHRvIGEgcHJldmlvdXNseQorCSBkZWZpbmVkIHN5bWJvbCwgc28gYWRkIGl0IHRvIHRoZSBhbGlhcyBsaXN0IG9mIHRoZSBwcmV2aW91c2x5CisJIGRlZmluZWQgc3ltYm9sLiAgKi8KKyAgICAgIHMgPSBzdHJpbmc7CisgICAgICByZWZudW0gPSBzeW1ib2xfcmVmZXJlbmNlX2RlZmluZWQgKCZzKTsKKyAgICAgIGlmIChyZWZudW0gPj0gMCkKKwkgIHJlZl9hZGQgKHJlZm51bSwgc3ltLCBzdHJpbmcsIFNZTUJPTF9WQUxVRSAoc3ltKSk7CisgICAgICBlbHNlCisJaWYgKCFyZXNvbHZlX3N5bWJvbF9yZWZlcmVuY2UgKG9iamZpbGUsIHN5bSwgc3RyaW5nKSkKKwkgIHJldHVybiBOVUxMOworCisgICAgICAvKiBTLi5QIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuICBXZSBuZWVkIHRvIHN0b3JlCisJIHRoZSBjb3JyZWN0IG5hbWUgaW50byBTWU1CT0xfTkFNRS4gICovCisgICAgICBubGVuID0gcCAtIHM7CisgICAgICBpZiAocmVmbnVtID49IDApCisJeworCSAgaWYgKG5sZW4gPiAwKQorCSAgICB7CisJICAgICAgU1lNQk9MX05BTUUgKHN5bSkgPSAoY2hhciAqKQorCQlvYnN0YWNrX2FsbG9jICgmb2JqZmlsZSAtPiBzeW1ib2xfb2JzdGFjaywgbmxlbik7CisJICAgICAgc3RybmNweSAoU1lNQk9MX05BTUUgKHN5bSksIHMsIG5sZW4pOworCSAgICAgIFNZTUJPTF9OQU1FIChzeW0pW25sZW5dID0gJ1wwJzsKKwkgICAgICBTWU1CT0xfSU5JVF9ERU1BTkdMRURfTkFNRSAoc3ltLCAmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2spOworCSAgICB9CisJICBlbHNlCisJICAgIC8qIEZJWE1FISBXYW50IFNZTUJPTF9OQU1FIChzeW0pID0gMDsKKwkgICAgICAgR2V0IGVycm9yIGlmIGxlYXZlIG5hbWUgMC4gIFNvIGdpdmUgaXQgc29tZXRoaW5nLiAqLworCSAgICB7CisJICAgICAgbmxlbiA9IHAgLSBzdHJpbmc7CisJICAgICAgU1lNQk9MX05BTUUgKHN5bSkJPSAoY2hhciAqKQorCQlvYnN0YWNrX2FsbG9jICgmb2JqZmlsZSAtPiBzeW1ib2xfb2JzdGFjaywgbmxlbik7CisJICAgICAgc3RybmNweSAoU1lNQk9MX05BTUUgKHN5bSksIHN0cmluZywgbmxlbik7CisJICAgICAgU1lNQk9MX05BTUUgKHN5bSlbbmxlbl0gPSAnXDAnOworCSAgICAgIFNZTUJPTF9JTklUX0RFTUFOR0xFRF9OQU1FIChzeW0sICZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjayk7CisJICAgIH0KKwl9CisgICAgICAvKiBBZHZhbmNlIFNUUklORyBiZXlvbmQgdGhlIHJlZmVyZW5jZSBpZC4gICovCisgICAgICBzdHJpbmcgPSBzOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICBub3JtYWw6CisgICAgICBTWU1CT0xfTEFOR1VBR0UgKHN5bSkgPSBjdXJyZW50X3N1YmZpbGUgLT4gbGFuZ3VhZ2U7CisgICAgICBTWU1CT0xfTkFNRSAoc3ltKQk9IChjaGFyICopCisJb2JzdGFja19hbGxvYyAoJm9iamZpbGUgLT4gc3ltYm9sX29ic3RhY2ssICgocCAtIHN0cmluZykgKyAxKSk7CisgICAgICAvKiBPcGVuLWNvZGVkIG1lbWNweS0tc2F2ZXMgZnVuY3Rpb24gY2FsbCB0aW1lLiAgKi8KKyAgICAgIC8qIEZJWE1FOiAgRG9lcyBpdCByZWFsbHk/ICBUcnkgcmVwbGFjaW5nIHdpdGggc2ltcGxlIHN0cmNweSBhbmQKKwkgdHJ5IGl0IG9uIGFuIGV4ZWN1dGFibGUgd2l0aCBhIGxhcmdlIHN5bWJvbCB0YWJsZS4gKi8KKyAgICAgIC8qIEZJWE1FOiBjb25zaWRlcmluZyB0aGF0IGdjYyBjYW4gb3BlbiBjb2RlIG1lbWNweSBhbnl3YXksIEkKKwkgZG91YnQgaXQuICB4b3hvcmljaC4gKi8KKyAgICAgIHsKKwlyZWdpc3RlciBjaGFyICpwMSA9IHN0cmluZzsKKwlyZWdpc3RlciBjaGFyICpwMiA9IFNZTUJPTF9OQU1FIChzeW0pOworCXdoaWxlIChwMSAhPSBwKQorCSAgeworCSAgICAqcDIrKyA9ICpwMSsrOworCSAgfQorCSpwMisrID0gJ1wwJzsKKyAgICAgIH0KKworICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZnJvbSBhIEMrKyBjb21waWxhdGlvbiwgdGhlbiBhdHRlbXB0IHRvIGNhY2hlIHRoZQorCSBkZW1hbmdsZWQgZm9ybSBmb3IgZnV0dXJlIHJlZmVyZW5jZS4gIFRoaXMgaXMgYSB0eXBpY2FsIHRpbWUgdmVyc3VzCisJIHNwYWNlIHRyYWRlb2ZmLCB0aGF0IHdhcyBkZWNpZGVkIGluIGZhdm9yIG9mIHRpbWUgYmVjYXVzZSBpdCBzcGVkIHVwCisJIEMrKyBzeW1ib2wgbG9va3VwcyBieSBhIGZhY3RvciBvZiBhYm91dCAyMC4gKi8KKworICAgICAgU1lNQk9MX0lOSVRfREVNQU5HTEVEX05BTUUgKHN5bSwgJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrKTsKKyAgICB9CisgIHArKzsKKworICAvKiBEZXRlcm1pbmUgdGhlIHR5cGUgb2YgbmFtZSBiZWluZyBkZWZpbmVkLiAgKi8KKyNpZiAwCisgIC8qIEdldHRpbmcgR0RCIHRvIGNvcnJlY3RseSBza2lwIHRoZSBzeW1ib2wgb24gYW4gdW5kZWZpbmVkIHN5bWJvbAorICAgICBkZXNjcmlwdG9yIGFuZCBub3QgZXZlciBkdW1wIGNvcmUgaXMgYSB2ZXJ5IGRvZGd5IHByb3Bvc2l0aW9uIGlmCisgICAgIHdlIGRvIHRoaW5ncyB0aGlzIHdheS4gIEkgc2F5IHRoZSBhY29ybiBSSVNDIG1hY2hpbmUgY2FuIGp1c3QKKyAgICAgZml4IHRoZWlyIGNvbXBpbGVyLiAgKi8KKyAgLyogVGhlIEFjb3JuIFJJU0MgbWFjaGluZSdzIGNvbXBpbGVyIGNhbiBwdXQgb3V0IGxvY2FscyB0aGF0IGRvbid0CisgICAgIHN0YXJ0IHdpdGggIjIzND0iIG9yICIoMyw0KT0iLCBzbyBhc3N1bWUgYW55dGhpbmcgb3RoZXIgdGhhbiB0aGUKKyAgICAgZGVmdHlwZXMgd2Uga25vdyBob3cgdG8gaGFuZGxlIGlzIGEgbG9jYWwuICAqLworICBpZiAoIXN0cmNociAoImNmRkdwUHJTdFR2VlhDUiIsICpwKSkKKyNlbHNlCisgIGlmIChpc2RpZ2l0ICgqcCkgfHwgKnAgPT0gJygnIHx8ICpwID09ICctJykKKyNlbmRpZgorICAgIGRlZnR5cGUgPSAnbCc7CisgIGVsc2UKKyAgICBkZWZ0eXBlID0gKnArKzsKKworICBzd2l0Y2ggKGRlZnR5cGUpCisgICAgeworICAgIGNhc2UgJ2MnOgorICAgICAgLyogYyBpcyBhIHNwZWNpYWwgY2FzZSwgbm90IGZvbGxvd2VkIGJ5IGEgdHlwZS1udW1iZXIuCisJIFNZTUJPTDpjPWlWQUxVRSBmb3IgYW4gaW50ZWdlciBjb25zdGFudCBzeW1ib2wuCisJIFNZTUJPTDpjPXJWQUxVRSBmb3IgYSBmbG9hdGluZyBjb25zdGFudCBzeW1ib2wuCisJIFNZTUJPTDpjPWVUWVBFLElOVFZBTFVFIGZvciBhbiBlbnVtIGNvbnN0YW50IHN5bWJvbC4KKwkgZS5nLiAiYjpjPWU2LDAiIGZvciAiY29uc3QgYiA9IGJsb2IxIgorCSAod2hlcmUgdHlwZSA2IGlzIGRlZmluZWQgYnkgImJsb2JzOnQ2PWVibG9iMTowLGJsb2IyOjEsOyIpLiAgKi8KKyAgICAgIGlmICgqcCAhPSAnPScpCisJeworCSAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0NPTlNUOworCSAgU1lNQk9MX1RZUEUgKHN5bSkgPSBlcnJvcl90eXBlICgmcCwgb2JqZmlsZSk7CisJICBTWU1CT0xfTkFNRVNQQUNFIChzeW0pID0gVkFSX05BTUVTUEFDRTsKKwkgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZmlsZV9zeW1ib2xzKTsKKwkgIHJldHVybiBzeW07CisJfQorICAgICAgKytwOworICAgICAgc3dpdGNoICgqcCsrKQorCXsKKwljYXNlICdyJzoKKwkgIHsKKwkgICAgZG91YmxlIGQgPSBhdG9mIChwKTsKKwkgICAgY2hhciAqZGJsX3ZhbHU7CisKKwkgICAgLyogRklYTUUtaWYtcGlja3ktYWJvdXQtZmxvYXRpbmctYWNjdXJhY3k6IFNob3VsZCBiZSB1c2luZworCSAgICAgICB0YXJnZXQgYXJpdGhtZXRpYyB0byBnZXQgdGhlIHZhbHVlLiAgcmVhbC5jIGluIEdDQworCSAgICAgICBwcm9iYWJseSBoYXMgdGhlIG5lY2Vzc2FyeSBjb2RlLiAgKi8KKworCSAgICAvKiBGSVhNRTogbG9va3VwX2Z1bmRhbWVudGFsX3R5cGUgaXMgYSBoYWNrLiAgV2Ugc2hvdWxkIGJlCisJICAgICAgIGNyZWF0aW5nIGEgdHlwZSBlc3BlY2lhbGx5IGZvciB0aGUgdHlwZSBvZiBmbG9hdCBjb25zdGFudHMuCisJICAgICAgIFByb2JsZW0gaXMsIHdoYXQgdHlwZSBzaG91bGQgaXQgYmU/CisKKwkgICAgICAgQWxzbywgd2hhdCBzaG91bGQgdGhlIG5hbWUgb2YgdGhpcyB0eXBlIGJlPyAgU2hvdWxkIHdlCisJICAgICAgIGJlIHVzaW5nICdTJyBjb25zdGFudHMgKHNlZSBzdGFicy50ZXhpbmZvKSBpbnN0ZWFkPyAgKi8KKworCSAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IGxvb2t1cF9mdW5kYW1lbnRhbF90eXBlIChvYmpmaWxlLAorCQkJCQkJCSBGVF9EQkxfUFJFQ19GTE9BVCk7CisJICAgIGRibF92YWx1ID0gKGNoYXIgKikKKwkgICAgICBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZSAtPiBzeW1ib2xfb2JzdGFjaywKKwkJCSAgICAgVFlQRV9MRU5HVEggKFNZTUJPTF9UWVBFIChzeW0pKSk7CisJICAgIHN0b3JlX2Zsb2F0aW5nIChkYmxfdmFsdSwgVFlQRV9MRU5HVEggKFNZTUJPTF9UWVBFIChzeW0pKSwgZCk7CisJICAgIFNZTUJPTF9WQUxVRV9CWVRFUyAoc3ltKSA9IGRibF92YWx1OworCSAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfQ09OU1RfQllURVM7CisJICB9CisJICBicmVhazsKKwljYXNlICdpJzoKKwkgIHsKKwkgICAgLyogRGVmaW5pbmcgaW50ZWdlciBjb25zdGFudHMgdGhpcyB3YXkgaXMga2luZCBvZiBzaWxseSwKKwkgICAgICAgc2luY2UgJ2UnIGNvbnN0YW50cyBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIGdpdmUgbm90CisJICAgICAgIG9ubHkgdGhlIHZhbHVlLCBidXQgdGhlIHR5cGUgYXMgd2VsbC4gIEMgaGFzIGF0IGxlYXN0CisJICAgICAgIGludCwgbG9uZywgdW5zaWduZWQgaW50LCBhbmQgbG9uZyBsb25nIGFzIGNvbnN0YW50CisJICAgICAgIHR5cGVzOyBvdGhlciBsYW5ndWFnZXMgcHJvYmFibHkgc2hvdWxkIGhhdmUgYXQgbGVhc3QKKwkgICAgICAgdW5zaWduZWQgYXMgd2VsbCBhcyBzaWduZWQgY29uc3RhbnRzLiAgKi8KKworCSAgICAvKiBXZSBqdXN0IG5lZWQgb25lIGludCBjb25zdGFudCB0eXBlIGZvciBhbGwgb2JqZmlsZXMuCisJICAgICAgIEl0IGRvZXNuJ3QgZGVwZW5kIG9uIGxhbmd1YWdlcyBvciBhbnl0aGluZyAoYXJndWFibHkgaXRzCisJICAgICAgIG5hbWUgc2hvdWxkIGJlIGEgbGFuZ3VhZ2Utc3BlY2lmaWMgbmFtZSBmb3IgYSB0eXBlIG9mCisJICAgICAgIHRoYXQgc2l6ZSwgYnV0IEknbSBpbmNsaW5lZCB0byBzYXkgdGhhdCBpZiB0aGUgY29tcGlsZXIKKwkgICAgICAgd2FudHMgYSBuaWNlIG5hbWUgZm9yIHRoZSB0eXBlLCBpdCBjYW4gdXNlICdlJykuICAqLworCSAgICBzdGF0aWMgc3RydWN0IHR5cGUgKmludF9jb25zdF90eXBlOworCisJICAgIC8qIFllcywgdGhpcyBpcyBhcyBsb25nIGFzIGEgKmhvc3QqIGludC4gIFRoYXQgaXMgYmVjYXVzZSB3ZQorCSAgICAgICB1c2UgYXRvaS4gICovCisJICAgIGlmIChpbnRfY29uc3RfdHlwZSA9PSBOVUxMKQorCSAgICAgIGludF9jb25zdF90eXBlID0KKwkJaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULAorCQkJICAgc2l6ZW9mIChpbnQpICogSE9TVF9DSEFSX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwgMCwKKwkJCSAgICJpbnRlZ2VyIGNvbnN0YW50IiwKKwkJCSAgIChzdHJ1Y3Qgb2JqZmlsZSAqKU5VTEwpOworCSAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IGludF9jb25zdF90eXBlOworCSAgICBTWU1CT0xfVkFMVUUgKHN5bSkgPSBhdG9pIChwKTsKKwkgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0NPTlNUOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSAnZSc6CisJICAvKiBTWU1CT0w6Yz1lVFlQRSxJTlRWQUxVRSBmb3IgYSBjb25zdGFudCBzeW1ib2wgd2hvc2UgdmFsdWUKKwkgICAgIGNhbiBiZSByZXByZXNlbnRlZCBhcyBpbnRlZ3JhbC4KKwkgICAgIGUuZy4gImI6Yz1lNiwwIiBmb3IgImNvbnN0IGIgPSBibG9iMSIKKwkgICAgICh3aGVyZSB0eXBlIDYgaXMgZGVmaW5lZCBieSAiYmxvYnM6dDY9ZWJsb2IxOjAsYmxvYjI6MSw7IikuICAqLworCSAgeworCSAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfQ09OU1Q7CisJICAgIFNZTUJPTF9UWVBFIChzeW0pID0gcmVhZF90eXBlICgmcCwgb2JqZmlsZSk7CisKKwkgICAgaWYgKCpwICE9ICcsJykKKwkgICAgICB7CisJCVNZTUJPTF9UWVBFIChzeW0pID0gZXJyb3JfdHlwZSAoJnAsIG9iamZpbGUpOworCQlicmVhazsKKwkgICAgICB9CisJICAgICsrcDsKKworCSAgICAvKiBJZiB0aGUgdmFsdWUgaXMgdG9vIGJpZyB0byBmaXQgaW4gYW4gaW50IChwZXJoYXBzIGJlY2F1c2UKKwkgICAgICAgaXQgaXMgdW5zaWduZWQpLCBvciBzb21ldGhpbmcgbGlrZSB0aGF0LCB3ZSBzaWxlbnRseSBnZXQKKwkgICAgICAgYSBib2d1cyB2YWx1ZS4gIFRoZSB0eXBlIGFuZCBldmVyeXRoaW5nIGVsc2UgYWJvdXQgaXQgaXMKKwkgICAgICAgY29ycmVjdC4gIElkZWFsbHksIHdlIHNob3VsZCBiZSB1c2luZyB3aGF0ZXZlciB3ZSBoYXZlCisJICAgICAgIGF2YWlsYWJsZSBmb3IgcGFyc2luZyB1bnNpZ25lZCBhbmQgbG9uZyBsb25nIHZhbHVlcywKKwkgICAgICAgaG93ZXZlci4gICovCisJICAgIFNZTUJPTF9WQUxVRSAoc3ltKSA9IGF0b2kgKHApOworCSAgfQorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHsKKwkgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0NPTlNUOworCSAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IGVycm9yX3R5cGUgKCZwLCBvYmpmaWxlKTsKKwkgIH0KKwl9CisgICAgICBTWU1CT0xfTkFNRVNQQUNFIChzeW0pID0gVkFSX05BTUVTUEFDRTsKKyAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZmlsZV9zeW1ib2xzKTsKKyAgICAgIHJldHVybiBzeW07CisKKyAgICBjYXNlICdDJzoKKyAgICAgIC8qIFRoZSBuYW1lIG9mIGEgY2F1Z2h0IGV4Y2VwdGlvbi4gICovCisgICAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IHJlYWRfdHlwZSAoJnAsIG9iamZpbGUpOworICAgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0xBQkVMOworICAgICAgU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9IFZBUl9OQU1FU1BBQ0U7CisgICAgICBTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltKSA9IHZhbHU7CisgICAgICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmxvY2FsX3N5bWJvbHMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdmJzoKKyAgICAgIC8qIEEgc3RhdGljIGZ1bmN0aW9uIGRlZmluaXRpb24uICAqLworICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSByZWFkX3R5cGUgKCZwLCBvYmpmaWxlKTsKKyAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19CTE9DSzsKKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworICAgICAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZmaWxlX3N5bWJvbHMpOworICAgICAgLyogZmFsbCBpbnRvIHByb2Nlc3NfZnVuY3Rpb25fdHlwZXMuICAqLworCisgICAgcHJvY2Vzc19mdW5jdGlvbl90eXBlczoKKyAgICAgIC8qIEZ1bmN0aW9uIHJlc3VsdCB0eXBlcyBhcmUgZGVzY3JpYmVkIGFzIHRoZSByZXN1bHQgdHlwZSBpbiBzdGFicy4KKwkgV2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdG8gdGhlIGZ1bmN0aW9uLXJldHVybmluZy10eXBlLVggdHlwZQorCSBpbiBHREIuICBFLmcuICJpbnQiIGlzIGNvbnZlcnRlZCB0byAiZnVuY3Rpb24gcmV0dXJuaW5nIGludCIuICAqLworICAgICAgaWYgKFRZUEVfQ09ERSAoU1lNQk9MX1RZUEUgKHN5bSkpICE9IFRZUEVfQ09ERV9GVU5DKQorCVNZTUJPTF9UWVBFIChzeW0pID0gbG9va3VwX2Z1bmN0aW9uX3R5cGUgKFNZTUJPTF9UWVBFIChzeW0pKTsKKworICAgICAgLyogQWxsIGZ1bmN0aW9ucyBpbiBDKysgaGF2ZSBwcm90b3R5cGVzLiAgKi8KKyAgICAgIGlmIChTWU1CT0xfTEFOR1VBR0UgKHN5bSkgPT0gbGFuZ3VhZ2VfY3BsdXMpCisJVFlQRV9GTEFHUyAoU1lNQk9MX1RZUEUgKHN5bSkpIHw9IFRZUEVfRkxBR19QUk9UT1RZUEVEOworCisgICAgICAvKiBmYWxsIGludG8gcHJvY2Vzc19wcm90b3R5cGVfdHlwZXMgKi8KKworICAgIHByb2Nlc3NfcHJvdG90eXBlX3R5cGVzOgorICAgICAgLyogU3VuIGFjYyBwdXRzIGRlY2xhcmVkIHR5cGVzIG9mIGFyZ3VtZW50cyBoZXJlLiAgKi8KKyAgICAgIGlmICgqcCA9PSAnOycpCisJeworCSAgc3RydWN0IHR5cGUgKmZ0eXBlID0gU1lNQk9MX1RZUEUgKHN5bSk7CisJICBpbnQgbnNlbWkgPSAwOworCSAgaW50IG5wYXJhbXMgPSAwOworCSAgY2hhciAqcDEgPSBwOworCisJICAvKiBPYnRhaW4gYSB3b3JzdCBjYXNlIGd1ZXNzIGZvciB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cworCSAgICAgYnkgY291bnRpbmcgdGhlIHNlbWljb2xvbnMuICAqLworCSAgd2hpbGUgKCpwMSkKKwkgICAgeworCSAgICAgIGlmICgqcDErKyA9PSAnOycpCisJCW5zZW1pKys7CisJICAgIH0KKworCSAgLyogQWxsb2NhdGUgcGFyYW1ldGVyIGluZm9ybWF0aW9uIGZpZWxkcyBhbmQgZmlsbCB0aGVtIGluLiAqLworCSAgVFlQRV9GSUVMRFMgKGZ0eXBlKSA9IChzdHJ1Y3QgZmllbGQgKikKKwkgICAgVFlQRV9BTExPQyAoZnR5cGUsIG5zZW1pICogc2l6ZW9mIChzdHJ1Y3QgZmllbGQpKTsKKwkgIHdoaWxlICgqcCsrID09ICc7JykKKwkgICAgeworCSAgICAgIHN0cnVjdCB0eXBlICpwdHlwZTsKKworCSAgICAgIC8qIEEgdHlwZSBudW1iZXIgb2YgemVybyBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIHZhcmFyZ3MuCisgICAgICAgICAJIEZJWE1FOiBHREIgY3VycmVudGx5IGlnbm9yZXMgdmFyYXJnIGZ1bmN0aW9ucy4gICovCisJICAgICAgaWYgKHBbMF0gPT0gJzAnICYmIHBbMV0gPT0gJ1wwJykKKwkJYnJlYWs7CisJICAgICAgcHR5cGUgPSByZWFkX3R5cGUgKCZwLCBvYmpmaWxlKTsKKworCSAgICAgIC8qIFRoZSBTdW4gY29tcGlsZXJzIG1hcmsgaW50ZWdlciBhcmd1bWVudHMsIHdoaWNoIHNob3VsZAorCQkgYmUgcHJvbW90ZWQgdG8gdGhlIHdpZHRoIG9mIHRoZSBjYWxsaW5nIGNvbnZlbnRpb25zLCB3aXRoCisJCSBhIHR5cGUgd2hpY2ggcmVmZXJlbmNlcyBpdHNlbGYuIFRoaXMgdHlwZSBpcyB0dXJuZWQgaW50bworCQkgYSBUWVBFX0NPREVfVk9JRCB0eXBlIGJ5IHJlYWRfdHlwZSwgYW5kIHdlIGhhdmUgdG8gdHVybgorCQkgaXQgYmFjayBpbnRvIGJ1aWx0aW5fdHlwZV9pbnQgaGVyZS4KKwkJIEZJWE1FOiBEbyB3ZSBuZWVkIGEgbmV3IGJ1aWx0aW5fdHlwZV9wcm9tb3RlZF9pbnRfYXJnID8gICovCisJICAgICAgaWYgKFRZUEVfQ09ERSAocHR5cGUpID09IFRZUEVfQ09ERV9WT0lEKQorCQlwdHlwZSA9IGJ1aWx0aW5fdHlwZV9pbnQ7CisJICAgICAgVFlQRV9GSUVMRF9UWVBFIChmdHlwZSwgbnBhcmFtcysrKSA9IHB0eXBlOworCSAgICB9CisJICBUWVBFX05GSUVMRFMgKGZ0eXBlKSA9IG5wYXJhbXM7CisJICBUWVBFX0ZMQUdTIChmdHlwZSkgfD0gVFlQRV9GTEFHX1BST1RPVFlQRUQ7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdGJzoKKyAgICAgIC8qIEEgZ2xvYmFsIGZ1bmN0aW9uIGRlZmluaXRpb24uICAqLworICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSByZWFkX3R5cGUgKCZwLCBvYmpmaWxlKTsKKyAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19CTE9DSzsKKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworICAgICAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZnbG9iYWxfc3ltYm9scyk7CisgICAgICBnb3RvIHByb2Nlc3NfZnVuY3Rpb25fdHlwZXM7CisKKyAgICBjYXNlICdHJzoKKyAgICAgIC8qIEZvciBhIGNsYXNzIEcgKGdsb2JhbCkgc3ltYm9sLCBpdCBhcHBlYXJzIHRoYXQgdGhlCisJIHZhbHVlIGlzIG5vdCBjb3JyZWN0LiAgSXQgaXMgbmVjZXNzYXJ5IHRvIHNlYXJjaCBmb3IgdGhlCisJIGNvcnJlc3BvbmRpbmcgbGlua2VyIGRlZmluaXRpb24gdG8gZmluZCB0aGUgdmFsdWUuCisJIFRoZXNlIGRlZmluaXRpb25zIGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZSBuYW1lbGlzdC4gICovCisgICAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IHJlYWRfdHlwZSAoJnAsIG9iamZpbGUpOworICAgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX1NUQVRJQzsKKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworICAgICAgLyogRG9uJ3QgYWRkIHN5bWJvbCByZWZlcmVuY2VzIHRvIGdsb2JhbF9zeW1fY2hhaW4uCisJIFN5bWJvbCByZWZlcmVuY2VzIGRvbid0IGhhdmUgdmFsaWQgbmFtZXMgYW5kIHdvbnQndCBtYXRjaCB1cCB3aXRoCisJIG1pbmltYWwgc3ltYm9scyB3aGVuIHRoZSBnbG9iYWxfc3ltX2NoYWluIGlzIHJlbG9jYXRlZC4KKwkgV2UnbGwgZml4dXAgc3ltYm9sIHJlZmVyZW5jZXMgd2hlbiB3ZSBmaXh1cCB0aGUgZGVmaW5pbmcgc3ltYm9sLiAgKi8KKyAgICAgIGlmIChTWU1CT0xfTkFNRSAoc3ltKSAmJiBTWU1CT0xfTkFNRSAoc3ltKVswXSAhPSAnIycpCisJeworICAgICAgICAgIGkgPSBoYXNobmFtZSAoU1lNQk9MX05BTUUgKHN5bSkpOworICAgICAgICAgIFNZTUJPTF9WQUxVRV9DSEFJTiAoc3ltKSA9IGdsb2JhbF9zeW1fY2hhaW5baV07CisgICAgICAgICAgZ2xvYmFsX3N5bV9jaGFpbltpXSA9IHN5bTsKKwl9CisgICAgICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmdsb2JhbF9zeW1ib2xzKTsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBUaGlzIGNhc2UgaXMgZmFrZWQgYnkgYSBjb25kaXRpb25hbCBhYm92ZSwKKwkgd2hlbiB0aGVyZSBpcyBubyBjb2RlIGxldHRlciBpbiB0aGUgZGJ4IGRhdGEuCisJIERieCBkYXRhIG5ldmVyIGFjdHVhbGx5IGNvbnRhaW5zICdsJy4gICovCisgICAgY2FzZSAncyc6CisgICAgY2FzZSAnbCc6CisgICAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IHJlYWRfdHlwZSAoJnAsIG9iamZpbGUpOworICAgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0xPQ0FMOworICAgICAgU1lNQk9MX1ZBTFVFIChzeW0pID0gdmFsdTsKKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworICAgICAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZsb2NhbF9zeW1ib2xzKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAncCc6CisgICAgICBpZiAoKnAgPT0gJ0YnKQorCS8qIHBGIGlzIGEgdHdvLWxldHRlciBjb2RlIHRoYXQgbWVhbnMgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgaW4gRm9ydHJhbi4KKwkgICBUaGUgdHlwZS1udW1iZXIgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4gdmFsdWUuCisJICAgVHJhbnNsYXRlIGl0IGludG8gYSBwb2ludGVyLXRvLWZ1bmN0aW9uIHR5cGUuICAqLworCXsKKwkgIHArKzsKKwkgIFNZTUJPTF9UWVBFIChzeW0pCisJICAgID0gbG9va3VwX3BvaW50ZXJfdHlwZQorCSAgICAgIChsb29rdXBfZnVuY3Rpb25fdHlwZSAocmVhZF90eXBlICgmcCwgb2JqZmlsZSkpKTsKKwl9CisgICAgICBlbHNlCisJU1lNQk9MX1RZUEUgKHN5bSkgPSByZWFkX3R5cGUgKCZwLCBvYmpmaWxlKTsKKworICAgICAgLyogTm9ybWFsbHkgdGhpcyBpcyBhIHBhcmFtZXRlciwgYSBMT0NfQVJHLiAgT24gdGhlIGk5NjAsIGl0CisJIGNhbiBhbHNvIGJlIGEgTE9DX0xPQ0FMX0FSRyBkZXBlbmRpbmcgb24gc3ltYm9sIHR5cGUuICAqLworI2lmbmRlZiBEQlhfUEFSTV9TWU1CT0xfQ0xBU1MKKyNkZWZpbmUJREJYX1BBUk1fU1lNQk9MX0NMQVNTKHR5cGUpCUxPQ19BUkcKKyNlbmRpZgorCisgICAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBEQlhfUEFSTV9TWU1CT0xfQ0xBU1MgKHR5cGUpOworICAgICAgU1lNQk9MX1ZBTFVFIChzeW0pID0gdmFsdTsKKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworICAgICAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZsb2NhbF9zeW1ib2xzKTsKKworICAgICAgaWYgKFRBUkdFVF9CWVRFX09SREVSICE9IEJJR19FTkRJQU4pCisJeworCSAgLyogT24gbGl0dGxlLWVuZGlhbiBtYWNoaW5lcywgdGhpcyBjcnVkIGlzIG5ldmVyIG5lY2Vzc2FyeSwKKwkgICAgIGFuZCwgaWYgdGhlIGV4dHJhIGJ5dGVzIGNvbnRhaW4gZ2FyYmFnZSwgaXMgaGFybWZ1bC4gICovCisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIElmIGl0J3MgZ2NjLWNvbXBpbGVkLCBpZiBpdCBzYXlzIGBzaG9ydCcsIGJlbGlldmUgaXQuICAqLworICAgICAgaWYgKHByb2Nlc3NpbmdfZ2NjX2NvbXBpbGF0aW9uIHx8IEJFTElFVkVfUENDX1BST01PVElPTikKKwlicmVhazsKKworI2lmICFCRUxJRVZFX1BDQ19QUk9NT1RJT04KKyAgICAgIHsKKwkvKiBUaGlzIGlzIHRoZSBzaWduZWQgdHlwZSB3aGljaCBhcmd1bWVudHMgZ2V0IHByb21vdGVkIHRvLiAgKi8KKwlzdGF0aWMgc3RydWN0IHR5cGUgKnBjY19wcm9tb3Rpb25fdHlwZTsKKwkvKiBUaGlzIGlzIHRoZSB1bnNpZ25lZCB0eXBlIHdoaWNoIGFyZ3VtZW50cyBnZXQgcHJvbW90ZWQgdG8uICAqLworCXN0YXRpYyBzdHJ1Y3QgdHlwZSAqcGNjX3Vuc2lnbmVkX3Byb21vdGlvbl90eXBlOworCisJLyogQ2FsbCBpdCAiaW50IiBiZWNhdXNlIHRoaXMgaXMgbWFpbmx5IEMgbG9zc2FnZS4gICovCisJaWYgKHBjY19wcm9tb3Rpb25fdHlwZSA9PSBOVUxMKQorCSAgcGNjX3Byb21vdGlvbl90eXBlID0KKwkgICAgaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCBUQVJHRVRfSU5UX0JJVCAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJICAgICAgIDAsICJpbnQiLCBOVUxMKTsKKworCWlmIChwY2NfdW5zaWduZWRfcHJvbW90aW9uX3R5cGUgPT0gTlVMTCkKKwkgIHBjY191bnNpZ25lZF9wcm9tb3Rpb25fdHlwZSA9CisJICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgVEFSR0VUX0lOVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCSAgICAgICBUWVBFX0ZMQUdfVU5TSUdORUQsICJ1bnNpZ25lZCBpbnQiLCBOVUxMKTsKKworI2lmIGRlZmluZWQoQkVMSUVWRV9QQ0NfUFJPTU9USU9OX1RZUEUpCisJLyogVGhpcyBtYWNybyBpcyBkZWZpbmVkIG9uIG1hY2hpbmVzIChlLmcuIHNwYXJjKSB3aGVyZQorCSAgIHdlIHNob3VsZCBiZWxpZXZlIHRoZSB0eXBlIG9mIGEgUENDICdzaG9ydCcgYXJndW1lbnQsCisJICAgYnV0IHNob3VsZG4ndCBiZWxpZXZlIHRoZSBhZGRyZXNzICh0aGUgYWRkcmVzcyBpcworCSAgIHRoZSBhZGRyZXNzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGludCkuCisJICAgCisJICAgTXkgZ3Vlc3MgaXMgdGhhdCB0aGlzIGNvcnJlY3Rpb24sIGFzIG9wcG9zZWQgdG8gY2hhbmdpbmcKKwkgICB0aGUgcGFyYW1ldGVyIHRvIGFuICdpbnQnIChhcyBkb25lIGJlbG93LCBmb3IgUENDCisJICAgb24gbW9zdCBtYWNoaW5lcyksIGlzIHRoZSByaWdodCB0aGluZyB0byBkbworCSAgIG9uIGFsbCBtYWNoaW5lcywgYnV0IEkgZG9uJ3Qgd2FudCB0byByaXNrIGJyZWFraW5nCisJICAgc29tZXRoaW5nIHRoYXQgYWxyZWFkeSB3b3Jrcy4gIE9uIG1vc3QgUENDIG1hY2hpbmVzLAorCSAgIHRoZSBzcGFyYyBwcm9ibGVtIGRvZXNuJ3QgY29tZSB1cCBiZWNhdXNlIHRoZSBjYWxsaW5nCisJICAgZnVuY3Rpb24gaGFzIHRvIHplcm8gdGhlIHRvcCBieXRlcyAobm90IGtub3dpbmcgd2hldGhlcgorCSAgIHRoZSBjYWxsZWQgZnVuY3Rpb24gd2FudHMgYW4gaW50IG9yIGEgc2hvcnQpLCBzbyB0aGVyZQorCSAgIGlzIGxpdHRsZSBwcmFjdGljYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIGFuIGludCBhbmQgYSBzaG9ydAorCSAgIChleGNlcHQgcGVyaGFwcyB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgR0RCIHVzZXIgdHlwZXMKKwkgICAicHJpbnQgc2hvcnRfYXJnID0gMHgxMDAwMDsiKS4gCisJICAgCisJICAgSGFja2VkIGZvciBTdW5PUyA0LjEgYnkgZ251QGN5Z251cy5jb20uICBJbiA0LjEsIHRoZSBjb21waWxlcgorCSAgIGFjdHVhbGx5IHByb2R1Y2VzIHRoZSBjb3JyZWN0IGFkZHJlc3MgKHdlIGRvbid0IG5lZWQgdG8gZml4IGl0CisJICAgdXApLiAgSSBtYWRlIHRoaXMgY29kZSBhZGFwdCBzbyB0aGF0IGl0IHdpbGwgb2Zmc2V0IHRoZSBzeW1ib2wKKwkgICBpZiBpdCB3YXMgcG9pbnRpbmcgYXQgYW4gaW50LWFsaWduZWQgbG9jYXRpb24gYW5kIG5vdAorCSAgIG90aGVyd2lzZS4gIFRoaXMgd2F5IHlvdSBjYW4gdXNlIHRoZSBzYW1lIGdkYiBmb3IgNC4wLnggYW5kCisJICAgNC4xIHN5c3RlbXMuCisJICAgCisJICAgSWYgdGhlIHBhcmFtZXRlciBpcyBzaG9ydGVyIHRoYW4gYW4gaW50LCBhbmQgaXMgaW50ZWdyYWwKKwkgICAoZS5nLiBjaGFyLCBzaG9ydCwgb3IgdW5zaWduZWQgZXF1aXZhbGVudCksIGFuZCBpcyBjbGFpbWVkIHRvCisJICAgYmUgcGFzc2VkIG9uIGFuIGludGVnZXIgYm91bmRhcnksIGRvbid0IGJlbGlldmUgaXQhICBPZmZzZXQgdGhlCisJICAgcGFyYW1ldGVyJ3MgYWRkcmVzcyB0byB0aGUgdGFpbC1lbmQgb2YgdGhhdCBpbnRlZ2VyLiAgKi8KKwkKKwlpZiAoVFlQRV9MRU5HVEggKFNZTUJPTF9UWVBFIChzeW0pKSA8IFRZUEVfTEVOR1RIIChwY2NfcHJvbW90aW9uX3R5cGUpCisJICAgICYmIFRZUEVfQ09ERSAoU1lNQk9MX1RZUEUgKHN5bSkpID09IFRZUEVfQ09ERV9JTlQKKwkgICAgJiYgMCA9PSBTWU1CT0xfVkFMVUUgKHN5bSkgJSBUWVBFX0xFTkdUSCAocGNjX3Byb21vdGlvbl90eXBlKSkKKwkgIHsKKwkgICAgU1lNQk9MX1ZBTFVFIChzeW0pICs9IFRZUEVfTEVOR1RIIChwY2NfcHJvbW90aW9uX3R5cGUpCisJICAgICAgLSBUWVBFX0xFTkdUSCAoU1lNQk9MX1RZUEUgKHN5bSkpOworCSAgfQorCWJyZWFrOworCQorI2Vsc2UgLyogbm8gQkVMSUVWRV9QQ0NfUFJPTU9USU9OX1RZUEUuICAqLworCisJLyogSWYgUENDIHNheXMgYSBwYXJhbWV0ZXIgaXMgYSBzaG9ydCBvciBhIGNoYXIsCisJICAgaXQgaXMgcmVhbGx5IGFuIGludC4gICovCisJaWYgKFRZUEVfTEVOR1RIIChTWU1CT0xfVFlQRSAoc3ltKSkgPCBUWVBFX0xFTkdUSCAocGNjX3Byb21vdGlvbl90eXBlKQorCSAgICAmJiBUWVBFX0NPREUgKFNZTUJPTF9UWVBFIChzeW0pKSA9PSBUWVBFX0NPREVfSU5UKQorCSAgeworCSAgICBTWU1CT0xfVFlQRSAoc3ltKSA9CisJICAgICAgVFlQRV9VTlNJR05FRCAoU1lNQk9MX1RZUEUgKHN5bSkpCisJCT8gcGNjX3Vuc2lnbmVkX3Byb21vdGlvbl90eXBlCisJCTogcGNjX3Byb21vdGlvbl90eXBlOworCSAgfQorCWJyZWFrOworCisjZW5kaWYgLyogbm8gQkVMSUVWRV9QQ0NfUFJPTU9USU9OX1RZUEUuICAqLworICAgICAgfQorI2VuZGlmIC8qICFCRUxJRVZFX1BDQ19QUk9NT1RJT04uICAqLworCisgICAgY2FzZSAnUCc6CisgICAgICAvKiBhY2Mgc2VlbXMgdG8gdXNlIFAgdG8gZGVjbGFyZSB0aGUgcHJvdG90eXBlcyBvZiBmdW5jdGlvbnMgdGhhdAorICAgICAgICAgYXJlIHJlZmVyZW5jZWQgYnkgdGhpcyBmaWxlLiAgZ2RiIGlzIG5vdCBwcmVwYXJlZCB0byBkZWFsCisgICAgICAgICB3aXRoIHRoaXMgZXh0cmEgaW5mb3JtYXRpb24uICBGSVhNRSwgaXQgb3VnaHQgdG8uICAqLworICAgICAgaWYgKHR5cGUgPT0gTl9GVU4pCisJeworCSAgU1lNQk9MX1RZUEUgKHN5bSkgPSByZWFkX3R5cGUgKCZwLCBvYmpmaWxlKTsKKwkgIGdvdG8gcHJvY2Vzc19wcm90b3R5cGVfdHlwZXM7CisJfQorICAgICAgLypGQUxMVEhST1VHSCovCisKKyAgICBjYXNlICdSJzoKKyAgICAgIC8qIFBhcmFtZXRlciB3aGljaCBpcyBpbiBhIHJlZ2lzdGVyLiAgKi8KKyAgICAgIFNZTUJPTF9UWVBFIChzeW0pID0gcmVhZF90eXBlICgmcCwgb2JqZmlsZSk7CisgICAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfUkVHUEFSTTsKKyAgICAgIFNZTUJPTF9WQUxVRSAoc3ltKSA9IFNUQUJfUkVHX1RPX1JFR05VTSAodmFsdSk7CisgICAgICBpZiAoU1lNQk9MX1ZBTFVFIChzeW0pID49IE5VTV9SRUdTKQorCXsKKwkgIGNvbXBsYWluICgmcmVnX3ZhbHVlX2NvbXBsYWludCwgU1lNQk9MX1ZBTFVFIChzeW0pLCBOVU1fUkVHUywKKwkJICAgIFNZTUJPTF9TT1VSQ0VfTkFNRSAoc3ltKSk7CisJICBTWU1CT0xfVkFMVUUgKHN5bSkgPSBTUF9SRUdOVU07ICAvKiBLbm93biBzYWZlLCB0aG91Z2ggdXNlbGVzcyAqLworCX0KKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworICAgICAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZsb2NhbF9zeW1ib2xzKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAncic6CisgICAgICAvKiBSZWdpc3RlciB2YXJpYWJsZSAoZWl0aGVyIGdsb2JhbCBvciBsb2NhbCkuICAqLworICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSByZWFkX3R5cGUgKCZwLCBvYmpmaWxlKTsKKyAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19SRUdJU1RFUjsKKyAgICAgIFNZTUJPTF9WQUxVRSAoc3ltKSA9IFNUQUJfUkVHX1RPX1JFR05VTSAodmFsdSk7CisgICAgICBpZiAoU1lNQk9MX1ZBTFVFIChzeW0pID49IE5VTV9SRUdTKQorCXsKKwkgIGNvbXBsYWluICgmcmVnX3ZhbHVlX2NvbXBsYWludCwgU1lNQk9MX1ZBTFVFIChzeW0pLCBOVU1fUkVHUywKKwkJICAgIFNZTUJPTF9TT1VSQ0VfTkFNRSAoc3ltKSk7CisJICBTWU1CT0xfVkFMVUUgKHN5bSkgPSBTUF9SRUdOVU07ICAvKiBLbm93biBzYWZlLCB0aG91Z2ggdXNlbGVzcyAqLworCX0KKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworICAgICAgaWYgKHdpdGhpbl9mdW5jdGlvbikKKwl7CisJICAvKiBTdW4gY2MgdXNlcyBhIHBhaXIgb2Ygc3ltYm9scywgb25lICdwJyBhbmQgb25lICdyJyB3aXRoIHRoZSBzYW1lCisJICAgICBuYW1lIHRvIHJlcHJlc2VudCBhbiBhcmd1bWVudCBwYXNzZWQgaW4gYSByZWdpc3Rlci4KKwkgICAgIEdDQyB1c2VzICdQJyBmb3IgdGhlIHNhbWUgY2FzZS4gIFNvIGlmIHdlIGZpbmQgc3VjaCBhIHN5bWJvbCBwYWlyCisJICAgICB3ZSBjb21iaW5lIGl0IGludG8gb25lICdQJyBzeW1ib2wuICBGb3IgU3VuIGNjIHdlIG5lZWQgdG8gZG8gdGhpcworCSAgICAgcmVnYXJkbGVzcyBvZiBSRUdfU1RSVUNUX0hBU19BRERSLCBiZWNhdXNlIHRoZSBjb21waWxlciBwdXRzIG91dAorCSAgICAgdGhlICdwJyBzeW1ib2wgZXZlbiBpZiBpdCBuZXZlciBzYXZlcyB0aGUgYXJndW1lbnQgb250byB0aGUgc3RhY2suCisKKwkgICAgIE9uIG1vc3QgbWFjaGluZXMsIHdlIHdhbnQgdG8gcHJlc2VydmUgYm90aCBzeW1ib2xzLCBzbyB0aGF0CisJICAgICB3ZSBjYW4gc3RpbGwgZ2V0IGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaXMgZ29pbmcgb24gd2l0aCB0aGUKKwkgICAgIHN0YWNrIChWQVggZm9yIGNvbXB1dGluZyBhcmdzX3ByaW50ZWQsIHVzaW5nIHN0YWNrIHNsb3RzIGluc3RlYWQKKwkgICAgIG9mIHNhdmVkIHJlZ2lzdGVycyBpbiBiYWNrdHJhY2VzLCBldGMuKS4KKworCSAgICAgTm90ZSB0aGF0IHRoaXMgY29kZSBpbGxlZ2FsbHkgY29tYmluZXMKKwkgICAgICAgbWFpbihhcmdjKSBzdHJ1Y3QgZm9vIGFyZ2M7IHsgcmVnaXN0ZXIgc3RydWN0IGZvbyBhcmdjOyB9CisJICAgICBidXQgdGhpcyBjYXNlIGlzIGNvbnNpZGVyZWQgcGF0aG9sb2dpY2FsIGFuZCBjYXVzZXMgYSB3YXJuaW5nCisJICAgICBmcm9tIGEgZGVjZW50IGNvbXBpbGVyLiAgKi8KKworCSAgaWYgKGxvY2FsX3N5bWJvbHMKKwkgICAgICAmJiBsb2NhbF9zeW1ib2xzLT5uc3ltcyA+IDAKKyNpZm5kZWYgVVNFX1JFR0lTVEVSX05PVF9BUkcKKwkgICAgICAmJiBSRUdfU1RSVUNUX0hBU19BRERSIChwcm9jZXNzaW5nX2djY19jb21waWxhdGlvbiwKKwkJCQkgICAgICBTWU1CT0xfVFlQRSAoc3ltKSkKKwkgICAgICAmJiAoVFlQRV9DT0RFIChTWU1CT0xfVFlQRSAoc3ltKSkgPT0gVFlQRV9DT0RFX1NUUlVDVAorCQkgIHx8IFRZUEVfQ09ERSAoU1lNQk9MX1RZUEUgKHN5bSkpID09IFRZUEVfQ09ERV9VTklPTgorCQkgIHx8IFRZUEVfQ09ERSAoU1lNQk9MX1RZUEUgKHN5bSkpID09IFRZUEVfQ09ERV9TRVQKKwkJICB8fCBUWVBFX0NPREUgKFNZTUJPTF9UWVBFIChzeW0pKSA9PSBUWVBFX0NPREVfQklUU1RSSU5HKQorI2VuZGlmCisJICAgICAgKQorCSAgICB7CisJICAgICAgc3RydWN0IHN5bWJvbCAqcHJldl9zeW07CisJICAgICAgcHJldl9zeW0gPSBsb2NhbF9zeW1ib2xzLT5zeW1ib2xbbG9jYWxfc3ltYm9scy0+bnN5bXMgLSAxXTsKKwkgICAgICBpZiAoKFNZTUJPTF9DTEFTUyAocHJldl9zeW0pID09IExPQ19SRUZfQVJHCisJCSAgIHx8IFNZTUJPTF9DTEFTUyAocHJldl9zeW0pID09IExPQ19BUkcpCisJCSAgJiYgU1RSRVEgKFNZTUJPTF9OQU1FIChwcmV2X3N5bSksIFNZTUJPTF9OQU1FKHN5bSkpKQorCQl7CisJCSAgU1lNQk9MX0NMQVNTIChwcmV2X3N5bSkgPSBMT0NfUkVHUEFSTTsKKwkJICAvKiBVc2UgdGhlIHR5cGUgZnJvbSB0aGUgTE9DX1JFR0lTVEVSOyB0aGF0IGlzIHRoZSB0eXBlCisJCSAgICAgdGhhdCBpcyBhY3R1YWxseSBpbiB0aGF0IHJlZ2lzdGVyLiAgKi8KKwkJICBTWU1CT0xfVFlQRSAocHJldl9zeW0pID0gU1lNQk9MX1RZUEUgKHN5bSk7CisJCSAgU1lNQk9MX1ZBTFVFIChwcmV2X3N5bSkgPSBTWU1CT0xfVkFMVUUgKHN5bSk7CisJCSAgc3ltID0gcHJldl9zeW07CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorICAgICAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmbG9jYWxfc3ltYm9scyk7CisJfQorICAgICAgZWxzZQorICAgICAgICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmZpbGVfc3ltYm9scyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1MnOgorICAgICAgLyogU3RhdGljIHN5bWJvbCBhdCB0b3AgbGV2ZWwgb2YgZmlsZSAqLworICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSByZWFkX3R5cGUgKCZwLCBvYmpmaWxlKTsKKyAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19TVEFUSUM7CisgICAgICBTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltKSA9IHZhbHU7CisjaWZkZWYgU1RBVElDX1RSQU5TRk9STV9OQU1FCisgICAgICBpZiAoSVNfU1RBVElDX1RSQU5TRk9STV9OQU1FIChTWU1CT0xfTkFNRSAoc3ltKSkpCisgICAgICB7CisJc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltOworCW1zeW0gPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKFNZTUJPTF9OQU1FIChzeW0pLCBOVUxMLCBvYmpmaWxlKTsKKwlpZiAobXN5bSAhPSBOVUxMKQorCSAgeworCSAgICBTWU1CT0xfTkFNRSAoc3ltKSA9IFNUQVRJQ19UUkFOU0ZPUk1fTkFNRSAoU1lNQk9MX05BTUUgKHN5bSkpOworCSAgICBTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltKSA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltKTsKKwkgIH0KKyAgICAgIH0KKyNlbmRpZgorICAgICAgU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9IFZBUl9OQU1FU1BBQ0U7CisgICAgICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmZpbGVfc3ltYm9scyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3QnOgorICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSByZWFkX3R5cGUgKCZwLCBvYmpmaWxlKTsKKworICAgICAgLyogRm9yIGEgbmFtZWxlc3MgdHlwZSwgd2UgZG9uJ3Qgd2FudCBhIGNyZWF0ZSBhIHN5bWJvbCwgdGh1cyB3ZQorCSBkaWQgbm90IHVzZSBgc3ltJy4gUmV0dXJuIHdpdGhvdXQgZnVydGhlciBwcm9jZXNzaW5nLiAqLworICAgICAgaWYgKG5hbWVsZXNzKSByZXR1cm4gTlVMTDsKKworICAgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX1RZUEVERUY7CisgICAgICBTWU1CT0xfVkFMVUUgKHN5bSkgPSB2YWx1OworICAgICAgU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9IFZBUl9OQU1FU1BBQ0U7CisgICAgICAvKiBDKysgdmFnYXJpZXM6IHdlIG1heSBoYXZlIGEgdHlwZSB3aGljaCBpcyBkZXJpdmVkIGZyb20KKwkgYSBiYXNlIHR5cGUgd2hpY2ggZGlkIG5vdCBoYXZlIGl0cyBuYW1lIGRlZmluZWQgd2hlbiB0aGUKKwkgZGVyaXZlZCBjbGFzcyB3YXMgb3V0cHV0LiAgV2UgZmlsbCBpbiB0aGUgZGVyaXZlZCBjbGFzcydzCisJIGJhc2UgcGFydCBtZW1iZXIncyBuYW1lIGhlcmUgaW4gdGhhdCBjYXNlLiAgKi8KKyAgICAgIGlmIChUWVBFX05BTUUgKFNZTUJPTF9UWVBFIChzeW0pKSAhPSBOVUxMKQorCWlmICgoVFlQRV9DT0RFIChTWU1CT0xfVFlQRSAoc3ltKSkgPT0gVFlQRV9DT0RFX1NUUlVDVAorCSAgICAgfHwgVFlQRV9DT0RFIChTWU1CT0xfVFlQRSAoc3ltKSkgPT0gVFlQRV9DT0RFX1VOSU9OKQorCSAgICAmJiBUWVBFX05fQkFTRUNMQVNTRVMgKFNZTUJPTF9UWVBFIChzeW0pKSkKKwkgIHsKKwkgICAgaW50IGo7CisJICAgIGZvciAoaiA9IFRZUEVfTl9CQVNFQ0xBU1NFUyAoU1lNQk9MX1RZUEUgKHN5bSkpIC0gMTsgaiA+PSAwOyBqLS0pCisJICAgICAgaWYgKFRZUEVfQkFTRUNMQVNTX05BTUUgKFNZTUJPTF9UWVBFIChzeW0pLCBqKSA9PSAwKQorCQlUWVBFX0JBU0VDTEFTU19OQU1FIChTWU1CT0xfVFlQRSAoc3ltKSwgaikgPQorCQkgIHR5cGVfbmFtZV9ub190YWcgKFRZUEVfQkFTRUNMQVNTIChTWU1CT0xfVFlQRSAoc3ltKSwgaikpOworCSAgfQorCisgICAgICBpZiAoVFlQRV9OQU1FIChTWU1CT0xfVFlQRSAoc3ltKSkgPT0gTlVMTCkKKwl7CisJICAvKiBnY2MtMi42IG9yIGxhdGVyICh3aGVuIHVzaW5nIC1mdnRhYmxlLXRodW5rcykKKwkgICAgIGVtaXRzIGEgdW5pcXVlIG5hbWVkIHR5cGUgZm9yIGEgdnRhYmxlIGVudHJ5LgorCSAgICAgU29tZSBnZGIgY29kZSBkZXBlbmRzIG9uIHRoYXQgc3BlY2lmaWMgbmFtZS4gKi8KKwkgIGV4dGVybiBjb25zdCBjaGFyIHZ0YmxfcHRyX25hbWVbXTsKKworCSAgaWYgKChUWVBFX0NPREUgKFNZTUJPTF9UWVBFIChzeW0pKSA9PSBUWVBFX0NPREVfUFRSCisJICAgICAgICYmIHN0cmNtcCAoU1lNQk9MX05BTUUgKHN5bSksIHZ0YmxfcHRyX25hbWUpKQorCSAgICAgIHx8IFRZUEVfQ09ERSAoU1lNQk9MX1RZUEUgKHN5bSkpID09IFRZUEVfQ09ERV9GVU5DKQorCSAgICB7CisJICAgICAgLyogSWYgd2UgYXJlIGdpdmluZyBhIG5hbWUgdG8gYSB0eXBlIHN1Y2ggYXMgInBvaW50ZXIgdG8KKwkJIGZvbyIgb3IgImZ1bmN0aW9uIHJldHVybmluZyBmb28iLCB3ZSBiZXR0ZXIgbm90IHNldAorCQkgdGhlIFRZUEVfTkFNRS4gIElmIHRoZSBwcm9ncmFtIGNvbnRhaW5zICJ0eXBlZGVmIGNoYXIKKwkJICpjYWRkcl90OyIsIHdlIGRvbid0IHdhbnQgYWxsIHZhcmlhYmxlcyBvZiB0eXBlIGNoYXIKKwkJICogdG8gcHJpbnQgYXMgY2FkZHJfdC4gIFRoaXMgaXMgbm90IGp1c3QgYQorCQkgY29uc2VxdWVuY2Ugb2YgR0RCJ3MgdHlwZSBtYW5hZ2VtZW50OyBQQ0MgYW5kIEdDQyAoYXQKKwkJIGxlYXN0IHRocm91Z2ggdmVyc2lvbiAyLjQpIGJvdGggb3V0cHV0IHZhcmlhYmxlcyBvZgorCQkgZWl0aGVyIHR5cGUgY2hhciAqIG9yIGNhZGRyX3Qgd2l0aCB0aGUgdHlwZSBudW1iZXIKKwkJIGRlZmluZWQgaW4gdGhlICd0JyBzeW1ib2wgZm9yIGNhZGRyX3QuICBJZiBhIGZ1dHVyZQorCQkgY29tcGlsZXIgY2xlYW5zIHRoaXMgdXAgaXQgR0RCIGlzIG5vdCByZWFkeSBmb3IgaXQKKwkJIHlldCwgYnV0IGlmIGl0IGJlY29tZXMgcmVhZHkgd2Ugc29tZWhvdyBuZWVkIHRvCisJCSBkaXNhYmxlIHRoaXMgY2hlY2sgKHdpdGhvdXQgYnJlYWtpbmcgdGhlIFBDQy9HQ0MyLjQKKwkJIGNhc2UpLgorCisJCSBTaWdoLgorCisJCSBGb3J0dW5hdGVseSwgdGhpcyBjaGVjayBzZWVtcyBub3QgdG8gYmUgbmVjZXNzYXJ5CisJCSBmb3IgYW55dGhpbmcgZXhjZXB0IHBvaW50ZXJzIG9yIGZ1bmN0aW9ucy4gICovCisJICAgIH0KKwkgIGVsc2UKKwkgICAgVFlQRV9OQU1FIChTWU1CT0xfVFlQRSAoc3ltKSkgPSBTWU1CT0xfTkFNRSAoc3ltKTsKKwl9CisKKyAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZmlsZV9zeW1ib2xzKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnVCc6CisgICAgICAvKiBTdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHRhZy4gIEZvciBHTlUgQysrLCB0aGlzIGNhbiBiZSBiZSBmb2xsb3dlZAorCSBieSAndCcgd2hpY2ggbWVhbnMgd2UgYXJlIHR5cGVkZWYnaW5nIGl0IGFzIHdlbGwuICAqLworICAgICAgc3lub255bSA9ICpwID09ICd0JzsKKworICAgICAgaWYgKHN5bm9ueW0pCisJcCsrOworICAgICAgLyogVGhlIHNlbWFudGljcyBvZiBDKysgc3RhdGUgdGhhdCAic3RydWN0IGZvbyB7IC4uLiB9IiBhbHNvIGRlZmluZXMgCisJIGEgdHlwZWRlZiBmb3IgImZvbyIuICBVbmZvcnR1bmF0ZWx5LCBjZnJvbnQgbmV2ZXIgbWFrZXMgdGhlIHR5cGVkZWYKKwkgd2hlbiB0cmFuc2xhdGluZyBDKysgaW50byBDLiAgV2UgbWFrZSB0aGUgdHlwZWRlZiBoZXJlIHNvIHRoYXQKKwkgInB0eXBlIGZvbyIgd29ya3MgYXMgZXhwZWN0ZWQgZm9yIGNmcm9udCB0cmFuc2xhdGVkIGNvZGUuICAqLworICAgICAgZWxzZSBpZiAoY3VycmVudF9zdWJmaWxlLT5sYW5ndWFnZSA9PSBsYW5ndWFnZV9jcGx1cykKKwlzeW5vbnltID0gMTsKKworICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSByZWFkX3R5cGUgKCZwLCBvYmpmaWxlKTsKKworICAgICAgLyogRm9yIGEgbmFtZWxlc3MgdHlwZSwgd2UgZG9uJ3Qgd2FudCBhIGNyZWF0ZSBhIHN5bWJvbCwgdGh1cyB3ZQorCSBkaWQgbm90IHVzZSBgc3ltJy4gUmV0dXJuIHdpdGhvdXQgZnVydGhlciBwcm9jZXNzaW5nLiAqLworICAgICAgaWYgKG5hbWVsZXNzKSByZXR1cm4gTlVMTDsKKworICAgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX1RZUEVERUY7CisgICAgICBTWU1CT0xfVkFMVUUgKHN5bSkgPSB2YWx1OworICAgICAgU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9IFNUUlVDVF9OQU1FU1BBQ0U7CisgICAgICBpZiAoVFlQRV9UQUdfTkFNRSAoU1lNQk9MX1RZUEUgKHN5bSkpID09IDApCisJVFlQRV9UQUdfTkFNRSAoU1lNQk9MX1RZUEUgKHN5bSkpCisJICA9IG9iY29uY2F0ICgmb2JqZmlsZSAtPiB0eXBlX29ic3RhY2ssICIiLCAiIiwgU1lNQk9MX05BTUUgKHN5bSkpOworICAgICAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZmaWxlX3N5bWJvbHMpOworCisgICAgICBpZiAoc3lub255bSkKKwl7CisJICAvKiBDbG9uZSB0aGUgc3ltIGFuZCB0aGVuIG1vZGlmeSBpdC4gKi8KKwkgIHJlZ2lzdGVyIHN0cnVjdCBzeW1ib2wgKnR5cGVkZWZfc3ltID0gKHN0cnVjdCBzeW1ib2wgKikKKwkgICAgb2JzdGFja19hbGxvYyAoJm9iamZpbGUgLT4gc3ltYm9sX29ic3RhY2ssIHNpemVvZiAoc3RydWN0IHN5bWJvbCkpOworCSAgKnR5cGVkZWZfc3ltID0gKnN5bTsKKwkgIFNZTUJPTF9DTEFTUyAodHlwZWRlZl9zeW0pID0gTE9DX1RZUEVERUY7CisJICBTWU1CT0xfVkFMVUUgKHR5cGVkZWZfc3ltKSA9IHZhbHU7CisJICBTWU1CT0xfTkFNRVNQQUNFICh0eXBlZGVmX3N5bSkgPSBWQVJfTkFNRVNQQUNFOworCSAgaWYgKFRZUEVfTkFNRSAoU1lNQk9MX1RZUEUgKHN5bSkpID09IDApCisJICAgIFRZUEVfTkFNRSAoU1lNQk9MX1RZUEUgKHN5bSkpCisJICAgICAgPSBvYmNvbmNhdCAoJm9iamZpbGUgLT4gdHlwZV9vYnN0YWNrLCAiIiwgIiIsIFNZTUJPTF9OQU1FIChzeW0pKTsKKwkgIGFkZF9zeW1ib2xfdG9fbGlzdCAodHlwZWRlZl9zeW0sICZmaWxlX3N5bWJvbHMpOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnVic6CisgICAgICAvKiBTdGF0aWMgc3ltYm9sIG9mIGxvY2FsIHNjb3BlICovCisgICAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IHJlYWRfdHlwZSAoJnAsIG9iamZpbGUpOworICAgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX1NUQVRJQzsKKyAgICAgIFNZTUJPTF9WQUxVRV9BRERSRVNTIChzeW0pID0gdmFsdTsKKyNpZmRlZiBTVEFUSUNfVFJBTlNGT1JNX05BTUUKKyAgICAgIGlmIChJU19TVEFUSUNfVFJBTlNGT1JNX05BTUUgKFNZTUJPTF9OQU1FIChzeW0pKSkKKyAgICAgIHsKKwlzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW07CisJbXN5bSA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoU1lNQk9MX05BTUUgKHN5bSksIE5VTEwsIG9iamZpbGUpOworCWlmIChtc3ltICE9IE5VTEwpCisJICB7CisJICAgIFNZTUJPTF9OQU1FIChzeW0pID0gU1RBVElDX1RSQU5TRk9STV9OQU1FIChTWU1CT0xfTkFNRSAoc3ltKSk7CisJICAgIFNZTUJPTF9WQUxVRV9BRERSRVNTIChzeW0pID0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW0pOworCSAgfQorICAgICAgfQorI2VuZGlmCisgICAgICBTWU1CT0xfTkFNRVNQQUNFIChzeW0pID0gVkFSX05BTUVTUEFDRTsKKyAgICAgIGlmIChvczlrX3N0YWJzKQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmZ2xvYmFsX3N5bWJvbHMpOworICAgICAgZWxzZQorCWFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmbG9jYWxfc3ltYm9scyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3YnOgorICAgICAgLyogUmVmZXJlbmNlIHBhcmFtZXRlciAqLworICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSByZWFkX3R5cGUgKCZwLCBvYmpmaWxlKTsKKyAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19SRUZfQVJHOworICAgICAgU1lNQk9MX1ZBTFVFIChzeW0pID0gdmFsdTsKKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworICAgICAgYWRkX3N5bWJvbF90b19saXN0IChzeW0sICZsb2NhbF9zeW1ib2xzKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnYSc6CisgICAgICAvKiBSZWZlcmVuY2UgcGFyYW1ldGVyIHdoaWNoIGlzIGluIGEgcmVnaXN0ZXIuICAqLworICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSByZWFkX3R5cGUgKCZwLCBvYmpmaWxlKTsKKyAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19SRUdQQVJNX0FERFI7CisgICAgICBTWU1CT0xfVkFMVUUgKHN5bSkgPSBTVEFCX1JFR19UT19SRUdOVU0gKHZhbHUpOworICAgICAgaWYgKFNZTUJPTF9WQUxVRSAoc3ltKSA+PSBOVU1fUkVHUykKKwl7CisJICBjb21wbGFpbiAoJnJlZ192YWx1ZV9jb21wbGFpbnQsIFNZTUJPTF9WQUxVRSAoc3ltKSwgTlVNX1JFR1MsCisJCSAgICBTWU1CT0xfU09VUkNFX05BTUUgKHN5bSkpOworCSAgU1lNQk9MX1ZBTFVFIChzeW0pID0gU1BfUkVHTlVNOyAgLyogS25vd24gc2FmZSwgdGhvdWdoIHVzZWxlc3MgKi8KKwl9CisgICAgICBTWU1CT0xfTkFNRVNQQUNFIChzeW0pID0gVkFSX05BTUVTUEFDRTsKKyAgICAgIGFkZF9zeW1ib2xfdG9fbGlzdCAoc3ltLCAmbG9jYWxfc3ltYm9scyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1gnOgorICAgICAgLyogVGhpcyBpcyB1c2VkIGJ5IFN1biBGT1JUUkFOIGZvciAiZnVuY3Rpb24gcmVzdWx0IHZhbHVlIi4KKwkgU3VuIGNsYWltcyAoImRieCBhbmQgZGJ4dG9vbCBpbnRlcmZhY2VzIiwgMm5kIGVkKQorCSB0aGF0IFBhc2NhbCB1c2VzIGl0IHRvbywgYnV0IHdoZW4gSSB0cmllZCBpdCBQYXNjYWwgdXNlZAorCSAieDozIiAobG9jYWwgc3ltYm9sKSBpbnN0ZWFkLiAgKi8KKyAgICAgIFNZTUJPTF9UWVBFIChzeW0pID0gcmVhZF90eXBlICgmcCwgb2JqZmlsZSk7CisgICAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfTE9DQUw7CisgICAgICBTWU1CT0xfVkFMVUUgKHN5bSkgPSB2YWx1OworICAgICAgU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9IFZBUl9OQU1FU1BBQ0U7CisgICAgICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmxvY2FsX3N5bWJvbHMpOworICAgICAgYnJlYWs7CisKKyAgICAvKiBOZXcgY29kZSBhZGRlZCB0byBzdXBwb3J0IGNmcm9udCBzdGFicyBzdHJpbmdzLgorICAgICAgIE5vdGU6IGNhc2UgJ1AnIGFscmVhZHkgaGFuZGxlZCBhYm92ZSAqLworICAgIGNhc2UgJ1onOgorICAgICAgLyogQ2Zyb250IHR5cGUgY29udGludWF0aW9uIGNvbWluZyB1cCEKKwkgRmluZCB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiBhbmQgYWRkIHRvIGl0LgorCSBXZSdsbCBoYXZlIHRvIGRvIHRoaXMgZm9yIHRoZSB0eXBlZGVmIHRvbywKKwkgc2luY2Ugd2UgY2xvbmVkIHRoZSBzeW1ib2wgdG8gZGVmaW5lIGEgdHlwZSBpbiByZWFkX3R5cGUuCisJIFN0YWJzIGluZm8gZXhhbXBsZXM6CisJCSBfXzFDIDpadGwgCisJCSBmb29fXzFDRnYgOlp0RiAoZmlyc3QgZGVmIGZvb19fMUNGdjpGKDAsMyk7KDAsMjQpKQorCQkgQzpac0M7O19fY3RfXzFDRnYgZnVuYzFfXzFDRnYgZnVuYzJfXzFDRnYgLi4uIDs7OworCQkgd2hlcmUgQyBpcyB0aGUgbmFtZSBvZiB0aGUgY2xhc3MuCisJIFVuZm9ydHVuYXRlbHksIHdlIGNhbid0IGxvb2t1cCB0aGUgb3JpZ2luYWwgc3ltYm9sIHlldCAnY3V6IAorCSB3ZSBoYXZlbid0IGZpbmlzaGVkIHJlYWRpbmcgYWxsIHRoZSBzeW1ib2xzLgorCSBJbnN0ZWFkLCB3ZSBzYXZlIGl0IGZvciBwcm9jZXNzaW5nIGxhdGVyICovCisgICAgICBwcm9jZXNzX2xhdGVyIChzeW0sIHAsIHJlc29sdmVfY2Zyb250X2NvbnRpbnVhdGlvbik7CisgICAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IGVycm9yX3R5cGUgKCZwLCBvYmpmaWxlKTsgLyogRklYTUUhIGNoYW5nZSBsYXRlciAqLyAKKyAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19DT05TVDsgCisgICAgICBTWU1CT0xfVkFMVUUgKHN5bSkgPSAwOyAKKyAgICAgIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPSBWQVJfTkFNRVNQQUNFOworICAgICAgLyogRG9uJ3QgYWRkIHRvIGxpc3QgLSB3ZSdsbCBkZWxldGUgaXQgbGF0ZXIgd2hlbiAKKyAgICAgICAgIHdlIGFkZCB0aGUgY29udGludWF0aW9uIHRvIHRoZSByZWFsIHN5bSAqLworICAgICAgcmV0dXJuIHN5bTsKKyAgICAgIC8qIEVuZCBvZiBuZXcgY29kZSBhZGRlZCB0byBzdXBwb3J0IGNmcm9udCBzdGFicyBzdHJpbmdzICovCisKKyAgICBkZWZhdWx0OgorICAgICAgU1lNQk9MX1RZUEUgKHN5bSkgPSBlcnJvcl90eXBlICgmcCwgb2JqZmlsZSk7CisgICAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfQ09OU1Q7CisgICAgICBTWU1CT0xfVkFMVUUgKHN5bSkgPSAwOworICAgICAgU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9IFZBUl9OQU1FU1BBQ0U7CisgICAgICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgJmZpbGVfc3ltYm9scyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogV2hlbiBwYXNzaW5nIHN0cnVjdHVyZXMgdG8gYSBmdW5jdGlvbiwgc29tZSBzeXN0ZW1zIHNvbWV0aW1lcyBwYXNzCisgICAgIHRoZSBhZGRyZXNzIGluIGEgcmVnaXN0ZXIsIG5vdCB0aGUgc3RydWN0dXJlIGl0c2VsZi4gKi8KKworICBpZiAoUkVHX1NUUlVDVF9IQVNfQUREUiAocHJvY2Vzc2luZ19nY2NfY29tcGlsYXRpb24sIFNZTUJPTF9UWVBFIChzeW0pKQorICAgICAgJiYgKFNZTUJPTF9DTEFTUyAoc3ltKSA9PSBMT0NfUkVHUEFSTSB8fCBTWU1CT0xfQ0xBU1MgKHN5bSkgPT0gTE9DX0FSRykpCisgICAgeworICAgICAgc3RydWN0IHR5cGUgKnN5bWJvbF90eXBlID0gY2hlY2tfdHlwZWRlZiAoU1lNQk9MX1RZUEUgKHN5bSkpOworCisgICAgICBpZiAoKFRZUEVfQ09ERSAoc3ltYm9sX3R5cGUpID09IFRZUEVfQ09ERV9TVFJVQ1QpCisJICB8fCAoVFlQRV9DT0RFIChzeW1ib2xfdHlwZSkgPT0gVFlQRV9DT0RFX1VOSU9OKQorCSAgfHwgKFRZUEVfQ09ERSAoc3ltYm9sX3R5cGUpID09IFRZUEVfQ09ERV9CSVRTVFJJTkcpCisJICB8fCAoVFlQRV9DT0RFIChzeW1ib2xfdHlwZSkgPT0gVFlQRV9DT0RFX1NFVCkpCisJeworCSAgLyogSWYgUkVHX1NUUlVDVF9IQVNfQUREUiB5aWVsZHMgbm9uLXplcm8gd2UgaGF2ZSB0byBjb252ZXJ0CisJICAgICBMT0NfUkVHUEFSTSB0byBMT0NfUkVHUEFSTV9BRERSIGZvciBzdHJ1Y3R1cmVzIGFuZCB1bmlvbnMuICovCisJICBpZiAoU1lNQk9MX0NMQVNTIChzeW0pID09IExPQ19SRUdQQVJNKQorCSAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfUkVHUEFSTV9BRERSOworCSAgLyogTGlrZXdpc2UgZm9yIGNvbnZlcnRpbmcgTE9DX0FSRyB0byBMT0NfUkVGX0FSRyAoZm9yIHRoZSA3dGgKKwkgICAgIGFuZCBzdWJzZXF1ZW50IGFyZ3VtZW50cyBvbiB0aGUgc3BhcmMsIGZvciBleGFtcGxlKS4gICovCisJICBlbHNlIGlmIChTWU1CT0xfQ0xBU1MgKHN5bSkgPT0gTE9DX0FSRykKKwkgICAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX1JFRl9BUkc7CisJfQorICAgIH0KKworICAvKiBJcyB0aGVyZSBtb3JlIHRvIHBhcnNlPyAgRm9yIGV4YW1wbGUgTFJTL2FsaWFzIGluZm9ybWF0aW9uPyAgKi8KKyAgd2hpbGUgKCpwICYmICpwID09ICc7JykKKyAgICB7CisgICAgICBwKys7CisgICAgICBpZiAoKnAgJiYgKnAgPT0gJ2wnKQorICAgICAgICB7CisgICAgICAgICAgLyogR05VIGV4dGVuc2lvbnMgZm9yIGxpdmUgcmFuZ2Ugc3BsaXR0aW5nIG1heSBiZSBhcHBlbmRlZCB0byAKKyAgICAgICAgICAgICB0aGUgZW5kIG9mIHRoZSBzdGFiIHN0cmluZy4gIGVnLiAibCgjMSwjMik7bCgjMywjNSkiICovCisKKwkgIC8qIFJlc29sdmUgdGhlIGxpdmUgcmFuZ2UgYW5kIGFkZCBpdCB0byBTWU0ncyBsaXZlIHJhbmdlIGxpc3QuICAqLworCSAgaWYgKCFyZXNvbHZlX2xpdmVfcmFuZ2UgKG9iamZpbGUsIHN5bSwgcCkpCisJICAgIHJldHVybiBOVUxMOworCisJICAvKiBGaW5kIGVuZCBvZiBsaXZlIHJhbmdlIGluZm8uICovCisJICBwID0gc3RyY2hyIChwLCAnKScpOworICAgICAgICAgIGlmICghKnAgfHwgKnAgIT0gJyknKQorCSAgICB7CisJICAgICAgY29tcGxhaW4gKCZscnNfZ2VuZXJhbF9jb21wbGFpbnQsICJsaXZlIHJhbmdlIGZvcm1hdCBub3QgcmVjb2duaXplZCIpOworCSAgICAgIHJldHVybiBOVUxMOworCSAgICB9CisgICAgICAgICAgcCsrOworICAgICAgIH0KKyAgICB9CisgIHJldHVybiBzeW07Cit9CisKKy8qIEFkZCB0aGUgbGl2ZSByYW5nZSBmb3VuZCBpbiBQIHRvIHRoZSBzeW1ib2wgU1lNIGluIG9iamZpbGUgT0JKRklMRS4gIFJldHVybnMKKyAgIG5vbi16ZXJvIG9uIHN1Y2Nlc3MsIHplcm8gb3RoZXJ3aXNlLiAgKi8KKworc3RhdGljIGludAorcmVzb2x2ZV9saXZlX3JhbmdlIChvYmpmaWxlLCBzeW0sIHApCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgICAgIGNoYXIgKnA7Cit7CisgIGludCByZWZudW07CisgIENPUkVfQUREUiBzdGFydCwgZW5kOworCisgIC8qIFNhbml0eSBjaGVjayB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdGFicyBzdHJpbmcuICAqLworICBpZiAoISpwIHx8ICpwICE9ICdsJykKKyAgICB7CisgICAgICBjb21wbGFpbiAoJmxyc19nZW5lcmFsX2NvbXBsYWludCwgImxpdmUgcmFuZ2Ugc3RyaW5nIDEiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgcCsrOworCisgIGlmICghKnAgfHwgKnAgIT0gJygnKQorICAgIHsKKyAgICAgIGNvbXBsYWluICgmbHJzX2dlbmVyYWxfY29tcGxhaW50LCAibGl2ZSByYW5nZSBzdHJpbmcgMiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBwKys7CisJCisgIC8qIEdldCBzdGFydGluZyB2YWx1ZSBvZiByYW5nZSBhbmQgYWR2YW5jZSBQIHBhc3QgdGhlIHJlZmVyZW5jZSBpZC4KKworICAgICA/IT8gSW4gdGhlb3J5LCB0aGUgcHJvY2Vzc19yZWZlcmVuY2Ugc2hvdWxkIG5ldmVyIGZhaWwsIGJ1dCB3ZSBzaG91bGQKKyAgICAgY2F0Y2ggdGhhdCBjYXNlIGp1c3QgaW4gY2FzZSB0aGUgY29tcGlsZXIgc2Nyb2dnZWQgdGhlIHN0YWJzLiAgKi8KKyAgcmVmbnVtID0gcHJvY2Vzc19yZWZlcmVuY2UgKCZwKTsKKyAgc3RhcnQgPSByZWZfc2VhcmNoX3ZhbHVlIChyZWZudW0pOworICBpZiAoIXN0YXJ0KQorICAgIHsKKyAgICAgIGNvbXBsYWluICgmbHJzX2dlbmVyYWxfY29tcGxhaW50LCAiTGl2ZSByYW5nZSBzeW1ib2wgbm90IGZvdW5kIDEiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoISpwIHx8ICpwICE9ICcsJykKKyAgICB7CisgICAgICBjb21wbGFpbiAoJmxyc19nZW5lcmFsX2NvbXBsYWludCwgImxpdmUgcmFuZ2Ugc3RyaW5nIDMiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgcCsrOworCisgIC8qIEdldCBlbmRpbmcgdmFsdWUgb2YgcmFuZ2UgYW5kIGFkdmFuY2UgUCBwYXN0IHRoZSByZWZlcmVuY2UgaWQuCisKKyAgICAgPyE/IEluIHRoZW9yeSwgdGhlIHByb2Nlc3NfcmVmZXJlbmNlIHNob3VsZCBuZXZlciBmYWlsLCBidXQgd2Ugc2hvdWxkCisgICAgIGNhdGNoIHRoYXQgY2FzZSBqdXN0IGluIGNhc2UgdGhlIGNvbXBpbGVyIHNjcm9nZ2VkIHRoZSBzdGFicy4gICovCisgIHJlZm51bSA9IHByb2Nlc3NfcmVmZXJlbmNlICgmcCk7CisgIGVuZCA9IHJlZl9zZWFyY2hfdmFsdWUgKHJlZm51bSk7CisgIGlmICghZW5kKQorICAgIHsKKyAgICAgIGNvbXBsYWluICgmbHJzX2dlbmVyYWxfY29tcGxhaW50LCAiTGl2ZSByYW5nZSBzeW1ib2wgbm90IGZvdW5kIDIiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoISpwIHx8ICpwICE9ICcpJykKKyAgICB7CisgICAgICBjb21wbGFpbiAoJmxyc19nZW5lcmFsX2NvbXBsYWludCwgImxpdmUgcmFuZ2Ugc3RyaW5nIDQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBib3VuZHMgb2YgdGhlIHJhbmdlLCBhZGQgaXQgdG8gdGhlCisgICAgIHN5bWJvbC4gICovCisgIGFkZF9saXZlX3JhbmdlIChvYmpmaWxlLCBzeW0sIHN0YXJ0LCBlbmQpOworCisgIHJldHVybiAxOworfQorCisvKiBBZGQgYSBuZXcgbGl2ZSByYW5nZSBkZWZpbmVkIGJ5IFNUQVJUIGFuZCBFTkQgdG8gdGhlIHN5bWJvbCBTWU0KKyAgIGluIG9iamZpbGUgT0JKRklMRS4gICovCisKK3N0YXRpYyB2b2lkCithZGRfbGl2ZV9yYW5nZSAob2JqZmlsZSwgc3ltLCBzdGFydCwgZW5kKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgc3RydWN0IHN5bWJvbCAqc3ltOworICAgICBDT1JFX0FERFIgc3RhcnQsIGVuZDsKK3sKKyAgc3RydWN0IHJhbmdlX2xpc3QgKnIsICpyczsKKworICBpZiAoc3RhcnQgPj0gZW5kKQorICAgIHsKKyAgICAgIGNvbXBsYWluICgmbHJzX2dlbmVyYWxfY29tcGxhaW50LCAiZW5kIG9mIGxpdmUgcmFuZ2UgZm9sbG93cyBzdGFydCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBBbGxvYyBuZXcgbGl2ZSByYW5nZSBzdHJ1Y3R1cmUuICovCisgIHIgPSAoc3RydWN0IHJhbmdlX2xpc3QgKikKKyAgICBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+dHlwZV9vYnN0YWNrLCAKKwkJICAgc2l6ZW9mIChzdHJ1Y3QgcmFuZ2VfbGlzdCkpOworICByLT5zdGFydCA9IHN0YXJ0OworICByLT5lbmQgPSBlbmQ7CisgIHItPm5leHQgPSAwOworCisgIC8qIEFwcGVuZCB0aGlzIHJhbmdlIHRvIHRoZSBzeW1ib2wncyByYW5nZSBsaXN0LiAqLworICBpZiAoIVNZTUJPTF9SQU5HRVMgKHN5bSkpCisgICAgU1lNQk9MX1JBTkdFUyAoc3ltKSA9IHI7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGxhc3QgcmFuZ2UgZm9yIHRoZSBzeW1ib2wuICovCisgICAgICBmb3IgKHJzID0gU1lNQk9MX1JBTkdFUyAoc3ltKTsgcnMtPm5leHQ7IHJzID0gcnMtPm5leHQpCisJOworICAgICAgcnMtPm5leHQgPSByOworICAgIH0KK30KKworDAorLyogU2tpcCByZXN0IG9mIHRoaXMgc3ltYm9sIGFuZCByZXR1cm4gYW4gZXJyb3IgdHlwZS4KKworICAgR2VuZXJhbCBub3RlcyBvbiBlcnJvciByZWNvdmVyeTogIGVycm9yX3R5cGUgYWx3YXlzIHNraXBzIHRvIHRoZQorICAgZW5kIG9mIHRoZSBzeW1ib2wgKG1vZHVsbyBjcmV0aW5vdXMgZGJ4IHN5bWJvbCBuYW1lIGNvbnRpbnVhdGlvbikuCisgICBUaHVzIGNvZGUgbGlrZSB0aGlzOgorCisgICBpZiAoKigqcHApKysgIT0gJzsnKQorICAgICByZXR1cm4gZXJyb3JfdHlwZSAocHAsIG9iamZpbGUpOworCisgICBpcyB3cm9uZyBiZWNhdXNlIGlmICpwcCBzdGFydHMgb3V0IHBvaW50aW5nIGF0ICdcMCcgKHR5cGljYWxseSBhcyB0aGUKKyAgIHJlc3VsdCBvZiBhbiBlYXJsaWVyIGVycm9yKSwgaXQgd2lsbCBiZSBpbmNyZW1lbnRlZCB0byBwb2ludCB0byB0aGUKKyAgIHN0YXJ0IG9mIHRoZSBuZXh0IHN5bWJvbCwgd2hpY2ggbWlnaHQgcHJvZHVjZSBzdHJhbmdlIHJlc3VsdHMsIGF0IGxlYXN0CisgICBpZiB5b3UgcnVuIG9mZiB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgdGFibGUuICBJbnN0ZWFkIHVzZQorCisgICBpZiAoKipwcCAhPSAnOycpCisgICAgIHJldHVybiBlcnJvcl90eXBlIChwcCwgb2JqZmlsZSk7CisgICArKypwcDsKKworICAgb3IKKworICAgaWYgKCoqcHAgIT0gJzsnKQorICAgICBmb28gPSBlcnJvcl90eXBlIChwcCwgb2JqZmlsZSk7CisgICBlbHNlCisgICAgICsrKnBwOworCisgICBBbmQgaW4gY2FzZSBpdCBpc24ndCBvYnZpb3VzLCB0aGUgcG9pbnQgb2YgYWxsIHRoaXMgaGFpciBpcyBzbyB0aGUgY29tcGlsZXIKKyAgIGNhbiBkZWZpbmUgbmV3IHR5cGVzIGFuZCBuZXcgc3ludGF4ZXMsIGFuZCBvbGQgdmVyc2lvbnMgb2YgdGhlCisgICBkZWJ1Z2dlciB3aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgbmV3IHN5bWJvbCB0YWJsZXMuICAqLworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorZXJyb3JfdHlwZSAocHAsIG9iamZpbGUpCisgICAgIGNoYXIgKipwcDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIGNvbXBsYWluICgmZXJyb3JfdHlwZV9jb21wbGFpbnQpOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAvKiBTa2lwIHRvIGVuZCBvZiBzeW1ib2wuICAqLworICAgICAgd2hpbGUgKCoqcHAgIT0gJ1wwJykKKwl7CisJICAoKnBwKSsrOworCX0KKworICAgICAgLyogQ2hlY2sgZm9yIGFuZCBoYW5kbGUgY3JldGlub3VzIGRieCBzeW1ib2wgbmFtZSBjb250aW51YXRpb24hICAqLworICAgICAgaWYgKCgqcHApWy0xXSA9PSAnXFwnIHx8ICgqcHApWy0xXSA9PSAnPycpCisJeworCSAgKnBwID0gbmV4dF9zeW1ib2xfdGV4dCAob2JqZmlsZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIHJldHVybiAoYnVpbHRpbl90eXBlX2Vycm9yKTsKK30KKworDAorLyogUmVhZCB0eXBlIGluZm9ybWF0aW9uIG9yIGEgdHlwZSBkZWZpbml0aW9uOyByZXR1cm4gdGhlIHR5cGUuICBFdmVuCisgICB0aG91Z2ggdGhpcyByb3V0aW5lIGFjY2VwdHMgZWl0aGVyIHR5cGUgaW5mb3JtYXRpb24gb3IgYSB0eXBlCisgICBkZWZpbml0aW9uLCB0aGUgZGlzdGluY3Rpb24gaXMgcmVsZXZhbnQtLXNvbWUgcGFydHMgb2Ygc3RhYnNyZWFkLmMKKyAgIGFzc3VtZSB0aGF0IHR5cGUgaW5mb3JtYXRpb24gc3RhcnRzIHdpdGggYSBkaWdpdCwgJy0nLCBvciAnKCcgaW4KKyAgIGRlY2lkaW5nIHdoZXRoZXIgdG8gY2FsbCByZWFkX3R5cGUuICAqLworCitzdHJ1Y3QgdHlwZSAqCityZWFkX3R5cGUgKHBwLCBvYmpmaWxlKQorICAgICByZWdpc3RlciBjaGFyICoqcHA7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdHlwZSA9IDA7CisgIHN0cnVjdCB0eXBlICp0eXBlMTsKKyAgaW50IHR5cGVudW1zWzJdOworICBjaGFyIHR5cGVfZGVzY3JpcHRvcjsKKworICAvKiBTaXplIGluIGJpdHMgb2YgdHlwZSBpZiBzcGVjaWZpZWQgYnkgYSB0eXBlIGF0dHJpYnV0ZSwgb3IgLTEgaWYKKyAgICAgdGhlcmUgaXMgbm8gc2l6ZSBhdHRyaWJ1dGUuICAqLworICBpbnQgdHlwZV9zaXplID0gLTE7CisKKyAgLyogVXNlZCB0byBkaXN0aW5ndWlzaCBzdHJpbmcgYW5kIGJpdHN0cmluZyBmcm9tIGNoYXItYXJyYXkgYW5kIHNldC4gKi8KKyAgaW50IGlzX3N0cmluZyA9IDA7CisKKyAgLyogUmVhZCB0eXBlIG51bWJlciBpZiBwcmVzZW50LiAgVGhlIHR5cGUgbnVtYmVyIG1heSBiZSBvbWl0dGVkLgorICAgICBmb3IgaW5zdGFuY2UgaW4gYSB0d28tZGltZW5zaW9uYWwgYXJyYXkgZGVjbGFyZWQgd2l0aCB0eXBlCisgICAgICJhcjE7MTsxMDthcjE7MTsxMDs0Ii4gICovCisgIGlmICgoKipwcCA+PSAnMCcgJiYgKipwcCA8PSAnOScpCisgICAgICB8fCAqKnBwID09ICcoJworICAgICAgfHwgKipwcCA9PSAnLScpCisgICAgeworICAgICAgaWYgKHJlYWRfdHlwZV9udW1iZXIgKHBwLCB0eXBlbnVtcykgIT0gMCkKKwlyZXR1cm4gZXJyb3JfdHlwZSAocHAsIG9iamZpbGUpOworICAgICAgCisgICAgICAvKiBUeXBlIGlzIG5vdCBiZWluZyBkZWZpbmVkIGhlcmUuICBFaXRoZXIgaXQgYWxyZWFkeSBleGlzdHMsCisJIG9yIHRoaXMgaXMgYSBmb3J3YXJkIHJlZmVyZW5jZSB0byBpdC4gIGRieF9hbGxvY190eXBlIGhhbmRsZXMKKwkgYm90aCBjYXNlcy4gICovCisgICAgICBpZiAoKipwcCAhPSAnPScpCisJcmV0dXJuIGRieF9hbGxvY190eXBlICh0eXBlbnVtcywgb2JqZmlsZSk7CisKKyAgICAgIC8qIFR5cGUgaXMgYmVpbmcgZGVmaW5lZCBoZXJlLiAgKi8KKyAgICAgIC8qIFNraXAgdGhlICc9Jy4KKwkgQWxzbyBza2lwIHRoZSB0eXBlIGRlc2NyaXB0b3IgLSB3ZSBnZXQgaXQgYmVsb3cgd2l0aCAoKnBwKVstMV0uICAqLworICAgICAgKCpwcCkrPTI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogJ3R5cGVudW1zPScgbm90IHByZXNlbnQsIHR5cGUgaXMgYW5vbnltb3VzLiAgUmVhZCBhbmQgcmV0dXJuCisJIHRoZSBkZWZpbml0aW9uLCBidXQgZG9uJ3QgcHV0IGl0IGluIHRoZSB0eXBlIHZlY3Rvci4gICovCisgICAgICB0eXBlbnVtc1swXSA9IHR5cGVudW1zWzFdID0gLTE7CisgICAgICAoKnBwKSsrOworICAgIH0KKworIGFnYWluOgorICB0eXBlX2Rlc2NyaXB0b3IgPSAoKnBwKVstMV07CisgIHN3aXRjaCAodHlwZV9kZXNjcmlwdG9yKQorICAgIHsKKyAgICBjYXNlICd4JzoKKyAgICAgIHsKKwllbnVtIHR5cGVfY29kZSBjb2RlOworCisJLyogVXNlZCB0byBpbmRleCB0aHJvdWdoIGZpbGVfc3ltYm9scy4gICovCisJc3RydWN0IHBlbmRpbmcgKnBwdDsKKwlpbnQgaTsKKwkKKwkvKiBOYW1lIGluY2x1ZGluZyAic3RydWN0IiwgZXRjLiAgKi8KKwljaGFyICp0eXBlX25hbWU7CisJCisJeworCSAgY2hhciAqZnJvbSwgKnRvLCAqcCwgKnExLCAqcTI7CisJICAKKwkgIC8qIFNldCB0aGUgdHlwZSBjb2RlIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIGxldHRlci4gICovCisJICBzd2l0Y2ggKCgqcHApWzBdKQorCSAgICB7CisJICAgIGNhc2UgJ3MnOgorCSAgICAgIGNvZGUgPSBUWVBFX0NPREVfU1RSVUNUOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICd1JzoKKwkgICAgICBjb2RlID0gVFlQRV9DT0RFX1VOSU9OOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdlJzoKKwkgICAgICBjb2RlID0gVFlQRV9DT0RFX0VOVU07CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgeworCQkvKiBDb21wbGFpbiBhbmQga2VlcCBnb2luZywgc28gY29tcGlsZXJzIGNhbiBpbnZlbnQgbmV3CisJCSAgIGNyb3NzLXJlZmVyZW5jZSB0eXBlcy4gICovCisJCXN0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IG1zZyA9CisJCSAgeyJVbnJlY29nbml6ZWQgY3Jvc3MtcmVmZXJlbmNlIHR5cGUgYCVjJyIsIDAsIDB9OworCQljb21wbGFpbiAoJm1zZywgKCpwcClbMF0pOworCQljb2RlID0gVFlQRV9DT0RFX1NUUlVDVDsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgICB9CisJICAgCisJICBxMSA9IHN0cmNociAoKnBwLCAnPCcpOworCSAgcCA9IHN0cmNociAoKnBwLCAnOicpOworCSAgaWYgKHAgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGVycm9yX3R5cGUgKHBwLCBvYmpmaWxlKTsKKwkgIGlmIChxMSAmJiBwID4gcTEgJiYgcFsxXSA9PSAnOicpCisJICAgIHsKKwkgICAgICBpbnQgbmVzdGluZ19sZXZlbCA9IDA7CisJICAgICAgZm9yIChxMiA9IHExOyAqcTI7IHEyKyspCisJCXsKKwkJICBpZiAoKnEyID09ICc8JykKKwkJICAgIG5lc3RpbmdfbGV2ZWwrKzsKKwkJICBlbHNlIGlmICgqcTIgPT0gJz4nKQorCQkgICAgbmVzdGluZ19sZXZlbC0tOworCQkgIGVsc2UgaWYgKCpxMiA9PSAnOicgJiYgbmVzdGluZ19sZXZlbCA9PSAwKQorCQkgICAgYnJlYWs7CisJCX0KKwkgICAgICBwID0gcTI7CisJICAgICAgaWYgKCpwICE9ICc6JykKKwkJcmV0dXJuIGVycm9yX3R5cGUgKHBwLCBvYmpmaWxlKTsKKwkgICAgfQorCSAgdG8gPSB0eXBlX25hbWUgPSAKKwkJKGNoYXIgKilvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+dHlwZV9vYnN0YWNrLCBwIC0gKnBwICsgMSk7CisJCisJICAvKiBDb3B5IHRoZSBuYW1lLiAgKi8KKwkgIGZyb20gPSAqcHAgKyAxOworCSAgd2hpbGUgKGZyb20gPCBwKSAKKwkgICAgKnRvKysgPSAqZnJvbSsrOworCSAgKnRvID0gJ1wwJzsKKwkgIAorCSAgLyogU2V0IHRoZSBwb2ludGVyIGFoZWFkIG9mIHRoZSBuYW1lIHdoaWNoIHdlIGp1c3QgcmVhZCwgYW5kCisJICAgICB0aGUgY29sb24uICAqLworCSAgKnBwID0gZnJvbSArIDE7CisJfQorCisJLyogTm93IGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4KKwkgICBkZWNsYXJlZC4gIFRoaXMgd2FzIHdyaXR0ZW4gZm9yIGFycmF5cyBvZiBjcm9zcy1yZWZlcmVuY2VkCisJICAgdHlwZXMgYmVmb3JlIHdlIGhhZCBUWVBFX0NPREVfVEFSR0VUX1NUVUJCRUQsIHNvIEknbSBwcmV0dHkKKwkgICBzdXJlIGl0IGlzIG5vdCBuZWNlc3NhcnkgYW55bW9yZS4gIEJ1dCBpdCBtaWdodCBiZSBhIGdvb2QKKwkgICBpZGVhLCB0byBzYXZlIGEgbGl0dGxlIG1lbW9yeS4gICovCisKKwlmb3IgKHBwdCA9IGZpbGVfc3ltYm9sczsgcHB0OyBwcHQgPSBwcHQtPm5leHQpCisJICBmb3IgKGkgPSAwOyBpIDwgcHB0LT5uc3ltczsgaSsrKQorCSAgICB7CisJICAgICAgc3RydWN0IHN5bWJvbCAqc3ltID0gcHB0LT5zeW1ib2xbaV07CisKKwkgICAgICBpZiAoU1lNQk9MX0NMQVNTIChzeW0pID09IExPQ19UWVBFREVGCisJCSAgJiYgU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9PSBTVFJVQ1RfTkFNRVNQQUNFCisJCSAgJiYgKFRZUEVfQ09ERSAoU1lNQk9MX1RZUEUgKHN5bSkpID09IGNvZGUpCisJCSAgJiYgU1RSRVEgKFNZTUJPTF9OQU1FIChzeW0pLCB0eXBlX25hbWUpKQorCQl7CisJCSAgb2JzdGFja19mcmVlICgmb2JqZmlsZSAtPiB0eXBlX29ic3RhY2ssIHR5cGVfbmFtZSk7CisJCSAgdHlwZSA9IFNZTUJPTF9UWVBFIChzeW0pOworCQkgIHJldHVybiB0eXBlOworCQl9CisJICAgIH0KKworCS8qIERpZG4ndCBmaW5kIHRoZSB0eXBlIHRvIHdoaWNoIHRoaXMgcmVmZXJzLCBzbyB3ZSBtdXN0CisJICAgYmUgZGVhbGluZyB3aXRoIGEgZm9yd2FyZCByZWZlcmVuY2UuICBBbGxvY2F0ZSBhIHR5cGUKKwkgICBzdHJ1Y3R1cmUgZm9yIGl0LCBhbmQga2VlcCB0cmFjayBvZiBpdCBzbyB3ZSBjYW4KKwkgICBmaWxsIGluIHRoZSByZXN0IG9mIHRoZSBmaWVsZHMgd2hlbiB3ZSBnZXQgdGhlIGZ1bGwKKwkgICB0eXBlLiAgKi8KKwl0eXBlID0gZGJ4X2FsbG9jX3R5cGUgKHR5cGVudW1zLCBvYmpmaWxlKTsKKwlUWVBFX0NPREUgKHR5cGUpID0gY29kZTsKKwlUWVBFX1RBR19OQU1FICh0eXBlKSA9IHR5cGVfbmFtZTsKKwlJTklUX0NQTFVTX1NQRUNJRklDKHR5cGUpOworCVRZUEVfRkxBR1MgKHR5cGUpIHw9IFRZUEVfRkxBR19TVFVCOworCisJYWRkX3VuZGVmaW5lZF90eXBlICh0eXBlKTsKKwlyZXR1cm4gdHlwZTsKKyAgICAgIH0KKworICAgIGNhc2UgJy0nOgkJCQkvKiBSUy82MDAwIGJ1aWx0LWluIHR5cGUgKi8KKyAgICBjYXNlICcwJzoKKyAgICBjYXNlICcxJzoKKyAgICBjYXNlICcyJzoKKyAgICBjYXNlICczJzoKKyAgICBjYXNlICc0JzoKKyAgICBjYXNlICc1JzoKKyAgICBjYXNlICc2JzoKKyAgICBjYXNlICc3JzoKKyAgICBjYXNlICc4JzoKKyAgICBjYXNlICc5JzoKKyAgICBjYXNlICcoJzoKKyAgICAgICgqcHApLS07CisKKyAgICAgIC8qIFdlIGRlYWwgd2l0aCBzb21ldGhpbmcgbGlrZSB0KDEsMik9KDMsNCk9Li4uIHdoaWNoCisJIHRoZSBMdWNpZCBjb21waWxlciBhbmQgcmVjZW50IGdjYyB2ZXJzaW9ucyAocG9zdCAyLjcuMykgdXNlLiAqLworCisgICAgICAvKiBBbGxvY2F0ZSBhbmQgZW50ZXIgdGhlIHR5cGVkZWYgdHlwZSBmaXJzdC4KKwkgVGhpcyBoYW5kbGVzIHJlY3Vyc2l2ZSB0eXBlcy4gKi8KKyAgICAgIHR5cGUgPSBkYnhfYWxsb2NfdHlwZSAodHlwZW51bXMsIG9iamZpbGUpOworICAgICAgVFlQRV9DT0RFICh0eXBlKSA9IFRZUEVfQ09ERV9UWVBFREVGOworICAgICAgeyBzdHJ1Y3QgdHlwZSAqeHR5cGUgPSByZWFkX3R5cGUgKHBwLCBvYmpmaWxlKTsKKwlpZiAodHlwZSA9PSB4dHlwZSkKKwkgIHsKKwkgICAgLyogSXQncyBiZWluZyBkZWZpbmVkIGFzIGl0c2VsZi4gIFRoYXQgbWVhbnMgaXQgaXMgInZvaWQiLiAgKi8KKwkgICAgVFlQRV9DT0RFICh0eXBlKSA9IFRZUEVfQ09ERV9WT0lEOworCSAgICBUWVBFX0xFTkdUSCAodHlwZSkgPSAxOworCSAgfQorCWVsc2UgaWYgKHR5cGVfc2l6ZSA+PSAwIHx8IGlzX3N0cmluZykKKwkgIHsKKwkgICAgKnR5cGUgPSAqeHR5cGU7CisJICAgIFRZUEVfTkFNRSAodHlwZSkgPSBOVUxMOworCSAgICBUWVBFX1RBR19OQU1FICh0eXBlKSA9IE5VTEw7CisJICB9CisJZWxzZQorCSAgeworCSAgICBUWVBFX0ZMQUdTICh0eXBlKSB8PSBUWVBFX0ZMQUdfVEFSR0VUX1NUVUI7CisJICAgIFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpID0geHR5cGU7CisJICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIC8qIEluIHRoZSBmb2xsb3dpbmcgdHlwZXMsIHdlIG11c3QgYmUgc3VyZSB0byBvdmVyd3JpdGUgYW55IGV4aXN0aW5nCisgICAgICAgdHlwZSB0aGF0IHRoZSB0eXBlbnVtcyByZWZlciB0bywgcmF0aGVyIHRoYW4gYWxsb2NhdGluZyBhIG5ldyBvbmUKKyAgICAgICBhbmQgbWFraW5nIHRoZSB0eXBlbnVtcyBwb2ludCB0byB0aGUgbmV3IG9uZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGVyZQorICAgICAgIG1heSBhbHJlYWR5IGJlIHBvaW50ZXJzIHRvIHRoZSBleGlzdGluZyB0eXBlIChpZiBpdCBoYWQgYmVlbgorICAgICAgIGZvcndhcmQtcmVmZXJlbmNlZCksIGFuZCB3ZSBtdXN0IGNoYW5nZSBpdCB0byBhIHBvaW50ZXIsIGZ1bmN0aW9uLAorICAgICAgIHJlZmVyZW5jZSwgb3Igd2hhdGV2ZXIsICppbi1wbGFjZSouICAqLworCisgICAgY2FzZSAnKic6CisgICAgICB0eXBlMSA9IHJlYWRfdHlwZSAocHAsIG9iamZpbGUpOworICAgICAgdHlwZSA9IG1ha2VfcG9pbnRlcl90eXBlICh0eXBlMSwgZGJ4X2xvb2t1cF90eXBlICh0eXBlbnVtcykpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcmJzoJCQkJLyogUmVmZXJlbmNlIHRvIGFub3RoZXIgdHlwZSAqLworICAgICAgdHlwZTEgPSByZWFkX3R5cGUgKHBwLCBvYmpmaWxlKTsKKyAgICAgIHR5cGUgPSBtYWtlX3JlZmVyZW5jZV90eXBlICh0eXBlMSwgZGJ4X2xvb2t1cF90eXBlICh0eXBlbnVtcykpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdmJzoJCQkJLyogRnVuY3Rpb24gcmV0dXJuaW5nIGFub3RoZXIgdHlwZSAqLworICAgICAgaWYgKG9zOWtfc3RhYnMgJiYgKipwcCA9PSAnKCcpCisJeworCSAgLyogRnVuY3Rpb24gcHJvdG90eXBlOyBwYXJzZSBpdC4KKwkgICAgIFdlIG11c3QgY29uZGl0aW9uYWxpemUgdGhpcyBvbiBvczlrX3N0YWJzIGJlY2F1c2Ugb3RoZXJ3aXNlCisJICAgICBpdCBjb3VsZCBiZSBjb25mdXNlZCB3aXRoIGEgU3VuLXN0eWxlICgxLDMpIHR5cGVudW1iZXIKKwkgICAgIChJIHRoaW5rKS4gICovCisJICBzdHJ1Y3QgdHlwZSAqdDsKKwkgICsrKnBwOworCSAgd2hpbGUgKCoqcHAgIT0gJyknKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB0ID0gcmVhZF90eXBlIChwcCwgb2JqZmlsZSk7CisgICAgICAgICAgICAgIGlmICgqKnBwID09ICcsJykgKysqcHA7CisgICAgICAgICAgICB9CisJfQorICAgICAgdHlwZTEgPSByZWFkX3R5cGUgKHBwLCBvYmpmaWxlKTsKKyAgICAgIHR5cGUgPSBtYWtlX2Z1bmN0aW9uX3R5cGUgKHR5cGUxLCBkYnhfbG9va3VwX3R5cGUgKHR5cGVudW1zKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2snOgkJCSAgIC8qIENvbnN0IHF1YWxpZmllciBvbiBzb21lIHR5cGUgKFN1bikgKi8KKyAgICBjYXNlICdjJzoJCQkgICAvKiBDb25zdCBxdWFsaWZpZXIgb24gc29tZSB0eXBlIChPUzkwMDApICovCisgICAgICAvKiBCZWNhdXNlICdjJyBtZWFucyBvdGhlciB0aGluZ3MgdG8gQUlYIGFuZCAnaycgaXMgcGVyZmVjdGx5IGdvb2QsCisJIG9ubHkgYWNjZXB0ICdjJyBpbiB0aGUgb3M5a19zdGFicyBjYXNlLiAgKi8KKyAgICAgIGlmICh0eXBlX2Rlc2NyaXB0b3IgPT0gJ2MnICYmICFvczlrX3N0YWJzKQorCXJldHVybiBlcnJvcl90eXBlIChwcCwgb2JqZmlsZSk7CisgICAgICB0eXBlID0gcmVhZF90eXBlIChwcCwgb2JqZmlsZSk7CisgICAgICAvKiBGSVhNRSEgRm9yIG5vdywgd2UgaWdub3JlIGNvbnN0IGFuZCB2b2xhdGlsZSBxdWFsaWZpZXJzLiAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnQic6CQkJICAgICAvKiBWb2xhdGlsZSBxdWFsIG9uIHNvbWUgdHlwZSAoU3VuKSAqLworICAgIGNhc2UgJ2knOgkJCSAgICAgLyogVm9sYXRpbGUgcXVhbCBvbiBzb21lIHR5cGUgKE9TOTAwMCkgKi8KKyAgICAgIC8qIEJlY2F1c2UgJ2knIG1lYW5zIG90aGVyIHRoaW5ncyB0byBBSVggYW5kICdCJyBpcyBwZXJmZWN0bHkgZ29vZCwKKwkgb25seSBhY2NlcHQgJ2knIGluIHRoZSBvczlrX3N0YWJzIGNhc2UuICAqLworICAgICAgaWYgKHR5cGVfZGVzY3JpcHRvciA9PSAnaScgJiYgIW9zOWtfc3RhYnMpCisJcmV0dXJuIGVycm9yX3R5cGUgKHBwLCBvYmpmaWxlKTsKKyAgICAgIHR5cGUgPSByZWFkX3R5cGUgKHBwLCBvYmpmaWxlKTsKKyAgICAgIC8qIEZJWE1FISBGb3Igbm93LCB3ZSBpZ25vcmUgY29uc3QgYW5kIHZvbGF0aWxlIHF1YWxpZmllcnMuICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdAJzoKKyAgICAgIGlmIChpc2RpZ2l0ICgqKnBwKSB8fCAqKnBwID09ICAnKCcgfHwgKipwcCA9PSAnLScpCisJeyAvKiBNZW1iZXIgKGNsYXNzICYgdmFyaWFibGUpIHR5cGUgKi8KKwkgIC8qIEZJWE1FIC0tIHdlIHNob3VsZCBiZSBkb2luZyBzbWFzaF90b19YWFggdHlwZXMgaGVyZS4gICovCisKKwkgIHN0cnVjdCB0eXBlICpkb21haW4gPSByZWFkX3R5cGUgKHBwLCBvYmpmaWxlKTsKKwkgIHN0cnVjdCB0eXBlICptZW10eXBlOworCisJICBpZiAoKipwcCAhPSAnLCcpCisJICAgIC8qIEludmFsaWQgbWVtYmVyIHR5cGUgZGF0YSBmb3JtYXQuICAqLworCSAgICByZXR1cm4gZXJyb3JfdHlwZSAocHAsIG9iamZpbGUpOworCSAgKysqcHA7CisKKwkgIG1lbXR5cGUgPSByZWFkX3R5cGUgKHBwLCBvYmpmaWxlKTsKKwkgIHR5cGUgPSBkYnhfYWxsb2NfdHlwZSAodHlwZW51bXMsIG9iamZpbGUpOworCSAgc21hc2hfdG9fbWVtYmVyX3R5cGUgKHR5cGUsIGRvbWFpbiwgbWVtdHlwZSk7CisJfQorICAgICAgZWxzZSAvKiB0eXBlIGF0dHJpYnV0ZSAqLworCXsKKwkgIGNoYXIgKmF0dHIgPSAqcHA7CisJICAvKiBTa2lwIHRvIHRoZSBzZW1pY29sb24uICAqLworCSAgd2hpbGUgKCoqcHAgIT0gJzsnICYmICoqcHAgIT0gJ1wwJykKKwkgICAgKysoKnBwKTsKKwkgIGlmICgqKnBwID09ICdcMCcpCisJICAgIHJldHVybiBlcnJvcl90eXBlIChwcCwgb2JqZmlsZSk7CisJICBlbHNlCisJICAgICsrKnBwOyAgLyogU2tpcCB0aGUgc2VtaWNvbG9uLiAgKi8KKworCSAgc3dpdGNoICgqYXR0cikKKwkgICAgeworCSAgICBjYXNlICdzJzoKKwkgICAgICB0eXBlX3NpemUgPSBhdG9pIChhdHRyICsgMSk7CisJICAgICAgaWYgKHR5cGVfc2l6ZSA8PSAwKQorCQl0eXBlX3NpemUgPSAtMTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdTJzoKKwkgICAgICBpc19zdHJpbmcgPSAxOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgLyogSWdub3JlIHVucmVjb2duaXplZCB0eXBlIGF0dHJpYnV0ZXMsIHNvIGZ1dHVyZSBjb21waWxlcnMKKwkJIGNhbiBpbnZlbnQgbmV3IG9uZXMuICAqLworCSAgICAgIGJyZWFrOworCSAgICB9CisJICArKypwcDsKKwkgIGdvdG8gYWdhaW47CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcjJzoJCQkJLyogTWV0aG9kIChjbGFzcyAmIGZuKSB0eXBlICovCisgICAgICBpZiAoKCpwcClbMF0gPT0gJyMnKQorCXsKKwkgIC8qIFdlJ2xsIGdldCB0aGUgcGFyYW1ldGVyIHR5cGVzIGZyb20gdGhlIG5hbWUuICAqLworCSAgc3RydWN0IHR5cGUgKnJldHVybl90eXBlOworCisJICAoKnBwKSsrOworCSAgcmV0dXJuX3R5cGUgPSByZWFkX3R5cGUgKHBwLCBvYmpmaWxlKTsKKwkgIGlmICgqKCpwcCkrKyAhPSAnOycpCisJICAgIGNvbXBsYWluICgmaW52YWxpZF9tZW1iZXJfY29tcGxhaW50LCBzeW1udW0pOworCSAgdHlwZSA9IGFsbG9jYXRlX3N0dWJfbWV0aG9kIChyZXR1cm5fdHlwZSk7CisJICBpZiAodHlwZW51bXNbMF0gIT0gLTEpCisJICAgICpkYnhfbG9va3VwX3R5cGUgKHR5cGVudW1zKSA9IHR5cGU7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN0cnVjdCB0eXBlICpkb21haW4gPSByZWFkX3R5cGUgKHBwLCBvYmpmaWxlKTsKKwkgIHN0cnVjdCB0eXBlICpyZXR1cm5fdHlwZTsKKwkgIHN0cnVjdCB0eXBlICoqYXJnczsKKworCSAgaWYgKCoqcHAgIT0gJywnKQorCSAgICAvKiBJbnZhbGlkIG1lbWJlciB0eXBlIGRhdGEgZm9ybWF0LiAgKi8KKwkgICAgcmV0dXJuIGVycm9yX3R5cGUgKHBwLCBvYmpmaWxlKTsKKwkgIGVsc2UKKwkgICAgKysoKnBwKTsKKworCSAgcmV0dXJuX3R5cGUgPSByZWFkX3R5cGUgKHBwLCBvYmpmaWxlKTsKKwkgIGFyZ3MgPSByZWFkX2FyZ3MgKHBwLCAnOycsIG9iamZpbGUpOworCSAgdHlwZSA9IGRieF9hbGxvY190eXBlICh0eXBlbnVtcywgb2JqZmlsZSk7CisJICBzbWFzaF90b19tZXRob2RfdHlwZSAodHlwZSwgZG9tYWluLCByZXR1cm5fdHlwZSwgYXJncyk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdyJzoJCQkJLyogUmFuZ2UgdHlwZSAqLworICAgICAgdHlwZSA9IHJlYWRfcmFuZ2VfdHlwZSAocHAsIHR5cGVudW1zLCBvYmpmaWxlKTsKKyAgICAgIGlmICh0eXBlbnVtc1swXSAhPSAtMSkKKwkqZGJ4X2xvb2t1cF90eXBlICh0eXBlbnVtcykgPSB0eXBlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdiJzoKKyAgICAgIGlmIChvczlrX3N0YWJzKQorCS8qIENvbnN0IGFuZCB2b2xhdGlsZSBxdWFsaWZpZWQgdHlwZS4gICovCisJdHlwZSA9IHJlYWRfdHlwZSAocHAsIG9iamZpbGUpOworICAgICAgZWxzZQorCXsKKwkgIC8qIFN1biBBQ0MgYnVpbHRpbiBpbnQgdHlwZSAqLworCSAgdHlwZSA9IHJlYWRfc3VuX2J1aWx0aW5fdHlwZSAocHAsIHR5cGVudW1zLCBvYmpmaWxlKTsKKwkgIGlmICh0eXBlbnVtc1swXSAhPSAtMSkKKwkgICAgKmRieF9sb29rdXBfdHlwZSAodHlwZW51bXMpID0gdHlwZTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ1InOgkJCQkvKiBTdW4gQUNDIGJ1aWx0aW4gZmxvYXQgdHlwZSAqLworICAgICAgdHlwZSA9IHJlYWRfc3VuX2Zsb2F0aW5nX3R5cGUgKHBwLCB0eXBlbnVtcywgb2JqZmlsZSk7CisgICAgICBpZiAodHlwZW51bXNbMF0gIT0gLTEpCisJKmRieF9sb29rdXBfdHlwZSAodHlwZW51bXMpID0gdHlwZTsKKyAgICAgIGJyZWFrOworICAgIAorICAgIGNhc2UgJ2UnOgkJCQkvKiBFbnVtZXJhdGlvbiB0eXBlICovCisgICAgICB0eXBlID0gZGJ4X2FsbG9jX3R5cGUgKHR5cGVudW1zLCBvYmpmaWxlKTsKKyAgICAgIHR5cGUgPSByZWFkX2VudW1fdHlwZSAocHAsIHR5cGUsIG9iamZpbGUpOworICAgICAgaWYgKHR5cGVudW1zWzBdICE9IC0xKQorCSpkYnhfbG9va3VwX3R5cGUgKHR5cGVudW1zKSA9IHR5cGU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3MnOgkJCQkvKiBTdHJ1Y3QgdHlwZSAqLworICAgIGNhc2UgJ3UnOgkJCQkvKiBVbmlvbiB0eXBlICovCisgICAgICB0eXBlID0gZGJ4X2FsbG9jX3R5cGUgKHR5cGVudW1zLCBvYmpmaWxlKTsKKyAgICAgIHN3aXRjaCAodHlwZV9kZXNjcmlwdG9yKQorCXsKKwkgIGNhc2UgJ3MnOgorCSAgICBUWVBFX0NPREUgKHR5cGUpID0gVFlQRV9DT0RFX1NUUlVDVDsKKwkgICAgYnJlYWs7CisJICBjYXNlICd1JzoKKwkgICAgVFlQRV9DT0RFICh0eXBlKSA9IFRZUEVfQ09ERV9VTklPTjsKKwkgICAgYnJlYWs7CisJfQorICAgICAgdHlwZSA9IHJlYWRfc3RydWN0X3R5cGUgKHBwLCB0eXBlLCBvYmpmaWxlKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnYSc6CQkJCS8qIEFycmF5IHR5cGUgKi8KKyAgICAgIGlmICgqKnBwICE9ICdyJykKKwlyZXR1cm4gZXJyb3JfdHlwZSAocHAsIG9iamZpbGUpOworICAgICAgKysqcHA7CisgICAgICAKKyAgICAgIHR5cGUgPSBkYnhfYWxsb2NfdHlwZSAodHlwZW51bXMsIG9iamZpbGUpOworICAgICAgdHlwZSA9IHJlYWRfYXJyYXlfdHlwZSAocHAsIHR5cGUsIG9iamZpbGUpOworICAgICAgaWYgKGlzX3N0cmluZykKKwlUWVBFX0NPREUgKHR5cGUpID0gVFlQRV9DT0RFX1NUUklORzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnUyc6CisgICAgICB0eXBlMSA9IHJlYWRfdHlwZSAocHAsIG9iamZpbGUpOworICAgICAgdHlwZSA9IGNyZWF0ZV9zZXRfdHlwZSAoKHN0cnVjdCB0eXBlKikgTlVMTCwgdHlwZTEpOworICAgICAgaWYgKGlzX3N0cmluZykKKwlUWVBFX0NPREUgKHR5cGUpID0gVFlQRV9DT0RFX0JJVFNUUklORzsKKyAgICAgIGlmICh0eXBlbnVtc1swXSAhPSAtMSkKKwkqZGJ4X2xvb2t1cF90eXBlICh0eXBlbnVtcykgPSB0eXBlOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgLS0qcHA7CQkJLyogR28gYmFjayB0byB0aGUgc3ltYm9sIGluIGVycm9yICovCisJCQkJLyogUGFydGljdWxhcmx5IGltcG9ydGFudCBpZiBpdCB3YXMgXDAhICovCisgICAgICByZXR1cm4gZXJyb3JfdHlwZSAocHAsIG9iamZpbGUpOworICAgIH0KKworICBpZiAodHlwZSA9PSAwKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJHREIgaW50ZXJuYWwgZXJyb3IsIHR5cGUgaXMgTlVMTCBpbiBzdGFic3JlYWQuY1xuIik7CisgICAgICByZXR1cm4gZXJyb3JfdHlwZSAocHAsIG9iamZpbGUpOworICAgIH0KKworICAvKiBTaXplIHNwZWNpZmllZCBpbiBhIHR5cGUgYXR0cmlidXRlIG92ZXJyaWRlcyBhbnkgb3RoZXIgc2l6ZS4gICovCisgIGlmICh0eXBlX3NpemUgIT0gLTEpCisgICAgVFlQRV9MRU5HVEggKHR5cGUpID0gKHR5cGVfc2l6ZSArIFRBUkdFVF9DSEFSX0JJVCAtIDEpIC8gVEFSR0VUX0NIQVJfQklUOworCisgIHJldHVybiB0eXBlOworfQorDAorLyogUlMvNjAwMCB4bGMvZGJ4IGNvbWJpbmF0aW9uIHVzZXMgYSBzZXQgb2YgYnVpbHRpbiB0eXBlcywgc3RhcnRpbmcgZnJvbSAtMS4KKyAgIFJldHVybiB0aGUgcHJvcGVyIHR5cGUgbm9kZSBmb3IgYSBnaXZlbiBidWlsdGluIHR5cGUgbnVtYmVyLiAqLworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorcnM2MDAwX2J1aWx0aW5fdHlwZSAodHlwZW51bSkKKyAgICAgaW50IHR5cGVudW07Cit7CisgIC8qIFdlIHJlY29nbml6ZSB0eXBlcyBudW1iZXJlZCBmcm9tIC1OVU1CRVJfUkVDT0dOSVpFRCB0byAtMS4gICovCisjZGVmaW5lIE5VTUJFUl9SRUNPR05JWkVEIDM0CisgIC8qIFRoaXMgaW5jbHVkZXMgYW4gZW1wdHkgc2xvdCBmb3IgdHlwZSBudW1iZXIgLTAuICAqLworICBzdGF0aWMgc3RydWN0IHR5cGUgKm5lZ2F0aXZlX3R5cGVzW05VTUJFUl9SRUNPR05JWkVEICsgMV07CisgIHN0cnVjdCB0eXBlICpyZXR0eXBlID0gTlVMTDsKKworICBpZiAodHlwZW51bSA+PSAwIHx8IHR5cGVudW0gPCAtTlVNQkVSX1JFQ09HTklaRUQpCisgICAgeworICAgICAgY29tcGxhaW4gKCZyczYwMDBfYnVpbHRpbl9jb21wbGFpbnQsIHR5cGVudW0pOworICAgICAgcmV0dXJuIGJ1aWx0aW5fdHlwZV9lcnJvcjsKKyAgICB9CisgIGlmIChuZWdhdGl2ZV90eXBlc1stdHlwZW51bV0gIT0gTlVMTCkKKyAgICByZXR1cm4gbmVnYXRpdmVfdHlwZXNbLXR5cGVudW1dOworCisjaWYgVEFSR0VUX0NIQVJfQklUICE9IDgKKyAgI2Vycm9yIFRoaXMgY29kZSB3cm9uZyBmb3IgVEFSR0VUX0NIQVJfQklUIG5vdCA4CisgIC8qIFRoZXNlIGRlZmluaXRpb25zIGFsbCBhc3N1bWUgdGhhdCBUQVJHRVRfQ0hBUl9CSVQgaXMgOC4gIEkgdGhpbmsKKyAgICAgdGhhdCBpZiB0aGF0IGV2ZXIgYmVjb21lcyBub3QgdHJ1ZSwgdGhlIGNvcnJlY3QgZml4IHdpbGwgYmUgdG8KKyAgICAgbWFrZSB0aGUgc2l6ZSBpbiB0aGUgc3RydWN0IHR5cGUgdG8gYmUgaW4gYml0cywgbm90IGluIHVuaXRzIG9mCisgICAgIFRBUkdFVF9DSEFSX0JJVC4gICovCisjZW5kaWYKKworICBzd2l0Y2ggKC10eXBlbnVtKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICAvKiBUaGUgc2l6ZSBvZiB0aGlzIGFuZCBhbGwgdGhlIG90aGVyIHR5cGVzIGFyZSBmaXhlZCwgZGVmaW5lZAorCSBieSB0aGUgZGVidWdnaW5nIGZvcm1hdC4gIElmIHRoZXJlIGlzIGEgdHlwZSBjYWxsZWQgImludCIgd2hpY2gKKwkgaXMgb3RoZXIgdGhhbiAzMiBiaXRzLCB0aGVuIGl0IHNob3VsZCB1c2UgYSBuZXcgbmVnYXRpdmUgdHlwZQorCSBudW1iZXIgKG9yIGF2b2lkIG5lZ2F0aXZlIHR5cGUgbnVtYmVycyBmb3IgdGhhdCBjYXNlKS4KKwkgU2VlIHN0YWJzLnRleGluZm8uICAqLworICAgICAgcmV0dHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgNCwgMCwgImludCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgcmV0dHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgMSwgMCwgImNoYXIiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIHJldHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDIsIDAsICJzaG9ydCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgcmV0dHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgNCwgMCwgImxvbmciLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgIHJldHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDEsIFRZUEVfRkxBR19VTlNJR05FRCwKKwkJCSAgICJ1bnNpZ25lZCBjaGFyIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICByZXR0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCAxLCAwLCAic2lnbmVkIGNoYXIiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIHJldHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDIsIFRZUEVfRkxBR19VTlNJR05FRCwKKwkJCSAgICJ1bnNpZ25lZCBzaG9ydCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgcmV0dHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgNCwgVFlQRV9GTEFHX1VOU0lHTkVELAorCQkJICAgInVuc2lnbmVkIGludCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5OgorICAgICAgcmV0dHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgNCwgVFlQRV9GTEFHX1VOU0lHTkVELAorCQkJICAgInVuc2lnbmVkIiwgTlVMTCk7CisgICAgY2FzZSAxMDoKKyAgICAgIHJldHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDQsIFRZUEVfRkxBR19VTlNJR05FRCwKKwkJCSAgICJ1bnNpZ25lZCBsb25nIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDExOgorICAgICAgcmV0dHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX1ZPSUQsIDEsIDAsICJ2b2lkIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyOgorICAgICAgLyogSUVFRSBzaW5nbGUgcHJlY2lzaW9uICgzMiBiaXQpLiAgKi8KKyAgICAgIHJldHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9GTFQsIDQsIDAsICJmbG9hdCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzoKKyAgICAgIC8qIElFRUUgZG91YmxlIHByZWNpc2lvbiAoNjQgYml0KS4gICovCisgICAgICByZXR0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfRkxULCA4LCAwLCAiZG91YmxlIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE0OgorICAgICAgLyogVGhpcyBpcyBhbiBJRUVFIGRvdWJsZSBvbiB0aGUgUlMvNjAwMCwgYW5kIGRpZmZlcmVudCBtYWNoaW5lcyB3aXRoCisJIGRpZmZlcmVudCBzaXplcyBmb3IgImxvbmcgZG91YmxlIiBzaG91bGQgdXNlIGRpZmZlcmVudCBuZWdhdGl2ZQorCSB0eXBlIG51bWJlcnMuICBTZWUgc3RhYnMudGV4aW5mby4gICovCisgICAgICByZXR0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfRkxULCA4LCAwLCAibG9uZyBkb3VibGUiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTU6CisgICAgICByZXR0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCA0LCAwLCAiaW50ZWdlciIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICAgIHJldHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9CT09MLCA0LCBUWVBFX0ZMQUdfVU5TSUdORUQsCisJCQkgICAiYm9vbGVhbiIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzoKKyAgICAgIHJldHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9GTFQsIDQsIDAsICJzaG9ydCByZWFsIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE4OgorICAgICAgcmV0dHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0ZMVCwgOCwgMCwgInJlYWwiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTk6CisgICAgICByZXR0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfRVJST1IsIDAsIDAsICJzdHJpbmdwdHIiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjA6CisgICAgICByZXR0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfQ0hBUiwgMSwgVFlQRV9GTEFHX1VOU0lHTkVELAorCQkJICAgImNoYXJhY3RlciIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMToKKyAgICAgIHJldHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9CT09MLCAxLCBUWVBFX0ZMQUdfVU5TSUdORUQsCisJCQkgICAibG9naWNhbCoxIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDIyOgorICAgICAgcmV0dHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0JPT0wsIDIsIFRZUEVfRkxBR19VTlNJR05FRCwKKwkJCSAgICJsb2dpY2FsKjIiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjM6CisgICAgICByZXR0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfQk9PTCwgNCwgVFlQRV9GTEFHX1VOU0lHTkVELAorCQkJICAgImxvZ2ljYWwqNCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoKKyAgICAgIHJldHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9CT09MLCA0LCBUWVBFX0ZMQUdfVU5TSUdORUQsCisJCQkgICAibG9naWNhbCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNToKKyAgICAgIC8qIENvbXBsZXggdHlwZSBjb25zaXN0aW5nIG9mIHR3byBJRUVFIHNpbmdsZSBwcmVjaXNpb24gdmFsdWVzLiAgKi8KKyAgICAgIHJldHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9DT01QTEVYLCA4LCAwLCAiY29tcGxleCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNjoKKyAgICAgIC8qIENvbXBsZXggdHlwZSBjb25zaXN0aW5nIG9mIHR3byBJRUVFIGRvdWJsZSBwcmVjaXNpb24gdmFsdWVzLiAgKi8KKyAgICAgIHJldHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9DT01QTEVYLCAxNiwgMCwgImRvdWJsZSBjb21wbGV4IiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI3OgorICAgICAgcmV0dHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgMSwgMCwgImludGVnZXIqMSIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyODoKKyAgICAgIHJldHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDIsIDAsICJpbnRlZ2VyKjIiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjk6CisgICAgICByZXR0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCA0LCAwLCAiaW50ZWdlcio0IiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMwOgorICAgICAgcmV0dHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0NIQVIsIDIsIDAsICJ3Y2hhciIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMToKKyAgICAgIHJldHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDgsIDAsICJsb25nIGxvbmciLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6CisgICAgICByZXR0eXBlID0gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCA4LCBUWVBFX0ZMQUdfVU5TSUdORUQsCisJCQkgICAidW5zaWduZWQgbG9uZyBsb25nIiwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMzOgorICAgICAgcmV0dHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgOCwgVFlQRV9GTEFHX1VOU0lHTkVELAorCQkJICAgImxvZ2ljYWwqOCIsIE5VTEwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzNDoKKyAgICAgIHJldHR5cGUgPSBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDgsIDAsICJpbnRlZ2VyKjgiLCBOVUxMKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgbmVnYXRpdmVfdHlwZXNbLXR5cGVudW1dID0gcmV0dHlwZTsKKyAgcmV0dXJuIHJldHR5cGU7Cit9CisMCisvKiBUaGlzIHBhZ2UgY29udGFpbnMgc3Vicm91dGluZXMgb2YgcmVhZF90eXBlLiAgKi8KKworLyogUmVhZCBtZW1iZXIgZnVuY3Rpb24gc3RhYnMgaW5mbyBmb3IgQysrIGNsYXNzZXMuICBUaGUgZm9ybSBvZiBlYWNoIG1lbWJlcgorICAgZnVuY3Rpb24gZGF0YSBpczoKKworCU5BTUUgOjogVFlQRU5VTVs9dHlwZSBkZWZpbml0aW9uXSBBUkdTIDogUEhZU05BTUUgOworCisgICBBbiBleGFtcGxlIHdpdGggdHdvIG1lbWJlciBmdW5jdGlvbnMgaXM6CisKKwlhZnVuYzE6OjIwPSMjMTU7Omk7MkEuO2FmdW5jMjo6MjA6aTsyQS47CisKKyAgIEZvciB0aGUgY2FzZSBvZiBvdmVybG9hZGVkIG9wZXJhdG9ycywgdGhlIGZvcm1hdCBpcyBvcCQ6OiouZnVuY3MsIHdoZXJlCisgICAkIGlzIHRoZSBDUExVU19NQVJLRVIgKHVzdWFsbHkgJyQnKSwgYConIGhvbGRzIHRoZSBwbGFjZSBmb3IgYW4gb3BlcmF0b3IKKyAgIG5hbWUgKHN1Y2ggYXMgYCs9JykgYW5kIGAuJyBtYXJrcyB0aGUgZW5kIG9mIHRoZSBvcGVyYXRvciBuYW1lLgorCisgICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuICAqLworCitzdGF0aWMgaW50CityZWFkX21lbWJlcl9mdW5jdGlvbnMgKGZpcCwgcHAsIHR5cGUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBmaWVsZF9pbmZvICpmaXA7CisgICAgIGNoYXIgKipwcDsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICBpbnQgbmZuX2ZpZWxkcyA9IDA7CisgIGludCBsZW5ndGggPSAwOworICAvKiBUb3RhbCBudW1iZXIgb2YgbWVtYmVyIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMgY2xhc3MuICBJZiB0aGUgY2xhc3MKKyAgICAgZGVmaW5lcyB0d28gYGYnIGZ1bmN0aW9ucywgYW5kIG9uZSBgZycgZnVuY3Rpb24sIHRoZW4gdGhpcyB3aWxsIGhhdmUKKyAgICAgdGhlIHZhbHVlIDMuICAqLworICBpbnQgdG90YWxfbGVuZ3RoID0gMDsKKyAgaW50IGk7CisgIHN0cnVjdCBuZXh0X2ZuZmllbGQKKyAgICB7CisgICAgICBzdHJ1Y3QgbmV4dF9mbmZpZWxkICpuZXh0OworICAgICAgc3RydWN0IGZuX2ZpZWxkIGZuX2ZpZWxkOworICAgIH0gKnN1Ymxpc3Q7CisgIHN0cnVjdCB0eXBlICpsb29rX2FoZWFkX3R5cGU7CisgIHN0cnVjdCBuZXh0X2ZuZmllbGRsaXN0ICpuZXdfZm5saXN0OworICBzdHJ1Y3QgbmV4dF9mbmZpZWxkICpuZXdfc3VibGlzdDsKKyAgY2hhciAqbWFpbl9mbl9uYW1lOworICByZWdpc3RlciBjaGFyICpwOworICAgICAgCisgIC8qIFByb2Nlc3MgZWFjaCBsaXN0IHVudGlsIHdlIGZpbmQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgbWVtYmVyIGZ1bmN0aW9uCisgICAgIG9yIGZpbmQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb25zLiAqLworCisgIHdoaWxlICgqKnBwICE9ICc7JykKKyAgICB7CisgICAgICAvKiBXZSBzaG91bGQgYmUgcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCisJIFNjYW4gZm9yd2FyZCB0byBmaW5kIHRoZSBmaXJzdCAnOicgYW5kIGlmIGl0IGlzIG5vdCB0aGUKKwkgZmlyc3Qgb2YgYSAiOjoiIGRlbGltaXRlciwgdGhlbiB0aGlzIGlzIG5vdCBhIG1lbWJlciBmdW5jdGlvbi4gKi8KKyAgICAgIHAgPSAqcHA7CisgICAgICB3aGlsZSAoKnAgIT0gJzonKQorCXsKKwkgIHArKzsKKwl9CisgICAgICBpZiAocFsxXSAhPSAnOicpCisJeworCSAgYnJlYWs7CisJfQorCisgICAgICBzdWJsaXN0ID0gTlVMTDsKKyAgICAgIGxvb2tfYWhlYWRfdHlwZSA9IE5VTEw7CisgICAgICBsZW5ndGggPSAwOworICAgICAgCisgICAgICBuZXdfZm5saXN0ID0gKHN0cnVjdCBuZXh0X2ZuZmllbGRsaXN0ICopCisJeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbmV4dF9mbmZpZWxkbGlzdCkpOworICAgICAgbWFrZV9jbGVhbnVwIChmcmVlLCBuZXdfZm5saXN0KTsKKyAgICAgIG1lbXNldCAobmV3X2ZubGlzdCwgMCwgc2l6ZW9mIChzdHJ1Y3QgbmV4dF9mbmZpZWxkbGlzdCkpOworICAgICAgCisgICAgICBpZiAoKCpwcClbMF0gPT0gJ28nICYmICgqcHApWzFdID09ICdwJyAmJiBpc19jcGx1c19tYXJrZXIgKCgqcHApWzJdKSkKKwl7CisJICAvKiBUaGlzIGlzIGEgY29tcGxldGVseSB3aWVyZCBjYXNlLiAgSW4gb3JkZXIgdG8gc3R1ZmYgaW4gdGhlCisJICAgICBuYW1lcyB0aGF0IG1pZ2h0IGNvbnRhaW4gY29sb25zICh0aGUgdXN1YWwgbmFtZSBkZWxpbWl0ZXIpLAorCSAgICAgTWlrZSBUaWVtYW5uIGRlZmluZWQgYSBkaWZmZXJlbnQgbmFtZSBmb3JtYXQgd2hpY2ggaXMKKwkgICAgIHNpZ25hbGxlZCBpZiB0aGUgaWRlbnRpZmllciBpcyAib3AkIi4gIEluIHRoYXQgY2FzZSwgdGhlCisJICAgICBmb3JtYXQgaXMgIm9wJDo6WFhYWC4iIHdoZXJlIFhYWFggaXMgdGhlIG5hbWUuICBUaGlzIGlzCisJICAgICB1c2VkIGZvciBuYW1lcyBsaWtlICIrIiBvciAiPSIuICBZVVVVVVVVVUshICBGSVhNRSEgICovCisJICAvKiBUaGlzIGxldHMgdGhlIHVzZXIgdHlwZSAiYnJlYWsgb3BlcmF0b3IrIi4KKwkgICAgIFdlIGNvdWxkIGp1c3QgcHV0IGluICIrIiBhcyB0aGUgbmFtZSwgYnV0IHRoYXQgd291bGRuJ3QKKwkgICAgIHdvcmsgZm9yICIqIi4gICovCisJICBzdGF0aWMgY2hhciBvcG5hbWVbMzJdID0geydvJywgJ3AnLCBDUExVU19NQVJLRVJ9OworCSAgY2hhciAqbyA9IG9wbmFtZSArIDM7CisJICAKKwkgIC8qIFNraXAgcGFzdCAnOjonLiAgKi8KKwkgICpwcCA9IHAgKyAyOworCisJICBTVEFCU19DT05USU5VRSAocHAsIG9iamZpbGUpOworCSAgcCA9ICpwcDsKKwkgIHdoaWxlICgqcCAhPSAnLicpCisJICAgIHsKKwkgICAgICAqbysrID0gKnArKzsKKwkgICAgfQorCSAgbWFpbl9mbl9uYW1lID0gc2F2ZXN0cmluZyAob3BuYW1lLCBvIC0gb3BuYW1lKTsKKwkgIC8qIFNraXAgcGFzdCAnLicgICovCisJICAqcHAgPSBwICsgMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbWFpbl9mbl9uYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBwIC0gKnBwKTsKKwkgIC8qIFNraXAgcGFzdCAnOjonLiAgKi8KKwkgICpwcCA9IHAgKyAyOworCX0KKyAgICAgIG5ld19mbmxpc3QgLT4gZm5fZmllbGRsaXN0Lm5hbWUgPSBtYWluX2ZuX25hbWU7CisgICAgICAKKyAgICAgIGRvCisJeworCSAgbmV3X3N1Ymxpc3QgPQorCSAgICAoc3RydWN0IG5leHRfZm5maWVsZCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBuZXh0X2ZuZmllbGQpKTsKKwkgIG1ha2VfY2xlYW51cCAoZnJlZSwgbmV3X3N1Ymxpc3QpOworCSAgbWVtc2V0IChuZXdfc3VibGlzdCwgMCwgc2l6ZW9mIChzdHJ1Y3QgbmV4dF9mbmZpZWxkKSk7CisJICAKKwkgIC8qIENoZWNrIGZvciBhbmQgaGFuZGxlIGNyZXRpbm91cyBkYnggc3ltYm9sIG5hbWUgY29udGludWF0aW9uISAgKi8KKwkgIGlmIChsb29rX2FoZWFkX3R5cGUgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIC8qIE5vcm1hbCBjYXNlLiAqLworCSAgICAgIFNUQUJTX0NPTlRJTlVFIChwcCwgb2JqZmlsZSk7CisJICAgICAgCisJICAgICAgbmV3X3N1Ymxpc3QgLT4gZm5fZmllbGQudHlwZSA9IHJlYWRfdHlwZSAocHAsIG9iamZpbGUpOworCSAgICAgIGlmICgqKnBwICE9ICc6JykKKwkJeworCQkgIC8qIEludmFsaWQgc3ltdGFiIGluZm8gZm9yIG1lbWJlciBmdW5jdGlvbi4gICovCisJCSAgcmV0dXJuIDA7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogZysrIHZlcnNpb24gMSBrbHVkZ2UgKi8KKwkgICAgICBuZXdfc3VibGlzdCAtPiBmbl9maWVsZC50eXBlID0gbG9va19haGVhZF90eXBlOworCSAgICAgIGxvb2tfYWhlYWRfdHlwZSA9IE5VTEw7CisJICAgIH0KKwkgIAorCSAgKCpwcCkrKzsKKwkgIHAgPSAqcHA7CisJICB3aGlsZSAoKnAgIT0gJzsnKQorCSAgICB7CisJICAgICAgcCsrOworCSAgICB9CisJICAKKwkgIC8qIElmIHRoaXMgaXMganVzdCBhIHN0dWIsIHRoZW4gd2UgZG9uJ3QgaGF2ZSB0aGUgcmVhbCBuYW1lIGhlcmUuICovCisKKwkgIGlmIChUWVBFX0ZMQUdTIChuZXdfc3VibGlzdCAtPiBmbl9maWVsZC50eXBlKSAmIFRZUEVfRkxBR19TVFVCKQorCSAgICB7CisJICAgICAgaWYgKCFUWVBFX0RPTUFJTl9UWVBFIChuZXdfc3VibGlzdCAtPiBmbl9maWVsZC50eXBlKSkKKwkJVFlQRV9ET01BSU5fVFlQRSAobmV3X3N1Ymxpc3QgLT4gZm5fZmllbGQudHlwZSkgPSB0eXBlOworCSAgICAgIG5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLmlzX3N0dWIgPSAxOworCSAgICB9CisJICBuZXdfc3VibGlzdCAtPiBmbl9maWVsZC5waHlzbmFtZSA9IHNhdmVzdHJpbmcgKCpwcCwgcCAtICpwcCk7CisJICAqcHAgPSBwICsgMTsKKwkgIAorCSAgLyogU2V0IHRoaXMgbWVtYmVyIGZ1bmN0aW9uJ3MgdmlzaWJpbGl0eSBmaWVsZHMuICAqLworCSAgc3dpdGNoICgqKCpwcCkrKykKKwkgICAgeworCSAgICAgIGNhc2UgVklTSUJJTElUWV9QUklWQVRFOgorCSAgICAgICAgbmV3X3N1Ymxpc3QgLT4gZm5fZmllbGQuaXNfcHJpdmF0ZSA9IDE7CisJCWJyZWFrOworCSAgICAgIGNhc2UgVklTSUJJTElUWV9QUk9URUNURUQ6CisJCW5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLmlzX3Byb3RlY3RlZCA9IDE7CisJCWJyZWFrOworCSAgICB9CisJICAKKwkgIFNUQUJTX0NPTlRJTlVFIChwcCwgb2JqZmlsZSk7CisJICBzd2l0Y2ggKCoqcHApCisJICAgIHsKKwkgICAgICBjYXNlICdBJzogLyogTm9ybWFsIGZ1bmN0aW9ucy4gKi8KKwkgICAgICAgIG5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLmlzX2NvbnN0ID0gMDsKKwkJbmV3X3N1Ymxpc3QgLT4gZm5fZmllbGQuaXNfdm9sYXRpbGUgPSAwOworCQkoKnBwKSsrOworCQlicmVhazsKKwkgICAgICBjYXNlICdCJzogLyogYGNvbnN0JyBtZW1iZXIgZnVuY3Rpb25zLiAqLworCQluZXdfc3VibGlzdCAtPiBmbl9maWVsZC5pc19jb25zdCA9IDE7CisJCW5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLmlzX3ZvbGF0aWxlID0gMDsKKwkJKCpwcCkrKzsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAnQyc6IC8qIGB2b2xhdGlsZScgbWVtYmVyIGZ1bmN0aW9uLiAqLworCQluZXdfc3VibGlzdCAtPiBmbl9maWVsZC5pc19jb25zdCA9IDA7CisJCW5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLmlzX3ZvbGF0aWxlID0gMTsKKwkJKCpwcCkrKzsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAnRCc6IC8qIGBjb25zdCB2b2xhdGlsZScgbWVtYmVyIGZ1bmN0aW9uLiAqLworCQluZXdfc3VibGlzdCAtPiBmbl9maWVsZC5pc19jb25zdCA9IDE7CisJCW5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLmlzX3ZvbGF0aWxlID0gMTsKKwkJKCpwcCkrKzsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAnKic6IC8qIEZpbGUgY29tcGlsZWQgd2l0aCBnKysgdmVyc2lvbiAxIC0tIG5vIGluZm8gKi8KKwkgICAgICBjYXNlICc/JzoKKwkgICAgICBjYXNlICcuJzoKKwkJYnJlYWs7CisJICAgICAgZGVmYXVsdDoKKwkJY29tcGxhaW4gKCZjb25zdF92b2xfY29tcGxhaW50LCAqKnBwKTsKKwkJYnJlYWs7CisJICAgIH0KKwkgIAorCSAgc3dpdGNoICgqKCpwcCkrKykKKwkgICAgeworCSAgICAgIGNhc2UgJyonOgorCSAgICAgIHsKKwkJaW50IG5iaXRzOworCSAgICAgICAgLyogdmlydHVhbCBtZW1iZXIgZnVuY3Rpb24sIGZvbGxvd2VkIGJ5IGluZGV4LgorCQkgICBUaGUgc2lnbiBiaXQgaXMgc2V0IHRvIGRpc3Rpbmd1aXNoIHBvaW50ZXJzLXRvLW1ldGhvZHMKKwkJICAgZnJvbSB2aXJ0dWFsIGZ1bmN0aW9uIGluZGljaWVzLiAgU2luY2UgdGhlIGFycmF5IGlzCisJCSAgIGluIHdvcmRzLCB0aGUgcXVhbnRpdHkgbXVzdCBiZSBzaGlmdGVkIGxlZnQgYnkgMQorCQkgICBvbiAxNiBiaXQgbWFjaGluZSwgYW5kIGJ5IDIgb24gMzIgYml0IG1hY2hpbmUsIGZvcmNpbmcKKwkJICAgdGhlIHNpZ24gYml0IG91dCwgYW5kIHVzYWJsZSBhcyBhIHZhbGlkIGluZGV4IGludG8KKwkJICAgdGhlIGFycmF5LiAgUmVtb3ZlIHRoZSBzaWduIGJpdCBoZXJlLiAgKi8KKwkgICAgICAgIG5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLnZvZmZzZXQgPQorCQkgICgweDdmZmZmZmZmICYgcmVhZF9odWdlX251bWJlciAocHAsICc7JywgJm5iaXRzKSkgKyAyOworCQlpZiAobmJpdHMgIT0gMCkKKwkJICByZXR1cm4gMDsKKwkgICAgICAKKwkJU1RBQlNfQ09OVElOVUUgKHBwLCBvYmpmaWxlKTsKKwkJaWYgKCoqcHAgPT0gJzsnIHx8ICoqcHAgPT0gJ1wwJykKKwkJICB7CisJCSAgICAvKiBNdXN0IGJlIGcrKyB2ZXJzaW9uIDEuICAqLworCQkgICAgbmV3X3N1Ymxpc3QgLT4gZm5fZmllbGQuZmNvbnRleHQgPSAwOworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIC8qIEZpZ3VyZSBvdXQgZnJvbSB3aGVuY2UgdGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNhbWUuCisJCSAgICAgICBJdCBtYXkgYmVsb25nIHRvIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgb2YKKwkJICAgICAgIG9uZSBvZiBpdHMgYmFzZWNsYXNzZXMuICAqLworCQkgICAgbG9va19haGVhZF90eXBlID0gcmVhZF90eXBlIChwcCwgb2JqZmlsZSk7CisJCSAgICBpZiAoKipwcCA9PSAnOicpCisJCSAgICAgIHsKKwkJCS8qIGcrKyB2ZXJzaW9uIDEgb3ZlcmxvYWRlZCBtZXRob2RzLiAqLworCQkgICAgICB9CisJCSAgICBlbHNlCisJCSAgICAgIHsKKwkJCW5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLmZjb250ZXh0ID0gbG9va19haGVhZF90eXBlOworCQkJaWYgKCoqcHAgIT0gJzsnKQorCQkJICB7CisJCQkgICAgcmV0dXJuIDA7CisJCQkgIH0KKwkJCWVsc2UKKwkJCSAgeworCQkJICAgICsrKnBwOworCQkJICB9CisJCQlsb29rX2FoZWFkX3R5cGUgPSBOVUxMOworCQkgICAgICB9CisJCSAgfQorCQlicmVhazsKKwkgICAgICB9CisJICAgICAgY2FzZSAnPyc6CisJCS8qIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24uICAqLworCQluZXdfc3VibGlzdCAtPiBmbl9maWVsZC52b2Zmc2V0ID0gVk9GRlNFVF9TVEFUSUM7CisJCWlmIChzdHJuY21wIChuZXdfc3VibGlzdCAtPiBmbl9maWVsZC5waHlzbmFtZSwKKwkJCSAgICAgbWFpbl9mbl9uYW1lLCBzdHJsZW4gKG1haW5fZm5fbmFtZSkpKQorCQkgIHsKKwkJICAgIG5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLmlzX3N0dWIgPSAxOworCQkgIH0KKwkJYnJlYWs7CisJICAgICAgCisJICAgICAgZGVmYXVsdDoKKwkJLyogZXJyb3IgKi8KKwkJY29tcGxhaW4gKCZtZW1iZXJfZm5fY29tcGxhaW50LCAoKnBwKVstMV0pOworCQkvKiBGYWxsIHRocm91Z2ggaW50byBub3JtYWwgbWVtYmVyIGZ1bmN0aW9uLiAgKi8KKwkgICAgICAKKwkgICAgICBjYXNlICcuJzoKKwkJLyogbm9ybWFsIG1lbWJlciBmdW5jdGlvbi4gICovCisJCW5ld19zdWJsaXN0IC0+IGZuX2ZpZWxkLnZvZmZzZXQgPSAwOworCQluZXdfc3VibGlzdCAtPiBmbl9maWVsZC5mY29udGV4dCA9IDA7CisJCWJyZWFrOworCSAgICB9CisJICAKKwkgIG5ld19zdWJsaXN0IC0+IG5leHQgPSBzdWJsaXN0OworCSAgc3VibGlzdCA9IG5ld19zdWJsaXN0OworCSAgbGVuZ3RoKys7CisJICBTVEFCU19DT05USU5VRSAocHAsIG9iamZpbGUpOworCX0KKyAgICAgIHdoaWxlICgqKnBwICE9ICc7JyAmJiAqKnBwICE9ICdcMCcpOworICAgICAgCisgICAgICAoKnBwKSsrOworICAgICAgCisgICAgICBuZXdfZm5saXN0IC0+IGZuX2ZpZWxkbGlzdC5mbl9maWVsZHMgPSAoc3RydWN0IGZuX2ZpZWxkICopCisJb2JzdGFja19hbGxvYyAoJm9iamZpbGUgLT4gdHlwZV9vYnN0YWNrLCAKKwkJICAgICAgIHNpemVvZiAoc3RydWN0IGZuX2ZpZWxkKSAqIGxlbmd0aCk7CisgICAgICBtZW1zZXQgKG5ld19mbmxpc3QgLT4gZm5fZmllbGRsaXN0LmZuX2ZpZWxkcywgMCwKKwkgICAgICBzaXplb2YgKHN0cnVjdCBmbl9maWVsZCkgKiBsZW5ndGgpOworICAgICAgZm9yIChpID0gbGVuZ3RoOyAoaS0tLCBzdWJsaXN0KTsgc3VibGlzdCA9IHN1Ymxpc3QgLT4gbmV4dCkKKwl7CisJICBuZXdfZm5saXN0IC0+IGZuX2ZpZWxkbGlzdC5mbl9maWVsZHNbaV0gPSBzdWJsaXN0IC0+IGZuX2ZpZWxkOworCX0KKyAgICAgIAorICAgICAgbmV3X2ZubGlzdCAtPiBmbl9maWVsZGxpc3QubGVuZ3RoID0gbGVuZ3RoOworICAgICAgbmV3X2ZubGlzdCAtPiBuZXh0ID0gZmlwIC0+IGZubGlzdDsKKyAgICAgIGZpcCAtPiBmbmxpc3QgPSBuZXdfZm5saXN0OworICAgICAgbmZuX2ZpZWxkcysrOworICAgICAgdG90YWxfbGVuZ3RoICs9IGxlbmd0aDsKKyAgICAgIFNUQUJTX0NPTlRJTlVFIChwcCwgb2JqZmlsZSk7CisgICAgfQorCisgIGlmIChuZm5fZmllbGRzKQorICAgIHsKKyAgICAgIEFMTE9DQVRFX0NQTFVTX1NUUlVDVF9UWVBFICh0eXBlKTsKKyAgICAgIFRZUEVfRk5fRklFTERMSVNUUyAodHlwZSkgPSAoc3RydWN0IGZuX2ZpZWxkbGlzdCAqKQorCVRZUEVfQUxMT0MgKHR5cGUsIHNpemVvZiAoc3RydWN0IGZuX2ZpZWxkbGlzdCkgKiBuZm5fZmllbGRzKTsKKyAgICAgIG1lbXNldCAoVFlQRV9GTl9GSUVMRExJU1RTICh0eXBlKSwgMCwKKwkgICAgICBzaXplb2YgKHN0cnVjdCBmbl9maWVsZGxpc3QpICogbmZuX2ZpZWxkcyk7CisgICAgICBUWVBFX05GTl9GSUVMRFMgKHR5cGUpID0gbmZuX2ZpZWxkczsKKyAgICAgIFRZUEVfTkZOX0ZJRUxEU19UT1RBTCAodHlwZSkgPSB0b3RhbF9sZW5ndGg7CisgICAgfQorCisgIHJldHVybiAxOworfQorCisvKiBTcGVjaWFsIEdOVSBDKysgbmFtZS4KKworICAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLiAgImZhaWx1cmUiIG1lYW5zIHRoYXQgd2UgY2FuJ3QKKyAgIGtlZXAgcGFyc2luZyBhbmQgaXQncyB0aW1lIGZvciBlcnJvcl90eXBlKCkuICAqLworCitzdGF0aWMgaW50CityZWFkX2NwcF9hYmJyZXYgKGZpcCwgcHAsIHR5cGUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBmaWVsZF9pbmZvICpmaXA7CisgICAgIGNoYXIgKipwcDsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICByZWdpc3RlciBjaGFyICpwOworICBjaGFyICpuYW1lOworICBjaGFyIGNwcF9hYmJyZXY7CisgIHN0cnVjdCB0eXBlICpjb250ZXh0OworCisgIHAgPSAqcHA7CisgIGlmICgqKytwID09ICd2JykKKyAgICB7CisgICAgICBuYW1lID0gTlVMTDsKKyAgICAgIGNwcF9hYmJyZXYgPSAqKytwOworCisgICAgICAqcHAgPSBwICsgMTsKKworICAgICAgLyogQXQgdGhpcyBwb2ludCwgKnBwIHBvaW50cyB0byBzb21ldGhpbmcgbGlrZSAiMjI6MjM9KjIyLi4uIiwKKwkgd2hlcmUgdGhlIHR5cGUgbnVtYmVyIGJlZm9yZSB0aGUgJzonIGlzIHRoZSAiY29udGV4dCIgYW5kCisJIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXMgYSByZWd1bGFyIHR5cGUgZGVmaW5pdGlvbi4gIExvb2t1cCB0aGUKKwkgdHlwZSwgZmluZCBpdCdzIG5hbWUsIGFuZCBjb25zdHJ1Y3QgdGhlIGZpZWxkIG5hbWUuICovCisKKyAgICAgIGNvbnRleHQgPSByZWFkX3R5cGUgKHBwLCBvYmpmaWxlKTsKKworICAgICAgc3dpdGNoIChjcHBfYWJicmV2KQorCXsKKwkgIGNhc2UgJ2YnOgkJLyogJHZmIC0tIGEgdmlydHVhbCBmdW5jdGlvbiB0YWJsZSBwb2ludGVyICovCisJICAgIGZpcC0+bGlzdC0+ZmllbGQubmFtZSA9CisJICAgICAgb2Jjb25jYXQgKCZvYmpmaWxlLT50eXBlX29ic3RhY2ssIHZwdHJfbmFtZSwgIiIsICIiKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgJ2InOgkJLyogJHZiIC0tIGEgdmlydHVhbCBic29tZXRoaW5nb3JvdGhlciAqLworCSAgICBuYW1lID0gdHlwZV9uYW1lX25vX3RhZyAoY29udGV4dCk7CisJICAgIGlmIChuYW1lID09IE5VTEwpCisJICAgICAgeworCQljb21wbGFpbiAoJmludmFsaWRfY3BwX3R5cGVfY29tcGxhaW50LCBzeW1udW0pOworCQluYW1lID0gIkZPTyI7CisJICAgICAgfQorCSAgICBmaXAtPmxpc3QtPmZpZWxkLm5hbWUgPQorCSAgICAgIG9iY29uY2F0ICgmb2JqZmlsZS0+dHlwZV9vYnN0YWNrLCB2Yl9uYW1lLCBuYW1lLCAiIik7CisJICAgIGJyZWFrOworCisJICBkZWZhdWx0OgorCSAgICBjb21wbGFpbiAoJmludmFsaWRfY3BwX2FiYnJldl9jb21wbGFpbnQsICpwcCk7CisJICAgIGZpcC0+bGlzdC0+ZmllbGQubmFtZSA9CisJICAgICAgb2Jjb25jYXQgKCZvYmpmaWxlLT50eXBlX29ic3RhY2ssCisJCQkiSU5WQUxJRF9DUExVU1BMVVNfQUJCUkVWIiwgIiIsICIiKTsKKwkgICAgYnJlYWs7CisJfQorCisgICAgICAvKiBBdCB0aGlzIHBvaW50LCAqcHAgcG9pbnRzIHRvIHRoZSAnOicuICBTa2lwIGl0IGFuZCByZWFkIHRoZQorCSBmaWVsZCB0eXBlLiAqLworCisgICAgICBwID0gKysoKnBwKTsKKyAgICAgIGlmIChwWy0xXSAhPSAnOicpCisJeworCSAgY29tcGxhaW4gKCZpbnZhbGlkX2NwcF9hYmJyZXZfY29tcGxhaW50LCAqcHApOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgZmlwLT5saXN0LT5maWVsZC50eXBlID0gcmVhZF90eXBlIChwcCwgb2JqZmlsZSk7CisgICAgICBpZiAoKipwcCA9PSAnLCcpCisJKCpwcCkrKzsJCQkvKiBTa2lwIHRoZSBjb21tYS4gICovCisgICAgICBlbHNlCisJcmV0dXJuIDA7CisKKyAgICAgIHsKKwlpbnQgbmJpdHM7CisJRklFTERfQklUUE9TIChmaXAtPmxpc3QtPmZpZWxkKSA9IHJlYWRfaHVnZV9udW1iZXIgKHBwLCAnOycsICZuYml0cyk7CisJaWYgKG5iaXRzICE9IDApCisJICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIC8qIFRoaXMgZmllbGQgaXMgdW5wYWNrZWQuICAqLworICAgICAgRklFTERfQklUU0laRSAoZmlwLT5saXN0LT5maWVsZCkgPSAwOworICAgICAgZmlwLT5saXN0LT52aXNpYmlsaXR5ID0gVklTSUJJTElUWV9QUklWQVRFOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbXBsYWluICgmaW52YWxpZF9jcHBfYWJicmV2X2NvbXBsYWludCwgKnBwKTsKKyAgICAgIC8qIFdlIGhhdmUgbm8gaWRlYSB3aGF0IHN5bnRheCBhbiB1bnJlY29nbml6ZWQgYWJicmV2IHdvdWxkIGhhdmUsIHNvCisJIGJldHRlciByZXR1cm4gMC4gIElmIHdlIHJldHVybmVkIDEsIHdlIHdvdWxkIG5lZWQgdG8gYXQgbGVhc3QgYWR2YW5jZQorCSAqcHAgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcC4gICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorcmVhZF9vbmVfc3RydWN0X2ZpZWxkIChmaXAsIHBwLCBwLCB0eXBlLCBvYmpmaWxlKQorICAgICBzdHJ1Y3QgZmllbGRfaW5mbyAqZmlwOworICAgICBjaGFyICoqcHA7CisgICAgIGNoYXIgKnA7CisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgLyogVGhlIGZvbGxvd2luZyBpcyBjb2RlIHRvIHdvcmsgYXJvdW5kIGNmcm9udCBnZW5lcmF0ZWQgc3RhYnMuCisgICAgIFRoZSBzdGFicyBjb250YWlucyBmdWxsIG1hbmdsZWQgbmFtZSBmb3IgZWFjaCBmaWVsZC4KKyAgICAgV2UgdHJ5IHRvIGRlbWFuZ2xlIHRoZSBuYW1lIGFuZCBleHRyYWN0IHRoZSBmaWVsZCBuYW1lIG91dCBvZiBpdC4KKyAgKi8KKyAgaWYgKEFSTV9ERU1BTkdMSU5HICYmIGN1cnJlbnRfc3ViZmlsZS0+bGFuZ3VhZ2UgPT0gbGFuZ3VhZ2VfY3BsdXMpCisgICAgeworICAgICAgY2hhciBzYXZlX3A7CisgICAgICBjaGFyICpkZW0sICpkZW1fcDsKKyAgICAgIHNhdmVfcCA9ICpwOworICAgICAgKnAgPSAnXDAnOworICAgICAgZGVtID0gY3BsdXNfZGVtYW5nbGUgKCpwcCwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOworICAgICAgaWYgKGRlbSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZGVtX3AgPSBzdHJyY2hyIChkZW0sICc6Jyk7CisgICAgICAgICAgaWYgKGRlbV9wICE9IDAgJiYgKihkZW1fcC0xKT09JzonKQorICAgICAgICAgICAgZGVtX3ArKzsKKyAgICAgICAgICBGSUVMRF9OQU1FIChmaXAtPmxpc3QtPmZpZWxkKSA9CisgICAgICAgICAgICBvYnNhdmVzdHJpbmcgKGRlbV9wLCBzdHJsZW4gKGRlbV9wKSwgJm9iamZpbGUgLT4gdHlwZV9vYnN0YWNrKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgRklFTERfTkFNRSAoZmlwLT5saXN0LT5maWVsZCkgPQorICAgICAgICAgICAgb2JzYXZlc3RyaW5nICgqcHAsIHAgLSAqcHAsICZvYmpmaWxlIC0+IHR5cGVfb2JzdGFjayk7CisgICAgICAgIH0KKyAgICAgICpwID0gc2F2ZV9wOworICAgIH0KKyAgLyogZW5kIG9mIGNvZGUgZm9yIGNmcm9udCB3b3JrIGFyb3VuZCAqLworCisgIGVsc2UKKyAgICBmaXAgLT4gbGlzdCAtPiBmaWVsZC5uYW1lID0KKyAgICBvYnNhdmVzdHJpbmcgKCpwcCwgcCAtICpwcCwgJm9iamZpbGUgLT4gdHlwZV9vYnN0YWNrKTsKKyAgKnBwID0gcCArIDE7CisKKyAgLyogVGhpcyBtZWFucyB3ZSBoYXZlIGEgdmlzaWJpbGl0eSBmb3IgYSBmaWVsZCBjb21pbmcuICovCisgIGlmICgqKnBwID09ICcvJykKKyAgICB7CisgICAgICAoKnBwKSsrOworICAgICAgZmlwIC0+IGxpc3QgLT4gdmlzaWJpbGl0eSA9ICooKnBwKSsrOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIG5vcm1hbCBkYngtc3R5bGUgZm9ybWF0LCBubyBleHBsaWNpdCB2aXNpYmlsaXR5ICovCisgICAgICBmaXAgLT4gbGlzdCAtPiB2aXNpYmlsaXR5ID0gVklTSUJJTElUWV9QVUJMSUM7CisgICAgfQorCisgIGZpcCAtPiBsaXN0IC0+IGZpZWxkLnR5cGUgPSByZWFkX3R5cGUgKHBwLCBvYmpmaWxlKTsKKyAgaWYgKCoqcHAgPT0gJzonKQorICAgIHsKKyAgICAgIHAgPSArKygqcHApOworI2lmIDAKKyAgICAgIC8qIFBvc3NpYmxlIGZ1dHVyZSBob29rIGZvciBuZXN0ZWQgdHlwZXMuICovCisgICAgICBpZiAoKipwcCA9PSAnIScpCisJeworCSAgZmlwIC0+IGxpc3QgLT4gZmllbGQuYml0cG9zID0gKGxvbmcpLTI7IC8qIG5lc3RlZCB0eXBlICovCisJICBwID0gKysoKnBwKTsKKwl9CisgICAgICBlbHNlIC4uLjsKKyNlbmRpZgorICAgICAgd2hpbGUgKCpwICE9ICc7JykgCisJeworCSAgcCsrOworCX0KKyAgICAgIC8qIFN0YXRpYyBjbGFzcyBtZW1iZXIuICAqLworICAgICAgU0VUX0ZJRUxEX1BIWVNOQU1FIChmaXAtPmxpc3QtPmZpZWxkLCBzYXZlc3RyaW5nICgqcHAsIHAgLSAqcHApKTsKKyAgICAgICpwcCA9IHAgKyAxOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZSBpZiAoKipwcCAhPSAnLCcpCisgICAgeworICAgICAgLyogQmFkIHN0cnVjdHVyZS10eXBlIGZvcm1hdC4gICovCisgICAgICBjb21wbGFpbiAoJnN0YWJzX2dlbmVyYWxfY29tcGxhaW50LCAiYmFkIHN0cnVjdHVyZS10eXBlIGZvcm1hdCIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAoKnBwKSsrOwkJCS8qIFNraXAgdGhlIGNvbW1hLiAgKi8KKworICB7CisgICAgaW50IG5iaXRzOworICAgIEZJRUxEX0JJVFBPUyAoZmlwLT5saXN0LT5maWVsZCkgPSByZWFkX2h1Z2VfbnVtYmVyIChwcCwgJywnLCAmbmJpdHMpOworICAgIGlmIChuYml0cyAhPSAwKQorICAgICAgeworCWNvbXBsYWluICgmc3RhYnNfZ2VuZXJhbF9jb21wbGFpbnQsICJiYWQgc3RydWN0dXJlLXR5cGUgZm9ybWF0Iik7CisJcmV0dXJuOworICAgICAgfQorICAgIEZJRUxEX0JJVFNJWkUgKGZpcC0+bGlzdC0+ZmllbGQpID0gcmVhZF9odWdlX251bWJlciAocHAsICc7JywgJm5iaXRzKTsKKyAgICBpZiAobmJpdHMgIT0gMCkKKyAgICAgIHsKKwljb21wbGFpbiAoJnN0YWJzX2dlbmVyYWxfY29tcGxhaW50LCAiYmFkIHN0cnVjdHVyZS10eXBlIGZvcm1hdCIpOworCXJldHVybjsKKyAgICAgIH0KKyAgfQorCisgIGlmIChGSUVMRF9CSVRQT1MgKGZpcC0+bGlzdC0+ZmllbGQpID09IDAKKyAgICAgICYmIEZJRUxEX0JJVFNJWkUgKGZpcC0+bGlzdC0+ZmllbGQpID09IDApCisgICAgeworICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIGluIHR3byBjYXNlczogKDEpIGF0IGxlYXN0IGZvciBnY2MgMi40LjUgb3Igc28sCisJIGl0IGlzIGEgZmllbGQgd2hpY2ggaGFzIGJlZW4gb3B0aW1pemVkIG91dC4gIFRoZSBjb3JyZWN0IHN0YWIgZm9yCisJIHRoaXMgY2FzZSBpcyB0byB1c2UgVklTSUJJTElUWV9JR05PUkUsIGJ1dCB0aGF0IGlzIGEgcmVjZW50CisJIGludmVudGlvbi4gICgyKSBJdCBpcyBhIDAtc2l6ZSBhcnJheS4gIEZvciBleGFtcGxlCisJIHVuaW9uIHsgaW50IG51bTsgY2hhciBzdHJbMF07IH0gZm9vLiAgUHJpbnRpbmcgIjxubyB2YWx1ZT4iIGZvcgorCSBzdHIgaW4gInAgZm9vIiBpcyBPSywgc2luY2UgZm9vLnN0ciAoYW5kIHRodXMgZm9vLnN0clszXSkKKwkgd2lsbCBjb250aW51ZSB0byB3b3JrLCBhbmQgYSAwLXNpemUgYXJyYXkgYXMgYSB3aG9sZSBkb2Vzbid0CisJIGhhdmUgYW55IGNvbnRlbnRzIHRvIHByaW50LgorCisJIEkgc3VzcGVjdCB0aGlzIHByb2JhYmx5IGNvdWxkIGFsc28gaGFwcGVuIHdpdGggZ2NjIC1nc3RhYnMgKG5vdAorCSAtZ3N0YWJzKykgZm9yIHN0YXRpYyBmaWVsZHMsIGFuZCBwZXJoYXBzIG90aGVyIEMrKyBleHRlbnNpb25zLgorCSBIb3BlZnVsbHkgZmV3IHBlb3BsZSB1c2UgLWdzdGFicyB3aXRoIGdkYiwgc2luY2UgaXQgaXMgaW50ZW5kZWQKKwkgZm9yIGRieCBjb21wYXRpYmlsaXR5LiAgKi8KKworICAgICAgLyogSWdub3JlIHRoaXMgZmllbGQuICAqLworICAgICAgZmlwIC0+IGxpc3QtPiB2aXNpYmlsaXR5ID0gVklTSUJJTElUWV9JR05PUkU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogRGV0ZWN0IGFuIHVucGFja2VkIGZpZWxkIGFuZCBtYXJrIGl0IGFzIHN1Y2guCisJIGRieCBnaXZlcyBhIGJpdCBzaXplIGZvciBhbGwgZmllbGRzLgorCSBOb3RlIHRoYXQgZm9yd2FyZCByZWZzIGNhbm5vdCBiZSBwYWNrZWQsCisJIGFuZCB0cmVhdCBlbnVtcyBhcyBpZiB0aGV5IGhhZCB0aGUgd2lkdGggb2YgaW50cy4gICovCisKKyAgICAgIHN0cnVjdCB0eXBlICpmaWVsZF90eXBlID0gY2hlY2tfdHlwZWRlZiAoRklFTERfVFlQRSAoZmlwLT5saXN0LT5maWVsZCkpOworCisgICAgICBpZiAoVFlQRV9DT0RFIChmaWVsZF90eXBlKSAhPSBUWVBFX0NPREVfSU5UCisJICAmJiBUWVBFX0NPREUgKGZpZWxkX3R5cGUpICE9IFRZUEVfQ09ERV9SQU5HRQorCSAgJiYgVFlQRV9DT0RFIChmaWVsZF90eXBlKSAhPSBUWVBFX0NPREVfQk9PTAorCSAgJiYgVFlQRV9DT0RFIChmaWVsZF90eXBlKSAhPSBUWVBFX0NPREVfRU5VTSkKKwl7CisJICBGSUVMRF9CSVRTSVpFIChmaXAtPmxpc3QtPmZpZWxkKSA9IDA7CisJfQorICAgICAgaWYgKChGSUVMRF9CSVRTSVpFIChmaXAtPmxpc3QtPmZpZWxkKSAKKwkgICA9PSBUQVJHRVRfQ0hBUl9CSVQgKiBUWVBFX0xFTkdUSCAoZmllbGRfdHlwZSkKKwkgICB8fCAoVFlQRV9DT0RFIChmaWVsZF90eXBlKSA9PSBUWVBFX0NPREVfRU5VTQorCSAgICAgICAmJiBGSUVMRF9CSVRTSVpFIChmaXAtPmxpc3QtPmZpZWxkKSA9PSBUQVJHRVRfSU5UX0JJVCApCisJICAgKQorCSAgJiYKKwkgIEZJRUxEX0JJVFBPUyAoZmlwLT5saXN0LT5maWVsZCkgJSA4ID09IDApCisJeworCSAgRklFTERfQklUU0laRSAoZmlwLT5saXN0LT5maWVsZCkgPSAwOworCX0KKyAgICB9Cit9CisKKworLyogUmVhZCBzdHJ1Y3Qgb3IgY2xhc3MgZGF0YSBmaWVsZHMuICBUaGV5IGhhdmUgdGhlIGZvcm06CisKKyAgIAlOQU1FIDogW1ZJU0lCSUxJVFldIFRZUEVOVU0gLCBCSVRQT1MgLCBCSVRTSVpFIDsKKworICAgQXQgdGhlIGVuZCwgd2Ugc2VlIGEgc2VtaWNvbG9uIGluc3RlYWQgb2YgYSBmaWVsZC4KKworICAgSW4gQysrLCB0aGlzIG1heSB3aW5kIHVwIGJlaW5nIE5BTUU6P1RZUEVOVU06UEhZU05BTUU7IGZvcgorICAgYSBzdGF0aWMgZmllbGQuCisKKyAgIFRoZSBvcHRpb25hbCBWSVNJQklMSVRZIGlzIG9uZSBvZjoKKworICAgCScvMCcJKFZJU0lCSUxJVFlfUFJJVkFURSkKKwknLzEnCShWSVNJQklMSVRZX1BST1RFQ1RFRCkKKwknLzInCShWSVNJQklMSVRZX1BVQkxJQykKKwknLzknCShWSVNJQklMSVRZX0lHTk9SRSkKKworICAgb3Igbm90aGluZywgZm9yIEMgc3R5bGUgZmllbGRzIHdpdGggcHVibGljIHZpc2liaWxpdHkuCisKKyAgIFJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4gICovCisKK3N0YXRpYyBpbnQKK3JlYWRfc3RydWN0X2ZpZWxkcyAoZmlwLCBwcCwgdHlwZSwgb2JqZmlsZSkKKyAgICAgc3RydWN0IGZpZWxkX2luZm8gKmZpcDsKKyAgICAgY2hhciAqKnBwOworICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKnA7CisgIHN0cnVjdCBuZXh0ZmllbGQgKm5ldzsKKworICAvKiBXZSBiZXR0ZXIgc2V0IHAgcmlnaHQgbm93LCBpbiBjYXNlIHRoZXJlIGFyZSBubyBmaWVsZHMgYXQgYWxsLi4uICAgICovCisKKyAgcCA9ICpwcDsKKworICAvKiBSZWFkIGVhY2ggZGF0YSBtZW1iZXIgdHlwZSB1bnRpbCB3ZSBmaW5kIHRoZSB0ZXJtaW5hdGluZyAnOycgYXQgdGhlIGVuZCBvZgorICAgICB0aGUgZGF0YSBtZW1iZXIgbGlzdCwgb3IgYnJlYWsgZm9yIHNvbWUgb3RoZXIgcmVhc29uIHN1Y2ggYXMgZmluZGluZyB0aGUKKyAgICAgc3RhcnQgb2YgdGhlIG1lbWJlciBmdW5jdGlvbiBsaXN0LiAqLworCisgIHdoaWxlICgqKnBwICE9ICc7JykKKyAgICB7CisgICAgICBpZiAob3M5a19zdGFicyAmJiAqKnBwID09ICcsJykgYnJlYWs7CisgICAgICBTVEFCU19DT05USU5VRSAocHAsIG9iamZpbGUpOworICAgICAgLyogR2V0IHNwYWNlIHRvIHJlY29yZCB0aGUgbmV4dCBmaWVsZCdzIGRhdGEuICAqLworICAgICAgbmV3ID0gKHN0cnVjdCBuZXh0ZmllbGQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbmV4dGZpZWxkKSk7CisgICAgICBtYWtlX2NsZWFudXAgKGZyZWUsIG5ldyk7CisgICAgICBtZW1zZXQgKG5ldywgMCwgc2l6ZW9mIChzdHJ1Y3QgbmV4dGZpZWxkKSk7CisgICAgICBuZXcgLT4gbmV4dCA9IGZpcCAtPiBsaXN0OworICAgICAgZmlwIC0+IGxpc3QgPSBuZXc7CisKKyAgICAgIC8qIEdldCB0aGUgZmllbGQgbmFtZS4gICovCisgICAgICBwID0gKnBwOworCisgICAgICAvKiBJZiBpcyBzdGFydHMgd2l0aCBDUExVU19NQVJLRVIgaXQgaXMgYSBzcGVjaWFsIGFiYnJldmlhdGlvbiwKKwkgdW5sZXNzIHRoZSBDUExVU19NQVJLRVIgaXMgZm9sbG93ZWQgYnkgYW4gdW5kZXJzY29yZSwgaW4KKwkgd2hpY2ggY2FzZSBpdCBpcyBqdXN0IHRoZSBuYW1lIG9mIGFuIGFub255bW91cyB0eXBlLCB3aGljaCB3ZQorCSBzaG91bGQgaGFuZGxlIGxpa2UgYW55IG90aGVyIHR5cGUgbmFtZS4gICovCisKKyAgICAgIGlmIChpc19jcGx1c19tYXJrZXIgKHBbMF0pICYmIHBbMV0gIT0gJ18nKQorCXsKKwkgIGlmICghcmVhZF9jcHBfYWJicmV2IChmaXAsIHBwLCB0eXBlLCBvYmpmaWxlKSkKKwkgICAgcmV0dXJuIDA7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIExvb2sgZm9yIHRoZSAnOicgdGhhdCBzZXBhcmF0ZXMgdGhlIGZpZWxkIG5hbWUgZnJvbSB0aGUgZmllbGQKKwkgdmFsdWVzLiAgRGF0YSBtZW1iZXJzIGFyZSBkZWxpbWl0ZWQgYnkgYSBzaW5nbGUgJzonLCB3aGlsZSBtZW1iZXIKKwkgZnVuY3Rpb25zIGFyZSBkZWxpbWl0ZWQgYnkgYSBwYWlyIG9mICc6J3MuICBXaGVuIHdlIGhpdCB0aGUgbWVtYmVyCisJIGZ1bmN0aW9ucyAoaWYgYW55KSwgdGVybWluYXRlIHNjYW4gbG9vcCBhbmQgcmV0dXJuLiAqLworCisgICAgICB3aGlsZSAoKnAgIT0gJzonICYmICpwICE9ICdcMCcpIAorCXsKKwkgIHArKzsKKwl9CisgICAgICBpZiAoKnAgPT0gJ1wwJykKKwlyZXR1cm4gMDsKKworICAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgaGl0IHRoZSBtZW1iZXIgZnVuY3Rpb25zIHlldC4gICovCisgICAgICBpZiAocFsxXSA9PSAnOicpCisJeworCSAgYnJlYWs7CisJfQorICAgICAgcmVhZF9vbmVfc3RydWN0X2ZpZWxkIChmaXAsIHBwLCBwLCB0eXBlLCBvYmpmaWxlKTsKKyAgICB9CisgIGlmIChwWzBdID09ICc6JyAmJiBwWzFdID09ICc6JykKKyAgICB7CisgICAgICAvKiBjaGlsbCB0aGUgbGlzdCBvZiBmaWVsZHM6IHRoZSBsYXN0IGVudHJ5IChhdCB0aGUgaGVhZCkgaXMgYQorCSBwYXJ0aWFsbHkgY29uc3RydWN0ZWQgZW50cnkgd2hpY2ggd2Ugbm93IHNjcnViLiAqLworICAgICAgZmlwIC0+IGxpc3QgPSBmaXAgLT4gbGlzdCAtPiBuZXh0OworICAgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qIFRoZSBzdGFicyBmb3IgQysrIGRlcml2ZWQgY2xhc3NlcyBjb250YWluIGJhc2VjbGFzcyBpbmZvcm1hdGlvbiB3aGljaAorICAgaXMgbWFya2VkIGJ5IGEgJyEnIGNoYXJhY3RlciBhZnRlciB0aGUgdG90YWwgc2l6ZS4gIFRoaXMgZnVuY3Rpb24gaXMKKyAgIGNhbGxlZCB3aGVuIHdlIGVuY291bnRlciB0aGUgYmFzZWNsYXNzIG1hcmtlciwgYW5kIHNsdXJwcyB1cCBhbGwgdGhlCisgICBiYXNlY2xhc3MgaW5mb3JtYXRpb24uCisKKyAgIEltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgJyEnIG1hcmtlciBpcyB0aGUgbnVtYmVyIG9mIGJhc2UgY2xhc3NlcyB0aGF0CisgICB0aGUgY2xhc3MgaXMgZGVyaXZlZCBmcm9tLCBmb2xsb3dlZCBieSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBiYXNlIGNsYXNzLgorICAgRm9yIGVhY2ggYmFzZSBjbGFzcywgdGhlcmUgYXJlIHR3byB2aXNpYmlsaXR5IHNwZWNpZmllcnMsIGEgYml0IG9mZnNldAorICAgdG8gdGhlIGJhc2UgY2xhc3MgaW5mb3JtYXRpb24gd2l0aGluIHRoZSBkZXJpdmVkIGNsYXNzLCBhIHJlZmVyZW5jZSB0bworICAgdGhlIHR5cGUgZm9yIHRoZSBiYXNlIGNsYXNzLCBhbmQgYSB0ZXJtaW5hdGluZyBzZW1pY29sb24uCisKKyAgIEEgdHlwaWNhbCBleGFtcGxlLCB3aXRoIHR3byBiYXNlIGNsYXNzZXMsIHdvdWxkIGJlICIhMiwwMjAsMTk7MDI2NCwyMTsiLgorICAgCQkJCQkJICAgICAgIF5eIF4gXiBeICBeIF4gIF4KKwlCYXNlY2xhc3MgaW5mb3JtYXRpb24gbWFya2VyIF9fX19fX19fX19fX19fX19fX3x8IHwgfCB8ICB8IHwgIHwKKwlOdW1iZXIgb2YgYmFzZWNsYXNzZXMgX19fX19fX19fX19fX19fX19fX19fX19fX198IHwgfCB8ICB8IHwgIHwKKwlWaXNpYmlsaXR5IHNwZWNpZmllcnMgKDIpIF9fX19fX19fX19fX19fX19fX19fX19fX3wgfCB8ICB8IHwgIHwKKwlPZmZzZXQgaW4gYml0cyBmcm9tIHN0YXJ0IG9mIGNsYXNzIF9fX19fX19fX19fX19fX19ffCB8ICB8IHwgIHwKKwlUeXBlIG51bWJlciBmb3IgYmFzZSBjbGFzcyBfX19fX19fX19fX19fX19fX19fX19fX19fX198ICB8IHwgIHwKKwlWaXNpYmlsaXR5IHNwZWNpZmllcnMgKDIpIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198IHwgIHwKKwlPZmZzZXQgaW4gYml0cyBmcm9tIHN0YXJ0IG9mIGNsYXNzIF9fX19fX19fX19fX19fX19fX19fX19fX3wgIHwKKwlUeXBlIG51bWJlciBvZiBiYXNlIGNsYXNzIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKworICBSZXR1cm4gMSBmb3Igc3VjY2VzcywgMCBmb3IgKGVycm9yLXR5cGUtaW5kdWNpbmcpIGZhaWx1cmUuICAqLworCitzdGF0aWMgaW50CityZWFkX2Jhc2VjbGFzc2VzIChmaXAsIHBwLCB0eXBlLCBvYmpmaWxlKQorICAgICBzdHJ1Y3QgZmllbGRfaW5mbyAqZmlwOworICAgICBjaGFyICoqcHA7CisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaW50IGk7CisgIHN0cnVjdCBuZXh0ZmllbGQgKm5ldzsKKworICBpZiAoKipwcCAhPSAnIScpCisgICAgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogU2tpcCB0aGUgJyEnIGJhc2VjbGFzcyBpbmZvcm1hdGlvbiBtYXJrZXIuICovCisgICAgICAoKnBwKSsrOworICAgIH0KKworICBBTExPQ0FURV9DUExVU19TVFJVQ1RfVFlQRSAodHlwZSk7CisgIHsKKyAgICBpbnQgbmJpdHM7CisgICAgVFlQRV9OX0JBU0VDTEFTU0VTICh0eXBlKSA9IHJlYWRfaHVnZV9udW1iZXIgKHBwLCAnLCcsICZuYml0cyk7CisgICAgaWYgKG5iaXRzICE9IDApCisgICAgICByZXR1cm4gMDsKKyAgfQorCisjaWYgMAorICAvKiBTb21lIHN0dXBpZCBjb21waWxlcnMgaGF2ZSB0cm91YmxlIHdpdGggdGhlIGZvbGxvd2luZywgc28gYnJlYWsKKyAgICAgaXQgdXAgaW50byBzaW1wbGVyIGV4cHJlc3Npb25zLiAgKi8KKyAgVFlQRV9GSUVMRF9WSVJUVUFMX0JJVFMgKHR5cGUpID0gKEJfVFlQRSAqKQorICAgIFRZUEVfQUxMT0MgKHR5cGUsIEJfQllURVMgKFRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSkpKTsKKyNlbHNlCisgIHsKKyAgICBpbnQgbnVtX2J5dGVzID0gQl9CWVRFUyAoVFlQRV9OX0JBU0VDTEFTU0VTICh0eXBlKSk7CisgICAgY2hhciAqcG9pbnRlcjsKKworICAgIHBvaW50ZXIgPSAoY2hhciAqKSBUWVBFX0FMTE9DICh0eXBlLCBudW1fYnl0ZXMpOworICAgIFRZUEVfRklFTERfVklSVFVBTF9CSVRTICh0eXBlKSA9IChCX1RZUEUgKikgcG9pbnRlcjsKKyAgfQorI2VuZGlmIC8qIDAgKi8KKworICBCX0NMUkFMTCAoVFlQRV9GSUVMRF9WSVJUVUFMX0JJVFMgKHR5cGUpLCBUWVBFX05fQkFTRUNMQVNTRVMgKHR5cGUpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgVFlQRV9OX0JBU0VDTEFTU0VTICh0eXBlKTsgaSsrKQorICAgIHsKKyAgICAgIG5ldyA9IChzdHJ1Y3QgbmV4dGZpZWxkICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG5leHRmaWVsZCkpOworICAgICAgbWFrZV9jbGVhbnVwIChmcmVlLCBuZXcpOworICAgICAgbWVtc2V0IChuZXcsIDAsIHNpemVvZiAoc3RydWN0IG5leHRmaWVsZCkpOworICAgICAgbmV3IC0+IG5leHQgPSBmaXAgLT4gbGlzdDsKKyAgICAgIGZpcCAtPiBsaXN0ID0gbmV3OworICAgICAgRklFTERfQklUU0laRSAobmV3LT5maWVsZCkgPSAwOwkvKiB0aGlzIHNob3VsZCBiZSBhbiB1bnBhY2tlZCBmaWVsZCEgKi8KKworICAgICAgU1RBQlNfQ09OVElOVUUgKHBwLCBvYmpmaWxlKTsKKyAgICAgIHN3aXRjaCAoKipwcCkKKwl7CisJICBjYXNlICcwJzoKKwkgICAgLyogTm90aGluZyB0byBkby4gKi8KKwkgICAgYnJlYWs7CisJICBjYXNlICcxJzoKKwkgICAgU0VUX1RZUEVfRklFTERfVklSVFVBTCAodHlwZSwgaSk7CisJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkgICAgLyogVW5rbm93biBjaGFyYWN0ZXIuICBDb21wbGFpbiBhbmQgdHJlYXQgaXQgYXMgbm9uLXZpcnR1YWwuICAqLworCSAgICB7CisJICAgICAgc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgbXNnID0geworCQkiVW5rbm93biB2aXJ0dWFsIGNoYXJhY3RlciBgJWMnIGZvciBiYXNlY2xhc3MiLCAwLCAwfTsKKwkgICAgICBjb21wbGFpbiAoJm1zZywgKipwcCk7CisJICAgIH0KKwl9CisgICAgICArKygqcHApOworCisgICAgICBuZXcgLT4gdmlzaWJpbGl0eSA9ICooKnBwKSsrOworICAgICAgc3dpdGNoIChuZXcgLT4gdmlzaWJpbGl0eSkKKwl7CisJICBjYXNlIFZJU0lCSUxJVFlfUFJJVkFURToKKwkgIGNhc2UgVklTSUJJTElUWV9QUk9URUNURUQ6CisJICBjYXNlIFZJU0lCSUxJVFlfUFVCTElDOgorCSAgICBicmVhazsKKwkgIGRlZmF1bHQ6CisJICAgIC8qIEJhZCB2aXNpYmlsaXR5IGZvcm1hdC4gIENvbXBsYWluIGFuZCB0cmVhdCBpdCBhcworCSAgICAgICBwdWJsaWMuICAqLworCSAgICB7CisJICAgICAgc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgbXNnID0geworCQkiVW5rbm93biB2aXNpYmlsaXR5IGAlYycgZm9yIGJhc2VjbGFzcyIsIDAsIDB9OworCSAgICAgIGNvbXBsYWluICgmbXNnLCBuZXcgLT4gdmlzaWJpbGl0eSk7CisJICAgICAgbmV3IC0+IHZpc2liaWxpdHkgPSBWSVNJQklMSVRZX1BVQkxJQzsKKwkgICAgfQorCX0KKworICAgICAgeworCWludCBuYml0czsKKwkKKwkvKiBUaGUgcmVtYWluaW5nIHZhbHVlIGlzIHRoZSBiaXQgb2Zmc2V0IG9mIHRoZSBwb3J0aW9uIG9mIHRoZSBvYmplY3QKKwkgICBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYmFzZWNsYXNzLiAgQWx3YXlzIHplcm8gaW4gdGhlIGFic2VuY2Ugb2YKKwkgICBtdWx0aXBsZSBpbmhlcml0YW5jZS4gICovCisKKwlGSUVMRF9CSVRQT1MgKG5ldy0+ZmllbGQpID0gcmVhZF9odWdlX251bWJlciAocHAsICcsJywgJm5iaXRzKTsKKwlpZiAobmJpdHMgIT0gMCkKKwkgIHJldHVybiAwOworICAgICAgfQorCisgICAgICAvKiBUaGUgbGFzdCBwaWVjZSBvZiBiYXNlY2xhc3MgaW5mb3JtYXRpb24gaXMgdGhlIHR5cGUgb2YgdGhlCisJIGJhc2UgY2xhc3MuICBSZWFkIGl0LCBhbmQgcmVtZW1iZXIgaXQncyB0eXBlIG5hbWUgYXMgdGhpcworCSBmaWVsZCdzIG5hbWUuICovCisKKyAgICAgIG5ldyAtPiBmaWVsZC50eXBlID0gcmVhZF90eXBlIChwcCwgb2JqZmlsZSk7CisgICAgICBuZXcgLT4gZmllbGQubmFtZSA9IHR5cGVfbmFtZV9ub190YWcgKG5ldyAtPiBmaWVsZC50eXBlKTsKKworICAgICAgLyogc2tpcCB0cmFpbGluZyAnOycgYW5kIGJ1bXAgY291bnQgb2YgbnVtYmVyIG9mIGZpZWxkcyBzZWVuICovCisgICAgICBpZiAoKipwcCA9PSAnOycpCisJKCpwcCkrKzsKKyAgICAgIGVsc2UKKwlyZXR1cm4gMDsKKyAgICB9CisgIHJldHVybiAxOworfQorCisvKiBUaGUgdGFpbCBlbmQgb2Ygc3RhYnMgZm9yIEMrKyBjbGFzc2VzIHRoYXQgY29udGFpbiBhIHZpcnR1YWwgZnVuY3Rpb24KKyAgIHBvaW50ZXIgY29udGFpbnMgYSB0aWxkZSwgYSAlLCBhbmQgYSB0eXBlIG51bWJlci4KKyAgIFRoZSB0eXBlIG51bWJlciByZWZlcnMgdG8gdGhlIGJhc2UgY2xhc3MgKHBvc3NpYmx5IHRoaXMgY2xhc3MgaXRzZWxmKSB3aGljaAorICAgY29udGFpbnMgdGhlIHZ0YWJsZSBwb2ludGVyIGZvciB0aGUgY3VycmVudCBjbGFzcy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBoYXZlIHBhcnNlZCBhbGwgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbnMsCisgICBzbyB3ZSBjYW4gbG9vayBmb3IgdGhlIHZwdHIgYmFzZSBjbGFzcyBpbmZvLiAgKi8KKworc3RhdGljIGludAorcmVhZF90aWxkZV9maWVsZHMgKGZpcCwgcHAsIHR5cGUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBmaWVsZF9pbmZvICpmaXA7CisgICAgIGNoYXIgKipwcDsKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICByZWdpc3RlciBjaGFyICpwOworCisgIFNUQUJTX0NPTlRJTlVFIChwcCwgb2JqZmlsZSk7CisKKyAgLyogSWYgd2UgYXJlIHBvc2l0aW9uZWQgYXQgYSAnOycsIHRoZW4gc2tpcCBpdC4gKi8KKyAgaWYgKCoqcHAgPT0gJzsnKQorICAgIHsKKyAgICAgICgqcHApKys7CisgICAgfQorCisgIGlmICgqKnBwID09ICd+JykKKyAgICB7CisgICAgICAoKnBwKSsrOworCisgICAgICBpZiAoKipwcCA9PSAnPScgfHwgKipwcCA9PSAnKycgfHwgKipwcCA9PSAnLScpCisJeworCSAgLyogT2Jzb2xldGUgZmxhZ3MgdGhhdCB1c2VkIHRvIGluZGljYXRlIHRoZSBwcmVzZW5jZQorCSAgICAgb2YgY29uc3RydWN0b3JzIGFuZC9vciBkZXN0cnVjdG9ycy4gKi8KKwkgICgqcHApKys7CisJfQorCisgICAgICAvKiBSZWFkIGVpdGhlciBhICclJyBvciB0aGUgZmluYWwgJzsnLiAgKi8KKyAgICAgIGlmICgqKCpwcCkrKyA9PSAnJScpCisJeworCSAgLyogVGhlIG5leHQgbnVtYmVyIGlzIHRoZSB0eXBlIG51bWJlciBvZiB0aGUgYmFzZSBjbGFzcworCSAgICAgKHBvc3NpYmx5IG91ciBvd24gY2xhc3MpIHdoaWNoIHN1cHBsaWVzIHRoZSB2dGFibGUgZm9yCisJICAgICB0aGlzIGNsYXNzLiAgUGFyc2UgaXQgb3V0LCBhbmQgc2VhcmNoIHRoYXQgY2xhc3MgdG8gZmluZAorCSAgICAgaXRzIHZ0YWJsZSBwb2ludGVyLCBhbmQgaW5zdGFsbCB0aG9zZSBpbnRvIFRZUEVfVlBUUl9CQVNFVFlQRQorCSAgICAgYW5kIFRZUEVfVlBUUl9GSUVMRE5PLiAgKi8KKworCSAgc3RydWN0IHR5cGUgKnQ7CisJICBpbnQgaTsKKworCSAgdCA9IHJlYWRfdHlwZSAocHAsIG9iamZpbGUpOworCSAgcCA9ICgqcHApKys7CisJICB3aGlsZSAoKnAgIT0gJ1wwJyAmJiAqcCAhPSAnOycpCisJICAgIHsKKwkgICAgICBwKys7CisJICAgIH0KKwkgIGlmICgqcCA9PSAnXDAnKQorCSAgICB7CisJICAgICAgLyogUHJlbWF0dXJlIGVuZCBvZiBzeW1ib2wuICAqLworCSAgICAgIHJldHVybiAwOworCSAgICB9CisJICAKKwkgIFRZUEVfVlBUUl9CQVNFVFlQRSAodHlwZSkgPSB0OworCSAgaWYgKHR5cGUgPT0gdCkJCS8qIE91ciBvd24gY2xhc3MgcHJvdmlkZXMgdnRibCBwdHIgKi8KKwkgICAgeworCSAgICAgIGZvciAoaSA9IFRZUEVfTkZJRUxEUyAodCkgLSAxOworCQkgICBpID49IFRZUEVfTl9CQVNFQ0xBU1NFUyAodCk7CisJCSAgIC0taSkKKwkJeworCQkgIGlmICghIHN0cm5jbXAgKFRZUEVfRklFTERfTkFNRSAodCwgaSksIHZwdHJfbmFtZSwgCisJCQkJIHNpemVvZiAodnB0cl9uYW1lKSAtIDEpKQorCQkgICAgeworCQkgICAgICBUWVBFX1ZQVFJfRklFTEROTyAodHlwZSkgPSBpOworCQkgICAgICBnb3RvIGdvdGl0OworCQkgICAgfQorCQl9CisJICAgICAgLyogVmlydHVhbCBmdW5jdGlvbiB0YWJsZSBmaWVsZCBub3QgZm91bmQuICAqLworCSAgICAgIGNvbXBsYWluICgmdnRibF9ub3Rmb3VuZF9jb21wbGFpbnQsIFRZUEVfTkFNRSAodHlwZSkpOworCSAgICAgIHJldHVybiAwOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBUWVBFX1ZQVFJfRklFTEROTyAodHlwZSkgPSBUWVBFX1ZQVFJfRklFTEROTyAodCk7CisJICAgIH0KKworICAgIGdvdGl0OgorCSAgKnBwID0gcCArIDE7CisJfQorICAgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2F0dGFjaF9mbl9maWVsZHNfdG9fdHlwZSAoZmlwLCB0eXBlKQorICAgICBzdHJ1Y3QgZmllbGRfaW5mbyAqZmlwOworICAgICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgcmVnaXN0ZXIgaW50IG47CisKKyAgZm9yIChuID0gVFlQRV9ORk5fRklFTERTICh0eXBlKTsKKyAgICAgICBmaXAgLT4gZm5saXN0ICE9IE5VTEw7CisgICAgICAgZmlwIC0+IGZubGlzdCA9IGZpcCAtPiBmbmxpc3QgLT4gbmV4dCkKKyAgICB7CisgICAgICAtLW47ICAgICAgICAgICAgICAgICAgICAgIC8qIENpcmN1bXZlbnQgU3VuMyBjb21waWxlciBidWcgKi8KKyAgICAgIFRZUEVfRk5fRklFTERMSVNUUyAodHlwZSlbbl0gPSBmaXAgLT4gZm5saXN0IC0+IGZuX2ZpZWxkbGlzdDsKKyAgICB9CisgIHJldHVybiAxOworfQorCisvKiByZWFkIGNmcm9udCBjbGFzcyBzdGF0aWMgZGF0YS4KKyAgIHBwIHBvaW50cyB0byBzdHJpbmcgc3RhcnRpbmcgd2l0aCB0aGUgbGlzdCBvZiBzdGF0aWMgZGF0YQorICAgZWc6IEE6WmNBOzFAQnB1YiB2MkBCdmlycHJpO19fY3RfXzFBRnYgZnVuY19fMUFGdiAqc2Z1bmNfXzFBRnYgO2FzX18xQSA7OworICAgICAgICAgICAgIAkJCQkJCQkgICBeXl5eXl5eXgorCisgICAgICAgQTpaY0E7O2Zvb3ByaV9fMUFGdiBmb29wcm9fXzFBRnYgX19jdF9fMUFGdiBfX2N0X18xQUZSQzFBIGZvb3B1Yl9fMUFGdiA7OzsKKyAgICAgICAgICAgICAJCQkJCQkJICAgICAgICAgICAgICAgXgorICAgKi8KKworc3RhdGljIGludAorcmVhZF9jZnJvbnRfc3RhdGljX2ZpZWxkcyAoZmlwLCBwcCwgdHlwZSwgb2JqZmlsZSkKKyAgICAgc3RydWN0IGZpZWxkX2luZm8gKmZpcDsKKyAgICAgY2hhciAqKnBwOworICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCBuZXh0ZmllbGQgKiBuZXc7CisgIHN0cnVjdCB0eXBlICpzdHlwZTsKKyAgY2hhciAqIHNuYW1lOworICBzdHJ1Y3Qgc3ltYm9sICogcmVmX3N0YXRpYz0wOworICAgICAgCisgIGlmICgqKnBwPT0nOycpCQkvKiBubyBzdGF0aWMgZGF0YTsgcmV0dXJuICovCisgICAgeworICAgICAgKysoKnBwKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAvKiBQcm9jZXNzIGVhY2ggZmllbGQgaW4gdGhlIGxpc3QgdW50aWwgd2UgZmluZCB0aGUgdGVybWluYXRpbmcgIjsiICovCisKKyAgLyogZWc6IHAgPSAiYXNfXzFBIDs7OyIgKi8KKyAgU1RBQlNfQ09OVElOVUUgKHBwLCBvYmpmaWxlKTsgCQkvKiBoYW5kbGUgXFwgKi8KKyAgd2hpbGUgKCoqcHAhPSc7JyAmJiAoc25hbWUgPSBnZXRfc3Vic3RyaW5nIChwcCwgJyAnKSwgc25hbWUpKSAKKyAgICB7CisgICAgICByZWZfc3RhdGljID0gbG9va3VwX3N5bWJvbCAoc25hbWUsIDAsIFZBUl9OQU1FU1BBQ0UsIDAsIDApOyAvKmRlbWFuZ2xlZF9uYW1lKi8KKyAgICAgIGlmICghcmVmX3N0YXRpYykgCisgICAgICAgIHsKKyAgICAgICAgICBzdGF0aWMgc3RydWN0IGNvbXBsYWludCBtc2cgPSB7IlwKKyAgICAgIAkJVW5hYmxlIHRvIGZpbmQgc3ltYm9sIGZvciBzdGF0aWMgZGF0YSBmaWVsZCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMH07CisJICBjb21wbGFpbiAoJm1zZywgc25hbWUpOworCSAgY29udGludWU7CisJfQorICAgICAgc3R5cGUgPSBTWU1CT0xfVFlQRShyZWZfc3RhdGljKTsKKworICAgICAgLyogYWxsb2NhdGUgYSBuZXcgZmlwICovCisgICAgICBuZXcgPSAoc3RydWN0IG5leHRmaWVsZCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBuZXh0ZmllbGQpKTsKKyAgICAgIG1ha2VfY2xlYW51cCAoZnJlZSwgbmV3KTsKKyAgICAgIG1lbXNldCAobmV3LCAwLCBzaXplb2YgKHN0cnVjdCBuZXh0ZmllbGQpKTsKKyAgICAgIG5ldyAtPiBuZXh0ID0gZmlwIC0+IGxpc3Q7CisgICAgICBmaXAgLT4gbGlzdCA9IG5ldzsKKworICAgICAgLyogc2V0IHZpc2liaWxpdHkgKi8KKyAgICAgIC8qIEZJWE1FISBubyB3YXkgdG8gdGVsbCB2aXNpYmlsaXR5IGZyb20gc3RhYnM/Pz8gKi8KKyAgICAgIG5ldyAtPiB2aXNpYmlsaXR5ID0gVklTSUJJTElUWV9QVUJMSUM7CisKKyAgICAgIC8qIHNldCBmaWVsZCBpbmZvIGludG8gZmlwICovCisgICAgICBmaXAgLT4gbGlzdCAtPiBmaWVsZC50eXBlID0gc3R5cGU7IAorCisgICAgICAvKiBzZXQgYml0cG9zICYgYml0c2l6ZSAqLworICAgICAgU0VUX0ZJRUxEX1BIWVNOQU1FIChmaXAtPmxpc3QtPmZpZWxkLCBzYXZlc3RyaW5nIChzbmFtZSwgc3RybGVuIChzbmFtZSkpKTsKKworICAgICAgLyogc2V0IG5hbWUgZmllbGQgKi8KKyAgICAgIC8qIFRoZSBmb2xsb3dpbmcgaXMgY29kZSB0byB3b3JrIGFyb3VuZCBjZnJvbnQgZ2VuZXJhdGVkIHN0YWJzLgorICAgICAgICAgVGhlIHN0YWJzIGNvbnRhaW5zIGZ1bGwgbWFuZ2xlZCBuYW1lIGZvciBlYWNoIGZpZWxkLgorICAgICAgICAgV2UgdHJ5IHRvIGRlbWFuZ2xlIHRoZSBuYW1lIGFuZCBleHRyYWN0IHRoZSBmaWVsZCBuYW1lIG91dCBvZiBpdC4KKyAgICAgICovCisgICAgICBpZiAoQVJNX0RFTUFOR0xJTkcpCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICpkZW0sICpkZW1fcDsKKyAgICAgICAgICBkZW0gPSBjcGx1c19kZW1hbmdsZSAoc25hbWUsIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKKyAgICAgICAgICBpZiAoZGVtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRlbV9wID0gc3RycmNociAoZGVtLCAnOicpOworICAgICAgICAgICAgICBpZiAoZGVtX3AgIT0gMCAmJiAqKGRlbV9wLTEpPT0nOicpCisgICAgICAgICAgICAgICAgZGVtX3ArKzsKKyAgICAgICAgICAgICAgZmlwLT5saXN0LT5maWVsZC5uYW1lID0KKyAgICAgICAgICAgICAgICBvYnNhdmVzdHJpbmcgKGRlbV9wLCBzdHJsZW4gKGRlbV9wKSwgJm9iamZpbGUgLT4gdHlwZV9vYnN0YWNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGZpcC0+bGlzdC0+ZmllbGQubmFtZSA9CisgICAgICAgICAgICAgICAgb2JzYXZlc3RyaW5nIChzbmFtZSwgc3RybGVuIChzbmFtZSksICZvYmpmaWxlIC0+IHR5cGVfb2JzdGFjayk7IAorCSAgICB9CisgICAgICAgIH0gLyogZW5kIG9mIGNvZGUgZm9yIGNmcm9udCB3b3JrIGFyb3VuZCAqLyAKKyAgICB9IC8qIGxvb3AgYWdhaW4gZm9yIG5leHQgc3RhdGljIGZpZWxkICovCisgIHJldHVybiAxOworfQorCisvKiBDb3B5IHN0cnVjdHVyZSBmaWVsZHMgdG8gZmlwIHNvIGF0dGFjaF9maWVsZHNfdG9fdHlwZSB3aWxsIHdvcmsuCisgICB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBpbml0aWFsIGluc3RhbmNlIGRhdGEgZmllbGRzLgorICAgTm93IHdlIHdhbnQgdG8gYmUgYWJsZSB0byBhZGQgdGhlIG90aGVyIG1lbWJlcnMgdG8gdGhlIGNsYXNzLAorICAgc28gd2Ugd2FudCB0byBhZGQgdGhlbSBiYWNrIHRvIHRoZSBmaXAgYW5kIHJlYXR0YWNoIHRoZW0gYWdhaW4KKyAgIG9uY2Ugd2UgaGF2ZSBjb2xsZWN0ZWQgYWxsIHRoZSBjbGFzcyBtZW1iZXJzLiAqLworCitzdGF0aWMgaW50Citjb3B5X2Nmcm9udF9zdHJ1Y3RfZmllbGRzIChmaXAsIHR5cGUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBmaWVsZF9pbmZvICpmaXA7CisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaW50IG5maWVsZHMgPSBUWVBFX05GSUVMRFModHlwZSk7CisgIGludCBpOworICBzdHJ1Y3QgbmV4dGZpZWxkICogbmV3OworCisgIC8qIENvcHkgdGhlIGZpZWxkcyBpbnRvIHRoZSBsaXN0IG9mIGZpcHMgYW5kIHJlc2V0IHRoZSB0eXBlcyAKKyAgICAgdG8gcmVtb3ZlIHRoZSBvbGQgZmllbGRzICovCisKKyAgZm9yIChpPTA7IGk8bmZpZWxkczsgaSsrKQorICAgIHsKKyAgICAgIC8qIGFsbG9jYXRlIGEgbmV3IGZpcCAqLworICAgICAgbmV3ID0gKHN0cnVjdCBuZXh0ZmllbGQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbmV4dGZpZWxkKSk7CisgICAgICBtYWtlX2NsZWFudXAgKGZyZWUsIG5ldyk7CisgICAgICBtZW1zZXQgKG5ldywgMCwgc2l6ZW9mIChzdHJ1Y3QgbmV4dGZpZWxkKSk7CisgICAgICBuZXcgLT4gbmV4dCA9IGZpcCAtPiBsaXN0OworICAgICAgZmlwIC0+IGxpc3QgPSBuZXc7CisKKyAgICAgIC8qIGNvcHkgZmllbGQgaW5mbyBpbnRvIGZpcCAqLworICAgICAgbmV3IC0+IGZpZWxkID0gVFlQRV9GSUVMRCAodHlwZSwgaSk7CisgICAgICAvKiBzZXQgdmlzaWJpbGl0eSAqLworICAgICAgaWYgKFRZUEVfRklFTERfUFJPVEVDVEVEICh0eXBlLCBpKSkKKwluZXcgLT4gdmlzaWJpbGl0eSA9IFZJU0lCSUxJVFlfUFJPVEVDVEVEOworICAgICAgZWxzZSBpZiAoVFlQRV9GSUVMRF9QUklWQVRFICh0eXBlLCBpKSkKKyAgCSBuZXcgLT4gdmlzaWJpbGl0eSA9IFZJU0lCSUxJVFlfUFJJVkFURTsKKyAgICAgIGVsc2UKKwkgbmV3IC0+IHZpc2liaWxpdHkgPSBWSVNJQklMSVRZX1BVQkxJQzsKKyAgICB9CisgIC8qIE5vdyBkZWxldGUgdGhlIGZpZWxkcyBmcm9tIHRoZSB0eXBlIHNpbmNlIHdlIHdpbGwgYmUgCisgICAgIGFsbG9jaW5nIG5ldyBzcGFjZSBvbmNlIHdlIGdldCB0aGUgcmVzdCBvZiB0aGUgZmllbGRzIAorICAgICBpbiBhdHRhY2hfZmllbGRzX3RvX3R5cGUuCisgICAgIFRoZSBwb2ludGVyIFRZUEVfRklFTERTKHR5cGUpIGlzIGxlZnQgZGFuZ2xpbmcgYnV0IHNob3VsZCAKKyAgICAgYmUgZnJlZWQgbGF0ZXIgYnkgb2Jqc3RhY2tfZnJlZSAqLworICBUWVBFX0ZJRUxEUyAodHlwZSk9MDsKKyAgVFlQRV9ORklFTERTICh0eXBlKSA9IDA7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIENyZWF0ZSB0aGUgdmVjdG9yIG9mIGZpZWxkcywgYW5kIHJlY29yZCBob3cgYmlnIGl0IGlzLgorICAgV2UgbmVlZCB0aGlzIGluZm8gdG8gcmVjb3JkIHByb3BlciB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGluZm9ybWF0aW9uCisgICBmb3IgdGhpcyBjbGFzcydzIHZpcnR1YWwgZnVuY3Rpb25zLiAgKi8KKworc3RhdGljIGludAorYXR0YWNoX2ZpZWxkc190b190eXBlIChmaXAsIHR5cGUsIG9iamZpbGUpCisgICAgIHN0cnVjdCBmaWVsZF9pbmZvICpmaXA7CisgICAgIHJlZ2lzdGVyIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgcmVnaXN0ZXIgaW50IG5maWVsZHMgPSAwOworICByZWdpc3RlciBpbnQgbm9uX3B1YmxpY19maWVsZHMgPSAwOworICByZWdpc3RlciBzdHJ1Y3QgbmV4dGZpZWxkICpzY2FuOworCisgIC8qIENvdW50IHVwIHRoZSBudW1iZXIgb2YgZmllbGRzIHRoYXQgd2UgaGF2ZSwgYXMgd2VsbCBhcyB0YWtpbmcgbm90ZSBvZgorICAgICB3aGV0aGVyIG9yIG5vdCB0aGVyZSBhcmUgYW55IG5vbi1wdWJsaWMgZmllbGRzLCB3aGljaCByZXF1aXJlcyB1cyB0bworICAgICBhbGxvY2F0ZSBhbmQgYnVpbGQgdGhlIHByaXZhdGVfZmllbGRfYml0cyBhbmQgcHJvdGVjdGVkX2ZpZWxkX2JpdHMKKyAgICAgYml0ZmllbGRzLiAqLworCisgIGZvciAoc2NhbiA9IGZpcCAtPiBsaXN0OyBzY2FuICE9IE5VTEw7IHNjYW4gPSBzY2FuIC0+IG5leHQpCisgICAgeworICAgICAgbmZpZWxkcysrOworICAgICAgaWYgKHNjYW4gLT4gdmlzaWJpbGl0eSAhPSBWSVNJQklMSVRZX1BVQkxJQykKKwl7CisJICBub25fcHVibGljX2ZpZWxkcysrOworCX0KKyAgICB9CisKKyAgLyogTm93IHdlIGtub3cgaG93IG1hbnkgZmllbGRzIHRoZXJlIGFyZSwgYW5kIHdoZXRoZXIgb3Igbm90IHRoZXJlIGFyZSBhbnkKKyAgICAgbm9uLXB1YmxpYyBmaWVsZHMuICBSZWNvcmQgdGhlIGZpZWxkIGNvdW50LCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlCisgICAgIGFycmF5IG9mIGZpZWxkcywgYW5kIGNyZWF0ZSBibGFuayB2aXNpYmlsaXR5IGJpdGZpZWxkcyBpZiBuZWNlc3NhcnkuICovCisKKyAgVFlQRV9ORklFTERTICh0eXBlKSA9IG5maWVsZHM7CisgIFRZUEVfRklFTERTICh0eXBlKSA9IChzdHJ1Y3QgZmllbGQgKikKKyAgICBUWVBFX0FMTE9DICh0eXBlLCBzaXplb2YgKHN0cnVjdCBmaWVsZCkgKiBuZmllbGRzKTsKKyAgbWVtc2V0IChUWVBFX0ZJRUxEUyAodHlwZSksIDAsIHNpemVvZiAoc3RydWN0IGZpZWxkKSAqIG5maWVsZHMpOworCisgIGlmIChub25fcHVibGljX2ZpZWxkcykKKyAgICB7CisgICAgICBBTExPQ0FURV9DUExVU19TVFJVQ1RfVFlQRSAodHlwZSk7CisKKyAgICAgIFRZUEVfRklFTERfUFJJVkFURV9CSVRTICh0eXBlKSA9CisJKEJfVFlQRSAqKSBUWVBFX0FMTE9DICh0eXBlLCBCX0JZVEVTIChuZmllbGRzKSk7CisgICAgICBCX0NMUkFMTCAoVFlQRV9GSUVMRF9QUklWQVRFX0JJVFMgKHR5cGUpLCBuZmllbGRzKTsKKworICAgICAgVFlQRV9GSUVMRF9QUk9URUNURURfQklUUyAodHlwZSkgPQorCShCX1RZUEUgKikgVFlQRV9BTExPQyAodHlwZSwgQl9CWVRFUyAobmZpZWxkcykpOworICAgICAgQl9DTFJBTEwgKFRZUEVfRklFTERfUFJPVEVDVEVEX0JJVFMgKHR5cGUpLCBuZmllbGRzKTsKKworICAgICAgVFlQRV9GSUVMRF9JR05PUkVfQklUUyAodHlwZSkgPQorCShCX1RZUEUgKikgVFlQRV9BTExPQyAodHlwZSwgQl9CWVRFUyAobmZpZWxkcykpOworICAgICAgQl9DTFJBTEwgKFRZUEVfRklFTERfSUdOT1JFX0JJVFMgKHR5cGUpLCBuZmllbGRzKTsKKyAgICB9CisKKyAgLyogQ29weSB0aGUgc2F2ZWQtdXAgZmllbGRzIGludG8gdGhlIGZpZWxkIHZlY3Rvci4gIFN0YXJ0IGZyb20gdGhlIGhlYWQKKyAgICAgb2YgdGhlIGxpc3QsIGFkZGluZyB0byB0aGUgdGFpbCBvZiB0aGUgZmllbGQgYXJyYXksIHNvIHRoYXQgdGhleSBlbmQKKyAgICAgdXAgaW4gdGhlIHNhbWUgb3JkZXIgaW4gdGhlIGFycmF5IGluIHdoaWNoIHRoZXkgd2VyZSBhZGRlZCB0byB0aGUgbGlzdC4gKi8KKworICB3aGlsZSAobmZpZWxkcy0tID4gMCkKKyAgICB7CisgICAgICBUWVBFX0ZJRUxEICh0eXBlLCBuZmllbGRzKSA9IGZpcCAtPiBsaXN0IC0+IGZpZWxkOworICAgICAgc3dpdGNoIChmaXAgLT4gbGlzdCAtPiB2aXNpYmlsaXR5KQorCXsKKwkgIGNhc2UgVklTSUJJTElUWV9QUklWQVRFOgorCSAgICBTRVRfVFlQRV9GSUVMRF9QUklWQVRFICh0eXBlLCBuZmllbGRzKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgVklTSUJJTElUWV9QUk9URUNURUQ6CisJICAgIFNFVF9UWVBFX0ZJRUxEX1BST1RFQ1RFRCAodHlwZSwgbmZpZWxkcyk7CisJICAgIGJyZWFrOworCisJICBjYXNlIFZJU0lCSUxJVFlfSUdOT1JFOgorCSAgICBTRVRfVFlQRV9GSUVMRF9JR05PUkUgKHR5cGUsIG5maWVsZHMpOworCSAgICBicmVhazsKKworCSAgY2FzZSBWSVNJQklMSVRZX1BVQkxJQzoKKwkgICAgYnJlYWs7CisKKwkgIGRlZmF1bHQ6CisJICAgIC8qIFVua25vd24gdmlzaWJpbGl0eS4gIENvbXBsYWluIGFuZCB0cmVhdCBpdCBhcyBwdWJsaWMuICAqLworCSAgICB7CisJICAgICAgc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgbXNnID0geworCQkiVW5rbm93biB2aXNpYmlsaXR5IGAlYycgZm9yIGZpZWxkIiwgMCwgMH07CisJICAgICAgY29tcGxhaW4gKCZtc2csIGZpcCAtPiBsaXN0IC0+IHZpc2liaWxpdHkpOworCSAgICB9CisJICAgIGJyZWFrOworCX0KKyAgICAgIGZpcCAtPiBsaXN0ID0gZmlwIC0+IGxpc3QgLT4gbmV4dDsKKyAgICB9CisgIHJldHVybiAxOworfQorCisvKiBSZWFkIHRoZSBkZXNjcmlwdGlvbiBvZiBhIHN0cnVjdHVyZSAob3IgdW5pb24gdHlwZSkgYW5kIHJldHVybiBhbiBvYmplY3QKKyAgIGRlc2NyaWJpbmcgdGhlIHR5cGUuCisKKyAgIFBQIHBvaW50cyB0byBhIGNoYXJhY3RlciBwb2ludGVyIHRoYXQgcG9pbnRzIHRvIHRoZSBuZXh0IHVuY29uc3VtZWQgdG9rZW4KKyAgIGluIHRoZSB0aGUgc3RhYnMgc3RyaW5nLiAgRm9yIGV4YW1wbGUsIGdpdmVuIHN0YWJzICJBOlQ0PXM0YToxLDAsMzI7OyIsCisgICAqUFAgd2lsbCBwb2ludCB0byAiNGE6MSwwLDMyOzsiLgorCisgICBUWVBFIHBvaW50cyB0byBhbiBpbmNvbXBsZXRlIHR5cGUgdGhhdCBuZWVkcyB0byBiZSBmaWxsZWQgaW4uCisKKyAgIE9CSkZJTEUgcG9pbnRzIHRvIHRoZSBjdXJyZW50IG9iamZpbGUgZnJvbSB3aGljaCB0aGUgc3RhYnMgaW5mb3JtYXRpb24gaXMKKyAgIGJlaW5nIHJlYWQuICAoTm90ZSB0aGF0IGl0IGlzIHJlZHVuZGFudCBpbiB0aGF0IFRZUEUgYWxzbyBjb250YWlucyBhIHBvaW50ZXIKKyAgIHRvIHRoaXMgc2FtZSBvYmpmaWxlLCBzbyBpdCBtaWdodCBiZSBhIGdvb2QgaWRlYSB0byBlbGltaW5hdGUgaXQuICBGSVhNRSkuIAorICAgKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK3JlYWRfc3RydWN0X3R5cGUgKHBwLCB0eXBlLCBvYmpmaWxlKQorICAgICBjaGFyICoqcHA7CisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IGNsZWFudXAgKmJhY2tfdG87CisgIHN0cnVjdCBmaWVsZF9pbmZvIGZpOworCisgIGZpLmxpc3QgPSBOVUxMOworICBmaS5mbmxpc3QgPSBOVUxMOworCisgIGJhY2tfdG8gPSBtYWtlX2NsZWFudXAgKG51bGxfY2xlYW51cCwgMCk7CisKKyAgSU5JVF9DUExVU19TUEVDSUZJQyAodHlwZSk7CisgIFRZUEVfRkxBR1MgKHR5cGUpICY9IH5UWVBFX0ZMQUdfU1RVQjsKKworICAvKiBGaXJzdCBjb21lcyB0aGUgdG90YWwgc2l6ZSBpbiBieXRlcy4gICovCisKKyAgeworICAgIGludCBuYml0czsKKyAgICBUWVBFX0xFTkdUSCAodHlwZSkgPSByZWFkX2h1Z2VfbnVtYmVyIChwcCwgMCwgJm5iaXRzKTsKKyAgICBpZiAobmJpdHMgIT0gMCkKKyAgICAgIHJldHVybiBlcnJvcl90eXBlIChwcCwgb2JqZmlsZSk7CisgIH0KKworICAvKiBOb3cgcmVhZCB0aGUgYmFzZWNsYXNzZXMsIGlmIGFueSwgcmVhZCB0aGUgcmVndWxhciBDIHN0cnVjdCBvciBDKysKKyAgICAgY2xhc3MgbWVtYmVyIGZpZWxkcywgYXR0YWNoIHRoZSBmaWVsZHMgdG8gdGhlIHR5cGUsIHJlYWQgdGhlIEMrKworICAgICBtZW1iZXIgZnVuY3Rpb25zLCBhdHRhY2ggdGhlbSB0byB0aGUgdHlwZSwgYW5kIHRoZW4gcmVhZCBhbnkgdGlsZGUKKyAgICAgZmllbGQgKGJhc2VjbGFzcyBzcGVjaWZpZXIgZm9yIHRoZSBjbGFzcyBob2xkaW5nIHRoZSBtYWluIHZ0YWJsZSkuICovCisKKyAgaWYgKCFyZWFkX2Jhc2VjbGFzc2VzICgmZmksIHBwLCB0eXBlLCBvYmpmaWxlKQorICAgICAgfHwgIXJlYWRfc3RydWN0X2ZpZWxkcyAoJmZpLCBwcCwgdHlwZSwgb2JqZmlsZSkKKyAgICAgIHx8ICFhdHRhY2hfZmllbGRzX3RvX3R5cGUgKCZmaSwgdHlwZSwgb2JqZmlsZSkKKyAgICAgIHx8ICFyZWFkX21lbWJlcl9mdW5jdGlvbnMgKCZmaSwgcHAsIHR5cGUsIG9iamZpbGUpCisgICAgICB8fCAhYXR0YWNoX2ZuX2ZpZWxkc190b190eXBlICgmZmksIHR5cGUpCisgICAgICB8fCAhcmVhZF90aWxkZV9maWVsZHMgKCZmaSwgcHAsIHR5cGUsIG9iamZpbGUpKQorICAgIHsKKyAgICAgIHR5cGUgPSBlcnJvcl90eXBlIChwcCwgb2JqZmlsZSk7CisgICAgfQorCisgIGRvX2NsZWFudXBzIChiYWNrX3RvKTsKKyAgcmV0dXJuICh0eXBlKTsKK30KKworLyogUmVhZCBhIGRlZmluaXRpb24gb2YgYW4gYXJyYXkgdHlwZSwKKyAgIGFuZCBjcmVhdGUgYW5kIHJldHVybiBhIHN1aXRhYmxlIHR5cGUgb2JqZWN0LgorICAgQWxzbyBjcmVhdGVzIGEgcmFuZ2UgdHlwZSB3aGljaCByZXByZXNlbnRzIHRoZSBib3VuZHMgb2YgdGhhdAorICAgYXJyYXkuICAqLworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorcmVhZF9hcnJheV90eXBlIChwcCwgdHlwZSwgb2JqZmlsZSkKKyAgICAgcmVnaXN0ZXIgY2hhciAqKnBwOworICAgICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCB0eXBlICppbmRleF90eXBlLCAqZWxlbWVudF90eXBlLCAqcmFuZ2VfdHlwZTsKKyAgaW50IGxvd2VyLCB1cHBlcjsKKyAgaW50IGFkanVzdGFibGUgPSAwOworICBpbnQgbmJpdHM7CisKKyAgLyogRm9ybWF0IG9mIGFuIGFycmF5IHR5cGU6CisgICAgICJhcjxpbmRleCB0eXBlPjtsb3dlcjt1cHBlcjs8YXJyYXlfY29udGVudHNfdHlwZT4iLgorICAgICBPUzkwMDA6ICJhcmxvd2VyLHVwcGVyOzxhcnJheV9jb250ZW50c190eXBlPiIuCisKKyAgICAgRm9ydHJhbiBhZGp1c3RhYmxlIGFycmF5cyB1c2UgQWRpZ2l0cyBvciBUZGlnaXRzIGZvciBsb3dlciBvciB1cHBlcjsKKyAgICAgZm9yIHRoZXNlLCBwcm9kdWNlIGEgdHlwZSBsaWtlIGZsb2F0W11bXS4gICovCisKKyAgaWYgKG9zOWtfc3RhYnMpCisgICAgaW5kZXhfdHlwZSA9IGJ1aWx0aW5fdHlwZV9pbnQ7CisgIGVsc2UKKyAgICB7CisgICAgICBpbmRleF90eXBlID0gcmVhZF90eXBlIChwcCwgb2JqZmlsZSk7CisgICAgICBpZiAoKipwcCAhPSAnOycpCisJLyogSW1wcm9wZXIgZm9ybWF0IG9mIGFycmF5IHR5cGUgZGVjbC4gICovCisJcmV0dXJuIGVycm9yX3R5cGUgKHBwLCBvYmpmaWxlKTsKKyAgICAgICsrKnBwOworICAgIH0KKworICBpZiAoISgqKnBwID49ICcwJyAmJiAqKnBwIDw9ICc5JykgJiYgKipwcCAhPSAnLScpCisgICAgeworICAgICAgKCpwcCkrKzsKKyAgICAgIGFkanVzdGFibGUgPSAxOworICAgIH0KKyAgbG93ZXIgPSByZWFkX2h1Z2VfbnVtYmVyIChwcCwgb3M5a19zdGFicyA/ICcsJyA6ICc7JywgJm5iaXRzKTsKKyAgaWYgKG5iaXRzICE9IDApCisgICAgcmV0dXJuIGVycm9yX3R5cGUgKHBwLCBvYmpmaWxlKTsKKworICBpZiAoISgqKnBwID49ICcwJyAmJiAqKnBwIDw9ICc5JykgJiYgKipwcCAhPSAnLScpCisgICAgeworICAgICAgKCpwcCkrKzsKKyAgICAgIGFkanVzdGFibGUgPSAxOworICAgIH0KKyAgdXBwZXIgPSByZWFkX2h1Z2VfbnVtYmVyIChwcCwgJzsnLCAmbmJpdHMpOworICBpZiAobmJpdHMgIT0gMCkKKyAgICByZXR1cm4gZXJyb3JfdHlwZSAocHAsIG9iamZpbGUpOworICAKKyAgZWxlbWVudF90eXBlID0gcmVhZF90eXBlIChwcCwgb2JqZmlsZSk7CisKKyAgaWYgKGFkanVzdGFibGUpCisgICAgeworICAgICAgbG93ZXIgPSAwOworICAgICAgdXBwZXIgPSAtMTsKKyAgICB9CisKKyAgcmFuZ2VfdHlwZSA9CisgICAgY3JlYXRlX3JhbmdlX3R5cGUgKChzdHJ1Y3QgdHlwZSAqKSBOVUxMLCBpbmRleF90eXBlLCBsb3dlciwgdXBwZXIpOworICB0eXBlID0gY3JlYXRlX2FycmF5X3R5cGUgKHR5cGUsIGVsZW1lbnRfdHlwZSwgcmFuZ2VfdHlwZSk7CisKKyAgcmV0dXJuIHR5cGU7Cit9CisKKworLyogUmVhZCBhIGRlZmluaXRpb24gb2YgYW4gZW51bWVyYXRpb24gdHlwZSwKKyAgIGFuZCBjcmVhdGUgYW5kIHJldHVybiBhIHN1aXRhYmxlIHR5cGUgb2JqZWN0LgorICAgQWxzbyBkZWZpbmVzIHRoZSBzeW1ib2xzIHRoYXQgcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgdGhlIHR5cGUuICAqLworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorcmVhZF9lbnVtX3R5cGUgKHBwLCB0eXBlLCBvYmpmaWxlKQorICAgICByZWdpc3RlciBjaGFyICoqcHA7CisgICAgIHJlZ2lzdGVyIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqcDsKKyAgY2hhciAqbmFtZTsKKyAgcmVnaXN0ZXIgbG9uZyBuOworICByZWdpc3RlciBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIGludCBuc3ltcyA9IDA7CisgIHN0cnVjdCBwZW5kaW5nICoqc3ltbGlzdDsKKyAgc3RydWN0IHBlbmRpbmcgKm9zeW1zLCAqc3ltczsKKyAgaW50IG9fbnN5bXM7CisgIGludCBuYml0czsKKyAgaW50IHVuc2lnbmVkX2VudW0gPSAxOworCisjaWYgMAorICAvKiBGSVhNRSEgIFRoZSBzdGFicyBwcm9kdWNlZCBieSBTdW4gQ0MgbWVycmlseSBkZWZpbmUgdGhpbmdzIHRoYXQgb3VnaHQKKyAgICAgdG8gYmUgZmlsZS1zY29wZSwgYmV0d2VlbiBOX0ZOIGVudHJpZXMsIHVzaW5nIE5fTFNZTS4gIFdoYXQncyBhIG1vdGhlcgorICAgICB0byBkbz8gIEZvciBub3csIGZvcmNlIGFsbCBlbnVtIHZhbHVlcyB0byBmaWxlIHNjb3BlLiAgKi8KKyAgaWYgKHdpdGhpbl9mdW5jdGlvbikKKyAgICBzeW1saXN0ID0gJmxvY2FsX3N5bWJvbHM7CisgIGVsc2UKKyNlbmRpZgorICAgIHN5bWxpc3QgPSAmZmlsZV9zeW1ib2xzOworICBvc3ltcyA9ICpzeW1saXN0OworICBvX25zeW1zID0gb3N5bXMgPyBvc3ltcy0+bnN5bXMgOiAwOworCisgIGlmIChvczlrX3N0YWJzKQorICAgIHsKKyAgICAgIC8qIFNpemUuICBQZXJoYXBzIHRoaXMgZG9lcyBub3QgaGF2ZSB0byBiZSBjb25kaXRpb25hbGl6ZWQgb24KKwkgb3M5a19zdGFicyAoYXNzdW1pbmcgdGhlIG5hbWUgb2YgYW4gZW51bSBjb25zdGFudCBjYW4ndCBzdGFydAorCSB3aXRoIGEgZGlnaXQpLiAgKi8KKyAgICAgIHJlYWRfaHVnZV9udW1iZXIgKHBwLCAwLCAmbmJpdHMpOworICAgICAgaWYgKG5iaXRzICE9IDApCisJcmV0dXJuIGVycm9yX3R5cGUgKHBwLCBvYmpmaWxlKTsKKyAgICB9CisKKyAgLyogVGhlIGFpeDQgY29tcGlsZXIgZW1pdHMgYW4gZXh0cmEgZmllbGQgYmVmb3JlIHRoZSBlbnVtIG1lbWJlcnM7CisgICAgIG15IGd1ZXNzIGlzIGl0J3MgYSB0eXBlIG9mIHNvbWUgc29ydC4gIEp1c3QgaWdub3JlIGl0LiAgKi8KKyAgaWYgKCoqcHAgPT0gJy0nKQorICAgIHsKKyAgICAgIC8qIFNraXAgb3ZlciB0aGUgdHlwZS4gICovCisgICAgICB3aGlsZSAoKipwcCAhPSAnOicpCisgICAgICAgICgqcHApKys7CisKKyAgICAgIC8qIFNraXAgb3ZlciB0aGUgY29sb24uICAqLworICAgICAgKCpwcCkrKzsKKyAgICB9CisKKyAgLyogUmVhZCB0aGUgdmFsdWUtbmFtZXMgYW5kIHRoZWlyIHZhbHVlcy4KKyAgICAgVGhlIGlucHV0IHN5bnRheCBpcyBOQU1FOlZBTFVFLE5BTUU6VkFMVUUsIGFuZCBzbyBvbi4KKyAgICAgQSBzZW1pY29sb24gb3IgY29tbWEgaW5zdGVhZCBvZiBhIE5BTUUgbWVhbnMgdGhlIGVuZC4gICovCisgIHdoaWxlICgqKnBwICYmICoqcHAgIT0gJzsnICYmICoqcHAgIT0gJywnKQorICAgIHsKKyAgICAgIFNUQUJTX0NPTlRJTlVFIChwcCwgb2JqZmlsZSk7CisgICAgICBwID0gKnBwOworICAgICAgd2hpbGUgKCpwICE9ICc6JykgcCsrOworICAgICAgbmFtZSA9IG9ic2F2ZXN0cmluZyAoKnBwLCBwIC0gKnBwLCAmb2JqZmlsZSAtPiBzeW1ib2xfb2JzdGFjayk7CisgICAgICAqcHAgPSBwICsgMTsKKyAgICAgIG4gPSByZWFkX2h1Z2VfbnVtYmVyIChwcCwgJywnLCAmbmJpdHMpOworICAgICAgaWYgKG5iaXRzICE9IDApCisJcmV0dXJuIGVycm9yX3R5cGUgKHBwLCBvYmpmaWxlKTsKKworICAgICAgc3ltID0gKHN0cnVjdCBzeW1ib2wgKikKKwlvYnN0YWNrX2FsbG9jICgmb2JqZmlsZSAtPiBzeW1ib2xfb2JzdGFjaywgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisgICAgICBtZW1zZXQgKHN5bSwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisgICAgICBTWU1CT0xfTkFNRSAoc3ltKSA9IG5hbWU7CisgICAgICBTWU1CT0xfTEFOR1VBR0UgKHN5bSkgPSBjdXJyZW50X3N1YmZpbGUgLT4gbGFuZ3VhZ2U7CisgICAgICBTWU1CT0xfQ0xBU1MgKHN5bSkgPSBMT0NfQ09OU1Q7CisgICAgICBTWU1CT0xfTkFNRVNQQUNFIChzeW0pID0gVkFSX05BTUVTUEFDRTsKKyAgICAgIFNZTUJPTF9WQUxVRSAoc3ltKSA9IG47CisgICAgICBpZiAobiA8IDApCisJdW5zaWduZWRfZW51bSA9IDA7CisgICAgICBhZGRfc3ltYm9sX3RvX2xpc3QgKHN5bSwgc3ltbGlzdCk7CisgICAgICBuc3ltcysrOworICAgIH0KKworICBpZiAoKipwcCA9PSAnOycpCisgICAgKCpwcCkrKzsJCQkvKiBTa2lwIHRoZSBzZW1pY29sb24uICAqLworCisgIC8qIE5vdyBmaWxsIGluIHRoZSBmaWVsZHMgb2YgdGhlIHR5cGUtc3RydWN0dXJlLiAgKi8KKworICBUWVBFX0xFTkdUSCAodHlwZSkgPSBUQVJHRVRfSU5UX0JJVCAvIEhPU1RfQ0hBUl9CSVQ7CisgIFRZUEVfQ09ERSAodHlwZSkgPSBUWVBFX0NPREVfRU5VTTsKKyAgVFlQRV9GTEFHUyAodHlwZSkgJj0gflRZUEVfRkxBR19TVFVCOworICBpZiAodW5zaWduZWRfZW51bSkKKyAgICBUWVBFX0ZMQUdTICh0eXBlKSB8PSBUWVBFX0ZMQUdfVU5TSUdORUQ7CisgIFRZUEVfTkZJRUxEUyAodHlwZSkgPSBuc3ltczsKKyAgVFlQRV9GSUVMRFMgKHR5cGUpID0gKHN0cnVjdCBmaWVsZCAqKQorICAgIFRZUEVfQUxMT0MgKHR5cGUsIHNpemVvZiAoc3RydWN0IGZpZWxkKSAqIG5zeW1zKTsKKyAgbWVtc2V0IChUWVBFX0ZJRUxEUyAodHlwZSksIDAsIHNpemVvZiAoc3RydWN0IGZpZWxkKSAqIG5zeW1zKTsKKworICAvKiBGaW5kIHRoZSBzeW1ib2xzIGZvciB0aGUgdmFsdWVzIGFuZCBwdXQgdGhlbSBpbnRvIHRoZSB0eXBlLgorICAgICBUaGUgc3ltYm9scyBjYW4gYmUgZm91bmQgaW4gdGhlIHN5bWxpc3QgdGhhdCB3ZSBwdXQgdGhlbSBvbgorICAgICB0byBjYXVzZSB0aGVtIHRvIGJlIGRlZmluZWQuICBvc3ltcyBjb250YWlucyB0aGUgb2xkIHZhbHVlCisgICAgIG9mIHRoYXQgc3ltbGlzdDsgZXZlcnl0aGluZyB1cCB0byB0aGVyZSB3YXMgZGVmaW5lZCBieSB1cy4gICovCisgIC8qIE5vdGUgdGhhdCB3ZSBwcmVzZXJ2ZSB0aGUgb3JkZXIgb2YgdGhlIGVudW0gY29uc3RhbnRzLCBzbworICAgICB0aGF0IGluIHNvbWV0aGluZyBsaWtlICJlbnVtIHtGT08sIExBU1RfVEhJTkc9Rk9PfSIgd2UgcHJpbnQKKyAgICAgRk9PLCBub3QgTEFTVF9USElORy4gICovCisKKyAgZm9yIChzeW1zID0gKnN5bWxpc3QsIG4gPSBuc3ltcyAtIDE7IHN5bXM7IHN5bXMgPSBzeW1zLT5uZXh0KQorICAgIHsKKyAgICAgIGludCBsYXN0ID0gc3ltcyA9PSBvc3ltcyA/IG9fbnN5bXMgOiAwOworICAgICAgaW50IGogPSBzeW1zLT5uc3ltczsKKyAgICAgIGZvciAoOyAtLWogPj0gbGFzdDsgLS1uKQorCXsKKwkgIHN0cnVjdCBzeW1ib2wgKnhzeW0gPSBzeW1zLT5zeW1ib2xbal07CisJICBTWU1CT0xfVFlQRSAoeHN5bSkgPSB0eXBlOworCSAgVFlQRV9GSUVMRF9OQU1FICh0eXBlLCBuKSA9IFNZTUJPTF9OQU1FICh4c3ltKTsKKwkgIFRZUEVfRklFTERfQklUUE9TICh0eXBlLCBuKSA9IFNZTUJPTF9WQUxVRSAoeHN5bSk7CisJICBUWVBFX0ZJRUxEX0JJVFNJWkUgKHR5cGUsIG4pID0gMDsKKwl9CisgICAgICBpZiAoc3ltcyA9PSBvc3ltcykKKwlicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIHR5cGU7Cit9CisKKy8qIFN1bidzIEFDQyB1c2VzIGEgc29tZXdoYXQgc2FuZXIgbWV0aG9kIGZvciBzcGVjaWZ5aW5nIHRoZSBidWlsdGluCisgICB0eXBlZGVmcyBpbiBldmVyeSBmaWxlIChmb3IgaW50LCBsb25nLCBldGMpOgorCisJdHlwZSA9IGIgPHNpZ25lZD4gPHdpZHRoPiA8Zm9ybWF0IHR5cGU+OyA8b2Zmc2V0PjsgPG5iaXRzPgorCXNpZ25lZCA9IHUgb3Igcy4KKwlvcHRpb25hbCBmb3JtYXQgdHlwZSA9IGMgb3IgYiBmb3IgY2hhciBvciBib29sZWFuLgorCW9mZnNldCA9IG9mZnNldCBmcm9tIGhpZ2ggb3JkZXIgYml0IHRvIHN0YXJ0IGJpdCBvZiB0eXBlLgorCXdpZHRoIGlzICMgYnl0ZXMgaW4gb2JqZWN0IG9mIHRoaXMgdHlwZSwgbmJpdHMgaXMgIyBiaXRzIGluIHR5cGUuCisKKyAgIFRoZSB3aWR0aC9vZmZzZXQgc3R1ZmYgYXBwZWFycyB0byBiZSBmb3Igc21hbGwgb2JqZWN0cyBzdG9yZWQgaW4KKyAgIGxhcmdlciBvbmVzIChlLmcuIGBzaG9ydHMnIGluIGBpbnQnIHJlZ2lzdGVycykuICBXZSBpZ25vcmUgaXQgZm9yIG5vdywKKyAgIEZJWE1FLiAgKi8KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK3JlYWRfc3VuX2J1aWx0aW5fdHlwZSAocHAsIHR5cGVudW1zLCBvYmpmaWxlKQorICAgICBjaGFyICoqcHA7CisgICAgIGludCB0eXBlbnVtc1syXTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIGludCB0eXBlX2JpdHM7CisgIGludCBuYml0czsKKyAgaW50IHNpZ25lZF90eXBlOworICBlbnVtIHR5cGVfY29kZSBjb2RlID0gVFlQRV9DT0RFX0lOVDsKKworICBzd2l0Y2ggKCoqcHApCisgICAgeworICAgICAgY2FzZSAncyc6CisgICAgICAgIHNpZ25lZF90eXBlID0gMTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ3UnOgorCXNpZ25lZF90eXBlID0gMDsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJcmV0dXJuIGVycm9yX3R5cGUgKHBwLCBvYmpmaWxlKTsKKyAgICB9CisgICgqcHApKys7CisKKyAgLyogRm9yIHNvbWUgb2RkIHJlYXNvbiwgYWxsIGZvcm1zIG9mIGNoYXIgcHV0IGEgYyBoZXJlLiAgVGhpcyBpcyBzdHJhbmdlCisgICAgIGJlY2F1c2Ugbm8gb3RoZXIgdHlwZSBoYXMgdGhpcyBob25vci4gIFdlIGNhbiBzYWZlbHkgaWdub3JlIHRoaXMgYmVjYXVzZQorICAgICB3ZSBhY3R1YWxseSBkZXRlcm1pbmUgJ2NoYXInYWN0ZXJuZXNzIGJ5IHRoZSBudW1iZXIgb2YgYml0cyBzcGVjaWZpZWQgaW4KKyAgICAgdGhlIGRlc2NyaXB0b3IuCisgICAgIEJvb2xlYW4gZm9ybXMsIGUuZyBGb3J0cmFuIGxvZ2ljYWwqWCwgcHV0IGEgYiBoZXJlLiAgKi8KKworICBpZiAoKipwcCA9PSAnYycpCisgICAgKCpwcCkrKzsKKyAgZWxzZSBpZiAoKipwcCA9PSAnYicpCisgICAgeworICAgICAgY29kZSA9IFRZUEVfQ09ERV9CT09MOworICAgICAgKCpwcCkrKzsKKyAgICB9CisKKyAgLyogVGhlIGZpcnN0IG51bWJlciBhcHBlYXJzIHRvIGJlIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2NjdXBpZWQKKyAgICAgYnkgdGhpcyB0eXBlLCBleGNlcHQgdGhhdCB1bnNpZ25lZCBzaG9ydCBpcyA0IGluc3RlYWQgb2YgMi4KKyAgICAgU2luY2UgdGhpcyBpbmZvcm1hdGlvbiBpcyByZWR1bmRhbnQgd2l0aCB0aGUgdGhpcmQgbnVtYmVyLAorICAgICB3ZSB3aWxsIGlnbm9yZSBpdC4gICovCisgIHJlYWRfaHVnZV9udW1iZXIgKHBwLCAnOycsICZuYml0cyk7CisgIGlmIChuYml0cyAhPSAwKQorICAgIHJldHVybiBlcnJvcl90eXBlIChwcCwgb2JqZmlsZSk7CisKKyAgLyogVGhlIHNlY29uZCBudW1iZXIgaXMgYWx3YXlzIDAsIHNvIGlnbm9yZSBpdCB0b28uICovCisgIHJlYWRfaHVnZV9udW1iZXIgKHBwLCAnOycsICZuYml0cyk7CisgIGlmIChuYml0cyAhPSAwKQorICAgIHJldHVybiBlcnJvcl90eXBlIChwcCwgb2JqZmlsZSk7CisKKyAgLyogVGhlIHRoaXJkIG51bWJlciBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgZm9yIHRoaXMgdHlwZS4gKi8KKyAgdHlwZV9iaXRzID0gcmVhZF9odWdlX251bWJlciAocHAsIDAsICZuYml0cyk7CisgIGlmIChuYml0cyAhPSAwKQorICAgIHJldHVybiBlcnJvcl90eXBlIChwcCwgb2JqZmlsZSk7CisgIC8qIFRoZSB0eXBlICpzaG91bGQqIGVuZCB3aXRoIGEgc2VtaWNvbG9uLiAgSWYgaXQgYXJlIGVtYmVkZGVkCisgICAgIGluIGEgbGFyZ2VyIHR5cGUgdGhlIHNlbWljb2xvbiBtYXkgYmUgdGhlIG9ubHkgd2F5IHRvIGtub3cgd2hlcmUKKyAgICAgdGhlIHR5cGUgZW5kcy4gIElmIHRoaXMgdHlwZSBpcyBhdCB0aGUgZW5kIG9mIHRoZSBzdGFic3RyaW5nIHdlCisgICAgIGNhbiBkZWFsIHdpdGggdGhlIG9taXR0ZWQgc2VtaWNvbG9uIChidXQgd2UgZG9uJ3QgaGF2ZSB0byBsaWtlCisgICAgIGl0KS4gIERvbid0IGJvdGhlciB0byBjb21wbGFpbigpLCBTdW4ncyBjb21waWxlciBvbWl0cyB0aGUgc2VtaWNvbG9uCisgICAgIGZvciAidm9pZCIuICAqLworICBpZiAoKipwcCA9PSAnOycpCisgICAgKysoKnBwKTsKKworICBpZiAodHlwZV9iaXRzID09IDApCisgICAgcmV0dXJuIGluaXRfdHlwZSAoVFlQRV9DT0RFX1ZPSUQsIDEsCisJCSAgICAgIHNpZ25lZF90eXBlID8gMCA6IFRZUEVfRkxBR19VTlNJR05FRCwgKGNoYXIgKilOVUxMLAorCQkgICAgICBvYmpmaWxlKTsKKyAgZWxzZQorICAgIHJldHVybiBpbml0X3R5cGUgKGNvZGUsCisJCSAgICAgIHR5cGVfYml0cyAvIFRBUkdFVF9DSEFSX0JJVCwKKwkJICAgICAgc2lnbmVkX3R5cGUgPyAwIDogVFlQRV9GTEFHX1VOU0lHTkVELCAoY2hhciAqKU5VTEwsCisJCSAgICAgIG9iamZpbGUpOworfQorCitzdGF0aWMgc3RydWN0IHR5cGUgKgorcmVhZF9zdW5fZmxvYXRpbmdfdHlwZSAocHAsIHR5cGVudW1zLCBvYmpmaWxlKQorICAgICBjaGFyICoqcHA7CisgICAgIGludCB0eXBlbnVtc1syXTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIGludCBuYml0czsKKyAgaW50IGRldGFpbHM7CisgIGludCBuYnl0ZXM7CisKKyAgLyogVGhlIGZpcnN0IG51bWJlciBoYXMgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSB0eXBlLCBmb3IgZXhhbXBsZQorICAgICBGTl9DT01QTEVYLiAgKi8KKyAgZGV0YWlscyA9IHJlYWRfaHVnZV9udW1iZXIgKHBwLCAnOycsICZuYml0cyk7CisgIGlmIChuYml0cyAhPSAwKQorICAgIHJldHVybiBlcnJvcl90eXBlIChwcCwgb2JqZmlsZSk7CisKKyAgLyogVGhlIHNlY29uZCBudW1iZXIgaXMgdGhlIG51bWJlciBvZiBieXRlcyBvY2N1cGllZCBieSB0aGlzIHR5cGUgKi8KKyAgbmJ5dGVzID0gcmVhZF9odWdlX251bWJlciAocHAsICc7JywgJm5iaXRzKTsKKyAgaWYgKG5iaXRzICE9IDApCisgICAgcmV0dXJuIGVycm9yX3R5cGUgKHBwLCBvYmpmaWxlKTsKKworICBpZiAoZGV0YWlscyA9PSBORl9DT01QTEVYIHx8IGRldGFpbHMgPT0gTkZfQ09NUExFWDE2CisgICAgICB8fCBkZXRhaWxzID09IE5GX0NPTVBMRVgzMikKKyAgICAvKiBUaGlzIGlzIGEgdHlwZSB3ZSBjYW4ndCBoYW5kbGUsIGJ1dCB3ZSBkbyBrbm93IHRoZSBzaXplLgorICAgICAgIFdlIGFsc28gd2lsbCBiZSBhYmxlIHRvIGdpdmUgaXQgYSBuYW1lLiAgKi8KKyAgICByZXR1cm4gaW5pdF90eXBlIChUWVBFX0NPREVfQ09NUExFWCwgbmJ5dGVzLCAwLCBOVUxMLCBvYmpmaWxlKTsKKworICByZXR1cm4gaW5pdF90eXBlIChUWVBFX0NPREVfRkxULCBuYnl0ZXMsIDAsIE5VTEwsIG9iamZpbGUpOworfQorCisvKiBSZWFkIGEgbnVtYmVyIGZyb20gdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5ICpQUC4KKyAgIFRoZSB2YWx1ZSBvZiAqUFAgaXMgYWR2YW5jZWQgb3ZlciB0aGUgbnVtYmVyLgorICAgSWYgRU5EIGlzIG5vbnplcm8sIHRoZSBjaGFyYWN0ZXIgdGhhdCBlbmRzIHRoZQorICAgbnVtYmVyIG11c3QgbWF0Y2ggRU5ELCBvciBhbiBlcnJvciBoYXBwZW5zOworICAgYW5kIHRoYXQgY2hhcmFjdGVyIGlzIHNraXBwZWQgaWYgaXQgZG9lcyBtYXRjaC4KKyAgIElmIEVORCBpcyB6ZXJvLCAqUFAgaXMgbGVmdCBwb2ludGluZyB0byB0aGF0IGNoYXJhY3Rlci4KKworICAgSWYgdGhlIG51bWJlciBmaXRzIGluIGEgbG9uZywgc2V0ICpCSVRTIHRvIDAgYW5kIHJldHVybiB0aGUgdmFsdWUuCisgICBJZiBub3QsIHNldCAqQklUUyB0byBiZSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG51bWJlciBhbmQgcmV0dXJuIDAuCisKKyAgIElmIGVuY291bnRlciBnYXJiYWdlLCBzZXQgKkJJVFMgdG8gLTEgYW5kIHJldHVybiAwLiAgKi8KKworc3RhdGljIGxvbmcKK3JlYWRfaHVnZV9udW1iZXIgKHBwLCBlbmQsIGJpdHMpCisgICAgIGNoYXIgKipwcDsKKyAgICAgaW50IGVuZDsKKyAgICAgaW50ICpiaXRzOworeworICBjaGFyICpwID0gKnBwOworICBpbnQgc2lnbiA9IDE7CisgIGxvbmcgbiA9IDA7CisgIGludCByYWRpeCA9IDEwOworICBjaGFyIG92ZXJmbG93ID0gMDsKKyAgaW50IG5iaXRzID0gMDsKKyAgaW50IGM7CisgIGxvbmcgdXBwZXJfbGltaXQ7CisgIAorICBpZiAoKnAgPT0gJy0nKQorICAgIHsKKyAgICAgIHNpZ24gPSAtMTsKKyAgICAgIHArKzsKKyAgICB9CisKKyAgLyogTGVhZGluZyB6ZXJvIG1lYW5zIG9jdGFsLiAgR0NDIHVzZXMgdGhpcyB0byBvdXRwdXQgdmFsdWVzIGxhcmdlcgorICAgICB0aGFuIGFuIGludCAoYmVjYXVzZSB0aGF0IHdvdWxkIGJlIGhhcmQgaW4gZGVjaW1hbCkuICAqLworICBpZiAoKnAgPT0gJzAnKQorICAgIHsKKyAgICAgIHJhZGl4ID0gODsKKyAgICAgIHArKzsKKyAgICB9CisKKyAgaWYgKG9zOWtfc3RhYnMpCisgICAgdXBwZXJfbGltaXQgPSBVTE9OR19NQVggLyByYWRpeDsKKyAgZWxzZQorICAgIHVwcGVyX2xpbWl0ID0gTE9OR19NQVggLyByYWRpeDsKKworICB3aGlsZSAoKGMgPSAqcCsrKSA+PSAnMCcgJiYgYyA8ICgnMCcgKyByYWRpeCkpCisgICAgeworICAgICAgaWYgKG4gPD0gdXBwZXJfbGltaXQpCisJeworCSAgbiAqPSByYWRpeDsKKwkgIG4gKz0gYyAtICcwJzsJCS8qIEZJWE1FIHRoaXMgb3ZlcmZsb3dzIGFueXdheSAqLworCX0KKyAgICAgIGVsc2UKKwlvdmVyZmxvdyA9IDE7CisgICAgICAKKyAgICAgIC8qIFRoaXMgZGVwZW5kcyBvbiBsYXJnZSB2YWx1ZXMgYmVpbmcgb3V0cHV0IGluIG9jdGFsLCB3aGljaCBpcworCSB3aGF0IEdDQyBkb2VzLiAqLworICAgICAgaWYgKHJhZGl4ID09IDgpCisJeworCSAgaWYgKG5iaXRzID09IDApCisJICAgIHsKKwkgICAgICBpZiAoYyA9PSAnMCcpCisJCS8qIElnbm9yZSBsZWFkaW5nIHplcm9lcy4gICovCisJCTsKKwkgICAgICBlbHNlIGlmIChjID09ICcxJykKKwkJbmJpdHMgPSAxOworCSAgICAgIGVsc2UgaWYgKGMgPT0gJzInIHx8IGMgPT0gJzMnKQorCQluYml0cyA9IDI7CisJICAgICAgZWxzZQorCQluYml0cyA9IDM7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgbmJpdHMgKz0gMzsKKwl9CisgICAgfQorICBpZiAoZW5kKQorICAgIHsKKyAgICAgIGlmIChjICYmIGMgIT0gZW5kKQorCXsKKwkgIGlmIChiaXRzICE9IE5VTEwpCisJICAgICpiaXRzID0gLTE7CisJICByZXR1cm4gMDsKKwl9CisgICAgfQorICBlbHNlCisgICAgLS1wOworCisgICpwcCA9IHA7CisgIGlmIChvdmVyZmxvdykKKyAgICB7CisgICAgICBpZiAobmJpdHMgPT0gMCkKKwl7CisJICAvKiBMYXJnZSBkZWNpbWFsIGNvbnN0YW50cyBhcmUgYW4gZXJyb3IgKGJlY2F1c2UgaXQgaXMgaGFyZCB0bworCSAgICAgY291bnQgaG93IG1hbnkgYml0cyBhcmUgaW4gdGhlbSkuICAqLworCSAgaWYgKGJpdHMgIT0gTlVMTCkKKwkgICAgKmJpdHMgPSAtMTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIAorICAgICAgLyogLTB4N2YgaXMgdGhlIHNhbWUgYXMgMHg4MC4gIFNvIGRlYWwgd2l0aCBpdCBieSBhZGRpbmcgb25lIHRvCisJIHRoZSBudW1iZXIgb2YgYml0cy4gICovCisgICAgICBpZiAoc2lnbiA9PSAtMSkKKwkrK25iaXRzOworICAgICAgaWYgKGJpdHMpCisJKmJpdHMgPSBuYml0czsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoYml0cykKKwkqYml0cyA9IDA7CisgICAgICByZXR1cm4gbiAqIHNpZ247CisgICAgfQorICAvKiBJdCdzICpCSVRTIHdoaWNoIGhhcyB0aGUgaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24uICAqLworICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0eXBlICoKK3JlYWRfcmFuZ2VfdHlwZSAocHAsIHR5cGVudW1zLCBvYmpmaWxlKQorICAgICBjaGFyICoqcHA7CisgICAgIGludCB0eXBlbnVtc1syXTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIGNoYXIgKm9yaWdfcHAgPSAqcHA7CisgIGludCByYW5nZW51bXNbMl07CisgIGxvbmcgbjIsIG4zOworICBpbnQgbjJiaXRzLCBuM2JpdHM7CisgIGludCBzZWxmX3N1YnJhbmdlOworICBzdHJ1Y3QgdHlwZSAqcmVzdWx0X3R5cGU7CisgIHN0cnVjdCB0eXBlICppbmRleF90eXBlID0gTlVMTDsKKworICAvKiBGaXJzdCBjb21lcyBhIHR5cGUgd2UgYXJlIGEgc3VicmFuZ2Ugb2YuCisgICAgIEluIEMgaXQgaXMgdXN1YWxseSAwLCAxIG9yIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuICAqLworICBpZiAocmVhZF90eXBlX251bWJlciAocHAsIHJhbmdlbnVtcykgIT0gMCkKKyAgICByZXR1cm4gZXJyb3JfdHlwZSAocHAsIG9iamZpbGUpOworICBzZWxmX3N1YnJhbmdlID0gKHJhbmdlbnVtc1swXSA9PSB0eXBlbnVtc1swXSAmJgorCQkgICByYW5nZW51bXNbMV0gPT0gdHlwZW51bXNbMV0pOworCisgIGlmICgqKnBwID09ICc9JykKKyAgICB7CisgICAgICAqcHAgPSBvcmlnX3BwOworICAgICAgaW5kZXhfdHlwZSA9IHJlYWRfdHlwZSAocHAsIG9iamZpbGUpOworICAgIH0KKworICAvKiBBIHNlbWljb2xvbiBzaG91bGQgbm93IGZvbGxvdzsgc2tpcCBpdC4gICovCisgIGlmICgqKnBwID09ICc7JykKKyAgICAoKnBwKSsrOworCisgIC8qIFRoZSByZW1haW5pbmcgdHdvIG9wZXJhbmRzIGFyZSB1c3VhbGx5IGxvd2VyIGFuZCB1cHBlciBib3VuZHMKKyAgICAgb2YgdGhlIHJhbmdlLiAgQnV0IGluIHNvbWUgc3BlY2lhbCBjYXNlcyB0aGV5IG1lYW4gc29tZXRoaW5nIGVsc2UuICAqLworICBuMiA9IHJlYWRfaHVnZV9udW1iZXIgKHBwLCAnOycsICZuMmJpdHMpOworICBuMyA9IHJlYWRfaHVnZV9udW1iZXIgKHBwLCAnOycsICZuM2JpdHMpOworCisgIGlmIChuMmJpdHMgPT0gLTEgfHwgbjNiaXRzID09IC0xKQorICAgIHJldHVybiBlcnJvcl90eXBlIChwcCwgb2JqZmlsZSk7CisKKyAgaWYgKGluZGV4X3R5cGUpCisgICAgZ290byBoYW5kbGVfdHJ1ZV9yYW5nZTsKKworICAvKiBJZiBsaW1pdHMgYXJlIGh1Z2UsIG11c3QgYmUgbGFyZ2UgaW50ZWdyYWwgdHlwZS4gICovCisgIGlmIChuMmJpdHMgIT0gMCB8fCBuM2JpdHMgIT0gMCkKKyAgICB7CisgICAgICBjaGFyIGdvdF9zaWduZWQgPSAwOworICAgICAgY2hhciBnb3RfdW5zaWduZWQgPSAwOworICAgICAgLyogTnVtYmVyIG9mIGJpdHMgaW4gdGhlIHR5cGUuICAqLworICAgICAgaW50IG5iaXRzID0gMDsKKworICAgICAgLyogUmFuZ2UgZnJvbSAwIHRvIDxsYXJnZSBudW1iZXI+IGlzIGFuIHVuc2lnbmVkIGxhcmdlIGludGVncmFsIHR5cGUuICAqLworICAgICAgaWYgKChuMmJpdHMgPT0gMCAmJiBuMiA9PSAwKSAmJiBuM2JpdHMgIT0gMCkKKwl7CisJICBnb3RfdW5zaWduZWQgPSAxOworCSAgbmJpdHMgPSBuM2JpdHM7CisJfQorICAgICAgLyogUmFuZ2UgZnJvbSA8bGFyZ2UgbnVtYmVyPiB0byA8bGFyZ2UgbnVtYmVyPi0xIGlzIGEgbGFyZ2Ugc2lnbmVkCisJIGludGVncmFsIHR5cGUuICBUYWtlIGNhcmUgb2YgdGhlIGNhc2Ugd2hlcmUgPGxhcmdlIG51bWJlcj4gZG9lc24ndAorCSBmaXQgaW4gYSBsb25nIGJ1dCA8bGFyZ2UgbnVtYmVyPi0xIGRvZXMuICAqLworICAgICAgZWxzZSBpZiAoKG4yYml0cyAhPSAwICYmIG4zYml0cyAhPSAwICYmIG4yYml0cyA9PSBuM2JpdHMgKyAxKQorCSAgICAgICB8fCAobjJiaXRzICE9IDAgJiYgbjNiaXRzID09IDAKKwkJICAgJiYgKG4yYml0cyA9PSBzaXplb2YgKGxvbmcpICogSE9TVF9DSEFSX0JJVCkKKwkJICAgJiYgbjMgPT0gTE9OR19NQVgpKQorCXsKKwkgIGdvdF9zaWduZWQgPSAxOworCSAgbmJpdHMgPSBuMmJpdHM7CisJfQorCisgICAgICBpZiAoZ290X3NpZ25lZCB8fCBnb3RfdW5zaWduZWQpCisJeworCSAgcmV0dXJuIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgbmJpdHMgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCQkgICAgZ290X3Vuc2lnbmVkID8gVFlQRV9GTEFHX1VOU0lHTkVEIDogMCwgTlVMTCwKKwkJCSAgICBvYmpmaWxlKTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIGVycm9yX3R5cGUgKHBwLCBvYmpmaWxlKTsKKyAgICB9CisKKyAgLyogQSB0eXBlIGRlZmluZWQgYXMgYSBzdWJyYW5nZSBvZiBpdHNlbGYsIHdpdGggYm91bmRzIGJvdGggMCwgaXMgdm9pZC4gICovCisgIGlmIChzZWxmX3N1YnJhbmdlICYmIG4yID09IDAgJiYgbjMgPT0gMCkKKyAgICByZXR1cm4gaW5pdF90eXBlIChUWVBFX0NPREVfVk9JRCwgMSwgMCwgTlVMTCwgb2JqZmlsZSk7CisKKyAgLyogSWYgbjMgaXMgemVybyBhbmQgbjIgaXMgcG9zaXRpdmUsIHdlIHdhbnQgYSBmbG9hdGluZyB0eXBlLCBhbmQgbjIKKyAgICAgaXMgdGhlIHdpZHRoIGluIGJ5dGVzLgorCisgICAgIEZvcnRyYW4gcHJvZ3JhbXMgYXBwZWFyIHRvIHVzZSB0aGlzIGZvciBjb21wbGV4IHR5cGVzIGFsc28uICBUbworICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIGZsb2F0cyBhbmQgY29tcGxleCwgZzc3IChhbmQgb3RoZXJzPykgIHNlZW0KKyAgICAgdG8gdXNlIHNlbGYtc3VicmFuZ2VzIGZvciB0aGUgY29tcGxleGVzLCBhbmQgc3VicmFuZ2VzIG9mIGludCBmb3IKKyAgICAgdGhlIGZsb2F0cy4KKworICAgICBBbHNvIG5vdGUgdGhhdCBmb3IgY29tcGxleGVzLCBnNzcgc2V0cyBuMiB0byB0aGUgc2l6ZSBvZiBvbmUgb2YKKyAgICAgdGhlIG1lbWJlciBmbG9hdHMsIG5vdCB0aGUgd2hvbGUgY29tcGxleCBiZWFzdC4gIE15IGd1ZXNzIGlzIHRoYXQKKyAgICAgdGhpcyB3YXMgdG8gd29yayB3ZWxsIHdpdGggcHJlLUNPTVBMRVggdmVyc2lvbnMgb2YgZ2RiLiAqLworCisgIGlmIChuMyA9PSAwICYmIG4yID4gMCkKKyAgICB7CisgICAgICBpZiAoc2VsZl9zdWJyYW5nZSkKKwl7CisJICByZXR1cm4gaW5pdF90eXBlIChUWVBFX0NPREVfQ09NUExFWCwgMiAqIG4yLCAwLCBOVUxMLCBvYmpmaWxlKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcmV0dXJuIGluaXRfdHlwZSAoVFlQRV9DT0RFX0ZMVCwgbjIsIDAsIE5VTEwsIG9iamZpbGUpOworCX0KKyAgICB9CisKKyAgLyogSWYgdGhlIHVwcGVyIGJvdW5kIGlzIC0xLCBpdCBtdXN0IHJlYWxseSBiZSBhbiB1bnNpZ25lZCBpbnQuICAqLworCisgIGVsc2UgaWYgKG4yID09IDAgJiYgbjMgPT0gLTEpCisgICAgeworICAgICAgLyogSXQgaXMgdW5zaWduZWQgaW50IG9yIHVuc2lnbmVkIGxvbmcuICAqLworICAgICAgLyogR0NDIDIuMy4zIHVzZXMgdGhpcyBmb3IgbG9uZyBsb25nIHRvbywgYnV0IHRoYXQgaXMganVzdCBhIEdEQiAzLjUKKwkgY29tcGF0aWJpbGl0eSBoYWNrLiAgKi8KKyAgICAgIHJldHVybiBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIFRBUkdFVF9JTlRfQklUIC8gVEFSR0VUX0NIQVJfQklULAorCQkJVFlQRV9GTEFHX1VOU0lHTkVELCBOVUxMLCBvYmpmaWxlKTsKKyAgICB9CisKKyAgLyogU3BlY2lhbCBjYXNlOiBjaGFyIGlzIGRlZmluZWQgKFdobyBrbm93cyB3aHkpIGFzIGEgc3VicmFuZ2Ugb2YKKyAgICAgaXRzZWxmIHdpdGggcmFuZ2UgMC0xMjcuICAqLworICBlbHNlIGlmIChzZWxmX3N1YnJhbmdlICYmIG4yID09IDAgJiYgbjMgPT0gMTI3KQorICAgIHJldHVybiBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDEsIDAsIE5VTEwsIG9iamZpbGUpOworCisgIGVsc2UgaWYgKGN1cnJlbnRfc3ltYm9sICYmIFNZTUJPTF9MQU5HVUFHRSAoY3VycmVudF9zeW1ib2wpID09IGxhbmd1YWdlX2NoaWxsCisJICAgJiYgIXNlbGZfc3VicmFuZ2UpCisgICAgZ290byBoYW5kbGVfdHJ1ZV9yYW5nZTsKKworICAvKiBXZSB1c2VkIHRvIGRvIHRoaXMgb25seSBmb3Igc3VicmFuZ2Ugb2Ygc2VsZiBvciBzdWJyYW5nZSBvZiBpbnQuICAqLworICBlbHNlIGlmIChuMiA9PSAwKQorICAgIHsKKyAgICAgIGlmIChuMyA8IDApCisJLyogbjMgYWN0dWFsbHkgZ2l2ZXMgdGhlIHNpemUuICAqLworCXJldHVybiBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIC0gbjMsIFRZUEVfRkxBR19VTlNJR05FRCwKKwkJCSAgTlVMTCwgb2JqZmlsZSk7CisgICAgICBpZiAobjMgPT0gMHhmZikKKwlyZXR1cm4gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCAxLCBUWVBFX0ZMQUdfVU5TSUdORUQsIE5VTEwsIG9iamZpbGUpOworICAgICAgaWYgKG4zID09IDB4ZmZmZikKKwlyZXR1cm4gaW5pdF90eXBlIChUWVBFX0NPREVfSU5ULCAyLCBUWVBFX0ZMQUdfVU5TSUdORUQsIE5VTEwsIG9iamZpbGUpOworCisgICAgICAvKiAtMSBpcyB1c2VkIGZvciB0aGUgdXBwZXIgYm91bmQgb2YgKDQgYnl0ZSkgInVuc2lnbmVkIGludCIgYW5kCisJICJ1bnNpZ25lZCBsb25nIiwgYW5kIHdlIGFscmVhZHkgY2hlY2tlZCBmb3IgdGhhdCwKKwkgc28gZG9uJ3QgbmVlZCB0byB0ZXN0IGZvciBpdCBoZXJlLiAgKi8KKyAgICB9CisgIC8qIEkgdGhpbmsgdGhpcyBpcyBmb3IgQ29udmV4ICJsb25nIGxvbmciLiAgU2luY2UgSSBkb24ndCBrbm93IHdoZXRoZXIKKyAgICAgQ29udmV4IHNldHMgc2VsZl9zdWJyYW5nZSwgSSBhbHNvIGFjY2VwdCB0aGF0IHBhcnRpY3VsYXIgc2l6ZSByZWdhcmRsZXNzCisgICAgIG9mIHNlbGZfc3VicmFuZ2UuICAqLworICBlbHNlIGlmIChuMyA9PSAwICYmIG4yIDwgMAorCSAgICYmIChzZWxmX3N1YnJhbmdlCisJICAgICAgIHx8IG4yID09IC0gVEFSR0VUX0xPTkdfTE9OR19CSVQgLyBUQVJHRVRfQ0hBUl9CSVQpKQorICAgIHJldHVybiBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIC0gbjIsIDAsIE5VTEwsIG9iamZpbGUpOworICBlbHNlIGlmIChuMiA9PSAtbjMgLTEpCisgICAgeworICAgICAgaWYgKG4zID09IDB4N2YpCisJcmV0dXJuIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgMSwgMCwgTlVMTCwgb2JqZmlsZSk7CisgICAgICBpZiAobjMgPT0gMHg3ZmZmKQorCXJldHVybiBpbml0X3R5cGUgKFRZUEVfQ09ERV9JTlQsIDIsIDAsIE5VTEwsIG9iamZpbGUpOworICAgICAgaWYgKG4zID09IDB4N2ZmZmZmZmYpCisJcmV0dXJuIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgNCwgMCwgTlVMTCwgb2JqZmlsZSk7CisgICAgfQorCisgIC8qIFdlIGhhdmUgYSByZWFsIHJhbmdlIHR5cGUgb24gb3VyIGhhbmRzLiAgQWxsb2NhdGUgc3BhY2UgYW5kCisgICAgIHJldHVybiBhIHJlYWwgcG9pbnRlci4gICovCisgaGFuZGxlX3RydWVfcmFuZ2U6CisKKyAgaWYgKHNlbGZfc3VicmFuZ2UpCisgICAgaW5kZXhfdHlwZSA9IGJ1aWx0aW5fdHlwZV9pbnQ7CisgIGVsc2UKKyAgICBpbmRleF90eXBlID0gKmRieF9sb29rdXBfdHlwZSAocmFuZ2VudW1zKTsKKyAgaWYgKGluZGV4X3R5cGUgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBEb2VzIHRoaXMgYWN0dWFsbHkgZXZlciBoYXBwZW4/ICBJcyB0aGF0IHdoeSB3ZSBhcmUgd29ycnlpbmcKKyAgICAgICAgIGFib3V0IGRlYWxpbmcgd2l0aCBpdCByYXRoZXIgdGhhbiBqdXN0IGNhbGxpbmcgZXJyb3JfdHlwZT8gICovCisKKyAgICAgIHN0YXRpYyBzdHJ1Y3QgdHlwZSAqcmFuZ2VfdHlwZV9pbmRleDsKKworICAgICAgY29tcGxhaW4gKCZyYW5nZV90eXBlX2Jhc2VfY29tcGxhaW50LCByYW5nZW51bXNbMV0pOworICAgICAgaWYgKHJhbmdlX3R5cGVfaW5kZXggPT0gTlVMTCkKKwlyYW5nZV90eXBlX2luZGV4ID0KKwkgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgVEFSR0VUX0lOVF9CSVQgLyBUQVJHRVRfQ0hBUl9CSVQsCisJCSAgICAgMCwgInJhbmdlIHR5cGUgaW5kZXggdHlwZSIsIE5VTEwpOworICAgICAgaW5kZXhfdHlwZSA9IHJhbmdlX3R5cGVfaW5kZXg7CisgICAgfQorCisgIHJlc3VsdF90eXBlID0gY3JlYXRlX3JhbmdlX3R5cGUgKChzdHJ1Y3QgdHlwZSAqKSBOVUxMLCBpbmRleF90eXBlLCBuMiwgbjMpOworICByZXR1cm4gKHJlc3VsdF90eXBlKTsKK30KKworLyogUmVhZCBpbiBhbiBhcmd1bWVudCBsaXN0LiAgVGhpcyBpcyBhIGxpc3Qgb2YgdHlwZXMsIHNlcGFyYXRlZCBieSBjb21tYXMKKyAgIGFuZCB0ZXJtaW5hdGVkIHdpdGggRU5ELiAgUmV0dXJuIHRoZSBsaXN0IG9mIHR5cGVzIHJlYWQgaW4sIG9yIChzdHJ1Y3QgdHlwZQorICAgKiopLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3IuICAqLworCitzdGF0aWMgc3RydWN0IHR5cGUgKioKK3JlYWRfYXJncyAocHAsIGVuZCwgb2JqZmlsZSkKKyAgICAgY2hhciAqKnBwOworICAgICBpbnQgZW5kOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgLyogRklYTUUhICBSZW1vdmUgdGhpcyBhcmJpdHJhcnkgbGltaXQhICAqLworICBzdHJ1Y3QgdHlwZSAqdHlwZXNbMTAyNF0sICoqcnZhbDsgLyogYWxsb3cgZm9yIGZucyBvZiAxMDIzIHBhcmFtZXRlcnMgKi8KKyAgaW50IG4gPSAwOworCisgIHdoaWxlICgqKnBwICE9IGVuZCkKKyAgICB7CisgICAgICBpZiAoKipwcCAhPSAnLCcpCisJLyogSW52YWxpZCBhcmd1bWVudCBsaXN0OiBubyAnLCcuICAqLworCXJldHVybiAoc3RydWN0IHR5cGUgKiopLTE7CisgICAgICAoKnBwKSsrOworICAgICAgU1RBQlNfQ09OVElOVUUgKHBwLCBvYmpmaWxlKTsKKyAgICAgIHR5cGVzW24rK10gPSByZWFkX3R5cGUgKHBwLCBvYmpmaWxlKTsKKyAgICB9CisgICgqcHApKys7CQkJLyogZ2V0IHBhc3QgYGVuZCcgKHRoZSAnOicgY2hhcmFjdGVyKSAqLworCisgIGlmIChuID09IDEpCisgICAgeworICAgICAgcnZhbCA9IChzdHJ1Y3QgdHlwZSAqKikgeG1hbGxvYyAoMiAqIHNpemVvZiAoc3RydWN0IHR5cGUgKikpOworICAgIH0KKyAgZWxzZSBpZiAoVFlQRV9DT0RFICh0eXBlc1tuLTFdKSAhPSBUWVBFX0NPREVfVk9JRCkKKyAgICB7CisgICAgICBydmFsID0gKHN0cnVjdCB0eXBlICoqKSB4bWFsbG9jICgobiArIDEpICogc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSk7CisgICAgICBtZW1zZXQgKHJ2YWwgKyBuLCAwLCBzaXplb2YgKHN0cnVjdCB0eXBlICopKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBydmFsID0gKHN0cnVjdCB0eXBlICoqKSB4bWFsbG9jIChuICogc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSk7CisgICAgfQorICBtZW1jcHkgKHJ2YWwsIHR5cGVzLCBuICogc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSk7CisgIHJldHVybiBydmFsOworfQorDAorLyogQ29tbW9uIGJsb2NrIGhhbmRsaW5nLiAgKi8KKworLyogTGlzdCBvZiBzeW1ib2xzIGRlY2xhcmVkIHNpbmNlIHRoZSBsYXN0IEJDT01NLiAgVGhpcyBsaXN0IGlzIGEgdGFpbAorICAgb2YgbG9jYWxfc3ltYm9scy4gIFdoZW4gRUNPTU0gaXMgc2VlbiwgdGhlIHN5bWJvbHMgb24gdGhlIGxpc3QKKyAgIGFyZSBub3RlZCBzbyB0aGVpciBwcm9wZXIgYWRkcmVzc2VzIGNhbiBiZSBmaWxsZWQgaW4gbGF0ZXIsCisgICB1c2luZyB0aGUgY29tbW9uIGJsb2NrIGJhc2UgYWRkcmVzcyBnb3R0ZW4gZnJvbSB0aGUgYXNzZW1ibGVyCisgICBzdGFicy4gICovCisKK3N0YXRpYyBzdHJ1Y3QgcGVuZGluZyAqY29tbW9uX2Jsb2NrOworc3RhdGljIGludCBjb21tb25fYmxvY2tfaTsKKworLyogTmFtZSBvZiB0aGUgY3VycmVudCBjb21tb24gYmxvY2suICBXZSBnZXQgaXQgZnJvbSB0aGUgQkNPTU0gaW5zdGVhZCBvZiB0aGUKKyAgIEVDT01NIHRvIG1hdGNoIElCTSBkb2N1bWVudGF0aW9uIChldmVuIHRob3VnaCBJQk0gcHV0cyB0aGUgbmFtZSBib3RoIHBsYWNlcworICAgbGlrZSBldmVyeW9uZSBlbHNlKS4gICovCitzdGF0aWMgY2hhciAqY29tbW9uX2Jsb2NrX25hbWU7CisKKy8qIFByb2Nlc3MgYSBOX0JDT01NIHN5bWJvbC4gIFRoZSBzdG9yYWdlIGZvciBOQU1FIGlzIG5vdCBndWFyYW50ZWVkCisgICB0byByZW1haW4gYWZ0ZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zLiAgKi8KKwordm9pZAorY29tbW9uX2Jsb2NrX3N0YXJ0IChuYW1lLCBvYmpmaWxlKQorICAgICBjaGFyICpuYW1lOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaWYgKGNvbW1vbl9ibG9ja19uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgbXNnID0geworCSJJbnZhbGlkIHN5bWJvbCBkYXRhOiBjb21tb24gYmxvY2sgd2l0aGluIGNvbW1vbiBibG9jayIsCisJMCwgMH07CisgICAgICBjb21wbGFpbiAoJm1zZyk7CisgICAgfQorICBjb21tb25fYmxvY2sgPSBsb2NhbF9zeW1ib2xzOworICBjb21tb25fYmxvY2tfaSA9IGxvY2FsX3N5bWJvbHMgPyBsb2NhbF9zeW1ib2xzLT5uc3ltcyA6IDA7CisgIGNvbW1vbl9ibG9ja19uYW1lID0gb2JzYXZlc3RyaW5nIChuYW1lLCBzdHJsZW4gKG5hbWUpLAorCQkJCSAgICAmb2JqZmlsZSAtPiBzeW1ib2xfb2JzdGFjayk7Cit9CisKKy8qIFByb2Nlc3MgYSBOX0VDT01NIHN5bWJvbC4gICovCisKK3ZvaWQKK2NvbW1vbl9ibG9ja19lbmQgKG9iamZpbGUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICAvKiBTeW1ib2xzIGRlY2xhcmVkIHNpbmNlIHRoZSBCQ09NTSBhcmUgdG8gaGF2ZSB0aGUgY29tbW9uIGJsb2NrCisgICAgIHN0YXJ0IGFkZHJlc3MgYWRkZWQgaW4gd2hlbiB3ZSBrbm93IGl0LiAgY29tbW9uX2Jsb2NrIGFuZAorICAgICBjb21tb25fYmxvY2tfaSBwb2ludCB0byB0aGUgZmlyc3Qgc3ltYm9sIGFmdGVyIHRoZSBCQ09NTSBpbgorICAgICB0aGUgbG9jYWxfc3ltYm9scyBsaXN0OyBjb3B5IHRoZSBsaXN0IGFuZCBoYW5nIGl0IG9mZiB0aGUKKyAgICAgc3ltYm9sIGZvciB0aGUgY29tbW9uIGJsb2NrIG5hbWUgZm9yIGxhdGVyIGZpeHVwLiAgKi8KKyAgaW50IGk7CisgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgc3RydWN0IHBlbmRpbmcgKm5ldyA9IDA7CisgIHN0cnVjdCBwZW5kaW5nICpuZXh0OworICBpbnQgajsKKworICBpZiAoY29tbW9uX2Jsb2NrX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBzdGF0aWMgc3RydWN0IGNvbXBsYWludCBtc2cgPSB7IkVDT01NIHN5bWJvbCB1bm1hdGNoZWQgYnkgQkNPTU0iLCAwLCAwfTsKKyAgICAgIGNvbXBsYWluICgmbXNnKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc3ltID0gKHN0cnVjdCBzeW1ib2wgKikgCisgICAgb2JzdGFja19hbGxvYyAoJm9iamZpbGUgLT4gc3ltYm9sX29ic3RhY2ssIHNpemVvZiAoc3RydWN0IHN5bWJvbCkpOworICBtZW1zZXQgKHN5bSwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sKSk7CisgIC8qIE5vdGU6IGNvbW1vbl9ibG9ja19uYW1lIGFscmVhZHkgc2F2ZWQgb24gc3ltYm9sX29ic3RhY2sgKi8KKyAgU1lNQk9MX05BTUUgKHN5bSkgPSBjb21tb25fYmxvY2tfbmFtZTsKKyAgU1lNQk9MX0NMQVNTIChzeW0pID0gTE9DX0JMT0NLOworCisgIC8qIE5vdyB3ZSBjb3B5IGFsbCB0aGUgc3ltYm9scyB3aGljaCBoYXZlIGJlZW4gZGVmaW5lZCBzaW5jZSB0aGUgQkNPTU0uICAqLworCisgIC8qIENvcHkgYWxsIHRoZSBzdHJ1Y3QgcGVuZGluZ3MgYmVmb3JlIGNvbW1vbl9ibG9jay4gICovCisgIGZvciAobmV4dCA9IGxvY2FsX3N5bWJvbHM7CisgICAgICAgbmV4dCAhPSBOVUxMICYmIG5leHQgIT0gY29tbW9uX2Jsb2NrOworICAgICAgIG5leHQgPSBuZXh0LT5uZXh0KQorICAgIHsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBuZXh0LT5uc3ltczsgaisrKQorCWFkZF9zeW1ib2xfdG9fbGlzdCAobmV4dC0+c3ltYm9sW2pdLCAmbmV3KTsKKyAgICB9CisKKyAgLyogQ29weSBob3dldmVyIG11Y2ggb2YgQ09NTU9OX0JMT0NLIHdlIG5lZWQuICBJZiBDT01NT05fQkxPQ0sgaXMKKyAgICAgTlVMTCwgaXQgbWVhbnMgY29weSBhbGwgdGhlIGxvY2FsIHN5bWJvbHMgKHdoaWNoIHdlIGFscmVhZHkgZGlkCisgICAgIGFib3ZlKS4gICovCisKKyAgaWYgKGNvbW1vbl9ibG9jayAhPSBOVUxMKQorICAgIGZvciAoaiA9IGNvbW1vbl9ibG9ja19pOyBqIDwgY29tbW9uX2Jsb2NrLT5uc3ltczsgaisrKQorICAgICAgYWRkX3N5bWJvbF90b19saXN0IChjb21tb25fYmxvY2stPnN5bWJvbFtqXSwgJm5ldyk7CisKKyAgU1lNQk9MX1RZUEUgKHN5bSkgPSAoc3RydWN0IHR5cGUgKikgbmV3OworCisgIC8qIFNob3VsZCB3ZSBiZSBwdXR0aW5nIGxvY2FsX3N5bWJvbHMgYmFjayB0byB3aGF0IGl0IHdhcz8KKyAgICAgRG9lcyBpdCBtYXR0ZXI/ICAqLworCisgIGkgPSBoYXNobmFtZSAoU1lNQk9MX05BTUUgKHN5bSkpOworICBTWU1CT0xfVkFMVUVfQ0hBSU4gKHN5bSkgPSBnbG9iYWxfc3ltX2NoYWluW2ldOworICBnbG9iYWxfc3ltX2NoYWluW2ldID0gc3ltOworICBjb21tb25fYmxvY2tfbmFtZSA9IE5VTEw7Cit9CisKKy8qIEFkZCBhIGNvbW1vbiBibG9jaydzIHN0YXJ0IGFkZHJlc3MgdG8gdGhlIG9mZnNldCBvZiBlYWNoIHN5bWJvbAorICAgZGVjbGFyZWQgdG8gYmUgaW4gaXQgKGJ5IGJlaW5nIGJldHdlZW4gYSBCQ09NTS9FQ09NTSBwYWlyIHRoYXQgdXNlcworICAgdGhlIGNvbW1vbiBibG9jayBuYW1lKS4gICovCisKK3N0YXRpYyB2b2lkCitmaXhfY29tbW9uX2Jsb2NrIChzeW0sIHZhbHUpCisgICAgc3RydWN0IHN5bWJvbCAqc3ltOworICAgIGludCB2YWx1OworeworICBzdHJ1Y3QgcGVuZGluZyAqbmV4dCA9IChzdHJ1Y3QgcGVuZGluZyAqKSBTWU1CT0xfVFlQRSAoc3ltKTsKKyAgZm9yICggOyBuZXh0OyBuZXh0ID0gbmV4dC0+bmV4dCkKKyAgICB7CisgICAgICByZWdpc3RlciBpbnQgajsKKyAgICAgIGZvciAoaiA9IG5leHQtPm5zeW1zIC0gMTsgaiA+PSAwOyBqLS0pCisJU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG5leHQtPnN5bWJvbFtqXSkgKz0gdmFsdTsKKyAgICB9Cit9CisKKworDAorLyogV2hhdCBhYm91dCB0eXBlcyBkZWZpbmVkIGFzIGZvcndhcmQgcmVmZXJlbmNlcyBpbnNpZGUgb2YgYSBzbWFsbCBsZXhpY2FsCisgICBzY29wZT8gICovCisvKiBBZGQgYSB0eXBlIHRvIHRoZSBsaXN0IG9mIHVuZGVmaW5lZCB0eXBlcyB0byBiZSBjaGVja2VkIHRocm91Z2gKKyAgIG9uY2UgdGhpcyBmaWxlIGhhcyBiZWVuIHJlYWQgaW4uICAqLworCit2b2lkCithZGRfdW5kZWZpbmVkX3R5cGUgKHR5cGUpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworeworICBpZiAodW5kZWZfdHlwZXNfbGVuZ3RoID09IHVuZGVmX3R5cGVzX2FsbG9jYXRlZCkKKyAgICB7CisgICAgICB1bmRlZl90eXBlc19hbGxvY2F0ZWQgKj0gMjsKKyAgICAgIHVuZGVmX3R5cGVzID0gKHN0cnVjdCB0eXBlICoqKQorCXhyZWFsbG9jICgoY2hhciAqKSB1bmRlZl90eXBlcywKKwkJICB1bmRlZl90eXBlc19hbGxvY2F0ZWQgKiBzaXplb2YgKHN0cnVjdCB0eXBlICopKTsKKyAgICB9CisgIHVuZGVmX3R5cGVzW3VuZGVmX3R5cGVzX2xlbmd0aCsrXSA9IHR5cGU7Cit9CisKKy8qIEdvIHRocm91Z2ggZWFjaCB1bmRlZmluZWQgdHlwZSwgc2VlIGlmIGl0J3Mgc3RpbGwgdW5kZWZpbmVkLCBhbmQgZml4IGl0CisgICB1cCBpZiBwb3NzaWJsZS4gIFdlIGhhdmUgdHdvIGtpbmRzIG9mIHVuZGVmaW5lZCB0eXBlczoKKworICAgVFlQRV9DT0RFX0FSUkFZOiAgQXJyYXkgd2hvc2UgdGFyZ2V0IHR5cGUgd2Fzbid0IGRlZmluZWQgeWV0LgorCQkJRml4OiAgdXBkYXRlIGFycmF5IGxlbmd0aCB1c2luZyB0aGUgZWxlbWVudCBib3VuZHMKKwkJCWFuZCB0aGUgdGFyZ2V0IHR5cGUncyBsZW5ndGguCisgICBUWVBFX0NPREVfU1RSVUNULCBUWVBFX0NPREVfVU5JT046ICBTdHJ1Y3R1cmUgd2hvc2UgZmllbGRzIHdlcmUgbm90CisJCQl5ZXQgZGVmaW5lZCBhdCB0aGUgdGltZSBhIHBvaW50ZXIgdG8gaXQgd2FzIG1hZGUuCisgICAJCQlGaXg6ICBEbyBhIGZ1bGwgbG9va3VwIG9uIHRoZSBzdHJ1Y3QvdW5pb24gdGFnLiAgKi8KK3ZvaWQKK2NsZWFudXBfdW5kZWZpbmVkX3R5cGVzICgpCit7CisgIHN0cnVjdCB0eXBlICoqdHlwZTsKKworICBmb3IgKHR5cGUgPSB1bmRlZl90eXBlczsgdHlwZSA8IHVuZGVmX3R5cGVzICsgdW5kZWZfdHlwZXNfbGVuZ3RoOyB0eXBlKyspCisgICAgeworICAgICAgc3dpdGNoIChUWVBFX0NPREUgKCp0eXBlKSkKKwl7CisKKwkgIGNhc2UgVFlQRV9DT0RFX1NUUlVDVDoKKwkgIGNhc2UgVFlQRV9DT0RFX1VOSU9OOgorCSAgY2FzZSBUWVBFX0NPREVfRU5VTToKKwkgIHsKKwkgICAgLyogQ2hlY2sgaWYgaXQgaGFzIGJlZW4gZGVmaW5lZCBzaW5jZS4gIE5lZWQgdG8gZG8gdGhpcyBoZXJlCisJICAgICAgIGFzIHdlbGwgYXMgaW4gY2hlY2tfdHlwZWRlZiB0byBkZWFsIHdpdGggdGhlIChsZWdpdGltYXRlIGluCisJICAgICAgIEMgdGhvdWdoIG5vdCBDKyspIGNhc2Ugb2Ygc2V2ZXJhbCB0eXBlcyB3aXRoIHRoZSBzYW1lIG5hbWUKKwkgICAgICAgaW4gZGlmZmVyZW50IHNvdXJjZSBmaWxlcy4gICovCisJICAgIGlmIChUWVBFX0ZMQUdTICgqdHlwZSkgJiBUWVBFX0ZMQUdfU1RVQikKKwkgICAgICB7CisJCXN0cnVjdCBwZW5kaW5nICpwcHQ7CisJCWludCBpOworCQkvKiBOYW1lIG9mIHRoZSB0eXBlLCB3aXRob3V0ICJzdHJ1Y3QiIG9yICJ1bmlvbiIgKi8KKwkJY2hhciAqdHlwZW5hbWUgPSBUWVBFX1RBR19OQU1FICgqdHlwZSk7CisKKwkJaWYgKHR5cGVuYW1lID09IE5VTEwpCisJCSAgeworCQkgICAgc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgbXNnID0geyJuZWVkIGEgdHlwZSBuYW1lIiwgMCwgMH07CisJCSAgICBjb21wbGFpbiAoJm1zZyk7CisJCSAgICBicmVhazsKKwkJICB9CisJCWZvciAocHB0ID0gZmlsZV9zeW1ib2xzOyBwcHQ7IHBwdCA9IHBwdC0+bmV4dCkKKwkJICB7CisJCSAgICBmb3IgKGkgPSAwOyBpIDwgcHB0LT5uc3ltczsgaSsrKQorCQkgICAgICB7CisJCQlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBwcHQtPnN5bWJvbFtpXTsKKwkJCQorCQkJaWYgKFNZTUJPTF9DTEFTUyAoc3ltKSA9PSBMT0NfVFlQRURFRgorCQkJICAgICYmIFNZTUJPTF9OQU1FU1BBQ0UgKHN5bSkgPT0gU1RSVUNUX05BTUVTUEFDRQorCQkJICAgICYmIChUWVBFX0NPREUgKFNZTUJPTF9UWVBFIChzeW0pKSA9PQorCQkJCVRZUEVfQ09ERSAoKnR5cGUpKQorCQkJICAgICYmIFNUUkVRIChTWU1CT0xfTkFNRSAoc3ltKSwgdHlwZW5hbWUpKQorCQkJICB7CisJCQkgICAgbWVtY3B5ICgqdHlwZSwgU1lNQk9MX1RZUEUgKHN5bSksCisJCQkJICAgIHNpemVvZiAoc3RydWN0IHR5cGUpKTsKKwkJCSAgfQorCQkgICAgICB9CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIHsKKwkgICAgc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgbXNnID0geyJcCitHREIgaW50ZXJuYWwgZXJyb3IuICBjbGVhbnVwX3VuZGVmaW5lZF90eXBlcyB3aXRoIGJhZCB0eXBlICVkLiIsIDAsIDB9OworCSAgICBjb21wbGFpbiAoJm1zZywgVFlQRV9DT0RFICgqdHlwZSkpOworCSAgfQorCSAgYnJlYWs7CisJfQorICAgIH0KKworICB1bmRlZl90eXBlc19sZW5ndGggPSAwOworfQorCisvKiBTY2FuIHRocm91Z2ggYWxsIG9mIHRoZSBnbG9iYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoZSBvYmplY3QgZmlsZSwKKyAgIGFzc2lnbmluZyB2YWx1ZXMgdG8gdGhlIGRlYnVnZ2luZyBzeW1ib2xzIHRoYXQgbmVlZCB0byBiZSBhc3NpZ25lZAorICAgdG8uICBHZXQgdGhlc2Ugc3ltYm9scyBmcm9tIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZS4gICovCisKK3ZvaWQKK3NjYW5fZmlsZV9nbG9iYWxzIChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaW50IGhhc2g7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbDsKKyAgc3RydWN0IHN5bWJvbCAqc3ltLCAqcHJldiwgKnJzeW07CisgIHN0cnVjdCBvYmpmaWxlICpyZXNvbHZlX29iamZpbGU7CisKKyAgLyogU1ZSNCBiYXNlZCBsaW5rZXJzIGNvcHkgcmVmZXJlbmNlZCBnbG9iYWwgc3ltYm9scyBmcm9tIHNoYXJlZAorICAgICBsaWJyYXJpZXMgdG8gdGhlIG1haW4gZXhlY3V0YWJsZS4KKyAgICAgSWYgd2UgYXJlIHNjYW5uaW5nIHRoZSBzeW1ib2xzIGZvciBhIHNoYXJlZCBsaWJyYXJ5LCB0cnkgdG8gcmVzb2x2ZQorICAgICB0aGVtIGZyb20gdGhlIG1pbmltYWwgc3ltYm9scyBvZiB0aGUgbWFpbiBleGVjdXRhYmxlIGZpcnN0LiAgKi8KKworICBpZiAoc3ltZmlsZV9vYmpmaWxlICYmIG9iamZpbGUgIT0gc3ltZmlsZV9vYmpmaWxlKQorICAgIHJlc29sdmVfb2JqZmlsZSA9IHN5bWZpbGVfb2JqZmlsZTsKKyAgZWxzZQorICAgIHJlc29sdmVfb2JqZmlsZSA9IG9iamZpbGU7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgLyogQXZvaWQgZXhwZW5zaXZlIGxvb3AgdGhyb3VnaCBhbGwgbWluaW1hbCBzeW1ib2xzIGlmIHRoZXJlIGFyZQorCSBubyB1bnJlc29sdmVkIHN5bWJvbHMuICAqLworICAgICAgZm9yIChoYXNoID0gMDsgaGFzaCA8IEhBU0hTSVpFOyBoYXNoKyspCisJeworCSAgaWYgKGdsb2JhbF9zeW1fY2hhaW5baGFzaF0pCisJICAgIGJyZWFrOworCX0KKyAgICAgIGlmIChoYXNoID49IEhBU0hTSVpFKQorCXJldHVybjsKKworICAgICAgZm9yIChtc3ltYm9sID0gcmVzb2x2ZV9vYmpmaWxlIC0+IG1zeW1ib2xzOworCSAgIG1zeW1ib2wgJiYgU1lNQk9MX05BTUUgKG1zeW1ib2wpICE9IE5VTEw7CisJICAgbXN5bWJvbCsrKQorCXsKKwkgIFFVSVQ7CisKKwkgIC8qIFNraXAgc3RhdGljIHN5bWJvbHMuICAqLworCSAgc3dpdGNoIChNU1lNQk9MX1RZUEUgKG1zeW1ib2wpKQorCSAgICB7CisJICAgIGNhc2UgbXN0X2ZpbGVfdGV4dDoKKwkgICAgY2FzZSBtc3RfZmlsZV9kYXRhOgorCSAgICBjYXNlIG1zdF9maWxlX2JzczoKKwkgICAgICBjb250aW51ZTsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICBwcmV2ID0gTlVMTDsKKworCSAgLyogR2V0IHRoZSBoYXNoIGluZGV4IGFuZCBjaGVjayBhbGwgdGhlIHN5bWJvbHMKKwkgICAgIHVuZGVyIHRoYXQgaGFzaCBpbmRleC4gKi8KKworCSAgaGFzaCA9IGhhc2huYW1lIChTWU1CT0xfTkFNRSAobXN5bWJvbCkpOworCisJICBmb3IgKHN5bSA9IGdsb2JhbF9zeW1fY2hhaW5baGFzaF07IHN5bTspCisJICAgIHsKKwkgICAgICBpZiAoU1lNQk9MX05BTUUgKG1zeW1ib2wpWzBdID09IFNZTUJPTF9OQU1FIChzeW0pWzBdICYmCisJCSAgU1RSRVEoU1lNQk9MX05BTUUgKG1zeW1ib2wpICsgMSwgU1lNQk9MX05BTUUgKHN5bSkgKyAxKSkKKwkJeworCisJCSAgc3RydWN0IGFsaWFzX2xpc3QgKmFsaWFzZXM7CisKKwkJICAvKiBTcGxpY2UgdGhpcyBzeW1ib2wgb3V0IG9mIHRoZSBoYXNoIGNoYWluIGFuZAorCQkgICAgIGFzc2lnbiB0aGUgdmFsdWUgd2UgaGF2ZSB0byBpdC4gKi8KKwkJICBpZiAocHJldikKKwkJICAgIHsKKwkJICAgICAgU1lNQk9MX1ZBTFVFX0NIQUlOIChwcmV2KSA9IFNZTUJPTF9WQUxVRV9DSEFJTiAoc3ltKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGdsb2JhbF9zeW1fY2hhaW5baGFzaF0gPSBTWU1CT0xfVkFMVUVfQ0hBSU4gKHN5bSk7CisJCSAgICB9CisJCSAgCisJCSAgLyogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgd2UgbmVlZCB0byBmaXggdXAgYSBjb21tb24gYmxvY2suICAqLworCQkgIC8qIE5vdGU6IHRoaXMgY29kZSBtaWdodCBiZSBleGVjdXRlZCBzZXZlcmFsIHRpbWVzIGZvcgorCQkgICAgIHRoZSBzYW1lIHN5bWJvbCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgcmVmZXJlbmNlcy4gICovCisKKwkJICAvKiBJZiBzeW1ib2wgaGFzIGFsaWFzZXMsIGRvIG1pbmltYWwgc3ltYm9sIGZpeHVwcyBmb3IgZWFjaC4KKwkJICAgICBUaGVzZSBsaXZlIGFsaWFzZXMvcmVmZXJlbmNlcyB3ZXJlbid0IGFkZGVkIHRvIAorCQkgICAgIGdsb2JhbF9zeW1fY2hhaW4gaGFzaCBidXQgbWF5IGFsc28gbmVlZCB0byBiZSBmaXhlZCB1cC4gKi8KKwkJICAvKiBGSVhNRTogTWF5YmUgc2hvdWxkIGhhdmUgYWRkZWQgYWxpYXNlcyB0byB0aGUgZ2xvYmFsIGNoYWluLAkJICAgICByZXNvbHZlZCBzeW1ib2wgbmFtZSwgdGhlbiB0cmVhdGVkIGFsaWFzZXMgYXMgbm9ybWFsIAorCQkgICAgIHN5bWJvbHM/ICBTdGlsbCwgd2Ugd291bGRuJ3Qgd2FudCB0byBhZGRfdG9fbGlzdC4gKi8KKwkJICAvKiBOb3cgZG8gdGhlIHNhbWUgZm9yIGVhY2ggYWxpYXMgb2YgdGhpcyBzeW1ib2wgKi8KKwkJICByc3ltID0gc3ltOworCQkgIGFsaWFzZXMgPSBTWU1CT0xfQUxJQVNFUyAoc3ltKTsKKwkJICB3aGlsZSAocnN5bSkKKwkJICAgIHsKKwkJICAgICAgaWYgKFNZTUJPTF9DTEFTUyAocnN5bSkgPT0gTE9DX0JMT0NLKQorCQkJeworCQkJICBmaXhfY29tbW9uX2Jsb2NrIChyc3ltLAorCQkJCQkgICAgU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpKTsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICBTWU1CT0xfVkFMVUVfQUREUkVTUyAocnN5bSkKKwkJCSAgICA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKTsKKwkJCX0KKwkJICAgICAgU1lNQk9MX1NFQ1RJT04gKHJzeW0pID0gU1lNQk9MX1NFQ1RJT04gKG1zeW1ib2wpOworCQkgICAgICBpZiAoYWxpYXNlcykKKwkJCXsKKwkJCSAgcnN5bSA9IGFsaWFzZXMtPnN5bTsKKwkJCSAgYWxpYXNlcyA9IGFsaWFzZXMtPm5leHQ7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXJzeW0gPSBOVUxMOworCQkgICAgfQorCisJCSAgCisJCSAgaWYgKHByZXYpCisJCSAgICB7CisJCSAgICAgIHN5bSA9IFNZTUJPTF9WQUxVRV9DSEFJTiAocHJldik7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBzeW0gPSBnbG9iYWxfc3ltX2NoYWluW2hhc2hdOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgcHJldiA9IHN5bTsKKwkJICBzeW0gPSBTWU1CT0xfVkFMVUVfQ0hBSU4gKHN5bSk7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGlmIChyZXNvbHZlX29iamZpbGUgPT0gb2JqZmlsZSkKKwlicmVhazsKKyAgICAgIHJlc29sdmVfb2JqZmlsZSA9IG9iamZpbGU7CisgICAgfQorCisgIC8qIENoYW5nZSB0aGUgc3RvcmFnZSBjbGFzcyBvZiBhbnkgcmVtYWluaW5nIHVucmVzb2x2ZWQgZ2xvYmFscyB0bworICAgICBMT0NfVU5SRVNPTFZFRCBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgY2hhaW4uICAqLworICBmb3IgKGhhc2ggPSAwOyBoYXNoIDwgSEFTSFNJWkU7IGhhc2grKykKKyAgICB7CisgICAgICBzeW0gPSBnbG9iYWxfc3ltX2NoYWluW2hhc2hdOworICAgICAgd2hpbGUgKHN5bSkKKwl7CisJICBwcmV2ID0gc3ltOworCSAgc3ltID0gU1lNQk9MX1ZBTFVFX0NIQUlOIChzeW0pOworCisJICAvKiBDaGFuZ2UgdGhlIHN5bWJvbCBhZGRyZXNzIGZyb20gdGhlIG1pc2xlYWRpbmcgY2hhaW4gdmFsdWUKKwkgICAgIHRvIGFkZHJlc3MgemVyby4gICovCisJICBTWU1CT0xfVkFMVUVfQUREUkVTUyAocHJldikgPSAwOworCisJICAvKiBDb21wbGFpbiBhYm91dCB1bnJlc29sdmVkIGNvbW1vbiBibG9jayBzeW1ib2xzLiAgKi8KKwkgIGlmIChTWU1CT0xfQ0xBU1MgKHByZXYpID09IExPQ19TVEFUSUMpCisJICAgIFNZTUJPTF9DTEFTUyAocHJldikgPSBMT0NfVU5SRVNPTFZFRDsKKwkgIGVsc2UKKwkgICAgY29tcGxhaW4gKCZ1bnJlc29sdmVkX3N5bV9jaGFpbl9jb21wbGFpbnQsCisJCSAgICAgIG9iamZpbGUgLT4gbmFtZSwgU1lNQk9MX05BTUUgKHByZXYpKTsKKwl9CisgICAgfQorICBtZW1zZXQgKGdsb2JhbF9zeW1fY2hhaW4sIDAsIHNpemVvZiAoZ2xvYmFsX3N5bV9jaGFpbikpOworfQorCisvKiBJbml0aWFsaXplIGFueXRoaW5nIHRoYXQgbmVlZHMgaW5pdGlhbGl6aW5nIHdoZW4gc3RhcnRpbmcgdG8gcmVhZAorICAgYSBmcmVzaCBwaWVjZSBvZiBhIHN5bWJvbCBmaWxlLCBlLmcuIHJlYWRpbmcgaW4gdGhlIHN0dWZmIGNvcnJlc3BvbmRpbmcKKyAgIHRvIGEgcHN5bXRhYi4gICovCisKK3ZvaWQKK3N0YWJzcmVhZF9pbml0ICgpCit7Cit9CisKKy8qIEluaXRpYWxpemUgYW55dGhpbmcgdGhhdCBuZWVkcyBpbml0aWFsaXppbmcgd2hlbiBhIGNvbXBsZXRlbHkgbmV3CisgICBzeW1ib2wgZmlsZSBpcyBzcGVjaWZpZWQgKG5vdCBqdXN0IGFkZGluZyBzb21lIHN5bWJvbHMgZnJvbSBhbm90aGVyCisgICBmaWxlLCBlLmcuIGEgc2hhcmVkIGxpYnJhcnkpLiAgKi8KKwordm9pZAorc3RhYnNyZWFkX25ld19pbml0ICgpCit7CisgIC8qIEVtcHR5IHRoZSBoYXNoIHRhYmxlIG9mIGdsb2JhbCBzeW1zIGxvb2tpbmcgZm9yIHZhbHVlcy4gICovCisgIG1lbXNldCAoZ2xvYmFsX3N5bV9jaGFpbiwgMCwgc2l6ZW9mIChnbG9iYWxfc3ltX2NoYWluKSk7Cit9CisKKy8qIEluaXRpYWxpemUgYW55dGhpbmcgdGhhdCBuZWVkcyBpbml0aWFsaXppbmcgYXQgdGhlIHNhbWUgdGltZSBhcworICAgc3RhcnRfc3ltdGFiKCkgaXMgY2FsbGVkLiAqLworCit2b2lkIHN0YXJ0X3N0YWJzICgpCit7CisgIGdsb2JhbF9zdGFicyA9IE5VTEw7CQkvKiBBSVggQ09GRiAqLworICAvKiBMZWF2ZSBGSUxFTlVNIG9mIDAgZnJlZSBmb3IgYnVpbHRpbiB0eXBlcyBhbmQgdGhpcyBmaWxlJ3MgdHlwZXMuICAqLworICBuX3RoaXNfb2JqZWN0X2hlYWRlcl9maWxlcyA9IDE7CisgIHR5cGVfdmVjdG9yX2xlbmd0aCA9IDA7CisgIHR5cGVfdmVjdG9yID0gKHN0cnVjdCB0eXBlICoqKSAwOworCisgIC8qIEZJWE1FOiBJZiBjb21tb25fYmxvY2tfbmFtZSBpcyBub3QgYWxyZWFkeSBOVUxMLCB3ZSBzaG91bGQgY29tcGxhaW4oKS4gICovCisgIGNvbW1vbl9ibG9ja19uYW1lID0gTlVMTDsKKworICBvczlrX3N0YWJzID0gMDsKK30KKworLyogQ2FsbCBhZnRlciBlbmRfc3ltdGFiKCkgKi8KKwordm9pZCBlbmRfc3RhYnMgKCkKK3sKKyAgaWYgKHR5cGVfdmVjdG9yKQorICAgIHsKKyAgICAgIGZyZWUgKChjaGFyICopIHR5cGVfdmVjdG9yKTsKKyAgICB9CisgIHR5cGVfdmVjdG9yID0gMDsKKyAgdHlwZV92ZWN0b3JfbGVuZ3RoID0gMDsKKyAgcHJldmlvdXNfc3RhYl9jb2RlID0gMDsKK30KKwordm9pZAorZmluaXNoX2dsb2JhbF9zdGFicyAob2JqZmlsZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIGlmIChnbG9iYWxfc3RhYnMpCisgICAgeworICAgICAgcGF0Y2hfYmxvY2tfc3RhYnMgKGdsb2JhbF9zeW1ib2xzLCBnbG9iYWxfc3RhYnMsIG9iamZpbGUpOworICAgICAgZnJlZSAoKFBUUikgZ2xvYmFsX3N0YWJzKTsKKyAgICAgIGdsb2JhbF9zdGFicyA9IE5VTEw7CisgICAgfQorfQorCisvKiBJbml0aWFsaXplciBmb3IgdGhpcyBtb2R1bGUgKi8KKwordm9pZAorX2luaXRpYWxpemVfc3RhYnNyZWFkICgpCit7CisgIHVuZGVmX3R5cGVzX2FsbG9jYXRlZCA9IDIwOworICB1bmRlZl90eXBlc19sZW5ndGggPSAwOworICB1bmRlZl90eXBlcyA9IChzdHJ1Y3QgdHlwZSAqKikKKyAgICB4bWFsbG9jICh1bmRlZl90eXBlc19hbGxvY2F0ZWQgKiBzaXplb2YgKHN0cnVjdCB0eXBlICopKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9zdGFic3JlYWQuaCBiL2dkYi9zdGFic3JlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2VhMjkxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3N0YWJzcmVhZC5oCkBAIC0wLDAgKzEsMjQ5IEBACisvKiBJbmNsdWRlIGZpbGUgZm9yIHN0YWJzIGRlYnVnZ2luZyBmb3JtYXQgc3VwcG9ydCBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgMTk4Ni0xOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIERlZmluaXRpb25zLCBwcm90b3R5cGVzLCBldGMgZm9yIHN0YWJzIGRlYnVnZ2luZyBmb3JtYXQgc3VwcG9ydAorICAgZnVuY3Rpb25zLgorCisgICBWYXJpYWJsZXMgZGVjbGFyZWQgaW4gdGhpcyBmaWxlIGNhbiBiZSBkZWZpbmVkIGJ5ICNkZWZpbmUtaW5nCisgICB0aGUgbmFtZSBFWFRFUk4gdG8gbnVsbC4gIEl0IGlzIHVzZWQgdG8gZGVjbGFyZSB2YXJpYWJsZXMgdGhhdAorICAgYXJlIG5vcm1hbGx5IGV4dGVybiwgYnV0IHdoaWNoIGdldCBkZWZpbmVkIGluIGEgc2luZ2xlIG1vZHVsZQorICAgdXNpbmcgdGhpcyB0ZWNobmlxdWUuICAqLworCisjaWZuZGVmIEVYVEVSTgorI2RlZmluZQlFWFRFUk4gZXh0ZXJuCisjZW5kaWYKKworLyogQ29udmVydCBzdGFiIHJlZ2lzdGVyIG51bWJlciAoZnJvbSBgcicgZGVjbGFyYXRpb24pIHRvIGEgZ2RiIFJFR05VTS4gICovCisKKyNpZm5kZWYgU1RBQl9SRUdfVE9fUkVHTlVNCisjZGVmaW5lIFNUQUJfUkVHX1RPX1JFR05VTShWQUxVRSkgKFZBTFVFKQorI2VuZGlmCisKKy8qIEhhc2ggdGFibGUgb2YgZ2xvYmFsIHN5bWJvbHMgd2hvc2UgdmFsdWVzIGFyZSBub3Qga25vd24geWV0LgorICAgVGhleSBhcmUgY2hhaW5lZCB0aHJ1IHRoZSBTWU1CT0xfVkFMVUVfQ0hBSU4sIHNpbmNlIHdlIGRvbid0CisgICBoYXZlIHRoZSBjb3JyZWN0IGRhdGEgZm9yIHRoYXQgc2xvdCB5ZXQuCisKKyAgIFRoZSB1c2Ugb2YgdGhlIExPQ19CTE9DSyBjb2RlIGluIHRoaXMgY2hhaW4gaXMgbm9uc3RhbmRhcmQtLQorICAgaXQgcmVmZXJzIHRvIGEgRk9SVFJBTiBjb21tb24gYmxvY2sgcmF0aGVyIHRoYW4gdGhlIHVzdWFsIG1lYW5pbmcsIGFuZAorICAgdGhlIHN1Y2ggTE9DX0JMT0NLIHN5bWJvbHMgdXNlIHRoZWlyIGZpZWxkcyBpbiBub25zdGFuZGFyZCB3YXlzLiAgKi8KKworRVhURVJOIHN0cnVjdCBzeW1ib2wgKmdsb2JhbF9zeW1fY2hhaW5bSEFTSFNJWkVdOworCitleHRlcm4gdm9pZCBjb21tb25fYmxvY2tfc3RhcnQgUEFSQU1TICgoY2hhciAqLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CitleHRlcm4gdm9pZCBjb21tb25fYmxvY2tfZW5kIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICopKTsKKworLyogS2x1ZGdlIGZvciB4Y29mZnJlYWQuYyAqLworCitzdHJ1Y3QgcGVuZGluZ19zdGFicworeworICBpbnQgY291bnQ7CisgIGludCBsZW5ndGg7CisgIGNoYXIgKnN0YWJbMV07Cit9OworCitFWFRFUk4gc3RydWN0IHBlbmRpbmdfc3RhYnMgKmdsb2JhbF9zdGFiczsKKworLyogVGhlIHR5cGUgY29kZSB0aGF0IHByb2Nlc3Nfb25lX3N5bWJvbCBzYXcgb24gaXRzIHByZXZpb3VzIGludm9jYXRpb24uCisgICBVc2VkIHRvIGRldGVjdCBwYWlycyBvZiBOX1NPIHN5bWJvbHMuICovCisKK0VYVEVSTiBpbnQgcHJldmlvdXNfc3RhYl9jb2RlOworDAorLyogU3VwcG9ydCBmb3IgU3VuIGNoYW5nZXMgdG8gZGJ4IHN5bWJvbCBmb3JtYXQgKi8KKworLyogRm9yIGVhY2ggaWRlbnRpZmllZCBoZWFkZXIgZmlsZSwgd2UgaGF2ZSBhIHRhYmxlIG9mIHR5cGVzIGRlZmluZWQKKyAgIGluIHRoYXQgaGVhZGVyIGZpbGUuCisKKyAgIGhlYWRlcl9maWxlcyBtYXBzIGhlYWRlciBmaWxlIG5hbWVzIHRvIHRoZWlyIHR5cGUgdGFibGVzLgorICAgSXQgaXMgYSB2ZWN0b3Igb2Ygbl9oZWFkZXJfZmlsZXMgZWxlbWVudHMuCisgICBFYWNoIGVsZW1lbnQgZGVzY3JpYmVzIG9uZSBoZWFkZXIgZmlsZS4KKyAgIEl0IGNvbnRhaW5zIGEgdmVjdG9yIG9mIHR5cGVzLgorCisgICBTb21ldGltZXMgaXQgY2FuIGhhcHBlbiB0aGF0IHRoZSBzYW1lIGhlYWRlciBmaWxlIHByb2R1Y2VzCisgICBkaWZmZXJlbnQgcmVzdWx0cyB3aGVuIGluY2x1ZGVkIGluIGRpZmZlcmVudCBwbGFjZXMuCisgICBUaGlzIGNhbiByZXN1bHQgZnJvbSBjb25kaXRpb25hbHMgb3IgZnJvbSBkaWZmZXJlbnQKKyAgIHRoaW5ncyBkb25lIGJlZm9yZSBpbmNsdWRpbmcgdGhlIGZpbGUuCisgICBXaGVuIHRoaXMgaGFwcGVucywgdGhlcmUgYXJlIG11bHRpcGxlIGVudHJpZXMgZm9yIHRoZSBmaWxlIGluIHRoaXMgdGFibGUsCisgICBvbmUgZW50cnkgZm9yIGVhY2ggZGlzdGluY3Qgc2V0IG9mIHJlc3VsdHMuCisgICBUaGUgZW50cmllcyBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgSU5TVEFOQ0UgZmllbGQuCisgICBUaGUgSU5TVEFOQ0UgZmllbGQgYXBwZWFycyBpbiB0aGUgTl9CSU5DTCBhbmQgTl9FWENMIHN5bWJvbCB0YWJsZSBhbmQgaXMKKyAgIHVzZWQgdG8gbWF0Y2ggaGVhZGVyLWZpbGUgcmVmZXJlbmNlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGRhdGEuICAqLworCitzdHJ1Y3QgaGVhZGVyX2ZpbGUKK3sKKworICAvKiBOYW1lIG9mIGhlYWRlciBmaWxlICovCisgIAorICBjaGFyICpuYW1lOworCisgIC8qIE51bWVyaWMgY29kZSBkaXN0aW5ndWlzaGluZyBpbnN0YW5jZXMgb2Ygb25lIGhlYWRlciBmaWxlIHRoYXQgcHJvZHVjZWQKKyAgICAgZGlmZmVyZW50IHJlc3VsdHMgd2hlbiBpbmNsdWRlZC4gIEl0IGNvbWVzIGZyb20gdGhlIE5fQklOQ0wgb3IgTl9FWENMLiAqLworCisgIGludCBpbnN0YW5jZTsKKworICAvKiBQb2ludGVyIHRvIHZlY3RvciBvZiB0eXBlcyAqLworCisgIHN0cnVjdCB0eXBlICoqdmVjdG9yOworCisgIC8qIEFsbG9jYXRlZCBsZW5ndGggKCMgZWx0cykgb2YgdGhhdCB2ZWN0b3IgKi8KKworICBpbnQgbGVuZ3RoOworCit9OworCisvKiBUaGUgdGFibGUgb2YgaGVhZGVyX2ZpbGVzIG9mIHRoaXMgT0JKRklMRS4gKi8KKyNkZWZpbmUgSEVBREVSX0ZJTEVTKE9CSkZJTEUpIChEQlhfU1lNRklMRV9JTkZPIChPQkpGSUxFKS0+aGVhZGVyX2ZpbGVzKQorCisvKiBUaGUgYWN0dWFsIGxlbmd0aCBvZiBIRUFERVJfRklMRVMuICovCisjZGVmaW5lIE5fSEVBREVSX0ZJTEVTKE9CSkZJTEUpIChEQlhfU1lNRklMRV9JTkZPIChPQkpGSUxFKS0+bl9oZWFkZXJfZmlsZXMpCisKKy8qIFRoZSBhbGxvY2F0ZWQgbGVuZ2ggb2YgSEVBREVSX0ZJTEVTLiAqLworI2RlZmluZSBOX0FMTE9DQVRFRF9IRUFERVJfRklMRVMoT0JKRklMRSkgXAorICAoREJYX1NZTUZJTEVfSU5GTyAoT0JKRklMRSktPm5fYWxsb2NhdGVkX2hlYWRlcl9maWxlcykKKworLyogV2l0aGluIGVhY2ggb2JqZWN0IGZpbGUsIHZhcmlvdXMgaGVhZGVyIGZpbGVzIGFyZSBhc3NpZ25lZCBudW1iZXJzLgorICAgQSB0eXBlIGlzIGRlZmluZWQgb3IgcmVmZXJyZWQgdG8gd2l0aCBhIHBhaXIgb2YgbnVtYmVycworICAgKEZJTEVOVU0sVFlQRU5VTSkgd2hlcmUgRklMRU5VTSBpcyB0aGUgbnVtYmVyIG9mIHRoZSBoZWFkZXIgZmlsZQorICAgYW5kIFRZUEVOVU0gaXMgdGhlIG51bWJlciB3aXRoaW4gdGhhdCBoZWFkZXIgZmlsZS4KKyAgIFRZUEVOVU0gaXMgdGhlIGluZGV4IHdpdGhpbiB0aGUgdmVjdG9yIG9mIHR5cGVzIGZvciB0aGF0IGhlYWRlciBmaWxlLgorCisgICBGSUxFTlVNID09IDAgaXMgc3BlY2lhbDsgaXQgcmVmZXJzIHRvIHRoZSBtYWluIHNvdXJjZSBvZiB0aGUgb2JqZWN0IGZpbGUsCisgICBhbmQgbm90IHRvIGFueSBoZWFkZXIgZmlsZS4gIEZJTEVOVU0gIT0gMSBpcyBpbnRlcnByZXRlZCBieSBsb29raW5nIGl0IHVwCisgICBpbiB0aGUgZm9sbG93aW5nIHRhYmxlLCB3aGljaCBjb250YWlucyBpbmRpY2VzIGluIGhlYWRlcl9maWxlcy4gICovCisKK0VYVEVSTiBpbnQgKnRoaXNfb2JqZWN0X2hlYWRlcl9maWxlczsKKworRVhURVJOIGludCBuX3RoaXNfb2JqZWN0X2hlYWRlcl9maWxlczsKKworRVhURVJOIGludCBuX2FsbG9jYXRlZF90aGlzX29iamVjdF9oZWFkZXJfZmlsZXM7CisKK2V4dGVybiBzdHJ1Y3QgY29tcGxhaW50IHVua25vd25fc3ltdHlwZV9jb21wbGFpbnQ7CitleHRlcm4gc3RydWN0IGNvbXBsYWludCB1bmtub3duX3N5bWNoYXJfY29tcGxhaW50OworCitleHRlcm4gc3RydWN0IHR5cGUgKgorcmVhZF90eXBlIFBBUkFNUyAoKGNoYXIgKiosIHN0cnVjdCBvYmpmaWxlICopKTsKKworZXh0ZXJuIHZvaWQKK2NsZWFudXBfdW5kZWZpbmVkX3R5cGVzIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHN0cnVjdCB0eXBlICoqCitkYnhfbG9va3VwX3R5cGUgUEFSQU1TICgoaW50IFsyXSkpOworCitleHRlcm4gbG9uZworcmVhZF9udW1iZXIgUEFSQU1TICgoY2hhciAqKiwgaW50KSk7CisKK2V4dGVybiB2b2lkCithZGRfdW5kZWZpbmVkX3R5cGUgUEFSQU1TICgoc3RydWN0IHR5cGUgKikpOworCitleHRlcm4gc3RydWN0IHN5bWJvbCAqCitkZWZpbmVfc3ltYm9sIFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqLCBpbnQsIGludCwgc3RydWN0IG9iamZpbGUgKikpOworCitleHRlcm4gdm9pZAorc3RhYnNyZWFkX2luaXQgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZAorc3RhYnNyZWFkX25ld19pbml0IFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQKK3N0YXJ0X3N0YWJzIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQKK2VuZF9zdGFicyBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkCitmaW5pc2hfZ2xvYmFsX3N0YWJzIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlKSk7CisKKwwKK0VYVEVSTiBpbnQgb3M5a19zdGFiczsKKwwKKy8qIENPRkYgZmlsZXMgY2FuIGhhdmUgbXVsdGlwbGUgLnN0YWIgc2VjdGlvbnMsIGlmIHRoZXkgYXJlIGxpbmtlZAorICAgdXNpbmcgLS1zcGxpdC1ieS1yZWxvYy4gIFRoaXMgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBwYXNzIHRoZQorICAgaW5mb3JtYXRpb24gaW50byB0aGUgZnVuY3Rpb25zIGluIGRieHJlYWQuYy4gICovCitzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2xpc3QKK3sKKyAgLyogTmV4dCBpbiBsaXN0LiAgKi8KKyAgc3RydWN0IHN0YWJfc2VjdGlvbl9saXN0ICpuZXh0OworCisgIC8qIFN0YWIgc2VjdGlvbi4gICovCisgIGFzZWN0aW9uICpzZWN0aW9uOworfTsKKwwKKy8qIEZ1bmN0aW9ucyBleHBvcnRlZCBieSBkYnhyZWFkLmMuICBUaGVzZSBhcmUgbm90IGluIHN0YWJzcmVhZC5jIGJlY2F1c2UKKyAgIHRoZXkgYXJlIG9ubHkgdXNlZCBieSBzb21lIHN0YWJzIHJlYWRlcnMuICAqLworCitleHRlcm4gc3RydWN0IHBhcnRpYWxfc3ltdGFiICoKK3N0YXJ0X3BzeW10YWIgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqLCBjaGFyICosCisJCSAgICAgICBDT1JFX0FERFIsIGludCwgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqLAorCQkgICAgICAgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqKSk7CisKK2V4dGVybiBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKgorZW5kX3BzeW10YWIgUEFSQU1TICgoc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3QsCisJCSAgICAgY2hhciAqKmluY2x1ZGVfbGlzdCwKKwkJICAgICBpbnQgbnVtX2luY2x1ZGVzLAorCQkgICAgIGludCBjYXBwaW5nX3N5bWJvbF9vZmZzZXQsCisJCSAgICAgQ09SRV9BRERSIGNhcHBpbmdfdGV4dCwKKwkJICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKipkZXBlbmRlbmN5X2xpc3QsCisJCSAgICAgaW50IG51bWJlcl9kZXBlbmRlbmNpZXMsCisJCSAgICAgaW50IHRleHRsb3dfbm90X3NldCkpOworCitleHRlcm4gdm9pZAorcHJvY2Vzc19vbmVfc3ltYm9sIFBBUkFNUyAoKGludCwgaW50LCBDT1JFX0FERFIsIGNoYXIgKiwKKwkJCSAgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworZXh0ZXJuIHZvaWQgZWxmc3RhYl9idWlsZF9wc3ltdGFicworICBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSwKKwkgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHMsCisJICAgaW50IG1haW5saW5lLAorCSAgIGZpbGVfcHRyIHN0YWJvZmYsIHVuc2lnbmVkIGludCBzdGFic2l6ZSwKKwkgICBmaWxlX3B0ciBzdGFic3Ryb2Zmc2V0LAorCSAgIHVuc2lnbmVkIGludCBzdGFic3Ryc2l6ZSkpOworCitleHRlcm4gdm9pZCBjb2Zmc3RhYl9idWlsZF9wc3ltdGFicworICBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZSwKKwkgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHMsCisJICAgaW50IG1haW5saW5lLAorCSAgIENPUkVfQUREUiB0ZXh0YWRkciwgdW5zaWduZWQgaW50IHRleHRzaXplLAorCSAgIHN0cnVjdCBzdGFiX3NlY3Rpb25fbGlzdCAqc3RhYnMsCisJICAgZmlsZV9wdHIgc3RhYnN0cm9mZnNldCwKKwkgICB1bnNpZ25lZCBpbnQgc3RhYnN0cnNpemUpKTsKKworZXh0ZXJuIHZvaWQgc3RhYnNlY3RfYnVpbGRfcHN5bXRhYnMKKyAgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKm9iamZpbGUsCisJICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzLAorCSAgIGludCBtYWlubGluZSwKKwkgICBjaGFyICpzdGFiX25hbWUsCisJICAgY2hhciAqc3RhYnN0cl9uYW1lLAorCSAgIGNoYXIgKnRleHRfbmFtZSkpOworCitleHRlcm4gdm9pZCBlbGZzdGFiX29mZnNldF9zZWN0aW9ucyBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLAorCQkJCQkgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSk7CisKK2V4dGVybiB2b2lkIHByb2Nlc3NfbGF0ZXIgCisgIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKiwgY2hhciAqLCAKKwkgICBpbnQgKCpmKSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBzdHJ1Y3Qgc3ltYm9sICosIGNoYXIgKikpKSk7CisKK2V4dGVybiBpbnQgc3ltYm9sX3JlZmVyZW5jZV9kZWZpbmVkIFBBUkFNUyAoKGNoYXIgKiopKTsKKworZXh0ZXJuIHZvaWQgcmVmX2FkZCBQQVJBTVMgKChpbnQsIHN0cnVjdCBzeW1ib2wgKiwgY2hhciAqLCBDT1JFX0FERFIpKTsKKworZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKiByZWZfc2VhcmNoIFBBUkFNUyAoKGludCkpOworCitleHRlcm4gaW50IHJlc29sdmVfY2Zyb250X2NvbnRpbnVhdGlvbiAKKyAgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiBvYmpmaWxlLCBzdHJ1Y3Qgc3ltYm9sICogc3ltLCBjaGFyICogcCkpOworCisjdW5kZWYgRVhURVJOCmRpZmYgLS1naXQgYS9nZGIvc3RhY2suYyBiL2dkYi9zdGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNjMxNmUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvc3RhY2suYwpAQCAtMCwwICsxLDIwMTkgQEAKKy8qIFByaW50IGFuZCBzZWxlY3Qgc3RhY2sgZnJhbWVzIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk4NiwgODcsIDg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5OCwgMTk5OQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiYnJlYWtwb2ludC5oIgorI2luY2x1ZGUgImRlbWFuZ2xlLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJhbm5vdGF0ZS5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIKKyNpbmNsdWRlICJvYmpmaWxlcy5oIgorCisvKiBQcm90b3R5cGVzIGZvciBleHBvcnRlZCBmdW5jdGlvbnMuICovCisKK3ZvaWQgYXJnc19pbmZvIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3ZvaWQgbG9jYWxzX2luZm8gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKwordm9pZCAoKnNlbGVjdGVkX2ZyYW1lX2xldmVsX2NoYW5nZWRfaG9vaykgUEFSQU1TICgoaW50KSk7CisKK3ZvaWQgX2luaXRpYWxpemVfc3RhY2sgUEFSQU1TICgodm9pZCkpOworCisvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICovCisKK3N0YXRpYyB2b2lkIHJldHVybl9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGRvd25fY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBkb3duX3NpbGVudGx5X2Jhc2UgUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyB2b2lkIGRvd25fc2lsZW50bHlfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCB1cF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHVwX3NpbGVudGx5X2Jhc2UgUEFSQU1TICgoY2hhciAqKSk7CisKK3N0YXRpYyB2b2lkIHVwX3NpbGVudGx5X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKwordm9pZCBmcmFtZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHNlbGVjdF9mcmFtZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHByaW50X2ZyYW1lX2FyZ192YXJzIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICosIEdEQl9GSUxFICopKTsKKworc3RhdGljIHZvaWQgY2F0Y2hfaW5mbyBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBhcmdzX3BsdXNfbG9jYWxzX2luZm8gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgcHJpbnRfZnJhbWVfbGFiZWxfdmFycyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqLAorCQkJCQkgICAgaW50LAorCQkJCQkgICAgR0RCX0ZJTEUgKikpOworCitzdGF0aWMgdm9pZCBwcmludF9mcmFtZV9sb2NhbF92YXJzIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICosCisJCQkJCSAgICBpbnQsCisJCQkJCSAgICBHREJfRklMRSAqKSk7CisKK3N0YXRpYyBpbnQgcHJpbnRfYmxvY2tfZnJhbWVfbGFiZWxzIFBBUkFNUyAoKHN0cnVjdCBibG9jayAqLCBpbnQgKiwKKwkJCQkJICAgICBHREJfRklMRSAqKSk7CisKK3N0YXRpYyBpbnQgcHJpbnRfYmxvY2tfZnJhbWVfbG9jYWxzIFBBUkFNUyAoKHN0cnVjdCBibG9jayAqLAorCQkJCQkgICAgIHN0cnVjdCBmcmFtZV9pbmZvICosCisJCQkJCSAgICAgaW50LAorCQkJCQkgICAgIEdEQl9GSUxFICopKTsKKworc3RhdGljIHZvaWQgcHJpbnRfZnJhbWVfaW5mb19iYXNlIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICosIGludCwgaW50LCBpbnQpKTsKKyAgCitzdGF0aWMgdm9pZCBwcmludF9zdGFja19mcmFtZV9iYXNlIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICosIGludCwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGJhY2t0cmFjZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0cnVjdCBmcmFtZV9pbmZvICpwYXJzZV9mcmFtZV9zcGVjaWZpY2F0aW9uIFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgdm9pZCBmcmFtZV9pbmZvIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK2V4dGVybiBpbnQgYWRkcmVzc3ByaW50OwkvKiBQcmludCBhZGRyZXNzZXMsIG9yIHN0YXkgc3ltYm9saWMgb25seT8gKi8KK2V4dGVybiBpbnQgaW5mb192ZXJib3NlOwkvKiBWZXJib3NpdHkgb2Ygc3ltYm9sIHJlYWRpbmcgbXNncyAqLworZXh0ZXJuIGludCBsaW5lc190b19saXN0OwkvKiAjIG9mIGxpbmVzICJsaXN0IiBjb21tYW5kIHNob3dzIGJ5IGRlZmF1bHQgKi8KKworLyogVGhlICJzZWxlY3RlZCIgc3RhY2sgZnJhbWUgaXMgdXNlZCBieSBkZWZhdWx0IGZvciBsb2NhbCBhbmQgYXJnIGFjY2Vzcy4KKyAgIE1heSBiZSB6ZXJvLCBmb3Igbm8gc2VsZWN0ZWQgZnJhbWUuICAqLworCitzdHJ1Y3QgZnJhbWVfaW5mbyAqc2VsZWN0ZWRfZnJhbWU7CisKKy8qIExldmVsIG9mIHRoZSBzZWxlY3RlZCBmcmFtZToKKyAgIDAgZm9yIGlubmVybW9zdCwgMSBmb3IgaXRzIGNhbGxlciwgLi4uCisgICBvciAtMSBmb3IgZnJhbWUgc3BlY2lmaWVkIGJ5IGFkZHJlc3Mgd2l0aCBubyBkZWZpbmVkIGxldmVsLiAgKi8KKworaW50IHNlbGVjdGVkX2ZyYW1lX2xldmVsOworCisvKiBaZXJvIG1lYW5zIGRvIHRoaW5ncyBub3JtYWxseTsgd2UgYXJlIGludGVyYWN0aW5nIGRpcmVjdGx5IHdpdGggdGhlCisgICB1c2VyLiAgT25lIG1lYW5zIHByaW50IHRoZSBmdWxsIGZpbGVuYW1lIGFuZCBsaW5lbnVtYmVyIHdoZW4gYQorICAgZnJhbWUgaXMgcHJpbnRlZCwgYW5kIGRvIHNvIGluIGEgZm9ybWF0IGVtYWNzMTgvZW1hY3MxOS4yMiBjYW4KKyAgIHBhcnNlLiAgVHdvIG1lYW5zIHByaW50IHNpbWlsYXIgYW5ub3RhdGlvbnMsIGJ1dCBpbiBtYW55IG1vcmUKKyAgIGNhc2VzIGFuZCBpbiBhIHNsaWdodGx5IGRpZmZlcmVudCBzeW50YXguICAqLworCitpbnQgYW5ub3RhdGlvbl9sZXZlbCA9IDA7CisKKwwKK3N0cnVjdCBwcmludF9zdGFja19mcmFtZV9hcmdzIHsKKyAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworICBpbnQgbGV2ZWw7CisgIGludCBzb3VyY2U7CisgIGludCBhcmdzOworfTsKKworc3RhdGljIGludCBwcmludF9zdGFja19mcmFtZV9iYXNlX3N0dWIgUEFSQU1TICgoY2hhciAqKSk7CisKKy8qIFNob3cgYW5kIHByaW50IHRoZSBmcmFtZSBhcmd1bWVudHMuCisgICBQYXNzIHRoZSBhcmdzIHRoZSB3YXkgY2F0Y2hfZXJyb3JzIHdhbnRzIHRoZW0uICAqLworc3RhdGljIGludAorc2hvd19hbmRfcHJpbnRfc3RhY2tfZnJhbWVfc3R1YiAoYXJncykKKyAgICAgY2hhciAqYXJnczsKK3sKKyAgc3RydWN0IHByaW50X3N0YWNrX2ZyYW1lX2FyZ3MgKnAgPSAoc3RydWN0IHByaW50X3N0YWNrX2ZyYW1lX2FyZ3MgKilhcmdzOworCisgIC8qIFJldmVyc2VkIG9yZGVyIG9mIHRoZXNlIHNvIHR1aURvKCkgZG9lc24ndCBvY2N1cgorICAgKiBpbiB0aGUgbWlkZGxlIG9mICJCcmVha3BvaW50IDEgLi4uIFtsb2NhdGlvbl0iIHByaW50aW5nID0gUlQKKyAgICovCisgIGlmICh0dWlfdmVyc2lvbikKKyAgICBwcmludF9mcmFtZV9pbmZvX2Jhc2UgKHAtPmZpLCBwLT5sZXZlbCwgcC0+c291cmNlLCBwLT5hcmdzKTsKKyAgcHJpbnRfZnJhbWVfaW5mbyAocC0+ZmksIHAtPmxldmVsLCBwLT5zb3VyY2UsIHAtPmFyZ3MpOworCisgIHJldHVybiAwOworfQorCisvKiBTaG93IG9yIHByaW50IHRoZSBmcmFtZSBhcmd1bWVudHMuCisgICBQYXNzIHRoZSBhcmdzIHRoZSB3YXkgY2F0Y2hfZXJyb3JzIHdhbnRzIHRoZW0uICAqLworc3RhdGljIGludAorcHJpbnRfc3RhY2tfZnJhbWVfc3R1YiAoYXJncykKKyAgICAgY2hhciAqYXJnczsKK3sKKyAgc3RydWN0IHByaW50X3N0YWNrX2ZyYW1lX2FyZ3MgKnAgPSAoc3RydWN0IHByaW50X3N0YWNrX2ZyYW1lX2FyZ3MgKilhcmdzOworCisgIGlmICh0dWlfdmVyc2lvbikKKyAgICBwcmludF9mcmFtZV9pbmZvIChwLT5maSwgcC0+bGV2ZWwsIHAtPnNvdXJjZSwgcC0+YXJncyk7CisgIGVsc2UKKyAgICBwcmludF9mcmFtZV9pbmZvX2Jhc2UgKHAtPmZpLCBwLT5sZXZlbCwgcC0+c291cmNlLCBwLT5hcmdzKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFByaW50IGEgc3RhY2sgZnJhbWUgYnJpZWZseS4gIEZSQU1FX0lORkkgc2hvdWxkIGJlIHRoZSBmcmFtZSBpbmZvCisgICBhbmQgTEVWRUwgc2hvdWxkIGJlIGl0cyBsZXZlbCBpbiB0aGUgc3RhY2sgKG9yIC0xIGZvciBsZXZlbCBub3QKKyAgIGRlZmluZWQpLiAqLworCisvKiBQYXNzIHRoZSBhcmdzIHRoZSB3YXkgY2F0Y2hfZXJyb3JzIHdhbnRzIHRoZW0uICAqLworc3RhdGljIGludAorcHJpbnRfc3RhY2tfZnJhbWVfYmFzZV9zdHViIChhcmdzKQorICAgICBjaGFyICphcmdzOworeworICBzdHJ1Y3QgcHJpbnRfc3RhY2tfZnJhbWVfYXJncyAqcCA9IChzdHJ1Y3QgcHJpbnRfc3RhY2tfZnJhbWVfYXJncyAqKWFyZ3M7CisKKyAgcHJpbnRfZnJhbWVfaW5mb19iYXNlIChwLT5maSwgcC0+bGV2ZWwsIHAtPnNvdXJjZSwgcC0+YXJncyk7CisgIHJldHVybiAwOworfQorCisvKiBwcmludCB0aGUgZnJhbWUgYXJndW1lbnRzIHRvIHRoZSB0ZXJtaW5hbC4gIAorICAgUGFzcyB0aGUgYXJncyB0aGUgd2F5IGNhdGNoX2Vycm9ycyB3YW50cyB0aGVtLiAgKi8KK3N0YXRpYyBpbnQKK3ByaW50X29ubHlfc3RhY2tfZnJhbWVfc3R1YiAoYXJncykKKyAgICAgY2hhciAqYXJnczsKK3sKKyAgc3RydWN0IHByaW50X3N0YWNrX2ZyYW1lX2FyZ3MgKnAgPSAoc3RydWN0IHByaW50X3N0YWNrX2ZyYW1lX2FyZ3MgKilhcmdzOworCisgIHByaW50X2ZyYW1lX2luZm9fYmFzZSAocC0+ZmksIHAtPmxldmVsLCBwLT5zb3VyY2UsIHAtPmFyZ3MpOworICByZXR1cm4gMDsKK30KKworLyogUHJpbnQgYSBzdGFjayBmcmFtZSBicmllZmx5LiAgRlJBTUVfSU5GSSBzaG91bGQgYmUgdGhlIGZyYW1lIGluZm8KKyAgIGFuZCBMRVZFTCBzaG91bGQgYmUgaXRzIGxldmVsIGluIHRoZSBzdGFjayAob3IgLTEgZm9yIGxldmVsIG5vdCBkZWZpbmVkKS4KKyAgIFRoaXMgcHJpbnRzIHRoZSBsZXZlbCwgdGhlIGZ1bmN0aW9uIGV4ZWN1dGluZywgdGhlIGFyZ3VtZW50cywKKyAgIGFuZCB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlci4KKyAgIElmIHRoZSBwYyBpcyBub3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc291cmNlIGxpbmUsCisgICB0aGUgYWN0dWFsIHBjIGlzIHByaW50ZWQgYXQgdGhlIGJlZ2lubmluZy4KKworICAgSWYgU09VUkNFIGlzIDEsIHByaW50IHRoZSBzb3VyY2UgbGluZSBhcyB3ZWxsLgorICAgSWYgU09VUkNFIGlzIC0xLCBwcmludCBPTkxZIHRoZSBzb3VyY2UgbGluZS4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF9zdGFja19mcmFtZV9iYXNlIChmaSwgbGV2ZWwsIHNvdXJjZSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworICAgICBpbnQgbGV2ZWw7CisgICAgIGludCBzb3VyY2U7Cit7CisgIHN0cnVjdCBwcmludF9zdGFja19mcmFtZV9hcmdzIGFyZ3M7CisKKyAgYXJncy5maSA9IGZpOworICBhcmdzLmxldmVsID0gbGV2ZWw7CisgIGFyZ3Muc291cmNlID0gc291cmNlOworICBhcmdzLmFyZ3MgPSAxOworCisgIGNhdGNoX2Vycm9ycyAocHJpbnRfc3RhY2tfZnJhbWVfc3R1YiwgKGNoYXIgKikmYXJncywgIiIsIFJFVFVSTl9NQVNLX0FMTCk7Cit9CisKKy8qIFNob3cgYW5kIHByaW50IGEgc3RhY2sgZnJhbWUgYnJpZWZseS4gIEZSQU1FX0lORkkgc2hvdWxkIGJlIHRoZSBmcmFtZSBpbmZvCisgICBhbmQgTEVWRUwgc2hvdWxkIGJlIGl0cyBsZXZlbCBpbiB0aGUgc3RhY2sgKG9yIC0xIGZvciBsZXZlbCBub3QgZGVmaW5lZCkuCisgICBUaGlzIHByaW50cyB0aGUgbGV2ZWwsIHRoZSBmdW5jdGlvbiBleGVjdXRpbmcsIHRoZSBhcmd1bWVudHMsCisgICBhbmQgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIuCisgICBJZiB0aGUgcGMgaXMgbm90IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNvdXJjZSBsaW5lLAorICAgdGhlIGFjdHVhbCBwYyBpcyBwcmludGVkIGF0IHRoZSBiZWdpbm5pbmcuCisKKyAgIElmIFNPVVJDRSBpcyAxLCBwcmludCB0aGUgc291cmNlIGxpbmUgYXMgd2VsbC4KKyAgIElmIFNPVVJDRSBpcyAtMSwgcHJpbnQgT05MWSB0aGUgc291cmNlIGxpbmUuICAqLworCit2b2lkCitzaG93X2FuZF9wcmludF9zdGFja19mcmFtZSAoZmksIGxldmVsLCBzb3VyY2UpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKKyAgICAgaW50IGxldmVsOworICAgICBpbnQgc291cmNlOworeworICBzdHJ1Y3QgcHJpbnRfc3RhY2tfZnJhbWVfYXJncyBhcmdzOworCisgIGFyZ3MuZmkgPSBmaTsKKyAgYXJncy5sZXZlbCA9IGxldmVsOworICBhcmdzLnNvdXJjZSA9IHNvdXJjZTsKKyAgYXJncy5hcmdzID0gMTsKKworICBjYXRjaF9lcnJvcnMgKHNob3dfYW5kX3ByaW50X3N0YWNrX2ZyYW1lX3N0dWIsIChjaGFyICopJmFyZ3MsICIiLCBSRVRVUk5fTUFTS19BTEwpOworfQorCisKKy8qIFNob3cgb3IgcHJpbnQgYSBzdGFjayBmcmFtZSBicmllZmx5LiAgRlJBTUVfSU5GSSBzaG91bGQgYmUgdGhlIGZyYW1lIGluZm8KKyAgIGFuZCBMRVZFTCBzaG91bGQgYmUgaXRzIGxldmVsIGluIHRoZSBzdGFjayAob3IgLTEgZm9yIGxldmVsIG5vdCBkZWZpbmVkKS4KKyAgIFRoaXMgcHJpbnRzIHRoZSBsZXZlbCwgdGhlIGZ1bmN0aW9uIGV4ZWN1dGluZywgdGhlIGFyZ3VtZW50cywKKyAgIGFuZCB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlci4KKyAgIElmIHRoZSBwYyBpcyBub3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc291cmNlIGxpbmUsCisgICB0aGUgYWN0dWFsIHBjIGlzIHByaW50ZWQgYXQgdGhlIGJlZ2lubmluZy4KKworICAgSWYgU09VUkNFIGlzIDEsIHByaW50IHRoZSBzb3VyY2UgbGluZSBhcyB3ZWxsLgorICAgSWYgU09VUkNFIGlzIC0xLCBwcmludCBPTkxZIHRoZSBzb3VyY2UgbGluZS4gICovCisKK3ZvaWQKK3ByaW50X3N0YWNrX2ZyYW1lIChmaSwgbGV2ZWwsIHNvdXJjZSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworICAgICBpbnQgbGV2ZWw7CisgICAgIGludCBzb3VyY2U7Cit7CisgIHN0cnVjdCBwcmludF9zdGFja19mcmFtZV9hcmdzIGFyZ3M7CisKKyAgYXJncy5maSA9IGZpOworICBhcmdzLmxldmVsID0gbGV2ZWw7CisgIGFyZ3Muc291cmNlID0gc291cmNlOworICBhcmdzLmFyZ3MgPSAxOworCisgIGNhdGNoX2Vycm9ycyAocHJpbnRfc3RhY2tfZnJhbWVfc3R1YiwgKGNoYXIgKikmYXJncywgIiIsIFJFVFVSTl9NQVNLX0FMTCk7Cit9CisKKy8qIFByaW50IGEgc3RhY2sgZnJhbWUgYnJpZWZseS4gIEZSQU1FX0lORkkgc2hvdWxkIGJlIHRoZSBmcmFtZSBpbmZvCisgICBhbmQgTEVWRUwgc2hvdWxkIGJlIGl0cyBsZXZlbCBpbiB0aGUgc3RhY2sgKG9yIC0xIGZvciBsZXZlbCBub3QgZGVmaW5lZCkuCisgICBUaGlzIHByaW50cyB0aGUgbGV2ZWwsIHRoZSBmdW5jdGlvbiBleGVjdXRpbmcsIHRoZSBhcmd1bWVudHMsCisgICBhbmQgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIuCisgICBJZiB0aGUgcGMgaXMgbm90IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNvdXJjZSBsaW5lLAorICAgdGhlIGFjdHVhbCBwYyBpcyBwcmludGVkIGF0IHRoZSBiZWdpbm5pbmcuCisKKyAgIElmIFNPVVJDRSBpcyAxLCBwcmludCB0aGUgc291cmNlIGxpbmUgYXMgd2VsbC4KKyAgIElmIFNPVVJDRSBpcyAtMSwgcHJpbnQgT05MWSB0aGUgc291cmNlIGxpbmUuICAqLworCit2b2lkCitwcmludF9vbmx5X3N0YWNrX2ZyYW1lIChmaSwgbGV2ZWwsIHNvdXJjZSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworICAgICBpbnQgbGV2ZWw7CisgICAgIGludCBzb3VyY2U7Cit7CisgIHN0cnVjdCBwcmludF9zdGFja19mcmFtZV9hcmdzIGFyZ3M7CisKKyAgYXJncy5maSA9IGZpOworICBhcmdzLmxldmVsID0gbGV2ZWw7CisgIGFyZ3Muc291cmNlID0gc291cmNlOworICBhcmdzLmFyZ3MgPSAxOworCisgIGNhdGNoX2Vycm9ycyAocHJpbnRfb25seV9zdGFja19mcmFtZV9zdHViLCAKKyAgICAgICAgICAgICAgICAoY2hhciAqKSZhcmdzLCAiIiwgUkVUVVJOX01BU0tfQUxMKTsKK30KKworc3RydWN0IHByaW50X2FyZ3NfYXJncyB7CisgIHN0cnVjdCBzeW1ib2wgKmZ1bmM7CisgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKK307CisKK3N0YXRpYyBpbnQgcHJpbnRfYXJnc19zdHViIFBBUkFNUyAoKFBUUikpOworCisvKiBQYXNzIHRoZSBhcmdzIHRoZSB3YXkgY2F0Y2hfZXJyb3JzIHdhbnRzIHRoZW0uICAqLworCitzdGF0aWMgaW50CitwcmludF9hcmdzX3N0dWIgKGFyZ3MpCisgICAgIFBUUiBhcmdzOworeworICBpbnQgbnVtYXJnczsKKyAgc3RydWN0IHByaW50X2FyZ3NfYXJncyAqcCA9IChzdHJ1Y3QgcHJpbnRfYXJnc19hcmdzICopYXJnczsKKworICBGUkFNRV9OVU1fQVJHUyAobnVtYXJncywgKHAtPmZpKSk7CisgIHByaW50X2ZyYW1lX2FyZ3MgKHAtPmZ1bmMsIHAtPmZpLCBudW1hcmdzLCBnZGJfc3Rkb3V0KTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFByaW50IGluZm9ybWF0aW9uIGFib3V0IGEgZnJhbWUgZm9yIGZyYW1lICJmaSIgYXQgbGV2ZWwgImxldmVsIi4KKyAqIFVzZWQgaW4gIndoZXJlIiBvdXRwdXQsIGFsc28gdXNlZCB0byBlbWl0IGJyZWFrcG9pbnQgb3Igc3RlcCBtZXNzYWdlcy4KKyAqIExFVkVMIGlzIHRoZSBsZXZlbCBvZiB0aGUgZnJhbWUsIG9yIC0xIGlmIGl0IGlzIHRoZSBpbm5lcm1vc3QgZnJhbWUKKyAqIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHByaW50IHRoZSBsZXZlbC4KKyAqIFRoZSBtZWFuaW5nIG9mIHRoZSBTT1VSQ0UgYXJndW1lbnQgaXM6CisgKiAtMTogUHJpbnQgb25seSBzb3VyY2UgbGluZQorICogIDA6IFByaW50IG9ubHkgbG9jYXRpb24KKyAqICAxOiBQcmludCBsb2NhdGlvbiBhbmQgc291cmNlIGxpbmUKKyAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfZnJhbWVfaW5mb19iYXNlIChmaSwgbGV2ZWwsIHNvdXJjZSwgYXJncykKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworICAgICBpbnQgbGV2ZWw7CisgICAgIGludCBzb3VyY2U7CisgICAgIGludCBhcmdzOworeworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKyAgc3RydWN0IHN5bWJvbCAqZnVuYzsKKyAgcmVnaXN0ZXIgY2hhciAqZnVubmFtZSA9IDA7CisgIGVudW0gbGFuZ3VhZ2UgZnVubGFuZyA9IGxhbmd1YWdlX3Vua25vd247CisKKyNpZiAwCisgIGNoYXIgYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisgIENPUkVfQUREUiBzcDsKKworICAvKiBPbiB0aGUgNjhrLCB0aGlzIHNwZW5kcyB0b28gbXVjaCB0aW1lIGluIG02OGtfZmluZF9zYXZlZF9yZWdzLiAgKi8KKworICAvKiBHZXQgdGhlIHZhbHVlIG9mIFNQX1JFR05VTSByZWxhdGl2ZSB0byB0aGUgZnJhbWUuICAqLworICBnZXRfc2F2ZWRfcmVnaXN0ZXIgKGJ1ZiwgKGludCAqKU5VTEwsIChDT1JFX0FERFIgKilOVUxMLAorCQkgICAgICBGUkFNRV9JTkZPX0lEIChmaSksIFNQX1JFR05VTSwgKGVudW0gbHZhbF90eXBlICopTlVMTCk7CisgIHNwID0gZXh0cmFjdF9hZGRyZXNzIChidWYsIFJFR0lTVEVSX1JBV19TSVpFIChTUF9SRUdOVU0pKTsKKworICAvKiBUaGlzIGlzIG5vdCBhIHBlcmZlY3QgdGVzdCwgYmVjYXVzZSBpZiBhIGZ1bmN0aW9uIGFsbG9jYSdzIHNvbWUKKyAgICAgbWVtb3J5LCBwdXRzIHNvbWUgY29kZSB0aGVyZSwgYW5kIHRoZW4ganVtcHMgaW50byBpdCwgdGhlbiB0aGUgdGVzdAorICAgICB3aWxsIHN1Y2NlZWQgZXZlbiB0aG91Z2ggdGhlcmUgaXMgbm8gY2FsbCBkdW1teS4gIFByb2JhYmx5IGJlc3QgaXMKKyAgICAgdG8gY2hlY2sgZm9yIGEgYnBfY2FsbF9kdW1teSBicmVha3BvaW50LiAgKi8KKyAgaWYgKFBDX0lOX0NBTExfRFVNTVkgKGZpLT5wYywgc3AsIGZpLT5mcmFtZSkpCisjZWxzZQorICBpZiAoZnJhbWVfaW5fZHVtbXkgKGZpKSkKKyNlbmRpZgorICAgIHsKKyAgICAgIGFubm90YXRlX2ZyYW1lX2JlZ2luIChsZXZlbCA9PSAtMSA/IDAgOiBsZXZlbCwgZmktPnBjKTsKKworICAgICAgLyogRG8gdGhpcyByZWdhcmRsZXNzIG9mIFNPVVJDRSBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYW55IHNvdXJjZQorCSB0byBsaXN0IGZvciB0aGlzIGZyYW1lLiAgKi8KKyAgICAgIGlmIChsZXZlbCA+PSAwKQorCXByaW50Zl9maWx0ZXJlZCAoIiMlLTJkICIsIGxldmVsKTsKKyAgICAgIGFubm90YXRlX2Z1bmN0aW9uX2NhbGwgKCk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCI8ZnVuY3Rpb24gY2FsbGVkIGZyb20gZ2RiPlxuIik7CisgICAgICBhbm5vdGF0ZV9mcmFtZV9lbmQgKCk7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoZmktPnNpZ25hbF9oYW5kbGVyX2NhbGxlcikKKyAgICB7CisgICAgICBhbm5vdGF0ZV9mcmFtZV9iZWdpbiAobGV2ZWwgPT0gLTEgPyAwIDogbGV2ZWwsIGZpLT5wYyk7CisKKyAgICAgIC8qIERvIHRoaXMgcmVnYXJkbGVzcyBvZiBTT1VSQ0UgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGFueSBzb3VyY2UKKwkgdG8gbGlzdCBmb3IgdGhpcyBmcmFtZS4gICovCisgICAgICBpZiAobGV2ZWwgPj0gMCkKKwlwcmludGZfZmlsdGVyZWQgKCIjJS0yZCAiLCBsZXZlbCk7CisgICAgICBhbm5vdGF0ZV9zaWduYWxfaGFuZGxlcl9jYWxsZXIgKCk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCI8c2lnbmFsIGhhbmRsZXIgY2FsbGVkPlxuIik7CisgICAgICBhbm5vdGF0ZV9mcmFtZV9lbmQgKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIElmIGZpIGlzIG5vdCB0aGUgaW5uZXJtb3N0IGZyYW1lLCB0aGF0IG5vcm1hbGx5IG1lYW5zIHRoYXQgZmktPnBjCisgICAgIHBvaW50cyB0byAqYWZ0ZXIqIHRoZSBjYWxsIGluc3RydWN0aW9uLCBhbmQgd2Ugd2FudCB0byBnZXQgdGhlIGxpbmUKKyAgICAgY29udGFpbmluZyB0aGUgY2FsbCwgbmV2ZXIgdGhlIG5leHQgbGluZS4gIEJ1dCBpZiB0aGUgbmV4dCBmcmFtZSBpcworICAgICBhIHNpZ25hbF9oYW5kbGVyX2NhbGxlciBvciBhIGR1bW15IGZyYW1lLCB0aGVuIHRoZSBuZXh0IGZyYW1lIHdhcworICAgICBub3QgZW50ZXJlZCBhcyB0aGUgcmVzdWx0IG9mIGEgY2FsbCwgYW5kIHdlIHdhbnQgdG8gZ2V0IHRoZSBsaW5lCisgICAgIGNvbnRhaW5pbmcgZmktPnBjLiAgKi8KKyAgc2FsID0KKyAgICBmaW5kX3BjX2xpbmUgKGZpLT5wYywKKwkJICBmaS0+bmV4dCAhPSBOVUxMCisJCSAgJiYgIWZpLT5uZXh0LT5zaWduYWxfaGFuZGxlcl9jYWxsZXIKKwkJICAmJiAhZnJhbWVfaW5fZHVtbXkgKGZpLT5uZXh0KSk7CisKKyAgZnVuYyA9IGZpbmRfcGNfZnVuY3Rpb24gKGZpLT5wYyk7CisgIGlmIChmdW5jKQorICAgIHsKKyAgICAgIC8qIEluIGNlcnRhaW4gcGF0aG9sb2dpY2FsIGNhc2VzLCB0aGUgc3ltdGFicyBnaXZlIHRoZSB3cm9uZworCSBmdW5jdGlvbiAod2hlbiB3ZSBhcmUgaW4gdGhlIGZpcnN0IGZ1bmN0aW9uIGluIGEgZmlsZSB3aGljaAorCSBpcyBjb21waWxlZCB3aXRob3V0IGRlYnVnZ2luZyBzeW1ib2xzLCB0aGUgcHJldmlvdXMgZnVuY3Rpb24KKwkgaXMgY29tcGlsZWQgd2l0aCBkZWJ1Z2dpbmcgc3ltYm9scywgYW5kIHRoZSAiZm9vLm8iIHN5bWJvbAorCSB0aGF0IGlzIHN1cHBvc2VkIHRvIHRlbGwgdXMgd2hlcmUgdGhlIGZpbGUgd2l0aCBkZWJ1Z2dpbmcgc3ltYm9scworCSBlbmRzIGhhcyBiZWVuIHRydW5jYXRlZCBieSBhciBiZWNhdXNlIGl0IGlzIGxvbmdlciB0aGFuIDE1CisJIGNoYXJhY3RlcnMpLiAgVGhpcyBhbHNvIG9jY3VycyBpZiB0aGUgdXNlciB1c2VzIGFzbSgpIHRvIGNyZWF0ZQorCSBhIGZ1bmN0aW9uIGJ1dCBub3Qgc3RhYnMgZm9yIGl0IChpbiBhIGZpbGUgY29tcGlsZWQgLWcpLgorCisJIFNvIGxvb2sgaW4gdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlcyBhcyB3ZWxsLCBhbmQgaWYgaXQgY29tZXMKKwkgdXAgd2l0aCBhIGxhcmdlciBhZGRyZXNzIGZvciB0aGUgZnVuY3Rpb24gdXNlIHRoYXQgaW5zdGVhZC4KKwkgSSBkb24ndCB0aGluayB0aGlzIGNhbiBldmVyIGNhdXNlIGFueSBwcm9ibGVtczsgdGhlcmUgc2hvdWxkbid0CisJIGJlIGFueSBtaW5pbWFsIHN5bWJvbHMgaW4gdGhlIG1pZGRsZSBvZiBhIGZ1bmN0aW9uOyBpZiB0aGlzIGlzCisJIGV2ZXIgY2hhbmdlZCBtYW55IHBhcnRzIG9mIEdEQiB3aWxsIG5lZWQgdG8gYmUgY2hhbmdlZCAoYW5kIHdlJ2xsCisJIGNyZWF0ZSBhIGZpbmRfcGNfbWluaW1hbF9mdW5jdGlvbiBvciBzb21lIHN1Y2gpLiAgKi8KKworICAgICAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sID0gbG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjIChmaS0+cGMpOworICAgICAgaWYgKG1zeW1ib2wgIT0gTlVMTAorCSAgJiYgKFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKSAKKwkgICAgICA+IEJMT0NLX1NUQVJUIChTWU1CT0xfQkxPQ0tfVkFMVUUgKGZ1bmMpKSkpCisJeworI2lmIDAKKwkgIC8qIFRoZXJlIGlzIG5vIHBhcnRpY3VsYXIgcmVhc29uIHRvIHRoaW5rIHRoZSBsaW5lIG51bWJlcgorCSAgICAgaW5mb3JtYXRpb24gaXMgd3JvbmcuICBTb21lb25lIG1pZ2h0IGhhdmUganVzdCBwdXQgaW4KKwkgICAgIGEgbGFiZWwgd2l0aCBhc20oKSBidXQgbGVmdCB0aGUgbGluZSBudW1iZXJzIGFsb25lLiAgKi8KKwkgIC8qIEluIHRoaXMgY2FzZSB3ZSBoYXZlIG5vIHdheSBvZiBrbm93aW5nIHRoZSBzb3VyY2UgZmlsZQorCSAgICAgYW5kIGxpbmUgbnVtYmVyLCBzbyBkb24ndCBwcmludCB0aGVtLiAgKi8KKwkgIHNhbC5zeW10YWIgPSAwOworI2VuZGlmCisJICAvKiBXZSBhbHNvIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIGZ1bmN0aW9uIGJlc2lkZXMKKwkgICAgIGl0cyBhZGRyZXNzIGFuZCBuYW1lLiAgKi8KKwkgIGZ1bmMgPSAwOworCSAgZnVubmFtZSA9IFNZTUJPTF9OQU1FIChtc3ltYm9sKTsKKwkgIGZ1bmxhbmcgPSBTWU1CT0xfTEFOR1VBR0UgKG1zeW1ib2wpOworCX0KKyAgICAgIGVsc2UKKwl7CisgICAgICAgICAgLyogSSdkIGxpa2UgdG8gdXNlIFNZTUJPTF9TT1VSQ0VfTkFNRSgpIGhlcmUsIHRvIGRpc3BsYXkKKyAgICAgICAgICAgKiB0aGUgZGVtYW5nbGVkIG5hbWUgdGhhdCB3ZSBhbHJlYWR5IGhhdmUgc3RvcmVkIGluCisgICAgICAgICAgICogdGhlIHN5bWJvbCB0YWJsZSwgYnV0IHdlIHN0b3JlZCBhIHZlcnNpb24gd2l0aAorICAgICAgICAgICAqIERNR0xfUEFSQU1TIHR1cm5lZCBvbiwgYW5kIGhlcmUgd2UgZG9uJ3Qgd2FudAorICAgICAgICAgICAqIHRvIGRpc3BsYXkgcGFyYW1ldGVycy4gU28gY2FsbCB0aGUgZGVtYW5nbGVyIGFnYWluLAorICAgICAgICAgICAqIHdpdGggRE1HTF9BTlNJIG9ubHkuIFJUCisgICAgICAgICAgICogKFllcywgSSBrbm93IHRoYXQgcHJpbnRmX3N5bWJvbF9maWx0ZXJlZCgpIHdpbGwKKyAgICAgICAgICAgKiBhZ2FpbiB0cnkgdG8gZGVtYW5nbGUgdGhlIG5hbWUgb24gdGhlIGZseSwgYnV0CisgICAgICAgICAgICogdGhlIGlzc3VlIGlzIHRoYXQgaWYgY3BsdXNfZGVtYW5nbGUoKSBmYWlscyBoZXJlLAorICAgICAgICAgICAqIGl0J2xsIGZhaWwgdGhlcmUgdG9vLiBTbyB3ZSB3YW50IHRvIGNhdGNoIHRoZSBmYWlsdXJlCisgICAgICAgICAgICogKCJkZW1hbmdsZWQ9PU5VTEwiIGNhc2UgYmVsb3cpIGhlcmUsIHdoaWxlIHdlIHN0aWxsCisgICAgICAgICAgICogaGF2ZSBvdXIgaGFuZHMgb24gdGhlIGZ1bmN0aW9uIHN5bWJvbC4pCisgICAgICAgICAgICovCisgICAgICAgICAgY2hhciAqIGRlbWFuZ2xlZDsKKwkgIGZ1bm5hbWUgPSBTWU1CT0xfTkFNRSAoZnVuYyk7CisJICBmdW5sYW5nID0gU1lNQk9MX0xBTkdVQUdFIChmdW5jKTsKKyAgICAgICAgICBpZiAoZnVubGFuZyA9PSBsYW5ndWFnZV9jcGx1cykgeworICAgICAgICAgICAgZGVtYW5nbGVkID0gY3BsdXNfZGVtYW5nbGUgKGZ1bm5hbWUsIERNR0xfQU5TSSk7CisgICAgICAgICAgICBpZiAoZGVtYW5nbGVkID09IE5VTEwpCisgICAgICAgICAgICAgIC8qIElmIHRoZSBkZW1hbmdsZXIgZmFpbHMsIHRyeSB0aGUgZGVtYW5nbGVkIG5hbWUKKyAgICAgICAgICAgICAgICogZnJvbSB0aGUgc3ltYm9sIHRhYmxlLiBUaGlzJ2xsIGhhdmUgcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICogYnV0IHRoYXQncyBwcmVmZXJhYmxlIHRvIGRpcGxheWluZyBhIG1hbmdsZWQgbmFtZS4KKyAgICAgICAgICAgICAgICovCisJICAgICAgZnVubmFtZSA9IFNZTUJPTF9TT1VSQ0VfTkFNRSAoZnVuYyk7CisgICAgICAgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGMgKGZpLT5wYyk7CisgICAgICBpZiAobXN5bWJvbCAhPSBOVUxMKQorCXsKKwkgIGZ1bm5hbWUgPSBTWU1CT0xfTkFNRSAobXN5bWJvbCk7CisJICBmdW5sYW5nID0gU1lNQk9MX0xBTkdVQUdFIChtc3ltYm9sKTsKKwl9CisgICAgfQorCisgIGlmIChzb3VyY2UgPj0gMCB8fCAhc2FsLnN5bXRhYikKKyAgICB7CisgICAgICBhbm5vdGF0ZV9mcmFtZV9iZWdpbiAobGV2ZWwgPT0gLTEgPyAwIDogbGV2ZWwsIGZpLT5wYyk7CisKKyAgICAgIGlmIChsZXZlbCA+PSAwKQorCXByaW50Zl9maWx0ZXJlZCAoIiMlLTJkICIsIGxldmVsKTsKKyAgICAgIGlmIChhZGRyZXNzcHJpbnQpCisJaWYgKGZpLT5wYyAhPSBzYWwucGMgfHwgIXNhbC5zeW10YWIpCisJICB7CisJICAgIGFubm90YXRlX2ZyYW1lX2FkZHJlc3MgKCk7CisJICAgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoZmktPnBjLCAxLCBnZGJfc3Rkb3V0KTsKKwkgICAgYW5ub3RhdGVfZnJhbWVfYWRkcmVzc19lbmQgKCk7CisJICAgIHByaW50Zl9maWx0ZXJlZCAoIiBpbiAiKTsKKwkgIH0KKyAgICAgIGFubm90YXRlX2ZyYW1lX2Z1bmN0aW9uX25hbWUgKCk7CisgICAgICBmcHJpbnRmX3N5bWJvbF9maWx0ZXJlZCAoZ2RiX3N0ZG91dCwgZnVubmFtZSA/IGZ1bm5hbWUgOiAiPz8iLCBmdW5sYW5nLAorCQkJICAgICAgIERNR0xfQU5TSSk7CisgICAgICB3cmFwX2hlcmUgKCIgICAiKTsKKyAgICAgIGFubm90YXRlX2ZyYW1lX2FyZ3MgKCk7CisgICAgICBmcHV0c19maWx0ZXJlZCAoIiAoIiwgZ2RiX3N0ZG91dCk7CisgICAgICBpZiAoYXJncykKKwl7CisJICBzdHJ1Y3QgcHJpbnRfYXJnc19hcmdzIGFyZ3M7CisJICBhcmdzLmZpID0gZmk7CisJICBhcmdzLmZ1bmMgPSBmdW5jOworCSAgY2F0Y2hfZXJyb3JzIChwcmludF9hcmdzX3N0dWIsICZhcmdzLCAiIiwgUkVUVVJOX01BU0tfQUxMKTsKKwkgIFFVSVQ7CisJfQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiKSIpOworICAgICAgaWYgKHNhbC5zeW10YWIgJiYgc2FsLnN5bXRhYi0+ZmlsZW5hbWUpCisJeworCSAgYW5ub3RhdGVfZnJhbWVfc291cmNlX2JlZ2luICgpOworICAgICAgICAgIHdyYXBfaGVyZSAoIiAgICIpOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiIGF0ICIpOworCSAgYW5ub3RhdGVfZnJhbWVfc291cmNlX2ZpbGUgKCk7CisJICBwcmludGZfZmlsdGVyZWQgKCIlcyIsIHNhbC5zeW10YWItPmZpbGVuYW1lKTsKKwkgIGFubm90YXRlX2ZyYW1lX3NvdXJjZV9maWxlX2VuZCAoKTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIjoiKTsKKwkgIGFubm90YXRlX2ZyYW1lX3NvdXJjZV9saW5lICgpOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiJWQiLCBzYWwubGluZSk7CisJICBhbm5vdGF0ZV9mcmFtZV9zb3VyY2VfZW5kICgpOworCX0KKworI2lmZGVmIFBDX0xPQURfU0VHTUVOVAorICAgICAvKiBJZiB3ZSBjb3VsZG4ndCBwcmludCBvdXQgZnVuY3Rpb24gbmFtZSBidXQgaWYgY2FuIGZpZ3VyZSBvdXQgd2hhdAorICAgICAgICBsb2FkIHNlZ21lbnQgdGhpcyBwYyB2YWx1ZSBpcyBmcm9tLCBhdCBsZWFzdCBwcmludCBvdXQgc29tZSBpbmZvCisJYWJvdXQgaXRzIGxvYWQgc2VnbWVudC4gKi8KKyAgICAgIGlmICghZnVubmFtZSkKKwl7CisJICBhbm5vdGF0ZV9mcmFtZV93aGVyZSAoKTsKKwkgIHdyYXBfaGVyZSAoIiAgIik7CisJICBwcmludGZfZmlsdGVyZWQgKCIgZnJvbSAlcyIsIFBDX0xPQURfU0VHTUVOVCAoZmktPnBjKSk7CisJfQorI2VuZGlmCisjaWZkZWYgUENfU09MSUIKKyAgICAgIGlmICghZnVubmFtZSB8fCAoIXNhbC5zeW10YWIgfHwgIXNhbC5zeW10YWItPmZpbGVuYW1lKSkKKwl7CisJICBjaGFyICpsaWIgPSBQQ19TT0xJQiAoZmktPnBjKTsKKwkgIGlmIChsaWIpCisJICAgIHsKKwkgICAgICBhbm5vdGF0ZV9mcmFtZV93aGVyZSAoKTsKKwkgICAgICB3cmFwX2hlcmUgKCIgICIpOworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiBmcm9tICVzIiwgbGliKTsKKwkgICAgfQorCX0KKyNlbmRpZgorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgICB9CisKKyAgaWYgKChzb3VyY2UgIT0gMCkgJiYgc2FsLnN5bXRhYikKKyAgICB7CisgICAgICBpbnQgZG9uZSA9IDA7CisgICAgICBpbnQgbWlkX3N0YXRlbWVudCA9IHNvdXJjZSA8IDAgJiYgZmktPnBjICE9IHNhbC5wYzsKKyAgICAgIGlmIChhbm5vdGF0aW9uX2xldmVsKQorCWRvbmUgPSBpZGVudGlmeV9zb3VyY2VfbGluZSAoc2FsLnN5bXRhYiwgc2FsLmxpbmUsIG1pZF9zdGF0ZW1lbnQsCisJCQkJICAgICBmaS0+cGMpOworICAgICAgaWYgKCFkb25lKQorCXsKKwkgIGlmIChhZGRyZXNzcHJpbnQgJiYgbWlkX3N0YXRlbWVudCAmJiAhdHVpX3ZlcnNpb24pCisJICAgIHsKKwkgICAgICBwcmludF9hZGRyZXNzX251bWVyaWMgKGZpLT5wYywgMSwgZ2RiX3N0ZG91dCk7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXHQiKTsKKwkgICAgfQorCSAgaWYgKHByaW50X2ZyYW1lX2luZm9fbGlzdGluZ19ob29rKQorCSAgICBwcmludF9mcmFtZV9pbmZvX2xpc3RpbmdfaG9vayAoc2FsLnN5bXRhYiwgc2FsLmxpbmUsIHNhbC5saW5lICsgMSwgMCk7CisJICBlbHNlIGlmICghdHVpX3ZlcnNpb24pCisJICAgIHByaW50X3NvdXJjZV9saW5lcyAoc2FsLnN5bXRhYiwgc2FsLmxpbmUsIHNhbC5saW5lICsgMSwgMCk7CisJfQorICAgICAgY3VycmVudF9zb3VyY2VfbGluZSA9IG1heCAoc2FsLmxpbmUgLSBsaW5lc190b19saXN0LzIsIDEpOworICAgIH0KKyAgaWYgKHNvdXJjZSAhPSAwKQorICAgIHNldF9kZWZhdWx0X2JyZWFrcG9pbnQgKDEsIGZpLT5wYywgc2FsLnN5bXRhYiwgc2FsLmxpbmUpOworCisgIGFubm90YXRlX2ZyYW1lX2VuZCAoKTsKKworICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworfQorDAorCit2b2lkCitzdGFja19wdWJsaXNoX3N0b3BwZWRfd2l0aF9ub19mcmFtZSgpCit7CisgIFRVSURPKCgoVHVpT3BhcXVlRnVuY1B0cil0dWlVcGRhdGVPbkVuZCkpOworCisgIHJldHVybjsKK30KKworLyogU2hvdyBvciBwcmludCB0aGUgZnJhbWUgaW5mby4gIElmIHRoaXMgaXMgdGhlIHR1aSwgaXQgd2lsbCBiZSBzaG93biBpbiAKKyAgIHRoZSBzb3VyY2UgZGlzcGxheSAqLwordm9pZAorcHJpbnRfZnJhbWVfaW5mbyhmaSwgbGV2ZWwsIHNvdXJjZSwgYXJncykKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworICAgICByZWdpc3RlciBpbnQgbGV2ZWw7CisgICAgIGludCBzb3VyY2U7CisgICAgIGludCBhcmdzOworeworICBpZiAoIXR1aV92ZXJzaW9uKQorICAgIHByaW50X2ZyYW1lX2luZm9fYmFzZShmaSwgbGV2ZWwsIHNvdXJjZSwgYXJncyk7CisgIGVsc2UKKyAgeworICAgIGlmIChmaSAmJiAoZnJhbWVfaW5fZHVtbXkoZmkpIHx8IGZpLT5zaWduYWxfaGFuZGxlcl9jYWxsZXIpKQorICAgICAgcHJpbnRfZnJhbWVfaW5mb19iYXNlKGZpLCBsZXZlbCwgc291cmNlLCBhcmdzKTsKKyAgICBlbHNlCisgICAgICB7CisJVFVJRE8oKChUdWlPcGFxdWVGdW5jUHRyKXR1aV92U2hvd0ZyYW1lSW5mbywgZmkpKTsKKyAgICAgIH0KKyAgfQorfQorCisvKiBTaG93IHRoZSBmcmFtZSBpbmZvLiAgSWYgdGhpcyBpcyB0aGUgdHVpLCBpdCB3aWxsIGJlIHNob3duIGluIAorICAgdGhlIHNvdXJjZSBkaXNwbGF5IG90aGVyd2lzZSwgbm90aGluZyBpcyBkb25lICovCit2b2lkCitzaG93X3N0YWNrX2ZyYW1lKGZpKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7Cit7CisgIFRVSURPKCgoVHVpT3BhcXVlRnVuY1B0cil0dWlfdlNob3dGcmFtZUluZm8sIGZpKSk7Cit9CisKKwwKKy8qIFJlYWQgYSBmcmFtZSBzcGVjaWZpY2F0aW9uIGluIHdoYXRldmVyIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQgaXMuCisgICBDYWxsIGVycm9yKCkgaWYgdGhlIHNwZWNpZmljYXRpb24gaXMgaW4gYW55IHdheSBpbnZhbGlkIChpLmUuCisgICB0aGlzIGZ1bmN0aW9uIG5ldmVyIHJldHVybnMgTlVMTCkuICAqLworCitzdHJ1Y3QgZnJhbWVfaW5mbyAqCitwYXJzZV9mcmFtZV9zcGVjaWZpY2F0aW9uIChmcmFtZV9leHApCisgICAgIGNoYXIgKmZyYW1lX2V4cDsKK3sKKyAgaW50IG51bWFyZ3MgPSAwOworI2RlZmluZQlNQVhBUkdTCTQKKyAgQ09SRV9BRERSIGFyZ3NbTUFYQVJHU107CisgIAorICBpZiAoZnJhbWVfZXhwKQorICAgIHsKKyAgICAgIGNoYXIgKmFkZHJfc3RyaW5nLCAqcDsKKyAgICAgIHN0cnVjdCBjbGVhbnVwICp0bXBfY2xlYW51cDsKKworICAgICAgd2hpbGUgKCpmcmFtZV9leHAgPT0gJyAnKSBmcmFtZV9leHArKzsKKworICAgICAgd2hpbGUgKCpmcmFtZV9leHApCisJeworCSAgaWYgKG51bWFyZ3MgPiBNQVhBUkdTKQorCSAgICBlcnJvciAoIlRvbyBtYW55IGFyZ3MgaW4gZnJhbWUgc3BlY2lmaWNhdGlvbiIpOworCSAgLyogUGFyc2UgYW4gYXJndW1lbnQuICAqLworICAgICAgICAgIGZvciAocCA9IGZyYW1lX2V4cDsgKnAgJiYgKnAgIT0gJyAnOyBwKyspCisJICAgIDsKKwkgIGFkZHJfc3RyaW5nID0gc2F2ZXN0cmluZyhmcmFtZV9leHAsIHAgLSBmcmFtZV9leHApOworCisJICB7CisJICAgIHRtcF9jbGVhbnVwID0gbWFrZV9jbGVhbnVwIChmcmVlLCBhZGRyX3N0cmluZyk7CisJICAgIGFyZ3NbbnVtYXJncysrXSA9IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgKGFkZHJfc3RyaW5nKTsKKwkgICAgZG9fY2xlYW51cHMgKHRtcF9jbGVhbnVwKTsKKwkgIH0KKworCSAgLyogU2tpcCBzcGFjZXMsIG1vdmUgdG8gcG9zc2libGUgbmV4dCBhcmcuICAqLworCSAgd2hpbGUgKCpwID09ICcgJykgcCsrOworCSAgZnJhbWVfZXhwID0gcDsKKwl9CisgICAgfQorCisgIHN3aXRjaCAobnVtYXJncykKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgaWYgKHNlbGVjdGVkX2ZyYW1lID09IE5VTEwpCisJZXJyb3IgKCJObyBzZWxlY3RlZCBmcmFtZS4iKTsKKyAgICAgIHJldHVybiBzZWxlY3RlZF9mcmFtZTsKKyAgICAgIC8qIE5PVFJFQUNIRUQgKi8KKyAgICBjYXNlIDE6CisgICAgICB7CisJaW50IGxldmVsID0gYXJnc1swXTsKKwlzdHJ1Y3QgZnJhbWVfaW5mbyAqZmlkID0KKwkgIGZpbmRfcmVsYXRpdmVfZnJhbWUgKGdldF9jdXJyZW50X2ZyYW1lICgpLCAmbGV2ZWwpOworCXN0cnVjdCBmcmFtZV9pbmZvICp0ZmlkOworCisJaWYgKGxldmVsID09IDApCisJICAvKiBmaW5kX3JlbGF0aXZlX2ZyYW1lIHdhcyBzdWNjZXNzZnVsICovCisJICByZXR1cm4gZmlkOworCisJLyogSWYgU0VUVVBfQVJCSVRSQVJZX0ZSQU1FIGlzIGRlZmluZWQsIHRoZW4gZnJhbWUgc3BlY2lmaWNhdGlvbnMKKwkgICB0YWtlIGF0IGxlYXN0IDIgYWRkcmVzc2VzLiAgSXQgaXMgaW1wb3J0YW50IHRvIGRldGVjdCB0aGlzIGNhc2UKKwkgICBoZXJlIHNvIHRoYXQgImZyYW1lIDEwMCIgZG9lcyBub3QgZ2l2ZSBhIGNvbmZ1c2luZyBlcnJvciBtZXNzYWdlCisJICAgbGlrZSAiZnJhbWUgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB0d28gYWRkcmVzc2VzIi4gIFRoaXMgb2YgY291cnNlCisJICAgZG9lcyBub3Qgc29sdmUgdGhlICJmcmFtZSAxMDAiIHByb2JsZW0gZm9yIG1hY2hpbmVzIG9uIHdoaWNoCisJICAgYSBmcmFtZSBzcGVjaWZpY2F0aW9uIGNhbiBiZSBtYWRlIHdpdGggb25lIGFkZHJlc3MuICBUbyBzb2x2ZQorCSAgIHRoYXQsIHdlIG5lZWQgYSBuZXcgc3ludGF4IGZvciBhIHNwZWNpZnlpbmcgYSBmcmFtZSBieSBhZGRyZXNzLgorCSAgIEkgdGhpbmsgdGhlIGNsZWFuZXN0IHN5bnRheCBpcyAkZnJhbWUoMHg0NSkgKCRmcmFtZSgweDIzLDB4NDUpIGZvcgorCSAgIHR3byBhcmdzLCBldGMuKSwgYnV0IHBlb3BsZSBtaWdodCB0aGluayB0aGF0IGlzIHRvbyBtdWNoIHR5cGluZywKKwkgICBzbyBJIGd1ZXNzICoweDIzLDB4NDUgd291bGQgYmUgYSBwb3NzaWJsZSBhbHRlcm5hdGl2ZSAoY29tbWFzCisJICAgcmVhbGx5IHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2Ygc3BhY2VzIHRvIGRlbGltaXQ7IHVzaW5nIHNwYWNlcworCSAgIG5vcm1hbGx5IHdvcmtzIGluIGFuIGV4cHJlc3Npb24pLiAgKi8KKyNpZmRlZiBTRVRVUF9BUkJJVFJBUllfRlJBTUUKKwllcnJvciAoIk5vIGZyYW1lICVkIiwgYXJnc1swXSk7CisjZW5kaWYKKworCS8qIElmIChzKWhlIHNwZWNpZmllcyB0aGUgZnJhbWUgd2l0aCBhbiBhZGRyZXNzLCBoZSBkZXNlcnZlcyB3aGF0CisJICAgKHMpaGUgZ2V0cy4gIFN0aWxsLCBnaXZlIHRoZSBoaWdoZXN0IG9uZSB0aGF0IG1hdGNoZXMuICAqLworCisJZm9yIChmaWQgPSBnZXRfY3VycmVudF9mcmFtZSAoKTsKKwkgICAgIGZpZCAmJiBmaWQtPmZyYW1lICE9IGFyZ3NbMF07CisJICAgICBmaWQgPSBnZXRfcHJldl9mcmFtZSAoZmlkKSkKKwkgIDsKKworCWlmIChmaWQpCisJICB3aGlsZSAoKHRmaWQgPSBnZXRfcHJldl9mcmFtZSAoZmlkKSkgJiYKKwkJICh0ZmlkLT5mcmFtZSA9PSBhcmdzWzBdKSkKKwkgICAgZmlkID0gdGZpZDsKKwkgIAorCS8qIFdlIGNvdWxkbid0IGlkZW50aWZ5IHRoZSBmcmFtZSBhcyBhbiBleGlzdGluZyBmcmFtZSwgYnV0CisJICAgcGVyaGFwcyB3ZSBjYW4gY3JlYXRlIG9uZSB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50LiAgKi8KKyAgICAgIH0KKworICAgICBkZWZhdWx0OgorI2lmZGVmIFNFVFVQX0FSQklUUkFSWV9GUkFNRQorICAgICAgcmV0dXJuIFNFVFVQX0FSQklUUkFSWV9GUkFNRSAobnVtYXJncywgYXJncyk7CisjZWxzZQorICAgICAgLyogVXN1YWwgY2FzZS4gIERvIGl0IGhlcmUgcmF0aGVyIHRoYW4gaGF2ZSBldmVyeW9uZSBzdXBwbHkKKwkgYSBTRVRVUF9BUkJJVFJBUllfRlJBTUUgdGhhdCBkb2VzIHRoaXMuICAqLworICAgICAgaWYgKG51bWFyZ3MgPT0gMSkKKwlyZXR1cm4gY3JlYXRlX25ld19mcmFtZSAoYXJnc1swXSwgMCk7CisgICAgICBlcnJvciAoIlRvbyBtYW55IGFyZ3MgaW4gZnJhbWUgc3BlY2lmaWNhdGlvbiIpOworI2VuZGlmCisgICAgICAvKiBOT1RSRUFDSEVEICovCisgICAgfQorICAvKiBOT1RSRUFDSEVEICovCit9CisKKy8qIEZSQU1FX0FSR1NfQUREUkVTU19DT1JSRUNUIGlzIGp1c3QgbGlrZSBGUkFNRV9BUkdTX0FERFJFU1MgZXhjZXB0CisgICB0aGF0IGlmIGl0IGlzIHVuc3VyZSBhYm91dCB0aGUgYW5zd2VyLCBpdCByZXR1cm5zIDAKKyAgIGluc3RlYWQgb2YgZ3Vlc3NpbmcgKHRoaXMgaGFwcGVucyBvbiB0aGUgVkFYIGFuZCBpOTYwLCBmb3IgZXhhbXBsZSkuCisKKyAgIE9uIG1vc3QgbWFjaGluZXMsIHdlIG5ldmVyIGhhdmUgdG8gZ3Vlc3MgYWJvdXQgdGhlIGFyZ3MgYWRkcmVzcywKKyAgIHNvIEZSQU1FX0FSR1NfQUREUkVTU3ssX0NPUlJFQ1R9IGFyZSB0aGUgc2FtZS4gICovCisjaWYgIWRlZmluZWQgKEZSQU1FX0FSR1NfQUREUkVTU19DT1JSRUNUKQorI2RlZmluZSBGUkFNRV9BUkdTX0FERFJFU1NfQ09SUkVDVCBGUkFNRV9BUkdTX0FERFJFU1MKKyNlbmRpZgorCisvKiBQcmludCB2ZXJib3NlbHkgdGhlIHNlbGVjdGVkIGZyYW1lIG9yIHRoZSBmcmFtZSBhdCBhZGRyZXNzIEFERFIuCisgICBUaGlzIG1lYW5zIGFic29sdXRlbHkgYWxsIGluZm9ybWF0aW9uIGluIHRoZSBmcmFtZSBpcyBwcmludGVkLiAgKi8KKworc3RhdGljIHZvaWQKK2ZyYW1lX2luZm8gKGFkZHJfZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYWRkcl9leHA7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKyAgc3RydWN0IHN5bWJvbCAqZnVuYzsKKyAgc3RydWN0IHN5bXRhYiAqczsKKyAgc3RydWN0IGZyYW1lX2luZm8gKmNhbGxpbmdfZnJhbWVfaW5mbzsKKyAgaW50IGksIGNvdW50LCBudW1yZWdzOworICBjaGFyICpmdW5uYW1lID0gMDsKKyAgZW51bSBsYW5ndWFnZSBmdW5sYW5nID0gbGFuZ3VhZ2VfdW5rbm93bjsKKworICBpZiAoIXRhcmdldF9oYXNfc3RhY2spCisgICAgZXJyb3IgKCJObyBzdGFjay4iKTsKKworICBmaSA9IHBhcnNlX2ZyYW1lX3NwZWNpZmljYXRpb24gKGFkZHJfZXhwKTsKKyAgaWYgKGZpID09IE5VTEwpCisgICAgZXJyb3IgKCJJbnZhbGlkIGZyYW1lIHNwZWNpZmllZC4iKTsKKworICBzYWwgPSBmaW5kX3BjX2xpbmUgKGZpLT5wYywKKwkJICAgICAgZmktPm5leHQgIT0gTlVMTAorCQkgICAgICAmJiAhZmktPm5leHQtPnNpZ25hbF9oYW5kbGVyX2NhbGxlcgorCQkgICAgICAmJiAhZnJhbWVfaW5fZHVtbXkgKGZpLT5uZXh0KSk7CisgIGZ1bmMgPSBnZXRfZnJhbWVfZnVuY3Rpb24gKGZpKTsKKyAgcyA9IGZpbmRfcGNfc3ltdGFiKGZpLT5wYyk7CisgIGlmIChmdW5jKQorICAgIHsKKyAgICAgIC8qIEknZCBsaWtlIHRvIHVzZSBTWU1CT0xfU09VUkNFX05BTUUoKSBoZXJlLCB0byBkaXNwbGF5CisgICAgICAgKiB0aGUgZGVtYW5nbGVkIG5hbWUgdGhhdCB3ZSBhbHJlYWR5IGhhdmUgc3RvcmVkIGluCisgICAgICAgKiB0aGUgc3ltYm9sIHRhYmxlLCBidXQgd2Ugc3RvcmVkIGEgdmVyc2lvbiB3aXRoCisgICAgICAgKiBETUdMX1BBUkFNUyB0dXJuZWQgb24sIGFuZCBoZXJlIHdlIGRvbid0IHdhbnQKKyAgICAgICAqIHRvIGRpc3BsYXkgcGFyYW1ldGVycy4gU28gY2FsbCB0aGUgZGVtYW5nbGVyIGFnYWluLAorICAgICAgICogd2l0aCBETUdMX0FOU0kgb25seS4gUlQKKyAgICAgICAqIChZZXMsIEkga25vdyB0aGF0IHByaW50Zl9zeW1ib2xfZmlsdGVyZWQoKSB3aWxsCisgICAgICAgKiBhZ2FpbiB0cnkgdG8gZGVtYW5nbGUgdGhlIG5hbWUgb24gdGhlIGZseSwgYnV0CisgICAgICAgKiB0aGUgaXNzdWUgaXMgdGhhdCBpZiBjcGx1c19kZW1hbmdsZSgpIGZhaWxzIGhlcmUsCisgICAgICAgKiBpdCdsbCBmYWlsIHRoZXJlIHRvby4gU28gd2Ugd2FudCB0byBjYXRjaCB0aGUgZmFpbHVyZQorICAgICAgICogKCJkZW1hbmdsZWQ9PU5VTEwiIGNhc2UgYmVsb3cpIGhlcmUsIHdoaWxlIHdlIHN0aWxsCisgICAgICAgKiBoYXZlIG91ciBoYW5kcyBvbiB0aGUgZnVuY3Rpb24gc3ltYm9sLikKKyAgICAgICAqLworICAgICAgIGNoYXIgKiBkZW1hbmdsZWQ7CisgICAgICAgZnVubmFtZSA9IFNZTUJPTF9OQU1FIChmdW5jKTsKKyAgICAgICBmdW5sYW5nID0gU1lNQk9MX0xBTkdVQUdFIChmdW5jKTsKKyAgICAgICBpZiAoZnVubGFuZyA9PSBsYW5ndWFnZV9jcGx1cykKKwkgeworCSAgIGRlbWFuZ2xlZCA9IGNwbHVzX2RlbWFuZ2xlIChmdW5uYW1lLCBETUdMX0FOU0kpOworCSAgIC8qIElmIHRoZSBkZW1hbmdsZXIgZmFpbHMsIHRyeSB0aGUgZGVtYW5nbGVkIG5hbWUKKwkgICAgKiBmcm9tIHRoZSBzeW1ib2wgdGFibGUuIFRoaXMnbGwgaGF2ZSBwYXJhbWV0ZXJzLAorCSAgICAqIGJ1dCB0aGF0J3MgcHJlZmVyYWJsZSB0byBkaXBsYXlpbmcgYSBtYW5nbGVkIG5hbWUuCisJICAgICovCisJICAgaWYgKGRlbWFuZ2xlZCA9PSBOVUxMKQorCSAgICAgZnVubmFtZSA9IFNZTUJPTF9TT1VSQ0VfTkFNRSAoZnVuYyk7CisJIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZWdpc3RlciBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGMgKGZpLT5wYyk7CisgICAgICBpZiAobXN5bWJvbCAhPSBOVUxMKQorCXsKKwkgIGZ1bm5hbWUgPSBTWU1CT0xfTkFNRSAobXN5bWJvbCk7CisJICBmdW5sYW5nID0gU1lNQk9MX0xBTkdVQUdFIChtc3ltYm9sKTsKKwl9CisgICAgfQorICBjYWxsaW5nX2ZyYW1lX2luZm8gPSBnZXRfcHJldl9mcmFtZSAoZmkpOworCisgIGlmICghYWRkcl9leHAgJiYgc2VsZWN0ZWRfZnJhbWVfbGV2ZWwgPj0gMCkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJTdGFjayBsZXZlbCAlZCwgZnJhbWUgYXQgIiwgc2VsZWN0ZWRfZnJhbWVfbGV2ZWwpOworICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChmaS0+ZnJhbWUsIDEsIGdkYl9zdGRvdXQpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiOlxuIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiU3RhY2sgZnJhbWUgYXQgIik7CisgICAgICBwcmludF9hZGRyZXNzX251bWVyaWMgKGZpLT5mcmFtZSwgMSwgZ2RiX3N0ZG91dCk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCI6XG4iKTsKKyAgICB9CisgIHByaW50Zl9maWx0ZXJlZCAoIiAlcyA9ICIsIFJFR0lTVEVSX05BTUUgKFBDX1JFR05VTSkpOworICBwcmludF9hZGRyZXNzX251bWVyaWMgKGZpLT5wYywgMSwgZ2RiX3N0ZG91dCk7CisKKyAgd3JhcF9oZXJlICgiICAgIik7CisgIGlmIChmdW5uYW1lKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiBpbiAiKTsKKyAgICAgIGZwcmludGZfc3ltYm9sX2ZpbHRlcmVkIChnZGJfc3Rkb3V0LCBmdW5uYW1lLCBmdW5sYW5nLAorCQkJICAgICAgIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKKyAgICB9CisgIHdyYXBfaGVyZSAoIiAgICIpOworICBpZiAoc2FsLnN5bXRhYikKKyAgICBwcmludGZfZmlsdGVyZWQgKCIgKCVzOiVkKSIsIHNhbC5zeW10YWItPmZpbGVuYW1lLCBzYWwubGluZSk7CisgIHB1dHNfZmlsdGVyZWQgKCI7ICIpOworICB3cmFwX2hlcmUgKCIgICAgIik7CisgIHByaW50Zl9maWx0ZXJlZCAoInNhdmVkICVzICIsIFJFR0lTVEVSX05BTUUgKFBDX1JFR05VTSkpOworICBwcmludF9hZGRyZXNzX251bWVyaWMgKEZSQU1FX1NBVkVEX1BDIChmaSksIDEsIGdkYl9zdGRvdXQpOworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworCisgIHsKKyAgICBpbnQgZnJhbWVsZXNzID0gMDsKKyNpZmRlZiBGUkFNRUxFU1NfRlVOQ1RJT05fSU5WT0NBVElPTgorICAgIEZSQU1FTEVTU19GVU5DVElPTl9JTlZPQ0FUSU9OIChmaSwgZnJhbWVsZXNzKTsKKyNlbmRpZgorICAgIGlmIChmcmFtZWxlc3MpCisgICAgICBwcmludGZfZmlsdGVyZWQgKCIgKEZSQU1FTEVTUyksIik7CisgIH0KKworICBpZiAoY2FsbGluZ19mcmFtZV9pbmZvKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiBjYWxsZWQgYnkgZnJhbWUgYXQgIik7CisgICAgICBwcmludF9hZGRyZXNzX251bWVyaWMgKGNhbGxpbmdfZnJhbWVfaW5mby0+ZnJhbWUsIDEsIGdkYl9zdGRvdXQpOworICAgIH0KKyAgaWYgKGZpLT5uZXh0ICYmIGNhbGxpbmdfZnJhbWVfaW5mbykKKyAgICBwdXRzX2ZpbHRlcmVkICgiLCIpOworICB3cmFwX2hlcmUgKCIgICAiKTsKKyAgaWYgKGZpLT5uZXh0KQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiBjYWxsZXIgb2YgZnJhbWUgYXQgIik7CisgICAgICBwcmludF9hZGRyZXNzX251bWVyaWMgKGZpLT5uZXh0LT5mcmFtZSwgMSwgZ2RiX3N0ZG91dCk7CisgICAgfQorICBpZiAoZmktPm5leHQgfHwgY2FsbGluZ19mcmFtZV9pbmZvKQorICAgIHB1dHNfZmlsdGVyZWQgKCJcbiIpOworICBpZiAocykKKyAgICBwcmludGZfZmlsdGVyZWQgKCIgc291cmNlIGxhbmd1YWdlICVzLlxuIiwgbGFuZ3VhZ2Vfc3RyIChzLT5sYW5ndWFnZSkpOworCisjaWZkZWYgUFJJTlRfRVhUUkFfRlJBTUVfSU5GTworICBQUklOVF9FWFRSQV9GUkFNRV9JTkZPIChmaSk7CisjZW5kaWYKKworICB7CisgICAgLyogQWRkcmVzcyBvZiB0aGUgYXJndW1lbnQgbGlzdCBmb3IgdGhpcyBmcmFtZSwgb3IgMC4gICovCisgICAgQ09SRV9BRERSIGFyZ19saXN0ID0gRlJBTUVfQVJHU19BRERSRVNTX0NPUlJFQ1QgKGZpKTsKKyAgICAvKiBOdW1iZXIgb2YgYXJncyBmb3IgdGhpcyBmcmFtZSwgb3IgLTEgaWYgdW5rbm93bi4gICovCisgICAgaW50IG51bWFyZ3M7CisKKyAgICBpZiAoYXJnX2xpc3QgPT0gMCkKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiBBcmdsaXN0IGF0IHVua25vd24gYWRkcmVzcy5cbiIpOworICAgIGVsc2UKKyAgICAgIHsKKwlwcmludGZfZmlsdGVyZWQgKCIgQXJnbGlzdCBhdCAiKTsKKwlwcmludF9hZGRyZXNzX251bWVyaWMgKGFyZ19saXN0LCAxLCBnZGJfc3Rkb3V0KTsKKwlwcmludGZfZmlsdGVyZWQgKCIsIik7CisKKwlGUkFNRV9OVU1fQVJHUyAobnVtYXJncywgZmkpOworCWlmIChudW1hcmdzIDwgMCkKKwkgIHB1dHNfZmlsdGVyZWQgKCIgYXJnczogIik7CisJZWxzZSBpZiAobnVtYXJncyA9PSAwKQorCSAgcHV0c19maWx0ZXJlZCAoIiBubyBhcmdzLiIpOworCWVsc2UgaWYgKG51bWFyZ3MgPT0gMSkKKwkgIHB1dHNfZmlsdGVyZWQgKCIgMSBhcmc6ICIpOworCWVsc2UKKwkgIHByaW50Zl9maWx0ZXJlZCAoIiAlZCBhcmdzOiAiLCBudW1hcmdzKTsKKwlwcmludF9mcmFtZV9hcmdzIChmdW5jLCBmaSwgbnVtYXJncywgZ2RiX3N0ZG91dCk7CisJcHV0c19maWx0ZXJlZCAoIlxuIik7CisgICAgICB9CisgIH0KKyAgeworICAgIC8qIEFkZHJlc3Mgb2YgdGhlIGxvY2FsIHZhcmlhYmxlcyBmb3IgdGhpcyBmcmFtZSwgb3IgMC4gICovCisgICAgQ09SRV9BRERSIGFyZ19saXN0ID0gRlJBTUVfTE9DQUxTX0FERFJFU1MgKGZpKTsKKworICAgIGlmIChhcmdfbGlzdCA9PSAwKQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiIExvY2FscyBhdCB1bmtub3duIGFkZHJlc3MsIik7CisgICAgZWxzZQorICAgICAgeworCXByaW50Zl9maWx0ZXJlZCAoIiBMb2NhbHMgYXQgIik7CisJcHJpbnRfYWRkcmVzc19udW1lcmljIChhcmdfbGlzdCwgMSwgZ2RiX3N0ZG91dCk7CisJcHJpbnRmX2ZpbHRlcmVkICgiLCIpOworICAgICAgfQorICB9CisKKyAgRlJBTUVfSU5JVF9TQVZFRF9SRUdTIChmaSk7CisgIGlmIChmaS0+c2F2ZWRfcmVncyAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFRoZSBzcCBpcyBzcGVjaWFsOyB3aGF0J3MgcmV0dXJuZWQgaXNuJ3QgdGhlIHNhdmUgYWRkcmVzcywgYnV0CisJIGFjdHVhbGx5IHRoZSB2YWx1ZSBvZiB0aGUgcHJldmlvdXMgZnJhbWUncyBzcC4gICovCisgICAgICBwcmludGZfZmlsdGVyZWQgKCIgUHJldmlvdXMgZnJhbWUncyBzcCBpcyAiKTsKKyAgICAgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoZmktPnNhdmVkX3JlZ3NbU1BfUkVHTlVNXSwgMSwgZ2RiX3N0ZG91dCk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICAgICAgY291bnQgPSAwOworICAgICAgbnVtcmVncyA9IEFSQ0hfTlVNX1JFR1M7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtcmVnczsgaSsrKQorCWlmIChmaS0+c2F2ZWRfcmVnc1tpXSAmJiBpICE9IFNQX1JFR05VTSkKKwkgIHsKKwkgICAgaWYgKGNvdW50ID09IDApCisJICAgICAgcHV0c19maWx0ZXJlZCAoIiBTYXZlZCByZWdpc3RlcnM6XG4gIik7CisJICAgIGVsc2UKKwkgICAgICBwdXRzX2ZpbHRlcmVkICgiLCIpOworCSAgICB3cmFwX2hlcmUgKCIgIik7CisJICAgIHByaW50Zl9maWx0ZXJlZCAoIiAlcyBhdCAiLCBSRUdJU1RFUl9OQU1FIChpKSk7CisJICAgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoZmktPnNhdmVkX3JlZ3NbaV0sIDEsIGdkYl9zdGRvdXQpOworCSAgICBjb3VudCsrOworCSAgfQorICAgICAgaWYgKGNvdW50KQorCXB1dHNfZmlsdGVyZWQgKCJcbiIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIGNvdWxkIGdldCBzb21lIGluZm9ybWF0aW9uIGFib3V0IHNhdmVkIHJlZ2lzdGVycyBieQorCSBjYWxsaW5nIGdldF9zYXZlZF9yZWdpc3RlciBvbiBlYWNoIHJlZ2lzdGVyLiAgV2hpY2ggaW5mbyBnb2VzCisJIHdpdGggd2hpY2ggZnJhbWUgaXMgbmVjZXNzYXJpbHkgbG9zdCwgaG93ZXZlciwgYW5kIEkgc3VzcGVjdAorCSB0aGF0IHRoZSB1c2VycyBkb24ndCBjYXJlIHdoZXRoZXIgdGhleSBnZXQgdGhlIGluZm8uICAqLworICAgICAgcHV0c19maWx0ZXJlZCAoIlxuIik7CisgICAgfQorfQorCisjaWYgMAorLyogU2V0IGEgbGltaXQgb24gdGhlIG51bWJlciBvZiBmcmFtZXMgcHJpbnRlZCBieSBkZWZhdWx0IGluIGEKKyAgIGJhY2t0cmFjZS4gICovCisKK3N0YXRpYyBpbnQgYmFja3RyYWNlX2xpbWl0OworCitzdGF0aWMgdm9pZAorc2V0X2JhY2t0cmFjZV9saW1pdF9jb21tYW5kIChjb3VudF9leHAsIGZyb21fdHR5KQorICAgICBjaGFyICpjb3VudF9leHA7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IGNvdW50ID0gcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAoY291bnRfZXhwKTsKKworICBpZiAoY291bnQgPCAwKQorICAgIGVycm9yICgiTmVnYXRpdmUgYXJndW1lbnQgbm90IG1lYW5pbmdmdWwgYXMgYmFja3RyYWNlIGxpbWl0LiIpOworCisgIGJhY2t0cmFjZV9saW1pdCA9IGNvdW50OworfQorCitzdGF0aWMgdm9pZAorYmFja3RyYWNlX2xpbWl0X2luZm8gKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAoYXJnKQorICAgIGVycm9yICgiXCJJbmZvIGJhY2t0cmFjZS1saW1pdFwiIHRha2VzIG5vIGFyZ3VtZW50cy4iKTsKKworICBwcmludGZfdW5maWx0ZXJlZCAoIkJhY2t0cmFjZSBsaW1pdDogJWQuXG4iLCBiYWNrdHJhY2VfbGltaXQpOworfQorI2VuZGlmCisKKy8qIFByaW50IGJyaWVmbHkgYWxsIHN0YWNrIGZyYW1lcyBvciBqdXN0IHRoZSBpbm5lcm1vc3QgQ09VTlQgZnJhbWVzLiAgKi8KKworc3RhdGljIHZvaWQKK2JhY2t0cmFjZV9jb21tYW5kXzEgKGNvdW50X2V4cCwgc2hvd19sb2NhbHMsIGZyb21fdHR5KQorICAgICBjaGFyICpjb3VudF9leHA7CisgICAgIGludCBzaG93X2xvY2FsczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7CisgIHJlZ2lzdGVyIGludCBjb3VudDsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBmcmFtZV9pbmZvICp0cmFpbGluZzsKKyAgcmVnaXN0ZXIgaW50IHRyYWlsaW5nX2xldmVsOworCisgIGlmICghdGFyZ2V0X2hhc19zdGFjaykKKyAgICBlcnJvciAoIk5vIHN0YWNrLiIpOworCisgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSBtdXN0IGRvIHR3byB0aGluZ3MuICBGaXJzdCwgaXQgbXVzdAorICAgICBzZXQgdGhlIHZhcmlhYmxlIFRSQUlMSU5HIHRvIHRoZSBmcmFtZSBmcm9tIHdoaWNoIHdlIHNob3VsZCBzdGFydAorICAgICBwcmludGluZy4gIFNlY29uZCwgaXQgbXVzdCBzZXQgdGhlIHZhcmlhYmxlIGNvdW50IHRvIHRoZSBudW1iZXIKKyAgICAgb2YgZnJhbWVzIHdoaWNoIHdlIHNob3VsZCBwcmludCwgb3IgLTEgaWYgYWxsIG9mIHRoZW0uICAqLworICB0cmFpbGluZyA9IGdldF9jdXJyZW50X2ZyYW1lICgpOworICB0cmFpbGluZ19sZXZlbCA9IDA7CisgIGlmIChjb3VudF9leHApCisgICAgeworICAgICAgY291bnQgPSBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIChjb3VudF9leHApOworICAgICAgaWYgKGNvdW50IDwgMCkKKwl7CisJICBzdHJ1Y3QgZnJhbWVfaW5mbyAqY3VycmVudDsKKworCSAgY291bnQgPSAtY291bnQ7CisKKwkgIGN1cnJlbnQgPSB0cmFpbGluZzsKKwkgIHdoaWxlIChjdXJyZW50ICYmIGNvdW50LS0pCisJICAgIHsKKwkgICAgICBRVUlUOworCSAgICAgIGN1cnJlbnQgPSBnZXRfcHJldl9mcmFtZSAoY3VycmVudCk7CisJICAgIH0KKwkgIAorCSAgLyogV2lsbCBzdG9wIHdoZW4gQ1VSUkVOVCByZWFjaGVzIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgVFJBSUxJTkcKKwkgICAgIHdpbGwgYmUgQ09VTlQgYmVsb3cgaXQuICAqLworCSAgd2hpbGUgKGN1cnJlbnQpCisJICAgIHsKKwkgICAgICBRVUlUOworCSAgICAgIHRyYWlsaW5nID0gZ2V0X3ByZXZfZnJhbWUgKHRyYWlsaW5nKTsKKwkgICAgICBjdXJyZW50ID0gZ2V0X3ByZXZfZnJhbWUgKGN1cnJlbnQpOworCSAgICAgIHRyYWlsaW5nX2xldmVsKys7CisJICAgIH0KKwkgIAorCSAgY291bnQgPSAtMTsKKwl9CisgICAgfQorICBlbHNlCisgICAgY291bnQgPSAtMTsKKworICBpZiAoaW5mb192ZXJib3NlKQorICAgIHsKKyAgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHM7CisgICAgICAKKyAgICAgIC8qIFJlYWQgaW4gc3ltYm9scyBmb3IgYWxsIG9mIHRoZSBmcmFtZXMuICBOZWVkIHRvIGRvIHRoaXMgaW4KKwkgYSBzZXBhcmF0ZSBwYXNzIHNvIHRoYXQgIlJlYWRpbmcgaW4gc3ltYm9scyBmb3IgeHh4IiBtZXNzYWdlcworCSBkb24ndCBzY3JldyB1cCB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgYmFja3RyYWNlLiAgQWxzbworCSBpZiBwZW9wbGUgaGF2ZSBzdHJvbmcgb3BpbmlvbnMgYWdhaW5zdCByZWFkaW5nIHN5bWJvbHMgZm9yCisJIGJhY2t0cmFjZSB0aGlzIG1heSBoYXZlIHRvIGJlIGFuIG9wdGlvbi4gICovCisgICAgICBpID0gY291bnQ7CisgICAgICBmb3IgKGZpID0gdHJhaWxpbmc7CisJICAgZmkgIT0gTlVMTCAmJiBpLS07CisJICAgZmkgPSBnZXRfcHJldl9mcmFtZSAoZmkpKQorCXsKKwkgIFFVSVQ7CisJICBwcyA9IGZpbmRfcGNfcHN5bXRhYiAoZmktPnBjKTsKKwkgIGlmIChwcykKKwkgICAgUFNZTVRBQl9UT19TWU1UQUIgKHBzKTsJLyogRm9yY2Ugc3ltcyB0byBjb21lIGluICovCisJfQorICAgIH0KKworICBmb3IgKGkgPSAwLCBmaSA9IHRyYWlsaW5nOworICAgICAgIGZpICYmIGNvdW50LS07CisgICAgICAgaSsrLCBmaSA9IGdldF9wcmV2X2ZyYW1lIChmaSkpCisgICAgeworICAgICAgUVVJVDsKKworICAgICAgLyogRG9uJ3QgdXNlIHByaW50X3N0YWNrX2ZyYW1lOyBpZiBhbiBlcnJvcigpIG9jY3VycyBpdCBwcm9iYWJseQorCSBtZWFucyBmdXJ0aGVyIGF0dGVtcHRzIHRvIGJhY2t0cmFjZSB3b3VsZCBmYWlsIChvbiB0aGUgb3RoZXIKKwkgaGFuZCwgcGVyaGFwcyB0aGUgY29kZSBkb2VzIG9yIGNvdWxkIGJlIGZpeGVkIHRvIG1ha2Ugc3VyZQorCSB0aGUgZnJhbWUtPnByZXYgZmllbGQgZ2V0cyBzZXQgdG8gTlVMTCBpbiB0aGF0IGNhc2UpLiAgKi8KKyAgICAgIHByaW50X2ZyYW1lX2luZm9fYmFzZSAoZmksIHRyYWlsaW5nX2xldmVsICsgaSwgMCwgMSk7CisgICAgICBpZiAoc2hvd19sb2NhbHMpCisJcHJpbnRfZnJhbWVfbG9jYWxfdmFycyhmaSwgMSwgZ2RiX3N0ZG91dCk7CisgICAgfQorCisgIC8qIElmIHdlJ3ZlIHN0b3BwZWQgYmVmb3JlIHRoZSBlbmQsIG1lbnRpb24gdGhhdC4gICovCisgIGlmIChmaSAmJiBmcm9tX3R0eSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIoTW9yZSBzdGFjayBmcmFtZXMgZm9sbG93Li4uKVxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitiYWNrdHJhY2VfY29tbWFuZCAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCBjbGVhbnVwICAgICpvbGRfY2hhaW4gPSAoc3RydWN0IGNsZWFudXAgKilOVUxMOworICBjaGFyICAgICAgICAgICAgICAqKmFyZ3YgPSAoY2hhciAqKilOVUxMOworICBpbnQgICAgICAgICAgICAgICBhcmdJbmRpY2F0aW5nRnVsbFRyYWNlID0gKC0xKSwgdG90QXJnTGVuID0gMCwgYXJnYyA9IDA7CisgIGNoYXIgICAgICAgICAgICAgICphcmdQdHIgPSBhcmc7CisKKyAgaWYgKGFyZyAhPSAoY2hhciAqKU5VTEwpCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGFyZ3YgPSBidWlsZGFyZ3YoYXJnKTsKKyAgICAgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlYXJndiwgKGNoYXIgKilhcmd2KTsKKyAgICAgIGFyZ2MgPSAwOworICAgICAgZm9yIChpID0gMDsgKGFyZ3ZbaV0gIT0gKGNoYXIgKilOVUxMKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICBmb3IgKGogPSAwOyAoaiA8IHN0cmxlbihhcmd2W2ldKSk7IGorKykKKyAgICAgICAgICAgIGFyZ3ZbaV1bal0gPSB0b2xvd2VyKGFyZ3ZbaV1bal0pOworCisgICAgICAgICAgaWYgKGFyZ0luZGljYXRpbmdGdWxsVHJhY2UgPCAwICYmIHN1YnNldENvbXBhcmUoYXJndltpXSwgImZ1bGwiKSkKKyAgICAgICAgICAgIGFyZ0luZGljYXRpbmdGdWxsVHJhY2UgPSBhcmdjOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYXJnYysrOworICAgICAgICAgICAgICB0b3RBcmdMZW4gKz0gc3RybGVuKGFyZ3ZbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB0b3RBcmdMZW4gKz0gYXJnYzsKKyAgICAgIGlmIChhcmdJbmRpY2F0aW5nRnVsbFRyYWNlID49IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAodG90QXJnTGVuID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYXJnUHRyID0gKGNoYXIgKil4bWFsbG9jKHRvdEFyZ0xlbiArIDEpOworICAgICAgICAgICAgICBpZiAoIWFyZ1B0cikKKyAgICAgICAgICAgICAgICBub21lbSgwKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG1lbXNldChhcmdQdHIsIDAsIHRvdEFyZ0xlbiArIDEpOworICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgKGkgPCAoYXJnYyArIDEpKTsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gYXJnSW5kaWNhdGluZ0Z1bGxUcmFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY2F0KGFyZ1B0ciwgYXJndltpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNhdChhcmdQdHIsICIgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYXJnUHRyID0gKGNoYXIgKilOVUxMOworICAgICAgICB9CisgICAgfQorCisgIGJhY2t0cmFjZV9jb21tYW5kXzEgKGFyZ1B0ciwgKGFyZ0luZGljYXRpbmdGdWxsVHJhY2UgPj0gMCksIGZyb21fdHR5KTsKKworICBpZiAoYXJnSW5kaWNhdGluZ0Z1bGxUcmFjZSA+PSAwICYmIHRvdEFyZ0xlbiA+IDApCisgICAgZnJlZShhcmdQdHIpOworCisgIGlmIChvbGRfY2hhaW4pCisgICAgZG9fY2xlYW51cHMob2xkX2NoYWluKTsKK30KKworc3RhdGljIHZvaWQKK2JhY2t0cmFjZV9mdWxsX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBiYWNrdHJhY2VfY29tbWFuZF8xIChhcmcsIDEsIGZyb21fdHR5KTsKK30KKworDAorLyogUHJpbnQgdGhlIGxvY2FsIHZhcmlhYmxlcyBvZiBhIGJsb2NrIEIgYWN0aXZlIGluIEZSQU1FLgorICAgUmV0dXJuIDEgaWYgYW55IHZhcmlhYmxlcyB3ZXJlIHByaW50ZWQ7IDAgb3RoZXJ3aXNlLiAgKi8KKworc3RhdGljIGludAorcHJpbnRfYmxvY2tfZnJhbWVfbG9jYWxzIChiLCBmaSwgbnVtX3RhYnMsIHN0cmVhbSkKKyAgICAgc3RydWN0IGJsb2NrICpiOworICAgICByZWdpc3RlciBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7CisgICAgIGludCBudW1fdGFiczsKKyAgICAgcmVnaXN0ZXIgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgaW50IG5zeW1zOworICByZWdpc3RlciBpbnQgaSwgajsKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bWJvbCAqc3ltOworICByZWdpc3RlciBpbnQgdmFsdWVzX3ByaW50ZWQgPSAwOworCisgIG5zeW1zID0gQkxPQ0tfTlNZTVMgKGIpOworCisgIGZvciAoaSA9IDA7IGkgPCBuc3ltczsgaSsrKQorICAgIHsKKyAgICAgIHN5bSA9IEJMT0NLX1NZTSAoYiwgaSk7CisgICAgICBzd2l0Y2ggKFNZTUJPTF9DTEFTUyAoc3ltKSkKKwl7CisJY2FzZSBMT0NfTE9DQUw6CisJY2FzZSBMT0NfUkVHSVNURVI6CisJY2FzZSBMT0NfU1RBVElDOgorCWNhc2UgTE9DX0JBU0VSRUc6CisJICB2YWx1ZXNfcHJpbnRlZCA9IDE7CisJICBmb3IgKGogPSAwOyBqIDwgbnVtX3RhYnM7IGorKykKKwkgICAgZnB1dHNfZmlsdGVyZWQoIlx0Iiwgc3RyZWFtKTsKKwkgIGZwdXRzX2ZpbHRlcmVkIChTWU1CT0xfU09VUkNFX05BTUUgKHN5bSksIHN0cmVhbSk7CisJICBmcHV0c19maWx0ZXJlZCAoIiA9ICIsIHN0cmVhbSk7CisJICBwcmludF92YXJpYWJsZV92YWx1ZSAoc3ltLCBmaSwgc3RyZWFtKTsKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlxuIik7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICAvKiBJZ25vcmUgc3ltYm9scyB3aGljaCBhcmUgbm90IGxvY2Fscy4gICovCisJICBicmVhazsKKwl9CisgICAgfQorICByZXR1cm4gdmFsdWVzX3ByaW50ZWQ7Cit9CisKKy8qIFNhbWUsIGJ1dCBwcmludCBsYWJlbHMuICAqLworCitzdGF0aWMgaW50CitwcmludF9ibG9ja19mcmFtZV9sYWJlbHMgKGIsIGhhdmVfZGVmYXVsdCwgc3RyZWFtKQorICAgICBzdHJ1Y3QgYmxvY2sgKmI7CisgICAgIGludCAqaGF2ZV9kZWZhdWx0OworICAgICByZWdpc3RlciBHREJfRklMRSAqc3RyZWFtOworeworICBpbnQgbnN5bXM7CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIHJlZ2lzdGVyIGludCB2YWx1ZXNfcHJpbnRlZCA9IDA7CisKKyAgbnN5bXMgPSBCTE9DS19OU1lNUyAoYik7CisKKyAgZm9yIChpID0gMDsgaSA8IG5zeW1zOyBpKyspCisgICAgeworICAgICAgc3ltID0gQkxPQ0tfU1lNIChiLCBpKTsKKyAgICAgIGlmIChTVFJFUSAoU1lNQk9MX05BTUUgKHN5bSksICJkZWZhdWx0IikpCisJeworCSAgaWYgKCpoYXZlX2RlZmF1bHQpCisJICAgIGNvbnRpbnVlOworCSAgKmhhdmVfZGVmYXVsdCA9IDE7CisJfQorICAgICAgaWYgKFNZTUJPTF9DTEFTUyAoc3ltKSA9PSBMT0NfTEFCRUwpCisJeworCSAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CisJICBzYWwgPSBmaW5kX3BjX2xpbmUgKFNZTUJPTF9WQUxVRV9BRERSRVNTIChzeW0pLCAwKTsKKwkgIHZhbHVlc19wcmludGVkID0gMTsKKwkgIGZwdXRzX2ZpbHRlcmVkIChTWU1CT0xfU09VUkNFX05BTUUgKHN5bSksIHN0cmVhbSk7CisJICBpZiAoYWRkcmVzc3ByaW50KQorCSAgICB7CisJICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiICIpOworCSAgICAgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoU1lNQk9MX1ZBTFVFX0FERFJFU1MgKHN5bSksIDEsIHN0cmVhbSk7CisJICAgIH0KKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiBpbiBmaWxlICVzLCBsaW5lICVkXG4iLAorCQkJICAgIHNhbC5zeW10YWItPmZpbGVuYW1lLCBzYWwubGluZSk7CisJfQorICAgIH0KKyAgcmV0dXJuIHZhbHVlc19wcmludGVkOworfQorCisvKiBQcmludCBvbiBTVFJFQU0gYWxsIHRoZSBsb2NhbCB2YXJpYWJsZXMgaW4gZnJhbWUgRlJBTUUsCisgICBpbmNsdWRpbmcgYWxsIHRoZSBibG9ja3MgYWN0aXZlIGluIHRoYXQgZnJhbWUKKyAgIGF0IGl0cyBjdXJyZW50IHBjLgorCisgICBSZXR1cm5zIDEgaWYgdGhlIGpvYiB3YXMgZG9uZSwKKyAgIG9yIDAgaWYgbm90aGluZyB3YXMgcHJpbnRlZCBiZWNhdXNlIHdlIGhhdmUgbm8gaW5mbworICAgb24gdGhlIGZ1bmN0aW9uIHJ1bm5pbmcgaW4gRlJBTUUuICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfZnJhbWVfbG9jYWxfdmFycyAoZmksIG51bV90YWJzLCBzdHJlYW0pCisgICAgIHJlZ2lzdGVyIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKKyAgICAgcmVnaXN0ZXIgaW50IG51bV90YWJzOworICAgICByZWdpc3RlciBHREJfRklMRSAqc3RyZWFtOworeworICByZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmJsb2NrID0gZ2V0X2ZyYW1lX2Jsb2NrIChmaSk7CisgIHJlZ2lzdGVyIGludCB2YWx1ZXNfcHJpbnRlZCA9IDA7CisKKyAgaWYgKGJsb2NrID09IDApCisgICAgeworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiTm8gc3ltYm9sIHRhYmxlIGluZm8gYXZhaWxhYmxlLlxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICAKKyAgd2hpbGUgKGJsb2NrICE9IDApCisgICAgeworICAgICAgaWYgKHByaW50X2Jsb2NrX2ZyYW1lX2xvY2FscyAoYmxvY2ssIGZpLCBudW1fdGFicywgc3RyZWFtKSkKKwl2YWx1ZXNfcHJpbnRlZCA9IDE7CisgICAgICAvKiBBZnRlciBoYW5kbGluZyB0aGUgZnVuY3Rpb24ncyB0b3AtbGV2ZWwgYmxvY2ssIHN0b3AuCisJIERvbid0IGNvbnRpbnVlIHRvIGl0cyBzdXBlcmJsb2NrLCB0aGUgYmxvY2sgb2YKKwkgcGVyLWZpbGUgc3ltYm9scy4gICovCisgICAgICBpZiAoQkxPQ0tfRlVOQ1RJT04gKGJsb2NrKSkKKwlicmVhazsKKyAgICAgIGJsb2NrID0gQkxPQ0tfU1VQRVJCTE9DSyAoYmxvY2spOworICAgIH0KKworICBpZiAoIXZhbHVlc19wcmludGVkKQorICAgIHsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIk5vIGxvY2Fscy5cbiIpOworICAgIH0KK30KKworLyogU2FtZSwgYnV0IHByaW50IGxhYmVscy4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF9mcmFtZV9sYWJlbF92YXJzIChmaSwgdGhpc19sZXZlbF9vbmx5LCBzdHJlYW0pCisgICAgIHJlZ2lzdGVyIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKKyAgICAgaW50IHRoaXNfbGV2ZWxfb25seTsKKyAgICAgcmVnaXN0ZXIgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGJsb2NrdmVjdG9yICpibDsKKyAgcmVnaXN0ZXIgc3RydWN0IGJsb2NrICpibG9jayA9IGdldF9mcmFtZV9ibG9jayAoZmkpOworICByZWdpc3RlciBpbnQgdmFsdWVzX3ByaW50ZWQgPSAwOworICBpbnQgaW5kZXgsIGhhdmVfZGVmYXVsdCA9IDA7CisgIGNoYXIgKmJsb2Nrc19wcmludGVkOworICBDT1JFX0FERFIgcGMgPSBmaS0+cGM7CisKKyAgaWYgKGJsb2NrID09IDApCisgICAgeworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiTm8gc3ltYm9sIHRhYmxlIGluZm8gYXZhaWxhYmxlLlxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGJsID0gYmxvY2t2ZWN0b3JfZm9yX3BjIChCTE9DS19FTkQgKGJsb2NrKSAtIDQsICZpbmRleCk7CisgIGJsb2Nrc19wcmludGVkID0gKGNoYXIgKikgYWxsb2NhIChCTE9DS1ZFQ1RPUl9OQkxPQ0tTIChibCkgKiBzaXplb2YgKGNoYXIpKTsKKyAgbWVtc2V0IChibG9ja3NfcHJpbnRlZCwgMCwgQkxPQ0tWRUNUT1JfTkJMT0NLUyAoYmwpICogc2l6ZW9mIChjaGFyKSk7CisKKyAgd2hpbGUgKGJsb2NrICE9IDApCisgICAgeworICAgICAgQ09SRV9BRERSIGVuZCA9IEJMT0NLX0VORCAoYmxvY2spIC0gNDsKKyAgICAgIGludCBsYXN0X2luZGV4OworCisgICAgICBpZiAoYmwgIT0gYmxvY2t2ZWN0b3JfZm9yX3BjIChlbmQsICZpbmRleCkpCisJZXJyb3IgKCJibG9ja3ZlY3RvciBibG90Y2giKTsKKyAgICAgIGlmIChCTE9DS1ZFQ1RPUl9CTE9DSyAoYmwsIGluZGV4KSAhPSBibG9jaykKKwllcnJvciAoImJsb2NrdmVjdG9yIGJvdGNoIik7CisgICAgICBsYXN0X2luZGV4ID0gQkxPQ0tWRUNUT1JfTkJMT0NLUyAoYmwpOworICAgICAgaW5kZXggKz0gMTsKKworICAgICAgLyogRG9uJ3QgcHJpbnQgb3V0IGJsb2NrcyB0aGF0IGhhdmUgZ29uZSBieS4gICovCisgICAgICB3aGlsZSAoaW5kZXggPCBsYXN0X2luZGV4CisJICAgICAmJiBCTE9DS19FTkQgKEJMT0NLVkVDVE9SX0JMT0NLIChibCwgaW5kZXgpKSA8IHBjKQorCWluZGV4Kys7CisKKyAgICAgIHdoaWxlIChpbmRleCA8IGxhc3RfaW5kZXgKKwkgICAgICYmIEJMT0NLX0VORCAoQkxPQ0tWRUNUT1JfQkxPQ0sgKGJsLCBpbmRleCkpIDwgZW5kKQorCXsKKwkgIGlmIChibG9ja3NfcHJpbnRlZFtpbmRleF0gPT0gMCkKKwkgICAgeworCSAgICAgIGlmIChwcmludF9ibG9ja19mcmFtZV9sYWJlbHMgKEJMT0NLVkVDVE9SX0JMT0NLIChibCwgaW5kZXgpLCAmaGF2ZV9kZWZhdWx0LCBzdHJlYW0pKQorCQl2YWx1ZXNfcHJpbnRlZCA9IDE7CisJICAgICAgYmxvY2tzX3ByaW50ZWRbaW5kZXhdID0gMTsKKwkgICAgfQorCSAgaW5kZXgrKzsKKwl9CisgICAgICBpZiAoaGF2ZV9kZWZhdWx0KQorCXJldHVybjsKKyAgICAgIGlmICh2YWx1ZXNfcHJpbnRlZCAmJiB0aGlzX2xldmVsX29ubHkpCisJcmV0dXJuOworCisgICAgICAvKiBBZnRlciBoYW5kbGluZyB0aGUgZnVuY3Rpb24ncyB0b3AtbGV2ZWwgYmxvY2ssIHN0b3AuCisJIERvbid0IGNvbnRpbnVlIHRvIGl0cyBzdXBlcmJsb2NrLCB0aGUgYmxvY2sgb2YKKwkgcGVyLWZpbGUgc3ltYm9scy4gICovCisgICAgICBpZiAoQkxPQ0tfRlVOQ1RJT04gKGJsb2NrKSkKKwlicmVhazsKKyAgICAgIGJsb2NrID0gQkxPQ0tfU1VQRVJCTE9DSyAoYmxvY2spOworICAgIH0KKworICBpZiAoIXZhbHVlc19wcmludGVkICYmICF0aGlzX2xldmVsX29ubHkpCisgICAgeworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiTm8gY2F0Y2hlcy5cbiIpOworICAgIH0KK30KKworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK2xvY2Fsc19pbmZvIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAoIXNlbGVjdGVkX2ZyYW1lKQorICAgIGVycm9yICgiTm8gZnJhbWUgc2VsZWN0ZWQuIik7CisgIHByaW50X2ZyYW1lX2xvY2FsX3ZhcnMgKHNlbGVjdGVkX2ZyYW1lLCAwLCBnZGJfc3Rkb3V0KTsKK30KKworc3RhdGljIHZvaWQKK2NhdGNoX2luZm8gKGlnbm9yZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmlnbm9yZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lICogc2FsOworCisgIC8qIENoZWNrIGZvciB0YXJnZXQgc3VwcG9ydCBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nICovIAorICBzYWwgPSB0YXJnZXRfZW5hYmxlX2V4Y2VwdGlvbl9jYWxsYmFjayAoRVhfRVZFTlRfQ0FUQ0gsIDEpOworICBpZiAoc2FsKQorICAgIHsKKyAgICAgIC8qIEN1cnJlbnRseSBub3QgaGFuZGxpbmcgdGhpcyAqLworICAgICAgLyogSWRlYWxseSwgaGVyZSB3ZSBzaG91bGQgaW50ZXJhY3Qgd2l0aCB0aGUgQysrIHJ1bnRpbWUKKyAgICAgICAgIHN5c3RlbSB0byBmaW5kIHRoZSBsaXN0IG9mIGFjdGl2ZSBoYW5kbGVycywgZXRjLiAqLworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZG91dCwgIkluZm8gY2F0Y2ggbm90IHN1cHBvcnRlZCB3aXRoIHRoaXMgdGFyZ2V0L2NvbXBpbGVyIGNvbWJpbmF0aW9uLlxuIik7CisjaWYgMAorICBpZiAoIXNlbGVjdGVkX2ZyYW1lKQorICAgIGVycm9yICgiTm8gZnJhbWUgc2VsZWN0ZWQuIik7CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBBc3N1bWUgZysrIGNvbXBpbGVkIGNvZGUgLS0gb2xkIHYgNC4xNiBiZWhhdmlvdXIgKi8gCisgICAgICBpZiAoIXNlbGVjdGVkX2ZyYW1lKQorICAgICAgICBlcnJvciAoIk5vIGZyYW1lIHNlbGVjdGVkLiIpOworICAgICAgCisgICAgICBwcmludF9mcmFtZV9sYWJlbF92YXJzIChzZWxlY3RlZF9mcmFtZSwgMCwgZ2RiX3N0ZG91dCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfZnJhbWVfYXJnX3ZhcnMgKGZpLCBzdHJlYW0pCisgICAgIHJlZ2lzdGVyIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKKyAgICAgcmVnaXN0ZXIgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgc3RydWN0IHN5bWJvbCAqZnVuYyA9IGdldF9mcmFtZV9mdW5jdGlvbiAoZmkpOworICByZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmI7CisgIGludCBuc3ltczsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBzeW1ib2wgKnN5bSwgKnN5bTI7CisgIHJlZ2lzdGVyIGludCB2YWx1ZXNfcHJpbnRlZCA9IDA7CisKKyAgaWYgKGZ1bmMgPT0gMCkKKyAgICB7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJObyBzeW1ib2wgdGFibGUgaW5mbyBhdmFpbGFibGUuXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYiA9IFNZTUJPTF9CTE9DS19WQUxVRSAoZnVuYyk7CisgIG5zeW1zID0gQkxPQ0tfTlNZTVMgKGIpOworCisgIGZvciAoaSA9IDA7IGkgPCBuc3ltczsgaSsrKQorICAgIHsKKyAgICAgIHN5bSA9IEJMT0NLX1NZTSAoYiwgaSk7CisgICAgICBzd2l0Y2ggKFNZTUJPTF9DTEFTUyAoc3ltKSkKKwl7CisJY2FzZSBMT0NfQVJHOgorCWNhc2UgTE9DX0xPQ0FMX0FSRzoKKwljYXNlIExPQ19SRUZfQVJHOgorCWNhc2UgTE9DX1JFR1BBUk06CisJY2FzZSBMT0NfUkVHUEFSTV9BRERSOgorCWNhc2UgTE9DX0JBU0VSRUdfQVJHOgorCSAgdmFsdWVzX3ByaW50ZWQgPSAxOworCSAgZnB1dHNfZmlsdGVyZWQgKFNZTUJPTF9TT1VSQ0VfTkFNRSAoc3ltKSwgc3RyZWFtKTsKKwkgIGZwdXRzX2ZpbHRlcmVkICgiID0gIiwgc3RyZWFtKTsKKworCSAgLyogV2UgaGF2ZSB0byBsb29rIHVwIHRoZSBzeW1ib2wgYmVjYXVzZSBhcmd1bWVudHMgY2FuIGhhdmUKKwkgICAgIHR3byBlbnRyaWVzIChvbmUgYSBwYXJhbWV0ZXIsIG9uZSBhIGxvY2FsKSBhbmQgdGhlIG9uZSB3ZQorCSAgICAgd2FudCBpcyB0aGUgbG9jYWwsIHdoaWNoIGxvb2t1cF9zeW1ib2wgd2lsbCBmaW5kIGZvciB1cy4KKwkgICAgIFRoaXMgaW5jbHVkZXMgZ2NjMSAobm90IGdjYzIpIG9uIHRoZSBzcGFyYyB3aGVuIHBhc3NpbmcgYQorCSAgICAgc21hbGwgc3RydWN0dXJlIGFuZCBnY2MyIHdoZW4gdGhlIGFyZ3VtZW50IHR5cGUgaXMgZmxvYXQKKwkgICAgIGFuZCBpdCBpcyBwYXNzZWQgYXMgYSBkb3VibGUgYW5kIGNvbnZlcnRlZCB0byBmbG9hdCBieQorCSAgICAgdGhlIHByb2xvZ3VlIChpbiB0aGUgbGF0dGVyIGNhc2UgdGhlIHR5cGUgb2YgdGhlIExPQ19BUkcKKwkgICAgIHN5bWJvbCBpcyBkb3VibGUgYW5kIHRoZSB0eXBlIG9mIHRoZSBMT0NfTE9DQUwgc3ltYm9sIGlzCisJICAgICBmbG9hdCkuICBUaGVyZSBhcmUgYWxzbyBMT0NfQVJHL0xPQ19SRUdJU1RFUiBwYWlycyB3aGljaAorCSAgICAgYXJlIG5vdCBjb21iaW5lZCBpbiBzeW1ib2wtcmVhZGluZy4gICovCisKKwkgIHN5bTIgPSBsb29rdXBfc3ltYm9sIChTWU1CT0xfTkFNRSAoc3ltKSwKKwkJCWIsIFZBUl9OQU1FU1BBQ0UsIChpbnQgKilOVUxMLCAoc3RydWN0IHN5bXRhYiAqKilOVUxMKTsKKwkgIHByaW50X3ZhcmlhYmxlX3ZhbHVlIChzeW0yLCBmaSwgc3RyZWFtKTsKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIlxuIik7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICAvKiBEb24ndCB3b3JyeSBhYm91dCB0aGluZ3Mgd2hpY2ggYXJlbid0IGFyZ3VtZW50cy4gICovCisJICBicmVhazsKKwl9CisgICAgfQorCisgIGlmICghdmFsdWVzX3ByaW50ZWQpCisgICAgeworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiTm8gYXJndW1lbnRzLlxuIik7CisgICAgfQorfQorCit2b2lkCithcmdzX2luZm8gKGlnbm9yZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmlnbm9yZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAoIXNlbGVjdGVkX2ZyYW1lKQorICAgIGVycm9yICgiTm8gZnJhbWUgc2VsZWN0ZWQuIik7CisgIHByaW50X2ZyYW1lX2FyZ192YXJzIChzZWxlY3RlZF9mcmFtZSwgZ2RiX3N0ZG91dCk7Cit9CisKKworc3RhdGljIHZvaWQKK2FyZ3NfcGx1c19sb2NhbHNfaW5mbyAoaWdub3JlLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqaWdub3JlOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGFyZ3NfaW5mbyhpZ25vcmUsIGZyb21fdHR5KTsKKyAgbG9jYWxzX2luZm8oaWdub3JlLCBmcm9tX3R0eSk7Cit9CisKKwwKKy8qIFNlbGVjdCBmcmFtZSBGSSwgYW5kIG5vdGUgdGhhdCBpdHMgc3RhY2sgbGV2ZWwgaXMgTEVWRUwuCisgICBMRVZFTCBtYXkgYmUgLTEgaWYgYW4gYWN0dWFsIGxldmVsIG51bWJlciBpcyBub3Qga25vd24uICAqLworCit2b2lkCitzZWxlY3RfZnJhbWUgKGZpLCBsZXZlbCkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworICAgICBpbnQgbGV2ZWw7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBzeW10YWIgKnM7CisKKyAgc2VsZWN0ZWRfZnJhbWUgPSBmaTsKKyAgc2VsZWN0ZWRfZnJhbWVfbGV2ZWwgPSBsZXZlbDsKKyAgaWYgKHNlbGVjdGVkX2ZyYW1lX2xldmVsX2NoYW5nZWRfaG9vaykKKyAgICBzZWxlY3RlZF9mcmFtZV9sZXZlbF9jaGFuZ2VkX2hvb2sgKGxldmVsKTsKKworICAvKiBFbnN1cmUgdGhhdCBzeW1ib2xzIGZvciB0aGlzIGZyYW1lIGFyZSByZWFkIGluLiAgQWxzbywgZGV0ZXJtaW5lIHRoZQorICAgICBzb3VyY2UgbGFuZ3VhZ2Ugb2YgdGhpcyBmcmFtZSwgYW5kIHN3aXRjaCB0byBpdCBpZiBkZXNpcmVkLiAgKi8KKyAgaWYgKGZpKQorICB7CisgICAgcyA9IGZpbmRfcGNfc3ltdGFiIChmaS0+cGMpOworICAgIGlmIChzIAorCSYmIHMtPmxhbmd1YWdlICE9IGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2xhbmd1YWdlCisJJiYgcy0+bGFuZ3VhZ2UgIT0gbGFuZ3VhZ2VfdW5rbm93bgorCSYmIGxhbmd1YWdlX21vZGUgPT0gbGFuZ3VhZ2VfbW9kZV9hdXRvKSB7CisgICAgICBzZXRfbGFuZ3VhZ2Uocy0+bGFuZ3VhZ2UpOworICAgIH0KKyAgICAvKiBlbHo6IHRoaXMgaWYgaGVyZSBmaXhlcyB0aGUgcHJvYmxlbSB3aXRoIHRoZSBwYyBub3QgYmVpbmcgZGlzcGxheWVkCisgICAgICAgaW4gdGhlIHR1aSBhc20gbGF5b3V0LCB3aXRoIG5vIGRlYnVnIHN5bWJvbHMuIFRoZSB2YWx1ZSBvZiBzIAorICAgICAgIHdvdWxkIGJlIDAgaGVyZSwgYW5kIHNlbGVjdF9zb3VyY2Vfc3ltdGFiIHdvdWxkIGFib3J0IHRoZQorICAgICAgIGNvbW1hbmQgYnkgY2FsbGluZyB0aGUgJ2Vycm9yJyBmdW5jdGlvbiovCisgICAgaWYgKHMpCisgICAgICB7CisJVFVJRE8oKChUdWlPcGFxdWVGdW5jUHRyKXR1aV92U2VsZWN0U291cmNlU3ltdGFiLCBzKSk7CisgICAgICB9CisgIH0KK30KKworDAorLyogU2VsZWN0IGZyYW1lIEZJLCBub3RpbmcgdGhhdCBpdHMgc3RhY2sgbGV2ZWwgaXMgTEVWRUwuICBBbHNvIHByaW50CisgICB0aGUgc3RhY2sgZnJhbWUgYW5kIHNob3cgdGhlIHNvdXJjZSBpZiB0aGlzIGlzIHRoZSB0dWkgdmVyc2lvbi4gICovCit2b2lkCitzZWxlY3RfYW5kX3ByaW50X2ZyYW1lKGZpLCBsZXZlbCkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworICAgICBpbnQgbGV2ZWw7Cit7CisgIHNlbGVjdF9mcmFtZShmaSwgbGV2ZWwpOworICBpZiAoZmkpCisgICAgeworICAgICAgcHJpbnRfc3RhY2tfZnJhbWUoZmksIGxldmVsLCAxKTsKKyAgICAgIFRVSURPKCgoVHVpT3BhcXVlRnVuY1B0cil0dWlfdkNoZWNrRGF0YVZhbHVlcywgZmkpKTsKKyAgICB9Cit9CisKKwwKKy8qIFNlbGVjdCBmcmFtZSBGSSwgbm90aW5nIHRoYXQgaXRzIHN0YWNrIGxldmVsIGlzIExFVkVMLiAgQmUgc2lsZW50IGlmCisgICBub3QgdGhlIFRVSSAqLwordm9pZAorc2VsZWN0X2FuZF9tYXliZV9wcmludF9mcmFtZSAoZmksIGxldmVsKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7CisgICAgIGludCBsZXZlbDsKK3sKKyAgaWYgKCF0dWlfdmVyc2lvbikKKyAgICBzZWxlY3RfZnJhbWUoZmksIGxldmVsKTsKKyAgZWxzZQorICAgIHNlbGVjdF9hbmRfcHJpbnRfZnJhbWUoZmksIGxldmVsKTsKK30KKworCisvKiBTdG9yZSB0aGUgc2VsZWN0ZWQgZnJhbWUgYW5kIGl0cyBsZXZlbCBpbnRvICpGUkFNRVAgYW5kICpMRVZFTFAuCisgICBJZiB0aGVyZSBpcyBubyBzZWxlY3RlZCBmcmFtZSwgKkZSQU1FUCBpcyBzZXQgdG8gTlVMTC4gICovCisKK3ZvaWQKK3JlY29yZF9zZWxlY3RlZF9mcmFtZSAoZnJhbWVhZGRycCwgbGV2ZWxwKQorICAgICBDT1JFX0FERFIgKmZyYW1lYWRkcnA7CisgICAgIGludCAqbGV2ZWxwOworeworICAqZnJhbWVhZGRycCA9IHNlbGVjdGVkX2ZyYW1lID8gc2VsZWN0ZWRfZnJhbWUtPmZyYW1lIDogMDsKKyAgKmxldmVscCA9IHNlbGVjdGVkX2ZyYW1lX2xldmVsOworfQorCisvKiBSZXR1cm4gdGhlIHN5bWJvbC1ibG9jayBpbiB3aGljaCB0aGUgc2VsZWN0ZWQgZnJhbWUgaXMgZXhlY3V0aW5nLgorICAgQ2FuIHJldHVybiB6ZXJvIHVuZGVyIHZhcmlvdXMgbGVnaXRpbWF0ZSBjaXJjdW1zdGFuY2VzLiAgKi8KKworc3RydWN0IGJsb2NrICoKK2dldF9zZWxlY3RlZF9ibG9jayAoKQoreworICBpZiAoIXRhcmdldF9oYXNfc3RhY2spCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCFzZWxlY3RlZF9mcmFtZSkKKyAgICByZXR1cm4gZ2V0X2N1cnJlbnRfYmxvY2sgKCk7CisgIHJldHVybiBnZXRfZnJhbWVfYmxvY2sgKHNlbGVjdGVkX2ZyYW1lKTsKK30KKworLyogRmluZCBhIGZyYW1lIGEgY2VydGFpbiBudW1iZXIgb2YgbGV2ZWxzIGF3YXkgZnJvbSBGUkFNRS4KKyAgIExFVkVMX09GRlNFVF9QVFIgcG9pbnRzIHRvIGFuIGludCBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgbGV2ZWxzLgorICAgUG9zaXRpdmUgbWVhbnMgZ28gdG8gZWFybGllciBmcmFtZXMgKHVwKTsgbmVnYXRpdmUsIHRoZSByZXZlcnNlLgorICAgVGhlIGludCB0aGF0IGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgbGV2ZWxzIGlzIGNvdW50ZWQgdG93YXJkCisgICB6ZXJvIGFzIHRoZSBmcmFtZXMgZm9yIHRob3NlIGxldmVscyBhcmUgZm91bmQuCisgICBJZiB0aGUgdG9wIG9yIGJvdHRvbSBmcmFtZSBpcyByZWFjaGVkLCB0aGF0IGZyYW1lIGlzIHJldHVybmVkLAorICAgYnV0IHRoZSBmaW5hbCB2YWx1ZSBvZiAqTEVWRUxfT0ZGU0VUX1BUUiBpcyBub256ZXJvIGFuZCBpbmRpY2F0ZXMKKyAgIGhvdyBtdWNoIGZhcnRoZXIgdGhlIG9yaWdpbmFsIHJlcXVlc3QgYXNrZWQgdG8gZ28uICAqLworCitzdHJ1Y3QgZnJhbWVfaW5mbyAqCitmaW5kX3JlbGF0aXZlX2ZyYW1lIChmcmFtZSwgbGV2ZWxfb2Zmc2V0X3B0cikKKyAgICAgcmVnaXN0ZXIgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworICAgICByZWdpc3RlciBpbnQgKmxldmVsX29mZnNldF9wdHI7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBmcmFtZV9pbmZvICpwcmV2OworICByZWdpc3RlciBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWUxOworCisgIC8qIEdvaW5nIHVwIGlzIHNpbXBsZToganVzdCBkbyBnZXRfcHJldl9mcmFtZSBlbm91Z2ggdGltZXMKKyAgICAgb3IgdW50aWwgaW5pdGlhbCBmcmFtZSBpcyByZWFjaGVkLiAgKi8KKyAgd2hpbGUgKCpsZXZlbF9vZmZzZXRfcHRyID4gMCkKKyAgICB7CisgICAgICBwcmV2ID0gZ2V0X3ByZXZfZnJhbWUgKGZyYW1lKTsKKyAgICAgIGlmIChwcmV2ID09IDApCisJYnJlYWs7CisgICAgICAoKmxldmVsX29mZnNldF9wdHIpLS07CisgICAgICBmcmFtZSA9IHByZXY7CisgICAgfQorICAvKiBHb2luZyBkb3duIGlzIGp1c3QgYXMgc2ltcGxlLiAgKi8KKyAgaWYgKCpsZXZlbF9vZmZzZXRfcHRyIDwgMCkKKyAgICB7CisgICAgICB3aGlsZSAoKmxldmVsX29mZnNldF9wdHIgPCAwKSB7CisJZnJhbWUxID0gZ2V0X25leHRfZnJhbWUgKGZyYW1lKTsKKwlpZiAoIWZyYW1lMSkKKwkgIGJyZWFrOworCWZyYW1lID0gZnJhbWUxOworCSgqbGV2ZWxfb2Zmc2V0X3B0cikrKzsKKyAgICAgIH0KKyAgICB9CisgIHJldHVybiBmcmFtZTsKK30KKworLyogVGhlICJzZWxlY3RfZnJhbWUiIGNvbW1hbmQuICBXaXRoIG5vIGFyZywgTk9QLgorICAgV2l0aCBhcmcgTEVWRUxfRVhQLCBzZWxlY3QgdGhlIGZyYW1lIGF0IGxldmVsIExFVkVMIGlmIGl0IGlzIGEKKyAgIHZhbGlkIGxldmVsLiAgT3RoZXJ3aXNlLCB0cmVhdCBsZXZlbF9leHAgYXMgYW4gYWRkcmVzcyBleHByZXNzaW9uCisgICBhbmQgc2VsZWN0IGl0LiAgU2VlIHBhcnNlX2ZyYW1lX3NwZWNpZmljYXRpb24gZm9yIG1vcmUgaW5mbyBvbiBwcm9wZXIKKyAgIGZyYW1lIGV4cHJlc3Npb25zLiAqLworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3NlbGVjdF9mcmFtZV9jb21tYW5kIChsZXZlbF9leHAsIGZyb21fdHR5KQorICAgICBjaGFyICpsZXZlbF9leHA7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lLCAqZnJhbWUxOworICB1bnNpZ25lZCBpbnQgbGV2ZWwgPSAwOworCisgIGlmICghdGFyZ2V0X2hhc19zdGFjaykKKyAgICBlcnJvciAoIk5vIHN0YWNrLiIpOworCisgIGZyYW1lID0gcGFyc2VfZnJhbWVfc3BlY2lmaWNhdGlvbiAobGV2ZWxfZXhwKTsKKworICAvKiBUcnkgdG8gZmlndXJlIG91dCB3aGF0IGxldmVsIHRoaXMgZnJhbWUgaXMuICBCdXQgaWYgdGhlcmUgaXMKKyAgICAgbm8gY3VycmVudCBzdGFjaywgZG9uJ3QgZXJyb3Igb3V0IC0tIGxldCB0aGUgdXNlciBzZXQgb25lLiAgKi8KKyAgZnJhbWUxID0gMDsKKyAgaWYgKGdldF9jdXJyZW50X2ZyYW1lKCkpIHsKKyAgICBmb3IgKGZyYW1lMSA9IGdldF9wcmV2X2ZyYW1lICgwKTsKKwkgZnJhbWUxICYmIGZyYW1lMSAhPSBmcmFtZTsKKwkgZnJhbWUxID0gZ2V0X3ByZXZfZnJhbWUgKGZyYW1lMSkpCisgICAgICBsZXZlbCsrOworICB9CisKKyAgaWYgKCFmcmFtZTEpCisgICAgbGV2ZWwgPSAwOworCisgIHNlbGVjdF9mcmFtZSAoZnJhbWUsIGxldmVsKTsKK30KKworLyogVGhlICJmcmFtZSIgY29tbWFuZC4gIFdpdGggbm8gYXJnLCBwcmludCBzZWxlY3RlZCBmcmFtZSBicmllZmx5LgorICAgV2l0aCBhcmcsIGJlaGF2ZXMgbGlrZSBzZWxlY3RfZnJhbWUgYW5kIHRoZW4gcHJpbnRzIHRoZSBzZWxlY3RlZAorICAgZnJhbWUuICAqLworCit2b2lkCitmcmFtZV9jb21tYW5kIChsZXZlbF9leHAsIGZyb21fdHR5KQorICAgICBjaGFyICpsZXZlbF9leHA7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgc2VsZWN0X2ZyYW1lX2NvbW1hbmQgKGxldmVsX2V4cCwgZnJvbV90dHkpOworICBzaG93X2FuZF9wcmludF9zdGFja19mcmFtZSAoc2VsZWN0ZWRfZnJhbWUsIHNlbGVjdGVkX2ZyYW1lX2xldmVsLCAxKTsKK30KKworLyogVGhlIFhEQiBDb21wYXRpYmlsaXR5IGNvbW1hbmQgdG8gcHJpbnQgdGhlIGN1cnJlbnQgZnJhbWUuICovCisKK3ZvaWQKK2N1cnJlbnRfZnJhbWVfY29tbWFuZCAobGV2ZWxfZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqbGV2ZWxfZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGlmICh0YXJnZXRfaGFzX3N0YWNrID09IDAgfHwgc2VsZWN0ZWRfZnJhbWUgPT0gMCkKKyAgICBlcnJvciAoIk5vIHN0YWNrLiIpOyAKKyBwcmludF9vbmx5X3N0YWNrX2ZyYW1lIChzZWxlY3RlZF9mcmFtZSwgc2VsZWN0ZWRfZnJhbWVfbGV2ZWwsIDEpOworICB9CisKKy8qIFNlbGVjdCB0aGUgZnJhbWUgdXAgb25lIG9yIENPVU5UIHN0YWNrIGxldmVscworICAgZnJvbSB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCBmcmFtZSwgYW5kIHByaW50IGl0IGJyaWVmbHkuICAqLworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3VwX3NpbGVudGx5X2Jhc2UgKGNvdW50X2V4cCkKKyAgICAgY2hhciAqY291bnRfZXhwOworeworICByZWdpc3RlciBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7CisgIGludCBjb3VudCA9IDEsIGNvdW50MTsKKyAgaWYgKGNvdW50X2V4cCkKKyAgICBjb3VudCA9IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgKGNvdW50X2V4cCk7CisgIGNvdW50MSA9IGNvdW50OworICAKKyAgaWYgKHRhcmdldF9oYXNfc3RhY2sgPT0gMCB8fCBzZWxlY3RlZF9mcmFtZSA9PSAwKQorICAgIGVycm9yICgiTm8gc3RhY2suIik7CisKKyAgZmkgPSBmaW5kX3JlbGF0aXZlX2ZyYW1lIChzZWxlY3RlZF9mcmFtZSwgJmNvdW50MSk7CisgIGlmIChjb3VudDEgIT0gMCAmJiBjb3VudF9leHAgPT0gMCkKKyAgICBlcnJvciAoIkluaXRpYWwgZnJhbWUgc2VsZWN0ZWQ7IHlvdSBjYW5ub3QgZ28gdXAuIik7CisgIHNlbGVjdF9mcmFtZSAoZmksIHNlbGVjdGVkX2ZyYW1lX2xldmVsICsgY291bnQgLSBjb3VudDEpOworfQorCitzdGF0aWMgdm9pZAordXBfc2lsZW50bHlfY29tbWFuZCAoY291bnRfZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqY291bnRfZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHVwX3NpbGVudGx5X2Jhc2UoY291bnRfZXhwKTsKKyAgaWYgKHR1aV92ZXJzaW9uKQorICAgIHByaW50X3N0YWNrX2ZyYW1lIChzZWxlY3RlZF9mcmFtZSwgc2VsZWN0ZWRfZnJhbWVfbGV2ZWwsIDEpOworfQorCitzdGF0aWMgdm9pZAordXBfY29tbWFuZCAoY291bnRfZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqY291bnRfZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHVwX3NpbGVudGx5X2Jhc2UgKGNvdW50X2V4cCk7CisgIHNob3dfYW5kX3ByaW50X3N0YWNrX2ZyYW1lIChzZWxlY3RlZF9mcmFtZSwgc2VsZWN0ZWRfZnJhbWVfbGV2ZWwsIDEpOworfQorCisvKiBTZWxlY3QgdGhlIGZyYW1lIGRvd24gb25lIG9yIENPVU5UIHN0YWNrIGxldmVscworICAgZnJvbSB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCBmcmFtZSwgYW5kIHByaW50IGl0IGJyaWVmbHkuICAqLworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2Rvd25fc2lsZW50bHlfYmFzZSAoY291bnRfZXhwKQorICAgICBjaGFyICpjb3VudF9leHA7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKKyAgaW50IGNvdW50ID0gLTEsIGNvdW50MTsKKyAgaWYgKGNvdW50X2V4cCkKKyAgICBjb3VudCA9IC0gcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAoY291bnRfZXhwKTsKKyAgY291bnQxID0gY291bnQ7CisgIAorICBpZiAodGFyZ2V0X2hhc19zdGFjayA9PSAwIHx8IHNlbGVjdGVkX2ZyYW1lID09IDApCisgICAgZXJyb3IgKCJObyBzdGFjay4iKTsKKworICBmcmFtZSA9IGZpbmRfcmVsYXRpdmVfZnJhbWUgKHNlbGVjdGVkX2ZyYW1lLCAmY291bnQxKTsKKyAgaWYgKGNvdW50MSAhPSAwICYmIGNvdW50X2V4cCA9PSAwKQorICAgIHsKKworICAgICAgLyogV2Ugb25seSBkbyB0aGlzIGlmIGNvdW50X2V4cCBpcyBub3Qgc3BlY2lmaWVkLiAgVGhhdCB3YXkgImRvd24iCisJIG1lYW5zIHRvIHJlYWxseSBnbyBkb3duIChhbmQgbGV0IG1lIGtub3cgaWYgdGhhdCBpcworCSBpbXBvc3NpYmxlKSwgYnV0ICJkb3duIDk5OTkiIGNhbiBiZSB1c2VkIHRvIG1lYW4gZ28gYWxsIHRoZSB3YXkKKwkgZG93biB3aXRob3V0IGdldHRpbmcgYW4gZXJyb3IuICAqLworCisgICAgICBlcnJvciAoIkJvdHRvbSAoaS5lLiwgaW5uZXJtb3N0KSBmcmFtZSBzZWxlY3RlZDsgeW91IGNhbm5vdCBnbyBkb3duLiIpOworICAgIH0KKworICBzZWxlY3RfZnJhbWUgKGZyYW1lLCBzZWxlY3RlZF9mcmFtZV9sZXZlbCArIGNvdW50IC0gY291bnQxKTsKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitkb3duX3NpbGVudGx5X2NvbW1hbmQgKGNvdW50X2V4cCwgZnJvbV90dHkpCisgICAgIGNoYXIgKmNvdW50X2V4cDsKKyAgICAgaW50IGZyb21fdHR5OworeworICBkb3duX3NpbGVudGx5X2Jhc2UgKGNvdW50X2V4cCk7CisgIGlmICh0dWlfdmVyc2lvbikKKyAgICBwcmludF9zdGFja19mcmFtZSAoc2VsZWN0ZWRfZnJhbWUsIHNlbGVjdGVkX2ZyYW1lX2xldmVsLCAxKTsKK30KKworc3RhdGljIHZvaWQKK2Rvd25fY29tbWFuZCAoY291bnRfZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqY291bnRfZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGRvd25fc2lsZW50bHlfYmFzZSAoY291bnRfZXhwKTsKKyAgc2hvd19hbmRfcHJpbnRfc3RhY2tfZnJhbWUgKHNlbGVjdGVkX2ZyYW1lLCBzZWxlY3RlZF9mcmFtZV9sZXZlbCwgMSk7Cit9CisMCitzdGF0aWMgdm9pZAorcmV0dXJuX2NvbW1hbmQgKHJldHZhbF9leHAsIGZyb21fdHR5KQorICAgICBjaGFyICpyZXR2YWxfZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCBzeW1ib2wgKnRoaXNmdW47CisgIENPUkVfQUREUiBzZWxlY3RlZF9mcmFtZV9hZGRyOworICBDT1JFX0FERFIgc2VsZWN0ZWRfZnJhbWVfcGM7CisgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKKyAgdmFsdWVfcHRyIHJldHVybl92YWx1ZSA9IE5VTEw7CisKKyAgaWYgKHNlbGVjdGVkX2ZyYW1lID09IE5VTEwpCisgICAgZXJyb3IgKCJObyBzZWxlY3RlZCBmcmFtZS4iKTsKKyAgdGhpc2Z1biA9IGdldF9mcmFtZV9mdW5jdGlvbiAoc2VsZWN0ZWRfZnJhbWUpOworICBzZWxlY3RlZF9mcmFtZV9hZGRyID0gRlJBTUVfRlAgKHNlbGVjdGVkX2ZyYW1lKTsKKyAgc2VsZWN0ZWRfZnJhbWVfcGMgPSBzZWxlY3RlZF9mcmFtZS0+cGM7CisKKyAgLyogQ29tcHV0ZSB0aGUgcmV0dXJuIHZhbHVlIChpZiBhbnkgLS0gcG9zc2libHkgZ2V0dGluZyBlcnJvcnMgaGVyZSkuICAqLworCisgIGlmIChyZXR2YWxfZXhwKQorICAgIHsKKyAgICAgIHN0cnVjdCB0eXBlICpyZXR1cm5fdHlwZSA9IE5VTEw7CisKKyAgICAgIHJldHVybl92YWx1ZSA9IHBhcnNlX2FuZF9ldmFsIChyZXR2YWxfZXhwKTsKKworICAgICAgLyogQ2FzdCByZXR1cm4gdmFsdWUgdG8gdGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbi4gICovCisgICAgICBpZiAodGhpc2Z1biAhPSBOVUxMKQorCXJldHVybl90eXBlID0gVFlQRV9UQVJHRVRfVFlQRSAoU1lNQk9MX1RZUEUgKHRoaXNmdW4pKTsKKyAgICAgIGlmIChyZXR1cm5fdHlwZSA9PSBOVUxMKQorCXJldHVybl90eXBlID0gYnVpbHRpbl90eXBlX2ludDsKKyAgICAgIHJldHVybl92YWx1ZSA9IHZhbHVlX2Nhc3QgKHJldHVybl90eXBlLCByZXR1cm5fdmFsdWUpOworCisgICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBmdWxseSBldmFsdWF0ZWQgaXQsIHNpbmNlCisJIGl0IG1pZ2h0IGxpdmUgaW4gdGhlIHN0YWNrIGZyYW1lIHdlJ3JlIGFib3V0IHRvIHBvcC4gICovCisgICAgICBpZiAoVkFMVUVfTEFaWSAocmV0dXJuX3ZhbHVlKSkKKwl2YWx1ZV9mZXRjaF9sYXp5IChyZXR1cm5fdmFsdWUpOworICAgIH0KKworICAvKiBJZiBpbnRlcmFjdGl2ZSwgcmVxdWlyZSBjb25maXJtYXRpb24uICAqLworCisgIGlmIChmcm9tX3R0eSkKKyAgICB7CisgICAgICBpZiAodGhpc2Z1biAhPSAwKQorCXsKKwkgIGlmICghcXVlcnkgKCJNYWtlICVzIHJldHVybiBub3c/ICIsIFNZTUJPTF9TT1VSQ0VfTkFNRSAodGhpc2Z1bikpKQorCSAgICB7CisJICAgICAgZXJyb3IgKCJOb3QgY29uZmlybWVkLiIpOworCSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwlpZiAoIXF1ZXJ5ICgiTWFrZSBzZWxlY3RlZCBzdGFjayBmcmFtZSByZXR1cm4gbm93PyAiKSkKKwkgIGVycm9yICgiTm90IGNvbmZpcm1lZC4iKTsKKyAgICB9CisKKyAgLyogRG8gdGhlIHJlYWwgd29yay4gIFBvcCB1bnRpbCB0aGUgc3BlY2lmaWVkIGZyYW1lIGlzIGN1cnJlbnQuICBXZQorICAgICB1c2UgdGhpcyBtZXRob2QgYmVjYXVzZSB0aGUgc2VsZWN0ZWRfZnJhbWUgaXMgbm90IHZhbGlkIGFmdGVyCisgICAgIGEgUE9QX0ZSQU1FLiAgVGhlIHBjIGNvbXBhcmlzb24gbWFrZXMgdGhpcyB3b3JrIGV2ZW4gaWYgdGhlCisgICAgIHNlbGVjdGVkIGZyYW1lIHNoYXJlcyBpdHMgZnAgd2l0aCBhbm90aGVyIGZyYW1lLiAgKi8KKworICB3aGlsZSAoc2VsZWN0ZWRfZnJhbWVfYWRkciAhPSAoZnJhbWUgPSBnZXRfY3VycmVudF9mcmFtZSgpKS0+ZnJhbWUKKwkgfHwgc2VsZWN0ZWRfZnJhbWVfcGMgIT0gZnJhbWUtPnBjKQorICAgIFBPUF9GUkFNRTsKKworICAvKiBUaGVuIHBvcCB0aGF0IGZyYW1lLiAgKi8KKworICBQT1BfRlJBTUU7CisKKyAgLyogQ29tcHV0ZSB0aGUgcmV0dXJuIHZhbHVlIChpZiBhbnkpIGFuZCBzdG9yZSBpbiB0aGUgcGxhY2UKKyAgICAgZm9yIHJldHVybiB2YWx1ZXMuICAqLworCisgIGlmIChyZXR2YWxfZXhwKQorICAgIHNldF9yZXR1cm5fdmFsdWUgKHJldHVybl92YWx1ZSk7CisKKyAgLyogSWYgaW50ZXJhY3RpdmUsIHByaW50IHRoZSBmcmFtZSB0aGF0IGlzIG5vdyBjdXJyZW50LiAgKi8KKworICBpZiAoZnJvbV90dHkpCisgICAgZnJhbWVfY29tbWFuZCAoIjAiLCAxKTsKKyAgZWxzZQorICAgIHNlbGVjdF9mcmFtZV9jb21tYW5kICgiMCIsIDApOworfQorCisvKiBTZXRzIHRoZSBzY29wZSB0byBpbnB1dCBmdW5jdGlvbiBuYW1lLCBwcm92aWRlZCB0aGF0IHRoZQorICAgZnVuY3Rpb24gaXMgd2l0aGluIHRoZSBjdXJyZW50IHN0YWNrIGZyYW1lICovCisKK3N0cnVjdCBmdW5jdGlvbl9ib3VuZHMKK3sKKyAgQ09SRV9BRERSIGxvdywgaGlnaDsKK307CisKK3N0YXRpYyB2b2lkCitmdW5jX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnA7CisgIGludCBmb3VuZCA9IDA7CisgIHN0cnVjdCBzeW10YWJzX2FuZF9saW5lcyBzYWxzOworICBpbnQgaTsKKyAgaW50IGxldmVsID0gMTsKKyAgc3RydWN0IGZ1bmN0aW9uX2JvdW5kcyAqZnVuY19ib3VuZHMgPSAoc3RydWN0IGZ1bmN0aW9uX2JvdW5kcyAqKSBOVUxMOworCisgIGlmIChhcmcgIT0gKGNoYXIgKikgTlVMTCkKKyAgICByZXR1cm47CisKKyAgZnAgPSBwYXJzZV9mcmFtZV9zcGVjaWZpY2F0aW9uICgiMCIpOworICBzYWxzID0gZGVjb2RlX2xpbmVfc3BlYyAoYXJnLCAxKTsKKyAgZnVuY19ib3VuZHMgPSAoc3RydWN0IGZ1bmN0aW9uX2JvdW5kcyAqKSB4bWFsbG9jICgKKwkJCSAgICAgIHNpemVvZiAoc3RydWN0IGZ1bmN0aW9uX2JvdW5kcykgKiBzYWxzLm5lbHRzKTsKKyAgZm9yIChpID0gMDsgKGkgPCBzYWxzLm5lbHRzICYmICFmb3VuZCk7IGkrKykKKyAgICB7CisgICAgICBpZiAoc2Fscy5zYWxzW2ldLnBjID09IChDT1JFX0FERFIpIDAgfHwKKwkgIGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAoc2Fscy5zYWxzW2ldLnBjLAorCQkJCSAgICAoY2hhciAqKikgTlVMTCwKKwkJCQkgICAgJmZ1bmNfYm91bmRzW2ldLmxvdywKKwkJCQkgICAgJmZ1bmNfYm91bmRzW2ldLmhpZ2gpID09IDApCisJeworCSAgZnVuY19ib3VuZHNbaV0ubG93ID0KKwkgICAgZnVuY19ib3VuZHNbaV0uaGlnaCA9IChDT1JFX0FERFIpIE5VTEw7CisJfQorICAgIH0KKworICBkbworICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IChpIDwgc2Fscy5uZWx0cyAmJiAhZm91bmQpOyBpKyspCisJZm91bmQgPSAoZnAtPnBjID49IGZ1bmNfYm91bmRzW2ldLmxvdyAmJgorCQkgZnAtPnBjIDwgZnVuY19ib3VuZHNbaV0uaGlnaCk7CisgICAgICBpZiAoIWZvdW5kKQorCXsKKwkgIGxldmVsID0gMTsKKwkgIGZwID0gZmluZF9yZWxhdGl2ZV9mcmFtZSAoZnAsICZsZXZlbCk7CisJfQorICAgIH0KKyAgd2hpbGUgKCFmb3VuZCAmJiBsZXZlbCA9PSAwKTsKKworICBpZiAoZnVuY19ib3VuZHMpCisgICAgZnJlZSAoZnVuY19ib3VuZHMpOworCisgIGlmICghZm91bmQpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiJyVzJyBub3Qgd2l0aGluIGN1cnJlbnQgc3RhY2sgZnJhbWUuXG4iLCBhcmcpOworICBlbHNlIGlmIChmcCAhPSBzZWxlY3RlZF9mcmFtZSkKKyAgICBzZWxlY3RfYW5kX3ByaW50X2ZyYW1lIChmcCwgbGV2ZWwpOworfQorCisvKiBHZXRzIHRoZSBsYW5ndWFnZSBvZiB0aGUgY3VycmVudCBmcmFtZS4gICovCisKK2VudW0gbGFuZ3VhZ2UKK2dldF9mcmFtZV9sYW5ndWFnZSAoKQoreworICByZWdpc3RlciBzdHJ1Y3Qgc3ltdGFiICpzOworICBlbnVtIGxhbmd1YWdlIGZsYW5nOwkJLyogVGhlIGxhbmd1YWdlIG9mIHRoZSBjdXJyZW50IGZyYW1lICovCisgICAKKyAgaWYgKHNlbGVjdGVkX2ZyYW1lKQorICAgIHsKKyAgICAgIHMgPSBmaW5kX3BjX3N5bXRhYihzZWxlY3RlZF9mcmFtZS0+cGMpOworICAgICAgaWYgKHMpCisJZmxhbmcgPSBzLT5sYW5ndWFnZTsKKyAgICAgIGVsc2UKKwlmbGFuZyA9IGxhbmd1YWdlX3Vua25vd247CisgICAgfQorICBlbHNlCisgICAgZmxhbmcgPSBsYW5ndWFnZV91bmtub3duOworCisgIHJldHVybiBmbGFuZzsKK30KKwwKK3ZvaWQKK19pbml0aWFsaXplX3N0YWNrICgpCit7CisjaWYgMCAgCisgIGJhY2t0cmFjZV9saW1pdCA9IDMwOworI2VuZGlmCisKKyAgYWRkX2NvbSAoInJldHVybiIsIGNsYXNzX3N0YWNrLCByZXR1cm5fY29tbWFuZCwKKwkgICAiTWFrZSBzZWxlY3RlZCBzdGFjayBmcmFtZSByZXR1cm4gdG8gaXRzIGNhbGxlci5cblwKK0NvbnRyb2wgcmVtYWlucyBpbiB0aGUgZGVidWdnZXIsIGJ1dCB3aGVuIHlvdSBjb250aW51ZVxuXAorZXhlY3V0aW9uIHdpbGwgcmVzdW1lIGluIHRoZSBmcmFtZSBhYm92ZSB0aGUgb25lIG5vdyBzZWxlY3RlZC5cblwKK0lmIGFuIGFyZ3VtZW50IGlzIGdpdmVuLCBpdCBpcyBhbiBleHByZXNzaW9uIGZvciB0aGUgdmFsdWUgdG8gcmV0dXJuLiIpOworCisgIGFkZF9jb20gKCJ1cCIsIGNsYXNzX3N0YWNrLCB1cF9jb21tYW5kLAorCSAgICJTZWxlY3QgYW5kIHByaW50IHN0YWNrIGZyYW1lIHRoYXQgY2FsbGVkIHRoaXMgb25lLlxuXAorQW4gYXJndW1lbnQgc2F5cyBob3cgbWFueSBmcmFtZXMgdXAgdG8gZ28uIik7CisgIGFkZF9jb20gKCJ1cC1zaWxlbnRseSIsIGNsYXNzX3N1cHBvcnQsIHVwX3NpbGVudGx5X2NvbW1hbmQsCisJICAgIlNhbWUgYXMgdGhlIGB1cCcgY29tbWFuZCwgYnV0IGRvZXMgbm90IHByaW50IGFueXRoaW5nLlxuXAorVGhpcyBpcyB1c2VmdWwgaW4gY29tbWFuZCBzY3JpcHRzLiIpOworCisgIGFkZF9jb20gKCJkb3duIiwgY2xhc3Nfc3RhY2ssIGRvd25fY29tbWFuZCwKKwkgICAiU2VsZWN0IGFuZCBwcmludCBzdGFjayBmcmFtZSBjYWxsZWQgYnkgdGhpcyBvbmUuXG5cCitBbiBhcmd1bWVudCBzYXlzIGhvdyBtYW55IGZyYW1lcyBkb3duIHRvIGdvLiIpOworICBhZGRfY29tX2FsaWFzICgiZG8iLCAiZG93biIsIGNsYXNzX3N0YWNrLCAxKTsKKyAgYWRkX2NvbV9hbGlhcyAoImRvdyIsICJkb3duIiwgY2xhc3Nfc3RhY2ssIDEpOworICBhZGRfY29tICgiZG93bi1zaWxlbnRseSIsIGNsYXNzX3N1cHBvcnQsIGRvd25fc2lsZW50bHlfY29tbWFuZCwKKwkgICAiU2FtZSBhcyB0aGUgYGRvd24nIGNvbW1hbmQsIGJ1dCBkb2VzIG5vdCBwcmludCBhbnl0aGluZy5cblwKK1RoaXMgaXMgdXNlZnVsIGluIGNvbW1hbmQgc2NyaXB0cy4iKTsKKworICBhZGRfY29tICgiZnJhbWUiLCBjbGFzc19zdGFjaywgZnJhbWVfY29tbWFuZCwKKwkgICAiU2VsZWN0IGFuZCBwcmludCBhIHN0YWNrIGZyYW1lLlxuXAorV2l0aCBubyBhcmd1bWVudCwgcHJpbnQgdGhlIHNlbGVjdGVkIHN0YWNrIGZyYW1lLiAgKFNlZSBhbHNvIFwiaW5mbyBmcmFtZVwiKS5cblwKK0FuIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgZnJhbWUgdG8gc2VsZWN0LlxuXAorSXQgY2FuIGJlIGEgc3RhY2sgZnJhbWUgbnVtYmVyIG9yIHRoZSBhZGRyZXNzIG9mIHRoZSBmcmFtZS5cblwKK1dpdGggYXJndW1lbnQsIG5vdGhpbmcgaXMgcHJpbnRlZCBpZiBpbnB1dCBpcyBjb21pbmcgZnJvbVxuXAorYSBjb21tYW5kIGZpbGUgb3IgYSB1c2VyLWRlZmluZWQgY29tbWFuZC4iKTsKKworICBhZGRfY29tX2FsaWFzICgiZiIsICJmcmFtZSIsIGNsYXNzX3N0YWNrLCAxKTsKKworICBpZiAoeGRiX2NvbW1hbmRzKQorICAgIHsKKyAgICAgIGFkZF9jb20oIkwiLCBjbGFzc19zdGFjaywgY3VycmVudF9mcmFtZV9jb21tYW5kLCAKKyAgICAgICAgICAgICAgIlByaW50IHRoZSBjdXJyZW50IHN0YWNrIGZyYW1lLlxuIik7CisgICAgICBhZGRfY29tX2FsaWFzICgiViIsICJmcmFtZSIsIGNsYXNzX3N0YWNrLCAxKTsKKyAgICB9CisgIGFkZF9jb20gKCJzZWxlY3QtZnJhbWUiLCBjbGFzc19zdGFjaywgc2VsZWN0X2ZyYW1lX2NvbW1hbmQsCisJICAgIlNlbGVjdCBhIHN0YWNrIGZyYW1lIHdpdGhvdXQgcHJpbnRpbmcgYW55dGhpbmcuXG5cCitBbiBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGZyYW1lIHRvIHNlbGVjdC5cblwKK0l0IGNhbiBiZSBhIHN0YWNrIGZyYW1lIG51bWJlciBvciB0aGUgYWRkcmVzcyBvZiB0aGUgZnJhbWUuXG4iKTsKKworICBhZGRfY29tICgiYmFja3RyYWNlIiwgY2xhc3Nfc3RhY2ssIGJhY2t0cmFjZV9jb21tYW5kLAorCSAgICJQcmludCBiYWNrdHJhY2Ugb2YgYWxsIHN0YWNrIGZyYW1lcywgb3IgaW5uZXJtb3N0IENPVU5UIGZyYW1lcy5cblwKK1dpdGggYSBuZWdhdGl2ZSBhcmd1bWVudCwgcHJpbnQgb3V0ZXJtb3N0IC1DT1VOVCBmcmFtZXMuXG5cCitVc2Ugb2YgdGhlICdmdWxsJyBxdWFsaWZpZXIgYWxzbyBwcmludHMgdGhlIHZhbHVlcyBvZiB0aGUgbG9jYWwgdmFyaWFibGVzLlxuIik7CisgIGFkZF9jb21fYWxpYXMgKCJidCIsICJiYWNrdHJhY2UiLCBjbGFzc19zdGFjaywgMCk7CisgIGlmICh4ZGJfY29tbWFuZHMpCisgICAgeworICAgICAgYWRkX2NvbV9hbGlhcyAoInQiLCAiYmFja3RyYWNlIiwgY2xhc3Nfc3RhY2ssIDApOworICAgICAgYWRkX2NvbSAoIlQiLCBjbGFzc19zdGFjaywgYmFja3RyYWNlX2Z1bGxfY29tbWFuZCwKKwkgICAiUHJpbnQgYmFja3RyYWNlIG9mIGFsbCBzdGFjayBmcmFtZXMsIG9yIGlubmVybW9zdCBDT1VOVCBmcmFtZXMgXG5cCithbmQgdGhlIHZhbHVlcyBvZiB0aGUgbG9jYWwgdmFyaWFibGVzLlxuXAorV2l0aCBhIG5lZ2F0aXZlIGFyZ3VtZW50LCBwcmludCBvdXRlcm1vc3QgLUNPVU5UIGZyYW1lcy5cblwKK1VzYWdlOiBUIDxjb3VudD5cbiIpOworICAgIH0KKworICBhZGRfY29tX2FsaWFzICgid2hlcmUiLCAiYmFja3RyYWNlIiwgY2xhc3NfYWxpYXMsIDApOworICBhZGRfaW5mbyAoInN0YWNrIiwgYmFja3RyYWNlX2NvbW1hbmQsCisJICAgICJCYWNrdHJhY2Ugb2YgdGhlIHN0YWNrLCBvciBpbm5lcm1vc3QgQ09VTlQgZnJhbWVzLiIpOworICBhZGRfaW5mb19hbGlhcyAoInMiLCAic3RhY2siLCAxKTsKKyAgYWRkX2luZm8gKCJmcmFtZSIsIGZyYW1lX2luZm8sCisJICAgICJBbGwgYWJvdXQgc2VsZWN0ZWQgc3RhY2sgZnJhbWUsIG9yIGZyYW1lIGF0IEFERFIuIik7CisgIGFkZF9pbmZvX2FsaWFzICgiZiIsICJmcmFtZSIsIDEpOworICBhZGRfaW5mbyAoImxvY2FscyIsIGxvY2Fsc19pbmZvLAorCSAgICAiTG9jYWwgdmFyaWFibGVzIG9mIGN1cnJlbnQgc3RhY2sgZnJhbWUuIik7CisgIGFkZF9pbmZvICgiYXJncyIsIGFyZ3NfaW5mbywKKwkgICAgIkFyZ3VtZW50IHZhcmlhYmxlcyBvZiBjdXJyZW50IHN0YWNrIGZyYW1lLiIpOworICBpZiAoeGRiX2NvbW1hbmRzKQorICAgICAgYWRkX2NvbSgibCIsIGNsYXNzX2luZm8sIGFyZ3NfcGx1c19sb2NhbHNfaW5mbywgCisJICAgICJBcmd1bWVudCBhbmQgbG9jYWwgdmFyaWFibGVzIG9mIGN1cnJlbnQgc3RhY2sgZnJhbWUuIik7CisKKyAgaWYgKGRieF9jb21tYW5kcykKKyAgICAgIGFkZF9jb20oImZ1bmMiLCBjbGFzc19zdGFjaywgZnVuY19jb21tYW5kLCAKKyAgICAgICAgICJTZWxlY3QgdGhlIHN0YWNrIGZyYW1lIHRoYXQgY29udGFpbnMgPGZ1bmM+LlxuVXNhZ2U6IGZ1bmMgPG5hbWU+XG4iKTsKKworICBhZGRfaW5mbyAoImNhdGNoIiwgY2F0Y2hfaW5mbywKKwkgICAgIkV4Y2VwdGlvbnMgdGhhdCBjYW4gYmUgY2F1Z2h0IGluIHRoZSBjdXJyZW50IHN0YWNrIGZyYW1lLiIpOworCisjaWYgMAorICBhZGRfY21kICgiYmFja3RyYWNlLWxpbWl0IiwgY2xhc3Nfc3RhY2ssIHNldF9iYWNrdHJhY2VfbGltaXRfY29tbWFuZCwgCisJICAgIlNwZWNpZnkgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIGZvciBcImJhY2t0cmFjZVwiIHRvIHByaW50IGJ5IGRlZmF1bHQuIiwKKwkgICAmc2V0bGlzdCk7CisgIGFkZF9pbmZvICgiYmFja3RyYWNlLWxpbWl0IiwgYmFja3RyYWNlX2xpbWl0X2luZm8sCisJICAgICJUaGUgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIGZvciBcImJhY2t0cmFjZVwiIHRvIHByaW50IGJ5IGRlZmF1bHQuIik7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2dkYi9zdGFuZGFsb25lLmMgYi9nZGIvc3RhbmRhbG9uZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZmM0NzYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvc3RhbmRhbG9uZS5jCkBAIC0wLDAgKzEsNTkzIEBACisvKiBJbnRlcmZhY2UgdG8gYmFyZSBtYWNoaW5lIGZvciBHREIgcnVubmluZyBhcyBrZXJuZWwgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlICJnZGJfc3RhdC5oIgorCisjaWYgZGVmaW5lZCAoU0lHVFNUUCkgJiYgZGVmaW5lZCAoU0lHSU8pCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNlbmRpZiAvKiBTSUdUU1RQIGFuZCBTSUdJTyBkZWZpbmVkIChtdXN0IGJlIDQuMikgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJzaWduYWxzLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgIndhaXQuaCIKKworDAorLyogUmFuZG9tIHN5c3RlbSBjYWxscywgbW9zdGx5IG5vLW9wcyB0byBwcmV2ZW50IGxpbmsgcHJvYmxlbXMgICovCisKK2lvY3RsIChkZXNjLCBjb2RlLCBhcmcpCit7fQorCitpbnQgKCogc2lnbmFsICgpKSAoKQore30KKwora2lsbCAoKQore30KKworZ2V0cGlkICgpCit7CisgIHJldHVybiAwOworfQorCitzaWdzZXRtYXNrICgpCit7fQorCitjaGRpciAoKQore30KKworY2hhciAqCitnZXRjd2QgKGJ1ZiwgbGVuKQorICAgICBjaGFyICpidWY7CisgICAgIHVuc2lnbmVkIGludCBsZW47Cit7CisgIGJ1ZlswXSA9ICcvJzsKKyAgYnVmWzFdID0gMDsKKyAgcmV0dXJuIGJ1ZjsKK30KKworLyogVXNlZCB0byBjaGVjayBmb3IgZXhpc3RlbmNlIG9mIC5nZGJpbml0LiAgU2F5IG5vLiAgKi8KKworYWNjZXNzICgpCit7CisgIHJldHVybiAtMTsKK30KKworZXhpdCAoKQoreworICBlcnJvciAoIkZhdGFsIGVycm9yOyByZXN0YXJ0aW5nLiIpOworfQorDAorLyogUmVhZGluZyAiZmlsZXMiLiAgVGhlIGNvbnRlbnRzIG9mIHNvbWUgZmlsZXMgYXJlIHdyaXR0ZW4gaW50byBrZGIncworICAgZGF0YSBhcmVhIGJlZm9yZSBpdCBpcyBydW4uICBUaGVzZSBmaWxlcyBhcmUgdXNlZCB0byBjb250YWluIHRoZQorICAgc3ltYm9sIHRhYmxlIGZvciBrZGIgdG8gbG9hZCwgYW5kIHRoZSBzb3VyY2UgZmlsZXMgKGluIGNhc2UgdGhlCisgICBrZGIgdXNlciB3YW50cyB0byBwcmludCB0aGVtKS4gIFRoZSBzeW1ib2xzIGFyZSBzdG9yZWQgaW4gYSBmaWxlCisgICBuYW1lZCAia2RiLXN5bWJvbHMiIGluIGEub3V0IGZvcm1hdCAoZXhjZXB0IHRoYXQgYWxsIHRoZSB0ZXh0IGFuZAorICAgZGF0YSBoYXZlIGJlZW4gc3RyaXBwZWQgdG8gc2F2ZSByb29tKS4KKworICAgVGhlIGZpbGVzIGFyZSBzdG9yZWQgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgICBpbnQgICAgIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIGZvciB0aGlzIGZpbGUsIGluY2x1ZGluZyB0aGVzZSBmb3VyLgorICAgY2hhcltdICBuYW1lIG9mIHRoZSBmaWxlLCBlbmRpbmcgd2l0aCBhIG51bGwuCisgICBwYWRkaW5nIHRvIG11bHRpcGxlIG9mIDQgYm91bmRhcnkuCisgICBjaGFyW10gIGZpbGUgY29udGVudHMuICBUaGUgbGVuZ3RoIGNhbiBiZSBkZWR1Y2VkIGZyb20gd2hhdCB3YXMKKyAgICAgICAgICAgc3BlY2lmaWVkIGJlZm9yZS4gIFRoZXJlIGlzIG5vIHRlcm1pbmF0aW5nIG51bGwgaGVyZS4KKworICAgSWYgdGhlIGludCBhdCB0aGUgZnJvbnQgaXMgemVybywgaXQgbWVhbnMgdGhlcmUgYXJlIG5vIG1vcmUgZmlsZXMuCisKKyAgIE9wZW5pbmcgYSBmaWxlIGluIGtkYiByZXR1cm5zIGEgbm9uemVybyB2YWx1ZSB0byBpbmRpY2F0ZSBzdWNjZXNzLAorICAgYnV0IHRoZSB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIuICBPbmx5IG9uZSBmaWxlIGNhbiBiZSBvcGVuLCBhbmQgb25seQorICAgZm9yIHJlYWRpbmcuICBBbGwgdGhlIHByaW1pdGl2ZXMgZm9yIGlucHV0IGZyb20gdGhlIGZpbGUga25vdworICAgd2hpY2ggZmlsZSBpcyBvcGVuIGFuZCBpZ25vcmUgd2hhdCBpcyBzcGVjaWZpZWQgZm9yIHRoZSBkZXNjcmlwdG9yCisgICBvciBmb3IgdGhlIHN0ZGlvIHN0cmVhbS4KKworICAgSW5wdXQgd2l0aCBmZ2V0YyBjYW4gYmUgZG9uZSBlaXRoZXIgb24gdGhlIGZpbGUgdGhhdCBpcyBvcGVuCisgICBvciBvbiBzdGRpbiAod2hpY2ggcmVhZHMgZnJvbSB0aGUgdGVybWluYWwgdGhyb3VnaCB0dHlfaW5wdXQgKCkgICovCisKKy8qIEFkZHJlc3Mgb2YgZGF0YSBmb3IgdGhlIGZpbGVzIHN0b3JlZCBpbiBmb3JtYXQgZGVzY3JpYmVkIGFib3ZlLiAgKi8KK2NoYXIgKmZpbGVzX3N0YXJ0OworCisvKiBUaGUgZmlsZSBzdHJlYW0gY3VycmVudGx5IG9wZW46ICAqLworCitjaGFyICpzb3VyY2ViZWc7CQkvKiBiZWdpbm5pbmcgb2YgY29udGVudHMgKi8KK2ludCBzb3VyY2VzaXplOwkJCS8qIHNpemUgb2YgY29udGVudHMgKi8KK2NoYXIgKnNvdXJjZXB0cjsJCS8qIGN1cnJlbnQgcmVhZCBwb2ludGVyICovCitpbnQgc291cmNlbGVmdDsJCQkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gZW9mICovCisKKy8qICJkZXNjcmlwdG9yIiBmb3IgdGhlIGZpbGUgbm93IG9wZW4uCisgICBJbmNyZW1lbnRlZCBhdCBlYWNoIGNsb3NlLgorICAgSWYgc3BlY2lmaWVkIGRlc2NyaXB0b3IgZG9lcyBub3QgbWF0Y2ggdGhpcywKKyAgIGl0IG1lYW5zIHRoZSBwcm9ncmFtIGlzIHRyeWluZyB0byB1c2UgYSBjbG9zZWQgZGVzY3JpcHRvci4KKyAgIFdlIHJlcG9ydCBhbiBlcnJvciBmb3IgdGhhdC4gICovCisKK2ludCBzb3VyY2VkZXNjOworCitvcGVuIChmaWxlbmFtZSwgbW9kZXMpCisgICAgIGNoYXIgKmZpbGVuYW1lOworICAgICBpbnQgbW9kZXM7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKm5leHQ7CisKKyAgaWYgKG1vZGVzKQorICAgIHsKKyAgICAgIGVycm5vID0gRVJPRlM7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmIChzb3VyY2VwdHIpCisgICAgeworICAgICAgZXJybm8gPSBFTUZJTEU7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGZvciAobmV4dCA9IGZpbGVzX3N0YXJ0OyAqIChpbnQgKikgbmV4dDsgbmV4dCArPSAqIChpbnQgKikgbmV4dCkKKyAgICB7CisgICAgICBpZiAoIVNUUkNNUCAobmV4dCArIDQsIGZpbGVuYW1lKSkKKwl7CisJICBzb3VyY2ViZWcgPSBuZXh0ICsgNCArIHN0cmxlbiAobmV4dCArIDQpICsgMTsKKwkgIHNvdXJjZWJlZyA9IChjaGFyICopICgoKGludCkgc291cmNlYmVnICsgMykgJiAoLTQpKTsKKwkgIHNvdXJjZXB0ciA9IHNvdXJjZWJlZzsKKwkgIHNvdXJjZXNpemUgPSBuZXh0ICsgKiAoaW50ICopIG5leHQgLSBzb3VyY2VwdHI7CisJICBzb3VyY2VsZWZ0ID0gc291cmNlc2l6ZTsKKwkgIHJldHVybiBzb3VyY2VkZXNjOworCX0KKyAgICB9CisgIHJldHVybiAwOworfQorCitjbG9zZSAoZGVzYykKKyAgICAgaW50IGRlc2M7Cit7CisgIHNvdXJjZXB0ciA9IDA7CisgIHNvdXJjZWRlc2MrKzsKKyAgLyogRG9uJ3QgbGV0IHNvdXJjZWRlc2MgZ2V0IGJpZyBlbm91Z2ggdG8gYmUgY29uZnVzZWQgd2l0aCBzdGRpbi4gICovCisgIGlmIChzb3VyY2VkZXNjID09IDEwMCkKKyAgICBzb3VyY2VkZXNjID0gNTsKK30KKworRklMRSAqCitmb3BlbiAoZmlsZW5hbWUsIG1vZGVzKQorICAgICBjaGFyICpmaWxlbmFtZTsKKyAgICAgY2hhciAqbW9kZXM7Cit7CisgIHJldHVybiAoRklMRSAqKSBvcGVuIChmaWxlbmFtZSwgKm1vZGVzID09ICd3Jyk7Cit9CisKK0ZJTEUgKgorZmRvcGVuIChkZXNjKQorICAgICBpbnQgZGVzYzsKK3sKKyAgcmV0dXJuIChGSUxFICopIGRlc2M7Cit9CisKK2ZjbG9zZSAoZGVzYykKKyAgICAgaW50IGRlc2M7Cit7CisgIGNsb3NlIChkZXNjKTsKK30KKworZnN0YXQgKGRlc2MsIHN0YXRidWYpCisgICAgIHN0cnVjdCBzdGF0ICpzdGF0YnVmOworeworICBpZiAoZGVzYyAhPSBzb3VyY2VkZXNjKQorICAgIHsKKyAgICAgIGVycm5vID0gRUJBREY7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICBzdGF0YnVmLT5zdF9zaXplID0gc291cmNlc2l6ZTsKK30KKworbXlyZWFkIChkZXNjLCBkZXN0cHRyLCBzaXplLCBmaWxlbmFtZSkKKyAgICAgaW50IGRlc2M7CisgICAgIGNoYXIgKmRlc3RwdHI7CisgICAgIGludCBzaXplOworICAgICBjaGFyICpmaWxlbmFtZTsKK3sKKyAgaW50IGxlbiA9IG1pbiAoc291cmNlbGVmdCwgc2l6ZSk7CisKKyAgaWYgKGRlc2MgIT0gc291cmNlZGVzYykKKyAgICB7CisgICAgICBlcnJubyA9IEVCQURGOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBtZW1jcHkgKGRlc3RwdHIsIHNvdXJjZXB0ciwgbGVuKTsKKyAgc291cmNlbGVmdCAtPSBsZW47CisgIHJldHVybiBsZW47Cit9CisKK2ludAorZnJlYWQgKGJ1ZnAsIG51bWVsdHMsIGVsdHNpemUsIHN0cmVhbSkKK3sKKyAgcmVnaXN0ZXIgaW50IGVsdHMgPSBtaW4gKG51bWVsdHMsIHNvdXJjZWxlZnQgLyBlbHRzaXplKTsKKyAgcmVnaXN0ZXIgaW50IGxlbiA9IGVsdHMgKiBlbHRzaXplOworCisgIGlmIChzdHJlYW0gIT0gc291cmNlZGVzYykKKyAgICB7CisgICAgICBlcnJubyA9IEVCQURGOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBtZW1jcHkgKGJ1ZnAsIHNvdXJjZXB0ciwgbGVuKTsKKyAgc291cmNlbGVmdCAtPSBsZW47CisgIHJldHVybiBlbHRzOworfQorCitpbnQKK2ZnZXRjIChkZXNjKQorICAgICBpbnQgZGVzYzsKK3sKKworICBpZiAoZGVzYyA9PSAoaW50KSBzdGRpbikKKyAgICByZXR1cm4gdHR5X2lucHV0ICgpOworCisgIGlmIChkZXNjICE9IHNvdXJjZWRlc2MpCisgICAgeworICAgICAgZXJybm8gPSBFQkFERjsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKHNvdXJjZWxlZnQtLSA8PSAwKQorICAgIHJldHVybiBFT0Y7CisgIHJldHVybiAqc291cmNlcHRyKys7Cit9CisKK2xzZWVrIChkZXNjLCBwb3MpCisgICAgIGludCBkZXNjOworICAgICBpbnQgcG9zOworeworCisgIGlmIChkZXNjICE9IHNvdXJjZWRlc2MpCisgICAgeworICAgICAgZXJybm8gPSBFQkFERjsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYgKHBvcyA8IDAgfHwgcG9zID4gc291cmNlc2l6ZSkKKyAgICB7CisgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgc291cmNlcHRyID0gc291cmNlYmVnICsgcG9zOworICBzb3VyY2VsZWZ0ID0gc291cmNlc2l6ZSAtIHBvczsKK30KKwwKKy8qIE91dHB1dCBpbiBrZGIgY2FuIGdvIG9ubHkgdG8gdGhlIHRlcm1pbmFsLCBzbyB0aGUgc3RyZWFtCisgICBzcGVjaWZpZWQgbWF5IGJlIGlnbm9yZWQuICAqLworCitwcmludGYgKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpCit7CisgIGNoYXIgYnVmZmVyWzEwMjRdOworICBzcHJpbnRmIChidWZmZXIsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpOworICBkaXNwbGF5X3N0cmluZyAoYnVmZmVyKTsKK30KKworZnByaW50ZiAoaWduLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KQoreworICBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgc3ByaW50ZiAoYnVmZmVyLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTsKKyAgZGlzcGxheV9zdHJpbmcgKGJ1ZmZlcik7Cit9CisKK2Z3cml0ZSAoYnVmLCBudW1lbHRzLCBzaXplLCBzdHJlYW0pCisgICAgIHJlZ2lzdGVyIGNoYXIgKmJ1ZjsKKyAgICAgaW50IG51bWVsdHMsIHNpemU7Cit7CisgIHJlZ2lzdGVyIGludCBpID0gbnVtZWx0cyAqIHNpemU7CisgIHdoaWxlIChpLS0gPiAwKQorICAgIGZwdXRjICgqYnVmKyssIHN0cmVhbSk7Cit9CisKK2ZwdXRjIChjLCBpZ24pCit7CisgIGNoYXIgYnVmWzJdOworICBidWZbMF0gPSBjOworICBidWZbMV0gPSAwOworICBkaXNwbGF5X3N0cmluZyAoYnVmKTsKK30KKworLyogc3ByaW50ZiByZWZlcnMgdG8gdGhpcywgYnV0IGxvYWRpbmcgdGhpcyBmcm9tIHRoZQorICAgbGlicmFyeSB3b3VsZCBjYXVzZSBmZmx1c2ggdG8gYmUgbG9hZGVkIGZyb20gaXQgdG9vLgorICAgSW4gZmFjdCB0aGVyZSBzaG91bGQgYmUgbm8gbmVlZCB0byBjYWxsIHRoaXMgKEkgaG9wZSkuICAqLworCitfZmxzYnVmICgpCit7CisgIGVycm9yICgiX2Zsc2J1ZiB3YXMgYWN0dWFsbHkgY2FsbGVkLiIpOworfQorCitmZmx1c2ggKGlnbikKK3sKK30KKwwKKy8qIEVudHJpZXMgaW50byBjb3JlIGFuZCBpbmZsb3csIG5lZWRlZCBvbmx5IHRvIG1ha2UgdGhpbmdzIGxpbmsgb2suICAqLworCitleGVjX2ZpbGVfY29tbWFuZCAoKQore30KKworY29yZV9maWxlX2NvbW1hbmQgKCkKK3t9CisKK2NoYXIgKgorZ2V0X2V4ZWNfZmlsZSAoZXJyKQorICAgICBpbnQgZXJyOworeworICAvKiBNYWtlcyBvbmUgcHJpbnRvdXQgbG9vayByZWFzb25hYmxlOyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIgb3RoZXJ3aXNlLiAgKi8KKyAgcmV0dXJuICJydW4iOworfQorCisvKiBOb256ZXJvIGlmIHRoZXJlIGlzIGEgY29yZSBmaWxlLiAgKi8KKworaGF2ZV9jb3JlX2ZpbGVfcCAoKQoreworICByZXR1cm4gMDsKK30KKwora2lsbF9jb21tYW5kICgpCit7CisgIGluZmVyaW9yX3BpZCA9IDA7Cit9CisKK3Rlcm1pbmFsX2luZmVyaW9yICgpCit7fQorCit0ZXJtaW5hbF9vdXJzICgpCit7fQorCit0ZXJtaW5hbF9pbml0X2luZmVyaW9yICgpCit7fQorCit3cml0ZV9pbmZlcmlvcl9yZWdpc3RlciAoKQore30KKworcmVhZF9pbmZlcmlvcl9yZWdpc3RlciAoKQore30KKworcmVhZF9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICBtZW1jcHkgKG15YWRkciwgbWVtYWRkciwgbGVuKTsKK30KKworLyogQWx3YXlzIHJldHVybiAwIGluZGljYXRpbmcgc3VjY2Vzcy4gICovCisKK3dyaXRlX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47Cit7CisgIG1lbWNweSAobWVtYWRkciwgbXlhZGRyLCBsZW4pOworICByZXR1cm4gMDsKK30KKworc3RhdGljIFJFR0lTVEVSX1RZUEUgc2F2ZWRfcmVnc1tOVU1fUkVHU107CisKK1JFR0lTVEVSX1RZUEUKK3JlYWRfcmVnaXN0ZXIgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGlmIChyZWdubyA8IDAgfHwgcmVnbm8gPj0gTlVNX1JFR1MpCisgICAgZXJyb3IgKCJSZWdpc3RlciBudW1iZXIgJWQgb3V0IG9mIHJhbmdlLiIsIHJlZ25vKTsKKyAgcmV0dXJuIHNhdmVkX3JlZ3NbcmVnbm9dOworfQorCit2b2lkCit3cml0ZV9yZWdpc3RlciAocmVnbm8sIHZhbHVlKQorICAgICBpbnQgcmVnbm87CisgICAgIFJFR0lTVEVSX1RZUEUgdmFsdWU7Cit7CisgIGlmIChyZWdubyA8IDAgfHwgcmVnbm8gPj0gTlVNX1JFR1MpCisgICAgZXJyb3IgKCJSZWdpc3RlciBudW1iZXIgJWQgb3V0IG9mIHJhbmdlLiIsIHJlZ25vKTsKKyAgc2F2ZWRfcmVnc1tyZWdub10gPSB2YWx1ZTsKK30KKwwKKy8qIFN5c3RlbSBjYWxscyBuZWVkZWQgaW4gcmVsYXRpb24gdG8gcnVubmluZyB0aGUgImluZmVyaW9yIi4gICovCisKK3Zmb3JrICgpCit7CisgIC8qIEp1c3QgYXBwZWFyIHRvICJzdWNjZWVkIi4gIFNheSB0aGUgaW5mZXJpb3IncyBwaWQgaXMgMS4gICovCisgIHJldHVybiAxOworfQorCisvKiBUaGVzZSBhcmUgY2FsbGVkIGJ5IGNvZGUgdGhhdCBub3JtYWxseSBydW5zIGluIHRoZSBpbmZlcmlvcgorICAgdGhhdCBoYXMganVzdCBiZWVuIGZvcmtlZC4gIFRoYXQgY29kZSBuZXZlciBydW5zLCB3aGVuIHN0YW5kYWxvbmUsCisgICBhbmQgdGhlc2UgZGVmaW5pdGlvbnMgYXJlIHNvIGl0IHdpbGwgbGluayB3aXRob3V0IGVycm9ycy4gICovCisKK3B0cmFjZSAoKQore30KKworc2V0cGdycCAoKQore30KKworZXhlY2xlICgpCit7fQorCitfZXhpdCAoKQore30KKwwKKy8qIE1hbGxvYyBjYWxscyB0aGVzZS4gICovCisKK21hbGxvY193YXJuaW5nIChzdHIpCisgICAgIGNoYXIgKnN0cjsKK3sKKyAgcHJpbnRmICgiXG4lcy5cblxuIiwgc3RyKTsKK30KKworY2hhciAqbmV4dF9mcmVlOworY2hhciAqbWVtb3J5X2xpbWl0OworCitjaGFyICoKK3NicmsgKGFtb3VudCkKKyAgICAgaW50IGFtb3VudDsKK3sKKyAgaWYgKG5leHRfZnJlZSArIGFtb3VudCA+IG1lbW9yeV9saW1pdCkKKyAgICByZXR1cm4gKGNoYXIgKikgLTE7CisgIG5leHRfZnJlZSArPSBhbW91bnQ7CisgIHJldHVybiBuZXh0X2ZyZWUgLSBhbW91bnQ7Cit9CisKKy8qIFZhcmlvdXMgd2F5cyBtYWxsb2MgbWlnaHQgYXNrIHdoZXJlIGVuZCBvZiBtZW1vcnkgaXMuICAqLworCitjaGFyICoKK3VsaW1pdCAoKQoreworICByZXR1cm4gbWVtb3J5X2xpbWl0OworfQorCitpbnQKK3ZsaW1pdCAoKQoreworICByZXR1cm4gbWVtb3J5X2xpbWl0IC0gbmV4dF9mcmVlOworfQorCitnZXRybGltaXQgKGFkZHIpCisgICAgIHN0cnVjdCBybGltaXQgKmFkZHI7Cit7CisgIGFkZHItPnJsaW1fY3VyID0gbWVtb3J5X2xpbWl0IC0gbmV4dF9mcmVlOworfQorDAorLyogQ29udGV4dCBzd2l0Y2hpbmcgdG8gYW5kIGZyb20gcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZC4gICovCisKKy8qIEdEQiBjYWxscyBoZXJlIHRvIHJ1biB0aGUgdXNlciBwcm9ncmFtLgorICAgVGhlIGZyYW1lIHBvaW50ZXIgZm9yIHRoaXMgZnVuY3Rpb24gaXMgc2F2ZWQgaW4KKyAgIGdkYl9zdGFjayBieSBzYXZlX2ZyYW1lX3BvaW50ZXI7IHRoZW4gd2UgcmVzdG9yZQorICAgYWxsIG9mIHRoZSB1c2VyIHByb2dyYW0ncyByZWdpc3RlcnMsIGluY2x1ZGluZyBQQyBhbmQgUFMuICAqLworCitzdGF0aWMgaW50IGZhdWx0X2NvZGU7CitzdGF0aWMgUkVHSVNURVJfVFlQRSBnZGJfc3RhY2s7CisKK3Jlc3VtZSAoKQoreworICBSRUdJU1RFUl9UWVBFIHJlc3RvcmVbTlVNX1JFR1NdOworCisgIFBVU0hfRlJBTUVfUFRSOworICBzYXZlX2ZyYW1lX3BvaW50ZXIgKCk7CisKKyAgbWVtY3B5IChyZXN0b3JlLCBzYXZlZF9yZWdzLCBzaXplb2YgcmVzdG9yZSk7CisgIFBPUF9SRUdJU1RFUlM7CisgIC8qIENvbnRyb2wgZG9lcyBub3QgZHJvcCB0aHJvdWdoIGhlcmUhICAqLworfQorCitzYXZlX2ZyYW1lX3BvaW50ZXIgKHZhbCkKKyAgICAgQ09SRV9BRERSIHZhbDsKK3sKKyAgZ2RiX3N0YWNrID0gdmFsOworfQorCisvKiBGYXVsdCBoYW5kbGVycyBjYWxsIGhlcmUsIHJ1bm5pbmcgaW4gdGhlIHVzZXIgcHJvZ3JhbSBzdGFjay4KKyAgIFRoZXkgbXVzdCBmaXJzdCBwdXNoIGEgZmF1bHQgY29kZSwKKyAgIG9sZCBQQywgb2xkIFBTLCBhbmQgYW55IG90aGVyIGluZm8gYWJvdXQgdGhlIGZhdWx0LgorICAgVGhlIGV4YWN0IGZvcm1hdCBpcyBtYWNoaW5lLWRlcGVuZGVudCBhbmQgaXMga25vd24gb25seQorICAgaW4gdGhlIGRlZmluaXRpb24gb2YgUFVTSF9SRUdJU1RFUlMuICAqLworCitmYXVsdCAoKQoreworICAvKiBUcmFuc2ZlciBhbGwgcmVnaXN0ZXJzIGFuZCBmYXVsdCBjb2RlIHRvIHRoZSBzdGFjaworICAgICBpbiBjYW5vbmljYWwgb3JkZXI6IHJlZ2lzdGVycyBpbiBvcmRlciBvZiBHREIgcmVnaXN0ZXIgbnVtYmVyLAorICAgICBmb2xsb3dlZCBieSBmYXVsdCBjb2RlLiAgKi8KKyAgUFVTSF9SRUdJU1RFUlM7CisKKyAgLyogVHJhbnNmZXIgdGhlbSB0byBzYXZlZF9yZWdzIGFuZCBmYXVsdF9jb2RlLiAgKi8KKyAgc2F2ZV9yZWdpc3RlcnMgKCk7CisKKyAgcmVzdG9yZV9nZGIgKCk7CisgIC8qIENvbnRyb2wgZG9lcyBub3QgcmVhY2ggaGVyZSAqLworfQorCityZXN0b3JlX2dkYiAoKQoreworICBDT1JFX0FERFIgbmV3X2ZwID0gZ2RiX3N0YWNrOworICAvKiBTd2l0Y2ggdG8gR0RCJ3Mgc3RhY2sgICovCisgIFBPUF9GUkFNRV9QVFI7CisgIC8qIFJldHVybiBmcm9tIHRoZSBmdW5jdGlvbiBgcmVzdW1lJy4gICovCit9CisKKy8qIEFzc3VtaW5nIHJlZ2lzdGVyIGNvbnRlbnRzIGFuZCBmYXVsdCBjb2RlIGhhdmUgYmVlbiBwdXNoZWQgb24gdGhlIHN0YWNrIGFzCisgICBhcmd1bWVudHMgdG8gdGhpcyBmdW5jdGlvbiwgY29weSB0aGVtIGludG8gdGhlIHN0YW5kYXJkIHBsYWNlCisgICBmb3IgdGhlIHByb2dyYW0ncyByZWdpc3RlcnMgd2hpbGUgR0RCIGlzIHJ1bm5pbmcuICAqLworCitzYXZlX3JlZ2lzdGVycyAoZmlyc3RyZWcpCisgICAgIGludCBmaXJzdHJlZzsKK3sKKyAgbWVtY3B5IChzYXZlZF9yZWdzLCAmZmlyc3RyZWcsIHNpemVvZiBzYXZlZF9yZWdzKTsKKyAgZmF1bHRfY29kZSA9ICgmZmlyc3RyZWcpW05VTV9SRUdTXTsKK30KKworLyogU3RvcmUgaW50byB0aGUgc3RydWN0dXJlIHN1Y2ggYXMgYHdhaXQnIHdvdWxkIHJldHVybgorICAgdGhlIGluZm9ybWF0aW9uIG9uIHdoeSB0aGUgcHJvZ3JhbSBmYXVsdGVkLAorICAgY29udmVydGVkIGludG8gYSBtYWNoaW5lLWluZGVwZW5kZW50IHNpZ25hbCBudW1iZXIuICAqLworCitzdGF0aWMgaW50IGZhdWx0X3RhYmxlW10gPSBGQVVMVF9UQUJMRTsKKworaW50Cit3YWl0ICh3KQorICAgICBXQUlUVFlQRSAqdzsKK3sKKyAgV1NFVFNUT1AgKCp3LCBmYXVsdF90YWJsZVtmYXVsdF9jb2RlIC8gRkFVTFRfQ09ERV9VTklUU10pOworICByZXR1cm4gaW5mZXJpb3JfcGlkOworfQorDAorLyogQWxsb2NhdGUgYSBiaWcgc3BhY2UgaW4gd2hpY2ggZmlsZXMgZm9yIGtkYiB0byByZWFkIHdpbGwgYmUgc3RvcmVkLgorICAgV2hhdGV2ZXIgaXMgbGVmdCBpcyB3aGVyZSBtYWxsb2MgY2FuIGFsbG9jYXRlIHN0b3JhZ2UuCisKKyAgIEluaXRpYWxpemUgaXQsIHNvIHRoYXQgdGhlcmUgd2lsbCBiZSBzcGFjZSBpbiB0aGUgZXhlY3V0YWJsZSBmaWxlCisgICBmb3IgaXQuICBUaGVuIHRoZSBmaWxlcyBjYW4gYmUgcHV0IGludG8ga2RiIGJ5IHdyaXRpbmcgdGhlbSBpbnRvCisgICBrZGIncyBleGVjdXRhYmxlIGZpbGUuICAqLworCisvKiBUaGUgZGVmYXVsdCBzaXplIGlzIGFzIG11Y2ggc3BhY2UgYXMgd2UgZXhwZWN0IHRvIGJlIGF2YWlsYWJsZQorICAgZm9yIGtkYiB0byB1c2UhICAqLworCisjaWZuZGVmIEhFQVBfU0laRQorI2RlZmluZSBIRUFQX1NJWkUgNDAwMDAwCisjZW5kaWYKKworY2hhciBoZWFwW0hFQVBfU0laRV0gPSB7MH07CisKKyNpZm5kZWYgU1RBQ0tfU0laRQorI2RlZmluZSBTVEFDS19TSVpFIDEwMDAwMAorI2VuZGlmCisKK2ludCBrZGJfc3RhY2tfYmVnW1NUQUNLX1NJWkUgLyBzaXplb2YgKGludCldOworaW50IGtkYl9zdGFja19lbmQ7CisKK19pbml0aWFsaXplX3N0YW5kYWxvbmUgKCkKK3sKKyAgcmVnaXN0ZXIgY2hhciAqbmV4dDsKKworICAvKiBGaW5kIHN0YXJ0IG9mIGRhdGEgb24gZmlsZXMuICAqLworCisgIGZpbGVzX3N0YXJ0ID0gaGVhcDsKKworICAvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGRhdGEgb24gZmlsZXMuICAqLworCisgIGZvciAobmV4dCA9IGZpbGVzX3N0YXJ0OyAqIChpbnQgKikgbmV4dDsgbmV4dCArPSAqIChpbnQgKikgbmV4dCkge30KKworICAvKiBUaGF0IGlzIHdoZXJlIGZyZWUgc3RvcmFnZSBzdGFydHMgZm9yIHNicmsgdG8gZ2l2ZSBvdXQuICAqLworICBuZXh0X2ZyZWUgPSBuZXh0OworCisgIG1lbW9yeV9saW1pdCA9IGhlYXAgKyBzaXplb2YgaGVhcDsKK30KKwpkaWZmIC0tZ2l0IGEvZ2RiL3N0b3AtZ2RiLmMgYi9nZGIvc3RvcC1nZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjIyYmY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3N0b3AtZ2RiLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qIEEgY2xpZW50IHRvIG1ha2UgR0RCIHJldHVybiB0byBjb21tYW5kIGxldmVsIGluIE1hY2ggMy4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBBdXRob3JzOiBKdWtrYSBWaXJ0YW5lbiA8anR2QGh1dC5maT4gYW5kIFBldGVyIFN0b3V0IDxwZHNAY3MuY211LmVkdT4uCisKKyAgIEEgc2ltcGxlIGNsaWVudCB0byBtYWtlIEdEQiAodmVyc2lvbnMgNC40IGFuZCBsYXRlcikgb24gTWFjaCAzIHJldHVybgorICAgdG8gdGhlIGNvbW1hbmQgbGV2ZWwgd2hlbiBpdCBpcyB3YWl0aW5nIGZvciB0aGUgaW5mZXJpb3IgdG8gc3RvcC4KKyAgCisgICBBY3Rpb25zOiBMb29rdXAgdGhlIHNlbmQgcmlnaHQgdG8gdGhlIEdEQiBtZXNzYWdlIHBvcnQgZnJvbSB0aGUKKyAgICAgICAgICAgIE5ldE1zZ1NlcnZlci4KKworIAkgICAgU2VuZCBhbiBhc3luY2hyb25vdXMgbWVzc2FnZSB3aXRoIG1zZ2hfaWQKKyAJICAgIEdEQl9NRVNTQUdFX0lEX1NUT1AgdG8gdGhhdCBwb3J0LgorICAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJkZWZzLmgiCisKKyNpbmNsdWRlIDxtYWNoLmg+CisjaW5jbHVkZSA8bWFjaC9tZXNzYWdlLmg+CisjaW5jbHVkZSA8bWFjaF9lcnJvci5oPgorI2luY2x1ZGUgPHNlcnZlcnMvbmV0bmFtZS5oPgorI2luY2x1ZGUgPHNlcnZlcnMvbmV0bmFtZV9kZWZzLmg+CisKK3ZvaWQKK21haW4gKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICoqYXJndjsKK3sKKyAga2Vybl9yZXR1cm5fdCBrcjsKKyAgbWFjaF9tc2dfaGVhZGVyX3QgbXNnOworICBtYWNoX3BvcnRfdCBnZGJfcG9ydDsKKyAgY2hhciAqaG9zdDsKKyAgY2hhciAqbmFtZTsKKworICBpZiAoYXJnYyA9PSAxKQorICAgIGFyZ3ZbYXJnYysrXSA9IEdEQl9ERUZfTkFNRTsKKworICBpZiAoYXJnYyAhPSAyKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlIDogJXMgPEdEQiBuYW1lPlxuIiwgYXJndlswXSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgLyogQWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSBhIHJlbW90ZSBob3N0LiAgKi8KKyAgaG9zdCA9IHN0cmNociAoYXJndlsxXSwgJ0AnKTsKKyAgaWYgKGhvc3QpCisgICAgKihob3N0KyspID0gJ1wwJzsKKyAgZWxzZQorICAgIGhvc3QgPSAoY2hhciAqKSAiIjsKKworICBuYW1lID0gbWFsbG9jIChzdHJsZW4gKGFyZ3ZbMV0pICsgc2l6ZW9mKEdEQl9OQU1FX1BSRUZJWCkpOworICBpZiAobmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5hbWUuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgc3RyY3B5IChuYW1lLCBHREJfTkFNRV9QUkVGSVgpOworICBzdHJjYXQgKG5hbWUsIGFyZ3ZbMV0pOworCisgIC8qIExvb2sgdXAgdGhlIEdEQiBzZXJ2aWNlIHBvcnQuICBGb3IgY29udmVuaWVuY2UsIGFkZCB0aGUKKyAgICAgR0RCX05BTUVfUFJFRklYIHRoZSBhcmd1bWVudCBiZWZvcmUgbG9va2luZyB1cCB0aGUgbmFtZS4KKyAgICAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBkbyBpdCB3aXRob3V0LiAgKi8KKworICBrciA9IG5ldG5hbWVfbG9va191cCAobmFtZV9zZXJ2ZXJfcG9ydCwgaG9zdCwgbmFtZSwgJmdkYl9wb3J0KTsKKyAgaWYgKGtyID09IE5FVE5BTUVfTk9UX0NIRUNLRURfSU4pCisgICAga3IgPSBuZXRuYW1lX2xvb2tfdXAgKG5hbWVfc2VydmVyX3BvcnQsIGhvc3QsIGFyZ3ZbMV0sICZnZGJfcG9ydCk7CisgIGlmIChrciAhPSBLRVJOX1NVQ0NFU1MpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5hYmxlIHRvIGxvb2t1cCB0aGUgR0RCIHNlcnZpY2UgcG9ydDogJXMuXG4iLAorCSAgICAgICBtYWNoX2Vycm9yX3N0cmluZyhrcikpOworICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgLyogQ29kZSBnZW5lcmF0ZWQgYnkgbWlnIHN0dWIgZ2VuZXJhdG9yLCB3aXRoIG1pbm9yIGNsZWFudXBzIDotKQorCisgICAgIHNpbXBsZXJvdXRpbmUgc3RvcF9pbmZlcmlvcihnZGJfcG9ydCA6IG1hY2hfcG9ydF90KTsgICovCisKKyAgbXNnLm1zZ2hfYml0cyA9IE1BQ0hfTVNHSF9CSVRTIChNQUNIX01TR19UWVBFX0NPUFlfU0VORCwgMCk7CisgIG1zZy5tc2doX3JlbW90ZV9wb3J0ID0gZ2RiX3BvcnQ7CisgIG1zZy5tc2doX2xvY2FsX3BvcnQgID0gTUFDSF9QT1JUX05VTEw7CisgIG1zZy5tc2doX3NpemUJICAgICAgID0gc2l6ZW9mKG1zZyk7CisgIG1zZy5tc2doX3NlcW5vICAgICAgID0gMDsKKyAgbXNnLm1zZ2hfaWQgICAgICAgICAgPSBHREJfTUVTU0FHRV9JRF9TVE9QOworCisgIGtyID0gbWFjaF9tc2dfc2VuZCAoJm1zZyk7CisgIGlmIChrciAhPSBLRVJOX1NVQ0NFU1MpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiTWVzc2FnZSBub3Qgc2VudCwgcmV0dXJuIGNvZGUgJWQgOiAlc1xuIiwga3IsCisJICAgICBtYWNoX2Vycm9yX3N0cmluZyAoa3IpKTsKKworICBleGl0IChrciAhPSBLRVJOX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3N0dWZmLmMgYi9nZGIvc3R1ZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWRiZWFiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3N0dWZmLmMKQEAgLTAsMCArMSwxNzQgQEAKKy8qIFByb2dyYW0gdG8gc3R1ZmYgZmlsZXMgaW50byBhIHNwZWNpYWxseSBwcmVwYXJlZCBzcGFjZSBpbiBrZGIuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogV3JpdHRlbiAxMy1NYXItODYgYnkgRGF2aWQgQnJpZGdoYW0uICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGEub3V0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAiZ2RiX3N0YXQuaCIKKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPHZhcmFyZ3MuaD4KKworbWFpbiAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKmFyZ3ZbXTsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqY3A7CisgIGNoYXIgKm91dGZpbGU7CisgIHJlZ2lzdGVyIGludCBpOworICBpbnQgb2Zmc2V0OworICBpbnQgb3V0X2ZkLCBpbl9mZDsKKyAgc3RydWN0IHN0YXQgc3RhdF9idWY7CisgIGludCBzaXplLCBwYWQ7CisgIGNoYXIgYnVmWzEwMjRdOworICBzdGF0aWMgY2hhciB6ZXJvc1s0XSA9IHswfTsKKworICBpZiAoYXJnYyA8IDQpCisgICAgZXJyKCJOb3QgZW5vdWdoIGFyZ3VtZW50c1xuVXNhZ2U6ICVzIC1vIGtkYiBmaWxlMSBmaWxlMiAuLi5cbiIsCisJYXJndlswXSk7CisKKyAgb3V0ZmlsZSA9IDA7CisgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgaWYgKFNUUkVRIChhcmd2W2ldLCAiLW8iKSkKKwlvdXRmaWxlID0gYXJndlsrK2ldOworICAgIH0KKyAgaWYgKG91dGZpbGUgPT0gMCkKKyAgICBlcnIoIk91dHB1dCBmaWxlIG5vdCBzcGVjaWZpZWRcbiIpOworCisgIG9mZnNldCA9IGdldF9vZmZzZXQgKG91dGZpbGUsICJfaGVhcCIpOworCisgIG91dF9mZCA9IG9wZW4gKG91dGZpbGUsIE9fV1JPTkxZKTsKKyAgaWYgKG91dF9mZCA8IDApCisgICAgZXJyICgiRXJyb3Igb3BlbmluZyAlcyBmb3Igd3JpdGU6ICVzXG4iLCBvdXRmaWxlLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgaWYgKGxzZWVrIChvdXRfZmQsIG9mZnNldCwgMCkgPCAwKQorICAgIGVyciAoIkVycm9yIHNlZWtpbmcgdG8gaGVhcCBpbiAlczogJXNcbiIsIG91dGZpbGUsIHN0cmVycm9yIChlcnJubykpOworCisgIC8qIEZvciBlYWNoIGZpbGUgbGlzdGVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIHdyaXRlIGl0IGludG8gdGhlCisgICAqICdoZWFwJyBvZiB0aGUgb3V0cHV0IGZpbGUuICBNYWtlIHN1cmUgdG8gc2tpcCB0aGUgYXJndW1lbnRzCisgICAqIHRoYXQgbmFtZSB0aGUgb3V0cHV0IGZpbGUuICovCisgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgaWYgKFNUUkVRIChhcmd2W2ldLCAiLW8iKSkKKwljb250aW51ZTsKKyAgICAgIGlmICgoaW5fZmQgPSBvcGVuIChhcmd2W2ldLCBPX1JET05MWSkpIDwgMCkKKwllcnIgKCJFcnJvciBvcGVuaW5nICVzIGZvciByZWFkOiAlc1xuIiwgYXJndltpXSwKKwkgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgaWYgKGZzdGF0IChpbl9mZCwgJnN0YXRfYnVmKSA8IDApCisJZXJyICgiRXJyb3Igc3RhdCdpbmcgJXM6ICVzXG4iLCBhcmd2W2ldLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgIHNpemUgPSBzdHJsZW4gKGFyZ3ZbaV0pOworICAgICAgcGFkID0gNCAtIChzaXplICYgMyk7CisgICAgICBzaXplICs9IHBhZCArIHN0YXRfYnVmLnN0X3NpemUgKyBzaXplb2YgKGludCk7CisgICAgICB3cml0ZSAob3V0X2ZkLCAmc2l6ZSwgc2l6ZW9mIChpbnQpKTsKKyAgICAgIHdyaXRlIChvdXRfZmQsIGFyZ3ZbaV0sIHN0cmxlbiAoYXJndltpXSkpOworICAgICAgd3JpdGUgKG91dF9mZCwgemVyb3MsIHBhZCk7CisgICAgICB3aGlsZSAoKHNpemUgPSByZWFkIChpbl9mZCwgYnVmLCBzaXplb2YgKGJ1ZikpKSA+IDApCisJd3JpdGUgKG91dF9mZCwgYnVmLCBzaXplKTsKKyAgICAgIGNsb3NlIChpbl9mZCk7CisgICAgfQorICBzaXplID0gMDsKKyAgd3JpdGUgKG91dF9mZCwgJnNpemUsIHNpemVvZiAoaW50KSk7CisgIGNsb3NlIChvdXRfZmQpOworICByZXR1cm4gKDApOworfQorCisvKiBSZWFkIHN5bWJvbCB0YWJsZSBmcm9tIGZpbGUgYW5kIHJldHVybnMgdGhlIG9mZnNldCBpbnRvIHRoZSBmaWxlCisgKiB3aGVyZSBzeW1ib2wgc3ltX25hbWUgaXMgbG9jYXRlZC4gIElmIGVycm9yLCBwcmludCBtZXNzYWdlIGFuZAorICogZXhpdC4gKi8KK2dldF9vZmZzZXQgKGZpbGUsIHN5bV9uYW1lKQorICAgICBjaGFyICpmaWxlOworICAgICBjaGFyICpzeW1fbmFtZTsKK3sKKyAgaW50IGY7CisgIHN0cnVjdCBleGVjIGZpbGVfaGRyOworICBzdHJ1Y3Qgbmxpc3QgKnN5bWJvbF90YWJsZTsKKyAgaW50IHNpemU7CisgIGNoYXIgKnN0cmluZ3M7CisKKyAgZiA9IG9wZW4gKGZpbGUsIE9fUkRPTkxZKTsKKyAgaWYgKGYgPCAwKQorICAgIGVyciAoIkVycm9yIG9wZW5pbmcgJXM6ICVzXG4iLCBmaWxlLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgaWYgKHJlYWQgKGYsICZmaWxlX2hkciwgc2l6ZW9mIChmaWxlX2hkcikpIDwgMCkKKyAgICBlcnIgKCJFcnJvciByZWFkaW5nIGV4ZWMgc3RydWN0dXJlOiAlc1xuIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgIGlmIChOX0JBRE1BRyAoZmlsZV9oZHIpKQorICAgIGVyciAoIkZpbGUgJXMgbm90IGFuIGEub3V0IGZpbGVcbiIsIGZpbGUpOworCisgIC8qIHJlYWQgaW4gc3ltYm9sIHRhYmxlICovCisgIGlmICgoc3ltYm9sX3RhYmxlID0gKHN0cnVjdCBubGlzdCAqKW1hbGxvYyAoZmlsZV9oZHIuYV9zeW1zKSkgPT0gMCkKKyAgICBlcnIgKCJDb3VsZG4ndCBhbGxvY2F0ZSBzcGFjZSBmb3Igc3ltYm9sIHRhYmxlXG4iKTsKKyAgaWYgKGxzZWVrIChmLCBOX1NZTU9GRiAoZmlsZV9oZHIpLCAwKSA9PSAtMSkKKyAgICBlcnIgKCJsc2VlayBlcnJvcjogJXNcbiIsIHN0cmVycm9yIChlcnJubykpOworICBpZiAocmVhZCAoZiwgc3ltYm9sX3RhYmxlLCBmaWxlX2hkci5hX3N5bXMpID09IC0xKQorICAgIGVyciAoIkVycm9yIHJlYWRpbmcgc3ltYm9sIHRhYmxlIGZyb20gJXM6ICVzXG4iLCBmaWxlLAorCSBzdHJlcnJvciAoZXJybm8pKTsKKworICAvKiByZWFkIGluIHN0cmluZyB0YWJsZSAqLworICBpZiAocmVhZCAoZiwgJnNpemUsIDQpID09IC0xKQorICAgIGVyciAoInJlYWRpbmcgc3RyaW5nIHRhYmxlIHNpemU6ICVzXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgaWYgKChzdHJpbmdzID0gKGNoYXIgKiltYWxsb2MgKHNpemUpKSA9PSAwKQorICAgIGVyciAoIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3Igc3RyaW5nIHRhYmxlXG4iKTsKKyAgaWYgKHJlYWQgKGYsIHN0cmluZ3MsIHNpemUgLSA0KSA9PSAtMSkKKyAgICBlcnIgKCJyZWFkaW5nIHN0cmluZyB0YWJsZTogJXNcbiIsIHN0cmVycm9yIChlcnJubykpOworCisgIC8qIEZpbmQgdGhlIGNvcmUgYWRkcmVzcyBhdCB3aGljaCB0aGUgZmlyc3QgYnl0ZSBvZiBrZGIgdGV4dCBzZWdtZW50CisgICAgIHNob3VsZCBiZSBsb2FkZWQgaW50byBjb3JlIHdoZW4ga2RiIGlzIHJ1bi4gICovCisgIG9yaWdpbiA9IGZpbmRfc3ltYm9sICgiX2V0ZXh0Iiwgc3ltYm9sX3RhYmxlLCBmaWxlX2hkci5hX3N5bXMsIHN0cmluZ3MpCisgICAgLSBmaWxlX2hkci5hX3RleHQ7CisgIC8qIEZpbmQgdGhlIGNvcmUgYWRkcmVzcyBhdCB3aGljaCB0aGUgaGVhcCB3aWxsIGFwcGVhci4gICovCisgIGNvcmVhZGRyID0gZmluZF9zeW1ib2wgKHN5bV9uYW1lLCBzeW1ib2xfdGFibGUsIGZpbGVfaGRyLmFfc3ltcywgc3RyaW5ncyk7CisgIC8qIFJldHVybiBhZGRyZXNzIGluIGZpbGUgb2YgdGhlIGhlYXAgZGF0YSBzcGFjZS4gICovCisgIHJldHVybiAoTl9UWFRPRkYgKGZpbGVfaGRyKSArIGNvcmVfYWRkciAtIG9yaWdpbik7Cit9CisKK2ZpbmRfc3ltYm9sIChzeW1fbmFtZSwgc3ltYm9sX3RhYmxlLCBsZW5ndGgsIHN0cmluZ3MpCisgICAgIGNoYXIgKnN5bV9uYW1lOworICAgICBzdHJ1Y3Qgbmxpc3QgKnN5bWJvbF90YWJsZTsKKyAgICAgaW50IGxlbmd0aDsKKyAgICAgY2hhciAqc3RyaW5nczsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IG5saXN0ICpzeW07CisKKyAgLyogRmluZCBzeW1ib2wgaW4gcXVlc3Rpb24gKi8KKyAgZm9yIChzeW0gPSBzeW1ib2xfdGFibGU7CisgICAgICAgc3ltICE9IChzdHJ1Y3Qgbmxpc3QgKikoKGNoYXIgKilzeW1ib2xfdGFibGUgKyBsZW5ndGgpOworICAgICAgIHN5bSsrKQorICAgICAgeworCWlmICgoc3ltLT5uX3R5cGUgJiBOX1RZUEUpICE9IE5fREFUQSkgY29udGludWU7CisJaWYgKHN5bS0+bl91bi5uX3N0cnggPT0gMCkgY29udGludWU7CisJaWYgKFNUUkVRIChzeW1fbmFtZSwgc3RyaW5ncyArIHN5bS0+bl91bi5uX3N0cnggLSA0KSkKKwkgIHJldHVybiBzeW0tPm5fdmFsdWU7CisgICAgICB9CisgICAgZXJyICgiRGF0YSBzeW1ib2wgJXMgbm90IGZvdW5kIGluICVzXG4iLCBzeW1fbmFtZSwgZmlsZSk7Cit9CisKKy8qIFZBUkFSR1MgKi8KK3ZvaWQKK2VyciAodmFfYWxpc3QpCisgICAgIHZhX2RjbAoreworICB2YV9saXN0IGFyZ3M7CisgIGNoYXIgKnN0cmluZzsKKworICB2YV9zdGFydCAoYXJncyk7CisgIHN0cmluZyA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKKyAgdmZwcmludGYgKGdkYl9zdGRlcnIsIHN0cmluZywgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisgIGV4aXQgKC0xKTsKK30KZGlmZiAtLWdpdCBhL2dkYi9zdW4zLW5hdC5jIGIvZ2RiL3N1bjMtbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmNGE0NAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9zdW4zLW5hdC5jCkBAIC0wLDAgKzEsMTU3IEBACisvKiBIb3N0LWRlcGVuZGVudCBjb2RlIGZvciBTdW4tMyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKworI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KKyNkZWZpbmUgS0VSTkVMCQkvKiBUbyBnZXQgZmxvYXRpbmcgcG9pbnQgcmVnIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bWFjaGluZS9yZWcuaD4KKworc3RhdGljIHZvaWQgZmV0Y2hfY29yZV9yZWdpc3RlcnMgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCwgaW50LCBDT1JFX0FERFIpKTsKKwordm9pZAorZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBzdHJ1Y3QgcmVncyBpbmZlcmlvcl9yZWdpc3RlcnM7CisjaWZkZWYgRlAwX1JFR05VTQorICBzdHJ1Y3QgZnBfc3RhdHVzIGluZmVyaW9yX2ZwX3JlZ2lzdGVyczsKKyNlbmRpZgorICBleHRlcm4gY2hhciByZWdpc3RlcnNbXTsKKworICByZWdpc3RlcnNfZmV0Y2hlZCAoKTsKKyAgCisgIHB0cmFjZSAoUFRSQUNFX0dFVFJFR1MsIGluZmVyaW9yX3BpZCwKKwkgIChQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfcmVnaXN0ZXJzKTsKKyNpZmRlZiBGUDBfUkVHTlVNCisgIHB0cmFjZSAoUFRSQUNFX0dFVEZQUkVHUywgaW5mZXJpb3JfcGlkLAorCSAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9mcF9yZWdpc3RlcnMpOworI2VuZGlmIAorICAKKyAgbWVtY3B5IChyZWdpc3RlcnMsICZpbmZlcmlvcl9yZWdpc3RlcnMsIDE2ICogNCk7CisjaWZkZWYgRlAwX1JFR05VTQorICBtZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLCAmaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLAorCSBzaXplb2YgaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLmZwc19yZWdzKTsKKyNlbmRpZiAKKyAgKihpbnQgKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKFBTX1JFR05VTSldID0gaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcHM7CisgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQQ19SRUdOVU0pXSA9IGluZmVyaW9yX3JlZ2lzdGVycy5yX3BjOworI2lmZGVmIEZQMF9SRUdOVU0KKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQQ19SRUdOVU0pXSwKKwkgJmluZmVyaW9yX2ZwX3JlZ2lzdGVycy5mcHNfY29udHJvbCwKKwkgc2l6ZW9mIGluZmVyaW9yX2ZwX3JlZ2lzdGVycyAtIHNpemVvZiBpbmZlcmlvcl9mcF9yZWdpc3RlcnMuZnBzX3JlZ3MpOworI2VuZGlmIAorfQorCisvKiBTdG9yZSBvdXIgcmVnaXN0ZXIgdmFsdWVzIGJhY2sgaW50byB0aGUgaW5mZXJpb3IuCisgICBJZiBSRUdOTyBpcyAtMSwgZG8gdGhpcyBmb3IgYWxsIHJlZ2lzdGVycy4KKyAgIE90aGVyd2lzZSwgUkVHTk8gc3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVyIChzbyB3ZSBjYW4gc2F2ZSB0aW1lKS4gICovCisKK3ZvaWQKK3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgc3RydWN0IHJlZ3MgaW5mZXJpb3JfcmVnaXN0ZXJzOworI2lmZGVmIEZQMF9SRUdOVU0KKyAgc3RydWN0IGZwX3N0YXR1cyBpbmZlcmlvcl9mcF9yZWdpc3RlcnM7CisjZW5kaWYKKyAgZXh0ZXJuIGNoYXIgcmVnaXN0ZXJzW107CisKKyAgbWVtY3B5ICgmaW5mZXJpb3JfcmVnaXN0ZXJzLCByZWdpc3RlcnMsIDE2ICogNCk7CisjaWZkZWYgRlAwX1JFR05VTQorICBtZW1jcHkgKCZpbmZlcmlvcl9mcF9yZWdpc3RlcnMsICZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLAorCSBzaXplb2YgaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLmZwc19yZWdzKTsKKyNlbmRpZgorICBpbmZlcmlvcl9yZWdpc3RlcnMucl9wcyA9ICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChQU19SRUdOVU0pXTsKKyAgaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcGMgPSAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoUENfUkVHTlVNKV07CisKKyNpZmRlZiBGUDBfUkVHTlVNCisgIG1lbWNweSAoJmluZmVyaW9yX2ZwX3JlZ2lzdGVycy5mcHNfY29udHJvbCwKKwkgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUENfUkVHTlVNKV0sCisJIHNpemVvZiBpbmZlcmlvcl9mcF9yZWdpc3RlcnMgLSBzaXplb2YgaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLmZwc19yZWdzKTsKKyNlbmRpZgorCisgIHB0cmFjZSAoUFRSQUNFX1NFVFJFR1MsIGluZmVyaW9yX3BpZCwKKwkgIChQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfcmVnaXN0ZXJzKTsKKyNpZiBGUDBfUkVHTlVNCisgIHB0cmFjZSAoUFRSQUNFX1NFVEZQUkVHUywgaW5mZXJpb3JfcGlkLAorCSAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9mcF9yZWdpc3RlcnMpOworI2VuZGlmCit9CisKKworLyogQWxsIG9mIHRoaXMgc3R1ZmYgaXMgb25seSByZWxldmFudCBpZiBib3RoIGhvc3QgYW5kIHRhcmdldCBhcmUgc3VuMy4gICovCisvKiBNYWNoaW5lLWRlcGVuZGVudCBjb2RlIGZvciBwdWxsaW5nIHJlZ2lzdGVycyBvdXQgb2YgYSBTdW4tMyBjb3JlIGZpbGUuICovCisKK3N0YXRpYyB2b2lkCitmZXRjaF9jb3JlX3JlZ2lzdGVycyAoY29yZV9yZWdfc2VjdCwgY29yZV9yZWdfc2l6ZSwgd2hpY2gsIHJlZ19hZGRyKQorICAgICBjaGFyICpjb3JlX3JlZ19zZWN0OworICAgICB1bnNpZ25lZCBjb3JlX3JlZ19zaXplOworICAgICBpbnQgd2hpY2g7CisgICAgIENPUkVfQUREUiByZWdfYWRkcjsJLyogVW51c2VkIGluIHRoaXMgdmVyc2lvbiAqLworeworICBleHRlcm4gY2hhciByZWdpc3RlcnNbXTsKKyAgc3RydWN0IHJlZ3MgKnJlZ3MgPSAoc3RydWN0IHJlZ3MgKikgY29yZV9yZWdfc2VjdDsKKworICBpZiAod2hpY2ggPT0gMCkgeworICAgIGlmIChjb3JlX3JlZ19zaXplIDwgc2l6ZW9mIChzdHJ1Y3QgcmVncykpCisgICAgICBlcnJvciAoIkNhbid0IGZpbmQgcmVnaXN0ZXJzIGluIGNvcmUgZmlsZSIpOworCisgICAgbWVtY3B5IChyZWdpc3RlcnMsIChjaGFyICopcmVncywgMTYgKiA0KTsKKyAgICBzdXBwbHlfcmVnaXN0ZXIgKFBTX1JFR05VTSwgKGNoYXIgKikmcmVncy0+cl9wcyk7CisgICAgc3VwcGx5X3JlZ2lzdGVyIChQQ19SRUdOVU0sIChjaGFyICopJnJlZ3MtPnJfcGMpOworCisgIH0gZWxzZSBpZiAod2hpY2ggPT0gMikgeworCisjZGVmaW5lIGZwdXN0cnVjdCAgKChzdHJ1Y3QgZnB1ICopIGNvcmVfcmVnX3NlY3QpCisKKyAgICBpZiAoY29yZV9yZWdfc2l6ZSA+PSBzaXplb2YgKHN0cnVjdCBmcHUpKQorICAgICAgeworI2lmZGVmIEZQMF9SRUdOVU0KKwltZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlAwX1JFR05VTSldLAorCSAgICAgIGZwdXN0cnVjdC0+Zl9mcHN0YXR1cy5mcHNfcmVncywKKwkgICAgICBzaXplb2YgZnB1c3RydWN0LT5mX2Zwc3RhdHVzLmZwc19yZWdzKTsKKwltZW1jcHkgKCZyZWdpc3RlcnNbUkVHSVNURVJfQllURSAoRlBDX1JFR05VTSldLAorCSAgICAgICZmcHVzdHJ1Y3QtPmZfZnBzdGF0dXMuZnBzX2NvbnRyb2wsCisJICAgICAgc2l6ZW9mIGZwdXN0cnVjdC0+Zl9mcHN0YXR1cyAtIAorCQlzaXplb2YgZnB1c3RydWN0LT5mX2Zwc3RhdHVzLmZwc19yZWdzKTsKKyNlbmRpZgorICAgICAgfQorICAgIGVsc2UKKyAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIkNvdWxkbid0IHJlYWQgZmxvYXQgcmVncyBmcm9tIGNvcmUgZmlsZVxuIik7CisgIH0KK30KKworDAorLyogUmVnaXN0ZXIgdGhhdCB3ZSBhcmUgYWJsZSB0byBoYW5kbGUgc3VuMyBjb3JlIGZpbGUgZm9ybWF0cy4KKyAgIEZJWE1FOiBpcyB0aGlzIHJlYWxseSBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91cj8gKi8KKworc3RhdGljIHN0cnVjdCBjb3JlX2ZucyBzdW4zX2NvcmVfZm5zID0KK3sKKyAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCisgIGZldGNoX2NvcmVfcmVnaXN0ZXJzLAorICBOVUxMCit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9jb3JlX3N1bjMgKCkKK3sKKyAgYWRkX2NvcmVfZm5zICgmc3VuM19jb3JlX2Zucyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvc3VuMzg2LW5hdC5jIGIvZ2RiL3N1bjM4Ni1uYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWJiNGJiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3N1bjM4Ni1uYXQuYwpAQCAtMCwwICsxLDI1OCBAQAorLyogTmF0aXZlIHN1cHBvcnQgZm9yIFN1biAzODZpJ3MgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAoQykgMTk4NiwgMTk4NywgMTk4OSwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENoYW5nZXMgZm9yIHN1bjM4NmkgYnkgSmVhbiBEYW5pZWwgRmVrZXRlIChqZGZAbGl0cC51bml2LXA2LTcuZnIpLAorICAgQzJWIFBhcmlzLCBBcHJpbCA4OS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSA8c3lzL3VzZXIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorI2luY2x1ZGUgPG1hY2hpbmUvcmVnLmg+CisKKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgImdkYl9zdGF0LmgiCisjaW5jbHVkZSA8c3lzL2NvcmUuaD4KKworDAorLyogTWFjaGluZS1kZXBlbmRlbnQgY29kZSB3aGljaCB3b3VsZCBvdGhlcndpc2UgYmUgaW4gY29yZWZpbGUuYyAqLworLyogV29yayB3aXRoIGNvcmUgZmlsZXMsIGZvciBHREIuICovCisKKwwKK3ZvaWQKK2NvcmVfZmlsZV9jb21tYW5kIChmaWxlbmFtZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmZpbGVuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGludCB2YWw7CisgIGV4dGVybiBjaGFyIHJlZ2lzdGVyc1tdOworCisgIC8qIERpc2NhcmQgYWxsIHZlc3RpZ2VzIG9mIGFueSBwcmV2aW91cyBjb3JlIGZpbGUKKyAgICAgYW5kIG1hcmsgZGF0YSBhbmQgc3RhY2sgc3BhY2VzIGFzIGVtcHR5LiAgKi8KKworICBpZiAoY29yZWZpbGUpCisgICAgZnJlZSAoY29yZWZpbGUpOworICBjb3JlZmlsZSA9IDA7CisKKyAgaWYgKGNvcmVjaGFuID49IDApCisgICAgY2xvc2UgKGNvcmVjaGFuKTsKKyAgY29yZWNoYW4gPSAtMTsKKworICBkYXRhX3N0YXJ0ID0gMDsKKyAgZGF0YV9lbmQgPSAwOworICBzdGFja19zdGFydCA9IFNUQUNLX0VORF9BRERSOworICBzdGFja19lbmQgPSBTVEFDS19FTkRfQUREUjsKKworICAvKiBOb3csIGlmIGEgbmV3IGNvcmUgZmlsZSB3YXMgc3BlY2lmaWVkLCBvcGVuIGl0IGFuZCBkaWdlc3QgaXQuICAqLworCisgIGlmIChmaWxlbmFtZSkKKyAgICB7CisgICAgICBmaWxlbmFtZSA9IHRpbGRlX2V4cGFuZCAoZmlsZW5hbWUpOworICAgICAgbWFrZV9jbGVhbnVwIChmcmVlLCBmaWxlbmFtZSk7CisgICAgICAKKyAgICAgIGlmIChoYXZlX2luZmVyaW9yX3AgKCkpCisJZXJyb3IgKCJUbyBsb29rIGF0IGEgY29yZSBmaWxlLCB5b3UgbXVzdCBraWxsIHRoZSBwcm9ncmFtIHdpdGggXCJraWxsXCIuIik7CisgICAgICBjb3JlY2hhbiA9IG9wZW4gKGZpbGVuYW1lLCBPX1JET05MWSwgMCk7CisgICAgICBpZiAoY29yZWNoYW4gPCAwKQorCXBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKKworICAgICAgeworCXN0cnVjdCBjb3JlIGNvcmVzdHI7CisKKwl2YWwgPSBteXJlYWQgKGNvcmVjaGFuLCAmY29yZXN0ciwgc2l6ZW9mIGNvcmVzdHIpOworCWlmICh2YWwgPCAwKQorCSAgcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworCWlmIChjb3Jlc3RyLmNfbWFnaWMgIT0gQ09SRV9NQUdJQykKKwkgIGVycm9yICgiXCIlc1wiIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIGNvcmUgZHVtcCBmaWxlIChtYWdpYyAweCV4LCBleHBlY3RlZCAweCV4KSIsCisJCSBmaWxlbmFtZSwgY29yZXN0ci5jX21hZ2ljLCAoaW50KSBDT1JFX01BR0lDKTsKKwllbHNlIGlmIChzaXplb2YgKHN0cnVjdCBjb3JlKSAhPSBjb3Jlc3RyLmNfbGVuKQorCSAgZXJyb3IgKCJcIiVzXCIgaGFzIGFuIGludmFsaWQgc3RydWN0IGNvcmUgbGVuZ3RoICglZCwgZXhwZWN0ZWQgJWQpIiwKKwkJIGZpbGVuYW1lLCBjb3Jlc3RyLmNfbGVuLCAoaW50KSBzaXplb2YgKHN0cnVjdCBjb3JlKSk7CisKKwlkYXRhX3N0YXJ0ID0gZXhlY19kYXRhX3N0YXJ0OworCWRhdGFfZW5kID0gZGF0YV9zdGFydCArIGNvcmVzdHIuY19kc2l6ZTsKKwlzdGFja19zdGFydCA9IHN0YWNrX2VuZCAtIGNvcmVzdHIuY19zc2l6ZTsKKwlkYXRhX29mZnNldCA9IHNpemVvZiBjb3Jlc3RyOworCXN0YWNrX29mZnNldCA9IHNpemVvZiBjb3Jlc3RyICsgY29yZXN0ci5jX2RzaXplOworCisJbWVtY3B5IChyZWdpc3RlcnMsICZjb3Jlc3RyLmNfcmVncywgc2l6ZW9mIGNvcmVzdHIuY19yZWdzKTsKKworCW1lbWNweSAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUDBfUkVHTlVNKV0sCisJICAgICAgIGNvcmVzdHIuY19mcHUuZl9mcHN0YXR1cy5mX3N0LAorCSAgICAgICBzaXplb2YgY29yZXN0ci5jX2ZwdS5mX2Zwc3RhdHVzLmZfc3QpOworCW1lbWNweSAoJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUENfUkVHTlVNKV0sCisJICAgICAgICZjb3Jlc3RyLmNfZnB1LmZfZnBzdGF0dXMuZl9jdHJsLAorCSAgICAgICBzaXplb2YgY29yZXN0ci5jX2ZwdS5mX2Zwc3RhdHVzIC0KKwkgICAgICAgc2l6ZW9mIGNvcmVzdHIuY19mcHUuZl9mcHN0YXR1cy5mX3N0KTsKKworCS8qIHRoZSBzdHJ1Y3QgYW91dGhkciBvZiBzdW4gY29mZiBpcyBub3QgdGhlIHN0cnVjdCBleGVjIHN0b3JlZAorCSAgIGluIHRoZSBjb3JlIGZpbGUuICovCisJbWVtY3B5ICgmY29yZV9hb3V0aGRyLCAmY29yZXN0ci5jX2FvdXRoZHIsIHNpemVvZiAoc3RydWN0IGV4ZWMpKTsKKyNpZm5kZWYgQ09GRl9FTkNBUFNVTEFURQorCWNvcmVfYW91dGhkci5tYWdpYyA9IGNvcmVzdHIuY19hb3V0aGRyLmFfaW5mbzsKKwljb3JlX2FvdXRoZHIudnN0YW1wID0gLypTVU5WRVJTSU9OKi8gMzEyNTI7CisjZW5kaWYKKwlwcmludGZfdW5maWx0ZXJlZCAoIkNvcmUgZmlsZSBpcyBmcm9tIFwiJXNcIi5cbiIsIGNvcmVzdHIuY19jbWRuYW1lKTsKKwlpZiAoY29yZXN0ci5jX3NpZ25vID4gMCkKKwkgIHByaW50Zl91bmZpbHRlcmVkICgiUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggc2lnbmFsICVkLCAlcy5cbiIsCisJCSAgY29yZXN0ci5jX3NpZ25vLCBzYWZlX3N0cnNpZ25hbCAoY29yZXN0ci5jX3NpZ25vKSk7CisgICAgICB9CisgICAgICBpZiAoZmlsZW5hbWVbMF0gPT0gJy8nKQorCWNvcmVmaWxlID0gc2F2ZXN0cmluZyAoZmlsZW5hbWUsIHN0cmxlbiAoZmlsZW5hbWUpKTsKKyAgICAgIGVsc2UKKwl7CisJICBjb3JlZmlsZSA9IGNvbmNhdCAoY3VycmVudF9kaXJlY3RvcnksICIvIiwgZmlsZW5hbWUsIE5VTEwpOworCX0KKworICAgICAgZmx1c2hfY2FjaGVkX2ZyYW1lcyAoKTsKKyAgICAgIHNlbGVjdF9mcmFtZSAoZ2V0X2N1cnJlbnRfZnJhbWUgKCksIDApOworCisgICAgICB2YWxpZGF0ZV9maWxlcyAoKTsKKyAgICB9CisgIGVsc2UgaWYgKGZyb21fdHR5KQorICAgIHByaW50Zl91bmZpbHRlcmVkICgiTm8gY29yZSBmaWxlIG5vdy5cbiIpOworfQorCitpMzg3X3RvX2RvdWJsZSAoZnJvbSwgdG8pCisgICAgIGNoYXIgKmZyb207CisgICAgIGNoYXIgKnRvOworeworICBsb25nICpscDsKKyAgLyogcHVzaCBleHRlbmRlZCBtb2RlIG9uIDM4NyBzdGFjaywgdGhlbiBwb3AgaW4gZG91YmxlIG1vZGUKKyAgICoKKyAgICogZmlyc3QsIHNldCBleGNlcHRpb24gbWFza3Mgc28gbm8gZXJyb3IgaXMgZ2VuZXJhdGVkIC0KKyAgICogbnVtYmVyIHdpbGwgYmUgcm91bmRlZCB0byBpbmYgb3IgMCwgaWYgbmVjZXNzYXJ5IAorICAgKi8KKyAgYXNtICgicHVzaGwgJWVheCIpOyAJCS8qIGdyYWIgYSBzdGFjayBzbG90ICovCisgIGFzbSAoImZzdGN3ICglZXNwKSIpOwkJLyogZ2V0IDM4NyBjb250cm9sIHdvcmQgKi8KKyAgYXNtICgibW92bCAoJWVzcCksJWVheCIpOwkvKiBzYXZlIG9sZCB2YWx1ZSAqLworICBhc20gKCJvcmwgJDB4M2YsJWVheCIpOwkJLyogbWFzayBhbGwgZXhjZXB0aW9ucyAqLworICBhc20gKCJwdXNobCAlZWF4Iik7CisgIGFzbSAoImZsZGN3ICglZXNwKSIpOwkJLyogbG9hZCBuZXcgdmFsdWUgaW50byAzODcgKi8KKyAgCisgIGFzbSAoIm1vdmwgOCglZWJwKSwlZWF4Iik7CisgIGFzbSAoImZsZHQgKCVlYXgpIik7CQkvKiBwdXNoIGV4dGVuZGVkIG51bWJlciBvbiAzODcgc3RhY2sgKi8KKyAgYXNtICgiZndhaXQiKTsKKyAgYXNtICgibW92bCAxMiglZWJwKSwlZWF4Iik7CisgIGFzbSAoImZzdHBsICglZWF4KSIpOwkJLyogcG9wIGRvdWJsZSAqLworICBhc20gKCJmd2FpdCIpOworICAKKyAgYXNtICgicG9wbCAlZWF4Iik7CQkvKiBmbHVzaCBtb2RpZmllZCBjb250cm9sIHdvcmQgKi8KKyAgYXNtICgiZm5jbGV4Iik7CQkJLyogY2xlYXIgZXhjZXB0aW9ucyAqLworICBhc20gKCJmbGRjdyAoJWVzcCkiKTsJCS8qIHJlc3RvcmUgb3JpZ2luYWwgY29udHJvbCB3b3JkICovCisgIGFzbSAoInBvcGwgJWVheCIpOwkJLyogZmx1c2ggc2F2ZWQgY29weSAqLworfQorCitkb3VibGVfdG9faTM4NyAoZnJvbSwgdG8pCisgICAgIGNoYXIgKmZyb207CisgICAgIGNoYXIgKnRvOworeworICAvKiBwdXNoIGRvdWJsZSBtb2RlIG9uIDM4NyBzdGFjaywgdGhlbiBwb3AgaW4gZXh0ZW5kZWQgbW9kZQorICAgKiBubyBlcnJvcnMgYXJlIHBvc3NpYmxlIGJlY2F1c2UgZXZlcnkgNjQtYml0IHBhdHRlcm4KKyAgICogY2FuIGJlIGNvbnZlcnRlZCB0byBhbiBleHRlbmRlZAorICAgKi8KKyAgYXNtICgibW92bCA4KCVlYnApLCVlYXgiKTsKKyAgYXNtICgiZmxkbCAoJWVheCkiKTsKKyAgYXNtICgiZndhaXQiKTsKKyAgYXNtICgibW92bCAxMiglZWJwKSwlZWF4Iik7CisgIGFzbSAoImZzdHB0ICglZWF4KSIpOworICBhc20gKCJmd2FpdCIpOworfQorCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHN0cnVjdCByZWdzIGluZmVyaW9yX3JlZ2lzdGVyczsKKyAgc3RydWN0IGZwX3N0YXRlIGluZmVyaW9yX2ZwX3JlZ2lzdGVyczsKKyAgZXh0ZXJuIGNoYXIgcmVnaXN0ZXJzW107CisKKyAgcmVnaXN0ZXJzX2ZldGNoZWQgKCk7CisKKyAgcHRyYWNlIChQVFJBQ0VfR0VUUkVHUywgaW5mZXJpb3JfcGlkLAorCSAgKFBUUkFDRV9BUkczX1RZUEUpICZpbmZlcmlvcl9yZWdpc3RlcnMpOworICBwdHJhY2UgKFBUUkFDRV9HRVRGUFJFR1MsIGluZmVyaW9yX3BpZCwKKwkgIChQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfZnBfcmVnaXN0ZXJzKTsKKworICBtZW1jcHkgKHJlZ2lzdGVycywgJmluZmVyaW9yX3JlZ2lzdGVycywgc2l6ZW9mIGluZmVyaW9yX3JlZ2lzdGVycyk7CisKKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pXSxpbmZlcmlvcl9mcF9yZWdpc3RlcnMuZl9zdCwKKwkgc2l6ZW9mIGluZmVyaW9yX2ZwX3JlZ2lzdGVycy5mX3N0KTsKKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQQ19SRUdOVU0pXSwKKwkgJmluZmVyaW9yX2ZwX3JlZ2lzdGVycy5mX2N0cmwsCisJIHNpemVvZiBpbmZlcmlvcl9mcF9yZWdpc3RlcnMgLSBzaXplb2YgaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLmZfc3QpOworfQorCisvKiBTdG9yZSBvdXIgcmVnaXN0ZXIgdmFsdWVzIGJhY2sgaW50byB0aGUgaW5mZXJpb3IuCisgICBJZiBSRUdOTyBpcyAtMSwgZG8gdGhpcyBmb3IgYWxsIHJlZ2lzdGVycy4KKyAgIE90aGVyd2lzZSwgUkVHTk8gc3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVyIChzbyB3ZSBjYW4gc2F2ZSB0aW1lKS4gICovCisKK3ZvaWQKK3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgc3RydWN0IHJlZ3MgaW5mZXJpb3JfcmVnaXN0ZXJzOworICBzdHJ1Y3QgZnBfc3RhdGUgaW5mZXJpb3JfZnBfcmVnaXN0ZXJzOworICBleHRlcm4gY2hhciByZWdpc3RlcnNbXTsKKworICBtZW1jcHkgKCZpbmZlcmlvcl9yZWdpc3RlcnMsIHJlZ2lzdGVycywgMjAgKiA0KTsKKworICBtZW1jcHkgKGluZmVyaW9yX2ZwX3JlZ2lzdGVycy5mX3N0LAorCSAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUgKEZQMF9SRUdOVU0pXSwKKwkgc2l6ZW9mIGluZmVyaW9yX2ZwX3JlZ2lzdGVycy5mX3N0KTsKKyAgbWVtY3B5ICgmaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLmZfY3RybCwKKwkgJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFIChGUENfUkVHTlVNKV0sCisJIHNpemVvZiBpbmZlcmlvcl9mcF9yZWdpc3RlcnMgLSBzaXplb2YgaW5mZXJpb3JfZnBfcmVnaXN0ZXJzLmZfc3QpOworICAKKyNpZmRlZiBQVFJBQ0VfRlBfQlVHCisgIGlmIChyZWdubyA9PSBGUF9SRUdOVU0gfHwgcmVnbm8gPT0gLTEpCisgICAgLyogU3RvcmluZyB0aGUgZnJhbWUgcG9pbnRlciByZXF1aXJlcyBhIGdyb3NzIGhhY2ssIGluIHdoaWNoIGFuCisgICAgICAgaW5zdHJ1Y3Rpb24gdGhhdCBtb3ZlcyBlYXggaW50byBlYnAgZ2V0cyBzaW5nbGUtc3RlcHBlZC4gICovCisgICAgeworICAgICAgaW50IHN0YWNrID0gaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcmVnW1NQX1JFR05VTV07CisgICAgICBpbnQgc3R1ZmYgPSBwdHJhY2UgKFBUUkFDRV9QRUVLREFUQSwgaW5mZXJpb3JfcGlkLAorCQkJICAoUFRSQUNFX0FSRzNfVFlQRSkgc3RhY2spOworICAgICAgaW50IHJlZyA9IGluZmVyaW9yX3JlZ2lzdGVycy5yX3JlZ1tFQVhdOworICAgICAgaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcmVnW0VBWF0gPQorCWluZmVyaW9yX3JlZ2lzdGVycy5yX3JlZ1tGUF9SRUdOVU1dOworICAgICAgcHRyYWNlIChQVFJBQ0VfU0VUUkVHUywgaW5mZXJpb3JfcGlkLCAKKwkgICAgICAoUFRSQUNFX0FSRzNfVFlQRSkgJmluZmVyaW9yX3JlZ2lzdGVycyk7CisgICAgICBwdHJhY2UgKFBUUkFDRV9QT0tFREFUQSwgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgc3RhY2ssCisJICAgICAgMHhjNTg5KTsKKyAgICAgIHB0cmFjZSAoUFRSQUNFX1NJTkdMRVNURVAsIGluZmVyaW9yX3BpZCwgKFBUUkFDRV9BUkczX1RZUEUpIHN0YWNrLAorCSAgICAgIDApOworICAgICAgd2FpdCAoMCk7CisgICAgICBwdHJhY2UgKFBUUkFDRV9QT0tFREFUQSwgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgc3RhY2ssCisJICAgICAgc3R1ZmYpOworICAgICAgaW5mZXJpb3JfcmVnaXN0ZXJzLnJfcmVnW0VBWF0gPSByZWc7CisgICAgfQorI2VuZGlmCisgIHB0cmFjZSAoUFRSQUNFX1NFVFJFR1MsIGluZmVyaW9yX3BpZCwKKwkgIChQVFJBQ0VfQVJHM19UWVBFKSAmaW5mZXJpb3JfcmVnaXN0ZXJzKTsKKyAgcHRyYWNlIChQVFJBQ0VfU0VURlBSRUdTLCBpbmZlcmlvcl9waWQsCisJICAoUFRSQUNFX0FSRzNfVFlQRSkgJmluZmVyaW9yX2ZwX3JlZ2lzdGVycyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvc3ltZmlsZS5jIGIvZ2RiL3N5bWZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTYwYzkzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3N5bWZpbGUuYwpAQCAtMCwwICsxLDMwMjEgQEAKKy8qIEdlbmVyaWMgc3ltYm9sIGZpbGUgcmVhZGluZyBmb3IgdGhlIEdOVSBkZWJ1Z2dlciwgR0RCLgorICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQsIHVzaW5nIHBpZWNlcyBmcm9tIG90aGVyIEdEQiBtb2R1bGVzLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIKKyNpbmNsdWRlICJvYmpmaWxlcy5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgImJyZWFrcG9pbnQuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1ZGUgImNvbXBsYWludHMuaCIKKyNpbmNsdWRlICJkZW1hbmdsZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiIC8qIGZvciB3cml0ZV9wYyAqLworI2luY2x1ZGUgImdkYi1zdGFicy5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImdkYl9zdGF0LmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZm5kZWYgT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkgMAorI2VuZGlmCisKKyNpZmRlZiBIUFVYSFBQQQorCisvKiBTb21lIEhQLVVYIHJlbGF0ZWQgZ2xvYmFscyB0byBjbGVhciB3aGVuIGEgbmV3ICJtYWluIgorICAgc3ltYm9sIGZpbGUgaXMgbG9hZGVkLiBIUC1zcGVjaWZpYy4gICovCisKK2V4dGVybiBpbnQgaHBfc29tX3NvbV9vYmplY3RfcHJlc2VudDsKK2V4dGVybiBpbnQgaHBfY3h4X2V4Y2VwdGlvbl9zdXBwb3J0X2luaXRpYWxpemVkOworI2RlZmluZSBSRVNFVF9IUF9VWF9HTE9CQUxTKCkgZG8ge1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwX3NvbV9zb21fb2JqZWN0X3ByZXNlbnQgPSAwOyAgICAgICAgICAgICAvKiBpbmRpY2F0ZXMgSFAtY29tcGlsZWQgY29kZSAqLyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHBfY3h4X2V4Y2VwdGlvbl9zdXBwb3J0X2luaXRpYWxpemVkID0gMDsgIC8qIG11c3QgcmVpbml0aWFsaXplIGV4Y2VwdGlvbiBzdHVmZiAqLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgwKQorI2VuZGlmCisKK2ludCAoKnVpX2xvYWRfcHJvZ3Jlc3NfaG9vaykgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Cit2b2lkICgqcHJlX2FkZF9zeW1ib2xfaG9vaykgUEFSQU1TICgoY2hhciAqKSk7Cit2b2lkICgqcG9zdF9hZGRfc3ltYm9sX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKKworLyogR2xvYmFsIHZhcmlhYmxlcyBvd25lZCBieSB0aGlzIGZpbGUgKi8KK2ludCByZWFkbm93X3N5bWJvbF9maWxlczsJCS8qIFJlYWQgZnVsbCBzeW1ib2xzIGltbWVkaWF0ZWx5ICovCisKK3N0cnVjdCBjb21wbGFpbnQgb2xkc3ltc19jb21wbGFpbnQgPSB7CisgICJSZXBsYWNpbmcgb2xkIHN5bWJvbHMgZm9yIGAlcyciLCAwLCAwCit9OworCitzdHJ1Y3QgY29tcGxhaW50IGVtcHR5X3N5bXRhYl9jb21wbGFpbnQgPSB7CisgICJFbXB0eSBzeW1ib2wgdGFibGUgZm91bmQgZm9yIGAlcyciLCAwLCAwCit9OworCisvKiBFeHRlcm5hbCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyByZWZlcmVuY2VkLiAqLworCitleHRlcm4gaW50IGluZm9fdmVyYm9zZTsKKworZXh0ZXJuIHZvaWQgcmVwb3J0X3RyYW5zZmVyX3BlcmZvcm1hbmNlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsCisJCQkJCQkgdGltZV90LCB0aW1lX3QpKTsKKworLyogRnVuY3Rpb25zIHRoaXMgZmlsZSBkZWZpbmVzICovCisKKyNpZiAwCitzdGF0aWMgaW50IHNpbXBsZV9yZWFkX292ZXJsYXlfcmVnaW9uX3RhYmxlIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHNpbXBsZV9mcmVlX292ZXJsYXlfcmVnaW9uX3RhYmxlIFBBUkFNUyAoKHZvaWQpKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzZXRfaW5pdGlhbF9sYW5ndWFnZSBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIGxvYWRfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBhZGRfc3ltYm9sX2ZpbGVfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBhZGRfc2hhcmVkX3N5bWJvbF9maWxlc19jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGNhc2hpZXJfcHN5bXRhYiBQQVJBTVMgKChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworCitzdGF0aWMgaW50IGNvbXBhcmVfcHN5bWJvbHMgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKKworc3RhdGljIGludCBjb21wYXJlX3N5bWJvbHMgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKKworYmZkICpzeW1maWxlX2JmZF9vcGVuIFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgdm9pZCBmaW5kX3N5bV9mbnMgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZCBkZWNyZW1lbnRfcmVhZGluZ19zeW10YWIgUEFSQU1TICgodm9pZCAqKSk7CisKK3N0YXRpYyB2b2lkIG92ZXJsYXlfaW52YWxpZGF0ZV9hbGwgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgaW50IG92ZXJsYXlfaXNfbWFwcGVkIFBBUkFNUyAoKHN0cnVjdCBvYmpfc2VjdGlvbiAqKSk7CisKK3ZvaWQgbGlzdF9vdmVybGF5c19jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3ZvaWQgbWFwX292ZXJsYXlfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCit2b2lkIHVubWFwX292ZXJsYXlfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBvdmVybGF5X2F1dG9fY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBvdmVybGF5X21hbnVhbF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIG92ZXJsYXlfb2ZmX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgb3ZlcmxheV9sb2FkX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgb3ZlcmxheV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHNpbXBsZV9mcmVlX292ZXJsYXlfdGFibGUgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZCByZWFkX3RhcmdldF9sb25nX2FycmF5IFBBUkFNUyAoKENPUkVfQUREUiwgdW5zaWduZWQgaW50ICosIGludCkpOworCitzdGF0aWMgaW50IHNpbXBsZV9yZWFkX292ZXJsYXlfdGFibGUgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgaW50IHNpbXBsZV9vdmVybGF5X3VwZGF0ZV8xIFBBUkFNUyAoKHN0cnVjdCBvYmpfc2VjdGlvbiAqKSk7CisKK3ZvaWQgX2luaXRpYWxpemVfc3ltZmlsZSBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIExpc3Qgb2YgYWxsIGF2YWlsYWJsZSBzeW1fZm5zLiAgT24gZ2RiIHN0YXJ0dXAsIGVhY2ggb2JqZWN0IGZpbGUgcmVhZGVyCisgICBjYWxscyBhZGRfc3ltdGFiX2ZucygpIHRvIHJlZ2lzdGVyIGluZm9ybWF0aW9uIG9uIGVhY2ggZm9ybWF0IGl0IGlzCisgICBwcmVwYXJlZCB0byByZWFkLiAqLworCitzdGF0aWMgc3RydWN0IHN5bV9mbnMgKnN5bXRhYl9mbnMgPSBOVUxMOworCisvKiBGbGFnIGZvciB3aGV0aGVyIHVzZXIgd2lsbCBiZSByZWxvYWRpbmcgc3ltYm9scyBtdWx0aXBsZSB0aW1lcy4KKyAgIERlZmF1bHRzIHRvIE9OIGZvciBWeFdvcmtzLCBvdGhlcndpc2UgT0ZGLiAgKi8KKworI2lmZGVmIFNZTUJPTF9SRUxPQURJTkdfREVGQVVMVAoraW50IHN5bWJvbF9yZWxvYWRpbmcgPSBTWU1CT0xfUkVMT0FESU5HX0RFRkFVTFQ7CisjZWxzZQoraW50IHN5bWJvbF9yZWxvYWRpbmcgPSAwOworI2VuZGlmCisKKy8qIElmIG5vbi16ZXJvLCB0aGVuIG9uIEhQLVVYIChpLmUuLCBwbGF0Zm9ybXMgdGhhdCB1c2Ugc29tc29saWIuYyksCisgICB0aGlzIHZhcmlhYmxlIGlzIGludGVycHJldGVkIGFzIGEgdGhyZXNoaG9sZC4gIElmIGFkZGluZyBhIG5ldworICAgbGlicmFyeSdzIHN5bWJvbCB0YWJsZSB0byB0aG9zZSBhbHJlYWR5IGtub3duIHRvIHRoZSBkZWJ1Z2dlciB3b3VsZAorICAgZXhjZWVkIHRoaXMgdGhyZXNoaG9sZCwgdGhlbiB0aGUgc2hsaWIncyBzeW1ib2xzIGFyZSBub3QgYWRkZWQuCisKKyAgIElmIG5vbi16ZXJvIG9uIG90aGVyIHBsYXRmb3Jtcywgc2hhcmVkIGxpYnJhcnkgc3ltYm9scyB3aWxsIGJlIGFkZGVkCisgICBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGluZmVyaW9yIGlzIGNyZWF0ZWQsIG5ldyBsaWJyYXJpZXMgYXJlIGxvYWRlZCwKKyAgIG9yIHdoZW4gYXR0YWNoaW5nIHRvIHRoZSBpbmZlcmlvci4gIFRoaXMgaXMgYWxtb3N0IGFsd2F5cyB3aGF0IHVzZXJzCisgICB3aWxsIHdhbnQgdG8gaGF2ZSBoYXBwZW47IGJ1dCBmb3IgdmVyeSBsYXJnZSBwcm9ncmFtcywgdGhlIHN0YXJ0dXAKKyAgIHRpbWUgd2lsbCBiZSBleGNlc3NpdmUsIGFuZCBzbyBpZiB0aGlzIGlzIGEgcHJvYmxlbSwgdGhlIHVzZXIgY2FuCisgICBjbGVhciB0aGlzIGZsYWcgYW5kIHRoZW4gYWRkIHRoZSBzaGFyZWQgbGlicmFyeSBzeW1ib2xzIGFzIG5lZWRlZC4KKyAgIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHBvdGVudGlhbCBmb3IgY29uZnVzaW9uLCBzaW5jZSBpZiB0aGUgc2hhcmVkCisgICBsaWJyYXJ5IHN5bWJvbHMgYXJlIG5vdCBsb2FkZWQsIGNvbW1hbmRzIGxpa2UgImluZm8gZnVuIiB3aWxsICpub3QqCisgICByZXBvcnQgYWxsIHRoZSBmdW5jdGlvbnMgdGhhdCBhcmUgYWN0dWFsbHkgcHJlc2VudC4gCisKKyAgIE5vdGUgdGhhdCBIUC1VWCBpbnRlcnByZXRzIHRoaXMgdmFyaWFibGUgdG8gbWVhbiwgInRocmVzaGhvbGQgc2l6ZQorICAgaW4gbWVnYWJ5dGVzLCB3aGVyZSB6ZXJvIG1lYW5zIG5ldmVyIGFkZCIuICBPdGhlciBwbGF0Zm9ybXMgaW50ZXJwcmV0CisgICB0aGlzIHZhcmlhYmxlIHRvIG1lYW4sICJhbHdheXMgYWRkIGlmIG5vbi16ZXJvLCBuZXZlciBhZGQgaWYgemVyby4iCisgICAqLworCitpbnQgYXV0b19zb2xpYl9hZGQgPSAxOworCisMCisvKiBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiBxc29ydCwgaW4gYW4gQU5TSSBlbnZpcm9ubWVudAorICAgaXQgbXVzdCBjb25mb3JtIHRvIHRoZSBwcm90b3R5cGUgZm9yIHFzb3J0LCB3aGljaCBzcGVjaWZpZXMgdGhhdCB0aGUKKyAgIGNvbXBhcmlzb24gZnVuY3Rpb24gdGFrZXMgdHdvICJ2b2lkICoiIHBvaW50ZXJzLiAqLworCitzdGF0aWMgaW50Citjb21wYXJlX3N5bWJvbHMgKHMxcCwgczJwKQorICAgICBjb25zdCBQVFIgczFwOworICAgICBjb25zdCBQVFIgczJwOworeworICByZWdpc3RlciBzdHJ1Y3Qgc3ltYm9sICoqczEsICoqczI7CisKKyAgczEgPSAoc3RydWN0IHN5bWJvbCAqKikgczFwOworICBzMiA9IChzdHJ1Y3Qgc3ltYm9sICoqKSBzMnA7CisKKyAgcmV0dXJuIChTVFJDTVAgKFNZTUJPTF9OQU1FICgqczEpLCBTWU1CT0xfTkFNRSAoKnMyKSkpOworfQorCisvKgorCitMT0NBTCBGVU5DVElPTgorCisJY29tcGFyZV9wc3ltYm9scyAtLSBjb21wYXJlIHR3byBwYXJ0aWFsIHN5bWJvbHMgYnkgbmFtZQorCitERVNDUklQVElPTgorCisJR2l2ZW4gcG9pbnRlcnMgdG8gcG9pbnRlcnMgdG8gdHdvIHBhcnRpYWwgc3ltYm9sIHRhYmxlIGVudHJpZXMsCisJY29tcGFyZSB0aGVtIGJ5IG5hbWUgYW5kIHJldHVybiAtTiwgMCwgb3IgK04gKGFsYSBzdHJjbXApLgorCVR5cGljYWxseSB1c2VkIGJ5IHNvcnRpbmcgcm91dGluZXMgbGlrZSBxc29ydCgpLgorCitOT1RFUworCisJRG9lcyBkaXJlY3QgY29tcGFyZSBvZiBmaXJzdCB0d28gY2hhcmFjdGVycyBiZWZvcmUgcHVudGluZworCWFuZCBwYXNzaW5nIHRvIHN0cmNtcCBmb3IgbG9uZ2VyIGNvbXBhcmVzLiAgTm90ZSB0aGF0IHRoZQorCW9yaWdpbmFsIHZlcnNpb24gaGFkIGEgYnVnIHdoZXJlYnkgdHdvIG51bGwgc3RyaW5ncyBvciB0d28KKwlpZGVudGljYWxseSBuYW1lZCBvbmUgY2hhcmFjdGVyIHN0cmluZ3Mgd291bGQgcmV0dXJuIHRoZQorCWNvbXBhcmlzb24gb2YgbWVtb3J5IGZvbGxvd2luZyB0aGUgbnVsbCBieXRlLgorCisgKi8KKworc3RhdGljIGludAorY29tcGFyZV9wc3ltYm9scyAoczFwLCBzMnApCisgICAgIGNvbnN0IFBUUiBzMXA7CisgICAgIGNvbnN0IFBUUiBzMnA7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKnN0MSA9IFNZTUJPTF9OQU1FICgqKHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKikgczFwKTsKKyAgcmVnaXN0ZXIgY2hhciAqc3QyID0gU1lNQk9MX05BTUUgKCooc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqKSBzMnApOworCisgIGlmICgoc3QxWzBdIC0gc3QyWzBdKSB8fCAhc3QxWzBdKQorICAgIHsKKyAgICAgIHJldHVybiAoc3QxWzBdIC0gc3QyWzBdKTsKKyAgICB9CisgIGVsc2UgaWYgKChzdDFbMV0gLSBzdDJbMV0pIHx8ICFzdDFbMV0pCisgICAgeworICAgICAgcmV0dXJuIChzdDFbMV0gLSBzdDJbMV0pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGU6IEkgcmVwbGFjZWQgdGhlIFNUUkNNUCBsaW5lIChjb21tZW50ZWQgb3V0IGJlbG93KQorICAgICAgICogd2l0aCBhIHNpbXBsZXIgInN0cmNtcCgpIiB3aGljaCBjb21wYXJlcyB0aGUgMiBzdHJpbmdzCisgICAgICAgKiBmcm9tIHRoZSBiZWdpbm5pbmcuIChTVFJDTVAgaXMgYSBtYWNybyB3aGljaCBmaXJzdCBjb21wYXJlcworICAgICAgICogdGhlIGluaXRpYWwgY2hhcmFjdGVycywgdGhlbiBmYWxscyBiYWNrIG9uIHN0cmNtcCkuCisgICAgICAgKiBUaGUgcmVhc29uIGlzIHRoYXQgdGhlIFNUUkNNUCBsaW5lIHdhcyB0aWNrbGluZyBhIEMgY29tcGlsZXIKKyAgICAgICAqIGJ1ZyBvbiBIUC1VWCAxMC4zMCwgd2hpY2ggaXMgYXZvaWRlZCB3aXRoIHRoZSBzaW1wbGVyCisgICAgICAgKiBjb2RlLiBUaGUgcGVyZm9ybWFuY2UgZ2FpbiBmcm9tIHRoZSBtb3JlIGNvbXBsaWNhdGVkIGNvZGUKKyAgICAgICAqIGlzIG5lZ2xpZ2libGUsIGdpdmVuIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhlCisgICAgICAgKiBpbml0aWFsIDIgY2hhcmFjdGVycyBhYm92ZS4gSSByZXBvcnRlZCB0aGUgY29tcGlsZXIgYnVnLAorICAgICAgICogYW5kIG9uY2UgaXQgaXMgZml4ZWQgdGhlIG9yaWdpbmFsIGxpbmUgY2FuIGJlIHB1dCBiYWNrLiBSVAorICAgICAgICovCisgICAgICAvKiByZXR1cm4gKCBTVFJDTVAgKHN0MSArIDIsIHN0MiArIDIpKTsgKi8KKyAgICAgIHJldHVybiAoIHN0cmNtcCAoc3QxLCBzdDIpKTsKKyAgICB9Cit9CisKK3ZvaWQKK3NvcnRfcHN0X3N5bWJvbHMgKHBzdCkKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7Cit7CisgIC8qIFNvcnQgdGhlIGdsb2JhbCBsaXN0OyBkb24ndCBzb3J0IHRoZSBzdGF0aWMgbGlzdCAqLworCisgIHFzb3J0IChwc3QgLT4gb2JqZmlsZSAtPiBnbG9iYWxfcHN5bWJvbHMubGlzdCArIHBzdCAtPiBnbG9iYWxzX29mZnNldCwKKwkgcHN0IC0+IG5fZ2xvYmFsX3N5bXMsIHNpemVvZiAoc3RydWN0IHBhcnRpYWxfc3ltYm9sICopLAorCSBjb21wYXJlX3BzeW1ib2xzKTsKK30KKworLyogQ2FsbCBzb3J0X2Jsb2NrX3N5bXMgdG8gc29ydCBhbHBoYWJldGljYWxseSB0aGUgc3ltYm9scyBvZiBvbmUgYmxvY2suICAqLworCit2b2lkCitzb3J0X2Jsb2NrX3N5bXMgKGIpCisgICAgIHJlZ2lzdGVyIHN0cnVjdCBibG9jayAqYjsKK3sKKyAgcXNvcnQgKCZCTE9DS19TWU0gKGIsIDApLCBCTE9DS19OU1lNUyAoYiksCisJIHNpemVvZiAoc3RydWN0IHN5bWJvbCAqKSwgY29tcGFyZV9zeW1ib2xzKTsKK30KKworLyogQ2FsbCBzb3J0X3N5bXRhYl9zeW1zIHRvIHNvcnQgYWxwaGFiZXRpY2FsbHkKKyAgIHRoZSBzeW1ib2xzIG9mIGVhY2ggYmxvY2sgb2Ygb25lIHN5bXRhYi4gICovCisKK3ZvaWQKK3NvcnRfc3ltdGFiX3N5bXMgKHMpCisgICAgIHJlZ2lzdGVyIHN0cnVjdCBzeW10YWIgKnM7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBibG9ja3ZlY3RvciAqYnY7CisgIGludCBuYmw7CisgIGludCBpOworICByZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmI7CisKKyAgaWYgKHMgPT0gMCkKKyAgICByZXR1cm47CisgIGJ2ID0gQkxPQ0tWRUNUT1IgKHMpOworICBuYmwgPSBCTE9DS1ZFQ1RPUl9OQkxPQ0tTIChidik7CisgIGZvciAoaSA9IDA7IGkgPCBuYmw7IGkrKykKKyAgICB7CisgICAgICBiID0gQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBpKTsKKyAgICAgIGlmIChCTE9DS19TSE9VTERfU09SVCAoYikpCisJc29ydF9ibG9ja19zeW1zIChiKTsKKyAgICB9Cit9CisKKy8qIE1ha2UgYSBudWxsIHRlcm1pbmF0ZWQgY29weSBvZiB0aGUgc3RyaW5nIGF0IFBUUiB3aXRoIFNJWkUgY2hhcmFjdGVycyBpbgorICAgdGhlIG9ic3RhY2sgcG9pbnRlZCB0byBieSBPQlNUQUNLUCAuICBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBjb3B5LgorICAgTm90ZSB0aGF0IHRoZSBzdHJpbmcgYXQgUFRSIGRvZXMgbm90IGhhdmUgdG8gYmUgbnVsbCB0ZXJtaW5hdGVkLCBJLkUuIGl0CisgICBtYXkgYmUgcGFydCBvZiBhIGxhcmdlciBzdHJpbmcgYW5kIHdlIGFyZSBvbmx5IHNhdmluZyBhIHN1YnN0cmluZy4gKi8KKworY2hhciAqCitvYnNhdmVzdHJpbmcgKHB0ciwgc2l6ZSwgb2JzdGFja3ApCisgICAgIGNoYXIgKnB0cjsKKyAgICAgaW50IHNpemU7CisgICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrcDsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqcCA9IChjaGFyICopIG9ic3RhY2tfYWxsb2MgKG9ic3RhY2twLCBzaXplICsgMSk7CisgIC8qIE9wZW4tY29kZWQgbWVtY3B5LS1zYXZlcyBmdW5jdGlvbiBjYWxsIHRpbWUuICBUaGVzZSBzdHJpbmdzIGFyZSB1c3VhbGx5CisgICAgIHNob3J0LiAgRklYTUU6IElzIHRoaXMgcmVhbGx5IHN0aWxsIHRydWUgd2l0aCBhIGNvbXBpbGVyIHRoYXQgY2FuCisgICAgIGlubGluZSBtZW1jcHk/ICovCisgIHsKKyAgICByZWdpc3RlciBjaGFyICpwMSA9IHB0cjsKKyAgICByZWdpc3RlciBjaGFyICpwMiA9IHA7CisgICAgY2hhciAqZW5kID0gcHRyICsgc2l6ZTsKKyAgICB3aGlsZSAocDEgIT0gZW5kKQorICAgICAgKnAyKysgPSAqcDErKzsKKyAgfQorICBwW3NpemVdID0gMDsKKyAgcmV0dXJuIHA7Cit9CisKKy8qIENvbmNhdGVuYXRlIHN0cmluZ3MgUzEsIFMyIGFuZCBTMzsgcmV0dXJuIHRoZSBuZXcgc3RyaW5nLiAgU3BhY2UgaXMgZm91bmQKKyAgIGluIHRoZSBvYnN0YWNrIHBvaW50ZWQgdG8gYnkgT0JTVEFDS1AuICAqLworCitjaGFyICoKK29iY29uY2F0IChvYnN0YWNrcCwgczEsIHMyLCBzMykKKyAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2twOworICAgICBjb25zdCBjaGFyICpzMSwgKnMyLCAqczM7Cit7CisgIHJlZ2lzdGVyIGludCBsZW4gPSBzdHJsZW4gKHMxKSArIHN0cmxlbiAoczIpICsgc3RybGVuIChzMykgKyAxOworICByZWdpc3RlciBjaGFyICp2YWwgPSAoY2hhciAqKSBvYnN0YWNrX2FsbG9jIChvYnN0YWNrcCwgbGVuKTsKKyAgc3RyY3B5ICh2YWwsIHMxKTsKKyAgc3RyY2F0ICh2YWwsIHMyKTsKKyAgc3RyY2F0ICh2YWwsIHMzKTsKKyAgcmV0dXJuIHZhbDsKK30KKworLyogVHJ1ZSBpZiB3ZSBhcmUgbmVzdGVkIGluc2lkZSBwc3ltdGFiX3RvX3N5bXRhYi4gKi8KKworaW50IGN1cnJlbnRseV9yZWFkaW5nX3N5bXRhYiA9IDA7CisKK3N0YXRpYyB2b2lkCitkZWNyZW1lbnRfcmVhZGluZ19zeW10YWIgKGR1bW15KQorICAgICB2b2lkICpkdW1teTsKK3sKKyAgY3VycmVudGx5X3JlYWRpbmdfc3ltdGFiLS07Cit9CisKKy8qIEdldCB0aGUgc3ltYm9sIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWFsX3N5bXRhYi4KKyAgIFRoaXMgaXMgZmFzdCBhZnRlciB0aGUgZmlyc3QgdGltZSB5b3UgZG8gaXQuICBJbiBmYWN0LCB0aGVyZQorICAgaXMgYW4gZXZlbiBmYXN0ZXIgbWFjcm8gUFNZTVRBQl9UT19TWU1UQUIgdGhhdCBkb2VzIHRoZSBmYXN0CisgICBjYXNlIGlubGluZS4gICovCisKK3N0cnVjdCBzeW10YWIgKgorcHN5bXRhYl90b19zeW10YWIgKHBzdCkKKyAgICAgcmVnaXN0ZXIgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7Cit7CisgIC8qIElmIGl0J3MgYmVlbiBsb29rZWQgdXAgYmVmb3JlLCByZXR1cm4gaXQuICovCisgIGlmIChwc3QtPnN5bXRhYikKKyAgICByZXR1cm4gcHN0LT5zeW10YWI7CisKKyAgLyogSWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiByZWFkIGluLCByZWFkIGl0LiAgKi8KKyAgaWYgKCFwc3QtPnJlYWRpbikKKyAgICB7IAorICAgICAgc3RydWN0IGNsZWFudXAgKmJhY2tfdG8gPSBtYWtlX2NsZWFudXAgKGRlY3JlbWVudF9yZWFkaW5nX3N5bXRhYiwgTlVMTCk7CisgICAgICBjdXJyZW50bHlfcmVhZGluZ19zeW10YWIrKzsKKyAgICAgICgqcHN0LT5yZWFkX3N5bXRhYikgKHBzdCk7CisgICAgICBkb19jbGVhbnVwcyAoYmFja190byk7CisgICAgfQorCisgIHJldHVybiBwc3QtPnN5bXRhYjsKK30KKworLyogSW5pdGlhbGl6ZSBlbnRyeSBwb2ludCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBvYmpmaWxlLiAqLworCit2b2lkCitpbml0X2VudHJ5X3BvaW50X2luZm8gKG9iamZpbGUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICAvKiBTYXZlIHN0YXJ0dXAgZmlsZSdzIHJhbmdlIG9mIFBDIGFkZHJlc3NlcyB0byBoZWxwIGJsb2NrZnJhbWUuYworICAgICBkZWNpZGUgd2hlcmUgdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2sgaXMuICAqLworCisgIGlmIChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKG9iamZpbGUgLT4gb2JmZCkgJiBFWEVDX1ApCisgICAgeworICAgICAgLyogRXhlY3V0YWJsZSBmaWxlIC0tIHJlY29yZCBpdHMgZW50cnkgcG9pbnQgc28gd2UnbGwgcmVjb2duaXplCisJIHRoZSBzdGFydHVwIGZpbGUgYmVjYXVzZSBpdCBjb250YWlucyB0aGUgZW50cnkgcG9pbnQuICAqLworICAgICAgb2JqZmlsZSAtPiBlaS5lbnRyeV9wb2ludCA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAob2JqZmlsZSAtPiBvYmZkKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBFeGFtaW5hdGlvbiBvZiBub24tZXhlY3V0YWJsZS5vIGZpbGVzLiAgU2hvcnQtY2lyY3VpdCB0aGlzIHN0dWZmLiAgKi8KKyAgICAgIG9iamZpbGUgLT4gZWkuZW50cnlfcG9pbnQgPSBJTlZBTElEX0VOVFJZX1BPSU5UOworICAgIH0KKyAgb2JqZmlsZSAtPiBlaS5lbnRyeV9maWxlX2xvd3BjID0gSU5WQUxJRF9FTlRSWV9MT1dQQzsKKyAgb2JqZmlsZSAtPiBlaS5lbnRyeV9maWxlX2hpZ2hwYyA9IElOVkFMSURfRU5UUllfSElHSFBDOworICBvYmpmaWxlIC0+IGVpLmVudHJ5X2Z1bmNfbG93cGMgPSBJTlZBTElEX0VOVFJZX0xPV1BDOworICBvYmpmaWxlIC0+IGVpLmVudHJ5X2Z1bmNfaGlnaHBjID0gSU5WQUxJRF9FTlRSWV9ISUdIUEM7CisgIG9iamZpbGUgLT4gZWkubWFpbl9mdW5jX2xvd3BjID0gSU5WQUxJRF9FTlRSWV9MT1dQQzsKKyAgb2JqZmlsZSAtPiBlaS5tYWluX2Z1bmNfaGlnaHBjID0gSU5WQUxJRF9FTlRSWV9ISUdIUEM7Cit9CisKKy8qIEdldCBjdXJyZW50IGVudHJ5IHBvaW50IGFkZHJlc3MuICAqLworCitDT1JFX0FERFIKK2VudHJ5X3BvaW50X2FkZHJlc3MoKQoreworICByZXR1cm4gc3ltZmlsZV9vYmpmaWxlID8gc3ltZmlsZV9vYmpmaWxlLT5laS5lbnRyeV9wb2ludCA6IDA7Cit9CisKKy8qIFJlbWVtYmVyIHRoZSBsb3dlc3QtYWRkcmVzc2VkIGxvYWRhYmxlIHNlY3Rpb24gd2UndmUgc2Vlbi4gIAorICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gCisKKyAgIEluIGNhc2Ugb2YgZXF1YWwgdm1hcywgdGhlIHNlY3Rpb24gd2l0aCB0aGUgbGFyZ2VzdCBzaXplIGJlY29tZXMgdGhlCisgICBsb3dlc3QtYWRkcmVzc2VkIGxvYWRhYmxlIHNlY3Rpb24uCisKKyAgIElmIHRoZSB2bWFzIGFuZCBzaXplcyBhcmUgZXF1YWwsIHRoZSBsYXN0IHNlY3Rpb24gaXMgY29uc2lkZXJlZCB0aGUKKyAgIGxvd2VzdC1hZGRyZXNzZWQgbG9hZGFibGUgc2VjdGlvbi4gICovCisKK3ZvaWQKK2ZpbmRfbG93ZXN0X3NlY3Rpb24gKGFiZmQsIHNlY3QsIG9iaikKKyAgICAgYmZkICphYmZkOworICAgICBhc2VjdGlvbiAqc2VjdDsKKyAgICAgUFRSIG9iajsKK3sKKyAgYXNlY3Rpb24gKipsb3dlc3QgPSAoYXNlY3Rpb24gKiopb2JqOworCisgIGlmICgwID09IChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3QpICYgU0VDX0xPQUQpKQorICAgIHJldHVybjsKKyAgaWYgKCEqbG93ZXN0KQorICAgICpsb3dlc3QgPSBzZWN0OwkJLyogRmlyc3QgbG9hZGFibGUgc2VjdGlvbiAqLworICBlbHNlIGlmIChiZmRfc2VjdGlvbl92bWEgKGFiZmQsICpsb3dlc3QpID4gYmZkX3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0KSkKKyAgICAqbG93ZXN0ID0gc2VjdDsJCS8qIEEgbG93ZXIgbG9hZGFibGUgc2VjdGlvbiAqLworICBlbHNlIGlmIChiZmRfc2VjdGlvbl92bWEgKGFiZmQsICpsb3dlc3QpID09IGJmZF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdCkKKwkgICAmJiAoYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgKCpsb3dlc3QpKQorCSAgICAgICA8PSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0KSkpCisgICAgKmxvd2VzdCA9IHNlY3Q7Cit9CisKKy8qIFBhcnNlIHRoZSB1c2VyJ3MgaWRlYSBvZiBhbiBvZmZzZXQgZm9yIGR5bmFtaWMgbGlua2luZywgaW50byBvdXIgaWRlYQorICAgb2YgaG93IHRvIHJlcHJlc2VudCBpdCBmb3IgZmFzdCBzeW1ib2wgcmVhZGluZy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgCisgICB2ZXJzaW9uIG9mIHRoZSBzeW1fZm5zLnN5bV9vZmZzZXRzIGZ1bmN0aW9uIGZvciBzeW1ib2wgcmVhZGVycyB0aGF0CisgICBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuICBJdCBhbGxvY2F0ZXMgYSBzZWN0aW9uX29mZnNldHMgdGFibGUKKyAgIGZvciB0aGUgb2JqZWN0ZmlsZSBPQkpGSUxFIGFuZCBzdHVmZnMgQUREUiBpbnRvIGFsbCBvZiB0aGUgb2Zmc2V0cy4gICovCisKK3N0cnVjdCBzZWN0aW9uX29mZnNldHMgKgorZGVmYXVsdF9zeW1maWxlX29mZnNldHMgKG9iamZpbGUsIGFkZHIpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBDT1JFX0FERFIgYWRkcjsKK3sKKyAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworICBpbnQgaTsKKworICBvYmpmaWxlLT5udW1fc2VjdGlvbnMgPSBTRUNUX09GRl9NQVg7CisgIHNlY3Rpb25fb2Zmc2V0cyA9IChzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICopCisgICAgb2JzdGFja19hbGxvYyAoJm9iamZpbGUgLT4gcHN5bWJvbF9vYnN0YWNrLCBTSVpFT0ZfU0VDVElPTl9PRkZTRVRTKTsKKworICBmb3IgKGkgPSAwOyBpIDwgU0VDVF9PRkZfTUFYOyBpKyspCisgICAgQU5PRkZTRVQgKHNlY3Rpb25fb2Zmc2V0cywgaSkgPSBhZGRyOworICAKKyAgcmV0dXJuIHNlY3Rpb25fb2Zmc2V0czsKK30KKworCisvKiBQcm9jZXNzIGEgc3ltYm9sIGZpbGUsIGFzIGVpdGhlciB0aGUgbWFpbiBmaWxlIG9yIGFzIGEgZHluYW1pY2FsbHkKKyAgIGxvYWRlZCBmaWxlLgorCisgICBOQU1FIGlzIHRoZSBmaWxlIG5hbWUgKHdoaWNoIHdpbGwgYmUgdGlsZGUtZXhwYW5kZWQgYW5kIG1hZGUKKyAgIGFic29sdXRlIGhlcmVpbikgKGJ1dCB3ZSBkb24ndCBmcmVlIG9yIG1vZGlmeSBOQU1FIGl0c2VsZikuCisgICBGUk9NX1RUWSBzYXlzIGhvdyB2ZXJib3NlIHRvIGJlLiAgTUFJTkxJTkUgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcworICAgaXMgdGhlIG1haW4gc3ltYm9sIGZpbGUsIG9yIHdoZXRoZXIgaXQncyBhbiBleHRyYSBzeW1ib2wgZmlsZSBzdWNoCisgICBhcyBkeW5hbWljYWxseSBsb2FkZWQgY29kZS4gIElmICFtYWlubGluZSwgQUREUiBpcyB0aGUgYWRkcmVzcworICAgd2hlcmUgdGhlIHRleHQgc2VnbWVudCB3YXMgbG9hZGVkLiAgSWYgVkVSQk8sIHRoZSBjYWxsZXIgaGFzIHByaW50ZWQKKyAgIGEgdmVyYm9zZSBtZXNzYWdlIGFib3V0IHRoZSBzeW1ib2wgcmVhZGluZyAoYW5kIGNvbXBsYWludHMgY2FuIGJlCisgICBtb3JlIHRlcnNlIGFib3V0IGl0KS4gICovCisKK3ZvaWQKK3N5bXNfZnJvbV9vYmpmaWxlIChvYmpmaWxlLCBhZGRyLCBtYWlubGluZSwgdmVyYm8pCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgaW50IG1haW5saW5lOworICAgICBpbnQgdmVyYm87Cit7CisgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKyAgYXNlY3Rpb24gKmxvd2VzdF9zZWN0OworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworCisgIGluaXRfZW50cnlfcG9pbnRfaW5mbyAob2JqZmlsZSk7CisgIGZpbmRfc3ltX2ZucyAob2JqZmlsZSk7CisKKyAgLyogTWFrZSBzdXJlIHRoYXQgcGFydGlhbGx5IGNvbnN0cnVjdGVkIHN5bWJvbCB0YWJsZXMgd2lsbCBiZSBjbGVhbmVkIHVwCisgICAgIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgc3ltYm9sIHJlYWRpbmcuICAqLworICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZnJlZV9vYmpmaWxlLCBvYmpmaWxlKTsKKworICBpZiAobWFpbmxpbmUpIAorICAgIHsKKyAgICAgIC8qIFdlIHdpbGwgbW9kaWZ5IHRoZSBtYWluIHN5bWJvbCB0YWJsZSwgbWFrZSBzdXJlIHRoYXQgYWxsIGl0cyB1c2VycworCSB3aWxsIGJlIGNsZWFuZWQgdXAgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBzeW1ib2wgcmVhZGluZy4gICovCisgICAgICBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgY2xlYXJfc3ltdGFiX3VzZXJzLCAwKTsKKworICAgICAgLyogU2luY2Ugbm8gZXJyb3IgeWV0LCB0aHJvdyBhd2F5IHRoZSBvbGQgc3ltYm9sIHRhYmxlLiAgKi8KKworICAgICAgaWYgKHN5bWZpbGVfb2JqZmlsZSAhPSBOVUxMKQorCXsKKwkgIGZyZWVfb2JqZmlsZSAoc3ltZmlsZV9vYmpmaWxlKTsKKwkgIHN5bWZpbGVfb2JqZmlsZSA9IE5VTEw7CisJfQorCisgICAgICAvKiBDdXJyZW50bHkgd2Uga2VlcCBzeW1ib2xzIGZyb20gdGhlIGFkZC1zeW1ib2wtZmlsZSBjb21tYW5kLgorCSBJZiB0aGUgdXNlciB3YW50cyB0byBnZXQgcmlkIG9mIHRoZW0sIHRoZXkgc2hvdWxkIGRvICJzeW1ib2wtZmlsZSIKKwkgd2l0aG91dCBhcmd1bWVudHMgZmlyc3QuICBOb3Qgc3VyZSB0aGlzIGlzIHRoZSBiZXN0IGJlaGF2aW9yCisJIChQUiAyMjA3KS4gICovCisKKyAgICAgICgqb2JqZmlsZSAtPiBzZiAtPiBzeW1fbmV3X2luaXQpIChvYmpmaWxlKTsKKyAgICB9CisKKyAgLyogQ29udmVydCBhZGRyIGludG8gYW4gb2Zmc2V0IHJhdGhlciB0aGFuIGFuIGFic29sdXRlIGFkZHJlc3MuCisgICAgIFdlIGZpbmQgdGhlIGxvd2VzdCBhZGRyZXNzIG9mIGEgbG9hZGVkIHNlZ21lbnQgaW4gdGhlIG9iamZpbGUsCisgICAgIGFuZCBhc3N1bWUgdGhhdCA8YWRkcj4gaXMgd2hlcmUgdGhhdCBnb3QgbG9hZGVkLiAgRHVlIHRvIGhpc3RvcmljYWwKKyAgICAgcHJlY2VkZW50LCB3ZSB3YXJuIGlmIHRoYXQgZG9lc24ndCBoYXBwZW4gdG8gYmUgYSB0ZXh0IHNlZ21lbnQuICAqLworCisgIGlmIChtYWlubGluZSkKKyAgICB7CisgICAgICBhZGRyID0gMDsJCS8qIE5vIG9mZnNldCBmcm9tIG9iamZpbGUgYWRkcmVzc2VzLiAgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsb3dlc3Rfc2VjdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvYmpmaWxlLT5vYmZkLCAiLnRleHQiKTsKKyAgICAgIGlmIChsb3dlc3Rfc2VjdCA9PSBOVUxMKQorCWJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAob2JqZmlsZS0+b2JmZCwgZmluZF9sb3dlc3Rfc2VjdGlvbiwKKwkJCSAgICAgICAoUFRSKSAmbG93ZXN0X3NlY3QpOworCisgICAgICBpZiAobG93ZXN0X3NlY3QgPT0gTlVMTCkKKwl3YXJuaW5nICgibm8gbG9hZGFibGUgc2VjdGlvbnMgZm91bmQgaW4gYWRkZWQgc3ltYm9sLWZpbGUgJXMiLAorCQkgb2JqZmlsZS0+bmFtZSk7CisgICAgICBlbHNlIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChvYmpmaWxlLT5vYmZkLCBsb3dlc3Rfc2VjdCkgJiBTRUNfQ09ERSkKKwkgICAgICAgPT0gMCkKKwkvKiBGSVhNRS0zMng2NC0tYXNzdW1lcyBiZmRfdm1hIGZpdHMgaW4gbG9uZy4gICovCisJd2FybmluZyAoIkxvd2VzdCBzZWN0aW9uIGluICVzIGlzICVzIGF0IDB4JWx4IiwKKwkJIG9iamZpbGUtPm5hbWUsCisJCSBiZmRfc2VjdGlvbl9uYW1lIChvYmpmaWxlLT5vYmZkLCBsb3dlc3Rfc2VjdCksCisJCSAodW5zaWduZWQgbG9uZykgYmZkX3NlY3Rpb25fdm1hIChvYmpmaWxlLT5vYmZkLCBsb3dlc3Rfc2VjdCkpOworCisgICAgICBpZiAobG93ZXN0X3NlY3QpCisJYWRkciAtPSBiZmRfc2VjdGlvbl92bWEgKG9iamZpbGUtPm9iZmQsIGxvd2VzdF9zZWN0KTsKKyAgICB9CisKKyAgLyogSW5pdGlhbGl6ZSBzeW1ib2wgcmVhZGluZyByb3V0aW5lcyBmb3IgdGhpcyBvYmpmaWxlLCBhbGxvdyBjb21wbGFpbnRzIHRvCisgICAgIGFwcGVhciBmb3IgdGhpcyBuZXcgZmlsZSwgYW5kIHJlY29yZCBob3cgdmVyYm9zZSB0byBiZSwgdGhlbiBkbyB0aGUKKyAgICAgaW5pdGlhbCBzeW1ib2wgcmVhZGluZyBmb3IgdGhpcyBmaWxlLiAqLworCisgICgqb2JqZmlsZSAtPiBzZiAtPiBzeW1faW5pdCkgKG9iamZpbGUpOworICBjbGVhcl9jb21wbGFpbnRzICgxLCB2ZXJibyk7CisKKyAgc2VjdGlvbl9vZmZzZXRzID0gKCpvYmpmaWxlIC0+IHNmIC0+IHN5bV9vZmZzZXRzKSAob2JqZmlsZSwgYWRkcik7CisgIG9iamZpbGUtPnNlY3Rpb25fb2Zmc2V0cyA9IHNlY3Rpb25fb2Zmc2V0czsKKworI2lmbmRlZiBJQk02MDAwX1RBUkdFVAorICAvKiBUaGlzIGlzIGEgU1ZSNC9TdW5PUyBzcGVjaWZpYyBoYWNrLCBJIHRoaW5rLiAgSW4gYW55IGV2ZW50LCBpdAorICAgICBzY3Jld3MgUlMvNjAwMC4gIHN5bV9vZmZzZXRzIHNob3VsZCBiZSBkb2luZyB0aGlzIHNvcnQgb2YgdGhpbmcsCisgICAgIGJlY2F1c2UgaXQga25vd3MgdGhlIG1hcHBpbmcgYmV0d2VlbiBiZmQgc2VjdGlvbnMgYW5kCisgICAgIHNlY3Rpb25fb2Zmc2V0cy4gICovCisgIC8qIFRoaXMgaXMgYSBoYWNrLiAgQXMgZmFyIGFzIEkgY2FuIHRlbGwsIHNlY3Rpb24gb2Zmc2V0cyBhcmUgbm90CisgICAgIHRhcmdldCBkZXBlbmRlbnQuICBUaGV5IGFyZSBhbGwgc2V0IHRvIGFkZHIgd2l0aCBhIGNvdXBsZSBvZgorICAgICBleGNlcHRpb25zLiAgVGhlIGV4Y2VwdGlvbnMgYXJlIHN5c3ZyNCBzaGFyZWQgbGlicmFyaWVzLCB3aG9zZQorICAgICBvZmZzZXRzIGFyZSBrZXB0IGluIHNvbGliIHN0cnVjdHVyZXMgYW55d2F5IGFuZCByczYwMDAgeGNvZmYKKyAgICAgd2hpY2ggaGFuZGxlcyBzaGFyZWQgbGlicmFyaWVzIGluIGEgY29tcGxldGVseSB1bmlxdWUgd2F5LgorCisgICAgIFNlY3Rpb24gb2Zmc2V0cyBhcmUgYnVpbHQgc2ltaWxhcmx5LCBleGNlcHQgdGhhdCB0aGV5IGFyZSBidWlsdAorICAgICBieSBhZGRpbmcgYWRkciBpbiBhbGwgY2FzZXMgYmVjYXVzZSB0aGVyZSBpcyBubyBjbGVhciBtYXBwaW5nCisgICAgIGZyb20gc2VjdGlvbl9vZmZzZXRzIGludG8gYWN0dWFsIHNlY3Rpb25zLiAgTm90ZSB0aGF0IHNvbGliLmMKKyAgICAgaGFzIGEgZGlmZmVyZW50IGFsZ29yeXRobSBmb3IgZmluZGluZyBzZWN0aW9uIG9mZnNldHMuCisKKyAgICAgVGhlc2Ugc2hvdWxkIHByb2JhYmx5IGFsbCBiZSBjb2xsYXBzZWQgaW50byBzb21lIHRhcmdldAorICAgICBpbmRlcGVuZGVudCBmb3JtIG9mIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuICBGSVhNRS4gICovCisKKyAgaWYgKGFkZHIpCisgICAgeworICAgICAgc3RydWN0IG9ial9zZWN0aW9uICpzOworCisgICAgICBmb3IgKHMgPSBvYmpmaWxlLT5zZWN0aW9uczsgcyA8IG9iamZpbGUtPnNlY3Rpb25zX2VuZDsgKytzKQorCXsKKwkgIHMtPmFkZHIgLT0gcy0+b2Zmc2V0OworCSAgcy0+YWRkciArPSBhZGRyOworCSAgcy0+ZW5kYWRkciAtPSBzLT5vZmZzZXQ7CisJICBzLT5lbmRhZGRyICs9IGFkZHI7CisJICBzLT5vZmZzZXQgKz0gYWRkcjsKKwl9CisgICAgfQorI2VuZGlmIC8qIG5vdCBJQk02MDAwX1RBUkdFVCAqLworCisgICgqb2JqZmlsZSAtPiBzZiAtPiBzeW1fcmVhZCkgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywgbWFpbmxpbmUpOworCisgIGlmICghaGF2ZV9wYXJ0aWFsX3N5bWJvbHMgKCkgJiYgIWhhdmVfZnVsbF9zeW1ib2xzICgpKQorICAgIHsKKyAgICAgIHdyYXBfaGVyZSAoIiIpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiKG5vIGRlYnVnZ2luZyBzeW1ib2xzIGZvdW5kKS4uLiIpOworICAgICAgd3JhcF9oZXJlICgiIik7CisgICAgfQorCisgIC8qIERvbid0IGFsbG93IGNoYXIgKiB0byBoYXZlIGEgdHlwZW5hbWUgKGVsc2Ugd291bGQgZ2V0IGNhZGRyX3QpLgorICAgICBEaXR0byB2b2lkICouICBGSVhNRTogQ2hlY2sgd2hldGhlciB0aGlzIGlzIG5vdyBkb25lIGJ5IGFsbCB0aGUKKyAgICAgc3ltYm9sIHJlYWRlcnMgdGhlbXNlbHZlcyAobWFueSBvZiB0aGVtIG5vdyBkbyksIGFuZCBpZiBzbyByZW1vdmUKKyAgICAgaXQgZnJvbSBoZXJlLiAgKi8KKworICBUWVBFX05BTUUgKGxvb2t1cF9wb2ludGVyX3R5cGUgKGJ1aWx0aW5fdHlwZV9jaGFyKSkgPSAwOworICBUWVBFX05BTUUgKGxvb2t1cF9wb2ludGVyX3R5cGUgKGJ1aWx0aW5fdHlwZV92b2lkKSkgPSAwOworCisgIC8qIE1hcmsgdGhlIG9iamZpbGUgaGFzIGhhdmluZyBoYWQgaW5pdGlhbCBzeW1ib2wgcmVhZCBhdHRlbXB0ZWQuICBOb3RlCisgICAgIHRoYXQgdGhpcyBkb2VzIG5vdCBtZWFuIHdlIGZvdW5kIGFueSBzeW1ib2xzLi4uICovCisKKyAgb2JqZmlsZSAtPiBmbGFncyB8PSBPQkpGX1NZTVM7CisKKyAgLyogRGlzY2FyZCBjbGVhbnVwcyBhcyBzeW1ib2wgcmVhZGluZyB3YXMgc3VjY2Vzc2Z1bC4gICovCisKKyAgZGlzY2FyZF9jbGVhbnVwcyAob2xkX2NoYWluKTsKKworLyogQ2FsbCB0aGlzIGFmdGVyIHJlYWRpbmcgaW4gYSBuZXcgc3ltYm9sIHRhYmxlIHRvIGdpdmUgdGFyZ2V0IGRlcGVuZGFudCBjb2RlCisgICBhIGNyYWNrIGF0IHRoZSBuZXcgc3ltYm9scy4gIEZvciBpbnN0YW5jZSwgdGhpcyBjb3VsZCBiZSB1c2VkIHRvIHVwZGF0ZSB0aGUKKyAgIHZhbHVlcyBvZiB0YXJnZXQtc3BlY2lmaWMgc3ltYm9scyBHREIgbmVlZHMgdG8ga2VlcCB0cmFjayBvZiAoc3VjaCBhcworICAgX3NpZ3RyYW1wLCBvciB3aGF0ZXZlcikuICAqLworCisgIFRBUkdFVF9TWU1GSUxFX1BPU1RSRUFEIChvYmpmaWxlKTsKK30KKworLyogUGVyZm9ybSByZXF1aXJlZCBhY3Rpb25zIGFmdGVyIGVpdGhlciByZWFkaW5nIGluIHRoZSBpbml0aWFsCisgICBzeW1ib2xzIGZvciBhIG5ldyBvYmpmaWxlLCBvciBtYXBwaW5nIGluIHRoZSBzeW1ib2xzIGZyb20gYSByZXVzYWJsZQorICAgb2JqZmlsZS4gKi8KKyAgIAordm9pZAorbmV3X3N5bWZpbGVfb2JqZmlsZSAob2JqZmlsZSwgbWFpbmxpbmUsIHZlcmJvKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgaW50IG1haW5saW5lOworICAgICBpbnQgdmVyYm87Cit7CisKKyAgLyogSWYgdGhpcyBpcyB0aGUgbWFpbiBzeW1ib2wgZmlsZSB3ZSBoYXZlIHRvIGNsZWFuIHVwIGFsbCB1c2VycyBvZiB0aGUKKyAgICAgb2xkIG1haW4gc3ltYm9sIGZpbGUuIE90aGVyd2lzZSBpdCBpcyBzdWZmaWNpZW50IHRvIGZpeHVwIGFsbCB0aGUKKyAgICAgYnJlYWtwb2ludHMgdGhhdCBtYXkgaGF2ZSBiZWVuIHJlZGVmaW5lZCBieSB0aGlzIHN5bWJvbCBmaWxlLiAgKi8KKyAgaWYgKG1haW5saW5lKQorICAgIHsKKyAgICAgIC8qIE9LLCBtYWtlIGl0IHRoZSAicmVhbCIgc3ltYm9sIGZpbGUuICAqLworICAgICAgc3ltZmlsZV9vYmpmaWxlID0gb2JqZmlsZTsKKworICAgICAgY2xlYXJfc3ltdGFiX3VzZXJzICgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJyZWFrcG9pbnRfcmVfc2V0ICgpOworICAgIH0KKworICAvKiBXZSdyZSBkb25lIHJlYWRpbmcgdGhlIHN5bWJvbCBmaWxlOyBmaW5pc2ggb2ZmIGNvbXBsYWludHMuICAqLworICBjbGVhcl9jb21wbGFpbnRzICgwLCB2ZXJibyk7Cit9CisKKy8qIFByb2Nlc3MgYSBzeW1ib2wgZmlsZSwgYXMgZWl0aGVyIHRoZSBtYWluIGZpbGUgb3IgYXMgYSBkeW5hbWljYWxseQorICAgbG9hZGVkIGZpbGUuCisKKyAgIE5BTUUgaXMgdGhlIGZpbGUgbmFtZSAod2hpY2ggd2lsbCBiZSB0aWxkZS1leHBhbmRlZCBhbmQgbWFkZQorICAgYWJzb2x1dGUgaGVyZWluKSAoYnV0IHdlIGRvbid0IGZyZWUgb3IgbW9kaWZ5IE5BTUUgaXRzZWxmKS4KKyAgIEZST01fVFRZIHNheXMgaG93IHZlcmJvc2UgdG8gYmUuICBNQUlOTElORSBzcGVjaWZpZXMgd2hldGhlciB0aGlzCisgICBpcyB0aGUgbWFpbiBzeW1ib2wgZmlsZSwgb3Igd2hldGhlciBpdCdzIGFuIGV4dHJhIHN5bWJvbCBmaWxlIHN1Y2gKKyAgIGFzIGR5bmFtaWNhbGx5IGxvYWRlZCBjb2RlLiAgSWYgIW1haW5saW5lLCBBRERSIGlzIHRoZSBhZGRyZXNzCisgICB3aGVyZSB0aGUgdGV4dCBzZWdtZW50IHdhcyBsb2FkZWQuCisKKyAgIFVTRVJfTE9BREVEIGlzIFRSVUUgaWYgdGhlIGFkZC1zeW1ib2wtZmlsZSBjb21tYW5kIHdhcyBob3cgdGhpcworICAgc3ltYm9sIGZpbGUgY2FtZSB0byBiZSBwcm9jZXNzZWQuCisKKyAgIElTX1NPTElCIGlzIFRSVUUgaWYgdGhpcyBzeW1ib2wgZmlsZSByZXByZXNlbnRzIGEgc29saWIsIGFzIGRpc2NvdmVyZWQKKyAgIGJ5IHRoZSB0YXJnZXQncyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc29saWIgcGFja2FnZS4KKworICAgVXBvbiBzdWNjZXNzLCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgb2JqZmlsZSB0aGF0IHdhcyBhZGRlZC4KKyAgIFVwb24gZmFpbHVyZSwganVtcHMgYmFjayB0byBjb21tYW5kIGxldmVsIChuZXZlciByZXR1cm5zKS4gKi8KKworc3RydWN0IG9iamZpbGUgKgorc3ltYm9sX2ZpbGVfYWRkIChuYW1lLCBmcm9tX3R0eSwgYWRkciwgbWFpbmxpbmUsIG1hcHBlZCwgcmVhZG5vdywgdXNlcl9sb2FkZWQsIGlzX3NvbGliKQorICAgICBjaGFyICpuYW1lOworICAgICBpbnQgZnJvbV90dHk7CisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBpbnQgbWFpbmxpbmU7CisgICAgIGludCBtYXBwZWQ7CisgICAgIGludCByZWFkbm93OworICAgICBpbnQgIHVzZXJfbG9hZGVkOworICAgICBpbnQgIGlzX3NvbGliOworeworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3ltdGFiOworICBiZmQgKmFiZmQ7CisKKyAgLyogT3BlbiBhIGJmZCBmb3IgdGhlIGZpbGUsIGFuZCBnaXZlIHVzZXIgYSBjaGFuY2UgdG8gYnVycCBpZiB3ZSdkIGJlCisgICAgIGludGVyYWN0aXZlbHkgd2lwaW5nIG91dCBhbnkgZXhpc3Rpbmcgc3ltYm9scy4gICovCisKKyAgYWJmZCA9IHN5bWZpbGVfYmZkX29wZW4gKG5hbWUpOworCisgIGlmICgoaGF2ZV9mdWxsX3N5bWJvbHMgKCkgfHwgaGF2ZV9wYXJ0aWFsX3N5bWJvbHMgKCkpCisgICAgICAmJiBtYWlubGluZQorICAgICAgJiYgZnJvbV90dHkKKyAgICAgICYmICFxdWVyeSAoIkxvYWQgbmV3IHN5bWJvbCB0YWJsZSBmcm9tIFwiJXNcIj8gIiwgbmFtZSkpCisgICAgICBlcnJvciAoIk5vdCBjb25maXJtZWQuIik7CisKKyAgb2JqZmlsZSA9IGFsbG9jYXRlX29iamZpbGUgKGFiZmQsIG1hcHBlZCwgdXNlcl9sb2FkZWQsIGlzX3NvbGliKTsKKworICAvKiBJZiB0aGUgb2JqZmlsZSB1c2VzIGEgbWFwcGVkIHN5bWJvbCBmaWxlLCBhbmQgd2UgaGF2ZSBhIHBzeW10YWIgZm9yCisgICAgIGl0LCB0aGVuIHNraXAgcmVhZGluZyBhbnkgc3ltYm9scyBhdCB0aGlzIHRpbWUuICovCisKKyAgaWYgKChvYmpmaWxlIC0+IGZsYWdzICYgT0JKRl9NQVBQRUQpICYmIChvYmpmaWxlIC0+IGZsYWdzICYgT0JKRl9TWU1TKSkKKyAgICB7CisgICAgICAvKiBXZSBtYXBwZWQgaW4gYW4gZXhpc3Rpbmcgc3ltYm9sIHRhYmxlIGZpbGUgdGhhdCBhbHJlYWR5IGhhcyBoYWQKKwkgaW5pdGlhbCBzeW1ib2wgcmVhZGluZyBwZXJmb3JtZWQsIHNvIHdlIGNhbiBza2lwIHRoYXQgcGFydC4gIE5vdGlmeQorCSB0aGUgdXNlciB0aGF0IGluc3RlYWQgb2YgcmVhZGluZyB0aGUgc3ltYm9scywgdGhleSBoYXZlIGJlZW4gbWFwcGVkLgorCSAqLworICAgICAgaWYgKGZyb21fdHR5IHx8IGluZm9fdmVyYm9zZSkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCJNYXBwZWQgc3ltYm9scyBmb3IgJXMuLi4iLCBuYW1lKTsKKwkgIHdyYXBfaGVyZSAoIiIpOworCSAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwl9CisgICAgICBpbml0X2VudHJ5X3BvaW50X2luZm8gKG9iamZpbGUpOworICAgICAgZmluZF9zeW1fZm5zIChvYmpmaWxlKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBXZSBlaXRoZXIgY3JlYXRlZCBhIG5ldyBtYXBwZWQgc3ltYm9sIHRhYmxlLCBtYXBwZWQgYW4gZXhpc3RpbmcKKwkgc3ltYm9sIHRhYmxlIGZpbGUgd2hpY2ggaGFzIG5vdCBoYWQgaW5pdGlhbCBzeW1ib2wgcmVhZGluZworCSBwZXJmb3JtZWQsIG9yIG5lZWQgdG8gcmVhZCBhbiB1bm1hcHBlZCBzeW1ib2wgdGFibGUuICovCisgICAgICBpZiAoZnJvbV90dHkgfHwgaW5mb192ZXJib3NlKQorCXsKKwkgIGlmIChwcmVfYWRkX3N5bWJvbF9ob29rKQorCSAgICBwcmVfYWRkX3N5bWJvbF9ob29rIChuYW1lKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlJlYWRpbmcgc3ltYm9scyBmcm9tICVzLi4uIiwgbmFtZSk7CisJICAgICAgd3JhcF9oZXJlICgiIik7CisJICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwkgICAgfQorCX0KKyAgICAgIHN5bXNfZnJvbV9vYmpmaWxlIChvYmpmaWxlLCBhZGRyLCBtYWlubGluZSwgZnJvbV90dHkpOworICAgIH0KKworICAvKiBXZSBub3cgaGF2ZSBhdCBsZWFzdCBhIHBhcnRpYWwgc3ltYm9sIHRhYmxlLiAgQ2hlY2sgdG8gc2VlIGlmIHRoZQorICAgICB1c2VyIHJlcXVlc3RlZCB0aGF0IGFsbCBzeW1ib2xzIGJlIHJlYWQgb24gaW5pdGlhbCBhY2Nlc3MgdmlhIGVpdGhlcgorICAgICB0aGUgZ2RiIHN0YXJ0dXAgY29tbWFuZCBsaW5lIG9yIG9uIGEgcGVyIHN5bWJvbCBmaWxlIGJhc2lzLiAgRXhwYW5kCisgICAgIGFsbCBwYXJ0aWFsIHN5bWJvbCB0YWJsZXMgZm9yIHRoaXMgb2JqZmlsZSBpZiBzby4gKi8KKworICBpZiAocmVhZG5vdyB8fCByZWFkbm93X3N5bWJvbF9maWxlcykKKyAgICB7CisgICAgICBpZiAoZnJvbV90dHkgfHwgaW5mb192ZXJib3NlKQorCXsKKwkgIHByaW50Zl9maWx0ZXJlZCAoImV4cGFuZGluZyB0byBmdWxsIHN5bWJvbHMuLi4iKTsKKwkgIHdyYXBfaGVyZSAoIiIpOworCSAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwl9CisKKyAgICAgIGZvciAocHN5bXRhYiA9IG9iamZpbGUgLT4gcHN5bXRhYnM7CisJICAgcHN5bXRhYiAhPSBOVUxMOworCSAgIHBzeW10YWIgPSBwc3ltdGFiIC0+IG5leHQpCisJeworCSAgcHN5bXRhYl90b19zeW10YWIgKHBzeW10YWIpOworCX0KKyAgICB9CisKKyAgaWYgKGZyb21fdHR5IHx8IGluZm9fdmVyYm9zZSkKKyAgICB7CisgICAgICBpZiAocG9zdF9hZGRfc3ltYm9sX2hvb2spCisgICAgICAgIHBvc3RfYWRkX3N5bWJvbF9ob29rICgpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiZG9uZS5cbiIpOworICAgICAgICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgbmV3X3N5bWZpbGVfb2JqZmlsZSAob2JqZmlsZSwgbWFpbmxpbmUsIGZyb21fdHR5KTsKKworICB0YXJnZXRfbmV3X29iamZpbGUgKG9iamZpbGUpOworCisgIHJldHVybiAob2JqZmlsZSk7Cit9CisKKy8qIFRoaXMgaXMgdGhlIHN5bWJvbC1maWxlIGNvbW1hbmQuICBSZWFkIHRoZSBmaWxlLCBhbmFseXplIGl0cworICAgc3ltYm9scywgYW5kIGFkZCBhIHN0cnVjdCBzeW10YWIgdG8gYSBzeW10YWIgbGlzdC4gIFRoZSBzeW50YXggb2YKKyAgIHRoZSBjb21tYW5kIGlzIHJhdGhlciBiaXphcnJlLS0oMSkgYnVpbGRhcmd2IGltcGxlbWVudHMgdmFyaW91cworICAgcXVvdGluZyBjb252ZW50aW9ucyB3aGljaCBhcmUgdW5kb2N1bWVudGVkIGFuZCBoYXZlIGxpdHRsZSBvcgorICAgbm90aGluZyBpbiBjb21tb24gd2l0aCB0aGUgd2F5IHRoaW5ncyBhcmUgcXVvdGVkIChvciBub3QgcXVvdGVkKQorICAgZWxzZXdoZXJlIGluIEdEQiwgKDIpIG9wdGlvbnMgYXJlIHVzZWQsIHdoaWNoIGFyZSBub3QgZ2VuZXJhbGx5CisgICB1c2VkIGluIEdEQiAocGVyaGFwcyAic2V0IG1hcHBlZCBvbiIsICJzZXQgcmVhZG5vdyBvbiIgd291bGQgYmUKKyAgIGJldHRlciksICgzKSB0aGUgb3JkZXIgb2Ygb3B0aW9ucyBtYXR0ZXJzLCB3aGljaCBpcyBjb250cmFyeSB0byBHTlUKKyAgIGNvbnZlbnRpb25zIChiZWNhdXNlIGl0IGlzIGNvbmZ1c2luZyBhbmQgaW5jb252ZW5pZW50KS4gICovCisKK3ZvaWQKK3N5bWJvbF9maWxlX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoYXIgKiphcmd2OworICBjaGFyICpuYW1lID0gTlVMTDsKKyAgQ09SRV9BRERSIHRleHRfcmVsb2NhdGlvbiA9IDA7CQkvKiB0ZXh0X3JlbG9jYXRpb24gKi8KKyAgc3RydWN0IGNsZWFudXAgKmNsZWFudXBzOworICBpbnQgbWFwcGVkID0gMDsKKyAgaW50IHJlYWRub3cgPSAwOworCisgIGRvbnRfcmVwZWF0ICgpOworCisgIGlmIChhcmdzID09IE5VTEwpCisgICAgeworICAgICAgaWYgKChoYXZlX2Z1bGxfc3ltYm9scyAoKSB8fCBoYXZlX3BhcnRpYWxfc3ltYm9scyAoKSkKKwkgICYmIGZyb21fdHR5CisJICAmJiAhcXVlcnkgKCJEaXNjYXJkIHN5bWJvbCB0YWJsZSBmcm9tIGAlcyc/ICIsCisJCSAgICAgc3ltZmlsZV9vYmpmaWxlIC0+IG5hbWUpKQorCWVycm9yICgiTm90IGNvbmZpcm1lZC4iKTsKKyAgICAgIGZyZWVfYWxsX29iamZpbGVzICgpOworCisgICAgICAvKiBzb2xpYiBkZXNjcmlwdG9ycyBtYXkgaGF2ZSBoYW5kbGVzIHRvIG9iamZpbGVzLiAgU2luY2UgdGhlaXIKKyAgICAgICAgIHN0b3JhZ2UgaGFzIGp1c3QgYmVlbiByZWxlYXNlZCwgd2UnZCBiZXR0ZXIgd2lwZSB0aGUgc29saWIKKyAgICAgICAgIGRlc2NyaXB0b3JzIGFzIHdlbGwuCisgICAgICAgICAqLworI2lmIGRlZmluZWQoU09MSUJfUkVTVEFSVCkKKyAgICAgIFNPTElCX1JFU1RBUlQgKCk7CisjZW5kaWYKKworICAgICAgc3ltZmlsZV9vYmpmaWxlID0gTlVMTDsKKyAgICAgIGlmIChmcm9tX3R0eSkKKwl7CisJICBwcmludGZfdW5maWx0ZXJlZCAoIk5vIHN5bWJvbCBmaWxlIG5vdy5cbiIpOworCX0KKyNpZmRlZiBIUFVYSFBQQQorICAgICAgUkVTRVRfSFBfVVhfR0xPQkFMUyAoKTsKKyNlbmRpZgorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICgoYXJndiA9IGJ1aWxkYXJndiAoYXJncykpID09IE5VTEwpCisJeworCSAgbm9tZW0gKDApOworCX0KKyAgICAgIGNsZWFudXBzID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVhcmd2LCAoY2hhciAqKSBhcmd2KTsKKyAgICAgIHdoaWxlICgqYXJndiAhPSBOVUxMKQorCXsKKwkgIGlmIChTVFJFUSAoKmFyZ3YsICItbWFwcGVkIikpCisJICAgIHsKKwkgICAgICBtYXBwZWQgPSAxOworCSAgICB9CisJICBlbHNlIGlmIChTVFJFUSAoKmFyZ3YsICItcmVhZG5vdyIpKQorCSAgICB7CisJICAgICAgcmVhZG5vdyA9IDE7CisJICAgIH0KKwkgIGVsc2UgaWYgKCoqYXJndiA9PSAnLScpCisJICAgIHsKKwkgICAgICBlcnJvciAoInVua25vd24gb3B0aW9uIGAlcyciLCAqYXJndik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworICAgICAgICAgICAgY2hhciAqcDsKKworICAgICAgICAgICAgICBuYW1lID0gKmFyZ3Y7CisKKyAgICAgICAgICAgICAgLyogdGhpcyBpcyBmb3Igcm9tYnVnIHJlbW90ZSBvbmx5LCB0byBnZXQgdGhlIHRleHQgcmVsb2NhdGlvbiBieQorICAgICAgICAgICAgICB1c2luZyBsaW5rIGNvbW1hbmQgKi8KKyAgICAgICAgICAgICAgcCA9IHN0cnJjaHIobmFtZSwgJy8nKTsKKyAgICAgICAgICAgICAgaWYgKHAgIT0gTlVMTCkgcCsrOworICAgICAgICAgICAgICBlbHNlIHAgPSBuYW1lOworCisgICAgICAgICAgICAgIHRhcmdldF9saW5rKHAsICZ0ZXh0X3JlbG9jYXRpb24pOworCisgICAgICAgICAgICAgIGlmICh0ZXh0X3JlbG9jYXRpb24gPT0gKENPUkVfQUREUikwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgZWxzZSBpZiAodGV4dF9yZWxvY2F0aW9uID09IChDT1JFX0FERFIpLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3ltYm9sX2ZpbGVfYWRkIChuYW1lLCBmcm9tX3R0eSwgKENPUkVfQUREUikwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgbWFwcGVkLCByZWFkbm93LCAxLCAwKTsKKyNpZmRlZiBIUFVYSFBQQQorICAgICAgICAgICAgICAgICAgUkVTRVRfSFBfVVhfR0xPQkFMUyAoKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN5bWJvbF9maWxlX2FkZCAobmFtZSwgZnJvbV90dHksIChDT1JFX0FERFIpdGV4dF9yZWxvY2F0aW9uLAorCQkJCSAwLCBtYXBwZWQsIHJlYWRub3csIDEsIDApOworCisJICAgICAgLyogR2V0dGluZyBuZXcgc3ltYm9scyBtYXkgY2hhbmdlIG91ciBvcGluaW9uIGFib3V0IHdoYXQgaXMKKwkJIGZyYW1lbGVzcy4gICovCisJICAgICAgcmVpbml0X2ZyYW1lX2NhY2hlICgpOworCisgICAgICAgICAgICAgIHNldF9pbml0aWFsX2xhbmd1YWdlICgpOworCSAgICB9CisJICBhcmd2Kys7CisJfQorCisgICAgICBpZiAobmFtZSA9PSBOVUxMKQorCXsKKwkgIGVycm9yICgibm8gc3ltYm9sIGZpbGUgbmFtZSB3YXMgc3BlY2lmaWVkIik7CisJfQorICAgICAgVFVJRE8oKChUdWlPcGFxdWVGdW5jUHRyKXR1aURpc3BsYXlNYWluRnVuY3Rpb24pKTsKKyAgICAgIGRvX2NsZWFudXBzIChjbGVhbnVwcyk7CisgICAgfQorfQorCisvKiBTZXQgdGhlIGluaXRpYWwgbGFuZ3VhZ2UuCisKKyAgIEEgYmV0dGVyIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHJlY29yZCB0aGUgbGFuZ3VhZ2UgaW4gdGhlIHBzeW10YWIgd2hlbiByZWFkaW5nCisgICBwYXJ0aWFsIHN5bWJvbHMsIGFuZCB0aGVuIHVzZSBpdCAoaWYga25vd24pIHRvIHNldCB0aGUgbGFuZ3VhZ2UuICBUaGlzIHdvdWxkCisgICBiZSBhIHdpbiBmb3IgZm9ybWF0cyB0aGF0IGVuY29kZSB0aGUgbGFuZ3VhZ2UgaW4gYW4gZWFzaWx5IGRpc2NvdmVyYWJsZSBwbGFjZSwKKyAgIHN1Y2ggYXMgRFdBUkYuICBGb3Igc3RhYnMsIHdlIGNhbiBqdW1wIHRocm91Z2ggaG9vcHMgbG9va2luZyBmb3Igc3BlY2lhbGx5CisgICBuYW1lZCBzeW1ib2xzIG9yIHRyeSB0byBpbnR1aXQgdGhlIGxhbmd1YWdlIGZyb20gdGhlIHNwZWNpZmljIHR5cGUgb2Ygc3RhYnMKKyAgIHdlIGZpbmQsIGJ1dCB3ZSBjYW4ndCBkbyB0aGF0IHVudGlsIGxhdGVyIHdoZW4gd2UgcmVhZCBpbiBmdWxsIHN5bWJvbHMuCisgICBGSVhNRS4gICovCisKK3N0YXRpYyB2b2lkCitzZXRfaW5pdGlhbF9sYW5ndWFnZSAoKQoreworICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdDsKKyAgZW51bSBsYW5ndWFnZSBsYW5nID0gbGFuZ3VhZ2VfdW5rbm93bjsgIAkKKworICBwc3QgPSBmaW5kX21haW5fcHN5bXRhYiAoKTsKKyAgaWYgKHBzdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChwc3QgLT4gZmlsZW5hbWUgIT0gTlVMTCkKKwl7CisJICBsYW5nID0gZGVkdWNlX2xhbmd1YWdlX2Zyb21fZmlsZW5hbWUgKHBzdCAtPiBmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICAgIGlmIChsYW5nID09IGxhbmd1YWdlX3Vua25vd24pCisJeworCSAgICAvKiBNYWtlIEMgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgKi8KKwkgICAgbGFuZyA9IGxhbmd1YWdlX2M7CisJfQorICAgICAgc2V0X2xhbmd1YWdlIChsYW5nKTsKKyAgICAgIGV4cGVjdGVkX2xhbmd1YWdlID0gY3VycmVudF9sYW5ndWFnZTsJLyogRG9uJ3Qgd2FybiB0aGUgdXNlciAqLworICAgIH0KK30KKworLyogT3BlbiBmaWxlIHNwZWNpZmllZCBieSBOQU1FIGFuZCBoYW5kIGl0IG9mZiB0byBCRkQgZm9yIHByZWxpbWluYXJ5CisgICBhbmFseXNpcy4gIFJlc3VsdCBpcyBhIG5ld2x5IGluaXRpYWxpemVkIGJmZCAqLCB3aGljaCBpbmNsdWRlcyBhIG5ld2x5CisgICBtYWxsb2MnZGAgY29weSBvZiBOQU1FICh0aWxkZS1leHBhbmRlZCBhbmQgbWFkZSBhYnNvbHV0ZSkuCisgICBJbiBjYXNlIG9mIHRyb3VibGUsIGVycm9yKCkgaXMgY2FsbGVkLiAgKi8KKworYmZkICoKK3N5bWZpbGVfYmZkX29wZW4gKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7Cit7CisgIGJmZCAqc3ltX2JmZDsKKyAgaW50IGRlc2M7CisgIGNoYXIgKmFic29sdXRlX25hbWU7CisKKworCisgIG5hbWUgPSB0aWxkZV9leHBhbmQgKG5hbWUpOwkvKiBSZXR1cm5zIDFzdCBuZXcgbWFsbG9jJ2QgY29weSAqLworCisgIC8qIExvb2sgZG93biBwYXRoIGZvciBpdCwgYWxsb2NhdGUgMm5kIG5ldyBtYWxsb2MnZCBjb3B5LiAgKi8KKyAgZGVzYyA9IG9wZW5wIChnZXRlbnYgKCJQQVRIIiksIDEsIG5hbWUsIE9fUkRPTkxZIHwgT19CSU5BUlksIDAsICZhYnNvbHV0ZV9uYW1lKTsKKyNpZiBkZWZpbmVkKF9fR08zMl9fKSB8fCBkZWZpbmVkKF9XSU4zMikKKyAgaWYgKGRlc2MgPCAwKQorICAgIHsKKyAgICAgIGNoYXIgKmV4ZW5hbWUgPSBhbGxvY2EgKHN0cmxlbiAobmFtZSkgKyA1KTsKKyAgICAgIHN0cmNhdCAoc3RyY3B5IChleGVuYW1lLCBuYW1lKSwgIi5leGUiKTsKKyAgICAgIGRlc2MgPSBvcGVucCAoZ2V0ZW52ICgiUEFUSCIpLCAxLCBleGVuYW1lLCBPX1JET05MWSB8IE9fQklOQVJZLAorICAgICAgICAgICAgICAgICAgICAwLCAmYWJzb2x1dGVfbmFtZSk7CisgICAgfQorI2VuZGlmCisgIGlmIChkZXNjIDwgMCkKKyAgICB7CisgICAgICBtYWtlX2NsZWFudXAgKGZyZWUsIG5hbWUpOworICAgICAgcGVycm9yX3dpdGhfbmFtZSAobmFtZSk7CisgICAgfQorICBmcmVlIChuYW1lKTsJCQkvKiBGcmVlIDFzdCBuZXcgbWFsbG9jJ2QgY29weSAqLworICBuYW1lID0gYWJzb2x1dGVfbmFtZTsJCS8qIEtlZXAgMm5kIG1hbGxvYydkIGNvcHkgaW4gYmZkICovCisJCQkJLyogSXQnbGwgYmUgZnJlZWQgaW4gZnJlZV9vYmpmaWxlKCkuICovCisKKyAgc3ltX2JmZCA9IGJmZF9mZG9wZW5yIChuYW1lLCBnbnV0YXJnZXQsIGRlc2MpOworICBpZiAoIXN5bV9iZmQpCisgICAgeworICAgICAgY2xvc2UgKGRlc2MpOworICAgICAgbWFrZV9jbGVhbnVwIChmcmVlLCBuYW1lKTsKKyAgICAgIGVycm9yICgiXCIlc1wiOiBjYW4ndCBvcGVuIHRvIHJlYWQgc3ltYm9sczogJXMuIiwgbmFtZSwKKwkgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKyAgICB9CisgIHN5bV9iZmQtPmNhY2hlYWJsZSA9IHRydWU7CisKKyAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0IChzeW1fYmZkLCBiZmRfb2JqZWN0KSkKKyAgICB7CisgICAgICAvKiBGSVhNRTogc2hvdWxkIGJlIGNoZWNraW5nIGZvciBlcnJvcnMgZnJvbSBiZmRfY2xvc2UgKGZvciBvbmUgdGhpbmcsCisJIG9uIGVycm9yIGl0IGRvZXMgbm90IGZyZWUgYWxsIHRoZSBzdG9yYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUKKwkgYmZkKS4gICovCisgICAgICBiZmRfY2xvc2UgKHN5bV9iZmQpOwkvKiBUaGlzIGFsc28gY2xvc2VzIGRlc2MgKi8KKyAgICAgIG1ha2VfY2xlYW51cCAoZnJlZSwgbmFtZSk7CisgICAgICBlcnJvciAoIlwiJXNcIjogY2FuJ3QgcmVhZCBzeW1ib2xzOiAlcy4iLCBuYW1lLAorCSAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICAgIH0KKyAgcmV0dXJuIChzeW1fYmZkKTsKK30KKworLyogTGluayBhIG5ldyBzeW10YWJfZm5zIGludG8gdGhlIGdsb2JhbCBzeW10YWJfZm5zIGxpc3QuICBDYWxsZWQgb24gZ2RiCisgICBzdGFydHVwIGJ5IHRoZSBfaW5pdGlhbGl6ZSByb3V0aW5lIGluIGVhY2ggb2JqZWN0IGZpbGUgZm9ybWF0IHJlYWRlciwKKyAgIHRvIHJlZ2lzdGVyIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggZm9ybWF0IHRoZSB0aGUgcmVhZGVyIGlzIHByZXBhcmVkCisgICB0byBoYW5kbGUuICovCisKK3ZvaWQKK2FkZF9zeW10YWJfZm5zIChzZikKKyAgICAgc3RydWN0IHN5bV9mbnMgKnNmOworeworICBzZi0+bmV4dCA9IHN5bXRhYl9mbnM7CisgIHN5bXRhYl9mbnMgPSBzZjsKK30KKworCisvKiBJbml0aWFsaXplIHRvIHJlYWQgc3ltYm9scyBmcm9tIHRoZSBzeW1ib2wgZmlsZSBzeW1fYmZkLiAgSXQgZWl0aGVyCisgICByZXR1cm5zIG9yIGNhbGxzIGVycm9yKCkuICBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWxpemVkIHN0cnVjdCBzeW1fZm5zCisgICBpbiB0aGUgb2JqZmlsZSBzdHJ1Y3R1cmUsIHRoYXQgY29udGFpbnMgY2FjaGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgc3ltYm9sIGZpbGUuICAqLworCitzdGF0aWMgdm9pZAorZmluZF9zeW1fZm5zIChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IHN5bV9mbnMgKnNmOworICBlbnVtIGJmZF9mbGF2b3VyIG91cl9mbGF2b3VyID0gYmZkX2dldF9mbGF2b3VyIChvYmpmaWxlIC0+IG9iZmQpOworICBjaGFyICpvdXJfdGFyZ2V0ID0gYmZkX2dldF90YXJnZXQgKG9iamZpbGUgLT4gb2JmZCk7CisKKyAgLyogU3BlY2lhbCBrbHVkZ2UgZm9yIFJTLzYwMDAgYW5kIFBvd2VyTWFjLiAgU2VlIHhjb2ZmcmVhZC5jLiAgKi8KKyAgaWYgKFNUUkVRIChvdXJfdGFyZ2V0LCAiYWl4Y29mZi1yczYwMDAiKSB8fAorICAgICAgU1RSRVEgKG91cl90YXJnZXQsICJ4Y29mZi1wb3dlcm1hYyIpKQorICAgIG91cl9mbGF2b3VyID0gKGVudW0gYmZkX2ZsYXZvdXIpLTE7CisKKyAgLyogU3BlY2lhbCBrbHVkZ2UgZm9yIGFwb2xsby4gIFNlZSBkc3RyZWFkLmMuICAqLworICBpZiAoU1RSRVFOIChvdXJfdGFyZ2V0LCAiYXBvbGxvIiwgNikpCisgICAgb3VyX2ZsYXZvdXIgPSAoZW51bSBiZmRfZmxhdm91ciktMjsKKworICBmb3IgKHNmID0gc3ltdGFiX2Zuczsgc2YgIT0gTlVMTDsgc2YgPSBzZiAtPiBuZXh0KQorICAgIHsKKyAgICAgIGlmIChvdXJfZmxhdm91ciA9PSBzZiAtPiBzeW1fZmxhdm91cikKKwl7CisJICBvYmpmaWxlIC0+IHNmID0gc2Y7CisJICByZXR1cm47CisJfQorICAgIH0KKyAgZXJyb3IgKCJJJ20gc29ycnksIERhdmUsIEkgY2FuJ3QgZG8gdGhhdC4gIFN5bWJvbCBmb3JtYXQgYCVzJyB1bmtub3duLiIsCisJIGJmZF9nZXRfdGFyZ2V0IChvYmpmaWxlIC0+IG9iZmQpKTsKK30KKwwKKy8qIFRoaXMgZnVuY3Rpb24gcnVucyB0aGUgbG9hZCBjb21tYW5kIG9mIG91ciBjdXJyZW50IHRhcmdldC4gICovCisKK3N0YXRpYyB2b2lkCitsb2FkX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAoYXJnID09IE5VTEwpCisgICAgYXJnID0gZ2V0X2V4ZWNfZmlsZSAoMSk7CisgIHRhcmdldF9sb2FkIChhcmcsIGZyb21fdHR5KTsKK30KKworLyogVGhpcyB2ZXJzaW9uIG9mICJsb2FkIiBzaG91bGQgYmUgdXNhYmxlIGZvciBhbnkgdGFyZ2V0LiAgQ3VycmVudGx5CisgICBpdCBpcyBqdXN0IHVzZWQgZm9yIHJlbW90ZSB0YXJnZXRzLCBub3QgaW5mdGFyZy5jIG9yIGNvcmUgZmlsZXMsCisgICBvbiB0aGUgdGhlb3J5IHRoYXQgb25seSBpbiB0aGF0IGNhc2UgaXMgaXQgdXNlZnVsLgorCisgICBBdm9pZGluZyB4bW9kZW0gYW5kIHRoZSBsaWtlIHNlZW1zIGxpa2UgYSB3aW4gKGEpIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZQorICAgdG8gd29ycnkgYWJvdXQgZmluZGluZyBpdCwgYW5kIChiKSBPbiBWTVMsIGZvcmsoKSBpcyB2ZXJ5IHNsb3cgYW5kIHNvCisgICB3ZSBkb24ndCB3YW50IHRvIHJ1biBhIHN1YnByb2Nlc3MuICBPbiB0aGUgb3RoZXIgaGFuZCwgSSdtIG5vdCBzdXJlIGhvdworICAgcGVyZm9ybWFuY2UgY29tcGFyZXMuICAqLworI2RlZmluZSBHRU5FUklDX0xPQURfQ0hVTksgMjU2CisjZGVmaW5lIFZBTElEQVRFX0RPV05MT0FEIDAKK3ZvaWQKK2dlbmVyaWNfbG9hZCAoZmlsZW5hbWUsIGZyb21fdHR5KQorICAgIGNoYXIgKmZpbGVuYW1lOworICAgIGludCBmcm9tX3R0eTsKK3sKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jbGVhbnVwczsKKyAgYXNlY3Rpb24gKnM7CisgIGJmZCAqbG9hZGZpbGVfYmZkOworICB0aW1lX3Qgc3RhcnRfdGltZSwgZW5kX3RpbWU7CS8qIFN0YXJ0IGFuZCBlbmQgdGltZXMgb2YgZG93bmxvYWQgKi8KKyAgdW5zaWduZWQgbG9uZyBkYXRhX2NvdW50ID0gMDsJLyogTnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHRvIG1lbW9yeSAqLworICBpbnQgbjsgCisgIHVuc2lnbmVkIGxvbmcgbG9hZF9vZmZzZXQgPSAwOyAJLyogb2Zmc2V0IHRvIGFkZCB0byB2bWEgZm9yIGVhY2ggc2VjdGlvbiAqLworICBjaGFyIGJ1ZltHRU5FUklDX0xPQURfQ0hVTksrOF07CisjaWYgVkFMSURBVEVfRE9XTkxPQUQgIAorICBjaGFyIHZlcmlmeV9idWZmZXJbR0VORVJJQ19MT0FEX0NIVU5LKzhdIDsKKyNlbmRpZiAgCisKKyAgLyogZW5hYmxlIHVzZXIgdG8gc3BlY2lmeSBhZGRyZXNzIGZvciBkb3dubG9hZGluZyBhcyAybmQgYXJnIHRvIGxvYWQgKi8KKyAgbiA9IHNzY2FuZihmaWxlbmFtZSwgIiVzIDB4JWx4IiwgYnVmLCAmbG9hZF9vZmZzZXQpOworICBpZiAobiA+IDEgKSAKKyAgICBmaWxlbmFtZSA9IGJ1ZjsKKyAgZWxzZQorICAgIGxvYWRfb2Zmc2V0ID0gMDsKKworICBsb2FkZmlsZV9iZmQgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCBnbnV0YXJnZXQpOworICBpZiAobG9hZGZpbGVfYmZkID09IE5VTEwpCisgICAgeworICAgICAgcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgLyogRklYTUU6IHNob3VsZCBiZSBjaGVja2luZyBmb3IgZXJyb3JzIGZyb20gYmZkX2Nsb3NlIChmb3Igb25lIHRoaW5nLAorICAgICBvbiBlcnJvciBpdCBkb2VzIG5vdCBmcmVlIGFsbCB0aGUgc3RvcmFnZSBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgIGJmZCkuICAqLworICBvbGRfY2xlYW51cHMgPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgYmZkX2Nsb3NlLCBsb2FkZmlsZV9iZmQpOworCisgIGlmICghYmZkX2NoZWNrX2Zvcm1hdCAobG9hZGZpbGVfYmZkLCBiZmRfb2JqZWN0KSkgCisgICAgeworICAgICAgZXJyb3IgKCJcIiVzXCIgaXMgbm90IGFuIG9iamVjdCBmaWxlOiAlcyIsIGZpbGVuYW1lLAorCSAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICAgIH0KKyAgCisgIHN0YXJ0X3RpbWUgPSB0aW1lIChOVUxMKTsKKworICBmb3IgKHMgPSBsb2FkZmlsZV9iZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkgCisgICAgeworICAgICAgaWYgKHMtPmZsYWdzICYgU0VDX0xPQUQpIAorICAgICAgICB7CisgICAgICAgICAgYmZkX3NpemVfdHlwZSBzaXplOworCisgICAgICAgICAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAocyk7CisgICAgICAgICAgaWYgKHNpemUgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjaGFyICpidWZmZXI7CisgICAgICAgICAgICAgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisgICAgICAgICAgICAgIGJmZF92bWEgbG1hOworICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGwgPSBzaXplIDsKKyAgICAgICAgICAgICAgaW50IGVycjsKKyAgICAgICAgICAgICAgY2hhciAqc2VjdDsKKyAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzZW50OworICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxlbjsKKwkgICAgICAKKwkgICAgICBsID0gbCA+IEdFTkVSSUNfTE9BRF9DSFVOSyA/IEdFTkVSSUNfTE9BRF9DSFVOSyA6IGwgOworCisgICAgICAgICAgICAgIGJ1ZmZlciA9IHhtYWxsb2MgKHNpemUpOworICAgICAgICAgICAgICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKGZyZWUsIGJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgbG1hID0gcy0+bG1hOworICAgICAgICAgICAgICBsbWEgKz0gbG9hZF9vZmZzZXQ7CisKKyAgICAgICAgICAgICAgLyogSXMgdGhpcyByZWFsbHkgbmVjZXNzYXJ5PyAgSSBndWVzcyBpdCBnaXZlcyB0aGUgdXNlciBzb21ldGhpbmcKKyAgICAgICAgICAgICAgICAgdG8gbG9vayBhdCBkdXJpbmcgYSBsb25nIGRvd25sb2FkLiAgKi8KKyAgICAgICAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiTG9hZGluZyBzZWN0aW9uICVzLCBzaXplIDB4JWx4IGxtYSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChsb2FkZmlsZV9iZmQsIHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBzaXplKTsKKyAgICAgICAgICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChsbWEsIDEsIGdkYl9zdGRvdXQpOworICAgICAgICAgICAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworCisgICAgICAgICAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAobG9hZGZpbGVfYmZkLCBzLCBidWZmZXIsIDAsIHNpemUpOworCisgICAgICAgICAgICAgIHNlY3QgPSAoY2hhciAqKSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAobG9hZGZpbGVfYmZkLCBzKTsKKyAgICAgICAgICAgICAgc2VudCA9IDA7CisgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgbGVuID0gKHNpemUgLSBzZW50KSA8IGwgPyAoc2l6ZSAtIHNlbnQpIDogbDsKKyAgICAgICAgICAgICAgICAgIHNlbnQgKz0gbGVuOworICAgICAgICAgICAgICAgICAgZXJyID0gdGFyZ2V0X3dyaXRlX21lbW9yeSAobG1hLCBidWZmZXIsIGxlbik7CisgICAgICAgICAgICAgICAgICBpZiAodWlfbG9hZF9wcm9ncmVzc19ob29rKQorICAgICAgICAgICAgICAgICAgICBpZiAodWlfbG9hZF9wcm9ncmVzc19ob29rIChzZWN0LCBzZW50KSkKKwkJICAgICAgZXJyb3IgKCJDYW5jZWxlZCB0aGUgZG93bmxvYWQiKTsKKyNpZiBWQUxJREFURV9ET1dOTE9BRAorCQkgIC8qIEJyb2tlbiBtZW1vcmllcyBhbmQgYnJva2VuIG1vbml0b3JzIG1hbmlmZXN0IHRoZW1zZWx2ZXMKKwkJICAgICBoZXJlIHdoZW4gYnJpbmcgbmV3IGNvbXB1dGVycyB0byBsaWZlLgorCQkgICAgIFRoaXMgZG91YmxlcyBhbHJlYWR5IHNsb3cgZG93bmxvYWRzLgorCQkgICovCisJCSAgaWYgKGVycikgYnJlYWsgOworCQkgIHsKKwkJICAgIHRhcmdldF9yZWFkX21lbW9yeShsbWEsdmVyaWZ5X2J1ZmZlcixsZW4pIDsKKwkJICAgIGlmICgwICE9IGJjbXAoYnVmZmVyLHZlcmlmeV9idWZmZXIsbGVuKSkKKwkJICAgICAgZXJyb3IoIkRvd25sb2FkIHZlcmlmeSBmYWlsZWQgYXQgJTA4eCIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpbG1hKSA7CisJCSAgfQorCisjZW5kaWYKKwkJICBkYXRhX2NvdW50ICs9IGxlbiA7CisgICAgICAgICAgICAgICAgICBsbWEgICs9IGxlbjsKKyAgICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBsZW47CisgICAgICAgICAgICAgICAgfSAvKiBvZCAqLworICAgICAgICAgICAgICB3aGlsZSAoZXJyID09IDAgJiYgc2VudCA8IHNpemUpOworCisgICAgICAgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgICAgICBlcnJvciAoIk1lbW9yeSBhY2Nlc3MgZXJyb3Igd2hpbGUgbG9hZGluZyBzZWN0aW9uICVzLiIsIAorICAgICAgICAgICAgICAgICAgICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAobG9hZGZpbGVfYmZkLCBzKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIGVuZF90aW1lID0gdGltZSAoTlVMTCk7CisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGVudHJ5IDsKKyAgICBlbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyhsb2FkZmlsZV9iZmQpIDsKKyAgICBwcmludGZfZmlsdGVyZWQgKCJTdGFydCBhZGRyZXNzIDB4JWx4ICwgbG9hZCBzaXplICVkXG4iLCBlbnRyeSxkYXRhX2NvdW50KTsKKyAgICAvKiBXZSB3ZXJlIGRvaW5nIHRoaXMgaW4gcmVtb3RlLW1pcHMuYywgSSBzdXNwZWN0IGl0IGlzIHJpZ2h0CisgICAgICAgZm9yIG90aGVyIHRhcmdldHMgdG9vLiAgKi8KKyAgICB3cml0ZV9wYyAoZW50cnkpOworICB9CisKKyAgLyogRklYTUU6IGFyZSB3ZSBzdXBwb3NlZCB0byBjYWxsIHN5bWJvbF9maWxlX2FkZCBvciBub3Q/ICBBY2NvcmRpbmcgdG8KKyAgICAgYSBjb21tZW50IGZyb20gcmVtb3RlLW1pcHMuYyAod2hlcmUgYSBjYWxsIHRvIHN5bWJvbF9maWxlX2FkZCB3YXMKKyAgICAgY29tbWVudGVkIG91dCksIG1ha2luZyB0aGUgY2FsbCBjb25mdXNlcyBHREIgaWYgbW9yZSB0aGFuIG9uZSBmaWxlIGlzCisgICAgIGxvYWRlZCBpbi4gIHJlbW90ZS1uaW5keS5jIGhhZCBubyBjYWxsIHRvIHN5bWJvbF9maWxlX2FkZCwgYnV0IHJlbW90ZS12eC5jCisgICAgIGRvZXMuICAqLworCisgIHJlcG9ydF90cmFuc2Zlcl9wZXJmb3JtYW5jZSAoZGF0YV9jb3VudCwgc3RhcnRfdGltZSwgZW5kX3RpbWUpOworCisgIGRvX2NsZWFudXBzIChvbGRfY2xlYW51cHMpOworfQorCisvKiBSZXBvcnQgaG93IGZhc3QgdGhlIHRyYW5zZmVyIHdlbnQuICovCisKK3ZvaWQKK3JlcG9ydF90cmFuc2Zlcl9wZXJmb3JtYW5jZSAoZGF0YV9jb3VudCwgc3RhcnRfdGltZSwgZW5kX3RpbWUpCit1bnNpZ25lZCBsb25nIGRhdGFfY291bnQ7Cit0aW1lX3Qgc3RhcnRfdGltZSwgZW5kX3RpbWU7Cit7CisgIHByaW50Zl9maWx0ZXJlZCAoIlRyYW5zZmVyIHJhdGU6ICIpOworICBpZiAoZW5kX3RpbWUgIT0gc3RhcnRfdGltZSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIlZCBiaXRzL3NlYyIsCisJCSAgICAgKGRhdGFfY291bnQgKiA4KSAvIChlbmRfdGltZSAtIHN0YXJ0X3RpbWUpKTsKKyAgZWxzZQorICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkIGJpdHMgaW4gPDEgc2VjIiwgKGRhdGFfY291bnQgKiA4KSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIi5cbiIpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgYWRkaXRpb24gb2YgaW5jcmVtZW50YWxseSBsaW5rZWQgb2JqZWN0IGZpbGVzLgorICAgSXQgZG9lcyBub3QgbW9kaWZ5IGFueSBzdGF0ZSBpbiB0aGUgdGFyZ2V0LCBvbmx5IGluIHRoZSBkZWJ1Z2dlci4gICovCisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorYWRkX3N5bWJvbF9maWxlX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoYXIgKm5hbWUgPSBOVUxMOworICBDT1JFX0FERFIgdGV4dF9hZGRyOworICBjaGFyICphcmc7CisgIGludCByZWFkbm93ID0gMDsKKyAgaW50IG1hcHBlZCA9IDA7CisgIAorICBkb250X3JlcGVhdCAoKTsKKworICBpZiAoYXJncyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGVycm9yICgiYWRkLXN5bWJvbC1maWxlIHRha2VzIGEgZmlsZSBuYW1lIGFuZCBhbiBhZGRyZXNzIik7CisgICAgfQorCisgIC8qIE1ha2UgYSBjb3B5IG9mIHRoZSBzdHJpbmcgdGhhdCB3ZSBjYW4gc2FmZWx5IHdyaXRlIGludG8uICovCisKKyAgYXJncyA9IHN0cmR1cCAoYXJncyk7CisgIG1ha2VfY2xlYW51cCAoZnJlZSwgYXJncyk7CisKKyAgLyogUGljayBvZmYgYW55IC1vcHRpb24gYXJncyBhbmQgdGhlIGZpbGUgbmFtZS4gKi8KKworICB3aGlsZSAoKCphcmdzICE9ICdcMDAwJykgJiYgKG5hbWUgPT0gTlVMTCkpCisgICAgeworICAgICAgd2hpbGUgKGlzc3BhY2UgKCphcmdzKSkge2FyZ3MrKzt9CisgICAgICBhcmcgPSBhcmdzOworICAgICAgd2hpbGUgKCgqYXJncyAhPSAnXDAwMCcpICYmICFpc3NwYWNlICgqYXJncykpIHthcmdzKys7fQorICAgICAgaWYgKCphcmdzICE9ICdcMDAwJykKKwl7CisJICAqYXJncysrID0gJ1wwMDAnOworCX0KKyAgICAgIGlmICgqYXJnICE9ICctJykKKwl7CisJICBuYW1lID0gYXJnOworCX0KKyAgICAgIGVsc2UgaWYgKFNUUkVRIChhcmcsICItbWFwcGVkIikpCisJeworCSAgbWFwcGVkID0gMTsKKwl9CisgICAgICBlbHNlIGlmIChTVFJFUSAoYXJnLCAiLXJlYWRub3ciKSkKKwl7CisJICByZWFkbm93ID0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZXJyb3IgKCJ1bmtub3duIG9wdGlvbiBgJXMnIiwgYXJnKTsKKwl9CisgICAgfQorCisgIC8qIEFmdGVyIHBpY2tpbmcgb2ZmIGFueSBvcHRpb25zIGFuZCB0aGUgZmlsZSBuYW1lLCBhcmdzIHNob3VsZCBiZQorICAgICBsZWZ0IHBvaW50aW5nIGF0IHRoZSByZW1haW5kZXIgb2YgdGhlIGNvbW1hbmQgbGluZSwgd2hpY2ggc2hvdWxkCisgICAgIGJlIHRoZSBhZGRyZXNzIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuICovCisKKyAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICBlcnJvciAoImFkZC1zeW1ib2wtZmlsZSB0YWtlcyBhIGZpbGUgbmFtZSIpOworICAgIH0KKyAgbmFtZSA9IHRpbGRlX2V4cGFuZCAobmFtZSk7CisgIG1ha2VfY2xlYW51cCAoZnJlZSwgbmFtZSk7CisKKyAgaWYgKCphcmdzICE9ICdcMDAwJykKKyAgICB7CisgICAgICB0ZXh0X2FkZHIgPSBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIChhcmdzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB0YXJnZXRfbGluayhuYW1lLCAmdGV4dF9hZGRyKTsKKyAgICAgIGlmICh0ZXh0X2FkZHIgPT0gKENPUkVfQUREUiktMSkKKwllcnJvcigiRG9uJ3Qga25vdyBob3cgdG8gZ2V0IHRleHQgc3RhcnQgbG9jYXRpb24gZm9yIHRoaXMgZmlsZSIpOworICAgIH0KKworICAvKiBGSVhNRS0zMng2NDogQXNzdW1lcyB0ZXh0X2FkZHIgZml0cyBpbiBhIGxvbmcuICAqLworICBpZiAoKGZyb21fdHR5KQorICAgICAgJiYgKCFxdWVyeSAoImFkZCBzeW1ib2wgdGFibGUgZnJvbSBmaWxlIFwiJXNcIiBhdCB0ZXh0X2FkZHIgPSAlcz9cbiIsCisJICAgICAgICAgIG5hbWUsIGxvY2FsX2hleF9zdHJpbmcgKCh1bnNpZ25lZCBsb25nKXRleHRfYWRkcikpKSkKKyAgICBlcnJvciAoIk5vdCBjb25maXJtZWQuIik7CisKKyAgc3ltYm9sX2ZpbGVfYWRkIChuYW1lLCBmcm9tX3R0eSwgdGV4dF9hZGRyLCAwLCBtYXBwZWQsIHJlYWRub3csCisgICAgICAgICAgICAgICAgICAgMSwgIC8qIHVzZXJfbG9hZGVkICovCisgICAgICAgICAgICAgICAgICAgMCk7IC8qIFdlJ2xsIGd1ZXNzIGl0J3MgISBpc19zb2xpYiAqLworCisgIC8qIEdldHRpbmcgbmV3IHN5bWJvbHMgbWF5IGNoYW5nZSBvdXIgb3BpbmlvbiBhYm91dCB3aGF0IGlzCisgICAgIGZyYW1lbGVzcy4gICovCisgIHJlaW5pdF9mcmFtZV9jYWNoZSAoKTsKK30KKwwKK3N0YXRpYyB2b2lkCithZGRfc2hhcmVkX3N5bWJvbF9maWxlc19jb21tYW5kICAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyNpZmRlZiBBRERfU0hBUkVEX1NZTUJPTF9GSUxFUworICBBRERfU0hBUkVEX1NZTUJPTF9GSUxFUyAoYXJncywgZnJvbV90dHkpOworI2Vsc2UKKyAgZXJyb3IgKCJUaGlzIGNvbW1hbmQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24gb2YgR0RCLiIpOworI2VuZGlmICAKK30KKwwKKy8qIFJlLXJlYWQgc3ltYm9scyBpZiBhIHN5bWJvbC1maWxlIGhhcyBjaGFuZ2VkLiAgKi8KK3ZvaWQKK3JlcmVhZF9zeW1ib2xzICgpCit7CisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICBsb25nIG5ld19tb2R0aW1lOworICBpbnQgcmVyZWFkX29uZSA9IDA7CisgIHN0cnVjdCBzdGF0IG5ld19zdGF0YnVmOworICBpbnQgcmVzOworCisgIC8qIFdpdGggdGhlIGFkZGl0aW9uIG9mIHNoYXJlZCBsaWJyYXJpZXMsIHRoaXMgc2hvdWxkIGJlIG1vZGlmaWVkLAorICAgICB0aGUgbG9hZCB0aW1lIHNob3VsZCBiZSBzYXZlZCBpbiB0aGUgcGFydGlhbCBzeW1ib2wgdGFibGVzLCBzaW5jZQorICAgICBkaWZmZXJlbnQgdGFibGVzIG1heSBjb21lIGZyb20gZGlmZmVyZW50IHNvdXJjZSBmaWxlcy4gIEZJWE1FLgorICAgICBUaGlzIHJvdXRpbmUgc2hvdWxkIHRoZW4gd2FsayBkb3duIGVhY2ggcGFydGlhbCBzeW1ib2wgdGFibGUKKyAgICAgYW5kIHNlZSBpZiB0aGUgc3ltYm9sIHRhYmxlIHRoYXQgaXQgb3JpZ2luYXRlcyBmcm9tIGhhcyBiZWVuIGNoYW5nZWQgKi8KKworICBmb3IgKG9iamZpbGUgPSBvYmplY3RfZmlsZXM7IG9iamZpbGU7IG9iamZpbGUgPSBvYmpmaWxlLT5uZXh0KSB7CisgICAgaWYgKG9iamZpbGUtPm9iZmQpIHsKKyNpZmRlZiBJQk02MDAwX1RBUkdFVAorICAgICAvKiBJZiB0aGlzIG9iamVjdCBpcyBmcm9tIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4geW91IHNob3VsZAorICAgICAgICBzdGF0IG9uIHRoZSBsaWJyYXJ5IG5hbWUsIG5vdCBtZW1iZXIgbmFtZS4gKi8KKworICAgICBpZiAob2JqZmlsZS0+b2JmZC0+bXlfYXJjaGl2ZSkKKyAgICAgICByZXMgPSBzdGF0IChvYmpmaWxlLT5vYmZkLT5teV9hcmNoaXZlLT5maWxlbmFtZSwgJm5ld19zdGF0YnVmKTsKKyAgICAgZWxzZQorI2VuZGlmCisgICAgICByZXMgPSBzdGF0IChvYmpmaWxlLT5uYW1lLCAmbmV3X3N0YXRidWYpOworICAgICAgaWYgKHJlcyAhPSAwKSB7CisJLyogRklYTUUsIHNob3VsZCB1c2UgcHJpbnRfc3lzX2Vycm1zZyBidXQgaXQncyBub3QgZmlsdGVyZWQuICovCisJcHJpbnRmX2ZpbHRlcmVkICgiYCVzJyBoYXMgZGlzYXBwZWFyZWQ7IGtlZXBpbmcgaXRzIHN5bWJvbHMuXG4iLAorCQkJIG9iamZpbGUtPm5hbWUpOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgbmV3X21vZHRpbWUgPSBuZXdfc3RhdGJ1Zi5zdF9tdGltZTsKKyAgICAgIGlmIChuZXdfbW9kdGltZSAhPSBvYmpmaWxlLT5tdGltZSkKKwl7CisJICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NsZWFudXBzOworCSAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqb2Zmc2V0czsKKwkgIGludCBudW1fb2Zmc2V0czsKKwkgIGludCBzZWN0aW9uX29mZnNldHNfc2l6ZTsKKwkgIGNoYXIgKm9iZmRfZmlsZW5hbWU7CisKKwkgIHByaW50Zl9maWx0ZXJlZCAoImAlcycgaGFzIGNoYW5nZWQ7IHJlLXJlYWRpbmcgc3ltYm9scy5cbiIsCisJCQkgICBvYmpmaWxlLT5uYW1lKTsKKworCSAgLyogVGhlcmUgYXJlIHZhcmlvdXMgZnVuY3Rpb25zIGxpa2Ugc3ltYm9sX2ZpbGVfYWRkLAorCSAgICAgc3ltZmlsZV9iZmRfb3Blbiwgc3ltc19mcm9tX29iamZpbGUsIGV0Yy4sIHdoaWNoIG1pZ2h0CisJICAgICBhcHBlYXIgdG8gZG8gd2hhdCB3ZSB3YW50LiAgQnV0IHRoZXkgaGF2ZSB2YXJpb3VzIG90aGVyCisJICAgICBlZmZlY3RzIHdoaWNoIHdlICpkb24ndCogd2FudC4gIFNvIHdlIGp1c3QgZG8gc3R1ZmYKKwkgICAgIG91cnNlbHZlcy4gIFdlIGRvbid0IHdvcnJ5IGFib3V0IG1hcHBlZCBmaWxlcyAoZm9yIG9uZSB0aGluZywKKwkgICAgIGFueSBtYXBwZWQgZmlsZSB3aWxsIGJlIG91dCBvZiBkYXRlKS4gICovCisKKwkgIC8qIElmIHdlIGdldCBhbiBlcnJvciwgYmxvdyBhd2F5IHRoaXMgb2JqZmlsZSAobm90IHN1cmUgaWYKKwkgICAgIHRoYXQgaXMgdGhlIGNvcnJlY3QgcmVzcG9uc2UgZm9yIHRoaW5ncyBsaWtlIHNoYXJlZAorCSAgICAgbGlicmFyaWVzKS4gICovCisJICBvbGRfY2xlYW51cHMgPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZnJlZV9vYmpmaWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamZpbGUpOworCSAgLyogV2UgbmVlZCB0byBkbyB0aGlzIHdoZW5ldmVyIGFueSBzeW1ib2xzIGdvIGF3YXkuICAqLworCSAgbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGNsZWFyX3N5bXRhYl91c2VycywgMCk7CisKKwkgIC8qIENsZWFuIHVwIGFueSBzdGF0ZSBCRkQgaGFzIHNpdHRpbmcgYXJvdW5kLiAgV2UgZG9uJ3QgbmVlZAorCSAgICAgdG8gY2xvc2UgdGhlIGRlc2NyaXB0b3IgYnV0IEJGRCBsYWNrcyBhIHdheSBvZiBjbG9zaW5nIHRoZQorCSAgICAgQkZEIHdpdGhvdXQgY2xvc2luZyB0aGUgZGVzY3JpcHRvci4gICovCisJICBvYmZkX2ZpbGVuYW1lID0gYmZkX2dldF9maWxlbmFtZSAob2JqZmlsZS0+b2JmZCk7CisJICBpZiAoIWJmZF9jbG9zZSAob2JqZmlsZS0+b2JmZCkpCisJICAgIGVycm9yICgiQ2FuJ3QgY2xvc2UgQkZEIGZvciAlczogJXMiLCBvYmpmaWxlLT5uYW1lLAorCQkgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisJICBvYmpmaWxlLT5vYmZkID0gYmZkX29wZW5yIChvYmZkX2ZpbGVuYW1lLCBnbnV0YXJnZXQpOworCSAgaWYgKG9iamZpbGUtPm9iZmQgPT0gTlVMTCkKKwkgICAgZXJyb3IgKCJDYW4ndCBvcGVuICVzIHRvIHJlYWQgc3ltYm9scy4iLCBvYmpmaWxlLT5uYW1lKTsKKwkgIC8qIGJmZF9vcGVuciBzZXRzIGNhY2hlYWJsZSB0byB0cnVlLCB3aGljaCBpcyB3aGF0IHdlIHdhbnQuICAqLworCSAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0IChvYmpmaWxlLT5vYmZkLCBiZmRfb2JqZWN0KSkKKwkgICAgZXJyb3IgKCJDYW4ndCByZWFkIHN5bWJvbHMgZnJvbSAlczogJXMuIiwgb2JqZmlsZS0+bmFtZSwKKwkJICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCisJICAvKiBTYXZlIHRoZSBvZmZzZXRzLCB3ZSB3aWxsIG51a2UgdGhlbSB3aXRoIHRoZSByZXN0IG9mIHRoZQorCSAgICAgcHN5bWJvbF9vYnN0YWNrLiAgKi8KKwkgIG51bV9vZmZzZXRzID0gb2JqZmlsZS0+bnVtX3NlY3Rpb25zOworCSAgc2VjdGlvbl9vZmZzZXRzX3NpemUgPQorCSAgICBzaXplb2YgKHN0cnVjdCBzZWN0aW9uX29mZnNldHMpCisJICAgICAgKyBzaXplb2YgKG9iamZpbGUtPnNlY3Rpb25fb2Zmc2V0cy0+b2Zmc2V0cykgKiBudW1fb2Zmc2V0czsKKwkgIG9mZnNldHMgPSAoc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqKSBhbGxvY2EgKHNlY3Rpb25fb2Zmc2V0c19zaXplKTsKKwkgIG1lbWNweSAob2Zmc2V0cywgb2JqZmlsZS0+c2VjdGlvbl9vZmZzZXRzLCBzZWN0aW9uX29mZnNldHNfc2l6ZSk7CisKKwkgIC8qIE51a2UgYWxsIHRoZSBzdGF0ZSB0aGF0IHdlIHdpbGwgcmUtcmVhZC4gIE11Y2ggb2YgdGhlIGZvbGxvd2luZworCSAgICAgY29kZSB3aGljaCBzZXRzIHRoaW5ncyB0byBOVUxMIHJlYWxseSBpcyBuZWNlc3NhcnkgdG8gdGVsbAorCSAgICAgb3RoZXIgcGFydHMgb2YgR0RCIHRoYXQgdGhlcmUgaXMgbm90aGluZyBjdXJyZW50bHkgdGhlcmUuICAqLworCisJICAvKiBGSVhNRTogRG8gd2UgaGF2ZSB0byBmcmVlIGEgd2hvbGUgbGlua2VkIGxpc3QsIG9yIGlzIHRoaXMKKwkgICAgIGVub3VnaD8gICovCisJICBpZiAob2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLmxpc3QpCisJICAgIG1mcmVlIChvYmpmaWxlLT5tZCwgb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLmxpc3QpOworCSAgbWVtc2V0ICgmb2JqZmlsZSAtPiBnbG9iYWxfcHN5bWJvbHMsIDAsCisJCSAgc2l6ZW9mIChvYmpmaWxlIC0+IGdsb2JhbF9wc3ltYm9scykpOworCSAgaWYgKG9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5saXN0KQorCSAgICBtZnJlZSAob2JqZmlsZS0+bWQsIG9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5saXN0KTsKKwkgIG1lbXNldCAoJm9iamZpbGUgLT4gc3RhdGljX3BzeW1ib2xzLCAwLAorCQkgIHNpemVvZiAob2JqZmlsZSAtPiBzdGF0aWNfcHN5bWJvbHMpKTsKKworCSAgLyogRnJlZSB0aGUgb2JzdGFja3MgZm9yIG5vbi1yZXVzYWJsZSBvYmpmaWxlcyAqLworCSAgb2JzdGFja19mcmVlICgmb2JqZmlsZSAtPiBwc3ltYm9sX2NhY2hlLmNhY2hlLCAwKTsKKwkgIG1lbXNldCAoJm9iamZpbGUgLT4gcHN5bWJvbF9jYWNoZSwgMCwKKwkJICBzaXplb2YgKG9iamZpbGUgLT4gcHN5bWJvbF9jYWNoZSkpOworCSAgb2JzdGFja19mcmVlICgmb2JqZmlsZSAtPiBwc3ltYm9sX29ic3RhY2ssIDApOworCSAgb2JzdGFja19mcmVlICgmb2JqZmlsZSAtPiBzeW1ib2xfb2JzdGFjaywgMCk7CisJICBvYnN0YWNrX2ZyZWUgKCZvYmpmaWxlIC0+IHR5cGVfb2JzdGFjaywgMCk7CisJICBvYmpmaWxlLT5zZWN0aW9ucyA9IE5VTEw7CisJICBvYmpmaWxlLT5zeW10YWJzID0gTlVMTDsKKwkgIG9iamZpbGUtPnBzeW10YWJzID0gTlVMTDsKKwkgIG9iamZpbGUtPmZyZWVfcHN5bXRhYnMgPSBOVUxMOworCSAgb2JqZmlsZS0+bXN5bWJvbHMgPSBOVUxMOworCSAgb2JqZmlsZS0+bWluaW1hbF9zeW1ib2xfY291bnQ9IDA7CisJICBvYmpmaWxlLT5mdW5kYW1lbnRhbF90eXBlcyA9IE5VTEw7CisJICBpZiAob2JqZmlsZSAtPiBzZiAhPSBOVUxMKQorCSAgICB7CisJICAgICAgKCpvYmpmaWxlIC0+IHNmIC0+IHN5bV9maW5pc2gpIChvYmpmaWxlKTsKKwkgICAgfQorCisJICAvKiBXZSBuZXZlciBtYWtlIHRoaXMgYSBtYXBwZWQgZmlsZS4gICovCisJICBvYmpmaWxlIC0+IG1kID0gTlVMTDsKKwkgIC8qIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uIGFsc28gaW5pdGlhbGl6ZXMgdGhlIG9ic3RhY2sgc28KKwkgICAgIGl0IGlzIGVtcHR5LiAgKi8KKwkgIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uICgmb2JqZmlsZSAtPiBwc3ltYm9sX2NhY2hlLmNhY2hlLCAwLCAwLAorCQkJCSAgICAgIHhtYWxsb2MsIGZyZWUpOworCSAgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb24gKCZvYmpmaWxlIC0+IHBzeW1ib2xfb2JzdGFjaywgMCwgMCwKKwkJCQkgICAgICB4bWFsbG9jLCBmcmVlKTsKKwkgIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uICgmb2JqZmlsZSAtPiBzeW1ib2xfb2JzdGFjaywgMCwgMCwKKwkJCQkgICAgICB4bWFsbG9jLCBmcmVlKTsKKwkgIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uICgmb2JqZmlsZSAtPiB0eXBlX29ic3RhY2ssIDAsIDAsCisJCQkJICAgICAgeG1hbGxvYywgZnJlZSk7CisJICBpZiAoYnVpbGRfb2JqZmlsZV9zZWN0aW9uX3RhYmxlIChvYmpmaWxlKSkKKwkgICAgeworCSAgICAgIGVycm9yICgiQ2FuJ3QgZmluZCB0aGUgZmlsZSBzZWN0aW9ucyBpbiBgJXMnOiAlcyIsIAorCQkgICAgIG9iamZpbGUgLT4gbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCSAgICB9CisKKwkgIC8qIFdlIHVzZSB0aGUgc2FtZSBzZWN0aW9uIG9mZnNldHMgYXMgZnJvbSBsYXN0IHRpbWUuICBJJ20gbm90CisJICAgICBzdXJlIHdoZXRoZXIgdGhhdCBpcyBhbHdheXMgY29ycmVjdCBmb3Igc2hhcmVkIGxpYnJhcmllcy4gICovCisJICBvYmpmaWxlLT5zZWN0aW9uX29mZnNldHMgPSAoc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqKQorCSAgICBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZSAtPiBwc3ltYm9sX29ic3RhY2ssIHNlY3Rpb25fb2Zmc2V0c19zaXplKTsKKwkgIG1lbWNweSAob2JqZmlsZS0+c2VjdGlvbl9vZmZzZXRzLCBvZmZzZXRzLCBzZWN0aW9uX29mZnNldHNfc2l6ZSk7CisJICBvYmpmaWxlLT5udW1fc2VjdGlvbnMgPSBudW1fb2Zmc2V0czsKKworCSAgLyogV2hhdCB0aGUgaGVsbCBpcyBzeW1fbmV3X2luaXQgZm9yLCBhbnl3YXk/ICBUaGUgY29uY2VwdCBvZgorCSAgICAgZGlzdGluZ3Vpc2hpbmcgYmV0d2VlbiB0aGUgbWFpbiBmaWxlIGFuZCBhZGRpdGlvbmFsIGZpbGVzCisJICAgICBpbiB0aGlzIHdheSBzZWVtcyByYXRoZXIgZHViaW91cy4gICovCisJICBpZiAob2JqZmlsZSA9PSBzeW1maWxlX29iamZpbGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICgqb2JqZmlsZS0+c2YtPnN5bV9uZXdfaW5pdCkgKG9iamZpbGUpOworI2lmZGVmIEhQVVhIUFBBCisgICAgICAgICAgICAgIFJFU0VUX0hQX1VYX0dMT0JBTFMgKCk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworCSAgKCpvYmpmaWxlLT5zZi0+c3ltX2luaXQpIChvYmpmaWxlKTsKKwkgIGNsZWFyX2NvbXBsYWludHMgKDEsIDEpOworCSAgLyogVGhlICJtYWlubGluZSIgcGFyYW1ldGVyIGlzIGEgaGlkZW91cyBoYWNrOyBJIHRoaW5rIGxlYXZpbmcgaXQKKwkgICAgIHplcm8gaXMgT0sgc2luY2UgZGJ4cmVhZC5jIGFsc28gZG9lcyB3aGF0IGl0IG5lZWRzIHRvIGRvIGlmCisJICAgICBvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMuc2l6ZSBpcyAwLiAgKi8KKwkgICgqb2JqZmlsZS0+c2YtPnN5bV9yZWFkKSAob2JqZmlsZSwgb2JqZmlsZS0+c2VjdGlvbl9vZmZzZXRzLCAwKTsKKwkgIGlmICghaGF2ZV9wYXJ0aWFsX3N5bWJvbHMgKCkgJiYgIWhhdmVfZnVsbF9zeW1ib2xzICgpKQorCSAgICB7CisJICAgICAgd3JhcF9oZXJlICgiIik7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiKG5vIGRlYnVnZ2luZyBzeW1ib2xzIGZvdW5kKVxuIik7CisJICAgICAgd3JhcF9oZXJlICgiIik7CisJICAgIH0KKwkgIG9iamZpbGUgLT4gZmxhZ3MgfD0gT0JKRl9TWU1TOworCisJICAvKiBXZSdyZSBkb25lIHJlYWRpbmcgdGhlIHN5bWJvbCBmaWxlOyBmaW5pc2ggb2ZmIGNvbXBsYWludHMuICAqLworCSAgY2xlYXJfY29tcGxhaW50cyAoMCwgMSk7CisKKwkgIC8qIEdldHRpbmcgbmV3IHN5bWJvbHMgbWF5IGNoYW5nZSBvdXIgb3BpbmlvbiBhYm91dCB3aGF0IGlzCisJICAgICBmcmFtZWxlc3MuICAqLworCisJICByZWluaXRfZnJhbWVfY2FjaGUgKCk7CisKKwkgIC8qIERpc2NhcmQgY2xlYW51cHMgYXMgc3ltYm9sIHJlYWRpbmcgd2FzIHN1Y2Nlc3NmdWwuICAqLworCSAgZGlzY2FyZF9jbGVhbnVwcyAob2xkX2NsZWFudXBzKTsKKworCSAgLyogSWYgdGhlIG10aW1lIGhhcyBjaGFuZ2VkIGJldHdlZW4gdGhlIHRpbWUgd2Ugc2V0IG5ld19tb2R0aW1lCisJICAgICBhbmQgbm93LCB3ZSAqd2FudCogdGhpcyB0byBiZSBvdXQgb2YgZGF0ZSwgc28gZG9uJ3QgY2FsbCBzdGF0CisJICAgICBhZ2FpbiBub3cuICAqLworCSAgb2JqZmlsZS0+bXRpbWUgPSBuZXdfbW9kdGltZTsKKwkgIHJlcmVhZF9vbmUgPSAxOworCisJICAvKiBDYWxsIHRoaXMgYWZ0ZXIgcmVhZGluZyBpbiBhIG5ldyBzeW1ib2wgdGFibGUgdG8gZ2l2ZSB0YXJnZXQKKwkgICAgIGRlcGVuZGFudCBjb2RlIGEgY3JhY2sgYXQgdGhlIG5ldyBzeW1ib2xzLiAgRm9yIGluc3RhbmNlLCB0aGlzCisJICAgICBjb3VsZCBiZSB1c2VkIHRvIHVwZGF0ZSB0aGUgdmFsdWVzIG9mIHRhcmdldC1zcGVjaWZpYyBzeW1ib2xzIEdEQgorCSAgICAgbmVlZHMgdG8ga2VlcCB0cmFjayBvZiAoc3VjaCBhcyBfc2lndHJhbXAsIG9yIHdoYXRldmVyKS4gICovCisKKwkgIFRBUkdFVF9TWU1GSUxFX1BPU1RSRUFEIChvYmpmaWxlKTsKKwl9CisgICAgfQorICB9CisKKyAgaWYgKHJlcmVhZF9vbmUpCisgICAgY2xlYXJfc3ltdGFiX3VzZXJzICgpOworfQorCisMCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciAgICAgICAgICpleHQ7CisgIGVudW0gbGFuZ3VhZ2UgbGFuZzsKK30gZmlsZW5hbWVfbGFuZ3VhZ2U7CisKK3N0YXRpYyBmaWxlbmFtZV9sYW5ndWFnZSAqIGZpbGVuYW1lX2xhbmd1YWdlX3RhYmxlOworc3RhdGljIGludCBmbF90YWJsZV9zaXplLCBmbF90YWJsZV9uZXh0OworCitzdGF0aWMgdm9pZAorYWRkX2ZpbGVuYW1lX2xhbmd1YWdlIChleHQsIGxhbmcpCisgICAgIGNoYXIgICAgICAgICAqZXh0OworICAgICBlbnVtIGxhbmd1YWdlIGxhbmc7Cit7CisgIGlmIChmbF90YWJsZV9uZXh0ID49IGZsX3RhYmxlX3NpemUpCisgICAgeworICAgICAgZmxfdGFibGVfc2l6ZSArPSAxMDsKKyAgICAgIGZpbGVuYW1lX2xhbmd1YWdlX3RhYmxlID0gcmVhbGxvYyAoZmlsZW5hbWVfbGFuZ3VhZ2VfdGFibGUsIAorCQkJCQkgZmxfdGFibGVfc2l6ZSk7CisgICAgfQorCisgIGZpbGVuYW1lX2xhbmd1YWdlX3RhYmxlW2ZsX3RhYmxlX25leHRdLmV4dCAgPSBzdHJzYXZlIChleHQpOworICBmaWxlbmFtZV9sYW5ndWFnZV90YWJsZVtmbF90YWJsZV9uZXh0XS5sYW5nID0gbGFuZzsKKyAgZmxfdGFibGVfbmV4dCsrOworfQorCitzdGF0aWMgY2hhciAqZXh0X2FyZ3M7CisKK3N0YXRpYyB2b2lkCitzZXRfZXh0X2xhbmdfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IGk7CisgIGNoYXIgKmNwID0gZXh0X2FyZ3M7CisgIGVudW0gbGFuZ3VhZ2UgbGFuZzsKKworICAvKiBGaXJzdCBhcmcgaXMgZmlsZW5hbWUgZXh0ZW5zaW9uLCBzdGFydGluZyB3aXRoICcuJyAqLworICBpZiAoKmNwICE9ICcuJykKKyAgICBlcnJvciAoIiclcyc6IEZpbGVuYW1lIGV4dGVuc2lvbiBtdXN0IGJlZ2luIHdpdGggJy4nIiwgZXh0X2FyZ3MpOworCisgIC8qIEZpbmQgZW5kIG9mIGZpcnN0IGFyZy4gICovCisgIHdoaWxlICgqY3AgJiYgIWlzc3BhY2UgKCpjcCkpCQorICAgIGNwKys7CisKKyAgaWYgKCpjcCA9PSAnXDAnKQorICAgIGVycm9yICgiJyVzJzogdHdvIGFyZ3VtZW50cyByZXF1aXJlZCAtLSBmaWxlbmFtZSBleHRlbnNpb24gYW5kIGxhbmd1YWdlIiwKKwkgICBleHRfYXJncyk7CisKKyAgLyogTnVsbC10ZXJtaW5hdGUgZmlyc3QgYXJnICovCisgICpjcCsrID0gJ1wwJzsgCisKKyAgLyogRmluZCBiZWdpbm5pbmcgb2Ygc2Vjb25kIGFyZywgd2hpY2ggc2hvdWxkIGJlIGEgc291cmNlIGxhbmd1YWdlLiAgKi8KKyAgd2hpbGUgKCpjcCAmJiBpc3NwYWNlICgqY3ApKQorICAgIGNwKys7CisKKyAgaWYgKCpjcCA9PSAnXDAnKQorICAgIGVycm9yICgiJyVzJzogdHdvIGFyZ3VtZW50cyByZXF1aXJlZCAtLSBmaWxlbmFtZSBleHRlbnNpb24gYW5kIGxhbmd1YWdlIiwKKwkgICBleHRfYXJncyk7CisKKyAgLyogTG9va3VwIHRoZSBsYW5ndWFnZSBmcm9tIGFtb25nIHRob3NlIHdlIGtub3cuICAqLworICBsYW5nID0gbGFuZ3VhZ2VfZW51bSAoY3ApOworCisgIC8qIE5vdyBsb29rdXAgdGhlIGZpbGVuYW1lIGV4dGVuc2lvbjogZG8gd2UgYWxyZWFkeSBrbm93IGl0PyAgKi8KKyAgZm9yIChpID0gMDsgaSA8IGZsX3RhYmxlX25leHQ7IGkrKykKKyAgICBpZiAoMCA9PSBzdHJjbXAgKGV4dF9hcmdzLCBmaWxlbmFtZV9sYW5ndWFnZV90YWJsZVtpXS5leHQpKQorICAgICAgYnJlYWs7CisKKyAgaWYgKGkgPj0gZmxfdGFibGVfbmV4dCkKKyAgICB7CisgICAgICAvKiBuZXcgZmlsZSBleHRlbnNpb24gKi8KKyAgICAgIGFkZF9maWxlbmFtZV9sYW5ndWFnZSAoZXh0X2FyZ3MsIGxhbmcpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHJlZGVmaW5pbmcgYSBwcmV2aW91c2x5IGtub3duIGZpbGVuYW1lIGV4dGVuc2lvbiAqLworCisgICAgICAvKiBpZiAoZnJvbV90dHkpICovCisgICAgICAvKiAgIHF1ZXJ5ICgiUmVhbGx5IG1ha2UgZmlsZXMgb2YgdHlwZSAlcyAnJXMnPyIsICovCisgICAgICAvKiAgICAgICAgICBleHRfYXJncywgbGFuZ3VhZ2Vfc3RyIChsYW5nKSk7ICAgICAgICAgICAqLworCisgICAgICBmcmVlIChmaWxlbmFtZV9sYW5ndWFnZV90YWJsZVtpXS5leHQpOworICAgICAgZmlsZW5hbWVfbGFuZ3VhZ2VfdGFibGVbaV0uZXh0ICA9IHN0cnNhdmUgKGV4dF9hcmdzKTsKKyAgICAgIGZpbGVuYW1lX2xhbmd1YWdlX3RhYmxlW2ldLmxhbmcgPSBsYW5nOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2luZm9fZXh0X2xhbmdfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCAgIGZyb21fdHR5OworeworICBpbnQgaTsKKworICBwcmludGZfZmlsdGVyZWQgKCJGaWxlbmFtZSBleHRlbnNpb25zIGFuZCB0aGUgbGFuZ3VhZ2VzIHRoZXkgcmVwcmVzZW50OiIpOworICBwcmludGZfZmlsdGVyZWQgKCJcblxuIik7CisgIGZvciAoaSA9IDA7IGkgPCBmbF90YWJsZV9uZXh0OyBpKyspCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiXHQlc1x0LSAlc1xuIiwgCisJCSAgICAgZmlsZW5hbWVfbGFuZ3VhZ2VfdGFibGVbaV0uZXh0LCAKKwkJICAgICBsYW5ndWFnZV9zdHIgKGZpbGVuYW1lX2xhbmd1YWdlX3RhYmxlW2ldLmxhbmcpKTsKK30KKworc3RhdGljIHZvaWQKK2luaXRfZmlsZW5hbWVfbGFuZ3VhZ2VfdGFibGUgKCkKK3sKKyAgaWYgKGZsX3RhYmxlX3NpemUgPT0gMCkJLyogcHJvdGVjdCBhZ2FpbnN0IHJlcGV0aXRpb24gKi8KKyAgICB7CisgICAgICBmbF90YWJsZV9zaXplID0gMjA7CisgICAgICBmbF90YWJsZV9uZXh0ID0gMDsKKyAgICAgIGZpbGVuYW1lX2xhbmd1YWdlX3RhYmxlID0gCisJeG1hbGxvYyAoZmxfdGFibGVfc2l6ZSAqIHNpemVvZiAoKmZpbGVuYW1lX2xhbmd1YWdlX3RhYmxlKSk7CisgICAgICBhZGRfZmlsZW5hbWVfbGFuZ3VhZ2UgKCIuYyIsICAgICBsYW5ndWFnZV9jKTsKKyAgICAgIGFkZF9maWxlbmFtZV9sYW5ndWFnZSAoIi5DIiwgICAgIGxhbmd1YWdlX2NwbHVzKTsKKyAgICAgIGFkZF9maWxlbmFtZV9sYW5ndWFnZSAoIi5jYyIsICAgIGxhbmd1YWdlX2NwbHVzKTsKKyAgICAgIGFkZF9maWxlbmFtZV9sYW5ndWFnZSAoIi5jcCIsICAgIGxhbmd1YWdlX2NwbHVzKTsKKyAgICAgIGFkZF9maWxlbmFtZV9sYW5ndWFnZSAoIi5jcHAiLCAgIGxhbmd1YWdlX2NwbHVzKTsKKyAgICAgIGFkZF9maWxlbmFtZV9sYW5ndWFnZSAoIi5jeHgiLCAgIGxhbmd1YWdlX2NwbHVzKTsKKyAgICAgIGFkZF9maWxlbmFtZV9sYW5ndWFnZSAoIi5jKysiLCAgIGxhbmd1YWdlX2NwbHVzKTsKKyAgICAgIGFkZF9maWxlbmFtZV9sYW5ndWFnZSAoIi5qYXZhIiwgIGxhbmd1YWdlX2phdmEpOworICAgICAgYWRkX2ZpbGVuYW1lX2xhbmd1YWdlICgiLmNsYXNzIiwgbGFuZ3VhZ2VfamF2YSk7CisgICAgICBhZGRfZmlsZW5hbWVfbGFuZ3VhZ2UgKCIuY2giLCAgICBsYW5ndWFnZV9jaGlsbCk7CisgICAgICBhZGRfZmlsZW5hbWVfbGFuZ3VhZ2UgKCIuYzE4NiIsICBsYW5ndWFnZV9jaGlsbCk7CisgICAgICBhZGRfZmlsZW5hbWVfbGFuZ3VhZ2UgKCIuYzI4NiIsICBsYW5ndWFnZV9jaGlsbCk7CisgICAgICBhZGRfZmlsZW5hbWVfbGFuZ3VhZ2UgKCIuZiIsICAgICBsYW5ndWFnZV9mb3J0cmFuKTsKKyAgICAgIGFkZF9maWxlbmFtZV9sYW5ndWFnZSAoIi5GIiwgICAgIGxhbmd1YWdlX2ZvcnRyYW4pOworICAgICAgYWRkX2ZpbGVuYW1lX2xhbmd1YWdlICgiLnMiLCAgICAgbGFuZ3VhZ2VfYXNtKTsKKyAgICAgIGFkZF9maWxlbmFtZV9sYW5ndWFnZSAoIi5TIiwgICAgIGxhbmd1YWdlX2FzbSk7CisgICAgfQorfQorCitlbnVtIGxhbmd1YWdlCitkZWR1Y2VfbGFuZ3VhZ2VfZnJvbV9maWxlbmFtZSAoZmlsZW5hbWUpCisgICAgIGNoYXIgKmZpbGVuYW1lOworeworICBpbnQgaTsKKyAgY2hhciAqY3A7CisKKyAgaWYgKGZpbGVuYW1lICE9IE5VTEwpCisgICAgaWYgKChjcCA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnLicpKSAhPSBOVUxMKQorICAgICAgZm9yIChpID0gMDsgaSA8IGZsX3RhYmxlX25leHQ7IGkrKykKKwlpZiAoc3RyY21wIChjcCwgZmlsZW5hbWVfbGFuZ3VhZ2VfdGFibGVbaV0uZXh0KSA9PSAwKQorCSAgcmV0dXJuIGZpbGVuYW1lX2xhbmd1YWdlX3RhYmxlW2ldLmxhbmc7CisKKyAgcmV0dXJuIGxhbmd1YWdlX3Vua25vd247Cit9CisMCisvKiBhbGxvY2F0ZV9zeW10YWI6CisKKyAgIEFsbG9jYXRlIGFuZCBwYXJ0bHkgaW5pdGlhbGl6ZSBhIG5ldyBzeW1ib2wgdGFibGUuICBSZXR1cm4gYSBwb2ludGVyCisgICB0byBpdC4gIGVycm9yKCkgaWYgbm8gc3BhY2UuCisKKyAgIENhbGxlciBtdXN0IHNldCB0aGVzZSBmaWVsZHM6CisJTElORVRBQkxFKHN5bXRhYikKKwlzeW10YWItPmJsb2NrdmVjdG9yCisJc3ltdGFiLT5kaXJuYW1lCisJc3ltdGFiLT5mcmVlX2NvZGUKKwlzeW10YWItPmZyZWVfcHRyCisJcG9zc2libHkgZnJlZV9uYW1lZF9zeW10YWJzIChzeW10YWItPmZpbGVuYW1lKTsKKyAqLworCitzdHJ1Y3Qgc3ltdGFiICoKK2FsbG9jYXRlX3N5bXRhYiAoZmlsZW5hbWUsIG9iamZpbGUpCisgICAgIGNoYXIgKmZpbGVuYW1lOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bXRhYiAqc3ltdGFiOworCisgIHN5bXRhYiA9IChzdHJ1Y3Qgc3ltdGFiICopCisgICAgb2JzdGFja19hbGxvYyAoJm9iamZpbGUgLT4gc3ltYm9sX29ic3RhY2ssIHNpemVvZiAoc3RydWN0IHN5bXRhYikpOworICBtZW1zZXQgKHN5bXRhYiwgMCwgc2l6ZW9mICgqc3ltdGFiKSk7CisgIHN5bXRhYiAtPiBmaWxlbmFtZSA9IG9ic2F2ZXN0cmluZyAoZmlsZW5hbWUsIHN0cmxlbiAoZmlsZW5hbWUpLAorCQkJCSAgICAgJm9iamZpbGUgLT4gc3ltYm9sX29ic3RhY2spOworICBzeW10YWIgLT4gZnVsbG5hbWUgPSBOVUxMOworICBzeW10YWIgLT4gbGFuZ3VhZ2UgPSBkZWR1Y2VfbGFuZ3VhZ2VfZnJvbV9maWxlbmFtZSAoZmlsZW5hbWUpOworICBzeW10YWIgLT4gZGVidWdmb3JtYXQgPSBvYnNhdmVzdHJpbmcgKCJ1bmtub3duIiwgNywKKwkJCQkJJm9iamZpbGUgLT4gc3ltYm9sX29ic3RhY2spOworCisgIC8qIEhvb2sgaXQgdG8gdGhlIG9iamZpbGUgaXQgY29tZXMgZnJvbSAqLworCisgIHN5bXRhYiAtPiBvYmpmaWxlID0gb2JqZmlsZTsKKyAgc3ltdGFiIC0+IG5leHQgPSBvYmpmaWxlIC0+IHN5bXRhYnM7CisgIG9iamZpbGUgLT4gc3ltdGFicyA9IHN5bXRhYjsKKworICAvKiBGSVhNRTogVGhpcyBzaG91bGQgZ28gYXdheS4gIEl0IGlzIG9ubHkgZGVmaW5lZCBmb3IgdGhlIFo4MDAwLAorICAgICBhbmQgdGhlIFo4MDAwIGRlZmluaXRpb24gb2YgdGhpcyBtYWNybyBkb2Vzbid0IGhhdmUgYW55dGhpbmcgdG8KKyAgICAgZG8gd2l0aCB0aGUgbm93LW5vbmV4aXN0ZW50IEVYVFJBX1NZTVRBQl9JTkZPIG1hY3JvLCBpdCdzIGp1c3QKKyAgICAgaGVyZSBmb3IgY29udmVuaWVuY2UuICAqLworI2lmZGVmIElOSVRfRVhUUkFfU1lNVEFCX0lORk8KKyAgSU5JVF9FWFRSQV9TWU1UQUJfSU5GTyAoc3ltdGFiKTsKKyNlbmRpZgorCisgIHJldHVybiAoc3ltdGFiKTsKK30KKworc3RydWN0IHBhcnRpYWxfc3ltdGFiICoKK2FsbG9jYXRlX3BzeW10YWIgKGZpbGVuYW1lLCBvYmpmaWxlKQorICAgICBjaGFyICpmaWxlbmFtZTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN5bXRhYjsKKworICBpZiAob2JqZmlsZSAtPiBmcmVlX3BzeW10YWJzKQorICAgIHsKKyAgICAgIHBzeW10YWIgPSBvYmpmaWxlIC0+IGZyZWVfcHN5bXRhYnM7CisgICAgICBvYmpmaWxlIC0+IGZyZWVfcHN5bXRhYnMgPSBwc3ltdGFiIC0+IG5leHQ7CisgICAgfQorICBlbHNlCisgICAgcHN5bXRhYiA9IChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikKKyAgICAgIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlIC0+IHBzeW1ib2xfb2JzdGFjaywKKwkJICAgICBzaXplb2YgKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYikpOworCisgIG1lbXNldCAocHN5bXRhYiwgMCwgc2l6ZW9mIChzdHJ1Y3QgcGFydGlhbF9zeW10YWIpKTsKKyAgcHN5bXRhYiAtPiBmaWxlbmFtZSA9IG9ic2F2ZXN0cmluZyAoZmlsZW5hbWUsIHN0cmxlbiAoZmlsZW5hbWUpLAorCQkJCSAgICAgICZvYmpmaWxlIC0+IHBzeW1ib2xfb2JzdGFjayk7CisgIHBzeW10YWIgLT4gc3ltdGFiID0gTlVMTDsKKworICAvKiBQcmVwZW5kIGl0IHRvIHRoZSBwc3ltdGFiIGxpc3QgZm9yIHRoZSBvYmpmaWxlIGl0IGJlbG9uZ3MgdG8uCisgICAgIFBzeW10YWJzIGFyZSBzZWFyY2hlZCBpbiBtb3N0IHJlY2VudCBpbnNlcnRlZCAtPiBsZWFzdCByZWNlbnQKKyAgICAgaW5zZXJ0ZWQgb3JkZXIuICovCisKKyAgcHN5bXRhYiAtPiBvYmpmaWxlID0gb2JqZmlsZTsKKyAgcHN5bXRhYiAtPiBuZXh0ID0gb2JqZmlsZSAtPiBwc3ltdGFiczsKKyAgb2JqZmlsZSAtPiBwc3ltdGFicyA9IHBzeW10YWI7CisjaWYgMAorICB7CisgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICoqcHJldl9wc3Q7CisgICAgcHN5bXRhYiAtPiBvYmpmaWxlID0gb2JqZmlsZTsKKyAgICBwc3ltdGFiIC0+IG5leHQgPSBOVUxMOworICAgIHByZXZfcHN0ID0gJihvYmpmaWxlIC0+IHBzeW10YWJzKTsKKyAgICB3aGlsZSAoKCpwcmV2X3BzdCkgIT0gTlVMTCkKKyAgICAgIHByZXZfcHN0ID0gJigoKnByZXZfcHN0KSAtPiBuZXh0KTsKKyAgICAoKnByZXZfcHN0KSA9IHBzeW10YWI7CisgIH0gIAorI2VuZGlmCisgIAorICByZXR1cm4gKHBzeW10YWIpOworfQorCit2b2lkCitkaXNjYXJkX3BzeW10YWIgKHBzdCkKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7Cit7CisgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKnByZXZfcHN0OworCisgIC8qIEZyb20gZGJ4cmVhZC5jOgorICAgICBFbXB0eSBwc3ltdGFicyBoYXBwZW4gYXMgYSByZXN1bHQgb2YgaGVhZGVyIGZpbGVzIHdoaWNoIGRvbid0CisgICAgIGhhdmUgYW55IHN5bWJvbHMgaW4gdGhlbS4gIFRoZXJlIGNhbiBiZSBhIGxvdCBvZiB0aGVtLiAgQnV0IHRoaXMKKyAgICAgY2hlY2sgaXMgd3JvbmcsIGluIHRoYXQgYSBwc3ltdGFiIHdpdGggTl9TTElORSBlbnRyaWVzIGJ1dAorICAgICBub3RoaW5nIGVsc2UgaXMgbm90IGVtcHR5LCBidXQgd2UgZG9uJ3QgcmVhbGl6ZSB0aGF0LiAgRml4aW5nCisgICAgIHRoYXQgd2l0aG91dCBzbG93aW5nIHRoaW5ncyBkb3duIG1pZ2h0IGJlIHRyaWNreS4gICovCisKKyAgLyogRmlyc3QsIHNuaXAgaXQgb3V0IG9mIHRoZSBwc3ltdGFiIGNoYWluICovCisKKyAgcHJldl9wc3QgPSAmKHBzdC0+b2JqZmlsZS0+cHN5bXRhYnMpOworICB3aGlsZSAoKCpwcmV2X3BzdCkgIT0gcHN0KQorICAgIHByZXZfcHN0ID0gJigoKnByZXZfcHN0KS0+bmV4dCk7CisgICgqcHJldl9wc3QpID0gcHN0LT5uZXh0OworCisgIC8qIE5leHQsIHB1dCBpdCBvbiBhIGZyZWUgbGlzdCBmb3IgcmVjeWNsaW5nICovCisKKyAgcHN0LT5uZXh0ID0gcHN0LT5vYmpmaWxlLT5mcmVlX3BzeW10YWJzOworICBwc3QtPm9iamZpbGUtPmZyZWVfcHN5bXRhYnMgPSBwc3Q7Cit9CisKKwwKKy8qIFJlc2V0IGFsbCBkYXRhIHN0cnVjdHVyZXMgaW4gZ2RiIHdoaWNoIG1heSBjb250YWluIHJlZmVyZW5jZXMgdG8gc3ltYm9sCisgICB0YWJsZSBkYXRhLiAgKi8KKwordm9pZAorY2xlYXJfc3ltdGFiX3VzZXJzICgpCit7CisgIC8qIFNvbWVkYXksIHdlIHNob3VsZCBkbyBiZXR0ZXIgdGhhbiB0aGlzLCBieSBvbmx5IGJsb3dpbmcgYXdheQorICAgICB0aGUgdGhpbmdzIHRoYXQgcmVhbGx5IG5lZWQgdG8gYmUgYmxvd24uICAqLworICBjbGVhcl92YWx1ZV9oaXN0b3J5ICgpOworICBjbGVhcl9kaXNwbGF5cyAoKTsKKyAgY2xlYXJfaW50ZXJuYWx2YXJzICgpOworICBicmVha3BvaW50X3JlX3NldCAoKTsKKyAgc2V0X2RlZmF1bHRfYnJlYWtwb2ludCAoMCwgMCwgMCwgMCk7CisgIGN1cnJlbnRfc291cmNlX3N5bXRhYiA9IDA7CisgIGN1cnJlbnRfc291cmNlX2xpbmUgPSAwOworICBjbGVhcl9wY19mdW5jdGlvbl9jYWNoZSAoKTsKKyAgdGFyZ2V0X25ld19vYmpmaWxlIChOVUxMKTsKK30KKworLyogY2xlYXJfc3ltdGFiX3VzZXJzX29uY2U6CisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgcnVuIGFmdGVyIHN5bWJvbCByZWFkaW5nLCBvciBmcm9tIGEgY2xlYW51cC4KKyAgIElmIGFuIG9sZCBzeW1ib2wgdGFibGUgd2FzIG9ic29sZXRlZCwgdGhlIG9sZCBzeW1ib2wgdGFibGUKKyAgIGhhcyBiZWVuIGJsb3duIGF3YXksIGJ1dCB0aGUgb3RoZXIgR0RCIGRhdGEgc3RydWN0dXJlcyB0aGF0IG1heSAKKyAgIHJlZmVyZW5jZSBpdCBoYXZlIG5vdCB5ZXQgYmVlbiBjbGVhcmVkIG9yIHJlLWRpcmVjdGVkLiAgKFRoZSBvbGQKKyAgIHN5bXRhYiB3YXMgemFwcGVkLCBhbmQgdGhlIGNsZWFudXAgcXVldWVkLCBpbiBmcmVlX25hbWVkX3N5bXRhYigpCisgICBiZWxvdy4pCisKKyAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHF1ZXVlZCBOIHRpbWVzIGFzIGEgY2xlYW51cCwgb3IgY2FsbGVkCisgICBkaXJlY3RseTsgaXQgd2lsbCBkbyBhbGwgdGhlIHdvcmsgdGhlIGZpcnN0IHRpbWUsIGFuZCB0aGVuIHdpbGwgYmUgYQorICAgbm8tb3AgdW50aWwgdGhlIG5leHQgdGltZSBpdCBpcyBxdWV1ZWQuICBUaGlzIHdvcmtzIGJ5IGJ1bXBpbmcgYQorICAgY291bnRlciBhdCBxdWV1ZWluZyB0aW1lLiAgTXVjaCBsYXRlciB3aGVuIHRoZSBjbGVhbnVwIGlzIHJ1biwgb3IgYXQKKyAgIHRoZSBlbmQgb2Ygc3ltYm9sIHByb2Nlc3NpbmcgKGluIGNhc2UgdGhlIGNsZWFudXAgaXMgZGlzY2FyZGVkKSwgaWYKKyAgIHRoZSBxdWV1ZWQgY291bnQgaXMgZ3JlYXRlciB0aGFuIHRoZSAiZG9uZS1jb3VudCIsIHdlIGRvIHRoZSB3b3JrCisgICBhbmQgc2V0IHRoZSBkb25lLWNvdW50IHRvIHRoZSBxdWV1ZWQgY291bnQuICBJZiB0aGUgcXVldWVkIGNvdW50IGlzCisgICBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGRvbmUtY291bnQsIHdlIGp1c3QgaWdub3JlIHRoZSBjYWxsLiAgVGhpcworICAgaXMgbmVlZGVkIGJlY2F1c2UgcmVhZGluZyBhIHNpbmdsZSAubyBmaWxlIHdpbGwgb2Z0ZW4gcmVwbGFjZSBtYW55CisgICBzeW10YWJzIChvbmUgcGVyIC5oIGZpbGUsIGZvciBleGFtcGxlKSwgYW5kIHdlIGRvbid0IHdhbnQgdG8gcmVzZXQKKyAgIHRoZSBicmVha3BvaW50cyBOIHRpbWVzIGluIHRoZSB1c2VyJ3MgZmFjZS4KKworICAgVGhlIHJlYXNvbiB3ZSBib3RoIHF1ZXVlIGEgY2xlYW51cCwgYW5kIGNhbGwgaXQgZGlyZWN0bHkgYWZ0ZXIgc3ltYm9sCisgICByZWFkaW5nLCBpcyBiZWNhdXNlIHRoZSBjbGVhbnVwIHByb3RlY3RzIHVzIGluIGNhc2Ugb2YgZXJyb3JzLCBidXQgaXMKKyAgIGRpc2NhcmRlZCBpZiBzeW1ib2wgcmVhZGluZyBpcyBzdWNjZXNzZnVsLiAgKi8KKworI2lmIDAKKy8qIEZJWE1FOiAgQXMgZnJlZV9uYW1lZF9zeW10YWJzIGlzIGN1cnJlbnRseSBhIGJpZyBub29wIHRoaXMgZnVuY3Rpb24KKyAgIGlzIG5vIGxvbmdlciBuZWVkZWQuICAqLworc3RhdGljIHZvaWQKK2NsZWFyX3N5bXRhYl91c2Vyc19vbmNlIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIGludCBjbGVhcl9zeW10YWJfdXNlcnNfcXVldWVkOworc3RhdGljIGludCBjbGVhcl9zeW10YWJfdXNlcnNfZG9uZTsKKworc3RhdGljIHZvaWQKK2NsZWFyX3N5bXRhYl91c2Vyc19vbmNlICgpCit7CisgIC8qIEVuZm9yY2Ugb25jZS1wZXItYGRvX2NsZWFudXBzJy1zZW1hbnRpY3MgKi8KKyAgaWYgKGNsZWFyX3N5bXRhYl91c2Vyc19xdWV1ZWQgPD0gY2xlYXJfc3ltdGFiX3VzZXJzX2RvbmUpCisgICAgcmV0dXJuOworICBjbGVhcl9zeW10YWJfdXNlcnNfZG9uZSA9IGNsZWFyX3N5bXRhYl91c2Vyc19xdWV1ZWQ7CisKKyAgY2xlYXJfc3ltdGFiX3VzZXJzICgpOworfQorI2VuZGlmCisKKy8qIERlbGV0ZSB0aGUgc3BlY2lmaWVkIHBzeW10YWIsIGFuZCBhbnkgb3RoZXJzIHRoYXQgcmVmZXJlbmNlIGl0LiAgKi8KKworc3RhdGljIHZvaWQKK2Nhc2hpZXJfcHN5bXRhYiAocHN0KQorICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdDsKK3sKKyAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwcywgKnBwcmV2ID0gTlVMTDsKKyAgaW50IGk7CisKKyAgLyogRmluZCBpdHMgcHJldmlvdXMgcHN5bXRhYiBpbiB0aGUgY2hhaW4gKi8KKyAgZm9yIChwcyA9IHBzdC0+b2JqZmlsZS0+cHN5bXRhYnM7IHBzOyBwcyA9IHBzLT5uZXh0KSB7CisgICAgaWYgKHBzID09IHBzdCkKKyAgICAgIGJyZWFrOworICAgIHBwcmV2ID0gcHM7CisgIH0KKworICBpZiAocHMpIHsKKyAgICAvKiBVbmhvb2sgaXQgZnJvbSB0aGUgY2hhaW4uICAqLworICAgIGlmIChwcyA9PSBwc3QtPm9iamZpbGUtPnBzeW10YWJzKQorICAgICAgcHN0LT5vYmpmaWxlLT5wc3ltdGFicyA9IHBzLT5uZXh0OworICAgIGVsc2UKKyAgICAgIHBwcmV2LT5uZXh0ID0gcHMtPm5leHQ7CisKKyAgICAvKiBGSVhNRSwgd2UgY2FuJ3QgY29udmVuaWVudGx5IGRlYWxsb2NhdGUgdGhlIGVudHJpZXMgaW4gdGhlCisgICAgICAgcGFydGlhbF9zeW1ib2wgbGlzdHMgKGdsb2JhbF9wc3ltYm9scy9zdGF0aWNfcHN5bWJvbHMpIHRoYXQKKyAgICAgICB0aGlzIHBzeW10YWIgcG9pbnRzIHRvLiAgVGhlc2UganVzdCB0YWtlIHVwIHNwYWNlIHVudGlsIGFsbAorICAgICAgIHRoZSBwc3ltdGFicyBhcmUgcmVjbGFpbWVkLiAgRGl0dG8gdGhlIGRlcGVuZGVuY2llcyBsaXN0IGFuZAorICAgICAgIGZpbGVuYW1lLCB3aGljaCBhcmUgYWxsIGluIHRoZSBwc3ltYm9sX29ic3RhY2suICAqLworCisgICAgLyogV2UgbmVlZCB0byBjYXNoaWVyIGFueSBwc3ltdGFiIHRoYXQgaGFzIHRoaXMgb25lIGFzIGEgZGVwZW5kZW5jeS4uLiAqLworYWdhaW46CisgICAgZm9yIChwcyA9IHBzdC0+b2JqZmlsZS0+cHN5bXRhYnM7IHBzOyBwcyA9IHBzLT5uZXh0KSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcHMtPm51bWJlcl9vZl9kZXBlbmRlbmNpZXM7IGkrKykgeworCWlmIChwcy0+ZGVwZW5kZW5jaWVzW2ldID09IHBzdCkgeworCSAgY2FzaGllcl9wc3ltdGFiIChwcyk7CisJICBnb3RvIGFnYWluOwkJLyogTXVzdCByZXN0YXJ0LCBjaGFpbiBoYXMgYmVlbiBtdW5nZWQuICovCisJfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKiBJZiBhIHN5bXRhYiBvciBwc3ltdGFiIGZvciBmaWxlbmFtZSBOQU1FIGlzIGZvdW5kLCBmcmVlIGl0IGFsb25nCisgICB3aXRoIGFueSBkZXBlbmRlbnQgYnJlYWtwb2ludHMsIGRpc3BsYXlzLCBldGMuCisgICBVc2VkIHdoZW4gbG9hZGluZyBuZXcgdmVyc2lvbnMgb2Ygb2JqZWN0IG1vZHVsZXMgd2l0aCB0aGUgImFkZC1maWxlIgorICAgY29tbWFuZC4gIFRoaXMgaXMgb25seSBjYWxsZWQgb24gdGhlIHRvcC1sZXZlbCBzeW10YWIgb3IgcHN5bXRhYidzIG5hbWU7CisgICBpdCBpcyBub3QgY2FsbGVkIGZvciBzdWJzaWRpYXJ5IGZpbGVzIHN1Y2ggYXMgLmggZmlsZXMuCisKKyAgIFJldHVybiB2YWx1ZSBpcyAxIGlmIHdlIGJsZXcgYXdheSB0aGUgZW52aXJvbm1lbnQsIDAgaWYgbm90LgorICAgRklYTUUuICBUaGUgcmV0dXJuIHZhbHUgYXBwZWFycyB0byBuZXZlciBiZSB1c2VkLgorCisgICBGSVhNRS4gIEkgdGhpbmsgdGhpcyBpcyBub3QgdGhlIGJlc3Qgd2F5IHRvIGRvIHRoaXMuICBXZSBzaG91bGQKKyAgIHdvcmsgb24gYmVpbmcgZ2VudGxlciB0byB0aGUgZW52aXJvbm1lbnQgd2hpbGUgc3RpbGwgY2xlYW5pbmcgdXAKKyAgIGFsbCBzdHJheSBwb2ludGVycyBpbnRvIHRoZSBmcmVlZCBzeW10YWIuICAqLworCitpbnQKK2ZyZWVfbmFtZWRfc3ltdGFicyAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyNpZiAwCisgIC8qIEZJWE1FOiAgV2l0aCB0aGUgbmV3IG1ldGhvZCBvZiBlYWNoIG9iamZpbGUgaGF2aW5nIGl0J3Mgb3duCisgICAgIHBzeW10YWIgbGlzdCwgdGhpcyBmdW5jdGlvbiBuZWVkcyBzZXJpb3VzIHJldGhpbmtpbmcuICBJbiBwYXJ0aWN1bGFyLAorICAgICB3aHkgd2FzIGl0IGV2ZXIgbmVjZXNzYXJ5IHRvIHRvc3MgcHN5bXRhYnMgd2l0aCBzcGVjaWZpYyBjb21waWxhdGlvbgorICAgICB1bml0IGZpbGVuYW1lcywgYXMgb3Bwb3NlZCB0byBhbGwgcHN5bXRhYnMgZnJvbSBhIHBhcnRpY3VsYXIgc3ltYm9sCisgICAgIGZpbGU/ICAtLSBmbmYKKyAgICAgV2VsbCwgdGhlIGFuc3dlciBpcyB0aGF0IHNvbWUgc3lzdGVtcyBwZXJtaXQgcmVsb2FkaW5nIG9mIHBhcnRpY3VsYXIKKyAgICAgY29tcGlsYXRpb24gdW5pdHMuICBXZSB3YW50IHRvIGJsb3cgYXdheSBhbnkgb2xkIGluZm8gYWJvdXQgdGhlc2UKKyAgICAgY29tcGlsYXRpb24gdW5pdHMsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggb2JqZmlsZXMgdGhleSBhcnJpdmVkIGluLiAtLWdudS4gICovCisKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bXRhYiAqczsKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bXRhYiAqcHJldjsKKyAgcmVnaXN0ZXIgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwczsKKyAgc3RydWN0IGJsb2NrdmVjdG9yICpidjsKKyAgaW50IGJsZXdpdCA9IDA7CisKKyAgLyogV2Ugb25seSB3YWNrIHRoaW5ncyBpZiB0aGUgc3ltYm9sLXJlbG9hZCBzd2l0Y2ggaXMgc2V0LiAgKi8KKyAgaWYgKCFzeW1ib2xfcmVsb2FkaW5nKQorICAgIHJldHVybiAwOworCisgIC8qIFNvbWUgc3ltYm9sIGZvcm1hdHMgaGF2ZSB0cm91YmxlIHByb3ZpZGluZyBmaWxlIG5hbWVzLi4uICovCisgIGlmIChuYW1lID09IDAgfHwgKm5hbWUgPT0gJ1wwJykKKyAgICByZXR1cm4gMDsKKworICAvKiBMb29rIGZvciBhIHBzeW10YWIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuICAqLworCithZ2FpbjI6CisgIGZvciAocHMgPSBwYXJ0aWFsX3N5bXRhYl9saXN0OyBwczsgcHMgPSBwcy0+bmV4dCkgeworICAgIGlmIChTVFJFUSAobmFtZSwgcHMtPmZpbGVuYW1lKSkgeworICAgICAgY2FzaGllcl9wc3ltdGFiIChwcyk7CS8qIEJsb3cgaXQgYXdheS4uLmFuZCBpdHMgbGl0dGxlIGRvZywgdG9vLiAgKi8KKyAgICAgIGdvdG8gYWdhaW4yOwkJLyogTXVzdCByZXN0YXJ0LCBjaGFpbiBoYXMgYmVlbiBtdW5nZWQgKi8KKyAgICB9CisgIH0KKworICAvKiBMb29rIGZvciBhIHN5bXRhYiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gICovCisKKyAgZm9yIChzID0gc3ltdGFiX2xpc3Q7IHM7IHMgPSBzLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChTVFJFUSAobmFtZSwgcy0+ZmlsZW5hbWUpKQorCWJyZWFrOworICAgICAgcHJldiA9IHM7CisgICAgfQorCisgIGlmIChzKQorICAgIHsKKyAgICAgIGlmIChzID09IHN5bXRhYl9saXN0KQorCXN5bXRhYl9saXN0ID0gcy0+bmV4dDsKKyAgICAgIGVsc2UKKwlwcmV2LT5uZXh0ID0gcy0+bmV4dDsKKworICAgICAgLyogRm9yIG5vdywgcXVldWUgYSBkZWxldGUgZm9yIGFsbCBicmVha3BvaW50cywgZGlzcGxheXMsIGV0Yy4sIHdoZXRoZXIKKwkgb3Igbm90IHRoZXkgZGVwZW5kIG9uIHRoZSBzeW10YWIgYmVpbmcgZnJlZWQuICBUaGlzIHNob3VsZCBiZQorCSBjaGFuZ2VkIHNvIHRoYXQgb25seSB0aG9zZSBkYXRhIHN0cnVjdHVyZXMgYWZmZWN0ZWQgYXJlIGRlbGV0ZWQuICAqLworCisgICAgICAvKiBCdXQgZG9uJ3QgZGVsZXRlIGFueXRoaW5nIGlmIHRoZSBzeW10YWIgaXMgZW1wdHkuCisJIFRoaXMgdGVzdCBpcyBuZWNlc3NhcnkgZHVlIHRvIGEgYnVnIGluICJkYnhyZWFkLmMiIHRoYXQKKwkgY2F1c2VzIGVtcHR5IHN5bXRhYnMgdG8gYmUgY3JlYXRlZCBmb3IgTl9TTyBzeW1ib2xzIHRoYXQKKwkgY29udGFpbiB0aGUgcGF0aG5hbWUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKFRoaXMgcHJvYmxlbQorCSBoYXMgYmVlbiBmaXhlZCBpbiBHREIgMy45eCkuICAqLworCisgICAgICBidiA9IEJMT0NLVkVDVE9SIChzKTsKKyAgICAgIGlmIChCTE9DS1ZFQ1RPUl9OQkxPQ0tTIChidikgPiAyCisJICB8fCBCTE9DS19OU1lNUyAoQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBHTE9CQUxfQkxPQ0spKQorCSAgfHwgQkxPQ0tfTlNZTVMgKEJMT0NLVkVDVE9SX0JMT0NLIChidiwgU1RBVElDX0JMT0NLKSkpCisJeworCSAgY29tcGxhaW4gKCZvbGRzeW1zX2NvbXBsYWludCwgbmFtZSk7CisKKwkgIGNsZWFyX3N5bXRhYl91c2Vyc19xdWV1ZWQrKzsKKwkgIG1ha2VfY2xlYW51cCAoY2xlYXJfc3ltdGFiX3VzZXJzX29uY2UsIDApOworCSAgYmxld2l0ID0gMTsKKwl9IGVsc2UgeworCSAgY29tcGxhaW4gKCZlbXB0eV9zeW10YWJfY29tcGxhaW50LCBuYW1lKTsKKwl9CisKKyAgICAgIGZyZWVfc3ltdGFiIChzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJdCBpcyBzdGlsbCBwb3NzaWJsZSB0aGF0IHNvbWUgYnJlYWtwb2ludHMgd2lsbCBiZSBhZmZlY3RlZAorCSBldmVuIHRob3VnaCBubyBzeW10YWIgd2FzIGZvdW5kLCBzaW5jZSB0aGUgZmlsZSBtaWdodCBoYXZlCisJIGJlZW4gY29tcGlsZWQgd2l0aG91dCBkZWJ1Z2dpbmcsIGFuZCBoZW5jZSBub3QgYmUgYXNzb2NpYXRlZAorCSB3aXRoIGEgc3ltdGFiLiAgSW4gb3JkZXIgdG8gaGFuZGxlIHRoaXMgY29ycmVjdGx5LCB3ZSB3b3VsZCBuZWVkCisJIHRvIGtlZXAgYSBsaXN0IG9mIHRleHQgYWRkcmVzcyByYW5nZXMgZm9yIHVuZGVidWdnYWJsZSBmaWxlcy4KKwkgRm9yIG5vdywgd2UgZG8gbm90aGluZywgc2luY2UgdGhpcyBpcyBhIGZhaXJseSBvYnNjdXJlIGNhc2UuICAqLworICAgICAgOworICAgIH0KKworICAvKiBGSVhNRSwgd2hhdCBhYm91dCB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGU/ICovCisgIHJldHVybiBibGV3aXQ7CisjZWxzZQorICByZXR1cm4gKDApOworI2VuZGlmCit9CisMCisvKiBBbGxvY2F0ZSBhbmQgcGFydGlhbGx5IGZpbGwgYSBwYXJ0aWFsIHN5bXRhYi4gIEl0IHdpbGwgYmUKKyAgIGNvbXBsZXRlbHkgZmlsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIHN5bWJvbCBsaXN0LgorCisgICBTWU1GSUxFX05BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbC1maWxlIHdlIGFyZSByZWFkaW5nIGZyb20sIGFuZCBBRERSCisgICBpcyB0aGUgYWRkcmVzcyByZWxhdGl2ZSB0byB3aGljaCBpdHMgc3ltYm9scyBhcmUgKGluY3JlbWVudGFsKSBvciAwCisgICAobm9ybWFsKS4gKi8KKworCitzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKgorc3RhcnRfcHN5bXRhYl9jb21tb24gKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywKKwkJICAgICAgZmlsZW5hbWUsIHRleHRsb3csIGdsb2JhbF9zeW1zLCBzdGF0aWNfc3ltcykKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKyAgICAgY2hhciAqZmlsZW5hbWU7CisgICAgIENPUkVfQUREUiB0ZXh0bG93OworICAgICBzdHJ1Y3QgcGFydGlhbF9zeW1ib2wgKipnbG9iYWxfc3ltczsKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqc3RhdGljX3N5bXM7Cit7CisgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN5bXRhYjsKKworICBwc3ltdGFiID0gYWxsb2NhdGVfcHN5bXRhYiAoZmlsZW5hbWUsIG9iamZpbGUpOworICBwc3ltdGFiIC0+IHNlY3Rpb25fb2Zmc2V0cyA9IHNlY3Rpb25fb2Zmc2V0czsKKyAgcHN5bXRhYiAtPiB0ZXh0bG93ID0gdGV4dGxvdzsKKyAgcHN5bXRhYiAtPiB0ZXh0aGlnaCA9IHBzeW10YWIgLT4gdGV4dGxvdzsgIC8qIGRlZmF1bHQgKi8KKyAgcHN5bXRhYiAtPiBnbG9iYWxzX29mZnNldCA9IGdsb2JhbF9zeW1zIC0gb2JqZmlsZSAtPiBnbG9iYWxfcHN5bWJvbHMubGlzdDsKKyAgcHN5bXRhYiAtPiBzdGF0aWNzX29mZnNldCA9IHN0YXRpY19zeW1zIC0gb2JqZmlsZSAtPiBzdGF0aWNfcHN5bWJvbHMubGlzdDsKKyAgcmV0dXJuIChwc3ltdGFiKTsKK30KKwwKKy8qIEFkZCBhIHN5bWJvbCB3aXRoIGEgbG9uZyB2YWx1ZSB0byBhIHBzeW10YWIuCisgICBTaW5jZSBvbmUgYXJnIGlzIGEgc3RydWN0LCB3ZSBwYXNzIGluIGEgcHRyIGFuZCBkZXJlZiBpdCAoc2lnaCkuICAqLworCit2b2lkCithZGRfcHN5bWJvbF90b19saXN0IChuYW1lLCBuYW1lbGVuZ3RoLCBuYW1lc3BhY2UsIGNsYXNzLCBsaXN0LCB2YWwsIGNvcmVhZGRyLAorCQkgICAgIGxhbmd1YWdlLCBvYmpmaWxlKQorICAgICBjaGFyICpuYW1lOworICAgICBpbnQgbmFtZWxlbmd0aDsKKyAgICAgbmFtZXNwYWNlX2VudW0gbmFtZXNwYWNlOworICAgICBlbnVtIGFkZHJlc3NfY2xhc3MgY2xhc3M7CisgICAgIHN0cnVjdCBwc3ltYm9sX2FsbG9jYXRpb25fbGlzdCAqbGlzdDsKKyAgICAgbG9uZyB2YWw7CQkJCQkvKiBWYWx1ZSBhcyBhIGxvbmcgKi8KKyAgICAgQ09SRV9BRERSIGNvcmVhZGRyOwkJCS8qIFZhbHVlIGFzIGEgQ09SRV9BRERSICovCisgICAgIGVudW0gbGFuZ3VhZ2UgbGFuZ3VhZ2U7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICByZWdpc3RlciBzdHJ1Y3QgcGFydGlhbF9zeW1ib2wgKnBzeW07CisgIGNoYXIgKmJ1ZiA9IGFsbG9jYSAobmFtZWxlbmd0aCArIDEpOworICAvKiBwc3ltYm9sIGlzIHN0YXRpYyBzbyB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gdW5pbml0aWFsaXplZCBnYXBzIGluIHRoZQorICAgICBzdHJ1Y3R1cmUgd2hpY2ggbWlnaHQgY29udGFpbiByYW5kb20gZGF0YSwgY2F1c2luZyBjYWNoZSBtaXNzZXMgaW4KKyAgICAgYmNhY2hlLiAqLworICBzdGF0aWMgc3RydWN0IHBhcnRpYWxfc3ltYm9sIHBzeW1ib2w7CisKKyAgLyogQ3JlYXRlIGxvY2FsIGNvcHkgb2YgdGhlIHBhcnRpYWwgc3ltYm9sICovCisgIG1lbWNweSAoYnVmLCBuYW1lLCBuYW1lbGVuZ3RoKTsKKyAgYnVmW25hbWVsZW5ndGhdID0gJ1wwJzsKKyAgU1lNQk9MX05BTUUgKCZwc3ltYm9sKSA9IGJjYWNoZSAoYnVmLCBuYW1lbGVuZ3RoICsgMSwgJm9iamZpbGUtPnBzeW1ib2xfY2FjaGUpOworICAvKiB2YWwgYW5kIGNvcmVhZGRyIGFyZSBtdXR1YWxseSBleGNsdXNpdmUsIG9uZSBvZiB0aGVtICp3aWxsKiBiZSB6ZXJvICovCisgIGlmICh2YWwgIT0gMCkKKyAgICB7CisgICAgICBTWU1CT0xfVkFMVUUgKCZwc3ltYm9sKSA9IHZhbDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBTWU1CT0xfVkFMVUVfQUREUkVTUyAoJnBzeW1ib2wpID0gY29yZWFkZHI7CisgICAgfQorICBTWU1CT0xfU0VDVElPTiAoJnBzeW1ib2wpID0gMDsKKyAgU1lNQk9MX0xBTkdVQUdFICgmcHN5bWJvbCkgPSBsYW5ndWFnZTsKKyAgUFNZTUJPTF9OQU1FU1BBQ0UgKCZwc3ltYm9sKSA9IG5hbWVzcGFjZTsKKyAgUFNZTUJPTF9DTEFTUyAoJnBzeW1ib2wpID0gY2xhc3M7CisgIFNZTUJPTF9JTklUX0xBTkdVQUdFX1NQRUNJRklDICgmcHN5bWJvbCwgbGFuZ3VhZ2UpOworCisgIC8qIFN0YXNoIHRoZSBwYXJ0aWFsIHN5bWJvbCBhd2F5IGluIHRoZSBjYWNoZSAqLworICBwc3ltID0gYmNhY2hlICgmcHN5bWJvbCwgc2l6ZW9mIChzdHJ1Y3QgcGFydGlhbF9zeW1ib2wpLCAmb2JqZmlsZS0+cHN5bWJvbF9jYWNoZSk7CisKKyAgLyogU2F2ZSBwb2ludGVyIHRvIHBhcnRpYWwgc3ltYm9sIGluIHBzeW10YWIsIGdyb3dpbmcgc3ltdGFiIGlmIG5lZWRlZC4gKi8KKyAgaWYgKGxpc3QtPm5leHQgPj0gbGlzdC0+bGlzdCArIGxpc3QtPnNpemUpCisgICAgeworICAgICAgZXh0ZW5kX3BzeW1ib2xfbGlzdCAobGlzdCwgb2JqZmlsZSk7CisgICAgfQorICAqbGlzdC0+bmV4dCsrID0gcHN5bTsKKyAgT0JKU1RBVCAob2JqZmlsZSwgbl9wc3ltcysrKTsKK30KKworLyogQWRkIGEgc3ltYm9sIHdpdGggYSBsb25nIHZhbHVlIHRvIGEgcHN5bXRhYi4gVGhpcyBkaWZmZXJzIGZyb20KKyAqIGFkZF9wc3ltYm9sX3RvX2xpc3QgYWJvdmUgaW4gdGFraW5nIGJvdGggYSBtYW5nbGVkIGFuZCBhIGRlbWFuZ2xlZAorICogbmFtZS4gKi8KKwordm9pZAorYWRkX3BzeW1ib2xfd2l0aF9kZW1fbmFtZV90b19saXN0IChuYW1lLCBuYW1lbGVuZ3RoLCBkZW1fbmFtZSwgZGVtX25hbWVsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSwgY2xhc3MsIGxpc3QsIHZhbCwgY29yZWFkZHIsIGxhbmd1YWdlLCBvYmpmaWxlKQorICAgICBjaGFyICpuYW1lOworICAgICBpbnQgbmFtZWxlbmd0aDsKKyAgICAgY2hhciAqZGVtX25hbWU7CisgICAgIGludCBkZW1fbmFtZWxlbmd0aDsKKyAgICAgbmFtZXNwYWNlX2VudW0gbmFtZXNwYWNlOworICAgICBlbnVtIGFkZHJlc3NfY2xhc3MgY2xhc3M7CisgICAgIHN0cnVjdCBwc3ltYm9sX2FsbG9jYXRpb25fbGlzdCAqbGlzdDsKKyAgICAgbG9uZyB2YWw7CQkJCQkvKiBWYWx1ZSBhcyBhIGxvbmcgKi8KKyAgICAgQ09SRV9BRERSIGNvcmVhZGRyOwkJCS8qIFZhbHVlIGFzIGEgQ09SRV9BRERSICovCisgICAgIGVudW0gbGFuZ3VhZ2UgbGFuZ3VhZ2U7CisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICByZWdpc3RlciBzdHJ1Y3QgcGFydGlhbF9zeW1ib2wgKnBzeW07CisgIGNoYXIgKmJ1ZiA9IGFsbG9jYSAobmFtZWxlbmd0aCArIDEpOworICAvKiBwc3ltYm9sIGlzIHN0YXRpYyBzbyB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gdW5pbml0aWFsaXplZCBnYXBzIGluIHRoZQorICAgICBzdHJ1Y3R1cmUgd2hpY2ggbWlnaHQgY29udGFpbiByYW5kb20gZGF0YSwgY2F1c2luZyBjYWNoZSBtaXNzZXMgaW4KKyAgICAgYmNhY2hlLiAqLworICBzdGF0aWMgc3RydWN0IHBhcnRpYWxfc3ltYm9sIHBzeW1ib2w7CisKKyAgLyogQ3JlYXRlIGxvY2FsIGNvcHkgb2YgdGhlIHBhcnRpYWwgc3ltYm9sICovCisKKyAgbWVtY3B5IChidWYsIG5hbWUsIG5hbWVsZW5ndGgpOworICBidWZbbmFtZWxlbmd0aF0gPSAnXDAnOworICBTWU1CT0xfTkFNRSAoJnBzeW1ib2wpID0gYmNhY2hlIChidWYsIG5hbWVsZW5ndGggKyAxLCAmb2JqZmlsZS0+cHN5bWJvbF9jYWNoZSk7CisKKyAgYnVmID0gYWxsb2NhIChkZW1fbmFtZWxlbmd0aCArIDEpOworICBtZW1jcHkgKGJ1ZiwgZGVtX25hbWUsIGRlbV9uYW1lbGVuZ3RoKTsKKyAgYnVmW2RlbV9uYW1lbGVuZ3RoXSA9ICdcMCc7CisgIAorICBzd2l0Y2ggKGxhbmd1YWdlKQorICAgIHsKKyAgICAgIGNhc2UgbGFuZ3VhZ2VfYzoKKyAgICAgIGNhc2UgbGFuZ3VhZ2VfY3BsdXM6CisgICAgICAgIFNZTUJPTF9DUExVU19ERU1BTkdMRURfTkFNRSAoJnBzeW1ib2wpID0KKyAgICAgICAgICBiY2FjaGUgKGJ1ZiwgZGVtX25hbWVsZW5ndGggKyAxLCAmb2JqZmlsZS0+cHN5bWJvbF9jYWNoZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBsYW5ndWFnZV9jaGlsbDoKKyAgICAgICAgU1lNQk9MX0NISUxMX0RFTUFOR0xFRF9OQU1FICgmcHN5bWJvbCkgPSAKKyAgICAgICAgICBiY2FjaGUgKGJ1ZiwgZGVtX25hbWVsZW5ndGggKyAxLCAmb2JqZmlsZS0+cHN5bWJvbF9jYWNoZSk7CisgICAgICAgIAorICAgICAgLyogRklYTUUgV2hhdCBzaG91bGQgYmUgZG9uZSBmb3IgdGhlIGRlZmF1bHQgY2FzZT8gSWdub3JpbmcgZm9yIG5vdy4gKi8KKyAgICB9CisKKyAgLyogdmFsIGFuZCBjb3JlYWRkciBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLCBvbmUgb2YgdGhlbSAqd2lsbCogYmUgemVybyAqLworICBpZiAodmFsICE9IDApCisgICAgeworICAgICAgU1lNQk9MX1ZBTFVFICgmcHN5bWJvbCkgPSB2YWw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgU1lNQk9MX1ZBTFVFX0FERFJFU1MgKCZwc3ltYm9sKSA9IGNvcmVhZGRyOworICAgIH0KKyAgU1lNQk9MX1NFQ1RJT04gKCZwc3ltYm9sKSA9IDA7CisgIFNZTUJPTF9MQU5HVUFHRSAoJnBzeW1ib2wpID0gbGFuZ3VhZ2U7CisgIFBTWU1CT0xfTkFNRVNQQUNFICgmcHN5bWJvbCkgPSBuYW1lc3BhY2U7CisgIFBTWU1CT0xfQ0xBU1MgKCZwc3ltYm9sKSA9IGNsYXNzOworICBTWU1CT0xfSU5JVF9MQU5HVUFHRV9TUEVDSUZJQyAoJnBzeW1ib2wsIGxhbmd1YWdlKTsKKworICAvKiBTdGFzaCB0aGUgcGFydGlhbCBzeW1ib2wgYXdheSBpbiB0aGUgY2FjaGUgKi8KKyAgcHN5bSA9IGJjYWNoZSAoJnBzeW1ib2wsIHNpemVvZiAoc3RydWN0IHBhcnRpYWxfc3ltYm9sKSwgJm9iamZpbGUtPnBzeW1ib2xfY2FjaGUpOworCisgIC8qIFNhdmUgcG9pbnRlciB0byBwYXJ0aWFsIHN5bWJvbCBpbiBwc3ltdGFiLCBncm93aW5nIHN5bXRhYiBpZiBuZWVkZWQuICovCisgIGlmIChsaXN0LT5uZXh0ID49IGxpc3QtPmxpc3QgKyBsaXN0LT5zaXplKQorICAgIHsKKyAgICAgIGV4dGVuZF9wc3ltYm9sX2xpc3QgKGxpc3QsIG9iamZpbGUpOworICAgIH0KKyAgKmxpc3QtPm5leHQrKyA9IHBzeW07CisgIE9CSlNUQVQgKG9iamZpbGUsIG5fcHN5bXMrKyk7Cit9CisKKy8qIEluaXRpYWxpemUgc3RvcmFnZSBmb3IgcGFydGlhbCBzeW1ib2xzLiAgKi8KKwordm9pZAoraW5pdF9wc3ltYm9sX2xpc3QgKG9iamZpbGUsIHRvdGFsX3N5bWJvbHMpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBpbnQgdG90YWxfc3ltYm9sczsKK3sKKyAgLyogRnJlZSBhbnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgcHN5bWJvbCBsaXN0cy4gICovCisgIAorICBpZiAob2JqZmlsZSAtPiBnbG9iYWxfcHN5bWJvbHMubGlzdCkKKyAgICB7CisgICAgICBtZnJlZSAob2JqZmlsZSAtPiBtZCwgKFBUUilvYmpmaWxlIC0+IGdsb2JhbF9wc3ltYm9scy5saXN0KTsKKyAgICB9CisgIGlmIChvYmpmaWxlIC0+IHN0YXRpY19wc3ltYm9scy5saXN0KQorICAgIHsKKyAgICAgIG1mcmVlIChvYmpmaWxlIC0+IG1kLCAoUFRSKW9iamZpbGUgLT4gc3RhdGljX3BzeW1ib2xzLmxpc3QpOworICAgIH0KKyAgCisgIC8qIEN1cnJlbnQgYmVzdCBndWVzcyBpcyB0aGF0IGFwcHJveGltYXRlbHkgYSB0d2VudGlldGgKKyAgICAgb2YgdGhlIHRvdGFsIHN5bWJvbHMgKGluIGEgZGVidWdnaW5nIGZpbGUpIGFyZSBnbG9iYWwgb3Igc3RhdGljCisgICAgIG9yaWVudGVkIHN5bWJvbHMgKi8KKyAgCisgIG9iamZpbGUgLT4gZ2xvYmFsX3BzeW1ib2xzLnNpemUgPSB0b3RhbF9zeW1ib2xzIC8gMTA7CisgIG9iamZpbGUgLT4gc3RhdGljX3BzeW1ib2xzLnNpemUgPSB0b3RhbF9zeW1ib2xzIC8gMTA7CisKKyAgaWYgKG9iamZpbGUgLT4gZ2xvYmFsX3BzeW1ib2xzLnNpemUgPiAwKQorICAgIHsKKyAgICAgIG9iamZpbGUgLT4gZ2xvYmFsX3BzeW1ib2xzLm5leHQgPQorCW9iamZpbGUgLT4gZ2xvYmFsX3BzeW1ib2xzLmxpc3QgPSAoc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqKQorCXhtbWFsbG9jIChvYmpmaWxlIC0+IG1kLCAob2JqZmlsZSAtPiBnbG9iYWxfcHN5bWJvbHMuc2l6ZQorCQkJCSAgKiBzaXplb2YgKHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKSkpOworICAgIH0KKyAgaWYgKG9iamZpbGUgLT4gc3RhdGljX3BzeW1ib2xzLnNpemUgPiAwKQorICAgIHsKKyAgICAgIG9iamZpbGUgLT4gc3RhdGljX3BzeW1ib2xzLm5leHQgPQorCW9iamZpbGUgLT4gc3RhdGljX3BzeW1ib2xzLmxpc3QgPSAoc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqKQorCXhtbWFsbG9jIChvYmpmaWxlIC0+IG1kLCAob2JqZmlsZSAtPiBzdGF0aWNfcHN5bWJvbHMuc2l6ZQorCQkJCSAgKiBzaXplb2YgKHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKSkpOworICAgIH0KK30KKworLyogT1ZFUkxBWVM6CisgICBUaGUgZm9sbG93aW5nIGNvZGUgaW1wbGVtZW50cyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVidWdnaW5nIG92ZXJsYXkgc2VjdGlvbnMuCisKKyAgIFRoZSB0YXJnZXQgbW9kZWwgaXMgYXMgZm9sbG93czoKKyAgIDEpIFRoZSBnbnUgbGlua2VyIHdpbGwgcGVybWl0IG11bHRpcGxlIHNlY3Rpb25zIHRvIGJlIG1hcHBlZCBpbnRvIHRoZQorICAgICAgc2FtZSBWTUEsIGVhY2ggd2l0aCBpdHMgb3duIHVuaXF1ZSBMTUEgKG9yIGxvYWQgYWRkcmVzcykuCisgICAyKSBJdCBpcyBhc3N1bWVkIHRoYXQgc29tZSBydW50aW1lIG1lY2hhbmlzbSBleGlzdHMgZm9yIG1hcHBpbmcgdGhlCisgICAgICBzZWN0aW9ucywgb25lIGJ5IG9uZSwgZnJvbSB0aGUgbG9hZCBhZGRyZXNzIGludG8gdGhlIFZNQSBhZGRyZXNzLgorICAgMykgVGhpcyBjb2RlIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBnZGIgdG8ga2VlcCB0cmFjayBvZiB3aGljaCAKKyAgICAgIHNlY3Rpb25zIHNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIG1hcHBlZCBmcm9tIHRoZSBWTUEgdG8gdGhlIExNQS4KKyAgICAgIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBmb3Igc3ltYm9sIGxvb2t1cCwgYW5kIG1lbW9yeSByZWFkL3dyaXRlLgorICAgICAgRm9yIGluc3RhbmNlLCBpZiBhIHNlY3Rpb24gaGFzIGJlZW4gbWFwcGVkIHRoZW4gaXRzIGNvbnRlbnRzIAorICAgICAgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgVk1BLCBvdGhlcndpc2UgZnJvbSB0aGUgTE1BLgorCisgICBUd28gbGV2ZWxzIG9mIGRlYnVnZ2VyIHN1cHBvcnQgZm9yIG92ZXJsYXlzIGFyZSBhdmFpbGFibGUuICBPbmUgaXMKKyAgICJtYW51YWwiLCBpbiB3aGljaCB0aGUgZGVidWdnZXIgcmVsaWVzIG9uIHRoZSB1c2VyIHRvIHRlbGwgaXQgd2hpY2gKKyAgIG92ZXJsYXlzIGFyZSBjdXJyZW50bHkgbWFwcGVkLiAgVGhpcyBsZXZlbCBvZiBzdXBwb3J0IGlzCisgICBpbXBsZW1lbnRlZCBlbnRpcmVseSBpbiB0aGUgY29yZSBkZWJ1Z2dlciwgYW5kIHRoZSBpbmZvcm1hdGlvbiBhYm91dAorICAgd2hldGhlciBhIHNlY3Rpb24gaXMgbWFwcGVkIGlzIGtlcHQgaW4gdGhlIG9iamZpbGUtPm9ial9zZWN0aW9uIHRhYmxlLgorCisgICBUaGUgc2Vjb25kIGxldmVsIG9mIHN1cHBvcnQgaXMgImF1dG9tYXRpYyIsIGFuZCBpcyBvbmx5IGF2YWlsYWJsZSBpZgorICAgdGhlIHRhcmdldC1zcGVjaWZpYyBjb2RlIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8gcmVhZCB0aGUgdGFyZ2V0J3MKKyAgIG92ZXJsYXkgbWFwcGluZyB0YWJsZSwgYW5kIHRyYW5zbGF0ZSBpdHMgY29udGVudHMgZm9yIHRoZSBkZWJ1Z2dlcgorICAgKGJ5IHVwZGF0aW5nIHRoZSBtYXBwZWQgc3RhdGUgaW5mb3JtYXRpb24gaW4gdGhlIG9ial9zZWN0aW9uIHRhYmxlcykuCisKKyAgIFRoZSBpbnRlcmZhY2UgaXMgYXMgZm9sbG93czoKKyAgICAgVXNlciBjb21tYW5kczoKKyAgICAgICBvdmVybGF5IG1hcCA8bmFtZT4JLS0gdGVsbCBnZGIgdG8gY29uc2lkZXIgdGhpcyBzZWN0aW9uIG1hcHBlZAorICAgICAgIG92ZXJsYXkgdW5tYXAgPG5hbWU+CS0tIHRlbGwgZ2RiIHRvIGNvbnNpZGVyIHRoaXMgc2VjdGlvbiB1bm1hcHBlZAorICAgICAgIG92ZXJsYXkgbGlzdAkJLS0gbGlzdCB0aGUgc2VjdGlvbnMgdGhhdCBHREIgdGhpbmtzIGFyZSBtYXBwZWQKKyAgICAgICBvdmVybGF5IHJlYWQtdGFyZ2V0CS0tIGdldCB0aGUgdGFyZ2V0J3Mgc3RhdGUgb2Ygd2hhdCdzIG1hcHBlZAorICAgICAgIG92ZXJsYXkgb2ZmL21hbnVhbC9hdXRvIC0tIHNldCBvdmVybGF5IGRlYnVnZ2luZyBzdGF0ZQorICAgICBGdW5jdGlvbmFsIGludGVyZmFjZToKKyAgICAgICBmaW5kX3BjX21hcHBlZF9zZWN0aW9uKHBjKTogICAgaWYgdGhlIHBjIGlzIGluIHRoZSByYW5nZSBvZiBhIG1hcHBlZAorCQkJCSAgICAgIHNlY3Rpb24sIHJldHVybiB0aGF0IHNlY3Rpb24uCisgICAgICAgZmluZF9wY19vdmVybGF5KHBjKToJICAgICAgZmluZCBhbnkgb3ZlcmxheSBzZWN0aW9uIHRoYXQgY29udGFpbnMgCisJCQkJICAgICAgdGhlIHBjLCBlaXRoZXIgaW4gaXRzIFZNQSBvciBpdHMgTE1BCisgICAgICAgb3ZlcmxheV9pc19tYXBwZWQoc2VjdCk6ICAgICAgIHRydWUgaWYgb3ZlcmxheSBpcyBtYXJrZWQgYXMgbWFwcGVkCisgICAgICAgc2VjdGlvbl9pc19vdmVybGF5KHNlY3QpOiAgICAgIHRydWUgaWYgc2VjdGlvbidzIFZNQSAhPSBMTUEKKyAgICAgICBwY19pbl9tYXBwZWRfcmFuZ2UocGMsc2VjKTogICAgdHJ1ZSBpZiBwYyBiZWxvbmdzIHRvIHNlY3Rpb24ncyBWTUEKKyAgICAgICBwY19pbl91bm1hcHBlZF9yYW5nZSguLi4pOiAgICAgdHJ1ZSBpZiBwYyBiZWxvbmdzIHRvIHNlY3Rpb24ncyBMTUEKKyAgICAgICBvdmVybGF5X21hcHBlZF9hZGRyZXNzKC4uLik6ICAgbWFwIGFuIGFkZHJlc3MgZnJvbSBzZWN0aW9uJ3MgTE1BIHRvIFZNQQorICAgICAgIG92ZXJsYXlfdW5tYXBwZWRfYWRkcmVzcyguLi4pOiBtYXAgYW4gYWRkcmVzcyBmcm9tIHNlY3Rpb24ncyBWTUEgdG8gTE1BCisgICAgICAgc3ltYm9sX292ZXJsYXllZF9hZGRyZXNzKC4uLik6IFJldHVybiBhICJjdXJyZW50IiBhZGRyZXNzIGZvciBzeW1ib2w6CisJCQkJICAgICAgZWl0aGVyIGluIFZNQSBvciBMTUEgZGVwZW5kaW5nIG9uIHdoZXRoZXIKKwkJCQkgICAgICB0aGUgc3ltYm9sJ3Mgc2VjdGlvbiBpcyBjdXJyZW50bHkgbWFwcGVkCisgKi8KKworLyogT3ZlcmxheSBkZWJ1Z2dpbmcgc3RhdGU6ICovCisKK2ludCBvdmVybGF5X2RlYnVnZ2luZyA9IDA7CS8qIDAgPT0gb2ZmLCAxID09IG1hbnVhbCwgLTEgPT0gYXV0byAqLworaW50IG92ZXJsYXlfY2FjaGVfaW52YWxpZCA9IDA7CS8qIFRydWUgaWYgbmVlZCB0byByZWZyZXNoIG1hcHBlZCBzdGF0ZSAqLworCisvKiBUYXJnZXQgdmVjdG9yIGZvciByZWZyZXNoaW5nIG92ZXJsYXkgbWFwcGVkIHN0YXRlICovCitzdGF0aWMgdm9pZCBzaW1wbGVfb3ZlcmxheV91cGRhdGUgUEFSQU1TICgoc3RydWN0IG9ial9zZWN0aW9uICopKTsKK3ZvaWQgKCp0YXJnZXRfb3ZlcmxheV91cGRhdGUpIFBBUkFNUyAoKHN0cnVjdCBvYmpfc2VjdGlvbiAqKSkgCisgICAgID0gc2ltcGxlX292ZXJsYXlfdXBkYXRlOworCisvKiBGdW5jdGlvbjogc2VjdGlvbl9pc19vdmVybGF5IChTRUNUSU9OKQorICAgUmV0dXJucyB0cnVlIGlmIFNFQ1RJT04gaGFzIFZNQSBub3QgZXF1YWwgdG8gTE1BLCBpZS4gCisgICBTRUNUSU9OIGlzIGxvYWRlZCBhdCBhbiBhZGRyZXNzIGRpZmZlcmVudCBmcm9tIHdoZXJlIGl0IHdpbGwgInJ1biIuICAqLworCitpbnQKK3NlY3Rpb25faXNfb3ZlcmxheSAoc2VjdGlvbikKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247Cit7CisgIGlmIChvdmVybGF5X2RlYnVnZ2luZykKKyAgICBpZiAoc2VjdGlvbiAmJiBzZWN0aW9uLT5sbWEgIT0gMCAmJgorCXNlY3Rpb24tPnZtYSAhPSBzZWN0aW9uLT5sbWEpCisgICAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworLyogRnVuY3Rpb246IG92ZXJsYXlfaW52YWxpZGF0ZV9hbGwgKHZvaWQpCisgICBJbnZhbGlkYXRlIHRoZSBtYXBwZWQgc3RhdGUgb2YgYWxsIG92ZXJsYXkgc2VjdGlvbnMgKG1hcmsgaXQgYXMgc3RhbGUpLiAgKi8KKworc3RhdGljIHZvaWQKK292ZXJsYXlfaW52YWxpZGF0ZV9hbGwgKCkKK3sKKyAgc3RydWN0IG9iamZpbGUgICAgICpvYmpmaWxlOworICBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlY3Q7CisKKyAgQUxMX09CSlNFQ1RJT05TIChvYmpmaWxlLCBzZWN0KQorICAgIGlmIChzZWN0aW9uX2lzX292ZXJsYXkgKHNlY3QtPnRoZV9iZmRfc2VjdGlvbikpCisgICAgICBzZWN0LT5vdmx5X21hcHBlZCA9IC0xOworfQorCisvKiBGdW5jdGlvbjogb3ZlcmxheV9pc19tYXBwZWQgKFNFQ1RJT04pCisgICBSZXR1cm5zIHRydWUgaWYgc2VjdGlvbiBpcyBhbiBvdmVybGF5LCBhbmQgaXMgY3VycmVudGx5IG1hcHBlZC4gCisgICBQcml2YXRlOiBwdWJsaWMgYWNjZXNzIGlzIHRocnUgZnVuY3Rpb24gc2VjdGlvbl9pc19tYXBwZWQuCisKKyAgIEFjY2VzcyB0byB0aGUgb3ZseV9tYXBwZWQgZmxhZyBpcyByZXN0cmljdGVkIHRvIHRoaXMgZnVuY3Rpb24sIHNvCisgICB0aGF0IHdlIGNhbiBkbyBhdXRvbWF0aWMgdXBkYXRlLiAgSWYgdGhlIGdsb2JhbCBmbGFnCisgICBPVkVSTEFZX0NBQ0hFX0lOVkFMSUQgaXMgc2V0IChieSB3YWl0X2Zvcl9pbmZlcmlvciksIHRoZW4gY2FsbAorICAgb3ZlcmxheV9pbnZhbGlkYXRlX2FsbC4gIElmIHRoZSBtYXBwZWQgc3RhdGUgb2YgdGhlIHBhcnRpY3VsYXIKKyAgIHNlY3Rpb24gaXMgc3RhbGUsIHRoZW4gY2FsbCBUQVJHRVRfT1ZFUkxBWV9VUERBVEUgdG8gcmVmcmVzaCBpdC4gICovCisKK3N0YXRpYyBpbnQgCitvdmVybGF5X2lzX21hcHBlZCAob3NlY3QpCisgICAgIHN0cnVjdCBvYmpfc2VjdGlvbiAqb3NlY3Q7Cit7CisgIGlmIChvc2VjdCA9PSAwIHx8ICFzZWN0aW9uX2lzX292ZXJsYXkgKG9zZWN0LT50aGVfYmZkX3NlY3Rpb24pKQorICAgIHJldHVybiAwOworCisgIHN3aXRjaCAob3ZlcmxheV9kZWJ1Z2dpbmcpIAorICAgIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgMDoJcmV0dXJuIDA7CS8qIG92ZXJsYXkgZGVidWdnaW5nIG9mZiAqLworICAgIGNhc2UgLTE6CQkJLyogb3ZlcmxheSBkZWJ1Z2dpbmcgYXV0b21hdGljICovCisgICAgICAvKiBVbmxlcyB0aGVyZSBpcyBhIHRhcmdldF9vdmVybGF5X3VwZGF0ZSBmdW5jdGlvbiwgCisJIHRoZXJlJ3MgcmVhbGx5IG5vdGhpbmcgdXNlZnVsIHRvIGRvIGhlcmUgKGNhbid0IHJlYWxseSBnbyBhdXRvKSAgKi8KKyAgICAgIGlmICh0YXJnZXRfb3ZlcmxheV91cGRhdGUpCisJeworCSAgaWYgKG92ZXJsYXlfY2FjaGVfaW52YWxpZCkKKwkgICAgeworCSAgICAgIG92ZXJsYXlfaW52YWxpZGF0ZV9hbGwgKCk7CisJICAgICAgb3ZlcmxheV9jYWNoZV9pbnZhbGlkID0gMDsKKwkgICAgfQorCSAgaWYgKG9zZWN0LT5vdmx5X21hcHBlZCA9PSAtMSkKKwkgICAgKCp0YXJnZXRfb3ZlcmxheV91cGRhdGUpIChvc2VjdCk7CisJfQorICAgICAgLyogZmFsbCB0aHJ1IHRvIG1hbnVhbCBjYXNlICovCisgICAgY2FzZSAxOgkJCS8qIG92ZXJsYXkgZGVidWdnaW5nIG1hbnVhbCAqLworICAgICAgcmV0dXJuIG9zZWN0LT5vdmx5X21hcHBlZCA9PSAxOworICAgIH0KK30KKworLyogRnVuY3Rpb246IHNlY3Rpb25faXNfbWFwcGVkCisgICBSZXR1cm5zIHRydWUgaWYgc2VjdGlvbiBpcyBhbiBvdmVybGF5LCBhbmQgaXMgY3VycmVudGx5IG1hcHBlZC4gICovCisKK2ludAorc2VjdGlvbl9pc19tYXBwZWQgKHNlY3Rpb24pCisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworeworICBzdHJ1Y3Qgb2JqZmlsZSAgICAgKm9iamZpbGU7CisgIHN0cnVjdCBvYmpfc2VjdGlvbiAqb3NlY3Q7CisKKyAgaWYgKG92ZXJsYXlfZGVidWdnaW5nKQorICAgIGlmIChzZWN0aW9uICYmIHNlY3Rpb25faXNfb3ZlcmxheSAoc2VjdGlvbikpCisgICAgICBBTExfT0JKU0VDVElPTlMgKG9iamZpbGUsIG9zZWN0KQorCWlmIChvc2VjdC0+dGhlX2JmZF9zZWN0aW9uID09IHNlY3Rpb24pCisJICByZXR1cm4gb3ZlcmxheV9pc19tYXBwZWQgKG9zZWN0KTsKKworICByZXR1cm4gMDsKK30KKworLyogRnVuY3Rpb246IHBjX2luX3VubWFwcGVkX3JhbmdlCisgICBJZiBQQyBmYWxscyBpbnRvIHRoZSBsbWEgcmFuZ2Ugb2YgU0VDVElPTiwgcmV0dXJuIHRydWUsIGVsc2UgZmFsc2UuICAqLworCitDT1JFX0FERFIKK3BjX2luX3VubWFwcGVkX3JhbmdlIChwYywgc2VjdGlvbikKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKK3sKKyAgaW50IHNpemU7CisKKyAgaWYgKG92ZXJsYXlfZGVidWdnaW5nKQorICAgIGlmIChzZWN0aW9uICYmIHNlY3Rpb25faXNfb3ZlcmxheSAoc2VjdGlvbikpCisgICAgICB7CisJc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdGlvbik7CisJaWYgKHNlY3Rpb24tPmxtYSA8PSBwYyAmJiBwYyA8IHNlY3Rpb24tPmxtYSArIHNpemUpCisJICByZXR1cm4gMTsKKyAgICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIEZ1bmN0aW9uOiBwY19pbl9tYXBwZWRfcmFuZ2UKKyAgIElmIFBDIGZhbGxzIGludG8gdGhlIHZtYSByYW5nZSBvZiBTRUNUSU9OLCByZXR1cm4gdHJ1ZSwgZWxzZSBmYWxzZS4gICovCisKK0NPUkVfQUREUgorcGNfaW5fbWFwcGVkX3JhbmdlIChwYywgc2VjdGlvbikKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKK3sKKyAgaW50IHNpemU7CisKKyAgaWYgKG92ZXJsYXlfZGVidWdnaW5nKQorICAgIGlmIChzZWN0aW9uICYmIHNlY3Rpb25faXNfb3ZlcmxheSAoc2VjdGlvbikpCisgICAgICB7CisJc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdGlvbik7CisJaWYgKHNlY3Rpb24tPnZtYSA8PSBwYyAmJiBwYyA8IHNlY3Rpb24tPnZtYSArIHNpemUpCisJICByZXR1cm4gMTsKKyAgICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIEZ1bmN0aW9uOiBvdmVybGF5X3VubWFwcGVkX2FkZHJlc3MgKFBDLCBTRUNUSU9OKQorICAgUmV0dXJucyB0aGUgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIFBDIGluIHRoZSB1bm1hcHBlZCAobG9hZCkgcmFuZ2UuCisgICBNYXkgYmUgdGhlIHNhbWUgYXMgUEMuICAqLworCitDT1JFX0FERFIKK292ZXJsYXlfdW5tYXBwZWRfYWRkcmVzcyAocGMsIHNlY3Rpb24pCisgICAgIENPUkVfQUREUiBwYzsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247Cit7CisgIGlmIChvdmVybGF5X2RlYnVnZ2luZykKKyAgICBpZiAoc2VjdGlvbiAmJiBzZWN0aW9uX2lzX292ZXJsYXkgKHNlY3Rpb24pICYmCisJcGNfaW5fbWFwcGVkX3JhbmdlIChwYywgc2VjdGlvbikpCisgICAgICByZXR1cm4gcGMgKyBzZWN0aW9uLT5sbWEgLSBzZWN0aW9uLT52bWE7CisKKyAgcmV0dXJuIHBjOworfQorCisvKiBGdW5jdGlvbjogb3ZlcmxheV9tYXBwZWRfYWRkcmVzcyAoUEMsIFNFQ1RJT04pCisgICBSZXR1cm5zIHRoZSBhZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gUEMgaW4gdGhlIG1hcHBlZCAocnVudGltZSkgcmFuZ2UuCisgICBNYXkgYmUgdGhlIHNhbWUgYXMgUEMuICAqLworCitDT1JFX0FERFIKK292ZXJsYXlfbWFwcGVkX2FkZHJlc3MgKHBjLCBzZWN0aW9uKQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIGFzZWN0aW9uICpzZWN0aW9uOworeworICBpZiAob3ZlcmxheV9kZWJ1Z2dpbmcpCisgICAgaWYgKHNlY3Rpb24gJiYgc2VjdGlvbl9pc19vdmVybGF5IChzZWN0aW9uKSAmJgorCXBjX2luX3VubWFwcGVkX3JhbmdlIChwYywgc2VjdGlvbikpCisgICAgICByZXR1cm4gcGMgKyBzZWN0aW9uLT52bWEgLSBzZWN0aW9uLT5sbWE7CisKKyAgcmV0dXJuIHBjOworfQorCisKKy8qIEZ1bmN0aW9uOiBzeW1ib2xfb3ZlcmxheWVkX2FkZHJlc3MgCisgICBSZXR1cm4gb25lIG9mIHR3byBhZGRyZXNzZXMgKHJlbGF0aXZlIHRvIHRoZSBWTUEgb3IgdG8gdGhlIExNQSksCisgICBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgc2VjdGlvbiBpcyBtYXBwZWQgb3Igbm90LiAgKi8KKworQ09SRV9BRERSIAorc3ltYm9sX292ZXJsYXllZF9hZGRyZXNzIChhZGRyZXNzLCBzZWN0aW9uKQorICAgICBDT1JFX0FERFIgYWRkcmVzczsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247Cit7CisgIGlmIChvdmVybGF5X2RlYnVnZ2luZykKKyAgICB7CisgICAgICAvKiBJZiB0aGUgc3ltYm9sIGhhcyBubyBzZWN0aW9uLCBqdXN0IHJldHVybiBpdHMgcmVndWxhciBhZGRyZXNzLiAqLworICAgICAgaWYgKHNlY3Rpb24gPT0gMCkKKwlyZXR1cm4gYWRkcmVzczsKKyAgICAgIC8qIElmIHRoZSBzeW1ib2wncyBzZWN0aW9uIGlzIG5vdCBhbiBvdmVybGF5LCBqdXN0IHJldHVybiBpdHMgYWRkcmVzcyAqLworICAgICAgaWYgKCFzZWN0aW9uX2lzX292ZXJsYXkgKHNlY3Rpb24pKQorCXJldHVybiBhZGRyZXNzOworICAgICAgLyogSWYgdGhlIHN5bWJvbCdzIHNlY3Rpb24gaXMgbWFwcGVkLCBqdXN0IHJldHVybiBpdHMgYWRkcmVzcyAqLworICAgICAgaWYgKHNlY3Rpb25faXNfbWFwcGVkIChzZWN0aW9uKSkKKwlyZXR1cm4gYWRkcmVzczsKKyAgICAgIC8qCisgICAgICAgKiBIT1dFVkVSOiBpZiB0aGUgc3ltYm9sIGlzIGluIGFuIG92ZXJsYXkgc2VjdGlvbiB3aGljaCBpcyBOT1QgbWFwcGVkLAorICAgICAgICogdGhlbiByZXR1cm4gaXRzIExPQURFRCBhZGRyZXNzIHJhdGhlciB0aGFuIGl0cyB2bWEgYWRkcmVzcyEhCisgICAgICAgKi8KKyAgICAgIHJldHVybiBvdmVybGF5X3VubWFwcGVkX2FkZHJlc3MgKGFkZHJlc3MsIHNlY3Rpb24pOworICAgIH0KKyAgcmV0dXJuIGFkZHJlc3M7Cit9CisKKy8qIEZ1bmN0aW9uOiBmaW5kX3BjX292ZXJsYXkgKFBDKSAKKyAgIFJldHVybiB0aGUgYmVzdC1tYXRjaCBvdmVybGF5IHNlY3Rpb24gZm9yIFBDOgorICAgSWYgUEMgbWF0Y2hlcyBhIG1hcHBlZCBvdmVybGF5IHNlY3Rpb24ncyBWTUEsIHJldHVybiB0aGF0IHNlY3Rpb24uCisgICBFbHNlIGlmIFBDIG1hdGNoZXMgYW4gdW5tYXBwZWQgc2VjdGlvbidzIFZNQSwgcmV0dXJuIHRoYXQgc2VjdGlvbi4KKyAgIEVsc2UgaWYgUEMgbWF0Y2hlcyBhbiB1bm1hcHBlZCBzZWN0aW9uJ3MgTE1BLCByZXR1cm4gdGhhdCBzZWN0aW9uLiAgKi8KKworYXNlY3Rpb24gKgorZmluZF9wY19vdmVybGF5IChwYykKKyAgICAgQ09SRV9BRERSIHBjOworeworICBzdHJ1Y3Qgb2JqZmlsZSAgICAgKm9iamZpbGU7CisgIHN0cnVjdCBvYmpfc2VjdGlvbiAqb3NlY3QsICpiZXN0X21hdGNoID0gTlVMTDsKKworICBpZiAob3ZlcmxheV9kZWJ1Z2dpbmcpCisgICAgQUxMX09CSlNFQ1RJT05TIChvYmpmaWxlLCBvc2VjdCkKKyAgICAgIGlmIChzZWN0aW9uX2lzX292ZXJsYXkgKG9zZWN0LT50aGVfYmZkX3NlY3Rpb24pKQorCXsKKwkgIGlmIChwY19pbl9tYXBwZWRfcmFuZ2UgKHBjLCBvc2VjdC0+dGhlX2JmZF9zZWN0aW9uKSkKKwkgICAgeworCSAgICAgIGlmIChvdmVybGF5X2lzX21hcHBlZCAob3NlY3QpKQorCQlyZXR1cm4gb3NlY3QtPnRoZV9iZmRfc2VjdGlvbjsKKwkgICAgICBlbHNlCisJCWJlc3RfbWF0Y2ggPSBvc2VjdDsKKwkgICAgfQorCSAgZWxzZSBpZiAocGNfaW5fdW5tYXBwZWRfcmFuZ2UgKHBjLCBvc2VjdC0+dGhlX2JmZF9zZWN0aW9uKSkKKwkgICAgYmVzdF9tYXRjaCA9IG9zZWN0OworCX0KKyAgcmV0dXJuIGJlc3RfbWF0Y2ggPyBiZXN0X21hdGNoLT50aGVfYmZkX3NlY3Rpb24gOiBOVUxMOworfQorCisvKiBGdW5jdGlvbjogZmluZF9wY19tYXBwZWRfc2VjdGlvbiAoUEMpCisgICBJZiBQQyBmYWxscyBpbnRvIHRoZSBWTUEgYWRkcmVzcyByYW5nZSBvZiBhbiBvdmVybGF5IHNlY3Rpb24gdGhhdCBpcyAKKyAgIGN1cnJlbnRseSBtYXJrZWQgYXMgTUFQUEVELCByZXR1cm4gdGhhdCBzZWN0aW9uLiAgRWxzZSByZXR1cm4gTlVMTC4gICovCisKK2FzZWN0aW9uICoKK2ZpbmRfcGNfbWFwcGVkX3NlY3Rpb24gKHBjKQorICAgICBDT1JFX0FERFIgcGM7Cit7CisgIHN0cnVjdCBvYmpmaWxlICAgICAqb2JqZmlsZTsKKyAgc3RydWN0IG9ial9zZWN0aW9uICpvc2VjdDsKKworICBpZiAob3ZlcmxheV9kZWJ1Z2dpbmcpCisgICAgQUxMX09CSlNFQ1RJT05TIChvYmpmaWxlLCBvc2VjdCkKKyAgICAgIGlmIChwY19pbl9tYXBwZWRfcmFuZ2UgKHBjLCBvc2VjdC0+dGhlX2JmZF9zZWN0aW9uKSAmJgorCSAgb3ZlcmxheV9pc19tYXBwZWQgKG9zZWN0KSkKKwlyZXR1cm4gb3NlY3QtPnRoZV9iZmRfc2VjdGlvbjsKKworICByZXR1cm4gTlVMTDsKK30KKworLyogRnVuY3Rpb246IGxpc3Rfb3ZlcmxheXNfY29tbWFuZAorICAgUHJpbnQgYSBsaXN0IG9mIG1hcHBlZCBzZWN0aW9ucyBhbmQgdGhlaXIgUEMgcmFuZ2VzICovCisKK3ZvaWQKK2xpc3Rfb3ZlcmxheXNfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50ICAgICAgICAgICAgICAgIG5tYXBwZWQgPSAwOworICBzdHJ1Y3Qgb2JqZmlsZSAgICAgKm9iamZpbGU7CisgIHN0cnVjdCBvYmpfc2VjdGlvbiAqb3NlY3Q7CisKKyAgaWYgKG92ZXJsYXlfZGVidWdnaW5nKQorICAgIEFMTF9PQkpTRUNUSU9OUyAob2JqZmlsZSwgb3NlY3QpCisgICAgICBpZiAob3ZlcmxheV9pc19tYXBwZWQgKG9zZWN0KSkKKwl7CisJICBjb25zdCBjaGFyICpuYW1lOworCSAgYmZkX3ZtYSAgICAgbG1hLCB2bWE7CisJICBpbnQgICAgICAgICBzaXplOworCisJICB2bWEgID0gYmZkX3NlY3Rpb25fdm1hIChvYmpmaWxlLT5vYmZkLCBvc2VjdC0+dGhlX2JmZF9zZWN0aW9uKTsKKwkgIGxtYSAgPSBiZmRfc2VjdGlvbl9sbWEgKG9iamZpbGUtPm9iZmQsIG9zZWN0LT50aGVfYmZkX3NlY3Rpb24pOworCSAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAob3NlY3QtPnRoZV9iZmRfc2VjdGlvbik7CisJICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAob2JqZmlsZS0+b2JmZCwgb3NlY3QtPnRoZV9iZmRfc2VjdGlvbik7CisKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlNlY3Rpb24gJXMsIGxvYWRlZCBhdCAiLCBuYW1lKTsKKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAobG1hLCAxLCBnZGJfc3Rkb3V0KTsKKwkgIHB1dHNfZmlsdGVyZWQgKCIgLSAiKTsKKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAobG1hICsgc2l6ZSwgMSwgZ2RiX3N0ZG91dCk7CisJICBwcmludGZfZmlsdGVyZWQgKCIsIG1hcHBlZCBhdCAiKTsKKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAodm1hLCAxLCBnZGJfc3Rkb3V0KTsKKwkgIHB1dHNfZmlsdGVyZWQgKCIgLSAiKTsKKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAodm1hICsgc2l6ZSwgMSwgZ2RiX3N0ZG91dCk7CisJICBwdXRzX2ZpbHRlcmVkICgiXG4iKTsKKworCSAgbm1hcHBlZCArKzsKKwl9CisgIGlmIChubWFwcGVkID09IDApCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiTm8gc2VjdGlvbnMgYXJlIG1hcHBlZC5cbiIpOworfQorCisvKiBGdW5jdGlvbjogbWFwX292ZXJsYXlfY29tbWFuZAorICAgTWFyayB0aGUgbmFtZWQgc2VjdGlvbiBhcyBtYXBwZWQgKGllLiByZXNpZGluZyBhdCBpdHMgVk1BIGFkZHJlc3MpLiAgKi8KKwordm9pZAorbWFwX292ZXJsYXlfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCAgIGZyb21fdHR5OworeworICBzdHJ1Y3Qgb2JqZmlsZSAgICAgKm9iamZpbGUsICpvYmpmaWxlMjsKKyAgc3RydWN0IG9ial9zZWN0aW9uICpzZWMsICAgICAqc2VjMjsKKyAgYXNlY3Rpb24gICAgICAgICAgICpiZmRzZWM7CisKKyAgaWYgKCFvdmVybGF5X2RlYnVnZ2luZykKKyAgICBlcnJvciAoIk92ZXJsYXkgZGVidWdnaW5nIG5vdCBlbmFibGVkLiAgVXNlIHRoZSAnT1ZFUkxBWSBPTicgY29tbWFuZC4iKTsKKworICBpZiAoYXJncyA9PSAwIHx8ICphcmdzID09IDApCisgICAgZXJyb3IgKCJBcmd1bWVudCByZXF1aXJlZDogbmFtZSBvZiBhbiBvdmVybGF5IHNlY3Rpb24iKTsKKworICAvKiBGaXJzdCwgZmluZCBhIHNlY3Rpb24gbWF0Y2hpbmcgdGhlIHVzZXIgc3VwcGxpZWQgYXJndW1lbnQgKi8KKyAgQUxMX09CSlNFQ1RJT05TIChvYmpmaWxlLCBzZWMpCisgICAgaWYgKCFzdHJjbXAgKGJmZF9zZWN0aW9uX25hbWUgKG9iamZpbGUtPm9iZmQsIHNlYy0+dGhlX2JmZF9zZWN0aW9uKSwgYXJncykpCisgICAgICB7IAorCS8qIE5vdywgY2hlY2sgdG8gc2VlIGlmIHRoZSBzZWN0aW9uIGlzIGFuIG92ZXJsYXkuICovCisJYmZkc2VjID0gc2VjLT50aGVfYmZkX3NlY3Rpb247CisJaWYgKCFzZWN0aW9uX2lzX292ZXJsYXkgKGJmZHNlYykpCisJICBjb250aW51ZTsJCS8qIG5vdCBhbiBvdmVybGF5IHNlY3Rpb24gKi8KKworCS8qIE1hcmsgdGhlIG92ZXJsYXkgYXMgIm1hcHBlZCIgKi8KKwlzZWMtPm92bHlfbWFwcGVkID0gMTsKKworCS8qIE5leHQsIG1ha2UgYSBwYXNzIGFuZCB1bm1hcCBhbnkgc2VjdGlvbnMgdGhhdCBhcmUKKwkgICBvdmVybGFwcGVkIGJ5IHRoaXMgbmV3IHNlY3Rpb246ICovCisJQUxMX09CSlNFQ1RJT05TIChvYmpmaWxlMiwgc2VjMikKKwkgIGlmIChzZWMyLT5vdmx5X21hcHBlZCAmJgorCSAgICAgIHNlYyAhPSBzZWMyICYmCisJICAgICAgc2VjLT50aGVfYmZkX3NlY3Rpb24gIT0gc2VjMi0+dGhlX2JmZF9zZWN0aW9uICYmCisJICAgICAgKHBjX2luX21hcHBlZF9yYW5nZSAoc2VjMi0+YWRkciwgICAgc2VjLT50aGVfYmZkX3NlY3Rpb24pIHx8CisJICAgICAgIHBjX2luX21hcHBlZF9yYW5nZSAoc2VjMi0+ZW5kYWRkciwgc2VjLT50aGVfYmZkX3NlY3Rpb24pKSkKKwkgICAgeworCSAgICAgIGlmIChpbmZvX3ZlcmJvc2UpCisJCXByaW50Zl9maWx0ZXJlZCAoIk5vdGU6IHNlY3Rpb24gJXMgdW5tYXBwZWQgYnkgb3ZlcmxhcFxuIiwKKwkJCQkgYmZkX3NlY3Rpb25fbmFtZSAob2JqZmlsZS0+b2JmZCwgCisJCQkJCQkgICBzZWMyLT50aGVfYmZkX3NlY3Rpb24pKTsKKwkgICAgICBzZWMyLT5vdmx5X21hcHBlZCA9IDA7CS8qIHNlYzIgb3ZlcmxhcHMgc2VjOiB1bm1hcCBzZWMyICovCisJICAgIH0KKwlyZXR1cm47CisgICAgICB9CisgIGVycm9yICgiTm8gb3ZlcmxheSBzZWN0aW9uIGNhbGxlZCAlcyIsIGFyZ3MpOworfQorCisvKiBGdW5jdGlvbjogdW5tYXBfb3ZlcmxheV9jb21tYW5kCisgICBNYXJrIHRoZSBvdmVybGF5IHNlY3Rpb24gYXMgdW5tYXBwZWQgCisgICAoaWUuIHJlc2lkZW50IGluIGl0cyBMTUEgYWRkcmVzcyByYW5nZSwgcmF0aGVyIHRoYW4gdGhlIFZNQSByYW5nZSkuICAqLworCit2b2lkCit1bm1hcF9vdmVybGF5X2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgICBmcm9tX3R0eTsKK3sKKyAgc3RydWN0IG9iamZpbGUgICAgICpvYmpmaWxlOworICBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKKworICBpZiAoIW92ZXJsYXlfZGVidWdnaW5nKQorICAgIGVycm9yICgiT3ZlcmxheSBkZWJ1Z2dpbmcgbm90IGVuYWJsZWQuICBVc2UgdGhlICdPVkVSTEFZIE9OJyBjb21tYW5kLiIpOworCisgIGlmIChhcmdzID09IDAgfHwgKmFyZ3MgPT0gMCkKKyAgICBlcnJvciAoIkFyZ3VtZW50IHJlcXVpcmVkOiBuYW1lIG9mIGFuIG92ZXJsYXkgc2VjdGlvbiIpOworCisgIC8qIEZpcnN0LCBmaW5kIGEgc2VjdGlvbiBtYXRjaGluZyB0aGUgdXNlciBzdXBwbGllZCBhcmd1bWVudCAqLworICBBTExfT0JKU0VDVElPTlMgKG9iamZpbGUsIHNlYykKKyAgICBpZiAoIXN0cmNtcCAoYmZkX3NlY3Rpb25fbmFtZSAob2JqZmlsZS0+b2JmZCwgc2VjLT50aGVfYmZkX3NlY3Rpb24pLCBhcmdzKSkKKyAgICAgIHsKKwlpZiAoIXNlYy0+b3ZseV9tYXBwZWQpCisJICBlcnJvciAoIlNlY3Rpb24gJXMgaXMgbm90IG1hcHBlZCIsIGFyZ3MpOworCXNlYy0+b3ZseV9tYXBwZWQgPSAwOworCXJldHVybjsKKyAgICAgIH0KKyAgZXJyb3IgKCJObyBvdmVybGF5IHNlY3Rpb24gY2FsbGVkICVzIiwgYXJncyk7Cit9CisKKy8qIEZ1bmN0aW9uOiBvdmVybGF5X2F1dG9fY29tbWFuZAorICAgQSB1dGlsaXR5IGNvbW1hbmQgdG8gdHVybiBvbiBvdmVybGF5IGRlYnVnZ2luZy4KKyAgIFBvc3NpYmx5IHRoaXMgc2hvdWxkIGJlIGRvbmUgdmlhIGEgc2V0L3Nob3cgY29tbWFuZC4gKi8KKworc3RhdGljIHZvaWQKK292ZXJsYXlfYXV0b19jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50ICAgZnJvbV90dHk7Cit7CisgIG92ZXJsYXlfZGVidWdnaW5nID0gLTE7CisgIGlmIChpbmZvX3ZlcmJvc2UpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiQXV0b21hdGljIG92ZXJsYXkgZGVidWdnaW5nIGVuYWJsZWQuIik7Cit9CisKKy8qIEZ1bmN0aW9uOiBvdmVybGF5X21hbnVhbF9jb21tYW5kCisgICBBIHV0aWxpdHkgY29tbWFuZCB0byB0dXJuIG9uIG92ZXJsYXkgZGVidWdnaW5nLgorICAgUG9zc2libHkgdGhpcyBzaG91bGQgYmUgZG9uZSB2aWEgYSBzZXQvc2hvdyBjb21tYW5kLiAqLworCitzdGF0aWMgdm9pZAorb3ZlcmxheV9tYW51YWxfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCAgIGZyb21fdHR5OworeworICBvdmVybGF5X2RlYnVnZ2luZyA9IDE7CisgIGlmIChpbmZvX3ZlcmJvc2UpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiT3ZlcmxheSBkZWJ1Z2dpbmcgZW5hYmxlZC4iKTsKK30KKworLyogRnVuY3Rpb246IG92ZXJsYXlfb2ZmX2NvbW1hbmQKKyAgIEEgdXRpbGl0eSBjb21tYW5kIHRvIHR1cm4gb24gb3ZlcmxheSBkZWJ1Z2dpbmcuCisgICBQb3NzaWJseSB0aGlzIHNob3VsZCBiZSBkb25lIHZpYSBhIHNldC9zaG93IGNvbW1hbmQuICovCisKK3N0YXRpYyB2b2lkCitvdmVybGF5X29mZl9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50ICAgZnJvbV90dHk7Cit7CisgIG92ZXJsYXlfZGVidWdnaW5nID0gMDsgCisgIGlmIChpbmZvX3ZlcmJvc2UpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiT3ZlcmxheSBkZWJ1Z2dpbmcgZGlzYWJsZWQuIik7Cit9CisKK3N0YXRpYyB2b2lkCitvdmVybGF5X2xvYWRfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCAgIGZyb21fdHR5OworeworICBpZiAodGFyZ2V0X292ZXJsYXlfdXBkYXRlKQorICAgICgqdGFyZ2V0X292ZXJsYXlfdXBkYXRlKSAoTlVMTCk7CisgIGVsc2UKKyAgICBlcnJvciAoIlRoaXMgdGFyZ2V0IGRvZXMgbm90IGtub3cgaG93IHRvIHJlYWQgaXRzIG92ZXJsYXkgc3RhdGUuIik7Cit9CisKKy8qIEZ1bmN0aW9uOiBvdmVybGF5X2NvbW1hbmQKKyAgIEEgcGxhY2UtaG9sZGVyIGZvciBhIG1pcy10eXBlZCBjb21tYW5kICovCisKKy8qIENvbW1hbmQgbGlzdCBjaGFpbiBjb250YWluaW5nIGFsbCBkZWZpbmVkICJvdmVybGF5IiBzdWJjb21tYW5kcy4gKi8KK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpvdmVybGF5bGlzdDsKKworc3RhdGljIHZvaWQKK292ZXJsYXlfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcHJpbnRmX3VuZmlsdGVyZWQgCisgICAgKCJcIm92ZXJsYXlcIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIGFuIG92ZXJsYXkgY29tbWFuZC5cbiIpOworICBoZWxwX2xpc3QgKG92ZXJsYXlsaXN0LCAib3ZlcmxheSAiLCAtMSwgZ2RiX3N0ZG91dCk7Cit9CisKKworLyogVGFyZ2V0IE92ZXJsYXlzIGZvciB0aGUgIlNpbXBsZXN0IiBvdmVybGF5IG1hbmFnZXI6CisKKyAgIFRoaXMgaXMgR0RCJ3MgZGVmYXVsdCB0YXJnZXQgb3ZlcmxheSBsYXllci4gIEl0IHdvcmtzIHdpdGggdGhlIAorICAgbWluaW1hbCBvdmVybGF5IG1hbmFnZXIgc3VwcGxpZWQgYXMgYW4gZXhhbXBsZSBieSBDeWdudXMuICBUaGUgCisgICBlbnRyeSBwb2ludCBpcyB2aWEgYSBmdW5jdGlvbiBwb2ludGVyICJ0YXJnZXRfb3ZlcmxheV91cGRhdGUiLCAKKyAgIHNvIHRhcmdldHMgdGhhdCB1c2UgYSBkaWZmZXJlbnQgcnVudGltZSBvdmVybGF5IG1hbmFnZXIgY2FuIAorICAgc3Vic3RpdHV0ZSB0aGVpciBvd24gb3ZlcmxheV91cGRhdGUgZnVuY3Rpb24gYW5kIHRha2Ugb3ZlciB0aGUKKyAgIGZ1bmN0aW9uIHBvaW50ZXIuCisKKyAgIFRoZSBvdmVybGF5X3VwZGF0ZSBmdW5jdGlvbiBwb2tlcyBhcm91bmQgaW4gdGhlIHRhcmdldCdzIGRhdGEgc3RydWN0dXJlcworICAgdG8gc2VlIHdoYXQgb3ZlcmxheXMgYXJlIG1hcHBlZCwgYW5kIHVwZGF0ZXMgR0RCJ3Mgb3ZlcmxheSBtYXBwaW5nIHdpdGgKKyAgIHRoaXMgaW5mb3JtYXRpb24uCisKKyAgIEluIHRoaXMgc2ltcGxlIGltcGxlbWVudGF0aW9uLCB0aGUgdGFyZ2V0IGRhdGEgc3RydWN0dXJlcyBhcmUgYXMgZm9sbG93czoKKyAgIAl1bnNpZ25lZCBfbm92bHlzOwkJLyMgbnVtYmVyIG9mIG92ZXJsYXkgc2VjdGlvbnMgIy8KKwl1bnNpZ25lZCBfb3ZseV90YWJsZVtfbm92bHlzXVs0XSA9IHsKKwkgIHtWTUEsIFNJWkUsIExNQSwgTUFQUEVEfSwJLyMgb25lIGVudHJ5IHBlciBvdmVybGF5IHNlY3Rpb24gIy8KKwkgIHsuLi4sIC4uLiwgIC4uLiwgLi4ufSwKKwl9CisJdW5zaWduZWQgX25vdmx5X3JlZ2lvbnM7CS8jIG51bWJlciBvZiBvdmVybGF5IHJlZ2lvbnMgIy8KKwl1bnNpZ25lZCBfb3ZseV9yZWdpb25fdGFibGVbX25vdmx5X3JlZ2lvbnNdWzNdID0geworCSAge1ZNQSwgU0laRSwgTUFQUEVEX1RPX0xNQX0sCS8jIG9uZSBlbnRyeSBwZXIgb3ZlcmxheSByZWdpb24gIy8KKwkgIHsuLi4sIC4uLiwgIC4uLn0sCisJfQorICAgVGhlc2UgZnVuY3Rpb25zIHdpbGwgYXR0ZW1wdCB0byB1cGRhdGUgR0RCJ3MgbWFwcGVkbmVzcyBzdGF0ZSBpbiB0aGUKKyAgIHN5bWJvbCBzZWN0aW9uIHRhYmxlLCBiYXNlZCBvbiB0aGUgdGFyZ2V0J3MgbWFwcGVkbmVzcyBzdGF0ZS4KKworICAgVG8gZG8gdGhpcywgd2Uga2VlcCBhIGNhY2hlZCBjb3B5IG9mIHRoZSB0YXJnZXQncyBfb3ZseV90YWJsZSwgYW5kCisgICBhdHRlbXB0IHRvIGRldGVjdCB3aGVuIHRoZSBjYWNoZWQgY29weSBpcyBpbnZhbGlkYXRlZC4gIFRoZSBtYWluCisgICBlbnRyeSBwb2ludCBpcyAic2ltcGxlX292ZXJsYXlfdXBkYXRlKFNFQ1QpLCB3aGljaCBsb29rcyB1cCBTRUNUIGluCisgICB0aGUgY2FjaGVkIHRhYmxlIGFuZCByZS1yZWFkcyBvbmx5IHRoZSBlbnRyeSBmb3IgdGhhdCBzZWN0aW9uIGZyb20KKyAgIHRoZSB0YXJnZXQgKHdoZW5ldmVyIHBvc3NpYmxlKS4KKyAqLworCisvKiBDYWNoZWQsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBjb3BpZXMgb2YgdGhlIHRhcmdldCBkYXRhIHN0cnVjdHVyZXM6ICovCitzdGF0aWMgdW5zaWduZWQgICgqY2FjaGVfb3ZseV90YWJsZSlbNF0gPSAwOworI2lmIDAKK3N0YXRpYyB1bnNpZ25lZCAgKCpjYWNoZV9vdmx5X3JlZ2lvbl90YWJsZSlbM10gPSAwOworI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgIGNhY2hlX25vdmx5cyA9IDA7CisjaWYgMAorc3RhdGljIHVuc2lnbmVkICBjYWNoZV9ub3ZseV9yZWdpb25zID0gMDsKKyNlbmRpZgorc3RhdGljIENPUkVfQUREUiBjYWNoZV9vdmx5X3RhYmxlX2Jhc2UgPSAwOworI2lmIDAKK3N0YXRpYyBDT1JFX0FERFIgY2FjaGVfb3ZseV9yZWdpb25fdGFibGVfYmFzZSA9IDA7CisjZW5kaWYKK2VudW0gICBvdmx5X2luZGV4IHsgVk1BLCBTSVpFLCBMTUEsIE1BUFBFRH07CisjZGVmaW5lIFRBUkdFVF9MT05HX0JZVEVTIChUQVJHRVRfTE9OR19CSVQgLyBUQVJHRVRfQ0hBUl9CSVQpCisKKy8qIFRocm93IGF3YXkgdGhlIGNhY2hlZCBjb3B5IG9mIF9vdmx5X3RhYmxlICovCitzdGF0aWMgdm9pZAorc2ltcGxlX2ZyZWVfb3ZlcmxheV90YWJsZSAoKQoreworICBpZiAoY2FjaGVfb3ZseV90YWJsZSkKKyAgICBmcmVlKGNhY2hlX292bHlfdGFibGUpOworICBjYWNoZV9ub3ZseXMgICAgID0gMDsKKyAgY2FjaGVfb3ZseV90YWJsZSA9IE5VTEw7CisgIGNhY2hlX292bHlfdGFibGVfYmFzZSA9IDA7Cit9CisKKyNpZiAwCisvKiBUaHJvdyBhd2F5IHRoZSBjYWNoZWQgY29weSBvZiBfb3ZseV9yZWdpb25fdGFibGUgKi8KK3N0YXRpYyB2b2lkCitzaW1wbGVfZnJlZV9vdmVybGF5X3JlZ2lvbl90YWJsZSAoKQoreworICBpZiAoY2FjaGVfb3ZseV9yZWdpb25fdGFibGUpCisgICAgZnJlZShjYWNoZV9vdmx5X3JlZ2lvbl90YWJsZSk7CisgIGNhY2hlX25vdmx5X3JlZ2lvbnMgICAgID0gMDsKKyAgY2FjaGVfb3ZseV9yZWdpb25fdGFibGUgPSBOVUxMOworICBjYWNoZV9vdmx5X3JlZ2lvbl90YWJsZV9iYXNlID0gMDsKK30KKyNlbmRpZgorCisvKiBSZWFkIGFuIGFycmF5IG9mIGludHMgZnJvbSB0aGUgdGFyZ2V0IGludG8gYSBsb2NhbCBidWZmZXIuCisgICBDb252ZXJ0IHRvIGhvc3Qgb3JkZXIuICBpbnQgTEVOIGlzIG51bWJlciBvZiBpbnRzICAqLworc3RhdGljIHZvaWQKK3JlYWRfdGFyZ2V0X2xvbmdfYXJyYXkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgICAgIG1lbWFkZHI7CisgICAgIHVuc2lnbmVkIGludCAqbXlhZGRyOworICAgICBpbnQgICAgICAgICAgIGxlbjsKK3sKKyAgY2hhciAqYnVmID0gYWxsb2NhIChsZW4gKiBUQVJHRVRfTE9OR19CWVRFUyk7CisgIGludCAgICAgICAgICAgaTsKKworICByZWFkX21lbW9yeSAobWVtYWRkciwgYnVmLCBsZW4gKiBUQVJHRVRfTE9OR19CWVRFUyk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICBteWFkZHJbaV0gPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKFRBUkdFVF9MT05HX0JZVEVTICogaSArIGJ1ZiwgCisJCQkJCSAgVEFSR0VUX0xPTkdfQllURVMpOworfQorCisvKiBGaW5kIGFuZCBncmFiIGEgY29weSBvZiB0aGUgdGFyZ2V0IF9vdmx5X3RhYmxlCisgICAoYW5kIF9ub3ZseXMsIHdoaWNoIGlzIG5lZWRlZCBmb3IgdGhlIHRhYmxlJ3Mgc2l6ZSkgKi8KK3N0YXRpYyBpbnQgCitzaW1wbGVfcmVhZF9vdmVybGF5X3RhYmxlICgpCit7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bTsKKworICBzaW1wbGVfZnJlZV9vdmVybGF5X3RhYmxlICgpOworICBtc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sICgiX25vdmx5cyIsIDAsIDApOworICBpZiAobXN5bSAhPSBOVUxMKQorICAgIGNhY2hlX25vdmx5cyA9IHJlYWRfbWVtb3J5X2ludGVnZXIgKFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltKSwgNCk7CisgIGVsc2UgCisgICAgcmV0dXJuIDA7CS8qIGZhaWx1cmUgKi8KKyAgY2FjaGVfb3ZseV90YWJsZSA9ICh2b2lkICopIHhtYWxsb2MgKGNhY2hlX25vdmx5cyAqIHNpemVvZigqY2FjaGVfb3ZseV90YWJsZSkpOworICBpZiAoY2FjaGVfb3ZseV90YWJsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIG1zeW0gPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKCJfb3ZseV90YWJsZSIsIDAsIDApOworICAgICAgaWYgKG1zeW0gIT0gTlVMTCkKKwl7CisJICBjYWNoZV9vdmx5X3RhYmxlX2Jhc2UgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bSk7CisJICByZWFkX3RhcmdldF9sb25nX2FycmF5IChjYWNoZV9vdmx5X3RhYmxlX2Jhc2UsIAorCQkJCSAgKGludCAqKSBjYWNoZV9vdmx5X3RhYmxlLCAKKwkJCQkgIGNhY2hlX25vdmx5cyAqIDQpOworCX0KKyAgICAgIGVsc2UgCisJcmV0dXJuIDA7CS8qIGZhaWx1cmUgKi8KKyAgICB9CisgIGVsc2UgCisgICAgcmV0dXJuIDA7CS8qIGZhaWx1cmUgKi8KKyAgcmV0dXJuIDE7CS8qIFNVQ0NFU1MgKi8KK30KKworI2lmIDAKKy8qIEZpbmQgYW5kIGdyYWIgYSBjb3B5IG9mIHRoZSB0YXJnZXQgX292bHlfcmVnaW9uX3RhYmxlCisgICAoYW5kIF9ub3ZseV9yZWdpb25zLCB3aGljaCBpcyBuZWVkZWQgZm9yIHRoZSB0YWJsZSdzIHNpemUpICovCitzdGF0aWMgaW50IAorc2ltcGxlX3JlYWRfb3ZlcmxheV9yZWdpb25fdGFibGUgKCkKK3sKKyAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltOworCisgIHNpbXBsZV9mcmVlX292ZXJsYXlfcmVnaW9uX3RhYmxlICgpOworICBtc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sICgiX25vdmx5X3JlZ2lvbnMiLCAwLCAwKTsKKyAgaWYgKG1zeW0gIT0gTlVMTCkKKyAgICBjYWNoZV9ub3ZseV9yZWdpb25zID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW0pLCA0KTsKKyAgZWxzZSAKKyAgICByZXR1cm4gMDsJLyogZmFpbHVyZSAqLworICBjYWNoZV9vdmx5X3JlZ2lvbl90YWJsZSA9ICh2b2lkICopIHhtYWxsb2MgKGNhY2hlX25vdmx5X3JlZ2lvbnMgKiAxMik7CisgIGlmIChjYWNoZV9vdmx5X3JlZ2lvbl90YWJsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIG1zeW0gPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKCJfb3ZseV9yZWdpb25fdGFibGUiLCAwLCAwKTsKKyAgICAgIGlmIChtc3ltICE9IE5VTEwpCisJeworCSAgY2FjaGVfb3ZseV9yZWdpb25fdGFibGVfYmFzZSA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltKTsKKwkgIHJlYWRfdGFyZ2V0X2xvbmdfYXJyYXkgKGNhY2hlX292bHlfcmVnaW9uX3RhYmxlX2Jhc2UsIAorCQkJCSAgKGludCAqKSBjYWNoZV9vdmx5X3JlZ2lvbl90YWJsZSwgCisJCQkJICBjYWNoZV9ub3ZseV9yZWdpb25zICogMyk7CisJfQorICAgICAgZWxzZSAKKwlyZXR1cm4gMDsJLyogZmFpbHVyZSAqLworICAgIH0KKyAgZWxzZSAKKyAgICByZXR1cm4gMDsJLyogZmFpbHVyZSAqLworICByZXR1cm4gMTsJLyogU1VDQ0VTUyAqLworfQorI2VuZGlmCisKKy8qIEZ1bmN0aW9uOiBzaW1wbGVfb3ZlcmxheV91cGRhdGVfMSAKKyAgIEEgaGVscGVyIGZ1bmN0aW9uIGZvciBzaW1wbGVfb3ZlcmxheV91cGRhdGUuICBBc3N1bWluZyBhIGNhY2hlZCBjb3B5CisgICBvZiBfb3ZseV90YWJsZSBleGlzdHMsIGxvb2sgdGhyb3VnaCBpdCB0byBmaW5kIGFuIGVudHJ5IHdob3NlIHZtYSwKKyAgIGxtYSBhbmQgc2l6ZSBtYXRjaCB0aG9zZSBvZiBPU0VDVC4gIFJlLXJlYWQgdGhlIGVudHJ5IGFuZCBtYWtlIHN1cmUKKyAgIGl0IHN0aWxsIG1hdGNoZXMgT1NFQ1QgKGVsc2UgdGhlIHRhYmxlIG1heSBubyBsb25nZXIgYmUgdmFsaWQpLgorICAgU2V0IE9TRUNUJ3MgbWFwcGVkIHN0YXRlIHRvIG1hdGNoIHRoZSBlbnRyeS4gIFJldHVybjogMSBmb3IKKyAgIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuICAqLworCitzdGF0aWMgaW50CitzaW1wbGVfb3ZlcmxheV91cGRhdGVfMSAob3NlY3QpCisgICAgIHN0cnVjdCBvYmpfc2VjdGlvbiAqb3NlY3Q7Cit7CisgIGludCBpLCBzaXplOworCisgIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKG9zZWN0LT50aGVfYmZkX3NlY3Rpb24pOworICBmb3IgKGkgPSAwOyBpIDwgY2FjaGVfbm92bHlzOyBpKyspCisgICAgaWYgKGNhY2hlX292bHlfdGFibGVbaV1bVk1BXSAgPT0gb3NlY3QtPnRoZV9iZmRfc2VjdGlvbi0+dm1hICYmCisJY2FjaGVfb3ZseV90YWJsZVtpXVtMTUFdICA9PSBvc2VjdC0+dGhlX2JmZF9zZWN0aW9uLT5sbWEgLyogJiYKKwljYWNoZV9vdmx5X3RhYmxlW2ldW1NJWkVdID09IHNpemUgKi8pCisgICAgICB7CisJcmVhZF90YXJnZXRfbG9uZ19hcnJheSAoY2FjaGVfb3ZseV90YWJsZV9iYXNlICsgaSAqIFRBUkdFVF9MT05HX0JZVEVTLAorCQkJCShpbnQgKikgY2FjaGVfb3ZseV90YWJsZVtpXSwgNCk7CisJaWYgKGNhY2hlX292bHlfdGFibGVbaV1bVk1BXSAgPT0gb3NlY3QtPnRoZV9iZmRfc2VjdGlvbi0+dm1hICYmCisJICAgIGNhY2hlX292bHlfdGFibGVbaV1bTE1BXSAgPT0gb3NlY3QtPnRoZV9iZmRfc2VjdGlvbi0+bG1hIC8qICYmCisJICAgIGNhY2hlX292bHlfdGFibGVbaV1bU0laRV0gPT0gc2l6ZSAqLykKKwkgIHsKKwkgICAgb3NlY3QtPm92bHlfbWFwcGVkID0gY2FjaGVfb3ZseV90YWJsZVtpXVtNQVBQRURdOworCSAgICByZXR1cm4gMTsKKwkgIH0KKwllbHNlCS8qIFdhcm5pbmchICBXYXJuaW5nISAgVGFyZ2V0J3Mgb3ZseSB0YWJsZSBoYXMgY2hhbmdlZCEgKi8KKwkgIHJldHVybiAwOworICAgICAgfQorICByZXR1cm4gMDsKK30KKworLyogRnVuY3Rpb246IHNpbXBsZV9vdmVybGF5X3VwZGF0ZQorICAgSWYgT1NFQ1QgaXMgTlVMTCwgdGhlbiB1cGRhdGUgYWxsIHNlY3Rpb25zJyBtYXBwZWQgc3RhdGUgCisgICAoYWZ0ZXIgcmUtcmVhZGluZyB0aGUgZW50aXJlIHRhcmdldCBfb3ZseV90YWJsZSkuIAorICAgSWYgT1NFQ1QgaXMgbm9uLU5VTEwsIHRoZW4gdHJ5IHRvIGZpbmQgYSBtYXRjaGluZyBlbnRyeSBpbiB0aGUgCisgICBjYWNoZWQgb3ZseV90YWJsZSBhbmQgdXBkYXRlIG9ubHkgT1NFQ1QncyBtYXBwZWQgc3RhdGUuCisgICBJZiBhIGNhY2hlZCBlbnRyeSBjYW4ndCBiZSBmb3VuZCBvciB0aGUgY2FjaGUgaXNuJ3QgdmFsaWQsIHRoZW4gCisgICByZS1yZWFkIHRoZSBlbnRpcmUgY2FjaGUsIGFuZCBnbyBhaGVhZCBhbmQgdXBkYXRlIGFsbCBzZWN0aW9ucy4gICovCisKK3N0YXRpYyB2b2lkCitzaW1wbGVfb3ZlcmxheV91cGRhdGUgKG9zZWN0KQorICAgICBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKm9zZWN0OworeworICBzdHJ1Y3Qgb2JqZmlsZSAgICAgICAgKm9iamZpbGU7CisKKyAgLyogV2VyZSB3ZSBnaXZlbiBhbiBvc2VjdCB0byBsb29rIHVwPyAgTlVMTCBtZWFucyBkbyBhbGwgb2YgdGhlbS4gKi8KKyAgaWYgKG9zZWN0KQorICAgIC8qIEhhdmUgd2UgZ290IGEgY2FjaGVkIGNvcHkgb2YgdGhlIHRhcmdldCdzIG92ZXJsYXkgdGFibGU/ICovCisgICAgaWYgKGNhY2hlX292bHlfdGFibGUgIT0gTlVMTCkKKyAgICAgIC8qIERvZXMgaXRzIGNhY2hlZCBsb2NhdGlvbiBtYXRjaCB3aGF0J3MgY3VycmVudGx5IGluIHRoZSBzeW10YWI/ICovCisgICAgICBpZiAoY2FjaGVfb3ZseV90YWJsZV9iYXNlID09IAorCSAgU1lNQk9MX1ZBTFVFX0FERFJFU1MgKGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoIl9vdmx5X3RhYmxlIiwgMCwgMCkpKQorCS8qIFRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byBsb29rIHVwIHRoaXMgc2luZ2xlIHNlY3Rpb24gaW4gdGhlIGNhY2hlICovCisJaWYgKHNpbXBsZV9vdmVybGF5X3VwZGF0ZV8xIChvc2VjdCkpCisJICAvKiBGb3VuZCBpdCEgIFdlJ3JlIGRvbmUuICovCisJICByZXR1cm47CisKKyAgLyogQ2FjaGVkIHRhYmxlIG5vIGdvb2Q6IG5lZWQgdG8gcmVhZCB0aGUgZW50aXJlIHRhYmxlIGFuZXcuCisgICAgIE9yIGVsc2Ugd2Ugd2FudCBhbGwgdGhlIHNlY3Rpb25zLCBpbiB3aGljaCBjYXNlIGl0J3MgYWN0dWFsbHkKKyAgICAgbW9yZSBlZmZpY2llbnQgdG8gcmVhZCB0aGUgd2hvbGUgdGFibGUgaW4gb25lIGJsb2NrIGFueXdheS4gICovCisKKyAgaWYgKHNpbXBsZV9yZWFkX292ZXJsYXlfdGFibGUgKCkgPT0gMCkJLyogcmVhZCBmYWlsZWQ/ICBObyB0YWJsZT8gKi8KKyAgICB7CisgICAgICB3YXJuaW5nICgiRmFpbGVkIHRvIHJlYWQgdGhlIHRhcmdldCBvdmVybGF5IG1hcHBpbmcgdGFibGUuIik7CisgICAgICByZXR1cm47CisgICAgfQorICAvKiBOb3cgbWF5IGFzIHdlbGwgdXBkYXRlIGFsbCBzZWN0aW9ucywgZXZlbiBpZiBvbmx5IG9uZSB3YXMgcmVxdWVzdGVkLiAqLworICBBTExfT0JKU0VDVElPTlMgKG9iamZpbGUsIG9zZWN0KQorICAgIGlmIChzZWN0aW9uX2lzX292ZXJsYXkgKG9zZWN0LT50aGVfYmZkX3NlY3Rpb24pKQorICAgICAgeworCWludCBpLCBzaXplOworCisJc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAob3NlY3QtPnRoZV9iZmRfc2VjdGlvbik7CisJZm9yIChpID0gMDsgaSA8IGNhY2hlX25vdmx5czsgaSsrKQorCSAgaWYgKGNhY2hlX292bHlfdGFibGVbaV1bVk1BXSAgPT0gb3NlY3QtPnRoZV9iZmRfc2VjdGlvbi0+dm1hICYmCisJICAgICAgY2FjaGVfb3ZseV90YWJsZVtpXVtMTUFdICA9PSBvc2VjdC0+dGhlX2JmZF9zZWN0aW9uLT5sbWEgLyogJiYKKwkgICAgICBjYWNoZV9vdmx5X3RhYmxlW2ldW1NJWkVdID09IHNpemUgKi8pCisJICAgIHsgLyogb2JqX3NlY3Rpb24gbWF0Y2hlcyBpJ3RoIGVudHJ5IGluIG92bHlfdGFibGUgKi8KKwkgICAgICBvc2VjdC0+b3ZseV9tYXBwZWQgPSBjYWNoZV9vdmx5X3RhYmxlW2ldW01BUFBFRF07CisJICAgICAgYnJlYWs7CS8qIGZpbmlzaGVkIHdpdGggaW5uZXIgZm9yIGxvb3A6IGJyZWFrIG91dCAqLworCSAgICB9CisgICAgICB9Cit9CisKKwordm9pZAorX2luaXRpYWxpemVfc3ltZmlsZSAoKQoreworICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqYzsKKyAgCisgIGMgPSBhZGRfY21kICgic3ltYm9sLWZpbGUiLCBjbGFzc19maWxlcywgc3ltYm9sX2ZpbGVfY29tbWFuZCwKKyAgICJMb2FkIHN5bWJvbCB0YWJsZSBmcm9tIGV4ZWN1dGFibGUgZmlsZSBGSUxFLlxuXAorVGhlIGBmaWxlJyBjb21tYW5kIGNhbiBhbHNvIGxvYWQgc3ltYm9sIHRhYmxlcywgYXMgd2VsbCBhcyBzZXR0aW5nIHRoZSBmaWxlXG5cCit0byBleGVjdXRlLiIsICZjbWRsaXN0KTsKKyAgYy0+Y29tcGxldGVyID0gZmlsZW5hbWVfY29tcGxldGVyOworCisgIGMgPSBhZGRfY21kICgiYWRkLXN5bWJvbC1maWxlIiwgY2xhc3NfZmlsZXMsIGFkZF9zeW1ib2xfZmlsZV9jb21tYW5kLAorICAgIlVzYWdlOiBhZGQtc3ltYm9sLWZpbGUgRklMRSBBRERSXG5cCitMb2FkIHRoZSBzeW1ib2xzIGZyb20gRklMRSwgYXNzdW1pbmcgRklMRSBoYXMgYmVlbiBkeW5hbWljYWxseSBsb2FkZWQuXG5cCitBRERSIGlzIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBmaWxlJ3MgdGV4dC4iLAorCSAgICAgICAmY21kbGlzdCk7CisgIGMtPmNvbXBsZXRlciA9IGZpbGVuYW1lX2NvbXBsZXRlcjsKKworICBjID0gYWRkX2NtZCAoImFkZC1zaGFyZWQtc3ltYm9sLWZpbGVzIiwgY2xhc3NfZmlsZXMsCisJICAgICAgIGFkZF9zaGFyZWRfc3ltYm9sX2ZpbGVzX2NvbW1hbmQsCisgICAiTG9hZCB0aGUgc3ltYm9scyBmcm9tIHNoYXJlZCBvYmplY3RzIGluIHRoZSBkeW5hbWljIGxpbmtlcidzIGxpbmsgbWFwLiIsCisgICAJICAgICAgICZjbWRsaXN0KTsKKyAgYyA9IGFkZF9hbGlhc19jbWQgKCJhc3NmIiwgImFkZC1zaGFyZWQtc3ltYm9sLWZpbGVzIiwgY2xhc3NfZmlsZXMsIDEsCisJCSAgICAgJmNtZGxpc3QpOworCisgIGMgPSBhZGRfY21kICgibG9hZCIsIGNsYXNzX2ZpbGVzLCBsb2FkX2NvbW1hbmQsCisgICAiRHluYW1pY2FsbHkgbG9hZCBGSUxFIGludG8gdGhlIHJ1bm5pbmcgcHJvZ3JhbSwgYW5kIHJlY29yZCBpdHMgc3ltYm9sc1xuXAorZm9yIGFjY2VzcyBmcm9tIEdEQi4iLCAmY21kbGlzdCk7CisgIGMtPmNvbXBsZXRlciA9IGZpbGVuYW1lX2NvbXBsZXRlcjsKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoInN5bWJvbC1yZWxvYWRpbmciLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKKwkJICAoY2hhciAqKSZzeW1ib2xfcmVsb2FkaW5nLAorCSAgIlNldCBkeW5hbWljIHN5bWJvbCB0YWJsZSByZWxvYWRpbmcgbXVsdGlwbGUgdGltZXMgaW4gb25lIHJ1bi4iLAorCQkgICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKKworICBhZGRfcHJlZml4X2NtZCAoIm92ZXJsYXkiLCBjbGFzc19zdXBwb3J0LCBvdmVybGF5X2NvbW1hbmQsIAorCQkgICJDb21tYW5kcyBmb3IgZGVidWdnaW5nIG92ZXJsYXlzLiIsICZvdmVybGF5bGlzdCwgCisJCSAgIm92ZXJsYXkgIiwgMCwgJmNtZGxpc3QpOworCisgIGFkZF9jb21fYWxpYXMgKCJvdmx5IiwgIm92ZXJsYXkiLCBjbGFzc19hbGlhcywgMSk7CisgIGFkZF9jb21fYWxpYXMgKCJvdiIsICJvdmVybGF5IiwgY2xhc3NfYWxpYXMsIDEpOworCisgIGFkZF9jbWQgKCJtYXAtb3ZlcmxheSIsIGNsYXNzX3N1cHBvcnQsIG1hcF9vdmVybGF5X2NvbW1hbmQsIAorCSAgICJBc3NlcnQgdGhhdCBhbiBvdmVybGF5IHNlY3Rpb24gaXMgbWFwcGVkLiIsICZvdmVybGF5bGlzdCk7CisKKyAgYWRkX2NtZCAoInVubWFwLW92ZXJsYXkiLCBjbGFzc19zdXBwb3J0LCB1bm1hcF9vdmVybGF5X2NvbW1hbmQsIAorCSAgICJBc3NlcnQgdGhhdCBhbiBvdmVybGF5IHNlY3Rpb24gaXMgdW5tYXBwZWQuIiwgJm92ZXJsYXlsaXN0KTsKKworICBhZGRfY21kICgibGlzdC1vdmVybGF5cyIsIGNsYXNzX3N1cHBvcnQsIGxpc3Rfb3ZlcmxheXNfY29tbWFuZCwgCisJICAgIkxpc3QgbWFwcGluZ3Mgb2Ygb3ZlcmxheSBzZWN0aW9ucy4iLCAmb3ZlcmxheWxpc3QpOworCisgIGFkZF9jbWQgKCJtYW51YWwiLCBjbGFzc19zdXBwb3J0LCBvdmVybGF5X21hbnVhbF9jb21tYW5kLCAKKwkgICAiRW5hYmxlIG92ZXJsYXkgZGVidWdnaW5nLiIsICZvdmVybGF5bGlzdCk7CisgIGFkZF9jbWQgKCJvZmYiLCBjbGFzc19zdXBwb3J0LCBvdmVybGF5X29mZl9jb21tYW5kLCAKKwkgICAiRGlzYWJsZSBvdmVybGF5IGRlYnVnZ2luZy4iLCAmb3ZlcmxheWxpc3QpOworICBhZGRfY21kICgiYXV0byIsIGNsYXNzX3N1cHBvcnQsIG92ZXJsYXlfYXV0b19jb21tYW5kLCAKKwkgICAiRW5hYmxlIGF1dG9tYXRpYyBvdmVybGF5IGRlYnVnZ2luZy4iLCAmb3ZlcmxheWxpc3QpOworICBhZGRfY21kICgibG9hZC10YXJnZXQiLCBjbGFzc19zdXBwb3J0LCBvdmVybGF5X2xvYWRfY29tbWFuZCwgCisJICAgIlJlYWQgdGhlIG92ZXJsYXkgbWFwcGluZyBzdGF0ZSBmcm9tIHRoZSB0YXJnZXQuIiwgJm92ZXJsYXlsaXN0KTsKKworICAvKiBGaWxlbmFtZSBleHRlbnNpb24gdG8gc291cmNlIGxhbmd1YWdlIGxvb2t1cCB0YWJsZTogKi8KKyAgaW5pdF9maWxlbmFtZV9sYW5ndWFnZV90YWJsZSAoKTsKKyAgYyA9IGFkZF9zZXRfY21kICgiZXh0ZW5zaW9uLWxhbmd1YWdlIiwgY2xhc3NfZmlsZXMsIHZhcl9zdHJpbmdfbm9lc2NhcGUsCisJCSAgIChjaGFyICopICZleHRfYXJncywgCisJCSAgICJTZXQgbWFwcGluZyBiZXR3ZWVuIGZpbGVuYW1lIGV4dGVuc2lvbiBhbmQgc291cmNlIGxhbmd1YWdlLlxuXAorVXNhZ2U6IHNldCBleHRlbnNpb24tbGFuZ3VhZ2UgLmZvbyBiYXIiLAorCQkgICAgICZzZXRsaXN0KTsKKyAgYy0+ZnVuY3Rpb24uY2Z1bmMgPSBzZXRfZXh0X2xhbmdfY29tbWFuZDsKKworICBhZGRfaW5mbyAoImV4dGVuc2lvbnMiLCBpbmZvX2V4dF9sYW5nX2NvbW1hbmQsIAorCSAgICAiQWxsIGZpbGVuYW1lIGV4dGVuc2lvbnMgYXNzb2NpYXRlZCB3aXRoIGEgc291cmNlIGxhbmd1YWdlLiIpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3N5bWZpbGUuaCBiL2dkYi9zeW1maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM2M2UxZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9zeW1maWxlLmgKQEAgLTAsMCArMSwzMDAgQEAKKy8qIERlZmluaXRpb25zIGZvciByZWFkaW5nIHN5bWJvbCBmaWxlcyBpbnRvIEdEQi4KKyAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NgorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIChTWU1GSUxFX0gpCisjZGVmaW5lIFNZTUZJTEVfSAorCisvKiBUaGlzIGZpbGUgcmVxdWlyZXMgdGhhdCB5b3UgZmlyc3QgaW5jbHVkZSAiYmZkLmgiLiAgKi8KKworLyogUGFydGlhbCBzeW1ib2xzIGFyZSBzdG9yZWQgaW4gdGhlIHBzeW1ib2xfY2FjaGUgYW5kIHBvaW50ZXJzIHRvIHRoZW0KKyAgIGFyZSBrZXB0IGluIGEgZHluYW1pY2FsbHkgZ3Jvd24gYXJyYXkgdGhhdCBpcyBvYnRhaW5lZCBmcm9tIG1hbGxvYyBhbmQKKyAgIGdyb3duIGFzIG5lY2Vzc2FyeSB2aWEgcmVhbGxvYy4gIEVhY2ggb2JqZmlsZSB0eXBpY2FsbHkgaGFzIHR3byBvZiB0aGVzZSwKKyAgIG9uZSBmb3IgZ2xvYmFsIHN5bWJvbHMgYW5kIG9uZSBmb3Igc3RhdGljIHN5bWJvbHMuICBBbHRob3VnaCB0aGlzIGFkZHMKKyAgIGEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gZm9yIHN0b3Jpbmcgb3IgYWNjZXNzaW5nIHRoZSBwYXJ0aWFsIHN5bWJvbHMsCisgICBpdCBhbGxvd3MgdXMgdG8gdGhyb3cgYXdheSBkdXBsaWNhdGUgcHN5bWJvbHMgYW5kIHNldCBhbGwgcG9pbnRlcnMKKyAgIHRvIHRoZSBzaW5nbGUgc2F2ZWQgaW5zdGFuY2UuICovCisKK3N0cnVjdCBwc3ltYm9sX2FsbG9jYXRpb25fbGlzdCB7CisKKyAgLyogUG9pbnRlciB0byBiZWdpbm5pbmcgb2YgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFycmF5IG9mIHBvaW50ZXJzIHRvCisgICBwYXJ0aWFsIHN5bWJvbHMuICBUaGUgYXJyYXkgaXMgZHluYW1pY2FsbHkgZXhwYW5kZWQgYXMgbmVjZXNzYXJ5IHRvCisgICBhY2NvbW1vZGF0ZSBtb3JlIHBvaW50ZXJzLiAqLworCisgIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKmxpc3Q7CisKKyAgLyogUG9pbnRlciB0byBuZXh0IGF2YWlsYWJsZSBzbG90IGluIHdoaWNoIHRvIHN0b3JlIGEgcG9pbnRlciB0byBhIHBhcnRpYWwKKyAgICAgc3ltYm9sLiAqLworCisgIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKm5leHQ7CisKKyAgLyogTnVtYmVyIG9mIGFsbG9jYXRlZCBwb2ludGVyIHNsb3RzIGluIGN1cnJlbnQgZHluYW1pYyBhcnJheSAobm90IHRoZQorICAgICBudW1iZXIgb2YgYnl0ZXMgb2Ygc3RvcmFnZSkuICBUaGUgIm5leHQiIHBvaW50ZXIgd2lsbCBhbHdheXMgcG9pbnQKKyAgICAgc29tZXdoZXJlIGJldHdlZW4gbGlzdFswXSBhbmQgbGlzdFtzaXplXSwgYW5kIHdoZW4gYXQgbGlzdFtzaXplXSB0aGUKKyAgICAgYXJyYXkgd2lsbCBiZSBleHBhbmRlZCBvbiB0aGUgbmV4dCBhdHRlbXB0IHRvIHN0b3JlIGEgcG9pbnRlci4gKi8KKworICBpbnQgc2l6ZTsKK307CisKKy8qIFN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mIHN5bWJvbCByZWFkaW5nIGZ1bmN0aW9ucyBmb3IgdmFyaW91cworICAgb2JqZWN0IGZpbGUgdHlwZXMuICAqLworCitzdHJ1Y3Qgc3ltX2ZucyB7CisKKyAgLyogQkZEIGZsYXZvdXIgdGhhdCB3ZSBoYW5kbGUsIG9yIChhcyBhIHNwZWNpYWwga2x1ZGdlLCBzZWUgeGNvZmZyZWFkLmMsCisgICAgIChlbnVtIGJmZF9mbGF2b3VyKS0xIGZvciB4Y29mZikuICAqLworCisgIGVudW0gYmZkX2ZsYXZvdXIgc3ltX2ZsYXZvdXI7CisKKyAgLyogSW5pdGlhbGl6ZXMgYW55dGhpbmcgdGhhdCBpcyBnbG9iYWwgdG8gdGhlIGVudGlyZSBzeW1ib2wgdGFibGUuICBJdCBpcworICAgICBjYWxsZWQgZHVyaW5nIHN5bWJvbF9maWxlX2FkZCwgd2hlbiB3ZSBiZWdpbiBkZWJ1Z2dpbmcgYW4gZW50aXJlbHkgbmV3CisgICAgIHByb2dyYW0uICovCisKKyAgdm9pZCAoKnN5bV9uZXdfaW5pdCkgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOworCisgIC8qIFJlYWRzIGFueSBpbml0aWFsIGluZm9ybWF0aW9uIGZyb20gYSBzeW1ib2wgZmlsZSwgYW5kIGluaXRpYWxpemVzIHRoZQorICAgICBzdHJ1Y3Qgc3ltX2ZucyBTRiBpbiBwcmVwYXJhdGlvbiBmb3Igc3ltX3JlYWQoKS4gIEl0IGlzIGNhbGxlZCBldmVyeQorICAgICB0aW1lIHdlIHJlYWQgYSBzeW1ib2wgZmlsZSBmb3IgYW55IHJlYXNvbi4gKi8KKworICB2b2lkICgqc3ltX2luaXQpIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICopKTsKKworICAvKiBzeW1fcmVhZCAob2JqZmlsZSwgYWRkciwgbWFpbmxpbmUpCisgICAgIFJlYWRzIGEgc3ltYm9sIGZpbGUgaW50byBhIHBzeW10YWIgKG9yIHBvc3NpYmx5IGEgc3ltdGFiKS4KKyAgICAgT0JKRklMRSBpcyB0aGUgb2JqZmlsZSBzdHJ1Y3QgZm9yIHRoZSBmaWxlIHdlIGFyZSByZWFkaW5nLgorICAgICBTRUNUSU9OX09GRlNFVFMKKyAgICAgYXJlIHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgZmlsZSdzIHNwZWNpZmllZCBzZWN0aW9uIGFkZHJlc3NlcyBhbmQKKyAgICAgdGhlaXIgdHJ1ZSBhZGRyZXNzZXMgaW4gbWVtb3J5LgorICAgICBNQUlOTElORSBpcyAxIGlmIHRoaXMgaXMgdGhlCisgICAgIG1haW4gc3ltYm9sIHRhYmxlIGJlaW5nIHJlYWQsIGFuZCAwIGlmIGEgc2Vjb25kYXJ5CisgICAgIHN5bWJvbCBmaWxlIChlLmcuIHNoYXJlZCBsaWJyYXJ5IG9yIGR5bmFtaWNhbGx5IGxvYWRlZCBmaWxlKQorICAgICBpcyBiZWluZyByZWFkLiAgKi8KKworICB2b2lkICgqc3ltX3JlYWQpIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKiwgaW50KSk7CisKKyAgLyogQ2FsbGVkIHdoZW4gd2UgYXJlIGZpbmlzaGVkIHdpdGggYW4gb2JqZmlsZS4gIFNob3VsZCBkbyBhbGwgY2xlYW51cAorICAgICB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQgZm9yIHRoZSBwYXJ0aWN1bGFyIG9iamZpbGUuICovCisgCisgIHZvaWQgKCpzeW1fZmluaXNoKSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKKyAgLyogVGhpcyBmdW5jdGlvbiBwcm9kdWNlcyBhIGZpbGUtZGVwZW5kZW50IHNlY3Rpb25fb2Zmc2V0cyBzdHJ1Y3R1cmUsCisgICAgIGFsbG9jYXRlZCBpbiB0aGUgb2JqZmlsZSdzIHN0b3JhZ2UsIGFuZCBiYXNlZCBvbiB0aGUgcGFyYW1ldGVyLgorICAgICBUaGUgcGFyYW1ldGVyIGlzIGN1cnJlbnRseSBhIENPUkVfQUREUiAoRklYTUUhKSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgICB3aXRoIHRoZSBoaWdoZXIgbGV2ZWxzIG9mIEdEQi4gIEl0IHNob3VsZCBwcm9iYWJseSBiZSBjaGFuZ2VkIHRvCisgICAgIGEgc3RyaW5nLCB3aGVyZSBOVUxMIG1lYW5zIHRoZSBkZWZhdWx0LCBhbmQgb3RoZXJzIGFyZSBwYXJzZWQgaW4gYSBmaWxlCisgICAgIGRlcGVuZGVudCB3YXkuICBUaGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gaXMgaGFuZGVkIGluIHRvIHN5bV9yZWFkLiAgKi8KKworICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICooKnN5bV9vZmZzZXRzKSBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBDT1JFX0FERFIpKTsKKworICAvKiBGaW5kcyB0aGUgbmV4dCBzdHJ1Y3Qgc3ltX2Zucy4gIFRoZXkgYXJlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQKKyAgICAgaW4gd2hhdGV2ZXIgbW9kdWxlIGltcGxlbWVudHMgdGhlIGZ1bmN0aW9ucyBwb2ludGVkIHRvOyBhbiAKKyAgICAgaW5pdGlhbGl6ZXIgY2FsbHMgYWRkX3N5bXRhYl9mbnMgdG8gYWRkIHRoZW0gdG8gdGhlIGdsb2JhbCBjaGFpbi4gICovCisKKyAgc3RydWN0IHN5bV9mbnMgKm5leHQ7CisKK307CisKKy8qIFRoZSBkZWZhdWx0IHZlcnNpb24gb2Ygc3ltX2Zucy5zeW1fb2Zmc2V0cyBmb3IgcmVhZGVycyB0aGF0IGRvbid0CisgICBkbyBhbnl0aGluZyBzcGVjaWFsLiAgKi8KKworZXh0ZXJuIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKgorZGVmYXVsdF9zeW1maWxlX29mZnNldHMgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKm9iamZpbGUsIENPUkVfQUREUiBhZGRyKSk7CisKKworZXh0ZXJuIHZvaWQKK2V4dGVuZF9wc3ltYm9sX2xpc3QgUEFSQU1TICgoc3RydWN0IHBzeW1ib2xfYWxsb2NhdGlvbl9saXN0ICosCisJCQkgICAgIHN0cnVjdCBvYmpmaWxlICopKTsKKworLyogQWRkIGFueSBraW5kIG9mIHN5bWJvbCB0byBhIHBzeW1ib2xfYWxsb2NhdGlvbl9saXN0LiAqLworCisvKiAjaW5jbHVkZSAiZGVtYW5nbGUuaCIgKi8KKworZXh0ZXJuIHZvaWQKK2FkZF9wc3ltYm9sX3RvX2xpc3QgUEFSQU1TICgoY2hhciAqLCBpbnQsIG5hbWVzcGFjZV9lbnVtLCBlbnVtIGFkZHJlc3NfY2xhc3MsCisJCQkgICAgIHN0cnVjdCBwc3ltYm9sX2FsbG9jYXRpb25fbGlzdCAqLCBsb25nLCBDT1JFX0FERFIsCisJCQkgICAgIGVudW0gbGFuZ3VhZ2UsIHN0cnVjdCBvYmpmaWxlICopKTsKKworZXh0ZXJuIHZvaWQKK2FkZF9wc3ltYm9sX3dpdGhfZGVtX25hbWVfdG9fbGlzdCBQQVJBTVMgKChjaGFyICosIGludCwgY2hhciAqLCBpbnQsIG5hbWVzcGFjZV9lbnVtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGFkZHJlc3NfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBzeW1ib2xfYWxsb2NhdGlvbl9saXN0ICosIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcsIENPUkVfQUREUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGxhbmd1YWdlLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKKworZXh0ZXJuIHZvaWQgaW5pdF9wc3ltYm9sX2xpc3QgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgaW50KSk7CisKK2V4dGVybiB2b2lkCitzb3J0X3BzdF9zeW1ib2xzIFBBUkFNUyAoKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSk7CisKK2V4dGVybiBzdHJ1Y3Qgc3ltdGFiICoKK2FsbG9jYXRlX3N5bXRhYiBQQVJBTVMgKChjaGFyICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworZXh0ZXJuIGludAorZnJlZV9uYW1lZF9zeW10YWJzIFBBUkFNUyAoKGNoYXIgKikpOworCitleHRlcm4gdm9pZAorZmlsbF9pbl92cHRyX2ZpZWxkbm8gUEFSQU1TICgoc3RydWN0IHR5cGUgKikpOworCitleHRlcm4gdm9pZAorYWRkX3N5bXRhYl9mbnMgUEFSQU1TICgoc3RydWN0IHN5bV9mbnMgKikpOworCitleHRlcm4gdm9pZAoraW5pdF9lbnRyeV9wb2ludF9pbmZvIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICopKTsKKworZXh0ZXJuIHZvaWQKK3N5bXNfZnJvbV9vYmpmaWxlIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIENPUkVfQUREUiwgaW50LCBpbnQpKTsKKworZXh0ZXJuIHZvaWQKK25ld19zeW1maWxlX29iamZpbGUgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgaW50LCBpbnQpKTsKKworZXh0ZXJuIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqCitzdGFydF9wc3ltdGFiX2NvbW1vbiBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICosCisJCQkgICAgICBjaGFyICosIENPUkVfQUREUiwKKwkJCSAgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKiwKKwkJCSAgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKikpOworCisvKiBTb3J0aW5nIHlvdXIgc3ltYm9scyBmb3IgZmFzdCBsb29rdXAgb3IgYWxwaGFiZXRpY2FsIHByaW50aW5nLiAgKi8KKworZXh0ZXJuIHZvaWQKK3NvcnRfYmxvY2tfc3ltcyBQQVJBTVMgKChzdHJ1Y3QgYmxvY2sgKikpOworCitleHRlcm4gdm9pZAorc29ydF9zeW10YWJfc3ltcyBQQVJBTVMgKChzdHJ1Y3Qgc3ltdGFiICopKTsKKworLyogTWFrZSBhIGNvcHkgb2YgdGhlIHN0cmluZyBhdCBQVFIgd2l0aCBTSVpFIGNoYXJhY3RlcnMgaW4gdGhlIHN5bWJvbCBvYnN0YWNrCisgICAoYW5kIGFkZCBhIG51bGwgY2hhcmFjdGVyIGF0IHRoZSBlbmQgaW4gdGhlIGNvcHkpLgorICAgUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgY29weS4gICovCisKK2V4dGVybiBjaGFyICoKK29ic2F2ZXN0cmluZyBQQVJBTVMgKChjaGFyICosIGludCwgc3RydWN0IG9ic3RhY2sgKikpOworCisvKiBDb25jYXRlbmF0ZSBzdHJpbmdzIFMxLCBTMiBhbmQgUzM7IHJldHVybiB0aGUgbmV3IHN0cmluZy4KKyAgIFNwYWNlIGlzIGZvdW5kIGluIHRoZSBzeW1ib2xfb2JzdGFjay4gICovCisKK2V4dGVybiBjaGFyICoKK29iY29uY2F0IFBBUkFNUyAoKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrcCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCisJCSAgY29uc3QgY2hhciAqKSk7CisKKwkJCS8qICAgVmFyaWFibGVzICAgKi8KKworLyogd2hldGhlciB0byBhdXRvIGxvYWQgc29saWJzIGF0IHN0YXJ0dXAgdGltZTogIDAvMS4gCisKKyAgIE9uIGFsbCBwbGF0Zm9ybXMsIDAgbWVhbnMgImRvbid0IGF1dG8gbG9hZCIuCisKKyAgIE9uIEhQLVVYLCA+IDAgbWVhbnMgYSB0aHJlc2hob2xkLCBpbiBtZWdhYnl0ZXMsIG9mIHN5bWJvbCB0YWJsZSB3aGljaCB3aWxsCisgICBiZSBhdXRvIGxvYWRlZC4gIFdoZW4gdGhlIGN1bXVsYXRpdmUgc2l6ZSBvZiBzb2xpYiBzeW1ib2wgdGFibGUgZXhjZWVkcworICAgdGhpcyB0aHJlc2hob2xkLCBzb2xpYnMnIHN5bWJvbCB0YWJsZXMgd2lsbCBub3QgYmUgbG9hZGVkLgorCisgICBPbiBvdGhlciBwbGF0Zm9ybXMsID4gMCBtZWFucywgImFsd2F5cyBhdXRvIGxvYWQiLgorICAgKi8KKworZXh0ZXJuIGludCBhdXRvX3NvbGliX2FkZDsKKworLyogRnJvbSBzeW1maWxlLmMgKi8KKworZXh0ZXJuIENPUkVfQUREUgorZW50cnlfcG9pbnRfYWRkcmVzcyBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKgorYWxsb2NhdGVfcHN5bXRhYiBQQVJBTVMgKChjaGFyICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworZXh0ZXJuIHZvaWQKK2Rpc2NhcmRfcHN5bXRhYiBQQVJBTVMgKChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworCitleHRlcm4gdm9pZCBmaW5kX2xvd2VzdF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKKworZXh0ZXJuIGJmZCAqIHN5bWZpbGVfYmZkX29wZW4gUEFSQU1TICgoY2hhciAqKSk7CisKKy8qIFJlbW90ZSB0YXJnZXRzIG1heSB3aXNoIHRvIHVzZSB0aGlzIGFzIHRoZWlyIGxvYWQgZnVuY3Rpb24uICAqLworZXh0ZXJuIHZvaWQgZ2VuZXJpY19sb2FkIFBBUkFNUyAoKGNoYXIgKm5hbWUsIGludCBmcm9tX3R0eSkpOworCisvKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3Igb3ZlcmxheSBzZWN0aW9uczogKi8KK2V4dGVybiBpbnQgb3ZlcmxheV9kZWJ1Z2dpbmc7CitleHRlcm4gaW50IG92ZXJsYXlfY2FjaGVfaW52YWxpZDsKKworLyogcmV0dXJuIHRoZSAibWFwcGVkIiBvdmVybGF5IHNlY3Rpb24gIGNvbnRhaW5pbmcgdGhlIFBDICovCitleHRlcm4gYXNlY3Rpb24gKiAKK2ZpbmRfcGNfbWFwcGVkX3NlY3Rpb24gUEFSQU1TICgoQ09SRV9BRERSKSk7CisKKy8qIHJldHVybiBhbnkgb3ZlcmxheSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIFBDIChldmVuIGluIGl0cyBMTUEgcmVnaW9uKSAqLworZXh0ZXJuIGFzZWN0aW9uICoKK2ZpbmRfcGNfb3ZlcmxheSBQQVJBTVMgKChDT1JFX0FERFIpKTsKKworLyogcmV0dXJuIHRydWUgaWYgdGhlIHNlY3Rpb24gaXMgYW4gb3ZlcmxheSAqLworZXh0ZXJuIGludAorc2VjdGlvbl9pc19vdmVybGF5IFBBUkFNUyAoKGFzZWN0aW9uICopKTsKKworLyogcmV0dXJuIHRydWUgaWYgdGhlIG92ZXJsYXkgc2VjdGlvbiBpcyBjdXJyZW50bHkgIm1hcHBlZCIgKi8KK2V4dGVybiBpbnQKK3NlY3Rpb25faXNfbWFwcGVkIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKKworLyogcmV0dXJuIHRydWUgaWYgcGMgYmVsb25ncyB0byBzZWN0aW9uJ3MgVk1BICovCitleHRlcm4gQ09SRV9BRERSCitwY19pbl9tYXBwZWRfcmFuZ2UgUEFSQU1TICgoQ09SRV9BRERSLCBhc2VjdGlvbiAqKSk7CisKKy8qIHJldHVybiB0cnVlIGlmIHBjIGJlbG9uZ3MgdG8gc2VjdGlvbidzIExNQSAqLworZXh0ZXJuIENPUkVfQUREUgorcGNfaW5fdW5tYXBwZWRfcmFuZ2UgUEFSQU1TICgoQ09SRV9BRERSLCBhc2VjdGlvbiAqKSk7CisKKy8qIG1hcCBhbiBhZGRyZXNzIGZyb20gYSBzZWN0aW9uJ3MgTE1BIHRvIGl0cyBWTUEgKi8KK2V4dGVybiBDT1JFX0FERFIKK292ZXJsYXlfbWFwcGVkX2FkZHJlc3MgUEFSQU1TICgoQ09SRV9BRERSLCBhc2VjdGlvbiAqKSk7CisKKy8qIG1hcCBhbiBhZGRyZXNzIGZyb20gYSBzZWN0aW9uJ3MgVk1BIHRvIGl0cyBMTUEgKi8KK2V4dGVybiBDT1JFX0FERFIKK292ZXJsYXlfdW5tYXBwZWRfYWRkcmVzcyBQQVJBTVMgKChDT1JFX0FERFIsIGFzZWN0aW9uICopKTsKKworLyogY29udmVydCBhbiBhZGRyZXNzIGluIGFuIG92ZXJsYXkgc2VjdGlvbiAoZm9yY2UgaW50byBWTUEgcmFuZ2UpICovCitleHRlcm4gQ09SRV9BRERSIAorc3ltYm9sX292ZXJsYXllZF9hZGRyZXNzIFBBUkFNUyAoKENPUkVfQUREUiwgYXNlY3Rpb24gKikpOworCisvKiBGcm9tIGR3YXJmcmVhZC5jICovCisKK2V4dGVybiB2b2lkCitkd2FyZl9idWlsZF9wc3ltdGFicyBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICosIGludCwKKwkJCSAgICAgIGZpbGVfcHRyLCB1bnNpZ25lZCBpbnQsIGZpbGVfcHRyLCB1bnNpZ25lZCBpbnQpKTsKKworLyogRnJvbSBkd2FyZjJyZWFkLmMgKi8KKworZXh0ZXJuIGludCBkd2FyZjJfaGFzX2luZm8gUEFSQU1TICgoYmZkICphYmZkKSk7CisKK2V4dGVybiB2b2lkIGR3YXJmMl9idWlsZF9wc3ltdGFicyBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLAorCQkJCQkgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICosCisJCQkJCSAgIGludCkpOworLyogRnJvbSBtZGVidWdyZWFkLmMgKi8KKworLyogSGFjayB0byBmb3JjZSBzdHJ1Y3R1cmVzIHRvIGV4aXN0IGJlZm9yZSB1c2UgaW4gcGFyYW1ldGVyIGxpc3QuICAqLworc3RydWN0IGVjb2ZmX2RlYnVnX2hhY2sKK3sKKyAgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmE7CisgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpiOworfTsKK2V4dGVybiB2b2lkCittZGVidWdfYnVpbGRfcHN5bXRhYnMgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqLAorCQkJICAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICosCisJCQkgICAgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqKSk7CisKK2V4dGVybiB2b2lkCitlbGZtZGVidWdfYnVpbGRfcHN5bXRhYnMgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICosCisJCQkJICBhc2VjdGlvbiAqLAorCQkJCSAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqKSk7CisKKyNlbmRpZgkvKiAhZGVmaW5lZChTWU1GSUxFX0gpICovCmRpZmYgLS1naXQgYS9nZGIvc3ltbS1uYXQuYyBiL2dkYi9zeW1tLW5hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NjEwNjYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvc3ltbS1uYXQuYwpAQCAtMCwwICsxLDg0NiBAQAorLyogU2VxdWVudCBTeW1tZXRyeSBob3N0IGludGVyZmFjZSwgZm9yIEdEQiB3aGVuIHJ1bm5pbmcgdW5kZXIgVW5peC4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg5LCAxOTkxLCAxOTkyLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEZJWE1FLCBzb21lIDM4Ny1zcGVjaWZpYyBpdGVtcyBvZiB1c2UgdGFrZW4gZnJvbSBpMzg3LXRkZXAuYyAtLSBvdWdodCB0byBiZQorICAgbWVyZ2VkIGJhY2sgaW4uICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgInRhcmdldC5oIgorCisvKiBGSVhNRTogV2hhdCBpcyB0aGUgX0lOS0VSTkVMIGRlZmluZSBmb3I/ICAqLworI2RlZmluZSBfSU5LRVJORUwKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyN1bmRlZiBfSU5LRVJORUwKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy91c2VyLmg+CisjaW5jbHVkZSA8c3lzL3Byb2MuaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSAiZ2RiX3N0YXQuaCIKKyNpZmRlZiBfU0VRVUVOVF8KKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisjZWxzZQorLyogRHluaXggaGFzIG9ubHkgbWFjaGluZS9wdHJhY2UuaCwgd2hpY2ggaXMgYWxyZWFkeSBpbmNsdWRlZCBieSBzeXMvdXNlci5oICAqLworLyogRHluaXggaGFzIG5vIG1wdHJhY2UgY2FsbCAqLworI2RlZmluZSBtcHRyYWNlIHB0cmFjZQorI2VuZGlmCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2d0dHkuaD4KKyNkZWZpbmUgVEVSTUlOQUwgc3RydWN0IHNndHR5YgorCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorCit2b2lkCitzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMocmVnbm8pCitpbnQgcmVnbm87Cit7CisgIHN0cnVjdCBwdF9yZWdzZXQgcmVnczsKKyAgaW50IGk7CisgIGV4dGVybiBjaGFyIHJlZ2lzdGVyc1tdOworCisgIC8qIEZJWE1FOiBGZXRjaGluZyB0aGUgcmVnaXN0ZXJzIGlzIGEga2x1ZGdlIHRvIGluaXRpYWxpemUgYWxsIGVsZW1lbnRzCisgICAgIGluIHRoZSBmcHUgYW5kIGZwYSBzdGF0dXMuIFRoaXMgd29ya3MgZm9yIG5vcm1hbCBkZWJ1Z2dpbmcsIGJ1dAorICAgICBtaWdodCBjYXVzZSBwcm9ibGVtcyB3aGVuIGNhbGxpbmcgZnVuY3Rpb25zIGluIHRoZSBpbmZlcmlvci4KKyAgICAgQXQgbGVhc3QgZnB1X2NvbnRyb2wgYW5kIGZwYV9wY3IgKHByb2JhYmx5IG1vcmUpIHNob3VsZCBiZSBhZGRlZCAKKyAgICAgdG8gdGhlIHJlZ2lzdGVycyBhcnJheSB0byBzb2x2ZSB0aGlzIHByb3Blcmx5LiAgKi8KKyAgbXB0cmFjZSAoWFBUX1JSRUdTLCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSAmcmVncywgMCk7CisKKyAgcmVncy5wcl9lYXggPSAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSgwKV07CisgIHJlZ3MucHJfZWJ4ID0gKihpbnQgKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoNSldOworICByZWdzLnByX2VjeCA9ICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKDIpXTsKKyAgcmVncy5wcl9lZHggPSAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSgxKV07CisgIHJlZ3MucHJfZXNpID0gKihpbnQgKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoNildOworICByZWdzLnByX2VkaSA9ICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKDcpXTsKKyAgcmVncy5wcl9lc3AgPSAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURSgxNCldOworICByZWdzLnByX2VicCA9ICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKDE1KV07CisgIHJlZ3MucHJfZWlwID0gKihpbnQgKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoMTYpXTsKKyAgcmVncy5wcl9mbGFncyA9ICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKDE3KV07CisgIGZvciAoaSA9IDA7IGkgPCAzMTsgaSsrKQorICAgIHsKKyAgICAgIHJlZ3MucHJfZnBhLmZwYV9yZWdzW2ldID0KKwkqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURShGUDFfUkVHTlVNK2kpXTsKKyAgICB9CisgIG1lbWNweSAocmVncy5wcl9mcHUuZnB1X3N0YWNrWzBdLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU1QwX1JFR05VTSldLCAxMCk7CisgIG1lbWNweSAocmVncy5wcl9mcHUuZnB1X3N0YWNrWzFdLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU1QxX1JFR05VTSldLCAxMCk7CisgIG1lbWNweSAocmVncy5wcl9mcHUuZnB1X3N0YWNrWzJdLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU1QyX1JFR05VTSldLCAxMCk7CisgIG1lbWNweSAocmVncy5wcl9mcHUuZnB1X3N0YWNrWzNdLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU1QzX1JFR05VTSldLCAxMCk7CisgIG1lbWNweSAocmVncy5wcl9mcHUuZnB1X3N0YWNrWzRdLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU1Q0X1JFR05VTSldLCAxMCk7CisgIG1lbWNweSAocmVncy5wcl9mcHUuZnB1X3N0YWNrWzVdLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU1Q1X1JFR05VTSldLCAxMCk7CisgIG1lbWNweSAocmVncy5wcl9mcHUuZnB1X3N0YWNrWzZdLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU1Q2X1JFR05VTSldLCAxMCk7CisgIG1lbWNweSAocmVncy5wcl9mcHUuZnB1X3N0YWNrWzddLCAmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU1Q3X1JFR05VTSldLCAxMCk7CisgIG1wdHJhY2UgKFhQVF9XUkVHUywgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgJnJlZ3MsIDApOworfQorCit2b2lkCitmZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGludCBpOworICBzdHJ1Y3QgcHRfcmVnc2V0IHJlZ3M7CisgIGV4dGVybiBjaGFyIHJlZ2lzdGVyc1tdOworCisgIHJlZ2lzdGVyc19mZXRjaGVkICgpOworCisgIG1wdHJhY2UgKFhQVF9SUkVHUywgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgJnJlZ3MsIDApOworICAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURShFQVhfUkVHTlVNKV0gPSByZWdzLnByX2VheDsKKyAgKihpbnQgKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoRUJYX1JFR05VTSldID0gcmVncy5wcl9lYng7CisgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKEVDWF9SRUdOVU0pXSA9IHJlZ3MucHJfZWN4OworICAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURShFRFhfUkVHTlVNKV0gPSByZWdzLnByX2VkeDsKKyAgKihpbnQgKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoRVNJX1JFR05VTSldID0gcmVncy5wcl9lc2k7CisgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKEVESV9SRUdOVU0pXSA9IHJlZ3MucHJfZWRpOworICAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURShFQlBfUkVHTlVNKV0gPSByZWdzLnByX2VicDsKKyAgKihpbnQgKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoRVNQX1JFR05VTSldID0gcmVncy5wcl9lc3A7CisgICooaW50ICopJnJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKEVJUF9SRUdOVU0pXSA9IHJlZ3MucHJfZWlwOworICAqKGludCAqKSZyZWdpc3RlcnNbUkVHSVNURVJfQllURShFRkxBR1NfUkVHTlVNKV0gPSByZWdzLnByX2ZsYWdzOworICBmb3IgKGkgPSAwOyBpIDwgRlBBX05SRUdTOyBpKyspCisgICAgeworICAgICAgKihpbnQgKikmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoRlAxX1JFR05VTStpKV0gPQorCXJlZ3MucHJfZnBhLmZwYV9yZWdzW2ldOworICAgIH0KKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU1QwX1JFR05VTSldLCByZWdzLnByX2ZwdS5mcHVfc3RhY2tbMF0sIDEwKTsKKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU1QxX1JFR05VTSldLCByZWdzLnByX2ZwdS5mcHVfc3RhY2tbMV0sIDEwKTsKKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU1QyX1JFR05VTSldLCByZWdzLnByX2ZwdS5mcHVfc3RhY2tbMl0sIDEwKTsKKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU1QzX1JFR05VTSldLCByZWdzLnByX2ZwdS5mcHVfc3RhY2tbM10sIDEwKTsKKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU1Q0X1JFR05VTSldLCByZWdzLnByX2ZwdS5mcHVfc3RhY2tbNF0sIDEwKTsKKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU1Q1X1JFR05VTSldLCByZWdzLnByX2ZwdS5mcHVfc3RhY2tbNV0sIDEwKTsKKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU1Q2X1JFR05VTSldLCByZWdzLnByX2ZwdS5mcHVfc3RhY2tbNl0sIDEwKTsKKyAgbWVtY3B5ICgmcmVnaXN0ZXJzW1JFR0lTVEVSX0JZVEUoU1Q3X1JFR05VTSldLCByZWdzLnByX2ZwdS5mcHVfc3RhY2tbN10sIDEwKTsKK30KKwwKKy8qIEZJWE1FOiAgVGhpcyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggaTM4Ny10ZGVwLmMgYXMgd2VsbC4gKi8KK3N0YXRpYworcHJpbnRfZnB1X3N0YXR1cyhlcCkKK3N0cnVjdCBwdF9yZWdzZXQgZXA7Cit7CisgICAgaW50IGk7CisgICAgaW50IGJvdGhzdGF0dXM7CisgICAgaW50IHRvcDsKKyAgICBpbnQgZnByZWc7CisgICAgdW5zaWduZWQgY2hhciAqcDsKKyAgICAKKyAgICBwcmludGZfdW5maWx0ZXJlZCgiODAzODc6Iik7CisgICAgaWYgKGVwLnByX2ZwdS5mcHVfaXAgPT0gMCkgeworCXByaW50Zl91bmZpbHRlcmVkKCIgbm90IGluIHVzZS5cbiIpOworCXJldHVybjsKKyAgICB9IGVsc2UgeworCXByaW50Zl91bmZpbHRlcmVkKCJcbiIpOworICAgIH0KKyAgICBpZiAoZXAucHJfZnB1LmZwdV9zdGF0dXMgIT0gMCkgeworCXByaW50XzM4N19zdGF0dXNfd29yZCAoZXAucHJfZnB1LmZwdV9zdGF0dXMpOworICAgIH0KKyAgICBwcmludF8zODdfY29udHJvbF93b3JkIChlcC5wcl9mcHUuZnB1X2NvbnRyb2wpOworICAgIHByaW50Zl91bmZpbHRlcmVkICgibGFzdCBleGNlcHRpb246ICIpOworICAgIHByaW50Zl91bmZpbHRlcmVkICgib3Bjb2RlIDB4JXg7ICIsIGVwLnByX2ZwdS5mcHVfcnN2ZDQpOworICAgIHByaW50Zl91bmZpbHRlcmVkICgicGMgMHgleDoweCV4OyAiLCBlcC5wcl9mcHUuZnB1X2NzLCBlcC5wcl9mcHUuZnB1X2lwKTsKKyAgICBwcmludGZfdW5maWx0ZXJlZCAoIm9wZXJhbmQgMHgleDoweCV4XG4iLCBlcC5wcl9mcHUuZnB1X2RhdGFfb2Zmc2V0LCBlcC5wcl9mcHUuZnB1X29wX3NlbCk7CisgICAgCisgICAgdG9wID0gKGVwLnByX2ZwdS5mcHVfc3RhdHVzID4+IDExKSAmIDc7CisgICAgCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJyZWdubyAgdGFnICBtc2IgICAgICAgICAgICAgIGxzYiAgdmFsdWVcbiIpOworICAgIGZvciAoZnByZWcgPSA3OyBmcHJlZyA+PSAwOyBmcHJlZy0tKSAKKwl7CisJICAgIGRvdWJsZSB2YWw7CisJICAgIAorCSAgICBwcmludGZfdW5maWx0ZXJlZCAoIiVzICVkOiAiLCBmcHJlZyA9PSB0b3AgPyAiPT4iIDogIiAgIiwgZnByZWcpOworCSAgICAKKwkgICAgc3dpdGNoICgoZXAucHJfZnB1LmZwdV90YWcgPj4gKGZwcmVnICogMikpICYgMykgCisJCXsKKwkJY2FzZSAwOiBwcmludGZfdW5maWx0ZXJlZCAoInZhbGlkICIpOyBicmVhazsKKwkJY2FzZSAxOiBwcmludGZfdW5maWx0ZXJlZCAoInplcm8gICIpOyBicmVhazsKKwkJY2FzZSAyOiBwcmludGZfdW5maWx0ZXJlZCAoInRyYXAgICIpOyBicmVhazsKKwkJY2FzZSAzOiBwcmludGZfdW5maWx0ZXJlZCAoImVtcHR5ICIpOyBicmVhazsKKwkJfQorCSAgICBmb3IgKGkgPSA5OyBpID49IDA7IGktLSkKKwkJcHJpbnRmX3VuZmlsdGVyZWQgKCIlMDJ4IiwgZXAucHJfZnB1LmZwdV9zdGFja1tmcHJlZ11baV0pOworCSAgICAKKwkgICAgaTM4N190b19kb3VibGUgKChjaGFyICopZXAucHJfZnB1LmZwdV9zdGFja1tmcHJlZ10sIChjaGFyICopJnZhbCk7CisJICAgIHByaW50Zl91bmZpbHRlcmVkICgiICAlZ1xuIiwgdmFsKTsKKwl9CisgICAgaWYgKGVwLnByX2ZwdS5mcHVfcnN2ZDEpCisJd2FybmluZyAoInJzdmQxIGlzIDB4JXhcbiIsIGVwLnByX2ZwdS5mcHVfcnN2ZDEpOworICAgIGlmIChlcC5wcl9mcHUuZnB1X3JzdmQyKQorCXdhcm5pbmcgKCJyc3ZkMiBpcyAweCV4XG4iLCBlcC5wcl9mcHUuZnB1X3JzdmQyKTsKKyAgICBpZiAoZXAucHJfZnB1LmZwdV9yc3ZkMykKKwl3YXJuaW5nICgicnN2ZDMgaXMgMHgleFxuIiwgZXAucHJfZnB1LmZwdV9yc3ZkMyk7CisgICAgaWYgKGVwLnByX2ZwdS5mcHVfcnN2ZDUpCisJd2FybmluZyAoInJzdmQ1IGlzIDB4JXhcbiIsIGVwLnByX2ZwdS5mcHVfcnN2ZDUpOworfQorCisKK3ByaW50XzExNjdfY29udHJvbF93b3JkKHBjcikKK3Vuc2lnbmVkIGludCBwY3I7CisKK3sKKyAgICBpbnQgcGNyX3RtcDsKKworICAgIHBjcl90bXAgPSBwY3IgJiBGUEFfUENSX01PREU7CisgICAgcHJpbnRmX3VuZmlsdGVyZWQoIlx0TU9ERT0gJSN4OyBSTkQ9ICUjeCAiLCBwY3JfdG1wLCBwY3JfdG1wICYgMTIpOworICAgIHN3aXRjaCAocGNyX3RtcCAmIDEyKSB7CisgICAgY2FzZSAwOgorCXByaW50Zl91bmZpbHRlcmVkKCJSTiAoTmVhcmVzdCBWYWx1ZSkiKTsKKwlicmVhazsKKyAgICBjYXNlIDE6CisJcHJpbnRmX3VuZmlsdGVyZWQoIlJaIChaZXJvKSIpOworCWJyZWFrOworICAgIGNhc2UgMjoKKwlwcmludGZfdW5maWx0ZXJlZCgiUlAgKFBvc2l0aXZlIEluZmluaXR5KSIpOworCWJyZWFrOworICAgIGNhc2UgMzoKKwlwcmludGZfdW5maWx0ZXJlZCgiUk0gKE5lZ2F0aXZlIEluZmluaXR5KSIpOworCWJyZWFrOworICAgIH0KKyAgICBwcmludGZfdW5maWx0ZXJlZCgiOyBJUk5EPSAlZCAiLCBwY3JfdG1wICYgMik7CisgICAgaWYgKDAgPT0gcGNyX3RtcCAmIDIpIHsKKwlwcmludGZfdW5maWx0ZXJlZCgiKHNhbWUgYXMgUk5EKVxuIik7CisgICAgfSBlbHNlIHsKKwlwcmludGZfdW5maWx0ZXJlZCgiKHRvd2FyZCB6ZXJvKVxuIik7CisgICAgfQorICAgIHBjcl90bXAgPSBwY3IgJiBGUEFfUENSX0VNOworICAgIHByaW50Zl91bmZpbHRlcmVkKCJcdEVNPSAlI3giLCBwY3JfdG1wKTsKKyAgICBpZiAocGNyX3RtcCAmIEZQQV9QQ1JfRU1fRE0pIHByaW50Zl91bmZpbHRlcmVkKCIgRE0iKTsKKyAgICBpZiAocGNyX3RtcCAmIEZQQV9QQ1JfRU1fVU9NKSBwcmludGZfdW5maWx0ZXJlZCgiIFVPTSIpOworICAgIGlmIChwY3JfdG1wICYgRlBBX1BDUl9FTV9QTSkgcHJpbnRmX3VuZmlsdGVyZWQoIiBQTSIpOworICAgIGlmIChwY3JfdG1wICYgRlBBX1BDUl9FTV9VTSkgcHJpbnRmX3VuZmlsdGVyZWQoIiBVTSIpOworICAgIGlmIChwY3JfdG1wICYgRlBBX1BDUl9FTV9PTSkgcHJpbnRmX3VuZmlsdGVyZWQoIiBPTSIpOworICAgIGlmIChwY3JfdG1wICYgRlBBX1BDUl9FTV9aTSkgcHJpbnRmX3VuZmlsdGVyZWQoIiBaTSIpOworICAgIGlmIChwY3JfdG1wICYgRlBBX1BDUl9FTV9JTSkgcHJpbnRmX3VuZmlsdGVyZWQoIiBJTSIpOworICAgIHByaW50Zl91bmZpbHRlcmVkKCJcbiIpOworICAgIHBjcl90bXAgPSBGUEFfUENSX0NDOworICAgIHByaW50Zl91bmZpbHRlcmVkKCJcdENDPSAlI3giLCBwY3JfdG1wKTsKKyAgICBpZiAocGNyX3RtcCAmIEZQQV9QQ1JfMjBNSFopIHByaW50Zl91bmZpbHRlcmVkKCIgMjBNSFoiKTsKKyAgICBpZiAocGNyX3RtcCAmIEZQQV9QQ1JfQ0NfWikgcHJpbnRmX3VuZmlsdGVyZWQoIiBaIik7CisgICAgaWYgKHBjcl90bXAgJiBGUEFfUENSX0NDX0MyKSBwcmludGZfdW5maWx0ZXJlZCgiIEMyIik7CisKKyAgICAvKiBEeW5peCBkZWZpbmVzIEZQQV9QQ1JfQ0NfQzAgdG8gMHgxMDAgYW5kIHB0eCBkZWZpbmVzCisgICAgICAgRlBBX1BDUl9DQ19DMSB0byAweDEwMC4gIFVzZSB3aGljaGV2ZXIgaXMgZGVmaW5lZCBhbmQgYXNzdW1lCisgICAgICAgdGhlIE9TIGtub3dzIHdoYXQgaXQgaXMgZG9pbmcuICAqLworI2lmZGVmIEZQQV9QQ1JfQ0NfQzEKKyAgICBpZiAocGNyX3RtcCAmIEZQQV9QQ1JfQ0NfQzEpIHByaW50Zl91bmZpbHRlcmVkKCIgQzEiKTsKKyNlbHNlCisgICAgaWYgKHBjcl90bXAgJiBGUEFfUENSX0NDX0MwKSBwcmludGZfdW5maWx0ZXJlZCgiIEMwIik7CisjZW5kaWYKKworICAgIHN3aXRjaCAocGNyX3RtcCkKKyAgICAgIHsKKyAgICAgIGNhc2UgRlBBX1BDUl9DQ19aOgorCXByaW50Zl91bmZpbHRlcmVkKCIgKEVxdWFsKSIpOworCWJyZWFrOworI2lmZGVmIEZQQV9QQ1JfQ0NfQzEKKyAgICAgIGNhc2UgRlBBX1BDUl9DQ19DMToKKyNlbHNlCisgICAgICBjYXNlIEZQQV9QQ1JfQ0NfQzA6CisjZW5kaWYKKwlwcmludGZfdW5maWx0ZXJlZCgiIChMZXNzIHRoYW4pIik7CisJYnJlYWs7CisgICAgICBjYXNlIDA6CisJcHJpbnRmX3VuZmlsdGVyZWQoIiAoR3JlYXRlciB0aGFuKSIpOworCWJyZWFrOworICAgICAgY2FzZSBGUEFfUENSX0NDX1ogfCAKKyNpZmRlZiBGUEFfUENSX0NDX0MxCisJRlBBX1BDUl9DQ19DMQorI2Vsc2UKKwlGUEFfUENSX0NDX0MwCisjZW5kaWYKKwkgIHwgRlBBX1BDUl9DQ19DMjoKKwlwcmludGZfdW5maWx0ZXJlZCgiIChVbm9yZGVyZWQpIik7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCXByaW50Zl91bmZpbHRlcmVkKCIgKFVuZGVmaW5lZCkiKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICBwcmludGZfdW5maWx0ZXJlZCgiXG4iKTsKKyAgICBwY3JfdG1wID0gcGNyICYgRlBBX1BDUl9BRTsKKyAgICBwcmludGZfdW5maWx0ZXJlZCgiXHRBRT0gJSN4IiwgcGNyX3RtcCk7CisgICAgaWYgKHBjcl90bXAgJiBGUEFfUENSX0FFX0RFKSBwcmludGZfdW5maWx0ZXJlZCgiIERFIik7CisgICAgaWYgKHBjcl90bXAgJiBGUEFfUENSX0FFX1VPRSkgcHJpbnRmX3VuZmlsdGVyZWQoIiBVT0UiKTsKKyAgICBpZiAocGNyX3RtcCAmIEZQQV9QQ1JfQUVfUEUpIHByaW50Zl91bmZpbHRlcmVkKCIgUEUiKTsKKyAgICBpZiAocGNyX3RtcCAmIEZQQV9QQ1JfQUVfVUUpIHByaW50Zl91bmZpbHRlcmVkKCIgVUUiKTsKKyAgICBpZiAocGNyX3RtcCAmIEZQQV9QQ1JfQUVfT0UpIHByaW50Zl91bmZpbHRlcmVkKCIgT0UiKTsKKyAgICBpZiAocGNyX3RtcCAmIEZQQV9QQ1JfQUVfWkUpIHByaW50Zl91bmZpbHRlcmVkKCIgWkUiKTsKKyAgICBpZiAocGNyX3RtcCAmIEZQQV9QQ1JfQUVfRUUpIHByaW50Zl91bmZpbHRlcmVkKCIgRUUiKTsKKyAgICBpZiAocGNyX3RtcCAmIEZQQV9QQ1JfQUVfSUUpIHByaW50Zl91bmZpbHRlcmVkKCIgSUUiKTsKKyAgICBwcmludGZfdW5maWx0ZXJlZCgiXG4iKTsKK30KKworcHJpbnRfMTE2N19yZWdzKHJlZ3MpCitsb25nIHJlZ3NbRlBBX05SRUdTXTsKKworeworICAgIGludCBpOworCisgICAgdW5pb24geworCWRvdWJsZQlkOworCWxvbmcJbFsyXTsKKyAgICB9IHhkOworICAgIHVuaW9uIHsKKwlmbG9hdAlmOworCWxvbmcJbDsKKyAgICB9IHhmOworCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRlBBX05SRUdTOyBpKyspIHsKKwl4Zi5sID0gcmVnc1tpXTsKKwlwcmludGZfdW5maWx0ZXJlZCgiJSVmcCVkOiByYXc9ICUjeCwgc2luZ2xlPSAlZiIsIGkrMSwgcmVnc1tpXSwgeGYuZik7CisJaWYgKCEoaSAmIDEpKSB7CisJICAgIHByaW50Zl91bmZpbHRlcmVkKCJcbiIpOworCX0gZWxzZSB7CisJICAgIHhkLmxbMV0gPSByZWdzW2ldOworCSAgICB4ZC5sWzBdID0gcmVnc1tpKzFdOworCSAgICBwcmludGZfdW5maWx0ZXJlZCgiLCBkb3VibGU9ICVmXG4iLCB4ZC5kKTsKKwl9CisgICAgfQorfQorCitwcmludF9mcGFfc3RhdHVzKGVwKQorc3RydWN0IHB0X3JlZ3NldCBlcDsKKworeworCisgICAgcHJpbnRmX3VuZmlsdGVyZWQoIldUTCAxMTY3OiIpOworICAgIGlmIChlcC5wcl9mcGEuZnBhX3BjciAhPTApIHsKKwlwcmludGZfdW5maWx0ZXJlZCgiXG4iKTsKKwlwcmludF8xMTY3X2NvbnRyb2xfd29yZChlcC5wcl9mcGEuZnBhX3Bjcik7CisJcHJpbnRfMTE2N19yZWdzKGVwLnByX2ZwYS5mcGFfcmVncyk7CisgICAgfSBlbHNlIHsKKwlwcmludGZfdW5maWx0ZXJlZCgiIG5vdCBpbiB1c2UuXG4iKTsKKyAgICB9Cit9CisKKyNpZiAwIC8qIGRpc2FibGVkIGJlY2F1c2UgaXQgZG9lc24ndCBnbyB0aHJvdWdoIHRoZSB0YXJnZXQgdmVjdG9yLiAgKi8KK2kzODZfZmxvYXRfaW5mbyAoKQoreworICBjaGFyIHVidWZbVVBBR0VTKk5CUEddOworICBzdHJ1Y3QgcHRfcmVnc2V0IHJlZ3NldDsKKworICBpZiAoaGF2ZV9pbmZlcmlvcl9wKCkpCisgICAgeworICAgICAgUFRSQUNFX1JFQURfUkVHUyAoaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgJnJlZ3NldCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IGNvcmVjaGFuID0gYmZkX2NhY2hlX2xvb2t1cCAoY29yZV9iZmQpOworICAgICAgaWYgKGxzZWVrIChjb3JlY2hhbiwgMCwgMCkgPCAwKQorCXsKKwkgIHBlcnJvciAoInNlZWsgb24gY29yZSBmaWxlIik7CisJfQorICAgICAgaWYgKG15cmVhZCAoY29yZWNoYW4sIHVidWYsIFVQQUdFUypOQlBHKSA8IDApCisJeworCSAgcGVycm9yICgicmVhZCBvbiBjb3JlIGZpbGUiKTsKKwl9CisgICAgICAvKiBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAqLworICAgICAgcmVnc2V0LnByX2ZwdSA9ICgoc3RydWN0IHVzZXIgKikgdWJ1ZiktPnVfZnB1c2F2ZTsKKyAgICAgIHJlZ3NldC5wcl9mcGEgPSAoKHN0cnVjdCB1c2VyICopIHVidWYpLT51X2ZwYXNhdmU7CisgICAgfQorICBwcmludF9mcHVfc3RhdHVzKHJlZ3NldCk7CisgIHByaW50X2ZwYV9zdGF0dXMocmVnc2V0KTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9sYXRpbGUgaW50IGdvdF9zaWdjaGxkOworCisvKkFSR1NVU0VEKi8KKy8qIFRoaXMgd2lsbCBldmVudHVhbGx5IGJlIG1vcmUgaW50ZXJlc3RpbmcuICovCit2b2lkCitzaWdjaGxkX2hhbmRsZXIoc2lnbm8pCisJaW50IHNpZ25vOworeworCWdvdF9zaWdjaGxkKys7Cit9CisKKy8qCisgKiBTaWduYWxzIGZvciB3aGljaCB0aGUgZGVmYXVsdCBhY3Rpb24gZG9lcyBub3QgY2F1c2UgdGhlIHByb2Nlc3MKKyAqIHRvIGRpZS4gIFNlZSA8c3lzL3NpZ25hbC5oPiBmb3Igd2hlcmUgdGhpcyBjYW1lIGZyb20gKGFsYXMsIHdlCisgKiBjYW4ndCB1c2UgdGhvc2UgbWFjcm9zIGRpcmVjdGx5KQorICovCisjaWZuZGVmIHNpZ21hc2sKKyNkZWZpbmUgc2lnbWFzayhzKSAoMSA8PCAoKHMpIC0gMSkpCisjZW5kaWYKKyNkZWZpbmUgU0lHTkFMU19ERkxfU0FGRSBzaWdtYXNrKFNJR1NUT1ApIHwgc2lnbWFzayhTSUdUU1RQKSB8IFwKKwlzaWdtYXNrKFNJR1RUSU4pIHwgc2lnbWFzayhTSUdUVE9VKSB8IHNpZ21hc2soU0lHQ0hMRCkgfCBcCisJc2lnbWFzayhTSUdDT05UKSB8IHNpZ21hc2soU0lHV0lOQ0gpIHwgc2lnbWFzayhTSUdQV1IpIHwgXAorCXNpZ21hc2soU0lHVVJHKSB8IHNpZ21hc2soU0lHUE9MTCkKKworI2lmZGVmIEFUVEFDSF9ERVRBQ0gKKy8qCisgKiBUaGFua3MgdG8gWFBUX01QREVCVUdHRVIsIHdlIGhhdmUgdG8gbWFuZ2UgY2hpbGRfd2FpdCgpLgorICovCitpbnQKK2NoaWxkX3dhaXQocGlkLCBzdGF0dXMpCisgICAgIGludCBwaWQ7CisgICAgIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqc3RhdHVzOworeworICBpbnQgc2F2ZV9lcnJubywgcnYsIHh2YWxvZmYsIHNhb2ZmLCBzYV9oYW5kOworICBzdHJ1Y3QgcHRfc3RvcCBwdDsKKyAgc3RydWN0IHVzZXIgdTsKKyAgc2lnc2V0X3Qgc2V0OworICAvKiBIb3N0IHNpZ25hbCBudW1iZXIgZm9yIGEgc2lnbmFsIHdoaWNoIHRoZSBpbmZlcmlvciB0ZXJtaW5hdGVzIHdpdGgsIG9yCisgICAgIDAgaWYgaXQgaGFzbid0IHRlcm1pbmF0ZWQgZHVlIHRvIGEgc2lnbmFsLiAgKi8KKyAgc3RhdGljIGludCBkZWF0aF9ieV9zaWduYWwgPSAwOworI2lmZGVmIFNWUjRfU0hBUkVEX0xJQlMJCS8qIHVzZSB0aGlzIHRvIGRpc3Rpbmd1aXNoIHB0eCAyIHZzIHB0eCA0ICovCisgIHByc3RhdHVzX3QgcHN0YXR1czsKKyNlbmRpZgorCisgIGRvIHsKKyAgICBzZXRfc2lnaW50X3RyYXAoKTsJLyogQ2F1c2VzIFNJR0lOVCB0byBiZSBwYXNzZWQgb24gdG8gdGhlCisJCQkgICBhdHRhY2hlZCBwcm9jZXNzLiAqLworICAgIHNhdmVfZXJybm8gPSBlcnJubzsKKworICAgIGdvdF9zaWdjaGxkID0gMDsKKworICAgIHNpZ2VtcHR5c2V0KCZzZXQpOworCisgICAgd2hpbGUgKGdvdF9zaWdjaGxkID09IDApIHsKKwkgICAgc2lnc3VzcGVuZCgmc2V0KTsKKyAgICB9CisgICAgCisgICAgY2xlYXJfc2lnaW50X3RyYXAoKTsKKworICAgIHJ2ID0gbXB0cmFjZShYUFRfU1RPUFNUQVQsIDAsIChjaGFyICopJnB0LCAwKTsKKyAgICBpZiAoLTEgPT0gcnYpIHsKKwkgICAgcHJpbnRmKCJYUFRfU1RPUFNUQVQ6IGVycm5vICVkXG4iLCBlcnJubyk7IC8qIERFQlVHICovCisJICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHBpZCA9IHB0LnBzX3BpZDsKKworICAgIGlmIChwaWQgIT0gaW5mZXJpb3JfcGlkKSB7CisJICAgIC8qIE5PVEU6IHRoZSBteXN0ZXJ5IGZvcmsgaW4gY3NoL3Rjc2ggbmVlZHMgdG8gYmUgaWdub3JlZC4KKwkgICAgICogV2Ugc2hvdWxkIG5vdCByZXR1cm4gbmV3IGNoaWxkcmVuIGZvciB0aGUgaW5pdGlhbCBydW4KKwkgICAgICogb2YgYSBwcm9jZXNzIHVudGlsIGl0IGhhcyBkb25lIHRoZSBleGVjLgorCSAgICAgKi8KKwkgICAgLyogaW5mZXJpb3IgcHJvYmFibHkgZm9ya2VkOyBzZW5kIGl0IG9uIGl0cyB3YXkgKi8KKwkgICAgcnYgPSBtcHRyYWNlKFhQVF9VTkRFQlVHLCBwaWQsIDAsIDApOworCSAgICBpZiAoLTEgPT0gcnYpIHsKKwkJICAgIHByaW50ZigiY2hpbGRfd2FpdDogWFBUX1VOREVCVUc6IHBpZCAlZDogJXNcbiIsIHBpZCwKKwkJCSAgIHNhZmVfc3RyZXJyb3IoZXJybm8pKTsKKwkgICAgfQorCSAgICBjb250aW51ZTsKKyAgICB9CisgICAgLyogRklYTUU6IERvIHdlIGRlYWwgd2l0aCBmb3JrIG5vdGlmaWNhdGlvbiBjb3JyZWN0bHk/ICAqLworICAgIHN3aXRjaCAocHQucHNfcmVhc29uKSB7CisgICAgY2FzZSBQVFNfRk9SSzoKKwkvKiBtdWx0aSBwcm9jOiB0cmVhdCBsaWtlIFBUU19FWEVDICovCisJICAgIC8qCisJICAgICAqIFByZXRlbmQgdGhpcyBkaWRuJ3QgaGFwcGVuLCBzaW5jZSBnZGIgaXNuJ3Qgc2V0IHVwCisJICAgICAqIHRvIGRlYWwgd2l0aCBzdG9wcyBvbiBmb3JrLgorCSAgICAgKi8KKwkgICAgcnYgPSBwdHJhY2UoUFRfQ09OVFNJRywgcGlkLCAxLCAwKTsKKwkgICAgaWYgKC0xID09IHJ2KSB7CisJCSAgICBwcmludGYoIlBUU19GT1JLOiBQVF9DT05UU0lHOiBlcnJvciAlZFxuIiwgZXJybm8pOworCSAgICB9CisJICAgIGNvbnRpbnVlOworICAgIGNhc2UgUFRTX0VYRUM6CisJICAgIC8qCisJICAgICAqIFByZXRlbmQgdGhpcyBpcyBhIFNJR1RSQVAuCisJICAgICAqLworCSAgICBzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKwkgICAgc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1RSQVA7CisJICAgIGJyZWFrOworICAgIGNhc2UgUFRTX0VYSVQ6CisJICAgIC8qCisJICAgICAqIE5vdGU6IHdlIHN0b3AgYmVmb3JlIHRoZSBleGl0IGFjdHVhbGx5IG9jY3Vycy4gIEV4dHJhY3QKKwkgICAgICogdGhlIGV4aXQgY29kZSBmcm9tIHRoZSB1YXJlYS4gIElmIHdlJ3JlIHN0b3BwZWQgaW4gdGhlCisJICAgICAqIGV4aXQoKSBzeXN0ZW0gY2FsbCwgdGhlIGV4aXQgY29kZSB3aWxsIGJlIGluCisJICAgICAqIHUudV9hcFswXS4gIEFuIGV4aXQgZHVlIHRvIGFuIHVuY2F1Z2h0IHNpZ25hbCB3aWxsIGhhdmUKKwkgICAgICogc29tZXRoaW5nIGVsc2UgaW4gaGVyZSwgc2VlIHRoZSBjb21tZW50IGluIHRoZSBkZWZhdWx0OgorCSAgICAgKiBjYXNlLCBiZWxvdy4gIEZpbmFsbHksbGV0IHRoZSBwcm9jZXNzIGV4aXQuCisJICAgICAqLworCSAgICBpZiAoZGVhdGhfYnlfc2lnbmFsKQorCSAgICAgIHsKKwkJc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NJR05BTEVEOworCQlzdGF0dXMtPnZhbHVlLnNpZyA9IHRhcmdldF9zaWduYWxfZnJvbV9ob3N0IChkZWF0aF9ieV9zaWduYWwpOworCQlkZWF0aF9ieV9zaWduYWwgPSAwOworCQlicmVhazsKKwkgICAgICB9CisJICAgIHh2YWxvZmYgPSAodW5zaWduZWQgbG9uZykmdS51X2FwWzBdIC0gKHVuc2lnbmVkIGxvbmcpJnU7CisJICAgIGVycm5vID0gMDsKKwkgICAgcnYgPSBwdHJhY2UoUFRfUlVTRVIsIHBpZCwgKGNoYXIgKil4dmFsb2ZmLCAwKTsKKwkgICAgc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0VYSVRFRDsKKwkgICAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gcnY7CisJICAgIC8qCisJICAgICAqIGFkZHIgJiBkYXRhIHRvIG1wdHJhY2UoKSBkb24ndCBtYXR0ZXIgaGVyZSwgc2luY2UKKwkgICAgICogdGhlIHByb2Nlc3MgaXMgYWxyZWFkeSBkZWFkLgorCSAgICAgKi8KKwkgICAgcnYgPSBtcHRyYWNlKFhQVF9VTkRFQlVHLCBwaWQsIDAsIDApOworCSAgICBpZiAoLTEgPT0gcnYpIHsKKwkJICAgIHByaW50ZigiY2hpbGRfd2FpdDogUFRTX0VYSVQ6IFhQVF9VTkRFQlVHOiBwaWQgJWQgZXJyb3IgJWRcbiIsIHBpZCwKKwkJCSAgIGVycm5vKTsKKwkgICAgfQorCSAgICBicmVhazsKKyAgICBjYXNlIFBUU19XQVRDSFBUX0hJVDoKKwkgICAgZmF0YWwoIlBUU19XQVRDSFBUX0hJVFxuIik7CisJICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisJICAgIC8qIHN0b3BwZWQgYnkgc2lnbmFsICovCisJICAgIHN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOworCSAgICBzdGF0dXMtPnZhbHVlLnNpZyA9IHRhcmdldF9zaWduYWxfZnJvbV9ob3N0IChwdC5wc19yZWFzb24pOworCSAgICBkZWF0aF9ieV9zaWduYWwgPSAwOworCisJICAgIGlmICgwID09IChTSUdOQUxTX0RGTF9TQUZFICYgc2lnbWFzayhwdC5wc19yZWFzb24pKSkgeworCQkgICAgYnJlYWs7CisJICAgIH0KKwkgICAgLyogZWxzZSBkZWZhdWx0IGFjdGlvbiBvZiBzaWduYWwgaXMgdG8gZGllICovCisjaWZkZWYgU1ZSNF9TSEFSRURfTElCUworCSAgICBydiA9IHB0cmFjZShQVF9HRVRfUFJTVEFUVVMsIHBpZCwgKGNoYXIgKikmcHN0YXR1cywgMCk7CisJICAgIGlmICgtMSA9PSBydikKKwkJZXJyb3IoImNoaWxkX3dhaXQ6IHNpZ25hbCAlZCBQVF9HRVRfUFJTVEFUVVM6ICVzXG4iLAorCQkJcHQucHNfcmVhc29uLCBzYWZlX3N0cmVycm9yKGVycm5vKSk7CisJICAgIGlmIChwc3RhdHVzLnByX2N1cnNpZyAhPSBwdC5wc19yZWFzb24pIHsKKwkJcHJpbnRmKCJwc3RhdHVzIHNpZ25hbCAlZCwgcHQgc2lnbmFsICVkXG4iLAorCQkJcHN0YXR1cy5wcl9jdXJzaWcsIHB0LnBzX3JlYXNvbik7CisJICAgIH0KKwkgICAgc2FfaGFuZCA9IChpbnQpcHN0YXR1cy5wcl9hY3Rpb24uc2FfaGFuZGxlcjsKKyNlbHNlCisJICAgIHNhb2ZmID0gKHVuc2lnbmVkIGxvbmcpJnUudV9zYVswXSAtICh1bnNpZ25lZCBsb25nKSZ1OworCSAgICBzYW9mZiArPSBzaXplb2Yoc3RydWN0IHNpZ2FjdGlvbikgKiAocHQucHNfcmVhc29uIC0gMSk7CisJICAgIGVycm5vID0gMDsKKwkgICAgc2FfaGFuZCA9IHB0cmFjZShQVF9SVVNFUiwgcGlkLCAoY2hhciAqKXNhb2ZmLCAwKTsKKwkgICAgaWYgKGVycm5vKQorCQkgICAgZXJyb3IoImNoaWxkX3dhaXQ6IHNpZ25hbCAlZDogUlVTRVI6ICVzXG4iLAorCQkJICAgcHQucHNfcmVhc29uLCBzYWZlX3N0cmVycm9yKGVycm5vKSk7CisjZW5kaWYKKwkgICAgaWYgKChpbnQpU0lHX0RGTCA9PSBzYV9oYW5kKSB7CisJCSAgICAvKiB3ZSB3aWxsIGJlIGR5aW5nICovCisJCSAgICBkZWF0aF9ieV9zaWduYWwgPSBwdC5wc19yZWFzb247CisJICAgIH0KKwkgICAgYnJlYWs7CisgICAgfQorCisgIH0gd2hpbGUgKHBpZCAhPSBpbmZlcmlvcl9waWQpOyAvKiBTb21lIG90aGVyIGNoaWxkIGRpZWQgb3Igc3RvcHBlZCAqLworCisgIHJldHVybiBwaWQ7Cit9CisjZWxzZSAvKiAhQVRUQUNIX0RFVEFDSCAqLworLyoKKyAqIFNpbXBsZSBjaGlsZF93YWl0KCkgYmFzZWQgb24gaW5mdGFyZy5jIGNoaWxkX3dhaXQoKSBmb3IgdXNlIHVudGlsCisgKiB0aGUgTVBERUJVR0dFUiBjaGlsZF93YWl0KCkgd29ya3MgcHJvcGVybHkuICBUaGlzIHdpbGwgZ28gYXdheSB3aGVuCisgKiB0aGF0IGlzIGZpeGVkLgorICovCitjaGlsZF93YWl0IChwaWQsIG91cnN0YXR1cykKKyAgICAgaW50IHBpZDsKKyAgICAgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpvdXJzdGF0dXM7Cit7CisgIGludCBzYXZlX2Vycm5vOworICBpbnQgc3RhdHVzOworCisgIGRvIHsKKyAgICBwaWQgPSB3YWl0ICgmc3RhdHVzKTsKKyAgICBzYXZlX2Vycm5vID0gZXJybm87CisKKyAgICBpZiAocGlkID09IC0xKQorICAgICAgeworCWlmIChzYXZlX2Vycm5vID09IEVJTlRSKQorCSAgY29udGludWU7CisJZnByaW50ZiAoc3RkZXJyLCAiQ2hpbGQgcHJvY2VzcyB1bmV4cGVjdGVkbHkgbWlzc2luZzogJXMuXG4iLAorCQkgc2FmZV9zdHJlcnJvciAoc2F2ZV9lcnJubykpOworCW91cnN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TSUdOQUxMRUQ7CisJb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1VOS05PV047CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgfSB3aGlsZSAocGlkICE9IGluZmVyaW9yX3BpZCk7IC8qIFNvbWUgb3RoZXIgY2hpbGQgZGllZCBvciBzdG9wcGVkICovCisgIHN0b3JlX3dhaXRzdGF0dXMgKG91cnN0YXR1cywgc3RhdHVzKTsKKyAgcmV0dXJuIHBpZDsKK30KKyNlbmRpZiAvKiBBVFRBQ0hfREVUQUNIICovCisKKworDAorLyogVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgcHRyYWNlIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gIAorICAgSXQgZXhpc3RzIHNvIHRoYXQgYWxsIGNhbGxzIHRvIHB0cmFjZSBhcmUgaXNvbGF0ZWQgaW4gdGhpcyAKKyAgIG1hY2hpbmUtZGVwZW5kZW50IGZpbGUuICovCitpbnQKK2NhbGxfcHRyYWNlIChyZXF1ZXN0LCBwaWQsIGFkZHIsIGRhdGEpCisgICAgIGludCByZXF1ZXN0LCBwaWQ7CisgICAgIFBUUkFDRV9BUkczX1RZUEUgYWRkcjsKKyAgICAgaW50IGRhdGE7Cit7CisgIHJldHVybiBwdHJhY2UgKHJlcXVlc3QsIHBpZCwgYWRkciwgZGF0YSk7Cit9CisKK2ludAorY2FsbF9tcHRyYWNlKHJlcXVlc3QsIHBpZCwgYWRkciwgZGF0YSkKKwlpbnQgcmVxdWVzdCwgcGlkOworCVBUUkFDRV9BUkczX1RZUEUgYWRkcjsKKwlpbnQgZGF0YTsKK3sKKwlyZXR1cm4gbXB0cmFjZShyZXF1ZXN0LCBwaWQsIGFkZHIsIGRhdGEpOworfQorCisjaWYgZGVmaW5lZCAoREVCVUdfUFRSQUNFKQorLyogRm9yIHRoZSByZXN0IG9mIHRoZSBmaWxlLCB1c2UgYW4gZXh0cmEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gKi8KKy8qIFRoaXMgbGV0cyB1cyBicmVha3BvaW50IHVzZWZ1bGx5IG9uIGNhbGxfcHRyYWNlLiAqLworI2RlZmluZSBwdHJhY2UgY2FsbF9wdHJhY2UKKyNkZWZpbmUgbXB0cmFjZSBjYWxsX21wdHJhY2UKKyNlbmRpZgorCit2b2lkCitraWxsX2luZmVyaW9yICgpCit7CisgIGlmIChpbmZlcmlvcl9waWQgPT0gMCkKKyAgICByZXR1cm47CisKKyAgLyogRm9yIE1QREVCVUdHRVIsIGRvbid0IHVzZSBQVF9LSUxMLCBzaW5jZSB0aGUgY2hpbGQgd2lsbCBzdG9wCisgICAgIGFnYWluIHdpdGggYSBQVFNfRVhJVC4gIEp1c3QgaGl0IGhpbSB3aXRoIFNJR0tJTEwgKHNvIGhlIHN0b3BzKQorICAgICBhbmQgZGV0YWNoLiAqLworCisgIGtpbGwgKGluZmVyaW9yX3BpZCwgU0lHS0lMTCk7CisjaWZkZWYgQVRUQUNIX0RFVEFDSAorICBkZXRhY2goU0lHS0lMTCk7CisjZWxzZSAvKiBBVFRBQ0hfREVUQUNIICovCisgIHB0cmFjZShQVF9LSUxMLCBpbmZlcmlvcl9waWQsIDAsIDApOworICB3YWl0KChpbnQgKilOVUxMKTsKKyNlbmRpZiAvKiBBVFRBQ0hfREVUQUNIICovCisgIHRhcmdldF9tb3Vybl9pbmZlcmlvciAoKTsKK30KKworLyogUmVzdW1lIGV4ZWN1dGlvbiBvZiB0aGUgaW5mZXJpb3IgcHJvY2Vzcy4KKyAgIElmIFNURVAgaXMgbm9uemVybywgc2luZ2xlLXN0ZXAgaXQuCisgICBJZiBTSUdOQUwgaXMgbm9uemVybywgZ2l2ZSBpdCB0aGF0IHNpZ25hbC4gICovCisKK3ZvaWQKK2NoaWxkX3Jlc3VtZSAocGlkLCBzdGVwLCBzaWduYWwpCisgICAgIGludCBwaWQ7CisgICAgIGludCBzdGVwOworICAgICBlbnVtIHRhcmdldF9zaWduYWwgc2lnbmFsOworeworICBlcnJubyA9IDA7CisKKyAgaWYgKHBpZCA9PSAtMSkKKyAgICBwaWQgPSBpbmZlcmlvcl9waWQ7CisKKyAgLyogQW4gYWRkcmVzcyBvZiAoUFRSQUNFX0FSRzNfVFlQRSkxIHRlbGxzIHB0cmFjZSB0byBjb250aW51ZSBmcm9tIHdoZXJlCisgICAgIGl0IHdhcy4gIChJZiBHREIgd2FudGVkIGl0IHRvIHN0YXJ0IHNvbWUgb3RoZXIgd2F5LCB3ZSBoYXZlIGFscmVhZHkKKyAgICAgd3JpdHRlbiBhIG5ldyBQQyB2YWx1ZSB0byB0aGUgY2hpbGQuKQorCisgICAgIElmIHRoaXMgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUFRfU1NURVAsIGEgaGlnaGVyIGxldmVsIGZ1bmN0aW9uIHdpbGwKKyAgICAgaGF2ZSBjYWxsZWQgc2luZ2xlX3N0ZXAoKSB0byB0cmFuc211dGUgdGhlIHN0ZXAgcmVxdWVzdCBpbnRvIGEKKyAgICAgY29udGludWUgcmVxdWVzdCAoYnkgc2V0dGluZyBicmVha3BvaW50cyBvbiBhbGwgcG9zc2libGUgc3VjY2Vzc29yCisgICAgIGluc3RydWN0aW9ucyksIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhhdCBoZXJlLiAgKi8KKworICBpZiAoc3RlcCkKKyAgICBwdHJhY2UgKFBUX1NTVEVQLCAgICAgcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgMSwgc2lnbmFsKTsKKyAgZWxzZQorICAgIHB0cmFjZSAoUFRfQ09OVFNJRywgcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgMSwgc2lnbmFsKTsKKworICBpZiAoZXJybm8pCisgICAgcGVycm9yX3dpdGhfbmFtZSAoInB0cmFjZSIpOworfQorDAorI2lmZGVmIEFUVEFDSF9ERVRBQ0gKKy8qIFN0YXJ0IGRlYnVnZ2luZyB0aGUgcHJvY2VzcyB3aG9zZSBudW1iZXIgaXMgUElELiAgKi8KK2ludAorYXR0YWNoIChwaWQpCisgICAgIGludCBwaWQ7Cit7CisJc2lnc2V0X3Qgc2V0OworCWludCBydjsKKworCXJ2ID0gbXB0cmFjZShYUFRfREVCVUcsIHBpZCwgMCwgMCk7CisJaWYgKC0xID09IHJ2KSB7CisJCWVycm9yKCJtcHRyYWNlKFhQVF9ERUJVRyk6ICVzIiwgc2FmZV9zdHJlcnJvcihlcnJubykpOworCX0KKwlydiA9IG1wdHJhY2UoWFBUX1NJR05BTCwgcGlkLCAwLCBTSUdTVE9QKTsKKwlpZiAoLTEgPT0gcnYpIHsKKwkJZXJyb3IoIm1wdHJhY2UoWFBUX1NJR05BTCk6ICVzIiwgc2FmZV9zdHJlcnJvcihlcnJubykpOworCX0KKwlhdHRhY2hfZmxhZyA9IDE7CisJcmV0dXJuIHBpZDsKK30KKwordm9pZAorZGV0YWNoIChzaWdubykKKyAgICAgaW50IHNpZ25vOworeworCWludCBydjsKKworCXJ2ID0gbXB0cmFjZShYUFRfVU5ERUJVRywgaW5mZXJpb3JfcGlkLCAxLCBzaWdubyk7CisJaWYgKC0xID09IHJ2KSB7CisJCWVycm9yKCJtcHRyYWNlKFhQVF9VTkRFQlVHKTogJXMiLCBzYWZlX3N0cmVycm9yKGVycm5vKSk7CisJfQorCWF0dGFjaF9mbGFnID0gMDsKK30KKworI2VuZGlmIC8qIEFUVEFDSF9ERVRBQ0ggKi8KKwwKKy8qIERlZmF1bHQgdGhlIHR5cGUgb2YgdGhlIHB0cmFjZSB0cmFuc2ZlciB0byBpbnQuICAqLworI2lmbmRlZiBQVFJBQ0VfWEZFUl9UWVBFCisjZGVmaW5lIFBUUkFDRV9YRkVSX1RZUEUgaW50CisjZW5kaWYKKworDAorLyogTk9URSEgSSB0cmllZCB1c2luZyBQVFJBQ0VfUkVBRERBVEEsIGV0Yy4sIHRvIHJlYWQgYW5kIHdyaXRlIG1lbW9yeQorICAgaW4gdGhlIE5FV19TVU5fUFRSQUNFIGNhc2UuCisgICBJdCBvdWdodCB0byBiZSBzdHJhaWdodGZvcndhcmQuICBCdXQgaXQgYXBwZWFycyB0aGF0IHdyaXRpbmcgZGlkCisgICBub3Qgd3JpdGUgdGhlIGRhdGEgdGhhdCBJIHNwZWNpZmllZC4gIEkgY2Fubm90IHVuZGVyc3RhbmQgd2hlcmUKKyAgIGl0IGdvdCB0aGUgZGF0YSB0aGF0IGl0IGFjdHVhbGx5IGRpZCB3cml0ZS4gICovCisKKy8qIENvcHkgTEVOIGJ5dGVzIHRvIG9yIGZyb20gaW5mZXJpb3IncyBtZW1vcnkgc3RhcnRpbmcgYXQgTUVNQUREUgorICAgdG8gZGVidWdnZXIgbWVtb3J5IHN0YXJ0aW5nIGF0IE1ZQUREUi4gICBDb3B5IHRvIGluZmVyaW9yIGlmCisgICBXUklURSBpcyBub256ZXJvLgorICAKKyAgIFJldHVybnMgdGhlIGxlbmd0aCBjb3BpZWQsIHdoaWNoIGlzIGVpdGhlciB0aGUgTEVOIGFyZ3VtZW50IG9yIHplcm8uCisgICBUaGlzIHhmZXIgZnVuY3Rpb24gZG9lcyBub3QgZG8gcGFydGlhbCBtb3Zlcywgc2luY2UgY2hpbGRfb3BzCisgICBkb2Vzbid0IGFsbG93IG1lbW9yeSBvcGVyYXRpb25zIHRvIGNyb3NzIGJlbG93IHVzIGluIHRoZSB0YXJnZXQgc3RhY2sKKyAgIGFueXdheS4gICovCisKK2ludAorY2hpbGRfeGZlcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuLCB3cml0ZSwgdGFyZ2V0KQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworICAgICBpbnQgd3JpdGU7CisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQ7CQkvKiBpZ25vcmVkICovCit7CisgIHJlZ2lzdGVyIGludCBpOworICAvKiBSb3VuZCBzdGFydGluZyBhZGRyZXNzIGRvd24gdG8gbG9uZ3dvcmQgYm91bmRhcnkuICAqLworICByZWdpc3RlciBDT1JFX0FERFIgYWRkciA9IG1lbWFkZHIgJiAtIHNpemVvZiAoUFRSQUNFX1hGRVJfVFlQRSk7CisgIC8qIFJvdW5kIGVuZGluZyBhZGRyZXNzIHVwOyBnZXQgbnVtYmVyIG9mIGxvbmd3b3JkcyB0aGF0IG1ha2VzLiAgKi8KKyAgcmVnaXN0ZXIgaW50IGNvdW50CisgICAgPSAoKChtZW1hZGRyICsgbGVuKSAtIGFkZHIpICsgc2l6ZW9mIChQVFJBQ0VfWEZFUl9UWVBFKSAtIDEpCisgICAgICAvIHNpemVvZiAoUFRSQUNFX1hGRVJfVFlQRSk7CisgIC8qIEFsbG9jYXRlIGJ1ZmZlciBvZiB0aGF0IG1hbnkgbG9uZ3dvcmRzLiAgKi8KKyAgcmVnaXN0ZXIgUFRSQUNFX1hGRVJfVFlQRSAqYnVmZmVyCisgICAgPSAoUFRSQUNFX1hGRVJfVFlQRSAqKSBhbGxvY2EgKGNvdW50ICogc2l6ZW9mIChQVFJBQ0VfWEZFUl9UWVBFKSk7CisKKyAgaWYgKHdyaXRlKQorICAgIHsKKyAgICAgIC8qIEZpbGwgc3RhcnQgYW5kIGVuZCBleHRyYSBieXRlcyBvZiBidWZmZXIgd2l0aCBleGlzdGluZyBtZW1vcnkgZGF0YS4gICovCisKKyAgICAgIGlmIChhZGRyICE9IG1lbWFkZHIgfHwgbGVuIDwgKGludCkgc2l6ZW9mIChQVFJBQ0VfWEZFUl9UWVBFKSkgeworCS8qIE5lZWQgcGFydCBvZiBpbml0aWFsIHdvcmQgLS0gZmV0Y2ggaXQuICAqLworICAgICAgICBidWZmZXJbMF0gPSBwdHJhY2UgKFBUX1JURVhULCBpbmZlcmlvcl9waWQsIChQVFJBQ0VfQVJHM19UWVBFKSBhZGRyLAorCQkJICAgIDApOworICAgICAgfQorCisgICAgICBpZiAoY291bnQgPiAxKQkJLyogRklYTUUsIGF2b2lkIGlmIGV2ZW4gYm91bmRhcnkgKi8KKwl7CisJICBidWZmZXJbY291bnQgLSAxXQorCSAgICA9IHB0cmFjZSAoUFRfUlRFWFQsIGluZmVyaW9yX3BpZCwKKwkJICAgICAgKChQVFJBQ0VfQVJHM19UWVBFKQorCQkgICAgICAgKGFkZHIgKyAoY291bnQgLSAxKSAqIHNpemVvZiAoUFRSQUNFX1hGRVJfVFlQRSkpKSwKKwkJICAgICAgMCk7CisJfQorCisgICAgICAvKiBDb3B5IGRhdGEgdG8gYmUgd3JpdHRlbiBvdmVyIGNvcnJlc3BvbmRpbmcgcGFydCBvZiBidWZmZXIgKi8KKworICAgICAgbWVtY3B5ICgoY2hhciAqKSBidWZmZXIgKyAobWVtYWRkciAmIChzaXplb2YgKFBUUkFDRV9YRkVSX1RZUEUpIC0gMSkpLAorCSAgICAgIG15YWRkciwKKwkgICAgICBsZW4pOworCisgICAgICAvKiBXcml0ZSB0aGUgZW50aXJlIGJ1ZmZlci4gICovCisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBhZGRyICs9IHNpemVvZiAoUFRSQUNFX1hGRVJfVFlQRSkpCisJeworCSAgZXJybm8gPSAwOworCSAgcHRyYWNlIChQVF9XREFUQSwgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgYWRkciwKKwkJICBidWZmZXJbaV0pOworCSAgaWYgKGVycm5vKQorCSAgICB7CisJICAgICAgLyogVXNpbmcgdGhlIGFwcHJvcHJpYXRlIG9uZSAoSSBvciBEKSBpcyBuZWNlc3NhcnkgZm9yCisJCSBHb3VsZCBOUDEsIGF0IGxlYXN0LiAgKi8KKwkgICAgICBlcnJubyA9IDA7CisJICAgICAgcHRyYWNlIChQVF9XVEVYVCwgaW5mZXJpb3JfcGlkLCAoUFRSQUNFX0FSRzNfVFlQRSkgYWRkciwKKwkJICAgICAgYnVmZmVyW2ldKTsKKwkgICAgfQorCSAgaWYgKGVycm5vKQorCSAgICByZXR1cm4gMDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogUmVhZCBhbGwgdGhlIGxvbmd3b3JkcyAqLworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIGFkZHIgKz0gc2l6ZW9mIChQVFJBQ0VfWEZFUl9UWVBFKSkKKwl7CisJICBlcnJubyA9IDA7CisJICBidWZmZXJbaV0gPSBwdHJhY2UgKFBUX1JURVhULCBpbmZlcmlvcl9waWQsCisJCQkgICAgICAoUFRSQUNFX0FSRzNfVFlQRSkgYWRkciwgMCk7CisJICBpZiAoZXJybm8pCisJICAgIHJldHVybiAwOworCSAgUVVJVDsKKwl9CisKKyAgICAgIC8qIENvcHkgYXBwcm9wcmlhdGUgYnl0ZXMgb3V0IG9mIHRoZSBidWZmZXIuICAqLworICAgICAgbWVtY3B5IChteWFkZHIsCisJICAgICAgKGNoYXIgKikgYnVmZmVyICsgKG1lbWFkZHIgJiAoc2l6ZW9mIChQVFJBQ0VfWEZFUl9UWVBFKSAtIDEpKSwKKwkgICAgICBsZW4pOworICAgIH0KKyAgcmV0dXJuIGxlbjsKK30KKworCit2b2lkCitfaW5pdGlhbGl6ZV9zeW1tX25hdCAoKQoreworI2lmZGVmIEFUVEFDSF9ERVRBQ0gKKy8qCisgKiB0aGUgTVBERUJVR0dFUiBpcyBuZWNlc3NhcnkgZm9yIHByb2Nlc3MgdHJlZSBkZWJ1Z2dpbmcgYW5kIGF0dGFjaAorICogdG8gd29yaywgYnV0IGl0IGFsdGVycyB0aGUgYmVoYXZpb3Igb2YgZGVidWdnZWQgcHJvY2Vzc2VzLCBzbyBvdGhlcgorICogdGhpbmdzIChhdCBsZWFzdCBjaGlsZF93YWl0KCkpIHdpbGwgaGF2ZSB0byBjaGFuZ2UgdG8gYWNjb21vZGF0ZQorICogdGhhdC4KKyAqCisgKiBOb3RlIHRoYXQgYXR0YWNoIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiBkeW5peCAzLCBhbmQgbm90IGluIHB0eAorICogdW50aWwgdmVyc2lvbiAyLjEgb2YgdGhlIE9TLgorICovCisJaW50IHJ2OworCXNpZ3NldF90IHNldDsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNhY3Q7CisKKwlydiA9IG1wdHJhY2UoWFBUX01QREVCVUdHRVIsIDAsIDAsIDApOworCWlmICgtMSA9PSBydikgeworCQlmYXRhbCgiX2luaXRpYWxpemVfc3ltbV9uYXQoKTogbXB0cmFjZShYUFRfTVBERUJVR0dFUik6ICVzIiwKKwkJICAgICAgc2FmZV9zdHJlcnJvcihlcnJubykpOworCX0KKworCS8qCisJICogVW5kZXIgTVBERUJVR0dFUiwgd2UgZ2V0IFNJR0NMSEQgd2hlbiBhIHRyYWNlZCBwcm9jZXNzIGRvZXMKKwkgKiBhbnl0aGluZyBvZiBpbnRlcmVzdC4KKwkgKi8KKworCS8qCisJICogQmxvY2sgU0lHQ0hMRC4gIFdlIGxlYXZlIGl0IGJsb2NrZWQgYWxsIHRoZSB0aW1lLCBhbmQgdGhlbgorCSAqIGNhbGwgc2lnc3VzcGVuZCgpIGluIGNoaWxkX3dhaXQoKSB0byB3YWl0IGZvciB0aGUgY2hpbGQKKwkgKiB0byBkbyBzb21ldGhpbmcuICBOb25lIG9mIHRoZXNlIG91Z2h0IHRvIGZhaWwsIGJ1dCBjaGVjayBhbnl3YXkuCisJICovCisJc2lnZW1wdHlzZXQoJnNldCk7CisJcnYgPSBzaWdhZGRzZXQoJnNldCwgU0lHQ0hMRCk7CisJaWYgKC0xID09IHJ2KSB7CisJCWZhdGFsKCJfaW5pdGlhbGl6ZV9zeW1tX25hdCgpOiBzaWdhZGRzZXQoU0lHQ0hMRCk6ICVzIiwKKwkJICAgICAgc2FmZV9zdHJlcnJvcihlcnJubykpOworCX0KKwlydiA9IHNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNldCwgKHNpZ3NldF90ICopTlVMTCk7CisJaWYgKC0xID09IHJ2KSB7CisJCWZhdGFsKCJfaW5pdGlhbGl6ZV9zeW1tX25hdCgpOiBzaWdwcm9jbWFzayhTSUdfQkxPQ0spOiAlcyIsCisJCSAgICAgIHNhZmVfc3RyZXJyb3IoZXJybm8pKTsKKwl9CisKKwlzYWN0LnNhX2hhbmRsZXIgPSBzaWdjaGxkX2hhbmRsZXI7CisJc2lnZW1wdHlzZXQoJnNhY3Quc2FfbWFzayk7CisJc2FjdC5zYV9mbGFncyA9IFNBX05PQ0xEV0FJVDsgLyoga2VlcCB0aGUgem9tYmllcyBhd2F5ICovCisJcnYgPSBzaWdhY3Rpb24oU0lHQ0hMRCwgJnNhY3QsIChzdHJ1Y3Qgc2lnYWN0aW9uICopTlVMTCk7CisJaWYgKC0xID09IHJ2KSB7CisJCWZhdGFsKCJfaW5pdGlhbGl6ZV9zeW1tX25hdCgpOiBzaWdhY3Rpb24oU0lHQ0hMRCk6ICVzIiwKKwkJICAgICAgc2FmZV9zdHJlcnJvcihlcnJubykpOworCX0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZ2RiL3N5bW0tdGRlcC5jIGIvZ2RiL3N5bW0tdGRlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZjczZTkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvc3ltbS10ZGVwLmMKQEAgLTAsMCArMSw5MyBAQAorLyogU2VxdWVudCBTeW1tZXRyeSB0YXJnZXQgaW50ZXJmYWNlLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5LCAxOTkxLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIG1hbnkgMzg3LXNwZWNpZmljIGl0ZW1zIG9mIHVzZSB0YWtlbiBmcm9tIGkzODYtZGVwLmMgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvdXNlci5oPgorI2luY2x1ZGUgPHN5cy9kaXIuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlICJnZGJfc3RhdC5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlIDxmY250bC5oPgorCit2b2lkCitzeW1tZXRyeV9leHRyYWN0X3JldHVybl92YWx1ZSh0eXBlLCByZWdidWYsIHZhbGJ1ZikKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGNoYXIgKnJlZ2J1ZjsKKyAgICAgY2hhciAqdmFsYnVmOworeworICB1bmlvbiB7IAorICAgIGRvdWJsZQlkOyAKKyAgICBpbnQJbFsyXTsgCisgIH0geGQ7IAorICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisgIGZsb2F0IGY7CisKKyAgaWYgKFRZUEVfQ09ERV9GTFQgPT0gVFlQRV9DT0RFKHR5cGUpKSB7IAorICAgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKCIxMTY3X2ZsdCIsIE5VTEwsIE5VTEwpOworICAgIGlmIChtc3ltYm9sICE9IE5VTEwpIHsKKyAgICAgIC8qIGZvdW5kICIxMTY3X2ZsdCIgbWVhbnMgMTE2NywgJWZwMi0lZnAzICovIAorICAgICAgLyogZmxvYXQgJiBkb3VibGU7IDE5PSAlZnAyLCAyMD0gJWZwMyAqLworICAgICAgLyogbm8gc2luZ2xlIHByZWNpc2lvbiBvbiAxMTY3ICovCisgICAgICB4ZC5sWzFdID0gKigoaW50ICopJnJlZ2J1ZltSRUdJU1RFUl9CWVRFKDE5KV0pOworICAgICAgeGQubFswXSA9ICooKGludCAqKSZyZWdidWZbUkVHSVNURVJfQllURSgyMCldKTsKKyAgICAgIHN3aXRjaCAoVFlQRV9MRU5HVEgodHlwZSkpIHsKKyAgICAgIGNhc2UgNDoKKwkvKiBGSVhNRTogYnJva2VuIGZvciBjcm9zcy1kZWJ1Z2dpbmcuICAqLworCWYgPSAoZmxvYXQpIHhkLmQ7CisJbWVtY3B5ICh2YWxidWYsICZmLCBUWVBFX0xFTkdUSCh0eXBlKSk7CisJYnJlYWs7CisgICAgICBjYXNlIDg6CisJLyogRklYTUU6IGJyb2tlbiBmb3IgY3Jvc3MtZGVidWdnaW5nLiAgKi8KKwltZW1jcHkgKHZhbGJ1ZiwgJnhkLmQsIFRZUEVfTEVOR1RIKHR5cGUpKTsgCisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCWVycm9yKCJVbmtub3duIGZsb2F0aW5nIHBvaW50IHNpemUiKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAKKyAgICAgIC8qIDM4NyAlc3QoMCksIGdjYyB1c2VzIHRoaXMgKi8gCisgICAgICBpMzg3X3RvX2RvdWJsZSgoKGludCAqKSZyZWdidWZbUkVHSVNURVJfQllURSgzKV0pLAorCQkgICAgICZ4ZC5kKTsgCisgICAgICBzd2l0Y2ggKFRZUEVfTEVOR1RIKHR5cGUpKSB7CisgICAgICBjYXNlIDQ6CQkJLyogZmxvYXQgKi8KKwlmID0gKGZsb2F0KSB4ZC5kOworCS8qIEZJWE1FOiBicm9rZW4gZm9yIGNyb3NzLWRlYnVnZ2luZy4gICovCisJbWVtY3B5ICh2YWxidWYsICZmLCA0KTsgCisJYnJlYWs7CisgICAgICBjYXNlIDg6CQkJLyogZG91YmxlICovCisJLyogRklYTUU6IGJyb2tlbiBmb3IgY3Jvc3MtZGVidWdnaW5nLiAgKi8KKwltZW1jcHkgKHZhbGJ1ZiwgJnhkLmQsIDgpOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwllcnJvcigiVW5rbm93biBmbG9hdGluZyBwb2ludCBzaXplIik7CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIG1lbWNweSAodmFsYnVmLCByZWdidWYsIFRZUEVfTEVOR1RIICh0eXBlKSk7IAorICB9Cit9CmRpZmYgLS1naXQgYS9nZGIvc3ltbWlzYy5jIGIvZ2RiL3N5bW1pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2QyZjZlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3N5bW1pc2MuYwpAQCAtMCwwICsxLDEwOTggQEAKKy8qIERvIHZhcmlvdXMgdGhpbmdzIHRvIHN5bWJvbCB0YWJsZXMgKG90aGVyIHRoYW4gbG9va3VwKSwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTg2LCA4NywgODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTgKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJicmVha3BvaW50LmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1ZGUgImJjYWNoZS5oIgorCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorCisjaWZuZGVmIERFVl9UVFkKKyNkZWZpbmUgREVWX1RUWSAiL2Rldi90dHkiCisjZW5kaWYKKworLyogVW5mb3J0dW5hdGVseSBmb3IgZGVidWdnaW5nLCBzdGRlcnIgaXMgdXN1YWxseSBhIG1hY3JvLiAgVGhpcyBpcyBwYWluZnVsCisgICB3aGVuIGNhbGxpbmcgZnVuY3Rpb25zIHRoYXQgdGFrZSBGSUxFIConcyBmcm9tIHRoZSBkZWJ1Z2dlci4KKyAgIFNvIHdlIG1ha2UgYSB2YXJpYWJsZSB3aGljaCBoYXMgdGhlIHNhbWUgdmFsdWUgYW5kIHdoaWNoIGlzIGFjY2Vzc2libGUgd2hlbgorICAgZGVidWdnaW5nIEdEQiB3aXRoIGl0c2VsZi4gIEJlY2F1c2Ugc3RkaW4gZXQgYWwgbmVlZCBub3QgYmUgY29uc3RhbnRzLAorICAgd2UgaW5pdGlhbGl6ZSB0aGVtIGluIHRoZSBfaW5pdGlhbGl6ZV9zeW1taXNjIGZ1bmN0aW9uIGF0IHRoZSBib3R0b20KKyAgIG9mIHRoZSBmaWxlLiAgKi8KK0ZJTEUgKnN0ZF9pbjsKK0ZJTEUgKnN0ZF9vdXQ7CitGSUxFICpzdGRfZXJyOworCisvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMgKi8KKworc3RhdGljIHZvaWQgZHVtcF9zeW10YWIgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgc3RydWN0IHN5bXRhYiAqLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdEQl9GSUxFICopKTsKKworc3RhdGljIHZvaWQgZHVtcF9wc3ltdGFiIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHREJfRklMRSAqKSk7CisKK3N0YXRpYyB2b2lkIGR1bXBfbXN5bWJvbHMgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgR0RCX0ZJTEUgKikpOworCitzdGF0aWMgdm9pZCBkdW1wX29iamZpbGUgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgaW50IGJsb2NrX2RlcHRoIFBBUkFNUyAoKHN0cnVjdCBibG9jayAqKSk7CisKK3N0YXRpYyB2b2lkIHByaW50X3BhcnRpYWxfc3ltYm9scyBQQVJBTVMgKChzdHJ1Y3QgcGFydGlhbF9zeW1ib2wgKiosIGludCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqLCBHREJfRklMRSAqKSk7CisKK3N0YXRpYyB2b2lkIGZyZWVfc3ltdGFiX2Jsb2NrIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIHN0cnVjdCBibG9jayAqKSk7CisKK3ZvaWQgX2luaXRpYWxpemVfc3ltbWlzYyBQQVJBTVMgKCh2b2lkKSk7CisKK3N0cnVjdCBwcmludF9zeW1ib2xfYXJncyB7CisgIHN0cnVjdCBzeW1ib2wgKnN5bWJvbDsKKyAgaW50IGRlcHRoOworICBHREJfRklMRSAqb3V0ZmlsZTsKK307CisKK3N0YXRpYyBpbnQgcHJpbnRfc3ltYm9sIFBBUkFNUyAoKFBUUikpOworCitzdGF0aWMgdm9pZAorZnJlZV9zeW10YWJfYmxvY2sgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgc3RydWN0IGJsb2NrICopKTsKKworDAorLyogRnJlZSBhIHN0cnVjdCBibG9jayA8LSBCIGFuZCBhbGwgdGhlIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGF0IGJsb2NrLiAgKi8KKworc3RhdGljIHZvaWQKK2ZyZWVfc3ltdGFiX2Jsb2NrIChvYmpmaWxlLCBiKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgc3RydWN0IGJsb2NrICpiOworeworICByZWdpc3RlciBpbnQgaSwgbjsKKyAgbiA9IEJMT0NLX05TWU1TIChiKTsKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7CisgICAgICBtZnJlZSAob2JqZmlsZSAtPiBtZCwgU1lNQk9MX05BTUUgKEJMT0NLX1NZTSAoYiwgaSkpKTsKKyAgICAgIG1mcmVlIChvYmpmaWxlIC0+IG1kLCAoUFRSKSBCTE9DS19TWU0gKGIsIGkpKTsKKyAgICB9CisgIG1mcmVlIChvYmpmaWxlIC0+IG1kLCAoUFRSKSBiKTsKK30KKworLyogRnJlZSBhbGwgdGhlIHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJ1Y3Qgc3ltdGFiIDwtIFMuCisgICBOb3RlIHRoYXQgc29tZSBzeW10YWJzIGhhdmUgY29udGVudHMgbWFsbG9jJ2VkIHN0cnVjdHVyZSBieSBzdHJ1Y3R1cmUsCisgICB3aGlsZSBzb21lIGhhdmUgY29udGVudHMgdGhhdCBhbGwgbGl2ZSBpbnNpZGUgb25lIGJpZyBibG9jayBvZiBtZW1vcnksCisgICBhbmQgc29tZSBzaGFyZSB0aGUgY29udGVudHMgb2YgYW5vdGhlciBzeW1ib2wgdGFibGUgYW5kIHNvIHlvdSBzaG91bGQKKyAgIG5vdCBmcmVlIHRoZSBjb250ZW50cyBvbiB0aGVpciBiZWhhbGYgKGV4Y2VwdCBzb21ldGltZXMgdGhlIGxpbmV0YWJsZSwKKyAgIHdoaWNoIG1heWJlIHBlciBzeW10YWIgZXZlbiB3aGVuIHRoZSByZXN0IGlzIG5vdCkuCisgICBJdCBpcyBzLT5mcmVlX2NvZGUgdGhhdCBzYXlzIHdoaWNoIGFsdGVybmF0aXZlIHRvIHVzZS4gICovCisKK3ZvaWQKK2ZyZWVfc3ltdGFiIChzKQorICAgICByZWdpc3RlciBzdHJ1Y3Qgc3ltdGFiICpzOworeworICByZWdpc3RlciBpbnQgaSwgbjsKKyAgcmVnaXN0ZXIgc3RydWN0IGJsb2NrdmVjdG9yICpidjsKKworICBzd2l0Y2ggKHMtPmZyZWVfY29kZSkKKyAgICB7CisgICAgY2FzZSBmcmVlX25vdGhpbmc6CisgICAgICAvKiBBbGwgdGhlIGNvbnRlbnRzIGFyZSBwYXJ0IG9mIGEgYmlnIGJsb2NrIG9mIG1lbW9yeSAoYW4gb2JzdGFjayksCisJIGFuZCBzb21lIG90aGVyIHN5bXRhYiBpcyBpbiBjaGFyZ2Ugb2YgZnJlZWluZyB0aGF0IGJsb2NrLgorCSBUaGVyZWZvcmUsIGRvIG5vdGhpbmcuICAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGZyZWVfY29udGVudHM6CisgICAgICAvKiBIZXJlIGFsbCB0aGUgY29udGVudHMgd2VyZSBtYWxsb2MnZWQgc3RydWN0dXJlIGJ5IHN0cnVjdHVyZQorCSBhbmQgbXVzdCBiZSBmcmVlZCB0aGF0IHdheS4gICovCisgICAgICAvKiBGaXJzdCBmcmVlIHRoZSBibG9ja3MgKGFuZCB0aGVpciBzeW1ib2xzLiAgKi8KKyAgICAgIGJ2ID0gQkxPQ0tWRUNUT1IgKHMpOworICAgICAgbiA9IEJMT0NLVkVDVE9SX05CTE9DS1MgKGJ2KTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJZnJlZV9zeW10YWJfYmxvY2sgKHMgLT4gb2JqZmlsZSwgQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBpKSk7CisgICAgICAvKiBGcmVlIHRoZSBibG9ja3ZlY3RvciBpdHNlbGYuICAqLworICAgICAgbWZyZWUgKHMgLT4gb2JqZmlsZSAtPiBtZCwgKFBUUikgYnYpOworICAgICAgLyogQWxzbyBmcmVlIHRoZSBsaW5ldGFibGUuICAqLworICAgICAgCisgICAgY2FzZSBmcmVlX2xpbmV0YWJsZToKKyAgICAgIC8qIEV2ZXJ5dGhpbmcgd2lsbCBiZSBmcmVlZCBlaXRoZXIgYnkgb3VyIGBmcmVlX3B0cicKKwkgb3IgYnkgc29tZSBvdGhlciBzeW10YWIsIGV4Y2VwdCBmb3Igb3VyIGxpbmV0YWJsZS4KKwkgRnJlZSB0aGF0IG5vdy4gICovCisgICAgICBpZiAoTElORVRBQkxFIChzKSkKKwltZnJlZSAocyAtPiBvYmpmaWxlIC0+IG1kLCAoUFRSKSBMSU5FVEFCTEUgKHMpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAvKiBJZiB0aGVyZSBpcyBhIHNpbmdsZSBibG9jayBvZiBtZW1vcnkgdG8gZnJlZSwgZnJlZSBpdC4gICovCisgIGlmIChzIC0+IGZyZWVfcHRyICE9IE5VTEwpCisgICAgbWZyZWUgKHMgLT4gb2JqZmlsZSAtPiBtZCwgcyAtPiBmcmVlX3B0cik7CisKKyAgLyogRnJlZSBzb3VyY2UtcmVsYXRlZCBzdHVmZiAqLworICBpZiAocyAtPiBsaW5lX2NoYXJwb3MgIT0gTlVMTCkKKyAgICBtZnJlZSAocyAtPiBvYmpmaWxlIC0+IG1kLCAoUFRSKSBzIC0+IGxpbmVfY2hhcnBvcyk7CisgIGlmIChzIC0+IGZ1bGxuYW1lICE9IE5VTEwpCisgICAgbWZyZWUgKHMgLT4gb2JqZmlsZSAtPiBtZCwgcyAtPiBmdWxsbmFtZSk7CisgIGlmIChzIC0+IGRlYnVnZm9ybWF0ICE9IE5VTEwpCisgICAgbWZyZWUgKHMgLT4gb2JqZmlsZSAtPiBtZCwgcyAtPiBkZWJ1Z2Zvcm1hdCk7CisgIG1mcmVlIChzIC0+IG9iamZpbGUgLT4gbWQsIChQVFIpIHMpOworfQorCisjaWYgTUFJTlRFTkFOQ0VfQ01EUworCit2b2lkCitwcmludF9zeW1ib2xfYmNhY2hlX3N0YXRpc3RpY3MgKCkKK3sKKyAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisKKyAgaW1tZWRpYXRlX3F1aXQrKzsKKyAgQUxMX09CSkZJTEVTIChvYmpmaWxlKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkJ5dGUgY2FjaGUgc3RhdGlzdGljcyBmb3IgJyVzJzpcbiIsIG9iamZpbGUgLT4gbmFtZSk7CisgICAgICBwcmludF9iY2FjaGVfc3RhdGlzdGljcyAoJm9iamZpbGUgLT4gcHN5bWJvbF9jYWNoZSwgInBhcnRpYWwgc3ltYm9sIGNhY2hlIik7CisgICAgfQorICBpbW1lZGlhdGVfcXVpdC0tOworfQorCit2b2lkCitwcmludF9vYmpmaWxlX3N0YXRpc3RpY3MgKCkKK3sKKyAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisKKyAgaW1tZWRpYXRlX3F1aXQrKzsKKyAgQUxMX09CSkZJTEVTIChvYmpmaWxlKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlN0YXRpc3RpY3MgZm9yICclcyc6XG4iLCBvYmpmaWxlIC0+IG5hbWUpOworICAgICAgaWYgKE9CSlNUQVQgKG9iamZpbGUsIG5fc3RhYnMpID4gMCkKKwlwcmludGZfZmlsdGVyZWQgKCIgIE51bWJlciBvZiBcInN0YWJcIiBzeW1ib2xzIHJlYWQ6ICVkXG4iLAorCQkJIE9CSlNUQVQgKG9iamZpbGUsIG5fc3RhYnMpKTsKKyAgICAgIGlmIChPQkpTVEFUIChvYmpmaWxlLCBuX21pbnN5bXMpID4gMCkKKwlwcmludGZfZmlsdGVyZWQgKCIgIE51bWJlciBvZiBcIm1pbmltYWxcIiBzeW1ib2xzIHJlYWQ6ICVkXG4iLAorCQkJIE9CSlNUQVQgKG9iamZpbGUsIG5fbWluc3ltcykpOworICAgICAgaWYgKE9CSlNUQVQgKG9iamZpbGUsIG5fcHN5bXMpID4gMCkKKwlwcmludGZfZmlsdGVyZWQgKCIgIE51bWJlciBvZiBcInBhcnRpYWxcIiBzeW1ib2xzIHJlYWQ6ICVkXG4iLAorCQkJIE9CSlNUQVQgKG9iamZpbGUsIG5fcHN5bXMpKTsKKyAgICAgIGlmIChPQkpTVEFUIChvYmpmaWxlLCBuX3N5bXMpID4gMCkKKwlwcmludGZfZmlsdGVyZWQgKCIgIE51bWJlciBvZiBcImZ1bGxcIiBzeW1ib2xzIHJlYWQ6ICVkXG4iLAorCQkJIE9CSlNUQVQgKG9iamZpbGUsIG5fc3ltcykpOworICAgICAgaWYgKE9CSlNUQVQgKG9iamZpbGUsIG5fdHlwZXMpID4gMCkKKwlwcmludGZfZmlsdGVyZWQgKCIgIE51bWJlciBvZiBcInR5cGVzXCIgZGVmaW5lZDogJWRcbiIsCisJCQkgT0JKU1RBVCAob2JqZmlsZSwgbl90eXBlcykpOworICAgICAgaWYgKE9CSlNUQVQgKG9iamZpbGUsIHN6X3N0cnRhYikgPiAwKQorCXByaW50Zl9maWx0ZXJlZCAoIiAgU3BhY2UgdXNlZCBieSBhLm91dCBzdHJpbmcgdGFibGVzOiAlZFxuIiwKKwkJCSBPQkpTVEFUIChvYmpmaWxlLCBzel9zdHJ0YWIpKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiAgVG90YWwgbWVtb3J5IHVzZWQgZm9yIHBzeW1ib2wgb2JzdGFjazogJWRcbiIsCisJCSAgICAgICBvYnN0YWNrX21lbW9yeV91c2VkICgmb2JqZmlsZSAtPiBwc3ltYm9sX29ic3RhY2spKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiAgVG90YWwgbWVtb3J5IHVzZWQgZm9yIHBzeW1ib2wgY2FjaGU6ICVkXG4iLAorCQkgICAgICAgb2JzdGFja19tZW1vcnlfdXNlZCAoJm9iamZpbGUgLT4gcHN5bWJvbF9jYWNoZS5jYWNoZSkpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiICBUb3RhbCBtZW1vcnkgdXNlZCBmb3Igc3ltYm9sIG9ic3RhY2s6ICVkXG4iLAorCQkgICAgICAgb2JzdGFja19tZW1vcnlfdXNlZCAoJm9iamZpbGUgLT4gc3ltYm9sX29ic3RhY2spKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiAgVG90YWwgbWVtb3J5IHVzZWQgZm9yIHR5cGUgb2JzdGFjazogJWRcbiIsCisJCSAgICAgICBvYnN0YWNrX21lbW9yeV91c2VkICgmb2JqZmlsZSAtPiB0eXBlX29ic3RhY2spKTsKKyAgICB9CisgIGltbWVkaWF0ZV9xdWl0LS07Cit9CisKK3N0YXRpYyB2b2lkIAorZHVtcF9vYmpmaWxlIChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IHN5bXRhYiAqc3ltdGFiOworICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzeW10YWI7CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG5PYmplY3QgZmlsZSAlczogICIsIG9iamZpbGUgLT4gbmFtZSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIk9iamZpbGUgYXQgIik7CisgIGdkYl9wcmludF9hZGRyZXNzIChvYmpmaWxlLCBnZGJfc3Rkb3V0KTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiLCBiZmQgYXQgIik7CisgIGdkYl9wcmludF9hZGRyZXNzIChvYmpmaWxlLT5vYmZkLCBnZGJfc3Rkb3V0KTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiLCAlZCBtaW5zeW1zXG5cbiIsCisJCSAgIG9iamZpbGUtPm1pbmltYWxfc3ltYm9sX2NvdW50KTsKKworICBpZiAob2JqZmlsZSAtPiBwc3ltdGFicykKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJQc3ltdGFiczpcbiIpOworICAgICAgZm9yIChwc3ltdGFiID0gb2JqZmlsZSAtPiBwc3ltdGFiczsKKwkgICBwc3ltdGFiICE9IE5VTEw7CisJICAgcHN5bXRhYiA9IHBzeW10YWIgLT4gbmV4dCkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCIlcyBhdCAiLAorCQkJICAgcHN5bXRhYiAtPiBmaWxlbmFtZSk7CisJICBnZGJfcHJpbnRfYWRkcmVzcyAocHN5bXRhYiwgZ2RiX3N0ZG91dCk7CisJICBwcmludGZfZmlsdGVyZWQgKCIsICIpOworCSAgaWYgKHBzeW10YWIgLT4gb2JqZmlsZSAhPSBvYmpmaWxlKQorCSAgICB7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiTk9UIE9OIENIQUlOISAgIik7CisJICAgIH0KKwkgIHdyYXBfaGVyZSAoIiAgIik7CisJfQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cbiIpOworICAgIH0KKworICBpZiAob2JqZmlsZSAtPiBzeW10YWJzKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlN5bXRhYnM6XG4iKTsKKyAgICAgIGZvciAoc3ltdGFiID0gb2JqZmlsZSAtPiBzeW10YWJzOworCSAgIHN5bXRhYiAhPSBOVUxMOworCSAgIHN5bXRhYiA9IHN5bXRhYi0+bmV4dCkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCIlcyBhdCAiLCBzeW10YWIgLT4gZmlsZW5hbWUpOworCSAgZ2RiX3ByaW50X2FkZHJlc3MgKHN5bXRhYiwgZ2RiX3N0ZG91dCk7CisJICBwcmludGZfZmlsdGVyZWQgKCIsICIpOworCSAgaWYgKHN5bXRhYiAtPiBvYmpmaWxlICE9IG9iamZpbGUpCisJICAgIHsKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCJOT1QgT04gQ0hBSU4hICAiKTsKKwkgICAgfQorCSAgd3JhcF9oZXJlICgiICAiKTsKKwl9CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJcblxuIik7CisgICAgfQorfQorCisvKiBQcmludCBtaW5pbWFsIHN5bWJvbHMgZnJvbSB0aGlzIG9iamZpbGUuICAqLworIAorc3RhdGljIHZvaWQgCitkdW1wX21zeW1ib2xzIChvYmpmaWxlLCBvdXRmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgR0RCX0ZJTEUgKm91dGZpbGU7Cit7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbDsKKyAgaW50IGluZGV4OworICBjaGFyIG1zX3R5cGU7CisgIAorICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiXG5PYmplY3QgZmlsZSAlczpcblxuIiwgb2JqZmlsZSAtPiBuYW1lKTsKKyAgaWYgKG9iamZpbGUgLT4gbWluaW1hbF9zeW1ib2xfY291bnQgPT0gMCkKKyAgICB7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiTm8gbWluaW1hbCBzeW1ib2xzIGZvdW5kLlxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICBmb3IgKGluZGV4ID0gMCwgbXN5bWJvbCA9IG9iamZpbGUgLT4gbXN5bWJvbHM7CisgICAgICAgU1lNQk9MX05BTUUgKG1zeW1ib2wpICE9IE5VTEw7IG1zeW1ib2wrKywgaW5kZXgrKykKKyAgICB7CisgICAgICBzd2l0Y2ggKG1zeW1ib2wgLT4gdHlwZSkKKwl7CisJICBjYXNlIG1zdF91bmtub3duOgorCSAgICBtc190eXBlID0gJ3UnOworCSAgICBicmVhazsKKwkgIGNhc2UgbXN0X3RleHQ6CisJICAgIG1zX3R5cGUgPSAnVCc7CisJICAgIGJyZWFrOworCSAgY2FzZSBtc3Rfc29saWJfdHJhbXBvbGluZToKKwkgICAgbXNfdHlwZSA9ICdTJzsKKwkgICAgYnJlYWs7CisJICBjYXNlIG1zdF9kYXRhOgorCSAgICBtc190eXBlID0gJ0QnOworCSAgICBicmVhazsKKwkgIGNhc2UgbXN0X2JzczoKKwkgICAgbXNfdHlwZSA9ICdCJzsKKwkgICAgYnJlYWs7CisJICBjYXNlIG1zdF9hYnM6CisJICAgIG1zX3R5cGUgPSAnQSc7CisJICAgIGJyZWFrOworCSAgY2FzZSBtc3RfZmlsZV90ZXh0OgorCSAgICBtc190eXBlID0gJ3QnOworCSAgICBicmVhazsKKwkgIGNhc2UgbXN0X2ZpbGVfZGF0YToKKwkgICAgbXNfdHlwZSA9ICdkJzsKKwkgICAgYnJlYWs7CisJICBjYXNlIG1zdF9maWxlX2JzczoKKwkgICAgbXNfdHlwZSA9ICdiJzsKKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICBtc190eXBlID0gJz8nOworCSAgICBicmVhazsKKwl9CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiWyUyZF0gJWMgIiwgaW5kZXgsIG1zX3R5cGUpOworICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCksIDEsIG91dGZpbGUpOworICAgICAgZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwgIiAlcyIsIFNZTUJPTF9OQU1FIChtc3ltYm9sKSk7CisgICAgICBpZiAoU1lNQk9MX0JGRF9TRUNUSU9OIChtc3ltYm9sKSkKKwlmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiIHNlY3Rpb24gJXMiLAorCQkJICBiZmRfc2VjdGlvbl9uYW1lIChvYmpmaWxlLT5vYmZkLAorCQkJCQkgICAgU1lNQk9MX0JGRF9TRUNUSU9OIChtc3ltYm9sKSkpOworICAgICAgaWYgKFNZTUJPTF9ERU1BTkdMRURfTkFNRSAobXN5bWJvbCkgIT0gTlVMTCkKKwl7CisJICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiICAlcyIsIFNZTUJPTF9ERU1BTkdMRURfTkFNRSAobXN5bWJvbCkpOworCX0KKyNpZmRlZiBTT0ZVTl9BRERSRVNTX01BWUJFX01JU1NJTkcKKyAgICAgIGlmIChtc3ltYm9sLT5maWxlbmFtZSkKKwlmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiICAlcyIsIG1zeW1ib2wtPmZpbGVuYW1lKTsKKyNlbmRpZgorICAgICAgZnB1dHNfZmlsdGVyZWQgKCJcbiIsIG91dGZpbGUpOworICAgIH0KKyAgaWYgKG9iamZpbGUgLT4gbWluaW1hbF9zeW1ib2xfY291bnQgIT0gaW5kZXgpCisgICAgeworICAgICAgd2FybmluZyAoImludGVybmFsIGVycm9yOiAgbWluaW1hbCBzeW1ib2wgY291bnQgJWQgIT0gJWQiLAorCSAgICAgICBvYmpmaWxlIC0+IG1pbmltYWxfc3ltYm9sX2NvdW50LCBpbmRleCk7CisgICAgfQorICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK2R1bXBfcHN5bXRhYiAob2JqZmlsZSwgcHN5bXRhYiwgb3V0ZmlsZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN5bXRhYjsKKyAgICAgR0RCX0ZJTEUgKm91dGZpbGU7Cit7CisgIGludCBpOworCisgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJcblBhcnRpYWwgc3ltdGFiIGZvciBzb3VyY2UgZmlsZSAlcyAiLAorCQkgICAgcHN5bXRhYiAtPiBmaWxlbmFtZSk7CisgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICIob2JqZWN0ICIpOworICBnZGJfcHJpbnRfYWRkcmVzcyAocHN5bXRhYiwgb3V0ZmlsZSk7CisgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICIpXG5cbiIpOworICBmcHJpbnRmX3VuZmlsdGVyZWQgKG91dGZpbGUsICIgIFJlYWQgZnJvbSBvYmplY3QgZmlsZSAlcyAoIiwKKwkJICAgICAgb2JqZmlsZSAtPiBuYW1lKTsKKyAgZ2RiX3ByaW50X2FkZHJlc3MgKG9iamZpbGUsIG91dGZpbGUpOworICBmcHJpbnRmX3VuZmlsdGVyZWQgKG91dGZpbGUsICIpXG4iKTsKKworICBpZiAocHN5bXRhYiAtPiByZWFkaW4pCisgICAgeworICAgICAgZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwKKwkJIiAgRnVsbCBzeW10YWIgd2FzIHJlYWQgKGF0ICIpOworICAgICAgZ2RiX3ByaW50X2FkZHJlc3MgKHBzeW10YWItPnN5bXRhYiwgb3V0ZmlsZSk7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiIGJ5IGZ1bmN0aW9uIGF0ICIpOworICAgICAgZ2RiX3ByaW50X2FkZHJlc3MgKChQVFIpcHN5bXRhYi0+cmVhZF9zeW10YWIsIG91dGZpbGUpOworICAgICAgZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwgIilcbiIpOworICAgIH0KKworICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiICBSZWxvY2F0ZSBzeW1ib2xzIGJ5ICIpOworICBmb3IgKGkgPSAwOyBpIDwgcHN5bXRhYi0+b2JqZmlsZS0+bnVtX3NlY3Rpb25zOyArK2kpCisgICAgeworICAgICAgaWYgKGkgIT0gMCkKKwlmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiLCAiKTsKKyAgICAgIHdyYXBfaGVyZSAoIiAgICAiKTsKKyAgICAgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoQU5PRkZTRVQgKHBzeW10YWItPnNlY3Rpb25fb2Zmc2V0cywgaSksCisJCQkgICAgIDEsCisJCQkgICAgIG91dGZpbGUpOworICAgIH0KKyAgZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwgIlxuIik7CisKKyAgZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwgIiAgU3ltYm9scyBjb3ZlciB0ZXh0IGFkZHJlc3NlcyAiKTsKKyAgcHJpbnRfYWRkcmVzc19udW1lcmljIChwc3ltdGFiLT50ZXh0bG93LCAxLCBvdXRmaWxlKTsKKyAgZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwgIi0iKTsKKyAgcHJpbnRfYWRkcmVzc19udW1lcmljIChwc3ltdGFiLT50ZXh0aGlnaCwgMSwgb3V0ZmlsZSk7CisgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJcbiIpOworICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiICBEZXBlbmRzIG9uICVkIG90aGVyIHBhcnRpYWwgc3ltdGFicy5cbiIsCisJCSAgICBwc3ltdGFiIC0+IG51bWJlcl9vZl9kZXBlbmRlbmNpZXMpOworICBmb3IgKGkgPSAwOyBpIDwgcHN5bXRhYiAtPiBudW1iZXJfb2ZfZGVwZW5kZW5jaWVzOyBpKyspCisgICAgeworICAgICAgZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwgIiAgICAlZCAiLCBpKTsKKyAgICAgIGdkYl9wcmludF9hZGRyZXNzIChwc3ltdGFiIC0+IGRlcGVuZGVuY2llc1tpXSwgb3V0ZmlsZSk7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiICVzXG4iLAorCQkJcHN5bXRhYiAtPiBkZXBlbmRlbmNpZXNbaV0gLT4gZmlsZW5hbWUpOworICAgIH0KKyAgaWYgKHBzeW10YWIgLT4gbl9nbG9iYWxfc3ltcyA+IDApCisgICAgeworICAgICAgcHJpbnRfcGFydGlhbF9zeW1ib2xzIChvYmpmaWxlIC0+IGdsb2JhbF9wc3ltYm9scy5saXN0CisJCQkgICAgKyBwc3ltdGFiIC0+IGdsb2JhbHNfb2Zmc2V0LAorCQkJICAgIHBzeW10YWIgLT4gbl9nbG9iYWxfc3ltcywgIkdsb2JhbCIsIG91dGZpbGUpOworICAgIH0KKyAgaWYgKHBzeW10YWIgLT4gbl9zdGF0aWNfc3ltcyA+IDApCisgICAgeworICAgICAgcHJpbnRfcGFydGlhbF9zeW1ib2xzIChvYmpmaWxlIC0+IHN0YXRpY19wc3ltYm9scy5saXN0CisJCQkgICAgKyBwc3ltdGFiIC0+IHN0YXRpY3Nfb2Zmc2V0LAorCQkJICAgIHBzeW10YWIgLT4gbl9zdGF0aWNfc3ltcywgIlN0YXRpYyIsIG91dGZpbGUpOworICAgIH0KKyAgZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIAorZHVtcF9zeW10YWIgKG9iamZpbGUsIHN5bXRhYiwgb3V0ZmlsZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgICAgIHN0cnVjdCBzeW10YWIgKnN5bXRhYjsKKyAgICAgR0RCX0ZJTEUgKm91dGZpbGU7Cit7CisgIHJlZ2lzdGVyIGludCBpLCBqOworICBpbnQgbGVuLCBibGVuOworICByZWdpc3RlciBzdHJ1Y3QgbGluZXRhYmxlICpsOworICBzdHJ1Y3QgYmxvY2t2ZWN0b3IgKmJ2OworICByZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmI7CisgIGludCBkZXB0aDsKKworICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiXG5TeW10YWIgZm9yIGZpbGUgJXNcbiIsIHN5bXRhYi0+ZmlsZW5hbWUpOworICBpZiAoc3ltdGFiLT5kaXJuYW1lKQorICAgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJDb21waWxhdGlvbiBkaXJlY3RvcnkgaXMgJXNcbiIsCisJCSAgICAgIHN5bXRhYi0+ZGlybmFtZSk7CisgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJSZWFkIGZyb20gb2JqZWN0IGZpbGUgJXMgKCIsIG9iamZpbGUtPm5hbWUpOworICBnZGJfcHJpbnRfYWRkcmVzcyAob2JqZmlsZSwgb3V0ZmlsZSk7CisgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICIpXG4iKTsKKyAgZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwgIkxhbmd1YWdlOiAlc1xuIiwgbGFuZ3VhZ2Vfc3RyIChzeW10YWItPmxhbmd1YWdlKSk7CisKKyAgLyogRmlyc3QgcHJpbnQgdGhlIGxpbmUgdGFibGUuICAqLworICBsID0gTElORVRBQkxFIChzeW10YWIpOworICBpZiAobCkKKyAgICB7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiXG5MaW5lIHRhYmxlOlxuXG4iKTsKKyAgICAgIGxlbiA9IGwtPm5pdGVtczsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwl7CisJICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiIGxpbmUgJWQgYXQgIiwgbC0+aXRlbVtpXS5saW5lKTsKKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAobC0+aXRlbVtpXS5wYywgMSwgb3V0ZmlsZSk7CisJICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiXG4iKTsKKwl9CisgICAgfQorICAvKiBOb3cgcHJpbnQgdGhlIGJsb2NrIGluZm8sIGJ1dCBvbmx5IGZvciBwcmltYXJ5IHN5bXRhYnMgc2luY2Ugd2Ugd2lsbAorICAgICBwcmludCBsb3RzIG9mIGR1cGxpY2F0ZSBpbmZvIG90aGVyd2lzZS4gKi8KKyAgaWYgKHN5bXRhYiAtPiBwcmltYXJ5KQorICAgIHsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJcbkJsb2NrdmVjdG9yOlxuXG4iKTsKKyAgICAgIGJ2ID0gQkxPQ0tWRUNUT1IgKHN5bXRhYik7CisgICAgICBsZW4gPSBCTE9DS1ZFQ1RPUl9OQkxPQ0tTIChidik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJeworCSAgYiA9IEJMT0NLVkVDVE9SX0JMT0NLIChidiwgaSk7CisJICBkZXB0aCA9IGJsb2NrX2RlcHRoIChiKSAqIDI7CisJICBwcmludF9zcGFjZXMgKGRlcHRoLCBvdXRmaWxlKTsKKwkgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJibG9jayAjJTAzZCwgb2JqZWN0IGF0ICIsIGkpOworCSAgZ2RiX3ByaW50X2FkZHJlc3MgKGIsIG91dGZpbGUpOworCSAgaWYgKEJMT0NLX1NVUEVSQkxPQ0sgKGIpKQorCSAgICB7CisJICAgICAgZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwgIiB1bmRlciAiKTsKKwkgICAgICBnZGJfcHJpbnRfYWRkcmVzcyAoQkxPQ0tfU1VQRVJCTE9DSyAoYiksIG91dGZpbGUpOworCSAgICB9CisJICBibGVuID0gQkxPQ0tfTlNZTVMgKGIpOworCSAgZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwgIiwgJWQgc3ltcyBpbiAiLCBibGVuKTsKKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoQkxPQ0tfU1RBUlQgKGIpLCAxLCBvdXRmaWxlKTsKKwkgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICIuLiIpOworCSAgcHJpbnRfYWRkcmVzc19udW1lcmljIChCTE9DS19FTkQgKGIpLCAxLCBvdXRmaWxlKTsKKwkgIGlmIChCTE9DS19GVU5DVElPTiAoYikpCisJICAgIHsKKwkgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiLCBmdW5jdGlvbiAlcyIsIFNZTUJPTF9OQU1FIChCTE9DS19GVU5DVElPTiAoYikpKTsKKwkgICAgICBpZiAoU1lNQk9MX0RFTUFOR0xFRF9OQU1FIChCTE9DS19GVU5DVElPTiAoYikpICE9IE5VTEwpCisJCXsKKwkJICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiLCAlcyIsCisJCQkJICAgIFNZTUJPTF9ERU1BTkdMRURfTkFNRSAoQkxPQ0tfRlVOQ1RJT04gKGIpKSk7CisJCX0KKwkgICAgfQorCSAgaWYgKEJMT0NLX0dDQ19DT01QSUxFRChiKSkKKwkgICAgZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwgIiwgY29tcGlsZWQgd2l0aCBnY2MlZCIsIEJMT0NLX0dDQ19DT01QSUxFRChiKSk7CisJICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiXG4iKTsKKwkgIC8qIE5vdyBwcmludCBlYWNoIHN5bWJvbCBpbiB0aGlzIGJsb2NrICovCisJICBmb3IgKGogPSAwOyBqIDwgYmxlbjsgaisrKQorCSAgICB7CisJICAgICAgc3RydWN0IHByaW50X3N5bWJvbF9hcmdzIHM7CisJICAgICAgcy5zeW1ib2wgPSBCTE9DS19TWU0gKGIsIGopOworCSAgICAgIHMuZGVwdGggPSBkZXB0aCArIDE7CisJICAgICAgcy5vdXRmaWxlID0gb3V0ZmlsZTsKKwkgICAgICBjYXRjaF9lcnJvcnMgKHByaW50X3N5bWJvbCwgJnMsICJFcnJvciBwcmludGluZyBzeW1ib2w6XG4iLAorCQkJICAgIFJFVFVSTl9NQVNLX0FMTCk7CisJICAgIH0KKwl9CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiXG4iKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiXG5CbG9ja3ZlY3RvciBzYW1lIGFzIHByZXZpb3VzIHN5bXRhYlxuXG4iKTsKKyAgICB9Cit9CisKK3ZvaWQKK21haW50ZW5hbmNlX3ByaW50X3N5bWJvbHMgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoYXIgKiphcmd2OworICBHREJfRklMRSAqb3V0ZmlsZTsKKyAgc3RydWN0IGNsZWFudXAgKmNsZWFudXBzOworICBjaGFyICpzeW1uYW1lID0gTlVMTDsKKyAgY2hhciAqZmlsZW5hbWUgPSBERVZfVFRZOworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgc3RydWN0IHN5bXRhYiAqczsKKworICBkb250X3JlcGVhdCAoKTsKKworICBpZiAoYXJncyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGVycm9yICgiXAorQXJndW1lbnRzIG1pc3Npbmc6IGFuIG91dHB1dCBmaWxlIG5hbWUgYW5kIGFuIG9wdGlvbmFsIHN5bWJvbCBmaWxlIG5hbWUiKTsKKyAgICB9CisgIGVsc2UgaWYgKChhcmd2ID0gYnVpbGRhcmd2IChhcmdzKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICBub21lbSAoMCk7CisgICAgfQorICBjbGVhbnVwcyA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlYXJndiwgKGNoYXIgKikgYXJndik7CisKKyAgaWYgKGFyZ3ZbMF0gIT0gTlVMTCkKKyAgICB7CisgICAgICBmaWxlbmFtZSA9IGFyZ3ZbMF07CisgICAgICAvKiBJZiBhIHNlY29uZCBhcmcgaXMgc3VwcGxpZWQsIGl0IGlzIGEgc291cmNlIGZpbGUgbmFtZSB0byBtYXRjaCBvbiAqLworICAgICAgaWYgKGFyZ3ZbMV0gIT0gTlVMTCkKKwl7CisJICBzeW1uYW1lID0gYXJndlsxXTsKKwl9CisgICAgfQorCisgIGZpbGVuYW1lID0gdGlsZGVfZXhwYW5kIChmaWxlbmFtZSk7CisgIG1ha2VfY2xlYW51cCAoZnJlZSwgZmlsZW5hbWUpOworICAKKyAgb3V0ZmlsZSA9IGdkYl9mb3BlbiAoZmlsZW5hbWUsIEZPUEVOX1dUKTsKKyAgaWYgKG91dGZpbGUgPT0gMCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lIChmaWxlbmFtZSk7CisgIG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBnZGJfZmNsb3NlLCAoY2hhciAqKSAmb3V0ZmlsZSk7CisKKyAgaW1tZWRpYXRlX3F1aXQrKzsKKyAgQUxMX1NZTVRBQlMgKG9iamZpbGUsIHMpCisgICAgaWYgKHN5bW5hbWUgPT0gTlVMTCB8fCAoU1RSRVEgKHN5bW5hbWUsIHMgLT4gZmlsZW5hbWUpKSkKKyAgICAgIGR1bXBfc3ltdGFiIChvYmpmaWxlLCBzLCBvdXRmaWxlKTsKKyAgaW1tZWRpYXRlX3F1aXQtLTsKKyAgZG9fY2xlYW51cHMgKGNsZWFudXBzKTsKK30KKworLyogUHJpbnQgc3ltYm9sIEFSR1MtPlNZTUJPTCBvbiBBUkdTLT5PVVRGSUxFLiAgQVJHUy0+REVQVEggc2F5cyBob3cKKyAgIGZhciB0byBpbmRlbnQuICBBUkdTIGlzIHJlYWxseSBhIHN0cnVjdCBwcmludF9zeW1ib2xfYXJncyAqLCBidXQgaXMKKyAgIGRlY2xhcmVkIGFzIGNoYXIgKiB0byBnZXQgaXQgcGFzdCBjYXRjaF9lcnJvcnMuICBSZXR1cm5zIDAgZm9yIGVycm9yLAorICAgMSBmb3Igc3VjY2Vzcy4gICovCisKK3N0YXRpYyBpbnQKK3ByaW50X3N5bWJvbCAoYXJncykKKyAgICAgUFRSIGFyZ3M7Cit7CisgIHN0cnVjdCBzeW1ib2wgKnN5bWJvbCA9ICgoc3RydWN0IHByaW50X3N5bWJvbF9hcmdzICopYXJncyktPnN5bWJvbDsKKyAgaW50IGRlcHRoID0gKChzdHJ1Y3QgcHJpbnRfc3ltYm9sX2FyZ3MgKilhcmdzKS0+ZGVwdGg7CisgIEdEQl9GSUxFICpvdXRmaWxlID0gKChzdHJ1Y3QgcHJpbnRfc3ltYm9sX2FyZ3MgKilhcmdzKS0+b3V0ZmlsZTsKKworICBwcmludF9zcGFjZXMgKGRlcHRoLCBvdXRmaWxlKTsKKyAgaWYgKFNZTUJPTF9OQU1FU1BBQ0UgKHN5bWJvbCkgPT0gTEFCRUxfTkFNRVNQQUNFKQorICAgIHsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJsYWJlbCAlcyBhdCAiLCBTWU1CT0xfU09VUkNFX05BTUUgKHN5bWJvbCkpOworICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltYm9sKSwgMSwgb3V0ZmlsZSk7CisgICAgICBpZiAoU1lNQk9MX0JGRF9TRUNUSU9OIChzeW1ib2wpKQorCWZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICIgc2VjdGlvbiAlc1xuIiwKKwkJCSAgYmZkX3NlY3Rpb25fbmFtZSAoU1lNQk9MX0JGRF9TRUNUSU9OIChzeW1ib2wpLT5vd25lciwKKwkJCQkJICAgIFNZTUJPTF9CRkRfU0VDVElPTiAoc3ltYm9sKSkpOworICAgICAgZWxzZQorCWZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBpZiAoU1lNQk9MX05BTUVTUEFDRSAoc3ltYm9sKSA9PSBTVFJVQ1RfTkFNRVNQQUNFKQorICAgIHsKKyAgICAgIGlmIChUWVBFX1RBR19OQU1FIChTWU1CT0xfVFlQRSAoc3ltYm9sKSkpCisJeworCSAgTEFfUFJJTlRfVFlQRSAoU1lNQk9MX1RZUEUgKHN5bWJvbCksICIiLCBvdXRmaWxlLCAxLCBkZXB0aCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICIlcyAlcyA9ICIsCisJICAgICAgIChUWVBFX0NPREUgKFNZTUJPTF9UWVBFIChzeW1ib2wpKSA9PSBUWVBFX0NPREVfRU5VTQorCQk/ICJlbnVtIgorCQk6IChUWVBFX0NPREUgKFNZTUJPTF9UWVBFIChzeW1ib2wpKSA9PSBUWVBFX0NPREVfU1RSVUNUCisJCSAgID8gInN0cnVjdCIgOiAidW5pb24iKSksCisJICAgICAgIFNZTUJPTF9OQU1FIChzeW1ib2wpKTsKKwkgIExBX1BSSU5UX1RZUEUgKFNZTUJPTF9UWVBFIChzeW1ib2wpLCAiIiwgb3V0ZmlsZSwgMSwgZGVwdGgpOworCX0KKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICI7XG4iKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoU1lNQk9MX0NMQVNTIChzeW1ib2wpID09IExPQ19UWVBFREVGKQorCWZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJ0eXBlZGVmICIpOworICAgICAgaWYgKFNZTUJPTF9UWVBFIChzeW1ib2wpKQorCXsKKwkgIC8qIFByaW50IGRldGFpbHMgb2YgdHlwZXMsIGV4Y2VwdCBmb3IgZW51bXMgd2hlcmUgaXQncyBjbHV0dGVyLiAgKi8KKwkgIExBX1BSSU5UX1RZUEUgKFNZTUJPTF9UWVBFIChzeW1ib2wpLCBTWU1CT0xfU09VUkNFX05BTUUgKHN5bWJvbCksCisJCQkgb3V0ZmlsZSwKKwkJCSBUWVBFX0NPREUgKFNZTUJPTF9UWVBFIChzeW1ib2wpKSAhPSBUWVBFX0NPREVfRU5VTSwKKwkJCSBkZXB0aCk7CisJICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiOyAiKTsKKwl9CisgICAgICBlbHNlCisJZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwgIiVzICIsIFNZTUJPTF9TT1VSQ0VfTkFNRSAoc3ltYm9sKSk7CisKKyAgICAgIHN3aXRjaCAoU1lNQk9MX0NMQVNTIChzeW1ib2wpKQorCXsKKwljYXNlIExPQ19DT05TVDoKKwkgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJjb25zdCAlbGQgKDB4JWx4KSIsCisJCQkgICAgU1lNQk9MX1ZBTFVFIChzeW1ib2wpLAorCQkJICAgIFNZTUJPTF9WQUxVRSAoc3ltYm9sKSk7CisJICBicmVhazsKKworCWNhc2UgTE9DX0NPTlNUX0JZVEVTOgorCSAgeworCSAgICB1bnNpZ25lZCBpOworCSAgICBzdHJ1Y3QgdHlwZSAqdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFNZTUJPTF9UWVBFIChzeW1ib2wpKTsKKwkgICAgZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwgImNvbnN0ICV1IGhleCBieXRlczoiLAorCQkJICAgICAgVFlQRV9MRU5HVEggKHR5cGUpKTsKKwkgICAgZm9yIChpID0gMDsgaSA8IFRZUEVfTEVOR1RIICh0eXBlKTsgaSsrKQorCSAgICAgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICIgJTAyeCIsCisJCQkJKHVuc2lnbmVkKVNZTUJPTF9WQUxVRV9CWVRFUyAoc3ltYm9sKSBbaV0pOworCSAgfQorCSAgYnJlYWs7CisKKwljYXNlIExPQ19TVEFUSUM6CisJICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAic3RhdGljIGF0ICIpOworCSAgcHJpbnRfYWRkcmVzc19udW1lcmljIChTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltYm9sKSwgMSxvdXRmaWxlKTsKKwkgIGlmIChTWU1CT0xfQkZEX1NFQ1RJT04gKHN5bWJvbCkpCisJICAgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICIgc2VjdGlvbiAlcyIsCisJCQkgICAgICBiZmRfc2VjdGlvbl9uYW1lCisJCQkgICAgICAoU1lNQk9MX0JGRF9TRUNUSU9OIChzeW1ib2wpLT5vd25lciwKKwkJCSAgICAgICBTWU1CT0xfQkZEX1NFQ1RJT04gKHN5bWJvbCkpKTsKKwkgIGJyZWFrOworCisJY2FzZSBMT0NfSU5ESVJFQ1Q6CisJICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiZXh0ZXJuIGdsb2JhbCBhdCAqKCIpOworCSAgcHJpbnRfYWRkcmVzc19udW1lcmljIChTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltYm9sKSwgMSxvdXRmaWxlKTsKKwkgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICIpLCIpOworCSAgYnJlYWs7CisKKwljYXNlIExPQ19SRUdJU1RFUjoKKwkgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJyZWdpc3RlciAlbGQiLCBTWU1CT0xfVkFMVUUgKHN5bWJvbCkpOworCSAgYnJlYWs7CisKKwljYXNlIExPQ19BUkc6CisJICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiYXJnIGF0IG9mZnNldCAweCVseCIsCisJCQkgICAgU1lNQk9MX1ZBTFVFIChzeW1ib2wpKTsKKwkgIGJyZWFrOworCisJY2FzZSBMT0NfTE9DQUxfQVJHOgorCSAgZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwgImFyZyBhdCBvZmZzZXQgMHglbHggZnJvbSBmcCIsCisJCSAgIFNZTUJPTF9WQUxVRSAoc3ltYm9sKSk7CisJICBicmVhazsKKworCWNhc2UgTE9DX1JFRl9BUkc6CisJICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAicmVmZXJlbmNlIGFyZyBhdCAweCVseCIsIFNZTUJPTF9WQUxVRSAoc3ltYm9sKSk7CisJICBicmVhazsKKworCWNhc2UgTE9DX1JFR1BBUk06CisJICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAicGFyYW1ldGVyIHJlZ2lzdGVyICVsZCIsIFNZTUJPTF9WQUxVRSAoc3ltYm9sKSk7CisJICBicmVhazsKKworCWNhc2UgTE9DX1JFR1BBUk1fQUREUjoKKwkgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJhZGRyZXNzIHBhcmFtZXRlciByZWdpc3RlciAlbGQiLCBTWU1CT0xfVkFMVUUgKHN5bWJvbCkpOworCSAgYnJlYWs7CisKKwljYXNlIExPQ19MT0NBTDoKKwkgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJsb2NhbCBhdCBvZmZzZXQgMHglbHgiLAorCQkJICAgIFNZTUJPTF9WQUxVRSAoc3ltYm9sKSk7CisJICBicmVhazsKKworCWNhc2UgTE9DX0JBU0VSRUc6CisJICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAibG9jYWwgYXQgMHglbHggZnJvbSByZWdpc3RlciAlZCIsCisJCSAgIFNZTUJPTF9WQUxVRSAoc3ltYm9sKSwgU1lNQk9MX0JBU0VSRUcgKHN5bWJvbCkpOworCSAgYnJlYWs7CisKKwljYXNlIExPQ19CQVNFUkVHX0FSRzoKKwkgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJhcmcgYXQgMHglbHggZnJvbSByZWdpc3RlciAlZCIsCisJCSAgIFNZTUJPTF9WQUxVRSAoc3ltYm9sKSwgU1lNQk9MX0JBU0VSRUcgKHN5bWJvbCkpOworCSAgYnJlYWs7CisKKwljYXNlIExPQ19UWVBFREVGOgorCSAgYnJlYWs7CisKKwljYXNlIExPQ19MQUJFTDoKKwkgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJsYWJlbCBhdCAiKTsKKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoU1lNQk9MX1ZBTFVFX0FERFJFU1MgKHN5bWJvbCksIDEsIG91dGZpbGUpOworCSAgaWYgKFNZTUJPTF9CRkRfU0VDVElPTiAoc3ltYm9sKSkKKwkgICAgZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwgIiBzZWN0aW9uICVzIiwKKwkJCSAgICAgIGJmZF9zZWN0aW9uX25hbWUKKwkJCSAgICAgIChTWU1CT0xfQkZEX1NFQ1RJT04gKHN5bWJvbCktPm93bmVyLAorCQkJICAgICAgIFNZTUJPTF9CRkRfU0VDVElPTiAoc3ltYm9sKSkpOworCSAgYnJlYWs7CisKKwljYXNlIExPQ19CTE9DSzoKKwkgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJibG9jayBvYmplY3QgIik7CisJICBnZGJfcHJpbnRfYWRkcmVzcyAoU1lNQk9MX0JMT0NLX1ZBTFVFIChzeW1ib2wpLCBvdXRmaWxlKTsKKwkgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICIsICIpOworCSAgcHJpbnRfYWRkcmVzc19udW1lcmljIChCTE9DS19TVEFSVCAoU1lNQk9MX0JMT0NLX1ZBTFVFIChzeW1ib2wpKSwKKwkJCQkgMSwKKwkJCQkgb3V0ZmlsZSk7CisJICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiLi4iKTsKKwkgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAoQkxPQ0tfRU5EIChTWU1CT0xfQkxPQ0tfVkFMVUUgKHN5bWJvbCkpLAorCQkJCSAxLAorCQkJCSBvdXRmaWxlKTsKKwkgIGlmIChTWU1CT0xfQkZEX1NFQ1RJT04gKHN5bWJvbCkpCisJICAgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICIgc2VjdGlvbiAlcyIsCisJCQkgICAgICBiZmRfc2VjdGlvbl9uYW1lCisJCQkgICAgICAoU1lNQk9MX0JGRF9TRUNUSU9OIChzeW1ib2wpLT5vd25lciwKKwkJCSAgICAgICBTWU1CT0xfQkZEX1NFQ1RJT04gKHN5bWJvbCkpKTsKKwkgIGJyZWFrOworCisJY2FzZSBMT0NfVU5SRVNPTFZFRDoKKwkgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJ1bnJlc29sdmVkIik7CisJICBicmVhazsKKworCWNhc2UgTE9DX09QVElNSVpFRF9PVVQ6CisJICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAib3B0aW1pemVkIG91dCIpOworCSAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKwkgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJib3RjaGVkIHN5bWJvbCBjbGFzcyAleCIsCisJCQkgICAgU1lNQk9MX0NMQVNTIChzeW1ib2wpKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJcbiIpOworICByZXR1cm4gMTsKK30KKwordm9pZAorbWFpbnRlbmFuY2VfcHJpbnRfcHN5bWJvbHMgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoYXIgKiphcmd2OworICBHREJfRklMRSAgKm91dGZpbGU7CisgIHN0cnVjdCBjbGVhbnVwICpjbGVhbnVwczsKKyAgY2hhciAqc3ltbmFtZSA9IE5VTEw7CisgIGNoYXIgKmZpbGVuYW1lID0gREVWX1RUWTsKKyAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHM7CisKKyAgZG9udF9yZXBlYXQgKCk7CisKKyAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICB7CisgICAgICBlcnJvciAoInByaW50LXBzeW1ib2xzIHRha2VzIGFuIG91dHB1dCBmaWxlIG5hbWUgYW5kIG9wdGlvbmFsIHN5bWJvbCBmaWxlIG5hbWUiKTsKKyAgICB9CisgIGVsc2UgaWYgKChhcmd2ID0gYnVpbGRhcmd2IChhcmdzKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICBub21lbSAoMCk7CisgICAgfQorICBjbGVhbnVwcyA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlYXJndiwgKGNoYXIgKikgYXJndik7CisKKyAgaWYgKGFyZ3ZbMF0gIT0gTlVMTCkKKyAgICB7CisgICAgICBmaWxlbmFtZSA9IGFyZ3ZbMF07CisgICAgICAvKiBJZiBhIHNlY29uZCBhcmcgaXMgc3VwcGxpZWQsIGl0IGlzIGEgc291cmNlIGZpbGUgbmFtZSB0byBtYXRjaCBvbiAqLworICAgICAgaWYgKGFyZ3ZbMV0gIT0gTlVMTCkKKwl7CisJICBzeW1uYW1lID0gYXJndlsxXTsKKwl9CisgICAgfQorCisgIGZpbGVuYW1lID0gdGlsZGVfZXhwYW5kIChmaWxlbmFtZSk7CisgIG1ha2VfY2xlYW51cCAoZnJlZSwgZmlsZW5hbWUpOworICAKKyAgb3V0ZmlsZSA9IGdkYl9mb3BlbiAoZmlsZW5hbWUsIEZPUEVOX1dUKTsKKyAgaWYgKG91dGZpbGUgPT0gMCkKKyAgICBwZXJyb3Jfd2l0aF9uYW1lIChmaWxlbmFtZSk7CisgIG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBnZGJfZmNsb3NlLCAmb3V0ZmlsZSk7CisKKyAgaW1tZWRpYXRlX3F1aXQrKzsKKyAgQUxMX1BTWU1UQUJTIChvYmpmaWxlLCBwcykKKyAgICBpZiAoc3ltbmFtZSA9PSBOVUxMIHx8IChTVFJFUSAoc3ltbmFtZSwgcHMgLT4gZmlsZW5hbWUpKSkKKyAgICAgIGR1bXBfcHN5bXRhYiAob2JqZmlsZSwgcHMsIG91dGZpbGUpOworICBpbW1lZGlhdGVfcXVpdC0tOworICBkb19jbGVhbnVwcyAoY2xlYW51cHMpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfcGFydGlhbF9zeW1ib2xzIChwLCBjb3VudCwgd2hhdCwgb3V0ZmlsZSkKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqcDsKKyAgICAgaW50IGNvdW50OworICAgICBjaGFyICp3aGF0OworICAgICBHREJfRklMRSAqb3V0ZmlsZTsKK3sKKyAgZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwgIiAgJXMgcGFydGlhbCBzeW1ib2xzOlxuIiwgd2hhdCk7CisgIHdoaWxlIChjb3VudC0tID4gMCkKKyAgICB7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChvdXRmaWxlLCAiICAgIGAlcyciLCBTWU1CT0xfTkFNRSgqcCkpOworICAgICAgaWYgKFNZTUJPTF9ERU1BTkdMRURfTkFNRSAoKnApICE9IE5VTEwpCisJeworCSAgZnByaW50Zl9maWx0ZXJlZCAob3V0ZmlsZSwgIiAgYCVzJyIsIFNZTUJPTF9ERU1BTkdMRURfTkFNRSAoKnApKTsKKwl9CisgICAgICBmcHV0c19maWx0ZXJlZCAoIiwgIiwgb3V0ZmlsZSk7CisgICAgICBzd2l0Y2ggKFNZTUJPTF9OQU1FU1BBQ0UgKCpwKSkKKwl7CisJY2FzZSBVTkRFRl9OQU1FU1BBQ0U6CisJICBmcHV0c19maWx0ZXJlZCAoInVuZGVmaW5lZCBuYW1lc3BhY2UsICIsIG91dGZpbGUpOworCSAgYnJlYWs7CisJY2FzZSBWQVJfTkFNRVNQQUNFOgorCSAgLyogVGhpcyBpcyB0aGUgdXN1YWwgdGhpbmcgLS0gZG9uJ3QgcHJpbnQgaXQgKi8KKwkgIGJyZWFrOworCWNhc2UgU1RSVUNUX05BTUVTUEFDRToKKwkgIGZwdXRzX2ZpbHRlcmVkICgic3RydWN0IG5hbWVzcGFjZSwgIiwgb3V0ZmlsZSk7CisJICBicmVhazsKKwljYXNlIExBQkVMX05BTUVTUEFDRToKKwkgIGZwdXRzX2ZpbHRlcmVkICgibGFiZWwgbmFtZXNwYWNlLCAiLCBvdXRmaWxlKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBmcHV0c19maWx0ZXJlZCAoIjxpbnZhbGlkIG5hbWVzcGFjZT4sICIsIG91dGZpbGUpOworCSAgYnJlYWs7CisJfQorICAgICAgc3dpdGNoIChTWU1CT0xfQ0xBU1MgKCpwKSkKKwl7CisJY2FzZSBMT0NfVU5ERUY6CisJICBmcHV0c19maWx0ZXJlZCAoInVuZGVmaW5lZCIsIG91dGZpbGUpOworCSAgYnJlYWs7CisJY2FzZSBMT0NfQ09OU1Q6CisJICBmcHV0c19maWx0ZXJlZCAoImNvbnN0YW50IGludCIsIG91dGZpbGUpOworCSAgYnJlYWs7CisJY2FzZSBMT0NfU1RBVElDOgorCSAgZnB1dHNfZmlsdGVyZWQgKCJzdGF0aWMiLCBvdXRmaWxlKTsKKwkgIGJyZWFrOworCWNhc2UgTE9DX0lORElSRUNUOgorCSAgZnB1dHNfZmlsdGVyZWQgKCJleHRlcm4gZ2xvYmFsIiwgb3V0ZmlsZSk7CisJICBicmVhazsKKwljYXNlIExPQ19SRUdJU1RFUjoKKwkgIGZwdXRzX2ZpbHRlcmVkICgicmVnaXN0ZXIiLCBvdXRmaWxlKTsKKwkgIGJyZWFrOworCWNhc2UgTE9DX0FSRzoKKwkgIGZwdXRzX2ZpbHRlcmVkICgicGFzcyBieSB2YWx1ZSIsIG91dGZpbGUpOworCSAgYnJlYWs7CisJY2FzZSBMT0NfUkVGX0FSRzoKKwkgIGZwdXRzX2ZpbHRlcmVkICgicGFzcyBieSByZWZlcmVuY2UiLCBvdXRmaWxlKTsKKwkgIGJyZWFrOworCWNhc2UgTE9DX1JFR1BBUk06CisJICBmcHV0c19maWx0ZXJlZCAoInJlZ2lzdGVyIHBhcmFtZXRlciIsIG91dGZpbGUpOworCSAgYnJlYWs7CisJY2FzZSBMT0NfUkVHUEFSTV9BRERSOgorCSAgZnB1dHNfZmlsdGVyZWQgKCJyZWdpc3RlciBhZGRyZXNzIHBhcmFtZXRlciIsIG91dGZpbGUpOworCSAgYnJlYWs7CisJY2FzZSBMT0NfTE9DQUw6CisJICBmcHV0c19maWx0ZXJlZCAoInN0YWNrIHBhcmFtZXRlciIsIG91dGZpbGUpOworCSAgYnJlYWs7CisJY2FzZSBMT0NfVFlQRURFRjoKKwkgIGZwdXRzX2ZpbHRlcmVkICgidHlwZSIsIG91dGZpbGUpOworCSAgYnJlYWs7CisJY2FzZSBMT0NfTEFCRUw6CisJICBmcHV0c19maWx0ZXJlZCAoImxhYmVsIiwgb3V0ZmlsZSk7CisJICBicmVhazsKKwljYXNlIExPQ19CTE9DSzoKKwkgIGZwdXRzX2ZpbHRlcmVkICgiZnVuY3Rpb24iLCBvdXRmaWxlKTsKKwkgIGJyZWFrOworCWNhc2UgTE9DX0NPTlNUX0JZVEVTOgorCSAgZnB1dHNfZmlsdGVyZWQgKCJjb25zdGFudCBieXRlcyIsIG91dGZpbGUpOworCSAgYnJlYWs7CisJY2FzZSBMT0NfTE9DQUxfQVJHOgorCSAgZnB1dHNfZmlsdGVyZWQgKCJzaHVmZmxlZCBhcmciLCBvdXRmaWxlKTsKKwkgIGJyZWFrOworCWNhc2UgTE9DX1VOUkVTT0xWRUQ6CisJICBmcHV0c19maWx0ZXJlZCAoInVucmVzb2x2ZWQiLCBvdXRmaWxlKTsKKwkgIGJyZWFrOworCWNhc2UgTE9DX09QVElNSVpFRF9PVVQ6CisJICBmcHV0c19maWx0ZXJlZCAoIm9wdGltaXplZCBvdXQiLCBvdXRmaWxlKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBmcHV0c19maWx0ZXJlZCAoIjxpbnZhbGlkIGxvY2F0aW9uPiIsIG91dGZpbGUpOworCSAgYnJlYWs7CisJfQorICAgICAgZnB1dHNfZmlsdGVyZWQgKCIsICIsIG91dGZpbGUpOworICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChTWU1CT0xfVkFMVUVfQUREUkVTUyAoKnApLCAxLCBvdXRmaWxlKTsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJcbiIpOworICAgICAgcCsrOworICAgIH0KK30KKwordm9pZAorbWFpbnRlbmFuY2VfcHJpbnRfbXN5bWJvbHMgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoYXIgKiphcmd2OworICBHREJfRklMRSAqb3V0ZmlsZTsKKyAgc3RydWN0IGNsZWFudXAgKmNsZWFudXBzOworICBjaGFyICpmaWxlbmFtZSA9IERFVl9UVFk7CisgIGNoYXIgKnN5bW5hbWUgPSBOVUxMOworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKworICBkb250X3JlcGVhdCAoKTsKKworICBpZiAoYXJncyA9PSBOVUxMKQorICAgIHsKKyAgICAgIGVycm9yICgicHJpbnQtbXN5bWJvbHMgdGFrZXMgYW4gb3V0cHV0IGZpbGUgbmFtZSBhbmQgb3B0aW9uYWwgc3ltYm9sIGZpbGUgbmFtZSIpOworICAgIH0KKyAgZWxzZSBpZiAoKGFyZ3YgPSBidWlsZGFyZ3YgKGFyZ3MpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIG5vbWVtICgwKTsKKyAgICB9CisgIGNsZWFudXBzID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVhcmd2LCBhcmd2KTsKKworICBpZiAoYXJndlswXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZpbGVuYW1lID0gYXJndlswXTsKKyAgICAgIC8qIElmIGEgc2Vjb25kIGFyZyBpcyBzdXBwbGllZCwgaXQgaXMgYSBzb3VyY2UgZmlsZSBuYW1lIHRvIG1hdGNoIG9uICovCisgICAgICBpZiAoYXJndlsxXSAhPSBOVUxMKQorCXsKKwkgIHN5bW5hbWUgPSBhcmd2WzFdOworCX0KKyAgICB9CisKKyAgZmlsZW5hbWUgPSB0aWxkZV9leHBhbmQgKGZpbGVuYW1lKTsKKyAgbWFrZV9jbGVhbnVwIChmcmVlLCBmaWxlbmFtZSk7CisgIAorICBvdXRmaWxlID0gZ2RiX2ZvcGVuIChmaWxlbmFtZSwgRk9QRU5fV1QpOworICBpZiAob3V0ZmlsZSA9PSAwKQorICAgIHBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKKyAgbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGdkYl9mY2xvc2UsICZvdXRmaWxlKTsKKworICBpbW1lZGlhdGVfcXVpdCsrOworICBBTExfT0JKRklMRVMgKG9iamZpbGUpCisgICAgaWYgKHN5bW5hbWUgPT0gTlVMTCB8fCAoU1RSRVEgKHN5bW5hbWUsIG9iamZpbGUgLT4gbmFtZSkpKQorICAgICAgZHVtcF9tc3ltYm9scyAob2JqZmlsZSwgb3V0ZmlsZSk7CisgIGltbWVkaWF0ZV9xdWl0LS07CisgIGZwcmludGZfZmlsdGVyZWQgKG91dGZpbGUsICJcblxuIik7CisgIGRvX2NsZWFudXBzIChjbGVhbnVwcyk7Cit9CisKK3ZvaWQKK21haW50ZW5hbmNlX3ByaW50X29iamZpbGVzIChpZ25vcmUsIGZyb21fdHR5KQorICAgICBjaGFyICppZ25vcmU7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisKKyAgZG9udF9yZXBlYXQgKCk7CisKKyAgaW1tZWRpYXRlX3F1aXQrKzsKKyAgQUxMX09CSkZJTEVTIChvYmpmaWxlKQorICAgIGR1bXBfb2JqZmlsZSAob2JqZmlsZSk7CisgIGltbWVkaWF0ZV9xdWl0LS07Cit9CisKKy8qIENoZWNrIGNvbnNpc3RlbmN5IG9mIHBzeW10YWJzIGFuZCBzeW10YWJzLiAgKi8KKwordm9pZAorbWFpbnRlbmFuY2VfY2hlY2tfc3ltdGFicyAoaWdub3JlLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqaWdub3JlOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgcmVnaXN0ZXIgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqcHN5bTsKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bXRhYiAqcyA9IE5VTEw7CisgIHJlZ2lzdGVyIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHM7CisgIHN0cnVjdCBibG9ja3ZlY3RvciAqYnY7CisgIHJlZ2lzdGVyIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICByZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmI7CisgIGludCBsZW5ndGg7CisKKyAgQUxMX1BTWU1UQUJTIChvYmpmaWxlLCBwcykKKyAgICB7CisgICAgICBzID0gUFNZTVRBQl9UT19TWU1UQUIocHMpOworICAgICAgaWYgKHMgPT0gTlVMTCkKKwljb250aW51ZTsKKyAgICAgIGJ2ID0gQkxPQ0tWRUNUT1IgKHMpOworICAgICAgYiA9IEJMT0NLVkVDVE9SX0JMT0NLIChidiwgU1RBVElDX0JMT0NLKTsKKyAgICAgIHBzeW0gPSBwcy0+b2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLmxpc3QgKyBwcy0+c3RhdGljc19vZmZzZXQ7CisgICAgICBsZW5ndGggPSBwcy0+bl9zdGF0aWNfc3ltczsKKyAgICAgIHdoaWxlIChsZW5ndGgtLSkKKwl7CisJICBzeW0gPSBsb29rdXBfYmxvY2tfc3ltYm9sIChiLCBTWU1CT0xfTkFNRSAoKnBzeW0pLAorCQkJCSAgICAgU1lNQk9MX05BTUVTUEFDRSAoKnBzeW0pKTsKKwkgIGlmICghc3ltKQorCSAgICB7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiU3RhdGljIHN5bWJvbCBgIik7CisJICAgICAgcHV0c19maWx0ZXJlZCAoU1lNQk9MX05BTUUgKCpwc3ltKSk7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiJyBvbmx5IGZvdW5kIGluICIpOworCSAgICAgIHB1dHNfZmlsdGVyZWQgKHBzLT5maWxlbmFtZSk7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiIHBzeW10YWJcbiIpOworCSAgICB9CisJICBwc3ltKys7CisJfQorICAgICAgYiA9IEJMT0NLVkVDVE9SX0JMT0NLIChidiwgR0xPQkFMX0JMT0NLKTsKKyAgICAgIHBzeW0gPSBwcy0+b2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLmxpc3QgKyBwcy0+Z2xvYmFsc19vZmZzZXQ7CisgICAgICBsZW5ndGggPSBwcy0+bl9nbG9iYWxfc3ltczsKKyAgICAgIHdoaWxlIChsZW5ndGgtLSkKKwl7CisJICBzeW0gPSBsb29rdXBfYmxvY2tfc3ltYm9sIChiLCBTWU1CT0xfTkFNRSAoKnBzeW0pLAorCQkJCSAgICAgU1lNQk9MX05BTUVTUEFDRSAoKnBzeW0pKTsKKwkgIGlmICghc3ltKQorCSAgICB7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiR2xvYmFsIHN5bWJvbCBgIik7CisJICAgICAgcHV0c19maWx0ZXJlZCAoU1lNQk9MX05BTUUgKCpwc3ltKSk7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiJyBvbmx5IGZvdW5kIGluICIpOworCSAgICAgIHB1dHNfZmlsdGVyZWQgKHBzLT5maWxlbmFtZSk7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiIHBzeW10YWJcbiIpOworCSAgICB9CisJICBwc3ltKys7CisJfQorICAgICAgaWYgKHBzLT50ZXh0aGlnaCA8IHBzLT50ZXh0bG93KQorCXsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlBzeW10YWIgIik7CisJICBwdXRzX2ZpbHRlcmVkIChwcy0+ZmlsZW5hbWUpOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiIGNvdmVycyBiYWQgcmFuZ2UgIik7CisgICAgICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChwcy0+dGV4dGxvdywgMSwgZ2RiX3N0ZG91dCk7CisJICBwcmludGZfZmlsdGVyZWQgKCIgLSAiKTsKKyAgICAgICAgICBwcmludF9hZGRyZXNzX251bWVyaWMgKHBzLT50ZXh0aGlnaCwgMSwgZ2RiX3N0ZG91dCk7CisJICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworCSAgY29udGludWU7CisJfQorICAgICAgaWYgKHBzLT50ZXh0aGlnaCA9PSAwKQorCWNvbnRpbnVlOworICAgICAgaWYgKHBzLT50ZXh0bG93IDwgQkxPQ0tfU1RBUlQgKGIpIHx8IHBzLT50ZXh0aGlnaCA+IEJMT0NLX0VORCAoYikpCisJeworCSAgcHJpbnRmX2ZpbHRlcmVkICgiUHN5bXRhYiAiKTsKKwkgIHB1dHNfZmlsdGVyZWQgKHBzLT5maWxlbmFtZSk7CisJICBwcmludGZfZmlsdGVyZWQgKCIgY292ZXJzICIpOworICAgICAgICAgIHByaW50X2FkZHJlc3NfbnVtZXJpYyAocHMtPnRleHRsb3csIDEsIGdkYl9zdGRvdXQpOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiIC0gIik7CisgICAgICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChwcy0+dGV4dGhpZ2gsIDEsIGdkYl9zdGRvdXQpOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiIGJ1dCBzeW10YWIgY292ZXJzIG9ubHkgIik7CisgICAgICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChCTE9DS19TVEFSVCAoYiksIDEsIGdkYl9zdGRvdXQpOworCSAgcHJpbnRmX2ZpbHRlcmVkICgiIC0gIik7CisgICAgICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChCTE9DS19FTkQgKGIpLCAxLCBnZGJfc3Rkb3V0KTsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisJfQorICAgIH0KK30KKworDAorLyogUmV0dXJuIHRoZSBuZXh0aW5nIGRlcHRoIG9mIGEgYmxvY2sgd2l0aGluIG90aGVyIGJsb2NrcyBpbiBpdHMgc3ltdGFiLiAgKi8KKworc3RhdGljIGludAorYmxvY2tfZGVwdGggKGJsb2NrKQorICAgICBzdHJ1Y3QgYmxvY2sgKmJsb2NrOworeworICByZWdpc3RlciBpbnQgaSA9IDA7CisgIHdoaWxlICgoYmxvY2sgPSBCTE9DS19TVVBFUkJMT0NLIChibG9jaykpICE9IE5VTEwpIAorICAgIHsKKyAgICAgIGkrKzsKKyAgICB9CisgIHJldHVybiBpOworfQorCisjZW5kaWYJLyogTUFJTlRFTkFOQ0VfQ01EUyAqLworCisMCisvKiBJbmNyZWFzZSB0aGUgc3BhY2UgYWxsb2NhdGVkIGZvciBMSVNUUCwgd2hpY2ggaXMgcHJvYmFibHkKKyAgIGdsb2JhbF9wc3ltYm9scyBvciBzdGF0aWNfcHN5bWJvbHMuIFRoaXMgc3BhY2Ugd2lsbCBldmVudHVhbGx5CisgICBiZSBmcmVlZCBpbiBmcmVlX29iamZpbGUoKS4gICovCisKK3ZvaWQKK2V4dGVuZF9wc3ltYm9sX2xpc3QgKGxpc3RwLCBvYmpmaWxlKQorICAgICByZWdpc3RlciBzdHJ1Y3QgcHN5bWJvbF9hbGxvY2F0aW9uX2xpc3QgKmxpc3RwOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaW50IG5ld19zaXplOworICBpZiAobGlzdHAtPnNpemUgPT0gMCkKKyAgICB7CisgICAgICBuZXdfc2l6ZSA9IDI1NTsKKyAgICAgIGxpc3RwLT5saXN0ID0gKHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKikKKwl4bW1hbGxvYyAob2JqZmlsZSAtPiBtZCwgbmV3X3NpemUgKiBzaXplb2YgKHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbmV3X3NpemUgPSBsaXN0cC0+c2l6ZSAqIDI7CisgICAgICBsaXN0cC0+bGlzdCA9IChzdHJ1Y3QgcGFydGlhbF9zeW1ib2wgKiopCisJeG1yZWFsbG9jIChvYmpmaWxlIC0+IG1kLCAoY2hhciAqKSBsaXN0cC0+bGlzdCwKKwkJICAgbmV3X3NpemUgKiBzaXplb2YgKHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKSk7CisgICAgfQorICAvKiBOZXh0IGFzc3VtZXMgd2Ugb25seSB3ZW50IG9uZSBvdmVyLiAgU2hvdWxkIGJlIGdvb2QgaWYKKyAgICAgcHJvZ3JhbSB3b3JrcyBjb3JyZWN0bHkgKi8KKyAgbGlzdHAtPm5leHQgPSBsaXN0cC0+bGlzdCArIGxpc3RwLT5zaXplOworICBsaXN0cC0+c2l6ZSA9IG5ld19zaXplOworfQorCisKKy8qIERvIGVhcmx5IHJ1bnRpbWUgaW5pdGlhbGl6YXRpb25zLiAqLwordm9pZAorX2luaXRpYWxpemVfc3ltbWlzYyAoKQoreworICBzdGRfaW4gID0gc3RkaW47CisgIHN0ZF9vdXQgPSBzdGRvdXQ7CisgIHN0ZF9lcnIgPSBzdGRlcnI7Cit9CmRpZmYgLS1naXQgYS9nZGIvc3ltdGFiLmMgYi9nZGIvc3ltdGFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzYzhmNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9zeW10YWIuYwpAQCAtMCwwICsxLDQ1MTggQEAKKy8qIFN5bWJvbCB0YWJsZSBsb29rdXAgZm9yIHRoZSBHTlUgZGVidWdnZXIsIEdEQi4KKyAgIENvcHlyaWdodCAxOTg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKKyAgICAgICAgICAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJjYWxsLWNtZHMuaCIKKyNpbmNsdWRlICJnbnUtcmVnZXguaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJkZW1hbmdsZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisKKyNpbmNsdWRlICJvYnN0YWNrLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKyNpbmNsdWRlICJnZGJfc3RhdC5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKy8qIFByb3RvdHlwZSBmb3Igb25lIGZ1bmN0aW9uIGluIHBhcnNlci1kZWZzLmgsCisgICBpbnN0ZWFkIG9mIGluY2x1ZGluZyB0aGF0IGVudGlyZSBmaWxlLiAqLworCitleHRlcm4gY2hhciAqIGZpbmRfdGVtcGxhdGVfbmFtZV9lbmQgUEFSQU1TICgoY2hhciAqKSk7CisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IGZpbmRfbWV0aG9kcyBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBjaGFyICosIHN0cnVjdCBzeW1ib2wgKiopKTsKKworc3RhdGljIHZvaWQgY29tcGxldGlvbl9saXN0X2FkZF9uYW1lIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqLCBpbnQsIGNoYXIgKiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKSk7CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2Nhbm9uaWNhbF9saW5lX3NwZWMgUEFSQU1TICgoc3RydWN0IHN5bXRhYl9hbmRfbGluZSAqLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqLCBjaGFyICoqKikpOworCitzdGF0aWMgc3RydWN0IHN5bXRhYnNfYW5kX2xpbmVzIGRlY29kZV9saW5lXzIgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqW10sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgaW50LCBjaGFyICoqKikpOworCitzdGF0aWMgdm9pZCByYnJlYWtfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCB0eXBlc19pbmZvIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGZ1bmN0aW9uc19pbmZvIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHZhcmlhYmxlc19pbmZvIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHNvdXJjZXNfaW5mbyBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBvdXRwdXRfc291cmNlX2ZpbGVuYW1lIFBBUkFNUyAoKGNoYXIgKiwgaW50ICopKTsKKworY2hhciAqb3BlcmF0b3JfY2hhcnMgUEFSQU1TICgoY2hhciAqLCBjaGFyICoqKSk7CisKK3N0YXRpYyBpbnQgZmluZF9saW5lX2NvbW1vbiBQQVJBTVMgKChzdHJ1Y3QgbGluZXRhYmxlICosIGludCwgaW50ICopKTsKKworc3RhdGljIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqbG9va3VwX3BhcnRpYWxfc3ltYm9sIFBBUkFNUyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqLCBjb25zdCBjaGFyICosCisJCQkgICAgICAgICAgICBpbnQsIG5hbWVzcGFjZV9lbnVtKSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGFydGlhbF9zeW1ib2wgKmZpeHVwX3BzeW1ib2xfc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbF9zeW1ib2wgKiwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgc3RydWN0IHN5bXRhYiAqbG9va3VwX3N5bXRhYl8xIFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgdm9pZCBjcGx1c3BsdXNfaGludCBQQVJBTVMgKChjaGFyICopKTsKKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKmZpbmRfYWN0aXZlX2FsaWFzIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKnN5bSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SRV9BRERSIGFkZHIpKTsKKworLyogVGhpcyBmbGFnIGlzIHVzZWQgaW4gaHBwYS10ZGVwLmMsIGFuZCBzZXQgaW4gaHAtc3ltdGFiLXJlYWQuYyAqLworLyogU2lnbmFscyB0aGUgcHJlc2VuY2Ugb2Ygb2JqZWN0cyBjb21waWxlZCBieSBIUCBjb21waWxlcnMgKi8KK2ludCBocF9zb21fc29tX29iamVjdF9wcmVzZW50ID0gMDsKKworc3RhdGljIHZvaWQgZml4dXBfc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZ2VuZXJhbF9zeW1ib2xfaW5mbyAqLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgaW50IGZpbGVfbWF0Y2hlcyBQQVJBTVMgKChjaGFyICosIGNoYXIgKiosIGludCkpOworCitzdGF0aWMgdm9pZCBwcmludF9zeW1ib2xfaW5mbyBQQVJBTVMgKChuYW1lc3BhY2VfZW51bSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltdGFiICosIHN0cnVjdCBzeW1ib2wgKiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIGNoYXIgKikpOworCitzdGF0aWMgdm9pZCBwcmludF9tc3ltYm9sX2luZm8gUEFSQU1TICgoc3RydWN0IG1pbmltYWxfc3ltYm9sICopKTsKKworc3RhdGljIHZvaWQgc3ltdGFiX3N5bWJvbF9pbmZvIFBBUkFNUyAoKGNoYXIgKiwgbmFtZXNwYWNlX2VudW0sIGludCkpOworCit2b2lkIF9pbml0aWFsaXplX3N5bXRhYiBQQVJBTVMgKCh2b2lkKSk7CisKKy8qICovCisKKy8qIFRoZSBzaW5nbGUgbm9uLWxhbmd1YWdlLXNwZWNpZmljIGJ1aWx0aW4gdHlwZSAqLworc3RydWN0IHR5cGUgKmJ1aWx0aW5fdHlwZV9lcnJvcjsKKworLyogQmxvY2sgaW4gd2hpY2ggdGhlIG1vc3QgcmVjZW50bHkgc2VhcmNoZWQtZm9yIHN5bWJvbCB3YXMgZm91bmQuCisgICBNaWdodCBiZSBiZXR0ZXIgdG8gbWFrZSB0aGlzIGEgcGFyYW1ldGVyIHRvIGxvb2t1cF9zeW1ib2wgYW5kIAorICAgdmFsdWVfb2ZfdGhpcy4gKi8KKworY29uc3Qgc3RydWN0IGJsb2NrICpibG9ja19mb3VuZDsKKworY2hhciBub19zeW10YWJfbXNnW10gPSAiTm8gc3ltYm9sIHRhYmxlIGlzIGxvYWRlZC4gIFVzZSB0aGUgXCJmaWxlXCIgY29tbWFuZC4iOworCisvKiBXaGlsZSB0aGUgQysrIHN1cHBvcnQgaXMgc3RpbGwgaW4gZmx1eCwgaXNzdWUgYSBwb3NzaWJseSBoZWxwZnVsIGhpbnQgb24KKyAgIHVzaW5nIHRoZSBuZXcgY29tbWFuZCBjb21wbGV0aW9uIGZlYXR1cmUgb24gc2luZ2xlIHF1b3RlZCBkZW1hbmdsZWQgQysrCisgICBzeW1ib2xzLiAgUmVtb3ZlIHdoZW4gbG9vc2UgZW5kcyBhcmUgY2xlYW5lZCB1cC4gICBGSVhNRSAtZm5mICovCisKK3N0YXRpYyB2b2lkCitjcGx1c3BsdXNfaGludCAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgd2hpbGUgKCpuYW1lID09ICdcJycpCisgICAgbmFtZSsrOworICBwcmludGZfZmlsdGVyZWQgKCJIaW50OiB0cnkgJyVzPFRBQj4gb3IgJyVzPEVTQy0/PlxuIiwgbmFtZSwgbmFtZSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIihOb3RlIGxlYWRpbmcgc2luZ2xlIHF1b3RlLilcbiIpOworfQorCisvKiBDaGVjayBmb3IgYSBzeW10YWIgb2YgYSBzcGVjaWZpYyBuYW1lOyBmaXJzdCBpbiBzeW10YWJzLCB0aGVuIGluCisgICBwc3ltdGFicy4gICpJZiogdGhlcmUgaXMgbm8gJy8nIGluIHRoZSBuYW1lLCBhIG1hdGNoIGFmdGVyIGEgJy8nCisgICBpbiB0aGUgc3ltdGFiIGZpbGVuYW1lIHdpbGwgYWxzbyB3b3JrLiAgKi8KKworc3RhdGljIHN0cnVjdCBzeW10YWIgKgorbG9va3VwX3N5bXRhYl8xIChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICByZWdpc3RlciBzdHJ1Y3Qgc3ltdGFiICpzOworICByZWdpc3RlciBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzOworICByZWdpc3RlciBjaGFyICpzbGFzaDsKKyAgcmVnaXN0ZXIgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisKKyBnb3Rfc3ltdGFiOgorCisgIC8qIEZpcnN0LCBzZWFyY2ggZm9yIGFuIGV4YWN0IG1hdGNoICovCisKKyAgQUxMX1NZTVRBQlMgKG9iamZpbGUsIHMpCisgICAgaWYgKFNUUkVRIChuYW1lLCBzLT5maWxlbmFtZSkpCisgICAgICByZXR1cm4gczsKKworICBzbGFzaCA9IHN0cmNociAobmFtZSwgJy8nKTsKKworICAvKiBOb3csIHNlYXJjaCBmb3IgYSBtYXRjaGluZyB0YWlsIChvbmx5IGlmIG5hbWUgZG9lc24ndCBoYXZlIGFueSBkaXJzKSAqLworCisgIGlmICghc2xhc2gpCisgICAgQUxMX1NZTVRBQlMgKG9iamZpbGUsIHMpCisgICAgICB7CisJY2hhciAqcCA9IHMgLT4gZmlsZW5hbWU7CisJY2hhciAqdGFpbCA9IHN0cnJjaHIgKHAsICcvJyk7CisKKwlpZiAodGFpbCkKKwkgIHAgPSB0YWlsICsgMTsKKworCWlmIChTVFJFUSAocCwgbmFtZSkpCisJICByZXR1cm4gczsKKyAgICAgIH0KKworICAvKiBTYW1lIHNlYXJjaCBydWxlcyBhcyBhYm92ZSBhcHBseSBoZXJlLCBidXQgbm93IHdlIGxvb2sgdGhydSB0aGUKKyAgICAgcHN5bXRhYnMuICAqLworCisgIHBzID0gbG9va3VwX3BhcnRpYWxfc3ltdGFiIChuYW1lKTsKKyAgaWYgKCFwcykKKyAgICByZXR1cm4gKE5VTEwpOworCisgIGlmIChwcyAtPiByZWFkaW4pCisgICAgZXJyb3IgKCJJbnRlcm5hbDogcmVhZGluICVzIHBzdCBmb3IgYCVzJyBmb3VuZCB3aGVuIG5vIHN5bXRhYiBmb3VuZC4iLAorCSAgIHBzIC0+IGZpbGVuYW1lLCBuYW1lKTsKKworICBzID0gUFNZTVRBQl9UT19TWU1UQUIgKHBzKTsKKworICBpZiAocykKKyAgICByZXR1cm4gczsKKworICAvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGxvY2F0ZWQgdGhlIHBzeW10YWIgZm9yIHRoaXMgZmlsZSwgYnV0CisgICAgIHRoZSBjb252ZXJzaW9uIHRvIGEgc3ltdGFiIGhhcyBmYWlsZWQuICBUaGlzIHVzdWFsbHkgaGFwcGVucworICAgICB3aGVuIHdlIGFyZSBsb29raW5nIHVwIGFuIGluY2x1ZGUgZmlsZS4gIEluIHRoaXMgY2FzZSwKKyAgICAgUFNZTVRBQl9UT19TWU1UQUIgZG9lc24ndCByZXR1cm4gYSBzeW10YWIsIGV2ZW4gdGhvdWdoIG9uZSBoYXMKKyAgICAgYmVlbiBjcmVhdGVkLiAgU28sIHdlIG5lZWQgdG8gcnVuIHRocm91Z2ggdGhlIHN5bXRhYnMgYWdhaW4gaW4KKyAgICAgb3JkZXIgdG8gZmluZCB0aGUgZmlsZS4KKyAgICAgWFhYIC0gVGhpcyBpcyBhIGNyb2NrLCBhbmQgc2hvdWxkIGJlIGZpeGVkIGluc2lkZSBvZiB0aGUgdGhlCisgICAgIHN5bWJvbCBwYXJzaW5nIHJvdXRpbmVzLiAqLworICBnb3RvIGdvdF9zeW10YWI7Cit9CisKKy8qIExvb2t1cCB0aGUgc3ltYm9sIHRhYmxlIG9mIGEgc291cmNlIGZpbGUgbmFtZWQgTkFNRS4gIFRyeSBhIGNvdXBsZQorICAgb2YgdmFyaWF0aW9ucyBpZiB0aGUgZmlyc3QgbG9va3VwIGRvZXNuJ3Qgd29yay4gICovCisKK3N0cnVjdCBzeW10YWIgKgorbG9va3VwX3N5bXRhYiAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bXRhYiAqczsKKyNpZiAwCisgIHJlZ2lzdGVyIGNoYXIgKmNvcHk7CisjZW5kaWYKKworICBzID0gbG9va3VwX3N5bXRhYl8xIChuYW1lKTsKKyAgaWYgKHMpIHJldHVybiBzOworCisjaWYgMAorICAvKiBUaGlzIHNjcmV3cyBjLWV4cC55Onl5bGV4IGlmIHRoZXJlIGlzIGJvdGggYSB0eXBlICJ0cmVlIiBhbmQgYSBzeW10YWIKKyAgICAgInRyZWUuYyIuICAqLworCisgIC8qIElmIG5hbWUgbm90IGZvdW5kIGFzIHNwZWNpZmllZCwgc2VlIGlmIGFkZGluZyAiLmMiIGhlbHBzLiAgKi8KKyAgLyogV2h5IGlzIHRoaXM/ICBJcyBpdCBqdXN0IGEgdXNlciBjb252ZW5pZW5jZT8gIChJZiBzbywgaXQncyBwcmV0dHkKKyAgICAgcXVlc3Rpb25hYmxlIGluIHRoZSBwcmVzZW5jZSBvZiBDKyssIEZPUlRSQU4sIGV0Yy4pLiAgSXQncyBub3QgaW4KKyAgICAgdGhlIEdEQiBtYW51YWwuICAqLworCisgIGNvcHkgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAobmFtZSkgKyAzKTsKKyAgc3RyY3B5IChjb3B5LCBuYW1lKTsKKyAgc3RyY2F0IChjb3B5LCAiLmMiKTsKKyAgcyA9IGxvb2t1cF9zeW10YWJfMSAoY29weSk7CisgIGlmIChzKSByZXR1cm4gczsKKyNlbmRpZiAvKiAwICovCisKKyAgLyogV2UgZGlkbid0IGZpbmQgYW55dGhpbmc7IGRpZS4gICovCisgIHJldHVybiAwOworfQorCisvKiBMb29rdXAgdGhlIHBhcnRpYWwgc3ltYm9sIHRhYmxlIG9mIGEgc291cmNlIGZpbGUgbmFtZWQgTkFNRS4KKyAgICpJZiogdGhlcmUgaXMgbm8gJy8nIGluIHRoZSBuYW1lLCBhIG1hdGNoIGFmdGVyIGEgJy8nCisgICBpbiB0aGUgcHN5bXRhYiBmaWxlbmFtZSB3aWxsIGFsc28gd29yay4gICovCisKK3N0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqCitsb29rdXBfcGFydGlhbF9zeW10YWIgKG5hbWUpCitjaGFyICpuYW1lOworeworICByZWdpc3RlciBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdDsKKyAgcmVnaXN0ZXIgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgIAorICBBTExfUFNZTVRBQlMgKG9iamZpbGUsIHBzdCkKKyAgICB7CisgICAgICBpZiAoU1RSRVEgKG5hbWUsIHBzdCAtPiBmaWxlbmFtZSkpCisJeworCSAgcmV0dXJuIChwc3QpOworCX0KKyAgICB9CisKKyAgLyogTm93LCBzZWFyY2ggZm9yIGEgbWF0Y2hpbmcgdGFpbCAob25seSBpZiBuYW1lIGRvZXNuJ3QgaGF2ZSBhbnkgZGlycykgKi8KKworICBpZiAoIXN0cmNociAobmFtZSwgJy8nKSkKKyAgICBBTExfUFNZTVRBQlMgKG9iamZpbGUsIHBzdCkKKyAgICAgIHsKKwljaGFyICpwID0gcHN0IC0+IGZpbGVuYW1lOworCWNoYXIgKnRhaWwgPSBzdHJyY2hyIChwLCAnLycpOworCisJaWYgKHRhaWwpCisJICBwID0gdGFpbCArIDE7CisKKwlpZiAoU1RSRVEgKHAsIG5hbWUpKQorCSAgcmV0dXJuIChwc3QpOworICAgICAgfQorCisgIHJldHVybiAoTlVMTCk7Cit9CisMCisvKiBNYW5nbGUgYSBHREIgbWV0aG9kIHN0dWIgdHlwZS4gIFRoaXMgYWN0dWFsbHkgcmVhc3NlbWJsZXMgdGhlIHBpZWNlcyBvZiB0aGUKKyAgIGZ1bGwgbWV0aG9kIG5hbWUsIHdoaWNoIGNvbnNpc3Qgb2YgdGhlIGNsYXNzIG5hbWUgKGZyb20gVCksIHRoZSB1bmFkb3JuZWQKKyAgIG1ldGhvZCBuYW1lIGZyb20gTUVUSE9EX0lELCBhbmQgdGhlIHNpZ25hdHVyZSBmb3IgdGhlIHNwZWNpZmljIG92ZXJsb2FkLAorICAgc3BlY2lmaWVkIGJ5IFNJR05BVFVSRV9JRC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGcrKyBzcGVjaWZpYy4gKi8KKworY2hhciAqCitnZGJfbWFuZ2xlX25hbWUgKHR5cGUsIG1ldGhvZF9pZCwgc2lnbmF0dXJlX2lkKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgaW50IG1ldGhvZF9pZCwgc2lnbmF0dXJlX2lkOworeworICBpbnQgbWFuZ2xlZF9uYW1lX2xlbjsKKyAgY2hhciAqbWFuZ2xlZF9uYW1lOworICBzdHJ1Y3QgZm5fZmllbGQgKmYgPSBUWVBFX0ZOX0ZJRUxETElTVDEgKHR5cGUsIG1ldGhvZF9pZCk7CisgIHN0cnVjdCBmbl9maWVsZCAqbWV0aG9kID0gJmZbc2lnbmF0dXJlX2lkXTsKKyAgY2hhciAqZmllbGRfbmFtZSA9IFRZUEVfRk5fRklFTERMSVNUX05BTUUgKHR5cGUsIG1ldGhvZF9pZCk7CisgIGNoYXIgKnBoeXNuYW1lID0gVFlQRV9GTl9GSUVMRF9QSFlTTkFNRSAoZiwgc2lnbmF0dXJlX2lkKTsKKyAgY2hhciAqbmV3bmFtZSA9IHR5cGVfbmFtZV9ub190YWcgKHR5cGUpOworCisgIC8qIERvZXMgdGhlIGZvcm0gb2YgcGh5c25hbWUgaW5kaWNhdGUgdGhhdCBpdCBpcyB0aGUgZnVsbCBtYW5nbGVkIG5hbWUKKyAgICAgb2YgYSBjb25zdHJ1Y3RvciAobm90IGp1c3QgdGhlIGFyZ3MpPyAgKi8KKyAgaW50IGlzX2Z1bGxfcGh5c25hbWVfY29uc3RydWN0b3I7CisKKyAgaW50IGlzX2NvbnN0cnVjdG9yOworICBpbnQgaXNfZGVzdHJ1Y3RvciA9IERFU1RSVUNUT1JfUFJFRklYX1AgKHBoeXNuYW1lKTsKKyAgLyogTmVlZCBhIG5ldyB0eXBlIHByZWZpeC4gICovCisgIGNoYXIgKmNvbnN0X3ByZWZpeCA9IG1ldGhvZC0+aXNfY29uc3QgPyAiQyIgOiAiIjsKKyAgY2hhciAqdm9sYXRpbGVfcHJlZml4ID0gbWV0aG9kLT5pc192b2xhdGlsZSA/ICJWIiA6ICIiOworICBjaGFyIGJ1ZlsyMF07CisgIGludCBsZW4gPSAobmV3bmFtZSA9PSBOVUxMID8gMCA6IHN0cmxlbiAobmV3bmFtZSkpOworCisgIGlzX2Z1bGxfcGh5c25hbWVfY29uc3RydWN0b3IgPSAKKyAgICAoKHBoeXNuYW1lWzBdPT0nXycgJiYgcGh5c25hbWVbMV09PSdfJyAmJiAKKyAgICAgIChpc2RpZ2l0KHBoeXNuYW1lWzJdKSB8fCBwaHlzbmFtZVsyXT09J1EnIHx8IHBoeXNuYW1lWzJdPT0ndCcpKQorICAgICB8fCAoc3RybmNtcChwaHlzbmFtZSwgIl9fY3QiLCA0KSA9PSAwKSk7CisKKyAgaXNfY29uc3RydWN0b3IgPQorICAgIGlzX2Z1bGxfcGh5c25hbWVfY29uc3RydWN0b3IgfHwgKG5ld25hbWUgJiYgU1RSRVEoZmllbGRfbmFtZSwgbmV3bmFtZSkpOworCisgIGlmICghaXNfZGVzdHJ1Y3RvcikKKyAgICBpc19kZXN0cnVjdG9yID0gKHN0cm5jbXAocGh5c25hbWUsICJfX2R0IiwgNCkgPT0gMCk7IAorCisgIGlmIChpc19kZXN0cnVjdG9yIHx8IGlzX2Z1bGxfcGh5c25hbWVfY29uc3RydWN0b3IpCisgICAgeworICAgICAgbWFuZ2xlZF9uYW1lID0gKGNoYXIqKSB4bWFsbG9jKHN0cmxlbihwaHlzbmFtZSkrMSk7CisgICAgICBzdHJjcHkobWFuZ2xlZF9uYW1lLCBwaHlzbmFtZSk7CisgICAgICByZXR1cm4gbWFuZ2xlZF9uYW1lOworICAgIH0KKworICBpZiAobGVuID09IDApCisgICAgeworICAgICAgc3ByaW50ZiAoYnVmLCAiX18lcyVzIiwgY29uc3RfcHJlZml4LCB2b2xhdGlsZV9wcmVmaXgpOworICAgIH0KKyAgZWxzZSBpZiAocGh5c25hbWVbMF0gPT0gJ3QnIHx8IHBoeXNuYW1lWzBdID09ICdRJykKKyAgICB7CisgICAgICAvKiBUaGUgcGh5c25hbWUgZm9yIHRlbXBsYXRlIGFuZCBxdWFsaWZpZWQgbWV0aG9kcyBhbHJlYWR5IGluY2x1ZGVzCisJIHRoZSBjbGFzcyBuYW1lLiAgKi8KKyAgICAgIHNwcmludGYgKGJ1ZiwgIl9fJXMlcyIsIGNvbnN0X3ByZWZpeCwgdm9sYXRpbGVfcHJlZml4KTsKKyAgICAgIG5ld25hbWUgPSBOVUxMOworICAgICAgbGVuID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzcHJpbnRmIChidWYsICJfXyVzJXMlZCIsIGNvbnN0X3ByZWZpeCwgdm9sYXRpbGVfcHJlZml4LCBsZW4pOworICAgIH0KKyAgbWFuZ2xlZF9uYW1lX2xlbiA9ICgoaXNfY29uc3RydWN0b3IgPyAwIDogc3RybGVuIChmaWVsZF9uYW1lKSkKKwkJCSAgKyBzdHJsZW4gKGJ1ZikgKyBsZW4KKwkJCSAgKyBzdHJsZW4gKHBoeXNuYW1lKQorCQkJICArIDEpOworCisgIC8qIE9ubHkgbmVlZGVkIGZvciBHTlUtbWFuZ2xlZCBuYW1lcy4gIEFOU0ktbWFuZ2xlZCBuYW1lcworICAgICB3b3JrIHdpdGggdGhlIG5vcm1hbCBtZWNoYW5pc21zLiAgKi8KKyAgaWYgKE9QTkFNRV9QUkVGSVhfUCAoZmllbGRfbmFtZSkpCisgICAgeworICAgICAgY29uc3QgY2hhciAqb3BuYW1lID0gY3BsdXNfbWFuZ2xlX29wbmFtZSAoZmllbGRfbmFtZSArIDMsIDApOworICAgICAgaWYgKG9wbmFtZSA9PSBOVUxMKQorCWVycm9yICgiTm8gbWFuZ2xpbmcgZm9yIFwiJXNcIiIsIGZpZWxkX25hbWUpOworICAgICAgbWFuZ2xlZF9uYW1lX2xlbiArPSBzdHJsZW4gKG9wbmFtZSk7CisgICAgICBtYW5nbGVkX25hbWUgPSAoY2hhciAqKXhtYWxsb2MgKG1hbmdsZWRfbmFtZV9sZW4pOworCisgICAgICBzdHJuY3B5IChtYW5nbGVkX25hbWUsIGZpZWxkX25hbWUsIDMpOworICAgICAgbWFuZ2xlZF9uYW1lWzNdID0gJ1wwJzsKKyAgICAgIHN0cmNhdCAobWFuZ2xlZF9uYW1lLCBvcG5hbWUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1hbmdsZWRfbmFtZSA9IChjaGFyICopeG1hbGxvYyAobWFuZ2xlZF9uYW1lX2xlbik7CisgICAgICBpZiAoaXNfY29uc3RydWN0b3IpCisJbWFuZ2xlZF9uYW1lWzBdID0gJ1wwJzsKKyAgICAgIGVsc2UKKwlzdHJjcHkgKG1hbmdsZWRfbmFtZSwgZmllbGRfbmFtZSk7CisgICAgfQorICBzdHJjYXQgKG1hbmdsZWRfbmFtZSwgYnVmKTsKKyAgLyogSWYgdGhlIGNsYXNzIGRvZXNuJ3QgaGF2ZSBhIG5hbWUsIGkuZS4gbmV3bmFtZSBOVUxMLCB0aGVuIHdlIGp1c3QKKyAgICAgbWFuZ2xlIGl0IHVzaW5nIDAgZm9yIHRoZSBsZW5ndGggb2YgdGhlIGNsYXNzLiAgVGh1cyBpdCBnZXRzIG1hbmdsZWQKKyAgICAgYXMgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggYDo6JyByYXRoZXIgdGhhbiBgY2xhc3NuYW1lOjonLiAqLyAKKyAgaWYgKG5ld25hbWUgIT0gTlVMTCkKKyAgICBzdHJjYXQgKG1hbmdsZWRfbmFtZSwgbmV3bmFtZSk7CisKKyAgc3RyY2F0IChtYW5nbGVkX25hbWUsIHBoeXNuYW1lKTsKKyAgcmV0dXJuIChtYW5nbGVkX25hbWUpOworfQorCisMCisKKy8qIEZpbmQgd2hpY2ggcGFydGlhbCBzeW10YWIgb24gY29udGFpbnMgUEMgYW5kIFNFQ1RJT04uICBSZXR1cm4gMCBpZiBub25lLiAgKi8KKworc3RydWN0IHBhcnRpYWxfc3ltdGFiICoKK2ZpbmRfcGNfc2VjdF9wc3ltdGFiIChwYywgc2VjdGlvbikKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7CisgIHJlZ2lzdGVyIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworCisgIEFMTF9QU1lNVEFCUyAob2JqZmlsZSwgcHN0KQorICAgIHsKKyNpZiBkZWZpbmVkKEhQVVhIUFBBKQorICAgICAgaWYgKHBjID49IHBzdC0+dGV4dGxvdyAmJiBwYyA8PSBwc3QtPnRleHRoaWdoKQorI2Vsc2UKKyAgICAgIGlmIChwYyA+PSBwc3QtPnRleHRsb3cgJiYgcGMgPCBwc3QtPnRleHRoaWdoKQorI2VuZGlmCisJeworCSAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sOworCSAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICp0cHN0OworCisJICAvKiBBbiBvYmpmaWxlIHRoYXQgaGFzIGl0cyBmdW5jdGlvbnMgcmVvcmRlcmVkIG1pZ2h0IGhhdmUKKwkgICAgIG1hbnkgcGFydGlhbCBzeW1ib2wgdGFibGVzIGNvbnRhaW5pbmcgdGhlIFBDLCBidXQKKwkgICAgIHdlIHdhbnQgdGhlIHBhcnRpYWwgc3ltYm9sIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlCisJICAgICBmdW5jdGlvbiBjb250YWluaW5nIHRoZSBQQy4gICovCisJICBpZiAoIShvYmpmaWxlLT5mbGFncyAmIE9CSkZfUkVPUkRFUkVEKSAmJgorCSAgICAgIHNlY3Rpb24gPT0gMCkJLyogY2FuJ3QgdmFsaWRhdGUgc2VjdGlvbiB0aGlzIHdheSAqLworCSAgICByZXR1cm4gKHBzdCk7CisKKwkgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGNfc2VjdGlvbiAocGMsIHNlY3Rpb24pOworCSAgaWYgKG1zeW1ib2wgPT0gTlVMTCkKKwkgICAgcmV0dXJuIChwc3QpOworCisJICBmb3IgKHRwc3QgPSBwc3Q7IHRwc3QgIT0gTlVMTDsgdHBzdCA9IHRwc3QtPm5leHQpCisJICAgIHsKKyNpZiBkZWZpbmVkKEhQVVhIUFBBKQorCSAgICAgIGlmIChwYyA+PSB0cHN0LT50ZXh0bG93ICYmIHBjIDw9IHRwc3QtPnRleHRoaWdoKQorI2Vsc2UKKwkgICAgICBpZiAocGMgPj0gdHBzdC0+dGV4dGxvdyAmJiBwYyA8IHRwc3QtPnRleHRoaWdoKQorI2VuZGlmCisJCXsKKwkJICBzdHJ1Y3QgcGFydGlhbF9zeW1ib2wgKnA7CisKKwkJICBwID0gZmluZF9wY19zZWN0X3BzeW1ib2wgKHRwc3QsIHBjLCBzZWN0aW9uKTsKKwkJICBpZiAocCAhPSBOVUxMCisJCSAgICAgICYmIFNZTUJPTF9WQUxVRV9BRERSRVNTKHApCisJCQkgPT0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpKQorCQkgICAgcmV0dXJuICh0cHN0KTsKKwkJfQorCSAgICB9CisJICByZXR1cm4gKHBzdCk7CisJfQorICAgIH0KKyAgcmV0dXJuIChOVUxMKTsKK30KKworLyogRmluZCB3aGljaCBwYXJ0aWFsIHN5bXRhYiBjb250YWlucyBQQy4gIFJldHVybiAwIGlmIG5vbmUuIAorICAgQmFja3dhcmQgY29tcGF0aWJpbGl0eSwgbm8gc2VjdGlvbiAqLworCitzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKgorZmluZF9wY19wc3ltdGFiIChwYykKKyAgICAgQ09SRV9BRERSIHBjOworeworICByZXR1cm4gZmluZF9wY19zZWN0X3BzeW10YWIgKHBjLCBmaW5kX3BjX21hcHBlZF9zZWN0aW9uIChwYykpOworfQorCisvKiBGaW5kIHdoaWNoIHBhcnRpYWwgc3ltYm9sIHdpdGhpbiBhIHBzeW10YWIgbWF0Y2hlcyBQQyBhbmQgU0VDVElPTi4gIAorICAgUmV0dXJuIDAgaWYgbm9uZS4gIENoZWNrIGFsbCBwc3ltdGFicyBpZiBQU1lNVEFCIGlzIDAuICAqLworCitzdHJ1Y3QgcGFydGlhbF9zeW1ib2wgKgorZmluZF9wY19zZWN0X3BzeW1ib2wgKHBzeW10YWIsIHBjLCBzZWN0aW9uKQorICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzeW10YWI7CisgICAgIENPUkVfQUREUiBwYzsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247Cit7CisgIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqYmVzdCA9IE5VTEwsICpwLCAqKnBwOworICBDT1JFX0FERFIgYmVzdF9wYzsKKyAgCisgIGlmICghcHN5bXRhYikKKyAgICBwc3ltdGFiID0gZmluZF9wY19zZWN0X3BzeW10YWIgKHBjLCBzZWN0aW9uKTsKKyAgaWYgKCFwc3ltdGFiKQorICAgIHJldHVybiAwOworCisgIC8qIENvcGUgd2l0aCBwcm9ncmFtcyB0aGF0IHN0YXJ0IGF0IGFkZHJlc3MgMCAqLworICBiZXN0X3BjID0gKHBzeW10YWItPnRleHRsb3cgIT0gMCkgPyBwc3ltdGFiLT50ZXh0bG93IC0gMSA6IDA7CisKKyAgLyogU2VhcmNoIHRoZSBnbG9iYWwgc3ltYm9scyBhcyB3ZWxsIGFzIHRoZSBzdGF0aWMgc3ltYm9scywgc28gdGhhdAorICAgICBmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gZG9lc24ndCB1c2UgYSBtaW5pbWFsIHN5bWJvbCBhbmQgdGh1cworICAgICBjYWNoZSBhIGJhZCBlbmRhZGRyLiAgKi8KKyAgZm9yIChwcCA9IHBzeW10YWItPm9iamZpbGUtPmdsb2JhbF9wc3ltYm9scy5saXN0ICsgcHN5bXRhYi0+Z2xvYmFsc19vZmZzZXQ7CisgICAgICAgKHBwIC0gKHBzeW10YWItPm9iamZpbGUtPmdsb2JhbF9wc3ltYm9scy5saXN0ICsgcHN5bXRhYi0+Z2xvYmFsc19vZmZzZXQpCisJPCBwc3ltdGFiLT5uX2dsb2JhbF9zeW1zKTsKKyAgICAgICBwcCsrKQorICAgIHsKKyAgICAgIHAgPSAqcHA7CisgICAgICBpZiAoU1lNQk9MX05BTUVTUEFDRSAocCkgPT0gVkFSX05BTUVTUEFDRQorCSAgJiYgU1lNQk9MX0NMQVNTIChwKSA9PSBMT0NfQkxPQ0sKKwkgICYmIHBjID49IFNZTUJPTF9WQUxVRV9BRERSRVNTIChwKQorCSAgJiYgKFNZTUJPTF9WQUxVRV9BRERSRVNTIChwKSA+IGJlc3RfcGMKKwkgICAgICB8fCAocHN5bXRhYi0+dGV4dGxvdyA9PSAwCisJCSAgJiYgYmVzdF9wYyA9PSAwICYmIFNZTUJPTF9WQUxVRV9BRERSRVNTIChwKSA9PSAwKSkpCisJeworCSAgaWYgKHNlY3Rpb24pCS8qIG1hdGNoIG9uIGEgc3BlY2lmaWMgc2VjdGlvbiAqLworCSAgICB7CisJICAgICAgZml4dXBfcHN5bWJvbF9zZWN0aW9uIChwLCBwc3ltdGFiLT5vYmpmaWxlKTsKKwkgICAgICBpZiAoU1lNQk9MX0JGRF9TRUNUSU9OIChwKSAhPSBzZWN0aW9uKQorCQljb250aW51ZTsKKwkgICAgfQorCSAgYmVzdF9wYyA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChwKTsKKwkgIGJlc3QgPSBwOworCX0KKyAgICB9CisKKyAgZm9yIChwcCA9IHBzeW10YWItPm9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5saXN0ICsgcHN5bXRhYi0+c3RhdGljc19vZmZzZXQ7CisgICAgICAgKHBwIC0gKHBzeW10YWItPm9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5saXN0ICsgcHN5bXRhYi0+c3RhdGljc19vZmZzZXQpCisJPCBwc3ltdGFiLT5uX3N0YXRpY19zeW1zKTsKKyAgICAgICBwcCsrKQorICAgIHsKKyAgICAgIHAgPSAqcHA7CisgICAgICBpZiAoU1lNQk9MX05BTUVTUEFDRSAocCkgPT0gVkFSX05BTUVTUEFDRQorCSAgJiYgU1lNQk9MX0NMQVNTIChwKSA9PSBMT0NfQkxPQ0sKKwkgICYmIHBjID49IFNZTUJPTF9WQUxVRV9BRERSRVNTIChwKQorCSAgJiYgKFNZTUJPTF9WQUxVRV9BRERSRVNTIChwKSA+IGJlc3RfcGMKKwkgICAgICB8fCAocHN5bXRhYi0+dGV4dGxvdyA9PSAwIAorCQkgICYmIGJlc3RfcGMgPT0gMCAmJiBTWU1CT0xfVkFMVUVfQUREUkVTUyAocCkgPT0gMCkpKQorCXsKKwkgIGlmIChzZWN0aW9uKQkvKiBtYXRjaCBvbiBhIHNwZWNpZmljIHNlY3Rpb24gKi8KKwkgICAgeworCSAgICAgIGZpeHVwX3BzeW1ib2xfc2VjdGlvbiAocCwgcHN5bXRhYi0+b2JqZmlsZSk7CisJICAgICAgaWYgKFNZTUJPTF9CRkRfU0VDVElPTiAocCkgIT0gc2VjdGlvbikKKwkJY29udGludWU7CisJICAgIH0KKwkgIGJlc3RfcGMgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAocCk7CisJICBiZXN0ID0gcDsKKwl9CisgICAgfQorCisgIHJldHVybiBiZXN0OworfQorCisvKiBGaW5kIHdoaWNoIHBhcnRpYWwgc3ltYm9sIHdpdGhpbiBhIHBzeW10YWIgbWF0Y2hlcyBQQy4gIFJldHVybiAwIGlmIG5vbmUuICAKKyAgIENoZWNrIGFsbCBwc3ltdGFicyBpZiBQU1lNVEFCIGlzIDAuICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgbm8gc2VjdGlvbi4gKi8KKworc3RydWN0IHBhcnRpYWxfc3ltYm9sICoKK2ZpbmRfcGNfcHN5bWJvbCAocHN5bXRhYiwgcGMpCisgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN5bXRhYjsKKyAgICAgQ09SRV9BRERSIHBjOworeworICByZXR1cm4gZmluZF9wY19zZWN0X3BzeW1ib2wgKHBzeW10YWIsIHBjLCBmaW5kX3BjX21hcHBlZF9zZWN0aW9uIChwYykpOworfQorDAorLyogRGVidWcgc3ltYm9scyB1c3VhbGx5IGRvbid0IGhhdmUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gIFdlIG5lZWQgdG8gZGlnIHRoYXQKKyAgIG91dCBvZiB0aGUgbWluaW1hbCBzeW1ib2xzIGFuZCBzdGFzaCB0aGF0IGluIHRoZSBkZWJ1ZyBzeW1ib2wuICAqLworCitzdGF0aWMgdm9pZAorZml4dXBfc2VjdGlvbiAoZ2luZm8sIG9iamZpbGUpCisgICAgIHN0cnVjdCBnZW5lcmFsX3N5bWJvbF9pbmZvICpnaW5mbzsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bTsKKyAgbXN5bSA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoZ2luZm8tPm5hbWUsIE5VTEwsIG9iamZpbGUpOworCisgIGlmIChtc3ltKQorICAgIGdpbmZvLT5iZmRfc2VjdGlvbiA9IFNZTUJPTF9CRkRfU0VDVElPTiAobXN5bSk7Cit9CisKK3N0cnVjdCBzeW1ib2wgKgorZml4dXBfc3ltYm9sX3NlY3Rpb24gKHN5bSwgb2JqZmlsZSkKKyAgICAgc3RydWN0IHN5bWJvbCAqc3ltOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaWYgKCFzeW0pCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKFNZTUJPTF9CRkRfU0VDVElPTiAoc3ltKSkKKyAgICByZXR1cm4gc3ltOworCisgIGZpeHVwX3NlY3Rpb24gKCZzeW0tPmdpbmZvLCBvYmpmaWxlKTsKKworICByZXR1cm4gc3ltOworfQorCitzdGF0aWMgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoKK2ZpeHVwX3BzeW1ib2xfc2VjdGlvbiAocHN5bSwgb2JqZmlsZSkKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltYm9sICpwc3ltOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaWYgKCFwc3ltKQorICAgIHJldHVybiBOVUxMOworCisgIGlmIChTWU1CT0xfQkZEX1NFQ1RJT04gKHBzeW0pKQorICAgIHJldHVybiBwc3ltOworCisgIGZpeHVwX3NlY3Rpb24gKCZwc3ltLT5naW5mbywgb2JqZmlsZSk7CisKKyAgcmV0dXJuIHBzeW07Cit9CisKKy8qIEZpbmQgdGhlIGRlZmluaXRpb24gZm9yIGEgc3BlY2lmaWVkIHN5bWJvbCBuYW1lIE5BTUUKKyAgIGluIG5hbWVzcGFjZSBOQU1FU1BBQ0UsIHZpc2libGUgZnJvbSBsZXhpY2FsIGJsb2NrIEJMT0NLLgorICAgUmV0dXJucyB0aGUgc3RydWN0IHN5bWJvbCBwb2ludGVyLCBvciB6ZXJvIGlmIG5vIHN5bWJvbCBpcyBmb3VuZC4KKyAgIElmIFNZTVRBQiBpcyBub24tTlVMTCwgc3RvcmUgdGhlIHN5bWJvbCB0YWJsZSBpbiB3aGljaCB0aGUKKyAgIHN5bWJvbCB3YXMgZm91bmQgdGhlcmUsIG9yIE5VTEwgaWYgbm90IGZvdW5kLgorICAgQysrOiBpZiBJU19BX0ZJRUxEX09GX1RISVMgaXMgbm9uemVybyBvbiBlbnRyeSwgY2hlY2sgdG8gc2VlIGlmCisgICBOQU1FIGlzIGEgZmllbGQgb2YgdGhlIGN1cnJlbnQgaW1wbGllZCBhcmd1bWVudCBgdGhpcycuICBJZiBzbyBzZXQKKyAgICpJU19BX0ZJRUxEX09GX1RISVMgdG8gMSwgb3RoZXJ3aXNlIHNldCBpdCB0byB6ZXJvLiAKKyAgIEJMT0NLX0ZPVU5EIGlzIHNldCB0byB0aGUgYmxvY2sgaW4gd2hpY2ggTkFNRSBpcyBmb3VuZCAoaW4gdGhlIGNhc2Ugb2YKKyAgIGEgZmllbGQgb2YgYHRoaXMnLCB2YWx1ZV9vZl90aGlzIHNldHMgQkxPQ0tfRk9VTkQgdG8gdGhlIHByb3BlciB2YWx1ZS4pICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaGFzIGEgYnVuY2ggb2YgbG9vcHMgaW4gaXQgYW5kIGl0IHdvdWxkIHNlZW0gdG8gYmUKKyAgIGF0dHJhY3RpdmUgdG8gcHV0IGluIHNvbWUgUVVJVCdzICh0aG91Z2ggSSdtIG5vdCByZWFsbHkgc3VyZQorICAgd2hldGhlciBpdCBjYW4gcnVuIGxvbmcgZW5vdWdoIHRvIGJlIHJlYWxseSBpbXBvcnRhbnQpLiAgQnV0IHRoZXJlCisgICBhcmUgYSBmZXcgY2FsbHMgZm9yIHdoaWNoIGl0IHdvdWxkIGFwcGVhciB0byBiZSBiYWQgbmV3cyB0byBxdWl0CisgICBvdXQgb2YgaGVyZTogZmluZF9wcm9jX2Rlc2MgaW4gYWxwaGEtdGRlcC5jIGFuZCBtaXBzLXRkZXAuYywgYW5kCisgICBuaW5keV9mcmFtZV9jaGFpbl92YWxpZCBpbiBuaW5keS10ZGVwLmMuICAoTm90ZSB0aGF0IHRoZXJlIGlzIEMrKworICAgY29kZSBiZWxvdyB3aGljaCBjYW4gZXJyb3IoKSwgYnV0IHRoYXQgcHJvYmFibHkgZG9lc24ndCBhZmZlY3QKKyAgIHRoZXNlIGNhbGxzIHNpbmNlIHRoZXkgYXJlIGxvb2tpbmcgZm9yIGEga25vd24gdmFyaWFibGUgYW5kIHRodXMKKyAgIGNhbiBwcm9iYWJseSBhc3N1bWUgaXQgd2lsbCBuZXZlciBoaXQgdGhlIEMrKyBjb2RlKS4gICovCisKK3N0cnVjdCBzeW1ib2wgKgorbG9va3VwX3N5bWJvbCAobmFtZSwgYmxvY2ssIG5hbWVzcGFjZSwgaXNfYV9maWVsZF9vZl90aGlzLCBzeW10YWIpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBibG9jayAqYmxvY2s7CisgICAgIGNvbnN0IG5hbWVzcGFjZV9lbnVtIG5hbWVzcGFjZTsKKyAgICAgaW50ICppc19hX2ZpZWxkX29mX3RoaXM7CisgICAgIHN0cnVjdCBzeW10YWIgKipzeW10YWI7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bXRhYiAqcyA9IE5VTEw7CisgIHJlZ2lzdGVyIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHM7CisgIHN0cnVjdCBibG9ja3ZlY3RvciAqYnY7CisgIHJlZ2lzdGVyIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlID0gTlVMTDsKKyAgcmVnaXN0ZXIgc3RydWN0IGJsb2NrICpiOworICByZWdpc3RlciBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisKKyAgLyogU2VhcmNoIHNwZWNpZmllZCBibG9jayBhbmQgaXRzIHN1cGVyaW9ycy4gICovCisKKyAgd2hpbGUgKGJsb2NrICE9IDApCisgICAgeworICAgICAgc3ltID0gbG9va3VwX2Jsb2NrX3N5bWJvbCAoYmxvY2ssIG5hbWUsIG5hbWVzcGFjZSk7CisgICAgICBpZiAoc3ltKSAKKwl7CisJICBibG9ja19mb3VuZCA9IGJsb2NrOworCSAgaWYgKHN5bXRhYiAhPSBOVUxMKQorCSAgICB7CisJICAgICAgLyogU2VhcmNoIHRoZSBsaXN0IG9mIHN5bXRhYnMgZm9yIG9uZSB3aGljaCBjb250YWlucyB0aGUKKwkJIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoaXMgYmxvY2suICAqLworCSAgICAgIEFMTF9TWU1UQUJTIChvYmpmaWxlLCBzKQorCQl7CisJCSAgYnYgPSBCTE9DS1ZFQ1RPUiAocyk7CisJCSAgYiA9IEJMT0NLVkVDVE9SX0JMT0NLIChidiwgR0xPQkFMX0JMT0NLKTsKKwkJICBpZiAoQkxPQ0tfU1RBUlQgKGIpIDw9IEJMT0NLX1NUQVJUIChibG9jaykKKwkJICAgICAgJiYgQkxPQ0tfRU5EIChiKSA+IEJMT0NLX1NUQVJUIChibG9jaykpCisJCSAgICBnb3RvIGZvdW5kOworCQl9Citmb3VuZDoKKwkgICAgICAqc3ltdGFiID0gczsKKwkgICAgfQorCisJICByZXR1cm4gZml4dXBfc3ltYm9sX3NlY3Rpb24gKHN5bSwgb2JqZmlsZSk7CisJfQorICAgICAgYmxvY2sgPSBCTE9DS19TVVBFUkJMT0NLIChibG9jayk7CisgICAgfQorCisgIC8qIEZJWE1FOiB0aGlzIGNvZGUgaXMgbmV2ZXIgZXhlY3V0ZWQtLWJsb2NrIGlzIGFsd2F5cyBOVUxMIGF0IHRoaXMKKyAgICAgcG9pbnQuICBXaGF0IGlzIGl0IHRyeWluZyB0byBkbywgYW55d2F5PyAgV2UgYWxyZWFkeSBzaG91bGQgaGF2ZQorICAgICBjaGVja2VkIHRoZSBTVEFUSUNfQkxPQ0sgYWJvdmUgKGl0IGlzIHRoZSBzdXBlcmJsb2NrIG9mIHRvcC1sZXZlbAorICAgICBibG9ja3MpLiAgV2h5IGlzIFZBUl9OQU1FU1BBQ0Ugc3BlY2lhbC1jYXNlZD8gICovCisgIC8qIERvbid0IG5lZWQgdG8gbWVzcyB3aXRoIHRoZSBwc3ltdGFiczsgaWYgd2UgaGF2ZSBhIGJsb2NrLAorICAgICB0aGF0IGZpbGUgaXMgcmVhZCBpbi4gIElmIHdlIGRvbid0LCB0aGVuIHdlIGRlYWwgbGF0ZXIgd2l0aAorICAgICBhbGwgdGhlIHBzeW10YWIgc3R1ZmYgdGhhdCBuZWVkcyBjaGVja2luZy4gICovCisgIC8qIE5vdGUgKFJUKTogVGhlIGZvbGxvd2luZyBuZXZlci1leGVjdXRlZCBjb2RlIGxvb2tzIHVubmVjZXNzYXJ5IHRvIG1lIGFsc28uCisgICAqIElmIHdlIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG9yaWdpbmFsIChwYXNzZWQtaW4pCisgICAqIHZhbHVlIG9mICdibG9jaycsIHdlIGNvdWxkIGNhdXNlIGl0IHRvIGV4ZWN1dGUsIGJ1dCB0aGVuIHdoYXQKKyAgICogd291bGQgaXQgZG8/IFRoZSBTVEFUSUNfQkxPQ0sgb2YgdGhlIHN5bXRhYiBjb250YWluaW5nIHRoZSBwYXNzZWQtaW4KKyAgICogJ2Jsb2NrJyB3YXMgYWxyZWFkeSBzZWFyY2hlZCBieSB0aGUgYWJvdmUgY29kZS4gQW5kIHRoZSBTVEFUSUNfQkxPQ0sncworICAgKiBvZiAqb3RoZXIqIHN5bXRhYnMgKHRob3NlIGZpbGVzIG5vdCBjb250YWluaW5nICdibG9jaycgbGV4aWNhbGx5KQorICAgKiBzaG91bGQgbm90IGNvbnRhaW4gJ2Jsb2NrJyBhZGRyZXNzLXdpc2UuIFNvIHdlIHdvdWxkbid0IGV4cGVjdCB0aGlzCisgICAqIGNvZGUgdG8gZmluZCBhbnkgJ3N5bScncyB0aGF0IHdlcmUgbm90IGZvdW5kIGFib3ZlLiBJIHZvdGUgZm9yIAorICAgKiBkZWxldGluZyB0aGUgZm9sbG93aW5nIHBhcmFncmFwaCBvZiBjb2RlLgorICAgKi8KKyAgaWYgKG5hbWVzcGFjZSA9PSBWQVJfTkFNRVNQQUNFICYmIGJsb2NrICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IGJsb2NrICpiOworICAgICAgLyogRmluZCB0aGUgcmlnaHQgc3ltdGFiLiAgKi8KKyAgICAgIEFMTF9TWU1UQUJTIChvYmpmaWxlLCBzKQorCXsKKwkgIGJ2ID0gQkxPQ0tWRUNUT1IgKHMpOworCSAgYiA9IEJMT0NLVkVDVE9SX0JMT0NLIChidiwgU1RBVElDX0JMT0NLKTsKKwkgIGlmIChCTE9DS19TVEFSVCAoYikgPD0gQkxPQ0tfU1RBUlQgKGJsb2NrKQorCSAgICAgICYmIEJMT0NLX0VORCAoYikgPiBCTE9DS19TVEFSVCAoYmxvY2spKQorCSAgICB7CisJICAgICAgc3ltID0gbG9va3VwX2Jsb2NrX3N5bWJvbCAoYiwgbmFtZSwgVkFSX05BTUVTUEFDRSk7CisJICAgICAgaWYgKHN5bSkKKwkJeworCQkgIGJsb2NrX2ZvdW5kID0gYjsKKwkJICBpZiAoc3ltdGFiICE9IE5VTEwpCisJCSAgICAqc3ltdGFiID0gczsKKwkJICByZXR1cm4gZml4dXBfc3ltYm9sX3NlY3Rpb24gKHN5bSwgb2JqZmlsZSk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKworICAvKiBDKys6IElmIHJlcXVlc3RlZCB0byBkbyBzbyBieSB0aGUgY2FsbGVyLCAKKyAgICAgY2hlY2sgdG8gc2VlIGlmIE5BTUUgaXMgYSBmaWVsZCBvZiBgdGhpcycuICovCisgIGlmIChpc19hX2ZpZWxkX29mX3RoaXMpCisgICAgeworICAgICAgc3RydWN0IHZhbHVlICp2ID0gdmFsdWVfb2ZfdGhpcyAoMCk7CisgICAgICAKKyAgICAgICppc19hX2ZpZWxkX29mX3RoaXMgPSAwOworICAgICAgaWYgKHYgJiYgY2hlY2tfZmllbGQgKHYsIG5hbWUpKQorCXsKKwkgICppc19hX2ZpZWxkX29mX3RoaXMgPSAxOworCSAgaWYgKHN5bXRhYiAhPSBOVUxMKQorCSAgICAqc3ltdGFiID0gTlVMTDsKKwkgIHJldHVybiBOVUxMOworCX0KKyAgICB9CisKKyAgLyogTm93IHNlYXJjaCBhbGwgZ2xvYmFsIGJsb2Nrcy4gIERvIHRoZSBzeW10YWIncyBmaXJzdCwgdGhlbgorICAgICBjaGVjayB0aGUgcHN5bXRhYidzLiBJZiBhIHBzeW10YWIgaW5kaWNhdGVzIHRoZSBleGlzdGVuY2UKKyAgICAgb2YgdGhlIGRlc2lyZWQgbmFtZSBhcyBhIGdsb2JhbCwgdGhlbiBkbyBwc3ltdGFiLXRvLXN5bXRhYgorICAgICBjb252ZXJzaW9uIG9uIHRoZSBmbHkgYW5kIHJldHVybiB0aGUgZm91bmQgc3ltYm9sLiAqLworICAKKyAgQUxMX1NZTVRBQlMgKG9iamZpbGUsIHMpCisgICAgeworICAgICAgYnYgPSBCTE9DS1ZFQ1RPUiAocyk7CisgICAgICBibG9jayA9IEJMT0NLVkVDVE9SX0JMT0NLIChidiwgR0xPQkFMX0JMT0NLKTsKKyAgICAgIHN5bSA9IGxvb2t1cF9ibG9ja19zeW1ib2wgKGJsb2NrLCBuYW1lLCBuYW1lc3BhY2UpOworICAgICAgaWYgKHN5bSkgCisJeworCSAgYmxvY2tfZm91bmQgPSBibG9jazsKKwkgIGlmIChzeW10YWIgIT0gTlVMTCkKKwkgICAgKnN5bXRhYiA9IHM7CisJICByZXR1cm4gZml4dXBfc3ltYm9sX3NlY3Rpb24gKHN5bSwgb2JqZmlsZSk7CisJfQorICAgIH0KKworI2lmbmRlZiBIUFVYSFBQQQorCisgIC8qIENoZWNrIGZvciB0aGUgcG9zc2liaWxpdHkgb2YgdGhlIHN5bWJvbCBiZWluZyBhIGZ1bmN0aW9uIG9yCisgICAgIGEgbWFuZ2xlZCB2YXJpYWJsZSB0aGF0IGlzIHN0b3JlZCBpbiBvbmUgb2YgdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlcy4KKyAgICAgRXZlbnR1YWxseSwgYWxsIGdsb2JhbCBzeW1ib2xzIG1pZ2h0IGJlIHJlc29sdmVkIGluIHRoaXMgd2F5LiAgKi8KKyAgCisgIGlmIChuYW1lc3BhY2UgPT0gVkFSX05BTUVTUEFDRSkKKyAgICB7CisgICAgICBtc3ltYm9sID0gbG9va3VwX21pbmltYWxfc3ltYm9sIChuYW1lLCBOVUxMLCBOVUxMKTsKKyAgICAgIGlmIChtc3ltYm9sICE9IE5VTEwpCisJeworCSAgcyA9IGZpbmRfcGNfc2VjdF9zeW10YWIgKFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltYm9sKSwKKwkJCQkgIFNZTUJPTF9CRkRfU0VDVElPTiAobXN5bWJvbCkpOworCSAgaWYgKHMgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIC8qIFRoaXMgaXMgYSBmdW5jdGlvbiB3aGljaCBoYXMgYSBzeW10YWIgZm9yIGl0cyBhZGRyZXNzLiAgKi8KKwkgICAgICBidiA9IEJMT0NLVkVDVE9SIChzKTsKKwkgICAgICBibG9jayA9IEJMT0NLVkVDVE9SX0JMT0NLIChidiwgR0xPQkFMX0JMT0NLKTsKKwkgICAgICBzeW0gPSBsb29rdXBfYmxvY2tfc3ltYm9sIChibG9jaywgU1lNQk9MX05BTUUgKG1zeW1ib2wpLAorCQkJCQkgbmFtZXNwYWNlKTsKKyAgICAgICAgICAgICAgLyogV2Uga2VwdCBzdGF0aWMgZnVuY3Rpb25zIGluIG1pbmltYWwgc3ltYm9sIHRhYmxlIGFzIHdlbGwgYXMKKwkJIGluIHN0YXRpYyBzY29wZS4gV2Ugd2FudCB0byBmaW5kIHRoZW0gaW4gdGhlIHN5bWJvbCB0YWJsZS4gKi8KKwkJaWYgKCFzeW0pIHsKKwkJICBibG9jayA9IEJMT0NLVkVDVE9SX0JMT0NLIChidiwgU1RBVElDX0JMT0NLKTsKKwkJICBzeW0gPSBsb29rdXBfYmxvY2tfc3ltYm9sIChibG9jaywgU1lNQk9MX05BTUUgKG1zeW1ib2wpLAorCQkJCQkgICAgIG5hbWVzcGFjZSk7CisJCX0KKworCSAgICAgIC8qIHN5bSA9PSAwIGlmIHN5bWJvbCB3YXMgZm91bmQgaW4gdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlCisJCSBidXQgbm90IGluIHRoZSBzeW10YWIuCisJCSBSZXR1cm4gMCB0byB1c2UgdGhlIG1zeW1ib2wgZGVmaW5pdGlvbiBvZiAiZm9vXyIuCisKKwkJIFRoaXMgaGFwcGVucyBmb3IgRm9ydHJhbiAgImZvb18iIHN5bWJvbHMsCisJCSB3aGljaCBhcmUgImZvbyIgaW4gdGhlIHN5bXRhYi4KKworCQkgVGhpcyBjYW4gYWxzbyBoYXBwZW4gaWYgImFzbSIgaXMgdXNlZCB0byBtYWtlIGEKKwkJIHJlZ3VsYXIgc3ltYm9sIGJ1dCBub3QgYSBkZWJ1Z2dpbmcgc3ltYm9sLCBlLmcuCisJCSBhc20oIi5nbG9ibCBfbWFpbiIpOworCQkgYXNtKCJfbWFpbjoiKTsKKwkJICovCisKKwkgICAgICBpZiAoc3ltdGFiICE9IE5VTEwpCisJCSpzeW10YWIgPSBzOworCSAgICAgIHJldHVybiBmaXh1cF9zeW1ib2xfc2VjdGlvbiAoc3ltLCBvYmpmaWxlKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoTVNZTUJPTF9UWVBFIChtc3ltYm9sKSAhPSBtc3RfdGV4dAorCQkgICAmJiBNU1lNQk9MX1RZUEUgKG1zeW1ib2wpICE9IG1zdF9maWxlX3RleHQKKwkJICAgJiYgIVNUUkVRIChuYW1lLCBTWU1CT0xfTkFNRSAobXN5bWJvbCkpKQorCSAgICB7CisJICAgICAgLyogVGhpcyBpcyBhIG1hbmdsZWQgdmFyaWFibGUsIGxvb2sgaXQgdXAgYnkgaXRzCisJCSBtYW5nbGVkIG5hbWUuICAqLworCSAgICAgIHJldHVybiBsb29rdXBfc3ltYm9sIChTWU1CT0xfTkFNRSAobXN5bWJvbCksIGJsb2NrLCAKKwkJCQkgICAgbmFtZXNwYWNlLCBpc19hX2ZpZWxkX29mX3RoaXMsIHN5bXRhYik7CisJICAgIH0KKwkgIC8qIFRoZXJlIGFyZSBubyBkZWJ1ZyBzeW1ib2xzIGZvciB0aGlzIGZpbGUsIG9yIHdlIGFyZSBsb29raW5nCisJICAgICBmb3IgYW4gdW5tYW5nbGVkIHZhcmlhYmxlLgorCSAgICAgVHJ5IHRvIGZpbmQgYSBtYXRjaGluZyBzdGF0aWMgc3ltYm9sIGJlbG93LiAqLworCX0KKyAgICB9CisgICAgICAKKyNlbmRpZgorCisgIEFMTF9QU1lNVEFCUyAob2JqZmlsZSwgcHMpCisgICAgeworICAgICAgaWYgKCFwcy0+cmVhZGluICYmIGxvb2t1cF9wYXJ0aWFsX3N5bWJvbCAocHMsIG5hbWUsIDEsIG5hbWVzcGFjZSkpCisJeworCSAgcyA9IFBTWU1UQUJfVE9fU1lNVEFCKHBzKTsKKwkgIGJ2ID0gQkxPQ0tWRUNUT1IgKHMpOworCSAgYmxvY2sgPSBCTE9DS1ZFQ1RPUl9CTE9DSyAoYnYsIEdMT0JBTF9CTE9DSyk7CisJICBzeW0gPSBsb29rdXBfYmxvY2tfc3ltYm9sIChibG9jaywgbmFtZSwgbmFtZXNwYWNlKTsKKwkgIGlmICghc3ltKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBUaGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnksIGJ1dCBhcyBhIGxhc3QgcmVzb3J0CisgICAgICAgICAgICAgICAqIHRyeSBsb29raW5nIGluIHRoZSBzdGF0aWNzIGV2ZW4gdGhvdWdoIHRoZSBwc3ltdGFiCisgICAgICAgICAgICAgICAqIGNsYWltZWQgdGhlIHN5bWJvbCB3YXMgZ2xvYmFsLiBJdCdzIHBvc3NpYmxlIHRoYXQKKyAgICAgICAgICAgICAgICogdGhlIHBzeW10YWIgZ2V0cyBpdCB3cm9uZyBpbiBzb21lIGNhc2VzLgorICAgICAgICAgICAgICAgKi8KKwkgICAgICBibG9jayA9IEJMT0NLVkVDVE9SX0JMT0NLIChidiwgU1RBVElDX0JMT0NLKTsKKwkgICAgICBzeW0gPSBsb29rdXBfYmxvY2tfc3ltYm9sIChibG9jaywgbmFtZSwgbmFtZXNwYWNlKTsKKyAgICAgICAgICAgICAgaWYgKCFzeW0pCisJICAgICAgICBlcnJvciAoIkludGVybmFsOiBnbG9iYWwgc3ltYm9sIGAlcycgZm91bmQgaW4gJXMgcHN5bXRhYiBidXQgbm90IGluIHN5bXRhYi5cblwKKyVzIG1heSBiZSBhbiBpbmxpbmVkIGZ1bmN0aW9uLCBvciBtYXkgYmUgYSB0ZW1wbGF0ZSBmdW5jdGlvblxuXAorKGlmIGEgdGVtcGxhdGUsIHRyeSBzcGVjaWZ5aW5nIGFuIGluc3RhbnRpYXRpb246ICVzPHR5cGU+KS4iLAorICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBwcy0+ZmlsZW5hbWUsIG5hbWUsIG5hbWUpOworICAgICAgICAgICAgfQorCSAgaWYgKHN5bXRhYiAhPSBOVUxMKQorCSAgICAqc3ltdGFiID0gczsKKwkgIHJldHVybiBmaXh1cF9zeW1ib2xfc2VjdGlvbiAoc3ltLCBvYmpmaWxlKTsKKwl9CisgICAgfQorCisgIC8qIE5vdyBzZWFyY2ggYWxsIHN0YXRpYyBmaWxlLWxldmVsIHN5bWJvbHMuCisgICAgIE5vdCBzdHJpY3RseSBjb3JyZWN0LCBidXQgbW9yZSB1c2VmdWwgdGhhbiBhbiBlcnJvci4KKyAgICAgRG8gdGhlIHN5bXRhYnMgZmlyc3QsIHRoZW4gY2hlY2sgdGhlIHBzeW10YWJzLgorICAgICBJZiBhIHBzeW10YWIgaW5kaWNhdGVzIHRoZSBleGlzdGVuY2UKKyAgICAgb2YgdGhlIGRlc2lyZWQgbmFtZSBhcyBhIGZpbGUtbGV2ZWwgc3RhdGljLCB0aGVuIGRvIHBzeW10YWItdG8tc3ltdGFiCisgICAgIGNvbnZlcnNpb24gb24gdGhlIGZseSBhbmQgcmV0dXJuIHRoZSBmb3VuZCBzeW1ib2wuICovCisKKyAgQUxMX1NZTVRBQlMgKG9iamZpbGUsIHMpCisgICAgeworICAgICAgYnYgPSBCTE9DS1ZFQ1RPUiAocyk7CisgICAgICBibG9jayA9IEJMT0NLVkVDVE9SX0JMT0NLIChidiwgU1RBVElDX0JMT0NLKTsKKyAgICAgIHN5bSA9IGxvb2t1cF9ibG9ja19zeW1ib2wgKGJsb2NrLCBuYW1lLCBuYW1lc3BhY2UpOworICAgICAgaWYgKHN5bSkgCisJeworCSAgYmxvY2tfZm91bmQgPSBibG9jazsKKwkgIGlmIChzeW10YWIgIT0gTlVMTCkKKwkgICAgKnN5bXRhYiA9IHM7CisJICByZXR1cm4gZml4dXBfc3ltYm9sX3NlY3Rpb24gKHN5bSwgb2JqZmlsZSk7CisJfQorICAgIH0KKworICBBTExfUFNZTVRBQlMgKG9iamZpbGUsIHBzKQorICAgIHsKKyAgICAgIGlmICghcHMtPnJlYWRpbiAmJiBsb29rdXBfcGFydGlhbF9zeW1ib2wgKHBzLCBuYW1lLCAwLCBuYW1lc3BhY2UpKQorCXsKKwkgIHMgPSBQU1lNVEFCX1RPX1NZTVRBQihwcyk7CisJICBidiA9IEJMT0NLVkVDVE9SIChzKTsKKwkgIGJsb2NrID0gQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBTVEFUSUNfQkxPQ0spOworCSAgc3ltID0gbG9va3VwX2Jsb2NrX3N5bWJvbCAoYmxvY2ssIG5hbWUsIG5hbWVzcGFjZSk7CisJICBpZiAoIXN5bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogVGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5LCBidXQgYXMgYSBsYXN0IHJlc29ydAorICAgICAgICAgICAgICAgKiB0cnkgbG9va2luZyBpbiB0aGUgZ2xvYmFscyBldmVuIHRob3VnaCB0aGUgcHN5bXRhYgorICAgICAgICAgICAgICAgKiBjbGFpbWVkIHRoZSBzeW1ib2wgd2FzIHN0YXRpYy4gSXQncyBwb3NzaWJsZSB0aGF0CisgICAgICAgICAgICAgICAqIHRoZSBwc3ltdGFiIGdldHMgaXQgd3JvbmcgaW4gc29tZSBjYXNlcy4KKyAgICAgICAgICAgICAgICovCisJICAgICAgYmxvY2sgPSBCTE9DS1ZFQ1RPUl9CTE9DSyAoYnYsIEdMT0JBTF9CTE9DSyk7CisJICAgICAgc3ltID0gbG9va3VwX2Jsb2NrX3N5bWJvbCAoYmxvY2ssIG5hbWUsIG5hbWVzcGFjZSk7CisgICAgICAgICAgICAgIGlmICghc3ltKQorICAgICAgICAgICAgICAgIGVycm9yICgiSW50ZXJuYWw6IHN0YXRpYyBzeW1ib2wgYCVzJyBmb3VuZCBpbiAlcyBwc3ltdGFiIGJ1dCBub3QgaW4gc3ltdGFiLlxuXAorJXMgbWF5IGJlIGFuIGlubGluZWQgZnVuY3Rpb24sIG9yIG1heSBiZSBhIHRlbXBsYXRlIGZ1bmN0aW9uXG5cCisoaWYgYSB0ZW1wbGF0ZSwgdHJ5IHNwZWNpZnlpbmcgYW4gaW5zdGFudGlhdGlvbjogJXM8dHlwZT4pLiIsCisgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHBzLT5maWxlbmFtZSwgbmFtZSwgbmFtZSk7CisgICAgICAgICAgICB9CisJICBpZiAoc3ltdGFiICE9IE5VTEwpCisJICAgICpzeW10YWIgPSBzOworCSAgcmV0dXJuIGZpeHVwX3N5bWJvbF9zZWN0aW9uIChzeW0sIG9iamZpbGUpOworCX0KKyAgICB9CisKKyNpZmRlZiBIUFVYSFBQQQorCisgIC8qIENoZWNrIGZvciB0aGUgcG9zc2liaWxpdHkgb2YgdGhlIHN5bWJvbCBiZWluZyBhIGZ1bmN0aW9uIG9yCisgICAgIGEgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgc3RvcmVkIGluIG9uZSBvZiB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGVzLgorICAgICBUaGUgIm1pbmltYWwgc3ltYm9sIHRhYmxlIiBpcyBidWlsdCBmcm9tIGxpbmtlci1zdXBwbGllZCBpbmZvLgorCisgICAgIFJUOiBJIG1vdmVkIHRoaXMgY2hlY2sgdG8gbGFzdCwgYWZ0ZXIgdGhlIGNvbXBsZXRlIHNlYXJjaCBvZgorICAgICB0aGUgZ2xvYmFsIChwKXN5bXRhYidzIGFuZCBzdGF0aWMgKHApc3ltdGFiJ3MuIEZvciBIUC1nZW5lcmF0ZWQKKyAgICAgc3ltYm9sIHRhYmxlcywgdGhpcyBjaGVjayB3YXMgY2F1c2luZyBhIHByZW1hdHVyZSBleGl0IGZyb20KKyAgICAgbG9va3VwX3N5bWJvbCB3aXRoIE5VTEwgcmV0dXJuLCBhbmQgdGh1cyBtZXNzaW5nIHVwIHN5bWJvbCBsb29rdXBzCisgICAgIG9mIHRoaW5ncyBsaWtlICJjOjpmIi4gSXQgc2VlbXMgdG8gbWUgYSBjaGVjayBvZiB0aGUgbWluaW1hbAorICAgICBzeW1ib2wgdGFibGUgb3VnaHQgdG8gYmUgYSBsYXN0IHJlc29ydCBpbiBhbnkgY2FzZS4gSSdtIHZhZ3VlbHkKKyAgICAgd29ycmllZCBhYm91dCB0aGUgY29tbWVudCBiZWxvdyB3aGljaCB0YWxrcyBhYm91dCBGT1JUUkFOIHJvdXRpbmVzICJmb29fIgorICAgICB0aG91Z2guLi4gaXMgaXQgc2F5aW5nIHdlIG5lZWQgdG8gZG8gdGhlICJtaW5zeW0iIGNoZWNrIGJlZm9yZQorICAgICB0aGUgc3RhdGljIGNoZWNrIGluIHRoaXMgY2FzZT8gCisgICAqLworICAKKyAgaWYgKG5hbWVzcGFjZSA9PSBWQVJfTkFNRVNQQUNFKQorICAgIHsKKyAgICAgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKG5hbWUsIE5VTEwsIE5VTEwpOworICAgICAgaWYgKG1zeW1ib2wgIT0gTlVMTCkKKwl7CisgICAgICAgICAgLyogT0ssIHdlIGZvdW5kIGEgbWluaW1hbCBzeW1ib2wgaW4gc3BpdGUgb2Ygbm90CisgICAgICAgICAgICogZmluZGluZyBhbnkgc3ltYm9sLiBUaGVyZSBhcmUgdmFyaW91cyBwb3NzaWJsZQorICAgICAgICAgICAqIGV4cGxhbmF0aW9ucyBmb3IgdGhpcy4gT25lIHBvc3NpYmlsaXR5IGlzIHRoZSBzeW1ib2wKKyAgICAgICAgICAgKiBleGlzdHMgaW4gY29kZSBub3QgY29tcGlsZWQgLWcuIEFub3RoZXIgcG9zc2liaWxpdHkKKyAgICAgICAgICAgKiBpcyB0aGF0IHRoZSAncHN5bXRhYicgaXNuJ3QgZG9pbmcgaXRzIGpvYi4KKyAgICAgICAgICAgKiBBIHRoaXJkIHBvc3NpYmlsaXR5LCByZWxhdGVkIHRvICMyLCBpcyB0aGF0IHdlIHdlcmUgY29uZnVzZWQgCisgICAgICAgICAgICogYnkgbmFtZS1tYW5nbGluZy4gRm9yIGluc3RhbmNlLCBtYXliZSB0aGUgcHN5bXRhYiBpc24ndAorICAgICAgICAgICAqIGRvaW5nIGl0cyBqb2IgYmVjYXVzZSBpdCBvbmx5IGtub3cgYWJvdXQgZGVtYW5nbGVkCisgICAgICAgICAgICogbmFtZXMsIGJ1dCB3ZSB3ZXJlIGdpdmVuIGEgbWFuZ2xlZCBuYW1lLi4uCisgICAgICAgICAgICovCisKKyAgICAgICAgICAvKiBXZSBmaXJzdCB1c2UgdGhlIGFkZHJlc3MgaW4gdGhlIG1zeW1ib2wgdG8gdHJ5IHRvCisgICAgICAgICAgICogbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBzeW10YWIuIE5vdGUgdGhhdCBmaW5kX3BjX3N5bXRhYigpCisgICAgICAgICAgICogaGFzIGEgc2lkZS1lZmZlY3Qgb2YgZG9pbmcgcHN5bXRhYi10by1zeW10YWIgZXhwYW5zaW9uLAorICAgICAgICAgICAqIGZvciB0aGUgZm91bmQgc3ltdGFiLgorICAgICAgICAgICAqLworCSAgcyA9IGZpbmRfcGNfc3ltdGFiIChTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bWJvbCkpOworCSAgaWYgKHMgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGJ2ID0gQkxPQ0tWRUNUT1IgKHMpOworCSAgICAgIGJsb2NrID0gQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBHTE9CQUxfQkxPQ0spOworCSAgICAgIHN5bSA9IGxvb2t1cF9ibG9ja19zeW1ib2wgKGJsb2NrLCBTWU1CT0xfTkFNRSAobXN5bWJvbCksCisJCQkJCSBuYW1lc3BhY2UpOworICAgICAgICAgICAgICAvKiBXZSBrZXB0IHN0YXRpYyBmdW5jdGlvbnMgaW4gbWluaW1hbCBzeW1ib2wgdGFibGUgYXMgd2VsbCBhcworCQkgaW4gc3RhdGljIHNjb3BlLiBXZSB3YW50IHRvIGZpbmQgdGhlbSBpbiB0aGUgc3ltYm9sIHRhYmxlLiAqLworIAkgICAgICBpZiAoIXN5bSkgCisgICAgICAgICAgICAgICAgeworCQkgIGJsb2NrID0gQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBTVEFUSUNfQkxPQ0spOworCQkgIHN5bSA9IGxvb2t1cF9ibG9ja19zeW1ib2wgKGJsb2NrLCBTWU1CT0xfTkFNRSAobXN5bWJvbCksCisJCQkJCSAgICAgbmFtZXNwYWNlKTsKKwkJfQorICAgICAgICAgICAgICAvKiBJZiB3ZSBmb3VuZCBvbmUsIHJldHVybiBpdCAqLworICAgICAgICAgICAgICBpZiAoc3ltKSB7CisJICAgICAgICBpZiAoc3ltdGFiICE9IE5VTEwpCisJICAgICAgICAgICpzeW10YWIgPSBzOworCSAgICAgICAgcmV0dXJuIHN5bTsKKyAgICAgICAgICAgICAgfQorCisJICAgICAgLyogSWYgd2UgZ2V0IGhlcmUgd2l0aCBzeW0gPT0gMCwgdGhlIHN5bWJvbCB3YXMgCisgICAgICAgICAgICAgICAgIGZvdW5kIGluIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZQorCQkgYnV0IG5vdCBpbiB0aGUgc3ltdGFiLgorCQkgRmFsbCB0aHJvdWdoIGFuZCByZXR1cm4gMCB0byB1c2UgdGhlIG1zeW1ib2wgCisgICAgICAgICAgICAgICAgIGRlZmluaXRpb24gb2YgImZvb18iLgorICAgICAgICAgICAgICAgICAoTm90ZSB0aGF0IG91dGVyIGNvZGUgZ2VuZXJhbGx5IGZvbGxvd3MgdXAgYSBjYWxsCisgICAgICAgICAgICAgICAgICB0byB0aGlzIHJvdXRpbmUgd2l0aCBhIGNhbGwgdG8gbG9va3VwX21pbmltYWxfc3ltYm9sKCksCisgICAgICAgICAgICAgICAgICBzbyBhIDAgcmV0dXJuIG1lYW5zIHdlJ2xsIGp1c3QgZmxvdyBpbnRvIHRoYXQgb3RoZXIgcm91dGluZSkuCisKKwkJIFRoaXMgaGFwcGVucyBmb3IgRm9ydHJhbiAgImZvb18iIHN5bWJvbHMsCisJCSB3aGljaCBhcmUgImZvbyIgaW4gdGhlIHN5bXRhYi4KKworCQkgVGhpcyBjYW4gYWxzbyBoYXBwZW4gaWYgImFzbSIgaXMgdXNlZCB0byBtYWtlIGEKKwkJIHJlZ3VsYXIgc3ltYm9sIGJ1dCBub3QgYSBkZWJ1Z2dpbmcgc3ltYm9sLCBlLmcuCisJCSBhc20oIi5nbG9ibCBfbWFpbiIpOworCQkgYXNtKCJfbWFpbjoiKTsKKwkJICovCisJICAgIH0KKworICAgICAgICAgIC8qIElmIHRoZSBsb29rdXAtYnktYWRkcmVzcyBmYWlscywgdHJ5IHJlcGVhdGluZyB0aGUKKyAgICAgICAgICAgKiBlbnRpcmUgbG9va3VwIHByb2Nlc3Mgd2l0aCB0aGUgc3ltYm9sIG5hbWUgZnJvbQorICAgICAgICAgICAqIHRoZSBtc3ltYm9sIChpZiBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgc3ltYm9sIG5hbWUpLgorICAgICAgICAgICAqLworCSAgZWxzZSBpZiAoTVNZTUJPTF9UWVBFIChtc3ltYm9sKSAhPSBtc3RfdGV4dAorCQkgICAmJiBNU1lNQk9MX1RZUEUgKG1zeW1ib2wpICE9IG1zdF9maWxlX3RleHQKKwkJICAgJiYgIVNUUkVRIChuYW1lLCBTWU1CT0xfTkFNRSAobXN5bWJvbCkpKQorCSAgICB7CisJICAgICAgcmV0dXJuIGxvb2t1cF9zeW1ib2wgKFNZTUJPTF9OQU1FIChtc3ltYm9sKSwgYmxvY2ssCisJCQkJICAgIG5hbWVzcGFjZSwgaXNfYV9maWVsZF9vZl90aGlzLCBzeW10YWIpOworCSAgICB9CisJfQorICAgIH0KKworI2VuZGlmCisKKyAgaWYgKHN5bXRhYiAhPSBOVUxMKQorICAgICpzeW10YWIgPSBOVUxMOworICByZXR1cm4gMDsKK30KKworLyogTG9vaywgaW4gcGFydGlhbF9zeW10YWIgUFNULCBmb3Igc3ltYm9sIE5BTUUuICBDaGVjayB0aGUgZ2xvYmFsCisgICBzeW1ib2xzIGlmIEdMT0JBTCwgdGhlIHN0YXRpYyBzeW1ib2xzIGlmIG5vdCAqLworCitzdGF0aWMgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoKK2xvb2t1cF9wYXJ0aWFsX3N5bWJvbCAocHN0LCBuYW1lLCBnbG9iYWwsIG5hbWVzcGFjZSkKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGludCBnbG9iYWw7CisgICAgIG5hbWVzcGFjZV9lbnVtIG5hbWVzcGFjZTsKK3sKKyAgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqc3RhcnQsICoqcHN5bTsKKyAgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqdG9wLCAqKmJvdHRvbSwgKipjZW50ZXI7CisgIGludCBsZW5ndGggPSAoZ2xvYmFsID8gcHN0LT5uX2dsb2JhbF9zeW1zIDogcHN0LT5uX3N0YXRpY19zeW1zKTsKKyAgaW50IGRvX2xpbmVhcl9zZWFyY2ggPSAxOworCisgIGlmIChsZW5ndGggPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gKE5VTEwpOworICAgIH0KKyAgCisgIHN0YXJ0ID0gKGdsb2JhbCA/CisJICAgcHN0LT5vYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMubGlzdCArIHBzdC0+Z2xvYmFsc19vZmZzZXQgOgorCSAgIHBzdC0+b2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLmxpc3QgKyBwc3QtPnN0YXRpY3Nfb2Zmc2V0ICApOworCisgIGlmIChnbG9iYWwpCQkvKiBUaGlzIG1lYW5zIHdlIGNhbiB1c2UgYSBiaW5hcnkgc2VhcmNoLiAqLworICAgIHsKKyAgICAgIGRvX2xpbmVhcl9zZWFyY2ggPSAwOworCisgICAgICAvKiBCaW5hcnkgc2VhcmNoLiAgVGhpcyBzZWFyY2ggaXMgZ3VhcmFudGVlZCB0byBlbmQgd2l0aCBjZW50ZXIKKyAgICAgICAgIHBvaW50aW5nIGF0IHRoZSBlYXJsaWVzdCBwYXJ0aWFsIHN5bWJvbCB3aXRoIHRoZSBjb3JyZWN0CisJIG5hbWUuICBBdCB0aGF0IHBvaW50ICphbGwqIHBhcnRpYWwgc3ltYm9scyB3aXRoIHRoYXQgbmFtZQorCSB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgY29ycmVjdCBuYW1lc3BhY2UuICovCisKKyAgICAgIGJvdHRvbSA9IHN0YXJ0OworICAgICAgdG9wID0gc3RhcnQgKyBsZW5ndGggLSAxOworICAgICAgd2hpbGUgKHRvcCA+IGJvdHRvbSkKKwl7CisJICBjZW50ZXIgPSBib3R0b20gKyAodG9wIC0gYm90dG9tKSAvIDI7CisJICBpZiAoIShjZW50ZXIgPCB0b3ApKQorCSAgICBhYm9ydCAoKTsKKwkgIGlmICghZG9fbGluZWFyX3NlYXJjaAorCSAgICAgICYmIChTWU1CT0xfTEFOR1VBR0UgKCpjZW50ZXIpID09IGxhbmd1YWdlX2NwbHVzCisJCSAgfHwgU1lNQk9MX0xBTkdVQUdFICgqY2VudGVyKSA9PSBsYW5ndWFnZV9qYXZhCisJCSAgKSkKKwkgICAgeworCSAgICAgIGRvX2xpbmVhcl9zZWFyY2ggPSAxOworCSAgICB9CisJICBpZiAoU1RSQ01QIChTWU1CT0xfTkFNRSAoKmNlbnRlciksIG5hbWUpID49IDApCisJICAgIHsKKwkgICAgICB0b3AgPSBjZW50ZXI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGJvdHRvbSA9IGNlbnRlciArIDE7CisJICAgIH0KKwl9CisgICAgICBpZiAoISh0b3AgPT0gYm90dG9tKSkKKwlhYm9ydCAoKTsKKyAgICAgIHdoaWxlIChTVFJFUSAoU1lNQk9MX05BTUUgKCp0b3ApLCBuYW1lKSkKKwl7CisJICBpZiAoU1lNQk9MX05BTUVTUEFDRSAoKnRvcCkgPT0gbmFtZXNwYWNlKQorCSAgICB7CisJICAgICAgcmV0dXJuICgqdG9wKTsKKwkgICAgfQorCSAgdG9wICsrOworCX0KKyAgICB9CisKKyAgLyogQ2FuJ3QgdXNlIGEgYmluYXJ5IHNlYXJjaCBvciBlbHNlIHdlIGZvdW5kIGR1cmluZyB0aGUgYmluYXJ5IHNlYXJjaCB0aGF0CisgICAgIHdlIHNob3VsZCBhbHNvIGRvIGEgbGluZWFyIHNlYXJjaC4gKi8KKworICBpZiAoZG9fbGluZWFyX3NlYXJjaCkKKyAgICB7CisgICAgICBmb3IgKHBzeW0gPSBzdGFydDsgcHN5bSA8IHN0YXJ0ICsgbGVuZ3RoOyBwc3ltKyspCisJeworCSAgaWYgKG5hbWVzcGFjZSA9PSBTWU1CT0xfTkFNRVNQQUNFICgqcHN5bSkpCisJICAgIHsKKwkgICAgICBpZiAoU1lNQk9MX01BVENIRVNfTkFNRSAoKnBzeW0sIG5hbWUpKQorCQl7CisJCSAgcmV0dXJuICgqcHN5bSk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIChOVUxMKTsKK30KKworLyogTG9vayB1cCBhIHR5cGUgbmFtZWQgTkFNRSBpbiB0aGUgc3RydWN0X25hbWVzcGFjZS4gIFRoZSB0eXBlIHJldHVybmVkCisgICBtdXN0IG5vdCBiZSBvcGFxdWUgLS0gaS5lLiwgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBmaWVsZCBkZWZpbmVkCisKKyAgIFRoaXMgY29kZSB3YXMgbW9kZWxsZWQgb24gbG9va3VwX3N5bWJvbCAtLSB0aGUgcGFydHMgbm90IHJlbGV2YW50IHRvIGxvb2tpbmcKKyAgIHVwIHR5cGVzIHdlcmUganVzdCBsZWZ0IG91dC4gIEluIHBhcnRpY3VsYXIgaXQncyBhc3N1bWVkIGhlcmUgdGhhdCB0eXBlcworICAgYXJlIGF2YWlsYWJsZSBpbiBzdHJ1Y3RfbmFtZXNwYWNlIGFuZCBvbmx5IGF0IGZpbGUtc3RhdGljIG9yIGdsb2JhbCBibG9ja3MuICovCisKKworc3RydWN0IHR5cGUgKgorbG9va3VwX3RyYW5zcGFyZW50X3R5cGUgKG5hbWUpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bXRhYiAqcyA9IE5VTEw7CisgIHJlZ2lzdGVyIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHM7CisgIHN0cnVjdCBibG9ja3ZlY3RvciAqYnY7CisgIHJlZ2lzdGVyIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICByZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmJsb2NrOworICByZWdpc3RlciBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisKKyAgLyogTm93IHNlYXJjaCBhbGwgdGhlIGdsb2JhbCBzeW1ib2xzLiAgRG8gdGhlIHN5bXRhYidzIGZpcnN0LCB0aGVuCisgICAgIGNoZWNrIHRoZSBwc3ltdGFiJ3MuIElmIGEgcHN5bXRhYiBpbmRpY2F0ZXMgdGhlIGV4aXN0ZW5jZQorICAgICBvZiB0aGUgZGVzaXJlZCBuYW1lIGFzIGEgZ2xvYmFsLCB0aGVuIGRvIHBzeW10YWItdG8tc3ltdGFiCisgICAgIGNvbnZlcnNpb24gb24gdGhlIGZseSBhbmQgcmV0dXJuIHRoZSBmb3VuZCBzeW1ib2wuICAqLworICAKKyAgQUxMX1NZTVRBQlMgKG9iamZpbGUsIHMpCisgICAgeworICAgICAgYnYgPSBCTE9DS1ZFQ1RPUiAocyk7CisgICAgICBibG9jayA9IEJMT0NLVkVDVE9SX0JMT0NLIChidiwgR0xPQkFMX0JMT0NLKTsKKyAgICAgIHN5bSA9IGxvb2t1cF9ibG9ja19zeW1ib2wgKGJsb2NrLCBuYW1lLCBTVFJVQ1RfTkFNRVNQQUNFKTsKKyAgICAgIGlmIChzeW0gJiYgIVRZUEVfSVNfT1BBUVVFIChTWU1CT0xfVFlQRSAoc3ltKSkpCisJeworCSAgcmV0dXJuIFNZTUJPTF9UWVBFIChzeW0pOworCX0KKyAgICB9CisKKyAgQUxMX1BTWU1UQUJTIChvYmpmaWxlLCBwcykKKyAgICB7CisgICAgICBpZiAoIXBzLT5yZWFkaW4gJiYgbG9va3VwX3BhcnRpYWxfc3ltYm9sIChwcywgbmFtZSwgMSwgU1RSVUNUX05BTUVTUEFDRSkpCisJeworCSAgcyA9IFBTWU1UQUJfVE9fU1lNVEFCKHBzKTsKKwkgIGJ2ID0gQkxPQ0tWRUNUT1IgKHMpOworCSAgYmxvY2sgPSBCTE9DS1ZFQ1RPUl9CTE9DSyAoYnYsIEdMT0JBTF9CTE9DSyk7CisJICBzeW0gPSBsb29rdXBfYmxvY2tfc3ltYm9sIChibG9jaywgbmFtZSwgU1RSVUNUX05BTUVTUEFDRSk7CisJICBpZiAoIXN5bSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgYnV0IGFzIGEgbGFzdCByZXNvcnQKKyAgICAgICAgICAgICAgICogdHJ5IGxvb2tpbmcgaW4gdGhlIHN0YXRpY3MgZXZlbiB0aG91Z2ggdGhlIHBzeW10YWIKKyAgICAgICAgICAgICAgICogY2xhaW1lZCB0aGUgc3ltYm9sIHdhcyBnbG9iYWwuIEl0J3MgcG9zc2libGUgdGhhdAorICAgICAgICAgICAgICAgKiB0aGUgcHN5bXRhYiBnZXRzIGl0IHdyb25nIGluIHNvbWUgY2FzZXMuCisgICAgICAgICAgICAgICAqLworCSAgICAgIGJsb2NrID0gQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBTVEFUSUNfQkxPQ0spOworCSAgICAgIHN5bSA9IGxvb2t1cF9ibG9ja19zeW1ib2wgKGJsb2NrLCBuYW1lLCBTVFJVQ1RfTkFNRVNQQUNFKTsKKyAgICAgICAgICAgICAgaWYgKCFzeW0pCisgICAgICAgICAgICAgICAgZXJyb3IgKCJJbnRlcm5hbDogZ2xvYmFsIHN5bWJvbCBgJXMnIGZvdW5kIGluICVzIHBzeW10YWIgYnV0IG5vdCBpbiBzeW10YWIuXG5cCislcyBtYXkgYmUgYW4gaW5saW5lZCBmdW5jdGlvbiwgb3IgbWF5IGJlIGEgdGVtcGxhdGUgZnVuY3Rpb25cblwKKyhpZiBhIHRlbXBsYXRlLCB0cnkgc3BlY2lmeWluZyBhbiBpbnN0YW50aWF0aW9uOiAlczx0eXBlPikuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgcHMtPmZpbGVuYW1lLCBuYW1lLCBuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIVRZUEVfSVNfT1BBUVVFIChTWU1CT0xfVFlQRSAoc3ltKSkpCisgICAgICAgICAgICByZXR1cm4gU1lNQk9MX1RZUEUgKHN5bSk7CisJfQorICAgIH0KKworICAvKiBOb3cgc2VhcmNoIHRoZSBzdGF0aWMgZmlsZS1sZXZlbCBzeW1ib2xzLgorICAgICBOb3Qgc3RyaWN0bHkgY29ycmVjdCwgYnV0IG1vcmUgdXNlZnVsIHRoYW4gYW4gZXJyb3IuCisgICAgIERvIHRoZSBzeW10YWIncyBmaXJzdCwgdGhlbgorICAgICBjaGVjayB0aGUgcHN5bXRhYidzLiBJZiBhIHBzeW10YWIgaW5kaWNhdGVzIHRoZSBleGlzdGVuY2UKKyAgICAgb2YgdGhlIGRlc2lyZWQgbmFtZSBhcyBhIGZpbGUtbGV2ZWwgc3RhdGljLCB0aGVuIGRvIHBzeW10YWItdG8tc3ltdGFiCisgICAgIGNvbnZlcnNpb24gb24gdGhlIGZseSBhbmQgcmV0dXJuIHRoZSBmb3VuZCBzeW1ib2wuCisgICAqLworCisgIEFMTF9TWU1UQUJTIChvYmpmaWxlLCBzKQorICAgIHsKKyAgICAgIGJ2ID0gQkxPQ0tWRUNUT1IgKHMpOworICAgICAgYmxvY2sgPSBCTE9DS1ZFQ1RPUl9CTE9DSyAoYnYsIFNUQVRJQ19CTE9DSyk7CisgICAgICBzeW0gPSBsb29rdXBfYmxvY2tfc3ltYm9sIChibG9jaywgbmFtZSwgU1RSVUNUX05BTUVTUEFDRSk7CisgICAgICBpZiAoc3ltICYmICFUWVBFX0lTX09QQVFVRSAoU1lNQk9MX1RZUEUgKHN5bSkpKQorCXsKKwkgIHJldHVybiBTWU1CT0xfVFlQRSAoc3ltKTsKKwl9CisgICAgfQorCisgIEFMTF9QU1lNVEFCUyAob2JqZmlsZSwgcHMpCisgICAgeworICAgICAgaWYgKCFwcy0+cmVhZGluICYmIGxvb2t1cF9wYXJ0aWFsX3N5bWJvbCAocHMsIG5hbWUsIDAsIFNUUlVDVF9OQU1FU1BBQ0UpKQorCXsKKwkgIHMgPSBQU1lNVEFCX1RPX1NZTVRBQihwcyk7CisJICBidiA9IEJMT0NLVkVDVE9SIChzKTsKKwkgIGJsb2NrID0gQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBTVEFUSUNfQkxPQ0spOworCSAgc3ltID0gbG9va3VwX2Jsb2NrX3N5bWJvbCAoYmxvY2ssIG5hbWUsIFNUUlVDVF9OQU1FU1BBQ0UpOworCSAgaWYgKCFzeW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgYnV0IGFzIGEgbGFzdCByZXNvcnQKKyAgICAgICAgICAgICAgICogdHJ5IGxvb2tpbmcgaW4gdGhlIGdsb2JhbHMgZXZlbiB0aG91Z2ggdGhlIHBzeW10YWIKKyAgICAgICAgICAgICAgICogY2xhaW1lZCB0aGUgc3ltYm9sIHdhcyBzdGF0aWMuIEl0J3MgcG9zc2libGUgdGhhdAorICAgICAgICAgICAgICAgKiB0aGUgcHN5bXRhYiBnZXRzIGl0IHdyb25nIGluIHNvbWUgY2FzZXMuCisgICAgICAgICAgICAgICAqLworCSAgICAgIGJsb2NrID0gQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBHTE9CQUxfQkxPQ0spOworCSAgICAgIHN5bSA9IGxvb2t1cF9ibG9ja19zeW1ib2wgKGJsb2NrLCBuYW1lLCBTVFJVQ1RfTkFNRVNQQUNFKTsKKyAgICAgICAgICAgICAgaWYgKCFzeW0pCisJICAgICAgICBlcnJvciAoIkludGVybmFsOiBzdGF0aWMgc3ltYm9sIGAlcycgZm91bmQgaW4gJXMgcHN5bXRhYiBidXQgbm90IGluIHN5bXRhYi5cblwKKyVzIG1heSBiZSBhbiBpbmxpbmVkIGZ1bmN0aW9uLCBvciBtYXkgYmUgYSB0ZW1wbGF0ZSBmdW5jdGlvblxuXAorKGlmIGEgdGVtcGxhdGUsIHRyeSBzcGVjaWZ5aW5nIGFuIGluc3RhbnRpYXRpb246ICVzPHR5cGU+KS4iLAorICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBwcy0+ZmlsZW5hbWUsIG5hbWUsIG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmICghVFlQRV9JU19PUEFRVUUgKFNZTUJPTF9UWVBFIChzeW0pKSkKKyAgICAgICAgICAgIHJldHVybiBTWU1CT0xfVFlQRSAoc3ltKTsKKwl9CisgICAgfQorICByZXR1cm4gKHN0cnVjdCB0eXBlICopIDA7Cit9CisKKworLyogRmluZCB0aGUgcHN5bXRhYiBjb250YWluaW5nIG1haW4oKS4gKi8KKy8qIEZJWE1FOiAgV2hhdCBhYm91dCBsYW5ndWFnZXMgd2l0aG91dCBtYWluKCkgb3Igc3BlY2lhbGx5IGxpbmtlZAorICAgZXhlY3V0YWJsZXMgdGhhdCBoYXZlIG5vIG1haW4oKSA/ICovCisKK3N0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqCitmaW5kX21haW5fcHN5bXRhYiAoKQoreworICByZWdpc3RlciBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdDsKKyAgcmVnaXN0ZXIgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisKKyAgQUxMX1BTWU1UQUJTIChvYmpmaWxlLCBwc3QpCisgICAgeworICAgICAgaWYgKGxvb2t1cF9wYXJ0aWFsX3N5bWJvbCAocHN0LCAibWFpbiIsIDEsIFZBUl9OQU1FU1BBQ0UpKQorCXsKKwkgIHJldHVybiAocHN0KTsKKwl9CisgICAgfQorICByZXR1cm4gKE5VTEwpOworfQorCisvKiBTZWFyY2ggQkxPQ0sgZm9yIHN5bWJvbCBOQU1FIGluIE5BTUVTUEFDRS4KKworICAgTm90ZSB0aGF0IGlmIE5BTUUgaXMgdGhlIGRlbWFuZ2xlZCBmb3JtIG9mIGEgQysrIHN5bWJvbCwgd2Ugd2lsbCBmYWlsCisgICB0byBmaW5kIGEgbWF0Y2ggZHVyaW5nIHRoZSBiaW5hcnkgc2VhcmNoIG9mIHRoZSBub24tZW5jb2RlZCBuYW1lcywgYnV0CisgICBmb3Igbm93IHdlIGRvbid0IHdvcnJ5IGFib3V0IHRoZSBzbGlnaHQgaW5lZmZpY2llbmN5IG9mIGxvb2tpbmcgZm9yCisgICBhIG1hdGNoIHdlJ2xsIG5ldmVyIGZpbmQsIHNpbmNlIGl0IHdpbGwgZ28gcHJldHR5IHF1aWNrLiAgT25jZSB0aGUKKyAgIGJpbmFyeSBzZWFyY2ggdGVybWluYXRlcywgd2UgZHJvcCB0aHJvdWdoIGFuZCBkbyBhIHN0cmFpZ2h0IGxpbmVhcgorICAgc2VhcmNoIG9uIHRoZSBzeW1ib2xzLiAgRWFjaCBzeW1ib2wgd2hpY2ggaXMgbWFya2VkIGFzIGJlaW5nIGEgQysrCisgICBzeW1ib2wgKGxhbmd1YWdlX2NwbHVzIHNldCkgaGFzIGJvdGggdGhlIGVuY29kZWQgYW5kIG5vbi1lbmNvZGVkIG5hbWVzCisgICB0ZXN0ZWQgZm9yIGEgbWF0Y2guICovCisKK3N0cnVjdCBzeW1ib2wgKgorbG9va3VwX2Jsb2NrX3N5bWJvbCAoYmxvY2ssIG5hbWUsIG5hbWVzcGFjZSkKKyAgICAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGJsb2NrICpibG9jazsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgY29uc3QgbmFtZXNwYWNlX2VudW0gbmFtZXNwYWNlOworeworICByZWdpc3RlciBpbnQgYm90LCB0b3AsIGluYzsKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bWJvbCAqc3ltOworICByZWdpc3RlciBzdHJ1Y3Qgc3ltYm9sICpzeW1fZm91bmQgPSBOVUxMOworICByZWdpc3RlciBpbnQgZG9fbGluZWFyX3NlYXJjaCA9IDE7CisKKyAgLyogSWYgdGhlIGJsb2NrcydzIHN5bWJvbHMgd2VyZSBzb3J0ZWQsIHN0YXJ0IHdpdGggYSBiaW5hcnkgc2VhcmNoLiAgKi8KKworICBpZiAoQkxPQ0tfU0hPVUxEX1NPUlQgKGJsb2NrKSkKKyAgICB7CisgICAgICAvKiBSZXNldCB0aGUgbGluZWFyIHNlYXJjaCBmbGFnIHNvIGlmIHRoZSBiaW5hcnkgc2VhcmNoIGZhaWxzLCB3ZQorCSB3b24ndCBkbyB0aGUgbGluZWFyIHNlYXJjaCBvbmNlIHVubGVzcyB3ZSBmaW5kIHNvbWUgcmVhc29uIHRvCisJIGRvIHNvLCBzdWNoIGFzIGZpbmRpbmcgYSBDKysgc3ltYm9sIGR1cmluZyB0aGUgYmluYXJ5IHNlYXJjaC4KKwkgTm90ZSB0aGF0IGZvciBDKysgbW9kdWxlcywgQUxMIHRoZSBzeW1ib2xzIGluIGEgYmxvY2sgc2hvdWxkCisJIGVuZCB1cCBtYXJrZWQgYXMgQysrIHN5bWJvbHMuICovCisKKyAgICAgIGRvX2xpbmVhcl9zZWFyY2ggPSAwOworICAgICAgdG9wID0gQkxPQ0tfTlNZTVMgKGJsb2NrKTsKKyAgICAgIGJvdCA9IDA7CisKKyAgICAgIC8qIEFkdmFuY2UgQk9UIHRvIG5vdCBmYXIgYmVmb3JlIHRoZSBmaXJzdCBzeW1ib2wgd2hvc2UgbmFtZSBpcyBOQU1FLiAqLworCisgICAgICB3aGlsZSAoMSkKKwl7CisJICBpbmMgPSAodG9wIC0gYm90ICsgMSk7CisJICAvKiBObyBuZWVkIHRvIGtlZXAgYmluYXJ5IHNlYXJjaGluZyBmb3IgdGhlIGxhc3QgZmV3IGJpdHMgd29ydGguICAqLworCSAgaWYgKGluYyA8IDQpCisJICAgIHsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgaW5jID0gKGluYyA+PiAxKSArIGJvdDsKKwkgIHN5bSA9IEJMT0NLX1NZTSAoYmxvY2ssIGluYyk7CisJICBpZiAoIWRvX2xpbmVhcl9zZWFyY2gKKwkgICAgICAmJiAoU1lNQk9MX0xBTkdVQUdFIChzeW0pID09IGxhbmd1YWdlX2NwbHVzCisJCSAgfHwgU1lNQk9MX0xBTkdVQUdFIChzeW0pID09IGxhbmd1YWdlX2phdmEKKwkJICApKQorCSAgICB7CisJICAgICAgZG9fbGluZWFyX3NlYXJjaCA9IDE7CisJICAgIH0KKwkgIGlmIChTWU1CT0xfTkFNRSAoc3ltKVswXSA8IG5hbWVbMF0pCisJICAgIHsKKwkgICAgICBib3QgPSBpbmM7CisJICAgIH0KKwkgIGVsc2UgaWYgKFNZTUJPTF9OQU1FIChzeW0pWzBdID4gbmFtZVswXSkKKwkgICAgeworCSAgICAgIHRvcCA9IGluYzsKKwkgICAgfQorCSAgZWxzZSBpZiAoU1RSQ01QIChTWU1CT0xfTkFNRSAoc3ltKSwgbmFtZSkgPCAwKQorCSAgICB7CisJICAgICAgYm90ID0gaW5jOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB0b3AgPSBpbmM7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIE5vdyBzY2FuIGZvcndhcmQgdW50aWwgd2UgcnVuIG91dCBvZiBzeW1ib2xzLCBmaW5kIG9uZSB3aG9zZQorCSBuYW1lIGlzIGdyZWF0ZXIgdGhhbiBOQU1FLCBvciBmaW5kIG9uZSB3ZSB3YW50LiAgSWYgdGhlcmUgaXMKKwkgbW9yZSB0aGFuIG9uZSBzeW1ib2wgd2l0aCB0aGUgcmlnaHQgbmFtZSBhbmQgbmFtZXNwYWNlLCB3ZQorCSByZXR1cm4gdGhlIGZpcnN0IG9uZTsgSSBiZWxpZXZlIGl0IGlzIG5vdyBpbXBvc3NpYmxlIGZvciB1cworCSB0byBlbmNvdW50ZXIgdHdvIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBuYW1lc3BhY2UKKwkgaGVyZSwgYmVjYXVzZSBibG9ja3MgY29udGFpbmluZyBhcmd1bWVudCBzeW1ib2xzIGFyZSBubworCSBsb25nZXIgc29ydGVkLiAgKi8KKworICAgICAgdG9wID0gQkxPQ0tfTlNZTVMgKGJsb2NrKTsKKyAgICAgIHdoaWxlIChib3QgPCB0b3ApCisJeworCSAgc3ltID0gQkxPQ0tfU1lNIChibG9jaywgYm90KTsKKwkgIGluYyA9IFNZTUJPTF9OQU1FIChzeW0pWzBdIC0gbmFtZVswXTsKKwkgIGlmIChpbmMgPT0gMCkKKwkgICAgeworCSAgICAgIGluYyA9IFNUUkNNUCAoU1lNQk9MX05BTUUgKHN5bSksIG5hbWUpOworCSAgICB9CisJICBpZiAoaW5jID09IDAgJiYgU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9PSBuYW1lc3BhY2UpCisJICAgIHsKKwkgICAgICByZXR1cm4gKHN5bSk7CisJICAgIH0KKwkgIGlmIChpbmMgPiAwKQorCSAgICB7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGJvdCsrOworCX0KKyAgICB9CisKKyAgLyogSGVyZSBpZiBibG9jayBpc24ndCBzb3J0ZWQsIG9yIHdlIGZhaWwgdG8gZmluZCBhIG1hdGNoIGR1cmluZyB0aGUKKyAgICAgYmluYXJ5IHNlYXJjaCBhYm92ZS4gIElmIGR1cmluZyB0aGUgYmluYXJ5IHNlYXJjaCBhYm92ZSwgd2UgZmluZCBhCisgICAgIHN5bWJvbCB3aGljaCBpcyBhIEMrKyBzeW1ib2wsIHRoZW4gd2UgaGF2ZSByZS1lbmFibGVkIHRoZSBsaW5lYXIKKyAgICAgc2VhcmNoIGZsYWcgd2hpY2ggd2FzIHJlc2V0IHdoZW4gc3RhcnRpbmcgdGhlIGJpbmFyeSBzZWFyY2guCisKKyAgICAgVGhpcyBsb29wIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGxvb3AgYWJvdmUsIGJ1dCBoYWNrZWQgZ3JlYXRseSBmb3Igc3BlZWQuCisKKyAgICAgTm90ZSB0aGF0IHBhcmFtZXRlciBzeW1ib2xzIGRvIG5vdCBhbHdheXMgc2hvdyB1cCBsYXN0IGluIHRoZQorICAgICBsaXN0OyB0aGlzIGxvb3AgbWFrZXMgc3VyZSB0byB0YWtlIGFueXRoaW5nIGVsc2Ugb3RoZXIgdGhhbgorICAgICBwYXJhbWV0ZXIgc3ltYm9scyBmaXJzdDsgaXQgb25seSB1c2VzIHBhcmFtZXRlciBzeW1ib2xzIGFzIGEKKyAgICAgbGFzdCByZXNvcnQuICBOb3RlIHRoYXQgdGhpcyBvbmx5IHRha2VzIHVwIGV4dHJhIGNvbXB1dGF0aW9uCisgICAgIHRpbWUgb24gYSBtYXRjaC4gICovCisKKyAgaWYgKGRvX2xpbmVhcl9zZWFyY2gpCisgICAgeworICAgICAgdG9wID0gQkxPQ0tfTlNZTVMgKGJsb2NrKTsKKyAgICAgIGJvdCA9IDA7CisgICAgICB3aGlsZSAoYm90IDwgdG9wKQorCXsKKwkgIHN5bSA9IEJMT0NLX1NZTSAoYmxvY2ssIGJvdCk7CisJICBpZiAoU1lNQk9MX05BTUVTUEFDRSAoc3ltKSA9PSBuYW1lc3BhY2UgJiYKKwkgICAgICBTWU1CT0xfTUFUQ0hFU19OQU1FIChzeW0sIG5hbWUpKQorCSAgICB7CisJICAgICAgLyogSWYgU1lNIGhhcyBhbGlhc2VzLCB0aGVuIHVzZSBhbnkgYWxpYXMgdGhhdCBpcyBhY3RpdmUKKwkJIGF0IHRoZSBjdXJyZW50IFBDLiAgSWYgbm8gYWxpYXMgaXMgYWN0aXZlIGF0IHRoZSBjdXJyZW50CisJCSBQQywgdGhlbiB1c2UgdGhlIG1haW4gc3ltYm9sLgorCisJCSA/IT8gSXMgY2hlY2tpbmcgdGhlIGN1cnJlbnQgcGMgY29ycmVjdD8gIElzIHRoaXMgcm91dGluZQorCQkgZXZlciBjYWxsZWQgdG8gbG9vayB1cCBhIHN5bWJvbCBmcm9tIGFub3RoZXIgY29udGV4dD8gICovCisgICAgICAgICAgICAgIGlmIChTWU1CT0xfQUxJQVNFUyAoc3ltKSkKKyAgICAgICAgICAgICAgICBzeW0gPSBmaW5kX2FjdGl2ZV9hbGlhcyAoc3ltLCByZWFkX3BjICgpKTsKKworCSAgICAgIHN5bV9mb3VuZCA9IHN5bTsKKwkgICAgICBpZiAoU1lNQk9MX0NMQVNTIChzeW0pICE9IExPQ19BUkcgJiYKKwkJICBTWU1CT0xfQ0xBU1MgKHN5bSkgIT0gTE9DX0xPQ0FMX0FSRyAmJgorCQkgIFNZTUJPTF9DTEFTUyAoc3ltKSAhPSBMT0NfUkVGX0FSRyAmJgorCQkgIFNZTUJPTF9DTEFTUyAoc3ltKSAhPSBMT0NfUkVHUEFSTSAmJgorCQkgIFNZTUJPTF9DTEFTUyAoc3ltKSAhPSBMT0NfUkVHUEFSTV9BRERSICYmCisJCSAgU1lNQk9MX0NMQVNTIChzeW0pICE9IExPQ19CQVNFUkVHX0FSRykKKwkJeworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwkgIGJvdCsrOworCX0KKyAgICB9CisgIHJldHVybiAoc3ltX2ZvdW5kKTsJCS8qIFdpbGwgYmUgTlVMTCBpZiBub3QgZm91bmQuICovCit9CisKKy8qIEdpdmVuIGEgbWFpbiBzeW1ib2wgU1lNIGFuZCBBRERSLCBzZWFyY2ggdGhyb3VnaCB0aGUgYWxpYXMKKyAgIGxpc3QgdG8gZGV0ZXJtaW5lIGlmIGFuIGFsaWFzIGlzIGFjdGl2ZSBhdCBBRERSIGFuZCByZXR1cm4KKyAgIHRoZSBhY3RpdmUgYWxpYXMuCisKKyAgIElmIG5vIGFsaWFzIGlzIGFjdGl2ZSwgdGhlbiByZXR1cm4gU1lNLiAgKi8KKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKgorZmluZF9hY3RpdmVfYWxpYXMgKHN5bSwgYWRkcikKKyAgc3RydWN0IHN5bWJvbCAqc3ltOworICBDT1JFX0FERFIgYWRkcjsKK3sKKyAgc3RydWN0IHJhbmdlX2xpc3QgKnI7CisgIHN0cnVjdCBhbGlhc19saXN0ICphbGlhc2VzOworCisgIC8qIElmIHdlIGhhdmUgYWxpYXNlcywgY2hlY2sgdGhlbSBmaXJzdC4gICovCisgIGFsaWFzZXMgPSBTWU1CT0xfQUxJQVNFUyAoc3ltKTsKKworICB3aGlsZSAoYWxpYXNlcykKKyAgICB7CisgICAgICBpZiAoIVNZTUJPTF9SQU5HRVMgKGFsaWFzZXMtPnN5bSkpCisgICAgICAgIHJldHVybiBhbGlhc2VzLT5zeW07CisgICAgICBmb3IgKHIgPSBTWU1CT0xfUkFOR0VTIChhbGlhc2VzLT5zeW0pOyByOyByID0gci0+bmV4dCkKKwl7CisJICBpZiAoci0+c3RhcnQgPD0gYWRkciAmJiByLT5lbmQgPiBhZGRyKQorCSAgICByZXR1cm4gYWxpYXNlcy0+c3ltOworCX0KKyAgICAgIGFsaWFzZXMgPSBhbGlhc2VzLT5uZXh0OworICAgIH0KKworICAvKiBOb3RoaW5nIGZvdW5kLCByZXR1cm4gdGhlIG1haW4gc3ltYm9sLiAgKi8KKyAgcmV0dXJuIHN5bTsKK30KKworDAorLyogUmV0dXJuIHRoZSBzeW1ib2wgZm9yIHRoZSBmdW5jdGlvbiB3aGljaCBjb250YWlucyBhIHNwZWNpZmllZAorICAgbGV4aWNhbCBibG9jaywgZGVzY3JpYmVkIGJ5IGEgc3RydWN0IGJsb2NrIEJMLiAgKi8KKworc3RydWN0IHN5bWJvbCAqCitibG9ja19mdW5jdGlvbiAoYmwpCisgICAgIHN0cnVjdCBibG9jayAqYmw7Cit7CisgIHdoaWxlIChCTE9DS19GVU5DVElPTiAoYmwpID09IDAgJiYgQkxPQ0tfU1VQRVJCTE9DSyAoYmwpICE9IDApCisgICAgYmwgPSBCTE9DS19TVVBFUkJMT0NLIChibCk7CisKKyAgcmV0dXJuIEJMT0NLX0ZVTkNUSU9OIChibCk7Cit9CisKKy8qIEZpbmQgdGhlIHN5bXRhYiBhc3NvY2lhdGVkIHdpdGggUEMgYW5kIFNFQ1RJT04uICBMb29rIHRocm91Z2ggdGhlCisgICBwc3ltdGFicyBhbmQgcmVhZCBpbiBhbm90aGVyIHN5bXRhYiBpZiBuZWNlc3NhcnkuICovCisKK3N0cnVjdCBzeW10YWIgKgorZmluZF9wY19zZWN0X3N5bXRhYiAocGMsIHNlY3Rpb24pCisgICAgIENPUkVfQUREUiBwYzsKKyAgICAgYXNlY3Rpb24gKnNlY3Rpb247Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBibG9jayAqYjsKKyAgc3RydWN0IGJsb2NrdmVjdG9yICpidjsKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bXRhYiAqcyA9IE5VTEw7CisgIHJlZ2lzdGVyIHN0cnVjdCBzeW10YWIgKmJlc3RfcyA9IE5VTEw7CisgIHJlZ2lzdGVyIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHM7CisgIHJlZ2lzdGVyIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICBDT1JFX0FERFIgZGlzdGFuY2UgPSAwOworCisgIC8qIFNlYXJjaCBhbGwgc3ltdGFicyBmb3IgdGhlIG9uZSB3aG9zZSBmaWxlIGNvbnRhaW5zIG91ciBhZGRyZXNzLCBhbmQgd2hpY2gKKyAgICAgaXMgdGhlIHNtYWxsZXN0IG9mIGFsbCB0aGUgb25lcyBjb250YWluaW5nIHRoZSBhZGRyZXNzLiAgVGhpcyBpcyBkZXNpZ25lZAorICAgICB0byBkZWFsIHdpdGggYSBjYXNlIGxpa2Ugc3ltdGFiIGEgaXMgYXQgMHgxMDAwLTB4MjAwMCBhbmQgMHgzMDAwLTB4NDAwMAorICAgICBhbmQgc3ltdGFiIGIgaXMgYXQgMHgyMDAwLTB4MzAwMC4gIFNvIHRoZSBHTE9CQUxfQkxPQ0sgZm9yIGEgaXMgZnJvbQorICAgICAweDEwMDAtMHg0MDAwLCBidXQgZm9yIGFkZHJlc3MgMHgyMzQ1IHdlIHdhbnQgdG8gcmV0dXJuIHN5bXRhYiBiLgorCisgICAgIFRoaXMgaGFwcGVucyBmb3IgbmF0aXZlIGVjb2ZmIGZvcm1hdCwgd2hlcmUgY29kZSBmcm9tIGluY2x1ZGVkIGZpbGVzCisgICAgIGdldHMgaXRzIG93biBzeW10YWIuIFRoZSBzeW10YWIgZm9yIHRoZSBpbmNsdWRlZCBmaWxlIHNob3VsZCBoYXZlCisgICAgIGJlZW4gcmVhZCBpbiBhbHJlYWR5IHZpYSB0aGUgZGVwZW5kZW5jeSBtZWNoYW5pc20uCisgICAgIEl0IG1pZ2h0IGJlIHN3aWZ0ZXIgdG8gY3JlYXRlIHNldmVyYWwgc3ltdGFicyB3aXRoIHRoZSBzYW1lIG5hbWUKKyAgICAgbGlrZSB4Y29mZiBkb2VzIChJJ20gbm90IHN1cmUpLgorCisgICAgIEl0IGFsc28gaGFwcGVucyBmb3Igb2JqZmlsZXMgdGhhdCBoYXZlIHRoZWlyIGZ1bmN0aW9ucyByZW9yZGVyZWQuCisgICAgIEZvciB0aGVzZSwgdGhlIHN5bXRhYiB3ZSBhcmUgbG9va2luZyBmb3IgaXMgbm90IG5lY2Vzc2FyaWx5IHJlYWQgaW4uICAqLworCisgIEFMTF9TWU1UQUJTIChvYmpmaWxlLCBzKQorICAgIHsKKyAgICAgIGJ2ID0gQkxPQ0tWRUNUT1IgKHMpOworICAgICAgYiA9IEJMT0NLVkVDVE9SX0JMT0NLIChidiwgR0xPQkFMX0JMT0NLKTsKKworICAgICAgaWYgKEJMT0NLX1NUQVJUIChiKSA8PSBwYworI2lmIGRlZmluZWQoSFBVWEhQUEEpCisJICAmJiBCTE9DS19FTkQgKGIpID49IHBjCisjZWxzZQorCSAgJiYgQkxPQ0tfRU5EIChiKSA+IHBjCisjZW5kaWYKKwkgICYmIChkaXN0YW5jZSA9PSAwCisJICAgICAgfHwgQkxPQ0tfRU5EIChiKSAtIEJMT0NLX1NUQVJUIChiKSA8IGRpc3RhbmNlKSkKKwl7CisJICAvKiBGb3IgYW4gb2JqZmlsZSB0aGF0IGhhcyBpdHMgZnVuY3Rpb25zIHJlb3JkZXJlZCwKKwkgICAgIGZpbmRfcGNfcHN5bXRhYiB3aWxsIGZpbmQgdGhlIHByb3BlciBwYXJ0aWFsIHN5bWJvbCB0YWJsZQorCSAgICAgYW5kIHdlIHNpbXBseSByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgc3ltdGFiLiAgKi8KKwkgIC8qIEluIG9yZGVyIHRvIGJldHRlciBzdXBwb3J0IG9iamZpbGVzIHRoYXQgY29udGFpbiBib3RoCisJICAgICBzdGFicyBhbmQgY29mZiBkZWJ1Z2dpbmcgaW5mbywgd2UgY29udGludWUgb24gaWYgYSBwc3ltdGFiCisJICAgICBjYW4ndCBiZSBmb3VuZC4gKi8KKwkgIGlmICgob2JqZmlsZS0+ZmxhZ3MgJiBPQkpGX1JFT1JERVJFRCkgJiYgb2JqZmlsZS0+cHN5bXRhYnMpCisJICAgIHsKKwkgICAgICBwcyA9IGZpbmRfcGNfc2VjdF9wc3ltdGFiIChwYywgc2VjdGlvbik7CisJICAgICAgaWYgKHBzKQorCQlyZXR1cm4gUFNZTVRBQl9UT19TWU1UQUIgKHBzKTsKKwkgICAgfQorCSAgaWYgKHNlY3Rpb24gIT0gMCkKKwkgICAgeworCSAgICAgIGludCBpOworCisJICAgICAgZm9yIChpID0gMDsgaSA8IGItPm5zeW1zOyBpKyspCisJCXsKKwkJICBmaXh1cF9zeW1ib2xfc2VjdGlvbiAoYi0+c3ltW2ldLCBvYmpmaWxlKTsKKwkJICBpZiAoc2VjdGlvbiA9PSBTWU1CT0xfQkZEX1NFQ1RJT04gKGItPnN5bVtpXSkpCisJCSAgICBicmVhazsKKwkJfQorCSAgICAgIGlmIChpID49IGItPm5zeW1zKQorCQljb250aW51ZTsJLyogbm8gc3ltYm9sIGluIHRoaXMgc3ltdGFiIG1hdGNoZXMgc2VjdGlvbiAqLworCSAgICB9CisJICBkaXN0YW5jZSA9IEJMT0NLX0VORCAoYikgLSBCTE9DS19TVEFSVCAoYik7CisJICBiZXN0X3MgPSBzOworCX0KKyAgICB9CisKKyAgaWYgKGJlc3RfcyAhPSBOVUxMKQorICAgIHJldHVybihiZXN0X3MpOworCisgIHMgPSBOVUxMOworICBwcyA9IGZpbmRfcGNfc2VjdF9wc3ltdGFiIChwYywgc2VjdGlvbik7CisgIGlmIChwcykKKyAgICB7CisgICAgICBpZiAocHMtPnJlYWRpbikKKwkvKiBNaWdodCB3YW50IHRvIGVycm9yKCkgaGVyZSAoaW4gY2FzZSBzeW10YWIgaXMgY29ycnVwdCBhbmQKKwkgICB3aWxsIGNhdXNlIGEgY29yZSBkdW1wKSwgYnV0IG1heWJlIHdlIGNhbiBzdWNjZXNzZnVsbHkKKwkgICBjb250aW51ZSwgc28gbGV0J3Mgbm90LiAgKi8KKwkvKiBGSVhNRS0zMng2NDogYXNzdW1lcyBwYyBmaXRzIGluIGEgbG9uZyAqLworCXdhcm5pbmcgKCJcCisoSW50ZXJuYWwgZXJyb3I6IHBjIDB4JWx4IGluIHJlYWQgaW4gcHN5bXRhYiwgYnV0IG5vdCBpbiBzeW10YWIuKVxuIiwKKwkgICAgICAgICAodW5zaWduZWQgbG9uZykgcGMpOworICAgICAgcyA9IFBTWU1UQUJfVE9fU1lNVEFCIChwcyk7CisgICAgfQorICByZXR1cm4gKHMpOworfQorCisvKiBGaW5kIHRoZSBzeW10YWIgYXNzb2NpYXRlZCB3aXRoIFBDLiAgTG9vayB0aHJvdWdoIHRoZSBwc3ltdGFicyBhbmQKKyAgIHJlYWQgaW4gYW5vdGhlciBzeW10YWIgaWYgbmVjZXNzYXJ5LiAgQmFja3dhcmQgY29tcGF0aWJpbGl0eSwgbm8gc2VjdGlvbiAqLworCitzdHJ1Y3Qgc3ltdGFiICoKK2ZpbmRfcGNfc3ltdGFiIChwYykKKyAgICAgQ09SRV9BRERSIHBjOworeworICByZXR1cm4gZmluZF9wY19zZWN0X3N5bXRhYiAocGMsIGZpbmRfcGNfbWFwcGVkX3NlY3Rpb24gKHBjKSk7Cit9CisKKwwKKyNpZiAwCisKKy8qIEZpbmQgdGhlIGNsb3Nlc3Qgc3ltYm9sIHZhbHVlIChvZiBhbnkgc29ydCAtLSBmdW5jdGlvbiBvciB2YXJpYWJsZSkKKyAgIGZvciBhIGdpdmVuIGFkZHJlc3MgdmFsdWUuICBTbG93IGJ1dCBjb21wbGV0ZS4gIChjdXJyZW50bHkgdW51c2VkLAorICAgbWFpbmx5IGJlY2F1c2UgaXQgaXMgdG9vIHNsb3cuICBXZSBjb3VsZCBmaXggaXQgaWYgZWFjaCBzeW10YWIgYW5kCisgICBwc3ltdGFiIGhhZCBjb250YWluZWQgaW4gaXQgdGhlIGFkZHJlc3NlcyByYW5nZXMgb2YgZWFjaCBvZiBpdHMKKyAgIHNlY3Rpb25zLCB3aGljaCBhbHNvIHdvdWxkIGJlIHJlcXVpcmVkIHRvIG1ha2UgdGhpbmdzIGxpa2UgImluZm8KKyAgIGxpbmUgKjB4MjM0NSIgY2F1c2UgcHN5bXRhYnMgdG8gYmUgY29udmVydGVkIHRvIHN5bXRhYnMpLiAgKi8KKworc3RydWN0IHN5bWJvbCAqCitmaW5kX2FkZHJfc3ltYm9sIChhZGRyLCBzeW10YWJwLCBzeW1hZGRycCkKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIHN0cnVjdCBzeW10YWIgKipzeW10YWJwOworICAgICBDT1JFX0FERFIgKnN5bWFkZHJwOworeworICBzdHJ1Y3Qgc3ltdGFiICpzeW10YWIsICpiZXN0X3N5bXRhYjsKKyAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgIHJlZ2lzdGVyIGludCBib3QsIHRvcDsKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bWJvbCAqc3ltOworICByZWdpc3RlciBDT1JFX0FERFIgc3ltX2FkZHI7CisgIHN0cnVjdCBibG9jayAqYmxvY2s7CisgIGludCBibG9ja251bTsKKworICAvKiBJbmZvIG9uIGJlc3Qgc3ltYm9sIHNlZW4gc28gZmFyICovCisKKyAgcmVnaXN0ZXIgQ09SRV9BRERSIGJlc3Rfc3ltX2FkZHIgPSAwOworICBzdHJ1Y3Qgc3ltYm9sICpiZXN0X3N5bSA9IDA7CisKKyAgLyogRklYTUUgLS0gd2Ugc2hvdWxkIHB1bGwgaW4gYWxsIHRoZSBwc3ltdGFicywgdG9vISAgKi8KKyAgQUxMX1NZTVRBQlMgKG9iamZpbGUsIHN5bXRhYikKKyAgICB7CisgICAgICAvKiBTZWFyY2ggdGhlIGdsb2JhbCBhbmQgc3RhdGljIGJsb2NrcyBpbiB0aGlzIHN5bXRhYiBmb3IKKwkgdGhlIGNsb3Nlc3Qgc3ltYm9sLWFkZHJlc3MgdG8gdGhlIGRlc2lyZWQgYWRkcmVzcy4gICovCisKKyAgICAgIGZvciAoYmxvY2tudW0gPSBHTE9CQUxfQkxPQ0s7IGJsb2NrbnVtIDw9IFNUQVRJQ19CTE9DSzsgYmxvY2tudW0rKykKKwl7CisJICBRVUlUOworCSAgYmxvY2sgPSBCTE9DS1ZFQ1RPUl9CTE9DSyAoQkxPQ0tWRUNUT1IgKHN5bXRhYiksIGJsb2NrbnVtKTsKKwkgIHRvcCA9IEJMT0NLX05TWU1TIChibG9jayk7CisJICBmb3IgKGJvdCA9IDA7IGJvdCA8IHRvcDsgYm90KyspCisJICAgIHsKKwkgICAgICBzeW0gPSBCTE9DS19TWU0gKGJsb2NrLCBib3QpOworCSAgICAgIHN3aXRjaCAoU1lNQk9MX0NMQVNTIChzeW0pKQorCQl7CisJCWNhc2UgTE9DX1NUQVRJQzoJCisJCWNhc2UgTE9DX0xBQkVMOgkKKwkJICBzeW1fYWRkciA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChzeW0pOworCQkgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBMT0NfSU5ESVJFQ1Q6CisJCSAgc3ltX2FkZHIgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltKTsKKyAgICAgICAgICAgICAgICAgIC8qIEFuIGluZGlyZWN0IHN5bWJvbCByZWFsbHkgbGl2ZXMgYXQgKnN5bV9hZGRyLAorICAgICAgICAgICAgICAgICAgICogc28gYW4gaW5kaXJlY3Rpb24gbmVlZHMgdG8gYmUgZG9uZS4KKyAgICAgICAgICAgICAgICAgICAqIEhvd2V2ZXIsIEkgYW0gbGVhdmluZyB0aGlzIGNvbW1lbnRlZCBvdXQgYmVjYXVzZSBpdCdzCisgICAgICAgICAgICAgICAgICAgKiBleHBlbnNpdmUsIGFuZCBpdCdzIHBvc3NpYmxlIHRoYXQgc3ltYm9saXphdGlvbgorICAgICAgICAgICAgICAgICAgICogY291bGQgYmUgZG9uZSB3aXRob3V0IGFuIGFjdGl2ZSBwcm9jZXNzIChpbgorICAgICAgICAgICAgICAgICAgICogY2FzZSB0aGlzIHJlYWRfbWVtb3J5IHdpbGwgZmFpbCkuIFJUCisgICAgICAgICAgICAgICAgICBzeW1fYWRkciA9IHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgICAoc3ltX2FkZHIsIFRBUkdFVF9QVFJfQklUIC8gVEFSR0VUX0NIQVJfQklUKTsKKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJY2FzZSBMT0NfQkxPQ0s6CisJCSAgc3ltX2FkZHIgPSBCTE9DS19TVEFSVCAoU1lNQk9MX0JMT0NLX1ZBTFVFIChzeW0pKTsKKwkJICBicmVhazsKKworCQlkZWZhdWx0OgorCQkgIGNvbnRpbnVlOworCQl9CisKKwkJaWYgKHN5bV9hZGRyIDw9IGFkZHIpCisJCSAgaWYgKHN5bV9hZGRyID4gYmVzdF9zeW1fYWRkcikKKwkJICAgIHsKKwkJICAgICAgLyogUXVpdCBpZiB3ZSBmb3VuZCBhbiBleGFjdCBtYXRjaC4gICovCisJCSAgICAgIGJlc3Rfc3ltID0gc3ltOworCQkgICAgICBiZXN0X3N5bV9hZGRyID0gc3ltX2FkZHI7CisJCSAgICAgIGJlc3Rfc3ltdGFiID0gc3ltdGFiOworCQkgICAgICBpZiAoc3ltX2FkZHIgPT0gYWRkcikKKwkJCWdvdG8gZG9uZTsKKwkJICAgIH0KKwkgICAgfQorCX0KKyAgICB9CisKKyBkb25lOgorICBpZiAoc3ltdGFicCkKKyAgICAqc3ltdGFicCA9IGJlc3Rfc3ltdGFiOworICBpZiAoc3ltYWRkcnApCisgICAgKnN5bWFkZHJwID0gYmVzdF9zeW1fYWRkcjsKKyAgcmV0dXJuIGJlc3Rfc3ltOworfQorI2VuZGlmIC8qIDAgKi8KKworLyogRmluZCB0aGUgc291cmNlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZvciBhIGdpdmVuIFBDIHZhbHVlIGFuZCBzZWN0aW9uLgorICAgUmV0dXJuIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgYSBzeW10YWIgcG9pbnRlciwgYSBsaW5lIG51bWJlciwKKyAgIGFuZCBhIHBjIHJhbmdlIGZvciB0aGUgZW50aXJlIHNvdXJjZSBsaW5lLgorICAgVGhlIHZhbHVlJ3MgLnBjIGZpZWxkIGlzIE5PVCB0aGUgc3BlY2lmaWVkIHBjLgorICAgTk9UQ1VSUkVOVCBub256ZXJvIG1lYW5zLCBpZiBzcGVjaWZpZWQgcGMgaXMgb24gYSBsaW5lIGJvdW5kYXJ5LAorICAgdXNlIHRoZSBsaW5lIHRoYXQgZW5kcyB0aGVyZS4gIE90aGVyd2lzZSwgaW4gdGhhdCBjYXNlLCB0aGUgbGluZQorICAgdGhhdCBiZWdpbnMgdGhlcmUgaXMgdXNlZC4gICovCisKKy8qIFRoZSBiaWcgY29tcGxpY2F0aW9uIGhlcmUgaXMgdGhhdCBhIGxpbmUgbWF5IHN0YXJ0IGluIG9uZSBmaWxlLCBhbmQgZW5kIGp1c3QKKyAgIGJlZm9yZSB0aGUgc3RhcnQgb2YgYW5vdGhlciBmaWxlLiAgVGhpcyB1c3VhbGx5IG9jY3VycyB3aGVuIHlvdSAjaW5jbHVkZQorICAgY29kZSBpbiB0aGUgbWlkZGxlIG9mIGEgc3Vicm91dGluZS4gIFRvIHByb3Blcmx5IGZpbmQgdGhlIGVuZCBvZiBhIGxpbmUncyBQQworICAgcmFuZ2UsIHdlIG11c3Qgc2VhcmNoIGFsbCBzeW10YWJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbXBpbGF0aW9uIHVuaXQsIGFuZAorICAgZmluZCB0aGUgb25lIHdob3NlIGZpcnN0IFBDIGlzIGNsb3NlciB0aGFuIHRoYXQgb2YgdGhlIG5leHQgbGluZSBpbiB0aGlzCisgICBzeW10YWIuICAqLworCisvKiBJZiBpdCdzIHdvcnRoIHRoZSBlZmZvcnQsIHdlIGNvdWxkIGJlIHVzaW5nIGEgYmluYXJ5IHNlYXJjaC4gICovCisKK3N0cnVjdCBzeW10YWJfYW5kX2xpbmUKK2ZpbmRfcGNfc2VjdF9saW5lIChwYywgc2VjdGlvbiwgbm90Y3VycmVudCkKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBzdHJ1Y3Qgc2VjICpzZWN0aW9uOworICAgICBpbnQgbm90Y3VycmVudDsKK3sKKyAgc3RydWN0IHN5bXRhYiAqczsKKyAgcmVnaXN0ZXIgc3RydWN0IGxpbmV0YWJsZSAqbDsKKyAgcmVnaXN0ZXIgaW50IGxlbjsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIHN0cnVjdCBsaW5ldGFibGVfZW50cnkgKml0ZW07CisgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgdmFsOworICBzdHJ1Y3QgYmxvY2t2ZWN0b3IgKmJ2OworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbWZ1bnN5bTsKKworICAvKiBJbmZvIG9uIGJlc3QgbGluZSBzZWVuIHNvIGZhciwgYW5kIHdoZXJlIGl0IHN0YXJ0cywgYW5kIGl0cyBmaWxlLiAgKi8KKworICBzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5ICpiZXN0ID0gTlVMTDsKKyAgQ09SRV9BRERSIGJlc3RfZW5kID0gMDsKKyAgc3RydWN0IHN5bXRhYiAqYmVzdF9zeW10YWIgPSAwOworCisgIC8qIFN0b3JlIGhlcmUgdGhlIGZpcnN0IGxpbmUgbnVtYmVyCisgICAgIG9mIGEgZmlsZSB3aGljaCBjb250YWlucyB0aGUgbGluZSBhdCB0aGUgc21hbGxlc3QgcGMgYWZ0ZXIgUEMuCisgICAgIElmIHdlIGRvbid0IGZpbmQgYSBsaW5lIHdob3NlIHJhbmdlIGNvbnRhaW5zIFBDLAorICAgICB3ZSB3aWxsIHVzZSBhIGxpbmUgb25lIGxlc3MgdGhhbiB0aGlzLAorICAgICB3aXRoIGEgcmFuZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhhdCBmaWxlIHRvIHRoZSBmaXJzdCBsaW5lJ3MgcGMuICAqLworICBzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5ICphbHQgPSBOVUxMOworICBzdHJ1Y3Qgc3ltdGFiICphbHRfc3ltdGFiID0gMDsKKworICAvKiBJbmZvIG9uIGJlc3QgbGluZSBzZWVuIGluIHRoaXMgZmlsZS4gICovCisKKyAgc3RydWN0IGxpbmV0YWJsZV9lbnRyeSAqcHJldjsKKworICAvKiBJZiB0aGlzIHBjIGlzIG5vdCBmcm9tIHRoZSBjdXJyZW50IGZyYW1lLAorICAgICBpdCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIGEgY2FsbCBpbnN0cnVjdGlvbi4KKyAgICAgUXVpdGUgbGlrZWx5IHRoYXQgaXMgdGhlIHN0YXJ0IG9mIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50LgorICAgICBCdXQgd2hhdCB3ZSB3YW50IGlzIHRoZSBzdGF0ZW1lbnQgY29udGFpbmluZyB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgIEZ1ZGdlIHRoZSBwYyB0byBtYWtlIHN1cmUgd2UgZ2V0IHRoYXQuICAqLworCisgIElOSVRfU0FMICgmdmFsKTsJLyogaW5pdGlhbGl6ZSB0byB6ZXJvZXMgKi8KKworICBpZiAobm90Y3VycmVudCkKKyAgICBwYyAtPSAxOworCisgLyogZWx6OiBhZGRlZCB0aGlzIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiByZXR1cm5lZCB0aGUgd3JvbmcKKyAgICAgaW5mb3JtYXRpb24gaWYgdGhlIHBjIGJlbG9uZ3MgdG8gYSBzdHViIChpbXBvcnQvZXhwb3J0KQorICAgICB0byBjYWxsIGEgc2hsaWIgZnVuY3Rpb24uIFRoaXMgc3R1YiB3b3VsZCBiZSBhbnl3aGVyZSBiZXR3ZWVuCisgICAgIHR3byBmdW5jdGlvbnMgaW4gdGhlIHRhcmdldCwgYW5kIHRoZSBsaW5lIGluZm8gd2FzIGVycm9uZW91c2x5IAorICAgICB0YWtlbiB0byBiZSB0aGUgb25lIG9mIHRoZSBsaW5lIGJlZm9yZSB0aGUgcGMuIAorICAqLworICAvKiBSVDogRnVydGhlciBleHBsYW5hdGlvbjoKKyAgICoKKyAgICogV2UgaGF2ZSBzdHVicyAodHJhbXBvbGluZXMpIGluc2VydGVkIGJldHdlZW4gcHJvY2VkdXJlcy4KKyAgICoKKyAgICogRXhhbXBsZTogInNocjEiIGV4aXN0cyBpbiBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgYSAic2hyMSIgc3R1YiBhbHNvCisgICAqIGV4aXN0cyBpbiB0aGUgbWFpbiBpbWFnZS4KKyAgICoKKyAgICogSW4gdGhlIG1pbmltYWwgc3ltYm9sIHRhYmxlLCB3ZSBoYXZlIGEgYnVuY2ggb2Ygc3ltYm9scworICAgKiBzb3J0ZWQgYnkgc3RhcnQgYWRkcmVzcy4gVGhlIHN0dWJzIGFyZSBtYXJrZWQgYXMgInRyYW1wb2xpbmUiLAorICAgKiB0aGUgb3RoZXJzIGFwcGVhciBhcyB0ZXh0LiBFLmcuOgorICAgKgorICAgKiAgTWluaW1hbCBzeW1ib2wgdGFibGUgZm9yIG1haW4gaW1hZ2UgCisgICAqICAgICBtYWluOiAgY29kZSBmb3IgbWFpbiAodGV4dCBzeW1ib2wpCisgICAqICAgICBzaHIxOiBzdHViICAodHJhbXBvbGluZSBzeW1ib2wpCisgICAqICAgICBmb286ICAgY29kZSBmb3IgZm9vICh0ZXh0IHN5bWJvbCkKKyAgICogICAgIC4uLgorICAgKiAgTWluaW1hbCBzeW1ib2wgdGFibGUgZm9yICJzaHIxIiBpbWFnZToKKyAgICogICAgIC4uLgorICAgKiAgICAgc2hyMTogY29kZSBmb3Igc2hyMSAodGV4dCBzeW1ib2wpCisgICAqICAgICAuLi4KKyAgICoKKyAgICogU28gdGhlIGNvZGUgYmVsb3cgaXMgdHJ5aW5nIHRvIGRldGVjdCBpZiB3ZSBhcmUgaW4gdGhlIHN0dWIKKyAgICogKCJzaHIxIiBzdHViKSwgYW5kIGlmIHNvLCBmaW5kIHRoZSByZWFsIGNvZGUgKCJzaHIxIiB0cmFtcG9saW5lKSwKKyAgICogYW5kIGlmIGZvdW5kLCAgZG8gdGhlIHN5bWJvbGl6YXRpb24gZnJvbSB0aGUgcmVhbC1jb2RlIGFkZHJlc3MKKyAgICogcmF0aGVyIHRoYW4gdGhlIHN0dWIgYWRkcmVzcy4KKyAgICoKKyAgICogQXNzdW1wdGlvbnMgYmVpbmcgbWFkZSBhYm91dCB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGU6CisgICAqICAgMS4gbG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjKCkgd2lsbCByZXR1cm4gYSB0cmFtcG9saW5lIG9ubHkKKyAgICogICAgICBpZiB3ZSdyZSByZWFsbHkgaW4gdGhlIHRyYW1wb2xpbmUuIElmIHdlJ3JlIGJleW9uZCBpdCAoc2F5CisgICAqICAgICAgd2UncmUgaW4gImZvbyIgaW4gdGhlIGFib3ZlIGV4YW1wbGUpLCBpdCdsbCBoYXZlIGEgY2xvc2VyIAorICAgKiAgICAgIHN5bWJvbCAodGhlICJmb28iIHRleHQgc3ltYm9sIGZvciBleGFtcGxlKSBhbmQgd2lsbCBub3QKKyAgICogICAgICByZXR1cm4gdGhlIHRyYW1wb2xpbmUuCisgICAqICAgMi4gbG9va3VwX21pbmltYWxfc3ltYm9sX3RleHQoKSB3aWxsIGZpbmQgYSByZWFsIHRleHQgc3ltYm9sCisgICAqICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgdHJhbXBvbGluZSwgYW5kIHdob3NlIGFkZHJlc3Mgd2lsbAorICAgKiAgICAgIGJlIGRpZmZlcmVudCB0aGFuIHRoZSB0cmFtcG9saW5lIGFkZHJlc3MuIEkgcHV0IGluIGEgc2FuaXR5CisgICAqICAgICAgY2hlY2sgZm9yIHRoZSBhZGRyZXNzIGJlaW5nIHRoZSBzYW1lLCB0byBhdm9pZCBhbgorICAgKiAgICAgIGluZmluaXRlIHJlY3Vyc2lvbi4KKyAgICovCisgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGMocGMpOworICBpZiAobXN5bWJvbCAhPSBOVUxMKSAKKyAgICBpZiAoTVNZTUJPTF9UWVBFIChtc3ltYm9sKSA9PSBtc3Rfc29saWJfdHJhbXBvbGluZSkKKyAgICB7CisgICAgIG1mdW5zeW0gPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfdGV4dCAoU1lNQk9MX05BTUUgKG1zeW1ib2wpLCBOVUxMLCBOVUxMKTsKKyAgICAgaWYgKG1mdW5zeW0gPT0gTlVMTCkgCisgICAgICAgIC8qIEkgZWxpbWluYXRlZCB0aGlzIHdhcm5pbmcgc2luY2UgaXQgaXMgY29taW5nIG91dAorICAgICAgICAgKiBpbiB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbjoKKyAgICAgICAgICogZ2RiIHNobWFpbiAvLyB0ZXN0IHByb2dyYW0gd2l0aCBzaGFyZWQgbGlicmFyaWVzCisgICAgICAgICAqIChnZGIpIGJyZWFrIHNocjEgIC8vIGZ1bmN0aW9uIGluIHNoYXJlZCBsaWIKKyAgICAgICAgICogV2FybmluZzogSW4gc3R1YiBmb3IgLi4uCisgICAgICAgICAqIEluIHRoZSBhYm92ZSBzaXR1YXRpb24sIHRoZSBzaGFyZWQgbGliIGlzIG5vdCBsb2FkZWQgeWV0LCAKKyAgICAgICAgICogc28gb2YgY291cnNlIHdlIGNhbid0IGZpbmQgdGhlIHJlYWwgZnVuYy9saW5lIGluZm8sCisgICAgICAgICAqIGJ1dCB0aGUgImJyZWFrIiBzdGlsbCB3b3JrcywgYW5kIHRoZSB3YXJuaW5nIGlzIGFubm95aW5nLgorICAgICAgICAgKiBTbyBJIGNvbW1lbnRlZCBvdXQgdGhlIHdhcm5pbmcuIFJUICovCisgICAgICAgIC8qIHdhcm5pbmcgKCJJbiBzdHViIGZvciAlczsgdW5hYmxlIHRvIGZpbmQgcmVhbCBmdW5jdGlvbi9saW5lIGluZm8iLCBTWU1CT0xfTkFNRShtc3ltYm9sKSkgKi87CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICBlbHNlIGlmIChTWU1CT0xfVkFMVUUobWZ1bnN5bSkgPT0gU1lNQk9MX1ZBTFVFKG1zeW1ib2wpKQorICAgICAgICAvKiBBdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gKi8KKyAgICAgICAgLyogU2VlIGFib3ZlIGNvbW1lbnQgYWJvdXQgd2h5IHdhcm5pbmcgaXMgY29tbWVudGVkIG91dCAqLworICAgICAgICAvKiB3YXJuaW5nICgiSW4gc3R1YiBmb3IgJXM7IHVuYWJsZSB0byBmaW5kIHJlYWwgZnVuY3Rpb24vbGluZSBpbmZvIiwgU1lNQk9MX05BTUUobXN5bWJvbCkpICovOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgZWxzZQorICAgICAgIHJldHVybiBmaW5kX3BjX2xpbmUoIFNZTUJPTF9WQUxVRSAobWZ1bnN5bSksIDApOworICAgIH0KKworCisgIHMgPSBmaW5kX3BjX3NlY3Rfc3ltdGFiIChwYywgc2VjdGlvbik7CisgIGlmICghcykKKyAgICB7CisgICAgICAvKiBpZiBubyBzeW1ib2wgaW5mb3JtYXRpb24sIHJldHVybiBwcmV2aW91cyBwYyAqLworICAgICAgaWYgKG5vdGN1cnJlbnQpCisJcGMrKzsKKyAgICAgIHZhbC5wYyA9IHBjOworICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgYnYgPSBCTE9DS1ZFQ1RPUiAocyk7CisKKyAgLyogTG9vayBhdCBhbGwgdGhlIHN5bXRhYnMgdGhhdCBzaGFyZSB0aGlzIGJsb2NrdmVjdG9yLgorICAgICBUaGV5IGFsbCBoYXZlIHRoZSBzYW1lIGFwcmlvcmkgcmFuZ2UsIHRoYXQgd2UgZm91bmQgd2FzIHJpZ2h0OworICAgICBidXQgdGhleSBoYXZlIGRpZmZlcmVudCBsaW5lIHRhYmxlcy4gICovCisKKyAgZm9yICg7IHMgJiYgQkxPQ0tWRUNUT1IgKHMpID09IGJ2OyBzID0gcy0+bmV4dCkKKyAgICB7CisgICAgICAvKiBGaW5kIHRoZSBiZXN0IGxpbmUgaW4gdGhpcyBzeW10YWIuICAqLworICAgICAgbCA9IExJTkVUQUJMRSAocyk7CisgICAgICBpZiAoIWwpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgbGVuID0gbC0+bml0ZW1zOworICAgICAgaWYgKGxlbiA8PSAwKQorCXsKKwkgIC8qIEkgdGhpbmsgbGVuIGNhbiBiZSB6ZXJvIGlmIHRoZSBzeW10YWIgbGFja3MgbGluZSBudW1iZXJzCisJICAgICAoZS5nLiBnY2MgLWcxKS4gIChFaXRoZXIgdGhhdCBvciB0aGUgTElORVRBQkxFIGlzIE5VTEw7CisJICAgICBJJ20gbm90IHN1cmUgd2hpY2gsIGFuZCBtYXliZSBpdCBkZXBlbmRzIG9uIHRoZSBzeW1ib2wKKwkgICAgIHJlYWRlcikuICAqLworCSAgY29udGludWU7CisJfQorCisgICAgICBwcmV2ID0gTlVMTDsKKyAgICAgIGl0ZW0gPSBsLT5pdGVtOwkJLyogR2V0IGZpcnN0IGxpbmUgaW5mbyAqLworCisgICAgICAvKiBJcyB0aGlzIGZpbGUncyBmaXJzdCBsaW5lIGNsb3NlciB0aGFuIHRoZSBmaXJzdCBsaW5lcyBvZiBvdGhlciBmaWxlcz8KKwkgSWYgc28sIHJlY29yZCB0aGlzIGZpbGUsIGFuZCBpdHMgZmlyc3QgbGluZSwgYXMgYmVzdCBhbHRlcm5hdGUuICAqLworICAgICAgaWYgKGl0ZW0tPnBjID4gcGMgJiYgKCFhbHQgfHwgaXRlbS0+cGMgPCBhbHQtPnBjKSkKKwl7CisJICBhbHQgPSBpdGVtOworCSAgYWx0X3N5bXRhYiA9IHM7CisJfQorCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyssIGl0ZW0rKykKKwl7CisJICAvKiBMZWF2ZSBwcmV2IHBvaW50aW5nIHRvIHRoZSBsaW5ldGFibGUgZW50cnkgZm9yIHRoZSBsYXN0IGxpbmUKKwkgICAgIHRoYXQgc3RhcnRlZCBhdCBvciBiZWZvcmUgUEMuICAqLworCSAgaWYgKGl0ZW0tPnBjID4gcGMpCisJICAgIGJyZWFrOworCisJICBwcmV2ID0gaXRlbTsKKwl9CisKKyAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIHByZXYgcG9pbnRzIGF0IHRoZSBsaW5lIHdob3NlIHN0YXJ0IGFkZHIgaXMgPD0gcGMsIGFuZAorCSBpdGVtIHBvaW50cyBhdCB0aGUgbmV4dCBsaW5lLiAgSWYgd2UgcmFuIG9mZiB0aGUgZW5kIG9mIHRoZSBsaW5ldGFibGUKKwkgKHBjID49IHN0YXJ0IG9mIHRoZSBsYXN0IGxpbmUpLCB0aGVuIHByZXYgPT0gaXRlbS4gIElmIHBjIDwgc3RhcnQgb2YKKwkgdGhlIGZpcnN0IGxpbmUsIHByZXYgd2lsbCBub3QgYmUgc2V0LiAgKi8KKworICAgICAgLyogSXMgdGhpcyBmaWxlJ3MgYmVzdCBsaW5lIGNsb3NlciB0aGFuIHRoZSBiZXN0IGluIHRoZSBvdGhlciBmaWxlcz8KKwkgSWYgc28sIHJlY29yZCB0aGlzIGZpbGUsIGFuZCBpdHMgYmVzdCBsaW5lLCBhcyBiZXN0IHNvIGZhci4gICovCisKKyAgICAgIGlmIChwcmV2ICYmICghYmVzdCB8fCBwcmV2LT5wYyA+IGJlc3QtPnBjKSkKKwl7CisJICBiZXN0ID0gcHJldjsKKwkgIGJlc3Rfc3ltdGFiID0gczsKKwkgIC8qIElmIGFub3RoZXIgbGluZSBpcyBpbiB0aGUgbGluZXRhYmxlLCBhbmQgaXRzIFBDIGlzIGNsb3NlcgorCSAgICAgdGhhbiB0aGUgYmVzdF9lbmQgd2UgY3VycmVudGx5IGhhdmUsIHRha2UgaXQgYXMgYmVzdF9lbmQuICAqLworCSAgaWYgKGkgPCBsZW4gJiYgKGJlc3RfZW5kID09IDAgfHwgYmVzdF9lbmQgPiBpdGVtLT5wYykpCisJICAgIGJlc3RfZW5kID0gaXRlbS0+cGM7CisJfQorICAgIH0KKworICBpZiAoIWJlc3Rfc3ltdGFiKQorICAgIHsKKyAgICAgIGlmICghYWx0X3N5bXRhYikKKwl7CQkJLyogSWYgd2UgZGlkbid0IGZpbmQgYW55IGxpbmUgIyBpbmZvLCBqdXN0CisJCQkJICAgcmV0dXJuIHplcm9zLiAgKi8KKwkgIHZhbC5wYyA9IHBjOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB2YWwuc3ltdGFiID0gYWx0X3N5bXRhYjsKKwkgIHZhbC5saW5lID0gYWx0LT5saW5lIC0gMTsKKworCSAgLyogRG9uJ3QgcmV0dXJuIGxpbmUgMCwgdGhhdCBtZWFucyB0aGF0IHdlIGRpZG4ndCBmaW5kIHRoZSBsaW5lLiAgKi8KKwkgIGlmICh2YWwubGluZSA9PSAwKSArK3ZhbC5saW5lOworCisJICB2YWwucGMgPSBCTE9DS19FTkQgKEJMT0NLVkVDVE9SX0JMT0NLIChidiwgR0xPQkFMX0JMT0NLKSk7CisJICB2YWwuZW5kID0gYWx0LT5wYzsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdmFsLnN5bXRhYiA9IGJlc3Rfc3ltdGFiOworICAgICAgdmFsLmxpbmUgPSBiZXN0LT5saW5lOworICAgICAgdmFsLnBjID0gYmVzdC0+cGM7CisgICAgICBpZiAoYmVzdF9lbmQgJiYgKCFhbHQgfHwgYmVzdF9lbmQgPCBhbHQtPnBjKSkKKwl2YWwuZW5kID0gYmVzdF9lbmQ7CisgICAgICBlbHNlIGlmIChhbHQpCisJdmFsLmVuZCA9IGFsdC0+cGM7CisgICAgICBlbHNlCisJdmFsLmVuZCA9IEJMT0NLX0VORCAoQkxPQ0tWRUNUT1JfQkxPQ0sgKGJ2LCBHTE9CQUxfQkxPQ0spKTsKKyAgICB9CisgIHZhbC5zZWN0aW9uID0gc2VjdGlvbjsKKyAgcmV0dXJuIHZhbDsKK30KKworLyogQmFja3dhcmQgY29tcGF0aWJpbGl0eSAobm8gc2VjdGlvbikgKi8KKworc3RydWN0IHN5bXRhYl9hbmRfbGluZQorZmluZF9wY19saW5lIChwYywgbm90Y3VycmVudCkKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBpbnQgbm90Y3VycmVudDsKK3sKKyAgYXNlY3Rpb24gICAgICpzZWN0aW9uOworCisgIHNlY3Rpb24gPSBmaW5kX3BjX292ZXJsYXkgKHBjKTsKKyAgaWYgKHBjX2luX3VubWFwcGVkX3JhbmdlIChwYywgc2VjdGlvbikpCisgICAgcGMgPSBvdmVybGF5X21hcHBlZF9hZGRyZXNzIChwYywgc2VjdGlvbik7CisgIHJldHVybiBmaW5kX3BjX3NlY3RfbGluZSAocGMsIHNlY3Rpb24sIG5vdGN1cnJlbnQpOworfQorCisMCitzdGF0aWMgc3RydWN0IHN5bXRhYiogZmluZF9saW5lX3N5bXRhYiBQQVJBTVMgKChzdHJ1Y3Qgc3ltdGFiICosIGludCwKKwkJCQkJCWludCAqLCBpbnQgKikpOworCisvKiBGaW5kIGxpbmUgbnVtYmVyIExJTkUgaW4gYW55IHN5bXRhYiB3aG9zZSBuYW1lIGlzIHRoZSBzYW1lIGFzCisgICBTWU1UQUIuCisKKyAgIElmIGZvdW5kLCByZXR1cm4gdGhlIHN5bXRhYiB0aGF0IGNvbnRhaW5zIHRoZSBsaW5ldGFibGUgaW4gd2hpY2ggaXQgd2FzCisgICBmb3VuZCwgc2V0ICpJTkRFWCB0byB0aGUgaW5kZXggaW4gdGhlIGxpbmV0YWJsZSBvZiB0aGUgYmVzdCBlbnRyeQorICAgZm91bmQsIGFuZCBzZXQgKkVYQUNUX01BVENIIG5vbnplcm8gaWYgdGhlIHZhbHVlIHJldHVybmVkIGlzIGFuCisgICBleGFjdCBtYXRjaC4KKworICAgSWYgbm90IGZvdW5kLCByZXR1cm4gTlVMTC4gICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3ltdGFiKgorZmluZF9saW5lX3N5bXRhYiAoc3ltdGFiLCBsaW5lLCBpbmRleCwgZXhhY3RfbWF0Y2gpCisgICAgIHN0cnVjdCBzeW10YWIgKnN5bXRhYjsKKyAgICAgaW50IGxpbmU7CisgICAgIGludCAqaW5kZXg7CisgICAgIGludCAqZXhhY3RfbWF0Y2g7Cit7CisgIGludCBleGFjdDsKKworICAvKiBCRVNUX0lOREVYIGFuZCBCRVNUX0xJTkVUQUJMRSBpZGVudGlmeSB0aGUgc21hbGxlc3QgbGluZW51bWJlciA+IExJTkUKKyAgICAgc28gZmFyIHNlZW4uICAqLworCisgIGludCBiZXN0X2luZGV4OworICBzdHJ1Y3QgbGluZXRhYmxlICpiZXN0X2xpbmV0YWJsZTsKKyAgc3RydWN0IHN5bXRhYiAqYmVzdF9zeW10YWI7CisKKyAgLyogRmlyc3QgdHJ5IGxvb2tpbmcgaXQgdXAgaW4gdGhlIGdpdmVuIHN5bXRhYi4gICovCisgIGJlc3RfbGluZXRhYmxlID0gTElORVRBQkxFIChzeW10YWIpOworICBiZXN0X3N5bXRhYiA9IHN5bXRhYjsKKyAgYmVzdF9pbmRleCA9IGZpbmRfbGluZV9jb21tb24gKGJlc3RfbGluZXRhYmxlLCBsaW5lLCAmZXhhY3QpOworICBpZiAoYmVzdF9pbmRleCA8IDAgfHwgIWV4YWN0KQorICAgIHsKKyAgICAgIC8qIERpZG4ndCBmaW5kIGFuIGV4YWN0IG1hdGNoLiAgU28gd2UgYmV0dGVyIGtlZXAgbG9va2luZyBmb3IKKwkgYW5vdGhlciBzeW10YWIgd2l0aCB0aGUgc2FtZSBuYW1lLiAgSW4gdGhlIGNhc2Ugb2YgeGNvZmYsCisJIG11bHRpcGxlIGNzZWN0cyBmb3Igb25lIHNvdXJjZSBmaWxlIChwcm9kdWNlZCBieSBJQk0ncyBGT1JUUkFOCisJIGNvbXBpbGVyKSBwcm9kdWNlIG11bHRpcGxlIHN5bXRhYnMgKHRoaXMgaXMgdW5hdm9pZGFibGUKKwkgYXNzdW1pbmcgY3NlY3RzIGNhbiBiZSBhdCBhcmJpdHJhcnkgcGxhY2VzIGluIG1lbW9yeSBhbmQgdGhhdAorCSB0aGUgR0xPQkFMX0JMT0NLIG9mIGEgc3ltdGFiIGhhcyBhIGJlZ2luIGFuZCBlbmQgYWRkcmVzcykuICAqLworCisgICAgICAvKiBCRVNUIGlzIHRoZSBzbWFsbGVzdCBsaW5lbnVtYmVyID4gTElORSBzbyBmYXIgc2VlbiwKKwkgb3IgMCBpZiBub25lIGhhcyBiZWVuIHNlZW4gc28gZmFyLgorCSBCRVNUX0lOREVYIGFuZCBCRVNUX0xJTkVUQUJMRSBpZGVudGlmeSB0aGUgaXRlbSBmb3IgaXQuICAqLworICAgICAgaW50IGJlc3Q7CisKKyAgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICAgc3RydWN0IHN5bXRhYiAqczsKKworICAgICAgaWYgKGJlc3RfaW5kZXggPj0gMCkKKwliZXN0ID0gYmVzdF9saW5ldGFibGUtPml0ZW1bYmVzdF9pbmRleF0ubGluZTsKKyAgICAgIGVsc2UKKwliZXN0ID0gMDsKKworICAgICAgQUxMX1NZTVRBQlMgKG9iamZpbGUsIHMpCisJeworCSAgc3RydWN0IGxpbmV0YWJsZSAqbDsKKwkgIGludCBpbmQ7CisKKwkgIGlmICghU1RSRVEgKHN5bXRhYi0+ZmlsZW5hbWUsIHMtPmZpbGVuYW1lKSkKKwkgICAgY29udGludWU7CisJICBsID0gTElORVRBQkxFIChzKTsKKwkgIGluZCA9IGZpbmRfbGluZV9jb21tb24gKGwsIGxpbmUsICZleGFjdCk7CisJICBpZiAoaW5kID49IDApCisJICAgIHsKKwkgICAgICBpZiAoZXhhY3QpCisJCXsKKwkJICBiZXN0X2luZGV4ID0gaW5kOworCQkgIGJlc3RfbGluZXRhYmxlID0gbDsKKwkJICBiZXN0X3N5bXRhYiA9IHM7CisJCSAgZ290byBkb25lOworCQl9CisJICAgICAgaWYgKGJlc3QgPT0gMCB8fCBsLT5pdGVtW2luZF0ubGluZSA8IGJlc3QpCisJCXsKKwkJICBiZXN0ID0gbC0+aXRlbVtpbmRdLmxpbmU7CisJCSAgYmVzdF9pbmRleCA9IGluZDsKKwkJICBiZXN0X2xpbmV0YWJsZSA9IGw7CisJCSAgYmVzdF9zeW10YWIgPSBzOworCQl9CisJICAgIH0KKwl9CisgICAgfQorIGRvbmU6CisgIGlmIChiZXN0X2luZGV4IDwgMCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoaW5kZXgpCisgICAgKmluZGV4ID0gYmVzdF9pbmRleDsKKyAgaWYgKGV4YWN0X21hdGNoKQorICAgICpleGFjdF9tYXRjaCA9IGV4YWN0OworCisgIHJldHVybiBiZXN0X3N5bXRhYjsKK30KKwwKKy8qIFNldCB0aGUgUEMgdmFsdWUgZm9yIGEgZ2l2ZW4gc291cmNlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGFuZCByZXR1cm4gdHJ1ZS4KKyAgIFJldHVybnMgemVybyBmb3IgaW52YWxpZCBsaW5lIG51bWJlciAoYW5kIHNldHMgdGhlIFBDIHRvIDApLgorICAgVGhlIHNvdXJjZSBmaWxlIGlzIHNwZWNpZmllZCB3aXRoIGEgc3RydWN0IHN5bXRhYi4gICovCisKK2ludAorZmluZF9saW5lX3BjIChzeW10YWIsIGxpbmUsIHBjKQorICAgICBzdHJ1Y3Qgc3ltdGFiICpzeW10YWI7CisgICAgIGludCBsaW5lOworICAgICBDT1JFX0FERFIgKnBjOworeworICBzdHJ1Y3QgbGluZXRhYmxlICpsOworICBpbnQgaW5kOworCisgICpwYyA9IDA7CisgIGlmIChzeW10YWIgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBzeW10YWIgPSBmaW5kX2xpbmVfc3ltdGFiIChzeW10YWIsIGxpbmUsICZpbmQsIE5VTEwpOworICBpZiAoc3ltdGFiICE9IE5VTEwpCisgICAgeworICAgICAgbCA9IExJTkVUQUJMRSAoc3ltdGFiKTsKKyAgICAgICpwYyA9IGwtPml0ZW1baW5kXS5wYzsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBGaW5kIHRoZSByYW5nZSBvZiBwYyB2YWx1ZXMgaW4gYSBsaW5lLgorICAgU3RvcmUgdGhlIHN0YXJ0aW5nIHBjIG9mIHRoZSBsaW5lIGludG8gKlNUQVJUUFRSCisgICBhbmQgdGhlIGVuZGluZyBwYyAoc3RhcnQgb2YgbmV4dCBsaW5lKSBpbnRvICpFTkRQVFIuCisgICBSZXR1cm5zIDEgdG8gaW5kaWNhdGUgc3VjY2Vzcy4KKyAgIFJldHVybnMgMCBpZiBjb3VsZCBub3QgZmluZCB0aGUgc3BlY2lmaWVkIGxpbmUuICAqLworCitpbnQKK2ZpbmRfbGluZV9wY19yYW5nZSAoc2FsLCBzdGFydHB0ciwgZW5kcHRyKQorICAgICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKyAgICAgQ09SRV9BRERSICpzdGFydHB0ciwgKmVuZHB0cjsKK3sKKyAgQ09SRV9BRERSIHN0YXJ0YWRkcjsKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBmb3VuZF9zYWw7CisKKyAgc3RhcnRhZGRyID0gc2FsLnBjOworICBpZiAoc3RhcnRhZGRyPT0wICYmICFmaW5kX2xpbmVfcGMgKHNhbC5zeW10YWIsIHNhbC5saW5lLCAmc3RhcnRhZGRyKSkKKyAgICByZXR1cm4gMDsKKworICAvKiBUaGlzIHdob2xlIGZ1bmN0aW9uIGlzIGJhc2VkIG9uIGFkZHJlc3MuICBGb3IgZXhhbXBsZSwgaWYgbGluZSAxMCBoYXMKKyAgICAgdHdvIHBhcnRzLCBvbmUgZnJvbSAweDEwMCB0byAweDIwMCBhbmQgb25lIGZyb20gMHgzMDAgdG8gMHg0MDAsIHRoZW4KKyAgICAgImluZm8gbGluZSAqMHgxMjMiIHNob3VsZCBzYXkgdGhlIGxpbmUgZ29lcyBmcm9tIDB4MTAwIHRvIDB4MjAwCisgICAgIGFuZCAiaW5mbyBsaW5lICoweDM1NSIgc2hvdWxkIHNheSB0aGUgbGluZSBnb2VzIGZyb20gMHgzMDAgdG8gMHg0MDAuCisgICAgIFRoaXMgYWxzbyBpbnN1cmVzIHRoYXQgd2UgbmV2ZXIgZ2l2ZSBhIHJhbmdlIGxpa2UgInN0YXJ0cyBhdCAweDEzNAorICAgICBhbmQgZW5kcyBhdCAweDEyYyIuICAqLworCisgIGZvdW5kX3NhbCA9IGZpbmRfcGNfc2VjdF9saW5lIChzdGFydGFkZHIsIHNhbC5zZWN0aW9uLCAwKTsKKyAgaWYgKGZvdW5kX3NhbC5saW5lICE9IHNhbC5saW5lKQorICAgIHsKKyAgICAgIC8qIFRoZSBzcGVjaWZpZWQgbGluZSAoc2FsKSBoYXMgemVybyBieXRlcy4gICovCisgICAgICAqc3RhcnRwdHIgPSBmb3VuZF9zYWwucGM7CisgICAgICAqZW5kcHRyID0gZm91bmRfc2FsLnBjOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICpzdGFydHB0ciA9IGZvdW5kX3NhbC5wYzsKKyAgICAgICplbmRwdHIgPSBmb3VuZF9zYWwuZW5kOworICAgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qIEdpdmVuIGEgbGluZSB0YWJsZSBhbmQgYSBsaW5lIG51bWJlciwgcmV0dXJuIHRoZSBpbmRleCBpbnRvIHRoZSBsaW5lCisgICB0YWJsZSBmb3IgdGhlIHBjIG9mIHRoZSBuZWFyZXN0IGxpbmUgd2hvc2UgbnVtYmVyIGlzID49IHRoZSBzcGVjaWZpZWQgb25lLgorICAgUmV0dXJuIC0xIGlmIG5vbmUgaXMgZm91bmQuICBUaGUgdmFsdWUgaXMgPj0gMCBpZiBpdCBpcyBhbiBpbmRleC4KKworICAgU2V0ICpFWEFDVF9NQVRDSCBub256ZXJvIGlmIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyBhbiBleGFjdCBtYXRjaC4gICovCisKK3N0YXRpYyBpbnQKK2ZpbmRfbGluZV9jb21tb24gKGwsIGxpbmVubywgZXhhY3RfbWF0Y2gpCisgICAgIHJlZ2lzdGVyIHN0cnVjdCBsaW5ldGFibGUgKmw7CisgICAgIHJlZ2lzdGVyIGludCBsaW5lbm87CisgICAgIGludCAqZXhhY3RfbWF0Y2g7Cit7CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBpbnQgbGVuOworCisgIC8qIEJFU1QgaXMgdGhlIHNtYWxsZXN0IGxpbmVudW1iZXIgPiBMSU5FTk8gc28gZmFyIHNlZW4sCisgICAgIG9yIDAgaWYgbm9uZSBoYXMgYmVlbiBzZWVuIHNvIGZhci4KKyAgICAgQkVTVF9JTkRFWCBpZGVudGlmaWVzIHRoZSBpdGVtIGZvciBpdC4gICovCisKKyAgaW50IGJlc3RfaW5kZXggPSAtMTsKKyAgaW50IGJlc3QgPSAwOworCisgIGlmIChsaW5lbm8gPD0gMCkKKyAgICByZXR1cm4gLTE7CisgIGlmIChsID09IDApCisgICAgcmV0dXJuIC0xOworCisgIGxlbiA9IGwtPm5pdGVtczsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIHN0cnVjdCBsaW5ldGFibGVfZW50cnkgKml0ZW0gPSAmKGwtPml0ZW1baV0pOworCisgICAgICBpZiAoaXRlbS0+bGluZSA9PSBsaW5lbm8pCisJeworCSAgLyogUmV0dXJuIHRoZSBmaXJzdCAobG93ZXN0IGFkZHJlc3MpIGVudHJ5IHdoaWNoIG1hdGNoZXMuICAqLworCSAgKmV4YWN0X21hdGNoID0gMTsKKwkgIHJldHVybiBpOworCX0KKworICAgICAgaWYgKGl0ZW0tPmxpbmUgPiBsaW5lbm8gJiYgKGJlc3QgPT0gMCB8fCBpdGVtLT5saW5lIDwgYmVzdCkpCisJeworCSAgYmVzdCA9IGl0ZW0tPmxpbmU7CisJICBiZXN0X2luZGV4ID0gaTsKKwl9CisgICAgfQorCisgIC8qIElmIHdlIGdvdCBoZXJlLCB3ZSBkaWRuJ3QgZ2V0IGFuIGV4YWN0IG1hdGNoLiAgKi8KKworICAqZXhhY3RfbWF0Y2ggPSAwOworICByZXR1cm4gYmVzdF9pbmRleDsKK30KKworaW50CitmaW5kX3BjX2xpbmVfcGNfcmFuZ2UgKHBjLCBzdGFydHB0ciwgZW5kcHRyKQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIENPUkVfQUREUiAqc3RhcnRwdHIsICplbmRwdHI7Cit7CisgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOworICBzYWwgPSBmaW5kX3BjX2xpbmUgKHBjLCAwKTsKKyAgKnN0YXJ0cHRyID0gc2FsLnBjOworICAqZW5kcHRyID0gc2FsLmVuZDsKKyAgcmV0dXJuIHNhbC5zeW10YWIgIT0gMDsKK30KKworLyogR2l2ZW4gYSBmdW5jdGlvbiBzeW1ib2wgU1lNLCBmaW5kIHRoZSBzeW10YWIgYW5kIGxpbmUgZm9yIHRoZSBzdGFydAorICAgb2YgdGhlIGZ1bmN0aW9uLgorICAgSWYgdGhlIGFyZ3VtZW50IEZVTkZJUlNUTElORSBpcyBub256ZXJvLCB3ZSB3YW50IHRoZSBmaXJzdCBsaW5lCisgICBvZiByZWFsIGNvZGUgaW5zaWRlIHRoZSBmdW5jdGlvbi4gICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lCitmaW5kX2Z1bmN0aW9uX3N0YXJ0X3NhbCBQQVJBTVMgKChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGludCkpOworCitzdGF0aWMgc3RydWN0IHN5bXRhYl9hbmRfbGluZQorZmluZF9mdW5jdGlvbl9zdGFydF9zYWwgKHN5bSwgZnVuZmlyc3RsaW5lKQorICAgICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgICAgIGludCBmdW5maXJzdGxpbmU7Cit7CisgIENPUkVfQUREUiBwYzsKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CisKKyAgcGMgPSBCTE9DS19TVEFSVCAoU1lNQk9MX0JMT0NLX1ZBTFVFIChzeW0pKTsKKyAgZml4dXBfc3ltYm9sX3NlY3Rpb24gKHN5bSwgTlVMTCk7CisgIGlmIChmdW5maXJzdGxpbmUpCisgICAgeyAvKiBza2lwICJmaXJzdCBsaW5lIiBvZiBmdW5jdGlvbiAod2hpY2ggaXMgYWN0dWFsbHkgaXRzIHByb2xvZ3VlKSAqLworICAgICAgYXNlY3Rpb24gKnNlY3Rpb24gPSBTWU1CT0xfQkZEX1NFQ1RJT04gKHN5bSk7CisgICAgICAvKiBJZiBmdW5jdGlvbiBpcyBpbiBhbiB1bm1hcHBlZCBvdmVybGF5LCB1c2UgaXRzIHVubWFwcGVkIExNQQorCSBhZGRyZXNzLCBzbyB0aGF0IFNLSVBfUFJPTE9HVUUgaGFzIHNvbWV0aGluZyB1bmlxdWUgdG8gd29yayBvbiAqLworICAgICAgaWYgKHNlY3Rpb25faXNfb3ZlcmxheSAoc2VjdGlvbikgJiYKKwkgICFzZWN0aW9uX2lzX21hcHBlZCAoc2VjdGlvbikpCisJcGMgPSBvdmVybGF5X3VubWFwcGVkX2FkZHJlc3MgKHBjLCBzZWN0aW9uKTsKKworICAgICAgcGMgKz0gRlVOQ1RJT05fU1RBUlRfT0ZGU0VUOworICAgICAgU0tJUF9QUk9MT0dVRSAocGMpOworCisgICAgICAvKiBGb3Igb3ZlcmxheXMsIG1hcCBwYyBiYWNrIGludG8gaXRzIG1hcHBlZCBWTUEgcmFuZ2UgKi8KKyAgICAgIHBjID0gb3ZlcmxheV9tYXBwZWRfYWRkcmVzcyAocGMsIHNlY3Rpb24pOworICAgIH0KKyAgc2FsID0gZmluZF9wY19zZWN0X2xpbmUgKHBjLCBTWU1CT0xfQkZEX1NFQ1RJT04gKHN5bSksIDApOworCisjaWZkZWYgUFJPTE9HVUVfRklSU1RMSU5FX09WRVJMQVAKKyAgLyogQ29udmV4OiBubyBuZWVkIHRvIHN1cHByZXNzIGNvZGUgb24gZmlyc3QgbGluZSwgaWYgYW55ICovCisgIHNhbC5wYyA9IHBjOworI2Vsc2UKKyAgLyogQ2hlY2sgaWYgU0tJUF9QUk9MT0dVRSBsZWZ0IHVzIGluIG1pZC1saW5lLCBhbmQgdGhlIG5leHQKKyAgICAgbGluZSBpcyBzdGlsbCBwYXJ0IG9mIHRoZSBzYW1lIGZ1bmN0aW9uLiAgKi8KKyAgaWYgKHNhbC5wYyAhPSBwYworICAgICAgJiYgQkxPQ0tfU1RBUlQgKFNZTUJPTF9CTE9DS19WQUxVRSAoc3ltKSkgPD0gc2FsLmVuZAorICAgICAgJiYgc2FsLmVuZCA8IEJMT0NLX0VORCAoU1lNQk9MX0JMT0NLX1ZBTFVFIChzeW0pKSkKKyAgICB7CisgICAgICAvKiBGaXJzdCBwYyBvZiBuZXh0IGxpbmUgKi8KKyAgICAgIHBjID0gc2FsLmVuZDsKKyAgICAgIC8qIFJlY2FsY3VsYXRlIHRoZSBsaW5lIG51bWJlciAobWlnaHQgbm90IGJlIE4rMSkuICAqLworICAgICAgc2FsID0gZmluZF9wY19zZWN0X2xpbmUgKHBjLCBTWU1CT0xfQkZEX1NFQ1RJT04gKHN5bSksIDApOworICAgIH0KKyAgc2FsLnBjID0gcGM7CisjZW5kaWYKKworICByZXR1cm4gc2FsOworfQorDAorLyogSWYgUCBpcyBvZiB0aGUgZm9ybSAib3BlcmF0b3JbIFx0XSsuLi4iIHdoZXJlIGAuLi4nIGlzCisgICBzb21lIGxlZ2l0aW1hdGUgb3BlcmF0b3IgdGV4dCwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUKKyAgIGJlZ2lubmluZyBvZiB0aGUgc3Vic3RyaW5nIG9mIHRoZSBvcGVyYXRvciB0ZXh0LgorICAgT3RoZXJ3aXNlLCByZXR1cm4gIiIuICAqLworY2hhciAqCitvcGVyYXRvcl9jaGFycyAocCwgZW5kKQorICAgICBjaGFyICpwOworICAgICBjaGFyICoqZW5kOworeworICAqZW5kID0gIiI7CisgIGlmIChzdHJuY21wIChwLCAib3BlcmF0b3IiLCA4KSkKKyAgICByZXR1cm4gKmVuZDsKKyAgcCArPSA4OworCisgIC8qIERvbid0IGdldCBmYWtlZCBvdXQgYnkgYG9wZXJhdG9yJyBiZWluZyBwYXJ0IG9mIGEgbG9uZ2VyCisgICAgIGlkZW50aWZpZXIuICAqLworICBpZiAoaXNhbHBoYSgqcCkgfHwgKnAgPT0gJ18nIHx8ICpwID09ICckJyB8fCAqcCA9PSAnXDAnKQorICAgIHJldHVybiAqZW5kOworCisgIC8qIEFsbG93IHNvbWUgd2hpdGVzcGFjZSBiZXR3ZWVuIGBvcGVyYXRvcicgYW5kIHRoZSBvcGVyYXRvciBzeW1ib2wuICAqLworICB3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcpCisgICAgcCsrOworCisgIC8qIFJlY29nbml6ZSAnb3BlcmF0b3IgVFlQRU5BTUUnLiAqLworCisgIGlmIChpc2FscGhhKCpwKSB8fCAqcCA9PSAnXycgfHwgKnAgPT0gJyQnKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIGNoYXIgKnEgPSBwKzE7CisgICAgICB3aGlsZSAoaXNhbG51bSgqcSkgfHwgKnEgPT0gJ18nIHx8ICpxID09ICckJykKKwlxKys7CisgICAgICAqZW5kID0gcTsKKyAgICAgIHJldHVybiBwOworICAgIH0KKworICBzd2l0Y2ggKCpwKQorICAgIHsKKyAgICBjYXNlICchJzoKKyAgICBjYXNlICc9JzoKKyAgICBjYXNlICcqJzoKKyAgICBjYXNlICcvJzoKKyAgICBjYXNlICclJzoKKyAgICBjYXNlICdeJzoKKyAgICAgIGlmIChwWzFdID09ICc9JykKKwkqZW5kID0gcCsyOworICAgICAgZWxzZQorCSplbmQgPSBwKzE7CisgICAgICByZXR1cm4gcDsKKyAgICBjYXNlICc8JzoKKyAgICBjYXNlICc+JzoKKyAgICBjYXNlICcrJzoKKyAgICBjYXNlICctJzoKKyAgICBjYXNlICcmJzoKKyAgICBjYXNlICd8JzoKKyAgICAgIGlmIChwWzFdID09ICc9JyB8fCBwWzFdID09IHBbMF0pCisJKmVuZCA9IHArMjsKKyAgICAgIGVsc2UKKwkqZW5kID0gcCsxOworICAgICAgcmV0dXJuIHA7CisgICAgY2FzZSAnfic6CisgICAgY2FzZSAnLCc6CisgICAgICAqZW5kID0gcCsxOworICAgICAgcmV0dXJuIHA7CisgICAgY2FzZSAnKCc6CisgICAgICBpZiAocFsxXSAhPSAnKScpCisJZXJyb3IgKCJgb3BlcmF0b3IgKCknIG11c3QgYmUgc3BlY2lmaWVkIHdpdGhvdXQgd2hpdGVzcGFjZSBpbiBgKCknIik7CisgICAgICAqZW5kID0gcCsyOworICAgICAgcmV0dXJuIHA7CisgICAgY2FzZSAnPyc6CisgICAgICBpZiAocFsxXSAhPSAnOicpCisJZXJyb3IgKCJgb3BlcmF0b3IgPzonIG11c3QgYmUgc3BlY2lmaWVkIHdpdGhvdXQgd2hpdGVzcGFjZSBpbiBgPzonIik7CisgICAgICAqZW5kID0gcCsyOworICAgICAgcmV0dXJuIHA7CisgICAgY2FzZSAnWyc6CisgICAgICBpZiAocFsxXSAhPSAnXScpCisJZXJyb3IgKCJgb3BlcmF0b3IgW10nIG11c3QgYmUgc3BlY2lmaWVkIHdpdGhvdXQgd2hpdGVzcGFjZSBpbiBgW10nIik7CisgICAgICAqZW5kID0gcCsyOworICAgICAgcmV0dXJuIHA7CisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yICgiYG9wZXJhdG9yICVzJyBub3Qgc3VwcG9ydGVkIiwgcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICplbmQgPSAiIjsKKyAgcmV0dXJuICplbmQ7Cit9CisKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIG1ldGhvZHMgZGVzY3JpYmVkIGZvciBUWVBFLCBpbmNsdWRpbmcgdGhlCisgICBtZXRob2RzIGZyb20gdHlwZXMgaXQgZGVyaXZlcyBmcm9tLiBUaGlzIGNhbid0IGJlIGRvbmUgaW4gdGhlIHN5bWJvbAorICAgcmVhZGVyIGJlY2F1c2UgdGhlIHR5cGUgb2YgdGhlIGJhc2VjbGFzcyBtaWdodCBzdGlsbCBiZSBzdHViYmVkCisgICB3aGVuIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBkZXJpdmVkIGNsYXNzIGlzIHBhcnNlZC4gICovCisKK3N0YXRpYyBpbnQgdG90YWxfbnVtYmVyX29mX21ldGhvZHMgUEFSQU1TICgoc3RydWN0IHR5cGUgKnR5cGUpKTsKKworc3RhdGljIGludAordG90YWxfbnVtYmVyX29mX21ldGhvZHMgKHR5cGUpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworeworICBpbnQgbjsKKyAgaW50IGNvdW50OworCisgIENIRUNLX1RZUEVERUYgKHR5cGUpOworICBpZiAoVFlQRV9DUExVU19TUEVDSUZJQyAodHlwZSkgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKyAgY291bnQgPSBUWVBFX05GTl9GSUVMRFNfVE9UQUwgKHR5cGUpOworCisgIGZvciAobiA9IDA7IG4gPCBUWVBFX05fQkFTRUNMQVNTRVMgKHR5cGUpOyBuKyspCisgICAgY291bnQgKz0gdG90YWxfbnVtYmVyX29mX21ldGhvZHMgKFRZUEVfQkFTRUNMQVNTICh0eXBlLCBuKSk7CisKKyAgcmV0dXJuIGNvdW50OworfQorCisvKiBSZWN1cnNpdmUgaGVscGVyIGZ1bmN0aW9uIGZvciBkZWNvZGVfbGluZV8xLgorICAgTG9vayBmb3IgbWV0aG9kcyBuYW1lZCBOQU1FIGluIHR5cGUgVC4KKyAgIFJldHVybiBudW1iZXIgb2YgbWF0Y2hlcy4KKyAgIFB1dCBtYXRjaGVzIGluIFNZTV9BUlIsIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGgKKyAgIGEgc2l6ZSBvZiB0b3RhbF9udW1iZXJfb2ZfbWV0aG9kcyAoVCkgKiBzaXplb2YgKHN0cnVjdCBzeW1ib2wgKikuCisgICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBnKysgc3BlY2lmaWMuICAqLworCitzdGF0aWMgaW50CitmaW5kX21ldGhvZHMgKHQsIG5hbWUsIHN5bV9hcnIpCisgICAgIHN0cnVjdCB0eXBlICp0OworICAgICBjaGFyICpuYW1lOworICAgICBzdHJ1Y3Qgc3ltYm9sICoqc3ltX2FycjsKK3sKKyAgaW50IGkxID0gMDsKKyAgaW50IGliYXNlOworICBzdHJ1Y3Qgc3ltYm9sICpzeW1fY2xhc3M7CisgIGNoYXIgKmNsYXNzX25hbWUgPSB0eXBlX25hbWVfbm9fdGFnICh0KTsKKworICAvKiBJZ25vcmUgdGhpcyBjbGFzcyBpZiBpdCBkb2Vzbid0IGhhdmUgYSBuYW1lLiAgVGhpcyBpcyB1Z2x5LCBidXQKKyAgICAgdW5sZXNzIHdlIGZpZ3VyZSBvdXQgaG93IHRvIGdldCB0aGUgcGh5c25hbWUgd2l0aG91dCB0aGUgbmFtZSBvZgorICAgICB0aGUgY2xhc3MsIHRoZW4gdGhlIGxvb3AgY2FuJ3QgZG8gYW55IGdvb2QuICAqLworICBpZiAoY2xhc3NfbmFtZQorICAgICAgJiYgKHN5bV9jbGFzcyA9IGxvb2t1cF9zeW1ib2wgKGNsYXNzX25hbWUsCisJCQkJICAgICAoc3RydWN0IGJsb2NrICopTlVMTCwKKwkJCQkgICAgIFNUUlVDVF9OQU1FU1BBQ0UsCisJCQkJICAgICAoaW50ICopTlVMTCwKKwkJCQkgICAgIChzdHJ1Y3Qgc3ltdGFiICoqKU5VTEwpKSkKKyAgICB7CisgICAgICBpbnQgbWV0aG9kX2NvdW50ZXI7CisKKyAgICAgIC8qIEZJWE1FOiBTaG91bGRuJ3QgdGhpcyBqdXN0IGJlIENIRUNLX1RZUEVERUYgKHQpPyAgKi8KKyAgICAgIHQgPSBTWU1CT0xfVFlQRSAoc3ltX2NsYXNzKTsKKworICAgICAgLyogTG9vcCBvdmVyIGVhY2ggbWV0aG9kIG5hbWUuICBBdCB0aGlzIGxldmVsLCBhbGwgb3ZlcmxvYWRzIG9mIGEgbmFtZQorCSBhcmUgY291bnRlZCBhcyBhIHNpbmdsZSBuYW1lLiAgVGhlcmUgaXMgYW4gaW5uZXIgbG9vcCB3aGljaCBsb29wcyBvdmVyCisJIGVhY2ggb3ZlcmxvYWQuICAqLworCisgICAgICBmb3IgKG1ldGhvZF9jb3VudGVyID0gVFlQRV9ORk5fRklFTERTICh0KSAtIDE7CisJICAgbWV0aG9kX2NvdW50ZXIgPj0gMDsKKwkgICAtLW1ldGhvZF9jb3VudGVyKQorCXsKKwkgIGludCBmaWVsZF9jb3VudGVyOworCSAgY2hhciAqbWV0aG9kX25hbWUgPSBUWVBFX0ZOX0ZJRUxETElTVF9OQU1FICh0LCBtZXRob2RfY291bnRlcik7CisJICBjaGFyIGRlbV9vcG5hbWVbNjRdOworCisgICAgICAgICAgaWYgKHN0cm5jbXAgKG1ldGhvZF9uYW1lLCAiX18iLCAyKSA9PSAwIHx8CisJICAgICAgc3RybmNtcCAobWV0aG9kX25hbWUsICJvcCIsIDIpID09IDAgfHwKKwkgICAgICBzdHJuY21wIChtZXRob2RfbmFtZSwgInR5cGUiLCA0KSA9PSAwKQorICAgICAgICAgICAgeworCSAgICAgIGlmIChjcGx1c19kZW1hbmdsZV9vcG5hbWUgKG1ldGhvZF9uYW1lLCBkZW1fb3BuYW1lLCBETUdMX0FOU0kpKQorCSAgICAgICAgbWV0aG9kX25hbWUgPSBkZW1fb3BuYW1lOworCSAgICAgIGVsc2UgaWYgKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSAobWV0aG9kX25hbWUsIGRlbV9vcG5hbWUsIDApKQorCSAgICAgICAgbWV0aG9kX25hbWUgPSBkZW1fb3BuYW1lOyAKKyAgICAgICAgICAgIH0KKworCSAgaWYgKFNUUkVRIChuYW1lLCBtZXRob2RfbmFtZSkpCisJICAgIC8qIEZpbmQgYWxsIHRoZSBvdmVybG9hZGVkIG1ldGhvZHMgd2l0aCB0aGF0IG5hbWUuICAqLworCSAgICBmb3IgKGZpZWxkX2NvdW50ZXIgPSBUWVBFX0ZOX0ZJRUxETElTVF9MRU5HVEggKHQsIG1ldGhvZF9jb3VudGVyKSAtIDE7CisJCSBmaWVsZF9jb3VudGVyID49IDA7CisJCSAtLWZpZWxkX2NvdW50ZXIpCisJICAgICAgeworCQlzdHJ1Y3QgZm5fZmllbGQgKmY7CisJCWNoYXIgKnBoeXNfbmFtZTsKKworCQlmID0gVFlQRV9GTl9GSUVMRExJU1QxICh0LCBtZXRob2RfY291bnRlcik7CisKKwkJaWYgKFRZUEVfRk5fRklFTERfU1RVQiAoZiwgZmllbGRfY291bnRlcikpCisJCSAgeworCQkgICAgY2hhciAqdG1wX25hbWU7CisKKwkJICAgIHRtcF9uYW1lID0gZ2RiX21hbmdsZV9uYW1lICh0LAorCQkJCQkJIG1ldGhvZF9jb3VudGVyLAorCQkJCQkJIGZpZWxkX2NvdW50ZXIpOworCQkgICAgcGh5c19uYW1lID0gYWxsb2NhIChzdHJsZW4gKHRtcF9uYW1lKSArIDEpOworCQkgICAgc3RyY3B5IChwaHlzX25hbWUsIHRtcF9uYW1lKTsKKwkJICAgIGZyZWUgKHRtcF9uYW1lKTsKKwkJICB9CisJCWVsc2UKKwkJICBwaHlzX25hbWUgPSBUWVBFX0ZOX0ZJRUxEX1BIWVNOQU1FIChmLCBmaWVsZF9jb3VudGVyKTsKKworCQkvKiBEZXN0cnVjdG9yIGlzIGhhbmRsZWQgYnkgY2FsbGVyLCBkb250IGFkZCBpdCB0byB0aGUgbGlzdCAqLworCQlpZiAoREVTVFJVQ1RPUl9QUkVGSVhfUCAocGh5c19uYW1lKSkKKwkJICBjb250aW51ZTsKKworCQlzeW1fYXJyW2kxXSA9IGxvb2t1cF9zeW1ib2wgKHBoeXNfbmFtZSwKKwkJCQkJICAgICBOVUxMLCBWQVJfTkFNRVNQQUNFLAorCQkJCQkgICAgIChpbnQgKikgTlVMTCwKKwkJCQkJICAgICAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCk7CisJCWlmIChzeW1fYXJyW2kxXSkKKwkJICBpMSsrOworCQllbHNlCisJCSAgeworCQkgICAgLyogVGhpcyBlcnJvciBtZXNzYWdlIGdldHMgcHJpbnRlZCwgYnV0IHRoZSBtZXRob2QKKwkJICAgICAgIHN0aWxsIHNlZW1zIHRvIGJlIGZvdW5kCisJCSAgICAgICBmcHV0c19maWx0ZXJlZCgiKENhbm5vdCBmaW5kIG1ldGhvZCAiLCBnZGJfc3Rkb3V0KTsKKwkJICAgICAgIGZwcmludGZfc3ltYm9sX2ZpbHRlcmVkIChnZGJfc3Rkb3V0LCBwaHlzX25hbWUsCisJCSAgICAgICBsYW5ndWFnZV9jcGx1cywKKwkJICAgICAgIERNR0xfUEFSQU1TIHwgRE1HTF9BTlNJKTsKKwkJICAgICAgIGZwdXRzX2ZpbHRlcmVkKCIgLSBwb3NzaWJseSBpbmxpbmVkLilcbiIsIGdkYl9zdGRvdXQpOworCQkgICAgICAgKi8KKwkJICB9CisJICAgICAgfQorCX0KKyAgICB9CisKKyAgLyogT25seSBzZWFyY2ggYmFzZWNsYXNzZXMgaWYgdGhlcmUgaXMgbm8gbWF0Y2ggeWV0LCBzaW5jZSBuYW1lcyBpbgorICAgICBkZXJpdmVkIGNsYXNzZXMgb3ZlcnJpZGUgdGhvc2UgaW4gYmFzZWNsYXNzZXMuCisKKyAgICAgRklYTUU6IFRoZSBhYm92ZSBpcyBub3QgdHJ1ZTsgaXQgaXMgb25seSB0cnVlIG9mIG1lbWJlciBmdW5jdGlvbnMKKyAgICAgaWYgdGhleSBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMgKD8/PyAtIHNlY3Rpb24gMTMuMSBvZiB0aGUKKyAgICAgQVJNIHNheXMgdGhlIGZ1bmN0aW9uIG1lbWJlcnMgYXJlIG5vdCBpbiB0aGUgc2FtZSBzY29wZSBidXQgZG9lc24ndAorICAgICByZWFsbHkgc3BlbGwgb3V0IHRoZSBydWxlcyBpbiBhIHdheSBJIHVuZGVyc3RhbmQuICBJbiBhbnkgY2FzZSwgaWYKKyAgICAgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgZGlmZmVyIHRoaXMgaXMgYSBjYXNlIGluIHdoaWNoIHdlIGNhbiBvdmVybG9hZAorICAgICByYXRoZXIgdGhhbiBoaWRpbmcgd2l0aG91dCBhbnkgcHJvYmxlbSwgYW5kIGdjYyAyLjQuNSBkb2VzIG92ZXJsb2FkCisgICAgIHJhdGhlciB0aGFuIGhpZGluZyBpbiB0aGlzIGNhc2UpLiAgKi8KKworICBpZiAoaTEgPT0gMCkKKyAgICBmb3IgKGliYXNlID0gMDsgaWJhc2UgPCBUWVBFX05fQkFTRUNMQVNTRVMgKHQpOyBpYmFzZSsrKQorICAgICAgaTEgKz0gZmluZF9tZXRob2RzIChUWVBFX0JBU0VDTEFTUyAodCwgaWJhc2UpLCBuYW1lLCBzeW1fYXJyICsgaTEpOworCisgIHJldHVybiBpMTsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIGZvciBkZWNvZGVfbGluZV8xLgorICAgQnVpbGQgYSBjYW5vbmljYWwgbGluZSBzcGVjIGluIENBTk9OSUNBTCBpZiBpdCBpcyBub24tTlVMTCBhbmQgaWYKKyAgIHRoZSBTQUwgaGFzIGEgc3ltdGFiLgorICAgSWYgU1lNTkFNRSBpcyBub24tTlVMTCB0aGUgY2Fub25pY2FsIGxpbmUgc3BlYyBpcyBgZmlsZW5hbWU6c3ltbmFtZScuCisgICBJZiBTWU1OQU1FIGlzIE5VTEwgdGhlIGxpbmUgbnVtYmVyIGZyb20gU0FMIGlzIHVzZWQgYW5kIHRoZSBjYW5vbmljYWwKKyAgIGxpbmUgc3BlYyBpcyBgZmlsZW5hbWU6bGluZW51bScuICAqLworCitzdGF0aWMgdm9pZAorYnVpbGRfY2Fub25pY2FsX2xpbmVfc3BlYyAoc2FsLCBzeW1uYW1lLCBjYW5vbmljYWwpCisgICAgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgKnNhbDsKKyAgICAgY2hhciAqc3ltbmFtZTsKKyAgICAgY2hhciAqKipjYW5vbmljYWw7Cit7CisgIGNoYXIgKipjYW5vbmljYWxfYXJyOworICBjaGFyICpjYW5vbmljYWxfbmFtZTsKKyAgY2hhciAqZmlsZW5hbWU7CisgIHN0cnVjdCBzeW10YWIgKnMgPSBzYWwtPnN5bXRhYjsKKworICBpZiAocyA9PSAoc3RydWN0IHN5bXRhYiAqKU5VTEwKKyAgICAgIHx8IHMtPmZpbGVuYW1lID09IChjaGFyICopTlVMTAorICAgICAgfHwgY2Fub25pY2FsID09IChjaGFyICoqKilOVUxMKQorICAgIHJldHVybjsKKyAKKyAgY2Fub25pY2FsX2FyciA9IChjaGFyICoqKSB4bWFsbG9jIChzaXplb2YgKGNoYXIgKikpOworICAqY2Fub25pY2FsID0gY2Fub25pY2FsX2FycjsKKworICBmaWxlbmFtZSA9IHMtPmZpbGVuYW1lOworICBpZiAoc3ltbmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNhbm9uaWNhbF9uYW1lID0geG1hbGxvYyAoc3RybGVuIChmaWxlbmFtZSkgKyBzdHJsZW4gKHN5bW5hbWUpICsgMik7CisgICAgICBzcHJpbnRmIChjYW5vbmljYWxfbmFtZSwgIiVzOiVzIiwgZmlsZW5hbWUsIHN5bW5hbWUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNhbm9uaWNhbF9uYW1lID0geG1hbGxvYyAoc3RybGVuIChmaWxlbmFtZSkgKyAzMCk7CisgICAgICBzcHJpbnRmIChjYW5vbmljYWxfbmFtZSwgIiVzOiVkIiwgZmlsZW5hbWUsIHNhbC0+bGluZSk7CisgICAgfQorICBjYW5vbmljYWxfYXJyWzBdID0gY2Fub25pY2FsX25hbWU7Cit9CisKKy8qIFBhcnNlIGEgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIGEgbGluZSBudW1iZXIuCisgICBQYXNzIHRoZSBhZGRyZXNzIG9mIGEgY2hhciAqIHZhcmlhYmxlOyB0aGF0IHZhcmlhYmxlIHdpbGwgYmUKKyAgIGFkdmFuY2VkIG92ZXIgdGhlIGNoYXJhY3RlcnMgYWN0dWFsbHkgcGFyc2VkLgorCisgICBUaGUgc3RyaW5nIGNhbiBiZToKKworICAgTElORU5VTSAtLSB0aGF0IGxpbmUgbnVtYmVyIGluIGN1cnJlbnQgZmlsZS4gIFBDIHJldHVybmVkIGlzIDAuCisgICBGSUxFOkxJTkVOVU0gLS0gdGhhdCBsaW5lIGluIHRoYXQgZmlsZS4gIFBDIHJldHVybmVkIGlzIDAuCisgICBGVU5DVElPTiAtLSBsaW5lIG51bWJlciBvZiBvcGVuYnJhY2Ugb2YgdGhhdCBmdW5jdGlvbi4KKyAgICAgIFBDIHJldHVybmVkIGlzIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uCisgICBWQVJJQUJMRSAtLSBsaW5lIG51bWJlciBvZiBkZWZpbml0aW9uIG9mIHRoYXQgdmFyaWFibGUuCisgICAgICBQQyByZXR1cm5lZCBpcyAwLgorICAgRklMRTpGVU5DVElPTiAtLSBsaWtld2lzZSwgYnV0IHByZWZlciBmdW5jdGlvbnMgaW4gdGhhdCBmaWxlLgorICAgKkVYUFIgLS0gbGluZSBpbiB3aGljaCBhZGRyZXNzIEVYUFIgYXBwZWFycy4KKworICAgRlVOQ1RJT04gbWF5IGJlIGFuIHVuZGVidWdnYWJsZSBmdW5jdGlvbiBmb3VuZCBpbiBtaW5pbWFsIHN5bWJvbCB0YWJsZS4KKworICAgSWYgdGhlIGFyZ3VtZW50IEZVTkZJUlNUTElORSBpcyBub256ZXJvLCB3ZSB3YW50IHRoZSBmaXJzdCBsaW5lCisgICBvZiByZWFsIGNvZGUgaW5zaWRlIGEgZnVuY3Rpb24gd2hlbiBhIGZ1bmN0aW9uIGlzIHNwZWNpZmllZCwgYW5kIGl0IGlzCisgICBub3QgT0sgdG8gc3BlY2lmeSBhIHZhcmlhYmxlIG9yIHR5cGUgdG8gZ2V0IGl0cyBsaW5lIG51bWJlci4KKworICAgREVGQVVMVF9TWU1UQUIgc3BlY2lmaWVzIHRoZSBmaWxlIHRvIHVzZSBpZiBub25lIGlzIHNwZWNpZmllZC4KKyAgIEl0IGRlZmF1bHRzIHRvIGN1cnJlbnRfc291cmNlX3N5bXRhYi4KKyAgIERFRkFVTFRfTElORSBzcGVjaWZpZXMgdGhlIGxpbmUgbnVtYmVyIHRvIHVzZSBmb3IgcmVsYXRpdmUKKyAgIGxpbmUgbnVtYmVycyAodGhhdCBzdGFydCB3aXRoIHNpZ25zKS4gIERlZmF1bHRzIHRvIGN1cnJlbnRfc291cmNlX2xpbmUuCisgICBJZiBDQU5PTklDQUwgaXMgbm9uLU5VTEwsIHN0b3JlIGFuIGFycmF5IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgY2Fub25pY2FsCisgICBsaW5lIHNwZWNzIHRoZXJlIGlmIG5lY2Vzc2FyeS4gQ3VycmVudGx5IG92ZXJsb2FkZWQgbWVtYmVyIGZ1bmN0aW9ucyBhbmQKKyAgIGxpbmUgbnVtYmVycyBvciBzdGF0aWMgZnVuY3Rpb25zIHdpdGhvdXQgYSBmaWxlbmFtZSB5aWVsZCBhIGNhbm9uaWNhbAorICAgbGluZSBzcGVjLiBUaGUgYXJyYXkgYW5kIHRoZSBsaW5lIHNwZWMgc3RyaW5ncyBhcmUgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLAorICAgaXQgaXMgdGhlIGNhbGxlcnMgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSB0aGVtLgorCisgICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gcmV0dXJuIHplcm8gZm9yIHRoZSBzeW10YWIKKyAgIGlmIG5vIGZpbGUgaXMgdmFsaWRseSBzcGVjaWZpZWQuICBDYWxsZXJzIG11c3QgY2hlY2sgdGhhdC4KKyAgIEFsc28sIHRoZSBsaW5lIG51bWJlciByZXR1cm5lZCBtYXkgYmUgaW52YWxpZC4gICovCisKKy8qIFdlIGFsbG93IHNpbmdsZSBxdW90ZXMgaW4gdmFyaW91cyBwbGFjZXMuICBUaGlzIGlzIGEgaGlkZW91cworICAga2x1ZGdlLCB3aGljaCBleGlzdHMgYmVjYXVzZSB0aGUgY29tcGxldGVyIGNhbid0IHlldCBkZWFsIHdpdGggdGhlCisgICBsYWNrIG9mIHNpbmdsZSBxdW90ZXMuICBGSVhNRTogd3JpdGUgYSBsaW5lc3BlY19jb21wbGV0ZXIgd2hpY2ggd2UKKyAgIGNhbiB1c2UgYXMgYXBwcm9wcmlhdGUgaW5zdGVhZCBvZiBtYWtlX3N5bWJvbF9jb21wbGV0aW9uX2xpc3QuICAqLworCitzdHJ1Y3Qgc3ltdGFic19hbmRfbGluZXMKK2RlY29kZV9saW5lXzEgKGFyZ3B0ciwgZnVuZmlyc3RsaW5lLCBkZWZhdWx0X3N5bXRhYiwgZGVmYXVsdF9saW5lLCBjYW5vbmljYWwpCisgICAgIGNoYXIgKiphcmdwdHI7CisgICAgIGludCBmdW5maXJzdGxpbmU7CisgICAgIHN0cnVjdCBzeW10YWIgKmRlZmF1bHRfc3ltdGFiOworICAgICBpbnQgZGVmYXVsdF9saW5lOworICAgICBjaGFyICoqKmNhbm9uaWNhbDsKK3sKKyAgc3RydWN0IHN5bXRhYnNfYW5kX2xpbmVzIHZhbHVlczsKKyNpZmRlZiBIUFBBX0NPTVBJTEVSX0JVRworICAvKiBGSVhNRTogVGhlIG5hdGl2ZSBIUCA5MDAwLzcwMCBjb21waWxlciBoYXMgYSBidWcgd2hpY2ggYXBwZWFycworICAgICB3aGVuIG9wdGltaXppbmcgdGhpcyBmaWxlIHdpdGggdGFyZ2V0IGk5NjAtdnh3b3Jrcy4gIEkgaGF2ZW4ndAorICAgICBiZWVuIGFibGUgdG8gY29uc3RydWN0IGEgc2ltcGxlIHRlc3QgY2FzZS4gIFRoZSBwcm9ibGVtIGlzIHRoYXQKKyAgICAgaW4gdGhlIHNlY29uZCBjYWxsIHRvIFNLSVBfUFJPTE9HVUUgYmVsb3csIHRoZSBjb21waWxlciBzb21laG93CisgICAgIGRvZXMgbm90IHJlYWxpemUgdGhhdCB0aGUgc3RhdGVtZW50IHZhbCA9IGZpbmRfcGNfbGluZSAoLi4uKSB3aWxsCisgICAgIGNoYW5nZSB0aGUgdmFsdWVzIG9mIHRoZSBmaWVsZHMgb2YgdmFsLiAgSXQgZXh0cmFjdHMgdGhlIGVsZW1lbnRzCisgICAgIGludG8gcmVnaXN0ZXJzIGF0IHRoZSB0b3Agb2YgdGhlIGJsb2NrLCBhbmQgZG9lcyBub3QgdXBkYXRlIHRoZQorICAgICByZWdpc3RlcnMgYWZ0ZXIgdGhlIGNhbGwgdG8gZmluZF9wY19saW5lLiAgWW91IGNhbiBjaGVjayB0aGlzIGJ5CisgICAgIGluc2VydGluZyBhIHByaW50ZiBhdCB0aGUgZW5kIG9mIGZpbmRfcGNfbGluZSB0byBzaG93IHdoYXQgdmFsdWVzCisgICAgIGl0IGlzIHJldHVybmluZyBmb3IgdmFsLnBjIGFuZCB2YWwuZW5kIGFuZCBhbm90aGVyIHByaW50ZiBhZnRlcgorICAgICB0aGUgY2FsbCB0byBzZWUgd2hhdCB2YWx1ZXMgdGhlIGZ1bmN0aW9uIGFjdHVhbGx5IGdvdCAocmVtZW1iZXIsCisgICAgIHRoaXMgaXMgY29tcGlsaW5nIHdpdGggY2MgLU8sIHdpdGggdGhpcyBwYXRjaCByZW1vdmVkKS4gIFlvdSBjYW4KKyAgICAgYWxzbyBleGFtaW5lIHRoZSBhc3NlbWJseSBsaXN0aW5nOiBzZWFyY2ggZm9yIHRoZSBzZWNvbmQgY2FsbCB0bworICAgICBza2lwX3Byb2xvZ3VlOyB0aGUgTERPIHN0YXRlbWVudCBiZWZvcmUgdGhlIG5leHQgY2FsbCB0bworICAgICBmaW5kX3BjX2xpbmUgbG9hZHMgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0cnVjdHVyZSB3aGljaAorICAgICBmaW5kX3BjX2xpbmUgd2lsbCByZXR1cm47IGlmIHRoZXJlIGlzIGEgTERXIGp1c3QgYmVmb3JlIHRoZSBMRE8sCisgICAgIHdoaWNoIGZldGNoZXMgYW4gZWxlbWVudCBvZiB0aGUgc3RydWN0dXJlLCB0aGVuIHRoZSBjb21waWxlcgorICAgICBzdGlsbCBoYXMgdGhlIGJ1Zy4KKworICAgICBTZXR0aW5nIHZhbCB0byB2b2xhdGlsZSBhdm9pZHMgdGhlIHByb2JsZW0uICBXZSBtdXN0IHVuZGVmCisgICAgIHZvbGF0aWxlLCBiZWNhdXNlIHRoZSBIUFBBIG5hdGl2ZSBjb21waWxlciBkb2VzIG5vdCBkZWZpbmUKKyAgICAgX19TVERDX18sIGFsdGhvdWdoIGl0IGRvZXMgdW5kZXJzdGFuZCB2b2xhdGlsZSwgYW5kIHNvIHZvbGF0aWxlCisgICAgIHdpbGwgaGF2ZSBiZWVuIGRlZmluZWQgYXdheSBpbiBkZWZzLmguICAqLworI3VuZGVmIHZvbGF0aWxlCisgIHZvbGF0aWxlIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgdmFsOworI2RlZmluZSB2b2xhdGlsZSAvKm5vdGhpbmcqLworI2Vsc2UKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSB2YWw7CisjZW5kaWYKKyAgcmVnaXN0ZXIgY2hhciAqcCwgKnAxOworICBjaGFyICpxLCAqcHAsICppaSwgKnAyOworI2lmIDAKKyAgY2hhciAqcTE7CisjZW5kaWYKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bXRhYiAqczsKKworICByZWdpc3RlciBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIC8qIFRoZSBzeW10YWIgdGhhdCBTWU0gd2FzIGZvdW5kIGluLiAgKi8KKyAgc3RydWN0IHN5bXRhYiAqc3ltX3N5bXRhYjsKKworICByZWdpc3RlciBDT1JFX0FERFIgcGM7CisgIHJlZ2lzdGVyIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbDsKKyAgY2hhciAqY29weTsKKyAgc3RydWN0IHN5bWJvbCAqc3ltX2NsYXNzOworICBpbnQgaTE7CisgIGludCBpc19xdW90ZWQ7CisgIGludCBoYXNfcGFyZW5zOyAgCisgIGludCBoYXNfaWYgPSAwOworICBzdHJ1Y3Qgc3ltYm9sICoqc3ltX2FycjsKKyAgc3RydWN0IHR5cGUgKnQ7CisgIGNoYXIgKnNhdmVkX2FyZyA9ICphcmdwdHI7CisgIGV4dGVybiBjaGFyICpnZGJfY29tcGxldGVyX3F1b3RlX2NoYXJhY3RlcnM7CisgIAorICBJTklUX1NBTCAoJnZhbCk7CS8qIGluaXRpYWxpemUgdG8gemVyb2VzICovCisKKyAgLyogRGVmYXVsdHMgaGF2ZSBkZWZhdWx0cy4gICovCisKKyAgaWYgKGRlZmF1bHRfc3ltdGFiID09IDApCisgICAgeworICAgICAgZGVmYXVsdF9zeW10YWIgPSBjdXJyZW50X3NvdXJjZV9zeW10YWI7CisgICAgICBkZWZhdWx0X2xpbmUgPSBjdXJyZW50X3NvdXJjZV9saW5lOworICAgIH0KKworICAvKiBTZWUgaWYgYXJnIGlzICpQQyAqLworCisgIGlmICgqKmFyZ3B0ciA9PSAnKicpCisgICAgeworICAgICAgKCphcmdwdHIpKys7CisgICAgICBwYyA9IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3NfMSAoYXJncHRyKTsKKworICAgICAgdmFsdWVzLnNhbHMgPSAoc3RydWN0IHN5bXRhYl9hbmRfbGluZSAqKQorCXhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHN5bXRhYl9hbmRfbGluZSkpOworCisgICAgICB2YWx1ZXMubmVsdHMgPSAxOworICAgICAgdmFsdWVzLnNhbHNbMF0gPSBmaW5kX3BjX2xpbmUgKHBjLCAwKTsKKyAgICAgIHZhbHVlcy5zYWxzWzBdLnBjID0gcGM7CisgICAgICB2YWx1ZXMuc2Fsc1swXS5zZWN0aW9uID0gZmluZF9wY19vdmVybGF5IChwYyk7CisKKyAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgfQorCisgIC8qICdoYXNfaWYnIGlzIGZvciB0aGUgc3ludGF4OgorICAgKiAgICAgKGdkYikgYnJlYWsgZm9vIGlmIChhPT1iKQorICAgKi8KKyAgaWYgKChpaSA9IHN0cnN0cigqYXJncHRyLCAiIGlmICIpKSAhPSBOVUxMIHx8CisgICAgICAoaWkgPSBzdHJzdHIoKmFyZ3B0ciwgIlx0aWYgIikpICE9IE5VTEwgfHwKKyAgICAgIChpaSA9IHN0cnN0cigqYXJncHRyLCAiIGlmXHQiKSkgIT0gTlVMTCB8fAorICAgICAgKGlpID0gc3Ryc3RyKCphcmdwdHIsICJcdGlmXHQiKSkgIT0gTlVMTCB8fAorICAgICAgKGlpID0gc3Ryc3RyKCphcmdwdHIsICIgaWYoIikpICE9IE5VTEwgfHwKKyAgICAgIChpaSA9IHN0cnN0cigqYXJncHRyLCAiXHRpZiggIikpICE9IE5VTEwpIAorICAgIGhhc19pZiA9IDE7CisgIC8qIFRlbXBvcmFyaWx5IHphcCBvdXQgImlmIChjb25kaXRpb24pIiB0byBub3QKKyAgICogY29uZnVzZSB0aGUgcGFyZW50aGVzaXMtY2hlY2tpbmcgY29kZSBiZWxvdy4KKyAgICogVGhpcyBpcyB1bmRvbmUgYmVsb3cuIERvIG5vdCBjaGFuZ2UgaWkhIQorICAgKi8KKyAgaWYgKGhhc19pZikgeworICAgICppaSA9ICdcMCc7CisgIH0KKworICAvKiBTZXQgdmFyaW91cyBmbGFncy4KKyAgICogJ2hhc19wYXJlbnMnIGlzIGltcG9ydGFudCBmb3Igb3ZlcmxvYWQgY2hlY2tpbmcsIHdoZXJlCisgICAqIHdlIGFsbG93IHRoaW5ncyBsaWtlOiAKKyAgICogICAgIChnZGIpIGJyZWFrIGM6OmYoaW50KQorICAgKi8KKworICAvKiBNYXliZSBhcmcgaXMgRklMRSA6IExJTkVOVU0gb3IgRklMRSA6IEZVTkNUSU9OICovCisKKyAgaXNfcXVvdGVkID0gKCoqYXJncHRyCisJICAgICAgICYmIHN0cmNociAoZ2RiX2NvbXBsZXRlcl9xdW90ZV9jaGFyYWN0ZXJzLCAqKmFyZ3B0cikgIT0gTlVMTCk7CisKKyAgaGFzX3BhcmVucyA9ICgocHAgPSBzdHJjaHIgKCphcmdwdHIsICcoJykpICE9IE5VTEwKKwkJICYmIChwcCA9IHN0cmNociAocHAsICcpJykpICE9IE5VTEwpOworCisgIC8qIE5vdyB0aGF0IHdlJ3JlIHNhZmVseSBwYXN0IHRoZSBoYXNfcGFyZW5zIGNoZWNrLAorICAgKiBwdXQgYmFjayAiIGlmIChjb25kaXRpb24pIiBzbyBvdXRlciBsYXllcnMgY2FuIHNlZSBpdCAKKyAgICovCisgIGlmIChoYXNfaWYpCisgICAgKmlpID0gJyAnOworCisgIC8qIE1heWJlIGFyZyBpcyBGSUxFIDogTElORU5VTSBvciBGSUxFIDogRlVOQ1RJT04gKi8KKyAgLyogTWF5IGFsc28gYmUgQ0xBU1M6Ok1FTUJFUiwgb3IgTkFNRVNQQUNFOjpOQU1FICovCisgIC8qIExvb2sgZm9yICc6JywgYnV0IGlnbm9yZSBpbnNpZGUgb2YgPD4gKi8KKworICBzID0gTlVMTDsKKyAgZm9yIChwID0gKmFyZ3B0cjsgKnA7IHArKykKKyAgICB7CisgICAgICBpZiAocFswXSA9PSAnPCcpIAorCXsKKyAgICAgICAgICBjaGFyICogdGVtcF9lbmQgPSBmaW5kX3RlbXBsYXRlX25hbWVfZW5kIChwKTsKKyAgICAgICAgICBpZiAoIXRlbXBfZW5kKQorICAgICAgICAgICAgZXJyb3IgKCJtYWxmb3JtZWQgdGVtcGxhdGUgc3BlY2lmaWNhdGlvbiBpbiBjb21tYW5kIik7CisgICAgICAgICAgcCA9IHRlbXBfZW5kOworCX0KKyAgICAgIGlmIChwWzBdID09ICc6JyB8fCBwWzBdID09ICcgJyB8fCBwWzBdID09ICdcdCcgfHwgISpwKQorCWJyZWFrOworICAgICAgaWYgKHBbMF0gPT0gJy4nICYmIHN0cmNociAocCwgJzonKSA9PSBOVUxMKSAvKiBKYXZhIHF1YWxpZmllZCBtZXRob2QuICovCisJeworCSAgLyogRmluZCB0aGUgKmxhc3QqICcuJywgc2luY2UgdGhlIG90aGVycyBhcmUgcGFja2FnZSBxdWFsaWZpZXJzLiAqLworCSAgZm9yIChwMSA9IHA7ICAqcDE7ICBwMSsrKQorCSAgICB7CisJICAgICAgaWYgKCpwMSA9PSAnLicpCisJCXAgPSBwMTsKKwkgICAgfQorCSAgYnJlYWs7CisJfQorICAgIH0KKyAgd2hpbGUgKHBbMF0gPT0gJyAnIHx8IHBbMF0gPT0gJ1x0JykgcCsrOworCisgIGlmICgocFswXSA9PSAnOicgfHwgcFswXSA9PSAnLicpICYmICFoYXNfcGFyZW5zKQorICAgIHsKKyAgICAgIC8qICBDKysgKi8KKyAgICAgIC8qICAuLi4gb3IgSmF2YSAqLworICAgICAgaWYgKGlzX3F1b3RlZCkgKmFyZ3B0ciA9ICphcmdwdHIrMTsKKyAgICAgIGlmIChwWzBdID09ICcuJyB8fCBwWzFdID09JzonKQorCXsKKyAgICAgICAgICBpbnQgaXg7CisgICAgICAgICAgY2hhciAqIHNhdmVkX2FyZzIgPSAqYXJncHRyOworICAgICAgICAgIGNoYXIgKiB0ZW1wX2VuZDsKKyAgICAgICAgICAvKiBGaXJzdCBjaGVjayBmb3IgImdsb2JhbCIgbmFtZXNwYWNlIHNwZWNpZmljYXRpb24sCisgICAgICAgICAgICAgb2YgdGhlIGZvcm0gIjo6Zm9vIi4gSWYgZm91bmQsIHNraXAgb3ZlciB0aGUgY29sb25zCisgICAgICAgICAgICAgYW5kIGp1bXAgdG8gbm9ybWFsIHN5bWJvbCBwcm9jZXNzaW5nICovCisgICAgICAgICAgaWYgKCgqYXJncHRyID09IHApIHx8IChwWy0xXSA9PSAnICcpIHx8IChwWy0xXSA9PSAnXHQnKSkKKyAgICAgICAgICAgIHNhdmVkX2FyZzIgKz0gMjsKKworICAgICAgICAgIC8qIFdlIGhhdmUgd2hhdCBsb29rcyBsaWtlIGEgY2xhc3Mgb3IgbmFtZXNwYWNlCisgICAgICAgICAgICAgc2NvcGUgc3BlY2lmaWNhdGlvbiAoQTo6QiksIHBvc3NpYmx5IHdpdGggbWFueQorICAgICAgICAgICAgIGxldmVscyBvZiBuYW1lc3BhY2VzIG9yIGNsYXNzZXMgKEE6OkI6OkM6OkQpLgorCisgICAgICAgICAgICAgU29tZSB2ZXJzaW9ucyBvZiB0aGUgSFAgQU5TSSBDKysgY29tcGlsZXIgKGFzIGFsc28gcG9zc2libHkKKyAgICAgICAgICAgICBvdGhlciBjb21waWxlcnMpIGdlbmVyYXRlIGNsYXNzL2Z1bmN0aW9uL21lbWJlciBuYW1lcyB3aXRoCisgICAgICAgICAgICAgZW1iZWRkZWQgZG91YmxlLWNvbG9ucyBpZiB0aGV5IGFyZSBpbnNpZGUgbmFtZXNwYWNlcy4gVG8KKyAgICAgICAgICAgICBoYW5kbGUgdGhpcywgd2UgbG9vcCBhIGZldyB0aW1lcywgY29uc2lkZXJpbmcgbGFyZ2VyIGFuZAorICAgICAgICAgICAgIGxhcmdlciBwcmVmaXhlcyBvZiB0aGUgc3RyaW5nIGFzIHRob3VnaCB0aGV5IHdlcmUgc2luZ2xlCisgICAgICAgICAgICAgc3ltYm9scy4gIFNvLCBpZiB0aGUgaW5pdGlhbGx5IHN1cHBsaWVkIHN0cmluZyBpcworICAgICAgICAgICAgIEE6OkI6OkM6OkQ6OmZvbywgd2UgaGF2ZSB0byBsb29rIHVwICJBIiwgdGhlbiAiQTo6QiIsCisgICAgICAgICAgICAgdGhlbiAiQTo6Qjo6QyIsIHRoZW4gIkE6OkI6OkM6OkQiLCBhbmQgZmluYWxseQorICAgICAgICAgICAgICJBOjpCOjpDOjpEOjpmb28iIGFzIHNpbmdsZSwgbW9ub2xpdGhpYyBzeW1ib2xzLCBiZWNhdXNlCisgICAgICAgICAgICAgQSwgQiwgQyBvciBEIG1heSBiZSBuYW1lc3BhY2VzLgorCisgICAgICAgICAgICAgTm90ZSB0aGF0IG5hbWVzcGFjZXMgY2FuIG5lc3Qgb25seSBpbnNpZGUgb3RoZXIKKyAgICAgICAgICAgICBuYW1lc3BhY2VzLCBhbmQgbm90IGluc2lkZSBjbGFzc2VzLiAgU28gd2UgbmVlZCBvbmx5CisgICAgICAgICAgICAgY29uc2lkZXIgKnByZWZpeGVzKiBvZiB0aGUgc3RyaW5nOyB0aGVyZSBpcyBubyBuZWVkIHRvIGxvb2sgdXAKKyAgICAgICAgICAgICAiQjo6QyIgc2VwYXJhdGVseSBhcyBhIHN5bWJvbCBpbiB0aGUgcHJldmlvdXMgZXhhbXBsZS4gKi8KKyAgICAgICAgICAKKyAgICAgICAgICBwMiA9IHA7IC8qIHNhdmUgZm9yIHJlc3RhcnQgKi8KKyAgICAgICAgICB3aGlsZSAoMSkKKyAgICAgICAgICAgIHsKKyAgCSAgICAgLyogRXh0cmFjdCB0aGUgY2xhc3MgbmFtZS4gICovCisJICAgICBwMSA9IHA7CisJICAgICB3aGlsZSAocCAhPSAqYXJncHRyICYmIHBbLTFdID09ICcgJykgLS1wOworCSAgICAgY29weSA9IChjaGFyICopIGFsbG9jYSAocCAtICphcmdwdHIgKyAxKTsKKwkgICAgIG1lbWNweSAoY29weSwgKmFyZ3B0ciwgcCAtICphcmdwdHIpOworCSAgICAgY29weVtwIC0gKmFyZ3B0cl0gPSAwOworCisJICAgICAvKiBEaXNjYXJkIHRoZSBjbGFzcyBuYW1lIGZyb20gdGhlIGFyZy4gICovCisJICAgICBwID0gcDEgKyAocDFbMF0gPT0gJzonID8gMiA6IDEpOworCSAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKSBwKys7CisJICAgICAqYXJncHRyID0gcDsKKworCSAgICAgc3ltX2NsYXNzID0gbG9va3VwX3N5bWJvbCAoY29weSwgMCwgU1RSVUNUX05BTUVTUEFDRSwgMCwgCisJCQkJICAgICAgICAoc3RydWN0IHN5bXRhYiAqKilOVUxMKTsKKyAgICAgICAKKwkgICAgIGlmIChzeW1fY2xhc3MgJiYKKwkgICAgICAgICAodCA9IGNoZWNrX3R5cGVkZWYgKFNZTUJPTF9UWVBFIChzeW1fY2xhc3MpKSwKKwkgICAgICAgICAgKFRZUEVfQ09ERSAodCkgPT0gVFlQRV9DT0RFX1NUUlVDVAorCQkgICB8fCBUWVBFX0NPREUgKHQpID09IFRZUEVfQ09ERV9VTklPTikpKQorCSAgICAgICB7CisJICAgICAgICAgLyogQXJnIHRva2VuIGlzIG5vdCBkaWdpdHMgPT4gdHJ5IGl0IGFzIGEgZnVuY3Rpb24gbmFtZQorCQkgICAgRmluZCB0aGUgbmV4dCB0b2tlbihldmVyeXRoaW5nIHVwIHRvIGVuZCBvciBuZXh0IGJsYW5rKS4gKi8KKwkgICAgICAgICBpZiAoKiphcmdwdHIKKwkJICAgICAmJiBzdHJjaHIgKGdkYl9jb21wbGV0ZXJfcXVvdGVfY2hhcmFjdGVycywgKiphcmdwdHIpICE9IE5VTEwpCisJCSAgIHsKKwkJICAgICBwID0gc2tpcF9xdW90ZWQoKmFyZ3B0cik7CisJCSAgICAgKmFyZ3B0ciA9ICphcmdwdHIgKyAxOworCQkgICB9CisJICAgICAgICAgZWxzZQorCQkgICB7CisJICAgICAgICAgICAgIHAgPSAqYXJncHRyOworCSAgICAgICAgICAgICB3aGlsZSAoKnAgJiYgKnAhPScgJyAmJiAqcCE9J1x0JyAmJiAqcCE9JywnICYmICpwIT0nOicpIHArKzsKKwkJICAgfQorLyoKKwkgICAgICBxID0gb3BlcmF0b3JfY2hhcnMgKCphcmdwdHIsICZxMSk7CisJICAgICAgaWYgKHExIC0gcSkKKwkJeworCQkgIGNoYXIgKm9wbmFtZTsKKwkJICBjaGFyICp0bXAgPSBhbGxvY2EgKHExIC0gcSArIDEpOworCQkgIG1lbWNweSAodG1wLCBxLCBxMSAtIHEpOworCQkgIHRtcFtxMSAtIHFdID0gJ1wwJzsKKwkJICBvcG5hbWUgPSBjcGx1c19tYW5nbGVfb3BuYW1lICh0bXAsIERNR0xfQU5TSSk7CisJCSAgaWYgKG9wbmFtZSA9PSBOVUxMKQorCQkgICAgeworCQkgICAgICBlcnJvcl9iZWdpbiAoKTsKKwkJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgibm8gbWFuZ2xpbmcgZm9yIFwiJXNcIlxuIiwgdG1wKTsKKwkJICAgICAgY3BsdXNwbHVzX2hpbnQgKHNhdmVkX2FyZyk7CisJCSAgICAgIHJldHVybl90b190b3BfbGV2ZWwgKFJFVFVSTl9FUlJPUik7CisJCSAgICB9CisJCSAgY29weSA9IChjaGFyKikgYWxsb2NhICgzICsgc3RybGVuKG9wbmFtZSkpOworCQkgIHNwcmludGYgKGNvcHksICJfXyVzIiwgb3BuYW1lKTsKKwkJICBwID0gcTE7CisJCX0KKwkgICAgICBlbHNlCisqLworCQkgICB7CisJCSAgICAgY29weSA9IChjaGFyICopIGFsbG9jYSAocCAtICphcmdwdHIgKyAxICk7CisJCSAgICAgbWVtY3B5IChjb3B5LCAqYXJncHRyLCBwIC0gKmFyZ3B0cik7CisJCSAgICAgY29weVtwIC0gKmFyZ3B0cl0gPSAnXDAnOworCQkgICAgIGlmIChwICE9ICphcmdwdHIKKwkJICAgICAgICAgJiYgY29weVtwIC0gKmFyZ3B0ciAtIDFdCisJCSAgICAgICAgICYmIHN0cmNociAoZ2RiX2NvbXBsZXRlcl9xdW90ZV9jaGFyYWN0ZXJzLAorCQkJCSAgICBjb3B5W3AgLSAqYXJncHRyIC0gMV0pICE9IE5VTEwpCisJCSAgICAgICBjb3B5W3AgLSAqYXJncHRyIC0gMV0gPSAnXDAnOworCQkgICB9CisKKwkgICAgICAgICAvKiBubyBsaW5lIG51bWJlciBtYXkgYmUgc3BlY2lmaWVkICovCisJICAgICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKSBwKys7CisJICAgICAgICAgKmFyZ3B0ciA9IHA7CisKKwkgICAgICAgICBzeW0gPSAwOworCSAgICAgICAgIGkxID0gMDsJCS8qICBjb3VudGVyIGZvciB0aGUgc3ltYm9sIGFycmF5ICovCisJICAgICAgICAgc3ltX2FyciA9IChzdHJ1Y3Qgc3ltYm9sICoqKSBhbGxvY2EodG90YWxfbnVtYmVyX29mX21ldGhvZHMgKHQpCisJCQkJCQkgICAgICogc2l6ZW9mKHN0cnVjdCBzeW1ib2wgKikpOworCisJICAgICAgICAgaWYgKGRlc3RydWN0b3JfbmFtZV9wIChjb3B5LCB0KSkKKwkJICAgeworCQkgICAgIC8qIERlc3RydWN0b3JzIGFyZSBhIHNwZWNpYWwgY2FzZS4gICovCisJCSAgICAgaW50IG1faW5kZXgsIGZfaW5kZXg7CisKKwkJICAgICBpZiAoZ2V0X2Rlc3RydWN0b3JfZm5fZmllbGQgKHQsICZtX2luZGV4LCAmZl9pbmRleCkpCisJCSAgICAgICB7CisJCSAgICAgICAgIHN0cnVjdCBmbl9maWVsZCAqZiA9IFRZUEVfRk5fRklFTERMSVNUMSAodCwgbV9pbmRleCk7CisKKwkJICAgICAgICAgc3ltX2FycltpMV0gPQorCQkJICAgbG9va3VwX3N5bWJvbCAoVFlQRV9GTl9GSUVMRF9QSFlTTkFNRSAoZiwgZl9pbmRleCksCisJCQkJICAgICAgICAgIE5VTEwsIFZBUl9OQU1FU1BBQ0UsIChpbnQgKikgTlVMTCwKKwkJCQkgICAgICAgICAgKHN0cnVjdCBzeW10YWIgKiopTlVMTCk7CisJCSAgICAgICAgIGlmIChzeW1fYXJyW2kxXSkKKwkJCSAgIGkxKys7CisJCSAgICAgICB9CisJCSAgIH0KKwkgICAgICAgICBlbHNlCisJCSAgIGkxID0gZmluZF9tZXRob2RzICh0LCBjb3B5LCBzeW1fYXJyKTsKKwkgICAgICAgICBpZiAoaTEgPT0gMSkKKwkJICAgeworCQkgICAgIC8qIFRoZXJlIGlzIGV4YWN0bHkgb25lIGZpZWxkIHdpdGggdGhhdCBuYW1lLiAgKi8KKwkJICAgICBzeW0gPSBzeW1fYXJyWzBdOworCisJCSAgICAgaWYgKHN5bSAmJiBTWU1CT0xfQ0xBU1MgKHN5bSkgPT0gTE9DX0JMT0NLKQorCQkgICAgICAgeworCQkgICAgICAgICB2YWx1ZXMuc2FscyA9IChzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lICopCisJCQkgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUpKTsKKwkJICAgICAgICAgdmFsdWVzLm5lbHRzID0gMTsKKwkJICAgICAgICAgdmFsdWVzLnNhbHNbMF0gPSBmaW5kX2Z1bmN0aW9uX3N0YXJ0X3NhbCAoc3ltLAorCQkJCSAJCQkJICAgZnVuZmlyc3RsaW5lKTsKKwkJICAgICAgIH0KKwkJICAgICBlbHNlCisJCSAgICAgICB7CisJCSAgICAgICAgIHZhbHVlcy5uZWx0cyA9IDA7CisJCSAgICAgICB9CisJCSAgICAgcmV0dXJuIHZhbHVlczsKKwkJICAgfQorCSAgICAgICAgIGlmIChpMSA+IDApCisJCSAgIHsKKwkJICAgICAvKiBUaGVyZSBpcyBtb3JlIHRoYW4gb25lIGZpZWxkIHdpdGggdGhhdCBuYW1lCisJCSAgICAgICAgKG92ZXJsb2FkZWQpLiAgQXNrIHRoZSB1c2VyIHdoaWNoIG9uZSB0byB1c2UuICAqLworCQkgICAgIHJldHVybiBkZWNvZGVfbGluZV8yIChzeW1fYXJyLCBpMSwgZnVuZmlyc3RsaW5lLCBjYW5vbmljYWwpOworCQkgICB9CisJICAgICAgICAgZWxzZQorCQkgICB7CisJCSAgICAgY2hhciAqdG1wOworCisJCSAgICAgaWYgKE9QTkFNRV9QUkVGSVhfUCAoY29weSkpCisJCSAgICAgICB7CisJCSAgICAgICAgIHRtcCA9IChjaGFyICopYWxsb2NhIChzdHJsZW4gKGNvcHkrMykgKyA5KTsKKwkJICAgICAgICAgc3RyY3B5ICh0bXAsICJvcGVyYXRvciAiKTsKKwkJICAgICAgICAgc3RyY2F0ICh0bXAsIGNvcHkrMyk7CisJCSAgICAgICB9CisJCSAgICAgZWxzZQorCQkgICAgICAgdG1wID0gY29weTsKKwkJICAgICBlcnJvcl9iZWdpbiAoKTsKKwkJICAgICBpZiAodG1wWzBdID09ICd+JykKKwkJICAgICAgIHByaW50Zl9maWx0ZXJlZAorCQkgICAgICAgICAoInRoZSBjbGFzcyBgJXMnIGRvZXMgbm90IGhhdmUgZGVzdHJ1Y3RvciBkZWZpbmVkXG4iLAorCQkgICAgICAgICAgU1lNQk9MX1NPVVJDRV9OQU1FKHN5bV9jbGFzcykpOworCQkgICAgIGVsc2UKKwkJICAgICAgIHByaW50Zl9maWx0ZXJlZAorCQkgICAgICAgICAoInRoZSBjbGFzcyAlcyBkb2VzIG5vdCBoYXZlIGFueSBtZXRob2QgbmFtZWQgJXNcbiIsCisJCSAgICAgICAgICBTWU1CT0xfU09VUkNFX05BTUUoc3ltX2NsYXNzKSwgdG1wKTsKKwkJICAgICBjcGx1c3BsdXNfaGludCAoc2F2ZWRfYXJnKTsKKwkJICAgICByZXR1cm5fdG9fdG9wX2xldmVsIChSRVRVUk5fRVJST1IpOworCQkgICB9CisJICAgICAgIH0KKworICAgICAgICAgICAgIC8qIE1vdmUgcG9pbnRlciB1cCB0byBuZXh0IHBvc3NpYmxlIGNsYXNzL25hbWVzcGFjZSB0b2tlbiAqLworICAgICAgICAgICAgICBwID0gcDIgKyAxOyAvKiByZXN0YXJ0IHdpdGggb2xkIHZhbHVlICsxICovCisgICAgICAgICAgICAgIC8qIE1vdmUgcG9pbnRlciBhaGVhZCB0byBuZXh0IGRvdWJsZS1jb2xvbiAqLworICAgICAgICAgICAgICB3aGlsZSAoKnAgJiYgKHBbMF0gIT0gJyAnKSAmJiAocFswXSAhPSAnXHQnKSAmJiAocFswXSAhPSAnXCcnKSkgeworICAgICAgICAgICAgICAgIGlmIChwWzBdID09ICc8JykgeworICAgICAgICAgICAgICAgICAgdGVtcF9lbmQgPSBmaW5kX3RlbXBsYXRlX25hbWVfZW5kIChwKTsKKyAgICAgICAgICAgICAgICAgIGlmICghdGVtcF9lbmQpCisgICAgICAgICAgICAgICAgICAgIGVycm9yICgibWFsZm9ybWVkIHRlbXBsYXRlIHNwZWNpZmljYXRpb24gaW4gY29tbWFuZCIpOworICAgICAgICAgICAgICAgICAgcCA9IHRlbXBfZW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgocFswXSA9PSAnOicpICYmIChwWzFdID09ICc6JykpCisgICAgICAgICAgICAgICAgICBicmVhazsgLyogZm91bmQgZG91YmxlLWNvbG9uICovCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoKnAgIT0gJzonKQorICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBvdXQgb2YgdGhlIHdoaWxlICgxKSAqLworCisgICAgICAgICAgICAgIHAyID0gcDsgLyogc2F2ZSByZXN0YXJ0IGZvciBuZXh0IHRpbWUgYXJvdW5kICovCisgICAgICAgICAgICAgICphcmdwdHIgPSBzYXZlZF9hcmcyOyAvKiByZXN0b3JlIGFyZ3B0ciAqLworICAgICAgICAgICAgfSAvKiB3aGlsZSAoMSkgKi8KKworICAgICAgICAgIC8qIExhc3QgY2hhbmNlIGF0dGVtcHQgLS0gY2hlY2sgZW50aXJlIG5hbWUgYXMgYSBzeW1ib2wgKi8KKyAgICAgICAgICAvKiBVc2UgImNvcHkiIGluIHByZXBhcmF0aW9uIGZvciBqdW1waW5nIG91dCBvZiB0aGlzIGJsb2NrLAorICAgICAgICAgICAgIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB1c2FnZSBmb2xsb3dpbmcgdGhlIGp1bXAgdGFyZ2V0ICovCisgICAgICAgICAgY29weSA9IChjaGFyICopIGFsbG9jYSAocCAtIHNhdmVkX2FyZzIgKyAxKTsKKyAgICAgICAgICBtZW1jcHkgKGNvcHksIHNhdmVkX2FyZzIsIHAgLSBzYXZlZF9hcmcyKTsKKyAgICAgICAgICAvKiBOb3RlOiBpZiBpc19xdW90ZWQgc2hvdWxkIGJlIHRydWUsIHdlIHNudWZmIG91dCBxdW90ZSBoZXJlIGFueXdheSAqLworICAgICAgICAgIGNvcHlbcC1zYXZlZF9hcmcyXSA9ICdcMDAwJzsgCisgICAgICAgICAgLyogU2V0IGFyZ3B0ciB0byBza2lwIG92ZXIgdGhlIG5hbWUgKi8KKyAgICAgICAgICAqYXJncHRyID0gKCpwID09ICdcJycpID8gcCArIDEgOiBwOworICAgICAgICAgIC8qIExvb2sgdXAgZW50aXJlIG5hbWUgKi8KKyAgICAgICAgICBzeW0gPSBsb29rdXBfc3ltYm9sIChjb3B5LCAwLCBWQVJfTkFNRVNQQUNFLCAwLCAmc3ltX3N5bXRhYik7CisgICAgICAgICAgcyA9IChzdHJ1Y3Qgc3ltdGFiICopIDA7CisgICAgICAgICAgLyogUHJlcGFyZSB0byBqdW1wOiByZXN0b3JlIHRoZSAiIGlmIChjb25kaXRpb24pIiBzbyBvdXRlciBsYXllcnMgc2VlIGl0ICovCisgICAgICAgICAgaWYgKGhhc19pZikKKyAgICAgICAgICAgICppaSA9ICcgJzsKKyAgICAgICAgICAvKiBTeW1ib2wgd2FzIGZvdW5kIC0tPiBqdW1wIHRvIG5vcm1hbCBzeW1ib2wgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgICBDb2RlIGZvbGxvd2luZyAic3ltYm9sX2ZvdW5kIiBleHBlY3RzICJjb3B5IiB0byBoYXZlIHRoZQorICAgICAgICAgICAgIHN5bWJvbCBuYW1lLCAic3ltIiB0byBoYXZlIHRoZSBzeW1ib2wgcG9pbnRlciwgInMiIHRvIGJlCisgICAgICAgICAgICAgYSBzcGVjaWZpZWQgZmlsZSdzIHN5bXRhYiwgYW5kIHN5bV9zeW10YWIgdG8gYmUgdGhlIHN5bWJvbCdzCisgICAgICAgICAgICAgc3ltdGFiLiAqLworICAgICAgICAgIC8qIEJ5IGp1bXBpbmcgdGhlcmUgd2UgYXZvaWQgZmFsbGluZyB0aHJvdWdoIHRoZSBGSUxFOkxJTkUgYW5kCisgICAgICAgICAgICAgRklMRTpGVU5DIHByb2Nlc3Npbmcgc3R1ZmYgYmVsb3cgKi8KKyAgICAgICAgICBpZiAoc3ltKQorICAgICAgICAgICAgZ290byBzeW1ib2xfZm91bmQ7CisKKyAgICAgICAgICAvKiBDb3VsZG4ndCBmaW5kIGFueSBpbnRlcnByZXRhdGlvbiBhcyBjbGFzc2VzL25hbWVzcGFjZXMsIHNvIGdpdmUgdXAgKi8KKyAgICAgICAgICBlcnJvcl9iZWdpbiAoKTsKKyAgICAgICAgICAvKiBUaGUgcXVvdGVzIGFyZSBpbXBvcnRhbnQgaWYgY29weSBpcyBlbXB0eS4gICovCisgICAgICAgICAgcHJpbnRmX2ZpbHRlcmVkCisgICAgICAgICAgICAoIkNhbid0IGZpbmQgbWVtYmVyIG9mIG5hbWVzcGFjZSwgY2xhc3MsIHN0cnVjdCwgb3IgdW5pb24gbmFtZWQgXCIlc1wiXG4iLCBjb3B5KTsKKyAgICAgICAgICBjcGx1c3BsdXNfaGludCAoc2F2ZWRfYXJnKTsKKyAgICAgICAgICByZXR1cm5fdG9fdG9wX2xldmVsIChSRVRVUk5fRVJST1IpOworICAgICAgICB9CisgICAgICAvKiAgZW5kIG9mIEMrKyAgKi8KKworCisgICAgICAvKiBFeHRyYWN0IHRoZSBmaWxlIG5hbWUuICAqLworICAgICAgcDEgPSBwOworICAgICAgd2hpbGUgKHAgIT0gKmFyZ3B0ciAmJiBwWy0xXSA9PSAnICcpIC0tcDsKKyAgICAgIGNvcHkgPSAoY2hhciAqKSBhbGxvY2EgKHAgLSAqYXJncHRyICsgMSk7CisgICAgICBtZW1jcHkgKGNvcHksICphcmdwdHIsIHAgLSAqYXJncHRyKTsKKyAgICAgIGNvcHlbcCAtICphcmdwdHJdID0gMDsKKworICAgICAgLyogRmluZCB0aGF0IGZpbGUncyBkYXRhLiAgKi8KKyAgICAgIHMgPSBsb29rdXBfc3ltdGFiIChjb3B5KTsKKyAgICAgIGlmIChzID09IDApCisJeworCSAgaWYgKCFoYXZlX2Z1bGxfc3ltYm9scyAoKSAmJiAhaGF2ZV9wYXJ0aWFsX3N5bWJvbHMgKCkpCisJICAgIGVycm9yIChub19zeW10YWJfbXNnKTsKKwkgIGVycm9yICgiTm8gc291cmNlIGZpbGUgbmFtZWQgJXMuIiwgY29weSk7CisJfQorCisgICAgICAvKiBEaXNjYXJkIHRoZSBmaWxlIG5hbWUgZnJvbSB0aGUgYXJnLiAgKi8KKyAgICAgIHAgPSBwMSArIDE7CisgICAgICB3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcpIHArKzsKKyAgICAgICphcmdwdHIgPSBwOworICAgIH0KKyAgZWxzZSB7CisgICAgLyogQ2hlY2sgaWYgd2hhdCB3ZSBoYXZlIHRpbGwgbm93IGlzIGEgc3ltYm9sIG5hbWUgKi8KKworICAgIC8qIFdlIG1heSBiZSBsb29raW5nIGF0IGEgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBzdWNoCisgICAgICAgYXMgImZvbzxpbnQ+Ii4gIENoZWNrIGhlcmUgd2hldGhlciB3ZSBrbm93IGFib3V0IGl0LAorICAgICAgIGluc3RlYWQgb2YgZmFsbGluZyB0aHJvdWdoIHRvIHRoZSBjb2RlIGJlbG93IHdoaWNoCisgICAgICAgaGFuZGxlcyBvcmRpbmFyeSBmdW5jdGlvbiBuYW1lcywgYmVjYXVzZSB0aGF0IGNvZGUKKyAgICAgICBkb2Vzbid0IGxpa2Ugc2VlaW5nICc8JyBhbmQgJz4nIGluIGEgbmFtZSAtLSB0aGUKKyAgICAgICBza2lwX3F1b3RlZCBjYWxsIGRvZXNuJ3QgZ28gcGFzdCB0aGVtLiAgU28gc2VlIGlmIHdlCisgICAgICAgY2FuIGZpZ3VyZSBpdCBvdXQgcmlnaHQgbm93LiAqLyAKKworICAgIGNvcHkgPSAoY2hhciAqKSBhbGxvY2EgKHAgLSAqYXJncHRyICsgMSk7CisgICAgbWVtY3B5IChjb3B5LCAqYXJncHRyLCBwIC0gKmFyZ3B0cik7CisgICAgY29weVtwIC0gKmFyZ3B0cl0gPSAnXDAwMCc7CisgICAgc3ltID0gbG9va3VwX3N5bWJvbCAoY29weSwgMCwgVkFSX05BTUVTUEFDRSwgMCwgJnN5bV9zeW10YWIpOworICAgIGlmIChzeW0pIHsKKyAgICAgIC8qIFllcywgd2UgaGF2ZSBhIHN5bWJvbDsganVtcCB0byBzeW1ib2wgcHJvY2Vzc2luZyAqLworICAgICAgLyogQ29kZSBhZnRlciBzeW1ib2xfZm91bmQgZXhwZWN0cyBTLCBTWU1fU1lNVEFCLCBTWU0sIAorICAgICAgICAgYW5kIENPUFkgdG8gYmUgc2V0IGNvcnJlY3RseSAqLyAKKyAgICAgIGlmIChoYXNfaWYpCisgICAgICAgICppaSA9ICcgJzsKKyAgICAgICphcmdwdHIgPSAoKnAgPT0gJ1wnJykgPyBwICsgMSA6IHA7CisgICAgICBzID0gKHN0cnVjdCBzeW10YWIgKikgMDsKKyAgICAgIGdvdG8gc3ltYm9sX2ZvdW5kOworICAgIH0KKyAgICAvKiBPdGhlcndpc2UgZmFsbCBvdXQgZnJvbSBoZXJlIGFuZCBnbyB0byBmaWxlL2xpbmUgc3BlYworICAgICAgIHByb2Nlc3NpbmcsIGV0Yy4gKi8gCisgIH0KKworICAvKiBTIGlzIHNwZWNpZmllZCBmaWxlJ3Mgc3ltdGFiLCBvciAwIGlmIG5vIGZpbGUgc3BlY2lmaWVkLgorICAgICBhcmcgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBmaWxlIG5hbWUuICAqLworCisgIC8qIENoZWNrIHdoZXRoZXIgYXJnIGlzIGFsbCBkaWdpdHMgKGFuZCBzaWduKSAqLworCisgIHEgPSAqYXJncHRyOworICBpZiAoKnEgPT0gJy0nIHx8ICpxID09ICcrJykgcSsrOworICB3aGlsZSAoKnEgPj0gJzAnICYmICpxIDw9ICc5JykKKyAgICBxKys7CisKKyAgaWYgKHEgIT0gKmFyZ3B0ciAmJiAoKnEgPT0gMCB8fCAqcSA9PSAnICcgfHwgKnEgPT0gJ1x0JyB8fCAqcSA9PSAnLCcpKQorICAgIHsKKyAgICAgIC8qIFdlIGZvdW5kIGEgdG9rZW4gY29uc2lzdGluZyBvZiBhbGwgZGlnaXRzIC0tIGF0IGxlYXN0IG9uZSBkaWdpdC4gICovCisgICAgICBlbnVtIHNpZ24ge25vbmUsIHBsdXMsIG1pbnVzfSBzaWduID0gbm9uZTsKKworICAgICAgLyogV2UgbWlnaHQgbmVlZCBhIGNhbm9uaWNhbCBsaW5lIHNwZWMgaWYgbm8gZmlsZSB3YXMgc3BlY2lmaWVkLiAgKi8KKyAgICAgIGludCBuZWVkX2Nhbm9uaWNhbCA9IChzID09IDApID8gMSA6IDA7CisKKyAgICAgIC8qIFRoaXMgaXMgd2hlcmUgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGdvb2QgZGVmYXVsdHMuCisJIFdlIG11c3QgZ3VhcmFudGVlIHRoYXQgdGhpcyBzZWN0aW9uIG9mIGNvZGUgaXMgbmV2ZXIgZXhlY3V0ZWQKKwkgd2hlbiB3ZSBhcmUgY2FsbGVkIHdpdGgganVzdCBhIGZ1bmN0aW9uIG5hbWUsIHNpbmNlCisJIHNlbGVjdF9zb3VyY2Vfc3ltdGFiIGNhbGxzIHVzIHdpdGggc3VjaCBhbiBhcmd1bWVudCAgKi8KKworICAgICAgaWYgKHMgPT0gMCAmJiBkZWZhdWx0X3N5bXRhYiA9PSAwKQorCXsKKwkgIHNlbGVjdF9zb3VyY2Vfc3ltdGFiICgwKTsKKwkgIGRlZmF1bHRfc3ltdGFiID0gY3VycmVudF9zb3VyY2Vfc3ltdGFiOworCSAgZGVmYXVsdF9saW5lID0gY3VycmVudF9zb3VyY2VfbGluZTsKKwl9CisKKyAgICAgIGlmICgqKmFyZ3B0ciA9PSAnKycpCisJc2lnbiA9IHBsdXMsICgqYXJncHRyKSsrOworICAgICAgZWxzZSBpZiAoKiphcmdwdHIgPT0gJy0nKQorCXNpZ24gPSBtaW51cywgKCphcmdwdHIpKys7CisgICAgICB2YWwubGluZSA9IGF0b2kgKCphcmdwdHIpOworICAgICAgc3dpdGNoIChzaWduKQorCXsKKwljYXNlIHBsdXM6CisJICBpZiAocSA9PSAqYXJncHRyKQorCSAgICB2YWwubGluZSA9IDU7CisJICBpZiAocyA9PSAwKQorCSAgICB2YWwubGluZSA9IGRlZmF1bHRfbGluZSArIHZhbC5saW5lOworCSAgYnJlYWs7CisJY2FzZSBtaW51czoKKwkgIGlmIChxID09ICphcmdwdHIpCisJICAgIHZhbC5saW5lID0gMTU7CisJICBpZiAocyA9PSAwKQorCSAgICB2YWwubGluZSA9IGRlZmF1bHRfbGluZSAtIHZhbC5saW5lOworCSAgZWxzZQorCSAgICB2YWwubGluZSA9IDE7CisJICBicmVhazsKKwljYXNlIG5vbmU6CisJICBicmVhazsJLyogTm8gbmVlZCB0byBhZGp1c3QgdmFsLmxpbmUuICAqLworCX0KKworICAgICAgd2hpbGUgKCpxID09ICcgJyB8fCAqcSA9PSAnXHQnKSBxKys7CisgICAgICAqYXJncHRyID0gcTsKKyAgICAgIGlmIChzID09IDApCisJcyA9IGRlZmF1bHRfc3ltdGFiOworCisgICAgICAvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoaXMgc291cmNlIGZpbGUgaGFzIG1vcmUgdGhhbiBvbmUgc3ltdGFiLCAKKwkgYW5kIHRoYXQgdGhlIG5ldyBsaW5lIG51bWJlciBzcGVjaWZpY2F0aW9uIGhhcyBtb3ZlZCB1cyBmcm9tIHRoZQorCSBkZWZhdWx0IChpbiBzKSB0byBhIG5ldyBvbmUuICAqLworICAgICAgdmFsLnN5bXRhYiA9IGZpbmRfbGluZV9zeW10YWIgKHMsIHZhbC5saW5lLCBOVUxMLCBOVUxMKTsKKyAgICAgIGlmICh2YWwuc3ltdGFiID09IDApCisJdmFsLnN5bXRhYiA9IHM7CisgICAgIAorICAgICAgdmFsLnBjID0gMDsKKyAgICAgIHZhbHVlcy5zYWxzID0gKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgKikKKwl4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUpKTsKKyAgICAgIHZhbHVlcy5zYWxzWzBdID0gdmFsOworICAgICAgdmFsdWVzLm5lbHRzID0gMTsKKyAgICAgIGlmIChuZWVkX2Nhbm9uaWNhbCkKKwlidWlsZF9jYW5vbmljYWxfbGluZV9zcGVjICh2YWx1ZXMuc2FscywgTlVMTCwgY2Fub25pY2FsKTsKKyAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgfQorCisgIC8qIEFyZyB0b2tlbiBpcyBub3QgZGlnaXRzID0+IHRyeSBpdCBhcyBhIHZhcmlhYmxlIG5hbWUKKyAgICAgRmluZCB0aGUgbmV4dCB0b2tlbiAoZXZlcnl0aGluZyB1cCB0byBlbmQgb3IgbmV4dCB3aGl0ZXNwYWNlKS4gICovCisKKyAgaWYgKCoqYXJncHRyID09ICckJykJCS8qIE1heSBiZSBhIGNvbnZlbmllbmNlIHZhcmlhYmxlICovCisgICAgcCA9IHNraXBfcXVvdGVkICgqYXJncHRyICsgKCgoKmFyZ3B0cilbMV0gPT0gJyQnKSA/IDIgOiAxKSk7ICAvKiBPbmUgb3IgdHdvICQgY2hhcnMgcG9zc2libGUgKi8KKyAgZWxzZSBpZiAoaXNfcXVvdGVkKQorICAgIHsKKyAgICAgIHAgPSBza2lwX3F1b3RlZCAoKmFyZ3B0cik7CisgICAgICBpZiAocFstMV0gIT0gJ1wnJykKKyAgICAgICAgZXJyb3IgKCJVbm1hdGNoZWQgc2luZ2xlIHF1b3RlLiIpOworICAgIH0KKyAgZWxzZSBpZiAoaGFzX3BhcmVucykKKyAgICB7CisgICAgICBwID0gcHArMTsKKyAgICB9CisgIGVsc2UgCisgICAgeworICAgICAgcCA9IHNraXBfcXVvdGVkKCphcmdwdHIpOworICAgIH0KKworICBjb3B5ID0gKGNoYXIgKikgYWxsb2NhIChwIC0gKmFyZ3B0ciArIDEpOworICBtZW1jcHkgKGNvcHksICphcmdwdHIsIHAgLSAqYXJncHRyKTsKKyAgY29weVtwIC0gKmFyZ3B0cl0gPSAnXDAnOworICBpZiAocCAhPSAqYXJncHRyCisgICAgICAmJiBjb3B5WzBdCisgICAgICAmJiBjb3B5WzBdID09IGNvcHkgW3AgLSAqYXJncHRyIC0gMV0KKyAgICAgICYmIHN0cmNociAoZ2RiX2NvbXBsZXRlcl9xdW90ZV9jaGFyYWN0ZXJzLCBjb3B5WzBdKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNvcHkgW3AgLSAqYXJncHRyIC0gMV0gPSAnXDAnOworICAgICAgY29weSsrOworICAgIH0KKyAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKSBwKys7CisgICphcmdwdHIgPSBwOworCisgIC8qIElmIGl0IHN0YXJ0cyB3aXRoICQ6IG1heSBiZSBhIGxlZ2l0aW1hdGUgdmFyaWFibGUgb3Igcm91dGluZSBuYW1lCisgICAgIChlLmcuIEhQLVVYIG1pbGxpY29kZSByb3V0aW5lcyBzdWNoIGFzICQkZHluY2FsbCksIG9yIGl0IG1heQorICAgICBiZSBoaXN0b3J5IHZhbHVlLCBvciBpdCBtYXkgYmUgYSBjb252ZW5pZW5jZSB2YXJpYWJsZSAqLyAKKworICBpZiAoKmNvcHkgPT0gJyQnKQorICAgIHsKKyAgICAgIHZhbHVlX3B0ciB2YWx4OworICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgIGludCBuZWVkX2Nhbm9uaWNhbCA9IDA7CisKKyAgICAgIHAgPSAoY29weVsxXSA9PSAnJCcpID8gY29weSArIDIgOiBjb3B5ICsgMTsKKyAgICAgIHdoaWxlICgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKQorICAgICAgICBwKys7CisgICAgICBpZiAoISpwKSAvKiByZWFjaGVkIGVuZCBvZiB0b2tlbiB3aXRob3V0IGhpdHRpbmcgbm9uLWRpZ2l0ICovCisgICAgICAgIHsKKyAgICAgICAgICAvKiBXZSBoYXZlIGEgdmFsdWUgaGlzdG9yeSByZWZlcmVuY2UgKi8KKyAgICAgICAgICBzc2NhbmYgKChjb3B5WzFdID09ICckJykgPyBjb3B5ICsgMiA6IGNvcHkgKyAxLCAiJWQiLCAmaW5kZXgpOworICAgICAgICAgIHZhbHggPSBhY2Nlc3NfdmFsdWVfaGlzdG9yeSAoKGNvcHlbMV0gPT0gJyQnKSA/IC1pbmRleCA6IGluZGV4KTsKKyAgICAgICAgICBpZiAoVFlQRV9DT0RFIChWQUxVRV9UWVBFICh2YWx4KSkgIT0gVFlQRV9DT0RFX0lOVCkKKyAgICAgICAgICAgIGVycm9yICgiSGlzdG9yeSB2YWx1ZXMgdXNlZCBpbiBsaW5lIHNwZWNzIG11c3QgaGF2ZSBpbnRlZ2VyIHZhbHVlcy4iKTsKKyAgICAgICAgfQorICAgICAgZWxzZSAKKyAgICAgICAgeworICAgICAgICAgIC8qIE5vdCBhbGwgZGlnaXRzIC0tIG1heSBiZSB1c2VyIHZhcmlhYmxlL2Z1bmN0aW9uIG9yIGEKKyAgICAgICAgICAgICAgY29udmVuaWVuY2UgdmFyaWFibGUgKi8KKyAgICAgICAgICAKKyAgICAgICAgICAvKiBMb29rIHVwIGVudGlyZSBuYW1lIGFzIGEgc3ltYm9sIGZpcnN0ICovCisgICAgICAgICAgc3ltID0gbG9va3VwX3N5bWJvbCAoY29weSwgMCwgVkFSX05BTUVTUEFDRSwgMCwgJnN5bV9zeW10YWIpOyAKKyAgICAgICAgICBzID0gKHN0cnVjdCBzeW10YWIgKikgMDsKKyAgICAgICAgICBuZWVkX2Nhbm9uaWNhbCA9IDE7CisgICAgICAgICAgLyogU3ltYm9sIHdhcyBmb3VuZCAtLT4ganVtcCB0byBub3JtYWwgc3ltYm9sIHByb2Nlc3NpbmcuCisgICAgICAgICAgICAgQ29kZSBmb2xsb3dpbmcgInN5bWJvbF9mb3VuZCIgZXhwZWN0cyAiY29weSIgdG8gaGF2ZSB0aGUKKyAgICAgICAgICAgICBzeW1ib2wgbmFtZSwgInN5bSIgdG8gaGF2ZSB0aGUgc3ltYm9sIHBvaW50ZXIsICJzIiB0byBiZQorICAgICAgICAgICAgIGEgc3BlY2lmaWVkIGZpbGUncyBzeW10YWIsIGFuZCBzeW1fc3ltdGFiIHRvIGJlIHRoZSBzeW1ib2wncworICAgICAgICAgICAgIHN5bXRhYi4gKi8KKyAgICAgICAgICBpZiAoc3ltKQorICAgICAgICAgICAgZ290byBzeW1ib2xfZm91bmQ7CisKKyAgICAgICAgICAvKiBJZiBzeW1ib2wgd2FzIG5vdCBmb3VuZCwgbG9vayBpbiBtaW5pbWFsIHN5bWJvbCB0YWJsZXMgKi8gCisgICAgICAgICAgbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbCAoY29weSwgMCwgMCk7CisgICAgICAgICAgLyogTWluIHN5bWJvbCB3YXMgZm91bmQgLS0+IGp1bXAgdG8gbWluc3ltIHByb2Nlc3NpbmcuICovIAorICAgICAgICAgIGlmIChtc3ltYm9sKQorICAgICAgICAgICAgZ290byBtaW5pbWFsX3N5bWJvbF9mb3VuZDsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBOb3QgYSB1c2VyIHZhcmlhYmxlIG9yIGZ1bmN0aW9uIC0tIG11c3QgYmUgY29udmVuaWVuY2UgdmFyaWFibGUgKi8KKyAgICAgICAgICBuZWVkX2Nhbm9uaWNhbCA9IChzID09IDApID8gMSA6IDA7CisgICAgICAgICAgdmFseCA9IHZhbHVlX29mX2ludGVybmFsdmFyIChsb29rdXBfaW50ZXJuYWx2YXIgKGNvcHkgKyAxKSk7CisgICAgICAgICAgaWYgKFRZUEVfQ09ERSAoVkFMVUVfVFlQRSAodmFseCkpICE9IFRZUEVfQ09ERV9JTlQpCisgICAgICAgICAgICBlcnJvciAoIkNvbnZlbmllbmNlIHZhcmlhYmxlcyB1c2VkIGluIGxpbmUgc3BlY3MgbXVzdCBoYXZlIGludGVnZXIgdmFsdWVzLiIpOworICAgICAgICB9CisKKyAgICAgIC8qIEVpdGhlciBoaXN0b3J5IHZhbHVlIG9yIGNvbnZlbmllbmNlIHZhbHVlIGZyb20gYWJvdmUsIGluIHZhbHggKi8gCisgICAgICB2YWwuc3ltdGFiID0gcyA/IHMgOiBkZWZhdWx0X3N5bXRhYjsKKyAgICAgIHZhbC5saW5lID0gdmFsdWVfYXNfbG9uZyAodmFseCk7CisgICAgICB2YWwucGMgPSAwOworCisgICAgICB2YWx1ZXMuc2FscyA9IChzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lICopeG1hbGxvYyAoc2l6ZW9mIHZhbCk7CisgICAgICB2YWx1ZXMuc2Fsc1swXSA9IHZhbDsKKyAgICAgIHZhbHVlcy5uZWx0cyA9IDE7CisKKyAgICAgIGlmIChuZWVkX2Nhbm9uaWNhbCkKKwlidWlsZF9jYW5vbmljYWxfbGluZV9zcGVjICh2YWx1ZXMuc2FscywgTlVMTCwgY2Fub25pY2FsKTsKKworICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICB9CisKKworICAvKiBMb29rIHVwIHRoYXQgdG9rZW4gYXMgYSB2YXJpYWJsZS4KKyAgICAgSWYgZmlsZSBzcGVjaWZpZWQsIHVzZSB0aGF0IGZpbGUncyBwZXItZmlsZSBibG9jayB0byBzdGFydCB3aXRoLiAgKi8KKworICBzeW0gPSBsb29rdXBfc3ltYm9sIChjb3B5LAorCQkgICAgICAgKHMgPyBCTE9DS1ZFQ1RPUl9CTE9DSyAoQkxPQ0tWRUNUT1IgKHMpLCBTVEFUSUNfQkxPQ0spCisJCQk6IGdldF9zZWxlY3RlZF9ibG9jayAoKSksCisJCSAgICAgICBWQVJfTkFNRVNQQUNFLCAwLCAmc3ltX3N5bXRhYik7CisgIAorc3ltYm9sX2ZvdW5kOiAgIC8qIFdlIGFsc28ganVtcCBoZXJlIGZyb20gaW5zaWRlIHRoZSBDKysgY2xhc3MvbmFtZXNwYWNlIAorICAgICAgICAgICAgICAgICAgIGNvZGUgb24gZmluZGluZyBhIHN5bWJvbCBvZiB0aGUgZm9ybSAiQTo6Qjo6QyIgKi8KKworICBpZiAoc3ltICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKFNZTUJPTF9DTEFTUyAoc3ltKSA9PSBMT0NfQkxPQ0spCisJeworCSAgLyogQXJnIGlzIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gKi8KKwkgIHZhbHVlcy5zYWxzID0gKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgKikKKwkgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lKSk7CisJICB2YWx1ZXMuc2Fsc1swXSA9IGZpbmRfZnVuY3Rpb25fc3RhcnRfc2FsIChzeW0sIGZ1bmZpcnN0bGluZSk7CisJICB2YWx1ZXMubmVsdHMgPSAxOworCisJICAvKiBEb24ndCB1c2UgdGhlIFNZTUJPTF9MSU5FOyBpZiB1c2VkIGF0IGFsbCBpdCBwb2ludHMgdG8KKwkgICAgIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgb3IgdGhlcmVhYm91dHMsIG5vdAorCSAgICAgdGhlIGZpcnN0IGxpbmUgb2YgY29kZS4gICovCisKKwkgIC8qIFdlIG1pZ2h0IG5lZWQgYSBjYW5vbmljYWwgbGluZSBzcGVjIGlmIGl0IGlzIGEgc3RhdGljCisJICAgICBmdW5jdGlvbi4gICovCisJICBpZiAocyA9PSAwKQorCSAgICB7CisJICAgICAgc3RydWN0IGJsb2NrdmVjdG9yICpidiA9IEJMT0NLVkVDVE9SIChzeW1fc3ltdGFiKTsKKwkgICAgICBzdHJ1Y3QgYmxvY2sgKmIgPSBCTE9DS1ZFQ1RPUl9CTE9DSyAoYnYsIFNUQVRJQ19CTE9DSyk7CisJICAgICAgaWYgKGxvb2t1cF9ibG9ja19zeW1ib2wgKGIsIGNvcHksIFZBUl9OQU1FU1BBQ0UpICE9IE5VTEwpCisJCWJ1aWxkX2Nhbm9uaWNhbF9saW5lX3NwZWMgKHZhbHVlcy5zYWxzLCBjb3B5LCBjYW5vbmljYWwpOworCSAgICB9CisJICByZXR1cm4gdmFsdWVzOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoZnVuZmlyc3RsaW5lKQorCSAgICBlcnJvciAoIlwiJXNcIiBpcyBub3QgYSBmdW5jdGlvbiIsIGNvcHkpOworCSAgZWxzZSBpZiAoU1lNQk9MX0xJTkUgKHN5bSkgIT0gMCkKKwkgICAgeworCSAgICAgIC8qIFdlIGtub3cgaXRzIGxpbmUgbnVtYmVyLiAgKi8KKwkgICAgICB2YWx1ZXMuc2FscyA9IChzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lICopCisJCXhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHN5bXRhYl9hbmRfbGluZSkpOworCSAgICAgIHZhbHVlcy5uZWx0cyA9IDE7CisJICAgICAgbWVtc2V0ICgmdmFsdWVzLnNhbHNbMF0sIDAsIHNpemVvZiAodmFsdWVzLnNhbHNbMF0pKTsKKwkgICAgICB2YWx1ZXMuc2Fsc1swXS5zeW10YWIgPSBzeW1fc3ltdGFiOworCSAgICAgIHZhbHVlcy5zYWxzWzBdLmxpbmUgPSBTWU1CT0xfTElORSAoc3ltKTsKKwkgICAgICByZXR1cm4gdmFsdWVzOworCSAgICB9CisJICBlbHNlCisJICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBpZiBpdCBpcyBjb21waWxlZCB3aXRoIGEgY29tcGlsZXIgd2hpY2ggZG9lc24ndAorCSAgICAgICBwdXQgb3V0IGxpbmUgbnVtYmVycyBmb3IgdmFyaWFibGVzLiAgKi8KKwkgICAgLyogRklYTUU6IFNob3VsZG4ndCB3ZSBqdXN0IHNldCAubGluZSBhbmQgLnN5bXRhYiB0byB6ZXJvCisJICAgICAgIGFuZCByZXR1cm4/ICBGb3IgZXhhbXBsZSwgImluZm8gbGluZSBmb28iIGNvdWxkIHByaW50CisJICAgICAgIHRoZSBhZGRyZXNzLiAgKi8KKwkgICAgZXJyb3IgKCJMaW5lIG51bWJlciBub3Qga25vd24gZm9yIHN5bWJvbCBcIiVzXCIiLCBjb3B5KTsKKwl9CisgICAgfQorCisgIG1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wgKGNvcHksIE5VTEwsIE5VTEwpOworCittaW5pbWFsX3N5bWJvbF9mb3VuZDogLyogV2UgYWxzbyBqdW1wIGhlcmUgZnJvbSB0aGUgY2FzZSBmb3IgdmFyaWFibGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBiZWdpbiB3aXRoICckJyAqLworICAKKyAgaWYgKG1zeW1ib2wgIT0gTlVMTCkKKyAgICB7CisgICAgICB2YWx1ZXMuc2FscyA9IChzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lICopCisJeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lKSk7CisgICAgICB2YWx1ZXMuc2Fsc1swXSA9IGZpbmRfcGNfc2VjdF9saW5lICggU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpLCAKKwkJCQkJICAgKHN0cnVjdCBzZWMgKikwLDAgKTsKKyAgICAgIHZhbHVlcy5zYWxzWzBdLnNlY3Rpb24gPSBTWU1CT0xfQkZEX1NFQ1RJT04gKG1zeW1ib2wpOworICAgICAgaWYgKGZ1bmZpcnN0bGluZSkKKwl7CisJICB2YWx1ZXMuc2Fsc1swXS5wYyArPSBGVU5DVElPTl9TVEFSVF9PRkZTRVQ7CisJICBTS0lQX1BST0xPR1VFICh2YWx1ZXMuc2Fsc1swXS5wYyk7CisJfQorICAgICAgdmFsdWVzLm5lbHRzID0gMTsKKyAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgfQorCisgIGlmICghaGF2ZV9mdWxsX3N5bWJvbHMgKCkgJiYKKyAgICAgICFoYXZlX3BhcnRpYWxfc3ltYm9scyAoKSAmJiAhaGF2ZV9taW5pbWFsX3N5bWJvbHMgKCkpCisgICAgZXJyb3IgKG5vX3N5bXRhYl9tc2cpOworCisgIGVycm9yICgiRnVuY3Rpb24gXCIlc1wiIG5vdCBkZWZpbmVkLiIsIGNvcHkpOworICByZXR1cm4gdmFsdWVzOwkvKiBmb3IgbGludCAqLworfQorCitzdHJ1Y3Qgc3ltdGFic19hbmRfbGluZXMKK2RlY29kZV9saW5lX3NwZWMgKHN0cmluZywgZnVuZmlyc3RsaW5lKQorICAgICBjaGFyICpzdHJpbmc7CisgICAgIGludCBmdW5maXJzdGxpbmU7Cit7CisgIHN0cnVjdCBzeW10YWJzX2FuZF9saW5lcyBzYWxzOworICBpZiAoc3RyaW5nID09IDApCisgICAgZXJyb3IgKCJFbXB0eSBsaW5lIHNwZWNpZmljYXRpb24uIik7CisgIHNhbHMgPSBkZWNvZGVfbGluZV8xICgmc3RyaW5nLCBmdW5maXJzdGxpbmUsCisJCQljdXJyZW50X3NvdXJjZV9zeW10YWIsIGN1cnJlbnRfc291cmNlX2xpbmUsCisJCQkoY2hhciAqKiopTlVMTCk7CisgIGlmICgqc3RyaW5nKQorICAgIGVycm9yICgiSnVuayBhdCBlbmQgb2YgbGluZSBzcGVjaWZpY2F0aW9uOiAlcyIsIHN0cmluZyk7CisgIHJldHVybiBzYWxzOworfQorCisvKiBHaXZlbiBhIGxpc3Qgb2YgTkVMVFMgc3ltYm9scyBpbiBTWU1fQVJSLCByZXR1cm4gYSBsaXN0IG9mIGxpbmVzIHRvCisgICBvcGVyYXRlIG9uIChhc2sgdXNlciBpZiBuZWNlc3NhcnkpLgorICAgSWYgQ0FOT05JQ0FMIGlzIG5vbi1OVUxMIHJldHVybiBhIGNvcnJlc3BvbmRpbmcgYXJyYXkgb2YgbWFuZ2xlZCBuYW1lcworICAgYXMgY2Fub25pY2FsIGxpbmUgc3BlY3MgdGhlcmUuICAqLworCitzdGF0aWMgc3RydWN0IHN5bXRhYnNfYW5kX2xpbmVzCitkZWNvZGVfbGluZV8yIChzeW1fYXJyLCBuZWx0cywgZnVuZmlyc3RsaW5lLCBjYW5vbmljYWwpCisgICAgIHN0cnVjdCBzeW1ib2wgKnN5bV9hcnJbXTsKKyAgICAgaW50IG5lbHRzOworICAgICBpbnQgZnVuZmlyc3RsaW5lOworICAgICBjaGFyICoqKmNhbm9uaWNhbDsKK3sKKyAgc3RydWN0IHN5bXRhYnNfYW5kX2xpbmVzIHZhbHVlcywgcmV0dXJuX3ZhbHVlczsKKyAgY2hhciAqYXJncywgKmFyZzE7CisgIGludCBpOworICBjaGFyICpwcm9tcHQ7CisgIGNoYXIgKnN5bW5hbWU7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisgIGNoYXIgKipjYW5vbmljYWxfYXJyID0gKGNoYXIgKiopTlVMTDsKKworICB2YWx1ZXMuc2FscyA9IChzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lICopIAorICAgIGFsbG9jYSAobmVsdHMgKiBzaXplb2Yoc3RydWN0IHN5bXRhYl9hbmRfbGluZSkpOworICByZXR1cm5fdmFsdWVzLnNhbHMgPSAoc3RydWN0IHN5bXRhYl9hbmRfbGluZSAqKSAKKyAgICB4bWFsbG9jIChuZWx0cyAqIHNpemVvZihzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lKSk7CisgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoZnJlZSwgcmV0dXJuX3ZhbHVlcy5zYWxzKTsKKworICBpZiAoY2Fub25pY2FsKQorICAgIHsKKyAgICAgIGNhbm9uaWNhbF9hcnIgPSAoY2hhciAqKikgeG1hbGxvYyAobmVsdHMgKiBzaXplb2YgKGNoYXIgKikpOworICAgICAgbWFrZV9jbGVhbnVwIChmcmVlLCBjYW5vbmljYWxfYXJyKTsKKyAgICAgIG1lbXNldCAoY2Fub25pY2FsX2FyciwgMCwgbmVsdHMgKiBzaXplb2YgKGNoYXIgKikpOworICAgICAgKmNhbm9uaWNhbCA9IGNhbm9uaWNhbF9hcnI7CisgICAgfQorCisgIGkgPSAwOworICBwcmludGZfdW5maWx0ZXJlZCgiWzBdIGNhbmNlbFxuWzFdIGFsbFxuIik7CisgIHdoaWxlIChpIDwgbmVsdHMpCisgICAgeworICAgICAgSU5JVF9TQUwgKCZyZXR1cm5fdmFsdWVzLnNhbHNbaV0pOwkvKiBpbml0aWFsaXplIHRvIHplcm9lcyAqLworICAgICAgSU5JVF9TQUwgKCZ2YWx1ZXMuc2Fsc1tpXSk7CisgICAgICBpZiAoc3ltX2FycltpXSAmJiBTWU1CT0xfQ0xBU1MgKHN5bV9hcnJbaV0pID09IExPQ19CTE9DSykKKwl7CisJICB2YWx1ZXMuc2Fsc1tpXSA9IGZpbmRfZnVuY3Rpb25fc3RhcnRfc2FsIChzeW1fYXJyW2ldLCBmdW5maXJzdGxpbmUpOworCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCJbJWRdICVzIGF0ICVzOiVkXG4iLAorCQkJICAgICAoaSsyKSwKKwkJCSAgICAgU1lNQk9MX1NPVVJDRV9OQU1FIChzeW1fYXJyW2ldKSwKKwkJCSAgICAgdmFsdWVzLnNhbHNbaV0uc3ltdGFiLT5maWxlbmFtZSwKKwkJCSAgICAgdmFsdWVzLnNhbHNbaV0ubGluZSk7CisJfQorICAgICAgZWxzZQorCXByaW50Zl91bmZpbHRlcmVkICgiP0hFUkVcbiIpOworICAgICAgaSsrOworICAgIH0KKyAgCisgIGlmICgocHJvbXB0ID0gZ2V0ZW52ICgiUFMyIikpID09IE5VTEwpCisgICAgeworICAgICAgcHJvbXB0ID0gIj4gIjsKKyAgICB9CisgIGFyZ3MgPSBjb21tYW5kX2xpbmVfaW5wdXQgKHByb21wdCwgMCwgIm92ZXJsb2FkLWNob2ljZSIpOworICAKKyAgaWYgKGFyZ3MgPT0gMCB8fCAqYXJncyA9PSAwKQorICAgIGVycm9yX25vX2FyZyAoIm9uZSBvciBtb3JlIGNob2ljZSBudW1iZXJzIik7CisKKyAgaSA9IDA7CisgIHdoaWxlICgqYXJncykKKyAgICB7CisgICAgICBpbnQgbnVtOworCisgICAgICBhcmcxID0gYXJnczsKKyAgICAgIHdoaWxlICgqYXJnMSA+PSAnMCcgJiYgKmFyZzEgPD0gJzknKSBhcmcxKys7CisgICAgICBpZiAoKmFyZzEgJiYgKmFyZzEgIT0gJyAnICYmICphcmcxICE9ICdcdCcpCisJZXJyb3IgKCJBcmd1bWVudHMgbXVzdCBiZSBjaG9pY2UgbnVtYmVycy4iKTsKKworICAgICAgbnVtID0gYXRvaSAoYXJncyk7CisKKyAgICAgIGlmIChudW0gPT0gMCkKKwllcnJvciAoImNhbmNlbGxlZCIpOworICAgICAgZWxzZSBpZiAobnVtID09IDEpCisJeworCSAgaWYgKGNhbm9uaWNhbF9hcnIpCisJICAgIHsKKwkgICAgICBmb3IgKGkgPSAwOyBpIDwgbmVsdHM7IGkrKykKKwkJeworCSAgICAgICAgICBpZiAoY2Fub25pY2FsX2FycltpXSA9PSBOVUxMKQorCQkgICAgeworCQkgICAgICBzeW1uYW1lID0gU1lNQk9MX05BTUUgKHN5bV9hcnJbaV0pOworCSAgICAgICAgICAgICAgY2Fub25pY2FsX2FycltpXSA9IHNhdmVzdHJpbmcgKHN5bW5hbWUsIHN0cmxlbiAoc3ltbmFtZSkpOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIG1lbWNweSAocmV0dXJuX3ZhbHVlcy5zYWxzLCB2YWx1ZXMuc2FscywKKwkJICAobmVsdHMgKiBzaXplb2Yoc3RydWN0IHN5bXRhYl9hbmRfbGluZSkpKTsKKwkgIHJldHVybl92YWx1ZXMubmVsdHMgPSBuZWx0czsKKwkgIGRpc2NhcmRfY2xlYW51cHMgKG9sZF9jaGFpbik7CisJICByZXR1cm4gcmV0dXJuX3ZhbHVlczsKKwl9CisKKyAgICAgIGlmIChudW0gPj0gbmVsdHMgKyAyKQorCXsKKwkgIHByaW50Zl91bmZpbHRlcmVkICgiTm8gY2hvaWNlIG51bWJlciAlZC5cbiIsIG51bSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG51bSAtPSAyOworCSAgaWYgKHZhbHVlcy5zYWxzW251bV0ucGMpCisJICAgIHsKKwkgICAgICBpZiAoY2Fub25pY2FsX2FycikKKwkJeworCQkgIHN5bW5hbWUgPSBTWU1CT0xfTkFNRSAoc3ltX2FycltudW1dKTsKKwkJICBtYWtlX2NsZWFudXAgKGZyZWUsIHN5bW5hbWUpOworCQkgIGNhbm9uaWNhbF9hcnJbaV0gPSBzYXZlc3RyaW5nIChzeW1uYW1lLCBzdHJsZW4gKHN5bW5hbWUpKTsKKwkJfQorCSAgICAgIHJldHVybl92YWx1ZXMuc2Fsc1tpKytdID0gdmFsdWVzLnNhbHNbbnVtXTsKKwkgICAgICB2YWx1ZXMuc2Fsc1tudW1dLnBjID0gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJkdXBsaWNhdGUgcmVxdWVzdCBmb3IgJWQgaWdub3JlZC5cbiIsIG51bSk7CisJICAgIH0KKwl9CisKKyAgICAgIGFyZ3MgPSBhcmcxOworICAgICAgd2hpbGUgKCphcmdzID09ICcgJyB8fCAqYXJncyA9PSAnXHQnKSBhcmdzKys7CisgICAgfQorICByZXR1cm5fdmFsdWVzLm5lbHRzID0gaTsKKyAgZGlzY2FyZF9jbGVhbnVwcyAob2xkX2NoYWluKTsKKyAgcmV0dXJuIHJldHVybl92YWx1ZXM7Cit9CisKKwwKKy8qIFNsYXZlIHJvdXRpbmUgZm9yIHNvdXJjZXNfaW5mby4gIEZvcmNlIGxpbmUgYnJlYWtzIGF0ICwncy4KKyAgIE5BTUUgaXMgdGhlIG5hbWUgdG8gcHJpbnQgYW5kICpGSVJTVCBpcyBub256ZXJvIGlmIHRoaXMgaXMgdGhlIGZpcnN0CisgICBuYW1lIHByaW50ZWQuICBTZXQgKkZJUlNUIHRvIHplcm8uICAqLworc3RhdGljIHZvaWQKK291dHB1dF9zb3VyY2VfZmlsZW5hbWUgKG5hbWUsIGZpcnN0KQorICAgICBjaGFyICpuYW1lOworICAgICBpbnQgKmZpcnN0OworeworICAvKiBUYWJsZSBvZiBmaWxlcyBwcmludGVkIHNvIGZhci4gIFNpbmNlIGEgc2luZ2xlIHNvdXJjZSBmaWxlIGNhbgorICAgICByZXN1bHQgaW4gc2V2ZXJhbCBwYXJ0aWFsIHN5bWJvbCB0YWJsZXMsIHdlIG5lZWQgdG8gYXZvaWQgcHJpbnRpbmcKKyAgICAgaXQgbW9yZSB0aGFuIG9uY2UuICBOb3RlOiBpZiBzb21lIG9mIHRoZSBwc3ltdGFicyBhcmUgcmVhZCBpbiBhbmQKKyAgICAgc29tZSBhcmUgbm90LCBpdCBnZXRzIHByaW50ZWQgYm90aCB1bmRlciAiU291cmNlIGZpbGVzIGZvciB3aGljaAorICAgICBzeW1ib2xzIGhhdmUgYmVlbiByZWFkIiBhbmQgIlNvdXJjZSBmaWxlcyBmb3Igd2hpY2ggc3ltYm9scyB3aWxsCisgICAgIGJlIHJlYWQgaW4gb24gZGVtYW5kIi4gIEkgY29uc2lkZXIgdGhpcyBhIHJlYXNvbmFibGUgd2F5IHRvIGRlYWwKKyAgICAgd2l0aCB0aGUgc2l0dWF0aW9uLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgdGhpcyBjYW4gYWxzbyBoYXBwZW4gZm9yCisgICAgIHN5bXRhYnM7IGl0IGRvZXNuJ3QgaHVydCB0byBjaGVjay4gICovCisgIHN0YXRpYyBjaGFyICoqdGFiID0gTlVMTDsKKyAgLyogQWxsb2NhdGVkIHNpemUgb2YgdGFiIGluIGVsZW1lbnRzLgorICAgICBTdGFydCB3aXRoIG9uZSAyNTYtYnl0ZSBibG9jayAod2hlbiB1c2luZyBHTlUgbWFsbG9jLmMpLgorICAgICAyNCBpcyB0aGUgbWFsbG9jIG92ZXJoZWFkIHdoZW4gcmFuZ2UgY2hlY2tpbmcgaXMgaW4gZWZmZWN0LiAgKi8KKyAgc3RhdGljIGludCB0YWJfYWxsb2Nfc2l6ZSA9ICgyNTYgLSAyNCkgLyBzaXplb2YgKGNoYXIgKik7CisgIC8qIEN1cnJlbnQgc2l6ZSBvZiB0YWIgaW4gZWxlbWVudHMuICAqLworICBzdGF0aWMgaW50IHRhYl9jdXJfc2l6ZTsKKworICBjaGFyICoqcDsKKworICBpZiAoKmZpcnN0KQorICAgIHsKKyAgICAgIGlmICh0YWIgPT0gTlVMTCkKKwl0YWIgPSAoY2hhciAqKikgeG1hbGxvYyAodGFiX2FsbG9jX3NpemUgKiBzaXplb2YgKCp0YWIpKTsKKyAgICAgIHRhYl9jdXJfc2l6ZSA9IDA7CisgICAgfQorCisgIC8qIElzIE5BTUUgaW4gdGFiPyAgKi8KKyAgZm9yIChwID0gdGFiOyBwIDwgdGFiICsgdGFiX2N1cl9zaXplOyBwKyspCisgICAgaWYgKFNUUkVRICgqcCwgbmFtZSkpCisgICAgICAvKiBZZXM7IGRvbid0IHByaW50IGl0IGFnYWluLiAgKi8KKyAgICAgIHJldHVybjsKKyAgLyogTm87IGFkZCBpdCB0byB0YWIuICAqLworICBpZiAodGFiX2N1cl9zaXplID09IHRhYl9hbGxvY19zaXplKQorICAgIHsKKyAgICAgIHRhYl9hbGxvY19zaXplICo9IDI7CisgICAgICB0YWIgPSAoY2hhciAqKikgeHJlYWxsb2MgKChjaGFyICopIHRhYiwgdGFiX2FsbG9jX3NpemUgKiBzaXplb2YgKCp0YWIpKTsKKyAgICB9CisgIHRhYlt0YWJfY3VyX3NpemUrK10gPSBuYW1lOworCisgIGlmICgqZmlyc3QpCisgICAgeworICAgICAgKmZpcnN0ID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIsICIpOworICAgIH0KKworICB3cmFwX2hlcmUgKCIiKTsKKyAgZnB1dHNfZmlsdGVyZWQgKG5hbWUsIGdkYl9zdGRvdXQpOworfSAgCisKK3N0YXRpYyB2b2lkCitzb3VyY2VzX2luZm8gKGlnbm9yZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmlnbm9yZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICByZWdpc3RlciBzdHJ1Y3Qgc3ltdGFiICpzOworICByZWdpc3RlciBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzOworICByZWdpc3RlciBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgaW50IGZpcnN0OworICAKKyAgaWYgKCFoYXZlX2Z1bGxfc3ltYm9scyAoKSAmJiAhaGF2ZV9wYXJ0aWFsX3N5bWJvbHMgKCkpCisgICAgeworICAgICAgZXJyb3IgKG5vX3N5bXRhYl9tc2cpOworICAgIH0KKyAgCisgIHByaW50Zl9maWx0ZXJlZCAoIlNvdXJjZSBmaWxlcyBmb3Igd2hpY2ggc3ltYm9scyBoYXZlIGJlZW4gcmVhZCBpbjpcblxuIik7CisKKyAgZmlyc3QgPSAxOworICBBTExfU1lNVEFCUyAob2JqZmlsZSwgcykKKyAgICB7CisgICAgICBvdXRwdXRfc291cmNlX2ZpbGVuYW1lIChzIC0+IGZpbGVuYW1lLCAmZmlyc3QpOworICAgIH0KKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG5cbiIpOworICAKKyAgcHJpbnRmX2ZpbHRlcmVkICgiU291cmNlIGZpbGVzIGZvciB3aGljaCBzeW1ib2xzIHdpbGwgYmUgcmVhZCBpbiBvbiBkZW1hbmQ6XG5cbiIpOworCisgIGZpcnN0ID0gMTsKKyAgQUxMX1BTWU1UQUJTIChvYmpmaWxlLCBwcykKKyAgICB7CisgICAgICBpZiAoIXBzLT5yZWFkaW4pCisJeworCSAgb3V0cHV0X3NvdXJjZV9maWxlbmFtZSAocHMgLT4gZmlsZW5hbWUsICZmaXJzdCk7CisJfQorICAgIH0KKyAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKK30KKworc3RhdGljIGludAorZmlsZV9tYXRjaGVzIChmaWxlLCBmaWxlcywgbmZpbGVzKQorICAgICBjaGFyICpmaWxlOworICAgICBjaGFyICpmaWxlc1tdOworICAgICBpbnQgbmZpbGVzOworeworICBpbnQgaTsKKworICBpZiAoZmlsZSAhPSBOVUxMICYmIG5maWxlcyAhPSAwKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuZmlsZXM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIGlmIChzdHJjbXAgKGZpbGVzW2ldLCBiYXNlbmFtZSAoZmlsZSkpID09IDApCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAobmZpbGVzID09IDApCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCisvKiBGcmVlIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGEgc2VhcmNoLiAqLwordm9pZAorZnJlZV9zZWFyY2hfc3ltYm9scyAoc3ltYm9scykKKyAgICAgc3RydWN0IHN5bWJvbF9zZWFyY2ggKnN5bWJvbHM7Cit7CisgIHN0cnVjdCBzeW1ib2xfc2VhcmNoICpwOworICBzdHJ1Y3Qgc3ltYm9sX3NlYXJjaCAqbmV4dDsKKworICBmb3IgKHAgPSBzeW1ib2xzOyBwICE9IE5VTEw7IHAgPSBuZXh0KQorICAgIHsKKyAgICAgIG5leHQgPSBwLT5uZXh0OworICAgICAgZnJlZSAocCk7CisgICAgfQorfQorCisvKiBTZWFyY2ggdGhlIHN5bWJvbCB0YWJsZSBmb3IgbWF0Y2hlcyB0byB0aGUgcmVndWxhciBleHByZXNzaW9uIFJFR0VYUCwKKyAgIHJldHVybmluZyB0aGUgcmVzdWx0cyBpbiAqTUFUQ0hFUy4KKworICAgT25seSBzeW1ib2xzIG9mIEtJTkQgYXJlIHNlYXJjaGVkOgorICAgICBGVU5DVElPTlNfTkFNRVNQQUNFIC0gc2VhcmNoIGFsbCBmdW5jdGlvbnMKKyAgICAgVFlQRVNfTkFNRVNQQUNFICAgICAtIHNlYXJjaCBhbGwgdHlwZSBuYW1lcworICAgICBNRVRIT0RTX05BTUVTUEFDRSAgIC0gc2VhcmNoIGFsbCBtZXRob2RzIE5PVCBJTVBMRU1FTlRFRAorICAgICBWQVJJQUJMRVNfTkFNRVNQQUNFIC0gc2VhcmNoIGFsbCBzeW1ib2xzLCBleGNsdWRpbmcgZnVuY3Rpb25zLCB0eXBlIG5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBjb25zdGFudHMgKGVudW1zKQorCisgICBmcmVlX3NlYXJjaF9zeW1ib2xzIHNob3VsZCBiZSBjYWxsZWQgd2hlbiAqTUFUQ0hFUyBpcyBubyBsb25nZXIgbmVlZGVkLgorKi8KK3ZvaWQKK3NlYXJjaF9zeW1ib2xzIChyZWdleHAsIGtpbmQsIG5maWxlcywgZmlsZXMsIG1hdGNoZXMpCisgICAgIGNoYXIgKnJlZ2V4cDsKKyAgICAgbmFtZXNwYWNlX2VudW0ga2luZDsKKyAgICAgaW50IG5maWxlczsKKyAgICAgY2hhciAqZmlsZXNbXTsKKyAgICAgc3RydWN0IHN5bWJvbF9zZWFyY2ggKiptYXRjaGVzOworICAgICAKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bXRhYiAqczsKKyAgcmVnaXN0ZXIgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwczsKKyAgcmVnaXN0ZXIgc3RydWN0IGJsb2NrdmVjdG9yICpidjsKKyAgc3RydWN0IGJsb2NrdmVjdG9yICpwcmV2X2J2ID0gMDsKKyAgcmVnaXN0ZXIgc3RydWN0IGJsb2NrICpiOworICByZWdpc3RlciBpbnQgaSA9IDA7CisgIHJlZ2lzdGVyIGludCBqOworICByZWdpc3RlciBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKnBzeW07CisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisgIGNoYXIgKnZhbDsKKyAgaW50IGZvdW5kX21pc2MgPSAwOworICBzdGF0aWMgZW51bSBtaW5pbWFsX3N5bWJvbF90eXBlIHR5cGVzW10KKyAgICA9IHttc3RfZGF0YSwgbXN0X3RleHQsIG1zdF9hYnMsIG1zdF91bmtub3dufTsKKyAgc3RhdGljIGVudW0gbWluaW1hbF9zeW1ib2xfdHlwZSB0eXBlczJbXQorICAgID0ge21zdF9ic3MsICBtc3RfZmlsZV90ZXh0LCBtc3RfYWJzLCBtc3RfdW5rbm93bn07CisgIHN0YXRpYyBlbnVtIG1pbmltYWxfc3ltYm9sX3R5cGUgdHlwZXMzW10KKyAgICA9IHttc3RfZmlsZV9kYXRhLCAgbXN0X3NvbGliX3RyYW1wb2xpbmUsIG1zdF9hYnMsIG1zdF91bmtub3dufTsKKyAgc3RhdGljIGVudW0gbWluaW1hbF9zeW1ib2xfdHlwZSB0eXBlczRbXQorICAgID0ge21zdF9maWxlX2JzcywgICBtc3RfdGV4dCwgbXN0X2FicywgbXN0X3Vua25vd259OworICBlbnVtIG1pbmltYWxfc3ltYm9sX3R5cGUgb3VydHlwZTsKKyAgZW51bSBtaW5pbWFsX3N5bWJvbF90eXBlIG91cnR5cGUyOworICBlbnVtIG1pbmltYWxfc3ltYm9sX3R5cGUgb3VydHlwZTM7CisgIGVudW0gbWluaW1hbF9zeW1ib2xfdHlwZSBvdXJ0eXBlNDsKKyAgc3RydWN0IHN5bWJvbF9zZWFyY2ggKnNyOworICBzdHJ1Y3Qgc3ltYm9sX3NlYXJjaCAqcHNyOworICBzdHJ1Y3Qgc3ltYm9sX3NlYXJjaCAqdGFpbDsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbiA9IE5VTEw7CisKKyAgaWYgKGtpbmQgPCBMQUJFTF9OQU1FU1BBQ0UpCisgICAgZXJyb3IgKCJtdXN0IHNlYXJjaCBvbiBzcGVjaWZpYyBuYW1lc3BhY2UiKTsKKworICBvdXJ0eXBlID0gdHlwZXNbKGludCkgKGtpbmQgLSBMQUJFTF9OQU1FU1BBQ0UpXTsKKyAgb3VydHlwZTIgPSB0eXBlczJbKGludCkgKGtpbmQgLSBMQUJFTF9OQU1FU1BBQ0UpXTsKKyAgb3VydHlwZTMgPSB0eXBlczNbKGludCkgKGtpbmQgLSBMQUJFTF9OQU1FU1BBQ0UpXTsKKyAgb3VydHlwZTQgPSB0eXBlczRbKGludCkgKGtpbmQgLSBMQUJFTF9OQU1FU1BBQ0UpXTsKKworICBzciA9ICptYXRjaGVzID0gTlVMTDsKKyAgdGFpbCA9IE5VTEw7CisKKyAgaWYgKHJlZ2V4cCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIE1ha2Ugc3VyZSBzcGFjaW5nIGlzIHJpZ2h0IGZvciBDKysgb3BlcmF0b3JzLgorICAgICAgICAgVGhpcyBpcyBqdXN0IGEgY291cnRlc3kgdG8gbWFrZSB0aGUgbWF0Y2hpbmcgbGVzcyBzZW5zaXRpdmUKKyAgICAgICAgIHRvIGhvdyBtYW55IHNwYWNlcyB0aGUgdXNlciBsZWF2ZXMgYmV0d2VlbiAnb3BlcmF0b3InCisgICAgICAgICBhbmQgPFRZUEVOQU1FPiBvciA8T1BFUkFUT1I+LiAqLworICAgICAgY2hhciAqb3BlbmQ7CisgICAgICBjaGFyICpvcG5hbWUgPSBvcGVyYXRvcl9jaGFycyAocmVnZXhwLCAmb3BlbmQpOworICAgICAgaWYgKCpvcG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgZml4ID0gLTE7IC8qIC0xIG1lYW5zIG9rOyBvdGhlcndpc2UgbnVtYmVyIG9mIHNwYWNlcyBuZWVkZWQuICovCisgICAgICAgICAgaWYgKGlzYWxwaGEoKm9wbmFtZSkgfHwgKm9wbmFtZSA9PSAnXycgfHwgKm9wbmFtZSA9PSAnJCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFRoZXJlIHNob3VsZCAxIHNwYWNlIGJldHdlZW4gJ29wZXJhdG9yJyBhbmQgJ1RZUEVOQU1FJy4gKi8KKyAgICAgICAgICAgICAgaWYgKG9wbmFtZVstMV0gIT0gJyAnIHx8IG9wbmFtZVstMl0gPT0gJyAnKQorICAgICAgICAgICAgICAgIGZpeCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBUaGVyZSBzaG91bGQgMCBzcGFjZXMgYmV0d2VlbiAnb3BlcmF0b3InIGFuZCAnT1BFUkFUT1InLiAqLworICAgICAgICAgICAgICBpZiAob3BuYW1lWy0xXSA9PSAnICcpCisgICAgICAgICAgICAgICAgZml4ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAvKiBJZiB3cm9uZyBudW1iZXIgb2Ygc3BhY2VzLCBmaXggaXQuICovCisgICAgICAgICAgaWYgKGZpeCA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjaGFyICp0bXAgPSAoY2hhciopIGFsbG9jYShvcGVuZC1vcG5hbWUrMTApOworICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIm9wZXJhdG9yJS4qcyVzIiwgZml4LCAiICIsIG9wbmFtZSk7CisgICAgICAgICAgICAgIHJlZ2V4cCA9IHRtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgCisgICAgICBpZiAoMCAhPSAodmFsID0gcmVfY29tcCAocmVnZXhwKSkpCisgICAgICAgIGVycm9yICgiSW52YWxpZCByZWdleHAgKCVzKTogJXMiLCB2YWwsIHJlZ2V4cCk7CisgICAgfQorCisgIC8qIFNlYXJjaCB0aHJvdWdoIHRoZSBwYXJ0aWFsIHN5bXRhYnMgKmZpcnN0KiBmb3IgYWxsIHN5bWJvbHMKKyAgICAgbWF0Y2hpbmcgdGhlIHJlZ2V4cC4gIFRoYXQgd2F5IHdlIGRvbid0IGhhdmUgdG8gcmVwcm9kdWNlIGFsbCBvZgorICAgICB0aGUgbWFjaGluZXJ5IGJlbG93LiAqLworCisgIEFMTF9QU1lNVEFCUyAob2JqZmlsZSwgcHMpCisgICAgeworICAgICAgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqYm91bmQsICoqZ2JvdW5kLCAqKnNib3VuZDsKKyAgICAgIGludCBrZWVwX2dvaW5nID0gMTsKKworICAgICAgaWYgKHBzLT5yZWFkaW4pIGNvbnRpbnVlOworCisgICAgICBnYm91bmQgPSBvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMubGlzdCArIHBzLT5nbG9iYWxzX29mZnNldCArIHBzLT5uX2dsb2JhbF9zeW1zOworICAgICAgc2JvdW5kID0gb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLmxpc3QgKyBwcy0+c3RhdGljc19vZmZzZXQgKyBwcy0+bl9zdGF0aWNfc3ltczsKKyAgICAgIGJvdW5kID0gZ2JvdW5kOworICAgICAgCisgICAgICAvKiBHbyB0aHJvdWdoIGFsbCBvZiB0aGUgc3ltYm9scyBzdG9yZWQgaW4gYSBwYXJ0aWFsCisgICAgICAgICBzeW10YWIgaW4gb25lIGxvb3AuICovCisgICAgICBwc3ltID0gb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLmxpc3QgKyBwcy0+Z2xvYmFsc19vZmZzZXQ7CisgICAgICB3aGlsZSAoa2VlcF9nb2luZykKKyAgICAgICAgeworICAgICAgICAgIGlmIChwc3ltID49IGJvdW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoYm91bmQgPT0gZ2JvdW5kICYmIHBzLT5uX3N0YXRpY19zeW1zICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcHN5bSA9IG9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5saXN0ICsgcHMtPnN0YXRpY3Nfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgYm91bmQgPSBzYm91bmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAga2VlcF9nb2luZyA9IDA7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgUVVJVDsKKworICAgICAgICAgICAgICAvKiBJZiBpdCB3b3VsZCBtYXRjaCAobG9naWMgdGFrZW4gZnJvbSBsb29wIGJlbG93KQorICAgICAgICAgICAgICAgICBsb2FkIHRoZSBmaWxlIGFuZCBnbyBvbiB0byB0aGUgbmV4dCBvbmUgKi8KKyAgICAgICAgICAgICAgaWYgKGZpbGVfbWF0Y2hlcyAocHMtPmZpbGVuYW1lLCBmaWxlcywgbmZpbGVzKQorICAgICAgICAgICAgICAgICAgJiYgKChyZWdleHAgPT0gTlVMTCB8fCBTWU1CT0xfTUFUQ0hFU19SRUdFWFAgKCpwc3ltKSkKKyAgICAgICAgICAgICAgICAgICAgICAmJiAoKGtpbmQgPT0gVkFSSUFCTEVTX05BTUVTUEFDRSAmJiBTWU1CT0xfQ0xBU1MgKCpwc3ltKSAhPSBMT0NfVFlQRURFRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgU1lNQk9MX0NMQVNTICgqcHN5bSkgIT0gTE9DX0JMT0NLKQorICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoa2luZCA9PSBGVU5DVElPTlNfTkFNRVNQQUNFICYmIFNZTUJPTF9DTEFTUyAoKnBzeW0pID09IExPQ19CTE9DSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGtpbmQgPT0gVFlQRVNfTkFNRVNQQUNFICYmIFNZTUJPTF9DTEFTUyAoKnBzeW0pID09IExPQ19UWVBFREVGKQorICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoa2luZCA9PSBNRVRIT0RTX05BTUVTUEFDRSAmJiBTWU1CT0xfQ0xBU1MgKCpwc3ltKSA9PSBMT0NfQkxPQ0spKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgUFNZTVRBQl9UT19TWU1UQUIocHMpOworICAgICAgICAgICAgICAgICAga2VlcF9nb2luZyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIHBzeW0rKzsKKyAgICAgICAgfQorICAgIH0KKworICAvKiBIZXJlLCB3ZSBzZWFyY2ggdGhyb3VnaCB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGVzIGZvciBmdW5jdGlvbnMKKyAgICAgYW5kIHZhcmlhYmxlcyB0aGF0IG1hdGNoLCBhbmQgZm9yY2UgdGhlaXIgc3ltYm9scyB0byBiZSByZWFkLgorICAgICBUaGlzIGlzIGluIHBhcnRpY3VsYXIgbmVjZXNzYXJ5IGZvciBkZW1hbmdsZWQgdmFyaWFibGUgbmFtZXMsCisgICAgIHdoaWNoIGFyZSBubyBsb25nZXIgcHV0IGludG8gdGhlIHBhcnRpYWwgc3ltYm9sIHRhYmxlcy4KKyAgICAgVGhlIHN5bWJvbCB3aWxsIHRoZW4gYmUgZm91bmQgZHVyaW5nIHRoZSBzY2FuIG9mIHN5bXRhYnMgYmVsb3cuCisKKyAgICAgRm9yIGZ1bmN0aW9ucywgZmluZF9wY19zeW10YWIgc2hvdWxkIHN1Y2NlZWQgaWYgd2UgaGF2ZSBkZWJ1ZyBpbmZvCisgICAgIGZvciB0aGUgZnVuY3Rpb24sIGZvciB2YXJpYWJsZXMgd2UgaGF2ZSB0byBjYWxsIGxvb2t1cF9zeW1ib2wKKyAgICAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YXJpYWJsZSBoYXMgZGVidWcgaW5mby4KKyAgICAgSWYgdGhlIGxvb2t1cCBmYWlscywgc2V0IGZvdW5kX21pc2Mgc28gdGhhdCB3ZSB3aWxsIHJlc2NhbiB0byBwcmludAorICAgICBhbnkgbWF0Y2hpbmcgc3ltYm9scyB3aXRob3V0IGRlYnVnIGluZm8uCisgICovCisKKyAgaWYgKG5maWxlcyA9PSAwICYmIChraW5kID09IFZBUklBQkxFU19OQU1FU1BBQ0UgfHwga2luZCA9PSBGVU5DVElPTlNfTkFNRVNQQUNFKSkKKyAgICB7CisgICAgICBBTExfTVNZTUJPTFMgKG9iamZpbGUsIG1zeW1ib2wpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoTVNZTUJPTF9UWVBFIChtc3ltYm9sKSA9PSBvdXJ0eXBlIHx8CisgICAgICAgICAgICAgIE1TWU1CT0xfVFlQRSAobXN5bWJvbCkgPT0gb3VydHlwZTIgfHwKKyAgICAgICAgICAgICAgTVNZTUJPTF9UWVBFIChtc3ltYm9sKSA9PSBvdXJ0eXBlMyB8fAorICAgICAgICAgICAgICBNU1lNQk9MX1RZUEUgKG1zeW1ib2wpID09IG91cnR5cGU0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAocmVnZXhwID09IE5VTEwgfHwgU1lNQk9MX01BVENIRVNfUkVHRVhQIChtc3ltYm9sKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpZiAoMCA9PSBmaW5kX3BjX3N5bXRhYiAoU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID09IEZVTkNUSU9OU19OQU1FU1BBQ0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbG9va3VwX3N5bWJvbCAoU1lNQk9MX05BTUUgKG1zeW1ib2wpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBibG9jayAqKSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJfTkFNRVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX21pc2MgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIEFMTF9TWU1UQUJTIChvYmpmaWxlLCBzKQorICAgIHsKKyAgICAgIGJ2ID0gQkxPQ0tWRUNUT1IgKHMpOworICAgICAgLyogT2Z0ZW4gbWFueSBmaWxlcyBzaGFyZSBhIGJsb2NrdmVjdG9yLgorICAgICAgICAgU2NhbiBlYWNoIGJsb2NrdmVjdG9yIG9ubHkgb25jZSBzbyB0aGF0CisgICAgICAgICB3ZSBkb24ndCBnZXQgZXZlcnkgc3ltYm9sIG1hbnkgdGltZXMuCisgICAgICAgICBJdCBoYXBwZW5zIHRoYXQgdGhlIGZpcnN0IHN5bXRhYiBpbiB0aGUgbGlzdAorICAgICAgICAgZm9yIGFueSBnaXZlbiBibG9ja3ZlY3RvciBpcyB0aGUgbWFpbiBmaWxlLiAgKi8KKyAgICAgIGlmIChidiAhPSBwcmV2X2J2KQorICAgICAgICBmb3IgKGkgPSBHTE9CQUxfQkxPQ0s7IGkgPD0gU1RBVElDX0JMT0NLOyBpKyspCisgICAgICAgICAgeworICAgICAgICAgICAgYiA9IEJMT0NLVkVDVE9SX0JMT0NLIChidiwgaSk7CisgICAgICAgICAgICAvKiBTa2lwIHRoZSBzb3J0IGlmIHRoaXMgYmxvY2sgaXMgYWx3YXlzIHNvcnRlZC4gICovCisgICAgICAgICAgICBpZiAoIUJMT0NLX1NIT1VMRF9TT1JUIChiKSkKKyAgICAgICAgICAgICAgc29ydF9ibG9ja19zeW1zIChiKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBCTE9DS19OU1lNUyAoYik7IGorKykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFFVSVQ7CisgICAgICAgICAgICAgICAgc3ltID0gQkxPQ0tfU1lNIChiLCBqKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZV9tYXRjaGVzIChzLT5maWxlbmFtZSwgZmlsZXMsIG5maWxlcykKKyAgICAgICAgICAgICAgICAgICAgJiYgKChyZWdleHAgPT0gTlVMTCB8fCBTWU1CT0xfTUFUQ0hFU19SRUdFWFAgKHN5bSkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKGtpbmQgPT0gVkFSSUFCTEVTX05BTUVTUEFDRSAmJiBTWU1CT0xfQ0xBU1MgKHN5bSkgIT0gTE9DX1RZUEVERUYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgU1lNQk9MX0NMQVNTIChzeW0pICE9IExPQ19CTE9DSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBTWU1CT0xfQ0xBU1MgKHN5bSkgIT0gTE9DX0NPTlNUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChraW5kID09IEZVTkNUSU9OU19OQU1FU1BBQ0UgJiYgU1lNQk9MX0NMQVNTIChzeW0pID09IExPQ19CTE9DSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoa2luZCA9PSBUWVBFU19OQU1FU1BBQ0UgJiYgU1lNQk9MX0NMQVNTIChzeW0pID09IExPQ19UWVBFREVGKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChraW5kID09IE1FVEhPRFNfTkFNRVNQQUNFICYmIFNZTUJPTF9DTEFTUyAoc3ltKSA9PSBMT0NfQkxPQ0spKSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoICovCisgICAgICAgICAgICAgICAgICAgIHBzciA9IChzdHJ1Y3Qgc3ltYm9sX3NlYXJjaCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzeW1ib2xfc2VhcmNoKSk7CisgICAgICAgICAgICAgICAgICAgIHBzci0+YmxvY2sgPSBpOworICAgICAgICAgICAgICAgICAgICBwc3ItPnN5bXRhYiA9IHM7CisgICAgICAgICAgICAgICAgICAgIHBzci0+c3ltYm9sID0gc3ltOworICAgICAgICAgICAgICAgICAgICBwc3ItPm1zeW1ib2wgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBwc3ItPm5leHQgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBpZiAodGFpbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyID0gcHNyOworICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX3NlYXJjaF9zeW1ib2xzLCBzcik7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgdGFpbC0+bmV4dCA9IHBzcjsKKyAgICAgICAgICAgICAgICAgICAgdGFpbCA9IHBzcjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIHByZXZfYnYgPSBidjsKKyAgICB9CisKKyAgLyogSWYgdGhlcmUgYXJlIG5vIGV5ZXMsIGF2b2lkIGFsbCBjb250YWN0LiAgSSBtZWFuLCBpZiB0aGVyZSBhcmUKKyAgICAgbm8gZGVidWcgc3ltYm9scywgdGhlbiBwcmludCBkaXJlY3RseSBmcm9tIHRoZSBtc3ltYm9sX3ZlY3Rvci4gICovCisKKyAgaWYgKGZvdW5kX21pc2MgfHwga2luZCAhPSBGVU5DVElPTlNfTkFNRVNQQUNFKQorICAgIHsKKyAgICAgIEFMTF9NU1lNQk9MUyAob2JqZmlsZSwgbXN5bWJvbCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChNU1lNQk9MX1RZUEUgKG1zeW1ib2wpID09IG91cnR5cGUgfHwKKyAgICAgICAgICAgICAgTVNZTUJPTF9UWVBFIChtc3ltYm9sKSA9PSBvdXJ0eXBlMiB8fAorICAgICAgICAgICAgICBNU1lNQk9MX1RZUEUgKG1zeW1ib2wpID09IG91cnR5cGUzIHx8CisgICAgICAgICAgICAgIE1TWU1CT0xfVFlQRSAobXN5bWJvbCkgPT0gb3VydHlwZTQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChyZWdleHAgPT0gTlVMTCB8fCBTWU1CT0xfTUFUQ0hFU19SRUdFWFAgKG1zeW1ib2wpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uczogIExvb2sgdXAgYnkgYWRkcmVzcy4gKi8KKyAgICAgICAgICAgICAgICAgIGlmIChraW5kICE9IEZVTkNUSU9OU19OQU1FU1BBQ0UgfHwKKyAgICAgICAgICAgICAgICAgICAgICAoMCA9PSBmaW5kX3BjX3N5bXRhYiAoU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAvKiBWYXJpYWJsZXMvQWJzb2x1dGVzOiAgTG9vayB1cCBieSBuYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvb2t1cF9zeW1ib2wgKFNZTUJPTF9OQU1FIChtc3ltYm9sKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgYmxvY2sgKikgTlVMTCwgVkFSX05BTUVTUEFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBzciA9IChzdHJ1Y3Qgc3ltYm9sX3NlYXJjaCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzeW1ib2xfc2VhcmNoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHBzci0+YmxvY2sgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICBwc3ItPm1zeW1ib2wgPSBtc3ltYm9sOworICAgICAgICAgICAgICAgICAgICAgICAgICBwc3ItPnN5bXRhYiAgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICBwc3ItPnN5bWJvbCAgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICBwc3ItPm5leHQgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFpbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyID0gcHNyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9zZWFyY2hfc3ltYm9scywgJnNyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWlsLT5uZXh0ID0gcHNyOworICAgICAgICAgICAgICAgICAgICAgICAgICB0YWlsID0gcHNyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICptYXRjaGVzID0gc3I7CisgIGlmIChzciAhPSBOVUxMKQorICAgIGRpc2NhcmRfY2xlYW51cHMgKG9sZF9jaGFpbik7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiBmb3Igc3ltdGFiX3N5bWJvbF9pbmZvLCB0aGlzIGZ1bmN0aW9uIHVzZXMKKyAgIHRoZSBkYXRhIHJldHVybmVkIGZyb20gc2VhcmNoX3N5bWJvbHMoKSB0byBwcmludCBpbmZvcm1hdGlvbgorICAgcmVnYXJkaW5nIHRoZSBtYXRjaCB0byBnZGJfc3Rkb3V0LgorKi8KK3N0YXRpYyB2b2lkCitwcmludF9zeW1ib2xfaW5mbyAoa2luZCwgcywgc3ltLCBibG9jaywgbGFzdCkKKyAgICAgbmFtZXNwYWNlX2VudW0ga2luZDsKKyAgICAgc3RydWN0IHN5bXRhYiAqczsKKyAgICAgc3RydWN0IHN5bWJvbCAqc3ltOworICAgICBpbnQgYmxvY2s7CisgICAgIGNoYXIgKmxhc3Q7Cit7CisgIGlmIChsYXN0ID09IE5VTEwgfHwgc3RyY21wIChsYXN0LCBzLT5maWxlbmFtZSkgIT0gMCkKKyAgICB7CisgICAgICBmcHV0c19maWx0ZXJlZCAoIlxuRmlsZSAiLCBnZGJfc3Rkb3V0KTsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkIChzLT5maWxlbmFtZSwgZ2RiX3N0ZG91dCk7CisgICAgICBmcHV0c19maWx0ZXJlZCAoIjpcbiIsIGdkYl9zdGRvdXQpOworICAgIH0KKworICBpZiAoa2luZCAhPSBUWVBFU19OQU1FU1BBQ0UgJiYgYmxvY2sgPT0gU1RBVElDX0JMT0NLKQorICAgIHByaW50Zl9maWx0ZXJlZCAoInN0YXRpYyAiKTsKKwkgICAgCisgIC8qIFR5cGVkZWYgdGhhdCBpcyBub3QgYSBDKysgY2xhc3MgKi8KKyAgaWYgKGtpbmQgPT0gVFlQRVNfTkFNRVNQQUNFCisgICAgICAmJiBTWU1CT0xfTkFNRVNQQUNFIChzeW0pICE9IFNUUlVDVF9OQU1FU1BBQ0UpCisgICAgY190eXBlZGVmX3ByaW50IChTWU1CT0xfVFlQRShzeW0pLCBzeW0sIGdkYl9zdGRvdXQpOworICAvKiB2YXJpYWJsZSwgZnVuYywgb3IgdHlwZWRlZi10aGF0LWlzLWMrKy1jbGFzcyAqLworICBlbHNlIGlmIChraW5kIDwgVFlQRVNfTkFNRVNQQUNFIHx8IAorICAgICAgICAgICAoa2luZCA9PSBUWVBFU19OQU1FU1BBQ0UgJiYgCisgICAgICAgICAgICBTWU1CT0xfTkFNRVNQQUNFKHN5bSkgPT0gU1RSVUNUX05BTUVTUEFDRSkpCisgICAgeworICAgICAgdHlwZV9wcmludCAoU1lNQk9MX1RZUEUgKHN5bSksCisgICAgICAgICAgICAgICAgICAoU1lNQk9MX0NMQVNTIChzeW0pID09IExPQ19UWVBFREVGCisgICAgICAgICAgICAgICAgICAgPyAiIiA6IFNZTUJPTF9TT1VSQ0VfTkFNRSAoc3ltKSksCisgICAgICAgICAgICAgICAgICBnZGJfc3Rkb3V0LCAwKTsKKworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiO1xuIik7CisgICAgfQorICBlbHNlCisgICAgeworIyBpZiAwCisgICAgICAvKiBUaWVtYW5uIHNheXM6ICJpbmZvIG1ldGhvZHMgd2FzIG5ldmVyIGltcGxlbWVudGVkLiIgICovCisgICAgICBjaGFyICpkZW1hbmdsZWRfbmFtZTsKKyAgICAgIGNfdHlwZV9wcmludF9iYXNlIChUWVBFX0ZOX0ZJRUxEX1RZUEUodCwgYmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdkYl9zdGRvdXQsIDAsIDApOyAKKyAgICAgIGNfdHlwZV9wcmludF92YXJzcGVjX3ByZWZpeCAoVFlQRV9GTl9GSUVMRF9UWVBFKHQsIGJsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RiX3N0ZG91dCwgMCk7IAorICAgICAgaWYgKFRZUEVfRk5fRklFTERfU1RVQiAodCwgYmxvY2spKQorICAgICAgICBjaGVja19zdHViX21ldGhvZCAoVFlQRV9ET01BSU5fVFlQRSAodHlwZSksIGosIGJsb2NrKTsKKyAgICAgIGRlbWFuZ2xlZF9uYW1lID0KKyAgICAgICAgY3BsdXNfZGVtYW5nbGUgKFRZUEVfRk5fRklFTERfUEhZU05BTUUgKHQsIGJsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKKyAgICAgIGlmIChkZW1hbmdsZWRfbmFtZSA9PSBOVUxMKQorICAgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICI8YmFkbHkgbWFuZ2xlZCBuYW1lICVzPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfRk5fRklFTERfUEhZU05BTUUgKHQsIGJsb2NrKSk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBmcHV0c19maWx0ZXJlZCAoZGVtYW5nbGVkX25hbWUsIHN0cmVhbSk7CisgICAgICAgICAgZnJlZSAoZGVtYW5nbGVkX25hbWUpOworICAgICAgICB9CisjIGVuZGlmCisgICAgfQorfQorCisvKiBUaGlzIGhlbHAgZnVuY3Rpb24gZm9yIHN5bXRhYl9zeW1ib2xfaW5mbygpIHByaW50cyBpbmZvcm1hdGlvbgorICAgZm9yIG5vbi1kZWJ1Z2dpbmcgc3ltYm9scyB0byBnZGJfc3Rkb3V0LgorKi8KK3N0YXRpYyB2b2lkCitwcmludF9tc3ltYm9sX2luZm8gKG1zeW1ib2wpCisgICAgIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbDsKK3sKKyAgcHJpbnRmX2ZpbHRlcmVkICgiCSUwOGx4ICAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpLAorICAgICAgICAgICAgICAgICAgIFNZTUJPTF9TT1VSQ0VfTkFNRSAobXN5bWJvbCkpOworfQorCisvKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBjb21tYW5kcyAiaW5mbyBmdW5jdGlvbnMiLCAiaW5mbyB0eXBlcyIsIGFuZAorICAgImluZm8gdmFyaWFibGVzIi4gSXQgY2FsbHMgc2VhcmNoX3N5bWJvbHMgdG8gZmluZCBhbGwgbWF0Y2hlcyBhbmQgdGhlbgorICAgcHJpbnRfW21dc3ltYm9sX2luZm8gdG8gcHJpbnQgb3V0IHNvbWUgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgbWF0Y2hlcy4KKyovCitzdGF0aWMgdm9pZAorc3ltdGFiX3N5bWJvbF9pbmZvIChyZWdleHAsIGtpbmQsIGZyb21fdHR5KQorICAgICBjaGFyICpyZWdleHA7CisgICAgIG5hbWVzcGFjZV9lbnVtIGtpbmQ7CisgICAgIGludCAgIGZyb21fdHR5OworeworICBzdGF0aWMgY2hhciAqY2xhc3NuYW1lc1tdCisgICAgPSB7InZhcmlhYmxlIiwgImZ1bmN0aW9uIiwgInR5cGUiLCAibWV0aG9kIn07CisgIHN0cnVjdCBzeW1ib2xfc2VhcmNoICpzeW1ib2xzOworICBzdHJ1Y3Qgc3ltYm9sX3NlYXJjaCAqcDsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKyAgY2hhciAqbGFzdF9maWxlbmFtZSA9IE5VTEw7CisgIGludCBmaXJzdCA9IDE7CisKKyAgLyogbXVzdCBtYWtlIHN1cmUgdGhhdCBpZiB3ZSdyZSBpbnRlcnJ1cHRlZCwgc3ltYm9scyBnZXRzIGZyZWVkICovCisgIHNlYXJjaF9zeW1ib2xzIChyZWdleHAsIGtpbmQsIDAsIChjaGFyICoqKSBOVUxMLCAmc3ltYm9scyk7CisgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlX3NlYXJjaF9zeW1ib2xzLCBzeW1ib2xzKTsKKworICBwcmludGZfZmlsdGVyZWQgKHJlZ2V4cAorICAgICAgICAgICAgICAgICAgID8gIkFsbCAlc3MgbWF0Y2hpbmcgcmVndWxhciBleHByZXNzaW9uIFwiJXNcIjpcbiIKKyAgICAgICAgICAgICAgICAgICA6ICJBbGwgZGVmaW5lZCAlc3M6XG4iLAorICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZXNbKGludCkgKGtpbmQgLSBMQUJFTF9OQU1FU1BBQ0UgLSAxKV0sIHJlZ2V4cCk7CisKKyAgZm9yIChwID0gc3ltYm9sczsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKKyAgICB7CisgICAgICBRVUlUOworCisgICAgICBpZiAocC0+bXN5bWJvbCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludGZfZmlsdGVyZWQgKCJcbk5vbi1kZWJ1Z2dpbmcgc3ltYm9sczpcbiIpOworICAgICAgICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgcHJpbnRfbXN5bWJvbF9pbmZvIChwLT5tc3ltYm9sKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRfc3ltYm9sX2luZm8gKGtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnN5bXRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+c3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9maWxlbmFtZSk7CisgICAgICAgICAgbGFzdF9maWxlbmFtZSA9IHAtPnN5bXRhYi0+ZmlsZW5hbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7Cit9CisKK3N0YXRpYyB2b2lkCit2YXJpYWJsZXNfaW5mbyAocmVnZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqcmVnZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN5bXRhYl9zeW1ib2xfaW5mbyAocmVnZXhwLCBWQVJJQUJMRVNfTkFNRVNQQUNFLCBmcm9tX3R0eSk7Cit9CisKK3N0YXRpYyB2b2lkCitmdW5jdGlvbnNfaW5mbyAocmVnZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqcmVnZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN5bXRhYl9zeW1ib2xfaW5mbyAocmVnZXhwLCBGVU5DVElPTlNfTkFNRVNQQUNFLCBmcm9tX3R0eSk7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBlc19pbmZvIChyZWdleHAsIGZyb21fdHR5KQorICAgICBjaGFyICpyZWdleHA7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgc3ltdGFiX3N5bWJvbF9pbmZvIChyZWdleHAsIFRZUEVTX05BTUVTUEFDRSwgZnJvbV90dHkpOworfQorCisjaWYgMAorLyogVGllbWFubiBzYXlzOiAiaW5mbyBtZXRob2RzIHdhcyBuZXZlciBpbXBsZW1lbnRlZC4iICAqLworc3RhdGljIHZvaWQKK21ldGhvZHNfaW5mbyAocmVnZXhwKQorICAgICBjaGFyICpyZWdleHA7Cit7CisgIHN5bXRhYl9zeW1ib2xfaW5mbyAocmVnZXhwLCBNRVRIT0RTX05BTUVTUEFDRSwgMCwgZnJvbV90dHkpOworfQorI2VuZGlmIC8qIDAgKi8KKworLyogQnJlYWtwb2ludCBhbGwgZnVuY3Rpb25zIG1hdGNoaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbi4gKi8KK3N0YXRpYyB2b2lkCityYnJlYWtfY29tbWFuZCAocmVnZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqcmVnZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCBzeW1ib2xfc2VhcmNoICpzczsKKyAgc3RydWN0IHN5bWJvbF9zZWFyY2ggKnA7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisKKyAgc2VhcmNoX3N5bWJvbHMgKHJlZ2V4cCwgRlVOQ1RJT05TX05BTUVTUEFDRSwgMCwgKGNoYXIgKiopIE5VTEwsICZzcyk7CisgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlX3NlYXJjaF9zeW1ib2xzLCBzcyk7CisKKyAgZm9yIChwID0gc3M7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCisgICAgeworICAgICAgaWYgKHAtPm1zeW1ib2wgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgKnN0cmluZyA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChwLT5zeW10YWItPmZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKFNZTUJPTF9OQU1FIChwLT5zeW1ib2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyA0KTsKKyAgICAgICAgICBzdHJjcHkgKHN0cmluZywgcC0+c3ltdGFiLT5maWxlbmFtZSk7CisgICAgICAgICAgc3RyY2F0IChzdHJpbmcsICI6JyIpOworICAgICAgICAgIHN0cmNhdCAoc3RyaW5nLCBTWU1CT0xfTkFNRSAocC0+c3ltYm9sKSk7CisgICAgICAgICAgc3RyY2F0IChzdHJpbmcsICInIik7CisgICAgICAgICAgYnJlYWtfY29tbWFuZCAoc3RyaW5nLCBmcm9tX3R0eSk7CisgICAgICAgICAgcHJpbnRfc3ltYm9sX2luZm8gKEZVTkNUSU9OU19OQU1FU1BBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnN5bXRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+c3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+c3ltdGFiLT5maWxlbmFtZSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGJyZWFrX2NvbW1hbmQgKFNZTUJPTF9OQU1FIChwLT5tc3ltYm9sKSwgZnJvbV90dHkpOworICAgICAgICAgIHByaW50Zl9maWx0ZXJlZCAoIjxmdW5jdGlvbiwgbm8gZGVidWcgaW5mbz4gJXM7XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lNQk9MX1NPVVJDRV9OQU1FIChwLT5tc3ltYm9sKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7Cit9CisKKwwKKy8qIFJldHVybiBOb256ZXJvIGlmIGJsb2NrIGEgaXMgbGV4aWNhbGx5IG5lc3RlZCB3aXRoaW4gYmxvY2sgYiwKKyAgIG9yIGlmIGEgYW5kIGIgaGF2ZSB0aGUgc2FtZSBwYyByYW5nZS4KKyAgIFJldHVybiB6ZXJvIG90aGVyd2lzZS4gKi8KK2ludAorY29udGFpbmVkX2luIChhLCBiKQorICAgICBzdHJ1Y3QgYmxvY2sgKmEsICpiOworeworICBpZiAoIWEgfHwgIWIpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBCTE9DS19TVEFSVCAoYSkgPj0gQkxPQ0tfU1RBUlQgKGIpCisgICAgICAmJiBCTE9DS19FTkQgKGEpICAgPD0gQkxPQ0tfRU5EIChiKTsKK30KKworDAorLyogSGVscGVyIHJvdXRpbmUgZm9yIG1ha2Vfc3ltYm9sX2NvbXBsZXRpb25fbGlzdC4gICovCisKK3N0YXRpYyBpbnQgcmV0dXJuX3ZhbF9zaXplOworc3RhdGljIGludCByZXR1cm5fdmFsX2luZGV4Oworc3RhdGljIGNoYXIgKipyZXR1cm5fdmFsOworCisjZGVmaW5lIENPTVBMRVRJT05fTElTVF9BRERfU1lNQk9MKHN5bWJvbCwgc3ltX3RleHQsIGxlbiwgdGV4dCwgd29yZCkgXAorICBkbyB7IFwKKyAgICBpZiAoU1lNQk9MX0RFTUFOR0xFRF9OQU1FIChzeW1ib2wpICE9IE5VTEwpIFwKKyAgICAgIC8qIFB1dCBvbmx5IHRoZSBtYW5nbGVkIG5hbWUgb24gdGhlIGxpc3QuICAqLyBcCisgICAgICAvKiBBZHZhbnRhZ2U6ICAiYiBmb288VEFCPiIgY29tcGxldGVzIHRvICJiIGZvbyhpbnQsIGludCkiICovIFwKKyAgICAgIC8qIERpc2FkdmFudGFnZTogICJiIGZvb19faTxUQUI+IiBkb2Vzbid0IGNvbXBsZXRlLiAgKi8gXAorICAgICAgY29tcGxldGlvbl9saXN0X2FkZF9uYW1lIFwKKwkoU1lNQk9MX0RFTUFOR0xFRF9OQU1FIChzeW1ib2wpLCAoc3ltX3RleHQpLCAobGVuKSwgKHRleHQpLCAod29yZCkpOyBcCisgICAgZWxzZSBcCisgICAgICBjb21wbGV0aW9uX2xpc3RfYWRkX25hbWUgXAorCShTWU1CT0xfTkFNRSAoc3ltYm9sKSwgKHN5bV90ZXh0KSwgKGxlbiksICh0ZXh0KSwgKHdvcmQpKTsgXAorICB9IHdoaWxlICgwKQorCisvKiAgVGVzdCB0byBzZWUgaWYgdGhlIHN5bWJvbCBzcGVjaWZpZWQgYnkgU1lNTkFNRSAod2hpY2ggaXMgYWxyZWFkeQorICAgIGRlbWFuZ2xlZCBmb3IgQysrIHN5bWJvbHMpIG1hdGNoZXMgU1lNX1RFWFQgaW4gdGhlIGZpcnN0IFNZTV9URVhUX0xFTgorICAgIGNoYXJhY3RlcnMuICBJZiBzbywgYWRkIGl0IHRvIHRoZSBjdXJyZW50IGNvbXBsZXRpb24gbGlzdC4gKi8KKworc3RhdGljIHZvaWQKK2NvbXBsZXRpb25fbGlzdF9hZGRfbmFtZSAoc3ltbmFtZSwgc3ltX3RleHQsIHN5bV90ZXh0X2xlbiwgdGV4dCwgd29yZCkKKyAgICAgY2hhciAqc3ltbmFtZTsKKyAgICAgY2hhciAqc3ltX3RleHQ7CisgICAgIGludCBzeW1fdGV4dF9sZW47CisgICAgIGNoYXIgKnRleHQ7CisgICAgIGNoYXIgKndvcmQ7Cit7CisgIGludCBuZXdzaXplOworICBpbnQgaTsKKworICAvKiBjbGlwIHN5bWJvbHMgdGhhdCBjYW5ub3QgbWF0Y2ggKi8KKworICBpZiAoc3RybmNtcCAoc3ltbmFtZSwgc3ltX3RleHQsIHN5bV90ZXh0X2xlbikgIT0gMCkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIENsaXAgYW55IHN5bWJvbCBuYW1lcyB0aGF0IHdlJ3ZlIGFscmVhZHkgY29uc2lkZXJlZC4gIChUaGlzIGlzIGEKKyAgICAgdGltZSBvcHRpbWl6YXRpb24pICAqLworCisgIGZvciAoaSA9IDA7IGkgPCByZXR1cm5fdmFsX2luZGV4OyArK2kpCisgICAgeworICAgICAgaWYgKFNUUkVRIChzeW1uYW1lLCByZXR1cm5fdmFsW2ldKSkKKwl7CisJICByZXR1cm47CisJfQorICAgIH0KKyAgCisgIC8qIFdlIGhhdmUgYSBtYXRjaCBmb3IgYSBjb21wbGV0aW9uLCBzbyBhZGQgU1lNTkFNRSB0byB0aGUgY3VycmVudCBsaXN0CisgICAgIG9mIG1hdGNoZXMuIE5vdGUgdGhhdCB0aGUgbmFtZSBpcyBtb3ZlZCB0byBmcmVzaGx5IG1hbGxvYydkIHNwYWNlLiAqLworCisgIHsKKyAgICBjaGFyICpuZXc7CisgICAgaWYgKHdvcmQgPT0gc3ltX3RleHQpCisgICAgICB7CisJbmV3ID0geG1hbGxvYyAoc3RybGVuIChzeW1uYW1lKSArIDUpOworCXN0cmNweSAobmV3LCBzeW1uYW1lKTsKKyAgICAgIH0KKyAgICBlbHNlIGlmICh3b3JkID4gc3ltX3RleHQpCisgICAgICB7CisJLyogUmV0dXJuIHNvbWUgcG9ydGlvbiBvZiBzeW1uYW1lLiAgKi8KKwluZXcgPSB4bWFsbG9jIChzdHJsZW4gKHN5bW5hbWUpICsgNSk7CisJc3RyY3B5IChuZXcsIHN5bW5hbWUgKyAod29yZCAtIHN5bV90ZXh0KSk7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCS8qIFJldHVybiBzb21lIG9mIFNZTV9URVhUIHBsdXMgc3ltbmFtZS4gICovCisJbmV3ID0geG1hbGxvYyAoc3RybGVuIChzeW1uYW1lKSArIChzeW1fdGV4dCAtIHdvcmQpICsgNSk7CisJc3RybmNweSAobmV3LCB3b3JkLCBzeW1fdGV4dCAtIHdvcmQpOworCW5ld1tzeW1fdGV4dCAtIHdvcmRdID0gJ1wwJzsKKwlzdHJjYXQgKG5ldywgc3ltbmFtZSk7CisgICAgICB9CisKKyAgICAvKiBSZWNoZWNrIGZvciBkdXBsaWNhdGVzIGlmIHdlIGludGVuZCB0byBhZGQgYSBtb2RpZmllZCBzeW1ib2wuICAqLworICAgIGlmICh3b3JkICE9IHN5bV90ZXh0KQorICAgICAgeworCWZvciAoaSA9IDA7IGkgPCByZXR1cm5fdmFsX2luZGV4OyArK2kpCisJICB7CisJICAgIGlmIChTVFJFUSAobmV3LCByZXR1cm5fdmFsW2ldKSkKKwkgICAgICB7CisJCWZyZWUgKG5ldyk7CisJCXJldHVybjsKKwkgICAgICB9CisJICB9CisgICAgICB9CisKKyAgICBpZiAocmV0dXJuX3ZhbF9pbmRleCArIDMgPiByZXR1cm5fdmFsX3NpemUpCisgICAgICB7CisJbmV3c2l6ZSA9IChyZXR1cm5fdmFsX3NpemUgKj0gMikgKiBzaXplb2YgKGNoYXIgKik7CisJcmV0dXJuX3ZhbCA9IChjaGFyICoqKSB4cmVhbGxvYyAoKGNoYXIgKikgcmV0dXJuX3ZhbCwgbmV3c2l6ZSk7CisgICAgICB9CisgICAgcmV0dXJuX3ZhbFtyZXR1cm5fdmFsX2luZGV4KytdID0gbmV3OworICAgIHJldHVybl92YWxbcmV0dXJuX3ZhbF9pbmRleF0gPSBOVUxMOworICB9Cit9CisKKy8qIFJldHVybiBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBhbGwgc3ltYm9scyAocmVnYXJkbGVzcyBvZiBjbGFzcykgd2hpY2gKKyAgIGJlZ2luIGJ5IG1hdGNoaW5nIFRFWFQuICBJZiB0aGUgYW5zd2VyIGlzIG5vIHN5bWJvbHMsIHRoZW4gdGhlIHJldHVybiB2YWx1ZQorICAgaXMgYW4gYXJyYXkgd2hpY2ggY29udGFpbnMgb25seSBhIE5VTEwgcG9pbnRlci4KKworICAgUHJvYmxlbTogQWxsIG9mIHRoZSBzeW1ib2xzIGhhdmUgdG8gYmUgY29waWVkIGJlY2F1c2UgcmVhZGxpbmUgZnJlZXMgdGhlbS4KKyAgIEknbSBub3QgZ29pbmcgdG8gd29ycnkgYWJvdXQgdGhpczsgaG9wZWZ1bGx5IHRoZXJlIHdvbid0IGJlIHRoYXQgbWFueS4gICovCisKK2NoYXIgKioKK21ha2Vfc3ltYm9sX2NvbXBsZXRpb25fbGlzdCAodGV4dCwgd29yZCkKKyAgICAgY2hhciAqdGV4dDsKKyAgICAgY2hhciAqd29yZDsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHN5bWJvbCAqc3ltOworICByZWdpc3RlciBzdHJ1Y3Qgc3ltdGFiICpzOworICByZWdpc3RlciBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzOworICByZWdpc3RlciBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisgIHJlZ2lzdGVyIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICByZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmIsICpzdXJyb3VuZGluZ19zdGF0aWNfYmxvY2sgPSAwOworICByZWdpc3RlciBpbnQgaSwgajsKKyAgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqcHN5bTsKKyAgLyogVGhlIHN5bWJvbCB3ZSBhcmUgY29tcGxldGluZyBvbi4gIFBvaW50cyBpbiBzYW1lIGJ1ZmZlciBhcyB0ZXh0LiAgKi8KKyAgY2hhciAqc3ltX3RleHQ7CisgIC8qIExlbmd0aCBvZiBzeW1fdGV4dC4gICovCisgIGludCBzeW1fdGV4dF9sZW47CisKKyAgLyogTm93IGxvb2sgZm9yIHRoZSBzeW1ib2wgd2UgYXJlIHN1cHBvc2VkIHRvIGNvbXBsZXRlIG9uLgorICAgICBGSVhNRTogVGhpcyBzaG91bGQgYmUgbGFuZ3VhZ2Utc3BlY2lmaWMuICAqLworICB7CisgICAgY2hhciAqcDsKKyAgICBjaGFyIHF1b3RlX2ZvdW5kOworICAgIGNoYXIgKnF1b3RlX3BvcyA9IE5VTEw7CisKKyAgICAvKiBGaXJzdCBzZWUgaWYgdGhpcyBpcyBhIHF1b3RlZCBzdHJpbmcuICAqLworICAgIHF1b3RlX2ZvdW5kID0gJ1wwJzsKKyAgICBmb3IgKHAgPSB0ZXh0OyAqcCAhPSAnXDAnOyArK3ApCisgICAgICB7CisJaWYgKHF1b3RlX2ZvdW5kICE9ICdcMCcpCisJICB7CisJICAgIGlmICgqcCA9PSBxdW90ZV9mb3VuZCkKKwkgICAgICAvKiBGb3VuZCBjbG9zZSBxdW90ZS4gICovCisJICAgICAgcXVvdGVfZm91bmQgPSAnXDAnOworCSAgICBlbHNlIGlmICgqcCA9PSAnXFwnICYmIHBbMV0gPT0gcXVvdGVfZm91bmQpCisJICAgICAgLyogQSBiYWNrc2xhc2ggZm9sbG93ZWQgYnkgdGhlIHF1b3RlIGNoYXJhY3RlcgorCQkgZG9lc24ndCBlbmQgdGhlIHN0cmluZy4gICovCisJICAgICAgKytwOworCSAgfQorCWVsc2UgaWYgKCpwID09ICdcJycgfHwgKnAgPT0gJyInKQorCSAgeworCSAgICBxdW90ZV9mb3VuZCA9ICpwOworCSAgICBxdW90ZV9wb3MgPSBwOworCSAgfQorICAgICAgfQorICAgIGlmIChxdW90ZV9mb3VuZCA9PSAnXCcnKQorICAgICAgLyogQSBzdHJpbmcgd2l0aGluIHNpbmdsZSBxdW90ZXMgY2FuIGJlIGEgc3ltYm9sLCBzbyBjb21wbGV0ZSBvbiBpdC4gICovCisgICAgICBzeW1fdGV4dCA9IHF1b3RlX3BvcyArIDE7CisgICAgZWxzZSBpZiAocXVvdGVfZm91bmQgPT0gJyInKQorICAgICAgLyogQSBkb3VibGUtcXVvdGVkIHN0cmluZyBpcyBuZXZlciBhIHN5bWJvbCwgbm9yIGRvZXMgaXQgbWFrZSBzZW5zZQorCSB0byBjb21wbGV0ZSBpdCBhbnkgb3RoZXIgd2F5LiAgKi8KKyAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgIHsKKwkvKiBJdCBpcyBub3QgYSBxdW90ZWQgc3RyaW5nLiAgQnJlYWsgaXQgYmFzZWQgb24gdGhlIGNoYXJhY3RlcnMKKwkgICB3aGljaCBhcmUgaW4gc3ltYm9scy4gICovCisJd2hpbGUgKHAgPiB0ZXh0KQorCSAgeworCSAgICBpZiAoaXNhbG51bSAocFstMV0pIHx8IHBbLTFdID09ICdfJyB8fCBwWy0xXSA9PSAnXDAnKQorCSAgICAgIC0tcDsKKwkgICAgZWxzZQorCSAgICAgIGJyZWFrOworCSAgfQorCXN5bV90ZXh0ID0gcDsKKyAgICAgIH0KKyAgfQorCisgIHN5bV90ZXh0X2xlbiA9IHN0cmxlbiAoc3ltX3RleHQpOworCisgIHJldHVybl92YWxfc2l6ZSA9IDEwMDsKKyAgcmV0dXJuX3ZhbF9pbmRleCA9IDA7CisgIHJldHVybl92YWwgPSAoY2hhciAqKikgeG1hbGxvYyAoKHJldHVybl92YWxfc2l6ZSArIDEpICogc2l6ZW9mIChjaGFyICopKTsKKyAgcmV0dXJuX3ZhbFswXSA9IE5VTEw7CisKKyAgLyogTG9vayB0aHJvdWdoIHRoZSBwYXJ0aWFsIHN5bXRhYnMgZm9yIGFsbCBzeW1ib2xzIHdoaWNoIGJlZ2luCisgICAgIGJ5IG1hdGNoaW5nIFNZTV9URVhULiAgQWRkIGVhY2ggb25lIHRoYXQgeW91IGZpbmQgdG8gdGhlIGxpc3QuICAqLworCisgIEFMTF9QU1lNVEFCUyAob2JqZmlsZSwgcHMpCisgICAgeworICAgICAgLyogSWYgdGhlIHBzeW10YWIncyBiZWVuIHJlYWQgaW4gd2UnbGwgZ2V0IGl0IHdoZW4gd2Ugc2VhcmNoCisJIHRocm91Z2ggdGhlIGJsb2NrdmVjdG9yLiAgKi8KKyAgICAgIGlmIChwcy0+cmVhZGluKSBjb250aW51ZTsKKyAgICAgIAorICAgICAgZm9yIChwc3ltID0gb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLmxpc3QgKyBwcy0+Z2xvYmFsc19vZmZzZXQ7CisJICAgcHN5bSA8IChvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMubGlzdCArIHBzLT5nbG9iYWxzX29mZnNldAorCQkgICArIHBzLT5uX2dsb2JhbF9zeW1zKTsKKwkgICBwc3ltKyspCisJeworCSAgLyogSWYgaW50ZXJydXB0ZWQsIHRoZW4gcXVpdC4gKi8KKwkgIFFVSVQ7CisJICBDT01QTEVUSU9OX0xJU1RfQUREX1NZTUJPTCAoKnBzeW0sIHN5bV90ZXh0LCBzeW1fdGV4dF9sZW4sIHRleHQsIHdvcmQpOworCX0KKyAgICAgIAorICAgICAgZm9yIChwc3ltID0gb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLmxpc3QgKyBwcy0+c3RhdGljc19vZmZzZXQ7CisJICAgcHN5bSA8IChvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMubGlzdCArIHBzLT5zdGF0aWNzX29mZnNldAorCQkgICArIHBzLT5uX3N0YXRpY19zeW1zKTsKKwkgICBwc3ltKyspCisJeworCSAgUVVJVDsKKwkgIENPTVBMRVRJT05fTElTVF9BRERfU1lNQk9MICgqcHN5bSwgc3ltX3RleHQsIHN5bV90ZXh0X2xlbiwgdGV4dCwgd29yZCk7CisJfQorICAgIH0KKworICAvKiBBdCB0aGlzIHBvaW50IHNjYW4gdGhyb3VnaCB0aGUgbWlzYyBzeW1ib2wgdmVjdG9ycyBhbmQgYWRkIGVhY2gKKyAgICAgc3ltYm9sIHlvdSBmaW5kIHRvIHRoZSBsaXN0LiAgRXZlbnR1YWxseSB3ZSB3YW50IHRvIGlnbm9yZQorICAgICBhbnl0aGluZyB0aGF0IGlzbid0IGEgdGV4dCBzeW1ib2wgKGV2ZXJ5dGhpbmcgZWxzZSB3aWxsIGJlCisgICAgIGhhbmRsZWQgYnkgdGhlIHBzeW10YWIgY29kZSBhYm92ZSkuICAqLworCisgIEFMTF9NU1lNQk9MUyAob2JqZmlsZSwgbXN5bWJvbCkKKyAgICB7CisgICAgICBRVUlUOworICAgICAgQ09NUExFVElPTl9MSVNUX0FERF9TWU1CT0wgKG1zeW1ib2wsIHN5bV90ZXh0LCBzeW1fdGV4dF9sZW4sIHRleHQsIHdvcmQpOworICAgIH0KKworICAvKiBTZWFyY2ggdXB3YXJkcyBmcm9tIGN1cnJlbnRseSBzZWxlY3RlZCBmcmFtZSAoc28gdGhhdCB3ZSBjYW4KKyAgICAgY29tcGxldGUgb24gbG9jYWwgdmFycy4gICovCisKKyAgZm9yIChiID0gZ2V0X3NlbGVjdGVkX2Jsb2NrICgpOyBiICE9IE5VTEw7IGIgPSBCTE9DS19TVVBFUkJMT0NLIChiKSkKKyAgICB7CisgICAgICBpZiAoIUJMT0NLX1NVUEVSQkxPQ0sgKGIpKQorCXsKKwkgIHN1cnJvdW5kaW5nX3N0YXRpY19ibG9jayA9IGI7IAkvKiBGb3IgZWxtaW4gb2YgZHVwcyAqLworCX0KKyAgICAgIAorICAgICAgLyogQWxzbyBjYXRjaCBmaWVsZHMgb2YgdHlwZXMgZGVmaW5lZCBpbiB0aGlzIHBsYWNlcyB3aGljaCBtYXRjaCBvdXIKKwkgdGV4dCBzdHJpbmcuICBPbmx5IGNvbXBsZXRlIG9uIHR5cGVzIHZpc2libGUgZnJvbSBjdXJyZW50IGNvbnRleHQuICovCisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBCTE9DS19OU1lNUyAoYik7IGkrKykKKwl7CisJICBzeW0gPSBCTE9DS19TWU0gKGIsIGkpOworCSAgQ09NUExFVElPTl9MSVNUX0FERF9TWU1CT0wgKHN5bSwgc3ltX3RleHQsIHN5bV90ZXh0X2xlbiwgdGV4dCwgd29yZCk7CisJICBpZiAoU1lNQk9MX0NMQVNTIChzeW0pID09IExPQ19UWVBFREVGKQorCSAgICB7CisJICAgICAgc3RydWN0IHR5cGUgKnQgPSBTWU1CT0xfVFlQRSAoc3ltKTsKKwkgICAgICBlbnVtIHR5cGVfY29kZSBjID0gVFlQRV9DT0RFICh0KTsKKworCSAgICAgIGlmIChjID09IFRZUEVfQ09ERV9VTklPTiB8fCBjID09IFRZUEVfQ09ERV9TVFJVQ1QpCisJCXsKKwkJICBmb3IgKGogPSBUWVBFX05fQkFTRUNMQVNTRVMgKHQpOyBqIDwgVFlQRV9ORklFTERTICh0KTsgaisrKQorCQkgICAgeworCQkgICAgICBpZiAoVFlQRV9GSUVMRF9OQU1FICh0LCBqKSkKKwkJCXsKKwkJCSAgY29tcGxldGlvbl9saXN0X2FkZF9uYW1lIChUWVBFX0ZJRUxEX05BTUUgKHQsIGopLAorCQkJCQkJICAgICAgc3ltX3RleHQsIHN5bV90ZXh0X2xlbiwgdGV4dCwgd29yZCk7CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogR28gdGhyb3VnaCB0aGUgc3ltdGFicyBhbmQgY2hlY2sgdGhlIGV4dGVybnMgYW5kIHN0YXRpY3MgZm9yCisgICAgIHN5bWJvbHMgd2hpY2ggbWF0Y2guICAqLworCisgIEFMTF9TWU1UQUJTIChvYmpmaWxlLCBzKQorICAgIHsKKyAgICAgIFFVSVQ7CisgICAgICBiID0gQkxPQ0tWRUNUT1JfQkxPQ0sgKEJMT0NLVkVDVE9SIChzKSwgR0xPQkFMX0JMT0NLKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBCTE9DS19OU1lNUyAoYik7IGkrKykKKwl7CisJICBzeW0gPSBCTE9DS19TWU0gKGIsIGkpOworCSAgQ09NUExFVElPTl9MSVNUX0FERF9TWU1CT0wgKHN5bSwgc3ltX3RleHQsIHN5bV90ZXh0X2xlbiwgdGV4dCwgd29yZCk7CisJfQorICAgIH0KKworICBBTExfU1lNVEFCUyAob2JqZmlsZSwgcykKKyAgICB7CisgICAgICBRVUlUOworICAgICAgYiA9IEJMT0NLVkVDVE9SX0JMT0NLIChCTE9DS1ZFQ1RPUiAocyksIFNUQVRJQ19CTE9DSyk7CisgICAgICAvKiBEb24ndCBkbyB0aGlzIGJsb2NrIHR3aWNlLiAgKi8KKyAgICAgIGlmIChiID09IHN1cnJvdW5kaW5nX3N0YXRpY19ibG9jaykgY29udGludWU7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfTlNZTVMgKGIpOyBpKyspCisJeworCSAgc3ltID0gQkxPQ0tfU1lNIChiLCBpKTsKKwkgIENPTVBMRVRJT05fTElTVF9BRERfU1lNQk9MIChzeW0sIHN5bV90ZXh0LCBzeW1fdGV4dF9sZW4sIHRleHQsIHdvcmQpOworCX0KKyAgICB9CisKKyAgcmV0dXJuIChyZXR1cm5fdmFsKTsKK30KKworLyogRGV0ZXJtaW5lIGlmIFBDIGlzIGluIHRoZSBwcm9sb2d1ZSBvZiBhIGZ1bmN0aW9uLiAgVGhlIHByb2xvZ3VlIGlzIHRoZSBhcmVhCisgICBiZXR3ZWVuIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBvZiBhIGZ1bmN0aW9uLCBhbmQgdGhlIGZpcnN0IGV4ZWN1dGFibGUgbGluZS4KKyAgIFJldHVybnMgMSBpZiBQQyAqbWlnaHQqIGJlIGluIHByb2xvZ3VlLCAwIGlmIGRlZmluYXRlbHkgKm5vdCogaW4gcHJvbG9ndWUuCisKKyAgIElmIG5vbi16ZXJvLCBmdW5jX3N0YXJ0IGlzIHdoZXJlIHdlIHRoaW5rIHRoZSBwcm9sb2d1ZSBzdGFydHMsIHBvc3NpYmx5CisgICBieSBwcmV2aW91cyBleGFtaW5hdGlvbiBvZiBzeW1ib2wgdGFibGUgaW5mb3JtYXRpb24uCisgKi8KKworaW50Citpbl9wcm9sb2d1ZSAocGMsIGZ1bmNfc3RhcnQpCisgICAgIENPUkVfQUREUiBwYzsKKyAgICAgQ09SRV9BRERSIGZ1bmNfc3RhcnQ7Cit7CisgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOworICBDT1JFX0FERFIgZnVuY19hZGRyLCBmdW5jX2VuZDsKKworICBpZiAoIWZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAocGMsIE5VTEwsICZmdW5jX2FkZHIsICZmdW5jX2VuZCkpCisgICAgZ290byBub3N5bXM7CQkvKiBNaWdodCBiZSBpbiBwcm9sb2d1ZSAqLworCisgIHNhbCA9IGZpbmRfcGNfbGluZSAoZnVuY19hZGRyLCAwKTsKKworICBpZiAoc2FsLmxpbmUgPT0gMCkKKyAgICBnb3RvIG5vc3ltczsKKworICAvKiBzYWwuZW5kIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBwYXN0IHNhbC5saW5lLiAqLworICBpZiAoc2FsLmVuZCA+IGZ1bmNfYWRkcgorICAgICAgJiYgc2FsLmVuZCA8PSBmdW5jX2VuZCkJLyogSXMgcHJvbG9ndWUgaW4gZnVuY3Rpb24/ICovCisgICAgcmV0dXJuIHBjIDwgc2FsLmVuZDsJLyogWWVzLCBpcyBwYyBpbiBwcm9sb2d1ZT8gKi8KKworICAvKiBUaGUgbGluZSBhZnRlciB0aGUgcHJvbG9ndWUgc2VlbXMgdG8gYmUgb3V0c2lkZSB0aGUgZnVuY3Rpb24uICBJbiB0aGlzCisgICAgIGNhc2UsIHRlbGwgdGhlIGNhbGxlciB0byBmaW5kIHRoZSBwcm9sb2d1ZSB0aGUgaGFyZCB3YXkuICAqLworCisgIHJldHVybiAxOworCisvKiBDb21lIGhlcmUgd2hlbiBzeW10YWJzIGRvbid0IGNvbnRhaW4gbGluZSAjIGluZm8uICBJbiB0aGlzIGNhc2UsIGl0IGlzCisgICBsaWtlbHkgdGhhdCB0aGUgdXNlciBoYXMgc3RlcHBlZCBpbnRvIGEgbGlicmFyeSBmdW5jdGlvbiB3L28gc3ltYm9scywgb3IKKyAgIGlzIGRvaW5nIGEgc3RlcGkvbmV4dGkgdGhyb3VnaCBjb2RlIHdpdGhvdXQgc3ltYm9scy4gICovCisKKyBub3N5bXM6CisKKy8qIElmIGZ1bmNfc3RhcnQgaXMgemVybyAobWVhbmluZyB1bmtub3duKSB0aGVuIHdlIGRvbid0IGtub3cgd2hldGhlciBwYyBpcworICAgaW4gdGhlIHByb2xvZ3VlIG9yIG5vdC4gIEkuRS4gaXQgbWlnaHQgYmUuICovCisKKyAgaWYgKCFmdW5jX3N0YXJ0KSByZXR1cm4gMTsKKworLyogV2UgbmVlZCB0byBjYWxsIHRoZSB0YXJnZXQtc3BlY2lmaWMgcHJvbG9ndWUgc2tpcHBpbmcgZnVuY3Rpb25zIHdpdGggdGhlCisgICBmdW5jdGlvbidzIHN0YXJ0IGFkZHJlc3MgYmVjYXVzZSBQQyBtYXkgYmUgcG9pbnRpbmcgYXQgYW4gaW5zdHJ1Y3Rpb24gdGhhdAorICAgY291bGQgYmUgbWlzdGFrZW5seSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHByb2xvZ3VlLiAgKi8KKworICBTS0lQX1BST0xPR1VFIChmdW5jX3N0YXJ0KTsKKworICByZXR1cm4gcGMgPCBmdW5jX3N0YXJ0OworfQorCisKKy8qIEJlZ2luIG92ZXJsb2FkIHJlc29sdXRpb24gZnVuY3Rpb25zICovCisvKiBIZWxwZXIgcm91dGluZSBmb3IgbWFrZV9zeW1ib2xfY29tcGxldGlvbl9saXN0LiAgKi8KKworc3RhdGljIGludCBzeW1fcmV0dXJuX3ZhbF9zaXplOworc3RhdGljIGludCBzeW1fcmV0dXJuX3ZhbF9pbmRleDsKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9sICoqc3ltX3JldHVybl92YWw7CisKKy8qICBUZXN0IHRvIHNlZSBpZiB0aGUgc3ltYm9sIHNwZWNpZmllZCBieSBTWU1OQU1FICh3aGljaCBpcyBhbHJlYWR5CisgICAgZGVtYW5nbGVkIGZvciBDKysgc3ltYm9scykgbWF0Y2hlcyBTWU1fVEVYVCBpbiB0aGUgZmlyc3QgU1lNX1RFWFRfTEVOCisgICAgY2hhcmFjdGVycy4gIElmIHNvLCBhZGQgaXQgdG8gdGhlIGN1cnJlbnQgY29tcGxldGlvbiBsaXN0LiAqLworCitzdGF0aWMgdm9pZAorb3ZlcmxvYWRfbGlzdF9hZGRfc3ltYm9sIChzeW0sIG9sb2FkX25hbWUpCisgIHN0cnVjdCBzeW1ib2wgKiBzeW07CisgIGNoYXIgKiBvbG9hZF9uYW1lOworeworICBpbnQgbmV3c2l6ZTsKKyAgaW50IGk7CisKKyAgLyogR2V0IHRoZSBkZW1hbmdsZWQgbmFtZSB3aXRob3V0IHBhcmFtZXRlcnMgKi8KKyAgY2hhciAqIHN5bV9uYW1lID0gY3BsdXNfZGVtYW5nbGUgKFNZTUJPTF9OQU1FIChzeW0pLCBETUdMX0FSTSB8IERNR0xfQU5TSSk7CisgIGlmICghc3ltX25hbWUpCisgICAgeworICAgICAgc3ltX25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKFNZTUJPTF9OQU1FIChzeW0pKSArIDEpOworICAgICAgc3RyY3B5IChzeW1fbmFtZSwgU1lNQk9MX05BTUUgKHN5bSkpOworICAgIH0KKworICAvKiBza2lwIHN5bWJvbHMgdGhhdCBjYW5ub3QgbWF0Y2ggKi8KKyAgaWYgKHN0cmNtcCAoc3ltX25hbWUsIG9sb2FkX25hbWUpICE9IDApCisgICAgcmV0dXJuOworCisgIC8qIElmIHRoZXJlIGlzIG5vIHR5cGUgaW5mb3JtYXRpb24sIHdlIGNhbid0IGRvIGFueXRoaW5nLCBzbyBza2lwICovCisgIGlmIChTWU1CT0xfVFlQRSAoc3ltKSA9PSBOVUxMKQorICAgIHJldHVybjsKKworICAvKiBza2lwIGFueSBzeW1ib2xzIHRoYXQgd2UndmUgYWxyZWFkeSBjb25zaWRlcmVkLiAqLworICBmb3IgKGkgPSAwOyBpIDwgc3ltX3JldHVybl92YWxfaW5kZXg7ICsraSkKKyAgICBpZiAoIXN0cmNtcCAoU1lNQk9MX05BTUUgKHN5bSksIFNZTUJPTF9OQU1FIChzeW1fcmV0dXJuX3ZhbFtpXSkpKQorICAgICAgcmV0dXJuOworCisgIC8qIFdlIGhhdmUgYSBtYXRjaCBmb3IgYW4gb3ZlcmxvYWQgaW5zdGFuY2UsIHNvIGFkZCBTWU0gdG8gdGhlIGN1cnJlbnQgbGlzdAorICAgKiBvZiBvdmVybG9hZCBpbnN0YW5jZXMgKi8KKyAgaWYgKHN5bV9yZXR1cm5fdmFsX2luZGV4ICsgMyA+IHN5bV9yZXR1cm5fdmFsX3NpemUpCisgICAgeworICAgICAgbmV3c2l6ZSA9IChzeW1fcmV0dXJuX3ZhbF9zaXplICo9IDIpICogc2l6ZW9mIChzdHJ1Y3Qgc3ltYm9sICopOworICAgICAgc3ltX3JldHVybl92YWwgPSAoc3RydWN0IHN5bWJvbCAqKikgeHJlYWxsb2MgKChjaGFyICopIHN5bV9yZXR1cm5fdmFsLCBuZXdzaXplKTsKKyAgICB9CisgIHN5bV9yZXR1cm5fdmFsW3N5bV9yZXR1cm5fdmFsX2luZGV4KytdID0gc3ltOworICBzeW1fcmV0dXJuX3ZhbFtzeW1fcmV0dXJuX3ZhbF9pbmRleF0gPSBOVUxMOworICAKKyAgZnJlZSAoc3ltX25hbWUpOworfQorCisvKiBSZXR1cm4gYSBudWxsLXRlcm1pbmF0ZWQgbGlzdCBvZiBwb2ludGVycyB0byBmdW5jdGlvbiBzeW1ib2xzIHRoYXQKKyAqIG1hdGNoIG5hbWUgb2YgdGhlIHN1cHBsaWVkIHN5bWJvbCBGU1lNLgorICogVGhpcyBpcyB1c2VkIGluIGZpbmRpbmcgYWxsIG92ZXJsb2FkZWQgaW5zdGFuY2VzIG9mIGEgZnVuY3Rpb24gbmFtZS4KKyAqIFRoaXMgaGFzIGJlZW4gbW9kaWZpZWQgZnJvbSBtYWtlX3N5bWJvbF9jb21wbGV0aW9uX2xpc3QuICAqLworCisKK3N0cnVjdCBzeW1ib2wgKioKK21ha2Vfc3ltYm9sX292ZXJsb2FkX2xpc3QgKGZzeW0pCisgIHN0cnVjdCBzeW1ib2wgKiBmc3ltOworeworICByZWdpc3RlciBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIHJlZ2lzdGVyIHN0cnVjdCBzeW10YWIgKnM7CisgIHJlZ2lzdGVyIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHM7CisgIHJlZ2lzdGVyIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqbXN5bWJvbDsKKyAgcmVnaXN0ZXIgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7CisgIHJlZ2lzdGVyIHN0cnVjdCBibG9jayAqYiwgKnN1cnJvdW5kaW5nX3N0YXRpY19ibG9jayA9IDA7CisgIHJlZ2lzdGVyIGludCBpLCBqOworICBzdHJ1Y3QgcGFydGlhbF9zeW1ib2wgKipwc3ltOworICAvKiBUaGUgbmFtZSB3ZSBhcmUgY29tcGxldGluZyBvbi4gKi8KKyAgY2hhciAqb2xvYWRfbmFtZSA9IE5VTEw7CisgIC8qIExlbmd0aCBvZiBuYW1lLiAgKi8KKyAgaW50IG9sb2FkX25hbWVfbGVuID0gMDsKKworICAvKiBMb29rIGZvciB0aGUgc3ltYm9sIHdlIGFyZSBzdXBwb3NlZCB0byBjb21wbGV0ZSBvbi4KKyAgICogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGxhbmd1YWdlLXNwZWNpZmljLiAgKi8KKworICBvbG9hZF9uYW1lID0gY3BsdXNfZGVtYW5nbGUgKFNZTUJPTF9OQU1FIChmc3ltKSwgRE1HTF9BUk0gfCBETUdMX0FOU0kpOworICBpZiAoIW9sb2FkX25hbWUpCisgICAgeworICAgICAgb2xvYWRfbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoU1lNQk9MX05BTUUgKGZzeW0pKSArIDEpOworICAgICAgc3RyY3B5IChvbG9hZF9uYW1lLCBTWU1CT0xfTkFNRSAoZnN5bSkpOworICAgIH0KKyAgb2xvYWRfbmFtZV9sZW4gPSBzdHJsZW4gKG9sb2FkX25hbWUpOworCisgIHN5bV9yZXR1cm5fdmFsX3NpemUgPSAxMDA7CisgIHN5bV9yZXR1cm5fdmFsX2luZGV4ID0gMDsKKyAgc3ltX3JldHVybl92YWwgPSAoc3RydWN0IHN5bWJvbCAqKikgeG1hbGxvYyAoKHN5bV9yZXR1cm5fdmFsX3NpemUgKyAxKSAqIHNpemVvZiAoc3RydWN0IHN5bWJvbCAqKSk7CisgIHN5bV9yZXR1cm5fdmFsWzBdID0gTlVMTDsKKworICAvKiBMb29rIHRocm91Z2ggdGhlIHBhcnRpYWwgc3ltdGFicyBmb3IgYWxsIHN5bWJvbHMgd2hpY2ggYmVnaW4KKyAgICAgYnkgbWF0Y2hpbmcgT0xPQURfTkFNRS4gIEFkZCBlYWNoIG9uZSB0aGF0IHlvdSBmaW5kIHRvIHRoZSBsaXN0LiAgKi8KKworICBBTExfUFNZTVRBQlMgKG9iamZpbGUsIHBzKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBwc3ltdGFiJ3MgYmVlbiByZWFkIGluIHdlJ2xsIGdldCBpdCB3aGVuIHdlIHNlYXJjaAorCSB0aHJvdWdoIHRoZSBibG9ja3ZlY3Rvci4gICovCisgICAgICBpZiAocHMtPnJlYWRpbikgY29udGludWU7CisgICAgICAKKyAgICAgIGZvciAocHN5bSA9IG9iamZpbGUtPmdsb2JhbF9wc3ltYm9scy5saXN0ICsgcHMtPmdsb2JhbHNfb2Zmc2V0OworCSAgIHBzeW0gPCAob2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLmxpc3QgKyBwcy0+Z2xvYmFsc19vZmZzZXQKKwkJICAgKyBwcy0+bl9nbG9iYWxfc3ltcyk7CisJICAgcHN5bSsrKQorCXsKKwkgIC8qIElmIGludGVycnVwdGVkLCB0aGVuIHF1aXQuICovCisJICBRVUlUOworCSAgb3ZlcmxvYWRfbGlzdF9hZGRfc3ltYm9sICgqcHN5bSwgb2xvYWRfbmFtZSk7CisJfQorICAgICAgCisgICAgICBmb3IgKHBzeW0gPSBvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMubGlzdCArIHBzLT5zdGF0aWNzX29mZnNldDsKKwkgICBwc3ltIDwgKG9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5saXN0ICsgcHMtPnN0YXRpY3Nfb2Zmc2V0CisJCSAgICsgcHMtPm5fc3RhdGljX3N5bXMpOworCSAgIHBzeW0rKykKKwl7CisJICBRVUlUOworCSAgb3ZlcmxvYWRfbGlzdF9hZGRfc3ltYm9sICgqcHN5bSwgb2xvYWRfbmFtZSk7CisJfQorICAgIH0KKworICAvKiBBdCB0aGlzIHBvaW50IHNjYW4gdGhyb3VnaCB0aGUgbWlzYyBzeW1ib2wgdmVjdG9ycyBhbmQgYWRkIGVhY2gKKyAgICAgc3ltYm9sIHlvdSBmaW5kIHRvIHRoZSBsaXN0LiAgRXZlbnR1YWxseSB3ZSB3YW50IHRvIGlnbm9yZQorICAgICBhbnl0aGluZyB0aGF0IGlzbid0IGEgdGV4dCBzeW1ib2wgKGV2ZXJ5dGhpbmcgZWxzZSB3aWxsIGJlCisgICAgIGhhbmRsZWQgYnkgdGhlIHBzeW10YWIgY29kZSBhYm92ZSkuICAqLworCisgIEFMTF9NU1lNQk9MUyAob2JqZmlsZSwgbXN5bWJvbCkKKyAgICB7CisgICAgICBRVUlUOworICAgICAgb3ZlcmxvYWRfbGlzdF9hZGRfc3ltYm9sIChtc3ltYm9sLCBvbG9hZF9uYW1lKTsKKyAgICB9CisKKyAgLyogU2VhcmNoIHVwd2FyZHMgZnJvbSBjdXJyZW50bHkgc2VsZWN0ZWQgZnJhbWUgKHNvIHRoYXQgd2UgY2FuCisgICAgIGNvbXBsZXRlIG9uIGxvY2FsIHZhcnMuICAqLworCisgIGZvciAoYiA9IGdldF9zZWxlY3RlZF9ibG9jayAoKTsgYiAhPSBOVUxMOyBiID0gQkxPQ0tfU1VQRVJCTE9DSyAoYikpCisgICAgeworICAgICAgaWYgKCFCTE9DS19TVVBFUkJMT0NLIChiKSkKKwl7CisJICBzdXJyb3VuZGluZ19zdGF0aWNfYmxvY2sgPSBiOyAJLyogRm9yIGVsaW1pbmF0aW9uIG9mIGR1cHMgKi8KKwl9CisgICAgICAKKyAgICAgIC8qIEFsc28gY2F0Y2ggZmllbGRzIG9mIHR5cGVzIGRlZmluZWQgaW4gdGhpcyBwbGFjZXMgd2hpY2ggbWF0Y2ggb3VyCisJIHRleHQgc3RyaW5nLiAgT25seSBjb21wbGV0ZSBvbiB0eXBlcyB2aXNpYmxlIGZyb20gY3VycmVudCBjb250ZXh0LiAqLworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfTlNZTVMgKGIpOyBpKyspCisJeworCSAgc3ltID0gQkxPQ0tfU1lNIChiLCBpKTsKKwkgIG92ZXJsb2FkX2xpc3RfYWRkX3N5bWJvbCAoc3ltLCBvbG9hZF9uYW1lKTsKKwl9CisgICAgfQorCisgIC8qIEdvIHRocm91Z2ggdGhlIHN5bXRhYnMgYW5kIGNoZWNrIHRoZSBleHRlcm5zIGFuZCBzdGF0aWNzIGZvcgorICAgICBzeW1ib2xzIHdoaWNoIG1hdGNoLiAgKi8KKworICBBTExfU1lNVEFCUyAob2JqZmlsZSwgcykKKyAgICB7CisgICAgICBRVUlUOworICAgICAgYiA9IEJMT0NLVkVDVE9SX0JMT0NLIChCTE9DS1ZFQ1RPUiAocyksIEdMT0JBTF9CTE9DSyk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfTlNZTVMgKGIpOyBpKyspCisJeworCSAgc3ltID0gQkxPQ0tfU1lNIChiLCBpKTsKKwkgIG92ZXJsb2FkX2xpc3RfYWRkX3N5bWJvbCAoc3ltLCBvbG9hZF9uYW1lKTsKKwl9CisgICAgfQorCisgIEFMTF9TWU1UQUJTIChvYmpmaWxlLCBzKQorICAgIHsKKyAgICAgIFFVSVQ7CisgICAgICBiID0gQkxPQ0tWRUNUT1JfQkxPQ0sgKEJMT0NLVkVDVE9SIChzKSwgU1RBVElDX0JMT0NLKTsKKyAgICAgIC8qIERvbid0IGRvIHRoaXMgYmxvY2sgdHdpY2UuICAqLworICAgICAgaWYgKGIgPT0gc3Vycm91bmRpbmdfc3RhdGljX2Jsb2NrKSBjb250aW51ZTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBCTE9DS19OU1lNUyAoYik7IGkrKykKKwl7CisJICBzeW0gPSBCTE9DS19TWU0gKGIsIGkpOworCSAgb3ZlcmxvYWRfbGlzdF9hZGRfc3ltYm9sIChzeW0sIG9sb2FkX25hbWUpOworCX0KKyAgICB9CisKKyAgZnJlZSAob2xvYWRfbmFtZSk7CisKKyAgcmV0dXJuIChzeW1fcmV0dXJuX3ZhbCk7Cit9CisKKy8qIEVuZCBvZiBvdmVybG9hZCByZXNvbHV0aW9uIGZ1bmN0aW9ucyAqLworCisMCit2b2lkCitfaW5pdGlhbGl6ZV9zeW10YWIgKCkKK3sKKyAgYWRkX2luZm8gKCJ2YXJpYWJsZXMiLCB2YXJpYWJsZXNfaW5mbywKKwkgICAgIkFsbCBnbG9iYWwgYW5kIHN0YXRpYyB2YXJpYWJsZSBuYW1lcywgb3IgdGhvc2UgbWF0Y2hpbmcgUkVHRVhQLiIpOworICBpZiAoZGJ4X2NvbW1hbmRzKQorICAgIGFkZF9jb20oIndoZXJlaXMiLCBjbGFzc19pbmZvLCB2YXJpYWJsZXNfaW5mbywgCisJICAgICJBbGwgZ2xvYmFsIGFuZCBzdGF0aWMgdmFyaWFibGUgbmFtZXMsIG9yIHRob3NlIG1hdGNoaW5nIFJFR0VYUC4iKTsKKworICBhZGRfaW5mbyAoImZ1bmN0aW9ucyIsIGZ1bmN0aW9uc19pbmZvLAorCSAgICAiQWxsIGZ1bmN0aW9uIG5hbWVzLCBvciB0aG9zZSBtYXRjaGluZyBSRUdFWFAuIik7CisKKyAgLyogRklYTUU6ICBUaGlzIGNvbW1hbmQgaGFzIGF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgcHJvYmxlbXM6CisgICAgIDEuICBJdCBwcmludHMgYnVpbHRpbiB0eXBlcyAoaW4gYSB2ZXJ5IHN0cmFuZ2UgYW5kIGNvbmZ1c2luZyBmYXNoaW9uKS4KKyAgICAgMi4gIEl0IGRvZXNuJ3QgcHJpbnQgcmlnaHQsIGUuZy4gd2l0aAorICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgZm9vICpGT08KKwkgdHlwZV9wcmludCBwcmludHMgIkZPTyIgd2hlbiB3ZSB3YW50IHRvIG1ha2UgaXQgKGluIHRoaXMgc2l0dWF0aW9uKQorCSBwcmludCAic3RydWN0IGZvbyAqIi4KKyAgICAgSSBhbHNvIHRoaW5rICJwdHlwZSIgb3IgIndoYXRpcyIgaXMgbW9yZSBsaWtlbHkgdG8gYmUgdXNlZnVsIChidXQgaWYKKyAgICAgdGhlcmUgaXMgbXVjaCBkaXNhZ3JlZW1lbnQgImluZm8gdHlwZXMiIGNhbiBiZSBmaXhlZCkuICAqLworICBhZGRfaW5mbyAoInR5cGVzIiwgdHlwZXNfaW5mbywKKwkgICAgIkFsbCB0eXBlIG5hbWVzLCBvciB0aG9zZSBtYXRjaGluZyBSRUdFWFAuIik7CisKKyNpZiAwCisgIGFkZF9pbmZvICgibWV0aG9kcyIsIG1ldGhvZHNfaW5mbywKKwkgICAgIkFsbCBtZXRob2QgbmFtZXMsIG9yIHRob3NlIG1hdGNoaW5nIFJFR0VYUDo6UkVHRVhQLlxuXAorSWYgdGhlIGNsYXNzIHF1YWxpZmllciBpcyBvbWl0dGVkLCBpdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBjdXJyZW50IHNjb3BlLlxuXAorSWYgdGhlIGZpcnN0IFJFR0VYUCBpcyBvbWl0dGVkLCB0aGVuIGFsbCBtZXRob2RzIG1hdGNoaW5nIHRoZSBzZWNvbmQgUkVHRVhQXG5cCithcmUgbGlzdGVkLiIpOworI2VuZGlmCisgIGFkZF9pbmZvICgic291cmNlcyIsIHNvdXJjZXNfaW5mbywKKwkgICAgIlNvdXJjZSBmaWxlcyBpbiB0aGUgcHJvZ3JhbS4iKTsKKworICBhZGRfY29tICgicmJyZWFrIiwgY2xhc3NfYnJlYWtwb2ludCwgcmJyZWFrX2NvbW1hbmQsCisJICAgICJTZXQgYSBicmVha3BvaW50IGZvciBhbGwgZnVuY3Rpb25zIG1hdGNoaW5nIFJFR0VYUC4iKTsKKworICBpZiAoeGRiX2NvbW1hbmRzKQorICAgIHsKKyAgICAgIGFkZF9jb20gKCJsZiIsIGNsYXNzX2luZm8sIHNvdXJjZXNfaW5mbywgIlNvdXJjZSBmaWxlcyBpbiB0aGUgcHJvZ3JhbSIpOworICAgICAgYWRkX2NvbSAoImxnIiwgY2xhc3NfaW5mbywgdmFyaWFibGVzX2luZm8sCisJICAgICJBbGwgZ2xvYmFsIGFuZCBzdGF0aWMgdmFyaWFibGUgbmFtZXMsIG9yIHRob3NlIG1hdGNoaW5nIFJFR0VYUC4iKTsKKyAgICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgb25lIGJ1aWx0LWluIHR5cGUgdGhhdCBpc24ndCBsYW5ndWFnZSBkZXBlbmRlbnQuLi4gKi8KKyAgYnVpbHRpbl90eXBlX2Vycm9yID0gaW5pdF90eXBlIChUWVBFX0NPREVfRVJST1IsIDAsIDAsCisJCQkJICAiPHVua25vd24gdHlwZT4iLCAoc3RydWN0IG9iamZpbGUgKikgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9nZGIvc3ltdGFiLmggYi9nZGIvc3ltdGFiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlNmJlZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi9zeW10YWIuaApAQCAtMCwwICsxLDE0NzcgQEAKKy8qIFN5bWJvbCB0YWJsZSBkZWZpbml0aW9ucyBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5ODYsIDg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk4CisgICAgICAgICAgICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIChTWU1UQUJfSCkKKyNkZWZpbmUgU1lNVEFCX0ggMQorCisvKiBTb21lIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgdG8gZ28gd2l0aCB1c2Ugb2Ygb2JzdGFja3MuICAqLworCisjaW5jbHVkZSAib2JzdGFjay5oIgorI2RlZmluZSBvYnN0YWNrX2NodW5rX2FsbG9jIHhtYWxsb2MKKyNkZWZpbmUgb2JzdGFja19jaHVua19mcmVlIGZyZWUKKyNpbmNsdWRlICJiY2FjaGUuaCIKKworLyogRG9uJ3QgZG8gdGhpczsgaXQgbWVhbnMgdGhhdCBpZiBzb21lIC5vJ3MgYXJlIGNvbXBpbGVkIHdpdGggR05VIEMKKyAgIGFuZCBzb21lIGFyZSBub3QgKGVhc3kgdG8gZG8gYWNjaWRlbnRhbGx5IHRoZSB3YXkgd2UgY29uZmlndXJlCisgICB0aGluZ3M7IGFsc28gaXQgaXMgYSBwYWluIHRvIGhhdmUgdG8gIm1ha2UgY2xlYW4iIGV2ZXJ5IHRpbWUgeW91CisgICB3YW50IHRvIHN3aXRjaCBjb21waWxlcnMpLCB0aGVuIEdEQiBkaWVzIGEgaG9ycmlibGUgZGVhdGguICAqLworLyogR05VIEMgc3VwcG9ydHMgZW51bXMgdGhhdCBhcmUgYml0ZmllbGRzLiAgU29tZSBjb21waWxlcnMgZG9uJ3QuICovCisjaWYgMCAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChCWVRFX0JJVEZJRUxEKQorI2RlZmluZQlCWVRFX0JJVEZJRUxECTo4OworI2Vsc2UKKyNkZWZpbmUJQllURV9CSVRGSUVMRAkvKm5vdGhpbmcqLworI2VuZGlmCisKKy8qIERlZmluZSBhIHN0cnVjdHVyZSBmb3IgdGhlIGluZm9ybWF0aW9uIHRoYXQgaXMgY29tbW9uIHRvIGFsbCBzeW1ib2wgdHlwZXMsCisgICBpbmNsdWRpbmcgbWluaW1hbCBzeW1ib2xzLCBwYXJ0aWFsIHN5bWJvbHMsIGFuZCBmdWxsIHN5bWJvbHMuICBJbiBhCisgICBtdWx0aWxhbmd1YWdlIGVudmlyb25tZW50LCBzb21lIGxhbmd1YWdlIHNwZWNpZmljIGluZm9ybWF0aW9uIG1heSBuZWVkIHRvCisgICBiZSByZWNvcmRlZCBhbG9uZyB3aXRoIGVhY2ggc3ltYm9sLgorCisgICBUaGVzZSBmaWVsZHMgYXJlIG9yZGVyZWQgdG8gZW5jb3VyYWdlIGdvb2QgcGFja2luZywgc2luY2Ugd2UgZnJlcXVlbnRseQorICAgaGF2ZSB0ZW5zIG9yIGh1bmRyZWRzIG9mIHRob3VzYW5kcyBvZiB0aGVzZS4gICovCisKK3N0cnVjdCBnZW5lcmFsX3N5bWJvbF9pbmZvCit7CisgIC8qIE5hbWUgb2YgdGhlIHN5bWJvbC4gIFRoaXMgaXMgYSByZXF1aXJlZCBmaWVsZC4gIFN0b3JhZ2UgZm9yIHRoZSBuYW1lIGlzCisgICAgIGFsbG9jYXRlZCBvbiB0aGUgcHN5bWJvbF9vYnN0YWNrIG9yIHN5bWJvbF9vYnN0YWNrIGZvciB0aGUgYXNzb2NpYXRlZAorICAgICBvYmpmaWxlLiAqLworCisgIGNoYXIgKm5hbWU7CisKKyAgLyogVmFsdWUgb2YgdGhlIHN5bWJvbC4gIFdoaWNoIG1lbWJlciBvZiB0aGlzIHVuaW9uIHRvIHVzZSwgYW5kIHdoYXQKKyAgICAgaXQgbWVhbnMsIGRlcGVuZHMgb24gd2hhdCBraW5kIG9mIHN5bWJvbCB0aGlzIGlzIGFuZCBpdHMKKyAgICAgU1lNQk9MX0NMQVNTLiAgU2VlIGNvbW1lbnRzIHRoZXJlIGZvciBtb3JlIGRldGFpbHMuICBBbGwgb2YgdGhlc2UKKyAgICAgYXJlIGluIGhvc3QgYnl0ZSBvcmRlciAodGhvdWdoIHdoYXQgdGhleSBwb2ludCB0byBtaWdodCBiZSBpbgorICAgICB0YXJnZXQgYnl0ZSBvcmRlciwgZS5nLiBMT0NfQ09OU1RfQllURVMpLiAgKi8KKworICB1bmlvbgorICAgIHsKKyAgICAgIC8qIFRoZSBmYWN0IHRoYXQgdGhpcyBpcyBhIGxvbmcgbm90IGEgTE9OR0VTVCBtYWlubHkgbGltaXRzIHRoZQorCSByYW5nZSBvZiBhIExPQ19DT05TVC4gIFNpbmNlIExPQ19DT05TVF9CWVRFUyBleGlzdHMsIEknbSBub3QKKwkgc3VyZSB0aGF0IGlzIGEgYmlnIGRlYWwuICAqLworICAgICAgbG9uZyBpdmFsdWU7CisKKyAgICAgIHN0cnVjdCBibG9jayAqYmxvY2s7CisKKyAgICAgIGNoYXIgKmJ5dGVzOworCisgICAgICBDT1JFX0FERFIgYWRkcmVzczsKKworICAgICAgLyogZm9yIG9wYXF1ZSB0eXBlZGVmIHN0cnVjdCBjaGFpbiAqLworCisgICAgICBzdHJ1Y3Qgc3ltYm9sICpjaGFpbjsKKyAgICB9CisgIHZhbHVlOworCisgIC8qIFNpbmNlIG9uZSBhbmQgb25seSBvbmUgbGFuZ3VhZ2UgY2FuIGFwcGx5LCB3cmFwIHRoZSBsYW5ndWFnZSBzcGVjaWZpYworICAgICBpbmZvcm1hdGlvbiBpbnNpZGUgYSB1bmlvbi4gKi8KKworICB1bmlvbgorICAgIHsKKyAgICAgIHN0cnVjdCBjcGx1c19zcGVjaWZpYyAgICAgIC8qIEZvciBDKysgKi8KKwkJCQkvKiAgYW5kIEphdmEgKi8KKwl7CisJICBjaGFyICpkZW1hbmdsZWRfbmFtZTsKKwl9IGNwbHVzX3NwZWNpZmljOworICAgICAgc3RydWN0IGNoaWxsX3NwZWNpZmljICAgICAgLyogRm9yIENoaWxsICovCisJeworCSAgY2hhciAqZGVtYW5nbGVkX25hbWU7CisJfSBjaGlsbF9zcGVjaWZpYzsKKyAgICB9IGxhbmd1YWdlX3NwZWNpZmljOworCisgIC8qIFJlY29yZCB0aGUgc291cmNlIGNvZGUgbGFuZ3VhZ2UgdGhhdCBhcHBsaWVzIHRvIHRoaXMgc3ltYm9sLgorICAgICBUaGlzIGlzIHVzZWQgdG8gc2VsZWN0IG9uZSBvZiB0aGUgZmllbGRzIGZyb20gdGhlIGxhbmd1YWdlIHNwZWNpZmljCisgICAgIHVuaW9uIGFib3ZlLiAqLworCisgIGVudW0gbGFuZ3VhZ2UgbGFuZ3VhZ2UgQllURV9CSVRGSUVMRDsKKworICAvKiBXaGljaCBzZWN0aW9uIGlzIHRoaXMgc3ltYm9sIGluPyAgVGhpcyBpcyBhbiBpbmRleCBpbnRvCisgICAgIHNlY3Rpb25fb2Zmc2V0cyBmb3IgdGhpcyBvYmpmaWxlLiAgTmVnYXRpdmUgbWVhbnMgdGhhdCB0aGUgc3ltYm9sCisgICAgIGRvZXMgbm90IGdldCByZWxvY2F0ZWQgcmVsYXRpdmUgdG8gYSBzZWN0aW9uLgorICAgICBEaXNjbGFpbWVyOiBjdXJyZW50bHkgdGhpcyBpcyBqdXN0IHVzZWQgZm9yIHhjb2ZmLCBzbyBkb24ndAorICAgICBleHBlY3QgYWxsIHN5bWJvbC1yZWFkaW5nIGNvZGUgdG8gc2V0IGl0IGNvcnJlY3RseSAodGhlIEVMRiBjb2RlCisgICAgIGFsc28gdHJpZXMgdG8gc2V0IGl0IGNvcnJlY3RseSkuICAqLworCisgIHNob3J0IHNlY3Rpb247CisKKyAgLyogVGhlIGJmZCBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN5bWJvbC4gKi8KKworICBhc2VjdGlvbiAqYmZkX3NlY3Rpb247Cit9OworCitleHRlcm4gQ09SRV9BRERSIHN5bWJvbF9vdmVybGF5ZWRfYWRkcmVzcyBQQVJBTVMoKENPUkVfQUREUiwgYXNlY3Rpb24gKikpOworCisjZGVmaW5lIFNZTUJPTF9OQU1FKHN5bWJvbCkJCShzeW1ib2wpLT5naW5mby5uYW1lCisjZGVmaW5lIFNZTUJPTF9WQUxVRShzeW1ib2wpCQkoc3ltYm9sKS0+Z2luZm8udmFsdWUuaXZhbHVlCisjZGVmaW5lIFNZTUJPTF9WQUxVRV9BRERSRVNTKHN5bWJvbCkJKHN5bWJvbCktPmdpbmZvLnZhbHVlLmFkZHJlc3MKKyNkZWZpbmUgU1lNQk9MX1ZBTFVFX0JZVEVTKHN5bWJvbCkJKHN5bWJvbCktPmdpbmZvLnZhbHVlLmJ5dGVzCisjZGVmaW5lIFNZTUJPTF9CTE9DS19WQUxVRShzeW1ib2wpCShzeW1ib2wpLT5naW5mby52YWx1ZS5ibG9jaworI2RlZmluZSBTWU1CT0xfVkFMVUVfQ0hBSU4oc3ltYm9sKQkoc3ltYm9sKS0+Z2luZm8udmFsdWUuY2hhaW4KKyNkZWZpbmUgU1lNQk9MX0xBTkdVQUdFKHN5bWJvbCkJCShzeW1ib2wpLT5naW5mby5sYW5ndWFnZQorI2RlZmluZSBTWU1CT0xfU0VDVElPTihzeW1ib2wpCQkoc3ltYm9sKS0+Z2luZm8uc2VjdGlvbgorI2RlZmluZSBTWU1CT0xfQkZEX1NFQ1RJT04oc3ltYm9sKQkoc3ltYm9sKS0+Z2luZm8uYmZkX3NlY3Rpb24KKworI2RlZmluZSBTWU1CT0xfQ1BMVVNfREVNQU5HTEVEX05BTUUoc3ltYm9sKQlcCisgIChzeW1ib2wpLT5naW5mby5sYW5ndWFnZV9zcGVjaWZpYy5jcGx1c19zcGVjaWZpYy5kZW1hbmdsZWRfbmFtZQorCisvKiBNYWNybyB0aGF0IGluaXRpYWxpemVzIHRoZSBsYW5ndWFnZSBkZXBlbmRlbnQgcG9ydGlvbiBvZiBhIHN5bWJvbAorICAgZGVwZW5kaW5nIHVwb24gdGhlIGxhbmd1YWdlIGZvciB0aGUgc3ltYm9sLiAqLworCisjZGVmaW5lIFNZTUJPTF9JTklUX0xBTkdVQUdFX1NQRUNJRklDKHN5bWJvbCxsYW5ndWFnZSkJCQlcCisgIGRvIHsJCQkJCQkJCQlcCisgICAgU1lNQk9MX0xBTkdVQUdFIChzeW1ib2wpID0gbGFuZ3VhZ2U7CQkJCVwKKyAgICBpZiAoU1lNQk9MX0xBTkdVQUdFIChzeW1ib2wpID09IGxhbmd1YWdlX2NwbHVzCQkJXAorCXx8IFNZTUJPTF9MQU5HVUFHRSAoc3ltYm9sKSA9PSBsYW5ndWFnZV9qYXZhCQkJXAorCSkJCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJU1lNQk9MX0NQTFVTX0RFTUFOR0xFRF9OQU1FIChzeW1ib2wpID0gTlVMTDsJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIGVsc2UgaWYgKFNZTUJPTF9MQU5HVUFHRSAoc3ltYm9sKSA9PSBsYW5ndWFnZV9jaGlsbCkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJU1lNQk9MX0NISUxMX0RFTUFOR0xFRF9OQU1FIChzeW1ib2wpID0gTlVMTDsJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIGVsc2UJCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJbWVtc2V0ICgmKHN5bWJvbCktPmdpbmZvLmxhbmd1YWdlX3NwZWNpZmljLCAwLAkJCVwKKwkJc2l6ZW9mICgoc3ltYm9sKS0+Z2luZm8ubGFuZ3VhZ2Vfc3BlY2lmaWMpKTsJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKy8qIE1hY3JvIHRoYXQgYXR0ZW1wdHMgdG8gaW5pdGlhbGl6ZSB0aGUgZGVtYW5nbGVkIG5hbWUgZm9yIGEgc3ltYm9sLAorICAgYmFzZWQgb24gdGhlIGxhbmd1YWdlIG9mIHRoYXQgc3ltYm9sLiAgSWYgdGhlIGxhbmd1YWdlIGlzIHNldCB0bworICAgbGFuZ3VhZ2VfYXV0bywgaXQgd2lsbCBhdHRlbXB0IHRvIGZpbmQgYW55IGRlbWFuZ2xpbmcgYWxnb3JpdGhtCisgICB0aGF0IHdvcmtzIGFuZCB0aGVuIHNldCB0aGUgbGFuZ3VhZ2UgYXBwcm9wcmlhdGVseS4gIElmIG5vIGRlbWFuZ2xpbmcKKyAgIG9mIGFueSBraW5kIGlzIGZvdW5kLCB0aGUgbGFuZ3VhZ2UgaXMgc2V0IGJhY2sgdG8gbGFuZ3VhZ2VfdW5rbm93biwKKyAgIHNvIHdlIGNhbiBhdm9pZCBkb2luZyB0aGlzIHdvcmsgYWdhaW4gdGhlIG5leHQgdGltZSB3ZSBlbmNvdW50ZXIKKyAgIHRoZSBzeW1ib2wuICBBbnkgcmVxdWlyZWQgc3BhY2UgdG8gc3RvcmUgdGhlIG5hbWUgaXMgb2J0YWluZWQgZnJvbSB0aGUKKyAgIHNwZWNpZmllZCBvYnN0YWNrLiAqLworCisjZGVmaW5lIFNZTUJPTF9JTklUX0RFTUFOR0xFRF9OQU1FKHN5bWJvbCxvYnN0YWNrKQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBjaGFyICpkZW1hbmdsZWQgPSBOVUxMOwkJCQkJCVwKKyAgICBpZiAoU1lNQk9MX0xBTkdVQUdFIChzeW1ib2wpID09IGxhbmd1YWdlX2NwbHVzCQkJXAorCXx8IFNZTUJPTF9MQU5HVUFHRSAoc3ltYm9sKSA9PSBsYW5ndWFnZV9hdXRvKQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJZGVtYW5nbGVkID0JCQkJCQkJXAorCSAgY3BsdXNfZGVtYW5nbGUgKFNZTUJPTF9OQU1FIChzeW1ib2wpLCBETUdMX1BBUkFNUyB8IERNR0xfQU5TSSk7XAorCWlmIChkZW1hbmdsZWQgIT0gTlVMTCkJCQkJCQlcCisJICB7CQkJCQkJCQlcCisJICAgIFNZTUJPTF9MQU5HVUFHRSAoc3ltYm9sKSA9IGxhbmd1YWdlX2NwbHVzOwkJCVwKKwkgICAgU1lNQk9MX0NQTFVTX0RFTUFOR0xFRF9OQU1FIChzeW1ib2wpID0gCQkJXAorCSAgICAgIG9ic2F2ZXN0cmluZyAoZGVtYW5nbGVkLCBzdHJsZW4gKGRlbWFuZ2xlZCksIChvYnN0YWNrKSk7CVwKKwkgICAgZnJlZSAoZGVtYW5nbGVkKTsJCQkJCQlcCisJICB9CQkJCQkJCQlcCisJZWxzZQkJCQkJCQkJXAorCSAgewkJCQkJCQkJXAorCSAgICBTWU1CT0xfQ1BMVVNfREVNQU5HTEVEX05BTUUgKHN5bWJvbCkgPSBOVUxMOwkJXAorCSAgfQkJCQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICBpZiAoU1lNQk9MX0xBTkdVQUdFIChzeW1ib2wpID09IGxhbmd1YWdlX2phdmEpCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwlkZW1hbmdsZWQgPQkJCQkJCQlcCisJICBjcGx1c19kZW1hbmdsZSAoU1lNQk9MX05BTUUgKHN5bWJvbCksCQkJCVwKKwkJCSAgRE1HTF9QQVJBTVMgfCBETUdMX0FOU0kgfCBETUdMX0pBVkEpOwkJXAorCWlmIChkZW1hbmdsZWQgIT0gTlVMTCkJCQkJCQlcCisJICB7CQkJCQkJCQlcCisJICAgIFNZTUJPTF9MQU5HVUFHRSAoc3ltYm9sKSA9IGxhbmd1YWdlX2phdmE7CQkJXAorCSAgICBTWU1CT0xfQ1BMVVNfREVNQU5HTEVEX05BTUUgKHN5bWJvbCkgPSAJCQlcCisJICAgICAgb2JzYXZlc3RyaW5nIChkZW1hbmdsZWQsIHN0cmxlbiAoZGVtYW5nbGVkKSwgKG9ic3RhY2spKTsJXAorCSAgICBmcmVlIChkZW1hbmdsZWQpOwkJCQkJCVwKKwkgIH0JCQkJCQkJCVwKKwllbHNlCQkJCQkJCQlcCisJICB7CQkJCQkJCQlcCisJICAgIFNZTUJPTF9DUExVU19ERU1BTkdMRURfTkFNRSAoc3ltYm9sKSA9IE5VTEw7CQlcCisJICB9CQkJCQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIGlmIChkZW1hbmdsZWQgPT0gTlVMTAkJCQkJCVwKKwkmJiAoU1lNQk9MX0xBTkdVQUdFIChzeW1ib2wpID09IGxhbmd1YWdlX2NoaWxsCQkJXAorCSAgICB8fCBTWU1CT0xfTEFOR1VBR0UgKHN5bWJvbCkgPT0gbGFuZ3VhZ2VfYXV0bykpCQlcCisgICAgICB7CQkJCQkJCQkJXAorCWRlbWFuZ2xlZCA9CQkJCQkJCVwKKwkgIGNoaWxsX2RlbWFuZ2xlIChTWU1CT0xfTkFNRSAoc3ltYm9sKSk7CQkJXAorCWlmIChkZW1hbmdsZWQgIT0gTlVMTCkJCQkJCQlcCisJICB7CQkJCQkJCQlcCisJICAgIFNZTUJPTF9MQU5HVUFHRSAoc3ltYm9sKSA9IGxhbmd1YWdlX2NoaWxsOwkJCVwKKwkgICAgU1lNQk9MX0NISUxMX0RFTUFOR0xFRF9OQU1FIChzeW1ib2wpID0gCQkJXAorCSAgICAgIG9ic2F2ZXN0cmluZyAoZGVtYW5nbGVkLCBzdHJsZW4gKGRlbWFuZ2xlZCksIChvYnN0YWNrKSk7CVwKKwkgICAgZnJlZSAoZGVtYW5nbGVkKTsJCQkJCQlcCisJICB9CQkJCQkJCQlcCisJZWxzZQkJCQkJCQkJXAorCSAgewkJCQkJCQkJXAorCSAgICBTWU1CT0xfQ0hJTExfREVNQU5HTEVEX05BTUUgKHN5bWJvbCkgPSBOVUxMOwkJXAorCSAgfQkJCQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICBpZiAoU1lNQk9MX0xBTkdVQUdFIChzeW1ib2wpID09IGxhbmd1YWdlX2F1dG8pCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwlTWU1CT0xfTEFOR1VBR0UgKHN5bWJvbCkgPSBsYW5ndWFnZV91bmtub3duOwkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisKKy8qIE1hY3JvIHRoYXQgcmV0dXJucyB0aGUgZGVtYW5nbGVkIG5hbWUgZm9yIGEgc3ltYm9sIGJhc2VkIG9uIHRoZSBsYW5ndWFnZQorICAgZm9yIHRoYXQgc3ltYm9sLiAgSWYgbm8gZGVtYW5nbGVkIG5hbWUgZXhpc3RzLCByZXR1cm5zIE5VTEwuICovCisKKyNkZWZpbmUgU1lNQk9MX0RFTUFOR0xFRF9OQU1FKHN5bWJvbCkJCQkJCVwKKyAgKFNZTUJPTF9MQU5HVUFHRSAoc3ltYm9sKSA9PSBsYW5ndWFnZV9jcGx1cwkJCQlcCisgICB8fCBTWU1CT0xfTEFOR1VBR0UgKHN5bWJvbCkgPT0gbGFuZ3VhZ2VfamF2YQkJCQlcCisgICA/IFNZTUJPTF9DUExVU19ERU1BTkdMRURfTkFNRSAoc3ltYm9sKQkJCQlcCisgICA6IChTWU1CT0xfTEFOR1VBR0UgKHN5bWJvbCkgPT0gbGFuZ3VhZ2VfY2hpbGwJCQlcCisgICAgICA/IFNZTUJPTF9DSElMTF9ERU1BTkdMRURfTkFNRSAoc3ltYm9sKQkJCQlcCisgICAgICA6IE5VTEwpKQorCisjZGVmaW5lIFNZTUJPTF9DSElMTF9ERU1BTkdMRURfTkFNRShzeW1ib2wpCQkJCVwKKyAgKHN5bWJvbCktPmdpbmZvLmxhbmd1YWdlX3NwZWNpZmljLmNoaWxsX3NwZWNpZmljLmRlbWFuZ2xlZF9uYW1lCisKKy8qIE1hY3JvIHRoYXQgcmV0dXJucyB0aGUgIm5hdHVyYWwgc291cmNlIG5hbWUiIG9mIGEgc3ltYm9sLiAgSW4gQysrIHRoaXMgaXMKKyAgIHRoZSAiZGVtYW5nbGVkIiBmb3JtIG9mIHRoZSBuYW1lIGlmIGRlbWFuZ2xlIGlzIG9uIGFuZCB0aGUgIm1hbmdsZWQiIGZvcm0KKyAgIG9mIHRoZSBuYW1lIGlmIGRlbWFuZ2xlIGlzIG9mZi4gIEluIG90aGVyIGxhbmd1YWdlcyB0aGlzIGlzIGp1c3QgdGhlCisgICBzeW1ib2wgbmFtZS4gIFRoZSByZXN1bHQgc2hvdWxkIG5ldmVyIGJlIE5VTEwuICovCisKKyNkZWZpbmUgU1lNQk9MX1NPVVJDRV9OQU1FKHN5bWJvbCkJCQkJCVwKKyAgKGRlbWFuZ2xlICYmIFNZTUJPTF9ERU1BTkdMRURfTkFNRSAoc3ltYm9sKSAhPSBOVUxMCQkJXAorICAgPyBTWU1CT0xfREVNQU5HTEVEX05BTUUgKHN5bWJvbCkJCQkJCVwKKyAgIDogU1lNQk9MX05BTUUgKHN5bWJvbCkpCisKKy8qIE1hY3JvIHRoYXQgcmV0dXJucyB0aGUgIm5hdHVyYWwgYXNzZW1ibHkgbmFtZSIgb2YgYSBzeW1ib2wuICBJbiBDKysgdGhpcyBpcworICAgdGhlICJtYW5nbGVkIiBmb3JtIG9mIHRoZSBuYW1lIGlmIGRlbWFuZ2xlIGlzIG9mZiwgb3IgaWYgZGVtYW5nbGUgaXMgb24gYW5kCisgICBhc21fZGVtYW5nbGUgaXMgb2ZmLiAgT3RoZXJ3aXNlIGlmIGFzbV9kZW1hbmdsZSBpcyBvbiBpdCBpcyB0aGUgImRlbWFuZ2xlZCIKKyAgIGZvcm0uICBJbiBvdGhlciBsYW5ndWFnZXMgdGhpcyBpcyBqdXN0IHRoZSBzeW1ib2wgbmFtZS4gIFRoZSByZXN1bHQgc2hvdWxkCisgICBuZXZlciBiZSBOVUxMLiAqLworCisjZGVmaW5lIFNZTUJPTF9MSU5LQUdFX05BTUUoc3ltYm9sKQkJCQkJXAorICAoZGVtYW5nbGUgJiYgYXNtX2RlbWFuZ2xlICYmIFNZTUJPTF9ERU1BTkdMRURfTkFNRSAoc3ltYm9sKSAhPSBOVUxMCVwKKyAgID8gU1lNQk9MX0RFTUFOR0xFRF9OQU1FIChzeW1ib2wpCQkJCQlcCisgICA6IFNZTUJPTF9OQU1FIChzeW1ib2wpKQorCisvKiBNYWNybyB0aGF0IHRlc3RzIGEgc3ltYm9sIGZvciBhIG1hdGNoIGFnYWluc3QgYSBzcGVjaWZpZWQgbmFtZSBzdHJpbmcuCisgICBGaXJzdCB0ZXN0IHRoZSB1bmVuY29kZWQgbmFtZSwgdGhlbiBsb29rcyBmb3IgYW5kIHRlc3QgYSBDKysgZW5jb2RlZAorICAgbmFtZSBpZiBpdCBleGlzdHMuICBOb3RlIHRoYXQgd2hpdGVzcGFjZSBpcyBpZ25vcmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8KKyAgIG1hdGNoIGEgQysrIGVuY29kZWQgbmFtZSwgc28gdGhhdCAiZm9vOjpiYXIoaW50LGxvbmcpIiBpcyB0aGUgc2FtZSBhcworICAgImZvbyA6OiBiYXIgKGludCwgbG9uZykiLgorICAgRXZhbHVhdGVzIHRvIHplcm8gaWYgdGhlIG1hdGNoIGZhaWxzLCBvciBub256ZXJvIGlmIGl0IHN1Y2NlZWRzLiAqLworCisjZGVmaW5lIFNZTUJPTF9NQVRDSEVTX05BTUUoc3ltYm9sLCBuYW1lKQkJCQlcCisgIChTVFJFUSAoU1lNQk9MX05BTUUgKHN5bWJvbCksIChuYW1lKSkJCQkJCVwKKyAgIHx8IChTWU1CT0xfREVNQU5HTEVEX05BTUUgKHN5bWJvbCkgIT0gTlVMTAkJCQlcCisgICAgICAgJiYgc3RyY21wX2l3IChTWU1CT0xfREVNQU5HTEVEX05BTUUgKHN5bWJvbCksIChuYW1lKSkgPT0gMCkpCisgICAKKy8qIE1hY3JvIHRoYXQgdGVzdHMgYSBzeW1ib2wgZm9yIGFuIHJlLW1hdGNoIGFnYWluc3QgdGhlIGxhc3QgY29tcGlsZWQgcmVndWxhcgorICAgZXhwcmVzc2lvbi4gIEZpcnN0IHRlc3QgdGhlIHVuZW5jb2RlZCBuYW1lLCB0aGVuIGxvb2sgZm9yIGFuZCB0ZXN0IGEgQysrCisgICBlbmNvZGVkIG5hbWUgaWYgaXQgZXhpc3RzLgorICAgRXZhbHVhdGVzIHRvIHplcm8gaWYgdGhlIG1hdGNoIGZhaWxzLCBvciBub256ZXJvIGlmIGl0IHN1Y2NlZWRzLiAqLworCisjZGVmaW5lIFNZTUJPTF9NQVRDSEVTX1JFR0VYUChzeW1ib2wpCQkJCQlcCisgIChyZV9leGVjIChTWU1CT0xfTkFNRSAoc3ltYm9sKSkgIT0gMAkJCQkJXAorICAgfHwgKFNZTUJPTF9ERU1BTkdMRURfTkFNRSAoc3ltYm9sKSAhPSBOVUxMCQkJCVwKKyAgICAgICAmJiByZV9leGVjIChTWU1CT0xfREVNQU5HTEVEX05BTUUgKHN5bWJvbCkpICE9IDApKQorICAgCisvKiBEZWZpbmUgYSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBzb21lIHZlcnkgYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQKKyAgIGFsbCBkZWZpbmVkIGdsb2JhbCBzeW1ib2xzICh0ZXh0LCBkYXRhLCBic3MsIGFicywgZXRjKS4gIFRoZSBvbmx5IHJlcXVpcmVkCisgICBpbmZvcm1hdGlvbiBpcyB0aGUgZ2VuZXJhbF9zeW1ib2xfaW5mby4KKworICAgSW4gbWFueSBjYXNlcywgZXZlbiBpZiBhIGZpbGUgd2FzIGNvbXBpbGVkIHdpdGggbm8gc3BlY2lhbCBvcHRpb25zIGZvcgorICAgZGVidWdnaW5nIGF0IGFsbCwgYXMgbG9uZyBhcyB3YXMgbm90IHN0cmlwcGVkIGl0IHdpbGwgY29udGFpbiBzdWZmaWNpZW50CisgICBpbmZvcm1hdGlvbiB0byBidWlsZCBhIHVzZWZ1bCBtaW5pbWFsIHN5bWJvbCB0YWJsZSB1c2luZyB0aGlzIHN0cnVjdHVyZS4KKyAgIEV2ZW4gd2hlbiBhIGZpbGUgY29udGFpbnMgZW5vdWdoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBidWlsZCBhIGZ1bGwKKyAgIHN5bWJvbCB0YWJsZSwgdGhlc2UgbWluaW1hbCBzeW1ib2xzIGFyZSBzdGlsbCB1c2VmdWwgZm9yIHF1aWNrbHkgbWFwcGluZworICAgYmV0d2VlbiBuYW1lcyBhbmQgYWRkcmVzc2VzLCBhbmQgdmljZSB2ZXJzYS4gIFRoZXkgYXJlIGFsc28gc29tZXRpbWVzCisgICB1c2VkIHRvIGZpZ3VyZSBvdXQgd2hhdCBmdWxsIHN5bWJvbCB0YWJsZSBlbnRyaWVzIG5lZWQgdG8gYmUgcmVhZCBpbi4gKi8KKworc3RydWN0IG1pbmltYWxfc3ltYm9sCit7CisKKyAgLyogVGhlIGdlbmVyYWwgc3ltYm9sIGluZm8gcmVxdWlyZWQgZm9yIGFsbCB0eXBlcyBvZiBzeW1ib2xzLgorCisgICAgIFRoZSBTWU1CT0xfVkFMVUVfQUREUkVTUyBjb250YWlucyB0aGUgYWRkcmVzcyB0aGF0IHRoaXMgc3ltYm9sCisgICAgIGNvcnJlc3BvbmRzIHRvLiAgKi8KKworICBzdHJ1Y3QgZ2VuZXJhbF9zeW1ib2xfaW5mbyBnaW5mbzsKKworICAvKiBUaGUgaW5mbyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIGNhY2hpbmcgbWFjaGluZS1zcGVjaWZpYyBpbmZvcm1hdGlvbgorICAgICBzbyBpdCBkb2Vzbid0IGhhdmUgdG8gcmVkZXJpdmUgdGhlIGluZm8gY29uc3RhbnRseSAob3ZlciBhIHNlcmlhbCBsaW5lKS4KKyAgICAgSXQgaXMgaW5pdGlhbGl6ZWQgdG8gemVybyBhbmQgc3RheXMgdGhhdCB3YXkgdW50aWwgdGFyZ2V0LWRlcGVuZGVudCBjb2RlCisgICAgIHNldHMgaXQuICBTdG9yYWdlIGZvciBhbnkgZGF0YSBwb2ludGVkIHRvIGJ5IHRoaXMgZmllbGQgc2hvdWxkIGJlIGFsbG8tCisgICAgIGNhdGVkIG9uIHRoZSBzeW1ib2xfb2JzdGFjayBmb3IgdGhlIGFzc29jaWF0ZWQgb2JqZmlsZS4gIAorICAgICBUaGUgdHlwZSB3b3VsZCBiZSAidm9pZCAqIiBleGNlcHQgZm9yIHJlYXNvbnMgb2YgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyCisgICAgIGNvbXBpbGVycy4gIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwuCisKKyAgICAgQ3VycmVudGx5LCB0aGUgQU1EIDI5MDAwIHRkZXAuYyB1c2VzIGl0IHRvIHJlbWVtYmVyIHRoaW5ncyBpdCBoYXMgZGVjb2RlZAorICAgICBmcm9tIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIGZ1bmN0aW9uIGhlYWRlciwgYW5kIHRoZSBNSVBTLTE2IGNvZGUgdXNlcworICAgICBpdCB0byBpZGVudGlmeSAxNi1iaXQgcHJvY2VkdXJlcy4gICovCisKKyAgY2hhciAqaW5mbzsKKworI2lmZGVmIFNPRlVOX0FERFJFU1NfTUFZQkVfTUlTU0lORworICAvKiBXaGljaCBzb3VyY2UgZmlsZSBpcyB0aGlzIHN5bWJvbCBpbj8gIE9ubHkgcmVsZXZhbnQgZm9yIG1zdF9maWxlXyouICAqLworICBjaGFyICpmaWxlbmFtZTsKKyNlbmRpZgorCisgIC8qIENsYXNzaWZpY2F0aW9uIHR5cGVzIGZvciB0aGlzIHN5bWJvbC4gIFRoZXNlIHNob3VsZCBiZSB0YWtlbiBhcyAiYWR2aXNvcnkKKyAgICAgb25seSIsIHNpbmNlIGlmIGdkYiBjYW4ndCBlYXNpbHkgZmlndXJlIG91dCBhIGNsYXNzaWZpY2F0aW9uIGl0IHNpbXBseQorICAgICBzZWxlY3RzIG1zdF91bmtub3duLiAgSXQgbWF5IGFsc28gaGF2ZSB0byBndWVzcyB3aGVuIGl0IGNhbid0IGZpZ3VyZSBvdXQKKyAgICAgd2hpY2ggaXMgYSBiZXR0ZXIgbWF0Y2ggYmV0d2VlbiB0d28gdHlwZXMgKG1zdF9kYXRhIHZlcnN1cyBtc3RfYnNzKSBmb3IKKyAgICAgZXhhbXBsZS4gIFNpbmNlIHRoZSBtaW5pbWFsIHN5bWJvbCBpbmZvIGlzIHNvbWV0aW1lcyBkZXJpdmVkIGZyb20gdGhlCisgICAgIEJGRCBsaWJyYXJ5J3MgdmlldyBvZiBhIGZpbGUsIHdlIG5lZWQgdG8gbGl2ZSB3aXRoIHdoYXQgaW5mb3JtYXRpb24gYmZkCisgICAgIHN1cHBsaWVzLiAqLworCisgIGVudW0gbWluaW1hbF9zeW1ib2xfdHlwZQorICAgIHsKKyAgICAgIG1zdF91bmtub3duID0gMCwJCS8qIFVua25vd24gdHlwZSwgdGhlIGRlZmF1bHQgKi8KKyAgICAgIG1zdF90ZXh0LAkJCS8qIEdlbmVyYWxseSBleGVjdXRhYmxlIGluc3RydWN0aW9ucyAqLworICAgICAgbXN0X2RhdGEsCQkJLyogR2VuZXJhbGx5IGluaXRpYWxpemVkIGRhdGEgKi8KKyAgICAgIG1zdF9ic3MsCQkJLyogR2VuZXJhbGx5IHVuaW5pdGlhbGl6ZWQgZGF0YSAqLworICAgICAgbXN0X2FicywJCQkvKiBHZW5lcmFsbHkgYWJzb2x1dGUgKG5vbnJlbG9jYXRhYmxlKSAqLworICAgICAgLyogR0RCIHVzZXMgbXN0X3NvbGliX3RyYW1wb2xpbmUgZm9yIHRoZSBzdGFydCBhZGRyZXNzIG9mIGEgc2hhcmVkCisJIGxpYnJhcnkgdHJhbXBvbGluZSBlbnRyeS4gIEJyZWFrcG9pbnRzIGZvciBzaGFyZWQgbGlicmFyeSBmdW5jdGlvbnMKKwkgYXJlIHB1dCB0aGVyZSBpZiB0aGUgc2hhcmVkIGxpYnJhcnkgaXMgbm90IHlldCBsb2FkZWQuCisJIEFmdGVyIHRoZSBzaGFyZWQgbGlicmFyeSBpcyBsb2FkZWQsIGxvb2t1cF9taW5pbWFsX3N5bWJvbCB3aWxsCisJIHByZWZlciB0aGUgbWluaW1hbCBzeW1ib2wgZnJvbSB0aGUgc2hhcmVkIGxpYnJhcnkgKHVzdWFsbHkKKwkgYSBtc3RfdGV4dCBzeW1ib2wpIG92ZXIgdGhlIG1zdF9zb2xpYl90cmFtcG9saW5lIHN5bWJvbCwgYW5kIHRoZQorCSBicmVha3BvaW50cyB3aWxsIGJlIG1vdmVkIHRvIHRoZWlyIHRydWUgYWRkcmVzcyBpbiB0aGUgc2hhcmVkCisJIGxpYnJhcnkgdmlhIGJyZWFrcG9pbnRfcmVfc2V0LiAgKi8KKyAgICAgIG1zdF9zb2xpYl90cmFtcG9saW5lLAkvKiBTaGFyZWQgbGlicmFyeSB0cmFtcG9saW5lIGNvZGUgKi8KKyAgICAgIC8qIEZvciB0aGUgbXN0X2ZpbGUqIHR5cGVzLCB0aGUgbmFtZXMgYXJlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUKKwkgd2l0aGluIGEgZ2l2ZW4gLm8gZmlsZS4gICovCisgICAgICBtc3RfZmlsZV90ZXh0LAkJLyogU3RhdGljIHZlcnNpb24gb2YgbXN0X3RleHQgKi8KKyAgICAgIG1zdF9maWxlX2RhdGEsCQkvKiBTdGF0aWMgdmVyc2lvbiBvZiBtc3RfZGF0YSAqLworICAgICAgbXN0X2ZpbGVfYnNzCQkvKiBTdGF0aWMgdmVyc2lvbiBvZiBtc3RfYnNzICovCisgICAgfSB0eXBlIEJZVEVfQklURklFTEQ7Cit9OworCisjZGVmaW5lIE1TWU1CT0xfSU5GTyhtc3ltYm9sKQkJKG1zeW1ib2wpLT5pbmZvCisjZGVmaW5lIE1TWU1CT0xfVFlQRShtc3ltYm9sKQkJKG1zeW1ib2wpLT50eXBlCisKKwwKKy8qIEFsbCBvZiB0aGUgbmFtZS1zY29wZSBjb250b3VycyBvZiB0aGUgcHJvZ3JhbQorICAgYXJlIHJlcHJlc2VudGVkIGJ5IGBzdHJ1Y3QgYmxvY2snIG9iamVjdHMuCisgICBBbGwgb2YgdGhlc2Ugb2JqZWN0cyBhcmUgcG9pbnRlZCB0byBieSB0aGUgYmxvY2t2ZWN0b3IuCisKKyAgIEVhY2ggYmxvY2sgcmVwcmVzZW50cyBvbmUgbmFtZSBzY29wZS4KKyAgIEVhY2ggbGV4aWNhbCBjb250ZXh0IGhhcyBpdHMgb3duIGJsb2NrLgorCisgICBUaGUgYmxvY2t2ZWN0b3IgYmVnaW5zIHdpdGggc29tZSBzcGVjaWFsIGJsb2Nrcy4KKyAgIFRoZSBHTE9CQUxfQkxPQ0sgY29udGFpbnMgYWxsIHRoZSBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBjb21waWxhdGlvbgorICAgd2hvc2Ugc2NvcGUgaXMgdGhlIGVudGlyZSBwcm9ncmFtIGxpbmtlZCB0b2dldGhlci4KKyAgIFRoZSBTVEFUSUNfQkxPQ0sgY29udGFpbnMgYWxsIHRoZSBzeW1ib2xzIHdob3NlIHNjb3BlIGlzIHRoZQorICAgZW50aXJlIGNvbXBpbGF0aW9uIGV4Y2x1ZGluZyBvdGhlciBzZXBhcmF0ZSBjb21waWxhdGlvbnMuCisgICBCbG9ja3Mgc3RhcnRpbmcgd2l0aCB0aGUgRklSU1RfTE9DQUxfQkxPQ0sgYXJlIG5vdCBzcGVjaWFsLgorCisgICBFYWNoIGJsb2NrIHJlY29yZHMgYSByYW5nZSBvZiBjb3JlIGFkZHJlc3NlcyBmb3IgdGhlIGNvZGUgdGhhdAorICAgaXMgaW4gdGhlIHNjb3BlIG9mIHRoZSBibG9jay4gIFRoZSBTVEFUSUNfQkxPQ0sgYW5kIEdMT0JBTF9CTE9DSworICAgZ2l2ZSwgZm9yIHRoZSByYW5nZSBvZiBjb2RlLCB0aGUgZW50aXJlIHJhbmdlIG9mIGNvZGUgcHJvZHVjZWQKKyAgIGJ5IHRoZSBjb21waWxhdGlvbiB0aGF0IHRoZSBzeW1ib2wgc2VnbWVudCBiZWxvbmdzIHRvLgorCisgICBUaGUgYmxvY2tzIGFwcGVhciBpbiB0aGUgYmxvY2t2ZWN0b3IKKyAgIGluIG9yZGVyIG9mIGluY3JlYXNpbmcgc3RhcnRpbmctYWRkcmVzcywKKyAgIGFuZCwgd2l0aGluIHRoYXQsIGluIG9yZGVyIG9mIGRlY3JlYXNpbmcgZW5kaW5nLWFkZHJlc3MuCisKKyAgIFRoaXMgaW1wbGllcyB0aGF0IHdpdGhpbiB0aGUgYm9keSBvZiBvbmUgZnVuY3Rpb24KKyAgIHRoZSBibG9ja3MgYXBwZWFyIGluIHRoZSBvcmRlciBvZiBhIGRlcHRoLWZpcnN0IHRyZWUgd2Fsay4gICovCisKK3N0cnVjdCBibG9ja3ZlY3RvcgoreworICAvKiBOdW1iZXIgb2YgYmxvY2tzIGluIHRoZSBsaXN0LiAgKi8KKyAgaW50IG5ibG9ja3M7CisgIC8qIFRoZSBibG9ja3MgdGhlbXNlbHZlcy4gICovCisgIHN0cnVjdCBibG9jayAqYmxvY2tbMV07Cit9OworCisjZGVmaW5lIEJMT0NLVkVDVE9SX05CTE9DS1MoYmxvY2tsaXN0KSAoYmxvY2tsaXN0KS0+bmJsb2NrcworI2RlZmluZSBCTE9DS1ZFQ1RPUl9CTE9DSyhibG9ja2xpc3QsbikgKGJsb2NrbGlzdCktPmJsb2NrW25dCisKKy8qIFNwZWNpYWwgYmxvY2sgbnVtYmVycyAqLworCisjZGVmaW5lIEdMT0JBTF9CTE9DSwkJMAorI2RlZmluZQlTVEFUSUNfQkxPQ0sJCTEKKyNkZWZpbmUJRklSU1RfTE9DQUxfQkxPQ0sJMgorCitzdHJ1Y3QgYmxvY2sKK3sKKworICAvKiBBZGRyZXNzZXMgaW4gdGhlIGV4ZWN1dGFibGUgY29kZSB0aGF0IGFyZSBpbiB0aGlzIGJsb2NrLiAgKi8KKworICBDT1JFX0FERFIgc3RhcnRhZGRyOworICBDT1JFX0FERFIgZW5kYWRkcjsKKworICAvKiBUaGUgc3ltYm9sIHRoYXQgbmFtZXMgdGhpcyBibG9jaywgaWYgdGhlIGJsb2NrIGlzIHRoZSBib2R5IG9mIGEKKyAgICAgZnVuY3Rpb247IG90aGVyd2lzZSwgemVyby4gICovCisKKyAgc3RydWN0IHN5bWJvbCAqZnVuY3Rpb247CisKKyAgLyogVGhlIGBzdHJ1Y3QgYmxvY2snIGZvciB0aGUgY29udGFpbmluZyBibG9jaywgb3IgMCBpZiBub25lLgorCisgICAgIFRoZSBzdXBlcmJsb2NrIG9mIGEgdG9wLWxldmVsIGxvY2FsIGJsb2NrIChpLmUuIGEgZnVuY3Rpb24gaW4gdGhlCisgICAgIGNhc2Ugb2YgQykgaXMgdGhlIFNUQVRJQ19CTE9DSy4gIFRoZSBzdXBlcmJsb2NrIG9mIHRoZQorICAgICBTVEFUSUNfQkxPQ0sgaXMgdGhlIEdMT0JBTF9CTE9DSy4gICovCisKKyAgc3RydWN0IGJsb2NrICpzdXBlcmJsb2NrOworCisgIC8qIFZlcnNpb24gb2YgR0NDIHVzZWQgdG8gY29tcGlsZSB0aGUgZnVuY3Rpb24gY29ycmVzcG9uZGluZworICAgICB0byB0aGlzIGJsb2NrLCBvciAwIGlmIG5vdCBjb21waWxlZCB3aXRoIEdDQy4gIFdoZW4gcG9zc2libGUsCisgICAgIEdDQyBzaG91bGQgYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBuYXRpdmUgY29tcGlsZXIsIG9yIGlmIHRoYXQKKyAgICAgaXMgbm90IGZlYXNpYmxlLCB0aGUgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGZpeGVkIGR1cmluZyBzeW1ib2wKKyAgICAgcmVhZGluZy4gIEFzIG9mIDE2IEFwciA5MywgdGhpcyBmbGFnIGlzIG5ldmVyIHVzZWQgdG8gZGlzdGluZ3Vpc2gKKyAgICAgYmV0d2VlbiBnY2MyIGFuZCB0aGUgbmF0aXZlIGNvbXBpbGVyLgorCisgICAgIElmIHRoZXJlIGlzIG5vIGZ1bmN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBibG9jaywgdGhpcyBtZWFuaW5nCisgICAgIG9mIHRoaXMgZmxhZyBpcyB1bmRlZmluZWQuICAqLworCisgIHVuc2lnbmVkIGNoYXIgZ2NjX2NvbXBpbGVfZmxhZzsKKworICAvKiBOdW1iZXIgb2YgbG9jYWwgc3ltYm9scy4gICovCisKKyAgaW50IG5zeW1zOworCisgIC8qIFRoZSBzeW1ib2xzLiAgSWYgc29tZSBvZiB0aGVtIGFyZSBhcmd1bWVudHMsIHRoZW4gdGhleSBtdXN0IGJlCisgICAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB3ZSB3b3VsZCBsaWtlIHRvIHByaW50IHRoZW0uICAqLworCisgIHN0cnVjdCBzeW1ib2wgKnN5bVsxXTsKK307CisKKyNkZWZpbmUgQkxPQ0tfU1RBUlQoYmwpCQkoYmwpLT5zdGFydGFkZHIKKyNkZWZpbmUgQkxPQ0tfRU5EKGJsKQkJKGJsKS0+ZW5kYWRkcgorI2RlZmluZSBCTE9DS19OU1lNUyhibCkJCShibCktPm5zeW1zCisjZGVmaW5lIEJMT0NLX1NZTShibCwgbikJKGJsKS0+c3ltW25dCisjZGVmaW5lIEJMT0NLX0ZVTkNUSU9OKGJsKQkoYmwpLT5mdW5jdGlvbgorI2RlZmluZSBCTE9DS19TVVBFUkJMT0NLKGJsKQkoYmwpLT5zdXBlcmJsb2NrCisjZGVmaW5lIEJMT0NLX0dDQ19DT01QSUxFRChibCkJKGJsKS0+Z2NjX2NvbXBpbGVfZmxhZworCisvKiBOb256ZXJvIGlmIHN5bWJvbHMgb2YgYmxvY2sgQkwgc2hvdWxkIGJlIHNvcnRlZCBhbHBoYWJldGljYWxseS4KKyAgIERvbid0IHNvcnQgYSBibG9jayB3aGljaCBjb3JyZXNwb25kcyB0byBhIGZ1bmN0aW9uLiAgSWYgd2UgZGlkIHRoZQorICAgc29ydGluZyB3b3VsZCBoYXZlIHRvIHByZXNlcnZlIHRoZSBvcmRlciBvZiB0aGUgc3ltYm9scyBmb3IgdGhlCisgICBhcmd1bWVudHMuICAqLworCisjZGVmaW5lIEJMT0NLX1NIT1VMRF9TT1JUKGJsKSAoKGJsKS0+bnN5bXMgPj0gNDAgJiYgQkxPQ0tfRlVOQ1RJT04gKGJsKSA9PSBOVUxMKQorCisMCisvKiBSZXByZXNlbnQgb25lIHN5bWJvbCBuYW1lOyBhIHZhcmlhYmxlLCBjb25zdGFudCwgZnVuY3Rpb24gb3IgdHlwZWRlZi4gICovCisKKy8qIERpZmZlcmVudCBuYW1lIHNwYWNlcyBmb3Igc3ltYm9scy4gIExvb2tpbmcgdXAgYSBzeW1ib2wgc3BlY2lmaWVzIGEKKyAgIG5hbWVzcGFjZSBhbmQgaWdub3JlcyBzeW1ib2wgZGVmaW5pdGlvbnMgaW4gb3RoZXIgbmFtZSBzcGFjZXMuICovCisgCit0eXBlZGVmIGVudW0gCit7CisgIC8qIFVOREVGX05BTUVTUEFDRSBpcyB1c2VkIHdoZW4gYSBuYW1lc3BhY2UgaGFzIG5vdCBiZWVuIGRpc2NvdmVyZWQgb3IKKyAgICAgbm9uZSBvZiB0aGUgZm9sbG93aW5nIGFwcGx5LiAgVGhpcyB1c3VhbGx5IGluZGljYXRlcyBhbiBlcnJvciBlaXRoZXIKKyAgICAgaW4gdGhlIHN5bWJvbCBpbmZvcm1hdGlvbiBvciBpbiBnZGIncyBoYW5kbGluZyBvZiBzeW1ib2xzLiAqLworCisgIFVOREVGX05BTUVTUEFDRSwKKworICAvKiBWQVJfTkFNRVNQQUNFIGlzIHRoZSB1c3VhbCBuYW1lc3BhY2UuICBJbiBDLCB0aGlzIGNvbnRhaW5zIHZhcmlhYmxlcywKKyAgICAgZnVuY3Rpb24gbmFtZXMsIHR5cGVkZWYgbmFtZXMgYW5kIGVudW0gdHlwZSB2YWx1ZXMuICovCisKKyAgVkFSX05BTUVTUEFDRSwKKworICAvKiBTVFJVQ1RfTkFNRVNQQUNFIGlzIHVzZWQgaW4gQyB0byBob2xkIHN0cnVjdCwgdW5pb24gYW5kIGVudW0gdHlwZSBuYW1lcy4KKyAgICAgVGh1cywgaWYgYHN0cnVjdCBmb28nIGlzIHVzZWQgaW4gYSBDIHByb2dyYW0sIGl0IHByb2R1Y2VzIGEgc3ltYm9sIG5hbWVkCisgICAgIGBmb28nIGluIHRoZSBTVFJVQ1RfTkFNRVNQQUNFLiAqLworCisgIFNUUlVDVF9OQU1FU1BBQ0UsCisKKyAgLyogTEFCRUxfTkFNRVNQQUNFIG1heSBiZSB1c2VkIGZvciBuYW1lcyBvZiBsYWJlbHMgKGZvciBnb3Rvcyk7CisgICAgIGN1cnJlbnRseSBpdCBpcyBub3QgdXNlZCBhbmQgbGFiZWxzIGFyZSBub3QgcmVjb3JkZWQgYXQgYWxsLiAgKi8KKworICBMQUJFTF9OQU1FU1BBQ0UsCisKKyAgLyogU2VhcmNoaW5nIG5hbWVzcGFjZXMuIFRoZXNlIG92ZXJsYXAgd2l0aCBWQVJfTkFNRVNQQUNFLCBwcm92aWRpbmcKKyAgICAgc29tZSBncmFudWxhcml0eSB3aXRoIHRoZSBzZWFyY2hfc3ltYm9scyBmdW5jdGlvbi4gKi8KKworICAvKiBFdmVyeXRoaW5nIGluIFZBUl9OQU1FU1BBQ0UgbWludXMgRlVOQ1RJT05TXy0sIFRZUEVTXy0sIGFuZAorICAgICBNRVRIT0RTX05BTUVTUEFDRSAqLworICBWQVJJQUJMRVNfTkFNRVNQQUNFLAorCisgIC8qIEFsbCBmdW5jdGlvbnMgLS0gZm9yIHNvbWUgcmVhc29uIG5vdCBtZXRob2RzLCB0aG91Z2guICovCisgIEZVTkNUSU9OU19OQU1FU1BBQ0UsCisKKyAgLyogQWxsIGRlZmluZWQgdHlwZXMgKi8KKyAgVFlQRVNfTkFNRVNQQUNFLAorCisgIC8qIEFsbCBjbGFzcyBtZXRob2RzIC0tIHdoeSBpcyB0aGlzIHNlcGFyYXRlZCBvdXQ/ICovCisgIE1FVEhPRFNfTkFNRVNQQUNFCisKK30gbmFtZXNwYWNlX2VudW07CisKKy8qIEFuIGFkZHJlc3MtY2xhc3Mgc2F5cyB3aGVyZSB0byBmaW5kIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4gICovCisKK2VudW0gYWRkcmVzc19jbGFzcworeworICAvKiBOb3QgdXNlZDsgY2F0Y2hlcyBlcnJvcnMgKi8KKworICBMT0NfVU5ERUYsCisKKyAgLyogVmFsdWUgaXMgY29uc3RhbnQgaW50IFNZTUJPTF9WQUxVRSwgaG9zdCBieXRlb3JkZXIgKi8KKworICBMT0NfQ09OU1QsCisKKyAgLyogVmFsdWUgaXMgYXQgZml4ZWQgYWRkcmVzcyBTWU1CT0xfVkFMVUVfQUREUkVTUyAqLworCisgIExPQ19TVEFUSUMsCisKKyAgLyogVmFsdWUgaXMgaW4gcmVnaXN0ZXIuICBTWU1CT0xfVkFMVUUgaXMgdGhlIHJlZ2lzdGVyIG51bWJlci4gICovCisKKyAgTE9DX1JFR0lTVEVSLAorCisgIC8qIEl0J3MgYW4gYXJndW1lbnQ7IHRoZSB2YWx1ZSBpcyBhdCBTWU1CT0xfVkFMVUUgb2Zmc2V0IGluIGFyZ2xpc3QuICAqLworCisgIExPQ19BUkcsCisKKyAgLyogVmFsdWUgYWRkcmVzcyBpcyBhdCBTWU1CT0xfVkFMVUUgb2Zmc2V0IGluIGFyZ2xpc3QuICAqLworCisgIExPQ19SRUZfQVJHLAorCisgIC8qIFZhbHVlIGlzIGluIHJlZ2lzdGVyIG51bWJlciBTWU1CT0xfVkFMVUUuICBKdXN0IGxpa2UgTE9DX1JFR0lTVEVSCisgICAgIGV4Y2VwdCB0aGlzIGlzIGFuIGFyZ3VtZW50LiAgUHJvYmFibHkgdGhlIGNsZWFuZXIgd2F5IHRvIGhhbmRsZQorICAgICB0aGlzIHdvdWxkIGJlIHRvIHNlcGFyYXRlIGFkZHJlc3NfY2xhc3MgKHdoaWNoIHdvdWxkIGluY2x1ZGUKKyAgICAgc2VwYXJhdGUgQVJHIGFuZCBMT0NBTCB0byBkZWFsIHdpdGggRlJBTUVfQVJHU19BRERSRVNTIHZlcnN1cworICAgICBGUkFNRV9MT0NBTFNfQUREUkVTUyksIGFuZCBhbiBpc19hcmd1bWVudCBmbGFnLgorCisgICAgIEZvciBzb21lIHN5bWJvbCBmb3JtYXRzIChzdGFicywgZm9yIHNvbWUgY29tcGlsZXJzIGF0IGxlYXN0KSwKKyAgICAgdGhlIGNvbXBpbGVyIGdlbmVyYXRlcyB0d28gc3ltYm9scywgYW4gYXJndW1lbnQgYW5kIGEgcmVnaXN0ZXIuCisgICAgIEluIHNvbWUgY2FzZXMgd2UgY29tYmluZSB0aGVtIHRvIGEgc2luZ2xlIExPQ19SRUdQQVJNIGluIHN5bWJvbAorICAgICByZWFkaW5nLCBidXQgY3VycmVudGx5IG5vdCBmb3IgYWxsIGNhc2VzIChlLmcuIGl0J3MgcGFzc2VkIG9uIHRoZQorICAgICBzdGFjayBhbmQgdGhlbiBsb2FkZWQgaW50byBhIHJlZ2lzdGVyKS4gICovCisKKyAgTE9DX1JFR1BBUk0sCisKKyAgLyogVmFsdWUgaXMgaW4gc3BlY2lmaWVkIHJlZ2lzdGVyLiAgSnVzdCBsaWtlIExPQ19SRUdQQVJNIGV4Y2VwdCB0aGUKKyAgICAgcmVnaXN0ZXIgaG9sZHMgdGhlIGFkZHJlc3Mgb2YgdGhlIGFyZ3VtZW50IGluc3RlYWQgb2YgdGhlIGFyZ3VtZW50CisgICAgIGl0c2VsZi4gVGhpcyBpcyBjdXJyZW50bHkgdXNlZCBmb3IgdGhlIHBhc3Npbmcgb2Ygc3RydWN0cyBhbmQgdW5pb25zCisgICAgIG9uIHNwYXJjIGFuZCBocHBhLiAgSXQgaXMgYWxzbyB1c2VkIGZvciBjYWxsIGJ5IHJlZmVyZW5jZSB3aGVyZSB0aGUKKyAgICAgYWRkcmVzcyBpcyBpbiBhIHJlZ2lzdGVyLCBhdCBsZWFzdCBieSBtaXBzcmVhZC5jLiAgKi8KKworICBMT0NfUkVHUEFSTV9BRERSLAorCisgIC8qIFZhbHVlIGlzIGEgbG9jYWwgdmFyaWFibGUgYXQgU1lNQk9MX1ZBTFVFIG9mZnNldCBpbiBzdGFjayBmcmFtZS4gICovCisKKyAgTE9DX0xPQ0FMLAorCisgIC8qIFZhbHVlIG5vdCB1c2VkOyBkZWZpbml0aW9uIGluIFNZTUJPTF9UWVBFLiAgU3ltYm9scyBpbiB0aGUgbmFtZXNwYWNlCisgICAgIFNUUlVDVF9OQU1FU1BBQ0UgYWxsIGhhdmUgdGhpcyBjbGFzcy4gICovCisKKyAgTE9DX1RZUEVERUYsCisKKyAgLyogVmFsdWUgaXMgYWRkcmVzcyBTWU1CT0xfVkFMVUVfQUREUkVTUyBpbiB0aGUgY29kZSAqLworCisgIExPQ19MQUJFTCwKKworICAvKiBJbiBhIHN5bWJvbCB0YWJsZSwgdmFsdWUgaXMgU1lNQk9MX0JMT0NLX1ZBTFVFIG9mIGEgYHN0cnVjdCBibG9jaycuCisgICAgIEluIGEgcGFydGlhbCBzeW1ib2wgdGFibGUsIFNZTUJPTF9WQUxVRV9BRERSRVNTIGlzIHRoZSBzdGFydCBhZGRyZXNzCisgICAgIG9mIHRoZSBibG9jay4gIEZ1bmN0aW9uIG5hbWVzIGhhdmUgdGhpcyBjbGFzcy4gKi8KKworICBMT0NfQkxPQ0ssCisKKyAgLyogVmFsdWUgaXMgYSBjb25zdGFudCBieXRlLXNlcXVlbmNlIHBvaW50ZWQgdG8gYnkgU1lNQk9MX1ZBTFVFX0JZVEVTLCBpbgorICAgICB0YXJnZXQgYnl0ZSBvcmRlci4gICovCisKKyAgTE9DX0NPTlNUX0JZVEVTLAorCisgIC8qIFZhbHVlIGlzIGFyZyBhdCBTWU1CT0xfVkFMVUUgb2Zmc2V0IGluIHN0YWNrIGZyYW1lLiBEaWZmZXJzIGZyb20KKyAgICAgTE9DX0xPQ0FMIGluIHRoYXQgc3ltYm9sIGlzIGFuIGFyZ3VtZW50OyBkaWZmZXJzIGZyb20gTE9DX0FSRyBpbgorICAgICB0aGF0IHdlIGZpbmQgaXQgaW4gdGhlIGZyYW1lIChGUkFNRV9MT0NBTFNfQUREUkVTUyksIG5vdCBpbiB0aGUKKyAgICAgYXJnbGlzdCAoRlJBTUVfQVJHU19BRERSRVNTKS4gIEFkZGVkIGZvciBpOTYwLCB3aGljaCBwYXNzZXMgYXJncworICAgICBpbiByZWdzIHRoZW4gY29waWVzIHRvIGZyYW1lLiAgKi8KKworICBMT0NfTE9DQUxfQVJHLAorCisgIC8qIFZhbHVlIGlzIGF0IFNZTUJPTF9WQUxVRSBvZmZzZXQgZnJvbSB0aGUgY3VycmVudCB2YWx1ZSBvZgorICAgICByZWdpc3RlciBudW1iZXIgU1lNQk9MX0JBU0VSRUcuICBUaGlzIGV4aXN0cyBtYWlubHkgZm9yIHRoZSBzYW1lCisgICAgIHRoaW5ncyB0aGF0IExPQ19MT0NBTCBhbmQgTE9DX0FSRyBkbzsgYnV0IHdlIG5lZWQgdG8gZG8gdGhpcworICAgICBpbnN0ZWFkIGJlY2F1c2Ugb24gODhrIERXQVJGIGdpdmVzIHVzIHRoZSBvZmZzZXQgZnJvbSB0aGUKKyAgICAgZnJhbWUvc3RhY2sgcG9pbnRlciwgcmF0aGVyIHRoYW4gdGhlIG9mZnNldCBmcm9tIHRoZSAiY2Fub25pY2FsCisgICAgIGZyYW1lIGFkZHJlc3MiIHVzZWQgYnkgQ09GRiwgc3RhYnMsIGV0Yy4sIGFuZCB3ZSBkb24ndCBrbm93IGhvdworICAgICB0byBjb252ZXJ0IGJldHdlZW4gdGhlc2UgdW50aWwgd2Ugc3RhcnQgZXhhbWluaW5nIHByb2xvZ3Vlcy4KKworICAgICBOb3RlIHRoYXQgTE9DX0JBU0VSRUcgaXMgbXVjaCBsZXNzIGdlbmVyYWwgdGhhbiBhIERXQVJGIGV4cHJlc3Npb24uCisgICAgIFdlIGRvbid0IG5lZWQgdGhlIGdlbmVyYWxpdHkgKGF0IGxlYXN0IG5vdCB5ZXQpLCBhbmQgc3RvcmluZyBhIGdlbmVyYWwKKyAgICAgRFdBUkYgZXhwcmVzc2lvbiB3b3VsZCBwcmVzdW1hYmx5IHRha2UgdXAgbW9yZSBzcGFjZSB0aGFuIHRoZSBleGlzdGluZworICAgICBzY2hlbWUuICAqLworCisgIExPQ19CQVNFUkVHLAorCisgIC8qIFNhbWUgYXMgTE9DX0JBU0VSRUcgYnV0IGl0IGlzIGFuIGFyZ3VtZW50LiAgKi8KKworICBMT0NfQkFTRVJFR19BUkcsCisKKyAgLyogVmFsdWUgaXMgYXQgZml4ZWQgYWRkcmVzcywgYnV0IHRoZSBhZGRyZXNzIG9mIHRoZSB2YXJpYWJsZSBoYXMKKyAgICAgdG8gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZSB3aGVuZXZlciB0aGUKKyAgICAgdmFyaWFibGUgaXMgcmVmZXJlbmNlZC4KKyAgICAgVGhpcyBoYXBwZW5zIGlmIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYSBnbG9iYWwgc3ltYm9sIGlzCisgICAgIGVtaXR0ZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG1pbmltYWwgc3ltYm9sIGlzIGRlZmluZWQKKyAgICAgaW4gYW5vdGhlciBvYmplY3QgZmlsZSBvciBydW50aW1lIGNvbW1vbiBzdG9yYWdlLgorICAgICBUaGUgbGlua2VyIG1pZ2h0IGV2ZW4gcmVtb3ZlIHRoZSBtaW5pbWFsIHN5bWJvbCBpZiB0aGUgZ2xvYmFsCisgICAgIHN5bWJvbCBpcyBuZXZlciByZWZlcmVuY2VkLCBpbiB3aGljaCBjYXNlIHRoZSBzeW1ib2wgcmVtYWlucworICAgICB1bnJlc29sdmVkLiAgKi8KKworICBMT0NfVU5SRVNPTFZFRCwKKworICAvKiBWYWx1ZSBpcyBhdCBhIHRocmVhZC1zcGVjaWZpYyBsb2NhdGlvbiBjYWxjdWxhdGVkIGJ5IGEKKyAgICAgdGFyZ2V0LXNwZWNpZmljIG1ldGhvZC4gKi8KKyAgICAgCisgIExPQ19USFJFQURfTE9DQUxfU1RBVElDLAorICAgICAKKyAgLyogVGhlIHZhcmlhYmxlIGRvZXMgbm90IGFjdHVhbGx5IGV4aXN0IGluIHRoZSBwcm9ncmFtLgorICAgICBUaGUgdmFsdWUgaXMgaWdub3JlZC4gICovCisKKyAgTE9DX09QVElNSVpFRF9PVVQsCisKKyAgLyogVGhlIHZhcmlhYmxlIGlzIHN0YXRpYywgYnV0IGFjdHVhbGx5IGxpdmVzIGF0ICogKGFkZHJlc3MpLgorICAgKiBJLmUuIGRvIGFuIGV4dHJhIGluZGlyZWN0aW9uIHRvIGdldCB0byBpdC4KKyAgICogVGhpcyBpcyB1c2VkIG9uIEhQLVVYIHRvIGdldCBhdCBnbG9iYWxzIHRoYXQgYXJlIGFsbG9jYXRlZAorICAgKiBpbiBzaGFyZWQgbGlicmFyaWVzLCB3aGVyZSByZWZlcmVuY2VzIGZyb20gaW1hZ2VzIG90aGVyCisgICAqIHRoYW4gdGhlIG9uZSB3aGVyZSB0aGUgZ2xvYmFsIHdhcyBhbGxvY2F0ZWQgYXJlIGRvbmUKKyAgICogd2l0aCBhIGxldmVsIG9mIGluZGlyZWN0aW9uLgorICAgKi8KKworICBMT0NfSU5ESVJFQ1QKKworfTsKKworLyogTGlua2VkIGxpc3Qgb2Ygc3ltYm9sJ3MgbGl2ZSByYW5nZXMuICovCisKK3N0cnVjdCByYW5nZV9saXN0CQkKK3sKKyAgQ09SRV9BRERSIHN0YXJ0OworICBDT1JFX0FERFIgZW5kOworICBzdHJ1Y3QgcmFuZ2VfbGlzdCAqbmV4dDsJCit9OworCisvKiBMaW5rZWQgbGlzdCBvZiBhbGlhc2VzIGZvciBhIHBhcnRpY3VsYXIgbWFpbi9wcmltYXJ5IHN5bWJvbC4gICovCitzdHJ1Y3QgYWxpYXNfbGlzdAorICB7CisgICAgc3RydWN0IHN5bWJvbCAqc3ltOworICAgIHN0cnVjdCBhbGlhc19saXN0ICpuZXh0OworICB9OworCitzdHJ1Y3Qgc3ltYm9sCit7CisKKyAgLyogVGhlIGdlbmVyYWwgc3ltYm9sIGluZm8gcmVxdWlyZWQgZm9yIGFsbCB0eXBlcyBvZiBzeW1ib2xzLiAqLworCisgIHN0cnVjdCBnZW5lcmFsX3N5bWJvbF9pbmZvIGdpbmZvOworCisgIC8qIERhdGEgdHlwZSBvZiB2YWx1ZSAqLworCisgIHN0cnVjdCB0eXBlICp0eXBlOworCisgIC8qIE5hbWUgc3BhY2UgY29kZS4gICovCisKKyNpZmRlZiBfX01GQzRfXworICAvKiBGSVhNRTogZG9uJ3QgY29uZmxpY3Qgd2l0aCBDKysncyBuYW1lc3BhY2UgKi8KKyAgLyogd291bGQgYmUgc2FmZXIgdG8gZG8gYSBnbG9iYWwgY2hhbmdlIGZvciBhbGwgbmFtZXNwYWNlIGlkZW50aWZpZXJzLiAqLworICAjZGVmaW5lIG5hbWVzcGFjZSBfbmFtZXNwYWNlCisjZW5kaWYKKyAgbmFtZXNwYWNlX2VudW0gbmFtZXNwYWNlIEJZVEVfQklURklFTEQ7CisKKyAgLyogQWRkcmVzcyBjbGFzcyAqLworCisgIGVudW0gYWRkcmVzc19jbGFzcyBhY2xhc3MgQllURV9CSVRGSUVMRDsKKworICAvKiBMaW5lIG51bWJlciBvZiBkZWZpbml0aW9uLiAgRklYTUU6ICBTaG91bGQgd2UgcmVhbGx5IG1ha2UgdGhlIGFzc3VtcHRpb24KKyAgICAgdGhhdCBub2JvZHkgd2lsbCB0cnkgdG8gZGVidWcgZmlsZXMgbG9uZ2VyIHRoYW4gNjRLIGxpbmVzPyAgV2hhdCBhYm91dAorICAgICBtYWNoaW5lIGdlbmVyYXRlZCBwcm9ncmFtcz8gKi8KKworICB1bnNpZ25lZCBzaG9ydCBsaW5lOworICAKKyAgLyogU29tZSBzeW1ib2xzIHJlcXVpcmUgYW4gYWRkaXRpb25hbCB2YWx1ZSB0byBiZSByZWNvcmRlZCBvbiBhIHBlci0KKyAgICAgc3ltYm9sIGJhc2lzLiAgU3Rhc2ggdGhvc2UgdmFsdWVzIGhlcmUuICovCisKKyAgdW5pb24KKyAgICB7CisgICAgICAvKiBVc2VkIGJ5IExPQ19CQVNFUkVHIGFuZCBMT0NfQkFTRVJFR19BUkcuICAqLworICAgICAgc2hvcnQgYmFzZXJlZzsKKyAgICB9CisgIGF1eF92YWx1ZTsKKworCisgIC8qIExpbmsgdG8gYSBsaXN0IG9mIGFsaWFzZXMgZm9yIHRoaXMgc3ltYm9sLgorICAgICBPbmx5IGEgInByaW1hcnkvbWFpbiBzeW1ib2wgbWF5IGhhdmUgYWxpYXNlcy4gICovCisgIHN0cnVjdCBhbGlhc19saXN0ICphbGlhc2VzOworCisgIC8qIExpc3Qgb2YgcmFuZ2VzIHdoZXJlIHRoaXMgc3ltYm9sIGlzIGFjdGl2ZS4gIFRoaXMgaXMgb25seQorICAgICB1c2VkIGJ5IGFsaWFzIHN5bWJvbHMgYXQgdGhlIGN1cnJlbnQgdGltZS4gICovCisgIHN0cnVjdCByYW5nZV9saXN0ICpyYW5nZXM7Cit9OworCisKKyNkZWZpbmUgU1lNQk9MX05BTUVTUEFDRShzeW1ib2wpCShzeW1ib2wpLT5uYW1lc3BhY2UKKyNkZWZpbmUgU1lNQk9MX0NMQVNTKHN5bWJvbCkJCShzeW1ib2wpLT5hY2xhc3MKKyNkZWZpbmUgU1lNQk9MX1RZUEUoc3ltYm9sKQkJKHN5bWJvbCktPnR5cGUKKyNkZWZpbmUgU1lNQk9MX0xJTkUoc3ltYm9sKQkJKHN5bWJvbCktPmxpbmUKKyNkZWZpbmUgU1lNQk9MX0JBU0VSRUcoc3ltYm9sKQkJKHN5bWJvbCktPmF1eF92YWx1ZS5iYXNlcmVnCisjZGVmaW5lIFNZTUJPTF9BTElBU0VTKHN5bWJvbCkJCShzeW1ib2wpLT5hbGlhc2VzCisjZGVmaW5lIFNZTUJPTF9SQU5HRVMoc3ltYm9sKQkJKHN5bWJvbCktPnJhbmdlcworDAorLyogQSBwYXJ0aWFsX3N5bWJvbCByZWNvcmRzIHRoZSBuYW1lLCBuYW1lc3BhY2UsIGFuZCBhZGRyZXNzIGNsYXNzIG9mCisgICBzeW1ib2xzIHdob3NlIHR5cGVzIHdlIGhhdmUgbm90IHBhcnNlZCB5ZXQuICBGb3IgZnVuY3Rpb25zLCBpdCBhbHNvCisgICBjb250YWlucyB0aGVpciBtZW1vcnkgYWRkcmVzcywgc28gd2UgY2FuIGZpbmQgdGhlbSBmcm9tIGEgUEMgdmFsdWUuCisgICBFYWNoIHBhcnRpYWxfc3ltYm9sIHNpdHMgaW4gYSBwYXJ0aWFsX3N5bXRhYiwgYWxsIG9mIHdoaWNoIGFyZSBjaGFpbmVkCisgICBvbiBhICBwYXJ0aWFsIHN5bXRhYiBsaXN0IGFuZCB3aGljaCBwb2ludHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgCisgICBub3JtYWwgc3ltdGFiIG9uY2UgdGhlIHBhcnRpYWxfc3ltdGFiIGhhcyBiZWVuIHJlZmVyZW5jZWQuICAqLworCitzdHJ1Y3QgcGFydGlhbF9zeW1ib2wKK3sKKworICAvKiBUaGUgZ2VuZXJhbCBzeW1ib2wgaW5mbyByZXF1aXJlZCBmb3IgYWxsIHR5cGVzIG9mIHN5bWJvbHMuICovCisKKyAgc3RydWN0IGdlbmVyYWxfc3ltYm9sX2luZm8gZ2luZm87CisKKyAgLyogTmFtZSBzcGFjZSBjb2RlLiAgKi8KKworICBuYW1lc3BhY2VfZW51bSBuYW1lc3BhY2UgQllURV9CSVRGSUVMRDsKKworICAvKiBBZGRyZXNzIGNsYXNzIChmb3IgaW5mb19zeW1ib2xzKSAqLworCisgIGVudW0gYWRkcmVzc19jbGFzcyBhY2xhc3MgQllURV9CSVRGSUVMRDsKKworfTsKKworI2RlZmluZSBQU1lNQk9MX05BTUVTUEFDRShwc3ltYm9sKQkocHN5bWJvbCktPm5hbWVzcGFjZQorI2RlZmluZSBQU1lNQk9MX0NMQVNTKHBzeW1ib2wpCQkocHN5bWJvbCktPmFjbGFzcworCisMCisvKiBTb3VyY2UtZmlsZSBpbmZvcm1hdGlvbi4gIFRoaXMgZGVzY3JpYmVzIHRoZSByZWxhdGlvbiBiZXR3ZWVuIHNvdXJjZSBmaWxlcywKKyAgIGluZSBudW1iZXJzIGFuZCBhZGRyZXNzZXMgaW4gdGhlIHByb2dyYW0gdGV4dC4gICovCisKK3N0cnVjdCBzb3VyY2V2ZWN0b3IKK3sKKyAgaW50IGxlbmd0aDsJCQkvKiBOdW1iZXIgb2Ygc291cmNlIGZpbGVzIGRlc2NyaWJlZCAqLworICBzdHJ1Y3Qgc291cmNlICpzb3VyY2VbMV07CS8qIERlc2NyaXB0aW9ucyBvZiB0aGUgZmlsZXMgKi8KK307CisKKy8qIEVhY2ggaXRlbSByZXByZXNlbnRzIGEgbGluZS0tPnBjIChvciB0aGUgcmV2ZXJzZSkgbWFwcGluZy4gIFRoaXMgaXMKKyAgIHNvbWV3aGF0IG1vcmUgd2FzdGVmdWwgb2Ygc3BhY2UgdGhhbiBvbmUgbWlnaHQgd2lzaCwgYnV0IHNpbmNlIG9ubHkKKyAgIHRoZSBmaWxlcyB3aGljaCBhcmUgYWN0dWFsbHkgZGVidWdnZWQgYXJlIHJlYWQgaW4gdG8gY29yZSwgd2UgZG9uJ3QKKyAgIHdhc3RlIG11Y2ggc3BhY2UuICAqLworCitzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5Cit7CisgIGludCBsaW5lOworICBDT1JFX0FERFIgcGM7Cit9OworCisvKiBUaGUgb3JkZXIgb2YgZW50cmllcyBpbiB0aGUgbGluZXRhYmxlIGlzIHNpZ25pZmljYW50LiAgVGhleSBzaG91bGQKKyAgIGJlIHNvcnRlZCBieSBpbmNyZWFzaW5nIHZhbHVlcyBvZiB0aGUgcGMgZmllbGQuICBJZiB0aGVyZSBpcyBtb3JlIHRoYW4KKyAgIG9uZSBlbnRyeSBmb3IgYSBnaXZlbiBwYywgdGhlbiBJJ20gbm90IHN1cmUgd2hhdCBzaG91bGQgaGFwcGVuIChhbmQKKyAgIEkgbm90IHN1cmUgd2hldGhlciB3ZSBjdXJyZW50bHkgaGFuZGxlIGl0IHRoZSBiZXN0IHdheSkuCisKKyAgIEV4YW1wbGU6IGEgQyBmb3Igc3RhdGVtZW50IGdlbmVyYWxseSBsb29rcyBsaWtlIHRoaXMKKworICAgCTEwCTB4MTAwCS0gZm9yIHRoZSBpbml0L3Rlc3QgcGFydCBvZiBhIGZvciBzdG10LgorICAgCTIwCTB4MjAwCisgICAJMzAJMHgzMDAKKyAgIAkxMAkweDQwMAktIGZvciB0aGUgaW5jcmVtZW50IHBhcnQgb2YgYSBmb3Igc3RtdC4KKworICAgKi8KKworc3RydWN0IGxpbmV0YWJsZQoreworICBpbnQgbml0ZW1zOworCisgIC8qIEFjdHVhbGx5IE5JVEVNUyBlbGVtZW50cy4gIElmIHlvdSBkb24ndCBsaWtlIHRoaXMgdXNlIG9mIHRoZQorICAgICBgc3RydWN0IGhhY2snLCB5b3UgY2FuIHNob3ZlIGl0IHVwIHlvdXIgQU5TSSAoc2VyaW91c2x5LCBpZiB0aGUKKyAgICAgY29tbWl0dGVlIHRlbGxzIHVzIGhvdyB0byBkbyBpdCwgd2UgY2FuIHByb2JhYmx5IGdvIGFsb25nKS4gICovCisgIHN0cnVjdCBsaW5ldGFibGVfZW50cnkgaXRlbVsxXTsKK307CisKKy8qIEFsbCB0aGUgaW5mb3JtYXRpb24gb24gb25lIHNvdXJjZSBmaWxlLiAgKi8KKworc3RydWN0IHNvdXJjZQoreworICBjaGFyICpuYW1lOwkJCS8qIE5hbWUgb2YgZmlsZSAqLworICBzdHJ1Y3QgbGluZXRhYmxlIGNvbnRlbnRzOworfTsKKworLyogSG93IHRvIHJlbG9jYXRlIHRoZSBzeW1ib2xzIGZyb20gZWFjaCBzZWN0aW9uIGluIGEgc3ltYm9sIGZpbGUuCisgICBFYWNoIHN0cnVjdCBjb250YWlucyBhbiBhcnJheSBvZiBvZmZzZXRzLgorICAgVGhlIG9yZGVyaW5nIGFuZCBtZWFuaW5nIG9mIHRoZSBvZmZzZXRzIGlzIGZpbGUtdHlwZS1kZXBlbmRlbnQ7CisgICB0eXBpY2FsbHkgaXQgaXMgaW5kZXhlZCBieSBzZWN0aW9uIG51bWJlcnMgb3Igc3ltYm9sIHR5cGVzIG9yCisgICBzb21ldGhpbmcgbGlrZSB0aGF0LgorCisgICBUbyBnaXZlIHVzIGZsZXhpYmlsaXR5IGluIGNoYW5naW5nIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgorICAgb2YgdGhlc2Ugb2Zmc2V0cywgdGhlIEFOT0ZGU0VUIG1hY3JvIG11c3QgYmUgdXNlZCB0byBpbnNlcnQgYW5kCisgICBleHRyYWN0IG9mZnNldCB2YWx1ZXMgaW4gdGhlIHN0cnVjdC4gICovCisKK3N0cnVjdCBzZWN0aW9uX29mZnNldHMKKyAgeworICAgIENPUkVfQUREUiBvZmZzZXRzWzFdOwkJLyogQXMgbWFueSBhcyBuZWVkZWQuICovCisgIH07CisKKyNkZWZpbmUJQU5PRkZTRVQoc2Vjb2ZmLCB3aGljaG9uZSkJKHNlY29mZi0+b2Zmc2V0c1t3aGljaG9uZV0pCisKKy8qIFRoZSBtYXhpbXVtIHBvc3NpYmxlIHNpemUgb2YgYSBzZWN0aW9uX29mZnNldHMgdGFibGUuICAqLworIAorI2RlZmluZSBTSVpFT0ZfU0VDVElPTl9PRkZTRVRTIFwKKyAgKHNpemVvZiAoc3RydWN0IHNlY3Rpb25fb2Zmc2V0cykgXAorICAgKyBzaXplb2YgKCgoc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqKSAwKS0+b2Zmc2V0cykgKiAoU0VDVF9PRkZfTUFYLTEpKQorCisKKy8qIEVhY2ggc291cmNlIGZpbGUgb3IgaGVhZGVyIGlzIHJlcHJlc2VudGVkIGJ5IGEgc3RydWN0IHN5bXRhYi4gCisgICBUaGVzZSBvYmplY3RzIGFyZSBjaGFpbmVkIHRocm91Z2ggdGhlIGBuZXh0JyBmaWVsZC4gICovCisKK3N0cnVjdCBzeW10YWIKKyAgeworCisgICAgLyogQ2hhaW4gb2YgYWxsIGV4aXN0aW5nIHN5bXRhYnMuICAqLworCisgICAgc3RydWN0IHN5bXRhYiAqbmV4dDsKKworICAgIC8qIExpc3Qgb2YgYWxsIHN5bWJvbCBzY29wZSBibG9ja3MgZm9yIHRoaXMgc3ltdGFiLiAgTWF5IGJlIHNoYXJlZAorICAgICAgIGJldHdlZW4gZGlmZmVyZW50IHN5bXRhYnMgKGFuZCBub3JtYWxseSBpcyBmb3IgYWxsIHRoZSBzeW10YWJzCisgICAgICAgaW4gYSBnaXZlbiBjb21waWxhdGlvbiB1bml0KS4gICovCisKKyAgICBzdHJ1Y3QgYmxvY2t2ZWN0b3IgKmJsb2NrdmVjdG9yOworCisgICAgLyogVGFibGUgbWFwcGluZyBjb3JlIGFkZHJlc3NlcyB0byBsaW5lIG51bWJlcnMgZm9yIHRoaXMgZmlsZS4KKyAgICAgICBDYW4gYmUgTlVMTCBpZiBub25lLiAgTmV2ZXIgc2hhcmVkIGJldHdlZW4gZGlmZmVyZW50IHN5bXRhYnMuICAqLworCisgICAgc3RydWN0IGxpbmV0YWJsZSAqbGluZXRhYmxlOworCisgICAgLyogU2VjdGlvbiBpbiBvYmpmaWxlLT5zZWN0aW9uX29mZnNldHMgZm9yIHRoZSBibG9ja3ZlY3RvciBhbmQKKyAgICAgICB0aGUgbGluZXRhYmxlLiAgUHJvYmFibHkgYWx3YXlzIFNFQ1RfT0ZGX1RFWFQuICAqLworCisgICAgaW50IGJsb2NrX2xpbmVfc2VjdGlvbjsKKworICAgIC8qIElmIHNldmVyYWwgc3ltdGFicyBzaGFyZSBhIGJsb2NrdmVjdG9yLCBleGFjdGx5IG9uZSBvZiB0aGVtCisgICAgICAgc2hvdWxkIGJlIGRlc2lnbmVkIHRoZSBwcmltYXJ5LCBzbyB0aGF0IHRoZSBibG9ja3ZlY3RvcgorICAgICAgIGlzIHJlbG9jYXRlZCBleGFjdGx5IG9uY2UgYnkgb2JqZmlsZV9yZWxvY2F0ZS4gICovCisKKyAgICBpbnQgcHJpbWFyeTsKKworICAgIC8qIE5hbWUgb2YgdGhpcyBzb3VyY2UgZmlsZS4gICovCisKKyAgICBjaGFyICpmaWxlbmFtZTsKKworICAgIC8qIERpcmVjdG9yeSBpbiB3aGljaCBpdCB3YXMgY29tcGlsZWQsIG9yIE5VTEwgaWYgd2UgZG9uJ3Qga25vdy4gICovCisKKyAgICBjaGFyICpkaXJuYW1lOworCisgICAgLyogVGhpcyBjb21wb25lbnQgc2F5cyBob3cgdG8gZnJlZSB0aGUgZGF0YSB3ZSBwb2ludCB0bzoKKyAgICAgICBmcmVlX2NvbnRlbnRzID0+IGRvIGEgdHJlZSB3YWxrIGFuZCBmcmVlIGVhY2ggb2JqZWN0LgorICAgICAgIGZyZWVfbm90aGluZyA9PiBkbyBub3RoaW5nOyBzb21lIG90aGVyIHN5bXRhYiB3aWxsIGZyZWUKKyAgICAgICAgIHRoZSBkYXRhIHRoaXMgb25lIHVzZXMuCisgICAgICBmcmVlX2xpbmV0YWJsZSA9PiBmcmVlIGp1c3QgdGhlIGxpbmV0YWJsZS4gIEZJWE1FOiBJcyB0aGlzIHJlZHVuZGFudAorICAgICAgd2l0aCB0aGUgcHJpbWFyeSBmaWVsZD8gICovCisKKyAgICBlbnVtIGZyZWVfY29kZQorICAgICAgeworCWZyZWVfbm90aGluZywgZnJlZV9jb250ZW50cywgZnJlZV9saW5ldGFibGUKKwl9CisgICAgZnJlZV9jb2RlOworCisgICAgLyogUG9pbnRlciB0byBvbmUgYmxvY2sgb2Ygc3RvcmFnZSB0byBiZSBmcmVlZCwgaWYgbm9uemVyby4gICovCisgICAgLyogVGhpcyBpcyBJTiBBRERJVElPTiB0byB0aGUgYWN0aW9uIGluZGljYXRlZCBieSBmcmVlX2NvZGUuICAqLworICAgIAorICAgIGNoYXIgKmZyZWVfcHRyOworCisgICAgLyogVG90YWwgbnVtYmVyIG9mIGxpbmVzIGZvdW5kIGluIHNvdXJjZSBmaWxlLiAgKi8KKworICAgIGludCBubGluZXM7CisKKyAgICAvKiBsaW5lX2NoYXJwb3NbTl0gaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSAoTi0xKXRoIGxpbmUgb2YgdGhlCisgICAgICAgc291cmNlIGZpbGUuICAicG9zaXRpb24iIG1lYW5zIHNvbWV0aGluZyB3ZSBjYW4gbHNlZWsoKSB0bzsgaXQKKyAgICAgICBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB1c2VmdWwgYW55IG90aGVyIHdheS4gICovCisKKyAgICBpbnQgKmxpbmVfY2hhcnBvczsKKworICAgIC8qIExhbmd1YWdlIG9mIHRoaXMgc291cmNlIGZpbGUuICAqLworCisgICAgZW51bSBsYW5ndWFnZSBsYW5ndWFnZTsKKworICAgIC8qIFN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhlIGZvcm1hdCBvZiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBzdWNoCisgICAgICAgYXMgInN0YWJzIiwgImR3YXJmIDEiLCAiZHdhcmYgMiIsICJjb2ZmIiwgZXRjLiAgVGhpcyBpcyBtb3N0bHkgdXNlZnVsCisgICAgICAgZm9yIGF1dG9tYXRlZCB0ZXN0aW5nIG9mIGdkYiBidXQgbWF5IGFsc28gYmUgaW5mb3JtYXRpb24gdGhhdCBpcworICAgICAgIHVzZWZ1bCB0byB0aGUgdXNlci4gKi8KKworICAgIGNoYXIgKmRlYnVnZm9ybWF0OworCisgICAgLyogU3RyaW5nIG9mIHZlcnNpb24gaW5mb3JtYXRpb24uICBNYXkgYmUgemVyby4gICovCisKKyAgICBjaGFyICp2ZXJzaW9uOworCisgICAgLyogRnVsbCBuYW1lIG9mIGZpbGUgYXMgZm91bmQgYnkgc2VhcmNoaW5nIHRoZSBzb3VyY2UgcGF0aC4KKyAgICAgICBOVUxMIGlmIG5vdCB5ZXQga25vd24uICAqLworCisgICAgY2hhciAqZnVsbG5hbWU7CisKKyAgICAvKiBPYmplY3QgZmlsZSBmcm9tIHdoaWNoIHRoaXMgc3ltYm9sIGluZm9ybWF0aW9uIHdhcyByZWFkLiAgKi8KKworICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworCisgIH07CisKKyNkZWZpbmUgQkxPQ0tWRUNUT1Ioc3ltdGFiKQkoc3ltdGFiKS0+YmxvY2t2ZWN0b3IKKyNkZWZpbmUgTElORVRBQkxFKHN5bXRhYikJKHN5bXRhYiktPmxpbmV0YWJsZQorCisMCisvKiBFYWNoIHNvdXJjZSBmaWxlIHRoYXQgaGFzIG5vdCBiZWVuIGZ1bGx5IHJlYWQgaW4gaXMgcmVwcmVzZW50ZWQgYnkKKyAgIGEgcGFydGlhbF9zeW10YWIuICBUaGlzIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBvbiB3aGVyZSBpbiB0aGUKKyAgIGV4ZWN1dGFibGUgdGhlIGRlYnVnZ2luZyBzeW1ib2xzIGZvciBhIHNwZWNpZmljIGZpbGUgYXJlLCBhbmQgYQorICAgbGlzdCBvZiBuYW1lcyBvZiBnbG9iYWwgc3ltYm9scyB3aGljaCBhcmUgbG9jYXRlZCBpbiB0aGlzIGZpbGUuCisgICBUaGV5IGFyZSBhbGwgY2hhaW5lZCBvbiBwYXJ0aWFsIHN5bXRhYiBsaXN0cy4KKworICAgRXZlbiBhZnRlciB0aGUgc291cmNlIGZpbGUgaGFzIGJlZW4gcmVhZCBpbnRvIGEgc3ltdGFiLCB0aGUKKyAgIHBhcnRpYWxfc3ltdGFiIHJlbWFpbnMgYXJvdW5kLiAgVGhleSBhcmUgYWxsb2NhdGVkIG9uIGFuIG9ic3RhY2ssCisgICBwc3ltYm9sX29ic3RhY2suICBGSVhNRSwgdGhpcyBpcyBiYWQgZm9yIGR5bmFtaWMgbGlua2luZyBvciBWeFdvcmtzLQorICAgc3R5bGUgZXhlY3V0aW9uIG9mIGEgYnVuY2ggb2YgLm8ncy4gICovCisKK3N0cnVjdCBwYXJ0aWFsX3N5bXRhYgoreworCisgIC8qIENoYWluIG9mIGFsbCBleGlzdGluZyBwYXJ0aWFsIHN5bXRhYnMuICAqLworCisgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqbmV4dDsKKworICAvKiBOYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB3aGljaCB0aGlzIHBhcnRpYWxfc3ltdGFiIGRlZmluZXMgKi8KKworICBjaGFyICpmaWxlbmFtZTsKKworICAvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGZpbGUgZnJvbSB3aGljaCBzeW1ib2xzIHNob3VsZCBiZSByZWFkLiAgKi8KKworICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKworICAvKiBTZXQgb2YgcmVsb2NhdGlvbiBvZmZzZXRzIHRvIGFwcGx5IHRvIGVhY2ggc2VjdGlvbi4gICovIAorCisgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKworICAvKiBSYW5nZSBvZiB0ZXh0IGFkZHJlc3NlcyBjb3ZlcmVkIGJ5IHRoaXMgZmlsZTsgdGV4dGhpZ2ggaXMgdGhlCisgICAgIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBzZWN0aW9uLiAqLworCisgIENPUkVfQUREUiB0ZXh0bG93OworICBDT1JFX0FERFIgdGV4dGhpZ2g7CisKKyAgLyogQXJyYXkgb2YgcG9pbnRlcnMgdG8gYWxsIG9mIHRoZSBwYXJ0aWFsX3N5bXRhYidzIHdoaWNoIHRoaXMgb25lCisgICAgIGRlcGVuZHMgb24uICBTaW5jZSB0aGlzIGFycmF5IGNhbiBvbmx5IGJlIHNldCB0byBwcmV2aW91cyBvcgorICAgICB0aGUgY3VycmVudCAoPykgcHN5bXRhYiwgdGhpcyBkZXBlbmRlbmN5IHRyZWUgaXMgZ3VhcmFudGVlZCBub3QKKyAgICAgdG8gaGF2ZSBhbnkgbG9vcHMuICAiZGVwZW5kcyBvbiIgbWVhbnMgdGhhdCBzeW1ib2xzIG11c3QgYmUgcmVhZAorICAgICBmb3IgdGhlIGRlcGVuZGVuY2llcyBiZWZvcmUgYmVpbmcgcmVhZCBmb3IgdGhpcyBwc3ltdGFiOyB0aGlzIGlzCisgICAgIGZvciB0eXBlIHJlZmVyZW5jZXMgaW4gc3RhYnMsIHdoZXJlIGlmIGZvby5jIGluY2x1ZGVzIGZvby5oLCBkZWNsYXJhdGlvbnMKKyAgICAgaW4gZm9vLmggbWF5IHVzZSB0eXBlIG51bWJlcnMgZGVmaW5lZCBpbiBmb28uYy4gIEZvciBvdGhlciBkZWJ1Z2dpbmcKKyAgICAgZm9ybWF0cyB0aGVyZSBtYXkgYmUgbm8gbmVlZCB0byB1c2UgZGVwZW5kZW5jaWVzLiAgKi8KKworICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKipkZXBlbmRlbmNpZXM7CisKKyAgaW50IG51bWJlcl9vZl9kZXBlbmRlbmNpZXM7CisKKyAgLyogR2xvYmFsIHN5bWJvbCBsaXN0LiAgVGhpcyBsaXN0IHdpbGwgYmUgc29ydGVkIGFmdGVyIHJlYWRpbiB0bworICAgICBpbXByb3ZlIGFjY2Vzcy4gIEJpbmFyeSBzZWFyY2ggd2lsbCBiZSB0aGUgdXN1YWwgbWV0aG9kIG9mCisgICAgIGZpbmRpbmcgYSBzeW1ib2wgd2l0aGluIGl0LiBnbG9iYWxzX29mZnNldCBpcyBhbiBpbnRlZ2VyIG9mZnNldAorICAgICB3aXRoaW4gZ2xvYmFsX3BzeW1ib2xzW10uICAqLworCisgIGludCBnbG9iYWxzX29mZnNldDsKKyAgaW50IG5fZ2xvYmFsX3N5bXM7CisKKyAgLyogU3RhdGljIHN5bWJvbCBsaXN0LiAgVGhpcyBsaXN0IHdpbGwgKm5vdCogYmUgc29ydGVkIGFmdGVyIHJlYWRpbjsKKyAgICAgdG8gZmluZCBhIHN5bWJvbCBpbiBpdCwgZXhoYXVzdGl2ZSBzZWFyY2ggbXVzdCBiZSB1c2VkLiAgVGhpcyBpcworICAgICByZWFzb25hYmxlIGJlY2F1c2Ugc2VhcmNoZXMgdGhyb3VnaCB0aGlzIGxpc3Qgd2lsbCBldmVudHVhbGx5CisgICAgIGxlYWQgdG8gZWl0aGVyIHRoZSByZWFkIGluIG9mIGEgZmlsZXMgc3ltYm9scyBmb3IgcmVhbCAoYXNzdW1lZAorICAgICB0byB0YWtlIGEgKmxvdCogb2YgdGltZTsgY2hlY2spIG9yIGFuIGVycm9yIChhbmQgd2UgZG9uJ3QgY2FyZQorICAgICBob3cgbG9uZyBlcnJvcnMgdGFrZSkuICBUaGlzIGlzIGFuIG9mZnNldCBhbmQgc2l6ZSB3aXRoaW4KKyAgICAgc3RhdGljX3BzeW1ib2xzW10uICAqLworCisgIGludCBzdGF0aWNzX29mZnNldDsKKyAgaW50IG5fc3RhdGljX3N5bXM7CisKKyAgLyogUG9pbnRlciB0byBzeW10YWIgZXZlbnR1YWxseSBhbGxvY2F0ZWQgZm9yIHRoaXMgc291cmNlIGZpbGUsIDAgaWYKKyAgICAgIXJlYWRpbiBvciBpZiB3ZSBoYXZlbid0IGxvb2tlZCBmb3IgdGhlIHN5bXRhYiBhZnRlciBpdCB3YXMgcmVhZGluLiAgKi8KKworICBzdHJ1Y3Qgc3ltdGFiICpzeW10YWI7CisKKyAgLyogUG9pbnRlciB0byBmdW5jdGlvbiB3aGljaCB3aWxsIHJlYWQgaW4gdGhlIHN5bXRhYiBjb3JyZXNwb25kaW5nIHRvCisgICAgIHRoaXMgcHN5bXRhYi4gICovCisKKyAgdm9pZCAoKnJlYWRfc3ltdGFiKSBQQVJBTVMgKChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworCisgIC8qIEluZm9ybWF0aW9uIHRoYXQgbGV0cyByZWFkX3N5bXRhYigpIGxvY2F0ZSB0aGUgcGFydCBvZiB0aGUgc3ltYm9sIHRhYmxlCisgICAgIHRoYXQgdGhpcyBwc3ltdGFiIGNvcnJlc3BvbmRzIHRvLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBwcml2YXRlIHRvIHRoZQorICAgICBmb3JtYXQtZGVwZW5kZW50IHN5bWJvbCByZWFkaW5nIHJvdXRpbmVzLiAgRm9yIGZ1cnRoZXIgZGV0YWlsIGV4YW1pbmUKKyAgICAgdGhlIHZhcmlvdXMgc3ltYm9sIHJlYWRpbmcgbW9kdWxlcy4gIFNob3VsZCByZWFsbHkgYmUgKHZvaWQgKikgYnV0IGlzCisgICAgIChjaGFyICopIGFzIHdpdGggb3RoZXIgc3VjaCBnZGIgdmFyaWFibGVzLiAgKEZJWE1FKSAqLworCisgIGNoYXIgKnJlYWRfc3ltdGFiX3ByaXZhdGU7CisKKyAgLyogTm9uLXplcm8gaWYgdGhlIHN5bXRhYiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcHN5bXRhYiBoYXMgYmVlbiByZWFkaW4gKi8KKworICB1bnNpZ25lZCBjaGFyIHJlYWRpbjsKK307CisKKy8qIEEgZmFzdCB3YXkgdG8gZ2V0IGZyb20gYSBwc3ltdGFiIHRvIGl0cyBzeW10YWIgKGFmdGVyIHRoZSBmaXJzdCB0aW1lKS4gICovCisjZGVmaW5lCVBTWU1UQUJfVE9fU1lNVEFCKHBzdCkgIFwKKyAgICAoKHBzdCkgLT4gc3ltdGFiICE9IE5VTEwgPyAocHN0KSAtPiBzeW10YWIgOiBwc3ltdGFiX3RvX3N5bXRhYiAocHN0KSkKKworDAorLyogVGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgaXMgbm93IGFuIGFycmF5IG9mIHN0cnVjdHVyZXMgd2hpY2ggaGF2ZSB0aGUKKyAgIGZvcm0geyBpbnQxNiBvZmZzZXQsIGRlbHRhOyB2b2lkICpwZm47IH0uIAorCisgICBJbiBub3JtYWwgdmlydHVhbCBmdW5jdGlvbiB0YWJsZXMsIE9GRlNFVCBpcyB1bnVzZWQuCisgICBERUxUQSBpcyB0aGUgYW1vdW50IHdoaWNoIGlzIGFkZGVkIHRvIHRoZSBhcHBhcmVudCBvYmplY3QncyBiYXNlCisgICBhZGRyZXNzIGluIG9yZGVyIHRvIHBvaW50IHRvIHRoZSBhY3R1YWwgb2JqZWN0IHRvIHdoaWNoIHRoZQorICAgdmlydHVhbCBmdW5jdGlvbiBzaG91bGQgYmUgYXBwbGllZC4KKyAgIFBGTiBpcyBhIHBvaW50ZXIgdG8gdGhlIHZpcnR1YWwgZnVuY3Rpb24uCisKKyAgIE5vdGUgdGhhdCB0aGlzIG1hY3JvIGlzIGcrKyBzcGVjaWZpYyAoRklYTUUpLiAqLworICAKKyNkZWZpbmUgVlRCTF9GTkFERFJfT0ZGU0VUIDIKKworLyogTWFjcm8gdGhhdCB5aWVsZHMgbm9uLXplcm8gdmFsdWUgaWZmIE5BTUUgaXMgdGhlIHByZWZpeCBmb3IgQysrIG9wZXJhdG9yCisgICBuYW1lcy4gIElmIHlvdSBsZWF2ZSBvdXQgdGhlIHBhcmVudGhlc2lzIGhlcmUgeW91IHdpbGwgbG9zZSEKKyAgIEN1cnJlbnRseSAnbycgJ3AnIENQTFVTX01BUktFUiBpcyB1c2VkIGZvciBib3RoIHRoZSBzeW1ib2wgaW4gdGhlCisgICBzeW1ib2wtZmlsZSBhbmQgdGhlIG5hbWVzIGluIGdkYidzIHN5bWJvbCB0YWJsZS4KKyAgIE5vdGUgdGhhdCB0aGlzIG1hY3JvIGlzIGcrKyBzcGVjaWZpYyAoRklYTUUpLiAqLworCisjZGVmaW5lIE9QTkFNRV9QUkVGSVhfUChOQU1FKSBcCisgICgoTkFNRSlbMF0gPT0gJ28nICYmIChOQU1FKVsxXSA9PSAncCcgJiYgaXNfY3BsdXNfbWFya2VyICgoTkFNRSlbMl0pKQorCisvKiBNYWNybyB0aGF0IHlpZWxkcyBub24temVybyB2YWx1ZSBpZmYgTkFNRSBpcyB0aGUgcHJlZml4IGZvciBDKysgdnRibAorICAgbmFtZXMuICBOb3RlIHRoYXQgdGhpcyBtYWNybyBpcyBnKysgc3BlY2lmaWMgKEZJWE1FKS4KKyAgICdfdnQkJyBpcyB0aGUgb2xkIGNmcm9udC1zdHlsZSB2dGFibGVzOyAnX1ZUJCcgaXMgdGhlIG5ldworICAgc3R5bGUsIHVzaW5nIHRodW5rcyAod2hlcmUgJyQnIGlzIHJlYWxseSBDUExVU19NQVJLRVIpLiAqLworCisjZGVmaW5lIFZUQkxfUFJFRklYX1AoTkFNRSkgXAorICAoKE5BTUUpWzBdID09ICdfJyBcCisgICAmJiAoKChOQU1FKVsxXSA9PSAnVicgJiYgKE5BTUUpWzJdID09ICdUJykgXAorICAgICAgIHx8ICgoTkFNRSlbMV0gPT0gJ3YnICYmIChOQU1FKVsyXSA9PSAndCcpKSBcCisgICAmJiBpc19jcGx1c19tYXJrZXIgKChOQU1FKVszXSkpCisKKy8qIE1hY3JvIHRoYXQgeWllbGRzIG5vbi16ZXJvIHZhbHVlIGlmZiBOQU1FIGlzIHRoZSBwcmVmaXggZm9yIEMrKyBkZXN0cnVjdG9yCisgICBuYW1lcy4gIE5vdGUgdGhhdCB0aGlzIG1hY3JvIGlzIGcrKyBzcGVjaWZpYyAoRklYTUUpLiAgKi8KKworI2RlZmluZSBERVNUUlVDVE9SX1BSRUZJWF9QKE5BTUUpIFwKKyAgKChOQU1FKVswXSA9PSAnXycgJiYgaXNfY3BsdXNfbWFya2VyICgoTkFNRSlbMV0pICYmIChOQU1FKVsyXSA9PSAnXycpCisKKwwKKy8qIEV4dGVybmFsIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGZvciB0aGUgb2JqZWN0cyBkZXNjcmliZWQgYWJvdmUuICovCisKKy8qIFRoaXMgc3ltdGFiIHZhcmlhYmxlIHNwZWNpZmllcyB0aGUgY3VycmVudCBmaWxlIGZvciBwcmludGluZyBzb3VyY2UgbGluZXMgKi8KKworZXh0ZXJuIHN0cnVjdCBzeW10YWIgKmN1cnJlbnRfc291cmNlX3N5bXRhYjsKKworLyogVGhpcyBpcyB0aGUgbmV4dCBsaW5lIHRvIHByaW50IGZvciBsaXN0aW5nIHNvdXJjZSBsaW5lcy4gICovCisKK2V4dGVybiBpbnQgY3VycmVudF9zb3VyY2VfbGluZTsKKworLyogU2VlIHRoZSBjb21tZW50IGluIHN5bWZpbGUuYyBhYm91dCBob3cgY3VycmVudF9vYmpmaWxlIGlzIHVzZWQuICovCisKK2V4dGVybiBzdHJ1Y3Qgb2JqZmlsZSAqY3VycmVudF9vYmpmaWxlOworCisvKiBUcnVlIGlmIHdlIGFyZSBuZXN0ZWQgaW5zaWRlIHBzeW10YWJfdG9fc3ltdGFiLiAqLworCitleHRlcm4gaW50IGN1cnJlbnRseV9yZWFkaW5nX3N5bXRhYjsKKworLyogRnJvbSB1dGlscy5jLiAgKi8KK2V4dGVybiBpbnQgZGVtYW5nbGU7CitleHRlcm4gaW50IGFzbV9kZW1hbmdsZTsKKworLyogc3ltdGFiLmMgbG9va3VwIGZ1bmN0aW9ucyAqLworCisvKiBsb29rdXAgYSBzeW1ib2wgdGFibGUgYnkgc291cmNlIGZpbGUgbmFtZSAqLworCitleHRlcm4gc3RydWN0IHN5bXRhYiAqCitsb29rdXBfc3ltdGFiIFBBUkFNUyAoKGNoYXIgKikpOworCisvKiBsb29rdXAgYSBzeW1ib2wgYnkgbmFtZSAob3B0aW9uYWwgYmxvY2ssIG9wdGlvbmFsIHN5bXRhYikgKi8KKworZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKgorbG9va3VwX3N5bWJvbCBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCBibG9jayAqLAorCQkgICAgICAgY29uc3QgbmFtZXNwYWNlX2VudW0sIGludCAqLCBzdHJ1Y3Qgc3ltdGFiICoqKSk7CisKKy8qIGxvb2t1cCBhIHN5bWJvbCBieSBuYW1lLCB3aXRoaW4gYSBzcGVjaWZpZWQgYmxvY2sgKi8KKyAgCitleHRlcm4gc3RydWN0IHN5bWJvbCAqCitsb29rdXBfYmxvY2tfc3ltYm9sIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBibG9jayAqLCBjb25zdCBjaGFyICosCisgCQkJICAgICBjb25zdCBuYW1lc3BhY2VfZW51bSkpOworCisvKiBsb29rdXAgYSBbc3RydWN0LCB1bmlvbiwgZW51bV0gYnkgbmFtZSwgd2l0aGluIGEgc3BlY2lmaWVkIGJsb2NrICovCisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqCitsb29rdXBfc3RydWN0IFBBUkFNUyAoKGNoYXIgKiwgc3RydWN0IGJsb2NrICopKTsKKworZXh0ZXJuIHN0cnVjdCB0eXBlICoKK2xvb2t1cF91bmlvbiBQQVJBTVMgKChjaGFyICosIHN0cnVjdCBibG9jayAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgdHlwZSAqCitsb29rdXBfZW51bSBQQVJBTVMgKChjaGFyICosIHN0cnVjdCBibG9jayAqKSk7CisKKy8qIGxvb2t1cCB0aGUgZnVuY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgYmxvY2sgKi8KKworZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKgorYmxvY2tfZnVuY3Rpb24gUEFSQU1TICgoc3RydWN0IGJsb2NrICopKTsKKworLyogZnJvbSBibG9ja2ZyYW1lLmM6ICovCisKKy8qIGxvb2t1cCB0aGUgZnVuY3Rpb24gc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFkZHJlc3MgKi8KKworZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKgorZmluZF9wY19mdW5jdGlvbiBQQVJBTVMgKChDT1JFX0FERFIpKTsKKworLyogbG9va3VwIHRoZSBmdW5jdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBhZGRyZXNzIGFuZCBzZWN0aW9uICovCisKK2V4dGVybiBzdHJ1Y3Qgc3ltYm9sICoKK2ZpbmRfcGNfc2VjdF9mdW5jdGlvbiBQQVJBTVMgKChDT1JFX0FERFIsIGFzZWN0aW9uICopKTsKKyAgCisvKiBsb29rdXAgZnVuY3Rpb24gZnJvbSBhZGRyZXNzLCByZXR1cm4gbmFtZSwgc3RhcnQgYWRkciBhbmQgZW5kIGFkZHIgKi8KKworZXh0ZXJuIGludCAKK2ZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiBQQVJBTVMgKChDT1JFX0FERFIsIGNoYXIgKiosCisJCQkJCSAgICAgQ09SRV9BRERSICosIENPUkVfQUREUiAqKSk7CisKK2V4dGVybiB2b2lkCitjbGVhcl9wY19mdW5jdGlvbl9jYWNoZSBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBpbnQgCitmaW5kX3BjX3NlY3RfcGFydGlhbF9mdW5jdGlvbiBQQVJBTVMgKChDT1JFX0FERFIsIGFzZWN0aW9uICosIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKiwgQ09SRV9BRERSICosIENPUkVfQUREUiAqKSk7CisKKy8qIGZyb20gc3ltdGFiLmM6ICovCisKKy8qIGxvb2t1cCBwYXJ0aWFsIHN5bWJvbCB0YWJsZSBieSBmaWxlbmFtZSAqLworCitleHRlcm4gc3RydWN0IHBhcnRpYWxfc3ltdGFiICoKK2xvb2t1cF9wYXJ0aWFsX3N5bXRhYiBQQVJBTVMgKChjaGFyICopKTsKKworLyogbG9va3VwIHBhcnRpYWwgc3ltYm9sIHRhYmxlIGJ5IGFkZHJlc3MgKi8KKworZXh0ZXJuIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqCitmaW5kX3BjX3BzeW10YWIgUEFSQU1TICgoQ09SRV9BRERSKSk7CisKKy8qIGxvb2t1cCBwYXJ0aWFsIHN5bWJvbCB0YWJsZSBieSBhZGRyZXNzIGFuZCBzZWN0aW9uICovCisKK2V4dGVybiBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKgorZmluZF9wY19zZWN0X3BzeW10YWIgUEFSQU1TICgoQ09SRV9BRERSLCBhc2VjdGlvbiAqKSk7CisKKy8qIGxvb2t1cCBmdWxsIHN5bWJvbCB0YWJsZSBieSBhZGRyZXNzICovCisKK2V4dGVybiBzdHJ1Y3Qgc3ltdGFiICoKK2ZpbmRfcGNfc3ltdGFiIFBBUkFNUyAoKENPUkVfQUREUikpOworCisvKiBsb29rdXAgZnVsbCBzeW1ib2wgdGFibGUgYnkgYWRkcmVzcyBhbmQgc2VjdGlvbiAqLworCitleHRlcm4gc3RydWN0IHN5bXRhYiAqCitmaW5kX3BjX3NlY3Rfc3ltdGFiIFBBUkFNUyAoKENPUkVfQUREUiwgYXNlY3Rpb24gKikpOworCisvKiBsb29rdXAgcGFydGlhbCBzeW1ib2wgYnkgYWRkcmVzcyAqLworCitleHRlcm4gc3RydWN0IHBhcnRpYWxfc3ltYm9sICoKK2ZpbmRfcGNfcHN5bWJvbCBQQVJBTVMgKChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKiwgQ09SRV9BRERSKSk7CisKKy8qIGxvb2t1cCBwYXJ0aWFsIHN5bWJvbCBieSBhZGRyZXNzIGFuZCBzZWN0aW9uICovCisKK2V4dGVybiBzdHJ1Y3QgcGFydGlhbF9zeW1ib2wgKgorZmluZF9wY19zZWN0X3BzeW1ib2wgUEFSQU1TICgoc3RydWN0IHBhcnRpYWxfc3ltdGFiICosIENPUkVfQUREUiwgYXNlY3Rpb24gKikpOworCitleHRlcm4gaW50CitmaW5kX3BjX2xpbmVfcGNfcmFuZ2UgUEFSQU1TICgoQ09SRV9BRERSLCBDT1JFX0FERFIgKiwgQ09SRV9BRERSICopKTsKKworZXh0ZXJuIGludAorY29udGFpbmVkX2luIFBBUkFNUyAoKHN0cnVjdCBibG9jayAqLCBzdHJ1Y3QgYmxvY2sgKikpOworCitleHRlcm4gdm9pZAorcmVyZWFkX3N5bWJvbHMgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gc3RydWN0IHR5cGUgKgorbG9va3VwX3RyYW5zcGFyZW50X3R5cGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CisKKworLyogTWFjcm8gZm9yIG5hbWUgb2Ygc3ltYm9sIHRvIGluZGljYXRlIGEgZmlsZSBjb21waWxlZCB3aXRoIGdjYy4gKi8KKyNpZm5kZWYgR0NDX0NPTVBJTEVEX0ZMQUdfU1lNQk9MCisjZGVmaW5lIEdDQ19DT01QSUxFRF9GTEFHX1NZTUJPTCAiZ2NjX2NvbXBpbGVkLiIKKyNlbmRpZgorCisvKiBNYWNybyBmb3IgbmFtZSBvZiBzeW1ib2wgdG8gaW5kaWNhdGUgYSBmaWxlIGNvbXBpbGVkIHdpdGggZ2NjMi4gKi8KKyNpZm5kZWYgR0NDMl9DT01QSUxFRF9GTEFHX1NZTUJPTAorI2RlZmluZSBHQ0MyX0NPTVBJTEVEX0ZMQUdfU1lNQk9MICJnY2MyX2NvbXBpbGVkLiIKKyNlbmRpZgorCisvKiBGdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGUsIHJlYWxseSBhIG1pc2MKKyAgIGFkZHJlc3M8LT5zeW1ib2wgbWFwcGluZyBmb3IgdGhpbmdzIHdlIGRvbid0IGhhdmUgZGVidWcgc3ltYm9scyBmb3IuICAqLworCitleHRlcm4gdm9pZCBwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbCBQQVJBTVMgKChjb25zdCBjaGFyICosIENPUkVfQUREUiwKKwkJCQkJCWVudW0gbWluaW1hbF9zeW1ib2xfdHlwZSwKKwkJCQkJCXN0cnVjdCBvYmpmaWxlICopKTsKKworZXh0ZXJuIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2xfYW5kX2luZm8KKyAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBDT1JFX0FERFIsCisJICAgZW51bSBtaW5pbWFsX3N5bWJvbF90eXBlLAorCSAgIGNoYXIgKmluZm8sIGludCBzZWN0aW9uLAorCSAgIGFzZWN0aW9uICpiZmRfc2VjdGlvbiwKKwkgICBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKKyNpZmRlZiBTT0ZVTl9BRERSRVNTX01BWUJFX01JU1NJTkcKK2V4dGVybiBDT1JFX0FERFIgZmluZF9zdGFiX2Z1bmN0aW9uX2FkZHIgUEFSQU1TICgoY2hhciAqLAorCQkJCQkJICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKiwKKwkJCQkJCSAgc3RydWN0IG9iamZpbGUgKikpOworI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKgorbG9va3VwX21pbmltYWxfc3ltYm9sIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKgorbG9va3VwX21pbmltYWxfc3ltYm9sX3RleHQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RydWN0IG1pbmltYWxfc3ltYm9sICoKK2xvb2t1cF9taW5pbWFsX3N5bWJvbF9zb2xpYl90cmFtcG9saW5lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwKKwkJCQkJCWNvbnN0IGNoYXIgKiwKKwkJCQkJCXN0cnVjdCBvYmpmaWxlICopKTsKKworZXh0ZXJuIHN0cnVjdCBtaW5pbWFsX3N5bWJvbCAqCitsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGMgUEFSQU1TICgoQ09SRV9BRERSKSk7CisKK2V4dGVybiBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKgorbG9va3VwX21pbmltYWxfc3ltYm9sX2J5X3BjX3NlY3Rpb24gUEFSQU1TICgoQ09SRV9BRERSLCBhc2VjdGlvbiAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKgorbG9va3VwX3NvbGliX3RyYW1wb2xpbmVfc3ltYm9sX2J5X3BjIFBBUkFNUyAoKENPUkVfQUREUikpOworCitleHRlcm4gQ09SRV9BRERSCitmaW5kX3NvbGliX3RyYW1wb2xpbmVfdGFyZ2V0IFBBUkFNUyAoKENPUkVfQUREUikpOworCitleHRlcm4gdm9pZAoraW5pdF9taW5pbWFsX3N5bWJvbF9jb2xsZWN0aW9uIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQKK2Rpc2NhcmRfbWluaW1hbF9zeW1ib2xzIFBBUkFNUyAoKGludCkpOworCitleHRlcm4gdm9pZAoraW5zdGFsbF9taW5pbWFsX3N5bWJvbHMgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKikpOworCisvKiBTb3J0IGFsbCB0aGUgbWluaW1hbCBzeW1ib2xzIGluIE9CSkZJTEUuICAqLworCitleHRlcm4gdm9pZCBtc3ltYm9sc19zb3J0IFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlKSk7CisKK3N0cnVjdCBzeW10YWJfYW5kX2xpbmUKK3sKKyAgc3RydWN0IHN5bXRhYiAqc3ltdGFiOworICBhc2VjdGlvbiAgICAgICpzZWN0aW9uOworICAvKiBMaW5lIG51bWJlci4gIExpbmUgbnVtYmVycyBzdGFydCBhdCAxIGFuZCBwcm9jZWVkIHRocm91Z2ggc3ltdGFiLT5ubGluZXMuCisgICAgIDAgaXMgbmV2ZXIgYSB2YWxpZCBsaW5lIG51bWJlcjsgaXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGxpbmUgbnVtYmVyCisgICAgIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuICAqLworICBpbnQgbGluZTsKKworICBDT1JFX0FERFIgcGM7CisgIENPUkVfQUREUiBlbmQ7Cit9OworCisjZGVmaW5lIElOSVRfU0FMKHNhbCkgeyBcCisgIChzYWwpLT5zeW10YWIgID0gMDsgICBcCisgIChzYWwpLT5zZWN0aW9uID0gMDsgICBcCisgIChzYWwpLT5saW5lICAgID0gMDsgICBcCisgIChzYWwpLT5wYyAgICAgID0gMDsgICBcCisgIChzYWwpLT5lbmQgICAgID0gMDsgICBcCit9CisKK3N0cnVjdCBzeW10YWJzX2FuZF9saW5lcworeworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lICpzYWxzOworICBpbnQgbmVsdHM7Cit9OworCisKKwwKKy8qIFNvbWUgdHlwZXMgYW5kIG1hY3JvcyBuZWVkZWQgZm9yIGV4Y2VwdGlvbiBjYXRjaHBvaW50cy4KKyAgIENhbid0IHB1dCB0aGVzZSBpbiB0YXJnZXQuaCBiZWNhdXNlIHN5bXRhYl9hbmRfbGluZSBpc24ndAorICAga25vd24gdGhlcmUuIFRoaXMgZmlsZSB3aWxsIGJlIGluY2x1ZGVkIGJ5IGJyZWFrcG9pbnQuYywKKyAgIGhwcGEtdGRlcC5jLCBldGMuICovCisKKy8qIEVudW1zIGZvciBleGNlcHRpb24taGFuZGxpbmcgc3VwcG9ydCAqLworZW51bSBleGNlcHRpb25fZXZlbnRfa2luZCB7CisgIEVYX0VWRU5UX1RIUk9XLAorICBFWF9FVkVOVF9DQVRDSAorfTsKKworLyogVHlwZSBmb3IgcmV0dXJuaW5nIGluZm8gYWJvdXQgYW4gZXhjZXB0aW9uICovCitzdHJ1Y3QgZXhjZXB0aW9uX2V2ZW50X3JlY29yZCB7CisgIGVudW0gZXhjZXB0aW9uX2V2ZW50X2tpbmQgICBraW5kOworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lICAgICAgdGhyb3dfc2FsOworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lICAgICAgY2F0Y2hfc2FsOworICAvKiBUaGlzIG1heSBuZWVkIHRvIGJlIGV4dGVuZGVkIGluIHRoZSBmdXR1cmUsIGlmCisgICAgIHNvbWUgcGxhdGZvcm1zIGFsbG93IHJlcG9ydGluZyBtb3JlIGluZm9ybWF0aW9uLAorICAgICBzdWNoIGFzIHBvaW50IG9mIHJldGhyb3csIHR5cGUgb2YgZXhjZXB0aW9uIG9iamVjdCwKKyAgICAgdHlwZSBleHBlY3RlZCBieSBjYXRjaCBjbGF1c2UsIGV0Yy4gKi8gCit9OworCisjZGVmaW5lIENVUlJFTlRfRVhDRVBUSU9OX0tJTkQgICAgICAgKGN1cnJlbnRfZXhjZXB0aW9uX2V2ZW50LT5raW5kKQorI2RlZmluZSBDVVJSRU5UX0VYQ0VQVElPTl9DQVRDSF9TQUwgIChjdXJyZW50X2V4Y2VwdGlvbl9ldmVudC0+Y2F0Y2hfc2FsKQorI2RlZmluZSBDVVJSRU5UX0VYQ0VQVElPTl9DQVRDSF9MSU5FIChjdXJyZW50X2V4Y2VwdGlvbl9ldmVudC0+Y2F0Y2hfc2FsLmxpbmUpCisjZGVmaW5lIENVUlJFTlRfRVhDRVBUSU9OX0NBVENIX0ZJTEUgKGN1cnJlbnRfZXhjZXB0aW9uX2V2ZW50LT5jYXRjaF9zYWwuc3ltdGFiLT5maWxlbmFtZSkKKyNkZWZpbmUgQ1VSUkVOVF9FWENFUFRJT05fQ0FUQ0hfUEMgICAoY3VycmVudF9leGNlcHRpb25fZXZlbnQtPmNhdGNoX3NhbC5wYykKKyNkZWZpbmUgQ1VSUkVOVF9FWENFUFRJT05fVEhST1dfU0FMICAoY3VycmVudF9leGNlcHRpb25fZXZlbnQtPnRocm93X3NhbCkKKyNkZWZpbmUgQ1VSUkVOVF9FWENFUFRJT05fVEhST1dfTElORSAoY3VycmVudF9leGNlcHRpb25fZXZlbnQtPnRocm93X3NhbC5saW5lKQorI2RlZmluZSBDVVJSRU5UX0VYQ0VQVElPTl9USFJPV19GSUxFIChjdXJyZW50X2V4Y2VwdGlvbl9ldmVudC0+dGhyb3dfc2FsLnN5bXRhYi0+ZmlsZW5hbWUpCisjZGVmaW5lIENVUlJFTlRfRVhDRVBUSU9OX1RIUk9XX1BDICAgKGN1cnJlbnRfZXhjZXB0aW9uX2V2ZW50LT50aHJvd19zYWwucGMpCisMCisKKy8qIEdpdmVuIGEgcGMgdmFsdWUsIHJldHVybiBsaW5lIG51bWJlciBpdCBpcyBpbi4gIFNlY29uZCBhcmcgbm9uemVybyBtZWFucworICAgaWYgcGMgaXMgb24gdGhlIGJvdW5kYXJ5IHVzZSB0aGUgcHJldmlvdXMgc3RhdGVtZW50J3MgbGluZSBudW1iZXIuICAqLworCitleHRlcm4gc3RydWN0IHN5bXRhYl9hbmRfbGluZQorZmluZF9wY19saW5lIFBBUkFNUyAoKENPUkVfQUREUiwgaW50KSk7CisKKy8qIFNhbWUgZnVuY3Rpb24sIGJ1dCBzcGVjaWZ5IGEgc2VjdGlvbiBhcyB3ZWxsIGFzIGFuIGFkZHJlc3MgKi8KKworZXh0ZXJuIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUKK2ZpbmRfcGNfc2VjdF9saW5lIFBBUkFNUyAoKENPUkVfQUREUiwgYXNlY3Rpb24gKiwgaW50KSk7CisKKy8qIEdpdmVuIGFuIGFkZHJlc3MsIHJldHVybiB0aGUgbmVhcmVzdCBzeW1ib2wgYXQgb3IgYmVsb3cgaXQgaW4gbWVtb3J5LgorICAgT3B0aW9uYWxseSByZXR1cm4gdGhlIHN5bXRhYiBpdCdzIGZyb20gdGhyb3VnaCAybmQgYXJnLCBhbmQgdGhlCisgICBhZGRyZXNzIGluIGluZmVyaW9yIG1lbW9yeSBvZiB0aGUgc3ltYm9sIHRocm91Z2ggM3JkIGFyZy4gICovCisKK2V4dGVybiBzdHJ1Y3Qgc3ltYm9sICoKK2ZpbmRfYWRkcl9zeW1ib2wgUEFSQU1TICgoQ09SRV9BRERSLCBzdHJ1Y3Qgc3ltdGFiICoqLCBDT1JFX0FERFIgKikpOworCisvKiBHaXZlbiBhIHN5bXRhYiBhbmQgbGluZSBudW1iZXIsIHJldHVybiB0aGUgcGMgdGhlcmUuICAqLworCitleHRlcm4gaW50CitmaW5kX2xpbmVfcGMgUEFSQU1TICgoc3RydWN0IHN5bXRhYiAqLCBpbnQsIENPUkVfQUREUiAqKSk7CisKK2V4dGVybiBpbnQgCitmaW5kX2xpbmVfcGNfcmFuZ2UgUEFSQU1TICgoc3RydWN0IHN5bXRhYl9hbmRfbGluZSwKKwkJCSAgICBDT1JFX0FERFIgKiwgQ09SRV9BRERSICopKTsKKworZXh0ZXJuIHZvaWQKK3Jlc29sdmVfc2FsX3BjIFBBUkFNUyAoKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgKikpOworCisvKiBHaXZlbiBhIHN0cmluZywgcmV0dXJuIHRoZSBsaW5lIHNwZWNpZmllZCBieSBpdC4gIEZvciBjb21tYW5kcyBsaWtlICJsaXN0IgorICAgYW5kICJicmVha3BvaW50Ii4gICovCisKK2V4dGVybiBzdHJ1Y3Qgc3ltdGFic19hbmRfbGluZXMKK2RlY29kZV9saW5lX3NwZWMgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworZXh0ZXJuIHN0cnVjdCBzeW10YWJzX2FuZF9saW5lcworZGVjb2RlX2xpbmVfc3BlY18xIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK2V4dGVybiBzdHJ1Y3Qgc3ltdGFic19hbmRfbGluZXMKK2RlY29kZV9saW5lXzEgUEFSQU1TICgoY2hhciAqKiwgaW50LCBzdHJ1Y3Qgc3ltdGFiICosIGludCwgY2hhciAqKiopKTsKKworI2lmIE1BSU5URU5BTkNFX0NNRFMKKworLyogU3ltbWlzYy5jICovCisKK3ZvaWQKK21haW50ZW5hbmNlX3ByaW50X3N5bWJvbHMgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKwordm9pZAorbWFpbnRlbmFuY2VfcHJpbnRfcHN5bWJvbHMgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKwordm9pZAorbWFpbnRlbmFuY2VfcHJpbnRfbXN5bWJvbHMgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKwordm9pZAorbWFpbnRlbmFuY2VfcHJpbnRfb2JqZmlsZXMgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKwordm9pZAorbWFpbnRlbmFuY2VfY2hlY2tfc3ltdGFicyBQQVJBTVMgKChjaGFyICosIGludCkpOworCisvKiBtYWludC5jICovCisKK3ZvaWQKK21haW50ZW5hbmNlX3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworI2VuZGlmCisKK2V4dGVybiB2b2lkCitmcmVlX3N5bXRhYiBQQVJBTVMgKChzdHJ1Y3Qgc3ltdGFiICopKTsKKworLyogU3ltYm9sLXJlYWRpbmcgc3R1ZmYgaW4gc3ltZmlsZS5jIGFuZCBzb2xpYi5jLiAgKi8KKworZXh0ZXJuIHN0cnVjdCBzeW10YWIgKgorcHN5bXRhYl90b19zeW10YWIgUEFSQU1TICgoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKKworZXh0ZXJuIHZvaWQKK2NsZWFyX3NvbGliIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHN0cnVjdCBvYmpmaWxlICoKK3N5bWJvbF9maWxlX2FkZCBQQVJBTVMgKChjaGFyICosIGludCwgQ09SRV9BRERSLCBpbnQsIGludCwgaW50LCBpbnQsIGludCkpOworCisvKiBzb3VyY2UuYyAqLworCitleHRlcm4gaW50CitpZGVudGlmeV9zb3VyY2VfbGluZSBQQVJBTVMgKChzdHJ1Y3Qgc3ltdGFiICosIGludCwgaW50LCBDT1JFX0FERFIpKTsKKworZXh0ZXJuIHZvaWQKK3ByaW50X3NvdXJjZV9saW5lcyBQQVJBTVMgKChzdHJ1Y3Qgc3ltdGFiICosIGludCwgaW50LCBpbnQpKTsKKworZXh0ZXJuIHZvaWQKK2ZvcmdldF9jYWNoZWRfc291cmNlX2luZm8gUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZAorc2VsZWN0X3NvdXJjZV9zeW10YWIgUEFSQU1TICgoc3RydWN0IHN5bXRhYiAqKSk7CisKK2V4dGVybiBjaGFyICoqbWFrZV9zeW1ib2xfY29tcGxldGlvbl9saXN0IFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKSk7CisKK2V4dGVybiBzdHJ1Y3Qgc3ltYm9sICoqCittYWtlX3N5bWJvbF9vdmVybG9hZF9saXN0IFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOworCisvKiBzeW10YWIuYyAqLworCitleHRlcm4gc3RydWN0IHBhcnRpYWxfc3ltdGFiICoKK2ZpbmRfbWFpbl9wc3ltdGFiIFBBUkFNUyAoKHZvaWQpKTsKKworLyogYmxvY2tmcmFtZS5jICovCisKK2V4dGVybiBzdHJ1Y3QgYmxvY2t2ZWN0b3IgKgorYmxvY2t2ZWN0b3JfZm9yX3BjIFBBUkFNUyAoKENPUkVfQUREUiwgaW50ICopKTsKKworZXh0ZXJuIHN0cnVjdCBibG9ja3ZlY3RvciAqCitibG9ja3ZlY3Rvcl9mb3JfcGNfc2VjdCBQQVJBTVMgKChDT1JFX0FERFIsIGFzZWN0aW9uICosIGludCAqLCAKKwkJCQkgc3RydWN0IHN5bXRhYiAqKSk7CisKKy8qIHN5bWZpbGUuYyAqLworCitleHRlcm4gdm9pZAorY2xlYXJfc3ltdGFiX3VzZXJzIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIGVudW0gbGFuZ3VhZ2UKK2RlZHVjZV9sYW5ndWFnZV9mcm9tX2ZpbGVuYW1lIFBBUkFNUyAoKGNoYXIgKikpOworCisvKiBzeW10YWIuYyAqLworCitleHRlcm4gaW50Citpbl9wcm9sb2d1ZSBQQVJBTVMgKChDT1JFX0FERFIgcGMsIENPUkVfQUREUiBmdW5jX3N0YXJ0KSk7CisKK2V4dGVybiBzdHJ1Y3Qgc3ltYm9sICoKK2ZpeHVwX3N5bWJvbF9zZWN0aW9uIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworLyogU3ltYm9sIHNlYXJjaGluZyAqLworCisvKiBXaGVuIHVzaW5nIHNlYXJjaF9zeW1ib2xzLCBhIGxpc3Qgb2YgdGhlIGZvbGxvd2luZyBzdHJ1Y3RzIGlzIHJldHVybmVkLgorICAgQ2FsbGVycyBtdXN0IGZyZWUgdGhlIHNlYXJjaCBsaXN0IHVzaW5nIGZyZWVfc3ltYm9sX3NlYXJjaCEgKi8KK3N0cnVjdCBzeW1ib2xfc2VhcmNoCit7CisgIC8qIFRoZSBibG9jayBpbiB3aGljaCB0aGUgbWF0Y2ggd2FzIGZvdW5kLiBDb3VsZCBiZSwgZm9yIGV4YW1wbGUsCisgICAgIFNUQVRJQ19CTE9DSyBvciBHTE9CQUxfQkxPQ0suICovCisgIGludCBibG9jazsKKworICAvKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIHdoYXQgd2FzIGZvdW5kLgorCisgICAgIElmIHN5bXRhYiBhYmQgc3ltYm9sIGFyZSBOT1QgTlVMTCwgdGhlbiBpbmZvcm1hdGlvbiB3YXMgZm91bmQKKyAgICAgZm9yIHRoaXMgbWF0Y2guICovCisgIHN0cnVjdCBzeW10YWIgKnN5bXRhYjsKKyAgc3RydWN0IHN5bWJvbCAqc3ltYm9sOworCisgIC8qIElmIG1zeW1ib2wgaXMgbm9uLW51bGwsIHRoZW4gYSBtYXRjaCB3YXMgbWFkZSBvbiBzb21ldGhpbmcgZm9yCisgICAgIHdoaWNoIG9ubHkgbWluaW1hbF9zeW1ib2xzIGV4aXN0LiAqLworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisKKyAgLyogQSBsaW5rIHRvIHRoZSBuZXh0IG1hdGNoLCBvciBOVUxMIGZvciB0aGUgZW5kLiAqLworICBzdHJ1Y3Qgc3ltYm9sX3NlYXJjaCAqbmV4dDsKK307CisKK2V4dGVybiB2b2lkIHNlYXJjaF9zeW1ib2xzIFBBUkFNUyAoKGNoYXIgKiwgbmFtZXNwYWNlX2VudW0sIGludCwgY2hhciAqKiwgc3RydWN0IHN5bWJvbF9zZWFyY2ggKiopKTsKK2V4dGVybiB2b2lkIGZyZWVfc2VhcmNoX3N5bWJvbHMgUEFSQU1TICgoc3RydWN0IHN5bWJvbF9zZWFyY2ggKikpOworCisjZW5kaWYgLyogIWRlZmluZWQoU1lNVEFCX0gpICovCmRpZmYgLS1naXQgYS9nZGIvdGFob2UtdGRlcC5jIGIvZ2RiL3RhaG9lLXRkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYThhNzUyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3RhaG9lLXRkZXAuYwpAQCAtMCwwICsxLDIzNCBAQAorLyogUHJpbnQgaW5zdHJ1Y3Rpb25zIGZvciBUYWhvZSB0YXJnZXQgbWFjaGluZXMsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4OSwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBTdGF0ZSBVbml2ZXJzaXR5IG9mIE5ldyBZb3JrIGF0IEJ1ZmZhbG8sIGJ5IHRoZQorICAgRGlzdHJpYnV0ZWQgQ29tcHV0ZXIgU3lzdGVtcyBMYWIsIERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZSwgMTk5MS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgIm9wY29kZS90YWhvZS5oIgorCisvKiBUYWhvZSBpbnN0cnVjdGlvbnMgYXJlIG5ldmVyIGxvbmdlciB0aGFuIHRoaXMuICAqLworI2RlZmluZSBNQVhMRU4gNjIKKworLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLworI2RlZmluZSBOT1BDT0RFUyAoc2l6ZW9mIHZvdHN0cnMgLyBzaXplb2Ygdm90c3Ryc1swXSkKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnByaW50X2luc25fYXJnICgpOworCisvKiBQcmludCB0aGUgVGFob2UgaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyBNRU1BRERSIGluIGRlYnVnZ2VkIG1lbW9yeSwKKyAgIG9uIFNUUkVBTS4gIFJldHVybnMgbGVuZ3RoIG9mIHRoZSBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMuICAqLworCitpbnQKK3RhaG9lX3ByaW50X2luc24gKG1lbWFkZHIsIHN0cmVhbSkKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIEdEQl9GSUxFICpzdHJlYW07Cit7CisgIHVuc2lnbmVkIGNoYXIgYnVmZmVyW01BWExFTl07CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwOworICByZWdpc3RlciBjaGFyICpkOworCisgIHJlYWRfbWVtb3J5IChtZW1hZGRyLCBidWZmZXIsIE1BWExFTik7CisKKyAgZm9yIChpID0gMDsgaSA8IE5PUENPREVTOyBpKyspCisgICAgaWYgKHZvdHN0cnNbaV0uZGV0YWlsLmNvZGUgPT0gYnVmZmVyWzBdCisJfHwgdm90c3Ryc1tpXS5kZXRhaWwuY29kZSA9PSAqKHVuc2lnbmVkIHNob3J0ICopYnVmZmVyKQorICAgICAgYnJlYWs7CisKKyAgLyogSGFuZGxlIHVuZGVmaW5lZCBpbnN0cnVjdGlvbnMuICAqLworICBpZiAoaSA9PSBOT1BDT0RFUykKKyAgICB7CisgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwgIjAlbyIsIGJ1ZmZlclswXSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChzdHJlYW0sICIlcyIsIHZvdHN0cnNbaV0ubmFtZSk7CisKKyAgLyogUG9pbnQgYXQgZmlyc3QgYnl0ZSBvZiBhcmd1bWVudCBkYXRhLAorICAgICBhbmQgYXQgZGVzY3JpcHRvciBmb3IgZmlyc3QgYXJndW1lbnQuICAqLworICBwID0gYnVmZmVyICsgMSArICh2b3RzdHJzW2ldLmRldGFpbC5jb2RlID49IDB4MTAwKTsKKyAgZCA9IHZvdHN0cnNbaV0uZGV0YWlsLmFyZ3M7CisKKyAgaWYgKCpkKQorICAgIGZwdXRjX3VuZmlsdGVyZWQgKCdcdCcsIHN0cmVhbSk7CisKKyAgd2hpbGUgKCpkKQorICAgIHsKKyAgICAgIHAgPSBwcmludF9pbnNuX2FyZyAoZCwgcCwgbWVtYWRkciArIChwIC0gYnVmZmVyKSwgc3RyZWFtKTsKKyAgICAgIGQgKz0gMjsKKyAgICAgIGlmICgqZCkKKwlmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwgIiwiKTsKKyAgICB9CisgIHJldHVybiBwIC0gYnVmZmVyOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCitwcmludF9pbnNuX2FyZyAoZCwgcCwgYWRkciwgc3RyZWFtKQorICAgICBjaGFyICpkOworICAgICByZWdpc3RlciBjaGFyICpwOworICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgaW50IHRlbXAxID0gMDsKKyAgcmVnaXN0ZXIgaW50IHJlZ251bSA9ICpwICYgMHhmOworICBmbG9hdCBmbG9hdGxpdGJ1ZjsKKworICBpZiAoKmQgPT0gJ2InKQorICAgIHsKKyAgICAgIGlmIChkWzFdID09ICdiJykKKwlmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwgIjB4JXgiLCBhZGRyICsgKnArKyArIDEpOworICAgICAgZWxzZQorCXsKKworCSAgdGVtcDEgPSAqcDsKKwkgIHRlbXAxIDw8PSA4OworCSAgdGVtcDEgfD0gKihwICsgMSk7CisJICBmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwgIjB4JXgiLCBhZGRyICsgdGVtcDEgKyAyKTsKKwkgIHAgKz0gMjsKKwl9CisgICAgfQorICBlbHNlCisgICAgc3dpdGNoICgoKnArKyA+PiA0KSAmIDB4ZikKKyAgICAgIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgIGNhc2UgMToKKyAgICAgIGNhc2UgMjoKKyAgICAgIGNhc2UgMzoJCQkvKiBMaXRlcmFsIChzaG9ydCBpbW1lZGlhdGUgYnl0ZSkgbW9kZSAqLworCWlmIChkWzFdID09ICdkJyB8fCBkWzFdID09ICdmJyB8fCBkWzFdID09ICdnJyB8fCBkWzFdID09ICdoJykKKwkgIHsKKwkgICAgKihpbnQgKikmZmxvYXRsaXRidWYgPSAweDQwMDAgKyAoKHBbLTFdICYgMHgzZikgPDwgNCk7CisJICAgIGZwcmludGZfdW5maWx0ZXJlZCAoc3RyZWFtLCAiJCVmIiwgZmxvYXRsaXRidWYpOworCSAgfQorCWVsc2UKKwkgIGZwcmludGZfdW5maWx0ZXJlZCAoc3RyZWFtLCAiJCVkIiwgcFstMV0gJiAweDNmKTsKKwlicmVhazsKKworICAgICAgY2FzZSA0OgkJCS8qIEluZGV4ZWQgKi8KKwlwID0gKGNoYXIgKikgcHJpbnRfaW5zbl9hcmcgKGQsIHAsIGFkZHIgKyAxLCBzdHJlYW0pOworCWZwcmludGZfdW5maWx0ZXJlZCAoc3RyZWFtLCAiWyVzXSIsIFJFR0lTVEVSX05BTUUgKHJlZ251bSkpOworCWJyZWFrOworCisgICAgICBjYXNlIDU6CQkJLyogUmVnaXN0ZXIgKi8KKwlmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwgUkVHSVNURVJfTkFNRSAocmVnbnVtKSk7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgNzoJCQkvKiBBdXRvZGVjcmVtZW50ICovCisJZnB1dGNfdW5maWx0ZXJlZCAoJy0nLCBzdHJlYW0pOworICAgICAgY2FzZSA2OgkJCS8qIFJlZ2lzdGVyIGRlZmVycmVkICovCisJZnByaW50Zl91bmZpbHRlcmVkIChzdHJlYW0sICIoJXMpIiwgUkVHSVNURVJfTkFNRSAocmVnbnVtKSk7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgOToJICAgICAgICAgICAgICAgIC8qIEFic29sdXRlIEFkZHJlc3MgJiBBdXRvaW5jcmVtZW50IGRlZmVycmVkICovCisJZnB1dGNfdW5maWx0ZXJlZCAoJyonLCBzdHJlYW0pOworCWlmIChyZWdudW0gPT0gUENfUkVHTlVNKQorCSAgeworCSAgICB0ZW1wMSA9ICpwOworCSAgICB0ZW1wMSA8PD0gODsKKwkgICAgdGVtcDEgfD0gKihwICsxKTsKKworCSAgICBmcHV0Y191bmZpbHRlcmVkICgnJCcsIHN0cmVhbSk7CisJICAgIHByaW50X2FkZHJlc3MgKHRlbXAxLCBzdHJlYW0pOworCSAgICBwICs9IDQ7CisJICAgIGJyZWFrOworCSAgfQorICAgICAgY2FzZSA4OgkJCS8qSW1tZWRpYXRlICYgQXV0b2luY3JlbWVudCBTUCAqLworICAgICAgICBpZiAocmVnbnVtID09IDgpICAgICAgICAgLyo4OCBpcyBJbW1lZGlhdGUgQnl0ZSBNb2RlKi8KKwkgIGZwcmludGZfdW5maWx0ZXJlZCAoc3RyZWFtLCAiJCVkIiwgKnArKyk7CisKKwllbHNlIGlmIChyZWdudW0gPT0gOSkgICAgICAgIC8qODkgaXMgSW1tZWRpYXRlIFdvcmQgTW9kZSovCisJICB7CisJICAgIHRlbXAxID0gKnA7CisJICAgIHRlbXAxIDw8PSA4OyAKKwkgICAgdGVtcDEgfD0gKihwICsxKTsKKwkgICAgZnByaW50Zl91bmZpbHRlcmVkIChzdHJlYW0sICIkJWQiLCB0ZW1wMSk7CisJICAgIHAgKz0gMjsKKwkgIH0gIAorCisJZWxzZSBpZiAocmVnbnVtID09IFBDX1JFR05VTSkgICAgLyo4RiBpcyBJbW1lZGlhdGUgTG9uZyBNb2RlKi8KKwkgIHsKKwkgICAgdGVtcDEgPSAqcDsKKwkgICAgdGVtcDEgPDw9ODsKKwkgICAgdGVtcDEgfD0gKihwICsxKTsKKwkgICAgdGVtcDEgPDw9ODsKKwkgICAgdGVtcDEgfD0gKihwICsyKTsKKwkgICAgdGVtcDEgPDw9IDg7CisJICAgIHRlbXAxIHw9ICoocCArMyk7CisJICAgIGZwcmludGZfdW5maWx0ZXJlZCAoc3RyZWFtLCAiJCVkIiwgdGVtcDEpOworCSAgICBwICs9IDQ7CisJICB9CisKKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qOEUgaXMgQXV0b2luY3JlbWVudCBTUCBNb2RlKi8KKwkgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwgIiglcykrIiwgUkVHSVNURVJfTkFNRSAocmVnbnVtKSk7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgMTE6CQkJLyogUmVnaXN0ZXIgKyBCeXRlIERpc3BsYWNlbWVudCBEZWZlcnJlZCBNb2RlKi8KKwlmcHV0Y191bmZpbHRlcmVkICgnKicsIHN0cmVhbSk7CisgICAgICBjYXNlIDEwOgkJCS8qIFJlZ2lzdGVyICsgQnl0ZSBEaXNwbGFjZW1lbnQgTW9kZSovCisJaWYgKHJlZ251bSA9PSBQQ19SRUdOVU0pCisJICBwcmludF9hZGRyZXNzIChhZGRyICsgKnAgKyAyLCBzdHJlYW0pOworCWVsc2UKKwkgIGZwcmludGZfdW5maWx0ZXJlZCAoc3RyZWFtLCAiJWQoJXMpIiwgKnAsIFJFR0lTVEVSX05BTUUgKHJlZ251bSkpOworCXAgKz0gMTsKKwlicmVhazsKKworICAgICAgY2FzZSAxMzoJCQkvKiBSZWdpc3RlciArIFdvcmQgRGlzcGxhY2VtZW50IERlZmVycmVkIE1vZGUqLworCWZwdXRjX3VuZmlsdGVyZWQgKCcqJywgc3RyZWFtKTsKKyAgICAgIGNhc2UgMTI6CQkJLyogUmVnaXN0ZXIgKyBXb3JkIERpc3BsYWNlbWVudCBNb2RlKi8KKwl0ZW1wMSA9ICpwOworCXRlbXAxIDw8PSA4OworCXRlbXAxIHw9ICoocCArMSk7CisJaWYgKHJlZ251bSA9PSBQQ19SRUdOVU0pCisJICBwcmludF9hZGRyZXNzIChhZGRyICsgdGVtcDEgKyAzLCBzdHJlYW0pOworCWVsc2UKKwkgIGZwcmludGZfdW5maWx0ZXJlZCAoc3RyZWFtLCAiJWQoJXMpIiwgdGVtcDEsIFJFR0lTVEVSX05BTUUgKHJlZ251bSkpOworCXAgKz0gMjsKKwlicmVhazsKKworICAgICAgY2FzZSAxNToJCQkvKiBSZWdpc3RlciArIExvbmcgRGlzcGxhY2VtZW50IERlZmVycmVkIE1vZGUqLworCWZwdXRjX3VuZmlsdGVyZWQgKCcqJywgc3RyZWFtKTsKKyAgICAgIGNhc2UgMTQ6CQkJLyogUmVnaXN0ZXIgKyBMb25nIERpc3BsYWNlbWVudCBNb2RlKi8KKwl0ZW1wMSA9ICpwOworCXRlbXAxIDw8PSA4OworCXRlbXAxIHw9ICoocCArMSk7CisJdGVtcDEgPDw9IDg7CisJdGVtcDEgfD0gKihwICsyKTsKKwl0ZW1wMSA8PD0gODsKKwl0ZW1wMSB8PSAqKHAgKzMpOworCWlmIChyZWdudW0gPT0gUENfUkVHTlVNKQorCSAgcHJpbnRfYWRkcmVzcyAoYWRkciArIHRlbXAxICsgNSwgc3RyZWFtKTsKKwllbHNlCisJICBmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwgIiVkKCVzKSIsIHRlbXAxLCBSRUdJU1RFUl9OQU1FIChyZWdudW0pKTsKKwlwICs9IDQ7CisgICAgICB9CisKKyAgcmV0dXJuICh1bnNpZ25lZCBjaGFyICopIHA7Cit9CisKKworCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL2dkYi90YXJnZXQuYyBiL2dkYi90YXJnZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDhlYjhmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3RhcmdldC5jCkBAIC0wLDAgKzEsMjU4MSBAQAorLyogU2VsZWN0IHRhcmdldCBzeXN0ZW1zIGFuZCBhcmNoaXRlY3R1cmVzIGF0IHJ1bnRpbWUgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAxOTkwLCAxOTkyLTE5OTUsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJ3YWl0LmgiCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK2V4dGVybiBpbnQgZXJybm87CisKK3N0YXRpYyB2b2lkCit0YXJnZXRfaW5mbyBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZAorY2xlYW51cF90YXJnZXQgUEFSQU1TICgoc3RydWN0IHRhcmdldF9vcHMgKikpOworCitzdGF0aWMgdm9pZAorbWF5YmVfa2lsbF90aGVuX2NyZWF0ZV9pbmZlcmlvciBQQVJBTVMgKChjaGFyICosIGNoYXIgKiwgY2hhciAqKikpOworCitzdGF0aWMgdm9pZAorZGVmYXVsdF9jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yIFBBUkFNUyAoKGludCwgaW50ICopKTsKKworc3RhdGljIHZvaWQKK21heWJlX2tpbGxfdGhlbl9hdHRhY2ggUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2tpbGxfb3JfYmVfa2lsbGVkIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgdm9pZAorZGVmYXVsdF90ZXJtaW5hbF9pbmZvIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyBpbnQKK25vc3ltYm9sIFBBUkFNUyAoKGNoYXIgKiwgQ09SRV9BRERSICopKTsKKworc3RhdGljIHZvaWQKK3Rjb21wbGFpbiBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyBpbnQKK25vbWVtb3J5IFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqLCBpbnQsIGludCwgc3RydWN0IHRhcmdldF9vcHMgKikpOworCitzdGF0aWMgaW50CityZXR1cm5femVybyBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyBpbnQKK3JldHVybl9vbmUgUEFSQU1TICgodm9pZCkpOworCit2b2lkCit0YXJnZXRfaWdub3JlIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQKK3RhcmdldF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyBzdHJ1Y3QgdGFyZ2V0X29wcyAqCitmaW5kX2RlZmF1bHRfcnVuX3RhcmdldCBQQVJBTVMgKChjaGFyICopKTsKKworc3RhdGljIHZvaWQKK3VwZGF0ZV9jdXJyZW50X3RhcmdldCBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIFRyYW5zZmVyIExFTiBieXRlcyBiZXR3ZWVuIHRhcmdldCBhZGRyZXNzIE1FTUFERFIgYW5kIEdEQiBhZGRyZXNzIE1ZQUREUi4KKyAgIFJldHVybnMgMCBmb3Igc3VjY2VzcywgZXJybm8gY29kZSBmb3IgZmFpbHVyZSAod2hpY2ggaW5jbHVkZXMgcGFydGlhbAorICAgdHJhbnNmZXJzLS1pZiB5b3Ugd2FudCBhIG1vcmUgdXNlZnVsIHJlc3BvbnNlIHRvIHBhcnRpYWwgdHJhbnNmZXJzLCB0cnkKKyAgIHRhcmdldF9yZWFkX21lbW9yeV9wYXJ0aWFsKS4gICovCisKK3N0YXRpYyBpbnQKK3RhcmdldF94ZmVyX21lbW9yeSBQQVJBTVMgKChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLCBpbnQgbGVuLAorCQkJICAgIGludCB3cml0ZSwgYXNlY3Rpb24gKmJmZF9zZWN0aW9uKSk7CisKK3N0YXRpYyB2b2lkIGluaXRfZHVtbXlfdGFyZ2V0IFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQKK2RlYnVnX3RvX29wZW4gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2RlYnVnX3RvX2Nsb3NlIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgdm9pZAorZGVidWdfdG9fYXR0YWNoIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b19kZXRhY2ggUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2RlYnVnX3RvX3Jlc3VtZSBQQVJBTVMgKChpbnQsIGludCwgZW51bSB0YXJnZXRfc2lnbmFsKSk7CisKK3N0YXRpYyBpbnQKK2RlYnVnX3RvX3dhaXQgUEFSQU1TICgoaW50LCBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKikpOworCitzdGF0aWMgdm9pZAorZGVidWdfdG9fZmV0Y2hfcmVnaXN0ZXJzIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgdm9pZAorZGVidWdfdG9fc3RvcmVfcmVnaXN0ZXJzIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgdm9pZAorZGVidWdfdG9fcHJlcGFyZV90b19zdG9yZSBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyBpbnQKK2RlYnVnX3RvX3hmZXJfbWVtb3J5IFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqLCBpbnQsIGludCwgc3RydWN0IHRhcmdldF9vcHMgKikpOworCitzdGF0aWMgdm9pZAorZGVidWdfdG9fZmlsZXNfaW5mbyBQQVJBTVMgKChzdHJ1Y3QgdGFyZ2V0X29wcyAqKSk7CisKK3N0YXRpYyBpbnQKK2RlYnVnX3RvX2luc2VydF9icmVha3BvaW50IFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqKSk7CisKK3N0YXRpYyBpbnQKK2RlYnVnX3RvX3JlbW92ZV9icmVha3BvaW50IFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqKSk7CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b190ZXJtaW5hbF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQKK2RlYnVnX3RvX3Rlcm1pbmFsX2luZmVyaW9yIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQKK2RlYnVnX3RvX3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b190ZXJtaW5hbF9vdXJzIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQKK2RlYnVnX3RvX3Rlcm1pbmFsX2luZm8gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK2RlYnVnX3RvX2tpbGwgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZAorZGVidWdfdG9fbG9hZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgaW50CitkZWJ1Z190b19sb29rdXBfc3ltYm9sIFBBUkFNUyAoKGNoYXIgKiwgQ09SRV9BRERSICopKTsKKworc3RhdGljIHZvaWQKK2RlYnVnX3RvX2NyZWF0ZV9pbmZlcmlvciBQQVJBTVMgKChjaGFyICosIGNoYXIgKiwgY2hhciAqKikpOworCitzdGF0aWMgdm9pZAorZGVidWdfdG9fbW91cm5faW5mZXJpb3IgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgaW50CitkZWJ1Z190b19jYW5fcnVuIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQKK2RlYnVnX3RvX25vdGljZV9zaWduYWxzIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgaW50CitkZWJ1Z190b190aHJlYWRfYWxpdmUgUEFSQU1TICgoaW50KSk7CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b19zdG9wIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIGludCBkZWJ1Z190b19xdWVyeSBQQVJBTVMgKChpbnQvKmNoYXIqLywgY2hhciAqLCBjaGFyICosIGludCAqKSk7CisKKy8qIFBvaW50ZXIgdG8gYXJyYXkgb2YgdGFyZ2V0IGFyY2hpdGVjdHVyZSBzdHJ1Y3R1cmVzOyB0aGUgc2l6ZSBvZiB0aGUKKyAgIGFycmF5OyB0aGUgY3VycmVudCBpbmRleCBpbnRvIHRoZSBhcnJheTsgdGhlIGFsbG9jYXRlZCBzaXplIG9mIHRoZSAKKyAgIGFycmF5LiAgKi8KK3N0cnVjdCB0YXJnZXRfb3BzICoqdGFyZ2V0X3N0cnVjdHM7Cit1bnNpZ25lZCB0YXJnZXRfc3RydWN0X3NpemU7Cit1bnNpZ25lZCB0YXJnZXRfc3RydWN0X2luZGV4OwordW5zaWduZWQgdGFyZ2V0X3N0cnVjdF9hbGxvY3NpemU7CisjZGVmaW5lCURFRkFVTFRfQUxMT0NTSVpFCTEwCisKKy8qIFRoZSBpbml0aWFsIGN1cnJlbnQgdGFyZ2V0LCBzbyB0aGF0IHRoZXJlIGlzIGFsd2F5cyBhIHNlbWktdmFsaWQKKyAgIGN1cnJlbnQgdGFyZ2V0LiAgKi8KKworc3RhdGljIHN0cnVjdCB0YXJnZXRfb3BzIGR1bW15X3RhcmdldDsKKworLyogVG9wIG9mIHRhcmdldCBzdGFjay4gICovCisKK3N0cnVjdCB0YXJnZXRfc3RhY2tfaXRlbSAqdGFyZ2V0X3N0YWNrOworCisvKiBUaGUgdGFyZ2V0IHN0cnVjdHVyZSB3ZSBhcmUgY3VycmVudGx5IHVzaW5nIHRvIHRhbGsgdG8gYSBwcm9jZXNzCisgICBvciBmaWxlIG9yIHdoYXRldmVyICJpbmZlcmlvciIgd2UgaGF2ZS4gICovCisKK3N0cnVjdCB0YXJnZXRfb3BzIGN1cnJlbnRfdGFyZ2V0OworCisvKiBDb21tYW5kIGxpc3QgZm9yIHRhcmdldC4gICovCisKK3N0YXRpYyBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqdGFyZ2V0bGlzdCA9IE5VTEw7CisKKy8qIE5vbnplcm8gaWYgd2UgYXJlIGRlYnVnZ2luZyBhbiBhdHRhY2hlZCBvdXRzaWRlIHByb2Nlc3MKKyAgIHJhdGhlciB0aGFuIGFuIGluZmVyaW9yLiAgKi8KKworaW50IGF0dGFjaF9mbGFnOworCisjaWZkZWYgTUFJTlRFTkFOQ0VfQ01EUworLyogTm9uLXplcm8gaWYgd2Ugd2FudCB0byBzZWUgdHJhY2Ugb2YgdGFyZ2V0IGxldmVsIHN0dWZmLiAgKi8KKworc3RhdGljIGludCB0YXJnZXRkZWJ1ZyA9IDA7CisKK3N0YXRpYyB2b2lkIHNldHVwX3RhcmdldF9kZWJ1ZyBQQVJBTVMgKCh2b2lkKSk7CisKKyNlbmRpZgorCisvKiBUaGUgdXNlciBqdXN0IHR5cGVkICd0YXJnZXQnIHdpdGhvdXQgdGhlIG5hbWUgb2YgYSB0YXJnZXQuICAqLworCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3RhcmdldF9jb21tYW5kIChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZnB1dHNfZmlsdGVyZWQgKCJBcmd1bWVudCByZXF1aXJlZCAodGFyZ2V0IG5hbWUpLiAgVHJ5IGBoZWxwIHRhcmdldCdcbiIsCisJCSAgZ2RiX3N0ZG91dCk7Cit9CisKKy8qIEFkZCBhIHBvc3NpYmxlIHRhcmdldCBhcmNoaXRlY3R1cmUgdG8gdGhlIGxpc3QuICAqLworCit2b2lkCithZGRfdGFyZ2V0ICh0KQorICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdDsKK3sKKyAgaWYgKCF0YXJnZXRfc3RydWN0cykKKyAgICB7CisgICAgICB0YXJnZXRfc3RydWN0X2FsbG9jc2l6ZSA9IERFRkFVTFRfQUxMT0NTSVpFOworICAgICAgdGFyZ2V0X3N0cnVjdHMgPSAoc3RydWN0IHRhcmdldF9vcHMgKiopIHhtYWxsb2MKKwkodGFyZ2V0X3N0cnVjdF9hbGxvY3NpemUgKiBzaXplb2YgKCp0YXJnZXRfc3RydWN0cykpOworICAgIH0KKyAgaWYgKHRhcmdldF9zdHJ1Y3Rfc2l6ZSA+PSB0YXJnZXRfc3RydWN0X2FsbG9jc2l6ZSkKKyAgICB7CisgICAgICB0YXJnZXRfc3RydWN0X2FsbG9jc2l6ZSAqPSAyOworICAgICAgdGFyZ2V0X3N0cnVjdHMgPSAoc3RydWN0IHRhcmdldF9vcHMgKiopCisJICB4cmVhbGxvYyAoKGNoYXIgKikgdGFyZ2V0X3N0cnVjdHMsIAorCQkgICAgdGFyZ2V0X3N0cnVjdF9hbGxvY3NpemUgKiBzaXplb2YgKCp0YXJnZXRfc3RydWN0cykpOworICAgIH0KKyAgdGFyZ2V0X3N0cnVjdHNbdGFyZ2V0X3N0cnVjdF9zaXplKytdID0gdDsKKy8qICBjbGVhbnVwX3RhcmdldCAodCk7Ki8KKworICBpZiAodGFyZ2V0bGlzdCA9PSBOVUxMKQorICAgIGFkZF9wcmVmaXhfY21kICgidGFyZ2V0IiwgY2xhc3NfcnVuLCB0YXJnZXRfY29tbWFuZCwKKwkJICAgICJDb25uZWN0IHRvIGEgdGFyZ2V0IG1hY2hpbmUgb3IgcHJvY2Vzcy5cblwKK1RoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvciBwcm90b2NvbCBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuXG5cCitSZW1haW5pbmcgYXJndW1lbnRzIGFyZSBpbnRlcnByZXRlZCBieSB0aGUgdGFyZ2V0IHByb3RvY29sLiAgRm9yIG1vcmVcblwKK2luZm9ybWF0aW9uIG9uIHRoZSBhcmd1bWVudHMgZm9yIGEgcGFydGljdWxhciBwcm90b2NvbCwgdHlwZVxuXAorYGhlbHAgdGFyZ2V0ICcgZm9sbG93ZWQgYnkgdGhlIHByb3RvY29sIG5hbWUuIiwKKwkJICAgICZ0YXJnZXRsaXN0LCAidGFyZ2V0ICIsIDAsICZjbWRsaXN0KTsKKyAgYWRkX2NtZCAodC0+dG9fc2hvcnRuYW1lLCBub19jbGFzcywgdC0+dG9fb3BlbiwgdC0+dG9fZG9jLCAmdGFyZ2V0bGlzdCk7Cit9CisKKy8qIFN0dWIgZnVuY3Rpb25zICovCisKK3ZvaWQKK3RhcmdldF9pZ25vcmUgKCkKK3sKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyBpbnQKK25vbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbiwgd3JpdGUsIHQpCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47CisgICAgIGludCB3cml0ZTsKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKnQ7Cit7CisgIGVycm5vID0gRUlPOwkJLyogQ2FuJ3QgcmVhZC93cml0ZSB0aGlzIGxvY2F0aW9uICovCisgIHJldHVybiAwOwkJLyogTm8gYnl0ZXMgaGFuZGxlZCAqLworfQorCitzdGF0aWMgdm9pZAordGNvbXBsYWluICgpCit7CisgIGVycm9yICgiWW91IGNhbid0IGRvIHRoYXQgd2hlbiB5b3VyIHRhcmdldCBpcyBgJXMnIiwKKwkgY3VycmVudF90YXJnZXQudG9fc2hvcnRuYW1lKTsKK30KKwordm9pZAorbm9wcm9jZXNzICgpCit7CisgIGVycm9yICgiWW91IGNhbid0IGRvIHRoYXQgd2l0aG91dCBhIHByb2Nlc3MgdG8gZGVidWcuIik7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgaW50Citub3N5bWJvbCAobmFtZSwgYWRkcnApCisgICAgIGNoYXIgKm5hbWU7CisgICAgIENPUkVfQUREUiAqYWRkcnA7Cit7CisgIHJldHVybiAxOwkJLyogU3ltYm9sIGRvZXMgbm90IGV4aXN0IGluIHRhcmdldCBlbnYgKi8KK30KKworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK25vc3VwcG9ydF9ydW50aW1lICgpCit7CisgIGlmICghaW5mZXJpb3JfcGlkKQorICAgIG5vcHJvY2VzcyAoKTsKKyAgZWxzZQorICAgIGVycm9yICgiTm8gcnVuLXRpbWUgc3VwcG9ydCBmb3IgdGhpcyIpOworfQorCisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorZGVmYXVsdF90ZXJtaW5hbF9pbmZvIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBwcmludGZfdW5maWx0ZXJlZCgiTm8gc2F2ZWQgdGVybWluYWwgaW5mb3JtYXRpb24uXG4iKTsKK30KKworLyogVGhpcyBpcyB0aGUgZGVmYXVsdCB0YXJnZXRfY3JlYXRlX2luZmVyaW9yIGFuZCB0YXJnZXRfYXR0YWNoIGZ1bmN0aW9uLgorICAgSWYgdGhlIGN1cnJlbnQgdGFyZ2V0IGlzIGV4ZWN1dGluZywgaXQgYXNrcyB3aGV0aGVyIHRvIGtpbGwgaXQgb2ZmLgorICAgSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHdpdGhvdXQgY2FsbGluZyBlcnJvcigpLCBpdCBoYXMga2lsbGVkIG9mZgorICAgdGhlIHRhcmdldCwgYW5kIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIGF0dGVtcHRlZC4gICovCisKK3N0YXRpYyB2b2lkCitraWxsX29yX2JlX2tpbGxlZCAoZnJvbV90dHkpCisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaWYgKHRhcmdldF9oYXNfZXhlY3V0aW9uKQorICAgIHsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiWW91IGFyZSBhbHJlYWR5IHJ1bm5pbmcgYSBwcm9ncmFtOlxuIik7CisgICAgICB0YXJnZXRfZmlsZXNfaW5mbyAoKTsKKyAgICAgIGlmIChxdWVyeSAoIktpbGwgaXQ/ICIpKSB7CisJdGFyZ2V0X2tpbGwgKCk7CisJaWYgKHRhcmdldF9oYXNfZXhlY3V0aW9uKQorCSAgZXJyb3IgKCJLaWxsaW5nIHRoZSBwcm9ncmFtIGRpZCBub3QgaGVscC4iKTsKKwlyZXR1cm47CisgICAgICB9IGVsc2UgeworCWVycm9yICgiUHJvZ3JhbSBub3Qga2lsbGVkLiIpOworICAgICAgfQorICAgIH0KKyAgdGNvbXBsYWluKCk7Cit9CisKK3N0YXRpYyB2b2lkCittYXliZV9raWxsX3RoZW5fYXR0YWNoIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBraWxsX29yX2JlX2tpbGxlZCAoZnJvbV90dHkpOworICB0YXJnZXRfYXR0YWNoIChhcmdzLCBmcm9tX3R0eSk7Cit9CisKK3N0YXRpYyB2b2lkCittYXliZV9raWxsX3RoZW5fY3JlYXRlX2luZmVyaW9yIChleGVjLCBhcmdzLCBlbnYpCisgICAgIGNoYXIgKmV4ZWM7CisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGtpbGxfb3JfYmVfa2lsbGVkICgwKTsKKyAgdGFyZ2V0X2NyZWF0ZV9pbmZlcmlvciAoZXhlYywgYXJncywgZW52KTsKK30KKworc3RhdGljIHZvaWQKK2RlZmF1bHRfY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciAoY2hpbGRfcGlkLCBmb2xsb3dlZF9jaGlsZCkKKyAgaW50ICBjaGlsZF9waWQ7CisgIGludCAgKmZvbGxvd2VkX2NoaWxkOworeworICB0YXJnZXRfY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciAoY2hpbGRfcGlkLCBmb2xsb3dlZF9jaGlsZCk7Cit9CisKKy8qIENsZWFuIHVwIGEgdGFyZ2V0IHN0cnVjdCBzbyBpdCBubyBsb25nZXIgaGFzIGFueSB6ZXJvIHBvaW50ZXJzIGluIGl0LgorICAgV2UgZGVmYXVsdCBlbnRyaWVzLCBhdCBsZWFzdCB0byBzdHVicyB0aGF0IHByaW50IGVycm9yIG1lc3NhZ2VzLiAgKi8KKworc3RhdGljIHZvaWQKK2NsZWFudXBfdGFyZ2V0ICh0KQorICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdDsKK3sKKworI2RlZmluZSBkZV9mYXVsdChmaWVsZCwgdmFsdWUpIFwKKyAgaWYgKCF0LT5maWVsZCkJdC0+ZmllbGQgPSB2YWx1ZQorCisgIC8qICAgICAgICBGSUVMRAkJCURFRkFVTFQgVkFMVUUgICAgICAgICovCisKKyAgZGVfZmF1bHQgKHRvX29wZW4sIAkJCSh2b2lkICgqKSBQQVJBTVMoKGNoYXIgKiwgaW50KSkpIHRjb21wbGFpbik7CisgIGRlX2ZhdWx0ICh0b19jbG9zZSwgCQkJKHZvaWQgKCopIFBBUkFNUygoaW50KSkpIHRhcmdldF9pZ25vcmUpOworICBkZV9mYXVsdCAodG9fYXR0YWNoLCAJCQltYXliZV9raWxsX3RoZW5fYXR0YWNoKTsKKyAgZGVfZmF1bHQgKHRvX3Bvc3RfYXR0YWNoLCAgICAgICAgICAgICAodm9pZCAoKikgUEFSQU1TICgoaW50KSkpIHRhcmdldF9pZ25vcmUpOworICBkZV9mYXVsdCAodG9fcmVxdWlyZV9hdHRhY2gsICAgICAgICAgIG1heWJlX2tpbGxfdGhlbl9hdHRhY2gpOworICBkZV9mYXVsdCAodG9fZGV0YWNoLCAJCQkodm9pZCAoKikgUEFSQU1TKChjaGFyICosIGludCkpKSB0YXJnZXRfaWdub3JlKTsKKyAgZGVfZmF1bHQgKHRvX3JlcXVpcmVfZGV0YWNoLCAgICAgICAgICAodm9pZCAoKikgUEFSQU1TKChpbnQsIGNoYXIgKiwgaW50KSkpIHRhcmdldF9pZ25vcmUpOworICBkZV9mYXVsdCAodG9fcmVzdW1lLCAJCQkodm9pZCAoKikgUEFSQU1TKChpbnQsIGludCwgZW51bSB0YXJnZXRfc2lnbmFsKSkpIG5vcHJvY2Vzcyk7CisgIGRlX2ZhdWx0ICh0b193YWl0LCAJCQkoaW50ICgqKSBQQVJBTVMoKGludCwgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICopKSkgbm9wcm9jZXNzKTsKKyAgZGVfZmF1bHQgKHRvX3Bvc3Rfd2FpdCwgICAgICAgICAgICAgICAodm9pZCAoKikgUEFSQU1TICgoaW50LCBpbnQpKSkgdGFyZ2V0X2lnbm9yZSk7CisgIGRlX2ZhdWx0ICh0b19mZXRjaF9yZWdpc3RlcnMsIAkodm9pZCAoKikgUEFSQU1TKChpbnQpKSkgdGFyZ2V0X2lnbm9yZSk7CisgIGRlX2ZhdWx0ICh0b19zdG9yZV9yZWdpc3RlcnMsCQkodm9pZCAoKikgUEFSQU1TKChpbnQpKSkgbm9wcm9jZXNzKTsKKyAgZGVfZmF1bHQgKHRvX3ByZXBhcmVfdG9fc3RvcmUsCSh2b2lkICgqKSBQQVJBTVMoKHZvaWQpKSkgbm9wcm9jZXNzKTsKKyAgZGVfZmF1bHQgKHRvX3hmZXJfbWVtb3J5LAkJKGludCAoKikgUEFSQU1TKChDT1JFX0FERFIsIGNoYXIgKiwgaW50LCBpbnQsIHN0cnVjdCB0YXJnZXRfb3BzICopKSkgbm9tZW1vcnkpOworICBkZV9mYXVsdCAodG9fZmlsZXNfaW5mbywJCSh2b2lkICgqKSBQQVJBTVMoKHN0cnVjdCB0YXJnZXRfb3BzICopKSkgdGFyZ2V0X2lnbm9yZSk7CisgIGRlX2ZhdWx0ICh0b19pbnNlcnRfYnJlYWtwb2ludCwJbWVtb3J5X2luc2VydF9icmVha3BvaW50KTsKKyAgZGVfZmF1bHQgKHRvX3JlbW92ZV9icmVha3BvaW50LAltZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQpOworICBkZV9mYXVsdCAodG9fdGVybWluYWxfaW5pdCwJCSh2b2lkICgqKSBQQVJBTVMoKHZvaWQpKSkgdGFyZ2V0X2lnbm9yZSk7CisgIGRlX2ZhdWx0ICh0b190ZXJtaW5hbF9pbmZlcmlvciwJKHZvaWQgKCopIFBBUkFNUyAoKHZvaWQpKSkgdGFyZ2V0X2lnbm9yZSk7CisgIGRlX2ZhdWx0ICh0b190ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQsKHZvaWQgKCopIFBBUkFNUyAoKHZvaWQpKSkgdGFyZ2V0X2lnbm9yZSk7CisgIGRlX2ZhdWx0ICh0b190ZXJtaW5hbF9vdXJzLAkJKHZvaWQgKCopIFBBUkFNUyAoKHZvaWQpKSkgdGFyZ2V0X2lnbm9yZSk7CisgIGRlX2ZhdWx0ICh0b190ZXJtaW5hbF9pbmZvLAkJZGVmYXVsdF90ZXJtaW5hbF9pbmZvKTsKKyAgZGVfZmF1bHQgKHRvX2tpbGwsCQkJKHZvaWQgKCopIFBBUkFNUygodm9pZCkpKSBub3Byb2Nlc3MpOworICBkZV9mYXVsdCAodG9fbG9hZCwJCQkodm9pZCAoKikgUEFSQU1TKChjaGFyICosIGludCkpKSB0Y29tcGxhaW4pOworICBkZV9mYXVsdCAodG9fbG9va3VwX3N5bWJvbCwJCShpbnQgKCopIFBBUkFNUyAoKGNoYXIgKiwgQ09SRV9BRERSICopKSkgbm9zeW1ib2wpOworICBkZV9mYXVsdCAodG9fY3JlYXRlX2luZmVyaW9yLAkJbWF5YmVfa2lsbF90aGVuX2NyZWF0ZV9pbmZlcmlvcik7CisgIGRlX2ZhdWx0ICh0b19wb3N0X3N0YXJ0dXBfaW5mZXJpb3IsICAgKHZvaWQgKCopIFBBUkFNUyAoKGludCkpKSB0YXJnZXRfaWdub3JlKTsKKyAgZGVfZmF1bHQgKHRvX2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IsICAgICAgICAgICAgKHZvaWQgKCopIFBBUkFNUygoaW50KSkpIHRhcmdldF9pZ25vcmUpOworICBkZV9mYXVsdCAodG9fY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciwgICAgICAgICAgICAgICBkZWZhdWx0X2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IpOworICBkZV9mYXVsdCAodG9fcG9zdF9mb2xsb3dfaW5mZXJpb3JfYnlfY2xvbmUsICAgICAgICAgICAodm9pZCAoKikgUEFSQU1TICgodm9pZCkpKSB0YXJnZXRfaWdub3JlKTsKKyAgZGVfZmF1bHQgKHRvX2luc2VydF9mb3JrX2NhdGNocG9pbnQsICAoaW50ICgqKSBQQVJBTVMgKChpbnQpKSkgdGNvbXBsYWluKTsKKyAgZGVfZmF1bHQgKHRvX3JlbW92ZV9mb3JrX2NhdGNocG9pbnQsICAoaW50ICgqKSBQQVJBTVMgKChpbnQpKSkgdGNvbXBsYWluKTsKKyAgZGVfZmF1bHQgKHRvX2luc2VydF92Zm9ya19jYXRjaHBvaW50LCAoaW50ICgqKSBQQVJBTVMgKChpbnQpKSkgdGNvbXBsYWluKTsKKyAgZGVfZmF1bHQgKHRvX3JlbW92ZV92Zm9ya19jYXRjaHBvaW50LCAoaW50ICgqKSBQQVJBTVMgKChpbnQpKSkgdGNvbXBsYWluKTsKKyAgZGVfZmF1bHQgKHRvX2hhc19mb3JrZWQsICAgICAgICAgICAgICAoaW50ICgqKSBQQVJBTVMgKChpbnQsIGludCAqKSkpIHJldHVybl96ZXJvKTsKKyAgZGVfZmF1bHQgKHRvX2hhc192Zm9ya2VkLCAgICAgICAgICAgICAoaW50ICgqKSBQQVJBTVMgKChpbnQsIGludCAqKSkpIHJldHVybl96ZXJvKTsKKyAgZGVfZmF1bHQgKHRvX2Nhbl9mb2xsb3dfdmZvcmtfcHJpb3JfdG9fZXhlYywgKGludCAoKikgUEFSQU1TICgodm9pZCApKSkgcmV0dXJuX3plcm8pOworICBkZV9mYXVsdCAodG9fcG9zdF9mb2xsb3dfdmZvcmssICAgICAgICh2b2lkICgqKSBQQVJBTVMgKChpbnQsIGludCwgaW50LCBpbnQpKSkgdGFyZ2V0X2lnbm9yZSk7CisgIGRlX2ZhdWx0ICh0b19pbnNlcnRfZXhlY19jYXRjaHBvaW50LCAgKGludCAoKikgUEFSQU1TICgoaW50KSkpIHRjb21wbGFpbik7CisgIGRlX2ZhdWx0ICh0b19yZW1vdmVfZXhlY19jYXRjaHBvaW50LCAgKGludCAoKikgUEFSQU1TICgoaW50KSkpIHRjb21wbGFpbik7CisgIGRlX2ZhdWx0ICh0b19oYXNfZXhlY2QsICAgICAgICAgICAgICAgKGludCAoKikgUEFSQU1TICgoaW50LCBjaGFyICoqKSkpIHJldHVybl96ZXJvKTsKKyAgZGVfZmF1bHQgKHRvX3JlcG9ydGVkX2V4ZWNfZXZlbnRzX3Blcl9leGVjX2NhbGwsIChpbnQgKCopIFBBUkFNUyAoKHZvaWQpKSkgcmV0dXJuX29uZSk7CisgIGRlX2ZhdWx0ICh0b19oYXNfc3lzY2FsbF9ldmVudCwgICAgICAgKGludCAoKikgUEFSQU1TICgoaW50LCBlbnVtIHRhcmdldF93YWl0a2luZCAqLCBpbnQgKikpKSByZXR1cm5femVybyk7CisgIGRlX2ZhdWx0ICh0b19oYXNfZXhpdGVkLCAgICAgICAgICAgICAgKGludCAoKikgUEFSQU1TICgoaW50LCBpbnQsIGludCAqKSkpIHJldHVybl96ZXJvKTsKKyAgZGVfZmF1bHQgKHRvX21vdXJuX2luZmVyaW9yLAkJKHZvaWQgKCopIFBBUkFNUyAoKHZvaWQpKSkgbm9wcm9jZXNzKTsKKyAgZGVfZmF1bHQgKHRvX2Nhbl9ydW4sCQkJcmV0dXJuX3plcm8pOworICBkZV9mYXVsdCAodG9fbm90aWNlX3NpZ25hbHMsCQkodm9pZCAoKikgUEFSQU1TKChpbnQpKSkgdGFyZ2V0X2lnbm9yZSk7CisgIGRlX2ZhdWx0ICh0b190aHJlYWRfYWxpdmUsCQkoaW50ICgqKSBQQVJBTVMoKGludCkpKSB0YXJnZXRfaWdub3JlKTsKKyAgZGVfZmF1bHQgKHRvX3N0b3AsCQkJKHZvaWQgKCopIFBBUkFNUygodm9pZCkpKSB0YXJnZXRfaWdub3JlKTsKKyAgZGVfZmF1bHQgKHRvX3F1ZXJ5LAkJCShpbnQgKCopIFBBUkFNUygoaW50LypjaGFyKi8sIGNoYXIqLCBjaGFyICosIGludCAqKSkpIHRhcmdldF9pZ25vcmUpOworICBkZV9mYXVsdCAodG9fZW5hYmxlX2V4Y2VwdGlvbl9jYWxsYmFjaywJKHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgKiAoKikgUEFSQU1TKChlbnVtIGV4Y2VwdGlvbl9ldmVudF9raW5kLCBpbnQpKSkgbm9zdXBwb3J0X3J1bnRpbWUpOworICBkZV9mYXVsdCAodG9fZ2V0X2N1cnJlbnRfZXhjZXB0aW9uX2V2ZW50LAkoc3RydWN0IGV4Y2VwdGlvbl9ldmVudF9yZWNvcmQgKiAoKikgUEFSQU1TKCh2b2lkKSkpIG5vc3VwcG9ydF9ydW50aW1lKTsKKworICBkZV9mYXVsdCAodG9fcGlkX3RvX2V4ZWNfZmlsZSwgICAgICAgIChjaGFyKiAoKikgUEFSQU1TKChpbnQpKSkgcmV0dXJuX3plcm8pOworICBkZV9mYXVsdCAodG9fY29yZV9maWxlX3RvX3N5bV9maWxlLCAgIChjaGFyKiAoKikgUEFSQU1TICgoY2hhciAqKSkpIHJldHVybl96ZXJvKTsKKyN1bmRlZiBkZV9mYXVsdAorfQorCisvKiBHbyB0aHJvdWdoIHRoZSB0YXJnZXQgc3RhY2sgZnJvbSB0b3AgdG8gYm90dG9tLCBjb3B5aW5nIG92ZXIgemVybyBlbnRyaWVzIGluCisgICBjdXJyZW50X3RhcmdldC4gIEluIGVmZmVjdCwgd2UgYXJlIGRvaW5nIGNsYXNzIGluaGVyaXRhbmNlIHRocm91Z2ggdGhlCisgICBwdXNoZWQgdGFyZ2V0IHZlY3RvcnMuICAqLworCitzdGF0aWMgdm9pZAordXBkYXRlX2N1cnJlbnRfdGFyZ2V0ICgpCit7CisgIHN0cnVjdCB0YXJnZXRfc3RhY2tfaXRlbSAqaXRlbTsKKyAgc3RydWN0IHRhcmdldF9vcHMgKnQ7CisKKyAgLyogRmlyc3QsIHJlc2V0IGN1cnJlbnRfdGFyZ2V0ICovCisgIG1lbXNldCAoJmN1cnJlbnRfdGFyZ2V0LCAwLCBzaXplb2YgY3VycmVudF90YXJnZXQpOworCisgIGZvciAoaXRlbSA9IHRhcmdldF9zdGFjazsgaXRlbTsgaXRlbSA9IGl0ZW0tPm5leHQpCisgICAgeworICAgICAgdCA9IGl0ZW0tPnRhcmdldF9vcHM7CisKKyNkZWZpbmUgSU5IRVJJVChGSUVMRCwgVEFSR0VUKSBcCisgICAgICBpZiAoIWN1cnJlbnRfdGFyZ2V0LkZJRUxEKSBcCisJY3VycmVudF90YXJnZXQuRklFTEQgPSBUQVJHRVQtPkZJRUxECisKKyAgICAgIElOSEVSSVQgKHRvX3Nob3J0bmFtZSwgdCk7CisgICAgICBJTkhFUklUICh0b19sb25nbmFtZSwgdCk7CisgICAgICBJTkhFUklUICh0b19kb2MsIHQpOworICAgICAgSU5IRVJJVCAodG9fb3BlbiwgdCk7CisgICAgICBJTkhFUklUICh0b19jbG9zZSwgdCk7CisgICAgICBJTkhFUklUICh0b19hdHRhY2gsIHQpOworICAgICAgSU5IRVJJVCAodG9fcG9zdF9hdHRhY2gsIHQpOworICAgICAgSU5IRVJJVCAodG9fcmVxdWlyZV9hdHRhY2gsIHQpOworICAgICAgSU5IRVJJVCAodG9fZGV0YWNoLCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX3JlcXVpcmVfZGV0YWNoLCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX3Jlc3VtZSwgdCk7CisgICAgICBJTkhFUklUICh0b193YWl0LCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX3Bvc3Rfd2FpdCwgdCk7CisgICAgICBJTkhFUklUICh0b19mZXRjaF9yZWdpc3RlcnMsIHQpOworICAgICAgSU5IRVJJVCAodG9fc3RvcmVfcmVnaXN0ZXJzLCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX3ByZXBhcmVfdG9fc3RvcmUsIHQpOworICAgICAgSU5IRVJJVCAodG9feGZlcl9tZW1vcnksIHQpOworICAgICAgSU5IRVJJVCAodG9fZmlsZXNfaW5mbywgdCk7CisgICAgICBJTkhFUklUICh0b19pbnNlcnRfYnJlYWtwb2ludCwgdCk7CisgICAgICBJTkhFUklUICh0b19yZW1vdmVfYnJlYWtwb2ludCwgdCk7CisgICAgICBJTkhFUklUICh0b190ZXJtaW5hbF9pbml0LCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX3Rlcm1pbmFsX2luZmVyaW9yLCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCwgdCk7CisgICAgICBJTkhFUklUICh0b190ZXJtaW5hbF9vdXJzLCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX3Rlcm1pbmFsX2luZm8sIHQpOworICAgICAgSU5IRVJJVCAodG9fa2lsbCwgdCk7CisgICAgICBJTkhFUklUICh0b19sb2FkLCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX2xvb2t1cF9zeW1ib2wsIHQpOworICAgICAgSU5IRVJJVCAodG9fY3JlYXRlX2luZmVyaW9yLCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX3Bvc3Rfc3RhcnR1cF9pbmZlcmlvciwgdCk7CisgICAgICBJTkhFUklUICh0b19hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yLCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IsIHQpOworICAgICAgSU5IRVJJVCAodG9fcG9zdF9mb2xsb3dfaW5mZXJpb3JfYnlfY2xvbmUsIHQpOworICAgICAgSU5IRVJJVCAodG9faW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCwgdCk7CisgICAgICBJTkhFUklUICh0b19yZW1vdmVfZm9ya19jYXRjaHBvaW50LCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX2luc2VydF92Zm9ya19jYXRjaHBvaW50LCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX3JlbW92ZV92Zm9ya19jYXRjaHBvaW50LCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX2hhc19mb3JrZWQsIHQpOworICAgICAgSU5IRVJJVCAodG9faGFzX3Zmb3JrZWQsIHQpOworICAgICAgSU5IRVJJVCAodG9fY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjLCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX3Bvc3RfZm9sbG93X3Zmb3JrLCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX2luc2VydF9leGVjX2NhdGNocG9pbnQsIHQpOworICAgICAgSU5IRVJJVCAodG9fcmVtb3ZlX2V4ZWNfY2F0Y2hwb2ludCwgdCk7CisgICAgICBJTkhFUklUICh0b19oYXNfZXhlY2QsIHQpOworICAgICAgSU5IRVJJVCAodG9fcmVwb3J0ZWRfZXhlY19ldmVudHNfcGVyX2V4ZWNfY2FsbCwgdCk7CisgICAgICBJTkhFUklUICh0b19oYXNfc3lzY2FsbF9ldmVudCwgdCk7CisgICAgICBJTkhFUklUICh0b19oYXNfZXhpdGVkLCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX21vdXJuX2luZmVyaW9yLCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX2Nhbl9ydW4sIHQpOworICAgICAgSU5IRVJJVCAodG9fbm90aWNlX3NpZ25hbHMsIHQpOworICAgICAgSU5IRVJJVCAodG9fdGhyZWFkX2FsaXZlLCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX3N0b3AsIHQpOworICAgICAgSU5IRVJJVCAodG9fcXVlcnksIHQpOworICAgICAgSU5IRVJJVCAodG9fZW5hYmxlX2V4Y2VwdGlvbl9jYWxsYmFjaywgdCk7CisgICAgICBJTkhFUklUICh0b19nZXRfY3VycmVudF9leGNlcHRpb25fZXZlbnQsIHQpOworICAgICAgSU5IRVJJVCAodG9fcGlkX3RvX2V4ZWNfZmlsZSwgdCk7CisgICAgICBJTkhFUklUICh0b19jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUsIHQpOworICAgICAgSU5IRVJJVCAodG9fc3RyYXR1bSwgdCk7CisgICAgICBJTkhFUklUIChET05UX1VTRSwgdCk7CisgICAgICBJTkhFUklUICh0b19oYXNfYWxsX21lbW9yeSwgdCk7CisgICAgICBJTkhFUklUICh0b19oYXNfbWVtb3J5LCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX2hhc19zdGFjaywgdCk7CisgICAgICBJTkhFUklUICh0b19oYXNfcmVnaXN0ZXJzLCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX2hhc19leGVjdXRpb24sIHQpOworICAgICAgSU5IRVJJVCAodG9faGFzX3RocmVhZF9jb250cm9sLCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX3NlY3Rpb25zLCB0KTsKKyAgICAgIElOSEVSSVQgKHRvX3NlY3Rpb25zX2VuZCwgdCk7CisgICAgICBJTkhFUklUICh0b19tYWdpYywgdCk7CisKKyN1bmRlZiBJTkhFUklUCisgICAgfQorfQorCisvKiBQdXNoIGEgbmV3IHRhcmdldCB0eXBlIGludG8gdGhlIHN0YWNrIG9mIHRoZSBleGlzdGluZyB0YXJnZXQgYWNjZXNzb3JzLAorICAgcG9zc2libHkgc3VwZXJzZWRpbmcgc29tZSBvZiB0aGUgZXhpc3RpbmcgYWNjZXNzb3JzLgorCisgICBSZXN1bHQgaXMgemVybyBpZiB0aGUgcHVzaGVkIHRhcmdldCBlbmRlZCB1cCBvbiB0b3Agb2YgdGhlIHN0YWNrLAorICAgbm9uemVybyBpZiBhdCBsZWFzdCBvbmUgdGFyZ2V0IGlzIG9uIHRvcCBvZiBpdC4KKworICAgUmF0aGVyIHRoYW4gYWxsb3cgYW4gZW1wdHkgc3RhY2ssIHdlIGFsd2F5cyBoYXZlIHRoZSBkdW1teSB0YXJnZXQgYXQKKyAgIHRoZSBib3R0b20gc3RyYXR1bSwgc28gd2UgY2FuIGNhbGwgdGhlIGZ1bmN0aW9uIHZlY3RvcnMgd2l0aG91dAorICAgY2hlY2tpbmcgdGhlbS4gICovCisKK2ludAorcHVzaF90YXJnZXQgKHQpCisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0OworeworICBzdHJ1Y3QgdGFyZ2V0X3N0YWNrX2l0ZW0gKmN1ciwgKnByZXYsICp0bXA7CisKKyAgLyogQ2hlY2sgbWFnaWMgbnVtYmVyLiAgSWYgd3JvbmcsIGl0IHByb2JhYmx5IG1lYW5zIHNvbWVvbmUgY2hhbmdlZAorICAgICB0aGUgc3RydWN0IGRlZmluaXRpb24sIGJ1dCBub3QgYWxsIHRoZSBwbGFjZXMgdGhhdCBpbml0aWFsaXplIG9uZS4gICovCisgIGlmICh0LT50b19tYWdpYyAhPSBPUFNfTUFHSUMpCisgICAgeworICAgICAgZnByaW50Zl91bmZpbHRlcmVkKGdkYl9zdGRlcnIsCisJCQkgIk1hZ2ljIG51bWJlciBvZiAlcyB0YXJnZXQgc3RydWN0IHdyb25nXG4iLCAKKwkJCSB0LT50b19zaG9ydG5hbWUpOworICAgICAgYWJvcnQoKTsKKyAgICB9CisKKyAgLyogRmluZCB0aGUgcHJvcGVyIHN0cmF0dW0gdG8gaW5zdGFsbCB0aGlzIHRhcmdldCBpbi4gKi8KKworICBmb3IgKHByZXYgPSBOVUxMLCBjdXIgPSB0YXJnZXRfc3RhY2s7IGN1cjsgcHJldiA9IGN1ciwgY3VyID0gY3VyLT5uZXh0KQorICAgIHsKKyAgICAgIGlmICgoaW50KSh0LT50b19zdHJhdHVtKSA+PSAoaW50KShjdXItPnRhcmdldF9vcHMtPnRvX3N0cmF0dW0pKQorCWJyZWFrOworICAgIH0KKworICAvKiBJZiB0aGVyZSdzIGFscmVhZHkgdGFyZ2V0cyBhdCB0aGlzIHN0cmF0dW0sIHJlbW92ZSB0aGVtLiAqLworCisgIGlmIChjdXIpCisgICAgd2hpbGUgKHQtPnRvX3N0cmF0dW0gPT0gY3VyLT50YXJnZXRfb3BzLT50b19zdHJhdHVtKQorICAgICAgeworCS8qIFRoZXJlJ3MgYWxyZWFkeSBzb21ldGhpbmcgb24gdGhpcyBzdHJhdHVtLiAgQ2xvc2UgaXQgb2ZmLiAgKi8KKwlpZiAoY3VyLT50YXJnZXRfb3BzLT50b19jbG9zZSkKKwkgIChjdXItPnRhcmdldF9vcHMtPnRvX2Nsb3NlKSAoMCk7CisJaWYgKHByZXYpCisJICBwcmV2LT5uZXh0ID0gY3VyLT5uZXh0OyAvKiBVbmNoYWluIG9sZCB0YXJnZXRfb3BzICovCisJZWxzZQorCSAgdGFyZ2V0X3N0YWNrID0gY3VyLT5uZXh0OyAvKiBVbmNoYWluIGZpcnN0IG9uIGxpc3QgKi8KKwl0bXAgPSBjdXItPm5leHQ7CisJZnJlZSAoY3VyKTsKKwljdXIgPSB0bXA7CisgICAgICB9CisKKyAgLyogV2UgaGF2ZSByZW1vdmVkIGFsbCB0YXJnZXRzIGluIG91ciBzdHJhdHVtLCBub3cgYWRkIHRoZSBuZXcgb25lLiAgKi8KKworICB0bXAgPSAoc3RydWN0IHRhcmdldF9zdGFja19pdGVtICopCisgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgdGFyZ2V0X3N0YWNrX2l0ZW0pKTsKKyAgdG1wLT5uZXh0ID0gY3VyOworICB0bXAtPnRhcmdldF9vcHMgPSB0OworCisgIGlmIChwcmV2KQorICAgIHByZXYtPm5leHQgPSB0bXA7CisgIGVsc2UKKyAgICB0YXJnZXRfc3RhY2sgPSB0bXA7CisKKyAgdXBkYXRlX2N1cnJlbnRfdGFyZ2V0ICgpOworCisgIGNsZWFudXBfdGFyZ2V0ICgmY3VycmVudF90YXJnZXQpOyAvKiBGaWxsIGluIHRoZSBnYXBzICovCisKKyNpZmRlZiBNQUlOVEVOQU5DRV9DTURTCisgIGlmICh0YXJnZXRkZWJ1ZykKKyAgICBzZXR1cF90YXJnZXRfZGVidWcgKCk7CisjZW5kaWYKKworICByZXR1cm4gcHJldiAhPSAwOworfQorCisvKiBSZW1vdmUgYSB0YXJnZXRfb3BzIHZlY3RvciBmcm9tIHRoZSBzdGFjaywgd2hlcmV2ZXIgaXQgbWF5IGJlLiAKKyAgIFJldHVybiBob3cgbWFueSB0aW1lcyBpdCB3YXMgcmVtb3ZlZCAoMCBvciAxKS4gICovCisKK2ludAordW5wdXNoX3RhcmdldCAodCkKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKnQ7Cit7CisgIHN0cnVjdCB0YXJnZXRfc3RhY2tfaXRlbSAqY3VyLCAqcHJldjsKKworICBpZiAodC0+dG9fY2xvc2UpCisgICAgdC0+dG9fY2xvc2UgKDApOwkJLyogTGV0IGl0IGNsZWFuIHVwICovCisKKyAgLyogTG9vayBmb3IgdGhlIHNwZWNpZmllZCB0YXJnZXQuICBOb3RlIHRoYXQgd2UgYXNzdW1lIHRoYXQgYSB0YXJnZXQKKyAgICAgY2FuIG9ubHkgb2NjdXIgb25jZSBpbiB0aGUgdGFyZ2V0IHN0YWNrLiAqLworCisgIGZvciAoY3VyID0gdGFyZ2V0X3N0YWNrLCBwcmV2ID0gTlVMTDsgY3VyOyBwcmV2ID0gY3VyLCBjdXIgPSBjdXItPm5leHQpCisgICAgaWYgKGN1ci0+dGFyZ2V0X29wcyA9PSB0KQorICAgICAgYnJlYWs7CisKKyAgaWYgKCFjdXIpCisgICAgcmV0dXJuIDA7CQkJLyogRGlkbid0IGZpbmQgdGFyZ2V0X29wcywgcXVpdCBub3cgKi8KKworICAvKiBVbmNoYWluIHRoZSB0YXJnZXQgKi8KKworICBpZiAoIXByZXYpCisgICAgdGFyZ2V0X3N0YWNrID0gY3VyLT5uZXh0OworICBlbHNlCisgICAgcHJldi0+bmV4dCA9IGN1ci0+bmV4dDsKKworICBmcmVlIChjdXIpOwkJCS8qIFJlbGVhc2UgdGhlIHRhcmdldF9zdGFja19pdGVtICovCisKKyAgdXBkYXRlX2N1cnJlbnRfdGFyZ2V0ICgpOworICBjbGVhbnVwX3RhcmdldCAoJmN1cnJlbnRfdGFyZ2V0KTsKKworICByZXR1cm4gMTsKK30KKwordm9pZAorcG9wX3RhcmdldCAoKQoreworICAoY3VycmVudF90YXJnZXQudG9fY2xvc2UpKDApOwkvKiBMZXQgaXQgY2xlYW4gdXAgKi8KKyAgaWYgKHVucHVzaF90YXJnZXQgKHRhcmdldF9zdGFjay0+dGFyZ2V0X29wcykgPT0gMSkKKyAgICByZXR1cm47CisKKyAgZnByaW50Zl91bmZpbHRlcmVkKGdkYl9zdGRlcnIsCisJCSAgICAgInBvcF90YXJnZXQgY291bGRuJ3QgZmluZCB0YXJnZXQgJXNcbiIsIAorCQkgICAgIGN1cnJlbnRfdGFyZ2V0LnRvX3Nob3J0bmFtZSk7CisgIGFib3J0KCk7Cit9CisKKyN1bmRlZglNSU4KKyNkZWZpbmUgTUlOKEEsIEIpICgoKEEpIDw9IChCKSkgPyAoQSkgOiAoQikpCisKKy8qIHRhcmdldF9yZWFkX3N0cmluZyAtLSByZWFkIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZywgdXAgdG8gTEVOIGJ5dGVzLAorICAgZnJvbSBNRU1BRERSIGluIHRhcmdldC4gIFNldCAqRVJSTk9QIHRvIHRoZSBlcnJubyBjb2RlLCBvciAwIGlmIHN1Y2Nlc3NmdWwuCisgICBTZXQgKlNUUklORyB0byBhIHBvaW50ZXIgdG8gbWFsbG9jJ2QgbWVtb3J5IGNvbnRhaW5pbmcgdGhlIGRhdGE7IHRoZSBjYWxsZXIKKyAgIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0LiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgc3VjY2Vzc2Z1bGx5CisgICByZWFkLiAgKi8KKworaW50Cit0YXJnZXRfcmVhZF9zdHJpbmcgKG1lbWFkZHIsIHN0cmluZywgbGVuLCBlcnJub3ApCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICoqc3RyaW5nOworICAgICBpbnQgbGVuOworICAgICBpbnQgKmVycm5vcDsKK3sKKyAgaW50IHRsZW4sIG9yaWdsZW4sIG9mZnNldCwgaTsKKyAgY2hhciBidWZbNF07CisgIGludCBlcnJjb2RlID0gMDsKKyAgY2hhciAqYnVmZmVyOworICBpbnQgYnVmZmVyX2FsbG9jYXRlZDsKKyAgY2hhciAqYnVmcHRyOworICB1bnNpZ25lZCBpbnQgbmJ5dGVzX3JlYWQgPSAwOworCisgIC8qIFNtYWxsIGZvciB0ZXN0aW5nLiAgKi8KKyAgYnVmZmVyX2FsbG9jYXRlZCA9IDQ7CisgIGJ1ZmZlciA9IHhtYWxsb2MgKGJ1ZmZlcl9hbGxvY2F0ZWQpOworICBidWZwdHIgPSBidWZmZXI7CisKKyAgb3JpZ2xlbiA9IGxlbjsKKworICB3aGlsZSAobGVuID4gMCkKKyAgICB7CisgICAgICB0bGVuID0gTUlOIChsZW4sIDQgLSAobWVtYWRkciAmIDMpKTsKKyAgICAgIG9mZnNldCA9IG1lbWFkZHIgJiAzOworCisgICAgICBlcnJjb2RlID0gdGFyZ2V0X3hmZXJfbWVtb3J5IChtZW1hZGRyICYgfjMsIGJ1ZiwgNCwgMCwgTlVMTCk7CisgICAgICBpZiAoZXJyY29kZSAhPSAwKQorCXsKKwkgIC8qIFRoZSB0cmFuc2ZlciByZXF1ZXN0IG1pZ2h0IGhhdmUgY3Jvc3NlZCB0aGUgYm91bmRhcnkgdG8gYW4KKwkgICAgIHVuYWxsb2NhdGVkIHJlZ2lvbiBvZiBtZW1vcnkuIFJldHJ5IHRoZSB0cmFuc2ZlciwgcmVxdWVzdGluZworCSAgICAgYSBzaW5nbGUgYnl0ZS4gICovCisJICB0bGVuID0gMTsKKwkgIG9mZnNldCA9IDA7CisJICBlcnJjb2RlID0gdGFyZ2V0X3hmZXJfbWVtb3J5IChtZW1hZGRyLCBidWYsIDEsIDAsIE5VTEwpOworCSAgaWYgKGVycmNvZGUgIT0gMCkKKwkgICAgZ290byBkb25lOworCX0KKworICAgICAgaWYgKGJ1ZnB0ciAtIGJ1ZmZlciArIHRsZW4gPiBidWZmZXJfYWxsb2NhdGVkKQorCXsKKwkgIHVuc2lnbmVkIGludCBieXRlczsKKwkgIGJ5dGVzID0gYnVmcHRyIC0gYnVmZmVyOworCSAgYnVmZmVyX2FsbG9jYXRlZCAqPSAyOworCSAgYnVmZmVyID0geHJlYWxsb2MgKGJ1ZmZlciwgYnVmZmVyX2FsbG9jYXRlZCk7CisJICBidWZwdHIgPSBidWZmZXIgKyBieXRlczsKKwl9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB0bGVuOyBpKyspCisJeworCSAgKmJ1ZnB0cisrID0gYnVmW2kgKyBvZmZzZXRdOworCSAgaWYgKGJ1ZltpICsgb2Zmc2V0XSA9PSAnXDAwMCcpCisJICAgIHsKKwkgICAgICBuYnl0ZXNfcmVhZCArPSBpICsgMTsKKwkgICAgICBnb3RvIGRvbmU7CisJICAgIH0KKwl9CisKKyAgICAgIG1lbWFkZHIgKz0gdGxlbjsKKyAgICAgIGxlbiAtPSB0bGVuOworICAgICAgbmJ5dGVzX3JlYWQgKz0gdGxlbjsKKyAgICB9CisgZG9uZToKKyAgaWYgKGVycm5vcCAhPSBOVUxMKQorICAgICplcnJub3AgPSBlcnJjb2RlOworICBpZiAoc3RyaW5nICE9IE5VTEwpCisgICAgKnN0cmluZyA9IGJ1ZmZlcjsKKyAgcmV0dXJuIG5ieXRlc19yZWFkOworfQorCisvKiBSZWFkIExFTiBieXRlcyBvZiB0YXJnZXQgbWVtb3J5IGF0IGFkZHJlc3MgTUVNQUREUiwgcGxhY2luZyB0aGUgcmVzdWx0cyBpbgorICAgR0RCJ3MgbWVtb3J5IGF0IE1ZQUREUi4gIFJldHVybnMgZWl0aGVyIDAgZm9yIHN1Y2Nlc3Mgb3IgYW4gZXJybm8gdmFsdWUKKyAgIGlmIGFueSBlcnJvciBvY2N1cnMuCisKKyAgIElmIGFuIGVycm9yIG9jY3Vycywgbm8gZ3VhcmFudGVlIGlzIG1hZGUgYWJvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhIGF0CisgICBNWUFERFIuICBJbiBwYXJ0aWN1bGFyLCB0aGUgY2FsbGVyIHNob3VsZCBub3QgZGVwZW5kIHVwb24gcGFydGlhbCByZWFkcworICAgZmlsbGluZyB0aGUgYnVmZmVyIHdpdGggZ29vZCBkYXRhLiAgVGhlcmUgaXMgbm8gd2F5IGZvciB0aGUgY2FsbGVyIHRvIGtub3cKKyAgIGhvdyBtdWNoIGdvb2QgZGF0YSBtaWdodCBoYXZlIGJlZW4gdHJhbnNmZXJlZCBhbnl3YXkuICBDYWxsZXJzIHRoYXQgY2FuCisgICBkZWFsIHdpdGggcGFydGlhbCByZWFkcyBzaG91bGQgY2FsbCB0YXJnZXRfcmVhZF9tZW1vcnlfcGFydGlhbC4gKi8KKworaW50Cit0YXJnZXRfcmVhZF9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICByZXR1cm4gdGFyZ2V0X3hmZXJfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbiwgMCwgTlVMTCk7Cit9CisKK2ludAordGFyZ2V0X3JlYWRfbWVtb3J5X3NlY3Rpb24gKG1lbWFkZHIsIG15YWRkciwgbGVuLCBiZmRfc2VjdGlvbikKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgYXNlY3Rpb24gKmJmZF9zZWN0aW9uOworeworICByZXR1cm4gdGFyZ2V0X3hmZXJfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbiwgMCwgYmZkX3NlY3Rpb24pOworfQorCisvKiBSZWFkIExFTiBieXRlcyBvZiB0YXJnZXQgbWVtb3J5IGF0IGFkZHJlc3MgTUVNQUREUiwgcGxhY2luZyB0aGUgcmVzdWx0cworICAgaW4gR0RCJ3MgbWVtb3J5IGF0IE1ZQUREUi4gIFJldHVybnMgYSBjb3VudCBvZiB0aGUgYnl0ZXMgYWN0dWFsbHkgcmVhZCwKKyAgIGFuZCBvcHRpb25hbGx5IGFuIGVycm5vIHZhbHVlIGluIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IEVSUk5PUFRSCisgICBpZiBFUlJOT1BUUiBpcyBub24tbnVsbC4gKi8KKworaW50Cit0YXJnZXRfcmVhZF9tZW1vcnlfcGFydGlhbCAobWVtYWRkciwgbXlhZGRyLCBsZW4sIGVycm5vcHRyKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworICAgICBpbnQgKmVycm5vcHRyOworeworICBpbnQgbnJlYWQ7CS8qIE51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLiAqLworICBpbnQgZXJyY29kZTsJLyogRXJyb3IgZnJvbSBsYXN0IHJlYWQuICovCisKKyAgLyogRmlyc3QgdHJ5IGEgY29tcGxldGUgcmVhZC4gKi8KKyAgZXJyY29kZSA9IHRhcmdldF94ZmVyX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4sIDAsIE5VTEwpOworICBpZiAoZXJyY29kZSA9PSAwKQorICAgIHsKKyAgICAgIC8qIEdvdCBpdCBhbGwuICovCisgICAgICBucmVhZCA9IGxlbjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBMb29wLCByZWFkaW5nIG9uZSBieXRlIGF0IGEgdGltZSB1bnRpbCB3ZSBnZXQgYXMgbXVjaCBhcyB3ZSBjYW4uICovCisgICAgICBmb3IgKGVycmNvZGUgPSAwLCBucmVhZCA9IDA7IGxlbiA+IDAgJiYgZXJyY29kZSA9PSAwOyBucmVhZCsrLCBsZW4tLSkKKwl7CisJICBlcnJjb2RlID0gdGFyZ2V0X3hmZXJfbWVtb3J5IChtZW1hZGRyKyssIG15YWRkcisrLCAxLCAwLCBOVUxMKTsKKwl9CisgICAgICAvKiBJZiBhbiBlcnJvciwgdGhlIGxhc3QgcmVhZCB3YXMgdW5zdWNjZXNzZnVsLCBzbyBhZGp1c3QgY291bnQuICovCisgICAgICBpZiAoZXJyY29kZSAhPSAwKQorCXsKKwkgIG5yZWFkLS07CisJfQorICAgIH0KKyAgaWYgKGVycm5vcHRyICE9IE5VTEwpCisgICAgeworICAgICAgKmVycm5vcHRyID0gZXJyY29kZTsKKyAgICB9CisgIHJldHVybiAobnJlYWQpOworfQorCitpbnQKK3RhcmdldF93cml0ZV9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuKQorICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgY2hhciAqbXlhZGRyOworICAgICBpbnQgbGVuOworeworICByZXR1cm4gdGFyZ2V0X3hmZXJfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbiwgMSwgTlVMTCk7Cit9CisgCisvKiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8gcGFzcyBzZWN0aW9uIGluZm9ybWF0aW9uIGRvd24gdG8gdGFyZ2V0cy4gIFRoaXMKKyAgICpzaG91bGQqIGJlIGRvbmUgYnkgYWRkaW5nIGFuIGFyZ3VtZW50IHRvIHRoZSB0YXJnZXRfeGZlcl9tZW1vcnkgZnVuY3Rpb24KKyAgIG9mIGFsbCB0aGUgdGFyZ2V0cywgYnV0IEkgZGlkbid0IGZlZWwgbGlrZSBjaGFuZ2luZyA1MCsgZmlsZXMuICAqLworCithc2VjdGlvbiAqdGFyZ2V0X21lbW9yeV9iZmRfc2VjdGlvbiA9IE5VTEw7CisKKy8qIE1vdmUgbWVtb3J5IHRvIG9yIGZyb20gdGhlIHRhcmdldHMuICBJdGVyYXRlIHVudGlsIGFsbCBvZiBpdCBoYXMKKyAgIGJlZW4gbW92ZWQsIGlmIG5lY2Vzc2FyeS4gIFRoZSB0b3AgdGFyZ2V0IGdldHMgcHJpb3JpdHk7IGFueXRoaW5nCisgICBpdCBkb2Vzbid0IHdhbnQsIGlzIG9mZmVyZWQgdG8gdGhlIG5leHQgb25lIGRvd24sIGV0Yy4gIE5vdGUgdGhlCisgICBidXNpbmVzcyB3aXRoIGN1cmxlbjogIGlmIGFuIGVhcmx5IHRhcmdldCBzYXlzICJubywgYnV0IEkgaGF2ZSBhCisgICBib3VuZGFyeSBvdmVybGFwcGluZyB0aGlzIHhmZXIiIHRoZW4gd2Ugc2hvcnRlbiB3aGF0IHdlIG9mZmVyIHRvCisgICB0aGUgc3Vic2VxdWVudCB0YXJnZXRzIHNvIHRoZSBlYXJseSBndXkgd2lsbCBnZXQgYSBjaGFuY2UgYXQgdGhlCisgICB0YWlsIGJlZm9yZSB0aGUgc3Vic2VxdWVudCBvbmVzIGRvLiAKKworICAgUmVzdWx0IGlzIDAgb3IgZXJybm8gdmFsdWUuICAqLworCitzdGF0aWMgaW50Cit0YXJnZXRfeGZlcl9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuLCB3cml0ZSwgYmZkX3NlY3Rpb24pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBjaGFyICpteWFkZHI7CisgICAgIGludCBsZW47CisgICAgIGludCB3cml0ZTsKKyAgICAgYXNlY3Rpb24gKmJmZF9zZWN0aW9uOworeworICBpbnQgY3VybGVuOworICBpbnQgcmVzOworICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdDsKKyAgc3RydWN0IHRhcmdldF9zdGFja19pdGVtICppdGVtOworCisgIC8qIFplcm8gbGVuZ3RoIHJlcXVlc3RzIGFyZSBvayBhbmQgcmVxdWlyZSBubyB3b3JrLiAgKi8KKyAgaWYgKGxlbiA9PSAwKQorICAgIHJldHVybiAwOworCisgIHRhcmdldF9tZW1vcnlfYmZkX3NlY3Rpb24gPSBiZmRfc2VjdGlvbjsKKworICAvKiB0b194ZmVyX21lbW9yeSBpcyBub3QgZ3VhcmFudGVlZCB0byBzZXQgZXJybm8sIGV2ZW4gd2hlbiBpdCByZXR1cm5zCisgICAgIDAuICAqLworICBlcnJubyA9IDA7CisKKyAgLyogVGhlIHF1aWNrIGNhc2UgaXMgdGhhdCB0aGUgdG9wIHRhcmdldCBkb2VzIGl0IGFsbC4gICovCisgIHJlcyA9IGN1cnJlbnRfdGFyZ2V0LnRvX3hmZXJfbWVtb3J5CisJCQkobWVtYWRkciwgbXlhZGRyLCBsZW4sIHdyaXRlLCAmY3VycmVudF90YXJnZXQpOworICBpZiAocmVzID09IGxlbikKKyAgICByZXR1cm4gMDsKKworICBpZiAocmVzID4gMCkKKyAgICBnb3RvIGJ1bXA7CisgIC8qIElmIHJlcyA8PSAwIHRoZW4gd2UgY2FsbCBpdCBhZ2FpbiBpbiB0aGUgbG9vcC4gIEFoIHdlbGwuICAqLworCisgIGZvciAoOyBsZW4gPiAwOykKKyAgICB7CisgICAgICBjdXJsZW4gPSBsZW47CQkvKiBXYW50IHRvIGRvIGl0IGFsbCAqLworICAgICAgZm9yIChpdGVtID0gdGFyZ2V0X3N0YWNrOyBpdGVtOyBpdGVtID0gaXRlbS0+bmV4dCkKKwl7CisJICB0ID0gaXRlbS0+dGFyZ2V0X29wczsKKwkgIGlmICghdC0+dG9faGFzX21lbW9yeSkKKwkgICAgY29udGludWU7CisKKwkgIHJlcyA9IHQtPnRvX3hmZXJfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGN1cmxlbiwgd3JpdGUsIHQpOworCSAgaWYgKHJlcyA+IDApCisJICAgIGJyZWFrOwkJLyogSGFuZGxlZCBhbGwgb3IgcGFydCBvZiB4ZmVyICovCisJICBpZiAodC0+dG9faGFzX2FsbF9tZW1vcnkpCisJICAgIGJyZWFrOworCX0KKworICAgICAgaWYgKHJlcyA8PSAwKQorCXsKKwkgIC8qIElmIHRoaXMgYWRkcmVzcyBpcyBmb3Igbm9uZXhpc3RlbnQgbWVtb3J5LAorCSAgICAgcmVhZCB6ZXJvcyBpZiByZWFkaW5nLCBvciBkbyBub3RoaW5nIGlmIHdyaXRpbmcuICBSZXR1cm4gZXJyb3IuICovCisJICBpZiAoIXdyaXRlKQorCSAgICBtZW1zZXQgKG15YWRkciwgMCwgbGVuKTsKKwkgIGlmIChlcnJubyA9PSAwKQorCSAgICByZXR1cm4gRUlPOworCSAgZWxzZQorCSAgICByZXR1cm4gZXJybm87CisJfQorYnVtcDoKKyAgICAgIG1lbWFkZHIgKz0gcmVzOworICAgICAgbXlhZGRyICArPSByZXM7CisgICAgICBsZW4gICAgIC09IHJlczsKKyAgICB9CisgIHJldHVybiAwOwkJCS8qIFdlIG1hbmFnZWQgdG8gY292ZXIgaXQgYWxsIHNvbWVob3cuICovCit9CisKKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCit0YXJnZXRfaW5mbyAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgc3RydWN0IHRhcmdldF9vcHMgKnQ7CisgIHN0cnVjdCB0YXJnZXRfc3RhY2tfaXRlbSAqaXRlbTsKKyAgaW50IGhhc19hbGxfbWVtID0gMDsKKyAgCisgIGlmIChzeW1maWxlX29iamZpbGUgIT0gTlVMTCkKKyAgICBwcmludGZfdW5maWx0ZXJlZCAoIlN5bWJvbHMgZnJvbSBcIiVzXCIuXG4iLCBzeW1maWxlX29iamZpbGUtPm5hbWUpOworCisjaWZkZWYgRklMRVNfSU5GT19IT09LCisgIGlmIChGSUxFU19JTkZPX0hPT0sgKCkpCisgICAgcmV0dXJuOworI2VuZGlmCisKKyAgZm9yIChpdGVtID0gdGFyZ2V0X3N0YWNrOyBpdGVtOyBpdGVtID0gaXRlbS0+bmV4dCkKKyAgICB7CisgICAgICB0ID0gaXRlbS0+dGFyZ2V0X29wczsKKworICAgICAgaWYgKCF0LT50b19oYXNfbWVtb3J5KQorCWNvbnRpbnVlOworCisgICAgICBpZiAoKGludCkodC0+dG9fc3RyYXR1bSkgPD0gKGludClkdW1teV9zdHJhdHVtKQorCWNvbnRpbnVlOworICAgICAgaWYgKGhhc19hbGxfbWVtKQorCXByaW50Zl91bmZpbHRlcmVkKCJcdFdoaWxlIHJ1bm5pbmcgdGhpcywgR0RCIGRvZXMgbm90IGFjY2VzcyBtZW1vcnkgZnJvbS4uLlxuIik7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCgiJXM6XG4iLCB0LT50b19sb25nbmFtZSk7CisgICAgICAodC0+dG9fZmlsZXNfaW5mbykodCk7CisgICAgICBoYXNfYWxsX21lbSA9IHQtPnRvX2hhc19hbGxfbWVtb3J5OworICAgIH0KK30KKworLyogVGhpcyBpcyB0byBiZSBjYWxsZWQgYnkgdGhlIG9wZW4gcm91dGluZSBiZWZvcmUgaXQgZG9lcworICAgYW55dGhpbmcuICAqLworCit2b2lkCit0YXJnZXRfcHJlb3BlbiAoZnJvbV90dHkpCisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZG9udF9yZXBlYXQoKTsKKworICBpZiAodGFyZ2V0X2hhc19leGVjdXRpb24pCisgICAgeyAgIAorICAgICAgaWYgKHF1ZXJ5ICgiQSBwcm9ncmFtIGlzIGJlaW5nIGRlYnVnZ2VkIGFscmVhZHkuICBLaWxsIGl0PyAiKSkKKyAgICAgICAgdGFyZ2V0X2tpbGwgKCk7CisgICAgICBlbHNlCisgICAgICAgIGVycm9yICgiUHJvZ3JhbSBub3Qga2lsbGVkLiIpOworICAgIH0KKworICAvKiBDYWxsaW5nIHRhcmdldF9raWxsIG1heSByZW1vdmUgdGhlIHRhcmdldCBmcm9tIHRoZSBzdGFjay4gIEJ1dCBpZgorICAgICBpdCBkb2Vzbid0ICh3aGljaCBzZWVtcyBsaWtlIGEgd2luIGZvciBVREkpLCByZW1vdmUgaXQgbm93LiAgKi8KKworICBpZiAodGFyZ2V0X2hhc19leGVjdXRpb24pCisgICAgcG9wX3RhcmdldCAoKTsKK30KKworLyogRGV0YWNoIGEgdGFyZ2V0IGFmdGVyIGRvaW5nIGRlZmVycmVkIHJlZ2lzdGVyIHN0b3Jlcy4gICovCisKK3ZvaWQKK3RhcmdldF9kZXRhY2ggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIC8qIEhhbmRsZSBhbnkgb3B0aW1pemVkIHN0b3JlcyB0byB0aGUgaW5mZXJpb3IuICAqLworI2lmZGVmIERPX0RFRkVSUkVEX1NUT1JFUworICBET19ERUZFUlJFRF9TVE9SRVM7CisjZW5kaWYKKyAgKGN1cnJlbnRfdGFyZ2V0LnRvX2RldGFjaCkgKGFyZ3MsIGZyb21fdHR5KTsKK30KKwordm9pZAordGFyZ2V0X2xpbmsgKG1vZG5hbWUsIHRfcmVsb2MpCisgICAgIGNoYXIgKm1vZG5hbWU7CisgICAgIENPUkVfQUREUiAqdF9yZWxvYzsKK3sKKyAgaWYgKFNUUkVRKGN1cnJlbnRfdGFyZ2V0LnRvX3Nob3J0bmFtZSwgInJvbWJ1ZyIpKQorICAgIHsKKyAgICAgIChjdXJyZW50X3RhcmdldC50b19sb29rdXBfc3ltYm9sKSAobW9kbmFtZSwgdF9yZWxvYyk7CisgICAgICBpZiAoKnRfcmVsb2MgPT0gMCkKKyAgICAgIGVycm9yKCJVbmFibGUgdG8gbGluayB0byAlcyBhbmQgZ2V0IHJlbG9jYXRpb24gaW4gcm9tYnVnIiwgbW9kbmFtZSk7CisgICAgfQorICBlbHNlCisgICAgKnRfcmVsb2MgPSAoQ09SRV9BRERSKS0xOworfQorCisvKiBMb29rIHRocm91Z2ggdGhlIGxpc3Qgb2YgcG9zc2libGUgdGFyZ2V0cyBmb3IgYSB0YXJnZXQgdGhhdCBjYW4KKyAgIGV4ZWN1dGUgYSBydW4gb3IgYXR0YWNoIGNvbW1hbmQgd2l0aG91dCBhbnkgb3RoZXIgZGF0YS4gIFRoaXMgaXMKKyAgIHVzZWQgdG8gbG9jYXRlIHRoZSBkZWZhdWx0IHByb2Nlc3Mgc3RyYXR1bS4KKworICAgUmVzdWx0IGlzIGFsd2F5cyB2YWxpZCAoZXJyb3IoKSBpcyBjYWxsZWQgZm9yIGVycm9ycykuICAqLworCitzdGF0aWMgc3RydWN0IHRhcmdldF9vcHMgKgorZmluZF9kZWZhdWx0X3J1bl90YXJnZXQgKGRvX21lc2cpCisgICAgIGNoYXIgKmRvX21lc2c7Cit7CisgIHN0cnVjdCB0YXJnZXRfb3BzICoqdDsKKyAgc3RydWN0IHRhcmdldF9vcHMgKnJ1bmFibGUgPSBOVUxMOworICBpbnQgY291bnQ7CisKKyAgY291bnQgPSAwOworCisgIGZvciAodCA9IHRhcmdldF9zdHJ1Y3RzOyB0IDwgdGFyZ2V0X3N0cnVjdHMgKyB0YXJnZXRfc3RydWN0X3NpemU7CisgICAgICAgKyt0KQorICAgIHsKKyAgICAgIGlmICgoKnQpLT50b19jYW5fcnVuICYmIHRhcmdldF9jYW5fcnVuKCp0KSkKKwl7CisJICBydW5hYmxlID0gKnQ7CisJICArK2NvdW50OworCX0KKyAgICB9CisKKyAgaWYgKGNvdW50ICE9IDEpCisgICAgZXJyb3IgKCJEb24ndCBrbm93IGhvdyB0byAlcy4gIFRyeSBcImhlbHAgdGFyZ2V0XCIuIiwgZG9fbWVzZyk7CisKKyAgcmV0dXJuIHJ1bmFibGU7Cit9CisKK3ZvaWQKK2ZpbmRfZGVmYXVsdF9hdHRhY2ggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCB0YXJnZXRfb3BzICp0OworCisgIHQgPSBmaW5kX2RlZmF1bHRfcnVuX3RhcmdldCgiYXR0YWNoIik7CisgICh0LT50b19hdHRhY2gpIChhcmdzLCBmcm9tX3R0eSk7CisgIHJldHVybjsKK30KKwordm9pZAorZmluZF9kZWZhdWx0X3JlcXVpcmVfYXR0YWNoIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdDsKKworICB0ID0gZmluZF9kZWZhdWx0X3J1bl90YXJnZXQoInJlcXVpcmVfYXR0YWNoIik7CisgICh0LT50b19yZXF1aXJlX2F0dGFjaCkgKGFyZ3MsIGZyb21fdHR5KTsKKyAgcmV0dXJuOworfQorCit2b2lkCitmaW5kX2RlZmF1bHRfcmVxdWlyZV9kZXRhY2ggKHBpZCwgYXJncywgZnJvbV90dHkpCisgIGludCAgcGlkOworICBjaGFyICogIGFyZ3M7CisgIGludCAgZnJvbV90dHk7Cit7CisgIHN0cnVjdCB0YXJnZXRfb3BzICp0OworCisgIHQgPSBmaW5kX2RlZmF1bHRfcnVuX3RhcmdldCgicmVxdWlyZV9kZXRhY2giKTsKKyAgKHQtPnRvX3JlcXVpcmVfZGV0YWNoKSAocGlkLCBhcmdzLCBmcm9tX3R0eSk7CisgIHJldHVybjsKK30KKwordm9pZAorZmluZF9kZWZhdWx0X2NyZWF0ZV9pbmZlcmlvciAoZXhlY19maWxlLCBhbGxhcmdzLCBlbnYpCisgICAgIGNoYXIgKmV4ZWNfZmlsZTsKKyAgICAgY2hhciAqYWxsYXJnczsKKyAgICAgY2hhciAqKmVudjsKK3sKKyAgc3RydWN0IHRhcmdldF9vcHMgKnQ7CisKKyAgdCA9IGZpbmRfZGVmYXVsdF9ydW5fdGFyZ2V0KCJydW4iKTsKKyAgKHQtPnRvX2NyZWF0ZV9pbmZlcmlvcikgKGV4ZWNfZmlsZSwgYWxsYXJncywgZW52KTsKKyAgcmV0dXJuOworfQorCit2b2lkCitmaW5kX2RlZmF1bHRfY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciAoY2hpbGRfcGlkLCBmb2xsb3dlZF9jaGlsZCkKKyAgaW50ICBjaGlsZF9waWQ7CisgIGludCAgKmZvbGxvd2VkX2NoaWxkOworeworICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdDsKKworICB0ID0gZmluZF9kZWZhdWx0X3J1bl90YXJnZXQoInJ1biIpOworICAodC0+dG9fY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvcikgKGNoaWxkX3BpZCwgZm9sbG93ZWRfY2hpbGQpOworICByZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK3JldHVybl96ZXJvICgpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CityZXR1cm5fb25lICgpCit7CisgIHJldHVybiAxOworfQorCitzdHJ1Y3QgdGFyZ2V0X29wcyAqCitmaW5kX2NvcmVfdGFyZ2V0ICgpCit7CisgIHN0cnVjdCB0YXJnZXRfb3BzICoqdDsKKyAgc3RydWN0IHRhcmdldF9vcHMgKnJ1bmFibGUgPSBOVUxMOworICBpbnQgY291bnQ7CisgIAorICBjb3VudCA9IDA7CisgIAorICBmb3IgKHQgPSB0YXJnZXRfc3RydWN0czsgdCA8IHRhcmdldF9zdHJ1Y3RzICsgdGFyZ2V0X3N0cnVjdF9zaXplOworICAgICAgICsrdCkKKyAgICB7CisgICAgICBpZiAoKCp0KS0+dG9fc3RyYXR1bSA9PSBjb3JlX3N0cmF0dW0pCisJeworCSAgcnVuYWJsZSA9ICp0OworCSAgKytjb3VudDsKKwl9CisgICAgfQorICAKKyAgcmV0dXJuKGNvdW50ID09IDEgPyBydW5hYmxlIDogTlVMTCk7Cit9CisMCisvKiBUaGUgaW5mZXJpb3IgcHJvY2VzcyBoYXMgZGllZC4gIExvbmcgbGl2ZSB0aGUgaW5mZXJpb3IhICAqLworCit2b2lkCitnZW5lcmljX21vdXJuX2luZmVyaW9yICgpCit7CisgIGV4dGVybiBpbnQgc2hvd19icmVha3BvaW50X2hpdF9jb3VudHM7CisKKyAgaW5mZXJpb3JfcGlkID0gMDsKKyAgYXR0YWNoX2ZsYWcgPSAwOworICBicmVha3BvaW50X2luaXRfaW5mZXJpb3IgKGluZl9leGl0ZWQpOworICByZWdpc3RlcnNfY2hhbmdlZCAoKTsKKworI2lmZGVmIENMRUFSX0RFRkVSUkVEX1NUT1JFUworICAvKiBEZWxldGUgYW55IHBlbmRpbmcgc3RvcmVzIHRvIHRoZSBpbmZlcmlvci4uLiAqLworICBDTEVBUl9ERUZFUlJFRF9TVE9SRVM7CisjZW5kaWYKKworICByZW9wZW5fZXhlY19maWxlICgpOworICByZWluaXRfZnJhbWVfY2FjaGUgKCk7CisKKyAgLyogSXQgaXMgY29uZnVzaW5nIHRvIHRoZSB1c2VyIGZvciBpZ25vcmUgY291bnRzIHRvIHN0aWNrIGFyb3VuZAorICAgICBmcm9tIHByZXZpb3VzIHJ1bnMgb2YgdGhlIGluZmVyaW9yLiAgU28gY2xlYXIgdGhlbS4gICovCisgIC8qIEhvd2V2ZXIsIGl0IGlzIG1vcmUgY29uZnVzaW5nIGZvciB0aGUgaWdub3JlIGNvdW50cyB0byBkaXNhcHBlYXIgd2hlbgorICAgICB1c2luZyBoaXQgY291bnRzLiAgU28gZG9uJ3QgY2xlYXIgdGhlbSBpZiB3ZSdyZSBjb3VudGluZyBoaXRzLiAgKi8KKyAgaWYgKCFzaG93X2JyZWFrcG9pbnRfaGl0X2NvdW50cykKKyAgICBicmVha3BvaW50X2NsZWFyX2lnbm9yZV9jb3VudHMgKCk7Cit9CisMCisvKiBUaGlzIHRhYmxlIG11c3QgbWF0Y2ggaW4gb3JkZXIgYW5kIHNpemUgdGhlIHNpZ25hbHMgaW4gZW51bSB0YXJnZXRfc2lnbmFsCisgICBpbiB0YXJnZXQuaC4gICovCitzdGF0aWMgc3RydWN0IHsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqc3RyaW5nOworICB9IHNpZ25hbHMgW10gPQoreworICB7IjAiLCAiU2lnbmFsIDAifSwKKyAgeyJTSUdIVVAiLCAiSGFuZ3VwIn0sCisgIHsiU0lHSU5UIiwgIkludGVycnVwdCJ9LAorICB7IlNJR1FVSVQiLCAiUXVpdCJ9LAorICB7IlNJR0lMTCIsICJJbGxlZ2FsIGluc3RydWN0aW9uIn0sCisgIHsiU0lHVFJBUCIsICJUcmFjZS9icmVha3BvaW50IHRyYXAifSwKKyAgeyJTSUdBQlJUIiwgIkFib3J0ZWQifSwKKyAgeyJTSUdFTVQiLCAiRW11bGF0aW9uIHRyYXAifSwKKyAgeyJTSUdGUEUiLCAiQXJpdGhtZXRpYyBleGNlcHRpb24ifSwKKyAgeyJTSUdLSUxMIiwgIktpbGxlZCJ9LAorICB7IlNJR0JVUyIsICJCdXMgZXJyb3IifSwKKyAgeyJTSUdTRUdWIiwgIlNlZ21lbnRhdGlvbiBmYXVsdCJ9LAorICB7IlNJR1NZUyIsICJCYWQgc3lzdGVtIGNhbGwifSwKKyAgeyJTSUdQSVBFIiwgIkJyb2tlbiBwaXBlIn0sCisgIHsiU0lHQUxSTSIsICJBbGFybSBjbG9jayJ9LAorICB7IlNJR1RFUk0iLCAiVGVybWluYXRlZCJ9LAorICB7IlNJR1VSRyIsICJVcmdlbnQgSS9PIGNvbmRpdGlvbiJ9LAorICB7IlNJR1NUT1AiLCAiU3RvcHBlZCAoc2lnbmFsKSJ9LAorICB7IlNJR1RTVFAiLCAiU3RvcHBlZCAodXNlcikifSwKKyAgeyJTSUdDT05UIiwgIkNvbnRpbnVlZCJ9LAorICB7IlNJR0NITEQiLCAiQ2hpbGQgc3RhdHVzIGNoYW5nZWQifSwKKyAgeyJTSUdUVElOIiwgIlN0b3BwZWQgKHR0eSBpbnB1dCkifSwKKyAgeyJTSUdUVE9VIiwgIlN0b3BwZWQgKHR0eSBvdXRwdXQpIn0sCisgIHsiU0lHSU8iLCAiSS9PIHBvc3NpYmxlIn0sCisgIHsiU0lHWENQVSIsICJDUFUgdGltZSBsaW1pdCBleGNlZWRlZCJ9LAorICB7IlNJR1hGU1oiLCAiRmlsZSBzaXplIGxpbWl0IGV4Y2VlZGVkIn0sCisgIHsiU0lHVlRBTFJNIiwgIlZpcnR1YWwgdGltZXIgZXhwaXJlZCJ9LAorICB7IlNJR1BST0YiLCAiUHJvZmlsaW5nIHRpbWVyIGV4cGlyZWQifSwKKyAgeyJTSUdXSU5DSCIsICJXaW5kb3cgc2l6ZSBjaGFuZ2VkIn0sCisgIHsiU0lHTE9TVCIsICJSZXNvdXJjZSBsb3N0In0sCisgIHsiU0lHVVNSMSIsICJVc2VyIGRlZmluZWQgc2lnbmFsIDEifSwKKyAgeyJTSUdVU1IyIiwgIlVzZXIgZGVmaW5lZCBzaWduYWwgMiJ9LAorICB7IlNJR1BXUiIsICJQb3dlciBmYWlsL3Jlc3RhcnQifSwKKyAgeyJTSUdQT0xMIiwgIlBvbGxhYmxlIGV2ZW50IG9jY3VycmVkIn0sCisgIHsiU0lHV0lORCIsICJTSUdXSU5EIn0sCisgIHsiU0lHUEhPTkUiLCAiU0lHUEhPTkUifSwKKyAgeyJTSUdXQUlUSU5HIiwgIlByb2Nlc3MncyBMV1BzIGFyZSBibG9ja2VkIn0sCisgIHsiU0lHTFdQIiwgIlNpZ25hbCBMV1AifSwKKyAgeyJTSUdEQU5HRVIiLCAiU3dhcCBzcGFjZSBkYW5nZXJvdXNseSBsb3cifSwKKyAgeyJTSUdHUkFOVCIsICJNb25pdG9yIG1vZGUgZ3JhbnRlZCJ9LAorICB7IlNJR1JFVFJBQ1QiLCAiTmVlZCB0byByZWxpbnF1aXNoIG1vbml0b3IgbW9kZSJ9LAorICB7IlNJR01TRyIsICJNb25pdG9yIG1vZGUgZGF0YSBhdmFpbGFibGUifSwKKyAgeyJTSUdTT1VORCIsICJTb3VuZCBjb21wbGV0ZWQifSwKKyAgeyJTSUdTQUsiLCAiU2VjdXJlIGF0dGVudGlvbiJ9LAorICB7IlNJR1BSSU8iLCAiU0lHUFJJTyJ9LAorICB7IlNJRzMzIiwgIlJlYWwtdGltZSBldmVudCAzMyJ9LAorICB7IlNJRzM0IiwgIlJlYWwtdGltZSBldmVudCAzNCJ9LAorICB7IlNJRzM1IiwgIlJlYWwtdGltZSBldmVudCAzNSJ9LAorICB7IlNJRzM2IiwgIlJlYWwtdGltZSBldmVudCAzNiJ9LAorICB7IlNJRzM3IiwgIlJlYWwtdGltZSBldmVudCAzNyJ9LAorICB7IlNJRzM4IiwgIlJlYWwtdGltZSBldmVudCAzOCJ9LAorICB7IlNJRzM5IiwgIlJlYWwtdGltZSBldmVudCAzOSJ9LAorICB7IlNJRzQwIiwgIlJlYWwtdGltZSBldmVudCA0MCJ9LAorICB7IlNJRzQxIiwgIlJlYWwtdGltZSBldmVudCA0MSJ9LAorICB7IlNJRzQyIiwgIlJlYWwtdGltZSBldmVudCA0MiJ9LAorICB7IlNJRzQzIiwgIlJlYWwtdGltZSBldmVudCA0MyJ9LAorICB7IlNJRzQ0IiwgIlJlYWwtdGltZSBldmVudCA0NCJ9LAorICB7IlNJRzQ1IiwgIlJlYWwtdGltZSBldmVudCA0NSJ9LAorICB7IlNJRzQ2IiwgIlJlYWwtdGltZSBldmVudCA0NiJ9LAorICB7IlNJRzQ3IiwgIlJlYWwtdGltZSBldmVudCA0NyJ9LAorICB7IlNJRzQ4IiwgIlJlYWwtdGltZSBldmVudCA0OCJ9LAorICB7IlNJRzQ5IiwgIlJlYWwtdGltZSBldmVudCA0OSJ9LAorICB7IlNJRzUwIiwgIlJlYWwtdGltZSBldmVudCA1MCJ9LAorICB7IlNJRzUxIiwgIlJlYWwtdGltZSBldmVudCA1MSJ9LAorICB7IlNJRzUyIiwgIlJlYWwtdGltZSBldmVudCA1MiJ9LAorICB7IlNJRzUzIiwgIlJlYWwtdGltZSBldmVudCA1MyJ9LAorICB7IlNJRzU0IiwgIlJlYWwtdGltZSBldmVudCA1NCJ9LAorICB7IlNJRzU1IiwgIlJlYWwtdGltZSBldmVudCA1NSJ9LAorICB7IlNJRzU2IiwgIlJlYWwtdGltZSBldmVudCA1NiJ9LAorICB7IlNJRzU3IiwgIlJlYWwtdGltZSBldmVudCA1NyJ9LAorICB7IlNJRzU4IiwgIlJlYWwtdGltZSBldmVudCA1OCJ9LAorICB7IlNJRzU5IiwgIlJlYWwtdGltZSBldmVudCA1OSJ9LAorICB7IlNJRzYwIiwgIlJlYWwtdGltZSBldmVudCA2MCJ9LAorICB7IlNJRzYxIiwgIlJlYWwtdGltZSBldmVudCA2MSJ9LAorICB7IlNJRzYyIiwgIlJlYWwtdGltZSBldmVudCA2MiJ9LAorICB7IlNJRzYzIiwgIlJlYWwtdGltZSBldmVudCA2MyJ9LAorCisjaWYgZGVmaW5lZChNQUNIKSB8fCBkZWZpbmVkKF9fTUFDSF9fKQorICAvKiBNYWNoIGV4Y2VwdGlvbnMgKi8KKyAgeyJFWENfQkFEX0FDQ0VTUyIsICJDb3VsZCBub3QgYWNjZXNzIG1lbW9yeSJ9LAorICB7IkVYQ19CQURfSU5TVFJVQ1RJT04iLCAiSWxsZWdhbCBpbnN0cnVjdGlvbi9vcGVyYW5kIn0sCisgIHsiRVhDX0FSSVRITUVUSUMiLCAiQXJpdGhtZXRpYyBleGNlcHRpb24ifSwKKyAgeyJFWENfRU1VTEFUSU9OIiwgIkVtdWxhdGlvbiBpbnN0cnVjdGlvbiJ9LAorICB7IkVYQ19TT0ZUV0FSRSIsICJTb2Z0d2FyZSBnZW5lcmF0ZWQgZXhjZXB0aW9uIn0sCisgIHsiRVhDX0JSRUFLUE9JTlQiLCAiQnJlYWtwb2ludCJ9LAorI2VuZGlmCisgIHtOVUxMLCAiVW5rbm93biBzaWduYWwifSwKKyAge05VTEwsICJJbnRlcm5hbCBlcnJvcjogcHJpbnRpbmcgVEFSR0VUX1NJR05BTF9ERUZBVUxUIn0sCisKKyAgLyogTGFzdCBlbnRyeSwgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZSB0YWJsZSBpcyB0aGUgcmlnaHQgc2l6ZS4gICovCisgIHtOVUxMLCAiVEFSR0VUX1NJR05BTF9NQUdJQyJ9Cit9OworCisvKiBSZXR1cm4gdGhlIHN0cmluZyBmb3IgYSBzaWduYWwuICAqLworY2hhciAqCit0YXJnZXRfc2lnbmFsX3RvX3N0cmluZyAoc2lnKQorICAgICBlbnVtIHRhcmdldF9zaWduYWwgc2lnOworeworICByZXR1cm4gc2lnbmFsc1tzaWddLnN0cmluZzsKK30KKworLyogUmV0dXJuIHRoZSBuYW1lIGZvciBhIHNpZ25hbC4gICovCitjaGFyICoKK3RhcmdldF9zaWduYWxfdG9fbmFtZSAoc2lnKQorICAgICBlbnVtIHRhcmdldF9zaWduYWwgc2lnOworeworICBpZiAoc2lnID09IFRBUkdFVF9TSUdOQUxfVU5LTk9XTikKKyAgICAvKiBJIHRoaW5rIHRoZSBjb2RlIHdoaWNoIHByaW50cyB0aGlzIHdpbGwgYWx3YXlzIHByaW50IGl0IGFsb25nIHdpdGgKKyAgICAgICB0aGUgc3RyaW5nLCBzbyBubyBuZWVkIHRvIGJlIHZlcmJvc2UuICAqLworICAgIHJldHVybiAiPyI7CisgIHJldHVybiBzaWduYWxzW3NpZ10ubmFtZTsKK30KKworLyogR2l2ZW4gYSBuYW1lLCByZXR1cm4gaXRzIHNpZ25hbC4gICovCitlbnVtIHRhcmdldF9zaWduYWwKK3RhcmdldF9zaWduYWxfZnJvbV9uYW1lIChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICBlbnVtIHRhcmdldF9zaWduYWwgc2lnOworCisgIC8qIEl0J3MgcG9zc2libGUgd2UgYWxzbyBzaG91bGQgYWxsb3cgIlNJR0NMRCIgYXMgd2VsbCBhcyAiU0lHQ0hMRCIKKyAgICAgZm9yIFRBUkdFVF9TSUdOQUxfU0lHQ0hMRC4gIFNJR0lPVCwgb24gdGhlIG90aGVyIGhhbmQsIGlzIG1vcmUKKyAgICAgcXVlc3Rpb25hYmxlOyBzZWVtcyBsaWtlIGJ5IG5vdyBwZW9wbGUgc2hvdWxkIGNhbGwgaXQgU0lHQUJSVAorICAgICBpbnN0ZWFkLiAgKi8KKworICAvKiBUaGlzIHVnbHkgY2FzdCBicm91Z2h0IHRvIHlvdSBieSB0aGUgbmF0aXZlIFZBWCBjb21waWxlci4gICovCisgIGZvciAoc2lnID0gVEFSR0VUX1NJR05BTF9IVVA7CisgICAgICAgc2lnbmFsc1tzaWddLm5hbWUgIT0gTlVMTDsKKyAgICAgICBzaWcgPSAoZW51bSB0YXJnZXRfc2lnbmFsKSgoaW50KXNpZyArIDEpKQorICAgIGlmIChTVFJFUSAobmFtZSwgc2lnbmFsc1tzaWddLm5hbWUpKQorICAgICAgcmV0dXJuIHNpZzsKKyAgcmV0dXJuIFRBUkdFVF9TSUdOQUxfVU5LTk9XTjsKK30KKwwKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB0byBoZWxwIGNlcnRhaW4gdGFyZ2V0cyBkZWFsCisgICB3aXRoIHRoZSBzaWduYWwvd2FpdHN0YXR1cyBzdHVmZi4gIFRoZXkgY291bGQganVzdCBhcyB3ZWxsIGJlIGluCisgICBhIGZpbGUgY2FsbGVkIG5hdGl2ZS11dGlscy5jIG9yIHVuaXh3YWl0c3RhdHVzLXV0aWxzLmMgb3Igd2hhdGV2ZXIuICAqLworCisvKiBDb252ZXJ0IGhvc3Qgc2lnbmFsIHRvIG91ciBzaWduYWxzLiAgKi8KK2VudW0gdGFyZ2V0X3NpZ25hbAordGFyZ2V0X3NpZ25hbF9mcm9tX2hvc3QgKGhvc3RzaWcpCisgICAgIGludCBob3N0c2lnOworeworICAvKiBBIHN3aXRjaCBzdGF0ZW1lbnQgd291bGQgbWFrZSBzZW5zZSBidXQgd291bGQgcmVxdWlyZSBzcGVjaWFsIGtsdWRnZXMKKyAgICAgdG8gZGVhbCB3aXRoIHRoZSBjYXNlcyB3aGVyZSBtb3JlIHRoYW4gb25lIHNpZ25hbCBoYXMgdGhlIHNhbWUgbnVtYmVyLiAgKi8KKworICBpZiAoaG9zdHNpZyA9PSAwKSByZXR1cm4gVEFSR0VUX1NJR05BTF8wOworCisjaWYgZGVmaW5lZCAoU0lHSFVQKQorICBpZiAoaG9zdHNpZyA9PSBTSUdIVVApIHJldHVybiBUQVJHRVRfU0lHTkFMX0hVUDsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0lOVCkKKyAgaWYgKGhvc3RzaWcgPT0gU0lHSU5UKSByZXR1cm4gVEFSR0VUX1NJR05BTF9JTlQ7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdRVUlUKQorICBpZiAoaG9zdHNpZyA9PSBTSUdRVUlUKSByZXR1cm4gVEFSR0VUX1NJR05BTF9RVUlUOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHSUxMKQorICBpZiAoaG9zdHNpZyA9PSBTSUdJTEwpIHJldHVybiBUQVJHRVRfU0lHTkFMX0lMTDsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1RSQVApCisgIGlmIChob3N0c2lnID09IFNJR1RSQVApIHJldHVybiBUQVJHRVRfU0lHTkFMX1RSQVA7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdBQlJUKQorICBpZiAoaG9zdHNpZyA9PSBTSUdBQlJUKSByZXR1cm4gVEFSR0VUX1NJR05BTF9BQlJUOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHRU1UKQorICBpZiAoaG9zdHNpZyA9PSBTSUdFTVQpIHJldHVybiBUQVJHRVRfU0lHTkFMX0VNVDsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0ZQRSkKKyAgaWYgKGhvc3RzaWcgPT0gU0lHRlBFKSByZXR1cm4gVEFSR0VUX1NJR05BTF9GUEU7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdLSUxMKQorICBpZiAoaG9zdHNpZyA9PSBTSUdLSUxMKSByZXR1cm4gVEFSR0VUX1NJR05BTF9LSUxMOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHQlVTKQorICBpZiAoaG9zdHNpZyA9PSBTSUdCVVMpIHJldHVybiBUQVJHRVRfU0lHTkFMX0JVUzsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1NFR1YpCisgIGlmIChob3N0c2lnID09IFNJR1NFR1YpIHJldHVybiBUQVJHRVRfU0lHTkFMX1NFR1Y7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdTWVMpCisgIGlmIChob3N0c2lnID09IFNJR1NZUykgcmV0dXJuIFRBUkdFVF9TSUdOQUxfU1lTOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHUElQRSkKKyAgaWYgKGhvc3RzaWcgPT0gU0lHUElQRSkgcmV0dXJuIFRBUkdFVF9TSUdOQUxfUElQRTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0FMUk0pCisgIGlmIChob3N0c2lnID09IFNJR0FMUk0pIHJldHVybiBUQVJHRVRfU0lHTkFMX0FMUk07CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdURVJNKQorICBpZiAoaG9zdHNpZyA9PSBTSUdURVJNKSByZXR1cm4gVEFSR0VUX1NJR05BTF9URVJNOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHVVNSMSkKKyAgaWYgKGhvc3RzaWcgPT0gU0lHVVNSMSkgcmV0dXJuIFRBUkdFVF9TSUdOQUxfVVNSMTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1VTUjIpCisgIGlmIChob3N0c2lnID09IFNJR1VTUjIpIHJldHVybiBUQVJHRVRfU0lHTkFMX1VTUjI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdDTEQpCisgIGlmIChob3N0c2lnID09IFNJR0NMRCkgcmV0dXJuIFRBUkdFVF9TSUdOQUxfQ0hMRDsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0NITEQpCisgIGlmIChob3N0c2lnID09IFNJR0NITEQpIHJldHVybiBUQVJHRVRfU0lHTkFMX0NITEQ7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdQV1IpCisgIGlmIChob3N0c2lnID09IFNJR1BXUikgcmV0dXJuIFRBUkdFVF9TSUdOQUxfUFdSOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHV0lOQ0gpCisgIGlmIChob3N0c2lnID09IFNJR1dJTkNIKSByZXR1cm4gVEFSR0VUX1NJR05BTF9XSU5DSDsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1VSRykKKyAgaWYgKGhvc3RzaWcgPT0gU0lHVVJHKSByZXR1cm4gVEFSR0VUX1NJR05BTF9VUkc7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdJTykKKyAgaWYgKGhvc3RzaWcgPT0gU0lHSU8pIHJldHVybiBUQVJHRVRfU0lHTkFMX0lPOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHUE9MTCkKKyAgaWYgKGhvc3RzaWcgPT0gU0lHUE9MTCkgcmV0dXJuIFRBUkdFVF9TSUdOQUxfUE9MTDsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1NUT1ApCisgIGlmIChob3N0c2lnID09IFNJR1NUT1ApIHJldHVybiBUQVJHRVRfU0lHTkFMX1NUT1A7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdUU1RQKQorICBpZiAoaG9zdHNpZyA9PSBTSUdUU1RQKSByZXR1cm4gVEFSR0VUX1NJR05BTF9UU1RQOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHQ09OVCkKKyAgaWYgKGhvc3RzaWcgPT0gU0lHQ09OVCkgcmV0dXJuIFRBUkdFVF9TSUdOQUxfQ09OVDsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1RUSU4pCisgIGlmIChob3N0c2lnID09IFNJR1RUSU4pIHJldHVybiBUQVJHRVRfU0lHTkFMX1RUSU47CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdUVE9VKQorICBpZiAoaG9zdHNpZyA9PSBTSUdUVE9VKSByZXR1cm4gVEFSR0VUX1NJR05BTF9UVE9VOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHVlRBTFJNKQorICBpZiAoaG9zdHNpZyA9PSBTSUdWVEFMUk0pIHJldHVybiBUQVJHRVRfU0lHTkFMX1ZUQUxSTTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1BST0YpCisgIGlmIChob3N0c2lnID09IFNJR1BST0YpIHJldHVybiBUQVJHRVRfU0lHTkFMX1BST0Y7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdYQ1BVKQorICBpZiAoaG9zdHNpZyA9PSBTSUdYQ1BVKSByZXR1cm4gVEFSR0VUX1NJR05BTF9YQ1BVOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHWEZTWikKKyAgaWYgKGhvc3RzaWcgPT0gU0lHWEZTWikgcmV0dXJuIFRBUkdFVF9TSUdOQUxfWEZTWjsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1dJTkQpCisgIGlmIChob3N0c2lnID09IFNJR1dJTkQpIHJldHVybiBUQVJHRVRfU0lHTkFMX1dJTkQ7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdQSE9ORSkKKyAgaWYgKGhvc3RzaWcgPT0gU0lHUEhPTkUpIHJldHVybiBUQVJHRVRfU0lHTkFMX1BIT05FOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHTE9TVCkKKyAgaWYgKGhvc3RzaWcgPT0gU0lHTE9TVCkgcmV0dXJuIFRBUkdFVF9TSUdOQUxfTE9TVDsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1dBSVRJTkcpCisgIGlmIChob3N0c2lnID09IFNJR1dBSVRJTkcpIHJldHVybiBUQVJHRVRfU0lHTkFMX1dBSVRJTkc7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdMV1ApCisgIGlmIChob3N0c2lnID09IFNJR0xXUCkgcmV0dXJuIFRBUkdFVF9TSUdOQUxfTFdQOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHREFOR0VSKQorICBpZiAoaG9zdHNpZyA9PSBTSUdEQU5HRVIpIHJldHVybiBUQVJHRVRfU0lHTkFMX0RBTkdFUjsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0dSQU5UKQorICBpZiAoaG9zdHNpZyA9PSBTSUdHUkFOVCkgcmV0dXJuIFRBUkdFVF9TSUdOQUxfR1JBTlQ7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdSRVRSQUNUKQorICBpZiAoaG9zdHNpZyA9PSBTSUdSRVRSQUNUKSByZXR1cm4gVEFSR0VUX1NJR05BTF9SRVRSQUNUOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHTVNHKQorICBpZiAoaG9zdHNpZyA9PSBTSUdNU0cpIHJldHVybiBUQVJHRVRfU0lHTkFMX01TRzsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1NPVU5EKQorICBpZiAoaG9zdHNpZyA9PSBTSUdTT1VORCkgcmV0dXJuIFRBUkdFVF9TSUdOQUxfU09VTkQ7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdTQUspCisgIGlmIChob3N0c2lnID09IFNJR1NBSykgcmV0dXJuIFRBUkdFVF9TSUdOQUxfU0FLOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHUFJJTykKKyAgaWYgKGhvc3RzaWcgPT0gU0lHUFJJTykgcmV0dXJuIFRBUkdFVF9TSUdOQUxfUFJJTzsKKyNlbmRpZgorCisgIC8qIE1hY2ggZXhjZXB0aW9ucy4gIEFzc3VtZXMgdGhhdCB0aGUgdmFsdWVzIGZvciBFWENfIGFyZSBwb3NpdGl2ZSEgKi8KKyNpZiBkZWZpbmVkIChFWENfQkFEX0FDQ0VTUykgJiYgZGVmaW5lZCAoX05TSUcpCisgIGlmIChob3N0c2lnID09IF9OU0lHICsgRVhDX0JBRF9BQ0NFU1MpIHJldHVybiBUQVJHRVRfRVhDX0JBRF9BQ0NFU1M7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChFWENfQkFEX0lOU1RSVUNUSU9OKSAmJiBkZWZpbmVkIChfTlNJRykKKyAgaWYgKGhvc3RzaWcgPT0gX05TSUcgKyBFWENfQkFEX0lOU1RSVUNUSU9OKSByZXR1cm4gVEFSR0VUX0VYQ19CQURfSU5TVFJVQ1RJT047CisjZW5kaWYKKyNpZiBkZWZpbmVkIChFWENfQVJJVEhNRVRJQykgJiYgZGVmaW5lZCAoX05TSUcpCisgIGlmIChob3N0c2lnID09IF9OU0lHICsgRVhDX0FSSVRITUVUSUMpIHJldHVybiBUQVJHRVRfRVhDX0FSSVRITUVUSUM7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChFWENfRU1VTEFUSU9OKSAmJiBkZWZpbmVkIChfTlNJRykKKyAgaWYgKGhvc3RzaWcgPT0gX05TSUcgKyBFWENfRU1VTEFUSU9OKSByZXR1cm4gVEFSR0VUX0VYQ19FTVVMQVRJT047CisjZW5kaWYKKyNpZiBkZWZpbmVkIChFWENfU09GVFdBUkUpICYmIGRlZmluZWQgKF9OU0lHKQorICBpZiAoaG9zdHNpZyA9PSBfTlNJRyArIEVYQ19TT0ZUV0FSRSkgcmV0dXJuIFRBUkdFVF9FWENfU09GVFdBUkU7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChFWENfQlJFQUtQT0lOVCkgJiYgZGVmaW5lZCAoX05TSUcpCisgIGlmIChob3N0c2lnID09IF9OU0lHICsgRVhDX0JSRUFLUE9JTlQpIHJldHVybiBUQVJHRVRfRVhDX0JSRUFLUE9JTlQ7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKFJFQUxUSU1FX0xPKQorICBpZiAoaG9zdHNpZyA+PSBSRUFMVElNRV9MTyAmJiBob3N0c2lnIDwgUkVBTFRJTUVfSEkpCisgICAgcmV0dXJuIChlbnVtIHRhcmdldF9zaWduYWwpCisgICAgICAoaG9zdHNpZyAtIDMzICsgKGludCkgVEFSR0VUX1NJR05BTF9SRUFMVElNRV8zMyk7CisjZW5kaWYKKyAgcmV0dXJuIFRBUkdFVF9TSUdOQUxfVU5LTk9XTjsKK30KKworaW50Cit0YXJnZXRfc2lnbmFsX3RvX2hvc3QgKG91cnNpZykKKyAgICAgZW51bSB0YXJnZXRfc2lnbmFsIG91cnNpZzsKK3sKKyAgc3dpdGNoIChvdXJzaWcpCisgICAgeworICAgIGNhc2UgVEFSR0VUX1NJR05BTF8wOiByZXR1cm4gMDsKKworI2lmIGRlZmluZWQgKFNJR0hVUCkKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfSFVQOiByZXR1cm4gU0lHSFVQOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHSU5UKQorICAgIGNhc2UgVEFSR0VUX1NJR05BTF9JTlQ6IHJldHVybiBTSUdJTlQ7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdRVUlUKQorICAgIGNhc2UgVEFSR0VUX1NJR05BTF9RVUlUOiByZXR1cm4gU0lHUVVJVDsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0lMTCkKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfSUxMOiByZXR1cm4gU0lHSUxMOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHVFJBUCkKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfVFJBUDogcmV0dXJuIFNJR1RSQVA7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdBQlJUKQorICAgIGNhc2UgVEFSR0VUX1NJR05BTF9BQlJUOiByZXR1cm4gU0lHQUJSVDsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0VNVCkKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfRU1UOiByZXR1cm4gU0lHRU1UOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHRlBFKQorICAgIGNhc2UgVEFSR0VUX1NJR05BTF9GUEU6IHJldHVybiBTSUdGUEU7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdLSUxMKQorICAgIGNhc2UgVEFSR0VUX1NJR05BTF9LSUxMOiByZXR1cm4gU0lHS0lMTDsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0JVUykKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfQlVTOiByZXR1cm4gU0lHQlVTOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHU0VHVikKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfU0VHVjogcmV0dXJuIFNJR1NFR1Y7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdTWVMpCisgICAgY2FzZSBUQVJHRVRfU0lHTkFMX1NZUzogcmV0dXJuIFNJR1NZUzsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1BJUEUpCisgICAgY2FzZSBUQVJHRVRfU0lHTkFMX1BJUEU6IHJldHVybiBTSUdQSVBFOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHQUxSTSkKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfQUxSTTogcmV0dXJuIFNJR0FMUk07CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdURVJNKQorICAgIGNhc2UgVEFSR0VUX1NJR05BTF9URVJNOiByZXR1cm4gU0lHVEVSTTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1VTUjEpCisgICAgY2FzZSBUQVJHRVRfU0lHTkFMX1VTUjE6IHJldHVybiBTSUdVU1IxOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHVVNSMikKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfVVNSMjogcmV0dXJuIFNJR1VTUjI7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdDSExEKSB8fCBkZWZpbmVkIChTSUdDTEQpCisgICAgY2FzZSBUQVJHRVRfU0lHTkFMX0NITEQ6IAorI2lmIGRlZmluZWQgKFNJR0NITEQpCisgICAgICByZXR1cm4gU0lHQ0hMRDsKKyNlbHNlCisgICAgICByZXR1cm4gU0lHQ0xEOworI2VuZGlmCisjZW5kaWYgLyogU0lHQ0xEIG9yIFNJR0NITEQgKi8KKyNpZiBkZWZpbmVkIChTSUdQV1IpCisgICAgY2FzZSBUQVJHRVRfU0lHTkFMX1BXUjogcmV0dXJuIFNJR1BXUjsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1dJTkNIKQorICAgIGNhc2UgVEFSR0VUX1NJR05BTF9XSU5DSDogcmV0dXJuIFNJR1dJTkNIOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHVVJHKQorICAgIGNhc2UgVEFSR0VUX1NJR05BTF9VUkc6IHJldHVybiBTSUdVUkc7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdJTykKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfSU86IHJldHVybiBTSUdJTzsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1BPTEwpCisgICAgY2FzZSBUQVJHRVRfU0lHTkFMX1BPTEw6IHJldHVybiBTSUdQT0xMOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHU1RPUCkKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfU1RPUDogcmV0dXJuIFNJR1NUT1A7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdUU1RQKQorICAgIGNhc2UgVEFSR0VUX1NJR05BTF9UU1RQOiByZXR1cm4gU0lHVFNUUDsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0NPTlQpCisgICAgY2FzZSBUQVJHRVRfU0lHTkFMX0NPTlQ6IHJldHVybiBTSUdDT05UOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHVFRJTikKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfVFRJTjogcmV0dXJuIFNJR1RUSU47CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdUVE9VKQorICAgIGNhc2UgVEFSR0VUX1NJR05BTF9UVE9VOiByZXR1cm4gU0lHVFRPVTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1ZUQUxSTSkKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfVlRBTFJNOiByZXR1cm4gU0lHVlRBTFJNOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHUFJPRikKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfUFJPRjogcmV0dXJuIFNJR1BST0Y7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdYQ1BVKQorICAgIGNhc2UgVEFSR0VUX1NJR05BTF9YQ1BVOiByZXR1cm4gU0lHWENQVTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1hGU1opCisgICAgY2FzZSBUQVJHRVRfU0lHTkFMX1hGU1o6IHJldHVybiBTSUdYRlNaOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHV0lORCkKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfV0lORDogcmV0dXJuIFNJR1dJTkQ7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdQSE9ORSkKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfUEhPTkU6IHJldHVybiBTSUdQSE9ORTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0xPU1QpCisgICAgY2FzZSBUQVJHRVRfU0lHTkFMX0xPU1Q6IHJldHVybiBTSUdMT1NUOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHV0FJVElORykKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfV0FJVElORzogcmV0dXJuIFNJR1dBSVRJTkc7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdMV1ApCisgICAgY2FzZSBUQVJHRVRfU0lHTkFMX0xXUDogcmV0dXJuIFNJR0xXUDsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR0RBTkdFUikKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfREFOR0VSOiByZXR1cm4gU0lHREFOR0VSOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHR1JBTlQpCisgICAgY2FzZSBUQVJHRVRfU0lHTkFMX0dSQU5UOiByZXR1cm4gU0lHR1JBTlQ7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdSRVRSQUNUKQorICAgIGNhc2UgVEFSR0VUX1NJR05BTF9SRVRSQUNUOiByZXR1cm4gU0lHUkVUUkFDVDsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR01TRykKKyAgICBjYXNlIFRBUkdFVF9TSUdOQUxfTVNHOiByZXR1cm4gU0lHTVNHOworI2VuZGlmCisjaWYgZGVmaW5lZCAoU0lHU09VTkQpCisgICAgY2FzZSBUQVJHRVRfU0lHTkFMX1NPVU5EOiByZXR1cm4gU0lHU09VTkQ7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChTSUdTQUspCisgICAgY2FzZSBUQVJHRVRfU0lHTkFMX1NBSzogcmV0dXJuIFNJR1NBSzsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1BSSU8pCisgICAgY2FzZSBUQVJHRVRfU0lHTkFMX1BSSU86IHJldHVybiBTSUdQUklPOworI2VuZGlmCisKKyAgICAgIC8qIE1hY2ggZXhjZXB0aW9ucy4gIEFzc3VtZXMgdGhhdCB0aGUgdmFsdWVzIGZvciBFWENfIGFyZSBwb3NpdGl2ZSEgKi8KKyNpZiBkZWZpbmVkIChFWENfQkFEX0FDQ0VTUykgJiYgZGVmaW5lZCAoX05TSUcpCisgICAgY2FzZSBUQVJHRVRfRVhDX0JBRF9BQ0NFU1M6IHJldHVybiBfTlNJRyArIEVYQ19CQURfQUNDRVNTOworI2VuZGlmCisjaWYgZGVmaW5lZCAoRVhDX0JBRF9JTlNUUlVDVElPTikgJiYgZGVmaW5lZCAoX05TSUcpCisgICAgY2FzZSBUQVJHRVRfRVhDX0JBRF9JTlNUUlVDVElPTjogcmV0dXJuIF9OU0lHICsgRVhDX0JBRF9JTlNUUlVDVElPTjsKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVYQ19BUklUSE1FVElDKSAmJiBkZWZpbmVkIChfTlNJRykKKyAgICBjYXNlIFRBUkdFVF9FWENfQVJJVEhNRVRJQzogcmV0dXJuIF9OU0lHICsgRVhDX0FSSVRITUVUSUM7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChFWENfRU1VTEFUSU9OKSAmJiBkZWZpbmVkIChfTlNJRykKKyAgICBjYXNlIFRBUkdFVF9FWENfRU1VTEFUSU9OOiByZXR1cm4gX05TSUcgKyBFWENfRU1VTEFUSU9OOworI2VuZGlmCisjaWYgZGVmaW5lZCAoRVhDX1NPRlRXQVJFKSAmJiBkZWZpbmVkIChfTlNJRykKKyAgICBjYXNlIFRBUkdFVF9FWENfU09GVFdBUkU6IHJldHVybiBfTlNJRyArIEVYQ19TT0ZUV0FSRTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKEVYQ19CUkVBS1BPSU5UKSAmJiBkZWZpbmVkIChfTlNJRykKKyAgICBjYXNlIFRBUkdFVF9FWENfQlJFQUtQT0lOVDogcmV0dXJuIF9OU0lHICsgRVhDX0JSRUFLUE9JTlQ7CisjZW5kaWYKKworICAgIGRlZmF1bHQ6CisjaWYgZGVmaW5lZCAoUkVBTFRJTUVfTE8pCisgICAgICBpZiAob3Vyc2lnID49IFRBUkdFVF9TSUdOQUxfUkVBTFRJTUVfMzMKKwkgICYmIG91cnNpZyA8PSBUQVJHRVRfU0lHTkFMX1JFQUxUSU1FXzYzKQorCXsKKwkgIGludCByZXRzaWcgPQorCSAgICAoaW50KW91cnNpZyAtIChpbnQpVEFSR0VUX1NJR05BTF9SRUFMVElNRV8zMyArIFJFQUxUSU1FX0xPOworCSAgaWYgKHJldHNpZyA8IFJFQUxUSU1FX0hJKQorCSAgICByZXR1cm4gcmV0c2lnOworCX0KKyNlbmRpZgorICAgICAgLyogVGhlIHVzZXIgbWlnaHQgYmUgdHJ5aW5nIHRvIGRvICJzaWduYWwgU0lHU0FLIiB3aGVyZSB0aGlzIHN5c3RlbQorCSBkb2Vzbid0IGhhdmUgU0lHU0FLLiAgKi8KKyAgICAgIHdhcm5pbmcgKCJTaWduYWwgJXMgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBzeXN0ZW0uXG4iLAorCSAgICAgICB0YXJnZXRfc2lnbmFsX3RvX25hbWUgKG91cnNpZykpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGNoaWxkX3dhaXQgYW5kIHRoZSBMeW54IGRlcml2YXRpdmVzIG9mIGNoaWxkX3dhaXQuCisgICBIT1NUU1RBVFVTIGlzIHRoZSB3YWl0c3RhdHVzIGZyb20gd2FpdCgpIG9yIHRoZSBlcXVpdmFsZW50OyBzdG9yZSBvdXIKKyAgIHRyYW5zbGF0aW9uIG9mIHRoYXQgaW4gT1VSU1RBVFVTLiAgKi8KK3ZvaWQKK3N0b3JlX3dhaXRzdGF0dXMgKG91cnN0YXR1cywgaG9zdHN0YXR1cykKKyAgICAgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpvdXJzdGF0dXM7CisgICAgIGludCBob3N0c3RhdHVzOworeworI2lmZGVmIENISUxEX1NQRUNJQUxfV0FJVFNUQVRVUworICAvKiBDSElMRF9TUEVDSUFMX1dBSVRTVEFUVVMgc2hvdWxkIHJldHVybiBub256ZXJvIGFuZCBzZXQgKk9VUlNUQVRVUworICAgICBpZiBpdCB3YW50cyB0byBkZWFsIHdpdGggaG9zdHN0YXR1cy4gICovCisgIGlmIChDSElMRF9TUEVDSUFMX1dBSVRTVEFUVVMgKG91cnN0YXR1cywgaG9zdHN0YXR1cykpCisgICAgcmV0dXJuOworI2VuZGlmCisKKyAgaWYgKFdJRkVYSVRFRCAoaG9zdHN0YXR1cykpCisgICAgeworICAgICAgb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0VYSVRFRDsKKyAgICAgIG91cnN0YXR1cy0+dmFsdWUuaW50ZWdlciA9IFdFWElUU1RBVFVTIChob3N0c3RhdHVzKTsKKyAgICB9CisgIGVsc2UgaWYgKCFXSUZTVE9QUEVEIChob3N0c3RhdHVzKSkKKyAgICB7CisgICAgICBvdXJzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU0lHTkFMTEVEOworICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSB0YXJnZXRfc2lnbmFsX2Zyb21faG9zdCAoV1RFUk1TSUcgKGhvc3RzdGF0dXMpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBvdXJzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKKyAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gdGFyZ2V0X3NpZ25hbF9mcm9tX2hvc3QgKFdTVE9QU0lHIChob3N0c3RhdHVzKSk7CisgICAgfQorfQorDAorLyogSW4gc29tZSBjaXJjdW1zdGFuY2VzIHdlIGFsbG93IGEgY29tbWFuZCB0byBzcGVjaWZ5IGEgbnVtZXJpYworICAgc2lnbmFsLiAgVGhlIGlkZWEgaXMgdG8ga2VlcCB0aGVzZSBjaXJjdW1zdGFuY2VzIGxpbWl0ZWQgc28gdGhhdAorICAgdXNlcnMgKGFuZCBzY3JpcHRzKSBkZXZlbG9wIHBvcnRhYmxlIGhhYml0cy4gIEZvciBjb21wYXJpc29uLAorICAgUE9TSVguMiBga2lsbCcgcmVxdWlyZXMgdGhhdCAxLDIsMyw2LDksMTQsIGFuZCAxNSB3b3JrIChhbmQgdXNpbmcgYQorICAgbnVtZXJpYyBzaWduYWwgYXQgYWxsIGlzIG9ic2NlbGVzY2VudC4gIFdlIGFyZSBzbGlnaHRseSBtb3JlCisgICBsZW5pZW50IGFuZCBhbGxvdyAxLTE1IHdoaWNoIHNob3VsZCBtYXRjaCBob3N0IHNpZ25hbCBudW1iZXJzIG9uCisgICBtb3N0IHN5c3RlbXMuICBVc2Ugb2Ygc3ltYm9saWMgc2lnbmFsIG5hbWVzIGlzIHN0cm9uZ2x5IGVuY291cmFnZWQuICAqLworCitlbnVtIHRhcmdldF9zaWduYWwKK3RhcmdldF9zaWduYWxfZnJvbV9jb21tYW5kIChudW0pCisgICAgIGludCBudW07Cit7CisgIGlmIChudW0gPj0gMSAmJiBudW0gPD0gMTUpCisgICAgcmV0dXJuIChlbnVtIHRhcmdldF9zaWduYWwpbnVtOworICBlcnJvciAoIk9ubHkgc2lnbmFscyAxLTE1IGFyZSB2YWxpZCBhcyBudW1lcmljIHNpZ25hbHMuXG5cCitVc2UgXCJpbmZvIHNpZ25hbHNcIiBmb3IgYSBsaXN0IG9mIHN5bWJvbGljIHNpZ25hbHMuIik7Cit9CisMCisvKiBSZXR1cm5zIHplcm8gdG8gbGVhdmUgdGhlIGluZmVyaW9yIGFsb25lLCBvbmUgdG8gaW50ZXJydXB0IGl0LiAgKi8KK2ludCAoKnRhcmdldF9hY3Rpdml0eV9mdW5jdGlvbikgUEFSQU1TICgodm9pZCkpOworaW50IHRhcmdldF9hY3Rpdml0eV9mZDsKKwwKKy8qIENvbnZlcnQgYSBub3JtYWwgcHJvY2VzcyBJRCB0byBhIHN0cmluZy4gIFJldHVybnMgdGhlIHN0cmluZyBpbiBhIHN0YXRpYworICAgYnVmZmVyLiAgKi8KKworY2hhciAqCitub3JtYWxfcGlkX3RvX3N0ciAocGlkKQorICAgICBpbnQgcGlkOworeworICBzdGF0aWMgY2hhciBidWZbMzBdOworCisgIGlmIChTVFJFUSAoY3VycmVudF90YXJnZXQudG9fc2hvcnRuYW1lLCAicmVtb3RlIikpCisgICAgc3ByaW50ZiAoYnVmLCAidGhyZWFkICVkXDAiLCBwaWQpOworICBlbHNlCisgICAgc3ByaW50ZiAoYnVmLCAicHJvY2VzcyAlZFwwIiwgcGlkKTsKKworICByZXR1cm4gYnVmOworfQorCisvKiBTb21lIHRhcmdldHMgKHN1Y2ggYXMgdHRyYWNlLWJhc2VkIEhQVVgpIGRvbid0IGFsbG93IHVzIHRvIHJlcXVlc3QKKyAgIG5vdGlmaWNhdGlvbiBvZiBpbmZlcmlvciBldmVudHMgc3VjaCBhcyBmb3JrIGFuZCB2b3JrIGltbWVkaWF0ZWx5CisgICBhZnRlciB0aGUgaW5mZXJpb3IgaXMgY3JlYXRlZC4gIChUaGlzIGJlY2F1c2Ugb2YgaG93IGdkYiBnZXRzIGFuCisgICBpbmZlcmlvciBjcmVhdGVkIHZpYSBpbnZva2luZyBhIHNoZWxsIHRvIGRvIGl0LiAgSW4gc3VjaCBhIHNjZW5hcmlvLAorICAgaWYgdGhlIHNoZWxsIGluaXQgZmlsZSBoYXMgY29tbWFuZHMgaW4gaXQsIHRoZSBzaGVsbCB3aWxsIGZvcmsgYW5kCisgICBleGVjIGZvciBlYWNoIG9mIHRob3NlIGNvbW1hbmRzLCBhbmQgd2Ugd2lsbCBzZWUgZWFjaCBzdWNoIGZvcmsKKyAgIGV2ZW50LiAgVmVyeSBiYWQuKQorICAgCisgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgYWxsIHRhcmdldHMgdGhhdCBhbGxvdyB1cyB0byByZXF1ZXN0CisgICBub3RpZmljYXRpb24gb2YgZm9ya3MsIGV0YyBhdCBpbmZlcmlvciBjcmVhdGlvbiB0aW1lOyBlLmcuLCBpbgorICAgdGFyZ2V0X2Fja25vd2xlZGdlX2ZvcmtlZF9jaGlsZC4KKyAgICovCit2b2lkCitub3JtYWxfdGFyZ2V0X3Bvc3Rfc3RhcnR1cF9pbmZlcmlvciAocGlkKQorICBpbnQgIHBpZDsKK3sKKyAgLyogVGhpcyBzcGFjZSBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuICovCit9CisKKy8qIFNldCB1cCB0aGUgaGFuZGZ1bCBvZiBub24tZW1wdHkgc2xvdHMgbmVlZGVkIGJ5IHRoZSBkdW1teSB0YXJnZXQKKyAgIHZlY3Rvci4gICovCisKK3N0YXRpYyB2b2lkCitpbml0X2R1bW15X3RhcmdldCAoKQoreworICBkdW1teV90YXJnZXQudG9fc2hvcnRuYW1lID0gIk5vbmUiOworICBkdW1teV90YXJnZXQudG9fbG9uZ25hbWUgPSAiTm9uZSI7CisgIGR1bW15X3RhcmdldC50b19kb2MgPSAiIjsKKyAgZHVtbXlfdGFyZ2V0LnRvX2F0dGFjaCA9IGZpbmRfZGVmYXVsdF9hdHRhY2g7CisgIGR1bW15X3RhcmdldC50b19yZXF1aXJlX2F0dGFjaCA9IGZpbmRfZGVmYXVsdF9yZXF1aXJlX2F0dGFjaDsKKyAgZHVtbXlfdGFyZ2V0LnRvX3JlcXVpcmVfZGV0YWNoID0gZmluZF9kZWZhdWx0X3JlcXVpcmVfZGV0YWNoOworICBkdW1teV90YXJnZXQudG9fY3JlYXRlX2luZmVyaW9yID0gZmluZF9kZWZhdWx0X2NyZWF0ZV9pbmZlcmlvcjsKKyAgZHVtbXlfdGFyZ2V0LnRvX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IgPSBmaW5kX2RlZmF1bHRfY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvcjsKKyAgZHVtbXlfdGFyZ2V0LnRvX3N0cmF0dW0gPSBkdW1teV9zdHJhdHVtOworICBkdW1teV90YXJnZXQudG9fbWFnaWMgPSBPUFNfTUFHSUM7Cit9CisKKwwKKyNpZmRlZiBNQUlOVEVOQU5DRV9DTURTCitzdGF0aWMgc3RydWN0IHRhcmdldF9vcHMgZGVidWdfdGFyZ2V0OworCitzdGF0aWMgdm9pZAorZGVidWdfdG9fb3BlbiAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZGVidWdfdGFyZ2V0LnRvX29wZW4gKGFyZ3MsIGZyb21fdHR5KTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ0YXJnZXRfb3BlbiAoJXMsICVkKVxuIiwgYXJncywgZnJvbV90dHkpOworfQorCitzdGF0aWMgdm9pZAorZGVidWdfdG9fY2xvc2UgKHF1aXR0aW5nKQorICAgICBpbnQgcXVpdHRpbmc7Cit7CisgIGRlYnVnX3RhcmdldC50b19jbG9zZSAocXVpdHRpbmcpOworCisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgInRhcmdldF9jbG9zZSAoJWQpXG4iLCBxdWl0dGluZyk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b19hdHRhY2ggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGRlYnVnX3RhcmdldC50b19hdHRhY2ggKGFyZ3MsIGZyb21fdHR5KTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ0YXJnZXRfYXR0YWNoICglcywgJWQpXG4iLCBhcmdzLCBmcm9tX3R0eSk7Cit9CisKKworc3RhdGljIHZvaWQKK2RlYnVnX3RvX3Bvc3RfYXR0YWNoIChwaWQpCisgIGludCAgcGlkOworeworICBkZWJ1Z190YXJnZXQudG9fcG9zdF9hdHRhY2ggKHBpZCk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidGFyZ2V0X3Bvc3RfYXR0YWNoICglZClcbiIsIHBpZCk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b19yZXF1aXJlX2F0dGFjaCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZGVidWdfdGFyZ2V0LnRvX3JlcXVpcmVfYXR0YWNoIChhcmdzLCBmcm9tX3R0eSk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLAorCQkgICAgICAidGFyZ2V0X3JlcXVpcmVfYXR0YWNoICglcywgJWQpXG4iLCBhcmdzLCBmcm9tX3R0eSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b19kZXRhY2ggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGRlYnVnX3RhcmdldC50b19kZXRhY2ggKGFyZ3MsIGZyb21fdHR5KTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ0YXJnZXRfZGV0YWNoICglcywgJWQpXG4iLCBhcmdzLCBmcm9tX3R0eSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b19yZXF1aXJlX2RldGFjaCAocGlkLCBhcmdzLCBmcm9tX3R0eSkKKyAgaW50ICBwaWQ7CisgIGNoYXIgKiAgYXJnczsKKyAgaW50ICBmcm9tX3R0eTsKK3sKKyAgZGVidWdfdGFyZ2V0LnRvX3JlcXVpcmVfZGV0YWNoIChwaWQsIGFyZ3MsIGZyb21fdHR5KTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsCisJCSAgICAgICJ0YXJnZXRfcmVxdWlyZV9kZXRhY2ggKCVkLCAlcywgJWQpXG4iLCBwaWQsIGFyZ3MsIGZyb21fdHR5KTsKK30KKworc3RhdGljIHZvaWQKK2RlYnVnX3RvX3Jlc3VtZSAocGlkLCBzdGVwLCBzaWdnbmFsKQorICAgICBpbnQgcGlkOworICAgICBpbnQgc3RlcDsKKyAgICAgZW51bSB0YXJnZXRfc2lnbmFsIHNpZ2duYWw7Cit7CisgIGRlYnVnX3RhcmdldC50b19yZXN1bWUgKHBpZCwgc3RlcCwgc2lnZ25hbCk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidGFyZ2V0X3Jlc3VtZSAoJWQsICVzLCAlcylcbiIsIHBpZCwKKwkJICAgICAgc3RlcCA/ICJzdGVwIiA6ICJjb250aW51ZSIsCisJCSAgICAgIHRhcmdldF9zaWduYWxfdG9fbmFtZSAoc2lnZ25hbCkpOworfQorCitzdGF0aWMgaW50CitkZWJ1Z190b193YWl0IChwaWQsIHN0YXR1cykKKyAgICAgaW50IHBpZDsKKyAgICAgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpzdGF0dXM7Cit7CisgIGludCByZXR2YWw7CisKKyAgcmV0dmFsID0gZGVidWdfdGFyZ2V0LnRvX3dhaXQgKHBpZCwgc3RhdHVzKTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsCisJCSAgICAgICJ0YXJnZXRfd2FpdCAoJWQsIHN0YXR1cykgPSAlZCwgICAiLCBwaWQsIHJldHZhbCk7CisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgInN0YXR1cy0+a2luZCA9ICIpOworICBzd2l0Y2ggKHN0YXR1cy0+a2luZCkKKyAgICB7CisgICAgY2FzZSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVEOgorICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiZXhpdGVkLCBzdGF0dXMgPSAlZFxuIiwKKwkJCSAgc3RhdHVzLT52YWx1ZS5pbnRlZ2VyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ6CisgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJzdG9wcGVkLCBzaWduYWwgPSAlc1xuIiwKKwkJCSAgdGFyZ2V0X3NpZ25hbF90b19uYW1lIChzdGF0dXMtPnZhbHVlLnNpZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQVJHRVRfV0FJVEtJTkRfU0lHTkFMTEVEOgorICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAic2lnbmFsbGVkLCBzaWduYWwgPSAlc1xuIiwKKwkJCSAgdGFyZ2V0X3NpZ25hbF90b19uYW1lIChzdGF0dXMtPnZhbHVlLnNpZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQVJHRVRfV0FJVEtJTkRfTE9BREVEOgorICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAibG9hZGVkXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFSR0VUX1dBSVRLSU5EX0ZPUktFRDoKKyAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgImZvcmtlZFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRBUkdFVF9XQUlUS0lORF9WRk9SS0VEOgorICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidmZvcmtlZFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRBUkdFVF9XQUlUS0lORF9FWEVDRDoKKyAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgImV4ZWNkXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFSR0VUX1dBSVRLSU5EX1NQVVJJT1VTOgorICAgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAic3B1cmlvdXNcbiIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgInVua25vd24/Pz9cbiIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b19wb3N0X3dhaXQgKHBpZCwgc3RhdHVzKQorICBpbnQgIHBpZDsKKyAgaW50ICBzdGF0dXM7Cit7CisgIGRlYnVnX3RhcmdldC50b19wb3N0X3dhaXQgKHBpZCwgc3RhdHVzKTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ0YXJnZXRfcG9zdF93YWl0ICglZCwgJWQpXG4iLAorCQkgICAgICBwaWQsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b19mZXRjaF9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIGRlYnVnX3RhcmdldC50b19mZXRjaF9yZWdpc3RlcnMgKHJlZ25vKTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ0YXJnZXRfZmV0Y2hfcmVnaXN0ZXJzICglcykiLAorCQkgICAgICByZWdubyAhPSAtMSA/IFJFR0lTVEVSX05BTUUgKHJlZ25vKSA6ICItMSIpOworICBpZiAocmVnbm8gIT0gLTEpCisgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiID0gMHgleCAlZCIsCisJCQkodW5zaWduZWQgbG9uZykgcmVhZF9yZWdpc3RlciAocmVnbm8pLAorCQkJcmVhZF9yZWdpc3RlciAocmVnbm8pKTsKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK2RlYnVnX3RvX3N0b3JlX3JlZ2lzdGVycyAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgZGVidWdfdGFyZ2V0LnRvX3N0b3JlX3JlZ2lzdGVycyAocmVnbm8pOworCisgIGlmIChyZWdubyA+PSAwICYmIHJlZ25vIDwgTlVNX1JFR1MpCisgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidGFyZ2V0X3N0b3JlX3JlZ2lzdGVycyAoJXMpID0gMHgleCAlZFxuIiwKKwkJCVJFR0lTVEVSX05BTUUgKHJlZ25vKSwKKwkJCSh1bnNpZ25lZCBsb25nKSByZWFkX3JlZ2lzdGVyIChyZWdubyksCisJCQkodW5zaWduZWQgbG9uZykgcmVhZF9yZWdpc3RlciAocmVnbm8pKTsKKyAgZWxzZQorICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgInRhcmdldF9zdG9yZV9yZWdpc3RlcnMgKCVkKVxuIiwgcmVnbm8pOworfQorCitzdGF0aWMgdm9pZAorZGVidWdfdG9fcHJlcGFyZV90b19zdG9yZSAoKQoreworICBkZWJ1Z190YXJnZXQudG9fcHJlcGFyZV90b19zdG9yZSAoKTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ0YXJnZXRfcHJlcGFyZV90b19zdG9yZSAoKVxuIik7Cit9CisKK3N0YXRpYyBpbnQKK2RlYnVnX3RvX3hmZXJfbWVtb3J5IChtZW1hZGRyLCBteWFkZHIsIGxlbiwgd3JpdGUsIHRhcmdldCkKKyAgICAgQ09SRV9BRERSIG1lbWFkZHI7CisgICAgIGNoYXIgKm15YWRkcjsKKyAgICAgaW50IGxlbjsKKyAgICAgaW50IHdyaXRlOworICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0OworeworICBpbnQgcmV0dmFsOworCisgIHJldHZhbCA9IGRlYnVnX3RhcmdldC50b194ZmVyX21lbW9yeSAobWVtYWRkciwgbXlhZGRyLCBsZW4sIHdyaXRlLCB0YXJnZXQpOworCisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKwkJICAgICAgInRhcmdldF94ZmVyX21lbW9yeSAoMHgleCwgeHh4LCAlZCwgJXMsIHh4eCkgPSAlZCIsCisJCSAgICAgICh1bnNpZ25lZCBpbnQpIG1lbWFkZHIsIC8qIHBvc3NhYmxlIHRydW5jYXRlIGxvbmcgbG9uZyAqLworCQkgICAgICBsZW4sIHdyaXRlID8gIndyaXRlIiA6ICJyZWFkIiwgcmV0dmFsKTsKKworICAKKworICBpZiAocmV0dmFsID4gMCkKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgZnB1dHNfdW5maWx0ZXJlZCAoIiwgYnl0ZXMgPSIsIGdkYl9zdGRlcnIpOworICAgICAgZm9yIChpID0gMDsgaSA8IHJldHZhbDsgaSsrKQorCXsKKwkgIGlmICgoKChsb25nKSAmKG15YWRkcltpXSkpICYgMHhmKSA9PSAwKQorCSAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJcbiIpOworCSAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiICUwMngiLCBteWFkZHJbaV0gJiAweGZmKTsKKwl9CisgICAgfQorCisgIGZwdXRjX3VuZmlsdGVyZWQgKCdcbicsIGdkYl9zdGRlcnIpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b19maWxlc19pbmZvICh0YXJnZXQpCisgICAgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQ7Cit7CisgIGRlYnVnX3RhcmdldC50b19maWxlc19pbmZvICh0YXJnZXQpOworCisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgInRhcmdldF9maWxlc19pbmZvICh4eHgpXG4iKTsKK30KKworc3RhdGljIGludAorZGVidWdfdG9faW5zZXJ0X2JyZWFrcG9pbnQgKGFkZHIsIHNhdmUpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBjaGFyICpzYXZlOworeworICBpbnQgcmV0dmFsOworCisgIHJldHZhbCA9IGRlYnVnX3RhcmdldC50b19pbnNlcnRfYnJlYWtwb2ludCAoYWRkciwgc2F2ZSk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLAorCQkgICAgICAidGFyZ2V0X2luc2VydF9icmVha3BvaW50ICgweCV4LCB4eHgpID0gJWRcbiIsCisJCSAgICAgICh1bnNpZ25lZCBsb25nKSBhZGRyLCByZXR2YWwpOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitkZWJ1Z190b19yZW1vdmVfYnJlYWtwb2ludCAoYWRkciwgc2F2ZSkKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGNoYXIgKnNhdmU7Cit7CisgIGludCByZXR2YWw7CisKKyAgcmV0dmFsID0gZGVidWdfdGFyZ2V0LnRvX3JlbW92ZV9icmVha3BvaW50IChhZGRyLCBzYXZlKTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsCisJCSAgICAgICJ0YXJnZXRfcmVtb3ZlX2JyZWFrcG9pbnQgKDB4JXgsIHh4eCkgPSAlZFxuIiwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpYWRkciwgcmV0dmFsKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQKK2RlYnVnX3RvX3Rlcm1pbmFsX2luaXQgKCkKK3sKKyAgZGVidWdfdGFyZ2V0LnRvX3Rlcm1pbmFsX2luaXQgKCk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidGFyZ2V0X3Rlcm1pbmFsX2luaXQgKClcbiIpOworfQorCitzdGF0aWMgdm9pZAorZGVidWdfdG9fdGVybWluYWxfaW5mZXJpb3IgKCkKK3sKKyAgZGVidWdfdGFyZ2V0LnRvX3Rlcm1pbmFsX2luZmVyaW9yICgpOworCisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgInRhcmdldF90ZXJtaW5hbF9pbmZlcmlvciAoKVxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b190ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQgKCkKK3sKKyAgZGVidWdfdGFyZ2V0LnRvX3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCAoKTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ0YXJnZXRfdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ICgpXG4iKTsKK30KKworc3RhdGljIHZvaWQKK2RlYnVnX3RvX3Rlcm1pbmFsX291cnMgKCkKK3sKKyAgZGVidWdfdGFyZ2V0LnRvX3Rlcm1pbmFsX291cnMgKCk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidGFyZ2V0X3Rlcm1pbmFsX291cnMgKClcbiIpOworfQorCitzdGF0aWMgdm9pZAorZGVidWdfdG9fdGVybWluYWxfaW5mbyAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGRlYnVnX3RhcmdldC50b190ZXJtaW5hbF9pbmZvIChhcmcsIGZyb21fdHR5KTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ0YXJnZXRfdGVybWluYWxfaW5mbyAoJXMsICVkKVxuIiwgYXJnLAorCQkgICAgICBmcm9tX3R0eSk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b19raWxsICgpCit7CisgIGRlYnVnX3RhcmdldC50b19raWxsICgpOworCisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgInRhcmdldF9raWxsICgpXG4iKTsKK30KKworc3RhdGljIHZvaWQKK2RlYnVnX3RvX2xvYWQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGRlYnVnX3RhcmdldC50b19sb2FkIChhcmdzLCBmcm9tX3R0eSk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidGFyZ2V0X2xvYWQgKCVzLCAlZClcbiIsIGFyZ3MsIGZyb21fdHR5KTsKK30KKworc3RhdGljIGludAorZGVidWdfdG9fbG9va3VwX3N5bWJvbCAobmFtZSwgYWRkcnApCisgICAgIGNoYXIgKm5hbWU7CisgICAgIENPUkVfQUREUiAqYWRkcnA7Cit7CisgIGludCByZXR2YWw7CisKKyAgcmV0dmFsID0gZGVidWdfdGFyZ2V0LnRvX2xvb2t1cF9zeW1ib2wgKG5hbWUsIGFkZHJwKTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ0YXJnZXRfbG9va3VwX3N5bWJvbCAoJXMsIHh4eClcbiIsIG5hbWUpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b19jcmVhdGVfaW5mZXJpb3IgKGV4ZWNfZmlsZSwgYXJncywgZW52KQorICAgICBjaGFyICpleGVjX2ZpbGU7CisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGRlYnVnX3RhcmdldC50b19jcmVhdGVfaW5mZXJpb3IgKGV4ZWNfZmlsZSwgYXJncywgZW52KTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ0YXJnZXRfY3JlYXRlX2luZmVyaW9yICglcywgJXMsIHh4eClcbiIsCisJCSAgICAgIGV4ZWNfZmlsZSwgYXJncyk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b19wb3N0X3N0YXJ0dXBfaW5mZXJpb3IgKHBpZCkKKyAgaW50ICBwaWQ7Cit7CisgIGRlYnVnX3RhcmdldC50b19wb3N0X3N0YXJ0dXBfaW5mZXJpb3IgKHBpZCk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidGFyZ2V0X3Bvc3Rfc3RhcnR1cF9pbmZlcmlvciAoJWQpXG4iLAorCQkgICAgICBwaWQpOworfQorCitzdGF0aWMgdm9pZAorZGVidWdfdG9fYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvciAocGlkKQorICBpbnQgIHBpZDsKK3sKKyAgZGVidWdfdGFyZ2V0LnRvX2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IgKHBpZCk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidGFyZ2V0X2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IgKCVkKVxuIiwKKwkJICAgICAgcGlkKTsKK30KKworc3RhdGljIHZvaWQKK2RlYnVnX3RvX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IgKGNoaWxkX3BpZCwgZm9sbG93ZWRfY2hpbGQpCisgIGludCAgY2hpbGRfcGlkOworICBpbnQgICpmb2xsb3dlZF9jaGlsZDsKK3sKKyAgZGVidWdfdGFyZ2V0LnRvX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IgKGNoaWxkX3BpZCwgZm9sbG93ZWRfY2hpbGQpOworCisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKwkJICAgICAgInRhcmdldF9jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yICglZCwgJWQpXG4iLAorCQkgICAgICBjaGlsZF9waWQsICpmb2xsb3dlZF9jaGlsZCk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b19wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSAoKQoreworICBkZWJ1Z190YXJnZXQudG9fcG9zdF9mb2xsb3dfaW5mZXJpb3JfYnlfY2xvbmUgKCk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidGFyZ2V0X3Bvc3RfZm9sbG93X2luZmVyaW9yX2J5X2Nsb25lICgpXG4iKTsKK30KKworc3RhdGljIGludAorZGVidWdfdG9faW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCAocGlkKQorICBpbnQgIHBpZDsKK3sKKyAgaW50ICByZXR2YWw7CisKKyAgcmV0dmFsID0gZGVidWdfdGFyZ2V0LnRvX2luc2VydF9mb3JrX2NhdGNocG9pbnQgKHBpZCk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidGFyZ2V0X2luc2VydF9mb3JrX2NhdGNocG9pbnQgKCVkKSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBpZCwgcmV0dmFsKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitkZWJ1Z190b19yZW1vdmVfZm9ya19jYXRjaHBvaW50IChwaWQpCisgIGludCAgcGlkOworeworICBpbnQgIHJldHZhbDsKKworICByZXR2YWwgPSBkZWJ1Z190YXJnZXQudG9fcmVtb3ZlX2ZvcmtfY2F0Y2hwb2ludCAocGlkKTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ0YXJnZXRfcmVtb3ZlX2ZvcmtfY2F0Y2hwb2ludCAoJWQpID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcGlkLCByZXR2YWwpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK2RlYnVnX3RvX2luc2VydF92Zm9ya19jYXRjaHBvaW50IChwaWQpCisgIGludCAgcGlkOworeworICBpbnQgIHJldHZhbDsKKworICByZXR2YWwgPSBkZWJ1Z190YXJnZXQudG9faW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQgKHBpZCk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidGFyZ2V0X2luc2VydF92Zm9ya19jYXRjaHBvaW50ICglZCk9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBpZCwgcmV0dmFsKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitkZWJ1Z190b19yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludCAocGlkKQorICBpbnQgIHBpZDsKK3sKKyAgaW50ICByZXR2YWw7CisKKyAgcmV0dmFsID0gZGVidWdfdGFyZ2V0LnRvX3JlbW92ZV92Zm9ya19jYXRjaHBvaW50IChwaWQpOworCisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgInRhcmdldF9yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludCAoJWQpID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcGlkLCByZXR2YWwpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK2RlYnVnX3RvX2hhc19mb3JrZWQgKHBpZCwgY2hpbGRfcGlkKQorICBpbnQgIHBpZDsKKyAgaW50ICogIGNoaWxkX3BpZDsKK3sKKyAgaW50ICBoYXNfZm9ya2VkOworCisgIGhhc19mb3JrZWQgPSBkZWJ1Z190YXJnZXQudG9faGFzX2ZvcmtlZCAocGlkLCBjaGlsZF9waWQpOworCisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgInRhcmdldF9oYXNfZm9ya2VkICglZCwgJWQpID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcGlkLCAqY2hpbGRfcGlkLCBoYXNfZm9ya2VkKTsKKworICByZXR1cm4gaGFzX2ZvcmtlZDsKK30KKworc3RhdGljIGludAorZGVidWdfdG9faGFzX3Zmb3JrZWQgKHBpZCwgY2hpbGRfcGlkKQorICBpbnQgIHBpZDsKKyAgaW50ICogIGNoaWxkX3BpZDsKK3sKKyAgaW50ICBoYXNfdmZvcmtlZDsKKworICBoYXNfdmZvcmtlZCA9IGRlYnVnX3RhcmdldC50b19oYXNfdmZvcmtlZCAocGlkLCBjaGlsZF9waWQpOworCisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgInRhcmdldF9oYXNfdmZvcmtlZCAoJWQsICVkKSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBpZCwgKmNoaWxkX3BpZCwgaGFzX3Zmb3JrZWQpOworCisgIHJldHVybiBoYXNfdmZvcmtlZDsKK30KKworc3RhdGljIGludAorZGVidWdfdG9fY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjICgpCit7CisgIGludCAgY2FuX2ltbWVkaWF0ZWx5X2ZvbGxvd192Zm9yazsKKworICBjYW5faW1tZWRpYXRlbHlfZm9sbG93X3Zmb3JrID0gZGVidWdfdGFyZ2V0LnRvX2Nhbl9mb2xsb3dfdmZvcmtfcHJpb3JfdG9fZXhlYyAoKTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ0YXJnZXRfY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjICgpID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgY2FuX2ltbWVkaWF0ZWx5X2ZvbGxvd192Zm9yayk7CisKKyAgcmV0dXJuIGNhbl9pbW1lZGlhdGVseV9mb2xsb3dfdmZvcms7Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b19wb3N0X2ZvbGxvd192Zm9yayAocGFyZW50X3BpZCwgZm9sbG93ZWRfcGFyZW50LCBjaGlsZF9waWQsIGZvbGxvd2VkX2NoaWxkKQorICBpbnQgIHBhcmVudF9waWQ7CisgIGludCAgZm9sbG93ZWRfcGFyZW50OworICBpbnQgIGNoaWxkX3BpZDsKKyAgaW50ICBmb2xsb3dlZF9jaGlsZDsKK3sKKyAgZGVidWdfdGFyZ2V0LnRvX3Bvc3RfZm9sbG93X3Zmb3JrIChwYXJlbnRfcGlkLCBmb2xsb3dlZF9wYXJlbnQsIGNoaWxkX3BpZCwgZm9sbG93ZWRfY2hpbGQpOworCisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKwkJICAgICAgInRhcmdldF9wb3N0X2ZvbGxvd192Zm9yayAoJWQsICVkLCAlZCwgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9waWQsIGZvbGxvd2VkX3BhcmVudCwgY2hpbGRfcGlkLCBmb2xsb3dlZF9jaGlsZCk7Cit9CisKK3N0YXRpYyBpbnQKK2RlYnVnX3RvX2luc2VydF9leGVjX2NhdGNocG9pbnQgKHBpZCkKKyAgaW50ICBwaWQ7Cit7CisgIGludCAgcmV0dmFsOworCisgIHJldHZhbCA9IGRlYnVnX3RhcmdldC50b19pbnNlcnRfZXhlY19jYXRjaHBvaW50IChwaWQpOworCisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgInRhcmdldF9pbnNlcnRfZXhlY19jYXRjaHBvaW50ICglZCkgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwaWQsIHJldHZhbCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAorZGVidWdfdG9fcmVtb3ZlX2V4ZWNfY2F0Y2hwb2ludCAocGlkKQorICBpbnQgIHBpZDsKK3sKKyAgaW50ICByZXR2YWw7CisKKyAgcmV0dmFsID0gZGVidWdfdGFyZ2V0LnRvX3JlbW92ZV9leGVjX2NhdGNocG9pbnQgKHBpZCk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidGFyZ2V0X3JlbW92ZV9leGVjX2NhdGNocG9pbnQgKCVkKSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBpZCwgcmV0dmFsKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitkZWJ1Z190b19oYXNfZXhlY2QgKHBpZCwgZXhlY2RfcGF0aG5hbWUpCisgIGludCAgcGlkOworICBjaGFyICoqICBleGVjZF9wYXRobmFtZTsKK3sKKyAgaW50ICBoYXNfZXhlY2Q7CisKKyAgaGFzX2V4ZWNkID0gZGVidWdfdGFyZ2V0LnRvX2hhc19leGVjZCAocGlkLCBleGVjZF9wYXRobmFtZSk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidGFyZ2V0X2hhc19leGVjZCAoJWQsICVzKSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBpZCwgKmV4ZWNkX3BhdGhuYW1lLCBoYXNfZXhlY2QpOworCisgIHJldHVybiBoYXNfZXhlY2Q7Cit9CisKK3N0YXRpYyBpbnQKK2RlYnVnX3RvX3JlcG9ydGVkX2V4ZWNfZXZlbnRzX3Blcl9leGVjX2NhbGwgKCkKK3sKKyAgaW50ICByZXBvcnRlZF9leGVjX2V2ZW50czsKKworICByZXBvcnRlZF9leGVjX2V2ZW50cyA9IGRlYnVnX3RhcmdldC50b19yZXBvcnRlZF9leGVjX2V2ZW50c19wZXJfZXhlY19jYWxsICgpOworCisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKwkJICAgICAgInRhcmdldF9yZXBvcnRlZF9leGVjX2V2ZW50c19wZXJfZXhlY19jYWxsICgpID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWRfZXhlY19ldmVudHMpOworCisgIHJldHVybiByZXBvcnRlZF9leGVjX2V2ZW50czsKK30KKworc3RhdGljIGludAorZGVidWdfdG9faGFzX3N5c2NhbGxfZXZlbnQgKHBpZCwga2luZCwgc3lzY2FsbF9pZCkKKyAgaW50ICBwaWQ7CisgIGVudW0gdGFyZ2V0X3dhaXRraW5kICogIGtpbmQ7CisgIGludCAqICBzeXNjYWxsX2lkOworeworICBpbnQgIGhhc19zeXNjYWxsX2V2ZW50OworICBjaGFyICogIGtpbmRfc3BlbGxpbmcgPSAiPz8iOworCisgIGhhc19zeXNjYWxsX2V2ZW50ID0gZGVidWdfdGFyZ2V0LnRvX2hhc19zeXNjYWxsX2V2ZW50IChwaWQsIGtpbmQsIHN5c2NhbGxfaWQpOworICBpZiAoaGFzX3N5c2NhbGxfZXZlbnQpCisgICAgeworICAgICAgc3dpdGNoICgqa2luZCkKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgVEFSR0VUX1dBSVRLSU5EX1NZU0NBTExfRU5UUlk6CisgICAgICAgICAgICBraW5kX3NwZWxsaW5nID0gIlNZU0NBTExfRU5UUlkiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBUQVJHRVRfV0FJVEtJTkRfU1lTQ0FMTF9SRVRVUk46CisgICAgICAgICAgICBraW5kX3NwZWxsaW5nID0gIlNZU0NBTExfUkVUVVJOIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsCisJCSAgICAgICJ0YXJnZXRfaGFzX3N5c2NhbGxfZXZlbnQgKCVkLCAlcywgJWQpID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcGlkLCBraW5kX3NwZWxsaW5nLCAqc3lzY2FsbF9pZCwgaGFzX3N5c2NhbGxfZXZlbnQpOworCisgIHJldHVybiBoYXNfc3lzY2FsbF9ldmVudDsKK30KKworc3RhdGljIGludAorZGVidWdfdG9faGFzX2V4aXRlZCAocGlkLCB3YWl0X3N0YXR1cywgZXhpdF9zdGF0dXMpCisgIGludCAgcGlkOworICBpbnQgIHdhaXRfc3RhdHVzOworICBpbnQgKiAgZXhpdF9zdGF0dXM7Cit7CisgIGludCAgaGFzX2V4aXRlZDsKKworICBoYXNfZXhpdGVkID0gZGVidWdfdGFyZ2V0LnRvX2hhc19leGl0ZWQgKHBpZCwgd2FpdF9zdGF0dXMsIGV4aXRfc3RhdHVzKTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ0YXJnZXRfaGFzX2V4aXRlZCAoJWQsICVkLCAlZCkgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwaWQsIHdhaXRfc3RhdHVzLCAqZXhpdF9zdGF0dXMsIGhhc19leGl0ZWQpOworCisgIHJldHVybiBoYXNfZXhpdGVkOworfQorCitzdGF0aWMgdm9pZAorZGVidWdfdG9fbW91cm5faW5mZXJpb3IgKCkKK3sKKyAgZGVidWdfdGFyZ2V0LnRvX21vdXJuX2luZmVyaW9yICgpOworCisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgInRhcmdldF9tb3Vybl9pbmZlcmlvciAoKVxuIik7Cit9CisKK3N0YXRpYyBpbnQKK2RlYnVnX3RvX2Nhbl9ydW4gKCkKK3sKKyAgaW50IHJldHZhbDsKKworICByZXR2YWwgPSBkZWJ1Z190YXJnZXQudG9fY2FuX3J1biAoKTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ0YXJnZXRfY2FuX3J1biAoKSA9ICVkXG4iLCByZXR2YWwpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitkZWJ1Z190b19ub3RpY2Vfc2lnbmFscyAocGlkKQorICAgICBpbnQgcGlkOworeworICBkZWJ1Z190YXJnZXQudG9fbm90aWNlX3NpZ25hbHMgKHBpZCk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidGFyZ2V0X25vdGljZV9zaWduYWxzICglZClcbiIsIHBpZCk7Cit9CisKK3N0YXRpYyBpbnQKK2RlYnVnX3RvX3RocmVhZF9hbGl2ZSAocGlkKQorICAgICBpbnQgcGlkOworeworICBpbnQgcmV0dmFsOworCisgIHJldHZhbCA9IGRlYnVnX3RhcmdldC50b190aHJlYWRfYWxpdmUgKHBpZCk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidGFyZ2V0X3RocmVhZF9hbGl2ZSAoJWQpID0gJWRcbiIsCisJCSAgICAgIHBpZCwgcmV0dmFsKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZAorZGVidWdfdG9fc3RvcCAoKQoreworICBkZWJ1Z190YXJnZXQudG9fc3RvcCAoKTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ0YXJnZXRfc3RvcCAoKVxuIik7Cit9CisKK3N0YXRpYyBpbnQKK2RlYnVnX3RvX3F1ZXJ5ICh0eXBlLCByZXEsIHJlc3AsIHNpeikKKyAgaW50IHR5cGU7CisgIGNoYXIgKnJlcTsKKyAgY2hhciAqcmVzcDsKKyAgaW50ICpzaXo7Cit7CisgIGludCByZXR2YWw7CisKKyAgcmV0dmFsID0gZGVidWdfdGFyZ2V0LnRvX3F1ZXJ5ICh0eXBlLCByZXEsIHJlc3AsIHNpeik7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidGFyZ2V0X3F1ZXJ5ICglYywgJXMsICVzLCAgJWQpID0gJWRcbiIsIHR5cGUsIHJlcSwgcmVzcCwgKnNpeiwgcmV0dmFsKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc3RydWN0IHN5bXRhYl9hbmRfbGluZSAqCitkZWJ1Z190b19lbmFibGVfZXhjZXB0aW9uX2NhbGxiYWNrIChraW5kLCBlbmFibGUpCisgIGVudW0gZXhjZXB0aW9uX2V2ZW50X2tpbmQga2luZDsKKyAgaW50IGVuYWJsZTsKK3sKKyAgZGVidWdfdGFyZ2V0LnRvX2VuYWJsZV9leGNlcHRpb25fY2FsbGJhY2sgKGtpbmQsIGVuYWJsZSk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLAorCQkgICAgICAidGFyZ2V0IGdldF9leGNlcHRpb25fY2FsbGJhY2tfc2FsICglZCwgJWQpXG4iLAorCQkgICAgICBraW5kLCBlbmFibGUpOworfQorCitzdGF0aWMgc3RydWN0IGV4Y2VwdGlvbl9ldmVudF9yZWNvcmQgKgorZGVidWdfdG9fZ2V0X2N1cnJlbnRfZXhjZXB0aW9uX2V2ZW50ICgpCit7CisgIGRlYnVnX3RhcmdldC50b19nZXRfY3VycmVudF9leGNlcHRpb25fZXZlbnQoKTsKKworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ0YXJnZXQgZ2V0X2N1cnJlbnRfZXhjZXB0aW9uX2V2ZW50ICgpXG4iKTsKK30KKworc3RhdGljIGNoYXIgKgorZGVidWdfdG9fcGlkX3RvX2V4ZWNfZmlsZSAocGlkKQorICBpbnQgIHBpZDsKK3sKKyAgY2hhciAqICBleGVjX2ZpbGU7CisKKyAgZXhlY19maWxlID0gZGVidWdfdGFyZ2V0LnRvX3BpZF90b19leGVjX2ZpbGUgKHBpZCk7CisKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAidGFyZ2V0X3BpZF90b19leGVjX2ZpbGUgKCVkKSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBpZCwgZXhlY19maWxlKTsKKworICByZXR1cm4gZXhlY19maWxlOworfQorCitzdGF0aWMgY2hhciAqCitkZWJ1Z190b19jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUgKGNvcmUpCisgIGNoYXIgKiAgY29yZTsKK3sKKyAgY2hhciAqICBzeW1fZmlsZTsKKworICBzeW1fZmlsZSA9IGRlYnVnX3RhcmdldC50b19jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUgKGNvcmUpOworCisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgInRhcmdldF9jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUgKCVzKSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGNvcmUsIHN5bV9maWxlKTsKKworICByZXR1cm4gc3ltX2ZpbGU7Cit9CisKK3N0YXRpYyB2b2lkCitzZXR1cF90YXJnZXRfZGVidWcgKCkKK3sKKyAgbWVtY3B5ICgmZGVidWdfdGFyZ2V0LCAmY3VycmVudF90YXJnZXQsIHNpemVvZiBkZWJ1Z190YXJnZXQpOworCisgIGN1cnJlbnRfdGFyZ2V0LnRvX29wZW4gPSBkZWJ1Z190b19vcGVuOworICBjdXJyZW50X3RhcmdldC50b19jbG9zZSA9IGRlYnVnX3RvX2Nsb3NlOworICBjdXJyZW50X3RhcmdldC50b19hdHRhY2ggPSBkZWJ1Z190b19hdHRhY2g7CisgIGN1cnJlbnRfdGFyZ2V0LnRvX3Bvc3RfYXR0YWNoID0gZGVidWdfdG9fcG9zdF9hdHRhY2g7CisgIGN1cnJlbnRfdGFyZ2V0LnRvX3JlcXVpcmVfYXR0YWNoID0gZGVidWdfdG9fcmVxdWlyZV9hdHRhY2g7CisgIGN1cnJlbnRfdGFyZ2V0LnRvX2RldGFjaCA9IGRlYnVnX3RvX2RldGFjaDsKKyAgY3VycmVudF90YXJnZXQudG9fcmVxdWlyZV9kZXRhY2ggPSBkZWJ1Z190b19yZXF1aXJlX2RldGFjaDsKKyAgY3VycmVudF90YXJnZXQudG9fcmVzdW1lID0gZGVidWdfdG9fcmVzdW1lOworICBjdXJyZW50X3RhcmdldC50b193YWl0ID0gZGVidWdfdG9fd2FpdDsKKyAgY3VycmVudF90YXJnZXQudG9fcG9zdF93YWl0ID0gZGVidWdfdG9fcG9zdF93YWl0OworICBjdXJyZW50X3RhcmdldC50b19mZXRjaF9yZWdpc3RlcnMgPSBkZWJ1Z190b19mZXRjaF9yZWdpc3RlcnM7CisgIGN1cnJlbnRfdGFyZ2V0LnRvX3N0b3JlX3JlZ2lzdGVycyA9IGRlYnVnX3RvX3N0b3JlX3JlZ2lzdGVyczsKKyAgY3VycmVudF90YXJnZXQudG9fcHJlcGFyZV90b19zdG9yZSA9IGRlYnVnX3RvX3ByZXBhcmVfdG9fc3RvcmU7CisgIGN1cnJlbnRfdGFyZ2V0LnRvX3hmZXJfbWVtb3J5ID0gZGVidWdfdG9feGZlcl9tZW1vcnk7CisgIGN1cnJlbnRfdGFyZ2V0LnRvX2ZpbGVzX2luZm8gPSBkZWJ1Z190b19maWxlc19pbmZvOworICBjdXJyZW50X3RhcmdldC50b19pbnNlcnRfYnJlYWtwb2ludCA9IGRlYnVnX3RvX2luc2VydF9icmVha3BvaW50OworICBjdXJyZW50X3RhcmdldC50b19yZW1vdmVfYnJlYWtwb2ludCA9IGRlYnVnX3RvX3JlbW92ZV9icmVha3BvaW50OworICBjdXJyZW50X3RhcmdldC50b190ZXJtaW5hbF9pbml0ID0gZGVidWdfdG9fdGVybWluYWxfaW5pdDsKKyAgY3VycmVudF90YXJnZXQudG9fdGVybWluYWxfaW5mZXJpb3IgPSBkZWJ1Z190b190ZXJtaW5hbF9pbmZlcmlvcjsKKyAgY3VycmVudF90YXJnZXQudG9fdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ID0gZGVidWdfdG9fdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0OworICBjdXJyZW50X3RhcmdldC50b190ZXJtaW5hbF9vdXJzID0gZGVidWdfdG9fdGVybWluYWxfb3VyczsKKyAgY3VycmVudF90YXJnZXQudG9fdGVybWluYWxfaW5mbyA9IGRlYnVnX3RvX3Rlcm1pbmFsX2luZm87CisgIGN1cnJlbnRfdGFyZ2V0LnRvX2tpbGwgPSBkZWJ1Z190b19raWxsOworICBjdXJyZW50X3RhcmdldC50b19sb2FkID0gZGVidWdfdG9fbG9hZDsKKyAgY3VycmVudF90YXJnZXQudG9fbG9va3VwX3N5bWJvbCA9IGRlYnVnX3RvX2xvb2t1cF9zeW1ib2w7CisgIGN1cnJlbnRfdGFyZ2V0LnRvX2NyZWF0ZV9pbmZlcmlvciA9IGRlYnVnX3RvX2NyZWF0ZV9pbmZlcmlvcjsKKyAgY3VycmVudF90YXJnZXQudG9fcG9zdF9zdGFydHVwX2luZmVyaW9yID0gZGVidWdfdG9fcG9zdF9zdGFydHVwX2luZmVyaW9yOworICBjdXJyZW50X3RhcmdldC50b19hY2tub3dsZWRnZV9jcmVhdGVkX2luZmVyaW9yID0gZGVidWdfdG9fYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvcjsKKyAgY3VycmVudF90YXJnZXQudG9fY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciA9IGRlYnVnX3RvX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3I7CisgIGN1cnJlbnRfdGFyZ2V0LnRvX3Bvc3RfZm9sbG93X2luZmVyaW9yX2J5X2Nsb25lID0gZGVidWdfdG9fcG9zdF9mb2xsb3dfaW5mZXJpb3JfYnlfY2xvbmU7CisgIGN1cnJlbnRfdGFyZ2V0LnRvX2luc2VydF9mb3JrX2NhdGNocG9pbnQgPSBkZWJ1Z190b19pbnNlcnRfZm9ya19jYXRjaHBvaW50OworICBjdXJyZW50X3RhcmdldC50b19yZW1vdmVfZm9ya19jYXRjaHBvaW50ID0gZGVidWdfdG9fcmVtb3ZlX2ZvcmtfY2F0Y2hwb2ludDsKKyAgY3VycmVudF90YXJnZXQudG9faW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQgPSBkZWJ1Z190b19pbnNlcnRfdmZvcmtfY2F0Y2hwb2ludDsKKyAgY3VycmVudF90YXJnZXQudG9fcmVtb3ZlX3Zmb3JrX2NhdGNocG9pbnQgPSBkZWJ1Z190b19yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludDsKKyAgY3VycmVudF90YXJnZXQudG9faGFzX2ZvcmtlZCA9IGRlYnVnX3RvX2hhc19mb3JrZWQ7CisgIGN1cnJlbnRfdGFyZ2V0LnRvX2hhc192Zm9ya2VkID0gZGVidWdfdG9faGFzX3Zmb3JrZWQ7CisgIGN1cnJlbnRfdGFyZ2V0LnRvX2Nhbl9mb2xsb3dfdmZvcmtfcHJpb3JfdG9fZXhlYyA9IGRlYnVnX3RvX2Nhbl9mb2xsb3dfdmZvcmtfcHJpb3JfdG9fZXhlYzsKKyAgY3VycmVudF90YXJnZXQudG9fcG9zdF9mb2xsb3dfdmZvcmsgPSBkZWJ1Z190b19wb3N0X2ZvbGxvd192Zm9yazsKKyAgY3VycmVudF90YXJnZXQudG9faW5zZXJ0X2V4ZWNfY2F0Y2hwb2ludCA9IGRlYnVnX3RvX2luc2VydF9leGVjX2NhdGNocG9pbnQ7CisgIGN1cnJlbnRfdGFyZ2V0LnRvX3JlbW92ZV9leGVjX2NhdGNocG9pbnQgPSBkZWJ1Z190b19yZW1vdmVfZXhlY19jYXRjaHBvaW50OworICBjdXJyZW50X3RhcmdldC50b19oYXNfZXhlY2QgPSBkZWJ1Z190b19oYXNfZXhlY2Q7CisgIGN1cnJlbnRfdGFyZ2V0LnRvX3JlcG9ydGVkX2V4ZWNfZXZlbnRzX3Blcl9leGVjX2NhbGwgPSBkZWJ1Z190b19yZXBvcnRlZF9leGVjX2V2ZW50c19wZXJfZXhlY19jYWxsOworICBjdXJyZW50X3RhcmdldC50b19oYXNfc3lzY2FsbF9ldmVudCA9IGRlYnVnX3RvX2hhc19zeXNjYWxsX2V2ZW50OworICBjdXJyZW50X3RhcmdldC50b19oYXNfZXhpdGVkID0gZGVidWdfdG9faGFzX2V4aXRlZDsKKyAgY3VycmVudF90YXJnZXQudG9fbW91cm5faW5mZXJpb3IgPSBkZWJ1Z190b19tb3Vybl9pbmZlcmlvcjsKKyAgY3VycmVudF90YXJnZXQudG9fY2FuX3J1biA9IGRlYnVnX3RvX2Nhbl9ydW47CisgIGN1cnJlbnRfdGFyZ2V0LnRvX25vdGljZV9zaWduYWxzID0gZGVidWdfdG9fbm90aWNlX3NpZ25hbHM7CisgIGN1cnJlbnRfdGFyZ2V0LnRvX3RocmVhZF9hbGl2ZSA9IGRlYnVnX3RvX3RocmVhZF9hbGl2ZTsKKyAgY3VycmVudF90YXJnZXQudG9fc3RvcCA9IGRlYnVnX3RvX3N0b3A7CisgIGN1cnJlbnRfdGFyZ2V0LnRvX3F1ZXJ5ID0gZGVidWdfdG9fcXVlcnk7CisgIGN1cnJlbnRfdGFyZ2V0LnRvX2VuYWJsZV9leGNlcHRpb25fY2FsbGJhY2sgPSBkZWJ1Z190b19lbmFibGVfZXhjZXB0aW9uX2NhbGxiYWNrOworICBjdXJyZW50X3RhcmdldC50b19nZXRfY3VycmVudF9leGNlcHRpb25fZXZlbnQgPSBkZWJ1Z190b19nZXRfY3VycmVudF9leGNlcHRpb25fZXZlbnQ7CisgIGN1cnJlbnRfdGFyZ2V0LnRvX3BpZF90b19leGVjX2ZpbGUgPSBkZWJ1Z190b19waWRfdG9fZXhlY19maWxlOworICBjdXJyZW50X3RhcmdldC50b19jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUgPSBkZWJ1Z190b19jb3JlX2ZpbGVfdG9fc3ltX2ZpbGU7CisKK30KKyNlbmRpZiAvKiBNQUlOVEVOQU5DRV9DTURTICovCisMCitzdGF0aWMgY2hhciB0YXJnX2Rlc2NbXSA9IAorICAgICJOYW1lcyBvZiB0YXJnZXRzIGFuZCBmaWxlcyBiZWluZyBkZWJ1Z2dlZC5cblwKK1Nob3dzIHRoZSBlbnRpcmUgc3RhY2sgb2YgdGFyZ2V0cyBjdXJyZW50bHkgaW4gdXNlIChpbmNsdWRpbmcgdGhlIGV4ZWMtZmlsZSxcblwKK2NvcmUtZmlsZSwgYW5kIHByb2Nlc3MsIGlmIGFueSksIGFzIHdlbGwgYXMgdGhlIHN5bWJvbCBmaWxlIG5hbWUuIjsKKwordm9pZAoraW5pdGlhbGl6ZV90YXJnZXRzICgpCit7CisgIGluaXRfZHVtbXlfdGFyZ2V0ICgpOworICBwdXNoX3RhcmdldCAoJmR1bW15X3RhcmdldCk7CisKKyAgYWRkX2luZm8gKCJ0YXJnZXQiLCB0YXJnZXRfaW5mbywgdGFyZ19kZXNjKTsKKyAgYWRkX2luZm8gKCJmaWxlcyIsIHRhcmdldF9pbmZvLCB0YXJnX2Rlc2MpOworCisjaWZkZWYgTUFJTlRFTkFOQ0VfQ01EUworICBhZGRfc2hvd19mcm9tX3NldCAoCisgICAgIGFkZF9zZXRfY21kICgidGFyZ2V0ZGVidWciLCBjbGFzc19tYWludGVuYW5jZSwgdmFyX3ppbnRlZ2VyLAorCQkgIChjaGFyICopJnRhcmdldGRlYnVnLAorCQkgIlNldCB0YXJnZXQgZGVidWdnaW5nLlxuXAorV2hlbiBub24temVybywgdGFyZ2V0IGRlYnVnZ2luZyBpcyBlbmFibGVkLiIsICZzZXRsaXN0KSwKKwkJICAgICAmc2hvd2xpc3QpOworI2VuZGlmCisKKyAgaWYgKCFTVFJFUSAoc2lnbmFsc1tUQVJHRVRfU0lHTkFMX0xBU1RdLnN0cmluZywgIlRBUkdFVF9TSUdOQUxfTUFHSUMiKSkKKyAgICBhYm9ydCAoKTsKK30KZGlmZiAtLWdpdCBhL2dkYi90YXJnZXQuaCBiL2dkYi90YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWMzYmFiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3RhcmdldC5oCkBAIC0wLDAgKzEsMTI2NCBAQAorLyogSW50ZXJmYWNlIGJldHdlZW4gR0RCIGFuZCB0YXJnZXQgZW52aXJvbm1lbnRzLCBpbmNsdWRpbmcgZmlsZXMgYW5kIHByb2Nlc3NlcworICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuICBXcml0dGVuIGJ5IEpvaG4gR2lsbW9yZS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWYgIWRlZmluZWQgKFRBUkdFVF9IKQorI2RlZmluZSBUQVJHRVRfSAorCisvKiBUaGlzIGluY2x1ZGUgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgbWFpbiBwYXJ0CisgICBvZiB0aGUgZGVidWdnZXIsIGFuZCB0aGUgcGFydCB3aGljaCBpcyB0YXJnZXQtc3BlY2lmaWMsIG9yCisgICBzcGVjaWZpYyB0byB0aGUgY29tbXVuaWNhdGlvbnMgaW50ZXJmYWNlIGJldHdlZW4gdXMgYW5kIHRoZQorICAgdGFyZ2V0LgorCisgICBBIFRBUkdFVCBpcyBhbiBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgZGVidWdnZXIgYW5kIGEgcGFydGljdWxhciAKKyAgIGtpbmQgb2YgZmlsZSBvciBwcm9jZXNzLiAgVGFyZ2V0cyBjYW4gYmUgU1RBQ0tFRCBpbiBTVFJBVEEsIAorICAgc28gdGhhdCBtb3JlIHRoYW4gb25lIHRhcmdldCBjYW4gcG90ZW50aWFsbHkgcmVzcG9uZCB0byBhIHJlcXVlc3QuCisgICBJbiBwYXJ0aWN1bGFyLCBtZW1vcnkgYWNjZXNzZXMgd2lsbCB3YWxrIGRvd24gdGhlIHN0YWNrIG9mIHRhcmdldHMKKyAgIHVudGlsIHRoZXkgZmluZCBhIHRhcmdldCB0aGF0IGlzIGludGVyZXN0ZWQgaW4gaGFuZGxpbmcgdGhhdCBwYXJ0aWN1bGFyCisgICBhZGRyZXNzLiAgU1RSQVRBIGFyZSBhcnRpZmljaWFsIGJvdW5kYXJpZXMgb24gdGhlIHN0YWNrLCB3aXRoaW4KKyAgIHdoaWNoIHBhcnRpY3VsYXIga2luZHMgb2YgdGFyZ2V0cyBsaXZlLiAgU3RyYXRhIGV4aXN0IHNvIHRoYXQKKyAgIHBlb3BsZSBkb24ndCBnZXQgY29uZnVzZWQgYnkgcHVzaGluZyBlLmcuIGEgcHJvY2VzcyB0YXJnZXQgYW5kIHRoZW4KKyAgIGEgZmlsZSB0YXJnZXQsIGFuZCB3b25kZXJpbmcgd2h5IHRoZXkgY2FuJ3Qgc2VlIHRoZSBjdXJyZW50IHZhbHVlcworICAgb2YgdmFyaWFibGVzIGFueSBtb3JlICh0aGUgZmlsZSB0YXJnZXQgaXMgaGFuZGxpbmcgdGhlbSBhbmQgdGhleQorICAgbmV2ZXIgZ2V0IHRvIHRoZSBwcm9jZXNzIHRhcmdldCkuICBTbyB3aGVuIHlvdSBwdXNoIGEgZmlsZSB0YXJnZXQsCisgICBpdCBnb2VzIGludG8gdGhlIGZpbGUgc3RyYXR1bSwgd2hpY2ggaXMgYWx3YXlzIGJlbG93IHRoZSBwcm9jZXNzCisgICBzdHJhdHVtLiAgKi8KKworI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorCitlbnVtIHN0cmF0YSB7CisJZHVtbXlfc3RyYXR1bSwJCS8qIFRoZSBsb3dlc3Qgb2YgdGhlIGxvdyAqLworCWZpbGVfc3RyYXR1bSwJCS8qIEV4ZWN1dGFibGUgZmlsZXMsIGV0YyAqLworCWNvcmVfc3RyYXR1bSwJCS8qIENvcmUgZHVtcCBmaWxlcyAqLworCWRvd25sb2FkX3N0cmF0dW0sCS8qIERvd25sb2FkaW5nIG9mIHJlbW90ZSB0YXJnZXRzICovCisJcHJvY2Vzc19zdHJhdHVtCQkvKiBFeGVjdXRpbmcgcHJvY2Vzc2VzICovCit9OworCitlbnVtIHRocmVhZF9jb250cm9sX2NhcGFiaWxpdGllcyB7CisJdGNfbm9uZSA9IDAsIAkJLyogRGVmYXVsdDogY2FuJ3QgY29udHJvbCB0aHJlYWQgZXhlY3V0aW9uLiAqLworCXRjX3NjaGVkbG9jayA9IDEsCS8qIENhbiBsb2NrIHRoZSB0aHJlYWQgc2NoZWR1bGVyLiAqLworCXRjX3N3aXRjaCA9IDIgCQkvKiBDYW4gc3dpdGNoIHRoZSBydW5uaW5nIHRocmVhZCBvbiBkZW1hbmQuICovCit9OworCisvKiBTdHVmZiBmb3IgdGFyZ2V0X3dhaXQuICAqLworCisvKiBHZW5lcmFsbHksIHdoYXQgaGFzIHRoZSBwcm9ncmFtIGRvbmU/ICAqLworZW51bSB0YXJnZXRfd2FpdGtpbmQgeworICAvKiBUaGUgcHJvZ3JhbSBoYXMgZXhpdGVkLiAgVGhlIGV4aXQgc3RhdHVzIGlzIGluIHZhbHVlLmludGVnZXIuICAqLworICBUQVJHRVRfV0FJVEtJTkRfRVhJVEVELAorCisgIC8qIFRoZSBwcm9ncmFtIGhhcyBzdG9wcGVkIHdpdGggYSBzaWduYWwuICBXaGljaCBzaWduYWwgaXMgaW4gdmFsdWUuc2lnLiAgKi8KKyAgVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQsCisKKyAgLyogVGhlIHByb2dyYW0gaGFzIHRlcm1pbmF0ZWQgd2l0aCBhIHNpZ25hbC4gIFdoaWNoIHNpZ25hbCBpcyBpbgorICAgICB2YWx1ZS5zaWcuICAqLworICBUQVJHRVRfV0FJVEtJTkRfU0lHTkFMTEVELAorCisgIC8qIFRoZSBwcm9ncmFtIGlzIGxldHRpbmcgdXMga25vdyB0aGF0IGl0IGR5bmFtaWNhbGx5IGxvYWRlZCBzb21ldGhpbmcKKyAgICAgKGUuZy4gaXQgY2FsbGVkIGxvYWQoMikgb24gQUlYKS4gICovCisgIFRBUkdFVF9XQUlUS0lORF9MT0FERUQsCisKKyAgLyogVGhlIHByb2dyYW0gaGFzIGZvcmtlZC4gIEEgInJlbGF0ZWQiIHByb2Nlc3MnIElEIGlzIGluIHZhbHVlLnJlbGF0ZWRfcGlkLgorICAgICBJLmUuLCBpZiB0aGUgY2hpbGQgZm9ya3MsIHZhbHVlLnJlbGF0ZWRfcGlkIGlzIHRoZSBwYXJlbnQncyBJRC4KKyAgICAgKi8KKyAgVEFSR0VUX1dBSVRLSU5EX0ZPUktFRCwKKworICAvKiBUaGUgcHJvZ3JhbSBoYXMgdmZvcmtlZC4gIEEgInJlbGF0ZWQiIHByb2Nlc3MncyBJRCBpcyBpbiB2YWx1ZS5yZWxhdGVkX3BpZC4KKyAgICAgKi8KKyAgVEFSR0VUX1dBSVRLSU5EX1ZGT1JLRUQsCisKKyAgLyogVGhlIHByb2dyYW0gaGFzIGV4ZWMnZWQgYSBuZXcgZXhlY3V0YWJsZSBmaWxlLiAgVGhlIG5ldyBmaWxlJ3MgcGF0aG5hbWUKKyAgICAgaXMgcG9pbnRlZCB0byBieSB2YWx1ZS5leGVjZF9wYXRobmFtZS4KKyAgICAgKi8KKyAgVEFSR0VUX1dBSVRLSU5EX0VYRUNELAorCisgIC8qIFRoZSBwcm9ncmFtIGhhcyBlbnRlcmVkIG9yIHJldHVybmVkIGZyb20gYSBzeXN0ZW0gY2FsbC4gIE9uIEhQLVVYLCB0aGlzCisgICAgIGlzIHVzZWQgaW4gdGhlIGhhcmR3YXJlIHdhdGNocG9pbnQgaW1wbGVtZW50YXRpb24uICBUaGUgc3lzY2FsbCdzIHVuaXF1ZQorICAgICBpbnRlZ2VyIElEIG51bWJlciBpcyBpbiB2YWx1ZS5zeXNjYWxsX2lkOworICAgICAqLworICBUQVJHRVRfV0FJVEtJTkRfU1lTQ0FMTF9FTlRSWSwKKyAgVEFSR0VUX1dBSVRLSU5EX1NZU0NBTExfUkVUVVJOLAorCisgIC8qIE5vdGhpbmcgaGFwcGVuZWQsIGJ1dCB3ZSBzdG9wcGVkIGFueXdheS4gIFRoaXMgcGVyaGFwcyBzaG91bGQgYmUgaGFuZGxlZAorICAgICB3aXRoaW4gdGFyZ2V0X3dhaXQsIGJ1dCBJJ20gbm90IHN1cmUgdGFyZ2V0X3dhaXQgc2hvdWxkIGJlIHJlc3VtaW5nIHRoZQorICAgICBpbmZlcmlvci4gICovCisgIFRBUkdFVF9XQUlUS0lORF9TUFVSSU9VUworICB9OworCisvKiBUaGUgbnVtYmVyaW5nIG9mIHRoZXNlIHNpZ25hbHMgaXMgY2hvc2VuIHRvIG1hdGNoIHRyYWRpdGlvbmFsIHVuaXgKKyAgIHNpZ25hbHMgKGluc29mYXIgYXMgdmFyaW91cyB1bmljZXMgdXNlIHRoZSBzYW1lIG51bWJlcnMsIGFueXdheSkuCisgICBJdCBpcyBhbHNvIHRoZSBudW1iZXJpbmcgb2YgdGhlIEdEQiByZW1vdGUgcHJvdG9jb2wuICBPdGhlciByZW1vdGUKKyAgIHByb3RvY29scywgaWYgdGhleSB1c2UgYSBkaWZmZXJlbnQgbnVtYmVyaW5nLCBzaG91bGQgbWFrZSBzdXJlIHRvCisgICB0cmFuc2xhdGUgYXBwcm9wcmlhdGVseS4gICovCisKKy8qIFRoaXMgaXMgYmFzZWQgc3Ryb25nbHkgb24gVW5peC9QT1NJWCBzaWduYWxzIGZvciBzZXZlcmFsIHJlYXNvbnM6CisgICAoMSkgVGhpcyBzZXQgb2Ygc2lnbmFscyByZXByZXNlbnRzIGEgd2lkZWx5LWFjY2VwdGVkIGF0dGVtcHQgdG8KKyAgIHJlcHJlc2VudCBldmVudHMgb2YgdGhpcyBzb3J0IGluIGEgcG9ydGFibGUgZmFzaGlvbiwgKDIpIHdlIHdhbnQgYQorICAgc2lnbmFsIHRvIG1ha2UgaXQgZnJvbSB3YWl0IHRvIGNoaWxkX3dhaXQgdG8gdGhlIHVzZXIgaW50YWN0LCAoMykgbWFueQorICAgcmVtb3RlIHByb3RvY29scyB1c2UgYSBzaW1pbGFyIGVuY29kaW5nLiAgSG93ZXZlciwgaXQgaXMKKyAgIHJlY29nbml6ZWQgdGhhdCB0aGlzIHNldCBvZiBzaWduYWxzIGhhcyBsaW1pdGF0aW9ucyAoc3VjaCBhcyBub3QKKyAgIGRpc3Rpbmd1aXNoaW5nIGJldHdlZW4gdmFyaW91cyBraW5kcyBvZiBTSUdTRUdWLCBvciBub3QKKyAgIGRpc3Rpbmd1aXNoaW5nIGhpdHRpbmcgYSBicmVha3BvaW50IGZyb20gZmluaXNoaW5nIGEgc2luZ2xlIHN0ZXApLgorICAgU28gaW4gdGhlIGZ1dHVyZSB3ZSBtYXkgZ2V0IGFyb3VuZCB0aGlzIGVpdGhlciBieSBhZGRpbmcgYWRkaXRpb25hbAorICAgc2lnbmFscyBmb3IgYnJlYWtwb2ludCwgc2luZ2xlLXN0ZXAsIGV0Yy4sIG9yIGJ5IGFkZGluZyBzaWduYWwKKyAgIGNvZGVzOyB0aGUgbGF0dGVyIHNlZW1zIG1vcmUgaW4gdGhlIHNwaXJpdCBvZiB3aGF0IEJTRCwgU3lzdGVtIFYsCisgICBldGMuIGFyZSBkb2luZyB0byBhZGRyZXNzIHRoZXNlIGlzc3Vlcy4gICovCisKKy8qIEZvciBhbiBleHBsYW5hdGlvbiBvZiB3aGF0IGVhY2ggc2lnbmFsIG1lYW5zLCBzZWUKKyAgIHRhcmdldF9zaWduYWxfdG9fc3RyaW5nLiAgKi8KKworZW51bSB0YXJnZXRfc2lnbmFsIHsKKyAgLyogVXNlZCBzb21lIHBsYWNlcyAoZS5nLiBzdG9wX3NpZ25hbCkgdG8gcmVjb3JkIHRoZSBjb25jZXB0IHRoYXQKKyAgICAgdGhlcmUgaXMgbm8gc2lnbmFsLiAgKi8KKyAgVEFSR0VUX1NJR05BTF8wID0gMCwKKyAgVEFSR0VUX1NJR05BTF9GSVJTVCA9IDAsCisgIFRBUkdFVF9TSUdOQUxfSFVQID0gMSwKKyAgVEFSR0VUX1NJR05BTF9JTlQgPSAyLAorICBUQVJHRVRfU0lHTkFMX1FVSVQgPSAzLAorICBUQVJHRVRfU0lHTkFMX0lMTCA9IDQsCisgIFRBUkdFVF9TSUdOQUxfVFJBUCA9IDUsCisgIFRBUkdFVF9TSUdOQUxfQUJSVCA9IDYsCisgIFRBUkdFVF9TSUdOQUxfRU1UID0gNywKKyAgVEFSR0VUX1NJR05BTF9GUEUgPSA4LAorICBUQVJHRVRfU0lHTkFMX0tJTEwgPSA5LAorICBUQVJHRVRfU0lHTkFMX0JVUyA9IDEwLAorICBUQVJHRVRfU0lHTkFMX1NFR1YgPSAxMSwKKyAgVEFSR0VUX1NJR05BTF9TWVMgPSAxMiwKKyAgVEFSR0VUX1NJR05BTF9QSVBFID0gMTMsCisgIFRBUkdFVF9TSUdOQUxfQUxSTSA9IDE0LAorICBUQVJHRVRfU0lHTkFMX1RFUk0gPSAxNSwKKyAgVEFSR0VUX1NJR05BTF9VUkcgPSAxNiwKKyAgVEFSR0VUX1NJR05BTF9TVE9QID0gMTcsCisgIFRBUkdFVF9TSUdOQUxfVFNUUCA9IDE4LAorICBUQVJHRVRfU0lHTkFMX0NPTlQgPSAxOSwKKyAgVEFSR0VUX1NJR05BTF9DSExEID0gMjAsCisgIFRBUkdFVF9TSUdOQUxfVFRJTiA9IDIxLAorICBUQVJHRVRfU0lHTkFMX1RUT1UgPSAyMiwKKyAgVEFSR0VUX1NJR05BTF9JTyA9IDIzLAorICBUQVJHRVRfU0lHTkFMX1hDUFUgPSAyNCwKKyAgVEFSR0VUX1NJR05BTF9YRlNaID0gMjUsCisgIFRBUkdFVF9TSUdOQUxfVlRBTFJNID0gMjYsCisgIFRBUkdFVF9TSUdOQUxfUFJPRiA9IDI3LAorICBUQVJHRVRfU0lHTkFMX1dJTkNIID0gMjgsCisgIFRBUkdFVF9TSUdOQUxfTE9TVCA9IDI5LAorICBUQVJHRVRfU0lHTkFMX1VTUjEgPSAzMCwKKyAgVEFSR0VUX1NJR05BTF9VU1IyID0gMzEsCisgIFRBUkdFVF9TSUdOQUxfUFdSID0gMzIsCisgIC8qIFNpbWlsYXIgdG8gU0lHSU8uICBQZXJoYXBzIHRoZXkgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbnVtYmVyLiAgKi8KKyAgVEFSR0VUX1NJR05BTF9QT0xMID0gMzMsCisgIFRBUkdFVF9TSUdOQUxfV0lORCA9IDM0LAorICBUQVJHRVRfU0lHTkFMX1BIT05FID0gMzUsCisgIFRBUkdFVF9TSUdOQUxfV0FJVElORyA9IDM2LAorICBUQVJHRVRfU0lHTkFMX0xXUCA9IDM3LAorICBUQVJHRVRfU0lHTkFMX0RBTkdFUiA9IDM4LAorICBUQVJHRVRfU0lHTkFMX0dSQU5UID0gMzksCisgIFRBUkdFVF9TSUdOQUxfUkVUUkFDVCA9IDQwLAorICBUQVJHRVRfU0lHTkFMX01TRyA9IDQxLAorICBUQVJHRVRfU0lHTkFMX1NPVU5EID0gNDIsCisgIFRBUkdFVF9TSUdOQUxfU0FLID0gNDMsCisgIFRBUkdFVF9TSUdOQUxfUFJJTyA9IDQ0LAorICBUQVJHRVRfU0lHTkFMX1JFQUxUSU1FXzMzID0gNDUsCisgIFRBUkdFVF9TSUdOQUxfUkVBTFRJTUVfMzQgPSA0NiwKKyAgVEFSR0VUX1NJR05BTF9SRUFMVElNRV8zNSA9IDQ3LAorICBUQVJHRVRfU0lHTkFMX1JFQUxUSU1FXzM2ID0gNDgsCisgIFRBUkdFVF9TSUdOQUxfUkVBTFRJTUVfMzcgPSA0OSwKKyAgVEFSR0VUX1NJR05BTF9SRUFMVElNRV8zOCA9IDUwLAorICBUQVJHRVRfU0lHTkFMX1JFQUxUSU1FXzM5ID0gNTEsCisgIFRBUkdFVF9TSUdOQUxfUkVBTFRJTUVfNDAgPSA1MiwKKyAgVEFSR0VUX1NJR05BTF9SRUFMVElNRV80MSA9IDUzLAorICBUQVJHRVRfU0lHTkFMX1JFQUxUSU1FXzQyID0gNTQsCisgIFRBUkdFVF9TSUdOQUxfUkVBTFRJTUVfNDMgPSA1NSwKKyAgVEFSR0VUX1NJR05BTF9SRUFMVElNRV80NCA9IDU2LAorICBUQVJHRVRfU0lHTkFMX1JFQUxUSU1FXzQ1ID0gNTcsCisgIFRBUkdFVF9TSUdOQUxfUkVBTFRJTUVfNDYgPSA1OCwKKyAgVEFSR0VUX1NJR05BTF9SRUFMVElNRV80NyA9IDU5LAorICBUQVJHRVRfU0lHTkFMX1JFQUxUSU1FXzQ4ID0gNjAsCisgIFRBUkdFVF9TSUdOQUxfUkVBTFRJTUVfNDkgPSA2MSwKKyAgVEFSR0VUX1NJR05BTF9SRUFMVElNRV81MCA9IDYyLAorICBUQVJHRVRfU0lHTkFMX1JFQUxUSU1FXzUxID0gNjMsCisgIFRBUkdFVF9TSUdOQUxfUkVBTFRJTUVfNTIgPSA2NCwKKyAgVEFSR0VUX1NJR05BTF9SRUFMVElNRV81MyA9IDY1LAorICBUQVJHRVRfU0lHTkFMX1JFQUxUSU1FXzU0ID0gNjYsCisgIFRBUkdFVF9TSUdOQUxfUkVBTFRJTUVfNTUgPSA2NywKKyAgVEFSR0VUX1NJR05BTF9SRUFMVElNRV81NiA9IDY4LAorICBUQVJHRVRfU0lHTkFMX1JFQUxUSU1FXzU3ID0gNjksCisgIFRBUkdFVF9TSUdOQUxfUkVBTFRJTUVfNTggPSA3MCwKKyAgVEFSR0VUX1NJR05BTF9SRUFMVElNRV81OSA9IDcxLAorICBUQVJHRVRfU0lHTkFMX1JFQUxUSU1FXzYwID0gNzIsCisgIFRBUkdFVF9TSUdOQUxfUkVBTFRJTUVfNjEgPSA3MywKKyAgVEFSR0VUX1NJR05BTF9SRUFMVElNRV82MiA9IDc0LAorICBUQVJHRVRfU0lHTkFMX1JFQUxUSU1FXzYzID0gNzUsCisjaWYgZGVmaW5lZChNQUNIKSB8fCBkZWZpbmVkKF9fTUFDSF9fKQorICAvKiBNYWNoIGV4Y2VwdGlvbnMgKi8KKyAgVEFSR0VUX0VYQ19CQURfQUNDRVNTID0gNzYsCisgIFRBUkdFVF9FWENfQkFEX0lOU1RSVUNUSU9OID0gNzcsCisgIFRBUkdFVF9FWENfQVJJVEhNRVRJQyA9IDc4LAorICBUQVJHRVRfRVhDX0VNVUxBVElPTiA9IDc5LAorICBUQVJHRVRfRVhDX1NPRlRXQVJFID0gODAsCisgIFRBUkdFVF9FWENfQlJFQUtQT0lOVCA9IDgxLAorI2VuZGlmCisgIC8qIFNvbWUgc2lnbmFsIHdlIGRvbid0IGtub3cgYWJvdXQuICAqLworICBUQVJHRVRfU0lHTkFMX1VOS05PV04sCisKKyAgLyogVXNlIHdoYXRldmVyIHNpZ25hbCB3ZSB1c2Ugd2hlbiBvbmUgaXMgbm90IHNwZWNpZmljYWxseSBzcGVjaWZpZWQKKyAgICAgKGZvciBwYXNzaW5nIHRvIHByb2NlZWQgYW5kIHNvIG9uKS4gICovCisgIFRBUkdFVF9TSUdOQUxfREVGQVVMVCwKKworICAvKiBMYXN0IGFuZCB1bnVzZWQgZW51bSB2YWx1ZSwgZm9yIHNpemluZyBhcnJheXMsIGV0Yy4gICovCisgIFRBUkdFVF9TSUdOQUxfTEFTVAorfTsKKworc3RydWN0IHRhcmdldF93YWl0c3RhdHVzIHsKKyAgZW51bSB0YXJnZXRfd2FpdGtpbmQga2luZDsKKworICAvKiBGb3JrZWQgY2hpbGQgcGlkLCBleGVjZCBwYXRobmFtZSwgZXhpdCBzdGF0dXMgb3Igc2lnbmFsIG51bWJlci4gICovCisgIHVuaW9uIHsKKyAgICBpbnQgaW50ZWdlcjsKKyAgICBlbnVtIHRhcmdldF9zaWduYWwgc2lnOworICAgIGludCAgcmVsYXRlZF9waWQ7CisgICAgY2hhciAqICBleGVjZF9wYXRobmFtZTsKKyAgICBpbnQgIHN5c2NhbGxfaWQ7CisgIH0gdmFsdWU7Cit9OworCisvKiBSZXR1cm4gdGhlIHN0cmluZyBmb3IgYSBzaWduYWwuICAqLworZXh0ZXJuIGNoYXIgKnRhcmdldF9zaWduYWxfdG9fc3RyaW5nIFBBUkFNUyAoKGVudW0gdGFyZ2V0X3NpZ25hbCkpOworCisvKiBSZXR1cm4gdGhlIG5hbWUgKFNJR0hVUCwgZXRjLikgZm9yIGEgc2lnbmFsLiAgKi8KK2V4dGVybiBjaGFyICp0YXJnZXRfc2lnbmFsX3RvX25hbWUgUEFSQU1TICgoZW51bSB0YXJnZXRfc2lnbmFsKSk7CisKKy8qIEdpdmVuIGEgbmFtZSAoU0lHSFVQLCBldGMuKSwgcmV0dXJuIGl0cyBzaWduYWwuICAqLworZW51bSB0YXJnZXRfc2lnbmFsIHRhcmdldF9zaWduYWxfZnJvbV9uYW1lIFBBUkFNUyAoKGNoYXIgKikpOworCisMCisvKiBJZiBjZXJ0YWluIGtpbmRzIG9mIGFjdGl2aXR5IGhhcHBlbiwgdGFyZ2V0X3dhaXQgc2hvdWxkIHBlcmZvcm0KKyAgIGNhbGxiYWNrcy4gICovCisvKiBSaWdodCBub3cgd2UganVzdCBjYWxsICgqVEFSR0VUX0FDVElWSVRZX0ZVTkNUSU9OKSBpZiBJL08gaXMgcG9zc2libGUKKyAgIG9uIFRBUkdFVF9BQ1RJVklUWV9GRC4gICAqLworZXh0ZXJuIGludCB0YXJnZXRfYWN0aXZpdHlfZmQ7CisvKiBSZXR1cm5zIHplcm8gdG8gbGVhdmUgdGhlIGluZmVyaW9yIGFsb25lLCBvbmUgdG8gaW50ZXJydXB0IGl0LiAgKi8KK2V4dGVybiBpbnQgKCp0YXJnZXRfYWN0aXZpdHlfZnVuY3Rpb24pIFBBUkFNUyAoKHZvaWQpKTsKKwwKK3N0cnVjdCB0YXJnZXRfb3BzCit7CisgIGNoYXIJICAgICAgICp0b19zaG9ydG5hbWU7CS8qIE5hbWUgdGhpcyB0YXJnZXQgdHlwZSAqLworICBjaGFyCSAgICAgICAqdG9fbG9uZ25hbWU7CS8qIE5hbWUgZm9yIHByaW50aW5nICovCisgIGNoYXIgCSAgICAgICAqdG9fZG9jOwkgICAgICAgIC8qIERvY3VtZW50YXRpb24uICBEb2VzIG5vdCBpbmNsdWRlIHRyYWlsaW5nCisJCQkJICAgbmV3bGluZSwgYW5kIHN0YXJ0cyB3aXRoIGEgb25lLWxpbmUgZGVzY3JpcC0KKwkJCQkgICB0aW9uIChwcm9iYWJseSBzaW1pbGFyIHRvIHRvX2xvbmduYW1lKS4gKi8KKyAgdm9pZCAJICAgICAgKCp0b19vcGVuKSBQQVJBTVMgKChjaGFyICosIGludCkpOworICB2b2lkIAkgICAgICAoKnRvX2Nsb3NlKSBQQVJBTVMgKChpbnQpKTsKKyAgdm9pZCAJICAgICAgKCp0b19hdHRhY2gpIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisgIHZvaWQgICAgICAgICgqdG9fcG9zdF9hdHRhY2gpIFBBUkFNUyAoKGludCkpOworICB2b2lkIAkgICAgICAoKnRvX3JlcXVpcmVfYXR0YWNoKSBQQVJBTVMgKChjaGFyICosIGludCkpOworICB2b2lkIAkgICAgICAoKnRvX2RldGFjaCkgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKyAgdm9pZCAJICAgICAgKCp0b19yZXF1aXJlX2RldGFjaCkgUEFSQU1TICgoaW50LCBjaGFyICosIGludCkpOworICB2b2lkIAkgICAgICAoKnRvX3Jlc3VtZSkgUEFSQU1TICgoaW50LCBpbnQsIGVudW0gdGFyZ2V0X3NpZ25hbCkpOworICBpbnQgIAkgICAgICAoKnRvX3dhaXQpIFBBUkFNUyAoKGludCwgc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICopKTsKKyAgdm9pZCAgICAgICAgKCp0b19wb3N0X3dhaXQpIFBBUkFNUyAoKGludCwgaW50KSk7CisgIHZvaWQgCSAgICAgICgqdG9fZmV0Y2hfcmVnaXN0ZXJzKSBQQVJBTVMgKChpbnQpKTsKKyAgdm9pZCAJICAgICAgKCp0b19zdG9yZV9yZWdpc3RlcnMpIFBBUkFNUyAoKGludCkpOworICB2b2lkIAkgICAgICAoKnRvX3ByZXBhcmVfdG9fc3RvcmUpIFBBUkFNUyAoKHZvaWQpKTsKKworICAvKiBUcmFuc2ZlciBMRU4gYnl0ZXMgb2YgbWVtb3J5IGJldHdlZW4gR0RCIGFkZHJlc3MgTVlBRERSIGFuZAorICAgICB0YXJnZXQgYWRkcmVzcyBNRU1BRERSLiAgSWYgV1JJVEUsIHRyYW5zZmVyIHRoZW0gdG8gdGhlIHRhcmdldCwgZWxzZQorICAgICB0cmFuc2ZlciB0aGVtIGZyb20gdGhlIHRhcmdldC4gIFRBUkdFVCBpcyB0aGUgdGFyZ2V0IGZyb20gd2hpY2ggd2UKKyAgICAgZ2V0IHRoaXMgZnVuY3Rpb24uCisKKyAgICAgUmV0dXJuIHZhbHVlLCBOLCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgICAwIG1lYW5zIHRoYXQgd2UgY2FuJ3QgaGFuZGxlIHRoaXMuICBJZiBlcnJubyBoYXMgYmVlbiBzZXQsIGl0IGlzIHRoZQorICAgICBlcnJvciB3aGljaCBwcmV2ZW50ZWQgdXMgZnJvbSBkb2luZyBpdCAoRklYTUU6IFdoYXQgYWJvdXQgYmZkX2Vycm9yPykuCisKKyAgICAgcG9zaXRpdmUgKGNhbGwgaXQgTikgbWVhbnMgdGhhdCB3ZSBoYXZlIHRyYW5zZmVycmVkIE4gYnl0ZXMKKyAgICAgc3RhcnRpbmcgYXQgTUVNQUREUi4gIFdlIG1pZ2h0IGJlIGFibGUgdG8gaGFuZGxlIG1vcmUgYnl0ZXMKKyAgICAgYmV5b25kIHRoaXMgbGVuZ3RoLCBidXQgbm8gcHJvbWlzZXMuCisKKyAgICAgbmVnYXRpdmUgKGNhbGwgaXRzIGFic29sdXRlIHZhbHVlIE4pIG1lYW5zIHRoYXQgd2UgY2Fubm90CisgICAgIHRyYW5zZmVyIHJpZ2h0IGF0IE1FTUFERFIsIGJ1dCB3ZSBjb3VsZCB0cmFuc2ZlciBhdCBsZWFzdAorICAgICBzb21ldGhpbmcgYXQgTUVNQUREUiArIE4uICAqLworCisgIGludCAgCSAgICAgICgqdG9feGZlcl9tZW1vcnkpIFBBUkFNUyAoKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsCisJCQkJCSBpbnQgbGVuLCBpbnQgd3JpdGUsCisJCQkJCSBzdHJ1Y3QgdGFyZ2V0X29wcyAqIHRhcmdldCkpOworCisjaWYgMAorICAvKiBFbmFibGUgdGhpcyBhZnRlciA0LjEyLiAgKi8KKworICAvKiBTZWFyY2ggdGFyZ2V0IG1lbW9yeS4gIFN0YXJ0IGF0IFNUQVJUQUREUiBhbmQgdGFrZSBMRU4gYnl0ZXMgb2YKKyAgICAgdGFyZ2V0IG1lbW9yeSwgYW5kIHRoZW0gd2l0aCBNQVNLLCBhbmQgY29tcGFyZSB0byBEQVRBLiAgSWYgdGhleQorICAgICBtYXRjaCwgc2V0ICpBRERSX0ZPVU5EIHRvIHRoZSBhZGRyZXNzIHdlIGZvdW5kIGl0IGF0LCBzdG9yZSB0aGUgZGF0YQorICAgICB3ZSBmb3VuZCBhdCBMRU4gYnl0ZXMgc3RhcnRpbmcgYXQgREFUQV9GT1VORCwgYW5kIHJldHVybi4gIElmCisgICAgIG5vdCwgYWRkIElOQ1JFTUVOVCB0byB0aGUgc2VhcmNoIGFkZHJlc3MgYW5kIGtlZXAgdHJ5aW5nIHVudGlsCisgICAgIHRoZSBzZWFyY2ggYWRkcmVzcyBpcyBvdXRzaWRlIG9mIHRoZSByYW5nZSBbTE9SQU5HRSxISVJBTkdFKS4KKworICAgICBJZiB3ZSBkb24ndCBmaW5kIGFueXRoaW5nLCBzZXQgKkFERFJfRk9VTkQgdG8gKENPUkVfQUREUikwIGFuZCByZXR1cm4uICAqLworICB2b2lkICgqdG9fc2VhcmNoKSBQQVJBTVMgKChpbnQgbGVuLCBjaGFyICpkYXRhLCBjaGFyICptYXNrLAorCQkJICAgICBDT1JFX0FERFIgc3RhcnRhZGRyLCBpbnQgaW5jcmVtZW50LAorCQkJICAgICBDT1JFX0FERFIgbG9yYW5nZSwgQ09SRV9BRERSIGhpcmFuZ2UsCisJCQkgICAgIENPUkVfQUREUiAqYWRkcl9mb3VuZCwgY2hhciAqZGF0YV9mb3VuZCkpOworCisjZGVmaW5lCXRhcmdldF9zZWFyY2gobGVuLCBkYXRhLCBtYXNrLCBzdGFydGFkZHIsIGluY3JlbWVudCwgbG9yYW5nZSwgaGlyYW5nZSwgYWRkcl9mb3VuZCwgZGF0YV9mb3VuZCkJXAorICAoKmN1cnJlbnRfdGFyZ2V0LnRvX3NlYXJjaCkgKGxlbiwgZGF0YSwgbWFzaywgc3RhcnRhZGRyLCBpbmNyZW1lbnQsIFwKKwkJCQlsb3JhbmdlLCBoaXJhbmdlLCBhZGRyX2ZvdW5kLCBkYXRhX2ZvdW5kKQorI2VuZGlmIC8qIDAgKi8KKworICB2b2lkIAkgICAgICAoKnRvX2ZpbGVzX2luZm8pIFBBUkFNUyAoKHN0cnVjdCB0YXJnZXRfb3BzICopKTsKKyAgaW50ICAJICAgICAgKCp0b19pbnNlcnRfYnJlYWtwb2ludCkgUEFSQU1TICgoQ09SRV9BRERSLCBjaGFyICopKTsKKyAgaW50IAkgICAgICAoKnRvX3JlbW92ZV9icmVha3BvaW50KSBQQVJBTVMgKChDT1JFX0FERFIsIGNoYXIgKikpOworICB2b2lkIAkgICAgICAoKnRvX3Rlcm1pbmFsX2luaXQpIFBBUkFNUyAoKHZvaWQpKTsKKyAgdm9pZCAJICAgICAgKCp0b190ZXJtaW5hbF9pbmZlcmlvcikgUEFSQU1TICgodm9pZCkpOworICB2b2lkIAkgICAgICAoKnRvX3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCkgUEFSQU1TICgodm9pZCkpOworICB2b2lkIAkgICAgICAoKnRvX3Rlcm1pbmFsX291cnMpIFBBUkFNUyAoKHZvaWQpKTsKKyAgdm9pZCAJICAgICAgKCp0b190ZXJtaW5hbF9pbmZvKSBQQVJBTVMgKChjaGFyICosIGludCkpOworICB2b2lkIAkgICAgICAoKnRvX2tpbGwpIFBBUkFNUyAoKHZvaWQpKTsKKyAgdm9pZCAJICAgICAgKCp0b19sb2FkKSBQQVJBTVMgKChjaGFyICosIGludCkpOworICBpbnQgCSAgICAgICgqdG9fbG9va3VwX3N5bWJvbCkgUEFSQU1TICgoY2hhciAqLCBDT1JFX0FERFIgKikpOworICB2b2lkIAkgICAgICAoKnRvX2NyZWF0ZV9pbmZlcmlvcikgUEFSQU1TICgoY2hhciAqLCBjaGFyICosIGNoYXIgKiopKTsKKyAgdm9pZCAgICAgICAgKCp0b19wb3N0X3N0YXJ0dXBfaW5mZXJpb3IpIFBBUkFNUyAoKGludCkpOworICB2b2lkICAgICAgICAoKnRvX2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IpIFBBUkFNUyAoKGludCkpOworICB2b2lkICAgICAgICAoKnRvX2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IpIFBBUkFNUyAoKGludCwgaW50ICopKTsKKyAgdm9pZCAgICAgICAgKCp0b19wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSkgUEFSQU1TICgodm9pZCkpOworICBpbnQgICAgICAgICAoKnRvX2luc2VydF9mb3JrX2NhdGNocG9pbnQpIFBBUkFNUyAoKGludCkpOworICBpbnQgICAgICAgICAoKnRvX3JlbW92ZV9mb3JrX2NhdGNocG9pbnQpIFBBUkFNUyAoKGludCkpOworICBpbnQgICAgICAgICAoKnRvX2luc2VydF92Zm9ya19jYXRjaHBvaW50KSBQQVJBTVMgKChpbnQpKTsKKyAgaW50ICAgICAgICAgKCp0b19yZW1vdmVfdmZvcmtfY2F0Y2hwb2ludCkgUEFSQU1TICgoaW50KSk7CisgIGludCAgICAgICAgICgqdG9faGFzX2ZvcmtlZCkgUEFSQU1TICgoaW50LCBpbnQgKikpOworICBpbnQgICAgICAgICAoKnRvX2hhc192Zm9ya2VkKSBQQVJBTVMgKChpbnQsIGludCAqKSk7CisgIGludCAgICAgICAgICgqdG9fY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjKSBQQVJBTVMgKCh2b2lkKSk7CisgIHZvaWQgICAgICAgICgqdG9fcG9zdF9mb2xsb3dfdmZvcmspIFBBUkFNUyAoKGludCwgaW50LCBpbnQsIGludCkpOworICBpbnQgICAgICAgICAoKnRvX2luc2VydF9leGVjX2NhdGNocG9pbnQpIFBBUkFNUyAoKGludCkpOworICBpbnQgICAgICAgICAoKnRvX3JlbW92ZV9leGVjX2NhdGNocG9pbnQpIFBBUkFNUyAoKGludCkpOworICBpbnQgICAgICAgICAoKnRvX2hhc19leGVjZCkgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7CisgIGludCAgICAgICAgICgqdG9fcmVwb3J0ZWRfZXhlY19ldmVudHNfcGVyX2V4ZWNfY2FsbCkgUEFSQU1TICgodm9pZCkpOworICBpbnQgICAgICAgICAoKnRvX2hhc19zeXNjYWxsX2V2ZW50KSBQQVJBTVMgKChpbnQsIGVudW0gdGFyZ2V0X3dhaXRraW5kICosIGludCAqKSk7CisgIGludCAgICAgICAgICgqdG9faGFzX2V4aXRlZCkgUEFSQU1TICgoaW50LCBpbnQsIGludCAqKSk7CisgIHZvaWQgCSAgICAgICgqdG9fbW91cm5faW5mZXJpb3IpIFBBUkFNUyAoKHZvaWQpKTsKKyAgaW50CSAgICAgICgqdG9fY2FuX3J1bikgUEFSQU1TICgodm9pZCkpOworICB2b2lkCSAgICAgICgqdG9fbm90aWNlX3NpZ25hbHMpIFBBUkFNUyAoKGludCBwaWQpKTsKKyAgaW50CSAgICAgICgqdG9fdGhyZWFkX2FsaXZlKSBQQVJBTVMgKChpbnQgcGlkKSk7CisgIHZvaWQJICAgICAgKCp0b19zdG9wKSBQQVJBTVMgKCh2b2lkKSk7CisgIGludCAJICAgICAgKCp0b19xdWVyeSkgUEFSQU1TICgoaW50LypjaGFyKi8sIGNoYXIgKiwgY2hhciAqLCBpbnQgKikpOworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lICogKCp0b19lbmFibGVfZXhjZXB0aW9uX2NhbGxiYWNrKSBQQVJBTVMgKChlbnVtIGV4Y2VwdGlvbl9ldmVudF9raW5kLCBpbnQpKTsKKyAgc3RydWN0IGV4Y2VwdGlvbl9ldmVudF9yZWNvcmQgKiAoKnRvX2dldF9jdXJyZW50X2V4Y2VwdGlvbl9ldmVudCkgUEFSQU1TICgodm9pZCkpOworICBjaGFyICogICAgICAoKnRvX3BpZF90b19leGVjX2ZpbGUpIFBBUkFNUyAoKGludCBwaWQpKTsKKyAgY2hhciAqICAgICAgKCp0b19jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUpIFBBUkFNUyAoKGNoYXIgKikpOworICBlbnVtIHN0cmF0YSAgIHRvX3N0cmF0dW07CisgIHN0cnVjdCB0YXJnZXRfb3BzCisJCSpET05UX1VTRTsJLyogZm9ybWVybHkgdG9fbmV4dCAqLworICBpbnQJCXRvX2hhc19hbGxfbWVtb3J5OworICBpbnQJCXRvX2hhc19tZW1vcnk7CisgIGludAkJdG9faGFzX3N0YWNrOworICBpbnQJCXRvX2hhc19yZWdpc3RlcnM7CisgIGludAkJdG9faGFzX2V4ZWN1dGlvbjsKKyAgaW50CQl0b19oYXNfdGhyZWFkX2NvbnRyb2w7CS8qIGNvbnRyb2wgdGhyZWFkIGV4ZWN1dGlvbiAqLworICBzdHJ1Y3Qgc2VjdGlvbl90YWJsZQorICAgIAkgICAgICAgKnRvX3NlY3Rpb25zOworICBzdHJ1Y3Qgc2VjdGlvbl90YWJsZQorCSAgICAgICAqdG9fc2VjdGlvbnNfZW5kOworICBpbnQJCXRvX21hZ2ljOworICAvKiBOZWVkIHN1Yi1zdHJ1Y3R1cmUgZm9yIHRhcmdldCBtYWNoaW5lIHJlbGF0ZWQgcmF0aGVyIHRoYW4gY29tbSByZWxhdGVkPyAqLworfTsKKworLyogTWFnaWMgbnVtYmVyIGZvciBjaGVja2luZyBvcHMgc2l6ZS4gIElmIGEgc3RydWN0IGRvZXNuJ3QgZW5kIHdpdGggdGhpcworICAgbnVtYmVyLCBzb21lYm9keSBjaGFuZ2VkIHRoZSBkZWNsYXJhdGlvbiBidXQgZGlkbid0IGNoYW5nZSBhbGwgdGhlCisgICBwbGFjZXMgdGhhdCBpbml0aWFsaXplIG9uZS4gICovCisKKyNkZWZpbmUJT1BTX01BR0lDCTM4NDAKKworLyogVGhlIG9wcyBzdHJ1Y3R1cmUgZm9yIG91ciAiY3VycmVudCIgdGFyZ2V0IHByb2Nlc3MuICBUaGlzIHNob3VsZAorICAgbmV2ZXIgYmUgTlVMTC4gIElmIHRoZXJlIGlzIG5vIHRhcmdldCwgaXQgcG9pbnRzIHRvIHRoZSBkdW1teV90YXJnZXQuICAqLworCitleHRlcm4gc3RydWN0IHRhcmdldF9vcHMJY3VycmVudF90YXJnZXQ7CisKKy8qIEFuIGl0ZW0gb24gdGhlIHRhcmdldCBzdGFjay4gICovCisKK3N0cnVjdCB0YXJnZXRfc3RhY2tfaXRlbQoreworICBzdHJ1Y3QgdGFyZ2V0X3N0YWNrX2l0ZW0gKm5leHQ7CisgIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXRfb3BzOworfTsKKworLyogVGhlIHRhcmdldCBzdGFjay4gICovCisKK2V4dGVybiBzdHJ1Y3QgdGFyZ2V0X3N0YWNrX2l0ZW0gKnRhcmdldF9zdGFjazsKKworLyogRGVmaW5lIGVhc3kgd29yZHMgZm9yIGRvaW5nIHRoZXNlIG9wZXJhdGlvbnMgb24gb3VyIGN1cnJlbnQgdGFyZ2V0LiAgKi8KKworI2RlZmluZQl0YXJnZXRfc2hvcnRuYW1lCShjdXJyZW50X3RhcmdldC50b19zaG9ydG5hbWUpCisjZGVmaW5lCXRhcmdldF9sb25nbmFtZQkJKGN1cnJlbnRfdGFyZ2V0LnRvX2xvbmduYW1lKQorCisvKiBUaGUgb3BlbiByb3V0aW5lIHRha2VzIHRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzIGZyb20gdGhlIGNvbW1hbmQsCisgICBhbmQgKGlmIHN1Y2Nlc3NmdWwpIHB1c2hlcyBhIG5ldyB0YXJnZXQgb250byB0aGUgc3RhY2suCisgICBUYXJnZXRzIHNob3VsZCBzdXBwbHkgdGhpcyByb3V0aW5lLCBpZiBvbmx5IHRvIHByb3ZpZGUgYW4gZXJyb3IgbWVzc2FnZS4gICovCisjZGVmaW5lCXRhcmdldF9vcGVuKG5hbWUsIGZyb21fdHR5KQlcCisJKCpjdXJyZW50X3RhcmdldC50b19vcGVuKSAobmFtZSwgZnJvbV90dHkpCisKKy8qIERvZXMgd2hhdGV2ZXIgY2xlYW51cCBpcyByZXF1aXJlZCBmb3IgYSB0YXJnZXQgdGhhdCB3ZSBhcmUgbm8gbG9uZ2VyCisgICBnb2luZyB0byBiZSBjYWxsaW5nLiAgQXJndW1lbnQgc2F5cyB3aGV0aGVyIHdlIGFyZSBxdWl0dGluZyBnZGIgYW5kCisgICBzaG91bGQgbm90IGdldCBodW5nIGluIGNhc2Ugb2YgZXJyb3JzLCBvciB3aGV0aGVyIHdlIHdhbnQgYSBjbGVhbgorICAgdGVybWluYXRpb24gZXZlbiBpZiBpdCB0YWtlcyBhIHdoaWxlLiAgVGhpcyByb3V0aW5lIGlzIGF1dG9tYXRpY2FsbHkKKyAgIGFsd2F5cyBjYWxsZWQganVzdCBiZWZvcmUgYSByb3V0aW5lIGlzIHBvcHBlZCBvZmYgdGhlIHRhcmdldCBzdGFjay4KKyAgIENsb3NpbmcgZmlsZSBkZXNjcmlwdG9ycyBhbmQgZnJlZWluZyBtZW1vcnkgYXJlIHR5cGljYWwgdGhpbmdzIGl0IHNob3VsZAorICAgZG8uICAqLworCisjZGVmaW5lCXRhcmdldF9jbG9zZShxdWl0dGluZykJXAorCSgqY3VycmVudF90YXJnZXQudG9fY2xvc2UpIChxdWl0dGluZykKKworLyogQXR0YWNoZXMgdG8gYSBwcm9jZXNzIG9uIHRoZSB0YXJnZXQgc2lkZS4gIEFyZ3VtZW50cyBhcmUgYXMgcGFzc2VkCisgICB0byB0aGUgYGF0dGFjaCcgY29tbWFuZCBieSB0aGUgdXNlci4gIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkCisgICB3aGVuIHRoZSB0YXJnZXQgaXMgbm90IG9uIHRoZSB0YXJnZXQtc3RhY2ssIGlmIHRoZSB0YXJnZXRfY2FuX3J1bgorICAgcm91dGluZSByZXR1cm5zIDE7IGluIHRoYXQgY2FzZSwgaXQgbXVzdCBwdXNoIGl0c2VsZiBvbnRvIHRoZSBzdGFjay4gIAorICAgVXBvbiBleGl0LCB0aGUgdGFyZ2V0IHNob3VsZCBiZSByZWFkeSBmb3Igbm9ybWFsIG9wZXJhdGlvbnMsIGFuZAorICAgc2hvdWxkIGJlIHJlYWR5IHRvIGRlbGl2ZXIgdGhlIHN0YXR1cyBvZiB0aGUgcHJvY2VzcyBpbW1lZGlhdGVseSAKKyAgICh3aXRob3V0IHdhaXRpbmcpIHRvIGFuIHVwY29taW5nIHRhcmdldF93YWl0IGNhbGwuICAqLworCisjZGVmaW5lCXRhcmdldF9hdHRhY2goYXJncywgZnJvbV90dHkpCVwKKwkoKmN1cnJlbnRfdGFyZ2V0LnRvX2F0dGFjaCkgKGFyZ3MsIGZyb21fdHR5KQorCisvKiBUaGUgdGFyZ2V0X2F0dGFjaCBvcGVyYXRpb24gcGxhY2VzIGEgcHJvY2VzcyB1bmRlciBkZWJ1Z2dlciBjb250cm9sLAorICAgYW5kIHN0b3BzIHRoZSBwcm9jZXNzLgorCisgICBUaGlzIG9wZXJhdGlvbiBwcm92aWRlcyBhIHRhcmdldC1zcGVjaWZpYyBob29rIHRoYXQgYWxsb3dzIHRoZQorICAgbmVjZXNzYXJ5IGJvb2trZWVwaW5nIHRvIGJlIHBlcmZvcm1lZCBhZnRlciBhbiBhdHRhY2ggY29tcGxldGVzLgorICAgKi8KKyNkZWZpbmUgdGFyZ2V0X3Bvc3RfYXR0YWNoKHBpZCkgXAorICAgICAgICAoKmN1cnJlbnRfdGFyZ2V0LnRvX3Bvc3RfYXR0YWNoKSAocGlkKQorCisvKiBBdHRhY2hlcyB0byBhIHByb2Nlc3Mgb24gdGhlIHRhcmdldCBzaWRlLCBpZiBub3QgYWxyZWFkeSBhdHRhY2hlZC4KKyAgIChJZiBhbHJlYWR5IGF0dGFjaGVkLCB0YWtlcyBubyBhY3Rpb24uKQorCisgICBUaGlzIG9wZXJhdGlvbiBjYW4gYmUgdXNlZCB0byBmb2xsb3cgdGhlIGNoaWxkIHByb2Nlc3Mgb2YgYSBmb3JrLgorICAgT24gc29tZSB0YXJnZXRzLCBzdWNoIGNoaWxkIHByb2Nlc3NlcyBvZiBhbiBvcmlnaW5hbCBpbmZlcmlvciBwcm9jZXNzCisgICBhcmUgYXV0b21hdGljYWxseSB1bmRlciBkZWJ1Z2dlciBjb250cm9sLCBhbmQgdGh1cyBkbyBub3QgcmVxdWlyZSBhbgorICAgYWN0dWFsIGF0dGFjaCBvcGVyYXRpb24uICAqLworCisjZGVmaW5lCXRhcmdldF9yZXF1aXJlX2F0dGFjaChhcmdzLCBmcm9tX3R0eSkJXAorCSgqY3VycmVudF90YXJnZXQudG9fcmVxdWlyZV9hdHRhY2gpIChhcmdzLCBmcm9tX3R0eSkKKworLyogVGFrZXMgYSBwcm9ncmFtIHByZXZpb3VzbHkgYXR0YWNoZWQgdG8gYW5kIGRldGFjaGVzIGl0LgorICAgVGhlIHByb2dyYW0gbWF5IHJlc3VtZSBleGVjdXRpb24gKHNvbWUgdGFyZ2V0cyBkbywgc29tZSBkb24ndCkgYW5kIHdpbGwKKyAgIG5vIGxvbmdlciBzdG9wIG9uIHNpZ25hbHMsIGV0Yy4gIFdlIGJldHRlciBub3QgaGF2ZSBsZWZ0IGFueSBicmVha3BvaW50cworICAgaW4gdGhlIHByb2dyYW0gb3IgaXQnbGwgZGllIHdoZW4gaXQgaGl0cyBvbmUuICBBUkdTIGlzIGFyZ3VtZW50cworICAgdHlwZWQgYnkgdGhlIHVzZXIgKGUuZy4gYSBzaWduYWwgdG8gc2VuZCB0aGUgcHJvY2VzcykuICBGUk9NX1RUWQorICAgc2F5cyB3aGV0aGVyIHRvIGJlIHZlcmJvc2Ugb3Igbm90LiAgKi8KKworZXh0ZXJuIHZvaWQKK3RhcmdldF9kZXRhY2ggUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworLyogRGV0YWNoZXMgZnJvbSBhIHByb2Nlc3Mgb24gdGhlIHRhcmdldCBzaWRlLCBpZiBub3QgYWxyZWFkeSBkZXR0YWNoZWQuCisgICAoSWYgYWxyZWFkeSBkZXRhY2hlZCwgdGFrZXMgbm8gYWN0aW9uLikKKworICAgVGhpcyBvcGVyYXRpb24gY2FuIGJlIHVzZWQgdG8gZm9sbG93IHRoZSBwYXJlbnQgcHJvY2VzcyBvZiBhIGZvcmsuCisgICBPbiBzb21lIHRhcmdldHMsIHN1Y2ggY2hpbGQgcHJvY2Vzc2VzIG9mIGFuIG9yaWdpbmFsIGluZmVyaW9yIHByb2Nlc3MKKyAgIGFyZSBhdXRvbWF0aWNhbGx5IHVuZGVyIGRlYnVnZ2VyIGNvbnRyb2wsIGFuZCB0aHVzIGRvIHJlcXVpcmUgYW4gYWN0dWFsCisgICBkZXRhY2ggb3BlcmF0aW9uLgorCisgICBQSUQgaXMgdGhlIHByb2Nlc3MgaWQgb2YgdGhlIGNoaWxkIHRvIGRldGFjaCBmcm9tLgorICAgQVJHUyBpcyBhcmd1bWVudHMgdHlwZWQgYnkgdGhlIHVzZXIgKGUuZy4gYSBzaWduYWwgdG8gc2VuZCB0aGUgcHJvY2VzcykuCisgICBGUk9NX1RUWSBzYXlzIHdoZXRoZXIgdG8gYmUgdmVyYm9zZSBvciBub3QuICAqLworCisjZGVmaW5lIHRhcmdldF9yZXF1aXJlX2RldGFjaChwaWQsIGFyZ3MsIGZyb21fdHR5KSBcCisJKCpjdXJyZW50X3RhcmdldC50b19yZXF1aXJlX2RldGFjaCkgKHBpZCwgYXJncywgZnJvbV90dHkpCisKKy8qIFJlc3VtZSBleGVjdXRpb24gb2YgdGhlIHRhcmdldCBwcm9jZXNzIFBJRC4gIFNURVAgc2F5cyB3aGV0aGVyIHRvCisgICBzaW5nbGUtc3RlcCBvciB0byBydW4gZnJlZTsgU0lHR05BTCBpcyB0aGUgc2lnbmFsIHRvIGJlIGdpdmVuIHRvCisgICB0aGUgdGFyZ2V0LCBvciBUQVJHRVRfU0lHTkFMXzAgZm9yIG5vIHNpZ25hbC4gIFRoZSBjYWxsZXIgbWF5IG5vdAorICAgcGFzcyBUQVJHRVRfU0lHTkFMX0RFRkFVTFQuICAqLworCisjZGVmaW5lCXRhcmdldF9yZXN1bWUocGlkLCBzdGVwLCBzaWdnbmFsKQlcCisJKCpjdXJyZW50X3RhcmdldC50b19yZXN1bWUpIChwaWQsIHN0ZXAsIHNpZ2duYWwpCisKKy8qIFdhaXQgZm9yIHByb2Nlc3MgcGlkIHRvIGRvIHNvbWV0aGluZy4gIFBpZCA9IC0xIHRvIHdhaXQgZm9yIGFueSBwaWQKKyAgIHRvIGRvIHNvbWV0aGluZy4gIFJldHVybiBwaWQgb2YgY2hpbGQsIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3I7CisgICBzdG9yZSBzdGF0dXMgdGhyb3VnaCBhcmd1bWVudCBwb2ludGVyIFNUQVRVUy4gIE5vdGUgdGhhdCBpdCBpcworICAgKm5vdCogT0sgdG8gcmV0dXJuX3RvX3RvcF9sZXZlbCBvdXQgb2YgdGFyZ2V0X3dhaXQgd2l0aG91dCBwb3BwaW5nCisgICB0aGUgZGVidWdnaW5nIHRhcmdldCBmcm9tIHRoZSBzdGFjazsgR0RCIGlzbid0IHByZXBhcmVkIHRvIGdldCBiYWNrCisgICB0byB0aGUgcHJvbXB0IHdpdGggYSBkZWJ1Z2dpbmcgdGFyZ2V0IGJ1dCB3aXRob3V0IHRoZSBmcmFtZSBjYWNoZSwKKyAgIHN0b3BfcGMsIGV0Yy4sIHNldCB1cC4gICovCisKKyNkZWZpbmUJdGFyZ2V0X3dhaXQocGlkLCBzdGF0dXMpCQlcCisJKCpjdXJyZW50X3RhcmdldC50b193YWl0KSAocGlkLCBzdGF0dXMpCisKKy8qIFRoZSB0YXJnZXRfd2FpdCBvcGVyYXRpb24gd2FpdHMgZm9yIGEgcHJvY2VzcyBldmVudCB0byBvY2N1ciwgYW5kCisgICB0aGVyZWJ5IHN0b3AgdGhlIHByb2Nlc3MuCisKKyAgIE9uIHNvbWUgdGFyZ2V0cywgY2VydGFpbiBldmVudHMgbWF5IGhhcHBlbiBpbiBzZXF1ZW5jZXMuICBnZGIncworICAgY29ycmVjdCByZXNwb25zZSB0byBhbnkgc2luZ2xlIGV2ZW50IG9mIHN1Y2ggYSBzZXF1ZW5jZSBtYXkgcmVxdWlyZQorICAga25vd2xlZGdlIG9mIHdoYXQgZWFybGllciBldmVudHMgaW4gdGhlIHNlcXVlbmNlIGhhdmUgYmVlbiBzZWVuLgorCisgICBUaGlzIG9wZXJhdGlvbiBwcm92aWRlcyBhIHRhcmdldC1zcGVjaWZpYyBob29rIHRoYXQgYWxsb3dzIHRoZQorICAgbmVjZXNzYXJ5IGJvb2trZWVwaW5nIHRvIGJlIHBlcmZvcm1lZCB0byB0cmFjayBzdWNoIHNlcXVlbmNlcy4KKyAgICovCisKKyNkZWZpbmUgdGFyZ2V0X3Bvc3Rfd2FpdChwaWQsIHN0YXR1cykgXAorICAgICAgICAoKmN1cnJlbnRfdGFyZ2V0LnRvX3Bvc3Rfd2FpdCkgKHBpZCwgc3RhdHVzKQorCisvKiBGZXRjaCByZWdpc3RlciBSRUdOTywgb3IgYWxsIHJlZ3MgaWYgcmVnbm8gPT0gLTEuICBObyByZXN1bHQuICAqLworCisjZGVmaW5lCXRhcmdldF9mZXRjaF9yZWdpc3RlcnMocmVnbm8pCVwKKwkoKmN1cnJlbnRfdGFyZ2V0LnRvX2ZldGNoX3JlZ2lzdGVycykgKHJlZ25vKQorCisvKiBTdG9yZSBhdCBsZWFzdCByZWdpc3RlciBSRUdOTywgb3IgYWxsIHJlZ3MgaWYgUkVHTk8gPT0gLTEuCisgICBJdCBjYW4gc3RvcmUgYXMgbWFueSByZWdpc3RlcnMgYXMgaXQgd2FudHMgdG8sIHNvIHRhcmdldF9wcmVwYXJlX3RvX3N0b3JlCisgICBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IGNhbGxlZC4gIENhbGxzIGVycm9yKCkgaWYgdGhlcmUgYXJlIHByb2JsZW1zLiAgKi8KKworI2RlZmluZQl0YXJnZXRfc3RvcmVfcmVnaXN0ZXJzKHJlZ3MpCVwKKwkoKmN1cnJlbnRfdGFyZ2V0LnRvX3N0b3JlX3JlZ2lzdGVycykgKHJlZ3MpCisKKy8qIEdldCByZWFkeSB0byBtb2RpZnkgdGhlIHJlZ2lzdGVycyBhcnJheS4gIE9uIG1hY2hpbmVzIHdoaWNoIHN0b3JlCisgICBpbmRpdmlkdWFsIHJlZ2lzdGVycywgdGhpcyBkb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuICBPbiBtYWNoaW5lcworICAgd2hpY2ggc3RvcmUgYWxsIHRoZSByZWdpc3RlcnMgaW4gb25lIGZlbGwgc3dvb3AsIHRoaXMgbWFrZXMgc3VyZQorICAgdGhhdCBSRUdJU1RFUlMgY29udGFpbnMgYWxsIHRoZSByZWdpc3RlcnMgZnJvbSB0aGUgcHJvZ3JhbSBiZWluZworICAgZGVidWdnZWQuICAqLworCisjZGVmaW5lCXRhcmdldF9wcmVwYXJlX3RvX3N0b3JlKCkJXAorCSgqY3VycmVudF90YXJnZXQudG9fcHJlcGFyZV90b19zdG9yZSkgKCkKKworZXh0ZXJuIGludCB0YXJnZXRfcmVhZF9zdHJpbmcgUEFSQU1TICgoQ09SRV9BRERSLCBjaGFyICoqLCBpbnQsIGludCAqKSk7CisKK2V4dGVybiBpbnQKK3RhcmdldF9yZWFkX21lbW9yeSBQQVJBTVMgKChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqbXlhZGRyLCBpbnQgbGVuKSk7CisKK2V4dGVybiBpbnQKK3RhcmdldF9yZWFkX21lbW9yeV9zZWN0aW9uIFBBUkFNUyAoKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpteWFkZHIsIGludCBsZW4sCisJCQkJICAgIGFzZWN0aW9uICpiZmRfc2VjdGlvbikpOworCitleHRlcm4gaW50Cit0YXJnZXRfcmVhZF9tZW1vcnlfcGFydGlhbCBQQVJBTVMgKChDT1JFX0FERFIsIGNoYXIgKiwgaW50LCBpbnQgKikpOworCitleHRlcm4gaW50Cit0YXJnZXRfd3JpdGVfbWVtb3J5IFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqLCBpbnQpKTsKKworZXh0ZXJuIGludAoreGZlcl9tZW1vcnkgUEFSQU1TICgoQ09SRV9BRERSLCBjaGFyICosIGludCwgaW50LCBzdHJ1Y3QgdGFyZ2V0X29wcyAqKSk7CisKK2V4dGVybiBpbnQKK2NoaWxkX3hmZXJfbWVtb3J5IFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqLCBpbnQsIGludCwgc3RydWN0IHRhcmdldF9vcHMgKikpOworCitleHRlcm4gY2hhciAqCitjaGlsZF9waWRfdG9fZXhlY19maWxlIFBBUkFNUyAoKGludCkpOworCitleHRlcm4gY2hhciAqCitjaGlsZF9jb3JlX2ZpbGVfdG9fc3ltX2ZpbGUgUEFSQU1TICgoY2hhciAqKSk7CisKKyNpZiBkZWZpbmVkKENISUxEX1BPU1RfQVRUQUNIKQorZXh0ZXJuIHZvaWQKK2NoaWxkX3Bvc3RfYXR0YWNoIFBBUkFNUyAoKGludCkpOworI2VuZGlmCisKK2V4dGVybiB2b2lkCitjaGlsZF9wb3N0X3dhaXQgUEFSQU1TICgoaW50LCBpbnQpKTsKKworZXh0ZXJuIHZvaWQKK2NoaWxkX3Bvc3Rfc3RhcnR1cF9pbmZlcmlvciBQQVJBTVMgKChpbnQpKTsKKworZXh0ZXJuIHZvaWQKK2NoaWxkX2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IgUEFSQU1TICgoaW50KSk7CisKK2V4dGVybiB2b2lkCitjaGlsZF9jbG9uZV9hbmRfZm9sbG93X2luZmVyaW9yIFBBUkFNUyAoKGludCwgaW50ICopKTsKKworZXh0ZXJuIHZvaWQKK2NoaWxkX3Bvc3RfZm9sbG93X2luZmVyaW9yX2J5X2Nsb25lIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIGludAorY2hpbGRfaW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCBQQVJBTVMgKChpbnQpKTsKKworZXh0ZXJuIGludAorY2hpbGRfcmVtb3ZlX2ZvcmtfY2F0Y2hwb2ludCBQQVJBTVMgKChpbnQpKTsKKworZXh0ZXJuIGludAorY2hpbGRfaW5zZXJ0X3Zmb3JrX2NhdGNocG9pbnQgUEFSQU1TICgoaW50KSk7CisKK2V4dGVybiBpbnQKK2NoaWxkX3JlbW92ZV92Zm9ya19jYXRjaHBvaW50IFBBUkFNUyAoKGludCkpOworCitleHRlcm4gaW50CitjaGlsZF9oYXNfZm9ya2VkIFBBUkFNUyAoKGludCwgaW50ICopKTsKKworZXh0ZXJuIGludAorY2hpbGRfaGFzX3Zmb3JrZWQgUEFSQU1TICgoaW50LCBpbnQgKikpOworCitleHRlcm4gdm9pZAorY2hpbGRfYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvciBQQVJBTVMgKChpbnQpKTsKKworZXh0ZXJuIGludAorY2hpbGRfY2FuX2ZvbGxvd192Zm9ya19wcmlvcl90b19leGVjIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQKK2NoaWxkX3Bvc3RfZm9sbG93X3Zmb3JrIFBBUkFNUyAoKGludCwgaW50LCBpbnQsIGludCkpOworCitleHRlcm4gaW50CitjaGlsZF9pbnNlcnRfZXhlY19jYXRjaHBvaW50IFBBUkFNUyAoKGludCkpOworCitleHRlcm4gaW50CitjaGlsZF9yZW1vdmVfZXhlY19jYXRjaHBvaW50IFBBUkFNUyAoKGludCkpOworCitleHRlcm4gaW50CitjaGlsZF9oYXNfZXhlY2QgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7CisKK2V4dGVybiBpbnQKK2NoaWxkX3JlcG9ydGVkX2V4ZWNfZXZlbnRzX3Blcl9leGVjX2NhbGwgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gaW50CitjaGlsZF9oYXNfc3lzY2FsbF9ldmVudCBQQVJBTVMgKChpbnQsIGVudW0gdGFyZ2V0X3dhaXRraW5kICosIGludCAqKSk7CisKK2V4dGVybiBpbnQKK2NoaWxkX2hhc19leGl0ZWQgUEFSQU1TICgoaW50LCBpbnQsIGludCAqKSk7CisKK2V4dGVybiBpbnQKK2NoaWxkX3RocmVhZF9hbGl2ZSBQQVJBTVMgKChpbnQpKTsKKworLyogRnJvbSBleGVjLmMgKi8KKworZXh0ZXJuIHZvaWQKK3ByaW50X3NlY3Rpb25faW5mbyBQQVJBTVMgKChzdHJ1Y3QgdGFyZ2V0X29wcyAqLCBiZmQgKikpOworCisvKiBQcmludCBhIGxpbmUgYWJvdXQgdGhlIGN1cnJlbnQgdGFyZ2V0LiAgKi8KKworI2RlZmluZQl0YXJnZXRfZmlsZXNfaW5mbygpCVwKKwkoKmN1cnJlbnRfdGFyZ2V0LnRvX2ZpbGVzX2luZm8pICgmY3VycmVudF90YXJnZXQpCisKKy8qIEluc2VydCBhIGJyZWFrcG9pbnQgYXQgYWRkcmVzcyBBRERSIGluIHRoZSB0YXJnZXQgbWFjaGluZS4KKyAgIFNBVkUgaXMgYSBwb2ludGVyIHRvIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHNhdmluZyB0aGUKKyAgIHRhcmdldCBjb250ZW50cy4gIEl0IGlzIGd1YXJhbnRlZWQgYnkgdGhlIGNhbGxlciB0byBiZSBsb25nIGVub3VnaAorICAgdG8gc2F2ZSAic2l6ZW9mIEJSRUFLUE9JTlQiIGJ5dGVzLiAgUmVzdWx0IGlzIDAgZm9yIHN1Y2Nlc3MsIG9yCisgICBhbiBlcnJubyB2YWx1ZS4gICovCisKKyNkZWZpbmUJdGFyZ2V0X2luc2VydF9icmVha3BvaW50KGFkZHIsIHNhdmUpCVwKKwkoKmN1cnJlbnRfdGFyZ2V0LnRvX2luc2VydF9icmVha3BvaW50KSAoYWRkciwgc2F2ZSkKKworLyogUmVtb3ZlIGEgYnJlYWtwb2ludCBhdCBhZGRyZXNzIEFERFIgaW4gdGhlIHRhcmdldCBtYWNoaW5lLgorICAgU0FWRSBpcyBhIHBvaW50ZXIgdG8gdGhlIHNhbWUgc2F2ZSBhcmVhIAorICAgdGhhdCB3YXMgcHJldmlvdXNseSBwYXNzZWQgdG8gdGFyZ2V0X2luc2VydF9icmVha3BvaW50LiAgCisgICBSZXN1bHQgaXMgMCBmb3Igc3VjY2Vzcywgb3IgYW4gZXJybm8gdmFsdWUuICAqLworCisjZGVmaW5lCXRhcmdldF9yZW1vdmVfYnJlYWtwb2ludChhZGRyLCBzYXZlKQlcCisJKCpjdXJyZW50X3RhcmdldC50b19yZW1vdmVfYnJlYWtwb2ludCkgKGFkZHIsIHNhdmUpCisKKy8qIEluaXRpYWxpemUgdGhlIHRlcm1pbmFsIHNldHRpbmdzIHdlIHJlY29yZCBmb3IgdGhlIGluZmVyaW9yLAorICAgYmVmb3JlIHdlIGFjdHVhbGx5IHJ1biB0aGUgaW5mZXJpb3IuICAqLworCisjZGVmaW5lIHRhcmdldF90ZXJtaW5hbF9pbml0KCkgXAorCSgqY3VycmVudF90YXJnZXQudG9fdGVybWluYWxfaW5pdCkgKCkKKworLyogUHV0IHRoZSBpbmZlcmlvcidzIHRlcm1pbmFsIHNldHRpbmdzIGludG8gZWZmZWN0LgorICAgVGhpcyBpcyBwcmVwYXJhdGlvbiBmb3Igc3RhcnRpbmcgb3IgcmVzdW1pbmcgdGhlIGluZmVyaW9yLiAgKi8KKworI2RlZmluZSB0YXJnZXRfdGVybWluYWxfaW5mZXJpb3IoKSBcCisJKCpjdXJyZW50X3RhcmdldC50b190ZXJtaW5hbF9pbmZlcmlvcikgKCkKKworLyogUHV0IHNvbWUgb2Ygb3VyIHRlcm1pbmFsIHNldHRpbmdzIGludG8gZWZmZWN0LAorICAgZW5vdWdoIHRvIGdldCBwcm9wZXIgcmVzdWx0cyBmcm9tIG91ciBvdXRwdXQsCisgICBidXQgZG8gbm90IGNoYW5nZSBpbnRvIG9yIG91dCBvZiBSQVcgbW9kZQorICAgc28gdGhhdCBubyBpbnB1dCBpcyBkaXNjYXJkZWQuCisKKyAgIEFmdGVyIGRvaW5nIHRoaXMsIGVpdGhlciB0ZXJtaW5hbF9vdXJzIG9yIHRlcm1pbmFsX2luZmVyaW9yCisgICBzaG91bGQgYmUgY2FsbGVkIHRvIGdldCBiYWNrIHRvIGEgbm9ybWFsIHN0YXRlIG9mIGFmZmFpcnMuICAqLworCisjZGVmaW5lIHRhcmdldF90ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQoKSBcCisJKCpjdXJyZW50X3RhcmdldC50b190ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQpICgpCisKKy8qIFB1dCBvdXIgdGVybWluYWwgc2V0dGluZ3MgaW50byBlZmZlY3QuCisgICBGaXJzdCByZWNvcmQgdGhlIGluZmVyaW9yJ3MgdGVybWluYWwgc2V0dGluZ3MKKyAgIHNvIHRoZXkgY2FuIGJlIHJlc3RvcmVkIHByb3Blcmx5IGxhdGVyLiAgKi8KKworI2RlZmluZSB0YXJnZXRfdGVybWluYWxfb3VycygpIFwKKwkoKmN1cnJlbnRfdGFyZ2V0LnRvX3Rlcm1pbmFsX291cnMpICgpCisKKy8qIFByaW50IHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCBvdXIgdGVybWluYWwgc3RhdHVzLCBpZiBzdWNoIGEgdGhpbmcKKyAgIGV4aXN0cy4gICovCisKKyNkZWZpbmUgdGFyZ2V0X3Rlcm1pbmFsX2luZm8oYXJnLCBmcm9tX3R0eSkgXAorCSgqY3VycmVudF90YXJnZXQudG9fdGVybWluYWxfaW5mbykgKGFyZywgZnJvbV90dHkpCisKKy8qIEtpbGwgdGhlIGluZmVyaW9yIHByb2Nlc3MuICAgTWFrZSBpdCBnbyBhd2F5LiAgKi8KKworI2RlZmluZSB0YXJnZXRfa2lsbCgpIFwKKwkoKmN1cnJlbnRfdGFyZ2V0LnRvX2tpbGwpICgpCisKKy8qIExvYWQgYW4gZXhlY3V0YWJsZSBmaWxlIGludG8gdGhlIHRhcmdldCBwcm9jZXNzLiAgVGhpcyBpcyBleHBlY3RlZCB0bworICAgbm90IG9ubHkgYnJpbmcgbmV3IGNvZGUgaW50byB0aGUgdGFyZ2V0IHByb2Nlc3MsIGJ1dCBhbHNvIHRvIHVwZGF0ZQorICAgR0RCJ3Mgc3ltYm9sIHRhYmxlcyB0byBtYXRjaC4gICovCisKKyNkZWZpbmUgdGFyZ2V0X2xvYWQoYXJnLCBmcm9tX3R0eSkgXAorCSgqY3VycmVudF90YXJnZXQudG9fbG9hZCkgKGFyZywgZnJvbV90dHkpCisKKy8qIExvb2sgdXAgYSBzeW1ib2wgaW4gdGhlIHRhcmdldCdzIHN5bWJvbCB0YWJsZS4gIE5BTUUgaXMgdGhlIHN5bWJvbAorICAgbmFtZS4gIEFERFJQIGlzIGEgQ09SRV9BRERSICogcG9pbnRpbmcgdG8gd2hlcmUgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wKKyAgIHNob3VsZCBiZSByZXR1cm5lZC4gIFRoZSByZXN1bHQgaXMgMCBpZiBzdWNjZXNzZnVsLCBub256ZXJvIGlmIHRoZQorICAgc3ltYm9sIGRvZXMgbm90IGV4aXN0IGluIHRoZSB0YXJnZXQgZW52aXJvbm1lbnQuICBUaGlzIGZ1bmN0aW9uIHNob3VsZAorICAgbm90IGNhbGwgZXJyb3IoKSBpZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHRhcmdldCBpcyBpbnRlcnJ1cHRlZCwgc2luY2UKKyAgIGl0IGlzIGNhbGxlZCBmcm9tIHN5bWJvbCByZWFkaW5nLCBidXQgc2hvdWxkIHJldHVybiBub256ZXJvLCBwb3NzaWJseQorICAgZG9pbmcgYSBjb21wbGFpbigpLiAgKi8KKworI2RlZmluZSB0YXJnZXRfbG9va3VwX3N5bWJvbChuYW1lLCBhZGRycCkgCVwKKyAgKCpjdXJyZW50X3RhcmdldC50b19sb29rdXBfc3ltYm9sKSAobmFtZSwgYWRkcnApCisKKy8qIFN0YXJ0IGFuIGluZmVyaW9yIHByb2Nlc3MgYW5kIHNldCBpbmZlcmlvcl9waWQgdG8gaXRzIHBpZC4KKyAgIEVYRUNfRklMRSBpcyB0aGUgZmlsZSB0byBydW4uCisgICBBTExBUkdTIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cyB0byB0aGUgcHJvZ3JhbS4KKyAgIEVOViBpcyB0aGUgZW52aXJvbm1lbnQgdmVjdG9yIHRvIHBhc3MuICBFcnJvcnMgcmVwb3J0ZWQgd2l0aCBlcnJvcigpLgorICAgT24gVnhXb3JrcyBhbmQgdmFyaW91cyBzdGFuZGFsb25lIHN5c3RlbXMsIHdlIGlnbm9yZSBleGVjX2ZpbGUuICAqLworIAorI2RlZmluZQl0YXJnZXRfY3JlYXRlX2luZmVyaW9yKGV4ZWNfZmlsZSwgYXJncywgZW52KQlcCisJKCpjdXJyZW50X3RhcmdldC50b19jcmVhdGVfaW5mZXJpb3IpIChleGVjX2ZpbGUsIGFyZ3MsIGVudikKKworCisvKiBTb21lIHRhcmdldHMgKHN1Y2ggYXMgdHRyYWNlLWJhc2VkIEhQVVgpIGRvbid0IGFsbG93IHVzIHRvIHJlcXVlc3QKKyAgIG5vdGlmaWNhdGlvbiBvZiBpbmZlcmlvciBldmVudHMgc3VjaCBhcyBmb3JrIGFuZCB2b3JrIGltbWVkaWF0ZWx5CisgICBhZnRlciB0aGUgaW5mZXJpb3IgaXMgY3JlYXRlZC4gIChUaGlzIGJlY2F1c2Ugb2YgaG93IGdkYiBnZXRzIGFuCisgICBpbmZlcmlvciBjcmVhdGVkIHZpYSBpbnZva2luZyBhIHNoZWxsIHRvIGRvIGl0LiAgSW4gc3VjaCBhIHNjZW5hcmlvLAorICAgaWYgdGhlIHNoZWxsIGluaXQgZmlsZSBoYXMgY29tbWFuZHMgaW4gaXQsIHRoZSBzaGVsbCB3aWxsIGZvcmsgYW5kCisgICBleGVjIGZvciBlYWNoIG9mIHRob3NlIGNvbW1hbmRzLCBhbmQgd2Ugd2lsbCBzZWUgZWFjaCBzdWNoIGZvcmsKKyAgIGV2ZW50LiAgVmVyeSBiYWQuKQorICAgCisgICBTdWNoIHRhcmdldHMgd2lsbCBzdXBwbHkgYW4gYXBwcm9wcmlhdGUgZGVmaW5pdGlvbiBmb3IgdGhpcyBmdW5jdGlvbi4KKyAgICovCisjZGVmaW5lIHRhcmdldF9wb3N0X3N0YXJ0dXBfaW5mZXJpb3IocGlkKSBcCisgICAgICAgICgqY3VycmVudF90YXJnZXQudG9fcG9zdF9zdGFydHVwX2luZmVyaW9yKSAocGlkKQorCisvKiBPbiBzb21lIHRhcmdldHMsIHRoZSBzZXF1ZW5jZSBvZiBzdGFydGluZyB1cCBhbiBpbmZlcmlvciByZXF1aXJlcworICAgc29tZSBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBnZGIgYW5kIHRoZSBuZXcgaW5mZXJpb3IgcHJvY2VzcywgUElELgorICAgKi8KKyNkZWZpbmUgdGFyZ2V0X2Fja25vd2xlZGdlX2NyZWF0ZWRfaW5mZXJpb3IocGlkKSBcCisgICAgICAgICgqY3VycmVudF90YXJnZXQudG9fYWNrbm93bGVkZ2VfY3JlYXRlZF9pbmZlcmlvcikgKHBpZCkKKworLyogQW4gaW5mZXJpb3IgcHJvY2VzcyBoYXMgYmVlbiBjcmVhdGVkIHZpYSBhIGZvcmsoKSBvciBzaW1pbGFyCisgICBzeXN0ZW0gY2FsbC4gIFRoaXMgZnVuY3Rpb24gd2lsbCBjbG9uZSB0aGUgZGVidWdnZXIsIHRoZW4gZW5zdXJlCisgICB0aGF0IENISUxEX1BJRCBpcyBhdHRhY2hlZCB0byBieSB0aGF0IGRlYnVnZ2VyLgorCisgICBGT0xMT1dFRF9DSElMRCBpcyBzZXQgVFJVRSBvbiByZXR1cm4gKmZvciB0aGUgY2xvbmUgZGVidWdnZXIgb25seSosCisgICBhbmQgRkFMU0Ugb3RoZXJ3aXNlLiAgKFRoZSBvcmlnaW5hbCBhbmQgY2xvbmUgZGVidWdnZXJzIGNhbiB1c2UgdGhpcworICAgdG8gZGV0ZXJtaW5lIHdoaWNoIHRoZXkgYXJlLCBpZiBuZWVkIGJlLikKKworICAgKFRoaXMgaXMgbm90IGEgdGVycmlibHkgdXNlZnVsIGZlYXR1cmUgd2l0aG91dCBhIEdVSSB0byBwcmV2ZW50CisgICB0aGUgdHdvIGRlYnVnZ2VycyBmcm9tIGNvbXBldGluZyBmb3Igc2hlbGwgaW5wdXQuKQorICAgKi8KKyNkZWZpbmUgdGFyZ2V0X2Nsb25lX2FuZF9mb2xsb3dfaW5mZXJpb3IoY2hpbGRfcGlkLGZvbGxvd2VkX2NoaWxkKSBcCisgICAgICAgICgqY3VycmVudF90YXJnZXQudG9fY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvcikgKGNoaWxkX3BpZCwgZm9sbG93ZWRfY2hpbGQpCisKKy8qIFRoaXMgb3BlcmF0aW9uIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgdGhlIGxhc3QgaW4gYSBzZXF1ZW5jZSBvZgorICAgc3RlcHMgdGFrZW4gd2hlbiBmb2xsb3dpbmcgYm90aCBwYXJlbnQgYW5kIGNoaWxkIG9mIGEgZm9yay4gIFRoaXMKKyAgIGlzIHVzZWQgYnkgYSBjbG9uZSBvZiB0aGUgZGVidWdnZXIsIHdoaWNoIHdpbGwgZm9sbG93IHRoZSBjaGlsZC4KKworICAgVGhlIG9yaWdpbmFsIGRlYnVnZ2VyIGhhcyBkZXRhY2hlZCBmcm9tIHRoaXMgcHJvY2VzcywgYW5kIHRoZQorICAgY2xvbmUgaGFzIGF0dGFjaGVkIHRvIGl0LgorCisgICBPbiBzb21lIHRhcmdldHMsIHRoaXMgcmVxdWlyZXMgYSBiaXQgb2YgY2xlYW51cCB0byBtYWtlIGl0IHdvcmsKKyAgIGNvcnJlY3RseS4KKyAgICovCisjZGVmaW5lIHRhcmdldF9wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSgpIFwKKyAgICAgICAgKCpjdXJyZW50X3RhcmdldC50b19wb3N0X2ZvbGxvd19pbmZlcmlvcl9ieV9jbG9uZSkgKCkKKworLyogT24gc29tZSB0YXJnZXRzLCB3ZSBjYW4gY2F0Y2ggYW4gaW5mZXJpb3IgZm9yayBvciB2Zm9yayBldmVudCB3aGVuIGl0CisgICBvY2N1cnMuICBUaGVzZSBmdW5jdGlvbnMgaW5zZXJ0L3JlbW92ZSBhbiBhbHJlYWR5LWNyZWF0ZWQgY2F0Y2hwb2ludCBmb3IKKyAgIHN1Y2ggZXZlbnRzLgorICAgKi8KKyNkZWZpbmUgdGFyZ2V0X2luc2VydF9mb3JrX2NhdGNocG9pbnQocGlkKSBcCisgICAgICAgICgqY3VycmVudF90YXJnZXQudG9faW5zZXJ0X2ZvcmtfY2F0Y2hwb2ludCkgKHBpZCkKKworI2RlZmluZSB0YXJnZXRfcmVtb3ZlX2ZvcmtfY2F0Y2hwb2ludChwaWQpIFwKKyAgICAgICAgKCpjdXJyZW50X3RhcmdldC50b19yZW1vdmVfZm9ya19jYXRjaHBvaW50KSAocGlkKQorCisjZGVmaW5lIHRhcmdldF9pbnNlcnRfdmZvcmtfY2F0Y2hwb2ludChwaWQpIFwKKyAgICAgICAgKCpjdXJyZW50X3RhcmdldC50b19pbnNlcnRfdmZvcmtfY2F0Y2hwb2ludCkgKHBpZCkKKworI2RlZmluZSB0YXJnZXRfcmVtb3ZlX3Zmb3JrX2NhdGNocG9pbnQocGlkKSBcCisgICAgICAgICgqY3VycmVudF90YXJnZXQudG9fcmVtb3ZlX3Zmb3JrX2NhdGNocG9pbnQpIChwaWQpCisKKy8qIFJldHVybnMgVFJVRSBpZiBQSUQgaGFzIGludm9rZWQgdGhlIGZvcmsoKSBzeXN0ZW0gY2FsbC4gIEFuZCwKKyAgIGFsc28gc2V0cyBDSElMRF9QSUQgdG8gdGhlIHByb2Nlc3MgaWQgb2YgdGhlIG90aGVyICgiY2hpbGQiKQorICAgaW5mZXJpb3IgcHJvY2VzcyB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoYXQgY2FsbC4KKyAgICovCisjZGVmaW5lIHRhcmdldF9oYXNfZm9ya2VkKHBpZCxjaGlsZF9waWQpIFwKKyAgICAgICAgKCpjdXJyZW50X3RhcmdldC50b19oYXNfZm9ya2VkKSAocGlkLGNoaWxkX3BpZCkKKworLyogUmV0dXJucyBUUlVFIGlmIFBJRCBoYXMgaW52b2tlZCB0aGUgdmZvcmsoKSBzeXN0ZW0gY2FsbC4gIEFuZCwKKyAgIGFsc28gc2V0cyBDSElMRF9QSUQgdG8gdGhlIHByb2Nlc3MgaWQgb2YgdGhlIG90aGVyICgiY2hpbGQiKQorICAgaW5mZXJpb3IgcHJvY2VzcyB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoYXQgY2FsbC4KKyAgICovCisjZGVmaW5lIHRhcmdldF9oYXNfdmZvcmtlZChwaWQsY2hpbGRfcGlkKSBcCisgICAgICAgICgqY3VycmVudF90YXJnZXQudG9faGFzX3Zmb3JrZWQpIChwaWQsY2hpbGRfcGlkKQorCisvKiBTb21lIHBsYXRmb3JtcyAoc3VjaCBhcyBwcmUtMTAuMjAgSFAtVVgpIGRvbid0IGFsbG93IHVzIHRvIGRvCisgICBhbnl0aGluZyB0byBhIHZmb3JrZWQgY2hpbGQgYmVmb3JlIGl0IHN1YnNlcXVlbnRseSBjYWxscyBleGVjKCkuCisgICBPbiBzdWNoIHBsYXRmb3Jtcywgd2Ugc2F5IHRoYXQgdGhlIGRlYnVnZ2VyIGNhbm5vdCAiZm9sbG93IiB0aGUKKyAgIGNoaWxkIHVudGlsIGl0IGhhcyB2Zm9ya2VkLgorCisgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBkZWZpbmVkIHRvIHJldHVybiAxIGJ5IHRob3NlIHRhcmdldHMKKyAgIHdoaWNoIGNhbiBhbGxvdyB0aGUgZGVidWdnZXIgdG8gaW1tZWRpYXRlbHkgZm9sbG93IGEgdmZvcmtlZAorICAgY2hpbGQsIGFuZCAwIGlmIHRoZXkgY2Fubm90LgorICAgKi8KKyNkZWZpbmUgdGFyZ2V0X2Nhbl9mb2xsb3dfdmZvcmtfcHJpb3JfdG9fZXhlYygpIFwKKyAgICAgICAgKCpjdXJyZW50X3RhcmdldC50b19jYW5fZm9sbG93X3Zmb3JrX3ByaW9yX3RvX2V4ZWMpICgpCisKKy8qIEFuIGluZmVyaW9yIHByb2Nlc3MgaGFzIGJlZW4gY3JlYXRlZCB2aWEgYSB2Zm9yaygpIHN5c3RlbSBjYWxsLgorICAgVGhlIGRlYnVnZ2VyIGhhcyBmb2xsb3dlZCB0aGUgcGFyZW50LCB0aGUgY2hpbGQsIG9yIGJvdGguICBUaGUKKyAgIHByb2Nlc3Mgb2Ygc2V0dGluZyB1cCBmb3IgdGhhdCBmb2xsb3cgbWF5IGhhdmUgcmVxdWlyZWQgc29tZQorICAgdGFyZ2V0LXNwZWNpZmljIHRyaWNrZXJ5IHRvIHRyYWNrIHRoZSBzZXF1ZW5jZSBvZiByZXBvcnRlZCBldmVudHMuCisgICBJZiBzbywgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgZGVmaW5lZCBieSB0aG9zZSB0YXJnZXRzIHRoYXQKKyAgIHJlcXVpcmUgdGhlIGRlYnVnZ2VyIHRvIHBlcmZvcm0gY2xlYW51cCBvciBpbml0aWFsaXphdGlvbiBhZnRlcgorICAgdGhlIHZmb3JrIGZvbGxvdy4KKyAgICovCisjZGVmaW5lIHRhcmdldF9wb3N0X2ZvbGxvd192Zm9yayhwYXJlbnRfcGlkLGZvbGxvd2VkX3BhcmVudCxjaGlsZF9waWQsZm9sbG93ZWRfY2hpbGQpIFwKKyAgICAgICAgKCpjdXJyZW50X3RhcmdldC50b19wb3N0X2ZvbGxvd192Zm9yaykgKHBhcmVudF9waWQsZm9sbG93ZWRfcGFyZW50LGNoaWxkX3BpZCxmb2xsb3dlZF9jaGlsZCkKKworLyogT24gc29tZSB0YXJnZXRzLCB3ZSBjYW4gY2F0Y2ggYW4gaW5mZXJpb3IgZXhlYyBldmVudCB3aGVuIGl0CisgICBvY2N1cnMuICBUaGVzZSBmdW5jdGlvbnMgaW5zZXJ0L3JlbW92ZSBhbiBhbHJlYWR5LWNyZWF0ZWQgY2F0Y2hwb2ludAorICAgZm9yIHN1Y2ggZXZlbnRzLgorICAgKi8KKyNkZWZpbmUgdGFyZ2V0X2luc2VydF9leGVjX2NhdGNocG9pbnQocGlkKSBcCisgICAgICAgICgqY3VycmVudF90YXJnZXQudG9faW5zZXJ0X2V4ZWNfY2F0Y2hwb2ludCkgKHBpZCkKKyAKKyNkZWZpbmUgdGFyZ2V0X3JlbW92ZV9leGVjX2NhdGNocG9pbnQocGlkKSBcCisgICAgICAgICgqY3VycmVudF90YXJnZXQudG9fcmVtb3ZlX2V4ZWNfY2F0Y2hwb2ludCkgKHBpZCkKKworLyogUmV0dXJucyBUUlVFIGlmIFBJRCBoYXMgaW52b2tlZCBhIGZsYXZvciBvZiB0aGUgZXhlYygpIHN5c3RlbSBjYWxsLgorICAgQW5kLCBhbHNvIHNldHMgRVhFQ0RfUEFUSE5BTUUgdG8gdGhlIHBhdGhuYW1lIG9mIHRoZSBleGVjdXRhYmxlIGZpbGUKKyAgIHRoYXQgd2FzIHBhc3NlZCB0byBleGVjKCksIGFuZCBpcyBub3cgYmVpbmcgZXhlY3V0ZWQuCisgICAqLworI2RlZmluZSB0YXJnZXRfaGFzX2V4ZWNkKHBpZCxleGVjZF9wYXRobmFtZSkgXAorICAgICAgICAoKmN1cnJlbnRfdGFyZ2V0LnRvX2hhc19leGVjZCkgKHBpZCxleGVjZF9wYXRobmFtZSkKKworLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGV4ZWMgZXZlbnRzIHRoYXQgYXJlIHJlcG9ydGVkIHdoZW4gYSBwcm9jZXNzCisgICBpbnZva2VzIGEgZmxhdm9yIG9mIHRoZSBleGVjKCkgc3lzdGVtIGNhbGwgb24gdGhpcyB0YXJnZXQsIGlmIGV4ZWMKKyAgIGV2ZW50cyBhcmUgYmVpbmcgcmVwb3J0ZWQuCisgICAqLworI2RlZmluZSB0YXJnZXRfcmVwb3J0ZWRfZXhlY19ldmVudHNfcGVyX2V4ZWNfY2FsbCgpIFwKKyAgICAgICAgKCpjdXJyZW50X3RhcmdldC50b19yZXBvcnRlZF9leGVjX2V2ZW50c19wZXJfZXhlY19jYWxsKSAoKQorCisvKiBSZXR1cm5zIFRSVUUgaWYgUElEIGhhcyByZXBvcnRlZCBhIHN5c2NhbGwgZXZlbnQuICBBbmQsIGFsc28gc2V0cworICAgS0lORCB0byB0aGUgYXBwcm9wcmlhdGUgVEFSR0VUX1dBSVRLSU5EXywgYW5kIHNldHMgU1lTQ0FMTF9JRCB0bworICAgdGhlIHVuaXF1ZSBpbnRlZ2VyIElEIG9mIHRoZSBzeXNjYWxsLgorICAgKi8KKyNkZWZpbmUgdGFyZ2V0X2hhc19zeXNjYWxsX2V2ZW50KHBpZCxraW5kLHN5c2NhbGxfaWQpIFwKKyAgKCpjdXJyZW50X3RhcmdldC50b19oYXNfc3lzY2FsbF9ldmVudCkgKHBpZCxraW5kLHN5c2NhbGxfaWQpCisKKy8qIFJldHVybnMgVFJVRSBpZiBQSUQgaGFzIGV4aXRlZC4gIEFuZCwgYWxzbyBzZXRzIEVYSVRfU1RBVFVTIHRvIHRoZQorICAgZXhpdCBjb2RlIG9mIFBJRCwgaWYgYW55LgorICAgKi8KKyNkZWZpbmUgdGFyZ2V0X2hhc19leGl0ZWQocGlkLHdhaXRfc3RhdHVzLGV4aXRfc3RhdHVzKSBcCisgICAgICAgICgqY3VycmVudF90YXJnZXQudG9faGFzX2V4aXRlZCkgKHBpZCx3YWl0X3N0YXR1cyxleGl0X3N0YXR1cykKKworLyogVGhlIGRlYnVnZ2VyIGhhcyBjb21wbGV0ZWQgYSBibG9ja2luZyB3YWl0KCkgY2FsbC4gIFRoZXJlIGlzIG5vdworICAgc29tZSBwcm9jZXNzIGV2ZW50IHRoYXQgbXVzdCBiZSBwcm9jZXNzZWQuICBUaGlzIGZ1bmN0aW9uIHNob3VsZAorICAgYmUgZGVmaW5lZCBieSB0aG9zZSB0YXJnZXRzIHRoYXQgcmVxdWlyZSB0aGUgZGVidWdnZXIgdG8gcGVyZm9ybQorICAgY2xlYW51cCBvciBpbnRlcm5hbCBzdGF0ZSBjaGFuZ2VzIGluIHJlc3BvbnNlIHRvIHRoZSBwcm9jZXNzIGV2ZW50LgorICAgKi8KKworLyogVGhlIGluZmVyaW9yIHByb2Nlc3MgaGFzIGRpZWQuICBEbyB3aGF0IGlzIHJpZ2h0LiAgKi8KKworI2RlZmluZQl0YXJnZXRfbW91cm5faW5mZXJpb3IoKQlcCisJKCpjdXJyZW50X3RhcmdldC50b19tb3Vybl9pbmZlcmlvcikgKCkKKworLyogRG9lcyB0YXJnZXQgaGF2ZSBlbm91Z2ggZGF0YSB0byBkbyBhIHJ1biBvciBhdHRhY2ggY29tbWFuZD8gKi8KKworI2RlZmluZSB0YXJnZXRfY2FuX3J1bih0KSBcCisgIAkoKHQpLT50b19jYW5fcnVuKSAoKQorCisvKiBwb3N0IHByb2Nlc3MgY2hhbmdlcyB0byBzaWduYWwgaGFuZGxpbmcgaW4gdGhlIGluZmVyaW9yLiAgKi8KKworI2RlZmluZSB0YXJnZXRfbm90aWNlX3NpZ25hbHMocGlkKSBcCisgIAkoKmN1cnJlbnRfdGFyZ2V0LnRvX25vdGljZV9zaWduYWxzKSAocGlkKQorCisvKiBDaGVjayB0byBzZWUgaWYgYSB0aHJlYWQgaXMgc3RpbGwgYWxpdmUuICAqLworCisjZGVmaW5lIHRhcmdldF90aHJlYWRfYWxpdmUocGlkKSBcCisJKCpjdXJyZW50X3RhcmdldC50b190aHJlYWRfYWxpdmUpIChwaWQpCisKKy8qIE1ha2UgdGFyZ2V0IHN0b3AgaW4gYSBjb250aW51YWJsZSBmYXNoaW9uLiAgKEZvciBpbnN0YW5jZSwgdW5kZXIgVW5peCwgdGhpcworICAgc2hvdWxkIGFjdCBsaWtlIFNJR1NUT1ApLiAgVGhpcyBmdW5jdGlvbiBpcyBub3JtYWxseSB1c2VkIGJ5IEdVSXMgdG8KKyAgIGltcGxlbWVudCBhIHN0b3AgYnV0dG9uLiAgKi8KKworI2RlZmluZSB0YXJnZXRfc3RvcCBjdXJyZW50X3RhcmdldC50b19zdG9wCisKKy8qIFF1ZXJpZXMgdGhlIHRhcmdldCBzaWRlIGZvciBzb21lIGluZm9ybWF0aW9uLiAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEKKyAgIGxldHRlciBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIHRoZSBxdWVyeSwgd2hpY2ggaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hvCisgICBzaG91bGQgcHJvY2VzcyBpdC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYSBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgd2hpY2ggCisgICBpbmZvcm1hdGlvbiBpcyBkZXNpcmVkIGFuZCB0aGUgdGhpcmQgaXMgYSBidWZmZXIgdGhhdCBjYXJyaWVzIGJhY2sgdGhlIAorICAgcmVzcG9uc2UgZnJvbSB0aGUgdGFyZ2V0IHNpZGUuIFRoZSBmb3VydGggcGFyYW1ldGVyIGlzIHRoZSBzaXplIG9mIHRoZQorICAgb3V0cHV0IGJ1ZmZlciBzdXBwbGllZC4gKi8KKyAKKyNkZWZpbmUJdGFyZ2V0X3F1ZXJ5KHF1ZXJ5X3R5cGUsIHF1ZXJ5LCByZXNwX2J1ZmZlciwgYnVmZmZlcl9zaXplKQlcCisJKCpjdXJyZW50X3RhcmdldC50b19xdWVyeSkgKHF1ZXJ5X3R5cGUsIHF1ZXJ5LCByZXNwX2J1ZmZlciwgYnVmZmZlcl9zaXplKQorCisvKiBHZXQgdGhlIHN5bWJvbCBpbmZvcm1hdGlvbiBmb3IgYSBicmVha3BvaW50YWJsZSByb3V0aW5lIGNhbGxlZCB3aGVuCisgICBhbiBleGNlcHRpb24gZXZlbnQgb2NjdXJzLiAKKyAgIEludGVuZGVkIG1haW5seSBmb3IgQysrLCBhbmQgZm9yIHRob3NlCisgICBwbGF0Zm9ybXMvaW1wbGVtZW50YXRpb25zIHdoZXJlIHN1Y2ggYSBjYWxsYmFjayBtZWNoYW5pc20gaXMgYXZhaWxhYmxlLAorICAgZS5nLiBIUC1VWCB3aXRoIEFOU0kgQysrIChhQ0MpLiAgU29tZSBjb21waWxlcnMgKGUuZy4gZysrKSBzdXBwb3J0CisgICBkaWZmZXJlbnQgbWVjaGFuaXNtcyBmb3IgZGVidWdnaW5nIGV4Y2VwdGlvbnMuICovCisKKyNkZWZpbmUgdGFyZ2V0X2VuYWJsZV9leGNlcHRpb25fY2FsbGJhY2soa2luZCwgZW5hYmxlKSBcCisgICAgICAgICgqY3VycmVudF90YXJnZXQudG9fZW5hYmxlX2V4Y2VwdGlvbl9jYWxsYmFjaykgKGtpbmQsIGVuYWJsZSkKKworLyogR2V0IHRoZSBjdXJyZW50IGV4Y2VwdGlvbiBldmVudCBraW5kIC0tIHRocm93IG9yIGNhdGNoLCBldGMuICovCisgICAKKyNkZWZpbmUgdGFyZ2V0X2dldF9jdXJyZW50X2V4Y2VwdGlvbl9ldmVudCgpIFwKKyAgICAgICAgKCpjdXJyZW50X3RhcmdldC50b19nZXRfY3VycmVudF9leGNlcHRpb25fZXZlbnQpICgpCisKKy8qIFBvaW50ZXIgdG8gbmV4dCB0YXJnZXQgaW4gdGhlIGNoYWluLCBlLmcuIGEgY29yZSBmaWxlIGFuZCBhbiBleGVjIGZpbGUuICAqLworCisjZGVmaW5lCXRhcmdldF9uZXh0IFwKKwkoY3VycmVudF90YXJnZXQudG9fbmV4dCkKKworLyogRG9lcyB0aGUgdGFyZ2V0IGluY2x1ZGUgYWxsIG9mIG1lbW9yeSwgb3Igb25seSBwYXJ0IG9mIGl0PyAgVGhpcworICAgZGV0ZXJtaW5lcyB3aGV0aGVyIHdlIGxvb2sgdXAgdGhlIHRhcmdldCBjaGFpbiBmb3Igb3RoZXIgcGFydHMgb2YKKyAgIG1lbW9yeSBpZiB0aGlzIHRhcmdldCBjYW4ndCBzYXRpc2Z5IGEgcmVxdWVzdC4gICovCisKKyNkZWZpbmUJdGFyZ2V0X2hhc19hbGxfbWVtb3J5CVwKKwkoY3VycmVudF90YXJnZXQudG9faGFzX2FsbF9tZW1vcnkpCisKKy8qIERvZXMgdGhlIHRhcmdldCBpbmNsdWRlIG1lbW9yeT8gIChEdW1teSB0YXJnZXRzIGRvbid0LikgICovCisKKyNkZWZpbmUJdGFyZ2V0X2hhc19tZW1vcnkJXAorCShjdXJyZW50X3RhcmdldC50b19oYXNfbWVtb3J5KQorCisvKiBEb2VzIHRoZSB0YXJnZXQgaGF2ZSBhIHN0YWNrPyAgKEV4ZWMgZmlsZXMgZG9uJ3QsIFZ4V29ya3MgZG9lc24ndCwgdW50aWwKKyAgIHdlIHN0YXJ0IGEgcHJvY2Vzcy4pICAqLworICAgCisjZGVmaW5lCXRhcmdldF9oYXNfc3RhY2sJXAorCShjdXJyZW50X3RhcmdldC50b19oYXNfc3RhY2spCisKKy8qIERvZXMgdGhlIHRhcmdldCBoYXZlIHJlZ2lzdGVycz8gIChFeGVjIGZpbGVzIGRvbid0LikgICovCisKKyNkZWZpbmUJdGFyZ2V0X2hhc19yZWdpc3RlcnMJXAorCShjdXJyZW50X3RhcmdldC50b19oYXNfcmVnaXN0ZXJzKQorCisvKiBEb2VzIHRoZSB0YXJnZXQgaGF2ZSBleGVjdXRpb24/ICBDYW4gd2UgbWFrZSBpdCBqdW1wICh0aHJvdWdoCisgICBob29wcyksIG9yIHBvcCBpdHMgc3RhY2sgYSBmZXcgdGltZXM/ICBGSVhNRTogSWYgdGhpcyBpcyB0byB3b3JrIHRoYXQKKyAgIHdheSwgaXQgbmVlZHMgdG8gY2hlY2sgd2hldGhlciBhbiBpbmZlcmlvciBhY3R1YWxseSBleGlzdHMuCisgICByZW1vdGUtdWRpLmMgYW5kIHByb2JhYmx5IG90aGVyIHRhcmdldHMgY2FuIGJlIHRoZSBjdXJyZW50IHRhcmdldAorICAgd2hlbiB0aGUgaW5mZXJpb3IgZG9lc24ndCBhY3R1YWxseSBleGlzdCBhdCB0aGUgbW9tZW50LiAgUmlnaHQgbm93CisgICB0aGlzIGp1c3QgdGVsbHMgdXMgd2hldGhlciB0aGlzIHRhcmdldCBpcyAqY2FwYWJsZSogb2YgZXhlY3V0aW9uLiAgKi8KKworI2RlZmluZQl0YXJnZXRfaGFzX2V4ZWN1dGlvbglcCisJKGN1cnJlbnRfdGFyZ2V0LnRvX2hhc19leGVjdXRpb24pCisKKy8qIENhbiB0aGUgdGFyZ2V0IHN1cHBvcnQgdGhlIGRlYnVnZ2VyIGNvbnRyb2wgb2YgdGhyZWFkIGV4ZWN1dGlvbj8KKyAgIGEpIENhbiBpdCBsb2NrIHRoZSB0aHJlYWQgc2NoZWR1bGVyPworICAgYikgQ2FuIGl0IHN3aXRjaCB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGhyZWFkPyAgKi8KKworI2RlZmluZSB0YXJnZXRfY2FuX2xvY2tfc2NoZWR1bGVyIFwKKyAJKGN1cnJlbnRfdGFyZ2V0LnRvX2hhc190aHJlYWRfY29udHJvbCAmIHRjX3NjaGVkbG9jaykKKworI2RlZmluZSB0YXJnZXRfY2FuX3N3aXRjaF90aHJlYWRzIFwKKyAJKGN1cnJlbnRfdGFyZ2V0LnRvX2hhc190aHJlYWRfY29udHJvbCAmIHRjX3N3aXRjaCkKKworZXh0ZXJuIHZvaWQgdGFyZ2V0X2xpbmsgUEFSQU1TICgoY2hhciAqLCBDT1JFX0FERFIgKikpOworCisvKiBDb252ZXJ0cyBhIHByb2Nlc3MgaWQgdG8gYSBzdHJpbmcuICBVc3VhbGx5LCB0aGUgc3RyaW5nIGp1c3QgY29udGFpbnMKKyAgIGBwcm9jZXNzIHh5eicsIGJ1dCBvbiBzb21lIHN5c3RlbXMgaXQgbWF5IGNvbnRhaW4KKyAgIGBwcm9jZXNzIHh5eiB0aHJlYWQgYWJjJy4gICovCisKKyNpZm5kZWYgdGFyZ2V0X3BpZF90b19zdHIKKyNkZWZpbmUgdGFyZ2V0X3BpZF90b19zdHIoUElEKSBcCisJbm9ybWFsX3BpZF90b19zdHIgKFBJRCkKK2V4dGVybiBjaGFyICpub3JtYWxfcGlkX3RvX3N0ciBQQVJBTVMgKChpbnQgcGlkKSk7CisjZW5kaWYKKworI2lmbmRlZiB0YXJnZXRfdGlkX3RvX3N0cgorI2RlZmluZSB0YXJnZXRfdGlkX3RvX3N0cihQSUQpIFwKKyAgICAgICAgbm9ybWFsX3BpZF90b19zdHIgKFBJRCkKK2V4dGVybiBjaGFyICpub3JtYWxfcGlkX3RvX3N0ciBQQVJBTVMgKChpbnQgcGlkKSk7CisjZW5kaWYKKyAKKworI2lmbmRlZiB0YXJnZXRfbmV3X29iamZpbGUKKyNkZWZpbmUgdGFyZ2V0X25ld19vYmpmaWxlKE9CSkZJTEUpCisjZW5kaWYKKworI2lmbmRlZiB0YXJnZXRfcGlkX29yX3RpZF90b19zdHIKKyNkZWZpbmUgdGFyZ2V0X3BpZF9vcl90aWRfdG9fc3RyKElEKSBcCisJbm9ybWFsX3BpZF90b19zdHIgKElEKQorI2VuZGlmCisKKy8qIEF0dGVtcHRzIHRvIGZpbmQgdGhlIHBhdGhuYW1lIG9mIHRoZSBleGVjdXRhYmxlIGZpbGUKKyAgIHRoYXQgd2FzIHJ1biB0byBjcmVhdGUgYSBzcGVjaWZpZWQgcHJvY2Vzcy4KKworICAgVGhlIHByb2Nlc3MgUElEIG11c3QgYmUgc3RvcHBlZCB3aGVuIHRoaXMgb3BlcmF0aW9uIGlzIHVzZWQuCisgICAKKyAgIElmIHRoZSBleGVjdXRhYmxlIGZpbGUgY2Fubm90IGJlIGRldGVybWluZWQsIE5VTEwgaXMgcmV0dXJuZWQuCisKKyAgIEVsc2UsIGEgcG9pbnRlciB0byBhIGNoYXJhY3RlciBzdHJpbmcgY29udGFpbmluZyB0aGUgcGF0aG5hbWUKKyAgIGlzIHJldHVybmVkLiAgVGhpcyBzdHJpbmcgc2hvdWxkIGJlIGNvcGllZCBpbnRvIGEgYnVmZmVyIGJ5CisgICB0aGUgY2xpZW50IGlmIHRoZSBzdHJpbmcgd2lsbCBub3QgYmUgaW1tZWRpYXRlbHkgdXNlZCwgb3IgaWYKKyAgIGl0IG11c3QgcGVyc2lzdC4KKyAgICovCisKKyNkZWZpbmUgdGFyZ2V0X3BpZF90b19leGVjX2ZpbGUocGlkKSBcCisJKGN1cnJlbnRfdGFyZ2V0LnRvX3BpZF90b19leGVjX2ZpbGUpIChwaWQpCisKKy8qIEhvb2sgdG8gY2FsbCB0YXJnZXQtZGVwZW5kYW50IGNvZGUgYWZ0ZXIgcmVhZGluZyBpbiBhIG5ldyBzeW1ib2wgdGFibGUuICovCisKKyNpZm5kZWYgVEFSR0VUX1NZTUZJTEVfUE9TVFJFQUQKKyNkZWZpbmUgVEFSR0VUX1NZTUZJTEVfUE9TVFJFQUQoT0JKRklMRSkKKyNlbmRpZgorCisvKiBIb29rIHRvIGNhbGwgdGFyZ2V0IGRlcGVuZGFudCBjb2RlIGp1c3QgYWZ0ZXIgaW5mZXJpb3IgdGFyZ2V0IHByb2Nlc3MgaGFzCisgICBzdGFydGVkLiAgKi8KKworI2lmbmRlZiBUQVJHRVRfQ1JFQVRFX0lORkVSSU9SX0hPT0sKKyNkZWZpbmUgVEFSR0VUX0NSRUFURV9JTkZFUklPUl9IT09LKFBJRCkKKyNlbmRpZgorCisvKiBIYXJkd2FyZSB3YXRjaHBvaW50IGludGVyZmFjZXMuICAqLworCisvKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHdlIHdlcmUgc3RvcHBlZCBieSBhIGhhcmR3YXJlIHdhdGNocG9pbnQgKG1lbW9yeSByZWFkIG9yCisgICB3cml0ZSkuICAqLworCisjaWZuZGVmIFNUT1BQRURfQllfV0FUQ0hQT0lOVAorI2RlZmluZSBTVE9QUEVEX0JZX1dBVENIUE9JTlQodykgMAorI2VuZGlmCisKKy8qIEhQLVVYIHN1cHBsaWVzIHRoZXNlIG9wZXJhdGlvbnMsIHdoaWNoIHJlc3BlY3RpdmVseSBkaXNhYmxlIGFuZCBlbmFibGUKKyAgIHRoZSBtZW1vcnkgcGFnZS1wcm90ZWN0aW9ucyB0aGF0IGFyZSB1c2VkIHRvIGltcGxlbWVudCBoYXJkd2FyZSB3YXRjaHBvaW50cworICAgb24gdGhhdCBwbGF0Zm9ybS4gIFNlZSB3YWl0X2Zvcl9pbmZlcmlvcidzIHVzZSBvZiB0aGVzZS4KKyAgICovCisjaWYgIWRlZmluZWQoVEFSR0VUX0RJU0FCTEVfSFdfV0FUQ0hQT0lOVFMpCisjZGVmaW5lIFRBUkdFVF9ESVNBQkxFX0hXX1dBVENIUE9JTlRTKHBpZCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVEFSR0VUX0VOQUJMRV9IV19XQVRDSFBPSU5UUykKKyNkZWZpbmUgVEFSR0VUX0VOQUJMRV9IV19XQVRDSFBPSU5UUyhwaWQpCisjZW5kaWYKKworLyogUHJvdmlkZSBkZWZhdWx0cyBmb3Igc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgaGFyZHdhcmUgd2F0Y2hwb2ludHMuICovCisKKyNpZm5kZWYgVEFSR0VUX0hBU19IQVJEV0FSRV9XQVRDSFBPSU5UUworCisvKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHdlIGNhbiBzZXQgYSBoYXJkd2FyZSB3YXRjaHBvaW50IG9mIHR5cGUgVFlQRS4gIFRZUEUgaXMKKyAgIG9uZSBvZiBicF9oYXJkd2FyZV93YXRjaHBvaW50LCBicF9yZWFkX3dhdGNocG9pbnQsIGJwX3dyaXRlX3dhdGNocG9pbnQsIG9yCisgICBicF9oYXJkd2FyZV9icmVha3BvaW50LiAgQ05UIGlzIHRoZSBudW1iZXIgb2Ygc3VjaCB3YXRjaHBvaW50cyB1c2VkIHNvIGZhcgorICAgKGluY2x1ZGluZyB0aGlzIG9uZT8pLiAgT1RIRVJUWVBFIGlzIHdobyBrbm93cyB3aGF0Li4uICAqLworCisjZGVmaW5lIFRBUkdFVF9DQU5fVVNFX0hBUkRXQVJFX1dBVENIUE9JTlQoVFlQRSxDTlQsT1RIRVJUWVBFKSAwCisKKyNpZiAhZGVmaW5lZChUQVJHRVRfUkVHSU9OX1NJWkVfT0tfRk9SX0hXX1dBVENIUE9JTlQpCisjZGVmaW5lIFRBUkdFVF9SRUdJT05fU0laRV9PS19GT1JfSFdfV0FUQ0hQT0lOVChieXRlX2NvdW50KSBcCisgICAgICAgIChMT05HRVNUKShieXRlX2NvdW50KSA8PSBSRUdJU1RFUl9TSVpFCisjZW5kaWYKKworLyogSG93ZXZlciwgc29tZSBhZGRyZXNzZXMgbWF5IG5vdCBiZSBwcm9maXRhYmxlIHRvIHVzZSBoYXJkd2FyZSB0byB3YXRjaCwKKyAgIG9yIG1heSBiZSBkaWZmaWN1bHQgdG8gdW5kZXJzdGFuZCB3aGVuIHRoZSBhZGRyZXNzZWQgb2JqZWN0IGlzIG91dCBvZgorICAgc2NvcGUsIGFuZCBoZW5jZSBzaG91bGQgYmUgdW53YXRjaGVkLiAgT24gc29tZSB0YXJnZXRzLCB0aGlzIG1heSBoYXZlCisgICBzZXZlcmUgcGVyZm9ybWFuY2UgcGVuYWx0aWVzLCBzdWNoIHRoYXQgd2UgbWlnaHQgYXMgd2VsbCB1c2UgcmVndWxhcgorICAgd2F0Y2hwb2ludHMsIGFuZCBzYXZlIChwb3NzaWJseSBwcmVjaW91cykgaGFyZHdhcmUgd2F0Y2hwb2ludHMgZm9yIG90aGVyCisgICBsb2NhdGlvbnMuCisgICAqLworI2lmICFkZWZpbmVkKFRBUkdFVF9SQU5HRV9QUk9GSVRBQkxFX0ZPUl9IV19XQVRDSFBPSU5UKQorI2RlZmluZSBUQVJHRVRfUkFOR0VfUFJPRklUQUJMRV9GT1JfSFdfV0FUQ0hQT0lOVChwaWQsc3RhcnQsbGVuKSAwCisjZW5kaWYKKworCisvKiBTZXQvY2xlYXIgYSBoYXJkd2FyZSB3YXRjaHBvaW50IHN0YXJ0aW5nIGF0IEFERFIsIGZvciBMRU4gYnl0ZXMuICBUWVBFIGlzIDAKKyAgIGZvciB3cml0ZSwgMSBmb3IgcmVhZCwgYW5kIDIgZm9yIHJlYWQvd3JpdGUgYWNjZXNzZXMuICBSZXR1cm5zIDAgZm9yCisgICBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZS4gICovCisKKyNkZWZpbmUgdGFyZ2V0X3JlbW92ZV93YXRjaHBvaW50KEFERFIsTEVOLFRZUEUpIC0xCisjZGVmaW5lIHRhcmdldF9pbnNlcnRfd2F0Y2hwb2ludChBRERSLExFTixUWVBFKSAtMQorCisjZW5kaWYgLyogVEFSR0VUX0hBU19IQVJEV0FSRV9XQVRDSFBPSU5UUyAqLworCisjaWZuZGVmIHRhcmdldF9pbnNlcnRfaHdfYnJlYWtwb2ludAorI2RlZmluZSB0YXJnZXRfcmVtb3ZlX2h3X2JyZWFrcG9pbnQoQUREUixTSEFET1cpIC0xCisjZGVmaW5lIHRhcmdldF9pbnNlcnRfaHdfYnJlYWtwb2ludChBRERSLFNIQURPVykgLTEKKyNlbmRpZgorCisjaWZuZGVmIHRhcmdldF9zdG9wcGVkX2RhdGFfYWRkcmVzcworI2RlZmluZSB0YXJnZXRfc3RvcHBlZF9kYXRhX2FkZHJlc3MoKSAwCisjZW5kaWYKKworLyogSWYgZGVmaW5lZCwgdGhlbiB3ZSBuZWVkIHRvIGRlY3IgcGMgYnkgdGhpcyBtdWNoIGFmdGVyIGEgaGFyZHdhcmUgYnJlYWstCisgICBwb2ludC4gIFByZXN1bWFibHkgdGhpcyBvdmVycmlkZXMgREVDUl9QQ19BRlRFUl9CUkVBSy4uLiAgKi8KKworI2lmbmRlZiBERUNSX1BDX0FGVEVSX0hXX0JSRUFLCisjZGVmaW5lIERFQ1JfUENfQUZURVJfSFdfQlJFQUsgMAorI2VuZGlmCisKKy8qIFNvbWV0aW1lcyBnZGIgbWF5IHBpY2sgdXAgd2hhdCBhcHBlYXJzIHRvIGJlIGEgdmFsaWQgdGFyZ2V0IGFkZHJlc3MKKyAgIGZyb20gYSBtaW5pbWFsIHN5bWJvbCwgYnV0IHRoZSB2YWx1ZSByZWFsbHkgbWVhbnMsIGVzc2VudGlhbGx5LAorICAgIlRoaXMgaXMgYW4gaW5kZXggaW50byBhIHRhYmxlIHdoaWNoIGlzIHBvcHVsYXRlZCB3aGVuIHRoZSBpbmZlcmlvcgorICAgaXMgcnVuLiAgVGhlcmVmb3JlLCBkbyBub3QgYXR0ZW1wdCB0byB1c2UgdGhpcyBhcyBhIFBDLiIKKyAgICovCisjaWYgIWRlZmluZWQoUENfUkVRVUlSRVNfUlVOX0JFRk9SRV9VU0UpCisjZGVmaW5lIFBDX1JFUVVJUkVTX1JVTl9CRUZPUkVfVVNFKHBjKSAoMCkKKyNlbmRpZgorCisvKiBUaGlzIHdpbGwgb25seSBiZSBkZWZpbmVkIGJ5IGEgdGFyZ2V0IHRoYXQgc3VwcG9ydHMgY2F0Y2hpbmcgdmZvcmsgZXZlbnRzLAorICAgc3VjaCBhcyBIUC1VWC4KKworICAgT24gc29tZSB0YXJnZXRzIChzdWNoIGFzIEhQLVVYIDEwLjIwIGFuZCBlYXJsaWVyKSwgcmVzdW1pbmcgYSBuZXdseSB2Zm9ya2VkCisgICBjaGlsZCBwcm9jZXNzIGFmdGVyIGl0IGhhcyBleGVjJ2QsIGNhdXNlcyB0aGUgcGFyZW50IHByb2Nlc3MgdG8gcmVzdW1lIGFzCisgICB3ZWxsLiAgVG8gcHJldmVudCB0aGUgcGFyZW50IGZyb20gcnVubmluZyBzcG9udGFuZW91c2x5LCBzdWNoIHRhcmdldHMgc2hvdWxkCisgICBkZWZpbmUgdGhpcyB0byBhIGZ1bmN0aW9uIHRoYXQgcHJldmVudHMgdGhhdCBmcm9tIGhhcHBlbmluZy4KKyAgICovCisjaWYgIWRlZmluZWQoRU5TVVJFX1ZGT1JLSU5HX1BBUkVOVF9SRU1BSU5TX1NUT1BQRUQpCisjZGVmaW5lIEVOU1VSRV9WRk9SS0lOR19QQVJFTlRfUkVNQUlOU19TVE9QUEVEKFBJRCkgKDApCisjZW5kaWYKKworLyogVGhpcyB3aWxsIG9ubHkgYmUgZGVmaW5lZCBieSBhIHRhcmdldCB0aGF0IHN1cHBvcnRzIGNhdGNoaW5nIHZmb3JrIGV2ZW50cywKKyAgIHN1Y2ggYXMgSFAtVVguCisKKyAgIE9uIHNvbWUgdGFyZ2V0cyAoc3VjaCBhcyBIUC1VWCAxMC4yMCBhbmQgZWFybGllciksIGEgbmV3bHkgdmZvcmtlZCBjaGlsZAorICAgcHJvY2VzcyBtdXN0IGJlIHJlc3VtZWQgd2hlbiBpdCBkZWxpdmVycyBpdHMgZXhlYyBldmVudCwgYmVmb3JlIHRoZSBwYXJlbnQKKyAgIHZmb3JrIGV2ZW50IHdpbGwgYmUgZGVsaXZlcmVkIHRvIHVzLgorICAgKi8KKyNpZiAhZGVmaW5lZChSRVNVTUVfRVhFQ0RfVkZPUktJTkdfQ0hJTERfVE9fR0VUX1BBUkVOVF9WRk9SSykKKyNkZWZpbmUgUkVTVU1FX0VYRUNEX1ZGT1JLSU5HX0NISUxEX1RPX0dFVF9QQVJFTlRfVkZPUksoKSAoMCkKKyNlbmRpZgorCisvKiBSb3V0aW5lcyBmb3IgbWFpbnRlbmFuY2Ugb2YgdGhlIHRhcmdldCBzdHJ1Y3R1cmVzLi4uCisKKyAgIGFkZF90YXJnZXQ6ICAgQWRkIGEgdGFyZ2V0IHRvIHRoZSBsaXN0IG9mIGFsbCBwb3NzaWJsZSB0YXJnZXRzLgorCisgICBwdXNoX3RhcmdldDogIE1ha2UgdGhpcyB0YXJnZXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgb2YgY3VycmVudGx5IHVzZWQKKwkJIHRhcmdldHMsIHdpdGhpbiBpdHMgcGFydGljdWxhciBzdHJhdHVtIG9mIHRoZSBzdGFjay4gIFJlc3VsdAorCQkgaXMgMCBpZiBub3cgYXRvcCB0aGUgc3RhY2ssIG5vbnplcm8gaWYgbm90IG9uIHRvcCAobWF5YmUKKwkJIHNob3VsZCB3YXJuIHVzZXIpLgorCisgICB1bnB1c2hfdGFyZ2V0OiBSZW1vdmUgdGhpcyBmcm9tIHRoZSBzdGFjayBvZiBjdXJyZW50bHkgdXNlZCB0YXJnZXRzLAorCQkgbm8gbWF0dGVyIHdoZXJlIGl0IGlzIG9uIHRoZSBsaXN0LiAgUmV0dXJucyAwIGlmIG5vCisJCSBjaGFuZ2UsIDEgaWYgcmVtb3ZlZCBmcm9tIHN0YWNrLgorCisgICBwb3BfdGFyZ2V0OgkgUmVtb3ZlIHRoZSB0b3AgdGhpbmcgb24gdGhlIHN0YWNrIG9mIGN1cnJlbnQgdGFyZ2V0cy4gICovCisKK2V4dGVybiB2b2lkCithZGRfdGFyZ2V0IFBBUkFNUyAoKHN0cnVjdCB0YXJnZXRfb3BzICopKTsKKworZXh0ZXJuIGludAorcHVzaF90YXJnZXQgUEFSQU1TICgoc3RydWN0IHRhcmdldF9vcHMgKikpOworCitleHRlcm4gaW50Cit1bnB1c2hfdGFyZ2V0IFBBUkFNUyAoKHN0cnVjdCB0YXJnZXRfb3BzICopKTsKKworZXh0ZXJuIHZvaWQKK3RhcmdldF9wcmVvcGVuIFBBUkFNUyAoKGludCkpOworCitleHRlcm4gdm9pZAorcG9wX3RhcmdldCBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIFN0cnVjdCBzZWN0aW9uX3RhYmxlIG1hcHMgYWRkcmVzcyByYW5nZXMgdG8gZmlsZSBzZWN0aW9ucy4gIEl0IGlzCisgICBtb3N0bHkgdXNlZCB3aXRoIEJGRCBmaWxlcywgYnV0IGNhbiBiZSB1c2VkIHdpdGhvdXQgKGUuZy4gZm9yIGhhbmRsaW5nCisgICByYXcgZGlza3MsIG9yIGZpbGVzIG5vdCBpbiBmb3JtYXRzIGhhbmRsZWQgYnkgQkZEKS4gICovCisKK3N0cnVjdCBzZWN0aW9uX3RhYmxlIHsKKyAgQ09SRV9BRERSIGFkZHI7CQkvKiBMb3dlc3QgYWRkcmVzcyBpbiBzZWN0aW9uICovCisgIENPUkVfQUREUiBlbmRhZGRyOwkJLyogMStoaWdoZXN0IGFkZHJlc3MgaW4gc2VjdGlvbiAqLworCisgIHNlY19wdHIgdGhlX2JmZF9zZWN0aW9uOworCisgIGJmZAkgICAqYmZkOwkJLyogQkZEIGZpbGUgcG9pbnRlciAqLworfTsKKworLyogQnVpbGRzIGEgc2VjdGlvbiB0YWJsZSwgZ2l2ZW4gYXJncyBCRkQsIFNFQ1RBQkxFX1BUUiwgU0VDRU5EX1BUUi4KKyAgIFJldHVybnMgMCBpZiBPSywgMSBvbiBlcnJvci4gICovCisKK2V4dGVybiBpbnQKK2J1aWxkX3NlY3Rpb25fdGFibGUgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWN0aW9uX3RhYmxlICoqLAorCQkJICAgICBzdHJ1Y3Qgc2VjdGlvbl90YWJsZSAqKikpOworCisvKiBGcm9tIG1lbS1icmVhay5jICovCisKK2V4dGVybiBpbnQgbWVtb3J5X3JlbW92ZV9icmVha3BvaW50IFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqKSk7CisKK2V4dGVybiBpbnQgbWVtb3J5X2luc2VydF9icmVha3BvaW50IFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqKSk7CisKK2V4dGVybiBicmVha3BvaW50X2Zyb21fcGNfZm4gbWVtb3J5X2JyZWFrcG9pbnRfZnJvbV9wYzsKKyNpZm5kZWYgQlJFQUtQT0lOVF9GUk9NX1BDCisjZGVmaW5lIEJSRUFLUE9JTlRfRlJPTV9QQyhwY3B0ciwgbGVucHRyKSBtZW1vcnlfYnJlYWtwb2ludF9mcm9tX3BjIChwY3B0ciwgbGVucHRyKQorI2VuZGlmCisKKworLyogRnJvbSB0YXJnZXQuYyAqLworCitleHRlcm4gdm9pZAoraW5pdGlhbGl6ZV90YXJnZXRzIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQKK25vcHJvY2VzcyBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkCitmaW5kX2RlZmF1bHRfYXR0YWNoIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3ZvaWQKK2ZpbmRfZGVmYXVsdF9yZXF1aXJlX2F0dGFjaCBQQVJBTVMgKChjaGFyICosIGludCkpOworCit2b2lkCitmaW5kX2RlZmF1bHRfcmVxdWlyZV9kZXRhY2ggUEFSQU1TICgoaW50LCBjaGFyICosIGludCkpOworCitleHRlcm4gdm9pZAorZmluZF9kZWZhdWx0X2NyZWF0ZV9pbmZlcmlvciBQQVJBTVMgKChjaGFyICosIGNoYXIgKiwgY2hhciAqKikpOworCit2b2lkCitmaW5kX2RlZmF1bHRfY2xvbmVfYW5kX2ZvbGxvd19pbmZlcmlvciBQQVJBTVMgKChpbnQsIGludCAqKSk7CisKK2V4dGVybiBzdHJ1Y3QgdGFyZ2V0X29wcyAqCitmaW5kX2NvcmVfdGFyZ2V0IFBBUkFNUyAoKHZvaWQpKTsKKwwKKy8qIFN0dWZmIHRoYXQgc2hvdWxkIGJlIHNoYXJlZCBhbW9uZyB0aGUgdmFyaW91cyByZW1vdGUgdGFyZ2V0cy4gICovCisKKy8qIERlYnVnZ2luZyBsZXZlbC4gIDAgaXMgb2ZmLCBhbmQgbm9uLXplcm8gdmFsdWVzIG1lYW4gdG8gcHJpbnQgc29tZSBkZWJ1ZworICAgaW5mb3JtYXRpb24gKGhpZ2hlciB2YWx1ZXMsIG1vcmUgaW5mb3JtYXRpb24pLiAgKi8KK2V4dGVybiBpbnQgcmVtb3RlX2RlYnVnOworCisvKiBTcGVlZCBpbiBiaXRzIHBlciBzZWNvbmQsIG9yIC0xIHdoaWNoIG1lYW5zIGRvbid0IG1lc3Mgd2l0aCB0aGUgc3BlZWQuICAqLworZXh0ZXJuIGludCBiYXVkX3JhdGU7CisvKiBUaW1lb3V0IGxpbWl0IGZvciByZXNwb25zZSBmcm9tIHRhcmdldC4gKi8KK2V4dGVybiBpbnQgcmVtb3RlX3RpbWVvdXQ7CisKK2V4dGVybiBhc2VjdGlvbiAqdGFyZ2V0X21lbW9yeV9iZmRfc2VjdGlvbjsKKwwKKy8qIEZ1bmN0aW9ucyBmb3IgaGVscGluZyB0byB3cml0ZSBhIG5hdGl2ZSB0YXJnZXQuICAqLworCisvKiBUaGlzIGlzIGZvciBuYXRpdmUgdGFyZ2V0cyB3aGljaCB1c2UgYSB1bml4L1BPU0lYLXN0eWxlIHdhaXRzdGF0dXMuICAqLworZXh0ZXJuIHZvaWQgc3RvcmVfd2FpdHN0YXR1cyBQQVJBTVMgKChzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKiwgaW50KSk7CisKKy8qIENvbnZlcnQgYmV0d2VlbiBob3N0IHNpZ25hbCBudW1iZXJzIGFuZCBlbnVtIHRhcmdldF9zaWduYWwncy4gICovCitleHRlcm4gZW51bSB0YXJnZXRfc2lnbmFsIHRhcmdldF9zaWduYWxfZnJvbV9ob3N0IFBBUkFNUyAoKGludCkpOworZXh0ZXJuIGludCB0YXJnZXRfc2lnbmFsX3RvX2hvc3QgUEFSQU1TICgoZW51bSB0YXJnZXRfc2lnbmFsKSk7CisKKy8qIENvbnZlcnQgZnJvbSBhIG51bWJlciB1c2VkIGluIGEgR0RCIGNvbW1hbmQgdG8gYW4gZW51bSB0YXJnZXRfc2lnbmFsLiAgKi8KK2V4dGVybiBlbnVtIHRhcmdldF9zaWduYWwgdGFyZ2V0X3NpZ25hbF9mcm9tX2NvbW1hbmQgUEFSQU1TICgoaW50KSk7CisKKy8qIEFueSB0YXJnZXQgY2FuIGNhbGwgdGhpcyB0byBzd2l0Y2ggdG8gcmVtb3RlIHByb3RvY29sIChpbiByZW1vdGUuYykuICovCitleHRlcm4gdm9pZCBwdXNoX3JlbW90ZV90YXJnZXQgUEFSQU1TICgoY2hhciAqbmFtZSwgaW50IGZyb21fdHR5KSk7CisMCisvKiBJbXBvcnRlZCBmcm9tIG1hY2hpbmUgZGVwZW5kZW50IGNvZGUgKi8KKworI2lmbmRlZiBTT0ZUV0FSRV9TSU5HTEVfU1RFUF9QCisjZGVmaW5lIFNPRlRXQVJFX1NJTkdMRV9TVEVQX1AgMAorI2RlZmluZSBTT0ZUV0FSRV9TSU5HTEVfU1RFUChzaWcsYnBfcCkgYWJvcnQgKCkKKyNlbmRpZiAvKiBTT0ZUV0FSRV9TSU5HTEVfU1RFUF9QICovCisKKy8qIEJsYW5rIHRhcmdldCB2ZWN0b3IgZW50cmllcyBhcmUgaW5pdGlhbGl6ZWQgdG8gdGFyZ2V0X2lnbm9yZS4gKi8KK3ZvaWQgdGFyZ2V0X2lnbm9yZSBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIE1hY3JvIGZvciBnZXR0aW5nIHRhcmdldCdzIGlkZWEgb2YgYSBmcmFtZSBwb2ludGVyLgorICAgRklYTUU6IEdEQidzIHdob2xlIHNjaGVtZSBmb3IgZGVhbGluZyB3aXRoICJmcmFtZXMiIGFuZAorICAgImZyYW1lIHBvaW50ZXJzIiBuZWVkcyBhIHNlcmlvdXMgc2hha2Vkb3duLiAgKi8KKyNpZm5kZWYgVEFSR0VUX1ZJUlRVQUxfRlJBTUVfUE9JTlRFUgorI2RlZmluZSBUQVJHRVRfVklSVFVBTF9GUkFNRV9QT0lOVEVSKEFERFIsIFJFR1AsIE9GRlApIFwKKyAgIGRvIHsgKihSRUdQKSA9IEZQX1JFR05VTTsgKihPRkZQKSA9ICAwOyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIFRBUkdFVF9WSVJUVUFMX0ZSQU1FX1BPSU5URVIgKi8KKworI2VuZGlmCS8qICFkZWZpbmVkIChUQVJHRVRfSCkgKi8KZGlmZiAtLWdpdCBhL2dkYi90ZXJtaW5hbC5oIGIvZ2RiL3Rlcm1pbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmYjJjYgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXJtaW5hbC5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qIFRlcm1pbmFsIGludGVyZmFjZSBkZWZpbml0aW9ucyBmb3IgR0RCLCB0aGUgR05VIERlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODksIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIChURVJNSU5BTF9IKQorI2RlZmluZSBURVJNSU5BTF9IIDEKKworCisvKiBJZiB3ZSdyZSB1c2luZyBhdXRvY29uZiwgaXQgd2lsbCBkZWZpbmUgSEFWRV9URVJNSU9TX0gsCisgICBIQVZFX1RFUk1JT19IIGFuZCBIQVZFX1NHVFRZX0ggZm9yIHVzLiBPbmUgZGF5IHdlIGNhbiByZXdyaXRlCisgICBzZXItdW5peC5jIGFuZCBpbmZsb3cuYyB0byBpbnNwZWN0IHRob3NlIG5hbWVzIGluc3RlYWQgb2YKKyAgIEhBVkVfVEVSTUlPUywgSEFWRV9URVJNSU8gYW5kIHRoZSBpbXBsaWNpdCBIQVZFX1NHVFRZICh3aGVuIG5laXRoZXIKKyAgIEhBVkVfVEVSTUlPUyBvciBIQVZFX1RFUk1JTyBpcyBzZXQpLiAgVW50aWwgdGhlbiwgbWFrZSBzdXJlIHRoYXQKKyAgIG5vdGhpbmcgaGFzIGFscmVhZHkgZGVmaW5lZCB0aGUgb25lIG9mIHRoZSBuYW1lcywgYW5kIGRvIHRoZSByaWdodAorICAgdGhpbmcuICovCisKKy8qIG5vdGhpbmcgd29ya3Mgd2l0aCBnbzMyLCBhbmQgdGhlIGhlYWRlcnMgYXJlbid0IGNvbXBsZXRlICovCisjaWYgIWRlZmluZWQgKF9fR08zMl9fKQorI2lmICFkZWZpbmVkIChIQVZFX1RFUk1JT1MpICYmICFkZWZpbmVkKEhBVkVfVEVSTUlPKSAmJiAhZGVmaW5lZChIQVZFX1NHVFRZKQorI2lmIGRlZmluZWQoSEFWRV9URVJNSU9TX0gpCisjZGVmaW5lIEhBVkVfVEVSTUlPUworI2Vsc2UgLyogISBkZWZpbmVkIChIQVZFX1RFUk1JT1NfSCkgKi8KKyNpZiBkZWZpbmVkKEhBVkVfVEVSTUlPX0gpCisjZGVmaW5lIEhBVkVfVEVSTUlPCisjZWxzZSAvKiAhIGRlZmluZWQgKEhBVkVfVEVSTUlPX0gpICovCisjaWYgZGVmaW5lZChIQVZFX1NHVFRZX0gpCisjZGVmaW5lIEhBVkVfU0dUVFkKKyNlbmRpZiAvKiAhIGRlZmluZWQgKEhBVkVfU0dUVFlfSCkgKi8KKyNlbmRpZiAvKiAhIGRlZmluZWQgKEhBVkVfVEVSTUlPX0gpICovCisjZW5kaWYgLyogISBkZWZpbmVkIChIQVZFX1RFUk1JT1NfSCkgKi8KKyNlbmRpZiAvKiAhZGVmaW5lZCAoSEFWRV9URVJNSU9TKSAmJiAhZGVmaW5lZChIQVZFX1RFUk1JTykgJiYgIWRlZmluZWQoSEFWRV9TR1RUWSkgKi8KKyNlbmRpZiAvKiAhIGRlZmluZWQgKF9fR08zMl9fKSAqLworCisjaWYgZGVmaW5lZChIQVZFX1RFUk1JT1MpCisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX0dPMzJfXykgJiYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZCAoSEFWRV9URVJNSU9TKQorCisvKiBEZWZpbmUgYSBjb21tb24gc2V0IG9mIG1hY3JvcyAtLSBCU0QgYmFzZWQgLS0gYW5kIHJlZGVmaW5lIHdoYXRldmVyCisgICB0aGUgc3lzdGVtIG9mZmVycyB0byBtYWtlIGl0IGxvb2sgbGlrZSB0aGF0LiAgRklYTUU6IHNlcmlhbC5oIGFuZAorICAgc2VyLSouYyBkZWFsIHdpdGggdGhpcyBpbiBhIG11Y2ggY2xlYW5lciBmYXNoaW9uOyBhcyBzb29uIGFzIHN0dWZmCisgICBpcyBjb252ZXJ0ZWQgdG8gdXNlIHRoZW0sIGNhbiBnZXQgcmlkIG9mIHRoaXMgY3JhcC4gICovCisKKyNpZmRlZiBIQVZFX1RFUk1JTworCisjaW5jbHVkZSA8dGVybWlvLmg+CisKKyN1bmRlZiBUSU9DR0VUUAorI2RlZmluZSBUSU9DR0VUUCBUQ0dFVEEKKyN1bmRlZiBUSU9DU0VUTgorI2RlZmluZSBUSU9DU0VUTiBUQ1NFVEEKKyN1bmRlZiBUSU9DU0VUUAorI2RlZmluZSBUSU9DU0VUUCBUQ1NFVEFGCisjZGVmaW5lIFRFUk1JTkFMIHN0cnVjdCB0ZXJtaW8KKworI2Vsc2UgLyogc2d0dHkgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2d0dHkuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNkZWZpbmUgVEVSTUlOQUwgc3RydWN0IHNndHR5YgorCisjZW5kaWYgLyogc2d0dHkgKi8KKyNlbmRpZgorCitleHRlcm4gdm9pZCBuZXdfdHR5IFBBUkFNUyAoKHZvaWQpKTsKKworLyogRG8gd2UgaGF2ZSBqb2IgY29udHJvbD8gIENhbiBiZSBhc3N1bWVkIHRvIGFsd2F5cyBiZSB0aGUgc2FtZSB3aXRoaW4KKyAgIGEgZ2l2ZW4gcnVuIG9mIEdEQi4gIEluIGluZmxvdy5jLiAgKi8KK2V4dGVybiBpbnQgam9iX2NvbnRyb2w7CisKKy8qIFNldCB0aGUgcHJvY2VzcyBncm91cCBvZiB0aGUgY2FsbGVyIHRvIGl0cyBvd24gcGlkLCBvciBkbyBub3RoaW5nIGlmCisgICB3ZSBsYWNrIGpvYiBjb250cm9sLiAgKi8KK2V4dGVybiBpbnQgZ2RiX3NldHBnaWQgUEFSQU1TICgodm9pZCkpOworCisjZW5kaWYJLyogIWRlZmluZWQgKFRFUk1JTkFMX0gpICovCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlLy5nZGJpbml0IGIvZ2RiL3Rlc3RzdWl0ZS8uZ2RiaW5pdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmJjYjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS8uZ2RiaW5pdApAQCAtMCwwICsxIEBACitzZXQgaGVpZ2h0IDQwMApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cgYi9nZGIvdGVzdHN1aXRlL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2E5NmIwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cKQEAgLTAsMCArMSw1OTMwIEBACisxOTk5LTAzLTIzICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGdkYi5jKysvb3ZlcmxvYWQuY2M6IFBhc3Mgc3RyaW5nIGluc3RlYWQgb2YgY2hhciBhZGRyLCBhbHdheXMKKwlpbml0IGNjcGZvby4KKwkqIGdkYi5jKysvdGVtcGxhdGVzLmNjOiBGaXggc3ludGF4IGVycm9yLgorCisxOTk5LTAzLTA5ICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2NhbGwtYXItc3QuYyAobWFpbik6IFRlcm1pbmF0ZSBjaGFyX2FycmF5IHdpdGggYSBudWxsCisgCWNoYXJhY3Rlciwgc28gR0RCIHdvbid0IHByaW50IGdhcmJhZ2UgYWZ0ZXIgaXRzIGVuZC4KKwkKKwkqIGdkYi5iYXNlL2NhbGwtYXItc3QuZXhwOiBEb24ndCBzdGVwIGludG8gc3VtX2FycmF5X3ByaW50OyBzZXQgYQorCWJyZWFrcG9pbnQgdGhlcmUgaW5zdGVhZC4gIFNvbWV0aW1lcyBHQ0MgZW1pdHMgbWVtY3B5IHRvIGhhbmRsZQorCXRoZSBsYXJnZSBzdHJ1Y3R1cmVzIGJlaW5nIHBhc3NlZCBieSB2YWx1ZSwgc28gd2Ugc3RlcCBpbnRvIHRoYXQKKwlpbnN0ZWFkIG9mIHN1bV9hcnJheV9wcmludCwgd2hpY2ggb2JzY3VyZXMgd2hhdCB3ZSdyZSByZWFsbHkgdGVzdGluZy4KKwkqIGdkYi5iYXNlL3N0ZXAtdGVzdC5leHA6IEhvd2V2ZXIsIHdlIGRvIHdhbnQgYSB0ZXN0IHRoYXQgbm90aWNlcworIAl0aGUgYml6YXJyZSBzdGVwcyBpbnRvIG1lbWNweSwgc28gZG8gdGhhdCBoZXJlLiAgQWRkIGNoZWNrIGZvcgorIAlzdGVwcGluZyBpbnRvIGZ1bmN0aW9uIGNhbGxzIHRoYXQgcGFzcyBsYXJnZSBzdHJ1Y3R1cmVzIGJ5IHZhbHVlLgorICAJKCJJcyB0aGF0IGEgbm91biBjbGF1c2UsIG9yIGFyZSB5b3UganVzdCBoYXBweSB0byBzZWUgbWU/IikKKwlSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gc3BlY2lmaWMgbGluZSBudW1iZXJzLgorCSogZ2RiLmJhc2Uvc3RlcC10ZXN0LmMgKHN0cnVjdCByaG9tYm9pZGFsLCBsYXJnZV9zdHJ1Y3RfYnlfdmFsdWUpOgorCU5ldyB0eXBlIGFuZCBmdW5jdGlvbi4KKwkobWFpbik6IENhbGwgbGFyZ2Vfc3RydWN0X2J5X3ZhbHVlLCBwYXNzaW5nIGl0IGEgbGFyZ2Ugc3RydWN0IGJ5IHZhbHVlLgorCSogbGliL2dkYi5leHAgKGdkYl9nZXRfbGluZV9udW1iZXIpOiBOZXcgZnVuY3Rpb24uCisKKwkqIGdkYi5iYXNlL3N0ZXAtdGVzdC5leHA6IFJld3JpdGUgYHN0ZXBpJyBhbmQgYG5leHRpJyB0ZXN0cyB0byBiZQorCW1vcmUgcG9ydGFibGUuCisKKwkqIGxpYi9nZGIuZXhwOiBEb2MgZml4ZXMuCisKKwkqIGdkYi5iYXNlL2Rpc3BsYXkuZXhwOiBEb24ndCBleGVyY2lzZSB0aGUgImRldGFjaCIgYW5kICJraWxsIgorIAljb21tYW5kcy4gIFRoZXkncmUgbm90IGdlcm1hbmUgdG8gdGhpcyB0ZXN0LCBhbmQgdGhleSBkb24ndCB3b3JrCisgCXRoYXQgd2F5IG9uIHJlbW90ZSB0YXJnZXRzLgorCisxOTk5LTAyLTI1ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL2NhbGwtYXItc3QuYzogSW5jbHVkZSBzdHJpbmcuaCwgbm90IHN0cmluZ3MuaC4KKwkqIGdkYi5iYXNlL2NhbGwtcnQtc3QuYzogRGl0dG8uCisKKzE5OTktMDItMjMgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBGb3JtYXR0aW5nIGZpeC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKKzE5OTktMDItMTMgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCSogZ2RiLnRocmVhZHMvcHRocmVhZHMuZXhwIChob3Jpeik6IE5ldyB2YXJpYWJsZS4KKwkodGVzdF9zdGFydHVwKTogRml4IHJlZ2V4cHMgdGhhdCBjYXB0dXJlIHRocmVhZCBudW1iZXJzLgorCisxOTk5LTAyLTEwICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL3Ntb2tlLmV4cDogRGlzYW1iaWd1YXRlIHR3byB0ZXN0IGNhc2UgbmFtZXMgKGJvdGgKKwljYWxsZWQgYGBwcmludCcnKS4KKworRnJpIEZlYiAgNSAxMjo0Mjo1NiAxOTk5ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL3ZvbGF0aWxlLmV4cDogVXNlIGdkYl90ZXN0LCBhZGQgeGZhaWxzIGZvciBHQ0MKKyAJY29tcGlsYXRpb24uCisKKzE5OTktMDItMDQgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogZ2RiLmJhc2UvbWlzY2V4cHJzLmV4cDogQ2hhbmdlIHBhdHRlcm5zIHRvIG1hdGNoIEdEQidzCisJYWN0dWFsIG91dHB1dCBmb3JtYXR0aW5nLgorCSogZ2RiLmJhc2Uvc21va2UuZXhwOiBHREIgcmVtb3ZlcyBsZWFkaW5nIDAncy4KKwkqIGdkYi5iYXNlL3ZvbGF0aWxlLmV4cDogRG9uJ3QgY2hlY2sgdHlwZSBvZiByZW11bmVyYXRpb247CisJdGhhdCB2YXJpYWJsZSBpcyBubyBsb25nZXIgZGVmaW5lZCBpbiBjb25zdHZhcnMuYy4KKwkqIGdkYi5iYXNlL3N0ZXAtdGVzdC5jIChtYWluKTogRXhpdCB3aXRoIGV4cGxpY2l0IGV4aXQgY29kZS4KKwkqIGdkYi5iYXNlL3N0ZXAtdGVzdC5leHA6IFJlbW92ZSB0d28gbmV4dGkgY2hlY2tzLS10aGV5IGFyZQorCW5vdCBwb3J0YWJsZS4KKworMTk5OS0wMi0wNCAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBnZGIuYmFzZS9oZWxwLmV4cCAoImhlbHAgZGVsZXRlIGRpc3BsYXkiKTogRml4IHRlc3QgdG8gbWF0Y2gKKwlnZGIncyBvdXRwdXQuCisKKwkqIGdkYi5iYXNlL2xvbmdfbG9uZy5jIChrbm93bl90eXBlcyk6IEluaXRpYWxpemUgdmFsdWVzIHRvIHplcm8uCisJKiBnZGIuYmFzZS9sb25nX2xvbmcuZXhwOiBTdGVwIG9uZSBtb3JlIGxpbmUKKwlzbyAnZGVjJyBpcyBpbml0aWFsaXplZCBpbiAiZ2V0IHRvIGtub3duIHBsYWNlIi4gIEdEQiByZW1vdmVzCisgICAgICAgIGxlYWRpbmcgemVyb3MuICBFeHBsaWNpdGx5IGFzayBmb3IgaGV4IGZvcm1hdHRpbmcuICBVc2UgCisgICAgICAgIHVuaXF1ZSB0ZXN0IGNhc2UgbmFtZXMuCisKK1R1ZSBGZWIgIDIgMTA6MTY6MDggMTk5OSAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgorCisJKiBsaWIvZ2RiLmV4cCAoZ2RiX3ByZXByb2Nlc3MpOiBSZW1vdmUgJ3B1dHMnIHN0YXRlbWVudC4gCisKKwkqIGdkYi5jKysvbWV0aG9kLmV4cDogQWRkIG1pc3NpbmcgY2xvc2UgYnJhY2UuCisKKzE5OTktMDEtMzAgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvbWFpbnQuZXhwOiBVc2UgJ3NldCBoZWlnaHQgMCcgdG8gZGlzYWJsZSBwYWdlCisJcHJvbXB0aW5nLCBub3QgJ3NldCBoZWlnaHQgNDAwJy4KKworCUZpeCBhIGJ1bmNoIG9mIHRpbWVvdXRzLgorCSogZ2RiLmJhc2UvbWFpbnQuZXhwICgibWFpbnQgcHJpbnQgb2JqZmlsZXMiKTogQnJlYWsgdGhpcyB1cCBpbnRvCisJZm91ciBzZXBhcmF0ZSB0ZXN0cywgc28gZXhwZWN0IGRvZXNuJ3QgdGFrZSBmb3JldmVyIHRvIG1hdGNoIGEgdG9uCisJb2YgdGV4dCBhZ2FpbnN0IGEgcmVnZXhwIHdpdGggbG90cyBvZiAuKiBmb3Jtcy4KKwkoIm1haW50IHByaW50IHBzeW1ib2xzIiwgIm1haW50IHByaW50IHN5bWJvbHMiKTogTWFrZSBzb21lIG9mCisJdGhlc2UgZ3JlcHMgbW9yZSBzZWxlY3RpdmUsIHNvIHRoYXQgZXhwZWN0IGRvZXNuJ3QgdHJ5IHRvIHdhZGUKKwl0aHJvdWdoIGh1Z2UgcGlsZXMgb2Ygb3V0cHV0IGFuZCB0aW1lIG91dC4KKworCSogZ2RiLmJhc2UvbWFpbnQuZXhwICgibWFpbnQgcHJpbnQgbXN5bWJvbHMiKTogRml4IHBhdHRlcm4uCisKKwkqIGdkYi5iYXNlL21haW50LmV4cCAoIm1haW50IGluZm8gYnJlYWtwb2ludHMiKTogU3BsaXQgaW50byB0d28KKyAJdGVzdHM6IG9uZSB3aGljaCBkb2Vzbid0IGV4cGVjdCBzaGxpYiBldmVudHMgdG8gYmUgcmVwb3J0ZWQsIGFuZAorIAlhbm90aGVyIHdoaWNoIGRvZXMsIGJ1dCBpcyBYRkFJTCBmb3IgYWxsIHBsYXRmb3JtcyBvdGhlciB0aGFuCisgCUhQL1VYLgorCisJKiBnZGIuYmFzZS9icmVhay5leHA6IFRlYWNoIHRoZSB0ZXN0IHN1aXRlIHRoYXQgdGhlIGBjYXRjaAorCWZvcmsnLCBgY2F0Y2ggdmZvcmsnLCBhbmQgYGNhdGNoIGV4ZWMnIGNvbW1hbmRzIHByb2R1Y2UgZXJyb3IKKwltZXNzYWdlcyBvbiBwbGF0Zm9ybXMgdGhhdCBkb24ndCBwcm92aWRlIHRoZXNlIGZlYXR1cmVzLgorCitNb24gSmFuIDI1IDE4OjM1OjU2IDE5OTkgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogZ2RiLmhwL2dlbi1zby10aHJlc2guYywgc28tdGhyZXNoLnNoLCBzby10aHJlc2guZXhwLAorIAlzby10aHJlc2gubGlua29wdHMsIHNvLXRocmVzaC5tazogTW92ZSB0byBnZGIuaHAgZnJvbSBnZGIuYmFzZQorIAkoc2hvcnRlbmluZyBuYW1lcyBmcm9tIHNvbGliX3RocmVzaG9sZC5leHAgZXRjKSwgd29uJ3QgcnVuIG9uCisgCWFueXRoaW5nIGJ1dCBIUC1VWCBmb3IgdGhlIGZvcmVzZWVhYmxlIGZ1dHVyZS4KKwkqIGdkYi5ocC9NYWtlZmlsZS5pbiwgZ2RiLmJhc2UvTWFrZWZpbGUuaW4gKGNsZWFuKTogQWRqdXN0IHRvCisgCXJlZmxlY3QgbW92ZS4KKworVGh1IEphbiAyMSAxNTo0Njo0OSAxOTk5ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL01ha2VmaWxlLmluLCBnZGIuYysrL01ha2VmaWxlLmluLAorIAlnZGIudHJhY2UvTWFrZWZpbGUuaW4gKGNsZWFuKTogUmVtb3ZlIGFsbCB0ZXN0IGV4ZWN1dGFibGVzLgorCitUdWUgSmFuIDE5IDE3OjIwOjA5IDE5OTkgIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9zaGxpYi1jYWxsLmV4cDogYWRkIHRlc3QgY2FzZXMgdG8gdmVyaWZ5IHRoYXQgZ2RiCisJc3VjY2Vzc2Z1bGx5IHJlLXNldHMgYnJlYWtwb2ludHMgaW4gc2hhcmVkIGxpYnJhcmllcy4KKwkqIGdkYi5iYXNlL3NobWFpbi5jIChtYWluKTogcmV0dXJuIDAsIGRvbid0IGZhbGwgb2ZmIHRoZSBlbmQuCisKK0ZyaSBKYW4gMTUgMTQ6MDQ6NTcgMTk5OSAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgorCisJKiBnZGIuaHAveGRiMy5leHA6IGRvIG5vdCBleGVjdXRlIHVubGVzcyBvbiBocHBhLWhwdXggcGxhdGZvcm0gCisJYW5kIGNvbXBpbGVkIHcvbyBHQ0MuIAorCisJKiBnZGIuaHAvd2F0Y2gtY21kLmV4cDogZGl0dG8uCisKKwkqIGdkYi5ocC93YXRjaC1ocC5leHA6IGRpdHRvLgorCisJKiBnZGIuaHAveGRiMS5leHA6IGRpdHRvLgorCisJKiBnZGIuaHAveGRiMi5leHA6IGRpdHRvLgorCisJKiBnZGIuaHAvZGJ4LmV4cDogZGl0dG8uCisKK1RodSBKYW4gMTQgMTg6MzY6NDggMTk5OSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25zdHZhcnMuYzogUmVtb3ZlIEMrKy1pc21zLgorCSogY29uc3R2YXJzLmV4cDogVXNlIGdkYl90ZXN0IGV2ZXJ5d2hlcmUsIGFkZCB4ZmFpbHMgaWYgY29tcGlsZWQKKyAJd2l0aCBHQ0MuCisKK01vbiBKYW4gMTEgMTA6MDg6MDMgMTk5OSAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+CisKKwlUaGUgZm9sbG93aW5nIGNoYW5nZXMgYXJlIHBhcnQgb2YgdGhlIEhQIG1lcmdlLgorCisJKiBnZGIuYmFzZS9icmVhay5leHA6IG5ldyB0ZXN0cyB0byB2ZXJpZnkgdGhhdCBjYXRjaHBvaW50cyBmb3IKKwlmb3JrLCB2Zm9yaywgYW5kIGV4ZWMgZG9uJ3QgdHJpZ2dlciBpbmFwcHJvcHJpYXRlbHkuCisKKwkqIGdkYi5iYXNlL29wYXF1ZS5leHA6IGNvbXBpbGUgb25lIGZpbGUgYXQgYSB0aW1lLCB0aGVuIGxpbmsuCisKKwkqIGdkYi5iYXNlL3NpZ25hbHMuZXhwOiBiZSBtb3JlIHJlc3RyaWN0aXZlIGFib3V0IHdoaWNoIGhwcGEKKwlzeXN0ZW1zIHJlY2VpdmUgYSBzZXR1cF94ZmFpbC4gIG5ldyB0ZXN0cy4KKworCSogZ2RiLmJhc2Uvc29saWJfdGhyZXNob2xkLmJ1aWxkOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL3NvbGliX3RocmVzaG9sZC5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2Uvc29saWJfdGhyZXNob2xkLmxpbmtfb3B0czogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9zb2xpYl90aHJlc2hvbGQubWs6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2UvZ2VuX3NvbGliX3RocmVzaG9sZC5jOiBuZXcgZmlsZS4KKworCSogZ2RiLmMrKy9jbGFzc2VzLmV4cDogaWYgb24gSFBVWCBhbmQgbm90IHVzaW5nIGdjYywgc2tpcCB0aGUKKwl0ZXN0cy4gIE5ldyB0ZXN0cyBmb3IgZW51bXMgaW5zaWRlIGNsYXNzZXMuCisKKwkqIGdkYi5jKysvY29tcGlsZXIuY2M6IGluZGljYXRlIHN1cHBvcnQgb2YgdGVtcGxhdGUgZGVidWdnaW5nLgorCisJKiBnZGIuYysrL2RlbWFuZ2xlLmV4cDogcnVuIGhwIHN0eWxlIGRlbWFuZ2xpbmcgdGVzdHMuCisKKwkqIGdkYi5jKysvaW5oZXJpdC5leHA6IGlmIG9uIEhQVVggYW5kIG5vdCB1c2luZyBnY2MsIHNraXAgdGhlCisJdGVzdHMuCisKKwkqIGdkYi5jKysvbWlzYy5jYzogY2hhbmdlcyB0byBzdXBwb3J0IG5ldyB0ZXN0cy4KKworCSogZ2RiLmMrKy90ZW1wbGF0ZXMuY2M6IGNoYW5nZXMgdG8gc3VwcG9ydCBIUCdzIGNvbXBpbGVyOyBjaGFuZ2VzCisJdG8gc3VwcG9ydCBuZXcgdGVzdHMuCisKKwkqIGdkYi5jKysvdmlydGZ1bmMuZXhwOiBpZiB3ZSBhcmUgb24gSFBVWCBhbmQgd2UgYXJlIG5vdCB1c2luZworCWdjYywgdGhlbiBza2lwIHRoZXNlIHRlc3RzLgorCitTdW4gSmFuIDEwIDIzOjQ0OjExIDE5OTkgIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJVGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgcGFydCBvZiB0aGUgSFAgbWVyZ2U7IHNvbWUgaGFkIGxvbmdlcgorCW5hbWVzIGF0IEhQLCBidXQgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gYmUgbm8gbW9yZSB0aGFuIDE0CisJY2hhcmFjdGVycyBpbiBsZW5ndGguCisKKwkqIGdkYi5ocC9hbWJpZ3VvdXMuY2M6IG5ldyBmaWxlLgorCSogZ2RiLmhwL2FtYmlndW91cy5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmhwL2F0dGFjaC5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmhwL2F0dGFjaDIuZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC9jbGFzc2VzLWhwLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuaHAvY3R0aS5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmhwL2N0dGktYWRkLmNjOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC9jdHRpLWFkZDEuY2M6IG5ldyBmaWxlLgorCSogZ2RiLmhwL2N0dGktYWRkMi5jYzogbmV3IGZpbGUuCisJKiBnZGIuaHAvY3R0aS1hZGQzLmNjOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC9kYnguZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC9leGNlcHRpb24uY2M6IG5ldyBmaWxlLgorCSogZ2RiLmhwL2V4Y2VwdGlvbi5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmhwL2ZvbGwtZXhlYy5jOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC9mb2xsLWV4ZWMuZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC9mb2xsLWZvcmsuYzogbmV3IGZpbGUuCisJKiBnZGIuaHAvZm9sbC1mb3JrLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuaHAvZm9sbC12Zm9yay5jOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC9mb2xsLXZmb3JrLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuaHAvaW5oZXJpdC1ocC5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmhwL21vcmUtc3RlcHMuZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC9uYW1lc3BhY2UuY2M6IG5ldyBmaWxlLgorCSogZ2RiLmhwL25hbWVzcGFjZS5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmhwL29wdGltaXplLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuaHAvcHhkYi5jOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC9weGRiLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuaHAvcXVpY2tzb3J0LmV4cDogbmV3IGZpbGUuCisJKiBnZGIuaHAvcmVnLXRlc3QuZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC9yZWctdGVzdC5zOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC9zaXplZC1lbnVtLmM6IG5ldyBmaWxlLgorCSogZ2RiLmhwL3NpemVkLWVudW0uZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC9zdGFydC1zdG9wLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuaHAvdGVtcGwtaHAuY2M6IG5ldyBmaWxlLgorCSogZ2RiLmhwL3RlbXBsLWhwLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuaHAvdGhyLWxpYi5jOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC90aHItbGliLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuaHAvdGhyLWxpYi5oOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC90aHItbGlibGliLmM6IG5ldyBmaWxlLgorCSogZ2RiLmhwL3ZpcnRmdW4taHAuYzogbmV3IGZpbGUuCisJKiBnZGIuaHAvdmlydGZ1bi1ocC5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmhwL3dhdGNoLWNtZC5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmhwL3dhdGNoLWhwLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuaHAveGRiMS5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmhwL3hkYjIuZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC94ZGIzLmV4cDogbmV3IGZpbGUuCisKK1dlZCBKYW4gIDYgMTg6NDE6MTUgMTk5OSAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+CisKKwlUaGUgZm9sbG93aW5nIGZpbGVzIGFyZSBwYXJ0IG9mIHRoZSBIUCBtZXJnZTsgc29tZSBoYWQgbG9uZ2VyCisJbmFtZXMgYXQgSFAsIGJ1dCBoYXZlIGJlZW4gcmVuYW1lZCB0byBiZSBubyBtb3JlIHRoYW4gMTQKKwljaGFyYWN0ZXJzIGluIGxlbmd0aC4KKworCSogZ2RiLmJhc2Uvc3MuaDogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9jYWxsLWFyLXN0LmM6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2UvY2FsbC1hci1zdC5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2UvY2FsbC1ydC1zdC5jOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL2NhbGwtcnQtc3QtZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL2NhbGwtc3Rycy5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2UvZW5hLWRpcy1ici5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2UvZW52aXJvbi5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2UvbG9uZ19sb25nLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9zZWN0LWNtZC5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2Uvc2hsaWItY2wyLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9zbW9rZS5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2Uvc28taW1wbC1sZC5jOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL3NvLWltcGwtbGQuZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL3NvLWluZHItY2wuYzogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9zby1pbmRyLWNsLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS92YXJhcmdzLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS92b2xhdGlsZS5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2Uvd2hhdGlzLWV4cC5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmMrKy9kZXJpdmF0aW9uLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuYysrL2xvY2FsLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuYysrL21lbWJlci1wdHIuZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5jKysvb3ZlcmxvYWQuZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5jKysvb3ZsZGJyZWFrLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuYysrL3JlZi10eXBlcy5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmMrKy9yZWYtdHlwZXMyLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuYysrL3VzZXJkZWYuZXhwOiBuZXcgZmlsZS4KKwkKK1dlZCBKYW4gIDYgMTM6NTA6NTcgMTk5OSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9kZWZhdWx0LmV4cDogUmVmbGVjdCB3b3JkaW5nIGNoYW5nZSBpbiByZW1vdGUuYy4KKworVHVlIEphbiAgNSAxOToxNDo1MSAxOTk5ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9oZWxwLmV4cDogVXBkYXRlIHRvIHJlZmxlY3QgY3VycmVudCB0ZXh0LgorCitUdWUgSmFuICA1IDEzOjA1OjMyIDE5OTkgIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJKiBnZGIuYysrL2Fub24tdW5pb24uY2M6IG1ha2UgZm9vIGFuZCBiYXIgZ2xvYmFsLCBvdGhlcndpc2UKKwl0aGV5J3JlIHN0YWNrIHZhcmlhYmxlcyBhbmQgY29udGFpbiBnYXJiYWdlLgorCSogZ2RiLmMrKy9hbm9uLXVuaW9uLmV4cDogbmV3IGZpbGUuCisKKwlUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGJ5IERhdmlkIFRheWxvcgorIAk8dGF5bG9yQGN5Z251cy5jb20+LCBFbGVuYSBaYW5ub25pIDxlemFubm9uaUBjeWdudXMuY29tPiwgYW5kCisgCUVkaXRoIEVwc3RlaW4gPGVlcHN0ZWluQGN5Z251cy5jb20+IGFzIHBhcnQgb2YgYSBwcm9qZWN0IHRvIG1lcmdlCisgCWluIGNoYW5nZXMgYnkgSFAuCisKKwkqIGdkYi5iYXNlL2JpdG9wcy5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2UvZGVmYXVsdC5leHA6IGNoYW5nZSBleHBlY3RlZCBtZXNzYWdlcyBmb3IgY2F0Y2ggYW5kCisJaW5mbyBjYXRjaCB0ZXN0cyB0byByZWZsZWN0IEhQIG1lcmdlIGNoYW5nZXMuCisJKiBnZGIuYmFzZS9lbmFibGUtZGlzYWJsZS1icmVhay5leHAKKwkqIGdkYi5iYXNlL2VuZGluZy1ydW4uYzogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9sb25nX2xvbmcuYzogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9tYWludC5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2UvcG9pbnRlcnMyLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9zaGxpYi1jYWxsMi5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2Uvc29saWIuZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL3N0ZXAtdGVzdC5jOiBuZXcgZmlsZS4KKwkqIGdkYi5jKysvYW5vbi11bmlvbi5jYzogbmV3IGZpbGUuCisJKiBnZGIuYysrL2xvY2FsLmNjOiBuZXcgZmlsZS4KKwkqIGdkYi5jKysvbWVtYmVyLXBvaW50ZXIuY2M6IG5ldyBmaWxlLgorCSogZ2RiLmMrKy9tZXRob2QuY2M6IG5ldyBmaWxlLgorCSogZ2RiLmMrKy9yZWYtdHlwZXMuY2M6IG5ldyBmaWxlLgorCSogZ2RiLmMrKy9yZWYtdHlwZXMyLmNjOiBuZXcgZmlsZS4KKwkqIGdkYi5jKysvdXNlcmRlZi5jYzogbmV3IGZpbGUuCisJCisJKiBnZGIuYmFzZS9zY29wZS5leHA6IGNvbXBpbGUgb25lIGZpbGUgYXQgYSB0aW1lLCB0aGVuIGxpbmsuCisJKiBnZGIuYmFzZS9sYW5ncy5leHA6IGRpdHRvLgorCSogZ2RiLmJhc2UvbGlzdC5leHA6IGRpdHRvLgorCQorTW9uIEphbiAgNCAxMDowNjo0MyAxOTk5ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KKworCVRoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGUgYnkgRGF2aWQgVGF5bG9yCisgCTx0YXlsb3JAY3lnbnVzLmNvbT4sIEVsZW5hIFphbm5vbmkgPGV6YW5ub25pQGN5Z251cy5jb20+LCBhbmQKKyAJRWRpdGggRXBzdGVpbiA8ZWVwc3RlaW5AY3lnbnVzLmNvbT4gYXMgcGFydCBvZiBhIHByb2plY3QgdG8gbWVyZ2UKKyAJaW4gY2hhbmdlcyBieSBIUC4KKwkKKwkqIGdkYi5jKysvaW5oZXJpdC5leHA6IGlmIG9uIGhwcGEqLSotaHB1eCogYW5kIG5vdCB1c2luZyBnY2MsCisJc2tpcCB0ZXN0cy4gIFdoZW4gY29tcGlsaW5nIHBhc3MgYysrIGZsYWcgdG8gZ2RiX2NvbXBpbGUuCisJKiBnZGIuYysrLworCQorCSogbGliL2dkYi5leHAgKGdldF9jb21waWxlcl9pbmZvKTogbmV3LCBvcHRpb25hbCBhcmd1bWVudCAtLSBhcmdzOworCXRlc3QgZm9yIG9uIGhwcGEqLSotaHB1eCo7IHVzZSBhcmdzIHRvIHNlZSBpZiBjKysgd2FzIHNwZWNpZmllZC4KKwkoc2tpcF9ocF90ZXN0cyk6IG5ldyBmdW5jdGlvbi4KKwkoZ2RiX3ByZXByb2Nlc3MpOiBuZXcgZnVuY3Rpb24uCisKKwkqIGNvbmZpZ3VyZS5pbiAoaHBkaXIpOiBkZWNpZGUgd2hldGhlciB0byBjb25maWd1cmUgZ2RiLmhwLgorCSogY29uZmlndXJlOiByZWdlbmVyYXRlZC4KKworCSogZ2RiLmJhc2UvTWFrZWZpbGUuaW4gKE1JU0NFTExBTkVPVVMpOiBuZXcgbWFjcm9zIC0tIGV4dHJhIHRoaW5ncworCXRvIGRlbGV0ZSBvbiBjbGVhbi4KKwkoRVhFQ1VUQUJMRVMpOiB1cGRhdGUgdG8gcmVmbGVjdCBuZXcgYWRkaXRpb25zLgorCSogZ2RiLmJhc2UvY29tbWFuZHMuZXhwOiB1cGRhdGUgbWVzc2FnZSBleHBlY3RlZC4KKwkqIGdkYi5iYXNlL2RlZmF1bHQuZXhwOiBhZGQgY29weXJpZ2h0IG5vdGljZS4KKwkqIGdkYi5iYXNlL2Z1bmNhcmdzLmV4cCAodGltZW91dCk6IGlmIGhwdXgsIGluY3JlYXNlIHRpbWVvdXQuCisJKiBnZGIuYmFzZS9oZWxwLmV4cDogdXBkYXRlIG1lc3NhZ2VzIHRvIHJlZmxlY3QgY3VycmVudCB0ZXh0LgorCSogZ2RiLmJhc2UvcmVjdXJzZS5leHA6IGFkZCBocHBwYSotKi1ic2QqIHRvICdsaXN0JyBvZiBlbmFibGVkCisJdGFyZ2V0cyBmb3IgcmVjdXJzZSB0ZXN0cy4KKwkqIGdkYi5iYXNlL3dhdGNocG9pbnQuZXhwOiBpZiBvbiBocHV4IGFuZCBub3QgZ2NjIGNvbXBpbGVkLCB0aGVuCisJc2tpcCB0aGlzIGZpbGUuCisKKwkqIGdkYi5jKysvTWFrZWZpbGUuaW4gKFBST0dTKTogdXBkYXRlIHRvIHJlZmxlY3QgbmV3IGV4ZWN1dGFibGVzLgorCSogZ2RiLmMrKy9jcGx1c2Z1bmNzLmV4cDogdGVsbCBnZGJfY29tcGlsZSB0aGF0IGl0J3MgYSBjKysKKwljb21waWxhdGlvbi4KKwkqIGdkYi5jKysvbWlzYy5leHA6IGRpdHRvLgorCSogZ2RiLmMrKy90ZW1wbGF0ZXMuZXhwOiBpZiB3ZSdyZSBvbiBocHV4IGFuZCBpdCdzIG5vdCBnY2MsIGRvbid0CisJcnVuIHRoZSB0ZXN0cy4gIHRlbGwgZ2RiX2NvbXBpbGUgdGhhdCBpdCdzIGEgYysrIGNvbXBpbGF0aW9uLgorCisJKiBnZGIudGhyZWFkcy9wdGhyZWFkcy5leHA6IGZpeCB0eXBvIGluIG1lc3NhZ2UuCisJCisJKiBnZGIuYmFzZS9hbGwtYmluLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9hcml0aG1ldC5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2UvYXNzaWduLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9jb21wbGV0aW9uLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9jb25kLWV4cHIuZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL2NvbmRicmVhay5leHA6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2UvZGVmaW5lLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9kb2xsYXIuZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL2Vudmlyb25tZW50LmV4cDogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9ldmFsLXNraXAuZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL2p1bXAuZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL2xvZ2ljYWwuZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL3BvaW50ZXJzLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9yZWxhdGlvbmFsLmV4cDogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9zZWN0aW9uX2NvbW1hbmQuZXhwOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL3doYXRpcy1leHByLmV4cDogbmV3IGZpbGUuCisKKwkqIGdkYi5iYXNlL2FsbC10eXBlcy5jOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL2NhbGwtYXJyYXktc3RydWN0LmM6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2UvY2FsbC1yZXR1cm4tc3RydWN0LmM6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2UvY2FsbC1zdHJpbmdzLmM6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2UvY2FsbGZ1bmNzMi5jOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL2NvbmRicmVhay5jOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL2NvbnN0dmFycy5jOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL2Rpc3BsYXkuYzogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9pbnQtdHlwZS5jOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL2p1bXAuYzogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9taXNjZXhwcnMuYzogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9wb2ludGVycy5jOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL3BvaW50ZXJzMi5jOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL3NobWFpbi5jOiBuZXcgZmlsZS4KKwkqIGdkYi5iYXNlL3NocjEuYzogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9zaHIyLmM6IG5ldyBmaWxlLgorCSogZ2RiLmJhc2Uvc29saWIuYzogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9zb2xpYjEuYzogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS9zb2xpYjIuYzogbmV3IGZpbGUuCisJKiBnZGIuYmFzZS92YXJhcmdzLmM6IG5ldyBmaWxlLgorCSogZ2RiLmMrKy9kZXJpdmF0aW9uLmNjOiBuZXcgZmlsZS4KKwkqIGdkYi5jKysvb3ZlcmxvYWQuY2M6IG5ldyBmaWxlLgorCSogZ2RiLmMrKy9vdmxkYnJlYWsuY2M6IG5ldyBmaWxlLgorCSogZ2RiLmhwL2F0dGFjaC5jOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC9hdHRhY2gyLmM6IG5ldyBmaWxlLgorCSogZ2RiLmhwL2F2ZXJhZ2UuYzogbmV3IGZpbGUuCisJKiBnZGIuaHAvY29tcGlsZXIuYzogbmV3IGZpbGUuCisJKiBnZGIuaHAvY29tcGlsZXIuY2M6IG5ldyBmaWxlLgorCSogZ2RiLmhwL2V4ZWNkLXByb2dyYW0uYzogbmV3IGZpbGUuCisJKiBnZGIuaHAvZm9sbG93LWV4ZWMuYzogbmV3IGZpbGUuCisJKiBnZGIuaHAvZm9sbG93LWZvcmsuYzogbmV3IGZpbGUuCisJKiBnZGIuaHAvZm9sbG93LXZmb3JrLWFuZC1leGVjLmM6IG5ldyBmaWxlLgorCSogZ2RiLmhwL21pc2MtaHAuY2M6IG5ldyBmaWxlLgorCSogZ2RiLmhwL21vcmUtc3RlcHMuYzogbmV3IGZpbGUuCisJKiBnZGIuaHAvb3B0aW1pemUuYzogbmV3IGZpbGUuCisJKiBnZGIuaHAvcXVpY2tzb3J0LmM6IG5ldyBmaWxlLgorCSogZ2RiLmhwL3J1bi1ocC5jOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC9zdGFydC1zdG9wLmM6IG5ldyBmaWxlLgorCSogZ2RiLmhwL3N1bS5jOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC90ZW1wbGF0ZXMtaHAuY2M6IG5ldyBmaWxlLgorCSogZ2RiLmhwL3RocmVhZC1sb2NhbC1pbi1saWIuYzogbmV3IGZpbGUuCisJKiBnZGIuaHAvdGhyZWFkLWxvY2FsLWluLWxpYi5oOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC90aHJlYWQtbG9jYWwtaW4tbGliLmxpYi5jOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC92Zm9ya2VkLXByb2dyYW0uYzogbmV3IGZpbGUuCisJKiBnZGIuaHAvdmlydGZ1bmMtaHAuY2M6IG5ldyBmaWxlLgorCSogZ2RiLmhwL3dhdGNocG9pbnQtaHAuYzogbmV3IGZpbGUuCisJKiBnZGIuaHAveGRiLmM6IG5ldyBmaWxlLgorCSogZ2RiLmhwL3hkYjAuYzogbmV3IGZpbGUuCisJKiBnZGIuaHAveGRiMC5oOiBuZXcgZmlsZS4KKwkqIGdkYi5ocC94ZGIxLmM6IG5ldyBmaWxlLgorCitNb24gRGVjIDIxIDE0OjA4OjM4IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJVGhlIGZvbGxvd2luZyBjaGFuZ2Ugd2FzIG1hZGUgYnkgRWRpdGggRXBzdGVpbgorIAk8ZWVwc3RlaW5AY3lnbnVzLmNvbT4gYXMgcGFydCBvZiBhIHByb2plY3QgdG8gbWVyZ2UgaW4gY2hhbmdlcworIAlvcmlnaW5hbGx5IG1hZGUgYnkgSFA7IEhQIGRpZCBub3QgY3JlYXRlIENoYW5nZUxvZyBlbnRyaWVzLgorCisJKiBnZGIuYysrL2RlbWFuZ2xlLmV4cDogY2hhbmdlZCB0aGUgZXhwZWN0ZWQgb3V0cHV0IGZvciBzb21lCisJQVJNLXN0eWxlIG1hbmdsaW5nIC0tIHJlbW92ZWQgc2Vjb25kIHJlZmVyZW5jZSB0byBkYXRhdHlwZS4KKyAJRm9yIGV4YW1wbGUsIG1haW50IGRlbWFuZ2xlIF9fZHRfXzExVDFfX3B0X18yX2NGdgorICAgICAgICAgICAgICAgICAgICAgVDE8Y2hhcj46On5UMTxjaGFyPih2b2lkKQorCWJlY29tZXMsCisJICAgICAgICAgICAgIG1haW50IGRlbWFuZ2xlIF9fZHRfXzExVDFfX3B0X18yX2NGdgorICAgICAgICAgICAgICAgICAgICAgVDE8Y2hhcj46On5UMSh2b2lkKQorCisgCSh0ZXN0X2hwX3N0eWxlX2RlbWFuZ2xpbmcpOiBuZXcgaHAgc3BlY2lmaWMgZGVtYW5nbGluZyB0ZXN0IGNhc2VzLgorCQorTW9uIERlYyAxNCAxNTowNzowMyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdkYi50cmFjZS9hY3Rpb25zLmV4cDogSWdub3JlIGNvbXBpbGVyIHdhcm5pbmdzIGNvbXBpbGluZyBhY3Rpb25zLmMKKwkqIGdkYi50cmFjZS9iYWNrdHJhY2UuZXhwOiBMaWtld2lzZS4KKwkqIGdkYi50cmFjZS9jaXJjLmV4cDogTGlrZXdpc2UuCisJKiBnZGIudHJhY2UvY29sbGVjdGlvbi5leHA6IExpa2V3aXNlLgorCSogZ2RiLnRyYWNlL2RlbHRyYWNlLmV4cDogTGlrZXdpc2UuCisJKiBnZGIudHJhY2UvaW5mb3RyYWNlLmV4cDogTGlrZXdpc2UuCisJKiBnZGIudHJhY2UvbGltaXRzLmV4cDogTGlrZXdpc2UuCisJKiBnZGIudHJhY2UvcGFja2V0bGVuLmV4cDogTGlrZXdpc2UuCisJKiBnZGIudHJhY2UvcGFzc2MtZHluLmV4cDogTGlrZXdpc2UuCisJKiBnZGIudHJhY2UvcGFzc2NvdW50LmV4cDogTGlrZXdpc2UuCisJKiBnZGIudHJhY2UvcmVwb3J0LmV4cDogTGlrZXdpc2UuCisJKiBnZGIudHJhY2Uvc2F2ZS10cmFjZS5leHA6IExpa2V3aXNlLgorCSogZ2RiLnRyYWNlL3RmaW5kLmV4cDogTGlrZXdpc2UuCisJKiBnZGIudHJhY2UvdHJhY2VjbWQuZXhwOiBMaWtld2lzZS4KKwkqIGdkYi50cmFjZS93aGlsZS1keW4uZXhwOiBMaWtld2lzZS4KKwkqIGdkYi50cmFjZS93aGlsZS1zdGVwcGluZy5leHA6IExpa2V3aXNlLgorCisxOTk4LTEyLTA3ICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL3Jlc3RvcmUuZXhwLCBnZGIuYmFzZS9yZXN0b3JlLmM6IE5ldyB0ZXN0cy4KKworV2VkIERlYyAgMiAyMDowMzo1MyAxOTk4ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwlGcm9tIEJyZW5kYW4gS2Vob2U6CisJKiBnZGIuYysrL2NwbHVzZnVuY3MuY2MsIG1pc2MuY2MsIHZpcnRmdW5jLmNjOiBBZGQgbm93LXJlcXVpcmVkCisJaW50IHJldHVybiB0eXBlcy4KKworU2F0IE9jdCAyNCAxODowNDoyMiAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9zbGl0ZS5leHAgKGdkYl9sb2FkKTogdXNlIGdkYl9maWxlX2NtZCwgc28gd2UgY2FuIGRvCisgCXJlbW90ZSBkb3MgaG9zdCB0ZXN0aW5nIHJpZ2h0LgorCitNb24gT2N0IDE5IDAxOjMxOjU5IDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvY29yZWZpbGUuZXhwOiByZW1vdmUgc29tZSB4ZmFpbHMuCisKK1RodSBPY3QgMTUgMTA6MDQ6MzggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9yZXJlYWQuZXhwOiBTbGVlcCAxIC0gZW5zdXJlcyB0aGF0IHRoZSB0d28gZXhlY3V0YWJsZXMKKyAJaGF2ZSBkaWZmZXJlbnQgdGltZXN0YW1wcy4KKworVGh1IE9jdCAgMSAyMDo1NjoxNCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGxpYi9nZGIuZXhwLCBnZGIuYmFzZS9kZWZhdWx0LmV4cCwgY29uZmlnL21vbml0b3IuZXhwLAorIAlnZGIuYmFzZS9kZWZhdWx0LmV4cDogUmVwbGFjZSAiZXhlYyIgd2l0aCAiZXhlY3V0YWJsZSIuCisKK1R1ZSBTZXAgMjkgMTU6MDY6MjkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9kZWZhdWx0LmV4cDogQ2hhbmdlIGVsc2UgaWYgdG8gZWxzZWlmIGZyb20gcHJldmlvdXMKKyAJZGVsdGEuCisKK01vbiBTZXAgMjggMTM6MjE6NDMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvZGVmYXVsdC5leHA6IEFkZCBicmFjZSBtaXNzaW5nIGZyb20gcHJldmlvdXMgZGVsdGEuCisKK01vbiBTZXAgMjEgMTQ6Mzk6MjcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvZGVmYXVsdC5leHA6IFN1cHBvcnQgdGVzdCBmb3IgaW5mbyBmbG9hdCBmb3IgYWxsCisJdmFyaWV0aWVzIG9mIGFybSB0b29sY2hhaW4uCisKK0ZyaSBTZXAgMTggMTQ6MDc6NDQgMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogZ2RiLnRyYWNlLyouZXhwOiByZW1vdmUgInJlbW90ZV9kb3dubG9hZCIgY29tbWFuZC4KKworV2VkIFNlcCAxNiAxMTozODoyMSAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBnZGIudHJhY2UvKi5leHA6IHJlbW92ZSAtZ2R3YXJmIGZyb20gY29tcGlsZS4KKworV2VkIFNlcCAxNiAwMToyMzoxMSAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIGdkYi50cmFjZS9jb25maWd1cmUuaW4oQUNfSU5JVCk6IHR5cG8KKwkqIGdkYi50cmFjZS9jb25maWd1cmU6IHJlZ2VuZXJhdGVkCisKK01vbiBTZXAgMTQgMjA6MDA6MDQgMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL202OGstZW1jLmV4cDogTmV3IGZpbGUuCisJKiBsaWIvPGVtYy1zdXBwb3J0LmV4cCB0cmFjZS1zdXBwb3J0LmV4cH06IE5ldyBmaWxlcy4KKwkqIGNvbmZpZ3VyZS5pbjogYWRkIG5ldyB0ZXN0IGRpcmVjdG9yeSBnZGIudHJhY2UuCisJKiBnZGIudHJhY2Uve2NvbmZpZ3VyZSBjb25maWd1cmUuaW4gTWFrZWZpbGUuaW59OiBOZXcgZmlsZXMuCisJKiBnZGIudHJhY2Uve2FjdGlvbnMuYyBhY3Rpb25zLmV4cCBnZGJfY190ZXN0LmN9OiBOZXcgZmlsZXMuCisJKiBnZGIudHJhY2Uve2NpcmMuYyBjaXJjLmV4cCBsaW1pdHMuYyBsaW1pdHMuZXhwfTogTmV3IGZpbGVzLgorCSogZ2RiLnRyYWNlL3tjb2xsZWN0aW9uLmMgY29sbGVjdGlvbi5leHAgdGZpbmQuZXhwIH06IE5ldyBmaWxlcy4KKwkqIGdkYi50cmFjZS97YmFja3RyYWNlLmV4cCBkZWx0cmFjZS5leHAgaW5mb3RyYWNlLmV4cH06IE5ldyBmaWxlcy4KKwkqIGdkYi50cmFjZS97cGFja2V0bGVuLmV4cCBwYXNzYy1keW4uZXhwIHBhc3Njb3VudC5leHB9OiBOZXcgZmlsZXMuCisJKiBnZGIudHJhY2Uve3JlcG9ydC5leHAgc2F2ZS10cmFjZS5leHAgdHJhY2VjbWQuZXhwfTogTmV3IGZpbGVzLgorCSogZ2RiLnRyYWNlL3t3aGlsZS1keW4uZXhwIHdoaWxlLXN0ZXBwaW5nLmV4cH06IE5ldyBmaWxlcy4KKwkKK0ZyaSBTZXAgMTEgMTM6NTg6MDIgMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogZ2RiLmMrKy9jbGFzc2VzLmV4cDogQ2hhbmdlIGFsbCByZWd1bGFyIGV4cHJlc3Npb25zIHRvIG1hdGNoCisJYXJiaXRyYXJ5IGNvbWJpbmF0aW9ucyBvZiBuZXdsaW5lL2NhcnJpYWdlLXJldHVybiwgc28gdGhhdCB0aGV5CisJd2lsbCB3b3JrIGVxdWFsbHkgd2VsbCBvbiBVbml4IGFuZCBXaW5kb3dzLgorCSogZ2RiLmMrKy9pbmhlcml0LmV4cDogZGl0dG8uCisJKiBnZGIuYysrL3ZpcnRmdW5jLmV4cDogZGl0dG8uCisKKzE5OTgtMDgtMTEgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9zZXRzaG93LmV4cDogRml4IGVycm9yIGludHJvZHVjZWQgYnkgY2FsbCB0byBydW50b19tYWluLgorCisxOTk4LTA3LTExICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2NhbGxmdW5jcy5leHA6IGFkZCBjbXAxMCB0ZXN0LgorCSogZ2RiLmJhc2UvY2FsbGZ1bmNzLmMgKGNtcDEwKTogbmV3IGZ1bmN0aW9uLgorCitUaHVycyBKdWwgOSAxMTowODozMSAxOTk4ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2NvbW1hbmRzLmV4cDogQnJlYWsgdXAgaW5mcnVuX2JyZWFrcG9pbnRfY29tbWFuZF90ZXN0IAorCWludG8gdHdvIHBhcnRzIHRvIGdldCBhcm91bmQgYSBzeW5jaHJvbml6YXRpb24gcHJvYmxlbSBpbiBleHBlY3QuCisKK0ZyaSBKdW4gMjYgMTQ6NTI6NDcgMTk5OCAgUGV0ZXIgU2NoYXVlciAgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPgorCisJKiBnZGIuZm9ydHJhbi90eXBlcy5leHA6ICBFc2NhcGUgYnJhY2tldHMgaW4gZXhwZWN0IHBhdHRlcm5zCisJZm9yIHRlc3RfZmxvYXRfbGl0ZXJhbF90eXBlc19hY2NlcHRlZCB0ZXN0cy4KKwkqIGdkYi5iYXNlL3Njb3BlLmV4cDogIFJlbW92ZSBleHRyYW5lb3VzIG5ld2xpbmUgaW4gZmlsZWxvY2FsX2JzcworCWJlZm9yZSBydW4gdGVzdC4KKworMTk5OC0wNi0yNSAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9zZXRzaG93LmV4cDogbWFrZSBzdXJlICRwYyBpcyBzYW5lLgorCisJKiBnZGIuc3RhYnMvd2VpcmQuZXhwOiBzcGxpdCBleHBlY3QgcGF0dGVybnMgcHJvcGVybHkuCisKK1R1ZSBKdW4gMjMgMTE6NDU6MDEgMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvZnVuY2FyZ3MuZXhwOiBzaW1wbGlmeSBleHBlY3Qgc3RyaW5ncyB0byBlYXNlIHBhdHRlcm4KKwltYXRjaCBwcm9jZXNzaW5nIChhbmQgZWxpbWluYXRlIHNwdXJpb3VzIHRpbWVvdXRzIHdoZW4gcnVubmluZykuCisKK0ZyaSBKdW4gMTIgMTc6Mjg6MjIgMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2Uvc2lnbmFscy5leHAgKHRlc3RfaGFuZGxlX2FsbF9wcmludCk6IHB1dCBiYWNrIE1hY2gKKwlleGNlcHRpb24gdGVzdCwgYnV0IGNvbmRpdGlvbmFsaXplIGl0IG9uIHRhcmdldCBbbWFjaCB8IGdudV0uCisKK1dlZCBKdW4gMTAgMTA6NDA6MDMgMTk5OCAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2Uvb3ZlcmxheXMuZXhwOiBmaXh1cCBjb21waWxlIGxpbmUgZm9yIGxpbmtlciBzY3JpcHQuCisKK1RodSBKdW4gIDQgMjE6NTQ6MTUgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUB6b2cuY3lnbnVzLmNvbT4KKworCSogZ2RiLmZvcnRyYW4vdHlwZXMuZXhwOiBkb24ndCBndWVzcyBhdCBmbG9hdCBzaXplLgorCitUaHUgTWF5IDIxIDAyOjI4OjM3IDE5OTggIEZlbGl4IExlZSAgPGZsZWVAem9nLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2V4cHJzLmV4cDogZGVsZXRlIHRlc3QgdGhhdCBkZXBlbmRzIG9uIGludCBzaXplLgorCitTdW4gTWF5IDE3IDE3OjEwOjIyIDE5OTggIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBjb25maWcvc2ltLmV4cDogUmVtb3ZlZCBjaGVja3MgZm9yIHRhcmdldCB0cmlwbGV0cy4KKwkoZ2RiX3RhcmdldF9zaW0pOiBVc2UgZ2RiLHRhcmdldF9zaW1fb3B0aW9ucy4KKworU2F0IE1heSAxNiAyMzo0MzozNSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL3JlcmVhZC5leHA6IE5ldyBmaWxlLgorCSogZ2RiLmJhc2UvcmVyZWFkMS5jOiBOZXcgZmlsZS4KKwkqIGdkYi5iYXNlL3JlcmVhZDIuYzogTmV3IGZpbGUuCisKK1NhdCBNYXkgMTYgMjM6MjI6MDkgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBjb25maWcvc2ltLmV4cDogVXNlICd0YXJnZXQgc2ltIC1zcGFyY2xpdGUnIHdoZW4gcnVubmluZworCVNQQVJDbGl0ZSBwcm9ncmFtcy4KKworU2F0IE1heSAxNiAxODo0ODowOCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9zdHJ1Y3RzMi5leHA6IE5ldyBmaWxlLgorCSogZ2RiLmJhc2Uvc3RydWN0czIuYzogTmV3IGZpbGUuCisKK1dlZCBNYXkgMTMgMTM6MzY6MTQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZ2RiLmFzbS9jb21tb24uaW5jOiBOZXcgZmlsZS4KKwkqIGdkYi5hc20vZDEwdi5pbmM6IE5ldyBmaWxlLgorCSogYXNtLXNvdXJjZS5leHA6IFBhc3MgLUkncyB0byBnYXMgdG8gZmluZCAuaW5jIGZpbGVzLgorCVVwZGF0ZSBsaW5lIG51bWJlcnMgaW4gZXhwZWN0ZWQgb3V0cHV0LgorCSogYXNtc3JjMS5zOiBSZXdyaXRlLgorCSogYXNtc3JjMi5zOiBSZXdyaXRlLgorCSogY29uZmlndXJlLmluOiBDcmVhdGUgYXJjaC5pbmMgc3ltbGluay4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEZWxldGUgYXJjaC5pbmMuCisKK1dlZCBNYXkgIDYgMTA6MzA6NTQgMTk5OCAgSm9obiBNZXR6bGVyICA8am1ldHpsZXJAY3lnbnVzLmNvbT4KKworCSogIGNhbGxmdW5jcy5jICh0X2VudW1fdmFsdWUxKSA6IENsZWFudXAgcmV0dXJuIHZhbHVlIHdhcm5pbmdzCisgCSh0X2VudW1fdmFsdWUyKTogZGl0dG8KKyAJKHRfZW51bV92YWx1ZTMpOiBkaXR0bworIAkobWFpbik6IGRpdHRvCitGcmkgTWF5ICAxIDA5OjMzOjM3IDE5OTggIFBldGVyIFNjaGF1ZXIgIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4KKworCSogZ2RiLmJhc2UvYnJlYWsuZXhwOiAgUmVtb3ZlIHhmYWlsIGZvciBgZGVsZXRpbmcgYWxsIGJyZWFrcG9pbnRzCisJd2hlbiBub25lJyB1bmV4cGVjdGVkIHByb21wdCBjYXNlLCBmaXhlZCBieSBicmVha3BvaW50LmM6ZGVsZXRlX2NvbW1hbmQKKwljaGFuZ2UuCisJVXNlIGdkYl90ZXN0IGluc3RlYWQgb2Ygc2VuZF9nZGIvZ2RiX2V4cGVjdCBzZXF1ZW5jZXMuCisKK1RodSBBcHIgMjMgMTI6NTY6MTkgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIGdkYi5jKysvdmlydGZ1bmMuY2M6IERlY2xhcmUgZXh0ZXJuICJDIiBwcmludGYgdG8gcmV0dXJuIGludCwKKwlub3Qgdm9pZC4KKworVGh1IEFwciAxNiAxMDo1MjozNCAxOTk4ICBKb2huIE1ldHpsZXIgIDxqbWV0emxlckBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9icmFuY2hlcy5jOiBDb2RlIHdpdGggbG90cyBvZiBsb29wcyBhbmQKKyAJc3Vicm91dGluZXMuIFVzZWQgdG8gdGVzdCBnZGJzIGFiaWxpdHkgdG8gc2luZ2xlIHN0ZXAgdGhyb3VnaCBQQworIAljaGFuZ2VzLCBlc3BlY2lhbGx5IHRvIHRlc3QgbWlwcy10ZGVwLmM6bWlwc19uZXh0X3BjCisKK01vbiBBcHIgMTMgMjI6MzI6NTEgMTk5OCBGcmFuayBDaC4gRWlnbGVyIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGdkYi5jKysvdmlydGZ1bmMuY2M6IE1ha2UgZXh0ZXJuICJDIiBwcmludGYgZGVjbGFyYXRpb24gcGFzcworCW1vcmUgcmlnb3JvdXMgRUdDUyBDKysgZXJyb3IgY2hlY2tpbmcuCisKK0ZyaSBBcHIgMTAgMjI6Mzg6MTIgMTk5OCBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKyAgICAgICAgKiBnZGIuYmFzZS9oZWxwLmV4cDogIENsZWFuIHVwIGBoZWxwIHNldCBhcmdzJyBhbmQgYGhlbHAgc2hvdyBhcmdzJworICAgICAgICB0ZXN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICogZ2RiLmJhc2UvaW50ZXJydXB0LmV4cDogIEFkZCAiaSo4Ni0qLXNvbGFyaXMyKiIgeGZhaWwgZm9yIGNhbGxpbmcKKyAgICAgICAgZnVuY3Rpb24gd2hlbiBhc2xlZXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAqIGdkYi5iYXNlL3NpZ25hbHMuZXhwOiAgQWRkICJpKjg2LSotc29sYXJpczIqIiB4ZmFpbHMuIEFkZCBjb21tZW50CisgICAgICAgIGZvciBpKjg2IExpbnV4IGFuZCBTVlI0IHNpZ25hbCBoYW5kbGluZyBwcm9ibGVtcy4gICAgICAgICAgICAgICAgICAKKyAgICAgICAgUmVtb3ZlIGxpbnV4IHhmYWlsIGZvciBgbmV4dCB0byBoYW5kbGVyIGluIHNpZ25hbHNfdGVzdHNfMScsIGZpeGVkIAorICAgICAgICBieSByZWNlbnQgaW5mcnVuLmMgY2hhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIExpbWl0IGJhY2t0cmFjZSB0byAxMCBmcmFtZXMgdG8gYXZvaWQgdGltZW91dCBwcm9ibGVtcyB3aXRoIGluZmluaXRlCisgICAgICAgIHN0YWNrIGJhY2t0cmFjZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFkanVzdCBleHBlY3QgcGF0dGVybiBpbiBgaGFuZGxlIGFsbCBwcmludCcgdGVzdCB0byBtYXRjaCBBcHIgMjggMTk5NworICAgICAgICB0YXJnZXQuW2NoXSBjaGFuZ2UuCisKK1R1ZSBNYXIgMzEgMDA6NDA6MzIgMTk5OCAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGxpYi9nZGIuZXhwKGdkYl90ZXN0KTogU2VuZCBtdWx0aWxpbmUgY29tbWFuZHMgb25lIGF0IGEgdGltZTsgd2FpdAorCWZvciBhIG5ld2xpbmUgZnJvbSBnZGIgYmVmb3JlIGNvbnRpbnVpbmcuCisJKGRlZmF1bHRfZ2RiX2V4aXQpOiBKdXN0IGxvb2sgZm9yIHkgb3Igbi4KKwkoZ2RiX3Rlc3QpOiBEZXRlY3QgYWJub3JtYWwgZXhpdCBmcm9tIEdEQiBydW5uaW5nIG9uIERPUzsgaWYKKwlpdCBkb2VzLCBmYWlsIHRoZSByZXN0cyBvZiB0aGUgdGVzdHMgaW4gdGhlIGZpbGUuCisKK1R1ZSBNYXIgMjQgMjI6NDQ6NTIgMTk5OCAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9jeWdtb24uZXhwOiBOZXcgZmlsZS4KKworTW9uIE1hciAxNiAyMTozOToxMSAxOTk4ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvbGlzdC5leHA6IEZpeCBwcm9ibGVtIHdpdGggImxpc3QgZGVmYXVsdCBsaW5lcyBhcm91bmQKKyAJbWFpbiIgdGVzdCBvbiByZW1vdGUgdGFyZ2V0cy4KKworCSogZ2RiLmJhc2Uvc2NvcGUuZXhwOiBGaXggcHJvYmxlbSB3aXRoIGZpbGVsb2NhbF9ic3MgYmVmb3JlCisJcnVuIHRlc3Qgb24gcmVtb3RlIHRhcmdldHMuCisKK1RodSBNYXIgMTIgMTY6MjM6MDAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZ2RiLmFzbTogTmV3IGRpcmVjdG9yeS4KKwkqIGNvbmZpZ3VyZS5pbjogQ29uZmlndXJlIGl0LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCSogZ2RiLmFzbS97TWFrZWZpbGUuaW4sY29uZmlndXJlLmluLGNvbmZpZ3VyZX06IE5ldyBmaWxlcy4KKwkqIGdkYi5hc20ve2FzbS1zb3VyY2UuZXhwLGFzbXNyYzEucyxhc21zcmMyLnN9OiBOZXcgZmlsZXMuCisKK01vbiBGZWIgMjMgMDg6MjI6NDQgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBjb25maWcvbW4xMDMwMC1ldmFsLmV4cDogTmV3IGZpbGUgdG8gc3VwcG9ydCBNTjEwMzAwIGV2YWwgYm9hcmQuCisKK1dlZCBGZWIgMTggMTY6NDM6NDYgMTk5OCAgTWljaGFlbCBTbnlkZXIgIChtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbSkKKyAKKyAgICAgICAgKiBnZGIuYmFzZS9vdmVybGF5cyAoc2V2ZXJhbCBmaWxlcyk6IE1lcmdlIHRoZSB0d28gb3ZlcmxheQorICAgICAgICBtYW5hZ2VycyBpbnRvIG9uZS4gIENoYW5nZSB2YXJpYWJsZXMgKGZvb3gsIGJhcngsIGJhengsIGdyYnh4KQorICAgICAgICBiYWNrIGludG8gaW50cyBidXQgZm9yY2UgdGhlbSB0byBsb2FkIGluIHRoZWlyIHByb3BlciBzZWN0aW9ucy4KKworVGh1IEZlYiAxMiAxMzo0OTozMCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2QxMHZvdmx5LmMgKEQxMFZUcmFuc2xhdGUpOiBNYXAgSU1BUDAgdG8gbG93IDEyOGsgb2YKKyAJb24tY2hpcCBpbnNuIG1lbW9yeSBhbmQgSU1BUDEgdG8gdXBwZXIgMTI4ay4KKwkoRDEwVkNvcHkpOiBIYW5kbGUgbWVtb3J5IHJlZ2lvbnMgY3Jvc3NpbmcgMTZrIGJvdW5kYXJpZXMuCisJKEQxMFZDb3B5KTogVHJhbnNmZXIgZGF0YSBpbiAzMiBiaXQgY2h1bmtzLgorCitUdWUgRmViIDEwIDE3OjIzOjIyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2Uvb3ZlcmxheXMuYyAobWFpbik6IEV4aXQgbm9ybWFsbHkgd2hlbiByZXN1bHQgaXMKKyAJY29ycmVjdC4KKworCSogZ2RiLmJhc2UvZDEwdi5sZDogVXBkYXRlIExNQXMgdG8gcmVmbGVjdCBjdXJyZW50IGQxMHYgYWRkcmVzcworIAltYXAuICBJbmNsdWRlIHNwYWNlIGZvciBwcmludGYgaW4gLnRleHQgc2VnbWVudC4KKworCSogZ2RiLmJhc2UvZDEwdm92bHkuYyAoRDEwVlRyYW5zbGF0ZSk6IE5ldyBmdW5jdGlvbiwgaGFuZGxlCisgCXVwZGF0ZWQgZDEwdiBtZW1vcnkgVk1BL0xNQSBtYXAuCisJKEQxMFZDb3B5KTogQ2FsbCBEMTBWVHJhbnNsYXRlLgorCQorRnJpIEZlYiAgNiAxNDoxMzoxMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL20zMnJvdmx5LmM6IEZvcmNlIHZhcmlhYmxlIF9ub3ZseXMgaW50byAuZGF0YSBzZWN0aW9uLgorCisJKiBnZGIuYmFzZS9iYXIuYyAoYmFyeCwgYmFyKTogQ2hhbmdlIHZhcmlhYmxlIHRvIHNtYWxsIGFycmF5IHNvCisgCXRoYXQgaXQgd29uJ3QgYmUgcHV0IGludG8gdGhlIC5zZGF0YSAtIHNtYWxsIGRhdGEgLQorIAlzZWN0aW9uLiBVcGRhdGUgcmVmZXJlbmNlLgorCSogZ2RiLmJhc2UvYmF6LmMgKGJhengsIGJheik6IERpdHRvLgorCSogZ2RiLmJhc2UvZm9vLmMgKGZvb3gsIGZvbyk6IERpdHRvLgorCSogZ2RiLmJhc2UvZ3JieC5jIChncmJ4eCwgZ3JieCk6IERpdHRvLgorCisJKiBnZGIuYmFzZS9vdmVybGF5cy5leHA6IEV4cGVjdCB2YXJpYWJsZXMgYmFyeCwgYmF6eCwgZm9veCwgZ3JieHgKKyAJdG8gYmUgYXJyYXlzLgorCQorVGh1IEphbiAyOSAxNDo0ODoxOSAxOTk4ICBNaWNoYWVsIFNueWRlciAgKG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tKQorIAorICAgICAgICAqIGdkYi5iYXNlL292ZXJsYXlzLmV4cDogZml4IHVwIGFuZCBnZXQgd29ya2luZyBhZ2Fpbi4KKyAgICAgICAgQWRkIHRlc3RzIGZvciBiYWNrdHJhY2VzIGZyb20gYW4gb3ZlcmxheSBmdW5jdGlvbi4KKyAKK0ZyaSBKYW4gMjMgMDc6NTI6NDUgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL3dhdGNocG9pbnQuZXhwOiBTZXQgImQxMHYqLSotKiIgY2xlYXJfeGZhaWwgZm9yCisJImNhbGxpbmcgZnVuY3Rpb24gd2l0aCB3YXRjaHBvaW50IGVuYWJsZWQiLgorCitUaHUgSmFuIDIyIDE0OjIzOjI5IDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9icmVhay5leHAgKHRlc3RfbmV4dF93aXRoX3JlY3Vyc2lvbik6IFJlbW92ZQorIAlnZGJfc3VwcHJlc3NfdGVzdHMgZm9yIGQxMHYtKi0qLgorCSogbGliL2dkYi5leHAgKGdkYl9zdXBwcmVzc190ZXN0cyk6IERpc2FibGUgdGhpcyBmdW5jdGlvbgorCXBlbmRpbmcgcmV2aWV3IG9mIHdoZXRoZXIgaXQgaXMgdXNlZnVsIG9yIG5vdC4KKworVHVlIEphbiAyMCAxMzowMjowOSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2Z1bmNhcmdzLmV4cDogSW5jcmVhc2UgdGltZW91dCBmb3Igc2xvdyBUWDM5IGJvYXJkcy4KKworTW9uIEphbiAxOSAwODo1MzowNCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2JyZWFrLmV4cDogSW5jcmVhc2UgdGltZW91dCBmb3Igc2xvdyBUWDM5IGJvYXJkcy4KKwkqIGNvbmZpZy9kdmUuZXhwOiBOZXcgZmlsZSB0byBzdXBwb3J0IERlbnNhbiBib2FyZHMuCisKK01vbiBEZWMgMTUgMjI6Mzg6MDUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9pbnRlcnJ1cHQuZXhwOiBEb2N1bWVudCBwcm9ibGVtIG9mIHNpbXVsYXRvcnMsIHNpZ25hbHMsCisgCXJlYWRzIGFuZCBCU0QuCisKK1dlZCBOb3YgMjYgMjI6Mjk6MTggMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9tb25pdG9yLmV4cDogQmUgYSBiaXQgbGVzcyBwaWNreSBhYm91dCB0aGUgIlJlbW90ZSBkZWJ1Z2dpbmciCisJcmVzcG9uc2UuCisKKwkqIGdkYi5jKysvbWlzYy5leHA6IENhbGwgcnVudG9fbWFpbiBpbnN0ZWFkIG9mIGRvaW50IGl0IG1hbnVhbGx5LgorCitUdWUgTm92IDI1IDEyOjQ2OjM2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvbWlwc19wcm8uZXhwOiBBZGQgIm1pcHM2NCotKi1lbGYiIHhmYWlsIGZvciBiYWNrdHJhY2UKKyAJdGVzdC4KKworCSogZ2RiLmJhc2UvZnVuY2FyZ3MuZXhwOiBRdWVyeSBHREIgZm9yIHRhcmdldF9zaXplb2ZfaW50LAorIAl0YXJnZXRfc2l6ZW9mX2xvbmcgYW5kIHRhcmdldF9iaWdlbmRpYW5fcC4KKwkoc3RydWN0c19ieV92YWx1ZSwgc3RydWN0c19ieV9yZWZlcmVuY2UpOiBDaGVjayB2YWx1ZXMgYWNjb3JkaW5nCisgCXRvIHRhcmdldHMgd29yZCBzaXplIGFuZCBlbmRpYW5lc3MuCisJCitNb24gTm92IDI0IDE2OjM3OjA2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvbGFuZ3MuZXhwOiBGb3IgImNvbnRpbnVlIHRvIGV4aXQiIGlnbm9yZSBhbnkgdHJhaWxpbmcKKyAJb3V0cHV0LgorCitGcmkgT2N0IDE3IDEzOjI0OjQzIDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvZGVmYXVsdC5leHAsIGdkYi5iYXNlL2hlbHAuZXhwLCBnZGIuYmFzZS9zZXRzaG93LmV4cDoKKyAJVXBkYXRlIHRlc3Qgb2Ygc2V0IGFyZ3MgaGVscCB0byBtYXRjaCBzb3VyY2UgY2hhbmdlLgorCitGcmkgU2VwIDI2IDE3OjM2OjIwIDE5OTcgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwZXJuLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL2RlZmF1bHQuZXhwOiBFeHBlY3QgaGVscCBzeXN0ZW0gb3V0cHV0IHRvIGJlIGluCisJYWxwaGFiZXRpY2FsIG9yZGVyLgorCSogZ2RiLmJhc2UvaGVscC5leHA6IERpdHRvLgorCitXZWQgU2VwIDI0IDEzOjA4OjE0IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9zaWduYWxzLmV4cDogQ2hhbmdlICJpKjg2LXBjLWxpbnV4LWdudSIgdG8KKwkiaSo4Ni1wYy1saW51eC1nbnUqIi4KKwkqIGdkYi5iYXNlL2ludGVycnVwdC5leHA6IERpdHRvLgorCSogZ2RiLmJhc2UvY29yZWZpbGUuZXhwOiBEaXR0by4KKworCSogbGliL2dkYi5leHAoZ2RiX2NvbXBpbGUpOiBJZiBpc192eHdvcmtzIHRhcmdldCBmZWF0dXJlIGlzIHNldCwKKyAJZGVmaW5lIHZ4d29ya3Mgd2hlbiBidWlsZGluZyB0aGUgdGVzdGNhc2UuCisKKwkqIGdkYi5iYXNlL3B0eXBlLmV4cDogRml4IHRlc3RuYW1lcyB0byBiZSB1bmlxdWUuCisJKiBnZGIuYmFzZS9yYWRpeC5leHA6IERpdHRvLgorCSogZ2RiLmJhc2UvdGVybS5leHA6IERpdHRvLgorCSogZ2RiLmJhc2Uvd2hhdGlzLmV4cDogRGl0dG8uCisJKiBnZGIuYysrL2NsYXNzZXMuZXhwOiBEaXR0by4KKworVHVlIFNlcCAxNiAyMjoyMTo0OCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvY2FsbGZ1bmNzLmV4cDogRml4IGluZGVudGF0aW9uLgorCisJKiBsaWIvZ2RiLmV4cChnZGJfZXhwZWN0KTogU2V0IHJlbW90ZV9zdXBwcmVzc19mbGFnIGlmCisJc3VwcHJlc3NfZmxhZyBoYXMgYmVlbiBzZXQuCisJKGdkYl9zdGVwX2Zvcl9zdHViKTogQ2hlY2sgZm9yIGdkYix1c2VfYnJlYWtwb2ludF9mb3Jfc3R1YgorCXRhcmdldCBmZWF0dXJlLgorCitNb24gU2VwIDE1IDE1OjQzOjE3IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBnZGIuc3RhYnMvd2VpcmQuZXhwOiBEb24ndCBzdGFydCBnZGIgJ3RpbCBhZnRlciB3ZSd2ZSBjb21waWxlZAorCXRoZSB0ZXN0Y2FzZS4KKworCSogZ2RiLmMrKy9jcGx1c2Z1bmNzLmNjKG1haW4pOiBBZGQgZXh0ZXJuICJDIiBkZWNsYXJhdGlvbiBmb3IKKyAJc2V0X2RlYnVnX3RyYXBzKCkgYW5kIGJyZWFrcG9pbnQoKS4KKwkqIGdkYi5jKysvbWlzYy5jYyAobWFpbik6IERpdHRvLgorCSogZ2RiLmMrKy90ZW1wbGF0ZXMuY2MgKG1haW4pOiBEaXR0by4KKwkqIGdkYi5jKysvdmlydGZ1bmMuY2MgKG1haW4pOiBEaXR0by4KKworRnJpIFNlcCAxMiAxNjo1NjozOCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogbGliL2dkYi5leHAoZ2RiX3N0ZXBfZm9yX3N0dWIpOiBOZXcgZnVuY3Rpb24uCisJKGdkYl9ydW5fY21kKTogTG9vayBmb3IgZ2RiLGRvX3JlbG9hZF9vbl9ydW4gdGFyZ2V0IGZlYXR1cmUtLWlmIGl0CisJZXhpc3RzLCByZWxvYWQgdGhlIGV4ZWN1dGFibGUgYW5kIGRvIGEgImNvbnRpbnVlIiBpbnN0ZWFkIG9mCisJZG9pbmcgYSBqdW1wLgorCShydW50b19tYWluKTogVXNlIGdkYl9zdGVwX2Zvcl9zdHViLgorCQorCSogZ2RiLmJhc2UvYnJlYWsuZXhwOiBVc2UgZ2RiX3N0ZXBfZm9yX3N0dWIuIEFsc28sIHJlbmFtZSBjZXJ0YWluCisgCXRlc3RzIHRvIGhhdmUgdW5pcXVlIG5hbWVzLgorCSogZ2RiLmJhc2UvY2FsbGZ1bmNzLmV4cDogRGl0dG8uCisJKiBnZGIuYmFzZS9jb21tYW5kcy5leHA6IERpdHRvLgorCSogZ2RiLmJhc2UvZGVmYXVsdC5leHA6IERpdHRvLgorCSogZ2RiLmJhc2UvaGVscC5leHA6IERpdHRvLgorCSogZ2RiLmJhc2UvbGlzdC5leHA6IERpdHRvLgorCSogZ2RiLmJhc2Uvb3BhcXVlLmV4cDogRGl0dG8uCisJKiBnZGIuYmFzZS9wcmludGNtZHMuZXhwOiBEaXR0by4gVXNlIGEgbG9vcCB0byBlbWl0IG11bHRpcGxlCisJc2ltaWxhciB0ZXN0cy4KKwkKKwkqIGdkYi5iYXNlL3NldHNob3cuYzogQWRkIHNldF9kZWJ1Z190cmFwcy9icmVha3BvaW50IGNhbGxzLgorCSogZ2RiLmMrKy9jcGx1c2Z1bmNzLmNjOiBEaXR0by4KKwkqIGdkYi5jKysvdmlydGZ1bmMuY2M6IERpdHRvLgorCisJKiBjb25maWcvbW9uaXRvci5leHA6IEtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmlsZSB3ZSBzYXcsIHJhdGhlcgorCXRoYW4gdHJ5aW5nIHRvIGdldCB0aGUgaW5mbyBmcm9tIGdkYi4KKworCSogZ2RiLmZvcnRyYW4vdHlwZXMuZXhwOiBNb3ZlIGNvbW1lbnQgdG8gcHJldmlvdXMgbGluZS4KKworVHVlIFNlcCAgMiAxOTo1NTozNCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3NwYXJjbGV0LmV4cDogRGV0ZWN0IGdyYXR1aXRvdXMgY2hhbmdlIHRvIHNwYXJjbGV0IGdkYgorIAl0YXJnZXQgbW9kZS4KKworTW9uIEp1bCAyOCAxMjoxNDo0NyAxOTk3ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwlGcm9tIEJvYiBNYW5zb246CisJKiBjb25maWcvbW9uaXRvci5leHAgKGdkYl90YXJnZXRfbW9uaXRvcik6IExvb2sgZm9yICJDb25uZWN0ZWQgdG8iCisgCXN0cmluZyBmcm9tIEdEQiB3aGVuIGl0IGNvbm5lY3RzLgorCisJKiBsaWIvZ2RiLmV4cDogTG9vayBmb3IgJFRPT0xfRVhFQ1VUQUJMRS4KKworVGh1IEp1bCAgMyAxNTozNToxMiAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogbGliL2dkYi5leHAoZ2V0X2RlYnVnX2Zvcm1hdCk6IERvbid0IGNhdXNlIHRoZSB0ZXN0c3VpdGUgdG8gZmFpbAorIAlpZiB3ZSBjYW4ndCBnZXQgYSBkZWJ1ZyBmb3JtYXQgZnJvbSBHREIgKHdlIG1heSBiZSB0ZXN0aW5nIGFuCisgCW9sZGVyIEdEQikuIFVzZSBhIDEwIHNlY29uZCB0aW1lb3V0IHdoZW4gY2hlY2tpbmcgZm9yIHRoZSBmb3JtYXQuCisKKwkqIGdkYi5zdGFicy93ZWlyZC5leHA6IEZpeCBxdW90aW5nLgorCisJKiBjb25maWcvc3BhcmNsZXQuZXhwOiBSZW5hbWVkIHNwYXJjbGV0LWxvYWRlci5jIHRvIHN0dWItbG9hZGVyLmMuCisKK01vbiBKdW4gMzAgMTg6MzE6NDMgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9hcm0taWNlLmV4cDogTmV3IGZpbGUuCisKK1N1biBKdW4gMjkgMTY6NDM6MzAgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL292ZXJsYXlzLmV4cDogUHJlbGltaW5hcnkgZml4ZXM7IHRlbXBvcmFyaWx5IGRpc2FibGVkCisgCXVudGlsIGl0IGhhcyBiZWVuIG1vZGlmaWVkIHRvIHdvcmsgd2l0aCB0aGUgbmV3IHRlc3RzdWl0ZS4KKworCSogZ2RiLiovKi5leHA6IEluc3RlYWQgb2YgY2F1c2luZyAxIHVucmVzb2x2ZWQgdGVzdCB3aGVuIHRoZQorIAl0ZXN0Y2FzZSB3b24ndCBjb21waWxlLCBjYXVzZSBhbGwgb2YgdGhlIHRlc3RjYXNlcyBpbiB0aGUgZmlsZSB0bworIAlmYWlsIGluc3RlYWQuCisKKwkqIGxpYi9nZGIuZXhwKGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSk6IE5ldyBwcm9jZWR1cmUuCisJKGdkYl9jbGVhcl9zdXBwcmVzc2VkKTogTmV3IHByb2NlZHVyZS4KKwkoZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHMpOiBPbmx5IGNsZWFyIHN1cHByZXNzX2ZsYWcgaWYKKwlpdCBjb250YWlucyBhIHBvc2l0aXZlIHZhbHVlLgorCitTYXQgSnVuIDI4IDEzOjMxOjExIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBsaWIvZ2RiLmV4cChkZWZhdWx0X2dkYl9zdGFydCk6IFVzZSBnZGJfb3B0cyBob3N0IGZlYXR1cmUuCisKKwkqIGdkYi5jKysvdmlydGZ1bmMuZXhwOiBSZW1vdmUgc2V0dGluZyBvZiBsaWJzIHZhcmlhYmxlLgorCitGcmkgSnVuIDI3IDA3OjQ0OjI1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBsaWIvZ2RiLmV4cCAoc2V0dXBfeGZhaWxfZm9ybWF0KTogTmV3IGZ1bmN0aW9uLgorCShnZXRfZGVidWdfZm9ybWF0KTogTmV3IGZ1bmN0aW9uIHRvIGdldCBkZWJ1ZyBmb3JtYXQuCisJKGRlYnVnX2Zvcm1hdCk6IE5ldyBnbG9iYWwgdmFyaWFibGUgdG8gaG9sZCBsYXN0IHZhbHVlIHNldAorCWJ5IGdldF9kZWJ1Z19mb3JtYXQuCisJKiBnZGIuYmFzZS9saXN0LmV4cDogQ2FsbCBnZXRfZGVidWdfZm9ybWF0IGFuZCBleHBlY3Qgc29tZQorIAl0ZXN0cyB0byBmYWlsIGZvciBEV0FSRiAxIGFuZCBDT0ZGIGZvcm1hdHMuCisJKiBnZGIuYysrL3B0eXBlLmV4cDogRGl0dG8uCisJKiBnZGIuYysrL2NsYXNzZXMuZXhwOiBEaXR0by4KKwkqIGdkYi5jKysvY3BsdXNmdW5jcy5leHA6IERpdHRvLgorCSogZ2RiLmMrKy9pbmhlcml0LmV4cDogRGl0dG8uCisJKiBnZGIuYysrL3RlbXBsYXRlcy5leHA6IERpdHRvLgorCSogZ2RiLmMrKy92aXJ0ZnVuYy5leHA6IERpdHRvLgorCQorV2VkIEp1biAyNSAwOTowODo1MSAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogbGliL2dkYi5leHAoZGVmYXVsdF9nZGJfZXhpdCk6IERvbid0IGdpdmUgYW4gZXJyb3IgaWYgdGhlIHJlbW90ZQorCWhvc3QgZG9lc24ndCBoYXZlIGEgY3VycmVudGx5LW9wZW4gY29ubmVjdGlvbi4KKworCSogY29uZmlnL3NwYXJjbGV0LmV4cDogQ2xlYW51cHMgYW5kIGZpeGVzIHRvIG1ha2UgaXQgZ2VuZXJpYyBmb3IKKyAJYW55IGdkYiBzdHViIHRhcmdldC4gSGFuZGxlIGNhc2VzIHdoZXJlIGdkYiBkb2Vzbid0IHJlc3BvbmQgd2hlbgorIAlpbnRlcnJ1cHRlZCBpbiBhIHNhbmUgZmFzaGlvbi4KKworCSogY29uZmlnL20zMnItc3R1Yi5leHA6IExvYWQgc3BhcmNsZXQuZXhwIGluc3RlYWQgb2YgdHJ5aW5nIHRvIGRvIHRoZQorIAlzYW1lIHRoaW5nIGluIGEgdG90YWxseSBkaWZmZXJlbnQgd2F5LgorCisJKiBjb25maWcvbW9uaXRvci5leHA6IFBhc3MgaW4gdGltZW91dHMgdG8gZ2RiX2V4cGVjdCBpbnN0ZWFkIG9mCisgCXNldHRpbmcgInRpbWVvdXQiLgorCShnZGJfc3RhcnQpOiBXZSBzZXQgdGhlIGdsb2JhbCBnZGJfcHJvbXB0IHZhcmlhYmxlIGluCisgCWRlZmF1bHRfZ2RiX2luaXQgbm93LgorCitTdW4gSnVuIDIyIDA5OjExOjAyIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9wcmludGNtZHMuZXhwOiBGaXggImNoZWNrIGZvciBmbG9hdGluZyBhZGRpdGlvbiIKKwlyZWdleHAgdG8gYWNjZXB0IHJlc3VsdHMgd2l0aGluIGFwcHJveCArLy0gLjAxIG9mIGV4YWN0IHZhbHVlLgorCSogbGliL2dkYi5leHAgKGdkYl90ZXN0KTogUmVtb3ZlIHVudXNlZCBleHBlY3Rfb3V0IGdsb2JhbCBkZWNsLgorCitXZWQgSnVuIDE4IDExOjExOjM5IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBsaWIvZ2RiLmV4cChnZGJfaW5pdCk6IFBhc3Mgb3VyIGFyZ3VtZW50cyB0byBkZWZhdWx0X2dkYl9pbml0CisgCXByb3Blcmx5LgorCShnZGJfZXhwZWN0KTogQWRkIG9wdGlvbmFsIHRpbWVvdXQgcGFyYW1ldGVyLCBhbmQgYWRkIHRpbWVvdXQKKwl2YWx1ZSB0byB2YXJpb3VzIGNhbGxzLgorCShnZGJfc3VwcHJlc3NfdGVzdHMpOiBPbmx5IGdpdmUgb25lIHdhcm5pbmcgbWVzc2FnZSBwZXIgZ3JvdXAuCisKK1R1ZSBKdW4gMTcgMTM6MTA6MTAgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGxpYi9nZGIuZXhwKGdkYl9leHBlY3QpOiBEZWNsYXJlIGVycm9ySW5mbyBhbmQgZXJyb3JDb2RlIGFzCisgCWdsb2JhbCB2YXJpYWJsZXMuIEhhbmRsZSBnZXR0aW5nIGEgdmFsdWUgZm9yICR0aW1lb3V0IG1vcmUKKyAJZ3JhY2VmdWxseS4KKworU2F0IEp1biAxNCAwOToyMzoyNiAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogbGliL2dkYi5leHA6IENsb3NlIGNvbm5lY3Rpb24gdG8gcmVtb3RlIGhvc3QgaWYgZ2RiIGRvZXNuJ3QKKyAJaW5pdGlhbGl6ZS4KKwkoZGVmYXVsdF9nZGJfaW5pdCk6IE5ldyBwcm9jZWR1cmU7IGFsbG93IGdkYl9pbml0IHRvIGJlIG92ZXJyaWRkZW4KKyAJYnkgYSB0YXJnZXQgY29uZmlndXJhdGlvbiBmaWxlLgorCShnZGJfZXhwZWN0KTogUGFzcyB0aGUgdGltZW91dCB0byByZW1vdGVfZXhwZWN0LgorCisJKiBjb25maWcvbW9uaXRvci5leHAoZ2RiX2xvYWQpOiBGaXggdHlwbyBpbiByZWdleHAuCisKK1RodSBKdW4gMTIgMjA6NTc6MTIgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2Z1bmNhcmdzLmV4cDogUmVtb3ZlIHNwdXJpb3VzIHN1cHByZXNzIHRlc3RzIGNhbGwuCisKK1R1ZSBKdW4gIDMgMTU6MjA6MjAgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9tb25pdG9yLmV4cChnZGJfdGFyZ2V0X21vbml0b3IpOiBDYWxsIGdkYl9maWxlX2NtZAorIAloZXJlLiBDYWxsIGdkYl90YXJnZXRfZXhlYyBiZWZvcmUgcmVib290aW5nIHRoZSB0YXJnZXQsIHRvIG1ha2UKKyAJc3VyZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgdGFyZ2V0IGlzIGNsb3NlZC4KKwkoZ2RiX2xvYWQpOiBQYXNzIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIHRvIGdkYl90YXJnZXRfbW9uaXRvci4KKwlEb24ndCBjYWxsIGdkYl9maWxlX2NtZCBoZXJlOyBsZXQgZ2RiX3RhcmdldF9tb25pdG9yIGRvIGl0LgorCUFsc28gZGV0ZWN0ICJUaW1lb3V0IHJlYWRpbmcgZnJvbSByZW1vdGUiIGVycm9yLgorCisJKiBjb25maWcvZ2Ric2VydmVyLmV4cDogUGFzcyB0aGUgZXhlY3V0YWJsZSBiZWluZyBsb2FkZWQgdG8KKyAJZ2RiX3RhcmdldF9tb25pdG9yLiBEb24ndCBjYWxsIGdkYl9maWxlX2NtZCBoZXJlOyBsZXQKKyAJZ2RiX3RhcmdldF9tb25pdG9yIGRvIGl0LgorCisJKiBnZGIuZGlzYXNtL2hwcGEuZXhwOiBEb24ndCB1c2UgZXhlY19vdXRwdXQuCisKK0ZyaSBNYXkgMjMgMTM6Mjg6MjkgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2xpc3QuZXhwOiBJZiB3ZSdyZSBkZWJ1Z2dpbmcgYSBub24tbmF0aXZlIHRhcmdldCwKKwl0cnkgdG8gc2V0IHRoZSBwYyByZWdpc3RlciB0byBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlCisJcHJvZ3JhbSBiZWZvcmUgZG9pbmcgdGhlIGZpcnN0IGxpc3QgY29tbWFuZC4KKworCSogZ2RiLmMrKy92aXJ0ZnVuYy5leHAoZ2RiX3ZpcnRmdW5jX3Jlc3RhcnQpOiBNYWtlIHN1cmUgd2UgcnVuCisgCXRlc3RfY2FsbHMgYWZ0ZXIgcmVzdGFydGluZy4KKworCSogbGliL2dkYi5leHAoZ2RiX3J1bl9jbWQpOiBTZW5kIGp1bXAgY29tbWFuZCBhZ2FpbiBhZnRlcgorIAlyZWxvYWRpbmcuCisKKwkqIGdkYi5iYXNlL3dhdGNocG9pbnQuZXhwOiBGaXggdHlwby4KKworCSogZ2RiLmJhc2Uvc2V0c2hvdy5leHA6IENoZWNrIGZvciB1c2VfZ2RiX3N0dWIuCisKKwkqIGdkYi5iYXNlL2JyZWFrLmV4cDogRml4IGNvbnRpbnVlIHVudGlsIGV4aXQgdGVzdCBmb3IgdGhlIGdkYgorIAlzdHViIGNhc2UuCisJKiBnZGIuYmFzZS9sYW5ncy5leHA6IERpdHRvLgorCisJKiBjb25maWcvbW9uaXRvci5leHAoZ2RiX2xvYWQpOiBIYW5kbGUgZ2RiX3NlY3Rfb2Zmc2V0IGFuZAorIAlnZGJfbG9hZF9vZmZzZXQuIElmIHdlIHdlcmVuJ3QgZ2l2ZW4gYSBmaWxlIHRvIGxvYWQsIGZpZ3VyZSBvdXQKKyAJd2hhdCB0aGUgY3VycmVudCBmaWxlIGlzIGFuZCB1c2UgaXQuCisKKwkqIGNvbmZpZy9pMzg2LWJvem8uZXhwOiBOZXcgZmlsZS4KKworVGh1IE1heSAyMiAxODo1MTozMiAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogbGliL2dkYi5leHAoZ2RiX2V4cGVjdCk6IExvb2sgZm9yIGdkYix0aW1lb3V0IHRhcmdldAorCWZlYXR1cmUuCisKKwkqIGNvbmZpZy9wcm9lbGYuZXhwOiBOZXcgZW50cnkuCisKK1dlZCBNYXkgMjEgMjE6MjM6MTYgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGxpYi9nZGIuZXhwOiBSZW1vdmUgc3B1cmlvdXMgLiogcGF0dGVybnMgYXQgdGhlIGJlZ2lubmluZworCW9mIHJlZ2V4cHMuCisKKwkqIGdkYi5iYXNlL3dhdGNocG9pbnQuZXhwOiBEb24ndCBydW4gdGhlIHRlc3Rfc3RlcHBpbmcKKwl0ZXN0cyBpZiBnZGIgY2FuJ3QgY2FsbCBmdW5jdGlvbnMgb24gdGhlIHRhcmdldC4KKworCSogZ2RiLmJhc2Uvc2V0c2hvdy5leHA6IERvbid0IHJ1biB0aGUgc2V0IHByb21wdCB0ZXN0cyBpZgorCXRoZSBib2FyZCBoYXMgZ2RiX3Byb21wdCBzZXQuCisKK1R1ZSBNYXkgMjAgMDg6NTg6NDkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnZGIuYmFzZS9hMi1ydW4uZXhwOiBDaGFuZ2UgImdkYixub2FyZ3MiIHRvIGp1c3QgIm5vYXJncyIuCisJKiBnZGIuYmFzZS9jb21tYW5kcy5leHA6IExpa2V3aXNlLgorCSogZ2RiLmJhc2Uvc2V0c2hvdy5leHA6IExpa2V3aXNlLgorCitNb24gTWF5IDE5IDE1OjM3OjUwIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBjb25maWcvbW9uaXRvci5leHAoZ2RiX3N0YXJ0KTogTG9vayBmb3IgZ2RiX3Byb21wdCB0YXJnZXQKKwlmZWF0dXJlLgorCisJKiBjb25maWcvaTk2MC5leHA6IE5ldyBmaWxlLgorCitUaHUgTWF5ICAxIDE4OjAxOjUwIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9mdW5jYXJncy5leHA6IENoZWNrIGZvciBnZGIsc2hvcnRfaW50IHRhcmdldAorCWZlYXR1cmUgaW5zdGVhZCBvZiBsb29raW5nIGZvciBleHBsaWNpdCB0YXJnZXQgdHJpcGxldHMuCisKK01vbiBBcHIgMjggMTc6Mjc6NDAgMTk5NyAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvcHJpbnRjbWRzLmV4cDogYWRkIGEgY291cGxlIG1vcmUgdGVzdHMgYSBsYSAKKwkicCAxMjNERUFEQkVFRiIsIHRvIGNoZWNrIHBhcnNlX251bWJlci4KKwkqIHRvcC5jOiBjaGFuZ2UgInRvIGVuYWJsZSB0byBlbmFibGUiIHRvICJ0byBlbmFibGUiIGluIGEgY291cGxlCisJb2YgaGVscCBzdHJpbmdzLgorCitUaHUgQXByIDI0IDE0OjM4OjE4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2RiLmJhc2UvY2FsbGZ1bmNzLmV4cDogTWFyayBzb21lIHRlc3RzIGFzIGV4cGVjdGVkIHRvIGZhaWwKKwlvbiB0aGUgbW4xMDMwMC4KKyAKK01vbiBBcHIgMjEgMTU6MDU6NDIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2EyLXJ1bi5leHA6IEFkZCBhcm0tKi1jb2ZmIHNldHVwX3hmYWlscyBmb3IgY2FzZXMKKwl3aGVyZSB0aGUgdGVzdCBleGVjdXRhYmxlIGlzIHJ1biB3aXRoIGV4cGxpY2l0IGFyZ3MuCisJKiBnZGIuYmFzZS9kZWZhdWx0LmV4cDogSGFuZGxlIGFybS0qLWNvZmYgY2FzZSBmb3IgImluZm8gZmxvYXQiLgorCitNb24gQXByIDIxIDEzOjM4OjU4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9ydW4uYzogVXNlIEZBS0VBUkdWIHRvIGJ1aWxkIHRlc3QgZXhlY3V0YWJsZSB0aGF0CisJZG9lcyBub3QgcmVxdWlyZSBhIGNvbW1hbmQgbGluZSBhcmcsIHNpbmNlIG1vc3Qgc2ltdWxhdG9ycworCWRvbid0IGN1cnJlbnRseSBzdXBwb3J0IHBhc3Npbmcgc3VjaCBhbiBhcmcgaW50byB0aGUgc2ltdWxhdGVkCisJcHJvZ3JhbS4KKwkqIGdkYi5iYXNlL2NvbW1hbmRzLmV4cDogQ2hhbmdlIHRlc3RzIHRvIGluc2VydCB0aGUgcHJvcGVyCisJdmFsdWUgYXMgdGhlIGFyZyB0byB0aGUgZmlyc3QgcmVjdXJzaXZlIGZhY3RvcmlhbCBjYWxsLiAgQ2hhbmdlCisJY29tcGlsYXRpb24gbGluZSB0byBkZWZpbmUgRkFLRUFSR1YgYXQgY29tcGlsZSB0aW1lLgorCitXZWQgQXByICA5IDExOjEyOjM2IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2RiLmJhc2UvcmVjdXJzZS5leHA6IEVuYWJsZSB0aGVzZSB0ZXN0cyBmb3IgdGhlIG1uMTAzMDAuCisJKiBnZGIuYmFzZS93YXRjaHBvaW50LmV4cDogRG9uJ3QgZXhwZWN0IGEgZmFpbHVyZSBmb3IgYW4gImNhbGxpbmcKKwlmdW5jdGlvbiB3aXRoIHdhdGNocG9pbnQgZW5hYmxlZCIgdGVzdC4KKworVHVlIEFwciAgOCAxOTozMzoyMCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2Uvd2F0Y2hwb2ludC5leHAodGVzdF93YXRjaHBvaW50X3RyaWdnZXJlZF9pbl9zeXNjYWxsKToKKyAJRG9uJ3QgY2FsbCBnZGJfdGVzdCB3aGVuIHRoZSBjb21tYW5kIGRvZXNuJ3QgcmV0dXJuIHRvIGEgZ2RiIHByb21wdC4KKworCSogbGliL2dkYi5leHAoZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHMpOiBEb24ndCBwcmludCBncmF0dWl0b3VzCisgCSJUZXN0cyByZXN0YXJ0ZWQiIG1lc3NhZ2VzLgorCitUdWUgQXByICA4IDE2OjM4OjQ2IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2RiLmRpc2FzbS9tbjEwMzAwLmV4cDogRml4IGJ1Z2xldHMgaW4gIm90aGVyIiB0ZXN0cy4KKworVGh1IEFwciAgMyAxNToyMToyNiAxOTk3ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9oZWxwLmV4cDogdXBkYXRlIGhlbHAgbXNnIGZvciBJTkZPIEFERFI7IGFkZCBoZWxwIHRlc3QKKwlmb3IgSU5GTyBTWU1CT0w7IGFkZCBoZWxwIHRlc3RzIGZvciBPVkVSTEFZIGNvbW1hbmRzLgorCSogZ2RiLmJhc2UvZGVmYXVsdC5leHA6IGFkZCB0ZXN0cyBmb3IgSU5GTyBTWU1CT0wgY29tbWFuZDsKKwlhZGQgdGVzdHMgZm9yIE9WRVJMQVkgY29tbWFuZHMKKwkqIGdkYi5iYXNlL292ZXJsYXlzLmMgb3ZlcmxheXMuZXhwIGZvby5jIGJhci5jIGJhei5jIGdyYnguYyBvdmx5bWdyLmgKKwlkMTB2LmxkIG0zMnIubGQgZDEwdm92bHkuYyBtMzJyb3ZseS5jOiBhZGQgdGVzdCBjYXNlIGZvciBvdmVybGF5cy4KKwkqIGdkYi5iYXNlL3NpZ2FsbC5jOiBhZGQgdXNlc3R1YnMgY29kZSBmcmFnCisJKiBnZGIuYmFzZS93YXRjaHBvaW50LmV4cDogdHVybiBvbiBjb21wbGV4IHdhdGNocG9pbnQgdGVzdCBmb3IgTTMyUi4KKwkKK1RodSBBcHIgIDMgMDk6Mzg6NTMgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGxpYi9nZGIuZXhwKGdkYl9zdXBwcmVzc190ZXN0cyk6IEFkZCBleHBsYW5hdGlvbiBmb3Igc3Vic2VxdWVudAorCWZhaWx1cmVzLgorCShnZGJfc3RvcF9zdXBwcmVzc2luZ190ZXN0cyk6IE5vdGUgdGhhdCB0ZXN0cyBoYXZlIHJlc3RhcnRlZC4KKworV2VkIEFwciAgMiAxOTowNDoyMCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2g4MzAwLmV4cDogTmV3IGZpbGUuCisKK1N1biBNYXIgMzAgMTM6Mzg6MjUgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL3NldHNob3cuZXhwOiBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhCisJZmVhdHVyZSwgbm90IGl0cyB2YWx1ZS4KKworU2F0IE1hciAyOSAxMToxOTo0NiAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogZ2RiLmMrKy92aXJ0ZnVuYy5leHA6IFJlc3RhcnQgZ2RiIGluIGEgc2FuZSBmYXNoaW9uLgorCisJKiBnZGIuYmFzZS9zY29wZS5leHA6IEl0J3Mgbm93IGluaXQwKCksIG5vdCBpbml0KCkuCisKKwkqIGdkYi5iYXNlL3Njb3BlMC5jOiBGb3Igbm93LCBjaGFuZ2UgaW5pdCgpIHRvIGJlIGluaXQwKCkuCisKKwkqIGNvbmZpZy9tb25pdG9yLmV4cDogVXNlIGdkYl9zZXJpYWwgaW4gcHJlZmVyZW5jZSB0byBzZXJpYWwKKwlvciBuZXRwb3J0LgorCisJKiBsaWIvZ2RiLmV4cDogU2V0IEdEQiB0byBbdHJhbnNmb3JtIGdkYl0gaWYgd2UncmUgdXNpbmcgYSByZW1vdGUgaG9zdAorIAlhbmQgaXQncyBub3QgYWxyZWFkeSBzZXQuCisKK0ZyaSBNYXIgMjggMTk6NTQ6MTggMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL3NldHNob3cuZXhwOiBPbmx5IHRlc3QgdGhlIHJ1biBjb21tYW5kIGlmIHRoZSB0YXJnZXQKKyAJaXNuJ3QgdXNpbmcgYSBzdHViIGFuZCBpZiBpdCBzdXBwb3J0cyBhcmd1bWVudCBwYXNzaW5nLgorCitTYXQgTWFyIDIyIDE5OjUwOjI1IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBjb25maWcvdWRpLmV4cChnZGJfc3RhcnQpOiBNYWtlIHN1cmUgVURJQ09ORiBpcyBzZXQKKwlwcm9wZXJseSBiZWZvcmUgc3RhcnRpbmcgZ2RiLgorCitNb24gTWFyIDI0IDE0OjQwOjMzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2RiLmRpc2FzbS9tbjEwMzAwLnM6IE5ldyB0ZXN0IGZpbGUgZm9yIG1uMTAzMDAgZGlzYXNzZW1ibGVyLgorCSogZ2RiLmRpc2FzbS9tbjEwMzAwLmV4cDogUnVuIG1uMTAzMDAgZGlzYXNzZW1ibGVyIHRlc3RzLgorCSogZ2RiLmRpc2FzbS9NYWtlZmlsZS5pbjogUmVtb3ZlICJtbjEwMzAwIiB3aGVuIGNsZWFuaW5nLgorCitUdWUgTWFyIDExIDExOjQyOjU4IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBjb25maWcvdnguZXhwOiBVc2UgcmVtb3RlX2xkLCBub3Qgdnh3b3Jrc19sZC4gRG9uJ3QgdXNlCisgCXNwZWNpYWxpemVkIGNvZGUgdG8gcmVib290IHRoZSBib2FyZCwgdXNlIHJlbW90ZV9yZWJvb3QgaW5zdGVhZC4KKworCSogY29uZmlnL3Z4d29ya3MyOWsuZXhwOiBVc2UgdnguZXhwLCBub3QgdngtZ2RiLmV4cC4KKworCSogbGliL2dkYi5leHA6IEFkZCBHREJfVEVTVENBU0VfT1BUSU9OUy4KKworCSogY29uZmlnL21vbml0b3IuZXhwOiBNYWtlIHN1cmUgd2UgZGlzY29ubmVjdCBmcm9tIHRoZSB0YXJnZXQuCisJQWxzbywgdHJ5IGEgcmVib290L3JlbG9hZCBjeWNsZSBpbnN0ZWFkIG9mIGZhaWxpbmcgaWYgdGhlCisJbG9hZCBmYWlscy4KKworRnJpIE1hciAgNyAxMzo0ODozMCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvZGVmYXVsdC5leHA6IERvbid0IHNldCBtYXRjaF9tYXguCisJKiBnZGIuYmFzZS9oZWxwLmV4cDogRGl0dG8uCisJKiBnZGIuYmFzZS9saXN0LmV4cDogRGl0dG8uCisJKiBnZGIuYmFzZS9zaWduYWxzLmV4cDogRGl0dG8uCisKKwkqIGNvbmZpZy9tb25pdG9yLmV4cChnZGJfbG9hZCk6IElmIGdkYix1c2Vfc3RhbmRhcmRfbG9hZCBpcworCXNldCwgdXNlIHJlbW90ZV9sZCB0byBkb3dubG9hZCB0aGUgdGVzdGNhc2UgaW5zdGVhZCBvZgorCXRoZSBHREIgbG9hZGVyLgorCitXZWQgTWFyICA1IDAwOjAwOjQzIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBjb25maWcvdnI1MDAwLmV4cDogTmV3IGZpbGUuCisKKwkqIGNvbmZpZy9tb25pdG9yLmV4cChnZGJfdGFyZ2V0X21vbml0b3IpOiBBZGQgcGF0dGVybiBmb3IKKwkiRW5kaW5nIHJlbW90ZSIgdG8gZGV0ZWN0IGVycm9ycyBpbiBjb25uZWN0aW5nLgorCisJKiBnZGIuYmFzZS9zZXRzaG93LmV4cDogQWRkIC4qIHdpdGhpbiBhdXRvIGxhbmd1YWdlIHRlc3QuCisKKwkqIGxpYi9nZGIuZXhwKGdkYl9ydW5fY21kKTogQWRkIGNoZWNrIGZvciBnZGJfaW5pdF9jb21tYW5kCisJdGFyZ2V0IGZlYXR1cmUuCisKKwkqIGNvbmZpZy9tb25pdG9yLmV4cChnZGJfbG9hZCk6IENoZWNrIGZvciBhIGZhaWx1cmUgd2hlbiBsb2FkaW5nLAorIAlhbmQgcmVib290IHRoZSBib2FyZCBpZiBuZWNlc3NhcnkuCisKKwkqIGdkYi5iYXNlL3NldHZhci5leHAodGVzdF9zZXQpOiBIYW5kbGUgbXVsdGlwbGUgcHJpbnRzIHdpdGhpbgorCWEgc2V0IG9mIHRlc3RzLiBSZW1vdmUgcHJpbnQuKiBmcm9tIHRoZSBwYXR0ZXJucyBiZWluZyBjaGVja2VkLgorCitNb24gTWFyICAzIDExOjU3OjQzIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9hMS1zZWxmdGVzdC5leHA6IFVzZSBzZW5kX2dkYiBjb25zaXN0ZW50bHkuIERvbid0CisJcmVmZXIgdG8gZ2RiX3NwYXduX2lkLgorCisJKiBjb25maWcvbTMyci1zdHViLmV4cDogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gZ2RiX3NwYXduX2lkLCBubworCWxvbmdlciB1c2VkLgorCSogY29uZmlnL3NwYXJjbGV0LmV4cDogRGl0dG8uCisJKiBjb25maWcvc3BhcmNsZXQtb2xkLmV4cDogRGl0dG8uCisJKiBjb25maWcvc2xpdGUuZXhwOiBEaXR0by4KKwkqIGNvbmZpZy9zaW0uZXhwOiBEaXR0by4KKwkqIGdkYi5iYXNlL2Z1bmNhcmdzLmV4cDogRGl0dG8uCisKKwkqIGxpYi9nZGIuZXhwOlJlbW92ZSByZWZlcmVuY2VzIHRvIGdkYl9zcGF3bl9pZC4KKwkoZ2RiX2V4cGVjdCk6IE1vdmUgdG8gcmVtb3RlLmV4cC4KKworRnJpIEZlYiAyOCAyMDo0NzozOSAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL21vbml0b3IuZXhwOiBEZXRlY3QgdGhlICJDb3VsZG4ndCBlc3RhYmxpc2ggY29ubmVjdGlvbiIKKwltZXNzYWdlIGZyb20gR0RCLgorCitUdWUgRmViIDI1IDE0OjA4OjU1IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9iaXRmaWVsZHMuZXhwOiBVc2UgcnVudG8gaW5zdGVhZCBvZiBleHBsaWNpdAorCWdkYl9ydW5fY21kL2dkYl9leHBlY3Qgc2VxdWVuY2VzLgorCisJKiBnZGIuYmFzZS9icmVhay5leHAodGV4dF9uZXh0X3dpdGhfcmVjdXJzaW9uKTogQWRkIG1hdGNoIGZvcgorCWdkYl9leHBlY3QgY2FsbC4KKworCSogY29uZmlnL21vbml0b3IuZXhwKGdkYl90YXJnZXRfbW9uaXRvcik6IENhbGxpbmcgZXhpdCBsb3NlcyBiaWcuCisJV2UgYWxzbyBuZWVkIHRvIGhhbmRsZSB0aGUgIkEgcHJvZ3JhbSBpcyBiZWluZyBkZWJ1Z2dlZCBhbHJlYWR5IgorCXByb21wdCBmcm9tIGdkYi4gVXNlIGdkYl90ZXN0IHRvIHNldCB0aGUgYmF1ZCByYXRlLgorCisJKiBsaWIvZ2RiLmV4cChnZGJfaW5pdCk6IEluY3JlYXNlIHRoZSBkZWZhdWx0IGV4cGVjdCBidWZmZXIgc2l6ZQorCXRvIDIwMDAwLiBSZWFsbHkuIEkgbWVhbiBpdC4KKworTW9uIEZlYiAyNCAxMzoyMzoyNiAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogbGliL2dkYi5leHAoZ2RiX3Rlc3QpOiBHZW5lcmF0ZSBhIEZBSUwgbWVzc2FnZSB3aGVuIHNlbmRfZ2RiCisgCWZhaWxzLiBJZiBzdXBwcmVzc19mbGFnIGlzIHNldCwgc2tpcCBwZXJyb3IgbWVzc2FnZSBhYm91dCBub3QKKyAJYmVpbmcgYWJsZSB0byBzZW5kIHRvIEdEQi4KKwkoc2VuZF9nZGIpOiBJZiBzdXBwcmVzc19mbGFnIGlzIHNldCwgZG9uJ3QgdHJ5IHRvIHNlbmQgY29tbWFuZHMgdG8KKyAJR0RCLgorCShnZGJfZXhwZWN0KTogSWYgc3VwcHJlc3NfZmxhZyBpcyBzZXQsIGFsd2F5cyBmYWlsIGltbWVkaWF0ZWx5LgorCShnZGJfc3VwcHJlc3NfdGVzdHMsIGdkYl9zdG9wX3N1cHByZXNzaW5nX3Rlc3RzKTogTmV3IGZ1bmN0aW9ucy4KKwkoZ2RiX2luaXQpOiBDYWxsIGdkYl9zdG9wX3N1cHByZXNzaW5nX3Rlc3RzLgorCShkZWZhdWx0X2dkYl9leGl0KTogRGl0dG8uCisJKGRlZmF1bHRfZ2RiX3N0YXJ0KTogRGl0dG8uCisKKwkqIGdkYi5iYXNlL2JpdGZpZWxkcy5leHA6IENhbGwgZ2RiX3N1cHByZXNzX3Rlc3RzIGFuZAorIAlnZGJfc3RvcF9zdXBwcmVzc2luZ190ZXN0cyBhcyBhcHByb3ByaWF0ZS4KKwkqIGdkYi5iYXNlL2JyZWFrLmV4cDogRGl0dG8uCisgCSogZ2RiLmJhc2UvY2FsbGZ1bmNzLmV4cDogRGl0dG8uCisJKiBnZGIuYmFzZS9jb21tYW5kcy5leHA6IERpdHRvLgorCSogZ2RiLmJhc2UvZXhwcnMuZXhwOiBEaXR0by4KKyAJKiBnZGIuYmFzZS9mdW5jYXJncy5leHA6IERpdHRvLgorCSogZ2RiLmJhc2UvbGlzdC5leHA6IERpdHRvLgorCSogZ2RiLmJhc2UvcmVjdXJzZS5leHA6IERpdHRvLgorIAkqIGdkYi5iYXNlL3Njb3BlLmV4cDogIERpdHRvLgorCSogZ2RiLmJhc2Uvc3RydWN0cy5leHA6IERpdHRvLgorCSogZ2RiLmMrKy9pbmhlcml0LmV4cDogRGl0dG8uCisKK1N1biBGZWIgMjMgMTk6NTY6MDIgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy92cjQzMDAuZXhwOiBOZXcgZmlsZS4KKworCSogZ2RiLiovKi5leHA6IENhbGwgZ2RiX2V4cGVjdCBpbnN0ZWFkIG9mIGV4cGVjdC4KKwkKKwkqIGxpYi9nZGIuZXhwKGdkYl9leHBlY3QpOiBOZXcgZnVuY3Rpb24uCisKK1RodSBGZWIgMjAgMTM6NTc6MDEgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGxpYi9nZGIuZXhwKGdkYl9pbml0KTogTmV3IGZ1bmN0aW9uLgorCisJKiBnZGIuYmFzZS9zZXR2YXIuZXhwKHRlc3Rfc2V0KTogRG9uJ3QgYm90aGVyIHByaW50aW5nIGEgUEFTUy9GQUlMCisgCWZvciBlYWNoIGluZGl2aWR1YWwgdmFyaWFibGUgc2V0LgorCisJKiBnZGIuYmFzZS9leHBycy5leHAodGVzdF9leHByKTogTWFrZSBzdXJlIGVhY2ggdGVzdCBnZXRzIGEgdW5pcXVlCisJbmFtZS4KKworCSogZ2RiLmJhc2UvaGVscC5leHA6IEZpeCB0aGUgc3ludGF4IG9mIGEgZmV3IGdkYl90ZXN0IGNhbGxzLgorCisJKiBnZGIuYmFzZS9zY29wZS5leHA6IFVzZSBnZGJfdGVzdC4KKworCSogZ2RiLmJhc2UvcHR5cGUuZXhwOiBEb24ndCBjYWxsICJnZGJfZXhpdDsgZ2RiX3N0YXJ0IiBpZiB3ZSdyZQorCWFib3J0aW5nOyB0aGUgdGVzdHN1aXRlIGRyaXZlciB3aWxsIGRvIHRoYXQgZm9yIHVzIChzZWUKKwlnZGJfZmluaXNoKS4gQWxzbywgdXNlIGdkYl90ZXN0IGluIGEgZmV3IG1vcmUgcGxhY2VzLgorCitUaHUgRmViIDIwIDEzOjMyOjI0IDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvaGVscC5leHA6IEZpeCBzeW50YXggb2YgImhlbHAgaW5mbyBhbGwtcmVnaXN0ZXJzIiB0ZXN0LgorCitUaHUgRmViIDIwIDEwOjM0OjIxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2RiLmRpc2FzbS9tbjEwMjAwLnM6IEFkZCAibm9wIiBhZnRlciAibWFpbiIgc28gdGhhdCAibWFpbiIKKwlhbmQgImFkZF90ZXN0cyIgYXJlIG5vdCBhdCB0aGUgc2FtZSBhZGRyZXNzLgorCitGcmkgRmViIDE0IDE4OjQ3OjIzIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9wdHlwZS5leHA6IFVzZSBnZGJfdGVzdC4KKworVGh1IEZlYiAxMyAxNjowOTozNiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdkYi5kaXNhc20vbW4xMDIwMC5zIChtaXNjX3Rlc3RzKTogRml4IHRhcmdldHMgZm9yICJqc3IiIGluc25zLgorCSogZ2RiLmRpc2FzbS9tbjEwMjAwLmV4cCAobWlzY190ZXN0cyk6IFJlbW92ZSBib2d1cyBsaW5lIGFjY2lkZW50YWxseQorCWxlZnQgaW4uICBObyBsb25nZXIgZXhwZWN0IHRoZW0gdG8gZmFpbC4KKworCSogZ2RiLnN0YWJzLyoubXQ7IERlbGV0ZWQsIG5vIGxvbmdlciB1c2VkLgorCSogZ2RiLnN0YWJzL2NvbmZpZ3VyZS5pbjogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gdGFyZ2V0IG1ha2VmaWxlCisJZnJhZ3MuCisJKiBnZGIuc3RhYnMvY29uZmlndXJlOiBSZWJ1aWx0LgorCisJKiBnZGIuZGlzYXNtLyoubXQ6IERlbGV0ZWQsIG5vIGxvbmdlciB1c2VkLgorCSogZ2RiLmRpc2FzbS9jb25maWd1cmUuaW46IFJlbW92ZSByZWZlcmVuY2VzIHRvIHRhcmdldCBtYWtlZmlsZQorCWZyYWdzLiAgVXNlICJzaDMucyIgYXMgdGhlIHVuaXF1ZSBmaWxlbmFtZSBmb3IgdGhpcyBkaXJlY3RvcnkuCisJKiBnZGIuZGlzYXNtL2NvbmZpZ3VyZTogUmVidWlsdC4KKworCSogZ2RiLmRpc2FzbS9tbjEwMjAwLnM6IE5ldyB0ZXN0IGZpbGUgZm9yIG1uMTAyMDAgZGlzYXNzZW1ibGVyLgorCSogZ2RiLmRpc2FzbS9tbjEwMjAwLmV4cDogUnVuIG1uMTAyMDAgZGlzYXNzZW1ibGVyIHRlc3RzLgorCSogZ2RiLmRpc2FzbS9NYWtlZmlsZS5pbjogUmVtb3ZlICJtbjEwMjAwIiB3aGVuIGNsZWFuaW5nLgorCitUdWUgRmViIDExIDE2OjU3OjU4IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBjb25maWcvdWRpLmV4cDogVXNlIG1vbmRmZSxuYW1lIGluc3RlYWQgb2YgcmVtb3RlX2hvc3QuCisKK1R1ZSBGZWIgMTEgMTE6MjI6MzYgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnZGIuYmFzZS93YXRjaHBvaW50LmV4cDogRG9uJ3QgZXhwZWN0IGEgZmFpbHVyZSB3aGVuIGNhbGxpbmcKKwlhIGZ1bmN0aW9uIHdpdGggYSB3YXRjaHBvaW50IGVuYWJsZWQgb24gdGhlIG1uMTAyMDAuCisKKwkqIGdkYi5zdGFicy93ZWlyZC5leHA6IERvbid0IHF1aXQgaWYgIndlaXJkLnMiIGRvZXNuJ3QgZXhpc3QKKwliZWZvcmUgdHJ5aW5nIHRvIGNyZWF0ZSBpdCEKKworTW9uIEZlYiAxMCAxNjo0MDo0NyAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3Z4LmV4cDogVXNlIGhvc3RuYW1lIGluc3RlYWQgb2YgbmV0cG9ydC4KKworCSogY29uZmlnL3Z4d29ya3MuZXhwOiBOZXcgZmlsZS4KKworCSogZ2RiLmJhc2UvYTItcnVuLmV4cDogQ2hhbmdlIHZ4d29ya3MgY2FzZXMgdG8gdXNlIGdkYl9zcGF3bl9pZC4KKworCSogY29uZmlnL21vbml0b3IuZXhwKGdkYl90YXJnZXRfbW9uaXRvcik6IExvb2sgZm9yIGEgcHJvbXB0IGZyb20KKyAJZ2RiIGJlZm9yZSBhc3N1bWluZyBldmVyeXRoaW5nIHdvcmtlZC4gU2VuZCBhIF5DIGlmIGEgdGltZW91dAorCW9jY3Vycy4KKworCSogbGliL2dkYi5leHAoZ2RiX3Rlc3QpOiBDaGVjayB0aGUgcmVzdWx0IG9mIHNlbmRfZ2RiLiBVc2UKKwkkZ2RiX3NwYXduX2lkIGRpcmVjdGx5LgorCShnZGJfcnVuX2NtZCk6IFRyeSBfc3RhcnQgYXMgd2VsbCBhcyBzdGFydC4gVXNlIHRoZSB0YXJnZXQgZmVhdHVyZQorCWdkYixzdGFydF9zeW1ib2wgYXMgdGhlIHN5bWJvbCB0byBzdGFydCBmcm9tIHdoZW4ganVtcGluZy4KKworTW9uIEZlYiAxMCAxMToyNjo1OSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL2V4cHJzLmV4cDogRGVsZXRlIGJvZ3VzL2luY29ycmVjdCAoYW5kIHByb2JhYmx5CisJcmVkdW5kYW50KSB0ZXN0LgorCisJKiBnZGIuYmFzZS9yZWN1cnNlLmV4cDogUmVsYXggZmluYWwgdmFsdWUgdGVzdCBmb3IgJ2InIHNvIHRoYXQKKwlpdCBkb2Vzbid0IGxvc2UgZm9yIDE2Yml0IGludGVnZXIgc3lzdGVtcy4KKworRnJpIEZlYiAgNyAwOTozMToyMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdkYi5mb3J0cmFuL3R5cGVzLmV4cDogSWYgdGhlIHRhcmdldCBkb2Vzbid0IHN1cHBvcnQgImRvdWJsZSIKKwlkYXRhIHR5cGVzLCB0aGVuIGV4cGVjdCAicmVhbCIgdHlwZXMgdG8gb25seSBiZSA0IGJ5dGVzLgorCisJKiBnZGIuYysrL3ZpcnRmdW5jLmV4cDogRXhwZWN0IGZhaWx1cmUgZm9yIHZpcnR1YWwgZnVuY3Rpb24KKwljYWxsIHRlc3RzIGlmIHRoZSB0YXJnZXQgZG9lc24ndCBzdXBwb3J0IGluZmVyaW9yIGZ1bmN0aW9uIGNhbGxzLgorCisJKiBnZGIuYmFzZS9wcmludGNtZHMuZXhwOiBBbGxvdyBtaW5vciBkZXZpYXRpb24gaW4gRlAgdmFsdWVzCisJaW4gcHJpbnRmIHRlc3RzLgorCitUaHUgRmViICA2IDEyOjQ2OjE0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2RiLmJhc2UvaGVscC5leHA6IERpc2FibGUgImhlbHAgc2V0IiwgImhlbHAgc2hvdyIsIGFuZAorCSJoZWxwIHN1cHBvcnQiLiAgU2ltcGxpZnkgcmVnZXhwIGZvciAiaGVscCBzdGFjayIuCisKKwkqIGdkYi5iYXNlL2RlZmF1bHQuZXhwOiBTZXQgbWF0Y2hfbWF4IHRvIDUwMDAgYW5kIHRoZSB0aW1lb3V0CisJdG8gNjAgc2Vjb25kcy4gIFRlbXBvcmFyaWx5IHNldCBtYXRjaF9tYXggdG8gMTUwMDAgYXJvdW5kIHRoZQorCSJpbmZvIGNvcHlpbmciIHRlc3QuCisKKwkqIGdkYi5iYXNlL25vZGVidWcuZXhwOiBEb24ndCB0cnkgdG8gZG8gYW4gaW5mZXJpb3IgZnVuY3Rpb24KKwljYWxsIGlmIHRoZSB0YXJnZXQgZG9lc24ndCBzdXBwb3J0IHRoZW0uCisJKiBnZGIuYmFzZS9wcmludGNtZHMuZXhwOiBMaWtld2lzZS4KKwkqIGdkYi5iYXNlL3NldHZhci5leHA6IExpa2V3aXNlLgorCSogZ2RiLmJhc2Uvc3RydWN0cy5leHA6IExpa2V3aXNlLgorCSogZ2RiLmMrKy90ZW1wbGF0ZXMuZXhwOiBMaWtld2lzZS4KKwkqIGdkYi5iYXNlL3B0eXBlLmV4cDogTGlrZXdpc2UuICBSZW1vdmUgVURJIHNwZWNpZmljIHN0dWZmLgorCisJKiBnZGIuYmFzZS9yZWN1cnNlLmV4cDogRW5hYmxlIGZvciB0aGUgbW4xMDIwMC4KKworCSogY29uZmlndXJlLmluOiBEbyBjb25maWd1cmUgZ2RiLnN0YWJzIGRpcmVjdG9yeSBmb3IgKi0qLWVsZgorCXRhcmdldHMuCisJKiBjb25maWd1cmU6IFJlYnVpbHQuCisKKwkqIGdkYi5iYXNlL2JyZWFrLmV4cDogQ2hlY2sgZm9yIGdkYixub3Jlc3VsdHMgYmVmb3JlIHRlc3RpbmcKKwlleGl0IHN0YXR1cyBhbmQvb3IgcmVzdWx0cyBmcm9tIHRoZSB0YXJnZXQuCisJKiBnZGIuYmFzZS93YXRjaHBvaW50LmV4cCwgZ2RiLmJhc2UvbGFuZ3MuZXhwOiBMaWtld2lzZS4KKwkqIGxpYi9nZGIuZXhwOiBSZW1vdmUgb2xkIChub3cgYm9ndXMpIGluaXRpYWxpemF0aW9uIG9mCisJbm9pbmZlcmlvciwgbm9hcmdzLCBub3Jlc3VsdHMgYW5kIG5vc2lnbmFscy4KKworVHVlIEZlYiAgNCAyMTo1MjoxNyAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3NoLmV4cDogTmV3IGZpbGUuCisKKwkqIGNvbmZpZy9zbGl0ZS5leHA6IFRyeSB0byBjb25uZWN0IG11bHRpcGxlIHRpbWVzIHRvIHRoZSBib2FyZAorCWJlZm9yZSByZWJvb3RpbmcuIE9ubHkgc2VuZCBhICJtb25pdG9yIHJ1biIgaWYgbmVlZF9tb25pdG9yX3J1bgorCWlzIHNldC4KKworCSogZ2RiLmJhc2UvYnJlYWsuZXhwOiBEb24ndCBkbyB0aGUgInN0dWIgY29udGludWUiIHRlc3QgaWYKKwl0aGUgdGFyZ2V0IGhhcyBnZGJfc3R1YiBzZXQuCisKKwkqIGdkYi5iYXNlL2NhbGxmdW5jcy5leHA6IEluY3JlYXNlIHRoZSB0aW1lb3V0LgorCisJKiBnZGIuYmFzZS9pbnRlcnJ1cHQuZXhwOiBEb24ndCBldmVuIHRyeSB0byBjb21waWxlIHRoZSB0ZXN0Y2FzZQorCWlmIHRoZSB0YXJnZXQgaGFzIGdkYixub2luZmVyaW9yaW8gc2V0LgorCisJKiBnZGIuYmFzZS9saXN0LmV4cDogSW5jcmVhc2UgbWF0Y2hfbWF4IHRvIDEwMDAwIGNoYXJhY3RlcnMuCisKKwkqIGdkYi5iYXNlL3NpZ2FsbC5leHA6IENoZWNrIGZvciBnZGIsbm9zaWduYWxzIG9uIHRoZSB0YXJnZXQuCisKKwkqIGdkYi5iYXNlL3dhdGNocG9pbnQuZXhwOiBDaGVjayBmb3IgZ2RiLG5vaW5mZXJpb3JpbyBvbiB0aGUKKwl0YXJnZXQuCisKKwkqIGxpYi9nZGIuZXhwKGdkYl9ydW5fY21kKTogRml4IGZvciB0YXJnZXRzIHRoYXQgdXNlIHN0dWJzLgorCitNb24gRmViICAzIDEyOjA5OjM3IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9hMS1zZWxmdGVzdC5leHA6IE1ha2Ugc3VyZSB3ZSBjYWxsIGdkYl9leGl0IGJlZm9yZQorIAl0cnlpbmcgdG8gZGVsZXRlIHRoZSBjb3B5IG9mIGdkYi4gQ2F0Y2ggdGhlIGZpbGUgZGVsZXRlIHNvIHdlCisgCWRvbid0IGRpZSBpZiB0aGUgZGVsZXRlIGZhaWxzOyBhbHNvLCB0aGUgZmlsZSBzaG91bGQgYmUgY29waWVkIHRvCisgCXRoZSBob3N0LCBub3QgdG8gdGhlIGJ1aWxkLgorCitTdW4gRmViICAyIDAwOjU1OjE0IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBsaWIvZ2RiLmV4cChnZGJfdGVzdCk6IFN1cnJvdW5kIHRoZSByZXN1bHQgcGF0dGVybiB3aXRoCisgCXBhcmVudGhlc2lzIGluIGNhc2UgaXQgY29udGFpbnMgbXVsdGlwbGUgcmVnZXhwcyBzZXBhcmF0ZWQKKwl3aXRoIHwuCisKKwkqIGdkYi5iYXNlL3dhdGNocG9pbnQuZXhwOiBVc2UgZ2RiX3Rlc3QuCisJKiBnZGIuYmFzZS9kZWZhdWx0LmV4cDogRGl0dG8uCisKK1NhdCBGZWIgIDEgMjM6NTE6MDEgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGdkYi4qLyouZXhwOiBSZXBsYWNlICRwcm9tcHQgd2l0aCAkZ2RiX3Byb21wdC4KKwkKKwkqIGdkYi5iYXNlL3Njb3BlLmV4cDogVXNlIGdkYl90ZXN0LgorCSogZ2RiLmMrKy9jbGFzc2VzLmV4cDogRGl0dG8uCisJKiBnZGIuYysrL2luaGVyaXQuZXhwOiBEaXR0by4KKworRnJpIEphbiAzMSAxMzowOToxMiAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvY3Jvc3Nsb2FkLmV4cDogRG9uJ3QgdXNlIGV4ZWN1dGVfYW55d2hlcmUsIHVzZQorCXJlbW90ZV9leGVjIGluc3RlYWQuCisJKiBnZGIuYmFzZS9jb3JlZmlsZS5leHA6IERvbid0IGJlIHJpZGljdWxvdXMuCisJKiBnZGIuYmFzZS8qLmM6IEFkZCBtaXNzaW5nIHN0dWIgaW52b2NhdGlvbnMuCisKK1RodSBKYW4gMzAgMTY6NDk6MjUgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9zbGl0ZS5leHA6IE1pc2NlbGxhbmVvdXMgZml4ZXMuCisKKwkqIGxpYi9nZGIuZXhwOiBGaXggcnVudG8uCisKKwkqIGdkYi5iYXNlL3NpZ25hbHMuZXhwOiBDaGVjayBmb3IgYSBnZGIsbm9zaWduYWxzIGZlYXR1cmUgb2YKKwl0aGUgdGFyZ2V0LgorCisJKiBnZGIuYmFzZS93YXRjaHBvaW50LmV4cDogRml4IHJlZ2V4cC4KKworCSogbGliL2dkYi5leHAoZGVmYXVsdF9nZGJfZXhpdCk6IEFkZCBhIGNhdGNoIHRvIHRoZQorCWNsb3NlIGFuZCB3YWl0IGNvbW1hbmRzLCBhcyB0aGUgZGVzY3JpcHRvciBtYXkgbm93IGJlCisJaW52YWxpZC4gQWx3YXlzIGNhbGwgInJlbW90ZV9jbG9zZSBob3N0Ii4KKworVHVlIEphbiAyOCAxNDo0MjozMSAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSAgIE1ham9yIHJld3JpdGUgZm9yIHRlc3RzdWl0ZSByZXZpc2lvbi4KKwkKKwkqIGxpYi9nZGIuZXhwOiBSZW1vdmUgcmVmZXJlbmNlcyB0byBnbG9iYWwgQ0MsIENYWCwgQl9PUFRJT05TLAorCVRBUkdFVF9JTkNMVURFUywgTERGTEFHUyBhbmQgdGFyZ2V0X2FsaWFzLiBVc2UgZ2RiX3NwYXduX2lkCisJaW5zdGVhZCBvZiByZWx5aW5nIG9uIHNwYXduX2lkIHRvIGFsd2F5cyBjb250YWluIGEgdmFsaWQKKwlzcGF3biBpZC4KKwkoZ2V0X2NvbXBpbGVyX2luZm8pOiBOZXcgcHJvY2VkdXJlIHRvIGJ1aWxkIHRoZSAke2JpbmZpbGV9LmNpCisJZmlsZSwgaW5zdGVhZCBvZiByZXBsaWNhdGluZyB0aGlzIGluIE4gZGlmZmVyZW50IHBsYWNlcy4KKwkoZ2RiX2NvbXBpbGUpOiBOZXcgcHJvY2VkdXJlLgorCQorCWdkYi4qLyouZXhwOiBVc2UgZ2RiX2NvbXBpbGUgYW5kIGdldF9jb21waWxlcl9pbmZvICh3aXRoCisgCWFwcHJvcHJpYXRlIGFyZ3VtZW50cykgaW5zdGVhZCBvZiBjb21waWxlLiBVc2UgZ2RiX3Rlc3QgaW4gYSBsb3QKKyAJbW9yZSBwbGFjZXMuICBVc2Ugc2VuZF9nZGIgaW5zdGVhZCBvZiBzZW5kLiBBbHdheXMgcnVuIGdkYl9zdGFydAorCWF0IHRoZSBzdGFydCBvZiBhIHRlc3RjYXNlLCBhcyB0aGlzIGlzIG5vIGxvbmdlciBkb25lIG1hZ2ljYWxseS4KKworCWNvbmZpZy8qLWdkYi5leHA6IFJlbmFtZSB3aXRob3V0IHRoZSAtZ2RiIHN1ZmZpeC4KKworCWNvbmZpZy9taXBzLmV4cDogVXNlIHJlbW90ZV9jbG9zZSBpbnN0ZWFkIG9mIGV4aXRfcmVtb3RlX3NoZWxsLgorCWNvbmZpZy9tb25pdG9yLmV4cDogVXNlIHRhcmdldF9pbmZvIGluc3RlYWQgb2YgbG9va2luZyBhdAorCWJhdWQsIHRpbWVvdXQsIGV0Yy4KKwljb25maWcvc2ltLmV4cDogVXNlIGdkYl9zcGF3bl9pZCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gc3Bhd25faWQuCisKK1NhdCBEZWMgMTQgMDA6NDM6NTcgMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBnZGIuYysrL3RlbXBsYXRlcy5leHAgKHRlc3RfcHR5cGVfb2ZfdGVtcGxhdGVzKSwKKwlnZGIuYysrL2luaGVyaXQuZXhwICh0ZXN0X3B0eXBlX3NpLCB0ZXN0X3ByaW50X2Fub25fdW5pb24pOgorCVVwZGF0ZSBleHBlY3QgcGF0dGVybnMgZm9yIGRlc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9ycworCXRvIG1hdGNoIGNvcnJlc3BvbmRpbmcgYy10eXBlcHJpbnQuYyBjaGFuZ2VzLgorCSogZ2RiLmMrKy90ZW1wbGF0ZXMuZXhwICh0ZXN0X3RlbXBsYXRlX2JyZWFrcG9pbnRzKTogIFJldmVydCBjaGFuZ2UKKwl0byBkZXN0cnVjdG9yIGJyZWFrcG9pbnQgdGVzdCwgR0RCIHNob3VsZCBiZSBhYmxlIHRvIHNldCB0aGUKKwlkZXN0cnVjdG9yIGJyZWFrcG9pbnQgd2l0aG91dCBzcGVjaWZ5aW5nIGFyZ3VtZW50cy4KKworVHVlIERlYyAgMyAyMDoxNzo1MiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiLnRocmVhZHMvcHRocmVhZHMuZXhwOiBDaGFuZ2UgcmVzdWx0IGZvciBmYWlsdXJlIHRvIGNvbXBpbGUgZHVlCisJdG8gbGFjayBvZiBwdGhyZWFkcyBydW50aW1lIHN1cHBvcnQgZnJvbSBhbiBlcnJvciB0byBzaW1wbHkgYW4KKwl1bnN1cHBvcnRlZCB0ZXN0LCBwZXIgZGVqYWdudSBzdGFuZGFyZHMuCisKK1N1biBEZWMgIDEgMDA6MTg6NTkgMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBsaWIvZ2RiLmV4cCAoZ2RiX3Rlc3QpOiAgU2ltcGxpZnkgZXhwZWN0IHBhdHRlcm4gZm9yIHRoZSBjYXNlCisJd2hlcmUgR0RCIGV4aXRzIHRvIHJlZHVjZSBwYXR0ZXJuIG1hdGNoIHRpbWUuCisJKHNraXBfY2hpbGxfdGVzdHMpOiAgU2tpcCBjaGlsbCB0ZXN0cyBmb3IgbWlwcyotc2dpLWlyaXg2Ki4KKworCSogZ2RiLmJhc2Uvbm9kZWJ1Zy5leHA6ICBBZGQgbWlwcyotc2dpLWlyaXg2KiB4ZmFpbHMuCisKK1R1ZSBOb3YgMjYgMTg6Mjk6MjMgMTk5NiAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvY2FsbGZ1bmNzLmV4cDogVHVybiBvbiBmdW5jdGlvbiBjYWxsIHRlc3RzIGZvciBoODMwMC4KKwkqIGdkYi5iYXNlL2RlZmF1bHQuZXhwOiAgIGRpdHRvLgorCSogZ2RiLmJhc2Uvbm9kZWJ1Zy5leHA6ICAgZGl0dG8uCisJKiBnZGIuYmFzZS9wcmludGNtZHMuZXhwOiBkaXR0by4KKwkqIGdkYi5iYXNlL3B0eXBlLmV4cDogICAgIGRpdHRvLgorCSogZ2RiLmJhc2Uvc2V0dmFyLmV4cDogICAgZGl0dG8uCisJKiBnZGIuYmFzZS9zdHJ1Y3RzLmV4cDogICBkaXR0by4KKwkqIGdkYi5iYXNlL3NldHNob3cuYzogICAgIEd1YXJkIGFnYWluc3QgdW5pbml0aWFsaXplZCB2YWx1ZXMgb2YgYXJnYy4KKworVHVlIE5vdiAyNiAxNzoyMzoyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZSwgKi9jb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLgorCitTYXQgTm92IDIzIDEzOjMyOjE1IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9hMS1zZWxmdGVzdC5leHA6IENoYW5nZSB4ODYgbGludXggc2V0dXBfeGZhaWxzIHRvCisJdXNlIG5ldyBpKjg2LXBjLWxpbnV4Ki1nbnUgcXVhZHMuCisJKiBnZGIuYmFzZS9jb3JlZmlsZS5leHA6IERpdHRvLgorCSogZ2RiLmJhc2Uvc2lnbmFscy5leHA6IERpdHRvLgorCSogZ2RiLmJhc2Uvc2lnYWxsLmV4cDogRGl0dG8uCisJKiBnZGIuYmFzZS9pbnRlcnJ1cHQuZXhwOiBEaXR0by4KKworCSogZ2RiLmJhc2Uvc2lnbmFscy5leHAgKHNpZ25hbF90ZXN0c18xKTogUmVtb3ZlIHNldHVwX3hmYWlsCisJImkqODYtKi1saW51eCIgZm9yICJzaWduYWwgU0lHVVNSMSIuICBOb3cgd29ya3MsIGF0IGxlYXN0IHdpdGgKKwlSZWRIYXQgNC4wLgorCQorCSogZ2RiLnRocmVhZHMvcHRocmVhZHMuYyAoX01JVF9QT1NJWF9USFJFQURTKTogRGVmaW5lIGlmIHRhcmdldCBpcworIAlsaW51eC4gIFRoaXMgYWxsb3dzIHRoZSB0ZXN0IGNhc2UgdG8gYXQgbGVhc3QgY29tcGlsZSBvbiBsYXRlc3QKKyAJbGludXgsIGJ1dCBzdGlsbCBub3QgcnVuIGR1ZSB0byBtaXNzaW5nIHRoZSB0aHJlYWRzIHJ1bnRpbWUgbGlicmFyeS4KKworRnJpIE5vdiAyMiAxMDoxMzoyOSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi5iYXNlL2ExLXNlbGZ0ZXN0LmV4cCAoZG9fc3RlcHNfYW5kX25leHRzKTogIFJlaW5pdGlhbGl6ZSBzb3VyY2UKKwlkaXJlY3RvcnkgdG8gc2VhcmNoIGdkYiBkaXJlY3RvcnkuIEFjY2VwdCBhbmQgc3RlcCBvdmVyIGNvbmRpdGlvbmFsCisJc3RhY2sgYWxpZ25tZW50IGNvZGUuIENvbnN1bWUgJHByb21wdCBpbiBmYWlsdXJlIGNhc2VzLgorCVJlc2V0IHRpbWVvdXQgdG8gJG9sZHRpbWVvdXQgaW5zdGVhZCBvZiBzb21lIGFyYml0cmFyeSB2YWx1ZS4KKwkqIGdkYi5iYXNlL25vZGVidWcuZXhwOiAgTGltaXQgYmFja3RyYWNlIHRvIDEwIGZyYW1lcyB0byBhdm9pZAorCXRpbWVvdXQgcHJvYmxlbXMgd2l0aCBpbmZpbml0ZSBzdGFjayBiYWNrdHJhY2VzLgorCSogZ2RiLmJhc2UvcHR5cGUuZXhwIChwdHlwZSBzdHJ1Y3QgbGluaywgdW5pb24gdHVfbGluayk6CisJQWNjZXB0IGZ1bmN0aW9uIHBhcmFtZXRlcnMgZm9yIGxpbmtmdW5jIG1lbWJlci4KKworVGh1IE5vdiAyMSAwOToxNzoxOSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogbGliL2dkYi5leHAgKENGTEFHUyk6IFJlbW92ZSwgdW5yZWZlcmVuY2VkLgorCShDWFhGTEFHUyk6IFJlbW92ZSwgdW5yZWZlcmVuY2VkLgorCShCX09QVElPTlMpOiBBZGQgZm9yIC1CIG9wdGlvbnMgYW5kIGFkZCBjb2RlIHRvIGluaXRpYWxpemUgd2l0aAorIAlwcmV2aW91cyAtQiBvcHRpb25zIGFuZCBhbHNvIGFkZCAtQiBvcHRpb24gdG8gcGljayB1cCBjcm9zcyBjb21waWxlZAorIAlydW50aW1lLgorCShUQVJHRVRfSU5DTFVERVMpOiBBZGQgZm9yIC1JIG9wdGlvbnMgYW5kIGFkZCBjb2RlIHRvIGluaXRpYWxpemUgd2hlbgorCWRvaW5nIGNyb3NzIGNvbXBpbGVzLgorCSh0YXJnZXRfYWxpYXMpOiBEZWNsYXJlIGdsb2JhbC4KKwkoeGdjYyk6IFNldCB2YXJpYWJsZSB0byBmdWxsIHBhdGggb2YgZ2NjIGluIGJ1aWxkIHRyZWUuICBVc2UgZmluZGZpbGUKKwl0byB2ZXJpZnkgdGhhdCBnY2MgZXhpc3RzIGluIGJ1aWxkIHRyZWUsIGFuZCBpZiBzbyBzZXQgQ0MgdG8gdGhhdAorCWdjYyBhbmQgdG8gdXNlIEJfT1BUSU9OUyBhbmQgVEFSR0VUX0lOQ0xVREVTLgorCQorVHVlIE5vdiAxMiAxNjoyMDoxMyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiLmMrKy9pbmhlcml0LmV4cCAodGVzdF9wcmludF9hbm9uX3VuaW9uKTogUmVlbmFibGUKKwlwdHlwZSB0ZXN0IGZvciBhbm9ueW1vdXMgdW5pb24uICBGaXh1cCB0ZXN0Y2FzZSB0byBtYXRjaAorCWN1cnJlbnQgZ2NjIGRlYnVnIG91dHB1dC4KKworTW9uIE5vdiAxMSAxNDoxMjowNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL2Z1bmNhcmdzLmM6IFVzZSBjYXN0IHJhdGhlciB0aGFuICJVTCIgc3VmZml4IHRvCisJZm9yY2UgYXJndW1lbnQgdG8gYW4gdW5zaWduZWQgbG9uZyB0eXBlLgorCitNb24gTm92IDExIDEwOjI3OjU1IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYysrL2luaGVyaXQuZXhwICh0ZXN0X3B0eXBlX3NpKTogRml4IHRhZ2xlc3Mgc3RydWN0IHB0eXBlCisgCXRlc3RzIGFuZCBhbm9ueW1vdXMgdW5pb24gcHJpbnQvcHR5cGUgdGVzdHMuCisJKiBnZGIuYmFzZS9saXN0LmV4cCAodGVzdF9mb3J3YXJkLXNlYXJjaCk6IEluY3JlYXNlIHRpbWVvdXQgYnkKKwk1IG1pbnV0ZXMgZm9yIHRoZSAic2VhcmNoIGV4dHJlbWVseSBsb25nIGxpbmUiIGNhc2UuCisJKiBsaWIvZ2RiLmV4cCAoZ2RiX3Rlc3QpOiBEb2N1bWVudCB0aGF0IHRoZSB0aGlyZCBhcmcgdG8gZ2RiX3Rlc3QgaXMKKwljb21wbGV0ZWx5IG9wdGlvbmFsIGFuZCB0aGF0IHRoZSBwYXNzL2ZhaWwgbWVzc2FnZXMgdXNlIHRoZSBjb21tYW5kIGFzCisJdGhlIG1lc3NhZ2UgaWYgdGhhdCB0aGlyZCBhcmcgaXMgYSBudWxsIHN0cmluZy4KKwkoZ2RiX3Rlc3RfZXhhY3QpOiAgQXJyYW5nZSB0aGF0IGEgbnVsbCBzdHJpbmcgcGF0dGVybiBtZWFucyBtYXRjaCBhCisJbnVsbCBzdHJpbmcgb3V0cHV0IHJhdGhlciB0aGFuIGFueSBvdXRwdXQsIHdoaWNoIG1pZ2h0IGluY2x1ZGUgcmFuZG9tCisgCWVycm9ycy4KKwkqIGdkYi5iYXNlL21pcHNfcHJvLmV4cDogQWRkICJtaXBzKi1zZ2ktaXJpeDQqIiB4ZmFpbCBmb3IKKwliYWNrdHJhY2UgdGVzdC4KKwkqIGdkYi5jKysvZGVtYW5nbGUuZXhwOiBBZGQgYSAiKi0qLSoiIHhmYWlsIGZvciB0ZXN0IHRoYXQgd2FzCisJYWx3YXlzIGZhaWxpbmcgYW5kIGZhaWx1cmUgaXMgbm93IGV4cG9zZWQgYnkgZ2RiLmV4cCBjaGFuZ2VzLgorCitTYXQgTm92ICA5IDExOjEzOjI0IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYysrL2luaGVyaXQuZXhwICh0ZXN0X3B0eXBlX3ZpKTogTG9nIHNvbWUgcGFzc2VzIHRoYXQKKwl3ZXJlbid0IGJlaW5nIG5vdGVkLgorCitTYXQgTm92ICA5IDAxOjA1OjEwIDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLmJhc2UvY29yZWZpbGUuZXhwOiAgQ29uc3VtZSAkcHJvbXB0IGluIG1tYXAgZmFpbCBjYXNlcy4KKwkqIGdkYi5zdGFicy93ZWlyZC5leHA6ICBSZW1vdmUgdl9jb21iIHhmYWlscy4KKworVHVlIE5vdiAgNSAxMDo0NDoyMyAxOTk2ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9bYml0ZmllbGRzLmV4cCBjcm9zc2xvYWQuZXhwIGZ1bmNhcmdzLmV4cCBpbnRlcnJ1cHQuZXhwCisJICAgICAgICAgICAgbGlzdC5leHAgc2NvcGUuZXhwIHdhdGNocG9pbnQuZXhwXQorCSAgTWFrZSBhbGwgdGltZW91dCBlcnJvciBtc2dzIGV4cGxpY2l0bHkgc2F5ICIodGltZW91dCkiLgorCQorTW9uIE5vdiAgNCAxMjowMzowNiAxOTk2ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBjb25maWcvbW9uaXRvci5leHA6IEluY3JlYXNlIGRvd25sb2FkIHRpbWVvdXQgdG8gMTAwMCBzZWNvbmRzLgorCitNb24gTm92ICA0IDEyOjAyOjI2IDE5OTYgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9tMzJyLmV4cDogSW5jcmVhc2UgdGltZW91dCB0byAxMjAgc2Vjb25kcy4KKworU3VuIE5vdiAgMyAxNDozNzowNSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiLmMrKy9jbGFzc2VzLmV4cDogTW9kaWZ5IHRvIGhhbmRsZSBjdXJyZW50IGdjYyBDKysgbWVtYmVyIG9yZGVyaW5nCisJYW5kIGFjY2VwdCBvbGRlciBvcmRlcmluZyBhcyBvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiLgorCSogZ2RiLmMrKy90ZW1wbGF0ZXMuZXhwOiBEaXR0by4KKwkqIGdkYi5jKysvdmlydGZ1bmMuZXhwOiBEaXR0by4KKworRnJpIE5vdiAgMSAxMTo1NjowOSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvY29yZW1ha2VyLmM6IEFkZCBjb2RlIHRvIG1tYXAgc29tZSBkYXRhIHNvIHdlCisJY2FuIGNoZWNrIHRoYXQgaXQgZW5kcyB1cCBpbiB0aGUgY29yZSBmaWxlLgorCSogZ2RiLmJhc2UvY29yZWZpbGUuZXhwOiBBZGQgdGVzdCB0byByZWFkIG1tYXBwZWQgZGF0YQorCWZyb20gY29yZSBmaWxlLgorCitXZWQgT2N0IDMwIDE4OjE5OjE2IDE5OTYgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy9tMzJyLmV4cDogTmV3IGZpbGUuCisKK01vbiBPY3QgMjEgMTQ6NDA6NTAgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogdGVzdHN1aXRlL2dkYi5iYXNlL25vZGVidWcuZXhwOiAgV2hhY2sgb3V0IC1nIG9wdGlvbnMgYnkgaGFuZCBzbworCXRoYXQgY2ZsYWdzIGNhbiBjb250YWlucyAtZ3N0YWJzLCBhbmQgd29yayBjb3JyZWN0bHkgZm9yIG90aGVyIHRlc3RzLgorCitNb24gT2N0IDIxIDE0OjAwOjM3IDE5OTYgIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL3NldHNob3cuZXhwOiBOZXcgZmlsZSwgdGVzdHMgc2hvdyBhbmQgc2V0LgorCSogZ2RiLmJhc2Uvc2V0c2hvdy5jOiAgIE5ldyBmaWxlLCB0ZXN0cyBzaG93IGFuZCBzZXQuCisJKiBnZGIuYmFzZS9oZWxwLmV4cDogQWRkIHRlc3QgZm9yIGhlbHAgc2V0fHNob3cgYW5ub3RhdGUuCisJKiBnZGIuYmFzZS9kZWZhdWx0LmV4cDogQWRkIHRlc3QgZm9yIHNldHxzaG93IGFubm90YXRlLgorCitXZWQgT2N0IDE2IDE5OjAzOjU0IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIHRlc3RzdWl0ZS9nZGIuYmFzZS9icmVhay5leHA6ICBNYWtlIGJhY2t0cmFjZSBmcm9tIGZhY3RvcmlhbAorCWVycm9ycyB1bmlxdWUuCisJKiB0ZXN0c3VpdGUvZ2RiLmJhc2Uvbm9kZWJ1Zy5leHA6ICBXaGFjayBvdXQgYWxsIC1nIG9wdGlvbnMKKwlleHBsaWNpdGx5LgorCitUdWUgT2N0IDE1IDE2OjQ1OjAyIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9zaW0tZ2RiLmV4cCAoZ2RiX3RhcmdldF9zaW0pOiAgUmVtb3ZlIHNldHRpbmcgb2YgaGVpZ2h0CisJYW5kIHdpZHRoIGNvbW1hbmRzLiAgVGhpcyBpcyBkb25lIGVsc2V3aGVyZS4KKwkqIChnZGJfc3RhcnQpOiAgRG9uJ3QgY2FsbCBnZGJfc3RhcnRfc2ltIGhlcmUuICBUaGF0J3MgYWxyZWFkeQorCWRvbmUgaW4gZ2RiX2xvYWQuICBUaGlzIGZpeGVzIGxvdHMgb2YgZmFpbHVyZXMgaW4gZGVmYXVsdC5leHAuCisKK1N1biBPY3QgMTMgMTA6NDA6MjMgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwlGcm9tIFBldGVyIFNjaGF1ZXIgPFBldGVyLlNjaGF1ZXJAUmVnZW50LkUtVGVjaG5pay5UVS1NdWVuY2hlbi5ERT46CisJKiBnZGIuYmFzZS9taXBzX3Byby5leHA6IEZpeCBtaXNwbGFjZWQgZ2RiX2V4aXQvZ2RiX3N0YXJ0L2dkYl9sb2FkLgorCSogbGliL2dkYi5leHAgKGdkYl90ZXN0KTogVHJlYXQgZmFpbHVyZXMgZHVlIHRvIHByb2dyYW0gZXhpdGluZworCWluIHRoZSBzYW1lIHdlIHdlIHRyZWF0IG90aGVyIGZhaWx1cmVzIChzaW5jZSBpdCBtYXkgYmUgYW4gZXhwZWN0ZWQKKyAJY29uZGl0aW9uKSwgcmF0aGVyIHRoYW4gYXMgYW4gZXJyb3IuCisJKiBnZGIuYmFzZS9zaWduYWxzLmV4cCAodGVzdF9oYW5kbGVfYWxsX3ByaW50KTogUmV2ZXJ0IGJhY2sgdG8KKwlvbGQgdGVzdCBmb3JtYXQuCisKK0ZyaSBPY3QgMTEgMTc6MDU6MjIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChjbGVhbiBtb3N0bHljbGVhbik6IEFsc28gcmVtb3ZlIGNoaWxsICouZ3J0IGZpbGVzLgorCShkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4pOiBObyBuZWVkIHRvIHJlbW92ZSBmaWxlcworIAl0d2ljZS4gIE51a2UgdGhlIGR1cGxpY2F0ZXMuCisJKiBnZGIuYmFzZS9NYWtlZmlsZS5pbiAoRVhFQ1VUQUJMRVMpOiBBZGQgInN0cnVjdHMiLgorCSogZ2RiLnRocmVhZHMvTWFrZWZpbGUuaW4gKGRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbik6IAorCVJlbW92ZSBjb25maWcuaCBhbG9uZyB3aXRoIG90aGVyIGNvbmZpZyBmaWxlcy4KKworTW9uIFNlcCAzMCAyMDoxNjoyMiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvaW50ZXJydXB0LmV4cDogQWRkIGkqODYtKi1saW51eCogc2V0dXBfeGZhaWwgZm9yCisJInAgZnVuYzEgKCkiIGFuZCBub3RlIHRoYXQgcmVzdHMgb2YgdGVzdHMgYXJlIHNraXBwZWQuCisJKiBnZGIuYmFzZS9jb3JlZmlsZS5leHA6IEFkZCBpKjg2LSotbGludXgqIGFuZCBtNjgqLSotaHB1eCoKKyAJc2V0dXBfeGZhaWxzIGZvciAicHJpbnQgZnVuYzI6OmNvcmVtYWtlcl9sb2NhbCIuCisJQWRkIGkqODYtKi1saW51eCogc2V0dXBfeGZhaWwgZm9yICJiYWNrdHJhY2UgaW4gY29yZWZpbGUuZXhwIi4KKwkqIGdkYi5iYXNlL21pcHNfcHJvLmV4cDogUmVzdGFydCBnZGIgaW4gdGhpcyB0ZXN0IHNvIGl0IGlzbid0CisJYWZmZWN0ZWQgYnkgdGhlIHByZXZpb3VzIHJ1biB0ZXN0LgorCSogZ2RiLmNoaWxsL21pc2MuZXhwOiBBZGQgbTY4Ki0qLWhwdXgqIHNldHVwX3hmYWlscyBmb3IKKwkicHJpbnQgYXJyYXkgKCkgdWJ5dGUgKGZvbykiIGFuZCAicHJpbnQveCBhcnJheSAoKSBieXRlIChcJGkpIgorCSogZ2RiLmNoaWxsL3ByLTg3NDIuZXhwOiBBZGQgbTY4Ki0qLWhwdXgqIHNldHVwX3hmYWlscyBmb3IKKwkicGFzcyBpbnQgcG93ZXJzZXQgdHVwbGUiIGFuZCAicGFzcyBtb2RlbGVzcyBpbnQgcG93ZXJzZXQgdHVwbGUiLgorCSogZ2RiLmNoaWxsL3Rlc3RzMi5leHA6IEFkZCBtNjgqLSotaHB1eCogc2V0dXAgeGZhaWxzIGZvcgorCSJyZWFsIHdyaXRlIDQiIGFuZCAicmVhbCB3cml0ZSA4Ii4KKwkqIGdkYi5zaGlsbC90dXBsZXMuZXhwOiBBZGQgaSo4Ni0qLWxpbnV4KiBhbmQgbTY4Ki0qLWhwdXgqCisgCXNldHVwX3hmYWlscyBmb3IgInByaW50IHZzMSBhZnRlciB0dXBsZSBhc3NpZ24gMiIsCisJInByaW50IFwkaSBhZnRlciB0dXBsZSBhc3NpZ24gMiIsIGFuZAorCSJwcmludCB2czIgYWZ0ZXIgdHVwbGUgYXNzaWduIDIiLgorCSogbGliL2dkYi5leHAgKGdkYl90ZXN0KTogV2hlbiBhIGdkYiBhYm9ydHMsIHByaW50IGEgbW9yZQorCW1lYW5pbmdmdWwgZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJuIC0xIHNvIHRoZSBjYWxsZXIgY2FuCisJc3VwcHJlc3MgZnVydGhlciB0ZXN0cyBhbmQgYXZvaWQgYSBjYXNjYWRlIG9mIGVycm9ycy4KKwkKK0ZyaSBTZXAgMjcgMTA6MzQ6NTEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2ExLXNlbGZ0ZXN0LmV4cDogVHdlYWsgdGVzdHMgdG8gYWNjb3VudCBmb3IgbmV3CisJZm9ybWF0IGZvciBwcmludGluZyB2ZXJzaW9uLgorCSogZ2RiLmJhc2UvZGVmYXVsdC5leHA6IERpdHRvLgorCSogZ2RiLmJhc2UvaW50ZXJydXB0LmV4cDogRml4IHByb2JsZW0gd2l0aCBjYXNjYWRlIG9mCisJZXJyb3JzIGlmIGNoaWxkIHByb2Nlc3MgZGllcyB3aGlsZSBjYWxsaW5nIGEgZnVuY3Rpb24uCisJCitGcmkgU2VwIDEzIDIxOjQzOjQ4IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoVlBBVEgpOiBBZGQKKwkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSwgY29uZmlnLnN0YXR1cyk6IEZpeCBydWxlcyBzbyB0aGluZ3MgZ2V0CisJcmVtYWRlIHdoZW4gbmVjZXNzYXJ5LgorCitGcmkgU2VwIDEzIDE4OjE2OjEwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoanVzdC1jaGVjayk6IEFkZCBwYXRoIHRvIHNpYmxpbmcgZXhwZWN0IGRpcgorCXRvIGVudmlyb25tZW50IHZhcmlhYmxlIHNwZWNpZmllZCBieSBSUEFUSF9FTlZWQVIuCisKK0ZyaSBTZXAgMTMgMTI6MDU6MzQgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChSUEFUSF9FTlZWQVIpOiBOZXcgdmFyLCBzZXQgdG8gQFJQQVRIX0VOVlZBUkAuCisJKGp1c3QtY2hlY2spOiBBZGQgc2hhcmVkIGxpYnJhcnkgcGF0aHMgZm9yIGxpYnN0ZGMrKywgdGssCisJdGNsLCBiZmQsIGFuZCBvcGNvZGVzIHRvIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjaWZpZWQKKwlpbiBSUEFUSF9FTlZWQVIuCisJKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IHRvIHJlY29nbml6ZSAtLWVuYWJsZS1zaGFyZWQgZmxhZworCWFuZCBnZW5lcmF0ZSBjb3JyZWN0IHZhbHVlIGZvciBSUEFUSF9FTlZWQVIuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYuCisKK01vbiBTZXAgIDIgMDY6MzY6MDIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2JyZWFrLmV4cDogRXhwYW5kICJEZWxldGUgYWxsIGJyZWFrcG9pbnRzIiB4ZmFpbCB0bworIAlpbmNsdWRlIGFsbCBvc2YgdmVyc2lvbnMuCisJKiBnZGIudGhyZWFkcy9wdGhyZWFkcy5leHA6IEV4cGFuZCAicnVuIHRvIG1haW4iIHhmYWlsIHRvIGluY2x1ZGUKKwlhbGwgb3NmIHZlcnNpb25zLiAgQWRkIC1EX01JVF9QT1NJWF9USFJFQURTIHRvIGNvbXBpbGF0aW9uIGNvbW1hbmQKKwl3aGVuIHRhcmdldCBpcyBsaW51eC4gIFdoZW4gZmFpbGluZyB0byBidWlsZCBwdGhyZWFkcyB0ZXN0CisJZXhlY3V0YWJsZSwgZ2l2ZSBtb3JlIG1lYW5pbmdmdWwgbWVzc2FnZS4KKwkqIGdkYi50aHJlYWRzL3B0aHJlYWRzLmM6IEhwdXggYWxzbyB1c2VzIG9sZCBkZWZpbml0aW9uIG9mIHNlY29uZAorCWFyZyBmb3IgcHRocmVhZF9jcmVhdGUuCisJCitNb24gQXVnIDE5IDA5OjU4OjU5IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIudGhyZWFkcy9wdGhyZWFkcy5jIChQVEhSRUFEX0NSRUFURV9BUkcyLAorIAlQVEhSRUFEX0NSRUFURV9OVUxMX0FSRzIpOiBBY2NvbW9kYXRlIG9sZCBwdGhyZWFkcyBpbXBsZW1lbnRhdGlvbnMuCisJKiBnZGIudGhyZWFkcy9wdGhyZWFkcy5leHA6IFRyeSBsaW5raW5nIHdpdGggYm90aCAtbHB0aHJlYWQgKFNvbGFyaXMpCisgCWFuZCAtbHB0aHJlYWRzIChldmVyeWJvZHkgZWxzZSkuCisJKHRlc3Rfc3RhcnR1cCk6IEZhaWwgZ3JhY2VmdWxseSBpZiB0aHJlYWRzIGFyZSBub3Qgc3VwcG9ydGVkLgorCSogZ2RiLmJhc2Uvbm9kZWJ1Zy5leHA6IEFkZCBzZXR1cF94ZmFpbCBocHBhKi0qLWhwdXgqIGZvcgorCSJwL2MgYXJyYXlfaW5kZXgoImFiY2RlZiIsMikiIHdoZW4gbm90IGdjYyBjb21waWxlZC4KKwkqIGdkYi5iYXNlL2NvcmVmaWxlLmV4cDogQWRkIHNldHVwX3hmYWlsIGhwcGEqLSotaHB1eCogZm9yCisJInByaW50IGZ1bmMyOjpjb3JlbWFrZXJfbG9jYWwiIHdoZW4gbm90IGdjYyBjb21waWxlZC4KKwkqIGdkYi5iYXNlL29wYXF1ZS5leHA6IFJlbW92ZSBzZXR1cF94ZmFpbCBocHBhKi0qLWhwdXgqIGZvcgorCSJwdHlwZSBvbiBvcGFxdWUgc3RydWN0IHRhZ25hbWUgKHN0YXRpY2FsbHkpIiwKKwkicHR5cGUgb24gb3BhcXVlIHN0cnVjdCB0YWduYW1lIChkeW5hbWljYWxseSkgMSIsIGFuZAorCSJwdHlwZSBvbiBvcGFxdWUgc3RydWN0IHRhZ25hbWUgKGR5bmFtaWNhbGx5KSAyIgorCWZvciBub3QgY29tcGlsZWQgd2l0aCBnY2MuCisJKiBnZGIuYmFzZS9taXBzX3Byby5leHA6IE9ubHkgZG8gc2V0dXBfeGZhaWwgaHBwYSotKi0qIGZvcgorCWJhY2t0cmFjZSB3aGVuIGNvbXBpbGVkIHdpdGggZ2NjLgorCSogbGliL2dkYi5leHAgKHJ1bnRvX21haW4pOiBSZXR1cm4gcmVzdWx0IG9mICJydW50byBtYWluIiByYXRoZXIgCisJdGhhbiBhbHdheXMgcmV0dXJuIHN1Y2Nlc3MuCisKK1NhdCBBdWcgMTcgMTM6Mjg6MDAgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdkYi5jKysvdmlydGZ1bmMuZXhwOiBSZW1vdmUgc2V0dXBfeGZhaWwgZm9yICJtaXBzLSotaXJpeDUqIi4KKworVHVlIEF1ZyAxMyAxMDoyNjoxMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL3N0cnVjdHMuZXhwOiBVbmRvIGxhc3QgY2hhbmdlLgorCitNb24gQXVnIDEyIDE1OjI5OjA4IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9hMS1zZWxmdGVzdC5leHAgKGRvX3N0ZXBzX2FuZF9uZXh0cyk6IE5ldyByb3V0aW5lIHRvCisJZW5jYXBzdWxhdGUgYWxsIHRoZSBzdGVwcy9uZXh0cyBkb25lIGR1cmluZyBzZWxmIHRlc3QsIHN0YXJ0aW5nCisJYXQgbWFpbiwgYW5kIG1ha2VzIHRoZW0gbGVzcyBzZW5zaXRpdmUgdG8gb3B0aW1pemF0aW9uIGlzc3Vlcy4KKwlBZGQgImhwcGEqLSotaHB1eCoiIHRvIHNldHVwX3hmYWlsIGZvciAiYmFja3RyYWNlIHRocm91Z2gKKwlzaWduYWwgaGFuZGxlciIgdGVzdC4KKwkqIGdkYi50aHJlYWRzL3B0aHJlYWRzLmV4cDogT25seSBydW4gdGhpcyBmb3IgbmF0aXZlIGNvbmZpZ3MuCisJKiBnZGIuYmFzZS9zdHJ1Y3RzLmV4cCAoZG9fZnVuY3Rpb25fY2FsbHMpOiBBZGQgaHBwYSotKi1ocHV4OSoiCisJc2V0dXBfeGZhaWxzIGZvciAicCBmdW41KCkiLCAicCBmdW42KCkiLCAicCBmdW43KCkiLCBhbmQgInAgZnVuOCIKKwl0ZXN0cy4KKwlnZGIuYysrL3ZpcnRmdW5jLmV4cCAoZG9fdGVzdHMpOiBBZGQgIm1pcHMtKi1pcml4NSoiIHNldHVwX3hmYWlsCisJZm9yICJydW50byB0ZXN0X2NhbGxzKHZvaWQpIiB0ZXN0LgorCQorU3VuIEF1ZyAxMSAxMzoxMToyNCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvdGVybS5leHA6IFNldCA3LWJpdCBzdHJpbmdzLCBhZGRyZXNzIG9mZiwgd2lkdGggdG8gMCwKKwlhbmQgZG9uJ3QgZXhwZWN0IGFkZHJlc3MgaW5mbyBpbiBicmVha3BvaW50IGNvbmZpcm1hdGlvbnMuCisKK1dlZCBBdWcgIDcgMjA6NDc6NDMgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2xpc3QuZXhwICh0ZXN0X2ZvcndhcmRfc2VhcmNoKTogSW5jcmVhc2UgdGltZW91dAorCXRlbXBvcmFyaWx5IGJ5IDYwIHNlY29uZHMgZm9yIHNlYXJjaGluZyBleHRyZW1lbHkgbG9uZyBsaW5lLAorIAlhbmQgdGhlbiByZXNldCB0byBvbGQgdmFsdWUgd2hlbiBkb25lLiAgSW5jcmVhc2UgZXhwZWN0IGlucHV0CisJYnVmZmVyIHRvIDEwMDAwLgorCitXZWQgQXVnICA3IDE1OjM0OjIyIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9saXN0LmV4cCAodGVzdF9mb3J3YXJkX3NlYXJjaCk6IEZpeCB0byBoYW5kbGUgdmVyeQorCWxvbmcgc291cmNlIGxpbmUgd2l0aG91dCBvdmVyZmxvd2luZyBleHBlY3QncyBpbnB1dCBidWZmZXIuCisKK1dlZCBBdWcgIDcgMTI6MDM6MjUgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGUuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3NsaXRlLWdkYi5leHAgKGdkYl9zdGFydCk6IFVzZSAiZnVsbF9idWZmZXIiLCBub3QKKwkiYnVmZmVyX2Z1bGwiLgorCisJKiBjb25maWcvbmluZC1nZGIuZXhwIChnZGJfc3RhcnQpOiBVc2UgImZ1bGxfYnVmZmVyIiwgbm90CisJImJ1ZmZlcl9mdWxsIi4KKworCSogY29uZmlnL21pcHMtZ2RiLmV4cCAoZ2RiX3N0YXJ0KTogVXNlICJmdWxsX2J1ZmZlciIsIG5vdAorCSJidWZmZXJfZnVsbCIuCisKKwkqIGxpYi9nZGIuZXhwIChnZGJfdGVzdCk6IENvcnJlY3QgcGF0dGVybiBpcyAiZnVsbF9idWZmZXIiLCBub3QKKwkiYnVmZmVyX2Z1bGwiLgorCitXZWQgQXVnICA3IDExOjA1OjQ3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGNvbmZpZ2RpcnMpOiBBZGQgZ2RiLnRocmVhZHMuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYuCisJKiBnZGIudGhyZWFkcy97Y29uZmlnLmluLCBwdGhyZWFkcy5jLCBwdGhyZWFkcy5leHB9OiBOZXcuCisJKiBnZGIudGhyZWFkcy97TWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbn06IENvbXBsZXRlIHJld3JpdGVzLgorCSogZ2RiLnRocmVhZHMvY29uZmlndXJlOiBOZXcsIGdlbmVyYXRlZCB3aXRoIGF1dG9jb25mLgorCQorVHVlIEF1ZyAgNiAxMDoyMzowNCAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QHJ0bC5jeWdudXMuY29tPgorCisJKiBsaWIvZ2RiLmV4cCAoZ2RiX3Rlc3RfZXhhY3QpOiBUdXJuIFxuIGluIHBhdHRlcm4gaW50byBcclxuLgorCitNb24gQXVnICA1IDE4OjExOjUzIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9zaWduYWxzLmV4cCAodGVzdF9oYW5kbGVfYWxsX3ByaW50KTogVGVzdCBzZXBhcmF0ZWx5IGZvcgorCWVhY2ggc2lnbmFsJ3Mgc3RhdHVzIGluIHRoZSBvdXRwdXQgb2YgImhhbmRsZSBhbGwgcHJpbnQiLgorCSogbGliL2dkYi5leHAgKGdkYl90ZXN0KTogRG9jdW1lbnQgdGhhdCB0aGUgcGF0dGVybiBtdXN0IE5PVCBpbmNsdWRlCisJdGhlIFxyXG4gc2VxdWVuY2UgdGhhdCBpbW1lZGlhdGVseSBwcmVjZWRlcyB0aGUgZ2RiIHByb21wdC4KKwkqIGdkYi5iYXNlL2ExLXNlbGZ0ZXN0LmV4cDogU2F2ZSBvcmlnaW5hbCB0aW1lb3V0IGFuZCByZXN0b3JlCisJYWZ0ZXIgdGVzdC4KKworU3VuIEF1ZyAgNCAxMDoyMDo1MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdkYi5kaXNhc20vaHBwYS5zOiBFeHBvcnQgZm1lbUxSYnVnX3Rlc3RzXzQgYXMgYSBTVF9DT0RFCisJc3ltYm9sLgorCitGcmkgQXVnICAyIDE3OjM3OjI2IDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3Z4LWdkYi5leHAgKGdkYl9zdGFydCk6IEZpeCBzeW50YXggb2YgYCRzaGVsbF9pZCA8IDAnLgorCitUaHUgSnVuIDI3IDIwOjQxOjQwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9zaWduYWxzLmV4cCAodGVzdF9oYW5kbGVfYWxsX3ByaW50KTogVGVtcG9yYXJpbHkgaW5jcmVhc2UKKwl0aW1lb3V0IGJ5IDYwIHNlY29uZHMuCisKK1RodSBKdW4gMjcgMTg6MTM6NTcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZy91bml4LWdkYi5leHA6IEluY3JlYXNlIGRlZmF1bHQgdGltZW91dCBmcm9tIDMwIHRvIDYwIHNlYy4KKwkqIGNvbmZpZy9uZXR3YXJlLmV4cCAoZ2RiX3J1bl9jbWQpOiBSZXN0b3JlIG9sZCB0aW1lb3V0IGJlZm9yZSBkb2luZworCWVycm9yIHJldHVybi4KKworVGh1IEp1biAyNyAxMDo1NDo1OCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogbGliL2dkYi5leHAgKGRlZmF1bHRfZ2RiX3N0YXJ0KTogV2hlbiByZXBvcnRpbmcgYSB0aW1lb3V0IGR1cmluZworCWdkYiBpbml0aWFsaXphdGlvbiwgYWxzbyByZXBvcnQgaG93IGxvbmcgZGVqYWdudSB3YWl0ZWQuICBSZXN0b3JlCisJb2xkIHRpbWVvdXQgYmVmb3JlIGRvaW5nIGVycm9yIHJldHVybi4gIFRlbXBvcmFyaWx5IGluY3JlYXNlIHRpbWVvdXQKKyAJYnkgMyBtaW51dGVzIHRvIGFsbG93IGZvciBzbG93IHN0YXJ0dXBzIG92ZXIgaGVhdnkgTkZTIHVzZS4KKworVHVlIEp1biAyNSAxOTo1OToxNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogbGliL2dkYi5leHA6IFJlcG9ydCB0aW1lb3V0IHZhbHVlIGZvciB2ZXJib3NpdHkgbGV2ZWwgMi4KKwkqIGNvbmZpZy9nZGJzZXJ2ZXIuZXhwOiBEaXR0by4KKwkqIGNvbmZpZy9ocHByby5leHA6IERpdHRvLgorCSogY29uZmlnL21pcHMtZ2RiLmV4cDogRGl0dG8uCisJKiBjb25maWcvbW9uaXRvci5leHA6IERpdHRvLgorCSogY29uZmlnL25ldHdhcmUuZXhwOiBEaXR0by4KKwkqIGNvbmZpZy9zaW0tZ2RiLmV4cDogRGl0dG8uCisJKiBjb25maWcvc2xpdGUtZ2RiLmV4cDogRGl0dG8uCisJKiBjb25maWcvdWRpLWdkYi5leHA6IERpdHRvLgorCSogY29uZmlnL3VuaXgtZ2RiLmV4cDogRGl0dG8uCisJKiBjb25maWcvdngtZ2RiLmV4cDogRGl0dG8uCisJKiBnZGIuYmFzZS9hMS1zZWxmdGVzdC5leHA6IERpdHRvLgorCSogZ2RiLmJhc2UvYTItcnVuLmV4cDogRGl0dG8uCisJKiBnZGIuYmFzZS9icmVhay5leHA6IERpdHRvLgorCSogZ2RiLmJhc2UvY29yZWZpbGUuZXhwOiBEaXR0by4KKwkqIGdkYi5iYXNlL2xpc3QuZXhwOiBEaXR0by4KKwkqIGdkYi5iYXNlL3JlY3Vyc2UuZXhwOiBEaXR0by4KKwkqIGdkYi5iYXNlL3Njb3BlLmV4cDogRGl0dG8uCisJKiBnZGIuYmFzZS9zaWduYWxzLmV4cDogRGl0dG8uCisKK1R1ZSBKdW4gMjUgMjM6MTY6NTggMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKKworCSogZ2RiLnRocmVhZHMvTWFrZWZpbGUuaW4gKGRvY2Rpcik6IFJlbW92ZWQuCisKK1R1ZSBKdW4gMjUgMTc6MDI6MzkgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKKworCSogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBhdXRvY29uZiAyLjUgb3IgaGlnaGVyLgorCSogZ2RiLntiYXNlLGMrKyxjaGlsbCxkaXNhc20sc3RhYnN9L01ha2VmaWxlLmluIChWUEFUSCk6IHNldCB0byAKKwlAc3JjZGlyQC4KKwkqIGdkYi57YmFzZSxjKyssY2hpbGwsZGlzYXNtLHN0YWJzfS9jb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IAorCWF1dG9jb25mIDIuNSBvciBoaWdoZXIuCisJKiBnZGIue2Jhc2UsYysrLGNoaWxsLGRpc2FzbSxzdGFic30vY29uZmlndXJlOiBSZWJ1aWx0LgorCitUaHUgSnVuIDEzIDExOjE2OjEwIDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAdGhlcHViLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBhY2xvY2FsLm00IChDWV9BQ19QQVRIX1RDTEgsIENZX0FDX1BBVEhfVEtIKTogVXNlIG9kZCBuYW1lcyB0bworCWF2b2lkIG5hbWUgY2xhc2hlcyB3aXRoIFN1bk9TIGhlYWRlcnMuCisKK1dlZCBKdW4gIDUgMTY6NDM6MjcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnZGIuYysrL3ZpcnRmdW5jLmV4cDogU2VhcmNoICRvYmpkaXIvLi4vLi4vbGlic3RkYysrIGZvciBsaWJzdGRjKysuCisKK1RodSBNYXkgMzAgMTE6MzU6MTEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnZGIuYmFzZS9jYWxsZnVuY3MuZXhwOiBGaW5pc2ggbGFzdCBjaGFuZ2UgLS0gbWFrZSBzdXJlIHRoZQorCXByb3RvdHlwZSBpbmZvcm1hdGlvbiBlbmRzIHVwIGluIHRoZSBjb21waWxlciBpbmZvIGZpbGUuCisKK1RodSBNYXkgMjMgMTI6NDg6NDEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2NhbGxmdW5jcy5leHA6IFJlbW92ZSB0aGUgY29tcGlsZXIgaW5mbyBmaWxlIHByaW9yIHRvCisJYXR0ZW1wdGluZyB0byByZWdlbmVyYXRlIGl0LiAgRWxpbWluYXRlIHVzZSBvZiBhIHRlbXBvcmFyeSBmaWxlCisJYW5kIGp1c3QgZ2VuZXJhdGUgdGhlIGluZm8gZmlsZSBkaXJlY3RseS4gIFNvdXJjZSBpdCBpbW1lZGlhdGVseSwKKwlmb3IgY29uc2lzdGVuY3kgb2YgdXNlLgorCSogZ2RiLmJhc2UvY29yZWZpbGUuZXhwOiBEaXR0bworCSogZ2RiLmJhc2UvZXhwcnMuZXhwOiBEaXR0by4KKwkqIGdkYi5iYXNlL2Z1bmNhcmdzLmV4cDogRGl0dG8uCisJKiBnZGIuYmFzZS9sYW5ncy5leHA6IERpdHRvLgorCSogZ2RiLmJhc2UvbGlzdC5leHA6IERpdHRvLgorCSogZ2RiLmJhc2UvbWlwc19wcm8uZXhwOiBEaXR0by4KKwkqIGdkYi5iYXNlL25vZGVidWcuZXhwOiBEaXR0by4KKwkqIGdkYi5iYXNlL29wYXF1ZS5leHA6IERpdHRvLgorCSogZ2RiLmJhc2UvcHR5cGUuZXhwOiBEaXR0by4KKwkqIGdkYi5iYXNlL3Njb3BlLmV4cDogRGl0dG8uCisJKiBnZGIuYmFzZS9zZXR2YXIuZXhwOiBEaXR0by4KKwkqIGdkYi5iYXNlL3NpZ25hbHMuZXhwOiBEaXR0by4KKwkqIGdkYi5iYXNlL3doYXRpcy5leHA6IERpdHRvLgorCSogZ2RiLmMrKy90ZW1wbGF0ZXMuZXhwOiBEaXR0by4KKwkqIGdkYi5jKysvdmlydGZ1bmMuZXhwOiBEaXR0by4KKwkqIGdkYi5jKysvdmlydGZ1bmMuZXhwOiBVc2UgY29udGVudHMgb2YgZ2NjX2NvbXBpbGVkIHRvIGRlY2lkZQorIAl3aGV0aGVyIG9yIG5vdCB0byBhZGQgLWxzdGRjKysgdG8gdGhlIGNvbXBpbGUgY29tbWFuZCBsaW5lIGFyZ3MuCisKK1NhdCBNYXkgMTggMDI6NDM6NTggMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBnZGIuYmFzZS9yZWN1cnNlLmV4cDogIFJlbW92ZSBzZXR1cF94ZmFpbCBmb3IgInNwYXJjKi0qLXN1bm9zNCoiLAorCWl0IGdvdCBmaXhlZCBieSB0aGUgcmVjZW50IGxvb2t1cF9taW5pbWFsX3N5bWJvbF9ieV9wYyBjaGFuZ2UuCisJSW5jcmVhc2UgdGltZW91dCwgYSBsb3Qgb2Ygc2luZ2xlIHN0ZXBwaW5nIG1pZ2h0IGJlIG5lZWRlZCBpZiB0aGUKKwl0YXJnZXQgaGFzIG5vIGhhcmR3YXJlIHdhdGNocG9pbnRzLgorCitXZWQgTWF5IDE1IDA4OjQ3OjQyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2RiLmJhc2UvYnJlYWsuZXhwOiBJZ25vcmUgY29tcGlsZXIgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcKKwlicmVhay5jLgorCSogZ2RiLmJhc2UvY2FsbGZ1bmNzLmV4cDogRG9uJ3QgcnVuIHRoZXNlIHRlc3RzIG9uIHRoZSBoODMwMC4KKwkqIGdkYi5iYXNlL2RlZmF1bHQuZXhwOiBBZGQgaDgzMDAgeGZhaWxzLiAgSGFuZGxlIG1lc3NhZ2VzCisJZnJvbSByZW1vdGUtc2ltLgorCSogZ2RiLmJhc2UvZXhwcnMuZXhwOiBBZGQgaDgzMDAgeGZhaWxzLgorCSogZ2RiLmJhc2UvZnVuY2FyZ3MuZXhwOiBMaWtld2lzZS4KKwkqIGdkYi5iYXNlL25vZGVidWcuZXhwOiBMaWtld2lzZS4KKwkqIGdkYi5iYXNlL3ByaW50Y21kcy5leHA6IExpa2V3aXNlLgorCSogZ2RiLmJhc2UvcHR5cGUuZXhwOiBMaWtld2lzZS4KKwkqIGdkYi5iYXNlL3NldHZhci5leHA6IEhhbmRsZSBzaXplb2YgKGludCkgIT0gNCBmb3IgaDgzMDAuICBBZGQKKwloODMwMCB4ZmFpbHMuCisJKiBnZGIuYmFzZS9yZXR1cm4uZXhwOiBIYW5kbGUgZmxvYXQvZG91YmxlIHByZWNpc2lvbiBwcm9ibGVtcyAKKwlvbiB0aGUgaDgzMDAuCisJKiBnZGIuYmFzZS9mdW5jYXJncy5jOiBFeHBsaWNpdGx5IG1ha2UgbGFzdCBjb25zdGFudCBhcmd1bWVudCB0bworCWNhbGxfYWZ0ZXJfYWxsb2NhX3N1YnIgYW4gdW5zaWduZWQgbG9uZyB0eXBlLgorCSogZ2RiLmJhc2UvcmV0dXJuLmM6IEluY2x1ZGUgc3RkaW8uaC4KKworVHVlIE1heSAgNyAyMjowMToxMiAxOTk2ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgorCisJKiBjb25maWcvYWJ1Zy5leHA6IE5ldyBmaWxlIGZvciB0aGUgb2xkZXIgTW90b3JvbGEgQnVnIG1vbml0b3IKKwl0aGF0IHJ1bnMgb24gdGhlIG12bWUxM3ggc2VyaWVzIFZNRSBib2FyZHMuCisJKiBjb25maWcvbW9uaXRvci5leHA6IFVzZSB0aGUgbmV3IGNvbmZpZyBhcnJheSBmb3IgdGFyZ2V0IHNldHRpbmdzCisJaWYgdGhleSBleGlzdC4KKworRnJpIE1heSAgMyAxNjowMjo1NSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIHNpbS1nZGIuZXhwOiBNYWtlIHRoZSBTSCBzaW11bGF0b3IgYWxsb2NhdGUgbGVzcyBzcGFjZSB3aGVuCisJaXQgaXMgdGFyZ2V0ZWQuCisKK1RodSBNYXkgIDIgMTI6MzE6NTYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnZGIuYmFzZS9taXBzX3Byby5leHA6IEV4cGVjdCBmYWlsdXJlIGZvciBocHBhKi0qLSogaW4gYmFja3RyYWNlCisJdGVzdC4KKworV2VkIE1hciAyMCAwODo0ODowMyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvbGlzdC5leHAgKHRlc3RfbGlzdF9mdW5jdGlvbik6IFJlbW92ZSBzZXR1cF94ZmFpbCBmb3IKKwkicnM2MDAwLSotKiIgZm9yICJsaXN0IGZ1bmN0aW9uIGluIGluY2x1ZGUgZmlsZSIgd2hlbiBnY2MgY29tcGlsZWQuCisJKiBnZGIuYmFzZS9wcmludGNtZHMuZXhwOiBSZW1vdmUgc2V0dXBfeGZhaWwgZm9yICJyczYwMDAtKi1haXgqIgorCWZvciAicCBjdGFibGUxWzEyMF0iLgorCSogZ2RiLmJhc2Uvc2NvcGUuZXhwOiBSZW1vdmUgc2V0dXBfeGZhaWwgZm9yICJyczYwMDAtKi0qIiBmb3IKKwkicHJpbnQgJ3Njb3BlMC5jJzo6ZmlsZWxvY2FsX2JzcyBiZWZvcmUgcnVuIiB3aGVuIGdjYyBjb21waWxlZC4KKwlSZW1vdmUgc2V0dXBfeGZhaWwgZm9yICJyczYwMDAtKi0qIiBmb3IKKwkicHJpbnQgJ3Njb3BlMC5jJzo6ZmlsZWxvY2FsIGJlZm9yZSBydW4iLgorCSogZ2RiLmJhc2Uve2xhbmdzLmV4cCwgbGlzdHMuZXhwLCBvcGFxdWUuZXhwLCBzY29wZS5leHB9LAorCWdkYi5zdGFicy93ZWlyZC5leHA6IFJlbW92ZSB1c2Ugb2YgY29tcGlsZXIgb3B0aW9ucyAiLWMgLW8gLi4uIgorCXNpbmNlIHNvbWUgY29tcGlsZXJzIGRvbid0IGFsbG93IGJvdGggb3B0aW9ucyB0byBiZSBnaXZlbgorCW9uIHRoZSBzYW1lIGNvbW1hbmQgbGluZS4gIENyZWF0ZSBvYmplY3QgZmlsZSBhbmQgbW92ZSBpdC4KKwkKK1R1ZSBNYXIgMTkgMjM6NDk6MzEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2NvcmVmaWxlLmV4cDogQWx3YXlzIHJlZ2VuZXJhdGUgdGhlIGNvcmUgZmlsZSwgc2luY2UKKwl3ZSBhbHdheXMgcmVnZW5lcmF0ZSB0aGUgY29yZW1ha2VyIHByb2dyYW0uICBEZXRlY3Qgc3BlY2lhbCBjYXNlCisJd2hlcmUgcmVnaXN0ZXJzIGNhbm5vdCBiZSByZWFkIGZyb20gY29yZSBmaWxlLgorCQorVHVlIE1hciAxOSAxNjo1Mjo0OSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCUZyb20gUGV0ZXIgU2NoYXVlciA8UGV0ZXIuU2NoYXVlckBSZWdlbnQuRS1UZWNobmlrLlRVLU11ZW5jaGVuLkRFPgorCSogZ2RiLmJhc2UvZnVuY2FyZ3MuYzogUGF0Y2ggZm9yIFNQQVJDd29ya3MgYWxsb2NhIGNvbXBhdGliaWxpdHkKKwkqIGdkYi5jKysvdGVtcGxhdGVzLmV4cDogT25seSBtYXRjaCBvbiBiYXNlbmFtZSBvZiBmaWxlIHNpbmNlCisJc29tZSBmb3JtYXRzIGxpa2UgeGNvZmYgZG9uJ3QgZW5jb2RlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KKwkqIGdkYi5zdGFicy93ZWlyZC5leHA6IFVzZSB0aGUgcmlnaHQgc2VkIHNjcmlwdCBmb3IgcG93ZXJwYworCWFuZCByczYwMDAgQUlYIHhjb2ZmIHRhcmdldHMuCisJKiBjb25maWd1cmUuaW46IEFkZCBzdGFic2RpcnMgdG8gY29uZmlnZGlycyBmb3IgcG93ZXJwYy0qLWFpeCouCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJKiBnZGIuYmFzZS9NYWtlZmlsZS5pbiAoY2xlYW4pOiBSZW1vdmUgZ2VuZXJhdGVkIGZpbGUgdHdpY2UtdG1wLmMKKwloZXJlLCByYXRoZXIgdGhhbiBpbiBkaXN0Y2xlYW4uCisJCitTdW4gTWFyIDE3IDEzOjM1OjMxIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9taXBzX3Byby5leHA6IENyZWF0ZSBtaXBzX3Byby5jaSB0byBnZXQgZ2NjX2NvbXBpbGVkCisJZGVmaW5lZCwgYW5kIHVzZSBpdCB0byBjb21waWxlIHRoZSB0ZXN0IGNhc2Ugd2l0aCAtTzIuICBUaGUKKwluYXRpdmUgY29tcGlsYXRpb24gc3RpbGwgdXNlcyBubyBvcHRpbWl6YXRpb24uCisJKiBnZGIuYmFzZS9taXBzX3Byby5jOiBSZW1vdmUgaW5saW5lIGFzc2VtYmx5IGNvZGUgc2luY2UKKwlpdCBpcyBjb21waWxlZCBQSUMgYnkgZGVmYXVsdCwgd2hpY2ggcmVzdWx0cyBpbiBhc3NlbWJsZXIKKwl3YXJuaW5ncyB0aGF0IG1ha2UgdGhlIHRlc3RzdWl0ZSB0aGluayB0aGUgY29tcGlsYXRpb24KKwl3YXMgdW5zdWNjZXNzZnVsLgorCitTYXQgTWFyIDE2IDE1OjAyOjI0IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYysrL21pc2MuZXhwOiBBZGQgbm90ZSB0byBtZXNzYWdlIGZvcgorCSJwcmludCBzLmEgZm9yIGZvbyBzdHJ1Y3QiIHRoYXQgdGhpcyBpcyBhIGtub3duIGdjYyAyLjcuMgorCWFuZCBlYXJsaWVyIGJ1Zy4KKworRnJpIE1hciAxNSAxNzo0OTo1NyAxOTk2ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZ2RiLmJhc2UvYnJlYWsuZXhwOiBGaXggcGF0dGVybiBmb3IgbWF0Y2hpbmcgIkRlbGV0ZSBhbGwKKwlicmVha3BvaW50cyAoeSBvciBuKSAiLiAgQWRkICJtaXBzLWRlYy11bHRyaXgqIiB0bworCXNldHVwX3hmYWlsIGZvciBkZWxldGluZyBhbGwgYnJlYWtwb2ludHMgdGVzdC4gIEZpeCB2YXJpb3VzCisJdGltZW91dCBtZXNzYWdlcyB0byBpbmNsdWRlICIodGltZW91dCkiLgorCSogZ2RiLmJhc2UvY2FsbGZ1bmNzLmV4cDogQWRkICJpKjg2LSotc3lzdjQqIiB0byBzZXR1cF94ZmFpbAorCWZvciAicCB0X2Zsb2F0X3ZhbHVlczIoMy4xNDE1OSxmbG9hdF92YWwyKSIuCisJKiBnZGIuYmFzZS9mdW5jYXJncy5leHA6IFJlbW92ZSAibWlwcy1zZ2ktaXJpeDQqIiBzZXR1cF94ZmFpbAorCWZvciAiY29udGludWUgdG8gY2FsbDJnIiB3aGVuIGdjYyBjb21waWxlZC4KKwkqIGdkYi5iYXNlL2xhbmdzLmV4cDogUmVtb3ZlICJpKjg2LSotc3lzdjQqIiBzZXR1cF94ZmFpbCBmb3IKKwkidXAgdG8gZm9vIGluIGxhbmdzLmV4cCIsICJzaG93IGxhbmd1YWdlIGF0IGZvbyBpbiBsYW5ncy5leHAiLAorCSJzaG93IGxhbmd1YWdlIGF0IGNwcHN1Yl8gaW4gbGFuZ3MuZXhwIiwgInVwIHRvIGZzdWIgaW4gbGFuZ3MuZXhwIiwKKwlhbmQgInNob3cgbGFuZ3VhZ2UgYXQgZnN1YiBpbiBsYW5ncy5leHAiLgorCSogZ2RiLmJhc2UvbGlzdC5leHA6IFJlbW92ZSAiKi0qLXN5c3Y0KiIgc2V0dXBfeGZhaWwgZm9yCisJImxpc3QgbGluZSAxIGluIGluY2x1ZGUgZmlsZSIsICJsaXN0IG1lc3NhZ2UgZm9yIGxpbmVzIHBhc3QgRU9GIiwKKwkibGlzdCBmdW5jdGlvbiBpbiBpbmNsdWRlIGZpbGUiLCAibGlzdCBsaXN0MC5oOmZvbyIsIGFuZAorCSJsaXN0IGZpbGVuYW1lOmZ1bmN0aW9uOyBub25leGlzdGFudCBmdW5jdGlvbiIuCisJKiBnZGIuYmFzZS9wdHlwZS5leHA6IENoYW5nZSAiaSo4Ni0qLXN5c3Y0KiIgc2V0dXBfeGZhaWwgZm9yCisJIndoYXRpcyB1bm5hbWVkIHR5cGVkZWYnZCBlbnVtIChjb21waWxlciBidWcgaW4gSUJNJ3MgeGxjKSIKKwlhbmQgInB0eXBlIHRfY2hhcl9hcnJheSIgdG8gYmUgZm9yIG5hdGl2ZSBjYyBvbmx5LgorCQorRnJpIE1hciAxNSAxNjoxNzoyMiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvY29yZWZpbGUuZXhwOiBSZW1vdmUgImFscGhhLWRlYy1vc2YyKiIgbmF0aXZlIGNvbXBpbGVkIAorCXNldHVwX3hmYWlsIGZvciAicHJpbnQgY29yZW1ha2VyX2JzcyIsICJwcmludCBjb3JlbWFrZXJfcm8iLAorIAkicHJpbnQgZnVuYzI6OmNvcmVtYWtlcl9sb2NhbCIsIGFuZCAiYmFja3RyYWNlIGluIGNvcmVmaWxlLmV4cCIuCisKK1dlZCBNYXIgMTMgMTQ6NTQ6MTEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL3NpZ25hbHMuZXhwOiBSZW1vdmUgImFscGhhLSotb3NmMioiIHNldHVwX3hmYWlsIGZvcgorCSJidCBpbiBzaWduYWxzLmV4cCIuICBUaGlzIHByb2JsZW0gb25seSBhcHBlYXJzIHdoZW4gcnVubmluZworCXRoZSB0ZXN0c3VpdGUsIGFuZCB0aGVuIG9ubHkgaW50ZXJtaXR0ZW50bHkuCisKK1R1ZSBNYXIgMTIgMTU6MDA6MTYgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9yZXR1cm4uZXhwIChyZXR1cm5fdGVzdHMpOiBEaWZmZXJlbnRpYXRlIGJldHdlZW4KKwl0d28gdGVzdHMgb2YgY29udGludWluZy4KKworVHVlIE1hciAgNSAxNDozMzozMyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqICovTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBSZW1vdmUgY29uZmlnLmxvZy4KKwkqIGdkYi5iYXNlL01ha2VmaWxlLmluIChFWEVDVVRBQkxFUyk6IFJlcGxhY2UgdHdpY2Ugd2l0aCB0d2ljZS10bXAuCisJKiBnZGIuYysrL01ha2VmaWxlLmluIChQUk9HUyk6IEFkZCBpbmhlcml0LgorCShjbGVhbik6IFJlbW92ZSAqLmNpLgorCitUdWUgRmViIDIwIDE2OjM2OjEwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYysrL21pc2MuY2M6IEFkZCB0ZXN0IGNvZGUgZnJvbSBNaWtlIFN0dW1wLgorCSogZ2RiLmMrKy9taXNjLmV4cDogQWRkIHRlc3QgdG8gcHJpbnQgcy5hLCBmb3IgTWlrZSBTdHVtcC4KKworU3VuIEZlYiAxOCAxMTozOToxMiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2Uvc2lnbmFscy5leHA6IENoYW5nZSBzZXR1cF94ZmFpbCBmb3IgImFscGhhLSotb3NmMiIKKwl0byAiYWxwaGEtKi1vc2YyKiIgYW5kIGFkZCBjb21tZW50LgorCSogZ2RiLmJhc2UvYTEtc2VsZnRlc3QuZXhwICh0ZXN0X3dpdGhfc2VsZik6IFJlbW92ZSAiYWxwaGEtZGVjLW9zZjIqIgorIAlzZXR1cF94ZmFpbCBmb3IgInN0ZXAgb3ZlciBleGVjYXJnIGluaXRpYWxpemF0aW9uIiBhbmQKKyAJInN0ZXAgb3ZlciBjb3JlYXJnIGluaXRpYWxpemF0aW9uIi4KKwkqIGdkYi5iYXNlL2NhbGxmdW5jcy5leHAgKGRvX2Z1bmN0aW9uX2NhbGxzKTogUmVzdG9yZSBzZXR1cF94ZmFpbAorCWZvciAiaHBwYSotKi0qIiwgInNwYXJjLSotKiIsICJtaXBzKi0qLSoiLCBhbmQgImFscGhhLWRlYy1vc2YyKiIuCisJKiBnZGIuYmFzZS9jb3JlZmlsZS5leHA6IEFkZCAiYWxwaGEtZGVjLW9zZjIqIiBzZXR1cF94ZmFpbCB3aGVuIG5vdAorIAlnY2MgY29tcGlsZWQgZm9yICJwcmludCBjb3JlbWFrZXJfYnNzIiwgInByaW50IGNvcmVtYWtlcl9ybyIsCisJInByaW50IGZ1bmMyOjpjb3JlbWFrZXJfbG9jYWwiLCBhbmQgImJhY2t0cmFjZSBpbiBjb3JlZmlsZS5leHAiLgorCSogZ2RiLmJhc2Uvc2lnbmFscy5leHA6IEJ1aWxkIGFuZCBzb3VyY2Ugc2lnbmFscy5jaS4KKwlDaGFuZ2UgImFscGhhLWRlYy1vc2YyKiIgc2V0dXBfeGZhaWwgZm9yICJidCBpbiBzaWduYWxzLmV4cCIKKwl0byBiZSBmb3IgZ2NjIG9ubHkuCisJKiBsaWIvZ2RiLmV4cDogTW92ZSB2ZXJib3NlIHN0YXRlbWVudHMgb3V0c2lkZSBjb25kaXRpb25hbHMuCisJCitTYXQgRmViIDE3IDAyOjIyOjE0IDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLmJhc2Uvc2lnYWxsLmV4cDogIFJlbW92ZSBzZXR1cF94ZmFpbCBmb3IgaXJpeDQuICBGaXhlZCBieQorCUZlYiAzIHByb2Nmcy5jIGNoYW5nZS4KKworRnJpIEZlYiAxNiAxMzoyNTozMSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3VuaXgtZ2RiLmV4cDogUmVtb3ZlIGV4dHJhbmVvdXMgbmV3bGluZXMgZnJvbSBlbmQgb2YgZmlsZS4KKworVGh1IEZlYiAxNSAwODoxMjo1NSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3VuaXgtZ2RiLmV4cDogRGVmYXVsdCB0aW1lb3V0IGluIFVOSVggY2FzZSB0byAzMCBzZWNvbmRzLCB1cAorCWZyb20gZGVqYWdudSdzIGFwcGFyZW50IGRlZmF1bHQgb2YgMTAgc2Vjb25kcywgd2hpY2ggZ2l2ZXMgcmFuZG9tCisJcmVzdWx0cyB3aGVuIHJ1bm5pbmcgdGhlIHRlc3RzIG92ZXIgTkZTIG9uIG1vZGVyYXRlbHkgbG9hZGVkIHN5c3RlbXMuCisJKiBsaWIvZ2RiLmV4cCAoZ2RiX3J1bl9jbWQpOiBBZGQgIih0aW1lb3V0KSIgaW4gdGltZW91dCBjYXNlLgorCitNb24gRmViIDEyIDE2OjUwOjI4IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9jYWxsZnVuY3MuZXhwOiBSZW1vdmUgc2V0dXBfeGZhaWwgZm9yIFBSIDUzMTguICBOb3cgZml4ZWQuCisJKiBnZGIuYmFzZS9hMi1ydW4uZXhwOiBSZXBsYWNlICRiaW5maWxlIHdpdGggJHRlc3RmaWxlIGluIHRlc3QKKyAJcmVzdWx0IHJlcG9ydHMuCisKK0ZyaSBGZWIgIDkgMTU6NTY6NTEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoQ1lfQUNfUEFUSF9UQ0xIKTogUmVtb3ZlLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCitGcmkgRmViICA5IDA4OjIxOjMxIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYysrL01ha2VmaWxlLmluIChjbGVhbik6IEFkZCBtaXNzaW5nICd7Jy4KKworRnJpIEZlYiAgMiAxMDoxOTo0MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGxpYi9nZGIuZXhwOiBQcm92aWRlIGEgZGVmYXVsdCB2YWx1ZSBmb3Igbm9pbmZlcmlvci4KKworCSogbGliL2dkYi5leHA6IEZpeCB0eXBvcyAoTERMQUdTIC0+IExERkxBR1MpLgorCUxvYWQgbGliZ2xvc3MuZXhwLgorCitUaHUgRmViICAxIDIwOjIwOjE0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2RiLmRpc2FzbS9ocHBhLmV4cDogQ29tcGlsZSBkaXJlY3RseSBpbnRvIGFuIGV4ZWN1dGFibGUsIHVzZQorCXRoZSBleGVjdXRhYmxlLCBub3QgdGhlIC5vIHRvIHJ1biB0aGUgdGVzdHMgZnJvbS4KKworV2VkIEphbiAzMSAxNDoyMTowOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL2JyZWFrLmV4cDogRG9uJ3QgdGVzdCBmb3IgcHJvZ3JhbSBleGl0IG9yIGV4aXQgc3RhdHVzCisJaWYgJG5vcmVzdWx0cyBpZiBub256ZXJvLgorCSogZ2RiLmJhc2UvbGFuZ3MuZXhwOiBMaWtld2lzZS4KKwkqIGdkYi5iYXNlL3dhdGNocG9pbnQuZXhwOiBMaWtld2lzZS4KKworCSogZ2RiLmJhc2UvZGVmYXVsdC5leHA6IFJlbW92ZSBleHRyYW5lb3VzIGNhbGwgdG8gbG9hZCBnZGIuZXhwLgorCSogZ2RiLmNoaWxsL3ByLTg0MDUuZXhwOiBNb3ZlIHNraXBfY2hpbGxfdGVzdHMgY2hlY2sgdG8ganVzdCBiZWZvcmUKKwl0cnlpbmcgdG8gY29tcGlsZSB0aGUgdGVzdGNhc2UuCisKK1dlZCBKYW4gMjQgMjM6NDI6MzkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2ludGVycnVwdC5leHAgKHAgZnVuYzEpOiB4ZmFpbCBzcGFyYzY0LSotc29sYXJpczIuCisJKiBnZGIuYmFzZS9zaWduYWxzLmV4cCAoY29udGludWUgdG8gaGFuZGxlcik6IExpa2V3aXNlLgorCitUdWUgSmFuIDIzIDE2OjI4OjIyIDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBnZGIuYysrL2NsYXNzZXMuZXhwOiAgTm93ID0gcmV0dXJucyBmYWxzZS90cnVlLCBub3QgMS8wLgorCisJKiBnZGIuZm9ydHJhbi9leHBycy5leHA6ICAuTFQuIGFuZCAuR1QuIG5vdyByZXR1cm4gLlRSVUUuIG9yIC5GQUxTRS4uCisKK1R1ZSBKYW4gMjMgMTU6NDE6NTcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnZGIuYmFzZS9jb3JlZmlsZS5leHA6IFJlY29nbml6ZSAibm90IGZvdW5kIiBhcyBmYWlsdXJlCisJd2hlbiB0cnlpbmcgdG8gZGV0ZXJtaW5lIGlmIGEgY29yZSBmaWxlIHdhcyBnZW5lcmF0ZWQuCisJSWYgbm8gY29yZSBmaWxlIHdhcyBnZW5lcmF0ZSB0aGUgZmlyc3QgdGltZSwgdHJ5IGFnYWluIHdpdGhvdXQKKwl0aGUgdWxpbWl0IC1jIHRvIHdvcmsgYXJvdW5kIGJyYWluZGFtYWdlZCBzaGVsbHMuCisKK01vbiBKYW4gMTUgMDk6MzM6MDAgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdkYi5zdGFicy9jb25maWd1cmUuaW4gKGFscGhhLSotKixtaXBzLSotKik6IFJlcGxhY2UKKwlbXSB0ZXN0cyB3aXRoICJ0ZXN0IiBhbmQgZW5jbG9zZSBzdHJpbmcgaW4gcXVvdGVzLgorCSogZ2RiLnN0YWJzL2NvbmZpZ3VyZTogUmVidWlsZAorCQorVGh1IEphbiAxMSAwOTo0MzoxNCAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZS5jeWdudXMuY29tPgorCisJQ2hhbmdlcyBpbiBzeW5jIHdpdGggZXhwZWN0OgorCSogYWNsb2NhbC5tNCAoQ1lfQUNfUEFUSF9UQ0xIKTogSGFuZGxlIFRjbCA3LjUgYW5kIGdyZWF0ZXIuCisJKENZX0FDX1BBVEhfVENMTElCKTogSGFuZGxlIFRjbCA3LjUgYW5kIGdyZWF0ZXIuCisJKENZX0FDX1BBVEhfVEtIKTogSGFuZGxlIFRrIDQuMSBhbmQgZ3JlYXRlci4KKwkoQ1lfQUNfUEFUSF9US0xJQik6IEhhbmRsZSBUayA0LjEgYW5kIGdyZWF0ZXIuICBQcm9wZXJseSBxdW90ZQorCWFyZ3VtZW50IHRvIEFDX1JFUVVJUkUuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitUaHUgSmFuICA0IDA4OjE3OjIyIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9jb3JlZmlsZS5leHA6IFdoZW4gZ2VuZXJhdGluZyBhIGNvcmUsIGRpc2NhcmQgYW55CisJZXJyb3IgbWVzc2FnZXMgYWJvdXQgdWxpbWl0IG5vdCBmb3VuZCBhbmQgdGhlICJjb3JlIGR1bXBlZCIKKwltZXNzYWdlIGZyb20gdGhlIHNoZWxsIHRoYXQgcnVucyB0aGUgY29yZWR1bXBlci4KKworV2VkIEphbiAgMyAwMTozMDo0MSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGxpYi9nZGIuZXhwIChza2lwX2NoaWxsX3Rlc3RzKTogU2tpcCB0aGVtIG9uIHRoZSBQQSB0b28uCisKKwkqIGdkYi5zdGFicy93ZWlyZC5leHA6IFVzZSAke3RhcmdldF90cmlwbGV0fSB0byBkZXRlcm1pbmUKKwl3aGljaCBzZWQgc2NyaXB0IHRvIHJ1bi4gIEV4cGVjdCBmYWlsdXJlIGZvciB2X2NvbWIgdGVzdAorCW9uIFBBIHRhcmdldHMgdG9vLgorCQorU2F0IERlYyAzMCAxNjowOTowNCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAcnRsLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2NvcmVmaWxlLmV4cDogUmVtb3ZlICJpKjg2LSotbGludXgiIHhmYWlsIGZvcgorIAkicHJpbnQgZnVuYzI6OmNvcmVtYWtlcl9sb2NhbCIgYW5kIGZvciAiYmFja3RyYWNlIGluIGNvcmVmaWxlLmV4cCIKKworU2F0IERlYyAzMCAxMjo1OToxMiAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogbGliL2dkYi5leHA6IEZpeCB0eXBvIGFuZCByZXdyaXRlIHNraXBfY2hpbGxfdGVzdHMuCisJKiBnZGIuc3RhYnMvd2VpcmQuZXhwOiBTZXR1cCAic3BhcmMtc3VuLXN1bm9zNCoiIGFuZAorIAkic3BhcmMtc3VuLXNvbGFyaXMqIiB4ZmFpbHMgZm9yICJwIHZfY29tYiIuCisJKiBsaWIvZ2RiLmV4cCAoZGVmYXVsdF9nZGJfc3RhcnQpOiBGaXggdHlwby4KKwkqIGdkYi5iYXNlL2NvcmVmaWxlLmV4cDogQWxsb3cgIkNvcmUgd2FzIGdlbmVyYXRlZCBieSAuLi4iCisJbWVzc2FnZXMgdG8gbm90IGluY2x1ZGUgdGhlIGZ1bGwgcHJvZ3JhbSBuYW1lIHRoYXQgY2F1c2VkCisJdGhlIGNvcmUgZHVtcCBzaW5jZSBzb21lIHN5c3RlbXMgKHN1Y2ggYXMgc29sYXJpcykgYXBwYXJlbnRseQorCXRydW5jYXRlIHRoaXMgcGF0aCB0byBhYm91dCA4MCBjaGFyYWN0ZXJzLgorCVdoZW4gZ2VuZXJhdGluZyBhIGNvcmUgZmlsZSBmaXJzdCB0cnkgaW5jcmVhc2luZyB0aGUgY29yZSBmaWxlCisJc2l6ZSBsaW1pdCB0byB1bmxpbWl0ZWQgc2luY2Ugc29tZSBzeXN0ZW1zIG1heSBkZWZhdWx0IGl0IHRvCisJemVybywgYW5kIGl0IGlzIGhhcm1sZXNzIHRvIHRyeSBpdC4gIE1vdmUgdGhlIHRlc3QgZm9yIGZhaWxpbmcKKwl0byBnZW5lcmF0ZSBhIGNvcmUgZmlsZSB0byB3aGVyZSBpdCB3aWxsIGFjdHVhbGx5IGdldCBleGVjdXRlZC4KKwkqIGdkYi5jKysvdGVtcGxhdGVzLmV4cCAodGVzdF9wdHlwZV9vZl90ZW1wbGF0ZXMpOiBBY2NlcHQKKwluZXcgZ2RiIHJlc3VsdCBmcm9tIGcrKyBkZWJ1ZyBpbmZvIGltcHJvdmVtZW50cyBhbmQgbWFrZSBvbGQKKwlwYXR0ZXJuIG9ic29sZXNjZW50LiAgQWxzbyBhY2NvdW50IGZvciBzaXplX3QgZGlmZmVyZW5jZXMKKwkobWF5IGJlIGludCBvciBsb25nKS4KKwkqIGdkYi5iYXNlL2ExLXNlbGZ0ZXN0LmV4cCAodGVzdF93aXRoX3NlbGYpOiBDaGVjayBmb3IgY2FzZSB3aGVyZQorCWluaXRpYWxpemF0aW9uIGJlZm9yZSBmdW5jdGlvbiBjYWxsIGlzIHBsYWNlZCBpbiB0aGUgZGVsYXkgc2xvdAorCWFuZCB0aHVzIGFwcGVhcnMgdG8gYmUgc2tpcHBlZCBvdmVyIGJ5IGNvbW1hbmRzIHN1Y2ggYXMgIm5leHQiLgorCitGcmkgRGVjIDI5IDE2OjA5OjIwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvYTEtc2VsZnRlc3QuZXhwICh0ZXN0X3dpdGhfc2VsZik6IFJ1biB3aXRob3V0IHdpbmRvd3MuCisKK1dlZCBEZWMgIDYgMTA6NDU6NDIgMTk5NSAgSmVmZnJleSBBLiBMYXcgIDxsYXdAc2V0aHJhLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlLyouZXhwOiBNYWtlICR7c3JjZmlsZX0gb25seSBiZSB0aGUgYmFzZW5hbWUgb2YgdGhlCisJaW5wdXQgc291cmNlIGZpbGU7IGZpeCBjb2RlIHRvIGNvbXBpbGUgdGVzdCB0byBkZWFsIHdpdGggdGhpcworCWNvbnZlbnRpb24uCisJKiBnZGIuYysrLyouZXhwOiBMaWtld2lzZS4KKworTW9uIE5vdiAyNyAxMTo0MDoxNiAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2Uvc2lnbmFscy5leHA6IFNldHVwICJhbHBoYS0qLW9zZjIqIiB4ZmFpbCBmb3IKKwkiYnQgaW4gc2lnbmFscy5leHAiLgorCitTYXQgTm92IDI1IDIwOjUyOjE1IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBwaHlkZWF1eC5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9hMS1zZWxmdGVzdC5leHA6IEFkZCBhbHBoYS1kZWMtb3NmMiBzZXR1cF94ZmFpbCBmb3IKKwkic3RlcCBvdmVyIGV4ZWNhcmcgaW5pdGlhbGl6YXRpb24iIGFuZAorIAkic3RlcCBvdmVyIGNvcmVhcmcgaW5pdGlhbGl6YXRpb24iLgorCitTYXQgTm92IDI1IDE4OjIwOjE0IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9wdHlwZS5jIChtYWluKTogRGVjbGFyZSBtYWxsb2MgYXMgYSAiY2hhciAqIiBmb3Igc3lzdGVtcworCXdpdGggc2l6ZW9mKHBvaW50ZXIpID4gc2l6ZW9mKGludCkuICBBdm9pZCAidm9pZCAqIiBvciBpbmNsdWRlIGZpbGVzLgorCitTYXQgTm92IDI1IDExOjAzOjQyIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJRnJvbSBSb2IgU2F2b3llICAocm9iQHBvc2VpZG9uLmN5Z251cy5jb20pCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluLCBnZGIuYmFzZS97TWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbn0sCisJZ2RiLmMrKy97TWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbn0sIGdkYi5jaGlsbC97TWFrZWZpbGUuaW4sCisgCWNvbmZpZ3VyZS5pbn0sIGdkYi5kaXNhc20ve01ha2VmaWxlLmluLCBjb25maWd1cmUuaW59LAorIAlnZGIuc3RhYnMve01ha2VmaWxlLmluLCBjb25maWd1cmUuaW59LCBnZGIudGhyZWFkcy97TWFrZWZpbGUuaW4sCisgCWNvbmZpZ3VyZS5pbn06IE1ham9yIHJld29ya2luZyBmb3IgYXV0b2NvbmZpZy4KKwkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgZ2RiLmJhc2UvY29uZmlndXJlLCBnZGIuYysrL2NvbmZpZ3VyZSwKKwlnZGIuZGlzYXNtL2NvbmZpZ3VyZSwgZ2RiLnN0YWJzL2NvbmZpZ3VyZSwgZ2RiLnN0YWJzL2RlZmF1bHQubXQgOgorIAlOZXcgZmlsZXMuCisJKiBjb25maWcvdW5peC1nZGIuZXhwOiAgTWFrZSBHREIgZ2xvYmFsLgorCSogZ2RiLmJhc2Uve2ExLXNlbGZ0ZXN0LmV4cCwgYTItcnVuLmV4cCxiaXRmaWVsZHMuZXhwLCBicmVhay5leHAsCisgCWNhbGxmdW5jcy5leHAsIGNvbW1hbmRzLmV4cCwgY29yZWZpbGUuZXhwLCBjcm9zc2xvYWQuZXhwLCBleHBycy5leHAsCisgCWZ1bmNhcmdzLmV4cCwgaW50ZXJydXB0LmV4cCwgbGFuZ3MuZXhwLCBsaXN0LmV4cCwgbWlwc19wcm8uZXhwLAorIAlub2RlYnVnLmV4cCwgb3BhcXVlLmV4cCwgcHJpbnRjbWRzLmV4cCwgcHR5cGUuZXhwLCByZWN1cnNlLmV4cCwKKyAJcmVncy5leHAsIHJldHVybi5leHAsIHNjb3BlLmV4cCwgc2V0dmFyLmV4cCwgc2lnYWxsLmV4cCwgc2lnbmFscy5leHAsCisgCXRlcm0uZXhwLCB0d2ljZS5leHAsIHdhdGNocG9pbnQuZXhwLCB3aGF0aXMuZXhwfSwKKwlnZGIuYysrL3tjbGFzc2VzLmV4cCwgY2FsbGZ1bmNzLmV4cCwgaW5oZXJpdC5leHAsIG1pc2MuZXhwLAorIAl0ZW1wbGF0ZXMuZXhwLCB2aXJ0ZnVuYy5leHB9LCBnZGIuY2hpbGwve2NhbGxjaC5leHAsIGNoaWxsdmFycy5leHAsCisgCW1pc2MuZXhwLCBwci00OTc1LmV4cCwgcHItNTAxNi5leHAsIHByLTUwMjAuZXhwLCBwci01MDIyLmV4cCwKKyAJcHItNTY0Ni5leHAsIHByLTU5ODQuZXhwLCBwci02MjkyLmV4cCwgcHItNjYzMi5leHAsIHByLTgxMzQuZXhwLAorIAlwci04MTM2LmV4cCwgcmVzdWx0LmV4cCwgc3RyaW5nLmV4cCwgdHVwbGVzLmV4cH0sCisJZ2RiLmRpc2FzbS97aHBwYS5leHAsIHNoMy5leHB9LCBnZGIuc3RhYnMvd2VpcmQuZXhwOiBDaGFuZ2UgY29udGludWVzCisgCXRvIHJldHVybnMgYXMgbmVjZXNzYXJ5LCBhcnJhbmdlIGZvciB0ZXN0IHRvIGNvbXBpbGUgb3duIHRlc3RjYXNlCisgCWV4ZWN1dGFibGUuCisJKiBsaWIvZ2RiLmV4cDogQ2hhbmdlcyBmb3IgdGVzdHN1aXRlIHRvIGNvbXBpbGUgb3duIHRlc3QgY2FzZXMuCisJCitUdWUgTm92IDIxIDE2OjE1OjQ1IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYysrL2NsYXNzZXMuZXhwICh0ZXN0X3BvaW50ZXJzX3RvX2NsYXNzX21lbWJlcnMpOiBBZGQKKyAJY2xlYXJfeGZhaWwgYXQgZW5kIG9mIHRlc3Qgd2hpY2ggbWlnaHQgbm90IGNhbGwgZWl0aGVyIHBhc3Mgb3IgZmFpbC4KKwkqIGdkYi5iYXNlL2ExLXNlbGZ0ZXN0LmV4cDogQWRkIGkqODYtKi1saW51eGFvdXQgeGZhaWwgZm9yCisJImJhY2t0cmFjZSB0aHJvdWdoIHNpZ25hbCBoYW5kbGVyIi4KKworU2F0IE5vdiAxOCAwNDowOTozMSAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi5iYXNlL3NpZ2FsbC5leHA6ICBXb3JrIGFyb3VuZCBPU0YvMS0zLngga2VybmVsIGJ1ZyB3aGVuCisJY29udGludWluZyBmcm9tIGEgam9iIGNvbnRyb2wgc3RvcCBzaWduYWwuCisJKiBnZGIuc3RhYnMvYWxwaGEubXQ6ICBVc2UgJChDRkxBR1MpIHdoZW4gYnVpbGRpbmcgd2VpcmQuby4KKworV2VkIE5vdiAxNSAwMDoyODowMyAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL2NhbGxmdW5jcy5leHA6IFJlbW92ZSBib2d1cyBocHBhIHhmYWlscy4KKwkqIGdkYi5iYXNlL2NvcmVmaWxlLmV4cDogTGlrZXdpc2UuCisJKiBnZGIuYmFzZS9mdW5jYXJncy5leHA6IExpa2V3aXNlLgorCitUdWUgTm92IDE0IDE1OjE4OjEwIDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9obXNpcm9tLmV4cDogIFNldHVwIGZvciB0YWxraW5nIHRvIGhtc2kgUk9NIG1vbml0b3IuCisJKiBjb25maWcvbW9uaXRvci5leHA6ICBBZGQgc3VwcG9ydCBmb3Igc2V0dGluZyBiYXVkIHJhdGUuCisKK1NhdCBOb3YgIDQgMTU6MzU6NTIgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2ExLXNlbGZ0ZXN0LmV4cDogUmVtb3ZlIGkqODYtKi1zeXN2NCogYW5kCisJaSo4Ni0qLWxpbnV4KiB4ZmFpbHMgZm9yICJiYWNrdHJhY2UgdGhyb3VnaCBzaWduYWwgaGFuZGxlciIuCisJKiBnZGIuYmFzZS9jb3JlZmlsZS5leHA6IEFkZCBpKjg2LSotc3lzdjQqIHhmYWlsIGZvcgorCSJwcmludCBmdW5jMjo6Y29yZW1ha2VyX2xvY2FsIi4KKwkqIGdkYi5iYXNlL2JyZWFrLmV4cDogQWRkIGkqODYtKi1zeXN2NCosIHNwYXJjLXN1bi1zdW5vczQsCisgCWFscGhhLWRlYy1vc2YyKiB4ZmFpbCBmb3IKKwkiZGVsZXRlIGFsbCBicmVha3BvaW50cyB3aGVuIG5vbmUiLgorCitXZWQgTm92ICAxIDE1OjU3OjE2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9icmVhay5leHA6IENoYW5nZSB0ZXN0IHRoYXQgZGVsZXRlcyBhbGwgYnJlYWtwb2ludHMKKwl3aGVuIG5vIHVzZXIgYnJlYWtwb2ludHMgYXJlIGluc3RhbGxlZC4gIEEgcG9zdCA0LjE1IGNoYW5nZQorCWNhdXNlcyBnZGIgdG8gbm8gbG9uZ2VyIHByb21wdCBpbiB0aGlzIGNhc2UuCisKK1R1ZSBPY3QgMzEgMTU6MTM6NDMgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL3JldHVybi5leHAgKHJldHVybl90ZXN0cyk6ICBDaGFuZ2UgeGZhaWwgZm9yIHRlc3QKKwkiY29ycmVjdCB2YWx1ZSByZXR1cm5lZCBkb3VibGUgdGVzdCIgdG8gc3RvcCB4ZmFpbGluZyBhdAorCVNvbGFyaXMgMi41LiAgQXBwYXJlbnRseSB0aGUgYnVnIGhhcyBiZWVuIGZpeGVkLgorCitTdW4gT2N0IDI5IDEyOjE4OjE2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuc3RhYnMvZWNvZmYuc2VkOiBSZW1vdmUgY29tbWVudCBsaW5lcyBleGNlcHQgZm9yIGZpcnN0IG9uZS4KKwlJUklYIDQuMCAvYmluL3NlZCBjaG9rZXMgb24gdGhlbSwgdGhvdWdoIHRoZXkgd29yayBmaW5lIGVsc2V3aGVyZS4KKworVHVlIE9jdCAyNCAxMToxMjoxMiAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdkYi5kaXNhc20vaHBwYS5leHA6IFRlc3QgbGNpIGFuZCBzeW5jZG1hIGluc3RydWN0aW9ucy4KKwkqIGdkYi5kaXNhc20vaHBwYS5zOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCisKK1dlZCBPY3QgMTggMTE6Mjc6NDcgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnZGIuYmFzZS9jb25maWd1cmUuaW4gKGhwcGEqLSotaHB1eCopOiBObyBsb25nZXIgbmVlZHMgdGFyZ2V0CisJbWFrZWZpbGUgZnJhZ21lbnQuCisJKiBjb25maWcvbXQtaHB1eDogRGVsZXRlZC4KKworVHVlIE9jdCAxNyAyMzowMjoxMiAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIE1hbnkgZmlsZXM6IFdoZW4gd2FybmluZyBhYm91dCBzdXBwcmVzc2VkIHRlc3RzIGR1ZSB0byBhIAorCW5vbmV4aXN0YW50IHRlc3QgYmluYXJ5LCBhdm9pZCBpbmNyZW1lbnRpbmcgdGhlIHdhcm5pbmcgY291bnQuCisKK1R1ZSBPY3QgMTAgMTE6MDA6NDEgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChUQVJHRVRfRkxBR1NfVE9fUEFTUyk6ICBSZW1vdmUgQklTT04uCisJCitTdW4gT2N0ICA4IDA0OjIzOjE0IDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLmJhc2UvcmV0dXJuLmV4cDogIENoYW5nZSB4ZmFpbCBmcm9tICJzcGFyYy0qLXNvbGFyaXMyLioiIHRvCisJInNwYXJjLSotc29sYXJpczIqIi4KKworU2F0IFNlcCAyMyAwMToyMjoyMyAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi5iYXNlL2NvcmVtYWtlci5jOiAgUHJvZHVjZSBhIGZ1bGwgY29yZSBkdW1wIGZvciBBSVggdGFyZ2V0cy4KKwlBZGQgZ2xvYmFsIGFuZCBsb2NhbCB2YXJpYWJsZXMgYW5kIGluaXRpYWxpemUgdGhlbS4KKwkqIGdkYi5iYXNlL2NvcmVmaWxlLmV4cDogIFRlc3QgY29ycmVjdCBtYXBwaW5nIG9mIGNvcmVmaWxlIHNlY3Rpb25zCisJYnkgcHJpbnRpbmcgdmFyaWFibGVzLiBSZW1vdmUgcnM2MDAwIGFuZCBwb3dlcnBjIHhmYWlscywgQkZEIG5vdworCWV4dHJhY3RzIHRoZSBmaWxlIG5hbWUgYW5kIHRlcm1pbmF0aW5nIHNpZ25hbCBmcm9tIHRoZSBjb3JlIGZpbGUuCisJKiBUT0RPOiAgUmVtb3ZlIG5vdGUgYWJvdXQgdGVzdHMgZm9yIGNvcnJlY3QgbWFwcGluZyBvZiBjb3JlZmlsZS4KKwkqIGdkYi5iYXNlL3B0eXBlLmMgKG1haW4pOiAgVXNlIGJvb2xlYW4yIHRvIGluaGliaXQgQUlYIDQuMSB4bGMKKwlmcm9tIG9wdGltaXppbmcgaXQgYXdheS4KKwkqIGdkYi5zdGFicy93ZWlyZC5leHA6ICBSZW1vdmUgcnM2MDAwIHhmYWlsLCB4Y29mZnJlYWQuYyBub3cKKwloYW5kbGVzIGNvbW1vbiBibG9ja3MuCisKK1RodSBTZXAgMjEgMDE6Mjg6MTAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdkYi5kaXNhc20vc2gzLnMgKGZtYWMpOiBVcGRhdGUgZm9yIG5ldyBhc3NlbWJsZXIgc3ludGF4CisJKiBnZGIuZGlzYXNtL3NoMy5leHAgKGZtYWMpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCisKK1dlZCBTZXAgMjAgMTM6MTU6MDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQsIHN5bm9ueW0gZm9yCisJcmVhbGNsZWFuLgorCSogZ2RiLmJhc2UvTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBMaWtld2lzZS4KKwkqIGdkYi5jKysvTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBMaWtld2lzZS4KKwkqIGdkYi5jaGlsbC9NYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IExpa2V3aXNlLgorCSogZ2RiLmRpc2FzbS9NYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IExpa2V3aXNlLgorCSogZ2RiLnN0YWJzL01ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTGlrZXdpc2UuCisJKiBnZGIudGhyZWFkcy9NYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IExpa2V3aXNlLgorCitTdW4gU2VwIDEwIDEzOjE0OjAxIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9zY29wZS5leHAgKHRleHRfYXRfbWFpbik6ICBBZGQgImhwcGEqLSotaHB1eCoiCisJeGZhaWxzIHdoZW4gbm90IGdjYyBjb21waWxlZCBmb3IgInByaW50IGZvbzo6ZnVuY2xvY2FsIi4KKwkodGVzdF9hdF9mb28pOiAgQWRkICJocHBhKi0qLWhwdXgqIiB4ZmFpbHMgd2hlbiBub3QgZ2NjIGNvbXBpbGVkIGZvcjoKKwkicHJpbnQgZm9vOjpmdW5jbG9jYWwgYXQgZm9vIiwKKwkicHJpbnQgJ3Njb3BlMS5jJzo6Zm9vOjpmdW5jbG9jYWwgYXQgZm9vIiwKKwkicHJpbnQgZm9vOjpmdW5jbG9jYWxfYnNzIGF0IGZvbyIsCisJInByaW50ICdzY29wZTEuYyc6OmZvbzo6ZnVuY2xvY2FsX2JzcyBhdCBmb28iLAorCSJwcmludCBmb286OmZ1bmNsb2NhbF9ybyBhdCBmb28iLAorCSJwcmludCAnc2NvcGUxLmMnOjpmb286OmZ1bmNsb2NhbF9ybyBhdCBmb28iLAorCSJwcmludCBiYXI6OmZ1bmNsb2NhbCBhdCBmb28iIGFuZAorCSJwcmludCAnc2NvcGUxLmMnOjpiYXI6OmZ1bmNsb2NhbCBhdCBmb28iLgorCSh0ZXN0X2F0X2Jhcik6ICBBZGQgImhwcGEqLSotaHB1eCoiIHhmYWlscyB3aGVuIG5vdAorCWdjYyBjb21waWxlZCBmb3IgInByaW50IGZvbzo6ZnVuY2xvY2FsIGF0IGJhciIuCisJRXhwYW5kIGFsbCBtZXNzYWdlcyB0byBlbnN1cmUgdGhhdCB0aGV5IGlkZW50aWZ5IHRoYXQKKwl0aGUgdGVzdCBpcyBhdCBiYXIoKS4KKwkqIGdkYi5iYXNlL29wYXF1ZS5leHA6IEFkZCAiaHBwYSotKi1ocHV4KiIgeGZhaWxzIHdoZW4gbm90CisJZ2NjIGNvbXBpbGVkIGZvcjoKKwkicHR5cGUgb24gb3BhcXVlIHN0cnVjdCBwb2ludGVyIChzdGF0aWNhbGx5KSIsCisJInB0eXBlIG9uIG9wYXF1ZSBzdHJ1Y3QgdGFnbmFtZSAoc3RhdGljYWxseSkiLAorCSJwdHlwZSBvbiBvcGFxdWUgc3RydWN0IHBvaW50ZXIgKGR5bmFtaWNhbGx5KSAxIiwKKwkicHR5cGUgb24gb3BhcXVlIHN0cnVjdCB0YWduYW1lIChkeW5hbWljYWxseSkgMSIsCisJInB0eXBlIG9uIG9wYXF1ZSBzdHJ1Y3QgcG9pbnRlciAoZHluYW1pY2FsbHkpIDIiIGFuZAorCSJwdHlwZSBvbiBvcGFxdWUgc3RydWN0IHRhZ25hbWUgKGR5bmFtaWNhbGx5KSAyCisJKiBnZGIuYmFzZS9ub2RlYnVnLmV4cDogQWRkICJocHBhKi0qLWhwdXgqIiB4ZmFpbHMgd2hlbiBub3QKKwlnY2MgY29tcGlsZWQgZm9yOgorCSJwIGRhdGFsb2NhbCIKKwkid2hhdGlzIGRhdGFsb2NhbCIsCisJInB0eXBlIGRhdGFsb2NhbCIsCisJInAgYnNzbG9jYWwiLAorCSJ3aGF0aXMgYnNzbG9jYWwiLCBhbmQKKwkicHR5cGUgYnNzbG9jYWwiLgorCSogZ2RiLmJhc2UvbGFuZ3MuZXhwOiBBZGQgImhwcGEqLSotaHB1eCoiIHhmYWlscyBmb3IKKwkiYmFja3RyYWNlIGluIGxhbmdzLmV4cCIgYW5kICJ1cCB0byBsYW5nczBfXzJkbyBpbiBsYW5ncy5leHAiCisJd2hlbiBub3QgZ2NjIGNvbXBpbGVkLgorCSogZ2RiLmJhc2UvZnVuY2FyZ3MuZXhwIChmbG9hdF9hbmRfaW50ZWdyYWxfYXJncyk6ICBBZGQKKwkiaHBwYSotKi1ocHV4KiIgeGZhaWwgZm9yICJydW4gdG8gY2FsbDJhIiB3aGVuIG5vdCBnY2MKKwljb21waWxlZC4KKwkoZGlzY2FyZF9hbmRfc2h1ZmZsZSk6ICBBZGQgImhwcGEqLSotaHB1eCoiIHhmYWlsIGZvcgorCSJiYWNrdHJhY2UgZnJvbSBjYWxsNmEiIHdoZW4gbm90IGdjYyBjb21waWxlZC4KKwkoc2h1ZmZsZV9yb3VuZF9yb2Jpbik6IEFkZCAiaHBwYSotKi1ocHV4KiIgeGZhaWwgZm9yCisJImJhY2t0cmFjZSBmcm9tIGNhbGw3YSIgd2hlbiBub3QgZ2NjIGNvbXBpbGVkLgorCSogZ2RiLmJhc2UvY2FsbGZ1bmNzLmV4cCAoZG9fZnVuY3Rpb25fY2FsbHMpOgorCUFkZCAiaHBwYSotKi1ocHV4KiIgeGZhaWwgd2hlbiBub3QgZ2NjIGNvbXBpbGVkIGZvcgorCSJwIHRfY2hhcl9hcnJheV92YWx1ZXMoY2hhcl9hcnJheV92YWwyLGNoYXJfYXJyYXlfdmFsMSkiLAorCSJwIHRfY2hhcl9hcnJheV92YWx1ZXMoY2hhcl9hcnJheV92YWwxLGNoYXJfYXJyYXlfdmFsMikiLAorCSJwIHRfY2hhcl9hcnJheV92YWx1ZXMoImNhcnJheSAxIiwiY2FycmF5IDIiKSIsCisJInAgdF9jaGFyX2FycmF5X3ZhbHVlcygiY2FycmF5IDEiLGNoYXJfYXJyYXlfdmFsMikiLAorCSJwIHRfY2hhcl9hcnJheV92YWx1ZXMoY2hhcl9hcnJheV92YWwxLCJjYXJyYXkgMiIpIiwKKwkicCBzdW1fYXJncygxLHsyfSkiLAorCSJwIHN1bV9hcmdzKDIsezIsM30pIiwKKwkicCBzdW1fYXJncygzLHsyLDMsNH0pIiwKKwkicCBzdW1fYXJncyg0LHsyLDMsNCw1fSkiCisJKiBnZGIuYmFzZS9jb3JlZmlsZS5leHA6IEFkZCAiaHBwYSotKi1ocHV4KiIgeGZhaWwgZm9yCisJImJhY2t0cmFjZSBpbiBjb3JlZmlsZS5leHAiIHdoZW4gbm90IGdjYyBjb21waWxlZC4KKworU2F0IFNlcCAgOSAwMTozNTozOSAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi5iYXNlL3NpZ25hbHMuZXhwOiAgUmV3cml0ZSBgaGFuZGxlIGFsbCBwcmludCcgdGVzdCBhcworCWEgcHJvY2VkdXJlLiBBY2NlcHQgYmxhbmtzIG9yIFRBQnMgYXMgd2hpdGVzcGFjZSwgaW5jcmVhc2UKKwl0aW1lb3V0IGFuZCBleHBlY3QgaW5wdXQgYnVmZmVyIHNpemUgZm9yIHRoZSBsYXJnZSBvdXRwdXQKKwlmcm9tIHRoZSBjb21tYW5kLiBSZW1vdmUgImkqODYtKi1ic2RpMi4wIiB4ZmFpbC4KKworU2F0IFNlcCAgMiAwNjo0MToyNiAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi5iYXNlL3NldHZhci5leHA6ICBBZGQgbmV3IHRlc3RjYXNlcyBmb3IgdHJ1bmNhdGlvbiB3aGVuCisJYXNzaWduaW5nIGludmFsaWQgdmFsdWVzIHRvIGJpdGZpZWxkcy4KKworU2F0IFNlcCAgMiAwMDoxNzozMSAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvY2FsbGZ1bmNzLmV4cCAoZG9fZnVuY3Rpb25fY2FsbHMpOiAgUmVtb3ZlIAorCW1pcHMtc2dpLWlyaXgqIHhmYWlsIGZvcgorCSJjYWxsIGluZmVyaW9yIGZ1bmMgd2l0aCBzdHJ1Y3QgLSByZXR1cm5zIGNoYXIgKiIKKwlhbmQgZml4IHRlc3Qgc28gdGhhdCBhbiBvcHRpb25hbCAodW5zaWduZWQgY2hhciAqKSBjYXN0IGlzCisgCWFjY2VwdGVkIGluIHRoZSByZXN1bHQuCisKK0ZyaSBTZXAgIDEgMTM6NDI6MDEgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2Z1bmNhcmdzLmV4cCAoZmxvYXRfYW5kX2ludGVncmFsX2FyZ3MpOiAgUmVtb3ZlCisJc3BhcmMtc3VuLXNvbGFyaXMyKiB4ZmFpbCBmb3IgInByaW50IGYxIGFmdGVyIHJ1biB0byBjYWxsMmEiLgorCSogZ2RiLmMrKy9NYWtlZmlsZS5pbiAoU1VGRklYRVMpOiBBZGQgLlNVRkZJWEVTIGFuZCAiLmNjIiBzdWZmaXguCisJKiBnZGIuYmFzZS9zaWduYWxzLmV4cDogUmVtb3ZlIGR1cGxpY2F0ZSAiaGFuZGxlIGFsbCBwcmludCIgdGVzdAorCXRoYXQgYWNjaWRlbnRhbGx5IGdvdCBjaGVja2VkIGluLgorCitTdW4gQXVnIDI3IDIzOjM1OjM1IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9jYWxsZnVuY3MuZXhwIChkb19mdW5jdGlvbl9jYWxscyk6ICBBZGQgYWxwaGEtZGVjLW9zZjIqIAorCWNsZWFyX3hmYWlsIGZvciAicCB0X2Zsb2F0X3ZhbHVlczIoMy4xNDE1OSxmbG9hdF92YWwyKSIgZm9yIGdjYworCWNvbXBpbGVkIHRlc3QuCisJKiBnZGIuYmFzZS9vcGFxdWUuZXhwIChzZXR1cF94ZmFpbF9vbl9vcGFxdWVfcG9pbnRlcik6CisJQWRkIG1pcHMtc2dpLWlyaXg1KiB4ZmFpbCBmb3Igbm90IGdjYyBjb21waWxlZC4KKwkqIGdkYi5iYXNlL01ha2VmaWxlLmluIChub2RlYnVnLm8pOiAgQWxzbyBjcmVhdGUgbm9kZWJ1Zy5jaS4KKwkqIGdkYi5iYXNlL25vZGVidWcuZXhwOiBBZGQgbWlwcy1zZ2ktaXJpeDUgeGZhaWwgd2hlbiBub3QgZ2NjIGNvbXBpbGVkIGZvcgorCSJwIHRvcCIsICJ3aGF0aXMgdG9wIiwgInAgbWlkZGxlIiwgYW5kICJ3aGF0aXMgbWlkZGxlIi4KKwkqIGdkYi5iYXNlL3doYXRpcy5leHA6IEFkZCBtaXBzLXNnaS1pcml4KiB4ZmFpbCBmb3IKKwkid2hhdGlzIHNpZ25lZCBjaGFyIiBmb3Igbm90IGdjYyBjb21waWxlZC4KKwkqIGdkYi5iYXNlL3NldHZhci5leHA6IEFkZCBtaXBzLXNnaS1pcml4NCogeGZhaWwgKHdvcmtzIG9uIGlyaXg1KSBmb3IKKwkic2V0IHZhcmlhYmxlIHNpZ25lZCBjaGFyPS0xICgtMSkiIGFuZAorCSJzZXQgdmFyaWFibGUgc2lnbmVkIGNoYXI9MHhGRiAoMHhGRikiIGZvciBub3QgZ2NjIGNvbXBpbGVkLgorCSogZ2RiLmJhc2UvZnVuY2FyZ3MuZXhwIChmbG9hdF9hbmRfaW50ZWdyYWxfYXJncyk6CisJQWRkIG1pcHMtc2dpLWlyaXg1KiB4ZmFpbCBmb3IgInJ1biB0byBjYWxsMmEiIGZvciBub3QgZ2NjIGNvbXBpbGVkLgorCUFkZCBtaXBzLXNnaS1pcml4KiB4ZmFpbCB3aGVuIG5vdCBnY2MgY29tcGlsZWQgZm9yCisJImNvbnRpbnVlIHRvIGNhbGwyYiIuCisJQWRkIG1pcHMtc2dpLWlyaXg0KiB4ZmFpbCAod29ya3Mgd2l0aCBpcml4NSkgd2hlbiBnY2MgY29tcGlsZWQgZm9yCisJImNvbnRpbnVlIHRvIGNhbGwyZyIuCisJKGRpc2NhcmRfYW5kX3NodWZmbGUpOiBBZGQgbWlwcy1zZ2ktaXJpeDUqIHhmYWlsIHdobiBub3QgZ2NjIGNvbXBpbGVkIGZvcgorCSJiYWNrdHJhY2UgZnJvbSBjYWxsNmEiCisJKHNodWZmbGVfcm91bmRfcm9iaW4pOiBBZGQgbWlwcy1zZ2ktaXJpeCogeGZhaWwgd2hlbiBub3QgZ2NjIGNvbXBpbGVkIGZvcgorCSJiYWNrdHJhY2UgZnJvbSBjYWxsN2siLgorCUFkZCBtaXBzLXNnaS1pcml4NSogeGZhaWwgd2hlbiBub3QgZ2NjIGNvbXBpbGVkIGZvcgorCSJiYWNrdHJhY2UgZnJvbSBjYWxsN2EiLgorCShsb2NhbHZhcnNfYWZ0ZXJfYWxsb2NhKTogIEZpeCBnZGJfdGVzdCBjbWRzIGZvcgorCSJwcmludCAqIGFmdGVyIHJ1bnRvIC4uLiIuCisJUmVtb3ZlIHJzNjAwMC0qLSogeGZhaWxzIGZvcgorCSJwcmludCBpIGFmdGVyIHJ1bnRvIGxvY2FsdmFyc19hZnRlcl9hbGxvY2EiIGFuZAorCSJwcmludCBsIGFmdGVyIHJ1bnRvIGxvY2FsdmFyc19hZnRlcl9hbGxvY2EiCisJZm9yIGFsbCBjb21waWxlcnMuCisJKiBnZGIuYmFzZS9leHBycy5leHA6IEFkZCBtaXBzLXNnaS1pcml4NCogeGZhaWxzICh3b3JrcyB3aXRoIGlyaXg1KSwKKyAJd2hlbiBub3QgY29tcGlsZWQgd2l0aCBnY2MsIGZvcjoKKwkicHJpbnQgc2lnbmVkIGNoYXIgPT0gKG1pbnVzKSIsCisJInByaW50IHNpZ25lZCBjaGFyICE9IChtaW51cykiLAorCSJwcmludCBzaWduZWQgY2hhciA8IChtaW51cykiLAorCSJwcmludCBzaWduZWQgY2hhciA+IChtaW51cykiLgorCSogZ2RiLmJhc2UvY2FsbGZ1bmNzLmV4cCAoZG9fZnVuY3Rpb25fY2FsbHMpOgorCUFkZCBtaXBzLXNnaS1pcml4KiB4ZmFpbCwgd2hlbiBjb21waWxlZCB3aXRoIG5hdGl2ZSBjb21waWxlciwgZm9yCisJImNhbGwgaW5mZXJpb3IgZnVuYyB3aXRoIHN0cnVjdCAtIHJldHVybnMgY2hhciAqIi4KKwkqIGdkYi5iYXNlL3JldHVybi5leHAgKHJldHVybl90ZXN0cyk6IENoYW5nZSB4ZmFpbCBmb3IgCisJImNvcnJlY3QgdmFsdWUgcmV0dXJuZWQgZG91YmxlIHRlc3QiIHRvIGluY2x1ZGUgU29sYXJpcyAyLjQuCisJKiBnZGIuYmFzZS9mdW5jYXJncy5leHAgKGZsb2F0X2FuZF9pbnRlZ3JhbF9hcmdzKToKKwlBZGQgc3BhcmMtc3VuLXNvbGFyaXMyKiB4ZmFpbCBmb3IgInByaW50IGYxIGFmdGVyIHJ1biB0byBjYWxsMmEiLgorCQorU2F0IEF1ZyAyNiAwMDoyNjoxMSAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi5iYXNlL3NldHZhci5jLCBnZGIuYmFzZS9zZXR2YXIuZXhwOiAgQWRkIG5ldyB0ZXN0cyBmb3IKKwllbnVtZXJhdGlvbiBiaXRmaWVsZHMgaWYgY29tcGlsaW5nIHdpdGggR05VIEMuCisJKiBsaWIvZ2RiLmV4cDogIENvbnN1bWUgYCh5IG9yIG4pICcgaW4gYFJlaW5pdGlhbGl6ZSBzb3VyY2UgcGF0aAorCXRvIGVtcHR5JyBwcm9tcHQuCisKK1R1ZSBBdWcgMjIgMDA6MzA6MzcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdkYi5iYXNlL3Njb3BlLmV4cDogeGZhaWwgJ3Njb3BlMC5jJzo6ZmlsZWxvY2FsX2JzcyBiZWZvcmUgcnVuCisJdGVzdCBmb3IgUFJPIHRhcmdldHMuCisKKwkqIGdkYi5iYXNlL2Z1bmNhcmdzLmV4cDogQXZvaWQgZXZlciBzZXR0aW5nIG1vcmUgdGhhbiA4CisJYnJlYWtwb2ludHMgaW4gdGhlIGluZmVyaW9yIGF0IGFueSBnaXZlbiB0aW1lIGJ5IG1ha2luZworCXR3byBncm91cHMgb2YgYnJlYWtwb2ludHMgZm9yIGNhbGwyKiwgY2FsbDYqIGFuZCBjYWxsNyoKKwl0ZXN0cy4KKworU3VuIEF1ZyAyMCAwNjo1ODoyNSAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi5iYXNlL2Z1bmNhcmdzLmV4cDogIEZpeCB0eXBvcyBpbnRyb2R1Y2VkIGJ5IEF1ZyAxNSBjaGFuZ2UuCisJKiBnZGIuYmFzZS9jYWxsZnVuY3MuYyAobWFpbik6ICBVc2Ugc3RydWN0X3ZhbDEgdG8gaW5oaWJpdCB4bGMKKwlmcm9tIG9wdGltaXppbmcgaXQgYXdheS4KKwkqIGdkYi5iYXNlL2NhbGxmdW5jcy5leHA6ICBSZW1vdmUgcnM2MDAwLSotKiB4ZmFpbHMgZm9yCisJImNhbGwgaW5mZXJpb3IgZnVuYyB3aXRoIHN0cnVjdCIuCisKK1dlZCBBdWcgMTYgMTE6NTc6MTUgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IE9ubHkgY29uZmlndXJlIGdkYi5jaGlsbCBmb3IgcGFydGljdWxhciB0YXJnZXRzLgorCitUdWUgQXVnIDE1IDA5OjQyOjQ0IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9NYWtlZmlsZS5pbjogIEFkZCBhY3Rpb24gdG8gLmMubyB0cmFuc2Zvcm1hdGlvbgorCXJ1bGUgdGhhdCBnZW5lcmF0ZXMgYSAuY2kgZmlsZSBmb3IgZWFjaCAubyBmaWxlIGFuZCByZW1vdmUKKwlleHBsaWNpdCAuYy5vIHJ1bGVzIGV4Y2VwdCBmb3IgY2FsbGZ1bmNzLm8uCisJKiBnZGIuYysrL01ha2VmaWxlLmluOiAgQWRkIC5jYy5vIHRyYW5zZm9ybWF0aW9uIHJ1bGUgdGhhdAorCWdlbmVyYXRlcyBhIC5jaSBmaWxlIGZvciBlYWNoIC5vIGZpbGUgYW5kIHJlbW92ZSBleHBsaWNpdAorCS5jYy5vIHJ1bGVzLgorCShjbGVhbik6IFJlbW92ZSAqLnRtcCAqLmNpIGZpbGVzLgorCShFWEVDVVRBQkxFUyk6IFJlbW92ZSB0ZW1wbC1pbmZvLmV4cC4KKwkqIGdkYi5iYXNlL2NvbXBpbGVyLmM6IE5ldyBmaWxlLgorCSogZ2RiLmMrKy9jb21waWxlci5jYzogTmV3IGZpbGUKKwkqIGdkYi5iYXNlL3Njb3BlLmV4cDogU291cmNlIGdkYi5iYXNlL3Njb3BlLmNpLgorCUNoYW5nZSByczYwMDAtKi0qIHhmYWlsIGZvcgorCSJwcmludCAnc2NvcGUwLmMnOjpmaWxlbG9jYWxfcm8iIGFuZAorCSJwcmludCAnc2NvcGUxLmMnOjpmaWxlbG9jYWwiIGFuZAorCSJwcmludCAnc2NvcGUxLmMnOjpmaWxlbG9jYWxfYnNzIiBhbmQKKwkicHJpbnQgJ3Njb3BlMS5jJzo6ZmlsZWxvY2FsX3JvIiBhbmQKKwkicHJpbnQgJ3Njb3BlMS5jJzo6Zm9vOjpmdW5jbG9jYWwiIGFuZAorCSJwcmludCAnc2NvcGUxLmMnOjpmb286OmZ1bmNsb2NhbF9ybyIgYW5kCisJInByaW50ICdzY29wZTEuYyc6OmJhcjo6ZnVuY2xvY2FsIiBhbmQKKwkicHJpbnQgJ3Njb3BlMC5jJzo6ZmlsZWxvY2FsX3JvIiBhbmQKKwkicHJpbnQgJ3Njb3BlMS5jJzo6ZmlsZWxvY2FsIGF0IGZvbyIgYW5kCisJInByaW50ICdzY29wZTEuYyc6OmZpbGVsb2NhbF9ic3MgYXQgZm9vIiBhbmQKKwkicHJpbnQgJ3Njb3BlMS5jJzo6ZmlsZWxvY2FsX3JvIGF0IGZvbyIgYW5kCisJInByaW50ICdzY29wZTEuYyc6OmZvbzo6ZnVuY2xvY2FsIGF0IGZvbyIgYW5kCisJInByaW50ICdzY29wZTEuYyc6OmZvbzo6ZnVuY2xvY2FsX2JzcyBhdCBmb28iIGFuZAorCSJwcmludCAnc2NvcGUxLmMnOjpmb286OmZ1bmNsb2NhbF9ybyBhdCBmb28iIGFuZAorCSJwcmludCAnc2NvcGUxLmMnOjpiYXI6OmZ1bmNsb2NhbCBhdCBmb28iIGFuZAorCSJwcmludCAnc2NvcGUwLmMnOjpmaWxlbG9jYWxfcm8iIGFuZAorCSJwcmludCAnc2NvcGUxLmMnOjpmaWxlbG9jYWwiIGFuZAorCSJwcmludCAnc2NvcGUxLmMnOjpmaWxlbG9jYWxfYnNzIiBhbmQKKwkicHJpbnQgJ3Njb3BlMS5jJzo6ZmlsZWxvY2FsX3JvIiBhbmQKKwkicHJpbnQgJ3Njb3BlMS5jJzo6Zm9vOjpmdW5jbG9jYWwiIGFuZAorCSJwcmludCAnc2NvcGUxLmMnOjpmb286OmZ1bmNsb2NhbF9ic3MiIGFuZAorCSJwcmludCAnc2NvcGUxLmMnOjpmb286OmZ1bmNsb2NhbF9ybyIgYW5kCisJInByaW50ICdzY29wZTEuYyc6OmJhcjo6ZnVuY2xvY2FsIiBhbmQKKwkicHJpbnQgJ3Njb3BlMS5jJzo6YmFyOjpmdW5jbG9jYWxfYnNzIgorCXRvIG9ubHkgYmUgeGZhaWwnZCB3aGVuIG5vdCBjb21waWxlZCB3aXRoIGdjYy4KKwlBZGQgcnM2MDAwLSotKiB4ZmFpbCBmb3IgCisJInByaW50ICdzY29wZTAuYyc6OmZpbGVsb2NhbF9ic3MgYmVmb3JlIHJ1biIKKwl3aGVuIGNvbXBpbGVkIHdpdGggZ2NjLgorCSh0ZXN0X2F0X21haW4pOiBBZGQgcnM2MDAwLSotKiB4ZmFpbCBmb3IKKwkicHJpbnQgZmlsZWxvY2FsX3JvIGluIHRlc3RfYXRfbWFpbiIKKwl3aGVuIGNvbXBpbGVkIHdpdGggZ2NjLgorCSogZ2RiLmJhc2UvcHR5cGUuZXhwOiBTb3VyY2UgZ2RiLmJhc2UvcHR5cGUuY2kuCisgCUFkZCByczYwMDAtKi1haXgqIHhmYWlsIGZvciAKKwkid2hhdGlzIHVubmFtZWQgdHlwZWRlZidkIGVudW0gKGNvbXBpbGVyIGJ1ZyBpbiBJQk0ncyB4bGMpIiBhbmQKKwkicHR5cGUgdF9jaGFyX2FycmF5IiwgIG5vdCBjb21waWxlZCB3aXRoIGdjYy4KKwkqIGdkYi5iYXNlL2xpc3QuZXhwICh0ZXN0X2xpc3RfZnVuY3Rpb24pOiAgQWRkIHJzNjAwMC0qLSoKKwl4ZmFpbCBmb3IgImxpc3QgZm9vIChpbiBpbmNsdWRlIGZpbGUpIiB3aGVuIGdjYwljb21waWxlZC4KKwkqIGdkYi5iYXNlL2Z1bmNhcmdzLmV4cDogU291cmNlIGdkYi5iYXNlL2Z1bmNhcmdzLmNpCisgCShpbnRlZ3JhbF9hcmdzKTogQWRkIHJzNjAwMC0qLSogeGZhaWwgZm9yCisJInJ1biB0byBjYWxsMGEiIGlmIG5vdCBjb21waWxlZCB3aXRoIGdjYy4KKwkodW5zaWduZWRfaW50ZWdyYWxfYXJncyk6IEFkZCByczYwMDAtKi0qIHhmYWlsIGZvcgorCSJydW4gdG8gY2FsbDFhIiBpZiBub3QgY29tcGlsZWQgd2l0aCBnY2MuCisJKGZsb2F0X2FuZF9pbnRlZ3JhbF9hcmdzKTogIEFkZCByczYwMDAtKi0qIHhmYWlsIGZvcgorCSJydW4gdG8gY2FsbDJhIiBpZiBub3QgY29tcGlsZWQgd2l0aCBnY2MgYW5kIGZvcgorCSJjb250aW51ZSB0byBjYWxsMmIiIGZvciBhbnkgY29tcGlsZXIuCisJQWRkIHJzNjAwMC0qLSogeGZhaWwgdG8KKwkicHJpbnQgZjEgYWZ0ZXIgcnVuIHRvIGNhbGwyYSIgZm9yIGdjYyBjb21waWxlZC4KKwkoZGlzY2FyZF9hbmRfc2h1ZmZsZSk6IEFkZCByczYwMDAtKi0qIHhmYWlsIGZvcgorCSJydW4gdG8gY2FsbDZhIi4KKwkoc2h1ZmZsZV9yb3VuZF9yb2Jpbik6IEFkZCByczYwMDAtKi0qIHhmYWlsIGZvcgorCSJiYWNrdHJhY2UgZnJvbSBjYWxsN2EiIGlmIG5vdCBjb21waWxlZCB3aXRoIGdjYy4KKwlBZGQgcnM2MDAwLSotKiB4ZmFpbCBmb3IKKwkiYmFja3RyYWNlIGZyb20gY2FsbDdiIiBpZiBjb21waWxlZCB3aXRoIGdjYy4KKwkoY2FsbF9hZnRlcl9hbGxvY2EpOiBBZGQgcnM2MDAwLSotKiB4ZmFpbCBmb3IKKwkicHJpbnQgYyBpbiBjYWxsX2FmdGVyX2FsbG9jYSIgYW5kCisJInByaW50IHMgaW4gY2FsbF9hZnRlcl9hbGxvY2EiIGFuZAorCSJiYWNrdHJhY2UgZnJvbSBjYWxsX2FmdGVyX2FsbG9jYV9zdWJyIgorCWlmIG5vdCBjb21waWxlZCB3aXRoIGdjYy4KKwkobG9jYWx2YXJzX2luX2luZGlyZWN0X2NhbGwpOiBBZGQgcnM2MDAwLSotKiB4ZmFpbCBmb3IKKwkicHJpbnQgYyBpbiBsb2NhbHZhcnNfaW5faW5kaXJlY3RfY2FsbCIgYW5kCisJInByaW50IGMgaW4gbG9jYWx2YXJzX2luX2luZGlyZWN0X2NhbGwiIGFuZAorCSJiYWNrdHJhY2UgaW4gaW5kaXJlY3RseSBjYWxsZWQgZnVuY3Rpb24iIGFuZAorCSJzdGVwcGluZyBpbnRvIGluZGlyZWN0bHkgY2FsbGVkIGZ1bmN0aW9uIgorCWlmIG5vdCBjb21waWxlZCB3aXRoIGdjYy4KKwkobG9jYWx2YXJzX2FmdGVyX2FsbG9jYSk6IEFkZCByczYwMDAtKi0qIHhmYWlsIGZvcgorCSJwcmludCBjIGFmdGVyIHJ1bnRvIGxvY2FsdmFyc19hZnRlcl9hbGxvY2EiIGFuZAorCSJwcmludCBzIGFmdGVyIHJ1bnRvIGxvY2FsdmFyc19hZnRlcl9hbGxvY2EiIGFuZAorCSJwcmludCBpIGFmdGVyIHJ1bnRvIGxvY2FsdmFyc19hZnRlcl9hbGxvY2EiIGFuZAorCSJwcmludCBsIGFmdGVyIHJ1bnRvIGxvY2FsdmFyc19hZnRlcl9hbGxvY2EiCisJZm9yIGFsbCBjb21waWxlcnMuCisJKiBnZGIuYmFzZS93aGF0aXMuZXhwOiBTb3VyY2UgZ2RiLmJhc2Uvd2hhdGlzLmNpIHJhdGhlcgorCXRoYW4gd2hhdGlzLWluZm8uZXhwLgorCSogZ2RiLmJhc2Uvb3BhcXVlLmV4cDogU291cmNlIGdkYi5iYXNlL29wYXF1ZTAuY2kgcmF0aGVyCisJdGhhbiBvcGFxdWUtaW5mby5leHAuCisJU2V0dXAgcnM2MDAwLSotKiB4ZmFpbCBmb3IKKwkicHR5cGUgb24gb3BhcXVlIHN0cnVjdCBwb2ludGVyIChzdGF0aWNhbGx5KSIgYW5kIAorCSJwdHlwZSBvbiBvcGFxdWUgc3RydWN0IHBvaW50ZXIgKGR5bmFtaWNhbGx5KSIgd2hlbgorCW5vdCBjb21waWxlZCB3aXRoIGdjYy4KKwkqIGdkYi5iYXNlL2NhbGxmdW5jcy5leHA6IFNvdXJjZSBnZGIuYmFzZS9jYWxsZnVuY3MuY2kKKwlyYXRoZXIgdGhhbiBjYWxsZi1pbmZvLmV4cC4KKwkoZG9fZnVuY3Rpb25fY2FsbHMpOiAgQWRkIGNsZWFyX3hmYWlsIGZvciByczYwMDAtKi0qIGZvcgorCSJwIHRfZmxvYXRfdmFsdWVzMigzLjE0MTU5LGZsb2F0X3ZhbDIpIi4gIFNlZW1zIHRvIHdvcmsKKwlmaW5lIHRoZXJlLCBib3RoIHdpdGggeGxjIGFuZCBnY2MuICBOZWVkIHRvIGZpbmQgb3V0IHdoYXQKKwlpdCBpcyBkb2luZyByaWdodCBhbmQgZml4IG90aGVyIHBsYXRmb3Jtcy4KKwkqIGdkYi5iYXNlL2NhbGxmdW5jcy5leHA6IEFkZCByczYwMDAtKi0qIHhmYWlsIGZvcgorCSJjYWxsIGluZmVyaW9yIGZ1bmMgd2l0aCBzdHJ1Y3QgLSByZXR1cm5zIGludCIsCisJImNhbGwgaW5mZXJpb3IgZnVuYyB3aXRoIHN0cnVjdCAtIHJldHVybnMgbG9uZyIsCisJImNhbGwgaW5mZXJpb3IgZnVuYyB3aXRoIHN0cnVjdCAtIHJldHVybnMgZmxvYXQiLAorCSJjYWxsIGluZmVyaW9yIGZ1bmMgd2l0aCBzdHJ1Y3QgLSByZXR1cm5zIGRvdWJsZSIsCisJImNhbGwgaW5mZXJpb3IgZnVuYyB3aXRoIHN0cnVjdCAtIHJldHVybnMgY2hhciAqIiwKKwlidXQgb25seSBpZiBub3QgZ2NjIGNvbXBpbGVkIChwcmVzdW1lcyB4bGMgY29tcGlsZWQpLgorCUNoYW5nZSByczYwMDAtKi0qIHhmYWlscyBmb3IKKwkiY2FsbCBpbmZlcmlvciBmdW5jIHdpdGggc3RydWN0IC0gcmV0dXJucyBjaGFyIiBhbmQKKwkiIGNhbGwgaW5mZXJpb3IgZnVuYyB3aXRoIHN0cnVjdCAtICByZXR1cm5zIHNob3J0IiB0byBvbmx5CisJeGZhaWwgaWYgbm90IHVzaW5nIGdjYy4KKwkoY2xlYW4gbW9zdGx5Y2xlYW4pOiAgUmVtb3ZlICouY2kgYW5kICoudG1wIGZpbGVzLgorCSogZ2RiLmMrKy90ZW1wbGF0ZXMuZXhwOiBTb3VyY2UgZ2RiLmMrKy90ZW1wbGF0ZXMuY2kgcmF0aGVyCisJdGhhbiB0ZW1wbC1pbmZvLmV4cC4KKwkqIGdkYi5iYXNlL2xhbmdzLmV4cDogIFNvdXJjZSBnZGIuYmFzZS9sYW5ncy5jaS4KKwlBZGQgcnM2MDAwLSotKiB4ZmFpbCBmb3IgInVwIHRvIGZvbyBpbiBsYW5ncy5leHAiCisJInVwIHRvIGNwcHN1Yl8gaW4gbGFuZ3MuZXhwIiBhbmQgInVwIHRvIGZzdWIgaW4gbGFuZ3MuZXhwIgorIAl3aGVuIG5vdCBnY2MgY29tcGlsZWQuCisJCitTYXQgQXVnIDEyIDE1OjA1OjM2IDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9jYWxsZnVuY3MuZXhwOiBBZGQgeGZhaWxzIGZvciB0aGUgcG93ZXJwYy4KKwkqIGdkYi5iYXNlL2NvcmVmaWxlLmV4cDogTGlrZXdpc2UuCisJKiBnZGIuYmFzZS9saXN0LmV4cDogTGlrZXdpc2UuCisJKiBnZGIuYmFzZS9zY29wZS5leHA6IExpa2V3aXNlLgorCSogZ2RiLmJhc2Uvc2lnYW5scy5leHA6IExpa2V3aXNlLgorCisJKiBnZGIuYmFzZS9ub2RlYnVnLmV4cDogQWRkIHhmYWlscyBmb3IgdGhlIHBvd2VycGMuICBIYW5kbGUgYWl4NAorCWNvbXBpbGVyIG91dHB1dC4KKwkqIGdkYi5iYXNlL3doYXRpcy5leHA6IExpa2V3aXNlLgorCitGcmkgQXVnIDExIDEzOjM2OjIwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnZGIuZGlzYXNtL3NoMy5leHAgKGFsbF9mcF9taXNjX3Rlc3RzKTogTm8gbG9uZ2VyIGV4cGVjdCBhCisJZmFpbHVyZSAob3Bjb2RlIHRhYmxlIGhhcyBiZWVuIGZpeGVkIHRvIG1hdGNoIHJlYWxpdHkpLgorCitNb24gQXVnIDE0IDA5OjAxOjU5IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9jYWxsZnVuY3MuZXhwOiBBZGQgcnM2MDAwLSotKiB4ZmFpbHMgZm9yCisJImNhbGwgaW5mZXJpb3IgZnVuYyB3aXRoIHN0cnVjdCAtIHJldHVybnMgY2hhciIsCisJImNhbGwgaW5mZXJpb3IgZnVuYyB3aXRoIHN0cnVjdCAtIHJldHVybnMgc2hvcnQiCisKKwkqIGdkYi5iYXNlL3Njb3BlLmV4cDogUmVtb3ZlIHJzNjAwMC0qLSogeGZhaWxzIGZvcgorCSJwcmludCAnc2NvcGUwLmMnOjpmaWxlbG9jYWwgYXQgbWFpbiIsCisJInByaW50ICdzY29wZTAuYyc6OmZpbGVsb2NhbF9ic3MgaW4gdGVzdF9hdF9tYWluIiwKKwkicHJpbnQgJ3Njb3BlMC5jJzo6ZmlsZWxvY2FsIGF0IGZvbyIsCisJInByaW50ICdzY29wZTAuYyc6OmZpbGVsb2NhbF9ic3MgaW4gdGVzdF9hdF9mb28iLAorCSJwcmludCAnc2NvcGUwLmMnOjpmaWxlbG9jYWwgYXQgYmFyIiwKKwkicHJpbnQgJ3Njb3BlMC5jJzo6ZmlsZWxvY2FsX2JzcyBpbiB0ZXN0X2F0X2JhciIKKwkKKwkqIGdkYi5iYXNlL2xpc3QuZXhwOiBSZW1vdmUgcnM2MDAwLSotKiB4ZmFpbCBmb3IgImxpc3QgZnVuY3Rpb24KKwlpbiBzb3VyY2UgZmlsZSAxIi4gIFRoaXMgYnVnIHNlZW1zIHRvIGhhdmUgYmVlbiBmaXhlZCB3aXRoIGJvdGgKKwlnY2MgYW5kIG5hdGl2ZSBjYyAod2FzIG5hdGl2ZSBhc3NlbWJsZXIgYnVnPykuCisKK1dlZCBBdWcgIDkgMDg6MDQ6MTIgMTk5NSAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL2ExLXNlbGZ0ZXN0LmV4cDogQ2hhbmdlICJpKjg2LSotc3lzdjQiIHhmYWlsIGZvcgorCSJiYWNrdHJhY2UgdGhyb3VnaCBzaWduYWwgaGFuZGxlciIgdG8gImkqODYtKi1zeXN2NCoiLgorCSogZ2RiLmJhc2Uvc2lnbmFscy5leHA6IEFkZCB4ZmFpbCBmb3IgIiduZXh0JyBiZWhhdmVkIGFzCisJY29udGludWUiIGNhc2UuICBBZGQgImtub3duIFNWUjQgYnVnIiB0byBmYWlsIG1lc3NhZ2UuCisJQWRkICJpKjg2LSotYnNkaTIuMCIgeGZhaWwgZm9yICJoYW5kbGUgYWxsIHByaW50Ii4KKwlBZGQgImkqODYtKi1ic2RpMi4wIiB4ZmFpbCBmb3IgImJhY2t0cmFjZSBpbiBzaWduYWxzX3Rlc3RzXzEiLgorCSogZ2RiLmJhc2UvcHR5cGUuZXhwOiBBZGQgImkqODYtKi1zeXN2NCoiIHhmYWlsIGZvcgorCSJ3aGF0aXMgdW5uYW1lZCB0eXBlZGVmJ2QgZW51bS4uLiIgYW5kICJwdHlwZSB0X2NoYXJfYXJyYXkiLgorCSogZ2RiLmJhc2UvbGFuZ3MuZXhwOiBBZGQgImkqODYtKi1zeXN2NCoiIHhmYWlsIGZvcgorCSJ1cCB0byBmb28gaW4gbGFuZ3MuZXhwIiwgInNob3cgbGFuZ3VhZ2UgYXQgZm9vIGluCisJbGFuZ3MuZXhwIiwgInVwIHRvIGNwcHN1Yl8gaW4gbGFuZ3MuZXhwIiwgInNob3cKKwlsYW5ndWFnZSBhdCBjcHBzdWJfIGluIGxhbmdzLmV4cCIsICJ1cCB0byBmc3ViIGluCisJbGFuZ3MuZXhwIiwgYW5kICJzaG93IGxhbmd1YWdlIGF0IGZzdWIgaW4gbGFuZ3MuZXhwIi4KKwkqIGdkYi5iYXNlL2NvcmVmaWxlLmV4cDogQWRkICJpKjg2LSotc3lzdjQqIiB0byB4ZmFpbCBmb3IKKwkiYmFjdHJhY2UgaW4gY29yZWZpbGUuZXhwIi4KKwkqIGdkYi5iYXNlL2NhbGxmdW5jcy5leHA6IENoYW5nZSB4ZmFpbCB0byAiaSo4Ni0qLSoiIGZvcgorCSJjYWxsIGluZmVyaW9yIGZ1bmN0aW9uIHdpdGggc3RydWN0IC0gcmV0dXJucyBmbG9hdCIgYW5kCisJImNhbGwgaW5mZXJpb3IgZnVuY3Rpb24gd2l0aCBzdHJ1Y3QgLSByZXR1cm5zIGRvdWJsZSIuCisJCitNb24gQXVnICA3IDAyOjQzOjI4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnZGIuZGlzYXNtL3NoMy5zOiBTb3VyY2UgZm9yIHNoMyBkaXNhc3NlbWJsZXIgdGVzdHMuCisJKiBnZGIuZGlzYXNtL3NoMy5leHA6IFJ1biB0aGUgc2gzIGRpc2Fzc2VtYmxlciB0ZXN0cy4KKwkqIGdkYi5kaXNhc20vY29uZmlndXJlLmluIChzaC0qLSopOiBVc2Ugc2gzLm10IG1ha2VmaWxlIGZyYWdtZW50LgorCSogZ2RiLmRpc2FzbS9zaDMubXQ6IE1ha2VmaWxlIGZyYWdtZW50IGZvciBzaDMgZXN0cy4KKworTW9uIEF1ZyAgNyAwODowOTozNyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKENISUxMX0ZPUl9UQVJHRVQpOiBVc2UgcHJldmlvdXNseSBkZWZpbmVkCisJKG9yIG92ZXJyaWRlbikgIkNISUxMIiBtYWNybyByYXRoZXIgdGhlbiBiYXJlICJnY2MiLgorCUFsc28gbG9vayBmb3IgLi4vLi4vZ2NjL3hnY2Mgc2luY2UgdGhhdCBpcyB3aGF0IHdlIHdpbGwKKwlhY3R1YWxseSBuZWVkLCBub3QgIk1ha2VmaWxlIi4gIFJlbW92ZSBmb2xsb3dpbmcgYXNzaWdubWVudAorCW9mIENISUxMIHRvIENISUxMX0ZPUl9UQVJHRVQgYmVjYXVzZSB0aGF0IHJlc3VsdHMgaW4KKwlyZWN1cnNpdmUgZGVmaW5pdGlvbi4KKworU3VuIEF1ZyAgNiAxNjo1MjoyOSAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvY29yZWZpbGUuZXhwOiAgQ2hhbmdlIHhmYWlsIGZvciBiYWNrdHJhY2UgaW4KKwljb3JlZmlsZS5leHAgZnJvbSBsaW51eGFvdXQgdG8gYWxsIGxpbnV4LgorCSogZ2RiLmJhc2Uvc2lnYWxsLmV4cCAodGVzdF9vbmVfc2lnKTogIFNwZWNpZmljYWxseSBkZWFsIHdpdGgKKwljYXNlcyB3aGVyZSB3ZSBtaXNzIHRoZSBicmVha3BvaW50IGF0IHRoZSBzaWduYWwgaGFuZGxlcgorCWZvciBzb21lIHJlYXNvbi4gIFNldHVwIHhmYWlsIGZvciBsaW51eG9sZGxkL2xpbnV4YW91dCBhbmQKKwlnZXR0aW5nIFNJR0lPLiAgU2V0dXAgeGZhaWwgZm9yIGxpbnV4b2xkbGQvbGludXhhb3V0IGZvcgorCWhpdHRpbmcgU0lHVVJHIGJyZWFrcG9pbnQuCisJKiBnZGIuYmFzZS9zaWduYWxzLmV4cDogIFNldHVwIHhmYWlsIGZvciAibmV4dCIgYWN0aW5nIGxpa2UKKwljb250aW51ZSB0byBhZGQgbGludXhvbGRsZC4gIFNldHVwIHhmYWlsIGZvciBhbGwgbGludXggZm9yCisJIm5leHQgdG8gaGFuZGxlciBpbiBzaWduYWxzX3Rlc3RzXzEiLCAiYmFja3RyYWNlIGluCisJc2lnbmFsc190ZXN0c18xIiwgImNvbnRpbnVlIHRvIGZ1bmMxIiwgInBhc3MgU0lHVVNSMSIsCisJYW5kIGNvbnRpbnVlIHRvIGhhbmRsZXIiLgorCitUaHUgQXVnICAzIDEwOjQ1OjM3IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBVcGRhdGUgYWxsIEZTRiBhZGRyZXNzZXMgZXhjZXB0IHRob3NlIGluIENPUFlJTkcqIGZpbGVzLgorCitTdW4gSnVsIDMwIDE3OjUwOjM1IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9hMi1ydW4uZXhwOiBDaGFuZ2UgbWVzc2FnZXMgdG8gYmUgbW9yZSBleHBsaWNpdCBhYm91dAorCXRoZSBzdGF0dXMgb2YgYXJncywgYW5kIHF1b3RlIGJpbmZpbGUgaW4gcmVzdWx0cy4KKworU3VuIEp1bCAzMCAxMDoyNDoyMCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvY2FsbGZ1bmNzLmV4cDogQWRkIHRlc3RzIGZvciBwYXNzaW5nIHN0cnVjdHMgdG8KKwlpbmZlcmlvciBmdW5jdGlvbnMgYW5kIHJldHVybiB2YXJpb3VzIHR5cGVzLgorCSogZ2RiLmJhc2UvY2FsbGZ1bmNzLmM6IEFkZCBmdW5jdGlvbnMgdG8gcmVjZWl2ZSBhIHN0cnVjdAorCWFuZCByZXR1cm4gYSBtZW1iZXIgb2YgdGhlIHN0cnVjdCwgaW4gdmFyaW91cyB0eXBlcy4KKworU2F0IEp1bCAyOSAxNDoyMjozMyAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi5iYXNlL01ha2VmaWxlLmluIChjbGVhbik6ICBSZW1vdmUgY2FsbGYtaW5mby5leHAuCisKK0ZyaSBKdWwgMjggMTM6MzY6MTEgMTk5NSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgorCisJKiBjb25maWcvdnh3b3JrczI5ay5leHA6IE5ldyBmaWxlLCBzb3VyY2VzIHZ4d29ya3MuZXhwLgorCitGcmkgSnVsIDI4IDAwOjI4OjM2IDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgorCisJKiBjb25maWcvZ2RicmVtb3RlLmV4cDogTmV3IGZpbGUuICBUZXN0aW5nIGZyYW1ld29yayB1c2luZworCWdkYnNlcnZlci4KKworVGh1IEp1bCAyNyAxMjoxNzoxNCAxOTk1ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZ2RiLmJhc2UvaW50ZXJydXB0LmV4cDogU2V0dXAgImkqODYtKi1saW51eCIgeGZhaWwgZm9yCisJImNhbGwgZnVuY3Rpb24gd2hlbiBhc2xlZXAiIGFuZCAic2VuZCBlbmQgb2YgZmlsZSIuCisJKiBnZGIuYmFzZS9jb3JlZmlsZS5leHA6IEFkZCAiaSo4Ni0qLWxpbnV4YW91dCIgdG8geGZhaWwgbGlzdAorCWZvciAiYmFja3RyYWNlIGluIGNvcmVmaWxlLmV4cCIuCisJKiBnZGIuYmFzZS9hMS1zZWxmdGVzdC5leHA6IEFkZCAiaSo4Ni0qLWxpbnV4KiIgdG8geGZhaWwgbGlzdAorCWZvciAiYmFja3RyYWNlIHRocm91Z2ggc2lnbmFsIGhhbmRsZXIiLgorCSogZ2RiLmJhc2UvY29yZWZpbGUuZXhwOiBNYWtlIHN1cmUgd2UgYWN0dWFsbHkgZ2VuZXJhdGUgYSBjb3JlIGZpbGUKKwliZWZvcmUgdHJ5aW5nIHRoZSBjb3JlIHRlc3RzLiAgU29tZSBzeXN0ZW1zIGFsbG93IHRoZSB1c2VyIHRvIHN1cHByZXNzCisJZ2VuZXJhdGlvbiBvZiBjb3JlIGZpbGVzIGFuZCBkZWZhdWx0IHRvIHRoYXQgKGxpbnV4IGZvciBleGFtcGxlKS4KKwkqIGdkYi5iYXNlL3NpZ25hbHMuZXhwOiBDaGFuZ2UgeGZhaWwgZm9yICJuZXh0IiBhY3RpbmcgbGlrZSAiY29udGludWUiCisJZnJvbSAiaSo4Ni0qLWxpbnV4IiB0byAiaSo4Ni0qLWxpbnV4YW91dCIuICBXb3JrcyB3aXRoIEVMRiBiZXRhLgorCitUdWUgSnVsIDI1IDE3OjMwOjEwIDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgorCisJKiBnZGIudGhyZWFkczogTmV3IGRpcmVjdG9yeSB3aXRoIHNvbWUgY3J1ZGUgbXVsdGktdGhyZWFkZWQKKwlnZGIgdGVzdHMgKHN0ZXAuZXhwIGFuZCBzdGVwMi5leHApLgorCSogY29uZmlnL210LWx5bnggKFNURVBfRVhFQ1VUQUJMRSk6IERlZmluZS4KKwkoVEhSRUFERkxBR1MpOiBEZWZpbmUuCisKK1R1ZSBKdWwgMjUgMDE6MDM6NTIgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdkYi5iYXNlL3NpZ2FsbC5leHA6IEF2b2lkIGxvc2luZyBpbiBTSUdQUklPIHRlc3Qgb24gbHlueC4KKworCSogZ2RiLmJhc2Uvc2lnbmFscy5leHA6IERpc2FibGUgd2hvbGUgZmlsZSBmb3IgbHlueCB1bnRpbAorCWZ1cnRoZXIgbm90aWNlLgorCisJKiBnZGIuYmFzZS9zaWduYWxzLmV4cDogeGZhaWwgdGVzdCB3aGVyZSAibmV4dCIgYWN0cyBsaWtlCisJImNvbnRpbnVlIiBmb3IgbHlueC4KKworCSogZ2RiLmJhc2UvaW50ZXJydXB0LmV4cDogeGZhaWwgdGVzdCBmb3IgY2FsbGluZyBmdW5jdGlvbiB3aGlsZQorCWluZmVyaW9yIGlzIGFzbGVlcCBmb3IgbHlueC4KKworCSogZ2RiLmJhc2Uvd2F0Y2hwb2ludC5leHA6IEhhbmRsZSBtb3JlIGNhc2VzIG9mIGdkYiBlY2hvaW5nIG1vcmUKKwl0aGFuIG9uZSBjci1sZglhZnRlciBlYWNoIGNvbW1hbmQuCisKK1N1biBKdWwgMjMgMjM6MzM6MTggMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBjb25maWd1cmUuaW46ICBSZWluc3RhdGUgc2V0dGluZyBvZiBzdGFic2RpcnMgdmFyaWFibGUsIGZpeAorCXR5cG8gaW4gc2V0dGluZyB1cCBjb25maWdkaXJzIGZvciBuYXRpdmUgYnVpbGRzLgorCisJKiBnZGIuYmFzZS9yZXR1cm4uZXhwOiAgRml4IHR5cG8gaW4gcmV0dXJuIGRvdWJsZSB0ZXN0LgorCSogZ2RiLmJhc2UvcmV0dXJuLmMgKHRtcDIsIHRtcDMpOiAgTWFkZSBnbG9iYWwgdG8gaW5oaWJpdCB0aGUKKwljb21waWxlciBmcm9tIG9wdGltaXppbmcgdGhlbSBhd2F5LgorCitGcmkgSnVsIDIxIDExOjM5OjM0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnZGIuYmFzZS9nZGJ2YXJzLmV4cDogRXhwZWN0IHplcm8gb3IgbW9yZSBhZGRpdGlvbmFsIGNyLWxmCisJc2VxdWVuY2VzIHRvIGJlIGVjaG8nZCBieSBnZGIgd2hlbiB1c2luZyBnZGJfdGVzdC4KKwkqIGdkYi5jaGlsbC9jaGV4cC5leHA6IExpa2V3aXNlLgorCSogZ2RiLmZvcnRyYW4vZXhwcnMuZXhwOiBMaWtld2lzZQorCitUaHUgSnVsIDIwIDEzOjI4OjM2IDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9hMS1zZWxmdGVzdC5leHA6IFJlc2V0IHRoZSB0aW1lb3V0IHZhbHVlIHRvIDMwIHNlY29uZHMKKwlhZnRlciB0aGUgaW5mZXJpb3IgZ2RiIGhhcyBzdGFydGVkLgorCisJKiBnZGIuYmFzZS9hMi1ydW4uZXhwOiBIYW5kbGUgZ2RiIGVjaG9pbmcgbW9yZSB0aGFuIG9uZSBjci1sZgorCWFmdGVyIGVhY2ggY29tbWFuZC4KKwkqIGdkYi5iYXNlL2Z1bmNhcmdzLmV4cDogTGlrZXdpc2UuCisJKiBnZGIuYmFzZS9nZGJ2YXJzLmV4cDogTGlrZXdpc2UuCisJKiBnZGIuYmFzZS9pbnRlcnJ1cHQuZXhwOiBMaWtld2lzZS4KKwkqIGdkYi5iYXNlL2xpc3QuZXhwOiBMaWtld2lzZS4KKwkqIGdkYi5iYXNlL3dhdGNocG9pbnQuZXhwOiBMaWtld2lzZS4KKwkqIGdkYi5jKysvZGVtYW5nbGUuZXhwOiBMaWtld2lzZS4KKwkqIGdkYi5jKysvaW5oZXJpdC5leHA6IExpa2V3aXNlLgorCSogZ2RiLmNoaWxsL2NoZXhwLmV4cDogTGlrZXdpc2UuCisJKiBnZGIuZm9ydHJhbi9leHBycy5leHA6IExpa2V3aXNlLgorCisJKiBnZGIuYmFzZS93YXRjaHBvaW50LmV4cDogRGlzYWJsZSB3YXRjaHBvaW50IHRyaWdnZXJlZCBpbiBzeXNjYWxsCisJdGVzdCBpZiB3ZSBjYW4ndCBoYW5kbGUgSU8gdG8vZnJvbSB0aGUgaW5mZXJpb3IuCisKKwkqIGdkYi5jKysvbWlzYy5leHA6IEFsd2F5cyBjaGVjayBmb3IgYSBwcm9ncmFtIGFscmVhZHkgYmVpbmcKKwlzdGFydGVkIGFmdGVyIHNlbmRpbmcgYSAicnVuIiBjb21tYW5kIHRvIGdkYi4KKworCSogZ2RiLmJhc2UvdHdpY2UuZXhwOiBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCisJKiBnZGIuY2hpbGwvY2hleHAuZXhwOiBSZW1vdmUgc2tpcF9jaGlsbF90ZXN0cyBjaGVjazsgdGhlc2UgdGVzdHMKKwlvbmx5IGRlcGVuZCBvbiBnZGIncyBleHByZXNzaW9uIGNvZGUsIG5vdCB0aGUgY2hpbGwgcnVudGltZS4KKworCSogZ2RiLmJhc2UvcmV0dXJuLmM6IFB1dCByZXR1cm4gdmFsdWVzIGludG8gdmFyaWFibGVzIHNvIHdlCisJY2FuIGhhdmUgZ2RiIHByaW50IHRoZW0gcmF0aGVyIHRoYW4gZGVwZW5kaW5nIG9uIHRoZSBwcm9ncmFtCisJdG8gcHJpbnQgdGhlbS4KKwkqIGdkYi5iYXNlL3JldHVybi5leHA6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KKworCSogbGliL2dkYi5leHA6IFByb3ZpZGUgZGVmYXVsdCB2YWx1ZSBmb3Igbm9pbmZlcmlvcmlvLgorCSogZ2RiLmJhc2UvaW50ZXJydXB0LmV4cDogU2tpcCB0ZXN0cyBpZiB3ZSBjYW4ndCBoYW5kbGUgSU8gdG8vZnJvbQorCXRoZSBpbmZlcmlvci4KKworCSogZ2RiLmJhc2UvYnJlYWsuZXhwOiBBbHdheXMgY2hlY2sgZm9yIGEgcHJvZ3JhbSBhbHJlYWR5IGJlaW5nCisJc3RhcnRlZCBhZnRlciBzZW5kaW5nIGEgInJ1biIgY29tbWFuZCB0byBnZGIuCisJKHRleHRfbmV4dF93aXRoX3JlY3Vyc2lvbik6IERvbid0IGNoZWNrIHRoZSBvdXRwdXQgZnJvbSB0aGUKKwlwcm9ncmFtJ3MgcHJpbnRmIHN0YXRlbWVudC4gIEluc3RlYWQganVzdCBtYWtlIHN1cmUgdGhlIHByb2dyYW0KKwlleGl0ZWQuCisKKwkqIGdkYi5iYXNlL2NvbW1hbmRzLmV4cDogUHJvdGVjdCB0ZXN0cyB3aGljaCBuZWVkIGFyZ3VtZW50cyB3aXRoCisJJG5vYXJncyBjb25kaXRpb25hbHMuCisKK1dlZCBKdWwgMTkgMjI6NDI6NDMgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBnZGIuYmFzZS9wcmludGNtZHMuZXhwOiAgQWRqdXN0IGV4cGVjdCBwYXR0ZXJucyBmb3IgYWRkcmVzc2VzCisJb2Ygc3RydWN0dXJlIG1lbWJlciBhcnJheXMgdG8gbWF0Y2ggZ2RiL3ZhbG9wcy5jOnZhbHVlX2FkZHIgY2hhbmdlLgorCitNb24gSnVsIDE3IDEwOjEyOjI3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnZGIuYmFzZS9hMS1zZWxmdGVzdC5leHA6IEZpeCB1bm1hdGNoZWQgcXVvdGVzIGluIG1hbnkgdGltZW91dAorCWNhc2VzLgorCitXZWQgSnVsIDEyIDEwOjIwOjA4IDE5OTUgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKGNvbmZpZ2RpcnMpOiAgUmVtb3ZlIGdkYi5jaGlsbCBmcm9tIGRlZmF1bHQgbGlzdAorCW9mIHN1YmRpcnMgYW5kIHRoZW4gYWRkIGl0IGJhY2sgaW4gb25seSBpZiBkb2luZyBhIG5hdGl2ZSBidWlsZC4KKwlUaGUgY3VycmVudCBjaGlsbCBjb21waWxlciBkb2VzIG5vdCB5ZXQgd29yayBpbiBhbnkgY3Jvc3MgYnVpbGQuCisJKiBSZXZlcnQgYWxsIHNpZ25hbCBjaGFuZ2VzIGZyb20gSnVsIDYuCisJKiBnZGIuYmFzZS97c2lnYWxsLmMgc2lnbmFscy5jfTogIERlZmluZSBhd2F5IHNpZ25hbCgpIGFuZCBhbGFybSgpCisJZm9yIHNoLWhtcyB0YXJnZXRzLCBhbGxvd2luZyB0aGVzZSB0ZXN0cyB0byBsaW5rLCB3aXRoIG5vIG90aGVyCisJY2hhbmdlcy4gIFRlc3RpbmcgaXMgc3VwcHJlc3NlZCBieSBzZXR0aW5nICJub3NpZ25hbHMiIGluIHNpdGUuZXhwLgorCitUaHUgSnVsICA2IDIwOjU4OjMwIDE5OTUgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKHNpZ25hbGRpcnMpOiBEZWZpbmUgYW5kIGFkZCB0byBjb25maWdkaXJzIGZvciBhbGwKKwl0YXJnZXRzIGV4Y2VwdCBzb21lIHNwZWNpZmljIG9uZXMgdGhhdCBhcmUga25vd24gdG8gbm90IHN1cHBvcnQgc2lnbmFscy4KKwlBbHNvIGNsZWFuIHVwIGZvcm1hdHRpbmcuCisJKiBnZGIuYmFzZS9NYWtlZmlsZS5pbiAoRVhFQ1VUQUJMRVMpOiAgUmVtb3ZlIHNpZ2FsbCBhbmQgc2lnbmFscy4KKwkoc2lnbmFscywgc2lnYWxsKTogIFJlbW92ZSBydWxlcyB0byBidWlsZC4KKwkqIGdkYi5iYXNlL3tzaWdhbGwuYywgc2lnYWxsLmV4cCwgc2lnbmFscy5jLCBzaWduYWxzLmV4cH06CisJTW92ZWQgdG8gbmV3IGdkYi5zaWduYWxzIGRpcmVjdG9yeS4KKwkqIGdkYi5zaWduYWxzOiBOZXcgdGVzdCBkaXJlY3RvcnkuCisJKiBnZGIuc2lnbmFscy97TWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbiwgc2lnYWxsLmMsIHNpZ2FsbC5leHAsCisJc2lnbmFscy5jIHNpZ25hbHMuZXhwfTogIE5ldyBvciBtb3ZlZCBmaWxlcy4KKworU3VuIEp1biAyNSAxMjo1NToxOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2RiLmJhc2UvaW50ZXJydXB0LmV4cDogRG9uJ3QgY2hva2UgaWYgJG5vaW50ZXJydXB0cyBkb2Vzbid0IGV4aXN0LgorCitXZWQgSnVuIDIxIDE2OjM1OjU1IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9yZXR1cm4uZXhwOiAgWGZhaWwgYHJldHVybiBkb3VibGUnIHRlc3QgZmFpbHVyZQorCW9uIGF0IGxlYXN0IFNvbGFyaXMgMi4zIGFuZCBoYW5kbGUgZnV0dXJlL3Bhc3QgdmVyc2lvbnMgb24KKwlhIGNhc2UgYnkgY2FzZSBiYXNpcyBhcyBhcHByb3ByaWF0ZS4gIEFsc28gdXBkYXRlIG1lc3NhZ2UKKwl0byBpbmNsdWRlIGkqODYgZmFpbHVyZXMuCisKK1dlZCBNYXkgMjQgMDc6MTA6MTAgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBDaGFuZ2UgdmFyaWFibGUgQ0ZMQUdTIHRvIFRFU1RTVUlURV9DRkxBR1MuCisKKwkqIGxpYi9nZGIuZXhwOiBGaXggY29tbWVudCB3aGljaCBlcnJvbmVvdXNseSBpZGVudGlmaWVkCisJZ2RiX2ZpbGVfY21kIGFzIGdkYl9sb2FkICh0aGUgMTkgTWF5IGNoYW5nZSB3YXMgaW4gZmFjdCB0bworCWdkYl9maWxlX2NtZCBub3QgZ2RiX2xvYWQpLgorCSogY29uZmlnL3VuaXgtZ2RiLmV4cCAoZ2RiX2xvYWQpOiBBZGQgInVwdmFyIHRpbWVvdXQgdGltZW91dCIuCisKKwkqIGdkYi5iYXNlL3NldHZhci5leHA6IE1ha2UgdGVzdCBuYW1lcyBjb25zaXN0ZW50IGJldHdlZW4gcGFzcyBhbmQKKwlmYWlsIGNhc2VzLiAgVXNlIGdkYl90ZXN0IG1vcmUuCisKK0ZyaSBNYXkgMTkgMDc6MjI6NTggMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGxpYi9nZGIuZXhwIChnZGJfbG9hZCk6IEFkZCAidXB2YXIgdGltZW91dCB0aW1lb3V0Ii4KKworTW9uIE1heSAxNSAyMzo1MDo1MSAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi5iYXNlL2hlbHAuZXhwOiAgRml4IGV4cGVjdGVkIGhlbHAgc3RyaW5nIGZvciBgc2hvdyBjb21tYW5kcycuCisKK1RodSBNYXkgMTEgMDc6NTU6MTEgMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGRlbmViLmN5Z251cy5jb20+CisKKwkqIGdkYi5zdGFicy94Y29mZi5zZWQ6IENoYW5nZSBOX0xTWU0gdG8gQ19ERUNMIG5vdCBDX0xTWU0uCisKKwkqIGdkYi5zdGFicy93ZWlyZC5leHA6IFJlbW92ZSB4ZmFpbCBmb3IgeGNvZmYgYml0Y2hpbmcgYWJvdXQgbGFjaworCW9mIGEgdGV4dCBzZWN0aW9uLgorCitUaHUgTWF5IDExIDE1OjAyOjI0IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBjb25maWcvbW9uaXRvci5leHAgKGdkYl90YXJnZXRfbW9uaXRvcik6ICBGaXggbG9vcCBpbnRlcmF0b3Igc28KKwl0aGF0IGxvb3AgZXZlbnR1YWxseSB0ZXJtaW5hdGVzLiAgRml4IENvbm5lY3Rpb24gcmVmdXNlZCBsb2dpYyBzbworCXRoYXQgdGVzdHN1aXRlIHdpbGwgZXhwaXJlIG5pY2VseS4KKworV2VkIE1heSAxMCAxNzo1NzozNSAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL2NwdTMyYnVnLmV4cCwgY29uZmlnL2VzdC5leHAsIGNvbmZpZy9ocHByby5leHAsCisJY29uZmlnL3JvbTY4ay5leHA6ICBOZXcgdGNsIGdsdWUgZm9yIHRoZSBhcHByb3ByaWF0ZSBtb25pdG9ycy4KKwlUaGVzZSBhbGwganVzdCBlbmQgdXAgY2FsbGluZyBtb25pdG9yLmV4cC4KKwkqIGNvbmZpZy9tb25pdG9yLmV4cCAoZ2RiX3RhcmdldF9tb25pdG9yKTogIEhhbmRsZSBgQ29ubmVjdGlvbgorCXJlZnVzZWQnIGJ5IHJldHJ5aW5nLiAgQ2xlYW51cCBzb21lIHRpbWVvdXQgaXNzdWVzLgorCSogKGdkYl9sb2FkKTogIFJlZHVjZSB0aW1lb3V0LiAgQ2xlYW51cCBzb21lIHRpbWVvdXQgaXNzdWVzLgorCSogbGliL2dkYi5leHAgKGdkYl90ZXN0IGdkYl90ZXN0X2V4YWN0KTogIFVwdmFyIHRpbWVvdXQgc28gdGhhdAorCWNhbGxlcnMgZG9uJ3QgaGF2ZSB0byBzZXQvcmVzdG9yZSBnbG9iYWwgdGltZW91dCB2YXJpYWJsZS4KKworCSogVGhlIGZvbGxvd2luZyBzZXQgb2YgY2hhbmdlcyBjZW50cmFsaXplcyBtYW5hZ2VtZW50IG9mIHRoZSBnbG9iYWwKKwl0aW1lb3V0CXZhcmlhYmxlLiAgVGhpcyB3YXksIGl0IGNhbiBiZSBzZXQgaW4gb25lIHRhcmdldCBkZXBlbmRlbnQKKwlwbGFjZSBpbnN0ZWFkIG9mIGRvemVucyBvZiBwbGFjZXMgc2NhdHRlcmVkIHRocm91Z2hvdXQgdGhlIHRlc3Qgc3VpdGUuCisJSWYgeW91IG5lZWQgdG8gbGVuZ3RoZW4gYSB0aW1lb3V0LCB0aGVuIHlvdSBzaG91bGQgZWl0aGVyIHNldCB0aW1lb3V0CisJaW4gb25lIG9mIHRoZSBjb25maWcve3RhcmdldH0uZXhwIGZpbGVzLCBvciBtdWx0aXBseSBpdCBieSBhIGZhY3Rvci4KKwlTZXR0aW5nIGl0IHRvIGFuIGFic29sdXRlIHZhbHVlIGlzIGFsd2F5cyBnb2luZyB0byBsb3NlIGZvciBzb21lCisJdGFyZ2V0cy4KKwkqIGdkYi5iYXNlL2ExLXNlbGZ0ZXN0LmV4cCAodGVzdF93aXRoX3NlbGYpOiAgT25seSB1c2UgbG9jYWwgdGltZW91dC4KKwkqIGdkYi5iYXNlL2NhbGxmdW5jcy5leHAgKGRvX2Z1bmN0aW9uX2NhbGxzKTogIERvbid0IHNldCB0aW1lb3V0LgorCSogZ2RiLmJhc2UvZnVuY2FyZ3MuZXhwOiAgRG9uJ3Qgc2V0IHRpbWVvdXQuCisJKiBnZGIuYmFzZS9saXN0LmV4cCAodGVzdF9mb3J3YXJkX3NlYXJjaCk6ICBPbmx5IHVzZSBsb2NhbCB0aW1lb3V0LgorCSogZ2RiLmJhc2UvcHJpbnRjbWRzLmV4cCAodGVzdF9wcmludF9zdHJpbmdfY29uc3RhbnRzCisJdGVzdF9wcmludF9hcnJheV9jb25zdGFudHMpOiAgRG9uJ3Qgc2V0IHRpbWVvdXQuCisJKiBnZGIuYmFzZS9wdHlwZS5leHA6ICBEb24ndCBzZXQgdGltZW91dC4KKwkqIGdkYi5iYXNlL3JlY3Vyc2UuZXhwOiAgRG9uJ3Qgc2V0IHRpbWVvdXQuCisJKiBnZGIuYmFzZS9yZXR1cm4uZXhwOiAgRG9uJ3Qgc2V0IHRpbWVvdXQuCisJKiBnZGIuYmFzZS93YXRjaHBvaW50LmV4cDogIERvbid0IHNldCB0aW1lb3V0LgorCSogZ2RiLmMrKy9jbGFzc2VzLmV4cCAoZG9fdGVzdHMpOiAgRG9uJ3Qgc2V0IHRpbWVvdXQuCisJKiBnZGIuYysrL3ZpcnRmdW5jLmV4cCAodGVzdF92aXJ0dWFsX2NhbGxzKTogIERvbid0IHNldCB0aW1lb3V0LgorCitXZWQgTWF5IDEwIDE2OjAzOjIzIDE5OTUgIFRvcmJqb3JuIEdyYW5sdW5kICA8dGVnZUBhZGRlci5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogTWFrZSBjbGVhbiB0YXJnZXRzIHdvcmsgYWxzbyB3aGVuIFNVQkRJUlMgaXMgZW1wdHkuCisKK01vbiBNYXkgIDEgMDc6MzI6NDggMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGxpYi9nZGIuZXhwOiBEaXNhYmxlIGNoaWxsIHRlc3RzIGZvciBpcml4NS4KKworV2VkIEFwciAyNiAwNzozNjowMyAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLmJhc2Uvc2NvcGUuZXhwOiBNYWtlIHRlc3QgbmFtZXMgdW5pcXVlLiAgVXNlIGdkYl90ZXN0LiAgTWFrZQorCWVhY2ggdGVzdCBwYXNzIG9yIGZhaWwuCisKK1N1biBBcHIgMjMgMjE6MzI6MzIgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL29wYXF1ZS5leHA6IFJlbW92ZSB4ZmFpbHMgZm9yIGFpeDsgcHJpbnQgYSB3YXJuaW5nIGlmCisJeGxjIG5vdCBnY2MuCisKK0ZyaSBBcHIgMjEgMTU6NDQ6MDIgMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AcnRsLmN5Z251cy5jb20pCisKKwkqIGNwdTMyYnVnLmV4cCBlc3QuZXhwIHJvbTY4ay5leHA6ICBEZWxldGUuICBVbmlmeSBpbnRvIG1vbml0b3IuZXhwLgorCitXZWQgQXByIDE5IDE3OjQxOjIxIDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9lc3QuZXhwOiAgRml4IGNvcHlyaWdodCBhbmQgY29tbWVudHMuICBSZW1vdmUgZGVhZCBjb2RlLgorCVVzZSB0YXJnZXRuYW1lLCBzZXJpYWxwb3J0IGFuZCBiYXVkIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIGZpeGVkCisJY29uc3RhbnRzLgorCSogY29uZmlnL3JvbTY4ay5leHA6ICBGaXggY29weXJpZ2h0IGFuZCBjb21tZW50cy4gIFJlbW92ZSBkZWFkIGNvZGUuCisJKiBjb25maWcvY3B1MzJidWcuZXhwOiAgTmV3IGZpbGUgdG8gc3VwcG9ydCBjcHUzMmJ1ZyBtb25pdG9ycy4KKworV2VkIEFwciAxOSAxMzo0NzoxNiAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLmJhc2Uvd2F0Y2hwb2ludC5leHA6IERvbid0IHJ1bgorCXRlc3Rfd2F0Y2hwb2ludF90cmlnZ2VyZWRfaW5fc3lzY2FsbCBmb3Igc3Vub3MuCisKK01vbiBBcHIgMTcgMTI6NDg6NTIgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL3ticmVhay5jLHJ1bi5jfTogRG9uJ3QgaW5jbHVkZSB2eFdvcmtzLmggb3Igc3RkaW9MaWIuaDsKKwl0aGV5IGRvbid0IHNlZW0gdG8gZXhpc3QuICBEbyBpbmNsdWRlIHN0ZGlvLmguCisKK0ZyaSBBcHIgMTQgMDk6NDA6MjIgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL2ExLXNlbGZ0ZXN0LmV4cDogQWRkIGFscGhhIHhmYWlsLgorCitNb24gQXByIDEwIDEzOjA3OjUwIDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIuYmFzZS93YXRjaHBvaW50LmMgKG1haW4pOiBQcm9tcHQgYmVmb3JlIGNhbGxpbmcgcmVhZCgpLgorCSogZ2RiLmJhc2Uvd2F0Y2hwb2ludC5leHAgKHRlc3Rfd2F0Y2hwb2ludF90cmlnZ2VyZWRfaW5fc3lzY2FsbCk6CisJUmV2aXNlIGFjY29yZGluZ2x5LiAgUmVtb3ZlIGNydWZ0IGFib3V0IHNlbmRpbmcgIjEyMyIgc2V2ZXJhbAorCXRpbWVzLCB1bnRpbCBpdCBnZXRzIG5vdGljZWQuICBDbGVhbiB1cCB0aGUgInByaW50IGJ1ZlswXSIgc3R1ZmYKKwlzbyB0aGF0IGl0IHBhc3NlcyBvciBmYWlscywgYW5kIHdhaXRzIGZvciBwcm9tcHRzIGluIHRoZSB1c3VhbCB3YXkuCisKK1N1biBBcHIgIDkgMDk6MDI6MzYgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL3JlY3Vyc2UuZXhwOiBGaXggY29tbWVudC4KKworCSogVE9ETzogUmVtb3ZlIGl0ZW0gYWJvdXQgcHJpbnRpbmcgdmFyaWFibGVzIGluIG5vZGVidWcuZXhwLiAgQWRkCisJaXRlbSBhYm91dCBlbmFibGluZyB0ZXN0cyB3aGljaCBhcmUgb25seSBydW4gb24gc29tZSB0YXJnZXRzLgorCisJKiBnZGIuYmFzZS93YXRjaHBvaW50LmV4cDogVmFyaW91cyBjbGVhbnVwcyAobWFrZSBlYWNoIHRlc3QgcGFzcyBvcgorCWZhaWwsIG1ha2UgdGVzdCBuYW1lcyB1bmlxdWUsIHVzZSBuZXcgZ2RiX3Rlc3QgY29udmVudGlvbgorCXJlZ2FyZGluZyBwYXR0ZXJuLCB1c2UgZ2RiX3Rlc3QgbW9yZSwgZXRjLikuCisKKwkqIGdkYi5iYXNlL2JpdGZpZWxkcy5leHA6IFZhcmlvdXMgY2xlYW51cHMgKG1ha2UgZWFjaCB0ZXN0IHBhc3Mgb3IKKwlmYWlsLCBtYWtlIHRlc3QgbmFtZXMgdW5pcXVlLCBldGMuKS4KKworU2F0IEFwciAgOCAwMjo0Nzo0NSAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi5iYXNlL25vZGVidWcuYzogIENoYW5nZSByZXR1cm4gdHlwZSBvZiB0b3AgYW5kIG1pZGRsZSB0bworCXNob3J0LgorCSogZ2RiLmJhc2Uvbm9kZWJ1Zy5leHA6ICBSZW1vdmUgeGZhaWxzIGZvciBlY29mZiBzeXN0ZW1zLCB0aGV5CisJYXJlIGZpeGVkIGJ5IHRoZSByZWNlbnQgbWRlYnVncmVhZC5jIGNoYW5nZXMuIEFsbG93IGBzaG9ydCAoKScKKwlhcyB0eXBlIGZvciB0b3AgYW5kIG1pZGRsZS4KKworVGh1IEFwciAgNiAwODo1NDoxOCAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLmJhc2UvYnJlYWsuZXhwOiBSZW1vdmUgY29tbWVudGVkIG91dCBpZiAkdXNlc3R1YnMge30uICBBcworCW5lYXJseSBhcyBJIGNhbiB0ZWxsLCB0aGUgd2hvbGUgdGhpbmcgd2FzIGFuIGFjY2lkZW50IGluIFN0dSdzCisJY2hhbmdlIG9mIDI0IE1hciAxOTk1IChsb2dnZWQgaW4gLi4vQ2hhbmdlTG9nKSwgaW4gd2hpY2ggaGUgbWVhbnQKKwl0byByZXBsYWNlIGEgc2VuZC9leHBlY3QgcGFpciB3aXRoIGdkYl90ZXN0LCBidXQgZW5kZWQgdXAgb25seQorCWFkZGluZyB0aGUgZ2RiX3Rlc3QuICBNeSBjaGFuZ2Ugb2YgMjQgTWFyIDE5OTUgYW5kIEt1bmcncyBjaGFuZ2UKKwlvZiAzMCBNYXIgMTk5NSB0b29rIGNhcmUgb2YgaXQsIGJ1dCBsZWZ0IHRoaXMgdmVzdGlnaWFsIGNvbW1lbnQKKwl3aGljaCBJIGFtIG5vdyBudWtpbmcuCisKK01vbiBBcHIgIDMgMDk6MDA6MjcgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL2JyZWFrLmV4cDogTG9vayBmb3IgZGlmZmVyZW50IGxpbmUgbnVtYmVyIGZvcgorCWJyZWFrcG9pbnQgYXQgbWFpbiBkZXBlbmRpbmcgb24gdXNlc3R1YnMuCisKK1N1biBBcHIgIDIgMDg6MTU6NDUgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBnZGIuYmFzZS9saXN0LmV4cDogIEFkanVzdCBzb21lIGFsdGVybmF0ZSBleHBlY3QgcGF0dGVybnMgdG8KKwltYXRjaCByZWNlbnQgbGlzdDAuYyBjaGFuZ2UuIEFkZCBhbHRlcm5hdGUgZXhwZWN0IHBhdHRlcm4gZm9yCisJb3V0cHV0IGZyb20gYGxpc3QgZGVmYXVsdCBsaW5lcyBhcm91bmQgbWFpbicgZm9yIG9wdGltaXppbmcKKwljb21waWxlcnMuCisKK1NhdCBBcHIgIDEgMDc6MjM6MjIgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGxpYi9nZGIuZXhwOiBJZiBub3NpZ25hbHMgaXMgbm90IHNldCwgc2V0IGl0IHRvIDAuCisKK0ZyaSBNYXIgMzEgMTY6MTM6NDggMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3NsaXRlLWdkYi5leHA6IFJlc3BvbmRzIHRvIGxvYWQgc3ltYm9sIHRhYmxlIHByb21wdC4KKwkqIGdkYi5iYXNlL2JyZWFrLmV4cDogQWRqdXN0IGxpbmUgbnVtYmVyLCBmaXggcmVydW4uCisJKiBnZGIuYmFzZS9sYW5nczAuYzogQWRkICNpZmRlZiB1c2VzdHVicy4KKworVGh1IE1hciAzMCAxNTozNjo1NSAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAbWV4aWNhbi5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9saXN0LmV4cDogQWRqdXN0IGxpbmUgY29udGVudHMgYWZ0ZXIgYWRkaW5nIG5ldyBsaW5lcyBpbgorCWxpc3QwLmMuIEFsc28gZml4IGEgc3ludGF4IGVycm9yLgorCisJKiBsaWIvZ2RiLmV4cCAoZ2RiX3J1bl9jbWQpOiBTcGVjaWFsIGhhbmRsaW5nIGZvciB0YXJnZXRzIHVzZSBzdHVicy4KKwkqIGdkYi5iYXNlL2JyZWFrLmV4cDogZGl0dG8uCisJKiBnZGIuYmFzZS9saXN0LmV4cDogZGl0dG8uCisJKiBnZGIuYmFzZS9iaXRmaWVsZHMuYzogQWRkICNpZmRlZiB1c2VzdHVicyBpbiBtYWluKCkuCisJKiBnZGIuYmFzZS9ydW4uYzogZGl0dG8uCisJKiBnZGIuYmFzZS9saXN0MC5jOiBkaXR0by4KKwkqIGdkYi5iYXNlL2Z1bmNhcmdzLmM6IGRpdHRvLgorCitXZWQgTWFyIDI5IDE3OjA5OjI5IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIHRlc3RzdWl0ZS9jb25maWcvcm9tNjhrLmV4cCAoZ2RiX3RhcmdldF9yb202OGspOiAgVXNlCisJJHRhcmdldG5hbWUsICRzZXJpYWxwb3J0IGFuZCAkYmF1ZCBpbnN0ZWFkIG9mIGhhcmR3aXJlZCB2YXJpYWJsZXMuCisJKiB0ZXN0c3VpdGUvZ2RiLmJhc2Uve3NpZ2FsbC5leHAgc2lnbmFscy5leHB9OiAgU2tpcCB0aGVzZSBpZiB0aGUKKwl0YXJnZXQgZG9lc24ndCBzdXBwb3J0IHNpZ25hbHMuCisKK1dlZCBNYXIgMjkgMTI6Mjk6MzQgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KKworCSogbGliL2dkYi5leHAgKHJ1bnRvX21haW4pOiBGaXggcmVndWxhciBleHByZXNzaW9uIGJ1ZywgYWRkIHJldHVybiAxLgorCitUdWUgTWFyIDI4IDA4OjQ2OjQ1IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIuYmFzZS9yZWN1cnNlLmV4cDogTWFrZSB0ZXN0IG5hbWVzIHVuaXF1ZS4gIENoYW5nZSBcXCgrIHRvIFxcKC4KKwlEb24ndCByZWx5IG9uIHRoZSB2YWx1ZSBvZiBhbiBhdXRvIHZhcmlhYmxlIGJlZm9yZSBpdCBoYXMgYmVlbgorCWluaXRpYWxpemVkLiAgVXNlIGdkYl90ZXN0IG1vcmUuCisKK01vbiBNYXIgMjcgMDg6MDA6MzQgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGxpYi9nZGIuZXhwIChkZWZhdWx0X2dkYl92ZXJzaW9uKTogQSB2ZXJzaW9uIG51bWJlciBtdXN0IHN0YXJ0CisJd2l0aCBhIGRpZ2l0LCBidXQgb3RoZXIgdGhhbiB0aGF0IGNvbnRhaW5zIGFsbCBjaGFyYWN0ZXJzIHVwIHRvCisJdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyLgorCitTdW4gTWFyIDI2IDEzOjE5OjMyIDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIuYmFzZS9jb21tYW5kcy5leHAgKGJyZWFrcG9pbnRfY29tbWFuZF90ZXN0KTogTmV3IHRlc3RzLgorCitTYXQgTWFyIDI1IDE1OjM4OjA2IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIuYysrLyouZXhwOiBXYXJuIGlmIGV4ZWN1dGFibGUgZG9lcyBub3QgZXhpc3QuICBUaGUgb3JpZ2luYWwKKwlyZWFzb24gZm9yIHNraXBwaW5nIHRoZSB3YXJuaW5nIHdhcyB0aGF0IGNvbmZpZ3VyZS5pbiBzb21ldGltZXMKKwlpbnRlbnRpb25hbGx5IHNraXBwZWQgYnVpbGRpbmcgdGhlIGV4ZWN1dGFibGVzIGJ1dCB0aGUgdGNsIGNvZGUKKwloYWQgbm8gd2F5IG9mIGtub3dpbmcuICBUaGF0IChhKSB3YXMgYWx3YXlzIGJvZ3VzIHdpdGggcmVzcGVjdCB0bworCWVycm9yIGhhbmRsaW5nLCAoYikgaXMgbm8gbG9uZ2VyIHRydWUgKHJpZ2h0IG5vdyB0aGVyZSBpcyBubyB3YXkKKwl0byBza2lwIEMrKyB0ZXN0cykuCisKKwkqIGdkYi5jKysvZGVtYW5nbGUuZXhwOiBSZW1vdmUgdW51c2VkIGJpbmZpbGUgYW5kIHNyY2ZpbGUgdmFyaWFibGVzLgorCitTYXQgTWFyIDI1IDAxOjE2OjEwIDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLmJhc2UvbGlzdC5leHA6ICBBZGQgZXhwZWN0IHBhdHRlcm5zIGZvciBvdXRwdXQgZnJvbQorCVN1blBSTyBjb21waWxlZCBleGVjdXRhYmxlcy4KKwkqIGdkYi5iYXNlL3doYXRpcy5leHA6ICBBbGxvdyBsZWFkaW5nIGBzaWduZWQnIGZvciBhbGwgdl9zaWduZWRfKgorCXR5cGVzLgorCitGcmkgTWFyIDI0IDA2OjExOjA1IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIuYmFzZS9icmVhay5leHAgKHRlc3RfbmV4dF93aXRoX3JlY3Vyc2lvbik6IEFjY2VwdCBhbnkgbGluZQorCW51bWJlciAod2UgYXJlIGFscmVhZHkgdGVzdGluZyB0aGF0IHRoZSBjb3JyZWN0IHNvdXJjZSBsaW5lIHRleHQKKwlnZXRzIHByaW50ZWQpLgorCisJKiBnZGIuYmFzZS9icmVhay5leHA6IE1ha2Ugb25lIHRlc3QgaWYgJHVzZXN0dWJzLiAgSSdtIG5vdCBzdXJlCisJdGhhdCBpcyB3aGF0IGlzIGludGVuZGVkLCBidXQgc29tZXRoaW5nIG5lZWRlZCB0byBiZSBkb25lIHRvIGdldAorCXN1bm9zNCBuYXRpdmUgd29ya2luZyBhZ2Fpbi4KKworCSogZ2RiLmMrKy9taXNjLmNjIChtYWluKTogRml4IHR5cG8gKCNpZmZlZiAtPiAjaWZkZWYpLgorCisJKiBnZGIuYmFzZS9hMS1zZWxmdGVzdC5leHAgKHRlc3Rfd2l0aF9zZWxmKTogUmVtb3ZlIGNvbW1lbnQgd2hpY2gKKwlhcHBhcmVudGx5IHdlbnQgd2l0aCBhICh2ZXJ5KSBvbGQgeGZhaWwuCisKK0ZyaSBNYXIgMjQgMTM6NDE6MDkgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvY2FsbGZ1bmNzLmV4cDogY2FsbCBydW50b19tYWluIGluc3RlYWQgb2YgcnVudG8gbWFpbi4KKwlydW50b19tYWluIGlzIGEgcHJvYyBpbiBnZGIuZXhwIHRoYXQgd2lsbCBkbyAnc3RlcCcgZm9yIHRhcmdldCB1c2UKKwlzdHVicy4KKwkqIGdkYi5iYXNlL2V4cHJzLmV4cDogZGl0dG8uCisJKiBnZGIuYmFzZS9pbnRlcnJ1cHQuZXhwOiBkaXR0by4KKwkqIGdkYi5iYXNlL29wYXF1ZS5leHA6IGRpdHRvLgorCSogZ2RiLmJhc2UvcHJpbnRjbWRzLmV4cDogZGl0dG8uCisJKiBnZGIuYmFzZS9wdHlwZS5leHA6IGRpdHRvLgorCSogZ2RiLmJhc2Uvc2NvcGUuZXhwOiBkaXR0by4KKwkqIGdkYi5iYXNlL3NldHZhci5leHA6IGRpdHRvLgorCSogZ2RiLmJhc2Uvc2lnbmFscy5leHA6IGRpdHRvLgorCSogZ2RiLmJhc2UvdHdpY2UuZXhwOiBkaXR0by4KKwkqIGdkYi5jKysvY2xhc3Nlcy5leHA6IGRpdHRvLgorCSogZ2RiLmMrKy9pbmhlcml0LmV4cDogZGl0dG8uCisJKiBnZGIuYysrL3RlbXBsYXRlcy5leHA6IGRpdHRvLgorCSogZ2RiLmJhc2UvYnJlYWsuZXhwOiBubyBydW4gYW5kIGhpdCBtYWluIGZvciBzdHVicy4gQ2hhbmdlIGxpbmUKKwludW1iZXJzIGZvciBicmVha3BvaW50cyBhbmQgaW5mbyBicmVha3BvaW50LgorCSogZ2RiLmJhc2UvYnJlYWsuYzogQWRkICNpZmRlZiB1c2VzdHVicyBmb3Igc2V0X2RlYnVnX3RyYXBzKCkgYW5kCisJYnJlYWtwb2ludCgpLgorCSogZ2RiLmJhc2UvY2FsbGZ1bmNzLmM6IGRpdHRvLgorCSogZ2RiLmJhc2UvZXhwcnM6IGRpdHRvLgorCSogZ2RiLmJhc2UvaW50ZXJydXB0LmM6IGRpdHRvLgorCSogZ2RiLmJhc2Uvb3BhcXVlMC5jOiBkaXR0by4KKwkqIGdkYi5iYXNlL3ByaW50Y21kcy5jOiBkaXR0by4KKwkqIGdkYi5iYXNlL3B0eXBlLmM6IGRpdHRvLgorCSogZ2RiLmJhc2Uvc2NvcGUwLmM6IGRpdHRvLgorCSogZ2RiLmJhc2Uvc2V0dmFyLmM6IGRpdHRvLgorCSogZ2RiLmJhc2Uvc2lnbmFscy5jOiBkaXR0by4KKwkqIGdkYi5iYXNlL3R3aWNlLmM6IGRpdHRvLgorCSogZ2RiLmMrKy9taXNjLmNjOiBkaXR0by4KKwkqIGdkYi5jKysvdGVtcGxhdGVzLmNjOiBkaXR0by4KKworRnJpIE1hciAyNCAwNjoxMTowNSAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3Z4LWdkYi5leHAsIGxpYi9nZGIuZXhwOiBSZWdleHAgY2xlYW51cHMgKFxbKFxdIC0+IFxcKCwgZXRjLikuCisKKwkqIGdkYi5iYXNlL2ExLXNlbGZ0ZXN0LmV4cDogRG9uJ3QgY2hlY2sgZm9yICMgZm9sbG93ZWQgYnkgYSBkaWdpdAorCXNvbWV3aGVyZSBiZXR3ZWVuIGByZWFkJyBhbmQgYG1haW4uYycuICBJJ20gcHJldHR5IHN1cmUgdGhlCisJcGF0dGVybiAiLiojXFswLTlcXS4qIiB3YXMgc2xvd2luZyBkb3duIHBhdHRlcm4gbWF0Y2hpbmcgYSBsb3QsCisJYW5kIGl0IGlzbid0IHBhcnRpY3VsYXJseSB1c2VmdWwuCisKKwkqIGdkYi5iYXNlL3Njb3BlLmV4cDogTWFrZSB0ZXN0IG5hbWVzIHVuaXF1ZS4gIFxbKFxdIC0+IFxcKC4KKworVGh1IE1hciAyMyAxNDo1ODozNSAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLmJhc2UvY29tbWFuZHMuZXhwIChpbmZydW5fYnJlYWtwb2ludF9jb21tYW5kX3Rlc3QpOiBOZXcgdGVzdC4KKworV2VkIE1hciAyMiAxODozNjowNSAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAbWV4aWNhbi5jeWdudXMuY29tPgorCisJKiBjb25maWcvbXQtc2xpdGU6IGFkZCBMSUJTIGFuZCAtbm9zdGRsaWIuCisJKiBjb25maWcvc2xpdGUtZ2RiLmV4cDogYWRkIHRoaXMgbmV3IGZpbGUgdG8gc3VwcG9ydCBzcGFyY2xpdGUgdGFyZ2V0LgorCitUdWUgTWFyIDIxIDIxOjQxOjA0IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy92eC1nZGIuZXhwIChnZGJfbG9hZCk6IFVwZGF0ZSB0ZXN0IG9mIHZ4d29ya3NfbGQgcmV0dXJuIGNvZGUuCisKKwkqIGdkYi5iYXNlL2EyLXJ1bi5leHA6IENoYW5nZSBhcmd1bWVudCB0byBpc3RhcmdldCBmcm9tCisJIiotKi12eHdvcmtzIiB0byAiKi0qLXZ4d29ya3MqIi4KKwkqIGdkYi5iYXNlL3ticmVhay5leHAsZGVmYXVsdC5leHAsc2NvcGUuZXhwfTogTGlrZXdpc2UuCisKK1R1ZSBNYXIgMjEgMTc6MDg6NDcgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KKworCSogbGliL2dkYi5leHA6IGFkZCBwcm9jIHJ1bnRvX21haW4sIGZvciB0YXJnZXRzIHRoYXQgdXNlIHN0dWJzLCB0aGlzCisJd2lsbCBub3QgcnVudG8gbWFpbiBidXQgZG8gYSAnc3RlcCcgdG8gc3RlcCBvdXQgb2YgYnJlYWtwb2ludCgpLgorCSogY29uZmlnL210LXNsaXRlOiBhZGQgLUR1c2VzdHVicy4KKworVHVlIE1hciAyMSAxMjoxNDoxMiAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLmJhc2UvcHJpbnRjbWRzLmV4cCAodGVzdF9hcnRpZmljaWFsX2FycmF5cyk6IFNlbmQgXlZACisJaW5zdGVhZCBvZiBqdXN0IEAuCisKKwkqIGdkYi5iYXNlL3NpZ25hbHMuZXhwOiBBZGQgdGVzdCBmb3IgImhhbmRsZSBhbGwgcHJpbnQiLgorCSogVE9ETzogUmVtb3ZlICJoYW5kbGUgYWxsIHByaW50Ii4gIEFsc28gcmVtb3ZlIGl0ZW0gYWJvdXQKKwljaGVja2luZyBjb3B5cmlnaHQgZGF0ZSAoSSBkb24ndCBsaWtlIHRoZSBpZGVhIG9mIGEgc3B1cmlvdXMgRkFJTAorCWJhc2VkIG9uIHdoZW4gd2UgcnVuIHRoZSB0ZXN0cykuCisKKwkqIGdkYi5iYXNlL3JlY3Vyc2UuZXhwOiBFbmFibGUgdGVzdCBmb3IgU3VuT1M0LiAgeGZhaWwgb25lIHRlc3QKKwlmb3IgU3VuT1M0IChyZWFzb24gZm9yIGZhaWx1cmUgbm90IGludmVzdGlnYXRlZCkuICBSZW1vdmUKKwlyZWR1bmRhbnQgdGVzdCBmb3IgJGJpbmZpbGUuCisKKwkqIGdkYi5iYXNlL25vZGVidWcuYyAoYXJyYXlfaW5kZXgpOiBDYWxsIG1hbGxvYy4KKworCSogZ2RiLmJhc2Uve2NvcmVmaWxlLmV4cCxkZWZhdWx0LmV4cH06IE1ha2UgbmFtZXMgb2YgInVwIiB0ZXN0cyB1bmlxdWUuCisKK01vbiBNYXIgMjAgMTA6MDg6MTcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdkYi5iYXNlL3JlY3Vyc2UuZXhwOiBVcGRhdGUgZ2RiX3Rlc3QgaW52b2NhdGlvbiB0byB1c2UgbmV3CisJY29udmVudGlvbnMgYW5kIHNsaWdodGx5IHNpbXBsaWZ5IHRoZSBtYXRjaGluZyByZWdleHAuCisKK0ZyaSBNYXIgMTcgMDU6NDM6MjggMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL2JyZWFrLmV4cDogVXBkYXRlIGdkYl90ZXN0IGludm9jYXRpb24gdG8gdXNlIG5ldworCWNvbnZlbnRpb24uCisKKwkqIGxpYi9nZGIuZXhwOiBJZiBub2FyZ3MgaXMgbm90IHNldCwgc2V0IGl0IHRvIDAuCisKKwkqIGdkYi5iYXNlL25vZGVidWcuZXhwOiBDb21tZW50IG91dCByZWR1bmRhbnQgdGVzdC4gIE1ha2UgbmFtZSBvZgorCXRlc3RzIHVuaXF1ZS4KKworCSogbGliL2dkYi5leHA6IFNraXAgQ0hJTEwgZm9yIEFJWCBhbmQgU29sYXJpcy4KKworVGh1IE1hciAxNiAxNjoyNzowNyAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLmJhc2Uvbm9kZWJ1Zy5leHA6IEl0IGlzIE9LIGlmIEdEQiB0aGlua3MgdG9wIGFuZCBtaWRkbGUgaGF2ZQorCW9uZSBhcmd1bWVudCBvZiB0eXBlICI8bm9uLWZsb2F0IHBhcmFtZXRlcj4iLgorCitXZWQgTWFyIDE1IDE1OjU0OjU2IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9yb202OGsuZXhwOiAgTmV3IGZpbGUgdG8gc3VwcG9ydCBNb3Rvcm9sYSBJRFAgYm9hcmQuCisJKiBnZGIuYmFzZS9hMi1ydW4uZXhwOiAgU2tpcCB0aGlzIGZpbGUgaWYgbm9hcmdzIGlzIHNldC4KKwkqIGdkYi5iYXNlL2JyZWFrLmM6ICBDaGFuZ2UgdGhpbmdzIGFyb3VuZCBzbyB0aGF0IHRoaXMgcHJvZ3JhbQorCWRvZXNuJ3QgZGVwZW5kIHVwb24gYXJncy4gIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgcmVtb3RlCisJdGFyZ2V0cyB3b3JrIChpbiBnZW5lcmFsLCB0aGV5IGNhbid0IHRha2UgYXJncykuCisJKiBnZGIuYmFzZS9icmVhay5leHA6ICBEb24ndCB0cnkgdG8gc2VuZCBhcmdzIHRvIHByb2dyYW0uICBEb24ndAorCWV4cGVjdCBvdXRwdXQuICBBbHNvLCByZXBsYWNlIGxvdHMgb2YgY29kZSB3aXRoIGdkYl90ZXN0LgorCitXZWQgTWFyIDE1IDA0OjExOjE0IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIuYmFzZS9wcmludGNtZHMuZXhwICh0ZXN0X2NoYXJhY3Rlcl9saXRlcmFsc19hY2NlcHRlZCk6IFRlc3QKKwlwcmludGluZyBvZiAnXCcnICh3aGljaCBpcyB3aGF0IHRoZSBjb21tZW50IHNheXMgd2UgYXJlIHRlc3RpbmcsCisJZXZlbiB0aG91Z2ggd2Ugd2VyZSBub3QpLCBub3QgJycnLgorCSh0ZXN0X2ludGVnZXJfbGl0ZXJhbHNfcmVqZWN0ZWQpOiBUZXN0IHRoYXQgcHJpbnRpbmcgJycnIGlzIGFuIGVycm9yLgorCisJKiBnZGIuZm9ydHJhbi9leHBycy5leHAsIGdkYi5mb3J0cmFuL3R5cGVzLmV4cCwKKwlnZGIuY2hpbGwvY2hleHAuZXhwLCBnZGIuYmFzZS9wcmludGNtZHMuZXhwLAorCWdkYi5jKysvY3BsdXNmdW5jcy5leHAsIGdkYi5jaGlsbC9jYWxsY2guZXhwLCBnZGIuY2hpbGwvbWlzYy5leHAsCisJZ2RiLmNoaWxsL3ByLTYyOTIuZXhwLCBnZGIuY2hpbGwvc3RyaW5nLmV4cCwgZ2RiLmNoaWxsL3R1cGxlcy5leHA6CisJVXNlIGdkYl90ZXN0IG5vdCB0ZXN0X3ByaW50X2FjY2VwdC4KKwkqIGxpYi9nZGIuZXhwOiBSZW1vdmUgdGVzdF9wcmludF9hY2NlcHQuCisKKwkqIGdkYi5iYXNlL3NpZ25hbHMuZXhwIChzaWduYWxfdGVzdHNfMSk6IE1ha2UgcGFzcyBtZXNzYWdlCisJY29uc2lzdGVudCB3aXRoIGZhaWwgbWVzc2FnZS4KKworCSogZ2RiLmJhc2Uvd2hhdGlzLmV4cDogUmVtb3ZlIHhmYWlscyBmb3IgcHJpbnRpbmcgY2hhciB2cy4KKwl1bnNpZ25lZCBjaGFyOyB0aGUgYnVnIChQUiAxODIxKSBpcyBmaXhlZC4KKworCSogZ2RiLmJhc2Uvc2NvcGUuZXhwOiBSZW1vdmUgeGZhaWxzIGZvciBQUnMgMTg0MyBhbmQgMTg2OC4KKworCSogZ2RiLmJhc2Uvc2NvcGUuZXhwICh0ZXN0X2F0X2xvY2Fsc2NvcGVzKTogQ2FsbCBwYXNzIGZvcgorCXN1Y2Nlc3NmdWwgdGVzdHMtLW1ha2VzIHhmYWlsaW5nIHRoZW0gd29yayByaWdodC4KKworVHVlIE1hciAxNCAwNzozOToxOSAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbGliL2dkYi5leHAgKGdkYl90ZXN0KTogQmV0d2VlbiAkcGF0dGVybiBhbmQgJHByb21wdCwgZXhwZWN0CisJb25seSBcclxuLCBub3QgLiouICBUaGUgdGVzdCBjYW4gcGFzcyAuKiBhcyB0aGUgbGFzdCB0aGluZyBpbgorCSRwYXR0ZXJuIGlmIHRoYXQgaXMgd2hhdCBpdCB3YW50cy4gIEluIGFkZGl0aW9uIHRvIHByb3ZpZGluZyB0aGlzCisJZmxleGliaWxpdHksIHRoaXMgY2hhbmdlIHNob3VsZCBzcGVlZCB1cCBwYXR0ZXJuIG1hdGNoaW5nIGluIGNhc2VzCisJd2hlcmUgdGhlIHBhdHRlcm4gYWxyZWFkeSBlbmRlZCB3aXRoIC4qICh0aGVyZSB3ZXJlIGEgbnVtYmVyIG9mCisJdGhlbSkuICBUaGlzIGNoYW5nZSBhbHNvIGhlbHBzIGNhdGNoIGJhZCBwYXR0ZXJucy0taW4gdGhlIG9sZAorCXNjaGVtZSB0aGUgdHlwbyAiY2hhciBcKiIgaW5zdGVhZCBvZiAiY2hhciBcXCoiIHdvdWxkIHBhc3MuICBOb3cKKwlpdCBpcyBjYXVnaHQuCisJKiBNYW55IC5leHAgZmlsZXM6IFVwZGF0ZSBjYWxsZXJzLgorCisJKiBnZGIuYmFzZS9mdW5jYXJncy5leHA6IFJlcGxhY2UgXFsoXF0rIHdpdGggXFwoLiAgVGhlIGxhdHRlciBpcworCWNsZWFyZXIgYW5kIGRvZXMgbm90IHNwdXJpb3VzbHkgbWF0Y2ggbXVsdGlwbGUgKCdzLiAgTGlrZXdpc2UgZm9yCisJKSBhbmQgKi4KKworCSogZ2RiLmJhc2Uvbm9kZWJ1Zy5leHA6IFRlc3QgYWJpbGl0eSB0byBjYWxsIGEgZnVuY3Rpb24gYW5kIHBhc3MKKwlpdCBhIHN0cmluZyAoZXZlbiB3aXRoIG5vIGRlYnVnZ2luZyBpbmZvKS4KKworCSogZ2RiLmJhc2UvcHJpbnRjbWRzLmV4cCAodGVzdF9pbnRlZ2VyX2xpdGVyYWxzX3JlamVjdGVkKTogQ2hhbmdlCisJInAgJ1wnIiwgd2hpY2ggaXMgdGhlIHNhbWUgYXMgInAgJyciIG9uY2UgdGNsIGdldHMgZG9uZSB3aXRoCisJcXVvdGluZywgdG8gInAgJ1xcJyIsIHdoaWNoIEkgc3VzcGVjdCBpcyB3aGF0IGlzIGludGVuZGVkIChvbmUKKwliYWNrc2xhc2ggZ2V0cyBzZW50IHRvIEdEQikuCisKKwkqIGdkYi5iYXNlL3ByaW50Y21kcy5leHAgKHRlc3RfYXJ0aWZpY2lhbF9hcnJheXMpOiBOZXcgdGVzdHMuCisKK0ZyaSBNYXIgMTAgMTM6MzE6NDYgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL2ExLXNlbGZ0ZXN0LmV4cDogUmVtb3ZlIHhmYWlsIGZvciBzb2xhcmlzLiAgVGhlIGJ1ZyAoUFIKKwkxODE3KSB3YXMgZml4ZWQgbGl0ZXJhbGx5IHllYXJzIGFnby4KKworRnJpIE1hciAxMCAwMjo0OTo0MCAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi5iYXNlL2Z1bmNhcmdzLmV4cCAoY2FsbF9hZnRlcl9hbGxvY2EpOiAgUmVtb3ZlIGBuZXh0JworCXRlc3QsIGl0IGNhdXNlcyBzdGVwcGluZyBvdXQgb2YgY2FsbF9hZnRlcl9hbGxvY2Ffc3ViciB3aXRoCisJb3B0aW1pemluZyBjb21waWxlcnMuCisJKGxvY2FsdmFyc19pbl9pbmRpcmVjdF9jYWxsKTogIENvbnN1bWUgR0RCIHByb21wdCBpZiBgZmluaXNoJworCWZhaWxzLgorCisJKiBnZGIuYysrL3RlbXBsYXRlcy5leHA6ICBTb3VyY2UgdGVtcGwtaW5mby5leHAgb25seSBpZgorCXRoZSB0ZW1wbGF0ZXMgZXhlY3V0YWJsZSBleGlzdHMuCisKKwkqIGdkYi5jKysvbWlzYy5jYyAoY2xhc3MgQ29udGFpbnNfc3RhdGljX2luc3RhbmNlLAorCWNsYXNzIENvbnRhaW5zX25lc3RlZF9zdGF0aWNfaW5zdGFuY2UpLAorCWdkYi5jKysvY2xhc3Nlcy5leHAgKHRlc3Rfc3RhdGljX21lbWJlcnMpOiAgVGVzdCBwcmludGluZyBvZgorCWEgY2xhc3MgdGhhdCBjb250YWlucyBhIHN0YXRpYyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MuCisKK1RodSBNYXIgIDkgMTE6NDM6NTUgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL2xhbmdzMi5jIChjcHBzdWJfKTogRG9uJ3QgcHJvdG90eXBlLgorCSogZ2RiLmJhc2UvbGFuZ3MyLmN4eCAoY3Bwc3ViXyk6IEZpeCBwcm90b3R5cGUgKGNvc21ldGljIHZhbHVlCisJb25seSwgSSBiZWxpZXZlKS4KKworV2VkIE1hciAgOCAxMDoyOTozMyAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbGliL2dkYi5leHAgKHNraXBfY2hpbGxfdGVzdHMpOiBOZXcgcHJvY2VkdXJlLgorCisJKiBnZGIuYmFzZS9zaWduYWxzLmV4cCAoc2lnbmFsX3Rlc3RzXzEpOiB4ZmFpbCBmb3IgaXJpeC4KKworTW9uIE1hciAgNiAxMDo0NDowNiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2RiLmRpc2FzbS9ocHBhLmV4cDogRGVsZXRlIHJlZHVuZGFudCAiLioiIGF0IHRoZSBiZWdpbm5pbmcgb2YKKwllYWNoIGV4cGVjdCBwYXR0ZXJuLiAgQ3V0cyBydW50aW1lIGZyb20gMTIgdG8gYWJvdXQgNCBzZWNvbmRzLgorCitUaHUgTWFyICAyIDA1OjMxOjM0IDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIuYmFzZS9sYW5ncy5leHA6IERvbid0IGluc2lzdCB0aGF0IGZvb19fRmkgYmUgZGVtYW5nbGVkLgorCisJKiBnZGIuZGlzYXNtL2hwcGEuZXhwIChhbGxfZnB1X2NvbXBhcmlzb25fdGVzdHMpOiBPbmx5CisJZGlzYXNzZW1ibGUgOCwgbm90IDE2LCBpbnN0cnVjdGlvbnMgZm9yIHBhcnQgNC4KKworCSogY29uZmlnL3Z4LWdkYi5leHAgKGdkYl9zdGFydCk6IFVzZSBcMDMwLCBub3QgXENYLiAgdGNsIGRvZXNuJ3QKKwlzdXBwb3J0IHRoZSBsYXR0ZXIgYW55bW9yZS4KKworCSogZ2RiLmJhc2UvTWFrZWZpbGUuaW46IFRyeSBjb21waWxpbmcgY2FsbGZ1bmNzLmMsIGlmIHRoYXQgZmFpbHMgdHJ5CisJLUROT19QUk9UT1RZUEVTLgorCSogZ2RiLmJhc2UvY2FsbGZ1bmNzLmM6IENvbnRyb2wgdXNlIG9mIHByb3RvdHlwZXMgYmFzZWQgb24KKwlOT19QUk9UT1RZUEVTLCBub3QgX19TVERDX18uCisJKiBnZGIuYmFzZS9jYWxsZnVuY3MuZXhwIChkb19mdW5jdGlvbl9jYWxscyk6IHhmYWlsIG9uZSBvZiB0aGUKKwl0X2Zsb2F0X3ZhbHVlczIgdGVzdHMgaWYgcHJvdG90eXBlcyBpbiB1c2UuCisKKwkqIGdkYi5iYXNlL2NhbGxmdW5jcy5jICh0X2Zsb2F0X3ZhbHVlcywgdF9mbG9hdF92YWx1ZXMyLAorCXRfZG91YmxlX3ZhbHVlcyk6ICBXaGVuIGNoZWNraW5nIGRpZmZlcmVuY2VzIGFnYWluc3QgREVMVEEsIGNoZWNrCisJdGhhdCBkaWZmZXJlbmNlIGlzIHdpdGhpbiB0aGUgcmFuZ2UgKC1ERUxUQSxERUxUQSksIG5vdCBqdXN0CisJKC1pbmZpbml0eSxERUxUQSkuCisKK1R1ZSBGZWIgMjggMTY6Mjg6NTQgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KKworCSogY29uZmlnL21pcHMtZ2RiLmV4cCAoZ2RiX2xvYWQpOiBJbiBldmVyeSB0ZXN0IGNhc2UsIHdlIG5lZWQgdG8gZG8KKwknZmlsZScgY29tbWFuZCBmaXJ0cywgdGhlbiAndGFyZ2V0JywgdGhlbiAnbG9hZCcsIHRoaXMgaXMgZHVlIHRvIGdkYgorCXRhcmdldCBzZXQgdXAuCisJKiBjb25maWcvbWlwcy1nZGIuZXhwOiBGaXggYSBjb3VwbGUgcmVndWxhciBleHAgYnVncy4KKworVGh1IEZlYiAyMyAxNzo0NDo1NSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2RiLmRpc2FzbS9ocHBhLnMgKGZtZW1MUmJ1Z190ZXN0cyk6IEFkZCB0ZXN0cyBmb3IgdGhlIGluZGV4aW5nCisJRlAgbG9hZC9zdG9yZSB2YXJpYW50cy4KKwkqIGdkYi5kaXNhc20vaHBwYS5leHAgKGZtZW1MUmJ1Z190ZXN0cyk6IFRlc3QgbmV3IHZhcmlhbnRzLgorCitXZWQgRmViIDIyIDE4OjI5OjA4IDE5OTUgIEppbSBLaW5nZG9uICA8a2luZ2RvbkBydGwuY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2UvdGVybS5leHA6IERvIG5vdCBnaXZlIGEgd2FybmluZyBpZiBub3QgbmF0aXZlLCBpdCBpcworCW5vdCBhbiBhYm5vcm1hbCBjb25kaXRpb24uCisKK1R1ZSBGZWIgMjEgMTM6MDg6NDcgMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL3B0eXBlLmV4cDogQWNjZXB0IGNoYXJbMF0gYXMgd2VsbCBhcyBjaGFyW10gZm9yICJwdHlwZQorCXRfY2hhcl9hcnJheSIuCisKK1N1biBGZWIgMTkgMTM6MTA6MDYgMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQHJ0bC5jeWdudXMuY29tPgorCisJKiBsaWIvZ2RiLmV4cCAoZGVmYXVsdF9nZGJfdmVyc2lvbik6IFBhc3MgR0RCRkxBR1MgdG8gZ2RiIHdoZW4gd2UKKwlhcmUgZ2V0dGluZyB0aGUgdmVyc2lvbiBudW1iZXIuCisKKwkqIGdkYi5iYXNlL3thMS1zZWxmdGVzdC5leHAsY29yZWZpbGUuZXhwfTogRG8gbm90IGdpdmUgYSB3YXJuaW5nCisJaWYgbm90IG5hdGl2ZSwgaXQgaXMgbm90IGFuIGFibm9ybWFsIGNvbmRpdGlvbi4KKworVGh1IEZlYiAxNiAxNTo1Njo1NiAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbGliL2dkYi5leHA6IEp1c3QgdXNlICJmaWxlIGV4aXN0cyIsIHJhdGhlciB0aGFuIHVuZG9jdW1lbnRlZAorCWRlamFnbnUgcHJvY2VkdXJlICJmaW5kZmlsZSIuCisKK1RodSBGZWIgMTYgMTA6MzA6MjQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBjb25maWcvbXQtdnh3b3JrcyAoQ0ZMQUdTKTogU2V0IHRvIC1nIC1Ednh3b3Jrcy4KKwkgIChMREZMQUdTKTogU2V0IHRvIC1YbGlua2VyIC1Vci4KKworCSogTWFrZWZpbGUuaW4sIGdkYi57YmFzZSxjKyssY2hpbGx9L01ha2VmaWxlLmluIChHREIsIEdEQkZMQUdTKToKKwkgIFJlbW92ZWQsIHRoZXNlIHZhbHVlcyBhcmUgc2V0IGJ5IGxpYi9nZGIuZXhwLgorCisJKiBsaWIvZ2RiLmV4cDogSWYgR0RCRkxBR1MgaXMgdW5zZXQsIHNldCBpdCB0byAtbnguCisKK1dlZCBGZWIgMTUgMTQ6MjM6MjggMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBjb25maWcvdngtZ2RiLmV4cCAoc3Bhd25fdnhnZGIpOiBVc2UgZGVmYXVsdF9nZGJfc3RhcnQgaW5zdGVhZAorCSAgb2YgcmVwbGljYXRpbmcgZ2RiIHN0YXJ0dXAgY29kZS4KKworCSogY29uZmlnL210LXZ4d29ya3MgKExERkxBR1MpOiBTZXQgdG8gLXIuCisJICAoQ0ZMQUdTX0ZPUl9UQVJHRVQpOiBSZW1vdmVkLgorCisJKiBjb25maWcvdngtZ2RiLmV4cDogYWx3YXlzIHNldCBwcm9tcHQ7IGdkYi5leHAgc2V0cyBpdCB0bworCSAgKGdkYikgYW5kIGdkYiBmb3Igdnh3b3JrcyB1c2VzICh2eGdkYikuCisKKwkqIE1ha2VmaWxlLmluLCBnZGIue2Jhc2UsYysrLGNoaWxsfS9NYWtlZmlsZS5pbiAoR0RCKTogSWYgYSBnZGIKKwkgIGV4ZWN1dGFibGUgaXMgbm90IGluIHRoZSB0cmVlIGFuZCBob3N0ICE9IHRhcmdldCwgdXNlIHNlZCBhbmQKKwkgIHByb2dyYW1fdHJhbnNmb3JtX25hbWUgdG8gZGV0ZXJtaW5lIHRoZSBnZGIgbmFtZSB1c2VkIGJ5IHRoZQorCSAgdGFyZ2V0LgorCisJKiBjb25maWd1cmUuaW4sIGdkYi57YmFzZSxjKyssY2hpbGx9L2NvbmZpZ3VyZS5pbjogY2hhbmdlZCBzbworCSAgKi0qLXZ4d29ya3MqIG1hdGNoZXMgdnh3b3JrcyBhbmQgKi0qLW5ldHdhcmUqIG1hdGNoZXMgTmV0V2FyZS4KKworU3VuIEZlYiAxMiAwODoxMTo1OCAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLmJhc2Uve2NhbGxmdW5jcy5leHAsY2FsbGZ1bmNzLmN9OiBBZGQgdGVzdHMgZm9yIHBhc3NpbmcKKwlmbG9hdHMsIGNoYXJzLCBhbmQgc2hvcnRzIHdoZXJlIHRoZXJlIGFyZSBBTlNJLXN0eWxlIGZ1bmN0aW9uCisJZGVmaW5pdGlvbnMuCisKKwkqIGdkYi5iYXNlL2xhbmdzLmV4cCwgZ2RiLmJhc2UvbGFuZ3MqOiBOZXcgdGVzdC4KKwkqIGdkYi5iYXNlL01ha2VmaWxlLmluOiBCdWlsZCBpdC4KKwkqIFRPRE86IFJlbW92ZSBpdGVtIGFib3V0IGNoZWNraW5nIHRoYXQgQyBuYW1lcyBkb24ndCBnZXQgQysrCisJZGVtYW5nbGluZyBhcHBsaWVkOyB0aGlzIHRlc3QgdGVzdHMgaXQuCisKK1RodSBGZWIgIDkgMTI6NDM6NTYgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi5zdGFicy93ZWlyZC5leHA6IFJlbW92ZSAiSGF2ZW4ndCBleGFtaW5lZCIgY29tbWVudCB3aGljaAorCXdlbnQgd2l0aCB0aGUgY29uc3Q3MCB4ZmFpbC4gIFRoZSB4ZmFpbCB3ZW50IGF3YXkgYSB5ZWFyIGFnby4KKworCSogZ2RiLmJhc2Uvc2lnbmFscy5leHA6IFJlbmFtZSBhIGJ1bmNoIG9mIHRlc3RzIHRvIGdpdmUgdW5pcXVlIG5hbWVzLgorCisJKiBnZGIuYmFzZS9jb3JlZmlsZS5leHA6IEdpdmUgYmFja3RyYWNlIHRlc3QgdW5pcXVlIG5hbWUuICB4ZmFpbAorCWZvciBocDMwMC4KKworCSogZ2RiLmJhc2UvaW50ZXJydXB0LmV4cDogQWxzbyB4ZmFpbCBocHV4IChmb3IgaHAzMDApLgorCisJKiBnZGIuYmFzZS9hMS1zZWxmdGVzdC5leHA6IERvbid0IHJ1biBvbiBocDMwMC4KKworU2F0IEZlYiAgNCAxNTowNDozMiAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKHNpdGUuZXhwKTogU2V0IGhvc3RfYWxpYXMgYW5kIHRhcmdldF9hbGlhcyBhcyB3ZWxsCisJYXMgaG9zdF90cmlwbGV0IGFuZCB0YXJnZXRfdHJpcGxldC4KKworV2VkIEZlYiAgMSAwODowMzo0OCAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLmJhc2UvYTEtc2VsZnRlc3QuZXhwOiBJbnZva2Ugc3R0eSBiZWZvcmUgc3RhcnRpbmcgaW5mZXJpb3IuCisKKwkqIGdkYi5iYXNlL25vZGVidWcuZXhwOiBBZGQgeGZhaWxzIGZvciB1bHRyaXggYW5kIGlyaXg1IChzYW1lCisJcGxhY2VzIGFzIG90aGVyIGVjb2ZmIHN5c3RlbXMpLgorCisJKiBnZGIuYmFzZS9hMS1zZWxmdGVzdC5leHAgKHRlc3Rfd2l0aF9zZWxmKTogRG9uJ3QgaW52b2tlIHN0dHkgb24KKwl1bHRyaXguCisKK01vbiBKYW4gMzAgMTE6NDQ6NTIgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL25vZGVidWcuYyAoaW5uZXIpOiBVc2UgdmFyaWFibGVzIHNvIEFJWCBsaW5rZXIgZG9lc24ndAorCXJlbW92ZSB0aGVtLgorCSogZ2RiLmJhc2Uvbm9kZWJ1Zy5leHA6IEFjY2VwdCAiZnVuY3Rpb24iIGluIGFkZGl0aW9uIHRvICJ0ZXh0CisJdmFyaWFibGUgYW5kICJ2YXJpYWJsZSIgaW4gYWRkaXRpb24gdG8gImRhdGEgdmFyaWFibGUiLgorCSogZ2RiLmJhc2Uvbm9kZWJ1Zy5leHA6IHhmYWlsIGRhdGFsb2NhbCBhbmQgYnNzbG9jYWwgdGVzdHMgZm9yIEFJWC4KKworCSogZ2RiLmJhc2UvbGlzdC5leHAgKHRlc3RfZm9yd2FyZF9zZWFyY2gpOiBTZXQgbGlzdHNpemUgdG8gNCBub3QKKwkyLgorCSogZ2RiLmJhc2UvbGlzdDEuYyAobG9uZ19saW5lKTogQWRkIGFkZGl0aW9uYWwgc3RhdGVtZW50IGF0IHN0YXJ0CisJb2YgZnVuY3Rpb24uCisJKiBnZGIuYmFzZS9saXN0LmV4cCAodGVzdF9mb3J3YXJkX3NlYXJjaCk6IFVwZGF0ZSBsaW5lIG51bWJlciB0bworCXJlZmxlY3QgbmV3IHN0YXRlbWVudC4KKworU3VuIEphbiAyOSAxMzozNDoyNSAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi5iYXNlL3NpZ25hbHMuZXhwOiAgUmVpbml0aWFsaXplIHNlYXJjaGVkIHNvdXJjZSBkaXJlY3RvcmllcworCWFmdGVyIGdkYl9zdGFydCBjYWxsLgorCitTYXQgSmFuIDI4IDAxOjM0OjQ0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnZGIuZGlzYXNtL01ha2VmaWxlLmluIChjbGVhbik6IERlbGV0ZSAiZXJycyIgZmlsZS4KKwkqIGdkYi5zdGFicy9NYWtlZmlsZS5pbjogTGlrZXdpc2UuCisKKwkqIGdkYi5kaXNhc20vaHBwYS5leHAgKGFsbF9mcHVfY29tcGFyaXNvbl90ZXN0cyk6IFJldmVydCBsYXN0CisJY2hhbmdlLiAgSW5zdGVhZCBzcGxpdCB0aGUgdGVzdHMgaW50byBzbWFsbGVyIHBpZWNlcy4KKwkqIGdkYi5kaXNhc20vaHBwYS5zOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCisKK0ZyaSBKYW4gMjcgMDk6MjQ6NTEgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL2ExLXNlbGZ0ZXN0LmV4cCAodGVzdF93aXRoX3NlbGYpLCBnZGIuYmFzZS9pbnRlcnJ1cHQuZXhwOgorCVF1b3RlIF5DIHdoZW4gcGFzc2luZyBpdCB0byBzdHR5LiAgRm9yIHNvbWUgc2hlbGxzIF4gaXMgYSBwaXBlLgorCisJKiBnZGIuYmFzZS9mdW5jYXJncy5leHA6IE1vZGlmeSBtYW55IHRlc3RzIHNvIHRoYXQgZXZlcnkgdGVzdAorCWVpdGhlciBwYXNzZXMgb3IgZmFpbHMuICBNYWtlIHNvbWUgdGVzdCBuYW1lcyB1bmlxdWUuCisKK1RodSBKYW4gMjYgMTk6MjA6MzQgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL2ExLXNlbGZ0ZXN0LmV4cCAodGVzdF93aXRoX3NlbGYpLCBnZGIuYmFzZS9pbnRlcnJ1cHQuZXhwOgorCUNhbGwgc3R0eSB0byBzZXQgaW50ZXJydXB0IGNoYXJhY3Rlci4KKworCSogZ2RiLmRpc2FzbS9ocHBhLm10IChocHBhKSwgZ2RiLnN0YWJzL2hwcGEubXQgKHdlaXJkLm8pOiBDaGVjaworCWZvciBIUCBhc3NlbWJsZXIgdmVyc3VzIEdOVSBhc3NlbWJsZXIgYmFzZWQgb24gYWN0dWFsIGJlaGF2aW9yIG9mCisJJChDQyksIHJhdGhlciB0aGFuIGFzc3VtaW5nIHRoYXQgJChBUykgaXMgYWx3YXlzIHRoZSBHTlUgYXNzZW1ibGVyLgorCisJKiBUT0RPOiBTdWdnZXN0IGEgZmV3IG1vcmUgc3RlcHBpbmcgdGVzdHMuCisKK1dlZCBKYW4gMjUgMTQ6NTI6NDEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9kZWZhdWx0LmV4cDogeGZhaWwgbm8tc3RhY2sgYmFja3RyYWNlcyBmb3IgaDgzMDAsCisJcmVzdGFydCBHREIgZm9yIGg4MzAwIGFmdGVyIGEgY29udGludWUuCisJKHJldHVybik6IEFkZCBwYXR0ZXJuIHRvIG1hdGNoIGEyOWstdWRpIGJlaGF2aW9yLgorCSogZ2RiLmJhc2Uvbm9kZWJ1Zy5leHA6IFJlbW92ZSBvYnNvbGV0ZSBjb21tZW50LgorCSogZ2RiLmJhc2UvcmVncy5leHA6IE5ldyBmaWxlLCB0ZXN0aW5nIG9mIHJlZ2lzdGVyIGRpc3BsYXlzLgorCSogZ2RiLmJhc2UvcmV0dXJuLmV4cDogRml4IHR5cG8gaW4gcmVmZXJlbmNlIHRvICRvYmpkaXIuCisJKiBnZGIuYmFzZS93aGF0aXMuZXhwOiBBbHdheXMgc3RhcnQgd2l0aCBhIGZyZXNoIEdEQi4KKworV2VkIEphbiAyNSAxMToxMjowNyAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLmRpc2FzbS9ocHBhLmV4cCAoYWxsX2ZwdV9jb21wYXJpc29uX3Rlc3RzKTogU2V0IHRpbWVvdXQKKwloaWdoZXIsIHRoZXNlIHRlc3RzIGdlbmVyYXRlIGEgbG90IG9mIG91dHB1dC4KKworVHVlIEphbiAyNCAwNzo1ODo0NCAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbGliL2dkYi5leHAgKGdkYl90ZXN0KTogUmVtb3ZlIGNhdGNoIGZyb20gYXJvdW5kIHRoZSBzZW5kLiAgVGhlCisJY29kZSBmb2xsb3dpbmcgdGhlIGNhdGNoIHNpbGVudGx5IGlnbm9yZWQgc29tZSBlcnJvcnM7IHdpdGhvdXQgdGhlCisJY2F0Y2ggdGhleSBzaG91bGQgYmUgdGhyb3duIGxpa2UgYW55IG90aGVyIHRjbCBlcnJvci4gIEFsc28sIHRoZQorCWNhdGNoIHVzZWQgIiIgaW5zdGVhZCBvZiB7fSB3aGljaCBtZWFudCBhbGwgdGhlIGNhbGxlcnMgd2hvIHdhbnRlZAorCXRvIGluY2x1ZGUgb25lIG9mIHRoZSBjaGFyYWN0ZXJzICJbXSQgaGFkIHRvIHF1b3RlIGl0IGFuIGV4dHJhIHRpbWUuCisJKiBnZGIuYmFzZS97Y2FsbGZ1bmNzLmV4cCxjb21tYW5kcy5leHAsZ2RidmFycy5leHAscHJpbnRjbWRzLmV4cCwKKwlwdHlwZS5leHAsc2lnbmFscy5leHAsd2F0Y2hwb2ludC5leHB9LCBnZGIuYysrL3tjcGx1c2Z1bmNzLmV4cCwKKwlkZW1hbmdsZS5leHB9LCBnZGIuY2hpbGwvY2hleHAuZXhwLCBnZGIuZm9ydHJhbi9leHBycy5leHA6CisJUmVtb3ZlIGV4dHJhIHF1b3RpbmcuCisKK01vbiBKYW4gMjMgMjE6NTc6NTQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdkYi5iYXNlL2NvbW1hbmRzLmV4cDogTWFrZSB0ZXN0IG5hbWVzIHVuaXF1ZTsgZXZlcnkgdGVzdCBlaXRoZXIKKwlwYXNzZXMgb3IgZmFpbHMuICBVcGRhdGUgc29tZSBjb21tZW50cy4KKworCSogZ2RiLmRpc2FzbS9ocHBhLmV4cCAoZG9fc3lzdGVtX2NvbnRyb2xfdGVzdHMpOiBVcGRhdGUuCisKK1NhdCBKYW4gMjEgMTU6MzQ6NTIgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwlUaGUgZm9sbG93aW5nIGZpeGVzIGEgRkFJTCBjYXVzZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgYWxwaGEgc3RhYnMKKwljb25maWd1cmF0aW9uIGRpZG4ndCB1c2UgdGhlICIuaWYgYWxwaGEiIGNvZGUgaW4gd2VpcmQuZGVmLgorCSogZ2RiLnN0YWJzL3dlaXJkLmRlZiAodl9jb21iKTogVXNlIHR5cGUgYXR0cmlidXRlIHRvIHNwZWNpZnkgMzIKKwliaXQgcG9pbnRlciwgc28gdGhlIDMyIGJpdCB2ZXJzaW9uIHdvcmtzIGV2ZW4gb24gdGhlIGFscGhhLgorCSogZ2RiLnN0YWJzL3thbHBoYS5tdCxlY29mZi5tdCxhb3V0LnNlZCxocHBhLnNlZCx4Y29mZi5zZWQsd2VpcmQuZGVmfToKKwlSZW1vdmUgdGhlIHN0dWZmIHdoaWNoIGFsbG93ZWQgdXMgdG8gaGF2ZSBzZXBhcmF0ZSB2ZXJzaW9ucyBmb3IKKwlhbHBoYSBhbmQgZXZlcnl0aGluZyBlbHNlLgorCisJKiBnZGIuYysrL2NwbHVzZnVuY3MuZXhwICh0ZXN0X2xvb2t1cF9vcGVyYXRvcl9mdW5jdGlvbnMpOiBGaXgKKwlyZWdleHAgd2hpY2ggImluZm8gZnVuYyBvcGVyYXRvclxbXF0oIiBpcyBzdXBwb3NlZCB0byBtYXRjaC4gIEZpeAorCXN0cmluZyB0byBzZW5kIHRvIEdEQi4gIE5vdGUgdGhhdCBHREIgc3RpbGwgZG9lc24ndCB3b3JrIHJpZ2h0LiAgQWRkIGEKKwluZXcgdGVzdCBmb3IgImluZm8gZnVuYyAucGVyYXRvclxbXF0oIiB3aGljaCBHREIgZG9lcyBoYW5kbGUgY29ycmVjdGx5LgorCisJKiBnZGIuYmFzZS9ub2RlYnVnLmV4cDogeGZhaWwgbW9zdCBvZiB0aGUgbmV3IHRlc3RzIGZvciBlY29mZiBzeXN0ZW1zLgorCitGcmkgSmFuIDIwIDEyOjE0OjIzIDE5OTUgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIuYysrL2NsYXNzZXMuZXhwLCBnZGIuYysrL2NwbHVzZnVuY3MuZXhwLAorCWdkYi5jKysvaW5oZXJpdC5leHAsIGdkYi5jKysvdGVtcGxhdGVzLmV4cCwgZ2RiLmMrKy92aXJ0ZnVuYy5leHAsCisJZ2RiLmZvcnRyYW4vZXhwcnMuZXhwLCBnZGIuZm9ydHJhbi90eXBlcy5leHAsIGdkYi5jaGlsbC9jaGV4cC5leHAsCisJZ2RiLmJhc2UvcHJpbnRjbWRzLmV4cDogUmVtb3ZlIHBhc3Njb3VudCwgZmFpbGNvdW50LCBldGMuLCBzdHVmZjsKKwlpdCBtYWtlcyB0aGUgdGVzdHMgaGFyZGVyIHRvIHVuZGVyc3RhbmQgYW5kIGNvbmZ1c2VzIHRlc3Qtby1tYXRpYy4KKwlUaGUgcHJlZmVycmVkIHN0eWxlIGlzIHRoYXQgZWFjaCB0ZXN0IHByb3ZpZGVzIGEgUEFTUyBvciBhIEZBSUwsCisJYW5kIGhhcyBhIHVuaXF1ZSBtZXNzYWdlIChlLmcuICJjb250aW51ZSAjNTQiIG5vdCBqdXN0ICJjb250aW51ZSIpCisJd2hpY2ggaXMgdGhlIHNhbWUgZm9yIHRoZSBwYXNzIGFuZCB0aGUgZmFpbC4KKwkqIGdkYi5mb3J0cmFuL2V4cHJzLmV4cCwgZ2RiLmZvcnRyYW4vdHlwZXMuZXhwLAorCWdkYi5jaGlsbC9jaGV4cC5leHA6IE1vdmUgdGVzdF9wcmludF9hY2NlcHQgYW5kIHRlc3RfcHJpbnRfcmVqZWN0CisJdG8gbGliL2dkYi5leHAuCisJKiBnZGIuYmFzZS9wcmludGNtZHMuZXhwOiBVc2UgdGVzdF9wcmludF9hY2NlcHQuICBSZW1vdmUKKwlwcnRfYWNjZXB0IHdoaWNoIHdhcyBiYXNpY2FsbHkgdGhlIHNhbWUgdGhpbmcuICBMaWtld2lzZSBmb3IKKwl0ZXN0X3ByaW50X3JlamVjdCBhbmQgcHJ0X3JlamVjdC4KKwkqIGxpYi9nZGIuZXhwICh0ZXN0X3ByaW50X3JlamVjdCk6IEFkZCBzb21lIG1vcmUgZXJyb3IgbWVzc2FnZQorCXBhdHRlcm5zIHRvIG1hdGNoIGZyb20gdGhlIGZvcm1lciBwcmludGNtZHMuZXhwIChwcnRfcmVqZWN0KS4KKwkqIGdkYi5jKysvY2xhc3Nlcy5leHAsIGdkYi5iYXNlL3Njb3BlLmV4cDogUmVtb3ZlIHNwdXJpb3VzIHhmYWlscy4KKwlPbmUgZGVmZWN0IG9mIHRoZSBwYXNzY291bnQgc3R1ZmYgaXMgdGhhdCBzb21lIG9mIGl0IGZhaWxlZCB0bworCXJlcG9ydCBYUEFTUyB3aGVyZSBhcHByb3ByaWF0ZS4KKwkqIGdkYi5jKysvY3BsdXNmdW5jcy5leHAgKHByaW50X2FkZHJfb2YpOiBObyBsb25nZXIgYWNjZXB0IGV4dHJhCisJc3R1ZmYgYmVmb3JlIGFuZCBhZnRlciBhcmcgaW4gZXhwZWN0ZWQgcGF0dGVybi4KKwkodGVzdF9wYWRkcl9vcGVyYXRvcl9mdW5jdGlvbnMpOiBSZS1kbyB0ZXN0IHdpdGhvdXQgcHJpbnRfYWRkcl9vZjsKKwl0aGlzIGlzIHRoZSBvbmx5IHRlc3Qgd2hpY2ggc2VlbXMgdG8gd2FudCBleHRyYSBzdHVmZiB0aGVyZS4KKworVHVlIEphbiAxNyAxMDo0Nzo1MyAxOTk1ICBKaW0gS2luZ2RvbiAgPGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2Uvbm9kZWJ1Zy5leHA6IFVwZGF0ZSBuZXcgdGVzdHMgdG8gcmVmbGVjdCBpbXByb3ZlZAorCXdvcmRpbmcgb2YgZ2RiIG91dHB1dC4KKworCSogZ2RiLmJhc2Uvbm9kZWJ1Zy5leHA6IEFkZCB0ZXN0cyB0byBjaGVjayB0aGF0ICJwcmludCIsICJ3aGF0aXMiCisJYW5kICJwdHlwZSIgd29yayBvbiB2YXJpYWJsZXMgaW4gZmlsZXMgY29tcGlsZWQgd2l0aG91dCAtZy4KKwlSZXBsYWNlcyBjb21tZW50ZWQgb3V0ICJtYWludCBwcmludCBtc3ltYm9sIiB0ZXN0cy4KKworTW9uIEphbiAxNiAxMjoxMzoyOCAxOTk1ICBKaW0gS2luZ2RvbiAgPGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2Uvc2V0dmFyLmMgKGR1bW15KTogQ2FsbCBtYWxsb2MuCisKKwkqIGdkYi5zdGFicy9hb3V0LnNlZDogRW5jbG9zZSBjb21tZW50cyB3aXRoaW4gYSBzZWQgY29tbWFuZCB0byBhdm9pZAorCWxvc2luZyB3aXRoIHRoZSBpcml4NCBzZWQuCisKKwkqIGdkYi5iYXNlL3NpZ2FsbC5leHAgKHRlc3Rfb25lX3NpZyk6IEFkZCB4ZmFpbCBmb3IgImdldCBzaWduYWwKKwlBTFJNIiBvbiBpcml4NC4KKworU3VuIEphbiAxNSAyMTo1ODoyNiAxOTk1ICBKaW0gS2luZ2RvbiAgPGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbT4KKworCSogVE9ETzogUmVtb3ZlIGl0ZW1zIGFib3V0IGNvcmVmaWxlLmV4cCB0ZXN0aW5nIG5ldyBleGVjLWZpbGUgYW5kCisJYmFja3RyYWNlOyBib3RoIGFyZSBub3cgZG9uZS4gIEFkZCBpdGVtcyBhYm91dCBwcmludGluZyBlbnVtcy4KKworU2F0IEphbiAxNCAxMToyNToyOCAxOTk1ICBKaW0gS2luZ2RvbiAgPGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbT4KKworCSogZ2RiLmJhc2Uvc2lnYWxsLmV4cCAodGVzdF9vbmVfc2lnKTogQXR0ZW1wdCB0byByZWNvdmVyIGlmCisJImdldCBzaWduYWwgJHRoaXNzaWciIHRlc3QgZmFpbHMuCisKKwkqIGdkYi5iYXNlL3NldHZhci5leHA6IENoZWNrIGZvciBhbmQgcmVqZWN0IGNyYXp5IGV4cGVjdGVkIHR5cGUgaGFja3MuCisKK1RodSBKYW4gMTIgMDE6MTQ6NTMgMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGxpb3RoLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL3NpZ2FsbC5jIChnZW5fKik6IFBhc3MgYXJndW1lbnQgdG8gaGFuZGxlXyogdG8gYXZvaWQKKwljb21waWxlciB3YXJuaW5nIHdpdGggZGVjIGFscGhhIGNvbXBpbGVyLgorCisJKiBnZGIuYmFzZS9jb21tYW5kcy5leHAgKGlmX3doaWxlX2JyZWFrcG9pbnRfY29tbWFuZF90ZXN0KTogUmVtb3ZlCisJZXh0cmEgXG4gZnJvbSBnZGJfdGVzdCBjYWxsICh0aGlzIGV4cGxhaW5zIHdoeSB0aGUgcHJvbXB0IHRlc3QKKwl0aGF0IEkgcmVtb3ZlZCB5ZXN0ZXJkYXkgd2FzIHRoZXJlKS4KKwkodXNlcl9kZWZpbmVkX2NvbW1hbmRfdGVzdCk6IFJlbW92ZSBleHRyYSBcbiBhbmQgcHJvbXB0IHRlc3QuCisKKwkqIGdkYi5iYXNlL3NpZ2FsbC5jOiBJZiBTSUdBQlJUID09IFNJR0xPU1QsIGp1c3QgYWN0IGFzIGlmIFNJR0xPU1QKKwlkb2Vzbid0IGV4aXN0LiAgTGlrZXdpc2UgaWYgU0lHSU8gPT0gU0lHUE9MTCwgcHJldGVuZCBTSUdQT0xMCisJZG9lc24ndCBleGlzdC4KKwkqIGdkYi5iYXNlL3NpZ2FsbC5leHA6IFJlbW92ZSBzcGVjaWFsIGhhbmRsaW5nIGZvciBTSUdJTyBhbmQgU0lHUE9MTC4KKwlBbHNvIHJlbW92ZSBhbHBoYSB3b3JrYXJvdW5kLCB3aGljaCB0dXJucyBvdXQgdG8gYmUgYmVjYXVzZQorCVNJR0FCUlQgPT0gU0lHTE9TVC4KKworCSogZ2RiLmJhc2Uvc2lnYWxsLmV4cDogQWRkIHdvcmthcm91bmQgZm9yIGFscGhhIHdlaXJkbmVzcy4KKworCSogZ2RiLmJhc2UvaGVscC5leHA6IERvbid0IHRlc3QgImhlbHAgc2hvdyIuCisKK1dlZCBKYW4gMTEgMTQ6Mzc6MDQgMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGxpb3RoLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2NvbW1hbmRzLmV4cDogQ2FsbCBnZGJfZXhpdCBhbmQgZ2RiX3N0YXJ0IHNvIHRoYXQKKwkic2V0IHByaW50IGFkZHJlc3MiIGlzIG9uLgorCSogZ2RiLmJhc2UvY29tbWFuZHMuZXhwIChpZl93aGlsZV9icmVha3BvaW50X2NvbW1hbmRfdGVzdCk6IERvbid0CisJcGFzcyBwcm9tcHQgdG8gZ2RiX3Rlc3Q7IGdkYl90ZXN0IGFscmVhZHkgbG9va3MgZm9yIHRoZSBwcm9tcHQuCisKKwkqIGdkYi5iYXNlL2hlbHAuZXhwOiBSZXBsYWNlIG1vc3Qgb2YgZG9jc3RyaW5nIGZvciAiZGVmaW5lIiB3aXRoICIuKiIuCisKKwkqIGdkYi5iYXNlL2ExLXNlbGZ0ZXN0LmV4cDogRG9uJ3QgdGVzdCAibWFpbnQgZHVtcC1tZSIuICBUaGF0IHRlc3QKKwl3YXMgYSB2ZXN0aWdlIG9mIHRoZSBtYW51YWwgVEVTVFNUUkFURUdZLCBhbmQgdGhlIHB1cnBvc2Ugb2YgaXQKKwl3YXMgdG8gbWFrZSBzdXJlIHRoYXQgZ2RiIGNhbiByZWFkIGEgY29yZSBmaWxlLiAgQnV0IChhKSB0aGUgInJlYWQKKwl0aGUgY29yZWZpbGUiIHBhcnQgZGlkbid0IG1ha2UgaXQgdG8gYTEtc2VsZnRlc3QuZXhwLCB3ZSBqdXN0CisJZGVsZXRlIHRoZSBjb3JlZmlsZSBhZnRlciBjcmVhdGluZyBpdCwgYW5kIChiKSB3ZSB0ZXN0IHJlYWRpbmcKKwljb3JlZmlsZXMgaW4gY29yZWZpbGUuZXhwIGFueXdheS4gIEFsc28sIHRoaXMgdGVzdCBsZWZ0IGFyb3VuZCBhCisJeGdkYiBwcm9jZXNzIG9uIFNvbGFyaXMuCisKKwkqIGdkYi5iYXNlL2NvcmVmaWxlLmV4cDogQWxzbyB0ZXN0IGJhY2t0cmFjZS4KKworV2VkIEphbiAxMSAwMDoxNDo0MCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2RiLmJhc2UvY29tbWFuZHMuZXhwOiBUZXN0IGEgc2ltcGxlIHVzZXIgZGVmaW5lZCBjb21tYW5kIHdpdGgKKwlhcmd1bWVudHMgYW5kIGlmL3doaWxlIHN0YXRlbWVudHM7IHZlcmlmeSB0aGUgZnVsbCB1c2VyIGNvbW1hbmQgaXMKKwlwcmludGVkIGJ5ICJzaG93IHVzZXIiLgorCisJKiBnZGIuYmFzZS9jb21tYW5kcy5leHA6IFRlc3QgaWYvd2hpbGUgY29tbWFuZHMgYXMgcGFydCBvZiBhCisJYnJlYWtwb2ludCBjb21tYW5kIGxpc3Q7IHZlcmlmeSB0aGV5IGFwcGVhciBpbiBicmVha3BvaW50CisJaW5mb3JtYXRpb24uCisKK1dlZCBKYW4gMTEgMDA6NDc6NTggMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGxpb3RoLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL3NpZ2FsbC5jIChnZW5fRlBFKTogR2VuZXJhdGUgU0lHRlBFIHdpdGgga2lsbCgpIHJhdGhlcgorCXRoYW4gYnkgZGl2aWRpbmcgYnkgemVyby4KKworVHVlIEphbiAxMCAyMTozODowNSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2RiLmJhc2Uvd2F0Y2hwb2ludC5leHA6IGhwcGEqLSotKmJzZCogbm8gbG9uZ2VyIGhhcyBwcm9ibGVtcworCXBlcmZvcm1pbmcgYW4gaW5mZXJpb3IgY2FsbCB3aXRoIHdhdGNocG9pbnRzIGVuYWJsZWQuCisJKiBnZGIuYmFzZS93YXRjaHBvaW50LmMgKG1haW4pOiBEZWxldGUgc2Vjb25kIHVubmVjZXNzYXJ5IHJlYWQKKwljYWxsLgorCitUdWUgSmFuIDEwIDE4OjQyOjA3IDE5OTUgIEppbSBLaW5nZG9uICA8a2luZ2RvbkBsaW90aC5jeWdudXMuY29tPgorCisJKiBnZGIuc3RhYnMvd2VpcmQuZXhwOiBBbGxvdyBzcGFjZXMgZm9sbG93ZWQgYnkgYmFja3NwYWNlcyBpbiBlY2hvCisJb2YgImZpbGUiIGNvbW1hbmQuCisKKwkqIGdkYi5jKysvY2xhc3Nlcy5leHAgKHRlc3RfcHR5cGVfY2xhc3Nfb2JqZWN0cywgcHR5cGUgY2xhc3MgRm9vKToKKwlBZGQgYWRkaXRpb25hbCBwYXR0ZXJuIGZvciB3aGVuICJpbnQgb3BlcmF0b3IgaW50KHZvaWQpOyIgYXBwZWFycworCWluIGEgZGlmZmVyZW50IG9yZGVyLgorCitNb24gSmFuICA5IDE2OjIyOjQ2IDE5OTUgIEppbSBLaW5nZG9uICA8a2luZ2RvbkBsaW90aC5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9zaWduYWxzLmV4cDogQ2FsbCBnZGJfZXhpdCBhbmQgZ2RiX3N0YXJ0LgorCisJKiBnZGIuYmFzZS9oZWxwLmV4cDogUmVwbGFjZSBtb3N0IG9mIGRvY3N0cmluZ3MgZm9yICJpbmZvIHNpZ25hbHMiCisJYW5kICJzaWduYWwiIHdpdGggIi4qIi4KKworV2VkIEphbiAgNCAxMTozNToxOSAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogVE9ETzogQWRkIG5vdGUgYWJvdXQgImhhbmRsZSBhbGwgbm9zdG9wIi4KKworCSogZ2RiLmJhc2Uve3NpZ2FsbC5jLCBzaWdhbGwuZXhwfTogTmV3IHRlc3QuCisJKiBnZGIuYmFzZS9NYWtlZmlsZS5pbjogQWRkIGl0LgorCitUaHUgSmFuICA1IDE3OjM0OjAzIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogbGliL2dkYi5leHAsIGdkYi5iYXNlL2NvcmVmaWxlLmV4cDogU3VwcGx5IC1udyBhcyBhcmd1bWVudAorCXdoZW4gaW52b2tpbmcgR0RCLCBzdXBwcmVzc2VzIGFueSB3aW5kb3dpbmcgaW50ZXJmYWNlLgorCitNb24gSmFuICAyIDE3OjQwOjIxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL3NpbS1nZGI6IE5ldyBmaWxlLCBzaW11bGF0b3IgdGVzdGluZyBzdXBwb3J0LgorCitXZWQgRGVjIDI4IDEyOjIxOjUwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnZGIuYmFzZS9pbnRlcnJ1cHQuZXhwOiBUZXN0IGNhbGxpbmcgZnVuYzEgdHdpY2UuCisKK1dlZCBEZWMgMjEgMTI6NTE6MzcgMTk5NCAgSmltIEtpbmdkb24gIDxraW5nZG9uQGRlbmViLmN5Z251cy5jb20+CisKKwkqIGdkYi5iYXNlL2xpc3QuZXhwICh0ZXN0X2ZvcndhcmRfc2VhcmNoKTogU2V0IHRpbWVvdXQgaGlnaGVyCisJd2hlbiB3ZSdsbCBiZSBnZXR0aW5nIGxvdHMgb2Ygb3V0cHV0IGZyb20gZ2RiLgorCisJKiBnZGIuYmFzZS9hMS1zZWxmdGVzdC5leHA6IE1vdmUgY29kZSB0aGF0IHdhcyBpbnNpZGUgZXhwZWN0IC1yZQorCSJpbml0X21hbGxvYyIgdG8gYWZ0ZXIgdGhlIGV4cGVjdCBzdGF0ZW1lbnQuICBSdW4gaXQgaWYgdGhhdAorCXJlZ2V4cCBpcyB0YWtlbiwgYnV0IGFsc28gZm9yIHR3byBvdGhlcnMgd2hpY2ggaGFwcGVuIGlmIHNvdXJjZQorCWNhbm5vdCBiZSBmb3VuZC4KKworVHVlIERlYyAyMCAxMjozNToyMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLmJhc2UvcHJpbnRjbWRzLmV4cDogTmV3IHRlc3QsIGZvciBwcmludGluZyByZWdpc3RlciBiZWZvcmUKKwlwcm9ncmFtIGlzIHJ1bm5pbmcuCisKK01vbiBEZWMgMTkgMDA6MzI6NTUgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBnZGIuYmFzZS9saXN0LmV4cDogIENvcnJlY3Qgc29tZSBhbHRlcm5hdGUgZXhwZWN0IHBhdHRlcm5zCisJdG8gcmVmbGVjdCBjaGFuZ2VzIGluIGxpc3QxLmMuCisKK1NhdCBEZWMgMTcgMTQ6MjA6MDMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIFRPRE86IEFkZCBpdGVtIHJlZ2FyZGluZyBsYXJnZSBmcmFtZXMuCisKKwkqIGdkYi5iYXNlL3tmdW5jYXJncy5leHAsIGZ1bmNhcmdzLmN9IChjYWxsX2FmdGVyX2FsbG9jYSk6IE5ldyB0ZXN0LgorCisJKiBUT0RPOiBSZW1vdmUgaXRlbSBhYm91dCBlbmFibGluZyByZXR1cm4uZXhwOyBpdAorCWlzIGVuYWJsZWQuICBTdWdnZXN0IGEgZmV3IG1vcmUgInJldHVybiIgdGVzdHMuCisKK1NhdCBEZWMgMTcgMDI6MzM6MzcgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBnZGIuYysrL21pc2MuY2MsIGdkYi5jKysvaW5oZXJpdC5leHA6ICBBZGQgdGVzdGNhc2VzIGZvcgorCWFub255bW91cyB1bmlvbnMuCisKK1R1ZSBEZWMgMTMgMTE6MjY6MDAgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi5jaGlsbC9NYWtlZmlsZS5pbjogUHV0IGFsbCBydWxlIGJlZm9yZSBydWxlcyBmb3IgcHItNDk3NS5vCisJYW5kIHByLTU2NDYubywgc28gIm1ha2UiIGlzIHRoZSBzYW1lIGFzICJtYWtlIGFsbCIsIG5vdCAibWFrZQorCXByLTQ5NzUubyIuCisKK1dlZCBEZWMgIDcgMTk6MDI6MDIgMTk5NCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9saXN0LmV4cDogQWRqdXN0IGV4cGVjdGF0aW9ucyB0byByZWZsZWN0IGNoYW5nZXMgaW4KKwlsaXN0MS5jLgorCSh0ZXN0X2ZvcndhcmRfc2VhcmNoKTogTmV3IHRlc3QgcHJvYy4KKwkqIGdkYi5iYXNlL2xpc3QxLmMgKGxvbmdfbGluZSk6IE5ldyBmdW5jdGlvbiwgaGFzIGxvbmcgc291cmNlIGxpbmUuCisKK1RodSBEZWMgIDEgMjM6MTQ6NDkgMTk5NCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiBnZGIuYmFzZS9hMS1zZWxmdGVzdC5leHA6IENoYW5nZSBpbml0aWFsIHN0ZXBwaW5nIHRvIGtub3cgYWJvdXQKKwlhZGRpdGlvbmFsIGxpbmUgb2YgY29kZSB0aGF0IHdhcyBhZGRlZC4KKworV2VkIE5vdiAzMCAxOTo0MzoxNCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2RiLmRpc2FzbS9ocHBhLnM6IEJyZWFrIHRoZSBsYXJnZSBicmFuY2hpbmcgdGVzdHMgaW50byBzbWFsbGVyCisJdGVzdHMgc28gYXMgbm90IHRvIG92ZXJmbG93IGV4cGVjdCdzIGlucHV0IGJ1ZmZlcnMuCisJKiBnZGIuZGlzYXNtL2hwcGEuZXhwOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCisKK0ZyaSBOb3YgMjUgMTM6Mzc6MTAgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJQmVnaW5uaW5ncyBvZiB0ZW1wbGF0ZSBkZWJ1Z2dpbmcgdGVzdHMuCisJKiBnZGIuYysrL3RlbXBsLWluZm8uY2M6ICBOZXcgZmlsZSB0byB0ZXN0IGZvciB0ZW1wbGF0ZQorCWRlYnVnZ2luZyBjYXBhYmlsaXR5IG9mIHRoZSBjb21waWxlci4KKwkqIGdkYi5jKysvTWFrZWZpbGUuaW46ICBBZGQgcnVsZSB0byBidWlsZCB0ZW1wbC1pbmZvLmV4cCBmcm9tCisJdGVtcGwtaW5mby5jYy4KKwkqIGdkYi5jKysvdGVtcGxhdGVzLmNjOiAgQWRkIGV4cGxpY2l0IHRlbXBsYXRlIGluc3RhbnRpYXRpb25zCisJdG8gZW5hYmxlIGNvbXBpbGluZyB3aXRoIC1mbm8taW1wbGljaXQtdGVtcGxhdGVzLiBBZGQgZGVzdHJ1Y3RvcgorCWFuZCAndmFsdWUnIG1ldGhvZCB0byBUNSBjbGFzcyBmb3IgdGVtcGxhdGUgdGVzdHMuCisJKiBnZGIuYysrL3RlbXBsYXRlcy5leHA6ICBBZGQgdGVzdGNhc2VzIGZvciBwcmludGluZyBvZiB0ZW1wbGF0ZQorCXR5cGVzLCBzZXR0aW5nIGJyZWFrcG9pbnRzIG9uIHRlbXBsYXRlIG1ldGhvZHMgYW5kIGNhbGxpbmcgYQorCXRlbXBsYXRlIG1ldGhvZC4gCisKK1NhdCBOb3YgIDUgMDA6MjA6MTcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdkYi5kaXNhc20vaHBwYS5leHAgKGJyYW5jaF90ZXN0cyk6IEFsbG93IGFueSBzeW1ib2wgYXMgdGhlCisJYnJhbmNoIHRhcmdldCBzaW5jZSBzb21lIGFzc2VtYmxlcnMgKGdhcy0yLjUpICBtYXkgZW1pdCBhCisJcmVsb2NhdGlvbiBmb3IgdGhlIGJyYW5jaCBpbnN0ZWFkIG9mIHJlc29sdmluZyBpdCBpbiB0aGUKKwlhc3NlbWJsZXIuCisKK1NhdCBPY3QgMjkgMDI6NDA6NDAgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBnZGIuYmFzZS9hMS1zZWxmdGVzdC5leHA6ICBSZW1vdmUgUlMvNjAwMCB4ZmFpbCBmb3IgYmFja3RyYWNlCisJdGhyb3VnaCBzaWduYWwgaGFuZGxlci4KKworRnJpIE9jdCAyMSAxMToxMDoxNiAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAoKi0qLW5ldHdhcmUpOiBVc2UgY29uZmlnL210LW5ldHdhcmUuCisKKwkqIGNvbmZpZy9tdC1uZXR3YXJlOiBOZXcgZmlsZS4KKwkqIGNvbmZpZy9tdC1pMzg2LW5ldHdhcmU6IFJlbW92ZWQsIHNlcGFyYXRlIGNvbmZpZ3MgZm9yIGRpZmZlcmVudAorCSAgbmV0d2FyZSBhcmNoaXRlY3R1cmVzIGFyZSBubyBsb25nZXIgbmVlZGVkIG5vdyB0aGF0IHdlIGhhdmUKKwkgIC0td2l0aC1oZWFkZXJzLgorCitTYXQgT2N0IDE1IDAzOjQzOjAwIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLmJhc2UvZXhwcnMuZXhwOiAgUmVtb3ZlIHhmYWlsIGZvciBhbHBoYSwgaXQgaXMgZml4ZWQKKwlieSB0aGUgcmVjZW50IGNoYW5nZXMgdG8gdXNlIEFOU0kgQyBhcml0aG1ldGljIGNvbnZlcnNpb25zLgorCitTdW4gT2N0ICA5IDA3OjQ0OjA2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIuYmFzZS9jb3JlZmlsZS5leHA6IEFkZCAoeGZhaWwnZCkgdGVzdCBmb3IgcmVpbml0X2ZyYW1lX2NhY2hlCisJYnVnIGludm9sdmluZyB1c2luZyBpbmZlcmlvcl9waWQgdG8gZmlndXJlIG91dCB3aGV0aGVyIHRvIHNlbGVjdCBhCisJZnJhbWUuCisKK1dlZCBTZXAgMjggMjM6MTI6MDIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdkYi5kaXNhc20vaHBwYS5leHA6IENoYW5nZSBhcmdbMC4uM10gdG8gclsyNi4uMjNdIHRvCisJbWF0Y2ggdGhlIGN1cnJlbnQgZGlzYXNzZW1ibGVyIG91dHB1dC4KKworRnJpIFNlcCAxNiAxMTo0Mjo0MSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGdkYi5mb3J0cmFuL2V4cHJzLmV4cDogRXhwZWN0IFZPSUQgaW5zdGVhZCBvZiB2b2lkLgorCSogZ2RiLmZvcnRyYW4vdHlwZXMuZXhwOiBFc2NhcGUgdGhlIGV4cGVjdGVkICcqJ3MgaW4gRm9ydHJhbgorCXR5cGVzLCBleHBlY3QgImludCIgYXMgdHlwZSBvZiBpbnRlZ2VyIHZhbHVlcyAoZm9yIG5vdykuCisKK1dlZCBTZXAgIDcgMjM6MzM6NTEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdkYi5iYXNlL2NvbW1hbmRzLmV4cDogTmV3IHRlc3RzIGZvciBpZi93aGlsZSBjb21tYW5kcy4KKworVHVlIFNlcCAgNiAxMzoxNjoxMSAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogbGliL2dkYi5leHAgKHJ1bnRvKTogIFJlcGxhY2Ugc3ViLXBhdHRlcm4gZm9yIGhleCB2YWx1ZQorCWJ5IC4qLCBzaW5jZSBoZXggdmFsdWVzIGhhdmUgZGlmZmVyZW50IHN5bnRheCBpbiBDaGlsbCBtb2RlLgorCitUdWUgU2VwICA2IDAyOjE1OjUxIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLmMrKy9kZW1hbmdsZS5leHAgKHRlc3RfYXJtX3N0eWxlX2RlbWFuZ2xpbmcpOiAgUmVtb3ZlCisJbGluZWZlZWQgZnJvbSBleHBlY3QgcGF0dGVybiBmb3IgcmVwZWF0ZWQgdHlwZXMgd2l0aCBpbmRpY2VzID4gOS4KKworTW9uIEF1ZyAyOSAxNDoyMDo0NCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwlGaXJzdCBwYXJ0IG9mIEZvcnRyYW4gdGVzdCBzdWl0ZS4KKwkqIGdkYi5mb3J0cmFuOiBOZXcgZGlyZWN0b3J5LgorCSogZ2RiLmZvcnRyYW4vZXhwcnMuZXhwLCBnZGIuZm9ydHJhbi90eXBlcy5leHA6IE5ldyBmaWxlcy4KKworU2F0IEF1ZyAyNyAyMzozMjo0MyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi5iYXNlL2RlZmF1bHQuZXhwOiAgVXBkYXRlIGV4cGVjdCBwYXR0ZXJuIGZvciBsb2FkIGNvbW1hbmQKKwl3aXRob3V0IGFyZ3VtZW50cy4KKworV2VkIEF1ZyAyNCAxMzoxNTowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGkzODYgdG8gaVszNDVdODYuCisJKiBnZGIuYmFzZS9jb25maWd1cmUuaW46IExpa2V3aXNlLgorCSogZ2RiLmMrKy9jb25maWd1cmUuaW46IExpa2V3aXNlLgorCSogZ2RiLmNoaWxsL2NvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCisKK1R1ZSBBdWcgMjMgMTk6MTQ6MDYgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBsaWIvZ2RiLmV4cCAoZ2RiX3J1bl9jbWQpOiBNb3ZlIGNvbW1lbnQgb3V0IGZyb20gYmV0d2VlbiBleHBlY3QKKwlwYXR0ZXJucywgc2luY2UgdGhhdCBpcyBub3QgYSB2YWxpZCBjb250ZXh0IGZvciBjb21tZW50cy4KKworRnJpIEF1ZyAxOSAxNTowNzozMCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQorCisJKiBnZGIuYysrL2RlbWFuZ2xlLmV4cCAodGVzdF9hcm1fc3R5bGVfZGVtYW5nbGluZyk6IEFkZCB0ZXN0cyBmb3IKKwlyZXBlYXRlZCB0eXBlcyBhbmQgcmVwZWF0ZWQgdHlwZXMgd2l0aCBpbmRpY2VzID4gOS4KKworVHVlIEF1ZyAxNiAxNTo1Nzo1MiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL3ByaW50Y21kcy5leHA6IFJlbW92ZSBhbGwgdGhlIGEyOWsgWEZBSUxzIHRhZ2dlZCB3aXRoCisJMjQxNzsgb2xkIGJ1ZyBoYXMgYmVlbiBmaXhlZC4KKworRnJpIEF1ZyAxMiAxOTozNTo0MSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2RiLmJhc2UvaW50ZXJydXB0LmV4cDogV2hlbiB0cnlpbmcgdG8gd2FrZSB1cCB0aGUgaW5mZXJpb3IsCisJc2VuZCB0aGUgbmV3bGluZSBvdXJzZWx2ZXMgaW5zdGVhZCBvZiBhc3N1bWluZyBnZGJfdGVzdCB3aWxsIGRvCisJc28gd2hlbiBwYXNzZWQgYW4gZW1wdHkgaW5wdXQgc3RyaW5nLgorCisJKiBnZGIuc3RhYnMvaHBwYS5tdDogVXNlICQoQVMpLCBub3QgJChDQykgdG8gYXNzZW1ibGUgdGhlCisJc3RhYnMgdGVzdGNvZGUuCisKK0ZyaSBBdWcgIDUgMTc6MDE6MDcgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQorCisJKiBsaWIvZ2RiLmV4cCAoZ2RiX3Rlc3QpOiBEb24ndCBzZW5kIGFueXRoaW5nIGlmIHRoZSBmaXJzdAorCSAgYXJndW1lbnQgaXMgYW4gZW1wdHkgc3RyaW5nLiAgVGhpcyBtYWtlcyBjYXNlcyB3aGVyZSB3ZSB3YW50IHRvCisJICBtYXRjaCBvdXRwdXQgdGhhdCBpcyBhbHJlYWR5IGluIGV4cGVjdCdzIGJ1ZmZlcnMgKGZvciBleGFtcGxlLAorCSAgbWF0Y2hpbmcgYSBicmVha3BvaW50IGFmdGVyIGdkYl9ydW5fY21kIGhhcyBiZWVuIGNhbGxlZCkgd29yaworCSAgcmVsaWFibHkuCisKK1R1ZSBBdWcgIDIgMTA6MjQ6MDggMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQorCisJKiBjb25maWcvbmV0d2FyZS5leHA6IE5ldyBmaWxlLgorCitUaHUgSnVsIDI4IDEyOjU0OjA3IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL210LXNsaXRlIChMREZMQUdTKTogSWYgdXNpbmcgdGhlIG5ld2xpYiBpbiB0aGUgdHJlZSwgc2V0CisJICB0aGUgLUIgYW5kIC1MIHByZWZpeGVzIHNvIHdlIGNhbiBmaW5kIHRoZSBkZWJ1Z2dpbmcgc3R1Yi4KKworCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQsIENYWF9GT1JfVEFSR0VUKTogVXNlIG5ld2xpYiBpZiBpdCBpcworCSAgdGhlcmUgYW5kIHdlIGFyZSB1c2luZyB0aGUgZ2NjIGZyb20gdGhlIHRyZWUuCisKKwkqIGdkYi5iYXNlL3R5cGVzLmM6IFJlbW92ZWQuCisKKwkqIGdkYi5iYXNlL2NvbmZpZ3VyZS5pbjogTG9vayBmb3IgbWFrZWZpbGUgZnJhZ21lbnRzIGluIC4uL2NvbmZpZy4KKwkgIFJlY29nbml6ZSBpMzg2LSotbmV0d2FyZS4KKwkqIGdkYi5jKysvY29uZmlndXJlLmluOiBMaWtld2lzZS4KKworTW9uIEp1bCAyNSAyMzo0ODo1MCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi5iYXNlL2NvcmVmaWxlLmV4cDogIENoYW5nZSBgZWxzZSBpZicgdG8gYGVsc2VpZicsIHdoaWNoIGlzCisJdGhlIGNvcnJlY3QgVENMIHN5bnRheC4KKworTW9uIEp1bCAyNSAxNTozNTo1NiAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL29wYXF1ZS5leHA6IHVzZSBydW50byBpbnN0ZWFkIG9mIG1lc3NpbmcgYXJvdW5kIHdpdGgKKwkgIGJyZWFrcG9pbnRzLiAgU2ltcGxpZnkgYnkgdXNpbmcgZ2RiX3Rlc3QuCisKKwkqIGdkYi5iYXNlL2JpdGZpZWxkcy5leHA6IHJlc3RhcnQgYmV0d2VlbiB0ZXN0cyBvbiBuZXR3YXJlIHRhcmdldHMKKwkgIGJlY2F1c2UgYnJlYWtwb2ludHMgYXJlbid0IHJlbG9jYXRlZCBhZnRlciB0YXJnZXQgZGVhdGguICBSdW4KKwkgIHByb2Nlc3NlcyB0byBjb21wbGV0aW9uLgorCisJKiBnZGIuYmFzZS97b3BhcXVlLHdhdGNocG9pbnR9LmV4cDogVXNlIGdkYl9ydW5fY21kLgorCitTdW4gSnVsIDI0IDA5OjU1OjUxIDE5OTQgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIFJlbW92ZSBleHRyYSB0YWJzIHRoYXQgY29uZnVzZSBzb21lIHZlcnNpb25zCisJb2YgIm1ha2UiLiAgVXNlIHRoZSBuZXdseSBidWlsdCBnZGIgdG8gdGVzdCB3aXRoIGJ5IGRlZmF1bHQsCisJcmF0aGVyIHRoYW4gdGhlIGZpcnN0IG9uZSBpbiB0aGUgdGVzdGVyJ3Mgc2VhcmNoIHBhdGguCisKK1NhdCBKdWwgMjMgMTU6MDU6NDcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBnZGIuYmFzZS93aGF0aXMuZXhwICh2X3NpZ25lZF9zaG9ydF9hcnJheSk6IEZpeCBhIHR5cG8uCisKKwkqIGdkYi5iYXNlL2hlbHAuZXhwOiBVcGRhdGUgZXhwZWN0ZWQgYWRkLXN5bWJvbC1maWxlLCBpZ25vcmUsIGFuZAorCWNvbmRpdGlvbiBoZWxwLgorCitUdWUgSnVsIDE5IDEwOjI2OjMyIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKKworCSogbGliL2dkYi5leHAgKHJ1bnRvKTogUmV3cml0ZSBpbiB0ZXJtcyBvZiBnZGJfcnVuX2NtZC4KKworCSogbGliL2dkYi5leHAgKGdkYl9ydW5fY21kKTogTmV3IGZ1bmN0aW9uLCB1c2VkIHRvIHN0YXJ0IHByb2dyYW0KKwkgIHJ1bm5pbmcuCisJKiBnZGIuYmFzZS9iaXRmaWVsZHMuZXhwOiBVc2UgZ2RiX3J1bl9jbWQgdG8gc3RhcnQgcHJvZ3JhbS4KKwkqIGdkYi5iYXNlL2Z1bmNhcmdzLmV4cDogTGlrZXdpc2UuCisKKwkqIGdkYi5iYXNlL2JpdGZpZWxkcy5leHA6IFNpbXBsaWZ5IGJ5IHVzaW5nIGdkYl90ZXN0LgorCSogZ2RiLmJhc2UvZnVuY2FyZ3MuZXhwOiBMaWtld2lzZS4KKworCSogbGliL2dkYi5leHAgKGdkYl90ZXN0KTogaWYgbWF0Y2ggdGltZXMgb3V0LCBkb24ndCBjYWxsIGZhaWwgaWYKKwkgIG1lc3NhZ2UgaXMgIiIuCisKK01vbiBKdWwgMTggMTI6MTg6MDcgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQorCisJKiBnZGIuYmFzZS97YTItcnVuLGNhbGxmdW5jcyxmdW5jYXJncyxpbnRlcnJ1cHQsbWlwc19wcm8sbm9kZWJ1ZywKKwkgIHJldHVybixzaWduYWxzLHR3aWNlfS5leHA6IEhhbmRsZSBub24tZXhpc3RhbnQgYmluYXJpZXMKKwkgIGNvbnNpc3RhbnRseS4KKworCSogZ2RiLmJhc2UvY29yZWZpbGUuZXhwOiBFeGVjdXRlIGNvcmVtYWtlciB0byBnZW5lcmF0ZSBjb3JlIGR1bXAuCisJKiBnZGIuYmFzZS9NYWtlZmlsZS5pbjogRG9uJ3QgdHJ5IHRvIGdlbmVyYXRlIGEgY29yZSBkdW1wLCB3ZQorCSAgbWlnaHQgdGVzdGluZyBhIGNyb3NzIGRldmVsb3BtZW50IHN5c3RlbS4KKworVGh1IEp1bCAxNCAxODoxMzo1NiAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChSVU5URVNUX0ZPUl9UQVJHRVQpOiBGaXggcmVsYXRpdmUgcGF0aG5hbWUsIHRoZQorCSAgcnVudGVzdCBzY3JpcHQgaXMgcmVsYXRpdmUgdG8gJHtzcmNkaXJ9LCBub3QgJHtyb290ZGlyfS4KKworVGh1IEp1bCAxNCAxNDo1Njo1OSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL3NpZ25hbHMuZXhwOiBBbGxvdyBmb3Igb3B0aW9uYWxpdHkgb2YgYnJlYWtwb2ludAorCWFkZHJlc3MuCisKK1RodSBKdWwgMTQgMTE6MjE6MjcgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi5iYXNlL3twdHlwZS5leHAscHR5cGUuY306IEFkZCB0X2NoYXJfYXJyYXkgdGVzdC4KKworVHVlIEp1bCAxMiAxMjoyMjozMiAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCisKKwkqIGdkYi5jKysvY3BsdXNmdW5jcy5jYzogSW5jbHVkZSA8c3RkZGVmLmg+LCBub3QgPHN5cy90eXBlcy5oPiwKKwkgIGZvciBzaXplX3QgZGVmaW5pdGlvbi4KKwkqIGdkYi5jKysvdGVtcGxhdGVzLmNjOiBMaWtld2lzZQorCisJKiBjb25maWcvbXQtaTM4Ni1uZXR3YXJlOiBOZXcgZmlsZS4KKworCSogZ2RiLmJhc2UvaW50ZXJydXB0LmM6IERvIG5vdCB0ZXN0IGlmIGVycm5vID09IEVJTlRSIGlmIGl0J3Mgbm90CisJICBkZWZpbmVkLgorCisJKiBnZGIuYmFzZS9NYWtlZmlsZS5pbjogQWRkZWQgc3VwcG9ydCBmb3Igc3lzdGVtcyB0aGF0IG5hbWUgY29yZQorCSAgZmlsZXMgYnkgYXBwZW5kaW5nICJjb3JlIiB0byB0aGUgcHJvZ3JhbSBuYW1lLgorCSogZ2RiLmJhc2UvYTEtc2VsZnRlc3QuZXhwOiBMaWtld2lzZS4KKworTW9uIEp1bCAxMSAyMzo1OToxOCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi5iYXNlL3JldHVybi5leHA6ICBBZGQgY29tbWVudCBhbmQgbWVzc2FnZSBmb3IgYHJldHVybiBkb3VibGUnCisJdGVzdCBmYWlsdXJlIG9uIFNwYXJjIFNvbGFyaXMuCisKK01vbiBKdWwgIDQgMTI6MTA6NDggMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBsaWIvZ2RiLmV4cCAocnVudG8pOiBBbGxvdyBmb3Igb3B0aW9uYWxpdHkgb2YgYnJlYWtwb2ludCBhZGRyZXNzLgorCitXZWQgSnVuIDI5IDAwOjI2OjE3IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLmMrKy9taXNjLmNjOiAgSW5zdGFudGlhdGUgY2xhc3NlcyB0byBpbmhpYml0IHRoZSBjb21waWxlcgorCWZyb20gb3B0aW1pemluZyB0aGVtIGF3YXkuCisJKiBnZGIuYysrL2NsYXNzZXMuZXhwLCBnZGIuYysrL2luaGVyaXQuZXhwOiAgVXBkYXRlIHB0eXBlIGV4cGVjdAorCXBhdHRlcm5zIHRvIGluY2x1ZGUgZGVmYXVsdCBjb25zdHJ1Y3RvcnMgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3JzLAorCXRvIG1hdGNoIGdjYyB2ZXJzaW9ucyBiZXlvbmQgMi41LjguIEFjY2VwdCBhbnkgY3BsdXMgZGVtYW5nbGluZworCWNoYXJhY3RlciBpbiB0aGUgb3V0cHV0IG9mIHRoZSB2aXJ0dWFsIGJhc2UgcG9pbnRlci4KKworRnJpIEp1biAyNCAwODoxNTo0MiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi5jKysvY3BsdXNmdW5jcy5leHA6ICBVc2Ugc3RyaW5nX3RvX3JlZ2V4cCBhbmQgYSByZWd1bGFyCisJZXhwcmVzc2lvbiBtYXRjaCBpbiBwcmludF9hZGRyX29mIHRvIGF2b2lkIHVuaW50ZW50ZWQgbWF0Y2hlcy4KKwkqIGdkYi5jKysvdmlydGZ1bmMuZXhwOiAgQWNjZXB0IGFsdGVybmF0ZSBwdHlwZSBvdXRwdXQgb2YgZysrCisJdmVyc2lvbnMgdXAgdG8gMi41LjguCisKK01vbiBKdW4gMjAgMjM6NTQ6MzcgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBnZGIuYmFzZS9saXN0LmV4cDogIFR3ZWFrIGFsdGVybmF0ZSBwYXR0ZXJuIGZvciBsaXN0aW5nIG9mIGFuCisJaW5jbHVkZWQgZmlsZSB0byBydW4gdW5kZXIgbmV3ZXIgdmVyc2lvbnMgb2YgZXhwZWN0LgorCSogZ2RiLmMrKy9kZW1hbmdsZS5leHA6ICBBZGQgc3BhY2VzIHRvIHRoZSBleHBlY3QgcGF0dGVybnMgYmV0d2VlbgorCWNvbnNlY3V0aXZlID4ncyBpbiB0ZW1wbGF0ZXMgdG8gYWNjb21vZGF0ZSByZWNlbnQgY3BsdXMtZGVtLmMgY2hhbmdlLgorCVJlbW92ZSB4ZmFpbCBmb3IgdGhlIHZpcnR1YWwgdGFibGUgb2YgQkRESG9va1YuCisKK1NhdCBKdW4gMTggMTI6NTE6MzQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBsaWIvZ2RiLmV4cCAoc3RyaW5nX3RvX3JlZ2V4cCk6IFNldCBhIGRlZmF1bHQgcmVzdWx0LgorCShkZWZhdWx0X2dkYl9zdGFydCk6IEZpeCBtaXNsZWFkaW5nIG1lc3NhZ2UuCisKK1dlZCBKdW4gMTUgMTI6MTA6MTAgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBjb25maWcvbXQtYTI5ay11ZGksIGNvbmZpZy9tdC1pOTYwLW5pbmR5LCBjb25maWcvbXQtc3BhcmMtYW91dDoKKwlSZW1vdmUgYWxsIENDLCBldGMgZGVmaW5pdGlvbnMuCisJKiBjb25maWcvbXQtaHB1eDogTmV3IGZpbGUuCisJKiBjb25maWcvbXQtbWlwcy1lY29mZiAoQ0ZMQUdTX0ZPUl9UQVJHRVQpOiBSZW1vdmU6CisJKENGTEFHUywgTERGTEFHUyk6IERlZmluZS4KKwkqIGNvbmZpZy9tdC1zbGl0ZSAoQ0ZMQUdTX0ZPUl9UQVJHRVQpOiBDaGFuZ2UgdG8gTERGTEFHUy4KKworCSogTWFrZWZpbGUuaW4gKHNpdGUuZXhwKTogRG9uJ3QgaW5zZXJ0IGhvc3Rfb3MsIGV0Yy4KKwkoanVzdC1jaGVjayk6IEp1c3QgdXNlIFJVTlRFU1Qgd2l0aCBSVU5URVNURkxBR1Mgb25seS4KKwkoZGlzdGNsZWFuKTogQ2hlY2sgZXhpc3RlbmNlIG9mIHN1YmRpci4KKwkqIGdkYi5iYXNlL2NvbmZpZ3VyZS5pbiAoaHBwYSotKi1ocHV4Kik6IFJlY29nbml6ZS4KKwkqIGdkYi5iYXNlL01ha2VmaWxlLmluOiBHZW5lcmFsIGNsZWFudXAgYW5kIHNpbXBsaWZpY2F0aW9uLgorCVVzZSBDQywgQ0ZMQUdTLCBhbmQgTERGTEFHUyBpbnN0ZWFkIG9mIC4uLl9GT1JfVEFSR0VUIHZlcnNpb25zCisJdG8gYnVpbGQgZXhlY3V0YWJsZXMuCVVzZSBkZWZhdWx0IHJ1bGUgdG8gYnVpbGQgLm8gZmlsZXMuCisJKEVYUEVDVCwgUlVOVEVTVCwgQ0MpOiBGaXggcmVsYXRpdmUgcGF0aG5hbWUuCisJKHNpdGUuZXhwKTogRG9uJ3QgaW5zZXJ0IGhvc3Rfb3MsIGV0Yy4KKwkqIGdkYi5iYXNlL3NpZ25hbHMuYyAobWFpbik6IERvbid0IGNhbGwgc2lnbmFsIHVubGVzcyBTSUdBTFJNCisJYW5kL29yIFNJR1VTUjEgZGVmaW5lZC4KKwkqIGdkYi5iYXNlL3dhdGNocG9pbnQuYzogRG9uJ3QgaW5jbHVkZSBzdGRpby5oIGEgc2Vjb25kIHRpbWUuCisJKiBnZGIuYysrL01ha2VmaWxlLmluOiBHZW5lcmFsIGNsZWFudXAgYW5kIHNpbXBsaWZpY2F0aW9uLgorCVVzZSBDQywgQ0ZMQUdTLCBhbmQgTERGTEFHUyBpbnN0ZWFkIG9mIC4uLl9GT1JfVEFSR0VUIHZlcnNpb25zCisJKENGTEFHUyk6IFJlbW92ZS4KKwkoRVhQRUNULCBSVU5URVNUX0ZPUl9UQVJHRVQsIENYWCk6IEZpeCByZWxhdGl2ZSBwYXRobmFtZS4KKworRnJpIEp1biAxMCAxMDo1NTowOSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2RiLmJhc2UvcmVjdXJzZS5leHA6IE1pc2MgY2hhbmdlcyB0byBnZXQgdGVzdHMgcnVubmluZyBhZ2FpbgorCWFmdGVyIEt1bmcncyBjaGFuZ2VzIHRvIHRoZSB3YXRjaHBvaW50IGNvZGUuCisJKiBnZGIuYmFzZS93YXRjaHBvaW50LmV4cDogTGlrZXdpc2UuCisKK1RodSBKdW4gIDkgMTU6MTY6NTUgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIGxpYi9nZGIuZXhwIChzdHJpbmdfdG9fcmVnZXhwKTogIENvbnZlcnQge1x9IGFsc28uCisKK1dlZCBKdW4gIDggMTI6MTI6MTcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBjb25maWcvdWRpLWdkYi5leHAsIGNvbmZpZy91bml4LWdkYi5leHA6IENhbGwgZGVmYXVsdF9nZGJfc3RhcnQuCisJKiBsaWIvZ2RiLmV4cCAoZGVmYXVsdF9nZGJfc3RhcnQpOiBEZWZpbmUuCisJKiBnZGIuYmFzZS9iaXRmaWVsZHMuZXhwLCBnZGIuYmFzZS9icmVhay5leHAsIGdkYi5iYXNlL2V4cHJzLmV4cCwKKwlnZGIuYmFzZS9mdW5jYXJncy5leHAsIGdkYi5iYXNlL29wYXF1ZS5leHAsCisJZ2RiLmJhc2UvcHJpbnRjbWRzLmV4cCwgZ2RiLmJhc2UvcHR5cGUuZXhwLCBnZGIuYmFzZS9yZWN1cnNlLmV4cCwKKwlnZGIuYmFzZS9zY29wZS5leHAsIGdkYi5iYXNlL3NldHZhci5leHAsIGdkYi5iYXNlL3dhdGNocG9pbnQuZXhwLAorCWdkYi5jKysvY2xhc3Nlcy5leHAsIGdkYi5jKysvbWlzYy5leHAsIGdkYi5jKysvdmlydGZ1bmMuZXhwOgorCURvbid0IGNhbGwgZ2RiX3RhcmdldF91ZGkgaW4gYmV0d2VlbiB0ZXN0cy4KKworVHVlIEp1biAgNyAwODozMDoxNSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLmMrKy9kZW1hbmdsZS5leHA6IFVzZSBnZGJfdGVzdF9leGFjdCwgcmF0aGVyIHRoYW4gZGVtYW5nbGUKKwkod2hpY2ggd2FzIGJhc2ljYWxseSBqdXN0IGEgbG9jYWwgdmVyc2lvbiBvZiB0aGUgc2FtZSB0aGluZykuICBJbgorCWFkZGl0aW9uIHRvIGF2b2lkaW5nIGR1cGxpY2F0aW9uLCBnZGJfdGVzdF9leGFjdCBpcyBmYXN0ZXIuCisJKiBsaWIvZ2RiLmV4cCAoZ2RiX3Rlc3RfZXhhY3QpOiBGaXggdHlwby4KKworCSogbGliL2dkYi5leHAgKGRlbGV0ZV9icmVha3BvaW50cyk6IElmIHRoZXJlIHdlcmUgbm8gYnJlYWtwb2ludHMsCisJZG9uJ3QgZ2l2ZSBhbiBlcnJvci4KKworCSogZ2RiLmJhc2UvdGVybS5leHA6IENhbGwgZGVsZXRlX2JyZWFrcG9pbnRzIGJlZm9yZSBzdGFydGluZy4KKworCSogZ2RiLmJhc2UvTWFrZWZpbGUuaW4gKEVYRUNVVEFCTEVTKTogUmVtb3ZlIHQxMC4KKwkodDEwKTogQWRkIGNvbW1lbnQuCisKK01vbiBKdW4gIDYgMTg6MjY6NTAgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJUmVvcmdhbml6YXRpb24gb2YgdGhlIEdEQiBUZXN0IFN1aXRlLgorCisJKiBnZGIuYmFzZTogTmV3IGRpcmVjdG9yeSwgY29udGFpbnMgYWxsIHRoZSBiYXNpYyB0ZXN0cy4KKwkqIGdkYi5jKys6IE5ldyBkaXJlY3RvcnksIHRlc3RzIHNwZWNpZmljIHRvIEMrKy4KKwkqIGdkYi5jaGlsbDogTmV3IGRpcmVjdG9yeSwgdGVzdHMgc3BlY2lmaWMgdG8gQ2hpbGwuCisJKiBnZGIudDAwLCBnZGIudDAxLCBnZGIudDAyLCBnZGIudDAzLCBnZGIudDA0LCBnZGIudDA1LCBnZGIudDA2LAorCWdkYi50MDcsIGdkYi50MDgsIGdkYi50MDksIGdkYi50MTAsIGdkYi50MTEsIGdkYi50MTIsIGdkYi50MTMsCisJZ2RiLnQxNSwgZ2RiLnQxNiwgZ2RiLnQxNywgZ2RiLnQyMCwgZ2RiLnQyMSwgZ2RiLnQyMiwgZ2RiLnQyMywKKwlnZGIudDI0LCBnZGIudDMwLCBnZGIudDMxOiBSZW1vdmVkIGRpcmVjdG9yaWVzLCBjb250ZW50cyBtb3ZlZAorCWludG8gYXBwcm9wcmlhdGUgbmV3IGRpcmVjdG9yaWVzICh0MDAtdDE3IHRvIGJhc2UsIHQyMC10MjMgdG8gYysrLAorCXQzMC0zMSB0byBjaGlsbCkuCisJKiAqL2dkYm1lLio6IFJlbmFtZSB0byBtYXRjaCBhcHByb3ByaWF0ZSBleHBlY3Qgc2NyaXB0cy4KKwkqIGdkYi5iYXNlL2JpdGZpZWxkcy5jLCBnZGIuYmFzZS9icmVhay5jLCBnZGIuYmFzZS9jYWxsZnVuY3MuYywKKwlnZGIuYmFzZS9jb3JlbWFrZXIuYywgZ2RiLmJhc2UvZXhwcnMuYywgZ2RiLmJhc2UvZnVuY2FyZ3MuYywKKwlnZGIuYmFzZS9pbnRlcnJ1cHQuYywgZ2RiLmJhc2UvbGlzdDAuYywgZ2RiLmJhc2UvbGlzdDAuaCwKKwlnZGIuYmFzZS9saXN0MS5jLCBnZGIuYmFzZS9taXBzX3Byby5jLCBnZGIuYmFzZS9ub2RlYnVnLmMsCisJZ2RiLmJhc2Uvb3BhcXVlLWluZm8uYywgZ2RiLmJhc2Uvb3BhcXVlMC5jLCBnZGIuYmFzZS9vcGFxdWUxLmMsCisJZ2RiLmJhc2UvcHJpbnRjbWRzLmMsIGdkYi5iYXNlL3B0eXBlLmMsIGdkYi5iYXNlL3JlY3Vyc2UuYywKKwlnZGIuYmFzZS9yZXR1cm4uYywgZ2RiLmJhc2UvcnVuLmMsIGdkYi5iYXNlL3Njb3BlMC5jLAorCWdkYi5iYXNlL3Njb3BlMS5jLCBnZGIuYmFzZS9zZXR2YXIuYywgZ2RiLmJhc2Uvc2lnbmFscy5jLAorCWdkYi5iYXNlL3R5cGVzLmMsIGdkYi5iYXNlL3R3aWNlLmMsIGdkYi5iYXNlL3dhdGNocG9pbnQuYywKKwlnZGIuYmFzZS93aGF0aXMtaW5mby5jLCBnZGIuYmFzZS93aGF0aXMuYzogTmV3IG5hbWVzIG9mIEMgZmlsZXMuCisJKiBnZGIuYysrL2NwbHVzZnVuY3MuY2MsIGdkYi5jKysvdGVtcGxhdGVzLmNjLCBnZGIuYysrL21pc2MuY2MsCisJZ2RiLmMrKy92aXJ0ZnVuYy5jYzogTmV3IG5hbWVzIG9mIEMrKyBmaWxlcy4KKwkqIGdkYi5jaGlsbC9jaGlsbHZhcnMuY2g6IE5ldyBuYW1lIG9mIENoaWxsIGZpbGUuCisJKiBnZGIuYmFzZS9jb25maWd1cmUuaW4sIGdkYi5jKysvY29uZmlndXJlLmluLAorCWdkYi5jaGlsbC9jb25maWd1cmUuaW46IE1lcmdlIGluIGNvbnRlbnRzIG9mIGdkYi50Ki9jb25maWd1cmUuaW4uCisJKiBnZGIuYmFzZS9NYWtlZmlsZS5pbiwgZ2RiLmMrKy9NYWtlZmlsZS5pbiwKKwlnZGIuY2hpbGwvTWFrZWZpbGUuaW46IE1lcmdlIGluIGNvbnRlbnRzIG9mIGdkYi50Ki9NYWtlZmlsZS5pbi4KKwkqIGNvbmZpZ3VyZS5pbiAoY29uZmlnZGlycyk6IFVwZGF0ZSB0byByZWZsZWN0IGRpcmVjdG9yeSBjaGFuZ2VzLgorCSh0YXJnZXRfYWJicmV2KTogTm8gbG9uZ2VyIGRlZmluZSBmb3IgYW55IGNvbmZpZ3VyYXRpb24uCisJKiBNYWtlZmlsZS5pbjogQ29zbWV0aWMgaW1wcm92ZW1lbnRzIHRvIGhlYWRlciBjb21tZW50cy4KKworRnJpIEp1biAgMyAxODo1NjowNiAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCVZhcmlvdXMgY2hhbmdlcyB0byBnZGIudDMxOgorCisJKiBNYWtlZmlsZS5pbiAoZ2RibWUubyk6ICBDb21waWxlIHdpdGggLWZzcGVjaWFsX1VDLgorCSogZ2RibWUuY2g6ICBNYWtlIGFsbCBrZXktd29yZHMgYW5kIHByZWRlZmluZWRzIGJlIHVwcGVyLWNhc2UuCisJKiBjaGlsbHZhcnMuZXhwOiAgRXhwZWN0IGtleS13b3JkcyBhbmQgcHJlZGVmaW5kcyBpbiB1cHBlci1jYXNlLgorCisJKiBjaGlsbHZhcnMuZXhwOiAgVXNlIGdkYl90ZXN0X2V4YWN0IG1hbnkgcGxhY2VzLgorCUNoYW5nZSBleHBlY3RlZCBvdXRwdXQgZm9yIGFycmF5cyAod2hpY2ggbm93IGluY2x1ZGVzIGluZGV4IGxhYmVscykuCisKKwkqIHByLTUwMjAuZXhwLCBnZG1lLmNoIChtb2R1bGUgUFJfNTAyMCk6CisJTmV3IHRlc3QsIGZvciBQUi01MDIwLgorCitUaHUgSnVuICAyIDE2OjAyOjQxIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQorCisJKiBsaWIvZ2RiLmV4cCAoc3RyaW5nX3RvX3JlZ2V4cCwgZ2RiX3Rlc3RfZXhhY3QpOiAgTmV3IHByb2NlZHVyZXMuCisJKiBNYWtlZmlsZS5pbiAoQ0hJTExfTElCKTogIFJlbW92ZSBib2d1cyByZWR1bmRhbnQgZGVmaW5pdGlvbnMuCisKK1N1biBNYXkgMjkgMjI6MzE6NDIgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgRml4IGJpdC1yb3QgaW4gZGVmaW5pdGlvbnMgb2YgQ0hJTEwsCisJQ0hJTExfRk9SX1RBUkdFVCBhbmQgQ2hpbGxfTElCLgorCSogZ2RiLnQzMS9nZGJtZS5jaDogIEZpeCBzeW50YXggb2YgbmVzdGVkIGFycmF5IHR1cGxlcy4KKwkqIGdkYi50MzEvTWFrZWZpbGUuaW46ICBBZGQgZGVmaW5pdGlvbnMgZm9yIENISUxMRkxBR1MsCisJQ0hJTEwsIGFuZCBDSElMTF9MSUIuCisKK1NhdCBNYXkgMjEgMTA6MDU6MDggMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQorCisJKiBSZXZlcnQgdGhlIHByZXZpb3VzIGNoYW5nZXMuICBQbGVhc2Ugc2VlIFJvYidzIGRpcmVjdG9yeQorCSAgL2xpc2EvdGVzdC9yb2IvcHJvZ3Jlc3NpdmUvZ2RiL3Rlc3RzdWl0ZSBmb3IgdGhlc2UgZml4ZXMuCisKK1RodSBNYXkgMTkgMTI6NTE6MDAgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluLCBjb25maWcvbWlwcy1nZGIuZXhwLAorICAgICAgICAgIGNvbmZpZy9tdC1hMjlrLXVkaSwgY29uZmlnL210LWkzODYtYW91dCwgY29uZmlnL210LWk5NjAtbmluZHksCisgICAgICAgICAgY29uZmlnL210LXNwYXJjLWFvdXQsIGNvbmZpZy91ZGktZ2RiLmV4cCwgY29uZmlnL3VuaXgtZ2RiLmV4cCwKKyAgICAgICAgICBjb25maWcvdW5rbm93bi5leHAsIGdkYi50MDAvZGVmYXVsdC5leHAsIGdkYi50MDAvaGVscC5leHAsLAorCSAgZ2RiLnQwMC90ZXN0c3RyYXRlZ3kuZXhwLCBnZGIudDAxL01ha2VmaWxlLmluLCBnZGIudDAyL01ha2VmaWxlLmluLAorCSAgZ2RiLnQwMi93aGF0aXMuZXhwLCBnZGIudDAzL01ha2VmaWxlLmluLCBnZGIudDAzL2dkYm1lLmMsCisJICBnZGIudDA0L01ha2VmaWxlLmluLCBnZGIudDA1L01ha2VmaWxlLmluLCBnZGIudDA2L01ha2VmaWxlLmluLAorCSAgZ2RiLnQwNi9icmVhay5leHAsIGdkYi50MDYvc2lnbmFscy5jLCBnZGIudDA2L3NpZ25hbHMuZXhwLAorCSAgZ2RiLnQwOC9NYWtlZmlsZS5pbiwgZ2RiLnQwOC9vcGFxdWUuZXhwLCBnZGIudDA5L01ha2VmaWxlLmluLAorCSAgZ2RiLnQxMC9NYWtlZmlsZS5pbiwgZ2RiLnQxMS9NYWtlZmlsZS5pbiwgZ2RiLnQxMi9NYWtlZmlsZS5pbiwKKwkgIGdkYi50MTMvTWFrZWZpbGUuaW4sIGdkYi50MTUvTWFrZWZpbGUuaW4sIGdkYi50MTUvZnVuY2FyZ3MuZXhwLAorCSAgZ2RiLnQxNS9nZGJtZS5jLCBnZGIudDE1L3JldHVybi5leHAsIGdkYi50MTYvTWFrZWZpbGUuaW4sCisJICBnZGIudDE3L01ha2VmaWxlLmluLCBnZGIudDE3L2NhbGxmdW5jcy5leHAsIGdkYi50MTcvZ2RibWUuYywKKwkgIGdkYi50MjAvTWFrZWZpbGUuaW4sIGdkYi50MjEvTWFrZWZpbGUuaW4sIGdkYi50MjEvY3BsdXNmdW5jcy5leHAsCisJICBnZGIudDIyL01ha2VmaWxlLmluLCBnZGIudDIyL3ZpcnRmdW5jLmV4cCwgZ2RiLnQyMy9NYWtlZmlsZS5pbiwKKwkgIGdkYi50MjQvZGVtYW5nbGUuZXhwLCBsaWIvZ2RiLmV4cDogIENoZWNrIGluIFJvYidzIHRlc3RpbmcKKwkgIGNoYW5nZXMgZnJvbSA5NFExLgorCitXZWQgTWF5IDE4IDE3OjA0OjAzIDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSksCisKKwkqIGNvbmZpZy9tdC1seW54LCBjb25maWcvbXQtbTY4aywgY29uZmlnL210LW1pcHMtZWNvZmYsCisJICBjb25maWcvbXQtc2xpdGUsIGNvbmZpZy9tdC11bml4LCBjb25maWcvbXQtdnh3b3JrczogQWRkCisJICBSb2IncyBuZXcgdGVzdGluZyBmcmFnbWVudHMuCisKK1R1ZSBNYXkgMTcgMTU6MDQ6MTQgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWcvbWlwcy1nZGIuZXhwLCBjb25maWcvdWRpLWdkYi5leHAsIGNvbmZpZy92eC1nZGIuZXhwLAorICAgICAgICAgIGxpYi9nZGIuZXhwOiBSZXBsYWNlIGVycm9yIHByb2MgY2FsbHMgd2l0aCBwZXJyb3IuCisKK01vbiBNYXkgMTYgMTk6MDA6NTAgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBnZGIudDAwL3Rlc3RzdHJhdGVneS5leHA6IFJlb3JkZXIgc28gdGhhdCBBSVggZ2RiIGNhbiBwcmludCB0aGUKKwl2ZXJzaW9uIGFsc28sIG1hdGNoIG9uIGNhc3RlZCB2ZXJzaW9uIHN0cmluZ3MsIGFuZCBtYXRjaCBvbgorCWdkYiBzdGFydHVwIGNhc2Ugd2hlcmUgdGhlIGxpbmUgbnVtYmVycyBtaWdodCBiZSBtZXNzZWQgdXAuCisKK0ZyaSBNYXkgMTMgMTg6MDA6MjcgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQorCisJKiBjb25maWcvbXQtaTk2MC12eCAoTERGTEFHUyk6IEFkZCAnLXInIG9wdGlvbiBmb3IgdGVzdCBsaW5rcy4KKyAgICAgICAgICAoQ0ZMQUdTKTogRGVsZXRlIGl0IGZyb20gaGVyZS4KKworVHVlIE1heSAgMyAxNjowODowOSAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQorCisJKiBnZGIudDIyL3ZpcnRmdW5jLmV4cDogRml4IGcrKyBwdHlwZSBleHBlY3RlZCBvdXRwdXRzLgorCitGcmkgQXByIDI5IDE0OjI2OjM1IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFJVTlRFU1QpOiBEZWZhdWx0IHRvIGp1c3QgInJ1bnRlc3QiLgorCitUdWUgQXByIDI2IDIyOjIxOjQwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnZGIudDE3L2NhbGxmdW5jcy5leHA6IE1vcmUgY29tbWVudHMgYWJvdXQgdF9mdW5jX3ZhbHVlcyB0ZXN0cy4KKwkqIGdkYi50MTcvZ2RibWUuYyAodF9mdW5jX3ZhbHVlcyk6IEFkZCBjb21tZW50cyBhYm91dCBob3cgYW5kIHdoeQorCXRoZSBjb2RlIGhhcyBiZWVuIHJlc3RydWN0dXJlZC4KKworVGh1IEFwciAyMSAxMjo0ODowNyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwMC9kZWZhdWx0LmV4cCAoc2V0IHdyaXRlKTogQWxsb3cgYW55IG51bWJlciBvZiBcciBhbmQvb3IKKwlcbiwgbm90IGp1c3Qgb25lIG9mIGVhY2guCisKKwkqIGdkYi50MDcvZ2RibWUuYyAobWFpbik6IERvbid0IHRha2UgYWRkcmVzcyBvZiBhbiBhcnJheTsgU3VuT1M0CisJL2Jpbi9jYyBnaXZlcyBhIHdhcm5pbmcgaWYgeW91IGRvLgorCitUaHUgQXByIDIxIDExOjU0OjA0IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCisKKwkqIGdkYi50MjQvZGVtYW5nbGUuZXhwOiBjaGFuZ2UgZXhwZWN0IHBhdHRlcm4gb2YgCisJX190MTBMaXN0U19saW5rMVpVaVJDVWlQVDAKKworV2VkIEFwciAxMyAxNTowNTowMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2RiLnQwNy97cmVjdXJzZS5leHAsIHJlY3Vyc2UuY306IE5ldyB0ZXN0cyBmb3Igd2F0Y2hwb2ludHMKKwlvbiBsb2NhbCB2YXJpYWJsZXMgaW4gcmVjdXJzaXZlIGZ1bmN0aW9ucy4KKworCSogZ2RiLnQwNy9NYWtlZmlsZS5pbjogQnVpbGQgdGhlIG5ldyB0ZXN0LgorCitUdWUgQXByIDEyIDIwOjQ1OjI1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnZGIudDE3L2dkYm1lLmMgKHRfZnVuY192YWx1ZXMpOiBEbyBub3QgY29tcGFyZSBmdW5jdGlvbiBwb2ludGVycworCWRpcmVjdGx5LiAgSW5zdGVhZCBjb21wYXJlIHRoZSByZXR1cm4gdmFsdWVzIGZyb20gYWN0dWFsIGNhbGxzLgorCitNb24gQXByIDExIDEwOjMxOjAwIDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogU2V0IFRDTF9MSUJSQVJZIGZvciBydW50ZXN0LgorCitNb24gQXByIDExIDA5OjE1OjMwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBGcm9tIFBldGVyIFNjaGF1ZXIgd2l0aCBtaW5vciBtb2RpZmljYXRpb25zLgorICAgICAgICAqIGdkYi50MTUvcmV0dXJuLmV4cCAocmV0dXJuX3Rlc3RzKTogSGFuZGxlIHRhcmdldHMgd2hlcmUgInJldHVybiIKKyAgICAgICAgc3RvcHMgaW4gbWlkLWxpbmUgaW4gdGhlIGNhbGxlci4gIEFkZCB4ZmFpbCBmb3IgcmV0dXJuaW5nIGEgZmxvYXQKKyAgICAgICAgdmFsdWUgb24gWDg2IHRhcmdldHMuCisKK1R1ZSBBcHIgIDUgMTU6MTY6MzMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdkYi5kaXNhc20vaHBwYS5leHAgKGZjbXBfdGVzdHMpOiBCcmVhayB1cCBpbnRvIHR3byBoYWx2ZXMKKwl0byBhdm9pZCBleHBlY3QgbG9zc2FnZS4KKwkoZm1lbV9MUmJ1Z190ZXN0cyk6IExpa2V3aXNlLgorCSogZ2RiLmRpc2FzbS9ocHBhLnM6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KKworCSogZ2RiLmRpc2FzbS9ocHBhLmV4cDogUmV3b3JrIGVzY2FwZSBzZXF1ZW5jZXMgYW5kIGVuZC1vZi1saW5lCisJY29uZGl0aW9ucyB0byB3b3JrIHdpdGggbGF0ZXN0IGRlamFnbnUvZXhwZWN0LgorCisJKiBnZGIudDE1L2Z1bmNhcmdzLmV4cCAoZmluaXNoIGZyb20gaW5kaXJlY3QgY2FsbCk6IE5vIGxvbmdlcgorCWV4cGVjdGVkIHRvIGZhaWwgb24gdGhlIFBBLgorCShiYWNrdHJhY2UgaW4gY2FsbCB3aXRoIHRyYW1wb2xpbmVzKTogRXhwbGljaXRseSByZXF1aXJlIG1haW4KKwl0byBiZSBmcmFtZSAjMSAobm8gdHJhbXBvbGluZXMgc2hvdWxkIHNob3cgdXAgaW4gYmFja3RyYWNlKS4KKworCSogZ2RiLnQwMC9kZWZhdWx0LmV4cDogVXNlICJleHBfY29udGludWUiIHJhdGhlciB0aGFuIG9ic29sZXRlCisJImNvbnRpbnVlIC1leHBlY3QiLgorCSogZ2RiLnQwNi9icmVhay5leHA6IExpa2V3aXNlLgorCSogZ2RiLnQwNy93YXRjaHBvaW50LmV4cDogTGlrZXdpc2UuCisJKiBnZGIudDEzL2JpdGZpZWxkcy5leHA6IExpa2V3aXNlLgorCSogZ2RiLnQxNS97ZnVuY2FyZ3MscmV0dXJufS5leHA6IExpa2V3aXNlLgorCSogZ2RiLnN0YWJzL3dlaXJkLmV4cDogTGlrZXdpc2UuCisJKiBjb25maWcve21pcHMsdWRpfS1nZGIuZXhwOiBMaWtld2lzZS4KKworCSogaHBwYS5zZWQ6IEVuY2xvc2UgY29tbWVudHMgd2l0aGluIGEgc2VkIGNvbW1hbmQgdG8gYXZvaWQKKwlsb3Npbmcgd2l0aCB0aGUgb2xkIE9TRjEgc2VkLgorCitXZWQgTWFyIDMwIDAwOjMxOjQ5IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLnQwMi93aGF0aXMuZXhwLCBnZGIudDA4L29wYXF1ZS5leHA6ICBBZGQgWEZBSUxzIGZvcgorCXNlcXVlbnQgZHluaXguCisJKiBnZGIudDA2L3NpZ25hbHMuZXhwOiAgQWRkIGNsZWFyX3hmYWlsIGZvciBzZXF1ZW50IGR5bml4LgorCSogZ2RiLnQxNS9mdW5jYXJncy5leHA6ICBDb25kaXRpb25hbGx5IHN0ZXAgYWdhaW4gdG8gcmVhbGx5CisJZmluaXNoIGZyb20gbWFya2VyX2NhbGxfd2l0aF90cmFtcG9saW5lcy4gSGFuZGxlIHRoZSBjYXNlIHdoZXJlCisJdGhlIGZpcnN0IHN0ZXAgZnJvbSB3aXRoaW4gY2FsbF93aXRoX3RyYW1wb2xpbmVzIGFscmVhZHkgc3RlcHMKKwl1cyBiYWNrIHRvIG1haW4uCisJKiBnZGIudDE1L2dkYm1lLmM6ICBBZGQgY29tbWVudCB0byBjbG9zaW5nIGJyYWNlIG9mCisJY2FsbF93aXRoX3RyYW1wb2xpbmVzIGZvciBmdW5jYXJncy5leHAuCisKK1R1ZSBNYXIgMjkgMjM6NTU6MjcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdkYi50MDcvd2F0Y2hwb2ludC5leHAgKHRlc3Rfd2F0Y2hwb2ludF90cmlnZ2VyZWRfaW5fc3lzY2FsbCk6IAorCUZpeCB0eXBvKHMpLgorCitTdW4gTWFyIDI3IDE2OjUzOjE0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnZGIudDA3L2dkYm1lLmM6IE1vcmUgY29kZSBmb3Igd2F0Y2hwb2ludCB0ZXN0aW5nLgorCisJKiBnZGIudDA3L3dhdGNocG9pbnQuZXhwOiBBY2NlcHQgYm90aCAiV2F0Y2hwb2ludCIgYW5kCisJIkhhcmR3YXJlIHdhdGNocG9pbnQiIHRocm91Z2hvdXQgZmlsZS4KKwkodGVzdF93YXRjaHBvaW50X3RyaWdnZXJlZF9pbl9zeXNjYWxsKTogTmV3IHRlc3QuCisJKHRlc3RfY29tcGxleF93YXRjaHBvaW50KTogTmV3IHRlc3QuCisKK0ZyaSBNYXIgMjUgMTc6MDU6MzEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdkYm1lLmMgKGNhbGxfd2l0aF90cmFtcG9saW5lcyk6IE5ldyBmdW5jdGlvbiB0byB0cnkgYW5kIHN0ZXAKKwlpbnRvLiAgVGVzdHMgdHJhbXBvbGluZSBwcm9ibGVtcyBvbiB0aGUgUEEuCisKKwkqIGZ1bmNhcmdzLmV4cCAobG9jYWx2YXJzX2luX2luZGlyZWN0X2NhbGwpOiBObyBsb25nZXIgZXhwZWN0CisJc3RlcHBpbmcgaW50byBpbmRpcmVjdCBjYWxsIHRvIGZhaWwgb24gUEFzLgorCSh0ZXN0X3N0ZXBwaW5nX292ZXJfdHJhbXBvbGluZXMpOiBOZXcgdGVzdC4KKworV2VkIE1hciAyMyAwNzo0MzozMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogVE9ETzogQWRkIHN1Z2dlc3Rpb25zIGZvciBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIHRlc3RzLCBhbmQKKwljb21wbGV0aW9uIHRlc3RzLgorCitXZWQgTWFyIDE2IDA4OjI4OjI4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBUT0RPOiBBZGQgc3VnZ2VzdGlvbnMgZm9yICJwL2EiIHRlc3RzLgorCisJKiBsaWIvZ2RiLmV4cDogU2V0IHByb21wdCB0byAoZ2RiKSBpZiBpdCBpc24ndCBhbHJlYWR5IHNldC4KKwkoZGVmYXVsdF9nZGJfZXhpdCk6IFJlcGxhY2UgYWxsIHRoZSBoYWlyIHdpdGggc2VuZGluZyAicXVpdCIgdG8KKwl0aGUgcHJvY2VzcyB3aXRoIGEgc2ltcGxlIGNsb3NlLgorCitUdWUgTWFyIDE1IDA4OjQ1OjUwIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBUT0RPOiBBZGQgc3VnZ2VzdGlvbnMgZm9yIHNoYXJlZCBsaWJyYXJ5IHRlc3RzLgorCitTdW4gTWFyIDEzIDEwOjQ1OjIyIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBUT0RPOiBBZGQgc3VnZ2VzdGlvbnMgZm9yIHgvcyB0ZXN0cy4KKworRnJpIE1hciAxMSAwODoyMjowMCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwMC9oZWxwLmV4cDogUmVwbGFjZSBtb3N0IG9mIGRvY3N0cmluZ3MgZm9yICJ0YnJlYWsiLAorCSJlbmFibGUgb25jZSIsIGFuZCAiZW5hYmxlIGJyZWFrcG9pbnRzIG9uY2UiIHdpdGggIi4qIi4KKworVGh1IE1hciAxMCAwODozNDoyNyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogVE9ETzogQWRkIHN1Z2dlc3Rpb25zIGFib3V0IHN0cnVjdHVyZSBwYXNzaW5nIHRlc3RzLgorCitNb24gTWFyICA3IDEzOjQ1OjU0IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLnQwMy9nZGJtZS5jOiAgZ2NjIHZlcnNpb24gMSBwdXRzIG91dCB0aGUgd3Jvbmcgc3RhYnMgZm9yCisJdGhlIHByaW1hcnkxIHRlc3QsIHVzZSB3b3JrIGFyb3VuZCBpZiBfX0dOVUNfXyA8IDIuCisJKiBnZGIudDA2L3NpZ25hbHMuYzogIEFkZCBjb21tZW50cyBmb3Igc2lnbmFscy5leHAgcGF0dGVybiBtYXRjaGluZy4KKwkqIGdkYi50MDYvc2lnbmFscy5leHA6ICBBZGQgWEZBSUxzIGZvciBpMzg2IGJzZCBhbmQgdmF4IHVsdHJpeC4KKwlUZXN0IGZvciBiYWQgb3V0cHV0IHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIHRpbWVvdXQuICBJc3N1ZQorCXNlY29uZCBjb250aW51ZSBvbmx5IGlmIGZpcnN0IGNvbnRpbnVlIGZhaWxlZC4KKworV2VkIE1hciAgMiAxMDowODowMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogZ2RiLnQyMS9jcGx1c2Z1bmNzLmV4cCAodGVzdF9wYWRkcl9vcGVyYXRvcl9mdW5jdGlvbnMpOiBEbworCW9wZXJhdG9yW10gdGVzdCB3aXRoIGdkYl90ZXN0IGJlY2F1c2UgdGhlIG9sZCBjb2RlIGRpZG4ndCBzZWVtIHRvCisJYmUgZ2V0dGluZyB0aGUgcXVvdGluZyByaWdodCB3aXRoIHRoZSBuZXcgZGVqYWdudS4KKworVGh1IEZlYiAyNCAxOTo0OToyNSAxOTk0ICBSb2IgU2F2b3llICAocm9iQHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIGxpYi9nZGIuZXhwOiBTZXQgR0RCIHRvIGEgZnJlc2ggZ2RiIGlmIHRoZXJlIGlzIG9uZSwgZWxzZSB1c2UKKwlvbmUgZnJvbSB0aGUgcGF0aC4KKwkqIE1ha2VmaWxlLmluOiBVc2UgYSBmcmVzaCBleHBlY3QgaWYgdGhlcmUgaXMgb25lLCB1c2UgcnVudGVzdAorCWZyb20gdGhlIHNyYyB0cmVlIGlmIHRoZXJlIGlzIG9uZS4KKyAgCitUaHUgRmViIDI0IDE4OjQ5OjM3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBnZGIudDA2L2JyZWFrLmV4cCAodGVzdF9uZXh0X3dpdGhfcmVjdXJzaW9uKTogUmVtb3ZlIHhmYWlsIGZvcgorCW5leHQgb3ZlciByZWN1cnNpdmUgY2FsbC4gIFJldmlzZSB0aGUgdGVzdHMgZnJvbSB0aGF0IHBvaW50IG9uCisJKHdoaWNoIGhhZCBiZWVuIHNraXBwZWQpIHRvIG1hdGNoIEdEQidzIGFjdHVhbCAoY29ycmVjdCkgb3V0cHV0LgorCisJKiBnZGIudDA3L3dhdGNocG9pbnQuZXhwICh0ZXN0X3N0ZXBwaW5nKTogUmVtb3ZlIHhmYWlsIGZvciBidWcKKwl3aXRoIG5leHQgb3ZlciBhIGJyZWFrcG9pbnQgd2hvc2UgY29uZGl0aW9uIGlzIGZhbHNlLgorCisJKiBnZGIudDAwL2hlbHAuZXhwOiBDb21tZW50IG91dCAiaGVscCBzZXQgcHJpbnQiIHRlc3RzIGp1c3QgbGlrZQorCShhbmQgZm9yIHNhbWUgcmVhc29uIGFzKSAiaGVscCBzZXQiIHRlc3QuCisKK01vbiBGZWIgMTQgMDk6NTg6MjMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdkYi5kaXNhc20vaHBwYS5zIChmbWVtTFJidWdfdGVzdHMpOiBOZXcgdGVzdHMuCisJKiBnZGIuZGlzYXNtL2hwcGEuZXhwIChmbWVtTFJidWdfdGVzdHMpOiBSdW4gdGhlbS4KKworU3VuIEZlYiAgNiAxNTozNjoxMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwNi9icmVhay5leHAgKHRlc3RfbmV4dF93aXRoX3JlY3Vyc2lvbik6IFJlbW92ZSBubyBsb25nZXIKKwluZWNlc3NhcnkgZ2RiX3RhcmdldF91ZGkuCisKKwkqIGdkYi50MDMvcHR5cGUuZXhwOiBGb3IgVURJLCBza2lwIHRlc3RzIHdoaWNoIGNhbGwgbWFsbG9jLgorCisJKiBnZGIudDAyL3doYXRpcy5leHAsIGdkYi50MDMvcHR5cGUuZXhwOiBSZW1vdmUgeGZhaWxzIGZvciBQUnMKKwkxODM4IGFuZCAyNDE3OyB0aGV5IGFyZSBmaXhlZC4KKworCSogZ2RiLnQwMi93aGF0aXMuZXhwICh2X2NoYXJfYXJyYXksIHZfc2lnbmVkX2NoYXJfYXJyYXkpLAorCWdkYi50MDMvcHR5cGUuZXhwIChwdHlwZSBzdHJ1Y3R1cmUsIHB0eXBlIHVuaW9uKToKKwlSZW1vdmUgeGZhaWxzOyB0aGUgdGVzdCBpcyBsb29zZXIgdGhhbiB3aGVuIHRoZSB4ZmFpbHMgd2VyZSBhZGRlZC4KKworCSogZ2RiLnQwMC97aGVscC5leHAsZGVmYXVsdC5leHB9OiBEb24ndCB0ZXN0ICJ0YXJnZXQgcmVtb3RlIiBvbiBVREkuCisJKiBnZGIudDAwL2hlbHAuZXhwOiBEb24ndCBleHBlY3QgcmVtb3RlIHRvIGJlIGluICJoZWxwIHRhcmdldCIgb3V0cHV0LgorCisJKiBnZGIudDAxL3J1bi5leHA6IE9ubHkgcnVuIHNoZWxsIHRlc3QgaWYgaXNuYXRpdmUuCisKKwkqIGNvbmZpZy91ZGktZ2RiLmV4cCAoZ2RiX2xvYWQpOiBVc2UgImZpbGUiLCBub3QgImxvYWQiIGNvbW1hbmQsCisJc2luY2UgInJ1biIgYXV0b21hdGljYWxseSBsb2FkcyBpZiBuZWNlc3NhcnkuICBDYWxsIGdkYl90YXJnZXRfdWRpCisJYWZ0ZXIgdGhlICJmaWxlIiBzaW5jZSAiZmlsZSIga2lsbHMgYW55IGV4ZWN1dGlvbiB0YXJnZXQuCisKKwkqIGNvbmZpZy91ZGktZ2RiLmV4cCAoZ2RiX3N0YXJ0KTogRG9uJ3Qgc2VuZCAic2V0IGFyZ3MgbWFpbiIgdG8KKwlHREIuICBHREIgZG9lc24ndCB3b3JrIHRoYXQgd2F5IChub3QgYW55bW9yZSBhdCBsZWFzdCkgb24gVURJLgorCSogZ2RiLnQwMS9ydW4uZXhwLCBnZGIudDA2L2JyZWFrLmV4cDogRG9uJ3QgcGFzcyBleHRyYSBmaXJzdAorCWFyZ3VtZW50IGZvciBVREkuCisKK0ZyaSBGZWIgIDQgMTI6MTk6MzIgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGdkYi50MTcvaW50ZXJydXB0LmM6IElmIHdlIGdldCBFSU5UUiwgZG9uJ3QgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZS4KKworCSogZ2RiLnQxNy9jYWxsZnVuY3MuZXhwOiBBZGQgeGZhaWxzIGZvciByczYwMDAuCisKK1NhdCBGZWIgIDUgMDk6MTE6NTYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50MjQvZGVtYW5nbGUuZXhwOiBSZS13cml0ZSBkZW1hbmdsZSB0byBqdXN0IGNhbGwgZ2RiX3Rlc3QsCisJcHJvcGVybHkgcXVvdGluZyByZWdleHBzLiAgVGhpcyBtYWtlcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvCisJZGVtYW5nbGUgYSBmaXhlZCBzdHJpbmcsIHdoaWNoIG1hdGNoZXMgdGhlIGNhbGxlcnMsIGluc3RlYWQgb2YgYQorCXNoZWxsLXN0eWxlIHBhdHRlcm4gd2hpY2ggaXMgd2hhdCB0aGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24KKwl1c2VkLiAgVXBkYXRlIHNvbWUgb2YgdGhlIGNhbGxlcnMuCisKK1NhdCBGZWIgIDUgMTA6MTk6MDkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGdkYi5kaXNhc20vaHBwYS5zIChjb21pYl90ZXN0cyk6IEFkZCBtaXNzaW5nIGluc3RydWN0aW9uLgorCShjb21pYl9udWxsaWZpZWRfdGVzdHMpOiBGaXggdHlwby4KKwkqIGdkYi5kaXNhc20vaHBwYS5leHAgKGFsbCBjb21iIHRlc3RzKTogRml4IHRoaW5rb3MgaW4gZXhwZWN0CisJc3RyaW5ncy4gIE5vIGxvbmdlciBleHBlY3RlZCB0byBmYWlsLgorCisJKiBnZGIuZGlzYXNtL2hwcGEucyAoYWRkaWJfdGVzdHMpOiBGaXggdHlwby4KKwkqIGdkYi5kaXNhc20vaHBwYS5leHAgKGFsbCBhZGRiIHRlc3RzKTogRml4IHRoaW5rb3MgaW4gZXhwZWN0CisJc3RyaW5ncy4gIE5vIGxvbmdlciBleHBlY3RlZCB0byBmYWlsLgorCisJKiBnZGIuZGlzYXNtL2hwcGEuZXhwIChmbXB5X2FkZHN1Yl90ZXN0cyk6IEZpeCB0eXBvIGluIGV4cGVjdAorCXN0cmluZy4gIE5vIGxvbmdlciBleHBlY3RlZCB0byBmYWlsLgorCitGcmkgRmViICA0IDIzOjQ1OjExIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnZGIuZGlzYXNtL2hwcGEuZXhwIChmY21wX3Rlc3RzKTogRml4IHRoaW5rbyBpbiBleHBlY3Qgc3RyaW5nLgorCU5vIGxvbmdlciBleHBlY3RlZCB0byBmYWlsLgorCisJKiBnZGIuZGlzYXNtL2hwcGEuZXhwICh4bXB5dV90ZXN0cyk6IEZpeCBidWdsZXQgaW4gZXhwZWN0CisJc3RyaW5nLiAgTm8gbG9uZ2VyIGV4cGVjdGVkIHRvIGZhaWwuCisKK0ZyaSBGZWIgIDQgMTA6MzU6NDIgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50MjQvZGVtYW5nbGUuZXhwOiBSZW1vdmUgYSBidW5jaCBtb3JlIHRlc3RzIHdoaWNoIGRpZmZlcgorCW9ubHkgaW4gdGhlIG5hbWVzIChJIHByb2JhYmx5IGdvdCBtb3N0IG9mIHRoZW0pLiAgSSB3YXMgZXZlbgorCWdlbmVyb3VzIHdpdGggc29tZSB3aGljaCBkaWZmZXJlZCBpbiB1bmRlcnNjb3JlcyBpbiBuYW1lcywgYW5kCisJcHJvYmFibHkgbWlzc2VkIGEgZmV3LCBhbmQgSSAqc3RpbGwqIHdhcyBhYmxlIHRvIHJlbW92ZSBhbG1vc3QgYQorCXRoaXJkIG9mIHRoZSBmaWxlIHdpdGggYWxtb3N0IG5vIGltcGFjdCBvbiB0ZXN0c3VpdGUgY292ZXJhZ2UuCisKK1RodSBGZWIgIDMgMTI6MDQ6NDkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50MDAvZGVmYXVsdC5leHA6IE1hdGNoIHVkaV9hdHRhY2ggZXJyb3IgbWVzc2FnZSBhcyB3ZWxsIGFzCisJdGhlIG9uZSBmcm9tIGNoaWxkX2F0dGFjaC4KKworCSogZ2RiLnQwMC9kZWZhdWx0LmV4cDogVXNlICIuIiBpbnN0ZWFkIG9mICI/IiB0byBtYXRjaCBhIHF1ZXN0aW9uIG1hcmsuCisKKwkqIGdkYi5zdGFicy93ZWlyZC5leHA6IFJlbW92ZSB4ZmFpbCBmb3IgY29uc3Q3MDsganVzdCBmaXhlZCBpbiBHREIuCisKKwkqIGdkYi5zdGFicy93ZWlyZC5kZWYgKGJhZF9uZWcwdHlwZSk6IFNpemUgb2YgdGhpcyB0eXBlIGlzIDE2LCBub3QgOC4KKwkqIGdkYi5zdGFicy93ZWlyZC5leHA6IFJlbW92ZSB4ZmFpbCBmb3IgInAgYmFkX25lZzAiOyB0aGlzIGZpeGVzIGl0LgorCisJKiBNb3ZlIHRlc3Qgd2l0aCBlbnVtcyBhbmQgcGFydGlhbCBzeW1ib2xzIGJhY2sgdG8KKwlnZGIudDAzL3twdHlwZS5leHAsZ2RibWUuY30gZnJvbSBnZGIuc3RhYnMve3dlaXJkLmRlZix3ZWlyZC5leHB9LgorCVJldmVydHMgdGhlIGNoYW5nZSBvZiAyNiBNYXkgOTMuICBQZXIgdG9kYXkncyBjaGFuZ2UgdG8KKwlzdGFicy50ZXhpbmZvLCB0aGUgYmVoYXZpb3IgdGhhdCB3ZWlyZC5leHAgd2FzIGV4cGVjdGluZyB3YXMKKwl1bnJlYXNvbmFibGU7IHdoYXQgaXMgaW1wb3J0YW50IGlzIHRoYXQgdGhlIGNvbXBpbGVyK2dkYiBnZXQKKwl0aGluZ3MgcmlnaHQsIHdoaWNoIGhhcHBlbnMgd2l0aCBhIHJlY2VudCBnY2MuICBBbHNvIGZpeCB0aGUgdGVzdAorCXRvIGRlYWwgd2l0aCBuYXRpdmUgY29tcGlsZXJzIHdoaWNoIHB1dCBvdXQgdGhlIHN0YWIgZ2RiIGNhbid0CisJZGVhbCB3aXRoLgorCitNb24gSmFuIDMxIDE1OjQwOjExIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIudDI0L2RlbWFuZ2xlLmV4cDogUmVtb3ZlIGEgYnVuY2ggb2YgdGVzdHMgd2hpY2ggZGlmZmVyIG9ubHkKKwlpbiB0aGUgbmFtZXMuICBUaGUgbWFpbiB0aGluZyB0aGVzZSBhY2NvbXBsaXNoIGlzIHRvIHNsb3cgdGhpbmdzIGRvd24uCisJTWFueSBtb3JlIHN1Y2ggZHVwbGljYXRlcyBzdXJlbHkgcmVtYWluLgorCisJKiBnZGIudDAwL2hlbHAuZXhwOiBDb21tZW50IG91dCAiaGVscCBzdXBwb3J0IiB0ZXN0IGp1c3QgbGlrZQorCShhbmQgZm9yIHNhbWUgcmVhc29uIGFzKSAiaGVscCBzZXQiIHRlc3QuCisKK01vbiBKYW4gMzEgMDY6NDM6NDUgMTk5NCAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGdkYi50MDYvYnJlYWsuZXhwOiAgUmVtb3ZlIHNldHVwX3hmYWlscyBmb3IKKwlzcGFyYy1zdW4tc29sYXJpczIuKiwgdGhlc2UgdGVzdHMgbm93IHBhc3Mgd2l0aCBsYXRlc3QgZ2NjIGFuZCBnZGIuCisJKiBnZGIudDIwL2luaGVyaXQuZXhwICh0ZXN0X3B0eXBlX3NpKTogIFVwZGF0ZSB3YXJuaW5nIG1lc3NhZ2UKKwlhYm91dCBrbm93biBidWcgaW4gZ2NjIHRvIGluY2x1ZGUgdXAgdGhyb3VnaCAyLjUuOC4KKwkqIGdkYi50MjAvaW5oZXJpdC5leHAgKHRlc3RfcHR5cGVfdmkpOiAgQWNjZXB0ICJfdmIuIiBhcyB3ZWxsIGFzCisJd2VsbCBhcyAiX3ZiJCIuCisJKiBnZGIudDIxL2NwbHVzZnVuY3MuZXhwICh0ZXN0X2xvb2t1cF9vcGVyYXRvcl9mdW5jdGlvbnMpOgorCVJlbW92ZSBzZXR1cF94ZmFpbHMgZm9yIHNwYXJjLXN1bi1zb2xhcmlzMi4qLCB0aGVzZSB0ZXN0cyBub3cgcGFzcworCXdpdGggbGF0ZXN0IGdjYyBhbmQgZ2RiLgorCSogZ2RiLnQyMi92aXJ0ZnVuYy5leHAgKHRlc3RfcHR5cGVfb2ZfY2xhc3Nlcyk6ICBBY2NlcHQgIl92Yi4iIGFzCisJd2VsbCBhcyAiX3ZiJCIuCisKK1NhdCBKYW4gMjkgMjM6MzE6MjYgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCisKKwkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi0qKTogQWxzbyBjb25maWd1cmUgYW5kIGJ1aWxkIHN0YWJzLW9ubHkKKwl0ZXN0cy4KKworVGh1IEphbiAyNyAwODoyMToxNiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2RiLnQxMC9ocHBhLm10OiBBIG1ha2VmaWxlIGZyYWdtZW50IGZvciB0aGUgUEEuCisJKiBnZGIudDEwL2NvbmZpZ3VyZS5pbiAoaHBwYSotKi0qKTogVXNlIGl0LgorCitUdWUgSmFuIDI1IDEyOjU4OjI2IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLnQwOS9jb3JlZmlsZTogIEluY3JlYXNlIHRpbWVvdXQgd2hlbiBzcGF3bmluZyBnZGIgZXhwbGljaXRseS4KKworV2VkIEphbiAxOSAxMjo0MDoyNSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi50MDYvc2lnbmFscy5leHA6ICBIYW5kbGUgYmxvY2tlZCBTSUdUUkFQIG9uIHN1bjMgZm9yIGJhc2gKKwl2ZXJzaW9ucyBwcmlvciB0byAxLjEzLjUuCisKK1R1ZSBKYW4gMTggMjA6MTA6NTAgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50MDAvZGVmYXVsdC5leHAgKHNob3cgcHJvbXB0KTogSW4gRkFJTCBjYXNlLCBvbmx5IG1hdGNoIGlmCisJdGhlIHByb21wdCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLgorCitNb24gSmFuIDE3IDIwOjA3OjUxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnZGIuZGlzYXNtL2hwcGEuczogQWRkIG5ldyB0ZXN0cyBmb3Igc2Z1IGFuZCBjb3ByIGluc3RydWN0aW9ucy4KKwlFbmFibGUgImRpYWciIGluc3RydWN0aW9uLiAgRGVsZXRlIGNvcHIgZnJvbSBmcHVfbWlzY190ZXN0cywgaXQncworCWluIHRoZSBjb3ByIHRlc3RzIG5vdy4KKwkqIGdkYi5kaXNhc20vaHBwYS5leHA6IFJ1biBuZXcgc2Z1IGFuZCBjb3ByIHRlc3RzLiAgRG8gbm90IGV4cGVjdAorCWNvcHIgaW4gdGhlIGZwdV9taXNjIHRlc3RzIGFueW1vcmUuICBmcHVfbWlzYyB0ZXN0cyBhcmUgbm8gbG9uZ2VyCisJZXhwZWN0ZWQgdG8gZmFpbC4KKworRnJpIEphbiAxNCAxNDoyNDoyMSAxOTk0ICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCisKKwkqIGdkYi50MDAvdGVzdHN0cmF0ZWd5LmV4cCwgZ2RiLnQwNy93YXRjaHBvaW50LmV4cCwKKwlnZGIudDMxL2NoaWxsdmFycy5leHAsIGxpYi9nZGIuZXhwOgorCVR3ZWFrIHRvIHJ1biB1bmRlciBlaXRoZXIgdmVyc2lvbiBvZiBleHBlY3QuCisJKiBsaWIvZ2RiLmV4cCAoZGVmYXVsdF9nZGJfZXhpdCk6IFJlbW92ZSAiY2F0Y2giIHN0YXRlbWVudC4KKwkqIGdkYi50MDAvdGVzdHN0cmF0ZWd5LmV4cDogVXNlIGlzbmF0aXZlIGFuZCB2ZXJib3NlIHByb2NlZHVyZXMuCisJKiBnZGIudDExL2xpc3QuZXhwOiBSZW1vdmUgZXh0cmFuZW91cyB3aGl0ZXNwYWNlLgorCitTYXQgSmFuIDE1IDA5OjU3OjIyIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIudDE2L3ByaW50Y21kcy5leHAgKHRlc3RfcHJpbnRfc3RyaW5ncyk6IEFjY2VwdAorCSIodW5zaWduZWQgY2hhciAqKSAiIGJlZm9yZSB0aGUgc3RyaW5nLgorCisJKiBUT0RPOiBBZGQgbm90ZXMgYWJvdXQgcHJpbnRpbmcgb2YgZmFuY3kgdHlwZXMgYW5kIEdEQiBleHByZXNzaW9ucy4KKworVGh1IEphbiAxMyAxNzoxNjowOSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBQYXNzIExERkxBR1MgYW5kIExJQlMgdG8gc3ViLW1ha2VzLgorCSogZ2RiLnQwNi9jb25maWd1cmUuaW46IERvbid0IHRyeSB0byBjb21waWxlIHNpZ25hbHMgdGVzdCBwcm9ncmFtCisJaWYgZG9pbmcgbWlwcy1pZHQtZWNvZmYuCQorCitUaHUgSmFuIDEzIDA4OjI1OjU1IDE5OTQgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKKworCSogTW9zdCAuZXhwIGZpbGVzOiBUd2VhayB0byBydW4gdW5kZXIgZWl0aGVyIHZlcnNpb24gb2YgZXhwZWN0LgorCitUdWUgSmFuIDExIDE1OjIxOjEzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIudDEyL3Njb3BlLmV4cDogQWRkIHhmYWlscyBmb3IgcnM2MDAwLiAgUmVtb3ZlIDE4MDYgZnJvbSBleGlzdGluZworCXhmYWlsczsgSSdtIG5vdCBzdXJlIHdoeSB0aGV5IGFyZSBmYWlsaW5nLCBidXQgbm90IGJlY2F1c2Ugb2YgUFIgMTgwNi4KKworTW9uIEphbiAxMCAyMjoxNDoyMCAxOTk0ICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy91bml4LWdkYi5leHA6IFJlbW92ZSBnZGJfdW5sb2FkIGNhdXNlIGl0J3MgYWxyZWFkeQorCWRlZmluZWQgaW4gbGliL2dkYi5leHAuCisKK0ZyaSBKYW4gIDcgMTI6NDI6NDUgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBnZGIudDA3L3dhdGNocG9pbnQuZXhwOiAgQ2xlYXIgeGZhaWwgZm9yIGNhbGxpbmcgZnVuY3Rpb24gd2l0aAorCXdhdGNocG9pbnQgZW5hYmxlZCBvbiBtaXBzLCBDQUxMX0RVTU1ZX0JSRUFLUE9JTlRfT0ZGU0VUIGdvdCBkZWZpbmVkLgorCSogZ2RiLnQyMC9nZGJtZS5jYywgZ2RiLnQyMS9nZGJtZS5jYzogIENvbnZlcnNpb24gb3BlcmF0b3IgZnVuY3Rpb25zCisJaGF2ZSB0byBiZSB0eXBlbGVzcy4KKworVHVlIEphbiAgNCAwOTozMjoyMiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogVE9ETzogQWRkIHN1Z2dlc3Rpb24gZm9yIGNvcHlyaWdodCB5ZWFyIHRlc3QuCisKK01vbiBKYW4gIDMgMTE6MzU6MjYgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKCotKi1seW54b3MqKTogQWRkIHN0YWJzIHRlc3RzLgorCitXZWQgRGVjICAxIDIxOjU0OjA1IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQorCisJKiBnZGIuc3RhYnMvaHBwYS5zZWQ6IE9ubHkgbGFibGVzIHNob3VsZCBldmVyIHN0YXJ0IGluIGNvbHVtbiB6ZXJvLAorCXNvIGluc2VydCBhIHRhYiBiZWZvcmUgYW55IGFzc2VtYmxlciBkaXJlY3RpdmUgaW4gY29sdW1uIHplcm8uCisKKwkqIGdkYi5kaXNhc20vaHBwYS5leHAgKGFsbF9mcHVfbWVtb3J5X3Rlc3RzKTogVGVzdCBGUCBxdWFkd29yZAorCXN0b3Jlcy4KKwkqIGdkYi5kaXNhc20vaHBwYS5zIChmcHVfbWVtb3J5X2luZGV4aW5nX3Rlc3RzKTogQWRkIEZQIHF1YWR3b3JkCisJc3RvcmVzLgorCShmcHVfc2hvcnRfbWVtb3J5X3Rlc3RzKTogTGlrZXdpc2UuCisKK01vbiBOb3YgMjIgMTM6MjM6MjIgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBnZGIuc3RhYnMvZWNvZmYubXQ6ICBEZWxldGUgYWxwaGEgc3BlY2lmaWMgaWYgYmxvY2ssIGZpeCB0eXBvLgorCSogZ2RiLnN0YWJzL2Vjb2ZmLnNlZDogIEVzY2FwZSBpbnNlcnRlZCBibGFua3Mgd2l0aCBiYWNrc2xhc2hlcywgZW1iZWQKKwkuc3RhYnMgZGlyZWN0aXZlcyBpbiBjb21tZW50cy4KKworRnJpIE5vdiAxOSAxNDowOTowMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogVE9ETzogTmV3IGZpbGUsIGRlc2NyaWJpbmcgdGVzdHMgd2UgY291bGQgd3JpdGUuCisJKiBnZGIudDA5L2NvcmVmaWxlLmV4cDogTW92ZSBkZXNjcmlwdGlvbiBvZiB0ZXN0cyB0byB3cml0ZSB0byBUT0RPLgorCitUdWUgTm92IDE2IDIxOjA3OjQ0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIudDA2L3NpZ25hbHMuZXhwOiBBZGQga2x1ZGdlIHRvIGZvcmNlIHJlLXN5bmMuCisKKwkqIGdkYi50MDAvdGVzdHN0cmF0ZWd5LmV4cDogSWYgd2UgYWNjaWRlbnRseSBzZW5kIHRoZSAibWFpbnQgZHVtcC1tZSIKKwl0byB4Z2RiIGluc3RlYWQgb2YgZ2RiLCBnZXQgb3V0IG9mIGdkYi4KKworVHVlIE5vdiAxNiAxMDoyMTo1NyAxOTkzICBSb2IgU2F2b3llICAocm9iQGN5Z251cy5jb20pCisKKwkqIGxpYi9nZGIuZXhwOiBNYWtlIEdEQiBhbmQgR0RCRkxBR1MgZ2xvYmFsIHNvIHRoZSBzY29waW5nIHdvcmsKKwlmb3IgaW5mby4KKworU2F0IE5vdiAxMyAyMzoxNzo0OCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogZ2RiLnN0YWJzL2hwcGEubXQ6IEEgbWFrZWZpbGUgZnJhZ21lbnQgZm9yIHRoZSBQQS4KKwkqIGdkYi5zdGFicy9jb25maWd1cmUuaW4gKGhwcGEqLSotKik6IFVzZSBpdC4KKwkqIGdkYi5zdGFicy9ocHBhLnNlZDogTmV3IHNlZCBzY3JpcHQgZm9yIHRoZSBQQS4KKworU2F0IE5vdiAxMyAyMjo1MDoyOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnN0YWJzOiBSZS13cml0ZSB3ZWlyZC5kZWYgYW5kIGNvbmZpZ3VyYXRpb24gdG8gdXNlIHNlZAorCWluc3RlYWQgb2YgY3BwLiAgc2VkIGlzIHBvcnRhYmxlIGFuZCBQT1NJWDsgY3BwIGlzIG5laXRoZXIuCisKK0ZyaSBOb3YgMTIgMTU6MjY6MzYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50MDYvc2lnbmFscy5leHA6IFJlbW92ZSBvbmUgc3VuMyBYRkFJTCB3aGljaCBoYXMgYmVlbiBmaXhlZC4KKworTW9uIE5vdiAgOCAxNjo1NToyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQyMC9nZGJtZS5jYzogQWRkIGNvbW1lbnQgYWJvdXQgcG1pIGJlaW5nIG9wdGltaXplZCBvdXQuCisKK1RodSBOb3YgIDQgMjM6MDc6NTkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi5zdGFicy93ZWlyZC5leHAsIGdkYi50MjIvdmlydGZ1bmMuZXhwOiBBY2NlcHQgIl92Yi4iIGFzIHdlbGwgYXMKKwkiX3ZiJCIuCisJKiBnZGIudDAwL3Rlc3RzdHJhdGVneS5leHA6IEFkZCB4ZmFpbCBmb3IgUlMvNjAwMC4KKwkqIGdkYi50MDMvcHR5cGUuZXhwOiBBZGQgY29tbWVudHMgYW5kIG1lc3NhZ2VzIGFib3V0IEZBSUxzIHdpdGggeGxjLgorCitXZWQgTm92ICAzIDEzOjUzOjM0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBsaWIvZ2RiLmV4cDogQ29tbWVudCBvdXQgY29kZSB3aGljaCBkZXBlbmRzIG9uIG5vbi1leGlzdGVudAorCWB0cmFuc2Zvcm0nIHByb2NlZHVyZS4KKworV2VkIE5vdiAgMyAxMToyMzoxMSAxOTkzICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCisKKwkqIGxpYi9nZGIuZXhwIChkZWZhdWx0X2dkYl9leGl0KTogUmVtb3ZlIGBjYXRjaCAiY2xvc2UiJy4KKwkqIGxpYi9nZGIuZXhwOiBUcmFuc2Zvcm0gdG9vbCBuYW1lLgorCSogZ2RiLnQqLyouZXhwOiBDaGFuZ2UgZXJyb3IgdG8gcGVycm9yIHNvIGl0IHdvcmtzIHdpdGggRGVqYUdudQorCTEuMSdzIG5ldyBlcnJvciBoYW5kbGluZyBzeXN0ZW0uCisKK01vbiBOb3YgIDEgMTA6MzY6MjkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluLCBnZGIudDIqL01ha2VmaWxlLmluOiBBZGQgLU8gdG8gQ1hYRkxBR1MuCisKK0ZyaSBPY3QgMjkgMTc6NTg6MTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50MDAvZGVmYXVsdC5leHA6IEF2b2lkIHRlc3RzIHdpdGggYSBsb3Qgb2YgLiogaW4gdGhlbS4KKwlUaGV5IG1hZGUgcGF0dGVybiBtYXRjaGluZyBzbyBzbG93IHRoYXQgdGltZW91dHMgaGFwcGVuZWQgb24KKwloZWF2aWx5IGxvYWRlZCBzeXN0ZW1zLiAgTm93IGFueSBvdXRwdXQgZnJvbSAic2hvdyBwcmludCIgd2hpY2gKKwlnZXRzIHVzIGJhY2sgdG8gdGhlIEdEQiBwcm9tcHQgaXMgYSBQQVNTLgorCitNb24gT2N0IDI1IDE0OjM2OjUwIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGdkYi5kaXNhc20vaHBwYS5tdDogIFVzZSAkKHNyY2RpcikgaW4gaHBwYS5vIG1ha2UgcnVsZS4KKworTW9uIE9jdCAyNSAxMzozNToyOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwNi9zaWduYWxzLmV4cDogU2tpcCB3aG9sZSBmaWxlIHdpdGggeGZhaWwgZm9yIEhQUEEuCisKKwkqIGdkYi50MjQvZGVtYW5nbGUuZXhwOiBSZW1vdmUgIjMyMjAiIGZyb20gdGhlIG9uZSByZW1haW5pbmcgeGZhaWwuCisJSXQgaXMgbm90IGZyb20gUFIgMzIyMC4KKworU3VuIE9jdCAyNCAxODo0OTo1OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwMC97aGVscC5leHAsZGVmYXVsdC5leHB9OiBMb29zZW4gdXAgYSBmZXcgbW9yZSB0ZXN0cyB3aGljaAorCWp1c3Qgc3RhcnRlZCBmYWlsaW5nIGJlY2F1c2UgdGhleSBkZXBlbmRlZCBvbiB0aGUgb3JkZXIgdGhlCisJc3ViY29tbWFuZHMgYXJlIHByZXNlbnRlZCwgb3IgZXhhY3QgZG9jc3RyaW5nIHRleHQuICBUaGlzIGtpbmQgb2YKKwl0ZXN0IGlzIGEgcGFpbiBhbmQgaGFzIG1pbmltYWwgYmVuZWZpdC4KKworVGh1IE9jdCAyMSAwODoyNjo0OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwOS9jb3JlZmlsZS5leHA6IEF0IGVuZCBvZiB0ZXN0LCB1c2UgImNvcmUiIGNvbW1hbmQgd2l0aAorCW5vIGFyZ3VtZW50cy4KKworV2VkIE9jdCAyMCAwODo1NjowMiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBnZGIudHswMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAxMCAxMSAxMiAxMyAxNSAxNgorCTE3fS9NYWtlZmlsZS5pbjogIE1ha2UgaXQgcG9zc2libGUgdG8gcnVuIHRoZSB0ZXN0c3VpdGUgd2l0aCBTdW4KKwltYWtlIGFuZCBDQyA9IGNyb3NzIGdjYyBieSBhZGRpbmcgZXhwbGljaXQgYnVpbGQgcnVsZXMgZm9yIC5vCisJZmlsZXMuCisKK1R1ZSBPY3QgMTkgMTQ6NTc6MzggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50MTUvZnVuY2FyZ3MuZXhwOiBEb24ndCBwdXQgY29tbWVudHMgb24gc2FtZSBsaW5lIGFzCisJc2V0dXBfeGZhaWwgKEAjJColJiB0Y2wgYnJhaW5kYW1hZ2UhKS4KKyAgCitNb24gT2N0IDE4IDIxOjUwOjA4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIuZGlzYXNtL2hwcGEuZXhwOiBVc2UgJG9iamRpci8kc3ViZGlyLyRiaW5maWxlIG5vdCBqdXN0ICRiaW5maWxlLgorCitGcmkgT2N0IDE1IDE1OjM5OjU0IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogZ2RiLnQyMC9jbGFzc2VzLmV4cDogJ2NvbnN0IHh4eCAmJyBiZWNvbWVzICd4eHggY29uc3QgJicuCisJKiBnZGIudDIwL2luaGVyaXQuZXhwOiByZW1vdmUgdGhyZWUgZHVtcGxpY2F0ZSBlbnRyaWVzLgorCitGcmkgT2N0IDE1IDEzOjQ1OjI1IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLnQwNi9icmVhay5leHA6IEZvciAibmV4dCBvdmVyIHJlY3Vyc2l2ZSBjYWxsIiwgZmFpbCBvbiBhbnkKKwlpbmNvcnJlY3Qgb3V0cHV0LCBub3QganVzdCBvbiAiZmFjdG9yaWFsICh2YWx1ZT0yKSIuCisKK0ZyaSBPY3QgMTUgMTE6NTI6NTYgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBnZGIudDEyL3Njb3BlLmV4cDogIFJlbW92ZSB4ZmFpbHMsIGZpbGVuYW1lOjp2YXIgc3ludGF4IHNob3VsZCBiZQorCXdvcmtpbmcgbm93LiBBZGQgYW4geGZhaWwgaWYgYWNjZXNpbmcgYSBic3MgdmFyaWFibGUgY2F1c2VzCisJYSBtZW1vcnkgZXJyb3IgaWYgdGhlIHRhcmdldCBpcyBub3QgeWV0IHJ1bi4KKworVGh1IE9jdCAxNCAxOToxNjo1NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQyNC9kZW1hbmdsZS5leHA6IENsZWFuIHVwIHNwYWNpbmcgKDIgc3RyaW5ncyksIGluY2x1c2lvbiBvZgorCWNvbnN0cnVjdG9yIG5hbWUgKDIgc3RyaW5nKSwgbmFtZSBvZiBfR0xPQkFMXyBkZW1hbmdsaW5nICgyIHN0cmluZ3MpLAorCW5hbWUgb2YgX19zdCogZGVtYW5nbGluZyAoMiBzdHJpbmdzKS4gIERpZCBLdW5nIHJlYWxseSBnZXQgdGhlCisJbW9yZSB0aGFuIDk1IG90aGVycyByaWdodCB3aXRob3V0IHRlc3RpbmcgdGhlbT8KKworVGh1IE9jdCAxNCAxNjoyNzowOCAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGdkYi50MjQvZGVtYW5nbGUuZXhwOiBjbGVhbiB1cCBYRkFJTFMsIG1vcmUgdGhhbiAxMDAKKworVGh1IE9jdCAxNCAxMTo0MDozMCAxOTkzICBKZWZmcmV5IExhdyAgKGxhd0Bjcy51YWguZWR1KQorCisJKiBjb25maWd1cmUuaW4gKGNvbmZpZ2RpcnMpOiBBZGQgZ2RiLmRpc2FzbQorCSogZ2RiLmRpc2FzbTogTmV3IGRpcmVjdG9yeSBmb3IgR0RCIGRpc2Fzc2VtYmxlciB0ZXN0cy4KKwkqIGdkYi5kaXNhc20vaHBwYS57ZXhwLHMsbXR9OiBEaXNhc3NlbWJseSB0ZXN0cyBmb3IgdGhlIEhQUEEuCisKK1RodSBPY3QgMTQgMTE6NDA6MzAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50MDAvaGVscC5leHA6IERvbid0IHRlc3QgImhlbHAgc2V0Ii4KKworCSogZ2RiLnQyMC9pbmhlcml0LmV4cCwgZ2RiLnQyMi92aXJ0ZnVuYy5leHA6IFJlbW92ZSBhbGwgeGZhaWxzCisJZnJvbSB3aXRoaW4gZXhwZWN0IHN0YXRlbWVudHMuICBOb25lIG9mIHRoZXNlIGhhcHBlbiBhbnltb3JlIGFuZAorCXRoZXkgY2F1c2UgcmVncmVzc2lvbnMgdG8gYmUgc2lsZW50bHkgdW5ub3RpY2VkLgorCisJKiBnZGIudDIwL2luaGVyaXQuZXhwLCBnZGIudDIyL3ZpcnRmdW5jLmV4cDogQWRkIG5vdGVzIChpbiBmYWlsdXJlCisJbWVzc2FnZXMpIGFib3V0IGtub3duIGZhaWx1cmVzIHdpdGggZ2NjIGN5Z251cy0yLjQuNS05MzA0MTcuCisKKwkqIGdkYi50MDIvTWFrZWZpbGUuaW4sIGdkYi50MDgvTWFrZWZpbGUuaW46IE1ha2UgYWxsIGRlcGVuZCBvbgorCWNvbXAtaW5mby5leHAgc28gaXQgZ2V0cyBidWlsdCBpZiBpdCBkb2Vzbid0IGV4aXN0LgorCisJKiBnZGIudDEzL3tNYWtlZmlsZS5pbixiaXRmaWVsZHMuZXhwfTogUmVtb3ZlIGNvbXAtaW5mby5leHAgc3R1ZmY7CisJaXQgaXMgbm8gbG9uZ2VyIHVzZWQuCisJKiBnZGIudDEzL2NvbXAtaW5mby5jOiBSZW1vdmVkLgorCitXZWQgT2N0IDEzIDIyOjU0OjA2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBnZGIudDA2L3NpZ25hbHMuZXhwOiBBZGQgeGZhaWwgZm9yIHN1bjMuCisKK1RodSBPY3QgIDcgMTI6MDE6MDMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50MTcvaW50ZXJydXB0LmV4cDogQWRkIHhmYWlsIGZvciBJcml4IChjdXJyZW50bHkgbm90IHJlYWxseQorCXJlbGV2YW50IGJlY2F1c2UgXkMgZG9lc24ndCBnZXQgc2VudCBidXQgZmFpbHVyZSBjYW4gYmUgcmVwcm9kdWNlZAorCWludGVyYWN0aXZlbHkpLgorCitUdWUgT2N0ICA1IDEwOjQzOjExIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLnN0YWJzL2FscGhhLm10OiAgTmV3IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgYWxwaGEuCisJKiBnZGIuc3RhYnMvY29uZmlndXJlLmluOiAgVXNlIGl0LgorCSogZ2RiLnN0YWJzL2Vjb2ZmLm10LCB3ZWlyZC1lY29mZi5zZWQ6ICBDaGFuZ2Ugc2VkIHNjcmlwdCB0byBlbmFibGUKKwlzaGFyaW5nIHdpdGggYWxwaGEubXQsIHJlZGVmaW5lIGxvbmcgdG8gd29yZCB2aWEgcHJlcHJvY2Vzc29yLgorCSogZ2RiLnN0YWJzL3dlaXJkLmRlZjogIENvbmRpdGlvbmFsbHkgYWRhcHQgc3RvcmFnZSBsYXlvdXQgb2Ygdl9jb21iCisJZm9yIGFscGhhLgorCSogZ2RiLnN0YWJzL3dlaXJkLmV4cDogIEhhbmRsZSBjb21waWxhdGlvbiBvZiB3ZWlyZC5zIGJ5IGFscGhhCisJbmF0aXZlIGNjLgorCSogZ2RiLnQwMC90ZXN0c3RyYXRlZ3kuZXhwOiAgQ2hhbmdlIGV4cGVjdCBzdHJpbmcgc28gdGhhdCB3ZQorCWNvbnN1bWUgdGhlIGAoeGdkYiknIGZyb20gdGhlIGNvbW1hbmQgZWNobyBhbmQgZnJvbSB0aGUgZ2RiIHByb21wdC4KKwkqIGdkYi50MDUvZXhwci5leHA6ICB4ZmFpbCAicHJpbnQgdW5zaWduZWQgaW50ID09ICh+MCkiIG9uIHRoZSBhbHBoYS4KKwlnZGIgY3VycmVudGx5IGNvbXBhcmVzIGFsbCB2YWx1ZXMgYXMgbG9uZywgc28gdGhpcyBmYWlsdXJlIHByb2JhYmx5CisJYXBwbGllcyB0byBhbnkgY29uZmlndXJhdGlvbiB3aGVyZSBMT05HRVNUIGlzIGJpZ2dlciB0aGFuIGEgdGFyZ2V0IGludC4KKwkqIGdkYi50MDgvY29tcC1pbmZvLmM6ICBOZXcgZmlsZSB0byBkZXRlcm1pbmUgaWYgZ2RibWUgaXMgY29tcGlsZWQKKwl3aXRoIGdjYy4KKwkqIGdkYi50MDgvTWFrZWZpbGUuaW4sIG9wYXF1ZS5leHA6ICBVc2UgaXQuIEFscGhhIG5hdGl2ZSBjYyBpcyB1bmFibGUKKwl0byBoYW5kbGUgb3BhcXVlIHBvaW50ZXJzLCBnY2MgaXMuCisJKiBnZGIudDIxL2dkYm1lLmNjLCBnZGIudDIzL2dkYm1lLmNjOiAgb3BlcmF0b3IgbmV3IHRha2VzIGEgc2l6ZV90CisJYXMgZmlyc3QgYXJndW1lbnQuIEluY2x1ZGUgPHN5cy90eXBlcy5oPiBhbmQgY2hhbmdlIGFsbCBvcGVyYXRvcgorCW5ldyBkZWZpbml0aW9ucyB0byB1c2Ugc2l6ZV90LgorCSogZ2RiLnQyMS9jcGx1c2Z1bmNzLmV4cDogIEhhbmRsZSBjaGFuZ2VzIGluIG91dHB1dCBmb3Igb3BlcmF0b3IgbmV3CisJbm93IHRoYXQgd2UgdXNlIHNpemVfdC4KKworV2VkIFNlcCAyOSAwMDo1NTo0OSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKyAgICAgICAgKiBnZGIudDAzL3B0eXBlLmV4cCwgZ2RiLnQxNS9wcmludGNtZHMuZXhwOiAgV2hlbiBjb25zdHJ1Y3RpbmcKKwlhIGxvbmcgb3IgZmxvYXQgYXJyYXkgY2FzdCBhbGwgYXJyYXkgbWVtYmVycyB0byB0aGUgc2FtZSB0eXBlLgorICAgICAgICAqIGdkYi50MDQvc2V0dmFyLmV4cDogIEhhbmRsZSB0aGUgZGVjaW1hbCBvdXRwdXQgb2YgYW4gdW5zaWduZWQgbG9uZworCXdpdGggNjQgYml0IGxvbmdzLgorICAgICAgICAqIGdkYi50MDcvd2F0Y2hwb2ludC5leHA6ICBBZGQgZmluaXNoIGFuZCB1bnRpbCB2YXJpYXRpb25zIGVuY291bnRlcmVkCisJb24gYWxwaGEuCisgICAgICAgICogZ2RiLnQwOC9vcGFxdWUuZXhwLCBnZGIudDE3L2ludGVycnVwdC5leHA6ICBBZGQgeGZhaWxzIGZvciBhbHBoYS4KKworVHVlIFNlcCAyOCAxNzoyNjo0NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQyNCAoZGVtYW5nbGUuZXhwKTogQ29uc3RydWN0b3JzIG9mIHRlbXBsYXRlcyBoYXZlIG5hbWVzIGxpa2UKKwl2ZWN0b3I8aW50Pjo6dmVjdG9yKGludCkgbm90IHZlY3RvcjxpbnQ+Ojp2ZWN0b3I8aW50PihpbnQpLiAgU2VlCisJc2VjdGlvbiAxNC42IG9mIHRoZSBBUk0uCisKKwkqIGdkYi50MjQgKGRlbWFuZ2xlLmV4cCk6IFJlbW92ZSBhIHdob2xlIGJ1bmNoIG9mIHRlc3RzIG9mIHRoZSBmb3JtCisJIl92dCRNb3ZlQ21kIjsgdGhlc2UgZGlmZmVyIG9ubHkgaW4gbmFtZSBmcm9tICJfdnQkZm9vIiwgc28gdGhleQorCWFjY29tcGxpc2ggbGl0dGxlIGFuZCBzbG93IGRvd24gdGhlIHRlc3RzdWl0ZS4KKworCSogZ2RiLnQyNCAoZGVtYW5nbGUuZXhwKTogQWNjZXB0ICJYWFggY29uc3QiIGFzIHdlbGwgYXMgImNvbnN0IFhYWCIuCisJQWNjZXB0IHNwYWNlcyB2YXJpb3VzIHBsYWNlcy4KKworVHVlIFNlcCAyMSAxNzoyODo0NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwNy93YXRjaHBvaW50LmV4cDogT24gc3BhcmMsIGNsZWFyIHhmYWlsIGZvciBjYWxsaW5nIGZ1bmN0aW9uCisJd2l0aCB3YXRjaHBvaW50IGVuYWJsZWQuCisKKwkqIE1ha2VmaWxlLmluOiBSZW1vdmUgZGVmaW5pdGlvbiBvZiBDQyBhbmQgcmVtb3ZlIHRoZSBzZWNvbmQKKwlkZWZpbml0aW9uIG9mIENYWCAodGhlICJDWFggPSBnY2MiIG9uZSByZW1haW5zKS4gIFRoZXNlIGRlZmluaXRpb25zCisJd2VyZSBjYXVzaW5nIGJhY2txdW90ZXMgdG8gYmUgZXhwYW5kZWQgd2l0aGluIGJhY2txdW90ZXMsIHdoaWNoCisJZG9lc24ndCB3b3JrLgorCitTYXQgU2VwIDE4IDA5OjQzOjIxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBwb3NlaWRvbi5jeWdudXMuY29tKQorCisJKiBnZGIudDE3L2NhbGxmdW5jcy5leHA6IEFkZCAicmV0dXJuIDAiIHRvIGVuZC4KKworRnJpIFNlcCAxNyAwNDo0MToxNyAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKyAgICAgICAgKiBnZGIuc3RhYnMvZWNvZmYubXQ6ICBSZW1vdmUgU1RBQlNDQyBoYWNrLgorICAgICAgICAqIGdkYi5zdGFicy93ZWlyZC5leHA6ICBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2VpcmQubyBpcyBjb21waWxlZAorCWJ5IG1pcHMgY2MgYW5kIGNvbnRhaW5zIG5vIHN0YWJzIGVudHJpZXMuCisKK1RodSBTZXAgMTYgMTc6MjI6MTIgMTk5MyAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQorCisJKiBjb25maWcvdngtZ2RiLmV4cDogVXNlIGZha2UgZGV2aWNlIHRvIGxvYWQgZmlsZXMgcmF0aGVyIHRoYW4KKwlORlMuCisJKiBsaWIvZ2RiLmV4cDogTmV3IHByb2MgdG8gZG8gImZpbGUiIGNvbW1hbmQuCisJKiBjb25maWcvdW5peC1nZGIuZXhwOiBVc2UgbmV3ICJmaWxlIiBwcm9jLgorCitUaHUgU2VwIDE2IDEzOjQ1OjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21pcHMtZ2RiLmV4cCAoZ2RiX2xvYWQpOiBJbmNyZWFzZSB0aW1lb3V0IHRvIDI0MDAuCisJUmV3b3JrIGJvYXJkIHJlYm9vdGluZyBzbGlnaHRseS4KKwkoZ2RiX2V4aXQpOiBEb24ndCBleGl0IGZyb20gdGhlIHJlbW90ZSBzaGVsbDsgdGhlcmUgaXNuJ3Qgb25lLgorCSogZ2RiLnN0YWJzL3dlaXJkLmV4cDogSWYgYSBwcm9ncmFtIGlzIGJlaW5nIGRlYnVnZ2VkIGFscmVhZHksCisJa2lsbCBpdC4KKwkqIGdkYi50MDQvc2V0dmFyLmV4cDogU3RvcCBhbmQgcmVzdGFydCBnZGIuCisJKiBnZGIudDA1L2V4cHIuZXhwOiBMaWtld2lzZS4KKwkqIGdkYi50MDcvd2F0Y2hwb2ludC5leHA6IElmIHRhcmdldCBpcyBtaXBzLWlkdC0qLCBzdG9wIGFuZAorCXJlc3RhcnQgZ2RiIGFuZCByZWxvYWQgdGhlIHByb2dyYW0uCisJKiBnZGIudDA4L29wYXF1ZS5leHA6IExpa2V3aXNlLgorCSogZ2RiLnQxMi9zY29wZS5leHA6IExpa2V3aXNlLgorCSogZ2RiLnQxMy9iaXRmaWVsZHMuZXhwOiBMaWtld2lzZS4KKwkqIGdkYi50MTUvZnVuY2FyZ3MuZXhwOiBMaWtld2lzZS4KKwkqIGdkYi50MjAvY2xhc3Nlcy5leHA6IExpa2V3aXNlLgorCSogZ2RiLnQwMy9wdHlwZS5leHA6IEluY3JlYXNlIHRpbWVvdXQuCisJKiBnZGIudDE2L3ByaW50Y21kcy5leHAgKHRlc3RfcHJpbnRfc3RyaW5nX2NvbnN0YW50cywKKwl0ZXN0X3ByaW50X2FycmF5X2NvbnN0YW50cyk6IExpa2V3aXNlLgorCSogZ2RiLnQxNy9jYWxsZnVuY3MuZXhwIChkb19mdW5jdGlvbl9jYWxscyk6IExpa2V3aXNlLgorCSogZ2RiLnQyMC9jbGFzc2VzLmV4cCAoZG9fdGVzdHMpOiBMaWtld2lzZS4KKwkqIGdkYi50MjIvdmlydGZ1bmMuZXhwICh0ZXN0X3ZpcnR1YWxfY2FsbHMpOiBMaWtld2lzZS4KKworV2VkIFNlcCAxNSAxNDoyNDozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGdkYi5zdGFiczogUmVuYW1lZCAqd2llcmQqIHRvICp3ZWlyZCouCisKK1dlZCBTZXAgMTUgMTA6MzY6NTAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBnZGIudDEzL2JpdGZpZWxkcy5leHA6IFRlc3QgZm9yIGJhZCBvdXRwdXQgcmF0aGVyIHRoYW4gd2FpdGluZworCWZvciB0aW1lb3V0LiAgQWRkICJrbm93biBnY2MgMi40LjUgYnVnIiB0byBmYWlsdXJlIG1lc3NhZ2UuCisKK1R1ZSBTZXAgMTQgMTc6MTY6NDQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBnZGIuc3RhYnMvd2llcmQuZXhwIChwcmludF93aWVyZF92YXIpOiBUZXN0IHNpemUsIG5vdCB0eXBlIG5hbWUuCisJKGRvX3Rlc3RzKTogUmVtb3ZlIHhmYWlsIGZvciB3aGF0aXMgb24gb25lX3ZhciBhbmQgdHdvX3Zhci4KKworV2VkIFNlcCAgOCAyMzoxNDoyMyAxOTkzICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBNYWRlIGNyb3NzIGJ1aWxkaW5nIHdvcmsgYmV0dGVyIGJ5IGFkZGluZworCXtSVU5URVNULENDfV9GT1JfVEFSR0VUIGFuZCB1c2luZyBUQVJHRVRfRkxBR1NfVE9fUEFTUy4KKworVHVlIFNlcCAgNyAxNDoxMTo1MiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQxNS97cmV0dXJuLmMscmV0dXJuLmV4cCxNYWtlZmlsZS5pbn06CisJTmV3IHRlc3QsIGN1cnJlbnRseSBjb21tZW50ZWQgb3V0LgorCitUdWUgQXVnIDMxIDE2OjUxOjI5IDE5OTMgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3VkaS1nZGIuZXhwOiBnZGJfZXhpdCBub3cga2lsbHMgYW55IGlzc3RpcCBwcm9jZXNzZXMKKwlzdGlsbCBydW5uaW5nIGFuZCByZW1vdmVzIHRoZSBsZWZ0b3ZlciBuYW1lZCBzb2NrZXQgc28gR0RiIGNhbiBkbworCWNsZWFuIHJlc3RhcnRzLgorCitNb24gQXVnIDMwIDE3OjU1OjE2IDE5OTMgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwMS9ydW4uZXhwOiBBZGQgbWF0Y2ggZm9yIFZ4V29ya3MsIGNhdXNlIEkvTyBjb21lcyBvdXQgdGhlCisJY29uc29sZSwgbm90IEdEQi4KKwkqIGNvbmZpZy9tdC0qOiBBZGRlZCBkZWZhdWx0IHZhbHVlcyBmb3IgUlVOVEVTVCBhbmQgUlVOVEVTVEZMQUdTIHNvCisJY3Jvc3MgdGVzdGluZyB3b3JrcyBiZXR0ZXIgd2l0aCAibWFrZSBjaGVjayIKKwkqIGNvbmZpZy91bml4LWdkYjogVXNlIGRlZmF1bHQgcHJvY2VkdXJlcyBmb3IgZXhpdCBhbmQgdmVyc2lvbi4KKwkqIGNvbmZpZy92eC1nZGIuZXhwOiBDbGVhbmVkIHVwIGFuZCBtYXNzYWdlZCBiYWNrIHRvIHdvcmtpbmcgb3JkZXIKKwl3aXRoIHRoZSBuZXdlc3QgVnhXb3Jrcy4KKworVGh1IEF1ZyAyNiAxNzo1MDoyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQyMC9jbGFzc2VzLmV4cDogRm9yICJwdHlwZSBjbGFzcyBCYXNlMSIsIGNvbnRpbnVlIHRvIGFjY2VwdAorCW9sZCBmb3JtLgorCisJKiBnZGIudDIyL3ZpcnRmdW5jLmV4cDogSWYgaXQgcHJpbnRzIGBzdHJ1Y3QnIChub3QgYGNsYXNzJykgd2l0aCBhCisJbmFtZSAoZS5nLiBkZXZvIGdkYiB3aXRoIGdjYyAyLjQuNSksIGl0IGlzIHN0aWxsIGEgcGFzcy4KKworCSogZ2RiLnQxMC9jcm9zc2xvYWQuZXhwOiBTa2lwIHdob2xlIGZpbGUgKGZvciBub3csIHVudGlsIHdlIGZpeCBpdCkuCisKKwkqIGNvbmZpZy91bml4LWdkYi5leHA6IFJlbW92ZSB0aGlzIHZlcnNpb24gb2YgZ2RiX2V4aXQKKwkqIGxpYi9nZGIuZXhwOiBNZXJnZSBpbiBhbGwgdGhlIGNyYXAgZnJvbSBjb25maWcvdW5peC1nZGIuZXhwLgorCVJvYiBzYXlzIGhlJ2xsIGxvb2sgYXQgaXQgd2hlbiBoZSBnZXRzIGJhY2sgdG8gdGVzdGluZyBib2FyZHMuCisKK1RodSBBdWcgMjYgMDc6MjA6MDAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGdkYi50MjIvdmlydGZ1bmMuZXhwOiAgQWNjZXB0IG1pc3Npbmcgc3RydWN0L2NsYXNzIG5hbWVzIGFzCisJYW4gZXhwZWN0ZWQgZmFpbCBmb3IgY2VydGFpbiBwdHlwZSBjb21tYW5kcy4KKworCSogZ2RiLnQyMC9jbGFzc2VzLmV4cDogIFVwZGF0ZSBleHBlY3RlZCByZXN1bHRzIG9mICJwdHlwZSBjbGFzcworCUJhc2UxIiB0byBhY2NvdW50IGZvciB0aGUgY29uc3RydWN0b3IgdGhhdCBub3cgYXBwZWFycyBpbiB0aGUgdHlwZS4KKworV2VkIEF1ZyAyNSAxNjo0ODowNSAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChjb25maWdkaXJzKTogIFJlc3RvcmUgZ2RiLnQwNCwgd2hpY2ggbXlzdGVyaW91c2x5CisJZGlzYXBwZWFyZWQgZnJvbSBsaXN0LgorCSogY29uZmlnL3t1ZGktZ2RiLmV4cCwgZ2RiLXVuaXguZXhwfTogIFJlcGxhY2UgY2FsbHMgdG8gb2Jzb2xldGUKKwkiYWxsZG9uZSIgcHJvYyB3aXRoIGNhbGwgdG8gY2xlYW51cCBhbmQgZXhpdC4KKwkqIHtnZGIudDAxL3J1bi5leHAsIGdkYi50MDEvdGVybS5leHAsIGdkYi50MDIvd2hhdGlzLmV4cCwKKwlnZGIudDAzL3B0eXBlLmV4cCwgZ2RiLnQwNC9zZXR2YXIuZXhwLCBnZGIudDA1L2V4cHIuZXhwLAorCWdkYi50MDYvYnJlYWsuZXhwLCBnZGIudDA3L3dhdGNocG9pbnQuZXhwLCBnZGIudDA4L29wYXF1ZS5leHAsCisJZ2RiLnQwOS9jb3JlZmlsZS5leHAsIGdkYi50MTAvY3Jvc3Nsb2FkLmV4cCwgZ2RiLnQxMS9saXN0LmV4cCwKKwlnZGIudDEyL3Njb3BlLmV4cCwgZ2RiLnQxMy9iaXRmaWVsZHMuZXhwfTogIFJlcGxhY2UgY2FsbHMgdG8KKwkiYWxsZG9uZSIgcHJvYyB3aXRoIHNpbXBsZSByZXR1cm5zIHRoYXQgc3VwcHJlc3MgcmVtYWluaW5nCisJdGVzdHMuICBUaGUgYWxsZG9uZSBwcm9jIHdlbnQgYXdheSBtYW55IG1vbnRocyBhZ28uCisKK1R1ZSBBdWcgMjQgMTE6MDQ6MDYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50MTAvbm9kZWJ1Zy5leHA6IENvbW1lbnQgb3V0ICJtYWludCBwcmludCBtc3ltYm9scyIgdGVzdHMuCisKKwkqIGdkYi50MTIvZ2RibWUwLmMgKGxvY2Fsc2NvcGVzLCBhdXRvdmFycyk6IE1vZGlmeSB0byBmb2lsIGdjYyAtTy4KKworVGh1IEF1ZyAxOSAyMjowODo0MSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi50MTUvZnVuY2FyZ3MuZXhwOiAgQWxsb3cgYXJndW1lbnRzIGZvciBtYWluIGluIGJhY2t0cmFjZXMKKwlhcyB2YXggZ2RiIHdpbGwgZGlzcGxheSB0aGVtLgorCitUaHUgQXVnIDE5IDE4OjE4OjU5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIudDIwL2dkYm1lLmNjOiBEbyBzb21lIGNhbGN1bGF0aW9uIHdpdGggdi54LCB0byBjb25mb3VuZAorCW9wdGltaXplcnMuCisKKwkqIHNjb3BlLmV4cDogQ2hhbmdlICJiYWQgdmFsdWUgZm9yIGxvY2FsdmFsIiBtZXNzYWdlcyBzbyBlYWNoIG9uZQorCWlzIHVuaXF1ZS4KKworCSogY29uZmlnL3VuaXgtZ2RiLmV4cCAoZ2RiX2V4aXQpOiBNb3ZlIGluZm8gb24gdGhpcyB2cy4KKwlsaWIvZ2RiLmV4cCAoZ2RiX2V4aXQpIGZyb20gQ2hhbmdlTG9nIHRvIGNvbW1lbnRzLgorCisJKiBnZGIudDA2L3NpZ25hbHMuZXhwOiBTa2lwIHRoZSB3aG9sZSBmaWxlIHdpdGggeGZhaWwgZm9yIGRlbHRhNjguCisKK1R1ZSBBdWcgMTcgMDA6MDU6MjggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50MDAvdGVzdHN0cmF0ZWd5LmV4cDogRGVhbCB3aXRoIGl0IGlmIGNtZHNpemUgPSAxIGxpbmUKKwlkb2Vzbid0IGV4aXN0IChkdWUgdG8gb3B0aW1pemF0aW9uKS4KKworTW9uIEF1ZyAxNiAyMTowNTo0OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnN0YWJzL3dpZXJkLmV4cDogRGVhbCB3aXRoIGl0IGlmIGVjaG8gb2YgImZpbGUiIGNvbW1hbmQKKwljb250YWlucyBcciBiZWNhdXNlIHRoZSBmaWxlbmFtZSBpcyBsb25nLgorCisJKiBnZGIudDA2L3NpZ25hbHMuZXhwOiBSZXZpc2UgY29tbWVudHMgcmVnYXJkaW5nICInbmV4dCcgYmVoYXZlZCBhcworCSdjb250aW51ZSciIGJ1ZywgYW5kIGNoYW5nZSB4ZmFpbCBiYWNrIHRvIGkqODYtdW5pdmVsLXN5c3Y0Ki4KKworTW9uIEF1ZyAxNiAwMzowNToxNyAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi50MDAvaGVscC5leHAsIGdkYi50MDIvd2hhdGlzLmV4cCwgZ2RiLnQwNy93YXRjaHBvaW50LmV4cCwKKwlnZGIudDA4L29wYXF1ZS5leHAsIGdkYi50MTcvaW50ZXJydXB0LmV4cDogIFVwZGF0ZSBmb3IgdmF4IHJ1bm5pbmcKKwlVbHRyaXguCisJKiBnZGIudDAyL3doYXRpcy5leHA6ICBVc2UgcHJvY2VkdXJlIHRvIHNldHVwIHhmYWlscyBvbiBsb25nIHZlcnN1cworCWludCB0ZXN0cy4KKwkqIGdkYi50MDgvb3BhcXVlLmV4cDogIFVzZSBwcm9jZWR1cmUgdG8gc2V0dXAgeGZhaWxzIGZvciBvcGFxdWUgdGVzdHMuCisKK1RodSBBdWcgMTIgMTU6MjQ6MjggMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiAgUmVtb3ZlICoubG9nICoucGxvZyAqLnN1bSAqLnBzdW0gc2l0ZS4qLgorCisJKiBnZGIudDE3L2ludGVycnVwdC5leHA6ICBGaXggJ21pc3NpbmcgQ29udGludWluZycgY2FzZSBzbyBwYXR0ZXJuCisJdG8gbWF0Y2ggZG9lcyBub3QgbWF0Y2ggdGhlIHBhc3NpbmcgY2FzZSBidXQgc3RpbGwgbWF0Y2hlcyB0aGUgCisJZmFpbGluZyBjYXNlLgorCitUaHUgQXVnIDEyIDE2OjU4OjU5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlICoucGxvZyAqLnN1bSAqLnBzdW0gc2l0ZS4qLgorCitXZWQgQXVnIDExIDE5OjQ3OjI3IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBydGwuY3lnbnVzLmNvbSkKKworCSogbGliL2dkYi5leHAgKGdkYl9leGl0KTogIE1vdmUgdGhlIGJlc3QgdmVyc2lvbiBvZiBnZGJfZXhpdAorCXRvIGhlcmUuICBGaXggJ1F1aXQgYW55d2F5Lio/JyBidWcgKD8gaXMgYSByZWdleHAgbWV0YWNoYXJhY3RlcikuCisJKiBjb25maWcve21pcHMtZ2RiLmV4cCwgbmluZC1nZGIuZXhwLCB1ZGktZ2RiLmV4cCwgdngtZ2RiLmV4cH06CisJUmVtb3ZlIHZhcmlvdXMgdmVyc2lvbnMgb2YgZ2RiX2V4aXQuCisJKiBjb25maWcvdngtZ2RiLmV4cDogIFJlbW92ZSBxdWl0X3Z4Z2RiLCBjaGFuZ2UgYSBjYWxsZXIgdG8gY2FsbAorCWdkYl9leGl0LgorCSogY29uZmlnL3VuaXgtZ2RiLmV4cDogIGdkYl9leGl0IHJlbWFpbnMgaGVyZSwgYW5kIHNob3VsZCBvdmVycmlkZQorCXRoZSBnZW5lcmljIHZlcnNpb24sIHNpbmNlIGl0J3MgZG9pbmcgYSBsb3Qgb2Ygd2llcmQgc3R1ZmYgdGhhdAorCXRoZSBvdGhlciB2ZXJzaW9ucyBhcmVuJ3QuICBGSVhNRSwgZm9sZCBpdCBpbiwgb3IgYWJhbmRvbiB0aGlzCisJdmVyc2lvbi4KKworV2VkIEF1ZyAxMSAxMjowOTozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQyNC9kZW1hbmdsZS5leHA6IEFkZCB0ZXN0cyBmb3IgUFIgMzIyMC4KKworVHVlIEF1ZyAxMCAxNTo0OTozNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQyNC9kZW1hbmdsZS5leHA6IEFkZCBsdWNpZCB0ZXN0IGZvciBfX3Z0YmxfXzNmb29fX3Z0X2NjX21haW5fLgorCitUdWUgQXVnIDEwIDE1OjQ1OjI1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBnZGIudDA3L3dhdGNocG9pbnQuZXhwOiAgQ2xlYXIgeGZhaWwgd2l0aCAiaSo4Ni0qLSoiLCBub3QganVzdAorCSJpMzg2LSotKiIuICBXb3JrcyBmb3IgaTQ4NiBhcyB3ZWxsLgorCisJKiBnZGIudDA2L3NpZ25hbHMuZXhwOiAgUmV3b3JrIGNvZGUgdGhhdCByZWNvZ25pemVzIGtub3duIFNWUjQKKwlidWcsIGFuZCBleHBhbmQgZG9tYWluIG9mIHhmYWlsIHRvIGFsbCBTVlI0IHN5c3RlbXMsIHNpbmNlIHRoZQorCWFjdHVhbCBwcm9ibGVtIGlzIGxpa2VseSB0byBiZSBpbiBnZW5lcmljIFNWUjQgL3Byb2Mgc3VwcG9ydC4KKworVHVlIEF1ZyAxMCAxNTo0OTozNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3VuaXgtZ2RiLmV4cCAoZ2RiX2xvYWQpOiBBZGQgZW9mIHRvIGV4cGVjdCBzdGF0ZW1lbnQuCisKK1R1ZSBBdWcgMTAgMDk6NTY6NTYgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGdkYi50MTcvaW50ZXJydXB0LmV4cDogIFNldCB1cCB4ZmFpbCBmb3IgKi0qLXN5c3Y0KiwgaW4gY2hhaW4gb2YKKwl4ZmFpbHMgZm9yIG90aGVyIHN5c3RlbXMuICBNYXRjaCBhIG1pc3NpbmcgJ0NvbnRpbnVpbmcuJyBhcyBhbgorCWV4cGxpY2l0IGZhaWwgZm9yIGkqODYtKi1zeXN2NCosIHNvIGl0IGRvZXNuJ3QgaG9zZSBvdGhlciB0ZXN0cy4KKworCSogZ2RiLnQyMCB7Y2xhc3Nlcy5leHAsIGluaGVyaXQuZXhwLCBtaXNjLmV4cH0sIGdkYi50MjEvY3BsdXNmdW5jcy5leHAsCisJZ2RiLnQyMi92aXJ0ZnVuYy5leHAsIGdkYi50MjMvdGVtcGxhdGVzLmV4cCwgZ2RiLnQzMS9jaGlsbHZhcnMuZXhwOgorCU9ubHkgaXNzdWUgd2FybmluZyBmb3IgbWlzc2luZyBleGVjdXRhYmxlcyBpZiAtYWxsIG9wdGlvbiBpcyB1c2VkLgorCisJKiBnZGIuc3RhYnMvd2llcmQuZXhwOiAgT25seSBpc3N1ZSB3YXJuaW5nIGZvciBtaXNzaW5nIHdpZXJkLm8KKwlmaWxlIGlmIC1hbGwgb3B0aW9uIGlzIHVzZWQuICBJdCdzIGxpa2UgYW4gdW5wcmVkaWN0YWJsZSBYRkFJTC4KKworTW9uIEF1ZyAgOSAxMDoxMzozNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQxNS9mdW5jYXJncy5leHA6IEFkZCBjb21tZW50cyB0aGF0IGhwcGEgeGZhaWxzIGFyZSBvbmx5CisJZm9yIGR5bmFtaWNhbGx5IGxpbmtlZCBiaW5hcmllcy4KKworCSogZ2RiLnQxMC9jcm9zc2xvYWQuZXhwOiBBZGQgYHNldCBnbnV0YXJnZXQgYXV0bycgYXQgZW5kIG9mIHRlc3RzLgorCitTdW4gQXVnICA4IDE0OjIxOjI5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIudDIwL2luaGVyaXQuZXhwOiBDaGFuZ2UgbWVzc2FnZSBmb3IgInByaW50IHRhZ2xlc3Mgc3RydWN0IgorCXRvIHN0YXRlIHRoYXQgdGhpcyBpcyBhIGtub3duIGJ1ZyBpbiBvbGQgdmVyc2lvbnMgb2YgZysrLgorCitGcmkgQXVnICA2IDIxOjQwOjMwIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLnQxNy9pbnRlcnJ1cHQuZXhwOiAgQWRkIHhmYWlsIGZvciAzODYgYnNkLiBBY2NlcHQgZWNob2VkIG5ld2xpbmUKKwl3aGlsZSB3YWl0aW5nIGZvciBgQ29udGludWluZycuCisKK0ZyaSBBdWcgIDYgMTM6Mzg6MDggMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGdkYi50MTAvbm9kZWJ1Zy5leHA6ICBFeHBlY3QgdG8gZmluZCBsb2NhbC9nbG9iYWwgbWluaW1hbCBzeW1ib2xzCisJaW4gdGV4dCwgZGF0YSwgYW5kIGJzcy4KKwkqIGdkYi50MTAvbm9kZWJ1Zy5jOiAgQWRkIGxvY2FsIGFuZCBnbG9iYWwgdGVzdCB2YXJpYWJsZXMgZm9yCisJaW5pdGlhbGl6ZWQgYW5kIHVuaW5pdGlhbGl6ZWQgZGF0YS4KKworVGh1IEF1ZyAgNSAxMjoxODo0MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3VuaXgtZ2RiLmV4cCAoZ2RiX2V4aXQpOiBBZGQgIndhaXQiLgorCitUaHUgQXVnICA1IDE4OjE0OjA2IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLnQwNi9zaWduYWxzLmV4cDogIHhmYWlsIHRoZSBjb250aW51ZSBmcm9tIHRoZSBoYW5kbGVyIGZvciBhbGwKKwl0YXJnZXRzLgorCisJKiBnZGIudDA3L3dhdGNocG9pbnQuZXhwOiAgY2xlYXJfeGZhaWwgZm9yIGkzODYgd2hlbiBjYWxsaW5nIGEKKwlmdW5jdGlvbiB3aXRoIHdhdGNocG9pbnRzIGVuYWJsZWQsIHRoZSBpMzg2IGNhbGwgZHVtbXkgc3RhcnRzIHdpdGgKKwlhIGNhbGwuCisKKwkqIGdkYi50MDAvdGVzdHN0cmF0ZWd5LmV4cCwgZ2RiLnQwOS9NYWtlZmlsZS5pbjogIEhhbmRsZSB0aGUgd2F5CisJMzg2IGJzZCBuYW1lcyBpdHMgY29yZWZpbGVzLgorCitXZWQgQXVnICA0IDA4OjUzOjQxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBnZGIudDEwL01ha2VmaWxlLmluIChub2RlYnVnLm8pOiAgRG9uJ3QgdXNlICItYyAtbyIsIG1hbnkKKwljb21waWxlcnMgZG9uJ3QgZ3JvayBpdC4KKwkqIGdkYi50MTYvZ2RibWUuYyAoY3RhYmxlMSk6ICBJbml0aWFsaXplIHVuc2lnbmVkIGNoYXIgYXJyYXkKKwl3aXRoIHNtYWxsIG9jdGFsIGludHMgcmF0aGVyIHRoYW4gY2hhcmFjdGVyIGNvbnN0YW50cywgd2hpY2gKKwlhcmUgc2lnbmVkIGFuZCBtaWdodCBub3QgZml0IGlmIGZpcnN0IHByb21vdGVkIHRvIGludC4KKworVHVlIEF1ZyAgMyAxODoyODoyNSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwOS9NYWtlZmlsZS5pbiAoY2xlYW4pOiAgUmVtb3ZlIGNvcmVmaWxlLgorCitNb24gQXVnICAyIDEyOjQ3OjQ0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIudDA3L3dhdGNocG9pbnQuZXhwOiBBZGQgbWlzc2luZyBgJHByb21wdCAkJy4KKworTW9uIEF1ZyAgMiAxMjozMDoxNCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisJCQkgIGFuZCBKaW0gS2luZ2RvbiAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBnZGIudDA2L3NpZ25hbHMuZXhwOiBDaGFuZ2UgeGZhaWwgZnJvbSAiKi0qLSoiIHRvIGJlIG9ubHkgZm9yCisJTk9fU0lOR0xFX1NURVAgbWFjaGluZXMuICBGaXggY29tbWVudCBhYm91dCBpdHMgY2F1c2UuICBVbmNvbW1lbnQKKwl0aGUgYGNvbnRpbnVlJyB0ZXN0IHJpZ2h0IGFmdGVyIGl0IChhbHNvIHhmYWlsZWQgaWYgTk9fU0lOR0xFX1NURVApLgorCitGcmkgSnVsIDMwIDE5OjQ2OjU1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIudDE3L2ludGVycnVwdC5leHA6IEFkZCB4ZmFpbCBmb3IgaHBwYS4KKworRnJpIEp1bCAzMCAxMjo1NDoxMSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi50MDIvd2hhdGlzLmV4cCwgZ2RiLnQwMy9wdHlwZS5leHAsIGdkYi50MDgvb3BhcXVlLmV4cCwKKwlnZGIudDA5L2NvcmVmaWxlLmV4cDogIENsZWFudXAgeGZhaWxzIGZvciBmaXhlZCBtaXBzIGJ1Z3MuCisJKiBnZGIudDEzL2JpdGZpZWxkcy5leHAsIGdkYm1lLmM6ICBFeGFtaW5lIGEgdmFyaWFibGUgaW4gdGhlIGluZmVyaW9yCisJdG8gZGV0ZXJtaW5lIHNpZ25lZC1uZXNzIG9mIGJpdGZpZWxkcyBhbmQgdXNlIHRoZSByZXN1bHQgdG8gc2V0dXAKKwl0aGUgeGZhaWwuCisJKiBnZGIudDE1L2dkYm1lLmM6ICBBZGQgY29tbWVudHMgdG8gdGhlIHR3byBpbmRpcmVjdCBjYWxsMGEgbGluZXMuCisJKiBnZGIudDE1L2Z1bmNhcmdzLmV4cDogIFVzZSB0aGVtIHRvIHN0ZXAgdW50aWwgdGhlIHNlY29uZCBpbmRpcmVjdAorCWNhbGwgbGluZSBpcyByZWFjaGVkIGlmIG5lY2Vzc2FyeS4KKworVGh1IEp1bCAyOSAyMDozMzowOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnN0YWJzL3dpZXJkLmV4cDogTmV3IHRlc3QsIGZvciBuYW1lbGVzcyBiYXNlY2xhc3Nlcy4KKworTW9uIEp1bCAyNiAwMDoxNTowMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwNi9icmVhay5leHA6IEFsc28gdGVzdCBgY2xlYXInIGNvbW1hbmQuCisKK1dlZCBKdWwgMjEgMTg6MDM6MzggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCisKKwkqIGdkYi50MDAvdGVzdHN0cmF0ZWd5LmV4cDogUmVtb3ZlIGV4dHJhIHF1b3RlLgorCisJKiBnZGIudDA3L3dhdGNocG9pbnQuZXhwOiBDaGFuZ2UgeGZhaWwgZm9yIGNhbGxpbmcgZnVuY3Rpb24gd2l0aAorCXdhdGNocG9pbnQgZW5hYmxlZCB0byBiZSBmb3IgYWxsIG5vbi02OGsgbWFjaGluZXMuCisKKwkqIGdkYi50MTUve21pcHNfcHJvLntjLGV4cH0sTWFrZWZpbGUuaW59OiBOZXcgdGVzdC4KKworTW9uIEp1bCAxOSAyMzo1OToyNiAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi5zdGFicy9jb25maWd1cmUuaW46IElmIGNvbmZpZ3VyZWQgLXdpdGgtZ251LWFzIGZvciBtaXBzLSotKgorCXRhcmdldHMgdXNlIGFvdXQubXQgaW5zdGVhZCBvZiBlY29mZi5tdCBhcyBnYXMgdW5kZXJzdGFuZHMKKwlzdGFuZGFyZCBhb3V0IGZvcm1hdC4KKworTW9uIEp1bCAxOSAxODoxNDowNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogbGliL2dkYi5leHAgKHJ1bnRvKTogRG9uJ3QgaW5zaXN0IHRoYXQgZnVuY3Rpb24gd2UgYXJlIHJ1bm5pbmcgdG8KKwl3YXMgY29tcGlsZWQgd2l0aCAtZy4KKworCSogZ2RiLnQxMC97bm9kZWJ1Zy57YyxleHB9LE1ha2VmaWxlLmlufTogTmV3IHRlc3QuCisKKwkqIGdkYi50MTcvaW50ZXJydXB0LmV4cDogQmVmb3JlIHNlbmRpbmcgXkMsIGdpdmUgdGhlIGluZmVyaW9yIHRpbWUKKwl0byBnZXQgYmFjayBpbnRvIHRoZSByZWFkIHN5c3RlbSBjYWxsLgorCUFjY2VwdCBsZWFkaW5nIG5ld2xpbmUgaW4gY2FzZSB3aGVyZSB3ZSB3b2tlIGl0IHVwLgorCitTdW4gSnVsIDE4IDA4OjQwOjQ1IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLnN0YWJzL3tlY29mZi5tdCx3aWVyZC1lY29mZi5TLHdpZXJkLWVjb2ZmLnNlZH06ICBOZXcgZmlsZXMKKwl0byBtYWtlIHRoZSBzdGFicyB0ZXN0IHdvcmsgb24gZWNvZmYgc3lzdGVtcyB1c2luZyBnY2MgYW5kIC13aXRoLXN0YWJzLgorCSogZ2RiLnN0YWJzL3tNYWtlZmlsZS5pbixjb25maWd1cmUuaW4sYW91dC5tdCx4Y29mZi5tdH06ICBNb2RpZnkgdG8KKwllbmFibGUgZWNvZmYgY29uZmlndXJhdGlvbi4KKworVGh1IEp1bCAxNSAxMTo1NDo1OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQxNS9mdW5jYXJncy5leHAgKGxvY2FsdmFyc19pbl9pbmRpcmVjdF9jYWxsKTogTmV3IHRlc3QuCisKK1dlZCBKdWwgMTQgMDk6MzY6NDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50MTYvcHJpbnRjbWRzLmV4cDogQWRkIGFub3RoZXIgcHJpbnRmIHRlc3QuCisKK1dlZCBKdWwgMTQgMTU6Mzc6MTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IElmIGNvbmZpZ3VyZWQgLXdpdGgtc3RhYnMgb24gYW55IHRhcmdldCwgYWRkCisJc3RhYnNkaXJzIHRvIGNvbmZpZ2RpcnMuCisKK1dlZCBKdWwgMTQgMDk6MzY6NDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50MTYvcHJpbnRjbWRzLmV4cDogQ2hhbmdlIHByaW50ZiAiJWZcbiIgdG8gcHJpbnRmICIlZiBpcworCWZ1biIgc28gcGF0dGVybiBkb2VzIG5vdCBtYXRjaCB0aGUgY29tbWFuZCBpdHNlbGYuCisKK01vbiBKdWwgMTIgMTE6MjI6MDYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50MTUve2dkYm1lLmMsZnVuY2FyZ3MuZXhwfTogVGVzdCBmb3IgYWxsb2NhLWluZmx1ZW5jZWQgZnJhbWVzLgorCitTdW4gSnVsIDExIDEyOjAzOjI0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIudDE3L2ludGVycnVwdC5leHA6IFRlc3QgZm9yIG1vcmUgdGhpbmdzLgorCitGcmkgSnVsICA5IDE0OjExOjE3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIudDA3L3dhdGNocG9pbnQuZXhwOiBJbiB1bnRpbCB0ZXN0LCBkZWFsIHdpdGggdGhlIHdheSB0aGUgREVDCisJY29tcGlsZXIgYXJyYW5nZXMgdGhlIGNvZGUgYW5kIGxpbmUgbnVtYmVycy4KKworCSogZ2RiLnQxNy9pbnRlcnJ1cHQuZXhwOiBEb24ndCBzZW5kIFxuIGFmdGVyIF5DLgorCitGcmkgSnVsICA5IDA5OjQ3OjAyIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLnQwMC9oZWxwLmV4cDogIEluY3JlYXNlIGV4cGVjdCBpbnB1dCBidWZmZXIgc2l6ZS4KKworVGh1IEp1bCAgOCAxNDoyNjo1MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwNi9zaWduYWxzLmV4cDogUmVtb3ZlIHNwYXJjIHhmYWlsOyBidWcgZml4ZWQuCisKKwkqIGdkYi50MDcvd2F0Y2hwb2ludC5leHA6IEFkZCB4ZmFpbCBmb3IgaHBwYS4KKworCSogZ2RiLnQxNy97Z2RibWUuYyxjYWxsZnVuY3MuZXhwfTogQWRkIHN1bTEwIGZ1bmN0aW9uLCB0byB0ZXN0IHBhIGJ1Zy4KKworCSogZ2RiLnQwNi9zaWduYWxzLmV4cDogQXQgInAgZnVuYzEgKCkiIHRlc3QsIGNoZWNrIGZvciBicmVha3BvaW50CisJWzAtOV0qLCBub3QganVzdCBbMC05XS4KKworV2VkIEp1bCAgNyAxNzo1MjoyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQyMC97Z2RibWUuY2MsY2xhc3Nlcy5leHB9OiBBZGQgeGZhaWwgZm9yIGdkYi8yOTcyLgorCisJKiBnZGIudDIqOiBTZXQgQ1hYRkxBR1MsIG5vdCBDRkxBR1MsIHNpbmNlIHRoYXQncyB3aGF0IHdlIHVzZS4KKworVHVlIEp1bCAgNiAxMzo1NDo0OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwMC9oZWxwLmV4cDogUmVwbGFjZSBtb3N0IG9mIGRvY3N0cmluZyBmb3IgImNvbnRpbnVlIiB3aXRoIC4qLgorCitNb24gSnVsICA1IDIyOjAzOjQ1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIudDA2L3NpZ25hbHMuYzogQWRkIHhmYWlscyBmb3Igc3VuMy4KKworCSogZ2RiLnQwNy93YXRjaHBvaW50LmV4cDogQ29tbWVudCBvdXQgeGZhaWwgZm9yIGZpeGVkIGJ1ZyAxODM2LgorCisJKiBnZGIudDA3L3tnZGJtZS5jLHdhdGNocG9pbnQuZXhwfTogQWRkIHRlc3QgZm9yIDI1OTcuICBBbHNvIGFkZAorCXRlc3Rfc3RlcHBpbmcgdGVzdHMuCisKK0ZyaSBKdWwgIDIgMDk6MDg6MTAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50ezA2LDE3fS9NYWtlZmlsZS5pbiAoY2xlYW4pOiBSZW1vdmUgYWxsIGV4ZWN1dGFibGVzLgorCisJKiBnZGIudDE3L3tpbnRlcnJ1cHQue2MsZXhwfSxNYWtlZmlsZS5pbn06IE5ldyB0ZXN0IGZvciBzb2xhcmlzIGJ1Zy4KKworCSogZ2RiLnQwNi90d2ljZS5leHAsIE1ha2VmaWxlLmluOiBKdXN0IHVzZSBhbiBpbmNsdWRlIG9mIHR3aWNlLmMKKwlyYXRoZXIgdGhhbiBhY3R1YWxseSBwdXR0aW5nIGl0IHRocm91Z2ggY3BwIHR3aWNlLgorCisJKiBnZGIudDA2L3NpZ25hbHMuZXhwOiBBZGQgeGZhaWxzIGZvciB1bml4d2FyZSBhbmQgcnM2MDAwLgorCitGcmkgSnVsICAyIDEwOjQ4OjAzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21pcHMtZ2RiLmV4cCAoZ2RiX2V4aXQpOiBSZW1vdmVkIGNsb3NlIHN0YXRlbWVudCB3aGljaCBpcworCW5vIGxvbmdlciBuZWVkZWQuCisKK0ZyaSBKdWwgIDIgMDk6MDg6MTAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50MDYvc2lnbmFscy5leHA6IEFkZCB0ZXN0IGZvciBzcGFyYyBidWcgd2l0aCBkb19zYXZlX2luc24uCisKKwkqIGdkYi50MjAve2NsYXNzZXMsaW5oZXJpdH0uZXhwOiBJZiBhIGNsYXNzIHdoaWNoIGRvZXNuJ3QgdXNlIGFueQorCUMrKyBmZWF0dXJlcyBwcmludHMgYXMgInN0cnVjdCIsIG1ha2UgaXQgYSBwYXNzLCBub3QgYW4geGZhaWwuCisKK1RodSBKdWwgIDEgMjI6MDM6MzMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50MjIvdmlydGZ1bmMuZXhwOiBSZW1vdmUgYSBidW5jaCBvZiB4ZmFpbHMuCisJRG9uJ3QgcmVxdWlyZSBWQSB0byBwcmludCBhcyAiY2xhc3MiIHJhdGhlciB0aGFuICJzdHJ1Y3QiLgorCitUaHUgSnVsICAxIDE4OjI3OjQwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBnZGIudDA2L3R3aWNlLmV4cDogRG9uJ3QgY2FyZSBhYm91dCB0aGUgZmlsZSBuYW1lIEdEQiBwcmludHMuCisKK1dlZCBKdW4gMzAgMTg6MDE6MDAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50ezAyLDEzfS9jb21wLWluZm8uYywgZ2RiLnQwNi90d2ljZS5leHA6IEFkZCAicmV0dXJuIDAiIHRvIGVuZC4KKworVHVlIEp1biAyOSAxMzoxNTo0MiAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi50MTIvc2NvcGUuZXhwOiAgUmVtb3ZlIHhmYWlsIGZvciBwYXJhbWV0ZXIgcHJpbnRpbmcgaW4gd3JvbmcKKwlvcmRlci4KKworVHVlIEp1biAyOSAwOToyMjoyOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQxNi9wcmludGNtZHMuZXhwOiBBZGQgcHJpbnRmIHRlc3RzLgorCisJKiBnZGIudDA2L3t0d2ljZS57YyxleHB9LE1ha2VmaWxlLmlufTogTmV3IHRlc3QuCisKKwkqIGdkYi50MTAvTWFrZWZpbGUuaW4gKGNsZWFuKTogUmVtb3ZlICQoRVhFQ1VUQUJMRVMpIHRvby4KKworTW9uIEp1biAyOCAxMToyNTo1OSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZ2RiLnQyMC9jbGFzc2VzLmV4cDogIEFkZCBjbGVhcl94ZmFpbCdzIGJlZm9yZSBwcmludGluZyBzdW1tYXJ5CisJcGFzcyBjb3VudHMsIHRvIGNvdW50ZXJhY3QgYW55IGV4aXN0aW5nIG9yIGZ1dHVyZSBzZXR1cF94ZmFpbHMuCisKK01vbiBKdW4gMjggMDk6MTU6MTcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi5zdGFicy93aWVyZHsuZGVmLC1hb3V0LlMsLXhjb2ZmLlN9OiBVc2UgbmV3IG1hY3JvcworCXtCRUdJTixFTkR9X0NPTU1PTiBmb3IgY29tbW9uIGJsb2NrIGluc3RlYWQgb2YgU1RBQi4KKwkqIGdkYi5zdGFicy93aWVyZC5leHA6IEFkZCB4ZmFpbCBmb3IgcnM2MDAwLgorCisJKiBnZGIuc3RhYnMvd2llcmQuZGVmOiBNYWtlIHZhbHVlIG9mIE5fR1NZTSdzIDAuCisJaW50cF92YXIgc2hvdWxkIGJlIE5fR1NZTSBub3QgTl9MU1lNLgorCXdpZXJkLWFvdXQuUzogVXNlIGEgbGFiZWwgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgTl9TTy4KKwl3aWVyZC5kZWY6IFJlbW92ZSBhbGwgYmFja3NsYXNoZXMuCisJd2llcmQte2FvdXQseGNvZmZ9LlM6IFB1dCBhIGZldyB0ZXN0cyB3aXRoIGJhY2tzbGFzaGVzIGhlcmUuCisKK01vbiBKdW4gMjggMDc6MjE6NTEgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBnZGIudDIwL2dkYm1lLmNjIChtYWluKTogTW92ZSB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiBmb3IgQUlYIHRvCisJZ2V0IHRoZSBleHBlY3RlZCBuZXh0IHRvIGluaGVyaXRhbmNlMy4KKworU3VuIEp1biAyNyAxMjoyOTo1MyAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi50MDAvdGVzdHN0cmF0ZWd5LmV4cDogUmVtb3ZlIGV4cGVjdGVkIGZhaWx1cmUgZm9yIG1pcHMtKi0qCisJbm93IHRoYXQgZ2NjLTIuNCBnZXRzIGl0IHJpZ2h0LgorCitGcmkgSnVuIDI1IDEyOjAwOjQ2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBnZGIuc3RhYnMvd2llcmR7LmRlZiwuZXhwLC1hb3V0LlMsLXhjb2ZmLlN9OiBBZGQgY29tbW9uIGJsb2NrIHRlc3QuCisKKwkqIGdkYi50ezAyLDEzfS97TWFrZWZpbGUuaW4sZ2RibWUuYyxjb21wLWluZm8uY306IE5ldyB3YXkgb2YKKwlnZW5lcmF0aW5nIGNvbXAtaW5mby5leHAgd2hpY2ggd29ya3MgZm9yIGNyb3NzLWNvbXBpbGF0aW9uLgorCitUaHUgSnVuIDI0IDE2OjU1OjA1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBnZGIudDExL2xpc3QuZXhwOiAgRm9yIFNWUjQgeGZhaWxzLCBtYXRjaCAiKi0qLXN5c3Y0KiIsIG5vdAorCSIqLSotc3lzdjQuKiIuCisKK1R1ZSBKdW4gMjIgMjE6MTc6MjYgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGdkYi50MDEvcnVuLmV4cDogIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisJKiBnZGIudDExL2xpc3QuZXhwOiAgRm9yIFNWUjQgeGZhaWxzLCBtYXRjaCBvbiBhbGwgdmVyc2lvbnMgb2YKKwlTVlI0LnguCisKK01vbiBKdW4gMjEgMTU6MjM6MjIgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIHtnZGIudDAxLCBnZGIudDAyLCBnZGIudDAzLCBnZGIudDA0LCBnZGIudDA1LCBnZGIudDA2LCBnZGIudDA3LAorCWdkYi50MDgsIGdkYi50MDksIGdkYi50MTAsIGdkYi50MTEsIGdkYi50MTIsIGdkYi50MTMsIGdkYi50MTUsCisJZ2RiLnQxNiwgZ2RiLnQxNywgZ2RiLnQyMCwgZ2RiLnQyMSwgZ2RiLnQyMiwgZ2RiLnQyMywgZ2RiLnQzMH0vCisJTWFrZWZpbGUuaW4gKGRpc3RjbGVhbiwgcmVhbGNsZWFuKTogIFJlbW92ZSBnZGJtZS5jIGZyb20gbGlzdCBvZgorCXRoaW5ncyB0byByZW1vdmUuCisKK1NhdCBKdW4gMTkgMDc6NDk6MTAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGdkYi50MjQvZGVtYW5nbGUuZXhwICh0ZXN0X2dudV9zdHlsZV9kZW1hbmdsaW5nKTogIEFkZCBzb21lIG5ldworCXRlc3QgY2FzZXMgZnJvbSBidWcgcmVwb3J0cy4KKworRnJpIEp1biAxOCAxMDozODo0OSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwNi9icmVhay5leHA6ICBBZGQgeGZhaWxzIGZvciBzcGFyYy1zdW4tc29sYXJpczIuKi4KKwkqIGdkYi50MTIvc2NvcGUuZXhwOiAgQWRkIGNsZWFyX3hmYWlscyBhdCBhcHByb3ByaWF0ZSBwbGFjZXMgdG8KKwkgIGF2b2lkIHNwdXJpb3VzIHhmYWlscy4KKwkqIGdkYi50MjAvY2xhc3Nlcy5leHA6ICBBZGQgeGZhaWxzIGZvciBsb25nc3RhbmRpbmcgQysrIHByb2JsZW1zLgorCSogZ2RiLnQyMS9jcGx1c2Z1bmNzLmV4cDogIEFkZCB4ZmFpbHMgZm9yIHNwYXJjLXN1bi1zb2xhcmlzMi4qLgorCSogZ2RiLnQyMi92aXJ0ZnVuYy5leHA6ICBBZGQgeGZhaWxzIGZvciBsb25nc3RhbmRpbmcgQysrIHByb2JsZW1zLgorCitXZWQgSnVuIDE2IDEwOjExOjU3IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBnZGIudDAwL3Rlc3RzdHJhdGVneS5leHA6ICBSZXdvcmsgdG8gcHJvdmlkZSBtb3JlIHVzZWZ1bAorCWRlc2NyaXB0aW9uIG9mIGVhY2ggdGVzdCwgZml4IHByb2JsZW0gd2l0aCBzeXN0ZW1zIHRoYXQgZGVmaW5lCisJQUxJR05fU1RBQ0tfT05fU1RBUlRVUCBjb2RlLCBvdGhlciBtaXNjIGNsZWFudXBzLgorCSogZ2RiLnQwNi9icmVhay5leHAgKHRlc3RfbmV4dF93aXRoX3JlY3Vyc2lvbik6ICBGaXggZXhwZWN0ZWQKKwlyZXN1bHRzIGZvciAibmV4dCBvdmVyIHJlY3Vyc2l2ZSBjYWxsIiBzbyB0aW1lb3V0cyBhcmVuJ3QgdGFrZW4KKwlieSBlcnJvci4KKworTW9uIEp1biAxNCAwOTowOTowNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogZ2RiLnQxMi9zY29wZS5leHA6IFRlc3QgcHJpbnRpbmcgb2YgdmFyaWFibGVzIGJlZm9yZSBydW4uCisKKwkqIGdkYi50MTIve2dkYm1lMC5jLHNjb3BlLmV4cH06IFRlc3QgZm9yIGJ1ZyB3aGVyZSBwYXJhbWV0ZXJzIGFyZQorCXByaW50ZWQgaW4gd3Jvbmcgb3JkZXIgZHVlIHRvIHNvcnRpbmcuCisKK1NhdCBKdW4gMTIgMTU6MDM6NTggMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGdkYi50MDAvdGVzdHN0cmF0ZWd5LmV4cDogIEZpeCBleHBlY3RlZCByZXN1bHRzIGZvciBwcmludGluZworCXVzZXIgZW50ZXJlZCBzdHJpbmcgY29uc3RhbnQuICBJcyBhcnJheSBvZiBjaGFyLCBwcmludHMgd2l0aCBubworCWFkZHJlc3MuCisKKwkqIGdkYi50MDAve2RlZmF1bHQuZXhwLCBoZWxwLmV4cH06ICBBY2NvdW50IGZvciBjaGFuZ2VzIHRvIHJhZGl4CisJY29tbWFuZHMuCisJKiBnZGIudDE2L2dkYm1lLmM6ICBBZGQgYW5kIHVzZSBzdHJ1Y3QgY29udGFpbmluZyBhcnJheXMgb2YgY2hhci4KKwkqIGdkYi50MTYvcHJpbnRjbWRzLmV4cDogIEZpeCBhbGwgbGluZXMgdGhhdCBtYXRjaCAidW5zaWduZWQgY2hhciAqIi4KKwkqIGdkYi50MTYvcHJpbnRjbWRzLmV4cCAodGVzdF9wcmludF9jaGFyX2FycmF5cyk6ICBUZXN0IHByaW50aW5nCisJb2Ygc3RydWN0IG9mIGNoYXIgYXJyYXlzLgorCSogZ2RiLnQwMC9yYWRpeC5leHA6ICBOZXcgdGVzdHMgZm9yIHJhZGl4IGNvbW1hbmRzLgorCitGcmkgSnVuIDExIDEzOjEyOjI3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBnZGIudDE2L3ByaW50Y21kLmV4cDogUHJpbnQgYSB2YXJpYWJsZSBiZWZvcmUgcnVubmluZyBwcm9ncmFtCisJKHdpdGggeGZhaWwgZm9yIEFJWCkuCisKK1RodSBKdW4gMTAgMTE6MDQ6MDQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCisKKwkqIGdkYi50MDYve3NpZ25hbHMuZXhwLHNpZ25hbHMuYyxNYWtlZmlsZS5pbn06IE5ldyB0ZXN0LgorCisJKiBnZGIudDE2L3ByaW50Y21kLmV4cDogRG9uJ3QgcHJpbnQgdmFyaWFibGVzIGJlZm9yZSBydW5uaW5nIHByb2dyYW0uCisKKwkqIGdkYi50MDYvYnJlYWsuZXhwOiBEb24ndCByZXF1aXJlIGVudnAgYXJndW1lbnQgdG8gbWFpbi4KKworCSogZ2RiLnQwezIsMyw0LDV9L2dkYm1lLmMgW19BSVhdOiBVc2Ugc2lnbmVkIGtleXdvcmQuCisKKwkqIGdkYi50MDIvd2hhdGlzLmV4cCwgZ2RiLnQxMS9saXN0LmV4cDoKKwlBZGQgeGZhaWxzIGZvciByczYwMDAuCisKKwkqIGdkYi50MDIvd2hhdGlzLmV4cDogQ2hhbmdlIG90aGVyIHRlc3RzIG5vdCB0byByZS10ZXN0IHNvbWV0aGluZworCXdlIGFscmVhZHkgdGVzdGVkLgorCisJKiBnZGIudHswMywxNSwxNn0vZ2RibWUuYzogUmVmZXJlbmNlIGFsbCB2YXJpYWJsZXMgYW5kIG1ha2Ugc3VyZQorCWVhY2ggdHlwZSB1c2VkIGhhcyBhIHZhcmlhYmxlIG9mIHRoYXQgdHlwZS4KKworVHVlIEp1biAgOCAxNjo0NToyMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCisKKwkqIGdkYi50MjAve2luaGVyaXQuZXhwLGdkYm1lLmNjfTogVGVzdCB0YWdsZXNzIHN0cnVjdHVyZS4KKworRnJpIEp1biAgNCAxMTowNzoxOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogY2hhbmdlIHNyY3RyaWdnZXIgdG8gYmUgYSBmaWxlLCBub3QgYSBkaXJlY3RvcnkKKworRnJpIEp1biAgNCAwODoyMzo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAobWlwcy1pZHQtZWNvZmYqKTogQWRkZWQgdHJhaWxpbmcgJyonLgorCisJKiBnZGIudDExL2xpc3QuZXhwOiBGaXhlZCBhIGNvdXBsZSBvZiB0eXBvcy4KKworVHVlIEp1biAgMSAyMToyODowNiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwMCAodGVzdHN0cmF0ZWd5LmV4cCk6ICBSZW1vdmUgbm90aWNlIGFib3V0IFBSIDE4MjMuICBCdWcKKwlpcyBmaXhlZCBhbmQgUFIgaXMgY2xvc2VkLgorCSogZ2RiLnQxNiAoZ2RibWUuYyk6ICBBZGQgc2ltcGxlIHRlc3Qgc3RyaW5nIHZhcmlhYmxlLgorCSogZ2RiLnQxNiAocHJpbnRjbWRzLmV4cCk6ICBBZGQgdGVzdHMgd2l0aCBzaW1wbGUgdGVzdCBzdHJpbmcKKwl2YXJpYWJsZSwgcHJpbWFyaWx5IGZvciBib3VuZGFyaWVzIG9uICJzZXQgcHJpbnQgZWxlbWVudHMiLgorCitNb24gTWF5IDMxIDExOjM2OjA4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBnZGIuc3RhYnMvd2llcmQuZXhwOiBSZW1vdmUgeGZhaWwgZm9yIHByaW50aW5nIGJpZyBpbnRlZ2VyLgorCU1ha2UgbGVhZGluZyAwJ3Mgb3B0aW9uYWwgYW5kIGRvbid0IGV4cGVjdCBhIHRhYiBpbiB0aGUgbWlkZGxlCisJb2YgdGhlIG51bWJlci4KKworCSogZ2RiLnQwMC90ZXN0c3RyYXRlZ3kuZXhwOiBSZW1vdmUgeGdkYiBiZWZvcmUgdHJ5aW5nIHRoZSBjb3B5LgorCisJKiBnZGIuc3RhYnMvd2llcmQuZGVmOiBUeXBlIGF0dHJpYnV0ZXMgbXVzdCBiZSBwcmVjZWRlZCBieSBudW1iZXI9LgorCSogZ2RiLnN0YWJzL3dpZXJkLmV4cDogUmVtb3ZlIHhmYWlscyBmb3IgdHlwZSBhdHRyaWJ1dGVzLiAgQWxzbworCWRvbid0IGVuZCBjb21tYW5kIHBhc3NlZCB0byBnZGJfdGVzdCB3aXRoIG5ld2xpbmUuCisKKwkqIGdkYi50MTMve01ha2VmaWxlLmluLGdkYm1lLmMsYml0ZmllbGRzLmV4cH06IElmIHdlICNkZWZpbmVkIHRoZQorCXNpZ25lZCBrZXl3b3JkIGF3YXksIGRvbid0IGV4cGVjdCBzaWduZWQgYml0ZmllbGRzIHRvIGJlIHNpZ25lZC4KKworCSogZ2RiLnQxMy9iaXRmaWVsZHMuZXhwIChiaXRmaWVsZCBjb250YWlubWVudCk6IEFjY2VwdCB0aGUgZmllbGRzCisJcHJpbnRpbmcgd2l0aCBvbmx5IGFzIG1hbnkgMSdzIGFzIGFyZSBpbiB0aGUgZmllbGQgYXMgd2VsbCBhcyBwcmludGluZworCXdpdGggMzIgMSdzIChzZWUgY29tbWVudCkuCisKK1NhdCBNYXkgMjkgMTc6NTc6MDEgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGdkYi50MDAvZGVmYXVsdC5leHA6ICBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCSogY29uZmlndXJlLmluIChjb25maWdkaXJzKTogIFJlbW92ZSBnZGIudDMxIHVudGlsIHRoZSBjaGlsbAorCWNvbXBpbGVyIHdvcmtzIGFnYWluLiAgSXQgbm8gbG9uZ2VyIGlzIGFibGUgdG8gZmluZCBjaGlsbHJ0MAorCXNpbmNlIGl0IGlzbid0IGluIGxpYmNoaWxsLmEgYW55bW9yZS4KKwkqIGdkYi5zdGFicy93aWVyZC5leHA6ICBSZXdyaXRlIHRvIHByb3Blcmx5IGhhbmRsaW5nIGEgbWlzc2luZworCXdpZXJkLm8sIG1ha2UgbW9yZSBtb2R1bGFyLgorCSogZ2RiLnN0YWJzL3dpZXJkLmRlZiAoYmFkX25lZzB0eXBlLCBiYWRfbmVnMGNvbnN0KTogIFJlbW92ZQorCXNwdXJpb3VzIG5ld2xpbmVzIHRoYXQgY2F1c2VkIHByb2JsZW1zLgorCitXZWQgTWF5IDI2IDA5OjU3OjE5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNb3ZlIHRlc3Qgd2l0aCBlbnVtcyBhbmQgcGFydGlhbCBzeW1ib2xzIGZyb20gZ2RiLnQwMy9wdHlwZS5leHAKKwl0byBnZGIuc3RhYnMvd2llcmQuZXhwIHNpbmNlIEdDQyBoYXMgd29ya2VkIGFyb3VuZCB0aGUgYnVnLgorCWdkYi5zdGFicy93aWVyZC57ZXhwLGRlZn06IE1hbnkgbmV3IHRlc3RzLgorCisJKiBnZGIudDAwL2RlZmF1bHQuZXhwOiB1cGRhdGUgaW5mbyBsaW5lIGZvciBuZXcgbWVzc2FnZS4KKworCSogZ2RiLnQwMi97d2hhdGlzLmV4cCxnZGJtZS5jfToKKwlUZXN0IHRoYXQgImNoYXIgKiIgZG9lc24ndCBwcmludCBhcyAiY2FkZHJfdCIuCisKK1R1ZSBNYXkgMjUgMTM6Mjg6MjcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGdkYi50MDAvaGVscC5leHA6IFVzZSAuKiBpbiBwbGFjZSBvZiBzb21lIGhlbHAgbWVzc2FnZXMgd2hpY2gKKwlqdXN0IGNoYW5nZWQuCisJZ2RiLnQwMC9kZWZhdWx0LmV4cDogVXBkYXRlICJpbmZvIGZyYW1lIiB0ZXN0IGZvciBuZXcgbWVzc2FnZS4KKwkqIGdkYi5zdGFicy93aWVyZC5leHA6IENoZWNrIGZvciBlb2YsIGRpcmVjdGx5IG9yIHZpYSBnZGJfdGVzdC4KKwlSZW1vdmUgc29tZSB4ZmFpbHMKKworTW9uIE1heSAyNCAwMDoyNDo0NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwMy97Z2RibWUuYyxwdHlwZS5leHB9OgorCUFkZCB0ZXN0cyBmb3IgdHlwZWRlZidkIHN0cnVjdCBhbmQgdW5pb24gd2l0aG91dCB0YWdzLgorCUFsc28gY2hlY2sgIndoYXRpcyIgb24gYSB2YXJpYWJsZSBvZiBhIHR5cGVkZWYnZCBlbnVtIHdpdGhvdXQgYSB0YWcuCisKKwkqIGdkYi50MDAvdGVzdHN0cmF0ZWd5LmV4cDogRm9yIHAgImZvbyIsIHJlbW92ZSBzdW40IFhGQUlMIChzZWUKKwlQUk1TIDE4MjM7IHRoZSBidWcgc3RpbGwgZXhpc3RzIGJ1dCBpc24ndCByZXByb2R1Y2VkIGJ5IHRoaXMgdGVzdAorCWFueW1vcmUpLCBhbmQgcmVtb3ZlIHJzNjAwMCBYRkFJTCAodGhlIGJ1ZyBpcyBmaXhlZCkuCisKKwkqIGdkYi50MDMvcHR5cGUuZXhwOiBDb21tZW50IG91dCBhIGxvdCBvZiB0ZXN0cyB3aGljaCBhcmUgYmFzaWNhbGx5CisJZHVwbGljYXRlZCBmcm9tIHdoYXRpcy5leHAuICBGb3IgdGhvc2UgdGhhdCBhcmUgbGVmdCwgYWNjZXB0CisJImxvbmciLCAibG9uZyBpbnQiLCBvciAiaW50IiBmb3IgbG9uZyB2YXJpYWJsZXMgKHdoYXRpcy5leHAgYWxyZWFkeQorCWhhcyBhbiBYRkFJTCBmb3IgImludCIsIHNvIG5vIG5lZWQgdG8gZmFpbCBpdCBoZXJlKS4KKworCSogZ2RiLnQwMi93aGF0aXMuZXhwLCBnZGIudDEwL2Nyb3NzbG9hZC5leHA6CisJRGVhbCB3aXRoIEdDQydzIG5hbWVzIGZvciB0eXBlcyBub3cgdGhhdCBHREIgdXNlcyB0aGUgY29tcGlsZXIncyBuYW1lcy4KKworCSogZ2RiLnQwMi97TWFrZWZpbGUuaW4sZ2RibWUuYyx3aGF0aXMuZXhwfTogIElmIG5vdCBHQ0MsIGRvIHNvbWUKKwlzZXR1cF94ZmFpbCdzIGZvciBzdW5vczQuICBJZiB3ZSAjZGVmaW5lZCB0aGUgc2lnbmVkIGtleXdvcmQgYXdheSwKKwlkb24ndCBleHBlY3QgR0RCIHRvIGtub3cgdGhhdCBjaGFyIGl0IGlzIHNpZ25lZC4KKworCSogZ2RiLnQwMC90ZXN0c3RyYXRlZ3kuZXhwOiBVcGRhdGUgZm9yIHN5bWJvbGljIHNpZ25hbCBuYW1lcy4KKworU3VuIE1heSAyMyAwODo0NDo1NSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChjb25maWdkaXJzKTogIEFkZCBnZGIudDI0IGZvciBDKysgdGVzdHMgdGhhdAorCXNob3VsZCB3b3JrIG9uIGFueSBzeXN0ZW0sIHJlZ2FyZGxlc3Mgb2YgZGVidWdnaW5nIGZvcm1hdC4KKwkqIGdkYi50MjEvZGVtYW5nbGUuZXhwOiAgTW92ZSB0byBnZGIudDI0LgorCSogZ2RiLnQyNC9kZW1hbmdsZS5leHA6ICBNb3ZlIGZyb20gZ2RiLnQyMS4KKwkqIGdkYi50MjQve01ha2VmaWxlLmluLCBjb25maWd1cmUuaW59OiAgTmV3IGZpbGVzLgorCitUaHUgTWF5IDIwIDE5OjM5OjAzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IERvIGdkYi5zdGFicyBhbmQgQysrIHRlc3RzIG9ubHkgZm9yIHN0YWJzLgorCSogZ2RiLnN0YWJzOiBOZXcgZGlyZWN0b3J5LgorCitUdWUgTWF5IDE4IDIxOjEyOjA5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWcve21pcHMsbmluZCx1ZGksdW5peCx2eH0tZ2RiLmV4cDogTG9vayBmb3IgIlF1aXQgYW55d2F5Lio/IgorCW5vdCBqdXN0ICJRdWl0IGFueXdheT8iLgorCitUdWUgTWF5IDE4IDE3OjEzOjIwIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBnZGIudDIxL2RlbWFuZ2xlLmV4cDogIEFkZCBhIGNvdXBsZSBvZiBuZXcgcGF0dGVybnMuICBFbnN1cmUKKwl0aGF0IGFsbCBzZXR1cF94ZmFpbHMgYXJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGNsZWFyX3hmYWlscy4KKworVHVlIE1heSAxMSAwOToxMDo0NyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL3VuaXgtZ2RiLmV4cCwgZ2RiLnQwMC9lY2hvLmV4cCwgZ2RiLnQwMC9oZWxwLmV4cCwKKwlnZGIudDAwL3Rlc3RzdHJhdGVneS5leHAsIGdkYi50MDAvZ2RidmFycy5leHAsIGdkYi50MDEvcnVuLmV4cCwKKwlnZGIudDAxL3Rlcm0uZXhwLCBnZGIudDAyL3doYXRpcy5leHAsIGdkYi50MDMvcHR5cGUuZXhwLAorCWdkYi50MDQvc2V0dmFyLmV4cCwgZ2RiLnQwNS9leHByLmV4cCwgZ2RiLnQwNi9icmVhay5leHAsCisJZ2RiLnQwNy93YXRjaHBvaW50LmV4cCwgZ2RiLnQwOC9vcGFxdWUuZXhwLCBnZGIudDA5L2NvcmVmaWxlLmV4cCwKKwlnZGIudDEwL2Nyb3NzbG9hZC5leHAsIGdkYi50MTEvbGlzdC5leHAsIGdkYi50MTIvc2NvcGUuZXhwLAorCWdkYi50MTMvYml0ZmllbGRzLmV4cCwgZ2RiLnQxNS9mdW5jYXJncy5leHAsIGdkYi50MTYvcHJpbnRjbWRzLmV4cCwKKwlnZGIudDE3L2NhbGxmdW5jcy5leHAsIGdkYi50MjAvbWlzYy5leHAsIGdkYi50MjAvaW5oZXJpdC5leHAsCisJZ2RiLnQyMC9jbGFzc2VzLmV4cCwgZ2RiLnQyMS9kZW1hbmdsZS5leHAsIGdkYi50MjEvY3BsdXNmdW5jcy5leHAsCisJZ2RiLnQyMi92aXJ0ZnVuYy5leHAsIGdkYi50MjMvdGVtcGxhdGVzLmV4cCwgZ2RiLnQzMC9jaGV4cC5leHAsCisJZ2RiLnQzMS9jaGlsbHZhcnMuZXhwLCBsaWIvZ2RiLmV4cDoKKwlDaGFuZ2UgcGxhY2UgdG8gcmVwb3J0IGJ1Z3MgZnJvbSBidWctZGVqYWdudUBwcmVwLmFpLm1pdC5lZHUgdG8KKwlidWctZ2RiQHByZXAuYWkubWl0LmVkdS4KKworRnJpIE1heSAgNyAwOToxNTozNSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZ2RiLnQxNy9jYWxsZnVuY3MuZXhwIChkb19mdW5jdGlvbl9jYWxscyk6ICBDYWxsIHRfZG91YmxlX3ZhbHVlcworCXdpdGggMC4wLCBub3QgaW50ZWdlciAwLgorCitGcmkgQXByIDMwIDEzOjE3OjI0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBnZGIudDA2L2JyZWFrLmV4cDogVXBkYXRlIGZvciAiS2lsbCB0aGUgcHJvZ3JhbSIgbWVzc2FnZSBjaGFuZ2UuCisKK0ZyaSBBcHIgMzAgMDk6NDI6NTcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChHREJGTEFHUyk6ICBTZXQgdG8gLW54LgorCSogTWFrZWZpbGUuaW4gKHNpdGUuZXhwKTogIFVzZSBHREJGTEFHUy4KKworV2VkIEFwciAyOCAxMzoxOTowNyAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCisKKwkqICovTWFrZWZpbGUuaW4gKENGTEFHUyk6IGFkZCBDRkxBR1MgPSAtZyB0byBhbGwgc3ViZGlyZWN0b3J5CisJICBNYWtlZmlsZXMuCisJICAoY2hlY2spOiBkZXBlbmQgb24ganVzdC1jaGVjay4KKwkgIChqdXN0LWNoZWNrKTogYWRkZWQgc28gdGhhdCB0ZXN0cyBjYW4gYmUgcnVuIHdpdGhvdXQgYSBub29wCisJICBidWlsZCBwYXNzLgorCitGcmkgQXByIDIzIDE4OjEzOjI4IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCVN3aXRjaCB0byB1c2luZyBjb25maWd1cmUncyBjb25maWdkaXJzLgorCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogYWRkIGNvbmZpZ3VyZS5pbiBkZXBlbmRlbmN5LgorCSAgKFNVQkRJUlMpOiByZW1vdmVkIHJlZHVuZGFudCBhc3NpZ25tZW50LgorCSogY29uZmlndXJlLmluOiBzd2l0Y2ggc3ViZGlycyBhc3NpZ25tZW50IHRvIGNvbmZpZ2RpcnMuCisJKiBnZGIudCovY29uZmlndXJlLmluOiBuZXcgZmlsZXMuCisKK1RodSBBcHIgMjIgMDg6Mjc6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBnZGIudDA3L3dhdGNocG9pbnQuZXhwOiBSZW1vdmVkIGEyOWsgZXhwZWN0ZWQgZmFpbHVyZSB3aGljaCBub3cKKwl3b3Jrcy4KKworVHVlIEFwciAyMCAxMzozODo0MCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZ2RiLnt0MjAsdDIxLHQyMix0MjN9L01ha2VmaWxlLmluOiAgVXNlICQoc3JjZGlyKSB0byBhdm9pZCAkPAorCWluIGV4cGxpY2l0IHJ1bGVzLiAgQXBwYXJlbnRseSB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgc29tZSBtYWtlcy4KKworTW9uIEFwciAxOSAwMTo1NDo1MyAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKKworCSogZ2RiLnQzMS9NYWtlZmlsZS5pbjogIFVzZSAkKHNyY2Rpcikgd2hlbiBhdm9pZGluZyAkPCwgc2lnaC4KKworRnJpIEFwciAxNiAwOTozMzo0NiAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNvbmZpZy91bml4LWdkYi5leHA6ICBBZGQgYmFjayBtaXNzaW5nIHJldHVybiAwIHdoaWNoIG15c3RlcmlvdXNseQorCWRpc2FwcGVhcmVkLgorCitUaHUgQXByIDE1IDAyOjI4OjI0IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjYWNvcGhvbnkuY3lnbnVzLmNvbSkKKworCSogZ2RiLnQzMS9NYWtlZmlsZS5pbjogIEF2b2lkICQ8IGluIGV4cGxpY2l0IHJ1bGUuCisKK1dlZCBBcHIgMTQgMTY6Mzg6NDcgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGdkYi50MDcvd2F0Y2hwb2ludC5leHA6ICBSZW1vdmUgc2V0dXBfeGZhaWwgZm9yIGk0ODYKKwl3YXRjaHBvaW50IHByb2JsZW0gdGhhdCBpcyBub3cgZml4ZWQuCisJKiBnZGIudDMwL2NoZXhwLmV4cDogIFJlbW92ZSBzZXR1cF94ZmFpbCBmb3IgcHJpbnRpbmcKKwl1bmluaXRpYWxpemVkIGNvbnZlbmllbmNlIHZhcmlhYmxlcy4KKwkqIGdkYi50MzEvY2hpbGx2YXJzLmV4cDogIEZpeCBleHBlY3RlZCBwYXR0ZXJucyBmb3IgcHJpbnRpbmcKKwlzdHJ1Y3R1cmVzLgorCitXZWQgQXByIDE0IDEyOjU1OjU4IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogZ2RiLnQwMC9oZWxwLmV4cDogQ29tcGVuc2F0ZSBmb3IgYnVnIGluIG1pcHMtKi11bHRyaXgqIE9TCisJd2hpY2ggY2F1c2VzIGV4cGVjdCB0byBnZXQgb3V0IG9mIHN5bmMgd2l0aCBnZGIgb24gbG9uZyBvdXRwdXQKKwlmcm9tIGhlbHAgc2V0LgorCSogZ2RiLnQwOS9jb3JlZmlsZS5leHA6IE1ha2UgZXhwZWN0ZWQgcGF0dGVybiBmb3IgY29yZSBmaWxlCisJZmFpbGluZyBzaWduYWwgYW5kIGZyYW1lIG91dHB1dCBmb3JtYXQgbGVzcyBzdW4gc3BlY2lmaWMuCisKK1R1ZSBBcHIgMTMgMjM6MTg6MDcgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCisKKwkqIGdkYi50MzEvY2hpbGx2YXJzLmV4cDogIEFkZCBhbmQgcmVtb3ZlIGluaXRpYWwgZHVtbXkKKwlicmVha3BvaW50LCBzbyB0aGF0IHN5bWJvbCB0YWJsZSBpcyBmb3JjZWQgaW4uCisJKE5lZWRlZCBhdCBsZWFzdCBvbiBTdW5vczQsIHRob3VnaCBpdCBzZWVtcyBub3QgU1ZSNC4pCisJKiBnZGIudDMxL2NoaWxsdmFycy5leHA6ICBVcGRhdGUgZm9yIGNoYW5nZWQgb3V0cHV0IGZvcm1hdC4KKworU3VuIEFwciAxMSAxNzoyMTo0NSAxOTkzICBSb2IgU2F2b3llICAocm9iIGF0IGRhcmtzdGFyLmN5Z251cy5jb20pCisKKyAgICAgICAgKiBjb25maWcvdW5peC1nZGIuZXhwOiBHcmFjZWZ1bGx5IGV4aXRzIGlmICRHREIgaXMgYSBib2d1cyBwYXRoLgorCitXZWQgQXByICA3IDIxOjI4OjIxIDE5OTMgIFJvYiBTYXZveWUgIChyb2JAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IEFkZGVkIC0tc3JjZGlyIHdoZW4gaW52b2tpbmcgcnVudGVzdCwgcmVtb3ZlZCB0aGUKKwluZWVkIGZvciBhIGxvY2FsIGNvbmZpZyBmaWxlLiAob3B0aW9uYWwgbm93KQorCitXZWQgQXByICA3IDE0OjEzOjQxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBnZGIudDIxL2RlbWFuZ2xlLmV4cDogIE9ubHkgY291bnQgcmVhbCBmYWlscyAobm90IHhmYWlscykgZm9yCisJZmFpbHVyZSBjb3VudCB1c2VkIHRvIGZvcmNlIGVhcmx5IHRlcm1pbmF0aW9uLiAgQWRkIHNvbWUgbW9yZQorCWV4cGVjdGVkIGZhaWx1cmVzIGZvciBnbnUgc3R5bGUgZGVtYW5nbGluZy4KKworVGh1IEFwciAgMSAwOTo1MDozMCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIE1ha2VmaWxlLmluIChDWFhGTEFHUyk6IFJlbW92ZSAtTy4gSXQgY2F1c2VkIHRoZSBkZWJ1ZyBpbmZvIGZvciB0aGUKKwlwbWkgdmFyaWFibGUgZnJvbSBnZGIudDIwL2dkYm1lIHRvIGdldCBvcHRpbWl6ZWQgYXdheS4KKwkqIGdkYi50MDAvdGVzdHN0cmF0ZWd5LmV4cDogQWRkZWQgZXhwZWN0ZWQgZmFpbHVyZSBmb3IgbWlwcy0qLSouCisJQ2hlY2sgZm9yIHdyaXR0ZW4gY29yZWZpbGUgdXBvbiB0aW1lb3V0IF9hbmRfIGVvZi4KKworVHVlIE1hciAzMCAwOTo1ODoxNiAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNvbmZpZy91bml4LWdkYi5leHA6ICBBZGQgbWlzc2luZyByZXR1cm4gMC4KKworVHVlIE1hciAzMCAwODozNDoyNSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGdkYi50MTYvcHJpbnRjbWRzLmV4cDogIFJlbW92ZSBtaXNwbGFjZWQgeGZhaWwgdGhhdCBjYXVzZWQgYW4gZWFybHkKKwl0ZXN0IHRlcm1pbmF0aW9uLgorCitNb24gTWFyIDI5IDE3OjM3OjI1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKHN1YmRpcnMpOiAgUHV0IGJhY2sgZ2RiLnQxNyB3aGljaCBteXN0ZXJpb3VzbHkKKwlkaXNhcHBlYXJlZC4KKworVGh1IE1hciAyNSAyMTowNToxNiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZ2RiLnQxMC9jcm9zc2xvYWQuZXhwOiAgRGlzYWJsZSB0aGUgaTg2MC1lbGYgdGVzdCB1bnRpbCBzdWNoCisJdGltZSBhcyBpODYwIHN1cHBvcnQgd29ya3MuCisKKwkqIGdkYi50MTUvZnVuY2FyZ3MuZXhwOiAgRml4IGV4cGVjdGVkIG91dHB1dHMgdG8gaW5jbHVkZSAKKwkiYmFja3RyYWNlIDEwMFxyIiByYXRoZXIgdGhhbiBqdXN0ICJiYWNrdHJhY2VcciIsIHRvIG1hdGNoIGxhc3QKKwljaGFuZ2UuCisKK1RodSBNYXIgMjUgMTI6MTQ6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb25maWcvdWRpLWdkYi5leHAgKGdkYl9leGl0KTogUmVtb3ZlIGNsb3NlIGNvbW1hbmQuCisJKGdkYl90YXJnZXRfdWRpKTogTmV3IHByb2NlZHVyZSB0byBzZXQgdGhlIFVESSB0YXJnZXQuCisJKGdkYl9zdGFydCk6IERvbid0IHJlbW92ZSAqX3NvYyBmaWxlcy4gIFVzZSBnZGJfdGFyZ2V0X3VkaS4KKwkqIGdkYi50MDAvZGVmYXVsdC5leHA6IEFkZGVkIGV4cGVjdGVkIGZhaWx1cmVzIGZvciBhMjlrLSotdWRpLgorCUFkZGVkIHdhaXRzIGZvciBwcm9tcHRzIGFmdGVyIHNldmVyYWwgcXVlc3Rpb24gcmVzcG9uc2VzLiAgQWRkZWQKKwlzb21lIG1vcmUgcmVzcG9uc2VzIHVzZWQgYnkgYTI5ay1hbWQtdWRpLWdkYi4KKwkqIGdkYi50MDEvcnVuLmV4cCwgZ2RiLnQwNi9icmVhay5leHA6IEFkZGVkIGEyOWstKi11ZGkgc3VwcG9ydDoKKwlwYXNzIGRpZmZlcmVudCBhcmd1bWVudHMsIHJlc3RhcnQgVURJIGNvbm5lY3Rpb24gYWZ0ZXIgcHJvZ3JhbQorCWNvbXBsZXRpb24uCisJKiBnZGIudDAyL3doYXRpcy5leHAsIGdkYi50MDMvcHR5cGUuZXhwLCBnZGIudDA3L3dhdGNocG9pbnQuZXhwLAorCWdkYi50MDgvb3BhcXVlLmV4cCwgZ2RiLnQxMS9saXN0LmV4cCwgZ2RiLnQxMi9zY29wZS5leHAsCisJZ2RiLnQxNS9mdW5jYXJncy5leHAsIGdkYi50MTYvcHJpbnRjbWRzLmV4cCwgZ2RiLnQyMC9taXNjLmV4cCwKKwlnZGIudDIxL2NwbHVzZnVuY3MuZXhwOiBBZGRlZCBleHBlY3RlZCBmYWlsdXJlcyBmb3IgYTI5ay0qLSouCisJKiBnZGIudDA0L3NldHZhci5leHAsIGdkYi50MDUvZXhwci5leHAsIGdkYi50MDcvd2F0Y2hwb2ludC5leHAsCisJZ2RiLnQwOC9vcGFxdWUuZXhwLCBnZGIudDEyL3Njb3BlLmV4cCwgZ2RiLnQxMy9iaXRmaWVsZHMuZXhwLAorCWdkYi50MTUvZnVuY2FyZ3MuZXhwLCBnZGIudDE2L3ByaW50Y21kcy5leHAsCisJZ2RiLnQxNy9jYWxsZnVuY3MuZXhwLCBnZGIudDIwL2NsYXNzZXMuZXhwLCBnZGIudDIwL2luaGVyaXQuZXhwLAorCWdkYi50MjAvbWlzYy5leHAsIGdkYi50MjIvdmlydGZ1bmNzLmV4cDogUmVzdGFydCBVREkgY29ubmVjdGlvbgorCWFmdGVyIHByb2dyYW0gY29tcGxldGlvbi4KKwkqIGdkYi50MTAvY3Jvc3Nsb2FkLmV4cDogRG9lcyBub3Qgd29yayBmb3IgYTI5ay0qLSosIHNpbmNlIEJGRCBpcworCWNvbXBpbGVkIHdpdGggYSBTRUxFQ1RfVkVDUyBzZXR0aW5nLgorCSogZ2RiLnQxNS9mdW5jYXJncy5leHA6IFVzZSBhcmd1bWVudCB0byBiYWNrdHJhY2UgdG8gcHJldmVudAorCWluZmluaXRlIHJlY3Vyc2lvbi4KKworCSogZ2RiLnQyMC9jbGFzc2VzLmV4cCwgZ2RiLnQyMC9pbmhlcml0LmV4cCwgZ2RiLnQyMi92aXJ0ZnVuY3MuZXhwOgorCUFkZGVkIGNoZWNrcyBmb3IgQ09GRiByZXN1bHRzLCBhbmQgbWFkZSB0aGVtIGV4cGVjdGVkIGZhaWx1cmVzIGZvcgorCWFsbCB0YXJnZXRzLiAgSXQgd291bGQgYmUgYmV0dGVyIHRvIG1ha2UgdGhlbSBleHBlY3RlZCBmYWlsdXJlcworCWZvciBDT0ZGIHRhcmdldHMgb25seS4KKworV2VkIE1hciAyNCAxNDo0MzozOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGFkZCBudWxsIGR2aSB0YXJnZXQsIGRvbid0IGJvdGhlciB0byByZWN1cnNlCisJdGhyb3VnaCB0ZXN0IGRpcmVjdG9yaWVzIGZvciBpbmZvIGFuZCBpbnN0YWxsLWluZm87IHJlbmFtZQorCSQoZGF0YWRpcikgdG8gYmUgZGVqYWdudSBpbnN0ZWFkIG9mIGRlamEtZ251CisKK1dlZCBNYXIgMjQgMDk6NDg6MDMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGdkYi50MzEvZ2RibWUuY2g6ICBSZS1lbmFibGUgY29kZSB0aGF0IHByZXZpb3VzbHkgY2F1c2VkCisJY29tcGlsZXIgdG8gY29yZWR1bXAuCisJKiBnZGIudDMxL2NoaWxsdmFycy5leHA6ICBSZS1lbmFibGUgdGVzdHMgdGhhdCBkZXBlbmQgb24gdGhhdAorCWNvZGUuCisKK1R1ZSBNYXIgMjMgMDg6NTM6NDIgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGdkYi50MzEvZ2RibWUuY2g6ICBDb21tZW50IG91dCBjb2RlIHRoYXQgY2F1c2VzIGNoaWxsIGNvbXBpbGVyCisJY29yZWR1bXAuCisJKiBnZGIudDMxL2NoaWxsdmFycy5leHA6ICBDb21tZW50IG91dCB0ZXN0cyB0aGF0IGRlcGVuZCBvbiB0aGF0CisJY29kZS4KKworU3VuIE1hciAyMSAxNzo1Njo0NyAxOTkzICBSb2IgU2F2b3llICAocm9iIGF0IGRhcmtzdGFyLmN5Z251cy5jb20pCisKKwkqIGdkYi50MDMvcHR5cGUuZXhwOiB0ZXN0cyBmb3IgcmV0dXJuIGNvZGUgZnJvbSBnZGJfdGVzdC4KKwkqIGdkYi50MDAvdGVzdHN0cmF0ZWd5LmV4cDogVXNlcyB3aGljaCBwcm9jIHJhdGhlciB0aGFuIHNwYXduaW5nCisJd2hpY2ggaW4gYSBzaGVsbC4gRGVsZXRlcyB4Z2RiIHdoZW4gZG9uZS4KKwkqIGNvbmZpZy91bml4LWdkYi5leHA6IFdvbid0IHRyeSB0byBzcGF3biAkR0RCIHVubGVzcyBpdCBleGlzdHMuCisJVGVzdHMgdGhlIHJldHVybiBmcm9tIHRoZSAic2V0IGhlaWdodCIgb3IgInNldCB3aWR0aCIgY29tbWFuZHMuCisJQWRkZWQgYSBmZXcgcmV0dXJuIGNvZGVzIHdoZXJlIG5lZWRlZC4KKworV2VkIE1hciAxNyAxMTozMTowMSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKFNVQkRJUlMpOiAgQWRkIGdkYi50MTcuCisJKiBjb25maWd1cmUuaW4gKHN1YmRpcnMpOiAgQWRkIGdkYi50MTcuCisJKiBnZGIudDE3L3tNYWtlZmlsZS5pbiwgY2FsbGZ1bmNzLmV4cCwgZ2RibWUuY306ICBOZXcgdGVzdAorCWZpbGVzIHRvIHRlc3QgZ2RiJ3MgY2FsbGluZyBvZiBmdW5jdGlvbnMgaW4gdGhlIGluZmVyaW9yIHdpdGgKKwl0aGUgY29ycmVjdCBhcmd1bWVudHMgYW5kIGdkYidzIGFiaWxpdHkgdG8gcmV0cmlldmUgYW55CisJcmVzdWx0IHJldHVybmVkLgorCitUdWUgTWFyIDE2IDE1OjM3OjExIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb25maWcvdW5peC1nZGIuZXhwIChnZGJfZXhpdCk6ICBSZW1vdmUgY2xvc2UgY29tbWFuZHMgdGhhdAorCW1heSBiZSBjYWxsZWQgYWZ0ZXIgZ2RiIGdvZXMgYXdheS4gIFByZXZpb3VzIHZlcnNpb25zIG9mIGV4cGVjdAorCW5lZWRlZCB0aGVzZSB0byBhdm9pZCBmaWxlIGRlc2NyaXB0b3IgbGVha3MsIGJ1dCB0aGV5IGNhdXNlCisJZXJyb3JzIHdpdGggdGhlIGN1cnJlbnQgcmV2aXNpb24gb2YgZXhwZWN0LgorCSogZ2RiLnQwMC9nZGJ2YXJzLmV4cDogIFVzZSAtcmUgb24gZXhwZWN0ZWQgb3V0cHV0IGFmdGVyCisJc2V0dGluZyBzZXZlbmJpdC1zdHJpbmdzLgorCSogZ2RiLnQwNC9zZXR2YXIuZXhwLCBnZGIudDEzL2JpdGZpZWxkcy5leHA6ICBNYWtlIGNvbW1hbmRzCisJdG8gc2V0IHNldmVuYml0LXN0cmluZ3MgY29uc2lzdGVudCBhY3Jvc3MgdGVzdHMuCisJZ2RiLnQzMC9jaGV4cC5leHAsIGdkYi50MzEvY2hpbGx2YXJzLmV4cDogIE1ha2UgY29tbWFuZHMgdG8KKwlzZXQgc2V2ZW5iaXQtc3RyaW5ncyBjb25zaXN0ZW50IGFjcm9zcyB0ZXN0cy4KKworRnJpIE1hciAxMiAwODo0NzoyMCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZ2RiLnQyMS9kZW1hbmdsZS5leHAgKHByb2MgZGVtYW5nbGUpOiAgQWRqdXN0IHF1b3RlcyBpbiBhbgorCWV4cGVjdGVkIG91dHB1dCB0byBtYXRjaCBjdXJyZW50ICJleHBlY3QiIGV4cGVjdGF0aW9ucy4KKworV2VkIE1hciAxMCAxODowMTo0OSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwMC9kZWZhdWx0LmV4cDogIENoYW5nZSBleHBlY3RlZCBvdXRwdXQgZm9yIGRlZmF1bHQgInNvdXJjZSIKKwljb21tYW5kLCB0byBtYXRjaCBuZXcgZ2RiIGJlaGF2aW9yIHdoaWNoIHJlcXVpcmVzIGEgZmlsZW5hbWUgdG8KKwlzb3VyY2UuCisKK1R1ZSBNYXIgIDkgMTE6MDA6NTYgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGdkYi50MDcvd2F0Y2hwb2ludC5leHAgKHRlc3Rfc2ltcGxlX3dhdGNocG9pbnQpOiAgU2V0IHVwCisJZXhwZWN0ZWQgZmFpbCBmb3IgaTQ4Ni0qLSogdGhhdCBtaXNzZXMgdGhlIG1hcmtlcjIgZnVuY3Rpb24uCisJKiBnZGIudDEwL2Nyb3NzbG9hZC5leHAgKGJmZGRlZmF1bHQpOiAgQWxsb3cgc3VjY2Vzc2Z1bAorCXJlY29nbml0aW9uIG9mIGEgZm9ybWF0IHRvIHBhc3MgZXZlbiBpZiBubyBzeW1ib2xzIGFyZSBmb3VuZC4KKwlFeHBsaWNpdGx5IGNhdGNoIGZhaWx1cmVzIHdoZXJlIHRoZSBmb3JtYXQgaXMgbm90IHJlY29nbml6ZWQKKwlvciBpcyBhbWJpZ3VvdXMsIGFuZCBhZGQgdGhlIHJlYXNvbiB0byB0aGUgZmFpbCBtZXNzYWdlLgorCSogZ2RiLnQxMC9jcm9zc2xvYWQuZXhwIChiZmRleHBsaWNpdCk6ICBDYXRjaCBmYWlsdXJlIHdoZXJlCisJdGhlIGNhdXNlIGlzIGFuZCBpbnZhbGlkIHRhcmdldCBhbmQgYWRkIHJlYXNvbiB0byBmYWlsdXJlIG1lc3NhZ2UuCisJKiBnZGIudDEwL2Nyb3NzbG9hZC5leHA6ICBGaXggYmZkIHRhcmdldCBuYW1lcyBmb3IgZWxmMzItbTY4aywKKwllbGYzMi1pMzg2LCBlbGYzMi1zcGFyYywgYW5kIGVsZjMyLWk4NjAuCisJKiBnZGIudDEyL3Njb3BlLmV4cCAodGVzdF9hdF9tYWluLCB0ZXN0X2F0X2ZvbywgdGVzdF9hdF9iYXIpOgorCVNldCB1cCBleHBlY3RlZCBmYWlsdXJlIGZvciAnZmlsZW5hbWUnOjp2YXJpYWJsZSBzY29wZSByZXNvbHV0aW9uLAorCXdoaWNoIGlzIG5vdyBhcHBhcmVudGx5IGJyb2tlbiBvbiBhbGwgdGFyZ2V0cy4KKwkqIGdkYi50MjAvY2xhc3Nlcy5leHAsIGdkYi50MjAvaW5oZXJpdC5leHAsIGdkYi50MjAvbWlzYy5leHAsCisJZ2RiLnQyMS9jcGx1c2Z1bmNzLmV4cCwgZ2RiLnQyMi92aXJ0ZnVuYy5leHAsCisJZ2RiLnQyMy90ZW1wbGF0ZXMuZXhwOiAgIENoYW5nZSBmYWlsdXJlIGZvciBtaXNzaW5nIGJpbmZpbGUgaW50bworCWp1c3QgYSB3YXJuaW5nLgorCWdkYi50MjEvZGVtYW5nbGUuZXhwOiAgQ2hhbmdlIGFsbCBjZnJvbnQgcmVmZXJlbmNlcyB0byAnYXJtJworCXJlZmVyZW5jZXMuCisKK01vbiBNYXIgIDggMTk6MjA6MjggMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGdkYi50MDAvZGVmYXVsdC5leHA6ICBBZGQgZXhwZWN0ZWQgb3V0cHV0IGZvciBkZWZhdWx0ICJzb3VyY2UiCisJY29tbWFuZCwgdG8gbWF0Y2ggbmV3IGdkYiBiZWhhdmlvci4KKwkqIGdkYi50MDkvY29yZWZpbGUuZXhwOiAgVXNlIEdEQkZMQUdTIHdoZW4gc3Bhd25pbmcgR0RCLgorCitTdW4gTWFyICA3IDE1OjE0OjA5IDE5OTMgIFJvYiBTYXZveWUgIChyb2JAY3lnbnVzLmNvbSkKKworCSogY29uZmlnLyotZ2RiLmV4cDogcmV0dXJucyBhbiBlcnJvciwgcmF0aGVyIHRoYW4gZXhpdGluZyBvbgorCWludGVybmFsIGVycm9ycy4KKworVHVlIE1hciAgMiAxODowOTozMiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwMy9nZGJtZS5jOiAgQWRkIHBvaW50ZXIgdG8gc3RydWN0IHZhcmlhYmxlLgorCSogZ2RiLnQwMy9wdHlwZS5leHA6ICBUZXN0IGVxdWl2YWxlbmNlIG9mICcuJyBhbmQgJy0+JyBmb3IKKwlyZWZlcmVuY2luZyBzdHJ1Y3QgbWVtYmVycy4KKworVGh1IEZlYiAyNSAxMDozOTowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAobWlwcy1pZHQtZWNvZmYpOiBOZXcgdGFyZ2V0LgorCSogY29uZmlnL21pcHMtZ2RiLmV4cDogTmV3IGZpbGUgZm9yIHJlbW90ZSBib2FyZCB1c2luZyBNSVBTIHJlbW90ZQorCWRlYnVnZ2luZyBwcm90b2NvbC4KKworCSogUmVkaWQgY29uZmlndXJhdGlvbiBzY2hlbWUuICBSZW1vdmVkIGdkYi50Ki9jb25maWd1cmUuaW4uCisJUmVuYW1lZCBnZGIudCovaW4tZ2RibWUqIHRvIGdkYi50Ki9nZGJtZSouICBDaGFuZ2VkIHRvIHVzZSBDQywgQ1hYCisJaW5zdGVhZCBvZiBDQ19GT1JfVEFSR0VULCBDWFhfRk9SX1RBUkdFVC4gIEFkZGVkIG1vc3RseWNsZWFuIGFuZAorCWRpc3RjbGVhbiB0YXJnZXRzLiAgQnVpbHQgZXhlY3V0YWJsZXMgdmlhIC5vIGZpbGVzLiAgQWRqdXN0ZWQKKwl0ZXN0cyB0byBhY2NvdW50IGZvciBzb3VyY2UgZmlsZXMgaW4gJChzcmNkaXIpIHJhdGhlciB0aGFuCisJJChvYmpkaXIpLgorCSogbGliL2dkYi5leHAgKHJ1bnRvKTogRG9uJ3QgZXhwZWN0ICgpIGFmdGVyIHRoZSBmdW5jdGlvbiBuYW1lLAorCWJlY2F1c2UgaXQgbWF5IGhhdmUgYXJndW1lbnRzLgorCitXZWQgRmViIDI0IDA4OjA1OjM4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKKworCSogZ2RiLnQwMC9kZWZhdWx0LmV4cCwgZ2RiLnQwMS9ydW4uZXhwLCBnZGIudDAyL3doYXRpcy5leHAsCisJZ2RiLnQwMy9wdHlwZS5leHAsIGdkYi50MDYvYnJlYWsuZXhwLCBnZGIudDEyL3Njb3BlLmV4cDogQWRkZWQKKwlleHBlY3RlZCBmYWlsdXJlcyBmb3IgbWlwcy1pZHQtKiBhbmQgbWlwcy1zZ2ktKi4KKwkqIGdkYi50MDAvZGVmYXVsdC5leHAgKGF0dGFjaCk6IEtpbGwgcHJvY2VzcyBpZiByZXF1ZXN0ZWQuCisJKiBnZGIudDAwL2hlbHAuZXhwIChoZWxwIHRhcmdldCBjb3JlLCBoZWxwIHRhcmdldCk6IEFjY2VwdCBhIGdkYgorCXRoYXQgZG9lcyBub3QgcmVhZCBjb3JlIGZpbGVzLgorCSogZ2RiLnQwMS9ydW4uZXhwOiBSZW1vdmVkIGNoZWNrcyBmb3IgZXhpdCBzdGF0dXMgY29kZS4KKwkqIGdkYi50MDMvaW4tZ2RibWUuYzogTWFrZSBleHBsaWNpdCBjYWxsIHRvIG1hbGxvYyB0byBlbnN1cmUgdGhhdAorCWl0IGlzIGxpbmtlZCBpbi4KKwkqIGdkYi50MDMvcHR5cGUuZXhwOiBJbmNyZWFzZSB0aW1lb3V0IHdoZW4gY2FsbGluZyBtYWxsb2MuCisJKiBnZGIudDA0L3NldHZhci5leHAsIGdkYi50MDUvZXhwci5leHA6IFVzZSBydW50byBmdW5jdGlvbiB3aGVyZQorCWFwcHJvcHJpYXRlLCByYXRoZXIgdGhhbiBkb2luZyBpdCBieSBoYW5kLgorCSogZ2RiLnQwNy93YXRjaHBvaW50LmV4cDogSWYgbWlwcy1pZHQtKiwgcmVsb2FkIGZpbGUgYWZ0ZXIgZmlyc3QKKwlleGVjdXRpb24uCisJKiBnZGIudDEwL2Nyb3NzbG9hZC5leHA6IEtpbGwgZXhpc3RpbmcgcHJvZ3JhbSBpZiBuZWVkZWQuCisJKiBnZGIudDE1L2Z1bmNhcmdzLmV4cDogVXNlIGRlbGV0ZV9icmVha3BvaW50cyBmdW5jdGlvbiB3aGVyZQorCWFwcHJvcHJpYXRlLCByYXRoZXIgdGhhbiBkb2luZyBpdCBieSBoYW5kLiAgQWx3YXlzIGluY3JlYXNlCisJdGltZW91dCBmb3IgdGhpcyB0ZXN0LCBub3QganVzdCBmb3IgVnhXb3Jrcy4KKworV2VkIEZlYiAyNCAwODowMzozOCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogZ2RiLnQzMS9jaGlsbHZhcnMuZXhwICh0ZXN0X3N0cnVjdHMpOiAgTmV3IHByb2MgdG8gdGVzdCBwcmludGluZworCW9mIENoaWxsIFNUUlVDVCB0eXBlcyBhbmQgU1RSVUNUIHZhbHVlcy4KKwkqIGdkYi50MzEvY2hpbGx2YXJzLmV4cCAodGVzdF9zdHJpbmdzKTogIEV4cGVjdCAiQ0hBUiIgbm93LCByYXRoZXIKKwl0aGFuICJjaGFyIi4KKwkqIGdkYi50MzEvaW4tZ2RibWUuY2ggKHNpbXBsZV9zdHJ1Y3QsIG5lc3RlZF9zdHJ1Y3QsIHN0cnVjdDEsCisJc3RydWN0Mik6ICBOZXcgc3RydWN0IGRlZmluaXRpb25zIGFuZCBpbml0aWFsaXphdGlvbnMgdG8gdGVzdCAKKwlzaW1wbGUgQ2hpbGwgU1RSVUNUIHR5cGVzLgorCitUdWUgRmViIDIzIDExOjU1OjA2IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBnZGIudDAwL3Rlc3RzdHJhdGVneS5leHA6ICBUcmFjayByZXZlcnNpb24gaW4gZ2RiIHRvIG5vdCBwcmludAorCXRoZSBudWxsIGJ5dGUgYXQgdGhlIGVuZCBvZiBzdHJpbmdzLgorCSogZ2RiLnQwMC9kZWZhdWx0LmV4cDogIE1ha2Ugc2hvdyB2ZXJzaW9uIGluc2Vuc2l0aXZlIHRvIGNvcHlyaWdodAorCWRhdGUuCisJKiBnZGIudDE2L2luLWdkYm1lLmMgKGN0YWJsZTEsIGN0YWJsZTIpOiAgTWFrZSBleHBsaWNpdGx5IHVuc2lnbmVkCisJdG8gYXZvaWQgZGVwZW5kZW5jaWVzIG9uIHRhcmdldCBjaGFyIHNpZ25lZG5lc3MuCisJKiBnZGIudDE2L3ByaW50Y21kcy5leHA6ICBVcGRhdGUgZXhwZWN0ZWQgcmVzdWx0cyBmb3IgZXhwbGljaXRseQorCXVuc2lnbmVkIGNoYXIuCisJKiBnZGIudDE2L3ByaW50Y21kcy5leHA6ICBSZW1vdmUgc2V0dXBfeGZhaWxzIGZvciBpOTYwIHRoYXQgc2hvdWxkCisJbm93IHdvcmsuCisJKiBnZGIudDIxL2RlbWFuZ2xlLmV4cDogIEFkZCBtYW55IG1vcmUgcGF0dGVybnMgZm9yIHRlbXBsYXRlCisJZGVtYW5nbGluZywgbW9zdCBvZiB0aGVtIGJlaW5nIGV4cGVjdGVkIGZhaWx1cmVzLgorCSogZ2RiLnQyMS9kZW1hbmdsZS5leHAgKHByb2MgZGVtYW5nbGUpOiAgUXVvdGUgdGhlIGRlbWFuZ2xlZAorCXN0cmluZyB3ZSBhcmUgbWF0Y2hpbmcgZm9yLCB0byBtYXRjaCBvbiB0aGUgd2hvbGUgc3RyaW5nLgorCSogZ2RiLnQyMS9kZW1hbmdsZS5leHA6ICBBZGQgbWFueSBuZXcgdGVzdCBzdHJpbmdzIHRvIGRlbWFuZ2xlLAorCWFuZCBmaXggYSB3aG9sZSBidW5jaCB0aGF0IGhhZCBpbmNvcnJlY3QgZXhwZWN0ZWQgb3V0cHV0IGJ1dCB3ZXJlCisJcGFzc2luZyBhbnl3YXkgYmVjYXVzZSBvZiB0aGUgYnVnIGluICJwcm9jIGRlbWFuZ2xlIi4KKwkqIGdkYi50MzEvY2hpbGx2YXJzLmV4cDogIFJlbW92ZSBzZXR1cF94ZmFpbCBmb3IgcHJpbnRpbmcgc3RyaW5nCisJdHlwZS4KKwkqIGdkYi50MzEvaW4tZ2RibWUuY2g6ICBVbmNvbW1lbnQgc3RyaW5nNCwgbm93IGNvbXBpbGVzLgorCitNb24gRmViIDIyIDA3OjU0OjAzIDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCisKKyAgICAgICAgKiBnZGIvdGVzdHN1aXRlOiBtYWRlIG1vZGlmaWNhdGlvbnMgdG8gdGVzdGNhc2VzLCBldGMuLCB0byBhbGxvdworICAgICAgICB0aGVtIHRvIHdvcmsgcHJvcGVybHkgIGdpdmVuIHRoZSByZW9yZ2FuaXphdGlvbiBvZiBkZWphLWdudSBhbmQgdGhlCisgICAgICAgIHJlbG9jYXRpb24gb2YgdGhlIHRlc3RjYXNlcyBmcm9tIGRlamEtZ251IHRvIGEgInRvb2wiIHN1YmRpcmVjdG9yeS4KKworU3VuIEZlYiAyMSAxMDo1NTo1NSAxOTkzICBNaWtlIFdlcm5lciAgKG10d0Bwb3NlaWRvbi5jeWdudXMuY29tKQorCisJKiBnZGIvdGVzdHN1aXRlOiBJbml0aWFsIGNyZWF0aW9uIG9mIGdkYi90ZXN0c3VpdGUuCisJTWlncmF0ZWQgZGVqYWdudSB0ZXN0Y2FzZXMgYW5kIHN1cHBvcnQgZmlsZXMgZm9yIHRlc3Rpbmcgbm0gdG8KKwlnZGIvdGVzdHN1aXRlIGZyb20gZGVqYS1nbnUuICBUaGVzZSBmaWxlcyB3ZXJlIG1vdmVkICJhcyBpcyIKKwl3aXRoIG5vIG1vZGlmaWNhdGlvbnMuICBUaGlzIG1pZ3JhdGlvbiBpcyBwYXJ0IG9mIGEgbWFqb3Igb3ZlcmhhdWwKKwlvZiBkZWphZ251LiAgVGhlIG1vZGlmaWNhdGlvbnMgdG8gdGhlc2UgdGVzdGNhc2VzLCBldGMuLCB3aGljaAorCXdpbGwgYWxsb3cgdGhlbSB0byB3b3JrIHdpdGggdGhlIG5ldyB2ZXJzaW9uIG9mIGRlamFnbnUgd2lsbCBiZQorCW1hZGUgaW4gYSBmdXR1cmUgdXBkYXRlLgorDAorTG9jYWwgVmFyaWFibGVzOgorbW9kZTogaW5kZW50ZWQtdGV4dAorbGVmdC1tYXJnaW46IDgKK2ZpbGwtY29sdW1uOiA3NAordmVyc2lvbi1jb250cm9sOiBuZXZlcgorRW5kOgpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9NYWtlZmlsZS5pbiBiL2dkYi90ZXN0c3VpdGUvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2MzQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxODcgQEAKKyMgTWFrZWZpbGUgZm9yIHJlZ3Jlc3Npb24gdGVzdGluZyB0aGUgR05VIGRlYnVnZ2VyLgorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisjIEdEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCitWUEFUSCA9IEBzcmNkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorCitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorYnVpbGRfY2Fub25pY2FsID0gQGJ1aWxkQAoraG9zdF9jYW5vbmljYWwgPSBAaG9zdEAKK3RhcmdldF9jYW5vbmljYWwgPSBAdGFyZ2V0QAordGFyZ2V0X2NwdSA9IEBnZGJfdGFyZ2V0X2NwdUAKKworU0hFTEwgPSBAU0hFTExACitTVUJESVJTID0gQHN1YmRpcnNACitSUEFUSF9FTlZWQVIgPSBAUlBBVEhfRU5WVkFSQAorCitFWFBFQ1QgPSBgaWYgWyAtZiAkJHtyb290bWV9Ly4uLy4uL2V4cGVjdC9leHBlY3QgXSA7IHRoZW4gXAorICAgICAgICAgIGVjaG8gJCR7cm9vdG1lfS8uLi8uLi9leHBlY3QvZXhwZWN0IDsgXAorICAgICAgICAgIGVsc2UgZWNobyBleHBlY3QgOyBmaWAKKworUlVOVEVTVCA9ICQoUlVOVEVTVF9GT1JfVEFSR0VUKQorCitSVU5URVNURkxBR1MgPQorCitSVU5URVNUX0ZPUl9UQVJHRVQgPSBgXAorICBpZiBbIC1mICQke3NyY2Rpcn0vLi4vLi4vZGVqYWdudS9ydW50ZXN0IF07IHRoZW4gXAorICAgIGVjaG8gJCR7c3JjZGlyfS8uLi8uLi9kZWphZ251L3J1bnRlc3Q7IFwKKyAgZWxzZSBcCisgICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF07IHRoZW4gXAorICAgICAgZWNobyBydW50ZXN0OyBcCisgICAgZWxzZSBcCisgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBydW50ZXN0IHwgc2VkIC1lICcnICQkdDsgXAorICAgIGZpOyBcCisgIGZpYAorCisjIyMjIGhvc3QsIHRhcmdldCwgYW5kIHNpdGUgc3BlY2lmaWMgTWFrZWZpbGUgZnJhZ3MgY29tZSBpbiBoZXJlLgorCisjIFRoZSB1c2Ugb2YgJCQoeF9GT1JfVEFSR0VUKSByZWR1Y2VzIHRoZSBjb21tYW5kIGxpbmUgbGVuZ3RoIGJ5IG5vdAorIyBkdXBsaWNhdGluZyB0aGUgbGVuZ3RoeSBkZWZpbml0aW9uLgorCitUQVJHRVRfRkxBR1NfVE9fUEFTUyA9IFwKKyAgICAgICAgInByZWZpeD0kKHByZWZpeCkiIFwKKyAgICAgICAgImV4ZWNfcHJlZml4PSQoZXhlY19wcmVmaXgpIiBcCisgICAgICAgICJhZ2FpbnN0PSQoYWdhaW5zdCkiIFwKKyAgICAgICAgJ0NDPSQkKENDX0ZPUl9UQVJHRVQpJyBcCisgICAgICAgICJDQ19GT1JfVEFSR0VUPSQoQ0NfRk9SX1RBUkdFVCkiIFwKKyAgICAgICAgIkNGTEFHUz0kKFRFU1RTVUlURV9DRkxBR1MpIiBcCisgICAgICAgICJDSElMTEZMQUdTPSQoQ0hJTExGTEFHUykiIFwKKyAgICAgICAgJ0NISUxMPSQkKENISUxMX0ZPUl9UQVJHRVQpJyBcCisgICAgICAgICJDSElMTF9GT1JfVEFSR0VUPSQoQ0hJTExfRk9SX1RBUkdFVCkiIFwKKyAgICAgICAgIkNISUxMX0xJQj0kKENISUxMX0xJQikiIFwKKyAgICAgICAgJ0NYWD0kJChDWFhfRk9SX1RBUkdFVCknIFwKKyAgICAgICAgIkNYWF9GT1JfVEFSR0VUPSQoQ1hYX0ZPUl9UQVJHRVQpIiBcCisgICAgICAgICJDWFhGTEFHUz0kKENYWEZMQUdTKSIgXAorICAgICAgICAiTUFLRUlORk89JChNQUtFSU5GTykiIFwKKyAgICAgICAgIklOU1RBTEw9JChJTlNUQUxMKSIgXAorICAgICAgICAiSU5TVEFMTF9QUk9HUkFNPSQoSU5TVEFMTF9QUk9HUkFNKSIgXAorICAgICAgICAiSU5TVEFMTF9EQVRBPSQoSU5TVEFMTF9EQVRBKSIgXAorICAgICAgICAiTERGTEFHUz0kKExERkxBR1MpIiBcCisgICAgICAgICJMSUJTPSQoTElCUykiIFwKKyAgICAgICAgIlJVTlRFU1Q9JChSVU5URVNUKSIgXAorICAgICAgICAiUlVOVEVTVEZMQUdTPSQoUlVOVEVTVEZMQUdTKSIKKworYWxsOgorCUBlY2hvICJOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIGFsbC4uLiIKKworLk5PRVhQT1JUOgorSU5GT0RJUlM9ZG9jCitpbmZvOgoraW5zdGFsbC1pbmZvOgorZHZpOgorCitpbnN0YWxsOgorCit1bmluc3RhbGw6IGZvcmNlCisKK3NpdGUuZXhwOiAuL2NvbmZpZy5zdGF0dXMgTWFrZWZpbGUKKwlAZWNobyAiTWFraW5nIGEgbmV3IGNvbmZpZyBmaWxlLi4uIgorCS1Acm0gLWYgLi90bXA/CisJQHRvdWNoIHNpdGUuZXhwCisJLUBtdiBzaXRlLmV4cCBzaXRlLmJhaworCUBlY2hvICIjIyB0aGVzZSB2YXJpYWJsZXMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IG1ha2UgIyMiID4gLi90bXAwCisJQGVjaG8gIiMgRG8gbm90IGVkaXQgaGVyZS4gSWYgeW91IHdpc2ggdG8gb3ZlcnJpZGUgdGhlc2UgdmFsdWVzIiA+PiAuL3RtcDAKKwlAZWNobyAiIyBhZGQgdGhlbSB0byB0aGUgbGFzdCBzZWN0aW9uIiA+PiAuL3RtcDAKKwlAZWNobyAic2V0IGhvc3RfYWxpYXMgJChob3N0X2FsaWFzKSIgPj4gLi90bXAwCisJQGVjaG8gInNldCBob3N0X3RyaXBsZXQgJHtob3N0X2Nhbm9uaWNhbH0iID4+IC4vdG1wMAorCUBlY2hvICJzZXQgdGFyZ2V0X2FsaWFzICQodGFyZ2V0X2FsaWFzKSIgPj4gLi90bXAwCisJQGVjaG8gInNldCB0YXJnZXRfdHJpcGxldCAke3RhcmdldF9jYW5vbmljYWx9IiA+PiAuL3RtcDAKKwlAZWNobyAic2V0IGJ1aWxkX3RyaXBsZXQgJHtidWlsZF9jYW5vbmljYWx9IiA+PiAuL3RtcDAKKwlAZWNobyAic2V0IHNyY2RpciAke3NyY2Rpcn0iID4+IC4vdG1wMAorCUBlY2hvICJzZXQgdG9vbCBnZGIiID4+IC4vdG1wMAorCUBlY2hvICIjIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZSBnZW5lcmF0ZWQgYnkgY29uZmlndXJlLiBEbyBOb3QgRWRpdCAjIyIgPj4gLi90bXAwCisJCUBjYXQgLi90bXAwID4gc2l0ZS5leHAKKwlAY2F0IHNpdGUuYmFrIHwgc2VkIFwKKwkJCS1lICcxLC9eIyMgQWxsIHZhcmlhYmxlcyBhYm92ZSBhcmUuKiMjLyBkJyA+PiBzaXRlLmV4cAorCS1Acm0gLWYgLi90bXA/CisKK2luc3RhbGxjaGVjazoKKworY2hlY2s6IHNpdGUuZXhwIGFsbCBqdXN0LWNoZWNrCisKK2p1c3QtY2hlY2s6CisJcm9vdG1lPWBwd2RgOyBleHBvcnQgcm9vdG1lOyBcCisJc3JjZGlyPSR7c3JjZGlyfSA7IGV4cG9ydCBzcmNkaXIgOyBcCisJRVhQRUNUPSR7RVhQRUNUfSA7IGV4cG9ydCBFWFBFQ1QgOyBcCisgICAgICAgICQoUlBBVEhfRU5WVkFSKT0kJHJvb3RtZS8uLi8uLi9leHBlY3Q6JCRyb290bWUvLi4vLi4vbGlic3RkYysrOiQkcm9vdG1lLy4uLy4uL3RrL3VuaXg6JCRyb290bWUvLi4vLi4vdGNsL3VuaXg6JCRyb290bWUvLi4vLi4vYmZkOiQkcm9vdG1lLy4uLy4uL29wY29kZXM6JCQkKFJQQVRIX0VOVlZBUik7IFwKKwlleHBvcnQgJChSUEFUSF9FTlZWQVIpOyBcCisJaWYgWyAtZiAkJHtyb290bWV9Ly4uLy4uL2V4cGVjdC9leHBlY3QgXSA7IHRoZW4gIFwKKwkgIFRDTF9MSUJSQVJZPSQke3NyY2Rpcn0vLi4vLi4vdGNsL2xpYnJhcnkgOyBcCisJICBleHBvcnQgVENMX0xJQlJBUlkgOyBmaSA7IFwKKwkkKFJVTlRFU1QpICQoUlVOVEVTVEZMQUdTKSAKKworc3ViZGlyX2RvOiBmb3JjZQorCUBmb3IgaSBpbiAkKERPRElSUyk7IGRvIFwKKwkJaWYgWyAtZCAuLyQkaSBdIDsgdGhlbiBcCisJCQlpZiAocm9vdG1lPWBwd2RgLyA7IGV4cG9ydCByb290bWUgOyBcCisJCQkgICAgcm9vdHNyYz1gY2QgJChzcmNkaXIpOyBwd2RgLyA7IGV4cG9ydCByb290c3JjIDsgXAorCQkJCWNkIC4vJCRpOyBcCisJCQkJJChNQUtFKSAkKFRBUkdFVF9GTEFHU19UT19QQVNTKSAkKERPKSkgOyB0aGVuIHRydWUgOyBcCisJCQllbHNlIGV4aXQgMSA7IGZpIDsgXAorCQllbHNlIHRydWUgOyBmaSA7IFwKKwlkb25lCisKK2ZvcmNlOjsKKworc3ViZGlyczoKKwlmb3IgZGlyIGluICR7U1VCRElSU30gOyBcCisJZG8gXAorCQllY2hvICIkJGRpcjoiIDsgXAorCQlpZiBbIC1kICQkZGlyIF0gOyB0aGVuIFwKKwkJCShyb290bWU9YHB3ZGAvIDsgZXhwb3J0IHJvb3RtZSA7IFwKKwkJCSByb290c3JjPWBjZCAkKHNyY2Rpcik7IHB3ZGAvIDsgZXhwb3J0IHJvb3RzcmMgOyBcCisJCQkgY2QgJCRkaXI7ICQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykpOyBcCisJCWZpOyBcCisJZG9uZQorCitjbGVhbiBtb3N0bHljbGVhbjoKKwktcm0gLWYgKn4gY29yZSAqLm8gYS5vdXQgeGdkYiAqLnggKi5ncnQKKwlpZiBbIHgiJHtTVUJESVJTfSIgIT0geCBdIDsgdGhlbiBcCisJICAgIGZvciBkaXIgaW4gJHtTVUJESVJTfTsgXAorCSAgICBkbyBcCisJCSAgICBlY2hvICIkJGRpcjoiOyBcCisJCSAgICBpZiBbIC1kICQkZGlyIF07IHRoZW4gXAorCQkJICAgIChjZCAkJGRpcjsgJChNQUtFKSBjbGVhbik7IFwKKwkJICAgIGZpOyBcCisJICAgIGRvbmUgOyBcCisJZWxzZSB0cnVlOyBmaQorCitkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW46IGNsZWFuCisJLXJtIC1mICp+IGNvcmUKKwktcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cyAqLWluaXQuZXhwCisJLXJtIC1mciAqLmxvZyBzdW1tYXJ5IGRldGFpbCAqLnBsb2cgKi5zdW0gKi5wc3VtIHNpdGUuKgorCWlmIFsgeCIke1NVQkRJUlN9IiAhPSB4IF0gOyB0aGVuIFwKKwkgICAgZm9yIGRpciBpbiAke1NVQkRJUlN9OyBcCisJICAgIGRvIFwKKwkJICAgIGVjaG8gIiQkZGlyOiI7IFwKKwkJICAgIGlmIFsgLWQgJCRkaXIgXTsgdGhlbiBcCisJCQkgICAgKGNkICQkZGlyOyAkKE1BS0UpIGRpc3RjbGVhbik7IFwKKwkJICAgIGZpOyBcCisJICAgIGRvbmUgOyBcCisJZWxzZSB0cnVlOyBmaQorCitNYWtlZmlsZSA6IE1ha2VmaWxlLmluIGNvbmZpZy5zdGF0dXMgJChob3N0X21ha2VmaWxlX2ZyYWcpICQodGFyZ2V0X21ha2VmaWxlX2ZyYWcpCisJJChTSEVMTCkgY29uZmlnLnN0YXR1cworCitjb25maWcuc3RhdHVzOiBjb25maWd1cmUKKwkkKFNIRUxMKSBjb25maWcuc3RhdHVzIC0tcmVjaGVjawpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9UT0RPIGIvZ2RiL3Rlc3RzdWl0ZS9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODk5MWMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL1RPRE8KQEAgLTAsMCArMSwyMDIgQEAKK1RoZSBoaWdoZXN0IHByaW9yaXR5IGl0ZW0gaXMgbm90IG9uIHRoaXMgbGlzdDogRml4IGJ1Z3MgaW4gdGhlCitleGlzdGluZyB0ZXN0c3VpdGUsIGZpeCB0aGUgR0RCL2NvbXBpbGVyL3NoZWxsL2V0YyBidWdzIHdoaWNoIGl0CitkZXRlY3RzIChwYXJ0aWN1bGFybHkgd2hlbiB0aGV5IGFyZSBoYXJkIHRvIFhGQUlMKSwgbWFrZSBpdCBydW4KK3JlbGlhYmx5IHdpdGhvdXQgdW5leHBlY3RlZCBmYWlsdXJlcyBvbiB0aGUgInN0YW5kYXJkIiBtYWNoaW5lcywgZXRjLgorVGhpcyBsaXN0IGV4aXN0cyBsYXJnZWx5IGFzICJ0ZXN0cyB3ZSBjYW4gYWRkIHdoZW4gd2UgYXJlIHJlYWR5IHRvCityaXNrIGRlc3RhYmlsaXppbmcgaXQgYWdhaW4iLgorCitUaGVyZSBhcmUgc29tZSB0ZXN0cyB3aGljaCBhcmUgb25seSBydW4gb24gc29tZSBwbGF0Zm9ybXMgYmVjYXVzZSB0aGV5CitoYXZlIG5vdCBiZWVuIHRlc3RlZCBvbiBtb3JlIHBsYXRmb3Jtcy4gIEVuYWJsZSB0aGVtIGFuZCBmaXggYW55Citwcm9ibGVtcy4gIEEgcGFydGlhbCBsaXN0OiByZWN1cnNlLmV4cCwgd2F0Y2hwb2ludC5leHAKKyh0ZXN0X3dhdGNocG9pbnRfdHJpZ2dlcmVkX2luX3N5c2NhbGwsIHRlc3RfY29tcGxleF93YXRjaHBvaW50KS4KKworVGVzdCBwcmludGluZyBvZiBzdHJ1Y3R1cmVzIHBhc3NlZCBieSB2YWx1ZSwgZm9yIHRoZSA3dGgsIDh0aCwgYW5kIDl0aAorYXJndW1lbnRzIChQUiAxNzE0KS4gIFRlc3QgcHJpbnRpbmcgc3RydWN0dXJlIGFyZ3VtZW50cyBvZgorMiw0LDYsOCwxMiwxNixhbmQgMjAgYnl0ZXMuICBTYW1lIGZvciBzdHJ1Y3R1cmUgcmV0dXJuIG9mIGFsbCB0aG9zZQorc2l6ZXMgKCJyZXR1cm4iLCAiZmluaXNoIiwgYW5kIGNhbGwgZnVuY3Rpb24pLgorCitHZXQgY3Jvc3Nsb2FkIHRlc3RzIHRvIHVzZSAtLWVuYWJsZS10YXJnZXRzIGFuZCByZWVuYWJsZSB0aGVtLgorCitjb3JlZmlsZS5leHA6CitUZXN0IGFiaWxpdHkgdG8gcnVuIHByb2dyYW0gd2hlbiB0aGVyZSBpcyBhIGNvcmUgdGFyZ2V0LCB0aGVuIGdvCitiYWNrIHRvIHRoZSBjb3JlIGZpbGUgd2hlbiB0aGUgcHJvZ3JhbSBleGl0cy4KKworVGVzdCBoYW5kbGluZyBvZiBmbG9hdGluZyBwb2ludCB2YXJpYWJsZXMKKzEuICBmbG9hdCwgZG91YmxlLCBvciBsb25nIGRvdWJsZQorMi4gIGluIHJlZ2lzdGVyIG9yIHNhdmVkIHJlZ2lzdGVyIG9yIG1lbW9yeS4gIEFsc28gdGhlIGNhc2Ugd2hlcmUgYQorZG91YmxlIGlzIGluIHR3byBmbG9hdCByZWdpc3RlcnMgYW5kIG9ubHkgb25lIG9mIHRoZW0gaXMgc2F2ZWQuCiszLiAgcHJpbnQgdGhlbSBvciBzZXQgdGhlbQorNC4gIChBbHBoYSkgaW50ZWdlciAoMzIgb3IgNjQgYml0KSBpbiBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4KKworUHJpbnQgcmVnaXN0ZXJzLS0icCAkcjUiLCAicCBzaXplb2YgKCRyNSkiLiAgVGVzdCB0aGF0IHRoZXkgcHJpbnQKK2FwcHJvcHJpYXRlbHkgKGludGVnZXIgcmVnaXN0ZXJzIGluIGRlY2ltYWwsIHJlZ2lzdGVycyB3aGljaCBhbHdheXMKK2NvbnRhaW4gYWRkcmVzc2VzIChwYywgcHJvYmFibHkgc3AgYW5kIGZwLCBtYXliZSBvdGhlcnMpIGluIGhleCwKK2Zsb2F0aW5nIHBvaW50KS4KKworVGVzdCBjb21wbGV0ZXIuICBUZXN0IHRoYXQgaXQgY29tcGxldGVzIGEgdmFyaWV0eSBvZiB0aGluZ3MgY29ycmVjdGx5Cisoc2VlIHRoZSBsaXN0IG9mIHRlc3QgY2FzZXMgaW4gbWFpbi5jIGluIHRoZSBnZGIgc291cmNlKS4gIFRlc3QgVEFCLAorTS0/LCBhbmQgdGhlICJjb21wbGV0ZSIgY29tbWFuZC4KKworVGVzdCAiaW5mbyBsaW5lIiB3aXRoIGFsbCBraW5kcyBvZiBsaW5lc3BlY3MuICBUZXN0IHRoYXQgdGhlIGxhc3QgbGluZQorb2YgdGhlIGZpbGUgd29ya3MgcmlnaHQuCisKK3dlaXJkLmV4cC0tdGVzdCB0aGF0IHVucmVjb2duaXplZCBjcm9zcy1yZWZlcmVuY2UgdHlwZXMgb3IKK3VucmVjb2duaXplZCB2aXNpYmlsaXR5IG9yIHZpcnR1YWwgY2hhcmFjdGVycyBnZXQgc2tpcHBlZCBwcm9wZXJseQorKHNlZSBzdGFicy50ZXhpbmZvKS4KKworVGVzdCBDKysgbmVzdGVkIHR5cGVzIChlc3BlY2lhbGx5IGlmIFBSIDE5NTQgaXMgZml4ZWQ7IGV2ZW4gaWYgbm90Cisqc29tZSogdGhpbmdzIGFscmVhZHkgc2hvdWxkIHdvcmsgZXZlbiBpbiB0aGUgcHJlc2VuY2Ugb2YgbmVzdGVkCit0eXBlcykuICBUZXN0IGNsYXNzZXMgbmVzdGVkIG1vcmUgdGhhbiA5IGxldmVscyBkZWVwIChnKysgbWFuZ2xlcwordGhlc2UgZGlmZmVyZW50bHkpIChib3RoIGEgZGVtYW5nbGUgdGVzdCBhbmQgc29tZSB0ZXN0cyB3aGljaCBhbHNvCit0ZXN0IHRoZSBjb21waWxlcikuICBUZXN0IGNhbGxpbmcgYSBtZXRob2Qgb2YgYSBjbGFzcyBuZXN0ZWQgbW9yZSB0aGFuCis5IGxldmVscyAoZm9yIGdkYl9tYW5nbGVfbmFtZSBhbmQgZGVtYW5nbGluZykuCisKK1Rlc3Qgc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgKEMrKykuICBUZXN0IHRoYXQgInB0eXBlIiBzaG93cyB0aGVtCitjb3JyZWN0bHksIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGV5IGhhdmUgYmVlbiBjb252ZXJ0ZWQgZnJvbSBzdHViCittZXRob2RzLiAgVGVzdCB0aGF0IHdlIGNhbiBjYWxsIHRoZW0uCisKK1Rlc3QgcHJpbnRpbmcgY29tcGxpY2F0ZWQgdHlwZXMsIGluY2x1ZGluZyBmdW5jdGlvbnMsIHBvaW50ZXJzIHRvCithcnJheXMgb2YgcG9pbnRlcnMgb2YgZnVuY3Rpb25zLCBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIHBvaW50ZXJzIHRvCitmdW5jdGlvbnMsIGV0Yy4KKworcHJpbnRjbWQuZXhwLS10ZXN0IHByaW50aW5nIGVudW0gdmFsdWVzLiAgVGVzdCBwcmludGluZyBhbiBlbnVtCit2YXJpYWJsZSB3aG9zZSB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UuICBUZXN0ICJwIChpbnQpZW51bV92YXIiLCAicC94CitlbnVtX3ZhciIuICBUZXN0IHRoYXQgaW4gc29tZXRoaW5nIGxpa2UgImVudW0ge0ZPTywgTEFTVF9USElORz1GT099Igord2UgcHJpbnQgRk9PLCBub3QgTEFTVF9USElORy4KKworVGVzdCBHREIgZXhwcmVzc2lvbnMtLXRlc3QgYWxsIG9wZXJhdG9ycyAoYW5kIG92ZXJsb2FkZWQgb3BlcmF0b3JzIGZvcgorQysrKS4gIFRlc3QgaW50ZWdlciBjb25zdGFudHMgd2hpY2ggYXJlIHNpZ25lZCBvciB1bnNpZ25lZCBpbnQsIGxvbmcsCitvciBsb25nIGxvbmcuICBUZXN0IGRldGVjdGlvbiBvZiBvdmVyZmxvdyBvZiBhbiBpbnRlZ2VyIGNvbnN0YW50LgorSGVyZSBhcmUgYSBmZXcgaW50ZWdlciBjb25zdGFudHMgdG8gdGVzdCAodGVzdCB0aGV5IGdldCB0aGUgcmlnaHQKK3R5cGVzKTogNSwgNUxMLCA1THVMLCA1TDZ1IChpbnZhbGlkKSwgNUxVLiAgTWF5YmUgdGhpbmdzIGxpa2UKKzB4MTIzNDU2NzgsIDB4ODc2NTQzMjEsIGV0Yy4sIGJ1dCB0aGVpciB0eXBlcyBkZXBlbmQgb24gc2l6ZXMgb2YgaW50LAorbG9uZywgZXRjLgorCitUZXN0IHRoYXQgcHJpbnRpbmcgY29uc3QtcXVhbGlmaWVkIHZlcnNpb25zIG9mIHZhcmlvdXMgdHlwZXMgd29ya3MuCitJbiBwYXJ0aWN1bGFyLCBvbiB0aGUgc3BhcmMgYW5kIHByb2JhYmx5IG90aGVyIG1hY2hpbmVzLCAiZG91YmxlIiBpcworaGFuZGxlZCBkaWZmZXJlbnRseSBmcm9tIG1vc3QgdHlwZXMgYmVjYXVzZSBpdCByZXF1aXJlcyBtb3JlIGFsaWdubWVudAorYW5kIHRodXMgZ29lcyBpbiBhIGRpZmZlcmVudCBzZWN0aW9uICh0aGVyZSBpcyBhIGdjYyAyLjQuNSBidWcgd2l0aAorImNvbnN0IGRvdWJsZSIgb24gc3BhcmMpLgorCitUZXN0IHRoYXQgR0RCJ3MgInNvdXJjZSIgY29tbWFuZCB3b3JrcyBhbmQgdGhhdCB0aGluZ3Mgd29yayBpZiBzdGRpbgoraXMgcmVkaXJlY3RlZCAodG8gYSBmaWxlIG9yIGEgcGlwZSkuICBUZXN0IHVzZXIgZGVmaW5lZCBjb21tYW5kLiAgUnVuCithbiBpbmZlcmlvciBlYWNoIG9mIHRoZXNlIHdheXMgKHRvIHRlc3QgdGhhdCBpbmZsb3cuYyB3b3JrcykuICBUZXN0Cit0aGF0IEdEQiB3b3JrcyBpZiB0aGUgbGFzdCBsaW5lIG9mIHN0ZGluIG9yIGEgc291cmNlJ2QgZmlsZSBsYWNrcyBhCituZXdsaW5lLgorCitUZXN0IHRoYXQgdW5tYXRjaGVkIHNpbmdsZSBxdW90ZXMgcHJvZHVjZSBlcnJvciBtZXNzYWdlcywgYm90aCBpbgorZXhwcmVzc2lvbnMgYW5kIGxpbmVzcGVjcy4KKworVGVzdCAiY2QiLiAgImZvby9iYXIvLi4iIHNob3VsZCBnZXQgc2ltcGxpZmllZCB0byAiZm9vIi4gICIvLi4vLi4iCitzaG91bGQgbm90IGdldCBzaW1wbGlmaWVkIChmb3IgTWFjaCkuICAiLy4uIiBzaG91bGQgbm90IGdldCBzaW1wbGlmaWVkCisoZm9yIG90aGVyIG5ldHdvcmtlZCBPU2VzOyBQT1NJWC4xIHNlY3Rpb24gQi4yLjMuNykuICBBbGwgdGhlc2UKK2V4YW1wbGVzIHNob3VsZCBjb250aW51ZSB0byB3b3JrIHdpdGggdHJhaWxpbmcgc2xhc2hlcy4KKworVGVzdCBzY29waW5nOyBoZXJlIGlzIGEgc3RhcnQKKyAxCWludCBpPTI7CisgMglpbnQgaj0zOworIDMJbWFpbigpCisgNAl7CisgNQkgICAgaW50IGk7CisgNgkgICAgZm9yIChpPTYwMDsgaT4wOyBpLS0pCisgNwkJcHJpbnRfbGluZShpKTsKKyA4CX0KKyA5CisxMAlwcmludF9saW5lKGkpCisxMQkgICAgaW50IGk7CisxMgl7CisxMwkgICAgaCgpOworMTQJICAgIHByaW50ZigiJWRcbiIsaSk7CisxNQl9CisxNgorMTcJaCgpCisxOAl7CisxOQkgICAgcHJpbnRmKCJJbiBoLi4uIik7CisyMAl9CitTZXQgYSBicmVha3BvaW50IGluIGgsIGFuZCBwcmludCBpLCBwcmludF9saW5lOjppLCBhbmQgbWFpbjo6aS4gIFNldCBhCiticmVha3BvaW50IGluIG1haW4gKG9yIGRvbid0IHJ1biB0aGUgcHJvZ3JhbSksIGFuZCB0ZXN0IHRoYXQKK3ByaW50X2xpbmU6OmkgaXMgYW4gZXJyb3IuICBCdXQgaWYgaSB3ZXJlIHN0YXRpYywgInAgbWFpbjo6aSIgc2hvdWxkCit3b3JrIGV2ZW4gaWYgdGhlIHByb2dyYW0gaXMgbm90IGJlaW5nIHJ1bi4KKworV3JpdGUgYSB0ZXN0IGZvciB0aGUgcmVlbnRyYWN5IGJ1ZyB3aXRoIHJzNjAwMF9zdHJ1Y3RfcmV0dXJuX2FkZHJlc3MKK2luIHJzNjAwMC10ZGVwLmMuCisKK1Rlc3QgInJldHVybiIgZnJvbSBkdW1teSBmcmFtZXMuICBUZXN0ICJyZXR1cm4iIGZyb20gbm9uLWlubmVybW9zdAorZnJhbWUuICBUZXN0IHRoYXQgInJldHVybiIgZnJvbSBhIG5vbi1pbm5lcm1vc3QgZnJhbWUgcmVzdG9yZXMKK3JlZ2lzdGVycyB3aGljaCBhcmUgc2F2ZWQgbm90IGluIHRoYXQgZnJhbWUgYnV0IGluIGEgZnJhbWUgbW9yZSBpbm5lcgorKEkgYmVsaWV2ZSB0aGlzIGN1cnJlbnRseSB3b3JrcyBvbiBmZXcgaWYgYW55IGFyY2hpdGVjdHVyZXMpLgorCitGT1JUUkFOIGNvbW1vbiBibG9ja3MgKGEub3V0IGFuZCB4Y29mZi0td2VpcmQuZXhwIGhhcyB0aGUgc3RhcnQgb2YKK29uZSBidXQgaXQgaXMgbm90IHF1aXRlIHJpZ2h0IGFzIG9mIDE5IE5vdiAxOTkzKS4KKworVGVzdCB0aGF0ICJ4IiBjb21tYW5kIHNldHMgJF8gYW5kICRfXy4gIFRlc3QgJF8gaW4gZ2VuZXJhbC4KKworVGVzdCB0aGF0ICJwL2EiIHdvcmtzIHdoZW4gZ2l2ZW4gYWRkcmVzc2VzIGluIHRleHQsIGRhdGEsIGFuZCBic3MKK3NlZ21lbnRzLiAgVGVzdCB0aGF0IGl0IHdvcmtzIGlmIHByb2dyYW0gaXMgY29tcGlsZWQgd2l0aCBvciB3aXRob3V0CistZy4gIFRlc3QgdGhhdCBpdCB3b3JrcyBpZiBwcmVjZWRpbmcgc3ltYm9sIGlzIHN0YXRpYyBvciBpZiBpdCBpcworZXh0ZXJuLgorCitHaXZlbiBgY2hhciBhYmNbXSA9ICJhYmNcMGRlZiI7JyB0ZXN0ICJ4L3MgYWJjIiBmb2xsb3dlZCBieSAieC9zIgorKHNob3VsZCBkaXNwbGF5ICJhYmMiIGZvbGxvd2VkIGJ5ICJkZWYiKS4gIFRlc3QgdGhpcyB3b3JrcyB3aXRoIG5vCitlcnJvciBtZXNzYWdlIGV2ZW4gaWYgdGhpcyBpcyB0aGUgbGFzdCB0aGluZyBpbiB0aGUgc2VjdGlvbiAodGVzdHMKK3RoYXQgdmFsX3ByaW50X3N0cmluZyBpZ25vcmVzIGFuIGVycm9yIGlmIHRoZSBlcnJvciBvY2N1cnMgYWZ0ZXIgdGhlCisnXDAnKS4KKworVGVzdCBhYmlsaXR5IHRvIHByb2Nlc3MgTk1BR0lDIGEub3V0IGZpbGVzLgorCitUZXN0IHNoYXJlZCBsaWJyYXJpZXM6ICAibmV4dCIgb3ZlciBwcmludGYsICJzdGVwIiBpbnRvIGEgZnVuY3Rpb24gaW4KK2Egc2hhcmVkIGxpYnJhcnkgd2hpY2ggaGFzIGxpbmUgbnVtYmVyIGluZm8sIGJyZWFrcG9pbnQgaW4gYSBmdW5jdGlvbgoraW4gYSBzaGFyZWQgbGlicmFyeSAoZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgcHJvZ3JhbSBpcyBydW4gYW5kIHRoZQorc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkLS1hbHNvIG1heWJlIHdyaXRlIGEgdGVzdCB3aGVyZSB0aGUgUExUCit3aWxsIGJlIGluIGFuIHVubG9hZGVkIHN0YXRlIGV2ZW4gdGhvdWdoIHRoZSBzaGFyZWQgbGlicmFyeSBpcyBsb2FkZWQpLgorCitJZiB0aGVyZSBhcmUgdHdvIGJyZWFrcG9pbnRzIGluIHRoZSBzYW1lIHBsYWNlLCBhbmQgZXhhY3RseSBvbmUgb2YKK3RoZW0gaGFzIGl0cyBjb25kaXRpb24gdHJ1ZSwgdGVzdCB0aGF0IHRoZSBjb3JyZWN0IGJyZWFrcG9pbnQgZ2V0cworcHJpbnRlZC4KKworVGVzdCAianVtcCIgaW5jbHVkaW5nIGp1bXAgdG8gYSBicmVha3BvaW50ICh0aGUgbGF0dGVyIHdpbGwgbmVlZCBhbgoreGZhaWwgZm9yIFVESSBhbmQgcHJvYmFibHkgVnhXb3JrcyAoUFIgMTc4NiBmb3Igdnh3b3JrczsgUFIgMjQxNgorY29udGFpbnMgc29tZSBpbmZvIGZvciAyOWspLgorCitTZXQgYSB3YXRjaHBvaW50IG9uIGEgbG9jYWwgdmFyaWFibGUgKHRvIGJlIGludGVyZXN0aW5nLCBtYWtlIGEgZmV3CitjYWxscywgdG8gYmUgbW9yZSBpbnRlcmVzdGluZywgbWFrZSBhIHJlY3Vyc2l2ZSBjYWxsKS4gIFRlc3QgdGhhdCBpdAorZ2V0cyBkaXNhYmxlZCB3aGVuIGxlYXZpbmcgdGhhdCBzY29wZS4KKworVGVzdCBjYWxsaW5nIGEgZnVuY3Rpb24sIGhpdHRpbmcgYSBicmVha3BvaW50IGluIHRoZSBjYWxsZWQgZnVuY3Rpb24sCitjYWxsaW5nIGFub3RoZXIgZnVuY3Rpb24sIGFuZCBoaXR0aW5nIGEgYnJlYWtwb2ludC4gIFRlc3QgYmFja3RyYWNlCit3b3JrcyBpbiB0aGUgcHJlc2VuY2Ugb2YgbXVsdGlwbGUgZHVtbXkgZnJhbWVzLiAgVGVzdCB0aGF0ICJjb250aW51ZSIKK3dpbGwgZ2V0IHlvdSBvdXQgb2YgdGhlIGlubmVyIGNhbGxlZCBmdW5jdGlvbiwgYW5kICJjb250aW51ZSIgYWdhaW4KK3dpbGwgZ2V0IHlvdSBiYWNrIHRvIHdoZXJlIHlvdSB3ZXJlIHdoZW4geW91IGNhbGxlZCB0aGUgZmlyc3Qgb25lLgorCitUZXN0IHNwZWNpYWwgbG9uZ2ptcCBoYW5kbGluZyBpbiB3YWl0X2Zvcl9pbmZlcmlvciAobmVlZCB0byBmaWd1cmUgb3V0CitpbiBkZXRhaWwgd2hhdCB0aGUgcHJvcGVyIGJlaGF2aW9yIGluIGVhY2ggY2FzZSBpcykuICBUZXN0IGxvbmdqbXAgdG8KK2EgcGxhY2Ugd2hlcmUgdGhlcmUgaXMgYSBicmVha3BvaW50IChzdWNoIHRoYXQKK0JQU1RBVF9XSEFUX0NMRUFSX0xPTkdKTVBfUkVTVU1FX1NJTkdMRSBoYXBwZW5zKS4gIEluIGdlbmVyYWwsIHRlc3QKK2ludGVyYWN0aW9ucyBiZXR3ZWVuIGxvbmdqbXAgYW5kIHdhdGNocG9pbnRzLCBicmVha3BvaW50cywgc3RlcHBpbmcsCitjYWxsIGZ1bmN0aW9uLCBldGMuCisKK1Rlc3QganVtcGluZyByaWdodCBwYXN0IGEgYnJlYWtwb2ludCAodGhlIGNhc2Ugd2hlcmUgd2FpdF9mb3JfaW5mZXJpb3IKK3Bhc3NlcyBub3RfYV9icmVha3BvaW50IHRvIGJwc3RhdF9zdG9wX3N0YXR1cykuICBNaWdodCBhbHJlYWR5IGJlCit0ZXN0ZWQgYnkgc29tZSBvZiB0aGUgc3VuMyB0ZXN0cy4gIFByb2JhYmx5IHdhbnQgYSAucyB0ZXN0IHRvIGF2b2lkCitjb21waWxlciBkZXBlbmRlbmNpZXMuCisKK1Rlc3QgbW9yZSBvYnNjdXJlIHdhaXRfZm9yX2luZmVyaW9yIGNhc2VzLCBleHBhbmRpbmcgb24gdGhlIHRlc3RzIGluCit3YXRjaHBvaW50LmV4cCwgc2lnbmFscy5leHAsIGV0Yy4KKworVGVzdCBzdGVwcGluZyBpbnRvIGZ1bmN0aW9ucyB3aGljaCBhcmUgb25lIGxpbmUgbG9uZyBhbmQgZnVuY3Rpb25zCit3aGljaCBhcmUgb24gbGluZSAxIG9mIHRoZSBzb3VyY2UgZmlsZS4gKHRoZXJlIGlzIGEgY2xhc3Mgb2YgYnVncyBpbgord2hpY2ggZ2RiIGRvZXNuJ3QgZmluZCB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24sIGFuZCB0aHVzIGRvZXNuJ3QKK3N0ZXAgaW50byB0aGUgZnVuY3Rpb24pLgorCitUZXN0IHRoYXQgcHJvbG9ndWUgcmVjb2duaXRpb24sIGJhY2t0cmFjZSwgcHJpbnRpbmcgbG9jYWxzLCBldGMuLAorc3RpbGwgd29yayBpbiB0aGUgcHJlc2VuY2Ugb2YgbGFyZ2UgZnJhbWVzICh0aGUgcG9pbnQgYmVpbmcgdGhhdCBhdAorc29tZSBwb2ludCBpbW1lZGlhdGUgZmllbGRzIGluIFJJU0MgaW5zdHJ1Y3Rpb25zIHdpbGwgb3ZlcmZsb3cgYW5kCitwcm9sb2d1ZXMgd2lsbCBuZWVkIHRvIGxvb2sgZGlmZmVyZW50LiAgRm9yIHNwYXJjLCB0aGUgaW1tZWRpYXRlIGZpZWxkCitpcyAxMyBiaXRzIChzaWduZWQpLCBzbyBJIGJlbGlldmUgdGhlIHRocmVzaG9sZCB3b3VsZCBiZSA0SyBieXRlcyBpbiBhCitmcmFtZSkuCisKKwwKKyh0aGlzIGlzIGZvciBlZGl0aW5nIHRoaXMgZmlsZSB3aXRoIEdOVSBlbWFjcykKK0xvY2FsIFZhcmlhYmxlczoKK21vZGU6IHRleHQKK0VuZDoKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvYWNsb2NhbC5tNCBiL2dkYi90ZXN0c3VpdGUvYWNsb2NhbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzU0ZmRjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9hY2xvY2FsLm00CkBAIC0wLDAgKzEsNTgzIEBACitkbmwgVGhpcyBmaWxlIGlzIGR1cGxpY2F0ZWQgaW4gZm91ciBwbGFjZXM6CitkbmwgKiBnZGIvYWNsb2NhbC5tNAorZG5sICogZ2RiL3Rlc3RzdWl0ZS9hY2xvY2FsLm00CitkbmwgKiBleHBlY3QvYWNsb2NhbC5tNAorZG5sICogZGVqYWdudS9hY2xvY2FsLm00CitkbmwgQ29uc2lkZXIgbW9kaWZ5aW5nIGFsbCBjb3BpZXMgaW4gcGFyYWxsZWwuCitkbmwgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4gZm9yIEN5Z251cyBTdXBwb3J0CitkbmwgQ1lHTlVTIExPQ0FMOiBUaGlzIGdldHMgdGhlIHJpZ2h0IHBvc2l4IGZsYWcgZm9yIGdjYworQUNfREVGVU4oQ1lfQUNfVENMX0xZTlhfUE9TSVgsCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pQUNfUkVRVUlSRShbQUNfUFJPR19DUFBdKQorQUNfTVNHX0NIRUNLSU5HKFt0byBzZWUgaWYgdGhpcyBpcyBMeW54T1NdKQorQUNfQ0FDSEVfVkFMKGFjX2N2X29zX2x5bngsCitbQUNfRUdSRVBfQ1BQKHllcywKK1svKgorICogVGhlIG9sZCBMeW54ICJjYyIgb25seSBkZWZpbmVzICJMeW54IiwgYnV0IHRoZSBuZXdlciBvbmUgdXNlcyAiX19MeW54X18iCisgKi8KKyNpZiBkZWZpbmVkKF9fTHlueF9fKSB8fCBkZWZpbmVkKEx5bngpCit5ZXMKKyNlbmRpZgorXSwgYWNfY3Zfb3NfbHlueD15ZXMsIGFjX2N2X29zX2x5bng9bm8pXSkKKyMKK2lmIHRlc3QgIiRhY19jdl9vc19seW54IiA9ICJ5ZXMiIDsgdGhlbgorICBBQ19NU0dfUkVTVUxUKHllcykKKyAgQUNfREVGSU5FKExZTlgpCisgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAtbXBvc2l4IG9yIC1YIGlzIGF2YWlsYWJsZV0pCisgIEFDX0NBQ0hFX1ZBTChhY19jdl9jX3Bvc2l4X2ZsYWcsCisgIFtBQ19UUllfQ09NUElMRSgsWworICAvKgorICAgKiBUaGlzIGZsYWcgdmFyaWVzIGRlcGVuZGluZyBvbiBob3cgb2xkIHRoZSBjb21waWxlciBpcy4KKyAgICogLVggaXMgZm9yIHRoZSBvbGQgImNjIiBhbmQgImdjYyIgKGJhc2VkIG9uIDEuNDIpLgorICAgKiAtbXBvc2l4IGlzIGZvciB0aGUgbmV3IGdjYyAoYXQgbGVhc3QgMi41LjgpLgorICAgKi8KKyAgI2lmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDIKKyAgY2hva2UgbWUKKyAgI2VuZGlmCisgIF0sIGFjX2N2X2NfcG9zaXhfZmxhZz0iIC1tcG9zaXgiLCBhY19jdl9jX3Bvc2l4X2ZsYWc9IiAtWCIpXSkKKyAgQ0M9IiRDQyAkYWNfY3ZfY19wb3NpeF9mbGFnIgorICBBQ19NU0dfUkVTVUxUKCRhY19jdl9jX3Bvc2l4X2ZsYWcpCisgIGVsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCitdKQorCitBQ19ERUZVTihDWV9BQ19QQVRIX1RDTEgsIFsKKyMKKyMgT2ssIGxldHMgZmluZCB0aGUgdGNsIHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBoZWFkZXJzCisjIFdhcm5pbmc6IHRyYW5zaXRpb24gb2YgdmVyc2lvbiA5IHRvIDEwIHdpbGwgYnJlYWsgdGhpcyBhbGdvcml0aG0KKyMgYmVjYXVzZSAxMCBzb3J0cyBiZWZvcmUgOS4gV2UgYWxzbyBsb29rIGZvciBqdXN0IHRjbC4gV2UgaGF2ZSB0bworIyBiZSBjYXJlZnVsIHRoYXQgd2UgZG9uJ3QgbWF0Y2ggc3R1ZmYgbGlrZSB0Y2xYIGJ5IGFjY2lkZW50LgorIyB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZvbGtlZCBieSAtLXdpdGgtdGNsaW5jbHVkZQorIworbm9fdGNsPXRydWUKK0FDX01TR19DSEVDS0lORyhmb3IgVGNsIHByaXZhdGUgaGVhZGVycykKK0FDX0FSR19XSVRIKHRjbGluY2x1ZGUsIFsgIC0td2l0aC10Y2xpbmNsdWRlICAgICAgIGRpcmVjdG9yeSB3aGVyZSB0Y2wgcHJpdmF0ZSBoZWFkZXJzIGFyZV0sIHdpdGhfdGNsaW5jbHVkZT0ke3dpdGh2YWx9KQorQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGNsaCxbCisjIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGNsaW5jbHVkZSB3YXMgc3BlY2lmaWVkCitpZiB0ZXN0IHgiJHt3aXRoX3RjbGluY2x1ZGV9IiAhPSB4IDsgdGhlbgorICBpZiB0ZXN0IC1mICR7d2l0aF90Y2xpbmNsdWRlfS90Y2xJbnQuaCA7IHRoZW4KKyAgICBhY19jdl9jX3RjbGg9YChjZCAke3dpdGhfdGNsaW5jbHVkZX07IHB3ZClgCisgIGVsc2UKKyAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90Y2xpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIHByaXZhdGUgaGVhZGVyc10pCisgIGZpCitmaQorIyBuZXh0IGNoZWNrIGluIHByaXZhdGUgc291cmNlIGRpcmVjdG9yeQorIworIyBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAoraWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgPSB4IDsgdGhlbgorICBmb3IgaSBpbiBcCisJCSR7c3JjZGlyfS8uLi90Y2wgXAorCQlgbHMgLWRyICR7c3JjZGlyfS8uLi90Y2xbWzAtOV1dKiAyPi9kZXYvbnVsbGAgXAorCQkke3NyY2Rpcn0vLi4vLi4vdGNsIFwKKwkJYGxzIC1kciAke3NyY2Rpcn0vLi4vLi4vdGNsW1swLTldXSogMj4vZGV2L251bGxgIFwKKwkJJHtzcmNkaXJ9Ly4uLy4uLy4uL3RjbCBcCisJCWBscyAtZHIgJHtzcmNkaXJ9Ly4uLy4uLy4uL3RjbFtbMC05XV0qIDI+L2Rldi9udWxsIGAgOyBkbworICAgIGlmIHRlc3QgLWYgJGkvdGNsSW50LmggOyB0aGVuCisgICAgICBhY19jdl9jX3RjbGg9YChjZCAkaTsgcHdkKWAKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgICAjIFRjbCA3LjUgYW5kIGdyZWF0ZXIgcHV0cyBoZWFkZXJzIGluIHN1YmRpcmVjdG9yeS4KKyAgICBpZiB0ZXN0IC1mICRpL2dlbmVyaWMvdGNsSW50LmggOyB0aGVuCisgICAgICBhY19jdl9jX3RjbGg9YChjZCAkaTsgcHdkKWAvZ2VuZXJpYworICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCitmaQorIyBmaW5hbGx5IGNoZWNrIGluIGEgZmV3IGNvbW1vbiBpbnN0YWxsIGxvY2F0aW9ucworIworIyBzaW5jZSBscyByZXR1cm5zIGxvd2VzdCB2ZXJzaW9uIG51bWJlcnMgZmlyc3QsIHJldmVyc2UgaXRzIG91dHB1dAoraWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgPSB4IDsgdGhlbgorICBmb3IgaSBpbiBcCisJCWBscyAtZHIgL3Vzci9sb2NhbC9zcmMvdGNsW1swLTldXSogMj4vZGV2L251bGxgIFwKKwkJYGxzIC1kciAvdXNyL2xvY2FsL2xpYi90Y2xbWzAtOV1dKiAyPi9kZXYvbnVsbGAgXAorCQkvdXNyL2xvY2FsL3NyYy90Y2wgXAorCQkvdXNyL2xvY2FsL2xpYi90Y2wgXAorCQkke3ByZWZpeH0vaW5jbHVkZSA7IGRvCisgICAgaWYgdGVzdCAtZiAkaS90Y2xJbnQuaCA7IHRoZW4KKyAgICAgIGFjX2N2X2NfdGNsaD1gKGNkICRpOyBwd2QpYAorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCitmaQorIyBzZWUgaWYgb25lIGlzIGluc3RhbGxlZAoraWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgPSB4IDsgdGhlbgorICAgQUNfSEVBREVSX0NIRUNLKHRjbEludC5oLCBhY19jdl9jX3RjbGg9aW5zdGFsbGVkLCBhY19jdl9jX3RjbGg9IiIpCitmaQorXSkKK2lmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iID0geCA7IHRoZW4KKyAgVENMSERJUj0iIyBubyBUY2wgcHJpdmF0ZSBoZWFkZXJzIGZvdW5kIgorICBBQ19NU0dfRVJST1IoW0Nhbid0IGZpbmQgVGNsIHByaXZhdGUgaGVhZGVyc10pCitmaQoraWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgIT0geCA7IHRoZW4KKyAgbm9fdGNsPSIiCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iID0geCJpbnN0YWxsZWQiIDsgdGhlbgorICAgIEFDX01TR19SRVNVTFQoW2lzIGluc3RhbGxlZF0pCisgICAgVENMSERJUj0iIgorICBlbHNlCisgICAgQUNfTVNHX1JFU1VMVChbZm91bmQgaW4gJHthY19jdl9jX3RjbGh9XSkKKyAgICAjIHRoaXMgaGFjayBpcyBjYXVzZSB0aGUgVENMSERJUiB3b24ndCBwcmludCBpZiB0aGVyZSBpcyBhICItSSIgaW4gaXQuCisgICAgVENMSERJUj0iLUkke2FjX2N2X2NfdGNsaH0iCisgIGZpCitmaQorCitBQ19NU0dfQ0hFQ0tJTkcoW1RjbCB2ZXJzaW9uXSkKK29yaWdfaW5jbHVkZXM9IiRDUFBGTEFHUyIKKworaWYgdGVzdCB4IiR7VENMSERJUn0iICE9IHggOyB0aGVuCisgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJFRDTEhESVIiCitmaQorCisjIEdldCBtYWpvciBhbmQgbWlub3IgdmVyc2lvbnMgb2YgVGNsLiAgVXNlIGZ1bm55IG5hbWVzIHRvIGF2b2lkCisjIGNsYXNoZXMgd2l0aCBlZyBTdW5PUy4KK2NhdCA+IGNvbmZ0ZXN0LmMgPDwnRU9GJworI2luY2x1ZGUgInRjbC5oIgorTWFKb3IgPSBUQ0xfTUFKT1JfVkVSU0lPTgorTWlOb3IgPSBUQ0xfTUlOT1JfVkVSU0lPTgorRU9GCisKK3RjbG1ham9yPQordGNsbWlub3I9CitpZiAoZXZhbCAiJENQUCAkQ1BQRkxBR1MgY29uZnRlc3QuYyIpIDI+L2Rldi9udWxsID5jb25mdGVzdC5vdXQ7IHRoZW4KKyAgICMgU3VjY2Vzcy4KKyAgIHRjbG1ham9yPWBlZ3JlcCAnXk1hSm9yID0gJyBjb25mdGVzdC5vdXQgfCBzZWQgLWUgJ3MvXk1hSm9yID0gKi8vJyAtZSAncy8gKiQvLydgCisgICB0Y2xtaW5vcj1gZWdyZXAgJ15NaU5vciA9ICcgY29uZnRlc3Qub3V0IHwgc2VkIC1lICdzL15NaU5vciA9ICovLycgLWUgJ3MvICokLy8nYAorZmkKK3JtIC1mIGNvbmZ0ZXN0LmMgY29uZnRlc3Qub3V0CisKK2lmIHRlc3QgLXogIiR0Y2xtYWpvciIgfHwgdGVzdCAteiAiJHRjbG1pbm9yIjsgdGhlbgorICAgQUNfTVNHX1JFU1VMVChbZmF0YWwgZXJyb3I6IGNvdWxkIG5vdCBmaW5kIG1ham9yIG9yIG1pbm9yIHZlcnNpb24gbnVtYmVyIG9mIFRjbF0pCisgICBleGl0IDEKK2ZpCitBQ19NU0dfUkVTVUxUKCR7dGNsbWFqb3J9LiR7dGNsbWlub3J9KQorCitDUFBGTEFHUz0iJHtvcmlnX2luY2x1ZGVzfSIKKworQUNfUFJPVklERShbJDBdKQorQUNfU1VCU1QoVENMSERJUikKK10pCitBQ19ERUZVTihDWV9BQ19QQVRIX1RDTExJQiwgWworIworIyBPaywgbGV0cyBmaW5kIHRoZSB0Y2wgbGlicmFyeQorIyBGaXJzdCwgbG9vayBmb3Igb25lIHVuaW5zdGFsbGVkLiAgCisjIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLXRjbGxpYgorIworCitpZiB0ZXN0ICR0Y2xtYWpvciAtZ2UgNyAtYSAkdGNsbWlub3IgLWdlIDQgOyB0aGVuCisgIGluc3RhbGxlZHRjbGxpYnJvb3Q9dGNsJHRjbHZlcnNpb24KK2Vsc2UKKyAgaW5zdGFsbGVkdGNsbGlicm9vdD10Y2wKK2ZpCisKK2lmIHRlc3QgeCIke25vX3RjbH0iID0geCA7IHRoZW4KKyAgIyB3ZSByZXNldCBub190Y2wgaW5jYXNlIHNvbWV0aGluZyBmYWlscyBoZXJlCisgIG5vX3RjbD10cnVlCisgIEFDX0FSR19XSVRIKHRjbGxpYiwgWyAgLS13aXRoLXRjbGxpYiAgICAgICAgICAgZGlyZWN0b3J5IHdoZXJlIHRoZSB0Y2wgbGlicmFyeSBpc10sCisgICAgICAgICB3aXRoX3RjbGxpYj0ke3dpdGh2YWx9KQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBUY2wgbGlicmFyeV0pCisgIEFDX0NBQ0hFX1ZBTChhY19jdl9jX3RjbGxpYixbCisgICMgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC10Y2xsaWIgd2FzIHNwZWNpZmllZC4KKyAgIyBUaGlzIHJlcXVpcmVzIGNoZWNraW5nIGZvciBib3RoIHRoZSBpbnN0YWxsZWQgYW5kIHVuaW5zdGFsbGVkIG5hbWUtc3R5bGVzCisgICMgc2luY2Ugd2UgaGF2ZSBubyBpZGVhIGlmIGl0J3MgaW5zdGFsbGVkIG9yIG5vdC4KKyAgaWYgdGVzdCB4IiR7d2l0aF90Y2xsaWJ9IiAhPSB4IDsgdGhlbgorICAgIGlmIHRlc3QgLWYgIiR7d2l0aF90Y2xsaWJ9L2xpYiRpbnN0YWxsZWR0Y2xsaWJyb290LnNvIiA7IHRoZW4KKyAgICAgIGFjX2N2X2NfdGNsbGliPWAoY2QgJHt3aXRoX3RjbGxpYn07IHB3ZClgL2xpYiRpbnN0YWxsZWR0Y2xsaWJyb290LnNvCisgICAgZWxpZiB0ZXN0IC1mICIke3dpdGhfdGNsbGlifS9saWJ0Y2wuc28iIDsgdGhlbgorICAgICAgYWNfY3ZfY190Y2xsaWI9YChjZCAke3dpdGhfdGNsbGlifTsgcHdkKWAvbGlidGNsLnNvCisgICAgIyB0aGVuIGxvb2sgZm9yIGEgZnJlc2hseSBidWlsdCBzdGF0aWNhbGx5IGxpbmtlZCBsaWJyYXJ5CisgICAgIyBpZiBNYWtlZmlsZSBleGlzdHMgd2UgYXNzdW1lIGl0cyBjb25maWd1cmVkIGFuZCBsaWJ0Y2wgd2lsbCBiZSBidWlsdCBmaXJzdC4KKyAgICBlbGlmIHRlc3QgLWYgIiR7d2l0aF90Y2xsaWJ9L2xpYiRpbnN0YWxsZWR0Y2xsaWJyb290LmEiIDsgdGhlbgorICAgICAgYWNfY3ZfY190Y2xsaWI9YChjZCAke3dpdGhfdGNsbGlifTsgcHdkKWAvbGliJGluc3RhbGxlZHRjbGxpYnJvb3QuYQorICAgIGVsaWYgdGVzdCAtZiAiJHt3aXRoX3RjbGxpYn0vbGlidGNsLmEiIDsgdGhlbgorICAgICAgYWNfY3ZfY190Y2xsaWI9YChjZCAke3dpdGhfdGNsbGlifTsgcHdkKWAvbGlidGNsLmEKKyAgICBlbHNlCisgICAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90Y2xsaWJ9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gbGlicmFyaWVzXSkKKyAgICBmaQorICBmaQorICAjIHRoZW4gY2hlY2sgZm9yIGEgcHJpdmF0ZSBUY2wgbGlicmFyeQorICAjIFNpbmNlIHRoZXNlIGFyZSB1bmluc3RhbGxlZCwgdXNlIHRoZSBzaW1wbGUgbGliIG5hbWUgcm9vdC4KKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xsaWJ9IiA9IHggOyB0aGVuCisgICAgZm9yIGkgaW4gXAorCQkuLi90Y2wgXAorCQlgbHMgLWRyIC4uL3RjbFtbMC05XV0qIDI+L2Rldi9udWxsYCBcCisJCS4uLy4uL3RjbCBcCisJCWBscyAtZHIgLi4vLi4vdGNsW1swLTldXSogMj4vZGV2L251bGxgIFwKKwkJLi4vLi4vLi4vdGNsIFwKKwkJYGxzIC1kciAuLi8uLi8uLi90Y2xbWzAtOV1dKiAyPi9kZXYvbnVsbGAgOyBkbworICAgICAgIyBUY2wgNy41IGFuZCBncmVhdGVyIHB1dHMgbGlicmFyeSBpbiBzdWJkaXIuICBMb29rIHRoZXJlIGZpcnN0LgorICAgICAgaWYgdGVzdCAtZiAiJGkvdW5peC9saWJ0Y2wuc28iIDsgdGhlbgorCSBhY19jdl9jX3RjbGxpYj1gKGNkICRpOyBwd2QpYC91bml4L2xpYnRjbC5zbworCSBicmVhaworICAgICAgZWxpZiB0ZXN0IC1mICIkaS91bml4L2xpYnRjbC5hIiAtbyAtZiAiJGkvdW5peC9NYWtlZmlsZSI7IHRoZW4KKwkgYWNfY3ZfY190Y2xsaWI9YChjZCAkaTsgcHdkKWAvdW5peC9saWJ0Y2wuYQorCSBicmVhaworICAgICAgIyBsb29rIGZvciBhIGZyZXNobHkgYnVpbHQgZHluYW1pY2FsbHkgbGlua2VkIGxpYnJhcnkKKyAgICAgIGVsaWYgdGVzdCAtZiAiJGkvbGlidGNsLnNvIiA7IHRoZW4KKyAgICAgICAgYWNfY3ZfY190Y2xsaWI9YChjZCAkaTsgcHdkKWAvbGlidGNsLnNvCisJYnJlYWsKKworICAgICAgIyB0aGVuIGxvb2sgZm9yIGEgZnJlc2hseSBidWlsdCBzdGF0aWNhbGx5IGxpbmtlZCBsaWJyYXJ5CisgICAgICAjIGlmIE1ha2VmaWxlIGV4aXN0cyB3ZSBhc3N1bWUgaXRzIGNvbmZpZ3VyZWQgYW5kIGxpYnRjbCB3aWxsIGJlCisgICAgICAjIGJ1aWx0IGZpcnN0LgorICAgICAgZWxpZiB0ZXN0IC1mICIkaS9saWJ0Y2wuYSIgLW8gLWYgIiRpL01ha2VmaWxlIiA7IHRoZW4KKyAgICAgICAgYWNfY3ZfY190Y2xsaWI9YChjZCAkaTsgcHdkKWAvbGlidGNsLmEKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpCisgICMgY2hlY2sgaW4gYSBmZXcgY29tbW9uIGluc3RhbGwgbG9jYXRpb25zCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsbGlifSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluIGBscyAtZCAke3ByZWZpeH0vbGliIC91c3IvbG9jYWwvbGliIDI+L2Rldi9udWxsYCA7IGRvCisgICAgICAjIGZpcnN0IGxvb2sgZm9yIGEgZnJlc2hseSBidWlsdCBkeW5hbWljYWxseSBsaW5rZWQgbGlicmFyeQorICAgICAgaWYgdGVzdCAtZiAiJGkvbGliJGluc3RhbGxlZHRjbGxpYnJvb3Quc28iIDsgdGhlbgorICAgICAgICBhY19jdl9jX3RjbGxpYj1gKGNkICRpOyBwd2QpYC9saWIkaW5zdGFsbGVkdGNsbGlicm9vdC5zbworCWJyZWFrCisgICAgICAjIHRoZW4gbG9vayBmb3IgYSBmcmVzaGx5IGJ1aWx0IHN0YXRpY2FsbHkgbGlua2VkIGxpYnJhcnkKKyAgICAgICMgaWYgTWFrZWZpbGUgZXhpc3RzIHdlIGFzc3VtZSBpdHMgY29uZmlndXJlZCBhbmQgbGlidGNsIHdpbGwgYmUgYnVpbHQgZmlyc3QuCisgICAgICBlbGlmIHRlc3QgLWYgIiRpL2xpYiRpbnN0YWxsZWR0Y2xsaWJyb290LmEiIC1vIC1mICIkaS9NYWtlZmlsZSIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfdGNsbGliPWAoY2QgJGk7IHB3ZClgL2xpYiRpbnN0YWxsZWR0Y2xsaWJyb290LmEKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpCisgICMgY2hlY2sgaW4gYSBmZXcgb3RoZXIgcHJpdmF0ZSBsb2NhdGlvbnMKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xsaWJ9IiA9IHggOyB0aGVuCisgICAgZm9yIGkgaW4gXAorCQkke3NyY2Rpcn0vLi4vdGNsIFwKKwkJYGxzIC1kciAke3NyY2Rpcn0vLi4vdGNsW1swLTldXSogMj4vZGV2L251bGxgIDsgZG8KKyAgICAgICMgVGNsIDcuNSBhbmQgZ3JlYXRlciBwdXRzIGxpYnJhcnkgaW4gc3ViZGlyLiAgTG9vayB0aGVyZSBmaXJzdC4KKyAgICAgIGlmIHRlc3QgLWYgIiRpL3VuaXgvbGlidGNsLnNvIiA7IHRoZW4KKwkgYWNfY3ZfY190Y2xsaWI9YChjZCAkaTsgcHdkKWAvdW5peC9saWJ0Y2wuc28KKwkgYnJlYWsKKyAgICAgIGVsaWYgdGVzdCAtZiAiJGkvdW5peC9saWJ0Y2wuYSIgLW8gLWYgIiRpL3VuaXgvTWFrZWZpbGUiOyB0aGVuCisJIGFjX2N2X2NfdGNsbGliPWAoY2QgJGk7IHB3ZClgL3VuaXgvbGlidGNsLmEKKwkgYnJlYWsKKyAgICAgICMgbG9vayBmb3IgYSBmcmVzaGx5IGJ1aWx0IGR5bmFtaWNhbGx5IGxpbmtlZCBsaWJyYXJ5CisgICAgICBlbGlmIHRlc3QgLWYgIiRpL2xpYnRjbC5zbyIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfdGNsbGliPWAoY2QgJGk7IHB3ZClgL2xpYnRjbC5zbworCWJyZWFrCisKKyAgICAgICMgdGhlbiBsb29rIGZvciBhIGZyZXNobHkgYnVpbHQgc3RhdGljYWxseSBsaW5rZWQgbGlicmFyeQorICAgICAgIyBpZiBNYWtlZmlsZSBleGlzdHMgd2UgYXNzdW1lIGl0cyBjb25maWd1cmVkIGFuZCBsaWJ0Y2wgd2lsbCBiZQorICAgICAgIyBidWlsdCBmaXJzdC4KKyAgICAgIGVsaWYgdGVzdCAtZiAiJGkvbGlidGNsLmEiIC1vIC1mICIkaS9NYWtlZmlsZSIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfdGNsbGliPWAoY2QgJGk7IHB3ZClgL2xpYnRjbC5hCisJYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaQorCisgICMgc2VlIGlmIG9uZSBpcyBjb252ZW5pZW50bHkgaW5zdGFsbGVkIHdpdGggdGhlIGNvbXBpbGVyCisgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsbGlifSIgPSB4IDsgdGhlbgkKKyAgICBvcmlnX2xpYnM9IiRMSUJTIgorICAgIExJQlM9IiRMSUJTIC1sJGluc3RhbGxlZHRjbGxpYnJvb3QgLWxtIiAgICAKKyAgICBBQ19UUllfUlVOKFsKKyAgICBUY2xfQXBwSW5pdCgpCisgICAgeyBleGl0KDApOyB9XSwgYWNfY3ZfY190Y2xsaWI9Ii1sJGluc3RhbGxlZHRjbGxpYnJvb3QiLCBhY19jdl9jX3RjbGxpYj0iIgorICAgICwgYWNfY3ZfY190Y2xpYj0iLWwkaW5zdGFsbGVkdGNsbGlicm9vdCIpCisgICAgTElCUz0iJHtvcmlnX2xpYnN9IgorICAgZmkKKyAgXSkKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xsaWJ9IiA9IHggOyB0aGVuCisgICAgVENMTElCPSIjIG5vIFRjbCBsaWJyYXJ5IGZvdW5kIgorICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgVGNsIGxpYnJhcnkpCisgIGVsc2UKKyAgICBUQ0xMSUI9JHthY19jdl9jX3RjbGxpYn0KKyAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICRUQ0xMSUIpCisgICAgbm9fdGNsPQorICBmaQorZmkKKworQUNfUFJPVklERShbJDBdKQorQUNfU1VCU1QoVENMTElCKQorXSkKK0FDX0RFRlVOKENZX0FDX1BBVEhfVEtILCBbCisjCisjIE9rLCBsZXRzIGZpbmQgdGhlIHRrIHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBoZWFkZXJzCisjIElmIHRoZSBkaXJlY3RvcnkgKHByZXN1bWFibHkgc3ltbGluaykgbmFtZWQgInRrIiBleGlzdHMsIHVzZSB0aGF0IG9uZQorIyBpbiBwcmVmZXJlbmNlIHRvIGFueSBvdGhlcnMuICBTYW1lIGxvZ2ljIGlzIHVzZWQgd2hlbiBjaG9vc2luZyBsaWJyYXJ5CisjIGFuZCBhZ2FpbiB3aXRoIFRjbC4gVGhlIHNlYXJjaCBvcmRlciBpcyB0aGUgYmVzdCBwbGFjZSB0byBsb29rIGZpcnN0LCB0aGVuIGluCisjIGRlY3JlYXNpbmcgc2lnbmlmaWNhbmNlLiBUaGUgbG9vcCBicmVha3MgaWYgdGhlIHRyaWdnZXIgZmlsZSBpcyBmb3VuZC4KKyMgTm90ZSB0aGUgZ3Jvc3MgbGl0dGxlIGNvbnZlcnNpb24gaGVyZSBvZiBzcmNkaXIgYnkgY2QnaW5nIHRvIHRoZSBmb3VuZAorIyBkaXJlY3RvcnkuIFRoaXMgY29udmVydHMgdGhlIHBhdGggZnJvbSBhIHJlbGF0aXZlIHRvIGFuIGFic29sdXRlLCBzbworIyByZWN1cnNpdmUgY2FjaGUgdmFyaWFibGVzIGZvciB0aGUgcGF0aCB3aWxsIHdvcmsgcmlnaHQuIFdlIGNoZWNrIGFsbAorIyB0aGUgcG9zc2libGUgcGF0aHMgaW4gb25lIGxvb3AgcmF0aGVyIHRoYW4gbWFueSBzZXBlcmF0ZSBsb29wcyB0byBzcGVlZAorIyB0aGluZ3MgdXAuCisjIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLXRraW5jbHVkZQorIworQUNfTVNHX0NIRUNLSU5HKGZvciBUayBwcml2YXRlIGhlYWRlcnMpCitBQ19BUkdfV0lUSCh0a2luY2x1ZGUsIFsgIC0td2l0aC10a2luY2x1ZGUgICAgICAgIGRpcmVjdG9yeSB3aGVyZSB0aGUgdGsgcHJpdmF0ZSBoZWFkZXJzIGFyZV0sCisgICAgICAgICAgICB3aXRoX3RraW5jbHVkZT0ke3dpdGh2YWx9KQorbm9fdGs9dHJ1ZQorQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGtoLFsKKyMgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC10a2luY2x1ZGUgd2FzIHNwZWNpZmllZAoraWYgdGVzdCB4IiR7d2l0aF90a2luY2x1ZGV9IiAhPSB4IDsgdGhlbgorICBpZiB0ZXN0IC1mICR7d2l0aF90a2luY2x1ZGV9L3RrLmggOyB0aGVuCisgICAgYWNfY3ZfY190a2g9YChjZCAke3dpdGhfdGtpbmNsdWRlfTsgcHdkKWAKKyAgZWxzZQorICAgIEFDX01TR19FUlJPUihbJHt3aXRoX3RraW5jbHVkZX0gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBwcml2YXRlIGhlYWRlcnNdKQorICBmaQorZmkKKyMgbmV4dCBjaGVjayBpbiBwcml2YXRlIHNvdXJjZSBkaXJlY3RvcnkKKyMKKyMgc2luY2UgbHMgcmV0dXJucyBsb3dlc3QgdmVyc2lvbiBudW1iZXJzIGZpcnN0LCByZXZlcnNlIHRoZSBlbnRpcmUgbGlzdAorIyBhbmQgc2VhcmNoIGZvciB0aGUgd29yc3QgZml0LCBvdmVyd3JpdGluZyBpdCB3aXRoIGJldHRlciBmaXRzIGFzIHdlIGZpbmQgdGhlbQoraWYgdGVzdCB4IiR7YWNfY3ZfY190a2h9IiA9IHggOyB0aGVuCisgIGZvciBpIGluIFwKKwkJJHtzcmNkaXJ9Ly4uL3RrIFwKKwkJYGxzIC1kciAke3NyY2Rpcn0vLi4vdGtbWzAtOV1dKiAyPi9kZXYvbnVsbGAgXAorCQkke3NyY2Rpcn0vLi4vLi4vdGsgXAorCQlgbHMgLWRyICR7c3JjZGlyfS8uLi8uLi90a1tbMC05XV0qIDI+L2Rldi9udWxsYCBcCisJCSR7c3JjZGlyfS8uLi8uLi8uLi90ayBcCisJCWBscyAtZHIgJHtzcmNkaXJ9Ly4uLy4uLy4uL3RrW1swLTldXSogMj4vZGV2L251bGwgYCA7IGRvCisgICAgaWYgdGVzdCAtZiAkaS90ay5oIDsgdGhlbgorICAgICAgYWNfY3ZfY190a2g9YChjZCAkaTsgcHdkKWAKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgICAjIFRrIDQuMSBhbmQgZ3JlYXRlciBwdXRzIHRoaXMgaW4gYSBzdWJkaXIuCisgICAgaWYgdGVzdCAtZiAkaS9nZW5lcmljL3RrLmg7IHRoZW4KKyAgICAgICBhY19jdl9jX3RraD1gKGNkICRpOyBwd2QpYC9nZW5lcmljCisgICAgZmkKKyAgZG9uZQorZmkKKyMgZmluYWxseSBjaGVjayBpbiBhIGZldyBjb21tb24gaW5zdGFsbCBsb2NhdGlvbnMKKyMKKyMgc2luY2UgbHMgcmV0dXJucyBsb3dlc3QgdmVyc2lvbiBudW1iZXJzIGZpcnN0LCByZXZlcnNlIHRoZSBlbnRpcmUgbGlzdAorIyBhbmQgc2VhcmNoIGZvciB0aGUgd29yc3QgZml0LCBvdmVyd3JpdGluZyBpdCB3aXRoIGJldHRlciBmaXRzIGFzIHdlIGZpbmQgdGhlbQoraWYgdGVzdCB4IiR7YWNfY3ZfY190a2h9IiA9IHggOyB0aGVuCisgIGZvciBpIGluIFwKKwkJYGxzIC1kciAvdXNyL2xvY2FsL3NyYy90a1tbMC05XV0qIDI+L2Rldi9udWxsYCBcCisJCWBscyAtZHIgL3Vzci9sb2NhbC9saWIvdGtbWzAtOV1dKiAyPi9kZXYvbnVsbGAgXAorCQkvdXNyL2xvY2FsL3NyYy90ayBcCisJCS91c3IvbG9jYWwvbGliL3RrIFwKKwkJJHtwcmVmaXh9L2luY2x1ZGUgOyBkbworICAgIGlmIHRlc3QgLWYgJGkvdGsuaCA7IHRoZW4KKyAgICAgIGFjX2N2X2NfdGtoPWAoY2QgJGk7IHB3ZClgCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKK2ZpCisjIHNlZSBpZiBvbmUgaXMgaW5zdGFsbGVkCitpZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iID0geCA7IHRoZW4KKyAgQUNfSEVBREVSX0NIRUNLKHRrLmgsIGFjX2N2X2NfdGtoPWluc3RhbGxlZCkKK2ZpCitdKQoraWYgdGVzdCB4IiR7YWNfY3ZfY190a2h9IiAhPSB4IDsgdGhlbgorICBub190az0iIgorICBpZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iID0geCJpbnN0YWxsZWQiIDsgdGhlbgorICAgIEFDX01TR19SRVNVTFQoW2lzIGluc3RhbGxlZF0pCisgICAgVEtIRElSPSIiCisgIGVsc2UKKyAgICBBQ19NU0dfUkVTVUxUKFtmb3VuZCBpbiAkYWNfY3ZfY190a2hdKQorICAgICMgdGhpcyBoYWNrIGlzIGNhdXNlIHRoZSBUS0hESVIgd29uJ3QgcHJpbnQgaWYgdGhlcmUgaXMgYSAiLUkiIGluIGl0LgorICAgIFRLSERJUj0iLUkke2FjX2N2X2NfdGtofSIKKyAgZmkKK2Vsc2UKKyAgVEtIRElSPSIjIG5vIFRrIGRpcmVjdG9yeSBmb3VuZCIKKyAgQUNfTVNHX1dBUk4oW0Nhbid0IGZpbmQgVGsgcHJpdmF0ZSBoZWFkZXJzXSkKKyAgbm9fdGs9dHJ1ZQorZmkKKworIyBpZiBUayBpcyBpbnN0YWxsZWQsIGV4dHJhY3QgdGhlIG1ham9yL21pbm9yIHZlcnNpb24KK2lmIHRlc3QgeCIke25vX3RrfSIgPSB4IDsgdGhlbgorQUNfTVNHX0NIRUNLSU5HKFtUayB2ZXJzaW9uXSkKK29yaWdfaW5jbHVkZXM9IiRDUFBGTEFHUyIKKworaWYgdGVzdCB4IiR7VENMSERJUn0iICE9IHggOyB0aGVuCisgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJFRDTEhESVIiCitmaQoraWYgdGVzdCB4IiR7VEtIRElSfSIgIT0geCA7IHRoZW4KKyAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkVEtIRElSIgorZmkKK2lmIHRlc3QgeCIke3hfaW5jbHVkZXN9IiAhPSB4IC1hIHgiJHt4X2luY2x1ZGVzfSIgIT0geE5PTkUgOyB0aGVuCisgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkeF9pbmNsdWRlcyIKK2ZpCisKKyMgR2V0IG1ham9yIGFuZCBtaW5vciB2ZXJzaW9ucyBvZiBUay4gIFVzZSBmdW5ueSBuYW1lcyB0byBhdm9pZAorIyBjbGFzaGVzIHdpdGggZWcgU3VuT1MuCitjYXQgPiBjb25mdGVzdC5jIDw8J0VPRicKKyNpbmNsdWRlICJ0ay5oIgorTWFKb3IgPSBUS19NQUpPUl9WRVJTSU9OCitNaU5vciA9IFRLX01JTk9SX1ZFUlNJT04KK0VPRgorCit0a21ham9yPQordGttaW5vcj0KK2lmIChldmFsICIkQ1BQICRDUFBGTEFHUyBjb25mdGVzdC5jIikgMj4vZGV2L251bGwgPmNvbmZ0ZXN0Lm91dDsgdGhlbgorICAgIyBTdWNjZXNzLgorICAgdGttYWpvcj1gZWdyZXAgJ15NYUpvciA9ICcgY29uZnRlc3Qub3V0IHwgc2VkIC1lICdzL15NYUpvciA9ICovLycgLWUgJ3MvICokLy8nYAorICAgdGttaW5vcj1gZWdyZXAgJ15NaU5vciA9ICcgY29uZnRlc3Qub3V0IHwgc2VkIC1lICdzL15NaU5vciA9ICovLycgLWUgJ3MvICokLy8nYAorZmkKK3JtIC1mIGNvbmZ0ZXN0LmMgY29uZnRlc3Qub3V0CisKK2lmIHRlc3QgLXogIiR0a21ham9yIiB8fCB0ZXN0IC16ICIkdGttaW5vciI7IHRoZW4KKyAgIEFDX01TR19SRVNVTFQoW2ZhdGFsIGVycm9yOiBjb3VsZCBub3QgZmluZCBtYWpvciBvciBtaW5vciB2ZXJzaW9uIG51bWJlciBvZiBUa10pCisgICBleGl0IDEKK2ZpCitBQ19NU0dfUkVTVUxUKCR7dGttYWpvcn0uJHt0a21pbm9yfSkKKworQ1BQRkxBR1M9IiR7b3JpZ19pbmNsdWRlc30iCitmaQorCitBQ19QUk9WSURFKFskMF0pCitBQ19TVUJTVChUS0hESVIpCitdKQorQUNfREVGVU4oQ1lfQUNfUEFUSF9US0xJQiwgWworQUNfUkVRVUlSRShbQ1lfQUNfUEFUSF9UQ0xdKQorIworIyBPaywgbGV0cyBmaW5kIHRoZSB0ayBsaWJyYXJ5CisjIEZpcnN0LCBsb29rIGZvciB0aGUgbGF0ZXN0IHByaXZhdGUgKHVuaW5zdGFsbGVkKSBjb3B5CisjIE5vdGljZSB0aGF0IHRoZSBkZXN0aW5hdGlvbnMgaW4gYmFja3dhcmRzIHByaW9yaXR5IHNpbmNlIHRoZSB0ZXN0cyBoYXZlCisjIG5vIGJyZWFrLgorIyBUaGVuIHdlIGxvb2sgZm9yIGVpdGhlciAuYSwgLnNvLCBvciBNYWtlZmlsZS4gIEEgTWFrZWZpbGUgaXMgYWNjZXB0YWJsZQorIyBpcyBpdCBpbmRpY2F0ZXMgdGhlIHRhcmdldCBoYXMgYmVlbiBjb25maWd1cmVkIGFuZCB3aWxsIChwcm9iYWJseSkKKyMgc29vbiBiZSBidWlsdC4gIFRoaXMgYWxsb3dzIGFuIGVudGlyZSB0cmVlIG9mIFRjbCBzb2Z0d2FyZSB0byBiZQorIyBjb25maWd1cmVkIGF0IG9uY2UgYW5kIHRoZW4gYnVpbHQuCisjIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLXRrbGliCisjCisKK2lmIHRlc3QgeCIke25vX3RrfSIgPSB4IDsgdGhlbgorICAjIHJlc2V0IG5vX3RrIGluY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQorICBub190az0idHJ1ZSIKKworICBpZiB0ZXN0ICR0a21ham9yIC1nZSA0IDsgdGhlbgorICAgIGluc3RhbGxlZHRrbGlicm9vdD10ayR0a3ZlcnNpb24KKyAgZWxzZQorICAgIGluc3RhbGxlZHRrbGxpYnJvb3Q9dGsKKyAgZmkKKworICBBQ19BUkdfV0lUSCh0a2xpYiwgWyAgLS13aXRoLXRrbGliICAgICAgICAgICAgZGlyZWN0b3J5IHdoZXJlIHRoZSB0ayBsaWJyYXJ5IGlzXSwKKyAgICAgICAgICAgICAgd2l0aF90a2xpYj0ke3dpdGh2YWx9KQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBUayBsaWJyYXJ5XSkKKyAgQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGtsaWIsWworICAjIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGtsaWIgd2FzIHNwZWNpZmllZAorICAjIFRoaXMgcmVxdWlyZXMgY2hlY2tpbmcgZm9yIGJvdGggdGhlIGluc3RhbGxlZCBhbmQgdW5pbnN0YWxsZWQgbmFtZS1zdHlsZXMKKyAgIyBzaW5jZSB3ZSBoYXZlIG5vIGlkZWEgaWYgaXQncyBpbnN0YWxsZWQgb3Igbm90LgorICBpZiB0ZXN0IHgiJHt3aXRoX3RrbGlifSIgIT0geCA7IHRoZW4KKyAgICBpZiB0ZXN0IC1mICIke3dpdGhfdGtsaWJ9L2xpYiRpbnN0YWxsZWR0a2xpYnJvb3Quc28iIDsgdGhlbgorICAgICAgYWNfY3ZfY190a2xpYj1gKGNkICR7d2l0aF90a2xpYn07IHB3ZClgL2xpYiRpbnN0YWxsZWR0a2xpYnJvb3Quc28KKyAgICAgIG5vX3RrPSIiCisgICAgZWxpZiB0ZXN0IC1mICIke3dpdGhfdGtsaWJ9L2xpYnRrLnNvIiA7IHRoZW4KKyAgICAgIGFjX2N2X2NfdGtsaWI9YChjZCAke3dpdGhfdGtsaWJ9OyBwd2QpYC9saWJ0ay5zbworICAgICAgbm9fdGs9IiIKKyAgICAjIHRoZW4gbG9vayBmb3IgYSBmcmVzaGx5IGJ1aWx0IHN0YXRpY2FsbHkgbGlua2VkIGxpYnJhcnkKKyAgICAjIGlmIE1ha2VmaWxlIGV4aXN0cyB3ZSBhc3N1bWUgaXRzIGNvbmZpZ3VyZWQgYW5kIGxpYnRrIHdpbGwgYmUgYnVpbHQKKyAgICBlbGlmIHRlc3QgLWYgIiR7d2l0aF90a2xpYn0vbGliJGluc3RhbGxlZHRrbGlicm9vdC5hIiA7IHRoZW4KKyAgICAgIGFjX2N2X2NfdGtsaWI9YChjZCAke3dpdGhfdGtsaWJ9OyBwd2QpYC9saWIkaW5zdGFsbGVkdGtsaWJyb290LmEKKyAgICAgIG5vX3RrPSIiCisgICAgZWxpZiB0ZXN0IC1mICIke3dpdGhfdGtsaWJ9L2xpYnRrLmEiIDsgdGhlbgorICAgICAgYWNfY3ZfY190a2xpYj1gKGNkICR7d2l0aF90a2xpYn07IHB3ZClgL2xpYnRrLmEKKyAgICAgIG5vX3RrPSIiCisgICAgZWxzZQorICAgICAgQUNfTVNHX0VSUk9SKFske3dpdGhfdGtsaWJ9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gbGlicmFyaWVzXSkKKyAgICBmaQorICBmaQorICAjIHRoZW4gY2hlY2sgZm9yIGEgcHJpdmF0ZSBUayBsaWJyYXJ5CisgICMgU2luY2UgdGhlc2UgYXJlIHVuaW5zdGFsbGVkLCB1c2UgdGhlIHNpbXBsZSBsaWIgbmFtZSByb290LgorICBpZiB0ZXN0IHgiJHthY19jdl9jX3RrbGlifSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluIFwKKwkJLi4vdGsgXAorCQlgbHMgLWRyIC4uL3RrW1swLTldXSogMj4vZGV2L251bGxgIFwKKwkJLi4vLi4vdGsgXAorCQlgbHMgLWRyIC4uLy4uL3RrW1swLTldXSogMj4vZGV2L251bGxgIFwKKwkJLi4vLi4vLi4vdGsgXAorCQlgbHMgLWRyIC4uLy4uLy4uL3RrW1swLTldXSogMj4vZGV2L251bGxgIDsgZG8KKyAgICAgICMgVGsgNC4xIGFuZCBncmVhdGVyIHB1dHMgdGhpbmdzIGluIHN1YmRpcnMuICBDaGVjayB0aGVzZSBmaXJzdC4KKyAgICAgIGlmIHRlc3QgLWYgIiRpL3VuaXgvbGlidGsuc28iIDsgdGhlbgorCSBhY19jdl9jX3RrbGliPWAoY2QgJGk7IHB3ZClgL3VuaXgvbGlidGsuc28KKwkgbm9fdGs9CisJIGJyZWFrCisgICAgICBlbGlmIHRlc3QgLWYgIiRpL3VuaXgvbGlidGsuYSIgLW8gLWYgIiRpL3VuaXgvTWFrZWZpbGUiOyB0aGVuCisJIGFjX2N2X2NfdGtsaWI9YChjZCAkaTsgcHdkKWAvdW5peC9saWJ0ay5hCisJIG5vX3RrPQorCSBicmVhaworICAgICAgIyBsb29rIGZvciBhIGZyZXNobHkgYnVpbHQgZHluYW1pY2FsbHkgbGlua2VkIGxpYnJhcnkKKyAgICAgIGVsaWYgdGVzdCAtZiAiJGkvbGlidGsuc28iIDsgdGhlbgorICAgICAgICBhY19jdl9jX3RrbGliPWAoY2QgJGk7IHB3ZClgL2xpYnRrLnNvCisgICAgICAgIG5vX3RrPQorCWJyZWFrCisgICAgICAjIHRoZW4gbG9vayBmb3IgYSBmcmVzaGx5IGJ1aWx0IHN0YXRpY2FsbHkgbGlua2VkIGxpYnJhcnkKKyAgICAgICMgaWYgTWFrZWZpbGUgZXhpc3RzIHdlIGFzc3VtZSBpdHMgY29uZmlndXJlZCBhbmQgbGlidGsgd2lsbCBiZSBidWlsdCAKKyAgICAgIGVsaWYgdGVzdCAtZiAiJGkvbGlidGsuYSIgLW8gLWYgIiRpL01ha2VmaWxlIiA7IHRoZW4KKyAgICAgICAgYWNfY3ZfY190a2xpYj1gKGNkICRpOyBwd2QpYC9saWJ0ay5hCisgICAgICAgIG5vX3RrPSIiCisgCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgIyBmaW5hbGx5IGNoZWNrIGluIGEgZmV3IGNvbW1vbiBpbnN0YWxsIGxvY2F0aW9ucworICBpZiB0ZXN0IHgiJHthY19jdl9jX3RrbGlifSIgPSB4IDsgdGhlbgorICAgIGZvciBpIGluIGBscyAtZCAke3ByZWZpeH0vbGliIC91c3IvbG9jYWwvbGliIDI+L2Rldi9udWxsYCA7IGRvCisgICAgICAjIGZpcnN0IGxvb2sgZm9yIGEgZnJlc2hseSBidWlsdCBkeW5hbWljYWxseSBsaW5rZWQgbGlicmFyeQorICAgICAgaWYgdGVzdCAtZiAiJGkvbGliJGluc3RhbGxlZHRrbGlicm9vdC5zbyIgOyB0aGVuCisgICAgICAgIGFjX2N2X2NfdGtsaWI9YChjZCAkaTsgcHdkKWAvbGliJGluc3RhbGxlZHRrbGlicm9vdC5zbworICAgICAgICBub190az0iIgorCWJyZWFrCisgICAgICAjIHRoZW4gbG9vayBmb3IgYSBmcmVzaGx5IGJ1aWx0IHN0YXRpY2FsbHkgbGlua2VkIGxpYnJhcnkKKyAgICAgICMgaWYgTWFrZWZpbGUgZXhpc3RzLCB3ZSBhc3N1bWUgaXQncyBjb25maWd1cmVkIGFuZCBsaWJ0Y2wgd2lsbCBiZSBidWlsdCAKKyAgICAgIGVsaWYgdGVzdCAtZiAiJGkvbGliJGluc3RhbGxlZHRrbGlicm9vdC5hIiAtbyAtZiAiJGkvTWFrZWZpbGUiIDsgdGhlbgorICAgICAgICBhY19jdl9jX3RrbGliPWAoY2QgJGk7IHB3ZClgL2xpYiRpbnN0YWxsZWR0a2xpYnJvb3QuYQorICAgICAgICBub190az0iIgorIAlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpCisgICMgY2hlY2sgaW4gYSBmZXcgb3RoZXIgcHJpdmF0ZSBsb2NhdGlvbnMKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2xpYn0iID0geCA7IHRoZW4KKyAgICBmb3IgaSBpbiBcCisJCSR7c3JjZGlyfS8uLi90ayBcCisJCWBscyAtZHIgJHtzcmNkaXJ9Ly4uL3RrW1swLTldXSogMj4vZGV2L251bGxgIDsgZG8KKyAgICAgICMgVGsgNC4xIGFuZCBncmVhdGVyIHB1dHMgdGhpbmdzIGluIHN1YmRpcnMuICBDaGVjayB0aGVzZSBmaXJzdC4KKyAgICAgIGlmIHRlc3QgLWYgIiRpL3VuaXgvbGlidGsuc28iIDsgdGhlbgorCSBhY19jdl9jX3RrbGliPWAoY2QgJGk7IHB3ZClgL3VuaXgvbGlidGsuc28KKwkgbm9fdGs9CisJIGJyZWFrCisgICAgICBlbGlmIHRlc3QgLWYgIiRpL3VuaXgvbGlidGsuYSIgLW8gLWYgIiRpL3VuaXgvTWFrZWZpbGUiOyB0aGVuCisJIGFjX2N2X2NfdGNsbGliPWAoY2QgJGk7IHB3ZClgL3VuaXgvbGlidGsuYQorCSBub190az0KKwkgYnJlYWsKKyAgICAgICMgbG9vayBmb3IgYSBmcmVzaGx5IGJ1aWx0IGR5bmFtaWNhbGx5IGxpbmtlZCBsaWJyYXJ5CisgICAgICBlbGlmIHRlc3QgLWYgIiRpL2xpYnRrLnNvIiA7IHRoZW4KKyAgICAgICAgYWNfY3ZfY190a2xpYj1gKGNkICRpOyBwd2QpYC9saWJ0ay5zbworICAgICAgICBub190az0iIgorCWJyZWFrCisgICAgICAjIHRoZW4gbG9vayBmb3IgYSBmcmVzaGx5IGJ1aWx0IHN0YXRpY2FsbHkgbGlua2VkIGxpYnJhcnkKKyAgICAgICMgaWYgTWFrZWZpbGUgZXhpc3RzLCB3ZSBhc3N1bWUgaXQncyBjb25maWd1cmVkIGFuZCBsaWJ0Y2wgd2lsbCBiZSBidWlsdCAKKyAgICAgIGVsaWYgdGVzdCAtZiAiJGkvbGlidGsuYSIgLW8gLWYgIiRpL01ha2VmaWxlIiA7IHRoZW4KKyAgICAgICAgYWNfY3ZfY190a2xpYj1gKGNkICRpOyBwd2QpYC9saWJ0ay5hCisgICAgICAgIG5vX3RrPSIiCisgCWJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKyAgIyBzZWUgaWYgb25lIGlzIGNvbnZlbmllbnRseSBpbnN0YWxsZWQgd2l0aCB0aGUgY29tcGlsZXIKKyAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2xpYn0iID0geCA7IHRoZW4KKyAgICAgICBBQ19SRVFVSVJFKFtBQ19QQVRIX1hdKQorICAgICAgIG9yaWdfbGlicz0iJExJQlMiCisgICAgICAgTElCUz0iJExJQlMgLWwkaW5zdGFsbGVkdGtsaWJyb290ICR4X2xpYnJhcmllcyAkYWNfY3ZfY190Y2xsaWIgLWxtIiAgICAKKyAgICAgICBBQ19UUllfUlVOKFsKKyAgICAgICBUY2xfQXBwSW5pdCgpCisgICAgICAgeyBleGl0KDApOyB9XSwgYWNfY3ZfY190a2xpYj0iLWwkaW5zdGFsbGVkdGtsaWJyb290IiwgYWNfY3ZfY190a2xpYj0iIgorICAgICAgICwgYWNfY3ZfY190a2xpYj0iLWwkaW5zdGFsbGVkdGtsaWJyb290IikKKyAgICAgICBMSUJTPSIke29yaWdfbGlic30iCisgICBmaQorICBdKQorICBpZiB0ZXN0IHgiJHthY19jdl9jX3RrbGlifSIgPSB4IDsgdGhlbgorICAgIFRLTElCPSIjIG5vIFRrIGxpYnJhcnkgZm91bmQiCisgICAgQUNfTVNHX1dBUk4oQ2FuJ3QgZmluZCBUayBsaWJyYXJ5KQorICBlbHNlCisgICAgVEtMSUI9JGFjX2N2X2NfdGtsaWIKKyAgICBBQ19NU0dfUkVTVUxUKGZvdW5kICRUS0xJQikKKyAgICBub190az0KKyAgZmkKK2ZpCitBQ19QUk9WSURFKFskMF0pCitBQ19TVUJTVChUS0xJQikKK10pCitBQ19ERUZVTihDWV9BQ19QQVRIX1RLLCBbCisgIENZX0FDX1BBVEhfVEtICisgIENZX0FDX1BBVEhfVEtMSUIKK10pCitBQ19ERUZVTihDWV9BQ19QQVRIX1RDTCwgWworICBDWV9BQ19QQVRIX1RDTEgKKyAgQ1lfQUNfUEFUSF9UQ0xMSUIKK10pCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2NvbmZpZy9hYnVnLmV4cCBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL2FidWcuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YWRlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9hYnVnLmV4cApAQCAtMCwwICsxLDIwIEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCitsb2FkX2xpYiAuLi9jb25maWcvbW9uaXRvci5leHAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL2FybS1pY2UuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvYXJtLWljZS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk4NDI3NAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL2FybS1pY2UuZXhwCkBAIC0wLDAgKzEgQEAKK2xvYWRfbGliICIuLi9jb25maWcvbW9uaXRvci5leHAiOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvY3B1MzJidWcuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvY3B1MzJidWcuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YWRlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9jcHUzMmJ1Zy5leHAKQEAgLTAsMCArMSwyMCBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworbG9hZF9saWIgLi4vY29uZmlnL21vbml0b3IuZXhwCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2NvbmZpZy9jeWdtb24uZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvY3lnbW9uLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTg0Mjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvY3lnbW9uLmV4cApAQCAtMCwwICsxIEBACitsb2FkX2xpYiAiLi4vY29uZmlnL21vbml0b3IuZXhwIjsKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL2QxMHYuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvZDEwdi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1Mjg4YwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL2QxMHYuZXhwCkBAIC0wLDAgKzEsMjAgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKK2xvYWRfbGliICIuLi9jb25maWcvbW9uaXRvci5leHAiCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2NvbmZpZy9kdmUuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvZHZlLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWE0NmMxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvZHZlLmV4cApAQCAtMCwwICsxLDIzIEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCitsb2FkX2xpYiAuLi9jb25maWcvbW9uaXRvci5leHAKK3NldCB0aW1lb3V0IDEwMDAKK3ZlcmJvc2UgIlRpbWVvdXQgaXMgbm93ICR0aW1lb3V0IHNlY29uZHMiIDIKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvZXN0LmV4cCBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL2VzdC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhZGUxMwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL2VzdC5leHAKQEAgLTAsMCArMSwyMCBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworbG9hZF9saWIgLi4vY29uZmlnL21vbml0b3IuZXhwCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2NvbmZpZy9nZGJzZXJ2ZXIuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvZ2Ric2VydmVyLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjZmNzI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvZ2Ric2VydmVyLmV4cApAQCAtMCwwICsxLDEwNCBAQAorIyBUZXN0IEZyYW1ld29yayBEcml2ZXIgZm9yIEdEQiB1c2luZyB0aGUgZXh0ZW5kZWQgZ2RiIHJlbW90ZSBwcm90b2NvbAorIyAgIENvcHlyaWdodCAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKyMKKyMgRm9yIHRoaXMgdG8gZnVuY3Rpb24gY29ycmVjdGx5LCB5b3UgbmVlZCB0byBzZXQgYSBudW1iZXIgb2YgdmFyaWFibGVzCisjIGluIHlvdXIgZ2RiL3NpdGUuZXhwIGZpbGUKKyMKKyMJc2V0IG5vYXJncyAxCQktLSB3ZSBjYW4ndCBwYXNzIGFyZ3VtZW50cyAoeWV0KQorIwlzZXQgbm9pbmZlcmlvcmlvIDEJLS0gd2UgY2FuJ3QgZ2V0IGlvIHRvL2Zyb20gdGhlIGluZmVyaW9yCisjCXNldCB0YXJnZXRob3N0IDxob3N0PgktLSBuYW1lIG9mIHRoZSByZW1vdGUgc3lzdGVtIChydW5zIGdkYnNlcnZlcikKKyMJc2V0IGRlYnVnaG9zdCA8aG9zdD4JLS0gbmFtZSBvZiB0aGUgc3lzdGVtIHJ1bm5pbmcgZ2RiCisjCXNldCBwb3J0IDxudW1iZXI+CS0tIHN0YXJ0aW5nIHBvcnQgbnVtYmVyIGZvciBjb21tdW5pY2F0aW9uCisjCXNldCBnZGJzZXJ2ZXIgPHBhdGg+CS0tIHBhdGggKG9uIHRoZSByZW1vdGUgc2lkZSkgdG8gZmluZAorIwkJCQkgICBnZGJzZXJ2ZXIKKyMgICAgICAgc2V0IHJzaCA8cGF0aD4JCS0tIHBhdGggKG9uIGRlYnVnaG9zdCBzaWRlKSB0byByc2gKKyMJc2V0IHJjcCA8cGF0aD4JCS0tIHBhdGggKG9uIGRlYnVnaG9zdCBzaWRlKSB0byByY3AKKyMJCisjIFlvdSB3aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBzcGF3biBwcm9jZXNzZXMgZnJvbSBnZGJob3N0IHRvIHJ1biBvbgorIyB0YXJnZXRob3N0IHZpYSByc2ggKHRoaXMgaXMgaG93IHdlIHN0YXJ0IGdkYnNlcnZlcik7IHNpbWlsYXJseQorIyB5b3UgbmVlZCB0byBiZSBhYmxlIHRvIHJjcCBmaWxlcyBmcm9tIGdkYmhvc3QgdG8gdGFyZ2V0aG9zdC4KKyMKKyMgV2UgZG9uJ3QgZG8gbXVjaCBlcnJvciBjaGVja2luZywgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcsIHlvdSdsbCBwcm9iYWJseQorIyBqdXN0IGdldCBhIHRjbCBlcnJvciBhbmQgZXZlcnl0aGluZyB3aWxsIGRpZS4gIEZJWE1FCisjCisKKyMgTG9hZCB0aGUgYmFzaWMgZ2RiIHRlc3RpbmcgbGlicmFyeQorbG9hZF9saWIgZ2RiLmV4cAorbG9hZF9saWIgbW9uaXRvci5leHAKKworIworIyBnZGJfbG9hZCAtLSBsb2FkIGEgZmlsZSBpbnRvIHRoZSBkZWJ1Z2dlci4KKyMgICAgICAgICAgICAgcmV0dXJuIGEgLTEgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4KKyMKKyMgTG9hZGluZyBhIGZpbGUgaW4gdGhlIGdkYnNyZXZlciBmcmFtZXdvcmsgaXMgYSBsaXR0bGUgc3RyYW5nZSBpbiB0aGF0CisjIHdlIGFsc28gY3JlYXRlIHRoZSBpbmZlcmlvciAod2hpY2ggaXMgc3RvcHBlZCBhdCB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24KKyMgaW4gdGhlIHByb2dyYW0gd2hlbiB3ZSBnZXQgY29udHJvbCkuCisjCitwcm9jIGdkYl9sb2FkIHsgYXJnIH0geworICAgIGdsb2JhbCB2ZXJib3NlCisgICAgZ2xvYmFsIGxvYWRwYXRoCisgICAgZ2xvYmFsIGxvYWRmaWxlCisgICAgZ2xvYmFsIEdEQgorICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGRlYnVnaG9zdAorICAgIGdsb2JhbCBwb3J0CisKKyAgICAjIGJ1bXAgdGhlIHBvcnQgbnVtYmVyIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIGh1bmcgcG9ydHMKKyAgICBzZXQgdGFyZ2V0aG9zdCBbdGFyZ2V0X2luZm8gZ2RiX3NlcnZlcl9ob3N0XTsKKyAgICBzZXQgZGVidWdob3N0IFt0YXJnZXRfaW5mbyBnZGJfZGVidWdfaG9zdF07CisgICAgaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGJfc2VydmVyX3Byb2ddIHsKKwlzZXQgZ2Ric2VydmVyIFt0YXJnZXRfaW5mbyBnZGJfc2VydmVyX3Byb2ddOworICAgIH0gZWxzZSB7CisJc2V0IGdkYnNlcnZlciAiZ2Ric2VydmVyIjsKKyAgICB9CisgICAgaW5jciBwb3J0CisgICAgc2V0IHNlcmlhbHBvcnQgJHRhcmdldGhvc3Q6JHBvcnQKKyAgICAgCisgICAgIyBDb3B5IHRoZSBmaWxlIGRvd24gdG8gdGhlIHJlbW90ZSBob3N0LgorICAgIHNldCBmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCAkYXJnXTsKKworICAgICMgbm93IHN0YXJ0IGdkYnNlcnZlciBvbiB0aGUgcmVtb3RlIHNpZGUKKyAgICByZW1vdGVfc3Bhd24gaG9zdCAiJGdkYnNlcnZlciAkZGVidWdob3N0OiRwb3J0ICRmaWxlID4mIC9kZXYvbnVsbCA8IC9kZXYvbnVsbCIKKyAKKyAgICAjIGdpdmUgaXQgcGxlbnR5IG9mIHRpbWUgdG8gZ2V0IGdvaW5nIChseW54KQorICAgIHNsZWVwIDMwCisKKyAgICAjIHRlbGwgZ2RiIHdlIGFyZSByZW1vdGUgZGVidWdnaW5nCisgICAgaWYgW2dkYl90YXJnZXRfbW9uaXRvciAkYXJnXSB7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAxCit9CisKKyMKKyMgZ2RiX3N0YXJ0IC0tIHN0YXJ0IEdEQiBydW5uaW5nLgorIworcHJvYyBnZGJfc3RhcnQgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgIyBkbyB0aGUgdXN1YWwgc3R1ZmYKKyAgICBjYXRjaCBkZWZhdWx0X2dkYl9zdGFydAorCisgICAgIyBGSVhNRTogVGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5LCBidXQgbG90cyBvZiBQQSB0ZXN0cyBmYWlsCisgICAgIyB3aXRob3V0IGl0LgorICAgIHNlbmQgInNldCByZW1vdGVjYWNoZSAwXG4iCisgICAgZXhwZWN0IHsKKwktcmUgInNldCByZW1vdGVjYWNoZSAwXFtcclxuXF0rLiokZ2RiX3Byb21wdCAkIiB7fQorCWRlZmF1bHQgeyBmYWlsICJnZGJfc3RhcnQifQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL2g4MzAwLmV4cCBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL2g4MzAwLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTg0Mjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvaDgzMDAuZXhwCkBAIC0wLDAgKzEgQEAKK2xvYWRfbGliICIuLi9jb25maWcvbW9uaXRvci5leHAiOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvaG1zaXJvbS5leHAgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9obXNpcm9tLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWZjODFkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvaG1zaXJvbS5leHAKQEAgLTAsMCArMSwyMiBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBTdXBwb3J0IGZvciB0ZXN0aW5nIGFnYWluc3QgYSBIaXRhY2hpIFNIMyB0YXJnZXQgcm9tCisKK2xvYWRfbGliIC4uL2NvbmZpZy9tb25pdG9yLmV4cApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvaHBwcm8uZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvaHBwcm8uZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmY2ExNDIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9ocHByby5leHAKQEAgLTAsMCArMSwyNCBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworbG9hZF9saWIgLi4vY29uZmlnL21vbml0b3IuZXhwCisKKyMgSHBwcm8gbW9uaXRvciBpcyB2ZXJ5IHNsb3cuLi4KK3NldCB0aW1lb3V0IDU0MAordmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvaTM4Ni1ib3pvLmV4cCBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL2kzODYtYm96by5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwOTA5MwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL2kzODYtYm96by5leHAKQEAgLTAsMCArMSBAQAorbG9hZF9saWIgIi4uL2NvbmZpZy9tb25pdG9yLmV4cCIKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL2k5NjAuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvaTk2MC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhZGUxMwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL2k5NjAuZXhwCkBAIC0wLDAgKzEsMjAgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKK2xvYWRfbGliIC4uL2NvbmZpZy9tb25pdG9yLmV4cApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbTMyci1zdHViLmV4cCBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL20zMnItc3R1Yi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QwNDc4NwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL20zMnItc3R1Yi5leHAKQEAgLTAsMCArMSBAQAorbG9hZF9saWIgIi4uLy4uL3Rlc3RzdWl0ZS9jb25maWcvc3BhcmNsZXQuZXhwIgpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbTMyci5leHAgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tMzJyLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRjNmEyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbTMyci5leHAKQEAgLTAsMCArMSwyMyBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworbG9hZF9saWIgLi4vY29uZmlnL21vbml0b3IuZXhwCitzZXQgdGltZW91dCAxMjAKK3ZlcmJvc2UgIlRpbWVvdXQgaXMgbm93ICR0aW1lb3V0IHNlY29uZHMiIDIKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbTY4ay1lbWMuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbTY4ay1lbWMuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYjhmNWUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tNjhrLWVtYy5leHAKQEAgLTAsMCArMSwxNyBAQAorbG9hZF9saWIgZ2RiLmV4cAorbG9hZF9saWIgIi4uL2NvbmZpZy9tb25pdG9yLmV4cCIKKworcHJvYyBnZGJfZW1jbGFwdG9wX2NvbW1hbmQgeyBjb21tYW5kIH0geworICAgIGdsb2JhbCBib2FyZF9pbmZvOworICAgIHNldCB0bmFtZSBbYm9hcmRfaW5mbyB0YXJnZXQgbmFtZV07CisKKyAgICBpZiAhW2luZm8gZXhpc3RzIGJvYXJkX2luZm8oJHRuYW1lLG02OGtfY29ubmVjdGVkKV0geworCW02OGtfZW1jX2JvYXJkX2Nvbm5lY3QgdGFyZ2V0OworICAgIH0KKyAgICAjIFRoaXMgaXMgYWJvdXQgYWxsIHdlIGNhbiBkbyBmb3Igbm93LiAqc2lnaCoKKyAgICBzZXQgZG9zX2hvc3QgW2JvYXJkX2luZm8gdGFyZ2V0IGRvc19ob3N0XTsKKworICAgIHJlbW90ZV9zZW5kICRkb3NfaG9zdCAiJHtjb21tYW5kfVxuIjsKKyAgICAjcmVtb3RlX2V4cGVjdCAkZG9zX2hvc3QgeworICAgICN9Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2NvbmZpZy9taXBzLWlkdC5leHAgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9taXBzLWlkdC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI2NjRkZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL21pcHMtaWR0LmV4cApAQCAtMCwwICsxLDIyIEBACisjICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBEZWphR251QGN5Z251cy5jb20KKworbG9hZF9saWIgLi4vY29uZmlnL21vbml0b3IuZXhwCisKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbWlwcy5leHAgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9taXBzLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjY2NGRmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbWlwcy5leHAKQEAgLTAsMCArMSwyMiBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgRGVqYUdudUBjeWdudXMuY29tCisKK2xvYWRfbGliIC4uL2NvbmZpZy9tb25pdG9yLmV4cAorCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL21uMTAzMDAtZXZhbC5leHAgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tbjEwMzAwLWV2YWwuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYTQ2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tbjEwMzAwLWV2YWwuZXhwCkBAIC0wLDAgKzEsMjMgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKK2xvYWRfbGliIC4uL2NvbmZpZy9tb25pdG9yLmV4cAorc2V0IHRpbWVvdXQgMTAwMAordmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tb25pdG9yLmV4cCBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL21vbml0b3IuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMzgxYTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tb25pdG9yLmV4cApAQCAtMCwwICsxLDIzMCBAQAorIyBUZXN0IEZyYW1ld29yayBEcml2ZXIgZm9yIEdEQiBkcml2aW5nIGEgUk9NIG1vbml0b3IgKHZpYSBtb25pdG9yLmMpLgorIyAgIENvcHlyaWdodCAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworbG9hZF9saWIgZ2RiLmV4cAorCisjCisjIGdkYl90YXJnZXRfbW9uaXRvcgorIyBTZXQgZ2RiIHRvIHRhcmdldCB0aGUgbW9uaXRvcgorIworcHJvYyBnZGJfdGFyZ2V0X21vbml0b3IgeyBleGVjX2ZpbGUgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgZXhpdF9zdGF0dXMKKyAgICBnbG9iYWwgdGltZW91dAorCisgICAgaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGJfcHJvdG9jb2xdIHsKKwlzZXQgdGFyZ2V0bmFtZSAiW3RhcmdldF9pbmZvIGdkYl9wcm90b2NvbF0iCisgICAgfSBlbHNlIHsKKwlwZXJyb3IgIk5vIHByb3RvY29sIHNwZWNpZmllZCBmb3IgW3RhcmdldF9pbmZvIG5hbWVdLiI7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGJhdWRdIHsKKwlnZGJfdGVzdCAic2V0IHJlbW90ZWJhdWQgW3RhcmdldF9pbmZvIGJhdWRdIiAiIiAiIgorICAgIH0KKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYl9zZXJpYWxdIHsKKyAgICAgICBzZXQgc2VyaWFscG9ydCAiW3RhcmdldF9pbmZvIGdkYl9zZXJpYWxdIjsKKyAgICB9IGVsc2VpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIG5ldHBvcnRdIHsKKwlzZXQgc2VyaWFscG9ydCAiW3RhcmdldF9pbmZvIG5ldHBvcnRdIgorICAgIH0gZWxzZSB7CisJc2V0IHNlcmlhbHBvcnQgIlt0YXJnZXRfaW5mbyBzZXJpYWxdIgorICAgIH0KKworICAgIGZvciB7c2V0IGogMX0geyRqIDw9IDJ9IHtpbmNyIGp9IHsKKwlpZiBbZ2RiX2ZpbGVfY21kICRleGVjX2ZpbGVdIHsgcmV0dXJuIC0xOyB9CisKKwlmb3Ige3NldCBpIDF9IHskaSA8PSAzfSB7aW5jciBpfSB7CisgICAgCSAgICBzZW5kX2dkYiAidGFyZ2V0ICR0YXJnZXRuYW1lICRzZXJpYWxwb3J0XG4iCisJICAgIGdkYl9leHBlY3QgNjAgeworCQktcmUgIkEgcHJvZ3JhbSBpcyBiZWluZyBkZWJ1Z2dlZCBhbHJlYWR5LippbGwgaXQuKnkgb3Igbi4gJCIgeworCQkgICAgc2VuZF9nZGIgInlcbiI7CisJCSAgICBleHBfY29udGludWU7CisJCX0KKwkJLXJlICJDb3VsZG4ndCBlc3RhYmxpc2ggY29ubmVjdGlvbiB0byByZW1vdGUuKiRnZGJfcHJvbXB0IiB7CisJCSAgICB2ZXJib3NlICJDb25uZWN0aW9uIGZhaWxlZCI7CisJCX0KKwkJLXJlICJSZW1vdGUgTUlQUyBkZWJ1Z2dpbmcuKiRnZGJfcHJvbXB0IiB7CisJCSAgICB2ZXJib3NlICJTZXQgdGFyZ2V0IHRvICR0YXJnZXRuYW1lIjsKKwkJICAgIHJldHVybiAwOworCQl9CisJCS1yZSAiUmVtb3RlIGRlYnVnZ2luZyB1c2luZyAuKiRzZXJpYWxwb3J0LiokZ2RiX3Byb21wdCIgeworCQkgICAgdmVyYm9zZSAiU2V0IHRhcmdldCB0byAkdGFyZ2V0bmFtZSI7CisJCSAgICByZXR1cm4gMDsKKwkJfQorCQktcmUgIlJlbW90ZSB0YXJnZXQgJHRhcmdldG5hbWUgY29ubmVjdGVkIHRvLiokZ2RiX3Byb21wdCIgeworCQkgICAgdmVyYm9zZSAiU2V0IHRhcmdldCB0byAkdGFyZ2V0bmFtZSI7CisJCSAgICByZXR1cm4gMDsKKwkJfQorCQktcmUgIkNvbm5lY3RlZCB0by4qJGdkYl9wcm9tcHQiIHsgCisJCSAgICB2ZXJib3NlICJTZXQgdGFyZ2V0IHRvICR0YXJnZXRuYW1lIjsKKwkJICAgIHJldHVybiAwOworCQl9CisJCS1yZSAiRW5kaW5nIHJlbW90ZS4qJGdkYl9wcm9tcHQiIHsgfQorCQktcmUgIkNvbm5lY3Rpb24gcmVmdXNlZC4qJGdkYl9wcm9tcHQiIHsKKwkJICAgIHZlcmJvc2UgIkNvbm5lY3Rpb24gcmVmdXNlZCBieSByZW1vdGUgdGFyZ2V0LiAgUGF1c2luZywgYW5kIHRyeWluZyBhZ2Fpbi4iCisJCSAgICBzbGVlcCAzMAorCQkgICAgY29udGludWUKKwkJfQorCQktcmUgIlRpbWVvdXQgcmVhZGluZyBmcm9tIHJlbW90ZSBzeXN0ZW0uKiRnZGJfcHJvbXB0IiB7CisJCSAgICB2ZXJib3NlICJHb3QgdGltZW91dCBlcnJvciBmcm9tIGdkYi4iOworCQl9CisJCXRpbWVvdXQgeworCQkgICAgc2VuZF9nZGIgIgMiOworCQkgICAgYnJlYWsKKwkJfQorCSAgICB9CisJfQorCisJZ2RiX3RhcmdldF9leGVjOworCisJaWYgeyAkaiA9PSAxICYmICFbcmVib290X3RhcmdldF0gfSB7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICBwZXJyb3IgIkNvdWxkbid0IHNldCB0YXJnZXQgZm9yICR0YXJnZXRuYW1lLCBwb3J0IGlzICRzZXJpYWxwb3J0LiI7CisgICAgcmV0dXJuIC0xOworfQorCitwcm9jIGdkYl90YXJnZXRfZXhlYyB7IH0geworICAgIGdkYl90ZXN0ICJ0YXJnZXQgZXhlYyIgIk5vIGV4ZWN1dGFibGUgZmlsZSBub3cuIiAiIiAiLipLaWxsIGl0Lip5IG9yIG4uKiIgInkiCisgICAgCit9CisjCisjIGdkYl9sb2FkIC0tIGxvYWQgYSBmaWxlIGludG8gdGhlIGRlYnVnZ2VyLgorIyAgICAgICAgICAgICByZXR1cm4gYSAtMSBpZiBhbnl0aGluZyBnb2VzIHdyb25nLgorIworcHJvYyBnZGJfbG9hZCB7IGFyZyB9IHsKKyAgICBnbG9iYWwgdmVyYm9zZQorICAgIGdsb2JhbCBsb2FkcGF0aAorICAgIGdsb2JhbCBsb2FkZmlsZQorICAgIGdsb2JhbCBHREIKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCB0aW1lb3V0CisgICAgZ2xvYmFsIGxhc3RfZ2RiX2ZpbGU7CisKKyAgICBpZiB7ICRhcmcgPT0gIiIgfSB7CisJaWYgW2luZm8gZXhpc3RzIGxhc3RfZ2RiX2ZpbGVdIHsKKwkgICAgc2V0IGFyZyAkbGFzdF9nZGJfZmlsZTsKKwl9IGVsc2UgeworCSAgICBzZW5kX2dkYiAiaW5mbyBmaWxlc1xuIjsKKwkgICAgZ2RiX2V4cGVjdCAzMCB7CisJCS1yZSAiU3ltYm9scyBmcm9tIFwiKFxbXlwiXF0rKVwiIiB7CisJCSAgICBzZXQgYXJnICRleHBlY3Rfb3V0KDEsc3RyaW5nKTsKKwkJICAgIGV4cF9jb250aW51ZTsKKwkJfQorCQktcmUgIkxvY2FsIGV4ZWMgZmlsZTpcW1xyXG5cXStcWyBcdFxdKmAoXFteJ1xdKyknLCIgeworCQkgICAgc2V0IGFyZyAkZXhwZWN0X291dCgxLHN0cmluZyk7CisJCSAgICBleHBfY29udGludWU7CisJCX0KKwkJLXJlICIkZ2RiX3Byb21wdCAkIiB7IH0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBzZXQgbGFzdF9nZGJfZmlsZSAkYXJnOworCisgICAgZm9yIHsgc2V0IGogMTsgfSB7ICRqIDw9IDIgfSB7aW5jciBqOyB9IHsKKwlpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYix1c2Vfc3RhbmRhcmRfbG9hZF0geworCSAgICBnZGJfdGFyZ2V0X2V4ZWM7CisJICAgIGlmICFbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYixub19wdXNoX2Nvbm5dIHsKKwkJcmVtb3RlX3B1c2hfY29ubiBob3N0OworCSAgICB9CisJICAgIHNldCBzdGF0ZSBbcmVtb3RlX2xkIHRhcmdldCAkYXJnXTsKKwkgICAgaWYgIVt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiLG5vX3B1c2hfY29ubl0geworCQlyZW1vdGVfY2xvc2UgdGFyZ2V0OworCQlyZW1vdGVfcG9wX2Nvbm4gaG9zdDsKKwkgICAgfQorCSAgICBpZiB7ICRzdGF0ZSA9PSAicGFzcyIgfSB7CisJCWlmIFtnZGJfdGFyZ2V0X21vbml0b3IgJGFyZ10geyByZXR1cm4gLTE7IH0KKwkJZ2RiX3Rlc3QgImxpc3QgbWFpbiIgIi4qIiAiIgorCQl2ZXJib3NlICJMb2FkZWQgJGFyZyBpbnRvICRHREJcbiI7CisJCXJldHVybiAwOworCSAgICB9CisJfSBlbHNlIHsKKworCSAgICBpZiBbZ2RiX3RhcmdldF9tb25pdG9yICRhcmddIHsgcmV0dXJuIC0xIH0KKworCSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKKwkJIyBGSVhNRTogTXVsdGlwbGUgZG93bmxvYWRzLiBibGVhaC4KKwkJc2V0IGZhcmcgW3JlbW90ZV9kb3dubG9hZCBob3N0ICRhcmddOworCSAgICB9IGVsc2UgeworCQlzZXQgZmFyZyAkYXJnOworCSAgICB9CisKKwkgICAgaWYgeyAkYXJnICE9ICIiICYmIFt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiX3NlY3Rfb2Zmc2V0XSB9IHsKKwkJc2V0IHRleHRvZmYgW3RhcmdldF9pbmZvIGdkYl9zZWN0X29mZnNldF07CisJCXNlbmRfZ2RiICJzZWN0IC50ZXh0ICR0ZXh0b2ZmXG4iOworCQlnZGJfZXhwZWN0IDMwIHsKKwkJICAgIC1yZSAiKDB4XFswLTlhLXpdKykgLSAweFxbMC05YS16XF0rIGlzIFxcLmRhdGEiIHsKKwkJCXNldCBkYXRhb2ZmICRleHBlY3Rfb3V0KDEsc3RyaW5nKTsKKwkJCWV4cF9jb250aW51ZTsKKwkJICAgIH0KKwkJICAgIC1yZSAiKDB4XFswLTlhLXpcXSspIC0gMHhcWzAtOWEtelxdKyBpcyBcXC5ic3MiIHsKKwkJCXNldCBic3NvZmYgJGV4cGVjdF9vdXQoMSxzdHJpbmcpOworCQkJZXhwX2NvbnRpbnVlOworCQkgICAgfQorCQkgICAgLXJlICIkZ2RiX3Byb21wdCIgeyB9CisJCX0KKwkJc2V0IGRhdGFvZmYgW2Zvcm1hdCAweCV4IFtleHByICRkYXRhb2ZmICsgJHRleHRvZmZdXTsKKwkJc2V0IGJzc29mZiBbZm9ybWF0IDB4JXggW2V4cHIgJGJzc29mZiArICR0ZXh0b2ZmXV07CisJCXNlbmRfZ2RiICJzZWN0IC5kYXRhICRkYXRhb2ZmXG4iOworCQlnZGJfZXhwZWN0IDMwIHsKKwkJICAgIC1yZSAiJGdkYl9wcm9tcHQiIHsgfQorCQl9CisJCXNlbmRfZ2RiICJzZWN0IC5ic3MgJGJzc29mZlxuIjsKKwkJZ2RiX2V4cGVjdCAzMCB7CisJCSAgICAtcmUgIiRnZGJfcHJvbXB0IiB7IH0KKwkJfQorCSAgICB9CisKKwkgICAgdmVyYm9zZSAiTG9hZGluZyAkZmFyZyIKKwkgICAgaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGJfbG9hZF9vZmZzZXRdIHsKKwkJc2V0IGNvbW1hbmQgImxvYWQgJGZhcmcgW3RhcmdldF9pbmZvIGdkYl9sb2FkX29mZnNldF1cbiI7CisJICAgIH0gZWxzZSB7CisJCXNldCBjb21tYW5kICJsb2FkICRmYXJnXG4iOworCSAgICB9CisJICAgIHNlbmRfZ2RiICRjb21tYW5kOworCSAgICBnZGJfZXhwZWN0IDE2MDAgeworCQktcmUgIlxbRmZcXWFpbGVkLiokZ2RiX3Byb21wdCAkIiB7CisJCSAgICB2ZXJib3NlICJsb2FkIGZhaWxlZCI7CisJCX0KKwkJLXJlICJUaW1lb3V0IHJlYWRpbmcgZnJvbSByZW1vdGUuKiRnZGJfcHJvbXB0IiB7CisJCX0KKwkJLXJlICIkZ2RiX3Byb21wdCAkIiB7CisJCSAgICB2ZXJib3NlICJMb2FkZWQgJGZhcmcgaW50byAkR0RCXG4iCisJCSAgICByZXR1cm4gMDsKKwkJfQorCQl0aW1lb3V0IHsKKwkJICAgIGlmIHsgJHZlcmJvc2UgPiAxIH0geworCQkJcGVycm9yICJUaW1lZCBvdXQgdHJ5aW5nIHRvIGxvYWQgJGZhcmcuIgorCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisKKwkjIE1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGFuIG9wZW4gY29ubmVjdGlvbiB0byB0aGUgdGFyZ2V0LgorCWdkYl90YXJnZXRfZXhlYzsKKworCWlmIHsgJGogPT0gMSB9IHsKKwkgICAgaWYgeyAhW3JlYm9vdF90YXJnZXRdIH0geworCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisgICAgcGVycm9yICJDb3VsZG4ndCBsb2FkIGZpbGUgaW50byBHREIuIjsKKyAgICByZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tdC1hMjlrLXVkaSBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL210LWEyOWstdWRpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tdC1hMjlrLXVkaQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbXQtaTM4Ni1hb3V0IGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbXQtaTM4Ni1hb3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YjFjYWIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tdC1pMzg2LWFvdXQKQEAgLTAsMCArMSw1OSBAQAorIyBjb21waWxlcnMgYW5kIGFzc2VtYmxlcnMKK0NDID0gaTM4Ni1hb3V0LWdjYworQ0ZMQUdTID0gLWcgLUQke3RhcmdldF9vc30KK0MrKyA9ICR7Q0N9CitDKytGTEFHUyA9ICR7Q0ZMQUdTfQorQ1hYID0gJHtDQ30KK0NYWEZMQUdTID0gJHtDRkxBR1N9CitBUyA9IGkzODYtYW91dC1hcworQVNGTEFHUyA9IAorRkMgPQorRkNGTEFHUyA9IAorTEQgPSBsZAorTERGTEFHUyA9IAorTElCUyA9IAorCisjIGJpbnV0aWxzCisKK1JBTkxJQiA9IGkzODYtYW91dC1yYW5saWIKK1JBTkxJQkZMQUdTID0KKworTk0gPSBpMzg2LWFvdXQtbm0KK05NRkxBR1MgPQorCitTSVpFID0gaTM4Ni1hb3V0LXNpemUKK1NJWkVGTEFHUyA9CisKK1NUUklQID0gaTM4Ni1hb3V0LXN0cmlwCitTVFJJUEZMQUdTID0KKworT0JKRFVNUCA9IGkzODYtYW91dC1vYmpkdW1wCitPQkpEVU1QRkxBR1MgPQorCitERU1BTkdMRSA9IGkzODYtYW91dC1kZW1hbmdsZQorREVNQU5HTEVGTEFHUyA9CisKK0NPUFkgPSBpMzg2LWFvdXQtY29weQorQ09QWUZMQUdTID0KKworIyBvdGhlciB1dGlscworTEVYID0gZmxleAorTEVYRkxBR1MgPQorCitZQUNDID0gYnlhY2MKK1lBQ0NGTEFHUyA9IAorCitBUiA9IGkzODYtYW91dC1hcgorQVJGTEFHUyA9CisKK0NQUCA9ICR7Q0N9IC1FCitDUFBGTEFHUyA9IAorCitHREIgPSBpMzg2LWFvdXQtZ2RiCitHREJGTEFHUyA9IC1ueAorCitESUZGID0gZGlmZgorRElGRkZMQUdTID0gCisKK1JVTlRFU1Q9aTM4Ni1hb3V0LXJ1bnRlc3QKK1JVTlRFU1RGTEFHUz0KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL210LWk5NjAtbmluZHkgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tdC1pOTYwLW5pbmR5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODZjNTEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tdC1pOTYwLW5pbmR5CkBAIC0wLDAgKzEgQEAKK0xERkxBR1NfRk9SX1RBUkdFVCA9IC1ub3N0YXJ0ZmlsZXMKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL210LWx5bnggYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tdC1seW54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMTUzYWYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tdC1seW54CkBAIC0wLDAgKzEsNCBAQAorQ0ZMQUdTX0ZPUl9UQVJHRVQgPSAKK1NURVBfRVhFQ1VUQUJMRSA9IHN0ZXAKK1RIUkVBREZMQUdTID0gLW1wb3NpeCAtbXRocmVhZHMKKyNMREZMQUdTPSAtTC91c3IvY3lnbnVzL3Byb2dyZXNzaXZlLTk1cTEvSC1zcGFyYy1zdW4tc3Vub3M0LjEuMy9pMzg2LWx5bngvbGliL3RocmVhZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbXQtbTY4ayBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL210LW02OGsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzZDcwMgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL210LW02OGsKQEAgLTAsMCArMSBAQAorQ0ZMQUdTX0ZPUl9UQVJHRVQgPSAtVGlkcC5sZCAtbm9zdGFydGZpbGVzCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tdC1taXBzLWVjb2ZmIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbXQtbWlwcy1lY29mZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGRkMDMxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbXQtbWlwcy1lY29mZgpAQCAtMCwwICsxLDIgQEAKK0NGTEFHUyA9IC1JL3MxL2N5Z251cy9kZWphZ251L21pcHMtaWR0LWVjb2ZmL2luY2x1ZGUgLWcKK0xERkxBR1MgPSAtbm9zdGFydGZpbGVzIC9zMS9jeWdudXMvZGVqYWdudS9taXBzLWlkdC1lY29mZi9jcnQwLm8gLUwvczEvY3lnbnVzL2RlamFnbnUvbWlwcy1pZHQtZWNvZmYgLWcKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL210LW5ldHdhcmUgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tdC1uZXR3YXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZDFjZTQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tdC1uZXR3YXJlCkBAIC0wLDAgKzEgQEAKK0xERkxBR1MgPSAtcgpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbXQtc2xpdGUgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tdC1zbGl0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGU3NWEyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbXQtc2xpdGUKQEAgLTAsMCArMSw4IEBACitMSUJTID0gLWxjIC1sZyAtbGdjYworQ0ZMQUdTID0gLWcgLUR1c2VzdHVicworTERGTEFHUyA9IGAgXAorICBpZiBbIC1mICQke3Jvb3RtZX0vLi4vLi4vbmV3bGliL01ha2VmaWxlIF07IHRoZW4gXAorICAgIGVjaG8gLUwkJHtyb290c3JjfS8uLi8uLi9saWJnbG9zcy9leDkzeCAtTCQke3Jvb3RtZX0vLi4vLi4vbGliZ2xvc3MvZXg5M3ggLVRleDkzeC5sZCAtbm9zdGFydGZpbGVzIC1ub3N0ZGxpYiAtTjsgXAorICBlbHNlIFwKKyAgICBlY2hvIC1UZXg5M3gubGQgLW5vc3RhcnRmaWxlcyAtbm9zdGRsaWIgLU47IFwKKyAgZmlgCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2NvbmZpZy9tdC1zcGFyYy1hb3V0IGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbXQtc3BhcmMtYW91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbXQtc3BhcmMtYW91dApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbXQtdW5peCBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL210LXVuaXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZlMmM3OAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL210LXVuaXgKQEAgLTAsMCArMSBAQAorQ0ZMQUdTX0ZPUl9UQVJHRVQgPSAtZwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbXQtdnh3b3JrcyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL210LXZ4d29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4YmNiMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL210LXZ4d29ya3MKQEAgLTAsMCArMSwyIEBACitDRkxBR1MgPSAtZyAtRHZ4d29ya3MKK0xERkxBR1MgPSAtWGxpbmtlciAtVXIKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL25ldHdhcmUuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbmV0d2FyZS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzOGNjZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL25ldHdhcmUuZXhwCkBAIC0wLDAgKzEsMjE4IEBACisjICAgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTk0LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBKLlQuIENvbmtsaW4uIChqdGNAY3lnbnVzLmNvbSkKKworbG9hZF9saWIgZ2RiLmV4cAorbG9hZF9saWIgcmVtb3RlLmV4cAorCitnbG9iYWwgc2hlbGxfaWQKKworZ2xvYmFsIExECitpZiAhW2luZm8gZXhpc3RzIExEXSB0aGVuIHsKKwlzZXQgTEQgW2ZpbmRmaWxlICIkYmFzZV9kaXIvLi4vLi4vbGQvbGQubmV3Il0KK30KKworZ2xvYmFsIE5MTUNPTlYKK2lmICFbaW5mbyBleGlzdHMgTkxNQ09OVl0gdGhlbiB7CisJc2V0IE5MTUNPTlYgW2ZpbmRmaWxlICIkYmFzZV9kaXIvLi4vLi4vYmludXRpbHMvbmxtY29udiJdCit9CisKKyMKKyMgZ2RiX3ZlcnNpb24gLS0gZXh0cmFjdCBhbmQgcHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGdjYworIworcHJvYyBnZGJfdmVyc2lvbiB7fSB7CisgICAgZGVmYXVsdF9nZGJfdmVyc2lvbgorfQorCisjCisjIGdkYl91bmxvYWQgLS0gdW5sb2FkIGEgZmlsZSBpZiBvbmUgaXMgbG9hZGVkCisjCisKKyMKKyMgZ2RiX2xvYWQgLS0gbG9hZCBhIGZpbGUgaW50byB0aGUgZGVidWdnZXIuCisjICAgICAgICAgICAgIHJldHVybiBhIC0xIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuCisjCitwcm9jIGdkYl9sb2FkIHsgYXJnIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIExECisgICAgZ2xvYmFsIE5MTUNPTlYKKyAgICBnbG9iYWwgZXJyb3JDb2RlCisgICAgZ2xvYmFsIHNoZWxsX2lkCisKKyAgICAjIEZJWE1FOiB0aGlzIGlzIHdyb25nLgorICAgIHNldCB0YXJnZXRuYW1lIFt0YXJnZXRfaW5mbyBuYW1lXTsKKworICAgIHNldCBvYmogW2ZpbGUgdGFpbCAkYXJnXQorICAgIHNldCBubG0gIiRvYmoubmxtIgorICAgIHNldCBsbmsgIiRvYmoubG5rIgorCisgICAgIyBidWlsZCAqLmxuayBmaWxlCisgICAgc2V0IGZkIFtvcGVuICRsbmsgd10KKyAgICBwdXRzICRmZCAiZGVzY3JpcHRpb24gXCJbZmlsZSB0YWlsICRubG1dXCIiCisgICAgcHV0cyAkZmQgInNjcmVlbm5hbWUgXCJTeXN0ZW0gQ29uc29sZVwiIgorICAgIHB1dHMgJGZkICJtb2R1bGUgY2xpYi5ubG0iCisgICAgcHV0cyAkZmQgIm1vZHVsZSBtYXRobGliLm5sbSIKKyAgICBwdXRzICRmZCAic3RhY2sgMzI3NjgiCisjICAgIHB1dHMgJGZkICJzdGFjayA2NDUxMiIKKyAgICBwdXRzICRmZCAiZGVidWciCisgICAgIyBGSVhNRTogZG9uJ3QgaGFyZGNvZGUgbG9jYXRpb24gb2YgcHJlbHVkZS5vCisgICAgcHV0cyAkZmQgImlucHV0IC9zMS9jeWdudXMvZGVqYWdudS9pMzg2LW5ldHdhcmUvbGliL3ByZWx1ZGUubyIKKyAgICBwdXRzICRmZCAiaW5wdXQgJGFyZyIKKyAgICBwdXRzICRmZCAib3V0cHV0ICRubG0iCisgICAgY2xvc2UgJGZkCisKKyAgICAjIHJ1biBubG1jb252CisgICAgdmVyYm9zZSAiRXhlY3V0aW5nOiAkTkxNQ09OViAtbCRMRCAtVCRsbmsiIDEKKyAgICBjYXRjaCAiZXhlYyAkTkxNQ09OViAtbCRMRCAtVCRsbmsiIG91dHB1dAorICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRvdXRwdXRdIHRoZW4geworCXZlcmJvc2UgJG91dHB1dCAxCisgICAgfQorICAgIGlmICFbc3RyaW5nIG1hdGNoICJOT05FIiAkZXJyb3JDb2RlXSB7CisJd2FybmluZyAiQ2FuJ3QgbGluayAkYXJnIgorCisJcmV0dXJuIC0xCisgICAgfQorICAgIGNhdGNoICJleGVjIHJtIC1mICRsbmsiCisKKyAgICAjIGRvd25sb2FkCisgICAgdmVyYm9zZSAiRG93bmxvYWRpbmcgJG5sbSIgMQorICAgIGNhdGNoICJleGVjIGNwICRubG0gLy5OZXRXYXJlLyR0YXJnZXRuYW1lLm53cy9zeXMubnd2L3RtcC94Lm5sbSIgb3V0cHV0CisgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJG91dHB1dF0gdGhlbiB7CisJdmVyYm9zZSAkb3V0cHV0IDEKKwlyZXR1cm4gLTEKKyAgICB9CisKKyAgICBnZGJfZmlsZV9jbWQgJG5sbQorfQorCitwcm9jIGdkYl9ydW5fY21kIHsgfSB7CisgICAgZ2xvYmFsIHNoZWxsX2lkCisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgdGltZW91dAorCisgICAgc2V0IGNvbm5ob3N0IFt0YXJnZXRfaW5mbyBuYW1lXTsKKyAgICBpZiBbYm9hcmRfaW5mbyAkY29ubmhvc3QgZXhpc3RzIHNlcmlhbF0geworCXNldCBzZXJpYWxwb3J0IFtib2FyZF9pbmZvICRjb25uaG9zdCBzZXJpYWxdOworICAgIH0gZWxzZSB7CisJc2V0IHNlcmlhbHBvcnQgW2JvYXJkX2luZm8gJGNvbm5ob3N0IG5ldHBvcnRdOworICAgIH0KKworICAgIGlmIFtib2FyZF9pbmZvICRjb25uaG9zdCBleGlzdHMgYmF1ZF0geworCXNldCBiYXVkIFtib2FyZF9pbmZvICRjb25uaG9zdCBiYXVkXTsKKyAgICB9IGVsc2UgeworCXNldCBiYXVkIDk2MDA7CisgICAgfQorICAgICMgRklYTUU6IFRoaXMgaXMgd3JvbmcuCisgICAgc2VuZCAia2lsbFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLipLaWxsIHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkLip5IG9yIG4uICQiIHsKKwkgICAgc2VuZCAieVxuIgorCSAgICBleHBfY29udGludWUKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9CisgICAgfQorCisgICAgdmVyYm9zZSAiU3RhcnRpbmcgR0RCIHN0dWIgb24gW3RhcmdldF9pbmZvIG5hbWVdIiAxCisgICAgc2VuZCAtaSAkc2hlbGxfaWQgImxvYWQgbmxtc3R1YiBCQVVEPSRiYXVkIHgubmxtXHJcbiIKKworICAgIHNlbmQgInNldCByZW1vdGViYXVkICRiYXVkXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIkZ2RiX3Byb21wdCIge30KKwl0aW1lb3V0IHsKKwkgICAgcGVycm9yICJDb3VsZG4ndCBzZXQgcmVtb3RlIGJhdWQgcmF0ZSIKKwkgICAgcmV0dXJuCisJfQorICAgIH0KKworICAgIHNldCBvdGltZW91dCAkdGltZW91dAorICAgIHNldCB0aW1lb3V0IDYwCisgICAgdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorICAgIHNlbmQgInRhcmdldCByZW1vdGUgJHNlcmlhbHBvcnRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIkNvdWxkbid0IGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHJlbW90ZSB0YXJnZXQiIHsKKwkgICAgc2VuZCAidGFyZ2V0IHJlbW90ZSAkc2VyaWFscG9ydFxuIgorCSAgICBleHBfY29udGludWUKKwl9CisJLXJlICIkZ2RiX3Byb21wdCIge30KKwl0aW1lb3V0IHsKKwkgICAgc2V0IHRpbWVvdXQgJG90aW1lb3V0CisJICAgIHZlcmJvc2UgIlRpbWVvdXQgcmVzdG9yZWQgdG8gJHRpbWVvdXQgc2Vjb25kcyIgMgorCSAgICBwZXJyb3IgIkNvdWxkbid0IHNldCByZW1vdGUgdGFyZ2V0IgorCSAgICByZXR1cm4KKwl9CisgICAgfQorICAgIHNldCB0aW1lb3V0ICRvdGltZW91dAorICAgIHZlcmJvc2UgIlRpbWVvdXQgcmVzdG9yZWQgdG8gJHRpbWVvdXQgc2Vjb25kcyIgMgorCisgICAgc2VuZCAiY29udGludWVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwkiQ29udGludWluZy4kIiB7fQorICAgIH0KKworICAgIHJldHVybgorfQorCisKKworIworIyBzdGFydCB0aGUgcmVtb3RlIHNoZWxsCisjCisKK3NldCBzaGVsbF9wcm9tcHQgIlBhc3N3b3JkOiIKK3NldCBzaGVsbF9pZCBbcmVtb3RlX29wZW4gdGFyZ2V0XQorCitpZiAkc2hlbGxfaWQ8MCB0aGVuIHsKKyAgICB3YXJuaW5nICJDb3VsZG4ndCBjb25uZWN0IHRvIHRhcmdldCIKKyAgICByZXR1cm4gLTEKK30KKworaWYgW3N0cmluZyBtYXRjaCAiIiAkcGFzc3dkXSB0aGVuIHsKKyAgICBzdHR5IC1lY2hvCisgICAgc2VuZF91c2VyICJQYXNzd29yZDogIgorICAgIGV4cGVjdF91c2VyIC1yZSAiKC4qKVxuIgorICAgIHNlbmRfdXNlciAiXG4iCisgICAgc2V0IHBhc3N3ZCAiJGV4cGVjdF9vdXQoMSxzdHJpbmcpIgorICAgIHN0dHkgZWNobworfQorCitzZW5kIC1pICRzaGVsbF9pZCAiJHBhc3N3ZFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLWkgJHNoZWxsX2lkICI6IiB7CisJdmVyYm9zZSAiR290IHRlcm10eXBlIHByb21wdCIgMAorICAgIH0KKworICAgIC1pICRzaGVsbF9pZCB0aW1lb3V0IHsKKwl3YXJuaW5nICJDb25uZWN0aW9uIHRpbWVkIG91dCIKKwlyZXR1cm4gLTEKKyAgICB9Cit9CisKKworIyBGSVhNRTogdGhpcyBpcyB3cm9uZy4KK3NldCBzaGVsbF9wcm9tcHQgIltzdHJpbmcgdG91cHBlciBbdGFyZ2V0X2luZm8gbmFtZV1dOiIKK3NlbmQgLWkgJHNoZWxsX2lkICIxXG4iCisKK2dkYl9leHBlY3QgeworICAgIC1pICRzaGVsbF9pZCAtcmUgIiRzaGVsbF9wcm9tcHQiIHt9CisgICAgLWkgJHNoZWxsX2lkIHRpbWVvdXQgeworCXdhcm5pbmcgIkNvbm5lY3Rpb24gdGltZWQgb3V0IgorCXJldHVybiAtMQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL25pbmQuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvbmluZC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhZWNkYgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL25pbmQuZXhwCkBAIC0wLDAgKzEsNDkgQEAKKyMgVGVzdCBGcmFtZXdvcmsgRHJpdmVyCisjICAgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBEZWphR251QGN5Z251cy5jb20KKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUm9iIFNhdm95ZS4gKHJvYkBjeWdudXMuY29tKQorCitsb2FkX2xpYiBnZGIuZXhwCisKKyMKKyMgZ2RiX2xvYWQgLS0gbG9hZCBhIGZpbGUgaW50byB0aGUgZGVidWdnZXIuCisjCitwcm9jIGdkYl9sb2FkIHsgYXJnIH0geworICAgIGdsb2JhbCB2ZXJib3NlCisgICAgZ2xvYmFsIGxvYWRwYXRoCisgICAgZ2xvYmFsIGxvYWRmaWxlCisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgR0RCCisgICAgc2V0IGxvYWRmaWxlIFtmaWxlIHRhaWwgJGFyZ10KKyAgICBzZXQgbG9hZHBhdGggW2ZpbGUgZGlybmFtZSAkYXJnXQorICAgIHNlbmRfdXNlciAiTm90IGltcGxlbWVtdGVkIHlldFxuIiA7IHJldHVybiAtMQorfQorCisjCisjIGdkYl9zdGFydCAtLSBzdGFydCBHREIgcnVubmluZworIworcHJvYyBnZGJfc3RhcnQgeyB9IHsKKyAgICBnbG9iYWwgR0RCCisgICAgZ2xvYmFsIEdEQkZMQUdTCisgICAgZ2xvYmFsIHNwYXduX2lkCisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgdmVyYm9zZQorICAgIHNlbmRfdXNlciAiTm90IGltcGxlbWVtdGVkIHlldFxuIiA7IHJldHVybiAtMQorfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvcHJvZWxmLmV4cCBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL3Byb2VsZi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhZGUxMwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL3Byb2VsZi5leHAKQEAgLTAsMCArMSwyMCBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworbG9hZF9saWIgLi4vY29uZmlnL21vbml0b3IuZXhwCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2NvbmZpZy9yb202OGsuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvcm9tNjhrLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmFkZTEzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvcm9tNjhrLmV4cApAQCAtMCwwICsxLDIwIEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCitsb2FkX2xpYiAuLi9jb25maWcvbW9uaXRvci5leHAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL3NoLmV4cCBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL3NoLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmFkZTEzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvc2guZXhwCkBAIC0wLDAgKzEsMjAgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKK2xvYWRfbGliIC4uL2NvbmZpZy9tb25pdG9yLmV4cApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvc2ltLmV4cCBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL3NpbS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4YTkzZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL3NpbS5leHAKQEAgLTAsMCArMSw4NSBAQAorIyBUZXN0IEZyYW1ld29yayBEcml2ZXIgZm9yIEdEQiBkcml2aW5nIGEgYnVpbHRpbiBzaW11bGF0b3IKKyMgICBDb3B5cmlnaHQgMTk5NCwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKK2xvYWRfbGliIGdkYi5leHAKKworIworIyBnZGJfdGFyZ2V0X3NpbQorIyBTZXQgZ2RiIHRvIHRhcmdldCB0aGUgc2ltdWxhdG9yCisjCitwcm9jIGdkYl90YXJnZXRfc2ltIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgZXhpdF9zdGF0dXMKKyAgICAKKyAgICBzZXQgdGFyZ2V0X3NpbV9vcHRpb25zICJbYm9hcmRfaW5mbyB0YXJnZXQgZ2RiLHRhcmdldF9zaW1fb3B0aW9uc10iOworCisgICAgc2VuZF9nZGIgInRhcmdldCBzaW0gJHRhcmdldF9zaW1fb3B0aW9uc1xuIgorICAgIHNldCB0aW1lb3V0IDYwCisgICAgdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiQ29ubmVjdGVkIHRvIHRoZSBzaW11bGF0b3IuKiRnZGJfcHJvbXB0ICQiCXsKKwkgICAgdmVyYm9zZSAiU2V0IHRhcmdldCB0byBzaW0iCisJfQorCXRpbWVvdXQgeyAKKwkgICAgcGVycm9yICJDb3VsZG4ndCBzZXQgdGFyZ2V0IGZvciBzaW11bGF0b3IuIgorCSAgICBjbGVhbnVwCisJICAgIGV4aXQgJGV4aXRfc3RhdHVzCisJfQorICAgIH0KKyAgICBzZXQgdGltZW91dCAxMAorICAgIHZlcmJvc2UgIlRpbWVvdXQgaXMgbm93ICR0aW1lb3V0IHNlY29uZHMiIDIKK30KKworIworIyBnZGJfbG9hZCAtLSBsb2FkIGEgZmlsZSBpbnRvIHRoZSBkZWJ1Z2dlci4KKyMgICAgICAgICAgICAgcmV0dXJuIGEgLTEgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4KKyMKK3Byb2MgZ2RiX2xvYWQgeyBhcmcgfSB7CisgICAgZ2xvYmFsIHZlcmJvc2UKKyAgICBnbG9iYWwgbG9hZHBhdGgKKyAgICBnbG9iYWwgbG9hZGZpbGUKKyAgICBnbG9iYWwgR0RCCisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIGlmIFtnZGJfZmlsZV9jbWQgJGFyZ10gdGhlbiB7IHJldHVybiAtMSB9CisKKyAgICBnZGJfdGFyZ2V0X3NpbQorCisgICAgc2VuZF9nZGIgImxvYWRcbiIKKyAgICBzZXQgdGltZW91dCAyNDAwCisgICAgdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGlmICR2ZXJib3NlPjEgdGhlbiB7CisJCXNlbmRfdXNlciAiTG9hZGVkICRhcmcgaW50byAkR0RCXG4iCisJICAgIH0KKwkgICAgc2V0IHRpbWVvdXQgMzAKKwkgICAgdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorCSAgICByZXR1cm4gMQorCX0KKwktcmUgIiRnZGJfcHJvbXB0ICQiICAgICB7CisJICAgIGlmICR2ZXJib3NlPjEgdGhlbiB7CisJCXBlcnJvciAiR0RCIGNvdWxkbid0IGxvYWQuIgorCSAgICB9CisJfQorCXRpbWVvdXQgeworCSAgICBpZiAkdmVyYm9zZT4xIHRoZW4geworCQlwZXJyb3IgIlRpbWVkIG91dCB0cnlpbmcgdG8gbG9hZCAkYXJnLiIKKwkgICAgfQorCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2NvbmZpZy9zbGl0ZS5leHAgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy9zbGl0ZS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjYjEzOQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL3NsaXRlLmV4cApAQCAtMCwwICsxLDE4MyBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgRGVqYUdudUBjeWdudXMuY29tCisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KKworIyBHREIgc3VwcG9ydCByb3V0aW5lcyBmb3IgYSBib2FyZCB1c2luZyB0aGUgTUlQUyByZW1vdGUgZGVidWdnaW5nCisjIHByb3RvY29sLiAgVGhlc2UgYXJlIGFjdHVhbGx5IHByZXR0eSBnZW5lcmljLgorCisjIERlamFHbnUgY3VycmVudGx5IGFzc3VtZXMgdGhhdCBkZWJ1Z2dpbmcgaXMgYmVpbmcgZG9uZSBvdmVyIHRoZSBtYWluCisjIGNvbnNvbGUgcG9ydC4gIEl0IHdvdWxkIHByb2JhYmx5IGJlIG1vcmUgY29udmVuaWVudCBmb3IgcGVvcGxlIHVzaW5nCisjIElEVCBib2FyZHMgdG8gcGVybWl0IHRoZSBkZWJ1Z2dpbmcgcG9ydCBhbmQgdGhlIGNvbm5lY3RlZCBwb3J0IHRvIGJlCisjIGRpZmZlcmVudCwgc2luY2UgYW4gSURUIGJvYXJkIGhhcyB0d28gcG9ydHMuICBUaGlzIHdvdWxkIHJlcXVpcmUKKyMgZXh0ZW5kaW5nIHNvbWUgb2YgdGhlIHRlc3RzIGluIGEgZmFzaGlvbiBzaW1pbGFyIHRvIHRoYXQgZG9uZSBmb3IKKyMgVnhXb3JrcywgYmVjYXVzZSB0aGUgdGVzdCBvdXRwdXQgd291bGQgYXBwZWFyIG9uIHRoZSBvdGhlciBwb3J0LAorIyByYXRoZXIgdGhhbiBiZWluZyBkaXNwbGF5ZWQgYnkgZ2RiLgorCitsb2FkX2xpYiByZW1vdGUuZXhwCitsb2FkX2xpYiBnZGIuZXhwCitzZXQgZ2RiX3Byb21wdCAiXFwoZ2RiXFwpIgorCisjCisjIGdkYl9sb2FkIC0tIGxvYWQgYSBmaWxlIGludG8gdGhlIEdEQi4gCisjICAgICAgICAgICAgIFJldHVybnMgYSAwIGlmIHRoZXJlIHdhcyBhbiBlcnJvciwKKyMgICAgICAgICAgICAgICAgICAgICAgIDEgaWYgaXQgbG9hZCBzdWNjZXNzZnVsbHkuCisjCitwcm9jIGdkYl9sb2FkIHsgYXJnIH0geworICAgIGdsb2JhbCB2ZXJib3NlCisgICAgZ2xvYmFsIGxvYWRwYXRoCisgICAgZ2xvYmFsIGxvYWRmaWxlCisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgR0RCCisgICAgZ2xvYmFsIGV4cGVjdF9vdXQKKworICAgIHNldCBsb2FkZmlsZSBbZmlsZSB0YWlsICRhcmddCisgICAgc2V0IGxvYWRwYXRoIFtmaWxlIGRpcm5hbWUgJGFyZ10KKworICAgIGdkYl9maWxlX2NtZCAkYXJnCisKKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYl9wcm90b2NvbF0geworCXNldCBwcm90b2NvbCBbdGFyZ2V0X2luZm8gZ2RiX3Byb3RvY29sXTsKKyAgICB9IGVsc2UgeworCXNldCBwcm90b2NvbCAic3BhcmNsaXRlIgorICAgIH0KKworICAgIGlmIFt0YXJnZXRfaW5mbyBleGlzdHMgc2VyaWFsXSB7CisJc2V0IHRhcmdldG5hbWUgW3RhcmdldF9pbmZvIHNlcmlhbF07CisJc2V0IGNvbW1hbmQgInRhcmdldCAkcHJvdG9jb2wgW3RhcmdldF9pbmZvIHNlcmlhbF1cbiI7CisgICAgfSBlbHNlIHsKKwlpZiAhW3RhcmdldF9pbmZvIGV4aXN0cyBuZXRwb3J0XSB7CisJICAgIHBlcnJvciAiTmVlZCBlaXRoZXIgbmV0cG9ydCBvciBnZGJfc2VyaWFsIGVudHJ5IGZvciBbdGFyZ2V0X2luZm8gbmFtZV0uIjsKKwkgICAgcmV0dXJuIC0xOworCX0KKwlzZXQgdGFyZ2V0bmFtZSBbdGFyZ2V0X2luZm8gbmV0cG9ydF07CisJc2V0IGNvbW1hbmQgInRhcmdldCAkcHJvdG9jb2wgdWRwIFt0YXJnZXRfaW5mbyBuZXRwb3J0XVxuIjsKKyAgICB9CisgICAgc2V0IHRpbWVvdXQgNjAKKyAgICB2ZXJib3NlICJUaW1lb3V0IGlzIG5vdyAkdGltZW91dCBzZWNvbmRzIiAyCisgICAgc2V0IHRyeV9jb3VudCAwOworICAgIHNlbmRfZ2RiICRjb21tYW5kOworICAgIGdkYl9leHBlY3QgeworCSAtcmUgIlVua25vd24gcmVzcG9uc2UuKnJlc2V0dGluZyB0aGUgYm9hcmQufHJlbW90ZSB0aW1lb3V0IiB7CisJICAgIGluY3IgdHJ5X2NvdW50OworCSAgICBpZiB7ICR0cnlfY291bnQgPiAzIH0geworCQlzZXQgdHJ5X2NvdW50IDA7CisJCXJlYm9vdF90YXJnZXQ7CisJCXNsZWVwIDU7CisJICAgIH0KKwkgICAgc2xlZXAgMTsKKwkgICAgc2VuZF9nZGIgJGNvbW1hbmQ7CisJICAgIGV4cF9jb250aW51ZTsKKwl9CisJIC1yZSAiUmVtb3RlIHRhcmdldC4qJGdkYl9wcm9tcHQgJCIgeyB9CisJIC1yZSAiLipTUEFSQ2xpdGUgYXBwZWFycyB0byBiZSBhbGl2ZS4qJGdkYl9wcm9tcHQgJCIJeworCSAgICBpZiAkdmVyYm9zZT4xIHRoZW4geworCQlzZW5kX3VzZXIgIlNldCB0YXJnZXQgdG8gJHRhcmdldG5hbWVcbiIKKwkgICAgfQorCX0KKwkgdGltZW91dCB7IAorCSAgICBwZXJyb3IgIkNvdWxkbid0IHNldCBTTElURSB0YXJnZXQuIgorCSAgICBzZXQgdGltZW91dCAxMAorCSAgICB2ZXJib3NlICJUaW1lb3V0IGlzIG5vdyAkdGltZW91dCBzZWNvbmRzIiAyCisJICAgIHJldHVybiAtMQorCX0KKyAgICB9CisgICAgCisgICAgaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGJfbG9hZF9vZmZzZXRdIHsKKwlzZXQgb2Zmc2V0ICJbdGFyZ2V0X2luZm8gZ2RiX2xvYWRfb2Zmc2V0XSI7CisgICAgfSBlbHNlIHsKKwlzZXQgb2Zmc2V0ICIiOworICAgIH0KKyAgICBpZiB7IDEgfSB7CisJaWYgW2lzX3JlbW90ZSBob3N0XSB7CisJICAgIHNldCBhcmcgW3JlbW90ZV9kb3dubG9hZCBob3N0ICRhcmddOworCSAgICBpZiB7ICRhcmcgPT0gIiIgfSB7CisJCWVycm9yICJkb3dubG9hZCBmYWlsZWQiCisJCXJldHVybiAtMTsKKwkgICAgfQorCX0KKwlzZW5kX2dkYiAibG9hZCAkYXJnICRvZmZzZXRcbiIKKwl2ZXJib3NlICJMb2FkaW5nICRhcmcgaW50byAkR0RCIiAyCisJc2V0IHRpbWVvdXQgMjQwMAorCXZlcmJvc2UgIlRpbWVvdXQgaXMgbm93ICR0aW1lb3V0IHNlY29uZHMiIDIKKwlnZGJfZXhwZWN0IHsKKwkgICAgIC1yZSAiTG9hZGluZy4qJGdkYl9wcm9tcHQgJCIgeworCQl2ZXJib3NlICJMb2FkZWQgJGFyZyBpbnRvICRHREIiIDEKKwkJc2V0IHRpbWVvdXQgMzAKKwkJdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorCSAgICB9CisJICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICB7CisJCWlmICR2ZXJib3NlPjEgdGhlbiB7CisJCSAgICBwZXJyb3IgIkdEQiBjb3VsZG4ndCBsb2FkLiIKKwkJfQorCSAgICB9CisJICAgICB0aW1lb3V0IHsKKwkJaWYgJHZlcmJvc2U+MSB0aGVuIHsKKwkJICAgIHBlcnJvciAiVGltZWQgb3V0IHRyeWluZyB0byBsb2FkICRhcmcuIgorCQl9CisJICAgIH0KKwl9CisgICAgfQorICAgICMgU29tZSBTUEFSQ2xpdGUgYm9hcmRzIGF1dG9tYWdpY2FsbHkgZG8gYSBydW4gYWZ0ZXIgdGhlIHByb2dyYW0gaXMKKyAgICAjIGxvYWRlZC4KKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIG5lZWRfbW9uaXRvcl9ydW5dIHsKKwlzZXQgdGltZW91dCAxMAorCXZlcmJvc2UgIlRpbWVvdXQgaXMgbm93ICR0aW1lb3V0IHNlY29uZHMsIGRvaW5nIG1vbml0b3IgcnVuIiAyCisJc2VuZF9nZGIgIm1vbml0b3IgcnVuXG4iOworCXNsZWVwIDI7CisJc2VuZF9nZGIgIgMiOworCWdkYl9leHBlY3QgeworCSAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgdmVyYm9zZSAiUnVuIGNvbW1hbmQgc3VjY2VkZWQiIH0KKwkgICAgIGRlZmF1bHQgeworCQlwZXJyb3IgImVycm9yIHNlbmRpbmcgbW9uaXRvciBydW4gY29tbWFuZCI7CisJICAgIH0KKwl9CisgICAgfSBlbHNlIHsKKwlzbGVlcCAyOworICAgIH0KKworICAgIGlmIFt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiX3NlcmlhbF0geworCXNldCBzZXJpYWwgW3RhcmdldF9pbmZvIGdkYl9zZXJpYWxdOworICAgIH0gZWxzZSB7CisJc2V0IHNlcmlhbCBbdGFyZ2V0X2luZm8gc2VyaWFsXTsKKyAgICB9CisgICAgc2VuZF9nZGIgInRhcmdldCByZW1vdGUgJHNlcmlhbFxuIgorICAgIHNldCB0aW1lb3V0IDYwCisgICAgdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorICAgIGdkYl9leHBlY3QgeworCSAtcmUgIi4qS2lsbCBpdD8uKnkgb3Igbi4qIiB7CisJICAgIHNlbmRfZ2RiICJ5XG4iOworCSAgICBleHBfY29udGludWUKKwl9CisJIC1yZSAiLiokZ2RiX3Byb21wdCAkIgl7CisJICAgIHZlcmJvc2UgIlNldCByZW1vdGUgdGFyZ2V0IHRvIFt0YXJnZXRfaW5mbyBzZXJpYWxdIiAyCisJfQorCSB0aW1lb3V0IHsKKwkgICAgcGVycm9yICJDb3VsZG4ndCBzZXQgcmVtb3RlIHRhcmdldC4iCisJICAgIHNldCB0aW1lb3V0IDEwCisJICAgIHZlcmJvc2UgIlRpbWVvdXQgaXMgbm93ICR0aW1lb3V0IHNlY29uZHMiIDIKKwkgICAgcmV0dXJuIC0xCisJfQorICAgIH0KKworICAgIGlmIFtpbmZvIGV4aXN0cyBleHBlY3Rfb3V0KGJ1ZmZlcildIHRoZW4geworCXNlbmRfbG9nICRleHBlY3Rfb3V0KGJ1ZmZlcikKKyAgICB9CisgICAgcmV0dXJuIDAKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL3NwYXJjbGV0LmV4cCBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL3NwYXJjbGV0LmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTE5YWNhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvc3BhcmNsZXQuZXhwCkBAIC0wLDAgKzEsMzkxIEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgRGVqYUdudUBjeWdudXMuY29tCisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IE1pY2hhZWwgU255ZGVyIDxtc255ZGVyQGN5Z251cy5jb20+LgorCisjIEdEQiBzdXBwb3J0IHJvdXRpbmVzIGZvciBhIGJvYXJkIHVzaW5nIHRoZSBzcGFyY2xldCByZW1vdGUgZGVidWdnaW5nCisjIHByb3RvY29sLgorCitsb2FkX2xpYiByZW1vdGUuZXhwCitsb2FkX2xpYiBnZGIuZXhwCisKKyMKKyMgU3BhcmNsZXQgcmVtb3RlIHJ1biBjb21tYW5kLgorIworCitwcm9jIGdkYl9zdGFydCB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBpZiAhW2ZpbGUgZXhpc3RzIGxvYWRlcl0geworCWdsb2JhbCBsaWJkaXIKKwlzZXQgbG9hZGVyIGxvYWRlcjsKKworCWlmIFt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiX3N0dWJfb2Zmc2V0XSB7CisJICAgIHNldCByZXN1bHQgW3RhcmdldF9jb21waWxlICIke2xpYmRpcn0vc3R1Yi1sb2FkZXIuYyIgJGxvYWRlciBleGVjdXRhYmxlICJsaWJzPS1XbCwtVHRleHQsW3RhcmdldF9pbmZvIGdkYl9zdHViX29mZnNldF0iXTsKKwl9IGVsc2UgeworCSAgICBzZXQgcmVzdWx0IFt0YXJnZXRfY29tcGlsZSAiJHtsaWJkaXJ9L3N0dWItbG9hZGVyLmMiICRsb2FkZXIgZXhlY3V0YWJsZSAibGRzY3JpcHQ9W3RhcmdldF9pbmZvIGdkYl9zdHViX2xkc2NyaXB0XSJdOworCX0KKyAgICB9CisKKyAgICB2ZXJib3NlIC1sb2cgIiRnZGJfcHJvbXB0IGlzIGdkYiBwcm9tcHQiCisKKyAgICBzZXQgcmVzdWx0IDA7CisgICAgZm9yIHsgc2V0IHkgMDsgfSB7ICR5IDwgNCB9IHsgaW5jciB5IH0geworCWlmIHsgW2RlZmF1bHRfZ2RiX3N0YXJ0XSAhPSAwIH0geworCSAgICByZXR1cm4gLTE7CisJfQorCisJaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBiYXVkXSB7CisJICAgIHNlbmRfZ2RiICJzZXQgcmVtb3RlYmF1ZCBbdGFyZ2V0X2luZm8gYmF1ZF1cbiIKKwkgICAgZ2RiX2V4cGVjdCB7CisJCS1yZSAiJGdkYl9wcm9tcHQiIHsgfQorCQlkZWZhdWx0IHsgCisJCSAgICBwZXJyb3IgIkVycm9yIHNldHRpbmcgYmF1ZCByYXRlLiIKKwkJICAgIHJldHVybiAtMTsKKwkJfQorCSAgICB9CisJfQorCisJZm9yIHtzZXQgeCAxO30geyAkeCA8IDQgfSB7aW5jciB4fSB7CisJICAgIHNldCByZXN1bHQgW2dkYl9zcGFyY2xldF9zdGFydHVwICRyZXN1bHRdOworCSAgICBpZiB7ICRyZXN1bHQgPiAwIH0geworCQlyZXR1cm4gMTsKKwkgICAgfQorCSAgICAjIG1tbW1tLCBtYWdpYyBudW1iZXJzLgorCSAgICBpZiB7ICRyZXN1bHQgPT0gLTQyIHx8ICRyZXN1bHQgPT0gLTQzIH0geworCQlicmVhazsKKwkgICAgfSBlbHNlIHsKKwkJcmVib290X3RhcmdldDsKKwkgICAgfQorCX0KKwlpZiB7ICR4ID09IDQgfSB7CisJICAgIHJldHVybiAtMTsKKwl9CisJZ2RiX2V4aXQ7CisJc2xlZXAgNTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitwcm9jIGdkYl9zcGFyY2xldF9zdGFydHVwIHsgYXJnIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIEdEQgorICAgIGdsb2JhbCB2ZXJib3NlCisKKyAgICBzZXQgaXNfcnVubmluZ19zdHViIDA7CisKKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIHNlcmlhbF0geworCXNldCBzZXJpYWwgW3RhcmdldF9pbmZvIHNlcmlhbF07CisgICAgfSBlbHNlIHsKKwlzZXQgc2VyaWFsIFt0YXJnZXRfaW5mbyBuZXRwb3J0XTsKKyAgICB9CisgICAgc2V0IHByb3RvY29sIFt0YXJnZXRfaW5mbyBnZGJfcHJvdG9jb2xdOworICAgIHNldCBjaGVja19zdHViIDE7CisgICAgaWYgeyAkYXJnICE9IC00MiB9IHsKKwlzZW5kX2dkYiAidGFyZ2V0ICRwcm90b2NvbCAkc2VyaWFsXG4iOworCSMgMTAgc2Vjb25kcyBtYXkgYmUgYSBiaXQgc2hvcnQuCisJZ2RiX2V4cGVjdCAxMCB7CisJICAgIC1yZSAiYWxyZWFkeS4qeSBvciBuLiIgeworCQlnZGJfc2VuZCAieVxuIjsKKwkJZXhwX2NvbnRpbnVlOworCSAgICB9CisJICAgIC1yZSAiUmVtb3RlIHRhcmdldC4qY29ubmVjdGVkIHRvLiokZ2RiX3Byb21wdCIgeyBzZXQgY2hlY2tfc3R1YiAwOyB9CisJICAgIC1yZSAiJGdkYl9wcm9tcHQiIHsgfQorCSAgICB0aW1lb3V0IHsgfQorCX0KKwlpZiB7ICRjaGVja19zdHViIH0geworCSAgICB2ZXJib3NlICJ0aW1lZCBvdXQsIGNoZWNraW5nIGlmIHN0dWIgaXMgYWxyZWFkeSBydW5uaW5nIgorCSAgICBzZW5kX2dkYiAiXDAwMyI7CisJICAgIHNsZWVwIDE7CisJICAgIHNlbmRfZ2RiICJcMDAzIjsKKwkgICAgZ2RiX2V4cGVjdCAxMCB7CisJCS1yZSAiJGdkYl9wcm9tcHQiIHsgfQorCQlkZWZhdWx0IHsKKwkJICAgIHJlbW90ZV9jbG9zZSBob3N0OworCQkgICAgcmV0dXJuIC00MjsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYl9zZXJpYWxdIHsKKwlzZXQgZ2RiX3NlcmlhbCBbdGFyZ2V0X2luZm8gZ2RiX3NlcmlhbF07CisgICAgfSBlbHNlIHsKKwlzZXQgZ2RiX3NlcmlhbCAkc2VyaWFsOworICAgIH0KKyAgICBpZiB7ICRjaGVja19zdHViIH0geworCXNlbmRfZ2RiICJ0YXJnZXQgcmVtb3RlICRnZGJfc2VyaWFsXG4iOworCWdkYl9leHBlY3QgMTUgeworCSAgICAtcmUgIlJlbW90ZSBkZWJ1Z2dpbmcuKiRnZGJfcHJvbXB0IiB7CisJCXZlcmJvc2UgInN0dWIgaXMgYWxyZWFkeSBydW5uaW5nIgorCQlzZXQgaXNfcnVubmluZ19zdHViIDE7CisJICAgIH0KKwkgICAgZGVmYXVsdCB7CisJCXdhcm5pbmcgImJvYXJkIGlzbid0IHJlc3BvbmRpbmciOworCQlyZW1vdGVfY2xvc2UgaG9zdDsKKwkJcmVtb3RlX3JlYm9vdCB0YXJnZXQ7CisJCXJldHVybiAtNDM7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgeyAkaXNfcnVubmluZ19zdHViID09IDAgfSB7CisJZ2xvYmFsIHNyY2RpcgorCisJaWYgW2lzX3JlbW90ZSBob3N0XSB7CisJICAgIHNldCBsb2FkZXIgW3JlbW90ZV9kb3dubG9hZCBob3N0ICJsb2FkZXIiXTsKKwl9IGVsc2UgeworCSAgICBzZXQgbG9hZGVyICJsb2FkZXIiOworCX0KKwlzZW5kX2dkYiAiZmlsZSAkbG9hZGVyXG4iOworCWdkYl9leHBlY3QgeworCSAgICAgLXJlICJBIHByb2dyYW0gaXMgYmVpbmcgZGVidWcuKktpbGwgaXQuKnkgb3Igbi4gJCIgeworCQlzZW5kX2dkYiAieVxuIgorCQlleHBfY29udGludWUKKwkgICAgfQorCSAgICAgLXJlICJMb2FkIG5ldyBzeW1ib2wgdGFibGUuKnkgb3Igbi4gJCIgeworCQlzZW5kX2dkYiAieVxuIgorCQlleHBfY29udGludWUKKwkgICAgfQorCSAgICAgLXJlICJSZWFkaW5nIHN5bWJvbHMgZnJvbS4qZG9uZS4uKiRnZGJfcHJvbXB0ICQiIHt9CisJICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgcGVycm9yICJHREIgY291bGRuJ3QgZmluZCBsb2FkZXIiIH0KKwkgICAgIHRpbWVvdXQgeyAKKwkJcGVycm9yICIodGltZW91dCkgcmVhZCBzeW1ib2wgZmlsZSIgOyAKKwkJcmV0dXJuIC0xCisJICAgIH0KKwl9CisKKwlzZW5kX2dkYiAidGFyZ2V0ICRwcm90b2NvbCAkc2VyaWFsXG4iOworCWdkYl9leHBlY3QgeworCSAgICAgLXJlICJSZW1vdGUgdGFyZ2V0Lipjb25uZWN0ZWQgdG8uKiRnZGJfcHJvbXB0IiB7IH0KKwkgICAgIGRlZmF1bHQgeworCQlwZXJyb3IgIkVycm9yIHJlY29ubmVjdGluZyB0byBib2FyZC4iOworCQlyZXR1cm4gLTE7CisJICAgIH0KKwl9CisKKwlzZW5kX2dkYiAibG9hZCAkbG9hZGVyIFt0YXJnZXRfaW5mbyBnZGJfc3R1Yl9vZmZzZXRdXG4iCisJdmVyYm9zZSAiTG9hZGluZyAkbG9hZGVyIGludG8gJEdEQiIgMgorCXNldCBub19ydW5fY29tbWFuZCAwOworCWdkYl9leHBlY3QgMTIwMCB7CisJICAgICAtcmUgIkxvYWRpbmcuKiRnZGJfcHJvbXB0ICQiIHsKKwkJdmVyYm9zZSAiTG9hZGVkICRsb2FkZXIgaW50byAkR0RCIiAxCisJICAgIH0KKwkgICAgLXJlICJUcmFuc2ZlciByYXRlOi4qU3dpdGNoaW5nIHRvIHJlbW90ZSBwcm90b2NvbC4qUmVtb3RlIGRlYnVnZ2luZyIgeworCQlzZXQgbm9fcnVuX2NvbW1hbmQgMTsKKwkgICAgfQorCSAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgeworCQlpZiAkdmVyYm9zZT4xIHRoZW4geworCQkgICAgcGVycm9yICJHREIgY291bGRuJ3QgbG9hZC4iCisJCX0KKwkgICAgfQorCSAgICAgdGltZW91dCB7CisJCWlmICR2ZXJib3NlPjEgdGhlbiB7CisJCSAgICBwZXJyb3IgIlRpbWVkIG91dCB0cnlpbmcgdG8gbG9hZCAkYXJnLiIKKwkJfQorCSAgICB9CisJfQorCisJaWYgISRub19ydW5fY29tbWFuZCB7CisJICAgIHNlbmRfZ2RiICJydW5cbiI7CisJICAgIGdkYl9leHBlY3QgNjAgeworCQktcmUgIkEgcHJvZ3JhbSBpcyBiZWluZyBkZWJ1Zy4qS2lsbCBpdC4qeSBvciBuLiAkIiB7CisJCSAgICBzZW5kX2dkYiAieVxuIgorCQkgICAgZXhwX2NvbnRpbnVlCisJCX0KKwkJLXJlICJUaGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZCAuKnkgb3Igbi4gJCIgeworCQkgICAgc2VuZF9nZGIgInlcbiIKKwkJICAgIGV4cF9jb250aW51ZQorCQl9CisJCS1yZSAiU3RhcnRpbmcgcHJvZ3JhbTouKmxvYWRlci4qJCIgeyAKKwkJICAgIHZlcmJvc2UgIlN0YXJ0aW5nIGxvYWRlciBzdWNjZWVkZWQiIAorCQl9CisJCXRpbWVvdXQgeyAKKwkJICAgIHBlcnJvciAiKHRpbWVvdXQpIHN0YXJ0aW5nIHRoZSBsb2FkZXIiIDsgCisJCSAgICByZXR1cm4gLTEgCisJCX0KKwkJZGVmYXVsdCB7CisJCSAgICBwZXJyb3IgImVycm9yIHN0YXJ0aW5nIHRoZSBsb2FkZXIiOworCQl9CisJICAgIH0KKwl9CisJc2xlZXAgMjsKKwlzZW5kX2dkYiAiAyIKKwlzbGVlcCAxOworCXNlbmRfZ2RiICIDIgorCXZlcmJvc2UgIlNlbnQgXkNeQyIKKwlnZGJfZXhwZWN0IDEwIHsKKwkgICAgIC1yZSAiR2l2ZSB1cCAuYW5kIHN0b3AgZGVidWdnaW5nIGl0LiokIiB7CisJCXNlbmRfZ2RiICJ5XG4iCisJCWV4cF9jb250aW51ZQorCSAgICB9CisJICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyAKKwkJdmVyYm9zZSAiUnVubmluZyBsb2FkZXIgc3VjY2VlZGVkIiAKKwkgICAgfQorCSAgICB0aW1lb3V0IHsgCisJCXdhcm5pbmcgIih0aW1lb3V0KSBpbnRlcnJ1cHRpbmcgdGhlIGxvYWRlciIgOworCQlyZW1vdGVfY2xvc2UgaG9zdDsKKwkgICAgfQorCSAgICBkZWZhdWx0IHsKKwkJd2FybmluZyAiZXJyb3IgaW50ZXJydXB0aW5nIHRoZSBsb2FkZXIiOworCSAgICB9CisJfQorCisJZ2RiX2V4aXQ7CisJcmV0dXJuIFtnZGJfc3RhcnRdOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworcHJvYyBnZGJfcnVuX2NtZCB7IGFyZ3MgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIGdkYl9icmVha3BvaW50IGV4aXQ7CisgICAgc2VuZF9nZGIgInNldCBcJGZwPTBcbiI7CisgICAgZ2RiX2V4cGVjdCB7CisJIC1yZSAiJGdkYl9wcm9tcHQiIHsgfQorICAgIH0KKyAgICAjIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgU3BhcmNMaXRlLiBXaGVlLgorICAgIGlmIFt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiLHN0YXJ0X3N5bWJvbF0geworCXNldCBzdGFydF9jb21tICJqdW1wICpbdGFyZ2V0X2luZm8gZ2RiLHN0YXJ0X3N5bWJvbF1cbiI7CisgICAgfSBlbHNlIHsKKwlzZXQgc3RhcnRfY29tbSAianVtcCAqc3RhcnRcbiI7CisgICAgfQorICAgIHNlbmRfZ2RiICJicmVhayBjb3B5bG9vcFxuIjsKKyAgICBnZGJfZXhwZWN0IDEwIHsKKwktcmUgIkJyZWFrcG9pbnQuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0IHN0YXJ0X2NvbW0gImNvbnRpbnVlXG4iOworCX0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgfQorCXRpbWVvdXQgeyB3YXJuaW5nICJicmVhayBjb3B5bG9vcCBmYWlsZWQgYmFkbHkiOyB9CisgICAgfQorICAgIHNlbmRfZ2RiICRzdGFydF9jb21tOworICAgIGdkYl9leHBlY3QgMTAgeworCS1yZSAieSBvciBuLiAkIiB7CisJICAgIHJlbW90ZV9zZW5kIGhvc3QgInlcbiIKKwkgICAgZXhwX2NvbnRpbnVlOworCX0KKwktcmUgIkJyZWFrcG9pbnQuKmluIGNvcHlsb29wLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHJlbW90ZV9zZW5kIGhvc3QgImp1bXAgcmVsb2NkXG4iOworCSAgICBleHBfY29udGludWU7CisJfQorCS1yZSAiQ29udGludWluZyBhdC4qXFtcclxuXF0iIHsgfQorCWRlZmF1bHQgeworCSAgICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICAgIHJldHVybiAiIjsKK30KKworCisjCisjIGdkYl9sb2FkIC0tIGxvYWQgYSBmaWxlIGludG8gdGhlIEdEQi4gCisjICAgICAgICAgICAgIFJldHVybnMgYSAwIGlmIHRoZXJlIHdhcyBhbiBlcnJvciwKKyMgICAgICAgICAgICAgICAgICAgICAgIDEgaWYgaXQgbG9hZCBzdWNjZXNzZnVsbHkuCisjCitwcm9jIGdkYl9sb2FkIHsgYXJnIH0geworICAgIGdsb2JhbCB2ZXJib3NlCisgICAgZ2xvYmFsIGxvYWRwYXRoCisgICAgZ2xvYmFsIGxvYWRmaWxlCisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgR0RCCisgICAgZ2xvYmFsIGV4cGVjdF9vdXQKKworICAgIHNldCBsb2FkZmlsZSBbZmlsZSB0YWlsICRhcmddCisgICAgc2V0IGxvYWRwYXRoIFtmaWxlIGRpcm5hbWUgJGFyZ10KKworICAgIHNldCBwcm90b2NvbCBbdGFyZ2V0X2luZm8gZ2RiX3Byb3RvY29sXTsKKworICAgIGlmIFtpc19yZW1vdGUgaG9zdF0geworCXNldCBhcmcgW3JlbW90ZV9kb3dubG9hZCBob3N0ICRhcmddOworICAgIH0KKyAgICBzZW5kX2dkYiAiZmlsZSAkYXJnXG4iCisgICAgZ2RiX2V4cGVjdCAzMCB7CisJIC1yZSAiQSBwcm9ncmFtIGlzIGJlaW5nIGRlYnVnLipLaWxsIGl0Lip5IG9yIG4uICQiIHsKKwkgICAgc2VuZF9nZGIgInlcbiIKKwkgICAgZXhwX2NvbnRpbnVlCisJfQorICAgICAgICAgLXJlICJMb2FkIG5ldyBzeW1ib2wgdGFibGUuKnkgb3Igbi4gJCIgeworCSAgICBzZW5kX2dkYiAieVxuIgorCSAgICBleHBfY29udGludWUKKwl9CisJIC1yZSAiUmVhZGluZyBzeW1ib2xzIGZyb20uKmRvbmUuLiokZ2RiX3Byb21wdCAkIiB7fQorCSAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgcGVycm9yICJHREIgY291bGRuJ3QgcmVhZCBmaWxlIiB9CisJIHRpbWVvdXQgeyAKKwkgICAgcGVycm9yICIodGltZW91dCkgcmVhZCBzeW1ib2wgZmlsZSIgOyAKKwkgICAgcmV0dXJuIC0xIAorCX0KKyAgICB9CisKKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYl9zZXJpYWxdIHsKKwlzZXQgZ2RiX3NlcmlhbCBbdGFyZ2V0X2luZm8gZ2RiX3NlcmlhbF07CisgICAgfSBlbHNlIHsKKwlpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIHNlcmlhbF0geworCSAgICBzZXQgZ2RiX3NlcmlhbCBbdGFyZ2V0X2luZm8gc2VyaWFsXTsKKwl9IGVsc2UgeworCSAgICBzZXQgZ2RiX3NlcmlhbCBbdGFyZ2V0X2luZm8gbmV0cG9ydF07CisJfQorICAgIH0KKyAgICBzZW5kX2dkYiAidGFyZ2V0IHJlbW90ZSAkZ2RiX3NlcmlhbFxuIgorICAgIGdkYl9leHBlY3QgMzAgeworCS1yZSAiS2lsbCBpdD8uKnkgb3Igbi4qIiB7CisJICAgIHNlbmRfZ2RiICJ5XG4iOworCSAgICBleHBfY29udGludWUKKwl9CisJLXJlICIkZ2RiX3Byb21wdCAkIgl7CisJICAgIHZlcmJvc2UgIlNldCByZW1vdGUgdGFyZ2V0IHRvICRnZGJfc2VyaWFsIiAyCisJfQorCXRpbWVvdXQgeyAKKwkgICAgcGVycm9yICJDb3VsZG4ndCBzZXQgcmVtb3RlIHRhcmdldC4iCisJICAgIHJldHVybiAtMQorCX0KKyAgICB9CisgICAgaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGJfbG9hZF9vZmZzZXRdIHsKKwlzZXQgb2Zmc2V0ICJbdGFyZ2V0X2luZm8gZ2RiX2xvYWRfb2Zmc2V0XSI7CisgICAgfSBlbHNlIHsKKwlzZXQgb2Zmc2V0ICIiOworICAgIH0KKyAgICBzZW5kX2dkYiAibG9hZCAkYXJnICRvZmZzZXRcbiIKKyAgICB2ZXJib3NlICJMb2FkaW5nICRhcmcgaW50byAkR0RCIiAyCisgICAgZ2RiX2V4cGVjdCAxMjAwIHsKKwkgLXJlICJMb2FkaW5nLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHZlcmJvc2UgIkxvYWRlZCAkYXJnIGludG8gJEdEQiIgMQorCX0KKwkgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgeworCSAgICBpZiAkdmVyYm9zZT4xIHRoZW4geworCQlwZXJyb3IgIkdEQiBjb3VsZG4ndCBsb2FkLiIKKwkgICAgfQorCX0KKwkgdGltZW91dCB7CisJICAgIGlmICR2ZXJib3NlPjEgdGhlbiB7CisJCXBlcnJvciAiVGltZWQgb3V0IHRyeWluZyB0byBsb2FkICRhcmcuIgorCSAgICB9CisJfQorICAgIH0KKyAgICBzZW5kX2dkYiAibGlzdCBtYWluXG4iOworICAgIGdkYl9leHBlY3QgNjAgeworCSAtcmUgIiRnZGJfcHJvbXB0IiB7IH0KKwkgZGVmYXVsdCB7CisJICAgIHBlcnJvciAiY29tbWFuZCBmb3IgbGlzdCBtYWluIG5ldmVyIGNvbXBsZXRlZCI7CisJICAgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIDAKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL3VkaS5leHAgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy91ZGkuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNWQ3NzgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy91ZGkuZXhwCkBAIC0wLDAgKzEsMTEyIEBACisjIFRlc3QgRnJhbWV3b3JrIERyaXZlciBmb3IgR0RCIGRyaXZpbmcgVW5pdmVyc2FsIERlYnVnIEludGVyZmFjZSBvbiAyOUsKKyMgICBDb3B5cmlnaHQgMTk4OCwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIERlamFHbnVAY3lnbnVzLmNvbQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llLiAocm9iQGN5Z251cy5jb20pCisKK2xvYWRfbGliIGdkYi5leHAKKworIworIyBnZGJfdGFyZ2V0X3VkaQorIyBTZXQgZ2RiIHRvIHRoZSBkZXNpcmVkIFVESSB0YXJnZXQKKyMKK3Byb2MgZ2RiX3RhcmdldF91ZGkgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCB2ZXJib3NlCisgICAgZ2xvYmFsIGV4aXRfc3RhdHVzCisKKyAgICBzZXQgdGFyZ2V0bmFtZSBbdGFyZ2V0X2luZm8gbW9uZGZlLG5hbWVdOworICAgICMgc2V0IHRhcmdldHMgaG9zdG5hbWUKKyAgICBzZW5kX2dkYiAidGFyZ2V0IHVkaSAkdGFyZ2V0bmFtZVxuIgorICAgIHNldCB0aW1lb3V0IDYwCisgICAgdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidGFyZ2V0IHVkaSAkdGFyZ2V0bmFtZVxbXHJcblxdKyIgeworCSAgICBleHBfY29udGludWUKKwl9CisJLXJlICJUSVAgVURJIDEuMiBDb25mb3JtYW50LiokZ2RiX3Byb21wdCAkIgl7CisJICAgIHZlcmJvc2UgIlNldCB0YXJnZXQgdG8gJHRhcmdldG5hbWUiCisJfQorCS1yZSAiVElQLWlwYyBXQVJOSU5HLC4qZmFpbGVkOiIgeworCSAgICB3YXJuaW5nICIkZXhwZWN0X291dChidWZmZXIpIgorCX0KKwktcmUgIlRJUC1pcGMgRVJST1IsLipmYWlsZWQ6IiB7CisJICAgIHBlcnJvciAiJGV4cGVjdF9vdXQoYnVmZmVyKSIKKwl9CisJLXJlICJBIHByb2dyYW0gaXMgYmVpbmcgZGVidWdnZWQgYWxyZWFkeS4gIEtpbGwgaXRcPyBcKHkgb3IgblwpIiB7CisJICAgIHNlbmQgInlcbiIKKwkgICAgZXhwX2NvbnRpbnVlCisJfQorCXRpbWVvdXQgeyAKKwkgICAgcGVycm9yICJDb3VsZG4ndCBzZXQgdGFyZ2V0IGZvciBVREkuIgorCSAgICBjbGVhbnVwCisJICAgIGV4aXQgJGV4aXRfc3RhdHVzCisJfQorICAgIH0KKyAgICBzZXQgdGltZW91dCAxMAorICAgIHZlcmJvc2UgIlRpbWVvdXQgaXMgbm93ICR0aW1lb3V0IHNlY29uZHMiIDIKK30KKworIworIyBnZGJfbG9hZCAtLSBsb2FkIGEgZmlsZSBpbnRvIHRoZSBkZWJ1Z2dlci4KKyMgICAgICAgICAgICAgcmV0dXJuIGEgLTEgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4KKyMKKworcHJvYyBnZGJfbG9hZCB7IGFyZyB9IHsKKyAgICBnbG9iYWwgdmVyYm9zZQorICAgIGdsb2JhbCBsb2FkcGF0aAorICAgIGdsb2JhbCBsb2FkZmlsZQorICAgIGdsb2JhbCBHREIKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgaWYgW2dkYl9maWxlX2NtZCAkYXJnXSB7CisJcmV0dXJuIC0xIAorICAgIH0KKworICAgIGdkYl90YXJnZXRfdWRpCit9CisKKyMKKyMgZ2RiX3N0YXJ0IC0tIHN0YXJ0IEdEQiBydW5uaW5nLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGVyZSB0aGUKKyMgICAgICAgICAgICAgIFVESUNPTkYgZW52aXJvbWVudCB2YXJpYWJsZSBpcyBzZXQuCisjCitwcm9jIGdkYl9zdGFydCB7IH0geworICAgIGdsb2JhbCBlbnY7CisKKyAgICBzZXQgZW52KFVESUNPTkYpIFt0YXJnZXRfaW5mbyBtb25kZmUsdWRpX3NvY107CisgICAgZGVmYXVsdF9nZGJfc3RhcnQKKyAgICB2ZXJib3NlICJTZXR0aW5nIHVwIHRhcmdldCwgUGxlYXNlIHdhaXQuLi4iCisgICAgZ2RiX3RhcmdldF91ZGkKK30KKworIworIyBnZGJfZXhpdCAtLSBleGl0IGdkYgorIworcHJvYyBnZGJfZXhpdCB7IH0geworICAgIGNhdGNoIGRlZmF1bHRfZ2RiX2V4aXQKKyAgICBzZXQgaW4gW29wZW4gW2NvbmNhdCAifGxzIC1GIl0gcl0KKyAgICB3aGlsZSB7W2dldHMgJGluIGxpbmVdPi0xfSB7CisJaWYgW3JlZ2V4cCAiPSQiICRsaW5lXSB0aGVuIHsKKwkgICAgc2V0IGxpbmUgW3N0cmluZyB0cmltcmlnaHQgJGxpbmUgIj0iXQorCSAgICB2ZXJib3NlICJSZW1vdmluZyB0aGUgJGxpbmUgbmFtZWQgc29ja2V0IgorCSAgICBleGVjIHJtIC1mICRsaW5lCisJfQorICAgIH0KKyAgICBjbG9zZSAkaW4KK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL3VuaXguZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvdW5peC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIxYWQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL3VuaXguZXhwCkBAIC0wLDAgKzEsMjkgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5ODgsIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTQsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUuIChyb2JAY3lnbnVzLmNvbSkKKworIyBTZXQgYSBkZWZhdWx0IHRpbWVvdXQgdG8gYmUgdXNlZCBmb3IgdGhlIHRlc3RzIHVuZGVyIFVOSVgsIHJhdGhlciB0aGFuCisjIGFjY2VwdGluZyB3aGF0ZXZlciBkZWZhdWx0IGRlamFnbnUgZ2l2ZXMgdXMgKGFwcGFyZW50bHkgMTAgc2Vjb25kcykuCisjIFdoZW4gcnVubmluZyB0aGUgdGVzdHMgb3ZlciBORlMsIHVuZGVyIHNvbWV3aGF0IGhlYXZ5IGxvYWQsIDEwIHNlY29uZHMKKyMgZG9lcyBub3Qgc2VlbSB0byBiZSBlbm91Z2guICBUcnkgc3RhcnRpbmcgd2l0aCA2MC4KK3NldCB0aW1lb3V0IDYwCit2ZXJib3NlICJUaW1lb3V0IGlzIG5vdyAkdGltZW91dCBzZWNvbmRzIiAyCisKK2xvYWRfbGliIGdkYi5leHAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL3Vua25vd24uZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvdW5rbm93bi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNjZmI3OQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL3Vua25vd24uZXhwCkBAIC0wLDAgKzEsMjEgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKK3BlcnJvciAiU29ycnksIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHRoaXMgdGFyZ2V0IgorZXhpdCAxCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2NvbmZpZy92cjQzMDAuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvdnI0MzAwLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmFkZTEzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvdnI0MzAwLmV4cApAQCAtMCwwICsxLDIwIEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCitsb2FkX2xpYiAuLi9jb25maWcvbW9uaXRvci5leHAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL3ZyNTAwMC5leHAgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy92cjUwMDAuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YWRlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy92cjUwMDAuZXhwCkBAIC0wLDAgKzEsMjAgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKK2xvYWRfbGliIC4uL2NvbmZpZy9tb25pdG9yLmV4cApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvdnguZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvdnguZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTA2MDYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZy92eC5leHAKQEAgLTAsMCArMSwxMzAgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5ODgsIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIERlamFHbnVAY3lnbnVzLmNvbQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llLiAocm9iQGN5Z251cy5jb20pCisKKyMKKyMgbG9hZCBzdXBwb3J0IGxpYnJhcmllcworIworbG9hZF9saWIgcmVtb3RlLmV4cAorbG9hZF9saWIgZ2RiLmV4cAorCitzZXQgc2hlbGxfcHJvbXB0ICItPiIKK3NldCBnZGJfcHJvbXB0ICJcXCh2eGdkYlxcKSIKKworIworIyBnZGJfdmVyc2lvbiAtLSBleHRyYWN0IGFuZCBwcmludCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgZ2NjCisjCitwcm9jIGdkYl92ZXJzaW9uIHt9IHsKKyAgICBkZWZhdWx0X2dkYl92ZXJzaW9uCit9CisKKyMKKyMgZ2RiX2xvYWQgLS0gbG9hZCBhIGZpbGUgaW50byB0aGUgZGVidWdnZXIuCisjIFdlIGhhdmUgdG8gc3RvcCBhbmQgc3RhcnQgZ2RiIGVhY2ggdGltZSB3ZSBkbyB0aGlzLCBiZWNhdXNlIHdoZW4KKyMgdnhnZGIgbG9hZHMgdHdvIGZpbGVzIGluIGEgcm93LCB0aGUgc3ltYm9scyBpbiB0aGUgZmlyc3QgZmlsZSBsb2FkZWQKKyMgdGFrZSBwcmVjZWRlbmNlLiBSZXR1cm5zIC0xIG9uIGVycm9yLCBlbHNlIDAuCisjCitwcm9jIGdkYl9sb2FkIHsgYXJnIH0geworICAgIHNldCByZXN1bHQgMAorCisgICAgaWYgeyBbcmVtb3RlX2xkIHRhcmdldCAkYXJnXSAhPSAwIH0geworCXBlcnJvciAiQ291bGRuJ3QgbG9hZCAkYXJnIgorCXJldHVybiAtMQorICAgIH0KKworICAgIHJldHVybiBbZ2RiX2ZpbGVfY21kICRhcmddCit9CisKKyMKKyMgZ2RiX3N0YXJ0IC0tIHN0YXJ0IGdkYiBydW5uaW5nCisjCitwcm9jIGdkYl9zdGFydCB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIHZlcmJvc2UKKyAgICBnbG9iYWwgY29ubmVjdG1vZGUKKyAgICBnbG9iYWwgcmVib290CisKKyAgICAjIGdldCBhIGNvbm5lY3Rpb24gdG8gdGhlIGJvYXJkCisgICAgZm9yIHsgc2V0IHggMDsgfSB7ICR4IDwgMyB9IHsgaW5jciB4IH0geworCXNldCBzaGVsbF9pZCBbcmVtb3RlX29wZW4gdGFyZ2V0XQorCWlmIHsgJHNoZWxsX2lkID4gMCB9IHsKKwkgICAgdmVyYm9zZSAiU3Bhd24gaWQgZm9yIHJlbW90ZSBzaGVsbCBpcyAkc2hlbGxfaWQiCisKKwkgICAgc2V0IHRpbWVvdXQgMTAKKwkgICAgdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorCisJICAgIHNldCBzdGF0ZSBbc3Bhd25fdnhnZGJdOworCSAgICBpZiB7ICRzdGF0ZSA9PSAicGFzcyIgfSB7CisJCXJldHVybiAwOworCSAgICB9CisJICAgIGlmIHsgJHN0YXRlID09ICJmYWlsIiB9IHsKKwkJcmV0dXJuIC0xOworCSAgICB9CisJfQorCXJlbW90ZV9yZWJvb3QgdGFyZ2V0OworICAgIH0KK30KKworcHJvYyBzcGF3bl92eGdkYiB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBkZWZhdWx0X2dkYl9zdGFydAorCisgICAgIyBzZXQgdGhlIGRlZmF1bHQgYXJndW1lbnRzIHRvICJtYWluIiwgc28gdGhhdCAicnVuIiB3aXRoIG5vCisgICAgIyBhcmd1bWVudHMgd2lsbCB3b3JrIGNvcnJlY3RseS4KKyAgICBzZW5kX2dkYiAic2V0IGFyZ3MgbWFpblxuIgorICAgIGdkYl9leHBlY3QgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9CisKKyAgICB2ZXJib3NlICJTZXR0aW5nIHVwIHRhcmdldCwgUGxlYXNlIHdhaXQuLi4iCisgICAgIyBzZXQgdGFyZ2V0cyBob3N0bmFtZQorICAgIHNlbmRfZ2RiICJ0YXJnZXQgdnh3b3JrcyBbdGFyZ2V0X2luZm8gaG9zdG5hbWVdXG4iCisgICAgc2V0IHRpbWVvdXQgNjAKKyAgICB2ZXJib3NlICJUaW1lb3V0IGlzIG5vdyAkdGltZW91dCBzZWNvbmRzIiAyCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJEb25lXC4uKiRnZGJfcHJvbXB0ICQiCXsKKwkgICAgdmVyYm9zZSAiU2V0IHRhcmdldCB0byBbdGFyZ2V0X2luZm8gaG9zdG5hbWVdIiAxCisJICAgIHNldCB0aW1lb3V0IDEwOworCSAgICByZXR1cm4gInBhc3MiOworCX0KKwktcmUgIm5ldF9jb25uZWN0OiBSUEM6IChQcm9ncmFtIG5vdCByZWdpc3RlcmVkfC4qVGltZWQgb3V0KS4qJCIgeworCSAgICB3YXJuaW5nICJDb3VsZG4ndCBzZXQgR0RCIHRvIHRhcmdldCBbdGFyZ2V0X2luZm8gbmV0cG9ydF0uIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgd2FybmluZyAiQ291bGRuJ3Qgc2V0IHRhcmdldCBmb3Igdnh3b3Jrcy4iCisJfQorICAgIH0KKyAgICByZXR1cm4gInJldHJ5IjsKK30KKworcHJvYyBnZGJfZXhpdCB7IH0geworICAgIHJlbW90ZV9jbG9zZSB0YXJnZXQ7CisgICAgY2F0Y2ggZGVmYXVsdF9nZGJfZXhpdAorfQorCisjZXhwZWN0X2FmdGVyIHsKKyMgICAgIjxyZXR1cm4+IgkJICAgeyBzZW5kICJcbiI7IHBlcnJvciAiV2luZG93IHRvbyBzbWFsbC4iIH0KKyMgICAgLXJlICJcKHkgb3IgblwpICIgCSAgIHsgc2VuZCAiblxuIjsgcGVycm9yICJHb3QgaW50ZXJhY3RpdmUgcHJvbXB0LiIgfQorIyAgICBidWZmZXJfZnVsbAkJICAgeyBwZXJyb3IgImludGVybmFsIGJ1ZmZlciBpcyBmdWxsLiIgfQorIyAgICBlb2YJCQkgICB7IHBlcnJvciAiZW9mIC0tIHB0eSBpcyBob3NlZC4iIH0KKyMgICAgdGltZW91dAkJCSAgIHsgcGVycm9yICJ0aW1lb3V0LiIgfQorIyAgICAidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIiB7IHBlcnJvciAidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkLiIgfQorIyAgICAiVW5kZWZpbmVkIGNvbW1hbmQiCSAgIHsgcGVycm9yICJzZW5kIHN0cmluZyBwcm9iYWJseSB3cm9uZy4iIH0KKyN9CisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL3Z4d29ya3MuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvdnh3b3Jrcy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljNTBjOAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL3Z4d29ya3MuZXhwCkBAIC0wLDAgKzEsMjAgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKK2xvYWRfbGliIC4uL2NvbmZpZy92eC5leHAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvY29uZmlnL3Z4d29ya3MyOWsuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWcvdnh3b3JrczI5ay5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0YzUzYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvY29uZmlnL3Z4d29ya3MyOWsuZXhwCkBAIC0wLDAgKzEsMjcgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIERlamFHbnVAY3lnbnVzLmNvbQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBCcmVuZGFuIEtlaG9lIChicmVuZGFuQGN5Z251cy5jb20pLgorCisjIFdlIG5lZWQgdGhpcyBmaWxlIGhlcmUgYmVjYXVzZSB0aGUgdGFyZ2V0bmFtZSBmb3IgdGhlIDI5ayBib2FyZAorIyBpcyBgdnh3b3JrczI5aycsIG5vdCBgdnh3b3JrcycuICBUaGF0IHdheSBvdGhlciB0b29scyAoZS5nLiwgZ2NjKQorIyBjYW4gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSBzdHVmZiBydW4gb24gdGhhdCBib2FyZCBhbmQgb3RoZXJzLgorCit2ZXJib3NlICJMb2FkaW5nICR7c3JjZGlyfS9jb25maWcvdnguZXhwIgorc291cmNlICR7c3JjZGlyfS9jb25maWcvdnguZXhwCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2NvbmZpZ3VyZSBiL2dkYi90ZXN0c3VpdGUvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJmNjYzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDEwNTggQEAKKyMhIC9iaW4vc2gKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCisjIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworIyBEZWZhdWx0czoKK2FjX2hlbHA9CithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCisjIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46CithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaGFyZWQgICAgICAgICB1c2Ugc2hhcmVkIGxpYnJhcmllcyIKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2J1aWxkPU5PTkUKK2NhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2V4ZWNfcHJlZml4PU5PTkUKK2hvc3Q9Tk9ORQorbm9fY3JlYXRlPQorbm9ub3B0PU5PTkUKK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3RhcmdldD1OT05FCit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorc3ViZGlycz0KK01GTEFHUz0gTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCisgICAgZXhpdCAwIDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Li9jb25maWcubG9nCisKK2VjaG8gIlwKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorIiAxPiY1CisKKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCithY19jb25maWd1cmVfYXJncz0KK2ZvciBhY19hcmcKK2RvCisgIGNhc2UgIiRhY19hcmciIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBlc2FjCitkb25lCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKyMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCisjIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCitpZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID4gY29uZmRlZnMuaAorCisjIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0CisjIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorYWNfdW5pcXVlX2ZpbGU9Z2RiLmJhc2UKKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCithY19leGVleHQ9CithY19vYmpleHQ9bworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworCisKK0NDPSR7Q0MtY2N9CisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTc3OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKKworaG9zdF9hbGlhcz0kaG9zdAorY2FzZSAiJGhvc3RfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkKKyAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6CisgICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkgOzsKKyAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCitob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkaG9zdCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU5ODogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKwordGFyZ2V0X2FsaWFzPSR0YXJnZXQKK2Nhc2UgIiR0YXJnZXRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKwordGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAordGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK3RhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCit0YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjE2OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworCisjIERpcmVjdG9yaWVzIHRvIHVzZSBpbiBhbGwgY29uZmlndXJhdGlvbnMuCitjb25maWdkaXJzPSJnZGIuYXNtIGdkYi5iYXNlIGdkYi5jKysgZ2RiLmRpc2FzbSBnZGIuY2hpbGwgZ2RiLnRocmVhZHMgZ2RiLnRyYWNlIgorCisjIERpcmVjdG9yaWVzIHRvIHVzZSBmb3IgYSBjb25maWd1cmF0aW9uIHdoaWNoIHVzZXMgc3RhYnMuCitzdGFic2RpcnM9ImdkYi5zdGFicyIKKworCSMgdGhpcyBzZWN0aW9uIGlzIGZvciB0YXJnZXRzIHRoYXQgdXNlIHN0YWJzCisjIGFkZCBzdGFicyB0ZXN0cyBmb3IgYXBwcm9wcmlhdGUgdGFyZ2V0cworY2FzZSAiJHt0YXJnZXR9IiBpbgorCXBvd2VycGMtKi1haXgqKQljb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9ICR7c3RhYnNkaXJzfSIgOzsKKwlyczYwMDAtKi1haXgqKQljb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9ICR7c3RhYnNkaXJzfSIgOzsKKwkqLSotYnNkKikJY29uZmlnZGlycz0iJHtjb25maWdkaXJzfSAke3N0YWJzZGlyc30iIDs7CisJKi0qLWdvMzIqKQljb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9ICR7c3RhYnNkaXJzfSIgOzsKKwkqLSotbGludXgqKQljb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9ICR7c3RhYnNkaXJzfSIgOzsKKwkqLSotbHlueG9zKikJY29uZmlnZGlycz0iJHtjb25maWdkaXJzfSAke3N0YWJzZGlyc30iIDs7CisJKi1zdW4tKikJY29uZmlnZGlycz0iJHtjb25maWdkaXJzfSAke3N0YWJzZGlyc30iIDs7CisJaHBwYSotKi0qKQljb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9ICR7c3RhYnNkaXJzfSIgOzsKKwkqLSotZWxmKikJY29uZmlnZGlycz0iJHtjb25maWdkaXJzfSAke3N0YWJzZGlyc30iIDs7CisJKikJCWlmIHRlc3QgIngke3dpdGhfc3RhYnN9IiA9IHgieWVzIiA7IHRoZW4KKwkJCSAgY29uZmlnZGlycz0iJHtjb25maWdkaXJzfSAke3N0YWJzZGlyc30iCisJCQlmaSA7OworZXNhYworCisjIERpcmVjdG9yeSB3aXRoIEhQIHNwZWNpZmljIHRlc3RzLiBUaGV5IHdpbGwgcnVuIG9ubHkgd2l0aCBIUCdzIGNvbXBpbGVycy4gCisjIFRoZXNlIHRlc3RzIHdpbGwgbm90IHdvcmsgb24gb3RoZXIgcGxhdGZvcm1zIGFuZCBjb21waWxlcnMuCisKK2hwZGlyPSJnZGIuaHAiCisKK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyBocHBhKi0qLWhwdXgqKSBjb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9ICR7aHBkaXJ9IiA7OworZXNhYworCisKKyMgQmVnaW4gc3R1ZmYgdG8gc3VwcG9ydCAtLWVuYWJsZS1zaGFyZWQKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpIHNoYXJlZD10cnVlIDs7CisgIG5vKSAgc2hhcmVkPWZhbHNlIDs7CisgICopIHNoYXJlZD10cnVlIDs7Citlc2FjCitmaQorUlBBVEhfRU5WVkFSPUxEX0xJQlJBUllfUEFUSAorIyBJZiB3ZSBoYXZlIHNoYXJlZCBsaWJyYXJpZXMsIHRyeSB0byBzZXQgUlBBVEhfRU5WVkFSIHJlYXNvbmFibHkuCitpZiB0ZXN0ICIke3NoYXJlZH0iID0gInRydWUiOyB0aGVuCisgIGNhc2UgIiR7aG9zdH0iIGluCisgICotKi1ocHV4KikKKyAgICBSUEFUSF9FTlZWQVI9U0hMSUJfUEFUSAorICAgIDs7CisgIGVzYWMKK2ZpCisKKyMgRW5kIHN0dWZmIHRvIHN1cHBvcnQgLS1lbmFibGUtc2hhcmVkCisKKyMgY29uZmlndXJlIHRoZSBzdWJkaXJlY3RvcmllcyB0b28KK3N1YmRpcnM9IiRjb25maWdkaXJzIgorCisKK3RyYXAgJycgMSAyIDE1CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KKyAgKmFjX3NwYWNlPVwgKikKKyAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgc2VkIC1uIFwKKyAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCisgICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCisgICAgOzsKKyAgKikKKyAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKyAgICA7OworICBlc2FjID4+IGNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCisjIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KKyMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJworZmkKKwordHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gREVGUy4KKyMgUHJvdGVjdCBhZ2FpbnN0IHNoZWxsIGV4cGFuc2lvbiB3aGlsZSBleGVjdXRpbmcgTWFrZWZpbGUgcnVsZXMuCisjIFByb3RlY3QgYWdhaW5zdCBNYWtlZmlsZSBtYWNybyBleHBhbnNpb24uCitjYXQgPiBjb25mdGVzdC5kZWZzIDw8XEVPRgorcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklLURcMT1cMiVnCitzJVsgCWB+IyReJiooKXt9XFx8OyciPD4/XSVcXCYlZworcyVcWyVcXCYlZworcyVcXSVcXCYlZworcyVcJCUkJCVnCitFT0YKK0RFRlM9YHNlZCAtZiBjb25mdGVzdC5kZWZzIGNvbmZkZWZzLmggfCB0ciAnXDAxMicgJyAnYAorcm0gLWYgY29uZnRlc3QuZGVmcworCisKKyMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgorOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorCitlY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCitybSAtZiAkQ09ORklHX1NUQVRVUworY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyMhIC9iaW4vc2gKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCisjIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIworIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKKyMKKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCithY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgorZm9yIGFjX29wdGlvbgorZG8KKyAgY2FzZSAiXCRhY19vcHRpb24iIGluCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKKyAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCisgICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKKyAgICBleGl0IDAgOzsKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCisgICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7CisgIGVzYWMKK2RvbmUKKworYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KK3NlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Cisgcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKKyRhY192cHN1YgorJGV4dHJhc3ViCitzJUBTSEVMTEAlJFNIRUxMJWcKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVARkZMQUdTQCUkRkZMQUdTJWcKK3MlQERFRlNAJSRERUZTJWcKK3MlQExERkxBR1NAJSRMREZMQUdTJWcKK3MlQExJQlNAJSRMSUJTJWcKK3MlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworcyVAcHJlZml4QCUkcHJlZml4JWcKK3MlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKK3MlQGJpbmRpckAlJGJpbmRpciVnCitzJUBzYmluZGlyQCUkc2JpbmRpciVnCitzJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCitzJUBkYXRhZGlyQCUkZGF0YWRpciVnCitzJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCitzJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKK3MlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKK3MlQGxpYmRpckAlJGxpYmRpciVnCitzJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCitzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCitzJUBpbmZvZGlyQCUkaW5mb2RpciVnCitzJUBtYW5kaXJAJSRtYW5kaXIlZworcyVAQ0NAJSRDQyVnCitzJUBob3N0QCUkaG9zdCVnCitzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCitzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKK3MlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZworcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKK3MlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCitzJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCitzJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCitzJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZworcyVAYnVpbGRAJSRidWlsZCVnCitzJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKK3MlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCitzJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZworcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCitzJUBSUEFUSF9FTlZWQVJAJSRSUEFUSF9FTlZWQVIlZworcyVAc3ViZGlyc0AlJHN1YmRpcnMlZworCitDRU9GCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCithY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KK2FjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfbW9yZV9saW5lcz06CithY19zZWRfY21kcz0iIgord2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZmkKKyAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGVsc2UKKyAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGZpCisgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCisgICAgYWNfYmVnPSRhY19lbmQKKyAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgIGFjX3NlZF9jbWRzPWNhdAorZmkKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUifQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KKworICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgIC4pICBzcmNkaXI9LgorICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgorICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7CisgIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgorICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgZXNhYworCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworZXhpdCAwCitFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCitybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwordGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisKK2lmIHRlc3QgIiRub19yZWN1cnNpb24iICE9IHllczsgdGhlbgorCisgICMgUmVtb3ZlIC0tY2FjaGUtZmlsZSBhbmQgLS1zcmNkaXIgYXJndW1lbnRzIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisgIGFjX3N1Yl9jb25maWd1cmVfYXJncz0KKyAgYWNfcHJldj0KKyAgZm9yIGFjX2FyZyBpbiAkYWNfY29uZmlndXJlX2FyZ3M7IGRvCisgICAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgICBhY19wcmV2PQorICAgICAgY29udGludWUKKyAgICBmaQorICAgIGNhc2UgIiRhY19hcmciIGluCisgICAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICAgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgICAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgICAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICAgIDs7CisgICAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgICAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICAgIDs7CisgICAgKikgYWNfc3ViX2NvbmZpZ3VyZV9hcmdzPSIkYWNfc3ViX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgICAgZXNhYworICBkb25lCisKKyAgZm9yIGFjX2NvbmZpZ19kaXIgaW4gJGNvbmZpZ2RpcnM7IGRvCisKKyAgICAjIERvIG5vdCBjb21wbGFpbiwgc28gYSBjb25maWd1cmUgc2NyaXB0IGNhbiBjb25maWd1cmUgd2hpY2hldmVyCisgICAgIyBwYXJ0cyBvZiBhIGxhcmdlIHNvdXJjZSB0cmVlIGFyZSBwcmVzZW50LgorICAgIGlmIHRlc3QgISAtZCAkc3JjZGlyLyRhY19jb25maWdfZGlyOyB0aGVuCisgICAgICBjb250aW51ZQorICAgIGZpCisKKyAgICBlY2hvIGNvbmZpZ3VyaW5nIGluICRhY19jb25maWdfZGlyCisKKyAgICBjYXNlICIkc3JjZGlyIiBpbgorICAgIC4pIDs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgLWQgLi8kYWNfY29uZmlnX2RpciB8fCBta2RpciAuLyRhY19jb25maWdfZGlyOyB0aGVuIDo7CisgICAgICBlbHNlCisgICAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBjcmVhdGUgYHB3ZGAvJGFjX2NvbmZpZ19kaXIiIDE+JjI7IGV4aXQgMTsgfQorICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgYWNfcG9wZGlyPWBwd2RgCisgICAgY2QgJGFjX2NvbmZpZ19kaXIKKworICAgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAvJGFjX2NvbmZpZ19kaXIuCisgICAgICBhY19kb3RzPWBlY2hvICRhY19jb25maWdfZGlyfHNlZCAtZSAncyVeXC4vJSUnIC1lICdzJVteL10kJSYvJScgLWUgJ3MlW14vXSovJS4uLyVnJ2AKKworICAgIGNhc2UgIiRzcmNkaXIiIGluCisgICAgLikgIyBObyAtLXNyY2RpciBvcHRpb24uICBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgICBhY19zdWJfc3JjZGlyPSRzcmNkaXIgOzsKKyAgICAvKikgIyBBYnNvbHV0ZSBwYXRoLgorICAgICAgYWNfc3ViX3NyY2Rpcj0kc3JjZGlyLyRhY19jb25maWdfZGlyIDs7CisgICAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgICAgYWNfc3ViX3NyY2Rpcj0kYWNfZG90cyRzcmNkaXIvJGFjX2NvbmZpZ19kaXIgOzsKKyAgICBlc2FjCisKKyAgICAjIENoZWNrIGZvciBndWVzdGVkIGNvbmZpZ3VyZTsgb3RoZXJ3aXNlIGdldCBDeWdudXMgc3R5bGUgY29uZmlndXJlLgorICAgIGlmIHRlc3QgLWYgJGFjX3N1Yl9zcmNkaXIvY29uZmlndXJlOyB0aGVuCisgICAgICBhY19zdWJfY29uZmlndXJlPSRhY19zdWJfc3JjZGlyL2NvbmZpZ3VyZQorICAgIGVsaWYgdGVzdCAtZiAkYWNfc3ViX3NyY2Rpci9jb25maWd1cmUuaW47IHRoZW4KKyAgICAgIGFjX3N1Yl9jb25maWd1cmU9JGFjX2NvbmZpZ3VyZQorICAgIGVsc2UKKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfY29uZmlnX2RpciIgMT4mMgorICAgICAgYWNfc3ViX2NvbmZpZ3VyZT0KKyAgICBmaQorCisgICAgIyBUaGUgcmVjdXJzaW9uIGlzIGhlcmUuCisgICAgaWYgdGVzdCAtbiAiJGFjX3N1Yl9jb25maWd1cmUiOyB0aGVuCisKKyAgICAgICMgTWFrZSB0aGUgY2FjaGUgZmlsZSBuYW1lIGNvcnJlY3QgcmVsYXRpdmUgdG8gdGhlIHN1YmRpcmVjdG9yeS4KKyAgICAgIGNhc2UgIiRjYWNoZV9maWxlIiBpbgorICAgICAgLyopIGFjX3N1Yl9jYWNoZV9maWxlPSRjYWNoZV9maWxlIDs7CisgICAgICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgICAgIGFjX3N1Yl9jYWNoZV9maWxlPSIkYWNfZG90cyRjYWNoZV9maWxlIiA7OworICAgICAgZXNhYworCisgICAgICBlY2hvICJydW5uaW5nICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19zdWJfY29uZmlndXJlICRhY19zdWJfY29uZmlndXJlX2FyZ3MgLS1jYWNoZS1maWxlPSRhY19zdWJfY2FjaGVfZmlsZSAtLXNyY2Rpcj0kYWNfc3ViX3NyY2RpciIKKyAgICAgICMgVGhlIGV2YWwgbWFrZXMgcXVvdGluZyBhcmd1bWVudHMgd29yay4KKyAgICAgIGlmIGV2YWwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX3N1Yl9jb25maWd1cmUgJGFjX3N1Yl9jb25maWd1cmVfYXJncyAtLWNhY2hlLWZpbGU9JGFjX3N1Yl9jYWNoZV9maWxlIC0tc3JjZGlyPSRhY19zdWJfc3JjZGlyCisgICAgICB0aGVuIDoKKyAgICAgIGVsc2UKKyAgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfc3ViX2NvbmZpZ3VyZSBmYWlsZWQgZm9yICRhY19jb25maWdfZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgICAgIGZpCisgICAgZmkKKworICAgIGNkICRhY19wb3BkaXIKKyAgZG9uZQorZmkKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9jb25maWd1cmUuaW4gYi9nZGIvdGVzdHN1aXRlL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzM1NmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9jb25maWd1cmUuaW4KQEAgLTAsMCArMSw3MiBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK2RubCBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgZnJhZ21lbnQgdGhhdCBzdXBwbGllcyB0aGUgaW5mb3JtYXRpb24KK2RubCBuZWNlc3NhcnkgdG8gdGFpbG9yIGEgdGVtcGxhdGUgY29uZmlndXJlIHNjcmlwdCBpbnRvIHRoZSBjb25maWd1cmUKK2RubCBzY3JpcHQgYXBwcm9wcmlhdGUgZm9yIHRoaXMgZGlyZWN0b3J5LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIGNoZWNrCitkbmwgYW55IGV4aXN0aW5nIGNvbmZpZ3VyZSBzY3JpcHQuCisKK0FDX1BSRVJFUSgyLjEyLjEpCitBQ19JTklUKGdkYi5iYXNlKQorCitDQz0ke0NDLWNjfQorQUNfU1VCU1QoQ0MpCitBQ19DT05GSUdfQVVYX0RJUihgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uKQorQUNfQ0FOT05JQ0FMX1NZU1RFTQorCisjIERpcmVjdG9yaWVzIHRvIHVzZSBpbiBhbGwgY29uZmlndXJhdGlvbnMuCitjb25maWdkaXJzPSJnZGIuYXNtIGdkYi5iYXNlIGdkYi5jKysgZ2RiLmRpc2FzbSBnZGIuY2hpbGwgZ2RiLnRocmVhZHMgZ2RiLnRyYWNlIgorCisjIERpcmVjdG9yaWVzIHRvIHVzZSBmb3IgYSBjb25maWd1cmF0aW9uIHdoaWNoIHVzZXMgc3RhYnMuCitzdGFic2RpcnM9ImdkYi5zdGFicyIKKworCSMgdGhpcyBzZWN0aW9uIGlzIGZvciB0YXJnZXRzIHRoYXQgdXNlIHN0YWJzCisjIGFkZCBzdGFicyB0ZXN0cyBmb3IgYXBwcm9wcmlhdGUgdGFyZ2V0cworY2FzZSAiJHt0YXJnZXR9IiBpbgorCXBvd2VycGMtKi1haXgqKQljb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9ICR7c3RhYnNkaXJzfSIgOzsKKwlyczYwMDAtKi1haXgqKQljb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9ICR7c3RhYnNkaXJzfSIgOzsKKwkqLSotYnNkKikJY29uZmlnZGlycz0iJHtjb25maWdkaXJzfSAke3N0YWJzZGlyc30iIDs7CisJKi0qLWdvMzIqKQljb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9ICR7c3RhYnNkaXJzfSIgOzsKKwkqLSotbGludXgqKQljb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9ICR7c3RhYnNkaXJzfSIgOzsKKwkqLSotbHlueG9zKikJY29uZmlnZGlycz0iJHtjb25maWdkaXJzfSAke3N0YWJzZGlyc30iIDs7CisJKi1zdW4tKikJY29uZmlnZGlycz0iJHtjb25maWdkaXJzfSAke3N0YWJzZGlyc30iIDs7CisJaHBwYSotKi0qKQljb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9ICR7c3RhYnNkaXJzfSIgOzsKKwkqLSotZWxmKikJY29uZmlnZGlycz0iJHtjb25maWdkaXJzfSAke3N0YWJzZGlyc30iIDs7CisJKikJCWlmIHRlc3QgIngke3dpdGhfc3RhYnN9IiA9IHgieWVzIiA7IHRoZW4KKwkJCSAgY29uZmlnZGlycz0iJHtjb25maWdkaXJzfSAke3N0YWJzZGlyc30iCisJCQlmaSA7OworZXNhYworCisjIERpcmVjdG9yeSB3aXRoIEhQIHNwZWNpZmljIHRlc3RzLiBUaGV5IHdpbGwgcnVuIG9ubHkgd2l0aCBIUCdzIGNvbXBpbGVycy4gCisjIFRoZXNlIHRlc3RzIHdpbGwgbm90IHdvcmsgb24gb3RoZXIgcGxhdGZvcm1zIGFuZCBjb21waWxlcnMuCisKK2hwZGlyPSJnZGIuaHAiCisKK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyBocHBhKi0qLWhwdXgqKSBjb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9ICR7aHBkaXJ9IiA7OworZXNhYworCisKKyMgQmVnaW4gc3R1ZmYgdG8gc3VwcG9ydCAtLWVuYWJsZS1zaGFyZWQKK0FDX0FSR19FTkFCTEUoc2hhcmVkLAorWyAgLS1lbmFibGUtc2hhcmVkICAgICAgICAgdXNlIHNoYXJlZCBsaWJyYXJpZXNdLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKSBzaGFyZWQ9dHJ1ZSA7OworICBubykgIHNoYXJlZD1mYWxzZSA7OworICAqKSBzaGFyZWQ9dHJ1ZSA7OworZXNhY10pZG5sCitSUEFUSF9FTlZWQVI9TERfTElCUkFSWV9QQVRICisjIElmIHdlIGhhdmUgc2hhcmVkIGxpYnJhcmllcywgdHJ5IHRvIHNldCBSUEFUSF9FTlZWQVIgcmVhc29uYWJseS4KK2lmIHRlc3QgIiR7c2hhcmVkfSIgPSAidHJ1ZSI7IHRoZW4KKyAgY2FzZSAiJHtob3N0fSIgaW4KKyAgKi0qLWhwdXgqKQorICAgIFJQQVRIX0VOVlZBUj1TSExJQl9QQVRICisgICAgOzsKKyAgZXNhYworZmkKK0FDX1NVQlNUKFJQQVRIX0VOVlZBUikKKyMgRW5kIHN0dWZmIHRvIHN1cHBvcnQgLS1lbmFibGUtc2hhcmVkCisKKyMgY29uZmlndXJlIHRoZSBzdWJkaXJlY3RvcmllcyB0b28KK0FDX0NPTkZJR19TVUJESVJTKCRjb25maWdkaXJzKQorCitkbmwgQUNfU1VCU1QoZ2RiX3RhcmdldF9jcHUpCitBQ19PVVRQVVQoTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5hc20vTWFrZWZpbGUuaW4gYi9nZGIvdGVzdHN1aXRlL2dkYi5hc20vTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxNjliNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmFzbS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDMzIEBACitWUEFUSCA9IEBzcmNkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorCitFWEVDVVRBQkxFUyA9CisKKyMgdXVlbmNvZGVkIGZvcm1hdCB0byBhdm9pZCBTQ0NTL1JDUyBwcm9ibGVtcyB3aXRoIGJpbmFyeSBmaWxlcy4KK0NST1NTX0VYRUNVVEFCTEVTID0KKworYWxsOgorCUBlY2hvICJOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIGFsbC4uLiIKKworaW5mbzoKK2luc3RhbGwtaW5mbzoKK2R2aToKK2luc3RhbGw6Cit1bmluc3RhbGw6IGZvcmNlCitpbnN0YWxsY2hlY2s6CitjaGVjazoKKworY2xlYW4gbW9zdGx5Y2xlYW46CisJLXJtIC1mICp+ICoubyBhLm91dCB4Z2RiICoueCAkKENST1NTX0VYRUNVVEFCTEVTKSAqLmNpICoudG1wCisJLXJtIC1mIGNvcmUgY29yZS5jb3JlbWFrZXIgY29yZW1ha2VyLmNvcmUgY29yZWZpbGUgJChFWEVDVVRBQkxFUykKKwktcm0gLWYgdHdpY2UtdG1wLmMKKworZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuOiBjbGVhbgorCS1ybSAtZiAqfiBjb3JlCisJLXJtIC1mIE1ha2VmaWxlIGNvbmZpZy5zdGF0dXMgY29uZmlnLmxvZworCS1ybSAtZiBhcmNoLmluYworCS1ybSAtZiAqLWluaXQuZXhwCisJLXJtIC1mciAqLmxvZyBzdW1tYXJ5IGRldGFpbCAqLnBsb2cgKi5zdW0gKi5wc3VtIHNpdGUuKgorCitNYWtlZmlsZSA6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHNyY2RpcikvY29uZmlndXJlLmluCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYXNtL2FzbS1zb3VyY2UuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYXNtL2FzbS1zb3VyY2UuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMmNhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5hc20vYXNtLXNvdXJjZS5leHAKQEAgLTAsMCArMSw5OSBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorIyAKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisjCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBLZW5kcmEuCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCisjCisjIFRlc3QgZGVidWdnaW5nIGFzc2VtYmx5IGxldmVsIHByb2dyYW1zLgorIyBUaGlzIGZpbGUgdXNlcyBhc21zcmNbMTJdLnMgZm9yIGlucHV0LgorIworCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworaWYgW2lzdGFyZ2V0ICJkMTB2LSotKiJdIHRoZW4geworICAgIHNldCBhc20tYXJjaCBkMTB2Cit9IGVsc2UgeworICAgIHZlcmJvc2UgIlNraXBwaW5nIGFzc2VtYmx5IHNvdXJjZSB0ZXN0IC0tIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyB0YXJnZXQuIgorICAgIHJldHVybiAKK30KKworc2V0IHRlc3RmaWxlICJhc20tc291cmNlIgorc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorc2V0IHNyYzEgJHtzcmNkaXJ9LyR7c3ViZGlyfS9hc21zcmMxLnMKK3NldCBzcmMyICR7c3JjZGlyfS8ke3N1YmRpcn0vYXNtc3JjMi5zCisKK3NldCBhc20tZmxhZ3MgIi1XYSwtZ3N0YWJzLC1JJHtzcmNkaXJ9LyR7c3ViZGlyfSwtSSR7b2JqZGlyfS8ke3N1YmRpcn0iCisKK2lmIHtbZ2RiX2NvbXBpbGUgJHtzcmMxfSBhc21zcmMxLm8gb2JqZWN0ICJhZGRpdGlvbmFsX2ZsYWdzPSR7YXNtLWZsYWdzfSJdICE9ICIifSB0aGVuIHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CitpZiB7W2dkYl9jb21waWxlICR7c3JjMn0gYXNtc3JjMi5vIG9iamVjdCAiYWRkaXRpb25hbF9mbGFncz0ke2FzbS1mbGFnc30iXSAhPSAiIn0gdGhlbiB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgImFzbXNyYzEubyBhc21zcmMyLm8iICR7YmluZmlsZX0gZXhlY3V0YWJsZSAibGRmbGFncz0tbm9kZWZhdWx0bGlicyJdICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworcmVtb3RlX2V4ZWMgYnVpbGQgIm12IGFzbXNyYzEubyBhc21zcmMyLm8gJHtvYmpkaXJ9LyR7c3ViZGlyfSIKKworCitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisjCisjIFJ1biB0byBgbWFpbicgd2hlcmUgd2UgYmVnaW4gb3VyIHRlc3RzLgorIworCitpZiAhW3J1bnRvX21haW5dIHRoZW4geworICAgIGdkYl9zdXBwcmVzc190ZXN0cworfQorCisjIEV4ZWN1dGUgdGhlIGBmJyBjb21tYW5kIGFuZCBzZWUgaWYgdGhlIHJlc3VsdCBpbmNsdWRlcyBzb3VyY2UgaW5mby4KK2dkYl90ZXN0ICJmIiAiYXNtc3JjMVxbLlxdczoxOC4qc2V2ZXJhbF9ub3BzIiAiZiBhdCBtYWluIgorCisjIFNlZSBpZiB3ZSBwcm9wZXJseSBgbmV4dCcgb3ZlciBhIG1hY3JvIHdpdGggc2V2ZXJhbCBpbnNucy4KK2dkYl90ZXN0ICJuIiAiMjJcWyAJXF0qLipmb28yIiAibmV4dCBvdmVyIG1hY3JvIgorCisjIFNlZSBpZiB3ZSBjYW4gcHJvcGVybHkgYHN0ZXAnIGludG8gYSBzdWJyb3V0aW5lIGNhbGwuCitnZGJfdGVzdCAicyIgIjhcWyAJXF0qLioiICJzdGVwIGludG8gZm9vMiIKKworIyBTZWUgaWYgYGYnIHByaW50cyB0aGUgcmlnaHQgc291cmNlIGZpbGUuCitnZGJfdGVzdCAiZiIgIi4qYXNtc3JjMlxbLlxdczo4LioiICJmIGluIGZvbzIiCisKKyMgYG5leHQnIG9uZSBpbnNuIChvciBtYWNybykgdG8gc2V0IHVwIG91ciBzdGFja2ZyYW1lIChmb3IgdGhlIGZvbGxvd2luZyBidCkuCitnZGJfdGVzdCAibiIgIjEyXFsgCVxdKi4qZm9vMyIgIm4gaW4gZm9vMiIKKworIyBTZWUgaWYgYGJ0JyBwcmludHMgdGhlIHJpZ2h0IHNvdXJjZSBmaWxlcy4KK2dkYl90ZXN0ICJidCIgIlwjMC4qZm9vMi4qYXNtc3JjMlxbLlxdczoxMi4qXCMxLiptYWluLiphc21zcmMxXFsuXF1zOjIyIiAiYnQgaW4gZm9vMiIKKworIyBTdGVwIGludG8gYW5vdGhlciBzdWJyb3V0aW5lIHdoaWNoIGxpdmVzIGJhY2sgaW4gdGhlIGZpcnN0IHNvdXJjZSBmaWxlLgorZ2RiX3Rlc3QgInMiICIiICJzIDIiCisKKyMgTmV4dCBvdmVyIGluc25zIHRvIHNldCB1cCB0aGUgc3RhY2sgZnJhbWUuCitnZGJfdGVzdCAibiIgIiIgIm4gMiIKKworIyBOb3cgc2VlIGlmIGBidCcgaXMgY29ycmVjdC4KK2dkYl90ZXN0ICJidCIgIlwjMC4qZm9vMy4qYXNtc3JjMVxbLlxdczozMy4qXCMxLipmb28yLiphc21zcmMyXFsuXF1zOjEyLipcIzIuKm1haW4uKmFzbXNyYzFcWy5cXXM6MjIiICJidCBpbiBmb28zIgpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYXNtL2FzbXNyYzEucyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmFzbS9hc21zcmMxLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxMDI4MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmFzbS9hc21zcmMxLnMKQEAgLTAsMCArMSwzNyBAQAorCS5pbmNsdWRlICJjb21tb24uaW5jIgorCS5pbmNsdWRlICJhcmNoLmluYyIKKworY29tbWVudCAibWFpbiByb3V0aW5lIGZvciBhc3NlbWJseSBzb3VyY2UgZGVidWdnaW5nIHRlc3QiCitjb21tZW50ICJUaGlzIHBhcnRpY3VsYXIgdGVzdGNhc2UgdXNlcyBtYWNyb3MgaW4gPGFyY2g+LmluYyB0byBhY2hpZXZlIgorY29tbWVudCAibWFjaGluZSBpbmRlcGVuZGVuY2UuICBUaGlzIGZpbGUgbXVzdCBiZSBjb21waWxlZCB3aXRoIC1EYXJjaD1mb28uIgorCitjb21tZW50ICJXQVJOSU5HOiBhc20tc291cmNlLmV4cCBjaGVja3MgZm9yIGxpbmUgbnVtYmVycyBwcmludGVkIGJ5IGdkYiwiCitjb21tZW50ICJ0aGVyZWZvcmUgYmUgY2FyZWZ1bCBhYm91dCBjaGFuZ2luZyB0aGlzIGZpbGUgd2l0aG91dCBhbHNvIGNoYW5naW5nIgorY29tbWVudCAiYXNtLXNvdXJjZS5leHAuIgorCisJLmdsb2JhbCBtYWluCittYWluOgorCWVudGVyCisKK2NvbW1lbnQgIkNhbGwgYSBtYWNybyB0aGF0IGNvbnNpc3RzIG9mIHNldmVyYWwgbGluZXMgb2YgYXNzZW1ibGVyIGNvZGUuIgorCisJc2V2ZXJhbF9ub3BzCisKK2NvbW1lbnQgIkNhbGwgYSBzdWJyb3V0aW5lIGluIGFub3RoZXIgZmlsZS4iCisKKwljYWxsIGZvbzIKKworY29tbWVudCAiQWxsIGRvbmUuIgorCisJZXhpdDAKKworY29tbWVudCAiQSByb3V0aW5lIGZvciBmb28yIHRvIGNhbGwuIgorCisJLmdsb2JhbCBmb28zCitmb28zOgorCWVudGVyCisJbGVhdmUKKworCS5nbG9iYWwgZXhpdAorZXhpdDoKKwlleGl0MApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYXNtL2FzbXNyYzIucyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmFzbS9hc21zcmMyLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0OGM2YwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmFzbS9hc21zcmMyLnMKQEAgLTAsMCArMSwxNiBAQAorCS5pbmNsdWRlICJjb21tb24uaW5jIgorCS5pbmNsdWRlICJhcmNoLmluYyIKKworY29tbWVudCAiU2Vjb25kIGZpbGUgaW4gYXNzZW1ibHkgc291cmNlIGRlYnVnZ2luZyB0ZXN0Y2FzZS4iCisKKwkuZ2xvYmFsIGZvbzIKK2ZvbzI6CisJZW50ZXIKKworY29tbWVudCAiQ2FsbCBzb21lcGxhY2UgZWxzZS4iCisKKwljYWxsIGZvbzMKKworY29tbWVudCAiQWxsIGRvbmUsIHJldHVybi4iCisKKwlsZWF2ZQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYXNtL2NvbW1vbi5pbmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5hc20vY29tbW9uLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2NhM2FiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYXNtL2NvbW1vbi5pbmMKQEAgLTAsMCArMSwxOCBAQAorCS5tYWNybyBjb21tZW50IHRleHQKKwkuZW5kbQorCisJY29tbWVudCAiQ2FuJ3QgcmVseSBvbiBhc3NlbWJsZXIgY29tbWVudCBjaGFyYWN0ZXIgc28gZG8gdGhpcy4iCisKKwkubWFjcm8gaW5jbHVkZSBhcmNoIGZpbGUKKwkuaW5jbHVkZSAiXGFyY2hcZmlsZSIKKwkuZW5kbQorCitjb21tZW50ICJhcmNoLmluYyBpcyByZXNwb25zaWJsZSBmb3IgZGVmaW5pbmcgdGhlIGZvbGxvd2luZyBtYWNyb3M6IgorY29tbWVudCAiZW50ZXIgLSBzdWJyb3V0aW5lIHByb2xvZ3VlIgorY29tbWVudCAibGVhdmUgLSBzdWJyb3V0aW5lIGVwaWxvZ3VlIgorY29tbWVudCAiY2FsbCAtIGNhbGwgYSBuYW1lZCBzdWJyb3V0aW5lIgorY29tbWVudCAic2V2ZXJhbF9ub3BzIC0gZXhlY3V0ZSBzZXZlcmFsICh0eXBpY2FsbHkgNCkgbm9wcyIKK2NvbW1lbnQgImV4aXQwIC0gZXhpdCAoMCkiCisKK2NvbW1lbnQgIm1hY3JvcyB0byBsYWJlbCBhIHN1YnJvdXRpbmUgbWF5IGFsc28gZXZlbnR1YWxseSBiZSBuZWVkZWQiCitjb21tZW50ICJpLmUuIC5nbG9iYWwgZm9vXG5mb286XG4iCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5hc20vY29uZmlndXJlIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYXNtL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZWRlZjczCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYXNtL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDk1MCBAQAorIyEgL2Jpbi9zaAorCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorYWNfbWF4X2hlcmVfbGluZXM9MTIKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPWFzbS1zb3VyY2UuZXhwCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19wcm9nPSQwCisgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCisKKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgLiAkY2FjaGVfZmlsZQorZWxzZQorICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgPiAkY2FjaGVfZmlsZQorZmkKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworCisKK0NDPSR7Q0MtY2N9CisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTczOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKKworaG9zdF9hbGlhcz0kaG9zdAorY2FzZSAiJGhvc3RfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkKKyAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6CisgICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkgOzsKKyAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCitob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkaG9zdCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU5NDogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKwordGFyZ2V0X2FsaWFzPSR0YXJnZXQKK2Nhc2UgIiR0YXJnZXRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKwordGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAordGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK3RhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCit0YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjEyOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworCithcmNoaW5jPWNvbW1vbi5pbmMKK2Nhc2UgJHt0YXJnZXR9IGluCitkMTB2LSotKikgYXJjaGluYz1kMTB2LmluYyA7OworZXNhYworCisKK3RyYXAgJycgMSAyIDE1CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxIHwgZ3JlcCBhY19zcGFjZWAgaW4KKyAgKmFjX3NwYWNlPVwgKikKKyAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgc2VkIC1uIFwKKyAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCisgICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCisgICAgOzsKKyAgKikKKyAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKyAgICA7OworICBlc2FjID4+IGNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCisjIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KKyMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJworZmkKKwordHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gREVGUy4KKyMgUHJvdGVjdCBhZ2FpbnN0IHNoZWxsIGV4cGFuc2lvbiB3aGlsZSBleGVjdXRpbmcgTWFrZWZpbGUgcnVsZXMuCisjIFByb3RlY3QgYWdhaW5zdCBNYWtlZmlsZSBtYWNybyBleHBhbnNpb24uCitjYXQgPiBjb25mdGVzdC5kZWZzIDw8XEVPRgorcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklLURcMT1cMiVnCitzJVsgCWB+IyReJiooKXt9XFx8OyciPD4/XSVcXCYlZworcyVcWyVcXCYlZworcyVcXSVcXCYlZworcyVcJCUkJCVnCitFT0YKK0RFRlM9YHNlZCAtZiBjb25mdGVzdC5kZWZzIGNvbmZkZWZzLmggfCB0ciAnXDAxMicgJyAnYAorcm0gLWYgY29uZnRlc3QuZGVmcworCisKKyMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgorOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorCitlY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCitybSAtZiAkQ09ORklHX1NUQVRVUworY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyMhIC9iaW4vc2gKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCisjIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIworIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKKyMKKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCithY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgorZm9yIGFjX29wdGlvbgorZG8KKyAgY2FzZSAiXCRhY19vcHRpb24iIGluCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKKyAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCisgICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorCit0cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQFNIRUxMQCUkU0hFTEwlZworcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBERUZTQCUkREVGUyVnCitzJUBMREZMQUdTQCUkTERGTEFHUyVnCitzJUBMSUJTQCUkTElCUyVnCitzJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKK3MlQHByZWZpeEAlJHByZWZpeCVnCitzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCitzJUBiaW5kaXJAJSRiaW5kaXIlZworcyVAc2JpbmRpckAlJHNiaW5kaXIlZworcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworcyVAZGF0YWRpckAlJGRhdGFkaXIlZworcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZworcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCitzJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCitzJUBsaWJkaXJAJSRsaWJkaXIlZworcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworcyVAaW5mb2RpckAlJGluZm9kaXIlZworcyVAbWFuZGlyQCUkbWFuZGlyJWcKK3MlQENDQCUkQ0MlZworcyVAaG9zdEAlJGhvc3QlZworcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZworcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCitzJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKK3MlQGhvc3Rfb3NAJSRob3N0X29zJWcKK3MlQHRhcmdldEAlJHRhcmdldCVnCitzJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZworcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZworcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZworcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKK3MlQGJ1aWxkQCUkYnVpbGQlZworcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCitzJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZworcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKK3MlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZworCitDRU9GCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCithY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KK2FjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfbW9yZV9saW5lcz06CithY19zZWRfY21kcz0iIgord2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZmkKKyAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGVsc2UKKyAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGZpCisgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCisgICAgYWNfYmVnPSRhY19lbmQKKyAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgIGFjX3NlZF9jbWRzPWNhdAorZmkKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUifQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KKworICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgIC4pICBzcmNkaXI9LgorICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgorICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7CisgIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgorICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgZXNhYworCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCithY19zb3VyY2VzPSIkYXJjaGluYyIKK2FjX2Rlc3RzPSJhcmNoLmluYyIKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitzcmNkaXI9JGFjX2dpdmVuX3NyY2Rpcgord2hpbGUgdGVzdCAtbiAiJGFjX3NvdXJjZXMiOyBkbworICBzZXQgJGFjX2Rlc3RzOyBhY19kZXN0PSQxOyBzaGlmdDsgYWNfZGVzdHM9JCoKKyAgc2V0ICRhY19zb3VyY2VzOyBhY19zb3VyY2U9JDE7IHNoaWZ0OyBhY19zb3VyY2VzPSQqCisKKyAgZWNobyAibGlua2luZyAkc3JjZGlyLyRhY19zb3VyY2UgdG8gJGFjX2Rlc3QiCisKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3NvdXJjZTsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBGaWxlIG5vdCBmb3VuZCIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCisgIHJtIC1mICRhY19kZXN0CisKKyAgIyBNYWtlIHJlbGF0aXZlIHN5bWxpbmtzLgorICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGVzdF9kaXI9YGVjaG8gJGFjX2Rlc3R8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9ICIkYWNfZGVzdCIgJiYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZGVzdCBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2Rlc3RfZGlyIiAmJiBta2RpciAiJGFjX2Rlc3RfZGlyIgorICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kZXN0X2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGVzdF9kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rlc3RfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkc3JjZGlyIiBpbgorICBbLyRdKikgYWNfcmVsX3NvdXJjZT0iJHNyY2Rpci8kYWNfc291cmNlIiA7OworICAqKSBhY19yZWxfc291cmNlPSIkYWNfZG90cyRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKKyAgZXNhYworCisgICMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGU7IG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsuCisgIGlmIGxuIC1zICRhY19yZWxfc291cmNlICRhY19kZXN0IDI+L2Rldi9udWxsIHx8CisgICAgbG4gJHNyY2Rpci8kYWNfc291cmNlICRhY19kZXN0OyB0aGVuIDoKKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBsaW5rICRhY19kZXN0IHRvICRzcmNkaXIvJGFjX3NvdXJjZSIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitkb25lCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworZXhpdCAwCitFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCitybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwordGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmFzbS9jb25maWd1cmUuaW4gYi9nZGIvdGVzdHN1aXRlL2dkYi5hc20vY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZjY4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5hc20vY29uZmlndXJlLmluCkBAIC0wLDAgKzEsMjIgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitkbmwgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IGZyYWdtZW50IHRoYXQgc3VwcGxpZXMgdGhlIGluZm9ybWF0aW9uCitkbmwgbmVjZXNzYXJ5IHRvIHRhaWxvciBhIHRlbXBsYXRlIGNvbmZpZ3VyZSBzY3JpcHQgaW50byB0aGUgY29uZmlndXJlCitkbmwgc2NyaXB0IGFwcHJvcHJpYXRlIGZvciB0aGlzIGRpcmVjdG9yeS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBjaGVjaworZG5sIGFueSBleGlzdGluZyBjb25maWd1cmUgc2NyaXB0LgorCitBQ19QUkVSRVEoMi41KQorQUNfSU5JVChhc20tc291cmNlLmV4cCkKKworQ0M9JHtDQy1jY30KK0FDX1NVQlNUKENDKQorQUNfQ09ORklHX0FVWF9ESVIoYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLikKK0FDX0NBTk9OSUNBTF9TWVNURU0KKworZG5sIEluIGRlZmF1bHQgY2FzZSB3ZSBuZWVkIHRvIGxpbmsgd2l0aCBzb21lIGZpbGUgc28gdXNlIGNvbW1vbi5pbmMuCithcmNoaW5jPWNvbW1vbi5pbmMKK2Nhc2UgJHt0YXJnZXR9IGluCitkMTB2LSotKikgYXJjaGluYz1kMTB2LmluYyA7OworZXNhYworQUNfTElOS19GSUxFUygkYXJjaGluYyxhcmNoLmluYykKKworQUNfT1VUUFVUKE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYXNtL2QxMHYuaW5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYXNtL2QxMHYuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOWE0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5hc20vZDEwdi5pbmMKQEAgLTAsMCArMSwyOCBAQAorCWNvbW1lbnQgInN1YnJvdXRpbmUgcHJvbG9ndWUiCisJLm1hY3JvIGVudGVyCisJc3QgcjEzLEAtc3AKKwkuZW5kbQorCisJY29tbWVudCAic3Vicm91dGluZSBlcGlsb2d1ZSIKKwkubWFjcm8gbGVhdmUKKwlsZCByMTMsQHNwKworCWptcCByMTMKKwkuZW5kbQorCisJLm1hY3JvIGNhbGwgc3VicgorCWJsIFxzdWJyCisJLmVuZG0KKworCS5tYWNybyBzZXZlcmFsX25vcHMKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwkuZW5kbQorCisJY29tbWVudCAiZXhpdCAoMCkiCisJLm1hY3JvIGV4aXQwCisJbGRpIHI0LCAxCisJbGRpIHIwLCAwCisJdHJhcCAxNQorCS5lbmRtCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL01ha2VmaWxlLmluIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQ2Mzc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDQ2IEBACitWUEFUSCA9IEBzcmNkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorCitFWEVDVVRBQkxFUyA9IGFsbC10eXBlcyBiaXRmaWVsZHMgYnJlYWsgXAorCWNhbGwtYXItc3QgY2FsbC1ydC1zdCBjYWxsLXN0cnMgY2FsbGZ1bmNzIGNhbGxmdW5jczIgY29tbWFuZHMgXAorCWNvbXBpbGVyIGNvbmRicmVhayBjb25zdHZhcnMgY29yZW1ha2VyIGRpc3BsYXkgXAorCWVuZGluZy1ydW4gZXhwcnMgZnVuY2FyZ3MgaW50LXR5cGUgaW50ZXJydXB0IFwKKwlqdW1wIGxhbmdzIFwKKwlsaXN0IGxvbmdfbG9uZyBcCisJbWlwc19wcm8gbWlzY2V4cHJzIG5vZGVidWcgb3BhcXVlIHBvaW50ZXJzIHBvaW50ZXJzMiBwcmludGNtZHMgcHR5cGUgXAorCXJlY3Vyc2UgcmVyZWFkIHJlcmVhZDEgcmVzdG9yZSByZXR1cm4gcnVuIFwKKwlzY29wZSBzZWN0aW9uX2NvbW1hbmQgc2V0c2hvdyBzZXR2YXIgXAorCXNobWFpbiBzaWdhbGwgc2lnbmFscyBzbW9rZSBcCisJc29saWIgc28taW1wbC1sZCBzby1pbmRyLWNsIFwKKwlzdGVwLXRlc3Qgc3RydWN0cyBzdHJ1Y3RzMiB0d2ljZS10bXAgdmFyYXJncyB3YXRjaHBvaW50IHdoYXRpcworCisjIHV1ZW5jb2RlZCBmb3JtYXQgdG8gYXZvaWQgU0NDUy9SQ1MgcHJvYmxlbXMgd2l0aCBiaW5hcnkgZmlsZXMuCitDUk9TU19FWEVDVVRBQkxFUyA9IGk0ODYtZWxmIGk4NjAtZWxmIG02OGstZWxmIG02OGstYW91dCBtNjhrLWFvdXQyICBcCisJbWlwcy1lY29mZiBzcGFyYy1hb3V0IHNwYXJjLWVsZgorCitNSVNDRUxMQU5FT1VTID0gY29yZW1tYXAuZGF0YSBzaHIxLnNsIHNocjIuc2wgc29saWIxLnNsIHNvbGliMi5zbAorCithbGw6CisJQGVjaG8gIk5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYWxsLi4uIgorCitpbmZvOgoraW5zdGFsbC1pbmZvOgorZHZpOgoraW5zdGFsbDoKK3VuaW5zdGFsbDogZm9yY2UKK2luc3RhbGxjaGVjazoKK2NoZWNrOgorCitjbGVhbiBtb3N0bHljbGVhbjoKKwktcm0gLWYgKn4gKi5vIGEub3V0IHhnZGIgKi54ICQoQ1JPU1NfRVhFQ1VUQUJMRVMpICouY2kgKi50bXAKKwktcm0gLWYgY29yZSBjb3JlLmNvcmVtYWtlciBjb3JlbWFrZXIuY29yZSBjb3JlZmlsZSAkKEVYRUNVVEFCTEVTKQorCS1ybSAtZiAkKE1JU0NFTExBTkVPVVMpIHR3aWNlLXRtcC5jCisKK2Rpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogY2xlYW4KKwktcm0gLWYgKn4gY29yZQorCS1ybSAtZiBNYWtlZmlsZSBjb25maWcuc3RhdHVzIGNvbmZpZy5sb2cKKwktcm0gLWYgKi1pbml0LmV4cAorCS1ybSAtZnIgKi5sb2cgc3VtbWFyeSBkZXRhaWwgKi5wbG9nICouc3VtICoucHN1bSBzaXRlLioKKworTWFrZWZpbGUgOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChzcmNkaXIpL2NvbmZpZ3VyZS5pbgorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvUkVBRE1FIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2ZmM3NQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvUkVBRE1FCkBAIC0wLDAgKzEsMTMgQEAKK0luZm9ybWF0aW9uIGFib3V0IHRoZSB2YXJpb3VzIGV4ZWN1dGFibGVzIGZvdW5kIGluIHRoaXMgdGVzdDoKKworICAgICAgICAgICAgIEJGRCAgICAgICAgICAgICAgQ1BVICAgICBPYmpmaWxlCitFeGVjdXRhYmxlICAgVGFyZ2V0ICAgICAgICAgICBUeXBlICAgIFR5cGUgICAgIEluZm8gYWJvdXQgY29tcGlsYXRpb24gbWFjaGluZQorLS0tLS0tLS0tLSAgIC0tLS0tLSAgICAgICAgICAgLS0tLSAgICAtLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpNDg2LWVsZiAgICAgZWxmLWxpdHRsZSAgICAgICBpNDg2ICAgIEVMRiAgICAgIE5DUiAzMDAwLCAvdXNyL2Njcy9BVFQvY2MKK2k4NjAtZWxmICAgICBlbGYtYmlnICAgICAgICAgIGk4NjAgICAgRUxGICAgICAgU3RyYXR1cworbTY4ay1lbGYgICAgIGVsZi1iaWcgICAgICAgICAgbTY4ayAgICBFTEYgICAgICBBbWlnYSAzMDAwIFVYLCAvdXNyL2Njcy9iaW4vY2MKK202OGstYW91dCAgICBhLm91dC1uZXdzb3MzICAgIG02OGsgICAgYS5vdXQgICAgU29ueSBORVdTCittNjhrLWFvdXQyICAgYS5vdXQtc3Vub3MtYmlnICBtNjhrICAgIGEub3V0ICAgIFN1bk9TIDQuMSwgZ2NjIGN5Z251cy0yLjAuMQorc3BhcmMtYW91dCAgIGEub3V0LXN1bm9zLWJpZyAgc3BhcmMgICBhLm91dCAgICBTdW4gNCwgU3VuT1MgNC4xLjEsIGdjYyAyLjEKK3NwYXJjLWVsZiAgICBlbGYtYmlnICAgICAgICAgIHNwYXJjICAgRUxGICAgICAgU3VuIDQsIFNvbGFyaXMgMS4wLCBnY2MgMi4wLjIKK21pcHMtZWNvZmYgICBlY29mZi1iaWdtaXBzICAgIG1pcHMgICAgZWNvZmYgICAgSVJJWCA0LjAuMQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9hMS1zZWxmdGVzdC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2ExLXNlbGZ0ZXN0LmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzM4OTNhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9hMS1zZWxmdGVzdC5leHAKQEAgLTAsMCArMSw0MjYgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5ODgsIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTQsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUuIChyb2JAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCisjIGFyZSB3ZSBvbiBhIHRhcmdldCBib2FyZAoraWYgW2lzX3JlbW90ZSB0YXJnZXRdIHsKKyAgICByZXR1cm4KK30KKworaWYgW2lzdGFyZ2V0ICJtNjhrKi0qLWhwdXgqIl0gdGhlbiB7CisgICAgIyBUaGUgdG9wLWxldmVsIG1ha2VmaWxlIHBhc3NlcyBDRkxBR1M9IChubyAtZykgZm9yIGhwMzAwLiAgVGhpcyBwcm9iYWJseQorICAgICMgc2hvdWxkIGJlIGZpeGVkIChpdCBpcyBvbmx5IG5lZWRlZCBmb3IgZ2NjIGJvb3RzdHJhcHBpbmcsIG5vdCBnZGIpLAorICAgICMgYnV0IHVudGlsIHRoZW4uLi4uLgorICAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICBmYWlsICJjYW5ub3QgdGVzdCBzZWxmIGlmIGNvbXBpbGVkIHdpdGhvdXQgZGVidWcgaW5mbyIKKyAgICByZXR1cm4gLTEKK30KKworIyBOb3QgYWxsIG9mIHRoZSBsaW5lcyBvZiBjb2RlIG5lYXIgdGhlIHN0YXJ0IG9mIG1haW4gYXJlIGV4ZWN1dGVkIGZvcgorIyBldmVyeSBtYWNoaW5lLiAgQWxzbywgb3B0aW1pemF0aW9uIG1heSByZW9yZGVyIHNvbWUgb2YgdGhlIGxpbmVzLgorIyBTbyBhbGwgd2UgZG8gaXMgdHJ5IHRvIHN0ZXAgb3IgbmV4dCBvdmVyIGV2ZXJ5dGhpbmcgdW50aWwgd2UgZ2V0CisjIHRvIGEgbGluZSB0aGF0IHdlIGtub3cgaXMgYWx3YXlzIGV4ZWN1dGVkLgorCitwcm9jIGRvX3N0ZXBzX2FuZF9uZXh0cyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgc3JjZGlyCisgCisgICAgZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8uLgorCisgICAgZm9yIHtzZXQgY291bnQgMH0geyRjb3VudCA8IDIwfSB7aW5jciBjb3VudH0geworCXNlbmRfZ2RiICJsaXN0XG4iCisJZ2RiX2V4cGVjdCB7CisJICAgIC1yZSAiLipzeW1hcmcgPSBOVUxMLiokZ2RiX3Byb21wdCAkIiB7CisJCXNldCBkZXNjcmlwdGlvbiAic3RlcCBvdmVyIHN5bWFyZyBpbml0aWFsaXphdGlvbiIKKwkJc2V0IGNvbW1hbmQgInN0ZXAiCisJICAgIH0KKwkgICAgLXJlICIuKmV4ZWNhcmcgPSBOVUxMLiokZ2RiX3Byb21wdCAkIiB7CisJCXNldCBkZXNjcmlwdGlvbiAic3RlcCBvdmVyIGV4ZWNhcmcgaW5pdGlhbGl6YXRpb24iCisJCXNldCBjb21tYW5kICJzdGVwIgorCSAgICB9CisJICAgIC1yZSAiLipjb3JlYXJnID0gTlVMTC4qJGdkYl9wcm9tcHQgJCIgeworCQlzZXQgZGVzY3JpcHRpb24gInN0ZXAgb3ZlciBjb3JlYXJnIGluaXRpYWxpemF0aW9uIgorCQlzZXQgY29tbWFuZCAic3RlcCIKKwkgICAgfQorCSAgICAtcmUgIi4qY2RhcmcgPSBOVUxMLiokZ2RiX3Byb21wdCAkIiB7CisJCXNldCBkZXNjcmlwdGlvbiAic3RlcCBvdmVyIGNkYXJnIGluaXRpYWxpemF0aW9uIgorCQlzZXQgY29tbWFuZCAic3RlcCIKKwkgICAgfQorCSAgICAtcmUgIi4qdHR5YXJnID0gTlVMTC4qJGdkYl9wcm9tcHQgJCIgeworCQlzZXQgZGVzY3JpcHRpb24gInN0ZXAgb3ZlciB0dHlhcmcgaW5pdGlhbGl6YXRpb24iCisJCXNldCBjb21tYW5kICJzdGVwIgorCSAgICB9CisJICAgIC1yZSAiLip0aW1lX2F0X3N0YXJ0dXAgPSBnZXRfcnVuX3RpbWUuKiRnZGJfcHJvbXB0ICQiIHsKKwkJc2V0IGRlc2NyaXB0aW9uICJuZXh0IG92ZXIgZ2V0X3J1bl90aW1lIGFuZCBldmVyeXRoaW5nIGl0IGNhbGxzIgorCQlzZXQgY29tbWFuZCAibmV4dCIKKwkgICAgfQorCSAgICAtcmUgIi4qU1RBUlRfUFJPR1JFU1MuKiRnZGJfcHJvbXB0ICQiIHsKKwkJc2V0IGRlc2NyaXB0aW9uICJuZXh0IG92ZXIgU1RBUlRfUFJPR1JFU1MgYW5kIGV2ZXJ5dGhpbmcgaXQgY2FsbHMiCisJCXNldCBjb21tYW5kICJuZXh0IgorCSAgICB9CisJICAgIC1yZSAiLiptYWNfaW5pdC4qJGdkYl9wcm9tcHQgJCIgeworCQlzZXQgZGVzY3JpcHRpb24gIm5leHQgb3ZlciBtYWNfaW5pdCBhbmQgZXZlcnl0aGluZyBpdCBjYWxscyIKKwkJc2V0IGNvbW1hbmQgIm5leHQiCisJICAgIH0KKwkgICAgLXJlICIuKmluaXRfbWFsbG9jLiokZ2RiX3Byb21wdCAkIiB7CisJCXNldCBkZXNjcmlwdGlvbiAibmV4dCBvdmVyIGluaXRfbWFsbG9jIGFuZCBldmVyeXRoaW5nIGl0IGNhbGxzIgorCQlzZXQgY29tbWFuZCAibmV4dCIKKwkgICAgfQorCSAgICAtcmUgIi4qY291bnQgLiAweDMuKiRnZGJfcHJvbXB0ICQiIHsKKwkJc2V0IGRlc2NyaXB0aW9uICJuZXh0IG92ZXIgY29uZGl0aW9uYWwgc3RhY2sgYWxpZ25tZW50IGNvZGUgMSIKKwkJc2V0IGNvbW1hbmQgIm5leHQiCisJICAgIH0KKwkgICAgLXJlICIuKmlmIC5pICE9IDAuKiRnZGJfcHJvbXB0ICQiIHsKKwkJc2V0IGRlc2NyaXB0aW9uICJuZXh0IG92ZXIgY29uZGl0aW9uYWwgc3RhY2sgYWxpZ25tZW50IGNvZGUgMiIKKwkJc2V0IGNvbW1hbmQgIm5leHQiCisJICAgIH0KKwkgICAgLXJlICIuKmFsbG9jYSAuaSAtIDQuKiRnZGJfcHJvbXB0ICQiIHsKKwkJc2V0IGRlc2NyaXB0aW9uICJuZXh0IG92ZXIgY29uZGl0aW9uYWwgc3RhY2sgYWxpZ25tZW50IGFsbG9jYSIKKwkJc2V0IGNvbW1hbmQgIm5leHQiCisJICAgIH0KKwkgICAgLXJlICIuKlNFVF9UT1BfTEVWRUwuKiRnZGJfcHJvbXB0ICQiIHsKKwkJc2V0IGRlc2NyaXB0aW9uICJuZXh0IG92ZXIgU0VUX1RPUF9MRVZFTCBjYWxsIgorCQlzZXQgY29tbWFuZCAibmV4dCIKKwkgICAgfQorCSAgICAtcmUgIi4qY21kc2l6ZSA9IDEuKiRnZGJfcHJvbXB0ICQiIHsKKwkJc2V0IGRlc2NyaXB0aW9uICJzdGVwIG92ZXIgY21kc2l6ZSBpbml0aWFsaXphdGlvbiIKKwkJc2V0IGNvbW1hbmQgIm5leHQiCisJICAgIH0KKwkgICAgLXJlICIuKmNtZGFyZyA9IC4qIHhtYWxsb2MuKiRnZGJfcHJvbXB0ICQiIHsKKwkJc2V0IGRlc2NyaXB0aW9uICJuZXh0IG92ZXIgY21kYXJnIGluaXRpYWxpemF0aW9uIHZpYSB4bWFsbG9jIgorCQlzZXQgY29tbWFuZCAibmV4dCIKKwkgICAgfQorCSAgICAtcmUgIi4qbmNtZCA9IDAuKiRnZGJfcHJvbXB0ICQiIHsKKwkJc2V0IGRlc2NyaXB0aW9uICJuZXh0IG92ZXIgbmNtZCBpbml0aWFsaXphdGlvbiIKKwkJc2V0IGNvbW1hbmQgIm5leHQiCisJICAgIH0KKwkgICAgLXJlICIuKmRpcnNpemUgPSAxLiokZ2RiX3Byb21wdCAkIiB7CisJCXNldCBkZXNjcmlwdGlvbiAibmV4dCBvdmVyIGRpcnNpemUgaW5pdGlhbGl6YXRpb24iCisJCXNldCBjb21tYW5kICJuZXh0IgorCSAgICB9CisJICAgIC1yZSAiLipkaXJhcmcgPSAuKiB4bWFsbG9jLiokZ2RiX3Byb21wdCAkIiB7CisJCXJldHVybgorCSAgICB9CisJICAgIC1yZSAiXFsgXHRcXStce1xyXG4kZ2RiX3Byb21wdCAkIiB7CisJCXNldHVwX3hmYWlsICJtaXBzLSotaXJpeDUqIgorCQlmYWlsICIkZGVzY3JpcHRpb24gZW5kZWQgdXAgYXQgb2RkIGxvY2F0aW9uIgorCSAgICB9CisJICAgIC1yZSAiLiptYWluLmMuKk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkuKiRnZGJfcHJvbXB0ICQiIHsKKwkJc2V0dXBfeGZhaWwgInJzNjAwMC0qLWFpeDMqIgorCQlmYWlsICJtdXN0IGJlIGFibGUgdG8gbGlzdCBzb3VyY2UgbGluZXMiCisJCXJldHVybgorCSAgICB9CisJICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJCWZhaWwgInVua25vd24gc291cmNlIGxpbmUgYWZ0ZXIgJGRlc2NyaXB0aW9uIgorCQlyZXR1cm4KKwkgICAgfQorCSAgICBkZWZhdWx0IHsKKwkJZmFpbCAidW5rbm93biBzb3VyY2UgbGluZSBuZWFyIG1haW4iCisJCXJldHVybgorCSAgICB9CisJfQorCXNlbmRfZ2RiICIkY29tbWFuZFxuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIi4qTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeS5cclxuJGdkYl9wcm9tcHQgJCIgeworCQlmYWlsICIkZGVzY3JpcHRpb24gKG5vIHNvdXJjZSBhdmFpbGFibGUpIgorCSAgICB9CisJICAgIC1yZSAiLipBIGZpbGUgb3IgZGlyZWN0b3J5IC4qIGRvZXMgbm90IGV4aXN0Li5cclxuJGdkYl9wcm9tcHQgJCIgeworCQlmYWlsICIkZGVzY3JpcHRpb24gKG5vIHNvdXJjZSBhdmFpbGFibGUpIgorCSAgICB9CisJICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJCXBhc3MgIiRkZXNjcmlwdGlvbiIKKwkgICAgfQorCSAgICB0aW1lb3V0IHsKKwkJZmFpbCAiJGRlc2NyaXB0aW9uICh0aW1lb3V0KSIKKwkgICAgfQorCX0KKyAgICB9Cit9CisKK3Byb2MgdGVzdF93aXRoX3NlbGYgeyBleGVjdXRhYmxlIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIHRvb2wKKyAgICBnbG9iYWwgZGV0X2ZpbGUKKyAgICBnbG9iYWwgZGVjaW1hbAorICAgIGdsb2JhbCB0aW1lb3V0CisKKyAgICAjIGxvYWQgeW91cnNlbGYgaW50byB0aGUgZGVidWdnZXIKKyAgICAjIFRoaXMgY2FuIHRha2UgYSByZWxhdGl2ZWx5IGxvbmcgdGltZSwgcGFydGljdWxhcmx5IGZvciB0ZXN0aW5nIHdoZXJlCisgICAgIyB0aGUgZXhlY3V0YWJsZSBpcyBiZWluZyBhY2Nlc3NlZCBvdmVyIGEgbmV0d29yaywgb3Igd2hlcmUgZ2RiIGRvZXMgbm90CisgICAgIyBzdXBwb3J0IHBhcnRpYWwgc3ltYm9scyBmb3IgYSBwYXJ0aWN1bGFyIHRhcmdldCBhbmQgaGFzIHRvIGxvYWQgdGhlCisgICAgIyBlbnRpcmUgc3ltYm9sIHRhYmxlLiAgU2V0IHRoZSB0aW1lb3V0IHRvIDEwIG1pbnV0ZXMsIHdoaWNoIHNob3VsZCBiZQorICAgICMgYWRlcXVhdGUgZm9yIG1vc3QgZW52aXJvbm1lbnRzIChpdCAqaGFzKiB0aW1lZCBvdXQgd2l0aCA1IG1pbiBvbiBhCisgICAgIyBTUEFSQ3N0YXRpb24gU0xDIHVuZGVyIG1vZGVyYXRlIGxvYWQsIHNvIHRoaXMgaXNuJ3QgdW5yZWFzb25hYmxlKS4KKyAgICAjIEFmdGVyIGdkYiBpcyBzdGFydGVkLCBzZXQgdGhlIHRpbWVvdXQgdG8gMzAgc2Vjb25kcyBmb3IgdGhlIGR1cmF0aW9uCisgICAgIyBvZiB0aGlzIHRlc3QsIGFuZCB0aGVuIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHZhbHVlLgorCisgICAgc2V0IG9sZHRpbWVvdXQgJHRpbWVvdXQKKyAgICBzZXQgdGltZW91dCA2MDAKKyAgICB2ZXJib3NlICJUaW1lb3V0IGlzIG5vdyAkdGltZW91dCBzZWNvbmRzIiAyCisgICAgaWYge1tnZGJfbG9hZCAkZXhlY3V0YWJsZV0gPDB9IHRoZW4geworCXNldCB0aW1lb3V0ICRvbGR0aW1lb3V0CisJdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorCXJldHVybiAtMQorICAgIH0KKyAgICBzZXQgdGltZW91dCAkb2xkdGltZW91dAorICAgIHZlcmJvc2UgIlRpbWVvdXQgaXMgbm93ICR0aW1lb3V0IHNlY29uZHMiIDIKKworICAgICMgZGlzYXNzZW1ibGUgeW91cnNlbGYKKyAgICBnZGJfdGVzdCAieC8xMGkgbWFpbiIgXAorCSAgICAieC8xMGkuKm1haW4uKm1haW4uJGRlY2ltYWwuKm1haW4uJGRlY2ltYWwuKiIgXAorCSAgICAiRGlzYXNzZW1ibGUgbWFpbiIKKworICAgICMgU2V0IGEgYnJlYWtwb2ludCBhdCBtYWluCisgICAgZ2RiX3Rlc3QgImJyZWFrIG1haW4iIFwKKwkgICAgIkJyZWFrcG9pbnQuKmF0LiogZmlsZS4qLCBsaW5lLioiIFwKKwkgICAgImJyZWFrcG9pbnQgaW4gbWFpbiIKKworICAgICMgV2UnbGwgbmVlZCB0aGlzIHdoZW4gd2Ugc2VuZCBhIF5DIHRvIEdEQi4gIE5lZWQgdG8gZG8gaXQgYmVmb3JlIHdlCisgICAgIyBydW4gdGhlIHByb2dyYW0gYW5kIGdkYiBzdGFydHMgc2F2aW5nIGFuZCByZXN0b3JpbmcgdHR5IHN0YXRlcy4KKyAgICAjIE9uIFVsdHJpeCwgd2UgZG9uJ3QgbmVlZCBpdCBhbmQgaXQgaXMgcmVhbGx5IHNsb3cgKGJlY2F1c2Ugc2hlbGxfZXNjYXBlCisgICAgIyBkb2Vzbid0IHVzZSB2Zm9yaykuCisgICAgaWYgIVtpc3RhcmdldCAiKi0qLXVsdHJpeCoiXSB0aGVuIHsKKwlnZGJfdGVzdCAic2hlbGwgc3R0eSBpbnRyICdeQyciICIiIFwKKwkgICAgInNldCBpbnRlcnJ1cHQgY2hhcmFjdGVyIGluIHRlc3Rfd2l0aF9zZWxmIgorICAgIH0KKworICAgICMgRklYTUU6IElmIHdlIHB1dCB0aGlzIGFmdGVyIHRoZSBydW4gdG8gbWFpbiwgdGhlIGZpcnN0IGxpc3QKKyAgICAjIGNvbW1hbmQgZG9lc24ndCBwcmludCB0aGUgc2FtZSBsaW5lIGFzIHRoZSBjdXJyZW50IGxpbmUgd2hlcmUKKyAgICAjIGdkYiBpcyBzdG9wcGVkLgorICAgIGdkYl90ZXN0ICJzZXQgbGlzdHNpemUgMSIgIiIgInNldCBsaXN0c2l6ZSB0byAxIgorCisgICAgIyBydW4geW91cnNlbGYKKyAgICAjIEl0IG1heSB0YWtlIGEgdmVyeSBsb25nIHRpbWUgZm9yIHRoZSBpbmZlcmlvciBnZGIgdG8gc3RhcnQgKGx5bngpLAorICAgICMgc28gd2UgYnVtcCBpdCBiYWNrIHVwIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyBjb21tYW5kLgorICAgIHNldCB0aW1lb3V0IDYwMAorCisgICAgc2V0IGRlc2NyaXB0aW9uICJydW4gdW50aWwgYnJlYWtwb2ludCBhdCBtYWluIgorICAgIHNlbmRfZ2RiICJydW4gLW53XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJTdGFydGluZyBwcm9ncmFtLipCcmVha3BvaW50IFxbMC05XF0rLC4qbWFpbiAuYXJnYy4qYXJndi4qIGF0IC4qbWFpbi5jOi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICIkZGVzY3JpcHRpb24iCisJfQorCS1yZSAiU3RhcnRpbmcgcHJvZ3JhbS4qQnJlYWtwb2ludCBcWzAtOVxdKywuKm1haW4gLmFyZ2MuKmFyZ3YuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgeGZhaWwgIiRkZXNjcmlwdGlvbiAobGluZSBudW1iZXJzIHNjcmFtYmxlZD8pIgorCX0KKwktcmUgInZmb3JrOiBObyBtb3JlIHByb2Nlc3Nlcy4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICIkZGVzY3JpcHRpb24gKG91dCBvZiB2aXJ0dWFsIG1lbW9yeSkiCisJICAgIHNldCB0aW1lb3V0ICRvbGR0aW1lb3V0CisJICAgIHZlcmJvc2UgIlRpbWVvdXQgaXMgbm93ICR0aW1lb3V0IHNlY29uZHMiIDIKKwkgICAgcmV0dXJuIC0xCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgIiRkZXNjcmlwdGlvbiIKKwkgICAgc2V0IHRpbWVvdXQgJG9sZHRpbWVvdXQKKwkgICAgdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorCSAgICByZXR1cm4gLTEKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgIiRkZXNjcmlwdGlvbiAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNldCB0aW1lb3V0ICRvbGR0aW1lb3V0CisgICAgdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorCisgICAgIyBkbyB3ZSBoYXZlIGEgdmVyc2lvbiBudW1iZXIgPworICAgIHNlbmRfZ2RiICJwcmludCB2ZXJzaW9uXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuXFswLTlcXSsgPSArMHguKlxbMC05LlxdKy4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwcmludGVkIHZlcnNpb24iCisJfQorCS1yZSAiLlxbMC05XF0rID0gKy4rICsweC4qXFswLTkuXF0rLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInByaW50ZWQgdmVyc2lvbiB3aXRoIGNhc3QiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIgl7IGZhaWwgInByaW50ZWQgdmVyc2lvbiIgfQorCXRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHByaW50ZWQgdmVyc2lvbiIgfQorICAgIH0KKworICAgIGRvX3N0ZXBzX2FuZF9uZXh0cworCisgICAgZ2RiX3Rlc3QgInByaW50IFwiZm9vXCIiICIuXFswLTlcXSsgPSBcImZvb1wiIiAicHJpbnQgYSBzdHJpbmciCisKKyAgICAjIGRvX3N0ZXBzX2FuZF9uZXh0cyBsZWZ0IHVzIHJlYWR5IHRvIGV4ZWN1dGUgYW4geG1hbGxvYyBjYWxsLAorICAgICMgc28gZ2l2ZSB0aGF0IGEgdHJ5LgorICAgICMgSWYgd2UgZG9uJ3QgYWN0dWFsbHkgZW50ZXIgdGhlIHhtYWxsb2MgY2FsbCB3aGVuIHdlIGdpdmUgYQorICAgICMgc3RlcCBjb21tYW5kIHRoYXQgc2VlbXMgbGlrZSBhIGdlbnVpbmUgYnVnLiAgSXQgc2VlbXMgdG8gaGFwcGVuCisgICAgIyBvbiBtb3N0IFJJU0MgcHJvY2Vzc29ycy4KKyAgICBzZXR1cF94ZmFpbCAiYWxwaGEtKi0qIiAiaHBwYSotKi0qIiAibWlwcy0qLSoiCisgICAgc2V0IGRlc2NyaXB0aW9uICJzdGVwIGludG8geG1hbGxvYyBjYWxsIgorICAgIHNlbmRfZ2RiICJzdGVwXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ4bWFsbG9jLipzaXplPS4qYXQuKnV0aWxzLmMuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAiJGRlc2NyaXB0aW9uIgorCX0KKwktcmUgIi4qTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeS5cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICIkZGVzY3JpcHRpb24gKG5vIHNvdXJjZSBhdmFpbGFibGUpIgorCX0KKwktcmUgIkEgZmlsZSBvciBkaXJlY3RvcnkgLiogZG9lcyBub3QgZXhpc3QuLlxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgIiRkZXNjcmlwdGlvbiAobm8gc291cmNlIGF2YWlsYWJsZSkiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgIiRkZXNjcmlwdGlvbiIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgIiRkZXNjcmlwdGlvbiAodGltZW91dCkiCisJfQorICAgIH0KKworICAgICMgc3RhcnQgdGhlICJ4Z2RiIiBwcm9jZXNzCisgICAgc2VuZF9nZGIgImNvbnRpbnVlXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJHTlUgZ2RiIFxbMC05XC5cXSouKgorQ29weXJpZ2h0IFxbMC05XF0qIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLioKK0dEQiBpcyBmcmVlIHNvZnR3YXJlLCBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYW5kIHlvdSBhcmUuKgord2VsY29tZSB0byBjaGFuZ2UgaXQgYW5kL29yIGRpc3RyaWJ1dGUgY29waWVzIG9mIGl0IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy4qCitUeXBlIFwic2hvdyBjb3B5aW5nXCIgdG8gc2VlIHRoZSBjb25kaXRpb25zLioKK1RoZXJlIGlzIGFic29sdXRlbHkgbm8gd2FycmFudHkgZm9yIEdEQi4gIFR5cGUgXCJzaG93IHdhcnJhbnR5XCIgZm9yIGRldGFpbHMuKgorVGhpcyBHREIgd2FzIGNvbmZpZ3VyZWQgYXMgLiokZ2RiX3Byb21wdCAkIlwKKwkgICAgeyBwYXNzICJ4Z2RiIGlzIGF0IHByb21wdCIgfQorCS1yZSAiR0RCIGlzIGZyZWUgc29mdHdhcmUgYW5kIHlvdSBhcmUgd2VsY29tZSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBpdC4qCisgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIFwic2hvdyBjb3B5aW5nXCIgdG8gc2VlIHRoZSBjb25kaXRpb25zLi4qCitUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGZvciBHREI7IHR5cGUgXCJzaG93IHdhcnJhbnR5XCIgZm9yIGRldGFpbHMuLioKK0dEQi4qQ29weXJpZ2h0IFxbMC05XF0rIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLi4qJGdkYl9wcm9tcHQgJCJcCisJICAgIHsgcGFzcyAieGdkYiBpcyBhdCBwcm9tcHQgKG9ic29sZXNjZW50IGdkYikiIH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJ4Z2RiIGlzIGF0IHByb21wdCIgfQorCXRpbWVvdXQJICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgeGdkYiBpcyBhdCBwcm9tcHQiIH0KKyAgICB9CisgICAgCisgICAgIyBzZXQgeGdkYiBwcm9tcHQgc28gd2UgY2FuIHRlbGwgd2hpY2ggaXMgd2hpY2gKKyAgICBzZW5kX2dkYiAic2V0IHByb21wdCAoeGdkYikgXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJcWyhcXXhnZGJcWylcXS4qXFsoXF14Z2RiXFspXF0gJCIJeyBwYXNzICJTZXQgeGdkYiBwcm9tcHQiIH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIJCXsgZmFpbCAiU2V0IHhnZGIgcHJvbXB0IiB9CisJZGVmYXVsdAkJCQl7IGZhaWwgIih0aW1lb3V0KSBTZXQgeGdkYiBwcm9tcHQiIH0KKyAgICB9CisgICAgCisgICAgIyBraWxsIHRoZSB4Z2RiIHByb2Nlc3MKKyAgICBzZXQgZGVzY3JpcHRpb24gInNlbmQgXkMgdG8gY2hpbGQgcHJvY2VzcyIKKyAgICBzZW5kX2dkYiAiXDAwMyIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIlByb2dyYW0gcmVjZWl2ZWQgc2lnbmFsIFNJR0lOVC4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICIkZGVzY3JpcHRpb24iCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgIiRkZXNjcmlwdGlvbiIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgIiRkZXNjcmlwdGlvbiAodGltZW91dCkiCisJfQorICAgIH0KKyAgICAKKyAgICBzZXQgZGVzY3JpcHRpb24gInNlbmQgU0lHSU5UIHNpZ25hbCB0byBjaGlsZCBwcm9jZXNzIgorICAgIHNlbmRfZ2RiICJzaWduYWwgU0lHSU5UXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJDb250aW51aW5nIHdpdGggc2lnbmFsIFNJR0lOVC4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICIkZGVzY3JpcHRpb24iCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgIiRkZXNjcmlwdGlvbiIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgIiRkZXNjcmlwdGlvbiAodGltZW91dCkiCisJfQorICAgIH0KKyAgICAKKyAgICAjIGdldCBhIHN0YWNrIHRyYWNlCisgICAgIworICAgICMgVGhpcyBmYWlscyBvbiBzb21lIGxpbnV4IHN5c3RlbXMgZm9yIHVua25vd24gcmVhc29ucy4gIE9uIHRoZQorICAgICMgc3lzdGVtcyB3aGVyZSBpdCBmYWlscywgc29tZXRpbWVzIGl0IHdvcmtzIGZpbmUgd2hlbiBydW4gbWFudWFsbHkuCisgICAgIyBUaGUgdGVzdHN1aXRlIGZhaWx1cmVzIG1heSBub3QgYmUgbGltaXRlZCB0byBqdXN0IGFvdXQgc3lzdGVtcy4KKyAgICBzZXR1cF94ZmFpbCAiaSo4Ni1wYy1saW51eGFvdXQtZ251IiAiaHBwYSotKi1ocHV4KiIKKyAgICBzZXQgZGVzY3JpcHRpb24gImJhY2t0cmFjZSB0aHJvdWdoIHNpZ25hbCBoYW5kbGVyIgorICAgIHNlbmRfZ2RiICJiYWNrdHJhY2VcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIiMwLipyZWFkLippbiBtYWluIFxcKC4qXFwpIGF0IC4qbWFpblxcLmMuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAiJGRlc2NyaXB0aW9uIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICAjIE9uIHRoZSBhbHBoYSwgd2UgaGl0IHRoZSBpbmZhbW91cyBwcm9ibGVtIGFib3V0IGdkYgorCSAgICAjIGJlaW5nIHVuYWJsZSB0byBnZXQgdGhlIGZyYW1lIHBvaW50ZXIgKG1lbnRpb25lZCBpbgorCSAgICAjIGdkYi9SRUFETUUpLiAgQXMgaXQgaXMgaW50ZXJtaXR0ZW50LCB0aGVyZSBpcyBubyB3YXkgdG8KKwkgICAgIyBYRkFJTCBpdCB3aGljaCB3aWxsIGdpdmUgdXMgYW4gWFBBU1MgaWYgdGhlIHByb2JsZW0gZ29lcworCSAgICAjIGF3YXkuCisJICAgIHNldHVwX3hmYWlsICJhbHBoYSotKi1vc2YqIgorCSAgICBmYWlsICIkZGVzY3JpcHRpb24iCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICIkZGVzY3JpcHRpb24gKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKworICAgICMgU2V0IHRoZSB0aW1lb3V0IGJhY2sgdG8gdGhlIHZhbHVlIGl0IGhhZCB3aGVuIHdlIHdlcmUgY2FsbGVkLgorICAgIHNldCB0aW1lb3V0ICRvbGR0aW1lb3V0CisgICAgdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorCisgICAgIyBSZXN0YXJ0IGdkYiBpbiBjYXNlIG5leHQgdGVzdCBleHBlY3RzIGl0IHRvIGJlIHN0YXJ0ZWQgYWxyZWFkeS4KKyAgICByZXR1cm4gMAorfQorCisjIEZpbmQgYSBwYXRobmFtZSB0byBhIGZpbGUgdGhhdCB3ZSB3b3VsZCBleGVjdXRlIGlmIHRoZSBzaGVsbCB3YXMgYXNrZWQKKyMgdG8gcnVuICRhcmcgdXNpbmcgdGhlIGN1cnJlbnQgUEFUSC4KKworcHJvYyBmaW5kX2dkYiB7IGFyZyB9IHsKKworICAgICMgSWYgdGhlIGFyZyBkaXJlY3RseSBzcGVjaWZpZXMgYW4gZXhpc3RpbmcgZXhlY3V0YWJsZSBmaWxlLCB0aGVuCisgICAgIyBzaW1wbHkgdXNlIGl0LgorCisgICAgaWYgW2ZpbGUgZXhlY3V0YWJsZSAkYXJnXSB0aGVuIHsKKwlyZXR1cm4gJGFyZworICAgIH0KKworICAgIHNldCByZXN1bHQgW3doaWNoICRhcmddCisgICAgaWYgW3N0cmluZyBtYXRjaCAiLyIgWyBzdHJpbmcgcmFuZ2UgJHJlc3VsdCAwIDAgXV0gdGhlbiB7CisJcmV0dXJuICRyZXN1bHQKKyAgICB9CisKKyAgICAjIElmIGV2ZXJ5dGhpbmcgZmFpbHMsIGp1c3QgcmV0dXJuIHRoZSB1bnF1YWxpZmllZCBwYXRobmFtZSBhcyBkZWZhdWx0CisgICAgIyBhbmQgaG9wZSBmb3IgYmVzdC4KKworICAgIHJldHVybiAkYXJnCit9CisKKyMgUnVuIHRoZSB0ZXN0IHdpdGggc2VsZi4KKyMgQ29weSB0aGUgZmlsZSBleGVjdXRhYmxlIGZpbGUgaW4gY2FzZSB0aGlzIE9TIGRvZXNuJ3QgbGlrZSB0byBlZGl0IGl0cyBvd24KKyMgdGV4dCBzcGFjZS4KKworc2V0IEdEQl9GVUxMUEFUSCBbZmluZF9nZGIgJEdEQl0KKworIyBSZW1vdmUgYW55IG9sZCBjb3B5IGx5aW5nIGFyb3VuZC4KK3JlbW90ZV9maWxlIGhvc3QgZGVsZXRlIHgkdG9vbAorCitnZGJfc3RhcnQKK3NldCBmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCAkR0RCX0ZVTExQQVRIIHgkdG9vbF0KK3NldCByZXN1bHQgW3Rlc3Rfd2l0aF9zZWxmICRmaWxlXTsKK2dkYl9leGl0OworY2F0Y2ggInJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRmaWxlIjsKKworaWYgeyRyZXN1bHQgPDB9IHRoZW4geworICAgIHdhcm5pbmcgIkNvdWxkbid0IHRlc3Qgc2VsZiIKKyAgICByZXR1cm4gLTEKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYTItcnVuLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYTItcnVuLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2EwZWRmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9hMi1ydW4uZXhwCkBAIC0wLDAgKzEsMjUzIEBACisjICAgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTk0LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llLiAocm9iQGN5Z251cy5jb20pCisKKyMgVGhlc2UgdGVzdHMgZG9uJ3Qgd29yayBmb3IgdGFyZ2V0cyBjYW4ndCB0YWtlIGFyZ3VtZW50cy4uLgorCitpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIG5vYXJnc10gdGhlbiB7CisgICAgdmVyYm9zZSAiU2tpcHBpbmcgYTItcnVuLmV4cCBiZWNhdXNlIG9mIG5vYXJncy4iCisgICAgcmV0dXJuCit9CisKK2lmIFt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiLG5vaW5mZXJpb3Jpb10geworICAgIHZlcmJvc2UgIlNraXBwaW5nIGEyLXJ1bi5leHAgYmVjYXVzZSBvZiBub2luZmVyaW9yaW8uIgorICAgIHJldHVybgorfQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworIworIyB0ZXN0IHJ1bm5pbmcgcHJvZ3JhbXMKKyMKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgInJ1biIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKKyMgUnVuIHdpdGggbm8gYXJndW1lbnRzLgorIyBPbiBWeFdvcmtzIHRoaXMganVzdHMgbWFrZSBzdXJlIHRoZSBwcm9ncmFtIHdhcyBydW4uCitnZGJfcnVuX2NtZAorCitpZiBbaXN0YXJnZXQgIiotKi12eHdvcmtzKiJdIHRoZW4geworICAgIHNldCB0aW1lb3V0IDEyMAorICAgIHZlcmJvc2UgIlRpbWVvdXQgaXMgbm93ICR0aW1lb3V0IHNlY29uZHMiIDIKKyAgICBnZGJfZXhwZWN0IHsKKwkgIlByb2dyYW0gZXhpdGVkIG5vcm1hbGx5IiB7CisJICAgIHVucmVzb2x2ZWQgInJ1biBcIiR0ZXN0ZmlsZVwiIHdpdGggbm8gYXJncyIKKwl9CisJIC1yZSAidXNhZ2U6ICBmYWN0b3JpYWwgPG51bWJlcj4iIHsKKwkgICAgcGFzcyAicnVuIFwiJHRlc3RmaWxlXCIgd2l0aCBubyBhcmdzIgorCX0KKwl0aW1lb3V0CXsKKwkgICAgZmFpbCAiKHRpbWVvdXQpIHJ1biBcIiR0ZXN0ZmlsZVwiIHdpdGggbm8gYXJncyIKKwl9CisgICAgfQorICAgIHNldCB0aW1lb3V0IDEwCisgICAgdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorICAgIGdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIiB7fQorfSBlbHNlIHsKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qdXNhZ2U6ICBmYWN0b3JpYWwgPG51bWJlcj4uKlByb2dyYW0gZXhpdGVkIHdpdGggY29kZSAwMS4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJydW4gXCIkdGVzdGZpbGVcIiB3aXRoIG5vIGFyZ3MiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInJ1biBcIiR0ZXN0ZmlsZVwiIHdpdGggbm8gYXJncyIKKwkgICAgdmVyYm9zZSAiZXhwZWN0X291dCBpcyAkZXhwZWN0X291dChidWZmZXIpIiAyCisJfQorCXRpbWVvdXQJeworCSAgICBmYWlsICIodGltZW91dCkgcnVuIFwiJHRlc3RmaWxlXCIgbm8gYXJncyIKKwl9CisgICAgfQorfQorIyBOb3cgcnVuIHdpdGggc29tZSBhcmd1bWVudHMKK2lmIFtpc3RhcmdldCAiKi0qLXZ4d29ya3MqIl0gdGhlbiB7CisgICAgc2VuZF9nZGIgInJ1biB2eG1haW4gXCI1XCJcbiIKKyAgICBnZGJfZXhwZWN0IC1yZSAicnVuIHZ4bWFpbiBcIjVcIlxyXG4iIHt9CisgICAgc2V0IHRpbWVvdXQgMTIwCisgICAgdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorICAgIGdkYl9leHBlY3QgeworCSAiUHJvZ3JhbSBleGl0ZWQgbm9ybWFsbHkiIHsKKwkgICAgdW5yZXNvbHZlZCAicnVuIFwiJHRlc3RmaWxlXCIgd2l0aCBhcmciCisJfQorCSAiMTIwIiB7CisJICAgIHBhc3MgInJ1biBcIiR0ZXN0ZmlsZVwiIHdpdGggYXJnIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAiKHRpbWVvdXQpIHJ1biBcIiR0ZXN0ZmlsZVwiIHdpdGggYXJnIgorCX0KKyAgICB9CisgICAgc2V0IHRpbWVvdXQgMTAKKyAgICB2ZXJib3NlICJUaW1lb3V0IGlzIG5vdyAkdGltZW91dCBzZWNvbmRzIiAyCisgICAgZ2RiX2V4cGVjdCAtcmUgIiRnZGJfcHJvbXB0ICQiIHt9Cit9IGVsc2UgeworCXNldHVwX3hmYWlsICJtaXBzLWlkdC0qIiAiYXJtLSotY29mZiIKKwlnZGJfcnVuX2NtZCA1CisJZ2RiX2V4cGVjdCB7CisJICAgIC1yZSAiLioxMjAuKiRnZGJfcHJvbXB0ICQiXAorCQkJCXsgcGFzcyAicnVuIFwiJHRlc3RmaWxlXCIgd2l0aCBhcmciIH0KKwkgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCXsgZmFpbCAicnVuIFwiJHRlc3RmaWxlXCIgd2l0aCBhcmciIH0KKwkgICAgdGltZW91dAkJeyBmYWlsICIodGltZW91dCkgcnVuIFwiJHRlc3RmaWxlXCIgd2l0aCBhcmciIH0KKwl9Cit9CisKKyMgUnVuIGFnYWluIHdpdGggc2FtZSBhcmd1bWVudHMuCitzZXR1cF94ZmFpbCAibWlwcy1pZHQtKiIKK2dkYl9ydW5fY21kCisKK2lmIFtpc3RhcmdldCAiKi0qLXZ4d29ya3MqIl0gdGhlbiB7CisgICAgc2V0IHRpbWVvdXQgMTIwCisgICAgdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorICAgIGdkYl9leHBlY3QgeworCSAiUHJvZ3JhbSBleGl0ZWQgbm9ybWFsbHkiIHsKKwkgICAgdW5yZXNvbHZlZCAicnVuIFwiJHRlc3RmaWxlXCIgYWdhaW4gd2l0aCBzYW1lIGFyZ3MiCisJfQorCSAiMTIwIiB7IHBhc3MgInJ1biBcIiR0ZXN0ZmlsZVwiIGFnYWluIHdpdGggc2FtZSBhcmdzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBydW4gXCIkdGVzdGZpbGVcIiBhZ2FpbiB3aXRoIHNhbWUgYXJncyIgfQorICAgIH0KKyAgICBzZXQgdGltZW91dCAxMAorICAgIHZlcmJvc2UgIlRpbWVvdXQgaXMgbm93ICR0aW1lb3V0IHNlY29uZHMiIDIKKyAgICBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIge30KK30gZWxzZSB7CisgICAgc2V0dXBfeGZhaWwgImFybS0qLWNvZmYiCisgICAgZ2RiX2V4cGVjdCB7CisJICAgIC1yZSAiLioxMjAuKiRnZGJfcHJvbXB0ICQiXAorCQkJCXsgcGFzcyAicnVuIFwiJHRlc3RmaWxlXCIgYWdhaW4gd2l0aCBzYW1lIGFyZ3MiIH0KKwkgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCXsgZmFpbCAicnVuIFwiJHRlc3RmaWxlXCIgYWdhaW4gd2l0aCBzYW1lIGFyZ3MiIH0KKwkgICAgdGltZW91dAkJeyBmYWlsICIodGltZW91dCkgcnVuIFwiJHRlc3RmaWxlXCIgYWdhaW4gd2l0aCBzYW1lIGFyZ3MiIH0KKwl9Cit9CisKKyMgVXNlICJzZXQgYXJncyIgY29tbWFuZCB0byBzcGVjaWZ5IG5vIGFyZ3VtZW50cyBhcyBkZWZhdWx0IGFuZCBydW4gYWdhaW4uCitpZiBbaXN0YXJnZXQgIiotKi12eHdvcmtzKiJdIHRoZW4geworICAgIHNlbmRfZ2RiICJzZXQgYXJncyBtYWluXG4iCit9IGVsc2UgeworICAgIHNlbmRfZ2RiICJzZXQgYXJnc1xuIgorfQorZ2RiX2V4cGVjdCAtcmUgIiRnZGJfcHJvbXB0ICQiCisKK2dkYl9ydW5fY21kCisKK2lmIFtpc3RhcmdldCAiKi0qLXZ4d29ya3MqIl0gdGhlbiB7CisgICAgc2V0IHRpbWVvdXQgMTIwCisgICAgdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorICAgIGdkYl9leHBlY3QgeworCSAiUHJvZ3JhbSBleGl0ZWQgbm9ybWFsbHkiIHsKKwkgICAgdW5yZXNvbHZlZCAicnVuIGFmdGVyIHNldHRpbmcgYXJncyB0byBuaWwiCisJfQorCSAidXNhZ2U6ICBmYWN0b3JpYWwgPG51bWJlcj4iIHsKKwkgICAgcGFzcyAicnVuIGFmdGVyIHNldHRpbmcgYXJncyB0byBuaWwiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICIodGltZW91dCkgcnVuIGFmdGVyIHNldHRpbmcgYXJncyB0byBuaWwiCisJfQorICAgIH0KKyAgICBzZXQgdGltZW91dCAxMAorICAgIHZlcmJvc2UgIlRpbWVvdXQgaXMgbm93ICR0aW1lb3V0IHNlY29uZHMiIDIKKyAgICBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIge30KK30gZWxzZSB7CisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKnVzYWdlOiAgZmFjdG9yaWFsIDxudW1iZXI+LiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInJ1biBhZnRlciBzZXR0aW5nIGFyZ3MgdG8gbmlsIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJydW4gYWZ0ZXIgc2V0dGluZyBhcmdzIHRvIG5pbCIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgIih0aW1lb3V0KSBydW4gYWZ0ZXIgc2V0dGluZyBhcmdzIHRvIG5pbCIKKwl9CisgICAgfQorfQorCisjIFVzZSAic2V0IGFyZ3MiIGNvbW1hbmQgdG8gc3BlY2lmeSBhbiBhcmd1bWVudCBhbmQgcnVuIGFnYWluLgorc2V0dXBfeGZhaWwgIm1pcHMtaWR0LSoiCitpZiBbaXN0YXJnZXQgIiotKi12eHdvcmtzKiJdIHRoZW4geworICAgc2VuZF9nZGIgInNldCBhcmdzIHZ4bWFpbiBcIjZcIlxuIgorfSBlbHNlIHsKKwlzZW5kX2dkYiAic2V0IGFyZ3MgNlxuIgorfQorZ2RiX2V4cGVjdCAtcmUgIiRnZGJfcHJvbXB0ICQiCitnZGJfcnVuX2NtZAorCitpZiBbaXN0YXJnZXQgIiotKi12eHdvcmtzKiJdIHRoZW4geworICAgIHNldCB0aW1lb3V0IDEyMAorICAgIHZlcmJvc2UgIlRpbWVvdXQgaXMgbm93ICR0aW1lb3V0IHNlY29uZHMiIDIKKyAgICBnZGJfZXhwZWN0IHsKKwkgIlByb2dyYW0gZXhpdGVkIG5vcm1hbGx5IiB7CisJICAgIHVucmVzb2x2ZWQgInJ1biBcIiR0ZXN0ZmlsZVwiIGFnYWluIGFmdGVyIHNldHRpbmcgYXJncyIKKwl9CisJICI3MjAiIHsKKwkgICAgcGFzcyAicnVuIFwiJHRlc3RmaWxlXCIgYWdhaW4gYWZ0ZXIgc2V0dGluZyBhcmdzIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAiKHRpbWVvdXQpIHJ1biBcIiR0ZXN0ZmlsZVwiIGFnYWluIGFmdGVyIHNldHRpbmcgYXJncyIKKwl9CisgICAgfQorICAgIHNldCB0aW1lb3V0IDEwCisgICAgdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorICAgIGdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIiB7fQorfSBlbHNlIHsKKyAgICBzZXR1cF94ZmFpbCAiYXJtLSotY29mZiIKKyAgICBnZGJfZXhwZWN0IHsKKwkgICAgLXJlICIuKjcyMC4qJGdkYl9wcm9tcHQgJCIgeworCQlwYXNzICJydW4gXCIkdGVzdGZpbGVcIiBhZ2FpbiBhZnRlciBzZXR0aW5nIGFyZ3MiCisJICAgIH0KKwkgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkJZmFpbCAicnVuIFwiJHRlc3RmaWxlXCIgYWdhaW4gYWZ0ZXIgc2V0dGluZyBhcmdzIgorCSAgICB9CisJICAgIHRpbWVvdXQgeworCQlmYWlsICIodGltZW91dCkgcnVuIFwiJHRlc3RmaWxlXCIgYWdhaW4gYWZ0ZXIgc2V0dGluZyBhcmdzIgorCSAgICB9CisJfQorfQorCisjIEdPQUw6IFRlc3QgdGhhdCBzaGVsbCBpcyBiZWluZyB1c2VkIHdpdGggInJ1biIuICBGb3IgcmVtb3RlIGRlYnVnZ2luZworIyB0YXJnZXRzLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhICJzaGVsbCIgKHdoYXRldmVyIHRoYXQgaXMpIGlzIHVzZWQuCitpZiBbaXNuYXRpdmVdIHRoZW4geworICAgIHNlbmRfZ2RiICJydW4gYGVjaG8gOGBcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIlN0YXJ0aW5nIHByb2dyYW0uKjQwMzIwLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInJ1biBcIiR0ZXN0ZmlsZVwiIHdpdGggc2hlbGwiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInJ1biBcIiR0ZXN0ZmlsZVwiIHdpdGggc2hlbGwiCisJfQorCXRpbWVvdXQJeworCSAgICBmYWlsICIodGltZW91dCkgcnVuIFwiJHRlc3RmaWxlXCIgd2l0aCBzaGVsbCIKKwl9CisgICAgfQorfQorCisjIFJlc2V0IHRoZSBkZWZhdWx0IGFyZ3VtZW50cyBmb3IgVnhXb3JrcworaWYgW2lzdGFyZ2V0ICIqLSotdnh3b3JrcyoiXSB0aGVuIHsKKyAgICBzZW5kX2dkYiAic2V0IGFyZ3MgbWFpblxuIgorICAgIGdkYl9leHBlY3QgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2FsbC1iaW4uZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9hbGwtYmluLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDY2NjJiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9hbGwtYmluLmV4cApAQCAtMCwwICsxLDQ2NyBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEVsZW5hIFphbm5vbmkgKGV6YW5ub25pQGN5Z251cy5jb20pCisKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGdkYiB0ZXN0c3VpdGUKKyMKKyMgdGVzdHMgZm9yIGFyaXRobWV0aWMsIGxvZ2ljYWwgYW5kIHJlbGF0aW9uYWwgb3BlcmF0b3JzCisjIHdpdGggbWl4ZWQgdHlwZXMKKyMgCisKKworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKKwl9CisKKyMKKyMgdGVzdCBydW5uaW5nIHByb2dyYW1zCisjCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJhbGwtdHlwZXMiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYWRkaXRpb25hbF9mbGFncz0td31dICE9ICIiIH0geworICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorICAgIH0KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKKworIworIyBzZXQgaXQgdXAgYXQgYSBicmVha3BvaW50IHNvIHdlIGNhbiBwbGF5IHdpdGggdGhlIHZhcmlhYmxlIHZhbHVlcworIworCitpZiAhW3J1bnRvX21haW5dIHRoZW4geworICAgIHBlcnJvciAiY291bGRuJ3QgcnVuIHRvIGJyZWFrcG9pbnQiCisgICAgY29udGludWUKK30KKworZ2RiX3Rlc3QgIm5leHQiICJyZXR1cm4gMDsiICJjb250aW51aW5nIGFmdGVyIGR1bW15KCkiCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCt2X2NoYXJcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLio3MS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB2X2ludCt2X2NoYXIiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2Ygdl9pbnQrdl9jaGFyIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2Ygdl9pbnQrdl9jaGFyIiB9ICAgIAorICB9CisKK3NlbmRfZ2RiICJwcmludCB2X2ludCt2X3Nob3J0XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qOS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB2X2ludCt2X3Nob3J0IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHZfaW50K3Zfc2hvcnQiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB2X2ludCt2X3Nob3J0IiB9ICAgIAorICB9CisKKworc2VuZF9nZGIgInByaW50IHZfaW50K3Zfc2lnbmVkX2NoYXJcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLio3Mi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB2X2ludCt2X3NpZ25lZF9jaGFyIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHZfaW50K3Zfc2lnbmVkX2NoYXIiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB2X2ludCt2X3NpZ25lZF9jaGFyIiB9ICAgIAorICB9CisKKworc2VuZF9nZGIgInByaW50IHZfaW50K3ZfdW5zaWduZWRfY2hhclxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjczLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHZfaW50K3ZfdW5zaWduZWRfY2hhciIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB2X2ludCt2X3Vuc2lnbmVkX2NoYXIiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB2X2ludCt2X3Vuc2lnbmVkX2NoYXIiIH0gICAgCisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgdl9pbnQrdl9zaWduZWRfc2hvcnRcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB2X2ludCt2X3NpZ25lZF9zaG9ydCIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB2X2ludCt2X3NpZ25lZF9zaG9ydCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50K3Zfc2lnbmVkX3Nob3J0IiB9ICAgIAorICB9CisKKworc2VuZF9nZGIgInByaW50IHZfaW50K3ZfdW5zaWduZWRfc2hvcnRcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB2X2ludCt2X3Vuc2lnbmVkX3Nob3J0IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHZfaW50K3ZfdW5zaWduZWRfc2hvcnQiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB2X2ludCt2X3Vuc2lnbmVkX3Nob3J0IiB9ICAgIAorICB9CisKKworc2VuZF9nZGIgInByaW50IHZfaW50K3Zfc2lnbmVkX2ludFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEzLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHZfaW50K3Zfc2lnbmVkX2ludCIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB2X2ludCt2X3NpZ25lZF9pbnQiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB2X2ludCt2X3NpZ25lZF9pbnQiIH0gICAgCisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgdl9pbnQrdl91bnNpZ25lZF9pbnRcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxNC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB2X2ludCt2X3Vuc2lnbmVkX2ludCIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB2X2ludCt2X3Vuc2lnbmVkX2ludCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50K3ZfdW5zaWduZWRfaW50IiB9ICAgIAorICB9CisKKworc2VuZF9nZGIgInByaW50IHZfaW50K3ZfbG9uZ1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjE1LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHZfaW50K3ZfbG9uZyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB2X2ludCt2X2xvbmciIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB2X2ludCt2X2xvbmciIH0gICAgCisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgdl9pbnQrdl9zaWduZWRfbG9uZ1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjE2LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHZfaW50K3Zfc2lnbmVkX2xvbmciCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2Ygdl9pbnQrdl9zaWduZWRfbG9uZyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50K3Zfc2lnbmVkX2xvbmciIH0gICAgCisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgdl9pbnQrdl91bnNpZ25lZF9sb25nXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMTcuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQrdl91bnNpZ25lZF9sb25nIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHZfaW50K3ZfdW5zaWduZWRfbG9uZyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50K3ZfdW5zaWduZWRfbG9uZyIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCt2X2Zsb2F0XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMTA2LjM0MzQzLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHZfaW50K3ZfZmxvYXQiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2Ygdl9pbnQrdl9mbG9hdCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50K3ZfZmxvYXQiIH0gICAgCisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgdl9pbnQrdl9kb3VibGVcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioyMDYuNTY1NjUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQrdl9kb3VibGUiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2Ygdl9pbnQrdl9kb3VibGUiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB2X2ludCsiIH0gICAgCisgIH0KKworCisjCisjIHRlc3QgdGhlIHJlbGF0aW9uYWwgb3BlcmF0b3JzIHdpdGggbWl4ZWQgdHlwZXMKKyMKKworc2VuZF9nZGIgInByaW50IHZfaW50IDw9IHZfY2hhclxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQ8PXZfY2hhciIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB2X2ludDw9dl9jaGFyIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2Ygdl9pbnQ8PXZfY2hhciIgfSAgICAKKyAgfQorCitzZW5kX2dkYiAicHJpbnQgdl9pbnQgPD0gdl9zaG9ydFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQ8PXZfc2hvcnQiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2Ygdl9pbnQ8PXZfc2hvcnQiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB2X2ludDw9dl9zaG9ydCIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCA8PSB2X3NpZ25lZF9jaGFyXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB2X2ludDw9dl9zaWduZWRfY2hhciIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB2X2ludDw9dl9zaWduZWRfY2hhciIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50PD12X3NpZ25lZF9jaGFyIiB9ICAgIAorICB9CisKKworc2VuZF9nZGIgInByaW50IHZfaW50IDw9IHZfdW5zaWduZWRfY2hhclxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQ8PXZfdW5zaWduZWRfY2hhciIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB2X2ludDw9dl91bnNpZ25lZF9jaGFyIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2Ygdl9pbnQ8PXZfdW5zaWduZWRfY2hhciIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCA8PSB2X3NpZ25lZF9zaG9ydFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQ8PXZfc2lnbmVkX3Nob3J0IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHZfaW50PD12X3NpZ25lZF9zaG9ydCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50PD12X3NpZ25lZF9zaG9ydCIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCA8PSB2X3Vuc2lnbmVkX3Nob3J0XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB2X2ludDw9dl91bnNpZ25lZF9zaG9ydCIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB2X2ludDw9dl91bnNpZ25lZF9zaG9ydCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50PD12X3Vuc2lnbmVkX3Nob3J0IiB9ICAgIAorICB9CisKKworc2VuZF9nZGIgInByaW50IHZfaW50IDw9IHZfc2lnbmVkX2ludFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQ8PXZfc2lnbmVkX2ludCIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB2X2ludDw9dl9zaWduZWRfaW50IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2Ygdl9pbnQ8PXZfc2lnbmVkX2ludCIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCA8PSB2X3Vuc2lnbmVkX2ludFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQ8PXZfdW5zaWduZWRfaW50IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHZfaW50PD12X3Vuc2lnbmVkX2ludCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50PD12X3Vuc2lnbmVkX2ludCIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCA8PSB2X2xvbmdcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHZfaW50PD12X2xvbmciCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2Ygdl9pbnQ8PXZfbG9uZyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50PD12X2xvbmciIH0gICAgCisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgdl9pbnQgPD0gdl9zaWduZWRfbG9uZ1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQ8PXZfc2lnbmVkX2xvbmciCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2Ygdl9pbnQ8PXZfc2lnbmVkX2xvbmciIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB2X2ludDw9dl9zaWduZWRfbG9uZyIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCA8PSB2X3Vuc2lnbmVkX2xvbmdcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHZfaW50PD12X3Vuc2lnbmVkX2xvbmciCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2Ygdl9pbnQ8PXZfdW5zaWduZWRfbG9uZyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50PD12X3Vuc2lnbmVkX2xvbmciIH0gICAgCisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgdl9pbnQgPD0gdl9mbG9hdFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQ8PXZfZmxvYXQiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2Ygdl9pbnQ8PXZfZmxvYXQiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB2X2ludDw9dl9mbG9hdCIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCA8PSB2X2RvdWJsZVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQ8PXZfZG91YmxlIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHZfaW50PD12X2RvdWJsZSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50PD12X2RvdWJsZSIgfSAgICAKKyAgfQorCisKKworIworIyB0ZXN0IHRoZSBsb2dpY2FsIG9wZXJhdG9ycyB3aXRoIG1peGVkIHR5cGVzCisjCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgdl9jaGFyPTAiICIiICJzZXQgdl9jaGFyPTAiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHZfZG91YmxlPTAuMCIgIiIgInNldCB2X2RvdWJsZT0wIgorZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX2xvbmc9MCIgIiIgInNldCB2X3Vuc2lnbmVkX2xvbmc9MCIKKworc2VuZF9nZGIgInByaW50IHZfaW50ICYmIHZfY2hhclxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQmJnZfY2hhciIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB2X2ludCYmdl9jaGFyIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2Ygdl9pbnQmJnZfY2hhciIgfSAgICAKKyAgfQorCitzZW5kX2dkYiAicHJpbnQgdl9pbnQgJiYgdl9zaG9ydFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQmJnZfc2hvcnQiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2Ygdl9pbnQmJnZfc2hvcnQiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB2X2ludCYmdl9zaG9ydCIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCAmJiB2X3NpZ25lZF9jaGFyXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB2X2ludCYmdl9zaWduZWRfY2hhciIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB2X2ludCYmdl9zaWduZWRfY2hhciIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50JiZ2X3NpZ25lZF9jaGFyIiB9ICAgIAorICB9CisKKworc2VuZF9nZGIgInByaW50IHZfaW50ICYmIHZfdW5zaWduZWRfY2hhclxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQmJnZfdW5zaWduZWRfY2hhciIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB2X2ludCYmdl91bnNpZ25lZF9jaGFyIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2Ygdl9pbnQmJnZfdW5zaWduZWRfY2hhciIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCAmJiB2X3NpZ25lZF9zaG9ydFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQmJnZfc2lnbmVkX3Nob3J0IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHZfaW50JiZ2X3NpZ25lZF9zaG9ydCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50JiZ2X3NpZ25lZF9zaG9ydCIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCAmJiB2X3Vuc2lnbmVkX3Nob3J0XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB2X2ludCYmdl91bnNpZ25lZF9zaG9ydCIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB2X2ludCYmdl91bnNpZ25lZF9zaG9ydCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50JiZ2X3Vuc2lnbmVkX3Nob3J0IiB9ICAgIAorICB9CisKKworc2VuZF9nZGIgInByaW50IHZfaW50ICYmIHZfc2lnbmVkX2ludFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQmJnZfc2lnbmVkX2ludCIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB2X2ludCYmdl9zaWduZWRfaW50IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2Ygdl9pbnQmJnZfc2lnbmVkX2ludCIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCAmJiB2X3Vuc2lnbmVkX2ludFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQmJnZfdW5zaWduZWRfaW50IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHZfaW50JiZ2X3Vuc2lnbmVkX2ludCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50JiZ2X3Vuc2lnbmVkX2ludCIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCAmJiB2X2xvbmdcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHZfaW50JiZ2X2xvbmciCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2Ygdl9pbnQmJnZfbG9uZyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50JiZ2X2xvbmciIH0gICAgCisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgdl9pbnQgJiYgdl9zaWduZWRfbG9uZ1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQmJnZfc2lnbmVkX2xvbmciCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2Ygdl9pbnQmJnZfc2lnbmVkX2xvbmciIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB2X2ludCYmdl9zaWduZWRfbG9uZyIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCAmJiB2X3Vuc2lnbmVkX2xvbmdcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiowLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHZfaW50JiZ2X3Vuc2lnbmVkX2xvbmciCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2Ygdl9pbnQmJnZfdW5zaWduZWRfbG9uZyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50JiZ2X3Vuc2lnbmVkX2xvbmciIH0gICAgCisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgdl9pbnQgJiYgdl9mbG9hdFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQmJnZfZmxvYXQiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2Ygdl9pbnQmJnZfZmxvYXQiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB2X2ludCYmdl9mbG9hdCIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCAmJiB2X2RvdWJsZVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygdl9pbnQmJnZfZG91YmxlIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHZfaW50JiZ2X2RvdWJsZSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHZfaW50JiZ2X2RvdWJsZSIgfSAgICAKKyAgfQorCisKKworCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYWxsLXR5cGVzLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2FsbC10eXBlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmM2EzMWYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2FsbC10eXBlcy5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKgl0aGUgYmFzaWMgQyB0eXBlcy4KKyAqLworCisjaWYgIWRlZmluZWQgKF9fU1REQ19fKSAmJiAhZGVmaW5lZCAoX0FJWCkKKyNkZWZpbmUgc2lnbmVkICAvKiovCisjZW5kaWYKKworY2hhcgkJdl9jaGFyOworc2lnbmVkIGNoYXIJdl9zaWduZWRfY2hhcjsKK3Vuc2lnbmVkIGNoYXIJdl91bnNpZ25lZF9jaGFyOworCitzaG9ydAkJdl9zaG9ydDsKK3NpZ25lZCBzaG9ydAl2X3NpZ25lZF9zaG9ydDsKK3Vuc2lnbmVkIHNob3J0CXZfdW5zaWduZWRfc2hvcnQ7CisKK2ludAkJdl9pbnQ7CitzaWduZWQgaW50CXZfc2lnbmVkX2ludDsKK3Vuc2lnbmVkIGludAl2X3Vuc2lnbmVkX2ludDsKKworbG9uZwkJdl9sb25nOworc2lnbmVkIGxvbmcJdl9zaWduZWRfbG9uZzsKK3Vuc2lnbmVkIGxvbmcJdl91bnNpZ25lZF9sb25nOworCitmbG9hdAkJdl9mbG9hdDsKK2RvdWJsZQkJdl9kb3VibGU7CisKK2ludCBtYWluICgpCit7CisgICAgZXh0ZXJuIHZvaWQgZHVtbXkoKTsKKyNpZmRlZiB1c2VzdHVicworICAgIHNldF9kZWJ1Z190cmFwcygpOworICAgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICAgIGR1bW15KCk7CisgICAgcmV0dXJuIDA7CisgICAgCit9CisKK3ZvaWQgZHVtbXkoKQoreworICAvKiBTb21lIGxpbmtlcnMgKGUuZy4gb24gQUlYKSByZW1vdmUgdW5yZWZlcmVuY2VkIHZhcmlhYmxlcywKKyAgICAgc28gbWFrZSBzdXJlIHRvIHJlZmVyZW5jZSB0aGVtLiAqLworICB2X2NoYXIgPSAnQSc7CisgIHZfc2lnbmVkX2NoYXIgPSAnQic7CisgIHZfdW5zaWduZWRfY2hhciA9ICdDJzsKKworICB2X3Nob3J0ID0gMzsKKyAgdl9zaWduZWRfc2hvcnQgPSA0OworICB2X3Vuc2lnbmVkX3Nob3J0ID0gNTsgICAgCisKKyAgdl9pbnQgPSA2OworICB2X3NpZ25lZF9pbnQgPSA3OworICB2X3Vuc2lnbmVkX2ludCA9IDg7ICAgIAorCisgIHZfbG9uZyA9IDk7CisgIHZfc2lnbmVkX2xvbmcgPSAxMDsKKyAgdl91bnNpZ25lZF9sb25nID0gMTE7ICAgIAorICAKKyAgdl9mbG9hdCA9IDEwMC4zNDM0MzQ7CisgIHZfZG91YmxlID0gMjAwLjU2NTY1NjsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYXJpdGhtZXQuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9hcml0aG1ldC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjliOWY3NAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYXJpdGhtZXQuZXhwCkBAIC0wLDAgKzEsMzc1IEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRWxlbmEgWmFubm9uaSAoZXphbm5vbmlAY3lnbnVzLmNvbSkKKworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZ2RiIHRlc3RzdWl0ZQorIworIyB0ZXN0cyBmb3IgY29ycmVjdG5lc3Mgb2YgYXJpdGhtZXRpYyBvcGVyYXRvcnMsIGFzc29jaWF0aXZpdHkgYW5kIHByZWNlZGVuY2UKKyMgd2l0aCBpbnRlZ2VyIHR5cGUgdmFyaWFibGVzCisjIAorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKKwl9CisKKyMKKyMgdGVzdCBydW5uaW5nIHByb2dyYW1zCisjCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJpbnQtdHlwZSIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1ZyBhZGRpdGlvbmFsX2ZsYWdzPS13fV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorICAgIH0KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKKworIworIyBzZXQgaXQgdXAgYXQgYSBicmVha3BvaW50IHNvIHdlIGNhbiBwbGF5IHdpdGggdGhlIHZhcmlhYmxlIHZhbHVlcworIworCitpZiAhW3J1bnRvX21haW5dIHRoZW4geworICAgIHBlcnJvciAiY291bGRuJ3QgcnVuIHRvIGJyZWFrcG9pbnQiCisgICAgY29udGludWUKK30KKworIworIyB0ZXN0IGV4cHJlc3Npb25zIHdpdGggImludCIgdHlwZXMKKyMKKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB4PTE0IiAiIiAic2V0IHZhcmlhYmxlIHg9MTQiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHk9MiIgIiIgInNldCB2YXJpYWJsZSB5PTIiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHo9MiIgIiIgInNldCB2YXJpYWJsZSB6PTIiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHc9MyIgIiIgInNldCB2YXJpYWJsZSB3PTMiCisKK3NlbmRfZ2RiICJwcmludCB4XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMTQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeCIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB5XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB5IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB5IiB9ICAgIAorICB9CisKK3NlbmRfZ2RiICJwcmludCB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB6IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHoiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB6IiB9ICAgIAorICB9CisKK3NlbmRfZ2RiICJwcmludCB3XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB3IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHciIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB3IiB9ICAgIAorICB9CisKKworCitzZW5kX2dkYiAicHJpbnQgeCt5XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMTYuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCt5IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHgreSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHgreSIgfSAgICAKKyAgfQorCitzZW5kX2dkYiAicHJpbnQgeC15XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMTIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeC15IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHgteSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHgteSIgfSAgICAKKyAgfQorCitzZW5kX2dkYiAicHJpbnQgeCp5XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMjguKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCp5IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHgqeSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHgqeSIgfSAgICAKKyAgfQorCitzZW5kX2dkYiAicHJpbnQgeC95XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qNy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4L3kiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeC95IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeC95IiB9ICAgIAorICB9CisKK3NlbmRfZ2RiICJwcmludCB4JXlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiowLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHgleSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4JXkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4JXkiIH0gICAgCisgIH0KKworCisKKyMgVGVzdCBhc3NvY2lhdGl2aXR5IG9mICssIC0sICosICUgLC8KKworCitzZW5kX2dkYiAicHJpbnQgeCt5K3pcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxOC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4K3kiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeCt5IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeCt5IiB9ICAgIAorICB9CisKK3NlbmRfZ2RiICJwcmludCB4LXktelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEwLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHgteSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4LXkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4LXkiIH0gICAgCisgIH0KKworc2VuZF9nZGIgInByaW50IHgqeSp6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qNTYuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCp5IgorICAgICAgfQorICAgIC1yZSA4Ii4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4KnkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4KnkiIH0gICAgCisgIH0KKworc2VuZF9nZGIgInByaW50IHgveS96XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4L3kiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeC95IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeC95IiB9ICAgIAorICB9CisKK3NlbmRfZ2RiICJwcmludCB4JXklelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCV5IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHgleSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHgleSIgfSAgICAKKyAgfQorCisKKyMgdGVzdCBwcmVjZWRlbmNlIHJ1bGVzIG9uIHBhaXJzIG9mIGFyaXRobWV0aWMgb3BlcmF0b3JzCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeD0xMCIgIiIgInNldCB2YXJpYWJsZSB4IgorZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB5PTQiICIiICAic2V0IHZhcmlhYmxlIHkiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHo9MiIgIiIgICJzZXQgdmFyaWFibGUgeiIKKworCisKKyMgeCAgeSB6CisjIDEwIDQgMgorc2VuZF9nZGIgInByaW50IHgreS16XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMTIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCt5LXoiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeCt5LXoiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4K3kteiIgfSAgICAKKyAgfQorCisjIDEwIDQgMgorc2VuZF9nZGIgInByaW50IHgreSp6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMTguKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCt5KnoiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeCt5KnoiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4K3kqeiIgfSAgICAKKyAgfQorCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgej0zIiAiIiAic2V0IHZhcmlhYmxlIHoiCisKKworIyAxMCA0IDMKK3NlbmRfZ2RiICJwcmludCB4K3klelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjExLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHgreSV6IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHgreSV6IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeCt5JXoiIH0gICAgCisgIH0KKworCisjIDEwIDQgMworc2VuZF9nZGIgInByaW50IHgreS96XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMTEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCt5L3oiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeCt5L3oiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4K3kveiIgfSAgICAKKyAgfQorCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHo9MiIgIiIgIiBzZXQgdmFyaWFibGUgeiIKKworCisjIDEwIDQgMgorc2VuZF9nZGIgInByaW50IHgteSp6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4LXkqeiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4LXkqeiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHgteSp6IiB9ICAgIAorICB9CisKKyMgMTAgNCAyCitzZW5kX2dkYiAicHJpbnQgeC15JXpcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4LXkleiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4LXkleiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHgteSV6IiB9ICAgIAorICB9CisKKworIyAxMCA0IDIKK3NlbmRfZ2RiICJwcmludCB4LXkvelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjguKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeC15L3oiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeC15L3oiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4LXkveiIgfSAgICAKKyAgfQorCisjIDEwIDQgMgorc2VuZF9nZGIgInByaW50IHgqeS96XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMjAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCp5L3oiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeCp5L3oiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4KnkveiIgfSAgICAKKyAgfQorCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHo9MyIgIiIgInNldCB6IHRvIDMiCisKKyMgMTAgNCAzCitzZW5kX2dkYiAicHJpbnQgeCp5JXpcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHgqeSV6IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHgqeSV6IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeCp5JXoiIH0gICAgCisgIH0KKworIyAxMCA0IDMKK3NlbmRfZ2RiICJwcmludCB4L3klelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjJcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4L3kleiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4L3kleiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHgveSV6IiB9ICAgIAorICB9CisKKyAgICAgICAgCisKKyMgdGVzdCB1c2Ugb2YgcGFyZW50aGVzaXMgdG8gZW5mb3JjZSBkaWZmZXJlbnQgb3JkZXIgb2YgZXZhbHVhdGlvbgorCisjIDEwIDQgMyAKK3NlbmRfZ2RiICJwcmludCB4LSh5K3opXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qM1xyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHgtKHkreikiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeC0oeSt6KSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHgtKHkreikiIH0gICAgCisgIH0KKworCisjIDEwIDQgMworc2VuZF9nZGIgInByaW50IHgvKHkqeilcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiowXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeC8oeSp6KSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4Lyh5KnopIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeC8oeSp6KSIgfSAgICAKKyAgfQorCisjIDEwIDQgMworc2VuZF9nZGIgInByaW50IHgtKHkveilcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLio5XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeC0oeS96KSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4LSh5L3opIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeC0oeS96KSIgfSAgICAKKyAgfQorCisKKyMgMTAgNCAzCitzZW5kX2dkYiAicHJpbnQgKHgreSkqelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjQyXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgKHgreSkqeiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoeCt5KSp6IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgKHgreSkqeiIgfSAgICAKKyAgfQorCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9hc3NpZ24uZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9hc3NpZ24uZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OTg2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Fzc2lnbi5leHAKQEAgLTAsMCArMSw0NDYgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBFbGVuYSBaYW5ub25pIChlemFubm9uaUBjeWdudXMuY29tKQorCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBnZGIgdGVzdHN1aXRlCisjCisjIHRlc3RzIGZvciBhbGwgdGhlIGFzc2lnbmVtbnQgb3BlcmF0b3JzCisjIHdpdGggbWl4ZWQgdHlwZXMgYW5kIHdpdGggaW50IHR5cGUgdmFyaWFibGVzCisjIAorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKKwl9CisKKyMKKyMgdGVzdCBydW5uaW5nIHByb2dyYW1zCisjCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJhbGwtdHlwZXMiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYWRkaXRpb25hbF9mbGFncz0td31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKKyAgICB9CisKKworCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworCisjCisjIHNldCBpdCB1cCBhdCBhIGJyZWFrcG9pbnQgc28gd2UgY2FuIHBsYXkgd2l0aCB0aGUgdmFyaWFibGUgdmFsdWVzCisjCisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgcGVycm9yICJjb3VsZG4ndCBydW4gdG8gYnJlYWtwb2ludCIKKyAgICBjb250aW51ZQorfQorCitnZGJfdGVzdCAibmV4dCIgInJldHVybiAwOyIgImNvbnRpbnVpbmcgYWZ0ZXIgZHVtbXkoKSIKKworc2VuZF9nZGIgInByaW50IHZfaW50PTU3XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qNTcuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgc2VuZF9nZGIgInByaW50IHZfaW50XG4iCisgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICIuKjU3LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgcGFzcyAidl9pbnQ9NTciCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInZfaW50PTU3IiB9CisgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSB2X2ludD01NyIgfSAgICAKKyAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJ2X2ludD01NyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHZfaW50PTU3IiB9ICAgIAorICB9CisKKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB2X2ludCA9IDYiICIiICJzZXQgdl9pbnQgdG8gNiIKKworCitzZW5kX2dkYiAicHJpbnQgdl9pbnQrPTU3XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qNjMuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgc2VuZF9nZGIgInByaW50IHZfaW50XG4iCisgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICIuKjYzLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgcGFzcyAidl9pbnQrPTU3IgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJ2X2ludCs9NTciIH0KKyAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHZfaW50Kz01NyIgfSAgICAKKyAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJ2X2ludCs9NTciIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSB2X2ludCs9NTciIH0gICAgCisgIH0KKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB2X2ludCA9IDYiICIiICJzZXQgdl9pbnQgdG8gNiIKKworc2VuZF9nZGIgInByaW50IHZfaW50LT01N1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKi01MS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBzZW5kX2dkYiAicHJpbnQgdl9pbnRcbiIKKyAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAtcmUgIi4qLTUxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgcGFzcyAidl9pbnQtPTU3IgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJ2X2ludC09NTciIH0KKyAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHZfaW50LT01NyIgfSAgICAKKyAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJ2X2ludC09NTciIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSB2X2ludC09NTciIH0gICAgCisgIH0KKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB2X2ludCA9IDYiICIiICJzZXQgdl9pbnQgdG8gNiIKKworc2VuZF9nZGIgInByaW50IHZfaW50Kj01XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMzAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgc2VuZF9nZGIgInByaW50IHZfaW50XG4iCisgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICIuKjMwLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgcGFzcyAidl9pbnQqPTUiCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInZfaW50Kj01IiB9CisgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSB2X2ludCo9NSIgfSAgICAKKyAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJ2X2ludCo9NSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHZfaW50Kj01IiB9ICAgIAorICB9CisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgdl9pbnQgPSA2IiAiIiAic2V0IHZfaW50IHRvIDYiCisKK3NlbmRfZ2RiICJwcmludCB2X2ludC89NFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgc2VuZF9nZGIgInByaW50IHZfaW50XG4iCisgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICBwYXNzICJ2X2ludC89NCIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAidl9pbnQvPTQiIH0KKyAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHZfaW50Lz00IiB9ICAgIAorICAgICAgICAgfQorICAgICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInZfaW50Lz00IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgdl9pbnQvPTQiIH0gICAgCisgIH0KKworCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgdl9pbnQgPSA2IiAiIiAic2V0IHZfaW50IHRvIDYiCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCU9NFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgc2VuZF9nZGIgInByaW50IHZfaW50XG4iCisgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICIuKjIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICBwYXNzICJ2X2ludCU9NCIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAidl9pbnQlPTQiIH0KKyAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHZfaW50JT00IiB9ICAgIAorICAgICAgICAgfQorICAgICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInZfaW50JT00IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgdl9pbnQlPTQiIH0gICAgCisgIH0KKworCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgdl9pbnQgPSA2IiAiIiAic2V0IHZfaW50IHRvIDYiCisKKworCitzZW5kX2dkYiAicHJpbnQgdl9pbnQrPXZfY2hhclxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjcxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHNlbmRfZ2RiICJwcmludCB2X2ludFxuIgorICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgIC1yZSAiLio3MS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgIHBhc3MgInZfaW50Kz1jaGFyIgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJ2X2ludCs9dl9jaGFyIiB9CisgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSB2X2ludCs9dl9jaGFyIiB9ICAgIAorICAgICAgICAgfQorICAgICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInZfaW50Kz12X2NoYXIiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSB2X2ludCs9dl9jaGFyIiB9ICAgIAorICB9CisKKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB2X2ludCA9IDYiICIiICJzZXQgdl9pbnQgdG8gNiIKKworCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCs9dl9zaWduZWRfY2hhclxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjcyLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHNlbmRfZ2RiICJwcmludCB2X2ludFxuIgorICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgIC1yZSAiLio3Mi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgIHBhc3MgInZfaW50Kz1zaWduZWRfY2hhciIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAidl9pbnQrPXZfc2lnbmVkX2NoYXIiIH0KKyAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHZfaW50Kz12X3NpZ25lZF9jaGFyIiB9ICAgIAorICAgICAgICAgfQorICAgICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInZfaW50Kz12X3NpZ25lZF9jaGFyIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgdl9pbnQrPXZfc2lnbmVkX2NoYXIiIH0gICAgCisgIH0KKworCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHZfaW50ID0gNiIgIiIgInNldCB2X2ludCB0byA2IgorCisKKworc2VuZF9nZGIgInByaW50IHZfaW50Kz12X3Vuc2lnbmVkX2NoYXJcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLio3My4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBzZW5kX2dkYiAicHJpbnQgdl9pbnRcbiIKKyAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAtcmUgIi4qNzMuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICBwYXNzICJ2X2ludCs9dW5zaWduZWRfY2hhciIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAidl9pbnQrPXZfdW5zaWduZWRfY2hhciIgfQorICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgdl9pbnQrPXZfdW5zaWduZWRfY2hhciIgfSAgICAKKyAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJ2X2ludCs9dl91bnNpZ25lZF9jaGFyIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgdl9pbnQrPXZfdW5zaWduZWRfY2hhciIgfSAgICAKKyAgfQorCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgdl9pbnQgPSA2IiAiIiAic2V0IHZfaW50IHRvIDYiCisKKworCitzZW5kX2dkYiAicHJpbnQgdl9pbnQrPXZfc2hvcnRcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLio5LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHNlbmRfZ2RiICJwcmludCB2X2ludFxuIgorICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgIC1yZSAiLio5LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgcGFzcyAidl9pbnQrPXNob3J0IgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJ2X2ludCs9dl9zaG9ydCIgfQorICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgdl9pbnQrPXZfc2hvcnQiIH0gICAgCisgICAgICAgICB9CisgICAgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAidl9pbnQrPXZfc2hvcnQiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSB2X2ludCs9dl9zaG9ydCIgfSAgICAKKyAgfQorCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgdl9pbnQgPSA2IiAiIiAic2V0IHZfaW50IHRvIDYiCisKKworCitzZW5kX2dkYiAicHJpbnQgdl9pbnQrPXZfc2lnbmVkX3Nob3J0XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMTAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgc2VuZF9nZGIgInByaW50IHZfaW50XG4iCisgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICIuKjEwLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgcGFzcyAidl9pbnQrPXNpZ25lZF9zaG9ydCIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAidl9pbnQrPXZfc2lnbmVkX3Nob3J0IiB9CisgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSB2X2ludCs9dl9zaWduZWRfc2hvcnQiIH0gICAgCisgICAgICAgICB9CisgICAgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAidl9pbnQrPXZfc2lnbmVkX3Nob3J0IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgdl9pbnQrPXZfc2lnbmVkX3Nob3J0IiB9ICAgIAorICB9CisKKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB2X2ludCA9IDYiICIiICJzZXQgdl9pbnQgdG8gNiIKKworCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCs9dl91bnNpZ25lZF9zaG9ydFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjExLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHNlbmRfZ2RiICJwcmludCB2X2ludFxuIgorICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgIC1yZSAiLioxMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgIHBhc3MgInZfaW50PSt1bnNpZ25lZF9zaG9ydCIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAidl9pbnQrPXZfdW5zaWduZWRfc2hvcnQiIH0KKyAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHZfaW50Kz12X3Vuc2lnbmVkX3Nob3J0IiB9ICAgIAorICAgICAgICAgfQorICAgICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInZfaW50Kz12X3Vuc2lnbmVkX3Nob3J0IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgdl9pbnQrPXZfdW5zaWduZWRfc2hvcnQiIH0gICAgCisgIH0KKworCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHZfaW50ID0gNiIgIiIgInNldCB2X2ludCB0byA2IgorCisKKworc2VuZF9nZGIgInByaW50IHZfaW50Kz12X3NpZ25lZF9pbnRcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxMy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBzZW5kX2dkYiAicHJpbnQgdl9pbnRcbiIKKyAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAtcmUgIi4qMTMuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICBwYXNzICJ2X2ludCs9c2lnbmVkX2ludCIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAidl9pbnQrPXZfc2lnbmVkX2ludCIgfQorICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgdl9pbnQrPXZfc2lnbmVkX2ludCIgfSAgICAKKyAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJ2X2ludCs9dl9zaWduZWRfaW50IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgdl9pbnQrPXZfc2lnbmVkX2ludCIgfSAgICAKKyAgfQorCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgdl9pbnQgPSA2IiAiIiAic2V0IHZfaW50IHRvIDYiCisKKworCitzZW5kX2dkYiAicHJpbnQgdl9pbnQrPXZfdW5zaWduZWRfaW50XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMTQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgc2VuZF9nZGIgInByaW50IHZfaW50XG4iCisgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICIuKjE0LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgcGFzcyAidl9pbnQrPXVuc2lnbmVkX2ludCIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAidl9pbnQrPXZfdW5zaWduZWRfaW50IiB9CisgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSB2X2ludCs9dl91bnNpZ25lZF9pbnQiIH0gICAgCisgICAgICAgICB9CisgICAgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAidl9pbnQrPXZfdW5zaWduZWRfaW50IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgdl9pbnQrPXZfdW5zaWduZWRfaW50IiB9ICAgIAorICB9CisKKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB2X2ludCA9IDYiICIiICJzZXQgdl9pbnQgdG8gNiIKKworCisKK3NlbmRfZ2RiICJwcmludCB2X2ludCs9dl9sb25nXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMTUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgc2VuZF9nZGIgInByaW50IHZfaW50XG4iCisgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICIuKjE1LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgcGFzcyAidl9pbnQrPWxvbmciCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInZfaW50Kz12X2xvbmciIH0KKyAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHZfaW50Kz12X2xvbmciIH0gICAgCisgICAgICAgICB9CisgICAgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAidl9pbnQrPXZfbG9uZyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHZfaW50Kz12X2xvbmciIH0gICAgCisgIH0KKworCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHZfaW50ID0gNiIgIiIgInNldCB2X2ludCB0byA2IgorCisKKworc2VuZF9nZGIgInByaW50IHZfaW50Kz12X3NpZ25lZF9sb25nXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMTYuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgc2VuZF9nZGIgInByaW50IHZfaW50XG4iCisgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICIuKjE2LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgcGFzcyAidl9pbnQrPXNpZ25lZF9sb25nIgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJ2X2ludCs9dl9zaWduZWRfbG9uZyIgfQorICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgdl9pbnQrPXZfc2lnbmVkX2xvbmciIH0gICAgCisgICAgICAgICB9CisgICAgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAidl9pbnQrPXZfc2lnbmVkX2xvbmciIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSB2X2ludCs9dl9zaWduZWRfbG9uZyIgfSAgICAKKyAgfQorCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgdl9pbnQgPSA2IiAiIiAic2V0IHZfaW50IHRvIDYiCisKKworc2VuZF9nZGIgInByaW50IHZfaW50Kz12X3Vuc2lnbmVkX2xvbmdcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxNy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBzZW5kX2dkYiAicHJpbnQgdl9pbnRcbiIKKyAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAtcmUgIi4qMTcuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICBwYXNzICJ2X2ludCs9dW5zaWduZWRfbG9uZyIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAidl9pbnQrPXZfdW5zaWduZWRfbG9uZyIgfQorICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgdl9pbnQrPXZfdW5zaWduZWRfbG9uZyIgfSAgICAKKyAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJ2X2ludCs9dl91bnNpZ25lZF9sb25nIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgdl9pbnQrPXZfdW5zaWduZWRfbG9uZyIgfSAgICAKKyAgfQorCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgdl9pbnQgPSA2IiAiIiAic2V0IHZfaW50IHRvIDYiCisKKworc2VuZF9nZGIgInByaW50IHZfaW50Kz12X2Zsb2F0XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMTA2XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgc2VuZF9nZGIgInByaW50IHZfaW50XG4iCisgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICIuKjEwNlxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgcGFzcyAidl9pbnQrPXZfZmxvYXQiCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInZfaW50Kz12X2Zsb2F0IiB9CisgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSB2X2ludCs9dl9mbG9hdCIgfSAgICAKKyAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJ2X2ludCs9dl9mbG9hdCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHZfaW50Kz12X2Zsb2F0IiB9ICAgIAorICB9CisKKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB2X2ludCA9IDYiICIiICJzZXQgdl9pbnQgdG8gNiIKKworCitzZW5kX2dkYiAicHJpbnQgdl9pbnQrPXZfZG91YmxlXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMjA2XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgc2VuZF9nZGIgInByaW50IHZfaW50XG4iCisgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICIuKjIwNlxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgcGFzcyAidl9pbnQrPWRvdWJsZSIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAidl9pbnQrPXZfZG91YmxlIiB9CisgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSB2X2ludCs9dl9kb3VibGUiIH0gICAgCisgICAgICAgICB9CisgICAgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAidl9pbnQrPXZfc2lnbmVkX2xvbmciIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSB2X2ludCs9dl9kb3VibGUiIH0gICAgCisgIH0KKworCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Jhci5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9iYXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTRkYTk4MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYmFyLmMKQEAgLTAsMCArMSw5IEBACitzdGF0aWMgaW50IGJhcnggX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24gKCIuZGF0YTAxIikpKSA9ICdiJyArICdhJyArICdyJzsKKworaW50IGJhciAoaW50IHgpCit7CisgIGlmICh4KQorICAgIHJldHVybiBiYXJ4OworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Jhei5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9iYXouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTNjZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9iYXouYwpAQCAtMCwwICsxLDkgQEAKK3N0YXRpYyBpbnQgYmF6eCBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbiAoIi5kYXRhMDIiKSkpID0gJ2InICsgJ2EnICsgJ3onOworCitpbnQgYmF6IChpbnQgeCkKK3sKKyAgaWYgKHgpCisgICAgcmV0dXJuIGJheng7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYml0ZmllbGRzLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2JpdGZpZWxkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMGIyNDQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2JpdGZpZWxkcy5jCkBAIC0wLDAgKzEsMTk0IEBACisvKiBUZXN0IHByb2dyYW0gdG8gdGVzdCBiaXQgZmllbGQgb3BlcmF0aW9ucyAqLworCisvKiBGb3Igbm9uLUFOU0kgY29tcGlsZXJzLCB1c2UgcGxhaW4gaW50cyBmb3IgdGhlIHNpZ25lZCBiaXQgZmllbGRzLiAgSG93ZXZlciwKKyAgIHdoZXRoZXIgdGhleSBhY3R1YWxseSBlbmQgdXAgc2lnbmVkIG9yIG5vdCBpcyBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkLCBzbworICAgdGhpcyBtYXkgY2F1c2Ugc29tZSB0ZXN0cyB0byBmYWlsLiAgQnV0IGF0IGxlYXN0IHdlIGNhbiBzdGlsbCBjb21waWxlCisgICB0aGUgdGVzdCBwcm9ncmFtIGFuZCBydW4gdGhlIHRlc3RzLi4uICovCisKKyNpZm5kZWYgX19TVERDX18KKyNkZWZpbmUgc2lnbmVkICAvKiovCisjZW5kaWYKKworc3RydWN0IGZpZWxkcworeworICB1bnNpZ25lZCBjaGFyCXVjICAgIDsKKyAgc2lnbmVkIGludAlzMSA6IDE7CisgIHVuc2lnbmVkIGludAl1MSA6IDE7CisgIHNpZ25lZCBpbnQJczIgOiAyOworICB1bnNpZ25lZCBpbnQJdTIgOiAyOworICBzaWduZWQgaW50CXMzIDogMzsKKyAgdW5zaWduZWQgaW50CXUzIDogMzsKKyAgc2lnbmVkIGludAlzOSA6IDk7CisgIHVuc2lnbmVkIGludCAgdTkgOiA5OworICBzaWduZWQgY2hhcglzYyAgICA7Cit9IGZsYWdzOworCit2b2lkIGJyZWFrMSAoKQoreworfQorCit2b2lkIGJyZWFrMiAoKQoreworfQorCit2b2lkIGJyZWFrMyAoKQoreworfQorCit2b2lkIGJyZWFrNCAoKQoreworfQorCit2b2lkIGJyZWFrNSAoKQoreworfQorCit2b2lkIGJyZWFrNiAoKQoreworfQorCit2b2lkIGJyZWFrNyAoKQoreworfQorCit2b2lkIGJyZWFrOCAoKQoreworfQorCit2b2lkIGJyZWFrOSAoKQoreworfQorCit2b2lkIGJyZWFrMTAgKCkKK3sKK30KKworLyogVGhpcyBpcyB1c2VkIGJ5IGJpdGZpZWxkcy5leHAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB0YXJnZXQgdW5kZXJzdGFuZHMKKyAgIHNpZ25lZCBiaXRmaWVsZHMuICAqLworaW50IGk7CisKK2ludCBtYWluICgpCit7CisgIC8qIEZvciBlYWNoIG1lbWJlciwgc2V0IHRoYXQgbWVtYmVyIHRvIDEsIGFsbG93IGdkYiB0byB2ZXJpZnkgdGhhdCB0aGUKKyAgICAgbWVtYmVyIChhbmQgb25seSB0aGF0IG1lbWJlcikgaXMgMSwgYW5kIHRoZW4gcmVzZXQgaXQgYmFjayB0byAwLiAqLworCisjaWZkZWYgdXNlc3R1YnMKKyAgc2V0X2RlYnVnX3RyYXBzKCk7CisgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICBmbGFncy51YyA9IDE7CisgIGJyZWFrMSAoKTsKKyAgZmxhZ3MudWMgPSAwOworCisgIGZsYWdzLnMxID0gMTsKKyAgYnJlYWsxICgpOworICBmbGFncy5zMSA9IDA7CisKKyAgZmxhZ3MudTEgPSAxOworICBicmVhazEgKCk7CisgIGZsYWdzLnUxID0gMDsKKworICBmbGFncy5zMiAgPSAxOworICBicmVhazEgKCk7CisgIGZsYWdzLnMyID0gMDsKKworICBmbGFncy51MiA9IDE7CisgIGJyZWFrMSAoKTsKKyAgZmxhZ3MudTIgPSAwOworCisgIGZsYWdzLnMzICA9IDE7CisgIGJyZWFrMSAoKTsKKyAgZmxhZ3MuczMgPSAwOworCisgIGZsYWdzLnUzID0gMTsKKyAgYnJlYWsxICgpOworICBmbGFncy51MyA9IDA7CisKKyAgZmxhZ3MuczkgPSAxOworICBicmVhazEgKCk7CisgIGZsYWdzLnM5ID0gMDsKKworICBmbGFncy51OSA9IDE7CisgIGJyZWFrMSAoKTsKKyAgZmxhZ3MudTkgPSAwOworCisgIGZsYWdzLnNjID0gMTsKKyAgYnJlYWsxICgpOworICBmbGFncy5zYyA9IDA7CisKKyAgLyogRmlsbCBhbHRlcm5hdGluZyBmaWVsZHMgd2l0aCBhbGwgMSdzIGFuZCB2ZXJpZnkgdGhhdCBub25lIG9mIHRoZSBiaXRzCisgICAgICJibGVlZCBvdmVyIiB0byB0aGUgb3RoZXIgZmllbGRzLiAqLworCisgIGZsYWdzLnVjID0gMHhGRjsKKyAgZmxhZ3MudTEgPSAweDE7CisgIGZsYWdzLnUyID0gMHgzOworICBmbGFncy51MyA9IDB4NzsKKyAgZmxhZ3MudTkgPSAweDFGRjsKKyAgYnJlYWsyICgpOworICBmbGFncy51YyA9IDA7CisgIGZsYWdzLnUxID0gMDsKKyAgZmxhZ3MudTIgPSAwOworICBmbGFncy51MyA9IDA7CisgIGZsYWdzLnU5ID0gMDsKKworICBmbGFncy5zMSA9IDB4MTsKKyAgZmxhZ3MuczIgPSAweDM7CisgIGZsYWdzLnMzID0gMHg3OworICBmbGFncy5zOSA9IDB4MUZGOworICBmbGFncy5zYyA9IDB4RkY7CisgIGJyZWFrMiAoKTsKKyAgZmxhZ3MuczEgPSAwOworICBmbGFncy5zMiA9IDA7CisgIGZsYWdzLnMzID0gMDsKKyAgZmxhZ3MuczkgPSAwOworICBmbGFncy5zYyA9IDA7CisKKyAgLyogRmlsbCB0aGUgdW5zaWduZWQgZmllbGRzIHdpdGggdGhlIG1heGltdW0gcG9zaXRpdmUgdmFsdWUgYW5kIHZlcmlmeQorICAgICB0aGF0IHRoZSB2YWx1ZXMgYXJlIHByaW50ZWQgY29ycmVjdGx5LiAqLworCisgIC8qIE1heGltdW0gcG9zaXRpdmUgdmFsdWVzICovCisgIGZsYWdzLnUxID0gMHgxOworICBmbGFncy51MiA9IDB4MzsKKyAgZmxhZ3MudTMgPSAweDc7CisgIGZsYWdzLnU5ID0gMHgxRkY7CisgIGJyZWFrMyAoKTsKKyAgZmxhZ3MudTEgPSAwOworICBmbGFncy51MiA9IDA7CisgIGZsYWdzLnUzID0gMDsKKyAgZmxhZ3MudTkgPSAwOworCisgIC8qIEZpbGwgdGhlIHNpZ25lZCBmaWVsZHMgd2l0aCB0aGUgbWF4aW11bSBwb3NpdGl2ZSB2YWx1ZSwgdGhlbiB0aGUgbWF4aW1hbGx5CisgICAgIG5lZ2F0aXZlIHZhbHVlLCB0aGVuIC0xLCBhbmQgdmVyaWZ5IGluIGVhY2ggY2FzZSB0aGF0IHRoZSB2YWx1ZXMgYXJlCisgICAgIHByaW50ZWQgY29ycmVjdGx5LiAqLworCisgIC8qIE1heGltdW0gcG9zaXRpdmUgdmFsdWVzICovCisgIGZsYWdzLnMxID0gMHgwOworICBmbGFncy5zMiA9IDB4MTsKKyAgZmxhZ3MuczMgPSAweDM7CisgIGZsYWdzLnM5ID0gMHhGRjsKKyAgYnJlYWs0ICgpOworCisgIC8qIE1heGltYWxseSBuZWdhdGl2ZSB2YWx1ZXMgKi8KKyAgZmxhZ3MuczEgPSAweDE7CisgIGZsYWdzLnMyID0gMHgyOworICBmbGFncy5zMyA9IDB4NDsKKyAgZmxhZ3MuczkgPSAweDEwMDsKKyAgLyogRXh0cmFjdCBiaXRmaWVsZCB2YWx1ZSBzbyB0aGF0IGJpdGZpZWxkLmV4cCBjYW4gY2hlY2sgaWYgdGhlIHRhcmdldAorICAgICB1bmRlcnN0YW5kcyBzaWduZWQgYml0ZmllbGRzLiAgKi8KKyAgaSA9IGZsYWdzLnM5OworICBicmVhazQgKCk7CisKKyAgLyogLTEgKi8KKyAgZmxhZ3MuczEgPSAweDE7CisgIGZsYWdzLnMyID0gMHgzOworICBmbGFncy5zMyA9IDB4NzsKKyAgZmxhZ3MuczkgPSAweDFGRjsKKyAgYnJlYWs0ICgpOworCisgIGZsYWdzLnMxID0gMDsKKyAgZmxhZ3MuczIgPSAwOworICBmbGFncy5zMyA9IDA7CisgIGZsYWdzLnM5ID0gMDsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYml0ZmllbGRzLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYml0ZmllbGRzLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjRlODBjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9iaXRmaWVsZHMuZXhwCkBAIC0wLDAgKzEsMjY4IEBACisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAoZm5mQGN5Z251cy5jb20pCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJiaXRmaWVsZHMiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKKyMKKyMgVGVzdCBiaXRmaWVsZCBsb2NhdGluZyBhbmQgdW5pcXVlbmVzcy4KKyMgRm9yIGVhY2ggbWVtYmVyLCBzZXQgdGhhdCBtZW1iZXIgdG8gMSBhbmQgdmVyaWZ5IHRoYXQgdGhlIG1lbWJlciAoYW5kIG9ubHkKKyMgdGhhdCBtZW1iZXIpIGlzIDEsIHRoZW4gcmVzZXQgaXQgYmFjayB0byAwLgorIworCitwcm9jIGJpdGZpZWxkX3VuaXF1ZW5lc3Mge30geworICAgIGdsb2JhbCBkZWNpbWFsCisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIHNyY2ZpbGUKKworICAgIGlmIHsgISBbcnVudG8gYnJlYWsxXSB9IHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorCQorICAgIGlmIFtnZGJfdGVzdCAicHJpbnQgZmxhZ3MiICIuKnVjID0gMSAuKiwgczEgPSAwLCB1MSA9IDAsIHMyID0gMCwgdTIgPSAwLCBzMyA9IDAsIHUzID0gMCwgczkgPSAwLCB1OSA9IDAsIHNjID0gMC4qIl0geworCWdkYl9zdXBwcmVzc190ZXN0czsKKyAgICB9CisgICAgaWYgW2dkYl90ZXN0ICJjb250IiAiQnJlYWsuKmJyZWFrMSBcXChcXCkgYXQgLiokc3JjZmlsZTokZGVjaW1hbC4qIiAiY29udGludWluZyB0byBicmVhazEgIzEiXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzOworICAgIH0KKyAgICAjIE5vdGUgdGhhdCB3ZSBjaGVjayBmb3IgczEgYXMgZWl0aGVyIDEgb3IgLTEsIHNvIHRoYXQgZmFpbHVyZSB0bworICAgICMgdHJlYXQgaXQgY29ycmVjdGx5IGFzIGEgc2lnbmVkIDFiaXQgZmllbGQgKHZhbHVlcyAwIG9yIC0xKSB3aGlsZQorICAgICMgcHJpbnRpbmcgaXRzIHZhbHVlIGRvZXMgbm90IGNhdXNlIGEgc3B1cmlvdXMgZmFpbHVyZS4gIFdlIGRvIHRoZQorICAgICMgc2lnbmVkbmVzcyBwcmVzZXJ2YXRpb24gdGVzdCBsYXRlci4KKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50IGZsYWdzIiAiLip1YyA9IDAgLiosIHMxID0gKDF8LTEpLCB1MSA9IDAsIHMyID0gMCwgdTIgPSAwLCBzMyA9IDAsIHUzID0gMCwgczkgPSAwLCB1OSA9IDAsIHNjID0gMC4qIiAiYml0ZmllbGQgdW5pcXVlbmVzcyAoczEpIl0geworCWdkYl9zdXBwcmVzc190ZXN0czsKKyAgICB9CisgICAgaWYgW2dkYl90ZXN0ICJjb250IiAiQnJlYWsuKmJyZWFrMSBcXChcXCkgYXQgLiokc3JjZmlsZTokZGVjaW1hbC4qIiAiY29udGludWluZyB0byBicmVhazEgIzIiXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzOworICAgIH0KKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50IGZsYWdzIiAiLip1YyA9IDAgLiosIHMxID0gMCwgdTEgPSAxLCBzMiA9IDAsIHUyID0gMCwgczMgPSAwLCB1MyA9IDAsIHM5ID0gMCwgdTkgPSAwLCBzYyA9IDAuKiIgImJpdGZpZWxkIHVuaXF1ZW5lc3MgKHUxKSJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorICAgIGlmIFtnZGJfdGVzdCAiY29udCIgIkJyZWFrLipicmVhazEgXFwoXFwpIGF0IC4qJHNyY2ZpbGU6JGRlY2ltYWwuKiIgImNvbnRpbnVpbmcgdG8gYnJlYWsxICMzIl0geworCWdkYl9zdXBwcmVzc190ZXN0czsKKyAgICB9CisgICAgaWYgW2dkYl90ZXN0ICJwcmludCBmbGFncyIgIi4qdWMgPSAwIC4qLCBzMSA9IDAsIHUxID0gMCwgczIgPSAxLCB1MiA9IDAsIHMzID0gMCwgdTMgPSAwLCBzOSA9IDAsIHU5ID0gMCwgc2MgPSAwLioiICJiaXRmaWVsZCB1bmlxdWVuZXNzIChzMikiXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzOworICAgIH0KKyAgICBpZiBbZ2RiX3Rlc3QgImNvbnQiICJCcmVhay4qYnJlYWsxIFxcKFxcKSBhdCAuKiRzcmNmaWxlOiRkZWNpbWFsLioiICJjb250aW51aW5nIHRvIGJyZWFrMSAjNCJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorICAgIGlmIFtnZGJfdGVzdCAicHJpbnQgZmxhZ3MiICIuKnVjID0gMCAuKiwgczEgPSAwLCB1MSA9IDAsIHMyID0gMCwgdTIgPSAxLCBzMyA9IDAsIHUzID0gMCwgczkgPSAwLCB1OSA9IDAsIHNjID0gMC4qIiAiYml0ZmllbGQgdW5pcXVlbmVzcyAodTIpIl0geworCWdkYl9zdXBwcmVzc190ZXN0czsKKyAgICB9CisgICAgaWYgW2dkYl90ZXN0ICJjb250IiAiQnJlYWsuKmJyZWFrMSBcXChcXCkgYXQgLiokc3JjZmlsZTokZGVjaW1hbC4qIiAiY29udGludWluZyB0byBicmVhazEgIzUiXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzOworICAgIH0KKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50IGZsYWdzIiAiLip1YyA9IDAgLiosIHMxID0gMCwgdTEgPSAwLCBzMiA9IDAsIHUyID0gMCwgczMgPSAxLCB1MyA9IDAsIHM5ID0gMCwgdTkgPSAwLCBzYyA9IDAuKiIgImJpdGZpZWxkIHVuaXF1ZW5lc3MgKHMzKSJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorICAgIGlmIFtnZGJfdGVzdCAiY29udCIgIkJyZWFrLipicmVhazEgXFwoXFwpIGF0IC4qJHNyY2ZpbGU6JGRlY2ltYWwuKiIgImNvbnRpbnVpbmcgdG8gYnJlYWsxICM2Il0geworCWdkYl9zdXBwcmVzc190ZXN0czsKKyAgICB9CisgICAgaWYgW2dkYl90ZXN0ICJwcmludCBmbGFncyIgIi4qdWMgPSAwIC4qLCBzMSA9IDAsIHUxID0gMCwgczIgPSAwLCB1MiA9IDAsIHMzID0gMCwgdTMgPSAxLCBzOSA9IDAsIHU5ID0gMCwgc2MgPSAwLioiICJiaXRmaWVsZCB1bmlxdWVuZXNzICh1MykiXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzCisgICAgfQorICAgIGlmIFtnZGJfdGVzdCAiY29udCIgIkJyZWFrLipicmVhazEgXFwoXFwpIGF0IC4qJHNyY2ZpbGU6JGRlY2ltYWwuKiIgImNvbnRpbnVpbmcgdG8gYnJlYWsxICM3Il0geworCWdkYl9zdXBwcmVzc190ZXN0cworICAgIH0KKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50IGZsYWdzIiAiLip1YyA9IDAgLiosIHMxID0gMCwgdTEgPSAwLCBzMiA9IDAsIHUyID0gMCwgczMgPSAwLCB1MyA9IDAsIHM5ID0gMSwgdTkgPSAwLCBzYyA9IDAuKiIgImJpdGZpZWxkIHVuaXF1ZW5lc3MgKHM5KSJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHMKKyAgICB9CisgICAgaWYgW2dkYl90ZXN0ICJjb250IiAiQnJlYWsuKmJyZWFrMSBcXChcXCkgYXQgLiokc3JjZmlsZTokZGVjaW1hbC4qIiAiY29udGludWluZyB0byBicmVhazEgIzgiXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzCisgICAgfQorICAgIGlmIFtnZGJfdGVzdCAicHJpbnQgZmxhZ3MiICIuKnVjID0gMCAuKiwgczEgPSAwLCB1MSA9IDAsIHMyID0gMCwgdTIgPSAwLCBzMyA9IDAsIHUzID0gMCwgczkgPSAwLCB1OSA9IDEsIHNjID0gMC4qIiAiYml0ZmllbGQgdW5pcXVlbmVzcyAodTkpIl0geworCWdkYl9zdXBwcmVzc190ZXN0cworICAgIH0KKyAgICBpZiBbZ2RiX3Rlc3QgImNvbnQiICJCcmVhay4qYnJlYWsxIFxcKFxcKSBhdCAuKiRzcmNmaWxlOiRkZWNpbWFsLioiICJjb250aW51aW5nIHRvIGJyZWFrMSAjOSJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHMKKyAgICB9CisgICAgaWYgW2dkYl90ZXN0ICJwcmludCBmbGFncyIgIi4qdWMgPSAwIC4qLCBzMSA9IDAsIHUxID0gMCwgczIgPSAwLCB1MiA9IDAsIHMzID0gMCwgdTMgPSAwLCBzOSA9IDAsIHU5ID0gMCwgc2MgPSAxLioiICJiaXRmaWVsZCB1bmlxdWVuZXNzIChzYykiXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzCisgICAgfQorICAgICMgSG1tbW0/CisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7Cit9CisKKworIworIyBUZXN0IGJpdGZpZWxkIGNvbnRhaW5tZW50LgorIyBGaWxsIGFsdGVybmF0aW5nIGZpZWxkcyB3aXRoIGFsbCAxJ3MgYW5kIHZlcmlmeSB0aGF0IG5vbmUgb2YgdGhlIGJpdHMKKyMgImJsZWVkIG92ZXIiIHRvIHRoZSBvdGhlciBmaWVsZHMuCisjCisKK3Byb2MgYml0ZmllbGRfY29udGFpbm1lbnQge30geworICAgIGdsb2JhbCBkZWNpbWFsCisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIHNyY2ZpbGUKKworICAgIGRlbGV0ZV9icmVha3BvaW50cworCisgICAgaWYgeyAhW3J1bnRvIGJyZWFrMl0gfSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzCisgICAgfQorCisgICAgaWYgW2dkYl90ZXN0ICJwcmludC94IGZsYWdzIiAiPSB7dWMgPSAweGZmLCBzMSA9IDB4MCwgdTEgPSAweDEsIHMyID0gMHgwLCB1MiA9IDB4MywgczMgPSAweDAsIHUzID0gMHg3LCBzOSA9IDB4MCwgdTkgPSAweDFmZiwgc2MgPSAweDB9IiAiYml0ZmllbGQgY29udGFpbm1lbnQgIzEiXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzCisgICAgfQorCisgICAgaWYgW2dkYl90ZXN0ICJjb250IiAiQnJlYWsuKmJyZWFrMiBcXChcXCkgYXQgLiokc3JjZmlsZTokZGVjaW1hbC4qIiAiY29udGludWluZyB0byBicmVhazIiXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzCisgICAgfQorCisgICAgIyBJZiBwcm9ncmFtIGlzIGNvbXBpbGVkIHdpdGggU3VuIENDLCB0aGVuIHRoZXNlIHByaW50IG91dCBhcyB0aGVpcgorICAgICMgYWN0dWFsIHNpemVzOyBpZiBjb21waWxlZCB3aXRoIGdjYywgdGhleSBwcmludCBvdXQgYXMgMHhmZmZmZmZmZgorICAgICMgKHdoaWNoIHN0cmlrZXMgbWUgYXMgYm9ndXMsIGJ1dCBhY2NlcHQgaXQgYXQgbGVhc3QgZm9yIG5vdykuCisgICAgaWYgW2dkYl90ZXN0ICJwcmludC94IGZsYWdzIiAiPSB7dWMgPSAweDAsIHMxID0gMHgoMXxmKiksIHUxID0gMHgwLCBzMiA9IDB4KDN8ZiopLCB1MiA9IDB4MCwgczMgPSAweCg3fGYqKSwgdTMgPSAweDAsIHM5ID0gMHgoMWZmfGYqKSwgdTkgPSAweDAsIHNjID0gMHhmZn0iICJiaXRmaWVsZCBjb250YWlubWVudCAjMiJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHMKKyAgICB9CisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7Cit9CisKKyMgVGVzdCB1bnNpZ25lZCBiaXRmaWVsZHMgZm9yIHVuc2lnbmVkbmVzcyBhbmQgcmFuZ2UuCisjIEZpbGwgdGhlIHVuc2lnbmVkIGZpZWxkcyB3aXRoIHRoZSBtYXhpbXVtIHBvc2l0aXZlIHZhbHVlIGFuZCB2ZXJpZnkgdGhhdAorIyB0aGUgdmFsdWVzIGFyZSBwcmludGVkIGNvcnJlY3RseS4KKworcHJvYyBiaXRmaWVsZF91bnNpZ25lZG5lc3Mge30geworICAgIGdsb2JhbCBkZWNpbWFsCisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIHNyY2ZpbGUKKworICAgIGRlbGV0ZV9icmVha3BvaW50cworCisgICAgaWYgeyAhW3J1bnRvIGJyZWFrM10gfSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzCisgICAgfQorCisgICAgaWYgW2dkYl90ZXN0ICJwcmludCBmbGFncyIgIi4qdWMgPSAwIC4qLCBzMSA9IDAsIHUxID0gMSwgczIgPSAwLCB1MiA9IDMsIHMzID0gMCwgdTMgPSA3LCBzOSA9IDAsIHU5ID0gNTExLCBzYyA9IDAuKiIgInVuc2lnbmVkIGJpdGZpZWxkIHJhbmdlcyJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHMKKyAgICB9CisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7Cit9CisKKyMKKyMgVGVzdCBzaWduZWQgYml0ZmllbGRzIGZvciBzaWduZWRuZXNzIGFuZCByYW5nZS4KKyMgRmlsbCB0aGUgc2lnbmVkIGZpZWxkcyB3aXRoIHRoZSBtYXhpbXVtIHBvc2l0aXZlIHZhbHVlLCB0aGVuIHRoZSBtYXhpbWFsbHkKKyMgbmVnYXRpdmUgdmFsdWUsIHRoZW4gLTEsIGFuZCB2ZXJpZnkgaW4gZWFjaCBjYXNlIHRoYXQgdGhlIHZhbHVlcyBhcmUKKyMgcHJpbnRlZCBjb3JyZWN0bHkuCisjCisKK3Byb2MgYml0ZmllbGRfc2lnbmVkbmVzcyB7fSB7CisgICAgZ2xvYmFsIGRlY2ltYWwKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgc3JjZmlsZQorCisgICAgZGVsZXRlX2JyZWFrcG9pbnRzCisKKyAgICBpZiB7ICEgW3J1bnRvIGJyZWFrNF0gfSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzCisgICAgfQorCisgICAgaWYgW2dkYl90ZXN0ICJwcmludCBmbGFncyIgIj0ge3VjID0gMCAuKiwgczEgPSAwLCB1MSA9IDAsIHMyID0gMSwgdTIgPSAwLCBzMyA9IDMsIHUzID0gMCwgczkgPSAyNTUsIHU5ID0gMCwgc2MgPSAwIC4qfSIgInNpZ25lZCBiaXRmaWVsZHMsIG1heCBwb3NpdGl2ZSB2YWx1ZXMiXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzCisgICAgfQorCisgICAgaWYgW2dkYl90ZXN0ICJjb250IiAiQnJlYWsuKmJyZWFrNCBcXChcXCkgYXQgLiokc3JjZmlsZTokZGVjaW1hbC4qIiAiY29udGludWluZyB0byBicmVhazQgIzEiXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzCisgICAgfQorCisgICAgIyBEZXRlcm1pbmUgaWYgdGhlIHRhcmdldCBoYXMgc2lnbmVkIGJpdGZpZWxkcyBzbyB3ZSBjYW4geGZhaWwgdGhlCisgICAgIyB0aGUgc2lnbmVkIGJpdGZpZWxkIHRlc3RzIGlmIGl0IGRvZXNuJ3QuCisgICAgc2VuZF9nZGIgInByaW50IGlcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qID0gLTI1Ni4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJkZXRlcm1pbmluZyBzaWduZWQtbmVzcyBvZiBiaXRmaWVsZHMiCisJfQorCS1yZSAiLiogPSAyNTYuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAiZGV0ZXJtaW5pbmcgc2lnbmVkLW5lc3Mgb2YgYml0ZmllbGRzIgorCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgImRldGVybWluaW5nIHNpZ25lZC1uZXNzIG9mIGJpdGZpZWxkcyIKKwkgICAgZ2RiX3N1cHByZXNzX3Rlc3RzCisJfQorCWRlZmF1bHQgeyAKKwkgICAgZmFpbCAiZGV0ZXJtaW5pbmcgc2lnbmVkLW5lc3Mgb2YgYml0ZmllbGRzIiA7CisJICAgIGdkYl9zdXBwcmVzc190ZXN0czsKKwl9CisgICAgfQorCisgICAgaWYgW2dkYl90ZXN0ICJwcmludCBmbGFncyIgIi4qdWMgPSAwIC4qLCBzMSA9IC0xLCB1MSA9IDAsIHMyID0gLTIsIHUyID0gMCwgczMgPSAtNCwgdTMgPSAwLCBzOSA9IC0yNTYsIHU5ID0gMCwgc2MgPSAwLioiICJzaWduZWQgYml0ZmllbGRzLCBtYXggbmVnYXRpdmUgdmFsdWVzIl0geworICAgICAgICBnZGJfc3VwcHJlc3NfdGVzdHMKKyAgICB9CisKKyAgICBpZiBbZ2RiX3Rlc3QgImNvbnQiICJCcmVhay4qYnJlYWs0IFxcKFxcKSBhdCAuKiRzcmNmaWxlOiRkZWNpbWFsLioiICJjb250aW51aW5nIHRvIGJyZWFrNCAjMiJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHMKKyAgICB9CisKKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50IGZsYWdzIiAiLip1YyA9IDAgLiosIHMxID0gLTEsIHUxID0gMCwgczIgPSAtMSwgdTIgPSAwLCBzMyA9IC0xLCB1MyA9IDAsIHM5ID0gLTEsIHU5ID0gMCwgc2MgPSAwLioiICJzaWduZWQgYml0ZmllbGRzIHdpdGggLTEiXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzCisgICAgfQorICAgICMgSG1tbW0/Pz8KKyAgICBnZGJfc3RvcF9zdXBwcmVzc2luZ190ZXN0czsKK30KKworZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworc2VuZF9nZGIgInNldCBwcmludCBzZXZlbmJpdC1zdHJpbmdzXG4iIDsgZ2RiX2V4cGVjdCAtcmUgIiRnZGJfcHJvbXB0ICQiCisKK2JpdGZpZWxkX3VuaXF1ZW5lc3MKK2lmIFtpc3RhcmdldCAibWlwcy1pZHQtKiJdIHRoZW4geworICAgICMgUmVzdGFydCBiZWNhdXNlIElEVC9TSU0gcnVucyBvdXQgb2YgZmlsZSBkZXNjcmlwdG9ycy4KKyAgICBnZGJfZXhpdAorICAgIGdkYl9zdGFydAorICAgIGdkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorICAgIGdkYl9sb2FkICR7YmluZmlsZX0KK30KK2JpdGZpZWxkX2NvbnRhaW5tZW50CitpZiBbaXN0YXJnZXQgIm1pcHMtaWR0LSoiXSB0aGVuIHsKKyAgICAjIFJlc3RhcnQgYmVjYXVzZSBJRFQvU0lNIHJ1bnMgb3V0IG9mIGZpbGUgZGVzY3JpcHRvcnMuCisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKyAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKyAgICBnZGJfbG9hZCAke2JpbmZpbGV9Cit9CitiaXRmaWVsZF91bnNpZ25lZG5lc3MKK2lmIFtpc3RhcmdldCAibWlwcy1pZHQtKiJdIHRoZW4geworICAgICMgUmVzdGFydCBiZWNhdXNlIElEVC9TSU0gcnVucyBvdXQgb2YgZmlsZSBkZXNjcmlwdG9ycy4KKyAgICBnZGJfZXhpdAorICAgIGdkYl9zdGFydAorICAgIGdkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorICAgIGdkYl9sb2FkICR7YmluZmlsZX0KK30KK2JpdGZpZWxkX3NpZ25lZG5lc3MKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYml0b3BzLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYml0b3BzLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWM1NzhlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9iaXRvcHMuZXhwCkBAIC0wLDAgKzEsMzY1IEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRWxlbmEgWmFubm9uaSAoZXphbm5vbmlAY3lnbnVzLmNvbSkKKworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZ2RiIHRlc3RzdWl0ZQorIworIyB0ZXN0cyBleHByZXNzaW9ucyB3aXRoIGJpdHdpc2Ugb3BlcmF0b3JzLCBhbmQgc29tZQorIyBsb2dpY2FsIG9wZXJhdG9ycworIyBEb2VzIG5vdCB1c2UgYSB0YXJnZXQgcHJvZ3JhbQorIyAKKworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCisgICAgICAgIH0KKworIworIyB0ZXN0IHJ1bm5pbmcgcHJvZ3JhbXMKKyMKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCisKK3NlbmRfZ2RiICJwcmludCAhMVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAwLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICExIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICExIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgITEiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAhMFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICEwIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICEwIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgITAiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAhMTAwXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgITEwMCIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAhMTAwIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgITEwMCIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50ICExMDAwXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgITEwMDAiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgITEwMDAiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAhMTAwMCIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50ICExMFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAwLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICExMCIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAhMTAiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAhMTAiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAhMlxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAwLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICEyICIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAhMiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mICEyIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgMTAgfCA1XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDE1LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIDEwIHwgNSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAxMCB8IDUiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAxMCB8IDUiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAxMCAmIDVcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAxMCAmIDUiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgMTAgJiA1IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgMTAgJiA1IiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgMTAgXiA1XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDE1LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIDEwIF4gNSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAxMCBeIDUiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAxMCBeIDUiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAtITBcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gLTEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgLSEwIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIC0hMCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIC0hMCIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IH4tITBcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB+LSEwIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIH4tITAiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB+LSEwIiB9CisgIH0KKworCisKK3NlbmRfZ2RiICJwcmludCAzICogMiAvIDQuMCAqIDIuMFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAzLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIDMgKiAyIC8gNC4wICogMi4wIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIDMgKiAyIC8gNC4wICogMi4wIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgMyAqIDIgLyA0LjAgKiAyLjAiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCA4IDw8IDIgPj4gNFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAyLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIDggPDwgMiA+PiA0IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIDggPDwgMiA+PiA0IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgOCA8PCAyID4+IDQiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAtMSA8IDAgPiAxXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgLTEgPCAwID4gMSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAtMSA8IDAgPiAxIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgLTEgPCAwID4gMSIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IDE1IF4gMTAgXiA1IF4gN1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSA3LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIDE1IF4gMTAgXiA1IF4gNyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAxNSBeIDEwIF4gNSBeIDciIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAxNSBeIDEwIF4gNSBeIDciIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAzLjUgPCA0LjBcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAzLjUgPCA0LjAiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgMy41IDwgNC4wIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgMy41IDwgNC4wIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgMy41IDwgLTQuMFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAwLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIDMuNSA8IC00LjAiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgMy41IDwgLTQuMCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIDMuNSA8IC00LjAiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAyID4gLTNcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAyID4gLTMiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgMiA+IC0zIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgMiA+IC0zIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgLTM+NFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAwLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIC0zPjQiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgLTM+NCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIC0zPjQiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAoLTMgPiA0KVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAwLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICgtMyA+IDQpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICgtMyA+IDQpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgKC0zID4gNCkiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAzPj0yLjVcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAzPj0yLjUiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgMz49Mi41IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgMz49Mi41IiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgMz49NC41XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgMz49NC41IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIDM+PTQuNSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIDM+PTQuNSIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IDM9PTMuMFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIDM9PTMuMCIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAzPT0zLjAiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAzPT0zLjAiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAzPT00LjBcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAzPT00LjAiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgMz09NC4wIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgMz09NC4wIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgMyE9My4wXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgMyE9My4wIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIDMhPTMuMCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIDMhPTMuMCIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IDMhPTUuMFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIDMhPTUuMCIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAzIT01LjAiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAzIT01LjAiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAwIHx8IDEgJiYgMCB8IDAgXiAwID09IDggPiAxMjggPj4xICsyICoyXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgMCB8fCAxICYmIDAgfCAwIF4gMCA9PSA4ID4gMTI4ID4+MSArMiAqMiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAwIHx8IDEgJiYgMCB8IDAgXiAwID09IDggPiAxMjggPj4xICsyICoyIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgMCB8fCAxICYmIDAgfCAwIF4gMCA9PSA4ID4gMTI4ID4+MSArMiAqMiIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IDEuMCB8fCAwXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgMS4wIHx8IDAiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgMS4wIHx8IDAiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAxLjAgfHwgMCIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IDAuMCB8fCAxLjBcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAwLjAgfHwgMS4wIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIDAuMCB8fCAxLjAiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAwLjAgfHwgMS4wIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgMC4wIHx8IDBcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAwLjAgfHwgMCIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAwLjAgfHwgMCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIDAuMCB8fCAwIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgMCB8fCAxICYmIDAgfCAwIF4gMCA9PSA4XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgMCB8fCAxICYmIDAgfCAwIF4gMCA9PSA4IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIDAgfHwgMSAmJiAwIHwgMCBeIDAgPT0gOCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIDAgfHwgMSAmJiAwIHwgMCBeIDAgPT0gOCIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IDAgPT0gOCA+IDEyOCA+PiAxICsgMiAqIDJcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAwID09IDggPiAxMjggPj4gMSArIDIgKiAyIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIDAgPT0gOCA+IDEyOCA+PiAxICsgMiAqIDIiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAwID09IDggPiAxMjggPj4gMSArIDIgKiAyIiB9CisgIH0KKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9icmFuY2hlcy5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9icmFuY2hlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmM2I3YzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2JyYW5jaGVzLmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qIFRlc3RzIGZvciBzaW5nbGUgc3RlcHBpbmcgdGhyb3VnaCB2YXJpb3VzIGJyYW5jaCBjb25kaXRpb25zICovCisKK2ludCBub3NjcmFtYmxlKGludCBhKQoreworICByZXR1cm4gYSA7Cit9CisKK2ludCBlY2hvKGludCBhKQoreyByZXR1cm4gbm9zY3JhbWJsZShhKSA7IH0KKworaW50IGVxdWFsdGVzdChpbnQgYSxpbnQgYikKK3sgaW50IHJldHZhbCA7CisgIGlmIChhID09IGIpCisgICAgcmV0dmFsID0gbm9zY3JhbWJsZSgxKSA7CisgIGVsc2UgcmV0dmFsID0gbm9zY3JhbWJsZSgwKSA7CisgIHJldHVybiByZXR2YWwgOworfQorCitpbnQgbmVxdGVzdChpbnQgYSAsIGludCBiKQoreyBpbnQgcmV0dmFsIDsKKyAgaWYgKGEgIT0gYikKKyAgICByZXR2YWwgPSBlY2hvKDEpIDsKKyAgZWxzZSByZXR2YWwgPSBlY2hvKDIpIDsKKyAgcmV0dXJuIHJldHZhbCA7Cit9CitpbnQgemVyb3Rlc3QoaW50IGEgKQoreyBpbnQgcmV0dmFsIDsKKyAgYSA9IGVjaG8oYSkgOworICBpZiAoYSA9PTApCisgICAgcmV0dmFsID0gZWNobygxKSA7CisgIGVsc2UKKyAgICByZXR2YWwgPSBlY2hvKDApIDsKKyAgcmV0dmFsID0gZWNobyhyZXR2YWwpIDsKKyAgcmV0dXJuIHJldHZhbCA7Cit9CisKK2ludCB6ZXJvdGVzdDIoaW50IGEpCit7CisgIHJldHVybiAoYT09MCkgOworfQorCitpbnQgbm9uemVyb3Rlc3QoaW50IGEpCit7CisgIGludCByZXR2YWwgOworICBpZiAoYSAhPSAwKQorICAgIHJldHZhbCA9IGVjaG8oMCkgOworICBlbHNlIHJldHZhbCA9IGVjaG8oMSkgOworICByZXR1cm4gcmV0dmFsIDsKK30KKworaW50IHdoaWxldGVzdChpbnQgYSkKK3sKKyAgd2hpbGUgKGEgPiAwKQorICAgIHsKKyAgICAgIGEtLSA7CisgICAgfQorICByZXR1cm4gMCA7Cit9CitpbnQgd2hpbGV0ZXN0MihpbnQgYSkKK3sKKyAgd2hpbGUgKGEgPiAwKQorICAgIHsKKyAgICAgIGEgPSBub3NjcmFtYmxlKGEpIDsKKyAgICAgIGEtLSA7CisgICAgfQorICByZXR1cm4gYSA7Cit9CisKK2ludCBkZWNyKGludCB4KSB7IHJldHVybiB4IC0gMSAgOyB9CisKK2ludCB3aGlsZTMoaW50IGEpCit7CisgIGludCBiID0gYSA7CisgIHdoaWxlIChhID09IGIpCisgICAgeworICAgICAgYSA9IGVjaG8oYSkgOworICAgICAgYiA9IGRlY3IoYikgOworICAgIH0KKyAgcmV0dXJuIGEgOworfQorCit2b2lkIGRvbmUgKGludCB4KSB7IH0gCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGEsYixjLGQgOworICBkb25lKDEpIDsKKyAgYSA9IGVjaG8oMTIzNDU2KSA7CisgIGIgPSBlY2hvKDEyMzQ1NikgOworICBjID0gZWNobyg1Njc4OSkgOworICBkID0gZWNobygwKSA7CisjaWYgMQorICBlcXVhbHRlc3QoYSxiKSA7CisgIGRvbmUoNykgOworICBlcXVhbHRlc3QoYSxjKSA7CisgIGRvbmUoOCkgOworICB3aGlsZXRlc3QoMykgOyAgLyogd29ya2VkICovCisgIGRvbmUoMykgOworICB3aGlsZTMoMykgOworICBkb25lKDYpIDsKKyNlbmRpZiAgCisgIG5lcXRlc3QoYSxiKSA7IAorICBuZXF0ZXN0KGEsYikgOyAKKyAgbmVxdGVzdChhLGMpIDsgCisgIHplcm90ZXN0KGQpIDsKKyAgemVyb3Rlc3QoYSkgOworICBkb25lKDUpIDsKKyAgbm9uemVyb3Rlc3QoZCkgOworICBkb25lKDQpIDsKKyAgbm9uemVyb3Rlc3QoYSkgOworICBkb25lKDExMSkgOworICByZXR1cm4gMSA7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2JyZWFrLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2JyZWFrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxZDZlNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYnJlYWsuYwpAQCAtMCwwICsxLDgxIEBACisjaWZkZWYgdnh3b3JrcworCisjICBpbmNsdWRlIDxzdGRpby5oPgorCisvKiBWeFdvcmtzIGRvZXMgbm90IHN1cHBseSBhdG9pLiAgKi8KK3N0YXRpYyBpbnQKK2F0b2kgKHopCisgICAgIGNoYXIgKno7Cit7CisgIGludCBpID0gMDsKKworICB3aGlsZSAoKnogPj0gJzAnICYmICp6IDw9ICc5JykKKyAgICBpID0gaSAqIDEwICsgKCp6KysgLSAnMCcpOworICByZXR1cm4gaTsKK30KKworLyogSSBkb24ndCBrbm93IG9mIGFueSB3YXkgdG8gcGFzcyBhbiBhcnJheSB0byBWeFdvcmtzLiAgVGhpcyBmdW5jdGlvbgorICAgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIGdkYi4gICovCisKK3Z4bWFpbiAoYXJnKQorY2hhciAqYXJnOworeworICBjaGFyICphcmd2WzJdOworCisgIGFyZ3ZbMF0gPSAiIjsKKyAgYXJndlsxXSA9IGFyZzsKKyAgbWFpbiAoMiwgYXJndiwgKGNoYXIgKiopIDApOworfQorCisjZWxzZSAvKiAhIHZ4d29ya3MgKi8KKyMgIGluY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYgLyogISB2eHdvcmtzICovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBkbyBub3RoaW5nIHVzZWZ1bC4gIFRoZXkgYXJlIGluY2x1ZGVkIHNpbXBseQorICogYXMgcGxhY2VzIHRvIHRyeSBzZXR0aW5nIGJyZWFrcG9pbnRzIGF0LiAgVGhleSBhcmUgZXhwbGljaXRseQorICogIm9uZS1saW5lIGZ1bmN0aW9ucyIgdG8gdmVyaWZ5IHRoYXQgdGhpcyBjYXNlIHdvcmtzIChzb21lIHZlcnNpb25zCisgKiBvZiBnY2MgaGF2ZSBvciBoYXZlIGhhZCBwcm9ibGVtcyB3aXRoIHRoaXMpLgorICovCisKK2ludCBtYXJrZXIxICgpIHsgcmV0dXJuICgwKTsgfQoraW50IG1hcmtlcjIgKGEpIGludCBhOyB7IHJldHVybiAoMSk7IH0KK3ZvaWQgbWFya2VyMyAoYSwgYikgY2hhciAqYSwgKmI7IHt9Cit2b2lkIG1hcmtlcjQgKGQpIGxvbmcgZDsge30KKworLyoKKyAqCVRoaXMgc2ltcGxlIGNsYXNzaWNhbCBleGFtcGxlIG9mIHJlY3Vyc2lvbiBpcyB1c2VmdWwgZm9yCisgKgl0ZXN0aW5nIHN0YWNrIGJhY2t0cmFjZXMgYW5kIHN1Y2guCisgKi8KKworaW50CittYWluIChhcmdjLCBhcmd2LCBlbnZwKQoraW50IGFyZ2M7CitjaGFyICphcmd2W10sICoqZW52cDsKK3sKKyNpZmRlZiB1c2VzdHVicworICAgIHNldF9kZWJ1Z190cmFwcygpOworICAgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICAgIGlmIChhcmdjID09IDEyMzQ1NikgeworCWZwcmludGYgKHN0ZGVyciwgInVzYWdlOiAgZmFjdG9yaWFsIDxudW1iZXI+XG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgcHJpbnRmICgiJWRcbiIsIGZhY3RvcmlhbCAoYXRvaSAoIjYiKSkpOworCisgICAgbWFya2VyMSAoKTsKKyAgICBtYXJrZXIyICg0Myk7CisgICAgbWFya2VyMyAoInN0YWNrIiwgInRyYWNlIik7CisgICAgbWFya2VyNCAoMTc3NjAxOTc2TCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmYWN0b3JpYWwgKHZhbHVlKQoraW50IHZhbHVlOworeworICAgIGlmICh2YWx1ZSA+IDEpIHsKKwl2YWx1ZSAqPSBmYWN0b3JpYWwgKHZhbHVlIC0gMSk7CisgICAgfQorICAgIHJldHVybiAodmFsdWUpOworfQorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2JyZWFrLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvYnJlYWsuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZjFkN2YKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2JyZWFrLmV4cApAQCAtMCwwICsxLDc2OSBAQAorIyAgIENvcHlyaWdodCAoQykgMTk4OCwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NCwgMTk5NywgMTk5OAorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llLiAocm9iQGN5Z251cy5jb20pCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCisKKyMKKyMgdGVzdCBydW5uaW5nIHByb2dyYW1zCisjCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJicmVhayIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1ZyBhZGRpdGlvbmFsX2ZsYWdzPS13fV0gIT0gIiIgfSB7CisgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCitpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYl9zdHViXSB7CisgICAgZ2RiX3N0ZXBfZm9yX3N0dWI7Cit9CisjCisjIHRlc3Qgc2ltcGxlIGJyZWFrcG9pbnQgc2V0dGluZyBjb21tYW5kcworIworCisjIFRlc3QgZGVsZXRpbmcgYWxsIGJyZWFrcG9pbnRzIHdoZW4gdGhlcmUgYXJlIG5vbmUgaW5zdGFsbGVkLAorIyBHREIgc2hvdWxkIG5vdCBwcm9tcHQgZm9yIGNvbmZpcm1hdGlvbi4KKyMgTm90ZSB0aGF0IGdkYi1pbml0LmV4cCBwcm92aWRlcyBhICJkZWxldGVfYnJlYWtwb2ludHMiIHByb2MKKyMgZm9yIGdlbmVyYWwgdXNlIGVsc2V3aGVyZS4KKworc2VuZF9nZGIgImRlbGV0ZSBicmVha3BvaW50c1xuIgorZ2RiX2V4cGVjdCB7CisgICAgIC1yZSAiRGVsZXRlIGFsbCBicmVha3BvaW50cy4qJCIgeworCSAgICBzZW5kX2dkYiAieVxuIgorCSAgICBnZGJfZXhwZWN0IHsKKwkJLXJlICIkZ2RiX3Byb21wdCAkIiB7CisJCSAgICBmYWlsICJEZWxldGUgYWxsIGJyZWFrcG9pbnRzIHdoZW4gbm9uZSAodW5leHBlY3RlZCBwcm9tcHQpIgorCQl9CisJCXRpbWVvdXQJeyBmYWlsICJEZWxldGUgYWxsIGJyZWFrcG9pbnRzIHdoZW4gbm9uZSAodGltZW91dCBhZnRlciB1bmV4cGVjdGVkIHByb21wdCkiIH0KKwkgICAgfQorCX0KKyAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgcGFzcyAiRGVsZXRlIGFsbCBicmVha3BvaW50cyB3aGVuIG5vbmUiIH0KKyAgICB0aW1lb3V0CSAgICAgICAgICAgIHsgZmFpbCAiRGVsZXRlIGFsbCBicmVha3BvaW50cyB3aGVuIG5vbmUgKHRpbWVvdXQpIiB9Cit9CisKKyMKKyMgdGVzdCBicmVhayBhdCBmdW5jdGlvbgorIworZ2RiX3Rlc3QgImJyZWFrIG1haW4iIFwKKyAgICAiQnJlYWtwb2ludC4qYXQuKiBmaWxlIC4qJHNyY2ZpbGUsIGxpbmUuKiIgXAorICAgICJicmVha3BvaW50IGZ1bmN0aW9uIgorCisjCisjIHRlc3QgYnJlYWsgYXQgZnVuY3Rpb24gaW4gZmlsZQorIworZ2RiX3Rlc3QgImJyZWFrICRzcmNmaWxlOmZhY3RvcmlhbCIgXAorICAgICJCcmVha3BvaW50LiphdC4qIGZpbGUgLiokc3JjZmlsZSwgbGluZS4qIiBcCisgICAgImJyZWFrcG9pbnQgZnVuY3Rpb24gaW4gZmlsZSIKKworIworIyB0ZXN0IGJyZWFrIGF0IGxpbmUgbnVtYmVyCisjCitnZGJfdGVzdCAiYnJlYWsgNjQiIFwKKyAgICAiQnJlYWtwb2ludC4qYXQuKiBmaWxlIC4qJHNyY2ZpbGUsIGxpbmUgNjRcXC4iIFwKKyAgICAiYnJlYWtwb2ludCBsaW5lIG51bWJlciIKKworIworIyB0ZXN0IGR1cGxpY2F0ZSBicmVha3BvaW50CisjCitnZGJfdGVzdCAiYnJlYWsgNjQiIFwKKyAgICAiTm90ZTogYnJlYWtwb2ludCBcWzAtOVxdKyBhbHNvIHNldCBhdCBwYy4qQnJlYWtwb2ludCBcWzAtOVxdKyBhdC4qIGZpbGUgLiokc3JjZmlsZSwgbGluZSA2NFxcLiIgXAorICAgICJicmVha3BvaW50IGR1cGxpY2F0ZSIKKworIworIyB0ZXN0IGJyZWFrIGF0IGxpbmUgbnVtYmVyIGluIGZpbGUKKyMKK2dkYl90ZXN0ICJicmVhayAkc3JjZmlsZTo3MCIgXAorICAgICJCcmVha3BvaW50LiphdC4qIGZpbGUgLiokc3JjZmlsZSwgbGluZSA3MFxcLiIgXAorICAgICJicmVha3BvaW50IGxpbmUgbnVtYmVyIGluIGZpbGUiCisKKworIworIyBjaGVjayB0byBzZWUgd2hhdCBicmVha3BvaW50cyBhcmUgc2V0CisjCitpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYl9zdHViXSB7CisgICAgc2V0IG1haW5fbGluZSA1NworfSBlbHNlIHsKKyAgICBzZXQgbWFpbl9saW5lIDYwCit9CisKK2dkYl90ZXN0ICJpbmZvIGJyZWFrIiBcCisgICAgIk51bSBUeXBlXFsgXF0rRGlzcCBFbmIgQWRkcmVzc1xbIFxdK1doYXQuKgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeS4qIGluIG1haW4gYXQgLiokc3JjZmlsZTokbWFpbl9saW5lLioKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHkuKiBpbiBmYWN0b3JpYWwgYXQgLiokc3JjZmlsZTo3Ni4qCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5LiogaW4gbWFpbiBhdCAuKiRzcmNmaWxlOjY0LioKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHkuKiBpbiBtYWluIGF0IC4qJHNyY2ZpbGU6NjQuKgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeS4qIGluIG1haW4gYXQgLiokc3JjZmlsZTo3MCIgXAorICAgICJicmVha3BvaW50IGluZm8iCisKKworIyBGSVhNRTogVGhlIHJlc3Qgb2YgdGhpcyB0ZXN0IGRvZXNuJ3Qgd29yayB3aXRoIGFueXRoaW5nIHRoYXQgY2FuJ3QKKyMgaGFuZGxlIGFyZ3VtZW50cy4KKyMgSHVoPyBUaGVyZSBkb2Vzbid0ICphcHBlYXIqIHRvIGJlIGFueXRoaW5nIHRoYXQgcGFzc2VzIGFyZ3VtZW50cworIyBiZWxvdy4KK2lmIFtpc3RhcmdldCAibWlwcy1pZHQtKiJdIHRoZW4geworICAgIHJldHVybgorfQorCisjCisjIHJ1biB1bnRpbCB0aGUgYnJlYWtwb2ludCBhdCBtYWluIGlzIGhpdC4gRm9yIG5vbi1zdHVicy11c2luZyB0YXJnZXRzLgorIworaWYgIVt0YXJnZXRfaW5mbyBleGlzdHMgdXNlX2dkYl9zdHViXSB7CisgIGlmIFtpc3RhcmdldCAiKi0qLXZ4d29ya3MqIl0gdGhlbiB7CisgICAgc2VuZF9nZGIgInJ1biB2eG1haW4gXCIyXCJcbiIKKyAgICBzZXQgdGltZW91dCAxMjAKKyAgICB2ZXJib3NlICJUaW1lb3V0IGlzIG5vdyAkdGltZW91dCBzZWNvbmRzIiAyCisgIH0gZWxzZSB7CisJc2VuZF9nZGIgInJ1blxuIgorICB9CisgIGdkYl9leHBlY3QgeworICAgIC1yZSAiVGhlIHByb2dyYW0gLiogaGFzIGJlZW4gc3RhcnRlZCBhbHJlYWR5Lip5IG9yIG4uICQiIHsKKwlzZW5kX2dkYiAieVxuIgorCWV4cF9jb250aW51ZQorICAgIH0KKyAgICAtcmUgIlN0YXJ0aW5nIHByb2dyYW0uKkJyZWFrcG9pbnQgXFswLTlcXSssLiptYWluIC4qYXJnYy4qYXJndi4qIGF0IC4qJHNyY2ZpbGU6NjAuKjYwXFtcdCBcXStpZiAuYXJnYy4qIFx7LiokZ2RiX3Byb21wdCAkIlwKKwkgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAicnVuIHVudGlsIGZ1bmN0aW9uIGJyZWFrcG9pbnQiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJydW4gdW50aWwgZnVuY3Rpb24gYnJlYWtwb2ludCIgfQorICAgIHRpbWVvdXQJICAgICAgICAgICAgeyBmYWlsICJydW4gdW50aWwgZnVuY3Rpb24gYnJlYWtwb2ludCAodGltZW91dCkiIH0KKyAgfQorfSBlbHNlIHsKKyAgICBpZiAhW3RhcmdldF9pbmZvIGV4aXN0cyBnZGJfc3R1Yl0geworCWdkYl90ZXN0IGNvbnRpbnVlICJDb250aW51aW5nXFwuLipCcmVha3BvaW50IFxbMC05XF0rLCBtYWluIFxcKGFyZ2M9LiosIGFyZ3Y9LiosIGVudnA9LipcXCkgYXQgLiokc3JjZmlsZTo2MC4qNjBcW1x0IFxdK2lmIC5hcmdjLipceyIgInN0dWIgY29udGludWUiCisgICAgfQorfQorCisjCisjIHJ1biB1bnRpbCB0aGUgYnJlYWtwb2ludCBhdCBhIGxpbmUgbnVtYmVyCisjCitnZGJfdGVzdCBjb250aW51ZSAiQ29udGludWluZ1xcLi4qQnJlYWtwb2ludCBcWzAtOVxdKywgbWFpbiBcXChhcmdjPS4qLCBhcmd2PS4qLCBlbnZwPS4qXFwpIGF0IC4qJHNyY2ZpbGU6NjQuKjY0XFtcdCBcXStwcmludGYuKmZhY3RvcmlhbC4qIiBcCisJCQkicnVuIHVudGlsIGJyZWFrcG9pbnQgc2V0IGF0IGEgbGluZSBudW1iZXIiCisKKyMKKyMgUnVuIHVudGlsIHRoZSBicmVha3BvaW50IHNldCBpbiBhIGZ1bmN0aW9uIGluIGEgZmlsZQorIworZm9yIHtzZXQgaSA2fSB7JGkgPj0gMX0ge2luY3IgaSAtMX0geworCWdkYl90ZXN0IGNvbnRpbnVlICJDb250aW51aW5nXFwuLipCcmVha3BvaW50IFxbMC05XF0rLCBmYWN0b3JpYWwgXFwodmFsdWU9JGlcXCkgYXQgLiokc3JjZmlsZTo3Ni4qNzZcW1x0IFxdK2lmIC52YWx1ZSA+IDEuIFx7IiBcCisJCQkicnVuIHVudGlsIGZpbGU6ZnVuY3Rpb24oJGkpIGJyZWFrcG9pbnQiCit9CisKKyMKKyMgcnVuIHVudGlsIHRoZSBmaWxlOmZ1bmN0aW9uIGJyZWFrcG9pbnQgYXQgYSBsaW5lIG51bWJlciBpbiBhIGZpbGUKKyMKK2dkYl90ZXN0IGNvbnRpbnVlICJDb250aW51aW5nXFwuLipCcmVha3BvaW50IFxbMC05XF0rLCBtYWluIFxcKGFyZ2M9LiosIGFyZ3Y9LiosIGVudnA9LipcXCkgYXQgLiokc3JjZmlsZTo3MC4qNzBcW1x0IFxdK3JldHVybiAwOyIgXAorCQkicnVuIHVudGlsIGZpbGU6bGluZW51bSBicmVha3BvaW50IgorCisjCisjIGRlbGV0ZSBhbGwgYnJlYWtwb2ludHMgc28gd2UgY2FuIHN0YXJ0IG92ZXIsIGNvdXJzZSB0aGlzIGNhbiBiZSBhIHRlc3QgdG9vCisjCitkZWxldGVfYnJlYWtwb2ludHMKKworIworIyB0ZXN0IHRlbXBvcmFyeSBicmVha3BvaW50IGF0IGZ1bmN0aW9uCisjCisKK2dkYl90ZXN0ICJ0YnJlYWsgbWFpbiIgIkJyZWFrcG9pbnQuKmF0LiogZmlsZSAuKiRzcmNmaWxlLCBsaW5lLioiICJUZW1wb3JhcnkgYnJlYWtwb2ludCBmdW5jdGlvbiIKKworIworIyB0ZXN0IGJyZWFrIGF0IGZ1bmN0aW9uIGluIGZpbGUKKyMKKworZ2RiX3Rlc3QgInRicmVhayAkc3JjZmlsZTpmYWN0b3JpYWwiICJCcmVha3BvaW50LiphdC4qIGZpbGUgLiokc3JjZmlsZSwgbGluZS4qIiBcCisJIlRlbXBvcmFyeSBicmVha3BvaW50IGZ1bmN0aW9uIGluIGZpbGUiCisKKyMKKyMgdGVzdCBicmVhayBhdCBsaW5lIG51bWJlcgorIworc2VuZF9nZGIgInRicmVhayA2NFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJCcmVha3BvaW50LiphdC4qIGZpbGUgLiokc3JjZmlsZSwgbGluZSA2NC4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJUZW1wb3JhcnkgYnJlYWtwb2ludCBsaW5lIG51bWJlciAjMSIgfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgcGFzcyAiVGVtcG9yYXJ5IGJyZWFrcG9pbnQgbGluZSBudW1iZXIgIzEiIH0KKwl0aW1lb3V0CSAgICB7IGZhaWwgImJyZWFrcG9pbnQgbGluZSBudW1iZXIgIzEgKHRpbWVvdXQpIiB9Cit9CisKK2dkYl90ZXN0ICJ0YnJlYWsgNjAiICJCcmVha3BvaW50LiphdC4qIGZpbGUgLiokc3JjZmlsZSwgbGluZSA2MC4qIiAiVGVtcG9yYXJ5IGJyZWFrcG9pbnQgbGluZSBudW1iZXIgIzIiCisKKyMKKyMgdGVzdCBicmVhayBhdCBsaW5lIG51bWJlciBpbiBmaWxlCisjCitzZW5kX2dkYiAidGJyZWFrICRzcmNmaWxlOjcwXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIkJyZWFrcG9pbnQuKmF0LiogZmlsZSAuKiRzcmNmaWxlLCBsaW5lIDcwLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgIlRlbXBvcmFyeSBicmVha3BvaW50IGxpbmUgbnVtYmVyIGluIGZpbGUgIzEiIH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7IHBhc3MgIlRlbXBvcmFyeSBicmVha3BvaW50IGxpbmUgbnVtYmVyIGluIGZpbGUgIzEiIH0KKwl0aW1lb3V0CSAgICB7IGZhaWwgIlRlbXBvcmFyeSBicmVha3BvaW50IGxpbmUgbnVtYmVyIGluIGZpbGUgIzEgKHRpbWVvdXQpIiB9Cit9CisKK2dkYl90ZXN0ICAidGJyZWFrICRzcmNmaWxlOjY2IiAiQnJlYWtwb2ludC4qYXQuKiBmaWxlIC4qJHNyY2ZpbGUsIGxpbmUgNjYuKiIgIlRlbXBvcmFyeSBicmVha3BvaW50IGxpbmUgbnVtYmVyIGluIGZpbGUgIzIiCisKKyMKKyMgY2hlY2sgdG8gc2VlIHdoYXQgYnJlYWtwb2ludHMgYXJlIHNldCAodGVtcG9yYXJ5IHRoaXMgdGltZSkKKyMKK2dkYl90ZXN0ICJpbmZvIGJyZWFrIiAiTnVtIFR5cGUuKkRpc3AgRW5iIEFkZHJlc3MuKldoYXQuKlxbXHJcblxdXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGRlbC4qeS4qaW4gbWFpbiBhdCAuKiRzcmNmaWxlOiRtYWluX2xpbmUuKlxbXHJcblxdXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGRlbC4qeS4qaW4gZmFjdG9yaWFsIGF0IC4qJHNyY2ZpbGU6NzYuKlxbXHJcblxdXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGRlbC4qeS4qaW4gbWFpbiBhdCAuKiRzcmNmaWxlOjY0LipcW1xyXG5cXVxbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBkZWwuKnkuKmluIG1haW4gYXQgLiokc3JjZmlsZTo3MC4qIiAiVGVtcG9yYXJ5IGJyZWFrcG9pbnQgaW5mbyIKKworCisjKioqKioqKioqKioKKworIyBWZXJpZnkgdGhhdCBjYXRjaHBvaW50cyBmb3IgZm9yaywgdmZvcmsgYW5kIGV4ZWMgZG9uJ3QgdHJpZ2dlcgorIyBpbmFwcHJvcHJpYXRlbHkuICAoVGhlcmUgYXJlIG5vIGNhbGxzIHRvIHRob3NlIHN5c3RlbSBmdW5jdGlvbnMKKyMgaW4gdGhpcyB0ZXN0IHByb2dyYW0uKQorIworaWYgIVtydW50b19tYWluXSB0aGVuIHsgZmFpbCAiYnJlYWsgdGVzdHMgc3VwcHJlc3NlZCIgfQorCitzZW5kX2dkYiAiY2F0Y2hcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIkNhdGNoIHJlcXVpcmVzIGFuIGV2ZW50IG5hbWUuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJjYXRjaCByZXF1aXJlcyBhbiBldmVudCBuYW1lIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiY2F0Y2ggcmVxdWlyZXMgYW4gZXZlbnQgbmFtZSJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBjYXRjaCByZXF1aXJlcyBhbiBldmVudCBuYW1lIn0KK30KKworCitzZXQgbmFtZSAic2V0IGNhdGNoIGZvcmssIG5ldmVyIGV4cGVjdGVkIHRvIHRyaWdnZXIiCitzZW5kX2dkYiAiY2F0Y2ggZm9ya1xuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiQ2F0Y2hwb2ludCBcWzAtOVxdKiAuZm9yay4uKiRnZGJfcHJvbXB0ICQiCisgICAgICAgICAge3Bhc3MgJG5hbWV9CisgIC1yZSAiQ2F0Y2ggb2YgZm9yayBub3QgeWV0IGltcGxlbWVudGVkLiokZ2RiX3Byb21wdCAkIgorCSAge3Bhc3MgJG5hbWV9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCIKKyAgICAgICAgICB7ZmFpbCAkbmFtZX0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpICRuYW1lIn0KK30KKworCitzZXQgbmFtZSAic2V0IGNhdGNoIHZmb3JrLCBuZXZlciBleHBlY3RlZCB0byB0cmlnZ2VyIgorc2VuZF9nZGIgImNhdGNoIHZmb3JrXG4iCisKKyMgSWYgd2UgYXJlIG9uIEhQLVVYIDEwLjIwLCB3ZSBleHBlY3QgYW4gZXJyb3IgbWVzc2FnZSB0byBiZQorIyBwcmludGVkIGlmIHdlIHR5cGUgImNhdGNoIHZmb3JrIiBhdCB0aGUgZ2RiIGdkYl9wcm9tcHQuICBUaGlzIGlzCisjIGJlY2F1c2Ugb24gSFAtVVggMTAuMjAsIHdlIGNhbm5vdCBjYXRjaCB2Zm9yayBldmVudHMuCisKK2lmIFtpc3RhcmdldCAiaHBwYSotaHAtaHB1eDEwLjIwIl0gdGhlbiB7CisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJDYXRjaCBvZiB2Zm9yayBldmVudHMgbm90IHN1cHBvcnRlZCBvbiBIUC1VWCAxMC4yMC4uKiRnZGJfcHJvbXB0ICQiCisJCXtwYXNzICRuYW1lfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIKKwkJe2ZhaWwgJG5hbWV9CisJdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpICRuYW1lIn0KKyAgICB9Cit9IGVsc2UgeworICAgIGdkYl9leHBlY3QgeworCS1yZSAiQ2F0Y2hwb2ludCBcWzAtOVxdKiAudmZvcmsuLiokZ2RiX3Byb21wdCAkIgorCQl7cGFzcyAkbmFtZX0KKwktcmUgIkNhdGNoIG9mIHZmb3JrIG5vdCB5ZXQgaW1wbGVtZW50ZWQuKiRnZGJfcHJvbXB0ICQiCisJCXtwYXNzICRuYW1lfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIKKwkJe2ZhaWwgJG5hbWV9CisJdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpICRuYW1lIn0KKyAgICB9Cit9CisKK3NldCBuYW1lICJzZXQgY2F0Y2ggZXhlYywgbmV2ZXIgZXhwZWN0ZWQgdG8gdHJpZ2dlciIKK3NlbmRfZ2RiICJjYXRjaCBleGVjXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJDYXRjaHBvaW50IFxbMC05XF0qIC5leGVjLi4qJGdkYl9wcm9tcHQgJCIKKyAgICAgICAgICB7cGFzcyAkbmFtZX0KKyAgLXJlICJDYXRjaCBvZiBleGVjIG5vdCB5ZXQgaW1wbGVtZW50ZWQuKiRnZGJfcHJvbXB0ICQiCisJICB7cGFzcyAkbmFtZX0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAkbmFtZX0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpICRuYW1lIn0KK30KKworIyBWZXJpZnkgdGhhdCAidW50aWwgPGxvY2F0aW9uPiIgd29ya3MuICAoVGhpcyBpcyByZWFsbHkganVzdCBzeW50YWN0aWMKKyMgc3VnYXIgZm9yICJ0YnJlYWsgPGxvY2F0aW9uPjsgY29udGludWUiLikKKyMKK3NlbmRfZ2RiICJ1bnRpbCA2NFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAibWFpbiAuKiBhdCAuKjo2NC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInVudGlsIDY0In0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAidW50aWwgNjQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgdW50aWwgNjQifQorfQorCisjIFZlcmlmeSB0aGF0IGEgbWFsZm9ybWVkICJ1bnRpbCIgaXMgZ3JhY2VmdWxseSBjYXVnaHQuCisjCitzZW5kX2dkYiAidW50aWwgNjUgdGhlbiBzdG9wXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJKdW5rIGF0IGVuZCBvZiBhcmd1bWVudHMuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAibWFsZm9ybWVkIHVudGlsIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAibWFsZm9ybWVkIHVudGlsIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIG1hbGZvcm1lZCB1bnRpbCJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgR0RCIHJlc3BvbmRzIGdyYWNlZnVsbHkgd2hlbiBhc2tlZCB0byBzZXQgYSBicmVha3BvaW50CisjIG9uIGEgbm9uZXhpc3RlbnQgc291cmNlIGxpbmUuCisjCitzZW5kX2dkYiAiYnJlYWsgOTk5XG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJObyBsaW5lIDk5OSBpbiBmaWxlIC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImJyZWFrIG9uIG5vbi1leGlzdGVudCBzb3VyY2UgbGluZSJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImJyZWFrIG9uIG5vbi1leGlzdGVudCBzb3VyY2UgbGluZSJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBicmVhayBvbiBub24tZXhpc3RlbnQgc291cmNlIGxpbmUifQorfQorCisjIFZlcmlmeSB0aGF0IEdEQiBhbGxvd3Mgb25lIHRvIGp1c3Qgc2F5ICJicmVhayIsIHdoaWNoIGlzIHRyZWF0ZWQKKyMgYXMgdGhlICJkZWZhdWx0IiBicmVha3BvaW50LiAgTm90ZSB0aGF0IEdEQiBnZXRzIGN1dGUgd2hlbiBwcmludGluZworIyB0aGUgaW5mb3JtYXRpb25hbCBtZXNzYWdlIGFib3V0IG90aGVyIGJyZWFrcG9pbnRzIGF0IHRoZSBzYW1lCisjIGxvY2F0aW9uLiAgV2UnbGwgaGl0IHRoYXQgYmlyZCB3aXRoIHRoaXMgc3RvbmUgdG9vLgorIworc2VuZF9nZGIgImJyZWFrXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJCcmVha3BvaW50IFxbMC05XF0qLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiYnJlYWsgb24gZGVmYXVsdCBsb2NhdGlvbiwgMXN0IHRpbWUifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJicmVhayBvbiBkZWZhdWx0IGxvY2F0aW9uLCAxc3QgdGltZSJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBicmVhayBvbiBkZWZhdWx0IGxvY2F0aW9uLCAxc3QgdGltZSJ9Cit9CisKK3NlbmRfZ2RiICJicmVha1xuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiTm90ZTogYnJlYWtwb2ludCBcWzAtOVxdKiBhbHNvIHNldCBhdCAuKkJyZWFrcG9pbnQgXFswLTlcXSouKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJicmVhayBvbiBkZWZhdWx0IGxvY2F0aW9uLCAybmQgdGltZSJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImJyZWFrIG9uIGRlZmF1bHQgbG9jYXRpb24sIDJuZCB0aW1lIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGJyZWFrIG9uIGRlZmF1bHQgbG9jYXRpb24sIDJuZCB0aW1lIn0KK30KKworc2VuZF9nZGIgImJyZWFrXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJOb3RlOiBicmVha3BvaW50cyBcWzAtOVxdKiBhbmQgXFswLTlcXSogYWxzbyBzZXQgYXQgLipCcmVha3BvaW50IFxbMC05XF0qLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiYnJlYWsgb24gZGVmYXVsdCBsb2NhdGlvbiwgM3JkIHRpbWUifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJicmVhayBvbiBkZWZhdWx0IGxvY2F0aW9uLCAzcmQgdGltZSJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBicmVhayBvbiBkZWZhdWx0IGxvY2F0aW9uLCAzcmQgdGltZSJ9Cit9CisKK3NlbmRfZ2RiICJicmVha1xuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiTm90ZTogYnJlYWtwb2ludHMgXFswLTlcXSosIFxbMC05XF0qIGFuZCBcWzAtOVxdKiBhbHNvIHNldCBhdCAuKkJyZWFrcG9pbnQgXFswLTlcXSouKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJicmVhayBvbiBkZWZhdWx0IGxvY2F0aW9uLCA0dGggdGltZSJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImJyZWFrIG9uIGRlZmF1bHQgbG9jYXRpb24sIDR0aCB0aW1lIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGJyZWFrIG9uIGRlZmF1bHQgbG9jYXRpb24sIDR0aCB0aW1lIn0KK30KKworIyBWZXJpZnkgdGhhdCBhICJzaWxlbnQiIGJyZWFrcG9pbnQgY2FuIGJlIHNldCwgYW5kIHRoYXQgR0RCIGlzIGluZGVlZAorIyAic2lsZW50IiBhYm91dCBpdHMgdHJpZ2dlcmluZy4KKyMKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7IGZhaWwgImJyZWFrIHRlc3RzIHN1cHByZXNzZWQiIH0KKworc2VuZF9nZGIgImJyZWFrIDY0XG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJCcmVha3BvaW50IChcWzAtOVxdKikgYXQgLiosIGxpbmUgNjQuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzZXQgdG8tYmUtc2lsZW50IGJyZWFrIDY0In0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAic2V0IHRvLWJlLXNpbGVudCBicmVhayA2NCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZXQgdG8tYmUtc2lsZW50IGJyZWFrIDY0In0KK30KKworc2VuZF9nZGIgImNvbW1hbmRzICRleHBlY3Rfb3V0KDEsc3RyaW5nKVxuIgorc2VuZF9nZGIgInNpbGVudFxuIgorc2VuZF9nZGIgImVuZFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAic2V0IHNpbGVudCBicmVhayA2NCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZXQgc2lsZW50IGJyZWFrIDY0In0KK30KKworc2VuZF9nZGIgImluZm8gYnJlYWsgJGV4cGVjdF9vdXQoMSxzdHJpbmcpXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJcWzAtOVxdKlxbIFx0XF0qYnJlYWtwb2ludC4qOjY0XHJcblxbIFx0XF0qc2lsZW50LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiaW5mbyBzaWxlbnQgYnJlYWsgNjQifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJpbmZvIHNpbGVudCBicmVhayA2NCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBpbmZvIHNpbGVudCBicmVhayA2NCJ9Cit9CitzZW5kX2dkYiAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIkNvbnRpbnVpbmcuXHJcbiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJoaXQgc2lsZW50IGJyZWFrIDY0In0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiaGl0IHNpbGVudCBicmVhayA2NCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBoaXQgc2lsZW50IGJyZWFrIDY0In0KK30KK3NlbmRfZ2RiICJidFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiIzAgIG1haW4gLiogYXQgLio6NjQuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzdG9wcGVkIGZvciBzaWxlbnQgYnJlYWsgNjQifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJzdG9wcGVkIGZvciBzaWxlbnQgYnJlYWsgNjQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc3RvcHBlZCBmb3Igc2lsZW50IGJyZWFrIDY0In0KK30KKworIyBWZXJpZnkgdGhhdCBHREIgY2FuIGF0IGxlYXN0IHBhcnNlIGEgYnJlYWtwb2ludCB3aXRoIHRoZQorIyAidGhyZWFkIiBrZXl3b3JkLiAgKFdlIHdvbid0IGF0dGVtcHQgdG8gdGVzdCBoZXJlIHRoYXQgYQorIyB0aHJlYWQtc3BlY2lmaWMgYnJlYWtwb2ludCByZWFsbHkgdHJpZ2dlcnMgYXBwcm9wcmlhdGVseS4KKyMgVGhlIGdkYi50aHJlYWRzIHN1YmRpcmVjdG9yeSBjb250YWlucyB0ZXN0cyBmb3IgdGhhdC4pCisjCitzZW5kX2dkYiAiYnJlYWsgNjUgdGhyZWFkIDk5OVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiVW5rbm93biB0aHJlYWQgOTk5LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAidGhyZWFkLXNwZWNpZmljIGJyZWFrcG9pbnQgb24gbm9uLWV4aXN0ZW50IHRocmVhZCBkaXNhbGxvd2VkIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAidGhyZWFkLXNwZWNpZmljIGJyZWFrcG9pbnQgb24gbm9uLWV4aXN0ZW50IHRocmVhZCBkaXNhbGxvd2VkIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHRocmVhZC1zcGVjaWZpYyBicmVha3BvaW50IG9uIG5vbi1leGlzdGVudCB0aHJlYWQgZGlzYWxsb3dlZCJ9Cit9CitzZW5kX2dkYiAiYnJlYWsgNjUgdGhyZWFkIGZvb1xuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiSnVuayBhZnRlciB0aHJlYWQga2V5d29yZC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJ0aHJlYWQtc3BlY2lmaWMgYnJlYWtwb2ludCBvbiBib2d1cyB0aHJlYWQgSUQgZGlzYWxsb3dlZCJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgInRocmVhZC1zcGVjaWZpYyBicmVha3BvaW50IG9uIGJvZ3VzIHRocmVhZCBJRCBkaXNhbGxvd2VkIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHRocmVhZC1zcGVjaWZpYyBicmVha3BvaW50IG9uIGJvZ3VzIHRocmVhZCBJRCBkaXNhbGxvd2VkIn0KK30KKworIyBWZXJpZnkgdGhhdCBHREIgcmVzcG9uZHMgZ3JhY2VmdWxseSB0byBhIGJyZWFrcG9pbnQgY29tbWFuZCB3aXRoCisjIHRyYWlsaW5nIGdhcmJhZ2UuCisjCitzZW5kX2dkYiAiYnJlYWsgNjUgZm9vXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJKdW5rIGF0IGVuZCBvZiBhcmd1bWVudHMuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiYnJlYWtwb2ludCB3aXRoIHRyYWlsaW5nIGdhcmJhZ2UgZGlzYWxsb3dlZCJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImJyZWFrcG9pbnQgd2l0aCB0cmFpbGluZyBnYXJiYWdlIGRpc2FsbG93ZWQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgYnJlYWtwb2ludCB3aXRoIHRyYWlsaW5nIGdhcmJhZ2UgZGlzYWxsb3dlZCJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgR0RCIHJlc3BvbmRzIGdyYWNlZnVsbHkgdG8gYSAiY2xlYXIiIGNvbW1hbmQgdGhhdCBoYXMKKyMgbm8gbWF0Y2hpbmcgYnJlYWtwb2ludC4gIChGaXJzdCwgZ2V0IHVzIG9mZiB0aGUgY3VycmVudCBzb3VyY2UgbGluZSwKKyMgd2hpY2ggd2Uga25vdyBoYXMgYSBicmVha3BvaW50LikKKyMKK3NlbmRfZ2RiICJuZXh0XG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICIuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzdGVwIG92ZXIgYnJlYWtwb2ludCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzdGVwIG92ZXIgYnJlYWtwb2ludCJ9Cit9CitzZW5kX2dkYiAiY2xlYXIgNjZcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIk5vIGJyZWFrcG9pbnQgYXQgNjYuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiY2xlYXIgbGluZSBoYXMgbm8gYnJlYWtwb2ludCBkaXNhbGxvd2VkIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiY2xlYXIgbGluZSBoYXMgbm8gYnJlYWtwb2ludCBkaXNhbGxvd2VkIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGNsZWFyIGxpbmUgaGFzIG5vIGJyZWFrcG9pbnQgZGlzYWxsb3dlZCJ9Cit9CitzZW5kX2dkYiAiY2xlYXJcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIk5vIGJyZWFrcG9pbnQgYXQgdGhpcyBsaW5lLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImNsZWFyIGN1cnJlbnQgbGluZSBoYXMgbm8gYnJlYWtwb2ludCBkaXNhbGxvd2VkIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiY2xlYXIgY3VycmVudCBsaW5lIGhhcyBubyBicmVha3BvaW50IGRpc2FsbG93ZWQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgY2xlYXIgY3VycmVudCBsaW5lIGhhcyBubyBicmVha3BvaW50IGRpc2FsbG93ZWQifQorfQorCisjIFZlcmlmeSB0aGF0IGEgYnJlYWtwb2ludCBjYW4gYmUgc2V0IHZpYSBhIGNvbnZlbmllbmNlIHZhcmlhYmxlLgorIworc2VuZF9nZGIgInNldCBcJGZvbz02NlxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInNldCBjb252ZW5pZW5jZSB2YXJpYWJsZSBcJGZvbyB0byA2NiJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZXQgY29udmVuaWVuY2UgdmFyaWFibGUgXCRmb28gdG8gNjYifQorfQorc2VuZF9nZGIgImJyZWFrIFwkZm9vXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJCcmVha3BvaW50IChcWzAtOVxdKikgYXQgLiosIGxpbmUgNjYuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzZXQgYnJlYWtwb2ludCB2aWEgY29udmVuaWVuY2UgdmFyaWFibGUifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJzZXQgYnJlYWtwb2ludCB2aWEgY29udmVuaWVuY2UgdmFyaWFibGUifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc2V0IGJyZWFrcG9pbnQgdmlhIGNvbnZlbmllbmNlIHZhcmlhYmxlIn0KK30KKworIyBWZXJpZnkgdGhhdCBHREIgcmVzcG9uZHMgZ3JhY2VmdWxseSB0byBhbiBhdHRlbXB0IHRvIHNldCBhCisjIGJyZWFrcG9pbnQgdmlhIGEgY29udmVuaWVuY2UgdmFyaWFibGUgd2hvc2UgdHlwZSBpcyBub3QgaW50ZWdlci4KKyMKK3NlbmRfZ2RiICJzZXQgXCRmb289NjYuNVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInNldCBjb252ZW5pZW5jZSB2YXJpYWJsZSBcJGZvbyB0byA2Ni41In0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHNldCBjb252ZW5pZW5jZSB2YXJpYWJsZSBcJGZvbyB0byA2Ni41In0KK30KK3NlbmRfZ2RiICJicmVhayBcJGZvb1xuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiQ29udmVuaWVuY2UgdmFyaWFibGVzIHVzZWQgaW4gbGluZSBzcGVjcyBtdXN0IGhhdmUgaW50ZWdlciB2YWx1ZXMuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAic2V0IGJyZWFrcG9pbnQgdmlhIG5vbi1pbnRlZ2VyIGNvbnZlbmllbmNlIHZhcmlhYmxlIGRpc2FsbG93ZWQifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJzZXQgYnJlYWtwb2ludCB2aWEgbm9uLWludGVnZXIgY29udmVuaWVuY2UgdmFyaWFibGUgZGlzYWxsb3dlZCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZXQgYnJlYWtwb2ludCB2aWEgbm9uLWludGVnZXIgY29udmVuaWVuY2UgdmFyaWFibGUgZGlzYWxsb3dlZCJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgd2UgY2FuIHNldCBhbmQgdHJpZ2dlciBhIGJyZWFrcG9pbnQgaW4gYSB1c2VyLWNhbGxlZCBmdW5jdGlvbi4KKyMKK3NlbmRfZ2RiICJicmVhayBtYXJrZXIyXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJCcmVha3BvaW50IChcWzAtOVxdKikgYXQgLiosIGxpbmUgNDIuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzZXQgYnJlYWtwb2ludCBvbiB0by1iZS1jYWxsZWQgZnVuY3Rpb24ifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJzZXQgYnJlYWtwb2ludCBvbiB0by1iZS1jYWxsZWQgZnVuY3Rpb24ifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc2V0IGJyZWFrcG9pbnQgb24gdG8tYmUtY2FsbGVkIGZ1bmN0aW9uIn0KK30KK3NlbmRfZ2RiICJwcmludCBtYXJrZXIyKDk5KVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiVGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgc3RvcHBlZCB3aGlsZSBpbiBhIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIEdEQi5cclxuV2hlbiB0aGUgZnVuY3Rpb24gLm1hcmtlcjIuIGlzIGRvbmUgZXhlY3V0aW5nLCBHREIgd2lsbCBzaWxlbnRseVxyXG5zdG9wIC5pbnN0ZWFkIG9mIGNvbnRpbnVpbmcgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gY29udGFpbmluZ1xyXG50aGUgZnVuY3Rpb24gY2FsbC4uLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiaGl0IGJyZWFrcG9pbnQgb24gY2FsbGVkIGZ1bmN0aW9uIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiaGl0IGJyZWFrcG9pbnQgb24gY2FsbGVkIGZ1bmN0aW9uIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGhpdCBicmVha3BvaW50IG9uIGNhbGxlZCBmdW5jdGlvbiJ9Cit9CisKKyMgQXMgbG9uZyBhcyB3ZSdyZSBzdG9wcGVkIChicmVha3BvaW50ZWQpIGluIGEgY2FsbGVkIGZ1bmN0aW9uLAorIyB2ZXJpZnkgdGhhdCB3ZSBjYW4gc3VjY2Vzc2Z1bGx5IGJhY2t0cmFjZSAmIHN1Y2ggZnJvbSBoZXJlLgorIworaWYgW2lzdGFyZ2V0ICJocHBhKi0qLWhwdXgqIl0gdGhlbiB7CisgIHNlbmRfZ2RiICJidFxuIgorICBnZGJfZXhwZWN0IHsKKyAgICAtcmUgIiMwXFsgXHRcXSptYXJrZXIyLio6NDJcclxuIzEuKl9zcjRleHBvcnQuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAge3Bhc3MgImJhY2t0cmFjZSB3aGlsZSBpbiBjYWxsZWQgZnVuY3Rpb24ifQorICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICB7ZmFpbCAiYmFja3RyYWNlIHdoaWxlIGluIGNhbGxlZCBmdW5jdGlvbiJ9CisgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGJhY2t0cmFjZSB3aGlsZSBpbiBjYWxsZWQgZnVuY3Rpb24ifQorICB9CisgIHNlbmRfZ2RiICJmaW5pc2hcbiIKKyAgZ2RiX2V4cGVjdCB7CisgICAgLXJlICJSdW4gdGlsbCBleGl0IGZyb20gLiptYXJrZXIyLiogYXQgLio0MlxyXG4uKiBpbiBfc3I0ZXhwb3J0LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgIHtwYXNzICJmaW5pc2ggZnJvbSBjYWxsZWQgZnVuY3Rpb24ifQorICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICB7ZmFpbCAiZmluaXNoIGZyb20gY2FsbGVkIGZ1bmN0aW9uIn0KKyAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgZmluaXNoIGZyb20gY2FsbGVkIGZ1bmN0aW9uIn0KKyAgfQorfQorCisjIFZlcmlmeSB0aGF0IEdEQiByZXNwb25kcyBncmFjZWZ1bGx5IHRvIGEgImZpbmlzaCIgY29tbWFuZCB3aXRoCisjIGFyZ3VtZW50cy4KKyMKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7IGZhaWwgImJyZWFrIHRlc3RzIHN1cHByZXNzZWQiIH0KKworc2VuZF9nZGIgImZpbmlzaCAxMjNcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIlRoZSBcImZpbmlzaFwiIGNvbW1hbmQgZG9lcyBub3QgdGFrZSBhbnkgYXJndW1lbnRzLlxyXG4kZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiZmluaXNoIHdpdGggYXJndW1lbnRzIGRpc2FsbG93ZWQifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJmaW5pc2ggd2l0aCBhcmd1bWVudHMgZGlzYWxsb3dlZCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBmaW5pc2ggd2l0aCBhcmd1bWVudHMgZGlzYWxsb3dlZCJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgR0RCIHJlc3BvbmRzIGdyYWNlZnVsbHkgdG8gYSByZXF1ZXN0IHRvICJmaW5pc2giIGZyb20KKyMgdGhlIG91dGVybW9zdCBmcmFtZS4KKyMKK3NlbmRfZ2RiICJmaW5pc2hcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIlwiZmluaXNoXCIgbm90IG1lYW5pbmdmdWwgaW4gdGhlIG91dGVybW9zdCBmcmFtZS5cclxuJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImZpbmlzaCBmcm9tIG91dGVybW9zdCBmcmFtZSBkaXNhbGxvd2VkIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiZmluaXNoIGZyb20gb3V0ZXJtb3N0IGZyYW1lIGRpc2FsbG93ZWQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgZmluaXNoIGZyb20gb3V0ZXJtb3N0IGZyYW1lIGRpc2FsbG93ZWQifQorfQorCisjIFZlcmlmeSB0aGF0IHdlIGNhbiBleHBsaWNpdGx5IGFzayBHREIgdG8gc3RvcCBvbiBhbGwgc2hhcmVkIGxpYnJhcnkKKyMgZXZlbnRzLCBhbmQgdGhhdCBpdCBkb2VzIHNvLgorIworaWYgW2lzdGFyZ2V0ICJocHBhKi0qLWhwdXgqIl0gdGhlbiB7CisgIGlmICFbcnVudG9fbWFpbl0gdGhlbiB7IGZhaWwgImJyZWFrIHRlc3RzIHN1cHByZXNzZWQiIH0KKworICBzZW5kX2dkYiAic2V0IHN0b3Atb24tc29saWItZXZlbnRzIDFcbiIKKyAgZ2RiX2V4cGVjdCB7CisgICAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgIHtwYXNzICJzZXQgc3RvcC1vbi1zb2xpYi1ldmVudHMifQorICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZXQgc3RvcC1vbi1zb2xpYi1ldmVudHMifQorICB9CisKKyAgc2VuZF9nZGIgInJ1blxuIgorICBnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qU3RhcnQgaXQgZnJvbSB0aGUgYmVnaW5uaW5nLip5IG9yIG4uICQiXAorICAgICAgICAgICAge3NlbmRfZ2RiICJ5XG4iCisgICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAtcmUgIi4qU3RvcHBlZCBkdWUgdG8gc2hhcmVkIGxpYnJhcnkgZXZlbnQuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAidHJpZ2dlcmVkIHN0b3Atb24tc29saWItZXZlbnRzIn0KKyAgICAgICAgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgIHtmYWlsICJ0cmlnZ2VyZWQgc3RvcC1vbi1zb2xpYi1ldmVudHMifQorICAgICAgICAgICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHRyaWdnZXJlZCBzdG9wLW9uLXNvbGliLWV2ZW50cyJ9CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICB7ZmFpbCAicmVydW4gZm9yIHN0b3Atb24tc29saWItZXZlbnRzIn0KKyAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgcmVydW4gZm9yIHN0b3Atb24tc29saWItZXZlbnRzIn0KKyAgfQorCisgIHNlbmRfZ2RiICJzZXQgc3RvcC1vbi1zb2xpYi1ldmVudHMgMFxuIgorICBnZGJfZXhwZWN0IHsKKyAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAge3Bhc3MgInJlc2V0IHN0b3Atb24tc29saWItZXZlbnRzIn0KKyAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgcmVzZXQgc3RvcC1vbi1zb2xpYi1ldmVudHMifQorICB9Cit9CisKKyMgSGFyZHdhcmUgYnJlYWtwb2ludHMgYXJlIHVuc3VwcG9ydGVkIG9uIEhQLVVYLiAgVmVyaWZ5IHRoYXQgR0RCCisjIGdyYWNlZnVsbHkgcmVzcG9uZHMgdG8gcmVxdWVzdHMgdG8gY3JlYXRlIHRoZW0uCisjCitpZiBbaXN0YXJnZXQgImhwcGEqLSotaHB1eCoiXSB0aGVuIHsKKyAgaWYgIVtydW50b19tYWluXSB0aGVuIHsgZmFpbCAiYnJlYWsgdGVzdHMgc3VwcHJlc3NlZCIgfQorCisgIHNlbmRfZ2RiICJoYnJlYWtcbiIKKyAgZ2RiX2V4cGVjdCB7CisgICAgLXJlICJObyBoYXJkd2FyZSBicmVha3BvaW50IHN1cHBvcnQgaW4gdGhlIHRhcmdldC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICB7cGFzcyAiaHcgYnJlYWtzIGRpc2FsbG93ZWQifQorICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICB7ZmFpbCAiaHcgYnJlYWtzIGRpc2FsbG93ZWQifQorICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBodyBicmVha3MgZGlzYWxsb3dlZCJ9CisgIH0KKworICBzZW5kX2dkYiAidGhicmVha1xuIgorICBnZGJfZXhwZWN0IHsKKyAgICAtcmUgIk5vIGhhcmR3YXJlIGJyZWFrcG9pbnQgc3VwcG9ydCBpbiB0aGUgdGFyZ2V0LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgIHtwYXNzICJ0ZW1wb3JhcnkgaHcgYnJlYWtzIGRpc2FsbG93ZWQifQorICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICB7ZmFpbCAidGVtcG9yYXJ5IGh3IGJyZWFrcyBkaXNhbGxvd2VkIn0KKyAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgdGVtcG9yYXJ5IGh3IGJyZWFrcyBkaXNhbGxvd2VkIn0KKyAgfQorfQorCisjKioqKioqKioKKworCitwcm9jIHRlc3RfY2xlYXJfY29tbWFuZCB7fSB7CisgICAgZ2RiX3Rlc3QgImJyZWFrIG1haW4iICJCcmVha3BvaW50LiphdC4qIiAiYnJlYWsgbWFpbiAjMSIKKyAgICBnZGJfdGVzdCAiYnJlYWsgbWFpbiIgIkJyZWFrcG9pbnQuKmF0LioiICJicmVhayBtYWluICMyIgorCisgICAgIyBXZSBkb24ndCB0ZXN0IHRoYXQgaXQgZGVsZXRlcyB0aGUgY29ycmVjdCBicmVha3BvaW50cy4gIFdlIGRvIGF0CisgICAgIyBsZWFzdCB0ZXN0IHRoYXQgaXQgZGVsZXRlcyBtb3JlIHRoYW4gb25lIGJyZWFrcG9pbnQuCisgICAgZ2RiX3Rlc3QgImNsZWFyIG1haW4iIHtEZWxldGVkIGJyZWFrcG9pbnRzIFswLTldKyBbMC05XSsuKn0KK30KKworIworIyBUZXN0ICJuZXh0IiBvdmVyIHJlY3Vyc2l2ZSBmdW5jdGlvbiBjYWxsLgorIworCitwcm9jIHRlc3RfbmV4dF93aXRoX3JlY3Vyc2lvbiB7fSB7IAorICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGRlY2ltYWwKKyAgICBnbG9iYWwgYmluZmlsZQorCisgICAgaWYgW3RhcmdldF9pbmZvIGV4aXN0cyB1c2VfZ2RiX3N0dWJdIHsKKwkjIFJlbG9hZCB0aGUgcHJvZ3JhbS4KKwlkZWxldGVfYnJlYWtwb2ludHMKKwlnZGJfbG9hZCAke2JpbmZpbGV9OworICAgIH0gZWxzZSB7CisJIyBGSVhNRTogc2hvdWxkIGJlIHVzaW5nIHJ1bnRvCisJZ2RiX3Rlc3QgImtpbGwiICIiICJraWxsIHByb2dyYW0iICJLaWxsIHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkLip5IG9yIG4uICQiICJ5IgorCisJZGVsZXRlX2JyZWFrcG9pbnRzCisgICAgfQorCisgICAgZ2RiX3Rlc3QgImJyZWFrIGZhY3RvcmlhbCIgIkJyZWFrcG9pbnQgJGRlY2ltYWwgYXQgLioiICJicmVhayBhdCBmYWN0b3JpYWwiCisKKyAgICAjIFJ1biB1bnRpbCB3ZSBjYWxsIGZhY3RvcmlhbCB3aXRoIDYKKworICAgIGlmIFtpc3RhcmdldCAiKi0qLXZ4d29ya3MqIl0gdGhlbiB7CisJc2VuZF9nZGIgInJ1biB2eG1haW4gXCI2XCJcbiIKKyAgICB9IGVsc2UgeworCWdkYl9ydW5fY21kCisgICAgfQorICAgIGdkYl9leHBlY3QgeworCS1yZSAiQnJlYWsuKiBmYWN0b3JpYWwgLnZhbHVlPTYuIC4qJGdkYl9wcm9tcHQgJCIge30KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJydW4gdG8gZmFjdG9yaWFsKDYpIjsKKwkgICAgZ2RiX3N1cHByZXNzX3Rlc3RzOworCX0KKwl0aW1lb3V0IHsgZmFpbCAicnVuIHRvIGZhY3RvcmlhbCg2KSAodGltZW91dCkiIDsgZ2RiX3N1cHByZXNzX3Rlc3RzIH0KKyAgICB9CisKKyAgICAjIENvbnRpbnVlIHVudGlsIHdlIGNhbGwgZmFjdG9yaWFsIHJlY3Vyc2l2ZWx5IHdpdGggNS4KKworICAgIGlmIFtnZGJfdGVzdCAiY29udGludWUiIFwKKwkiQ29udGludWluZy4qQnJlYWsuKiBmYWN0b3JpYWwgLnZhbHVlPTUuIC4qIiBcCisJImNvbnRpbnVlIHRvIGZhY3RvcmlhbCg1KSJdIHRoZW4geyBnZGJfc3VwcHJlc3NfdGVzdHMgfQorCisgICAgIyBEbyBhIGJhY2t0cmFjZSBqdXN0IHRvIGNvbmZpcm0gaG93IG1hbnkgbGV2ZWxzIGRlZXAgd2UgYXJlLgorCisgICAgaWYgW2dkYl90ZXN0ICJiYWNrdHJhY2UiIFwKKwkiIzBcWyBcdFxdKyBmYWN0b3JpYWwgLnZhbHVlPTUuLioiIFwKKwkiYmFja3RyYWNlIGZyb20gZmFjdG9yaWFsKDUpIl0gdGhlbiB7IGdkYl9zdXBwcmVzc190ZXN0cyB9CisKKyAgICAjIE5vdyBhICJuZXh0IiBzaG91bGQgcG9zaXRpb24gdXMgYXQgdGhlIHJlY3Vyc2l2ZSBjYWxsLCB3aGljaAorICAgICMgd2Ugd2lsbCBiZSBwZXJmb3JtaW5nIHdpdGggNC4KKworICAgIGlmIFtnZGJfdGVzdCAibmV4dCIgXAorCSIuKiBmYWN0b3JpYWwgLnZhbHVlIC0gMS47LioiIFwKKwkibmV4dCB0byByZWN1cnNpdmUgY2FsbCJdIHRoZW4geyBnZGJfc3VwcHJlc3NfdGVzdHMgfQorCisgICAgIyBEaXNhYmxlIHRoZSBicmVha3BvaW50IGF0IHRoZSBlbnRyeSB0byBmYWN0b3JpYWwgYnkgZGVsZXRpbmcgdGhlbSBhbGwuCisgICAgIyBUaGUgIm5leHQiIHNob3VsZCBydW4gdW50aWwgd2UgcmV0dXJuIHRvIHRoZSBuZXh0IGxpbmUgZnJvbSB0aGlzCisgICAgIyByZWN1cnNpdmUgY2FsbCB0byBmYWN0b3JpYWwgd2l0aCA0LgorICAgICMgQnVnZ3kgdmVyc2lvbnMgb2YgZ2RiIHdpbGwgc3RvcCBpbnN0ZWFkIGF0IHRoZSBpbm5lcm1vc3QgZnJhbWUgb24KKyAgICAjIHRoZSBsaW5lIHdoZXJlIHdlIGFyZSB0cnlpbmcgdG8gIm5leHQiIHRvLgorCisgICAgZGVsZXRlX2JyZWFrcG9pbnRzCisKKyAgICBpZiBbaXN0YXJnZXQgIm1pcHMqdHgzOS0qIl0geworCXNldCB0aW1lb3V0IDYwCisgICAgfSBlbHNlIHsKKwlzZXQgdGltZW91dCAyMAorICAgIH0KKworICAgIGdkYl90ZXN0IG5leHQgIlxbMC05XF0qXFtcdCBcXStyZXR1cm4gXFwodmFsdWVcXCk7LioiIFwKKwkgICAgIm5leHQgb3ZlciByZWN1cnNpdmUgY2FsbCIKKworICAgICMgT0ssIHdlIHNob3VsZCBiZSBiYWNrIGluIHRoZSBzYW1lIHN0YWNrIGZyYW1lIHdlIHN0YXJ0ZWQgZnJvbS4KKyAgICAjIERvIGEgYmFja3RyYWNlIGp1c3QgdG8gY29uZmlybS4KKworICAgIHNldCByZXN1bHQgW2dkYl90ZXN0ICJiYWNrdHJhY2UiIFwKKwkgICAgIiMwXFsgXHRcXSsgZmFjdG9yaWFsIC52YWx1ZT0xMjAuKlxyXG4jMVxbIFx0XF0rIFxbMC05YS1meFxdKyBpbiBmYWN0b3JpYWwgLnZhbHVlPTYuLioiIFwKKwkgICAgImJhY2t0cmFjZSBmcm9tIGZhY3RvcmlhbCg1LjEpIl0KKyAgICBpZiB7ICRyZXN1bHQgIT0gMCB9IHsgZ2RiX3N1cHByZXNzX3Rlc3RzIH0KKworICAgIGlmIFt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiLG5vcmVzdWx0c10geyBnZGJfc3VwcHJlc3NfdGVzdHMgfQorICAgIGlmIFt0YXJnZXRfaW5mbyBleGlzdHMgdXNlX2dkYl9zdHViXSB7CisJZ2RiX2JyZWFrcG9pbnQgImV4aXQiCisJZ2RiX3Rlc3QgImNvbnRpbnVlIiAiQ29udGludWluZy4uKkJyZWFrcG9pbnQgLipleGl0IFxbKFxdLio9MFxbKVxdLioiICJjb250aW51ZSB1bnRpbCBleGl0IGluIHJlY3Vyc2l2ZSBuZXh0IHRlc3QiCisgICAgfSBlbHNlIHsKKyAgICAjIENvbnRpbnVlIHVudGlsIHdlIGV4aXQuICBTaG91bGQgbm90IHN0b3AgYWdhaW4uCisgICAgIyBEb24ndCBib3RoZXIgdG8gY2hlY2sgdGhlIG91dHB1dCBvZiB0aGUgcHJvZ3JhbSwgdGhhdCBtYXkgYmUKKyAgICAjIGV4dHJlbWVseSB0b3VnaCBmb3Igc29tZSByZW1vdGUgc3lzdGVtcy4KKwlnZGJfdGVzdCAiY29udGludWUiXAorCQkiQ29udGludWluZy5cW1xyXG4wLTlcXStQcm9ncmFtIGV4aXRlZCBub3JtYWxseVxcLi4qIlwKKwkJImNvbnRpbnVlIHVudGlsIGV4aXQgaW4gcmVjdXJzaXZlIG5leHQgdGVzdCIKKyAgICB9CisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7Cit9CisKK3Rlc3RfY2xlYXJfY29tbWFuZAordGVzdF9uZXh0X3dpdGhfcmVjdXJzaW9uCisKKyMgUmVzZXQgdGhlIGRlZmF1bHQgYXJndW1lbnRzIGZvciBWeFdvcmtzCitpZiBbaXN0YXJnZXQgIiotKi12eHdvcmtzKiJdIHsKKyAgICBzZXQgdGltZW91dCAxMAorICAgIHZlcmJvc2UgIlRpbWVvdXQgaXMgbm93ICR0aW1lb3V0IHNlY29uZHMiIDIKKyAgICBzZW5kX2dkYiAic2V0IGFyZ3MgbWFpblxuIgorICAgIGdkYl9leHBlY3QgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NhbGwtYXItc3QuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY2FsbC1hci1zdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MTk3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NhbGwtYXItc3QuYwpAQCAtMCwwICsxLDExMzcgQEAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVEVTVFMgOgorICogICAtLSBmdW5jdGlvbiBhcmd1bWVudHMgdGhhdCBhcmUgZW51bWVyYXRlZCB0eXBlcworICogICAtLSBzbWFsbCBzdHJ1Y3R1cmUgYXJndW1lbnRzICggPD0gNjQgYml0cyApIAorICogICAgICAgICAgICAtLSBzdG9yZWQgaW4gcmVnaXN0ZXJzCisgKiAgICAgICAgICAgIC0tIHN0b3JlZCBvbiB0aGUgc3RhY2sKKyAqICAgLS0gbGFyZ2Ugc3RydWN0dXJlIGFyZ3VtZW50cyAoID4gNjQgYml0cyApCisgKiAgICAgICAgICAgIC0tIHN0b3JlZCBpbiByZWdpc3RlcnMKKyAqICAgICAgICAgICAgLS0gc3RvcmVkIG9uIHRoZSBzdGFjaworICogICAtLSBhcnJheSBhcmd1bWVudHMKKyAqICAgLS0gY2FsbGVyIGlzIGEgbGVhZiByb3V0aW5lIDoKKyAqICAgICAgICAgICAgLS0gdXNlIHRoZSBjYWxsIGNvbW1hbmQgZnJvbSB3aXRoaW4gYW4gaW5pdCByb3V0aW5lIChpLmUuCisgKiAgICAgICAgICAgICAgIGluaXRfYml0X2ZsYWdzLCBpbml0X2JpdF9mbGFnc19jb21ibywgaW5pdF9hcnJheV9yZXApCisgKiAgIC0tIGNhbGxlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHNwYWNlIGZvciBhbGwgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyA6CisgKiAgICAgICAgICAgIC0tIGNhbGwgcHJpbnRfbG9uZ19hcmdfbGlzdCBmcm9tIGluc2lkZSBwcmludF9zbWFsbF9zdHJ1Y3RzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTb21lIGVudW1lcmF0ZWQgdHlwZXMgLS0gdXNlZCB0byB0ZXN0IHRoYXQgdGhlIHN0cnVjdHVyZWFsIGRhdGEgdHlwZSBpcworICogcmV0cmlldmVkIGZvciBmdW5jdGlvbiBhcmd1bWVudHMgd2l0aCB0eXBlZGVmIGRhdGEgdHlwZXMuCisgKi8KK3R5cGVkZWYgaW50IGlkX2ludDsKKwordHlwZWRlZiBlbnVtIHsgCisJICAgICAgQkxBQ0ssCisJICAgICAgQkxVRSwKKwkgICAgICBCUk9XTiwKKwkgICAgICBFQ1JVRSwKKwkgICAgICBHT0xELAorCSAgICAgIEdSQVksCisJICAgICAgR1JFRU4sCisJICAgICAgSVZPUlksCisJICAgICAgTUFVVkUsCisJICAgICAgT1JBTkdFLAorCSAgICAgIFBJTkssCisJICAgICAgUFVSUExFLAorCSAgICAgIFJFRCwKKwkgICAgICBTSUxWRVIsCisJICAgICAgVEFOLAorCSAgICAgIFZJT0xFVCwKKwkgICAgICBXSElURSwKKwkgICAgICBZRUxMT1d9IGNvbG9yczsKKworLyogQSBsYXJnZSBzdHJ1Y3R1cmUgKD4gNjQgYml0cykgdXNlZCB0byB0ZXN0IHBhc3NpbmcgbGFyZ2Ugc3RydWN0dXJlcyBhcworICogcGFyYW1ldGVycworICovCisKK3N0cnVjdCBhcnJheV9yZXBfaW5mb190IHsKKyAgIGludCAgIG5leHRfaW5kZXhbMTBdOyAKKyAgIGludCAgIHZhbHVlc1sxMF07CisgICBpbnQgICBoZWFkOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTbWFsbCBzdHJ1Y3R1cmVzICggPD0gNjQgYml0cykuIFRoZXNlIGFyZSB1c2VkIHRvIHRlc3QgcGFzc2luZyBzbWFsbCAKKyAqIHN0cnVjdHVyZXMgYXMgcGFyYW1ldGVycyBhbmQgdGVzdCBhcmd1bWVudCBzaXplIHByb21vdGlvbi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIC8qIDY0IGJpdHMKKyAgKi8KK3N0cnVjdCBzbWFsbF9yZXBfaW5mb190IHsKKyAgIGludCAgIHZhbHVlOworICAgaW50ICAgaGVhZDsKK307CisKKy8qIDYgYml0cyA6IHJlYWxseSBmaXRzIGluIDggYml0cyBhbmQgaXMgcHJvbW90ZWQgdG8gMzIgYml0cworICovCitzdHJ1Y3QgYml0X2ZsYWdzX3QgeworICAgICAgIHVuc2lnbmVkIGFscGhhICAgOjE7CisgICAgICAgdW5zaWduZWQgYmV0YSAgICA6MTsKKyAgICAgICB1bnNpZ25lZCBnYW1tYSAgIDoxOworICAgICAgIHVuc2lnbmVkIGRlbHRhICAgOjE7CisgICAgICAgdW5zaWduZWQgZXBzaWxvbiA6MTsKKyAgICAgICB1bnNpZ25lZCBvbWVnYSAgIDoxOworfTsKKworLyogMjIgYml0cyA6IHJlYWxseSBmaXRzIGluIDQwIGJpdHMgYW5kIGlzIHByb21vdGVkIHRvIDY0IGJpdHMKKyAqLworc3RydWN0IGJpdF9mbGFnc19jb21ib190IHsKKyAgICAgICB1bnNpZ25lZCBhbHBoYSAgIDoxOworICAgICAgIHVuc2lnbmVkIGJldGEgICAgOjE7CisgICAgICAgY2hhciAgICAgY2gxOworICAgICAgIHVuc2lnbmVkIGdhbW1hICAgOjE7CisgICAgICAgdW5zaWduZWQgZGVsdGEgICA6MTsKKyAgICAgICBjaGFyICAgICBjaDI7CisgICAgICAgdW5zaWduZWQgZXBzaWxvbiA6MTsKKyAgICAgICB1bnNpZ25lZCBvbWVnYSAgIDoxOworfTsKKworLyogNjQgYml0cworICovCitzdHJ1Y3Qgb25lX2RvdWJsZV90IHsKKyAgICAgICBkb3VibGUgZG91YmxlMTsKK307CisKKy8qIDY0IGJpdHMKKyAqLworc3RydWN0IHR3b19mbG9hdHNfdCB7CisgICAgICAgZmxvYXQgZmxvYXQxOworICAgICAgIGZsb2F0IGZsb2F0MjsKK307CisKKy8qIDE2IGJpdHMgOiBwcm9tb3RlZCB0byAzMiBiaXRzCisgKi8KK3N0cnVjdCB0d29fY2hhcl90IHsKKyAgICAgICBjaGFyIGNoMTsKKyAgICAgICBjaGFyIGNoMjsKK307CisKKy8qIDI0IGJpdHMgOiBwcm9tb3RlZCB0byAzMiBiaXRzCisgKi8KK3N0cnVjdCB0aHJlZV9jaGFyX3QgeworICAgICAgIGNoYXIgY2gxOworICAgICAgIGNoYXIgY2gyOworICAgICAgIGNoYXIgY2gzOworfTsKKworLyogNDAgYml0cyA6IHByb21vdGVkIHRvIDY0IGJpdHMKKyAqLworc3RydWN0IGZpdmVfY2hhcl90IHsKKyAgICAgICBjaGFyIGNoMTsKKyAgICAgICBjaGFyIGNoMjsKKyAgICAgICBjaGFyIGNoMzsKKyAgICAgICBjaGFyIGNoNDsKKyAgICAgICBjaGFyIGNoNTsKK307CisKKy8qIDQwIGJpdHMgOiBwcm9tb3RlZCB0byA2NCBiaXRzCisgKi8KK3N0cnVjdCBpbnRfY2hhcl9jb21ib190IHsKKyAgICAgICBpbnQgIGludDE7CisgICAgICAgY2hhciBjaDE7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBSSU5UX1NUVURFTlRfSURfU0hJUlRfQ09MT1IgOiAKKyAqIElOICAgICBpZF9pbnQgc3R1ZGVudCAgICAgICAtLSBlbnVtZXJhdGVkIHR5cGUKKyAqIElOICAgICBjb2xvcnMgc2hpcnQgICAgICAgICAtLSBlbnVtZXJhdGVkIHR5cGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHJpbnRfc3R1ZGVudF9pZF9zaGlydF9jb2xvciAoIHN0dWRlbnQsIHNoaXJ0ICkgCisgaWRfaW50IHN0dWRlbnQ7CisgY29sb3JzIHNoaXJ0OworeworCisgcHJpbnRmKCJzdHVkZW50IGlkIDogJWRcdCIsIHN0dWRlbnQpOworIHByaW50Zigic2hpcnQgY29sb3IgOiAiKTsKKyBzd2l0Y2ggKHNoaXJ0KSB7CisgICBjYXNlIEJMQUNLIDogIHByaW50ZigiQkxBQ0tcbiIpOyAKKwkJIGJyZWFrOworICAgY2FzZSBCTFVFIDogICBwcmludGYoIkJMVUVcbiIpOworCQkgYnJlYWs7CisgICBjYXNlIEJST1dOIDogIHByaW50ZigiQlJPV05cbiIpOworCQkgYnJlYWs7CisgICBjYXNlIEVDUlVFIDogIHByaW50ZigiRUNSVUVcbiIpOworCQkgYnJlYWs7CisgICBjYXNlIEdPTEQgOiAgIHByaW50ZigiR09MRFxuIik7CisJCSBicmVhazsKKyAgIGNhc2UgR1JBWSA6ICAgcHJpbnRmKCJHUkFZXG4iKTsKKwkJIGJyZWFrOworICAgY2FzZSBHUkVFTiA6ICBwcmludGYoIkdSRUVOXG4iKTsKKwkJIGJyZWFrOworICAgY2FzZSBJVk9SWSA6ICBwcmludGYoIklWT1JZXG4iKTsKKwkJIGJyZWFrOworICAgY2FzZSBNQVVWRSA6ICBwcmludGYoIk1BVVZFXG4iKTsKKwkJIGJyZWFrOworICAgY2FzZSBPUkFOR0UgOiBwcmludGYoIk9SQU5HRVxuIik7CisJCSBicmVhazsKKyAgIGNhc2UgUElOSyA6ICAgcHJpbnRmKCJQSU5LXG4iKTsKKwkJIGJyZWFrOworICAgY2FzZSBQVVJQTEUgOiBwcmludGYoIlBVUlBMRVxuIik7CisJCSBicmVhazsKKyAgIGNhc2UgUkVEIDogICAgcHJpbnRmKCJSRURcbiIpOworCQkgYnJlYWs7CisgICBjYXNlIFNJTFZFUiA6IHByaW50ZigiU0lMVkVSXG4iKTsKKwkJIGJyZWFrOworICAgY2FzZSBUQU4gOiAgICBwcmludGYoIlRBTlxuIik7CisJCSBicmVhazsKKyAgIGNhc2UgVklPTEVUIDogcHJpbnRmKCJWSU9MRVRcbiIpOworCQkgYnJlYWs7CisgICBjYXNlIFdISVRFIDogIHByaW50ZigiV0hJVEVcbiIpOworCQkgYnJlYWs7CisgICBjYXNlIFlFTExPVyA6IHByaW50ZigiWUVMTE9XXG4iKTsKKwkJIGJyZWFrOworIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQUklOVF9DSEFSX0FSUkFZIDogCisgKiBJTiAgICAgY2hhciAgYXJyYXlfY1tdICAgICAgLS0gY2hhcmFjdGVyIGFycmF5IAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmludF9jaGFyX2FycmF5ICggYXJyYXlfYyApIAorICAgICBjaGFyICAgIGFycmF5X2NbXTsKKworeworCisgIGludCBpbmRleDsKKworICBwcmludGYoImFycmF5X2MgOlxuIik7CisgIHByaW50ZigiPT09PT09PT09XG5cbiIpOworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAxMjA7IGluZGV4KyspIHsKKyAgICAgIHByaW50ZigiJTFjIiwgYXJyYXlfY1tpbmRleF0pOyAKKyAgICAgIGlmICgoaW5kZXglNTApID09IDApIHByaW50ZigiXG4iKTsKKyAgfQorICBwcmludGYoIlxuXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQUklOVF9ET1VCTEVfQVJSQVkgOiAKKyAqIElOICAgICBkb3VibGUgYXJyYXlfZFtdICAgICAgLS0gYXJyYXkgb2YgZG91YmxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmludF9kb3VibGVfYXJyYXkgKGFycmF5X2QpIAorICAgICBkb3VibGUgIGFycmF5X2RbXTsKKworeworCisgIGludCBpbmRleDsKKworICBwcmludGYoImFycmF5X2QgOlxuIik7CisgIHByaW50ZigiPT09PT09PT09XG5cbiIpOworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAxMDA7IGluZGV4KyspIHsKKyAgICAgIHByaW50ZigiJWYgICIsIGFycmF5X2RbaW5kZXhdKTsgCisgICAgICBpZiAoKGluZGV4JTgpID09IDApIHByaW50ZigiXG4iKTsKKyAgfQorICBwcmludGYoIlxuXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQUklOVF9GTE9BVF9BUlJBWTogCisgKiBJTiAgICAgZmxvYXQgYXJyYXlfZltdICAgICAgLS0gYXJyYXkgb2YgZmxvYXRzIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmludF9mbG9hdF9hcnJheSAoIGFycmF5X2YgKQorICAgICBmbG9hdCBhcnJheV9mW107CisKK3sKKworICBpbnQgaW5kZXg7CisKKyAgcHJpbnRmKCJhcnJheV9mIDpcbiIpOworICBwcmludGYoIj09PT09PT09PVxuXG4iKTsKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMTU7IGluZGV4KyspIHsKKyAgICAgIHByaW50ZigiJWYgICIsIGFycmF5X2ZbaW5kZXhdKTsgCisgICAgICBpZiAoKGluZGV4JTgpID09IDApIHByaW50ZigiXG4iKTsKKworICB9CisgIHByaW50ZigiXG5cbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBSSU5UX0lOVF9BUlJBWTogCisgKiBJTiAgICAgaW50ICBhcnJheV9pW10gICAgICAtLSBhcnJheSBvZiBpbnRlZ2VycyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHJpbnRfaW50X2FycmF5ICggYXJyYXlfaSApCisgICAgIGludCBhcnJheV9pW107CisKK3sKKworICBpbnQgaW5kZXg7CisKKyAgcHJpbnRmKCJhcnJheV9pIDpcbiIpOworICBwcmludGYoIj09PT09PT09PVxuXG4iKTsKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNTA7IGluZGV4KyspIHsKKyAgICAgIHByaW50ZigiJWQgICIsIGFycmF5X2lbaW5kZXhdKTsgCisgICAgICBpZiAoKGluZGV4JTgpID09IDApIHByaW50ZigiXG4iKTsKKyAgfQorICBwcmludGYoIlxuXG4iKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBSSU5UX0FMTF9BUlJBWVM6IAorICogSU4gICAgIGludCAgYXJyYXlfaVtdICAgICAgLS0gYXJyYXkgb2YgaW50ZWdlcnMgCisgKiBJTiAgICAgY2hhciBhcnJheV9jW10gICAgICAtLSBhcnJheSBvZiBjaGFyYWN0ZXJzIAorICogSU4gICAgIGZsb2F0IGFycmF5X2ZbXSAgICAgIC0tIGFycmF5IG9mIGZsb2F0cyAKKyAqIElOICAgICBkb3VibGUgYXJyYXlfZFtdICAgICAgLS0gYXJyYXkgb2YgZG91YmxlcyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHJpbnRfYWxsX2FycmF5cyggYXJyYXlfaSwgYXJyYXlfYywgYXJyYXlfZiwgYXJyYXlfZCApCisgICAgIGludCBhcnJheV9pW107CisgICAgIGNoYXIgYXJyYXlfY1tdOworICAgICBmbG9hdCBhcnJheV9mW107CisgICAgIGRvdWJsZSBhcnJheV9kW107CisKK3sKKyAgcHJpbnRfaW50X2FycmF5KGFycmF5X2kpOworICBwcmludF9jaGFyX2FycmF5KGFycmF5X2MpOworICBwcmludF9mbG9hdF9hcnJheShhcnJheV9mKTsKKyAgcHJpbnRfZG91YmxlX2FycmF5KGFycmF5X2QpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExPT1BfQ09VTlQgOiAKKyAqIEEgZG8gbm90aGluZyBmdW5jdGlvbi4gVXNlZCB0byBwcm92aWRlIGEgcG9pbnQgYXQgd2hpY2ggY2FsbHMgY2FuIGJlIG1hZGUuICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbG9vcF9jb3VudCAoKSB7CisKKyAgICAgaW50IGluZGV4OworCisgICAgIGZvciAoaW5kZXg9MDsgaW5kZXg8NDsgaW5kZXgrKyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ09NUFVURV9XSVRIX1NNQUxMX1NUUlVDVFMgOiAKKyAqIEEgZG8gbm90aGluZyBmdW5jdGlvbi4gVXNlZCB0byBwcm92aWRlIGEgcG9pbnQgYXQgd2hpY2ggY2FsbHMgY2FuIGJlIG1hZGUuICAKKyAqIElOICBpbnQgc2VlZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjb21wdXRlX3dpdGhfc21hbGxfc3RydWN0cyAoIHNlZWQgKSAKKyBpbnQgc2VlZDsKK3sKKworICAgICBzdHJ1Y3Qgc21hbGxfcmVwX2luZm9fdCBhcnJheVs0XTsKKyAgICAgaW50IGluZGV4OworCisgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspIHsKKyAgICAgICAgIGFycmF5W2luZGV4XS52YWx1ZSA9IGluZGV4KnNlZWQ7CisJIGFycmF5W2luZGV4XS5oZWFkID0gKGluZGV4KzEpKnNlZWQ7CisgICAgIH0KKworICAgICBmb3IgKGluZGV4ID0gMTsgaW5kZXggPCA0OyBpbmRleCsrKSB7CisJIGFycmF5W2luZGV4XS52YWx1ZSA9IGFycmF5W2luZGV4XS52YWx1ZSArIGFycmF5W2luZGV4LTFdLnZhbHVlOworCSBhcnJheVtpbmRleF0uaGVhZCA9IGFycmF5W2luZGV4XS5oZWFkICsgYXJyYXlbaW5kZXgtMV0uaGVhZDsKKyAgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOSVRfQklUX0ZMQUdTIDoKKyAqIEluaXRpYWxpemVzIGEgYml0X2ZsYWdzX3Qgc3RydWN0dXJlLiBDYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHNlZQorICogdGhlIGNhbGwgY29tbWFuZCBiZWhhdmlvciB3aGVuIGludGVnZXIgYXJndW1lbnRzIGRvIG5vdCBmaXQgaW50bworICogcmVnaXN0ZXJzIGFuZCBtdXN0IGJlIHBsYWNlZCBvbiB0aGUgc3RhY2suCisgKiBPVVQgc3RydWN0IGJpdF9mbGFnc190ICpiaXRfZmxhZ3MgLS0gc3RydWN0dXJlIHRvIGJlIGZpbGxlZAorICogSU4gIHVuc2lnbmVkIGEgIC0tIDAgb3IgMSAKKyAqIElOICB1bnNpZ25lZCBiICAtLSAwIG9yIDEgCisgKiBJTiAgdW5zaWduZWQgZyAgLS0gMCBvciAxIAorICogSU4gIHVuc2lnbmVkIGQgIC0tIDAgb3IgMSAKKyAqIElOICB1bnNpZ25lZCBlICAtLSAwIG9yIDEgCisgKiBJTiAgdW5zaWduZWQgbyAgLS0gMCBvciAxIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpbml0X2JpdF9mbGFncyAoIGJpdF9mbGFncywgYSwgYiwgZywgZCwgZSwgbyApCitzdHJ1Y3QgYml0X2ZsYWdzX3QgKmJpdF9mbGFnczsKK3Vuc2lnbmVkIGE7Cit1bnNpZ25lZCBiOwordW5zaWduZWQgZzsKK3Vuc2lnbmVkIGQ7Cit1bnNpZ25lZCBlOwordW5zaWduZWQgbzsgCit7CisKKyAgIGJpdF9mbGFncy0+YWxwaGEgPSBhOworICAgYml0X2ZsYWdzLT5iZXRhID0gYjsKKyAgIGJpdF9mbGFncy0+Z2FtbWEgPSBnOworICAgYml0X2ZsYWdzLT5kZWx0YSA9IGQ7CisgICBiaXRfZmxhZ3MtPmVwc2lsb24gPSBlOworICAgYml0X2ZsYWdzLT5vbWVnYSA9IG87Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5JVF9CSVRfRkxBR1NfQ09NQk8gOgorICogSW5pdGlhbGl6ZXMgYSBiaXRfZmxhZ3NfY29tYm9fdCBzdHJ1Y3R1cmUuIENhbiBjYWxsIHRoaXMgZnVuY3Rpb24KKyAqIHRvIHNlZSB0aGUgY2FsbCBjb21tYW5kIGJlaGF2aW9yIHdoZW4gaW50ZWdlciBhbmQgY2hhcmFjdGVyIGFyZ3VtZW50cworICogZG8gbm90IGZpdCBpbnRvIHJlZ2lzdGVycyBhbmQgbXVzdCBiZSBwbGFjZWQgb24gdGhlIHN0YWNrLgorICogT1VUIHN0cnVjdCBiaXRfZmxhZ3NfY29tYm9fdCAqYml0X2ZsYWdzX2NvbWJvIC0tIHN0cnVjdHVyZSB0byBmaWxsCisgKiBJTiAgdW5zaWduZWQgYSAgLS0gMCBvciAxIAorICogSU4gIHVuc2lnbmVkIGIgIC0tIDAgb3IgMSAKKyAqIElOICBjaGFyICAgICBjaDEKKyAqIElOICB1bnNpZ25lZCBnICAtLSAwIG9yIDEgCisgKiBJTiAgdW5zaWduZWQgZCAgLS0gMCBvciAxIAorICogSU4gIGNoYXIgICAgIGNoMgorICogSU4gIHVuc2lnbmVkIGUgIC0tIDAgb3IgMSAKKyAqIElOICB1bnNpZ25lZCBvICAtLSAwIG9yIDEgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGluaXRfYml0X2ZsYWdzX2NvbWJvICggYml0X2ZsYWdzX2NvbWJvLCBhLCBiLCBjaDEsIGcsIGQsIGNoMiwgZSwgbyApCisgICAgIHN0cnVjdCBiaXRfZmxhZ3NfY29tYm9fdCAqYml0X2ZsYWdzX2NvbWJvOworICAgICB1bnNpZ25lZCBhOworICAgICB1bnNpZ25lZCBiOworICAgICBjaGFyICAgICBjaDE7CisgICAgIHVuc2lnbmVkIGc7CisgICAgIHVuc2lnbmVkIGQ7CisgICAgIGNoYXIgICAgIGNoMjsKKyAgICAgdW5zaWduZWQgZTsKKyAgICAgdW5zaWduZWQgbzsgCit7CisKKyAgIGJpdF9mbGFnc19jb21iby0+YWxwaGEgPSBhOworICAgYml0X2ZsYWdzX2NvbWJvLT5iZXRhID0gYjsKKyAgIGJpdF9mbGFnc19jb21iby0+Y2gxID0gY2gxOworICAgYml0X2ZsYWdzX2NvbWJvLT5nYW1tYSA9IGc7CisgICBiaXRfZmxhZ3NfY29tYm8tPmRlbHRhID0gZDsKKyAgIGJpdF9mbGFnc19jb21iby0+Y2gyID0gY2gyOworICAgYml0X2ZsYWdzX2NvbWJvLT5lcHNpbG9uID0gZTsKKyAgIGJpdF9mbGFnc19jb21iby0+b21lZ2EgPSBvOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5JVF9PTkVfRE9VQkxFIDogCisgKiBPVVQgIHN0cnVjdCBvbmVfZG91YmxlX3QgKm9uZV9kb3VibGUgIC0tIHN0cnVjdHVyZSB0byBmaWxsIAorICogSU4gICBkb3VibGUgaW5pdF92YWwKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW5pdF9vbmVfZG91YmxlICggb25lX2RvdWJsZSwgaW5pdF92YWwgKQorICAgICBzdHJ1Y3Qgb25lX2RvdWJsZV90ICpvbmVfZG91YmxlOworICAgICBkb3VibGUgaW5pdF92YWw7IAoreworCisgICAgIG9uZV9kb3VibGUtPmRvdWJsZTEgID0gaW5pdF92YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5JVF9UV09fRkxPQVRTIDogCisgKiBPVVQgc3RydWN0IHR3b19mbG9hdHNfdCAqdHdvX2Zsb2F0cyAtLSBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkCisgKiBJTiAgZmxvYXQgaW5pdF92YWwxIAorICogSU4gIGZsb2F0IGluaXRfdmFsMiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW5pdF90d29fZmxvYXRzICggdHdvX2Zsb2F0cywgaW5pdF92YWwxLCBpbml0X3ZhbDIgKQorICAgICBzdHJ1Y3QgdHdvX2Zsb2F0c190ICp0d29fZmxvYXRzOyAKKyAgICAgZmxvYXQgaW5pdF92YWwxOworICAgICBmbG9hdCBpbml0X3ZhbDI7Cit7CisgICAgIHR3b19mbG9hdHMtPmZsb2F0MSA9IGluaXRfdmFsMTsKKyAgICAgdHdvX2Zsb2F0cy0+ZmxvYXQyID0gaW5pdF92YWwyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOSVRfVFdPX0NIQVJTIDogCisgKiBPVVQgc3RydWN0IHR3b19jaGFyX3QgKnR3b19jaGFyIC0tIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQKKyAqIElOICBjaGFyIGluaXRfdmFsMSAKKyAqIElOICBjaGFyIGluaXRfdmFsMiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW5pdF90d29fY2hhcnMgKCB0d29fY2hhciwgaW5pdF92YWwxLCBpbml0X3ZhbDIgKQorICAgICBzdHJ1Y3QgdHdvX2NoYXJfdCAqdHdvX2NoYXI7CisgICAgIGNoYXIgaW5pdF92YWwxOworICAgICBjaGFyIGluaXRfdmFsMjsgCit7CisKKyAgICAgdHdvX2NoYXItPmNoMSA9IGluaXRfdmFsMTsKKyAgICAgdHdvX2NoYXItPmNoMiA9IGluaXRfdmFsMjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTklUX1RIUkVFX0NIQVJTIDogCisgKiBPVVQgc3RydWN0IHRocmVlX2NoYXJfdCAqdGhyZWVfY2hhciAtLSBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkCisgKiBJTiAgY2hhciBpbml0X3ZhbDEgCisgKiBJTiAgY2hhciBpbml0X3ZhbDIgCisgKiBJTiAgY2hhciBpbml0X3ZhbDMgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGluaXRfdGhyZWVfY2hhcnMgKCB0aHJlZV9jaGFyLCBpbml0X3ZhbDEsIGluaXRfdmFsMiwgaW5pdF92YWwzICkgIAorICAgICBzdHJ1Y3QgdGhyZWVfY2hhcl90ICp0aHJlZV9jaGFyOyAKKyAgICAgY2hhciBpbml0X3ZhbDE7CisgICAgIGNoYXIgaW5pdF92YWwyOworICAgICBjaGFyIGluaXRfdmFsMzsKK3sKKworICAgICB0aHJlZV9jaGFyLT5jaDEgPSBpbml0X3ZhbDE7CisgICAgIHRocmVlX2NoYXItPmNoMiA9IGluaXRfdmFsMjsKKyAgICAgdGhyZWVfY2hhci0+Y2gzID0gaW5pdF92YWwzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOSVRfRklWRV9DSEFSUyA6IAorICogT1VUIHN0cnVjdCBmaXZlX2NoYXJfdCAqZml2ZV9jaGFyIC0tIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQKKyAqIElOICBjaGFyIGluaXRfdmFsMSAKKyAqIElOICBjaGFyIGluaXRfdmFsMiAKKyAqIElOICBjaGFyIGluaXRfdmFsMyAKKyAqIElOICBjaGFyIGluaXRfdmFsNCAKKyAqIElOICBjaGFyIGluaXRfdmFsNSAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW5pdF9maXZlX2NoYXJzICggZml2ZV9jaGFyLCBpbml0X3ZhbDEsIGluaXRfdmFsMiwgaW5pdF92YWwzLGluaXRfdmFsNCxpbml0X3ZhbDUgKQorICAgICBzdHJ1Y3QgZml2ZV9jaGFyX3QgKmZpdmVfY2hhcjsKKyAgICAgY2hhciBpbml0X3ZhbDE7CisgICAgIGNoYXIgaW5pdF92YWwyOworICAgICBjaGFyIGluaXRfdmFsMzsKKyAgICAgY2hhciBpbml0X3ZhbDQ7CisgICAgIGNoYXIgaW5pdF92YWw1OworeworICAgICBmaXZlX2NoYXItPmNoMSA9IGluaXRfdmFsMTsKKyAgICAgZml2ZV9jaGFyLT5jaDIgPSBpbml0X3ZhbDI7CisgICAgIGZpdmVfY2hhci0+Y2gzID0gaW5pdF92YWwzOworICAgICBmaXZlX2NoYXItPmNoNCA9IGluaXRfdmFsNDsKKyAgICAgZml2ZV9jaGFyLT5jaDUgPSBpbml0X3ZhbDU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5JVF9JTlRfQ0hBUl9DT01CTyA6IAorICogT1VUIHN0cnVjdCBpbnRfY2hhcl9jb21ib190ICpjb21ibyAtLSBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkCisgKiBJTiAgaW50ICBpbml0X3ZhbDEgCisgKiBJTiAgY2hhciBpbml0X3ZhbDIgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGluaXRfaW50X2NoYXJfY29tYm8gKCBjb21ibywgaW5pdF92YWwxLCBpbml0X3ZhbDIgKQorICAgICBzdHJ1Y3QgaW50X2NoYXJfY29tYm9fdCAqY29tYm87CisgICAgIGludCBpbml0X3ZhbDE7IAorICAgICBjaGFyIGluaXRfdmFsMjsgCit7CisKKyAgICAgY29tYm8tPmludDEgPSBpbml0X3ZhbDE7CisgICAgIGNvbWJvLT5jaDEgPSBpbml0X3ZhbDI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5JVF9TVFJVQ1RfUkVQIDogCisgKiBPVVQgc3RydWN0IHNtYWxsX3JlcF9pbnRvX3QgKnNtYWxsX3N0cnVjdCAtLSBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkCisgKiBJTiAgaW50ICBzZWVkIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpbml0X3N0cnVjdF9yZXAoIHNtYWxsX3N0cnVjdCwgc2VlZCApCisgICAgIHN0cnVjdCBzbWFsbF9yZXBfaW5mb190ICpzbWFsbF9zdHJ1Y3Q7CisgICAgIGludCAgICBzZWVkOworCit7CisKKyAgICAgIHNtYWxsX3N0cnVjdC0+dmFsdWUgPSAyICsgKHNlZWQqMik7IAorICAgICAgc21hbGxfc3RydWN0LT5oZWFkID0gMDsgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5JVF9TTUFMTF9TVFJVQ1RTIDogCisgKiBUYWtlcyBhbGwgdGhlIHNtYWxsIHN0cnVjdHVyZXMgYXMgaW5wdXQgYW5kIGNhbGxzIHRoZSBhcHByb3ByaWF0ZQorICogaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgZWFjaCBzdHJ1Y3R1cmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW5pdF9zbWFsbF9zdHJ1Y3RzIChzdHJ1Y3QxLCBzdHJ1Y3QyLCBzdHJ1Y3QzLHN0cnVjdDQsZmxhZ3MsZmxhZ3NfY29tYm8sCit0aHJlZV9jaGFyLCBmaXZlX2NoYXIsaW50X2NoYXJfY29tYm8sIGQxLCBkMixkMyxmMSxmMixmMykKKyAgICAgc3RydWN0IHNtYWxsX3JlcF9pbmZvX3QgICpzdHJ1Y3QxOworICAgICBzdHJ1Y3Qgc21hbGxfcmVwX2luZm9fdCAgKnN0cnVjdDI7CisgICAgIHN0cnVjdCBzbWFsbF9yZXBfaW5mb190ICAqc3RydWN0MzsKKyAgICAgc3RydWN0IHNtYWxsX3JlcF9pbmZvX3QgICpzdHJ1Y3Q0OworICAgICBzdHJ1Y3QgYml0X2ZsYWdzX3QgICAgICAgKmZsYWdzOworICAgICBzdHJ1Y3QgYml0X2ZsYWdzX2NvbWJvX3QgKmZsYWdzX2NvbWJvOworICAgICBzdHJ1Y3QgdGhyZWVfY2hhcl90ICAgICAgKnRocmVlX2NoYXI7CisgICAgIHN0cnVjdCBmaXZlX2NoYXJfdCAgICAgICAqZml2ZV9jaGFyOworICAgICBzdHJ1Y3QgaW50X2NoYXJfY29tYm9fdCAgKmludF9jaGFyX2NvbWJvOworICAgICBzdHJ1Y3Qgb25lX2RvdWJsZV90ICAgICAgKmQxOworICAgICBzdHJ1Y3Qgb25lX2RvdWJsZV90ICAgICAgKmQyOworICAgICBzdHJ1Y3Qgb25lX2RvdWJsZV90ICAgICAgKmQzOworICAgICBzdHJ1Y3QgdHdvX2Zsb2F0c190ICAgICAgKmYxOworICAgICBzdHJ1Y3QgdHdvX2Zsb2F0c190ICAgICAgKmYyOworICAgICBzdHJ1Y3QgdHdvX2Zsb2F0c190ICAgICAgKmYzOworCit7CisKKyAgICAgaW5pdF9iaXRfZmxhZ3MoZmxhZ3MsICh1bnNpZ25lZCkxLCAodW5zaWduZWQpMCwgKHVuc2lnbmVkKTEsIAorCQkgICAgICAgICAgICh1bnNpZ25lZCkwLCAodW5zaWduZWQpMSwgKHVuc2lnbmVkKTAgKTsgCisgICAgIGluaXRfYml0X2ZsYWdzX2NvbWJvKGZsYWdzX2NvbWJvLCAodW5zaWduZWQpMSwgKHVuc2lnbmVkKTAsICd5JywKKwkJCQkgICAgICAgKHVuc2lnbmVkKTEsICh1bnNpZ25lZCkwLCAnbicsCisgICAgICAgICAgICAgICAgICAgIAkJICAgICAgICh1bnNpZ25lZCkxLCAodW5zaWduZWQpMCApOyAKKyAgICAgaW5pdF90aHJlZV9jaGFycyh0aHJlZV9jaGFyLCAnYScsICdiJywgJ2MnKTsKKyAgICAgaW5pdF9maXZlX2NoYXJzKGZpdmVfY2hhciwgJ2wnLCAnbScsICduJywgJ28nLCAncCcpOworICAgICBpbml0X2ludF9jaGFyX2NvbWJvKGludF9jaGFyX2NvbWJvLCAxMjMsICd6Jyk7CisgICAgIGluaXRfc3RydWN0X3JlcChzdHJ1Y3QxLCAyKTsKKyAgICAgaW5pdF9zdHJ1Y3RfcmVwKHN0cnVjdDIsIDQpOworICAgICBpbml0X3N0cnVjdF9yZXAoc3RydWN0MywgNSk7CisgICAgIGluaXRfc3RydWN0X3JlcChzdHJ1Y3Q0LCA2KTsKKyAgICAgaW5pdF9vbmVfZG91YmxlICggZDEsIDEwLjUpOyAKKyAgICAgaW5pdF9vbmVfZG91YmxlICggZDIsIC0zLjM0KTsgCisgICAgIGluaXRfb25lX2RvdWJsZSAoIGQzLCA2NzUuMDkxMjMpOyAKKyAgICAgaW5pdF90d29fZmxvYXRzICggZjEsIDQ1LjIzNCwgNDMuNik7IAorICAgICBpbml0X3R3b19mbG9hdHMgKCBmMiwgNzguMDEsIDEyMi4xMCk7IAorICAgICBpbml0X3R3b19mbG9hdHMgKCBmMywgLTEyMzIuMzQ1LCAtMTk5LjIxKTsgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUFJJTlRfVEVOX0RPVUJMRVMgOiAKKyAqID8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHJpbnRfdGVuX2RvdWJsZXMgKCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgZDgsIGQ5LCBkMTAgKQorICAgICBkb3VibGUgZDE7CisgICAgIGRvdWJsZSBkMjsKKyAgICAgZG91YmxlIGQzOworICAgICBkb3VibGUgZDQ7CisgICAgIGRvdWJsZSBkNTsKKyAgICAgZG91YmxlIGQ2OworICAgICBkb3VibGUgZDc7CisgICAgIGRvdWJsZSBkODsKKyAgICAgZG91YmxlIGQ5OworICAgICBkb3VibGUgZDEwOyAKK3sKKworICBwcmludGYoIlR3byBEb3VibGVzIDogJWZcdCVmXG4iLCBkMSwgZDIpOworICBwcmludGYoIlR3byBEb3VibGVzIDogJWZcdCVmXG4iLCBkMywgZDQpOworICBwcmludGYoIlR3byBEb3VibGVzIDogJWZcdCVmXG4iLCBkNSwgZDYpOworICBwcmludGYoIlR3byBEb3VibGVzIDogJWZcdCVmXG4iLCBkNywgZDgpOworICBwcmludGYoIlR3byBEb3VibGVzIDogJWZcdCVmXG4iLCBkOSwgZDEwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQUklOVF9CSVRfRkxBR1MgOiAKKyAqIElOIHN0cnVjdCBiaXRfZmxhZ3NfdCBiaXRfZmxhZ3MgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHJpbnRfYml0X2ZsYWdzICggYml0X2ZsYWdzICkKK3N0cnVjdCBiaXRfZmxhZ3NfdCBiaXRfZmxhZ3M7Cit7CisKKyAgICAgaWYgKGJpdF9mbGFncy5hbHBoYSkgcHJpbnRmKCJhbHBoYVxuIik7CisgICAgIGlmIChiaXRfZmxhZ3MuYmV0YSkgcHJpbnRmKCJiZXRhXG4iKTsKKyAgICAgaWYgKGJpdF9mbGFncy5nYW1tYSkgcHJpbnRmKCJnYW1tYVxuIik7CisgICAgIGlmIChiaXRfZmxhZ3MuZGVsdGEpIHByaW50ZigiZGVsdGFcbiIpOworICAgICBpZiAoYml0X2ZsYWdzLmVwc2lsb24pIHByaW50ZigiZXBzaWxvblxuIik7CisgICAgIGlmIChiaXRfZmxhZ3Mub21lZ2EpIHByaW50Zigib21lZ2FcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBSSU5UX0JJVF9GTEFHU19DT01CTyA6IAorICogSU4gc3RydWN0IGJpdF9mbGFnc19jb21ib190IGJpdF9mbGFnc19jb21ibyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmludF9iaXRfZmxhZ3NfY29tYm8gKCBiaXRfZmxhZ3NfY29tYm8gKQorc3RydWN0IGJpdF9mbGFnc19jb21ib190IGJpdF9mbGFnc19jb21ibzsKK3sKKworICAgICBpZiAoYml0X2ZsYWdzX2NvbWJvLmFscGhhKSBwcmludGYoImFscGhhXG4iKTsKKyAgICAgaWYgKGJpdF9mbGFnc19jb21iby5iZXRhKSBwcmludGYoImJldGFcbiIpOworICAgICBpZiAoYml0X2ZsYWdzX2NvbWJvLmdhbW1hKSBwcmludGYoImdhbW1hXG4iKTsKKyAgICAgaWYgKGJpdF9mbGFnc19jb21iby5kZWx0YSkgcHJpbnRmKCJkZWx0YVxuIik7CisgICAgIGlmIChiaXRfZmxhZ3NfY29tYm8uZXBzaWxvbikgcHJpbnRmKCJlcHNpbG9uXG4iKTsKKyAgICAgaWYgKGJpdF9mbGFnc19jb21iby5vbWVnYSkgcHJpbnRmKCJvbWVnYVxuIik7CisgICAgIHByaW50ZigiY2gxOiAlY1x0Y2gyOiAlY1xuIiwgYml0X2ZsYWdzX2NvbWJvLmNoMSwgYml0X2ZsYWdzX2NvbWJvLmNoMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUFJJTlRfT05FX0RPVUJMRSA6IAorICogSU4gc3RydWN0IG9uZV9kb3VibGVfdCBvbmVfZG91YmxlIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHByaW50X29uZV9kb3VibGUgKCBvbmVfZG91YmxlICkKK3N0cnVjdCBvbmVfZG91YmxlX3Qgb25lX2RvdWJsZTsKK3sKKworICAgICBwcmludGYoIkNvbnRlbnRzIG9mIG9uZV9kb3VibGVfdDogXG5cbiIpOworICAgICBwcmludGYoIiVmXG4iLCBvbmVfZG91YmxlLmRvdWJsZTEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBSSU5UX1RXT19GTE9BVFMgOiAKKyAqIElOIHN0cnVjdCB0d29fZmxvYXRzX3QgdHdvX2Zsb2F0cyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmludF90d29fZmxvYXRzICggdHdvX2Zsb2F0cyApCitzdHJ1Y3QgdHdvX2Zsb2F0c190IHR3b19mbG9hdHM7IAoreworCisgICAgIHByaW50ZigiQ29udGVudHMgb2YgdHdvX2Zsb2F0c190OiBcblxuIik7CisgICAgIHByaW50ZigiJWZcdCVmXG4iLCB0d29fZmxvYXRzLmZsb2F0MSwgdHdvX2Zsb2F0cy5mbG9hdDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBSSU5UX1RXT19DSEFSUyA6IAorICogSU4gc3RydWN0IHR3b19jaGFyX3QgdHdvX2NoYXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmludF90d29fY2hhcnMgKCB0d29fY2hhciApCitzdHJ1Y3QgdHdvX2NoYXJfdCB0d29fY2hhcjsgCit7CisKKyAgICAgcHJpbnRmKCJDb250ZW50cyBvZiB0d29fY2hhcl90OiBcblxuIik7CisgICAgIHByaW50ZigiJWNcdCVjXG4iLCB0d29fY2hhci5jaDEsIHR3b19jaGFyLmNoMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUFJJTlRfVEhSRUVfQ0hBUlMgOiAKKyAqIElOIHN0cnVjdCB0aHJlZV9jaGFyX3QgdGhyZWVfY2hhcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHByaW50X3RocmVlX2NoYXJzICggdGhyZWVfY2hhciApCitzdHJ1Y3QgdGhyZWVfY2hhcl90IHRocmVlX2NoYXI7Cit7CisKKyAgICAgcHJpbnRmKCJDb250ZW50cyBvZiB0aHJlZV9jaGFyX3Q6IFxuXG4iKTsKKyAgICAgcHJpbnRmKCIlY1x0JWNcdCVjXG4iLCB0aHJlZV9jaGFyLmNoMSwgdGhyZWVfY2hhci5jaDIsIHRocmVlX2NoYXIuY2gzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQUklOVF9GSVZFX0NIQVJTIDogCisgKiBJTiBzdHJ1Y3QgZml2ZV9jaGFyX3QgZml2ZV9jaGFyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHJpbnRfZml2ZV9jaGFycyAoIGZpdmVfY2hhciApIAorc3RydWN0IGZpdmVfY2hhcl90IGZpdmVfY2hhcjsgCit7CisKKyAgICAgcHJpbnRmKCJDb250ZW50cyBvZiBmaXZlX2NoYXJfdDogXG5cbiIpOworICAgICBwcmludGYoIiVjXHQlY1x0JWNcdCVjXHQlY1xuIiwgZml2ZV9jaGFyLmNoMSwgZml2ZV9jaGFyLmNoMiwgCisJCQkJICAgIGZpdmVfY2hhci5jaDMsIGZpdmVfY2hhci5jaDQsIAorCQkJCSAgICBmaXZlX2NoYXIuY2g1KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQUklOVF9JTlRfQ0hBUl9DT01CTyA6IAorICogSU4gc3RydWN0IGludF9jaGFyX2NvbWJvX3QgaW50X2NoYXJfY29tYm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmludF9pbnRfY2hhcl9jb21ibyAoIGludF9jaGFyX2NvbWJvICkKK3N0cnVjdCBpbnRfY2hhcl9jb21ib190IGludF9jaGFyX2NvbWJvOworeworCisgICAgIHByaW50ZigiQ29udGVudHMgb2YgaW50X2NoYXJfY29tYm9fdDogXG5cbiIpOworICAgICBwcmludGYoIiVkXHQlY1xuIiwgaW50X2NoYXJfY29tYm8uaW50MSwgaW50X2NoYXJfY29tYm8uY2gxKTsKK30gICAgIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBSSU5UX1NUUlVDVF9SRVAgOiAKKyAqIFRoZSBsYXN0IHBhcmFtZXRlciBtdXN0IGdvIG9udG8gdGhlIHN0YWNrIHJhdGhlciB0aGFuIGludG8gYSByZWdpc3Rlci4KKyAqIFRoaXMgaXMgYSBnb29kIGZ1bmN0aW9uIHRvIGNhbGwgdG8gdGVzdCBzbWFsbCBzdHJ1Y3R1cmVzLgorICogSU4gc3RydWN0IHNtYWxsX3JlcF9pbmZvX3QgIHN0cnVjdDEKKyAqIElOIHN0cnVjdCBzbWFsbF9yZXBfaW5mb190ICBzdHJ1Y3QyCisgKiBJTiBzdHJ1Y3Qgc21hbGxfcmVwX2luZm9fdCAgc3RydWN0MworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHByaW50X3N0cnVjdF9yZXAoIHN0cnVjdDEsIHN0cnVjdDIsIHN0cnVjdDMpCisgICAgIHN0cnVjdCBzbWFsbF9yZXBfaW5mb190IHN0cnVjdDE7CisgICAgIHN0cnVjdCBzbWFsbF9yZXBfaW5mb190IHN0cnVjdDI7CisgICAgIHN0cnVjdCBzbWFsbF9yZXBfaW5mb190IHN0cnVjdDM7CisKK3sKKworCisgIHByaW50ZigiQ29udGVudHMgb2Ygc3RydWN0MTogXG5cbiIpOworICBwcmludGYoIiUxMGQlMTBkXG4iLCBzdHJ1Y3QxLnZhbHVlLCBzdHJ1Y3QxLmhlYWQpOyAKKyAgcHJpbnRmKCJDb250ZW50cyBvZiBzdHJ1Y3QyOiBcblxuIik7CisgIHByaW50ZigiJTEwZCUxMGRcbiIsIHN0cnVjdDIudmFsdWUsIHN0cnVjdDIuaGVhZCk7IAorICBwcmludGYoIkNvbnRlbnRzIG9mIHN0cnVjdDM6IFxuXG4iKTsKKyAgcHJpbnRmKCIlMTBkJTEwZFxuIiwgc3RydWN0My52YWx1ZSwgc3RydWN0My5oZWFkKTsgCisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTVU1fU1RSVUNUX1BSSU5UIDogCisgKiBUaGUgbGFzdCB0d28gcGFyYW1ldGVycyBtdXN0IGdvIG9udG8gdGhlIHN0YWNrIHJhdGhlciB0aGFuIGludG8gYSByZWdpc3Rlci4KKyAqIFRoaXMgaXMgYSBnb29kIGZ1bmN0aW9uIHRvIGNhbGwgdG8gdGVzdCBzbWFsbCBzdHJ1Y3R1cmVzLgorICogSU4gc3RydWN0IHNtYWxsX3JlcF9pbmZvX3QgIHN0cnVjdDEKKyAqIElOIHN0cnVjdCBzbWFsbF9yZXBfaW5mb190ICBzdHJ1Y3QyCisgKiBJTiBzdHJ1Y3Qgc21hbGxfcmVwX2luZm9fdCAgc3RydWN0MworICogSU4gc3RydWN0IHNtYWxsX3JlcF9pbmZvX3QgIHN0cnVjdDQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzdW1fc3RydWN0X3ByaW50ICggc2VlZCwgc3RydWN0MSwgc3RydWN0Miwgc3RydWN0Mywgc3RydWN0NCkgCisgICAgIGludCBzZWVkOworICAgICBzdHJ1Y3Qgc21hbGxfcmVwX2luZm9fdCBzdHJ1Y3QxOworICAgICBzdHJ1Y3Qgc21hbGxfcmVwX2luZm9fdCBzdHJ1Y3QyOyAKKyAgICAgc3RydWN0IHNtYWxsX3JlcF9pbmZvX3Qgc3RydWN0MzsgCisgICAgIHN0cnVjdCBzbWFsbF9yZXBfaW5mb190IHN0cnVjdDQ7IAorCit7CisgICAgIGludCBzdW07CisKKyAgICAgcHJpbnRmKCJTdW0gb2YgdGhlIDQgc3RydWN0IHZhbHVlcyBhbmQgc2VlZCA6IFxuXG4iKTsKKyAgICAgc3VtID0gc2VlZCArIHN0cnVjdDEudmFsdWUgKyBzdHJ1Y3QyLnZhbHVlICsgc3RydWN0My52YWx1ZSArIHN0cnVjdDQudmFsdWU7CisgICAgIHByaW50ZigiJTEwZFxuIiwgc3VtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQUklOVF9TTUFMTF9TVFJVQ1RTIDogCisgKiBUaGlzIGlzIGEgZ29vZCBmdW5jdGlvbiB0byBjYWxsIHRvIHRlc3Qgc21hbGwgc3RydWN0dXJlcy4KKyAqIEFsbCBvZiB0aGUgc21hbGwgc3RydWN0dXJlcyBvZiBvZGQgc2l6ZXMgKDQwIGJpdHMsIDhiaXRzLCBldGMuKQorICogYXJlIHB1c2hlZCBvbnRvIHRoZSBzdGFjay4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmludF9zbWFsbF9zdHJ1Y3RzICggc3RydWN0MSwgc3RydWN0Miwgc3RydWN0MywgIHN0cnVjdDQsIGZsYWdzLCAKK2ZsYWdzX2NvbWJvLCB0aHJlZV9jaGFyLCBmaXZlX2NoYXIsIGludF9jaGFyX2NvbWJvLCBkMSwgZDIsZDMsZjEsZjIsZjMpCisgICAgIHN0cnVjdCBzbWFsbF9yZXBfaW5mb190ICBzdHJ1Y3QxOworICAgICBzdHJ1Y3Qgc21hbGxfcmVwX2luZm9fdCAgc3RydWN0MjsKKyAgICAgc3RydWN0IHNtYWxsX3JlcF9pbmZvX3QgIHN0cnVjdDM7CisgICAgIHN0cnVjdCBzbWFsbF9yZXBfaW5mb190ICBzdHJ1Y3Q0OworICAgICBzdHJ1Y3QgYml0X2ZsYWdzX3QgICAgICAgZmxhZ3M7CisgICAgIHN0cnVjdCBiaXRfZmxhZ3NfY29tYm9fdCBmbGFnc19jb21ibzsKKyAgICAgc3RydWN0IHRocmVlX2NoYXJfdCAgICAgIHRocmVlX2NoYXI7CisgICAgIHN0cnVjdCBmaXZlX2NoYXJfdCAgICAgICBmaXZlX2NoYXI7CisgICAgIHN0cnVjdCBpbnRfY2hhcl9jb21ib190ICBpbnRfY2hhcl9jb21ibzsKKyAgICAgc3RydWN0IG9uZV9kb3VibGVfdCAgICAgIGQxOworICAgICBzdHJ1Y3Qgb25lX2RvdWJsZV90ICAgICAgZDI7CisgICAgIHN0cnVjdCBvbmVfZG91YmxlX3QgICAgICBkMzsKKyAgICAgc3RydWN0IHR3b19mbG9hdHNfdCAgICAgIGYxOworICAgICBzdHJ1Y3QgdHdvX2Zsb2F0c190ICAgICAgZjI7CisgICAgIHN0cnVjdCB0d29fZmxvYXRzX3QgICAgICBmMzsKK3sKKyAgIHByaW50X2JpdF9mbGFncyhmbGFncyk7CisgICBwcmludF9iaXRfZmxhZ3NfY29tYm8oZmxhZ3NfY29tYm8pOworICAgcHJpbnRfdGhyZWVfY2hhcnModGhyZWVfY2hhcik7CisgICBwcmludF9maXZlX2NoYXJzKGZpdmVfY2hhcik7CisgICBwcmludF9pbnRfY2hhcl9jb21ibyhpbnRfY2hhcl9jb21ibyk7CisgICBzdW1fc3RydWN0X3ByaW50KDEwLCBzdHJ1Y3QxLCBzdHJ1Y3QyLCBzdHJ1Y3QzLCBzdHJ1Y3Q0KTsKKyAgIHByaW50X3N0cnVjdF9yZXAoc3RydWN0MSwgc3RydWN0Miwgc3RydWN0Myk7CisgICBwcmludF9vbmVfZG91YmxlKGQxKTsKKyAgIHByaW50X29uZV9kb3VibGUoZDIpOworICAgcHJpbnRfb25lX2RvdWJsZShkMyk7CisgICBwcmludF90d29fZmxvYXRzKGYxKTsKKyAgIHByaW50X3R3b19mbG9hdHMoZjIpOworICAgcHJpbnRfdHdvX2Zsb2F0cyhmMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUFJJTlRfTE9OR19BUkdfTElTVCA6IAorICogVGhpcyBpcyBhIGdvb2QgZnVuY3Rpb24gdG8gY2FsbCB0byB0ZXN0IHNtYWxsIHN0cnVjdHVyZXMuCisgKiBUaGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgKCB0aGUgZG91YmxlcyApIGdvIGludG8gcmVnaXN0ZXJzLiBUaGUKKyAqIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHB1c2hlZCBvbnRvIHRoZSBzdGFjay4gRGVwZW5kaW5nIG9uIHdoZXJlCisgKiBwcmludF9sb25nX2FyZ19saXN0IGlzIGNhbGxlZCBmcm9tLCB0aGUgc2l6ZSBvZiB0aGUgYXJndW1lbnQgbGlzdCAKKyAqIG1heSBmb3JjZSBtb3JlIHNwYWNlIHRvIGJlIHB1c2hlZCBvbnRvIHRoZSBzdGFjayBhcyBwYXJ0IG9mIHRoZSBjYWxsZXJzCisgKiBmcmFtZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwcmludF9sb25nX2FyZ19saXN0ICggYSwgYiwgYywgZCwgZSwgZiwgc3RydWN0MSwgc3RydWN0Miwgc3RydWN0MywgCitzdHJ1Y3Q0LCBmbGFncywgZmxhZ3NfY29tYm8sIHRocmVlX2NoYXIsIGZpdmVfY2hhciwgaW50X2NoYXJfY29tYm8sIGQxLGQyLGQzLAorZjEsIGYyLCBmMyApCisgICAgIGRvdWJsZSBhOworICAgICBkb3VibGUgYjsKKyAgICAgaW50IGM7CisgICAgIGludCBkOworICAgICBpbnQgZTsKKyAgICAgaW50IGY7CisgICAgIHN0cnVjdCBzbWFsbF9yZXBfaW5mb190ICBzdHJ1Y3QxOworICAgICBzdHJ1Y3Qgc21hbGxfcmVwX2luZm9fdCAgc3RydWN0MjsKKyAgICAgc3RydWN0IHNtYWxsX3JlcF9pbmZvX3QgIHN0cnVjdDM7CisgICAgIHN0cnVjdCBzbWFsbF9yZXBfaW5mb190ICBzdHJ1Y3Q0OworICAgICBzdHJ1Y3QgYml0X2ZsYWdzX3QgICAgICAgZmxhZ3M7CisgICAgIHN0cnVjdCBiaXRfZmxhZ3NfY29tYm9fdCBmbGFnc19jb21ibzsKKyAgICAgc3RydWN0IHRocmVlX2NoYXJfdCAgICAgIHRocmVlX2NoYXI7CisgICAgIHN0cnVjdCBmaXZlX2NoYXJfdCAgICAgICBmaXZlX2NoYXI7CisgICAgIHN0cnVjdCBpbnRfY2hhcl9jb21ib190ICBpbnRfY2hhcl9jb21ibzsKKyAgICAgc3RydWN0IG9uZV9kb3VibGVfdCAgICAgIGQxOworICAgICBzdHJ1Y3Qgb25lX2RvdWJsZV90ICAgICAgZDI7CisgICAgIHN0cnVjdCBvbmVfZG91YmxlX3QgICAgICBkMzsKKyAgICAgc3RydWN0IHR3b19mbG9hdHNfdCAgICAgIGYxOworICAgICBzdHJ1Y3QgdHdvX2Zsb2F0c190ICAgICAgZjI7CisgICAgIHN0cnVjdCB0d29fZmxvYXRzX3QgICAgICBmMzsKKworeworICAgIHByaW50ZigiZG91YmxlIDogJWZcbiIsIGEpOworICAgIHByaW50ZigiZG91YmxlIDogJWZcbiIsIGIpOworICAgIHByaW50ZigiaW50IDogJWRcbiIsIGMpOworICAgIHByaW50ZigiaW50IDogJWRcbiIsIGQpOworICAgIHByaW50ZigiaW50IDogJWRcbiIsIGUpOworICAgIHByaW50ZigiaW50IDogJWRcbiIsIGYpOworICAgIHByaW50X3NtYWxsX3N0cnVjdHMoIHN0cnVjdDEsIHN0cnVjdDIsIHN0cnVjdDMsIHN0cnVjdDQsIGZsYWdzLCBmbGFnc19jb21ibywKKwkJCSB0aHJlZV9jaGFyLCBmaXZlX2NoYXIsIGludF9jaGFyX2NvbWJvLCBkMSwgZDIsIGQzLCAKKwkJCSBmMSwgZjIsIGYzKTsKK30KKworCit2b2lkIHByaW50X29uZV9sYXJnZV9zdHJ1Y3QoIGxpbmtlZF9saXN0MSApCisgICAgIHN0cnVjdCBhcnJheV9yZXBfaW5mb190IGxpbmtlZF9saXN0MTsKKworeworCisgLyogcHJpbnRmKCJDb250ZW50cyBvZiBsaW5rZWQgbGlzdDE6IFxuXG4iKTsKKyAgcHJpbnRmKCJFbGVtZW50IFZhbHVlIHwgSW5kZXggb2YgTmV4dCBFbGVtZW50XG4iKTsKKyAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgXG4iKTsqLworICAvKmZvciAoaW5kZXggPSAwOyBpbmRleCA8IDEwOyBpbmRleCsrKSB7Ki8KKworICAgICAgcHJpbnRmKCIlMTBkJTEwZFxuIiwgbGlua2VkX2xpc3QxLnZhbHVlc1swXSwgCisJCQkgICBsaW5rZWRfbGlzdDEubmV4dF9pbmRleFswXSk7IAorICAvKn0qLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBSSU5UX0FSUkFZX1JFUCA6IAorICogVGhlIHRocmVlIHN0cnVjdHVyZSBwYXJhbWV0ZXJzIHNob3VsZCBmaXQgaW50byByZWdpc3RlcnMuIAorICogSU4gc3RydWN0IGFycmF5X3JlcF9pbmZvX3QgbGlua2VkX2xpc3QxCisgKiBJTiBzdHJ1Y3QgYXJyYXlfcmVwX2luZm9fdCBsaW5rZWRfbGlzdDIKKyAqIElOIHN0cnVjdCBhcnJheV9yZXBfaW5mb190IGxpbmtlZF9saXN0MworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHByaW50X2FycmF5X3JlcCggbGlua2VkX2xpc3QxLCBsaW5rZWRfbGlzdDIsIGxpbmtlZF9saXN0MyApCisgICAgIHN0cnVjdCBhcnJheV9yZXBfaW5mb190IGxpbmtlZF9saXN0MTsKKyAgICAgc3RydWN0IGFycmF5X3JlcF9pbmZvX3QgbGlua2VkX2xpc3QyOworICAgICBzdHJ1Y3QgYXJyYXlfcmVwX2luZm9fdCBsaW5rZWRfbGlzdDM7CisKK3sKKworICBpbnQgaW5kZXg7CisKKyAgcHJpbnRmKCJDb250ZW50cyBvZiBsaW5rZWQgbGlzdDE6IFxuXG4iKTsKKyAgcHJpbnRmKCJFbGVtZW50IFZhbHVlIHwgSW5kZXggb2YgTmV4dCBFbGVtZW50XG4iKTsKKyAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMTA7IGluZGV4KyspIHsKKworICAgICAgcHJpbnRmKCIlMTBkJTEwZFxuIiwgbGlua2VkX2xpc3QxLnZhbHVlc1tpbmRleF0sIAorCQkJICAgbGlua2VkX2xpc3QxLm5leHRfaW5kZXhbaW5kZXhdKTsgCisgIH0KKworICBwcmludGYoIkNvbnRlbnRzIG9mIGxpbmtlZCBsaXN0MjogXG5cbiIpOworICBwcmludGYoIkVsZW1lbnQgVmFsdWUgfCBJbmRleCBvZiBOZXh0IEVsZW1lbnRcbiIpOworICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBcbiIpOworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAxMDsgaW5kZXgrKykgeworCisgICAgICBwcmludGYoIiUxMGQlMTBkXG4iLCBsaW5rZWRfbGlzdDIudmFsdWVzW2luZGV4XSwgCisJCQkgICBsaW5rZWRfbGlzdDIubmV4dF9pbmRleFtpbmRleF0pOyAKKyAgfQorCisgIHByaW50ZigiQ29udGVudHMgb2YgbGlua2VkIGxpc3QzOiBcblxuIik7CisgIHByaW50ZigiRWxlbWVudCBWYWx1ZSB8IEluZGV4IG9mIE5leHQgRWxlbWVudFxuIik7CisgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFxuIik7CisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDEwOyBpbmRleCsrKSB7CisKKyAgICAgIHByaW50ZigiJTEwZCUxMGRcbiIsIGxpbmtlZF9saXN0My52YWx1ZXNbaW5kZXhdLCAKKwkJCSAgIGxpbmtlZF9saXN0My5uZXh0X2luZGV4W2luZGV4XSk7IAorICB9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTVU1fQVJSQVlfUFJJTlQgOiAKKyAqIFRoZSBsYXN0IHN0cnVjdHVyZSBwYXJhbWV0ZXIgbXVzdCBiZSBwdXNoZWQgb250byB0aGUgc3RhY2sgCisgKiBJTiBpbnQgICAgc2VlZAorICogSU4gc3RydWN0IGFycmF5X3JlcF9pbmZvX3QgbGlua2VkX2xpc3QxCisgKiBJTiBzdHJ1Y3QgYXJyYXlfcmVwX2luZm9fdCBsaW5rZWRfbGlzdDIKKyAqIElOIHN0cnVjdCBhcnJheV9yZXBfaW5mb190IGxpbmtlZF9saXN0MworICogSU4gc3RydWN0IGFycmF5X3JlcF9pbmZvX3QgbGlua2VkX2xpc3Q0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc3VtX2FycmF5X3ByaW50ICggc2VlZCwgbGlua2VkX2xpc3QxLCBsaW5rZWRfbGlzdDIsIGxpbmtlZF9saXN0MyxsaW5rZWRfbGlzdDQpCisgICAgIGludCBzZWVkOworICAgICBzdHJ1Y3QgYXJyYXlfcmVwX2luZm9fdCBsaW5rZWRfbGlzdDE7CisgICAgIHN0cnVjdCBhcnJheV9yZXBfaW5mb190IGxpbmtlZF9saXN0MjsKKyAgICAgc3RydWN0IGFycmF5X3JlcF9pbmZvX3QgbGlua2VkX2xpc3QzOworICAgICBzdHJ1Y3QgYXJyYXlfcmVwX2luZm9fdCBsaW5rZWRfbGlzdDQ7CisKK3sKKyAgICAgaW50IGluZGV4OworICAgICBpbnQgc3VtOworCisgICAgIHByaW50ZigiU3VtIG9mIDQgYXJyYXlzLCBieSBlbGVtZW50IChhZGQgaW4gc2VlZCBhcyB3ZWxsKTogXG5cbiIpOworICAgICBwcmludGYoIlNlZWQ6ICVkXG4iLCBzZWVkKTsKKyAgICAgcHJpbnRmKCJFbGVtZW50IEluZGV4IHwgU3VtIFxuIik7CisgICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgIHByaW50ZigiICAgICAgICAgICAgICB8ICAgICAgICAgIFxuIik7CisKKyAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMTA7IGluZGV4KyspIHsKKworICAgICAgICAgc3VtID0gc2VlZCArIGxpbmtlZF9saXN0MS52YWx1ZXNbaW5kZXhdICsgbGlua2VkX2xpc3QyLnZhbHVlc1tpbmRleF0gKworCSAgICAgICBsaW5rZWRfbGlzdDMudmFsdWVzW2luZGV4XSArIGxpbmtlZF9saXN0NC52YWx1ZXNbaW5kZXhdOworICAgICAgICAgcHJpbnRmKCIlMTBkJTEwZFxuIiwgaW5kZXgsIHN1bSk7CisgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTklUX0FSUkFZX1JFUCA6IAorICogSU4gc3RydWN0IGFycmF5X3JlcF9pbmZvX3QgKmxpbmtlZF9saXN0CisgKiBJTiBpbnQgICAgc2VlZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGluaXRfYXJyYXlfcmVwKCBsaW5rZWRfbGlzdCwgc2VlZCApCisgICAgIHN0cnVjdCBhcnJheV9yZXBfaW5mb190ICpsaW5rZWRfbGlzdDsKKyAgICAgaW50ICAgIHNlZWQ7CisKK3sKKworICBpbnQgaW5kZXg7CisKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMTA7IGluZGV4KyspIHsKKworICAgICAgbGlua2VkX2xpc3QtPnZhbHVlc1tpbmRleF0gPSAoMippbmRleCkgKyAoc2VlZCoyKTsgCisgICAgICBsaW5rZWRfbGlzdC0+bmV4dF9pbmRleFtpbmRleF0gPSBpbmRleCArIDE7CisgIH0KKyAgbGlua2VkX2xpc3QtPmhlYWQgPSAwOyAKK30KKworCitpbnQgbWFpbiAoKSAgeworCisgIC8qIHZhcmlhYmxlcyBmb3IgYXJyYXkgYW5kIGVudW1lcmF0ZWQgdHlwZSB0ZXN0aW5nCisgICAqLworICBjaGFyICAgICBjaGFyX2FycmF5WzEyMV07CisgIGRvdWJsZSAgIGRvdWJsZV9hcnJheVsxMDBdOworICBmbG9hdCAgICBmbG9hdF9hcnJheVsxNV07CisgIGludCAgICAgIGludGVnZXJfYXJyYXlbNTBdOyAKKyAgaW50ICAgICAgaW5kZXg7CisgIGlkX2ludCAgIHN0dWRlbnRfaWQgPSAyMzsKKyAgY29sb3JzICAgbXlfc2hpcnQgPSBZRUxMT1c7CisgICAgCisgIC8qIHZhcmlhYmxlcyBmb3IgbGFyZ2Ugc3RydWN0dXJlIHRlc3RpbmcKKyAgICovCisgIGludCBudW1iZXIgPSAxMDsKKyAgc3RydWN0IGFycmF5X3JlcF9pbmZvX3QgKmxpc3QxOworICBzdHJ1Y3QgYXJyYXlfcmVwX2luZm9fdCAqbGlzdDI7CisgIHN0cnVjdCBhcnJheV9yZXBfaW5mb190ICpsaXN0MzsKKyAgc3RydWN0IGFycmF5X3JlcF9pbmZvX3QgKmxpc3Q0OworCisgIC8qIHZhcmlhYmxlcyBmb3IgdGVzdGluZyBhIHZlcnkgbG9uZyBhcmd1bWVudCBsaXN0CisgICAqLworICAgZG91YmxlICAgICAgICAgICAgICAgICAgICBhOworICAgZG91YmxlICAgICAgICAgICAgICAgICAgICBiOworICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBjOworICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBkOworICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBlOworICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBmOworCisgIC8qIHZhcmlhYmxlcyBmb3IgdGVzdGluZyBhIHNtYWxsIHN0cnVjdHVyZXMgYW5kIGEgdmVyeSBsb25nIGFyZ3VtZW50IGxpc3QKKyAgICovCisgICBzdHJ1Y3Qgc21hbGxfcmVwX2luZm9fdCAgKnN0cnVjdDE7CisgICBzdHJ1Y3Qgc21hbGxfcmVwX2luZm9fdCAgKnN0cnVjdDI7CisgICBzdHJ1Y3Qgc21hbGxfcmVwX2luZm9fdCAgKnN0cnVjdDM7CisgICBzdHJ1Y3Qgc21hbGxfcmVwX2luZm9fdCAgKnN0cnVjdDQ7CisgICBzdHJ1Y3QgYml0X2ZsYWdzX3QgICAgICAgKmZsYWdzOworICAgc3RydWN0IGJpdF9mbGFnc19jb21ib190ICpmbGFnc19jb21ibzsKKyAgIHN0cnVjdCB0aHJlZV9jaGFyX3QgICAgICAqdGhyZWVfY2hhcjsKKyAgIHN0cnVjdCBmaXZlX2NoYXJfdCAgICAgICAqZml2ZV9jaGFyOworICAgc3RydWN0IGludF9jaGFyX2NvbWJvX3QgICppbnRfY2hhcl9jb21ibzsKKyAgIHN0cnVjdCBvbmVfZG91YmxlX3QgICAgICAqZDE7CisgICBzdHJ1Y3Qgb25lX2RvdWJsZV90ICAgICAgKmQyOworICAgc3RydWN0IG9uZV9kb3VibGVfdCAgICAgICpkMzsKKyAgIHN0cnVjdCB0d29fZmxvYXRzX3QgICAgICAqZjE7CisgICBzdHJ1Y3QgdHdvX2Zsb2F0c190ICAgICAgKmYyOworICAgc3RydWN0IHR3b19mbG9hdHNfdCAgICAgICpmMzsKKworICAvKiBJbml0aWFsaXplIGFycmF5cworICAgKi8KKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMTIwOyBpbmRleCsrKSB7CisgICAgICBpZiAoKGluZGV4JTIpID09IDApIGNoYXJfYXJyYXlbaW5kZXhdID0gJ1onOworCSBlbHNlIGNoYXJfYXJyYXlbaW5kZXhdID0gJ2EnOworICB9IC8qIGNhbGwtYXItc3QuZXhwIHVzZXMgbGluZSBudW1iZXJzIGV2ZXJ5d2hlcmUgKi8gY2hhcl9hcnJheVsxMjBdID0gJ1wwJzsKKworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAxMDA7IGluZGV4KyspIHsKKyAgICAgIGRvdWJsZV9hcnJheVtpbmRleF0gPSBpbmRleCoyMy40NTY3OworICB9CisKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMTU7IGluZGV4KyspIHsKKyAgICAgIGZsb2F0X2FycmF5W2luZGV4XSA9IGluZGV4LzcuMDI7CisgIH0KKworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA1MDsgaW5kZXgrKykgeworICAgICAgaW50ZWdlcl9hcnJheVtpbmRleF0gPSAtaW5kZXg7CisgIH0KKworICAvKiBQcmludCBhcnJheXMKKyAgICovCisgIHByaW50X2NoYXJfYXJyYXkoY2hhcl9hcnJheSk7CisgIHByaW50X2RvdWJsZV9hcnJheShkb3VibGVfYXJyYXkpOworICBwcmludF9mbG9hdF9hcnJheShmbG9hdF9hcnJheSk7CisgIHByaW50X3N0dWRlbnRfaWRfc2hpcnRfY29sb3Ioc3R1ZGVudF9pZCwgbXlfc2hpcnQpOyAKKyAgcHJpbnRfaW50X2FycmF5KGludGVnZXJfYXJyYXkpOworICBwcmludF9hbGxfYXJyYXlzKGludGVnZXJfYXJyYXksIGNoYXJfYXJyYXksIGZsb2F0X2FycmF5LCBkb3VibGVfYXJyYXkpOworCisgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBsYXJnZSBzdHJ1Y3R1cmVzIAorICAgKi8KKyAgbGlzdDEgPSAoc3RydWN0IGFycmF5X3JlcF9pbmZvX3QgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBhcnJheV9yZXBfaW5mb190KSk7CisgIGxpc3QyID0gKHN0cnVjdCBhcnJheV9yZXBfaW5mb190ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXJyYXlfcmVwX2luZm9fdCkpOworICBsaXN0MyA9IChzdHJ1Y3QgYXJyYXlfcmVwX2luZm9fdCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGFycmF5X3JlcF9pbmZvX3QpKTsKKyAgbGlzdDQgPSAoc3RydWN0IGFycmF5X3JlcF9pbmZvX3QgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBhcnJheV9yZXBfaW5mb190KSk7CisKKyAgLyogSW5pdGlhbGl6ZSBsYXJnZSBzdHJ1Y3R1cmVzIAorICAgKi8KKyAgaW5pdF9hcnJheV9yZXAobGlzdDEsIDIpOworICBpbml0X2FycmF5X3JlcChsaXN0MiwgNCk7CisgIGluaXRfYXJyYXlfcmVwKGxpc3QzLCA1KTsKKyAgaW5pdF9hcnJheV9yZXAobGlzdDQsIDEwKTsKKyAgcHJpbnRmKCJIRUxMTyBXT1JMRFxuIik7CisgIHByaW50ZigiQllFIEJZRSBGT1IgTk9XXG4iKTsKKyAgcHJpbnRmKCJWRVJZIEdSRUVOIEdSQVNTXG4iKTsKKworICAvKiBQcmludCBsYXJnZSBzdHJ1Y3R1cmVzIAorICAgKi8KKyAgc3VtX2FycmF5X3ByaW50KDEwLCAqbGlzdDEsICpsaXN0MiwgKmxpc3QzLCAqbGlzdDQpOworICBwcmludF9hcnJheV9yZXAoKmxpc3QxLCAqbGlzdDIsICpsaXN0Myk7CisgIHByaW50X29uZV9sYXJnZV9zdHJ1Y3QoKmxpc3QxKTsKKworICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3Igc21hbGwgc3RydWN0dXJlcyAKKyAgICovCisgIHN0cnVjdDEgICAgID0gKHN0cnVjdCBzbWFsbF9yZXBfaW5mb190ICAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNtYWxsX3JlcF9pbmZvX3QpKTsKKyAgc3RydWN0MiAgICAgPSAoc3RydWN0IHNtYWxsX3JlcF9pbmZvX3QgICopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc21hbGxfcmVwX2luZm9fdCkpOworICBzdHJ1Y3QzICAgICA9IChzdHJ1Y3Qgc21hbGxfcmVwX2luZm9fdCAgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbWFsbF9yZXBfaW5mb190KSk7CisgIHN0cnVjdDQgICAgID0gKHN0cnVjdCBzbWFsbF9yZXBfaW5mb190ICAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNtYWxsX3JlcF9pbmZvX3QpKTsKKyAgZmxhZ3MgICAgICAgPSAoc3RydWN0IGJpdF9mbGFnc190ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgYml0X2ZsYWdzX3QpKTsKKyAgZmxhZ3NfY29tYm8gPSAoc3RydWN0IGJpdF9mbGFnc19jb21ib190ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgYml0X2ZsYWdzX2NvbWJvX3QpKTsKKyAgdGhyZWVfY2hhciAgPSAoc3RydWN0IHRocmVlX2NoYXJfdCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHRocmVlX2NoYXJfdCkpOworICBmaXZlX2NoYXIgICA9IChzdHJ1Y3QgZml2ZV9jaGFyX3QgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBmaXZlX2NoYXJfdCkpOworICBpbnRfY2hhcl9jb21ibyA9IChzdHJ1Y3QgaW50X2NoYXJfY29tYm9fdCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGludF9jaGFyX2NvbWJvX3QpKTsKKworICBkMSA9IChzdHJ1Y3Qgb25lX2RvdWJsZV90ICopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb25lX2RvdWJsZV90KSk7CisgIGQyID0gKHN0cnVjdCBvbmVfZG91YmxlX3QgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBvbmVfZG91YmxlX3QpKTsKKyAgZDMgPSAoc3RydWN0IG9uZV9kb3VibGVfdCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IG9uZV9kb3VibGVfdCkpOworCisgIGYxID0gKHN0cnVjdCB0d29fZmxvYXRzX3QgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCB0d29fZmxvYXRzX3QpKTsKKyAgZjIgPSAoc3RydWN0IHR3b19mbG9hdHNfdCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHR3b19mbG9hdHNfdCkpOworICBmMyA9IChzdHJ1Y3QgdHdvX2Zsb2F0c190ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHdvX2Zsb2F0c190KSk7CisKKyAgLyogSW5pdGlhbGl6ZSBzbWFsbCBzdHJ1Y3R1cmVzIAorICAgKi8KKyAgaW5pdF9zbWFsbF9zdHJ1Y3RzICggc3RydWN0MSwgc3RydWN0Miwgc3RydWN0Mywgc3RydWN0NCwgZmxhZ3MsIAorCQkgICAgICAgZmxhZ3NfY29tYm8sIHRocmVlX2NoYXIsIGZpdmVfY2hhciwgaW50X2NoYXJfY29tYm8sCisJCSAgICAgICBkMSwgZDIsIGQzLCBmMSwgZjIsIGYzKTsKKworICAvKiBQcmludCBzbWFsbCBzdHJ1Y3R1cmVzIAorICAgKi8KKyAgcHJpbnRfc21hbGxfc3RydWN0cyAoICpzdHJ1Y3QxLCAqc3RydWN0MiwgKnN0cnVjdDMsICpzdHJ1Y3Q0LCAqZmxhZ3MsIAorCQkJKmZsYWdzX2NvbWJvLCAqdGhyZWVfY2hhciwgKmZpdmVfY2hhciwgKmludF9jaGFyX2NvbWJvLAorCQkJKmQxLCAqZDIsICpkMywgKmYxLCAqZjIsICpmMyk7CisKKyAgLyogUHJpbnQgYSB2ZXJ5IGxvbmcgYXJnIGxpc3QgCisgICAqLworICBhID0gMjIuMjI7CisgIGIgPSAzMy4zMzM7CisgIGMgPSAwOworICBkID0gLTI1OworICBlID0gMTAwOworICBmID0gMjM0NTsKKworICBwcmludF9sb25nX2FyZ19saXN0ICggYSwgYiwgYywgZCwgZSwgZiwgKnN0cnVjdDEsICpzdHJ1Y3QyLCAqc3RydWN0MywgKnN0cnVjdDQsIAorCQkJKmZsYWdzLCAqZmxhZ3NfY29tYm8sICp0aHJlZV9jaGFyLCAqZml2ZV9jaGFyLCAqaW50X2NoYXJfY29tYm8sCisJCQkqZDEsICpkMiwgKmQzLCAqZjEsICpmMiwgKmYzKTsKKworICAvKiBJbml0aWFsaXplIHNtYWxsIHN0cnVjdHVyZXMgCisgICAqLworICBpbml0X29uZV9kb3VibGUgKCBkMSwgMS4xMTExMSk7IAorICBpbml0X29uZV9kb3VibGUgKCBkMiwgLTM0NS4zNCk7IAorICBpbml0X29uZV9kb3VibGUgKCBkMywgNTQ2NDY0LjIpOyAKKyAgaW5pdF90d29fZmxvYXRzICggZjEsIDAuMjM0LCA0NTMuMSk7IAorICBpbml0X3R3b19mbG9hdHMgKCBmMiwgNzguMzQ1LCAyMy4wOSk7IAorICBpbml0X3R3b19mbG9hdHMgKCBmMywgLTIuMzQ1LCAxLjApOyAKKyAgaW5pdF9iaXRfZmxhZ3MoZmxhZ3MsICh1bnNpZ25lZCkxLCAodW5zaWduZWQpMCwgKHVuc2lnbmVkKTEsIAorCQkgKHVuc2lnbmVkKTAsICh1bnNpZ25lZCkxLCAodW5zaWduZWQpMCApOyAKKyAgaW5pdF9iaXRfZmxhZ3NfY29tYm8oZmxhZ3NfY29tYm8sICh1bnNpZ25lZCkxLCAodW5zaWduZWQpMCwgJ3knLAorCQkJCSAgICAgKHVuc2lnbmVkKTEsICh1bnNpZ25lZCkwLCAnbicsCisJCQkJICAgICAodW5zaWduZWQpMSwgKHVuc2lnbmVkKTAgKTsgCisgIGluaXRfdGhyZWVfY2hhcnModGhyZWVfY2hhciwgJ3gnLCAneScsICd6Jyk7CisgIGluaXRfZml2ZV9jaGFycyhmaXZlX2NoYXIsICdoJywgJ2UnLCAnbCcsICdsJywgJ28nKTsKKyAgaW5pdF9pbnRfY2hhcl9jb21ibyhpbnRfY2hhcl9jb21ibywgMTMsICchJyk7CisgIGluaXRfc3RydWN0X3JlcChzdHJ1Y3QxLCAxMCk7CisgIGluaXRfc3RydWN0X3JlcChzdHJ1Y3QyLCAyMCk7CisgIGluaXRfc3RydWN0X3JlcChzdHJ1Y3QzLCAzMCk7CisgIGluaXRfc3RydWN0X3JlcChzdHJ1Y3Q0LCA0MCk7CisKKyAgY29tcHV0ZV93aXRoX3NtYWxsX3N0cnVjdHMoMzUpOworICBsb29wX2NvdW50KCk7CisgIHByaW50ZigiSEVMTE8gV09STERcbiIpOworICBwcmludGYoIkJZRSBCWUUgRk9SIE5PV1xuIik7CisgIHByaW50ZigiVkVSWSBHUkVFTiBHUkFTU1xuIik7CisKKyAgLyogUHJpbnQgc21hbGwgc3RydWN0dXJlcyAKKyAgICovCisgIHByaW50X29uZV9kb3VibGUoKmQxKTsKKyAgcHJpbnRfb25lX2RvdWJsZSgqZDIpOworICBwcmludF9vbmVfZG91YmxlKCpkMyk7CisgIHByaW50X3R3b19mbG9hdHMoKmYxKTsKKyAgcHJpbnRfdHdvX2Zsb2F0cygqZjIpOworICBwcmludF90d29fZmxvYXRzKCpmMyk7CisgIHByaW50X2JpdF9mbGFncygqZmxhZ3MpOworICBwcmludF9iaXRfZmxhZ3NfY29tYm8oKmZsYWdzX2NvbWJvKTsKKyAgcHJpbnRfdGhyZWVfY2hhcnMoKnRocmVlX2NoYXIpOworICBwcmludF9maXZlX2NoYXJzKCpmaXZlX2NoYXIpOworICBwcmludF9pbnRfY2hhcl9jb21ibygqaW50X2NoYXJfY29tYm8pOworICBzdW1fc3RydWN0X3ByaW50KDEwLCAqc3RydWN0MSwgKnN0cnVjdDIsICpzdHJ1Y3QzLCAqc3RydWN0NCk7CisgIHByaW50X3N0cnVjdF9yZXAoKnN0cnVjdDEsICpzdHJ1Y3QyLCAqc3RydWN0Myk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworCisKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jYWxsLWFyLXN0LmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY2FsbC1hci1zdC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlZDRmZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY2FsbC1hci1zdC5leHAKQEAgLTAsMCArMSw0NTEgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTgKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRWxlbmEgWmFubm9uaSAoZXphbm5vbmlAY3lnbnVzLmNvbSkKKworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgImNhbGwtYXItc3QiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisKKyMgQ3JlYXRlIGFuZCBzb3VyY2UgdGhlIGZpbGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIKKyMgdXNlZCB0byBjb21waWxlIHRoZSB0ZXN0IGNhc2UuCisKK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9XSB7CisgICAgcmV0dXJuIC0xOworfQorCisjIFRoZSBhMjlrIGNhbid0IGNhbGwgZnVuY3Rpb25zLCBzbyBkb24ndCBldmVuIGJvdGhlciB3aXRoIHRoaXMgdGVzdC4KK2lmIFt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiLGNhbm5vdF9jYWxsX2Z1bmN0aW9uc10geworICAgIHNldHVwX3hmYWlsICIqLSotKiIgMjQxNgorICAgIGZhaWwgIlRoaXMgdGFyZ2V0IGNhbiBub3QgY2FsbCBmdW5jdGlvbnMiCisgICAgY29udGludWUKK30KKworIyBTZXQgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgdG8gQy4gIFRoaXMgY291bnRzIGFzIGEgdGVzdC4gIElmIGl0CisjIGZhaWxzLCB0aGVuIHdlIHNraXAgdGhlIG90aGVyIHRlc3RzLgorCitwcm9jIHNldF9sYW5nX2Mge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBzZW5kX2dkYiAic2V0IGxhbmd1YWdlIGNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIge30KKwl0aW1lb3V0IHsgZmFpbCAic2V0IGxhbmd1YWdlIGMgKHRpbWVvdXQpIiA7IHJldHVybiAwOyB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInNob3cgbGFuZ3VhZ2VcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qIHNvdXJjZSBsYW5ndWFnZSBpcyBcImNcIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJzZXQgbGFuZ3VhZ2UgdG8gXCJjXCIiCisJICAgIHJldHVybiAxCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInNldHRpbmcgbGFuZ3VhZ2UgdG8gXCJjXCIiCisJICAgIHJldHVybiAwCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJjYW4ndCBzaG93IGxhbmd1YWdlICh0aW1lb3V0KSIKKwkgICAgcmV0dXJuIDAKKwl9CisgICAgfQorfQorCisKK3NvdXJjZSAke2JpbmZpbGV9LmNpCisKKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KK3NlbmRfZ2RiICJzZXQgcHJpbnQgc2V2ZW5iaXQtc3RyaW5nc1xuIiA7IGdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIgorc2VuZF9nZGIgInNldCBwcmludCBhZGRyZXNzIG9mZlxuIiA7IGdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIgorc2VuZF9nZGIgInNldCB3aWR0aCAwXG4iIDsgZ2RiX2V4cGVjdCAtcmUgIiRnZGJfcHJvbXB0ICQiCisKKworaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgICBwZXJyb3IgImNvdWxkbid0IHJ1biB0byBicmVha3BvaW50IgorICAgIGNvbnRpbnVlCit9CisKKyNnbyAtdW50aWwgMTAwNworZ2RiX3Rlc3QgInRicmVhayAxMDA3IiBcCisgICAgIkJyZWFrcG9pbnQgXFswLTlcXSsuKmZpbGUuKiRzcmNmaWxlLCBsaW5lIDEwMDcuKiIgXAorICAgICJ0YnJlYWtwb2ludCBsaW5lIDEwMDciCisKK2dkYl90ZXN0IGNvbnRpbnVlIFwKKyJDb250aW51aW5nXFwuLiptYWluIFxcKFxcKSBhdC4qJHNyY2ZpbGU6MTAwNy4qIiBcCisicnVuIHVudGlsIGJyZWFrcG9pbnQgc2V0IGF0IGEgbGluZSIKKworCisjY2FsbCBwcmludF9kb3VibGVfYXJyYXkoZG91YmxlX2FycmF5KQorc2VuZF9nZGIgInByaW50IHByaW50X2RvdWJsZV9hcnJheShkb3VibGVfYXJyYXkpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgImFycmF5X2QgOlxbIFx0XHJcblxdKz09PT09PT09PVxbIFx0XHJcblxdK1xbIFx0XHJcblxdKzAuMDAwMDAwXFsgXHRcclxuXF0rMjMuNDU2NzAwICA0Ni45MTM0MDAgIDcwLjM3MDEwMCAgOTMuODI2ODAwICAxMTcuMjgzNTAwICAxNDAuNzQwMjAwICAxNjQuMTk2OTAwICAxODcuNjUzNjAwXFsgXHRcclxuXF0rMjExLjExMDMwMCAgMjM0LjU2NzAwMCAgMjU4LjAyMzcwMCAgMjgxLjQ4MDQwMCAgMzA0LjkzNzEwMCAgMzI4LjM5MzgwMCAgMzUxLjg1MDUwMCAgMzc1LjMwNzIwMFxbIFx0XHJcblxdKzM5OC43NjM5MDAgIDQyMi4yMjA2MDAgIDQ0NS42NzczMDAgIDQ2OS4xMzQwMDAgIDQ5Mi41OTA3MDAgIDUxNi4wNDc0MDAgIDUzOS41MDQxMDAgIDU2Mi45NjA4MDBcWyBcdFxyXG5cXSs1ODYuNDE3NTAwICA2MDkuODc0MjAwICA2MzMuMzMwOTAwICA2NTYuNzg3NjAwICA2ODAuMjQ0MzAwICA3MDMuNzAxMDAwICA3MjcuMTU3NzAwICA3NTAuNjE0NDAwXFsgXHRcclxuXF0rNzc0LjA3MTEwMCAgNzk3LjUyNzgwMCAgODIwLjk4NDUwMCAgODQ0LjQ0MTIwMCAgODY3Ljg5NzkwMCAgODkxLjM1NDYwMCAgOTE0LjgxMTMwMCAgOTM4LjI2ODAwMFxbIFx0XHJcblxdKzk2MS43MjQ3MDAgIDk4NS4xODE0MDAgIDEwMDguNjM4MTAwICAxMDMyLjA5NDgwMCAgMTA1NS41NTE1MDAgIDEwNzkuMDA4MjAwICAxMTAyLjQ2NDkwMCAgMTEyNS45MjE2MDBcWyBcdFxyXG5cXSsxMTQ5LjM3ODMwMCAgMTE3Mi44MzUwMDAgIDExOTYuMjkxNzAwICAxMjE5Ljc0ODQwMCAgMTI0My4yMDUxMDAgIDEyNjYuNjYxODAwICAxMjkwLjExODUwMCAgMTMxMy41NzUyMDBcWyBcdFxyXG5cXSsxMzM3LjAzMTkwMCAgMTM2MC40ODg2MDAgIDEzODMuOTQ1MzAwICAxNDA3LjQwMjAwMCAgMTQzMC44NTg3MDAgIDE0NTQuMzE1NDAwICAxNDc3Ljc3MjEwMCAgMTUwMS4yMjg4MDBcWyBcdFxyXG5cXSsxNTI0LjY4NTUwMCAgMTU0OC4xNDIyMDAgIDE1NzEuNTk4OTAwICAxNTk1LjA1NTYwMCAgMTYxOC41MTIzMDAgIDE2NDEuOTY5MDAwICAxNjY1LjQyNTcwMCAgMTY4OC44ODI0MDBcWyBcdFxyXG5cXSsxNzEyLjMzOTEwMCAgMTczNS43OTU4MDAgIDE3NTkuMjUyNTAwICAxNzgyLjcwOTIwMCAgMTgwNi4xNjU5MDAgIDE4MjkuNjIyNjAwICAxODUzLjA3OTMwMCAgMTg3Ni41MzYwMDBcWyBcdFxyXG5cXSsxODk5Ljk5MjcwMCAgMTkyMy40NDk0MDAgIDE5NDYuOTA2MTAwICAxOTcwLjM2MjgwMCAgMTk5My44MTk1MDAgIDIwMTcuMjc2MjAwICAyMDQwLjczMjkwMCAgMjA2NC4xODk2MDBcWyBcdFxyXG5cXSsyMDg3LjY0NjMwMCAgMjExMS4xMDMwMDAgIDIxMzQuNTU5NzAwICAyMTU4LjAxNjQwMCAgMjE4MS40NzMxMDAgIDIyMDQuOTI5ODAwICAyMjI4LjM4NjUwMCAgMjI1MS44NDMyMDBcWyBcdFxyXG5cXSsyMjc1LjI5OTkwMCAgMjI5OC43NTY2MDAgIDIzMjIuMjEzMzAwXFsgXHRcclxuXF0rXFsgXHRcclxuXF0rLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHByaW50X2RvdWJsZV9hcnJheShkb3VibGVfYXJyYXkpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHByaW50X2RvdWJsZV9hcnJheShkb3VibGVfYXJyYXkpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgcHJpbnRfZG91YmxlX2FycmF5KGRvdWJsZV9hcnJheSkiIH0KKyAgfQorCisKKyNjYWxsIHByaW50X2NoYXJfYXJyYXkoY2hhcl9hcnJheSkKK3NlbmRfZ2RiICJwcmludCBwcmludF9jaGFyX2FycmF5KGNoYXJfYXJyYXkpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgImFycmF5X2MgOlxbIFx0XHJcblxdKz09PT09PT09PVxbIFx0XHJcblxdK1xbIFx0XHJcblxdK1pcWyBcdFxyXG5cXSthWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWlxbIFx0XHJcblxdK2FaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaXFsgXHRcclxuXF0rYVphWmFaYVphWmFaYVphWmFaYVxbIFx0XHJcblxdK1xbIFx0XHJcblxdKy4qXFsgXHRcclxuXF0rLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHByaW50X2NoYXJfYXJyYXkoY2hhcl9hcnJheSkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgcHJpbnRfY2hhcl9hcnJheShjaGFyX2FycmF5KSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHByaW50X2NoYXJfYXJyYXkoY2hhcl9hcnJheSkiIH0KKyAgfQorCisKKworI2dvIC11bnRpbCAxMDE0CitnZGJfdGVzdCAidGJyZWFrIDEwMTQiIFwKKyJCcmVha3BvaW50LipmaWxlLiokc3JjZmlsZSwgbGluZSAxMDE0LioiIFwKKyJ0YnJlYWtwb2ludCBsaW5lIDEwMTQiCisKK3NlbmRfZ2RiICJjb250aW51ZVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJhcnJheV9jIDpcWyBcdFxyXG5cXSs9PT09PT09PT1cWyBcdFxyXG5cXStcWyBcdFxyXG5cXStaXFsgXHRcclxuXF0rYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVpcWyBcdFxyXG5cXSthWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWlxbIFx0XHJcblxdK2FaYVphWmFaYVphWmFaYVphWmFcWyBcdFxyXG5cXStcWyBcdFxyXG5cXStcWyBcdFxyXG5cXSttYWluLiphdC4qJHNyY2ZpbGU6MTAxNFxbIFx0XHJcblxdKy4qcHJpbnRfZG91YmxlX2FycmF5XFwoZG91YmxlX2FycmF5XFwpLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgImNvbnRpbnVlIHRvIDEwMTQiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29udGludWUgdG8gMTAxNCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGNvbnRpbnVlIHRvIDEwMTQiIH0KK30KKworIyBJIGFtIGRpc2FibGluZyB0aGlzIHRlc3QsIGJlY2F1c2UgaXQgdGFrZXMgdG9vIGxvbmcuIEkgdmVyaWZpZWQgYnkKKyMgaGFuZCB0aGF0IGl0IHdvcmtzLCBmZWVsIGZyZWUgdG8gY2hlY2sgZm9yIHlvdXJzZWxmLiAKKyNjYWxsIHByaW50X2FsbF9hcnJheXMoaW50ZWdlcl9hcnJheSwgY2hhcl9hcnJheSwgZmxvYXRfYXJyYXksIGRvdWJsZV9hcnJheSkKKyNzZW5kX2dkYiAicHJpbnQgcHJpbnRfYWxsX2FycmF5cyhpbnRlZ2VyX2FycmF5LCBjaGFyX2FycmF5LCBmbG9hdF9hcnJheSwgZG91YmxlX2FycmF5KVxuIgorI2dkYl9leHBlY3QgeworIyAgICAtcmUgIi4qYXJyYXlfaSA6XFsgXHRcclxuXF0rPT09PT09PT09XFsgXHRcclxuXF0rXFsgXHRcclxuXF0rMFxbIFx0XHJcblxdKy0xICAtMiAgLTMgIC00ICAtNSAgLTYgIC03ICAtOFxbIFx0XHJcblxdKy05ICAtMTAgIC0xMSAgLTEyICAtMTMgIC0xNCAgLTE1ICAtMTZcWyBcdFxyXG5cXSstMTcgIC0xOCAgLTE5ICAtMjAgIC0yMSAgLTIyICAtMjMgIC0yNFxbIFx0XHJcblxdKy0yNSAgLTI2ICAtMjcgIC0yOCAgLTI5ICAtMzAgIC0zMSAgLTMyXFsgXHRcclxuXF0rLTMzICAtMzQgIC0zNSAgLTM2ICAtMzcgIC0zOCAgLTM5ICAtNDBcWyBcdFxyXG5cXSstNDEgIC00MiAgLTQzICAtNDQgIC00NSAgLTQ2ICAtNDcgIC00OFxbIFx0XHJcblxdKy00OVxbIFx0XHJcblxdK1xbIFx0XHJcblxdK2FycmF5X2MgOlxbIFx0XHJcblxdKz09PT09PT09PVxbIFx0XHJcblxdK1xbIFx0XHJcblxdK1pcWyBcdFxyXG5cXSthWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWlxbIFx0XHJcblxdK2FaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaXFsgXHRcclxuXF0rYVphWmFaYVphWmFaYVphWmFaYVxbIFx0XHJcblxdK1xbIFx0XHJcblxdK2FycmF5X2YgOlxbIFx0XHJcblxdKz09PT09PT09PVxbIFx0XHJcblxdK1xbIFx0XHJcblxdKzAuMDAwMDAwXFsgXHRcclxuXF0rMC4xNDI0NTAgIDAuMjg0OTAwICAwLjQyNzM1MCAgMC41Njk4MDEgIDAuNzEyMjUxICAwLjg1NDcwMSAgMC45OTcxNTEgIDEuMTM5NjAxXFsgXHRcclxuXF0rMS4yODIwNTEgIDEuNDI0NTAxICAxLjU2Njk1MiAgMS43MDk0MDIgIDEuODUxODUyICAxLjk5NDMwMlxbIFx0XHJcblxdK1xbIFx0XHJcblxdK2FycmF5X2QgOlxbIFx0XHJcblxdKz09PT09PT09PVxbIFx0XHJcblxdK1xbIFx0XHJcblxdKzAuMDAwMDAwXFsgXHRcclxuXF0rMjMuNDU2NzAwICA0Ni45MTM0MDAgIDcwLjM3MDEwMCAgOTMuODI2ODAwICAxMTcuMjgzNTAwICAxNDAuNzQwMjAwICAxNjQuMTk2OTAwICAxODcuNjUzNjAwXFsgXHRcclxuXF0rMjExLjExMDMwMCAgMjM0LjU2NzAwMCAgMjU4LjAyMzcwMCAgMjgxLjQ4MDQwMCAgMzA0LjkzNzEwMCAgMzI4LjM5MzgwMCAgMzUxLjg1MDUwMCAgMzc1LjMwNzIwMFxbIFx0XHJcblxdKzM5OC43NjM5MDAgIDQyMi4yMjA2MDAgIDQ0NS42NzczMDAgIDQ2OS4xMzQwMDAgIDQ5Mi41OTA3MDAgIDUxNi4wNDc0MDAgIDUzOS41MDQxMDAgIDU2Mi45NjA4MDBcWyBcdFxyXG5cXSs1ODYuNDE3NTAgIDYwOS44NzQyMDAgIDYzMy4zMzA5MDAgIDY1Ni43ODc2MDAgIDY4MC4yNDQzMDAgIDcwMy43MDEwMDAgIDcyNy4xNTc3MDAgIDc1MC42MTQ0MDBcWyBcdFxyXG5cXSs3NzQuMDcxMTAwICA3OTcuNTI3ODAwICA4MjAuOTg0NTAwICA4NDQuNDQxMjAwICA4NjcuODk3OTAwICA4OTEuMzU0NjAwICA5MTQuODExMzAwICA5MzguMjY4MDAwXFsgXHRcclxuXF0rOTYxLjcyNDcwMCAgOTg1LjE4MTQwMCAgMTAwOC42MzgxMDAgIDEwMzIuMDk0ODAwICAxMDU1LjU1MTUwMCAgMTA3OS4wMDgyMDAgIDExMDIuNDY0OTAwICAxMTI1LjkyMTYwMFxbIFx0XHJcblxdKzExNDkuMzc4MzAwICAxMTcyLjgzNTAwMCAgMTE5Ni4yOTE3MDAgIDEyMTkuNzQ4NDAwICAxMjQzLjIwNTEwMCAgMTI2Ni42NjE4MDAgIDEyOTAuMTE4NTAwICAxMzEzLjU3NTIwMFxbIFx0XHJcblxdKzEzMzcuMDMxOTAwICAxMzYwLjQ4ODYwMCAgMTM4My45NDUzMDAgIDE0MDcuNDAyMDAwICAxNDMwLjg1ODcwMCAgMTQ1NC4zMTU0MDAgIDE0NzcuNzcyMTAwICAxNTAxLjIyODgwMFxbIFx0XHJcblxdKzE1MjQuNjg1NTAwICAxNTQ4LjE0MjIwMCAgMTU3MS41OTg5MDAgIDE1OTUuMDU1NjAwICAxNjE4LjUxMjMwMCAgMTY0MS45NjkwMDAgIDE2NjUuNDI1NzAwICAxNjg4Ljg4MjQwMFxbIFx0XHJcblxdKzE3MTIuMzM5MTAwICAxNzM1Ljc5NTgwMCAgMTc1OS4yNTI1MDAgIDE3ODIuNzA5MjAwICAxODA2LjE2NTkwMCAgMTgyOS42MjI2MDAgIDE4NTMuMDc5MzAwICAxODc2LjUzNjAwMFxbIFx0XHJcblxdKzE4OTkuOTkyNzAwICAxOTIzLjQ0OTQwMCAgMTk0Ni45MDYxMDAgIDE5NzAuMzYyODAwICAxOTkzLjgxOTUwMCAgMjAxNy4yNzYyMDAgIDIwNDAuNzMyOTAwICAyMDY0LjE4OTYwMFxbIFx0XHJcblxdKzIwODcuNjQ2MzAwICAyMTExLjEwMzAwMCAgMjEzNC41NTk3MDAgIDIxNTguMDE2NDAwICAyMTgxLjQ3MzEwMCAgMjIwNC45Mjk4MDAgIDIyMjguMzg2NTAwICAyMjUxLjg0MzIwMFxbIFx0XHJcblxdKzIyNzUuMjk5OTAwICAyMjk4Ljc1NjYwMCAgMjMyMi4yMTMzMDAuKiRnZGJfcHJvbXB0ICQiIHsKKyMgICAgICAgIHBhc3MgInByaW50IHByaW50X2FsbF9hcnJheXMoaW50ZWdlcl9hcnJheSwgY2hhcl9hcnJheSwgZmxvYXRfYXJyYXksIGRvdWJsZV9hcnJheSkiCisjICAgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwcmludF9hbGxfYXJyYXlzKGludGVnZXJfYXJyYXksIGNoYXJfYXJyYXksIGZsb2F0X2FycmF5LCBkb3VibGVfYXJyYXkpIiB9CisjICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHByaW50X2FsbF9hcnJheXMoaW50ZWdlcl9hcnJheSwgY2hhcl9hcnJheSwgZmxvYXRfYXJyYXksIGRvdWJsZV9hcnJheSkiIH0KKyMgIH0KKworI3NldCB0aW1lb3V0ICRvbGR0aW1lb3V0CisjZ28gLXVudGlsIDEwMTgKK2dkYl90ZXN0ICJ0YnJlYWsgMTAxOCIgXAorICAgICJCcmVha3BvaW50LiogZmlsZSAuKiRzcmNmaWxlLCBsaW5lIDEwMTguKiIgXAorICAgICJ0YnJlYWtwb2ludCBsaW5lIDEwMTgiCisKK2dkYl90ZXN0IGNvbnRpbnVlIFwKKyJDb250aW51aW5nXFwuLiphcnJheV9kIDouKmFycmF5X2YgOi4qc3R1ZGVudCBpZCA6XFtcdCBcXSsuKllFTExPVy4qYXJyYXlfaSA6LiptYWluIFxcKFxcKSBhdCAuKmNhbGwtYXItc3QuYzoxMDE4XFsgXHRcclxuXF0rLipwcmludF9hbGxfYXJyYXlzXFwoaW50ZWdlcl9hcnJheSwgY2hhcl9hcnJheSwgZmxvYXRfYXJyYXksIGRvdWJsZV9hcnJheVxcKS4iIFwKKyJjb250aW51aW5nIHRvIGJyZWFrcG9pbnQgMTAxOCIKKworI3N0ZXAKKyAgICBzZW5kX2dkYiAic3RlcFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgInByaW50X2FsbF9hcnJheXMgXFwoYXJyYXlfaT0sIGFycmF5X2M9LlphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYVphWmFaYS4sIGFycmF5X2Y9LCBhcnJheV9kPVxcKSBhdCAuKmNhbGwtYXItc3QuYzoyODdcWyBcdFxyXG5cXSsyODcuKnByaW50X2ludF9hcnJheVxcKGFycmF5X2lcXCk7LiokZ2RiX3Byb21wdCAkIiB7cGFzcyAic3RlcCBpbnNpZGUgcHJpbnRfYWxsX2FycmF5cyJ9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInN0ZXAgaW5zaWRlIHByaW50X2FsbF9hcnJheXMiIH0KKyAgICAgICAgdGltZW91dCB7IGZhaWwgInN0ZXAgaW5zaWRlIHByaW50X2FsbF9hcnJheXMgKHRpbWVvdXQpIiB9CisgICAgfQorCisKKyNzdGVwIC1vdmVyCisgICAgc2VuZF9nZGIgIm5leHRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJhcnJheV9pIDouKjI4OC4qcHJpbnRfY2hhcl9hcnJheVxcKGFycmF5X2NcXCk7LiokZ2RiX3Byb21wdCAkIiB7cGFzcyAibmV4dCBvdmVyIHByaW50X2ludF9hcnJheSBpbiBwcmludC1hbGxfYXJyYXlzIn0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibmV4dCBvdmVyIHByaW50X2ludF9hcnJheSBpbiBwcmludC1hbGxfYXJyYXlzIiB9CisgICAgICAgIHRpbWVvdXQgeyBmYWlsICJuZXh0IG92ZXIgcHJpbnRfaW50X2FycmF5IGluIHByaW50LWFsbF9hcnJheXMgKHRpbWVvdXQpIiB9CisgICAgfQorCisKKworI2NhbGwgcHJpbnRfZG91YmxlX2FycmF5KGFycmF5X2QpCitzZW5kX2dkYiAicHJpbnQgcHJpbnRfZG91YmxlX2FycmF5KGFycmF5X2QpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgImFycmF5X2QgOlxbIFx0XHJcblxdKz09PT09PT09PVxbIFx0XHJcblxdK1xbIFx0XHJcblxdKzAuMDAwMDAwXFsgXHRcclxuXF0rMjMuNDU2NzAwICA0Ni45MTM0MDAgIDcwLjM3MDEwMCAgOTMuODI2ODAwICAxMTcuMjgzNTAwICAxNDAuNzQwMjAwICAxNjQuMTk2OTAwICAxODcuNjUzNjAwXFsgXHRcclxuXF0rMjExLjExMDMwMCAgMjM0LjU2NzAwMCAgMjU4LjAyMzcwMCAgMjgxLjQ4MDQwMCAgMzA0LjkzNzEwMCAgMzI4LjM5MzgwMCAgMzUxLjg1MDUwMCAgMzc1LjMwNzIwMFxbIFx0XHJcblxdKzM5OC43NjM5MDAgIDQyMi4yMjA2MDAgIDQ0NS42NzczMDAgIDQ2OS4xMzQwMDAgIDQ5Mi41OTA3MDAgIDUxNi4wNDc0MDAgIDUzOS41MDQxMDAgIDU2Mi45NjA4MDBcWyBcdFxyXG5cXSs1ODYuNDE3NTAwICA2MDkuODc0MjAwICA2MzMuMzMwOTAwICA2NTYuNzg3NjAwICA2ODAuMjQ0MzAwICA3MDMuNzAxMDAwICA3MjcuMTU3NzAwICA3NTAuNjE0NDAwXFsgXHRcclxuXF0rNzc0LjA3MTEwMCAgNzk3LjUyNzgwMCAgODIwLjk4NDUwMCAgODQ0LjQ0MTIwMCAgODY3Ljg5NzkwMCAgODkxLjM1NDYwMCAgOTE0LjgxMTMwMCAgOTM4LjI2ODAwMFxbIFx0XHJcblxdKzk2MS43MjQ3MDAgIDk4NS4xODE0MDAgIDEwMDguNjM4MTAwICAxMDMyLjA5NDgwMCAgMTA1NS41NTE1MDAgIDEwNzkuMDA4MjAwICAxMTAyLjQ2NDkwMCAgMTEyNS45MjE2MDBcWyBcdFxyXG5cXSsxMTQ5LjM3ODMwMCAgMTE3Mi44MzUwMDAgIDExOTYuMjkxNzAwICAxMjE5Ljc0ODQwMCAgMTI0My4yMDUxMDAgIDEyNjYuNjYxODAwICAxMjkwLjExODUwMCAgMTMxMy41NzUyMDBcWyBcdFxyXG5cXSsxMzM3LjAzMTkwMCAgMTM2MC40ODg2MDAgIDEzODMuOTQ1MzAwICAxNDA3LjQwMjAwMCAgMTQzMC44NTg3MDAgIDE0NTQuMzE1NDAwICAxNDc3Ljc3MjEwMCAgMTUwMS4yMjg4MDBcWyBcdFxyXG5cXSsxNTI0LjY4NTUwMCAgMTU0OC4xNDIyMDAgIDE1NzEuNTk4OTAwICAxNTk1LjA1NTYwMCAgMTYxOC41MTIzMDAgIDE2NDEuOTY5MDAwICAxNjY1LjQyNTcwMCAgMTY4OC44ODI0MDBcWyBcdFxyXG5cXSsxNzEyLjMzOTEwMCAgMTczNS43OTU4MDAgIDE3NTkuMjUyNTAwICAxNzgyLjcwOTIwMCAgMTgwNi4xNjU5MDAgIDE4MjkuNjIyNjAwICAxODUzLjA3OTMwMCAgMTg3Ni41MzYwMDBcWyBcdFxyXG5cXSsxODk5Ljk5MjcwMCAgMTkyMy40NDk0MDAgIDE5NDYuOTA2MTAwICAxOTcwLjM2MjgwMCAgMTk5My44MTk1MDAgIDIwMTcuMjc2MjAwICAyMDQwLjczMjkwMCAgMjA2NC4xODk2MDBcWyBcdFxyXG5cXSsyMDg3LjY0NjMwMCAgMjExMS4xMDMwMDAgIDIxMzQuNTU5NzAwICAyMTU4LjAxNjQwMCAgMjE4MS40NzMxMDAgIDIyMDQuOTI5ODAwICAyMjI4LjM4NjUwMCAgMjI1MS44NDMyMDBcWyBcdFxyXG5cXSsyMjc1LjI5OTkwMCAgMjI5OC43NTY2MDAgIDIzMjIuMjEzMzAwXFsgXHRcclxuXF0rXFsgXHRcclxuXF0rLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHByaW50X2RvdWJsZV9hcnJheShhcnJheV9kKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwcmludF9kb3VibGVfYXJyYXkoYXJyYXlfZCkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBwcmludF9kb3VibGVfYXJyYXkoYXJyYXlfZCkiIH0KKyAgfQorCisKKyNnbyAtdW50aWwgMTAzNAorZ2RiX3Rlc3QgInRicmVhayAxMDM0IiBcCisiQnJlYWtwb2ludC4qIGZpbGUgLiokc3JjZmlsZSwgbGluZSAxMDM0LioiIFwKKyJ0YnJlYWtwb2ludCBsaW5lIDEwMzQiCisKK2dkYl90ZXN0IGNvbnRpbnVlICJDb250aW51aW5nXFwuLiphcnJheV9jLiphcnJheV9mLiphcnJheV9kLipIRUxMTyBXT1JMRC4qbWFpbiBcXChcXCkgYXQgLipjYWxsLWFyLXN0LmM6MTAzNC4qcHJpbnRmXFwoLkJZRSBCWUUgRk9SIE5PVy5uLlxcKS4iICJjb250aW51aW5nIHRvIDEwMzQiCisKKworI2NhbGwgc3VtX2FycmF5X3ByaW50KDEwLCAqbGlzdDEsICpsaXN0MiwgKmxpc3QzLCAqbGlzdDQpCitzZW5kX2dkYiAicHJpbnQgc3VtX2FycmF5X3ByaW50KDEwLCAqbGlzdDEsICpsaXN0MiwgKmxpc3QzLCAqbGlzdDQpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qU3VtIG9mIDQgYXJyYXlzLCBieSBlbGVtZW50IFxcKGFkZCBpbiBzZWVkIGFzIHdlbGxcXCk6XFsgXHRcclxuXF0rU2VlZDogMTBcWyBcdFxyXG5cXStFbGVtZW50IEluZGV4IC4gU3VtXFsgXHRcclxuXF0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxbIFx0XHJcblxdKy4qXFsgXHRcXSswXFsgXHRcXSs1MlxbIFx0XHJcblxdKzFcWyBcdFxdKzYwXFsgXHRcclxuXF0rMlxbIFx0XF0rNjhcWyBcdFxyXG5cXSszXFsgXHRcXSs3NlxbIFx0XHJcblxdKzRcWyBcdFxdKzg0XFsgXHRcclxuXF0rNVxbIFx0XF0rOTJcWyBcdFxyXG5cXSs2XFsgXHRcXSsxMDBcWyBcdFxyXG5cXSs3XFsgXHRcXSsxMDhcWyBcdFxyXG5cXSs4XFsgXHRcXSsxMTZcWyBcdFxyXG5cXSs5XFsgXHRcXSsxMjRcWyBcdFxyXG5cXSsuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgc3VtX2FycmF5X3ByaW50KDEwLCAqbGlzdDEsICpsaXN0MiwgKmxpc3QzLCAqbGlzdDQpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHN1bV9hcnJheV9wcmludCgxMCwgKmxpc3QxLCAqbGlzdDIsICpsaXN0MywgKmxpc3Q0KSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHN1bV9hcnJheV9wcmludCgxMCwgKmxpc3QxLCAqbGlzdDIsICpsaXN0MywgKmxpc3Q0KSIgfQorICB9CisKKworI3N0ZXAgLW92ZXIKKyAgICBzZW5kX2dkYiAibmV4dFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIkJZRSBCWUUgRk9SIE5PV1xbIFx0XHJcblxdKzEwMzVcWyBcdFxyXG5cXStwcmludGZcXCguVkVSWSBHUkVFTiBHUkFTUy5uLlxcKTtcWyBcdFxyXG5cXSsuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAibmV4dCB0byAxMDM1In0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibmV4dCB0byAxMDM1IiB9CisgICAgICAgIHRpbWVvdXQgeyBmYWlsICJuZXh0IHRvIDEwMzUodGltZW91dCkiIH0KKyAgICB9CisKKyNjYWxsIHByaW50X2FycmF5X3JlcChcKmxpc3QxLCBcKmxpc3QyLCBcKmxpc3QzKQorCitzZW5kX2dkYiAicHJpbnQgcHJpbnRfYXJyYXlfcmVwKFwqbGlzdDEsIFwqbGlzdDIsIFwqbGlzdDMpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHByaW50X2FycmF5X3JlcCgqbGlzdDEsICpsaXN0MiwgKmxpc3QzKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwcmludF9hcnJheV9yZXAoKmxpc3QxLCAqbGlzdDIsICpsaXN0MykiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBwcmludF9hcnJheV9yZXAoKmxpc3QxLCAqbGlzdDIsICpsaXN0MykiIyB9CisgIH0KKworCisKKyNnbyAtdW50aWwgMTAzOQorZ2RiX3Rlc3QgInRicmVhayAxMDM5IiBcCisgICAgIkJyZWFrcG9pbnQuLiogZmlsZSAuKiRzcmNmaWxlLCBsaW5lIDEwMzkuKiIgXAorICAgICJ0YnJlYWtwb2ludCBsaW5lIDEwMzkiCisKK3NlbmRfZ2RiICAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworIC1yZSAiLiptYWluIFxcKFxcKSBhdCAuKmNhbGwtYXItc3QuYzoxMDM5XHJcbjEwMzlcdFxbIFxdK3N1bV9hcnJheV9wcmludFxcKDEwLCBcXCpsaXN0MSwgXFwqbGlzdDIsIFxcKmxpc3QzLCBcXCpsaXN0NFxcKTsuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICBwYXNzICJjb250aW51ZSB0byAxMDM5In0KKyAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb250aW51ZSB0byAxMDM5In0KKyB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBjb250aW51ZSB0byAxMDM5In0KK30KKworCisKKyMgUnVuIGludG8gc3VtX2FycmF5X3ByaW50LCBhbmQgdmVyaWZ5IHRoYXQgdGhlIGFyZ3VtZW50cyB3ZXJlIHBhc3NlZAorIyBhY2N1cmF0ZWx5LgorIworIyBOb3RlIHRoYXQgd2Ugc2hvdWxkbid0IHVzZSBhIGBzdGVwJyBoZXJlIHRvIGdldCBpbnRvCisjIHN1bV9hcnJheV9wcmludDsgR0NDIG1heSBlbWl0IGNhbGxzIHRvIG1lbWNweSB0byBwdXQgdGhlIGFyZ3VtZW50cworIyBpbiB0aGUgcmlnaHQgcGxhY2UsIGFuZCBhIHN0ZXAgbWF5IGVuZCB1cCBpbiBtZW1jcHkgaW5zdGVhZC4gIFRoaXMKKyMgbWF5IGl0c2VsZiBiZSBhIGJ1ZywgYnV0IGl0J3Mgbm90IHRoZSBvbmUgd2UncmUgdHJ5aW5nIHRvIGNhdGNoCisjIGhlcmUuICBJJ3ZlIGFkZGVkIHNvbWV0aGluZyB0byBzdGVwLXRlc3QuZXhwIGZvciB0aGlzLgorZ2RiX3Rlc3QgImJyZWFrIHN1bV9hcnJheV9wcmludCIgXAorCSIuKkJyZWFrcG9pbnQgJHtkZWNpbWFsfTogZmlsZSAuKmNhbGwtYXItc3QuYywgbGluZS4qIiBcCisJInNldCBicmVha3BvaW50IGluIHN1bV9hcnJheV9wcmludCIKK2dkYl90ZXN0ICJjb250aW51ZSIgXAorCSIuKkJyZWFrcG9pbnQgJHtkZWNpbWFsfSwgc3VtX2FycmF5X3ByaW50IFxcKHNlZWQ9MTAsIGxpbmtlZF9saXN0MT0ubmV4dF9pbmRleCA9IC4xLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMC4sIHZhbHVlcyA9IC40LCA2LCA4LCAxMCwgMTIsIDE0LCAxNiwgMTgsIDIwLCAyMi4sIGhlYWQgPSAwLiwgbGlua2VkX2xpc3QyPS5uZXh0X2luZGV4ID0gLjEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLiwgdmFsdWVzID0gLjgsIDEwLCAxMiwgMTQsIDE2LCAxOCwgMjAsIDIyLCAyNCwgMjYuLCBoZWFkID0gMC4sIGxpbmtlZF9saXN0Mz0ubmV4dF9pbmRleCA9IC4xLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMC4sIHZhbHVlcyA9IC4xMCwgMTIsIDE0LCAxNiwgMTgsIDIwLCAyMiwgMjQsIDI2LCAyOC4sIGhlYWQgPSAwLiwgbGlua2VkX2xpc3Q0PS5uZXh0X2luZGV4ID0gLjEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLiwgdmFsdWVzID0gLjIwLCAyMiwgMjQsIDI2LCAyOCwgMzAsIDMyLCAzNCwgMzYsIDM4LiwgaGVhZCA9IDAuXFwpIGF0IC4qY2FsbC1hci1zdC5jOjkwOVxbIFx0XG5cclxdKzkwOS4qcHJpbnRmXFwoLlN1bSBvZiA0IGFycmF5cywgYnkgZWxlbWVudCBcXChhZGQgaW4gc2VlZCBhcyB3ZWxsXFwpLipcXCk7LioiIFwKKwkiY2hlY2sgYXJncyBvZiBzdW1fYXJyYXlfcHJpbnQiCisKKyNjYWxsIHByaW50X2FycmF5X3JlcChsaW5rZWRfbGlzdDEsIGxpbmtlZF9saXN0MiwgbGlua2VkX2xpc3QzKQorIyB0aGlzIGNhbGxzIHdvcmtzIGZyb20gZ2RiIHdpdGhvdXQgZ2RiX2V4cGVjdC4gQnV0IGl0IGRvZXMgc2VlbSB0byBoYW5nCisjZnJvbSB3aXRoaW4gZ2RiX2V4cGVjdC4KKyNJIGNvbW1lbnQgdGhpcyBvdXQKKyNzZW5kX2dkYiAicHJpbnQgcHJpbnRfYXJyYXlfcmVwKGxpbmtlZF9saXN0MSwgbGlua2VkX2xpc3QyLCBsaW5rZWRfbGlzdDMpXG4iCisjZ2RiX2V4cGVjdCB7CisjICAgIC1yZSAiLipDb250ZW50cyBvZiBsaW5rZWQgbGlzdDE6XFsgXHRcblxyXF0rRWxlbWVudCBWYWx1ZSAuIEluZGV4IG9mIE5leHQgRWxlbWVudFxbIFx0XG5cclxdKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cWyBcdFxuXHJcXSsuKlxbIFx0XG5cclxdKy4qNC4qMVxbIFx0XG5cclxdKy4qNi4qMlxbIFx0XG5cclxdKy4qOC4qM1xbIFx0XG5cclxdKy4qMTAuKjRcWyBcdFxuXHJcXSsuKjEyLio1XFsgXHRcblxyXF0rLioxNC4qNlxbIFx0XG5cclxdKy4qMTYuKjdcWyBcdFxuXHJcXSsuKjE4Lio4XFsgXHRcblxyXF0rLioyMC4qOVxbIFx0XG5cclxdKy4qMjIuKjEwXFsgXHRcblxyXF0rQ29udGVudHMgb2YgbGlua2VkIGxpc3QyOlxbIFx0XG5cclxdK0VsZW1lbnQgVmFsdWUgfCBJbmRleCBvZiBOZXh0IEVsZW1lbnRcWyBcdFxuXHJcXSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFsgXHRcblxyXF0rLipcWyBcdFxuXHJcXSsuKjguKjFcWyBcdFxuXHJcXSsuKjEwLioyXFsgXHRcblxyXF0rLioxMi4qM1xbIFx0XG5cclxdKy4qMTQuKjRcWyBcdFxuXHJcXSsuKjE2Lio1XFsgXHRcblxyXF0rLioxOC4qNlxbIFx0XG5cclxdKy4qMjAuKjdcWyBcdFxuXHJcXSsuKjIyLio4XFsgXHRcblxyXF0rLioyNC4qOVxbIFx0XG5cclxdKy4qMjYuKjEwXFsgXHRcblxyXF0rQ29udGVudHMgb2YgbGlua2VkIGxpc3QzOlxbIFx0XG5cclxdK0VsZW1lbnQgVmFsdWUgfCBJbmRleCBvZiBOZXh0IEVsZW1lbnRcWyBcdFxuXHJcXSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFsgXHRcblxyXF0rLipcWyBcdFxuXHJcXSsuKjEwLioxXFsgXHRcblxyXF0rLioxMi4qMlxbIFx0XG5cclxdKy4qMTQuKjNcWyBcdFxuXHJcXSsuKjE2Lio0XFsgXHRcblxyXF0rLioxOC4qNVxbIFx0XG5cclxdKy4qMjAuKjZcWyBcdFxuXHJcXSsuKjIyLio3XFsgXHRcblxyXF0rLioyNC4qOFxbIFx0XG5cclxdKy4qMjYuKjlcWyBcdFxuXHJcXSsuKjI4LioxMFxbIFx0XG5cclxdKy4qJGdkYl9wcm9tcHQgJCIgeworIyAgICAgICAgcGFzcyAicHJpbnQgcHJpbnRfYXJyYXlfcmVwKGxpbmtlZF9saXN0MSwgbGlua2VkX2xpc3QyLCBsaW5rZWRfbGlzdDMpIgorIyAgICAgIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgcHJpbnRfYXJyYXlfcmVwKGxpbmtlZF9saXN0MSwgbGlua2VkX2xpc3QyLCBsaW5rZWRfbGlzdDMpIiB9CisjICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHByaW50X2FycmF5X3JlcChsaW5rZWRfbGlzdDEsIGxpbmtlZF9saXN0MiwgbGlua2VkX2xpc3QzKSIgfQorI30KKworCisjZ28gLXVudGlsIDEwNzkKK2dkYl90ZXN0ICJ0YnJlYWsgMTA3OSIgXAorICAgICJCcmVha3BvaW50LiogZmlsZSAuKmNhbGwtYXItc3QuYywgbGluZSAxMDc5LioiIFwKKyAgICAidGJyZWFrcG9pbnQgbGluZSAxMDc5IgorCitzZW5kX2dkYiAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworIC1yZSAgIkNvbnRpbnVpbmdcXC4uKlN1bSBvZiA0IGFycmF5cy4qQ29udGVudHMgb2YgbGlua2VkIGxpc3QxLipDb250ZW50cyBvZiB0d29fZmxvYXRzX3QuKm1haW4gXFwoXFwpIGF0IC4qY2FsbC1hci1zdC5jOjEwNzkuKmMgPSAwLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgIHBhc3MgImNvbnRpbnVlIHRvIDEwNzkifQorICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29udGludWUgdG8gMTA3OSJ9ICAgICAgICAgICAKKyAgICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGNvbnRpbnVlIHRvIDEwNzkifQorfQorCisjY2FsbCBwcmludF9zbWFsbF9zdHJ1Y3RzKCpzdHJ1Y3QxLCAqc3RydWN0MiwgKnN0cnVjdDMsICpzdHJ1Y3Q0LCpmbGFncywgKmZsYWdzX2NvbWJvLAorIyp0aHJlZV9jaGFyLCAqZml2ZV9jaGFyLCAqaW50X2NoYXJfY29tYm8sICpkMSwgKmQyLCAqZDMsICpmMSwgKmYyLCAqZjMpCitzZW5kX2dkYiAicHJpbnQgcHJpbnRfc21hbGxfc3RydWN0cygqc3RydWN0MSwgKnN0cnVjdDIsICpzdHJ1Y3QzLCAqc3RydWN0NCwgKmZsYWdzLCAqZmxhZ3NfY29tYm8sICp0aHJlZV9jaGFyLCAqZml2ZV9jaGFyLCAqaW50X2NoYXJfY29tYm8sICpkMSwgKmQyLCAqZDMsICpmMSwgKmYyLCAqZjMpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qYWxwaGFcW1x0XHJcbiBcXStnYW1tYVxbXHRcclxuIFxdK2Vwc2lsb25cW1x0XHJcbiBcXSthbHBoYVxbXHRcclxuIFxdK2dhbW1hXFtcdFxyXG4gXF0rZXBzaWxvblxbXHRcclxuIFxdK2NoMTogeVx0Y2gyOiBuXFtcdFxyXG4gXF0rQ29udGVudHMgb2YgdGhyZWVfY2hhcl90OlxbXHRcclxuIFxdK2FcdGJcdGNcW1x0XHJcbiBcXStDb250ZW50cyBvZiBmaXZlX2NoYXJfdDpcW1x0XHJcbiBcXStsXHRtXHRuXHRvXHRwXFtcdFxyXG4gXF0rQ29udGVudHMgb2YgaW50X2NoYXJfY29tYm9fdDpcW1x0XHJcbiBcXSsxMjMuKnpcW1x0XHJcbiBcXStTdW0gb2YgdGhlIDQgc3RydWN0IHZhbHVlcyBhbmQgc2VlZCA6XFtcdFxyXG4gXF0rNTJcW1x0XHJcbiBcXStDb250ZW50cyBvZiBzdHJ1Y3QxOlxbXHRcclxuIFxdKzYuKjBcW1x0XHJcbiBcXStDb250ZW50cyBvZiBzdHJ1Y3QyOlxbXHRcclxuIFxdKzEwLiowXFtcdFxyXG4gXF0rQ29udGVudHMgb2Ygc3RydWN0MzpcW1x0XHJcbiBcXSsxMi4qMFxbXHRcclxuIFxdK0NvbnRlbnRzIG9mIG9uZV9kb3VibGVfdDpcW1x0XHJcbiBcXSsxMC41MDAwMDBcW1x0XHJcbiBcXStDb250ZW50cyBvZiBvbmVfZG91YmxlX3Q6LiotMy4zNDAwMDBcW1x0XHJcbiBcXStDb250ZW50cyBvZiBvbmVfZG91YmxlX3Q6Lio2NzUuMDkxMjMwXFtcdFxyXG4gXF0rQ29udGVudHMgb2YgdHdvX2Zsb2F0c190Oi4qNDUuMjM0MDAxLio0My41OTk5OThcW1x0XHJcbiBcXStDb250ZW50cyBvZiB0d29fZmxvYXRzX3Q6Lio3OC4wMTAwMDIuKjEyMi4wOTk5OThcW1x0XHJcbiBcXStDb250ZW50cyBvZiB0d29fZmxvYXRzX3Q6LiotMTIzMi4zNDQ5NzEuKi0xOTkuMjEwMDA3XFtcdFxyXG4gXF0rLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHByaW50X3NtYWxsX3N0cnVjdHMiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgcHJpbnRfc21hbGxfc3RydWN0cyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50X3NtYWxsX3N0cnVjdHMiIH0KKyAgfQorCisKKyNjYWxsIGNvbXB1dGVfd2l0aF9zbWFsbF9zdHJ1Y3RzKDIwKQorc2VuZF9nZGIgInByaW50IGNvbXB1dGVfd2l0aF9zbWFsbF9zdHJ1Y3RzKDIwKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKlxbMC05XF0rID0uKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgY29tcHV0ZV93aXRoX3NtYWxsX3N0cnVjdHMoMjApIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGNvbXB1dGVfd2l0aF9zbWFsbF9zdHJ1Y3RzKDIwKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGNvbXB1dGVfd2l0aF9zbWFsbF9zdHJ1Y3RzKDIwKSIgfQorICB9CisKKworI2NhbGwgcHJpbnRfdGVuX2RvdWJsZXMoMTIzLjQ1NiwgMTIzLjQ1NiwgLTAuMTIsIC0xLjIzLCAzNDM0MzQuOCwgODkuMDk4LCAzLjE0LCAtNTY3OC4xMjM0NSwgLTAuMTExMTExMTEsIDIxNi45NzA2NSkKK3NlbmRfZ2RiICJwcmludCBwcmludF90ZW5fZG91YmxlcygxMjMuNDU2LCAxMjMuNDU2LCAtMC4xMiwgLTEuMjMsIDM0MzQzNC44LCA4OS4wOTgsIDMuMTQsIC01Njc4LjEyMzQ1LCAtMC4xMTExMTExMSwgMjE2Ljk3MDY1KVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKlR3byBEb3VibGVzIDogMTIzLjQ1NjAwMC4qMTIzLjQ1NjAwMFxbXHRcclxuIFxdK1R3byBEb3VibGVzIDogLTAuMTIwMDAwLiotMS4yMzAwMDBcW1x0XHJcbiBcXStUd28gRG91YmxlcyA6IDM0MzQzNC44MDAwMDAuKjg5LjA5ODAwMFxbXHRcclxuIFxdK1R3byBEb3VibGVzIDogMy4xNDAwMDAuKi01Njc4LjEyMzQ1MFxbXHRcclxuIFxdK1R3byBEb3VibGVzIDogLTAuMTExMTExLioyMTYuOTcwNjUwXFtcdFxyXG4gXF0rLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHByaW50X3Rlbl9kb3VibGVzIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHByaW50X3Rlbl9kb3VibGVzIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnRfdGVuX2RvdWJsZXMiIH0KKyAgfQorCisjZ28gLXVudGlsIDEwODQKK2dkYl90ZXN0ICJ0YnJlYWsgMTA4NCIgXAorICAgICJCcmVha3BvaW50IC4qIGZpbGUgLipjYWxsLWFyLXN0LmMsIGxpbmUgMTA4NC4qIiBcCisgICAgInRicmVha3BvaW50IGxpbmUgMTA4NCIKKworZ2RiX3Rlc3QgY29udGludWUgIkNvbnRpbnVpbmdcXC4uKm1haW4gXFwoLipcXCkgYXQuKmNhbGwtYXItc3QuYzoxMDg0XFtcdFxyXG4gXF0rMTA4NC4qcHJpbnRfbG9uZ19hcmdfbGlzdCBcXCggYSwgYiwgYywgZCwgZSwgZiwgLnN0cnVjdDEsIC5zdHJ1Y3QyLCAuc3RydWN0MywgLnN0cnVjdDQsLioiICJjb250aW51ZSB0byAxMDg0IgorCisgIAorICAgIHNlbmRfZ2RiICJzdGVwXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAiLipwcmludF9sb25nX2FyZ19saXN0IFxcKGE9MjIuMjE5OTk5OTk5OTk5OTk5LCBiPTMzLjMzMjk5OTk5OTk5OTk5OCwgYz0wLCBkPS0yNSwgZT0xMDAsIGY9MjM0NSwgc3RydWN0MT1ce3ZhbHVlID0gNiwgaGVhZCA9IDBcfSwgc3RydWN0Mj1ce3ZhbHVlID0gMTAsIGhlYWQgPSAwXH0sIHN0cnVjdDM9XHt2YWx1ZSA9IDEyLCBoZWFkID0gMFx9LCBzdHJ1Y3Q0PVx7dmFsdWUgPSAxNCwgaGVhZCA9IDBcfSwgZmxhZ3M9XHthbHBoYSA9IDEsIGJldGEgPSAwLCBnYW1tYSA9IDEsIGRlbHRhID0gMCwgZXBzaWxvbiA9IDEsIG9tZWdhID0gMFx9LCBmbGFnc19jb21ibz1ce2FscGhhID0gMSwgYmV0YSA9IDAsIGNoMSA9IDEyMSBcJ3lcJywgZ2FtbWEgPSAxLCBkZWx0YSA9IDAsIGNoMiA9IDExMCBcJ25cJywgZXBzaWxvbiA9IDEsIG9tZWdhID0gMFx9LCB0aHJlZV9jaGFyPVx7Y2gxID0gOTcgXCdhXCcsIGNoMiA9IDk4IFwnYlwnLCBjaDMgPSA5OSBcJ2NcJ1x9LCBmaXZlX2NoYXI9XHtjaDEgPSAxMDggXCdsXCcsIGNoMiA9IDEwOSBcJ21cJywgY2gzID0gMTEwIFwnblwnLCBjaDQgPSAxMTEgXCdvXCcsIGNoNSA9IDExMiBcJ3BcJ1x9LCBpbnRfY2hhcl9jb21ibz1ce2ludDEgPSAxMjMsIGNoMSA9IDEyMiBcJ3pcJ1x9LCBkMT1ce2RvdWJsZTEgPSAxMC41XH0sIGQyPVx7ZG91YmxlMSA9IC0zLjMzOTk5OTk5OTk5OTk5OTlcfSwgZDM9XHtkb3VibGUxID0gNjc1LjA5MTIzXH0sIGYxPVx7ZmxvYXQxID0gNDUuMjM0MDAxMiwgZmxvYXQyID0gNDMuNTk5OTk4NVx9LCBmMj1ce2Zsb2F0MSA9IDc4LjAxMDAwMjEsIGZsb2F0MiA9IDEyMi4wOTk5OThcfSwgZjM9XHtmbG9hdDEgPSAtMTIzMi4zNDQ5NywgZmxvYXQyID0gLTE5OS4yMTAwMDdcfVxcKSBhdCAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX06ODEzXFtcclxuXF0rODEzXFsgXHRcXStwcmludGZcXChcImRvdWJsZSA6LipcIiwgYVxcKTsuKiRnZGJfcHJvbXB0ICQiIHtwYXNzICJzdGVwIGludG8gcHJpbnRfbG9uZ19hcmdfbGlzdCJ9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInN0ZXAgaW50byBwcmludF9sb25nX2FyZ19saXN0IiB9CisgICAgICAgIHRpbWVvdXQgeyBmYWlsICJzdGVwIGludG8gcHJpbnRfbG9uZ19hcmdfbGlzdCAodGltZW91dCkiIH0KKyAgICB9CisKKworI2NhbGwgcHJpbnRfc21hbGxfc3RydWN0cyhzdHJ1Y3QxLCBzdHJ1Y3QyLCBzdHJ1Y3QzLCBzdHJ1Y3Q0LCBmbGFncywgZmxhZ3NfY29tYm8sIHRocmVlX2NoYXIsIGZpdmVfY2hhciwgaW50X2NoYXJfY29tYm8sIGQxLCBkMiwgZDMsIGYxLCBmMiwgZjMpCitzZW5kX2dkYiAicHJpbnQgcHJpbnRfc21hbGxfc3RydWN0cyhzdHJ1Y3QxLCBzdHJ1Y3QyLCBzdHJ1Y3QzLCBzdHJ1Y3Q0LCBmbGFncywgZmxhZ3NfY29tYm8sIHRocmVlX2NoYXIsIGZpdmVfY2hhciwgaW50X2NoYXJfY29tYm8sIGQxLCBkMiwgZDMsIGYxLCBmMiwgZjMpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qYWxwaGFcW1x0XHJcbiBcXStnYW1tYVxbXHRcclxuIFxdK2Vwc2lsb25cW1x0XHJcbiBcXSthbHBoYVxbXHRcclxuIFxdK2dhbW1hXFtcdFxyXG4gXF0rZXBzaWxvblxbXHRcclxuIFxdK2NoMTogeVx0Y2gyOiBuXFtcdFxyXG4gXF0rQ29udGVudHMgb2YgdGhyZWVfY2hhcl90OlxbXHRcclxuIFxdK2FcdGJcdGNcW1x0XHJcbiBcXStDb250ZW50cyBvZiBmaXZlX2NoYXJfdDpcW1x0XHJcbiBcXStsXHRtXHRuXHRvXHRwXFtcdFxyXG4gXF0rQ29udGVudHMgb2YgaW50X2NoYXJfY29tYm9fdDpcW1x0XHJcbiBcXSsxMjMuKnpcW1x0XHJcbiBcXStTdW0gb2YgdGhlIDQgc3RydWN0IHZhbHVlcyBhbmQgc2VlZCA6XFtcdFxyXG4gXF0rNTJcW1x0XHJcbiBcXStDb250ZW50cyBvZiBzdHJ1Y3QxOlxbXHRcclxuIFxdKzYuKjBcW1x0XHJcbiBcXStDb250ZW50cyBvZiBzdHJ1Y3QyOlxbXHRcclxuIFxdKzEwLiowXFtcdFxyXG4gXF0rQ29udGVudHMgb2Ygc3RydWN0MzpcW1x0XHJcbiBcXSsxMi4qMFxbXHRcclxuIFxdK0NvbnRlbnRzIG9mIG9uZV9kb3VibGVfdDpcW1x0XHJcbiBcXSsxMC41MDAwMDBcW1x0XHJcbiBcXStDb250ZW50cyBvZiBvbmVfZG91YmxlX3Q6XFtcdFxyXG4gXF0rLTMuMzQwMDAwXFtcdFxyXG4gXF0rQ29udGVudHMgb2Ygb25lX2RvdWJsZV90OlxbXHRcclxuIFxdKzY3NS4wOTEyMzBcW1x0XHJcbiBcXStDb250ZW50cyBvZiB0d29fZmxvYXRzX3Q6XFtcdFxyXG4gXF0rNDUuMjM0MDAxLio0My41OTk5OThcW1x0XHJcbiBcXStDb250ZW50cyBvZiB0d29fZmxvYXRzX3Q6XFtcdFxyXG4gXF0rNzguMDEwMDAyLioxMjIuMDk5OTk4XFtcdFxyXG4gXF0rQ29udGVudHMgb2YgdHdvX2Zsb2F0c190OlxbXHRcclxuIFxdKy0xMjMyLjM0NDk3MS4qLTE5OS4yMTAwMDdcW1x0XHJcbiBcXSsuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgcHJpbnRfc21hbGxfc3RydWN0cyBmcm9tIHByaW50X2xvbmdfYXJnX2xpc3QgIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHByaW50X3NtYWxsX3N0cnVjdHMgZnJvbSBwcmludF9sb25nX2FyZ19saXN0IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnRfc21hbGxfc3RydWN0cyBmcm9tIHByaW50X2xvbmdfYXJnX2xpc3QiIH0KKyAgfQorCisKKworI2dvIC11bnRpbCAxMDk4CitnZGJfdGVzdCAidGJyZWFrIDEwOTgiIFwKKyAgICAiQnJlYWtwb2ludC4qIGZpbGUgLipjYWxsLWFyLXN0LmMsIGxpbmUgMTA5OC4qIiBcCisgICAgInRicmVha3BvaW50IGxpbmUgMTA5OCIKKworZ2RiX3Rlc3QgY29udGludWUgIkNvbnRpbnVpbmdcXC4uKkNvbnRlbnRzIG9mIHR3b19mbG9hdHNfdDouKi0xMjMyLjM0NDk3MS4qLTE5OS4yMTAwMDcuKm1haW4gXFwoXFwpIGF0LipjYWxsLWFyLXN0LmM6MTA5OC4qMTA5OC4qaW5pdF9iaXRfZmxhZ3NfY29tYm9cXChmbGFnc19jb21ibywgXFwodW5zaWduZWRcXCkxLCBcXCh1bnNpZ25lZFxcKTAsIC55LiwuKiIgXAorImNvbnRpbnVlIHRvIDEwOTgiCisKKworI3N0ZXAKKyAgICBzZW5kX2dkYiAic3RlcFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIgoraW5pdF9iaXRfZmxhZ3NfY29tYm8gXFwoYml0X2ZsYWdzX2NvbWJvPSwgYT0xLCBiPTAsIGNoMT0xMjEgLnkuLCBnPTEsIGQ9MCwgY2gyPTExMCAubi4sIGU9MSwgbz0wXFwpIGF0IC4qY2FsbC1hci1zdC5jOjM4NVxbIFx0XG5cclxdKzM4NS4qYml0X2ZsYWdzX2NvbWJvLT5hbHBoYSA9IGE7LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyAic3RlcCBpbnRvIGluaXRfYml0X2ZsYWdzX2NvbWJvIn0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic3RlcCBpbnRvIGluaXRfYml0X2ZsYWdzX2NvbWJvIiB9CisgICAgICAgIHRpbWVvdXQgeyBmYWlsICJzdGVwIGludG8gaW5pdF9iaXRfZmxhZ3NfY29tYm8gKHRpbWVvdXQpIiB9CisgICAgfQorCisjY2FsbCBwcmludF9iaXRfZmxhZ3NfY29tYm8oKmJpdF9mbGFnc19jb21ibykKK3NlbmRfZ2RiICJwcmludCBwcmludF9iaXRfZmxhZ3NfY29tYm8oKmJpdF9mbGFnc19jb21ibylcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiphbHBoYS4qZ2FtbWEuKmVwc2lsb24uKmNoMTogeVx0Y2gyOiBuLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHByaW50X2JpdF9mbGFnc19jb21ibyBmcm9tIGluaXRfYml0X2ZsYWdzX2NvbWJvIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHByaW50X2JpdF9mbGFnc19jb21ibyBmcm9tIGluaXRfYml0X2ZsYWdzX2NvbWJvIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnRfYml0X2ZsYWdzX2NvbWJvIGZyb20gaW5pdF9iaXRfZmxhZ3NfY29tYm8iIH0KKyAgfQorCisKKyNnbyAtdW50aWwgMTEwMworZ2RiX3Rlc3QgInRicmVhayAxMTAzIiBcCisgICAgIkJyZWFrcG9pbnQuKiBmaWxlIC4qY2FsbC1hci1zdC5jLCBsaW5lIDExMDMuKiIgXAorICAgICJ0YnJlYWtwb2ludCBsaW5lIDExMDMiCisKK2dkYl90ZXN0IGNvbnRpbnVlICJDb250aW51aW5nXFwuLiptYWluIFxcKFxcKSBhdCAuKmNhbGwtYXItc3QuYzoxMTAzXFtcclxuXHQgXF0rMTEwMy4qaW5pdF9pbnRfY2hhcl9jb21ib1xcKGludF9jaGFyX2NvbWJvLCAxMywgLiEuXFwpOyIgXAorImNvbnRpbnVlIHRvIDExMDMiCisKKyNjYWxsIHByaW50X2xvbmdfYXJnX2xpc3QoYSwgYiwgYywgZCwgZSwgZiwgKnN0cnVjdDEsICpzdHJ1Y3QyLCAqc3RydWN0MywgKnN0cnVjdDQsICpmbGFncywgKmZsYWdzX2NvbWJvLCAqdGhyZWVfY2hhciwgKmZpdmVfY2hhciwgKmludF9jaGFyX2NvbWJvLCAqZDEsICpkMiwgKmQzLCAqZjEsICpmMiwgKmYzKQorc2VuZF9nZGIgInByaW50IHByaW50X2xvbmdfYXJnX2xpc3QoYSwgYiwgYywgZCwgZSwgZiwgKnN0cnVjdDEsICpzdHJ1Y3QyLCAqc3RydWN0MywgKnN0cnVjdDQsICpmbGFncywgKmZsYWdzX2NvbWJvLCAqdGhyZWVfY2hhciwgKmZpdmVfY2hhciwgKmludF9jaGFyX2NvbWJvLCAqZDEsICpkMiwgKmQzLCAqZjEsICpmMiwgKmYzKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKmRvdWJsZSA6IDIyLjIyMDAwMC4qZG91YmxlIDogMzMuMzMzMDAwLippbnQgOiAwLippbnQgOiAtMjUuKmludCA6IDEwMC4qaW50IDogMjM0NS4qYWxwaGEuKmdhbW1hLiplcHNpbG9uLipjaDE6IHlcdGNoMjogbi4qQ29udGVudHMgb2YgdGhyZWVfY2hhcl90Oi4qeFx0eVx0ei4qQ29udGVudHMgb2YgZml2ZV9jaGFyX3Q6LipoXHRlXHRsXHRsXHRvLipDb250ZW50cyBvZiBpbnRfY2hhcl9jb21ib190Oi4qMTIzXHR6LipTdW0gb2YgdGhlIDQgc3RydWN0IHZhbHVlcyBhbmQgc2VlZCA6Lio1Mi4qQ29udGVudHMgb2Ygc3RydWN0MTouKjZcWyBcXSswLipDb250ZW50cyBvZiBzdHJ1Y3QyOi4qMTBcWyBcXSswLipDb250ZW50cyBvZiBzdHJ1Y3QzOi4qMTIuKjAuKkNvbnRlbnRzIG9mIG9uZV9kb3VibGVfdDpcWyBcblxyXHRcXSsxLjExMTExMFxbIFxuXHJcdFxdK0NvbnRlbnRzIG9mIG9uZV9kb3VibGVfdDpcWyBcblxyXHRcXSstMzQ1LjM0MDAwMFxbIFxuXHJcdFxdK0NvbnRlbnRzIG9mIG9uZV9kb3VibGVfdDpcWyBcblxyXHRcXSs1NDY0NjQuMjAwMDAwXFsgXG5cclx0XF0rQ29udGVudHMgb2YgdHdvX2Zsb2F0c190OlxbIFxuXHJcdFxdKzAuMjM0MDAwXHQ0NTMuMTAwMDA2XFsgXG5cclx0XF0rQ29udGVudHMgb2YgdHdvX2Zsb2F0c190OlxbIFxuXHJcdFxdKzc4LjM0NTAwMVx0MjMuMDkwMDAwXFsgXG5cclx0XF0rQ29udGVudHMgb2YgdHdvX2Zsb2F0c190OlxbIFxuXHJcdFxdKy0yLjM0NTAwMFx0MS4wMDAwMDAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgcHJpbnRfbG9uZ19hcmdfbGlzdCIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwcmludF9sb25nX2FyZ19saXN0IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnRfbG9uZ19hcmdfbGlzdCIgfQorICB9CisKKworI2dvIC11bnRpbCAxMTA5CitnZGJfdGVzdCAidGJyZWFrIDExMDkiIFwKKyAgICAiQnJlYWtwb2ludC4qIGZpbGUgLipjYWxsLWFyLXN0LmMsIGxpbmUgMTEwOS4qIiBcCisgICAgInRicmVha3BvaW50IGxpbmUgMTEwOSIKKworZ2RiX3Rlc3QgY29udGludWUgIkNvbnRpbnVpbmdcXC4uKm1haW4gXFwoXFwpIGF0IC4qY2FsbC1hci1zdC5jOjExMDlcWyBcdFxuXHJcXSsxMTA5Lipjb21wdXRlX3dpdGhfc21hbGxfc3RydWN0c1xcKDM1XFwpOyIgXAorImNvbnRpbnVlIHRvIDExMDkiCisKKworI2NhbGwgc3VtX3N0cnVjdF9wcmludCgxMCwgKnN0cnVjdDEsICpzdHJ1Y3QyLCAqc3RydWN0MywgKnN0cnVjdDQpCitzZW5kX2dkYiAicHJpbnQgc3VtX3N0cnVjdF9wcmludCgxMCwgKnN0cnVjdDEsICpzdHJ1Y3QyLCAqc3RydWN0MywgKnN0cnVjdDQpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qU3VtIG9mIHRoZSA0IHN0cnVjdCB2YWx1ZXMgYW5kIHNlZWQgOlxbIFx0XG5cclxdKzIxOC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBzdW1fc3RydWN0X3ByaW50KDEwLCAqc3RydWN0MSwgKnN0cnVjdDIsICpzdHJ1Y3QzLCAqc3RydWN0NCkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgc3VtX3N0cnVjdF9wcmludCgxMCwgKnN0cnVjdDEsICpzdHJ1Y3QyLCAqc3RydWN0MywgKnN0cnVjdDQpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgc3VtX3N0cnVjdF9wcmludCgxMCwgKnN0cnVjdDEsICpzdHJ1Y3QyLCAqc3RydWN0MywgKnN0cnVjdDQpIiB9CisgIH0KKworCisjY2FsbCBwcmludF9zdHJ1Y3RfcmVwKCpzdHJ1Y3QxLCAqc3RydWN0MiwgKnN0cnVjdDMpCitzZW5kX2dkYiAicHJpbnQgcHJpbnRfc3RydWN0X3JlcCgqc3RydWN0MSwgKnN0cnVjdDIsICpzdHJ1Y3QzKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKkNvbnRlbnRzIG9mIHN0cnVjdDE6XFsgXHRcblxyXF0rICAgICAgICAyMiAgICAgICAgIDBcWyBcdFxuXHJcXStDb250ZW50cyBvZiBzdHJ1Y3QyOlxbIFx0XG5cclxdKyAgICAgICAgNDIgICAgICAgICAwXFsgXHRcblxyXF0rQ29udGVudHMgb2Ygc3RydWN0MzpcWyBcdFxuXHJcXSsgICAgICAgIDYyICAgICAgICAgMFxbIFx0XG5cclxdKy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBwcmludF9zdHJ1Y3RfcmVwKCpzdHJ1Y3QxLCAqc3RydWN0MiwgKnN0cnVjdDMpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHByaW50X3N0cnVjdF9yZXAoKnN0cnVjdDEsICpzdHJ1Y3QyLCAqc3RydWN0MykiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludF9zdHJ1Y3RfcmVwKCpzdHJ1Y3QxLCAqc3RydWN0MiwgKnN0cnVjdDMpIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IHByaW50X29uZV9sYXJnZV9zdHJ1Y3QoKmxpc3QxKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKiAgICAgICAgIDQgICAgICAgICAxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHByaW50X29uZV9sYXJnZV9zdHJ1Y3QoKmxpc3QxKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwcmludF9vbmVfbGFyZ2Vfc3RydWN0KCpsaXN0MSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludF9vbmVfbGFyZ2Vfc3RydWN0KCpsaXN0MSkiIH0KKyAgfQorCityZXR1cm4KKworfgpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jYWxsLXJ0LXN0LmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NhbGwtcnQtc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDQwYTcwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jYWxsLXJ0LXN0LmMKQEAgLTAsMCArMSw1MzAgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRFU1RTIDoKKyAqIGZ1bmN0aW9uIHJldHVybmluZyBsYXJnZSBzdHJ1Y3R1cmVzLCB3aGljaCBnbyBvbiB0aGUgc3RhY2sKKyAqIGZ1bmN0aW9ucyByZXR1cm5pbmcgdmFyaWVkIHNpemVkIHN0cnVjdHMgd2hpY2ggZ28gb24gaW4gdGhlIHJlZ2lzdGVycy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogQSBsYXJnZSBzdHJ1Y3R1cmUgKD4gNjQgYml0cykgdXNlZCB0byB0ZXN0IHBhc3NpbmcgbGFyZ2Ugc3RydWN0dXJlcyBhcworICogcGFyYW1ldGVycworICovCisKK3N0cnVjdCBhcnJheV9yZXBfaW5mb190IHsKKyAgIGludCAgIG5leHRfaW5kZXhbMTBdOyAKKyAgIGludCAgIHZhbHVlc1sxMF07CisgICBpbnQgICBoZWFkOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTbWFsbCBzdHJ1Y3R1cmVzICggPD0gNjQgYml0cykuIFRoZXNlIGFyZSB1c2VkIHRvIHRlc3QgcGFzc2luZyBzbWFsbCAKKyAqIHN0cnVjdHVyZXMgYXMgcGFyYW1ldGVycyBhbmQgdGVzdCBhcmd1bWVudCBzaXplIHByb21vdGlvbi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIC8qIDY0IGJpdHMKKyAgKi8KK3N0cnVjdCBzbWFsbF9yZXBfaW5mb190IHsKKyAgIGludCAgIHZhbHVlOworICAgaW50ICAgaGVhZDsKK307CisKKy8qIDYgYml0cyA6IHJlYWxseSBmaXRzIGluIDggYml0cyBhbmQgaXMgcHJvbW90ZWQgdG8gMzIgYml0cworICovCitzdHJ1Y3QgYml0X2ZsYWdzX3QgeworICAgICAgIHVuc2lnbmVkIGFscGhhICAgOjE7CisgICAgICAgdW5zaWduZWQgYmV0YSAgICA6MTsKKyAgICAgICB1bnNpZ25lZCBnYW1tYSAgIDoxOworICAgICAgIHVuc2lnbmVkIGRlbHRhICAgOjE7CisgICAgICAgdW5zaWduZWQgZXBzaWxvbiA6MTsKKyAgICAgICB1bnNpZ25lZCBvbWVnYSAgIDoxOworfTsKKworLyogMjIgYml0cyA6IHJlYWxseSBmaXRzIGluIDQwIGJpdHMgYW5kIGlzIHByb21vdGVkIHRvIDY0IGJpdHMKKyAqLworc3RydWN0IGJpdF9mbGFnc19jb21ib190IHsKKyAgICAgICB1bnNpZ25lZCBhbHBoYSAgIDoxOworICAgICAgIHVuc2lnbmVkIGJldGEgICAgOjE7CisgICAgICAgY2hhciAgICAgY2gxOworICAgICAgIHVuc2lnbmVkIGdhbW1hICAgOjE7CisgICAgICAgdW5zaWduZWQgZGVsdGEgICA6MTsKKyAgICAgICBjaGFyICAgICBjaDI7CisgICAgICAgdW5zaWduZWQgZXBzaWxvbiA6MTsKKyAgICAgICB1bnNpZ25lZCBvbWVnYSAgIDoxOworfTsKKworLyogNjQgYml0cworICovCitzdHJ1Y3Qgb25lX2RvdWJsZV90IHsKKyAgICAgICBkb3VibGUgZG91YmxlMTsKK307CisKKy8qIDY0IGJpdHMKKyAqLworc3RydWN0IHR3b19mbG9hdHNfdCB7CisgICAgICAgZmxvYXQgZmxvYXQxOworICAgICAgIGZsb2F0IGZsb2F0MjsKK307CisKKworLyogMjQgYml0cyA6IHByb21vdGVkIHRvIDMyIGJpdHMKKyAqLworc3RydWN0IHRocmVlX2NoYXJfdCB7CisgICAgICAgY2hhciBjaDE7CisgICAgICAgY2hhciBjaDI7CisgICAgICAgY2hhciBjaDM7Cit9OworCisvKiA0MCBiaXRzIDogcHJvbW90ZWQgdG8gNjQgYml0cworICovCitzdHJ1Y3QgZml2ZV9jaGFyX3QgeworICAgICAgIGNoYXIgY2gxOworICAgICAgIGNoYXIgY2gyOworICAgICAgIGNoYXIgY2gzOworICAgICAgIGNoYXIgY2g0OworICAgICAgIGNoYXIgY2g1OworfTsKKworLyogNDAgYml0cyA6IHByb21vdGVkIHRvIDY0IGJpdHMKKyAqLworc3RydWN0IGludF9jaGFyX2NvbWJvX3QgeworICAgICAgIGludCAgaW50MTsKKyAgICAgICBjaGFyIGNoMTsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMT09QX0NPVU5UIDogCisgKiBBIGRvIG5vdGhpbmcgZnVuY3Rpb24uIFVzZWQgdG8gcHJvdmlkZSBhIHBvaW50IGF0IHdoaWNoIGNhbGxzIGNhbiBiZSBtYWRlLiAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGxvb3BfY291bnQgKCkgeworCisgICAgIGludCBpbmRleDsKKworICAgICBmb3IgKGluZGV4PTA7IGluZGV4PDQ7IGluZGV4KyspOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOSVRfQklUX0ZMQUdTIDoKKyAqIEluaXRpYWxpemVzIGEgYml0X2ZsYWdzX3Qgc3RydWN0dXJlLiBDYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHNlZQorICogdGhlIGNhbGwgY29tbWFuZCBiZWhhdmlvciB3aGVuIGludGVnZXIgYXJndW1lbnRzIGRvIG5vdCBmaXQgaW50bworICogcmVnaXN0ZXJzIGFuZCBtdXN0IGJlIHBsYWNlZCBvbiB0aGUgc3RhY2suCisgKiBPVVQgc3RydWN0IGJpdF9mbGFnc190ICpiaXRfZmxhZ3MgLS0gc3RydWN0dXJlIHRvIGJlIGZpbGxlZAorICogSU4gIHVuc2lnbmVkIGEgIC0tIDAgb3IgMSAKKyAqIElOICB1bnNpZ25lZCBiICAtLSAwIG9yIDEgCisgKiBJTiAgdW5zaWduZWQgZyAgLS0gMCBvciAxIAorICogSU4gIHVuc2lnbmVkIGQgIC0tIDAgb3IgMSAKKyAqIElOICB1bnNpZ25lZCBlICAtLSAwIG9yIDEgCisgKiBJTiAgdW5zaWduZWQgbyAgLS0gMCBvciAxIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpbml0X2JpdF9mbGFncyAoYml0X2ZsYWdzLGEsYixnLGQsZSxvKSAKK3N0cnVjdCBiaXRfZmxhZ3NfdCAqYml0X2ZsYWdzOwordW5zaWduZWQgYTsKK3Vuc2lnbmVkIGI7Cit1bnNpZ25lZCBnOwordW5zaWduZWQgZDsKK3Vuc2lnbmVkIGU7Cit1bnNpZ25lZCBvOyAKK3sKKworICAgYml0X2ZsYWdzLT5hbHBoYSA9IGE7CisgICBiaXRfZmxhZ3MtPmJldGEgPSBiOworICAgYml0X2ZsYWdzLT5nYW1tYSA9IGc7CisgICBiaXRfZmxhZ3MtPmRlbHRhID0gZDsKKyAgIGJpdF9mbGFncy0+ZXBzaWxvbiA9IGU7CisgICBiaXRfZmxhZ3MtPm9tZWdhID0gbzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTklUX0JJVF9GTEFHU19DT01CTyA6CisgKiBJbml0aWFsaXplcyBhIGJpdF9mbGFnc19jb21ib190IHN0cnVjdHVyZS4gQ2FuIGNhbGwgdGhpcyBmdW5jdGlvbgorICogdG8gc2VlIHRoZSBjYWxsIGNvbW1hbmQgYmVoYXZpb3Igd2hlbiBpbnRlZ2VyIGFuZCBjaGFyYWN0ZXIgYXJndW1lbnRzCisgKiBkbyBub3QgZml0IGludG8gcmVnaXN0ZXJzIGFuZCBtdXN0IGJlIHBsYWNlZCBvbiB0aGUgc3RhY2suCisgKiBPVVQgc3RydWN0IGJpdF9mbGFnc19jb21ib190ICpiaXRfZmxhZ3NfY29tYm8gLS0gc3RydWN0dXJlIHRvIGZpbGwKKyAqIElOICB1bnNpZ25lZCBhICAtLSAwIG9yIDEgCisgKiBJTiAgdW5zaWduZWQgYiAgLS0gMCBvciAxIAorICogSU4gIGNoYXIgICAgIGNoMQorICogSU4gIHVuc2lnbmVkIGcgIC0tIDAgb3IgMSAKKyAqIElOICB1bnNpZ25lZCBkICAtLSAwIG9yIDEgCisgKiBJTiAgY2hhciAgICAgY2gyCisgKiBJTiAgdW5zaWduZWQgZSAgLS0gMCBvciAxIAorICogSU4gIHVuc2lnbmVkIG8gIC0tIDAgb3IgMSAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW5pdF9iaXRfZmxhZ3NfY29tYm8gKGJpdF9mbGFnc19jb21ibywgYSwgYiwgY2gxLCBnLCBkLCBjaDIsIGUsIG8pCitzdHJ1Y3QgYml0X2ZsYWdzX2NvbWJvX3QgKmJpdF9mbGFnc19jb21ibzsKK3Vuc2lnbmVkIGE7Cit1bnNpZ25lZCBiOworY2hhciBjaDE7Cit1bnNpZ25lZCBnOwordW5zaWduZWQgZDsKK2NoYXIgY2gyOwordW5zaWduZWQgZTsKK3Vuc2lnbmVkIG87Cit7CisKKyAgIGJpdF9mbGFnc19jb21iby0+YWxwaGEgPSBhOworICAgYml0X2ZsYWdzX2NvbWJvLT5iZXRhID0gYjsKKyAgIGJpdF9mbGFnc19jb21iby0+Y2gxID0gY2gxOworICAgYml0X2ZsYWdzX2NvbWJvLT5nYW1tYSA9IGc7CisgICBiaXRfZmxhZ3NfY29tYm8tPmRlbHRhID0gZDsKKyAgIGJpdF9mbGFnc19jb21iby0+Y2gyID0gY2gyOworICAgYml0X2ZsYWdzX2NvbWJvLT5lcHNpbG9uID0gZTsKKyAgIGJpdF9mbGFnc19jb21iby0+b21lZ2EgPSBvOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5JVF9PTkVfRE9VQkxFIDogCisgKiBPVVQgIHN0cnVjdCBvbmVfZG91YmxlX3QgKm9uZV9kb3VibGUgIC0tIHN0cnVjdHVyZSB0byBmaWxsIAorICogSU4gICBkb3VibGUgaW5pdF92YWwKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW5pdF9vbmVfZG91YmxlIChvbmVfZG91YmxlLCBpbml0X3ZhbCkKK3N0cnVjdCBvbmVfZG91YmxlX3QgKm9uZV9kb3VibGU7IAorZG91YmxlIGluaXRfdmFsOworeworCisgICAgIG9uZV9kb3VibGUtPmRvdWJsZTEgID0gaW5pdF92YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5JVF9UV09fRkxPQVRTIDogCisgKiBPVVQgc3RydWN0IHR3b19mbG9hdHNfdCAqdHdvX2Zsb2F0cyAtLSBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkCisgKiBJTiAgZmxvYXQgaW5pdF92YWwxIAorICogSU4gIGZsb2F0IGluaXRfdmFsMiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW5pdF90d29fZmxvYXRzICh0d29fZmxvYXRzLCBpbml0X3ZhbDEsIGluaXRfdmFsMikKK3N0cnVjdCB0d29fZmxvYXRzX3QgKnR3b19mbG9hdHM7CitmbG9hdCBpbml0X3ZhbDE7CitmbG9hdCBpbml0X3ZhbDI7Cit7CisKKyAgICAgdHdvX2Zsb2F0cy0+ZmxvYXQxID0gaW5pdF92YWwxOworICAgICB0d29fZmxvYXRzLT5mbG9hdDIgPSBpbml0X3ZhbDI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5JVF9USFJFRV9DSEFSUyA6IAorICogT1VUIHN0cnVjdCB0aHJlZV9jaGFyX3QgKnRocmVlX2NoYXIgLS0gc3RydWN0dXJlIHRvIGJlIGZpbGxlZAorICogSU4gIGNoYXIgaW5pdF92YWwxIAorICogSU4gIGNoYXIgaW5pdF92YWwyIAorICogSU4gIGNoYXIgaW5pdF92YWwzIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpbml0X3RocmVlX2NoYXJzICggdGhyZWVfY2hhciwgaW5pdF92YWwxLCBpbml0X3ZhbDIsIGluaXRfdmFsMykKK3N0cnVjdCB0aHJlZV9jaGFyX3QgKnRocmVlX2NoYXI7CitjaGFyIGluaXRfdmFsMTsKK2NoYXIgaW5pdF92YWwyOworY2hhciBpbml0X3ZhbDM7Cit7CisKKyAgICAgdGhyZWVfY2hhci0+Y2gxID0gaW5pdF92YWwxOworICAgICB0aHJlZV9jaGFyLT5jaDIgPSBpbml0X3ZhbDI7CisgICAgIHRocmVlX2NoYXItPmNoMyA9IGluaXRfdmFsMzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTklUX0ZJVkVfQ0hBUlMgOiAKKyAqIE9VVCBzdHJ1Y3QgZml2ZV9jaGFyX3QgKmZpdmVfY2hhciAtLSBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkCisgKiBJTiAgY2hhciBpbml0X3ZhbDEgCisgKiBJTiAgY2hhciBpbml0X3ZhbDIgCisgKiBJTiAgY2hhciBpbml0X3ZhbDMgCisgKiBJTiAgY2hhciBpbml0X3ZhbDQgCisgKiBJTiAgY2hhciBpbml0X3ZhbDUgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGluaXRfZml2ZV9jaGFycyAoIGZpdmVfY2hhciwgaW5pdF92YWwxLCBpbml0X3ZhbDIsIGluaXRfdmFsMywgaW5pdF92YWw0LCBpbml0X3ZhbDUpCitzdHJ1Y3QgZml2ZV9jaGFyX3QgKmZpdmVfY2hhcjsKK2NoYXIgaW5pdF92YWwxOworY2hhciBpbml0X3ZhbDI7CitjaGFyIGluaXRfdmFsMzsKK2NoYXIgaW5pdF92YWw0OworY2hhciBpbml0X3ZhbDU7Cit7CisKKyAgICAgZml2ZV9jaGFyLT5jaDEgPSBpbml0X3ZhbDE7CisgICAgIGZpdmVfY2hhci0+Y2gyID0gaW5pdF92YWwyOworICAgICBmaXZlX2NoYXItPmNoMyA9IGluaXRfdmFsMzsKKyAgICAgZml2ZV9jaGFyLT5jaDQgPSBpbml0X3ZhbDQ7CisgICAgIGZpdmVfY2hhci0+Y2g1ID0gaW5pdF92YWw1OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOSVRfSU5UX0NIQVJfQ09NQk8gOiAKKyAqIE9VVCBzdHJ1Y3QgaW50X2NoYXJfY29tYm9fdCAqY29tYm8gLS0gc3RydWN0dXJlIHRvIGJlIGZpbGxlZAorICogSU4gIGludCAgaW5pdF92YWwxIAorICogSU4gIGNoYXIgaW5pdF92YWwyIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpbml0X2ludF9jaGFyX2NvbWJvICggY29tYm8sIGluaXRfdmFsMSwgaW5pdF92YWwyKQorc3RydWN0IGludF9jaGFyX2NvbWJvX3QgKmNvbWJvOworaW50IGluaXRfdmFsMTsKK2NoYXIgaW5pdF92YWwyOworeworCisgICAgIGNvbWJvLT5pbnQxID0gaW5pdF92YWwxOworICAgICBjb21iby0+Y2gxID0gaW5pdF92YWwyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOSVRfU1RSVUNUX1JFUCA6IAorICogT1VUIHN0cnVjdCBzbWFsbF9yZXBfaW50b190ICpzbWFsbF9zdHJ1Y3QgLS0gc3RydWN0dXJlIHRvIGJlIGZpbGxlZAorICogSU4gIGludCAgc2VlZCAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW5pdF9zdHJ1Y3RfcmVwKCBzbWFsbF9zdHJ1Y3QsIHNlZWQpCitzdHJ1Y3Qgc21hbGxfcmVwX2luZm9fdCAqc21hbGxfc3RydWN0OworaW50ICAgIHNlZWQ7CisKK3sKKworICAgICAgc21hbGxfc3RydWN0LT52YWx1ZSA9IDIgKyAoc2VlZCoyKTsgCisgICAgICBzbWFsbF9zdHJ1Y3QtPmhlYWQgPSAwOyAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQUklOVF9CSVRfRkxBR1MgOiAKKyAqIElOIHN0cnVjdCBiaXRfZmxhZ3NfdCBiaXRfZmxhZ3MgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBiaXRfZmxhZ3NfdCBwcmludF9iaXRfZmxhZ3MgKCBiaXRfZmxhZ3MpCitzdHJ1Y3QgYml0X2ZsYWdzX3QgYml0X2ZsYWdzOworeworCisgICAgIGlmIChiaXRfZmxhZ3MuYWxwaGEpIHByaW50ZigiYWxwaGFcbiIpOworICAgICBpZiAoYml0X2ZsYWdzLmJldGEpIHByaW50ZigiYmV0YVxuIik7CisgICAgIGlmIChiaXRfZmxhZ3MuZ2FtbWEpIHByaW50ZigiZ2FtbWFcbiIpOworICAgICBpZiAoYml0X2ZsYWdzLmRlbHRhKSBwcmludGYoImRlbHRhXG4iKTsKKyAgICAgaWYgKGJpdF9mbGFncy5lcHNpbG9uKSBwcmludGYoImVwc2lsb25cbiIpOworICAgICBpZiAoYml0X2ZsYWdzLm9tZWdhKSBwcmludGYoIm9tZWdhXG4iKTsKKyAgICAgcmV0dXJuIGJpdF9mbGFnczsKKyAgICAgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUFJJTlRfQklUX0ZMQUdTX0NPTUJPIDogCisgKiBJTiBzdHJ1Y3QgYml0X2ZsYWdzX2NvbWJvX3QgYml0X2ZsYWdzX2NvbWJvIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgYml0X2ZsYWdzX2NvbWJvX3QgcHJpbnRfYml0X2ZsYWdzX2NvbWJvICggYml0X2ZsYWdzX2NvbWJvICkKK3N0cnVjdCBiaXRfZmxhZ3NfY29tYm9fdCBiaXRfZmxhZ3NfY29tYm87Cit7CisKKyAgICAgaWYgKGJpdF9mbGFnc19jb21iby5hbHBoYSkgcHJpbnRmKCJhbHBoYVxuIik7CisgICAgIGlmIChiaXRfZmxhZ3NfY29tYm8uYmV0YSkgcHJpbnRmKCJiZXRhXG4iKTsKKyAgICAgaWYgKGJpdF9mbGFnc19jb21iby5nYW1tYSkgcHJpbnRmKCJnYW1tYVxuIik7CisgICAgIGlmIChiaXRfZmxhZ3NfY29tYm8uZGVsdGEpIHByaW50ZigiZGVsdGFcbiIpOworICAgICBpZiAoYml0X2ZsYWdzX2NvbWJvLmVwc2lsb24pIHByaW50ZigiZXBzaWxvblxuIik7CisgICAgIGlmIChiaXRfZmxhZ3NfY29tYm8ub21lZ2EpIHByaW50Zigib21lZ2FcbiIpOworICAgICBwcmludGYoImNoMTogJWNcdGNoMjogJWNcbiIsIGJpdF9mbGFnc19jb21iby5jaDEsIGJpdF9mbGFnc19jb21iby5jaDIpOworICAgICByZXR1cm4gYml0X2ZsYWdzX2NvbWJvOworICAgICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQUklOVF9PTkVfRE9VQkxFIDogCisgKiBJTiBzdHJ1Y3Qgb25lX2RvdWJsZV90IG9uZV9kb3VibGUgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBvbmVfZG91YmxlX3QgcHJpbnRfb25lX2RvdWJsZSAoIG9uZV9kb3VibGUgKQorc3RydWN0IG9uZV9kb3VibGVfdCBvbmVfZG91YmxlOworeworCisgICAgIHByaW50ZigiQ29udGVudHMgb2Ygb25lX2RvdWJsZV90OiBcblxuIik7CisgICAgIHByaW50ZigiJWZcbiIsIG9uZV9kb3VibGUuZG91YmxlMSk7CisgICAgIHJldHVybiBvbmVfZG91YmxlOworICAgICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQUklOVF9UV09fRkxPQVRTIDogCisgKiBJTiBzdHJ1Y3QgdHdvX2Zsb2F0c190IHR3b19mbG9hdHMgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCB0d29fZmxvYXRzX3QgcHJpbnRfdHdvX2Zsb2F0cyAoIHR3b19mbG9hdHMgKSAKK3N0cnVjdCB0d29fZmxvYXRzX3QgdHdvX2Zsb2F0czsKK3sKKworICAgICBwcmludGYoIkNvbnRlbnRzIG9mIHR3b19mbG9hdHNfdDogXG5cbiIpOworICAgICBwcmludGYoIiVmXHQlZlxuIiwgdHdvX2Zsb2F0cy5mbG9hdDEsIHR3b19mbG9hdHMuZmxvYXQyKTsKKyAgICAgcmV0dXJuIHR3b19mbG9hdHM7CisgICAgIAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBSSU5UX1RIUkVFX0NIQVJTIDogCisgKiBJTiBzdHJ1Y3QgdGhyZWVfY2hhcl90IHRocmVlX2NoYXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHRocmVlX2NoYXJfdCBwcmludF90aHJlZV9jaGFycyAoIHRocmVlX2NoYXIgKSAKK3N0cnVjdCB0aHJlZV9jaGFyX3QgdGhyZWVfY2hhcjsKK3sKKworICAgICBwcmludGYoIkNvbnRlbnRzIG9mIHRocmVlX2NoYXJfdDogXG5cbiIpOworICAgICBwcmludGYoIiVjXHQlY1x0JWNcbiIsIHRocmVlX2NoYXIuY2gxLCB0aHJlZV9jaGFyLmNoMiwgdGhyZWVfY2hhci5jaDMpOworICAgICByZXR1cm4gdGhyZWVfY2hhcjsKKyAgICAgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUFJJTlRfRklWRV9DSEFSUyA6IAorICogSU4gc3RydWN0IGZpdmVfY2hhcl90IGZpdmVfY2hhcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZml2ZV9jaGFyX3QgcHJpbnRfZml2ZV9jaGFycyAoIGZpdmVfY2hhciApCitzdHJ1Y3QgZml2ZV9jaGFyX3QgZml2ZV9jaGFyOworeworCisgICAgIHByaW50ZigiQ29udGVudHMgb2YgZml2ZV9jaGFyX3Q6IFxuXG4iKTsKKyAgICAgcHJpbnRmKCIlY1x0JWNcdCVjXHQlY1x0JWNcbiIsIGZpdmVfY2hhci5jaDEsIGZpdmVfY2hhci5jaDIsIAorCQkJCSAgICBmaXZlX2NoYXIuY2gzLCBmaXZlX2NoYXIuY2g0LCAKKwkJCQkgICAgZml2ZV9jaGFyLmNoNSk7CisgICAgIHJldHVybiBmaXZlX2NoYXI7CisgICAgIAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBSSU5UX0lOVF9DSEFSX0NPTUJPIDogCisgKiBJTiBzdHJ1Y3QgaW50X2NoYXJfY29tYm9fdCBpbnRfY2hhcl9jb21ibworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgaW50X2NoYXJfY29tYm9fdCBwcmludF9pbnRfY2hhcl9jb21ibyAoIGludF9jaGFyX2NvbWJvICkKK3N0cnVjdCBpbnRfY2hhcl9jb21ib190IGludF9jaGFyX2NvbWJvOworeworCisgICAgIHByaW50ZigiQ29udGVudHMgb2YgaW50X2NoYXJfY29tYm9fdDogXG5cbiIpOworICAgICBwcmludGYoIiVkXHQlY1xuIiwgaW50X2NoYXJfY29tYm8uaW50MSwgaW50X2NoYXJfY29tYm8uY2gxKTsKKyAgICAgcmV0dXJuIGludF9jaGFyX2NvbWJvOworICAgICAKK30gICAgIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBSSU5UX1NUUlVDVF9SRVAgOiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHNtYWxsX3JlcF9pbmZvX3QgcHJpbnRfc3RydWN0X3JlcCggc3RydWN0MSApCitzdHJ1Y3Qgc21hbGxfcmVwX2luZm9fdCBzdHJ1Y3QxOworCit7CisKKyAgcHJpbnRmKCJDb250ZW50cyBvZiBzdHJ1Y3QxOiBcblxuIik7CisgIHByaW50ZigiJTEwZCUxMGRcbiIsIHN0cnVjdDEudmFsdWUsIHN0cnVjdDEuaGVhZCk7IAorICBzdHJ1Y3QxLnZhbHVlID0rNTsKKyAgCisgIHJldHVybiBzdHJ1Y3QxOworICAKKworfQorCisKK3N0cnVjdCBhcnJheV9yZXBfaW5mb190IHByaW50X29uZV9sYXJnZV9zdHJ1Y3QoIGxpbmtlZF9saXN0MSApCitzdHJ1Y3QgYXJyYXlfcmVwX2luZm9fdCBsaW5rZWRfbGlzdDE7Cit7CisKKworICAgICAgcHJpbnRmKCIlMTBkJTEwZFxuIiwgbGlua2VkX2xpc3QxLnZhbHVlc1swXSwgCisJCQkgICBsaW5rZWRfbGlzdDEubmV4dF9pbmRleFswXSk7IAorIAorICAgICAgcmV0dXJuIGxpbmtlZF9saXN0MTsKKyAgICAgIAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElOSVRfQVJSQVlfUkVQIDoKKyAqIElOIHN0cnVjdCBhcnJheV9yZXBfaW5mb190ICpsaW5rZWRfbGlzdAorICogSU4gaW50ICAgIHNlZWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpbml0X2FycmF5X3JlcCggbGlua2VkX2xpc3QsIHNlZWQgKQorc3RydWN0IGFycmF5X3JlcF9pbmZvX3QgKmxpbmtlZF9saXN0OworaW50ICAgIHNlZWQ7CisKK3sKKworICBpbnQgaW5kZXg7CisKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMTA7IGluZGV4KyspIHsKKworICAgICAgbGlua2VkX2xpc3QtPnZhbHVlc1tpbmRleF0gPSAoMippbmRleCkgKyAoc2VlZCoyKTsKKyAgICAgIGxpbmtlZF9saXN0LT5uZXh0X2luZGV4W2luZGV4XSA9IGluZGV4ICsgMTsKKyAgfQorICBsaW5rZWRfbGlzdC0+aGVhZCA9IDA7Cit9CisKKworaW50IG1haW4gKCkgIHsKKyAgIAorICAvKiB2YXJpYWJsZXMgZm9yIGxhcmdlIHN0cnVjdHVyZSB0ZXN0aW5nCisgICAqLworICBpbnQgbnVtYmVyID0gMTA7CisgIHN0cnVjdCBhcnJheV9yZXBfaW5mb190ICpsaXN0MTsKKworICAvKiB2YXJpYWJsZXMgZm9yIHRlc3RpbmcgYSBzbWFsbCBzdHJ1Y3R1cmVzIGFuZCBhIHZlcnkgbG9uZyBhcmd1bWVudCBsaXN0CisgICAqLworICAgc3RydWN0IHNtYWxsX3JlcF9pbmZvX3QgICpzdHJ1Y3QxOworICAgc3RydWN0IGJpdF9mbGFnc190ICAgICAgICpmbGFnczsKKyAgIHN0cnVjdCBiaXRfZmxhZ3NfY29tYm9fdCAqZmxhZ3NfY29tYm87CisgICBzdHJ1Y3QgdGhyZWVfY2hhcl90ICAgICAgKnRocmVlX2NoYXI7CisgICBzdHJ1Y3QgZml2ZV9jaGFyX3QgICAgICAgKmZpdmVfY2hhcjsKKyAgIHN0cnVjdCBpbnRfY2hhcl9jb21ib190ICAqaW50X2NoYXJfY29tYm87CisgICBzdHJ1Y3Qgb25lX2RvdWJsZV90ICAgICAgKmQxOworICAgc3RydWN0IHR3b19mbG9hdHNfdCAgICAgICpmMzsKKworCisgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBsYXJnZSBzdHJ1Y3R1cmVzIAorICAgKi8KKyAgbGlzdDEgPSAoc3RydWN0IGFycmF5X3JlcF9pbmZvX3QgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBhcnJheV9yZXBfaW5mb190KSk7CisKKyAgLyogSW5pdGlhbGl6ZSBsYXJnZSBzdHJ1Y3R1cmVzIAorICAgKi8KKyAgaW5pdF9hcnJheV9yZXAobGlzdDEsIDIpOworCisgIC8qIFByaW50IGxhcmdlIHN0cnVjdHVyZXMgCisgICAqLworICBwcmludF9vbmVfbGFyZ2Vfc3RydWN0KCpsaXN0MSk7CisKKyAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHNtYWxsIHN0cnVjdHVyZXMgCisgICAqLworICBzdHJ1Y3QxICAgICA9IChzdHJ1Y3Qgc21hbGxfcmVwX2luZm9fdCAgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbWFsbF9yZXBfaW5mb190KSk7CisgIGZsYWdzICAgICAgID0gKHN0cnVjdCBiaXRfZmxhZ3NfdCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGJpdF9mbGFnc190KSk7CisgIGZsYWdzX2NvbWJvID0gKHN0cnVjdCBiaXRfZmxhZ3NfY29tYm9fdCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGJpdF9mbGFnc19jb21ib190KSk7CisgIHRocmVlX2NoYXIgID0gKHN0cnVjdCB0aHJlZV9jaGFyX3QgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCB0aHJlZV9jaGFyX3QpKTsKKyAgZml2ZV9jaGFyICAgPSAoc3RydWN0IGZpdmVfY2hhcl90ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZml2ZV9jaGFyX3QpKTsKKyAgaW50X2NoYXJfY29tYm8gPSAoc3RydWN0IGludF9jaGFyX2NvbWJvX3QgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbnRfY2hhcl9jb21ib190KSk7CisKKyAgZDEgPSAoc3RydWN0IG9uZV9kb3VibGVfdCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IG9uZV9kb3VibGVfdCkpOworICBmMyA9IChzdHJ1Y3QgdHdvX2Zsb2F0c190ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHdvX2Zsb2F0c190KSk7CisKKyAgLyogSW5pdGlhbGl6ZSBzbWFsbCBzdHJ1Y3R1cmVzIAorICAgKi8KKyAgaW5pdF9vbmVfZG91YmxlICggZDEsIDEuMTExMTEpOyAKKyAgaW5pdF90d29fZmxvYXRzICggZjMsIC0yLjM0NSwgMS4wKTsgCisgIGluaXRfYml0X2ZsYWdzKGZsYWdzLCAodW5zaWduZWQpMSwgKHVuc2lnbmVkKTAsICh1bnNpZ25lZCkxLCAKKwkJICh1bnNpZ25lZCkwLCAodW5zaWduZWQpMSwgKHVuc2lnbmVkKTAgKTsgCisgIGluaXRfYml0X2ZsYWdzX2NvbWJvKGZsYWdzX2NvbWJvLCAodW5zaWduZWQpMSwgKHVuc2lnbmVkKTAsICd5JywKKwkJCQkgICAgICh1bnNpZ25lZCkxLCAodW5zaWduZWQpMCwgJ24nLAorCQkJCSAgICAgKHVuc2lnbmVkKTEsICh1bnNpZ25lZCkwICk7IAorICBpbml0X3RocmVlX2NoYXJzKHRocmVlX2NoYXIsICd4JywgJ3knLCAneicpOworICBpbml0X2ZpdmVfY2hhcnMoZml2ZV9jaGFyLCAnaCcsICdlJywgJ2wnLCAnbCcsICdvJyk7CisgIGluaXRfaW50X2NoYXJfY29tYm8oaW50X2NoYXJfY29tYm8sIDEzLCAnIScpOworICBpbml0X3N0cnVjdF9yZXAoc3RydWN0MSwgMTApOworIAorIAorICAvKiBQcmludCBzbWFsbCBzdHJ1Y3R1cmVzIAorICAgKi8KKyAgcHJpbnRfb25lX2RvdWJsZSgqZDEpOworICBwcmludF90d29fZmxvYXRzKCpmMyk7CisgIHByaW50X2JpdF9mbGFncygqZmxhZ3MpOworICBwcmludF9iaXRfZmxhZ3NfY29tYm8oKmZsYWdzX2NvbWJvKTsKKyAgcHJpbnRfdGhyZWVfY2hhcnMoKnRocmVlX2NoYXIpOworICBwcmludF9maXZlX2NoYXJzKCpmaXZlX2NoYXIpOworICBwcmludF9pbnRfY2hhcl9jb21ibygqaW50X2NoYXJfY29tYm8pOworICBwcmludF9zdHJ1Y3RfcmVwKCpzdHJ1Y3QxKTsKKworICBsb29wX2NvdW50KCk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NhbGwtcnQtc3QuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jYWxsLXJ0LXN0LmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmNhMTRjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jYWxsLXJ0LXN0LmV4cApAQCAtMCwwICsxLDIzMCBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEVsZW5hIFphbm5vbmkgKGV6YW5ub25pQGN5Z251cy5jb20pCisKKyMgdGhpcyBmaWxlIHRlc3RzIGNvbW1hbmQgbGluZSBjYWxscyB3aXRoIGZ1bmN0aW9ucyByZXR1cm5pbmcgc3RydWN0dXJlcworIyBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlOiBjYWxsX3JldHVybl9zdHJ1Y3QuYworCisKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisgICAgICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJjYWxsLXJ0LXN0Igorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYWRkaXRpb25hbF9mbGFncz0td31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKKyAgICB9CisKKworCisjIENyZWF0ZSBhbmQgc291cmNlIHRoZSBmaWxlIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyCisjIHVzZWQgdG8gY29tcGlsZSB0aGUgdGVzdCBjYXNlLgorCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0geworICAgIHJldHVybiAtMTsKK30KKworIyBUaGUgYTI5ayBjYW4ndCBjYWxsIGZ1bmN0aW9ucywgc28gZG9uJ3QgZXZlbiBib3RoZXIgd2l0aCB0aGlzIHRlc3QuCitpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYixjYW5ub3RfY2FsbF9mdW5jdGlvbnNdIHsKKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiIDI0MTYKKyAgICBmYWlsICJUaGlzIHRhcmdldCBjYW4gbm90IGNhbGwgZnVuY3Rpb25zIgorICAgIGNvbnRpbnVlCit9CisKKyMgU2V0IHRoZSBjdXJyZW50IGxhbmd1YWdlIHRvIEMuICBUaGlzIGNvdW50cyBhcyBhIHRlc3QuICBJZiBpdAorIyBmYWlscywgdGhlbiB3ZSBza2lwIHRoZSBvdGhlciB0ZXN0cy4KKworcHJvYyBzZXRfbGFuZ19jIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgc2VuZF9nZGIgInNldCBsYW5ndWFnZSBjXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9CisJdGltZW91dCB7IGZhaWwgInNldCBsYW5ndWFnZSBjICh0aW1lb3V0KSIgOyByZXR1cm4gMDsgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJzaG93IGxhbmd1YWdlXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiBzb3VyY2UgbGFuZ3VhZ2UgaXMgXCJjXCIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAic2V0IGxhbmd1YWdlIHRvIFwiY1wiIgorCSAgICByZXR1cm4gMQorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJzZXR0aW5nIGxhbmd1YWdlIHRvIFwiY1wiIgorCSAgICByZXR1cm4gMAorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAiY2FuJ3Qgc2hvdyBsYW5ndWFnZSAodGltZW91dCkiCisJICAgIHJldHVybiAwCisJfQorICAgIH0KK30KKworCisKK3NvdXJjZSAke2JpbmZpbGV9LmNpCisKKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KK3NlbmRfZ2RiICJzZXQgcHJpbnQgc2V2ZW5iaXQtc3RyaW5nc1xuIiA7IGdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIgorc2VuZF9nZGIgInNldCBwcmludCBhZGRyZXNzIG9mZlxuIiA7IGdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIgorc2VuZF9nZGIgInNldCB3aWR0aCAwXG4iIDsgZ2RiX2V4cGVjdCAtcmUgIiRnZGJfcHJvbXB0ICQiCisKKworaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgICBwZXJyb3IgImNvdWxkbid0IHJ1biB0byBicmVha3BvaW50IgorICAgIGNvbnRpbnVlCit9CisKKworZ2RiX3Rlc3QgImJyZWFrIGxvb3BfY291bnQiIFwKKyAgICAiQnJlYWtwb2ludC4qIGZpbGUgLipjYWxsLXJ0LXN0LmMsIGxpbmUgMTA2XFwuIiBcCisgICAgImJyZWFrcG9pbnQgbG9vcF9jb3VudCIKKworCitzZW5kX2dkYiAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworIC1yZSAgIkNvbnRpbnVpbmdcXC4uKkJyZWFrcG9pbnQuKmxvb3BfY291bnQgXFwoXFwpIGF0LipjYWxsLXJ0LXN0LmM6MTA2XFsgXHRcclxuXF0rMTA2XFtcdCBcXStmb3IgXFwoaW5kZXg9MDsgaW5kZXguNDsgaW5kZXguLlxcKTtcW1xyXG4gXF0rJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICBwYXNzICJjb250aW51ZSB0byBsb29wX2NvdW50In0KKyAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbnRpbnVlIHRvIGxvb3BfY291bnQifSAgICAgICAgICAgCisgICAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBjb250aW51ZSB0byBsb29wX2NvdW50In0KK30KKworc2VuZF9nZGIgImZpbmlzaFxuIgorZ2RiX2V4cGVjdCB7CisgLXJlICAiUnVuIHRpbGwgZXhpdCBmcm9tIC4wICBsb29wX2NvdW50IFxcKFxcKSBhdC4qY2FsbC1ydC1zdC5jOjEwNlxbIFx0XHJcblxdK21haW4gXFwoXFwpIGF0LipjYWxsLXJ0LXN0LmM6NTE0XFsgXHRcclxuXF0rNTE0XFtcdCBcXStyZXR1cm4gMDsuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgcGFzcyAiZmluaXNoIG91dCBmcm9tICBsb29wX2NvdW50In0KKyAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImZpbmlzaCBvdXQgZnJvbSBsb29wX2NvdW50In0gICAgICAgICAgIAorICAgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dClmaW5pc2ggb3V0IGZyb20gbG9vcF9jb3VudCJ9Cit9CisKKworc2VuZF9nZGIgInByaW50IHByaW50X3N0cnVjdF9yZXAoKnN0cnVjdDEpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qQ29udGVudHMgb2Ygc3RydWN0MTpcWyBcdFxuXHJcXSsyMlxbIFx0XF0rMFxbIFx0XG5cclxdKy5cWzAtOVxdKyA9IFx7dmFsdWUgPSA1LCBoZWFkID0gMFx9LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHByaW50X3N0cnVjdF9yZXAoKnN0cnVjdDEsICpzdHJ1Y3QyLCAqc3RydWN0MykiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgcHJpbnRfc3RydWN0X3JlcCgqc3RydWN0MSwgKnN0cnVjdDIsICpzdHJ1Y3QzKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50X3N0cnVjdF9yZXAoKnN0cnVjdDEsICpzdHJ1Y3QyLCAqc3RydWN0MykiIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgcHJpbnRfb25lX2xhcmdlX3N0cnVjdCgqbGlzdDEpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qXFsgXHRcXSs0XFsgXHRcXSsxXFsgXHJcblxdKy5cWzAtOVxdKyA9IFx7bmV4dF9pbmRleCA9IFx7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBcfSwgdmFsdWVzID0gXHs0LCA2LCA4LCAxMCwgMTIsIDE0LCAxNiwgMTgsIDIwLCAyMlx9LCBoZWFkID0gMFx9LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHByaW50X29uZV9sYXJnZV9zdHJ1Y3QoKmxpc3QxKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwcmludF9vbmVfbGFyZ2Vfc3RydWN0KCpsaXN0MSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludF9vbmVfbGFyZ2Vfc3RydWN0KCpsaXN0MSkiIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgcHJpbnRfb25lX2RvdWJsZSgqZDEpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qQ29udGVudHMgb2Ygb25lX2RvdWJsZV90OlxbIFxyXG5cXSsxXFwuMTExMTEwXFsgXHJcblxdKy5cWzAtOVxdKyA9IFx7ZG91YmxlMSA9IDFcXC4xMTExMVx9LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHByaW50X29uZV9kb3VibGUoKmQxKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwcmludF9vbmVfZG91YmxlKCpkMSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludF9vbmVfZG91YmxlKCpkMSkiIH0KKyAgfQorCisKKworc2VuZF9nZGIgInByaW50IHByaW50X3R3b19mbG9hdHMoKmYzKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKkNvbnRlbnRzIG9mIHR3b19mbG9hdHNfdDpcWyBcclxuXF0rLTJcXC4zNDUwMDBcWyBcdF0rMVxcLjAwMDAwMFxbIFxyXG5cXSsuXFswLTlcXSsgPSBce2Zsb2F0MSA9IC0yXFwuMzQ1MDAwMDMsIGZsb2F0MiA9IDFcfS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBwcmludF90d29fZmxvYXRzKCpmMykiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgcHJpbnRfdHdvX2Zsb2F0cygqZjMpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnRfdHdvX2Zsb2F0cygqZjMpIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IHByaW50X2JpdF9mbGFncygqZmxhZ3MpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qYWxwaGFcWyBcclxuXF0rZ2FtbWFcWyBcclxuXF0rZXBzaWxvblxbIFxyXG5cXSsuXFswLTlcXSsgPSBce2FscGhhID0gMSwgYmV0YSA9IDAsIGdhbW1hID0gMSwgZGVsdGEgPSAwLCBlcHNpbG9uID0gMSwgb21lZ2EgPSAwXH1cWyBcclxuXF0rJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBwcmludF9iaXRfZmxhZ3MoKmZsYWdzKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwcmludF9iaXRfZmxhZ3MoKmZsYWdzKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50X2JpdF9mbGFncygqZmxhZ3MpIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IHByaW50X2JpdF9mbGFnc19jb21ibygqZmxhZ3NfY29tYm8pXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qYWxwaGFcWyBcclxuXF0rZ2FtbWFcWyBcclxuXF0rZXBzaWxvblxbIFxyXG5cXStjaDE6IHlcWyBcdFxdK2NoMjogblxbIFxyXG5cXSsuXFswLTlcXSsgPSBce2FscGhhID0gMSwgYmV0YSA9IDAsIGNoMSA9IDEyMSAneScsIGdhbW1hID0gMSwgZGVsdGEgPSAwLCBjaDIgPSAxMTAgJ24nLCBlcHNpbG9uID0gMSwgb21lZ2EgPSAwXH1cWyBcclxuXF0rJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBwcmludF9iaXRfZmxhZ3NfY29tYm8oKmZsYWdzX2NvbWJvKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwcmludF9iaXRfZmxhZ3NfY29tYm8oKmZsYWdzX2NvbWJvKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50X2JpdF9mbGFnc19jb21ibygqZmxhZ3NfY29tYm8pIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IHByaW50X3RocmVlX2NoYXJzKCp0aHJlZV9jaGFyKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKkNvbnRlbnRzIG9mIHRocmVlX2NoYXJfdDpcWyBcclxuXF0reFxbIFx0XF0reVxbIFx0XF0relxbIFxyXG5cXSsuXFswLTlcXSsgPSBce2NoMSA9IDEyMCAneCcsIGNoMiA9IDEyMSAneScsIGNoMyA9IDEyMiAneidcfVxbIFxyXG5cXSskZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHByaW50X3RocmVlX2NoYXJzKCp0aHJlZV9jaGFyKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwcmludF90aHJlZV9jaGFycygqdGhyZWVfY2hhcikiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludF90aHJlZV9jaGFycygqdGhyZWVfY2hhcikiIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgcHJpbnRfZml2ZV9jaGFycygqZml2ZV9jaGFyKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKkNvbnRlbnRzIG9mIGZpdmVfY2hhcl90OlxbIFxyXG5cXStoXFsgXHRcXStlXFsgXHRcXStsXFsgXHRcXStsXFsgXHRcXStvXFsgXHJcblxdKy5cWzAtOVxdKyA9IFx7Y2gxID0gMTA0ICdoJywgY2gyID0gMTAxICdlJywgY2gzID0gMTA4ICdsJywgY2g0ID0gMTA4ICdsJywgY2g1ID0gMTExICdvJ1x9XFsgXHJcblxdKyRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgcHJpbnRfZml2ZV9jaGFycygqZml2ZV9jaGFyKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwcmludF9maXZlX2NoYXJzKCpmaXZlX2NoYXIpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnRfZml2ZV9jaGFycygqZml2ZV9jaGFyKSIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBwcmludF9pbnRfY2hhcl9jb21ibygqaW50X2NoYXJfY29tYm8pXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qQ29udGVudHMgb2YgaW50X2NoYXJfY29tYm9fdDpcWyBcclxuXF0rMTNcWyBcdFxdKyFcWyBcclxuXF0rLlxbMC05XF0rID0gXHtpbnQxID0gMTMsIGNoMSA9IDMzICchJ1x9XFsgXHJcblxdKyRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgcHJpbnRfaW50X2NoYXJfY29tYm8oKmludF9jaGFyX2NvbWJvKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwcmludF9pbnRfY2hhcl9jb21ibygqaW50X2NoYXJfY29tYm8pIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnRfaW50X2NoYXJfY29tYm8oKmludF9jaGFyX2NvbWJvKSIgfQorICB9CisKK3JldHVybgorCisKKworCisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jYWxsLXN0cnMuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY2FsbC1zdHJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhODc1YgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY2FsbC1zdHJzLmMKQEAgLTAsMCArMSw1NCBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CitjaGFyIGJ1ZlsxMDBdOworY2hhciBiaWdidWZbMTAwMF07CitjaGFyICogczsKKworY2hhciAqIHN0cl9mdW5jMShzMSkKK2NoYXIgKnMxOworeworICBwcmludGYoImZpcnN0IHN0cmluZyBhcmcgaXM6ICVzXG4iLCBzMSk7CisgIHN0cmNweShiaWdidWYsIHMxKTsKKyAgcmV0dXJuIGJpZ2J1ZjsKK30KKworY2hhciAqIHN0cl9mdW5jKHMxLCAKKyAgICAgICAgICAgICAgICBzMiwKKyAgICAgICAgICAgICAgIHMzLAorICAgICAgICAgICAgICAgczQsCisgICAgICAgICAgICAgICBzNSwKKyAgICAgICAgICAgICAgIHM2LAorICAgICAgICAgICAgICAgczcpCitjaGFyICogczE7IAorY2hhciAqIHMyOworY2hhciAqIHMzOworY2hhciAqIHM0OworY2hhciAqIHM1OworY2hhciAqIHM2OworY2hhciAqIHM3OworeworICBwcmludGYoImZpcnN0IHN0cmluZyBhcmcgaXM6ICVzXG4iLCBzMSk7CisgIHByaW50Zigic2Vjb25kIHN0cmluZyBhcmcgaXM6ICVzXG4iLCBzMik7CisgIHByaW50ZigidGhpcmQgc3RyaW5nIGFyZyBpczogJXNcbiIsIHMzKTsKKyAgcHJpbnRmKCJmb3VydGggc3RyaW5nIGFyZyBpczogJXNcbiIsIHM0KTsKKyAgcHJpbnRmKCJmaWZ0aCBzdHJpbmcgYXJnIGlzOiAlc1xuIiwgczUpOworICBwcmludGYoInNpeHRoIHN0cmluZyBhcmcgaXM6ICVzXG4iLCBzNik7CisgIHByaW50Zigic2V2ZW50aCBzdHJpbmcgYXJnIGlzOiAlc1xuIiwgczcpOworICBzdHJjcHkoYmlnYnVmLCBzMSk7CisgIHN0cmNhdChiaWdidWYsIHMyKTsKKyAgc3RyY2F0KGJpZ2J1ZiwgczMpOworICBzdHJjYXQoYmlnYnVmLCBzNCk7CisgIHN0cmNhdChiaWdidWYsIHM1KTsKKyAgc3RyY2F0KGJpZ2J1ZiwgczYpOworICBzdHJjYXQoYmlnYnVmLCBzNyk7CisgIHJldHVybiBiaWdidWY7Cit9CisKKworbWFpbigpCit7CisgIHMgPSAmYnVmWzBdOworICBzdHJjcHkoYnVmLCAidGVzdCBzdHJpbmciKTsKKyAgc3RyX2Z1bmMoImFiY2QiLCAiZWZnaCIsICJpamtsIiwgIm1ub3AiLCAicXJzdCIsICJ1dnd4IiwgInl6MTIiKTsKKyAgc3RyX2Z1bmMxKCJhYmNkIik7Cit9CisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY2FsbC1zdHJzLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY2FsbC1zdHJzLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGYzNThhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jYWxsLXN0cnMuZXhwCkBAIC0wLDAgKzEsMjQyIEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRWxlbmEgWmFubm9uaSAoZXphbm5vbmlAY3lnbnVzLmNvbSkKKworIyBUaGlzIHRlc3QgZGVhbHMgd2l0aCBjYWxsaW5nIGZ1bmN0aW9ucyB3aGljaCBoYXZlIHN0cmluZ3MgYXMgcGFyYW1ldGVycy4KKyMgaXQgcGxheXMgYXJvdW5kIHdpdGggY29uc3RhbnQgc3RyaW5ncy4KKyMgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGUgaXMgY2FsbC1zdHJzLmMKKyMKKworI2RlYnVnIHN0cmFyZworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgImNhbGwtc3RycyIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisKKworIyBUaGUgYTI5ayBjYW4ndCBjYWxsIGZ1bmN0aW9ucywgc28gZG9uJ3QgZXZlbiBib3RoZXIgd2l0aCB0aGlzIHRlc3QuCitpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYixjYW5ub3RfY2FsbF9mdW5jdGlvbnNdIHsKKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiIDI0MTYKKyAgICBmYWlsICJUaGlzIHRhcmdldCBjYW4gbm90IGNhbGwgZnVuY3Rpb25zIgorICAgIGNvbnRpbnVlCit9CisKKyMgU2V0IHRoZSBjdXJyZW50IGxhbmd1YWdlIHRvIEMuICBUaGlzIGNvdW50cyBhcyBhIHRlc3QuICBJZiBpdAorIyBmYWlscywgdGhlbiB3ZSBza2lwIHRoZSBvdGhlciB0ZXN0cy4KKworcHJvYyBzZXRfbGFuZ19jIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgc2VuZF9nZGIgInNldCBsYW5ndWFnZSBjXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9CisJdGltZW91dCB7IGZhaWwgInNldCBsYW5ndWFnZSBjICh0aW1lb3V0KSIgOyByZXR1cm4gMDsgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJzaG93IGxhbmd1YWdlXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiBzb3VyY2UgbGFuZ3VhZ2UgaXMgXCJjXCIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAic2V0IGxhbmd1YWdlIHRvIFwiY1wiIgorCSAgICByZXR1cm4gMQorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJzZXR0aW5nIGxhbmd1YWdlIHRvIFwiY1wiIgorCSAgICByZXR1cm4gMAorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAiY2FuJ3Qgc2hvdyBsYW5ndWFnZSAodGltZW91dCkiCisJICAgIHJldHVybiAwCisJfQorICAgIH0KK30KKworCisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CitzZW5kX2dkYiAic2V0IHByaW50IHNldmVuYml0LXN0cmluZ3NcbiIgOyBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKK3NlbmRfZ2RiICJzZXQgcHJpbnQgYWRkcmVzcyBvZmZcbiIgOyBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKK3NlbmRfZ2RiICJzZXQgd2lkdGggMFxuIiA7IGdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIgorCisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgcGVycm9yICJjb3VsZG4ndCBydW4gdG8gYnJlYWtwb2ludCIKKyAgICBjb250aW51ZQorfQorCisjc3RlcAorc2VuZF9nZGIgInN0ZXBcbiIKK2dkYl9leHBlY3QgeworICAgICAgICAtcmUgIi4qc3RyY3B5XFwoYnVmLCBcInRlc3Qgc3RyaW5nXCJcXCk7LiokZ2RiX3Byb21wdCAkIiB7cGFzcyAic3RlcCBhZnRlciBhc3NpZ25tZW50IHRvIHMifQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJzdGVwIGFmdGVyIGFzc2lnbm1lbnQgdG8gcyIgfQorICAgICAgICB0aW1lb3V0IHsgZmFpbCAic3RlcCBhZnRlciBhc3NpZ25tZW50IHRvIHMgKHRpbWVvdXQpIiB9CisgICAgfQorCisKKyNzdGVwCitzZW5kX2dkYiAic3RlcFxuIgorZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAiLipzdHJfZnVuY1xcKFwiYWJjZFwiLCBcImVmZ2hcIiwgXCJpamtsXCIsIFwibW5vcFwiLCBcInFyc3RcIiwgXCJ1dnd4XCIsIFwieXoxMlwiXFwpOy4qJGdkYl9wcm9tcHQgJCIge3Bhc3MgInN0ZXAgYWZ0ZXIgc3RyY3B5In0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic3RlcCBhZnRlciBzdHJjcHkiIH0KKyAgICAgICAgdGltZW91dCB7IGZhaWwgInN0ZXAgYWZ0ZXIgc3RyY3B5ICh0aW1lb3V0KSIgfQorICAgIH0KKworI3ByaW50IGJ1Zgorc2VuZF9nZGIgInByaW50IGJ1ZlxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKlwidGVzdCBzdHJpbmdcIiwuKnJlcGVhdHMgODggdGltZXMuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgYnVmIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGJ1ZiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGJ1ZiIgfQorICB9CisKKworI3ByaW50IHMKK3NlbmRfZ2RiICJwcmludCBzXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qPSBcInRlc3Qgc3RyaW5nXCIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgcyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBzIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgc3VtX2FycmF5X3ByaW50KDEwLCAqbGlzdDEsICpsaXN0MiwgKmxpc3QzLCAqbGlzdDQpIiB9CisgIH0KKworCisjcHJpbnQgc3RyX2Z1bmMxKHMpCitzZW5kX2dkYiAicHJpbnQgIHN0cl9mdW5jMShzKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJmaXJzdCBzdHJpbmcgYXJnIGlzOiB0ZXN0IHN0cmluZy4qXCJ0ZXN0IHN0cmluZ1wiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHN0cl9mdW5jMShzKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBzdHJfZnVuYzEocykiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBzdHJfZnVuYzEocykiIH0KKyAgfQorCisKKyNwcmludCBzdHJfZnVuYzEoInRlc3Qgc3RyaW5nIikKK3NlbmRfZ2RiICJwcmludCAgc3RyX2Z1bmMxKFwidGVzdCBzdHJpbmdcIilcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiZmlyc3Qgc3RyaW5nIGFyZyBpczogdGVzdCBzdHJpbmcuKlwidGVzdCBzdHJpbmdcIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBzdHJfZnVuYzEoXCJ0ZXN0IHN0cmluZ1wiKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBzdHJfZnVuYzEoXCJ0ZXN0IHN0cmluZ1wiKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHN0cl9mdW5jMShcInRlc3Qgc3RyaW5nXCIpIiB9CisgIH0KKworI2NhbGwgc3RyX2Z1bmMxKHMpCitzZW5kX2dkYiAiY2FsbCAgc3RyX2Z1bmMxKHMpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgImZpcnN0IHN0cmluZyBhcmcgaXM6IHRlc3Qgc3RyaW5nLipcInRlc3Qgc3RyaW5nXCIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAiY2FsbCBzdHJfZnVuYzEocykiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY2FsbCBzdHJfZnVuYzEocykiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBjYWxsIHN0cl9mdW5jMShzKSIgfQorICB9CisKKyNjYWxsIHN0cl9mdW5jMSgidGVzdCBzdHJpbmciKQorc2VuZF9nZGIgImNhbGwgIHN0cl9mdW5jMShcInRlc3Qgc3RyaW5nXCIpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgImZpcnN0IHN0cmluZyBhcmcgaXM6IHRlc3Qgc3RyaW5nLipcInRlc3Qgc3RyaW5nXCIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAiY2FsbCBzdHJfZnVuYzEoXCJ0ZXN0IHN0cmluZ1wiKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjYWxsIHN0cl9mdW5jMShcInRlc3Qgc3RyaW5nXCIpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY2FsbCBzdHJfZnVuYzEoXCJ0ZXN0IHN0cmluZ1wiKSIgfQorICB9CisKKyNwcmludCBzdHJfZnVuYzEoYnVmKQorc2VuZF9nZGIgInByaW50ICBzdHJfZnVuYzEoYnVmKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJmaXJzdCBzdHJpbmcgYXJnIGlzOiB0ZXN0IHN0cmluZy4qXCJ0ZXN0IHN0cmluZ1wiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHN0cl9mdW5jMShidWYpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHN0cl9mdW5jMShidWYpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgc3RyX2Z1bmMxKGJ1ZikiIH0KKyAgfQorCisjY2FsbCBzdHJfZnVuYzEoYnVmKQorc2VuZF9nZGIgImNhbGwgc3RyX2Z1bmMxKGJ1ZilcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiZmlyc3Qgc3RyaW5nIGFyZyBpczogdGVzdCBzdHJpbmcuKlwidGVzdCBzdHJpbmdcIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJjYWxsIHN0cl9mdW5jMShidWYpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNhbGwgc3RyX2Z1bmMxKGJ1ZikiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBjYWxsIHN0cl9mdW5jMShidWYpIiB9CisgIH0KKworI3ByaW50IHN0cl9mdW5jKCJhIiwiYiIsImMiLCJkIiwiZSIsImYiLCJnIikKK3NlbmRfZ2RiICJwcmludCAgc3RyX2Z1bmMoXCJhXCIsXCJiXCIsXCJjXCIsXCJkXCIsXCJlXCIsXCJmXCIsXCJnXCIpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgImZpcnN0IHN0cmluZyBhcmcgaXM6IGFcWyBcdFxyXG5cXStzZWNvbmQgc3RyaW5nIGFyZyBpczogYlxbIFx0XHJcblxdK3RoaXJkIHN0cmluZyBhcmcgaXM6IGNcWyBcdFxyXG5cXStmb3VydGggc3RyaW5nIGFyZyBpczogZFxbIFx0XHJcblxdK2ZpZnRoIHN0cmluZyBhcmcgaXM6IGVcWyBcdFxyXG5cXStzaXh0aCBzdHJpbmcgYXJnIGlzOiBmXFsgXHRcclxuXF0rc2V2ZW50aCBzdHJpbmcgYXJnIGlzOiBnXFsgXHRcclxuXF0rLio9IFwiYWJjZGVmZ1wiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHN0cl9mdW5jKFwiYVwiLFwiYlwiLFwiY1wiLFwiZFwiLFwiZVwiLFwiZlwiLFwiZ1wiKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBzdHJfZnVuYyhcImFcIixcImJcIixcImNcIixcImRcIixcImVcIixcImZcIixcImdcIikiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBzdHJfZnVuYyhcImFcIixcImJcIixcImNcIixcImRcIixcImVcIixcImZcIixcImdcIikiIH0KKyAgfQorCisjY2FsbCBzdHJfZnVuYygiYSIsImIiLCJjIiwiZCIsImUiLCJmIiwiZyIpCitzZW5kX2dkYiAiY2FsbCAgc3RyX2Z1bmMoXCJhXCIsXCJiXCIsXCJjXCIsXCJkXCIsXCJlXCIsXCJmXCIsXCJnXCIpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgImZpcnN0IHN0cmluZyBhcmcgaXM6IGFcWyBcdFxyXG5cXStzZWNvbmQgc3RyaW5nIGFyZyBpczogYlxbIFx0XHJcblxdK3RoaXJkIHN0cmluZyBhcmcgaXM6IGNcWyBcdFxyXG5cXStmb3VydGggc3RyaW5nIGFyZyBpczogZFxbIFx0XHJcblxdK2ZpZnRoIHN0cmluZyBhcmcgaXM6IGVcWyBcdFxyXG5cXStzaXh0aCBzdHJpbmcgYXJnIGlzOiBmXFsgXHRcclxuXF0rc2V2ZW50aCBzdHJpbmcgYXJnIGlzOiBnXFsgXHRcclxuXF0rLio9IFwiYWJjZGVmZ1wiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgImNhbGwgc3RyX2Z1bmMoXCJhXCIsXCJiXCIsXCJjXCIsXCJkXCIsXCJlXCIsXCJmXCIsXCJnXCIpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNhbGwgc3RyX2Z1bmMoXCJhXCIsXCJiXCIsXCJjXCIsXCJkXCIsXCJlXCIsXCJmXCIsXCJnXCIpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY2FsbCBzdHJfZnVuYyhcImFcIixcImJcIixcImNcIixcImRcIixcImVcIixcImZcIixcImdcIikiIH0KKyAgfQorCisjcHJpbnQgc3RyX2Z1bmMocyxzLHMscyxzLHMscyxzKQorc2VuZF9nZGIgInByaW50ICBzdHJfZnVuYyhzLHMscyxzLHMscyxzLHMpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgImZpcnN0IHN0cmluZyBhcmcgaXM6IHRlc3Qgc3RyaW5nXFsgXHRcclxuXF0rc2Vjb25kIHN0cmluZyBhcmcgaXM6IHRlc3Qgc3RyaW5nXFsgXHRcclxuXF0rdGhpcmQgc3RyaW5nIGFyZyBpczogdGVzdCBzdHJpbmdcWyBcdFxyXG5cXStmb3VydGggc3RyaW5nIGFyZyBpczogdGVzdCBzdHJpbmdcWyBcdFxyXG5cXStmaWZ0aCBzdHJpbmcgYXJnIGlzOiB0ZXN0IHN0cmluZ1xbIFx0XHJcblxdK3NpeHRoIHN0cmluZyBhcmcgaXM6IHRlc3Qgc3RyaW5nXFsgXHRcclxuXF0rc2V2ZW50aCBzdHJpbmcgYXJnIGlzOiB0ZXN0IHN0cmluZ1xbIFx0XHJcblxdKy4qXCJ0ZXN0IHN0cmluZ3Rlc3Qgc3RyaW5ndGVzdCBzdHJpbmd0ZXN0IHN0cmluZ3Rlc3Qgc3RyaW5ndGVzdCBzdHJpbmd0ZXN0IHN0cmluZ1wiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHN0cl9mdW5jKHMscyxzLHMscyxzLHMscykiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgc3RyX2Z1bmMocyxzLHMscyxzLHMscyxzKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHN0cl9mdW5jKHMscyxzLHMscyxzLHMscykiIH0KKyAgfQorCisjY2FsbCBzdHJfZnVuYyhzLHMscyxzLHMscyxzLHMpCitzZW5kX2dkYiAiY2FsbCAgc3RyX2Z1bmMocyxzLHMscyxzLHMscyxzKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJmaXJzdCBzdHJpbmcgYXJnIGlzOiB0ZXN0IHN0cmluZ1xbIFx0XHJcblxdK3NlY29uZCBzdHJpbmcgYXJnIGlzOiB0ZXN0IHN0cmluZ1xbIFx0XHJcblxdK3RoaXJkIHN0cmluZyBhcmcgaXM6IHRlc3Qgc3RyaW5nXFsgXHRcclxuXF0rZm91cnRoIHN0cmluZyBhcmcgaXM6IHRlc3Qgc3RyaW5nXFsgXHRcclxuXF0rZmlmdGggc3RyaW5nIGFyZyBpczogdGVzdCBzdHJpbmdcWyBcdFxyXG5cXStzaXh0aCBzdHJpbmcgYXJnIGlzOiB0ZXN0IHN0cmluZ1xbIFx0XHJcblxdK3NldmVudGggc3RyaW5nIGFyZyBpczogdGVzdCBzdHJpbmdcWyBcdFxyXG5cXSsuKlwidGVzdCBzdHJpbmd0ZXN0IHN0cmluZ3Rlc3Qgc3RyaW5ndGVzdCBzdHJpbmd0ZXN0IHN0cmluZ3Rlc3Qgc3RyaW5ndGVzdCBzdHJpbmdcIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJjYWxsIHN0cl9mdW5jKHMscyxzLHMscyxzLHMscykiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY2FsbCBzdHJfZnVuYyhzLHMscyxzLHMscyxzLHMpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY2FsbCBzdHJfZnVuYyhzLHMscyxzLHMscyxzLHMpIiB9CisgIH0KKworZ2RiX2V4aXQKK3JldHVybiAwCit+CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NhbGxmdW5jcy5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jYWxsZnVuY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmI5YmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jYWxsZnVuY3MuYwpAQCAtMCwwICsxLDI4MCBAQAorLyogU3VwcG9ydCBwcm9ncmFtIGZvciB0ZXN0aW5nIGdkYidzIGFiaWxpdHkgdG8gY2FsbCBmdW5jdGlvbnMKKyAgIGluIHRoZSBpbmZlcmlvciwgcGFzcyBhcHByb3ByaWF0ZSBhcmd1bWVudHMgdG8gdGhvc2UgZnVuY3Rpb25zLAorICAgYW5kIGdldCB0aGUgcmV0dXJuZWQgcmVzdWx0LiAqLworCisjaWZkZWYgTk9fUFJPVE9UWVBFUworI2RlZmluZSBQQVJBTVMocGFyYW1saXN0KSAoKQorI2Vsc2UKKyNkZWZpbmUgUEFSQU1TKHBhcmFtbGlzdCkgcGFyYW1saXN0CisjZW5kaWYKKworY2hhciBjaGFyX3ZhbDEgPSAnYSc7CitjaGFyIGNoYXJfdmFsMiA9ICdiJzsKKworc2hvcnQgc2hvcnRfdmFsMSA9IDEwOworc2hvcnQgc2hvcnRfdmFsMiA9IC0yMzsKKworaW50IGludF92YWwxID0gODc7CitpbnQgaW50X3ZhbDIgPSAtMjY7CisKK2xvbmcgbG9uZ192YWwxID0gNzg5OworbG9uZyBsb25nX3ZhbDIgPSAtMzIxOworCitmbG9hdCBmbG9hdF92YWwxID0gMy4xNDE1OTsKK2Zsb2F0IGZsb2F0X3ZhbDIgPSAtMi4zNzY1OworCitkb3VibGUgZG91YmxlX3ZhbDEgPSA0NS42NTQ7Citkb3VibGUgZG91YmxlX3ZhbDIgPSAtNjcuNjY7CisKKyNkZWZpbmUgREVMVEEgKDAuMDAxKQorCitjaGFyICpzdHJpbmdfdmFsMSA9ICJzdHJpbmcgMSI7CitjaGFyICpzdHJpbmdfdmFsMiA9ICJzdHJpbmcgMiI7CisKK2NoYXIgY2hhcl9hcnJheV92YWwxW10gPSAiY2FycmF5IDEiOworY2hhciBjaGFyX2FycmF5X3ZhbDJbXSA9ICJjYXJyYXkgMiI7CisKK3N0cnVjdCBzdHJ1Y3QxIHsKKyAgY2hhciBjOworICBzaG9ydCBzOworICBpbnQgaTsKKyAgbG9uZyBsOworICBmbG9hdCBmOworICBkb3VibGUgZDsKKyAgY2hhciBhWzRdOworfSBzdHJ1Y3RfdmFsMSA9IHsgJ3gnLCA4NywgNzYsIDUxLCAyLjEyMzQsIDkuODc2LCAiZm9vIiB9OworCisvKiBTb21lIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBwYXNzZWQgYXMgYXJndW1lbnRzIHRvIG90aGVyIHRlc3QKKyAgIGZ1bmN0aW9ucywgb3IgY2FsbGVkIGRpcmVjdGx5LiAqLworCitpbnQgYWRkIChhLCBiKQoraW50IGEsIGI7Cit7CisgIHJldHVybiAoYSArIGIpOworfQorCitpbnQgZG91YmxlaXQgKGEpCitpbnQgYTsKK3sKKyAgcmV0dXJuIChhICsgYSk7Cit9CisKK2ludCAoKmZ1bmNfdmFsMSkgUEFSQU1TKChpbnQsaW50KSkgPSBhZGQ7CitpbnQgKCpmdW5jX3ZhbDIpIFBBUkFNUygoaW50KSkgPSBkb3VibGVpdDsKKworLyogQW4gZW51bWVyYXRpb24gYW5kIGZ1bmN0aW9ucyB0aGF0IHRlc3QgZm9yIHNwZWNpZmljIHZhbHVlcy4gKi8KKworZW51bSBlbnVtdHlwZSB7IGVudW12YWwxLCBlbnVtdmFsMiwgZW51bXZhbDMgfTsKK2VudW0gZW51bXR5cGUgZW51bV92YWwxID0gZW51bXZhbDE7CitlbnVtIGVudW10eXBlIGVudW1fdmFsMiA9IGVudW12YWwyOworZW51bSBlbnVtdHlwZSBlbnVtX3ZhbDMgPSBlbnVtdmFsMzsKKworaW50IHRfZW51bV92YWx1ZTEgKGVudW1fYXJnKQorZW51bSBlbnVtdHlwZSBlbnVtX2FyZzsKK3sKKyAgcmV0dXJuIChlbnVtX2FyZyA9PSBlbnVtX3ZhbDEpOworfQorCitpbnQgdF9lbnVtX3ZhbHVlMiAoZW51bV9hcmcpCitlbnVtIGVudW10eXBlIGVudW1fYXJnOworeworICByZXR1cm4gKGVudW1fYXJnID09IGVudW1fdmFsMik7Cit9CisKK2ludCB0X2VudW1fdmFsdWUzIChlbnVtX2FyZykKK2VudW0gZW51bXR5cGUgZW51bV9hcmc7Cit7CisgIHJldHVybiAoZW51bV9hcmcgPT0gZW51bV92YWwzKTsKK30KKworLyogQSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgdmVjdG9yIG9mIGludGVnZXJzIChhbG9uZyB3aXRoIGFuIGV4cGxpY2l0CisgICBjb3VudCkgYW5kIHJldHVybnMgdGhlaXIgc3VtLiAqLworCitpbnQgc3VtX2FyZ3MgKGFyZ2MsIGFyZ3YpCitpbnQgYXJnYzsKK2ludCBhcmd2W107Cit7CisgIGludCBzdW12YWwgPSAwOworICBpbnQgaWR4OworCisgIGZvciAoaWR4ID0gMDsgaWR4IDwgYXJnYzsgaWR4KyspCisgICAgeworICAgICAgc3VtdmFsICs9IGFyZ3ZbaWR4XTsKKyAgICB9CisgIHJldHVybiAoc3VtdmFsKTsKK30KKworLyogVGVzdCB0aGF0IHdlIGNhbiBjYWxsIGZ1bmN0aW9ucyB0aGF0IHRha2Ugc3RydWN0cyBhbmQgcmV0dXJuCisgICBtZW1iZXJzIGZyb20gdGhhdCBzdHJ1Y3QgKi8KKworY2hhciAgIHRfc3RydWN0c19jICh0c3RydWN0KSBzdHJ1Y3Qgc3RydWN0MSB0c3RydWN0OyB7IHJldHVybiAodHN0cnVjdC5jKTsgfQorc2hvcnQgIHRfc3RydWN0c19zICh0c3RydWN0KSBzdHJ1Y3Qgc3RydWN0MSB0c3RydWN0OyB7IHJldHVybiAodHN0cnVjdC5zKTsgfQoraW50ICAgIHRfc3RydWN0c19pICh0c3RydWN0KSBzdHJ1Y3Qgc3RydWN0MSB0c3RydWN0OyB7IHJldHVybiAodHN0cnVjdC5pKTsgfQorbG9uZyAgIHRfc3RydWN0c19sICh0c3RydWN0KSBzdHJ1Y3Qgc3RydWN0MSB0c3RydWN0OyB7IHJldHVybiAodHN0cnVjdC5sKTsgfQorZmxvYXQgIHRfc3RydWN0c19mICh0c3RydWN0KSBzdHJ1Y3Qgc3RydWN0MSB0c3RydWN0OyB7IHJldHVybiAodHN0cnVjdC5mKTsgfQorZG91YmxlIHRfc3RydWN0c19kICh0c3RydWN0KSBzdHJ1Y3Qgc3RydWN0MSB0c3RydWN0OyB7IHJldHVybiAodHN0cnVjdC5kKTsgfQorY2hhciAgKnRfc3RydWN0c19hICh0c3RydWN0KSBzdHJ1Y3Qgc3RydWN0MSB0c3RydWN0OyB7IHJldHVybiAodHN0cnVjdC5hKTsgfQorCisvKiBUZXN0IHRoYXQgY2FsbGluZyBmdW5jdGlvbnMgd29ya3MgaWYgdGhlcmUgYXJlIGEgbG90IG9mIGFyZ3VtZW50cy4gICovCitpbnQKK3N1bTEwIChpMCwgaTEsIGkyLCBpMywgaTQsIGk1LCBpNiwgaTcsIGk4LCBpOSkKKyAgICAgaW50IGkwLCBpMSwgaTIsIGkzLCBpNCwgaTUsIGk2LCBpNywgaTgsIGk5OworeworICByZXR1cm4gaTAgKyBpMSArIGkyICsgaTMgKyBpNCArIGk1ICsgaTYgKyBpNyArIGk4ICsgaTk7Cit9CisKKy8qIFRlc3QgdGhhdCBhcmdzIGFyZSBwYXNzZWQgaW4gdGhlIHJpZ2h0IG9yZGVyLiAqLworaW50CitjbXAxMCAoaTAsIGkxLCBpMiwgaTMsIGk0LCBpNSwgaTYsIGk3LCBpOCwgaTkpCisgIGludCBpMCwgaTEsIGkyLCBpMywgaTQsIGk1LCBpNiwgaTcsIGk4LCBpOTsKK3sKKyAgcmV0dXJuCisgICAgKGkwID09IDApICYmIChpMSA9PSAxKSAmJiAoaTIgPT0gMikgJiYgKGkzID09IDMpICYmIChpNCA9PSA0KSAmJgorICAgIChpNSA9PSA1KSAmJiAoaTYgPT0gNikgJiYgKGk3ID09IDcpICYmIChpOCA9PSA4KSAmJiAoaTkgPT0gOSk7Cit9CisKKworLyogR290dGEgaGF2ZSBhIG1haW4gdG8gYmUgYWJsZSB0byBnZW5lcmF0ZSBhIGxpbmtlZCwgcnVubmFibGUKKyAgIGV4ZWN1dGFibGUsIGFuZCBhbHNvIHByb3ZpZGUgYSB1c2VmdWwgcGxhY2UgdG8gc2V0IGEgYnJlYWtwb2ludC4gKi8KK2V4dGVybiB2b2lkICogbWFsbG9jKCkgOworaW50IG1haW4gKCkKK3sKKyNpZmRlZiB1c2VzdHVicworICBzZXRfZGVidWdfdHJhcHMoKTsKKyAgYnJlYWtwb2ludCgpOworI2VuZGlmCisgIG1hbGxvYygxKTsKKyAgdF9zdHJ1Y3RzX2Moc3RydWN0X3ZhbDEpOworICByZXR1cm4gMCA7Cit9CisKKy8qIEZ1bmN0aW9ucyB0aGF0IGV4cGVjdCBzcGVjaWZpYyB2YWx1ZXMgdG8gYmUgcGFzc2VkIGFuZCByZXR1cm4gCisgICBlaXRoZXIgMCBvciAxLCBkZXBlbmRpbmcgdXBvbiB3aGV0aGVyIHRoZSB2YWx1ZXMgd2VyZQorICAgcGFzc2VkIGluY29ycmVjdGx5IG9yIGNvcnJlY3RseSwgcmVzcGVjdGl2ZWx5LiAqLworCitpbnQgdF9jaGFyX3ZhbHVlcyAoY2hhcl9hcmcxLCBjaGFyX2FyZzIpCitjaGFyIGNoYXJfYXJnMSwgY2hhcl9hcmcyOworeworICByZXR1cm4gKChjaGFyX2FyZzEgPT0gY2hhcl92YWwxKSAmJiAoY2hhcl9hcmcyID09IGNoYXJfdmFsMikpOworfQorCitpbnQKKyNpZmRlZiBOT19QUk9UT1RZUEVTCit0X3NtYWxsX3ZhbHVlcyAoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCwgYXJnOSwgYXJnMTApCisgICAgIGNoYXIgYXJnMTsKKyAgICAgc2hvcnQgYXJnMjsKKyAgICAgaW50IGFyZzM7CisgICAgIGNoYXIgYXJnNDsKKyAgICAgc2hvcnQgYXJnNTsKKyAgICAgY2hhciBhcmc2OworICAgICBzaG9ydCBhcmc3OworICAgICBpbnQgYXJnODsKKyAgICAgc2hvcnQgYXJnOTsKKyAgICAgc2hvcnQgYXJnMTA7CisjZWxzZQordF9zbWFsbF92YWx1ZXMgKGNoYXIgYXJnMSwgc2hvcnQgYXJnMiwgaW50IGFyZzMsIGNoYXIgYXJnNCwgc2hvcnQgYXJnNSwKKwkJY2hhciBhcmc2LCBzaG9ydCBhcmc3LCBpbnQgYXJnOCwgc2hvcnQgYXJnOSwgc2hvcnQgYXJnMTApCisjZW5kaWYKK3sKKyAgcmV0dXJuIGFyZzEgKyBhcmcyICsgYXJnMyArIGFyZzQgKyBhcmc1ICsgYXJnNiArIGFyZzcgKyBhcmc4ICsgYXJnOSArIGFyZzEwOworfQorCitpbnQgdF9zaG9ydF92YWx1ZXMgKHNob3J0X2FyZzEsIHNob3J0X2FyZzIpCitzaG9ydCBzaG9ydF9hcmcxLCBzaG9ydF9hcmcyOworeworICByZXR1cm4gKChzaG9ydF9hcmcxID09IHNob3J0X3ZhbDEpICYmIChzaG9ydF9hcmcyID09IHNob3J0X3ZhbDIpKTsKK30KKworaW50IHRfaW50X3ZhbHVlcyAoaW50X2FyZzEsIGludF9hcmcyKQoraW50IGludF9hcmcxLCBpbnRfYXJnMjsKK3sKKyAgcmV0dXJuICgoaW50X2FyZzEgPT0gaW50X3ZhbDEpICYmIChpbnRfYXJnMiA9PSBpbnRfdmFsMikpOworfQorCitpbnQgdF9sb25nX3ZhbHVlcyAobG9uZ19hcmcxLCBsb25nX2FyZzIpCitsb25nIGxvbmdfYXJnMSwgbG9uZ19hcmcyOworeworICByZXR1cm4gKChsb25nX2FyZzEgPT0gbG9uZ192YWwxKSAmJiAobG9uZ19hcmcyID09IGxvbmdfdmFsMikpOworfQorCitpbnQgdF9mbG9hdF92YWx1ZXMgKGZsb2F0X2FyZzEsIGZsb2F0X2FyZzIpCitmbG9hdCBmbG9hdF9hcmcxLCBmbG9hdF9hcmcyOworeworICByZXR1cm4gKChmbG9hdF9hcmcxIC0gZmxvYXRfdmFsMSkgPCBERUxUQQorCSAgJiYgKGZsb2F0X2FyZzEgLSBmbG9hdF92YWwxKSA+IC1ERUxUQQorCSAgJiYgKGZsb2F0X2FyZzIgLSBmbG9hdF92YWwyKSA8IERFTFRBCisJICAmJiAoZmxvYXRfYXJnMiAtIGZsb2F0X3ZhbDIpID4gLURFTFRBKTsKK30KKworaW50CisjaWZkZWYgTk9fUFJPVE9UWVBFUworLyogSW4gdGhpcyBjYXNlIHdlIGFyZSBqdXN0IGR1cGxpY2F0aW5nIHRfZmxvYXRfdmFsdWVzLCBidXQgdGhhdCBpcyB0aGUKKyAgIGVhc2llc3Qgd2F5IHRvIGRlYWwgd2l0aCBlaXRoZXIgQU5TSSBvciBub24tQU5TSS4gICovCit0X2Zsb2F0X3ZhbHVlczIgKGZsb2F0X2FyZzEsIGZsb2F0X2FyZzIpCisgICAgIGZsb2F0IGZsb2F0X2FyZzEsIGZsb2F0X2FyZzI7CisjZWxzZQordF9mbG9hdF92YWx1ZXMyIChmbG9hdCBmbG9hdF9hcmcxLCBmbG9hdCBmbG9hdF9hcmcyKQorI2VuZGlmCit7CisgIHJldHVybiAoKGZsb2F0X2FyZzEgLSBmbG9hdF92YWwxKSA8IERFTFRBCisJICAmJiAoZmxvYXRfYXJnMSAtIGZsb2F0X3ZhbDEpID4gLURFTFRBCisJICAmJiAoZmxvYXRfYXJnMiAtIGZsb2F0X3ZhbDIpIDwgREVMVEEKKwkgICYmIChmbG9hdF9hcmcyIC0gZmxvYXRfdmFsMikgPiAtREVMVEEpOworfQorCitpbnQgdF9kb3VibGVfdmFsdWVzIChkb3VibGVfYXJnMSwgZG91YmxlX2FyZzIpCitkb3VibGUgZG91YmxlX2FyZzEsIGRvdWJsZV9hcmcyOworeworICByZXR1cm4gKChkb3VibGVfYXJnMSAtIGRvdWJsZV92YWwxKSA8IERFTFRBCisJICAmJiAoZG91YmxlX2FyZzEgLSBkb3VibGVfdmFsMSkgPiAtREVMVEEKKwkgICYmIChkb3VibGVfYXJnMiAtIGRvdWJsZV92YWwyKSA8IERFTFRBCisJICAmJiAoZG91YmxlX2FyZzIgLSBkb3VibGVfdmFsMikgPiAtREVMVEEpOworfQorCitpbnQgdF9zdHJpbmdfdmFsdWVzIChzdHJpbmdfYXJnMSwgc3RyaW5nX2FyZzIpCitjaGFyICpzdHJpbmdfYXJnMSwgKnN0cmluZ19hcmcyOworeworICByZXR1cm4gKCFzdHJjbXAgKHN0cmluZ19hcmcxLCBzdHJpbmdfdmFsMSkgJiYKKwkgICFzdHJjbXAgKHN0cmluZ19hcmcyLCBzdHJpbmdfdmFsMikpOworfQorCitpbnQgdF9jaGFyX2FycmF5X3ZhbHVlcyAoY2hhcl9hcnJheV9hcmcxLCBjaGFyX2FycmF5X2FyZzIpCitjaGFyIGNoYXJfYXJyYXlfYXJnMVtdLCBjaGFyX2FycmF5X2FyZzJbXTsKK3sKKyAgcmV0dXJuICghc3RyY21wIChjaGFyX2FycmF5X2FyZzEsIGNoYXJfYXJyYXlfdmFsMSkgJiYKKwkgICFzdHJjbXAgKGNoYXJfYXJyYXlfYXJnMiwgY2hhcl9hcnJheV92YWwyKSk7Cit9CisKKworLyogVGhpcyB1c2VkIHRvIHNpbXBseSBjb21wYXJlIHRoZSBmdW5jdGlvbiBwb2ludGVyIGFyZ3VtZW50cyB3aXRoCisgICBrbm93biB2YWx1ZXMgZm9yIGZ1bmNfdmFsMSBhbmQgZnVuY192YWwyLiAgRG9pbmcgc28gaXMgdmFsaWQgQU5TSQorICAgY29kZSwgYnV0IG9uIHNvbWUgbWFjaGluZXMgKFJTNjAwMCwgSFBQQSwgb3RoZXJzPykgaXQgbWF5IGZhaWwgd2hlbgorICAgY2FsbGVkIGRpcmVjdGx5IGJ5IEdEQi4KKworICAgSW4gYSBudXRzaGVsbCwgaXQncyBub3QgcG9zc2libGUgZm9yIEdEQiB0byBkZXRlcm1pbmUgd2hlbiB0aGUgYWRkcmVzcworICAgb2YgYSBmdW5jdGlvbiBvciB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24ncyBzdHViL3RyYW1wb2xpbmUgc2hvdWxkCisgICBiZSBwYXNzZWQuCisKKyAgIFNvLCB0byBhdm9pZCBHREIgbG9zc2FnZSBpbiB0aGUgY29tbW9uIGNhc2UsIHdlIHBlcmZvcm0gY2FsbHMgdGhyb3VnaCB0aGUKKyAgIHZhcmlvdXMgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIGNvbXBhcmUgdGhlIHJldHVybiB2YWx1ZXMuICBGb3IgdGhlIEhQUEEKKyAgIGF0IGxlYXN0LCB0aGlzIGFsbG93cyB0aGUgY29tbW9uIGNhc2UgdG8gd29yay4KKworICAgSWYgb25lIHdhbnRzIHRvIHRyeSBzb21ldGhpbmcgbW9yZSBjb21wbGljYXRlZCwgcGFzcyB0aGUgYWRkcmVzcyBvZgorICAgYSBmdW5jdGlvbiBhY2NlcHRpbmcgYSAiZG91YmxlIiBhcyBvbmUgb2YgaXRzIGZpcnN0IDQgYXJndW1lbnRzLiAgQ2FsbAorICAgdGhhdCBmdW5jdGlvbiBpbmRpcmVjdGx5IHRocm91Z2ggdGhlIGZ1bmN0aW9uIHBvaW50ZXIuICBUaGlzIHdvdWxkIGZhaWwKKyAgIG9uIHRoZSBIUFBBLiAgKi8KKworaW50IHRfZnVuY192YWx1ZXMgKGZ1bmNfYXJnMSwgZnVuY19hcmcyKQoraW50ICgqZnVuY19hcmcxKSBQQVJBTVMgKChpbnQsIGludCkpOworaW50ICgqZnVuY19hcmcyKSBQQVJBTVMgKChpbnQpKTsKK3sKKyAgcmV0dXJuICgoKmZ1bmNfYXJnMSkgKDUsNSkgID09ICgqZnVuY192YWwxKSAoNSw1KQorICAgICAgICAgICYmICgqZnVuY19hcmcyKSAoNikgPT0gKCpmdW5jX3ZhbDIpICg2KSk7Cit9CisKK2ludCB0X2NhbGxfYWRkIChmdW5jX2FyZzEsIGEsIGIpCitpbnQgKCpmdW5jX2FyZzEpIFBBUkFNUyAoKGludCwgaW50KSk7CitpbnQgYSwgYjsKK3sKKyAgcmV0dXJuICgoKmZ1bmNfYXJnMSkoYSwgYikpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jYWxsZnVuY3MuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jYWxsZnVuY3MuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YjVjOTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NhbGxmdW5jcy5leHAKQEAgLTAsMCArMSwyNjkgQEAKKyMgQ29weXJpZ2h0IChDKSA5MiwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAoZm5mQGN5Z251cy5jb20pCisjIGFuZCBtb2RpZmllZCBieSBCb2IgTWFuc29uLiAobWFuc29uQGN5Z251cy5jb20pCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJjYWxsZnVuY3MiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK3NldCBwcm90b3R5cGVzIDEKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICBzZXQgcHJvdG90eXBlcyAwOworICAgICMgYnVpbHQgdGhlIHNlY29uZCB0ZXN0IGNhc2Ugc2luY2Ugd2UgY2FuJ3QgdXNlIHByb3RvdHlwZXMKKyAgICB3YXJuaW5nICJQcm90b3R5cGVzIG5vdCBzdXBwb3J0ZWQsIHJlYnVpbGRpbmcgd2l0aCAtRE5PX1BST1RPVFlQRVMiCisgICAgaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1ZyBhZGRpdGlvbmFsX2ZsYWdzPS1ETk9fUFJPVE9UWVBFU31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKKyAgICB9Cit9CisKKyMgQ3JlYXRlIGFuZCBzb3VyY2UgdGhlIGZpbGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIKKyMgdXNlZCB0byBjb21waWxlIHRoZSB0ZXN0IGNhc2UuCisKK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9XSB7CisgICAgcmV0dXJuIC0xOworfQorCisjIFRoZSBhMjlrIGNhbid0IGNhbGwgZnVuY3Rpb25zLCBzbyBkb24ndCBldmVuIGJvdGhlciB3aXRoIHRoaXMgdGVzdC4KK2lmIFt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiLGNhbm5vdF9jYWxsX2Z1bmN0aW9uc10geworICAgIHNldHVwX3hmYWlsICIqLSotKiIgMjQxNgorICAgIGZhaWwgIlRoaXMgdGFyZ2V0IGNhbiBub3QgY2FsbCBmdW5jdGlvbnMiCisgICAgY29udGludWUKK30KKworIyBTZXQgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgdG8gQy4gIFRoaXMgY291bnRzIGFzIGEgdGVzdC4gIElmIGl0CisjIGZhaWxzLCB0aGVuIHdlIHNraXAgdGhlIG90aGVyIHRlc3RzLgorCitwcm9jIHNldF9sYW5nX2Mge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBzZW5kX2dkYiAic2V0IGxhbmd1YWdlIGNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIge30KKwl0aW1lb3V0IHsgZmFpbCAic2V0IGxhbmd1YWdlIGMgKHRpbWVvdXQpIiA7IHJldHVybiAwOyB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInNob3cgbGFuZ3VhZ2VcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qIHNvdXJjZSBsYW5ndWFnZSBpcyBcImNcIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJzZXQgbGFuZ3VhZ2UgdG8gXCJjXCIiCisJICAgIHJldHVybiAxCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInNldHRpbmcgbGFuZ3VhZ2UgdG8gXCJjXCIiCisJICAgIHJldHVybiAwCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJjYW4ndCBzaG93IGxhbmd1YWdlICh0aW1lb3V0KSIKKwkgICAgcmV0dXJuIDAKKwl9CisgICAgfQorfQorCisjIEZJWE1FOiAgQmVmb3JlIGNhbGxpbmcgdGhpcyBwcm9jLCB3ZSBzaG91bGQgcHJvYmFibHkgdmVyaWZ5IHRoYXQKKyMgd2UgY2FuIGNhbGwgaW5mZXJpb3IgZnVuY3Rpb25zIGFuZCBnZXQgYSB2YWxpZCBpbnRlZ3JhbCB2YWx1ZQorIyByZXR1cm5lZC4KKyMgTm90ZSB0aGF0IGl0IGlzIE9LIHRvIGNoZWNrIGZvciAwIG9yIDEgYXMgdGhlIHJldHVybmVkIHZhbHVlcywgYmVjYXVzZSBDCisjIHNwZWNpZmllcyB0aGF0IHRoZSBudW1lcmljIHZhbHVlIG9mIGEgcmVsYXRpb25hbCBvciBsb2dpY2FsIGV4cHJlc3Npb24KKyMgKGNvbXB1dGVkIGluIHRoZSBpbmZlcmlvcikgaXMgMSBmb3IgdHJ1ZSBhbmQgMCBmb3IgZmFsc2UuCisKK3Byb2MgZG9fZnVuY3Rpb25fY2FsbHMge30geworICAgIGdsb2JhbCBwcm90b3R5cGVzCisgICAgZ2xvYmFsIGdjY19jb21waWxlZAorICAgICMgV2UgbmVlZCB0byB1cCB0aGlzIGJlY2F1c2UgdGhpcyBjYW4gYmUgcmVhbGx5IHNsb3cgb24gc29tZSBib2FyZHMuCisgICAgc2V0IHRpbWVvdXQgNjA7CisKKyAgICBnZGJfdGVzdCAicCB0X2NoYXJfdmFsdWVzKDAsMCkiICIgPSAwIgorICAgIGdkYl90ZXN0ICJwIHRfY2hhcl92YWx1ZXMoJ2EnLCdiJykiICIgPSAxIgorICAgIGdkYl90ZXN0ICJwIHRfY2hhcl92YWx1ZXMoY2hhcl92YWwxLGNoYXJfdmFsMikiICIgPSAxIgorICAgIGdkYl90ZXN0ICJwIHRfY2hhcl92YWx1ZXMoJ2EnLGNoYXJfdmFsMikiICIgPSAxIgorICAgIGdkYl90ZXN0ICJwIHRfY2hhcl92YWx1ZXMoY2hhcl92YWwxLCdiJykiICIgPSAxIgorCisgICAgZ2RiX3Rlc3QgInAgdF9zaG9ydF92YWx1ZXMoMCwwKSIgIiA9IDAiCisgICAgZ2RiX3Rlc3QgInAgdF9zaG9ydF92YWx1ZXMoMTAsLTIzKSIgIiA9IDEiCisgICAgZ2RiX3Rlc3QgInAgdF9zaG9ydF92YWx1ZXMoc2hvcnRfdmFsMSxzaG9ydF92YWwyKSIgIiA9IDEiCisgICAgZ2RiX3Rlc3QgInAgdF9zaG9ydF92YWx1ZXMoMTAsc2hvcnRfdmFsMikiICIgPSAxIgorICAgIGdkYl90ZXN0ICJwIHRfc2hvcnRfdmFsdWVzKHNob3J0X3ZhbDEsLTIzKSIgIiA9IDEiCisKKyAgICBnZGJfdGVzdCAicCB0X2ludF92YWx1ZXMoMCwwKSIgIiA9IDAiCisgICAgZ2RiX3Rlc3QgInAgdF9pbnRfdmFsdWVzKDg3LC0yNikiICIgPSAxIgorICAgIGdkYl90ZXN0ICJwIHRfaW50X3ZhbHVlcyhpbnRfdmFsMSxpbnRfdmFsMikiICIgPSAxIgorICAgIGdkYl90ZXN0ICJwIHRfaW50X3ZhbHVlcyg4NyxpbnRfdmFsMikiICIgPSAxIgorICAgIGdkYl90ZXN0ICJwIHRfaW50X3ZhbHVlcyhpbnRfdmFsMSwtMjYpIiAiID0gMSIKKworICAgIGdkYl90ZXN0ICJwIHRfbG9uZ192YWx1ZXMoMCwwKSIgIiA9IDAiCisgICAgZ2RiX3Rlc3QgInAgdF9sb25nX3ZhbHVlcyg3ODksLTMyMSkiICIgPSAxIgorICAgIGdkYl90ZXN0ICJwIHRfbG9uZ192YWx1ZXMobG9uZ192YWwxLGxvbmdfdmFsMikiICIgPSAxIgorICAgIGdkYl90ZXN0ICJwIHRfbG9uZ192YWx1ZXMoNzg5LGxvbmdfdmFsMikiICIgPSAxIgorICAgIGdkYl90ZXN0ICJwIHRfbG9uZ192YWx1ZXMobG9uZ192YWwxLC0zMjEpIiAiID0gMSIKKworICAgIGlmICFbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYixza2lwX2Zsb2F0X3Rlc3RzXSB7CisJZ2RiX3Rlc3QgInAgdF9mbG9hdF92YWx1ZXMoMC4wLDAuMCkiICIgPSAwIgorCisJIyBUaGVzZSBuZXh0IGZvdXIgdGVzdHMgZmFpbCBvbiB0aGUgbW4xMDMwMC4KKwkjIFRoZSBmaXJzdCB2YWx1ZSBpcyBwYXNzZWQgaW4gcmVncywgdGhlIG90aGVyIGluIG1lbW9yeS4KKwkjIEdjYyBlbWl0cyBkaWZmZXJlbnQgc3RhYnMgZm9yIHRoZSB0d28gcGFyYW1ldGVyczsgdGhlIGZpcnN0IGlzCisJIyBjbGFpbWVkIHRvIGJlIGEgZmxvYXQsIHRoZSBzZWNvbmQgYSBkb3VibGUuCisJIyBkYnhvdXQuYyBpbiBnY2MgY2xhaW1zIHRoaXMgaXMgdGhlIGRlc2lyZWQgYmVoYXZpb3IuCisJc2V0dXBfeGZhaWwgIm1uMTAzMDAtKi0qIgorCWdkYl90ZXN0ICJwIHRfZmxvYXRfdmFsdWVzKDMuMTQxNTksLTIuMzc2NSkiICIgPSAxIgorCXNldHVwX3hmYWlsICJtbjEwMzAwLSotKiIKKwlnZGJfdGVzdCAicCB0X2Zsb2F0X3ZhbHVlcyhmbG9hdF92YWwxLGZsb2F0X3ZhbDIpIiAiID0gMSIKKwlzZXR1cF94ZmFpbCAibW4xMDMwMC0qLSoiCisJZ2RiX3Rlc3QgInAgdF9mbG9hdF92YWx1ZXMoMy4xNDE1OSxmbG9hdF92YWwyKSIgIiA9IDEiCisJc2V0dXBfeGZhaWwgIm1uMTAzMDAtKi0qIgorCWdkYl90ZXN0ICJwIHRfZmxvYXRfdmFsdWVzKGZsb2F0X3ZhbDEsLTIuMzc2NSkiICIgPSAxIgorCisJIyBUZXN0IHBhc3Npbmcgb2YgYXJndW1lbnRzIHdoaWNoIG1pZ2h0IG5vdCBiZSB3aWRlbmVkLgorCWdkYl90ZXN0ICJwIHRfZmxvYXRfdmFsdWVzMigwLjAsMC4wKSIgIiA9IDAiCisKKwkjIEFsdGhvdWdoIFBSIDUzMTggbWVudGlvbnMgU3VuT1Mgc3BlY2lmaWNhbGx5LCB0aGlzIHNlZW1zCisJIyB0byBiZSBhIGdlbmVyaWMgcHJvYmxlbSBvbiBxdWl0ZSBhIGZldyBwbGF0Zm9ybXMuCisJaWYgJHByb3RvdHlwZXMgdGhlbiB7CisJICAgIHNldHVwX3hmYWlsICJocHBhKi0qLSoiICJzcGFyYy0qLSoiICJtaXBzKi0qLSoiIDUzMTgKKwkgICAgaWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsKKwkJc2V0dXBfeGZhaWwgImFscGhhLWRlYy1vc2YyKiIgImkqODYtKi1zeXN2NCoiIDUzMTgKKwkgICAgfQorCX0KKwlnZGJfdGVzdCAicCB0X2Zsb2F0X3ZhbHVlczIoMy4xNDE1OSxmbG9hdF92YWwyKSIgIiA9IDEiCisJZ2RiX3Rlc3QgInAgdF9zbWFsbF92YWx1ZXMoMSwyLDMsNCw1LDYsNyw4LDksMTApIiAiID0gNTUiCisKKwlnZGJfdGVzdCAicCB0X2RvdWJsZV92YWx1ZXMoMC4wLDAuMCkiICIgPSAwIgorCWdkYl90ZXN0ICJwIHRfZG91YmxlX3ZhbHVlcyg0NS42NTQsLTY3LjY2KSIgIiA9IDEiCisJZ2RiX3Rlc3QgInAgdF9kb3VibGVfdmFsdWVzKGRvdWJsZV92YWwxLGRvdWJsZV92YWwyKSIgIiA9IDEiCisJZ2RiX3Rlc3QgInAgdF9kb3VibGVfdmFsdWVzKDQ1LjY1NCxkb3VibGVfdmFsMikiICIgPSAxIgorCWdkYl90ZXN0ICJwIHRfZG91YmxlX3ZhbHVlcyhkb3VibGVfdmFsMSwtNjcuNjYpIiAiID0gMSIKKyAgICB9CisKKyAgICBnZGJfdGVzdCAicCB0X3N0cmluZ192YWx1ZXMoc3RyaW5nX3ZhbDIsc3RyaW5nX3ZhbDEpIiAiID0gMCIKKyAgICBnZGJfdGVzdCAicCB0X3N0cmluZ192YWx1ZXMoc3RyaW5nX3ZhbDEsc3RyaW5nX3ZhbDIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X3N0cmluZ192YWx1ZXMoXCJzdHJpbmcgMVwiLFwic3RyaW5nIDJcIikiICIgPSAxIgorICAgIGdkYl90ZXN0ICJwIHRfc3RyaW5nX3ZhbHVlcyhcInN0cmluZyAxXCIsc3RyaW5nX3ZhbDIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X3N0cmluZ192YWx1ZXMoc3RyaW5nX3ZhbDEsXCJzdHJpbmcgMlwiKSIgIiA9IDEiCisKKyAgICBnZGJfdGVzdCAicCB0X2NoYXJfYXJyYXlfdmFsdWVzKGNoYXJfYXJyYXlfdmFsMixjaGFyX2FycmF5X3ZhbDEpIiAiID0gMCIKKyAgICBnZGJfdGVzdCAicCB0X2NoYXJfYXJyYXlfdmFsdWVzKGNoYXJfYXJyYXlfdmFsMSxjaGFyX2FycmF5X3ZhbDIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X2NoYXJfYXJyYXlfdmFsdWVzKFwiY2FycmF5IDFcIixcImNhcnJheSAyXCIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X2NoYXJfYXJyYXlfdmFsdWVzKFwiY2FycmF5IDFcIixjaGFyX2FycmF5X3ZhbDIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X2NoYXJfYXJyYXlfdmFsdWVzKGNoYXJfYXJyYXlfdmFsMSxcImNhcnJheSAyXCIpIiAiID0gMSIKKworICAgIGdkYl90ZXN0ICJwIGRvdWJsZWl0KDQpIiAiID0gOCIKKyAgICBnZGJfdGVzdCAicCBhZGQoNCw1KSIgIiA9IDkiCisgICAgZ2RiX3Rlc3QgInAgdF9mdW5jX3ZhbHVlcyhmdW5jX3ZhbDIsZnVuY192YWwxKSIgIiA9IDAiCisgICAgZ2RiX3Rlc3QgInAgdF9mdW5jX3ZhbHVlcyhmdW5jX3ZhbDEsZnVuY192YWwyKSIgIiA9IDEiCisKKyAgICAjIE9uIHRoZSByczYwMDAsIHdlIG5lZWQgdG8gcGFzcyB0aGUgYWRkcmVzcyBvZiB0aGUgdHJhbXBvbGluZSByb3V0aW5lLAorICAgICMgbm90IHRoZSBhZGRyZXNzIG9mIGFkZCBpdHNlbGYuICBJIGRvbid0IGtub3cgaG93IHRvIGdvIGZyb20gYWRkIHRvCisgICAgIyB0aGUgYWRkcmVzcyBvZiB0aGUgdHJhbXBvbGluZS4gIFNpbWlsYXIgcHJvYmxlbXMgZXhpc3Qgb24gdGhlIEhQUEEsCisgICAgIyBhbmQgaW4gZmFjdCBjYW4gcHJlc2VudCBhbiB1bnNvbHZhYmxlIHByb2JsZW0gYXMgdGhlIHN0dWJzIG1heSBub3QKKyAgICAjIGV2ZW4gZXhpc3QgaW4gdGhlIHVzZXIncyBwcm9ncmFtLiAgV2UndmUgc2xpZ2h0bHkgcmVjb2RlZCB0X2Z1bmNfdmFsdWVzCisgICAgIyB0byBhdm9pZCBzdWNoIHByb2JsZW1zIGluIHRoZSBjb21tb24gY2FzZS4gIFRoaXMgbWF5IG9yIG1heSBub3QgaGVscAorICAgICMgdGhlIFJTNjAwMC4KKyAgICBzZXR1cF94ZmFpbCAicnM2MDAwKi0qLSoiCisgICAgc2V0dXBfeGZhaWwgInBvd2VycGMqLSotKiIKKyAgICBpZiB7ISRnY2NfY29tcGlsZWQgJiYgW2lzdGFyZ2V0IGhwcGEqLSotaHB1eCpdfSB0aGVuIHsKKwlnZGJfdGVzdCAicCB0X2Z1bmNfdmFsdWVzKGFkZCxmdW5jX3ZhbDIpIiAiWW91IGNhbm5vdC4qaWdub3JlZC4qIgorICAgIH0gZWxzZSB7CisJZ2RiX3Rlc3QgInAgdF9mdW5jX3ZhbHVlcyhhZGQsZnVuY192YWwyKSIgIiA9IDEiCisgICAgfQorCisgICAgc2V0dXBfeGZhaWwgInJzNjAwMCotKi0qIgorICAgIHNldHVwX3hmYWlsICJwb3dlcnBjKi0qLSoiCisgICAgaWYgeyEkZ2NjX2NvbXBpbGVkICYmIFtpc3RhcmdldCBocHBhKi0qLWhwdXgqXX0gdGhlbiB7CisJZ2RiX3Rlc3QgInAgdF9mdW5jX3ZhbHVlcyhmdW5jX3ZhbDEsZG91YmxlaXQpIiAiWW91IGNhbm5vdC4qaWdub3JlZC4qIgorICAgIH0gZWxzZSB7CisJZ2RiX3Rlc3QgInAgdF9mdW5jX3ZhbHVlcyhmdW5jX3ZhbDEsZG91YmxlaXQpIiAiID0gMSIKKyAgICB9CisKKyAgICBnZGJfdGVzdCAicCB0X2NhbGxfYWRkKGZ1bmNfdmFsMSwzLDQpIiAiID0gNyIKKworICAgIHNldHVwX3hmYWlsICJyczYwMDAqLSotKiIKKyAgICBzZXR1cF94ZmFpbCAicG93ZXJwYyotKi0qIgorICAgIGlmIHshJGdjY19jb21waWxlZCAmJiBbaXN0YXJnZXQgaHBwYSotKi1ocHV4Kl19IHRoZW4geworCWdkYl90ZXN0ICJwIHRfY2FsbF9hZGQoYWRkLDMsNCkiICJZb3UgY2Fubm90LippZ25vcmVkLioiCisgICAgfSBlbHNlIHsKKwlnZGJfdGVzdCAicCB0X2NhbGxfYWRkKGFkZCwzLDQpIiAiID0gNyIKKyAgICB9CisKKyAgICBnZGJfdGVzdCAicCB0X2VudW1fdmFsdWUxKGVudW12YWwxKSIgIiA9IDEiCisgICAgZ2RiX3Rlc3QgInAgdF9lbnVtX3ZhbHVlMShlbnVtX3ZhbDEpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X2VudW1fdmFsdWUxKGVudW1fdmFsMikiICIgPSAwIgorCisgICAgZ2RiX3Rlc3QgInAgdF9lbnVtX3ZhbHVlMihlbnVtdmFsMikiICIgPSAxIgorICAgIGdkYl90ZXN0ICJwIHRfZW51bV92YWx1ZTIoZW51bV92YWwyKSIgIiA9IDEiCisgICAgZ2RiX3Rlc3QgInAgdF9lbnVtX3ZhbHVlMihlbnVtX3ZhbDEpIiAiID0gMCIKKworICAgIGdkYl90ZXN0ICJwIHN1bV9hcmdzKDEsezJ9KSIgIiA9IDIiCisgICAgZ2RiX3Rlc3QgInAgc3VtX2FyZ3MoMix7MiwzfSkiICIgPSA1IgorICAgIGdkYl90ZXN0ICJwIHN1bV9hcmdzKDMsezIsMyw0fSkiICIgPSA5IgorICAgIGdkYl90ZXN0ICJwIHN1bV9hcmdzKDQsezIsMyw0LDV9KSIgIiA9IDE0IgorCisgICAgZ2RiX3Rlc3QgInAgc3VtMTAgKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwKSIgIiA9IDU1IgorCisgICAgZ2RiX3Rlc3QgInAgY21wMTAgKDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpIiAiID0gMSIKKworICAgIGdkYl90ZXN0ICJwIHRfc3RydWN0c19jKHN0cnVjdF92YWwxKSIgIj0gMTIwICd4JyIgXAorCSJjYWxsIGluZmVyaW9yIGZ1bmMgd2l0aCBzdHJ1Y3QgLSByZXR1cm5zIGNoYXIiCisgICAgZ2RiX3Rlc3QgInAgdF9zdHJ1Y3RzX3Moc3RydWN0X3ZhbDEpIiAiPSA4NyIgXAorCSJjYWxsIGluZmVyaW9yIGZ1bmMgd2l0aCBzdHJ1Y3QgLSAgcmV0dXJucyBzaG9ydCIKKyAgICBnZGJfdGVzdCAicCB0X3N0cnVjdHNfaShzdHJ1Y3RfdmFsMSkiICI9IDc2IiBcCisJImNhbGwgaW5mZXJpb3IgZnVuYyB3aXRoIHN0cnVjdCAtIHJldHVybnMgaW50IgorICAgIGdkYl90ZXN0ICJwIHRfc3RydWN0c19sKHN0cnVjdF92YWwxKSIgIj0gNTEiIFwKKwkiY2FsbCBpbmZlcmlvciBmdW5jIHdpdGggc3RydWN0IC0gcmV0dXJucyBsb25nIgorICAgIHNldHVwX3hmYWlsICJpKjg2LSotKiIKKyAgICBnZGJfdGVzdCAicCB0X3N0cnVjdHNfZihzdHJ1Y3RfdmFsMSkiICI9IDIuMTIuKiIgXAorICAgICAgIAkiY2FsbCBpbmZlcmlvciBmdW5jIHdpdGggc3RydWN0IC0gcmV0dXJucyBmbG9hdCIKKyAgICBzZXR1cF94ZmFpbCAiaSo4Ni0qLSoiCisgICAgZ2RiX3Rlc3QgInAgdF9zdHJ1Y3RzX2Qoc3RydWN0X3ZhbDEpIiAiPSA5Ljg3LioiIFwKKyAgICAJImNhbGwgaW5mZXJpb3IgZnVuYyB3aXRoIHN0cnVjdCAtIHJldHVybnMgZG91YmxlIgorICAgIGdkYl90ZXN0ICJwIHRfc3RydWN0c19hKHN0cnVjdF92YWwxKSIgIj0gKC51bnNpZ25lZCBjaGFyIC4uICk/XCJmb29cIiIgXAorICAgIAkiY2FsbCBpbmZlcmlvciBmdW5jIHdpdGggc3RydWN0IC0gcmV0dXJucyBjaGFyICoiCit9CisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKK2dkYl90ZXN0ICJzZXQgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncyIgIiIKK2dkYl90ZXN0ICJzZXQgcHJpbnQgYWRkcmVzcyBvZmYiICIiCitnZGJfdGVzdCAic2V0IHdpZHRoIDAiICIiCisKK2lmIHsgIVtzZXRfbGFuZ19jXSB9IHsKKyAgICBnZGJfc3VwcHJlc3NfdGVzdHM7Cit9IGVsc2UgeworICAgIGlmIHsgIVtydW50b19tYWluXSB9IHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorfQorCitnZGJfdGVzdCAibmV4dCIgIi4qIgorZG9fZnVuY3Rpb25fY2FsbHMKKworcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY2FsbGZ1bmNzMi5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jYWxsZnVuY3MyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxNGQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY2FsbGZ1bmNzMi5jCkBAIC0wLDAgKzEsMjY3IEBACisvKiBTdXBwb3J0IHByb2dyYW0gZm9yIHRlc3RpbmcgZ2RiJ3MgYWJpbGl0eSB0byBjYWxsIGZ1bmN0aW9ucworICAgaW4gYW4gaW5mZXJpb3Igd2hpY2ggZG9lc24ndCBpdHNlbGYgY2FsbCBtYWxsb2MsIHBhc3MgYXBwcm9wcmlhdGUKKyAgIGFyZ3VtZW50cyB0byB0aG9zZSBmdW5jdGlvbnMsIGFuZCBnZXQgdGhlIHJldHVybmVkIHJlc3VsdC4gKi8KKworI2lmZGVmIE5PX1BST1RPVFlQRVMKKyNkZWZpbmUgUEFSQU1TKHBhcmFtbGlzdCkgKCkKKyNlbHNlCisjZGVmaW5lIFBBUkFNUyhwYXJhbWxpc3QpIHBhcmFtbGlzdAorI2VuZGlmCisKK2NoYXIgY2hhcl92YWwxID0gJ2EnOworY2hhciBjaGFyX3ZhbDIgPSAnYic7CisKK3Nob3J0IHNob3J0X3ZhbDEgPSAxMDsKK3Nob3J0IHNob3J0X3ZhbDIgPSAtMjM7CisKK2ludCBpbnRfdmFsMSA9IDg3OworaW50IGludF92YWwyID0gLTI2OworCitsb25nIGxvbmdfdmFsMSA9IDc4OTsKK2xvbmcgbG9uZ192YWwyID0gLTMyMTsKKworZmxvYXQgZmxvYXRfdmFsMSA9IDMuMTQxNTk7CitmbG9hdCBmbG9hdF92YWwyID0gLTIuMzc2NTsKKworZG91YmxlIGRvdWJsZV92YWwxID0gNDUuNjU0OworZG91YmxlIGRvdWJsZV92YWwyID0gLTY3LjY2OworCisjZGVmaW5lIERFTFRBICgwLjAwMSkKKworY2hhciAqc3RyaW5nX3ZhbDEgPSAic3RyaW5nIDEiOworY2hhciAqc3RyaW5nX3ZhbDIgPSAic3RyaW5nIDIiOworCitjaGFyIGNoYXJfYXJyYXlfdmFsMVtdID0gImNhcnJheSAxIjsKK2NoYXIgY2hhcl9hcnJheV92YWwyW10gPSAiY2FycmF5IDIiOworCitzdHJ1Y3Qgc3RydWN0MSB7CisgIGNoYXIgYzsKKyAgc2hvcnQgczsKKyAgaW50IGk7CisgIGxvbmcgbDsKKyAgZmxvYXQgZjsKKyAgZG91YmxlIGQ7CisgIGNoYXIgYVs0XTsKK30gc3RydWN0X3ZhbDEgPSB7ICd4JywgODcsIDc2LCA1MSwgMi4xMjM0LCA5Ljg3NiwgImZvbyIgfTsKKworLyogU29tZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBvdGhlciB0ZXN0CisgICBmdW5jdGlvbnMsIG9yIGNhbGxlZCBkaXJlY3RseS4gKi8KKworaW50IGFkZCAoYSwgYikKK2ludCBhLCBiOworeworICByZXR1cm4gKGEgKyBiKTsKK30KKworaW50IGRvdWJsZWl0IChhKQoraW50IGE7Cit7CisgIHJldHVybiAoYSArIGEpOworfQorCitpbnQgKCpmdW5jX3ZhbDEpIFBBUkFNUygoaW50LGludCkpID0gYWRkOworaW50ICgqZnVuY192YWwyKSBQQVJBTVMoKGludCkpID0gZG91YmxlaXQ7CisKKy8qIEFuIGVudW1lcmF0aW9uIGFuZCBmdW5jdGlvbnMgdGhhdCB0ZXN0IGZvciBzcGVjaWZpYyB2YWx1ZXMuICovCisKK2VudW0gZW51bXR5cGUgeyBlbnVtdmFsMSwgZW51bXZhbDIsIGVudW12YWwzIH07CitlbnVtIGVudW10eXBlIGVudW1fdmFsMSA9IGVudW12YWwxOworZW51bSBlbnVtdHlwZSBlbnVtX3ZhbDIgPSBlbnVtdmFsMjsKK2VudW0gZW51bXR5cGUgZW51bV92YWwzID0gZW51bXZhbDM7CisKK3RfZW51bV92YWx1ZTEgKGVudW1fYXJnKQorZW51bSBlbnVtdHlwZSBlbnVtX2FyZzsKK3sKKyAgcmV0dXJuIChlbnVtX2FyZyA9PSBlbnVtX3ZhbDEpOworfQorCit0X2VudW1fdmFsdWUyIChlbnVtX2FyZykKK2VudW0gZW51bXR5cGUgZW51bV9hcmc7Cit7CisgIHJldHVybiAoZW51bV9hcmcgPT0gZW51bV92YWwyKTsKK30KKwordF9lbnVtX3ZhbHVlMyAoZW51bV9hcmcpCitlbnVtIGVudW10eXBlIGVudW1fYXJnOworeworICByZXR1cm4gKGVudW1fYXJnID09IGVudW1fdmFsMyk7Cit9CisKKy8qIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHZlY3RvciBvZiBpbnRlZ2VycyAoYWxvbmcgd2l0aCBhbiBleHBsaWNpdAorICAgY291bnQpIGFuZCByZXR1cm5zIHRoZWlyIHN1bS4gKi8KKworaW50IHN1bV9hcmdzIChhcmdjLCBhcmd2KQoraW50IGFyZ2M7CitpbnQgYXJndltdOworeworICBpbnQgc3VtdmFsID0gMDsKKyAgaW50IGlkeDsKKworICBmb3IgKGlkeCA9IDA7IGlkeCA8IGFyZ2M7IGlkeCsrKQorICAgIHsKKyAgICAgIHN1bXZhbCArPSBhcmd2W2lkeF07CisgICAgfQorICByZXR1cm4gKHN1bXZhbCk7Cit9CisKKy8qIFRlc3QgdGhhdCB3ZSBjYW4gY2FsbCBmdW5jdGlvbnMgdGhhdCB0YWtlIHN0cnVjdHMgYW5kIHJldHVybgorICAgbWVtYmVycyBmcm9tIHRoYXQgc3RydWN0ICovCisKK2NoYXIgICB0X3N0cnVjdHNfYyAodHN0cnVjdCkgc3RydWN0IHN0cnVjdDEgdHN0cnVjdDsgeyByZXR1cm4gKHRzdHJ1Y3QuYyk7IH0KK3Nob3J0ICB0X3N0cnVjdHNfcyAodHN0cnVjdCkgc3RydWN0IHN0cnVjdDEgdHN0cnVjdDsgeyByZXR1cm4gKHRzdHJ1Y3Qucyk7IH0KK2ludCAgICB0X3N0cnVjdHNfaSAodHN0cnVjdCkgc3RydWN0IHN0cnVjdDEgdHN0cnVjdDsgeyByZXR1cm4gKHRzdHJ1Y3QuaSk7IH0KK2xvbmcgICB0X3N0cnVjdHNfbCAodHN0cnVjdCkgc3RydWN0IHN0cnVjdDEgdHN0cnVjdDsgeyByZXR1cm4gKHRzdHJ1Y3QubCk7IH0KK2Zsb2F0ICB0X3N0cnVjdHNfZiAodHN0cnVjdCkgc3RydWN0IHN0cnVjdDEgdHN0cnVjdDsgeyByZXR1cm4gKHRzdHJ1Y3QuZik7IH0KK2RvdWJsZSB0X3N0cnVjdHNfZCAodHN0cnVjdCkgc3RydWN0IHN0cnVjdDEgdHN0cnVjdDsgeyByZXR1cm4gKHRzdHJ1Y3QuZCk7IH0KK2NoYXIgICp0X3N0cnVjdHNfYSAodHN0cnVjdCkgc3RydWN0IHN0cnVjdDEgdHN0cnVjdDsgeyByZXR1cm4gKHRzdHJ1Y3QuYSk7IH0KKworLyogVGVzdCB0aGF0IGNhbGxpbmcgZnVuY3Rpb25zIHdvcmtzIGlmIHRoZXJlIGFyZSBhIGxvdCBvZiBhcmd1bWVudHMuICAqLworaW50CitzdW0xMCAoaTAsIGkxLCBpMiwgaTMsIGk0LCBpNSwgaTYsIGk3LCBpOCwgaTkpCisgICAgIGludCBpMCwgaTEsIGkyLCBpMywgaTQsIGk1LCBpNiwgaTcsIGk4LCBpOTsKK3sKKyAgcmV0dXJuIGkwICsgaTEgKyBpMiArIGkzICsgaTQgKyBpNSArIGk2ICsgaTcgKyBpOCArIGk5OworfQorCisvKiBHb3R0YSBoYXZlIGEgbWFpbiB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIGEgbGlua2VkLCBydW5uYWJsZQorICAgZXhlY3V0YWJsZSwgYW5kIGFsc28gcHJvdmlkZSBhIHVzZWZ1bCBwbGFjZSB0byBzZXQgYSBicmVha3BvaW50LiAqLworCittYWluICgpCit7CisjaWZkZWYgdXNlc3R1YnMKKyAgc2V0X2RlYnVnX3RyYXBzKCk7CisgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICB0X3N0cnVjdHNfYyhzdHJ1Y3RfdmFsMSk7Cit9CisKKy8qIEZ1bmN0aW9ucyB0aGF0IGV4cGVjdCBzcGVjaWZpYyB2YWx1ZXMgdG8gYmUgcGFzc2VkIGFuZCByZXR1cm4gCisgICBlaXRoZXIgMCBvciAxLCBkZXBlbmRpbmcgdXBvbiB3aGV0aGVyIHRoZSB2YWx1ZXMgd2VyZQorICAgcGFzc2VkIGluY29ycmVjdGx5IG9yIGNvcnJlY3RseSwgcmVzcGVjdGl2ZWx5LiAqLworCitpbnQgdF9jaGFyX3ZhbHVlcyAoY2hhcl9hcmcxLCBjaGFyX2FyZzIpCitjaGFyIGNoYXJfYXJnMSwgY2hhcl9hcmcyOworeworICByZXR1cm4gKChjaGFyX2FyZzEgPT0gY2hhcl92YWwxKSAmJiAoY2hhcl9hcmcyID09IGNoYXJfdmFsMikpOworfQorCitpbnQKKyNpZmRlZiBOT19QUk9UT1RZUEVTCit0X3NtYWxsX3ZhbHVlcyAoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCwgYXJnOSwgYXJnMTApCisgICAgIGNoYXIgYXJnMTsKKyAgICAgc2hvcnQgYXJnMjsKKyAgICAgaW50IGFyZzM7CisgICAgIGNoYXIgYXJnNDsKKyAgICAgc2hvcnQgYXJnNTsKKyAgICAgY2hhciBhcmc2OworICAgICBzaG9ydCBhcmc3OworICAgICBpbnQgYXJnODsKKyAgICAgc2hvcnQgYXJnOTsKKyAgICAgc2hvcnQgYXJnMTA7CisjZWxzZQordF9zbWFsbF92YWx1ZXMgKGNoYXIgYXJnMSwgc2hvcnQgYXJnMiwgaW50IGFyZzMsIGNoYXIgYXJnNCwgc2hvcnQgYXJnNSwKKwkJY2hhciBhcmc2LCBzaG9ydCBhcmc3LCBpbnQgYXJnOCwgc2hvcnQgYXJnOSwgc2hvcnQgYXJnMTApCisjZW5kaWYKK3sKKyAgcmV0dXJuIGFyZzEgKyBhcmcyICsgYXJnMyArIGFyZzQgKyBhcmc1ICsgYXJnNiArIGFyZzcgKyBhcmc4ICsgYXJnOSArIGFyZzEwOworfQorCitpbnQgdF9zaG9ydF92YWx1ZXMgKHNob3J0X2FyZzEsIHNob3J0X2FyZzIpCitzaG9ydCBzaG9ydF9hcmcxLCBzaG9ydF9hcmcyOworeworICByZXR1cm4gKChzaG9ydF9hcmcxID09IHNob3J0X3ZhbDEpICYmIChzaG9ydF9hcmcyID09IHNob3J0X3ZhbDIpKTsKK30KKworaW50IHRfaW50X3ZhbHVlcyAoaW50X2FyZzEsIGludF9hcmcyKQoraW50IGludF9hcmcxLCBpbnRfYXJnMjsKK3sKKyAgcmV0dXJuICgoaW50X2FyZzEgPT0gaW50X3ZhbDEpICYmIChpbnRfYXJnMiA9PSBpbnRfdmFsMikpOworfQorCitpbnQgdF9sb25nX3ZhbHVlcyAobG9uZ19hcmcxLCBsb25nX2FyZzIpCitsb25nIGxvbmdfYXJnMSwgbG9uZ19hcmcyOworeworICByZXR1cm4gKChsb25nX2FyZzEgPT0gbG9uZ192YWwxKSAmJiAobG9uZ19hcmcyID09IGxvbmdfdmFsMikpOworfQorCitpbnQgdF9mbG9hdF92YWx1ZXMgKGZsb2F0X2FyZzEsIGZsb2F0X2FyZzIpCitmbG9hdCBmbG9hdF9hcmcxLCBmbG9hdF9hcmcyOworeworICByZXR1cm4gKChmbG9hdF9hcmcxIC0gZmxvYXRfdmFsMSkgPCBERUxUQQorCSAgJiYgKGZsb2F0X2FyZzEgLSBmbG9hdF92YWwxKSA+IC1ERUxUQQorCSAgJiYgKGZsb2F0X2FyZzIgLSBmbG9hdF92YWwyKSA8IERFTFRBCisJICAmJiAoZmxvYXRfYXJnMiAtIGZsb2F0X3ZhbDIpID4gLURFTFRBKTsKK30KKworaW50CisjaWZkZWYgTk9fUFJPVE9UWVBFUworLyogSW4gdGhpcyBjYXNlIHdlIGFyZSBqdXN0IGR1cGxpY2F0aW5nIHRfZmxvYXRfdmFsdWVzLCBidXQgdGhhdCBpcyB0aGUKKyAgIGVhc2llc3Qgd2F5IHRvIGRlYWwgd2l0aCBlaXRoZXIgQU5TSSBvciBub24tQU5TSS4gICovCit0X2Zsb2F0X3ZhbHVlczIgKGZsb2F0X2FyZzEsIGZsb2F0X2FyZzIpCisgICAgIGZsb2F0IGZsb2F0X2FyZzEsIGZsb2F0X2FyZzI7CisjZWxzZQordF9mbG9hdF92YWx1ZXMyIChmbG9hdCBmbG9hdF9hcmcxLCBmbG9hdCBmbG9hdF9hcmcyKQorI2VuZGlmCit7CisgIHJldHVybiAoKGZsb2F0X2FyZzEgLSBmbG9hdF92YWwxKSA8IERFTFRBCisJICAmJiAoZmxvYXRfYXJnMSAtIGZsb2F0X3ZhbDEpID4gLURFTFRBCisJICAmJiAoZmxvYXRfYXJnMiAtIGZsb2F0X3ZhbDIpIDwgREVMVEEKKwkgICYmIChmbG9hdF9hcmcyIC0gZmxvYXRfdmFsMikgPiAtREVMVEEpOworfQorCitpbnQgdF9kb3VibGVfdmFsdWVzIChkb3VibGVfYXJnMSwgZG91YmxlX2FyZzIpCitkb3VibGUgZG91YmxlX2FyZzEsIGRvdWJsZV9hcmcyOworeworICByZXR1cm4gKChkb3VibGVfYXJnMSAtIGRvdWJsZV92YWwxKSA8IERFTFRBCisJICAmJiAoZG91YmxlX2FyZzEgLSBkb3VibGVfdmFsMSkgPiAtREVMVEEKKwkgICYmIChkb3VibGVfYXJnMiAtIGRvdWJsZV92YWwyKSA8IERFTFRBCisJICAmJiAoZG91YmxlX2FyZzIgLSBkb3VibGVfdmFsMikgPiAtREVMVEEpOworfQorCitpbnQgdF9zdHJpbmdfdmFsdWVzIChzdHJpbmdfYXJnMSwgc3RyaW5nX2FyZzIpCitjaGFyICpzdHJpbmdfYXJnMSwgKnN0cmluZ19hcmcyOworeworICByZXR1cm4gKCFzdHJjbXAgKHN0cmluZ19hcmcxLCBzdHJpbmdfdmFsMSkgJiYKKwkgICFzdHJjbXAgKHN0cmluZ19hcmcyLCBzdHJpbmdfdmFsMikpOworfQorCitpbnQgdF9jaGFyX2FycmF5X3ZhbHVlcyAoY2hhcl9hcnJheV9hcmcxLCBjaGFyX2FycmF5X2FyZzIpCitjaGFyIGNoYXJfYXJyYXlfYXJnMVtdLCBjaGFyX2FycmF5X2FyZzJbXTsKK3sKKyAgcmV0dXJuICghc3RyY21wIChjaGFyX2FycmF5X2FyZzEsIGNoYXJfYXJyYXlfdmFsMSkgJiYKKwkgICFzdHJjbXAgKGNoYXJfYXJyYXlfYXJnMiwgY2hhcl9hcnJheV92YWwyKSk7Cit9CisKKworLyogVGhpcyB1c2VkIHRvIHNpbXBseSBjb21wYXJlIHRoZSBmdW5jdGlvbiBwb2ludGVyIGFyZ3VtZW50cyB3aXRoCisgICBrbm93biB2YWx1ZXMgZm9yIGZ1bmNfdmFsMSBhbmQgZnVuY192YWwyLiAgRG9pbmcgc28gaXMgdmFsaWQgQU5TSQorICAgY29kZSwgYnV0IG9uIHNvbWUgbWFjaGluZXMgKFJTNjAwMCwgSFBQQSwgb3RoZXJzPykgaXQgbWF5IGZhaWwgd2hlbgorICAgY2FsbGVkIGRpcmVjdGx5IGJ5IEdEQi4KKworICAgSW4gYSBudXRzaGVsbCwgaXQncyBub3QgcG9zc2libGUgZm9yIEdEQiB0byBkZXRlcm1pbmUgd2hlbiB0aGUgYWRkcmVzcworICAgb2YgYSBmdW5jdGlvbiBvciB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24ncyBzdHViL3RyYW1wb2xpbmUgc2hvdWxkCisgICBiZSBwYXNzZWQuCisKKyAgIFNvLCB0byBhdm9pZCBHREIgbG9zc2FnZSBpbiB0aGUgY29tbW9uIGNhc2UsIHdlIHBlcmZvcm0gY2FsbHMgdGhyb3VnaCB0aGUKKyAgIHZhcmlvdXMgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIGNvbXBhcmUgdGhlIHJldHVybiB2YWx1ZXMuICBGb3IgdGhlIEhQUEEKKyAgIGF0IGxlYXN0LCB0aGlzIGFsbG93cyB0aGUgY29tbW9uIGNhc2UgdG8gd29yay4KKworICAgSWYgb25lIHdhbnRzIHRvIHRyeSBzb21ldGhpbmcgbW9yZSBjb21wbGljYXRlZCwgcGFzcyB0aGUgYWRkcmVzcyBvZgorICAgYSBmdW5jdGlvbiBhY2NlcHRpbmcgYSAiZG91YmxlIiBhcyBvbmUgb2YgaXRzIGZpcnN0IDQgYXJndW1lbnRzLiAgQ2FsbAorICAgdGhhdCBmdW5jdGlvbiBpbmRpcmVjdGx5IHRocm91Z2ggdGhlIGZ1bmN0aW9uIHBvaW50ZXIuICBUaGlzIHdvdWxkIGZhaWwKKyAgIG9uIHRoZSBIUFBBLiAgKi8KKworaW50IHRfZnVuY192YWx1ZXMgKGZ1bmNfYXJnMSwgZnVuY19hcmcyKQoraW50ICgqZnVuY19hcmcxKSBQQVJBTVMgKChpbnQsIGludCkpOworaW50ICgqZnVuY19hcmcyKSBQQVJBTVMgKChpbnQpKTsKK3sKKyAgcmV0dXJuICgoKmZ1bmNfYXJnMSkgKDUsNSkgID09ICgqZnVuY192YWwxKSAoNSw1KQorICAgICAgICAgICYmICgqZnVuY19hcmcyKSAoNikgPT0gKCpmdW5jX3ZhbDIpICg2KSk7Cit9CisKK2ludCB0X2NhbGxfYWRkIChmdW5jX2FyZzEsIGEsIGIpCitpbnQgKCpmdW5jX2FyZzEpIFBBUkFNUyAoKGludCwgaW50KSk7CitpbnQgYSwgYjsKK3sKKyAgcmV0dXJuICgoKmZ1bmNfYXJnMSkoYSwgYikpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jYWxsZnVuY3MyLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY2FsbGZ1bmNzMi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxN2I2MwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY2FsbGZ1bmNzMi5leHAKQEAgLTAsMCArMSwyNzYgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEZyZWQgRmlzaC4gKGZuZkBjeWdudXMuY29tKQorCisjIFNBTUUgdGVzdHMgYXMgaW4gY2FsbGZ1bmNzLmV4cCBidXQgaGVyZSB0aGUgaW5mZXJpb3IgcHJvZ3JhbSBkb2VzIG5vdCBjYWxsIG1hbGxvYy4KKworCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJjYWxsZnVuY3MyIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitzZXQgcHJvdG90eXBlcyAxCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgc2V0IHByb3RvdHlwZXMgMDsKKyAgICAjIGJ1aWx0IHRoZSBzZWNvbmQgdGVzdCBjYXNlIHNpbmNlIHdlIGNhbid0IHVzZSBwcm90b3R5cGVzCisgICAgd2FybmluZyAiUHJvdG90eXBlcyBub3Qgc3VwcG9ydGVkLCByZWJ1aWxkaW5nIHdpdGggLUROT19QUk9UT1RZUEVTIgorICAgIGlmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYWRkaXRpb25hbF9mbGFncz0tRE5PX1BST1RPVFlQRVN9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCisgICAgfQorfQorCisjIENyZWF0ZSBhbmQgc291cmNlIHRoZSBmaWxlIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyCisjIHVzZWQgdG8gY29tcGlsZSB0aGUgdGVzdCBjYXNlLgorCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0geworICAgIHJldHVybiAtMTsKK30KKworCisKKyMgVGhlIGEyOWsgY2FuJ3QgY2FsbCBmdW5jdGlvbnMsIHNvIGRvbid0IGV2ZW4gYm90aGVyIHdpdGggdGhpcyB0ZXN0LgoraWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGIsY2Fubm90X2NhbGxfZnVuY3Rpb25zXSB7CisgICAgc2V0dXBfeGZhaWwgIiotKi0qIiAyNDE2CisgICAgZmFpbCAiVGhpcyB0YXJnZXQgY2FuIG5vdCBjYWxsIGZ1bmN0aW9ucyIKKyAgICBjb250aW51ZQorfQorCisjIFNldCB0aGUgY3VycmVudCBsYW5ndWFnZSB0byBDLiAgVGhpcyBjb3VudHMgYXMgYSB0ZXN0LiAgSWYgaXQKKyMgZmFpbHMsIHRoZW4gd2Ugc2tpcCB0aGUgb3RoZXIgdGVzdHMuCisKK3Byb2Mgc2V0X2xhbmdfYyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIHNlbmRfZ2RiICJzZXQgbGFuZ3VhZ2UgY1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorCXRpbWVvdXQgeyBmYWlsICJzZXQgbGFuZ3VhZ2UgYyAodGltZW91dCkiIDsgcmV0dXJuIDAgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJzaG93IGxhbmd1YWdlXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiBzb3VyY2UgbGFuZ3VhZ2UgaXMgXCJjXCIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAic2V0IGxhbmd1YWdlIHRvIFwiY1wiIgorCSAgICByZXR1cm4gMQorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJzZXR0aW5nIGxhbmd1YWdlIHRvIFwiY1wiIgorCSAgICByZXR1cm4gMAorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAiY2FuJ3Qgc2hvdyBsYW5ndWFnZSAodGltZW91dCkiCisJICAgIHJldHVybiAwCisJfQorICAgIH0KK30KKworIyBGSVhNRTogIEJlZm9yZSBjYWxsaW5nIHRoaXMgcHJvYywgd2Ugc2hvdWxkIHByb2JhYmx5IHZlcmlmeSB0aGF0CisjIHdlIGNhbiBjYWxsIGluZmVyaW9yIGZ1bmN0aW9ucyBhbmQgZ2V0IGEgdmFsaWQgaW50ZWdyYWwgdmFsdWUKKyMgcmV0dXJuZWQuCisjIE5vdGUgdGhhdCBpdCBpcyBPSyB0byBjaGVjayBmb3IgMCBvciAxIGFzIHRoZSByZXR1cm5lZCB2YWx1ZXMsIGJlY2F1c2UgQworIyBzcGVjaWZpZXMgdGhhdCB0aGUgbnVtZXJpYyB2YWx1ZSBvZiBhIHJlbGF0aW9uYWwgb3IgbG9naWNhbCBleHByZXNzaW9uCisjIChjb21wdXRlZCBpbiB0aGUgaW5mZXJpb3IpIGlzIDEgZm9yIHRydWUgYW5kIDAgZm9yIGZhbHNlLgorCitwcm9jIGRvX2Z1bmN0aW9uX2NhbGxzIHt9IHsKKyAgICBnbG9iYWwgcHJvdG90eXBlcworICAgIGdsb2JhbCBnY2NfY29tcGlsZWQKKyAgICAjIFdlIG5lZWQgdG8gdXAgdGhpcyBiZWNhdXNlIHRoaXMgY2FuIGJlIHJlYWxseSBzbG93IG9uIHNvbWUgYm9hcmRzLgorICAgIHNldCB0aW1lb3V0IDYwOworCisgICAgZ2RiX3Rlc3QgInAgdF9jaGFyX3ZhbHVlcygwLDApIiAiID0gMCIKKyAgICBnZGJfdGVzdCAicCB0X2NoYXJfdmFsdWVzKCdhJywnYicpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X2NoYXJfdmFsdWVzKGNoYXJfdmFsMSxjaGFyX3ZhbDIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X2NoYXJfdmFsdWVzKCdhJyxjaGFyX3ZhbDIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X2NoYXJfdmFsdWVzKGNoYXJfdmFsMSwnYicpIiAiID0gMSIKKworICAgIGdkYl90ZXN0ICJwIHRfc2hvcnRfdmFsdWVzKDAsMCkiICIgPSAwIgorICAgIGdkYl90ZXN0ICJwIHRfc2hvcnRfdmFsdWVzKDEwLC0yMykiICIgPSAxIgorICAgIGdkYl90ZXN0ICJwIHRfc2hvcnRfdmFsdWVzKHNob3J0X3ZhbDEsc2hvcnRfdmFsMikiICIgPSAxIgorICAgIGdkYl90ZXN0ICJwIHRfc2hvcnRfdmFsdWVzKDEwLHNob3J0X3ZhbDIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X3Nob3J0X3ZhbHVlcyhzaG9ydF92YWwxLC0yMykiICIgPSAxIgorCisgICAgZ2RiX3Rlc3QgInAgdF9pbnRfdmFsdWVzKDAsMCkiICIgPSAwIgorICAgIGdkYl90ZXN0ICJwIHRfaW50X3ZhbHVlcyg4NywtMjYpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X2ludF92YWx1ZXMoaW50X3ZhbDEsaW50X3ZhbDIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X2ludF92YWx1ZXMoODcsaW50X3ZhbDIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X2ludF92YWx1ZXMoaW50X3ZhbDEsLTI2KSIgIiA9IDEiCisKKyAgICBnZGJfdGVzdCAicCB0X2xvbmdfdmFsdWVzKDAsMCkiICIgPSAwIgorICAgIGdkYl90ZXN0ICJwIHRfbG9uZ192YWx1ZXMoNzg5LC0zMjEpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X2xvbmdfdmFsdWVzKGxvbmdfdmFsMSxsb25nX3ZhbDIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X2xvbmdfdmFsdWVzKDc4OSxsb25nX3ZhbDIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X2xvbmdfdmFsdWVzKGxvbmdfdmFsMSwtMzIxKSIgIiA9IDEiCisKKyAgICBpZiAhW3RhcmdldF9pbmZvIGV4aXN0cyBnZGIsc2tpcF9mbG9hdF90ZXN0c10geworCWdkYl90ZXN0ICJwIHRfZmxvYXRfdmFsdWVzKDAuMCwwLjApIiAiID0gMCIKKworCSMgVGhlc2UgbmV4dCBmb3VyIHRlc3RzIGZhaWwgb24gdGhlIG1uMTAzMDAuCisJIyBUaGUgZmlyc3QgdmFsdWUgaXMgcGFzc2VkIGluIHJlZ3MsIHRoZSBvdGhlciBpbiBtZW1vcnkuCisJIyBHY2MgZW1pdHMgZGlmZmVyZW50IHN0YWJzIGZvciB0aGUgdHdvIHBhcmFtZXRlcnM7IHRoZSBmaXJzdCBpcworCSMgY2xhaW1lZCB0byBiZSBhIGZsb2F0LCB0aGUgc2Vjb25kIGEgZG91YmxlLgorCSMgZGJ4b3V0LmMgaW4gZ2NjIGNsYWltcyB0aGlzIGlzIHRoZSBkZXNpcmVkIGJlaGF2aW9yLgorCXNldHVwX3hmYWlsICJtbjEwMzAwLSotKiIKKwlnZGJfdGVzdCAicCB0X2Zsb2F0X3ZhbHVlcygzLjE0MTU5LC0yLjM3NjUpIiAiID0gMSIKKwlzZXR1cF94ZmFpbCAibW4xMDMwMC0qLSoiCisJZ2RiX3Rlc3QgInAgdF9mbG9hdF92YWx1ZXMoZmxvYXRfdmFsMSxmbG9hdF92YWwyKSIgIiA9IDEiCisJc2V0dXBfeGZhaWwgIm1uMTAzMDAtKi0qIgorCWdkYl90ZXN0ICJwIHRfZmxvYXRfdmFsdWVzKDMuMTQxNTksZmxvYXRfdmFsMikiICIgPSAxIgorCXNldHVwX3hmYWlsICJtbjEwMzAwLSotKiIKKwlnZGJfdGVzdCAicCB0X2Zsb2F0X3ZhbHVlcyhmbG9hdF92YWwxLC0yLjM3NjUpIiAiID0gMSIKKworCSMgVGVzdCBwYXNzaW5nIG9mIGFyZ3VtZW50cyB3aGljaCBtaWdodCBub3QgYmUgd2lkZW5lZC4KKwlnZGJfdGVzdCAicCB0X2Zsb2F0X3ZhbHVlczIoMC4wLDAuMCkiICIgPSAwIgorCisJIyBBbHRob3VnaCBQUiA1MzE4IG1lbnRpb25zIFN1bk9TIHNwZWNpZmljYWxseSwgdGhpcyBzZWVtcworCSMgdG8gYmUgYSBnZW5lcmljIHByb2JsZW0gb24gcXVpdGUgYSBmZXcgcGxhdGZvcm1zLgorCWlmICRwcm90b3R5cGVzIHRoZW4geworCSAgICBzZXR1cF94ZmFpbCAiaHBwYSotKi0qIiAic3BhcmMtKi0qIiAibWlwcyotKi0qIiA1MzE4CisJICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7CisJCXNldHVwX3hmYWlsICJhbHBoYS1kZWMtb3NmMioiICJpKjg2LSotc3lzdjQqIiA1MzE4CisJICAgIH0KKwl9CisJZ2RiX3Rlc3QgInAgdF9mbG9hdF92YWx1ZXMyKDMuMTQxNTksZmxvYXRfdmFsMikiICIgPSAxIgorCWdkYl90ZXN0ICJwIHRfc21hbGxfdmFsdWVzKDEsMiwzLDQsNSw2LDcsOCw5LDEwKSIgIiA9IDU1IgorCisJZ2RiX3Rlc3QgInAgdF9kb3VibGVfdmFsdWVzKDAuMCwwLjApIiAiID0gMCIKKwlnZGJfdGVzdCAicCB0X2RvdWJsZV92YWx1ZXMoNDUuNjU0LC02Ny42NikiICIgPSAxIgorCWdkYl90ZXN0ICJwIHRfZG91YmxlX3ZhbHVlcyhkb3VibGVfdmFsMSxkb3VibGVfdmFsMikiICIgPSAxIgorCWdkYl90ZXN0ICJwIHRfZG91YmxlX3ZhbHVlcyg0NS42NTQsZG91YmxlX3ZhbDIpIiAiID0gMSIKKwlnZGJfdGVzdCAicCB0X2RvdWJsZV92YWx1ZXMoZG91YmxlX3ZhbDEsLTY3LjY2KSIgIiA9IDEiCisgICAKKyAgICB9CisKKyAgICBnZGJfdGVzdCAicCB0X3N0cmluZ192YWx1ZXMoc3RyaW5nX3ZhbDIsc3RyaW5nX3ZhbDEpIiAiID0gMCIKKyAgICBnZGJfdGVzdCAicCB0X3N0cmluZ192YWx1ZXMoc3RyaW5nX3ZhbDEsc3RyaW5nX3ZhbDIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X3N0cmluZ192YWx1ZXMoXCJzdHJpbmcgMVwiLFwic3RyaW5nIDJcIikiICIgPSAxIgorICAgIGdkYl90ZXN0ICJwIHRfc3RyaW5nX3ZhbHVlcyhcInN0cmluZyAxXCIsc3RyaW5nX3ZhbDIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X3N0cmluZ192YWx1ZXMoc3RyaW5nX3ZhbDEsXCJzdHJpbmcgMlwiKSIgIiA9IDEiCisKKyAgICBnZGJfdGVzdCAicCB0X2NoYXJfYXJyYXlfdmFsdWVzKGNoYXJfYXJyYXlfdmFsMixjaGFyX2FycmF5X3ZhbDEpIiAiID0gMCIKKyAgICBnZGJfdGVzdCAicCB0X2NoYXJfYXJyYXlfdmFsdWVzKGNoYXJfYXJyYXlfdmFsMSxjaGFyX2FycmF5X3ZhbDIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X2NoYXJfYXJyYXlfdmFsdWVzKFwiY2FycmF5IDFcIixcImNhcnJheSAyXCIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X2NoYXJfYXJyYXlfdmFsdWVzKFwiY2FycmF5IDFcIixjaGFyX2FycmF5X3ZhbDIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X2NoYXJfYXJyYXlfdmFsdWVzKGNoYXJfYXJyYXlfdmFsMSxcImNhcnJheSAyXCIpIiAiID0gMSIKKworICAgIGdkYl90ZXN0ICJwIGRvdWJsZWl0KDQpIiAiID0gOCIKKyAgICBnZGJfdGVzdCAicCBhZGQoNCw1KSIgIiA9IDkiCisgICAgZ2RiX3Rlc3QgInAgdF9mdW5jX3ZhbHVlcyhmdW5jX3ZhbDIsZnVuY192YWwxKSIgIiA9IDAiCisgICAgZ2RiX3Rlc3QgInAgdF9mdW5jX3ZhbHVlcyhmdW5jX3ZhbDEsZnVuY192YWwyKSIgIiA9IDEiCisKKyAgICAjIE9uIHRoZSByczYwMDAsIHdlIG5lZWQgdG8gcGFzcyB0aGUgYWRkcmVzcyBvZiB0aGUgdHJhbXBvbGluZSByb3V0aW5lLAorICAgICMgbm90IHRoZSBhZGRyZXNzIG9mIGFkZCBpdHNlbGYuICBJIGRvbid0IGtub3cgaG93IHRvIGdvIGZyb20gYWRkIHRvCisgICAgIyB0aGUgYWRkcmVzcyBvZiB0aGUgdHJhbXBvbGluZS4gIFNpbWlsYXIgcHJvYmxlbXMgZXhpc3Qgb24gdGhlIEhQUEEsCisgICAgIyBhbmQgaW4gZmFjdCBjYW4gcHJlc2VudCBhbiB1bnNvbHZhYmxlIHByb2JsZW0gYXMgdGhlIHN0dWJzIG1heSBub3QKKyAgICAjIGV2ZW4gZXhpc3QgaW4gdGhlIHVzZXIncyBwcm9ncmFtLiAgV2UndmUgc2xpZ2h0bHkgcmVjb2RlZCB0X2Z1bmNfdmFsdWVzCisgICAgIyB0byBhdm9pZCBzdWNoIHByb2JsZW1zIGluIHRoZSBjb21tb24gY2FzZS4gIFRoaXMgbWF5IG9yIG1heSBub3QgaGVscAorICAgICMgdGhlIFJTNjAwMC4KKyAgICBzZXR1cF94ZmFpbCAicnM2MDAwKi0qLSoiCisgICAgc2V0dXBfeGZhaWwgInBvd2VycGMqLSotKiIKKworICAgIGlmIHshJGdjY19jb21waWxlZCAmJiBbaXN0YXJnZXQgaHBwYSotKi1ocHV4Kl19IHRoZW4geworCWdkYl90ZXN0ICJwIHRfZnVuY192YWx1ZXMoYWRkLGZ1bmNfdmFsMikiICJZb3UgY2Fubm90LippZ25vcmVkLioiCisgICAgfSBlbHNlIHsKKwlnZGJfdGVzdCAicCB0X2Z1bmNfdmFsdWVzKGFkZCxmdW5jX3ZhbDIpIiAiID0gMSIKKyAgICB9CisKKyAgICBzZXR1cF94ZmFpbCAicnM2MDAwKi0qLSoiCisgICAgc2V0dXBfeGZhaWwgInBvd2VycGMqLSotKiIKKworICAgIGlmIHshJGdjY19jb21waWxlZCAmJiBbaXN0YXJnZXQgaHBwYSotKi1ocHV4Kl19IHRoZW4geworCWdkYl90ZXN0ICJwIHRfZnVuY192YWx1ZXMoZnVuY192YWwxLGRvdWJsZWl0KSIgIllvdSBjYW5ub3QuKmlnbm9yZWQuKiIKKyAgICB9IGVsc2UgeworCWdkYl90ZXN0ICJwIHRfZnVuY192YWx1ZXMoZnVuY192YWwxLGRvdWJsZWl0KSIgIiA9IDEiCisgICAgfQorCisgICAgZ2RiX3Rlc3QgInAgdF9jYWxsX2FkZChmdW5jX3ZhbDEsMyw0KSIgIiA9IDciCisKKyAgICBzZXR1cF94ZmFpbCAicnM2MDAwKi0qLSoiCisgICAgc2V0dXBfeGZhaWwgInBvd2VycGMqLSotKiIKKworICAgIGlmIHshJGdjY19jb21waWxlZCAmJiBbaXN0YXJnZXQgaHBwYSotKi1ocHV4Kl19IHRoZW4geworCWdkYl90ZXN0ICJwIHRfY2FsbF9hZGQoYWRkLDMsNCkiICJZb3UgY2Fubm90LippZ25vcmVkLioiCisgICAgfSBlbHNlIHsKKwlnZGJfdGVzdCAicCB0X2NhbGxfYWRkKGFkZCwzLDQpIiAiID0gNyIKKyAgICB9CisgICAgCisgICAgZ2RiX3Rlc3QgInAgdF9lbnVtX3ZhbHVlMShlbnVtdmFsMSkiICIgPSAxIgorICAgIGdkYl90ZXN0ICJwIHRfZW51bV92YWx1ZTEoZW51bV92YWwxKSIgIiA9IDEiCisgICAgZ2RiX3Rlc3QgInAgdF9lbnVtX3ZhbHVlMShlbnVtX3ZhbDIpIiAiID0gMCIKKworICAgIGdkYl90ZXN0ICJwIHRfZW51bV92YWx1ZTIoZW51bXZhbDIpIiAiID0gMSIKKyAgICBnZGJfdGVzdCAicCB0X2VudW1fdmFsdWUyKGVudW1fdmFsMikiICIgPSAxIgorICAgIGdkYl90ZXN0ICJwIHRfZW51bV92YWx1ZTIoZW51bV92YWwxKSIgIiA9IDAiCisKKyAgICBnZGJfdGVzdCAicCBzdW1fYXJncygxLHsyfSkiICIgPSAyIgorICAgIGdkYl90ZXN0ICJwIHN1bV9hcmdzKDIsezIsM30pIiAiID0gNSIKKyAgICBnZGJfdGVzdCAicCBzdW1fYXJncygzLHsyLDMsNH0pIiAiID0gOSIKKyAgICBnZGJfdGVzdCAicCBzdW1fYXJncyg0LHsyLDMsNCw1fSkiICIgPSAxNCIKKyAgICBnZGJfdGVzdCAicCBzdW0xMCAoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTApIiAiID0gNTUiCisKKyAgICBnZGJfdGVzdCAicCB0X3N0cnVjdHNfYyhzdHJ1Y3RfdmFsMSkiICI9IDEyMCAneCciIFwKKwkiY2FsbCBpbmZlcmlvciBmdW5jIHdpdGggc3RydWN0IC0gcmV0dXJucyBjaGFyIgorICAgIGdkYl90ZXN0ICJwIHRfc3RydWN0c19zKHN0cnVjdF92YWwxKSIgIj0gODciIFwKKwkiY2FsbCBpbmZlcmlvciBmdW5jIHdpdGggc3RydWN0IC0gIHJldHVybnMgc2hvcnQiCisgICAgZ2RiX3Rlc3QgInAgdF9zdHJ1Y3RzX2koc3RydWN0X3ZhbDEpIiAiPSA3NiIgXAorCSJjYWxsIGluZmVyaW9yIGZ1bmMgd2l0aCBzdHJ1Y3QgLSByZXR1cm5zIGludCIKKyAgICBnZGJfdGVzdCAicCB0X3N0cnVjdHNfbChzdHJ1Y3RfdmFsMSkiICI9IDUxIiBcCisJImNhbGwgaW5mZXJpb3IgZnVuYyB3aXRoIHN0cnVjdCAtIHJldHVybnMgbG9uZyIKKyAgICBzZXR1cF94ZmFpbCAiaSo4Ni0qLSoiCisgICAgZ2RiX3Rlc3QgInAgdF9zdHJ1Y3RzX2Yoc3RydWN0X3ZhbDEpIiAiPSAyLjEyLioiIFwKKwkiY2FsbCBpbmZlcmlvciBmdW5jIHdpdGggc3RydWN0IC0gcmV0dXJucyBmbG9hdCIKKyAgICBzZXR1cF94ZmFpbCAiaSo4Ni0qLSoiCisgICAgZ2RiX3Rlc3QgInAgdF9zdHJ1Y3RzX2Qoc3RydWN0X3ZhbDEpIiAiPSA5Ljg3LioiIFwKKwkiY2FsbCBpbmZlcmlvciBmdW5jIHdpdGggc3RydWN0IC0gcmV0dXJucyBkb3VibGUiCisgICAgZ2RiX3Rlc3QgInAgdF9zdHJ1Y3RzX2Eoc3RydWN0X3ZhbDEpIiAiPSAoLnVuc2lnbmVkIGNoYXIgLi4gKT9cImZvb1wiIiBcCisJImNhbGwgaW5mZXJpb3IgZnVuYyB3aXRoIHN0cnVjdCAtIHJldHVybnMgY2hhciAqIgorCit9CisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKK2dkYl90ZXN0ICJzZXQgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncyIgIiIKK2dkYl90ZXN0ICJzZXQgcHJpbnQgYWRkcmVzcyBvZmYiICIiCitnZGJfdGVzdCAic2V0IHdpZHRoIDAiICIiCisKK2lmIHsgIVtzZXRfbGFuZ19jXSB9IHsKKyAgICBnZGJfc3VwcHJlc3NfdGVzdHM7Cit9IGVsc2UgeworICAgIGlmIHsgIVtydW50b19tYWluXSB9IHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorfQorCitnZGJfdGVzdCAibmV4dCIgIi4qIgorZG9fZnVuY3Rpb25fY2FsbHMKKworcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY29tbWFuZHMuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jb21tYW5kcy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcwYWM2YgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY29tbWFuZHMuZXhwCkBAIC0wLDAgKzEsMjQ4IEBACisjICAgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworIworIyB0ZXN0IHNwZWNpYWwgY29tbWFuZHMgKGlmLCB3aGlsZSwgZXRjKQorIworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAicnVuIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS9jb21tYW5kcworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1ZyBhZGRpdGlvbmFsX2ZsYWdzPS1ERkFLRUFSR1Z9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2RlbGV0ZV9icmVha3BvaW50cworZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKK3Byb2MgZ2RidmFyX3NpbXBsZV9pZl90ZXN0IHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgZ2RiX3Rlc3QgInNldCBcJGZvbyA9IDAiICIiICJzZXQgZm9vIGluIGdkYnZhcl9zaW1wbGVfaWZfdGVzdCIKKyAgICAjIEFsbCB0aGlzIHRlc3Qgc2hvdWxkIGRvIGlzIHByaW50IDB4ZGVhZGJlZWYgb25jZS4KKyAgICBnZGJfdGVzdCAiaWYgXCRmb28gPT0gMVxucC94IDB4ZmVlZGZhY2VcbmVsc2VcbnAveCAweGRlYWRiZWVmXG5lbmQiICJcXFwkXFswLTlcXSogPSAweGRlYWRiZWVmIiAiZ2RidmFyX3NpbXBsZV9pZl90ZXN0ICMxIgorICAgICMgQWxsIHRoaXMgdGVzdCBzaG91bGQgZG8gaXMgcHJpbnQgMHhmZWVkZmFjZSBvbmNlLgorICAgIGdkYl90ZXN0ICJpZiBcJGZvbyA9PSAwXG5wL3ggMHhmZWVkZmFjZVxuZWxzZVxucC94IDB4ZGVhZGJlZWZcbmVuZCIgIlxcXCRcWzAtOVxdKiA9IDB4ZmVlZGZhY2UiICJnZGJ2YXJfc2ltcGxlX2lmX3Rlc3QgIzIiCit9CisKK3Byb2MgZ2RidmFyX3NpbXBsZV93aGlsZV90ZXN0IHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgZ2RiX3Rlc3QgInNldCBcJGZvbyA9IDUiICIiICJzZXQgZm9vIGluIGdkYnZhcl9zaW1wbGVfd2hpbGVfdGVzdCIKKyAgICAjIFRoaXMgdGVzdCBzaG91bGQgcHJpbnQgMHhmZWVkZmFjZSBmaXZlIHRpbWVzLgorICAgIGdkYl90ZXN0ICJ3aGlsZSBcJGZvbyA+IDBcbnAveCAweGZlZWRmYWNlXG5zZXQgXCRmb28gLT0gMVxuZW5kIiAiXFxcJFxbMC05XF0qID0gMHhmZWVkZmFjZVxbXlxuXF0qXG5cXFwkXFswLTlcXSogPSAweGZlZWRmYWNlXFteXG5cXSpcblxcXCRcWzAtOVxdKiA9IDB4ZmVlZGZhY2VcW15cblxdKlxuXFxcJFxbMC05XF0qID0gMHhmZWVkZmFjZVxbXlxuXF0qXG5cXFwkXFswLTlcXSogPSAweGZlZWRmYWNlIiAiZ2RidmFyX3NpbXBsZV93aGlsZV90ZXN0ICMxIgorfQorCitwcm9jIGdkYnZhcl9jb21wbGV4X2lmX3doaWxlX3Rlc3Qge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBnZGJfdGVzdCAic2V0IFwkZm9vID0gNCIgIiIgInNldCBmb28gaW4gZ2RidmFyIGNvbXBsZXhfaWZfd2hpbGVfdGVzdCIKKyAgICAjIFRoaXMgdGVzdCBzaG91bGQgYWx0ZXJuYXRlIGJldHdlZW4gMHhkZWFkYmVlZiBhbmQgMHhmZWVkZmFjZSB0d28gdGltZXMuCisgICAgZ2RiX3Rlc3QgIndoaWxlIFwkZm9vID4gMFxuc2V0IFwkZm9vIC09IDFcbmlmIFwoXCRmb28gJSAyXCkgPT0gMVxucC94IDB4ZGVhZGJlZWZcbmVsc2VcbnAveCAweGZlZWRmYWNlXG5lbmRcbmVuZCIgIlxcXCRcWzAtOVxdKiA9IDB4ZGVhZGJlZWZcW15cblxdKlxuXFxcJFxbMC05XF0qID0gMHhmZWVkZmFjZVxbXlxuXF0qXG5cXFwkXFswLTlcXSogPSAweGRlYWRiZWVmXFteXG5cXSpcblxcXCRcWzAtOVxdKiA9IDB4ZmVlZGZhY2UiICJnZGJ2YXJfY29tcGxleF9pZl93aGlsZV90ZXN0ICMxIgorfQorCitwcm9jIHByb2d2YXJfc2ltcGxlX2lmX3Rlc3Qge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIG5vYXJnc10geyAKKyAgICAgICAgdmVyYm9zZSAiU2tpcHBpbmcgcHJvZ3Zhcl9zaW1wbGVfaWZfdGVzdCBiZWNhdXNlIG9mIG5vYXJncy4iCisgICAgICAgIHJldHVybgorICAgIH0KKworICAgIGlmIHsgIVtydW50byBmYWN0b3JpYWxdIH0gdGhlbiB7IGdkYl9zdXBwcmVzc190ZXN0czsgfQorICAgICMgRG9uJ3QgZGVwZW5kIHVwb24gYXJndW1lbnQgcGFzc2luZywgc2luY2UgbW9zdCBzaW11bGF0b3JzIGRvbid0IGN1cnJlbnRseQorICAgICMgc3VwcG9ydCBpdC4gIEJhc2ggdmFsdWUgdmFyaWFibGUgdG8gYmUgd2hhdCB3ZSB3YW50LgorICAgIGdkYl90ZXN0ICJwIHZhbHVlPTUiICIiICJzZXQgdmFsdWUgdG8gNSBpbiBwcm9ndmFyX3NpbXBsZV9pZl90ZXN0ICMxIgorICAgICMgQWxsIHRoaXMgdGVzdCBzaG91bGQgZG8gaXMgcHJpbnQgMHhkZWFkYmVlZiBvbmNlLgorICAgIGdkYl90ZXN0ICJpZiB2YWx1ZSA9PSAxXG5wL3ggMHhmZWVkZmFjZVxuZWxzZVxucC94IDB4ZGVhZGJlZWZcbmVuZCIgIlxcXCRcWzAtOVxdKiA9IDB4ZGVhZGJlZWYiICJwcm9ndmFyX3NpbXBsZV9pZl90ZXN0ICMxIgorICAgICMgQWxsIHRoaXMgdGVzdCBzaG91bGQgZG8gaXMgcHJpbnQgMHhmZWVkZmFjZSBvbmNlLgorICAgIGdkYl90ZXN0ICJpZiB2YWx1ZSA9PSA1XG5wL3ggMHhmZWVkZmFjZVxuZWxzZVxucC94IDB4ZGVhZGJlZWZcbmVuZCIgIlxcXCRcWzAtOVxdKiA9IDB4ZmVlZGZhY2UiICJwcm9ndmFyX3NpbXBsZV9pZl90ZXN0ICMyIgorICAgIGdkYl9zdG9wX3N1cHByZXNzaW5nX3Rlc3RzOworfQorCitwcm9jIHByb2d2YXJfc2ltcGxlX3doaWxlX3Rlc3Qge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIG5vYXJnc10geyAKKyAgICAgICAgdmVyYm9zZSAiU2tpcHBpbmcgcHJvZ3Zhcl9zaW1wbGVfd2hpbGVfdGVzdCBiZWNhdXNlIG9mIG5vYXJncy4iCisgICAgICAgIHJldHVybgorICAgIH0KKworICAgIGlmIHsgIVtydW50byBmYWN0b3JpYWxdIH0gdGhlbiB7IGdkYl9zdXBwcmVzc190ZXN0cyB9CisgICAgIyBEb24ndCBkZXBlbmQgdXBvbiBhcmd1bWVudCBwYXNzaW5nLCBzaW5jZSBtb3N0IHNpbXVsYXRvcnMgZG9uJ3QgY3VycmVudGx5CisgICAgIyBzdXBwb3J0IGl0LiAgQmFzaCB2YWx1ZSB2YXJpYWJsZSB0byBiZSB3aGF0IHdlIHdhbnQuCisgICAgZ2RiX3Rlc3QgInAgdmFsdWU9NSIgIiIgInNldCB2YWx1ZSB0byA1IGluIHByb2d2YXJfc2ltcGxlX2lmX3Rlc3QgIzIiCisgICAgIyBUaGlzIHRlc3Qgc2hvdWxkIHByaW50IDB4ZmVlZGZhY2UgZml2ZSB0aW1lcy4KKyAgICBnZGJfdGVzdCAid2hpbGUgdmFsdWUgPiAwXG5wL3ggMHhmZWVkZmFjZVxuc2V0IHZhbHVlIC09IDFcbmVuZCIgIlxcXCRcWzAtOVxdKiA9IDB4ZmVlZGZhY2VcW15cblxdKlxuXFxcJFxbMC05XF0qID0gMHhmZWVkZmFjZVxbXlxuXF0qXG5cXFwkXFswLTlcXSogPSAweGZlZWRmYWNlXFteXG5cXSpcblxcXCRcWzAtOVxdKiA9IDB4ZmVlZGZhY2VcW15cblxdKlxuXFxcJFxbMC05XF0qID0gMHhmZWVkZmFjZSIgInByb2d2YXJfc2ltcGxlX3doaWxlX3Rlc3QgIzEiCisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7Cit9CisKK3Byb2MgcHJvZ3Zhcl9jb21wbGV4X2lmX3doaWxlX3Rlc3Qge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIG5vYXJnc10geyAKKyAgICAgICAgdmVyYm9zZSAiU2tpcHBpbmcgcHJvZ3Zhcl9zaW1wbGVfaWZfd2hpbGVfdGVzdCBiZWNhdXNlIG9mIG5vYXJncy4iCisgICAgICAgIHJldHVybgorICAgIH0KKworICAgIGlmIHsgIVtydW50byBmYWN0b3JpYWxdIH0gdGhlbiB7IGdkYl9zdXBwcmVzc190ZXN0cyB9CisgICAgIyBEb24ndCBkZXBlbmQgdXBvbiBhcmd1bWVudCBwYXNzaW5nLCBzaW5jZSBtb3N0IHNpbXVsYXRvcnMgZG9uJ3QgY3VycmVudGx5CisgICAgIyBzdXBwb3J0IGl0LiAgQmFzaCB2YWx1ZSB2YXJpYWJsZSB0byBiZSB3aGF0IHdlIHdhbnQuCisgICAgZ2RiX3Rlc3QgInAgdmFsdWU9NCIgIiIgInNldCB2YWx1ZSB0byA0IGluIHByb2d2YXJfc2ltcGxlX2lmX3Rlc3QiCisgICAgIyBUaGlzIHRlc3Qgc2hvdWxkIGFsdGVybmF0ZSBiZXR3ZWVuIDB4ZGVhZGJlZWYgYW5kIDB4ZmVlZGZhY2UgdHdvIHRpbWVzLgorICAgIGdkYl90ZXN0ICJ3aGlsZSB2YWx1ZSA+IDBcbnNldCB2YWx1ZSAtPSAxXG5pZiBcKHZhbHVlICUgMlwpID09IDFcbnAveCAweGRlYWRiZWVmXG5lbHNlXG5wL3ggMHhmZWVkZmFjZVxuZW5kXG5lbmQiICJcXFwkXFswLTlcXSogPSAweGRlYWRiZWVmXFteXG5cXSpcblxcXCRcWzAtOVxdKiA9IDB4ZmVlZGZhY2VcW15cblxdKlxuXFxcJFxbMC05XF0qID0gMHhkZWFkYmVlZlxbXlxuXF0qXG5cXFwkXFswLTlcXSogPSAweGZlZWRmYWNlIiAicHJvZ3Zhcl9jb21wbGV4X2lmX3doaWxlX3Rlc3QgIzEiCisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7Cit9CisKK3Byb2MgaWZfd2hpbGVfYnJlYWtwb2ludF9jb21tYW5kX3Rlc3Qge30geworICAgIGlmIFt0YXJnZXRfaW5mbyBleGlzdHMgbm9hcmdzXSB7IAorICAgICAgICB2ZXJib3NlICJTa2lwcGluZyBpZl93aGlsZV9icmVha3BvaW50X2NvbW1hbmRfdGVzdCBiZWNhdXNlIG9mIG5vYXJncy4iCisgICAgICAgIHJldHVybgorICAgIH0KKworICAgIGlmIHsgIVtydW50byBmYWN0b3JpYWxdIH0gdGhlbiB7IGdkYl9zdXBwcmVzc190ZXN0cyB9CisgICAgIyBEb24ndCBkZXBlbmQgdXBvbiBhcmd1bWVudCBwYXNzaW5nLCBzaW5jZSBtb3N0IHNpbXVsYXRvcnMgZG9uJ3QgY3VycmVudGx5CisgICAgIyBzdXBwb3J0IGl0LiAgQmFzaCB2YWx1ZSB2YXJpYWJsZSB0byBiZSB3aGF0IHdlIHdhbnQuCisgICAgZ2RiX3Rlc3QgInAgdmFsdWU9NSIgIiIgInNldCB2YWx1ZSB0byA1IGluIHByb2d2YXJfc2ltcGxlX2lmX3Rlc3QiCisgICAgZGVsZXRlX2JyZWFrcG9pbnRzCisgICAgZ2RiX3Rlc3QgImJyZWFrIGZhY3RvcmlhbCIgIkJyZWFrcG9pbnQuKmF0LioiICJicmVhayBmYWN0b3JpYWwgIzEiCisKKyAgICBzZW5kX2dkYiAiY29tbWFuZHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIkVuZCB3aXRoIiB7CisJICAgIHBhc3MgImNvbW1hbmRzIGluIGlmX3doaWxlX2JyZWFrcG9pbnRfY29tbWFuZF90ZXN0IgorCX0KKyAgICAgICAgZGVmYXVsdCB7CisJICAgIGZhaWwgIih0aW1lb3V0IG9yIGVvZikgY29tbWFuZHMgaW4gaWZfd2hpbGVfYnJlYWtwb2ludF9jb21tYW5kX3Rlc3QiCisJfQorICAgIH0KKyAgICAjIFRoaXMgdGVzdCBzaG91bGQgYWx0ZXJuYXRlIGJldHdlZW4gMHhkZWFkYmVlZiBhbmQgMHhmZWVkZmFjZSB0d28gdGltZXMuCisgICAgZ2RiX3Rlc3QgIndoaWxlIHZhbHVlID4gMFxuc2V0IHZhbHVlIC09IDFcbmlmIFwodmFsdWUgJSAyXCkgPT0gMVxucC94IDB4ZGVhZGJlZWZcbmVsc2VcbnAveCAweGZlZWRmYWNlXG5lbmRcbmVuZFxuZW5kIiAiIiAiY29tbWFuZHMgcGFydCAyIGluIGlmX3doaWxlX2JyZWFrcG9pbnRfY29tbWFuZF90ZXN0IgorICAgIGdkYl90ZXN0ICJjb250aW51ZSIgIlxcXCRcWzAtOVxdKiA9IDB4ZGVhZGJlZWZcW15cblxdKlxuXFxcJFxbMC05XF0qID0gMHhmZWVkZmFjZVxbXlxuXF0qXG5cXFwkXFswLTlcXSogPSAweGRlYWRiZWVmXFteXG5cXSpcblxcXCRcWzAtOVxdKiA9IDB4ZmVlZGZhY2UiICJpZl93aGlsZV9icmVha3BvaW50X2NvbW1hbmRfdGVzdCAjMSIKKyAgIGdkYl90ZXN0ICJpbmZvIGJyZWFrIiAid2hpbGUuKnNldC4qaWYuKnAveC4qZWxzZS4qcC94LiplbmQuKiIgImluZm8gYnJlYWsgaW4gaWZfd2hpbGVfYnJlYWtwb2ludF9jb21tYW5kX3Rlc3QiCisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7Cit9CisKKyMgVGVzdCB0aGF0IHdlIGNhbiBydW4gdGhlIGluZmVyaW9yIGZyb20gYnJlYWtwb2ludCBjb21tYW5kcy4KK3Byb2MgaW5mcnVuX2JyZWFrcG9pbnRfY29tbWFuZF90ZXN0IHt9IHsKKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIG5vYXJnc10geyAKKyAgICAgICAgdmVyYm9zZSAiU2tpcHBpbmcgaW5mcnVuX2JyZWFrcG9pbnRfY29tbWFuZF90ZXN0IGJlY2F1c2Ugb2Ygbm9hcmdzLiIKKyAgICAgICAgcmV0dXJuCisgICAgfQorCisgICAgaWYgeyAhW3J1bnRvIGZhY3RvcmlhbF0gfSB0aGVuIHsgZ2RiX3N1cHByZXNzX3Rlc3RzIH0KKyAgICAjIERvbid0IGRlcGVuZCB1cG9uIGFyZ3VtZW50IHBhc3NpbmcsIHNpbmNlIG1vc3Qgc2ltdWxhdG9ycyBkb24ndCBjdXJyZW50bHkKKyAgICAjIHN1cHBvcnQgaXQuICBCYXNoIHZhbHVlIHZhcmlhYmxlIHRvIGJlIHdoYXQgd2Ugd2FudC4KKyAgICBnZGJfdGVzdCAicCB2YWx1ZT02IiAiIiAic2V0IHZhbHVlIHRvIDYgaW4gcHJvZ3Zhcl9zaW1wbGVfaWZfdGVzdCAjMSIKKyAgICBkZWxldGVfYnJlYWtwb2ludHMKKyAgICBnZGJfdGVzdCAiYnJlYWsgZmFjdG9yaWFsIGlmIHZhbHVlID09IDUiICJCcmVha3BvaW50LiphdC4qIgorCisjIGluZnJ1bl9icmVha3BvaW50X2NvbW1hbmRfdGVzdCAtIFRoaXMgdGVzdCB3YXMgYnJva2VuIGludG8gdHdvIHBhcnRzIAorIyB0byBnZXQgYXJvdW5kIGEgc3luY2hyb25pemF0aW9uIHByb2JsZW0gaW4gZXhwZWN0LgorIyBwYXJ0MTogaXNzdWUgdGhlIGdkYiBjb21tYW5kICJjb21tYW5kcyIKKyMgcGFydDI6IHNlbmQgdGhlIGxpc3Qgb2YgY29tbWFuZHMKKyAgICBzZW5kX2dkYiAiY29tbWFuZHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIkVuZCB3aXRoIiB7CisJICAgIHBhc3MgImNvbW1hbmRzIGluIGluZnJ1bl9icmVha3BvaW50X2NvbW1hbmRfdGVzdCAjMSIKKwl9CisgICAgICAgIGRlZmF1bHQgeworCSAgICBmYWlsICIodGltZW91dCBvciBlb2YpIGNvbW1hbmRzIGluIGluZnJ1bl9icmVha3BvaW50X2NvbW1hbmRfdGVzdCIKKwl9CisgICAgfQorICAgIGdkYl90ZXN0ICJzdGVwXG5zdGVwXG5zdGVwXG5zdGVwXG5idFxuZW5kIiAiIiBcCisJImNvbW1hbmRzIGluIGluZnJ1bl9icmVha3BvaW50X2NvbW1hbmRfdGVzdCAjMiIKKyAgICAKKyAgICBnZGJfdGVzdCAiY29udGludWUiICJCcmVha3BvaW50IFxbMC05XF0qLCBmYWN0b3JpYWwgXFwodmFsdWU9NVxcKS4qYXQuKgorXFswLTlcXSpcWyAJXF0qaWYgXFwodmFsdWUgPiAxXFwpIFx7LioKK1xbMC05XF0qXFsgCVxdKnZhbHVlIFxcKj0gZmFjdG9yaWFsIFxcKHZhbHVlIC0gMVxcKTsuKgorZmFjdG9yaWFsIFxcKHZhbHVlPTRcXCkgYXQuKlxbMC05XF0qXFsgCVxdKmlmIFxcKHZhbHVlID4gMVxcKSBcey4qCitcWzAtOVxdKlxbIAlcXSp2YWx1ZSBcXCo9IGZhY3RvcmlhbCBcXCh2YWx1ZSAtIDFcXCk7LioKK2ZhY3RvcmlhbCBcXCh2YWx1ZT0zXFwpIGF0IC4qCitcWzAtOVxdKlxbIAlcXSppZiBcXCh2YWx1ZSA+IDFcXCkgXHsuKgorIzAgIGZhY3RvcmlhbCBcXCh2YWx1ZT0zXFwpLioKKyMxICBcWzAtOWEtZnhcXSogaW4gZmFjdG9yaWFsIFxcKHZhbHVlPTRcXCkuKgorIzIgIFxbMC05YS1meFxdKiBpbiBmYWN0b3JpYWwgXFwodmFsdWU9NVxcKS4qCisjMyAgXFswLTlhLWZ4XF0qIGluIGZhY3RvcmlhbCBcXCh2YWx1ZT02XFwpLioKKyM0ICBcWzAtOWEtZnhcXSogaW4gbWFpbiBcXCguKlxcKS4qIiBcCisJImNvbnRpbnVlIGluIGluZnJ1bl9icmVha3BvaW50X2NvbW1hbmRfdGVzdCI7CisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7Cit9CisKK3Byb2MgYnJlYWtwb2ludF9jb21tYW5kX3Rlc3Qge30geworICAgIGlmIFt0YXJnZXRfaW5mbyBleGlzdHMgbm9hcmdzXSB7IAorICAgICAgICB2ZXJib3NlICJTa2lwcGluZyBicmVha3BvaW50X2NvbW1hbmRfdGVzdCBiZWNhdXNlIG9mIG5vYXJncy4iCisgICAgICAgIHJldHVybgorICAgIH0KKworICAgIGlmIHsgIVtydW50byBmYWN0b3JpYWxdIH0gdGhlbiB7IGdkYl9zdXBwcmVzc190ZXN0czsgfQorICAgICMgRG9uJ3QgZGVwZW5kIHVwb24gYXJndW1lbnQgcGFzc2luZywgc2luY2UgbW9zdCBzaW11bGF0b3JzIGRvbid0IGN1cnJlbnRseQorICAgICMgc3VwcG9ydCBpdC4gIEJhc2ggdmFsdWUgdmFyaWFibGUgdG8gYmUgd2hhdCB3ZSB3YW50LgorICAgIGdkYl90ZXN0ICJwIHZhbHVlPTYiICIiICJzZXQgdmFsdWUgdG8gNiBpbiBwcm9ndmFyX3NpbXBsZV9pZl90ZXN0ICMyIgorICAgIGRlbGV0ZV9icmVha3BvaW50cworICAgIGdkYl90ZXN0ICJicmVhayBmYWN0b3JpYWwiICJCcmVha3BvaW50LiphdC4qIiAiYnJlYWsgZmFjdG9yaWFsICMyIgorICAgIGdkYl90ZXN0ICJjb21tYW5kc1xucHJpbnRmIFwiTm93IHRoZSB2YWx1ZSBpcyAlZFxcblwiLCB2YWx1ZVxuZW5kIiBcCisJIlR5cGUgY29tbWFuZHMuKlxuRW5kIHdpdGguKiIgImNvbW1hbmRzIGluIGJyZWFrcG9pbnRfY29tbWFuZF90ZXN0IgorICAgIGdkYl90ZXN0ICJjb250aW51ZSIgIkJyZWFrcG9pbnQgXFswLTlcXSosIGZhY3RvcmlhbC4qTm93IHRoZSB2YWx1ZSBpcyA1IiBcCisJImNvbnRpbnVlIGluIGJyZWFrcG9pbnRfY29tbWFuZF90ZXN0IgorICAgIGdkYl90ZXN0ICJwcmludCB2YWx1ZSIgIiA9IDUiICJwcmludCB2YWx1ZSBpbiBicmVha3BvaW50X2NvbW1hbmRfdGVzdCIKKyAgICBnZGJfc3RvcF9zdXBwcmVzc2luZ190ZXN0czsKK30KKworIyBUZXN0IGEgc2ltcGxlIHVzZXIgZGVmaW5lZCBjb21tYW5kICh3aXRoIGFyZ3VtZW50cykKK3Byb2MgdXNlcl9kZWZpbmVkX2NvbW1hbmRfdGVzdCB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIGdkYl90ZXN0ICJzZXQgXCRmb28gPSA0IiAiIiAic2V0IGZvbyBpbiB1c2VyX2RlZmluZWRfY29tbWFuZF90ZXN0IgorCisgICAgc2VuZF9nZGIgImRlZmluZSBteWNvbW1hbmRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIkVuZCB3aXRoIiAgeworCSAgICBwYXNzICJkZWZpbmUgbXljb21tYW5kIGluIHVzZXJfZGVmaW5lZF9jb21tYW5kX3Rlc3QiCisJfQorICAgICAgICBkZWZhdWx0IHsKKwkgICAgZmFpbCAiKHRpbWVvdXQgb3IgZW9mKSBkZWZpbmUgbXljb21tYW5kIGluIHVzZXJfZGVmaW5lZF9jb21tYW5kX3Rlc3QiCisJfQorICAgIH0KKyAgICAjIFRoaXMgdGVzdCBzaG91bGQgYWx0ZXJuYXRlIGJldHdlZW4gMHhkZWFkYmVlZiBhbmQgMHhmZWVkZmFjZSB0d28gdGltZXMuCisgICAgZ2RiX3Rlc3QgIndoaWxlIFwkYXJnMCA+IDBcbnNldCBcJGFyZzAgLT0gMVxuaWYgXChcJGFyZzAgJSAyXCkgPT0gMVxucC94IDB4ZGVhZGJlZWZcbmVsc2VcbnAveCAweGZlZWRmYWNlXG5lbmRcbmVuZFxuZW5kIiAiIiAiZW50ZXIgY29tbWFuZHMgaW4gdXNlcl9kZWZpbmVkX2NvbW1hbmRfdGVzdCIKKworICAgIGdkYl90ZXN0ICJteWNvbW1hbmQgXCRmb28iICJcXFwkXFswLTlcXSogPSAweGRlYWRiZWVmXFteXG5cXSpcblxcXCRcWzAtOVxdKiA9IDB4ZmVlZGZhY2VcW15cblxdKlxuXFxcJFxbMC05XF0qID0gMHhkZWFkYmVlZlxbXlxuXF0qXG5cXFwkXFswLTlcXSogPSAweGZlZWRmYWNlIiAiZXhlY3V0ZSB1c2VyIGRlZmluZWQgY29tbWFuZCBpbiB1c2VyX2RlZmluZWRfY29tbWFuZF90ZXN0IgorICAgZ2RiX3Rlc3QgInNob3cgdXNlciBteWNvbW1hbmQiICJ3aGlsZS4qc2V0LippZi4qcC94LiplbHNlLipwL3guKmVuZC4qIiAiZGlzcGxheSB1c2VyIGNvbW1hbmQgaW4gdXNlcl9kZWZpbmVkX2NvbW1hbmRfdGVzdCIKK30KKworZ2RidmFyX3NpbXBsZV9pZl90ZXN0CitnZGJ2YXJfc2ltcGxlX3doaWxlX3Rlc3QKK2dkYnZhcl9jb21wbGV4X2lmX3doaWxlX3Rlc3QKK3Byb2d2YXJfc2ltcGxlX2lmX3Rlc3QKK3Byb2d2YXJfc2ltcGxlX3doaWxlX3Rlc3QKK3Byb2d2YXJfY29tcGxleF9pZl93aGlsZV90ZXN0CitpZl93aGlsZV9icmVha3BvaW50X2NvbW1hbmRfdGVzdAoraW5mcnVuX2JyZWFrcG9pbnRfY29tbWFuZF90ZXN0CiticmVha3BvaW50X2NvbW1hbmRfdGVzdAordXNlcl9kZWZpbmVkX2NvbW1hbmRfdGVzdApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jb21waWxlci5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jb21waWxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYjBkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NvbXBpbGVyLmMKQEAgLTAsMCArMSwzMSBAQAorLyogT2Z0ZW4gdGhlIGJlaGF2aW9yIG9mIGFueSBwYXJ0aWN1bGFyIHRlc3QgZGVwZW5kcyB1cG9uIHdoYXQgY29tcGlsZXIgd2FzCisgICB1c2VkIHRvIGNvbXBpbGUgdGhlIHRlc3QuICBBcyBlYWNoIHRlc3QgaXMgY29tcGlsZWQsIHRoaXMgZmlsZSBpcworICAgcHJlcHJvY2Vzc2VkIGJ5IHRoZSBzYW1lIGNvbXBpbGVyIHVzZWQgdG8gY29tcGlsZSB0aGF0IHNwZWNpZmljIHRlc3QKKyAgIChkaWZmZXJlbnQgdGVzdHMgbWlnaHQgYmUgY29tcGlsZWQgYnkgZGlmZmVyZW50IGNvbXBpbGVycywgcGFydGljdWxhcmx5CisgICBpZiBjb21waWxlZCBhdCBkaWZmZXJlbnQgdGltZXMpLCBhbmQgdXNlZCB0byBnZW5lcmF0ZSBhICouY2kgKGNvbXBpbGVyCisgICBpbmZvKSBmaWxlIGZvciB0aGF0IHRlc3QuCisKKyAgIEkuRS4sIHdoZW4gY2FsbGZ1bmNzIGlzIGNvbXBpbGVkLCBhIGNhbGxmdW5jcy5jaSBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkLAorICAgd2hpY2ggY2FuIHRoZW4gYmUgc291cmNlZCBieSBjYWxsZnVuY3MuZXhwIHRvIGdpdmUgY2FsbGZ1bmNzLmV4cCBhY2Nlc3MKKyAgIHRvIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudC4KKworICAgVE9ETzogIEl0IG1pZ2h0IGJlIGEgZ29vZCBpZGVhIHRvIGFkZCBleHBlY3QgY29kZSB0aGF0IHRlc3RzIGVhY2gKKyAgIGRlZmluaXRpb24gbWFkZSB3aXRoICdzZXQiIHRvIHNlZSBpZiBvbmUgYWxyZWFkeSBleGlzdHMsIGFuZCBpZiBzbworICAgd2FybiBhYm91dCBjb25mbGljdHMgaWYgaXQgaXMgYmVpbmcgc2V0IHRvIHNvbWV0aGluZyBlbHNlLiAgKi8KKworLyogVGhpcyBuZWVkcyB0byBiZSBrZXB0IGluIHN5bmMgd2l0aCB3aGF0aXMuYyBhbmQgZ2RiLmV4cChnZXRfY29tcGlsZXJfaW5mbykuCisgICBJZiB0aGlzIGVuZHMgdXAgYmVpbmcgaGFpcnksIHdlIGNvdWxkIHVzZSBhIGNvbW1vbiBoZWFkZXIgZmlsZS4gICovCisKKyNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX0FJWCkKK3NldCBzaWduZWRfa2V5d29yZF9ub3RfdXNlZCAwCisjZWxzZQorc2V0IHNpZ25lZF9rZXl3b3JkX25vdF91c2VkIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTlVDX18pCitzZXQgZ2NjX2NvbXBpbGVkIF9fR05VQ19fCisjZWxzZQorc2V0IGdjY19jb21waWxlZCAwCisjZW5kaWYKKworcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY29tcGxldGlvbi5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NvbXBsZXRpb24uZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDk3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NvbXBsZXRpb24uZXhwCkBAIC0wLDAgKzEsNTY4IEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRWxlbmEgWmFubm9uaSAoZXphbm5vbmlAY3lnbnVzLmNvbSkKKworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZ2RiIHRlc3RzdWl0ZS4KKworIworIyB0ZXN0cyBmb3IgY29tbWFuZCBjb21wbGV0aW9uCisjCisjIEhlcmUgYXJlIHNvbWUgdXNlZnVsIHRlc3QgY2FzZXMgZm9yIGNvbXBsZXRpb24uICAKKyMgVGhleSBzaG91bGQgYmUgdGVzdGVkIHdpdGggYm90aCBNLT8gYW5kIFRBQi4KKyMKKyMgICAic2hvdyBvdXRwdXQtIiAicmFkaXgiCisjICAgInNob3cgb3V0cHV0IiAiLXJhZGl4IgorIyAgICJwIiBhbWJpZ3VvdXMgKGNvbW1hbmRzIHN0YXJ0aW5nIHdpdGggcC0tcGF0aCwgcHJpbnQsIHByaW50ZiwgZXRjLikKKyMgICAicCAiICBhbWJpZ3VvdXMgKGFsbCBzeW1ib2xzKQorIyAgICJpbmZvIHQgZm9vIiBubyBjb21wbGV0aW9ucworIyAgICJpbmZvIHQgIiBubyBjb21wbGV0aW9ucworIyAgICJpbmZvIHQiIGFtYmlndW91cyAoImluZm8gdGFyZ2V0IiwgImluZm8gdGVybWluYWwiLCBldGMuKQorIyAgICJpbmZvIGFqa3NkbGZrIiBubyBjb21wbGV0aW9ucworIyAgICJpbmZvIGFqa3NkbGZrICIgbm8gY29tcGxldGlvbnMKKyMgICAiaW5mbyIgIiAiCisjICAgImluZm8gIiBhbWJpZ3VvdXMgKGFsbCBpbmZvIGNvbW1hbmRzKQorIyAgICJwIFwiYSIgbm8gY29tcGxldGlvbnMgKHN0cmluZyBjb25zdGFudCkKKyMgICAicCAnYSIgYW1iaWd1b3VzIChhbGwgc3ltYm9scyBzdGFydGluZyB3aXRoIGEpCisjICAgInAgYi1hIiBhbWJpZ3VvdXMgKGFsbCBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggYSkKKyMgICAicCBiLSIgYW1iaWd1b3VzIChhbGwgc3ltYm9scykKKyMgICAiZmlsZSBNYWtlIiAiZmlsZSIgKHdvcmQgYnJlYWsgaGFyZCB0byBzY3JldyB1cCBoZXJlKQorIyAgICJmaWxlIC4uL2dkYi5zdGFicy93ZSIgImlyZCIgKG5lZWRzIHRvIG5vdCBicmVhayB3b3JkIGF0IHNsYXNoKQorIworCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgICAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKKyAgICAgICAgfQorCisKKyNza2lwIGFsbCB0aGVzZSB0ZXN0cyBmb3Igbm93IChGSVhNRSkKKworY29udGludWUKKworZ2xvYmFsIHVzZXN0dWJzCisKKyMKKyMgdGVzdCBydW5uaW5nIHByb2dyYW1zCisjCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJicmVhayIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYWRkaXRpb25hbF9mbGFncz0td31dICE9ICIiIH0geworICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgICAgICAgcGVycm9yICJ0ZXN0cyBzdXBwcmVzc2VkIgorfQorCitzZXQgb2xkdGltZW91dDEgJHRpbWVvdXQKK3NldCB0aW1lb3V0IFtleHByICR0aW1lb3V0ICsgNTAwXQorCisKK3NlbmRfZ2RiICJoZmdmaFx0Igorc2xlZXAgMQorZ2RiX2V4cGVjdCAgeworICAgICAgICAtcmUgIl5oZmdmaFxcXHgwNyQiXAorICAgICAgICAgICAgeyBzZW5kX2dkYiAiXG4iCisgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgIC1yZSAiVW5kZWZpbmVkIGNvbW1hbmQ6IFwiaGZnZmhcIlxcLiAgVHJ5IFwiaGVscFwiXFwuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgImNvbXBsZXRlICdoZmdmaCcifQorICAgICAgICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbXBsZXRlICdoZmdmaCcifQorICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHtmYWlsICIodGltZW91dCkgY29tcGxldGUgJ2hmZ2ZoJyJ9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgImNvbXBsZXRlICdoZmdmaCciIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICdoZmdmaCciIH0KKyAgICAgICAgfQorCisjZXhwX2ludGVybmFsIDAKKworc2VuZF9nZGIgInNob3cgb3V0cHV0XHQiCitzbGVlcCAxCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiXnNob3cgb3V0cHV0LXJhZGl4ICQiXAorICAgICAgICAgICAgeyBzZW5kX2dkYiAiXG4iCisgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgIC1yZSAiRGVmYXVsdCBvdXRwdXQgcmFkaXggZm9yIHByaW50aW5nIG9mIHZhbHVlcyBpcyAxMFxcLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJjb21wbGV0ZSAnc2hvdyBvdXRwdXQnIn0KKyAgICAgICAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb21wbGV0ZSAnc2hvdyBvdXRwdXQnIn0KKyAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICdzaG93IG91dHB1dCcifQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAtcmUgIl5zaG93IG91dHB1dCQiXAorICAgICAgICAgICAgeyBzZW5kX2dkYiAiXG4iCisgICAgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAtcmUgIkRlZmF1bHQgb3V0cHV0IHJhZGl4IGZvciBwcmludGluZyBvZiB2YWx1ZXMgaXMgMTBcXC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiY29tcGxldGUgJ3Nob3cgb3V0cHV0JyJ9CisgICAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29tcGxldGUgJ3Nob3cgb3V0cHV0JyJ9CisgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY29tcGxldGUgJ3Nob3cgb3V0cHV0JyJ9CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICB9CisKKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgZmFpbCAiY29tcGxldGUgJ3Nob3cgb3V0cHV0JyIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY29tcGxldGUgJ3Nob3cgb3V0cHV0JyIgfQorICAgICAgICB9CisKKworc2VuZF9nZGIgInNob3cgb3V0cHV0LVx0Igorc2xlZXAgMQorZ2RiX2V4cGVjdCAgeworICAgICAgICAtcmUgIl5zaG93IG91dHB1dC1yYWRpeCAkIlwKKyAgICAgICAgICAgIHsgc2VuZF9nZGIgIlxuIgorICAgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAtcmUgIkRlZmF1bHQgb3V0cHV0IHJhZGl4IGZvciBwcmludGluZyBvZiB2YWx1ZXMgaXMgMTBcXC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAiY29tcGxldGUgJ3Nob3cgb3V0cHV0LScifQorICAgICAgICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbXBsZXRlICdzaG93IG91dHB1dC0nIn0KKyAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICdzaG93IG91dHB1dC0nIn0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgLXJlICJec2hvdyBvdXRwdXQtJCJcCisgICAgICAgICAgICB7IHNlbmRfZ2RiICJcbiIKKyAgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgIC1yZSAiRGVmYXVsdCBvdXRwdXQgcmFkaXggZm9yIHByaW50aW5nIG9mIHZhbHVlcyBpcyAxMFxcLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJjb21wbGV0ZSAnc2hvdyBvdXRwdXQtJyJ9CisgICAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29tcGxldGUgJ3Nob3cgb3V0cHV0LScifQorICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICdzaG93IG91dHB1dC0nIn0KKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIH0KKworICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJjb21wbGV0ZSAnc2hvdyBvdXRwdXQtJyIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY29tcGxldGUgJ3Nob3cgb3V0cHV0LSciIH0KKyAgICAgICAgfQorCitzZW5kX2dkYiAicFx0Igorc2xlZXAgMQorZ2RiX2V4cGVjdCAgeworICAgICAgICAtcmUgIl5wXFxceDA3JCJcCisgICAgICAgICAgICB7IHNlbmRfZ2RiICJcbiIKKyAgICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgLXJlICJUaGUgaGlzdG9yeSBpcyBlbXB0eVxcLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJjb21wbGV0ZSAncCcifQorICAgICAgICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbXBsZXRlICdwJyJ9CisgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAncCcifQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJjb21wbGV0ZSAncCciIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICdwJyIgfQorICAgICAgICB9CisKK3NlbmRfZ2RiICJwIFx0Igorc2xlZXAgMQorZ2RiX2V4cGVjdCAgeworICAgICAgICAtcmUgIl5wIFxcXHgwNyQiXAorICAgICAgICAgICAgeyBzZW5kX2dkYiAiXG4iCisgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgIC1yZSAiVGhlIGhpc3RvcnkgaXMgZW1wdHlcXC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAiY29tcGxldGUgJ3AgJyJ9CisgICAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29tcGxldGUgJ3AgJyJ9CisgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAncCAnIn0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgZmFpbCAiY29tcGxldGUgJ3AgJyIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY29tcGxldGUgJ3AgJyIgfQorICAgICAgICB9CisKKworc2VuZF9nZGIgImluZm8gdCBmb29cdCIKK3NsZWVwIDEKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJeaW5mbyB0IGZvb1xcXHgwNyQiXAorICAgICAgICAgICAgeyBzZW5kX2dkYiAiXG4iCisgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgIC1yZSAiQW1iaWd1b3VzIGluZm8gY29tbWFuZCBcInQgZm9vXCI6IHRhcmdldCwgdGVybWluYWwsIHRocmVhZHMsIHRwLCB0cmFjZXBvaW50cywgdHlwZXNcXC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAiY29tcGxldGUgJ2luZm8gdCBmb28nIn0KKyAgICAgICAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb21wbGV0ZSAnaW5mbyB0IGZvbycifQorICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHtmYWlsICIodGltZW91dCkgY29tcGxldGUgJ2luZm8gdCBmb28nIn0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgZmFpbCAiY29tcGxldGUgJ2luZm8gdCBmb28nIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAnaW5mbyB0IGZvbyciIH0KKyAgICAgICAgfQorCitzZW5kX2dkYiAiaW5mbyB0XHQiCitzbGVlcCAxCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiXmluZm8gdFxcXHgwNyQiXAorICAgICAgICAgICAgeyBzZW5kX2dkYiAiXG4iCisgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgIC1yZSAiQW1iaWd1b3VzIGluZm8gY29tbWFuZCBcInRcIjogdGFyZ2V0LCB0ZXJtaW5hbCwgdGhyZWFkcywgdHAsIHRyYWNlcG9pbnRzLCB0eXBlc1xcLi4KKyokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgImNvbXBsZXRlICdpbmZvIHQnIn0KKyAgICAgICAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb21wbGV0ZSAnaW5mbyB0JyJ9CisgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAnaW5mbyB0JyJ9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgImNvbXBsZXRlICdpbmZvIHQnIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAnaW5mbyB0JyIgfQorICAgICAgICB9CisKKworc2VuZF9nZGIgImluZm8gdCBcdCIKK3NsZWVwIDEKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJeaW5mbyB0IFxcXHgwNyQiXAorICAgICAgICAgICAgeyBzZW5kX2dkYiAiXG4iCisgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgIC1yZSAiQW1iaWd1b3VzIGluZm8gY29tbWFuZCBcInQgXCI6IHRhcmdldCwgdGVybWluYWwsIHRocmVhZHMsIHRwLCB0cmFjZXBvaW50cywgdHlwZXNcXC4uCisqJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJjb21wbGV0ZSAnaW5mbyB0ICcifQorICAgICAgICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbXBsZXRlICdpbmZvIHQgJyJ9CisgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAnaW5mbyB0ICcifQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJjb21wbGV0ZSAnaW5mbyB0ICciIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICdpbmZvIHQgJyIgfQorICAgICAgICB9CisKKworc2VuZF9nZGIgImluZm8gYXNkZmdoXHQiCitzbGVlcCAxCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiXmluZm8gYXNkZmdoXFxceDA3JCJcCisgICAgICAgICAgICB7IHNlbmRfZ2RiICJcbiIKKyAgICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgLXJlICJVbmRlZmluZWQgaW5mbyBjb21tYW5kOiBcImFzZGZnaFwiLiAgVHJ5IFwiaGVscCBpbmZvXCJcXC4uCisqJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJjb21wbGV0ZSAnaW5mbyBhc2RmZ2gnIn0KKyAgICAgICAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb21wbGV0ZSAnaW5mbyBhc2RmZ2gnIn0KKyAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICdpbmZvIGFzZGZnaCcifQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJjb21wbGV0ZSAnaW5mbyBhc2RmZ2gnIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAnaW5mbyBhc2RmZ2gnIiB9CisgICAgICAgIH0KKworCitzZW5kX2dkYiAiaW5mbyBhc2RmZ2ggXHQiCitzbGVlcCAxCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiXmluZm8gYXNkZmdoIFxcXHgwNyQiXAorICAgICAgICAgICAgeyBzZW5kX2dkYiAiXG4iCisgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgIC1yZSAiVW5kZWZpbmVkIGluZm8gY29tbWFuZDogXCJhc2RmZ2ggXCIuICBUcnkgXCJoZWxwIGluZm9cIlxcLi4KKyokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgImNvbXBsZXRlICdpbmZvIGFzZGZnaCAnIn0KKyAgICAgICAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb21wbGV0ZSAnaW5mbyBhc2RmZ2ggJyJ9CisgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAnaW5mbyBhc2RmZ2ggJyJ9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgImNvbXBsZXRlICdpbmZvIGFzZGZnaCAnIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAnaW5mbyBhc2RmZ2ggJyIgfQorICAgICAgICB9CisKK3NlbmRfZ2RiICJpbmZvXHQiCitzbGVlcCAxCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiXmluZm8gJCJcCisgICAgICAgICAgICB7IHNlbmRfZ2RiICJcbiIKKyAgICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgLXJlICJcImluZm9cIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIGFuIGluZm8gY29tbWFuZFxcLlxyXG5MaXN0IG9mIGluZm8gc3ViY29tbWFuZHM6XHJcblxyXG5pbmZvIGFkZHJlc3MuKmluZm8gd2F0Y2hwb2ludHMuKlxyXG5cclxuVHlwZSBcImhlbHAgaW5mb1wiIGZvbGxvd2VkIGJ5IGluZm8gc3ViY29tbWFuZCBuYW1lIGZvciBmdWxsIGRvY3VtZW50YXRpb24uXHJcbkNvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzXFwuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgImNvbXBsZXRlICdpbmZvJyJ9CisgICAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29tcGxldGUgJ2luZm8nIn0KKyAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICdpbmZvJyJ9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgImNvbXBsZXRlICdpbmZvJyIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY29tcGxldGUgJ2luZm8nIiB9CisgICAgICAgIH0KKworc2VuZF9nZGIgImluZm8gXHQiCitzbGVlcCAxCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiXmluZm8gXFxceDA3JCJcCisgICAgICAgICAgICB7IHNlbmRfZ2RiICJcbiIKKyAgICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgLXJlICJcImluZm9cIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIGFuIGluZm8gY29tbWFuZFxcLlxyXG5MaXN0IG9mIGluZm8gc3ViY29tbWFuZHM6XHJcblxyXG5pbmZvIGFkZHJlc3MuKlR5cGUgXCJoZWxwIGluZm9cIiBmb2xsb3dlZCBieSBpbmZvIHN1YmNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLlxyXG5Db21tYW5kIG5hbWUgYWJicmV2aWF0aW9ucyBhcmUgYWxsb3dlZCBpZiB1bmFtYmlndW91c1xcLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJjb21wbGV0ZSAnaW5mbyAnIn0KKyAgICAgICAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb21wbGV0ZSAnaW5mbyAnIn0KKyAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICdpbmZvICcifQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJjb21wbGV0ZSAnaW5mbyAnIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAnaW5mbyAnIiB9CisgICAgICAgIH0KKworCitzZW5kX2dkYiAiaW5mbyBcdCIKK3NsZWVwIDEKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJeaW5mbyBcMHg3JCJcCisgICAgICAgICAgICB7IHNlbmRfZ2RiICJcdCIKKyAgICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgLXJlICJhZGRyZXNzLip0eXBlcy4qJGdkYl9wcm9tcHQgaW5mbyAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeyBzZW5kX2dkYiAiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJlICJcImluZm9cIi4qdW5hbWJpZ3VvdXNcXC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAiY29tcGxldGUgKDIpICdpbmZvICcifQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbXBsZXRlICgyKSAnaW5mbyAnIn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICgyKSAnaW5mbyAnIn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb21wbGV0ZSAoMikgJ2luZm8gJyJ9CisgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAoMikgJ2luZm8gJyJ9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgImNvbXBsZXRlICgyKSAnaW5mbyAnIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAoMikgJ2luZm8gJyIgfQorICAgICAgICB9CisKKworc2VuZF9nZGIgInAgXCJhXHQiCitzbGVlcCAxCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiXnAgXCJhXFxceDA3JCJcCisgICAgICAgICAgICB7IHNlbmRfZ2RiICJcbiIKKyAgICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgLXJlICJVbnRlcm1pbmF0ZWQgc3RyaW5nIGluIGV4cHJlc3Npb25cXC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAiY29tcGxldGUgJ3AgYScifQorICAgICAgICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbXBsZXRlICdwIGEnIn0KKyAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICdwIGEnIn0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgZmFpbCAiY29tcGxldGUgJ3AgXCJhJyIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY29tcGxldGUgJ3AgXCJhJyIgfQorICAgICAgICB9CisKK3NlbmRfZ2RiICJwICdhXHQiCitzbGVlcCAxCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiXnAgJ2FcXFx4MDckIlwKKyAgICAgICAgICAgIHsgc2VuZF9nZGIgIlxuIgorICAgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAtcmUgIkludmFsaWQgY2hhcmFjdGVyIGNvbnN0YW50XFwuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgImNvbXBsZXRlICdwIFwnYScifQorICAgICAgICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbXBsZXRlICdwIFwnYScifQorICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHtmYWlsICIodGltZW91dCkgY29tcGxldGUgJ3AgXCdhJyJ9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgImNvbXBsZXRlICdwIFwnYSciIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICdwIFwnYSciIH0KKyAgICAgICAgfQorCitzZW5kX2dkYiAicCAnYVx0Igorc2xlZXAgMQorZ2RiX2V4cGVjdCAgeworICAgICAgICAtcmUgIl5wICdhXFxceDA3JCJcCisgICAgICAgICAgICB7IHNlbmRfZ2RiICJcdCIKKyAgICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgLXJlICJhNjRsLiphdG9sLiokZ2RiX3Byb21wdCBwIC5hJCJcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsgc2VuZF9nZGIgIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yZSAiSW52YWxpZCBjaGFyYWN0ZXIgY29uc3RhbnRcXC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAiY29tcGxldGUgKDIpICdwIFwnYScifQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbXBsZXRlICgyKSAncCBcJ2EnIn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICgyKSAncCBcJ2EnIn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29tcGxldGUgKDIpICdwIFwnYScifQorICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHtmYWlsICIodGltZW91dCkgY29tcGxldGUgKDIpICdwIFwnYScifQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJjb21wbGV0ZSAoMikgJ3AgXCdhJyIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY29tcGxldGUgKDIpICdwIFwnYSciIH0KKyAgICAgICAgfQorCisKK3NlbmRfZ2RiICJwIGItYVx0Igorc2xlZXAgMQorZ2RiX2V4cGVjdCAgeworICAgICAgICAtcmUgIl5wIGItYVxcXHgwNyQiXAorICAgICAgICAgICAgeyBzZW5kX2dkYiAiXG4iCisgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgIC1yZSAiTm8gc3ltYm9sIFwiYlwiIGluIGN1cnJlbnQgY29udGV4dFxcLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJjb21wbGV0ZSAncCBiLWEnIn0KKyAgICAgICAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb21wbGV0ZSAncCBiLWEnIn0KKyAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICdwIGItYScifQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJjb21wbGV0ZSAncCBiLWEnIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAncCBiLWEnIiB9CisgICAgICAgIH0KKworc2VuZF9nZGIgInAgYi1hXHQiCitzbGVlcCAxCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiXnAgYi1hXFxceDA3JCJcCisgICAgICAgICAgICB7IHNlbmRfZ2RiICJcdCIKKyAgICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgLXJlICJhNjRsLiphdG9sLiokZ2RiX3Byb21wdCBwIGItYSQiXAorICAgICAgICAgICAgICAgICAgICAgICAgICB7IHNlbmRfZ2RiICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtcmUgIk5vIHN5bWJvbCBcImJcIiBpbiBjdXJyZW50IGNvbnRleHRcXC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAiY29tcGxldGUgKDIpICdwIGItYScifQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbXBsZXRlICgyKSAncCBiLWEnIn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICgyKSAncCBiLWEnIn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29tcGxldGUgKDIpICdwIGItYScifQorICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHtmYWlsICIodGltZW91dCkgY29tcGxldGUgKDIpICdwIGItYScifQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJjb21wbGV0ZSAoMikgJ3AgYi1hJyIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY29tcGxldGUgKDIpICdwIGItYSciIH0KKyAgICAgICAgfQorCisKK3NlbmRfZ2RiICJwIGItXHQiCitzbGVlcCAxCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiXnAgYi1cXFx4MDckIlwKKyAgICAgICAgICAgIHsgc2VuZF9nZGIgIlx0IgorICAgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAtcmUgIlRoZXJlIGFyZSAkZGVjaW1hbCBwb3NzaWJpbGl0aWVzXFwuICBEbyB5b3UgcmVhbGx5XHJcbndpc2ggdG8gc2VlIHRoZW0gYWxsLiBcXCh5IG9yIG5cXCkkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeyBzZW5kX2dkYiAibiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtcmUgIlxcKGdkYlxcKSBwIGItJCJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgc2VuZF9nZGIgIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJlICJObyBzeW1ib2wgXCJiXCIgaW4gY3VycmVudCBjb250ZXh0XFwuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgImNvbXBsZXRlICgyKSAncCBiLScifQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29tcGxldGUgKDIpICdwIGItJyJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICgyKSAncCBiLScifQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29tcGxldGUgKDIpICdwIGItJyJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAoMikgJ3AgYi0nIn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29tcGxldGUgKDIpICdwIGItJyJ9CisgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAoMikgJ3AgYi0nIn0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgZmFpbCAiY29tcGxldGUgKDIpICdwIGItJyIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY29tcGxldGUgKDIpICdwIGItJyIgfQorICAgICAgICB9CisKK3NlbmRfZ2RiICJmaWxlICR7b2JqZGlyfS9NYWtlXHQiCitzbGVlcCAxCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiZmlsZSAke29iamRpcn0vTWFrZWZpbGUuKiQiXAorICAgICAgICAgICAgeyBzZW5kX2dkYiAiXG4iCisgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgIC1yZSAiXHJcbkEgcHJvZ3JhbSBpcyBiZWluZyBkZWJ1Z2dlZCBhbHJlYWR5XFwuICBLaWxsIGl0XFw/IFxcKHkgb3IgblxcKSAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7IHNlbmRfZ2RiICJuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJlICJcclxuUHJvZ3JhbSBub3Qga2lsbGVkXFwuXHJcbiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAiY29tcGxldGUgJ2ZpbGUgTWFrZScifQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb21wbGV0ZSAnZmlsZSBNYWtlJyJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHtmYWlsICIodGltZW91dCkgY29tcGxldGUgJ2ZpbGUgTWFrZScifQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29tcGxldGUgJ2ZpbGUgTWFrZScifQorICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHtmYWlsICIodGltZW91dCkgY29tcGxldGUgJ2ZpbGUgTWFrZScifQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJjb21wbGV0ZSAnZmlsZSBNYWtlJyIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY29tcGxldGUgJ2ZpbGUgTWFrZSciIH0KKyAgICAgICAgfQorCisKK3NlbmRfZ2RiICJmaWxlICR7c3JjZGlyfS9nZGIuYmFzZS9hMVx0Igorc2xlZXAgMQorZ2RiX2V4cGVjdCAgeworICAgICAgICAtcmUgIl5maWxlICR7c3JjZGlyfS9nZGIuYmFzZS8uKidhMS4qLXNlbGZ0ZXN0XFwuZXhwJyAkIlwKKyAgICAgICAgICAgIHsgc2VuZF9nZGIgIlxuIgorICAgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAtcmUgIlxyXG5BIHByb2dyYW0gaXMgYmVpbmcgZGVidWdnZWQgYWxyZWFkeVxcLiAgS2lsbCBpdFxcPyBcXCh5IG9yIG5cXCkgJCIKK1wKKyAgICAgICAgICAgICAgICAgICAgICB7IHNlbmRfZ2RiICJuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJlICJcclxuUHJvZ3JhbSBub3Qga2lsbGVkXFwuXHJcbiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAiY29tcGxldGUgJ2ZpbGUgZ2RiLmJhc2UvYTEnIn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29tcGxldGUgJ2ZpbGUgZ2RiLmJhc2UvYTEnIn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAnZmlsZSBnZGIuYmFzZS9hMScifQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29tcGxldGUgJ2ZpbGUgZ2RiLmJhc2UvYTEnIn0KKyAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICdmaWxlIGdkYi5iYXNlL2ExJyJ9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgImNvbXBsZXRlICdmaWxlIGdkYi5iYXNlL2ExJyIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY29tcGxldGUgJ2ZpbGUgZ2RiLmJhc2UvYTEnIiB9CisgICAgICAgIH0KKworCitzZW5kX2dkYiAiaW5mbyBmdW5jIG1hcmtcdCIKK3NsZWVwIDEKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJeaW5mbyBmdW5jIG1hcmsuKmVyJCJcCisgICAgICAgICAgICB7IHNlbmRfZ2RiICJcdFx0IgorICAgICAgICAgICAgICBzbGVlcCAzCisgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgIC1yZSAibWFya2VyMSAgbWFya2VyMiAgbWFya2VyMyAgbWFya2VyNC4qJGdkYl9wcm9tcHQgaW5mbyBmdW5jIG1hcmtlciQiXAorICAgICAgICAgICAgICAgICAgICAgIHsgc2VuZF9nZGIgIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yZSAiQWxsIGZ1bmN0aW9ucyBtYXRjaGluZyByZWd1bGFyIGV4cHJlc3Npb24gXCJtYXJrZXJcIjpcclxuXHJcbkZpbGUuKmJyZWFrLmM6XHJcbmludCBtYXJrZXIxXFwoXFwpO1xyXG5pbnQgbWFya2VyMlxcKGludFxcKS4qbWFya2VyM1xcKGNoYXIuKmNoYXIuKlxcKTtcclxuJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAiY29tcGxldGUgJ2luZm8gZnVuYyBtYXInIn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29tcGxldGUgJ2luZm8gZnVuYyBtYXInIn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAnaW5mbyBmdW5jIG1hcicifQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29tcGxldGUgJ2luZm8gZnVuYyBtYXInIn0KKyAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICdpbmZvIGZ1bmMgbWFyJyJ9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgImNvbXBsZXRlICdpbmZvIGZ1bmMgbWFyJyIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY29tcGxldGUgJ2luZm8gZnVuYyBtYXInIiB9CisgICAgICAgIH0KKworCitzZW5kX2dkYiAic2V0IGZvbGxvdy1mb3JrLW1vZGUgXHRcdCIKK3NsZWVwIDEKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJhc2suKmNoaWxkLipwYXJlbnQuKiRnZGJfcHJvbXB0IHNldCBmb2xsb3ctZm9yay1tb2RlICQiXAorICAgICAgICAgICAgeyBzZW5kX2dkYiAiXG4iCisgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgIC1yZSAiQW1iaWd1b3VzIGl0ZW0gXCJcIlxcLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJjb21wbGV0ZSAnc2V0IGZvbGxvdy1mb3JrLW1vZGUnIn0KKyAgICAgICAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb21wbGV0ZSAnc2V0IGZvbGxvdy1mb3JrLW1vZGUnIn0KKyAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGNvbXBsZXRlICdzZXQgZm9sbG93LWZvcmstbW9kZScifQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJjb21wbGV0ZSAnc2V0IGZvbGxvdy1mb3JrLW1vZGUnIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBjb21wbGV0ZSAnc2V0IGZvbGxvdy1mb3JrLW1vZGUnIiB9CisgICAgICAgIH0KKworc2V0IHRpbWVvdXQgJG9sZHRpbWVvdXQxCityZXR1cm4gMAorCisKKworCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY29uZC1leHByLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY29uZC1leHByLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTc4YjQyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jb25kLWV4cHIuZXhwCkBAIC0wLDAgKzEsMTIyIEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRWxlbmEgWmFubm9uaSAoZXphbm5vbmlAY3lnbnVzLmNvbSkKKworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZ2RiIHRlc3RzdWl0ZQorCisjCisjIHRlc3Qgb2YgZXZhbHVhdGlvbiBvZiBjb25kaXRpb25hbCBleHByZXNzaW9ucywgd2l0aCBjb25zdGFudHMgYW5kIAorIyB2YXJpYWJsZXMuIFVzaW5nIHRoZSBwcmludCBhbmQgdGhlIHdoYXRpcyBjb21tYW5kCisjIHdyaXR0ZW4gd2l0aCB0aGUgb25seSBwdXJwb3NlIGluIG1pbmQgdG8gY292ZXIgdGhlIGhvbGVzIGluIHRoZQorIyBldmFsLmMgZmlsZQorIworIyBzb3VyY2UgZmlsZSAiaW50LXR5cGUuYyIKKyMKKworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW4gZXhlY3V0YWJsZSB0byB0ZXN0LiAgSWYgbm90LCB0aGVuIGVpdGhlciB3ZQorIyBoYXZlbid0IHRyaWVkIHRvIGNvbXBpbGUgb25lLCBvciB0aGUgY29tcGlsYXRpb24gZmFpbGVkIGZvciBzb21lIHJlYXNvbi4KKyMgSW4gZWl0aGVyIGNhc2UsIGp1c3Qgbm90aWZ5IHRoZSB1c2VyIGFuZCBza2lwIHRoZSB0ZXN0cyBpbiB0aGlzIGZpbGUuCisKK3NldCB0ZXN0ZmlsZSAiaW50LXR5cGUiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIGFkZGl0aW9uYWxfZmxhZ3M9LXd9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCisgICAgfQorCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgcGVycm9yICJjb3VsZG4ndCBydW4gdG8gYnJlYWtwb2ludCIKKyAgICBjb250aW51ZQorfQorCitzZW5kX2dkYiAicHJpbnQgKDIgPyAzIDogNClcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBjb25kIGV4cHIgKGNvbnN0IHRydWUpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIGNvbmQgZXhwciAoY29uc3QgdHJ1ZSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBjb25kIGV4cHIgKGNvbnN0IHRydWUpIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50ICgwID8gMyA6IDQpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgY29uZCBleHByIChjb25zdCBmYWxzZSkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgY29uZCBleHByIChjb25zdCBmYWxzZSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBjb25kIGV4cHIgKGNvbnN0IGZhbHNlKSIgfQorICB9CisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeD0xNCIgIiIgInNldCB2YXJpYWJsZSB4PTE0IgorZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB5PTIiICIiICJzZXQgdmFyaWFibGUgeT0yIgorZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB6PTMiICIiICJzZXQgdmFyaWFibGUgej0zIgorCitzZW5kX2dkYiAicHJpbnQgKHggPyB5IDogeilcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBjb25kIGV4cHIgKHZhciB0cnVlKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiBjb25kIGV4cHIgKHZhciB0cnVlKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIGNvbmQgZXhwciAodmFyIHRydWUpIiB9CisgIH0KKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB4PTAiICIiICJzZXQgdmFyaWFibGUgeD0wIgorCitzZW5kX2dkYiAicHJpbnQgKHggPyB5IDogeilcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBjb25kIGV4cHIgKHZhciBmYWxzZSkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgY29uZCBleHByICh2YXIgZmFsc2UpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgY29uZCBleHByICh2YXIgZmFsc2UpIiB9CisgIH0KKworCitzZW5kX2dkYiAid2hhdGlzICgwID8gMyA6IDQpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSBpbnQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgd2hhdGlzIG9mIGNvbmQgZXhwciIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB3aGF0aXMgb2YgY29uZCBleHByIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgd2hhdGlzIG9mIGNvbmQgZXhwciIgfQorICB9CisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jb25kYnJlYWsuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY29uZGJyZWFrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxZDZlNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY29uZGJyZWFrLmMKQEAgLTAsMCArMSw4MSBAQAorI2lmZGVmIHZ4d29ya3MKKworIyAgaW5jbHVkZSA8c3RkaW8uaD4KKworLyogVnhXb3JrcyBkb2VzIG5vdCBzdXBwbHkgYXRvaS4gICovCitzdGF0aWMgaW50CithdG9pICh6KQorICAgICBjaGFyICp6OworeworICBpbnQgaSA9IDA7CisKKyAgd2hpbGUgKCp6ID49ICcwJyAmJiAqeiA8PSAnOScpCisgICAgaSA9IGkgKiAxMCArICgqeisrIC0gJzAnKTsKKyAgcmV0dXJuIGk7Cit9CisKKy8qIEkgZG9uJ3Qga25vdyBvZiBhbnkgd2F5IHRvIHBhc3MgYW4gYXJyYXkgdG8gVnhXb3Jrcy4gIFRoaXMgZnVuY3Rpb24KKyAgIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgZnJvbSBnZGIuICAqLworCit2eG1haW4gKGFyZykKK2NoYXIgKmFyZzsKK3sKKyAgY2hhciAqYXJndlsyXTsKKworICBhcmd2WzBdID0gIiI7CisgIGFyZ3ZbMV0gPSBhcmc7CisgIG1haW4gKDIsIGFyZ3YsIChjaGFyICoqKSAwKTsKK30KKworI2Vsc2UgLyogISB2eHdvcmtzICovCisjICBpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmIC8qICEgdnh3b3JrcyAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgZG8gbm90aGluZyB1c2VmdWwuICBUaGV5IGFyZSBpbmNsdWRlZCBzaW1wbHkKKyAqIGFzIHBsYWNlcyB0byB0cnkgc2V0dGluZyBicmVha3BvaW50cyBhdC4gIFRoZXkgYXJlIGV4cGxpY2l0bHkKKyAqICJvbmUtbGluZSBmdW5jdGlvbnMiIHRvIHZlcmlmeSB0aGF0IHRoaXMgY2FzZSB3b3JrcyAoc29tZSB2ZXJzaW9ucworICogb2YgZ2NjIGhhdmUgb3IgaGF2ZSBoYWQgcHJvYmxlbXMgd2l0aCB0aGlzKS4KKyAqLworCitpbnQgbWFya2VyMSAoKSB7IHJldHVybiAoMCk7IH0KK2ludCBtYXJrZXIyIChhKSBpbnQgYTsgeyByZXR1cm4gKDEpOyB9Cit2b2lkIG1hcmtlcjMgKGEsIGIpIGNoYXIgKmEsICpiOyB7fQordm9pZCBtYXJrZXI0IChkKSBsb25nIGQ7IHt9CisKKy8qCisgKglUaGlzIHNpbXBsZSBjbGFzc2ljYWwgZXhhbXBsZSBvZiByZWN1cnNpb24gaXMgdXNlZnVsIGZvcgorICoJdGVzdGluZyBzdGFjayBiYWNrdHJhY2VzIGFuZCBzdWNoLgorICovCisKK2ludAorbWFpbiAoYXJnYywgYXJndiwgZW52cCkKK2ludCBhcmdjOworY2hhciAqYXJndltdLCAqKmVudnA7Cit7CisjaWZkZWYgdXNlc3R1YnMKKyAgICBzZXRfZGVidWdfdHJhcHMoKTsKKyAgICBicmVha3BvaW50KCk7CisjZW5kaWYKKyAgICBpZiAoYXJnYyA9PSAxMjM0NTYpIHsKKwlmcHJpbnRmIChzdGRlcnIsICJ1c2FnZTogIGZhY3RvcmlhbCA8bnVtYmVyPlxuIik7CisJcmV0dXJuIDE7CisgICAgfQorICAgIHByaW50ZiAoIiVkXG4iLCBmYWN0b3JpYWwgKGF0b2kgKCI2IikpKTsKKworICAgIG1hcmtlcjEgKCk7CisgICAgbWFya2VyMiAoNDMpOworICAgIG1hcmtlcjMgKCJzdGFjayIsICJ0cmFjZSIpOworICAgIG1hcmtlcjQgKDE3NzYwMTk3NkwpOworICAgIHJldHVybiAwOworfQorCitpbnQgZmFjdG9yaWFsICh2YWx1ZSkKK2ludCB2YWx1ZTsKK3sKKyAgICBpZiAodmFsdWUgPiAxKSB7CisJdmFsdWUgKj0gZmFjdG9yaWFsICh2YWx1ZSAtIDEpOworICAgIH0KKyAgICByZXR1cm4gKHZhbHVlKTsKK30KKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jb25kYnJlYWsuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jb25kYnJlYWsuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Zjc1MjEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NvbmRicmVhay5leHAKQEAgLTAsMCArMSwxNTcgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyB0ZXN0IHdhcyB3cml0dGVuIGJ5IFJpY2ggVGl0bGUuIAorIyBQdXJwb3NlIGlzIHRvIHRlc3QgY29uZGl0aW9uYWwgYnJlYWtwb2ludHMuCisjIE1vZGVsZWQgYWZ0ZXIgImJyZWFrLmV4cCIuCisKKworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKKwl9CisKK2dsb2JhbCB1c2VzdHVicworCisjCisjIHRlc3QgcnVubmluZyBwcm9ncmFtcworIworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAiY29uZGJyZWFrIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIGFkZGl0aW9uYWxfZmxhZ3M9LXd9XSAhPSAiIiB9IHsKKyAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKKworaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGJfc3R1Yl0geworICAgIGdkYl9zdGVwX2Zvcl9zdHViOworfQorCisjCisjIHRlc3QgYnJlYWsgYXQgZnVuY3Rpb24KKyMKK2dkYl90ZXN0ICJicmVhayBtYWluIiBcCisgICAgIkJyZWFrcG9pbnQuKmF0LiogZmlsZSAuKiRzcmNmaWxlLCBsaW5lLioiIFwKKyAgICAiYnJlYWtwb2ludCBmdW5jdGlvbiIKKworIyAKKyMgdGVzdCBjb25kaXRpb25hbCBicmVhayBhdCBmdW5jdGlvbgorIworZ2RiX3Rlc3QgImJyZWFrIG1hcmtlcjEgaWYgMT09MSIgXAorICAgICJCcmVha3BvaW50LiphdC4qIGZpbGUgLiokc3JjZmlsZSwgbGluZS4qIiBcCisgICAgImJyZWFrIGZ1bmN0aW9uIGlmIGNvbmRpdGlvbiIKKworZ2RiX3Rlc3QgImRlbGV0ZSAyIiBcCisgICAgIiIgXAorICAgICJkZWxldGUgYnJlYWsiCisKKyMKKyMgdGVzdCBjb25kaXRpb25hbCBicmVhayBhdCBsaW5lIG51bWJlcgorIworZ2RiX3Rlc3QgImJyZWFrIDY0IGlmIDE9PTEiIFwKKyAgICAiQnJlYWtwb2ludC4qYXQuKiBmaWxlIC4qJHNyY2ZpbGUsIGxpbmUgNjRcXC4iIFwKKyAgICAiYnJlYWsgbGluZSBpZiBjb25kaXRpb24iCisKK2dkYl90ZXN0ICJkZWxldGUgMyIgXAorICAgICIiIFwKKyAgICAiZGVsZXRlIGJyZWFrIgorCisjIAorIyB0ZXN0IGNvbmRpdGlvbmFsIGJyZWFrIGF0IGZ1bmN0aW9uCisjCitnZGJfdGVzdCAiYnJlYWsgbWFya2VyMSBpZiAoMT09MSkiIFwKKyAgICAiQnJlYWtwb2ludC4qYXQuKiBmaWxlIC4qJHNyY2ZpbGUsIGxpbmUuKiIgXAorICAgICJicmVhayBmdW5jdGlvbiBpZiAoY29uZGl0aW9uKSIKKworIworIyB0ZXN0IGNvbmRpdGlvbmFsIGJyZWFrIGF0IGxpbmUgbnVtYmVyCisjCitnZGJfdGVzdCAiYnJlYWsgNjQgaWYgKDE9PTEpIiBcCisgICAgIkJyZWFrcG9pbnQuKmF0LiogZmlsZSAuKiRzcmNmaWxlLCBsaW5lIDY0XFwuIiBcCisgICAgImJyZWFrIGxpbmUgaWYgKGNvbmRpdGlvbikiCisKK2dkYl90ZXN0ICJicmVhayBtYXJrZXIyIGlmIChhPT00MykiIFwKKyAgICAiQnJlYWtwb2ludC4qYXQuKiBmaWxlIC4qJHNyY2ZpbGUsIGxpbmUuKiIgXAorICAgICJicmVhayBmdW5jdGlvbiBpZiAoY29uZGl0aW9uKSIKKworIworIyBjaGVjayB0byBzZWUgd2hhdCBicmVha3BvaW50cyBhcmUgc2V0CisjCisKK3NldCBtYWluX2xpbmUgNjAKK2dkYl90ZXN0ICJpbmZvIGJyZWFrIiBcCisgICAgIk51bSBUeXBlXFsgXF0rRGlzcCBFbmIgQWRkcmVzc1xbIFxdK1doYXQuKgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeS4qIGluIG1haW4gYXQgLiokc3JjZmlsZTokbWFpbl9saW5lLioKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHkuKiBpbiBtYXJrZXIxIGF0IC4qJHNyY2ZpbGU6NDEuKgorXFtcdCBcXStzdG9wIG9ubHkgaWYgMSA9PSAxLioKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHkuKiBpbiBtYWluIGF0IC4qJHNyY2ZpbGU6NjQuKgorXFtcdCBcXStzdG9wIG9ubHkgaWYgMSA9PSAxLioKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHkuKiBpbiBtYXJrZXIyIGF0IC4qJHNyY2ZpbGU6NDIuKgorXFtcdCBcXStzdG9wIG9ubHkgaWYgYSA9PSA0My4qIiBcCisgICAgImJyZWFrcG9pbnQgaW5mbyIKKworCisjCisjIHJ1biB1bnRpbCB0aGUgYnJlYWtwb2ludCBhdCBtYWluIGlzIGhpdC4gRm9yIG5vbi1zdHVicy11c2luZyB0YXJnZXRzLgorIworZ2RiX3Rlc3QgInJ1biIgXAorICAgICJTdGFydGluZyBwcm9ncmFtLipCcmVha3BvaW50IFxbMC05XF0rLC4qbWFpbiAuKmFyZ2MuKmFyZ3YuKiBhdCAuKiRzcmNmaWxlOjYwLio2MFxbXHQgXF0raWYgLmFyZ2MuKiBcey4qIiBcCisicnVuIHVudGlsIGZ1bmN0aW9uIGJyZWFrcG9pbnQiCisKKyMKKyMgcnVuIHVudGlsIHRoZSBicmVha3BvaW50IGF0IGEgbGluZSBudW1iZXIKKyMKK2dkYl90ZXN0ICJjb250aW51ZSIgIkNvbnRpbnVpbmdcXC4uKkJyZWFrcG9pbnQgXFswLTlcXSssIG1haW4gXFwoYXJnYz0uKiwgYXJndj0uKiwgZW52cD0uKlxcKSBhdCAuKiRzcmNmaWxlOjY0Lio2NFxbXHQgXF0rcHJpbnRmLipmYWN0b3JpYWwuKiIgXAorCQkJInJ1biB1bnRpbCBicmVha3BvaW50IHNldCBhdCBhIGxpbmUgbnVtYmVyIgorCisjCisjIHJ1biB1bnRpbCB0aGUgYnJlYWtwb2ludCBhdCBtYXJrZXIxCisjCitnZGJfdGVzdCAiY29udGludWUiICJDb250aW51aW5nXFwuLipCcmVha3BvaW50IFxbMC05XF0rLCBtYXJrZXIxIFxcKFxcKSBhdCAuKiRzcmNmaWxlOjQxLio0MVxbXHQgXF0rLioiIFwKKwkJCSJydW4gdW50aWwgYnJlYWtwb2ludCBhdCBtYXJrZXIxIgorCisjCisjIHJ1biB1bnRpbCB0aGUgYnJlYWtwb2ludCBhdCBtYXJrZXIyCisjCitnZGJfdGVzdCAiY29udGludWUiICJDb250aW51aW5nXFwuLipCcmVha3BvaW50IFxbMC05XF0rLCBtYXJrZXIyIFxcKGE9NDNcXCkgYXQgLiokc3JjZmlsZTo0Mi4qNDJcW1x0IFxdKy4qIiBcCisJCQkicnVuIHVudGlsIGJyZWFrcG9pbnQgYXQgbWFya2VyMiIKKworCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NvbmZpZ3VyZSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZTY5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDg5OSBAQAorIyEgL2Jpbi9zaAorCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorYWNfbWF4X2hlcmVfbGluZXM9MTIKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPWExLXNlbGZ0ZXN0LmV4cAorCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCitDQz0ke0NDLWNjfQorCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCithY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKK2FjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisKKyMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgorIyBUaGUgaW5wdXRzIGFyZToKKyMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAorIworIyBUaGUgcnVsZXMgYXJlOgorIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKKyMgICAgc2FtZSB0aW1lLgorIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KKyMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAorIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KKyMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KKyMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCisKKyMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KKyMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KK2Nhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgorTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OworKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCisKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgoraWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU3MzogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisKK2hvc3RfYWxpYXM9JGhvc3QKK2Nhc2UgIiRob3N0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpCisgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpIDs7CisgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2hvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAoraG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1OTQ6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1CisKK3RhcmdldF9hbGlhcz0kdGFyZ2V0CitjYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK3RhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKK3RhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCit0YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAordGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjYxMjogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorCitidWlsZF9hbGlhcz0kYnVpbGQKK2Nhc2UgIiRidWlsZF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKK2J1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitidWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgorCit0ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCisgIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKKyAgICBOT05FTk9ORXMseCx4LCAmJgorICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCisKKwordHJhcCAnJyAxIDIgMTUKK2NhdCA+IGNvbmZjYWNoZSA8PFxFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgorIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAorIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCisjIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgorIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCisjIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgorIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCisjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworRU9GCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKyhzZXQpIDI+JjEgfAorICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjEgfCBncmVwIGFjX3NwYWNlYCBpbgorICAqYWNfc3BhY2U9XCAqKQorICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCisgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICBzZWQgLW4gXAorICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKKyAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKyAgICA7OworICAqKQorICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJworICAgIDs7CisgIGVzYWMgPj4gY29uZmNhY2hlCitpZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKyMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCitmaQorCit0cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBERUZTLgorIyBQcm90ZWN0IGFnYWluc3Qgc2hlbGwgZXhwYW5zaW9uIHdoaWxlIGV4ZWN1dGluZyBNYWtlZmlsZSBydWxlcy4KKyMgUHJvdGVjdCBhZ2FpbnN0IE1ha2VmaWxlIG1hY3JvIGV4cGFuc2lvbi4KK2NhdCA+IGNvbmZ0ZXN0LmRlZnMgPDxcRU9GCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUtRFwxPVwyJWcKK3MlWyAJYH4jJF4mKigpe31cXHw7JyI8Pj9dJVxcJiVnCitzJVxbJVxcJiVnCitzJVxdJVxcJiVnCitzJVwkJSQkJWcKK0VPRgorREVGUz1gc2VkIC1mIGNvbmZ0ZXN0LmRlZnMgY29uZmRlZnMuaCB8IHRyICdcMDEyJyAnICdgCitybSAtZiBjb25mdGVzdC5kZWZzCisKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUiIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAU0hFTExAJSRTSEVMTCVnCitzJUBDRkxBR1NAJSRDRkxBR1MlZworcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCitzJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKK3MlQERFRlNAJSRERUZTJWcKK3MlQExERkxBR1NAJSRMREZMQUdTJWcKK3MlQExJQlNAJSRMSUJTJWcKK3MlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworcyVAcHJlZml4QCUkcHJlZml4JWcKK3MlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKK3MlQGJpbmRpckAlJGJpbmRpciVnCitzJUBzYmluZGlyQCUkc2JpbmRpciVnCitzJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCitzJUBkYXRhZGlyQCUkZGF0YWRpciVnCitzJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCitzJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKK3MlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKK3MlQGxpYmRpckAlJGxpYmRpciVnCitzJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCitzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCitzJUBpbmZvZGlyQCUkaW5mb2RpciVnCitzJUBtYW5kaXJAJSRtYW5kaXIlZworcyVAQ0NAJSRDQyVnCitzJUBob3N0QCUkaG9zdCVnCitzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCitzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKK3MlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZworcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKK3MlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCitzJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCitzJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCitzJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZworcyVAYnVpbGRAJSRidWlsZCVnCitzJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKK3MlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCitzJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZworcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCisKK0NFT0YKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KK2FjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCithY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19tb3JlX2xpbmVzPToKK2FjX3NlZF9jbWRzPSIiCit3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBmaQorICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCisgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZWxzZQorICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZmkKKyAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKyAgICBhY19iZWc9JGFjX2VuZAorICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgYWNfc2VkX2NtZHM9Y2F0CitmaQorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitDT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKworICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKKyAgcm0gLWYgIiRhY19maWxlIgorICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorIyAkY29uZmlndXJlX2lucHV0IiA7OworICAqKSBhY19jb21zdWI9IDs7CisgIGVzYWMKKworICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBzZWQgLWUgIiRhY19jb21zdWIKK3MlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCitzJUBzcmNkaXJAJSRzcmNkaXIlZworcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQorZmk7IGRvbmUKK3JtIC1mIGNvbmZ0ZXN0LnMqCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jb25maWd1cmUuaW4gYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWJjYjE5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jb25maWd1cmUuaW4KQEAgLTAsMCArMSwxNSBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK2RubCBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgZnJhZ21lbnQgdGhhdCBzdXBwbGllcyB0aGUgaW5mb3JtYXRpb24KK2RubCBuZWNlc3NhcnkgdG8gdGFpbG9yIGEgdGVtcGxhdGUgY29uZmlndXJlIHNjcmlwdCBpbnRvIHRoZSBjb25maWd1cmUKK2RubCBzY3JpcHQgYXBwcm9wcmlhdGUgZm9yIHRoaXMgZGlyZWN0b3J5LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIGNoZWNrCitkbmwgYW55IGV4aXN0aW5nIGNvbmZpZ3VyZSBzY3JpcHQuCisKK0FDX1BSRVJFUSgyLjUpCitBQ19JTklUKGExLXNlbGZ0ZXN0LmV4cCkKKworQ0M9JHtDQy1jY30KK0FDX1NVQlNUKENDKQorQUNfQ09ORklHX0FVWF9ESVIoYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLikKK0FDX0NBTk9OSUNBTF9TWVNURU0KKworQUNfT1VUUFVUKE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jb25zdHZhcnMuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY29uc3R2YXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjZTc1MgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY29uc3R2YXJzLmMKQEAgLTAsMCArMSwxODMgQEAKK3ZvaWQgbWFya2VyMSAodm9pZCkKK3sKK30KKworLyogbWlzYy4gZnVuY3Rpb24gcGFyYW1zICovCisKK2ludAorcXV4MSAoY29uc3QgY2hhciBjYywgY29uc3QgY2hhciAvKiYqL2NjciwgY29uc3QgY2hhciAqY2NwLCBjaGFyICpjb25zdCBjcGMpCit7CisgIHJldHVybiAzMzsKK30KKworaW50CitxdXgyICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHZ1YywgY29uc3Qgdm9sYXRpbGUgaW50IGN2aSwKKyAgICAgIHZvbGF0aWxlIHNob3J0IC8qJiovdnNyLCB2b2xhdGlsZSBsb25nICp2bHAsIGZsb2F0ICp2b2xhdGlsZSBmcHYsCisgICAgICBjb25zdCB2b2xhdGlsZSBzaWduZWQgY2hhciAqY29uc3Qgdm9sYXRpbGUgY3ZzY3BjdikKK3sKKyAgcmV0dXJuIDQwMDsKK30KKworaW50CittYWluICh2b2lkKQoreworICBjaGFyIGxhdmUgPSAnQic7CisgIHVuc2lnbmVkIGNoYXIgbGF2aXNoID0gMTA7CisgIHNob3J0IGxheCA9IDIwOworICB1bnNpZ25lZCBzaG9ydCBsZWNoZXJvdXMgPSAzMDsKKyAgbG9uZyBsZWNoZXJ5ID0gNDA7CisgIHVuc2lnbmVkIGxvbmcgbGVjdGVybiA9IDUwOworICBmbG9hdCBsZWV3YXkgPSA2MDsKKyAgZG91YmxlIGxlZ2FjeSA9IDcwOworICBzaWduZWQgY2hhciBsZW1vbmFkZSA9IDM1OworCisgIGNvbnN0IGNoYXIgICAgICAgICAgICBsYWNvbmljID0gJ0EnOworICBjb25zdCB1bnNpZ25lZCBjaGFyICAgbGFnZ2FyZCA9IDE7CisgIGNvbnN0IHNob3J0ICAgICAgICAgICBsYWdvb24gPSAyOworICBjb25zdCB1bnNpZ25lZCBzaG9ydCAgbGFpdHkgPSAzOworICBjb25zdCBsb25nICAgICAgICAgICAgbGFtYmVudCA9IDQ7CisgIGNvbnN0IHVuc2lnbmVkIGxvbmcgICBsYW1pbmF0ZWQgPSA1OworICBjb25zdCBmbG9hdCAgICAgICAgICAgbGFtcG9vbiA9IDY7CisgIGNvbnN0IGRvdWJsZSAgICAgICAgICBsYW5ndWlkID0gNzsKKworICAvKiBwb2ludGVycyB0byBjb25zdGFudCB2YXJpYWJsZXMgKi8KKworICBjb25zdCBjaGFyICAgICAgICAgICAqbGVnZW5kICAgICAgPSAmbGF2ZTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAgKmxlZ2VyZGVtYWluID0gJmxhdmlzaDsKKyAgY29uc3Qgc2hvcnQgICAgICAgICAgKmxlbmllbmN5ICAgID0gJmxheDsKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgKmxlb25pbmUgICAgID0gJmxlY2hlcm91czsKKyAgY29uc3QgbG9uZyAgICAgICAgICAgKmxlc2lvbiAgICAgID0gJmxlY2hlcnk7CisgIGNvbnN0IHVuc2lnbmVkIGxvbmcgICpsZXRoYWwgICAgICA9ICZsZWN0ZXJuOworICBjb25zdCBmbG9hdCAgICAgICAgICAqbGV0aGFyZ2ljICAgPSAmbGVld2F5OworICBjb25zdCBkb3VibGUgICAgICAgICAqbGV2aXR5ICAgICAgPSAmbGVnYWN5OworCisgIC8qIGNvbnN0YW50IHBvaW50ZXJzIHRvIGNvbnN0YW50IHZhcmlhYmxlcyAqLworCisgIGNvbnN0IGNoYXIgICAgICAgICAgICpjb25zdCBsZXdkICAgICAgICAgID0gJmxhY29uaWM7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICpjb25zdCBsZXhpY29ncmFwaGVyID0gJmxhZ2dhcmQ7CisgIGNvbnN0IHNob3J0ICAgICAgICAgICpjb25zdCBsZXhpY29uICAgICAgID0gJmxhZ29vbjsKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgKmNvbnN0IGxpYWlzb24gICAgICAgPSAmbGFpdHk7CisgIGNvbnN0IGxvbmcgICAgICAgICAgICpjb25zdCBsaWJhdGlvbiAgICAgID0gJmxhbWJlbnQ7CisgIGNvbnN0IHVuc2lnbmVkIGxvbmcgICpjb25zdCBsaWJlbG91cyAgICAgID0gJmxhbWluYXRlZDsKKyAgY29uc3QgZmxvYXQgICAgICAgICAgKmNvbnN0IGxpYmVydGluZSAgICAgPSAmbGFtcG9vbjsKKyAgY29uc3QgZG91YmxlICAgICAgICAgKmNvbnN0IGxpYmlkaW5vdXMgICAgPSAmbGFuZ3VpZDsKKworICAvKiB0aGlzIGlzIHRoZSBzYW1lIGFzIGNvbnN0IGNoYXIgKiBsZWdlbmQgLi4uLiAqLworCisgIGNoYXIgICAgICAgICAgIGNvbnN0ICpsYW5ndWlzaCAgID0gJmxhY29uaWM7CisgIHVuc2lnbmVkIGNoYXIgIGNvbnN0ICpsYW5ndW9yICAgID0gJmxhZ2dhcmQ7CisgIHNob3J0ICAgICAgICAgIGNvbnN0ICpsYW5rICAgICAgID0gJmxhZ29vbjsKKyAgdW5zaWduZWQgc2hvcnQgY29uc3QgKmxhcGlkYXJ5ICAgPSAmbGFpdHk7CisgIGxvbmcgICAgICAgICAgIGNvbnN0ICpsYXJjZW55ICAgID0gJmxhbWJlbnQ7CisgIHVuc2lnbmVkIGxvbmcgIGNvbnN0ICpsYXJnZXNzICAgID0gJmxhbWluYXRlZDsKKyAgZmxvYXQgICAgICAgICAgY29uc3QgKmxhc2NpdmlvdXMgPSAmbGFtcG9vbjsKKyAgZG91YmxlICAgICAgICAgY29uc3QgKmxhc3NpdHVkZSAgPSAmbGFuZ3VpZDsKKworICAvKiBjb25zdGFudCBwb2ludGVycyB0byB2YXJpYWJsZSAqLworCisgIGNoYXIgICAgICAgICAgICpjb25zdCAgIGxhbXByZXkgICA9ICZsYXZlOworICB1bnNpZ25lZCBjaGFyICAqY29uc3QgICBsYXJpYXQgICAgPSAmbGF2aXNoOworICBzaG9ydCAgICAgICAgICAqY29uc3QgICBsYXVkYW51bSAgPSAmbGF4OworICB1bnNpZ25lZCBzaG9ydCAqY29uc3QgICBsZWNpdGhpbiAgPSAmbGVjaGVyb3VzOworICBsb25nICAgICAgICAgICAqY29uc3QgICBsZXZpYXRoYW4gPSAmbGVjaGVyeTsKKyAgdW5zaWduZWQgbG9uZyAgKmNvbnN0ICAgbGlicmV0dG8gID0gJmxlY3Rlcm47CisgIGZsb2F0ICAgICAgICAgICpjb25zdCAgIGxpc3NvbWUgICA9ICZsZWV3YXk7CisgIGRvdWJsZSAgICAgICAgICpjb25zdCAgIGxvY3VzdCAgICA9ICZsZWdhY3k7CisKKyAgLyogdm9sYXRpbGUgdmFyaWFibGVzICovCisKKyAgdm9sYXRpbGUgY2hhciB2b3ggPSAnWCc7CisgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgdmljdHVhbHMgPSAxMzsKKyAgdm9sYXRpbGUgc2hvcnQgdml4ZW4gPSAyMDA7CisgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IHZpdHJpb2wgPSAzMDA7CisgIHZvbGF0aWxlIGxvbmcgdmVsbHVtID0gMTAwMDsKKyAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB2YWx2ZSA9IDIwMDA7CisgIHZvbGF0aWxlIGZsb2F0IHZhY3VpdHkgPSAzLjA7CisgIHZvbGF0aWxlIGRvdWJsZSB2ZXJ0aWdvID0gMTAuMzsKKyAgICAKKyAgLyogcG9pbnRlcnMgdG8gdm9sYXRpbGUgdmFyaWFibGVzICovCisKKyAgdm9sYXRpbGUgY2hhciAgICAgICAgICAgKiB2YW1waXJlID0gJnZveDsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgKiB2aXBlciAgPSAmdmljdHVhbHM7CisgIHZvbGF0aWxlIHNob3J0ICAgICAgICAgICogdmlnb3VyID0gJnZpeGVuOworICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqIHZhcG91ciA9ICZ2aXRyaW9sOworICB2b2xhdGlsZSBsb25nICAgICAgICAgICAqIHZlbnRyaWNsZSA9ICZ2ZWxsdW07CisgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgICogdmlnaW50aWxsaW9uID0gJnZhbHZlOworICB2b2xhdGlsZSBmbG9hdCAgICAgICAgICAqIHZvY2F0aW9uID0gJnZhY3VpdHk7CisgIHZvbGF0aWxlIGRvdWJsZSAgICAgICAgICogdmVyYWNpdHkgPSAmdmVydGlnbzsKKworICAvKiB2b2xhdGlsZSBwb2ludGVycyB0byB2b2xhdGlsZSB2YXJpYWJsZXMgKi8KKworICB2b2xhdGlsZSBjaGFyICAgICAgICAgICAqIHZvbGF0aWxlIHZhcGlkaXR5ID0gJnZveDsKKyAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgKiB2b2xhdGlsZSB2ZWxvY2l0eSA9ICZ2aWN0dWFsczsKKyAgdm9sYXRpbGUgc2hvcnQgICAgICAgICAgKiB2b2xhdGlsZSB2ZW5lZXIgPSAmdml4ZW47CisgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICogdm9sYXRpbGUgdmlkZW8gPSAmdml0cmlvbDsKKyAgdm9sYXRpbGUgbG9uZyAgICAgICAgICAgKiB2b2xhdGlsZSB2YWN1dW0gPSAmdmVsbHVtOworICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICAqIHZvbGF0aWxlIHZlbmlhbGl0eSA9ICZ2YWx2ZTsKKyAgdm9sYXRpbGUgZmxvYXQgICAgICAgICAgKiB2b2xhdGlsZSB2aXRhbGl0eSA9ICZ2YWN1aXR5OworICB2b2xhdGlsZSBkb3VibGUgICAgICAgICAqIHZvbGF0aWxlIHZvcmFjaXR5ID0gJnZlcnRpZ287CisKKyAgLyogY29uc3Qgdm9sYXRpbGUgdmFycyAqLworCisgIGNvbnN0IHZvbGF0aWxlIGNoYXIgICAgICAgICAgIHZpY3RvciA9ICdZJzsKKyAgY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgdmljYXIgPSAxMTsKKworICAvKiBwb2ludGVycyB0byBjb25zdCB2b2xhdGlsZXMgKi8KKworICBjb25zdCB2b2xhdGlsZSBjaGFyICAgICAgICAgICAgICAqIHZpY3RvcnkgPSAmdmljdG9yOworICBjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgICAqIHZpY2FyYWdlID0gJnZpY2FyOworCisgIC8qIGNvbnN0IHBvaW50ZXJzIHRvIHZvbGF0aWxlIHZhcnMgKi8KKworICB2b2xhdGlsZSBjaGFyICAgICAgICAgICAgICAgICAgICAqIGNvbnN0IHZlaW4gPSAmdm94OworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgICAgICAgICAqIGNvbnN0IHZvZ3VlID0gJnZpY3R1YWxzOworCisgIC8qIGNvbnN0IHBvaW50ZXJzIHRvIGNvbnN0IHZvbGF0aWxlIHZhcnMgKi8KKworICBjb25zdCB2b2xhdGlsZSBjaGFyICAgICAgICAgICAgICAqIGNvbnN0IGNhdmVybiA9ICZ2aWN0b3I7CisgIGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgICAgICogY29uc3QgY292ZXJsZXQgPSAmdmljYXI7CisKKyAgLyogdm9sYXRpbGUgcG9pbnRlcnMgdG8gY29uc3QgdmFycyAqLworCisgIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICogdm9sYXRpbGUgY2F2ZWF0ID0gJmxhY29uaWM7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICogdm9sYXRpbGUgY292ZW5hbnQgPSAmbGFnZ2FyZDsKKworICAvKiB2b2xhdGlsZSBwb2ludGVycyB0byBjb25zdCB2b2xhdGlsZSB2YXJzICovCisKKyAgY29uc3Qgdm9sYXRpbGUgY2hhciAgICAgICAgICAgICAgKiB2b2xhdGlsZSB2aXppZXIgPSAmdmljdG9yOworICBjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgICAqIHZvbGF0aWxlIHZhbmFkaXVtID0gJnZpY2FyOworCisgIC8qIGNvbnN0IHZvbGF0aWxlIHBvaW50ZXJzICovCisKKyAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjb25zdCB2b2xhdGlsZSB2YW5lID0gJmxhdmU7CisgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgICogY29uc3Qgdm9sYXRpbGUgdmVsZHQgPSAmbGF2aXNoOworCisgIC8qIGNvbnN0IHZvbGF0aWxlIHBvaW50ZXJzIHRvIGNvbnN0IHZhcnMgKi8KKworICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqIGNvbnN0IHZvbGF0aWxlIGNvdmUgPSAmbGFjb25pYzsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgKiBjb25zdCB2b2xhdGlsZSBjYXZpdHkgPSAmbGFnZ2FyZDsKKyAgICAKKyAgLyogY29uc3Qgdm9sYXRpbGUgcG9pbnRlcnMgdG8gdm9sYXRpbGUgdmFycyAqLworCisgIHZvbGF0aWxlIGNoYXIgICAgICAgICAgICAgICAgICAgICogY29uc3Qgdm9sYXRpbGUgdmFndXMgPSAmdm94OworICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAgICAgICAgICAqIGNvbnN0IHZvbGF0aWxlIHZhZ3JhbmN5ID0gJnZpY3R1YWxzOworICAgIAorICAvKiBjb25zdCB2b2xhdGlsZSBwb2ludGVycyB0byBjb25zdCB2b2xhdGlsZSAqLworCisgIGNvbnN0IHZvbGF0aWxlIGNoYXIgICAgICAgICAgICAgICogY29uc3Qgdm9sYXRpbGUgdmFnYXJ5ID0gJnZpY3RvcjsKKyAgY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgICAgKiBjb25zdCB2b2xhdGlsZSB2ZW5kb3IgPSAmdmljYXI7CisKKyAgLyogbWlzYy4gcmVmZXJlbmNlcyAqLworICAvKgorICBjb25zdCBjaGFyICAgICAgICAgICAmIHJhZGlhdGlvbiA9IGxhY29uaWM7CisgIHZvbGF0aWxlIHNpZ25lZCBjaGFyICYgcmVtdW5lcmF0aW9uID0gbGVtb25hZGU7CisgICovCisjaWZkZWYgdXNlc3R1YnMKKyAgc2V0X2RlYnVnX3RyYXBzICgpOworICBicmVha3BvaW50ICgpOworI2VuZGlmCisgIG1hcmtlcjEgKCk7CisgICAgCisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NvbnN0dmFycy5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NvbnN0dmFycy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4ZTVjYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY29uc3R2YXJzLmV4cApAQCAtMCwwICsxLDI1MSBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyB3cml0dGVuIGJ5IEVsZW5hIFphbm5vbmkgKGVsekBhcG9sbG8uaHAuY29tKQorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZ2RiIHRlc3RzdWl0ZQorIworIyB0ZXN0cyBmb3IgY29uc3QgdmFyaWFibGVzCisjICAgICAgICAgICBjb25zdCBwb2ludGVycyB0byB2YXJzCisjICAgICAgICAgICBwb2ludGVycyB0byBjb25zdCB2YXJpYWJsZXMKKyMgICAgICAgICAgIGNvbnN0IHBvaW50ZXJzIHRvIGNvbnN0IHZhcnMKKyMgd2l0aCBtaXhlZCB0eXBlcworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworIworIyB0ZXN0IHJ1bm5pbmcgcHJvZ3JhbXMKKyMKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgImNvbnN0dmFycyIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworIyBDcmVhdGUgYW5kIHNvdXJjZSB0aGUgZmlsZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlcgorIyB1c2VkIHRvIGNvbXBpbGUgdGhlIHRlc3QgY2FzZS4KKworaWYgW2dldF9jb21waWxlcl9pbmZvICR7YmluZmlsZX1dIHsKKyAgICByZXR1cm4gLTE7Cit9CisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisKKyMKKyMgc2V0IGl0IHVwIGF0IGEgYnJlYWtwb2ludCBzbyB3ZSBjYW4gcGxheSB3aXRoIHRoZSB2YXJpYWJsZSB2YWx1ZXMKKyMKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgcGVycm9yICJjb3VsZG4ndCBydW4gdG8gYnJlYWtwb2ludCIKKyAgICBjb250aW51ZQorfQorCitzZW5kX2dkYiAiYnJlYWsgbWFya2VyMVxuIiA7IGdkYl9leHBlY3QgLXJlICIuKiRnZGJfcHJvbXB0ICQiCisKKyAgICBzZW5kX2dkYiAiY29udFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIkJyZWFrLiogbWFya2VyMSBcXChcXCkgYXQgLio6JGRlY2ltYWwuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIHNlbmRfZ2RiICJ1cFxuIgorICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9CisgICAgICAgICAgICAgICAgdGltZW91dCB7IGZhaWwgInVwIGZyb20gbWFya2VyMSIgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC1yZSAiQnJlYWsuKiBtYXJrZXIxX18uKiBcXChcXCkgYXQgLio6JGRlY2ltYWwuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAiY29udGludWUgdG8gbWFya2VyMSAoZGVtYW5nbGluZykiCisgICAgICAgICAgICBzZW5kX2dkYiAidXBcbiIKKyAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorICAgICAgICAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJ1cCBmcm9tIG1hcmtlcjEiIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29udGludWUgdG8gbWFya2VyMSIgIH0KKyAgICAgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb250aW51ZSB0byBtYXJrZXIxIiAgfQorICAgIH0KKworIyB0ZXN0IGZ1bmN0aW9uIHBhcmFtZXRlcnMKKworaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KK3NlbmRfZ2RiICJwdHlwZSBxdXgxXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSBpbnQgXFwoY29uc3QgY2hhciwgY29uc3QgY2hhciAmLCBjb25zdCBjaGFyICosIGNoYXIgKiBjb25zdFxcKS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwdHlwZSBxdXgxIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBxdXgxIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgcXV4MSIgfQorfSAgIAorCisjIHRlc3QgdmFycyBhbmQgcG9pbnRlcnMKKworcHJvYyBkb19jb25zdHZhcl90ZXN0cyB7fSB7CisgICAgZ2xvYmFsIGdjY19jb21waWxlZAorCisgICAgZ2RiX3Rlc3QgInByaW50IGxhdmUiICIgPSA2NiAnQiciCisgICAgZ2RiX3Rlc3QgInB0eXBlIGxhdmUiICJ0eXBlID0gY2hhciIKKyAgICBnZGJfdGVzdCAicHJpbnQgbGF2aXNoIiAiID0gMTAgJ1xcXFxuJyIKKyAgICBnZGJfdGVzdCAicHR5cGUgbGF2aXNoIiAidHlwZSA9IHVuc2lnbmVkIGNoYXIiCisgICAgZ2RiX3Rlc3QgInByaW50IGxheCIgIiA9IDIwIgorICAgIGdkYl90ZXN0ICJwdHlwZSBsYXgiICJ0eXBlID0gc2hvcnQuKiIKKyAgICBnZGJfdGVzdCAicHJpbnQgbGVjaGVyb3VzIiAiID0gMzAiCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHR5cGUgbGVjaGVyb3VzIiAidHlwZSA9IHVuc2lnbmVkIHNob3J0LioiCisgICAgZ2RiX3Rlc3QgInByaW50IGxlY2hlcnkiICIgPSA0MCIKKyAgICBnZGJfdGVzdCAicHR5cGUgbGVjaGVyeSIgInR5cGUgPSBsb25nLioiCisgICAgZ2RiX3Rlc3QgInByaW50IGxlY3Rlcm4iICIgPSA1MCIKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorICAgIGdkYl90ZXN0ICJwdHlwZSBsZWN0ZXJuIiAidHlwZSA9IHVuc2lnbmVkIGxvbmcuKiIKKyAgICBnZGJfdGVzdCAicHJpbnQgbGVld2F5IiAiID0gNjAiCisgICAgZ2RiX3Rlc3QgInB0eXBlIGxlZXdheSIgInR5cGUgPSBmbG9hdCIKKyAgICBnZGJfdGVzdCAicHJpbnQgbGVnYWN5IiAiID0gNzAiCisgICAgZ2RiX3Rlc3QgInB0eXBlIGxlZ2FjeSIgInR5cGUgPSBkb3VibGUiCisgICAgZ2RiX3Rlc3QgInByaW50IGxhY29uaWMiICIgPSA2NSAnQSciCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHR5cGUgbGFjb25pYyIgInR5cGUgPSBjb25zdCBjaGFyIgorICAgIGdkYl90ZXN0ICJwcmludCBsYWdnYXJkIiAiID0gMSAnLjAwMSciCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHR5cGUgbGFnZ2FyZCIgInR5cGUgPSBjb25zdCB1bnNpZ25lZCBjaGFyIgorICAgIGdkYl90ZXN0ICJwcmludCBsYWdvb24iICIgPSAyIgorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisgICAgZ2RiX3Rlc3QgInB0eXBlIGxhZ29vbiIgInR5cGUgPSBjb25zdCBzaG9ydCIKKyAgICBnZGJfdGVzdCAicHJpbnQgbGFpdHkiICIgPSAzIgorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisgICAgZ2RiX3Rlc3QgInB0eXBlIGxhaXR5IiAidHlwZSA9IGNvbnN0IHVuc2lnbmVkIHNob3J0IgorICAgIGdkYl90ZXN0ICJwcmludCBsYW1iZW50IiAiID0gNCIKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorICAgIGdkYl90ZXN0ICJwdHlwZSBsYW1iZW50IiAidHlwZSA9IGNvbnN0IGxvbmciCisgICAgZ2RiX3Rlc3QgInByaW50IGxhbWluYXRlZCIgIiA9IDUiCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHR5cGUgbGFtaW5hdGVkIiAidHlwZSA9IGNvbnN0IHVuc2lnbmVkIGxvbmciCisgICAgZ2RiX3Rlc3QgInByaW50IGxhbXBvb24iICIgPSA2IgorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisgICAgZ2RiX3Rlc3QgInB0eXBlIGxhbXBvb24iICJ0eXBlID0gY29uc3QgZmxvYXQiCisgICAgZ2RiX3Rlc3QgInByaW50IGxhbmd1aWQiICIgPSA3IgorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisgICAgZ2RiX3Rlc3QgInB0eXBlIGxhbmd1aWQiICJ0eXBlID0gY29uc3QgZG91YmxlIgorICAgIGdkYl90ZXN0ICJwcmludCAqbGVnZW5kIiAiID0gNjYgJ0InIgorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisgICAgZ2RiX3Rlc3QgInB0eXBlIGxlZ2VuZCIgInR5cGUgPSBjb25zdCBjaGFyICoiCisgICAgZ2RiX3Rlc3QgInByaW50ICpsZWdlcmRlbWFpbiIgIiA9IDEwICdcXFxcbiciCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHR5cGUgbGVnZXJkZW1haW4iICJ0eXBlID0gY29uc3QgdW5zaWduZWQgY2hhciAqIgorICAgIGdkYl90ZXN0ICJwcmludCAqbGVuaWVuY3kiICIgPSAyMCIKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorICAgIGdkYl90ZXN0ICJwdHlwZSBsZW5pZW5jeSIgInR5cGUgPSBjb25zdCBzaG9ydCAqIgorICAgIGdkYl90ZXN0ICJwcmludCAqbGVvbmluZSIgIiA9IDMwIgorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisgICAgZ2RiX3Rlc3QgInB0eXBlIGxlb25pbmUiICJ0eXBlID0gY29uc3QgdW5zaWduZWQgc2hvcnQgKiIKKyAgICBnZGJfdGVzdCAicHJpbnQgKmxlc2lvbiIgIiA9IDQwIgorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisgICAgZ2RiX3Rlc3QgInB0eXBlIGxlc2lvbiIgInR5cGUgPSBjb25zdCBsb25nICoiCisgICAgZ2RiX3Rlc3QgInByaW50ICpsZXRoYWwiICIgPSA1MCIKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorICAgIGdkYl90ZXN0ICJwdHlwZSBsZXRoYWwiICJ0eXBlID0gY29uc3QgdW5zaWduZWQgbG9uZyAqIgorICAgIGdkYl90ZXN0ICJwcmludCAqbGV0aGFyZ2ljIiAiID0gNjAiCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHR5cGUgbGV0aGFyZ2ljIiAidHlwZSA9IGNvbnN0IGZsb2F0ICoiCisgICAgZ2RiX3Rlc3QgInByaW50ICpsZXZpdHkiICIgPSA3MCIKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorICAgIGdkYl90ZXN0ICJwdHlwZSBsZXZpdHkiICJ0eXBlID0gY29uc3QgZG91YmxlICoiCisgICAgZ2RiX3Rlc3QgInByaW50ICpsZXdkIiAiID0gNjUgJ0EnIgorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisgICAgZ2RiX3Rlc3QgInB0eXBlIGxld2QiICJ0eXBlID0gY29uc3QgY2hhciAqIGNvbnN0IgorICAgIGdkYl90ZXN0ICJwcmludCAqbGV4aWNvZ3JhcGhlciIgIiA9IDEgJy4wMDEnIgorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisgICAgZ2RiX3Rlc3QgInB0eXBlIGxleGljb2dyYXBoZXIiICJ0eXBlID0gY29uc3QgdW5zaWduZWQgY2hhciAqIGNvbnN0IgorICAgIGdkYl90ZXN0ICJwcmludCAqbGV4aWNvbiIgIiA9IDIiCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHR5cGUgbGV4aWNvbiIgInR5cGUgPSBjb25zdCBzaG9ydCAqIGNvbnN0IgorICAgIGdkYl90ZXN0ICJwcmludCAqbGlhaXNvbiIgIiA9IDMiCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHR5cGUgbGlhaXNvbiIgInR5cGUgPSBjb25zdCB1bnNpZ25lZCBzaG9ydCAqIGNvbnN0IgorICAgIGdkYl90ZXN0ICJwcmludCAqbGliYXRpb24iICIgPSA0IgorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisgICAgZ2RiX3Rlc3QgInB0eXBlIGxpYmF0aW9uIiAidHlwZSA9IGNvbnN0IGxvbmcgKiBjb25zdCIKKyAgICBnZGJfdGVzdCAicHJpbnQgKmxpYmVsb3VzIiAiID0gNSIKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorICAgIGdkYl90ZXN0ICJwdHlwZSBsaWJlbG91cyIgInR5cGUgPSBjb25zdCB1bnNpZ25lZCBsb25nICogY29uc3QiCisgICAgZ2RiX3Rlc3QgInByaW50ICpsaWJlcnRpbmUiICIgPSA2IgorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisgICAgZ2RiX3Rlc3QgInB0eXBlIGxpYmVydGluZSIgInR5cGUgPSBjb25zdCBmbG9hdCAqIGNvbnN0IgorICAgIGdkYl90ZXN0ICJwcmludCAqbGliaWRpbm91cyIgIiA9IDciCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHR5cGUgbGliaWRpbm91cyIgInR5cGUgPSBjb25zdCBkb3VibGUgKiBjb25zdCIKKyAgICBnZGJfdGVzdCAicHJpbnQgKmxhbmd1aXNoIiAiID0gNjUgJ0EnIgorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisgICAgZ2RiX3Rlc3QgInB0eXBlIGxhbmd1aXNoIiAidHlwZSA9IGNvbnN0IGNoYXIgKiIKKyAgICBnZGJfdGVzdCAicHJpbnQgKmxhbmd1b3IiICIgPSAxICcuMDAxJyIKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorICAgIGdkYl90ZXN0ICJwdHlwZSBsYW5ndW9yIiAidHlwZSA9IGNvbnN0IHVuc2lnbmVkIGNoYXIgKiIKKyAgICBnZGJfdGVzdCAicHJpbnQgKmxhbmsiICIgPSAyIgorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisgICAgZ2RiX3Rlc3QgInB0eXBlIGxhbmsiICJ0eXBlID0gY29uc3Qgc2hvcnQgKiIKKyAgICBnZGJfdGVzdCAicHJpbnQgKmxhcGlkYXJ5IiAiID0gMyIKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorICAgIGdkYl90ZXN0ICJwdHlwZSBsYXBpZGFyeSIgInR5cGUgPSBjb25zdCB1bnNpZ25lZCBzaG9ydCAqIgorICAgIGdkYl90ZXN0ICJwcmludCAqbGFyY2VueSIgIiA9IDQiCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHR5cGUgbGFyY2VueSIgInR5cGUgPSBjb25zdCBsb25nICoiCisgICAgZ2RiX3Rlc3QgInByaW50ICpsYXJnZXNzIiAiID0gNSIKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorICAgIGdkYl90ZXN0ICJwdHlwZSBsYXJnZXNzIiAidHlwZSA9IGNvbnN0IHVuc2lnbmVkIGxvbmcgKiIKKyAgICBnZGJfdGVzdCAicHJpbnQgKmxhc2NpdmlvdXMiICIgPSA2IgorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisgICAgZ2RiX3Rlc3QgInB0eXBlIGxhc2NpdmlvdXMiICJ0eXBlID0gY29uc3QgZmxvYXQgKiIKKyAgICBnZGJfdGVzdCAicHJpbnQgKmxhc3NpdHVkZSIgIiA9IDciCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHR5cGUgbGFzc2l0dWRlIiAidHlwZSA9IGNvbnN0IGRvdWJsZSAqIgorICAgIGdkYl90ZXN0ICJwcmludCAqbGFtcHJleSIgIiA9IDY2ICdCJyIKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorICAgIGdkYl90ZXN0ICJwdHlwZSBsYW1wcmV5IiAidHlwZSA9IGNoYXIgKiBjb25zdCIKKyAgICBnZGJfdGVzdCAicHJpbnQgKmxhcmlhdCIgIiA9IDEwICdcXFxcbiciCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHR5cGUgbGFyaWF0IiAidHlwZSA9IHVuc2lnbmVkIGNoYXIgKiBjb25zdCIKKyAgICBnZGJfdGVzdCAicHJpbnQgKmxhdWRhbnVtIiAiID0gMjAiCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHR5cGUgbGF1ZGFudW0iICJ0eXBlID0gc2hvcnQgKiBjb25zdCIKKyAgICBnZGJfdGVzdCAicHJpbnQgKmxlY2l0aGluIiAiID0gMzAiCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHR5cGUgbGVjaXRoaW4iICJ0eXBlID0gdW5zaWduZWQgc2hvcnQgKiBjb25zdCIKKyAgICBnZGJfdGVzdCAicHJpbnQgKmxldmlhdGhhbiIgIiA9IDQwIgorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisgICAgZ2RiX3Rlc3QgInB0eXBlIGxldmlhdGhhbiIgInR5cGUgPSBsb25nICogY29uc3QiCisgICAgZ2RiX3Rlc3QgInByaW50ICpsaWJyZXR0byIgIiA9IDUwIgorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisgICAgZ2RiX3Rlc3QgInB0eXBlIGxpYnJldHRvIiAidHlwZSA9IHVuc2lnbmVkIGxvbmcgKiBjb25zdCIKKyAgICBnZGJfdGVzdCAicHJpbnQgKmxpc3NvbWUiICIgPSA2MCIKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorICAgIGdkYl90ZXN0ICJwdHlwZSBsaXNzb21lIiAidHlwZSA9IGZsb2F0ICogY29uc3QiCisgICAgZ2RiX3Rlc3QgInByaW50ICpsb2N1c3QiICIgPSA3MCIKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorICAgIGdkYl90ZXN0ICJwdHlwZSBsb2N1c3QiICJ0eXBlID0gZG91YmxlICogY29uc3QiCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHR5cGUgcmFkaWF0aW9uIiAidHlwZSA9IGNvbnN0IGNoYXIgJiIKK30KKworZG9fY29uc3R2YXJfdGVzdHMKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY29yZWZpbGUuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jb3JlZmlsZS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiNzhjNAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY29yZWZpbGUuZXhwCkBAIC0wLDAgKzEsMjIzIEBACisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAoZm5mQGN5Z251cy5jb20pCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworIyBhcmUgd2Ugb24gYSB0YXJnZXQgYm9hcmQKK2lmICFbaXNuYXRpdmVdIHRoZW4geworICAgIHJldHVybgorfQorCitzZXQgdGVzdGZpbGUgImNvcmVtYWtlciIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKKyMgQ3JlYXRlIGFuZCBzb3VyY2UgdGhlIGZpbGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIKKyMgdXNlZCB0byBjb21waWxlIHRoZSB0ZXN0IGNhc2UuCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0geworICAgIHJldHVybiAtMTsKK30KKworIyBDcmVhdGUgYSBjb3JlIGZpbGUgbmFtZWQgImNvcmVmaWxlIiByYXRoZXIgdGhhbiBqdXN0ICJjb3JlIiwgdG8KKyMgYXZvaWQgcHJvYmxlbXMgd2l0aCBzeXMgYWRtaW4gdHlwZXMgdGhhdCBsaWtlIHRvIHJlZ3VsYXJseSBwcnVuZSBhbGwKKyMgZmlsZXMgbmFtZWQgImNvcmUiIGZyb20gdGhlIHN5c3RlbS4KKyMKKyMgQXJiaXRyYXJpbHkgdHJ5IHNldHRpbmcgdGhlIGNvcmUgc2l6ZSBsaW1pdCB0byAidW5saW1pdGVkIiBzaW5jZQorIyB0aGlzIGRvZXMgbm90IGh1cnQgb24gc3lzdGVtcyB3aGVyZSB0aGUgY29tbWFuZCBkb2VzIG5vdCB3b3JrIGFuZAorIyBhbGxvd3MgdXMgdG8gZ2VuZXJhdGUgYSBjb3JlIG9uIHN5c3RlbXMgd2hlcmUgaXQgZG9lcy4KKyMKKyMgU29tZSBzeXN0ZW1zIGFwcGVuZCAiY29yZSIgdG8gdGhlIG5hbWUgb2YgdGhlIHByb2dyYW07IG90aGVycyBhcHBlbmQKKyMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gImNvcmUiLgorc2V0IGZvdW5kIDAKK2NhdGNoICJzeXN0ZW0gXCIoY2QgJHtvYmpkaXJ9LyR7c3ViZGlyfTsgdWxpbWl0IC1jIHVubGltaXRlZDsgJHtiaW5maWxlfTsgdHJ1ZSkgPi9kZXYvbnVsbCAyPiYxXCIiCisjICAgICAgcmVtb3RlX2V4ZWMgaG9zdCAiJHtiaW5maWxlfSIKK2ZvcmVhY2ggaSAiJHtvYmpkaXJ9LyR7c3ViZGlyfS9jb3JlICR7b2JqZGlyfS8ke3N1YmRpcn0vY29yZS5jb3JlbWFrZXIuYyAke2JpbmZpbGV9LmNvcmUiIHsKKyAgICBpZiBbcmVtb3RlX2ZpbGUgYnVpbGQgZXhpc3RzICRpXSB7CisJcmVtb3RlX2V4ZWMgYnVpbGQgIm12ICRpICR7b2JqZGlyfS8ke3N1YmRpcn0vY29yZWZpbGUiCisJc2V0IGZvdW5kIDEKKyAgICB9Cit9CitpZiB7ICRmb3VuZCA9PSAwIH0geworICAgICMgVGhlIGJyYWluZGFtYWdlZCBIUFVYIHNoZWxsIHF1aXRzIGFmdGVyIHRoZSB1bGltaXQgLWMgYWJvdmUKKyAgICAjIHdpdGhvdXQgZXhlY3V0aW5nICR7YmluZmlsZX0uICBTbyB3ZSB0cnkgYWdhaW4gd2l0aG91dCB0aGUKKyAgICAjIHVsaW1pdCBoZXJlIGlmIHdlIGRpZG4ndCBmaW5kIGEgY29yZSBmaWxlIGFib3ZlLgorICAgICMgT2gsIEkgc2hvdWxkIG1lbnRpb24gdGhhdCBhbnkgImJyYWluZGFtYWdlZCIgbm9uLVVuaXggc3lzdGVtIGhhcworICAgICMgdGhlIHNhbWUgcHJvYmxlbS4gSSBsaWtlIHRoZSBjZCBiaXQgdG9vLCBpdCdzIHJlYWxseSBuZWF0J24gc3R1ZmYuCisgICAgY2F0Y2ggInN5c3RlbSBcIihjZCAke29iamRpcn0vJHtzdWJkaXJ9OyAke2JpbmZpbGV9OyB0cnVlKSA+L2Rldi9udWxsIDI+JjFcIiIKKyAgICBmb3JlYWNoIGkgIiR7b2JqZGlyfS8ke3N1YmRpcn0vY29yZSAke29iamRpcn0vJHtzdWJkaXJ9L2NvcmUuY29yZW1ha2VyLmMgJHtiaW5maWxlfS5jb3JlIiB7CisJaWYgW3JlbW90ZV9maWxlIGJ1aWxkIGV4aXN0cyAkaV0geworCSAgICByZW1vdGVfZXhlYyBidWlsZCAibXYgJGkgJHtvYmpkaXJ9LyR7c3ViZGlyfS9jb3JlZmlsZSIKKwkgICAgc2V0IGZvdW5kIDEKKwl9CisgICAgfQorICAgIAorICAgIGlmIHsgJGZvdW5kID09IDAgIH0geworCXdhcm5pbmcgImNhbid0IGdlbmVyYXRlIGEgY29yZSBmaWxlIC0gY29yZSB0ZXN0cyBzdXBwcmVzc2VkIC0gY2hlY2sgdWxpbWl0IC1jIgorCXJldHVybiAwCisgICAgfQorfQorCisjCisjIFRlc3QgdGhhdCB3ZSBjYW4gc2ltcGx5IHN0YXJ0dXAgd2l0aCBhICItY29yZT1jb3JlZmlsZSIgY29tbWFuZCBsaW5lIGFyZworIyBhbmQgcmVjb2duaXplIHRoYXQgdGhlIGNvcmUgZmlsZSBpcyBhIHZhbGlkLCB1c2FibGUgY29yZSBmaWxlLgorIyBUbyBkbyB0aGlzLCB3ZSBtdXN0IHNodXRkb3duIHRoZSBjdXJyZW50bHkgcnVubmluZyBnZGIgYW5kIHJlc3RhcnQKKyMgd2l0aCB0aGUgLWNvcmUgYXJncy4gIFdlIGNhbid0IHVzZSBnZGJfc3RhcnQgYmVjYXVzZSBpdCBsb29rcyBmb3IKKyMgdGhlIGZpcnN0IGdkYiBwcm9tcHQsIGFuZCB0aGUgbWVzc2FnZSB3ZSBhcmUgbG9va2luZyBmb3Igb2NjdXJzCisjIGJlZm9yZSB0aGUgZmlyc3QgcHJvbXB0LiAgQWxzbywgd2UgY2FuJ3QgaW5jbHVkZSBHREJGTEFHUyBiZWNhdXNlCisjIGlmIGl0IGlzIGVtcHR5LCB0aGlzIGNvbmZ1c2VzIGdkYiB3aXRoIGFuIGVtcHR5IGFyZ3VtZW50IHRoYXQgaXQKKyMgZ3J1bWJsZXMgYWJvdXQgKHNhaWQgZ3J1bWJsaW5nIGN1cnJlbnRseSBiZWluZyBpZ25vcmVkIGluIGdkYl9zdGFydCkuCisjICoqRklYTUUqKgorIworIyBBbm90aGVyIHByb2JsZW0gaXMgdGhhdCBvbiBzb21lIHN5c3RlbXMgKHNvbGFyaXMgZm9yIGV4YW1wbGUpLCB0aGVyZQorIyBpcyBhcHBhcmVudGx5IGEgbGltaXQgb24gdGhlIGxlbmd0aCBvZiBhIGZ1bGx5IHNwZWNpZmllZCBwYXRoIHRvIAorIyB0aGUgY29yZW1ha2VyIGV4ZWN1dGFibGUsIGF0IGFib3V0IDgwIGNoYXJzLiAgRm9yIHRoaXMgY2FzZSwgY29uc2lkZXIKKyMgaXQgYSBwYXNzLCBidXQgbm90ZSB0aGF0IHRoZSBwcm9ncmFtIG5hbWUgaXMgYmFkLgorCitnZGJfZXhpdAoraWYgJHZlcmJvc2U+MSB0aGVuIHsKKyAgICBzZW5kX3VzZXIgIlNwYXduaW5nICRHREIgLW53ICRHREJGTEFHUyAtY29yZT0kb2JqZGlyLyRzdWJkaXIvY29yZWZpbGVcbiIKK30KKworc2V0IG9sZHRpbWVvdXQgJHRpbWVvdXQKK3NldCB0aW1lb3V0IFtleHByICIkdGltZW91dCArIDYwIl0KK3ZlcmJvc2UgIlRpbWVvdXQgaXMgbm93ICR0aW1lb3V0IHNlY29uZHMiIDIKK2V2YWwgInNwYXduICRHREIgLW53ICRHREJGTEFHUyAtY29yZT0kb2JqZGlyLyRzdWJkaXIvY29yZWZpbGUiCitleHBlY3QgeworICAgIC1yZSAiQ29yZSB3YXMgZ2VuZXJhdGVkIGJ5IC4qY29yZW1ha2VyLipcclxuXCMwICAuKlwoXCkuKlxyXG4kZ2RiX3Byb21wdCAkIiB7CisJcGFzcyAiYXJnczogLWNvcmU9Y29yZWZpbGUiCisgICAgfQorICAgIC1yZSAiQ29yZSB3YXMgZ2VuZXJhdGVkIGJ5IC4qXHJcblwjMCAgLipcKFwpLipcclxuJGdkYl9wcm9tcHQgJCIgeworCXBhc3MgImFyZ3M6IC1jb3JlPWNvcmVmaWxlICh3aXRoIGJhZCBwcm9ncmFtIG5hbWUpIgorICAgIH0KKyAgICAtcmUgIi4qcmVnaXN0ZXJzIGZyb20gY29yZSBmaWxlOiBGaWxlIGluIHdyb25nIGZvcm1hdC4qICQiIHsKKwlmYWlsICJhcmdzOiAtY29yZT1jb3JlZmlsZSAoY291bGQgbm90IHJlYWQgcmVnaXN0ZXJzIGZyb20gY29yZSBmaWxlKSIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCXsgZmFpbCAiYXJnczogLWNvcmU9Y29yZWZpbGUiIH0KKyAgICB0aW1lb3V0IAkJeyBmYWlsICIodGltZW91dCkgc3RhcnRpbmcgd2l0aCAtY29yZSIgfQorfQorCisKKyMKKyMgVGVzdCB0aGF0IHN0YXJ0dXAgd2l0aCBib3RoIGFuIGV4ZWN1dGFibGUgZmlsZSBhbmQgLWNvcmUgYXJndW1lbnQuCisjIFNlZSBwcmV2aW91cyBjb21tZW50cyBhYm92ZSwgdGhleSBhcmUgc3RpbGwgYXBwbGljYWJsZS4KKyMKKworY2xvc2U7CisKK2lmICR2ZXJib3NlPjEgdGhlbiB7CisgICAgc2VuZF91c2VyICJTcGF3bmluZyAkR0RCIC1udyAkR0RCRkxBR1MgJGJpbmZpbGUgLWNvcmU9JG9iamRpci8kc3ViZGlyL2NvcmVmaWxlXG4iCit9CisKKworZXZhbCAic3Bhd24gJEdEQiAtbncgJEdEQkZMQUdTICRiaW5maWxlIC1jb3JlPSRvYmpkaXIvJHN1YmRpci9jb3JlZmlsZSI7CitleHBlY3QgeworICAgIC1yZSAiQ29yZSB3YXMgZ2VuZXJhdGVkIGJ5IC4qY29yZW1ha2VyLipcclxuXCMwICAuKlwoXCkuKlxyXG4kZ2RiX3Byb21wdCAkIiB7CisJcGFzcyAiYXJnczogZXhlY2ZpbGUgLWNvcmU9Y29yZWZpbGUiCisgICAgfQorICAgIC1yZSAiQ29yZSB3YXMgZ2VuZXJhdGVkIGJ5IC4qXHJcblwjMCAgLipcKFwpLipcclxuJGdkYl9wcm9tcHQgJCIJIHsKKwlwYXNzICJhcmdzOiBleGVjZmlsZSAtY29yZT1jb3JlZmlsZSAod2l0aCBiYWQgcHJvZ3JhbSBuYW1lKSIKKyAgICB9CisgICAgLXJlICIuKnJlZ2lzdGVycyBmcm9tIGNvcmUgZmlsZTogRmlsZSBpbiB3cm9uZyBmb3JtYXQuKiAkIiB7CisJZmFpbCAiYXJnczogZXhlY2ZpbGUgLWNvcmU9Y29yZWZpbGUgKGNvdWxkIG5vdCByZWFkIHJlZ2lzdGVycyBmcm9tIGNvcmUgZmlsZSkiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIgl7IGZhaWwgImFyZ3M6IGV4ZWNmaWxlIC1jb3JlPWNvcmVmaWxlIiB9CisgICAgdGltZW91dCAJCXsgZmFpbCAiKHRpbWVvdXQpIHN0YXJ0aW5nIHdpdGggLWNvcmUiIH0KK30KK3NldCB0aW1lb3V0ICRvbGR0aW1lb3V0Cit2ZXJib3NlICJUaW1lb3V0IGlzIG5vdyAkdGltZW91dCBzZWNvbmRzIiAyCisKK2Nsb3NlOworCisjIE5vdyByZXN0YXJ0IG5vcm1hbGx5LgorCitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisjIFRlc3QgYmFzaWMgY29yZWZpbGUgcmVjb2duaXRpb24gdmlhIGNvcmUtZmlsZSBjb21tYW5kLgorCitzZW5kX2dkYiAiY29yZS1maWxlICRvYmpkaXIvJHN1YmRpci9jb3JlZmlsZVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJDb3JlIHdhcyBnZW5lcmF0ZWQgYnkgLipjb3JlbWFrZXIuKlxyXG5cIzAgIC4qXChcKS4qXHJcbiRnZGJfcHJvbXB0ICQiIHsKKwlwYXNzICJjb3JlLWZpbGUgY29tbWFuZCIKKyAgICB9CisgICAgLXJlICJDb3JlIHdhcyBnZW5lcmF0ZWQgYnkgLipcclxuXCMwICAuKlwoXCkuKlxyXG4kZ2RiX3Byb21wdCAkIiB7CisJcGFzcyAiY29yZS1maWxlIGNvbW1hbmQgKHdpdGggYmFkIHByb2dyYW0gbmFtZSkiCisgICAgfQorICAgIC1yZSAiLipyZWdpc3RlcnMgZnJvbSBjb3JlIGZpbGU6IEZpbGUgaW4gd3JvbmcgZm9ybWF0LiogJCIgeworCWZhaWwgImNvcmUtZmlsZSBjb21tYW5kIChjb3VsZCBub3QgcmVhZCByZWdpc3RlcnMgZnJvbSBjb3JlIGZpbGUpIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJjb3JlLWZpbGUgY29tbWFuZCIgfQorICAgIHRpbWVvdXQgCQl7IGZhaWwgIih0aW1lb3V0KSBjb3JlLWZpbGUgY29tbWFuZCIgfQorfQorCisjIFRlc3QgY29ycmVjdCBtYXBwaW5nIG9mIGNvcmVmaWxlIHNlY3Rpb25zIGJ5IHByaW50aW5nIHNvbWUgdmFyaWFibGVzLgorCitnZGJfdGVzdCAicHJpbnQgY29yZW1ha2VyX2RhdGEiICJcXFwkJGRlY2ltYWwgPSAyMDIiCitnZGJfdGVzdCAicHJpbnQgY29yZW1ha2VyX2JzcyIgIlxcXCQkZGVjaW1hbCA9IDEwIgorZ2RiX3Rlc3QgInByaW50IGNvcmVtYWtlcl9ybyIgIlxcXCQkZGVjaW1hbCA9IDIwMSIKKworaWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgImhwcGEqLSotaHB1eCoiIH0KK2dkYl90ZXN0ICJwcmludCBmdW5jMjo6Y29yZW1ha2VyX2xvY2FsIiAiXFxcJCRkZWNpbWFsID0gezAsIDEsIDIsIDMsIDR9IgorCisjIFNvbWVob3cgd2UgYmV0dGVyIHRlc3QgdGhlIGFiaWxpdHkgdG8gcmVhZCB0aGUgcmVnaXN0ZXJzIG91dCBvZiB0aGUgY29yZQorIyBmaWxlIGNvcnJlY3RseS4gIEkgZG9uJ3QgdGhpbmsgdGhlIG90aGVyIHRlc3RzIGRvIHRoaXMuCisKK2dkYl90ZXN0ICJidCIgImFib3J0LipmdW5jMi4qZnVuYzEuKm1haW4uKiIgImJhY2t0cmFjZSBpbiBjb3JlZmlsZS5leHAiCisKKyMgVGVzdCBhYmlsaXR5IHRvIHJlYWQgbW1hcCdkIGRhdGEKKworZ2RiX3Rlc3QgIngvOGJkIGJ1ZjEiICIuKjouKjAuKjEuKjIuKjMuKjQuKjUuKjYuKjciICJhY2Nlc3Npbmcgb3JpZ2luYWwgbW1hcCBkYXRhIGluIGNvcmUgZmlsZSIKK3NldHVwX3hmYWlsICIqLSotc3Vub3MqIiAiKi0qLXVsdHJpeCoiICIqLSotYWl4KiIKK3NlbmRfZ2RiICJ4LzhiZCBidWYyXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qOi4qMC4qMS4qMi4qMy4qNC4qNS4qNi4qNy4qJGdkYl9wcm9tcHQgJCIgeworCXBhc3MgImFjY2Vzc2luZyBtbWFwcGVkIGRhdGEgaW4gY29yZSBmaWxlIgorICAgIH0KKyAgICAtcmUgIjB4XFtmXF0qOi4qQ2Fubm90IGFjY2VzcyBtZW1vcnkgYXQgYWRkcmVzcyAweFxbZlxdKi4qJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgImFjY2Vzc2luZyBtbWFwcGVkIGRhdGEgKG1hcHBpbmcgZmFpbGVkIGF0IHJ1bnRpbWUpIgorICAgIH0KKyAgICAtcmUgIjB4Lio6LipDYW5ub3QgYWNjZXNzIG1lbW9yeSBhdCBhZGRyZXNzIDB4LiokZ2RiX3Byb21wdCAkIiB7CisJZmFpbCAiYWNjZXNzaW5nIG1tYXBwZWQgZGF0YSAobWFwcGluZyBhZGRyZXNzIG5vdCBmb3VuZCBpbiBjb3JlIGZpbGUpIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgImFjY2Vzc2luZyBtbWFwcGVkIGRhdGEgKGluY29ycmVjdCBkYXRhIGZvdW5kIGluIGNvcmUgZmlsZSkiCisgICAgfQorICAgIHRpbWVvdXQgeworCWZhaWwgImFjY2Vzc2luZyBtbWFwcGVkIGRhdGEgKHRpbWVvdXQpIgorICAgIH0KK30KKworIyB0ZXN0IHJlaW5pdF9mcmFtZV9jYWNoZQorCitnZGJfbG9hZCAke2JpbmZpbGV9CitzZXR1cF94ZmFpbCAiKi0qLSoiCitnZGJfdGVzdCAidXAiICIjXFswLTlcXSogKlxbMC05eGEtZkgnXF0qIGluIC4qIFxcKFxcKSIgInVwIGluIGNvcmVmaWxlLmV4cCIKKworZ2RiX3Rlc3QgImNvcmUiICJObyBjb3JlIGZpbGUgbm93LiIKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY29yZW1ha2VyLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NvcmVtYWtlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjM5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2NvcmVtYWtlci5jCkBAIC0wLDAgKzEsMTIwIEBACisvKiBTaW1wbGUgbGl0dGxlIHByb2dyYW0gdGhhdCBqdXN0IGdlbmVyYXRlcyBhIGNvcmUgZHVtcCBmcm9tIGluc2lkZSBzb21lCisgICBuZXN0ZWQgZnVuY3Rpb24gY2FsbHMuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2lmbmRlZiBfX1NURENfXworI2RlZmluZQljb25zdAkvKiovCisjZW5kaWYKKworI2RlZmluZSBNQVBTSVpFICg4ICogMTAyNCkKKworLyogRG9uJ3QgbWFrZSB0aGVzZSBhdXRvbWF0aWMgdmFycyBvciB3ZSB3aWxsIGhhdmUgdG8gd2FsayBiYWNrIHVwIHRoZQorICAgc3RhY2sgdG8gYWNjZXNzIHRoZW0uICovCisKK2NoYXIgKmJ1ZjE7CitjaGFyICpidWYyOworCitpbnQgY29yZW1ha2VyX2RhdGEgPSAxOwkvKiBJbiBEYXRhIHNlY3Rpb24gKi8KK2ludCBjb3JlbWFrZXJfYnNzOwkvKiBJbiBCU1Mgc2VjdGlvbiAqLworCitjb25zdCBpbnQgY29yZW1ha2VyX3JvID0gMjAxOwkvKiBJbiBSZWFkLU9ubHkgRGF0YSBzZWN0aW9uICovCisKKy8qIE5vdGUgdGhhdCBpZiB0aGUgbWFwcGluZyBmYWlscyBmb3IgYW55IHJlYXNvbiwgd2Ugc2V0IGJ1ZjIKKyAgIHRvIC0xIGFuZCB0aGUgdGVzdHN1aXRlIG5vdGljZXMgdGhpcyBhbmQgcmVwb3J0cyBpdCBhcworICAgYSBmYWlsdXJlIGR1ZSB0byBhIG1hcHBpbmcgZXJyb3IuICBUaGlzIHdheSB3ZSBkb24ndCBoYXZlCisgICB0byB0ZXN0IGZvciBzcGVjaWZpYyBlcnJvcnMgd2hlbiBydW5uaW5nIHRoZSBjb3JlIG1ha2VyLiAqLworCit2b2lkCittbWFwZGF0YSAoKQoreworICBpbnQgaiwgZmQ7CisgIGV4dGVybiB2b2lkICptYWxsb2MgKCk7CisKKyAgLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBidWZmZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gd3JpdGUKKyAgICAgdGhlIGZpbGUgdGhhdCBpcyBsYXRlciBtYXBwZWQgaW4uICovCisKKyAgYnVmMSA9IChjaGFyICopIG1hbGxvYyAoTUFQU0laRSk7CisgIGZvciAoaiA9IDA7IGogPCBNQVBTSVpFOyArK2opCisgICAgeworICAgICAgYnVmMVtqXSA9IGo7CisgICAgfQorCisgIC8qIFdyaXRlIHRoZSBmaWxlIHRvIG1hcCBpbiAqLworCisgIGZkID0gb3BlbiAoImNvcmVtbWFwLmRhdGEiLCBPX0NSRUFUIHwgT19SRFdSLCAwNjY2KTsKKyAgaWYgKGZkID09IC0xKQorICAgIHsKKyAgICAgIHBlcnJvciAoImNvcmVtbWFwLmRhdGEgb3BlbiBmYWlsZWQiKTsKKyAgICAgIGJ1ZjIgPSAoY2hhciAqKSAtMTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIHdyaXRlIChmZCwgYnVmMSwgTUFQU0laRSk7CisKKyAgLyogTm93IG1hcCB0aGUgZmlsZSBpbnRvIG91ciBhZGRyZXNzIHNwYWNlIGFzIGJ1ZjIgKi8KKworICBidWYyID0gKGNoYXIgKikgbW1hcCAoMCwgTUFQU0laRSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKyAgaWYgKGJ1ZjIgPT0gKGNoYXIgKikgLTEpCisgICAgeworICAgICAgcGVycm9yICgibW1hcCBmYWlsZWQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogVmVyaWZ5IHRoYXQgdGhlIG9yaWdpbmFsIGRhdGEgYW5kIHRoZSBtYXBwZWQgZGF0YSBhcmUgaWRlbnRpY2FsLgorICAgICBJZiBub3QsIHdlJ2QgcmF0aGVyIGZhaWwgbm93IHRoYW4gd2hlbiB0cnlpbmcgdG8gYWNjZXNzIHRoZSBtYXBwZWQKKyAgICAgZGF0YSBmcm9tIHRoZSBjb3JlIGZpbGUuICovCisKKyAgZm9yIChqID0gMDsgaiA8IE1BUFNJWkU7ICsraikKKyAgICB7CisgICAgICBpZiAoYnVmMVtqXSAhPSBidWYyW2pdKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIm1hcHBlZCBkYXRhIGlzIGluY29ycmVjdCIpOworCSAgYnVmMiA9IChjaGFyICopIC0xOworCSAgcmV0dXJuOworCX0KKyAgICB9Cit9CisKK3ZvaWQKK2Z1bmMyICgpCit7CisgIGludCBjb3JlbWFrZXJfbG9jYWxbNV07CisgIGludCBpOworCisjaWZkZWYgU0FfRlVMTERVTVAKKyAgLyogRm9yY2UgYSBjb3JlZmlsZSB0aGF0IGluY2x1ZGVzIHRoZSBkYXRhIHNlY3Rpb24gZm9yIEFJWC4gICovCisgIHsKKyAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworCisgICAgc2lnYWN0aW9uIChTSUdBQlJULCAoc3RydWN0IHNpZ2FjdGlvbiAqKTAsICZzYSk7CisgICAgc2Euc2FfZmxhZ3MgfD0gU0FfRlVMTERVTVA7CisgICAgc2lnYWN0aW9uIChTSUdBQlJULCAmc2EsIChzdHJ1Y3Qgc2lnYWN0aW9uICopMCk7CisgIH0KKyNlbmRpZgorCisgIC8qIE1ha2Ugc3VyZSB0aGF0IGNvcmVtYWtlcl9sb2NhbCBkb2Vzbid0IGdldCBvcHRpbWl6ZWQgYXdheS4gKi8KKyAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICBjb3JlbWFrZXJfbG9jYWxbaV0gPSBpOworICBjb3JlbWFrZXJfYnNzID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICBjb3JlbWFrZXJfYnNzICs9IGNvcmVtYWtlcl9sb2NhbFtpXTsKKyAgY29yZW1ha2VyX2RhdGEgPSBjb3JlbWFrZXJfcm8gKyAxOworICBhYm9ydCAoKTsKK30KKwordm9pZAorZnVuYzEgKCkKK3sKKyAgZnVuYzIgKCk7Cit9CisKK21haW4gKCkKK3sKKyAgbW1hcGRhdGEgKCk7CisgIGZ1bmMxICgpOworfQorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Nyb3NzbG9hZC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Nyb3NzbG9hZC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiYjdhMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvY3Jvc3Nsb2FkLmV4cApAQCAtMCwwICsxLDM4MCBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEZyZWQgRmlzaC4gKGZuZkBjeWdudXMuY29tKQorIyBSb2IgU2F2b3llIGNoYW5nZWQgaXQgdG8gdXNlIGdkYl90ZXN0IChyb2JAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCisjIEZJWE1FOiBUaGUgY29uZmlndXJlLmluIGZvciB0aGlzIHRlc3Qgc2hvdWxkIGxvb2sgZm9yIC0td2l0aC10YXJnZXRzCisjIGFuZCBkZWFsIGFjY29yZGluZ2x5LiAgVW50aWwgdGhhdCBoYXMgYmVlbiBkb25lLCBza2lwIHRoZSB3aG9sZSB0aGluZy4KKyMgV2l0aCBhIG1pbmltYWwgYmZkICh0aGUgZGVmYXVsdCksIGZldyBpZiBhbnkgb2YgdGhlc2UgdGVzdHMgd29yay4KKwordmVyYm9zZSAiRklYTUU6IGFsbCB0aGUgY3Jvc3Nsb2FkIHRlc3RzIGlnbm9yZWQiCityZXR1cm4KKworZm9yZWFjaCBpICJtNjhrLWVsZiBtNjhrLWFvdXQgbTY4ay1hb3V0MiBtaXBzLWVjb2ZmIGk0ODYtZWxmIHNwYXJjLWFvdXQgaTg2MC1lbGYgc3BhcmMtZWxmIiB7CisgICAgcmVtb3RlX2V4ZWMgYnVpbGQgImNkICR7b2JqZGlyfS8ke3N1YmRpcn0gOyB1dWRlY29kZSAke3NyY2Rpcn0vJHtzdWJkaXJ9LyRpLnUgIgorfQorCisjIEZJWE1FOiBUaGVzZSB0ZXN0cyBkb24ndCB3b3JrIGZvciB0aGUgaTk2MCwgYmVjYXVzZQorIyBiZmQvY29uZmlnL2k5NjAtYm91dC5tdCBzZXRzIFNFTEVDVF9WRUNTLiAgSSBjb3VsZCB1c2Ugc2V0dXBfeGZhaWwKKyMgZm9yIGVhY2ggdGVzdCwgYnV0IHJlYm9vdGluZyB0aGUgYm9hcmQgYmV0d2VlbiBlYWNoIG9uZSB0YWtlcyBhIGxvbmcKKyMgdGltZSBzbyBJJ20ganVzdCBwdW50aW5nIHRoZSB3aG9sZSBmaWxlLgoraWYgW2lzdGFyZ2V0ICJpOTYwLSotKiJdIHRoZW4geworICAgIGlmICR2ZXJib3NlPjEgdGhlbiB7CisJd2FybmluZyAiRklYTUU6IGNyb3NzbG9hZCB0ZXN0IGNhc2UgZG9lc24ndCBydW4gb24gdGhlIGk5NjAuIgorICAgIH0KKyAgICBjb250aW51ZQorfQorCisjIEZJWE1FOiBUaGVzZSB0ZXN0cyBkb24ndCB3b3JrIGZvciB0aGUgYTI5aywgYmVjYXVzZSBTRUxFQ1RfVkVDUyBpcworIyB1c2VkIHdoZW4gY29tcGlsaW5nIGJmZC4gIEl0IHdvdWxkIGJlIG5pY2UgaWYgdGhlcmUgd2VyZSBzb21lIGJldHRlcgorIyB3YXkgb2YgZGV0ZWN0aW5nIHRoaXMgY2FzZS4KK2lmIFtpc3RhcmdldCAiYTI5ay0qLSoiXSB0aGVuIHsKKyAgICBpZiAkdmVyYm9zZT4xIHRoZW4geworCXdhcm5pbmcgIkZJWE1FOiBjcm9zc2xvYWQgdGVzdCBjYXNlIGRvZXNuJ3QgcnVuIG9uIHRoZSBhMjlrLiIKKyAgICB9CisgICAgY29udGludWUKK30KKworIyBUZXN0IGlmIGdkYiBjYW4gYXV0b21hdGljYWxseSBkZXRlcm1pbmUgdGhlIGJmZCBmb3JtYXQgb2YgYW4KKyMgZXhlY3V0YWJsZSBhbmQgcmVhZCBpdCdzIHN5bWJvbHMuCisKK3Byb2MgYmZkZGVmYXVsdCB7fSB7CisgICAgZ2xvYmFsIEdEQgorICAgIGdsb2JhbCBHREJGTEFHUworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIG9iamRpcgorICAgIGdsb2JhbCBzdWJkaXIKKyAgICBnbG9iYWwgYmluZmlsZQorICAgIGdsb2JhbCBiZmRmb3JtYXQKKyAgICBnbG9iYWwgZmlsZV9sb2FkZWQKKworICAgIGdkYl91bmxvYWQKKyAgICBzZXQgZmlsZV9sb2FkZWQgMAorICAgIHNlbmRfZ2RiICJmaWxlICRvYmpkaXIvJHN1YmRpci8kYmluZmlsZVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiQSBwcm9ncmFtIGlzIGJlaW5nIGRlYnVnZ2VkIGFscmVhZHkuICBLaWxsIGl0Lip5IG9yIG4uIiB7CisJICAgIHNlbmRfZ2RiICJ5XG4iCisJICAgIGV4cF9jb250aW51ZQorCX0KKwktcmUgIlJlYWRpbmcgc3ltYm9scyBmcm9tICRvYmpkaXIvJHN1YmRpci8kYmluZmlsZVxbLlxdK2RvbmVcLi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgYXV0byBmb3JtYXQiCisJfQorCS1yZSAiUmVhZGluZyBzeW1ib2xzIGZyb20gJG9iamRpci8kc3ViZGlyLyRiaW5maWxlXFsuXF0rLm5vIGRlYnVnZ2luZyBzeW1ib2xzIGZvdW5kLlxbLlxdK2RvbmVcLi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgYXV0byBmb3JtYXQgKGJ1dCBubyBzeW1ib2xzIGZvdW5kKSIKKwl9CisJLXJlICJGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZC4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgYXV0byBmb3JtYXQgKGZvcm1hdCBub3QgcmVjb2duaXplZCkiCisJICAgIHJldHVybgorCX0KKwktcmUgIkZpbGUgZm9ybWF0IGlzIGFtYmlndW91cy4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgYXV0byBmb3JtYXQgKGZvcm1hdCBpcyBhbWJpZ3VvdXMpIgorCSAgICByZXR1cm4KKwl9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBhdXRvIGZvcm1hdCIKKwkgICAgcmV0dXJuCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICIodGltZW91dCkgJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGF1dG8gZm9ybWF0IgorCSAgICByZXR1cm4KKwl9CQorICAgIH0KKworICAgIGlmIFtnZGJfdGVzdCAiaW5mbyB0YXJnZXQiICIuKmZpbGUgdHlwZSAkYmZkZm9ybWF0IiAiIl09PTAgdGhlbiB7CisJc2V0IGZpbGVfbG9hZGVkIDEKKyAgICB9IGVsc2UgeworCWZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSB3cm9uZyBmb3JtYXQgZm91bmQiCisgICAgfQorfQorCisjIFRlc3QgaWYgZ2RiIGNhbiByZWFkIHN5bWJvbHMgZnJvbSBhbiBleGVjdXRhYmxlIHdoZW4gdGhlIGJmZCBmb3JtYXQKKyMgaXMgZXhwbGljaXRseSBzZXQgdmlhIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBHTlVUQVJHRVQuCisKK3Byb2MgYmZkZXhwbGljaXQge30geworICAgIGdsb2JhbCBHREIKKyAgICBnbG9iYWwgR0RCRkxBR1MKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBzdWJkaXIKKyAgICBnbG9iYWwgb2JqZGlyCisgICAgZ2xvYmFsIGRldF9maWxlCisgICAgZ2xvYmFsIGJpbmZpbGUKKyAgICBnbG9iYWwgYmZkZm9ybWF0CisgICAgZ2xvYmFsIGZpbGVfbG9hZGVkCisKKyAgICBnZGJfdW5sb2FkCisgICAgc2V0IGZpbGVfbG9hZGVkIDAKKworICAgICMgT25jZSBHREIgNC4xMCAodGhlIGxhc3QgdG8gbGFjayBgc2V0IGdudXRhcmdldCcpIGlzIGZvcmdvdHRlbiwKKyAgICAjIGNoYW5nZSB0aGlzIHRvIHVzZSBzZXQgZ251dGFyZ2V0LgorICAgaWYgW2dkYl90ZXN0ICJzZXQgZW52IEdOVVRBUkdFVD0kYmZkZm9ybWF0IiAiIiAiIl0hPTAgdGhlbiB7CisgICAgICAgZmFpbCAic2V0dGluZyBHTlVUQVJHRVQ9JGJmZGZvcm1hdCBpbiBlbnZpcm9ubWVudCIKKyAgICAgICByZXR1cm4KKyAgICB9CisKKyAgICBzZW5kX2dkYiAiZmlsZSAkb2JqZGlyLyRzdWJkaXIvJGJpbmZpbGVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIkEgcHJvZ3JhbSBpcyBiZWluZyBkZWJ1Z2dlZCBhbHJlYWR5LiAgS2lsbCBpdC4qeSBvciBuLiIgeworCSAgICBzZW5kX2dkYiAieVxuIgorCSAgICBleHBfY29udGludWUKKwl9CisJLXJlICJSZWFkaW5nIHN5bWJvbHMgZnJvbSAkb2JqZGlyLyRzdWJkaXIvJGJpbmZpbGVcWy5cXStkb25lXC4uKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGV4cGxpY2l0IGZvcm1hdCIKKwl9CisJLXJlICJJbnZhbGlkIHRhcmdldC4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgZXhwbGljaXQgZm9ybWF0IChpbnZhbGlkIHRhcmdldCkiCisJICAgIHJldHVybgorCX0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGV4cGxpY2l0IGZvcm1hdCIKKwkgICAgcmV0dXJuCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICIodGltZW91dCkgJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGV4cGxpY2l0IGZvcm1hdCIKKwkgICAgcmV0dXJuCisJfQkKKyAgICB9CisKKyAgICBzZXQgZmlsZV9sb2FkZWQgMQorfQorCitwcm9jIHRlc3RfcHR5cGVfZnVuY3Rpb25zIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBiaW5maWxlCisgICAgZ2xvYmFsIGJmZGZvcm1hdAorICAgIGdsb2JhbCBkZXRfZmlsZQorICAgIHNlbmRfZ2RiICJwdHlwZSBtYWluXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gaW50IFxbKShcXStcclxuJGdkYl9wcm9tcHQgJCIge30KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpICRiaW5maWxlICgkYmZkZm9ybWF0KSBmdW5jdGlvbiBtYWluIiA7IHJldHVybiB9CisgICAgfQorCisgICAgIyBzZXQgdXAgYSBsaXN0IG9mIGxpc3RzIG9mIGNvbW1hbmQgYW5kIHBhdHRlcm5zCisgICAgc2V0IGNvbW1hbmQgW2xpc3QgeyAicHR5cGUgdl9jaGFyX2Z1bmMiICJ0eXBlID0oXCB1bnNpZ25lZFwgfFwgc2lnbmVkXCB8XCApY2hhciBcWykoXF0rIiB9XAorCSAgICAgICAgeyAicHR5cGUgdl9zaG9ydF9mdW5jIiAidHlwZSA9IChzaG9ydHxzaG9ydCBpbnQpIFxbKShcXSsiIH0gXAorICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfaW50X2Z1bmMiICJ0eXBlID0gaW50IFxbKShcXSsiIH0gXAorICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfbG9uZ19mdW5jIiAidHlwZSA9IChsb25nfGxvbmcgaW50fGludCkgXFspKFxdKyIgfSBcCisgICAgICAgICAgICAgICAgeyAicHR5cGUgdl9mbG9hdF9mdW5jIiAidHlwZSA9IGZsb2F0IFxbKShcXSsiIH0gXAorICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfZG91YmxlX2Z1bmMiICJ0eXBlID0gZG91YmxlIFxbKShcXSsiIH0gXQorCisgICAgZm9yZWFjaCBpICRjb21tYW5kIHsKKwlpZiBbZ2RiX3Rlc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDFdICIiXSB0aGVuIHsKKwkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIFwiW2xpbmRleCAkaSAwXVwiIGZ1bmN0aW9uIHR5cGVzIgorCSAgICByZXR1cm4KKwl9CisgICAgfQorICAgIHBhc3MgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBwdHlwZSBmdW5jdGlvbiB0eXBlcyIKK30KKworIyBOb3RlIHRoYXQgcGxhaW4gY2hhcnMgY2FuIGJlIGVpdGhlciBzaWduZWQgb3IgdW5zaWduZWQuCisKK3Byb2MgdGVzdF9wdHlwZV9wbGFpbl90eXBlcyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgYmluZmlsZQorICAgIGdsb2JhbCBiZmRmb3JtYXQKKworICAgICMgc2V0IHVwIGEgbGlzdCBvZiBsaXN0cyBvZiBjb21tYW5kIGFuZCBwYXR0ZXJucworICAgIHNldCBjb21tYW5kIFtsaXN0IHsgInB0eXBlIHZfY2hhciIgInR5cGUgPShcIHVuc2lnbmVkXCB8XCBzaWduZWRcIHxcICljaGFyIiB9XAorCSAgICAgICAgeyAicHR5cGUgdl9zaG9ydCIgInR5cGUgPSBzaG9ydCIgfSBcCisgICAgICAgICAgICAgICAgeyAicHR5cGUgdl9pbnQiICJ0eXBlID0gaW50IiB9IFwKKyAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2xvbmciICJ0eXBlID0gbG9uZyIgfSBcCisgICAgICAgICAgICAgICAgeyAicHR5cGUgdl9mbG9hdCIgInR5cGUgPSBmbG9hdCIgfSBcCisgICAgICAgICAgICAgICAgeyAicHR5cGUgdl9kb3VibGUiICJ0eXBlID0gZG91YmxlIiB9IF0KKworICAgIGZvcmVhY2ggaSAkY29tbWFuZCB7CisJaWYgW2dkYl90ZXN0IFtsaW5kZXggJGkgMF0gW2xpbmRleCAkaSAxXSAiIl0gdGhlbiB7CisJICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBcIltsaW5kZXggJGkgMF1cIiBwbGFpbiBDIHR5cGVzIgorCSAgICByZXR1cm4KKyAgICB9CisgICAgfQorICAgIHBhc3MgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBwdHlwZSBwbGFpbiBDIHR5cGVzIgorfQorCisjIE5vdGUgdGhhdCBpZiBjb21waWxlZCB3aXRoIHByZS1BTlNJIGNvbXBpbGVycywgdGhlICJzaWduZWQiIGtleXdvcmRzIGFyZQorIyBkZWZpbmVkIGF3YXkgYW5kIHRoZSB2YXJpYWJsZXMgZGVmYXVsdCB0byBwbGFpbiB0eXBlcy4gIFNvIGFjY2VwdCBlaXRoZXIuCisKK3Byb2MgdGVzdF9wdHlwZV9zaWduZWRfdHlwZXMge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGJpbmZpbGUKKyAgICBnbG9iYWwgYmZkZm9ybWF0CisgICAgZ2xvYmFsIGRldF9maWxlCisKKyAgICAjIHNldCB1cCBhIGxpc3Qgb2YgbGlzdHMgb2YgY29tbWFuZCBhbmQgcGF0dGVybnMKKyAgICBzZXQgY29tbWFuZCBbbGlzdCB7ICJwdHlwZSB2X3NpZ25lZF9jaGFyIiAidHlwZSA9KFwgc2lnbmVkXCB8XCApY2hhciIgfVwKKwkgICAgICAgIHsgInB0eXBlIHZfc2lnbmVkX3Nob3J0IiAgInR5cGUgPShcIHNpZ25lZFwgfFwgKXNob3J0IiB9IFwKKyAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X3NpZ25lZF9pbnQiICJ0eXBlID0oXCBzaWduZWRcIHxcIClpbnQiIH0gXAorICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfc2lnbmVkX2xvbmciICJ0eXBlID0oXCBzaWduZWRcIHxcIClsb25nIiB9IF0KKworICAgIGZvcmVhY2ggaSAkY29tbWFuZCB7CisJaWYgW2dkYl90ZXN0IFtsaW5kZXggJGkgMF0gW2xpbmRleCAkaSAxXSAiIl0gdGhlbiB7CisJICAgIGlmIFtleHByIFtzdHJpbmcgbWF0Y2ggImVjb2ZmLWJpZ21pcHMiICRiZmRmb3JtYXRdK1tzdHJpbmcgbWF0Y2ggInB0eXBlIHZfc2lnbmVkX2NoYXIiIFtsaW5kZXggJGkgMF1dXT09MiB0aGVuIHsKKwkJc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICB9CisJICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBcIltsaW5kZXggJGkgMF1cIiBzaWduZWQgQyB0eXBlcyIKKwkgICAgcmV0dXJuCisJfQorICAgIH0KKyAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgcHR5cGUgc2lnbmVkIEMgdHlwZXMiCit9CisKK3Byb2MgdGVzdF9wdHlwZV91bnNpZ25lZF90eXBlcyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgYmluZmlsZQorICAgIGdsb2JhbCBiZmRmb3JtYXQKKyAgICBnbG9iYWwgZGV0X2ZpbGUKKworICAgICMgc2V0IHVwIGEgbGlzdCBvZiBsaXN0cyBvZiBjb21tYW5kIGFuZCBwYXR0ZXJucworICAgIHNldCBjb21tYW5kIFtsaXN0IHsgInB0eXBlIHZfdW5zaWduZWRfY2hhciIgInR5cGUgPSB1bnNpZ25lZCBjaGFyIiB9XAorCSAgICAgICAgeyAicHR5cGUgdl91bnNpZ25lZF9zaG9ydCIgXAorCQkgICJ0eXBlID0gKHVuc2lnbmVkIHNob3J0fHNob3J0IHVuc2lnbmVkIGludCkiIH0gXAorICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfdW5zaWduZWRfaW50IiAidHlwZSA9IHVuc2lnbmVkIGludCIgfSBcCisgICAgICAgICAgICAgICAgeyAicHR5cGUgdl91bnNpZ25lZF9sb25nIiBcCisJCSAgInR5cGUgPSAodW5zaWduZWQgbG9uZ3xsb25nIHVuc2lnbmVkIGludCkiIH0gXQorCisgICAgZm9yZWFjaCBpICRjb21tYW5kIHsKKwlpZiBbZ2RiX3Rlc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDFdICIiXSB0aGVuIHsKKwkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIFwiW2xpbmRleCAkaSAwXVwiIHVuc2lnbmVkIEMgdHlwZXMiCisJICAgIHJldHVybgorCX0KKyAgICB9CisgICAgcGFzcyAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIHB0eXBlIHVuc2lnbmVkIEMgdHlwZXMiCit9CisKKyMgTm90ZSB0aGF0IHBsYWluIGNoYXJzIGNhbiBiZSBlaXRoZXIgc2lnbmVkIG9yIHVuc2lnbmVkLgorCitwcm9jIHRlc3RfcHR5cGVfYXJyYXlfdHlwZXMge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGJpbmZpbGUKKyAgICBnbG9iYWwgYmZkZm9ybWF0CisgICAgZ2xvYmFsIGRldF9maWxlCisKKyAgICAjIHNldCB1cCBhIGxpc3Qgb2YgbGlzdHMgb2YgY29tbWFuZCBhbmQgcGF0dGVybnMKKyAgICBzZXQgY29tbWFuZCBbbGlzdCB7ICJwdHlwZSB2X2NoYXJfYXJyYXkiICJ0eXBlID0oXCB1bnNpZ25lZFwgfFwgc2lnbmVkXCB8XCApY2hhciBcXFxbMlxcXF0iIH1cCisJICAgICAgICB7ICJwdHlwZSB2X3Nob3J0X2FycmF5IiAgXAorCQkgICJ0eXBlID0gKHNob3J0fHNob3J0IGludCkgXFxcWzJcXFxdIiB9IFwKKyAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2ludF9hcnJheSIgInR5cGUgPSBpbnQgXFxcWzJcXFxdIiB9IFwKKyAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2xvbmdfYXJyYXkiICJ0eXBlID0gKGxvbmd8bG9uZyBpbnQpIFxcXFsyXFxcXSIgfSBcCisgICAgICAgICAgICAgICAgeyAicHR5cGUgdl9mbG9hdF9hcnJheSIgInR5cGUgPSBmbG9hdCBcXFxbMlxcXF0iIH0gXAorICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfZG91YmxlX2FycmF5IiAidHlwZSA9IGRvdWJsZSBcXFxbMlxcXF0iIH0gXQorCisgICAgZm9yZWFjaCBpICRjb21tYW5kIHsKKwlpZiBbZ2RiX3Rlc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDFdICIiXSB0aGVuIHsKKwkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIFwiW2xpbmRleCAkaSAwXVwiIEMgYXJyYXkgdHlwZXMiCisJICAgIHJldHVybgorCX0KKyAgICB9CisgICAgcGFzcyAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIHB0eXBlIEMgYXJyYXkgdHlwZXMiCit9CisKK3Byb2MgdGVzdF9wdHlwZV9wb2ludGVyX3R5cGVzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBiaW5maWxlCisgICAgZ2xvYmFsIGJmZGZvcm1hdAorICAgIGdsb2JhbCBkZXRfZmlsZQorCisgICAgIyBzZXQgdXAgYSBsaXN0IG9mIGxpc3RzIG9mIGNvbW1hbmQgYW5kIHBhdHRlcm5zCisgICAgc2V0IGNvbW1hbmQgW2xpc3QgeyAicHR5cGUgdl9jaGFyX3BvaW50ZXIiICJ0eXBlID0oXCB1bnNpZ25lZFwgfFwgc2lnbmVkXCB8XCApY2hhciBcKiIgfVwKKwkgICAgICAgIHsgInB0eXBlIHZfc2hvcnRfcG9pbnRlciIgICJ0eXBlID0gKHNob3J0fHNob3J0IGludCkgXCoiIH0gXAorICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfaW50X3BvaW50ZXIiICJ0eXBlID0gaW50IFwqIiB9IFwKKyAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2xvbmdfcG9pbnRlciIgInR5cGUgPSAobG9uZ3xsb25nIGludCkgXCoiIH0gXAorICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfZmxvYXRfcG9pbnRlciIgInR5cGUgPSBmbG9hdCBcKiIgfSBcCisgICAgICAgICAgICAgICAgeyAicHR5cGUgdl9kb3VibGVfcG9pbnRlciIgInR5cGUgPSBkb3VibGUgXCoiIH0gXQorCisgICAgZm9yZWFjaCBpICRjb21tYW5kIHsKKwlpZiBbZ2RiX3Rlc3QgW2xpbmRleCAkaSAwXSBbbGluZGV4ICRpIDFdICIiXSB0aGVuIHsKKwkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIFwiW2xpbmRleCAkaSAwXVwiIEMgcG9pbnRlciB0eXBlcyIKKwkgICAgcmV0dXJuCisJfQorICAgIH0KKyAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgcHR5cGUgQyBwb2ludGVyIHR5cGVzIgorfQorCitwcm9jIGxvYWRhbmR0ZXN0IHsgYXJncyB9IHsKKyAgICBnbG9iYWwgdmVyYm9zZQorICAgIGdsb2JhbCBHREIKKyAgICBnbG9iYWwgR0RCRkxBR1MKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBzdWJkaXIKKyAgICBnbG9iYWwgb2JqZGlyCisgICAgZ2xvYmFsIGJpbmZpbGUKKyAgICBnbG9iYWwgYmZkZm9ybWF0CisgICAgZ2xvYmFsIGZpbGVfbG9hZGVkCisKKyAgICBzZXQgYmluZmlsZSBbIGxpbmRleCAkYXJncyAwIF0KKyAgICBzZXQgYmZkZm9ybWF0IFsgbGluZGV4ICRhcmdzIDEgXQorICAgIHNldCBmaXhtZSBbIGxpbmRleCAkYXJncyAyIF0KKworICAgIGlmICFbZmlsZSBleGlzdHMgJG9iamRpci8kc3ViZGlyLyRiaW5maWxlXSB0aGVuIHsKKyAgICAgICAgcGVycm9yICIkb2JqZGlyLyRzdWJkaXIvJGJpbmZpbGUgZG9lcyBub3QgZXhpc3QiCisJcmV0dXJuIDAKKyAgICB9CisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKyAgICBpZiAkZml4bWUgdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorICAgIGJmZGRlZmF1bHQKKyAgICBpZiAkZml4bWUgdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorICAgIGlmIFtzdHJpbmcgbWF0Y2ggJGJmZGZvcm1hdCAiZWxmLWJpZyJdIHRoZW4geworCWlmIFtzdHJpbmcgbWF0Y2ggJGJpbmZpbGUgImk4NjAtZWxmIl0gdGhlbiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwl9CisgICAgfQorICAgIGJmZGV4cGxpY2l0CisgICAgaWYgJGZpbGVfbG9hZGVkPT0xIHRoZW4geworCXRlc3RfcHR5cGVfZnVuY3Rpb25zCisgICAgICAgIGlmICRmaXhtZSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisJdGVzdF9wdHlwZV9wbGFpbl90eXBlcworICAgICAgICBpZiAkZml4bWUgdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorCXRlc3RfcHR5cGVfc2lnbmVkX3R5cGVzCisgICAgICAgIGlmICRmaXhtZSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CisJdGVzdF9wdHlwZV91bnNpZ25lZF90eXBlcworICAgICAgICBpZiAkZml4bWUgdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorCXRlc3RfcHR5cGVfYXJyYXlfdHlwZXMKKyAgICAgICAgaWYgJGZpeG1lIHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KKwl0ZXN0X3B0eXBlX3BvaW50ZXJfdHlwZXMKKyAgICB9Cit9CisKKyMgUnVuIHRlc3RzIGZvciBlYWNoIG9mIHRoZSB0ZXN0IGV4ZWN1dGFibGVzLgorIyBJZiB0aGUgdGhpcmQgYXJndW1lbnQgaXMgMSwgdGhlIHRlc3RzIHdpbGwgYmUgZXhwZWN0ZWQgdG8gZmFpbC4KKyMgV2Ugc2hvdWxkIGV4dHJhY3QgdGhlIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSB0ZXN0cyBhbmQgYmZkIGZvcm1hdHMKKyMgZnJvbSB0aGUgbWFrZWZpbGUgb3Igc29tZSBvdGhlciBjb250cm9sIGZpbGUgKEZJWE1FKS4KKworbG9hZGFuZHRlc3QgbTY4ay1lbGYJImVsZjMyLW02OGsiCQkwCisKKyMgSSdtIGdldHRpbmcgYW4gWFBBU1MgZm9yIGV4cGxpY2l0IGZvcm1hdCBvbiB0aGlzIG9uZQorbG9hZGFuZHRlc3QgbTY4ay1hb3V0CSJhLm91dC1uZXdzb3MzIgkJMQorCitsb2FkYW5kdGVzdCBtNjhrLWFvdXQyCSJhLm91dC1zdW5vcy1iaWciCTAKK2xvYWRhbmR0ZXN0IG1pcHMtZWNvZmYJImVjb2ZmLWJpZ21pcHMiCQkwCitsb2FkYW5kdGVzdCBpNDg2LWVsZgkiZWxmMzItaTM4NiIJCTAKK2xvYWRhbmR0ZXN0IHNwYXJjLWFvdXQJImEub3V0LXN1bm9zLWJpZyIJMAorbG9hZGFuZHRlc3Qgc3BhcmMtZWxmCSJlbGYzMi1zcGFyYyIJCTAKKworI0ZJWE1FOiAgaTg2MCBzdXBwb3J0IGlzIHVubGlrZWx5IHRvIGJlIHdvcmtpbmcgaW4gdGhlIG5lYXIgZnV0dXJlCisjIHNvIHN1cHByZXNzIHRoaXMgdGVzdCB1bnRpbCBpdCBpcyB3b3JraW5nLiAgLWZuZgorI2xvYWRhbmR0ZXN0IGk4NjAtZWxmCSJlbGYzMi1pODYwIgkJMAorCitnZGJfdGVzdCAic2V0IGdudXRhcmdldCBhdXRvIiAiIgpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9kMTB2LmxkIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9kMTB2LmxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNGMzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2QxMHYubGQKQEAgLTAsMCArMSwxNTUgQEAKK09VVFBVVF9GT1JNQVQoImVsZjMyLWQxMHYiLCAiZWxmMzItZDEwdiIsCisJICAgICAgImVsZjMyLWQxMHYiKQorT1VUUFVUX0FSQ0goZDEwdikKK0VOVFJZKF9zdGFydCkKKyBTRUFSQ0hfRElSKC91c3IvY3lnbnVzL2QxMHYtOTYxMjMwL0gtc3BhcmMtc3VuLXN1bm9zNC4xLy9saWIpOworLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitTRUNUSU9OUworeworICAvKiBPdmVybGF5IHNlY3Rpb25zOiAqLworICAub3ZseTAgIDB4MDEwMTAwMDAgOiBBVCAoMHgxMjAxMDAwMCkgeyBmb28ubygudGV4dCkgIH0KKyAgLm92bHkxICAweDAxMDEwMDAwIDogQVQgKDB4MTIwMTEwMDApIHsgYmFyLm8oLnRleHQpICB9CisgIC5vdmx5MiAgMHgwMTAxMTAwMCA6IEFUICgweDEyMDEyMDAwKSB7IGJhei5vKC50ZXh0KSAgfQorICAub3ZseTMgIDB4MDEwMTEwMDAgOiBBVCAoMHgxMjAxMzAwMCkgeyBncmJ4Lm8oLnRleHQpIH0KKyAgLmRhdGEwMCAweDAwMDAxMDAwIDogQVQgKDB4MTIwMTQwMDApIHsgZm9vLm8oLmRhdGEpICB9CisgIC5kYXRhMDEgMHgwMDAwMTAwMCA6IEFUICgweDEyMDE1MDAwKSB7IGJhci5vKC5kYXRhKSAgfQorICAuZGF0YTAyIDB4MDAwMDIwMDAgOiBBVCAoMHgxMjAxNjAwMCkgeyBiYXoubyguZGF0YSkgIH0KKyAgLmRhdGEwMyAweDAwMDAyMDAwIDogQVQgKDB4MTIwMTcwMDApIHsgZ3JieC5vKC5kYXRhKSB9CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLworICAuID0gMHgwMDAwMDAwNDsKKyAgLmludGVycCAgICAgOiB7ICooLmludGVycCkgCX0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KKyAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KKyAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KKyAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQorICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQorICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KKyAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5pbml0ICAgICAgOiB7ICooLnJlbC5pbml0KQl9CisgIC5yZWxhLmluaXQgICAgIDogeyAqKC5yZWxhLmluaXQpCX0KKyAgLnJlbC5maW5pICAgICAgOiB7ICooLnJlbC5maW5pKQl9CisgIC5yZWxhLmZpbmkgICAgIDogeyAqKC5yZWxhLmZpbmkpCX0KKyAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9CisgIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KKyAgLnBsdCAgICAgIDogeyAqKC5wbHQpCX0KKyAgLnJvZGF0YSAgICA6IHsgKigucm9kYXRhKSAqKC5nbnUubGlua29uY2UuciopIH0KKyAgLnJvZGF0YTEgICA6IHsgKigucm9kYXRhMSkgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICAqLworICAuID0gQUxJR04oNCk7CisgIC5kYXRhICAgIDoKKyAgeworICAgICooLmRhdGEpCisgICAgKiguZ251LmxpbmtvbmNlLmQqKQorICAgIF9vdmx5X3RhYmxlID0gLjsgCisJTE9ORyhBQlNPTFVURShBRERSKC5vdmx5MCkpKTsKKwlMT05HKFNJWkVPRigub3ZseTApKTsKKwlMT05HKExPQURBRERSKC5vdmx5MCkpOworCUxPTkcoMCk7CisJTE9ORyhBQlNPTFVURShBRERSKC5vdmx5MSkpKTsKKwlMT05HKFNJWkVPRigub3ZseTEpKTsKKwlMT05HKExPQURBRERSKC5vdmx5MSkpOworCUxPTkcoMCk7CisJTE9ORyhBQlNPTFVURShBRERSKC5vdmx5MikpKTsKKwlMT05HKFNJWkVPRigub3ZseTIpKTsKKwlMT05HKExPQURBRERSKC5vdmx5MikpOworCUxPTkcoMCk7CisJTE9ORyhBQlNPTFVURShBRERSKC5vdmx5MykpKTsKKwlMT05HKFNJWkVPRigub3ZseTMpKTsKKwlMT05HKExPQURBRERSKC5vdmx5MykpOworCUxPTkcoMCk7CisJTE9ORyhBQlNPTFVURShBRERSKC5kYXRhMDApKSk7CisJTE9ORyhTSVpFT0YoLmRhdGEwMCkpOworCUxPTkcoTE9BREFERFIoLmRhdGEwMCkpOworCUxPTkcoMCk7CisJTE9ORyhBQlNPTFVURShBRERSKC5kYXRhMDEpKSk7CisJTE9ORyhTSVpFT0YoLmRhdGEwMSkpOworCUxPTkcoTE9BREFERFIoLmRhdGEwMSkpOworCUxPTkcoMCk7CisJTE9ORyhBQlNPTFVURShBRERSKC5kYXRhMDIpKSk7CisJTE9ORyhTSVpFT0YoLmRhdGEwMikpOworCUxPTkcoTE9BREFERFIoLmRhdGEwMikpOworCUxPTkcoMCk7CisJTE9ORyhBQlNPTFVURShBRERSKC5kYXRhMDMpKSk7CisJTE9ORyhTSVpFT0YoLmRhdGEwMykpOworCUxPTkcoTE9BREFERFIoLmRhdGEwMykpOworCUxPTkcoMCk7CisgICAgX25vdmx5cyA9IC47CisJTE9ORygoX25vdmx5cyAtIF9vdmx5X3RhYmxlKSAvIDE2KTsKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICAuZGF0YTEgICA6IHsgKiguZGF0YTEpIH0KKyAgLmN0b3JzICAgICAgICAgOgorICB7CisgICAgKiguY3RvcnMpCisgIH0KKyAgLmR0b3JzICAgICAgICAgOgorICB7CisgICAgKiguZHRvcnMpCisgIH0KKyAgLmdvdCAgICAgICAgICAgOiB7ICooLmdvdC5wbHQpICooLmdvdCkgfQorICAuZHluYW1pYyAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cworICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCisgICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCisgIC5zZGF0YSAgICAgOiB7ICooLnNkYXRhKSB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuc2JzcyAgICAgIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgfQorICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50IDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIC5kZWJ1ZyBEV0FSRiBzZWN0aW9uIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgICBzZWN0aW9uIHNvIHdlIGJlZ2luIC5kZWJ1ZyBhdCAwLiAgSXQncyBub3QgY2xlYXIgeWV0IHdoYXQgbmVlZHMgdG8gaGFwcGVuCisgICAgIGZvciB0aGUgb3RoZXJzLiAgICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAgLiAgKi8KKyAgLyogSG1tbSwgdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5LiAgVGhpcyBzZXRzIHRoZSBzdGFjayB0byB0aGUKKyAgICAgdG9wIG9mIHRoZSBzaW11bGF0b3IgbWVtb3J5IChpLmUuIHRvcCBvZiA2NEsgZGF0YSBzcGFjZSkuICovCisgIC5zdGFjayAweDAwMDA3RkZFIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfQorICAudGV4dCAgICAweDEwMDAwMDAgOgorICB7CisgICAgKiguaW5pdCkKKyAgICAqKC5maW5pKQorICAgICooLnRleHQpCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgICAgKiguZ251LmxpbmtvbmNlLnQqKQorICB9ID0wCisgIF9ldGV4dCA9IC47CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2QxMHZvdmx5LmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2QxMHZvdmx5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiOTBmZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvZDEwdm92bHkuYwpAQCAtMCwwICsxLDIyNSBAQAorCisvKgorICogT3ZseW1nci5jIC0tIFJ1bnRpbWUgT3ZlcmxheSBNYW5hZ2VyIGZvciB0aGUgR0RCIHRlc3RzdWl0ZS4KKyAqLworCisjaW5jbHVkZSAib3ZseW1nci5oIgorCisvKiBMb2NhbCBmdW5jdGlvbnMgYW5kIGRhdGE6ICovCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIF9vdmx5X3RhYmxlW11bNF07CitleHRlcm4gdW5zaWduZWQgbG9uZyBfbm92bHlzIF9fYXR0cmlidXRlX18gKChzZWN0aW9uICgiLmRhdGEiKSkpOworZW51bSBvdmx5X2luZGV4IHsgVk1BLCBTSVpFLCBMTUEsIE1BUFBFRH07CisKK3N0YXRpYyB2b2lkIG92bHlfY29weSAodW5zaWduZWQgbG9uZyBkc3QsIHVuc2lnbmVkIGxvbmcgc3JjLCBsb25nIHNpemUpOworCisvKiBGbHVzaCB0aGUgZGF0YSBhbmQgaW5zdHJ1Y3Rpb24gY2FjaGVzIGF0IGFkZHJlc3MgU1RBUlQgZm9yIFNJWkUgYnl0ZXMuCisgICBTdXBwb3J0IGZvciBlYWNoIG5ldyBwb3J0IG11c3QgYmUgYWRkZWQgaGVyZS4gICovCisvKiBGSVhNRTogTWlnaHQgYmUgYmV0dGVyIHRvIGhhdmUgYSBzdGFuZGFyZCBsaWJnbG9zcyBmdW5jdGlvbiB0aGF0CisgICBwb3J0cyBwcm92aWRlIHRoYXQgd2UgY2FuIHRoZW4gdXNlLiAgVXNlIGxpYmdsb3NzIGluc3RlYWQgb2YgbmV3bGliCisgICBzaW5jZSBsaWJnbG9zcyBpcyB0aGUgb25lIGludGVuZGVkIHRvIGhhbmRsZSBsb3cgbGV2ZWwgc3lzdGVtIGlzc3Vlcy4KKyAgIEkgd291bGQgc3VnZ2VzdCBzb21ldGhpbmcgbGlrZSBfZmx1c2hfY2FjaGUgdG8gYXZvaWQgdGhlIHVzZXIncyBuYW1lc3BhY2UKKyAgIGJ1dCBub3QgYmUgY29tcGxldGVseSBvYnNjdXJlIGFzIG90aGVyIHRoaW5ncyBtYXkgbmVlZCB0aGlzIGZhY2lsaXR5LiAgKi8KKyAKK3N0YXRpYyB2b2lkCitGbHVzaENhY2hlICh2b2lkKQoreworI2lmZGVmIF9fTTMyUl9fCisgIHZvbGF0aWxlIGNoYXIgKm1zcHIgPSAoY2hhciAqKSAweGZmZmZmZmY3OworICAqbXNwciA9IDE7CisjZW5kaWYKK30KKworLyogT3ZlcmxheUxvYWQ6CisgKiBDb3B5IHRoZSBvdmVybGF5IGludG8gaXRzIHJ1bnRpbWUgcmVnaW9uLAorICogYW5kIG1hcmsgdGhlIG92ZXJsYXkgYXMgIm1hcHBlZCIuCisgKi8KKworYm9vbAorT3ZlcmxheUxvYWQgKHVuc2lnbmVkIGxvbmcgb3ZseW5vKQoreworICB1bnNpZ25lZCBsb25nIGk7CisKKyAgaWYgKG92bHlubyA8IDAgfHwgb3ZseW5vID49IF9ub3ZseXMpCisgICAgZXhpdCAoLTEpOwkvKiBmYWlsLCBiYWQgb3ZseSBudW1iZXIgKi8KKworICBpZiAoX292bHlfdGFibGVbb3ZseW5vXVtNQVBQRURdKQorICAgIHJldHVybiBUUlVFOwkvKiB0aGlzIG92ZXJsYXkgYWxyZWFkeSBtYXBwZWQgLS0gbm90aGluZyB0byBkbyEgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgX25vdmx5czsgaSsrKQorICAgIGlmIChpID09IG92bHlubykKKyAgICAgIF9vdmx5X3RhYmxlW2ldW01BUFBFRF0gPSAxOwkvKiB0aGlzIG9uZSBub3cgbWFwcGVkICovCisgICAgZWxzZSBpZiAoX292bHlfdGFibGVbaV1bVk1BXSA9PSBfb3ZseV90YWJsZVtvdmx5bm9dW1ZNQV0pCisgICAgICBfb3ZseV90YWJsZVtpXVtNQVBQRURdID0gMDsJLyogdGhpcyBvbmUgbm93IHVuLW1hcHBlZCAqLworCisgIG92bHlfY29weSAoX292bHlfdGFibGVbb3ZseW5vXVtWTUFdLCAKKwkgICAgIF9vdmx5X3RhYmxlW292bHlub11bTE1BXSwgCisJICAgICBfb3ZseV90YWJsZVtvdmx5bm9dW1NJWkVdKTsKKworICBGbHVzaENhY2hlICgpOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBPdmVybGF5VW5sb2FkOgorICogQ29weSB0aGUgb3ZlcmxheSBiYWNrIGludG8gaXRzICJsb2FkIiByZWdpb24uCisgKiBEb2VzIE5PVCBtYXJrIG92ZXJsYXkgYXMgInVubWFwcGVkIiwgdGhlcmVmb3JlIG1heSBiZSBjYWxsZWQKKyAqIG1vcmUgdGhhbiBvbmNlIGZvciB0aGUgc2FtZSBtYXBwZWQgb3ZlcmxheS4KKyAqLworIAorYm9vbAorT3ZlcmxheVVubG9hZCAodW5zaWduZWQgbG9uZyBvdmx5bm8pCit7CisgIGlmIChvdmx5bm8gPCAwIHx8IG92bHlubyA+PSBfbm92bHlzKQorICAgIGV4aXQgKC0xKTsgIC8qIGZhaWwsIGJhZCBvdmx5IG51bWJlciAqLworIAorICBpZiAoIV9vdmx5X3RhYmxlW292bHlub11bTUFQUEVEXSkKKyAgICBleGl0ICgtMSk7ICAvKiBlcnJvciwgY2FuJ3QgY29weSBvdXQgYSBzZWdtZW50IHRoYXQncyBub3QgImluIiAqLworIAorICBvdmx5X2NvcHkgKF9vdmx5X3RhYmxlW292bHlub11bTE1BXSwgCisJICAgICBfb3ZseV90YWJsZVtvdmx5bm9dW1ZNQV0sCisJICAgICBfb3ZseV90YWJsZVtvdmx5bm9dW1NJWkVdKTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIF9fRDEwVl9fCisjZGVmaW5lIElNQVAwICAgICAgICgqKHNob3J0ICopKDB4ZmYwMCkpCisjZGVmaW5lIElNQVAxICAgICAgICgqKHNob3J0ICopKDB4ZmYwMikpCisjZGVmaW5lIERNQVAgICAgICAgICgqKHNob3J0ICopKDB4ZmYwNCkpCisKK3N0YXRpYyB2b2lkCitEMTBWVHJhbnNsYXRlICh1bnNpZ25lZCBsb25nIGxvZ2ljYWwsCisJICAgICAgIHNob3J0ICpkbWFwLAorCSAgICAgICB1bnNpZ25lZCBsb25nICoqYWRkcikKK3sKKyAgdW5zaWduZWQgbG9uZyBwaHlzaWNhbDsKKyAgdW5zaWduZWQgbG9uZyBzZWc7CisgIHVuc2lnbmVkIGxvbmcgb2ZmOworCisgIC8qIHRvIGFjY2VzcyBkYXRhLCB3ZSB1c2UgdGhlIGZvbGxvd2luZyBtYXBwaW5nIAorICAgICAweDAweHh4eHh4OiBMb2dpY2FsIGRhdGEgYWRkcmVzcyBzZWdtZW50ICAgICAgICAoRE1BUCB0cmFuc2xhdGVkIG1lbW9yeSkKKyAgICAgMHgwMXh4eHh4eDogTG9naWNhbCBpbnN0cnVjdGlvbiBhZGRyZXNzIHNlZ21lbnQgKElNQVAgdHJhbnNsYXRlZCBtZW1vcnkpCisgICAgIDB4MTB4eHh4eHg6IFBoeXNpY2FsIGRhdGEgbWVtb3J5IHNlZ21lbnQgICAgICAgIChPbi1jaGlwIGRhdGEgbWVtb3J5KQorICAgICAweDExeHh4eHh4OiBQaHlzaWNhbCBpbnN0cnVjdGlvbiBtZW1vcnkgc2VnbWVudCAoT24tY2hpcCBpbnNuIG1lbW9yeSkKKyAgICAgMHgxMnh4eHh4eDogUGhpc2ljYWwgdW5pZmllZCBtZW1vcnkgc2VnbWVudCAgICAgKFVuaWZpZWQgbWVtb3J5KQorICAgICAqLworCisgIC8qIEFkZHJlc3NlcyBtdXN0IGJlIGNvcnJlY3RseSBhbGlnbmVkICovCisgIGlmIChsb2dpY2FsICYgKHNpemVvZiAoKiphZGRyKSAtIDEpKQorICAgIGV4aXQgKC0xKTsKKworICAvKiBJZiB0aGUgYWRkcmVzcyBpcyBpbiBvbmUgb2YgdGhlIHR3byBsb2dpY2FsIGFkZHJlc3Mgc3BhY2VzLCBpdCBpcworICAgICBmaXJzdCB0cmFuc2xhdGVkIGludG8gYSBwaHlzaWNhbCBhZGRyZXNzICovCisgIHNlZyA9IChsb2dpY2FsID4+IDI0KTsKKyAgb2ZmID0gKGxvZ2ljYWwgJiAweGZmZmZmZkwpOworICBzd2l0Y2ggKHNlZykgCisgICAgICB7CisgICAgICBjYXNlIDB4MDA6IC8qIGluIGxvZ2ljYWwgZGF0YSBhZGRyZXNzIHNlZ21lbnQgKi8KKwlpZiAob2ZmIDw9IDB4N2ZmZkwpCisJICBwaHlzaWNhbCA9ICgweDEwTCA8PCAyNCkgKyBvZmY7CisJZWxzZQorCSAgLyogTG9naWNhbCBhZGRyZXNzIG91dCBzaWRlIG9mIG9uLWNoaXAgc2VnbWVudCwgbm90CisgICAgICAgICAgICAgc3VwcG9ydGVkICovCisJICBleGl0ICgtMSk7CisJYnJlYWs7CisgICAgICBjYXNlIDB4MDE6IC8qIGluIGxvZ2ljYWwgaW5zdHJ1Y3Rpb24gYWRkcmVzcyBzZWdtZW50ICovCisJeworCSAgc2hvcnQgbWFwOworCSAgaWYgKG9mZiA8PSAweDFmZmZmTCkKKwkgICAgbWFwID0gSU1BUDA7CisJICBlbHNlIGlmIChvZmYgPD0gMHgzZmZmZkwpCisJICAgIG1hcCA9IElNQVAxOworCSAgZWxzZQorCSAgICAvKiBMb2dpY2FsIGFkZHJlc3Mgb3V0c2lkZSBvZiBJTUFQWzAxXSBzZWdtZW50LCBub3QKKwkgICAgICAgc3VwcG9ydGVkICovCisJICAgIGV4aXQgKC0xKTsKKwkgIGlmIChtYXAgJiAweDEwMDBMKQorCSAgICB7CisJICAgIC8qIEluc3RydWN0aW9uIG1lbW9yeSAqLworCSAgICAgIHBoeXNpY2FsID0gKDB4MTFMIDw8IDI0KSB8IG9mZjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgIC8qIFVuaWZpZWQgbWVtb3J5ICovCisJICAgICAgcGh5c2ljYWwgPSAoKG1hcCAmIDB4N2ZMKSA8PCAxNykgKyAob2ZmICYgMHgxZmZmZkwpOworCSAgICAgIGlmIChwaHlzaWNhbCA+IDB4ZmZmZmZmTCkKKwkJLyogQWRkcmVzcyBvdXRzaWRlIG9mIHVuaWZpZWQgYWRkcmVzcyBzZWdtZW50ICovCisJCWV4aXQgKC0xKTsKKwkgICAgICBwaHlzaWNhbCB8PSAoMHgxMkwgPDwgMjQpOworCSAgICB9CisJICBicmVhazsKKwl9CisgICAgICBjYXNlIDB4MTA6CisgICAgICBjYXNlIDB4MTE6CisgICAgICBjYXNlIDB4MTI6CisJcGh5c2ljYWwgPSBsb2dpY2FsOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlleGl0ICgtMSk7CS8qIGVycm9yICovCisgICAgICB9CisKKyAgc2VnID0gKHBoeXNpY2FsID4+IDI0KTsKKyAgb2ZmID0gKHBoeXNpY2FsICYgMHhmZmZmZmZMKTsKKyAgc3dpdGNoIChzZWcpIAorICAgIHsKKyAgICBjYXNlIDB4MTA6CS8qIGRzdCBpcyBhIDE1IGJpdCBvZmZzZXQgaW50byB0aGUgb24tY2hpcCBtZW1vcnkgKi8KKyAgICAgICpkbWFwID0gMDsKKyAgICAgICphZGRyID0gKGxvbmcgKikgKDB4MDAwMCArICgoc2hvcnQpb2ZmICYgMHg3ZmZmKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTE6CS8qIGRzdCBpcyBhbiAxOC1iaXQgb2Zmc2V0IGludG8gdGhlIG9uLWNoaXAKKwkJICAgaW5zdHJ1Y3Rpb24gbWVtb3J5ICovCisgICAgICAqZG1hcCA9IDB4MTAwMEwgfCAoKG9mZiAmIDB4M2ZmZmZMKSA+PiAxNCk7CisgICAgICAqYWRkciA9IChsb25nICopICgweDgwMDAgKyAoKHNob3J0KW9mZiAmIDB4M2ZmZikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDEyOgkvKiBkc3QgaXMgYSAyNC1iaXQgb2Zmc2V0IGludG8gdW5pZmllZCBtZW1vcnkgKi8KKyAgICAgICpkbWFwID0gb2ZmID4+IDE0OworICAgICAgKmFkZHIgPSAobG9uZyAqKSAoMHg4MDAwICsgKChzaG9ydClvZmYgJiAweDNmZmYpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBleGl0ICgtMSk7CS8qIGVycm9yICovCisgICAgfQorfQorI2VuZGlmIC8qIF9fRDEwVl9fICovCisKK3N0YXRpYyB2b2lkCitvdmx5X2NvcHkgKHVuc2lnbmVkIGxvbmcgZHN0LCB1bnNpZ25lZCBsb25nIHNyYywgbG9uZyBzaXplKQoreworI2lmZGVmICBfX00zMlJfXworICBtZW1jcHkgKCh2b2lkICopIGRzdCwgKHZvaWQgKikgc3JjLCBzaXplKTsKKyAgcmV0dXJuOworI2VuZGlmIC8qIE0zMlIgKi8KKworI2lmZGVmICBfX0QxMFZfXworICB1bnNpZ25lZCBsb25nICpzLCAqZCwgdG1wOworICBzaG9ydCBkbWFwX3NyYywgZG1hcF9kc3Q7CisgIHNob3J0IGRtYXBfc2F2ZTsKKworICAvKiBhbGwgc2VjdGlvbiBzaXplcyBzaG91bGQgYnkgbXVsdGlwbGVzIG9mIDQgYnl0ZXMgKi8KKyAgZG1hcF9zYXZlID0gRE1BUDsKKworICBEMTBWVHJhbnNsYXRlIChzcmMsICZkbWFwX3NyYywgJnMpOworICBEMTBWVHJhbnNsYXRlIChkc3QsICZkbWFwX2RzdCwgJmQpOworCisgIHdoaWxlIChzaXplID4gMCkKKyAgICB7CisgICAgICAvKiBOQjogVHJhbnNmZXIgNCBieXRlIChsb25nKSBxdWFudGl0ZXMsIHByb2JsZW1zIG9jY3VyZQorCSB3aGVuIG9ubHkgdHdvIGJ5dGVzIGFyZSB0cmFuc2ZlcmVkICovCisgICAgICBETUFQID0gZG1hcF9zcmM7CisgICAgICB0bXAgPSAqczsKKyAgICAgIERNQVAgPSBkbWFwX2RzdDsKKyAgICAgICpkID0gdG1wOyAKKyAgICAgIGQrKzsKKyAgICAgIHMrKzsKKyAgICAgIHNpemUgLT0gc2l6ZW9mICh0bXApOworICAgICAgc3JjICs9IHNpemVvZiAodG1wKTsKKyAgICAgIGRzdCArPSBzaXplb2YgKHRtcCk7CisgICAgICBpZiAoKHNyYyAmIDB4M2ZmZikgPT0gMCkKKwlEMTBWVHJhbnNsYXRlIChzcmMsICZkbWFwX3NyYywgJnMpOworICAgICAgaWYgKChkc3QgJiAweDNmZmYpID09IDApCisJRDEwVlRyYW5zbGF0ZSAoZHN0LCAmZG1hcF9kc3QsICZkKTsKKyAgICB9CisgIERNQVAgPSBkbWFwX3NhdmU7CisjZW5kaWYgLyogRDEwViAqLworfQorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2RlZmF1bHQuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9kZWZhdWx0LmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTE1MDZhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9kZWZhdWx0LmV4cApAQCAtMCwwICsxLDc5MyBAQAorIyAgIENvcHlyaWdodCAoQykgMTk4OCwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NCwgMTk5NywgMTk5OAorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorCitzZXQgdGltZW91dCA2MAorCisjCisjIHRlc3QgZGVmYXVsdCBhY3Rpb25zIG9mIGdkYiBjb21tYW5kcworIworCisjbG9hZF9saWIgZ2RiLmV4cAorCitnZGJfdGVzdCAiYWRkLXN5bWJvbC1maWxlIiAiYWRkLXN5bWJvbC1maWxlIHRha2VzIGEgZmlsZSBuYW1lIGFuZCBhbiBhZGRyZXNzIiAiYWRkLXN5bWJvbC1maWxlIgorCitzZXR1cF94ZmFpbCAibWlwcy1pZHQtKiIKK3NlbmRfZ2RiICJhdHRhY2hcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiQXJndW1lbnQgcmVxdWlyZWQgLihwcm9jZXNzLWlkfHByb2dyYW0pIHRvIGF0dGFjaC4qJGdkYl9wcm9tcHQgJCJcCisJCQl7IHBhc3MgImF0dGFjaCIgfQorICAgIC1yZSAiWW91IGNhbid0IGRvIHRoYXQgd2hlbiB5b3VyIHRhcmdldCBpcyBgTm9uZScuKiRnZGJfcHJvbXB0ICQiXAorCQkJeyBwYXNzICJhdHRhY2giIH0KKyAgICAtcmUgIkRvbid0IGtub3cgaG93IHRvIGF0dGFjaC4gIFRyeSBcImhlbHAgdGFyZ2V0XCIuLiokZ2RiX3Byb21wdCAkIlwKKwkJCXsgcGFzcyAiYXR0YWNoIiB9CisgICAgLXJlICJLaWxsIGl0LiAueSBvciBuLiIgeworCXNlbmRfZ2RiICJ5XG4iCisJZXhwX2NvbnRpbnVlCisgICAgfQorICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJhdHRhY2giIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGF0dGFjaCIgfQorfQorCisjIEZJWE1FOiBhdHRhY2gga2lsbHMgdGhlIHVkaSBjb25uZWN0aW9uCitpZiB7IFtpc3RhcmdldCAiYTI5ay0qLXVkaSJdIH0geworICAgIGdkYl9leGl0CisgICAgZ2RiX3N0YXJ0Cit9CisKK2lmICFbdGFyZ2V0X2luZm8gZXhpc3RzIHVzZV9nZGJfc3R1Yl0geworICAgIGdkYl90ZXN0ICJicmVhayIgIk5vIGRlZmF1bHQgYnJlYWtwb2ludCBhZGRyZXNzIG5vdy4iICJicmVhayIKKyAgICBmb3JlYWNoIGkgImIgYnIgYnJlIGJyZWEiIHsKKwlnZGJfdGVzdCAkaSAiTm8gZGVmYXVsdCBicmVha3BvaW50IGFkZHJlc3Mgbm93LiIgImJyZWFrIFwiJGlcIiBhYmJyZXZpYXRpb24iCisgICAgfQorCisgICAgCisgICAgc2V0dXBfeGZhaWwgIm1pcHMtaWR0LSoiICJhMjlrLSotdWRpIgorICAgIGdkYl90ZXN0ICJiYWNrdHJhY2UiICJObyBzdGFjay4iCisgICAgZm9yZWFjaCBpICJidCBiYSBiYWMiIHsKKwlzZXR1cF94ZmFpbCAibWlwcy1pZHQtKiIgImEyOWstKi11ZGkiCisJZ2RiX3Rlc3QgJGkgIk5vIHN0YWNrLiIgImJhY2t0cmFjZSBcIiRpXCIgYWJicmV2aWF0aW9uIgorICAgIH0KK30gZWxzZSB7CisgICAgd2FybmluZyAiU2tpcHBpbmcgYmFja3RyYWNlIGFuZCBicmVhayB0ZXN0cyBiZWNhdXNlIG9mIEdEQiBzdHViLiIKK30KKworIyBUaGlzIHdvcmtzIG9uIHRoZSBNSVBTIElEVCBib2FyZCwgYnV0IGNvbmZ1c2VzIGZ1dHVyZSB0ZXN0cy4KK2lmICFbaXN0YXJnZXQgIm1pcHMtaWR0LSoiXSB0aGVuIHsKKyAgICBzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKKyAgICBnZGJfdGVzdCAiY29udGludWUiICJUaGUgcHJvZ3JhbSBpcyBub3QgYmVpbmcgcnVuLiIgImNvbnRpbnVlIgorICAgIHNldHVwX3hmYWlsICJhMjlrLSotdWRpIgorICAgIGdkYl90ZXN0ICJjIiAiVGhlIHByb2dyYW0gaXMgbm90IGJlaW5nIHJ1bi4iICJjb250aW51ZSBcImNcIiBhYmJyZXZpYXRpb24iCit9CisKKyMgRklYTUU6IGNvbnRpbnVlIGtpbGxzIHRoZSB1ZGkgY29ubmVjdGlvbgoraWYgW2lzdGFyZ2V0ICJhMjlrLSotdWRpIl0gdGhlbiB7CisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKK30KKworI3Rlc3QgY2FsbAorZ2RiX3Rlc3QgImNhbGwiICJUaGUgaGlzdG9yeSBpcyBlbXB0eS4uKiIgImNhbGwiCisKKworI3Rlc3QgY2F0Y2gKK2dkYl90ZXN0ICJjYXRjaCIgIkNhdGNoIHJlcXVpcmVzIGFuIGV2ZW50IG5hbWUuLioiICJjYXRjaCIKKworI3Rlc3QgY2QKK2dkYl90ZXN0ICJjZCIgIkFyZ3VtZW50IHJlcXVpcmVkIC5uZXcgd29ya2luZyBkaXJlY3RvcnkuKiIgImNkIgorCisjdGVzdCBjbGVhcgorZ2RiX3Rlc3QgImNsZWFyIiAiTm8gc291cmNlIGZpbGUgc3BlY2lmaWVkLi4qIiAiY2xlYXIiCisKKyN0ZXN0IGNvbW1hbmRzCitnZGJfdGVzdCAiY29tbWFuZHMiICJObyBicmVha3BvaW50IG51bWJlciAwLi4qIiAiY29tbWFuZHMiCisKKyN0ZXN0IGNvbmRpdGlvbgorZ2RiX3Rlc3QgImNvbmRpdGlvbiIgIkFyZ3VtZW50IHJlcXVpcmVkIC5icmVha3BvaW50IG51bWJlci4qIiAiY29uZGl0aW9uIgorCisjdGVzdCBjb3JlLWZpbGUKK2dkYl90ZXN0ICJjb3JlLWZpbGUiICJObyBjb3JlIGZpbGUgbm93LnxHREIgY2FuJ3QgcmVhZCBjb3JlIGZpbGVzIG9uIHRoaXMgbWFjaGluZS4iICJjb3JlLWZpbGUiCisjdGVzdCBkZWxldGUgImQiIGFiYnJldmlhdGlvbgorZ2RiX3Rlc3QgImQiICIiICJkZWxldGUgXCJkXCIgYWJicmV2aWF0aW9uIgorI3Rlc3QgZGVsZXRlCitnZGJfdGVzdCAiZGVsZXRlIiAiIiAiZGVsZXRlIgorI3Rlc3QgZGVmaW5lCitnZGJfdGVzdCAiZGVmaW5lIiAiQXJndW1lbnQgcmVxdWlyZWQgXFsoXF1uYW1lIG9mIGNvbW1hbmQgdG8gZGVmaW5lXFspXF0uIiAiZGVmaW5lIgorI3Rlc3QgZGVsZXRlIGJyZWFrcG9pbnRzCitnZGJfdGVzdCAiZGVsZXRlIGJyZWFrcG9pbnRzIiAiIiAiZGVsZXRlIGJyZWFrcG9pbnRzIgorI3Rlc3QgZGVsZXRlIGRpc3BsYXkKKyMgRklYTUUgLS0gbmVlZCB0byBkdW1wIGZ1bGwgb3V0cHV0IHRvIGRldGFpbGVkIGxvZworc2VuZF9nZGIgImRlbGV0ZSBkaXNwbGF5XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIkRlbGV0ZSBhbGwgYXV0by1kaXNwbGF5IGV4cHJlc3Npb25zLip5IG9yIG4uICQiIHsKKwlzZW5kX2dkYiAieVxuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICB7IHBhc3MgImRlbGV0ZSBkaXNwbGF5IHByb21wdCIgfQorCSAgICB0aW1lb3V0CQl7IGZhaWwgIih0aW1lb3V0KSBkZWxldGUgZGlzcGxheSBwcm9tcHQiIH0KKwl9CisgICAgfQorICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIGRlbGV0ZSBkaXNwbGF5IHByb21wdCIgfQorCit9CisKKyN0ZXN0IGRldGFjaAorZ2RiX3Rlc3QgImRldGFjaCIgIiIgImRldGFjaCIKKworIyBGSVhNRTogY29udGludWUga2lsbHMgdGhlIHVkaSBjb25uZWN0aW9uCitpZiBbaXN0YXJnZXQgImEyOWstKi11ZGkiXSB0aGVuIHsKKyAgICBnZGJfZXhpdAorICAgIGdkYl9zdGFydAorfQoraWYgW2lzdGFyZ2V0ICJoODMwMC0qLWhtcyJdIHRoZW4geworICAgIGdkYl9leGl0CisgICAgZ2RiX3N0YXJ0Cit9CisKKyN0ZXN0IGRpcmVjdG9yeQorIyBGSVhNRSAtLSBuZWVkIHRvIGR1bXAgZnVsbCBvdXRwdXQgdG8gZGV0YWlsZWQgbG9nCisKK3NlbmRfZ2RiICJkaXJlY3RvcnlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiUmVpbml0aWFsaXplIHNvdXJjZSBwYXRoIHRvIGVtcHR5Lip5IG9yIG4uICQiICB7CisJc2VuZF9nZGIgInlcbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICJTb3VyY2UgZGlyZWN0b3JpZXMgc2VhcmNoZWQ6IC5jZGlyOi5jd2QuKiRnZGJfcHJvbXB0ICQiXAorCQkgICAgeyBwYXNzICJkaXJlY3RvcnkgcHJvbXB0IiB9CisJICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIGRpcmVjdG9yeSBwcm9tcHQiIH0KKwl9CisgICAgfQorfQorCisjdGVzdCBkaXNhYmxlICJkaXMiIGFiYnJldmlhdGlvbgorZ2RiX3Rlc3QgImRpcyIgIiIgImRpc2FibGUgXCJkaXNcIiBhYmJyZXZpYXRpb24iCisjdGVzdCBkaXNhYmxlICJkaXNhIiBhYmJyZXZpYXRpb24KK2dkYl90ZXN0ICJkaXNhIiAiIiAiZGlzYWJsZSBcImRpc2FcIiBhYmJyZXZpYXRpb24iCisjdGVzdCBkaXNhYmxlCitnZGJfdGVzdCAiZGlzYWJsZSIgIiIgImRpc2FibGUiCisjdGVzdCBkaXNhYmxlIGJyZWFrcG9pbnRzCitnZGJfdGVzdCAiZGlzYWJsZSBicmVha3BvaW50cyIgIiIgImRpc2FibGUgYnJlYWtwb2ludHMiCisjdGVzdCBkaXNhYmxlIGRpc3BsYXkKK2dkYl90ZXN0ICJkaXNhYmxlIGRpc3BsYXkiICIiICJkaXNhYmxlIGRpc3BsYXkiCisjdGVzdCBkaXNhc3NlbWJsZQorZ2RiX3Rlc3QgImRpc2Fzc2VtYmxlIiAiTm8gZnJhbWUgc2VsZWN0ZWQuIiAiZGlzYXNzZW1ibGUiCisjdGVzdCBkaXNwbGF5CitnZGJfdGVzdCAiZGlzcGxheSIgIiIgImRpc3BsYXkiCisjdGVzdCBkbworZ2RiX3Rlc3QgImRvIiAiTm8gc3RhY2suIiAiZG8iCisjdGVzdCBkb2N1bWVudAorZ2RiX3Rlc3QgImRvY3VtZW50IiAiQXJndW1lbnQgcmVxdWlyZWQgLm5hbWUgb2YgY29tbWFuZCB0byBkZWZpbmUuKiIgImRvY3VtZW50IgorI3Rlc3QgZG93bgorZ2RiX3Rlc3QgImRvd24iICJObyBzdGFjay4qIiAiZG93biIKKyN0ZXN0IGRvd24tc2lsZW50bHkKK2dkYl90ZXN0ICJkb3duLXNpbGVudGx5IiAiTm8gc3RhY2suIiAiZG93bi1zaWxlbnRseSIKKyN0ZXN0IGVjaG8KK2dkYl90ZXN0ICJlY2hvIiAiIiAiZWNobyIKKyN0ZXN0IGVuYWJsZSBicmVha3BvaW50cyBkZWxldGUKK2dkYl90ZXN0ICJlbmFibGUgYnJlYWtwb2ludHMgZGVsZXRlIiAiQXJndW1lbnQgcmVxdWlyZWQgLm9uZSBvciBtb3JlIGJyZWFrcG9pbnQgbnVtYmVycy4qIiAiZW5hYmxlIGJyZWFrcG9pbnRzIGRlbGV0ZSIKKyN0ZXN0IGVuYWJsZSBicmVha3BvaW50cyBvbmNlCitnZGJfdGVzdCAiZW5hYmxlIGJyZWFrcG9pbnRzIG9uY2UiICJBcmd1bWVudCByZXF1aXJlZCAub25lIG9yIG1vcmUgYnJlYWtwb2ludCBudW1iZXJzLioiICJlbmFibGUgYnJlYWtwb2ludHMgb25jZSIKKyN0ZXN0IGVuYWJsZSBicmVha3BvaW50cworZ2RiX3Rlc3QgImVuYWJsZSBicmVha3BvaW50cyIgIiIgImVuYWJsZSBicmVha3BvaW50cyIKKyN0ZXN0IGVuYWJsZSBkZWxldGUKK2dkYl90ZXN0ICJlbmFibGUgZGVsZXRlIiAiQXJndW1lbnQgcmVxdWlyZWQgLm9uZSBvciBtb3JlIGJyZWFrcG9pbnQgbnVtYmVycy4qIiAiZW5hYmxlIGRlbGV0ZSIKKyN0ZXN0IGVuYWJsZSBkaXNwbGF5CitnZGJfdGVzdCAiZW5hYmxlIGRpc3BsYXkiICIiICJlbmFibGUgZGlzcGxheSIKKyN0ZXN0IGVuYWJsZSBvbmNlCitnZGJfdGVzdCAiZW5hYmxlIG9uY2UiICJBcmd1bWVudCByZXF1aXJlZCAub25lIG9yIG1vcmUgYnJlYWtwb2ludCBudW1iZXJzLioiICJlbmFibGUgb25jZSIKKyN0ZXN0IGVuYWJsZQorZ2RiX3Rlc3QgImVuYWJsZSIgIiIgImVuYWJsZSIKKyN0ZXN0IGV4ZWMtZmlsZQorc2VuZF9nZGIgImV4ZWMtZmlsZVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJObyBleGVjdXRhYmxlIGZpbGUgbm93Li4qJGdkYl9wcm9tcHQgJCIgeworCXBhc3MgImV4ZWMtZmlsZSIKKyAgICB9CisgICAgLXJlICJleGVjLWZpbGUuKkEgcHJvZ3JhbSBpcyBiZWluZyBkZWJ1Z2dlZCBhbHJlYWR5LiAgS2lsbCBpdC4gLnkgb3Igbi4qJCIgeworCXNlbmRfZ2RiICJuXG4iCisJaWYgJHZlcmJvc2U+MSB0aGVuIHsKKwkgICAgc2VuZF91c2VyICJcdERpZG4ndCBraWxsIHByb2dyYW0gYmVpbmcgZGVidWdnZWRcbiIKKwl9CisJZ2RiX2V4cGVjdCAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgfQorCXBhc3MgImV4ZWMtZmlsZSIKKyAgICB9CisgICAgLXJlICIkZ2RiX3Byb21wdCAkIgl7IGZhaWwgImV4ZWMtZmlsZSIgfQorICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIGV4ZWMtZmlsZSIgfQorfQorCisjdGVzdCBmcmFtZSAiZiIgYWJicmV2aWF0aW9uCitzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKK2dkYl90ZXN0ICJmIiAiTm8gc3RhY2suIiAiZnJhbWUgXCJmXCIgYWJicmV2aWF0aW9uIgorI3Rlc3QgZnJhbWUKK3NldHVwX3hmYWlsICJhMjlrLSotdWRpIgorZ2RiX3Rlc3QgImZyYW1lIiAiTm8gc3RhY2suIiAiZnJhbWUiCisjdGVzdCBmZworc2V0dXBfeGZhaWwgImEyOWstKi11ZGkiCitnZGJfdGVzdCAiZmciICJUaGUgcHJvZ3JhbSBpcyBub3QgYmVpbmcgcnVuLiIgImZnIgorIyBGSVhNRTogZmcga2lsbHMgdGhlIHVkaSBjb25uZWN0aW9uCisjdGVzdCBmaWxlCitzZW5kX2dkYiAiZmlsZVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJObyBleGVjdXRhYmxlIGZpbGUgbm93Li4qJGdkYl9wcm9tcHQgJCJcCisJICAgIHsgcGFzcyAiZmlsZSIgfQorICAgIC1yZSAiLipBIHByb2dyYW0gaXMgYmVpbmcgZGVidWdnZWQgYWxyZWFkeS4gIEtpbGwgaXQuIC55IG9yIG4uKiQiIHsKKwlzZW5kX2dkYiAiblxuIgorCWlmICR2ZXJib3NlPjEgdGhlbiB7CisJICAgIHNlbmRfdXNlciAiXHRcdERpZG4ndCBraWxsIHByb2dyYW0gYmVpbmcgZGVidWdnZWRcbiIKKwl9CisJZ2RiX2V4cGVjdCAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgfQorCXBhc3MgImZpbGUiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIgl7IGZhaWwgImZpbGUiIH0KKyAgICB0aW1lb3V0CQl7IGZhaWwgIih0aW1lb3V0KSBmaWxlIiB9Cit9CisKKyN0ZXN0IGZpbmlzaAorc2V0dXBfeGZhaWwgImEyOWstKi11ZGkiCitnZGJfdGVzdCAiZmluaXNoIiAiVGhlIHByb2dyYW0gaXMgbm90IHJ1bm5pbmcuIiAiZmluaXNoIgorI3Rlc3QgZm9yd2FyZC1zZWFyY2gKKyMgVGhlIG1lc3NhZ2UgaGVyZSBjb21lcyBmcm9tIHRoZSByZWdleHAgbGlicmFyeSwgbm90IGdkYiwgYW5kIHNvIGNhbgorIyB2YXJ5IG9uIGRpZmZlcmVudCBzeXN0ZW1zLgorZ2RiX3Rlc3QgImZvcndhcmQtc2VhcmNoIiAiTm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uLip8VGhlcmUgaXMgbm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uLioiICJmb3J3YXJkLXNlYXJjaCIKKyN0ZXN0IGhlbHAgImgiIGFiYnJldmlhdGlvbgorZ2RiX3Rlc3QgImgiICJMaXN0IG9mIGNsYXNzZXMgb2YgY29tbWFuZHM6LipcW1xyXG5cXSthbGlhc2VzIC0tIEFsaWFzZXMgb2Ygb3RoZXIgY29tbWFuZHMuKlxbXHJcblxdK2JyZWFrcG9pbnRzIC0tIE1ha2luZyBwcm9ncmFtIHN0b3AgYXQgY2VydGFpbiBwb2ludHMuKlxbXHJcblxdK2RhdGEgLS0gRXhhbWluaW5nIGRhdGEuKlxbXHJcblxdK2ZpbGVzIC0tIFNwZWNpZnlpbmcgYW5kIGV4YW1pbmluZyBmaWxlcy4qXFtcclxuXF0rb2JzY3VyZSAtLSBPYnNjdXJlIGZlYXR1cmVzLipcW1xyXG5cXStydW5uaW5nIC0tIFJ1bm5pbmcgdGhlIHByb2dyYW0uKlxbXHJcblxdK3N0YWNrIC0tIEV4YW1pbmluZyB0aGUgc3RhY2suKlxbXHJcblxdK3N0YXR1cyAtLSBTdGF0dXMgaW5xdWlyaWVzLipcW1xyXG5cXStzdXBwb3J0IC0tIFN1cHBvcnQgZmFjaWxpdGllcy4qXFtcclxuXF0rdXNlci1kZWZpbmVkIC0tIFVzZXItZGVmaW5lZCBjb21tYW5kcy4qXFtcclxuXF0rVHlwZSBcImhlbHBcIiBmb2xsb3dlZCBieSBhIGNsYXNzIG5hbWUgZm9yIGEgbGlzdCBvZiBjb21tYW5kcyBpbiB0aGF0IGNsYXNzLi4qXFtcclxuXF0rVHlwZSBcImhlbHBcIiBmb2xsb3dlZCBieSBjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4uKlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLiIgImhlbHAgXCJoXCIgYWJicmV2aWF0aW9uIgorI3Rlc3QgaGVscAorZ2RiX3Rlc3QgImhlbHAiICJMaXN0IG9mIGNsYXNzZXMgb2YgY29tbWFuZHM6LipcW1xyXG5cXSthbGlhc2VzIC0tIEFsaWFzZXMgb2Ygb3RoZXIgY29tbWFuZHMuKlxbXHJcblxdK2JyZWFrcG9pbnRzIC0tIE1ha2luZyBwcm9ncmFtIHN0b3AgYXQgY2VydGFpbiBwb2ludHMuKlxbXHJcblxdK2RhdGEgLS0gRXhhbWluaW5nIGRhdGEuKlxbXHJcblxdK2ZpbGVzIC0tIFNwZWNpZnlpbmcgYW5kIGV4YW1pbmluZyBmaWxlcy4qXFtcclxuXF0rb2JzY3VyZSAtLSBPYnNjdXJlIGZlYXR1cmVzLipcW1xyXG5cXStydW5uaW5nIC0tIFJ1bm5pbmcgdGhlIHByb2dyYW0uKlxbXHJcblxdK3N0YWNrIC0tIEV4YW1pbmluZyB0aGUgc3RhY2suKlxbXHJcblxdK3N0YXR1cyAtLSBTdGF0dXMgaW5xdWlyaWVzLipcW1xyXG5cXStzdXBwb3J0IC0tIFN1cHBvcnQgZmFjaWxpdGllcy4qXFtcclxuXF0rdXNlci1kZWZpbmVkIC0tIFVzZXItZGVmaW5lZCBjb21tYW5kcy4qXFtcclxuXF0rVHlwZSBcImhlbHBcIiBmb2xsb3dlZCBieSBhIGNsYXNzIG5hbWUgZm9yIGEgbGlzdCBvZiBjb21tYW5kcyBpbiB0aGF0IGNsYXNzLi4qXFtcclxuXF0rVHlwZSBcImhlbHBcIiBmb2xsb3dlZCBieSBjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4uKlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLiIgImhlbHAiCisjdGVzdCBoYW5kbGUKK2dkYl90ZXN0ICJoYW5kbGUiICJBcmd1bWVudCByZXF1aXJlZCAuc2lnbmFsIHRvIGhhbmRsZS4qIiAiaGFuZGxlIgorI3Rlc3QgaW5mbyAiaSIgYWJicmV2aWF0aW9uIAorZ2RiX3Rlc3QgImkiICJcImluZm9cIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIGFuIGluZm8gY29tbWFuZC4uKlxbXHJcblxdK0xpc3Qgb2YgaW5mbyBzdWJjb21tYW5kczouKlxbXHJcblxdK1R5cGUgXCJoZWxwIGluZm9cIiBmb2xsb3dlZCBieSBpbmZvIHN1YmNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLi4qXFtcclxuXF0rQ29tbWFuZCBuYW1lIGFiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQgaWYgdW5hbWJpZ3VvdXMuIiAiaW5mbyBcImlcIiBhYmJyZXZpYXRpb24iCisjdGVzdCBpbmZvCitnZGJfdGVzdCAiaW5mbyIgIlwiaW5mb1wiIG11c3QgYmUgZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgYW4gaW5mbyBjb21tYW5kLi4qXFtcclxuXF0rTGlzdCBvZiBpbmZvIHN1YmNvbW1hbmRzOi4qXFtcclxuXF0rVHlwZSBcImhlbHAgaW5mb1wiIGZvbGxvd2VkIGJ5IGluZm8gc3ViY29tbWFuZCBuYW1lIGZvciBmdWxsIGRvY3VtZW50YXRpb24uLipcW1xyXG5cXStDb21tYW5kIG5hbWUgYWJicmV2aWF0aW9ucyBhcmUgYWxsb3dlZCBpZiB1bmFtYmlndW91cy4iICJpbmZvIgorI3Rlc3QgaWdub3JlCitnZGJfdGVzdCAiaWdub3JlIiAiQXJndW1lbnQgcmVxdWlyZWQgLmEgYnJlYWtwb2ludCBudW1iZXIuKiIgImlnbm9yZSIKKyN0ZXN0IGluZm8gYWRkcmVzcworZ2RiX3Rlc3QgImluZm8gYWRkcmVzcyIgIkFyZ3VtZW50IHJlcXVpcmVkLiIgImluZm8gYWRkcmVzcyIKKyN0ZXN0IGluZm8gYWxsLXJlZ2lzdGVycworc2V0dXBfeGZhaWwgImEyOWstKi11ZGkiCitnZGJfdGVzdCAiaW5mbyBhbGwtcmVnaXN0ZXJzIiAiVGhlIHByb2dyYW0gaGFzIG5vIHJlZ2lzdGVycyBub3cuIiAiaW5mbyBhbGwtcmVnaXN0ZXJzIgorI3Rlc3QgaW5mbyBhcmdzCitnZGJfdGVzdCAiaW5mbyBhcmdzIiAiTm8gZnJhbWUgc2VsZWN0ZWQuIiAiaW5mbyBhcmdzIgorI3Rlc3QgaW5mbyBib2d1cy1nZGItY29tbWFuZAorZ2RiX3Rlc3QgImluZm8gYm9ndXMtZ2RiLWNvbW1hbmQiICJVbmRlZmluZWQgaW5mbyBjb21tYW5kOiBcImJvZ3VzLWdkYi1jb21tYW5kXCIuICBUcnkgXCJoZWxwIGluZm9cIi4qIiAiaW5mbyBib2d1cy1nZGItY29tbWFuZCIKKyN0ZXN0IGluZm8gYnJlYWtwb2ludHMKK2dkYl90ZXN0ICJpbmZvIGJyZWFrcG9pbnRzIiAiTm8gYnJlYWtwb2ludHMgb3Igd2F0Y2hwb2ludHMuIiAiaW5mbyBicmVha3BvaW50cyIKKyN0ZXN0IGluZm8gY2F0Y2gKK2dkYl90ZXN0ICJpbmZvIGNhdGNoIiAiWW91IGNhbid0IGRvIHRoYXQgd2l0aG91dCBhIHByb2Nlc3MgdG8gZGVidWcuIiAiaW5mbyBjYXRjaCIKKyN0ZXN0IGluZm8gY29weWluZworIyBGSVhNRSAtLSBkb2Vzbid0IHdvcmsgd29ydGggYSBzaGl0Cisjc2VuZF9nZGIgImluZm8gY29weWluZyIKKyMJLXJlICJHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRS4qI29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQuKiNvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4iIyAKK2dkYl90ZXN0ICJpbmZvIGNvcHlpbmciCisjCX0KKyMKKyMKKyN0ZXN0IGluZm8gZGlzcGxheQorZ2RiX3Rlc3QgImluZm8gZGlzcGxheSIgIlRoZXJlIGFyZSBubyBhdXRvLWRpc3BsYXkgZXhwcmVzc2lvbnMgbm93LiIgImluZm8gZGlzcGxheSIKKyN0ZXN0IGluZm8gZnJhbWUgImYiIGFiYnJldmlhdGlvbgorZ2RiX3Rlc3QgImluZm8gZiIgIk5vIHN0YWNrLip8Tm8gc2VsZWN0ZWQgZnJhbWUuKiIgImluZm8gZnJhbWUgXCJmXCIgYWJicmV2aWF0aW9uIgorI3Rlc3QgaW5mbyBmcmFtZQorZ2RiX3Rlc3QgImluZm8gZnJhbWUiICJObyBzdGFjay58Tm8gc2VsZWN0ZWQgZnJhbWUuIiAiaW5mbyBmcmFtZSIKKyN0ZXN0IGluZm8gZmlsZXMKK2dkYl90ZXN0ICJpbmZvIGZpbGVzIiAiIiAiaW5mbyBmaWxlcyIKKyN0ZXN0IGluZm8gZmxvYXQKK2lmIFtpc3RhcmdldCAiYXJtLSotKiJdIHRoZW4geworICAgIGdkYl90ZXN0ICJpbmZvIGZsb2F0IiAiU29mdHdhcmUgRlBVIHR5cGUuKm1hc2s6LipmbGFnczouKiIgImluZm8gZmxvYXQiCit9IGVsc2VpZiBbaXN0YXJnZXQgInRodW1iLSotKiJdIHRoZW4geworICAgIGdkYl90ZXN0ICJpbmZvIGZsb2F0IiAiU29mdHdhcmUgRlBVIHR5cGUuKm1hc2s6LipmbGFnczouKiIgImluZm8gZmxvYXQiCit9IGVsc2UgeworICAgIGdkYl90ZXN0ICJpbmZvIGZsb2F0IiAiTm8gZmxvYXRpbmcgcG9pbnQgaW5mbyBhdmFpbGFibGUgZm9yIHRoaXMgcHJvY2Vzc29yLiIgImluZm8gZmxvYXQiCit9CisjdGVzdCBpbmZvIGZ1bmN0aW9ucworZ2RiX3Rlc3QgImluZm8gZnVuY3Rpb25zIiAiQWxsIGRlZmluZWQgZnVuY3Rpb25zOiIgImluZm8gZnVuY3Rpb25zIgorI3Rlc3QgaW5mbyBsb2NhbHMKK2dkYl90ZXN0ICJpbmZvIGxvY2FscyIgIk5vIGZyYW1lIHNlbGVjdGVkLiIgImluZm8gbG9jYWxzIgorI3Rlc3QgaW5mbyBwcm9ncmFtCitzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKK2dkYl90ZXN0ICJpbmZvIHByb2dyYW0iICJUaGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZCBpcyBub3QgYmVpbmcgcnVuLiIgImluZm8gcHJvZ3JhbSIKKyN0ZXN0IGluZm8gcmVnaXN0ZXJzCitzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKK2dkYl90ZXN0ICJpbmZvIHJlZ2lzdGVycyIgIlRoZSBwcm9ncmFtIGhhcyBubyByZWdpc3RlcnMgbm93LiIgImluZm8gcmVnaXN0ZXJzIgorI3Rlc3QgaW5mbyBzdGFjayAicyIgYWJicmV2aWF0aW9uCitzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKK2dkYl90ZXN0ICJpbmZvIHMiICJObyBzdGFjay4iICJpbmZvIHN0YWNrIFwic1wiIGFiYnJldmlhdGlvbiIKKyN0ZXN0IGluZm8gc3RhY2sKK3NldHVwX3hmYWlsICJhMjlrLSotdWRpIgorZ2RiX3Rlc3QgImluZm8gc3RhY2siICJObyBzdGFjay4iICJpbmZvIHN0YWNrIgorI3Rlc3QgaW5mbyBzZXQKKyMgRklYTUUgLS0gbmVlZHMgdG8gbWF0Y2ggdGhlIGVudGlyZSBvdXRwdXQKK2dkYl90ZXN0ICJpbmZvIHNldCIgImNvbmZpcm06ICBXaGV0aGVyIHRvIGNvbmZpcm0gcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIG9wZXJhdGlvbnMgaXMgb1xbYS16XF0qLi4qXFtcclxuXF0raGlzdG9yeSBmaWxlbmFtZTogIFRoZSBmaWxlbmFtZSBpbiB3aGljaCB0byByZWNvcmQgdGhlIGNvbW1hbmQgaGlzdG9yeSBpcyAuKlxbXHJcblxdK2xpc3RzaXplOiAgTnVtYmVyIG9mIHNvdXJjZSBsaW5lcyBnZGIgd2lsbCBsaXN0IGJ5IGRlZmF1bHQgaXMgMTAuKiIgImluZm8gc2V0IgorZ2RiX3Rlc3QgImluZm8gc3ltYm9sIiAiQXJndW1lbnQgcmVxdWlyZWQgLmFkZHJlc3MuLiIKKyN0ZXN0IGluZm8gc291cmNlCitnZGJfdGVzdCAgImluZm8gc291cmNlIiAiTm8gY3VycmVudCBzb3VyY2UgZmlsZS4uKiIgImluZm8gc291cmNlIgorI3Rlc3QgaW5mbyBzb3VyY2VzCitnZGJfdGVzdCAiaW5mbyBzb3VyY2VzIiAiTm8gc3ltYm9sIHRhYmxlIGlzIGxvYWRlZC4gIFVzZSB0aGUgXCJmaWxlXCIgY29tbWFuZC4qIiAiaW5mbyBzb3VyY2VzIgorI3Rlc3QgaW5mbyB0YXJnZXQKK2dkYl90ZXN0ICJpbmZvIHRhcmdldCIgIiIgImluZm8gdGFyZ2V0IgorI3Rlc3QgaW5mbyB0ZXJtaW5hbAorZ2RiX3Rlc3QgImluZm8gdGVybWluYWwiICJObyBzYXZlZCB0ZXJtaW5hbCBpbmZvcm1hdGlvbi4iICJpbmZvIHRlcm1pbmFsIgorI3Rlc3QgaW5mbyB0eXBlcworZ2RiX3Rlc3QgImluZm8gdHlwZXMiICJBbGwgZGVmaW5lZCB0eXBlczoiICJpbmZvIHR5cGVzIgorI3Rlc3QgaW5mbyB2YXJpYWJsZXMKK2dkYl90ZXN0ICJpbmZvIHZhcmlhYmxlcyIgIkFsbCBkZWZpbmVkIHZhcmlhYmxlczoiICJpbmZvIHZhcmlhYmxlcyIKKyN0ZXN0IGluZm8gd2FycmFudHkKK2dkYl90ZXN0ICJpbmZvIHdhcnJhbnR5IiAiTk8gV0FSUkFOVFkuKlxbXHJcblxdKyAgKjExLiAgKkJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZLipcW1xyXG5cXStGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4uKlxbXHJcblxdK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMuKlxbXHJcblxdK1BST1ZJREUgVEhFIFBST0dSQU0gXCJBUyBJU1wiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQuKlxbXHJcblxdK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GLipcW1xyXG5cXStNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTLipcW1xyXG5cXStUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFLipcW1xyXG5cXStQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywuKlxbXHJcblxdK1JFUEFJUiBPUiBDT1JSRUNUSU9OLi4qXFtcclxuXF0rICAqMTIuICAqSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HLipcW1xyXG5cXStXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SLipcW1xyXG5cXStSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLC4qXFtcclxuXF0rSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HLipcW1xyXG5cXStPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIC5JTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVELipcW1xyXG5cXStUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkuKlxbXHJcblxdK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSLipcW1xyXG5cXStQUk9HUkFNUy4sIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUuKlxbXHJcblxdK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4qIiAiaW5mbyB3YXJyYW50eSIKKyN0ZXN0IGluZm8gd2F0Y2hwb2ludHMKK2dkYl90ZXN0ICJpbmZvIHdhdGNocG9pbnRzIiAiTm8gYnJlYWtwb2ludHMgb3Igd2F0Y2hwb2ludHMuIiAiaW5mbyB3YXRjaHBvaW50cyIKKyN0ZXN0IGluc3BlY3QKK2dkYl90ZXN0ICJpbnNwZWN0IiAiVGhlIGhpc3RvcnkgaXMgZW1wdHkuIiAiaW5zcGVjdCIKKyN0ZXN0IGp1bXAKK3NldHVwX3hmYWlsICJhMjlrLSotdWRpIgorZ2RiX3Rlc3QgImp1bXAiICJUaGUgcHJvZ3JhbSBpcyBub3QgYmVpbmcgcnVuLiIgImp1bXAiCisjdGVzdCBraWxsCitnZGJfdGVzdCAia2lsbCIgIlRoZSBwcm9ncmFtIGlzIG5vdCBiZWluZyBydW4uIiAia2lsbCIKKyN0ZXN0IGxpc3QgImwiIGFiYnJldmlhdGlvbgorZ2RiX3Rlc3QgImwiICJObyBzeW1ib2wgdGFibGUgaXMgbG9hZGVkLiAgVXNlIHRoZSBcImZpbGVcIiBjb21tYW5kLioiICJsaXN0IFwibFwiIGFiYnJldmlhdGlvbiIKKyN0ZXN0IGxpc3QKK2dkYl90ZXN0ICJsaXN0IiAiTm8gc3ltYm9sIHRhYmxlIGlzIGxvYWRlZC4gIFVzZSB0aGUgXCJmaWxlXCIgY29tbWFuZC4qIiAibGlzdCIKKyN0ZXN0IGxvYWQKKyMgVGhlIGBgdGFrZXMgYSBmaWxlIG5hbWUnJyBjYXNlIGlzIGZvciB2eGdkYi4KKyMgVGhlIGBgVXNlIHRoZSAiZmlsZSIgY29tbWFuZCcnIGNhc2UgaXMgZm9yIG5ld2VyIEdEQiB2ZXJzaW9ucyB3aGljaCB0cnkKKyMgdG8gZGVkdWNlIHRoZSBmaWxlbmFtZSBmcm9tIHRoZSBleGVjIGZpbGUuCitnZGJfdGVzdCAibG9hZCIgIllvdSBjYW4ndCBkbyB0aGF0IHdoZW4geW91ciB0YXJnZXQgaXMgYE5vbmUnLip8VGhlIGxvYWQgY29tbWFuZCB0YWtlcyBhIGZpbGUgbmFtZS4qfE11c3Qgc3BlY2lmeSBhdCBsZWFzdCBhIGZpbGUgbmFtZSB3aXRoIHRoZSBsb2FkIGNvbW1hbmQuKnwuKlVzZSB0aGUgLmZpbGUuIG9yIC5leGVjLWZpbGUuIGNvbW1hbmQuKiIgImxvYWQiCisjdGVzdCBuZXh0ICJuIiBhYmJyZXZpYXRpb24KK3NldHVwX3hmYWlsICJhMjlrLSotdWRpIgorZ2RiX3Rlc3QgIm4iICJUaGUgcHJvZ3JhbSBpcyBub3QgYmVpbmcgcnVuLiIgIm5leHQgXCJuXCIgYWJicmV2aWF0aW9uIgorI3Rlc3QgbmV4dAorc2V0dXBfeGZhaWwgImEyOWstKi11ZGkiCitnZGJfdGVzdCAibmV4dCIgIlRoZSBwcm9ncmFtIGlzIG5vdCBiZWluZyBydW4uIiAibmV4dCIKKyN0ZXN0IG5leHRpICJuaSIgYWJicmV2aWF0aW9uCitzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKK2dkYl90ZXN0ICJuaSIgIlRoZSBwcm9ncmFtIGlzIG5vdCBiZWluZyBydW4uIiAibmV4dGkgXCJuaVwiIGFiYnJldmlhdGlvbiIKKyN0ZXN0IG5leHRpCitzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKK2dkYl90ZXN0ICJuZXh0aSIgIlRoZSBwcm9ncmFtIGlzIG5vdCBiZWluZyBydW4uIiAibmV4dGkiCisjdGVzdCBvdXRwdXQKK2dkYl90ZXN0ICJvdXRwdXQiICJBcmd1bWVudCByZXF1aXJlZCAuZXhwcmVzc2lvbiB0byBjb21wdXRlLioiICJvdXRwdXQiCisKKyN0ZXN0IG92ZXJsYXkKK2dkYl90ZXN0ICJvdmVybGF5IiAiXCJvdmVybGF5XCIgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiAuKiIKKyN0ZXN0IGEgbm9uLWV4aXN0YW50IG92ZXJsYXkgc3ViY29tbWFuZAorZ2RiX3Rlc3QgIm92ZXJsYXkgb24iICAgICAiVW5kZWZpbmVkIG92ZXJsYXkgY29tbWFuZC4qIFRyeSBcImhlbHAgb3ZlcmxheVwiLiIKK2dkYl90ZXN0ICJvdmVybGF5IG1hbnVhbCIgIiIgIm92ZXJsYXkgbWFudWFsICMxIgorZ2RiX3Rlc3QgIm92ZXJsYXkgYXV0byIgICAiIgorZ2RiX3Rlc3QgIm92ZXJsYXkgb2ZmIiAgICAiIgorZ2RiX3Rlc3QgIm92ZXJsYXkgbGlzdCIgICAiTm8gc2VjdGlvbnMgYXJlIG1hcHBlZC4iCitnZGJfdGVzdCAib3ZlcmxheSBtYXAiICAgICJPdmVybGF5IGRlYnVnZ2luZyBub3QgZW5hYmxlZC4qIiAib3ZlcmxheSBtYXAgIzEiCitnZGJfdGVzdCAib3ZlcmxheSB1bm1hcCIgICJPdmVybGF5IGRlYnVnZ2luZyBub3QgZW5hYmxlZC4qIiAib3ZlcmxheSB1bm1hcCAjMiIKK2dkYl90ZXN0ICJvdmVybGF5IG1hbnVhbCIgIiIgIm92ZXJsYXkgbWFudWFsICMyIgorZ2RiX3Rlc3QgIm92ZXJsYXkgbWFwIiAgICAiQXJndW1lbnQgcmVxdWlyZWQ6IG5hbWUgb2YgYW4gb3ZlcmxheSBzZWN0aW9uLiIgIm92ZXJsYXkgbWFwICMyIgorZ2RiX3Rlc3QgIm92ZXJsYXkgdW5tYXAiICAiQXJndW1lbnQgcmVxdWlyZWQ6IG5hbWUgb2YgYW4gb3ZlcmxheSBzZWN0aW9uLiIgIm92ZXJsYXkgdW5tYXAgIzIiCisKKyN0ZXN0IHByaW50ICJwIiBhYmJyZXZpYXRpb24KK2dkYl90ZXN0ICJwIiAiVGhlIGhpc3RvcnkgaXMgZW1wdHkuIiAicHJpbnQgXCJwXCIgYWJicmV2aWF0aW9uIgorI3Rlc3QgcHJpbnQKK2dkYl90ZXN0ICJwcmludCIgIlRoZSBoaXN0b3J5IGlzIGVtcHR5LiIgInByaW50IgorI3Rlc3QgcHJpbnRmCitnZGJfdGVzdCAicHJpbnRmIiAiQXJndW1lbnQgcmVxdWlyZWQgLmZvcm1hdC1jb250cm9sIHN0cmluZyBhbmQgdmFsdWVzIHRvIHByaW50LioiICJwcmludGYiCisjdGVzdCBwdHlwZQorZ2RiX3Rlc3QgInB0eXBlIiAiVGhlIGhpc3RvcnkgaXMgZW1wdHkuIiAicHR5cGUiCisjdGVzdCBwd2QKK2dkYl90ZXN0ICJwd2QiICJXb3JraW5nIGRpcmVjdG9yeSAuKiIgInB3ZCIKKworI3Rlc3QgcnVuICJyIiBhYmJyZXZpYXRpb24KK2lmIFtpc3RhcmdldCAiKi0qLXZ4d29ya3MqIl0gdGhlbiB7CisgICAgZ2RiX3Rlc3QgInNldCBhcmdzIiAiIiAiIiAKKworICAgIGdkYl90ZXN0ICJyIiAiU3RhcnRpbmcgcHJvZ3JhbTogLioKK1lvdSBtdXN0IHNwZWNpZnkgYSBmdW5jdGlvbiBuYW1lIHRvIHJ1biwgYW5kIGFyZ3VtZW50cyBpZiBhbnkiXAorCQkicnVuIFwiclwiIGFiYnJldmlhdGlvbiIKKyAgICBnZGJfdGVzdCAic2V0IGFyZ3MgbWFpbiIgIiIgIiIgCisKK30gZWxzZSB7CisgICAgc2VuZF9nZGIgInJcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwkgICAgLXJlICJTdGFydGluZyBwcm9ncmFtOiAgLioKK1lvdSBjYW4ndCBkbyB0aGF0IHdoZW4geW91ciB0YXJnZXQgaXMgYE5vbmUnLiokZ2RiX3Byb21wdCAkIlwKKwkJCXsgcGFzcyAicnVuIFwiclwiIGFiYnJldmlhdGlvbiIgfQorCSAgICAtcmUgIlN0YXJ0aW5nIHByb2dyYW06ICAuKgorTm8gZXhlY3V0YWJsZSBmaWxlIHNwZWNpZmllZC4qCitVc2UgdGhlIFwiZmlsZVwiIG9yIFwiZXhlYy1maWxlXCIgY29tbWFuZC4qJGdkYl9wcm9tcHQgJCJcCisJCQl7IHBhc3MgInJ1biBcInJcIiBhYmJyZXZpYXRpb24iIH0KKwkgICAgLXJlICJTdGFydGluZyBwcm9ncmFtOiAgLioKK05vIGltYWdlIGxvYWRlZCBpbnRvIHRhcmdldC4qJGdkYl9wcm9tcHQgJCJcCisJCQl7IHBhc3MgInJ1biBcInJcIiBhYmJyZXZpYXRpb24iIH0KKwkgICAgLXJlICJTdGFydGluZyBwcm9ncmFtOiAgLioKK05vIHByb2dyYW0gbG9hZGVkLiokZ2RiX3Byb21wdCAkIlwKKwkJCXsgcGFzcyAicnVuIFwiclwiIGFiYnJldmlhdGlvbiIgfQorCSAgICAtcmUgIkRvbid0IGtub3cgaG93IHRvIHJ1bi4gIFRyeSBcImhlbHAgdGFyZ2V0XCIuLiokZ2RiX3Byb21wdCAkIlwKKwkJCXsgcGFzcyAicnVuIFwiclwiIGFiYnJldmlhdGlvbiIgfQorCSAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJydW4gXCJyXCIgYWJicmV2aWF0aW9uIiB9CisJICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHJ1biBcInJcIiBhYmJyZXZpYXRpb24iIH0KKwl9Cit9CisKKyN0ZXN0IHJ1bgoraWYgW2lzdGFyZ2V0ICIqLSotdnh3b3JrcyoiXSB0aGVuIHsKKyAgICBnZGJfdGVzdCAic2V0IGFyZ3MiICIiICIiIAorCisgICAgZ2RiX3Rlc3QgInJ1biIgIlN0YXJ0aW5nIHByb2dyYW06IC4qCitZb3UgbXVzdCBzcGVjaWZ5IGEgZnVuY3Rpb24gbmFtZSB0byBydW4sIGFuZCBhcmd1bWVudHMgaWYgYW55IgorICAgIGdkYl90ZXN0ICJzZXQgYXJncyBtYWluIiAiIiAiIiAKKworfSBlbHNlIHsKKyAgICBzZW5kX2dkYiAicnVuXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJICAgIC1yZSAiU3RhcnRpbmcgcHJvZ3JhbTouKllvdSBjYW4ndCBkbyB0aGF0IHdoZW4geW91ciB0YXJnZXQgaXMgYE5vbmUnLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInJ1biIgfQorCSAgICAtcmUgIlN0YXJ0aW5nIHByb2dyYW06ICAuKgorTm8gZXhlY3V0YWJsZSBmaWxlIHNwZWNpZmllZC4qCitVc2UgdGhlIFwiZmlsZVwiIG9yIFwiZXhlYy1maWxlXCIgY29tbWFuZC4qJGdkYl9wcm9tcHQgJCJcCisJCQl7IHBhc3MgInJ1biIgfQorCSAgICAtcmUgIlN0YXJ0aW5nIHByb2dyYW06ICAuKgorTm8gaW1hZ2UgbG9hZGVkIGludG8gdGFyZ2V0LiokZ2RiX3Byb21wdCAkIlwKKwkJCXsgcGFzcyAicnVuIiB9CisJICAgIC1yZSAiU3RhcnRpbmcgcHJvZ3JhbTogIC4qCitObyBwcm9ncmFtIGxvYWRlZC4qJGdkYl9wcm9tcHQgJCJcCisJCQl7IHBhc3MgInJ1biBcInJcIiBhYmJyZXZpYXRpb24iIH0KKwkgICAgLXJlICJEb24ndCBrbm93IGhvdyB0byBydW4uICBUcnkgXCJoZWxwIHRhcmdldFwiLi4qJGdkYl9wcm9tcHQgJCJcCisJCQl7IHBhc3MgInJ1biIgfQorCSAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJydW4iIH0KKwkgICAgdGltZW91dAkJeyBmYWlsICIodGltZW91dCkgcnVuIiB9CisJfQorfQorCisjdGVzdCByYnJlYWsKK2dkYl90ZXN0ICJyYnJlYWsiICIiICJyYnJlYWsiCisKKyN0ZXN0IHJldHVybgorIyBUaGUgbWlkZGxlIGNhc2UgYWNjb21tb2RhdGVzIHRoZSBhMjlrLCB3aGVyZSBkb2luZyB0aGUgIm5pIiBhYm92ZSBjYXVzZXMKKyMgYW4gaW5pdGlhbCBzdGFjayB0byBiZSBjcmVhdGVkLgorZ2RiX3Rlc3QgInJldHVybiIgIk5vIHNlbGVjdGVkIGZyYW1lLi4qIiAicmV0dXJuIiAgIk1ha2UgLiogcmV0dXJuIG5vdy4qeSBvciBuLiAkIiAieSIKKworCisjdGVzdCByZXZlcnNlLXNlYXJjaAorZ2RiX3Rlc3QgInJldmVyc2Utc2VhcmNoIiAiTm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uLip8VGhlcmUgaXMgbm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uLioiICJyZXZlcnNlLXNlYXJjaCIKKyN0ZXN0IHN0ZXAgInMiIGFiYnJldmlhdGlvbgorc2V0dXBfeGZhaWwgImEyOWstKi11ZGkiCitnZGJfdGVzdCAicyIgIlRoZSBwcm9ncmFtIGlzIG5vdCBiZWluZyBydW4uIiAic3RlcCBcInNcIiBhYmJyZXZpYXRpb24gIzEiCisjdGVzdCBzdGVwCitzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKK2dkYl90ZXN0ICJzdGVwIiAiVGhlIHByb2dyYW0gaXMgbm90IGJlaW5nIHJ1bi4iICJzdGVwICMxIgorI3Rlc3Qgc2VhcmNoCitnZGJfdGVzdCAic2VhcmNoIiAiTm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uLip8VGhlcmUgaXMgbm8gcHJldmlvdXMgcmVndWxhciBleHByZXNzaW9uLioiICJzZWFyY2giCisjdGVzdCBzZWN0aW9uCitnZGJfdGVzdCAic2VjdGlvbiIgIk11c3Qgc3BlY2lmeSBzZWN0aW9uIG5hbWUgYW5kIGl0cyB2aXJ0dWFsIGFkZHJlc3MuKiIgInNlY3Rpb24iCisjdGVzdCBzZXQgYW5ub3RhdGUKK2dkYl90ZXN0ICJzZXQgYW5ub3RhdGUiICJBcmd1bWVudCByZXF1aXJlZCAuaW50ZWdlciB0byBzZXQgaXQgdG8uKiIgInNldCBhbm5vdGF0ZSIKKyN0ZXN0IHNldCBhcmdzCitnZGJfdGVzdCAic2V0IGFyZ3MiICIiICJzZXQgYXJncyIKKyN0ZXN0IHNldCBjaGVjayAiYyIgYWJicmV2aWF0aW9uCitnZGJfdGVzdCAic2V0IGMiICJcInNldCBjaGVja1wiIG11c3QgYmUgZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgYSBjaGVjayBzdWJjb21tYW5kLi4qXFtcclxuXF0rTGlzdCBvZiBzZXQgY2hlY2sgc3ViY29tbWFuZHM6LipcW1xyXG5cXStzZXQgY2hlY2sgcmFuZ2UgLS0gU2V0IHJhbmdlIGNoZWNraW5nLipcW1xyXG5cXStzZXQgY2hlY2sgdHlwZSAtLSBTZXQgdHlwZSBjaGVja2luZy4qXFtcclxuXF0rVHlwZSBcImhlbHAgc2V0IGNoZWNrXCIgZm9sbG93ZWQgYnkgc2V0IGNoZWNrIHN1YmNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLi4qXFtcclxuXF0rQ29tbWFuZCBuYW1lIGFiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQgaWYgdW5hbWJpZ3VvdXMuIiAic2V0IGNoZWNrIFwiY1wiIGFiYnJldmlhdGlvbiIKKyN0ZXN0IHNldCBjaGVjayAiY2giIGFiYnJldmlhdGlvbgorZ2RiX3Rlc3QgInNldCBjaCIgIlwic2V0IGNoZWNrXCIgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiBhIGNoZWNrIHN1YmNvbW1hbmQuLipcW1xyXG5cXStMaXN0IG9mIHNldCBjaGVjayBzdWJjb21tYW5kczouKlxbXHJcblxdK3NldCBjaGVjayByYW5nZSAtLSBTZXQgcmFuZ2UgY2hlY2tpbmcuKlxbXHJcblxdK3NldCBjaGVjayB0eXBlIC0tIFNldCB0eXBlIGNoZWNraW5nLipcW1xyXG5cXStUeXBlIFwiaGVscCBzZXQgY2hlY2tcIiBmb2xsb3dlZCBieSBzZXQgY2hlY2sgc3ViY29tbWFuZCBuYW1lIGZvciBmdWxsIGRvY3VtZW50YXRpb24uLipcW1xyXG5cXStDb21tYW5kIG5hbWUgYWJicmV2aWF0aW9ucyBhcmUgYWxsb3dlZCBpZiB1bmFtYmlndW91cy4iICJzZXQgY2hlY2sgXCJjaFwiIGFiYnJldmlhdGlvbiIKKyN0ZXN0IHNldCBjaGVjaworZ2RiX3Rlc3QgInNldCBjaGVjayIgIlwic2V0IGNoZWNrXCIgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiBhIGNoZWNrIHN1YmNvbW1hbmQuLipcW1xyXG5cXStMaXN0IG9mIHNldCBjaGVjayBzdWJjb21tYW5kczouKlxbXHJcblxdK3NldCBjaGVjayByYW5nZSAtLSBTZXQgcmFuZ2UgY2hlY2tpbmcuKlxbXHJcblxdK3NldCBjaGVjayB0eXBlIC0tIFNldCB0eXBlIGNoZWNraW5nLipcW1xyXG5cXStUeXBlIFwiaGVscCBzZXQgY2hlY2tcIiBmb2xsb3dlZCBieSBzZXQgY2hlY2sgc3ViY29tbWFuZCBuYW1lIGZvciBmdWxsIGRvY3VtZW50YXRpb24uLipcW1xyXG5cXStDb21tYW5kIG5hbWUgYWJicmV2aWF0aW9ucyBhcmUgYWxsb3dlZCBpZiB1bmFtYmlndW91cy4iICJzZXQgY2hlY2siCisjdGVzdCBzZXQgY2hlY2sgcmFuZ2UKK2dkYl90ZXN0ICJzZXQgY2hlY2sgcmFuZ2UiICIiICJzZXQgY2hlY2sgcmFuZ2UiCisjdGVzdCBzZXQgY2hlY2sgdHlwZQorZ2RiX3Rlc3QgInNldCBjaGVjayB0eXBlIiAiIiAic2V0IGNoZWNrIHR5cGUiCisjdGVzdCBzZXQgY29tcGxhaW50cworZ2RiX3Rlc3QgInNldCBjb21wbGFpbnRzIiAiQXJndW1lbnQgcmVxdWlyZWQgLmludGVnZXIgdG8gc2V0IGl0IHRvLioiICJzZXQgY29tcGxhaW50cyIKKyN0ZXN0IHNldCBjb25maXJtCitnZGJfdGVzdCAic2V0IGNvbmZpcm0iICIiICJzZXQgY29uZmlybSIKKyMgRG9uJ3QgdGVzdCBzZXQgZWRpdGluZy4gV2hhdCBpZiB3ZSdyZSB0YWxraW5nIHRvIGEgZ2RiIHRoYXQKKyMgd29uJ3QgZG8gZWRpdGluZyBjb3JyZWN0bHkgd2hpbGUgd2UncmUgdGFsa2luZyB0byBpdD8KKyMgZ2RiX3Rlc3QgInNldCBlZGl0aW5nIiAiIiAic2V0IGVkaXRpbmciCisKKyN0ZXN0IHNldCBlbnZpcm9ubWVudAorZ2RiX3Rlc3QgInNldCBlbnZpcm9ubWVudCIgIkFyZ3VtZW50IHJlcXVpcmVkIC5lbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgdmFsdWUuKiIgInNldCBlbnZpcm9ubWVudCIKKyN0ZXN0IHNldCBoZWlnaHQKK2dkYl90ZXN0ICJzZXQgaGVpZ2h0IiAiQXJndW1lbnQgcmVxdWlyZWQgLmludGVnZXIgdG8gc2V0IGl0IHRvLioiICJzZXQgaGVpZ2h0IgorI3Rlc3Qgc2V0IGhpc3RvcnkgZXhwYW5zaW9uCitnZGJfdGVzdCAic2V0IGhpc3RvcnkgZXhwYW5zaW9uIiAiIiAic2V0IGhpc3RvcnkgZXhwYW5zaW9uIgorI3Rlc3Qgc2V0IGhpc3RvcnkgZmlsZW5hbWUKK2dkYl90ZXN0ICJzZXQgaGlzdG9yeSBmaWxlbmFtZSIgIkFyZ3VtZW50IHJlcXVpcmVkIC5maWxlbmFtZSB0byBzZXQgaXQgdG8uKiIgInNldCBoaXN0b3J5IGZpbGVuYW1lIgorI3Rlc3Qgc2V0IGhpc3Rvcnkgc2F2ZQorZ2RiX3Rlc3QgInNldCBoaXN0b3J5IHNhdmUiICIiICJzZXQgaGlzdG9yeSBzYXZlIgorI3Rlc3Qgc2V0IGhpc3Rvcnkgc2l6ZQorZ2RiX3Rlc3QgInNldCBoaXN0b3J5IHNpemUiICJBcmd1bWVudCByZXF1aXJlZCAuaW50ZWdlciB0byBzZXQgaXQgdG8uKiIgInNldCBoaXN0b3J5IHNpemUiCisjdGVzdCBzZXQgaGlzdG9yeQorZ2RiX3Rlc3QgInNldCBoaXN0b3J5IiAiXCJzZXQgaGlzdG9yeVwiIG11c3QgYmUgZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgYSBoaXN0b3J5IHN1YmNvbW1hbmQuLipcW1xyXG5cXStMaXN0IG9mIHNldCBoaXN0b3J5IHN1YmNvbW1hbmRzOi4qXFtcclxuXF0rc2V0IGhpc3RvcnkgZXhwYW5zaW9uIC0tIFNldCBoaXN0b3J5IGV4cGFuc2lvbiBvbiBjb21tYW5kIGlucHV0LipcW1xyXG5cXStzZXQgaGlzdG9yeSBmaWxlbmFtZSAtLSBTZXQgdGhlIGZpbGVuYW1lIGluIHdoaWNoIHRvIHJlY29yZCB0aGUgY29tbWFuZCBoaXN0b3J5LipcW1xyXG5cXStzZXQgaGlzdG9yeSBzYXZlIC0tIFNldCBzYXZpbmcgb2YgdGhlIGhpc3RvcnkgcmVjb3JkIG9uIGV4aXQuKlxbXHJcblxdK3NldCBoaXN0b3J5IHNpemUgLS0gU2V0IHRoZSBzaXplIG9mIHRoZSBjb21tYW5kIGhpc3RvcnkuKlxbXHJcblxdK1R5cGUgXCJoZWxwIHNldCBoaXN0b3J5XCIgZm9sbG93ZWQgYnkgc2V0IGhpc3Rvcnkgc3ViY29tbWFuZCBuYW1lIGZvciBmdWxsIGRvY3VtZW50YXRpb24uLipcW1xyXG5cXStDb21tYW5kIG5hbWUgYWJicmV2aWF0aW9ucyBhcmUgYWxsb3dlZCBpZiB1bmFtYmlndW91cy4iICJzZXQgaGlzdG9yeSIKKyN0ZXN0IHNldCBsYW5ndWFnZQorZ2RiX3Rlc3QgInNldCBsYW5ndWFnZSIgIlRoZSBjdXJyZW50bHkgdW5kZXJzdG9vZCBzZXR0aW5ncyBhcmU6LipcW1xyXG5cXStsb2NhbCBvciBhdXRvICAqQXV0b21hdGljIHNldHRpbmcgYmFzZWQgb24gc291cmNlIGZpbGUuKlxbXHJcblxdK2MgICpVc2UgdGhlIEMgbGFuZ3VhZ2UuKlxbXHJcblxdK2NcWytcXSsgICpVc2UgdGhlIENcWytcXSsgbGFuZ3VhZ2UuKlxbXHJcblxdK21vZHVsYS0yICAqVXNlIHRoZSBNb2R1bGEtMiBsYW5ndWFnZS4qIiAic2V0IGxhbmd1YWdlIgorI3Rlc3Qgc2V0IGxpc3RzaXplCitnZGJfdGVzdCAic2V0IGxpc3RzaXplIiAiQXJndW1lbnQgcmVxdWlyZWQgLmludGVnZXIgdG8gc2V0IGl0IHRvLioiICJzZXQgbGlzdHNpemUiCisjdGVzdCBzZXQgcHJpbnQgInAiIGFiYnJldmlhdGlvbgorZ2RiX3Rlc3QgInNldCBwIiAiXCJzZXQgcHJpbnRcIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIGEgcHJpbnQgc3ViY29tbWFuZC4uKlxbXHJcblxdK0xpc3Qgb2Ygc2V0IHByaW50IHN1YmNvbW1hbmRzOi4qXFtcclxuXF0rVHlwZSBcImhlbHAgc2V0IHByaW50XCIgZm9sbG93ZWQgYnkgc2V0IHByaW50IHN1YmNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLi4qXFtcclxuXF0rQ29tbWFuZCBuYW1lIGFiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQgaWYgdW5hbWJpZ3VvdXMuIiAic2V0IHByaW50IFwicFwiIGFiYnJldmlhdGlvbiIKKyN0ZXN0IHNldCBwcmludCAicHIiIGFiYnJldmlhdGlvbgorZ2RiX3Rlc3QgInNldCBwciIgIlwic2V0IHByaW50XCIgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiBhIHByaW50IHN1YmNvbW1hbmQuLipcW1xyXG5cXStMaXN0IG9mIHNldCBwcmludCBzdWJjb21tYW5kczouKlxbXHJcblxdK1R5cGUgXCJoZWxwIHNldCBwcmludFwiIGZvbGxvd2VkIGJ5IHNldCBwcmludCBzdWJjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4uKlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLiIgInNldCBwcmludCBcInByXCIgYWJicmV2aWF0aW9uIgorI3Rlc3Qgc2V0IHByaW50CitnZGJfdGVzdCAic2V0IHByaW50IiAiXCJzZXQgcHJpbnRcIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIGEgcHJpbnQgc3ViY29tbWFuZC4uKlxbXHJcblxdK0xpc3Qgb2Ygc2V0IHByaW50IHN1YmNvbW1hbmRzOi4qXFtcclxuXF0rVHlwZSBcImhlbHAgc2V0IHByaW50XCIgZm9sbG93ZWQgYnkgc2V0IHByaW50IHN1YmNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLi4qXFtcclxuXF0rQ29tbWFuZCBuYW1lIGFiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQgaWYgdW5hbWJpZ3VvdXMuIiAic2V0IHByaW50IgorI3Rlc3Qgc2V0IHByaW50IGFkZHJlc3MKK2dkYl90ZXN0ICJzZXQgcHJpbnQgYWRkcmVzcyIgIiIgInNldCBwcmludCBhZGRyZXNzIgorI3Rlc3Qgc2V0IHByaW50IGFycmF5CitnZGJfdGVzdCAic2V0IHByaW50IGFycmF5IiAiIiAic2V0IHByaW50IGFycmF5IgorI3Rlc3Qgc2V0IHByaW50IGFzbS1kZW1hbmdsZQorZ2RiX3Rlc3QgInNldCBwcmludCBhc20tZGVtYW5nbGUiICIiICJzZXQgcHJpbnQgYXNtLWRlbWFuZ2xlIgorI3Rlc3Qgc2V0IHByaW50IGRlbWFuZ2xlCitnZGJfdGVzdCAic2V0IHByaW50IGRlbWFuZ2xlIiAiIiAic2V0IHByaW50IGRlbWFuZ2xlIgorI3Rlc3Qgc2V0IHByaW50IGVsZW1lbnRzCitnZGJfdGVzdCAic2V0IHByaW50IGVsZW1lbnRzIiAiQXJndW1lbnQgcmVxdWlyZWQgLmludGVnZXIgdG8gc2V0IGl0IHRvLioiICJzZXQgcHJpbnQgZWxlbWVudHMiCisjdGVzdCBzZXQgcHJpbnQgb2JqZWN0CitnZGJfdGVzdCAic2V0IHByaW50IG9iamVjdCIgIiIgInNldCBwcmludCBvYmplY3QiCisjdGVzdCBzZXQgcHJpbnQgcHJldHR5CitnZGJfdGVzdCAic2V0IHByaW50IHByZXR0eSIgIiIgInNldCBwcmludCBwcmV0dHkiCisjdGVzdCBzZXQgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncworZ2RiX3Rlc3QgInNldCBwcmludCBzZXZlbmJpdC1zdHJpbmdzIiAiIiAic2V0IHByaW50IHNldmVuYml0LXN0cmluZ3MiCisjdGVzdCBzZXQgcHJpbnQgdW5pb24KK2dkYl90ZXN0ICJzZXQgcHJpbnQgdW5pb24iICIiICJzZXQgcHJpbnQgdW5pb24iCisjdGVzdCBzZXQgcHJpbnQgdnRibAorZ2RiX3Rlc3QgInNldCBwcmludCB2dGJsIiAiIiAic2V0IHByaW50IHZ0YmwiCisjIEZJWE1FIC0tIG5lZWQgYSB0ZXN0IGZvciAic2V0IHByb21wdCIKKyN0ZXN0IHNldCByYWRpeAorZ2RiX3Rlc3QgInNldCByYWRpeCIgIklucHV0IGFuZCBvdXRwdXQgcmFkaWNlcyBub3cgc2V0IHRvIGRlY2ltYWwgMTAsIGhleCBhLCBvY3RhbCAxMi4qIiAic2V0IHJhZGl4IgorI3Rlc3Qgc2V0IHN5bWJvbC1yZWxvYWRpbmcKK2dkYl90ZXN0ICJzZXQgc3ltYm9sLXJlbG9hZGluZyIgIiIgInNldCBzeW1ib2wtcmVsb2FkaW5nIgorI3Rlc3Qgc2V0IHZhcmlhYmxlCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIiAiQXJndW1lbnQgcmVxdWlyZWQgLmV4cHJlc3Npb24gdG8gY29tcHV0ZS4qIiAic2V0IHZhcmlhYmxlIgorI3Rlc3Qgc2V0IHZlcmJvc2UKK2dkYl90ZXN0ICJzZXQgdmVyYm9zZSIgIiIgInNldCB2ZXJib3NlIgorI3Rlc3Qgc2V0IHdpZHRoCitnZGJfdGVzdCAic2V0IHdpZHRoIiAiQXJndW1lbnQgcmVxdWlyZWQgLmludGVnZXIgdG8gc2V0IGl0IHRvLioiICJzZXQgd2lkdGgiCisjdGVzdCBzZXQgd3JpdGUKKyMgVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBvbiB0YXJnZXRzIHdoaWNoIHVzZSBleGVjLm8uCitnZGJfdGVzdCAic2V0IHdyaXRlIiAiIiAic2V0IHdyaXRlIgorI3Rlc3Qgc2V0CitnZGJfdGVzdCAic2V0IiAiQXJndW1lbnQgcmVxdWlyZWQgLmV4cHJlc3Npb24gdG8gY29tcHV0ZS4qIiAic2V0IgorI3Rlc3Qgc2hlbGwgZWNobyBIaSBkYWQhCitnZGJfdGVzdCAic2hlbGwgZWNobyBIaSBkYWQhIiAiSGkgZGFkISIgInNoZWxsIGVjaG8gSGkgZGFkISIKKyN0ZXN0IHNob3cgYW5ub3RhdGUKK2dkYl90ZXN0ICJzaG93IGFubm90YXRlIiAiQW5ub3RhdGlvbl9sZXZlbCBpcyAwLiIgCSAic2hvdyBhbm5vdGF0ZSIKKyN0ZXN0IHNob3cgYXJncworZ2RiX3Rlc3QgInNob3cgYXJncyIgIkFyZ3VtZW50IGxpc3QgdG8gZ2l2ZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkIHdoZW4gaXQgaXMgc3RhcnRlZCBpcyBcIlwiLiIgInNob3cgYXJncyIKKyN0ZXN0IHNob3cgY2hlY2sgImMiIGFiYnJldmlhdGlvbgorZ2RiX3Rlc3QgInNob3cgYyIgInJhbmdlOiAgKlJhbmdlIGNoZWNraW5nIGlzIFwiYXV0bzsgY3VycmVudGx5IG9mZlwiLi4qXFtcclxuXF0rdHlwZTogICpUeXBlIGNoZWNraW5nIGlzIFwiYXV0bzsgY3VycmVudGx5IG9mZlwiLioiICJzaG93IGNoZWNrIFwiY1wiIGFiYnJldmlhdGlvbiIKKyN0ZXN0IHNob3cgY2hlY2sgImNoIiBhYmJyZXZpYXRpb24KK2dkYl90ZXN0ICJzaG93IGNoIiAicmFuZ2U6ICpSYW5nZSBjaGVja2luZyBpcyBcImF1dG87IGN1cnJlbnRseSBvZmZcIi4uKlxbXHJcblxdK3R5cGU6ICAqVHlwZSBjaGVja2luZyBpcyBcImF1dG87IGN1cnJlbnRseSBvZmZcIi4iICJzaG93IGNoZWNrIFwiY2hcIiBhYmJyZXZpYXRpb24iCisjdGVzdCBzaG93IGNoZWNrCitnZGJfdGVzdCAic2hvdyBjaGVjayIgInJhbmdlOiAgKlJhbmdlIGNoZWNraW5nIGlzIFwiYXV0bzsgY3VycmVudGx5IG9mZlwiLi4qXFtcclxuXF0rdHlwZTogICpUeXBlIGNoZWNraW5nIGlzIFwiYXV0bzsgY3VycmVudGx5IG9mZlwiLiIgInNob3cgY2hlY2siCisjdGVzdCBzaG93IGNoZWNrIHJhbmdlCitnZGJfdGVzdCAic2hvdyBjaGVjayByYW5nZSIgIlJhbmdlIGNoZWNraW5nIGlzIFwiYXV0bzsgY3VycmVudGx5IG9mZlwiLiIgInNob3cgY2hlY2sgcmFuZ2UiCisjdGVzdCBzaG93IGNoZWNrIHR5cGUKK2dkYl90ZXN0ICJzaG93IGNoZWNrIHR5cGUiICJUeXBlIGNoZWNraW5nIGlzIFwiYXV0bzsgY3VycmVudGx5IG9mZlwiLiIgInNob3cgY2hlY2sgdHlwZSIKKyN0ZXN0IHNob3cgY29tbWFuZHMKK2dkYl90ZXN0ICJzaG93IGNvbW1hbmRzIiAiIiAic2hvdyBjb21tYW5kcyIKKyN0ZXN0IHNob3cgY29tcGxhaW50cworZ2RiX3Rlc3QgInNob3cgY29tcGxhaW50cyIgIk1heCBudW1iZXIgb2YgY29tcGxhaW50cyBhYm91dCBpbmNvcnJlY3Qgc3ltYm9scyBpcyAwLiIgInNob3cgY29tcGxhaW50cyIKKyN0ZXN0IHNob3cgY29uZmlybQorZ2RiX3Rlc3QgInNob3cgY29uZmlybSIgIldoZXRoZXIgdG8gY29uZmlybSBwb3RlbnRpYWxseSBkYW5nZXJvdXMgb3BlcmF0aW9ucyBpcyBvXFthLXpcXSouIiAic2hvdyBjb25maXJtIgorI3Rlc3Qgc2hvdyBjb252ZW5pZW5jZQorZ2RiX3Rlc3QgInNob3cgY29udmVuaWVuY2UiICJObyBkZWJ1Z2dlciBjb252ZW5pZW5jZSB2YXJpYWJsZXMgbm93IGRlZmluZWQuLipcW1xyXG5cXStDb252ZW5pZW5jZSB2YXJpYWJsZXMgaGF2ZSBuYW1lcyBzdGFydGluZyB3aXRoIFwiLlwiOy4qXFtcclxuXF0rdXNlIFwic2V0XCIgYXMgaW4gXCJzZXQgLmZvbyA9IDVcIiB0byBkZWZpbmUgdGhlbS4iICJzaG93IGNvbnZlbmllbmNlIgorI3Rlc3Qgc2hvdyBkaXJlY3RvcmllcworZ2RiX3Rlc3QgInNob3cgZGlyZWN0b3JpZXMiICJTb3VyY2UgZGlyZWN0b3JpZXMgc2VhcmNoZWQ6IC5jZGlyOi5jd2QiICJzaG93IGRpcmVjdG9yaWVzIgorI3Rlc3Qgc2hvdyBlZGl0aW5nCitnZGJfdGVzdCAic2hvdyBlZGl0aW5nIiAiRWRpdGluZyBvZiBjb21tYW5kIGxpbmVzIGFzIHRoZXkgYXJlIHR5cGVkIGlzIG9cW2EtelxdKi4iICJzaG93IGVkaXRpbmciCisjdGVzdCBzaG93IGhlaWdodAorZ2RiX3Rlc3QgInNob3cgaGVpZ2h0IiAiTnVtYmVyIG9mIGxpbmVzIGdkYiB0aGlua3MgYXJlIGluIGEgcGFnZSBpcy4qIiAic2hvdyBoZWlnaHQiCisjdGVzdCBzaG93IGhpc3RvcnkgZXhwYW5zaW9uCitnZGJfdGVzdCAic2hvdyBoaXN0b3J5IGV4cGFuc2lvbiIgIkhpc3RvcnkgZXhwYW5zaW9uIG9uIGNvbW1hbmQgaW5wdXQgaXMgb1xbYS16XF0qLioiICJzaG93IGhpc3RvcnkgZXhwYW5zaW9uIgorI3Rlc3Qgc2hvdyBoaXN0b3J5IGZpbGVuYW1lCitnZGJfdGVzdCAic2hvdyBoaXN0b3J5IGZpbGVuYW1lIiAiVGhlIGZpbGVuYW1lIGluIHdoaWNoIHRvIHJlY29yZCB0aGUgY29tbWFuZCBoaXN0b3J5IGlzLiouZ2RiX2hpc3RvcnkuKiIgInNob3cgaGlzdG9yeSBmaWxlbmFtZSIKKyN0ZXN0IHNob3cgaGlzdG9yeSBzYXZlCitnZGJfdGVzdCAic2hvdyBoaXN0b3J5IHNhdmUiICJTYXZpbmcgb2YgdGhlIGhpc3RvcnkgcmVjb3JkIG9uIGV4aXQgaXMgb24uIiAic2hvdyBoaXN0b3J5IHNhdmUiCisjdGVzdCBzaG93IGhpc3Rvcnkgc2l6ZQorZ2RiX3Rlc3QgInNob3cgaGlzdG9yeSBzaXplIiAiVGhlIHNpemUgb2YgdGhlIGNvbW1hbmQgaGlzdG9yeSBpcy4qIiAic2hvdyBoaXN0b3J5IHNpemUiCisjdGVzdCBzaG93IGhpc3RvcnkKK2dkYl90ZXN0ICJzaG93IGhpc3RvcnkiICJleHBhbnNpb246ICAqSGlzdG9yeSBleHBhbnNpb24gb24gY29tbWFuZCBpbnB1dCBpcyBvLipcW1xyXG5cXStmaWxlbmFtZTogICpUaGUgZmlsZW5hbWUgaW4gd2hpY2ggdG8gcmVjb3JkIHRoZSBjb21tYW5kIGhpc3RvcnkgaXMuKi5nZGJfaGlzdG9yeS4qXFtcclxuXF0rc2F2ZTogKlNhdmluZyBvZiB0aGUgaGlzdG9yeSByZWNvcmQgb24gZXhpdCBpcyBvLipcW1xyXG5cXStzaXplOiAqIFRoZSBzaXplIG9mIHRoZSBjb21tYW5kIGhpc3RvcnkgaXMuKiIgInNob3cgaGlzdG9yeSIKKyN0ZXN0IHNob3cgbGFuZ3VhZ2UKK2dkYl90ZXN0ICJzaG93IGxhbmd1YWdlIiAiVGhlIGN1cnJlbnQgc291cmNlIGxhbmd1YWdlIGlzIFwiYXV0bzsgY3VycmVudGx5IGNcIi4iICJzaG93IGxhbmd1YWdlIgorI3Rlc3Qgc2hvdyBsaXN0c2l6ZQorZ2RiX3Rlc3QgInNob3cgbGlzdHNpemUiICJOdW1iZXIgb2Ygc291cmNlIGxpbmVzIGdkYiB3aWxsIGxpc3QgYnkgZGVmYXVsdCBpcyAxMC4iICJzaG93IGxpc3RzaXplIgorI3Rlc3Qgc2hvdyBwcmludCAicCIgYWJicmV2aWF0aW9uCitnZGJfdGVzdCAic2hvdyBwIiAiLioiICJzaG93IHAiCisjdGVzdCBzaG93IHByaW50ICJwciIgYWJicmV2aWF0aW9uCitnZGJfdGVzdCAic2hvdyBwciIgIi4qIiAic2hvdyBwciIKKyN0ZXN0IHNob3cgcHJpbnQKK2dkYl90ZXN0ICJzaG93IHByaW50IiAiIiAic2hvdyBwcmludCIKKyN0ZXN0IHNob3cgcGF0aHMKK2dkYl90ZXN0ICJzaG93IHBhdGhzIiAiRXhlY3V0YWJsZSBhbmQgb2JqZWN0IGZpbGUgcGF0aDouKiIgInNob3cgcGF0aHMiCisjdGVzdCBzaG93IHByaW50IGFkZHJlc3MKK2dkYl90ZXN0ICJzaG93IHByaW50IGFkZHJlc3MiICJQcmludGluZyBvZiBhZGRyZXNzZXMgaXMgb24uIiAic2hvdyBwcmludCBhZGRyZXNzIgorI3Rlc3Qgc2hvdyBwcmludCBhcnJheQorZ2RiX3Rlc3QgInNob3cgcHJpbnQgYXJyYXkiICJQcmV0dHlwcmludGluZyBvZiBhcnJheXMgaXMgb24uIiAic2hvdyBwcmludCBhcnJheSIKKyN0ZXN0IHNob3cgcHJpbnQgYXNtLWRlbWFuZ2xlCitnZGJfdGVzdCAic2hvdyBwcmludCBhc20tZGVtYW5nbGUiICJEZW1hbmdsaW5nIG9mIENcWytcXSsgbmFtZXMgaW4gZGlzYXNzZW1ibHkgbGlzdGluZ3MgaXMgb24uIiAic2hvdyBwcmludCBhc20tZGVtYW5nbGUiCisjdGVzdCBzaG93IHByaW50IGRlbWFuZ2xlCitnZGJfdGVzdCAic2hvdyBwcmludCBkZW1hbmdsZSIgIkRlbWFuZ2xpbmcgb2YgZW5jb2RlZCBDXFsrXF0rIG5hbWVzIHdoZW4gZGlzcGxheWluZyBzeW1ib2xzIGlzIG9uLiIgInNob3cgcHJpbnQgZGVtYW5nbGUiCisjdGVzdCBzaG93IHByaW50IGVsZW1lbnRzCitnZGJfdGVzdCAic2hvdyBwcmludCBlbGVtZW50cyIgIkxpbWl0IG9uIHN0cmluZyBjaGFycyBvciBhcnJheSBlbGVtZW50cyB0byBwcmludCBpcyAyMDAuIiAic2hvdyBwcmludCBlbGVtZW50cyIKKyN0ZXN0IHNob3cgcHJpbnQgb2JqZWN0CitnZGJfdGVzdCAic2hvdyBwcmludCBvYmplY3QiICJQcmludGluZyBvZiBvYmplY3QncyBkZXJpdmVkIHR5cGUgYmFzZWQgb24gdnRhYmxlIGluZm8gaXMgb24uIiAic2hvdyBwcmludCBvYmplY3QiCisjdGVzdCBzaG93IHByaW50IHByZXR0eQorZ2RiX3Rlc3QgInNob3cgcHJpbnQgcHJldHR5IiAiUHJldHR5cHJpbnRpbmcgb2Ygc3RydWN0dXJlcyBpcyBvbi4iICJzaG93IHByaW50IHByZXR0eSIKKyN0ZXN0IHNob3cgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncworZ2RiX3Rlc3QgInNob3cgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncyIgIlByaW50aW5nIG9mIDgtYml0IGNoYXJhY3RlcnMgaW4gc3RyaW5ncyBhcyAubm5uIGlzIG9uLiIgInNob3cgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncyIKKyN0ZXN0IHNob3cgcHJpbnQgdW5pb24KK2dkYl90ZXN0ICJzaG93IHByaW50IHVuaW9uIiAiUHJpbnRpbmcgb2YgdW5pb25zIGludGVyaW9yIHRvIHN0cnVjdHVyZXMgaXMgb24uIiAic2hvdyBwcmludCB1bmlvbiIKKyN0ZXN0IHNob3cgcHJpbnQgdnRibAorZ2RiX3Rlc3QgInNob3cgcHJpbnQgdnRibCIgIlByaW50aW5nIG9mIENcWytcXSsgdmlydHVhbCBmdW5jdGlvbiB0YWJsZXMgaXMgb24uIiAic2hvdyBwcmludCB2dGJsIgorI3Rlc3Qgc2hvdyBwcm9tcHQKKyMgSW4gdGhlIEZBSUwgY2FzZSwgY2FuJ3QganVzdCBsb29rIGZvciAkZ2RiX3Byb21wdCBiZWNhdXNlIHRoYXQgd2lsbCBtYXRjaAorIyB0aGUgb3V0cHV0LCByYXRoZXIgdGhhbiB0aGUgcHJvbXB0LiBTbyBsb29rIGZvciAkZ2RiX3Byb21wdCBhdCB0aGUgc3RhcnQKKyMgb2YgYSBsaW5lLgorZ2RiX3Rlc3QgInNob3cgcHJvbXB0IiAiR2RiJ3MgcHJvbXB0IGlzIFwiJGdkYl9wcm9tcHQgXCIuKiIgInNob3cgcHJvbXB0IgorI3Rlc3Qgc2hvdyByYWRpeAorZ2RiX3Rlc3QgInNob3cgcmFkaXgiICJJbnB1dCBhbmQgb3V0cHV0IHJhZGljZXMgc2V0IHRvIGRlY2ltYWwgMTAsIGhleCBhLCBvY3RhbCAxMi4iICJzaG93IHJhZGl4IgorI3Rlc3Qgc2hvdyBzeW1ib2wtcmVsb2FkaW5nCitnZGJfdGVzdCAic2hvdyBzeW1ib2wtcmVsb2FkaW5nIiAiRHluYW1pYyBzeW1ib2wgdGFibGUgcmVsb2FkaW5nIG11bHRpcGxlIHRpbWVzIGluIG9uZSBydW4gaXMgb24uIiAic2hvdyBzeW1ib2wtcmVsb2FkaW5nIgorI3Rlc3Qgc2hvdyB1c2VyCitnZGJfdGVzdCAic2hvdyB1c2VyIiAiIiAic2hvdyB1c2VyIgorI3Rlc3Qgc2hvdyB2YWx1ZXMKK2dkYl90ZXN0ICJzaG93IHZhbHVlcyIgIiIgInNob3cgdmFsdWVzIgorI3Rlc3Qgc2hvdyB2ZXJib3NlCitnZGJfdGVzdCAic2hvdyB2ZXJib3NlIiAiVmVyYm9zZSBwcmludGluZyBvZiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIGlzIG8uKnxWZXJib3NpdHkgaXMgb2ZmLioiICJzaG93IHZlcmJvc2UiCisjdGVzdCBzaG93IHZlcnNpb24KKworZ2RiX3Rlc3QgInNob3cgdmVyc2lvbiIgIkdOVSBnZGIgXFswLTlcLlxdKi4qXFtcclxuXF0rQ29weXJpZ2h0IFxbMC05XF0qIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLipcW1xyXG5cXStHREIgaXMgZnJlZSBzb2Z0d2FyZSwgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFuZCB5b3UgYXJlLipcW1xyXG5cXSt3ZWxjb21lIHRvIGNoYW5nZSBpdCBhbmQvb3IgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgaXQgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLipcW1xyXG5cXStUeXBlIFwic2hvdyBjb3B5aW5nXCIgdG8gc2VlIHRoZSBjb25kaXRpb25zLipcW1xyXG5cXStUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGZvciBHREIuICBUeXBlIFwic2hvdyB3YXJyYW50eVwiIGZvciBkZXRhaWxzLipcW1xyXG5cXStUaGlzIEdEQiB3YXMgY29uZmlndXJlZCBhcyAuKnxHREIgaXMgZnJlZSBzb2Z0d2FyZSBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGl0LipcW1xyXG5cXSsgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIFwic2hvdyBjb3B5aW5nXCIgdG8gc2VlIHRoZSBjb25kaXRpb25zLi4qXFtcclxuXF0rVGhlcmUgaXMgYWJzb2x1dGVseSBubyB3YXJyYW50eSBmb3IgR0RCOyB0eXBlIFwic2hvdyB3YXJyYW50eVwiIGZvciBkZXRhaWxzLi4qXFtcclxuXF0rR0RCLipDb3B5cmlnaHQgXFswLTlcXSogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuKiIgInNob3cgdmVyc2lvbiIKKyN0ZXN0IHNob3cgd2lkdGgKK2dkYl90ZXN0ICJzaG93IHdpZHRoIiAiTnVtYmVyIG9mIGNoYXJhY3RlcnMgZ2RiIHRoaW5rcyBhcmUgaW4gYSBsaW5lIGlzLioiICJzaG93IHdpZHRoIgorI3Rlc3Qgc2hvdyB3cml0ZQorIyBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIG9uIHRhcmdldHMgd2hpY2ggdXNlIGV4ZWMuby4KK2dkYl90ZXN0ICJzaG93IHdyaXRlIiAiV3JpdGluZyBpbnRvIGV4ZWN1dGFibGUgYW5kIGNvcmUgZmlsZXMgaXMgby4qIiAic2hvdyB3cml0ZSIKKyN0ZXN0IHNob3cKK2dkYl90ZXN0ICJzaG93IiAiY29uZmlybTogICpXaGV0aGVyIHRvIGNvbmZpcm0gcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIG9wZXJhdGlvbnMgaXMgb24uLipcW1xyXG5cXStoaXN0b3J5IGZpbGVuYW1lOiAgKlRoZSBmaWxlbmFtZSBpbiB3aGljaCB0byByZWNvcmQgdGhlIGNvbW1hbmQgaGlzdG9yeSBpcyAuKlxbXHJcblxdK2hpc3Rvcnkgc2F2ZTogICpTYXZpbmcgb2YgdGhlIGhpc3RvcnkgcmVjb3JkIG9uIGV4aXQgaXMgb24uLipcW1xyXG5cXStoaXN0b3J5IHNpemU6ICAqVGhlIHNpemUgb2YgdGhlIGNvbW1hbmQgaGlzdG9yeSBpcy4qXFtcclxuXF0rbGlzdHNpemU6ICAqTnVtYmVyIG9mIHNvdXJjZSBsaW5lcyBnZGIgd2lsbCBsaXN0IGJ5IGRlZmF1bHQgaXMgMTAuKlxbXHJcblxdK3ByaW50IGVsZW1lbnRzOiAgKkxpbWl0IG9uIHN0cmluZyBjaGFycyBvciBhcnJheSBlbGVtZW50cyB0byBwcmludCBpcyAyMDAuLioiICJzaG93IgorI3Rlc3Qgc3RlcGkgInNpIiBhYmJyZXZpYXRpb24KK3NldHVwX3hmYWlsICJhMjlrLSotdWRpIgorZ2RiX3Rlc3QgICJzaSIgIlRoZSBwcm9ncmFtIGlzIG5vdCBiZWluZyBydW4uIiAic3RlcGkgXCJzaVwiIGFiYnJldmlhdGlvbiIKKyN0ZXN0IHN0ZXBpCitzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKK2dkYl90ZXN0ICJzdGVwaSIgIlRoZSBwcm9ncmFtIGlzIG5vdCBiZWluZyBydW4uIiAic3RlcGkiCisjdGVzdCBzaWduYWwKK3NldHVwX3hmYWlsICJhMjlrLSotdWRpIgorZ2RiX3Rlc3QgInNpZ25hbCIgIlRoZSBwcm9ncmFtIGlzIG5vdCBiZWluZyBydW4uIiAic2lnbmFsIgorI3Rlc3Qgc291cmNlCitnZGJfdGVzdCAic291cmNlIiAic291cmNlIGNvbW1hbmQgcmVxdWlyZXMgcGF0aG5hbWUgb2YgZmlsZSB0byBzb3VyY2UuLip8Tm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeS4qIiAic291cmNlIgorI3Rlc3Qgc3RlcCAicyIgYWJicmV2aWF0aW9uCitzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKK2dkYl90ZXN0ICJzIiAiVGhlIHByb2dyYW0gaXMgbm90IGJlaW5nIHJ1bi4iICJzdGVwIFwic1wiIGFiYnJldmlhdGlvbiAjMiIKKyN0ZXN0IHN0ZXAKK3NldHVwX3hmYWlsICJhMjlrLSotdWRpIgorZ2RiX3Rlc3QgInN0ZXAiICJUaGUgcHJvZ3JhbSBpcyBub3QgYmVpbmcgcnVuLiIgInN0ZXAgIzIiCisjdGVzdCBzeW1ib2wtZmlsZQorZ2RiX3Rlc3QgInN5bWJvbC1maWxlIiAiIiAic3ltYm9sLWZpbGUiCisKKyN0ZXN0IHRhcmdldCBjaGlsZAorZ2RiX3Rlc3QgInRhcmdldCBjaGlsZCIgIlVzZSB0aGUgXCJydW5cIiBjb21tYW5kIHRvIHN0YXJ0IGEgVW5peCBjaGlsZCBwcm9jZXNzLip8VW5kZWZpbmVkIHRhcmdldCBjb21tYW5kOiBcImNoaWxkXCIuICAqVHJ5IFwiaGVscCB0YXJnZXRcIi4qIiAidGFyZ2V0IGNoaWxkIgorCisjdGVzdCB0YXJnZXQgcHJvY2ZzCitnZGJfdGVzdCAidGFyZ2V0IHByb2NmcyIgIlVzZSB0aGUgXCJydW5cIiBjb21tYW5kIHRvIHN0YXJ0IGEgVW5peCBjaGlsZCBwcm9jZXNzLip8VW5kZWZpbmVkIHRhcmdldCBjb21tYW5kOiBcInByb2Nmc1wiLiAgKlRyeSBcImhlbHAgdGFyZ2V0XCIuKiIgInRhcmdldCBwcm9jZnMiCisKKyN0ZXN0IHRhcmdldCBjb3JlCitzZW5kX2dkYiAidGFyZ2V0IGNvcmVcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiTm8gY29yZSBmaWxlIHNwZWNpZmllZC4uKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAidGFyZ2V0IGNvcmUiIH0KKyAgICAtcmUgIi4qQSBwcm9ncmFtIGlzIGJlaW5nIGRlYnVnZ2VkIGFscmVhZHkuICBLaWxsIGl0LiAueSBvciBuLiokIiB7CisJc2VuZF9nZGIgIm5cbiIKKwlpZiAkdmVyYm9zZT4xIHRoZW4geworCSAgICBzZW5kX3VzZXIgIlx0XHREaWRuJ3Qga2lsbCBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkXG4iCisJfQorCWdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIiB7IH0KKwlwYXNzICJ0YXJnZXQgY29yZSIKKyAgICB9CisgICAgLXJlICJVbmRlZmluZWQgdGFyZ2V0IGNvbW1hbmQ6IFwiY29yZVwiLiAgVHJ5IFwiaGVscCB0YXJnZXRcIi4uKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAidGFyZ2V0IGNvcmUiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJ0YXJnZXQgY29yZSIgfQorICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHRhcmdldCBjb3JlIiB9Cit9CisKKyN0ZXN0IHRhcmdldCBleGVjCitzZW5kX2dkYiAidGFyZ2V0IGV4ZWNcbiIKK2dkYl9leHBlY3QgeworCS1yZSAiTm8gZXhlY3V0YWJsZSBmaWxlIG5vdy4uKiRnZGJfcHJvbXB0ICQiXAorCQkJeyBwYXNzICJ0YXJnZXQgZXhlYyIgfQorCS1yZSAiLipBIHByb2dyYW0gaXMgYmVpbmcgZGVidWdnZWQgYWxyZWFkeS4gIEtpbGwgaXQuIC55IG9yIG4uKiQiIHsKKwkgICAgc2VuZF9nZGIgIm5cbiIKKwkgICAgaWYgJHZlcmJvc2U+MSB0aGVuIHsKKwkJc2VuZF91c2VyICJcdFx0RGlkbid0IGtpbGwgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZFxuIgorCSAgICB9CisJICAgIGdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIiB7IH0KKwkgICAgcGFzcyAidGFyZ2V0IGV4ZWMiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIgl7IGZhaWwgInRhcmdldCBleGVjIiB9CisJdGltZW91dAkJeyBmYWlsICIodGltZW91dCkgdGFyZ2V0IGV4ZWMiIH0KKwl9CisKKyN0ZXN0IHRhcmdldCByZW1vdGUKK2lmICFbaXN0YXJnZXQgIiotKi11ZGkqIl0gdGhlbiB7CisgICAgc2VuZF9nZGIgInRhcmdldCByZW1vdGVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIlRvIG9wZW4gYSByZW1vdGUgZGVidWcgY29ubmVjdGlvbiwgeW91IG5lZWQgdG8gc3BlY2lmeSB3aGF0LioKK3NlcmlhbCBkZXZpY2UgaXMgYXR0YWNoZWQgdG8gdGhlIHJlbW90ZSBzeXN0ZW0gLmUuZy4gL2Rldi90dHlhLiokZ2RiX3Byb21wdCAkIlwKKwkJCXsgcGFzcyAidGFyZ2V0IHJlbW90ZSIgfQorCS1yZSAiLipBIHByb2dyYW0gaXMgYmVpbmcgZGVidWdnZWQgYWxyZWFkeS4gIEtpbGwgaXQuIC55IG9yIG4uKiQiIHsKKwkgICAgc2VuZF9nZGIgIm5cbiIKKwkgICAgaWYgJHZlcmJvc2U+MSB0aGVuIHsKKwkJc2VuZF91c2VyICJcdFx0RGlkbid0IGtpbGwgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZFxuIgorCSAgICB9CisJICAgIGdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIiB7IH0KKwkgICAgcGFzcyAidGFyZ2V0IHJlbW90ZSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiCXsgZmFpbCAidGFyZ2V0IHJlbW90ZSIgfQorCXRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHRhcmdldCByZW1vdGUiIH0KKyAgICB9Cit9CisKKyN0ZXN0IHRhcmdldAorZ2RiX3Rlc3QgInRhcmdldCIgIkFyZ3VtZW50IHJlcXVpcmVkIC50YXJnZXQgbmFtZS4qIiAidGFyZ2V0IgorI3Rlc3QgdGJyZWFrCitnZGJfdGVzdCAidGJyZWFrIiAiTm8gZGVmYXVsdCBicmVha3BvaW50IGFkZHJlc3Mgbm93LiIgInRicmVhayIKKyN0ZXN0IHR0eQorZ2RiX3Rlc3QgInR0eSIgIkFyZ3VtZW50IHJlcXVpcmVkIC50ZXJtaW5hbCBuYW1lIGZvciBydW5uaW5nIHRhcmdldCBwcm9jZXNzLioiICJ0dHkiCisjdGVzdCB1bnRpbCAidSIgYWJicmV2aWF0aW9uCitzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKK2dkYl90ZXN0ICJ1IiAiVGhlIHByb2dyYW0gaXMgbm90IHJ1bm5pbmcuIiAidW50aWwgXCJ1XCIgYWJicmV2aWF0aW9uIgorI3Rlc3QgdW50aWwKK3NldHVwX3hmYWlsICJhMjlrLSotdWRpIgorZ2RiX3Rlc3QgInVudGlsIiAiVGhlIHByb2dyYW0gaXMgbm90IHJ1bm5pbmcuIiAidW50aWwiCisjdGVzdCB1bmRpc3BsYXkKKyMgRklYTUUgLS0gbmVlZCB0byBkdW1wIGZ1bGwgb3V0cHV0IHRvIGRldGFpbGVkIGxvZworc2VuZF9nZGIgInVuZGlzcGxheVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJEZWxldGUgYWxsIGF1dG8tZGlzcGxheSBleHByZXNzaW9ucy4qeSBvciBuLiAkIiB7CisJc2VuZF9nZGIgInlcbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IHBhc3MgInVuZGlzcGxheSBwcm9tcHQiIH0KKwkgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSAodGltZW91dCkgdW5kaXNwbGF5IHByb21wdCIgICAgfQorCX0KKyAgICB9CisgICAgdGltZW91dAkJeyBmYWlsICIodGltZW91dCkgKHRpbWVvdXQpIHVuZGlzcGxheSBwcm9tcHQiIH0KK30KKworI3Rlc3QgdW5zZXQgZW52aXJvbm1lbnQKK3NlbmRfZ2RiICJ1bnNldCBlbnZpcm9ubWVudFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJEZWxldGUgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcz8uKnkgb3Igbi4gJCIgeyAKKwlzZW5kX2dkYiAieVxuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAidW5zZXQgZW52aXJvbm1lbnRwcm9tcHQiIH0KKwkgICAgdGltZW91dCB7CisJCWZhaWwgIih0aW1lb3V0KSAodGltZW91dCkgdW5zZXQgZW52aXJvbm1lbnQgcHJvbXB0IgorCSAgICB9CisJfQorICAgIH0KKyAgICB0aW1lb3V0IHsgCisJZmFpbCAiKHRpbWVvdXQpICh0aW1lb3V0KSB1bnNldCBlbnZpcm9ubWVudCBwcm9tcHQiCisgICAgfQorfQorCisjdGVzdCB1bnNldAorZ2RiX3Rlc3QgInVuc2V0IiAiXCJ1bnNldFwiIG11c3QgYmUgZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgYW4gdW5zZXQgc3ViY29tbWFuZC4uKlxbXHJcblxdK0xpc3Qgb2YgdW5zZXQgc3ViY29tbWFuZHM6LipcW1xyXG5cXSt1bnNldCBlbnZpcm9ubWVudCAtLSBDYW5jZWwgZW52aXJvbm1lbnQgdmFyaWFibGUgVkFSIGZvciB0aGUgcHJvZ3JhbS4qXFtcclxuXF0rVHlwZSBcImhlbHAgdW5zZXRcIiBmb2xsb3dlZCBieSB1bnNldCBzdWJjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4uKlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLiIgInVuc2V0IgorI3Rlc3QgdXAKKyN0ZXN0IHVwLXNpbGVudGx5CitnZGJfdGVzdCAidXAtc2lsZW50bHkiICJObyBzdGFjay4iICJ1cC1zaWxlbnRseSIKKyN0ZXN0IHdhdGNoCitnZGJfdGVzdCAid2F0Y2giICJBcmd1bWVudCByZXF1aXJlZCAuZXhwcmVzc2lvbiB0byBjb21wdXRlLioiICJ3YXRjaCIKKyN0ZXN0IHdoYXRpcworZ2RiX3Rlc3QgIndoYXRpcyIgIlRoZSBoaXN0b3J5IGlzIGVtcHR5LiIgIndoYXRpcyIKKyN0ZXN0IHdoZXJlCitzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKK2dkYl90ZXN0ICJ3aGVyZSIgIk5vIHN0YWNrLiIgIndoZXJlIgorI3Rlc3QgeAorI1RoZSBjYXNlIGluIHdoaWNoIGl0IHByaW50cyBhIG51bWJlciBpcyBmb3IgdnhnZGIuCitnZGJfdGVzdCAieCIgIjB4MDouKjB4XFswLTlcXSp8MHgwOi4qQ2Fubm90IGFjY2VzcyBtZW1vcnkgYXQgYWRkcmVzcyAweDAuIiAieCIKKworZ2RiX2V4aXQKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvZGVmaW5lLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvZGVmaW5lLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2QwNmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9kZWZpbmUuZXhwCkBAIC0wLDAgKzEsMzA0IEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBFbGVuYSBaYW5ub25pLiAoZXphbm5vbmlAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCisJfQorCitnbG9iYWwgdXNlc3R1YnMKKworCisjCisjIHRlc3QgcnVubmluZyBwcm9ncmFtcworIworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAiYnJlYWsiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYWRkaXRpb25hbF9mbGFncz0td31dICE9ICIiIH0geworICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworaWYgIVtydW50b19tYWluXSB0aGVuIHsgZmFpbCAiZGVmaW5lIHRlc3RzIHN1cHByZXNzZWQiIH0KKworIyBWZXJpZnkgdGhhdCBHREIgYWxsb3dzIGEgdXNlciB0byBkZWZpbmUgdGhlaXIgdmVyeSBvd24gY29tbWFuZHMuCisjCitzZW5kX2dkYiAiZGVmaW5lIG5leHR3aGVyZVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiVHlwZSBjb21tYW5kcyBmb3IgZGVmaW5pdGlvbiBvZiBcIm5leHR3aGVyZVwiLlxyXG5FbmQgd2l0aCBhIGxpbmUgc2F5aW5nIGp1c3QgXCJlbmRcIi5cclxuPiQiXAorICAgICAgICAgIHtzZW5kX2dkYiAibmV4dFxuYnRcbmVuZFxuIgorICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge3Bhc3MgImRlZmluZSB1c2VyIGNvbW1hbmQ6IG5leHR3aGVyZSJ9CisgICAgICAgICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGRlZmluZSB1c2VyIGNvbW1hbmQ6IG5leHR3aGVyZSJ9CisgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImRlZmluZSB1c2VyIGNvbW1hbmQ6IG5leHR3aGVyZSJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBkZWZpbmUgdXNlciBjb21tYW5kOiBuZXh0d2hlcmUifQorfQorCisjIFZlcmlmeSB0aGF0IHRob3NlIGNvbW1hbmRzIHdvcmsgYXMgZ2RiX2V4cGVjdGVkLgorIworc2VuZF9nZGIgIm5leHR3aGVyZVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiLio2NFxbIFx0XF0qcHJpbnRmLiojMFxbIFx0XF0qbWFpbi4qOjY0LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAidXNlIHVzZXIgY29tbWFuZDogbmV4dHdoZXJlIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAidXNlIHVzZXIgY29tbWFuZDogbmV4dHdoZXJlIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHVzZSB1c2VyIGNvbW1hbmQ6IG5leHR3aGVyZSJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgYSB1c2VyIGNhbiBkZWZpbmUgYSBjb21tYW5kIHdob3NlIHNwZWxsaW5nIGlzIGEKKyMgcHJvcGVyIHN1YnN0cmluZyBvZiBhbm90aGVyIHVzZXItZGVmaW5lZCBjb21tYW5kLgorIworc2VuZF9nZGIgImRlZmluZSBuZXh0d2hcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIlR5cGUgY29tbWFuZHMgZm9yIGRlZmluaXRpb24gb2YgXCJuZXh0d2hcIi5cclxuRW5kIHdpdGggYSBsaW5lIHNheWluZyBqdXN0IFwiZW5kXCIuXHJcbj4kIlwKKyAgICAgICAgICB7c2VuZF9nZGIgIm5leHQgMlxuYnRcbmVuZFxuIgorICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge3Bhc3MgImRlZmluZSB1c2VyIGNvbW1hbmQ6IG5leHR3aCJ9CisgICAgICAgICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGRlZmluZSB1c2VyIGNvbW1hbmQ6IG5leHR3aCJ9CisgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImRlZmluZSB1c2VyIGNvbW1hbmQ6IG5leHR3aCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBkZWZpbmUgdXNlciBjb21tYW5kOiBuZXh0d2gifQorfQorCisjIFZlcmlmeSB0aGF0IGEgdXNlciBjYW4gcmVkZWZpbmUgdGhlaXIgY29tbWFuZHMuICAoVGVzdCBib3RoIHRoZQorIyBjb25maXJtZWQgYW5kIHVuY29uZmlybWVkIGNhc2VzLikKKyMKK3NlbmRfZ2RiICJkZWZpbmUgbmV4dHdoZXJlXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJSZWRlZmluZSBjb21tYW5kIFwibmV4dHdoZXJlXCIuKnkgb3Igbi4gJCJcCisgICAgICAgICAge3NlbmRfZ2RiICJuXG4iCisgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgIC1yZSAiQ29tbWFuZCBcIm5leHR3aGVyZVwiIG5vdCByZWRlZmluZWQuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge3Bhc3MgInJlZGVmaW5lIHVzZXIgY29tbWFuZCBhYm9ydGVkOiBuZXh0d2hlcmUifQorICAgICAgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICB7ZmFpbCAicmVkZWZpbmUgdXNlciBjb21tYW5kIGFib3J0ZWQ6IG5leHR3aGVyZSJ9CisgICAgICAgICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHJlZGVmaW5lIHVzZXIgY29tbWFuZCBhYm9ydGVkOiBuZXh0d2hlcmUifQorICAgICAgICAgICB9CisgICAgICAgICAgfQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJyZWRlZmluZSB1c2VyIGNvbW1hbmQgYWJvcnRlZDogbmV4dHdoZXJlIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHJlZGVmaW5lIHVzZXIgY29tbWFuZCBhYm9ydGVkOiBuZXh0d2hlcmUifQorfQorCitzZW5kX2dkYiAiZGVmaW5lIG5leHR3aGVyZVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiUmVkZWZpbmUgY29tbWFuZCBcIm5leHR3aGVyZVwiLip5IG9yIG4uICQiXAorICAgICAgICAgIHtzZW5kX2dkYiAieVxuIgorICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAtcmUgIlR5cGUgY29tbWFuZHMgZm9yIGRlZmluaXRpb24gb2YgXCJuZXh0d2hlcmVcIi5cclxuRW5kIHdpdGggYSBsaW5lIHNheWluZyBqdXN0IFwiZW5kXCIuXHJcbj4kIlwKKyAgICAgICAgICAgICAgICAgICAgIHtzZW5kX2dkYiAiYnRcbm5leHRcbmVuZFxuIgorICAgICAgICAgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3Bhc3MgInJlZGVmaW5lIHVzZXIgY29tbWFuZDogbmV4dHdoZXJlIn0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSByZWRlZmluZSB1c2VyIGNvbW1hbmQ6IG5leHR3aGVyZSJ9CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSByZWRlZmluZSB1c2VyIGNvbW1hbmQ6IG5leHR3aGVyZSJ9CisgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgInJlZGVmaW5lIHVzZXIgY29tbWFuZDogbmV4dHdoZXJlIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHJlZGVmaW5lIHVzZXIgY29tbWFuZDogbmV4dHdoZXJlIn0KK30KKworIyBWZXJpZnkgdGhhdCBHREIgZ3JhY2VmdWxseSBoYW5kbGVzIGFuIGF0dGVtcHQgdG8gcmVkZWZpbmUgdGhlCisjIGhlbHAgdGV4dCBmb3IgYSBidWlsdGluIGNvbW1hbmQuCisjCitzZW5kX2dkYiAiZG9jdW1lbnQgc3RlcFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiQ29tbWFuZCBcInN0ZXBcIiBpcyBidWlsdC1pbi4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJyZWRvY3VtZW50aW5nIGJ1aWx0aW4gY29tbWFuZCBkaXNhbGxvd2VkIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAicmVkb2N1bWVudGluZyBidWlsdGluIGNvbW1hbmQgZGlzYWxsb3dlZCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSByZWRvY3VtZW50aW5nIGJ1aWx0aW4gY29tbWFuZCBkaXNhbGxvd2VkIn0KK30KKworIyBWZXJpZnkgdGhhdCBhIHVzZXIgY2FuIGRvY3VtZW50IHRoZWlyIG93biBjb21tYW5kcy4gIChBbmQgcmVkb2N1bWVudAorIyB0aGVtLikKKyMKK3NlbmRfZ2RiICJkb2N1bWVudCBuZXh0d2hlcmVcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIlR5cGUgZG9jdW1lbnRhdGlvbiBmb3IgXCJuZXh0d2hlcmVcIi5cclxuRW5kIHdpdGggYSBsaW5lIHNheWluZyBqdXN0IFwiZW5kXCIuXHJcbj4kIlwKKyAgICAgICAgICB7c2VuZF9nZGIgIkEgbmV4dCBjb21tYW5kIHRoYXQgZnJpc3Qgc2hvd3MgeW91IHdoZXJlIHlvdSdyZSBzdGVwcGluZyBmcm9tLlxuZW5kXG4iCisgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiZG9jdW1lbnQgdXNlciBjb21tYW5kOiBuZXh0d2hlcmUifQorICAgICAgICAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBkb2N1bWVudCB1c2VyIGNvbW1hbmQ6IG5leHR3aGVyZSJ9CisgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImRvY3VtZW50aW5nIHVzZXIgY29tbWFuZDogbmV4dHdoZXJlIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGRvY3VtZW50aW5nIHVzZXIgY29tbWFuZDogbmV4dHdoZXJlIn0KK30KKworc2VuZF9nZGIgImRvY3VtZW50IG5leHR3aGVyZVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiVHlwZSBkb2N1bWVudGF0aW9uIGZvciBcIm5leHR3aGVyZVwiLlxyXG5FbmQgd2l0aCBhIGxpbmUgc2F5aW5nIGp1c3QgXCJlbmRcIi5cclxuPiQiXAorICAgICAgICAgIHtzZW5kX2dkYiAiQSBuZXh0IGNvbW1hbmQgdGhhdCBmaXJzdCBzaG93cyB5b3Ugd2hlcmUgeW91J3JlIHN0ZXBwaW5nIGZyb20uXG5lbmRcbiIKKyAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJkb2N1bWVudCB1c2VyIGNvbW1hbmQ6IG5leHR3aGVyZSJ9CisgICAgICAgICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGRvY3VtZW50IHVzZXIgY29tbWFuZDogbmV4dHdoZXJlIn0KKyAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiZG9jdW1lbnRpbmcgdXNlciBjb21tYW5kOiBuZXh0d2hlcmUifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgZG9jdW1lbnRpbmcgdXNlciBjb21tYW5kOiBuZXh0d2hlcmUifQorfQorCitzZW5kX2dkYiAiaGVscCBuZXh0d2hlcmVcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIkEgbmV4dCBjb21tYW5kIHRoYXQgZmlyc3Qgc2hvd3MgeW91IHdoZXJlIHlvdSdyZSBzdGVwcGluZyBmcm9tLlxyXG4kZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiaGVscCB1c2VyIGNvbW1hbmQ6IG5leHR3aGVyZSJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImhlbHAgdXNlciBjb21tYW5kOiBuZXh0d2hlcmUifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaGVscCB1c2VyIGNvbW1hbmQ6IG5leHR3aGVyZSJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgY2FuICJob29rIiBhIGJ1aWx0aW4gY29tbWFuZC4gIFdlIGNob29zZSB0bworIyBob29rIHRoZSAic3RvcCIgcHNldWRvIGNvbW1hbmQsIGFuZCB3ZSdsbCBkZWZpbmUgaXQgdG8gdXNlIGEgdXNlci0KKyMgZGVmaW5lIGNvbW1hbmQuCisjCitzZW5kX2dkYiAiZGVmaW5lIHVzZXItYnRcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIlR5cGUgY29tbWFuZHMgZm9yIGRlZmluaXRpb24gb2YgXCJ1c2VyLWJ0XCIuXHJcbkVuZCB3aXRoIGEgbGluZSBzYXlpbmcganVzdCBcImVuZFwiLlxyXG4+JCJcCisgICAgICAgICAge3NlbmRfZ2RiICJidFxuZW5kXG4iCisgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJkZWZpbmUgdXNlciBjb21tYW5kOiB1c2VyLWJ0In0KKyAgICAgICAgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgZGVmaW5lIHVzZXIgY29tbWFuZDogdXNlci1idCJ9CisgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImRlZmluZSB1c2VyIGNvbW1hbmQ6IHVzZXItYnQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgZGVmaW5lIHVzZXIgY29tbWFuZDogdXNlci1idCJ9Cit9CisKK3NlbmRfZ2RiICJkZWZpbmUgaG9vay1zdG9wXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJUeXBlIGNvbW1hbmRzIGZvciBkZWZpbml0aW9uIG9mIFwiaG9vay1zdG9wXCIuXHJcbkVuZCB3aXRoIGEgbGluZSBzYXlpbmcganVzdCBcImVuZFwiLlxyXG4+JCJcCisgICAgICAgICAge3NlbmRfZ2RiICJ1c2VyLWJcbmVuZFxuIgorICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiZGVmaW5lIGhvb2stc3RvcCBjb21tYW5kIn0KKyAgICAgICAgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgZGVmaW5lIGhvb2stc3RvcCBjb21tYW5kIn0KKyAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiZGVmaW5lIGhvb2stc3RvcCBjb21tYW5kIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGRlZmluZSBob29rLXN0b3AgY29tbWFuZCJ9Cit9CisKK3NlbmRfZ2RiICJuZXh0XG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICIjMFxbIFx0XF0qbWFpbi4qOjY2LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAidXNlIGhvb2stc3RvcCBjb21tYW5kIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAidXNlIGhvb2stc3RvcCBjb21tYW5kIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHVzZSBob29rLXN0b3AgY29tbWFuZCJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgR0RCIHJlc3BvbmRzIGdyYWNlZnVsbHkgdG8gYW4gYXR0ZW1wdCB0byBkZWZpbmUgYSAiaG9vaworIyBjb21tYW5kIiB3aGljaCBkb2Vzbid0IGV4aXN0LiAgKFRlc3QgYm90aCB0aGUgY29uZmlybWVkIGFuZCB1bmNvbmZpcm1lZAorIyBjYXNlcy4pCisjCitzZW5kX2dkYiAiZGVmaW5lIGhvb2stYmFyXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJ3YXJuaW5nOiBZb3VyIG5ldyBgaG9vay1iYXInIGNvbW1hbmQgZG9lcyBub3QgaG9vayBhbnkgZXhpc3RpbmcgY29tbWFuZC5cclxuUHJvY2VlZC4qeSBvciBuLiAkIlwKKyAgICAgICAgICB7c2VuZF9nZGIgIm5cbiIKKyAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgLXJlICJOb3QgY29uZmlybWVkLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJkZWZpbmUgaG9vayB1bmRlZmluZWQgY29tbWFuZCBhYm9ydGVkOiBiYXIifQorICAgICAgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICB7ZmFpbCAiZGVmaW5lIGhvb2sgdW5kZWZpbmVkIGNvbW1hbmQgYWJvcnRlZDogYmFyIn0KKyAgICAgICAgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgZGVmaW5lIGhvb2sgdW5kZWZpbmVkIGNvbW1hbmQgYWJvcnRlZDogYmFyIn0KKyAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiZGVmaW5lIGhvb2sgdW5kZWZpbmVkIGNvbW1hbmQgYWJvcnRlZDogYmFyIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGRlZmluZSBob29rIHVuZGVmaW5lZCBjb21tYW5kIGFib3J0ZWQ6IGJhciJ9Cit9CisKK3NlbmRfZ2RiICJkZWZpbmUgaG9vay1iYXJcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIndhcm5pbmc6IFlvdXIgbmV3IGBob29rLWJhcicgY29tbWFuZCBkb2VzIG5vdCBob29rIGFueSBleGlzdGluZyBjb21tYW5kLlxyXG5Qcm9jZWVkLip5IG9yIG4uICQiXAorICAgICAgICAgIHtzZW5kX2dkYiAieVxuIgorICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAtcmUgIlR5cGUgY29tbWFuZHMgZm9yIGRlZmluaXRpb24gb2YgXCJob29rLWJhclwiLlxyXG5FbmQgd2l0aCBhIGxpbmUgc2F5aW5nIGp1c3QgXCJlbmRcIi5cclxuPiQiXAorICAgICAgICAgICAgICAgICAgICAge3NlbmRfZ2RiICJuZXh0d2hlcmVcbmVuZFxuIgorICAgICAgICAgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3Bhc3MgImRlZmluZSBob29rIHVuZGVmaW5lZCBjb21tYW5kOiBiYXIifQorICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGRlZmluZSBob29rIHVuZGVmaW5lZCBjb21tYW5kOiBiYXIifQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge2ZhaWwgImRlZmluZSBob29rIHVuZGVmaW5lZCBjb21tYW5kOiBiYXIifQorICAgICAgICAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBkZWZpbmUgaG9vayB1bmRlZmluZWQgY29tbWFuZDogYmFyIn0KKyAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiZGVmaW5lIGhvb2sgdW5kZWZpbmVkIGNvbW1hbmQ6IGJhciJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBkZWZpbmUgaG9vayB1bmRlZmluZWQgY29tbWFuZDogYmFyIn0KK30KKworIyBUaGlzIGlzIGEgcXVhc2ktZGVmaW5lIGNvbW1hbmQ6IFZlcmlmeSB0aGF0IHRoZSB1c2VyIGNhbiByZWRlZmluZQorIyBHREIncyBnZGJfcHJvbXB0LgorIworc2VuZF9nZGIgInNldCBwcm9tcHQgXFwoYmxhaFxcKSBcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIlxcKGJsYWhcXCkgJCJcCisgICAgICAgICAge3Bhc3MgInNldCBnZGJfcHJvbXB0In0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAic2V0IGdkYl9wcm9tcHQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc2V0IGdkYl9wcm9tcHQifQorfQorCitzZW5kX2dkYiAic2V0IHByb21wdCBcXChnZGJcXCkgXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAicmVzZXQgZ2RiX3Byb21wdCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSByZXNldCBnZGJfcHJvbXB0In0KK30KKworZ2RiX2V4aXQKK3JldHVybiAwCisKKworCisKKworCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Rpc3BsYXkuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvZGlzcGxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NWYwNjcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Rpc3BsYXkuYwpAQCAtMCwwICsxLDUyIEBACisvKiBMb29wIGFuZCB2YXJzIGZvciB0ZXN0cyBvZiBkaXNwbGF5IGNvbW1hbmRzCisqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIExPT1AgMTAKKworaW50IHN1bSA9IDA7CisKK2ludCBkb19sb29wcygpCit7CisgICAgaW50IGk9MDsKKyAgICBpbnQgaz0wOworICAgIGludCBqPTA7CisgICAgCisgICAgZm9yKCBpID0gMDsgaSA8IExPT1A7IGkrKyApIHsKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IExPT1A7IGorKyApIHsKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBMT09QOyBrKysgKSB7CisgICAgICAgICAgICAgICAgc3VtKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IAorICAgIHJldHVybiBpOworfQorCitpbnQgZG9fdmFycygpCit7CisgICAgaW50ICAgICAgIGo7CisgICAgaW50ICAgICAgIGkgPSA5OworICAgIGZsb2F0ICAgICBmID0gMS4yMzQ7CisgICAgY2hhciAgICAgIGMgPSAnUSc7CisgICAgaW50ICAgICpwX2kgPSAmaTsKKyAgICBmbG9hdCAgKnBfZiA9ICZmOworICAgIGNoYXIgICAqcF9jID0gInJ1YmFyYiBhbmQgZnJpZXMiOworCisgICAgLyogTmVlZCBzb21lIGNvZGUgaGVyZSB0byBzZXQgYnJlYWtzIG9uLgorICAgICAqLworICAgIGZvciggaiA9IDA7IGogPCBMT09QOyBqKysgKSB7CisgICAgICAgIGlmKCBwX2Nbal0gPT0gYyApIHsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKnBfaTsKK30KKworbWFpbigpCit7CisgICAgZG9fbG9vcHMoKTsKKyAgICBkb192YXJzKCk7ICAgIAorfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9kaXNwbGF5LmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvZGlzcGxheS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjMjY0MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvZGlzcGxheS5leHAKQEAgLTAsMCArMSwxNDcgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBkaXNwbGF5LmV4cCAgIFRlc3QgZGlzcGxheSBjb21tYW5kcworIyAgICAgICAgICAgICAgIEFsc28gZG8gc29tZSBwcmludGluZyBzdHVmZiBmb3IgY292ZXJhZ2UncyBzYWtlLgorIworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCB0ZXN0ZmlsZSBkaXNwbGF5CitzZXQgc3JjZmlsZSAgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCisKKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYWRkaXRpb25hbF9mbGFncz0td31dICE9ICIiIH0geworICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQoraWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGJfc3R1Yl0geworICAgIGdkYl9zdGVwX2Zvcl9zdHViOworfQorCisKKyMgdXNlIHRoaXMgdG8gZGVidWc6CisjbG9nX3VzZXIgMQorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworIyBPaywgb24gdG8gcmVhbCBsaWZlCisjCitnZGJfdGVzdCAiYiBtYWluIiAgICAgIi4qQnJlYWtwb2ludCAxLioiICJicmVhayBtYWluIgorZ2RiX3Rlc3QgInIiICAgICAgICAgICIuKkJyZWFrcG9pbnQgMSwgbWFpbi4qIiAiZ2V0IHRvIG1haW4iCitnZGJfdGVzdCAiYiAxNCIgIi4qQnJlYWtwb2ludCAyLioiICJicmVhayBkb19sb29wcyIKK2dkYl90ZXN0ICJjIiAgICAgICAgICAiLipCcmVha3BvaW50IDIsIGRvX2xvb3BzLioiICJnZXQgdG8gZG9fbG9vcHMiCisKKyMgQ3JlYXRlIHN0b3BwaW5nIHBvaW50cy4KKyMKK2dkYl90ZXN0ICJ3YXQgc3VtIiAgICAiLipcW1d3XF1hdGNocG9pbnQgMzogc3VtLioiICJzZXQgd2F0Y2giCitnZGJfdGVzdCAiYiAxOSIgICAgICAgIi4qQnJlYWtwb2ludCA0LioiICJicmVhayAxOSIKKworIyBDcmVhdGUgZGlzcGxheXMgZm9yIHRob3NlIHBvaW50cworIworZ2RiX3Rlc3QgImluZm8gZGlzcCIgIi4qVGhlcmUgYXJlIG5vIGF1dG8tZGlzcGxheSBleHByZXNzaW9ucyBub3cuLioiICJpbmYgZGlzcCIKK2dkYl90ZXN0ICJkaXNwIGkiICIuKjE6IGkgPSAwLioiICJkaXNwbGF5IGkiCitnZGJfdGVzdCAiZGlzcC94IGoiICIuKjI6IC94IGogPSAweDAuKiIgImRpc3BsYXkgaiIKK2dkYl90ZXN0ICJkaXNwL2kgJmsiICIuKjM6IHgvaSAmayAgJGhleDouKiIgImRpc3BsYXkgJmsiCitnZGJfdGVzdCAiZGlzcC9mIHN1bSIgIi4qNDogL2Ygc3VtID0gMC4qIiAiZGlzcGxheS9mIHN1bSIKK2dkYl90ZXN0ICJkaXNwL3MgJnN1bSIgIi4qNTogeC9zICZzdW0gICRoZXguKnN1bS46LioiICJkaXNwbGF5L3MgJnN1bSIKKworIyBIaXQgdGhlIGRpc3BsYXlzCisjCitnZGJfdGVzdCAiYyIgIi4qXFtXd1xdYXRjaHBvaW50IDM6IHN1bS4qXFsxLTlcXSo6IHgvcyAmc3VtLipcWzEtOVxdKjogL2Ygc3VtID0gMS40MDEyOTg0NmUuNDVcclxuXFsxLTlcXSo6IHgvaSAmay4qXHJcblxbMS05XF0qOiAveCBqID0gMHgwXHJcblxbMS05XF0qOiBpID0gMC4qIiAiZmlyc3QgZGlzcCIKK2dkYl90ZXN0ICJjIiAiLipcW1d3XF1hdGNocG9pbnQgMzogc3VtLipcWzEtOVxdKjogeC9zICZzdW0uKlxbMS05XF0qOiAvZiBzdW0gPSAyLjgwMjU5NjkzZS40NVxyXG5cWzEtOVxdKjogeC9pICZrLipcclxuXFsxLTlcXSo6IC94IGogPSAweDAuKlxbMS05XF0qOiBpID0gMC4qIiAic2Vjb25kIGRpc3AiCisKK2dkYl90ZXN0ICJlbmFiICBkaXNwIDYiICIuKk5vIGRpc3BsYXkgbnVtYmVyIDYuLioiICJjYXRjaCBlcnIiCitnZGJfdGVzdCAiZGlzYWIgZGlzcCAxIiAiLioiICJkaXNhYiIKK2dkYl90ZXN0ICJkaXNhYiBkaXNwIDIiICIuKiIgIiIKK2dkYl90ZXN0ICJlbmFiIGRpc3AgMSIgICIuKiIgInJlLWVuYWIiCitnZGJfdGVzdCAiZW5hYiBkaXNwIDEiICAiLioiICJyZS1lbmFiIG9mIGVuYWIiCitnZGJfdGVzdCAidW5kaXNwIDUiICAgICAiLioiICJ1bmRpc3AiCitnZGJfdGVzdCAiaSBkaXNwIiAgICAgICAiLipBdXRvLWRpc3BsYXkgZXhwcmVzc2lvbnMgbm93IGluIGVmZmVjdC4qeSAgL2Ygc3VtLip5ICAvMWJpICZrLipuICAveCBqLip5ICBpLioiICJpbmZvIGRpc3AiCisKK2dkYl90ZXN0ICJjIiAiLipcW1d3XF1hdGNoLio0LjIwMzg5NTM5ZS00NS4qLippID0gMC4qIiAibmV4dCBoaXQiCisKK3NlbmRfZ2RiICJ1bmRpc3BcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipEZWxldGUgYWxsIGF1dG8tZGlzcGxheSBleHByZXNzaW9ucy4qeSBvciBuLiAkIiB7CisgICAgICAgIHNlbmRfZ2RiICJ5XG4iCisgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICJ5XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICBwYXNzICJ1bmRpc3AgYWxsIgorICAgICAgICAgICAgfQorICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICBmYWlsICJzb21lIHVuLWhlbHBmdWwgcmVzcG9uc2UiCisgICAgICAgICAgICB9CisgICAgICAgICAgICAtcmUgIi4qRGVsZXRlIGFsbC4qJCIgeworICAgICAgICAgICAgICAgIGZhaWwgInJlLWFzayBxdWVzdGlvbiIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJ0aW1lb3V0IiB9CisgICAgICAgIH0KKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAidW5kaXNwIGFsbCIKKyAgICB9CisgICAgdGltZW91dCB7IGZhaWwgInRpbWVvdXQiIH0KK30KKworZ2RiX3Rlc3QgImRpc2FiIDMiICIuKi4qIiAiIgorZ2RiX3Rlc3QgImMiICIuKkJyZWFrcG9pbnQgNC4qIiAid2F0Y2ggb2ZmIgorCisjIE5vdyB0aGUgcHJpbnRmIHRlc3RzCisjCitnZGJfdGVzdCAiZmluIiAiLipSdW4gdGlsbCBleGl0LipWYWx1ZSByZXR1cm5lZCBpcy4qPSAxMC4qIiAiZmluaXNoIgorZ2RiX3Rlc3QgInMiICIuKmRvX3ZhcnMuKi4qMjUiICIiCitnZGJfdGVzdCAidGIgMzUiICIuKkJyZWFrcG9pbnQgNSBhLioiICIiCitnZGJfdGVzdCAiYyIgIi4qZG9fdmFycy4qMzUuKjM1LioiICIiCisKKyMgQmVhdCBvbiBwcmludGYgYSBiaXQKKyMKK2dkYl90ZXN0ICJwcmludGYiICIuKkFyZ3VtZW50IHJlcXVpcmVkLioiICIiCitnZGJfdGVzdCAicHJpbnRmICVkIiAiLipCYWQgZm9ybWF0IHN0cmluZywgbWlzc2luZy4qIiAiIgorZ2RiX3Rlc3QgInByaW50ZiBcIiVkIiAiLipCYWQgZm9ybWF0IHN0cmluZywgbm9uLXRlcm1pbmF0ZWQuKiIgIiIKK2dkYl90ZXN0ICJwcmludGYgXCIlZCVkXCIsaSIgIi4qV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cy4qIiAiIgorZ2RiX3Rlc3QgInByaW50ZiBcIlxcXFwhXFxhXFxmXFxyXFx0XFx2XFxiXCIiICIuKiEuKiIgIiIKK2dkYl90ZXN0ICJwcmludGYgXCJcIiIgIi4qIiAicmUtc2V0IHRlcm0iCitnZGJfdGVzdCAicHJpbnRmIFwiXFx3XCIiICIuKlVucmVjb2duaXplZCBlc2NhcGUgY2hhcmFjdGVyLioiICIiCitnZGJfdGVzdCAicHJpbnRmIFwiJWRcIiBqIiAiLipJbnZhbGlkIGFyZ3VtZW50IHN5bnRheC4qIiAiIgorCisjIHBsYXkgd2l0aCAicCIsIHRvbworIworZ2RiX3Rlc3QgInAvciBqIiAiLipVbmRlZmluZWQgb3V0cHV0IGZvcm1hdC4qIiAiIgorI2dkYl90ZXN0ICJ4L3J4IGoiICIuKkNhbm5vdCBhY2Nlc3MgbWVtb3J5LioiICJubyBlcnJvciEiCitnZGJfdGVzdCAieC8wIGoiICIuKiIgIngvMCBqIgorZ2RiX3Rlc3QgInAvMCBqIiAiLipJdGVtIGNvdW50IG90aGVyIHRoYW4gMSBpcyBtZWFuaW5nbGVzcy4qIiAicC8wIGoiCitnZGJfdGVzdCAicC9zIHN1bSIgIi4qRm9ybWF0IGxldHRlci4qaXMgbWVhbmluZ2xlc3MuKiIgIiBubyBzIgorZ2RiX3Rlc3QgInAvaSBzdW0iICIuKkZvcm1hdCBsZXR0ZXIuKmlzIG1lYW5pbmdsZXNzLiouKiIgIm5vIGkiCitnZGJfdGVzdCAicC9hICZzdW0iICIuKj0gMHguKjxzdW0+LioiICIiCitnZGJfdGVzdCAicC9hIG1haW4rMTAwMCIgIi4qPSAweC4qPC4qPi4qIiAiIgorZ2RiX3Rlc3QgInAvYSBcXFwkcGMiICIuKj0gMHguKjxkb192YXJzKy4qPi4qIiAiIgorZ2RiX3Rlc3QgInAvYSAmaiIgIi4qPSAweC4qPC4qPi4qIiAiIgorZ2RiX3Rlc3QgInAvYSAmJmoiICIuKkEgc3ludGF4IGVycm9yLioiICIiCisKKyMgRG9uZSEKKyMKK2dkYl9leGl0CityZXR1cm4gMApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9kb2xsYXIuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9kb2xsYXIuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZmFjNmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2RvbGxhci5leHAKQEAgLTAsMCArMSwxMjggQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgR0RCIHRlc3RzIGZvciBuYW1lcyBiZWdpbm5pbmcgd2l0aCAnJCcKKworIyBUaGlzIGlzIGFpbWVkIGF0IEhQLVVYIHN5c3RlbXMgd2hlcmUgYSBsb3Qgb2Ygc3lzdGVtCisjIHJvdXRpbmVzIGFuZCBuYW1lcyBiZWdpbiB3aXRoICckJyBvciAnJCQnLiAgR0RCIDQuMTYgd2FzCisjIHVuYWJsZSB0byBkZWFsIHdpdGggdGhlc2UgbmFtZXMgYXMgdGhleSBjbGFzaGVkIHdpdGgKKyMgY29udmVuaWVuY2UgdmFyaWFibGVzLiAgV2lsZGViZWVzdCBzaG91bGQgYWNjZXB0IHN1Y2gKKyMgbmFtZXMgaW4gcHJlZmVyZW5jZSB0byBjb252ZW5pZW5jZSB2YXJpYWJsZXMuCisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFNhdGlzaCBQYWkgPHBhaUBhcG9sbG8uaHAuY29tPgorIyAxOTk3LTA5LTI0CisKK2lmICFbIGlzdGFyZ2V0ICIqLSotaHB1eCoiIF0gdGhlbiB7CisgcmV0dXJuCit9CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorCX0KKworIworIyB0ZXN0IHJ1bm5pbmcgcHJvZ3JhbXMKKyMKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgImV4cHJzIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisjc291cmNlICR7YmluZmlsZX0uY2kKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKKyMKKyMgc2V0IGl0IHVwIGF0IGEgYnJlYWtwb2ludCBzbyB3ZSBjYW4gcGxheSB3aXRoIHRoZSB2YXJpYWJsZSB2YWx1ZXMKKyMKKworaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgICBwZXJyb3IgImNvdWxkbid0IHJ1biB0byBicmVha3BvaW50IgorICAgIGNvbnRpbnVlCit9CisKKyMgVGVzdCBmb3IgbWlsbGljb2RlIHJvdXRpbmVzCitzZW5kX2dkYiAicHJpbnQgXCRcJGR5bmNhbGxcbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJcXCRcWzAtOVxdKiA9IFxcezx0ZXh0IHZhcmlhYmxlLCBubyBkZWJ1ZyBpbmZvPlxcfSAkaGV4IDw+LiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IFwkXCRkeW5jYWxsIiB9CisgICAtcmUgIlxcJFxbMC05XF0qID0gdm9pZCIgICAgICAgICAgICB7IGZhaWwgInByaW50IFwkXCRkeW5jYWxsIC0tIGludGVycHJldGVkIGFzIGNvbnZlbmllbmNlIHZhciIgfQorICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHJpbnQgXCRcJGR5bmNhbGwiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IFwkXCRkeW5jYWxsIiB9Cit9CitzZW5kX2dkYiAicHJpbnQgXCRcJGR5bmNhbGxfZXh0ZXJuYWxcbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJcXCRcWzAtOVxdKiA9IFxcezx0ZXh0IHZhcmlhYmxlLCBubyBkZWJ1ZyBpbmZvPlxcfSAkaGV4IDw+LiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IFwkXCRkeW5jYWxsX2V4dGVybmFsIiB9CisgICAtcmUgIlxcJFxbMC05XF0qID0gdm9pZCIgICAgICAgICAgICB7IGZhaWwgInByaW50IFwkXCRkeW5jYWxsX2V4dGVybmFsIC0tIGludGVycHJldGVkIGFzIGNvbnZlbmllbmNlIHZhciIgfQorICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHJpbnQgXCRcJGR5bmNhbGxfZXh0ZXJuYWwiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IFwkXCRkeW5jYWxsX2V4dGVybmFsIiB9Cit9CisKKyMgU2V0IGEgYnJlYWtwb2ludCBvbiBhIG1pbGxpY29kZSByb3V0aW5lCitzZW5kX2dkYiAiYnJlYWsgXCRcJGR5bmNhbGxcbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJCcmVha3BvaW50IFxbMC05XF0qIGF0ICRoZXguKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiYnJlYWsgXCRcJGR5bmNhbGwiIH0KKyAgIC1yZSAiRnVuY3Rpb24uKm5vdCBkZWZpbmVkLiokZ2RiX3Byb21wdCAkIiB7ZmFpbCAiYnJlYWsgXCRcJGR5bmNhbGwgLS0gbm8gXCRcJGR5bmNhbGw/IiB9CisgICAtcmUgIkNvbnZlbmllbmNlIHZhcmlhYmxlcyB1c2VkIGluIGxpbmUgc3BlY3MgbXVzdCBoYXZlIGludGVnZXIgdmFsdWVzXFwuLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgZmFpbCAiYnJlYWsgXCRcJGR5bmNhbGwgLS0gdHJlYXRlZCBhcyBjb252ZW5pbmNlIHZhcmlhYmxlIgorICAgICAgIH0gICAgICAgICAgCisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwcmludCBicmVhayBcJFwkZHluY2FsbCIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgYnJlYWsgXCRcJGR5bmNhbGwiIH0KK30KKworIyBEaXNhc3NlbWJsZSAkJGR5bmNhbGwKK3NlbmRfZ2RiICJkaXNhc3NlbWJsZSBcJFwkZHluY2FsbFxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgIkR1bXAgb2YgYXNzZW1ibGVyIGNvZGUgZm9yIGZ1bmN0aW9uLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImRpc2FzIFwkXCRkeW5jYWxsIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJkaXNhcyBcJFwkZHluY2FsbCIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgZGlzYXMgXCRcJGR5bmNhbGwiIH0KK30KKworIyBUcnkgdG8gc2V0ICQkZHluY2FsbCBsaWtlIGEgY29udmVuaWVuY2UgdmFyLgorc2VuZF9nZGIgInNldCBcJFwkZHluY2FsbCA9IDc3XG4iICAgCitnZGJfZXhwZWN0IHsgICAKKyAgIC1yZSAiSW52YWxpZCBjYXN0LiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInNldCBcJFwkZHluY2FsbCA9IDc3IiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJzZXQgXCRcJGR5bmNhbGwgPSA3NyIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgc2V0IFwkXCRkeW5jYWxsID0gNzciIH0KK30KKworIyBUcnkgb3V0IHNvbWUgb3RoZXIgJCBuYW1lLCBub3QgbWlsbGljb2RlCitzZW5kX2dkYiAicHJpbnQgXCRBUkdWXG4iICAgCitnZGJfZXhwZWN0IHsgICAKKyAgIC1yZSAiXFwkXFswLTlcXSogPSBcWzAtOVxdKi4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBcJEFSR1YiIH0KKyAgIC1yZSAiXFwkXFswLTlcXSogPSB2b2lkLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IFwkQVJHViAoaW50ZXJwcmV0ZWQgYXMgY29udmVuaWVuY2UgdmFyKSIgfQorICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHJpbnQgXCRBUkdWIiB9CisgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBcJEFSR1YiIH0KK30KK3NlbmRfZ2RiICJwdHlwZSBcJEFSR1ZcbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJ0eXBlID0gPGRhdGEgdmFyaWFibGUsIG5vIGRlYnVnIGluZm8+LiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIFwkQVJHViIgfQorICAgLXJlICJ0eXBlID0gdm9pZC4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBcJEFSR1YgKGludGVycHJldGVkIGFzIGNvbnZlbmllbmNlIHZhcikiIH0KKyAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgInB0eXBlIFwkQVJHViIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgXCRBUkdWIiB9Cit9CisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvZWNoby5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2VjaG8uZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MjIwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2VjaG8uZXhwCkBAIC0wLDAgKzEsNDQgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5ODgsIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUuIChyb2JAY3lnbnVzLmNvbSkKKworIyBDcmFuayB1cCBnZGIuCitnZGJfc3RhcnQKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKKyMKKyMgdGVzdCB0aGUgZWNobyBjb21tYW5kCisjCisKKyMgdGhpcyBzZXRzIHRoZSBwcm1zIGlkIG51bWJlci4gIFRoaXMgaXMgdGhlIG51bWJlciB0aGF0IHdpbGwgYXBwZWFyCisjIG9uIGFsbCB0aGUgb3V0cHV0IGxvZ3MuCisjCWV4OiBzZXQgcHJtc19pZCA2NDMKK3NldCBwcm1zX2lkIDAKKworIyB0aGlzIHNldHMgdGhlIGJ1ZyBpZCBpZC4gIFRoaXMgaXMgdGhlIG51bWJlciB0aGF0IHdpbGwgYXBwZWFyCisjIG9uIGFsbCB0aGUgb3V0cHV0IGxvZ3MuIFRoaXMgaXMgb3B0aW9uYWwgYW5kIGlmIGl0IGlzIG5vdCBzZXQKKyMgaXQgd2lsbCBhcHBlYXIgb24gYWxsIG91dHB1dCBsb2dzIGFzIGEgMC4KKyMJZXg6IHNldCBidWdfaWQgMTIKK3NldCBidWdfaWQgMAorCitnZGJfdGVzdCAiZWNobyBIZWxsbyB3b3JsZCFcXG4iICJIZWxsbyB3b3JsZCEiICJFY2hvIHRlc3QiCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2VuYS1kaXMtYnIuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9lbmEtZGlzLWJyLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTkzZDgyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9lbmEtZGlzLWJyLmV4cApAQCAtMCwwICsxLDUyNSBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorCX0KKworZ2xvYmFsIHVzZXN0dWJzCisKKyMKKyMgdGVzdCBydW5uaW5nIHByb2dyYW1zCisjCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJicmVhayIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7IGZhaWwgImVuYWJsZS9kaXNhYmxlIGJyZWFrIHRlc3RzIHN1cHByZXNzZWQiIH0KKworIyBWZXJpZnkgdGhhdCB3ZSBjYW4gc2V0IGEgYnJlYWtwb2ludCAodGhlIGxvY2F0aW9uIGlzIGlycmVsZXZhbnQpLAorIyB0aGVuIGVuYWJsZSBpdCAoeWVzLCBpdCdzIGFscmVhZHkgZW5hYmxlZCBieSBkZWZhdWx0KSwgdGhlbiBoaXQgaXQuCisjCitzZW5kX2dkYiAiYnJlYWsgbWFya2VyMVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiQnJlYWtwb2ludCAoXFswLTlcXSopIGF0IC4qLCBsaW5lIDQxLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiYnJlYWsgbWFya2VyMSJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImJyZWFrIG1hcmtlcjEifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgYnJlYWsgbWFya2VyMSJ9Cit9CisKK3NlbmRfZ2RiICJlbmFibGUgJGV4cGVjdF9vdXQoMSxzdHJpbmcpXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiZW5hYmxlIGJyZWFrIG1hcmtlcjEifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgZW5hYmxlIGJyZWFrIG1hcmtlcjEifQorfQorCitzZW5kX2dkYiAiaW5mbyBicmVhayAkZXhwZWN0X291dCgxLHN0cmluZylcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIlxbMC05XF0qXFsgXHRcXSticmVha3BvaW50XFsgXHRcXStrZWVwXFsgXHRcXSt5LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiaW5mbyBicmVhayBtYXJrZXIxIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiaW5mbyBicmVhayBtYXJrZXIxIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGluZm8gYnJlYWsgbWFya2VyMSJ9Cit9CisKK3NlbmRfZ2RiICJjb250aW51ZVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiQnJlYWtwb2ludCBcWzAtOVxdKiwgbWFya2VyMS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImNvbnRpbnVlIHRvIGJyZWFrIG1hcmtlcjEifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJjb250aW51ZSB0byBicmVhayBtYXJrZXIxIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGNvbnRpbnVlIHRvIGJyZWFrIG1hcmtlcjEifQorfQorCitzZW5kX2dkYiAiZGVsZXRlICRleHBlY3Rfb3V0KDEsc3RyaW5nKVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImRlbGV0ZSBicmVhayBtYXJrZXIxIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGRlbGV0ZSBicmVhayBtYXJrZXIxIn0KK30KKworIyBWZXJpZnkgdGhhdCB3ZSBjYW4gc2V0IGEgYnJlYWtwb2ludCB0byBiZSBzZWxmLWRpc2FibGluZyBhZnRlcgorIyB0aGUgZmlyc3QgdGltZSBpdCB0cmlnZ2Vycy4KKyMKK3NlbmRfZ2RiICJicmVhayBtYXJrZXIyXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJCcmVha3BvaW50IChcWzAtOVxdKikgYXQgLiosIGxpbmUgNDIuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJicmVhayBtYXJrZXIyIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiYnJlYWsgbWFya2VyMiJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBicmVhayBtYXJrZXIyIn0KK30KKworc2VuZF9nZGIgImVuYWJsZSBvbmNlICRleHBlY3Rfb3V0KDEsc3RyaW5nKVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImVuYWJsZSBvbmNlIGJyZWFrIG1hcmtlcjIifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgZW5hYmxlIG9uY2UgYnJlYWsgbWFya2VyMiJ9Cit9CisKK3NlbmRfZ2RiICJpbmZvIGJyZWFrICRleHBlY3Rfb3V0KDEsc3RyaW5nKVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiXFswLTlcXSpcWyBcdFxdK2JyZWFrcG9pbnRcWyBcdFxdK2Rpc1xbIFx0XF0reS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImluZm8gYXV0by1kaXNhYmxlZCBicmVhayBtYXJrZXIyIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiaW5mbyBhdXRvLWRpc2FibGVkIGJyZWFrIG1hcmtlcjIifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaW5mbyBhdXRvLWRpc2FibGVkIGJyZWFrIG1hcmtlcjIifQorfQorCitzZW5kX2dkYiAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIkJyZWFrcG9pbnQgXFswLTlcXSosIG1hcmtlcjIuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJjb250aW51ZSB0byBhdXRvLWRpc2FibGVkIGJyZWFrIG1hcmtlcjIifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJjb250aW51ZSB0byBhdXRvLWRpc2FibGVkIGJyZWFrIG1hcmtlcjIifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgY29udGludWUgdG8gYXV0by1kaXNhYmxlZCBicmVhayBtYXJrZXIyIn0KK30KKworc2VuZF9nZGIgImluZm8gYnJlYWsgJGV4cGVjdF9vdXQoMSxzdHJpbmcpXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJcWzAtOVxdKlxbIFx0XF0rYnJlYWtwb2ludFxbIFx0XF0rZGlzXFsgXHRcXStuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiaW5mbyBhdXRvLWRpc2FibGVkIGJyZWFrIG1hcmtlcjIifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJpbmZvIGF1dG8tZGlzYWJsZWQgYnJlYWsgbWFya2VyMiJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBpbmZvIGF1dG8tZGlzYWJsZWQgYnJlYWsgbWFya2VyMiJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgd2UgZG9uJ3Qgc3RvcCBhdCBhIGRpc2FibGVkIGJyZWFrcG9pbnQuCisjCitzZW5kX2dkYiAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIi4qUHJvZ3JhbSBleGl0ZWQgbm9ybWFsbHkuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJubyBzdG9wIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAibm8gc3RvcCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBubyBzdG9wIn0KK30KKworc2VuZF9nZGIgInJ1blxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiU3RhcnRpbmcgcHJvZ3JhbS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInJlcnVuIHRvIG1haW4ifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJyZXJ1biB0byBtYWluIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHJlcnVuIHRvIG1haW4ifQorfQorCitzZW5kX2dkYiAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIi4qUHJvZ3JhbSBleGl0ZWQgbm9ybWFsbHkuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJubyBzdG9wIGF0IGF1dG8tZGlzYWJsZWQgYnJlYWsgbWFya2VyMiJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgIm5vIHN0b3AgYXQgYXV0by1kaXNhYmxlZCBicmVhayBtYXJrZXIyIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIG5vIHN0b3AgYXQgYXV0by1kaXNhYmxlZCBicmVhayBtYXJrZXIyIn0KK30KKworIyBWZXJpZnkgdGhhdCB3ZSBjYW4gc2V0IGEgYnJlYWtwb2ludCB0byBiZSBzZWxmLWRlbGV0aW5nIGFmdGVyCisjIHRoZSBmaXJzdCB0aW1lIGl0IHRyaWdnZXJzLgorIworaWYgIVtydW50b19tYWluXSB0aGVuIHsgZmFpbCAiZW5hYmxlL2Rpc2FibGUgYnJlYWsgdGVzdHMgc3VwcHJlc3NlZCIgfQorCitzZW5kX2dkYiAiYnJlYWsgbWFya2VyM1xuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiQnJlYWtwb2ludCAoXFswLTlcXSopIGF0IC4qLCBsaW5lIDQzLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiYnJlYWsgbWFya2VyMyJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImJyZWFrIG1hcmtlcjMifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgYnJlYWsgbWFya2VyMyJ9Cit9CisKK3NlbmRfZ2RiICJlbmFibGUgZGVsICRleHBlY3Rfb3V0KDEsc3RyaW5nKVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImVuYWJsZSBkZWwgYnJlYWsgbWFya2VyMyJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBlbmFibGUgZGVsIGJyZWFrIG1hcmtlcjMifQorfQorCitzZW5kX2dkYiAiaW5mbyBicmVhayAkZXhwZWN0X291dCgxLHN0cmluZylcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIlxbMC05XF0qXFsgXHRcXSticmVha3BvaW50XFsgXHRcXStkZWxcWyBcdFxdK3kuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJpbmZvIGF1dG8tZGVsZXRlZCBicmVhayBtYXJrZXIyIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiaW5mbyBhdXRvLWRlbGV0ZWQgYnJlYWsgbWFya2VyMiJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBpbmZvIGF1dG8tZGVsZXRlZCBicmVhayBtYXJrZXIyIn0KK30KKworc2VuZF9nZGIgImNvbnRpbnVlXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICIuKm1hcmtlcjMgLio6NDMuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJjb250aW51ZSB0byBhdXRvLWRlbGV0ZWQgYnJlYWsgbWFya2VyMyJ9CisgIC1yZSAiQnJlYWtwb2ludCBcWzAtOVxdKiwgbWFya2VyMy4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImNvbnRpbnVlIHRvIGF1dG8tZGVsZXRlZCBicmVhayBtYXJrZXIzIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiY29udGludWUgdG8gYXV0by1kZWxldGVkIGJyZWFrIG1hcmtlcjMifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgY29udGludWUgdG8gYnJlYWsgbWFya2VyMyJ9Cit9CisKK3NlbmRfZ2RiICJpbmZvIGJyZWFrICRleHBlY3Rfb3V0KDEsc3RyaW5nKVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiLipObyBicmVha3BvaW50IG9yIHdhdGNocG9pbnQgbnVtYmVyLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiaW5mbyBhdXRvLWRlbGV0ZWQgYnJlYWsgbWFya2VyMyJ9CisgIC1yZSAiXFswLTlcXSpcWyBcdFxdK2JyZWFrcG9pbnRcWyBcdFxdLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiaW5mbyBhdXRvLWRlbGV0ZWQgYnJlYWsgbWFya2VyMyJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImluZm8gYXV0by1kZWxldGVkIGJyZWFrIG1hcmtlcjMifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaW5mbyBhdXRvLWRlbGV0ZWQgYnJlYWsgbWFya2VyMyJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgd2UgY2FuIHNldCBhIGJyZWFrcG9pbnQgYW5kIG1hbnVhbGx5IGRpc2FibGUgaXQgKHdlJ3ZlCisjIGFscmVhZHkgcHJvdmVuIHRoYXQgZGlzYWJsZWQgYnAncyBkb24ndCB0cmlnZ2VyKS4KKyMKK3NlbmRfZ2RiICJicmVhayBtYXJrZXI0XG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJCcmVha3BvaW50IChcWzAtOVxdKikgYXQgLiosIGxpbmUgNDQuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJicmVhayBtYXJrZXI0In0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiYnJlYWsgbWFya2VyNCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBicmVhayBtYXJrZXI0In0KK30KKworc2VuZF9nZGIgImRpc2FibGUgJGV4cGVjdF9vdXQoMSxzdHJpbmcpXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiZGlzYWJsZSBicmVhayBtYXJrZXI0In0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGRpc2FibGUgYnJlYWsgbWFya2VyNCJ9Cit9CisKK3NlbmRfZ2RiICJpbmZvIGJyZWFrICRleHBlY3Rfb3V0KDEsc3RyaW5nKVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiXFswLTlcXSpcWyBcdFxdK2JyZWFrcG9pbnRcWyBcdFxdK2tlZXBcWyBcdFxdK24uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJpbmZvIGJyZWFrIG1hcmtlcjQifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJpbmZvIGJyZWFrIG1hcmtlcjQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaW5mbyBicmVhayBtYXJrZXI0In0KK30KKworIyBWZXJpZnkgdGhhdCB3ZSBjYW4gc2V0IGEgYnJlYWtwb2ludCB3aXRoIGFuIGlnbm9yZSBjb3VudCBOLCB3aGljaAorIyBzaG91bGQgY2F1c2UgdGhlIG5leHQgTiB0cmlnZ2VycyBvZiB0aGUgYnAgdG8gYmUgaWdub3JlZC4gIChUaGlzIGlzCisjIGEgZmxhdm9yIG9mIGVuYWJsZW1lbnQvZGlzYWJsZW1lbnQsIGFmdGVyIGFsbC4pCisjCitpZiAhW3J1bnRvX21haW5dIHRoZW4geyBmYWlsICJlbmFibGUvZGlzYWJsZSBicmVhayB0ZXN0cyBzdXBwcmVzc2VkIiB9CisKK3NlbmRfZ2RiICJicmVhayBtYXJrZXIxXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJCcmVha3BvaW50IChcWzAtOVxdKikgYXQgLiosIGxpbmUgNDEuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJicmVhayBtYXJrZXIxIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiYnJlYWsgbWFya2VyMSJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBicmVhayBtYXJrZXIxIn0KK30KKworIyBWZXJpZnkgdGhhdCBhbiBpZ25vcmUgb2YgYSBub24tZXhpc3RlbnQgYnJlYWtwb2ludCBpcyBncmFjZWZ1bGx5CisjIGhhbmRsZWQuCisjCitzZW5kX2dkYiAiaWdub3JlIDk5OSAyXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJObyBicmVha3BvaW50IG51bWJlciA5OTkuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiaWdub3JlIG5vbi1leGlzdGVudCBicmVhayJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImlnbm9yZSBub24tZXhpc3RlbnQgYnJlYWsifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaWdub3JlIG5vbi1leGlzdGVudCBicmVhayJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgYSBtaXNzaW5nIGlnbm9yZSBjb3VudCBpcyBncmFjZWZ1bGx5IGhhbmRsZWQuCisjCitzZW5kX2dkYiAiaWdub3JlICRleHBlY3Rfb3V0KDEsc3RyaW5nKSBcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIlNlY29uZCBhcmd1bWVudCAuc3BlY2lmaWVkIGlnbm9yZS1jb3VudC4gaXMgbWlzc2luZy4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJpZ25vcmUgYnJlYWsgd2l0aCBtaXNzaW5nIGlnbm9yZSBjb3VudCJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImlnbm9yZSBicmVhayB3aXRoIG1pc3NpbmcgaWdub3JlIGNvdW50In0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGlnbm9yZSBicmVhayB3aXRoIG1pc3NpbmcgaWdub3JlIGNvdW50In0KK30KKworIyBWZXJpZnkgdGhhdCBhIG5lZ2F0aXZlIG9yIHplcm8gaWdub3JlIGNvdW50IGlzIGhhbmRsZWQgZ3JhY2VmdWxseQorIyAodGhleSBib3RoIGFyZSB0cmVhdGVkIHRoZSBzYW1lKS4KKyMKK3NlbmRfZ2RiICJpZ25vcmUgJGV4cGVjdF9vdXQoMSxzdHJpbmcpIC0xXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJXaWxsIHN0b3AgbmV4dCB0aW1lIGJyZWFrcG9pbnQgXFswLTlcXSogaXMgcmVhY2hlZC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJpZ25vcmUgYnJlYWsgbWFya2VyMSAtMSJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImlnbm9yZSBicmVhayBtYXJrZXIxIC0xIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGlnbm9yZSBicmVhayBtYXJrZXIxIC0xIn0KK30KKworc2VuZF9nZGIgImlnbm9yZSAkZXhwZWN0X291dCgxLHN0cmluZykgMFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiV2lsbCBzdG9wIG5leHQgdGltZSBicmVha3BvaW50IFxbMC05XF0qIGlzIHJlYWNoZWQuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiaWdub3JlIGJyZWFrIG1hcmtlcjEgMCJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImlnbm9yZSBicmVhayBtYXJrZXIxIDAifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaWdub3JlIGJyZWFrIG1hcmtlcjEgMCJ9Cit9CisKK3NlbmRfZ2RiICJpZ25vcmUgJGV4cGVjdF9vdXQoMSxzdHJpbmcpIDFcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIldpbGwgaWdub3JlIG5leHQgY3Jvc3Npbmcgb2YgYnJlYWtwb2ludCBcWzAtOVxdKi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImlnbm9yZSBicmVhayBtYXJrZXIxIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiaWdub3JlIGJyZWFrIG1hcmtlcjEifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaWdub3JlIGJyZWFrIG1hcmtlcjEifQorfQorCitzZW5kX2dkYiAiaW5mbyBicmVhayAkZXhwZWN0X291dCgxLHN0cmluZylcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIlxbMC05XF0qXFsgXHRcXSticmVha3BvaW50XFsgXHRcXStrZWVwXFsgXHRcXSt5LippZ25vcmUgbmV4dCAxIGhpdHMuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJpbmZvIGlnbm9yZWQgYnJlYWsgbWFya2VyMSJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImluZm8gaWdub3JlZCBicmVhayBtYXJrZXIxIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGluZm8gaWdub3JlZCBicmVhayBtYXJrZXIxIn0KK30KKworc2VuZF9nZGIgImNvbnRpbnVlXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICIuKlByb2dyYW0gZXhpdGVkIG5vcm1hbGx5LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAibm8gc3RvcCBhdCBpZ25vcmVkIGJyZWFrIG1hcmtlcjEifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJubyBzdG9wIGF0IGlnbm9yZWQgYnJlYWsgbWFya2VyMSJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBubyBzdG9wIGF0IGlnbm9yZWQgYnJlYWsgbWFya2VyMSJ9Cit9CisKK3NlbmRfZ2RiICJydW5cbiIKK2dkYl9leHBlY3QgeworICAtcmUgIlN0YXJ0aW5nIHByb2dyYW0uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJyZXJ1biB0byBtYWluIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAicmVydW4gdG8gbWFpbiJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSByZXJ1biB0byBtYWluIn0KK30KKworc2VuZF9nZGIgImNvbnRpbnVlXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJCcmVha3BvaW50IFxbMC05XF0qLCBtYXJrZXIxLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiY29udGludWUgdG8gYnJlYWsgbWFya2VyMSJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImNvbnRpbnVlIHRvIGJyZWFrIG1hcmtlcjEifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgY29udGludWUgdG8gYnJlYWsgbWFya2VyMSJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgd2UgY2FuIHNwZWNpZnkgYm90aCBhbiBpZ25vcmUgY291bnQgYW5kIGFuIGF1dG8tZGVsZXRlLgorIworaWYgIVtydW50b19tYWluXSB0aGVuIHsgZmFpbCAiZW5hYmxlL2Rpc2FibGUgYnJlYWsgdGVzdHMgc3VwcHJlc3NlZCIgfQorCitzZW5kX2dkYiAiYnJlYWsgbWFya2VyMVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiQnJlYWtwb2ludCAoXFswLTlcXSopIGF0IC4qLCBsaW5lIDQxLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiYnJlYWsgbWFya2VyMSJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImJyZWFrIG1hcmtlcjEifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgYnJlYWsgbWFya2VyMSJ9Cit9CisKK3NlbmRfZ2RiICJpZ25vcmUgJGV4cGVjdF9vdXQoMSxzdHJpbmcpIDFcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIldpbGwgaWdub3JlIG5leHQgY3Jvc3Npbmcgb2YgYnJlYWtwb2ludCBcWzAtOVxdKi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImlnbm9yZSBicmVhayBtYXJrZXIxIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiaWdub3JlIGJyZWFrIG1hcmtlcjEifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaWdub3JlIGJyZWFrIG1hcmtlcjEifQorfQorCitzZW5kX2dkYiAiZW5hYmxlIGRlbCAkZXhwZWN0X291dCgxLHN0cmluZylcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJlbmFibGUgZGVsIGJyZWFrIG1hcmtlcjEifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgZW5hYmxlIGRlbCBicmVhayBtYXJrZXIxIn0KK30KKworc2VuZF9nZGIgImluZm8gYnJlYWsgJGV4cGVjdF9vdXQoMSxzdHJpbmcpXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJcWzAtOVxdKlxbIFx0XF0rYnJlYWtwb2ludFxbIFx0XF0rZGVsXFsgXHRcXSt5LippZ25vcmUgbmV4dCAxIGhpdHMuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJpbmZvIGJyZWFrIG1hcmtlcjEifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJpbmZvIGJyZWFrIG1hcmtlcjEifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaW5mbyBicmVhayBtYXJrZXIyIn0KK30KKworc2VuZF9nZGIgImNvbnRpbnVlXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICIuKlByb2dyYW0gZXhpdGVkIG5vcm1hbGx5LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAibm8gc3RvcCBhdCBpZ25vcmVkICYgYXV0by1kZWxldGVkIGJyZWFrIG1hcmtlcjEifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJubyBzdG9wIGF0IGlnbm9yZWQgJiBhdXRvLWRlbGV0ZWQgYnJlYWsgbWFya2VyMSJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBubyBzdG9wIGF0IGlnbm9yZWQgJiBhdXRvLWRlbGV0ZWQgYnJlYWsgbWFya2VyMSJ9Cit9CisKK3NlbmRfZ2RiICJydW5cbiIKK2dkYl9leHBlY3QgeworICAtcmUgIlN0YXJ0aW5nIHByb2dyYW0uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJyZXJ1biB0byBtYWluIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAicmVydW4gdG8gbWFpbiJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSByZXJ1biB0byBtYWluIn0KK30KKworc2VuZF9nZGIgImNvbnRpbnVlXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICIuKm1hcmtlcjEgLio6NDEuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJjb250aW51ZSB0byBpZ25vcmVkICYgYXV0by1kZWxldGVkIGJyZWFrIG1hcmtlcjEifQorICAtcmUgIkJyZWFrcG9pbnQgXFswLTlcXSosIG1hcmtlcjEuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJjb250aW51ZSB0byBpZ25vcmVkICYgYXV0by1kZWxldGVkIGJyZWFrIG1hcmtlcjEifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJjb250aW51ZSB0byBpZ25vcmVkICYgYXV0by1kZWxldGVkIGJyZWFrIG1hcmtlcjEifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgY29udGludWUgdG8gaWdub3JlZCAmIGF1dG8tZGVsZXRlZCBicmVhayBtYXJrZXIxIn0KK30KKworIyBWZXJpZnkgdGhhdCBhIGRpc2FibGVkIGJyZWFrcG9pbnQncyBpZ25vcmUgY291bnQgaXNuJ3QgdXBkYXRlZCB3aGVuCisjIHRoZSBicCBpcyBlbmNvdW50ZXJlZC4KKyMKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7IGZhaWwgImVuYWJsZS9kaXNhYmxlIGJyZWFrIHRlc3RzIHN1cHByZXNzZWQiIH0KKworc2VuZF9nZGIgImJyZWFrIG1hcmtlcjFcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIkJyZWFrcG9pbnQgKFxbMC05XF0qKSBhdCAuKiwgbGluZSA0MS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImJyZWFrIG1hcmtlcjEifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJicmVhayBtYXJrZXIxIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGJyZWFrIG1hcmtlcjEifQorfQorCitzZW5kX2dkYiAiaWdub3JlICRleHBlY3Rfb3V0KDEsc3RyaW5nKSAxMFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiV2lsbCBpZ25vcmUgbmV4dCAxMCBjcm9zc2luZ3Mgb2YgYnJlYWtwb2ludCBcWzAtOVxdKi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImlnbm9yZSBicmVhayBtYXJrZXIxIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiaWdub3JlIGJyZWFrIG1hcmtlcjEifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaWdub3JlIGJyZWFrIG1hcmtlcjEifQorfQorCitzZW5kX2dkYiAiZGlzYWJsZSAkZXhwZWN0X291dCgxLHN0cmluZylcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJkaXNhYmxlIGJyZWFrIG1hcmtlcjEifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgZGlzYWJsZSBicmVhayBtYXJrZXIxIn0KK30KKworc2VuZF9nZGIgImNvbnRpbnVlXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICIuKlByb2dyYW0gZXhpdGVkIG5vcm1hbGx5LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAibm8gc3RvcCBhdCBpZ25vcmVkICYgZGlzYWJsZWQgYnJlYWsgbWFya2VyMSJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgIm5vIHN0b3AgYXQgaWdub3JlZCAmIGRpc2FibGVkIGJyZWFrIG1hcmtlcjEifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgbm8gc3RvcCBhdCBpZ25vcmVkICYgZGlzYWJsZWQgYnJlYWsgbWFya2VyMSJ9Cit9CisKK3NlbmRfZ2RiICJydW5cbiIKK2dkYl9leHBlY3QgeworICAtcmUgIlN0YXJ0aW5nIHByb2dyYW0uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJyZXJ1biB0byBtYWluIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAicmVydW4gdG8gbWFpbiJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSByZXJ1biB0byBtYWluIn0KK30KKworc2VuZF9nZGIgImluZm8gYnJlYWsgJGV4cGVjdF9vdXQoMSxzdHJpbmcpXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJcWzAtOVxdKlxbIFx0XF0rYnJlYWtwb2ludFxbIFx0XF0ra2VlcFxbIFx0XF0rbi4qaWdub3JlIG5leHQgMTAgaGl0cy4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImluZm8gaWdub3JlZCAmIGRpc2FibGVkIGJyZWFrIG1hcmtlcjEifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJpbmZvIGlnbm9yZWQgJiBkaXNhYmxlZCBicmVhayBtYXJrZXIxIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGluZm8gaWdub3JlZCAmIGRpc2FibGVkIGJyZWFrIG1hcmtlcjEifQorfQorCisjIFZlcmlmeSB0aGF0IEdEQiBjb3JyZWN0bHkgaGFuZGxlcyB0aGUgImNvbnRpbnVlIiBjb21tYW5kIHdpdGggYW4gYXJndW1lbnQsCisjIHdoaWNoIGlzIGFuIGlnbm9yZSBjb3VudCB0byBzZXQgb24gdGhlIGN1cnJlbnRseSBzdG9wcGVkLWF0IGJyZWFrcG9pbnQuCisjIChBbHNvIHZlcmlmeSB0aGF0IEdEQiBncmFjZWZ1bGx5IGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgdGhlIGluZmVyaW9yCisjIGlzbid0IHN0b3BwZWQgYXQgYSBicmVha3BvaW50LikKKyMKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7IGZhaWwgImVuYWJsZS9kaXNhYmxlIGJyZWFrIHRlc3RzIHN1cHByZXNzZWQiIH0KKworc2VuZF9nZGIgImJyZWFrIDY0XG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJCcmVha3BvaW50IFxbMC05XF0qLiosIGxpbmUgNjQuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJwcmVwYXJlIHRvIGNvbnRpbnVlIHdpdGggaWdub3JlIGNvdW50In0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAicHJlcGFyZSB0byBjb250aW51ZSB3aXRoIGlnbm9yZSBjb3VudCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBwcmVwYXJlIHRvIGNvbnRpbnVlIHdpdGggaWdub3JlIGNvdW50In0KK30KK3NlbmRfZ2RiICJjb250aW51ZSAyXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJXaWxsIGlnbm9yZSBuZXh0IGNyb3NzaW5nIG9mIGJyZWFrcG9pbnQgXFswLTlcXSouICBDb250aW51aW5nLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImNvbnRpbnVlIHdpdGggaWdub3JlIGNvdW50In0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiY29udGludWUgd2l0aCBpZ25vcmUgY291bnQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgY29udGludWUgd2l0aCBpZ25vcmUgY291bnQifQorfQorCitzZW5kX2dkYiAibmV4dFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiLio2NlxbIFx0XF0qbWFya2VyMS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInN0ZXAgYWZ0ZXIgY29udGludWUgd2l0aCBpZ25vcmUgY291bnQifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJzdGVwIGFmdGVyIGNvbnRpbnVlIHdpdGggaWdub3JlIGNvdW50In0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHN0ZXAgYWZ0ZXIgY29udGludWUgd2l0aCBpZ25vcmUgY291bnQifQorfQorCisjID8/cmVocmF1ZXI6IEh1aC4gIFRoaXMgYXBwZWFycyB0byBiZSBhbiBhY3R1YWwgYnVnLiAgKE5vIGJpZworIyBzdXJwcmlzZSwgc2luY2UgdGhpcyBmZWF0dXJlIGhhc24ndCBiZWVuIHRlc3RlZC4uLikgIExvb2tzIGxpa2UKKyMgR0RCIGlzIGN1cnJlbnRseSB0cnlpbmcgdG8gc2V0IHRoZSBpZ25vcmUgY291bnQgb2YgYnAgIyAtMSEKKyMKK3NldHVwX3hmYWlsIGhwcGFfKl8qCitzZW5kX2dkYiAiY29udGludWUgMlxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiTm90IHN0b3BwZWQgYXQgYW55IGJyZWFrcG9pbnQ7IGFyZ3VtZW50IGlnbm9yZWQuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiY29udGludWUgd2l0aCBpZ25vcmUgY291bnQsIG5vdCBzdG9wcGVkIGF0IGJwdCJ9CisgIC1yZSAiTm8gYnJlYWtwb2ludCBudW1iZXIgLTEuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHt4ZmFpbCAiKERUUydkKSBjb250aW51ZSB3aXRoIGlnbm9yZSBjb3VudCwgbm90IHN0b3BwZWQgYXQgYnB0In0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiY29udGludWUgd2l0aCBpZ25vcmUgY291bnQsIG5vdCBzdG9wcGVkIGF0IGJwdCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzdGVwIGFmdGVyIGNvbnRpbnVlIHdpdGggaWdub3JlIGNvdW50LCBub3Qgc3RvcHBlZCBhdCBicHQifQorfQorCitnZGJfZXhpdAorcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvZW5kaW5nLXJ1bi5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9lbmRpbmctcnVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzMzVjZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvZW5kaW5nLXJ1bi5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qIFRlc3QgcHJvZ3JhbSBmb3IgPG5leHQtYXQtZW5kPiBhbmQKKyAqIDxsZWF2ZXMtY29yZS1maWxlLW9uLXF1aXQ+IGJ1Z3MuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgY2FsbGVlKCB4ICkKK2ludCB4OworeworICAgIGludCB5ID0geCAqIHg7CisgICAgcmV0dXJuICh5IC0gMik7Cit9CisKK21haW4oKQoreworCisgICAgaW50ICpwOworICAgIGludCBpOworCisgICAgcCA9IChpbnQgKikgbWFsbG9jKCA0ICk7CisgICAgCisgICAgZm9yIChpID0gMTsgaSA8IDEwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZiggIiVkICIsIGNhbGxlZSggaSApKTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgcHJpbnRmKCAiIEdvb2RieWUhXG4iICk7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2VuZGluZy1ydW4uZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9lbmRpbmctcnVuLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWI0MmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9lbmRpbmctcnVuLmV4cApAQCAtMCwwICsxLDE3NiBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyB1c2UgdGhpcyB0byBkZWJ1ZzoKKyMKKyNsb2dfdXNlciAxCisKKyMgZW5kaW5nLXJ1bi5leHAgLS0gRXhwZWN0IHNjcmlwdCB0byB0ZXN0IGVuZGluZyBhIHRlc3QgcnVuIGluIGdkYgorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHRlc3RmaWxlIGVuZGluZy1ydW4KK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworcmVtb3RlX2V4ZWMgYnVpbGQgInJtIC1mICR7YmluZmlsZX0iCityZW1vdGVfZXhlYyBidWlsZCAicm0gLWYgY29yZSIKKworCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKKyMgQ0hGdHMyMzQ2OTogVGVzdCB0aGF0IHlvdSBjYW4gImNsZWFyIiBhIGJwIHNldCBhdAorIyBhIGxpbmUgX2JlZm9yZV8gdGhlIHJvdXRpbmUgKHdoaWNoIHdpbGwgZGVmYXVsdCB0byB0aGUKKyMgZmlyc3QgbGluZSBpbiB0aGUgcm91dGluZSwgd2hpY2ggdHVybnMgb3V0IHRvIGNvcnJlc3BvbmQKKyMgdG8gdGhlIHByb2xvZy0tdGhhdCdzIGFub3RoZXIgYnVnLi4uKQorIworZ2RiX3Rlc3QgImIgMSIgIi4qQnJlYWtwb2ludC4qbGluZSAxLioiICJicHQgYXQgbGluZSBiZWZvcmUgcm91dGluZSIKK2dkYl90ZXN0ICJiIDgiICIuKk5vdGUuKmFsc28uKkJyZWFrcG9pbnQuKjIuKiIgIiIKKworIyBTZXQgdXAgdG8gZ28gdG8gdGhlIG5leHQtdG8tbGFzdCBsaW5lIG9mIHRoZSBwcm9ncmFtCisjCitnZGJfdGVzdCAiYiAyNiIgIi4qQnJlYWtwb2ludC4qMy4qIiAiIgorCisjIEV4cGVjdCB0byBoaXQgdGhlIGJwIGF0IGxpbmUgIjEiLCBidXQgc3ltYm9saXplIHRoaXMKKyMgYXMgbGluZSAiOCIuICBUaGVuIHRyeSB0byBjbGVhciBpdC0tdGhpcyBzaG91bGQgd29yay4KKyMKK2dkYl90ZXN0ICJyIiAiLipCcmVha3BvaW50LioxLipjYWxsZWUuKjguKiIgIiIKK2dkYl90ZXN0ICJjbGUiICIuKkRlbGV0ZWQgYnJlYWtwb2ludHMgMiAxLioiICJjbGVhciB3b3JrZWQiCitzZW5kX2dkYiAiaSBiXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qYnJlYWtwb2ludC4qYnJlYWtwb2ludC4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjbGVhciBicCIgfQorICAgIC1yZSAiLiozLiptYWluLioyNi4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJjbGVhcmVkIGJwIGF0IGxpbmUgYmVmb3JlIHJvdXRpbmUiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJpbmZvIGIiIH0KK30KKworIyBUZXN0IHNvbWUgb3RoZXIgImNsZWFyIiBjb21iaW5hdGlvbnMKKyMKK2dkYl90ZXN0ICJiIDEiICIuKkJyZWFrcG9pbnQuKjQuKiIgIiIKK2dkYl90ZXN0ICJiIDgiICIuKk5vdGUuKmFsc28uKkJyZWFrcG9pbnQuKjUuKiIgIiIKK2dkYl90ZXN0ICJjbGUgOCIgIi4qRGVsZXRlZCBicmVha3BvaW50IDUuKiIgIk9ubHkgY2xlYXJlZCAxIGJ5IGxpbmUiCisKK3NlbmRfZ2RiICJpbmYgbGluZSA4XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qYWRkcmVzcyAoMHhcWzAtOWEtZkEtRl0qKS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBzZXQgbGluZV9laWdodCAkZXhwZWN0X291dCgxLHN0cmluZykKKyAgICAgICAgZ2RiX3Rlc3QgImIgOCIgIi4qQnJlYWtwb2ludC4qNi4qIiAiIgorICAgICAgICBnZGJfdGVzdCAiY2xlICokbGluZV9laWdodCIgIi4qRGVsZXRlZCBicmVha3BvaW50cyA2IDQuKiIgIkNsZWFyIDIgYnkgYWRkcmVzcyIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAibmVlZCB0byBmaXggdGVzdCBmb3IgbmV3IGNvbXBpbGUgb3V0Y29tZSIKKyAgICB9Cit9CisKK3NlbmRfZ2RiICJpbmYgbGluZSA5XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qYWRkcmVzcyAoMHhcWzAtOWEtZkEtRl0qKS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBzZXQgbGluZV9uaW5lICRleHBlY3Rfb3V0KDEsc3RyaW5nKQorICAgICAgICBnZGJfdGVzdCAiYiA5IiAgICAgICAiLipCcmVha3BvaW50Lio3LioiICIiCisgICAgICAgIGdkYl90ZXN0ICJiICokbGluZV9uaW5lIiAiLipOb3RlLiphbHNvLipCcmVha3BvaW50Lio4LioiICIiCisgICAgICAgIGdkYl90ZXN0ICJjIiAiLipCcmVha3BvaW50Lio3LipjYWxsZWUuKjkuKiIgIiIKKyAgICAgICAgZ2RiX3Rlc3QgImNsZSIgIi4qRGVsZXRlZCBicmVha3BvaW50cyA4IDcuKiIgIkNsZWFyIDIgYnkgZGVmYXVsdCIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAibmVlZCB0byBmaXggdGVzdCBmb3IgbmV3IGNvbXBpbGUgb3V0Y29tZSIKKyAgICB9Cit9CisKK3NlbmRfZ2RiICJpIGJcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipicmVha3BvaW50LipicmVha3BvaW50LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIGZhaWwgImRpZG4ndCBjbGVhciBicHMiIAorICAgIH0KKyAgICAtcmUgIi4qMy4qbWFpbi4qMjYuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAiYWxsIHNldCB0byBjb250aW51ZSIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAibWlzc2luZyBicCBhdCBlbmQiCisgICAgfQorfQorCisKKyMgU2VlIGlmIHdlIGNhbiBzdGVwIG91dCB3aXRoIGNvbnRyb2wuICBUaGUgIjEgMiAzIiBzdHVmZgorIyBpcyBvdXRwdXQgZnJvbSB0aGUgcHJvZ3JhbS4KKyMKK2dkYl90ZXN0ICJjb250IiAiLipCcmVha3BvaW50LioyNi4qIiAiIgorZ2RiX3Rlc3QgIm5leHQiICIuKjEgMiA3IDE0IDIzIDM0IDQ3IDYyIDc5ICBHb29kYnllIS4qMjcuKiIgIlN0ZXAgdG8gcmV0dXJuIgorCitzZXQgb2xkX3RpbWVvdXQgJHRpbWVvdXQKK3NldCB0aW1lb3V0IDUwCitzZW5kX2dkYiAibmV4dFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIyNy4qJGdkYl9wcm9tcHQgJCIgeworCSMgc29tZXRpbWVzIHdlIHN0b3AgYXQgdGhlIGNsb3NpbmcgYnJhY2UsIGlmIHNvLCBkbyBhbm90aGVyIG5leHQKKwlzZW5kX2dkYiAibmV4dFxuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIi4qVW5hYmxlIHRvIGZpbmQgcmV0dXJuIHBjIGZvciB0aGlzIGZyYW1lLiokZ2RiX3Byb21wdCAkIiB7CisJCWZhaWwgIk9sZCBidWcgY2FtZSBiYWNrISIKKwkJZ2RiX3Rlc3QgIm4iICIuKiIgIiIKKwkgICAgfQorCSAgICAtcmUgIi4qaW4uKnN0YXJ0LiokZ2RiX3Byb21wdCAkIiB7IAorCQlwYXNzICJzdGVwIG91dCBvZiBtYWluIgorCSAgICB9CisJICAgIHRpbWVvdXQgeyBmYWlsICJoYW5nIG9yIHRpbWVvdXQgb24gc3RlcCBhdCBlbmQgMiIgfQorCX0KKyAgICB9CisgICAgLXJlICIuKlVuYWJsZSB0byBmaW5kIHJldHVybiBwYyBmb3IgdGhpcyBmcmFtZS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBmYWlsICJPbGQgYnVnIGNhbWUgYmFjayEiCisgICAgICAgIGdkYl90ZXN0ICJuIiAiLioiICIiCisgICAgfQorICAgIC1yZSAiLippbi4qc3RhcnQuKiRnZGJfcHJvbXB0ICQiIHsgCisgICAgICAgIHBhc3MgInN0ZXAgb3V0IG9mIG1haW4iCisgICAgfQorICAgIHRpbWVvdXQgeyBmYWlsICJoYW5nIG9yIHRpbWVvdXQgb24gc3RlcCBhdCBlbmQgMSIgfQorfQorCitnZGJfdGVzdCAibiIgIi4qU2luZ2xlLipQcm9ncmFtIGV4aXRlZC4qIiAic3RlcCB0byBlbmQgb2YgcnVuIgorc2V0IHRpbWVvdXQgJG9sZF90aW1lb3V0CisKK2dkYl90ZXN0ICJuIiAiLipUaGUgcHJvZ3JhbSBpcyBub3QgYmVpbmcgcnVuLioiICJkb24ndCBzdGVwIGFmdGVyIHJ1biIKKworc2V0IGV4ZWNfb3V0cHV0IFtyZW1vdGVfZXhlYyBob3N0ICJscyBjb3JlIl0KKworaWYgWyByZWdleHAgImNvcmUgbm90IGZvdW5kIiAkZXhlY19vdXRwdXRdICB7CisgICAgcGFzcyAiTm8gY29yZSBkdW1wZWQgb24gcXVpdCIKK30gZWxzZSB7CisgIGlmIFsgcmVnZXhwICJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiAkZXhlY19vdXRwdXRdIHsKKyAgICAgIHBhc3MgImxzOiBjb3JlOiBObyBjb3JlIGR1bXBlZCBvbiBxdWl0IgorICB9IGVsc2UgeworICAgICAgcmVtb3RlX2V4ZWMgYnVpbGQgInJtIC1mIGNvcmUiCisgICAgICBmYWlsICJDb3JlIGR1bXBlZCBvbiBxdWl0IgorICB9Cit9CisKKyNyZW1vdGVfZXhlYyBidWlsZCAicm0gLWYgJHtiaW5maWxlfSIKK3JldHVybiAwCisKKworCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvZW52aXJvbi5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Vudmlyb24uZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMzM5MTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Vudmlyb24uZXhwCkBAIC0wLDAgKzEsMzI5IEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCisJfQorCitnbG9iYWwgdXNlc3R1YnMKKworIworIyB0ZXN0IHJ1bm5pbmcgcHJvZ3JhbXMKKyMKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCisjIFRoaXMgdGVzdCBleGlzdHMgc29sZWx5IHRvIGV4ZXJjaXNlIHRoZSAiZW52aXJvbm1lbnQiIGNvbW1hbmRzIGZvcgorIyBjb2RlLWNvdmVyYWdlIG9uIEhQLVVYLgorIworaWYgIVtpc3RhcmdldCAiaHBwYSotKi1ocHV4KiJdIHRoZW4geworICByZXR1cm4KK30KKworc2V0IHRlc3RmaWxlICJicmVhayIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworaWYgIVtydW50b19tYWluXSB0aGVuIHsgZmFpbCAiZW52aXJvbm1lbnQgY29tbWFuZCB0ZXN0cyBzdXBwcmVzc2VkIiB9CisKKyMgKE5vLCB0aGlzIGlzIG5vdCByZWFsbHkgcmVsYXRlZCB0byB0aGUgZW52aXJvbm1lbnQgY29tbWFuZHMuICBCdXQgaXQncworIyBhIGNvbnZlbmllbnQgcGxhY2UgdG8gdmVyaWZ5IHRoYXQgdGhpcyBjb21tYW5kIHdvcmtzLikKKyMKK3NlbmRfZ2RiICJpbmZvIHByb2dyYW1cbiIKK2dkYl9leHBlY3QgeworICAtcmUgIi4qVXNpbmcgdGhlIHJ1bm5pbmcgaW1hZ2Ugb2YgY2hpbGQgcHJvY2VzcyBcWzAtOVxdKi5cclxuUHJvZ3JhbSBzdG9wcGVkIGF0IDB4XFswLTlhLWZBLUZcXSouXHJcbkl0IHN0b3BwZWQgYXQgYnJlYWtwb2ludCAxLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImluZm8gcHJvZ3JhbSJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImluZm8gcHJvZ3JhbSJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBpbmZvIHByb2dyYW0ifQorfQorCisjIFdlIGRvbid0IHJlYWxseSBjYXJlIHdoZXJlIHRoaXMgc3RlcCBsYW5kcywgc28gbG9uZyBhcyBpdCBnZXRzCisjIHRoZSBpbmZlcmlvciBwdXNoZWQgb2ZmIHRoZSBicmVha3BvaW50IGl0J3MgY3VycmVudGx5IG9uLi4uCisjCitzZW5kX2dkYiAibmV4dFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAic3RlcCBiZWZvcmUgaW5mbyBwcm9ncmFtIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHN0ZXAgYmVmb3JlIGluZm8gcHJvZ3JhbSJ9Cit9CitzZW5kX2dkYiAiaW5mbyBwcm9ncmFtXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICIuKlVzaW5nIHRoZSBydW5uaW5nIGltYWdlIG9mIGNoaWxkIHByb2Nlc3MgXFswLTlcXSouXHJcblByb2dyYW0gc3RvcHBlZCBhdCAweFxbMC05YS1mQS1GXF0qLlxyXG5JdCBzdG9wcGVkIGFmdGVyIGJlaW5nIHN0ZXBwZWQuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiaW5mbyBwcm9ncmFtIGFmdGVyIHN0ZXAifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJpbmZvIHByb2dyYW0gYWZ0ZXIgc3RlcCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBpbmZvIHByb2dyYW0gYWZ0ZXIgc3RlcCJ9Cit9CisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7IGZhaWwgImVudmlyb25tZW50IGNvbW1hbmQgdGVzdHMgc3VwcHJlc3NlZCIgfQorCitzZW5kX2dkYiAiZGVsZXRlXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICIuKnkgb3Igbi4gJCJcCisgICAgICAgICAge3NlbmRfZ2RiICJ5XG4iCisgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJkZWxldGUgYnJlYWtwb2ludCBiZWZvcmUgaW5mbyBwcm9ncmFtIn0KKyAgICAgICAgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgZGVsZXRlIGJyZWFrcG9pbnQgYmVmb3JlIGluZm8gcHJvZ3JhbSJ9CisgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImRlbGV0ZSBicmVha3BvaW50IGJlZm9yZSBpbmZvIHByb2dyYW0ifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgZGVsZXRlIGJyZWFrcG9pbnQgYmVmb3JlIGluZm8gcHJvZ3JhbSJ9Cit9CitzZW5kX2dkYiAiaW5mbyBwcm9ncmFtXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICIuKlVzaW5nIHRoZSBydW5uaW5nIGltYWdlIG9mIGNoaWxkIHByb2Nlc3MgXFswLTlcXSouXHJcblByb2dyYW0gc3RvcHBlZCBhdCAweFxbMC05YS1mQS1GXF0qLlxyXG5JdCBzdG9wcGVkIGF0IGEgYnJlYWtwb2ludCB0aGF0IGhhcyBzaW5jZSBiZWVuIGRlbGV0ZWQuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiaW5mbyBwcm9ncmFtIGFmdGVyIGRlbGV0ZWQgYnJlYWtwb2ludCJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImluZm8gcHJvZ3JhbSBhZnRlciBkZWxldGVkIGJyZWFrcG9pbnQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaW5mbyBwcm9ncmFtIGFmdGVyIGRlbGV0ZWQgYnJlYWtwb2ludCJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgd2UgY2FuIHNob3cgYWxsIGN1cnJlbnRseS1zZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorIyAoSXQncyBhIGJpdCBoYWNreSwgYnV0IG5vbmV0aGVsZXNzIHByb2JhYmx5IHNhZmUgdG8gY2hlY2sgZm9yIGF0CisjIGxlYXN0IHRoZSBTSEVMTCB2YXJpYWJsZS4pCisjCisjIG5lZWQgdG8gaW5jcmVhc2UgdGltZW91dCBiZWNhdXNlIG9mIHZlcnkgbG9uZyBvdXRwdXQKK3NldCBvbGR0aW1lb3V0ICR0aW1lb3V0CitzZXQgdGltZW91dCBbZXhwciAiJHRpbWVvdXQgKyAzMDAiXQorCitzZW5kX2dkYiAic2hvdyBlbnZpcm9ubWVudFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiLipTSEVMTD0oXFthLXpBLVowLTlcXSopLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAic2hvdyBlbnZpcm9ubWVudCJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgInNob3cgZW52aXJvbm1lbnQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc2hvdyBlbnZpcm9ubWVudCJ9Cit9CitzZXQgdGltZW91dCAkb2xkdGltZW91dAorCisjIFZlcmlmeSB0aGF0IHdlIGNhbiB1bnNldCBhIHNwZWNpZmljIGVudmlyb25tZW50IHZhcmlhYmxlLgorIworc2VuZF9nZGIgInVuc2V0IGVudmlyb25tZW50IEVESVRPUlxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImlzc3VlIHVuc2V0IGVudmlyb25tZW50In0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGlzc3VlIHVuc2V0IGVudmlyb25tZW50In0KK30KK3NlbmRfZ2RiICJzaG93IGVudmlyb25tZW50IEVESVRPUlxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiRW52aXJvbm1lbnQgdmFyaWFibGUgXCJFRElUT1JcIiBub3QgZGVmaW5lZC5cclxuJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInVuc2V0IGVudmlyb25tZW50In0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAidW5zZXQgZW52aXJvbm1lbnQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgdW5zZXQgZW52aXJvbm1lbnQifQorfQorCisjIFZlcmlmeSB0aGF0IHdlIGNhbiB1bnNldCBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorIworc2VuZF9nZGIgInVuc2V0IGVudmlyb25tZW50XG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJEZWxldGUgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcy4qeSBvciBuLiAkIlwKKyAgICAgICAgICB7c2VuZF9nZGIgInlcbiIKKyAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJ1bnNldCBlbnRpcmUgZW52aXJvbm1lbnQifQorICAgICAgICAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSB1bnNldCBlbnRpcmUgZW52aXJvbm1lbnQifQorICAgICAgICAgICB9CisgICAgICAgICAgfQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJ1bnNldCBlbnRpcmUgZW52aXJvbm1lbnQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgdW5zZXQgZW50aXJlIGVudmlyb25tZW50In0KK30KKworIyBWZXJpZnkgdGhhdCB3ZSBjYW4gc2V0IGEgc3BlY2lmaWMgZW52aXJvbm1lbnQgdmFyaWFibGUuCisjCitzZW5kX2dkYiAic2V0IGVudmlyb25tZW50IEVESVRPUiBlbWFjc1xuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImlzc3VlIHNldCBlbnZpcm9ubWVudCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBpc3N1ZSBzZXQgZW52aXJvbm1lbnQifQorfQorc2VuZF9nZGIgInNob3cgZW52aXJvbm1lbnQgRURJVE9SXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJFRElUT1IgPSBlbWFjc1xyXG4kZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAic2V0IGVudmlyb25tZW50In0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAic2V0IGVudmlyb25tZW50In0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHNldCBlbnZpcm9ubWVudCJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgR0RCIHJlc3BvbmRzIGdyYWNlZnVsbHkgdG8gYSByZXF1ZXN0IHRvIHNldCBlbnZpcm9ubWVudCwKKyMgd2l0aCBubyB2YXJpYWJsZSBuYW1lLgorIworc2VuZF9nZGIgInNldCBlbnZpcm9ubWVudFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiQXJndW1lbnQgcmVxdWlyZWQgLmVudmlyb25tZW50IHZhcmlhYmxlIGFuZCB2YWx1ZS4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzZXQgZW52aXJvbm1lbnQgd2l0aG91dCB2YXJpYWJsZSBkaXNhbGxvd2VkIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAic2V0IGVudmlyb25tZW50IHdpdGhvdXQgdmFyaWFibGUgZGlzYWxsb3dlZCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZXQgZW52aXJvbm1lbnQgd2l0aG91dCB2YXJpYWJsZSBkaXNhbGxvd2VkIn0KK30KKworIyBJJ20gbm90IHN1cmUganVzdCB3aGF0IEdEQiBoYXMgaW4gbWluZCBpbiBleHBsaWNpdGx5IGNoZWNraW5nCisjIGZvciB0aGlzIHZhcmlhbnQsIGJ1dCBzaW5jZSBHREIgaGFuZGxlcyBpdCwgdGVzdCBpdC4KKyMKK3NlbmRfZ2RiICJzZXQgZW52aXJvbm1lbnQgPVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiQXJndW1lbnQgcmVxdWlyZWQgLmVudmlyb25tZW50IHZhcmlhYmxlIHRvIHNldC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzZXQgZW52aXJvbm1lbnQgZXF1YWxzIHdpdGhvdXQgdmFyaWFibGUgZGlzYWxsb3dlZCJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgInNldCBlbnZpcm9ubWVudCBlcXVhbHMgd2l0aG91dCB2YXJpYWJsZSBkaXNhbGxvd2VkIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHNldCBlbnZpcm9ubWVudCBlcXVhbHMgd2l0aG91dCB2YXJpYWJsZSBkaXNhbGxvd2VkIn0KK30KKworIyBTZXR0aW5nIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHdpdGhvdXQgYSB2YWx1ZSBzZXRzIGl0IHRvIGEgTlVMTAorIyB2YWx1ZS4KKyMKK3NlbmRfZ2RiICJzZXQgZW52aXJvbm1lbnQgRURJVE9SXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJTZXR0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIFwiRURJVE9SXCIgdG8gbnVsbCB2YWx1ZS4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJpc3N1ZSBzZXQgZW52aXJvbm1lbnQgd2l0aG91dCB2YXJpYWJsZSB2YWx1ZSJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImlzc3VlIHNldCBlbnZpcm9ubWVudCB3aXRob3V0IHZhcmlhYmxlIHZhbHVlIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGlzc3VlIHNldCBlbnZpcm9ubWVudCB3aXRob3V0IHZhcmlhYmxlIHZhbHVlIn0KK30KK3NlbmRfZ2RiICJzaG93IGVudmlyb25tZW50IEVESVRPUlxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiRURJVE9SID0gXHJcbiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzZXQgZW52aXJvbm1lbnQgd2l0aG91dCB2YXJpYWJsZSB2YWx1ZSJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgInNldCBlbnZpcm9ubWVudCB3aXRob3V0IHZhcmlhYmxlIHZhbHVlIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHNldCBlbnZpcm9ubWVudCB3aXRob3V0IHZhcmlhYmxlIHZhbHVlIn0KK30KKworIyBWZXJpZnkgdGhhdCBHREIgcmVzcG9uZHMgZ3JhY2VmdWxseSB0byBhbiBhdHRlbXB0IHRvIHNob3cgYQorIyBub24tZXhpc3RlbnQgZW52aXJvbm1lbnQgdmFyaWFibGUuICAoV2UgaG9wZSB0aGlzIHZhcmlhYmxlIGlzCisjIHVuZGVmaW5lZCEpCisjCitzZW5kX2dkYiAic2hvdyBlbnZpcm9ubWVudCBGT09CQVJCQVpHUlVOR0VTUEFaQkFMTFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiRW52aXJvbm1lbnQgdmFyaWFibGUgXCJGT09CQVJCQVpHUlVOR0VTUEFaQkFMTFwiIG5vdCBkZWZpbmVkLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInNob3cgbm9uLWV4aXN0ZW50IGVudmlyb25tZW50IHZhcmlhYmxlIGRpc2FsbG93ZWQifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJzaG93IG5vbi1leGlzdGVudCBlbnZpcm9ubWVudCB2YXJpYWJsZSBkaXNhbGxvd2VkIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHNob3cgbm9uLWV4aXN0ZW50IGVudmlyb25tZW50IHZhcmlhYmxlIGRpc2FsbG93ZWQifQorfQorCisjIFZlcmlmeSB0aGF0IEdEQiBjYW4gc2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGhpdGhlcnRvIHVuZGVmaW5lZC4KKyMKK3NlbmRfZ2RiICJzZXQgZW52aXJvbm1lbnQgRk9PQkFSQkFaR1JVTkdFU1BBWkJBTEwgdFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImlzc3VlIHNldCBlbnZpcm9ubWVudCBmb3IgcHJldmlvdXNseSB1bmRlZmluZWQgdmFyaWFibGUifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaXNzdWUgc2V0IGVudmlyb25tZW50IGZvciBwcmV2aW91c2x5IHVuZGVmaW5lZCB2YXJpYWJsZSJ9Cit9CitzZW5kX2dkYiAic2hvdyBlbnZpcm9ubWVudCBGT09CQVJCQVpHUlVOR0VTUEFaQkFMTFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiRk9PQkFSQkFaR1JVTkdFU1BBWkJBTEwgPSB0XHJcbiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzZXQgZW52aXJvbm1lbnQgZm9yIHByZXZpb3VzbHkgdW5kZWZpbmVkIHZhcmlhYmxlIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAic2V0IGVudmlyb25tZW50IGZvciBwcmV2aW91c2x5IHVuZGVmaW5lZCB2YXJpYWJsZSJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZXQgZW52aXJvbm1lbnQgZm9yIHByZXZpb3VzbHkgdW5kZWZpbmVkIHZhcmlhYmxlIn0KK30KKworIyBWZXJpZnkgdGhhdCBHREIgY2FuIGFsc28gc2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHVzaW5nIHRoZSAiPSIKKyMgc3ludGF4LgorIworc2VuZF9nZGIgInNldCBlbnZpcm9ubWVudCBGT09CQVJCQVpHUlVOR0VTUEFaQkFMTCA9IHRcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJpc3N1ZSBzZXQgZW52aXJvbm1lbnQgd2l0aCBlcXVhbHMifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaXNzdWUgc2V0IGVudmlyb25tZW50IHdpdGggZXF1YWxzIn0KK30KK3NlbmRfZ2RiICJzaG93IGVudmlyb25tZW50IEZPT0JBUkJBWkdSVU5HRVNQQVpCQUxMXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJGT09CQVJCQVpHUlVOR0VTUEFaQkFMTCA9IHRcclxuJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInNldCBlbnZpcm9ubWVudCB3aXRoIGVxdWFscyJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgInNldCBlbnZpcm9ubWVudCB3aXRoIGVxdWFscyJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZXQgZW52aXJvbm1lbnQgd2l0aCBlcXVhbHMifQorfQorCisjIFZlcmlmeSB0aGF0IEdEQiBjYW4gc2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGEgdmFsdWUgdGhhdCBoYXMKKyMgYW4gZW1iZWRkZWQgKHRyYWlsaW5nLCBpbiB0aGlzIGNhc2UpIGVxdWFscy4KKyMKK3NlbmRfZ2RiICJzZXQgZW52aXJvbm1lbnQgRk9PQkFSQkFaR1JVTkdFU1BBWkJBTEwgdD1cbiIKK2dkYl9leHBlY3QgeworICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJpc3N1ZSBzZXQgZW52aXJvbm1lbnQgd2l0aCB0cmFpbGluZyBlcXVhbHMifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaXNzdWUgc2V0IGVudmlyb25tZW50IHdpdGggdHJhaWxpbmcgZXF1YWxzIn0KK30KK3NlbmRfZ2RiICJzaG93IGVudmlyb25tZW50IEZPT0JBUkJBWkdSVU5HRVNQQVpCQUxMXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJGT09CQVJCQVpHUlVOR0VTUEFaQkFMTCA9IHQ9XHJcbiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzZXQgZW52aXJvbm1lbnQgd2l0aCB0cmFpbGluZyBlcXVhbHMifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJzZXQgZW52aXJvbm1lbnQgd2l0aCB0cmFpbGluZyBlcXVhbHMifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc2V0IGVudmlyb25tZW50IHdpdGggdHJhaWxpbmcgZXF1YWxzIn0KK30KKworIyBWZXJpZnkgdGhhdCBHREIgY2FuIHNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBhIHZhbHVlIHByZWNlZGVkCisjIGJ5IHdoaXRlc3BhY2UsIGFuZCB0aGF0IHN1Y2ggd2hpdGVzcGFjZSBpcyBpZ25vcmVkIChub3QgaW5jbHVkZWQKKyMgaW4gdGhlIHNldCB2YWx1ZSkuCisjCitzZW5kX2dkYiAic2V0IGVudmlyb25tZW50IEZPT0JBUkJBWkdSVU5HRVNQQVpCQUxMID0gICAgIGZvb1xuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImlzc3VlIHNldCBlbnZpcm9ubWVudCB3aXRoIHByZWNlZGluZyB3aGl0ZXNwYWNlIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGlzc3VlIHNldCBlbnZpcm9ubWVudCB3aXRoIHByZWNlZGluZyB3aGl0ZXNwYWNlIn0KK30KK3NlbmRfZ2RiICJzaG93IGVudmlyb25tZW50IEZPT0JBUkJBWkdSVU5HRVNQQVpCQUxMXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJGT09CQVJCQVpHUlVOR0VTUEFaQkFMTCA9IGZvb1xyXG4kZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAic2V0IGVudmlyb25tZW50IHdpdGggcHJlY2VkaW5nIHdoaXRlc3BhY2UifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJzZXQgZW52aXJvbm1lbnQgd2l0aCBwcmVjZWRpbmcgd2hpdGVzcGFjZSJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZXQgZW52aXJvbm1lbnQgd2l0aCBwcmVjZWRpbmcgd2hpdGVzcGFjZSJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgR0RCIGNhbiBtYW5pcHVsYXRlIHRoZSBkaXN0aW5ndWlzaGVkIFBBVEggdmFyaWFibGUuCisjCitzZW5kX2dkYiAicGF0aCAvdG1wL0ZPT0JBUkJBWkdSVU5HRVNQQVpCQUxMXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICIuKkV4ZWN1dGFibGUgYW5kIG9iamVjdCBmaWxlIHBhdGg6IC90bXAvRk9PQkFSQkFaR1JVTkdFU1BBWkJBTEwuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJpc3N1ZSBwYXRoIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiaXNzdWUgcGF0aCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBpc3N1ZSBwYXRoIn0KK30KK3NlbmRfZ2RiICJzaG93IHBhdGhzXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJFeGVjdXRhYmxlIGFuZCBvYmplY3QgZmlsZSBwYXRoOiAvdG1wL0ZPT0JBUkJBWkdSVU5HRVNQQVpCQUxMLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAic2hvdyBwYXRocyJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgInNob3cgcGF0aHMifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc2hvdyBwYXRocyJ9Cit9CisKK2dkYl9leGl0CityZXR1cm4gMApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9ldmFsLXNraXAuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9ldmFsLXNraXAuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTdlNjEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2V2YWwtc2tpcC5leHAKQEAgLTAsMCArMSwzNTIgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBFbGVuYSBaYW5ub25pIChlemFubm9uaUBjeWdudXMuY29tKQorCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBnZGIgdGVzdHN1aXRlCisKKyMKKyMgdGVzdHMgdG8gY292ZXIgZXZhbHVhdGVfc3ViZXhwX3N0YW5kYXJkIHdpdGggdGhlIEVWQUxfU0tJUCBmbGFnIHNldC4KKyMgdGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aGVuIHRoZXJlIGlzIHNob3J0IGNpcmN1aXQgZXZhbHVhdGlvbiBpbiB0aGUgJiYgYW5kIHx8CisjIG9wZXJhdG9ycywgb3IgaW4gdGhlIG5vbiByZXR1cm5lZCBwYXJ0IG9mIGEgKHggPyB5OiB6KSBleHByZXNzaW9uLgorIyB0aGUgcGFydCB0aGF0IGlzIG5vdCBldmFsdWF0ZWQgaXMgcGFyc2VkIGFuZCBldmFsdWF0ZWQgYW55d2F5LCBidXQgd2l0aAorIyB0aGUgRVZBTF9TS0lQIGZsYWcgc2V0CisjIAorIyBzb3VyY2UgZmlsZSAiaW50LXR5cGUuYyIKKyMKKworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW4gZXhlY3V0YWJsZSB0byB0ZXN0LiAgSWYgbm90LCB0aGVuIGVpdGhlciB3ZQorIyBoYXZlbid0IHRyaWVkIHRvIGNvbXBpbGUgb25lLCBvciB0aGUgY29tcGlsYXRpb24gZmFpbGVkIGZvciBzb21lIHJlYXNvbi4KKyMgSW4gZWl0aGVyIGNhc2UsIGp1c3Qgbm90aWZ5IHRoZSB1c2VyIGFuZCBza2lwIHRoZSB0ZXN0cyBpbiB0aGlzIGZpbGUuCisKK3NldCB0ZXN0ZmlsZSAiaW50LXR5cGUiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYWRkaXRpb25hbF9mbGFncz0td31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKKyAgICB9CisKKworCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgcGVycm9yICJjb3VsZG4ndCBydW4gdG8gYnJlYWtwb2ludCIKKyAgICBjb250aW51ZQorfQorCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHg9MTQiICIiICJzZXQgdmFyaWFibGUgeD0xNCIKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeT0yIiAiIiAic2V0IHZhcmlhYmxlIHk9MiIKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgej0yIiAiIiAic2V0IHZhcmlhYmxlIHo9MiIKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgdz0zIiAiIiAic2V0IHZhcmlhYmxlIHc9MyIKKworCitzZW5kX2dkYiAicHJpbnQgKDAgJiYgKHgreSkpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IDBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeCt5KSkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgKDAgJiYgKHgreSkpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgKDAgJiYgKHgreSkpIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgKDAgJiYgKHgteSkpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IDBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeC15KSkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgKDAgJiYgKHgteSkpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgKDAgJiYgKHgteSkpIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgKDAgJiYgKHgqeSkpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IDBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeCp5KSkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgKDAgJiYgKHgqeSkpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgKDAgJiYgKHgqeSkpIiB9CisgIH0KKworCisKK3NlbmRfZ2RiICJwcmludCAoMCAmJiAoeC95KSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gMFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICgwICYmICh4L3kpKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeC95KSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAoMCAmJiAoeC95KSkiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAoMCAmJiAoeCV5KSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gMFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICgwICYmICh4JXkpKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeCV5KSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAoMCAmJiAoeCV5KSkiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAoMCAmJiAoeCYmeSkpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IDBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeCYmeSkpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICgwICYmICh4JiZ5KSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAoMCAmJiAoeCYmeSkpIiB9CisgIH0KKworCisKK3NlbmRfZ2RiICJwcmludCAoMCAmJiAoeHx8eSkpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IDBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeHx8eSkpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICgwICYmICh4fHx5KSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAoMCAmJiAoeHx8eSkpIiB9CisgIH0KKworCisKK3NlbmRfZ2RiICJwcmludCAoMCAmJiAoeCZ5KSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gMFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICgwICYmICh4JnkpKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeCZ5KSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAoMCAmJiAoeCZ5KSkiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAoMCAmJiAoeHx5KSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gMFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICgwICYmICh4fHkpKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeHx5KSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAoMCAmJiAoeHx5KSkiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAoMCAmJiAoeF55KSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gMFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICgwICYmICh4XnkpKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeF55KSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAoMCAmJiAoeF55KSkiIH0KKyAgfQorCisKKworc2VuZF9nZGIgInByaW50ICgwICYmICh4IDwgeSkpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IDBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeCA8IHkpKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeCA8IHkpKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mICgwICYmICh4IDwgeSkpIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgKDAgJiYgKHggPD0geSkpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IDBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeCA8PSB5KSkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgKDAgJiYgKHggPD0geSkpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgKDAgJiYgKHggPD0geSkpIiB9CisgIH0KKworCisKK3NlbmRfZ2RiICJwcmludCAoMCAmJiAoeD55KSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gMFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICgwICYmICh4PnkpKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeD55KSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAoMCAmJiAoeD55KSkiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAoMCAmJiAoeD49eSkpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IDBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeD49eSkpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICgwICYmICh4Pj15KSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAoMCAmJiAoeD49eSkpIiB9CisgIH0KKworCisKK3NlbmRfZ2RiICJwcmludCAoMCAmJiAoeD09eSkpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IDBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeD09eSkpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICgwICYmICh4PT15KSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAoMCAmJiAoeD09eSkpIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgKDAgJiYgKHghPXkpKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuJGRlY2ltYWwgPSAwXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgKDAgJiYgKHghPXkpKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeCE9eSkpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgKDAgJiYgKHghPXkpKSIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50ICgwICYmICh4PDwzMSkpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IDBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeDw8MzEpKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeDw8MzEpKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mICgwICYmICh4PDwzMSkpIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgKDAgJiYgKHg+PjMxKSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gMFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICgwICYmICh4Pj4zMSkpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICgwICYmICh4Pj4zMSkpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgKDAgJiYgKHg+PjMxKSkiIH0KKyAgfQorCisKKworc2VuZF9nZGIgInByaW50ICgwICYmICgheCkpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IDBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoIXgpKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoIXgpKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mICgwICYmICgheCkpIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgKDAgJiYgKH54KSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gMFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICgwICYmICh+eCkpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICgwICYmICh+eCkpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgKDAgJiYgKH54KSkiIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgKDAgJiYgKC14KSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gMFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICgwICYmICgteCkpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICgwICYmICgteCkpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgKDAgJiYgKC14KSkiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAoMCAmJiAoeCsrKSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gMFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICgwICYmICh4KyspKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeCsrKSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAoMCAmJiAoeCsrKSkiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAoMCAmJiAoKyt4KSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gMFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICgwICYmICgrK3gpKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoKyt4KSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAoMCAmJiAoKyt4KSkiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAoMCAmJiAoeC0tKSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gMFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICgwICYmICh4LS0pKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeC0tKSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAoMCAmJiAoeC0tKSkiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAoMCAmJiAoLS14KSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gMFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICgwICYmICgtLXgpKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoLS14KSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAoMCAmJiAoLS14KSkiIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgKDAgJiYgKHgrPTcpKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuJGRlY2ltYWwgPSAwXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgKDAgJiYgKHgrPTcpKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeCs9NykpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgKDAgJiYgKHgrPTcpKSIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCAoMCAmJiAoeD15KSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gMFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICgwICYmICh4PXkpKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoMCAmJiAoeD15KSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAoMCAmJiAoeD15KSkiIH0KKyAgfQorCitnZGJfZXhpdAorcmV0dXJuIDAKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9leHBycy5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9leHBycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YzczNTEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2V4cHJzLmMKQEAgLTAsMCArMSwyNTMgQEAKK21haW4gKGFyZ2MsIGFyZ3YsIGVudnApCisgICAgIGludCBhcmdjOworICAgICBjaGFyICoqYXJndjsKKyAgICAgY2hhciAqKmVudnA7Cit7CisgICAgZXh0ZXJuIHZvaWQgZHVtbXkoKTsKKyNpZmRlZiB1c2VzdHVicworICAgIHNldF9kZWJ1Z190cmFwcygpOworICAgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICAgIGR1bW15KCk7Cit9CisKKy8qIFdlIHB1dCBtYWluKCkgcmlnaHQgdXAgZnJvbnQgc28gaXRzIGxpbmUgbnVtYmVyIGRvZXNuJ3Qga2VlcCBjaGFuZ2luZy4gICovCisKKy8qCisgKglUZXN0IGZpbGUgd2l0aCBsb3RzIG9mIGRpZmZlcmVudCB0eXBlcywgZm9yIHRlc3RpbmcgdGhlCisgKgkid2hhdGlzIiBjb21tYW5kLgorICovCisKKy8qCisgKglGaXJzdCB0aGUgYmFzaWMgQyB0eXBlcy4KKyAqLworCisjaWYgIWRlZmluZWQgKF9fU1REQ19fKSAmJiAhZGVmaW5lZCAoX0FJWCkKKyNkZWZpbmUgc2lnbmVkICAvKiovCisjZW5kaWYKKworY2hhcgkJdl9jaGFyOworc2lnbmVkIGNoYXIJdl9zaWduZWRfY2hhcjsKK3Vuc2lnbmVkIGNoYXIJdl91bnNpZ25lZF9jaGFyOworCitzaG9ydAkJdl9zaG9ydDsKK3NpZ25lZCBzaG9ydAl2X3NpZ25lZF9zaG9ydDsKK3Vuc2lnbmVkIHNob3J0CXZfdW5zaWduZWRfc2hvcnQ7CisKK2ludAkJdl9pbnQ7CitzaWduZWQgaW50CXZfc2lnbmVkX2ludDsKK3Vuc2lnbmVkIGludAl2X3Vuc2lnbmVkX2ludDsKKworbG9uZwkJdl9sb25nOworc2lnbmVkIGxvbmcJdl9zaWduZWRfbG9uZzsKK3Vuc2lnbmVkIGxvbmcJdl91bnNpZ25lZF9sb25nOworCitmbG9hdAkJdl9mbG9hdDsKK2RvdWJsZQkJdl9kb3VibGU7CisKKy8qCisgKglOb3cgc29tZSBkZXJpdmVkIHR5cGVzLCB3aGljaCBhcmUgYXJyYXlzLCBmdW5jdGlvbnMtcmV0dXJuaW5nLAorICoJcG9pbnRlcnMsIHN0cnVjdHVyZXMsIHVuaW9ucywgYW5kIGVudW1lcmF0aW9ucy4KKyAqLworCisvKioqKiBhcnJheXMgKioqKioqKi8KKworY2hhcgkJdl9jaGFyX2FycmF5WzJdOworc2lnbmVkIGNoYXIJdl9zaWduZWRfY2hhcl9hcnJheVsyXTsKK3Vuc2lnbmVkIGNoYXIJdl91bnNpZ25lZF9jaGFyX2FycmF5WzJdOworCitzaG9ydAkJdl9zaG9ydF9hcnJheVsyXTsKK3NpZ25lZCBzaG9ydAl2X3NpZ25lZF9zaG9ydF9hcnJheVsyXTsKK3Vuc2lnbmVkIHNob3J0CXZfdW5zaWduZWRfc2hvcnRfYXJyYXlbMl07CisKK2ludAkJdl9pbnRfYXJyYXlbMl07CitzaWduZWQgaW50CXZfc2lnbmVkX2ludF9hcnJheVsyXTsKK3Vuc2lnbmVkIGludAl2X3Vuc2lnbmVkX2ludF9hcnJheVsyXTsKKworbG9uZwkJdl9sb25nX2FycmF5WzJdOworc2lnbmVkIGxvbmcJdl9zaWduZWRfbG9uZ19hcnJheVsyXTsKK3Vuc2lnbmVkIGxvbmcJdl91bnNpZ25lZF9sb25nX2FycmF5WzJdOworCitmbG9hdAkJdl9mbG9hdF9hcnJheVsyXTsKK2RvdWJsZQkJdl9kb3VibGVfYXJyYXlbMl07CisKKy8qKioqIHBvaW50ZXJzICoqKioqKiovCisKK2NoYXIJCSp2X2NoYXJfcG9pbnRlcjsKK3NpZ25lZCBjaGFyCSp2X3NpZ25lZF9jaGFyX3BvaW50ZXI7Cit1bnNpZ25lZCBjaGFyCSp2X3Vuc2lnbmVkX2NoYXJfcG9pbnRlcjsKKworc2hvcnQJCSp2X3Nob3J0X3BvaW50ZXI7CitzaWduZWQgc2hvcnQJKnZfc2lnbmVkX3Nob3J0X3BvaW50ZXI7Cit1bnNpZ25lZCBzaG9ydAkqdl91bnNpZ25lZF9zaG9ydF9wb2ludGVyOworCitpbnQJCSp2X2ludF9wb2ludGVyOworc2lnbmVkIGludAkqdl9zaWduZWRfaW50X3BvaW50ZXI7Cit1bnNpZ25lZCBpbnQJKnZfdW5zaWduZWRfaW50X3BvaW50ZXI7CisKK2xvbmcJCSp2X2xvbmdfcG9pbnRlcjsKK3NpZ25lZCBsb25nCSp2X3NpZ25lZF9sb25nX3BvaW50ZXI7Cit1bnNpZ25lZCBsb25nCSp2X3Vuc2lnbmVkX2xvbmdfcG9pbnRlcjsKKworZmxvYXQJCSp2X2Zsb2F0X3BvaW50ZXI7Citkb3VibGUJCSp2X2RvdWJsZV9wb2ludGVyOworCisvKioqKiBzdHJ1Y3RzICoqKioqKiovCisKK3N0cnVjdCB0X3N0cnVjdCB7CisgICAgY2hhcgl2X2NoYXJfbWVtYmVyOworICAgIHNob3J0CXZfc2hvcnRfbWVtYmVyOworICAgIGludAkJdl9pbnRfbWVtYmVyOworICAgIGxvbmcJdl9sb25nX21lbWJlcjsKKyAgICBmbG9hdAl2X2Zsb2F0X21lbWJlcjsKKyAgICBkb3VibGUJdl9kb3VibGVfbWVtYmVyOworfSB2X3N0cnVjdDE7CisKK3N0cnVjdCB7CisgICAgY2hhcgl2X2NoYXJfbWVtYmVyOworICAgIHNob3J0CXZfc2hvcnRfbWVtYmVyOworICAgIGludAkJdl9pbnRfbWVtYmVyOworICAgIGxvbmcJdl9sb25nX21lbWJlcjsKKyAgICBmbG9hdAl2X2Zsb2F0X21lbWJlcjsKKyAgICBkb3VibGUJdl9kb3VibGVfbWVtYmVyOworfSB2X3N0cnVjdDI7CisKKy8qKioqIHVuaW9ucyAqKioqKioqLworCit1bmlvbiB0X3VuaW9uIHsKKyAgICBjaGFyCXZfY2hhcl9tZW1iZXI7CisgICAgc2hvcnQJdl9zaG9ydF9tZW1iZXI7CisgICAgaW50CQl2X2ludF9tZW1iZXI7CisgICAgbG9uZwl2X2xvbmdfbWVtYmVyOworICAgIGZsb2F0CXZfZmxvYXRfbWVtYmVyOworICAgIGRvdWJsZQl2X2RvdWJsZV9tZW1iZXI7Cit9IHZfdW5pb247CisKK3VuaW9uIHsKKyAgICBjaGFyCXZfY2hhcl9tZW1iZXI7CisgICAgc2hvcnQJdl9zaG9ydF9tZW1iZXI7CisgICAgaW50CQl2X2ludF9tZW1iZXI7CisgICAgbG9uZwl2X2xvbmdfbWVtYmVyOworICAgIGZsb2F0CXZfZmxvYXRfbWVtYmVyOworICAgIGRvdWJsZQl2X2RvdWJsZV9tZW1iZXI7Cit9IHZfdW5pb24yOworCisvKioqIEZ1bmN0aW9ucyByZXR1cm5pbmcgdHlwZSAqKioqKioqKi8KKworY2hhcgkJdl9jaGFyX2Z1bmMgKCkgeyByZXR1cm4oMCk7IH0KK3NpZ25lZCBjaGFyCXZfc2lnbmVkX2NoYXJfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KK3Vuc2lnbmVkIGNoYXIJdl91bnNpZ25lZF9jaGFyX2Z1bmMgKCkgeyByZXR1cm4gKDApOyB9CisKK3Nob3J0CQl2X3Nob3J0X2Z1bmMgKCkgeyByZXR1cm4gKDApOyB9CitzaWduZWQgc2hvcnQJdl9zaWduZWRfc2hvcnRfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KK3Vuc2lnbmVkIHNob3J0CXZfdW5zaWduZWRfc2hvcnRfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KKworaW50CQl2X2ludF9mdW5jICgpIHsgcmV0dXJuICgwKTsgfQorc2lnbmVkIGludAl2X3NpZ25lZF9pbnRfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KK3Vuc2lnbmVkIGludAl2X3Vuc2lnbmVkX2ludF9mdW5jICgpIHsgcmV0dXJuICgwKTsgfQorCitsb25nCQl2X2xvbmdfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KK3NpZ25lZCBsb25nCXZfc2lnbmVkX2xvbmdfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KK3Vuc2lnbmVkIGxvbmcJdl91bnNpZ25lZF9sb25nX2Z1bmMgKCkgeyByZXR1cm4gKDApOyB9CisKK2Zsb2F0CQl2X2Zsb2F0X2Z1bmMgKCkgeyByZXR1cm4gKDAuMCk7IH0KK2RvdWJsZQkJdl9kb3VibGVfZnVuYyAoKSB7IHJldHVybiAoMC4wKTsgfQorCisvKioqKiBTb21lIG1pc2MgbW9yZSBjb21wbGljYXRlZCB0aGluZ3MgKioqKioqKi8KKworc3RydWN0IGxpbmsgeworCXN0cnVjdCBsaW5rICpuZXh0OworI2lmZGVmIF9fU1REQ19fCisJc3RydWN0IGxpbmsgKigqbGlua2Z1bmMpIChzdHJ1Y3QgbGluayAqdGhpcywgaW50IGZsYWdzKTsKKyNlbHNlCisJc3RydWN0IGxpbmsgKigqbGlua2Z1bmMpICgpOworI2VuZGlmCisJc3RydWN0IHRfc3RydWN0IHN0dWZmWzFdWzJdWzNdOworfSAqc19saW5rOworCit1bmlvbiB0dV9saW5rIHsKKwlzdHJ1Y3QgbGluayAqbmV4dDsKKyNpZmRlZiBfX1NURENfXworCXN0cnVjdCBsaW5rICooKmxpbmtmdW5jKSAoc3RydWN0IGxpbmsgKnRoaXMsIGludCBmbGFncyk7CisjZWxzZQorCXN0cnVjdCBsaW5rICooKmxpbmtmdW5jKSAoKTsKKyNlbmRpZgorCXN0cnVjdCB0X3N0cnVjdCBzdHVmZlsxXVsyXVszXTsKK30gdV9saW5rOworCisvKioqKiBFbnVtZXJhdGlvbnMgKioqKioqKi8KKworZW51bSBjb2xvcnMge3JlZCwgZ3JlZW4sIGJsdWV9IGNvbG9yOworZW51bSBjYXJzIHtjaGV2eSwgZm9yZCwgcG9yc2NoZX0gY2x1bmtlcjsKKworCit2b2lkIGR1bW15KCkKK3sKKyAgLyogU29tZSBsaW5rZXJzIChlLmcuIG9uIEFJWCkgcmVtb3ZlIHVucmVmZXJlbmNlZCB2YXJpYWJsZXMsCisgICAgIHNvIG1ha2Ugc3VyZSB0byByZWZlcmVuY2UgdGhlbS4gKi8KKyAgdl9jaGFyID0gMDsKKyAgdl9zaWduZWRfY2hhciA9IDE7CisgIHZfdW5zaWduZWRfY2hhciA9IDI7CisKKyAgdl9zaG9ydCA9IDM7CisgIHZfc2lnbmVkX3Nob3J0ID0gNDsKKyAgdl91bnNpZ25lZF9zaG9ydCA9IDU7ICAgIAorCisgIHZfaW50ID0gNjsKKyAgdl9zaWduZWRfaW50ID0gNzsKKyAgdl91bnNpZ25lZF9pbnQgPSA4OyAgICAKKworICB2X2xvbmcgPSA5OworICB2X3NpZ25lZF9sb25nID0gMTA7CisgIHZfdW5zaWduZWRfbG9uZyA9IDExOyAgICAKKyAgCisgIHZfZmxvYXQgPSAxMDAuMDsKKyAgdl9kb3VibGUgPSAyMDAuMDsKKworCisgIHZfY2hhcl9hcnJheVswXSA9IHZfY2hhcjsKKyAgdl9zaWduZWRfY2hhcl9hcnJheVswXSA9IHZfc2lnbmVkX2NoYXI7CisgIHZfdW5zaWduZWRfY2hhcl9hcnJheVswXSA9IHZfdW5zaWduZWRfY2hhcjsKKworICB2X3Nob3J0X2FycmF5WzBdID0gdl9zaG9ydDsKKyAgdl9zaWduZWRfc2hvcnRfYXJyYXlbMF0gPSB2X3NpZ25lZF9zaG9ydDsKKyAgdl91bnNpZ25lZF9zaG9ydF9hcnJheVswXSA9IHZfdW5zaWduZWRfc2hvcnQ7CisKKyAgdl9pbnRfYXJyYXlbMF0gPSB2X2ludDsKKyAgdl9zaWduZWRfaW50X2FycmF5WzBdID0gdl9zaWduZWRfaW50OworICB2X3Vuc2lnbmVkX2ludF9hcnJheVswXSA9IHZfdW5zaWduZWRfaW50OworCisgIHZfbG9uZ19hcnJheVswXSA9IHZfbG9uZzsKKyAgdl9zaWduZWRfbG9uZ19hcnJheVswXSA9IHZfc2lnbmVkX2xvbmc7CisgIHZfdW5zaWduZWRfbG9uZ19hcnJheVswXSA9IHZfdW5zaWduZWRfbG9uZzsKKworICB2X2Zsb2F0X2FycmF5WzBdID0gdl9mbG9hdDsKKyAgdl9kb3VibGVfYXJyYXlbMF0gPSB2X2RvdWJsZTsKKworICB2X2NoYXJfcG9pbnRlciA9ICZ2X2NoYXI7CisgIHZfc2lnbmVkX2NoYXJfcG9pbnRlciA9ICZ2X3NpZ25lZF9jaGFyOworICB2X3Vuc2lnbmVkX2NoYXJfcG9pbnRlciA9ICZ2X3Vuc2lnbmVkX2NoYXI7CisKKyAgdl9zaG9ydF9wb2ludGVyID0gJnZfc2hvcnQ7CisgIHZfc2lnbmVkX3Nob3J0X3BvaW50ZXIgPSAmdl9zaWduZWRfc2hvcnQ7CisgIHZfdW5zaWduZWRfc2hvcnRfcG9pbnRlciA9ICZ2X3Vuc2lnbmVkX3Nob3J0OworCisgIHZfaW50X3BvaW50ZXIgPSAmdl9pbnQ7CisgIHZfc2lnbmVkX2ludF9wb2ludGVyID0gJnZfc2lnbmVkX2ludDsKKyAgdl91bnNpZ25lZF9pbnRfcG9pbnRlciA9ICZ2X3Vuc2lnbmVkX2ludDsKKworICB2X2xvbmdfcG9pbnRlciA9ICZ2X2xvbmc7CisgIHZfc2lnbmVkX2xvbmdfcG9pbnRlciA9ICZ2X3NpZ25lZF9sb25nOworICB2X3Vuc2lnbmVkX2xvbmdfcG9pbnRlciA9ICZ2X3Vuc2lnbmVkX2xvbmc7CisKKyAgdl9mbG9hdF9wb2ludGVyID0gJnZfZmxvYXQ7CisgIHZfZG91YmxlX3BvaW50ZXIgPSAmdl9kb3VibGU7CisKKyAgY29sb3IgPSByZWQ7CisgIGNsdW5rZXIgPSBwb3JzY2hlOworCisgIHVfbGluay5uZXh0ID0gc19saW5rOworCisgIHZfc3RydWN0Mi52X2ludF9tZW1iZXIgPSB2X3N0cnVjdDEudl9pbnRfbWVtYmVyOworICB2X3VuaW9uMi52X3Nob3J0X21lbWJlciA9IHZfdW5pb24udl9zaG9ydF9tZW1iZXI7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2V4cHJzLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvZXhwcnMuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjMzZGMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2V4cHJzLmV4cApAQCAtMCwwICsxLDIyMiBAQAorIyAgIENvcHlyaWdodCAoQykgMTk4OCwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NCwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUuIChyb2JAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgeworICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCisjCisjIHRlc3QgcnVubmluZyBwcm9ncmFtcworIworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAiZXhwcnMiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0geworICAgIHJldHVybiAtMTsKK30KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKKyMKKyMgc2V0IGl0IHVwIGF0IGEgYnJlYWtwb2ludCBzbyB3ZSBjYW4gcGxheSB3aXRoIHRoZSB2YXJpYWJsZSB2YWx1ZXMKKyMKKworaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgICBwZXJyb3IgImNvdWxkbid0IHJ1biB0byBicmVha3BvaW50IgorICAgIGNvbnRpbnVlCit9CisKK3Byb2MgdGVzdF9leHByIHsgYXJncyB9IHsKKyAgICBpZiB7IFtsbGVuZ3RoICRhcmdzXSAlIDIgfSB7CisJd2FybmluZyAiYW4gZXZlbiAjIG9mIGFyZ3VtZW50cyBzaG91bGQgYmUgcGFzc2VkIHRvIHRlc3RfZXhwciIKKyAgICB9CisgICAgc2V0IGxhc3RfZW50IFtleHByIFtsbGVuZ3RoICRhcmdzXSAtIDFdOworICAgIHNldCB0ZXN0bmFtZSBbbGluZGV4ICRhcmdzICRsYXN0X2VudF07CisgICAgaWYgW2dkYl90ZXN0IFtsaW5kZXggJGFyZ3MgMF0gIiIgIiR0ZXN0bmFtZSAoc2V0dXApIl0geworCWdkYl9zdXBwcmVzc190ZXN0czsKKyAgICB9CisgICAgZm9yIHtzZXQgeCAxfSB7JHggPCAkbGFzdF9lbnR9IHtzZXQgeCBbZXhwciAkeCArIDJdfSB7CisJaWYgW2dkYl90ZXN0IFtsaW5kZXggJGFyZ3MgJHhdIFtsaW5kZXggJGFyZ3MgW2V4cHIgJHggKyAxXV0gIiR0ZXN0bmFtZSAoW2xpbmRleCAkYXJncyAkeF0pIl0geworCSAgICBnZGJfc3VwcHJlc3NfdGVzdHM7CisJfQorICAgIH0KKyAgICBnZGJfc3RvcF9zdXBwcmVzc2luZ190ZXN0czsKK30KKyMKKyMgdGVzdCBleHByZXNzaW9ucyB3aXRoICJjaGFyIiB0eXBlcworIwordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl9jaGFyPTEyNyIgInByaW50IHZfY2hhciA9PSAwIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfY2hhciA9PSAxMjciICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgY2hhciA9PSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfY2hhcj0xMjciICJwcmludCB2X2NoYXIgIT0gMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X2NoYXIgIT0gMTI3IiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IGNoYXIgIT0iCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X2NoYXI9MTI3IiAicHJpbnQgdl9jaGFyIDwgMCIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCB2X2NoYXIgPCAxMjciICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgY2hhciA8IgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl9jaGFyPTEyNyIgInByaW50IHZfY2hhciA+IDAiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdl9jaGFyID4gMTI3IiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IGNoYXIgPiIKKyMKKyMgdGVzdCBleHByZXNzaW9ucyB3aXRoICJzaWduZWQgY2hhciIgdHlwZXMKKyMKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2NoYXI9MTI3IiAicHJpbnQgdl9zaWduZWRfY2hhciA9PSAwIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfc2lnbmVkX2NoYXIgPT0gMTI3IiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHNpZ25lZCBjaGFyID09IgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl9zaWduZWRfY2hhcj0xMjciICJwcmludCB2X3NpZ25lZF9jaGFyICE9IDAiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdl9zaWduZWRfY2hhciAhPSAxMjciICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgc2lnbmVkIGNoYXIgIT0iCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3NpZ25lZF9jaGFyPTEyNyIgInByaW50IHZfc2lnbmVkX2NoYXIgPCAwIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfc2lnbmVkX2NoYXIgPCAxMjciICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgc2lnbmVkIGNoYXIgPCIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2NoYXI9MTI3IiAicHJpbnQgdl9zaWduZWRfY2hhciA+IDAiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdl9zaWduZWRfY2hhciA+IDEyNyIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCBzaWduZWQgY2hhciA+IgorIyBtYWtlIGNoYXIgYSBtaW51cwordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl9zaWduZWRfY2hhcj0tMSIgInByaW50IHZfc2lnbmVkX2NoYXIgPT0gMCIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCB2X3NpZ25lZF9jaGFyID09IC0xIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHNpZ25lZCBjaGFyID09IChtaW51cykiCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3NpZ25lZF9jaGFyPS0xIiAicHJpbnQgdl9zaWduZWRfY2hhciAhPSAwIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHZfc2lnbmVkX2NoYXIgIT0gLTEiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgc2lnbmVkIGNoYXIgIT0gKG1pbnVzKSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2NoYXI9LTEiICJwcmludCB2X3NpZ25lZF9jaGFyIDwgMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X3NpZ25lZF9jaGFyIDwgMTI3IiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHNpZ25lZCBjaGFyIDwgKG1pbnVzKSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2NoYXI9LTEiICJwcmludCB2X3NpZ25lZF9jaGFyID4gMCIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCB2X3NpZ25lZF9jaGFyID4gMTI3IiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHNpZ25lZCBjaGFyID4gKG1pbnVzKSIKKyMKKyMgdGVzdCBleHByZXNzaW9ucyB3aXRoICJ1bnNpZ25lZCBjaGFyIiB0eXBlcworIwordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9jaGFyPTEyNyIgInByaW50IHZfdW5zaWduZWRfY2hhciA9PSAwIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfdW5zaWduZWRfY2hhciA9PSAxMjciICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdW5zaWduZWQgY2hhciA9PSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfdW5zaWduZWRfY2hhcj0xMjciICJwcmludCB2X3Vuc2lnbmVkX2NoYXIgIT0gMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X3Vuc2lnbmVkX2NoYXIgIT0gMTI3IiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHVuc2lnbmVkIGNoYXIgIT0iCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX2NoYXI9MTI3IiAicHJpbnQgdl91bnNpZ25lZF9jaGFyIDwgMCIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCB2X3Vuc2lnbmVkX2NoYXIgPCAxMjciICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdW5zaWduZWQgY2hhciA8IgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9jaGFyPTEyNyIgInByaW50IHZfdW5zaWduZWRfY2hhciA+IDAiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdl91bnNpZ25lZF9jaGFyID4gMTI3IiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHVuc2lnbmVkIGNoYXIgPiIKKyMgbWFrZSBjaGFyIGEgbWludXMKKyMgRklYTUU6ICBnZGIgbWlzaGFuZGxlcyB0aGUgY2FzdCAodW5zaWduZWQgY2hhcikgb24gdGhlIGk5NjAsIHNvIEkndmUKKyMgc2V0IHVwIGFuIGV4cGVjdGVkIGZhaWx1cmUgZm9yIHRoaXMgY2FzZS4KK3NldHVwX3hmYWlsICJpOTYwLSotKiIgMTgyMQordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9jaGFyPX4wIiAicHJpbnQgdl91bnNpZ25lZF9jaGFyID09IDAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdl91bnNpZ25lZF9jaGFyID09IH4wIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfdW5zaWduZWRfY2hhciA9PSAodW5zaWduZWQgY2hhcil+MCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB1bnNpZ25lZCBjaGFyID09ICh+MCkiCisjIEZJWE1FOiAgZ2RiIG1pc2hhbmRsZXMgdGhlIGNhc3QgKHVuc2lnbmVkIGNoYXIpIG9uIHRoZSBpOTYwLCBzbyBJJ3ZlCisjIHNldCB1cCBhbiBleHBlY3RlZCBmYWlsdXJlIGZvciB0aGlzIGNhc2UuCitzZXR1cF94ZmFpbCAiaTk2MC0qLSoiIDE4MjEKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfdW5zaWduZWRfY2hhcj1+MCIgInByaW50IHZfdW5zaWduZWRfY2hhciAhPSAwIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHZfdW5zaWduZWRfY2hhciAhPSAodW5zaWduZWQgY2hhcil+MCIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCB1bnNpZ25lZCBjaGFyICE9ICh+MCkiCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX2NoYXI9fjAiICJwcmludCB2X3Vuc2lnbmVkX2NoYXIgPCAwIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfdW5zaWduZWRfY2hhciA8IDEyNyIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCB1bnNpZ25lZCBjaGFyIDwgKH4wKSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfdW5zaWduZWRfY2hhcj1+MCIgInByaW50IHZfdW5zaWduZWRfY2hhciA+IDAiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdl91bnNpZ25lZF9jaGFyID4gMTI3IiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHVuc2lnbmVkIGNoYXIgPiAofjApIgorIworIyB0ZXN0IGV4cHJlc3Npb25zIHdpdGggInNob3J0IiB0eXBlcworIwordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl9zaG9ydD0weDdGRkYiICJwcmludCB2X3Nob3J0ID09IDAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdl9zaG9ydCA9PSAweDdGRkYiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgc2lnbmVkIHNob3J0ID09IgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl9zaG9ydD0weDdGRkYiICJwcmludCB2X3Nob3J0ICE9IDAiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdl9zaG9ydCAhPSAweDdGRkYiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgc2lnbmVkIHNob3J0ICE9IgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl9zaG9ydD0weDdGRkYiICJwcmludCB2X3Nob3J0IDwgMCIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCB2X3Nob3J0IDwgMHg3RkZGIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHNpZ25lZCBzaG9ydCA8IgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl9zaG9ydD0weDdGRkYiICJwcmludCB2X3Nob3J0ID4gMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X3Nob3J0ID4gMHg3RkZGIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHNpZ25lZCBzaG9ydCA+IgorIyBtYWtlIHNob3J0IGEgbWludXMKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2hvcnQ9LTEiICJwcmludCB2X3Nob3J0ID09IDAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdl9zaG9ydCA9PSAtMSIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCBzaWduZWQgc2hvcnQgPT0gKG1pbnVzKSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2hvcnQ9LTEiICJwcmludCB2X3Nob3J0ICE9IDAiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdl9zaG9ydCAhPSAtMSIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCBzaWduZWQgc2hvcnQgIT0gKG1pbnVzKSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2hvcnQ9LTEiICJwcmludCB2X3Nob3J0IDwgMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X3Nob3J0IDwgMHg3RkZGIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHNpZ25lZCBzaG9ydCA8IChtaW51cykiCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3Nob3J0PS0xIiAicHJpbnQgdl9zaG9ydCA+IDAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdl9zaG9ydCA+IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCBzaWduZWQgc2hvcnQgPiAobWludXMpIgorIworIyB0ZXN0IGV4cHJlc3Npb25zIHdpdGggInNpZ25lZCBzaG9ydCIgdHlwZXMKKyMKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX3Nob3J0PTB4N0ZGRiIgInByaW50IHZfc2lnbmVkX3Nob3J0ID09IDAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdl9zaWduZWRfc2hvcnQgPT0gMHg3RkZGIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHNpZ25lZCBzaWduZWQgc2hvcnQgPT0iCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3NpZ25lZF9zaG9ydD0weDdGRkYiICJwcmludCB2X3NpZ25lZF9zaG9ydCAhPSAwIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHZfc2lnbmVkX3Nob3J0ICE9IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCBzaWduZWQgc2lnbmVkIHNob3J0ICE9IgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl9zaWduZWRfc2hvcnQ9MHg3RkZGIiAicHJpbnQgdl9zaWduZWRfc2hvcnQgPCAwIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfc2lnbmVkX3Nob3J0IDwgMHg3RkZGIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHNpZ25lZCBzaWduZWQgc2hvcnQgPCIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX3Nob3J0PTB4N0ZGRiIgInByaW50IHZfc2lnbmVkX3Nob3J0ID4gMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X3NpZ25lZF9zaG9ydCA+IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCBzaWduZWQgc2lnbmVkIHNob3J0ID4iCisjIG1ha2Ugc2hvcnQgYSBtaW51cwordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl9zaWduZWRfc2hvcnQ9LTEiICJwcmludCB2X3NpZ25lZF9zaG9ydCA9PSAwIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfc2lnbmVkX3Nob3J0ID09IC0xIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHNpZ25lZCBzaWduZWQgc2hvcnQgPT0gKG1pbnVzKSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX3Nob3J0PS0xIiAicHJpbnQgdl9zaWduZWRfc2hvcnQgIT0gMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X3NpZ25lZF9zaG9ydCAhPSAtMSIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCBzaWduZWQgc2lnbmVkIHNob3J0ICE9IChtaW51cykiCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3NpZ25lZF9zaG9ydD0tMSIgInByaW50IHZfc2lnbmVkX3Nob3J0IDwgMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X3NpZ25lZF9zaG9ydCA8IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCBzaWduZWQgc2lnbmVkIHNob3J0IDwgKG1pbnVzKSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX3Nob3J0PS0xIiAicHJpbnQgdl9zaWduZWRfc2hvcnQgPiAwIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfc2lnbmVkX3Nob3J0ID4gMHg3RkZGIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHNpZ25lZCBzaWduZWQgc2hvcnQgPiAobWludXMpIgorIworIyB0ZXN0IGV4cHJlc3Npb25zIHdpdGggInVuc2lnbmVkIHNob3J0IiB0eXBlcworIwordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9zaG9ydD0weDdGRkYiICJwcmludCB2X3Vuc2lnbmVkX3Nob3J0ID09IDAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdl91bnNpZ25lZF9zaG9ydCA9PSAweDdGRkYiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdW5zaWduZWQgc2hvcnQgPT0iCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX3Nob3J0PTB4N0ZGRiIgInByaW50IHZfdW5zaWduZWRfc2hvcnQgIT0gMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X3Vuc2lnbmVkX3Nob3J0ICE9IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCB1bnNpZ25lZCBzaG9ydCAhPSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfdW5zaWduZWRfc2hvcnQ9MHg3RkZGIiAicHJpbnQgdl91bnNpZ25lZF9zaG9ydCA8IDAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdl91bnNpZ25lZF9zaG9ydCA8IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCB1bnNpZ25lZCBzaG9ydCA8IgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9zaG9ydD0weDdGRkYiICJwcmludCB2X3Vuc2lnbmVkX3Nob3J0ID4gMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X3Vuc2lnbmVkX3Nob3J0ID4gMHg3RkZGIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHVuc2lnbmVkIHNob3J0ID4iCisjIG1ha2Ugc2hvcnQgYSBtaW51cworIyBub3RlIHRoYXQgKHVuc2lnbmVkIHNob3J0KSB+MCA9PSB+MCBpZmYgc2l6ZW9mKHNob3J0KSA9PSBzaXplb2YoaW50KSwKKyMgc28gd2UgY2FuJ3QgdGVzdCB2X3Vuc2lnbmVkX3Nob3J0ICE9IH4wCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX3Nob3J0PX4wIiBcCisJInByaW50IHZfdW5zaWduZWRfc2hvcnQgPT0gMCIgIlxcJFxbMC05XF0qID0gMCIgXAorCSJwcmludCB2X3Vuc2lnbmVkX3Nob3J0ID09ICh1bnNpZ25lZCBzaG9ydCl+MCIgIlxcJFxbMC05XF0qID0gMSIgXAorCSJwcmludCB1bnNpZ25lZCBzaG9ydCA9PSAofjApIgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9zaG9ydD1+MCIgInByaW50IHZfdW5zaWduZWRfc2hvcnQgIT0gMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X3Vuc2lnbmVkX3Nob3J0ICE9ICh1bnNpZ25lZCBzaG9ydCl+MCIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCB1bnNpZ25lZCBzaG9ydCAhPSAofjApIgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9zaG9ydD1+MCIgInByaW50IHZfdW5zaWduZWRfc2hvcnQgPCAwIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfdW5zaWduZWRfc2hvcnQgPCAweDdGRkYiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdW5zaWduZWQgc2hvcnQgPCAofjApIgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9zaG9ydD1+MCIgInByaW50IHZfdW5zaWduZWRfc2hvcnQgPiAwIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHZfdW5zaWduZWRfc2hvcnQgPiAweDdGRkYiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdW5zaWduZWQgc2hvcnQgPiAofjApIgorIworIyB0ZXN0IGV4cHJlc3Npb25zIHdpdGggImludCIgdHlwZXMKKyMKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfaW50PTB4N0ZGRiIgInByaW50IHZfaW50ID09IDAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdl9pbnQgPT0gMHg3RkZGIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHNpZ25lZCBpbnQgPT0iCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X2ludD0weDdGRkYiICJwcmludCB2X2ludCAhPSAwIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHZfaW50ICE9IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCBzaWduZWQgaW50ICE9IgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl9pbnQ9MHg3RkZGIiAicHJpbnQgdl9pbnQgPCAwIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfaW50IDwgMHg3RkZGIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHNpZ25lZCBpbnQgPCIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfaW50PTB4N0ZGRiIgInByaW50IHZfaW50ID4gMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X2ludCA+IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCBzaWduZWQgaW50ID4iCisjIG1ha2UgaW50IGEgbWludXMKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfaW50PS0xIiAicHJpbnQgdl9pbnQgPT0gMCIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCB2X2ludCA9PSAtMSIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCBzaWduZWQgaW50ID09IChtaW51cykiCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X2ludD0tMSIgInByaW50IHZfaW50ICE9IDAiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdl9pbnQgIT0gLTEiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgc2lnbmVkIGludCAhPSAobWludXMpIgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl9pbnQ9LTEiICJwcmludCB2X2ludCA8IDAiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdl9pbnQgPCAweDdGRkYiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgc2lnbmVkIGludCA8IChtaW51cykiCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X2ludD0tMSIgInByaW50IHZfaW50ID4gMCIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCB2X2ludCA+IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCBzaWduZWQgaW50ID4gKG1pbnVzKSIKKyMKKyMgdGVzdCBleHByZXNzaW9ucyB3aXRoICJzaWduZWQgaW50IiB0eXBlcworIwordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl9zaWduZWRfaW50PTB4N0ZGRiIgInByaW50IHZfc2lnbmVkX2ludCA9PSAwIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfc2lnbmVkX2ludCA9PSAweDdGRkYiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgc2lnbmVkIHNpZ25lZCBpbnQgPT0iCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3NpZ25lZF9pbnQ9MHg3RkZGIiAicHJpbnQgdl9zaWduZWRfaW50ICE9IDAiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdl9zaWduZWRfaW50ICE9IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCBzaWduZWQgc2lnbmVkIGludCAhPSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2ludD0weDdGRkYiICJwcmludCB2X3NpZ25lZF9pbnQgPCAwIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfc2lnbmVkX2ludCA8IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCBzaWduZWQgc2lnbmVkIGludCA8IgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl9zaWduZWRfaW50PTB4N0ZGRiIgInByaW50IHZfc2lnbmVkX2ludCA+IDAiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdl9zaWduZWRfaW50ID4gMHg3RkZGIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHNpZ25lZCBzaWduZWQgaW50ID4iCisjIG1ha2UgaW50IGEgbWludXMKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2ludD0tMSIgInByaW50IHZfc2lnbmVkX2ludCA9PSAwIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfc2lnbmVkX2ludCA9PSAtMSIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCBzaWduZWQgc2lnbmVkIGludCA9PSAobWludXMpIgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl9zaWduZWRfaW50PS0xIiAicHJpbnQgdl9zaWduZWRfaW50ICE9IDAiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdl9zaWduZWRfaW50ICE9IC0xIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHNpZ25lZCBzaWduZWQgaW50ICE9IChtaW51cykiCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3NpZ25lZF9pbnQ9LTEiICJwcmludCB2X3NpZ25lZF9pbnQgPCAwIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHZfc2lnbmVkX2ludCA8IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCBzaWduZWQgc2lnbmVkIGludCA8IChtaW51cykiCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3NpZ25lZF9pbnQ9LTEiICJwcmludCB2X3NpZ25lZF9pbnQgPiAwIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfc2lnbmVkX2ludCA+IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCBzaWduZWQgc2lnbmVkIGludCA+IChtaW51cykiCisjCisjIHRlc3QgZXhwcmVzc2lvbnMgd2l0aCAidW5zaWduZWQgaW50IiB0eXBlcworIwordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9pbnQ9MHg3RkZGIiAicHJpbnQgdl91bnNpZ25lZF9pbnQgPT0gMCIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCB2X3Vuc2lnbmVkX2ludCA9PSAweDdGRkYiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdW5zaWduZWQgaW50ID09IgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9pbnQ9MHg3RkZGIiAicHJpbnQgdl91bnNpZ25lZF9pbnQgIT0gMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X3Vuc2lnbmVkX2ludCAhPSAweDdGRkYiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdW5zaWduZWQgaW50ICE9IgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9pbnQ9MHg3RkZGIiAicHJpbnQgdl91bnNpZ25lZF9pbnQgPCAwIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfdW5zaWduZWRfaW50IDwgMHg3RkZGIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHVuc2lnbmVkIGludCA8IgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9pbnQ9MHg3RkZGIiAicHJpbnQgdl91bnNpZ25lZF9pbnQgPiAwIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHZfdW5zaWduZWRfaW50ID4gMHg3RkZGIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHVuc2lnbmVkIGludCA+IgorIyBtYWtlIGludCBhIG1pbnVzCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX2ludD1+MCIgInByaW50IHZfdW5zaWduZWRfaW50ID09IDAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdl91bnNpZ25lZF9pbnQgPT0gfjAiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdl91bnNpZ25lZF9pbnQgPT0gKHVuc2lnbmVkIGludCl+MCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB1bnNpZ25lZCBpbnQgPT0gKH4wKSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfdW5zaWduZWRfaW50PX4wIiAicHJpbnQgdl91bnNpZ25lZF9pbnQgIT0gMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X3Vuc2lnbmVkX2ludCAhPSAodW5zaWduZWQgaW50KX4wIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHVuc2lnbmVkIGludCAhPSAofjApIgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9pbnQ9fjAiICJwcmludCB2X3Vuc2lnbmVkX2ludCA8IDAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdl91bnNpZ25lZF9pbnQgPCAweDdGRkYiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdW5zaWduZWQgaW50IDwgKH4wKSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfdW5zaWduZWRfaW50PX4wIiAicHJpbnQgdl91bnNpZ25lZF9pbnQgPiAwIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHZfdW5zaWduZWRfaW50ID4gMHg3RkZGIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHVuc2lnbmVkIGludCA+ICh+MCkiCisjCisjIHRlc3QgZXhwcmVzc2lvbnMgd2l0aCAibG9uZyIgdHlwZXMKKyMKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfbG9uZz0weDdGRkYiICJwcmludCB2X2xvbmcgPT0gMCIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCB2X2xvbmcgPT0gMHg3RkZGIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHNpZ25lZCBsb25nID09IgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl9sb25nPTB4N0ZGRiIgInByaW50IHZfbG9uZyAhPSAwIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHZfbG9uZyAhPSAweDdGRkYiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgc2lnbmVkIGxvbmcgIT0iCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X2xvbmc9MHg3RkZGIiAicHJpbnQgdl9sb25nIDwgMCIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCB2X2xvbmcgPCAweDdGRkYiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgc2lnbmVkIGxvbmcgPCIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfbG9uZz0weDdGRkYiICJwcmludCB2X2xvbmcgPiAwIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHZfbG9uZyA+IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCBzaWduZWQgbG9uZyA+IgorIyBtYWtlIGxvbmcgYSBtaW51cwordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl9sb25nPS0xIiAicHJpbnQgdl9sb25nID09IDAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdl9sb25nID09IC0xIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHNpZ25lZCBsb25nID09IChtaW51cykiCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X2xvbmc9LTEiICJwcmludCB2X2xvbmcgIT0gMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X2xvbmcgIT0gLTEiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgc2lnbmVkIGxvbmcgIT0gKG1pbnVzKSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfbG9uZz0tMSIgInByaW50IHZfbG9uZyA8IDAiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdl9sb25nIDwgMHg3RkZGIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHNpZ25lZCBsb25nIDwgKG1pbnVzKSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfbG9uZz0tMSIgInByaW50IHZfbG9uZyA+IDAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdl9sb25nID4gMHg3RkZGIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHNpZ25lZCBsb25nID4gKG1pbnVzKSIKKyMKKyMgdGVzdCBleHByZXNzaW9ucyB3aXRoICJzaWduZWQgbG9uZyIgdHlwZXMKKyMKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2xvbmc9MHg3RkZGIiAicHJpbnQgdl9zaWduZWRfbG9uZyA9PSAwIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfc2lnbmVkX2xvbmcgPT0gMHg3RkZGIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHNpZ25lZCBzaWduZWQgbG9uZyA9PSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2xvbmc9MHg3RkZGIiAicHJpbnQgdl9zaWduZWRfbG9uZyAhPSAwIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHZfc2lnbmVkX2xvbmcgIT0gMHg3RkZGIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHNpZ25lZCBzaWduZWQgbG9uZyAhPSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2xvbmc9MHg3RkZGIiAicHJpbnQgdl9zaWduZWRfbG9uZyA8IDAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdl9zaWduZWRfbG9uZyA8IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCBzaWduZWQgc2lnbmVkIGxvbmcgPCIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2xvbmc9MHg3RkZGIiAicHJpbnQgdl9zaWduZWRfbG9uZyA+IDAiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdl9zaWduZWRfbG9uZyA+IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCBzaWduZWQgc2lnbmVkIGxvbmcgPiIKKyMgbWFrZSBsb25nIGEgbWludXMKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2xvbmc9LTEiICJwcmludCB2X3NpZ25lZF9sb25nID09IDAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdl9zaWduZWRfbG9uZyA9PSAtMSIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCBzaWduZWQgc2lnbmVkIGxvbmcgPT0gKG1pbnVzKSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2xvbmc9LTEiICJwcmludCB2X3NpZ25lZF9sb25nICE9IDAiICJcXCRcWzAtOVxdKiA9IDEiICAicHJpbnQgdl9zaWduZWRfbG9uZyAhPSAtMSIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCBzaWduZWQgc2lnbmVkIGxvbmcgIT0gKG1pbnVzKSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2xvbmc9LTEiICJwcmludCB2X3NpZ25lZF9sb25nIDwgMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X3NpZ25lZF9sb25nIDwgMHg3RkZGIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHNpZ25lZCBzaWduZWQgbG9uZyA8IChtaW51cykiCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3NpZ25lZF9sb25nPS0xIiAicHJpbnQgdl9zaWduZWRfbG9uZyA+IDAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdl9zaWduZWRfbG9uZyA+IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCBzaWduZWQgc2lnbmVkIGxvbmcgPiAobWludXMpIgorIworIyB0ZXN0IGV4cHJlc3Npb25zIHdpdGggInVuc2lnbmVkIGxvbmciIHR5cGVzCisjCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX2xvbmc9MHg3RkZGIiAicHJpbnQgdl91bnNpZ25lZF9sb25nID09IDAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdl91bnNpZ25lZF9sb25nID09IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB1bnNpZ25lZCBsb25nID09IgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9sb25nPTB4N0ZGRiIgInByaW50IHZfdW5zaWduZWRfbG9uZyAhPSAwIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHZfdW5zaWduZWRfbG9uZyAhPSAweDdGRkYiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdW5zaWduZWQgbG9uZyAhPSIKK3Rlc3RfZXhwciAic2V0IHZhcmlhYmxlIHZfdW5zaWduZWRfbG9uZz0weDdGRkYiICJwcmludCB2X3Vuc2lnbmVkX2xvbmcgPCAwIiAiXFwkXFswLTlcXSogPSAwIiAgInByaW50IHZfdW5zaWduZWRfbG9uZyA8IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCB1bnNpZ25lZCBsb25nIDwiCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX2xvbmc9MHg3RkZGIiAicHJpbnQgdl91bnNpZ25lZF9sb25nID4gMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X3Vuc2lnbmVkX2xvbmcgPiAweDdGRkYiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdW5zaWduZWQgbG9uZyA+IgorIyBtYWtlIGxvbmcgYSBtaW51cwordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9sb25nPX4wIiAicHJpbnQgdl91bnNpZ25lZF9sb25nID09IDAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdl91bnNpZ25lZF9sb25nID09IH4wIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHZfdW5zaWduZWRfbG9uZyA9PSAodW5zaWduZWQgbG9uZyl+MCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB1bnNpZ25lZCBsb25nID09ICh+MCkiCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX2xvbmc9fjAiICJwcmludCB2X3Vuc2lnbmVkX2xvbmcgIT0gMCIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB2X3Vuc2lnbmVkX2xvbmcgIT0gKHVuc2lnbmVkIGxvbmcpfjAiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdW5zaWduZWQgbG9uZyAhPSAofjApIgordGVzdF9leHByICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9sb25nPX4wIiAicHJpbnQgdl91bnNpZ25lZF9sb25nIDwgMCIgIlxcJFxbMC05XF0qID0gMCIgICJwcmludCB2X3Vuc2lnbmVkX2xvbmcgPCAweDdGRkYiICJcXCRcWzAtOVxdKiA9IDAiICAicHJpbnQgdW5zaWduZWQgbG9uZyA8ICh+MCkiCit0ZXN0X2V4cHIgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX2xvbmc9fjAiICJwcmludCB2X3Vuc2lnbmVkX2xvbmcgPiAwIiAiXFwkXFswLTlcXSogPSAxIiAgInByaW50IHZfdW5zaWduZWRfbG9uZyA+IDB4N0ZGRiIgIlxcJFxbMC05XF0qID0gMSIgICJwcmludCB1bnNpZ25lZCBsb25nID4gKH4wKSIKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvZm9vLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Zvby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYTljZjQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Zvby5jCkBAIC0wLDAgKzEsOSBAQAorc3RhdGljIGludCBmb294IF9fYXR0cmlidXRlX18gKChzZWN0aW9uICgiLmRhdGEwMCIpKSkgPSAnZicgKyAnbycgKyAnbyc7CisKK2ludCBmb28gKGludCB4KQoreworICBpZiAoeCkKKyAgICByZXR1cm4gZm9veDsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9mdW5jYXJncy5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9mdW5jYXJncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZDY3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Z1bmNhcmdzLmMKQEAgLTAsMCArMSw1ODIgQEAKKy8qICBUZXN0IHBhc3Npbmcgb2YgYXJndW1lbnRzIHRvIGZ1bmN0aW9ucy4gIFVzZSB2YXJpb3VzIHNvcnRzIG9mIGFyZ3VtZW50cywKKyAgICBpbmNsdWRpbmcgYmFzaWMgdHlwZXMsIHBvaW50ZXJzIHRvIHRob3NlIHR5cGVzLCBzdHJ1Y3R1cmVzLCBsb3RzIG9mCisgICAgYXJncywgZXRjLCBpbiB2YXJpb3VzIGNvbWJpbmF0aW9ucy4gKi8KKworLyogQUlYIHJlcXVpcmVzIHRoaXMgdG8gYmUgdGhlIGZpcnN0IHRoaW5nIGluIHRoZSBmaWxlLiAgKi8KKyNpZmRlZiBfX0dOVUNfXworIyAgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjICBkZWZpbmUgSEFWRV9TVEFDS19BTExPQ0EgMQorI2Vsc2UgLyogbm90IF9fR05VQ19fICovCisjICBpZmRlZiBfQUlYCisgICAgICNwcmFnbWEgYWxsb2NhCisjICAgIGRlZmluZSBIQVZFX1NUQUNLX0FMTE9DQSAxCisjICBlbHNlIC8qIE5vdCBBSVggKi8KKyMgICAgaWZkZWYgc3BhcmMKKyMgICAgICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgICAgICBkZWZpbmUgSEFWRV9TVEFDS19BTExPQ0EgMQorIyAgICAgIGlmZGVmIF9fU1REQ19fCisgICAgICAgICB2b2lkICphbGxvY2EgKCk7CisjICAgICAgZWxzZQorICAgICAgICAgY2hhciAqYWxsb2NhICgpOworIyAgICAgIGVuZGlmIC8qIF9fU1REQ19fICovCisjICAgIGVuZGlmIC8qIHNwYXJjICovCisjICBlbmRpZiAvKiBOb3QgQUlYICovCisjZW5kaWYgLyogbm90IF9fR05VQ19fICovCisKK2NoYXIgYyA9ICdhJzsKK2NoYXIgKmNwID0gJmM7CisKK3Vuc2lnbmVkIGNoYXIgdWMgPSAnYic7Cit1bnNpZ25lZCBjaGFyICp1Y3AgPSAmdWM7CisKK3Nob3J0IHMgPSAxOworc2hvcnQgKnNwID0gJnM7CisKK3Vuc2lnbmVkIHNob3J0IHVzID0gNjsKK3Vuc2lnbmVkIHNob3J0ICp1c3AgPSAmdXM7CisKK2ludCBpID0gMjsKK2ludCAqaXAgPSAmaTsKKwordW5zaWduZWQgaW50IHVpID0gNzsKK3Vuc2lnbmVkIGludCAqdWlwID0gJnVpOworCitsb25nIGwgPSAzOworbG9uZyAqbHAgPSAmbDsKKwordW5zaWduZWQgbG9uZyB1bCA9IDg7Cit1bnNpZ25lZCBsb25nICp1bHAgPSAmdWw7CisKK2Zsb2F0IGYgPSA0LjA7CitmbG9hdCAqZnAgPSAmZjsKKworZG91YmxlIGQgPSA1LjA7Citkb3VibGUgKmRwID0gJmQ7CisKK3N0cnVjdCBzdGFnIHsKKyAgICBpbnQgczE7CisgICAgaW50IHMyOworfSBzdCA9IHsgMTAxLCAxMDIgfTsKK3N0cnVjdCBzdGFnICpzdHAgPSAmc3Q7CisKK3VuaW9uIHV0YWcgeworICAgIGludCB1MTsKKyAgICBsb25nIHUyOworfSB1bjsKK3VuaW9uIHV0YWcgKnVucCA9ICZ1bjsKKworY2hhciBjYXJyYXlbXSA9IHsnYScsICduJywgJyAnLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ1wwJ307CisKKworLyogVGVzdCB2YXJpb3VzIHBlcm11dGF0aW9ucyBhbmQgaW50ZXJsZWF2aW5nIG9mIGludGVncmFsIGFyZ3VtZW50cyAqLworCisKK2NhbGwwYSAoYywgcywgaSwgbCkKK2NoYXIgYzsgc2hvcnQgczsgaW50IGk7IGxvbmcgbDsKK3sKKyAgYyA9ICdhJzsKKyAgcyA9IDU7CisgIGkgPSA2OworICBsID0gNzsKK30KKworY2FsbDBiIChzLCBpLCBsLCBjKQorc2hvcnQgczsgaW50IGk7IGxvbmcgbDsgY2hhciBjOworeworICBzID0gNjsgaSA9IDc7IGwgPSA4OyBjID0gJ2onOworfQorCitjYWxsMGMgKGksIGwsIGMsIHMpCitpbnQgaTsgbG9uZyBsOyBjaGFyIGM7IHNob3J0IHM7Cit7CisgIGkgPSAzOyBsID0gNDsgYyA9ICdrJzsgcyA9IDU7Cit9CisKK2NhbGwwZCAobCwgYywgcywgaSkKK2xvbmcgbDsgY2hhciBjOyBzaG9ydCBzOyBpbnQgaTsKK3sKKyAgbCA9IDc7IGMgPSAneic7IHMgPSA4OyBpID0gOTsKK30KKworY2FsbDBlIChjMSwgbCwgYzIsIGksIGMzLCBzLCBjNCwgYzUpCitjaGFyIGMxOyBsb25nIGw7IGNoYXIgYzI7IGludCBpOyBjaGFyIGMzOyBzaG9ydCBzOyBjaGFyIGM0OyBjaGFyIGM1OworeworICBjMSA9ICdhJzsgbCA9IDU7IGMyID0gJ2InOyBpID0gNzsgYzMgPSAnYyc7IHMgPSA3OyBjNCA9ICdmJzsgYzUgPSAnZyc7Cit9CisKKworLyogVGVzdCB2YXJpb3VzIHBlcm11dGF0aW9ucyBhbmQgaW50ZXJsZWF2aW5nIG9mIHVuc2lnbmVkIGludGVncmFsIGFyZ3VtZW50cyAqLworCisKK2NhbGwxYSAodWMsIHVzLCB1aSwgdWwpCit1bnNpZ25lZCBjaGFyIHVjOyB1bnNpZ25lZCBzaG9ydCB1czsgdW5zaWduZWQgaW50IHVpOyB1bnNpZ25lZCBsb25nIHVsOworeworICB1YyA9IDU7IHVzID0gNjsgdWkgPSA3OyB1bCA9IDg7Cit9CisKK2NhbGwxYiAodXMsIHVpLCB1bCwgdWMpCit1bnNpZ25lZCBzaG9ydCB1czsgdW5zaWduZWQgaW50IHVpOyB1bnNpZ25lZCBsb25nIHVsOyB1bnNpZ25lZCBjaGFyIHVjOworeworICB1YyA9IDU7IHVzID0gNjsgdWkgPSA3OyB1bCA9IDg7Cit9CisKK2NhbGwxYyAodWksIHVsLCB1YywgdXMpCit1bnNpZ25lZCBpbnQgdWk7IHVuc2lnbmVkIGxvbmcgdWw7IHVuc2lnbmVkIGNoYXIgdWM7IHVuc2lnbmVkIHNob3J0IHVzOworeworICB1YyA9IDU7IHVzID0gNjsgdWkgPSA3OyB1bCA9IDg7Cit9CisKK2NhbGwxZCAodWwsIHVjLCB1cywgdWkpCit1bnNpZ25lZCBsb25nIHVsOyB1bnNpZ25lZCBjaGFyIHVjOyB1bnNpZ25lZCBzaG9ydCB1czsgdW5zaWduZWQgaW50IHVpOworeworICB1YyA9IDU7IHVzID0gNjsgdWkgPSA3OyB1bCA9IDg7Cit9CisKK2NhbGwxZSAodWMxLCB1bCwgdWMyLCB1aSwgdWMzLCB1cywgdWM0LCB1YzUpCit1bnNpZ25lZCBjaGFyIHVjMTsgdW5zaWduZWQgbG9uZyB1bDsgdW5zaWduZWQgY2hhciB1YzI7IHVuc2lnbmVkIGludCB1aTsKK3Vuc2lnbmVkIGNoYXIgdWMzOyB1bnNpZ25lZCBzaG9ydCB1czsgdW5zaWduZWQgY2hhciB1YzQ7IHVuc2lnbmVkIGNoYXIgdWM1OworeworICB1YzEgPSA1OyB1bCA9IDc7IHVjMiA9IDg7IHVpID0gOTsgdWMzID0gMTA7IHVzID0gMTE7IHVjNCA9IDEyOyB1YzUgPSA1NTsKK30KKworLyogVGVzdCB2YXJpb3VzIHBlcm11dGF0aW9ucyBhbmQgaW50ZXJsZWF2aW5nIG9mIGludGVncmFsIGFyZ3VtZW50cyB3aXRoCisgICBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMuICovCisKKworY2FsbDJhIChjLCBmMSwgcywgZDEsIGksIGYyLCBsLCBkMikKK2NoYXIgYzsgZmxvYXQgZjE7IHNob3J0IHM7IGRvdWJsZSBkMTsgaW50IGk7IGZsb2F0IGYyOyBsb25nIGw7IGRvdWJsZSBkMjsKK3sKKyAgYyA9ICdhJzsgZjEgPSAwLjA7IHMgPSA1OyBkMSA9IDAuMDsgaSA9IDY7IGYyID0gMC4xOyBsID0gNzsgZDIgPSAwLjI7Cit9CisKK2NhbGwyYiAoZjEsIHMsIGQxLCBpLCBmMiwgbCwgZDIsIGMpCitmbG9hdCBmMTsgc2hvcnQgczsgZG91YmxlIGQxOyBpbnQgaTsgZmxvYXQgZjI7IGxvbmcgbDsgZG91YmxlIGQyOyBjaGFyIGM7Cit7CisgIGMgPSAnYSc7IGYxID0gMC4wOyBzID0gNTsgZDEgPSAwLjA7IGkgPSA2OyBmMiA9IDAuMTsgbCA9IDc7IGQyID0gMC4yOworfQorCitjYWxsMmMgKHMsIGQxLCBpLCBmMiwgbCwgZDIsIGMsIGYxKQorc2hvcnQgczsgZG91YmxlIGQxOyBpbnQgaTsgZmxvYXQgZjI7IGxvbmcgbDsgZG91YmxlIGQyOyBjaGFyIGM7IGZsb2F0IGYxOworeworICBjID0gJ2EnOyBmMSA9IDAuMDsgcyA9IDU7IGQxID0gMC4wOyBpID0gNjsgZjIgPSAwLjE7IGwgPSA3OyBkMiA9IDAuMjsKK30KKworY2FsbDJkIChkMSwgaSwgZjIsIGwsIGQyLCBjLCBmMSwgcykKK2RvdWJsZSBkMTsgaW50IGk7IGZsb2F0IGYyOyBsb25nIGw7IGRvdWJsZSBkMjsgY2hhciBjOyBmbG9hdCBmMTsgc2hvcnQgczsKK3sKKyAgYyA9ICdhJzsgZjEgPSAwLjA7IHMgPSA1OyBkMSA9IDAuMDsgaSA9IDY7IGYyID0gMC4xOyBsID0gNzsgZDIgPSAwLjI7Cit9CisKK2NhbGwyZSAoaSwgZjIsIGwsIGQyLCBjLCBmMSwgcywgZDEpCitpbnQgaTsgZmxvYXQgZjI7IGxvbmcgbDsgZG91YmxlIGQyOyBjaGFyIGM7IGZsb2F0IGYxOyBzaG9ydCBzOyBkb3VibGUgZDE7Cit7CisgIGMgPSAnYSc7IGYxID0gMC4wOyBzID0gNTsgZDEgPSAwLjA7IGkgPSA2OyBmMiA9IDAuMTsgbCA9IDc7IGQyID0gMC4yOworfQorCitjYWxsMmYgKGYyLCBsLCBkMiwgYywgZjEsIHMsIGQxLCBpKQorZmxvYXQgZjI7IGxvbmcgbDsgZG91YmxlIGQyOyBjaGFyIGM7IGZsb2F0IGYxOyBzaG9ydCBzOyBkb3VibGUgZDE7IGludCBpOworeworICBjID0gJ2EnOyBmMSA9IDAuMDsgcyA9IDU7IGQxID0gMC4wOyBpID0gNjsgZjIgPSAwLjE7IGwgPSA3OyBkMiA9IDAuMjsKK30KKworY2FsbDJnIChsLCBkMiwgYywgZjEsIHMsIGQxLCBpLCBmMikKK2xvbmcgbDsgZG91YmxlIGQyOyBjaGFyIGM7IGZsb2F0IGYxOyBzaG9ydCBzOyBkb3VibGUgZDE7IGludCBpOyBmbG9hdCBmMjsKK3sKKyAgYyA9ICdhJzsgZjEgPSAwLjA7IHMgPSA1OyBkMSA9IDAuMDsgaSA9IDY7IGYyID0gMC4xOyBsID0gNzsgZDIgPSAwLjI7Cit9CisKK2NhbGwyaCAoZDIsIGMsIGYxLCBzLCBkMSwgaSwgZjIsIGwpCitkb3VibGUgZDI7IGNoYXIgYzsgZmxvYXQgZjE7IHNob3J0IHM7IGRvdWJsZSBkMTsgaW50IGk7IGZsb2F0IGYyOyBsb25nIGw7Cit7CisgIGMgPSAnYSc7IGYxID0gMC4wOyBzID0gNTsgZDEgPSAwLjA7IGkgPSA2OyBmMiA9IDAuMTsgbCA9IDc7IGQyID0gMC4yOworfQorCitjYWxsMmkgKGMxLCBmMSwgYzIsIGMzLCBkMSwgYzQsIGM1LCBjNiwgZjIsIHMsIGM3LCBkMikKK2NoYXIgYzE7IGZsb2F0IGYxOyBjaGFyIGMyOyBjaGFyIGMzOyBkb3VibGUgZDE7IGNoYXIgYzQ7IGNoYXIgYzU7IGNoYXIgYzY7CitmbG9hdCBmMjsgc2hvcnQgczsgY2hhciBjNzsgZG91YmxlIGQyOworeworICBjMSA9ICdhJzsgZjEgPSAwLjA7IGMyID0gNTsgZDEgPSAwLjA7IGMzID0gNjsgZjIgPSAwLjE7IGM0ID0gNzsgZDIgPSAwLjI7CisgIGM1ID0gJ3MnOyBjNiA9ICdmJzsgYzcgPSAneic7IHMgPSA3NzsKK30KKworCisvKiBUZXN0IHBvaW50ZXJzIHRvIHZhcmlvdXMgaW50ZWdyYWwgYW5kIGZsb2F0aW5nIHR5cGVzLiAqLworCisKK2NhbGwzYSAoY3AsIHNwLCBpcCwgbHApCitjaGFyICpjcDsgc2hvcnQgKnNwOyBpbnQgKmlwOyBsb25nICpscDsKK3sKKyAgY3AgPSAwOyBzcCA9IDA7IGlwID0gMDsgbHAgPSAwOworfQorCitjYWxsM2IgKHVjcCwgdXNwLCB1aXAsIHVscCkKK3Vuc2lnbmVkIGNoYXIgKnVjcDsgdW5zaWduZWQgc2hvcnQgKnVzcDsgdW5zaWduZWQgaW50ICp1aXA7Cit1bnNpZ25lZCBsb25nICp1bHA7Cit7CisgIHVjcCA9IDA7IHVzcCA9IDA7IHVpcCA9IDA7IHVscCA9IDA7Cit9CisKK2NhbGwzYyAoZnAsIGRwKQorZmxvYXQgKmZwOyBkb3VibGUgKmRwOworeworICBmcCA9IDA7IGRwID0gMDsKK30KKworCisvKiBUZXN0IHBhc3Npbmcgc3RydWN0dXJlcyBhbmQgdW5pb25zIGJ5IHJlZmVyZW5jZS4gKi8KKworCitjYWxsNGEgKHN0cCkKK3N0cnVjdCBzdGFnICpzdHA7IHsKK3N0cCA9IDA7fQorCitjYWxsNGIgKHVucCkKK3VuaW9uIHV0YWcgKnVucDsKK3sKKyAgdW5wID0gMDsKK30KKworCisvKiBUZXN0IHBhc3Npbmcgc3RydWN0dXJlcyBhbmQgdW5pb25zIGJ5IHZhbHVlLiAqLworCisKK2NhbGw1YSAoc3QpCitzdHJ1Y3Qgc3RhZyBzdDsge3N0LnMxID0gNTt9CisKK2NhbGw1YiAodW4pCit1bmlvbiB1dGFnIHVuOyB7dW4udTEgPSA3O30KKworCisvKiBUZXN0IHNodWZmbGluZyBvZiBhcmdzICovCisKKworY2FsbDZhIChjLCBzLCBpLCBsLCBmLCBkLCB1YywgdXMsIHVpLCB1bCkKK2NoYXIgYzsgc2hvcnQgczsgaW50IGk7IGxvbmcgbDsgZmxvYXQgZjsgZG91YmxlIGQ7Cit1bnNpZ25lZCBjaGFyIHVjOyB1bnNpZ25lZCBzaG9ydCB1czsgdW5zaWduZWQgaW50IHVpOyB1bnNpZ25lZCBsb25nIHVsOworeworICBjID0gYzsKKyAgICBjYWxsNmIgKHMsIGksIGwsIGYsIGQsIHVjLCB1cywgdWksIHVsKTsKK30KKworY2FsbDZiIChzLCBpLCBsLCBmLCBkLCB1YywgdXMsIHVpLCB1bCkKK3Nob3J0IHM7IGludCBpOyBsb25nIGw7IGZsb2F0IGY7IGRvdWJsZSBkOwordW5zaWduZWQgY2hhciB1YzsgdW5zaWduZWQgc2hvcnQgdXM7IHVuc2lnbmVkIGludCB1aTsgdW5zaWduZWQgbG9uZyB1bDsKK3sKKyAgcyA9IHM7CisgICAgY2FsbDZjIChpLCBsLCBmLCBkLCB1YywgdXMsIHVpLCB1bCk7Cit9CisKK2NhbGw2YyAoaSwgbCwgZiwgZCwgdWMsIHVzLCB1aSwgdWwpCitpbnQgaTsgbG9uZyBsOyBmbG9hdCBmOyBkb3VibGUgZDsKK3Vuc2lnbmVkIGNoYXIgdWM7IHVuc2lnbmVkIHNob3J0IHVzOyB1bnNpZ25lZCBpbnQgdWk7IHVuc2lnbmVkIGxvbmcgdWw7Cit7CisgIGkgPSBpOworICAgIGNhbGw2ZCAobCwgZiwgZCwgdWMsIHVzLCB1aSwgdWwpOworfQorCitjYWxsNmQgKGwsIGYsIGQsIHVjLCB1cywgdWksIHVsKQorbG9uZyBsOyBmbG9hdCBmOyBkb3VibGUgZDsKK3Vuc2lnbmVkIGNoYXIgdWM7IHVuc2lnbmVkIHNob3J0IHVzOyB1bnNpZ25lZCBpbnQgdWk7IHVuc2lnbmVkIGxvbmcgdWw7Cit7CisgIGwgPSBsOworICAgIGNhbGw2ZSAoZiwgZCwgdWMsIHVzLCB1aSwgdWwpOworfQorCitjYWxsNmUgKGYsIGQsIHVjLCB1cywgdWksIHVsKQorZmxvYXQgZjsgZG91YmxlIGQ7Cit1bnNpZ25lZCBjaGFyIHVjOyB1bnNpZ25lZCBzaG9ydCB1czsgdW5zaWduZWQgaW50IHVpOyB1bnNpZ25lZCBsb25nIHVsOworeworICBmID0gZjsKKyAgICBjYWxsNmYgKGQsIHVjLCB1cywgdWksIHVsKTsKK30KKworY2FsbDZmIChkLCB1YywgdXMsIHVpLCB1bCkKK2RvdWJsZSBkOwordW5zaWduZWQgY2hhciB1YzsgdW5zaWduZWQgc2hvcnQgdXM7IHVuc2lnbmVkIGludCB1aTsgdW5zaWduZWQgbG9uZyB1bDsKK3sKKyAgZCA9IGQ7CisgICAgY2FsbDZnICh1YywgdXMsIHVpLCB1bCk7Cit9CisKK2NhbGw2ZyAodWMsIHVzLCB1aSwgdWwpCit1bnNpZ25lZCBjaGFyIHVjOyB1bnNpZ25lZCBzaG9ydCB1czsgdW5zaWduZWQgaW50IHVpOyB1bnNpZ25lZCBsb25nIHVsOworeworICB1YyA9IHVjOworICAgIGNhbGw2aCAodXMsIHVpLCB1bCk7Cit9CisKK2NhbGw2aCAodXMsIHVpLCB1bCkKK3Vuc2lnbmVkIHNob3J0IHVzOyB1bnNpZ25lZCBpbnQgdWk7IHVuc2lnbmVkIGxvbmcgdWw7Cit7CisgIHVzID0gdXM7CisgICAgY2FsbDZpICh1aSwgdWwpOworfQorCitjYWxsNmkgKHVpLCB1bCkKK3Vuc2lnbmVkIGludCB1aTsgdW5zaWduZWQgbG9uZyB1bDsKK3sKKyAgdWkgPSB1aTsKKyAgICBjYWxsNmogKHVsKTsKK30KKworY2FsbDZqICh1bCkKK3Vuc2lnbmVkIGxvbmcgdWw7Cit7CisgIHVsID0gdWw7CisgICAgY2FsbDZrICgpOworfQorCitjYWxsNmsgKCkKK3sKK30KKworCisvKiAgVGVzdCBzaHVmZmxpbmcgb2YgYXJncywgcm91bmQgcm9iaW4gKi8KKworCitjYWxsN2EgKGMsIGksIHMsIGwsIGYsIHVjLCBkLCB1cywgdWwsIHVpKQorY2hhciBjOyBpbnQgaTsgc2hvcnQgczsgbG9uZyBsOyBmbG9hdCBmOyB1bnNpZ25lZCBjaGFyIHVjOyBkb3VibGUgZDsgdW5zaWduZWQgc2hvcnQgdXM7IHVuc2lnbmVkIGxvbmcgdWw7IHVuc2lnbmVkIGludCB1aTsKK3sKKyAgICBjYWxsN2IgKGksIHMsIGwsIGYsIHVjLCBkLCB1cywgdWwsIHVpLCBjKTsKK30KKworY2FsbDdiIChpLCBzLCBsLCBmLCB1YywgZCwgdXMsIHVsLCB1aSwgYykKK2ludCBpOyBzaG9ydCBzOyBsb25nIGw7IGZsb2F0IGY7IHVuc2lnbmVkIGNoYXIgdWM7IGRvdWJsZSBkOyB1bnNpZ25lZCBzaG9ydCB1czsgdW5zaWduZWQgbG9uZyB1bDsgdW5zaWduZWQgaW50IHVpOyBjaGFyIGM7Cit7CisgICAgY2FsbDdjIChzLCBsLCBmLCB1YywgZCwgdXMsIHVsLCB1aSwgYywgaSk7Cit9CisKK2NhbGw3YyAocywgbCwgZiwgdWMsIGQsIHVzLCB1bCwgdWksIGMsIGkpCitzaG9ydCBzOyBsb25nIGw7IGZsb2F0IGY7IHVuc2lnbmVkIGNoYXIgdWM7IGRvdWJsZSBkOyB1bnNpZ25lZCBzaG9ydCB1czsgdW5zaWduZWQgbG9uZyB1bDsgdW5zaWduZWQgaW50IHVpOyBjaGFyIGM7IGludCBpOworeworICAgIGNhbGw3ZCAobCwgZiwgdWMsIGQsIHVzLCB1bCwgdWksIGMsIGksIHMpOworfQorCitjYWxsN2QgKGwsIGYsIHVjLCBkLCB1cywgdWwsIHVpLCBjLCBpLCBzKQorbG9uZyBsOyBmbG9hdCBmOyB1bnNpZ25lZCBjaGFyIHVjOyBkb3VibGUgZDsgdW5zaWduZWQgc2hvcnQgdXM7IHVuc2lnbmVkIGxvbmcgdWw7IHVuc2lnbmVkIGludCB1aTsgY2hhciBjOyBpbnQgaTsgc2hvcnQgczsKK3sKKyAgICBjYWxsN2UgKGYsIHVjLCBkLCB1cywgdWwsIHVpLCBjLCBpLCBzLCBsKTsKK30KKworY2FsbDdlIChmLCB1YywgZCwgdXMsIHVsLCB1aSwgYywgaSwgcywgbCkKK2Zsb2F0IGY7IHVuc2lnbmVkIGNoYXIgdWM7IGRvdWJsZSBkOyB1bnNpZ25lZCBzaG9ydCB1czsgdW5zaWduZWQgbG9uZyB1bDsgdW5zaWduZWQgaW50IHVpOyBjaGFyIGM7IGludCBpOyBzaG9ydCBzOyBsb25nIGw7Cit7CisgICAgY2FsbDdmICh1YywgZCwgdXMsIHVsLCB1aSwgYywgaSwgcywgbCwgZik7Cit9CisKK2NhbGw3ZiAodWMsIGQsIHVzLCB1bCwgdWksIGMsIGksIHMsIGwsIGYpCit1bnNpZ25lZCBjaGFyIHVjOyBkb3VibGUgZDsgdW5zaWduZWQgc2hvcnQgdXM7IHVuc2lnbmVkIGxvbmcgdWw7IHVuc2lnbmVkIGludCB1aTsgY2hhciBjOyBpbnQgaTsgc2hvcnQgczsgbG9uZyBsOyBmbG9hdCBmOworeworICAgIGNhbGw3ZyAoZCwgdXMsIHVsLCB1aSwgYywgaSwgcywgbCwgZiwgdWMpOworfQorCitjYWxsN2cgKGQsIHVzLCB1bCwgdWksIGMsIGksIHMsIGwsIGYsIHVjKQorZG91YmxlIGQ7IHVuc2lnbmVkIHNob3J0IHVzOyB1bnNpZ25lZCBsb25nIHVsOyB1bnNpZ25lZCBpbnQgdWk7IGNoYXIgYzsgaW50IGk7IHNob3J0IHM7IGxvbmcgbDsgZmxvYXQgZjsgdW5zaWduZWQgY2hhciB1YzsKK3sKKyAgICBjYWxsN2ggKHVzLCB1bCwgdWksIGMsIGksIHMsIGwsIGYsIHVjLCBkKTsKK30KKworY2FsbDdoICh1cywgdWwsIHVpLCBjLCBpLCBzLCBsLCBmLCB1YywgZCkKK3Vuc2lnbmVkIHNob3J0IHVzOyB1bnNpZ25lZCBsb25nIHVsOyB1bnNpZ25lZCBpbnQgdWk7IGNoYXIgYzsgaW50IGk7IHNob3J0IHM7IGxvbmcgbDsgZmxvYXQgZjsgdW5zaWduZWQgY2hhciB1YzsgZG91YmxlIGQ7Cit7CisgICAgY2FsbDdpICh1bCwgdWksIGMsIGksIHMsIGwsIGYsIHVjLCBkLCB1cyk7Cit9CisKK2NhbGw3aSAodWwsIHVpLCBjLCBpLCBzLCBsLCBmLCB1YywgZCwgdXMpCit1bnNpZ25lZCBsb25nIHVsOyB1bnNpZ25lZCBpbnQgdWk7IGNoYXIgYzsgaW50IGk7IHNob3J0IHM7IGxvbmcgbDsgZmxvYXQgZjsgdW5zaWduZWQgY2hhciB1YzsgZG91YmxlIGQ7IHVuc2lnbmVkIHNob3J0IHVzOworeworICAgIGNhbGw3aiAodWksIGMsIGksIHMsIGwsIGYsIHVjLCBkLCB1cywgdWwpOworfQorCitjYWxsN2ogKHVpLCBjLCBpLCBzLCBsLCBmLCB1YywgZCwgdXMsIHVsKQordW5zaWduZWQgaW50IHVpOyBjaGFyIGM7IGludCBpOyBzaG9ydCBzOyBsb25nIGw7IGZsb2F0IGY7IHVuc2lnbmVkIGNoYXIgdWM7IGRvdWJsZSBkOyB1bnNpZ25lZCBzaG9ydCB1czsgdW5zaWduZWQgbG9uZyB1bDsKK3sKKyAgICBjYWxsN2sgKGMsIGksIHMsIGwsIGYsIHVjLCBkLCB1cywgdWwsIHVpKTsKK30KKworY2FsbDdrIChjLCBpLCBzLCBsLCBmLCB1YywgZCwgdXMsIHVsLCB1aSkKK2NoYXIgYzsgaW50IGk7IHNob3J0IHM7IGxvbmcgbDsgZmxvYXQgZjsgdW5zaWduZWQgY2hhciB1YzsgZG91YmxlIGQ7IHVuc2lnbmVkIHNob3J0IHVzOyB1bnNpZ25lZCBsb25nIHVsOyB1bnNpZ25lZCBpbnQgdWk7Cit7CisgIGMgPSAnYSc7IGkgPSA3OyBzID0gODsgbCA9IDc7IGYgPSAwLjM7IHVjID0gNDQ7IGQgPSAwLjQ0OyB1cyA9IDc3OworICB1bCA9IDQzOyB1aSA9IDMzOworfQorCisKKy8qICBUZXN0IHByaW50aW5nIG9mIHN0cnVjdHVyZXMgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byByZWN1cnNpdmUgZnVuY3Rpb25zLiAqLworCisKK3R5cGVkZWYgc3RydWN0IHMKK3sKKyAgc2hvcnQgczsKKyAgaW50IGk7CisgIGxvbmcgbDsKK30gU1ZBTDsJCisKK2hpdGJvdHRvbSAoKQoreworfQorCit2b2lkIHJlY3Vyc2UgKGEsIGRlcHRoKQorU1ZBTCBhOworaW50IGRlcHRoOworeworICBhLnMgPSBhLmkgPSBhLmwgPSAtLWRlcHRoOworICBpZiAoZGVwdGggPT0gMCkKKyAgICBoaXRib3R0b20gKCk7CisgIGVsc2UKKyAgICByZWN1cnNlIChhLCBkZXB0aCk7Cit9CisKK3Rlc3Rfc3RydWN0X2FyZ3MgKCkKK3sKKyAgU1ZBTCBzOyBzLnMgPSA1OyBzLmkgPSA1OyBzLmwgPSA1OworCisgIHJlY3Vyc2UgKHMsIDUpOworfQorCisvKiBPbiB2YXJpb3VzIG1hY2hpbmVzIChwYSwgMjlrLCBhbmQgcnMvNjAwMCwgYXQgbGVhc3QpLCBhIGZ1bmN0aW9uIHdoaWNoCisgICBjYWxscyBhbGxvY2EgbWF5IGRvIHRoaW5ncyBkaWZmZXJlbnRseSB3aXRoIHJlc3BlY3QgdG8gZnJhbWVzLiAgU28gZ2l2ZQorICAgaXQgYSB0cnkuICAqLworCitpbnQKK2xvY2FsdmFyc19hZnRlcl9hbGxvY2EgKGMsIHMsIGksIGwpCisgICAgIGNoYXIgYzsKKyAgICAgc2hvcnQgczsKKyAgICAgaW50IGk7CisgICAgIGxvbmcgbDsKK3sKKyNpZmRlZiBIQVZFX1NUQUNLX0FMTE9DQQorICAvKiBObyBuZWVkIHRvIHVzZSB0aGUgYWxsb2NhLmMgYWxsb2NhLW9uLXRvcC1vZi1tYWxsb2M7IGl0IGRvZXNuJ3QKKyAgICAgdGVzdCB3aGF0IHdlIGFyZSBsb29raW5nIGZvciwgc28gaWYgd2UgZG9uJ3QgaGF2ZSBhbiBhbGxvY2Egd2hpY2gKKyAgICAgYWxsb2NhdGVzIG9uIHRoZSBzdGFjaywganVzdCBkb24ndCBib3RoZXIgdG8gY2FsbCBhbGxvY2EgYXQgYWxsLiAgKi8KKworICBjaGFyICp6ID0gYWxsb2NhIChzICsgNTApOworI2VuZGlmCisgIGMgPSAnYSc7CisgIHMgPSA1OworICBpID0gNjsKKyAgbCA9IDc7Cit9CisKK3ZvaWQKK2NhbGxfYWZ0ZXJfYWxsb2NhX3N1YnIgKGMsIHMsIGksIGwsIHVjLCB1cywgdWksIHVsKQorY2hhciBjOyBpbnQgaTsgc2hvcnQgczsgbG9uZyBsOyB1bnNpZ25lZCBjaGFyIHVjOyB1bnNpZ25lZCBzaG9ydCB1czsgdW5zaWduZWQgbG9uZyB1bDsgdW5zaWduZWQgaW50IHVpOworeworICBjID0gJ2EnOworICBpID0gNzsgcyA9IDg7IGwgPSA3OyB1YyA9IDQ0OyB1cyA9IDc3OworICB1bCA9IDQzOyB1aSA9IDMzOworfQorCitpbnQKK2NhbGxfYWZ0ZXJfYWxsb2NhIChjLCBzLCBpLCBsKQorICAgICBjaGFyIGM7CisgICAgIHNob3J0IHM7CisgICAgIGludCBpOworICAgICBsb25nIGw7Cit7CisjaWZkZWYgSEFWRV9TVEFDS19BTExPQ0EKKyAgLyogTm8gbmVlZCB0byB1c2UgdGhlIGFsbG9jYS5jIGFsbG9jYS1vbi10b3Atb2YtbWFsbG9jOyBpdCBkb2Vzbid0CisgICAgIHRlc3Qgd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IsIHNvIGlmIHdlIGRvbid0IGhhdmUgYW4gYWxsb2NhIHdoaWNoCisgICAgIGFsbG9jYXRlcyBvbiB0aGUgc3RhY2ssIGp1c3QgZG9uJ3QgYm90aGVyIHRvIGNhbGwgYWxsb2NhIGF0IGFsbC4gICovCisKKyAgY2hhciAqeiA9IGFsbG9jYSAocyArIDUwKTsKKyNlbmRpZgorICBjYWxsX2FmdGVyX2FsbG9jYV9zdWJyIChjLCBzLCBpLCBsLCAnYicsIDExLCAxMiwgKHVuc2lnbmVkIGxvbmcpMTMpOworfQorCisMCisKKy8qIFRoZSBwb2ludCBiZWhpbmQgdGhpcyB0ZXN0IGlzIHRoZSBQQSB3aWxsIGNhbGwgdGhpcyBpbmRpcmVjdGx5CisgICB0aHJvdWdoIGR5bmNhbGwuICBVbmxpa2UgdGhlIGluZGlyZWN0IGNhbGxzIHRvIGNhbGwwYSwgdGhpcyB0ZXN0CisgICB3aWxsIHJlcXVpcmUgYSB0cmFtcG9saW5lIGJldHdlZW4gZHluY2FsbCBhbmQgdGhpcyBmdW5jdGlvbiBvbiB0aGUKKyAgIGNhbGwgcGF0aCwgdGhlbiBhbm90aGVyIHRyYW1wb2xpbmUgb24gYmV0d2VlbiB0aGlzIGZ1bmN0aW9uIGFuZCBtYWluCisgICBvbiB0aGUgcmV0dXJuIHBhdGguICAqLworZG91YmxlCitjYWxsX3dpdGhfdHJhbXBvbGluZXMgKGQxKQorZG91YmxlIGQxOworeworICByZXR1cm4gZDE7Cit9IC8qIEVuZCBvZiBjYWxsX3dpdGhfdHJhbXBvbGluZXMsIHRoaXMgY29tbWVudCBpcyBuZWVkZWQgYnkgZnVuY2FyZ3MuZXhwICovCisKKy8qIER1bW15IGZ1bmN0aW9ucyB3aGljaCB0aGUgdGVzdHN1aXRlIGNhbiB1c2UgdG8gcnVuIHRvLCBldGMuICAqLworCit2b2lkCittYXJrZXJfaW5kaXJlY3RfY2FsbCAoKSB7fQorCit2b2lkCittYXJrZXJfY2FsbF93aXRoX3RyYW1wb2xpbmVzICgpIHt9CisMCittYWluICgpCit7CisgIGludCAoKnBvaW50ZXJfdG9fY2FsbDBhKSAoKSA9IGNhbGwwYTsKKyAgZG91YmxlICgqcG9pbnRlcl90b19jYWxsX3dpdGhfdHJhbXBvbGluZXMpICgpID0gY2FsbF93aXRoX3RyYW1wb2xpbmVzOworCisjaWZkZWYgdXNlc3R1YnMKKyAgc2V0X2RlYnVnX3RyYXBzKCk7CisgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICAvKiBUZXN0IGNhbGxpbmcgd2l0aCBiYXNpYyBpbnRlZ2VyIHR5cGVzICovCisgIGNhbGwwYSAoYywgcywgaSwgbCk7CisgIGNhbGwwYiAocywgaSwgbCwgYyk7CisgIGNhbGwwYyAoaSwgbCwgYywgcyk7CisgIGNhbGwwZCAobCwgYywgcywgaSk7CisgIGNhbGwwZSAoYywgbCwgYywgaSwgYywgcywgYywgYyk7CisKKyAgLyogVGVzdCBjYWxsaW5nIHdpdGggdW5zaWduZWQgaW50ZWdlciB0eXBlcyAqLworICBjYWxsMWEgKHVjLCB1cywgdWksIHVsKTsKKyAgY2FsbDFiICh1cywgdWksIHVsLCB1Yyk7CisgIGNhbGwxYyAodWksIHVsLCB1YywgdXMpOworICBjYWxsMWQgKHVsLCB1YywgdXMsIHVpKTsKKyAgY2FsbDFlICh1YywgdWwsIHVjLCB1aSwgdWMsIHVzLCB1YywgdWMpOworCisgIC8qIFRlc3QgY2FsbGluZyB3aXRoIGludGVncmFsIHR5cGVzIG1peGVkIHdpdGggZmxvYXRpbmcgcG9pbnQgdHlwZXMgKi8KKyAgY2FsbDJhIChjLCBmLCBzLCBkLCBpLCBmLCBsLCBkKTsKKyAgY2FsbDJiIChmLCBzLCBkLCBpLCBmLCBsLCBkLCBjKTsKKyAgY2FsbDJjIChzLCBkLCBpLCBmLCBsLCBkLCBjLCBmKTsKKyAgY2FsbDJkIChkLCBpLCBmLCBsLCBkLCBjLCBmLCBzKTsKKyAgY2FsbDJlIChpLCBmLCBsLCBkLCBjLCBmLCBzLCBkKTsKKyAgY2FsbDJmIChmLCBsLCBkLCBjLCBmLCBzLCBkLCBpKTsKKyAgY2FsbDJnIChsLCBkLCBjLCBmLCBzLCBkLCBpLCBmKTsKKyAgY2FsbDJoIChkLCBjLCBmLCBzLCBkLCBpLCBmLCBsKTsKKyAgY2FsbDJpIChjLCBmLCBjLCBjLCBkLCBjLCBjLCBjLCBmLCBzLCBjLCBkKTs7CisKKyAgLyogVGVzdCBkZXJlZmVyZW5jaW5nIHBvaW50ZXJzIHRvIHZhcmlvdXMgaW50ZWdyYWwgYW5kIGZsb2F0aW5nIHR5cGVzICovCisKKyAgY2FsbDNhIChjcCwgc3AsIGlwLCBscCk7CisgIGNhbGwzYiAodWNwLCB1c3AsIHVpcCwgdWxwKTsKKyAgY2FsbDNjIChmcCwgZHApOworCisgIC8qIFRlc3QgZGVyZWZlcmVuY2luZyBwb2ludGVycyB0byBzdHJ1Y3RzIGFuZCB1bmlvbnMgKi8KKworICBjYWxsNGEgKHN0cCk7CisgIHVuLnUxID0gMTsKKyAgY2FsbDRiICh1bnApOworCisgIC8qIFRlc3QgY2FsbGluZyB3aXRoIHN0cnVjdHVyZXMgYW5kIHVuaW9ucy4gKi8KKworICBjYWxsNWEgKHN0KTsKKyAgdW4udTEgPSAyOworICBjYWxsNWIgKHVuKTsKKworICAvKiBUZXN0IHNodWZmbGluZyBvZiBhcmdzICovCisKKyAgY2FsbDZhIChjLCBzLCBpLCBsLCBmLCBkLCB1YywgdXMsIHVpLCB1bCk7CisgIGNhbGw3YSAoYywgaSwgcywgbCwgZiwgdWMsIGQsIHVzLCB1bCwgdWkpOworICAKKyAgLyogVGVzdCBwYXNzaW5nIHN0cnVjdHVyZXMgcmVjdXJzaXZlbHkuICovCisKKyAgdGVzdF9zdHJ1Y3RfYXJncyAoKTsKKworICBsb2NhbHZhcnNfYWZ0ZXJfYWxsb2NhIChjLCBzLCBpLCBsKTsKKworICBjYWxsX2FmdGVyX2FsbG9jYSAoYywgcywgaSwgbCk7CisKKyAgLyogVGhpcyBpcyBmb3IgbG9jYWx2YXJzX2luX2luZGlyZWN0X2NhbGwuICAqLworICBtYXJrZXJfaW5kaXJlY3RfY2FsbCAoKTsKKyAgLyogVGhlIGNvbW1lbnQgb24gdGhlIGZvbGxvd2luZyB0d28gbGluZXMgaXMgdXNlZCBieSBmdW5jYXJncy5leHAsCisgICAgIGRvbid0IGNoYW5nZSBpdC4gICovCisgICgqcG9pbnRlcl90b19jYWxsMGEpIChjLCBzLCBpLCBsKTsJLyogRmlyc3Qgc3RlcCBpbnRvIGNhbGwwYS4gICovCisgICgqcG9pbnRlcl90b19jYWxsMGEpIChjLCBzLCBpLCBsKTsJLyogU2Vjb25kIHN0ZXAgaW50byBjYWxsMGEuICAqLworICBtYXJrZXJfY2FsbF93aXRoX3RyYW1wb2xpbmVzICgpOworICAoKnBvaW50ZXJfdG9fY2FsbF93aXRoX3RyYW1wb2xpbmVzKSAoZCk7IC8qIFRlc3QgbXVsdGlwbGUgdHJhbXBvbGluZXMuICAqLworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9mdW5jYXJncy5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Z1bmNhcmdzLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjI0NWRjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9mdW5jYXJncy5leHAKQEAgLTAsMCArMSwxMDE3IEBACisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAoZm5mQGN5Z251cy5jb20pCisKK2lmICR0cmFjZWxldmVsIHsKKyAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAiZnVuY2FyZ3MiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisjIENyZWF0ZSBhbmQgc291cmNlIHRoZSBmaWxlIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyCisjIHVzZWQgdG8gY29tcGlsZSB0aGUgdGVzdCBjYXNlLgoraWYgW2dldF9jb21waWxlcl9pbmZvICR7YmluZmlsZX1dIHsKKyAgICByZXR1cm4gLTE7Cit9CisKKyMKKyMgTG9jYXRlIGFjdHVhbCBhcmdzOyBpbnRlZ3JhbCB0eXBlcy4KKyMKKworcHJvYyBpbnRlZ3JhbF9hcmdzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBkZXRfZmlsZQorICAgIGdsb2JhbCBnY2NfY29tcGlsZWQKKworICAgIGRlbGV0ZV9icmVha3BvaW50cworCisgICAgZ2RiX2JyZWFrcG9pbnQgY2FsbDBhCisgICAgZ2RiX2JyZWFrcG9pbnQgY2FsbDBiCisgICAgZ2RiX2JyZWFrcG9pbnQgY2FsbDBjCisgICAgZ2RiX2JyZWFrcG9pbnQgY2FsbDBkCisgICAgZ2RiX2JyZWFrcG9pbnQgY2FsbDBlCisKKyAgICAjIFJ1bjsgc2hvdWxkIHN0b3AgYXQgY2FsbDBhIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgICMgVGhlIGEyOWsgZmFpbHMgYWxsIG9mIHRoZXNlIHRlc3RzLCBwZXJoYXBzIGJlY2F1c2UgdGhlIHByb2xvZ3VlCisgICAgIyBjb2RlIGlzIGJyb2tlbi4KKyAgICBzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKKyAgICBpZiB7ISRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAicnM2MDAwLSotKiIgfQorICAgIGdkYl9ydW5fY21kCisgICAgZ2RiX2V4cGVjdCB7CisJIC1yZSAiLiogY2FsbDBhIFxcKGM9OTcgJ2EnLCBzPTEsIGk9MiwgbD0zXFwpIC4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJydW4gdG8gY2FsbDBhIgorCX0KKwkgLXJlICIkZ2RiX3Byb21wdCAkIiAgeyBmYWlsICJydW4gdG8gY2FsbDBhIiA7IGdkYl9zdXBwcmVzc190ZXN0cyB9CisJIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcnVuIHRvIGNhbGwwYSIgOyBnZGJfc3VwcHJlc3NfdGVzdHMgfQorICAgIH0KKworICAgICMgUHJpbnQgZWFjaCBhcmcgYXMgYSBkb3VibGUgY2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBwcmludAorICAgICMgdGhlbSBoZXJlIGFzIHdlbGwgYXMgd2l0aCBiYWNrdHJhY2UuCisgICAgZ2RiX3Rlc3QgInByaW50IGMiICIuKiA9IDk3ICdhJyIgInByaW50IGMgYWZ0ZXIgcnVuIHRvIGNhbGwwYSIgCisgICAgZ2RiX3Rlc3QgInByaW50IHMiICIuKiA9IDEiICJwcmludCBzIGFmdGVyIHJ1biB0byBjYWxsMGEiCisgICAgZ2RiX3Rlc3QgInByaW50IGkiICIuKiA9IDIiICJwcmludCBpIGFmdGVyIHJ1biB0byBjYWxsMGEiCisgICAgZ2RiX3Rlc3QgInByaW50IGwgIiAiLiogPSAzIiAicHJpbnQgbCBhZnRlciBydW4gdG8gY2FsbDBhIgorCisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDBiIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgIGlmIFtnZGJfdGVzdCAiY29udCIgIi4qIGNhbGwwYiBcXChzPTEsIGk9MiwgbD0zLCBjPTk3ICdhJ1xcKSAuKiIgImNvbnRpbnVlIHRvIGNhbGwwYiJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorCisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDBjIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgIGlmIFtnZGJfdGVzdCAiY29udCIgIi4qIGNhbGwwYyBcXChpPTIsIGw9MywgYz05NyAnYScsIHM9MVxcKSAuKiIgImNvbnRpbnVlIHRvIGNhbGwwYyJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorCisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDBkIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgIGlmIFtnZGJfdGVzdCAiY29udCIgIi4qIGNhbGwwZCBcXChsPTMsIGM9OTcgJ2EnLCBzPTEsIGk9MlxcKSAuKiIgImNvbnRpbnVlIHRvIGNhbGwwZCI7XSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzOworICAgIH0KKworICAgICMgQ29udGludWU7IHNob3VsZCBzdG9wIGF0IGNhbGwwZSBhbmQgcHJpbnQgYWN0dWFsIGFyZ3VtZW50cy4KKyAgICBpZiBbZ2RiX3Rlc3QgImNvbnQiICIuKiBjYWxsMGUgXFwoYzE9OTcgJ2EnLCBsPTMsIGMyPTk3ICdhJywgaT0yLCBjMz05NyAnYScsIHM9MSwgYzQ9OTcgJ2EnLCBjNT05NyAnYSdcXCkgLioiICJjb250aW51ZSB0byBjYWxsMGUiIF0geworCWdkYl9zdXBwcmVzc190ZXN0czsKKyAgICB9CisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7Cit9CisKKyMKKyMgTG9jYXRlIGFjdHVhbCBhcmdzOyB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcy4KKyMKKworcHJvYyB1bnNpZ25lZF9pbnRlZ3JhbF9hcmdzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBkZXRfZmlsZQorICAgIGdsb2JhbCBnY2NfY29tcGlsZWQKKworICAgIGRlbGV0ZV9icmVha3BvaW50cworCisgICAgZ2RiX2JyZWFrcG9pbnQgY2FsbDFhOworICAgIGdkYl9icmVha3BvaW50IGNhbGwxYjsKKyAgICBnZGJfYnJlYWtwb2ludCBjYWxsMWM7CisgICAgZ2RiX2JyZWFrcG9pbnQgY2FsbDFkOworICAgIGdkYl9icmVha3BvaW50IGNhbGwxZTsKKworICAgICMgUnVuOyBzaG91bGQgc3RvcCBhdCBjYWxsMWEgYW5kIHByaW50IGFjdHVhbCBhcmd1bWVudHMuCisgICAgIyBUaGUgYTI5ayBmYWlscyBhbGwgb2YgdGhlc2UgdGVzdHMsIHBlcmhhcHMgYmVjYXVzZSB0aGUgcHJvbG9ndWUKKyAgICAjIGNvZGUgaXMgYnJva2VuLgorICAgIHNldHVwX3hmYWlsICJhMjlrLSotdWRpIgorICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CisgICAgZ2RiX3J1bl9jbWQKKyAgICBnZGJfZXhwZWN0IHsKKwkgLXJlICIuKiBjYWxsMWEgXFwodWM9OTggJ2InLCB1cz02LCB1aT03LCB1bD04XFwpIC4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJydW4gdG8gY2FsbDFhIgorCX0KKwkgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgInJ1biB0byBjYWxsMWEiIDsgZ2RiX3N1cHByZXNzX3Rlc3RzOyB9CisJIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcnVuIHRvIGNhbGwxYSIgOyBnZGJfc3VwcHJlc3NfdGVzdHM7IH0KKyAgICB9CisKKyAgICAjIFByaW50IGVhY2ggYXJnIGFzIGEgZG91YmxlIGNoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gcHJpbnQKKyAgICAjIHRoZW0gaGVyZSBhcyB3ZWxsIGFzIHdpdGggYmFja3RyYWNlLgorICAgIGdkYl90ZXN0ICJwcmludCB1YyIgIi4qID0gOTggJ2InIgorICAgIGdkYl90ZXN0ICJwcmludCB1cyIgIi4qID0gNiIKKyAgICBnZGJfdGVzdCAicHJpbnQgdWkiICIuKiA9IDciCisgICAgZ2RiX3Rlc3QgInByaW50IHVsIiAiLiogPSA4IgorICAgIAorICAgICMgQ29udGludWU7IHNob3VsZCBzdG9wIGF0IGNhbGwxYiBhbmQgcHJpbnQgYWN0dWFsIGFyZ3VtZW50cy4KKyAgICBpZiBbZ2RiX3Rlc3QgImNvbnQiICIuKiBjYWxsMWIgXFwodXM9NiwgdWk9NywgdWw9OCwgdWM9OTggJ2InXFwpIC4qIiAiY29udGludWUgdG8gY2FsbDFiIl0geworCWdkYl9zdXBwcmVzc190ZXN0czsgCisgICAgfQorCisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDFjIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgIGlmIFtnZGJfdGVzdCAiY29udCIgIi4qIGNhbGwxYyBcXCh1aT03LCB1bD04LCB1Yz05OCAnYicsIHVzPTZcXCkgLioiICJjb250aW51ZSB0byBjYWxsMWMiXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzOyAKKyAgICB9CisKKyAgICAjIENvbnRpbnVlOyBzaG91bGQgc3RvcCBhdCBjYWxsMWQgYW5kIHByaW50IGFjdHVhbCBhcmd1bWVudHMuCisgICAgaWYgW2dkYl90ZXN0ICJjb250IiAiLiogY2FsbDFkIFxcKHVsPTgsIHVjPTk4ICdiJywgdXM9NiwgdWk9N1xcKSAuKiIgImNvbnRpbnVlIHRvIGNhbGwxZCJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorCisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDFlIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgIGlmIFtnZGJfdGVzdCAiY29udCIgIi4qIGNhbGwxZSBcXCh1YzE9OTggJ2InLCB1bD04LCB1YzI9OTggJ2InLCB1aT03LCB1YzM9OTggJ2InLCB1cz02LCB1YzQ9OTggJ2InLCB1YzU9OTggJ2InXFwpIC4qIiAiY29udGludWUgdG8gY2FsbDFlIl0geworCWdkYl9zdXBwcmVzc190ZXN0czsKKyAgICB9CisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7Cit9CisKKyMKKyMgTG9jYXRlIGFjdHVhbCBhcmdzOyBpbnRlZ3JhbHMgbWl4ZWQgd2l0aCBmbG9hdGluZyBwb2ludC4KKyMKKworcHJvYyBmbG9hdF9hbmRfaW50ZWdyYWxfYXJncyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgZGV0X2ZpbGUKKyAgICBnbG9iYWwgZ2NjX2NvbXBpbGVkCisKKyAgICBkZWxldGVfYnJlYWtwb2ludHMKKworICAgIGdkYl9icmVha3BvaW50IGNhbGwyYQorICAgIGdkYl9icmVha3BvaW50IGNhbGwyYgorICAgIGdkYl9icmVha3BvaW50IGNhbGwyYworICAgIGdkYl9icmVha3BvaW50IGNhbGwyZAorICAgIGdkYl9icmVha3BvaW50IGNhbGwyZQorICAgIGdkYl9icmVha3BvaW50IGNhbGwyZgorICAgIGdkYl9icmVha3BvaW50IGNhbGwyZworICAgIGdkYl9icmVha3BvaW50IGNhbGwyaAorCisgICAgIyBSdW47IHNob3VsZCBzdG9wIGF0IGNhbGwyYSBhbmQgcHJpbnQgYWN0dWFsIGFyZ3VtZW50cy4KKworICAgIHNldHVwX3hmYWlsICJpOTYwLSotKiIgMTgxMworICAgICMgVGhlIGEyOWsgZmFpbHMgYWxsIG9mIHRoZXNlIHRlc3RzLCBwZXJoYXBzIGJlY2F1c2UgdGhlIHByb2xvZ3VlCisgICAgIyBjb2RlIGlzIGJyb2tlbi4KKyAgICBzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKKyAgICBpZiB7ISRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAicnM2MDAwLSotKiIgIm1pcHMtc2dpLWlyaXg1KiIgfQorICAgIGdkYl9ydW5fY21kCisgICAgZ2RiX2V4cGVjdCB7CisJIC1yZSAiLiogY2FsbDJhIFxcKGM9OTcgJ2EnLCBmMT00LCBzPTEsIGQxPTUsIGk9MiwgZjI9NCwgbD0zLCBkMj01XFwpIC4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJydW4gdG8gY2FsbDJhIiB9CisJIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJydW4gdG8gY2FsbDJhIiA7IGdkYl9zdXBwcmVzc190ZXN0czsgfQorCSB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHJ1biB0byBjYWxsMmEiIDsgZ2RiX3N1cHByZXNzX3Rlc3RzOyB9CisgICAgfQorCisgICAgIyBQcmludCBlYWNoIGFyZyBhcyBhIGRvdWJsZSBjaGVjayB0byBzZWUgaWYgd2UgY2FuIHByaW50CisgICAgZ2RiX3Rlc3QgInByaW50IGMiICIuKiA9IDk3ICdhJyIgInByaW50IGMgYWZ0ZXIgcnVuIHRvIGNhbGwyYSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZjEiICIuKiA9IDQiICJwcmludCBmMSBhZnRlciBydW4gdG8gY2FsbDJhIgorICAgIGdkYl90ZXN0ICJwcmludCBzIiAiLiogPSAxIiAicHJpbnQgcyBhZnRlciBydW4gdG8gY2FsbDJhIgorICAgIGdkYl90ZXN0ICJwcmludCBkMSIgIi4qID0gNSIgInByaW50IGQxIGFmdGVyIHJ1biB0byBjYWxsMmEiCisgICAgZ2RiX3Rlc3QgInByaW50IGkiICIuKiA9IDIiICJwcmludCBpIGFmdGVyIHJ1biB0byBjYWxsMmEiCisgICAgZ2RiX3Rlc3QgInByaW50IGYyIiAiLiogPSA0IiAicHJpbnQgZjIgYWZ0ZXIgcnVuIHRvIGNhbGwyYSIKKyAgICBnZGJfdGVzdCAicHJpbnQgbCIgIi4qID0gMyIgInByaW50IGwgYWZ0ZXIgcnVuIHRvIGNhbGwyYSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZDIiICIuKiA9IDUiICJwcmludCBkMiBhZnRlciBydW4gdG8gY2FsbDJhIgorCisgICAgc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiCisgICAgaWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIm1pcHMtc2dpLWlyaXgqIiB9CisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDJiIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgIGlmIFtnZGJfdGVzdCAiY29udCIgIi4qIGNhbGwyYiBcXChmMT00LCBzPTEsIGQxPTUsIGk9MiwgZjI9NCwgbD0zLCBkMj01LCBjPTk3ICdhJ1xcKSAuKiIgImNvbnRpbnVlIHRvIGNhbGwyYiJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorCisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDJjIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgIGlmIFtnZGJfdGVzdCAiY29udCIgIi4qIGNhbGwyYyBcXChzPTEsIGQxPTUsIGk9MiwgZjI9NCwgbD0zLCBkMj01LCBjPTk3ICdhJywgZjE9NFxcKSAuKiIgImNvbnRpbnVlIHRvIGNhbGwyYyJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorCisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDJkIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgIGlmIFtnZGJfdGVzdCAiY29udCIgIi4qIGNhbGwyZCBcXChkMT01LCBpPTIsIGYyPTQsIGw9MywgZDI9NSwgYz05NyAnYScsIGYxPTQsIHM9MVxcKSAuKiIgImNvbnRpbnVlIHRvIGNhbGwyZCJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorCisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDJlIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgIGlmIFtnZGJfdGVzdCAiY29udCIgIi4qIGNhbGwyZSBcXChpPTIsIGYyPTQsIGw9MywgZDI9NSwgYz05NyAnYScsIGYxPTQsIHM9MSwgZDE9NVxcKSAuKiIgImNvbnRpbnVlIHRvIGNhbGwyZSJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorCisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDJmIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgIGlmIFtnZGJfdGVzdCAiY29udCIgIi4qIGNhbGwyZiBcXChmMj00LCBsPTMsIGQyPTUsIGM9OTcgJ2EnLCBmMT00LCBzPTEsIGQxPTUsIGk9MlxcKSAuKiIgImNvbnRpbnVlIHRvIGNhbGwyZiJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorCisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDJnIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgIGlmIFtnZGJfdGVzdCAiY29udCIgIi4qIGNhbGwyZyBcXChsPTMsIGQyPTUsIGM9OTcgJ2EnLCBmMT00LCBzPTEsIGQxPTUsIGk9MiwgZjI9NFxcKSAuKiIgImNvbnRpbnVlIHRvIGNhbGwyZyJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorCisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDJoIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgIGlmIFtnZGJfdGVzdCAiY29udCIgIi4qIGNhbGwyaCBcXChkMj01LCBjPTk3ICdhJywgZjE9NCwgcz0xLCBkMT01LCBpPTIsIGYyPTQsIGw9M1xcKSAuKiIgImNvbnRpbnVlIHRvIGNhbGwyaCJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorCisgICAgIyBtb25pdG9yIG9ubHkgYWxsb3dzIDggYnJlYWtwb2ludHM7IHc4OWsgYm9hcmQgYWxsb3dzIDEwLCBzbworICAgICMgYnJlYWsgdGhlbSB1cCBpbnRvIHR3byBncm91cHMuCisgICAgZGVsZXRlX2JyZWFrcG9pbnRzCisgICAgZ2RiX2JyZWFrcG9pbnQgY2FsbDJpCisKKyAgICAjIENvbnRpbnVlOyBzaG91bGQgc3RvcCBhdCBjYWxsMmkgYW5kIHByaW50IGFjdHVhbCBhcmd1bWVudHMuCisgICAgaWYgW2dkYl90ZXN0ICJjb250IiAiLiogY2FsbDJpIFxcKGMxPTk3ICdhJywgZjE9NCwgYzI9OTcgJ2EnLCBjMz05NyAnYScsIGQxPTUsIGM0PTk3ICdhJywgYzU9OTcgJ2EnLCBjNj05NyAnYScsIGYyPTQsIHM9MSwgYzc9OTcgJ2EnLCBkMj01XFwpIC4qIiAiY29udGludWUgdG8gY2FsbDJpIl0geworCWdkYl9zdXBwcmVzc190ZXN0czsKKyAgICB9CisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7Cit9CisKKyMKKyMgTG9jYXRlIGFjdHVhbCBhcmdzOyBkZXJlZmVyZW5jZSBwb2ludGVycyB0byBpbnRzIGFuZCBmbG9hdHMuCisjCisKK3Byb2MgcG9pbnRlcl9hcmdzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGV0X2ZpbGUKKworICAgIGRlbGV0ZV9icmVha3BvaW50cworCisgICAgZ2RiX2JyZWFrcG9pbnQgY2FsbDNhCisgICAgZ2RiX2JyZWFrcG9pbnQgY2FsbDNiCisgICAgZ2RiX2JyZWFrcG9pbnQgY2FsbDNjCisKKyAgICAjIFJ1bjsgc2hvdWxkIHN0b3AgYXQgY2FsbDNhIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgICMgVHJ5IGRlcmVmZXJlbmNpbmcgdGhlIGFyZ3VtZW50cy4KKworICAgICMgVGhlIGEyOWsgZmFpbHMgYWxsIG9mIHRoZXNlIHRlc3RzLCBwZXJoYXBzIGJlY2F1c2UgdGhlIHByb2xvZ3VlCisgICAgIyBjb2RlIGlzIGJyb2tlbi4KKyAgICBzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKKyAgICBnZGJfcnVuX2NtZAorICAgIGdkYl9leHBlY3QgeworCSAtcmUgIi4qIGNhbGwzYSBcXChjcD0kaGV4IFwiYVwiLCBzcD0kaGV4LCBpcD0kaGV4LCBscD0kaGV4XFwpIC4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJydW4gdG8gY2FsbDNhIiB9CisJIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJydW4gdG8gY2FsbDNhIiA7IGdkYl9zdXBwcmVzc190ZXN0czsgfQorCSB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHJ1biB0byBjYWxsM2EiIDsgZ2RiX3N1cHByZXNzX3Rlc3RzOyB9CisgICAgfQorCisgICAgZ2RiX3Rlc3QgInByaW50ICpjcCIgIi4qID0gOTcgJ2EnIgorICAgIGdkYl90ZXN0ICJwcmludCAqc3AiICIuKiA9IDEiCisgICAgZ2RiX3Rlc3QgInByaW50ICppcCIgIi4qID0gMiIKKyAgICBnZGJfdGVzdCAicHJpbnQgKmxwIiAiLiogPSAzIgorCisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDNiIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgICMgVHJ5IGRlcmVmZXJlbmNpbmcgdGhlIGFyZ3VtZW50cy4KKyAgICBpZiBbZ2RiX3Rlc3QgImNvbnQiICIuKiBjYWxsM2IgXFwodWNwPSRoZXggXCJiXCIsIHVzcD0kaGV4LCB1aXA9JGhleCwgdWxwPSRoZXhcXCkgLioiICJjb250aW51ZSB0byBjYWxsM2IiXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzOworICAgIH0KKworICAgIGdkYl90ZXN0ICJwcmludCAqdWNwIiAiLiogPSA5OCAnYiciCisgICAgZ2RiX3Rlc3QgInByaW50ICp1c3AiICIuKiA9IDYiCisgICAgZ2RiX3Rlc3QgInByaW50ICp1aXAiICIuKiA9IDciCisgICAgZ2RiX3Rlc3QgInByaW50ICp1bHAiICIuKiA9IDgiCisKKyAgICAjIENvbnRpbnVlOyBzaG91bGQgc3RvcCBhdCBjYWxsM2MgYW5kIHByaW50IGFjdHVhbCBhcmd1bWVudHMuCisgICAgIyBUcnkgZGVyZWZlcmVuY2luZyB0aGUgYXJndW1lbnRzLgorICAgIGlmIFtnZGJfdGVzdCAiY29udCIgIi4qIGNhbGwzYyBcXChmcD0kaGV4LCBkcD0kaGV4XFwpIC4qIiAiY29udGludWUgdG8gY2FsbDNjIl0geworCWdkYl9zdXBwcmVzc190ZXN0czsKKyAgICB9CisKKyAgICBnZGJfdGVzdCAicHJpbnQgKmZwIiAiLiogPSA0IgorICAgIGdkYl90ZXN0ICJwcmludCAqZHAiICIuKiA9IDUiCisKKyMgICAgcGFzcyAibG9jYXRlIGFjdHVhbCBhcmdzLCBwb2ludGVyIHR5cGVzIgorICAgIGdkYl9zdG9wX3N1cHByZXNzaW5nX3Rlc3RzOworfQorCisjCisjIExvY2F0ZSBhY3R1YWwgYXJnczsgc3RydWN0dXJlcyBhbmQgdW5pb25zIHBhc3NlZCBieSByZWZlcmVuY2UuCisjCisKK3Byb2Mgc3RydWN0c19ieV9yZWZlcmVuY2Uge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZXRfZmlsZQorICAgIGdsb2JhbCB0YXJnZXRfc2l6ZW9mX2ludAorICAgIGdsb2JhbCB0YXJnZXRfc2l6ZW9mX2xvbmcKKyAgICBnbG9iYWwgdGFyZ2V0X2JpZ2VuZGlhbl9wCisKKyAgICBkZWxldGVfYnJlYWtwb2ludHMKKworICAgIGdkYl9icmVha3BvaW50IGNhbGw0YQorICAgIGdkYl9icmVha3BvaW50IGNhbGw0YgorCisgICAgIyBSdW47IHNob3VsZCBzdG9wIGF0IGNhbGw0YSBhbmQgcHJpbnQgYWN0dWFsIGFyZ3VtZW50cy4KKyAgICAjIFRyeSBkZXJlZmVyZW5jaW5nIHRoZSBhcmd1bWVudHMuCisKKyAgICAjIFRoZSBhMjlrIGZhaWxzIGFsbCBvZiB0aGVzZSB0ZXN0cywgcGVyaGFwcyBiZWNhdXNlIHRoZSBwcm9sb2d1ZQorICAgICMgY29kZSBpcyBicm9rZW4uCisgICAgc2V0dXBfeGZhaWwgImEyOWstKi11ZGkiCisgICAgZ2RiX3J1bl9jbWQKKyAgICBnZGJfZXhwZWN0IHsKKwkgLXJlICIuKiBjYWxsNGEgXFwoc3RwPSRoZXhcXCkgLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInJ1biB0byBjYWxsNGEiCisJfQorCSAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicnVuIHRvIGNhbGw0YSIgOyBnZGJfc3VwcHJlc3NfdGVzdHM7IH0KKwkgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBydW4gdG8gY2FsbDRhIiA7IGdkYl9zdXBwcmVzc190ZXN0czsgfQorICAgIH0KKworICAgIGdkYl90ZXN0ICJwcmludCAqc3RwIiAiLiogPSBce3MxID0gMTAxLCBzMiA9IDEwMlx9IgorCisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDRiIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorCisgICAgZ2RiX3Rlc3QgImNvbnQiICIuKiBjYWxsNGIgXFwodW5wPSRoZXhcXCkgLioiICJjb250aW51ZSB0byBjYWxsNGIiCisKKyAgICAjIFRyeSBkZXJlZmVyZW5jaW5nIHRoZSBhcmd1bWVudHMuCisgICAgaWYgeyAkdGFyZ2V0X3NpemVvZl9sb25nID09ICR0YXJnZXRfc2l6ZW9mX2ludCB9IHsKKwlnZGJfdGVzdCAicHJpbnQgKnVucCIgIi4qID0gXHt1MSA9IDEsIHUyID0gMVx9IiBcCisJCSJwcmludCAqdW5wIChzaXplb2YgbG9uZyA9PSBzaXplb2YgaW50KSIKKyAgICB9IGVsc2VpZiB7ICEgJHRhcmdldF9iaWdlbmRpYW5fcCB9IHsKKwlnZGJfdGVzdCAicHJpbnQgKnVucCIgIi4qID0gXHt1MSA9IDEsIHUyID0gMVx9IiBcCisJCSJwcmludCAqdW5wIChsaXR0bGUtZW5kaWFuLCBzaXplb2YgbG9uZyAhPSBzaXplb2YgaW50KSIKKyAgICB9IGVsc2VpZiB7ICR0YXJnZXRfc2l6ZW9mX2xvbmcgPT0gOCAmJiAkdGFyZ2V0X3NpemVvZl9pbnQgPT0gNCB9IHsKKwlnZGJfdGVzdCAicHJpbnQgKnVucCIgIi4qID0gXHt1MSA9IDEsIHUyID0gNDI5NDk2NzI5Nlx9IiBcCisJCSJwcmludCAqdW5wIChiaWctZW5kaWFuLCBzaXplb2YgbG9uZyA9PSA4LCBzaXplb2YgaW50ID0gNCkiCisgICAgfSBlbHNlaWYgeyAkdGFyZ2V0X3NpemVvZl9sb25nID09IDQgJiYgJHRhcmdldF9zaXplb2ZfaW50ID09IDIgfSB7CisJZ2RiX3Rlc3QgInByaW50ICp1bnAiICIuKiA9IFx7dTEgPSAxLCB1MiA9IDY1NTM2XH0iIFwKKwkJInByaW50ICp1bnAgKGJpZy1lbmRpYW4sIHNpemVvZiBsb25nID09IDQsIHNpemVvZiBpbnQgPSAyKSIKKyAgICB9IGVsc2UgeworCWZhaWwgInByaW50ICp1bnAgKHVua25vd24gY2FzZSkiCisgICAgfQorCisgICAgcGFzcyAibG9jYXRlIGFjdHVhbCBhcmdzLCBzdHJ1Y3RzL3VuaW9ucyBwYXNzZWQgYnkgcmVmZXJlbmNlIgorICAgIGdkYl9zdG9wX3N1cHByZXNzaW5nX3Rlc3RzOworfQorCisjCisjIExvY2F0ZSBhY3R1YWwgYXJnczsgc3RydWN0dXJlcyBhbmQgdW5pb25zIHBhc3NlZCBieSB2YWx1ZS4KKyMKKworcHJvYyBzdHJ1Y3RzX2J5X3ZhbHVlIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGV0X2ZpbGUKKyAgICBnbG9iYWwgdGFyZ2V0X3NpemVvZl9pbnQKKyAgICBnbG9iYWwgdGFyZ2V0X3NpemVvZl9sb25nCisgICAgZ2xvYmFsIHRhcmdldF9iaWdlbmRpYW5fcAorCisgICAgZGVsZXRlX2JyZWFrcG9pbnRzCisKKyAgICBnZGJfYnJlYWtwb2ludCBjYWxsNWEKKyAgICBnZGJfYnJlYWtwb2ludCBjYWxsNWIKKworICAgICMgUnVuOyBzaG91bGQgc3RvcCBhdCBjYWxsNWEgYW5kIHByaW50IGFjdHVhbCBhcmd1bWVudHMuCisgICAgIyBUcnkgZGVyZWZlcmVuY2luZyB0aGUgYXJndW1lbnRzLgorCisgICAgIyBUaGUgYTI5ayBmYWlscyBhbGwgb2YgdGhlc2UgdGVzdHMsIHBlcmhhcHMgYmVjYXVzZSB0aGUgcHJvbG9ndWUKKyAgICAjIGNvZGUgaXMgYnJva2VuLgorICAgIHNldHVwX3hmYWlsICJhMjlrLSotdWRpIgorICAgIGdkYl9ydW5fY21kCisgICAgZ2RiX2V4cGVjdCB7CisJIC1yZSAiLiogY2FsbDVhIFxcKHN0PVx7czEgPSAxMDEsIHMyID0gMTAyXH1cXCkgLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInJ1biB0byBjYWxsNWEiCisJfQorCSAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicnVuIHRvIGNhbGw1YSIgOyBnZGJfc3VwcHJlc3NfdGVzdHM7IH0KKwkgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBydW4gdG8gY2FsbDVhIiA7IGdkYl9zdXBwcmVzc190ZXN0czsgfQorICAgIH0KKworICAgIGdkYl90ZXN0ICJwcmludCBzdCIgIi4qID0gXHtzMSA9IDEwMSwgczIgPSAxMDJcfSIKKworICAgICMgQ29udGludWU7IHNob3VsZCBzdG9wIGF0IGNhbGw1YiBhbmQgcHJpbnQgYWN0dWFsIGFyZ3VtZW50cy4KKyAgICBpZiB7ICR0YXJnZXRfc2l6ZW9mX2xvbmcgPT0gJHRhcmdldF9zaXplb2ZfaW50IH0geworCWdkYl90ZXN0ICJjb250IiAiLiogY2FsbDViIFxcKHVuPVx7dTEgPSAyLCB1MiA9IDJcfVxcKSAuKiIgXAorCQkiY29udGludWUgdG8gY2FsbDViIChzaXplb2YgbG9uZyA9PSBzaXplb2YgaW50KSIKKyAgICB9IGVsc2VpZiB7ICEgJHRhcmdldF9iaWdlbmRpYW5fcCB9IHsKKwlnZGJfdGVzdCAiY29udCIgIi4qIGNhbGw1YiBcXCh1bj1ce3UxID0gMiwgdTIgPSAyXH1cXCkgLioiIFwKKwkJImNvbnRpbnVlIHRvIGNhbGw1YiAobGl0dGxlLWVuZGlhbiwgc2l6ZW9mIGxvbmcgIT0gc2l6ZW9mIGludCkiCisgICAgfSBlbHNlaWYgeyAkdGFyZ2V0X3NpemVvZl9sb25nID09IDggJiYgJHRhcmdldF9zaXplb2ZfaW50ID09IDQgfSB7CisJZ2RiX3Rlc3QgImNvbnQiICIuKiBjYWxsNWIgXFwodW49XHt1MSA9IDIsIHUyID0gODU4OTkzNDU5Mlx9XFwpIC4qIiBcCisJCSJjb250aW51ZSB0byBjYWxsNWIgKGJpZy1lbmRpYW4sIHNpemVvZiBsb25nID09IDgsIHNpemVvZiBpbnQgPSA0KSIKKyAgICB9IGVsc2VpZiB7ICR0YXJnZXRfc2l6ZW9mX2xvbmcgPT0gNCAmJiAkdGFyZ2V0X3NpemVvZl9pbnQgPT0gMiB9IHsKKwlnZGJfdGVzdCAiY29udCIgIi4qIGNhbGw1YiBcXCh1bj1ce3UxID0gMiwgdTIgPSAxMzEwNzJcfVxcKSAuKiIgXAorCQkiY29udGludWUgdG8gY2FsbDViIChiaWctZW5kaWFuLCBzaXplb2YgbG9uZyA9PSA0LCBzaXplb2YgaW50ID0gMikiCisgICAgfSBlbHNlIHsKKwlmYWlsICJjb250aW51ZSB0byBjYWxsNWIgKHVua25vd24gY2FzZSkiCisgICAgfQorCisgICAgIyBUcnkgZGVyZWZlcmVuY2luZyB0aGUgYXJndW1lbnRzLgorICAgIGlmIHsgJHRhcmdldF9zaXplb2ZfbG9uZyA9PSAkdGFyZ2V0X3NpemVvZl9pbnQgfSB7CisJZ2RiX3Rlc3QgInByaW50IHVuIiAiLiogPSBce3UxID0gMiwgdTIgPSAyXH0iIFwKKwkJInByaW50IHVuIChzaXplb2YgbG9uZyA9PSBzaXplb2YgaW50KSIKKyAgICB9IGVsc2VpZiB7ICEgJHRhcmdldF9iaWdlbmRpYW5fcCB9IHsKKwlnZGJfdGVzdCAicHJpbnQgdW4iICIuKiA9IFx7dTEgPSAyLCB1MiA9IDJcfSIgXAorCQkicHJpbnQgdW4gKGxpdHRsZS1lbmRpYW4sIHNpemVvZiBsb25nICE9IHNpemVvZiBpbnQpIgorICAgIH0gZWxzZWlmIHsgJHRhcmdldF9zaXplb2ZfbG9uZyA9PSA4ICYmICR0YXJnZXRfc2l6ZW9mX2ludCA9PSA0IH0geworCWdkYl90ZXN0ICJwcmludCB1biIgIi4qID0gXHt1MSA9IDIsIHUyID0gODU4OTkzNDU5Mlx9IiBcCisJCSJwcmludCB1biAoYmlnLWVuZGlhbiwgc2l6ZW9mIGxvbmcgPT0gOCwgc2l6ZW9mIGludCA9IDQpIgorICAgIH0gZWxzZWlmIHsgJHRhcmdldF9zaXplb2ZfbG9uZyA9PSA0ICYmICR0YXJnZXRfc2l6ZW9mX2ludCA9PSAyIH0geworCWdkYl90ZXN0ICJwcmludCB1biIgIi4qID0gXHt1MSA9IDIsIHUyID0gMTMxMDcyXH0iIFwKKwkJInByaW50IHVuIChiaWctZW5kaWFuLCBzaXplb2YgbG9uZyA9PSA0LCBzaXplb2YgaW50ID0gMikiCisgICAgfSBlbHNlIHsKKwlmYWlsICJwcmludCB1biAodW5rbm93biBjYXNlKSIKKyAgICB9CisKKyAgICBnZGJfc3RvcF9zdXBwcmVzc2luZ190ZXN0czsKK30KKworIworIyBMb2NhdGUgYWN0dWFsIGFyZ3M7IGRpc2NhcmQsIHNodWZmbGUsIGFuZCBjYWxsCisjCisKK3Byb2MgZGlzY2FyZF9hbmRfc2h1ZmZsZSB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKyAgICBnbG9iYWwgZGV0X2ZpbGUKKyAgICBnbG9iYWwgZ2NjX2NvbXBpbGVkCisKKyAgICBkZWxldGVfYnJlYWtwb2ludHMKKworICAgIGdkYl9icmVha3BvaW50IGNhbGw2YQorICAgIGdkYl9icmVha3BvaW50IGNhbGw2YgorICAgIGdkYl9icmVha3BvaW50IGNhbGw2YworICAgIGdkYl9icmVha3BvaW50IGNhbGw2ZAorICAgIGdkYl9icmVha3BvaW50IGNhbGw2ZQorICAgIGdkYl9icmVha3BvaW50IGNhbGw2ZgorICAgIGdkYl9icmVha3BvaW50IGNhbGw2ZworICAgIGdkYl9icmVha3BvaW50IGNhbGw2aAorCisgICAgIyBSdW47IHNob3VsZCBzdG9wIGF0IGNhbGw2YSBhbmQgcHJpbnQgYWN0dWFsIGFyZ3VtZW50cy4KKyAgICAjIFByaW50IGJhY2t0cmFjZS4KKworICAgICMgVGhlIGEyOWsgZmFpbHMgYWxsIG9mIHRoZXNlIHRlc3RzLCBwZXJoYXBzIGJlY2F1c2UgdGhlIHByb2xvZ3VlCisgICAgIyBjb2RlIGlzIGJyb2tlbi4KKyAgICBzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKKyAgICBnZGJfcnVuX2NtZAorICAgIGdkYl9leHBlY3QgeworCSAtcmUgIi4qQnJlYWtwb2ludCAkZGVjaW1hbCwgY2FsbDZhIC4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJydW4gdG8gY2FsbDZhIiB9CisJIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJydW4gdG8gY2FsbDZhIiA7IGdkYl9zdXBwcmVzc190ZXN0czsgfQorCSB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHJ1biB0byBjYWxsNmEiIDsgZ2RiX3N1cHByZXNzX3Rlc3RzOyB9CisgICAgfQorCisgICAgc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiCisKKyAgICBpZiB7ISRnY2NfY29tcGlsZWR9IHsKKwlzZXR1cF94ZmFpbCAibWlwcy1zZ2ktaXJpeDUqIgorICAgIH0KKworICAgIGlmIFtnZGJfdGVzdCAiYmFja3RyYWNlIDEwMCIgIiBjYWxsNmEgXFwoYz05NyAnYScsIHM9MSwgaT0yLCBsPTMsIGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBtYWluIFxcKC4qXFwpLioiICJiYWNrdHJhY2UgZnJvbSBjYWxsNmEiXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzOworICAgIH0KKworICAgICMgQ29udGludWU7IHNob3VsZCBzdG9wIGF0IGNhbGw2YiBhbmQgcHJpbnQgYWN0dWFsIGFyZ3VtZW50cy4KKyAgICAjIFByaW50IGJhY2t0cmFjZS4KKworICAgIGdkYl9jb250aW51ZSBjYWxsNmIKKworICAgIGlmIFtnZGJfdGVzdCAiYmFja3RyYWNlIDEwMCIgIiBjYWxsNmIgXFwocz0xLCBpPTIsIGw9MywgZj00LCBkPTUsIHVjPTk4ICdiJywgdXM9NiwgdWk9NywgdWw9OFxcKS4qIGNhbGw2YSBcXChjPTk3ICdhJywgcz0xLCBpPTIsIGw9MywgZj00LCBkPTUsIHVjPTk4ICdiJywgdXM9NiwgdWk9NywgdWw9OFxcKS4qIG1haW4gXFwoLipcXCkuKiIgImJhY2t0cmFjZSBmcm9tIGNhbGw2YiJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorCisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDZjIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgICMgUHJpbnQgYmFja3RyYWNlLgorCisgICAgZ2RiX2NvbnRpbnVlIGNhbGw2YworCisgICAgaWYgW2dkYl90ZXN0ICJiYWNrdHJhY2UgMTAwIiAiIGNhbGw2YyBcXChpPTIsIGw9MywgZj00LCBkPTUsIHVjPTk4ICdiJywgdXM9NiwgdWk9NywgdWw9OFxcKS4qIGNhbGw2YiBcXChzPTEsIGk9MiwgbD0zLCBmPTQsIGQ9NSwgdWM9OTggJ2InLCB1cz02LCB1aT03LCB1bD04XFwpLiogY2FsbDZhIFxcKGM9OTcgJ2EnLCBzPTEsIGk9MiwgbD0zLCBmPTQsIGQ9NSwgdWM9OTggJ2InLCB1cz02LCB1aT03LCB1bD04XFwpLiogbWFpbiBcXCguKlxcKS4qIiAiYmFja3RyYWNlIGZyb20gY2FsbDZjIl0geworCWdkYl9zdXBwcmVzc190ZXN0czsKKyAgICB9CisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDZkIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgICMgUHJpbnQgYmFja3RyYWNlLgorCisgICAgZ2RiX2NvbnRpbnVlIGNhbGw2ZAorCisgICAgaWYgW2dkYl90ZXN0ICJiYWNrdHJhY2UgMTAwIiAiIGNhbGw2ZCBcXChsPTMsIGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmMgXFwoaT0yLCBsPTMsIGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmIgXFwocz0xLCBpPTIsIGw9MywgZj00LCBkPTUsIHVjPTk4ICdiJywgdXM9NiwgdWk9NywgdWw9OFxcKS4qIGNhbGw2YSBcXChjPTk3ICdhJywgcz0xLCBpPTIsIGw9MywgZj00LCBkPTUsIHVjPTk4ICdiJywgdXM9NiwgdWk9NywgdWw9OFxcKS4qIG1haW4gXFwoLipcXCkuKiIgImJhY2t0cmFjZSBmcm9tIGNhbGw2ZCJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorCisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDZlIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgICMgUHJpbnQgYmFja3RyYWNlLgorCisgICAgZ2RiX2NvbnRpbnVlIGNhbGw2ZQorCisgICAgaWYgW2dkYl90ZXN0ICJiYWNrdHJhY2UgMTAwIiAiIGNhbGw2ZSBcXChmPTQsIGQ9NSwgdWM9OTggJ2InLCB1cz02LCB1aT03LCB1bD04XFwpLiogY2FsbDZkIFxcKGw9MywgZj00LCBkPTUsIHVjPTk4ICdiJywgdXM9NiwgdWk9NywgdWw9OFxcKS4qIGNhbGw2YyBcXChpPTIsIGw9MywgZj00LCBkPTUsIHVjPTk4ICdiJywgdXM9NiwgdWk9NywgdWw9OFxcKS4qIGNhbGw2YiBcXChzPTEsIGk9MiwgbD0zLCBmPTQsIGQ9NSwgdWM9OTggJ2InLCB1cz02LCB1aT03LCB1bD04XFwpLiogY2FsbDZhIFxcKGM9OTcgJ2EnLCBzPTEsIGk9MiwgbD0zLCBmPTQsIGQ9NSwgdWM9OTggJ2InLCB1cz02LCB1aT03LCB1bD04XFwpLiogbWFpbiBcXCguKlxcKS4qIiAiYmFja3RyYWNlIGZyb20gY2FsbDZlIl0geworCWdkYl9zdXBwcmVzc190ZXN0czsKKyAgICB9CisKKyAgICAjIENvbnRpbnVlOyBzaG91bGQgc3RvcCBhdCBjYWxsNmYgYW5kIHByaW50IGFjdHVhbCBhcmd1bWVudHMuCisgICAgIyBQcmludCBiYWNrdHJhY2UuCisKKyAgICBnZGJfY29udGludWUgY2FsbDZmCisKKyAgICBpZiBbZ2RiX3Rlc3QgImJhY2t0cmFjZSAxMDAiICIgY2FsbDZmIFxcKGQ9NSwgdWM9OTggJ2InLCB1cz02LCB1aT03LCB1bD04XFwpLiogY2FsbDZlIFxcKGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmQgXFwobD0zLCBmPTQsIGQ9NSwgdWM9OTggJ2InLCB1cz02LCB1aT03LCB1bD04XFwpLiogY2FsbDZjIFxcKGk9MiwgbD0zLCBmPTQsIGQ9NSwgdWM9OTggJ2InLCB1cz02LCB1aT03LCB1bD04XFwpLiogY2FsbDZiIFxcKHM9MSwgaT0yLCBsPTMsIGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmEgXFwoYz05NyAnYScsIHM9MSwgaT0yLCBsPTMsIGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBtYWluIFxcKC4qXFwpLioiICJiYWNrdHJhY2UgZnJvbSBjYWxsNmYiXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzOworICAgIH0KKworICAgICMgQ29udGludWU7IHNob3VsZCBzdG9wIGF0IGNhbGw2ZyBhbmQgcHJpbnQgYWN0dWFsIGFyZ3VtZW50cy4KKyAgICAjIFByaW50IGJhY2t0cmFjZS4KKworICAgIGdkYl9jb250aW51ZSBjYWxsNmcKKworICAgIGlmIFtnZGJfdGVzdCAiYmFja3RyYWNlIDEwMCIgIiBjYWxsNmcgXFwodWM9OTggJ2InLCB1cz02LCB1aT03LCB1bD04XFwpLiogY2FsbDZmIFxcKGQ9NSwgdWM9OTggJ2InLCB1cz02LCB1aT03LCB1bD04XFwpLiogY2FsbDZlIFxcKGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmQgXFwobD0zLCBmPTQsIGQ9NSwgdWM9OTggJ2InLCB1cz02LCB1aT03LCB1bD04XFwpLiogY2FsbDZjIFxcKGk9MiwgbD0zLCBmPTQsIGQ9NSwgdWM9OTggJ2InLCB1cz02LCB1aT03LCB1bD04XFwpLiogY2FsbDZiIFxcKHM9MSwgaT0yLCBsPTMsIGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmEgXFwoYz05NyAnYScsIHM9MSwgaT0yLCBsPTMsIGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBtYWluIFxcKC4qXFwpLioiICJiYWNrdHJhY2UgZnJvbSBjYWxsNmciXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzOworICAgIH0KKworICAgICMgQ29udGludWU7IHNob3VsZCBzdG9wIGF0IGNhbGw2aCBhbmQgcHJpbnQgYWN0dWFsIGFyZ3VtZW50cy4KKyAgICAjIFByaW50IGJhY2t0cmFjZS4KKworICAgIGdkYl9jb250aW51ZSBjYWxsNmgKKworICAgIGlmIFtnZGJfdGVzdCAiYmFja3RyYWNlIDEwMCIgIiBjYWxsNmggXFwodXM9NiwgdWk9NywgdWw9OFxcKS4qIGNhbGw2ZyBcXCh1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmYgXFwoZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmUgXFwoZj00LCBkPTUsIHVjPTk4ICdiJywgdXM9NiwgdWk9NywgdWw9OFxcKS4qIGNhbGw2ZCBcXChsPTMsIGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmMgXFwoaT0yLCBsPTMsIGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmIgXFwocz0xLCBpPTIsIGw9MywgZj00LCBkPTUsIHVjPTk4ICdiJywgdXM9NiwgdWk9NywgdWw9OFxcKS4qIGNhbGw2YSBcXChjPTk3ICdhJywgcz0xLCBpPTIsIGw9MywgZj00LCBkPTUsIHVjPTk4ICdiJywgdXM9NiwgdWk9NywgdWw9OFxcKS4qIG1haW4gXFwoLipcXCkuKiIgImJhY2t0cmFjZSBmcm9tIGNhbGw2aCJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorCisgICAgIyBtb25pdG9yIG9ubHkgYWxsb3dzIDggYnJlYWtwb2ludHM7IHc4OWsgYm9hcmQgYWxsb3dzIDEwLCBzbworICAgICMgYnJlYWsgdGhlbSB1cCBpbnRvIHR3byBncm91cHMuCisgICAgZGVsZXRlX2JyZWFrcG9pbnRzCisgICAgZ2RiX2JyZWFrcG9pbnQgY2FsbDZpCisgICAgZ2RiX2JyZWFrcG9pbnQgY2FsbDZqCisgICAgZ2RiX2JyZWFrcG9pbnQgY2FsbDZrCisKKyAgICAjIENvbnRpbnVlOyBzaG91bGQgc3RvcCBhdCBjYWxsNmkgYW5kIHByaW50IGFjdHVhbCBhcmd1bWVudHMuCisgICAgIyBQcmludCBiYWNrdHJhY2UuCisKKyAgICBnZGJfY29udGludWUgY2FsbDZpCisKKyAgICBpZiBbZ2RiX3Rlc3QgImJhY2t0cmFjZSAxMDAiICIgY2FsbDZpIFxcKHVpPTcsIHVsPThcXCkuKiBjYWxsNmggXFwodXM9NiwgdWk9NywgdWw9OFxcKS4qIGNhbGw2ZyBcXCh1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmYgXFwoZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmUgXFwoZj00LCBkPTUsIHVjPTk4ICdiJywgdXM9NiwgdWk9NywgdWw9OFxcKS4qIGNhbGw2ZCBcXChsPTMsIGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmMgXFwoaT0yLCBsPTMsIGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmIgXFwocz0xLCBpPTIsIGw9MywgZj00LCBkPTUsIHVjPTk4ICdiJywgdXM9NiwgdWk9NywgdWw9OFxcKS4qIGNhbGw2YSBcXChjPTk3ICdhJywgcz0xLCBpPTIsIGw9MywgZj00LCBkPTUsIHVjPTk4ICdiJywgdXM9NiwgdWk9NywgdWw9OFxcKS4qIG1haW4gXFwoLipcXCkuKiIgImJhY2t0cmFjZSBmcm9tIGNhbGw2aSJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorCisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDZqIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgICMgUHJpbnQgYmFja3RyYWNlLgorCisgICAgZ2RiX2NvbnRpbnVlIGNhbGw2agorCisgICAgaWYgW2dkYl90ZXN0ICJiYWNrdHJhY2UgMTAwIiAiIGNhbGw2aiBcXCh1bD04XFwpLiogY2FsbDZpIFxcKHVpPTcsIHVsPThcXCkuKiBjYWxsNmggXFwodXM9NiwgdWk9NywgdWw9OFxcKS4qIGNhbGw2ZyBcXCh1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmYgXFwoZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmUgXFwoZj00LCBkPTUsIHVjPTk4ICdiJywgdXM9NiwgdWk9NywgdWw9OFxcKS4qIGNhbGw2ZCBcXChsPTMsIGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmMgXFwoaT0yLCBsPTMsIGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmIgXFwocz0xLCBpPTIsIGw9MywgZj00LCBkPTUsIHVjPTk4ICdiJywgdXM9NiwgdWk9NywgdWw9OFxcKS4qIGNhbGw2YSBcXChjPTk3ICdhJywgcz0xLCBpPTIsIGw9MywgZj00LCBkPTUsIHVjPTk4ICdiJywgdXM9NiwgdWk9NywgdWw9OFxcKS4qIG1haW4gXFwoLipcXCkuKiIgImJhY2t0cmFjZSBmcm9tIGNhbGw2aiJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorCisgICAgIyBDb250aW51ZTsgc2hvdWxkIHN0b3AgYXQgY2FsbDZrIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgICMgUHJpbnQgYmFja3RyYWNlLgorICAgICMgVGhpcyBmYWlscyBvbiBpOTYwLSotdnh3b3JrcyBiZWNhdXNlIGdkYiBnZXRzIGNvbmZ1c2VkIGJ5CisgICAgIyBicmVha3BvaW50cyBvbiBhZGphY2VudCBpbnN0cnVjdGlvbnMuCisgICAgc2V0dXBfeGZhaWwgImk5NjAtKi12eHdvcmtzIiAxNzg2CisgICAgZ2RiX2NvbnRpbnVlIGNhbGw2aworCisgICAgaWYgW2dkYl90ZXN0ICJiYWNrdHJhY2UgMTAwIiAiIGNhbGw2ayBcXChcXCkuKiBjYWxsNmogXFwodWw9OFxcKS4qIGNhbGw2aSBcXCh1aT03LCB1bD04XFwpLiogY2FsbDZoIFxcKHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmcgXFwodWM9OTggJ2InLCB1cz02LCB1aT03LCB1bD04XFwpLiogY2FsbDZmIFxcKGQ9NSwgdWM9OTggJ2InLCB1cz02LCB1aT03LCB1bD04XFwpLiogY2FsbDZlIFxcKGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmQgXFwobD0zLCBmPTQsIGQ9NSwgdWM9OTggJ2InLCB1cz02LCB1aT03LCB1bD04XFwpLiogY2FsbDZjIFxcKGk9MiwgbD0zLCBmPTQsIGQ9NSwgdWM9OTggJ2InLCB1cz02LCB1aT03LCB1bD04XFwpLiogY2FsbDZiIFxcKHM9MSwgaT0yLCBsPTMsIGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBjYWxsNmEgXFwoYz05NyAnYScsIHM9MSwgaT0yLCBsPTMsIGY9NCwgZD01LCB1Yz05OCAnYicsIHVzPTYsIHVpPTcsIHVsPThcXCkuKiBtYWluIFxcKC4qXFwpLioiICJiYWNrdHJhY2UgZnJvbSBjYWxsNmsiXSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzOworICAgIH0KKyAgICBnZGJfc3RvcF9zdXBwcmVzc2luZ190ZXN0czsKK30KKworCisjCisjIExvY2F0ZSBhY3R1YWwgYXJnczsgc2h1ZmZsZSByb3VuZCByb2JpbiBhbmQgY2FsbAorIworCitwcm9jIHNodWZmbGVfcm91bmRfcm9iaW4ge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisgICAgZ2xvYmFsIGRldF9maWxlCisgICAgZ2xvYmFsIGdjY19jb21waWxlZAorCisgICAgZGVsZXRlX2JyZWFrcG9pbnRzCisKKyAgICBnZGJfYnJlYWtwb2ludCBjYWxsN2EKKyAgICBnZGJfYnJlYWtwb2ludCBjYWxsN2IKKyAgICBnZGJfYnJlYWtwb2ludCBjYWxsN2MKKyAgICBnZGJfYnJlYWtwb2ludCBjYWxsN2QKKyAgICBnZGJfYnJlYWtwb2ludCBjYWxsN2UKKyAgICBnZGJfYnJlYWtwb2ludCBjYWxsN2YKKyAgICBnZGJfYnJlYWtwb2ludCBjYWxsN2cKKyAgICBnZGJfYnJlYWtwb2ludCBjYWxsN2gKKworICAgICMgUnVuOyBzaG91bGQgc3RvcCBhdCBjYWxsN2EgYW5kIHByaW50IGFjdHVhbCBhcmd1bWVudHMuCisgICAgIyBQcmludCBiYWNrdHJhY2UuCisKKyAgICAjIFRoZSBhMjlrIGZhaWxzIGFsbCBvZiB0aGVzZSB0ZXN0cywgcGVyaGFwcyBiZWNhdXNlIHRoZSBwcm9sb2d1ZQorICAgICMgY29kZSBpcyBicm9rZW4uCisgICAgc2V0dXBfeGZhaWwgImEyOWstKi11ZGkiCisgICAgZ2RiX3J1bl9jbWQKKyAgICBnZGJfZXhwZWN0IHsKKwkgLXJlICIuKkJyZWFrcG9pbnQgJGRlY2ltYWwsIGNhbGw3YSAuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicnVuIHRvIGNhbGw3YSIKKwl9CisJIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJydW4gdG8gY2FsbDdhIiA7IGdkYl9zdXBwcmVzc190ZXN0czsgfQorCSB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHJ1biB0byBjYWxsN2EiIDsgZ2RiX3N1cHByZXNzX3Rlc3RzOyB9CisgICAgfQorCisgICAgc2V0dXBfeGZhaWwgImk5NjAtKi0qIiAxODEzCisgICAgaWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiICJtaXBzLXNnaS1pcml4NSoiIH0KKyAgICBnZGJfdGVzdCAiYmFja3RyYWNlIDEwMCIgIiBjYWxsN2EgXFwoYz05NyAnYScsIGk9Miwgcz0xLCBsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTdcXCkuKiBtYWluIFxcKC4qXFwpLioiICJiYWNrdHJhY2UgZnJvbSBjYWxsN2EiCisKKyAgICAjIENvbnRpbnVlOyBzaG91bGQgc3RvcCBhdCBjYWxsN2IgYW5kIHByaW50IGFjdHVhbCBhcmd1bWVudHMuCisgICAgIyBQcmludCBiYWNrdHJhY2UuCisKKyAgICBnZGJfY29udGludWUgY2FsbDdiCisKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CisKKyAgICBnZGJfdGVzdCAiYmFja3RyYWNlIDEwMCIgIiBjYWxsN2IgXFwoaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYSdcXCkuKiBjYWxsN2EgXFwoYz05NyAnYScsIGk9Miwgcz0xLCBsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTdcXCkuKiBtYWluIFxcKC4qXFwpLioiICJiYWNrdHJhY2UgZnJvbSBjYWxsN2IiCisKKyAgICAjIENvbnRpbnVlOyBzaG91bGQgc3RvcCBhdCBjYWxsN2MgYW5kIHByaW50IGFjdHVhbCBhcmd1bWVudHMuCisgICAgIyBQcmludCBiYWNrdHJhY2UuCisKKyAgICBnZGJfY29udGludWUgY2FsbDdjCisKKyAgICBnZGJfdGVzdCAiYmFja3RyYWNlIDEwMCIgIiBjYWxsN2MgXFwocz0xLCBsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTcsIGM9OTcgJ2EnLCBpPTJcXCkuKiBjYWxsN2IgXFwoaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYSdcXCkuKiBjYWxsN2EgXFwoYz05NyAnYScsIGk9Miwgcz0xLCBsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTdcXCkuKiBtYWluIFxcKC4qXFwpLioiICJiYWNrdHJhY2UgZnJvbSBjYWxsN2MiCisKKyAgICAjIENvbnRpbnVlOyBzaG91bGQgc3RvcCBhdCBjYWxsN2QgYW5kIHByaW50IGFjdHVhbCBhcmd1bWVudHMuCisgICAgIyBQcmludCBiYWNrdHJhY2UuCisKKyAgICBnZGJfY29udGludWUgY2FsbDdkCisKKyAgICBnZGJfdGVzdCAiYmFja3RyYWNlIDEwMCIgIiBjYWxsN2QgXFwobD0zLCBmPTQsIHVjPTk4ICdiJywgZD01LCB1cz02LCB1bD04LCB1aT03LCBjPTk3ICdhJywgaT0yLCBzPTFcXCkuKiBjYWxsN2MgXFwocz0xLCBsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTcsIGM9OTcgJ2EnLCBpPTJcXCkuKiBjYWxsN2IgXFwoaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYSdcXCkuKiBjYWxsN2EgXFwoYz05NyAnYScsIGk9Miwgcz0xLCBsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTdcXCkuKiBtYWluIFxcKC4qXFwpLioiICJiYWNrdHJhY2UgZnJvbSBjYWxsN2QiCisKKyAgICBnZGJfY29udGludWUgY2FsbDdlCisKKyAgICBnZGJfdGVzdCAiYmFja3RyYWNlIDEwMCIgIiBjYWxsN2UgXFwoZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYScsIGk9Miwgcz0xLCBsPTNcXCkuKiBjYWxsN2QgXFwobD0zLCBmPTQsIHVjPTk4ICdiJywgZD01LCB1cz02LCB1bD04LCB1aT03LCBjPTk3ICdhJywgaT0yLCBzPTFcXCkuKiBjYWxsN2MgXFwocz0xLCBsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTcsIGM9OTcgJ2EnLCBpPTJcXCkuKiBjYWxsN2IgXFwoaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYSdcXCkuKiBjYWxsN2EgXFwoYz05NyAnYScsIGk9Miwgcz0xLCBsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTdcXCkuKiBtYWluIFxcKC4qXFwpLioiICJiYWNrdHJhY2UgZnJvbSBjYWxsN2UiCisKKyAgICAjIENvbnRpbnVlOyBzaG91bGQgc3RvcCBhdCBjYWxsN2YgYW5kIHByaW50IGFjdHVhbCBhcmd1bWVudHMuCisgICAgIyBQcmludCBiYWNrdHJhY2UuCisKKyAgICBnZGJfY29udGludWUgY2FsbDdmCisKKyAgICBnZGJfdGVzdCAiYmFja3RyYWNlIDEwMCIgIiBjYWxsN2YgXFwodWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTcsIGM9OTcgJ2EnLCBpPTIsIHM9MSwgbD0zLCBmPTRcXCkuKiBjYWxsN2UgXFwoZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYScsIGk9Miwgcz0xLCBsPTNcXCkuKiBjYWxsN2QgXFwobD0zLCBmPTQsIHVjPTk4ICdiJywgZD01LCB1cz02LCB1bD04LCB1aT03LCBjPTk3ICdhJywgaT0yLCBzPTFcXCkuKiBjYWxsN2MgXFwocz0xLCBsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTcsIGM9OTcgJ2EnLCBpPTJcXCkuKiBjYWxsN2IgXFwoaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYSdcXCkuKiBjYWxsN2EgXFwoYz05NyAnYScsIGk9Miwgcz0xLCBsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTdcXCkuKiBtYWluIFxcKC4qXFwpLioiICJiYWNrdHJhY2UgZnJvbSBjYWxsN2YiCisKKyAgICAjIENvbnRpbnVlOyBzaG91bGQgc3RvcCBhdCBjYWxsN2cgYW5kIHByaW50IGFjdHVhbCBhcmd1bWVudHMuCisgICAgIyBQcmludCBiYWNrdHJhY2UuCisKKyAgICBnZGJfY29udGludWUgY2FsbDdnCisKKyAgICBnZGJfdGVzdCAiYmFja3RyYWNlIDEwMCIgIiBjYWxsN2cgXFwoZD01LCB1cz02LCB1bD04LCB1aT03LCBjPTk3ICdhJywgaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYidcXCkuKiBjYWxsN2YgXFwodWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTcsIGM9OTcgJ2EnLCBpPTIsIHM9MSwgbD0zLCBmPTRcXCkuKiBjYWxsN2UgXFwoZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYScsIGk9Miwgcz0xLCBsPTNcXCkuKiBjYWxsN2QgXFwobD0zLCBmPTQsIHVjPTk4ICdiJywgZD01LCB1cz02LCB1bD04LCB1aT03LCBjPTk3ICdhJywgaT0yLCBzPTFcXCkuKiBjYWxsN2MgXFwocz0xLCBsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTcsIGM9OTcgJ2EnLCBpPTJcXCkuKiBjYWxsN2IgXFwoaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYSdcXCkuKiBjYWxsN2EgXFwoYz05NyAnYScsIGk9Miwgcz0xLCBsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTdcXCkuKiBtYWluIFxcKC4qXFwpLioiICJiYWNrdHJhY2UgZnJvbSBjYWxsN2ciCisKKyAgICBnZGJfY29udGludWUgY2FsbDdoCisKKyAgICBnZGJfdGVzdCAiYmFja3RyYWNlIDEwMCIgIiBjYWxsN2ggXFwodXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYScsIGk9Miwgcz0xLCBsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTVcXCkuKiBjYWxsN2cgXFwoZD01LCB1cz02LCB1bD04LCB1aT03LCBjPTk3ICdhJywgaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYidcXCkuKiBjYWxsN2YgXFwodWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTcsIGM9OTcgJ2EnLCBpPTIsIHM9MSwgbD0zLCBmPTRcXCkuKiBjYWxsN2UgXFwoZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYScsIGk9Miwgcz0xLCBsPTNcXCkuKiBjYWxsN2QgXFwobD0zLCBmPTQsIHVjPTk4ICdiJywgZD01LCB1cz02LCB1bD04LCB1aT03LCBjPTk3ICdhJywgaT0yLCBzPTFcXCkuKiBjYWxsN2MgXFwocz0xLCBsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTcsIGM9OTcgJ2EnLCBpPTJcXCkuKiBjYWxsN2IgXFwoaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYSdcXCkuKiBjYWxsN2EgXFwoYz05NyAnYScsIGk9Miwgcz0xLCBsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTdcXCkuKiBtYWluIFxcKC4qXFwpLioiICJiYWNrdHJhY2UgZnJvbSBjYWxsN2giCisKKyAgICAjIG1vbml0b3Igb25seSBhbGxvd3MgOCBicmVha3BvaW50czsgdzg5ayBib2FyZCBhbGxvd3MgMTAsIHNvCisgICAgIyBicmVhayB0aGVtIHVwIGludG8gdHdvIGdyb3Vwcy4KKyAgICBkZWxldGVfYnJlYWtwb2ludHMKKyAgICBnZGJfYnJlYWtwb2ludCBjYWxsN2kKKyAgICBnZGJfYnJlYWtwb2ludCBjYWxsN2oKKyAgICBnZGJfYnJlYWtwb2ludCBjYWxsN2sKKworICAgICMgQ29udGludWU7IHNob3VsZCBzdG9wIGF0IGNhbGw3aSBhbmQgcHJpbnQgYWN0dWFsIGFyZ3VtZW50cy4KKyAgICAjIFByaW50IGJhY2t0cmFjZS4KKworICAgIGdkYl9jb250aW51ZSBjYWxsN2kKKworICAgIGdkYl90ZXN0ICJiYWNrdHJhY2UgMTAwIiAiIGNhbGw3aSBcXCh1bD04LCB1aT03LCBjPTk3ICdhJywgaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NlxcKS4qIGNhbGw3aCBcXCh1cz02LCB1bD04LCB1aT03LCBjPTk3ICdhJywgaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NVxcKS4qIGNhbGw3ZyBcXChkPTUsIHVzPTYsIHVsPTgsIHVpPTcsIGM9OTcgJ2EnLCBpPTIsIHM9MSwgbD0zLCBmPTQsIHVjPTk4ICdiJ1xcKS4qIGNhbGw3ZiBcXCh1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYScsIGk9Miwgcz0xLCBsPTMsIGY9NFxcKS4qIGNhbGw3ZSBcXChmPTQsIHVjPTk4ICdiJywgZD01LCB1cz02LCB1bD04LCB1aT03LCBjPTk3ICdhJywgaT0yLCBzPTEsIGw9M1xcKS4qIGNhbGw3ZCBcXChsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTcsIGM9OTcgJ2EnLCBpPTIsIHM9MVxcKS4qIGNhbGw3YyBcXChzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYScsIGk9MlxcKS4qIGNhbGw3YiBcXChpPTIsIHM9MSwgbD0zLCBmPTQsIHVjPTk4ICdiJywgZD01LCB1cz02LCB1bD04LCB1aT03LCBjPTk3ICdhJ1xcKS4qIGNhbGw3YSBcXChjPTk3ICdhJywgaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9N1xcKS4qIG1haW4gXFwoLipcXCkuKiIgImJhY2t0cmFjZSBmcm9tIGNhbGw3aSIKKworICAgICMgQ29udGludWU7IHNob3VsZCBzdG9wIGF0IGNhbGw3aiBhbmQgcHJpbnQgYWN0dWFsIGFyZ3VtZW50cy4KKyAgICAjIFByaW50IGJhY2t0cmFjZS4KKworICAgIGdkYl9jb250aW51ZSBjYWxsN2oKKworICAgIGdkYl90ZXN0ICJiYWNrdHJhY2UgMTAwIiAiIGNhbGw3aiBcXCh1aT03LCBjPTk3ICdhJywgaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OFxcKS4qIGNhbGw3aSBcXCh1bD04LCB1aT03LCBjPTk3ICdhJywgaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NlxcKS4qIGNhbGw3aCBcXCh1cz02LCB1bD04LCB1aT03LCBjPTk3ICdhJywgaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NVxcKS4qIGNhbGw3ZyBcXChkPTUsIHVzPTYsIHVsPTgsIHVpPTcsIGM9OTcgJ2EnLCBpPTIsIHM9MSwgbD0zLCBmPTQsIHVjPTk4ICdiJ1xcKS4qIGNhbGw3ZiBcXCh1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYScsIGk9Miwgcz0xLCBsPTMsIGY9NFxcKS4qIGNhbGw3ZSBcXChmPTQsIHVjPTk4ICdiJywgZD01LCB1cz02LCB1bD04LCB1aT03LCBjPTk3ICdhJywgaT0yLCBzPTEsIGw9M1xcKS4qIGNhbGw3ZCBcXChsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTcsIGM9OTcgJ2EnLCBpPTIsIHM9MVxcKS4qIGNhbGw3YyBcXChzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYScsIGk9MlxcKS4qIGNhbGw3YiBcXChpPTIsIHM9MSwgbD0zLCBmPTQsIHVjPTk4ICdiJywgZD01LCB1cz02LCB1bD04LCB1aT03LCBjPTk3ICdhJ1xcKS4qIGNhbGw3YSBcXChjPTk3ICdhJywgaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9N1xcKS4qIG1haW4gXFwoLipcXCkuKiIgImJhY2t0cmFjZSBmcm9tIGNhbGw3aiIKKworICAgICMgQ29udGludWU7IHNob3VsZCBzdG9wIGF0IGNhbGw3ayBhbmQgcHJpbnQgYWN0dWFsIGFyZ3VtZW50cy4KKyAgICAjIFByaW50IGJhY2t0cmFjZS4KKworICAgIGdkYl9jb250aW51ZSBjYWxsN2sKKworICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJtaXBzLXNnaS1pcml4KiIgfQorICAgIGdkYl90ZXN0ICJiYWNrdHJhY2UgMTAwIiAiIGNhbGw3ayBcXChjPTk3ICdhJywgaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9N1xcKS4qIGNhbGw3aiBcXCh1aT03LCBjPTk3ICdhJywgaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OFxcKS4qIGNhbGw3aSBcXCh1bD04LCB1aT03LCBjPTk3ICdhJywgaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NlxcKS4qIGNhbGw3aCBcXCh1cz02LCB1bD04LCB1aT03LCBjPTk3ICdhJywgaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NVxcKS4qIGNhbGw3ZyBcXChkPTUsIHVzPTYsIHVsPTgsIHVpPTcsIGM9OTcgJ2EnLCBpPTIsIHM9MSwgbD0zLCBmPTQsIHVjPTk4ICdiJ1xcKS4qIGNhbGw3ZiBcXCh1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYScsIGk9Miwgcz0xLCBsPTMsIGY9NFxcKS4qIGNhbGw3ZSBcXChmPTQsIHVjPTk4ICdiJywgZD01LCB1cz02LCB1bD04LCB1aT03LCBjPTk3ICdhJywgaT0yLCBzPTEsIGw9M1xcKS4qIGNhbGw3ZCBcXChsPTMsIGY9NCwgdWM9OTggJ2InLCBkPTUsIHVzPTYsIHVsPTgsIHVpPTcsIGM9OTcgJ2EnLCBpPTIsIHM9MVxcKS4qIGNhbGw3YyBcXChzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9NywgYz05NyAnYScsIGk9MlxcKS4qIGNhbGw3YiBcXChpPTIsIHM9MSwgbD0zLCBmPTQsIHVjPTk4ICdiJywgZD01LCB1cz02LCB1bD04LCB1aT03LCBjPTk3ICdhJ1xcKS4qIGNhbGw3YSBcXChjPTk3ICdhJywgaT0yLCBzPTEsIGw9MywgZj00LCB1Yz05OCAnYicsIGQ9NSwgdXM9NiwgdWw9OCwgdWk9N1xcKS4qIG1haW4gXFwoLipcXCkuKiIgImJhY2t0cmFjZSBmcm9tIGNhbGw3ayIKKyAgICBnZGJfc3RvcF9zdXBwcmVzc2luZ190ZXN0czsKK30KKworIworIyBMb2NhdGUgYWN0dWFsIGFyZ3M7IHJlY3Vyc2l2ZSBwYXNzaW5nIG9mIHN0cnVjdHMgYnkgdmFsdWUKKyMKKworcHJvYyByZWN1cnNpdmVfc3RydWN0c19ieV92YWx1ZSB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKyAgICBnbG9iYWwgZGV0X2ZpbGUKKworICAgIGRlbGV0ZV9icmVha3BvaW50cworCisgICAgZ2RiX2JyZWFrcG9pbnQgaGl0Ym90dG9tCisKKyAgICAjIFJ1bjsgc2hvdWxkIHN0b3AgYXQgaGl0Ym90dG9tIGFuZCBwcmludCBhY3R1YWwgYXJndW1lbnRzLgorICAgICMgUHJpbnQgYmFja3RyYWNlLgorICAgIGdkYl9ydW5fY21kCisgICAgZ2RiX2V4cGVjdCB7CisJIC1yZSAiLipCcmVha3BvaW50ICRkZWNpbWFsLCBoaXRib3R0b20gLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInJ1biB0byBoaXRib3R0b20iIH0KKwkgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgInJ1biB0byBoaXRib3R0b20iIDsgZ2RiX3N1cHByZXNzX3Rlc3RzOyB9CisJIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcnVuIHRvIGhpdGJvdHRvbSIgOyBnZGJfc3VwcHJlc3NfdGVzdHM7IH0KKyAgICB9CisKKyAgICBpZiAhW2lzdGFyZ2V0IHNwYXJjbGV0LSotKl0geworICAgICMgVGhlIGEyOWsgZmFpbHMgYWxsIG9mIHRoZXNlIHRlc3RzLCBwZXJoYXBzIGJlY2F1c2UgdGhlIHByb2xvZ3VlCisgICAgIyBjb2RlIGlzIGJyb2tlbi4KKwlzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKKwlnZGJfdGVzdCAiYmFja3RyYWNlIDEwMCIgIiBoaXRib3R0b20gXFwoXFwpLiogcmVjdXJzZSBcXChhPVx7cyA9IDAsIGkgPSAwLCBsID0gMFx9LCBkZXB0aD0wXFwpLiogcmVjdXJzZSBcXChhPVx7cyA9IDEsIGkgPSAxLCBsID0gMVx9LCBkZXB0aD0xXFwpLiogcmVjdXJzZSBcXChhPVx7cyA9IDIsIGkgPSAyLCBsID0gMlx9LCBkZXB0aD0yXFwpLiogcmVjdXJzZSBcXChhPVx7cyA9IDMsIGkgPSAzLCBsID0gM1x9LCBkZXB0aD0zXFwpLiogcmVjdXJzZSBcXChhPVx7cyA9IDQsIGkgPSA0LCBsID0gNFx9LCBkZXB0aD00XFwpLiogdGVzdF9zdHJ1Y3RfYXJncyBcXChcXCkuKiBtYWluIFxcKC4qXFwpLioiICJyZWN1cnNpdmUgcGFzc2luZyBvZiBzdHJ1Y3RzIGJ5IHZhbHVlIgorICAgIH0gZWxzZSB7CisJZmFpbCAicmVjdXJzaXZlIHBhc3Npbmcgb2Ygc3RydWN0cyBieSB2YWx1ZSAoc3BhcmNsZXQpIgorICAgIH0KKyAgICBnZGJfc3RvcF9zdXBwcmVzc2luZ190ZXN0czsKK30KKworcHJvYyBmdW5jYXJnc19yZWxvYWQgeyB9IHsKKyAgICBnbG9iYWwgb2JqZGlyCisgICAgZ2xvYmFsIHN1YmRpcgorICAgIGdsb2JhbCBiaW5maWxlCisgICAgZ2xvYmFsIHNyY2RpcgorCisgICAgaWYgW2lzdGFyZ2V0ICJtaXBzLWlkdC0qIl0geworCSMgUmVzdGFydCBiZWNhdXNlIElEVC9TSU0gcnVucyBvdXQgb2YgZmlsZSBkZXNjcmlwdG9ycy4KKwlnZGJfZXhpdAorCWdkYl9zdGFydAorCWdkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCWdkYl9sb2FkICR7YmluZmlsZX0KKyAgICB9Cit9CisKKyMKKyMgVGVzdCBmb3IgYWNjZXNzaW5nIGxvY2FsIHN0YWNrIHZhcmlhYmxlcyBpbiBmdW5jdGlvbnMgd2hpY2ggY2FsbCBhbGxvY2EKKyMKK3Byb2MgbG9jYWx2YXJzX2FmdGVyX2FsbG9jYSB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisgICAgZ2xvYmFsIGdjY19jb21waWxlZAorCisgICAgaWYgeyAhIFsgcnVudG8gbG9jYWx2YXJzX2FmdGVyX2FsbG9jYSBdIH0gdGhlbiB7IGdkYl9zdXBwcmVzc190ZXN0czsgfQorCisgICAgIyBQcmludCBlYWNoIGFyZyBhcyBhIGRvdWJsZSBjaGVjayB0byBzZWUgaWYgd2UgY2FuIHByaW50CisgICAgIyB0aGVtIGhlcmUgYXMgd2VsbCBhcyB3aXRoIGJhY2t0cmFjZS4KKworICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CisgICAgZ2RiX3Rlc3QgInByaW50IGMiICIgPSA5NyAnYSciICJwcmludCBjIGFmdGVyIHJ1bnRvIGxvY2FsdmFyc19hZnRlcl9hbGxvY2EiCisgICAgaWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHJpbnQgcyIgIiA9IDEiICJwcmludCBzIGFmdGVyIHJ1bnRvIGxvY2FsdmFyc19hZnRlcl9hbGxvY2EiCisgICAgZ2RiX3Rlc3QgInByaW50IGkiICIgPSAyIiAicHJpbnQgaSBhZnRlciBydW50byBsb2NhbHZhcnNfYWZ0ZXJfYWxsb2NhIgorICAgIGdkYl90ZXN0ICJwcmludCBsIiAiID0gMyIgInByaW50IGwgYWZ0ZXIgcnVudG8gbG9jYWx2YXJzX2FmdGVyX2FsbG9jYSIKKworICAgICMgTGFtZSByZWdleHAuCisgICAgZ2RiX3Rlc3QgIm5leHQiICIuKiIgIm5leHQgaW4gbG9jYWx2YXJzX2FmdGVyX2FsbG9jYSgpIgorCisgICAgIyBQcmludCBlYWNoIGFyZyBhcyBhIGRvdWJsZSBjaGVjayB0byBzZWUgaWYgd2UgY2FuIHByaW50CisgICAgIyB0aGVtIGhlcmUgYXMgd2VsbCBhcyB3aXRoIGJhY2t0cmFjZS4KKworICAgIGdkYl90ZXN0ICJwcmludCBjIiAiID0gOTcgJ2EnIiAicHJpbnQgYyBpbiBsb2NhbHZhcnNfYWZ0ZXJfYWxsb2NhIgorICAgIGdkYl90ZXN0ICJwcmludCBzIiAiID0gMSIgInByaW50IHMgaW4gbG9jYWx2YXJzX2FmdGVyX2FsbG9jYSIKKyAgICBnZGJfdGVzdCAicHJpbnQgaSIgIiA9IDIiICJwcmludCBpIGluIGxvY2FsdmFyc19hZnRlcl9hbGxvY2EiCisgICAgZ2RiX3Rlc3QgInByaW50IGwiICIgPSAzIiAicHJpbnQgbCBpbiBsb2NhbHZhcnNfYWZ0ZXJfYWxsb2NhIgorCisgICAgZ2RiX3Rlc3QgImJhY2t0cmFjZSA4IiAiIzAuKmxvY2FsdmFyc19hZnRlcl9hbGxvY2EgXFwoYz05NyAnYScsIHM9MSwgaT0yLCBsPTNcXCkuKiMxLiptYWluLioiICJiYWNrdHJhY2UgYWZ0ZXIgYWxsb2NhIgorICAgIGdkYl9zdG9wX3N1cHByZXNzaW5nX3Rlc3RzOworfQorCitwcm9jIGNhbGxfYWZ0ZXJfYWxsb2NhIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKyAgICBnbG9iYWwgZ2NjX2NvbXBpbGVkCisKKyAgICBpZiB7ICEgWyBydW50byBjYWxsX2FmdGVyX2FsbG9jYV9zdWJyIF0gfSB0aGVuIHsgZ2RiX3N1cHByZXNzX3Rlc3RzOyB9CisKKyAgICAjIFByaW50IGVhY2ggYXJnIGFzIGEgZG91YmxlIGNoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gcHJpbnQKKyAgICAjIHRoZW0gaGVyZSBhcyB3ZWxsIGFzIHdpdGggYmFja3RyYWNlLgorCisgICAgaWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHJpbnQgYyIgIiA9IDk3ICdhJyIgInByaW50IGMgaW4gY2FsbF9hZnRlcl9hbGxvY2EiCisgICAgaWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHJpbnQgcyIgIiA9IDEiICJwcmludCBzIGluIGNhbGxfYWZ0ZXJfYWxsb2NhIgorICAgIGdkYl90ZXN0ICJwcmludCBpIiAiID0gMiIgInByaW50IGkgaW4gY2FsbF9hZnRlcl9hbGxvY2EiCisgICAgZ2RiX3Rlc3QgInByaW50IGwiICIgPSAzIiAicHJpbnQgbCBpbiBjYWxsX2FmdGVyX2FsbG9jYSIKKworICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CisgICAgZ2RiX3Rlc3QgImJhY2t0cmFjZSA4IiAiIzAuKmNhbGxfYWZ0ZXJfYWxsb2NhX3N1YnIgXFwoYz05NyAnYScsIHM9MSwgaT0yLCBsPTMsIHVjPTk4ICdiJywgdXM9MTEsIHVpPTEyLCB1bD0xM1xcKS4qIzEuKmNhbGxfYWZ0ZXJfYWxsb2NhIFxcKGM9OTcgJ2EnLCBzPTEsIGk9MiwgbD0zXFwpLiojMi4qbWFpbi4qIiAiYmFja3RyYWNlIGZyb20gY2FsbF9hZnRlcl9hbGxvY2Ffc3ViciIKKyAgICBnZGJfc3RvcF9zdXBwcmVzc2luZ190ZXN0czsKK30KKworIworIyBUZXN0IGZvciBhY2Nlc3NpbmcgbG9jYWwgc3RhY2sgdmFyaWFibGVzLCBiYWNrdHJhY2VzLCBmaW5pc2gsCisjIGFuZCBmaW5hbGx5IHN0ZXBwaW5nIGludG8gaW5kaXJlY3QgY2FsbHMuICBUaGUgcG9pbnQgaXMgdGhhdCBvbiB0aGUgUEEKKyMgdGhlc2UgdXNlIGEgZnVua3kgYGR5bmNhbGwnIG1lY2hhbmlzbSB3aGljaCBHREIgbmVlZHMgdG8ga25vdyBhYm91dC4KKyMKK3Byb2MgbG9jYWx2YXJzX2luX2luZGlyZWN0X2NhbGwgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorICAgIGdsb2JhbCBnY2NfY29tcGlsZWQKKworICAgICMgQ2FuIG5vdCB1c2UgInJ1bnRvIGNhbGwwYSIgYXMgY2FsbDBhIGlzIGNhbGxlZCBzZXZlcmFsIHRpbWVzCisgICAgIyBkdXJpbmcgc2luZ2xlIHJ1bi4gIEluc3RlYWQgc3RvcCBpbiBhIG1hcmtlciBmdW5jdGlvbiBhbmQKKyAgICAjIHRha2UgY29udHJvbCBmcm9tIHRoZXJlLgorICAgIGlmIHsgISBbIHJ1bnRvIG1hcmtlcl9pbmRpcmVjdF9jYWxsIF0gfSB0aGVuIHsgZ2RiX3N1cHByZXNzX3Rlc3RzOyB9CisKKyAgICAjIGJyZWFrIG9uIHRoZSBuZXh0IGNhbGwgdG8gY2FsbDBhLCB0aGVuIGRlbGV0ZSBhbGwgdGhlIGJyZWFrcG9pbnRzCisgICAgIyBhbmQgc3RhcnQgdGVzdGluZy4KKyAgICBnZGJfYnJlYWtwb2ludCBjYWxsMGEKKyAgICBnZGJfY29udGludWUgY2FsbDBhCisgICAgZGVsZXRlX2JyZWFrcG9pbnRzCisgICAgCisgICAgIyBQcmludCBlYWNoIGFyZyBhcyBhIGRvdWJsZSBjaGVjayB0byBzZWUgaWYgd2UgY2FuIHByaW50CisgICAgIyB0aGVtIGhlcmUgYXMgd2VsbCBhcyB3aXRoIGJhY2t0cmFjZS4KKworICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CisgICAgZ2RiX3Rlc3QgInByaW50IGMiICIgPSA5NyAnYSciICJwcmludCBjIGluIGxvY2FsdmFyc19pbl9pbmRpcmVjdF9jYWxsIgorICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CisgICAgZ2RiX3Rlc3QgInByaW50IHMiICIgPSAxIiAicHJpbnQgcyBpbiBsb2NhbHZhcnNfaW5faW5kaXJlY3RfY2FsbCIKKyAgICBnZGJfdGVzdCAicHJpbnQgaSIgIiA9IDIiICJwcmludCBpIGluIGxvY2FsdmFyc19pbl9pbmRpcmVjdF9jYWxsIgorICAgIGdkYl90ZXN0ICJwcmludCBsIiAiID0gMyIgInByaW50IGwgaW4gbG9jYWx2YXJzX2luX2luZGlyZWN0X2NhbGwiCisKKyAgICBpZiB7ISRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAicnM2MDAwLSotKiIgfQorICAgIGdkYl90ZXN0ICJiYWNrdHJhY2UgOCIgXAorCSIjMC4qY2FsbDBhIFxcKGM9OTcgJ2EnLCBzPTEsIGk9MiwgbD0zXFwpLiojMS4qbWFpbi4qIiBcCisJImJhY2t0cmFjZSBpbiBpbmRpcmVjdGx5IGNhbGxlZCBmdW5jdGlvbiIKKworICAgICMgCisgICAgIyAiZmluaXNoIiBicmluZ3MgdXMgYmFjayB0byBtYWluLiAgV2UgdGhlbiB3aWxsIHRyeSB0byBzdGVwIHRocm91Z2gKKyAgICAjIHRoZSBzZWNvbmQgaW5kaXJlY3QgY2FsbC4gIAorICAgICMgT24gc29tZSB0YXJnZXRzIChlLmcuIG02OGspIGdkYiB3aWxsIHN0b3AgZnJvbSB0aGUgZmluaXNoIGluIG1pZGxpbmUKKyAgICAjIG9mIHRoZSBmaXJzdCBpbmRpcmVjdCBjYWxsLiBUaGlzIGlzIGR1ZSB0byBzdGFjayBhZGp1c3RtZW50IGluc3RydWN0aW9ucworICAgICMgYWZ0ZXIgdGhlIGluZGlyZWN0IGNhbGwuIEluIHRoZXNlIGNhc2VzIHdlIHdpbGwgc3RlcCB0aWxsIHdlIGhpdCB0aGUKKyAgICAjIHNlY29uZCBpbmRpcmVjdCBjYWxsLgorICAgICMKKworICAgIHNlbmRfZ2RiICJmaW5pc2hcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwkgLXJlICJcXChcXCpwb2ludGVyX3RvX2NhbGwwYVxcKSBcXChjLCBzLCBpLCBsXFwpOy4qRmlyc3QuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2VuZF9nZGIgInN0ZXBcbiIKKwkgICAgZXhwX2NvbnRpbnVlCisJfQorCSAtcmUgIlxcKFxcKnBvaW50ZXJfdG9fY2FsbDBhXFwpIFxcKGMsIHMsIGksIGxcXCk7LipTZWNvbmQuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAiZmluaXNoIGZyb20gaW5kaXJlY3RseSBjYWxsZWQgZnVuY3Rpb24iCisJfQorCSAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJmaW5pc2ggZnJvbSBpbmRpcmVjdGx5IGNhbGxlZCBmdW5jdGlvbiIKKwkgICAgZ2RiX3N1cHByZXNzX3Rlc3RzOworCX0KKwkgZGVmYXVsdCB7IGZhaWwgImZpbmlzaCBmcm9tIGluZGlyZWN0bHkgY2FsbGVkIGZ1bmN0aW9uIiA7IGdkYl9zdXBwcmVzc190ZXN0czsgfQorICAgIH0KKworICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CisgICAgZ2RiX3Rlc3QgInN0ZXAiICJjYWxsMGEgXFwoYz05NyAnYScsIHM9MSwgaT0yLCBsPTNcXCkuKiIgXAorCSJzdGVwcGluZyBpbnRvIGluZGlyZWN0bHkgY2FsbGVkIGZ1bmN0aW9uIgorICAgIGdkYl9zdG9wX3N1cHByZXNzaW5nX3Rlc3RzOworfQorCisjCisjIFRlc3QgZm9yIHN0ZXBwaW5nIGludG8gaW5kaXJlY3QgY2FsbHMgd2hpY2ggbWF5IGhhdmUgdHJhbXBvbGluZXMgKHBvc3NpYmx5CisjIGNhc2NhZGVkKSBvbiBib3RoIHRoZSBjYWxsIHBhdGggYW5kIHRoZSBnZGJfc3VwcHJlc3NfdGVzdHM7IHBhdGguCisjIHRvIGhhbmRsZSB0cmFtcG9saW5lcy4KKyMKK3Byb2MgdGVzdF9zdGVwcGluZ19vdmVyX3RyYW1wb2xpbmVzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgICMgU3RvcCBpbiBhIG1hcmtlciBmdW5jdGlvbiBhbmQgdGFrZSBjb250cm9sIGZyb20gdGhlcmUuCisgICAgaWYgeyAhIFsgcnVudG8gbWFya2VyX2NhbGxfd2l0aF90cmFtcG9saW5lcyBdIH0gdGhlbiB7IGdkYl9zdXBwcmVzc190ZXN0czsgfQorCisgICAgIyBDYXRlciBmb3IgZ2RiIHN0b3BwaW5nIGluIG1pZGxpbmUsIHNlZSBjb21tZW50IGZvciBmaW5pc2ggYWJvdmUuCisgICAgc2VuZF9nZGIgImZpbmlzaFxuIgorICAgIGdkYl9leHBlY3QgeworCSAtcmUgIm1hcmtlcl9jYWxsX3dpdGhfdHJhbXBvbGluZXMgLi47LiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHNlbmRfZ2RiICJzdGVwXG4iCisJICAgIGV4cF9jb250aW51ZQorCX0KKwkgLXJlICJwb2ludGVyX3RvX2NhbGxfd2l0aF90cmFtcG9saW5lcy4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJmaW5pc2ggZnJvbSBtYXJrZXJfY2FsbF93aXRoX3RyYW1wb2xpbmVzIgorCX0KKwkgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAiZmluaXNoIGZyb20gbWFya2VyX2NhbGxfd2l0aF90cmFtcG9saW5lcyIKKwl9CisJIGRlZmF1bHQgeyBmYWlsICJmaW5pc2ggZnJvbSBtYXJrZXJfY2FsbF93aXRoX3RyYW1wb2xpbmVzIiA7IGdkYl9zdXBwcmVzc190ZXN0czsgfQorICAgIH0KKworICAgICMgVHJ5IHRvIHN0ZXAgaW50byB0aGUgdGFyZ2V0IGZ1bmN0aW9uLgorICAgIGdkYl90ZXN0ICJzdGVwIiAiY2FsbF93aXRoX3RyYW1wb2xpbmVzIFxcKGQxPTVcXCkuKiIgXAorCSJzdGVwcGluZyBpbnRvIGZ1bmN0aW9uIGNhbGxlZCB3aXRoIHRyYW1wb2xpbmVzIgorCisgICAgIyBNYWtlIHdlIGNhbiBiYWNrdHJhY2UgYW5kIHRoZSBhcmd1bWVudCBsb29rcyBjb3JyZWN0LiAgKi8KKyAgICBnZGJfdGVzdCAiYmFja3RyYWNlIDgiICIjMC4qY2FsbF93aXRoX3RyYW1wb2xpbmVzIFxcKGQxPTVcXCkuKjEuKm1haW4uKiIgXAorCSJiYWNrdHJhY2UgdGhyb3VnaCBjYWxsIHdpdGggdHJhbXBvbGluZXMiCisKKyAgICAjIE1ha2Ugc3VyZSB3ZSBjYW4gZ2V0IGJhY2sgdG8gbWFpbi4KKyAgICAjIFN0ZXBwaW5nIGJhY2sgdG8gbWFpbiBtaWdodCBzdG9wIGFnYWluIGFmdGVyIHRoZSBnZGJfc3VwcHJlc3NfdGVzdHM7IHN0YXRlbWVudAorICAgICMgb3IgaW1tZWRpYXRlbHkgdHJhbnNmZXIgY29udHJvbCBiYWNrIHRvIG1haW4gaWYgb3B0aW1pemF0aW9ucworICAgICMgYXJlIHBlcmZvcm1lZC4KKyAgICBzZW5kX2dkYiAic3RlcFxuIgorICAgIGdkYl9leHBlY3QgeworCSAtcmUgIm1haW4gLiogYXQuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAic3RlcHBpbmcgYmFjayB0byBtYWluIGZyb20gZnVuY3Rpb24gY2FsbGVkIHdpdGggdHJhbXBvbGluZXMiIDsKKwl9CisJIC1yZSAiXH0uKkVuZCBvZiBjYWxsX3dpdGhfdHJhbXBvbGluZXMuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2VuZF9nZGIgInN0ZXBcbiIKKwkgICAgZXhwX2NvbnRpbnVlCisJfQorCSAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJzdGVwcGluZyBiYWNrIHRvIG1haW4gZnJvbSBmdW5jdGlvbiBjYWxsZWQgd2l0aCB0cmFtcG9saW5lcyIKKwl9CisJIGRlZmF1bHQgeyBmYWlsICJzdGVwcGluZyBiYWNrIHRvIG1haW4gZnJvbSBmdW5jdGlvbiBjYWxsZWQgd2l0aCB0cmFtcG9saW5lcyIgOyBnZGJfc3VwcHJlc3NfdGVzdHM7IH0KKyAgICB9CisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7Cit9CisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKK2lmIFtpc3RhcmdldCAibWlwcyp0eDM5LSoiXSB7CisgICAgc2V0IHRpbWVvdXQgMzAwCit9IGVsc2VpZiBbaXN0YXJnZXQgImhwcGEqLWhwLWhwdXgqIl0gdGhlbiB7CisgICAgc2V0IHRpbWVvdXQgMjQwCit9IGVsc2UgeworICAgIHNldCB0aW1lb3V0IDYwCit9CisKKyMgRGV0ZXJtaW5lIGV4cGVjdGVkIG91dHB1dCBmb3IgdW5zaWduZWQgbG9uZyB2YXJpYWJsZXMsCisjIHRoZSBvdXRwdXQgdmFyaWVzIHdpdGggc2l6ZW9mICh1bnNpZ25lZCBsb25nKS4KKworc2V0IHRhcmdldF9zaXplb2ZfbG9uZyA0CitzZW5kX2dkYiAicHJpbnQgc2l6ZW9mIChsb25nKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSA0LiokZ2RiX3Byb21wdCAkIiB7IH0KKyAgICAtcmUgIi5cWzAtOVxdKiA9IDguKiRnZGJfcHJvbXB0ICQiIHsgc2V0IHRhcmdldF9zaXplb2ZfbG9uZyA4IH0gCisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgZmFpbCAiZ2V0dGluZyBzaXplb2YgbG9uZyIKKyAgICB9CisgICAgZGVmYXVsdAl7IGZhaWwgIih0aW1lb3V0KSBnZXR0aW5nIHNpemVvZiBsb25nIiB9Cit9CisKK3NldCB0YXJnZXRfc2l6ZW9mX2ludCA0CitzZW5kX2dkYiAicHJpbnQgc2l6ZW9mIChpbnQpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDIuKiRnZGJfcHJvbXB0ICQiIHsgc2V0IHRhcmdldF9zaXplb2ZfaW50IDIgfQorICAgIC1yZSAiLlxbMC05XF0qID0gNC4qJGdkYl9wcm9tcHQgJCIgeyB9CisgICAgLXJlICIuXFswLTlcXSogPSA4LiokZ2RiX3Byb21wdCAkIiB7IHNldCB0YXJnZXRfc2l6ZW9mX2ludCA4IH0gCisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgZmFpbCAiZ2V0dGluZyBzaXplb2YgdW5zaWduZWQgbG9uZyIKKyAgICB9CisgICAgZGVmYXVsdAl7IGZhaWwgIih0aW1lb3V0KSBnZXR0aW5nIHNpemVvZiBpbnQiIH0KK30KKworc2V0IHRhcmdldF9iaWdlbmRpYW5fcCAxCitzZW5kX2dkYiAic2hvdyBlbmRpYW5cbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipsaXR0bGUgZW5kaWFuLiokZ2RiX3Byb21wdCAkIiB7IHNldCB0YXJnZXRfYmlnZW5kaWFuX3AgMCB9CisgICAgLXJlICIuKmJpZyBlbmRpYW4uKiRnZGJfcHJvbXB0ICQiIHsgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJIGZhaWwgImdldHRpbmcgdGFyZ2V0IGVuZGlhbiIKKyAgICB9CisgICAgZGVmYXVsdAl7IGZhaWwgIih0aW1lb3V0KSBnZXR0aW5nIHRhcmdldCBlbmRpYW4iIH0KK30KKworIyBQZXJmb3JtIHRlc3RzCisKK2ludGVncmFsX2FyZ3MKK2Z1bmNhcmdzX3JlbG9hZAordW5zaWduZWRfaW50ZWdyYWxfYXJncworZnVuY2FyZ3NfcmVsb2FkCitmbG9hdF9hbmRfaW50ZWdyYWxfYXJncworZnVuY2FyZ3NfcmVsb2FkCitwb2ludGVyX2FyZ3MKK2Z1bmNhcmdzX3JlbG9hZAorc3RydWN0c19ieV9yZWZlcmVuY2UKK2Z1bmNhcmdzX3JlbG9hZAorc3RydWN0c19ieV92YWx1ZQorZnVuY2FyZ3NfcmVsb2FkCitkaXNjYXJkX2FuZF9zaHVmZmxlCitmdW5jYXJnc19yZWxvYWQKK3NodWZmbGVfcm91bmRfcm9iaW4KK2Z1bmNhcmdzX3JlbG9hZAorcmVjdXJzaXZlX3N0cnVjdHNfYnlfdmFsdWUKK2Z1bmNhcmdzX3JlbG9hZAorbG9jYWx2YXJzX2FmdGVyX2FsbG9jYQorZnVuY2FyZ3NfcmVsb2FkCitjYWxsX2FmdGVyX2FsbG9jYQorZnVuY2FyZ3NfcmVsb2FkCitsb2NhbHZhcnNfaW5faW5kaXJlY3RfY2FsbAorZnVuY2FyZ3NfcmVsb2FkCit0ZXN0X3N0ZXBwaW5nX292ZXJfdHJhbXBvbGluZXMKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvZ2RidmFycy5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2dkYnZhcnMuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjM3ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2dkYnZhcnMuZXhwCkBAIC0wLDAgKzEsMTE3IEBACisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAoZm5mQGN5Z251cy5jb20pCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworcHJvYyB0ZXN0X2NvbnZlbmllbmNlX3ZhcmlhYmxlcyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIGdkYl90ZXN0ICJzZXQgXCRmb28gPSAxMDEiCSIiIFwKKwkiU2V0IGEgbmV3IGNvbnZlbmllbmNlIHZhcmlhYmxlIgorCisgICAgZ2RiX3Rlc3QgInByaW50IFwkZm9vIgkJIiA9IDEwMSIgXAorCSJQcmludCBjb250ZW50cyBvZiBuZXcgY29udmVuaWVuY2UgdmFyaWFibGUiCisKKyAgICBnZGJfdGVzdCAic2V0IFwkZm9vID0gMzAxIgkiIiBcCisJIlNldCBjb252ZW5pZW5jZSB2YXJpYWJsZSB0byBhIG5ldyB2YWx1ZSIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJGZvbyIJCSIgPSAzMDEiIFwKKwkiUHJpbnQgbmV3IGNvbnRlbnRzIG9mIGNvbnZlbmllbmNlIHZhcmlhYmxlIgorCisgICAgZ2RiX3Rlc3QgInNldCBcJF8gPSAxMSIJCSIiIFwKKwkiU2V0IGNvbnZlbmllbmNlIHZhcmlhYmxlIFwkXyIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJF8iCQkiID0gMTEiIFwKKwkiUHJpbnQgY29udGVudHMgb2YgY29udmVuaWVuY2UgdmFyaWFibGUgXCRfIgorCisgICAgZ2RiX3Rlc3QgInByaW50IFwkZm9vICsgMTAiCSIgPSAzMTEiIFwKKwkiVXNlIGNvbnZlbmllbmNlIHZhcmlhYmxlIGluIGFyaXRobWV0aWMgZXhwcmVzc2lvbiIKKworICAgIGdkYl90ZXN0ICJwcmludCAoXCRmb28gPSAzMikgKyA0IgkiID0gMzYiIFwKKwkiVXNlIGNvbnZlbmllbmNlIHZhcmlhYmxlIGFzc2lnbm1lbnQgaW4gYXJpdGhtZXRpYyBleHByZXNzaW9uIgorCisgICAgZ2RiX3Rlc3QgInByaW50IFwkYmFyIgkJIiA9IHZvaWQiIFwKKwkiUHJpbnQgY29udGVudHMgb2YgdW5pbml0aWFsaXplZCBjb252ZW5pZW5jZSB2YXJpYWJsZSIKK30KKworcHJvYyB0ZXN0X3ZhbHVlX2hpc3Rvcnkge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBnZGJfdGVzdCAicHJpbnQgMTAxIgkiXFxcJDEgPSAxMDEiIFwKKwkiU2V0IHZhbHVlLWhpc3RvcnlcWzFcXSB1c2luZyBcJDEiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgMTAyIiAJIlxcXCQyID0gMTAyIiBcCisJIlNldCB2YWx1ZS1oaXN0b3J5XFsyXF0gdXNpbmcgXCQyIgorCisgICAgZ2RiX3Rlc3QgInByaW50IDEwMyIJIlxcXCQzID0gMTAzIiBcCisJIlNldCB2YWx1ZS1oaXN0b3J5XFszXF0gdXNpbmcgXCQzIgorCisgICAgZ2RiX3Rlc3QgInByaW50IFwkXCQiCSJcXFwkNCA9IDEwMiIgXAorCSJQcmludCB2YWx1ZS1oaXN0b3J5XFtNQVgtMVxdIHVzaW5nIGlucGxpY2l0IGluZGV4IFwkXCQiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgXCRcJCIJIlxcXCQ1ID0gMTAzIiBcCisJIlByaW50IHZhbHVlLWhpc3RvcnlcW01BWC0xXF0gYWdhaW4gdXNpbmcgaW1wbGljaXQgaW5kZXggXCRcJCIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJCIJIlxcXCQ2ID0gMTAzIiBcCisJIlByaW50IHZhbHVlLWhpc3RvcnlcW01BWFxdIHVzaW5nIGltcGxpY2l0IGluZGV4IFwkIgorCisgICAgZ2RiX3Rlc3QgInByaW50IFwkXCQyIgkiXFxcJDcgPSAxMDIiIFwKKwkiUHJpbnQgdmFsdWUtaGlzdG9yeVxbTUFYLTJcXSB1c2luZyBleHBsaWNpdCBpbmRleCBcJFwkMiIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJDAiCSJcXFwkOCA9IDEwMiIgXAorCSJQcmludCB2YWx1ZS1oaXN0b3J5XFtNQVhcXSB1c2luZyBleHBsaWNpdCBpbmRleCBcJDAiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgMTA4IgkiXFxcJDkgPSAxMDgiICIiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgXCRcJDAiCSJcXFwkMTAgPSAxMDgiIFwKKwkiUHJpbnQgdmFsdWUtaGlzdG9yeVxbTUFYXF0gdXNpbmcgZXhwbGljaXQgaW5kZXggXCRcJDAiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgXCQxIgkiXFxcJDExID0gMTAxIiBcCisJIlByaW50IHZhbHVlLWhpc3RvcnlcWzFcXSB1c2luZyBleHBsaWNpdCBpbmRleCBcJDEiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgXCQyIgkiXFxcJDEyID0gMTAyIiBcCisJIlByaW50IHZhbHVlLWhpc3RvcnlcWzJcXSB1c2luZyBleHBsaWNpdCBpbmRleCBcJDIiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgXCQzIgkiXFxcJDEzID0gMTAzIiBcCisJIlByaW50IHZhbHVlLWhpc3RvcnlcWzNcXSB1c2luZyBleHBsaWNpdCBpbmRleCBcJDMiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgXCQtMyIJIlxcXCQxNCA9IDEwMCIgXAorCSJQcmludCAodmFsdWUtaGlzdG9yeVxbTUFYXF0gLSAzKSB1c2luZyBpbXBsaWNpdCBpbmRleCBcJCIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJDEgKyAzIgkiXFxcJDE1ID0gMTA0IiBcCisJIlVzZSB2YWx1ZS1oaXN0b3J5IGVsZW1lbnQgaW4gYXJpdGhtZXRpYyBleHByZXNzaW9uIgorfQorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCitzZW5kX2dkYiAic2V0IHByaW50IHNldmVuYml0LXN0cmluZ3NcbiIgOyBnZGJfZXhwZWN0IC1yZSAiLiokZ2RiX3Byb21wdCAkIgorCit0ZXN0X3ZhbHVlX2hpc3RvcnkKK3Rlc3RfY29udmVuaWVuY2VfdmFyaWFibGVzCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2dyYnguYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvZ3JieC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZjczMjMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2dyYnguYwpAQCAtMCwwICsxLDEwIEBACitzdGF0aWMgaW50IGdyYnh4IF9fYXR0cmlidXRlX18gKChzZWN0aW9uICgiLmRhdGEwMyIpKSkgPSAnZycgKyAncicgKyAnYicgKyAneCc7CisKK2ludCBncmJ4IChpbnQgeCkKK3sKKyAgaWYgKHgpCisgICAgcmV0dXJuIGdyYnh4OworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvaGVscC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2hlbHAuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YmZkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2hlbHAuZXhwCkBAIC0wLDAgKzEsNTQyIEBACisjICAgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTk3LCAxOTk4CisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llLiAocm9iQGN5Z251cy5jb20pCisKKyMKKyMgdGVzdCBnZGIgaGVscCBjb21tYW5kcworIworCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworZ2RiX3N0YXJ0CisKKyMgZm9yY2UgdGhlIGhlaWdodCBvZiB0aGUgZGVidWdnZXIgdG8gYmUgcHJldHR5IGxhcmdlIHNvIG5vIHBhZ2VycyBnZXR1c2VkCitnZGJfdGVzdCAic2V0IGhlaWdodCA0MDAiICIiICJ0ZXN0IHNldCBoZWlnaHQiCisKKyMgdXNlIGEgbGFyZ2VyIGV4cGVjdCBpbnB1dCBidWZmZXIgZm9yIGxvbmcgaGVscCBvdXRwdXRzLgorIyB0ZXN0IGhlbHAgYWRkLXN5bWJvbC1maWxlCitnZGJfdGVzdCAiaGVscCBhZGQtc3ltYm9sLWZpbGUiICJVc2FnZTogYWRkLXN5bWJvbC1maWxlIEZJTEUgQUREUi4qXFtcclxuXF0rTG9hZCB0aGUgc3ltYm9scyBmcm9tIEZJTEUsIGFzc3VtaW5nIEZJTEUgaGFzIGJlZW4gZHluYW1pY2FsbHkgbG9hZGVkLi4qXFtcclxuXF0rQUREUiBpcyB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgZmlsZVwncyB0ZXh0LiIgICJoZWxwIGFkZC1zeW1ib2wtZmlsZSIKKyMgdGVzdCBoZWxwIGFsaWFzZXMKK2dkYl90ZXN0ICJoZWxwIGFsaWFzZXMiICJBbGlhc2VzIG9mIG90aGVyIGNvbW1hbmRzLi4qXFtcclxuXF0rTGlzdCBvZiBjb21tYW5kc1w6LipcW1xyXG5cXStUeXBlIFwiaGVscFwiIGZvbGxvd2VkIGJ5IGNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLi4qXFtcclxuXF0rQ29tbWFuZCBuYW1lIGFiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQgaWYgdW5hbWJpZ3VvdXMuIiAiaGVscCBhbGlhc2VzIgorZ2RiX3Rlc3QgImhlbHAgYXR0YWNoIiAiQXR0YWNoIHRvIGEgcHJvY2VzcyBvciBmaWxlIG91dHNpZGUgb2YgR0RCLi4qXFtcclxuXF0rVGhpcyBjb21tYW5kIGF0dGFjaGVzIHRvIGFub3RoZXIgdGFyZ2V0LCBvZiB0aGUgc2FtZSB0eXBlIGFzIHlvdXIgbGFzdC4qXFtcclxuXF0rXCJ0YXJnZXRcIiBjb21tYW5kIC5cImluZm8gZmlsZXNcIiB3aWxsIHNob3cgeW91ciB0YXJnZXQgc3RhY2suKlxbXHJcblxdK1RoZSBjb21tYW5kIG1heSB0YWtlIGFzIGFyZ3VtZW50IGEgcHJvY2VzcyBpZCBvciBhIGRldmljZSBmaWxlLi4qXFtcclxuXF0rRm9yIGEgcHJvY2VzcyBpZCwgeW91IG11c3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHNlbmQgdGhlIHByb2Nlc3MgYSBzaWduYWwsLipcW1xyXG5cXSthbmQgaXQgbXVzdCBoYXZlIHRoZSBzYW1lIGVmZmVjdGl2ZSB1aWQgYXMgdGhlIGRlYnVnZ2VyLi4qXFtcclxuXF0rV2hlbiB1c2luZyBcImF0dGFjaFwiIHdpdGggYSBwcm9jZXNzIGlkLCB0aGUgZGVidWdnZXIgZmluZHMgdGhlLipcW1xyXG5cXStwcm9ncmFtIHJ1bm5pbmcgaW4gdGhlIHByb2Nlc3MsIGxvb2tpbmcgZmlyc3QgaW4gdGhlIGN1cnJlbnQgd29ya2luZy4qXFtcclxuXF0rZGlyZWN0b3J5LCBvciAuaWYgbm90IGZvdW5kIHRoZXJlLiB1c2luZyB0aGUgc291cmNlIGZpbGUgc2VhcmNoIHBhdGguKlxbXHJcblxdK1xcKHNlZSB0aGUgXCJkaXJlY3RvcnlcIiBjb21tYW5kXFwpLiAgWW91IGNhbiBhbHNvIHVzZSB0aGUgXCJmaWxlXCIgY29tbWFuZC4qXFtcclxuXF0rdG8gc3BlY2lmeSB0aGUgcHJvZ3JhbSwgYW5kIHRvIGxvYWQgaXRzIHN5bWJvbCB0YWJsZS4iICJoZWxwIGF0dGFjaCIKKyMgdGVzdCBoZWxwIGJyZWFrcG9pbnQgImIiIGFiYnJldmlhdGlvbgorZ2RiX3Rlc3QgImhlbHAgYiIgIlNldCBicmVha3BvaW50IGF0IHNwZWNpZmllZCBsaW5lIG9yIGZ1bmN0aW9uLi4qXFtcclxuXF0rQXJndW1lbnQgbWF5IGJlIGxpbmUgbnVtYmVyLCBmdW5jdGlvbiBuYW1lLCBvciBcIlxbKlxdXCIgYW5kIGFuIGFkZHJlc3MuLipcW1xyXG5cXStJZiBsaW5lIG51bWJlciBpcyBzcGVjaWZpZWQsIGJyZWFrIGF0IHN0YXJ0IG9mIGNvZGUgZm9yIHRoYXQgbGluZS4uKlxbXHJcblxdK0lmIGZ1bmN0aW9uIGlzIHNwZWNpZmllZCwgYnJlYWsgYXQgc3RhcnQgb2YgY29kZSBmb3IgdGhhdCBmdW5jdGlvbi4uKlxbXHJcblxdK0lmIGFuIGFkZHJlc3MgaXMgc3BlY2lmaWVkLCBicmVhayBhdCB0aGF0IGV4YWN0IGFkZHJlc3MuLipcW1xyXG5cXStXaXRoIG5vIGFyZywgdXNlcyBjdXJyZW50IGV4ZWN1dGlvbiBhZGRyZXNzIG9mIHNlbGVjdGVkIHN0YWNrIGZyYW1lLi4qXFtcclxuXF0rVGhpcyBpcyB1c2VmdWwgZm9yIGJyZWFraW5nIG9uIHJldHVybiB0byBhIHN0YWNrIGZyYW1lLi4qXFtcclxuXF0rTXVsdGlwbGUgYnJlYWtwb2ludHMgYXQgb25lIHBsYWNlIGFyZSBwZXJtaXR0ZWQsIGFuZCB1c2VmdWwgaWYgY29uZGl0aW9uYWwuLipcW1xyXG5cXStEbyBcImhlbHAgYnJlYWtwb2ludHNcIiBmb3IgaW5mbyBvbiBvdGhlciBjb21tYW5kcyBkZWFsaW5nIHdpdGggYnJlYWtwb2ludHMuIiAiaGVscCBicmVha3BvaW50IFwiYlwiIGFiYnJldmlhdGlvbiIKKyMgdGVzdCBoZWxwIGJyZWFrcG9pbnQgImJyIiBhYmJyZXZpYXRpb24KK2dkYl90ZXN0ICJoZWxwIGJyIiAiU2V0IGJyZWFrcG9pbnQgYXQgc3BlY2lmaWVkIGxpbmUgb3IgZnVuY3Rpb24uLipcW1xyXG5cXStBcmd1bWVudCBtYXkgYmUgbGluZSBudW1iZXIsIGZ1bmN0aW9uIG5hbWUsIG9yIFwiXFsqXF1cIiBhbmQgYW4gYWRkcmVzcy4uKlxbXHJcblxdK0lmIGxpbmUgbnVtYmVyIGlzIHNwZWNpZmllZCwgYnJlYWsgYXQgc3RhcnQgb2YgY29kZSBmb3IgdGhhdCBsaW5lLi4qXFtcclxuXF0rSWYgZnVuY3Rpb24gaXMgc3BlY2lmaWVkLCBicmVhayBhdCBzdGFydCBvZiBjb2RlIGZvciB0aGF0IGZ1bmN0aW9uLi4qXFtcclxuXF0rSWYgYW4gYWRkcmVzcyBpcyBzcGVjaWZpZWQsIGJyZWFrIGF0IHRoYXQgZXhhY3QgYWRkcmVzcy4uKlxbXHJcblxdK1dpdGggbm8gYXJnLCB1c2VzIGN1cnJlbnQgZXhlY3V0aW9uIGFkZHJlc3Mgb2Ygc2VsZWN0ZWQgc3RhY2sgZnJhbWUuLipcW1xyXG5cXStUaGlzIGlzIHVzZWZ1bCBmb3IgYnJlYWtpbmcgb24gcmV0dXJuIHRvIGEgc3RhY2sgZnJhbWUuLipcW1xyXG5cXStNdWx0aXBsZSBicmVha3BvaW50cyBhdCBvbmUgcGxhY2UgYXJlIHBlcm1pdHRlZCwgYW5kIHVzZWZ1bCBpZiBjb25kaXRpb25hbC4uKlxbXHJcblxdK0RvIFwiaGVscCBicmVha3BvaW50c1wiIGZvciBpbmZvIG9uIG90aGVyIGNvbW1hbmRzIGRlYWxpbmcgd2l0aCBicmVha3BvaW50cy4iICJoZWxwIGJyZWFrcG9pbnQgXCJiclwiIGFiYnJldmlhdGlvbiIKKyMgdGVzdCBoZWxwIGJyZWFrcG9pbnQgImJyZSIgYWJicmV2aWF0aW9uCitnZGJfdGVzdCAiaGVscCBicmUiICJTZXQgYnJlYWtwb2ludCBhdCBzcGVjaWZpZWQgbGluZSBvciBmdW5jdGlvbi4uKlxbXHJcblxdK0FyZ3VtZW50IG1heSBiZSBsaW5lIG51bWJlciwgZnVuY3Rpb24gbmFtZSwgb3IgXCJcWypcXVwiIGFuZCBhbiBhZGRyZXNzLi4qXFtcclxuXF0rSWYgbGluZSBudW1iZXIgaXMgc3BlY2lmaWVkLCBicmVhayBhdCBzdGFydCBvZiBjb2RlIGZvciB0aGF0IGxpbmUuLipcW1xyXG5cXStJZiBmdW5jdGlvbiBpcyBzcGVjaWZpZWQsIGJyZWFrIGF0IHN0YXJ0IG9mIGNvZGUgZm9yIHRoYXQgZnVuY3Rpb24uLipcW1xyXG5cXStJZiBhbiBhZGRyZXNzIGlzIHNwZWNpZmllZCwgYnJlYWsgYXQgdGhhdCBleGFjdCBhZGRyZXNzLi4qXFtcclxuXF0rV2l0aCBubyBhcmcsIHVzZXMgY3VycmVudCBleGVjdXRpb24gYWRkcmVzcyBvZiBzZWxlY3RlZCBzdGFjayBmcmFtZS4uKlxbXHJcblxdK1RoaXMgaXMgdXNlZnVsIGZvciBicmVha2luZyBvbiByZXR1cm4gdG8gYSBzdGFjayBmcmFtZS4uKlxbXHJcblxdK011bHRpcGxlIGJyZWFrcG9pbnRzIGF0IG9uZSBwbGFjZSBhcmUgcGVybWl0dGVkLCBhbmQgdXNlZnVsIGlmIGNvbmRpdGlvbmFsLi4qXFtcclxuXF0rRG8gXCJoZWxwIGJyZWFrcG9pbnRzXCIgZm9yIGluZm8gb24gb3RoZXIgY29tbWFuZHMgZGVhbGluZyB3aXRoIGJyZWFrcG9pbnRzLiIgImhlbHAgYnJlYWtwb2ludCBcImJyZVwiIGFiYnJldmlhdGlvbiIKKyMgdGVzdCBoZWxwIGJyZWFrcG9pbnQgImJyZWEiIGFiYnJldmlhdGlvbgorZ2RiX3Rlc3QgImhlbHAgYnJlYSIgIlNldCBicmVha3BvaW50IGF0IHNwZWNpZmllZCBsaW5lIG9yIGZ1bmN0aW9uLi4qXFtcclxuXF0rQXJndW1lbnQgbWF5IGJlIGxpbmUgbnVtYmVyLCBmdW5jdGlvbiBuYW1lLCBvciBcIlxbKlxdXCIgYW5kIGFuIGFkZHJlc3MuLipcW1xyXG5cXStJZiBsaW5lIG51bWJlciBpcyBzcGVjaWZpZWQsIGJyZWFrIGF0IHN0YXJ0IG9mIGNvZGUgZm9yIHRoYXQgbGluZS4uKlxbXHJcblxdK0lmIGZ1bmN0aW9uIGlzIHNwZWNpZmllZCwgYnJlYWsgYXQgc3RhcnQgb2YgY29kZSBmb3IgdGhhdCBmdW5jdGlvbi4uKlxbXHJcblxdK0lmIGFuIGFkZHJlc3MgaXMgc3BlY2lmaWVkLCBicmVhayBhdCB0aGF0IGV4YWN0IGFkZHJlc3MuLipcW1xyXG5cXStXaXRoIG5vIGFyZywgdXNlcyBjdXJyZW50IGV4ZWN1dGlvbiBhZGRyZXNzIG9mIHNlbGVjdGVkIHN0YWNrIGZyYW1lLi4qXFtcclxuXF0rVGhpcyBpcyB1c2VmdWwgZm9yIGJyZWFraW5nIG9uIHJldHVybiB0byBhIHN0YWNrIGZyYW1lLi4qXFtcclxuXF0rTXVsdGlwbGUgYnJlYWtwb2ludHMgYXQgb25lIHBsYWNlIGFyZSBwZXJtaXR0ZWQsIGFuZCB1c2VmdWwgaWYgY29uZGl0aW9uYWwuLipcW1xyXG5cXStEbyBcImhlbHAgYnJlYWtwb2ludHNcIiBmb3IgaW5mbyBvbiBvdGhlciBjb21tYW5kcyBkZWFsaW5nIHdpdGggYnJlYWtwb2ludHMuIiAiaGVscCBicmVha3BvaW50IFwiYnJlYVwiIGFiYnJldmlhdGlvbiIKKyMgdGVzdCBoZWxwIGJyZWFrcG9pbnQgImJyZWFrIiBhYmJyZXZpYXRpb24KK2dkYl90ZXN0ICJoZWxwIGJyZWFrIiAiU2V0IGJyZWFrcG9pbnQgYXQgc3BlY2lmaWVkIGxpbmUgb3IgZnVuY3Rpb24uLipcW1xyXG5cXStBcmd1bWVudCBtYXkgYmUgbGluZSBudW1iZXIsIGZ1bmN0aW9uIG5hbWUsIG9yIFwiXFsqXF1cIiBhbmQgYW4gYWRkcmVzcy4uKlxbXHJcblxdK0lmIGxpbmUgbnVtYmVyIGlzIHNwZWNpZmllZCwgYnJlYWsgYXQgc3RhcnQgb2YgY29kZSBmb3IgdGhhdCBsaW5lLi4qXFtcclxuXF0rSWYgZnVuY3Rpb24gaXMgc3BlY2lmaWVkLCBicmVhayBhdCBzdGFydCBvZiBjb2RlIGZvciB0aGF0IGZ1bmN0aW9uLi4qXFtcclxuXF0rSWYgYW4gYWRkcmVzcyBpcyBzcGVjaWZpZWQsIGJyZWFrIGF0IHRoYXQgZXhhY3QgYWRkcmVzcy4uKlxbXHJcblxdK1dpdGggbm8gYXJnLCB1c2VzIGN1cnJlbnQgZXhlY3V0aW9uIGFkZHJlc3Mgb2Ygc2VsZWN0ZWQgc3RhY2sgZnJhbWUuLipcW1xyXG5cXStUaGlzIGlzIHVzZWZ1bCBmb3IgYnJlYWtpbmcgb24gcmV0dXJuIHRvIGEgc3RhY2sgZnJhbWUuLipcW1xyXG5cXStNdWx0aXBsZSBicmVha3BvaW50cyBhdCBvbmUgcGxhY2UgYXJlIHBlcm1pdHRlZCwgYW5kIHVzZWZ1bCBpZiBjb25kaXRpb25hbC4uKlxbXHJcblxdK0RvIFwiaGVscCBicmVha3BvaW50c1wiIGZvciBpbmZvIG9uIG90aGVyIGNvbW1hbmRzIGRlYWxpbmcgd2l0aCBicmVha3BvaW50cy4iICJoZWxwIGJyZWFrcG9pbnQgXCJicmVha1wiIGFiYnJldmlhdGlvbiIKKyMgdGVzdCBoZWxwIGJyZWFrcG9pbnRzCitnZGJfdGVzdCAiaGVscCBicmVha3BvaW50cyIgIk1ha2luZyBwcm9ncmFtIHN0b3AgYXQgY2VydGFpbiBwb2ludHMuLipcW1xyXG5cXStMaXN0IG9mIGNvbW1hbmRzXDouKlxbXHJcblxdK2F3YXRjaCAtLSBTZXQgYSB3YXRjaHBvaW50IGZvciBhbiBleHByZXNzaW9uLipcW1xyXG5cXSticmVhayAtLSBTZXQgYnJlYWtwb2ludCBhdCBzcGVjaWZpZWQgbGluZSBvciBmdW5jdGlvbi4qXFtcclxuXF0rY2F0Y2ggLS0gU2V0IGNhdGNocG9pbnRzIHRvIGNhdGNoIGV2ZW50cy4qXFtcclxuXF0rY2xlYXIgLS0gQ2xlYXIgYnJlYWtwb2ludCBhdCBzcGVjaWZpZWQgbGluZSBvciBmdW5jdGlvbi4qXFtcclxuXF0rY29tbWFuZHMgLS0gU2V0IGNvbW1hbmRzIHRvIGJlIGV4ZWN1dGVkIHdoZW4gYSBicmVha3BvaW50IGlzIGhpdC4qXFtcclxuXF0rY29uZGl0aW9uIC0tIFNwZWNpZnkgYnJlYWtwb2ludCBudW1iZXIgTiB0byBicmVhayBvbmx5IGlmIENPTkQgaXMgdHJ1ZS4qXFtcclxuXF0rZGVsZXRlIC0tIERlbGV0ZSBzb21lIGJyZWFrcG9pbnRzIG9yIGF1dG8tZGlzcGxheSBleHByZXNzaW9ucy4qXFtcclxuXF0rZGlzYWJsZSAtLSBEaXNhYmxlIHNvbWUgYnJlYWtwb2ludHMuKlxbXHJcblxdK2VuYWJsZSAtLSBFbmFibGUgc29tZSBicmVha3BvaW50cy4qXFtcclxuXF0raGJyZWFrIC0tIFNldCBhIGhhcmR3YXJlIGFzc2lzdGVkICBicmVha3BvaW50LipcW1xyXG5cXStpZ25vcmUgLS0gU2V0IGlnbm9yZS1jb3VudCBvZiBicmVha3BvaW50IG51bWJlciBOIHRvIENPVU5ULipcW1xyXG5cXStyd2F0Y2ggLS0gU2V0IGEgcmVhZCB3YXRjaHBvaW50IGZvciBhbiBleHByZXNzaW9uLipcW1xyXG5cXSt0YnJlYWsgLS0gU2V0IGEgdGVtcG9yYXJ5IGJyZWFrcG9pbnQuKlxbXHJcblxdK3RjYXRjaCAtLSBTZXQgdGVtcG9yYXJ5IGNhdGNocG9pbnRzIHRvIGNhdGNoIGV2ZW50cy4qXFtcclxuXF0rdGhicmVhayAtLSBTZXQgYSB0ZW1wb3JhcnkgaGFyZHdhcmUgYXNzaXN0ZWQgYnJlYWtwb2ludC4qXFtcclxuXF0rd2F0Y2ggLS0gU2V0IGEgd2F0Y2hwb2ludCBmb3IgYW4gZXhwcmVzc2lvbi4qXFtcclxuXF0rVHlwZSBcImhlbHBcIiBmb2xsb3dlZCBieSBjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4uKlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLiIgImhlbHAgYnJlYWtwb2ludHMiCisjIHRlc3QgaGVscCBiYWNrdHJhY2UgImJ0IiBhYmJyZXZpYXRpb24KK2dkYl90ZXN0ICJoZWxwIGJ0IiAiUHJpbnQgYmFja3RyYWNlIG9mIGFsbCBzdGFjayBmcmFtZXMsIG9yIGlubmVybW9zdCBDT1VOVCBmcmFtZXMuLipcW1xyXG5cXStXaXRoIGEgbmVnYXRpdmUgYXJndW1lbnQsIHByaW50IG91dGVybW9zdCAtQ09VTlQgZnJhbWVzLi4qXFtcclxuXF0rVXNlIG9mIHRoZSAnZnVsbCcgcXVhbGlmaWVyIGFsc28gcHJpbnRzIHRoZSB2YWx1ZXMgb2YgdGhlIGxvY2FsIHZhcmlhYmxlcy4iICJoZWxwIGJhY2t0cmFjZSBcImJ0XCIgYWJicmV2aWF0aW9uIgorIyB0ZXN0IGhlbHAgYmFja3RyYWNlCitnZGJfdGVzdCAiaGVscCBiYWNrdHJhY2UiICJQcmludCBiYWNrdHJhY2Ugb2YgYWxsIHN0YWNrIGZyYW1lcywgb3IgaW5uZXJtb3N0IENPVU5UIGZyYW1lcy4uKlxbXHJcblxdK1dpdGggYSBuZWdhdGl2ZSBhcmd1bWVudCwgcHJpbnQgb3V0ZXJtb3N0IC1DT1VOVCBmcmFtZXMuLipcW1xyXG5cXStVc2Ugb2YgdGhlICdmdWxsJyBxdWFsaWZpZXIgYWxzbyBwcmludHMgdGhlIHZhbHVlcyBvZiB0aGUgbG9jYWwgdmFyaWFibGVzLiIgImhlbHAgYmFja3RyYWNlIgorIyB0ZXN0IGhlbHAgY29udGludWUgImMiIGFiYnJldmlhdGlvbgorZ2RiX3Rlc3QgImhlbHAgYyIgIkNvbnRpbnVlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQuKiIgICJoZWxwIGNvbnRpbnVlIFwiY1wiIGFiYnJldmlhdGlvbiIKKyMgdGVzdCBoZWxwIGNvbnRpbnVlCitnZGJfdGVzdCAiaGVscCBjb250aW51ZSIgIkNvbnRpbnVlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQuKiIgICJoZWxwIGNvbnRpbnVlIgorIyB0ZXN0IGhlbHAgY2FsbAorZ2RiX3Rlc3QgImhlbHAgY2FsbCIgIkNhbGwgYSBmdW5jdGlvbi4qIiAgImhlbHAgY2FsbCIKKyMgdGVzdCBoZWxwIGNhdGNoCitnZGJfdGVzdCAiaGVscCBjYXRjaCIgIlNldCBjYXRjaHBvaW50cyB0byBjYXRjaCBldmVudHMuKlJhaXNlZCBzaWduYWxzIG1heSBiZSBjYXVnaHQ6LipjYXRjaCBzaWduYWwuKmFsbCBzaWduYWxzLipjYXRjaCBzaWduYWwuKnNpZ25hbWUuKmEgcGFydGljdWxhciBzaWduYWwuKlJhaXNlZCBleGNlcHRpb25zIG1heSBiZSBjYXVnaHQ6LipjYXRjaCB0aHJvdy4qYWxsIGV4Y2VwdGlvbnMsIHdoZW4gdGhyb3duLipjYXRjaCB0aHJvdy4qZXhjZXB0bmFtZS4qYSBwYXJ0aWN1bGFyIGV4Y2VwdGlvbiwgd2hlbiB0aHJvd24uKmNhdGNoIGNhdGNoLiphbGwgZXhjZXB0aW9ucywgd2hlbiBjYXVnaHQuKmNhdGNoIGNhdGNoLipleGNlcHRuYW1lLiphIHBhcnRpY3VsYXIgZXhjZXB0aW9uLCB3aGVuIGNhdWdodC4qVGhyZWFkIG9yIHByb2Nlc3MgZXZlbnRzIG1heSBiZSBjYXVnaHQ6LipjYXRjaCB0aHJlYWRfc3RhcnQuKmFueSB0aHJlYWRzLCBqdXN0IGFmdGVyIGNyZWF0aW9uLipjYXRjaCB0aHJlYWRfZXhpdC4qYW55IHRocmVhZHMsIGp1c3QgYmVmb3JlIGV4cGlyYXRpb24uKmNhdGNoIHRocmVhZF9qb2luLiphbnkgdGhyZWFkcywganVzdCBhZnRlciBqb2lucy4qY2F0Y2ggc3RhcnQuKmFueSBwcm9jZXNzZXMsIGp1c3QgYWZ0ZXIgY3JlYXRpb24uKmNhdGNoIGV4aXQuKmFueSBwcm9jZXNzZXMsIGp1c3QgYmVmb3JlIGV4cGlyYXRpb24uKmNhdGNoIGZvcmsuKmNhbGxzIHRvIGZvcmsuKmNhdGNoIHZmb3JrLipjYWxscyB0byB2Zm9yay4qY2F0Y2ggZXhlYy4qY2FsbHMgdG8gZXhlYy4qRHluYW1pY2FsbHkubGlua2VkIGxpYnJhcnkgZXZlbnRzIG1heSBiZSBjYXVnaHQ6LipjYXRjaCBsb2FkLipsb2FkcyBvZiBhbnkgbGlicmFyeS4qY2F0Y2ggbG9hZC4qbGlibmFtZS4qbG9hZHMgb2YgYSBwYXJ0aWN1bGFyIGxpYnJhcnkuKmNhdGNoIHVubG9hZC4qdW5sb2FkcyBvZiBhbnkgbGlicmFyeS4qY2F0Y2ggdW5sb2FkLipsaWJuYW1lLip1bmxvYWRzIG9mIGEgcGFydGljdWxhciBsaWJyYXJ5LipUaGUgYWN0IG9mIHlvdXIgcHJvZ3JhbSdzIGV4ZWN1dGlvbiBzdG9wcGluZyBtYXkgYWxzbyBiZSBjYXVnaHQ6LipjYXRjaCBzdG9wLipEby4qaGVscCBzZXQgZm9sbG93LWZvcmstbW9kZS4qZm9yIGluZm8gb24gZGVidWdnaW5nIHlvdXIgcHJvZ3JhbS4qYWZ0ZXIgYSBmb3JrIG9yIHZmb3JrIGlzIGNhdWdodC4qRG8uKmhlbHAgYnJlYWtwb2ludHMuKmZvciBpbmZvIG9uIG90aGVyIGNvbW1hbmRzIGRlYWxpbmcgd2l0aCBicmVha3BvaW50cy4iICJoZWxwIGNhdGNoIgorIyB0ZXN0IGhlbHAgY2QKK2dkYl90ZXN0ICJoZWxwIGNkIiAiU2V0IHdvcmtpbmcgZGlyZWN0b3J5IHRvIERJUiBmb3IgZGVidWdnZXIgYW5kIHByb2dyYW0gYmVpbmcgZGVidWdnZWQuLipcW1xyXG5cXStUaGUgY2hhbmdlIGRvZXMgbm90IHRha2UgZWZmZWN0IGZvciB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZC4qXFtcclxuXF0rdW50aWwgdGhlIG5leHQgdGltZSBpdCBpcyBzdGFydGVkLiIgImhlbHAgY2QiCisjIHRlc3QgaGVscCBjbGVhcgorZ2RiX3Rlc3QgImhlbHAgY2xlYXIiICJDbGVhciBicmVha3BvaW50IGF0IHNwZWNpZmllZCBsaW5lIG9yIGZ1bmN0aW9uLipcW1xyXG5cXStBcmd1bWVudCBtYXkgYmUgbGluZSBudW1iZXIsIGZ1bmN0aW9uIG5hbWUsIG9yIC4qIGFuZCBhbiBhZGRyZXNzLipcW1xyXG5cXStJZiBsaW5lIG51bWJlciBpcyBzcGVjaWZpZWQsIGFsbCBicmVha3BvaW50cyBpbiB0aGF0IGxpbmUgYXJlIGNsZWFyZWQuKlxbXHJcblxdK0lmIGZ1bmN0aW9uIGlzIHNwZWNpZmllZCwgYnJlYWtwb2ludHMgYXQgYmVnaW5uaW5nIG9mIGZ1bmN0aW9uIGFyZSBjbGVhcmVkLipcW1xyXG5cXStJZiBhbiBhZGRyZXNzIGlzIHNwZWNpZmllZCwgYnJlYWtwb2ludHMgYXQgdGhhdCBhZGRyZXNzIGFyZSBjbGVhcmVkLipcW1xyXG5cXStXaXRoIG5vIGFyZ3VtZW50LCBjbGVhcnMgYWxsIGJyZWFrcG9pbnRzIGluIHRoZSBsaW5lIHRoYXQgdGhlIHNlbGVjdGVkIGZyYW1lLipcW1xyXG5cXStpcyBleGVjdXRpbmcgaW4uLipcW1xyXG5cXStTZWUgYWxzbyB0aGUgXCJkZWxldGVcIiBjb21tYW5kIHdoaWNoIGNsZWFycyBicmVha3BvaW50cyBieSBudW1iZXIuIiAiaGVscCBjbGVhciIKKyMgdGVzdCBoZWxwIGNvbW1hbmRzCitnZGJfdGVzdCAiaGVscCBjb21tYW5kcyIgIlNldCBjb21tYW5kcyB0byBiZSBleGVjdXRlZCB3aGVuIGEgYnJlYWtwb2ludCBpcyBoaXQuLipcW1xyXG5cXStHaXZlIGJyZWFrcG9pbnQgbnVtYmVyIGFzIGFyZ3VtZW50IGFmdGVyIFwiY29tbWFuZHNcIi4uKlxbXHJcblxdK1dpdGggbm8gYXJndW1lbnQsIHRoZSB0YXJnZXRlZCBicmVha3BvaW50IGlzIHRoZSBsYXN0IG9uZSBzZXQuLipcW1xyXG5cXStUaGUgY29tbWFuZHMgdGhlbXNlbHZlcyBmb2xsb3cgc3RhcnRpbmcgb24gdGhlIG5leHQgbGluZS4uKlxbXHJcblxdK1R5cGUgYSBsaW5lIGNvbnRhaW5pbmcgXCJlbmRcIiB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRoZW0uLipcW1xyXG5cXStHaXZlIFwic2lsZW50XCIgYXMgdGhlIGZpcnN0IGxpbmUgdG8gbWFrZSB0aGUgYnJlYWtwb2ludCBzaWxlbnQ7LipcW1xyXG5cXSt0aGVuIG5vIG91dHB1dCBpcyBwcmludGVkIHdoZW4gaXQgaXMgaGl0LCBleGNlcHQgd2hhdCB0aGUgY29tbWFuZHMgcHJpbnQuIiAiaGVscCBjb21tYW5kcyIKKyMgdGVzdCBoZWxwIGNvbmRpdGlvbgorZ2RiX3Rlc3QgImhlbHAgY29uZGl0aW9uIiAiU3BlY2lmeSBicmVha3BvaW50IG51bWJlciBOIHRvIGJyZWFrIG9ubHkgaWYgQ09ORCBpcyB0cnVlLi4qXFtcclxuXF0rVXNhZ2UgaXMgYGNvbmRpdGlvbiBOIENPTkQnLCB3aGVyZSBOIGlzIGFuIGludGVnZXIgYW5kIENPTkQgaXMgYW4uKlxbXHJcblxdK2V4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkIHdoZW5ldmVyIGJyZWFrcG9pbnQgTiBpcyByZWFjaGVkLiAgIiAiaGVscCBjb25kaXRpb24iCisjIHRlc3QgaGVscCBjb3JlLWZpbGUKK2dkYl90ZXN0ICJoZWxwIGNvcmUtZmlsZSIgIlVzZSBGSUxFIGFzIGNvcmUgZHVtcCBmb3IgZXhhbWluaW5nIG1lbW9yeSBhbmQgcmVnaXN0ZXJzLi4qXFtcclxuXF0rTm8gYXJnIG1lYW5zIGhhdmUgbm8gY29yZSBmaWxlLiAgVGhpcyBjb21tYW5kIGhhcyBiZWVuIHN1cGVyc2VkZWQgYnkgdGhlLipcW1xyXG5cXStgdGFyZ2V0IGNvcmUnIGFuZCBgZGV0YWNoJyBjb21tYW5kcy4iICJoZWxwIGNvcmUtZmlsZSIKKyMgdGVzdCBoZWxwIGRlbGV0ZSAiZCIgYWJicmV2aWF0aW9uCitnZGJfdGVzdCAiaGVscCBkIiAiRGVsZXRlIHNvbWUgYnJlYWtwb2ludHMgb3IgYXV0by1kaXNwbGF5IGV4cHJlc3Npb25zLi4qXFtcclxuXF0rQXJndW1lbnRzIGFyZSBicmVha3BvaW50IG51bWJlcnMgd2l0aCBzcGFjZXMgaW4gYmV0d2Vlbi4uKlxbXHJcblxdK1RvIGRlbGV0ZSBhbGwgYnJlYWtwb2ludHMsIGdpdmUgbm8gYXJndW1lbnQuLipcW1xyXG5cXStBbHNvIGEgcHJlZml4IGNvbW1hbmQgZm9yIGRlbGV0aW9uIG9mIG90aGVyIEdEQiBvYmplY3RzLi4qXFtcclxuXF0rVGhlIFwidW5zZXRcIiBjb21tYW5kIGlzIGFsc28gYW4gYWxpYXMgZm9yIFwiZGVsZXRlXCIuLipcW1xyXG5cXStMaXN0IG9mIGRlbGV0ZSBzdWJjb21tYW5kczouKlxbXHJcblxdK2RlbGV0ZSBicmVha3BvaW50cyAtLSBEZWxldGUgc29tZSBicmVha3BvaW50cyBvciBhdXRvLWRpc3BsYXkgZXhwcmVzc2lvbnMuKlxbXHJcblxdK2RlbGV0ZSBkaXNwbGF5IC0tIENhbmNlbCBzb21lIGV4cHJlc3Npb25zIHRvIGJlIGRpc3BsYXllZCB3aGVuIHByb2dyYW0gc3RvcHMuKlxbXHJcblxdK1R5cGUgXCJoZWxwIGRlbGV0ZVwiIGZvbGxvd2VkIGJ5IGRlbGV0ZSBzdWJjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4uKlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLiIgImhlbHAgZGVsZXRlIFwiZFwiIGFiYnJldmlhdGlvbiIKKyMgdGVzdCBoZWxwIGRlbGV0ZQorZ2RiX3Rlc3QgImhlbHAgZGVsZXRlIiAiRGVsZXRlIHNvbWUgYnJlYWtwb2ludHMgb3IgYXV0by1kaXNwbGF5IGV4cHJlc3Npb25zLi4qXFtcclxuXF0rQXJndW1lbnRzIGFyZSBicmVha3BvaW50IG51bWJlcnMgd2l0aCBzcGFjZXMgaW4gYmV0d2Vlbi4uKlxbXHJcblxdK1RvIGRlbGV0ZSBhbGwgYnJlYWtwb2ludHMsIGdpdmUgbm8gYXJndW1lbnQuLipcW1xyXG5cXStBbHNvIGEgcHJlZml4IGNvbW1hbmQgZm9yIGRlbGV0aW9uIG9mIG90aGVyIEdEQiBvYmplY3RzLi4qXFtcclxuXF0rVGhlIFwidW5zZXRcIiBjb21tYW5kIGlzIGFsc28gYW4gYWxpYXMgZm9yIFwiZGVsZXRlXCIuLipcW1xyXG5cXStMaXN0IG9mIGRlbGV0ZSBzdWJjb21tYW5kczouKlxbXHJcblxdK2RlbGV0ZSBicmVha3BvaW50cyAtLSBEZWxldGUgc29tZSBicmVha3BvaW50cyBvciBhdXRvLWRpc3BsYXkgZXhwcmVzc2lvbnMuKlxbXHJcblxdK2RlbGV0ZSBkaXNwbGF5IC0tIENhbmNlbCBzb21lIGV4cHJlc3Npb25zIHRvIGJlIGRpc3BsYXllZCB3aGVuIHByb2dyYW0gc3RvcHMuKlxbXHJcblxdK1R5cGUgXCJoZWxwIGRlbGV0ZVwiIGZvbGxvd2VkIGJ5IGRlbGV0ZSBzdWJjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4uKlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLiIgImhlbHAgZGVsZXRlIgorIyB0ZXN0IGhlbHAgZGF0YQorZ2RiX3Rlc3QgImhlbHAgZGF0YSIgIi4qXFtcclxuXF0rRXhhbWluaW5nIGRhdGEuLipcW1xyXG5cXStMaXN0IG9mIGNvbW1hbmRzOi4qXFtcclxuXF0rVHlwZSBcImhlbHBcIiBmb2xsb3dlZCBieSBjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4uKlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLiIgImhlbHAgZGF0YSIKKyMgdGVzdCBoZWxwIGRlZmluZQorZ2RiX3Rlc3QgImhlbHAgZGVmaW5lIiAiRGVmaW5lIGEgbmV3IGNvbW1hbmQuKiIgICJoZWxwIGRlZmluZSIKKyMgdGVzdCBoZWxwIGRlbGV0ZSBicmVha3BvaW50cworZ2RiX3Rlc3QgImhlbHAgZGVsZXRlIGJyZWFrcG9pbnRzIiAiRGVsZXRlIHNvbWUgYnJlYWtwb2ludHMgb3IgYXV0by1kaXNwbGF5IGV4cHJlc3Npb25zLi4qXFtcclxuXF0rQXJndW1lbnRzIGFyZSBicmVha3BvaW50IG51bWJlcnMgd2l0aCBzcGFjZXMgaW4gYmV0d2Vlbi4uKlxbXHJcblxdK1RvIGRlbGV0ZSBhbGwgYnJlYWtwb2ludHMsIGdpdmUgbm8gYXJndW1lbnQuLipcW1xyXG5cXStUaGlzIGNvbW1hbmQgbWF5IGJlIGFiYnJldmlhdGVkIFwiZGVsZXRlXCIuIiAiaGVscCBkZWxldGUgYnJlYWtwb2ludHMiCisjIHRlc3QgaGVscCBkZWxldGUgZGlzcGxheQorZ2RiX3Rlc3QgImhlbHAgZGVsZXRlIGRpc3BsYXkiICJDYW5jZWwgc29tZSBleHByZXNzaW9ucyB0byBiZSBkaXNwbGF5ZWQgd2hlbiBwcm9ncmFtIHN0b3BzLi4qXFtcclxuXF0rQXJndW1lbnRzIGFyZSB0aGUgY29kZSBudW1iZXJzIG9mIHRoZSBleHByZXNzaW9ucyB0byBzdG9wIGRpc3BsYXlpbmcuLipcW1xyXG5cXStObyBhcmd1bWVudCBtZWFucyBjYW5jZWwgYWxsIGF1dG9tYXRpYy1kaXNwbGF5IGV4cHJlc3Npb25zLi4qXFtcclxuXF0rRG8gXCJpbmZvIGRpc3BsYXlcIiB0byBzZWUgY3VycmVudCBsaXN0IG9mIGNvZGUgbnVtYmVycy4iICJoZWxwIGRlbGV0ZSBkaXNwbGF5IgorIyB0ZXN0IGhlbHAgZGV0YWNoCitnZGJfdGVzdCAiaGVscCBkZXRhY2giICJEZXRhY2ggYSBwcm9jZXNzIG9yIGZpbGUgcHJldmlvdXNseSBhdHRhY2hlZC5cW1xyXG5cXStJZiBhIHByb2Nlc3MsIGl0IGlzIG5vIGxvbmdlciB0cmFjZWQsIGFuZCBpdCBjb250aW51ZXMgaXRzIGV4ZWN1dGlvbi5cWyBcclxuXF0rSWZcWyBcclxuXF0reW91IHdlcmUgZGVidWdnaW5nIGEgZmlsZSwgdGhlIGZpbGUgaXMgY2xvc2VkIGFuZCBnZGIgbm8gbG9uZ2VyIGFjY2Vzc2VzIGl0LiIgImhlbHAgZGV0YWNoIgorIyB0ZXN0IGhlbHAgZGlyZWN0b3J5CitnZGJfdGVzdCAiaGVscCBkaXJlY3RvcnkiICJBZGQgZGlyZWN0b3J5IERJUiB0byBiZWdpbm5pbmcgb2Ygc2VhcmNoIHBhdGggZm9yIHNvdXJjZSBmaWxlcy4uKlxbXHJcblxdK0ZvcmdldCBjYWNoZWQgaW5mbyBvbiBzb3VyY2UgZmlsZSBsb2NhdGlvbnMgYW5kIGxpbmUgcG9zaXRpb25zLi4qXFtcclxuXF0rRElSIGNhbiBhbHNvIGJlIC5jd2QgZm9yIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBvciAuY2RpciBmb3IgdGhlLipcW1xyXG5cXStkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIHNvdXJjZSBmaWxlIHdhcyBjb21waWxlZCBpbnRvIG9iamVjdCBjb2RlLi4qXFtcclxuXF0rV2l0aCBubyBhcmd1bWVudCwgcmVzZXQgdGhlIHNlYXJjaCBwYXRoIHRvIC5jZGlyOi5jd2QsIHRoZSBkZWZhdWx0LiIgImhlbHAgZGlyZWN0b3J5IgorIyB0ZXN0IGhlbHAgZGlzYWJsZSAiZGlzIiBhYmJyZXZpYXRpb24KK2dkYl90ZXN0ICJoZWxwIGRpcyIgIkRpc2FibGUgc29tZSBicmVha3BvaW50cy4uKlxbXHJcblxdK0FyZ3VtZW50cyBhcmUgYnJlYWtwb2ludCBudW1iZXJzIHdpdGggc3BhY2VzIGluIGJldHdlZW4uLipcW1xyXG5cXStUbyBkaXNhYmxlIGFsbCBicmVha3BvaW50cywgZ2l2ZSBubyBhcmd1bWVudC4uKlxbXHJcblxdK0EgZGlzYWJsZWQgYnJlYWtwb2ludCBpcyBub3QgZm9yZ290dGVuLCBidXQgaGFzIG5vIGVmZmVjdCB1bnRpbCByZWVuYWJsZWQuLipcW1xyXG5cXStMaXN0IG9mIGRpc2FibGUgc3ViY29tbWFuZHM6LipcW1xyXG5cXStkaXNhYmxlIGJyZWFrcG9pbnRzIC0tIERpc2FibGUgc29tZSBicmVha3BvaW50cy4qXFtcclxuXF0rZGlzYWJsZSBkaXNwbGF5IC0tIERpc2FibGUgc29tZSBleHByZXNzaW9ucyB0byBiZSBkaXNwbGF5ZWQgd2hlbiBwcm9ncmFtIHN0b3BzLipcW1xyXG5cXStUeXBlIFwiaGVscCBkaXNhYmxlXCIgZm9sbG93ZWQgYnkgZGlzYWJsZSBzdWJjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4uKlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLiIgImhlbHAgZGlzYWJsZSBcImRpc1wiIGFiYnJldmlhdGlvbiIKKyMgdGVzdCBoZWxwIGRpc2FibGUgImRpc2EiIGFiYnJldmlhdGlvbgorZ2RiX3Rlc3QgImhlbHAgZGlzYSIgIkRpc2FibGUgc29tZSBicmVha3BvaW50cy4uKlxbXHJcblxdK0FyZ3VtZW50cyBhcmUgYnJlYWtwb2ludCBudW1iZXJzIHdpdGggc3BhY2VzIGluIGJldHdlZW4uLipcW1xyXG5cXStUbyBkaXNhYmxlIGFsbCBicmVha3BvaW50cywgZ2l2ZSBubyBhcmd1bWVudC4uKlxbXHJcblxdK0EgZGlzYWJsZWQgYnJlYWtwb2ludCBpcyBub3QgZm9yZ290dGVuLCBidXQgaGFzIG5vIGVmZmVjdCB1bnRpbCByZWVuYWJsZWQuLipcW1xyXG5cXStMaXN0IG9mIGRpc2FibGUgc3ViY29tbWFuZHM6LipcW1xyXG5cXStkaXNhYmxlIGJyZWFrcG9pbnRzIC0tIERpc2FibGUgc29tZSBicmVha3BvaW50cy4qXFtcclxuXF0rZGlzYWJsZSBkaXNwbGF5IC0tIERpc2FibGUgc29tZSBleHByZXNzaW9ucyB0byBiZSBkaXNwbGF5ZWQgd2hlbiBwcm9ncmFtIHN0b3BzLipcW1xyXG5cXStUeXBlIFwiaGVscCBkaXNhYmxlXCIgZm9sbG93ZWQgYnkgZGlzYWJsZSBzdWJjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4uKlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLiIgImhlbHAgZGlzYWJsZSBcImRpc2FcIiBhYmJyZXZpYXRpb24iCisjIHRlc3QgaGVscCBkaXNhYmxlCitnZGJfdGVzdCAiaGVscCBkaXNhYmxlIiAiRGlzYWJsZSBzb21lIGJyZWFrcG9pbnRzLi4qXFtcclxuXF0rQXJndW1lbnRzIGFyZSBicmVha3BvaW50IG51bWJlcnMgd2l0aCBzcGFjZXMgaW4gYmV0d2Vlbi4uKlxbXHJcblxdK1RvIGRpc2FibGUgYWxsIGJyZWFrcG9pbnRzLCBnaXZlIG5vIGFyZ3VtZW50Li4qXFtcclxuXF0rQSBkaXNhYmxlZCBicmVha3BvaW50IGlzIG5vdCBmb3Jnb3R0ZW4sIGJ1dCBoYXMgbm8gZWZmZWN0IHVudGlsIHJlZW5hYmxlZC4uKlxbXHJcblxdK0xpc3Qgb2YgZGlzYWJsZSBzdWJjb21tYW5kczouKlxbXHJcblxdK2Rpc2FibGUgYnJlYWtwb2ludHMgLS0gRGlzYWJsZSBzb21lIGJyZWFrcG9pbnRzLipcW1xyXG5cXStkaXNhYmxlIGRpc3BsYXkgLS0gRGlzYWJsZSBzb21lIGV4cHJlc3Npb25zIHRvIGJlIGRpc3BsYXllZCB3aGVuIHByb2dyYW0gc3RvcHMuKlxbXHJcblxdK1R5cGUgXCJoZWxwIGRpc2FibGVcIiBmb2xsb3dlZCBieSBkaXNhYmxlIHN1YmNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLi4qXFtcclxuXF0rQ29tbWFuZCBuYW1lIGFiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQgaWYgdW5hbWJpZ3VvdXMuIiAiaGVscCBkaXNhYmxlIgorIyB0ZXN0IGhlbHAgZGlzYWJsZSBicmVha3BvaW50cworZ2RiX3Rlc3QgImhlbHAgZGlzYWJsZSBicmVha3BvaW50cyIgIkRpc2FibGUgc29tZSBicmVha3BvaW50cy4uKlxbXHJcblxdK0FyZ3VtZW50cyBhcmUgYnJlYWtwb2ludCBudW1iZXJzIHdpdGggc3BhY2VzIGluIGJldHdlZW4uLipcW1xyXG5cXStUbyBkaXNhYmxlIGFsbCBicmVha3BvaW50cywgZ2l2ZSBubyBhcmd1bWVudC4uKlxbXHJcblxdK0EgZGlzYWJsZWQgYnJlYWtwb2ludCBpcyBub3QgZm9yZ290dGVuLCBidXQgaGFzIG5vIGVmZmVjdCB1bnRpbCByZWVuYWJsZWQuLipcW1xyXG5cXStUaGlzIGNvbW1hbmQgbWF5IGJlIGFiYnJldmlhdGVkIFwiZGlzYWJsZVwiLiIgImhlbHAgZGlzYWJsZSBicmVha3BvaW50cyIKKyMgdGVzdCBoZWxwIGRpc2FibGUgZGlzcGxheQorZ2RiX3Rlc3QgImhlbHAgZGlzYWJsZSBkaXNwbGF5IiAiRGlzYWJsZSBzb21lIGV4cHJlc3Npb25zIHRvIGJlIGRpc3BsYXllZCB3aGVuIHByb2dyYW0gc3RvcHMuLipcW1xyXG5cXStBcmd1bWVudHMgYXJlIHRoZSBjb2RlIG51bWJlcnMgb2YgdGhlIGV4cHJlc3Npb25zIHRvIHN0b3AgZGlzcGxheWluZy4uKlxbXHJcblxdK05vIGFyZ3VtZW50IG1lYW5zIGRpc2FibGUgYWxsIGF1dG9tYXRpYy1kaXNwbGF5IGV4cHJlc3Npb25zLi4qXFtcclxuXF0rRG8gXCJpbmZvIGRpc3BsYXlcIiB0byBzZWUgY3VycmVudCBsaXN0IG9mIGNvZGUgbnVtYmVycy4iICJoZWxwIGRpc2FibGUgZGlzcGxheSIKKyMgdGVzdCBoZWxwIGRpc2Fzc2VtYmxlCitnZGJfdGVzdCAiaGVscCBkaXNhc3NlbWJsZSIgIkRpc2Fzc2VtYmxlIGEgc3BlY2lmaWVkIHNlY3Rpb24gb2YgbWVtb3J5Li4qXFtcclxuXF0rRGVmYXVsdCBpcyB0aGUgZnVuY3Rpb24gc3Vycm91bmRpbmcgdGhlIHBjIG9mIHRoZSBzZWxlY3RlZCBmcmFtZS4uKlxbXHJcblxdK1dpdGggYSBzaW5nbGUgYXJndW1lbnQsIHRoZSBmdW5jdGlvbiBzdXJyb3VuZGluZyB0aGF0IGFkZHJlc3MgaXMgZHVtcGVkLi4qXFtcclxuXF0rVHdvIGFyZ3VtZW50cyBhcmUgdGFrZW4gYXMgYSByYW5nZSBvZiBtZW1vcnkgdG8gZHVtcC4iICJoZWxwIGRpc2Fzc2VtYmxlIgorIyB0ZXN0IGhlbHAgZGlzcGxheQorZ2RiX3Rlc3QgImhlbHAgZGlzcGxheSIgIlByaW50IHZhbHVlIG9mIGV4cHJlc3Npb24gRVhQIGVhY2ggdGltZSB0aGUgcHJvZ3JhbSBzdG9wcy4uKlxbXHJcblxdKy9GTVQgbWF5IGJlIHVzZWQgYmVmb3JlIEVYUCBhcyBpbiB0aGUgXCJwcmludFwiIGNvbW1hbmQuLipcW1xyXG5cXSsvRk1UIFwiaVwiIG9yIFwic1wiIG9yIGluY2x1ZGluZyBhIHNpemUtbGV0dGVyIGlzIGFsbG93ZWQsLipcW1xyXG5cXSthcyBpbiB0aGUgXCJ4XCIgY29tbWFuZCwgYW5kIHRoZW4gRVhQIGlzIHVzZWQgdG8gZ2V0IHRoZSBhZGRyZXNzIHRvIGV4YW1pbmUuKlxbXHJcblxdK2FuZCBleGFtaW5pbmcgaXMgZG9uZSBhcyBpbiB0aGUgXCJ4XCIgY29tbWFuZC4uKlxbXHJcblxdK1dpdGggbm8gYXJndW1lbnQsIGRpc3BsYXkgYWxsIGN1cnJlbnRseSByZXF1ZXN0ZWQgYXV0by1kaXNwbGF5IGV4cHJlc3Npb25zLi4qXFtcclxuXF0rVXNlIFwidW5kaXNwbGF5XCIgdG8gY2FuY2VsIGRpc3BsYXkgcmVxdWVzdHMgcHJldmlvdXNseSBtYWRlLiIgImhlbHAgZGlzcGxheSIKKyMgdGVzdCBoZWxwIGRvCitnZGJfdGVzdCAiaGVscCBkbyIgIlNlbGVjdCBhbmQgcHJpbnQgc3RhY2sgZnJhbWUgY2FsbGVkIGJ5IHRoaXMgb25lLi4qXFtcclxuXF0rQW4gYXJndW1lbnQgc2F5cyBob3cgbWFueSBmcmFtZXMgZG93biB0byBnby4iICJoZWxwIGRvIgorIyB0ZXN0IGhlbHAgZG9jdW1lbnQKK2dkYl90ZXN0ICJoZWxwIGRvY3VtZW50IiAiRG9jdW1lbnQgYSB1c2VyLWRlZmluZWQgY29tbWFuZC4uKlxbXHJcblxdK0dpdmUgY29tbWFuZCBuYW1lIGFzIGFyZ3VtZW50LiAgR2l2ZSBkb2N1bWVudGF0aW9uIG9uIGZvbGxvd2luZyBsaW5lcy4uKlxbXHJcblxdK0VuZCB3aXRoIGEgbGluZSBvZiBqdXN0IFwiZW5kXCIuIiAiaGVscCBkb2N1bWVudCIKKyMgdGVzdCBoZWxwIGRvd24KK2dkYl90ZXN0ICJoZWxwIGRvd24iICJTZWxlY3QgYW5kIHByaW50IHN0YWNrIGZyYW1lIGNhbGxlZCBieSB0aGlzIG9uZS4uKlxbXHJcblxdK0FuIGFyZ3VtZW50IHNheXMgaG93IG1hbnkgZnJhbWVzIGRvd24gdG8gZ28uIiAiaGVscCBkb3duIgorIyB0ZXN0IGhlbHAgZG93bi1zaWxlbnRseQorZ2RiX3Rlc3QgImhlbHAgZG93bi1zaWxlbnRseSIgIlNhbWUgYXMgdGhlIGBkb3duJyBjb21tYW5kLCBidXQgZG9lcyBub3QgcHJpbnQgYW55dGhpbmcuLipcW1xyXG5cXStUaGlzIGlzIHVzZWZ1bCBpbiBjb21tYW5kIHNjcmlwdHMuIiAiaGVscCBkb3duLXNpbGVudGx5IgorIyB0aGlzIGNvbW1hbmQgd2FzIHJlbW92ZWQgZnJvbSBHREIgNC41LjgKKyMgdGVzdCBoZWxwIGR1bXAtbWUKKyNzZW5kX2dkYiAiaGVscCBkdW1wLW1lIgorIyAtcmUgIkdldCBmYXRhbCBlcnJvcjsgbWFrZSBkZWJ1Z2dlciBkdW1wIGl0cyBjb3JlLiIKKyMgCisjIH0KKyMgdGVzdCBoZWxwIGVjaG8KK2dkYl90ZXN0ICJoZWxwIGVjaG8iICJQcmludCBhIGNvbnN0YW50IHN0cmluZy4gIEdpdmUgc3RyaW5nIGFzIGFyZ3VtZW50Li4qXFtcclxuXF0rQyBlc2NhcGUgc2VxdWVuY2VzIG1heSBiZSB1c2VkIGluIHRoZSBhcmd1bWVudC4uKlxbXHJcblxdK05vIG5ld2xpbmUgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgYXJndW1lbnQ7LipcW1xyXG5cXSt1c2UgXCIublwiIGlmIHlvdSB3YW50IGEgbmV3bGluZSB0byBiZSBwcmludGVkLi4qXFtcclxuXF0rU2luY2UgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBhcmUgaWdub3JlZCBpbiBjb21tYW5kIGFyZ3VtZW50cywuKlxbXHJcblxdK2lmIHlvdSB3YW50IHRvIHByaW50IHNvbWUgeW91IG11c3QgdXNlIFwiLlwiIGJlZm9yZSBsZWFkaW5nIHdoaXRlc3BhY2UuKlxbXHJcblxdK3RvIGJlIHByaW50ZWQgb3IgYWZ0ZXIgdHJhaWxpbmcgd2hpdGVzcGFjZS4iICJoZWxwIGVjaG8iCisjIHRlc3QgaGVscCBlbmFibGUgYnJlYWtwb2ludHMgZGVsZXRlCitnZGJfdGVzdCAiaGVscCBlbmFibGUgYnJlYWtwb2ludHMgZGVsZXRlIiAiRW5hYmxlIGJyZWFrcG9pbnRzIGFuZCBkZWxldGUgd2hlbiBoaXQuICBHaXZlIGJyZWFrcG9pbnQgbnVtYmVycy4uKlxbXHJcblxdK0lmIGEgYnJlYWtwb2ludCBpcyBoaXQgd2hpbGUgZW5hYmxlZCBpbiB0aGlzIGZhc2hpb24sIGl0IGlzIGRlbGV0ZWQuIiAiaGVscCBlbmFibGUgYnJlYWtwb2ludHMgZGVsZXRlIgorIyB0ZXN0IGhlbHAgZW5hYmxlIGJyZWFrcG9pbnRzIG9uY2UKK2dkYl90ZXN0ICJoZWxwIGVuYWJsZSBicmVha3BvaW50cyBvbmNlIiAiRW5hYmxlIGJyZWFrcG9pbnRzIGZvciBvbmUgaGl0Li4qIiAgImhlbHAgZW5hYmxlIGJyZWFrcG9pbnRzIG9uY2UiCisjIHRlc3QgaGVscCBlbmFibGUgYnJlYWtwb2ludHMKK2dkYl90ZXN0ICJoZWxwIGVuYWJsZSBicmVha3BvaW50cyIgIkVuYWJsZSBzb21lIGJyZWFrcG9pbnRzLi4qXFtcclxuXF0rR2l2ZSBicmVha3BvaW50IG51bWJlcnMgLnNlcGFyYXRlZCBieSBzcGFjZXMuIGFzIGFyZ3VtZW50cy4uKlxbXHJcblxdK1RoaXMgaXMgdXNlZCB0byBjYW5jZWwgdGhlIGVmZmVjdCBvZiB0aGUgXCJkaXNhYmxlXCIgY29tbWFuZC4uKlxbXHJcblxdK01heSBiZSBhYmJyZXZpYXRlZCB0byBzaW1wbHkgXCJlbmFibGVcIi4uKi4qXFtcclxuXF0rTGlzdCBvZiBlbmFibGUgYnJlYWtwb2ludHMgc3ViY29tbWFuZHM6LipcW1xyXG5cXStlbmFibGUgYnJlYWtwb2ludHMgZGVsZXRlIC0tIEVuYWJsZSBicmVha3BvaW50cyBhbmQgZGVsZXRlIHdoZW4gaGl0LipcW1xyXG5cXStlbmFibGUgYnJlYWtwb2ludHMgb25jZSAtLSBFbmFibGUgYnJlYWtwb2ludHMgZm9yIG9uZSBoaXQuKlxbXHJcblxdK1R5cGUgXCJoZWxwIGVuYWJsZSBicmVha3BvaW50c1wiIGZvbGxvd2VkIGJ5IGVuYWJsZSBicmVha3BvaW50cyBzdWJjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4uKlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLiIgImhlbHAgZW5hYmxlIGJyZWFrcG9pbnRzIgorIyB0ZXN0IGhlbHAgZW5hYmxlIGRlbGV0ZQorZ2RiX3Rlc3QgImhlbHAgZW5hYmxlIGRlbGV0ZSIgIkVuYWJsZSBicmVha3BvaW50cyBhbmQgZGVsZXRlIHdoZW4gaGl0LiAgR2l2ZSBicmVha3BvaW50IG51bWJlcnMuLipcW1xyXG5cXStJZiBhIGJyZWFrcG9pbnQgaXMgaGl0IHdoaWxlIGVuYWJsZWQgaW4gdGhpcyBmYXNoaW9uLCBpdCBpcyBkZWxldGVkLiIgImhlbHAgZW5hYmxlIGRlbGV0ZSIKKyMgdGVzdCBoZWxwIGVuYWJsZSBkaXNwbGF5CitnZGJfdGVzdCAiaGVscCBlbmFibGUgZGlzcGxheSIgIkVuYWJsZSBzb21lIGV4cHJlc3Npb25zIHRvIGJlIGRpc3BsYXllZCB3aGVuIHByb2dyYW0gc3RvcHMuLipcW1xyXG5cXStBcmd1bWVudHMgYXJlIHRoZSBjb2RlIG51bWJlcnMgb2YgdGhlIGV4cHJlc3Npb25zIHRvIHJlc3VtZSBkaXNwbGF5aW5nLi4qXFtcclxuXF0rTm8gYXJndW1lbnQgbWVhbnMgZW5hYmxlIGFsbCBhdXRvbWF0aWMtZGlzcGxheSBleHByZXNzaW9ucy4uKlxbXHJcblxdK0RvIFwiaW5mbyBkaXNwbGF5XCIgdG8gc2VlIGN1cnJlbnQgbGlzdCBvZiBjb2RlIG51bWJlcnMuIiAiaGVscCBlbmFibGUgZGlzcGxheSIKKyMgdGVzdCBoZWxwIGVuYWJsZSBvbmNlCitnZGJfdGVzdCAiaGVscCBlbmFibGUgb25jZSIgIkVuYWJsZSBicmVha3BvaW50cyBmb3Igb25lIGhpdC4qIiAgImhlbHAgZW5hYmxlIG9uY2UiCisjIHRlc3QgaGVscCBlbmFibGUKK2dkYl90ZXN0ICJoZWxwIGVuYWJsZSIgIkVuYWJsZSBzb21lIGJyZWFrcG9pbnRzLi4qXFtcclxuXF0rR2l2ZSBicmVha3BvaW50IG51bWJlcnMgLnNlcGFyYXRlZCBieSBzcGFjZXMuIGFzIGFyZ3VtZW50cy4uKlxbXHJcblxdK1dpdGggbm8gc3ViY29tbWFuZCwgYnJlYWtwb2ludHMgYXJlIGVuYWJsZWQgdW50aWwgeW91IGNvbW1hbmQgb3RoZXJ3aXNlLi4qXFtcclxuXF0rVGhpcyBpcyB1c2VkIHRvIGNhbmNlbCB0aGUgZWZmZWN0IG9mIHRoZSBcImRpc2FibGVcIiBjb21tYW5kLi4qXFtcclxuXF0rV2l0aCBhIHN1YmNvbW1hbmQgeW91IGNhbiBlbmFibGUgdGVtcG9yYXJpbHkuLipcW1xyXG5cXStMaXN0IG9mIGVuYWJsZSBzdWJjb21tYW5kczouKlxbXHJcblxdK2VuYWJsZSBkZWxldGUgLS0gRW5hYmxlIGJyZWFrcG9pbnRzIGFuZCBkZWxldGUgd2hlbiBoaXQuKlxbXHJcblxdK2VuYWJsZSBkaXNwbGF5IC0tIEVuYWJsZSBzb21lIGV4cHJlc3Npb25zIHRvIGJlIGRpc3BsYXllZCB3aGVuIHByb2dyYW0gc3RvcHMuKlxbXHJcblxdK2VuYWJsZSBvbmNlIC0tIEVuYWJsZSBicmVha3BvaW50cyBmb3Igb25lIGhpdC4qXFtcclxuXF0rVHlwZSBcImhlbHAgZW5hYmxlXCIgZm9sbG93ZWQgYnkgZW5hYmxlIHN1YmNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLi4qXFtcclxuXF0rQ29tbWFuZCBuYW1lIGFiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQgaWYgdW5hbWJpZ3VvdXMuIiAiaGVscCBlbmFibGUiCisjIHRlc3QgaGVscCBleGVjLWZpbGUKK2dkYl90ZXN0ICJoZWxwIGV4ZWMtZmlsZSIgIlVzZSBGSUxFIGFzIHByb2dyYW0gZm9yIGdldHRpbmcgY29udGVudHMgb2YgcHVyZSBtZW1vcnkuLipcW1xyXG5cXStJZiBGSUxFIGNhbm5vdCBiZSBmb3VuZCBhcyBzcGVjaWZpZWQsIHlvdXIgZXhlY3V0aW9uIGRpcmVjdG9yeSBwYXRoLipcW1xyXG5cXStpcyBzZWFyY2hlZCBmb3IgYSBjb21tYW5kIG9mIHRoYXQgbmFtZS4uKlxbXHJcblxdK05vIGFyZyBtZWFucyBoYXZlIG5vIGV4ZWN1dGFibGUgZmlsZS4iICJoZWxwIGV4ZWMtZmlsZSIKKyMgdGVzdCBoZWxwIGZyYW1lICJmIiBhYmJyZXZpYXRpb24KK2dkYl90ZXN0ICJoZWxwIGYiICJTZWxlY3QgYW5kIHByaW50IGEgc3RhY2sgZnJhbWUuLipcW1xyXG5cXStXaXRoIG5vIGFyZ3VtZW50LCBwcmludCB0aGUgc2VsZWN0ZWQgc3RhY2sgZnJhbWUuICAuU2VlIGFsc28gXCJpbmZvIGZyYW1lXCIuKlxbXHJcblxdK0FuIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgZnJhbWUgdG8gc2VsZWN0Li4qXFtcclxuXF0rSXQgY2FuIGJlIGEgc3RhY2sgZnJhbWUgbnVtYmVyIG9yIHRoZSBhZGRyZXNzIG9mIHRoZSBmcmFtZS4uKlxbXHJcblxdK1dpdGggYXJndW1lbnQsIG5vdGhpbmcgaXMgcHJpbnRlZCBpZiBpbnB1dCBpcyBjb21pbmcgZnJvbS4qXFtcclxuXF0rYSBjb21tYW5kIGZpbGUgb3IgYSB1c2VyLWRlZmluZWQgY29tbWFuZC4iICJoZWxwIGZyYW1lIFwiZlwiIGFiYnJldmlhdGlvbiIKKyMgdGVzdCBoZWxwIGZyYW1lCitnZGJfdGVzdCAiaGVscCBmcmFtZSIgIlNlbGVjdCBhbmQgcHJpbnQgYSBzdGFjayBmcmFtZS4uKlxbXHJcblxdK1dpdGggbm8gYXJndW1lbnQsIHByaW50IHRoZSBzZWxlY3RlZCBzdGFjayBmcmFtZS4gIC5TZWUgYWxzbyBcImluZm8gZnJhbWVcIi4uLipcW1xyXG5cXStBbiBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGZyYW1lIHRvIHNlbGVjdC4uKlxbXHJcblxdK0l0IGNhbiBiZSBhIHN0YWNrIGZyYW1lIG51bWJlciBvciB0aGUgYWRkcmVzcyBvZiB0aGUgZnJhbWUuLipcW1xyXG5cXStXaXRoIGFyZ3VtZW50LCBub3RoaW5nIGlzIHByaW50ZWQgaWYgaW5wdXQgaXMgY29taW5nIGZyb20uKlxbXHJcblxdK2EgY29tbWFuZCBmaWxlIG9yIGEgdXNlci1kZWZpbmVkIGNvbW1hbmQuIiAiaGVscCBmcmFtZSIKKyMgdGVzdCBoZWxwIGZnCitnZGJfdGVzdCAiaGVscCBmZyIgIkNvbnRpbnVlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQuKiIgICJoZWxwIGZnIgorIyB0ZXN0IGhlbHAgZmlsZQorZ2RiX3Rlc3QgImhlbHAgZmlsZSIgIlVzZSBGSUxFIGFzIHByb2dyYW0gdG8gYmUgZGVidWdnZWQuLipcW1xyXG5cXStJdCBpcyByZWFkIGZvciBpdHMgc3ltYm9scywgZm9yIGdldHRpbmcgdGhlIGNvbnRlbnRzIG9mIHB1cmUgbWVtb3J5LC4qXFtcclxuXF0rYW5kIGl0IGlzIHRoZSBwcm9ncmFtIGV4ZWN1dGVkIHdoZW4geW91IHVzZSB0aGUgYHJ1bicgY29tbWFuZC4uKlxbXHJcblxdK0lmIEZJTEUgY2Fubm90IGJlIGZvdW5kIGFzIHNwZWNpZmllZCwgeW91ciBleGVjdXRpb24gZGlyZWN0b3J5IHBhdGguKlxbXHJcblxdKy4uUEFUSC4gaXMgc2VhcmNoZWQgZm9yIGEgY29tbWFuZCBvZiB0aGF0IG5hbWUuLipcW1xyXG5cXStObyBhcmcgbWVhbnMgdG8gaGF2ZSBubyBleGVjdXRhYmxlIGZpbGUgYW5kIG5vIHN5bWJvbHMuIiAiaGVscCBmaWxlIgorIyB0ZXN0IGhlbHAgZmlsZXMKK2dkYl90ZXN0ICJoZWxwIGZpbGVzIiAiU3BlY2lmeWluZy4qIiAiaGVscCBmaWxlcyIKKyMgdGVzdCBoZWxwIGZpbmlzaAorZ2RiX3Rlc3QgImhlbHAgZmluaXNoIiAiRXhlY3V0ZSB1bnRpbCBzZWxlY3RlZCBzdGFjayBmcmFtZSByZXR1cm5zLi4qXFtcclxuXF0rVXBvbiByZXR1cm4sIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyBwcmludGVkIGFuZCBwdXQgaW4gdGhlIHZhbHVlIGhpc3RvcnkuIiAiaGVscCBmaW5pc2giCisjIHRlc3QgaGVscCBmb3J3YXJkLXNlYXJjaAorZ2RiX3Rlc3QgImhlbHAgZm9yd2FyZC1zZWFyY2giICJTZWFyY2ggZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbiAuc2VlIHJlZ2V4LjMuLiBmcm9tIGxhc3QgbGluZSBsaXN0ZWQuLioiICAiaGVscCBmb3J3YXJkLXNlYXJjaCIKKyMgdGVzdCBoZWxwIGhlbHAgImgiIGFiYnJldmlhdGlvbiAKK2dkYl90ZXN0ICJoZWxwIGgiICJQcmludCBsaXN0IG9mIGNvbW1hbmRzLiIgICJoZWxwIGhlbHAgXCJoXCIgYWJicmV2aWF0aW9uIgorIyB0ZXN0IGhlbHAgaGVscAorZ2RiX3Rlc3QgImhlbHAgaGVscCIgIlByaW50IGxpc3Qgb2YgY29tbWFuZHMuIiAgImhlbHAgaGVscCIKKyMgdGVzdCBoZWxwIGhhbmRsZQorZ2RiX3Rlc3QgImhlbHAgaGFuZGxlIiAiU3BlY2lmeSBob3cgdG8gaGFuZGxlIGEgc2lnbmFsLi4qIiAgImhlbHAgaGFuZGxlIgorIyB0ZXN0IGhlbHAgaW5mbyAiaSIgYWJicmV2aWF0aW9uCitnZGJfdGVzdCAiaGVscCBpIiAiR2VuZXJpYyBjb21tYW5kIGZvciBzaG93aW5nIHRoaW5ncyBhYm91dCB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZC4uKlxbXHJcblxdK0xpc3Qgb2YgaW5mbyBzdWJjb21tYW5kczouKlxbXHJcblxdK1R5cGUgXCJoZWxwIGluZm9cIiBmb2xsb3dlZCBieSBpbmZvIHN1YmNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLi4qXFtcclxuXF0rQ29tbWFuZCBuYW1lIGFiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQgaWYgdW5hbWJpZ3VvdXMuIiAiaGVscCBpbmZvIFwiaVwiIGFiYnJldmlhdGlvbiIKKyMgdGVzdCBoZWxwIGluZm8KK2dkYl90ZXN0ICJoZWxwIGluZm8iICJHZW5lcmljIGNvbW1hbmQgZm9yIHNob3dpbmcgdGhpbmdzIGFib3V0IHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkLi4qXFtcclxuXF0rTGlzdCBvZiBpbmZvIHN1YmNvbW1hbmRzOi4qXFtcclxuXF0rVHlwZSBcImhlbHAgaW5mb1wiIGZvbGxvd2VkIGJ5IGluZm8gc3ViY29tbWFuZCBuYW1lIGZvciBmdWxsIGRvY3VtZW50YXRpb24uLipcW1xyXG5cXStDb21tYW5kIG5hbWUgYWJicmV2aWF0aW9ucyBhcmUgYWxsb3dlZCBpZiB1bmFtYmlndW91cy4iICJoZWxwIGluZm8iCisjIHRlc3QgaGVscCBpZ25vcmUKK2dkYl90ZXN0ICJoZWxwIGlnbm9yZSIgIlNldCBpZ25vcmUtY291bnQgb2YgYnJlYWtwb2ludCBudW1iZXIgTiB0byBDT1VOVC4uKlxbXHJcblxdK1VzYWdlIGlzIGBpZ25vcmUgTiBDT1VOVCcuIiAiaGVscCBpZ25vcmUiCisjIHRlc3QgaGVscCBpbmZvIGFkZHJlc3MKK2dkYl90ZXN0ICJoZWxwIGluZm8gYWRkcmVzcyIgIkRlc2NyaWJlIHdoZXJlIHN5bWJvbCBTWU0gaXMgc3RvcmVkLiIgICJoZWxwIGluZm8gYWRkcmVzcyIKKyMgdGVzdCBoZWxwIGluZm8gYWxsLXJlZ2lzdGVycworZ2RiX3Rlc3QgImhlbHAgaW5mbyBhbGwtcmVnaXN0ZXJzIiAiTGlzdCBvZiBhbGwgcmVnaXN0ZXJzIGFuZCB0aGVpciBjb250ZW50cywgZm9yIHNlbGVjdGVkIHN0YWNrIGZyYW1lLi4qXFtcclxuXF0rUmVnaXN0ZXIgbmFtZSBhcyBhcmd1bWVudCBtZWFucyBkZXNjcmliZSBvbmx5IHRoYXQgcmVnaXN0ZXIuIiAiaGVscCBpbmZvIGFsbC1yZWdpc3RlcnMiCisjIHRlc3QgaGVscCBpbmZvIGFyZ3MKK2dkYl90ZXN0ICJoZWxwIGluZm8gYXJncyIgIkFyZ3VtZW50IHZhcmlhYmxlcyBvZiBjdXJyZW50IHN0YWNrIGZyYW1lLiIgICJoZWxwIGluZm8gYXJncyIKKyMgdGVzdCBoZWxwIGluZm8gYnJlYWtwb2ludHMKK2dkYl90ZXN0ICJoZWxwIGluZm8gYnJlYWtwb2ludHMiICJTdGF0dXMgb2YgdXNlci1zZXR0YWJsZSBicmVha3BvaW50cywgb3IgYnJlYWtwb2ludCBudW1iZXIgTlVNQkVSLi4qXFtcclxuXF0rYnJlYWtwb2ludCBzZXQuIiAiaGVscCBpbmZvIGJyZWFrcG9pbnRzIgorIyB0ZXN0IGhlbHAgaW5mbyBjYXRjaAorZ2RiX3Rlc3QgImhlbHAgaW5mbyBjYXRjaCIgIkV4Y2VwdGlvbnMgdGhhdCBjYW4gYmUgY2F1Z2h0IGluIHRoZSBjdXJyZW50IHN0YWNrIGZyYW1lLiIgICJoZWxwIGluZm8gY2F0Y2giCisjIHRlc3QgaGVscCBpbmZvIGNvcHlpbmcKK2dkYl90ZXN0ICJoZWxwIGluZm8gY29weWluZyIgIkNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW5nIGNvcGllcyBvZiBHREIuIiAgImhlbHAgaW5mbyBjb3B5aW5nIgorIyB0ZXN0IGhlbHAgaW5mbyBkaXNwbGF5CitnZGJfdGVzdCAiaGVscCBpbmZvIGRpc3BsYXkiICJFeHByZXNzaW9ucyB0byBkaXNwbGF5IHdoZW4gcHJvZ3JhbSBzdG9wcywgd2l0aCBjb2RlIG51bWJlcnMuIiAgImhlbHAgaW5mbyBkaXNwbGF5IgorIyB0ZXN0IGhlbHAgaW5mbyBmcmFtZSAiZiIgYWJicmV2aWF0aW9uCitnZGJfdGVzdCAiaGVscCBpbmZvIGYiICJBbGwgYWJvdXQgc2VsZWN0ZWQgc3RhY2sgZnJhbWUsIG9yIGZyYW1lIGF0IEFERFIuIiAgImhlbHAgaW5mbyBmcmFtZSBcImZcIiBhYmJyZXZpYXRpb24iCisjIHRlc3QgaGVscCBpbmZvIGZyYW1lCitnZGJfdGVzdCAiaGVscCBpbmZvIGZyYW1lIiAiQWxsIGFib3V0IHNlbGVjdGVkIHN0YWNrIGZyYW1lLCBvciBmcmFtZSBhdCBBRERSLiIgICJoZWxwIGluZm8gZnJhbWUiCisjIHRlc3QgaGVscCBpbmZvIGZpbGVzCitnZGJfdGVzdCAiaGVscCBpbmZvIGZpbGVzIiAiTmFtZXMgb2YgdGFyZ2V0cyBhbmQgZmlsZXMgYmVpbmcgZGVidWdnZWQuLipcW1xyXG5cXStTaG93cyB0aGUgZW50aXJlIHN0YWNrIG9mIHRhcmdldHMgY3VycmVudGx5IGluIHVzZSAuaW5jbHVkaW5nIHRoZSBleGVjLWZpbGUsLipcW1xyXG5cXStjb3JlLWZpbGUsIGFuZCBwcm9jZXNzLCBpZiBhbnkuLCBhcyB3ZWxsIGFzIHRoZSBzeW1ib2wgZmlsZSBuYW1lLiIgImhlbHAgaW5mbyBmaWxlcyIKKyMgdGVzdCBoZWxwIGluZm8gZmxvYXQKK2dkYl90ZXN0ICJoZWxwIGluZm8gZmxvYXQiICJQcmludCB0aGUgc3RhdHVzIG9mIHRoZSBmbG9hdGluZyBwb2ludCB1bml0IiAgImhlbHAgaW5mbyBmbG9hdCIKKyMgdGVzdCBoZWxwIGluZm8gZnVuY3Rpb25zCitnZGJfdGVzdCAiaGVscCBpbmZvIGZ1bmN0aW9ucyIgIkFsbCBmdW5jdGlvbiBuYW1lcywgb3IgdGhvc2UgbWF0Y2hpbmcgUkVHRVhQLiIgICJoZWxwIGluZm8gZnVuY3Rpb25zIgorIyB0ZXN0IGhlbHAgaW5mbyBsaW5lCitnZGJfdGVzdCAiaGVscCBpbmZvIGxpbmUiICJDb3JlIGFkZHJlc3NlcyBvZiB0aGUgY29kZSBmb3IgYSBzb3VyY2UgbGluZS4uKlxbXHJcblxdK0xpbmUgY2FuIGJlIHNwZWNpZmllZCBhcy4qXFtcclxuXF0rICBMSU5FTlVNLCB0byBsaXN0IGFyb3VuZCB0aGF0IGxpbmUgaW4gY3VycmVudCBmaWxlLC4qXFtcclxuXF0rICBGSUxFOkxJTkVOVU0sIHRvIGxpc3QgYXJvdW5kIHRoYXQgbGluZSBpbiB0aGF0IGZpbGUsLipcW1xyXG5cXSsgIEZVTkNUSU9OLCB0byBsaXN0IGFyb3VuZCBiZWdpbm5pbmcgb2YgdGhhdCBmdW5jdGlvbiwuKlxbXHJcblxdKyAgRklMRTpGVU5DVElPTiwgdG8gZGlzdGluZ3Vpc2ggYW1vbmcgbGlrZS1uYW1lZCBzdGF0aWMgZnVuY3Rpb25zLi4qXFtcclxuXF0rRGVmYXVsdCBpcyB0byBkZXNjcmliZSB0aGUgbGFzdCBzb3VyY2UgbGluZSB0aGF0IHdhcyBsaXN0ZWQuLipcW1xyXG5cXStUaGlzIHNldHMgdGhlIGRlZmF1bHQgYWRkcmVzcyBmb3IgXCJ4XCIgdG8gdGhlIGxpbmUncyBmaXJzdCBpbnN0cnVjdGlvbi4qXFtcclxuXF0rc28gdGhhdCBcInguaVwiIHN1ZmZpY2VzIHRvIHN0YXJ0IGV4YW1pbmluZyB0aGUgbWFjaGluZSBjb2RlLi4qXFtcclxuXF0rVGhlIGFkZHJlc3MgaXMgYWxzbyBzdG9yZWQgYXMgdGhlIHZhbHVlIG9mIFwiLl9cIi4iICJoZWxwIGluZm8gbGluZSIKKyMgdGVzdCBoZWxwIGluZm8gbG9jYWxzCitnZGJfdGVzdCAiaGVscCBpbmZvIGxvY2FscyIgIkxvY2FsIHZhcmlhYmxlcyBvZiBjdXJyZW50IHN0YWNrIGZyYW1lLiIgICJoZWxwIGluZm8gbG9jYWxzIgorIyB0ZXN0IGhlbHAgaW5mbyBwcm9ncmFtCitnZGJfdGVzdCAiaGVscCBpbmZvIHByb2dyYW0iICJFeGVjdXRpb24gc3RhdHVzIG9mIHRoZSBwcm9ncmFtLiIgICJoZWxwIGluZm8gcHJvZ3JhbSIKKyMgdGVzdCBoZWxwIGluZm8gcmVnaXN0ZXJzCitnZGJfdGVzdCAiaGVscCBpbmZvIHJlZ2lzdGVycyIgIkxpc3Qgb2YgaW50ZWdlciByZWdpc3RlcnMgYW5kIHRoZWlyIGNvbnRlbnRzLCBmb3Igc2VsZWN0ZWQgc3RhY2sgZnJhbWUuLipcW1xyXG5cXStSZWdpc3RlciBuYW1lIGFzIGFyZ3VtZW50IG1lYW5zIGRlc2NyaWJlIG9ubHkgdGhhdCByZWdpc3Rlci4iICJoZWxwIGluZm8gcmVnaXN0ZXJzIgorIyB0ZXN0IGhlbHAgaW5mbyBzdGFjayAicyIgYWJicmV2aWF0aW9uCitnZGJfdGVzdCAiaGVscCBpbmZvIHMiICJCYWNrdHJhY2Ugb2YgdGhlIHN0YWNrLCBvciBpbm5lcm1vc3QgQ09VTlQgZnJhbWVzLiIgICJoZWxwIGluZm8gc3RhY2sgXCJzXCIgYWJicmV2aWF0aW9uIgorIyB0ZXN0IGhlbHAgaW5mbyBzdGFjaworZ2RiX3Rlc3QgImhlbHAgaW5mbyBzdGFjayIgIkJhY2t0cmFjZSBvZiB0aGUgc3RhY2ssIG9yIGlubmVybW9zdCBDT1VOVCBmcmFtZXMuIiAgImhlbHAgaW5mbyBzdGFjayIKKyMgdGVzdCBoZWxwIGluZm8gc2V0CitnZGJfdGVzdCAiaGVscCBpbmZvIHNldCIgIlNob3cgYWxsIEdEQiBzZXR0aW5ncy4iICAiaGVscCBpbmZvIHNldCIKKyMgdGVzdCBoZWxwIGluZm8gc2lnbmFscworZ2RiX3Rlc3QgImhlbHAgaW5mbyBzaWduYWxzIiAiV2hhdCBkZWJ1Z2dlciBkb2VzIHdoZW4gcHJvZ3JhbSBnZXRzIHZhcmlvdXMgc2lnbmFscy4qIiAgImhlbHAgaW5mbyBzaWduYWxzIgorIyB0ZXN0IGhlbHAgaW5mbyBzb3VyY2UKK2dkYl90ZXN0ICJoZWxwIGluZm8gc291cmNlIiAiSW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgc291cmNlIGZpbGUuIiAgImhlbHAgaW5mbyBzb3VyY2UiCisjIHRlc3QgaGVscCBpbmZvIHNvdXJjZXMKK2dkYl90ZXN0ICJoZWxwIGluZm8gc291cmNlcyIgIlNvdXJjZSBmaWxlcyBpbiB0aGUgcHJvZ3JhbS4iICAiaGVscCBpbmZvIHNvdXJjZXMiCisjIHRlc3QgaGVscCBpbmZvIHN5bWJvbAorZ2RiX3Rlc3QgImhlbHAgaW5mbyBzeW1ib2wiICJEZXNjcmliZSB3aGF0IHN5bWJvbCBpcyBhdCBsb2NhdGlvbiBBRERSLioiCisjIHRlc3QgaGVscCBpbmZvIHRhcmdldAorZ2RiX3Rlc3QgImhlbHAgaW5mbyB0YXJnZXQiICJOYW1lcyBvZiB0YXJnZXRzIGFuZCBmaWxlcyBiZWluZyBkZWJ1Z2dlZC4uKlxbXHJcblxdK1Nob3dzIHRoZSBlbnRpcmUgc3RhY2sgb2YgdGFyZ2V0cyBjdXJyZW50bHkgaW4gdXNlIC5pbmNsdWRpbmcgdGhlIGV4ZWMtZmlsZSwuKlxbXHJcblxdK2NvcmUtZmlsZSwgYW5kIHByb2Nlc3MsIGlmIGFueS4sIGFzIHdlbGwgYXMgdGhlIHN5bWJvbCBmaWxlIG5hbWUuIiAiaGVscCBpbmZvIHRhcmdldCIKKyMgdGVzdCBoZWxwIGluZm8gdGVybWluYWwKK2dkYl90ZXN0ICJoZWxwIGluZm8gdGVybWluYWwiICJQcmludCBpbmZlcmlvcidzIHNhdmVkIHRlcm1pbmFsIHN0YXR1cy4iICAiaGVscCBpbmZvIHRlcm1pbmFsIgorIyB0ZXN0IGhlbHAgaW5mbyB0eXBlcworZ2RiX3Rlc3QgImhlbHAgaW5mbyB0eXBlcyIgIkFsbCB0eXBlIG5hbWVzLCBvciB0aG9zZSBtYXRjaGluZyBSRUdFWFAuIiAgImhlbHAgaW5mbyB0eXBlcyIKKyMgdGVzdCBoZWxwIGluZm8gdmFyaWFibGVzCitnZGJfdGVzdCAiaGVscCBpbmZvIHZhcmlhYmxlcyIgIkFsbCBnbG9iYWwgYW5kIHN0YXRpYyB2YXJpYWJsZSBuYW1lcywgb3IgdGhvc2UgbWF0Y2hpbmcgUkVHRVhQLiIgICJoZWxwIGluZm8gdmFyaWFibGVzIgorIyB0ZXN0IGhlbHAgaW5mbyB3YXJyYW50eQorZ2RiX3Rlc3QgImhlbHAgaW5mbyB3YXJyYW50eSIgIlZhcmlvdXMga2luZHMgb2Ygd2FycmFudHkgeW91IGRvIG5vdCBoYXZlLiIgICJoZWxwIGluZm8gd2FycmFudHkiCisjIHRlc3QgaGVscCBpbmZvIHdhdGNocG9pbnRzCitnZGJfdGVzdCAiaGVscCBpbmZvIHdhdGNocG9pbnRzIiAiU3lub255bSBmb3IgYGBpbmZvIGJyZWFrcG9pbnRzJycuIiAgImhlbHAgaW5mbyB3YXRjaHBvaW50cyIKKyMgdGVzdCBoZWxwIGluc3BlY3QKK2dkYl90ZXN0ICJoZWxwIGluc3BlY3QiICJTYW1lIGFzIFwicHJpbnRcIiBjb21tYW5kLCBleGNlcHQgdGhhdCBpZiB5b3UgYXJlIHJ1bm5pbmcgaW4gdGhlIGVwb2NoLipcW1xyXG5cXStlbnZpcm9ubWVudCwgdGhlIHZhbHVlIGlzIHByaW50ZWQgaW4gaXRzIG93biB3aW5kb3cuIiAiaGVscCBpbnNwZWN0IgorIyB0ZXN0IGhlbHAganVtcAorZ2RiX3Rlc3QgImhlbHAganVtcCIgIkNvbnRpbnVlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgYXQgc3BlY2lmaWVkIGxpbmUgb3IgYWRkcmVzcy4uKlxbXHJcblxdK0dpdmUgYXMgYXJndW1lbnQgZWl0aGVyIExJTkVOVU0gb3IgXFsqXF0rQUREUiwgd2hlcmUgQUREUiBpcyBhbiBleHByZXNzaW9uLipcW1xyXG5cXStmb3IgYW4gYWRkcmVzcyB0byBzdGFydCBhdC4iICJoZWxwIGp1bXAiCisjIHRlc3QgaGVscCBraWxsCitnZGJfdGVzdCAiaGVscCBraWxsIiAiS2lsbCBleGVjdXRpb24gb2YgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZC4iICAiaGVscCBraWxsIgorIyB0ZXN0IGhlbHAgbGlzdCAibCIgYWJicmV2aWF0aW9uCitnZGJfdGVzdCAiaGVscCBsIiAiTGlzdCBzcGVjaWZpZWQgZnVuY3Rpb24gb3IgbGluZS4uKlxbXHJcblxdK1dpdGggbm8gYXJndW1lbnQsIGxpc3RzIHRlbiBtb3JlIGxpbmVzIGFmdGVyIG9yIGFyb3VuZCBwcmV2aW91cyBsaXN0aW5nLi4qXFtcclxuXF0rXCJsaXN0IC1cIiBsaXN0cyB0aGUgdGVuIGxpbmVzIGJlZm9yZSBhIHByZXZpb3VzIHRlbi1saW5lIGxpc3RpbmcuLipcW1xyXG5cXStPbmUgYXJndW1lbnQgc3BlY2lmaWVzIGEgbGluZSwgYW5kIHRlbiBsaW5lcyBhcmUgbGlzdGVkIGFyb3VuZCB0aGF0IGxpbmUuLipcW1xyXG5cXStUd28gYXJndW1lbnRzIHdpdGggY29tbWEgYmV0d2VlbiBzcGVjaWZ5IHN0YXJ0aW5nIGFuZCBlbmRpbmcgbGluZXMgdG8gbGlzdC4uKlxbXHJcblxdK0xpbmVzIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlc2Ugd2F5czouKlxbXHJcblxdKyAgTElORU5VTSwgdG8gbGlzdCBhcm91bmQgdGhhdCBsaW5lIGluIGN1cnJlbnQgZmlsZSwuKlxbXHJcblxdKyAgRklMRTpMSU5FTlVNLCB0byBsaXN0IGFyb3VuZCB0aGF0IGxpbmUgaW4gdGhhdCBmaWxlLC4qXFtcclxuXF0rICBGVU5DVElPTiwgdG8gbGlzdCBhcm91bmQgYmVnaW5uaW5nIG9mIHRoYXQgZnVuY3Rpb24sLipcW1xyXG5cXSsgIEZJTEU6RlVOQ1RJT04sIHRvIGRpc3Rpbmd1aXNoIGFtb25nIGxpa2UtbmFtZWQgc3RhdGljIGZ1bmN0aW9ucy4uKlxbXHJcblxdKyAgXFsqXF0rQUREUkVTUywgdG8gbGlzdCBhcm91bmQgdGhlIGxpbmUgY29udGFpbmluZyB0aGF0IGFkZHJlc3MuLipcW1xyXG5cXStXaXRoIHR3byBhcmdzIGlmIG9uZSBpcyBlbXB0eSBpdCBzdGFuZHMgZm9yIHRlbiBsaW5lcyBhd2F5IGZyb20gdGhlIG90aGVyIGFyZy4iICJoZWxwIGxpc3QgXCJsXCIgYWJicmV2aWF0aW9uIgorIyB0ZXN0IGhlbHAgbGlzdAorZ2RiX3Rlc3QgImhlbHAgbGlzdCIgIkxpc3Qgc3BlY2lmaWVkIGZ1bmN0aW9uIG9yIGxpbmUuLipcW1xyXG5cXStXaXRoIG5vIGFyZ3VtZW50LCBsaXN0cyB0ZW4gbW9yZSBsaW5lcyBhZnRlciBvciBhcm91bmQgcHJldmlvdXMgbGlzdGluZy4uKlxbXHJcblxdK1wibGlzdCAtXCIgbGlzdHMgdGhlIHRlbiBsaW5lcyBiZWZvcmUgYSBwcmV2aW91cyB0ZW4tbGluZSBsaXN0aW5nLi4qXFtcclxuXF0rT25lIGFyZ3VtZW50IHNwZWNpZmllcyBhIGxpbmUsIGFuZCB0ZW4gbGluZXMgYXJlIGxpc3RlZCBhcm91bmQgdGhhdCBsaW5lLi4qXFtcclxuXF0rVHdvIGFyZ3VtZW50cyB3aXRoIGNvbW1hIGJldHdlZW4gc3BlY2lmeSBzdGFydGluZyBhbmQgZW5kaW5nIGxpbmVzIHRvIGxpc3QuLipcW1xyXG5cXStMaW5lcyBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZXNlIHdheXM6LipcW1xyXG5cXSsgIExJTkVOVU0sIHRvIGxpc3QgYXJvdW5kIHRoYXQgbGluZSBpbiBjdXJyZW50IGZpbGUsLipcW1xyXG5cXSsgIEZJTEU6TElORU5VTSwgdG8gbGlzdCBhcm91bmQgdGhhdCBsaW5lIGluIHRoYXQgZmlsZSwuKlxbXHJcblxdKyAgRlVOQ1RJT04sIHRvIGxpc3QgYXJvdW5kIGJlZ2lubmluZyBvZiB0aGF0IGZ1bmN0aW9uLC4qXFtcclxuXF0rICBGSUxFOkZVTkNUSU9OLCB0byBkaXN0aW5ndWlzaCBhbW9uZyBsaWtlLW5hbWVkIHN0YXRpYyBmdW5jdGlvbnMuLipcW1xyXG5cXSsgIFxbKlxdK0FERFJFU1MsIHRvIGxpc3QgYXJvdW5kIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhhdCBhZGRyZXNzLi4qXFtcclxuXF0rV2l0aCB0d28gYXJncyBpZiBvbmUgaXMgZW1wdHkgaXQgc3RhbmRzIGZvciB0ZW4gbGluZXMgYXdheSBmcm9tIHRoZSBvdGhlciBhcmcuIiAiaGVscCBsaXN0IgorIyB0ZXN0IGhlbHAgbG9hZAorZ2RiX3Rlc3QgImhlbHAgbG9hZCIgIkR5bmFtaWNhbGx5IGxvYWQgRklMRSBpbnRvIHRoZSBydW5uaW5nIHByb2dyYW0sIGFuZCByZWNvcmQgaXRzIHN5bWJvbHMuKlxbXHJcblxdK2ZvciBhY2Nlc3MgZnJvbSBHREIuIiAiaGVscCBsb2FkIgorIyB0ZXN0IGhlbHAgbWFrZQorZ2RiX3Rlc3QgImhlbHAgbWFrZSIgIlJ1biB0aGUgYGBtYWtlJycgcHJvZ3JhbSB1c2luZyB0aGUgcmVzdCBvZiB0aGUgbGluZSBhcyBhcmd1bWVudHMuIiAgImhlbHAgbWFrZSIKKyMgdGVzdCBoZWxwIG5leHQgIm4iIGFiYnJldmlhdGlvbgorZ2RiX3Rlc3QgImhlbHAgbiIgIlN0ZXAgcHJvZ3JhbSwgcHJvY2VlZGluZyB0aHJvdWdoIHN1YnJvdXRpbmUgY2FsbHMuLipcW1xyXG5cXStMaWtlIHRoZSBcInN0ZXBcIiBjb21tYW5kIGFzIGxvbmcgYXMgc3Vicm91dGluZSBjYWxscyBkbyBub3QgaGFwcGVuOy4qXFtcclxuXF0rd2hlbiB0aGV5IGRvLCB0aGUgY2FsbCBpcyB0cmVhdGVkIGFzIG9uZSBpbnN0cnVjdGlvbi4uKlxbXHJcblxdK0FyZ3VtZW50IE4gbWVhbnMgZG8gdGhpcyBOIHRpbWVzIC5vciB0aWxsIHByb2dyYW0gc3RvcHMgZm9yIGFub3RoZXIgcmVhc29uLi4iICJoZWxwIG5leHQgXCJuXCIgYWJicmV2aWF0aW9uIgorIyB0ZXN0IGhlbHAgbmV4dAorZ2RiX3Rlc3QgImhlbHAgbmV4dCIgIlN0ZXAgcHJvZ3JhbSwgcHJvY2VlZGluZyB0aHJvdWdoIHN1YnJvdXRpbmUgY2FsbHMuLipcW1xyXG5cXStMaWtlIHRoZSBcInN0ZXBcIiBjb21tYW5kIGFzIGxvbmcgYXMgc3Vicm91dGluZSBjYWxscyBkbyBub3QgaGFwcGVuOy4qXFtcclxuXF0rd2hlbiB0aGV5IGRvLCB0aGUgY2FsbCBpcyB0cmVhdGVkIGFzIG9uZSBpbnN0cnVjdGlvbi4uKlxbXHJcblxdK0FyZ3VtZW50IE4gbWVhbnMgZG8gdGhpcyBOIHRpbWVzIC5vciB0aWxsIHByb2dyYW0gc3RvcHMgZm9yIGFub3RoZXIgcmVhc29uLi4iICJoZWxwIG5leHQiCisjIHRlc3QgaGVscCBuZXh0aQorZ2RiX3Rlc3QgImhlbHAgbmkiICJTdGVwIG9uZSBpbnN0cnVjdGlvbiwgYnV0IHByb2NlZWQgdGhyb3VnaCBzdWJyb3V0aW5lIGNhbGxzLi4qXFtcclxuXF0rQXJndW1lbnQgTiBtZWFucyBkbyB0aGlzIE4gdGltZXMgLm9yIHRpbGwgcHJvZ3JhbSBzdG9wcyBmb3IgYW5vdGhlciByZWFzb24uLiIgImhlbHAgbmV4dGkiCisjIGFsbCB0aGUgY29tbWFuZHMgdGhhdCB1c2VkIHRvIGJlIGhlcmUgYXJlIG5vdyBpbiAibWFpbnRhaW5hbmNlIiBpbnN0ZWFkCisjIHRlc3QgaGVscCBvYnNjdXJlCitnZGJfdGVzdCAiaGVscCBvYnNjdXJlIiAiT2JzY3VyZSBmZWF0dXJlcy4uKlxbXHJcblxdK0xpc3Qgb2YgY29tbWFuZHM6LipcW1xyXG5cXStUeXBlIFwiaGVscFwiIGZvbGxvd2VkIGJ5IGNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLi4qXFtcclxuXF0rQ29tbWFuZCBuYW1lIGFiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQgaWYgdW5hbWJpZ3VvdXMuIiAiaGVscCBvYnNjdXJlIgorIyB0ZXN0IGhlbHAgb3V0cHV0CitnZGJfdGVzdCAiaGVscCBvdXRwdXQiICJMaWtlIFwicHJpbnRcIiBidXQgZG9uJ3QgcHV0IGluIHZhbHVlIGhpc3RvcnkgYW5kIGRvbid0IHByaW50IG5ld2xpbmUuLipcW1xyXG5cXStUaGlzIGlzIHVzZWZ1bCBpbiB1c2VyLWRlZmluZWQgY29tbWFuZHMuIiAiaGVscCBvdXRwdXQiCisjIHRlc3QgaGVscCBvdmVybGF5CitnZGJfdGVzdCAiaGVscCBvdmVybGF5IiAgICAgICAiQ29tbWFuZHMgZm9yIGRlYnVnZ2luZyBvdmVybGF5cy4qIgorZ2RiX3Rlc3QgImhlbHAgb3ZlcmxheSBvZmYiICAgIkRpc2FibGUgb3ZlcmxheSBkZWJ1Z2dpbmcuIgorZ2RiX3Rlc3QgImhlbHAgb3ZlcmxheSBtYW51YWwiICJFbmFibGUgb3ZlcmxheSBkZWJ1Z2dpbmcuIgorZ2RiX3Rlc3QgImhlbHAgb3ZlcmxheSBhdXRvIiAgIkVuYWJsZSBhdXRvbWF0aWMgb3ZlcmxheSBkZWJ1Z2dpbmcuIgorZ2RiX3Rlc3QgImhlbHAgb3ZlcmxheSBsaXN0IiAgIkxpc3QgbWFwcGluZ3Mgb2Ygb3ZlcmxheSBzZWN0aW9ucy4iCitnZGJfdGVzdCAiaGVscCBvdmVybGF5IG1hcCIgICAiQXNzZXJ0IHRoYXQgYW4gb3ZlcmxheSBzZWN0aW9uIGlzIG1hcHBlZC4iCitnZGJfdGVzdCAiaGVscCBvdmVybGF5IHVubWFwIiAiQXNzZXJ0IHRoYXQgYW4gb3ZlcmxheSBzZWN0aW9uIGlzIHVubWFwcGVkLiIKK2dkYl90ZXN0ICJoZWxwIG92ZXJsYXkgbG9hZCIgICJSZWFkIHRoZSBvdmVybGF5IG1hcHBpbmcgc3RhdGUgZnJvbSB0aGUgdGFyZ2V0LiIKKyMgdGVzdCBoZWxwIHByaW50ICJwIiBhYmJyZXZpYXRpb24KK2dkYl90ZXN0ICJoZWxwIHAiICJQcmludCB2YWx1ZSBvZiBleHByZXNzaW9uIEVYUC4uKlxbXHJcblxdK1ZhcmlhYmxlcyBhY2Nlc3NpYmxlIGFyZSB0aG9zZSBvZiB0aGUgbGV4aWNhbCBlbnZpcm9ubWVudCBvZiB0aGUgc2VsZWN0ZWQuKlxbXHJcblxdK0VYUCBtYXkgYmUgcHJlY2VkZWQgd2l0aCAvRk1ULCB3aGVyZSBGTVQgaXMgYSBmb3JtYXQgbGV0dGVyLipcW1xyXG5cXStidXQgbm8gY291bnQgb3Igc2l6ZSBsZXR0ZXIgLnNlZSBcInhcIiBjb21tYW5kLi4iICJoZWxwIHByaW50IFwicFwiIGFiYnJldmlhdGlvbiIKKyMgdGVzdCBoZWxwIHByaW50CitnZGJfdGVzdCAiaGVscCBwcmludCIgIlByaW50IHZhbHVlIG9mIGV4cHJlc3Npb24gRVhQLi4qXFtcclxuXF0rVmFyaWFibGVzIGFjY2Vzc2libGUgYXJlIHRob3NlIG9mIHRoZSBsZXhpY2FsIGVudmlyb25tZW50IG9mIHRoZSBzZWxlY3RlZC4qXFtcclxuXF0rRVhQIG1heSBiZSBwcmVjZWRlZCB3aXRoIC9GTVQsIHdoZXJlIEZNVCBpcyBhIGZvcm1hdCBsZXR0ZXIuKlxbXHJcblxdK2J1dCBubyBjb3VudCBvciBzaXplIGxldHRlciAuc2VlIFwieFwiIGNvbW1hbmQuLiIgImhlbHAgcHJpbnQiCisjIHRlc3QgaGVscCBwYXRoCitnZGJfdGVzdCAiaGVscCBwYXRoIiAiQWRkIGRpcmVjdG9yeSBESVIucy4gdG8gYmVnaW5uaW5nIG9mIHNlYXJjaCBwYXRoIGZvciBvYmplY3QgZmlsZXMuLipcW1xyXG5cXSsuY3dkIGluIHRoZSBwYXRoIG1lYW5zIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Li4qXFtcclxuXF0rVGhpcyBwYXRoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIC5QQVRIIHNoZWxsIHZhcmlhYmxlLiAgSXQgaXMgYSBsaXN0IG9mLipcW1xyXG5cXStkaXJlY3Rvcmllcywgc2VwYXJhdGVkIGJ5IGNvbG9ucy4gIFRoZXNlIGRpcmVjdG9yaWVzIGFyZSBzZWFyY2hlZCB0byBmaW5kLipcW1xyXG5cXStmdWxseSBsaW5rZWQgZXhlY3V0YWJsZSBmaWxlcyBhbmQgc2VwYXJhdGVseSBjb21waWxlZCBvYmplY3QgZmlsZXMgYXMgbmVlZGVkLiIgImhlbHAgcGF0aCIKKyMgdGVzdCBoZWxwIHByaW50Y21kcworZ2RiX3Rlc3QgImhlbHAgcHJpbnRjbWRzIiAiVW5kZWZpbmVkIGNvbW1hbmQ6IFwicHJpbnRjbWRzXCIuICBUcnkgXCJoZWxwXCIuIiAgImhlbHAgcHJpbnRjbWRzIgorIyB0ZXN0IGhlbHAgcHJpbnRmCitnZGJfdGVzdCAiaGVscCBwcmludGYiICJwcmludGYgXCJwcmludGYgZm9ybWF0IHN0cmluZ1wiLCBhcmcxLCBhcmcyLCBhcmczLCAuLi4sIGFyZ24uKlxbXHJcblxdK1RoaXMgaXMgdXNlZnVsIGZvciBmb3JtYXR0ZWQgb3V0cHV0IGluIHVzZXItZGVmaW5lZCBjb21tYW5kcy4iICJoZWxwIHByaW50ZiIKKyMgdGVzdCBoZWxwIHB0eXBlCitnZGJfdGVzdCAiaGVscCBwdHlwZSIgIlByaW50IGRlZmluaXRpb24gb2YgdHlwZS4qIiAgImhlbHAgcHR5cGUiCisjIHRlc3QgaGVscCBwd2QKK2dkYl90ZXN0ICJoZWxwIHB3ZCIgIlByaW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgVGhpcyBpcyB1c2VkIGZvciB5b3VyIHByb2dyYW0gYXMgd2VsbC4iICAiaGVscCBwd2QiCisjIHRlc3QgaGVscCBxdWl0ICJxIiBhYmJyZXZpYXRpb24KK2dkYl90ZXN0ICJoZWxwIHEiICJFeGl0IGdkYi4iICJoZWxwIHF1aXQgXCJxXCIgYWJicmV2aWF0aW9uIgorIyB0ZXN0IGhlbHAgcXVpdAorZ2RiX3Rlc3QgImhlbHAgcXVpdCIgIkV4aXQgZ2RiLiIgICJoZWxwIHF1aXQiCisjIHRlc3QgaGVscCBydW4gInIiIGFiYnJldmlhdGlvbgorZ2RiX3Rlc3QgImhlbHAgciIgIlN0YXJ0IGRlYnVnZ2VkIHByb2dyYW0uICBZb3UgbWF5IHNwZWNpZnkgYXJndW1lbnRzIHRvIGdpdmUgaXQuLipcW1xyXG5cXStBcmdzIG1heSBpbmNsdWRlIC4qLCBvciAuKjsgdGhleSBhcmUgZXhwYW5kZWQgdXNpbmcgXCJzaFwiLi4qXFtcclxuXF0rSW5wdXQgYW5kIG91dHB1dCByZWRpcmVjdGlvbiB3aXRoIFwiLlwiLCBcIi5cIiwgb3IgXCIuLlwiIGFyZSBhbHNvIGFsbG93ZWQuLipcW1xyXG5cXStXaXRoIG5vIGFyZ3VtZW50cywgdXNlcyBhcmd1bWVudHMgbGFzdCBzcGVjaWZpZWQgLndpdGggXCJydW5cIiBvciBcInNldCBhcmdzXCIuLi4qXFtcclxuXF0rVG8gY2FuY2VsIHByZXZpb3VzIGFyZ3VtZW50cyBhbmQgcnVuIHdpdGggbm8gYXJndW1lbnRzLC4qXFtcclxuXF0rdXNlIFwic2V0IGFyZ3NcIiB3aXRob3V0IGFyZ3VtZW50cy4iICJoZWxwIHJ1biBcInJcIiBhYmJyZXZpYXRpb24iCisjIHRlc3QgaGVscCBydW4KK2dkYl90ZXN0ICJoZWxwIHJ1biIgIlN0YXJ0IGRlYnVnZ2VkIHByb2dyYW0uICBZb3UgbWF5IHNwZWNpZnkgYXJndW1lbnRzIHRvIGdpdmUgaXQuLipcW1xyXG5cXStBcmdzIG1heSBpbmNsdWRlIC4qLCBvciAuKjsgdGhleSBhcmUgZXhwYW5kZWQgdXNpbmcgXCJzaFwiLi4qXFtcclxuXF0rSW5wdXQgYW5kIG91dHB1dCByZWRpcmVjdGlvbiB3aXRoIFwiLlwiLCBcIi5cIiwgb3IgXCIuLlwiIGFyZSBhbHNvIGFsbG93ZWQuLipcW1xyXG5cXStXaXRoIG5vIGFyZ3VtZW50cywgdXNlcyBhcmd1bWVudHMgbGFzdCBzcGVjaWZpZWQgLndpdGggXCJydW5cIiBvciBcInNldCBhcmdzXCIuLi4qXFtcclxuXF0rVG8gY2FuY2VsIHByZXZpb3VzIGFyZ3VtZW50cyBhbmQgcnVuIHdpdGggbm8gYXJndW1lbnRzLC4qXFtcclxuXF0rdXNlIFwic2V0IGFyZ3NcIiB3aXRob3V0IGFyZ3VtZW50cy4iICJoZWxwIHJ1biIKKyMgdGVzdCBoZWxwIHJicmVhaworZ2RiX3Rlc3QgImhlbHAgcmJyZWFrIiAiU2V0IGEgYnJlYWtwb2ludCBmb3IgYWxsIGZ1bmN0aW9ucyBtYXRjaGluZyBSRUdFWFAuIiAgImhlbHAgcmJyZWFrIgorIyB0ZXN0IGhlbHAgcmV0dXJuCitnZGJfdGVzdCAiaGVscCByZXR1cm4iICJNYWtlIHNlbGVjdGVkIHN0YWNrIGZyYW1lIHJldHVybiB0byBpdHMgY2FsbGVyLi4qXFtcclxuXF0rQ29udHJvbCByZW1haW5zIGluIHRoZSBkZWJ1Z2dlciwgYnV0IHdoZW4geW91IGNvbnRpbnVlLipcW1xyXG5cXStleGVjdXRpb24gd2lsbCByZXN1bWUgaW4gdGhlIGZyYW1lIGFib3ZlIHRoZSBvbmUgbm93IHNlbGVjdGVkLi4qXFtcclxuXF0rSWYgYW4gYXJndW1lbnQgaXMgZ2l2ZW4sIGl0IGlzIGFuIGV4cHJlc3Npb24gZm9yIHRoZSB2YWx1ZSB0byByZXR1cm4uIiAiaGVscCByZXR1cm4iCisjIHRlc3QgaGVscCByZXZlcnNlLXNlYXJjaAorZ2RiX3Rlc3QgImhlbHAgcmV2ZXJzZS1zZWFyY2giICJTZWFyY2ggYmFja3dhcmQgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbiAuc2VlIHJlZ2V4LjMuLiBmcm9tIGxhc3QgbGluZSBsaXN0ZWQuLioiICAiaGVscCByZXZlcnNlLXNlYXJjaCIKKyMgdGVzdCBoZWxwIHJ1bm5pbmcKK2dkYl90ZXN0ICJoZWxwIHJ1bm5pbmciICJSdW5uaW5nIHRoZSBwcm9ncmFtLi4qXFtcclxuXF0rTGlzdCBvZiBjb21tYW5kczouKlxbXHJcblxdK1R5cGUgXCJoZWxwXCIgZm9sbG93ZWQgYnkgY29tbWFuZCBuYW1lIGZvciBmdWxsIGRvY3VtZW50YXRpb24uLipcW1xyXG5cXStDb21tYW5kIG5hbWUgYWJicmV2aWF0aW9ucyBhcmUgYWxsb3dlZCBpZiB1bmFtYmlndW91cy4iICJoZWxwIHJ1bm5pbmciCisjIHRlc3QgaGVscCBzdGVwICJzIiBhYmJyZXZpYXRpb24KK2dkYl90ZXN0ICJoZWxwIHMiICJTdGVwIHByb2dyYW0gdW50aWwgaXQgcmVhY2hlcyBhIGRpZmZlcmVudCBzb3VyY2UgbGluZS4uKlxbXHJcblxdK0FyZ3VtZW50IE4gbWVhbnMgZG8gdGhpcyBOIHRpbWVzIC5vciB0aWxsIHByb2dyYW0gc3RvcHMgZm9yIGFub3RoZXIgcmVhc29uLi4iICJoZWxwIHN0ZXAgXCJzXCIgYWJicmV2aWF0aW9uIgorIyB0ZXN0IGhlbHAgc3RlcAorZ2RiX3Rlc3QgImhlbHAgc3RlcCIgIlN0ZXAgcHJvZ3JhbSB1bnRpbCBpdCByZWFjaGVzIGEgZGlmZmVyZW50IHNvdXJjZSBsaW5lLi4qXFtcclxuXF0rQXJndW1lbnQgTiBtZWFucyBkbyB0aGlzIE4gdGltZXMgLm9yIHRpbGwgcHJvZ3JhbSBzdG9wcyBmb3IgYW5vdGhlciByZWFzb24uLiIgImhlbHAgc3RlcCAjMSIKKyMgdGVzdCBoZWxwIHNlYXJjaAorZ2RiX3Rlc3QgImhlbHAgc2VhcmNoIiAiU2VhcmNoIGZvciByZWd1bGFyIGV4cHJlc3Npb24gLnNlZSByZWdleC4zLi4gZnJvbSBsYXN0IGxpbmUgbGlzdGVkLi4qIiAgImhlbHAgc2VhcmNoIgorIyB0ZXN0IGhlbHAgc2VjdGlvbgorZ2RiX3Rlc3QgImhlbHAgc2VjdGlvbiIgIkNoYW5nZSB0aGUgYmFzZSBhZGRyZXNzIG9mIHNlY3Rpb24gU0VDVElPTiBvZiB0aGUgZXhlYyBmaWxlIHRvIEFERFIuLipcW1xyXG5cXStUaGlzIGNhbiBiZSB1c2VkIGlmIHRoZSBleGVjIGZpbGUgZG9lcyBub3QgY29udGFpbiBzZWN0aW9uIGFkZHJlc3NlcywuKlxbXHJcblxdKy5zdWNoIGFzIGluIHRoZSBhLm91dCBmb3JtYXQuLCBvciB3aGVuIHRoZSBhZGRyZXNzZXMgc3BlY2lmaWVkIGluIHRoZS4qXFtcclxuXF0rZmlsZSBpdHNlbGYgYXJlIHdyb25nLiAgRWFjaCBzZWN0aW9uIG11c3QgYmUgY2hhbmdlZCBzZXBhcmF0ZWx5LiAgVGhlLipcW1xyXG5cXStgYGluZm8gZmlsZXMnJyBjb21tYW5kIGxpc3RzIGFsbCB0aGUgc2VjdGlvbnMgYW5kIHRoZWlyIGFkZHJlc3Nlcy4iICJoZWxwIHNlY3Rpb24iCisjdGVzdCBoZWxwIHNldCBhbm5vdGF0ZQorZ2RiX3Rlc3QgImhlbHAgc2V0IGFubm90YXRlIiAiU2V0IGFubm90YXRpb25fbGV2ZWwuKlxbXHJcblxdKzAgPT0gbm9ybWFsOyAgICAgMSA9PSBmdWxsbmFtZSBcXChmb3IgdXNlIHdoZW4gcnVubmluZyB1bmRlciBlbWFjc1xcKS4qXFtcclxuXF0rMiA9PSBvdXRwdXQgYW5ub3RhdGVkIHN1aXRhYmx5IGZvciB1c2UgYnkgcHJvZ3JhbXMgdGhhdCBjb250cm9sIEdEQi4iICJoZWxwIHNldCBhbm5vdGF0ZSIKKyMgdGVzdCBoZWxwIHNldCBhcmdzCitnZGJfdGVzdCAiaGVscCBzZXQgYXJncyIgIlNldCBhcmd1bWVudCBsaXN0IHRvIGdpdmUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZCB3aGVuIGl0IGlzIHN0YXJ0ZWQuLipcW1xyXG5cXStGb2xsb3cgdGhpcyBjb21tYW5kIHdpdGggYW55IG51bWJlciBvZiBhcmdzLCB0byBiZSBwYXNzZWQgdG8gdGhlIHByb2dyYW0uIgorIyB0ZXN0IGhlbHAgc2V0IGNoZWNrICJjIiBhYmJyZXZpYXRpb24KK2dkYl90ZXN0ICJoZWxwIHNldCBjIiAiU2V0IHRoZSBzdGF0dXMgb2YgdGhlIHR5cGUvcmFuZ2UgY2hlY2tlci4qXFtcclxuXF0rTGlzdCBvZiBzZXQgY2hlY2sgc3ViY29tbWFuZHM6LipcW1xyXG5cXStzZXQgY2hlY2sgcmFuZ2UgLS0gU2V0IHJhbmdlIGNoZWNraW5nLipcW1xyXG5cXStzZXQgY2hlY2sgdHlwZSAtLSBTZXQgdHlwZSBjaGVja2luZy4qXFtcclxuXF0rVHlwZSBcImhlbHAgc2V0IGNoZWNrXCIgZm9sbG93ZWQgYnkgc2V0IGNoZWNrIHN1YmNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLi4qXFtcclxuXF0rQ29tbWFuZCBuYW1lIGFiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQgaWYgdW5hbWJpZ3VvdXMuIiAiaGVscCBzZXQgY2hlY2sgXCJjXCIgYWJicmV2aWF0aW9uIgorIyB0ZXN0IGhlbHAgc2V0IGNoZWNrICJjaCIgYWJicmV2aWF0aW9uCitnZGJfdGVzdCAiaGVscCBzZXQgY2giICJTZXQgdGhlIHN0YXR1cyBvZiB0aGUgdHlwZS9yYW5nZSBjaGVja2VyLipcW1xyXG5cXStMaXN0IG9mIHNldCBjaGVjayBzdWJjb21tYW5kczouKlxbXHJcblxdK3NldCBjaGVjayByYW5nZSAtLSBTZXQgcmFuZ2UgY2hlY2tpbmcuKlxbXHJcblxdK3NldCBjaGVjayB0eXBlIC0tIFNldCB0eXBlIGNoZWNraW5nLipcW1xyXG5cXStUeXBlIFwiaGVscCBzZXQgY2hlY2tcIiBmb2xsb3dlZCBieSBzZXQgY2hlY2sgc3ViY29tbWFuZCBuYW1lIGZvciBmdWxsIGRvY3VtZW50YXRpb24uLipcW1xyXG5cXStDb21tYW5kIG5hbWUgYWJicmV2aWF0aW9ucyBhcmUgYWxsb3dlZCBpZiB1bmFtYmlndW91cy4iICJoZWxwIHNldCBjaGVjayBcImNoXCIgYWJicmV2aWF0aW9uIgorIyB0ZXN0IGhlbHAgc2V0IGNoZWNrCitnZGJfdGVzdCAiaGVscCBzZXQgY2hlY2siICJTZXQgdGhlIHN0YXR1cyBvZiB0aGUgdHlwZS9yYW5nZSBjaGVja2VyLipcW1xyXG5cXStMaXN0IG9mIHNldCBjaGVjayBzdWJjb21tYW5kczouKlxbXHJcblxdK3NldCBjaGVjayByYW5nZSAtLSBTZXQgcmFuZ2UgY2hlY2tpbmcuKlxbXHJcblxdK3NldCBjaGVjayB0eXBlIC0tIFNldCB0eXBlIGNoZWNraW5nLipcW1xyXG5cXStUeXBlIFwiaGVscCBzZXQgY2hlY2tcIiBmb2xsb3dlZCBieSBzZXQgY2hlY2sgc3ViY29tbWFuZCBuYW1lIGZvciBmdWxsIGRvY3VtZW50YXRpb24uLipcW1xyXG5cXStDb21tYW5kIG5hbWUgYWJicmV2aWF0aW9ucyBhcmUgYWxsb3dlZCBpZiB1bmFtYmlndW91cy4iICJoZWxwIHNldCBjaGVjayIKKyMgdGVzdCBoZWxwIHNldCBjaGVjayByYW5nZQorZ2RiX3Rlc3QgImhlbHAgc2V0IGNoZWNrIHJhbmdlIiAiU2V0IHJhbmdlIGNoZWNraW5nLiAgLm9uL3dhcm4vb2ZmL2F1dG8uIiAgImhlbHAgc2V0IGNoZWNrIHJhbmdlIgorIyB0ZXN0IGhlbHAgc2V0IGNoZWNrIHR5cGUKK2dkYl90ZXN0ICJoZWxwIHNldCBjaGVjayB0eXBlIiAiU2V0IHR5cGUgY2hlY2tpbmcuICAub24vd2Fybi9vZmYvYXV0by4iICAiaGVscCBzZXQgY2hlY2sgdHlwZSIKKyMgdGVzdCBoZWxwIHNldCBjb21wbGFpbnRzCitnZGJfdGVzdCAiaGVscCBzZXQgY29tcGxhaW50cyIgIlNldCBtYXggbnVtYmVyIG9mIGNvbXBsYWludHMgYWJvdXQgaW5jb3JyZWN0IHN5bWJvbHMuIiAgImhlbHAgc2V0IGNvbXBsYWludHMiCisjIHRlc3QgaGVscCBzZXQgY29uZmlybQorZ2RiX3Rlc3QgImhlbHAgc2V0IGNvbmZpcm0iICJTZXQgd2hldGhlciB0byBjb25maXJtIHBvdGVudGlhbGx5IGRhbmdlcm91cyBvcGVyYXRpb25zLiIgICJoZWxwIHNldCBjb25maXJtIgorIyB0ZXN0IGhlbHAgc2V0IGVkaXRpbmcKK2dkYl90ZXN0ICJoZWxwIHNldCBlZGl0aW5nIiAiU2V0IGVkaXRpbmcgb2YgY29tbWFuZCBsaW5lcyBhcyB0aGV5IGFyZSB0eXBlZC4uKlxbXHJcblxdK1VzZSBcIm9uXCIgdG8gZW5hYmxlIHRoZSBlZGl0aW5nLCBhbmQgXCJvZmZcIiB0byBkaXNhYmxlIGl0Li4qXFtcclxuXF0rV2l0aG91dCBhbiBhcmd1bWVudCwgY29tbWFuZCBsaW5lIGVkaXRpbmcgaXMgZW5hYmxlZC4gIFRvIGVkaXQsIHVzZS4qXFtcclxuXF0rRU1BQ1MtbGlrZSBvciBWSS1saWtlIGNvbW1hbmRzIGxpa2UgY29udHJvbC1QIG9yIEVTQy4iICJoZWxwIHNldCBlZGl0aW5nIgorIyB0ZXN0IGhlbHAgc2V0IGVudmlyb25tZW50CitnZGJfdGVzdCAiaGVscCBzZXQgZW52aXJvbm1lbnQiICJTZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbS4uKlxbXHJcblxdK0FyZ3VtZW50cyBhcmUgVkFSIFZBTFVFIHdoZXJlIFZBUiBpcyB2YXJpYWJsZSBuYW1lIGFuZCBWQUxVRSBpcyB2YWx1ZS4uKlxbXHJcblxdK1ZBTFVFUyBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHVuaW50ZXJwcmV0ZWQgc3RyaW5ncy4uKlxbXHJcblxdK1RoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBwcm9ncmFtIHVudGlsIHRoZSBuZXh0IFwicnVuXCIgY29tbWFuZC4iICJoZWxwIHNldCBlbnZpcm9ubWVudCIKKyMgdGVzdCBoZWxwIHNldCBoZWlnaHQKK2dkYl90ZXN0ICJoZWxwIHNldCBoZWlnaHQiICJTZXQgbnVtYmVyIG9mIGxpbmVzIGdkYiB0aGlua3MgYXJlIGluIGEgcGFnZS4iICAiaGVscCBzZXQgaGVpZ2h0IgorIyB0ZXN0IGhlbHAgc2V0IGhpc3RvcnkgZXhwYW5zaW9uCitnZGJfdGVzdCAiaGVscCBzZXQgaGlzdG9yeSBleHBhbnNpb24iICJTZXQgaGlzdG9yeSBleHBhbnNpb24gb24gY29tbWFuZCBpbnB1dC4uKlxbXHJcblxdK1dpdGhvdXQgYW4gYXJndW1lbnQsIGhpc3RvcnkgZXhwYW5zaW9uIGlzIGVuYWJsZWQuIiAiaGVscCBzZXQgaGlzdG9yeSBleHBhbnNpb24iCisjIHRlc3QgaGVscCBzZXQgaGlzdG9yeSBmaWxlbmFtZQorZ2RiX3Rlc3QgImhlbHAgc2V0IGhpc3RvcnkgZmlsZW5hbWUiICJTZXQgdGhlIGZpbGVuYW1lIGluIHdoaWNoIHRvIHJlY29yZCB0aGUgY29tbWFuZCBoaXN0b3J5LipcW1xyXG5cXSsgLnRoZSBsaXN0IG9mIHByZXZpb3VzIGNvbW1hbmRzIG9mIHdoaWNoIGEgcmVjb3JkIGlzIGtlcHQuLiIgImhlbHAgc2V0IGhpc3RvcnkgZmlsZW5hbWUiCisjIHRlc3QgaGVscCBzZXQgaGlzdG9yeSBzYXZlCitnZGJfdGVzdCAiaGVscCBzZXQgaGlzdG9yeSBzYXZlIiAiU2V0IHNhdmluZyBvZiB0aGUgaGlzdG9yeSByZWNvcmQgb24gZXhpdC4uKlxbXHJcblxdK1VzZSBcIm9uXCIgdG8gZW5hYmxlIHRoZSBzYXZpbmcsIGFuZCBcIm9mZlwiIHRvIGRpc2FibGUgaXQuLipcW1xyXG5cXStXaXRob3V0IGFuIGFyZ3VtZW50LCBzYXZpbmcgaXMgZW5hYmxlZC4iICJoZWxwIHNldCBoaXN0b3J5IHNhdmUiCisjIHRlc3QgaGVscCBzZXQgaGlzdG9yeSBzaXplCitnZGJfdGVzdCAiaGVscCBzZXQgaGlzdG9yeSBzaXplIiAiU2V0IHRoZSBzaXplIG9mIHRoZSBjb21tYW5kIGhpc3RvcnksIC4qXFtcclxuXF0raWUuIHRoZSBudW1iZXIgb2YgcHJldmlvdXMgY29tbWFuZHMgdG8ga2VlcCBhIHJlY29yZCBvZi4iICJoZWxwIHNldCBoaXN0b3J5IHNpemUiCisjIHRlc3QgaGVscCBzZXQgaGlzdG9yeQorZ2RiX3Rlc3QgImhlbHAgc2V0IGhpc3RvcnkiICJHZW5lcmljIGNvbW1hbmQgZm9yIHNldHRpbmcgY29tbWFuZCBoaXN0b3J5IHBhcmFtZXRlcnMuLipcW1xyXG5cXStMaXN0IG9mIHNldCBoaXN0b3J5IHN1YmNvbW1hbmRzOi4qXFtcclxuXF0rc2V0IGhpc3RvcnkgZXhwYW5zaW9uIC0tIFNldCBoaXN0b3J5IGV4cGFuc2lvbiBvbiBjb21tYW5kIGlucHV0LipcW1xyXG5cXStzZXQgaGlzdG9yeSBmaWxlbmFtZSAtLSBTZXQgdGhlIGZpbGVuYW1lIGluIHdoaWNoIHRvIHJlY29yZCB0aGUgY29tbWFuZCBoaXN0b3J5LipcW1xyXG5cXStzZXQgaGlzdG9yeSBzYXZlIC0tIFNldCBzYXZpbmcgb2YgdGhlIGhpc3RvcnkgcmVjb3JkIG9uIGV4aXQuKlxbXHJcblxdK3NldCBoaXN0b3J5IHNpemUgLS0gU2V0IHRoZSBzaXplIG9mIHRoZSBjb21tYW5kIGhpc3RvcnkuKlxbXHJcblxdK1R5cGUgXCJoZWxwIHNldCBoaXN0b3J5XCIgZm9sbG93ZWQgYnkgc2V0IGhpc3Rvcnkgc3ViY29tbWFuZCBuYW1lIGZvciBmdWxsIGRvY3VtZW50YXRpb24uLipcW1xyXG5cXStDb21tYW5kIG5hbWUgYWJicmV2aWF0aW9ucyBhcmUgYWxsb3dlZCBpZiB1bmFtYmlndW91cy4iICJoZWxwIHNldCBoaXN0b3J5IgorIyB0ZXN0IGhlbHAgc2V0IGxhbmd1YWdlCitnZGJfdGVzdCAiaGVscCBzZXQgbGFuZ3VhZ2UiICJTZXQgdGhlIGN1cnJlbnQgc291cmNlIGxhbmd1YWdlLiIgICJoZWxwIHNldCBsYW5ndWFnZSIKKyMgdGVzdCBoZWxwIHNldCBsaXN0c2l6ZQorZ2RiX3Rlc3QgImhlbHAgc2V0IGxpc3RzaXplIiAiU2V0IG51bWJlciBvZiBzb3VyY2UgbGluZXMgZ2RiIHdpbGwgbGlzdCBieSBkZWZhdWx0LiIgICJoZWxwIHNldCBsaXN0c2l6ZSIKKyMgdGVzdCBoZWxwIHNldCBwcmludCAicCIgYWJicmV2aWF0aW9uCisjIEZJWE1FIC0tIFVsdHJpeCBoYW5ncyByYW5kb21seSBvbiB0aGlzIHZlcnkgbG9uZyBvdXRwdXQgZnJvbSBnZGIgYW5kCisjIGNvbnRpbnVlcyB3aXRoIGl0cyBvdXRwdXQgb25seSBpZiBzb21ldGhpbmcgaXMgc2VudCB0byBnZGIuCisjIEFsc28sIGlmIHRoZSBzeXN0ZW0gaXMgc2xvdywgaXQgbWF5IHRpbWUgb3V0IGJlY2F1c2UgdGhlIG91dHB1dCBpcyBsYXJnZS4KK2dkYl90ZXN0ICJoZWxwIHNldCBwIiAiLipcW1xyXG5cXStHZW5lcmljIGNvbW1hbmQgZm9yIHNldHRpbmcgaG93IHRoaW5ncyBwcmludC4uKlxbXHJcblxdK0xpc3Qgb2Ygc2V0IHByaW50IHN1YmNvbW1hbmRzOi4qXFtcclxuXF0rVHlwZSBcImhlbHAgc2V0IHByaW50XCIgZm9sbG93ZWQgYnkgc2V0IHByaW50IHN1YmNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLi4qXFtcclxuXF0rQ29tbWFuZCBuYW1lIGFiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQgaWYgdW5hbWJpZ3VvdXMuIiAiaGVscCBzZXQgcHJpbnQgXCJwXCIgYWJicmV2aWF0aW8iCisjIHRlc3QgaGVscCBzZXQgcHJpbnQgInByIiBhYmJyZXZpYXRpb24KK2dkYl90ZXN0ICJoZWxwIHNldCBwciIgIi4qXFtcclxuXF0rR2VuZXJpYyBjb21tYW5kIGZvciBzZXR0aW5nIGhvdyB0aGluZ3MgcHJpbnQuLipcW1xyXG5cXStMaXN0IG9mIHNldCBwcmludCBzdWJjb21tYW5kczouKlxbXHJcblxdK1R5cGUgXCJoZWxwIHNldCBwcmludFwiIGZvbGxvd2VkIGJ5IHNldCBwcmludCBzdWJjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4uKlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLiIgImhlbHAgc2V0IHByaW50IFwicHJcIiBhYmJyZXZpYXRpb24iCisjIHRlc3QgaGVscCBzZXQgcHJpbnQKK2dkYl90ZXN0ICJoZWxwIHNldCBwcmludCIgIi4qXFtcclxuXF0rR2VuZXJpYyBjb21tYW5kIGZvciBzZXR0aW5nIGhvdyB0aGluZ3MgcHJpbnQuLipcW1xyXG5cXStMaXN0IG9mIHNldCBwcmludCBzdWJjb21tYW5kczouKlxbXHJcblxdK1R5cGUgXCJoZWxwIHNldCBwcmludFwiIGZvbGxvd2VkIGJ5IHNldCBwcmludCBzdWJjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4uKlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLiIgImhlbHAgc2V0IHByaW50IgorIyB0ZXN0IGhlbHAgc2V0IHByaW50IGFkZHJlc3MKK2dkYl90ZXN0ICJoZWxwIHNldCBwcmludCBhZGRyZXNzIiAiU2V0IHByaW50aW5nIG9mIGFkZHJlc3Nlcy4iICAiaGVscCBzZXQgcHJpbnQgYWRkcmVzcyIKKyMgdGVzdCBoZWxwIHNldCBwcmludCBhcnJheQorZ2RiX3Rlc3QgImhlbHAgc2V0IHByaW50IGFycmF5IiAiU2V0IHByZXR0eXByaW50aW5nIG9mIGFycmF5cy4iICAiaGVscCBzZXQgcHJpbnQgYXJyYXkiCisjIHRlc3QgaGVscCBzZXQgcHJpbnQgYXNtLWRlbWFuZ2xlCitnZGJfdGVzdCAiaGVscCBzZXQgcHJpbnQgYXNtLWRlbWFuZ2xlIiAiU2V0IGRlbWFuZ2xpbmcgb2YgQ1xbK1xdKyBuYW1lcyBpbiBkaXNhc3NlbWJseSBsaXN0aW5ncy4iICAiaGVscCBzZXQgcHJpbnQgYXNtLWRlbWFuZ2xlIgorIyB0ZXN0IGhlbHAgc2V0IHByaW50IGRlbWFuZ2xlCitnZGJfdGVzdCAiaGVscCBzZXQgcHJpbnQgZGVtYW5nbGUiICJTZXQgZGVtYW5nbGluZyBvZiBlbmNvZGVkIENcWytcXSsgbmFtZXMgd2hlbiBkaXNwbGF5aW5nIHN5bWJvbHMuIiAgImhlbHAgc2V0IHByaW50IGRlbWFuZ2xlIgorIyB0ZXN0IGhlbHAgc2V0IHByaW50IGVsZW1lbnRzCitnZGJfdGVzdCAiaGVscCBzZXQgcHJpbnQgZWxlbWVudHMiICJTZXQgbGltaXQgb24gc3RyaW5nIGNoYXJzIG9yIGFycmF5IGVsZW1lbnRzIHRvIHByaW50Li4qXFtcclxuXF0rXCJzZXQgcHJpbnQgZWxlbWVudHMgMFwiIGNhdXNlcyB0aGVyZSB0byBiZSBubyBsaW1pdC4iICJoZWxwIHNldCBwcmludCBlbGVtZW50cyIKKyMgdGVzdCBoZWxwIHNldCBwcmludCBvYmplY3QKK2dkYl90ZXN0ICJoZWxwIHNldCBwcmludCBvYmplY3QiICJTZXQgcHJpbnRpbmcgb2Ygb2JqZWN0J3MgZGVyaXZlZCB0eXBlIGJhc2VkIG9uIHZ0YWJsZSBpbmZvLiIgICJoZWxwIHNldCBwcmludCBvYmplY3QiCisjIHRlc3QgaGVscCBzZXQgcHJpbnQgcHJldHR5CitnZGJfdGVzdCAiaGVscCBzZXQgcHJpbnQgcHJldHR5IiAiU2V0IHByZXR0eXByaW50aW5nIG9mIHN0cnVjdHVyZXMuIiAgImhlbHAgc2V0IHByaW50IHByZXR0eSIKKyMgdGVzdCBoZWxwIHNldCBwcmludCBzZXZlbmJpdC1zdHJpbmdzCitnZGJfdGVzdCAiaGVscCBzZXQgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncyIgIlNldCBwcmludGluZyBvZiA4LWJpdCBjaGFyYWN0ZXJzIGluIHN0cmluZ3MgYXMgLm5ubi4iICAiaGVscCBzZXQgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncyIKKyMgdGVzdCBoZWxwIHNldCBwcmludCB1bmlvbgorZ2RiX3Rlc3QgImhlbHAgc2V0IHByaW50IHVuaW9uIiAiU2V0IHByaW50aW5nIG9mIHVuaW9ucyBpbnRlcmlvciB0byBzdHJ1Y3R1cmVzLiIgICJoZWxwIHNldCBwcmludCB1bmlvbiIKKyMgdGVzdCBoZWxwIHNldCBwcmludCB2dGJsCitnZGJfdGVzdCAiaGVscCBzZXQgcHJpbnQgdnRibCIgIlNldCBwcmludGluZyBvZiBDXFsrXF0rIHZpcnR1YWwgZnVuY3Rpb24gdGFibGVzLiIgICJoZWxwIHNldCBwcmludCB2dGJsIgorIyB0ZXN0IGhlbHAgc2V0IHByb21wdAorZ2RiX3Rlc3QgImhlbHAgc2V0IHByb21wdCIgIlNldCBnZGIncyBwcm9tcHQiICAiaGVscCBzZXQgcHJvbXB0IgorIyB0ZXN0IGhlbHAgc2V0IHJhZGl4CitnZGJfdGVzdCAiaGVscCBzZXQgcmFkaXgiICJTZXQgZGVmYXVsdCBpbnB1dCBhbmQgb3V0cHV0IG51bWJlciByYWRpY2VzLipcW1xyXG5cXStVc2UgXCdzZXQgaW5wdXQtcmFkaXhcJyBvciBcJ3NldCBvdXRwdXQtcmFkaXhcJyB0byBpbmRlcGVuZGVudGx5IHNldCBlYWNoLi4qXFtcclxuXF0rV2l0aG91dCBhbiBhcmd1bWVudCwgc2V0cyBib3RoIHJhZGljZXMgYmFjayB0byB0aGUgZGVmYXVsdCB2YWx1ZSBvZiAxMC4uKlxbXHJcblxdKyIgImhlbHAgc2V0IHJhZGl4IgorIyB0ZXN0IGhlbHAgc2V0IHN5bWJvbC1yZWxvYWRpbmcKK2dkYl90ZXN0ICJoZWxwIHNldCBzeW1ib2wtcmVsb2FkaW5nIiAiU2V0IGR5bmFtaWMgc3ltYm9sIHRhYmxlIHJlbG9hZGluZyBtdWx0aXBsZSB0aW1lcyBpbiBvbmUgcnVuLiIgICJoZWxwIHNldCBzeW1ib2wtcmVsb2FkaW5nIgorIyB0ZXN0IGhlbHAgc2V0IHZhcmlhYmxlCitnZGJfdGVzdCAiaGVscCBzZXQgdmFyaWFibGUiICIuKlxbXHJcblxdK0V2YWx1YXRlIGV4cHJlc3Npb24gRVhQIGFuZCBhc3NpZ24gcmVzdWx0IHRvIHZhcmlhYmxlIFZBUiwgdXNpbmcgYXNzaWdubWVudC4qXFtcclxuXF0rc3ludGF4IGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsYW5ndWFnZSAuVkFSID0gRVhQIG9yIFZBUiA6PSBFWFAgZm9yLipcW1xyXG5cXStleGFtcGxlLi4gIFZBUiBtYXkgYmUgYSBkZWJ1Z2dlciBcImNvbnZlbmllbmNlXCIgdmFyaWFibGUgLm5hbWVzIHN0YXJ0aW5nLipcW1xyXG5cXSt3aXRoIFxcXCQuLCBhIHJlZ2lzdGVyIC5hIGZldyBzdGFuZGFyZCBuYW1lcyBzdGFydGluZyB3aXRoIFxcXCQuLCBvciBhbiBhY3R1YWwuKlxbXHJcblxdK3ZhcmlhYmxlIGluIHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkLiAgRVhQIGlzIGFueSB2YWxpZCBleHByZXNzaW9uLipcW1xyXG5cXStUaGlzIG1heSB1c3VhbGx5IGJlIGFiYnJldmlhdGVkIHRvIHNpbXBseSBcInNldFwiLiIgImhlbHAgc2V0IHZhcmlhYmxlIgorIyB0ZXN0IGhlbHAgc2V0IHZlcmJvc2UKK2dkYl90ZXN0ICJoZWxwIHNldCB2ZXJib3NlIiAiU2V0IHZlcmJvc2l0eS4iICAiaGVscCBzZXQgdmVyYm9zZSIKKyN0ZXN0IGhlbHAgc2V0IHdpZHRoCitnZGJfdGVzdCAiaGVscCBzZXQgd2lkdGgiICJTZXQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZ2RiIHRoaW5rcyBhcmUgaW4gYSBsaW5lLiIgICJoZWxwIHNldCB3aWR0aCIKKyMgdGVzdCBoZWxwIHNldCB3cml0ZQorIyBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIG9uIHRhcmdldHMgd2hpY2ggdXNlIGV4ZWMuby4KK2dkYl90ZXN0ICJoZWxwIHNldCB3cml0ZSIgIlNldCB3cml0aW5nIGludG8gZXhlY3V0YWJsZSBhbmQgY29yZSBmaWxlcy4iICAiaGVscCBzZXQgd3JpdGUiCisjIHRlc3QgaGVscCBzZXQKKyMgRklYTUUgLS0gVWx0cml4IGhhbmdzIHJhbmRvbWx5IG9uIHRoaXMgdmVyeSBsb25nIG91dHB1dCBmcm9tIGdkYiBhbmQKKyMgY29udGludWVzIHdpdGggaXRzIG91dHB1dCBvbmx5IGlmIHNvbWV0aGluZyBpcyBzZW50IHRvIGdkYi4KKyMgQWxzbywgaWYgdGhlIHN5c3RlbSBpcyBzbG93LCBpdCBtYXkgdGltZSBvdXQgYmVjYXVzZSB0aGUgb3V0cHV0IGlzIGxhcmdlLgorI2dkYl90ZXN0ICJoZWxwIHNldCIgIi4qXFtcclxuXF0rRXZhbHVhdGUgZXhwcmVzc2lvbiBFWFAgYW5kIGFzc2lnbiByZXN1bHQgdG8gdmFyaWFibGUgVkFSLCB1c2luZyBhc3NpZ25tZW50LipcW1xyXG5cXStzeW50YXggYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlIC5WQVIgPSBFWFAgb3IgVkFSIDo9IEVYUCBmb3IuKlxbXHJcblxdK2V4YW1wbGUuLiAgVkFSIG1heSBiZSBhIGRlYnVnZ2VyIFwiY29udmVuaWVuY2VcIiB2YXJpYWJsZSAubmFtZXMgc3RhcnRpbmcuKlxbXHJcblxdK3dpdGggXFxcJC4sIGEgcmVnaXN0ZXIgLmEgZmV3IHN0YW5kYXJkIG5hbWVzIHN0YXJ0aW5nIHdpdGggXFxcJC4sIG9yIGFuIGFjdHVhbC4qXFtcclxuXF0rdmFyaWFibGUgaW4gdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQuICBFWFAgaXMgYW55IHZhbGlkIGV4cHJlc3Npb24uKlxbXHJcblxdK3NldCBsaXN0c2l6ZSAtLSBTZXQgbnVtYmVyIG9mIHNvdXJjZSBsaW5lcyBnZGIgd2lsbCBsaXN0IGJ5IGRlZmF1bHQuKlxbXHJcblxdK1R5cGUgXCJoZWxwIHNldFwiIGZvbGxvd2VkIGJ5IHNldCBzdWJjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4uKlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLi4qXFtcclxuXF0rIiAiaGVscCBzZXQiCisjIHRlc3QgaGVscCBzaGVsbAorZ2RiX3Rlc3QgImhlbHAgc2hlbGwiICJFeGVjdXRlIHRoZSByZXN0IG9mIHRoZSBsaW5lIGFzIGEgc2hlbGwgY29tbWFuZC4gIC4qXFtcclxuXF0rV2l0aCBubyBhcmd1bWVudHMsIHJ1biBhbiBpbmZlcmlvciBzaGVsbC4iICJoZWxwIHNoZWxsIgorI3Rlc3QgaGVscCBzaG93IGFubm90YXRlCitnZGJfdGVzdCAiaGVscCBzaG93IGFubm90YXRlIiAiU2hvdyBhbm5vdGF0aW9uX2xldmVsLipcW1xyXG5cXSswID09IG5vcm1hbDsgICAgIDEgPT0gZnVsbG5hbWUgXFwoZm9yIHVzZSB3aGVuIHJ1bm5pbmcgdW5kZXIgZW1hY3NcXCkuKlxbXHJcblxdKzIgPT0gb3V0cHV0IGFubm90YXRlZCBzdWl0YWJseSBmb3IgdXNlIGJ5IHByb2dyYW1zIHRoYXQgY29udHJvbCBHREIuIiAiaGVscCBzaG93IGFubm90YXRlIgorIyB0ZXN0IGhlbHAgc2hvdyBhcmdzCitnZGJfdGVzdCAiaGVscCBzaG93IGFyZ3MiICJTaG93IGFyZ3VtZW50IGxpc3QgdG8gZ2l2ZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkIHdoZW4gaXQgaXMgc3RhcnRlZC4uKlxbXHJcblxdK0ZvbGxvdyB0aGlzIGNvbW1hbmQgd2l0aCBhbnkgbnVtYmVyIG9mIGFyZ3MsIHRvIGJlIHBhc3NlZCB0byB0aGUgcHJvZ3JhbS4iCisjIHRlc3QgaGVscCBzaG93IGNoZWNrICJjIiBhYmJyZXZpYXRpb24KK2dkYl90ZXN0ICJoZWxwIHNob3cgYyIgIlNob3cgdGhlIHN0YXR1cyBvZiB0aGUgdHlwZS9yYW5nZSBjaGVja2VyLipcW1xyXG5cXStMaXN0IG9mIHNob3cgY2hlY2sgc3ViY29tbWFuZHM6LipcW1xyXG5cXStzaG93IGNoZWNrIHJhbmdlIC0tIFNob3cgcmFuZ2UgY2hlY2tpbmcuKlxbXHJcblxdK3Nob3cgY2hlY2sgdHlwZSAtLSBTaG93IHR5cGUgY2hlY2tpbmcuKlxbXHJcblxdK1R5cGUgXCJoZWxwIHNob3cgY2hlY2tcIiBmb2xsb3dlZCBieSBzaG93IGNoZWNrIHN1YmNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLi4qXFtcclxuXF0rQ29tbWFuZCBuYW1lIGFiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQgaWYgdW5hbWJpZ3VvdXMuIiAiaGVscCBzaG93IGNoZWNrIFwiY1wiIGFiYnJldmlhdGlvbiIKKyMgdGVzdCBoZWxwIHNob3cgY2hlY2sKK2dkYl90ZXN0ICJoZWxwIHNob3cgY2hlY2siICJTaG93IHRoZSBzdGF0dXMgb2YgdGhlIHR5cGUvcmFuZ2UgY2hlY2tlci4qXFtcclxuXF0rTGlzdCBvZiBzaG93IGNoZWNrIHN1YmNvbW1hbmRzOi4qXFtcclxuXF0rc2hvdyBjaGVjayByYW5nZSAtLSBTaG93IHJhbmdlIGNoZWNraW5nLipcW1xyXG5cXStzaG93IGNoZWNrIHR5cGUgLS0gU2hvdyB0eXBlIGNoZWNraW5nLipcW1xyXG5cXStUeXBlIFwiaGVscCBzaG93IGNoZWNrXCIgZm9sbG93ZWQgYnkgc2hvdyBjaGVjayBzdWJjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4uKlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLiIgImhlbHAgc2hvdyBjaGVjayIKKyMgdGVzdCBoZWxwIHNob3cgY2hlY2sgcmFuZ2UKK2dkYl90ZXN0ICJoZWxwIHNob3cgY2hlY2sgcmFuZ2UiICJTaG93IHJhbmdlIGNoZWNraW5nLiAgLm9uL3dhcm4vb2ZmL2F1dG8uIiAgImhlbHAgc2hvdyBjaGVjayByYW5nZSIKKyMgdGVzdCBoZWxwIHNob3cgY2hlY2sgdHlwZQorZ2RiX3Rlc3QgImhlbHAgc2hvdyBjaGVjayB0eXBlIiAiU2hvdyB0eXBlIGNoZWNraW5nLiAgLm9uL3dhcm4vb2ZmL2F1dG8uIiAgImhlbHAgc2hvdyBjaGVjayB0eXBlIgorIyB0ZXN0IGhlbHAgc2hvdyBjb21tYW5kcworZ2RiX3Rlc3QgImhlbHAgc2hvdyBjb21tYW5kcyIgIlNob3cgdGhlIGhpc3Rvcnkgb2YgY29tbWFuZHMgeW91IHR5cGVkLi4qXFtcclxuXF0rWW91IGNhbiBzdXBwbHkgYSBjb21tYW5kIG51bWJlciB0byBzdGFydCB3aXRoLCBvciBhIGBcWytcXScgdG8gc3RhcnQgYWZ0ZXIuKlxbXHJcblxdK3RoZSBwcmV2aW91cyBjb21tYW5kIG51bWJlciBzaG93bi4iICJoZWxwIHNob3cgY29tbWFuZHMiCisjIHRlc3QgaGVscCBzaG93IGNvbXBsYWludHMKK2dkYl90ZXN0ICJoZWxwIHNob3cgY29tcGxhaW50cyIgIlNob3cgbWF4IG51bWJlciBvZiBjb21wbGFpbnRzIGFib3V0IGluY29ycmVjdCBzeW1ib2xzLiIgICJoZWxwIHNob3cgY29tcGxhaW50cyIKKyMgdGVzdCBoZWxwIHNob3cgY29uZmlybQorZ2RiX3Rlc3QgImhlbHAgc2hvdyBjb25maXJtIiAiU2hvdyB3aGV0aGVyIHRvIGNvbmZpcm0gcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIG9wZXJhdGlvbnMuIiAgImhlbHAgc2hvdyBjb25maXJtIgorIyB0ZXN0IGhlbHAgc2hvdyBjb252ZW5pZW5jZQorZ2RiX3Rlc3QgImhlbHAgc2hvdyBjb252ZW5pZW5jZSIgIkRlYnVnZ2VyIGNvbnZlbmllbmNlIC5cIi5mb29cIi4gdmFyaWFibGVzLi4qXFtcclxuXF0rVGhlc2UgdmFyaWFibGVzIGFyZSBjcmVhdGVkIHdoZW4geW91IGFzc2lnbiB0aGVtIHZhbHVlczsuKlxbXHJcblxdK3RodXMsIFwicHJpbnQgLmZvbz0xXCIgZ2l2ZXMgXCIuZm9vXCIgdGhlIHZhbHVlIDEuICBWYWx1ZXMgbWF5IGJlIGFueSB0eXBlLi4qXFtcclxuXF0rQSBmZXcgY29udmVuaWVuY2UgdmFyaWFibGVzIGFyZSBnaXZlbiB2YWx1ZXMgYXV0b21hdGljYWxseTouKlxbXHJcblxdK1wiLl9cImhvbGRzIHRoZSBsYXN0IGFkZHJlc3MgZXhhbWluZWQgd2l0aCBcInhcIiBvciBcImluZm8gbGluZXNcIiwuKlxbXHJcblxdK1wiLl9fXCIgaG9sZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBsYXN0IGFkZHJlc3MgZXhhbWluZWQgd2l0aCBcInhcIi4iICJoZWxwIHNob3cgY29udmVuaWVuY2UiCisjIHRlc3QgaGVscCBzaG93IGRpcmVjdG9yaWVzCitnZGJfdGVzdCAiaGVscCBzaG93IGRpcmVjdG9yaWVzIiAiQ3VycmVudCBzZWFyY2ggcGF0aCBmb3IgZmluZGluZyBzb3VyY2UgZmlsZXMuLipcW1xyXG5cXSsuY3dkIGluIHRoZSBwYXRoIG1lYW5zIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Li4qXFtcclxuXF0rLmNkaXIgaW4gdGhlIHBhdGggbWVhbnMgdGhlIGNvbXBpbGF0aW9uIGRpcmVjdG9yeSBvZiB0aGUgc291cmNlIGZpbGUuIiAiaGVscCBzaG93IGRpcmVjdG9yaWVzIgorIyB0ZXN0IGhlbHAgc2hvdyBlZGl0aW5nCitnZGJfdGVzdCAiaGVscCBzaG93IGVkaXRpbmciICJTaG93IGVkaXRpbmcgb2YgY29tbWFuZCBsaW5lcyBhcyB0aGV5IGFyZSB0eXBlZC4uKlxbXHJcblxdK1VzZSBcIm9uXCIgdG8gZW5hYmxlIHRoZSBlZGl0aW5nLCBhbmQgXCJvZmZcIiB0byBkaXNhYmxlIGl0Li4qXFtcclxuXF0rV2l0aG91dCBhbiBhcmd1bWVudCwgY29tbWFuZCBsaW5lIGVkaXRpbmcgaXMgZW5hYmxlZC4gIFRvIGVkaXQsIHVzZS4qXFtcclxuXF0rRU1BQ1MtbGlrZSBvciBWSS1saWtlIGNvbW1hbmRzIGxpa2UgY29udHJvbC1QIG9yIEVTQy4iICJoZWxwIHNob3cgZWRpdGluZyIKKyMgdGVzdCBoZWxwIHNob3cgZW52aXJvbm1lbnQKK2dkYl90ZXN0ICJoZWxwIHNob3cgZW52aXJvbm1lbnQiICJUaGUgZW52aXJvbm1lbnQgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSwgb3Igb25lIHZhcmlhYmxlJ3MgdmFsdWUuLipcW1xyXG5cXStXaXRoIGFuIGFyZ3VtZW50IFZBUiwgcHJpbnRzIHRoZSB2YWx1ZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBWQVIgdG8uKlxbXHJcblxdK2dpdmUgdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQuICBXaXRoIG5vIGFyZ3VtZW50cywgcHJpbnRzIHRoZSBlbnRpcmUuKlxbXHJcblxdK2Vudmlyb25tZW50IHRvIGJlIGdpdmVuIHRvIHRoZSBwcm9ncmFtLiIgImhlbHAgc2hvdyBlbnZpcm9ubWVudCIKKyMgdGVzdCBoZWxwIHNob3cgaGVpZ2h0CitnZGJfdGVzdCAiaGVscCBzaG93IGhlaWdodCIgIlNob3cgbnVtYmVyIG9mIGxpbmVzIGdkYiB0aGlua3MgYXJlIGluIGEgcGFnZS4iICAiaGVscCBzaG93IGhlaWdodCIKKyMgdGVzdCBoZWxwIHNob3cgaGlzdG9yeSBleHBhbnNpb24KK2dkYl90ZXN0ICJoZWxwIHNob3cgaGlzdG9yeSBleHBhbnNpb24iICJTaG93IGhpc3RvcnkgZXhwYW5zaW9uIG9uIGNvbW1hbmQgaW5wdXQuLipcW1xyXG5cXStXaXRob3V0IGFuIGFyZ3VtZW50LCBoaXN0b3J5IGV4cGFuc2lvbiBpcyBlbmFibGVkLiIgImhlbHAgc2hvdyBoaXN0b3J5IGV4cGFuc2lvbiIKKyMgdGVzdCBoZWxwIHNob3cgaGlzdG9yeSBmaWxlbmFtZQorZ2RiX3Rlc3QgImhlbHAgc2hvdyBoaXN0b3J5IGZpbGVuYW1lIiAiU2hvdyB0aGUgZmlsZW5hbWUgaW4gd2hpY2ggdG8gcmVjb3JkIHRoZSBjb21tYW5kIGhpc3RvcnkuKlxbXHJcblxdKyAudGhlIGxpc3Qgb2YgcHJldmlvdXMgY29tbWFuZHMgb2Ygd2hpY2ggYSByZWNvcmQgaXMga2VwdC4uIiAiaGVscCBzaG93IGhpc3RvcnkgZmlsZW5hbWUiCisjIHRlc3QgaGVscCBzaG93IGhpc3Rvcnkgc2F2ZQorZ2RiX3Rlc3QgImhlbHAgc2hvdyBoaXN0b3J5IHNhdmUiICJTaG93IHNhdmluZyBvZiB0aGUgaGlzdG9yeSByZWNvcmQgb24gZXhpdC4uKlxbXHJcblxdK1VzZSBcIm9uXCIgdG8gZW5hYmxlIHRoZSBzYXZpbmcsIGFuZCBcIm9mZlwiIHRvIGRpc2FibGUgaXQuLipcW1xyXG5cXStXaXRob3V0IGFuIGFyZ3VtZW50LCBzYXZpbmcgaXMgZW5hYmxlZC4iICJoZWxwIHNob3cgaGlzdG9yeSBzYXZlIgorIyB0ZXN0IGhlbHAgc2hvdyBoaXN0b3J5IHNpemUKK2dkYl90ZXN0ICJoZWxwIHNob3cgaGlzdG9yeSBzaXplIiAiU2hvdyB0aGUgc2l6ZSBvZiB0aGUgY29tbWFuZCBoaXN0b3J5LCAuKlxbXHJcblxdK2llLiB0aGUgbnVtYmVyIG9mIHByZXZpb3VzIGNvbW1hbmRzIHRvIGtlZXAgYSByZWNvcmQgb2YuIiAiaGVscCBzaG93IGhpc3Rvcnkgc2l6ZSIKKyMgdGVzdCBoZWxwIHNob3cgaGlzdG9yeQorZ2RiX3Rlc3QgImhlbHAgc2hvdyBoaXN0b3J5IiAiR2VuZXJpYyBjb21tYW5kIGZvciBzaG93aW5nIGNvbW1hbmQgaGlzdG9yeSBwYXJhbWV0ZXJzLi4qXFtcclxuXF0rTGlzdCBvZiBzaG93IGhpc3Rvcnkgc3ViY29tbWFuZHM6LipcW1xyXG5cXStzaG93IGhpc3RvcnkgZXhwYW5zaW9uIC0tIFNob3cgaGlzdG9yeSBleHBhbnNpb24gb24gY29tbWFuZCBpbnB1dC4qXFtcclxuXF0rc2hvdyBoaXN0b3J5IGZpbGVuYW1lIC0tIFNob3cgdGhlIGZpbGVuYW1lIGluIHdoaWNoIHRvIHJlY29yZCB0aGUgY29tbWFuZCBoaXN0b3J5LipcW1xyXG5cXStzaG93IGhpc3Rvcnkgc2F2ZSAtLSBTaG93IHNhdmluZyBvZiB0aGUgaGlzdG9yeSByZWNvcmQgb24gZXhpdC4qXFtcclxuXF0rc2hvdyBoaXN0b3J5IHNpemUgLS0gU2hvdyB0aGUgc2l6ZSBvZiB0aGUgY29tbWFuZCBoaXN0b3J5LipcW1xyXG5cXStUeXBlIFwiaGVscCBzaG93IGhpc3RvcnlcIiBmb2xsb3dlZCBieSBzaG93IGhpc3Rvcnkgc3ViY29tbWFuZCBuYW1lIGZvciBmdWxsIGRvY3VtZW50YXRpb24uLipcW1xyXG5cXStDb21tYW5kIG5hbWUgYWJicmV2aWF0aW9ucyBhcmUgYWxsb3dlZCBpZiB1bmFtYmlndW91cy4iICJoZWxwIHNob3cgaGlzdG9yeSIKKyMgdGVzdCBoZWxwIHNob3cgbGFuZ3VhZ2UKK2dkYl90ZXN0ICJoZWxwIHNob3cgbGFuZ3VhZ2UiICJTaG93IHRoZSBjdXJyZW50IHNvdXJjZSBsYW5ndWFnZS4iICAiaGVscCBzaG93IGxhbmd1YWdlIgorIyB0ZXN0IGhlbHAgc2hvdyBsaXN0c2l6ZQorZ2RiX3Rlc3QgImhlbHAgc2hvdyBsaXN0c2l6ZSIgIlNob3cgbnVtYmVyIG9mIHNvdXJjZSBsaW5lcyBnZGIgd2lsbCBsaXN0IGJ5IGRlZmF1bHQuIiAgImhlbHAgc2hvdyBsaXN0c2l6ZSIKKyMgdGVzdCBoZWxwIHNob3cgcHJpbnQgInAiIGFiYnJldmlhdGlvbgorZ2RiX3Rlc3QgImhlbHAgc2hvdyBwIiAiR2VuZXJpYyBjb21tYW5kIGZvciBzaG93aW5nIHByaW50IHNldHRpbmdzLi4qXFtcclxuXF0rTGlzdCBvZiBzaG93IHByaW50IHN1YmNvbW1hbmRzOi4qXFtcclxuXF0rVHlwZSBcImhlbHAgc2hvdyBwcmludFwiIGZvbGxvd2VkIGJ5IHNob3cgcHJpbnQgc3ViY29tbWFuZCBuYW1lIGZvciBmdWxsIGRvY3VtZW50YXRpb24uLipcW1xyXG5cXStDb21tYW5kIG5hbWUgYWJicmV2aWF0aW9ucyBhcmUgYWxsb3dlZCBpZiB1bmFtYmlndW91cy4iICJoZWxwIHNob3cgcHJpbnQgXCJwXCIgYWJicmV2aWF0aW9uIgorIyB0ZXN0IGhlbHAgc2hvdyBwcmludCAicHIiIGFiYnJldmlhdGlvbgorZ2RiX3Rlc3QgImhlbHAgc2hvdyBwciIgIkdlbmVyaWMgY29tbWFuZCBmb3Igc2hvd2luZyBwcmludCBzZXR0aW5ncy4uKlxbXHJcblxdK0xpc3Qgb2Ygc2hvdyBwcmludCBzdWJjb21tYW5kczouKlxbXHJcblxdK1R5cGUgXCJoZWxwIHNob3cgcHJpbnRcIiBmb2xsb3dlZCBieSBzaG93IHByaW50IHN1YmNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLi4qXFtcclxuXF0rQ29tbWFuZCBuYW1lIGFiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQgaWYgdW5hbWJpZ3VvdXMuIiAiaGVscCBzaG93IHByaW50IFwicHJcIiBhYmJyZXZpYXRpb24iCisjIHRlc3QgaGVscCBzaG93IHByaW50CitnZGJfdGVzdCAiaGVscCBzaG93IHByaW50IiAiR2VuZXJpYyBjb21tYW5kIGZvciBzaG93aW5nIHByaW50IHNldHRpbmdzLi4qXFtcclxuXF0rTGlzdCBvZiBzaG93IHByaW50IHN1YmNvbW1hbmRzOi4qXFtcclxuXF0rVHlwZSBcImhlbHAgc2hvdyBwcmludFwiIGZvbGxvd2VkIGJ5IHNob3cgcHJpbnQgc3ViY29tbWFuZCBuYW1lIGZvciBmdWxsIGRvY3VtZW50YXRpb24uLipcW1xyXG5cXStDb21tYW5kIG5hbWUgYWJicmV2aWF0aW9ucyBhcmUgYWxsb3dlZCBpZiB1bmFtYmlndW91cy4iICJoZWxwIHNob3cgcHJpbnQiCisjIHRlc3QgaGVscCBzaG93IHBhdGhzCitnZGJfdGVzdCAiaGVscCBzaG93IHBhdGhzIiAiQ3VycmVudCBzZWFyY2ggcGF0aCBmb3IgZmluZGluZyBvYmplY3QgZmlsZXMuLipcW1xyXG5cXSsuY3dkIGluIHRoZSBwYXRoIG1lYW5zIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Li4qXFtcclxuXF0rVGhpcyBwYXRoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIC5QQVRIIHNoZWxsIHZhcmlhYmxlLiAgSXQgaXMgYSBsaXN0IG9mLipcW1xyXG5cXStkaXJlY3Rvcmllcywgc2VwYXJhdGVkIGJ5IGNvbG9ucy4gIFRoZXNlIGRpcmVjdG9yaWVzIGFyZSBzZWFyY2hlZCB0byBmaW5kLipcW1xyXG5cXStmdWxseSBsaW5rZWQgZXhlY3V0YWJsZSBmaWxlcyBhbmQgc2VwYXJhdGVseSBjb21waWxlZCBvYmplY3QgZmlsZXMgYXMgbmVlZGVkLiIgImhlbHAgc2hvdyBwYXRocyIKKyMgdGVzdCBoZWxwIHNob3cgcHJpbnQgYWRkcmVzcworZ2RiX3Rlc3QgImhlbHAgc2hvdyBwcmludCBhZGRyZXNzIiAiU2hvdyBwcmludGluZyBvZiBhZGRyZXNzZXMuIiAgImhlbHAgc2hvdyBwcmludCBhZGRyZXNzIgorIyB0ZXN0IGhlbHAgc2hvdyBwcmludCBhcnJheQorZ2RiX3Rlc3QgImhlbHAgc2hvdyBwcmludCBhcnJheSIgIlNob3cgcHJldHR5cHJpbnRpbmcgb2YgYXJyYXlzLiIgICJoZWxwIHNob3cgcHJpbnQgYXJyYXkiCisjIHRlc3QgaGVscCBzaG93IHByaW50IGFzbS1kZW1hbmdsZQorZ2RiX3Rlc3QgImhlbHAgc2hvdyBwcmludCBhc20tZGVtYW5nbGUiICJTaG93IGRlbWFuZ2xpbmcgb2YgQ1xbK1xdKyBuYW1lcyBpbiBkaXNhc3NlbWJseSBsaXN0aW5ncy4iICAiaGVscCBzaG93IHByaW50IGFzbS1kZW1hbmdsZSIKKyMgdGVzdCBoZWxwIHNob3cgcHJpbnQgZGVtYW5nbGUKK2dkYl90ZXN0ICJoZWxwIHNob3cgcHJpbnQgZGVtYW5nbGUiICJTaG93IGRlbWFuZ2xpbmcgb2YgZW5jb2RlZCBDXFsrXF0rIG5hbWVzIHdoZW4gZGlzcGxheWluZyBzeW1ib2xzLiIgICJoZWxwIHNob3cgcHJpbnQgZGVtYW5nbGUiCisjIHRlc3QgaGVscCBzaG93IHByaW50IGVsZW1lbnRzCitnZGJfdGVzdCAiaGVscCBzaG93IHByaW50IGVsZW1lbnRzIiAiU2hvdyBsaW1pdCBvbiBzdHJpbmcgY2hhcnMgb3IgYXJyYXkgZWxlbWVudHMgdG8gcHJpbnQuLipcW1xyXG5cXStcInNldCBwcmludCBlbGVtZW50cyAwXCIgY2F1c2VzIHRoZXJlIHRvIGJlIG5vIGxpbWl0LiIgImhlbHAgc2hvdyBwcmludCBlbGVtZW50cyIKKyMgdGVzdCBoZWxwIHNob3cgcHJpbnQgb2JqZWN0CitnZGJfdGVzdCAiaGVscCBzaG93IHByaW50IG9iamVjdCIgIlNob3cgcHJpbnRpbmcgb2Ygb2JqZWN0J3MgZGVyaXZlZCB0eXBlIGJhc2VkIG9uIHZ0YWJsZSBpbmZvLiIgICJoZWxwIHNob3cgcHJpbnQgb2JqZWN0IgorIyB0ZXN0IGhlbHAgc2hvdyBwcmludCBwcmV0dHkKK2dkYl90ZXN0ICJoZWxwIHNob3cgcHJpbnQgcHJldHR5IiAiU2hvdyBwcmV0dHlwcmludGluZyBvZiBzdHJ1Y3R1cmVzLiIgICJoZWxwIHNob3cgcHJpbnQgcHJldHR5IgorIyB0ZXN0IGhlbHAgc2hvdyBwcmludCBzZXZlbmJpdC1zdHJpbmdzCitnZGJfdGVzdCAiaGVscCBzaG93IHByaW50IHNldmVuYml0LXN0cmluZ3MiICJTaG93IHByaW50aW5nIG9mIDgtYml0IGNoYXJhY3RlcnMgaW4gc3RyaW5ncyBhcyAubm5uLiIgICJoZWxwIHNob3cgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncyIKKyMgdGVzdCBoZWxwIHNob3cgcHJpbnQgdW5pb24KK2dkYl90ZXN0ICJoZWxwIHNob3cgcHJpbnQgdW5pb24iICJTaG93IHByaW50aW5nIG9mIHVuaW9ucyBpbnRlcmlvciB0byBzdHJ1Y3R1cmVzLiIgICJoZWxwIHNob3cgcHJpbnQgdW5pb24iCisjIHRlc3QgaGVscCBzaG93IHByaW50IHZ0YmwKK2dkYl90ZXN0ICJoZWxwIHNob3cgcHJpbnQgdnRibCIgIlNob3cgcHJpbnRpbmcgb2YgQ1xbK1xdKyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlcy4iICAiaGVscCBzaG93IHByaW50IHZ0YmwiCisjIHRlc3QgaGVscCBzaG93IHByb21wdAorZ2RiX3Rlc3QgImhlbHAgc2hvdyBwcm9tcHQiICJTaG93IGdkYidzIHByb21wdCIgICJoZWxwIHNob3cgcHJvbXB0IgorIyB0ZXN0IGhlbHAgc2hvdyByYWRpeAorZ2RiX3Rlc3QgImhlbHAgc2hvdyByYWRpeCIgIlNob3cgdGhlIGRlZmF1bHQgaW5wdXQgYW5kIG91dHB1dCBudW1iZXIgcmFkaWNlcy4qXFtcclxuXF0rVXNlIFwnc2hvdyBpbnB1dC1yYWRpeFwnIG9yIFwnc2hvdyBvdXRwdXQtcmFkaXhcJyB0byBpbmRlcGVuZGVudGx5IHNob3cgZWFjaC4qXFtcclxuXF0rIiAiaGVscCBzaG93IHJhZGl4IgorIyB0ZXN0IGhlbHAgc2hvdyBzeW1ib2wtcmVsb2FkaW5nCitnZGJfdGVzdCAiaGVscCBzaG93IHN5bWJvbC1yZWxvYWRpbmciICJTaG93IGR5bmFtaWMgc3ltYm9sIHRhYmxlIHJlbG9hZGluZyBtdWx0aXBsZSB0aW1lcyBpbiBvbmUgcnVuLiIgImhlbHAgc2hvdyBzeW1ib2wtcmVsb2FkaW5nIgorIyB0ZXN0IGhlbHAgc2hvdyB1c2VyCitnZGJfdGVzdCAiaGVscCBzaG93IHVzZXIiICJTaG93IGRlZmluaXRpb25zIG9mIHVzZXIgZGVmaW5lZCBjb21tYW5kcy4uKlxbXHJcblxdK0FyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSB1c2VyIGRlZmluZWQgY29tbWFuZC4uKlxbXHJcblxdK1dpdGggbm8gYXJndW1lbnQsIHNob3cgZGVmaW5pdGlvbnMgb2YgYWxsIHVzZXIgZGVmaW5lZCBjb21tYW5kcy4iICJoZWxwIHNob3cgdXNlciIKKyMgdGVzdCBoZWxwIHNob3cgdmFsdWVzCitnZGJfdGVzdCAiaGVscCBzaG93IHZhbHVlcyIgIkVsZW1lbnRzIG9mIHZhbHVlIGhpc3RvcnkgYXJvdW5kIGl0ZW0gbnVtYmVyIElEWCAub3IgbGFzdCB0ZW4uLiIgICJoZWxwIHNob3cgdmFsdWVzIgorIyB0ZXN0IGhlbHAgc2hvdyB2ZXJib3NlCitnZGJfdGVzdCAiaGVscCBzaG93IHZlcmJvc2UiICJTaG93IHZlcmJvc2l0eS4uKiIgICJoZWxwIHNob3cgdmVyYm9zZSIKKyMgdGVzdCBoZWxwIHNob3cgdmVyc2lvbgorZ2RiX3Rlc3QgImhlbHAgc2hvdyB2ZXJzaW9uIiAiU2hvdyB3aGF0IHZlcnNpb24gb2YgR0RCIHRoaXMgaXMuIiAgImhlbHAgc2hvdyB2ZXJzaW9uIgorIyB0ZXN0IGhlbHAgc2hvdyB3aWR0aAorZ2RiX3Rlc3QgImhlbHAgc2hvdyB3aWR0aCIgIlNob3cgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZ2RiIHRoaW5rcyBhcmUgaW4gYSBsaW5lLiIgICJoZWxwIHNob3cgd2lkdGgiCisjIHRlc3QgaGVscCBzaG93IHdyaXRlCisjIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgb24gdGFyZ2V0cyB3aGljaCB1c2UgZXhlYy5vLgorZ2RiX3Rlc3QgImhlbHAgc2hvdyB3cml0ZSIgIlNob3cgd3JpdGluZyBpbnRvIGV4ZWN1dGFibGUgYW5kIGNvcmUgZmlsZXMuIiAgImhlbHAgc2hvdyB3cml0ZSIKKyMgdGVzdCBoZWxwIHNob3cKKyMgRklYTUUgLS0gVWx0cml4IGhhbmdzIHJhbmRvbWx5IG9uIHRoaXMgdmVyeSBsb25nIG91dHB1dCBmcm9tIGdkYiBhbmQKKyMgY29udGludWVzIHdpdGggaXRzIG91dHB1dCBvbmx5IGlmIHNvbWV0aGluZyBpcyBzZW50IHRvIGdkYi4KKyMgQWxzbywgaWYgdGhlIHN5c3RlbSBpcyBzbG93LCBpdCBtYXkgdGltZSBvdXQgYmVjYXVzZSB0aGUgb3V0cHV0IGlzIGxhcmdlLgorI2dkYl90ZXN0ICJoZWxwIHNob3ciICJHZW5lcmljIGNvbW1hbmQgZm9yIHNob3dpbmcgdGhpbmdzIGFib3V0IHRoZSBkZWJ1Z2dlci4uKlxbXHJcblxdK0xpc3Qgb2Ygc2hvdyBzdWJjb21tYW5kczouKlxbXHJcblxdK3Nob3cgbGlzdHNpemUgLS0gU2hvdyBudW1iZXIgb2Ygc291cmNlIGxpbmVzIGdkYiB3aWxsIGxpc3QgYnkgZGVmYXVsdC4qXFtcclxuXF0rc2hvdyBkaXJlY3RvcmllcyAtLSBDdXJyZW50IHNlYXJjaCBwYXRoIGZvciBmaW5kaW5nIHNvdXJjZSBmaWxlcy4qXFtcclxuXF0rVHlwZSBcImhlbHAgc2hvd1wiIGZvbGxvd2VkIGJ5IHNob3cgc3ViY29tbWFuZCBuYW1lIGZvciBmdWxsIGRvY3VtZW50YXRpb24uLipcW1xyXG5cXStDb21tYW5kIG5hbWUgYWJicmV2aWF0aW9ucyBhcmUgYWxsb3dlZCBpZiB1bmFtYmlndW91cy4iICJoZWxwIHNob3ciCisjIHRlc3QgaGVscCBzdGVwCitnZGJfdGVzdCAiaGVscCBzdGVwIiAiU3RlcCBwcm9ncmFtIHVudGlsIGl0IHJlYWNoZXMgYSBkaWZmZXJlbnQgc291cmNlIGxpbmUuLipcW1xyXG5cXStBcmd1bWVudCBOIG1lYW5zIGRvIHRoaXMgTiB0aW1lcyAub3IgdGlsbCBwcm9ncmFtIHN0b3BzIGZvciBhbm90aGVyIHJlYXNvbi4uIiAiaGVscCBzdGVwICMyIgorIyB0ZXN0IGhlbHAgc3RlcGkgInNpIiBhYmJyZXZpYXRpb24KK2dkYl90ZXN0ICJoZWxwIHNpIiAiU3RlcCBvbmUgaW5zdHJ1Y3Rpb24gZXhhY3RseS4uKlxbXHJcblxdK0FyZ3VtZW50IE4gbWVhbnMgZG8gdGhpcyBOIHRpbWVzIC5vciB0aWxsIHByb2dyYW0gc3RvcHMgZm9yIGFub3RoZXIgcmVhc29uLi4iICJoZWxwIHN0ZXBpIFwic2lcIiBhYmJyZXZpYXRpb24iCisjIHRlc3QgaGVscCBzdGVwaQorZ2RiX3Rlc3QgImhlbHAgc3RlcGkiICJTdGVwIG9uZSBpbnN0cnVjdGlvbiBleGFjdGx5Li4qXFtcclxuXF0rQXJndW1lbnQgTiBtZWFucyBkbyB0aGlzIE4gdGltZXMgLm9yIHRpbGwgcHJvZ3JhbSBzdG9wcyBmb3IgYW5vdGhlciByZWFzb24uLiIgImhlbHAgc3RlcGkiCisjIHRlc3QgaGVscCBzaWduYWwKK2dkYl90ZXN0ICJoZWxwIHNpZ25hbCIgIkNvbnRpbnVlIHByb2dyYW0gZ2l2aW5nIGl0IHNpZ25hbC4qIiAgImhlbHAgc2lnbmFsIgorIyB0ZXN0IGhlbHAgc291cmNlCisjIHZ4Z2RiIHJlYWRzIC52eGdkYmluaXQKK2dkYl90ZXN0ICJoZWxwIHNvdXJjZSIgIlJlYWQgY29tbWFuZHMgZnJvbSBhIGZpbGUgbmFtZWQgRklMRS4uKlxbXHJcblxdK05vdGUgdGhhdCB0aGUgZmlsZSBcIlxbXlwiXF0qXCIgaXMgcmVhZCBhdXRvbWF0aWNhbGx5IGluIHRoaXMgd2F5LipcW1xyXG5cXSt3aGVuIGdkYiBpcyBzdGFydGVkLiIgImhlbHAgc291cmNlIgorIyB0ZXN0IGhlbHAgc3RhY2sKK2dkYl90ZXN0ICJoZWxwIHN0YWNrIiAiRXhhbWluaW5nIHRoZSBzdGFjay4uKlxbXHJcblxdK1doZW4gdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgc3RvcHMsIGdkYiBzZWxlY3RzIHRoZSBpbm5lcm1vc3QgZnJhbWUuLipcW1xyXG5cXStUaGUgY29tbWFuZHMgYmVsb3cgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IG90aGVyIGZyYW1lcyBieSBudW1iZXIgb3IgYWRkcmVzcy4uKlxbXHJcblxdK0xpc3Qgb2YgY29tbWFuZHM6LipcW1xyXG5cXStiYWNrdHJhY2UgLS0gUHJpbnQgYmFja3RyYWNlIG9mIGFsbCBzdGFjayBmcmFtZXMuKlxbXHJcblxdK2J0IC0tIFByaW50IGJhY2t0cmFjZSBvZiBhbGwgc3RhY2sgZnJhbWVzLipcW1xyXG5cXStkb3duIC0tIFNlbGVjdCBhbmQgcHJpbnQgc3RhY2sgZnJhbWUgY2FsbGVkIGJ5IHRoaXMgb25lLipcW1xyXG5cXStmcmFtZSAtLSBTZWxlY3QgYW5kIHByaW50IGEgc3RhY2sgZnJhbWUuKlxbXHJcblxdK3JldHVybiAtLSBNYWtlIHNlbGVjdGVkIHN0YWNrIGZyYW1lIHJldHVybiB0byBpdHMgY2FsbGVyLipcW1xyXG5cXStzZWxlY3QtZnJhbWUgLS0gU2VsZWN0IGEgc3RhY2sgZnJhbWUgd2l0aG91dCBwcmludGluZyBhbnl0aGluZy4qXFtcclxuXF0rdXAgLS0gU2VsZWN0IGFuZCBwcmludCBzdGFjayBmcmFtZSB0aGF0IGNhbGxlZCB0aGlzIG9uZS4qXFtcclxuXF0rVHlwZSBcImhlbHBcIiBmb2xsb3dlZCBieSBjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4uKlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLiIgImhlbHAgc3RhY2siCisjIHRlc3QgaGVscCBzdGF0dXMKK2dkYl90ZXN0ICJoZWxwIHN0YXR1cyIgIlN0YXR1cyBpbnF1aXJpZXMuLipcW1xyXG5cXStMaXN0IG9mIGNvbW1hbmRzOi4qXFtcclxuXF0raW5mbyAtLSBHZW5lcmljIGNvbW1hbmQgZm9yIHNob3dpbmcgdGhpbmdzIGFib3V0IHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkLipcW1xyXG5cXStzaG93IC0tIEdlbmVyaWMgY29tbWFuZCBmb3Igc2hvd2luZyB0aGluZ3MgYWJvdXQgdGhlIGRlYnVnZ2VyLipcW1xyXG5cXStUeXBlIFwiaGVscFwiIGZvbGxvd2VkIGJ5IGNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLi4qXFtcclxuXF0rQ29tbWFuZCBuYW1lIGFiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQgaWYgdW5hbWJpZ3VvdXMuIiAiaGVscCBzdGF0dXMiCisjIHRlc3QgaGVscCBzdXBwb3J0CisjIEZJWE1FIC0tIFVsdHJpeCBoYW5ncyByYW5kb21seSBvbiB0aGlzIHZlcnkgbG9uZyBvdXRwdXQgZnJvbSBnZGIgYW5kCisjIGNvbnRpbnVlcyB3aXRoIGl0cyBvdXRwdXQgb25seSBpZiBzb21ldGhpbmcgaXMgc2VudCB0byBnZGIuCisjIEFsc28sIGlmIHRoZSBzeXN0ZW0gaXMgc2xvdywgaXQgbWF5IHRpbWUgb3V0IGJlY2F1c2UgdGhlIG91dHB1dCBpcyBsYXJnZS4KKyNnZGJfdGVzdCAiaGVscCBzdXBwb3J0IiAiU3VwcG9ydCBmYWNpbGl0aWVzLi4qXFtcclxuXF0rTGlzdCBvZiBjb21tYW5kczouKlxbXHJcblxdK3Nob3cgY29uZmlybSAtLSBTaG93IHdoZXRoZXIgdG8gY29uZmlybSBwb3RlbnRpYWxseSBkYW5nZXJvdXMgb3BlcmF0aW9ucy4qXFtcclxuXF0rc2hvdyBoaXN0b3J5IC0tIEdlbmVyaWMgY29tbWFuZCBmb3Igc2hvd2luZyBjb21tYW5kIGhpc3RvcnkgcGFyYW1ldGVycy4qXFtcclxuXF0rZG93bi1zaWxlbnRseSAtLSBTYW1lIGFzIHRoZSBgZG93bicgY29tbWFuZC4qXFtcclxuXF0rdXAtc2lsZW50bHkgLS0gU2FtZSBhcyB0aGUgYHVwJyBjb21tYW5kLipcW1xyXG5cXStUeXBlIFwiaGVscFwiIGZvbGxvd2VkIGJ5IGNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLi4qXFtcclxuXF0rQ29tbWFuZCBuYW1lIGFiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQgaWYgdW5hbWJpZ3VvdXMuIiAiaGVscCBzdXBwb3J0IgorIyB0ZXN0IGhlbHAgc3ltYm9sLWZpbGUKK2dkYl90ZXN0ICJoZWxwIHN5bWJvbC1maWxlIiAiTG9hZCBzeW1ib2wgdGFibGUgZnJvbSBleGVjdXRhYmxlIGZpbGUgRklMRS4uKlxbXHJcblxdK1RoZSBgZmlsZScgY29tbWFuZCBjYW4gYWxzbyBsb2FkIHN5bWJvbCB0YWJsZXMsIGFzIHdlbGwgYXMgc2V0dGluZyB0aGUgZmlsZS4qXFtcclxuXF0rdG8gZXhlY3V0ZS4iICJoZWxwIHN5bWJvbC1maWxlIgorIyB0ZXN0IGhlbHAgdGFyZ2V0IGNoaWxkCitnZGJfdGVzdCAiaGVscCB0YXJnZXQgY2hpbGQiICJVbml4IGNoaWxkIHByb2Nlc3MgLnN0YXJ0ZWQgYnkgdGhlIFwicnVuXCIgY29tbWFuZC4uKnxVbmRlZmluZWQgdGFyZ2V0IGNvbW1hbmQ6IFwiY2hpbGRcIi4gIFRyeSBcImhlbHAgdGFyZ2V0XCIuIiAiaGVscCB0YXJnZXQgY2hpbGQiCisjIHRlc3QgaGVscCB0YXJnZXQgcHJvY2ZzCitnZGJfdGVzdCAiaGVscCB0YXJnZXQgcHJvY2ZzIiAiVW5peCAvcHJvYyBjaGlsZCBwcm9jZXNzIC5zdGFydGVkIGJ5IHRoZSBcInJ1blwiIGNvbW1hbmQuKnxVbmRlZmluZWQgdGFyZ2V0IGNvbW1hbmQ6IFwicHJvY2ZzXCIuICBUcnkgXCJoZWxwIHRhcmdldFwiLiIgImhlbHAgdGFyZ2V0IHByb2NmcyAocHJvY2ZzIHZlcnNpb24pIgorIyB0ZXN0IGhlbHAgdGFyZ2V0IGNvcmUKK2dkYl90ZXN0ICJoZWxwIHRhcmdldCBjb3JlIiAiLipVc2UgYSBjb3JlIGZpbGUgYXMgYSB0YXJnZXQuKlNwZWNpZnkgdGhlIGZpbGVuYW1lIG9mIHRoZSBjb3JlIGZpbGUuKnwoVW5kZWZpbmVkIHRhcmdldCBjb21tYW5kOiBcImNvcmVcIi4gIFRyeSBcImhlbHAgdGFyZ2V0XCIuKSIgImhlbHAgdGFyZ2V0IGNvcmUiCisjIHRlc3QgaGVscCB0YXJnZXQgZXhlYworZ2RiX3Rlc3QgImhlbHAgdGFyZ2V0IGV4ZWMiICJVc2UgYW4gZXhlY3V0YWJsZSBmaWxlIGFzIGEgdGFyZ2V0Li4qXFtcclxuXF0rU3BlY2lmeSB0aGUgZmlsZW5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgZmlsZS4iICJoZWxwIHRhcmdldCBleGVjIgorIyB0ZXN0IGhlbHAgdGFyZ2V0IHJlbW90ZQorZ2RiX3Rlc3QgImhlbHAgdGFyZ2V0IHJlbW90ZSIgIlVzZSBhIHJlbW90ZSBjb21wdXRlciB2aWEgYSBzZXJpYWwgbGluZSwgdXNpbmcgYSBnZGItc3BlY2lmaWMgcHJvdG9jb2wuLipcW1xyXG5cXStTcGVjaWZ5IHRoZSBzZXJpYWwgZGV2aWNlIGl0IGlzIGNvbm5lY3RlZCB0byAuZS5nLiAvZGV2L3R0eWEuLioiICJoZWxwIHRhcmdldCByZW1vdGUiCisjIHRlc3QgaGVscCB0YXJnZXQKKyMgdGhlIGNoaWxkIHByb2Nlc3MgdGFyZ2V0IG1heSBiZSAidGFyZ2V0IGNoaWxkIiBvciAidGFyZ2V0IHByb2NmcyIKK2dkYl90ZXN0ICJoZWxwIHRhcmdldCIgIkNvbm5lY3QgdG8gYSB0YXJnZXQgbWFjaGluZSBvciBwcm9jZXNzLi4qXFtcclxuXF0rVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9yIHByb3RvY29sIG9mIHRoZSB0YXJnZXQgbWFjaGluZS4uKlxbXHJcblxdK1JlbWFpbmluZyBhcmd1bWVudHMgYXJlIGludGVycHJldGVkIGJ5IHRoZSB0YXJnZXQgcHJvdG9jb2wuICBGb3IgbW9yZS4qXFtcclxuXF0raW5mb3JtYXRpb24gb24gdGhlIGFyZ3VtZW50cyBmb3IgYSBwYXJ0aWN1bGFyIHByb3RvY29sLCB0eXBlLipcW1xyXG5cXStgaGVscCB0YXJnZXQgJyBmb2xsb3dlZCBieSB0aGUgcHJvdG9jb2wgbmFtZS4uKlxbXHJcblxdK0xpc3Qgb2YgdGFyZ2V0IHN1YmNvbW1hbmRzOi4qXFtcclxuXF0rdGFyZ2V0IGV4ZWMgLS0gVXNlIGFuIGV4ZWN1dGFibGUgZmlsZSBhcyBhIHRhcmdldC4qXFtcclxuXF0rVHlwZSBcImhlbHAgdGFyZ2V0XCIgZm9sbG93ZWQgYnkgdGFyZ2V0IHN1YmNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLi4qXFtcclxuXF0rQ29tbWFuZCBuYW1lIGFiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQgaWYgdW5hbWJpZ3VvdXMuIiAiaGVscCB0YXJnZXQiCisjIHRlc3QgaGVscCB0YnJlYWsKK2dkYl90ZXN0ICJoZWxwIHRicmVhayIgIlNldCBhIHRlbXBvcmFyeSBicmVha3BvaW50LioiICAiaGVscCB0YnJlYWsiCisjIHRlc3QgaGVscCB0dHkKK2dkYl90ZXN0ICJoZWxwIHR0eSIgIlNldCB0ZXJtaW5hbCBmb3IgZnV0dXJlIHJ1bnMgb2YgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZC4iICAiaGVscCB0dHkiCisjIHRlc3QgaGVscCB1bnRpbCAidSIgYWJicmV2aWF0aW9uCitnZGJfdGVzdCAiaGVscCB1IiAiRXhlY3V0ZSB1bnRpbCB0aGUgcHJvZ3JhbSByZWFjaGVzIGEgc291cmNlIGxpbmUgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50LipcW1xyXG5cXStvciBhIHNwZWNpZmllZCBsaW5lIG9yIGFkZHJlc3Mgb3IgZnVuY3Rpb24gLnNhbWUgYXJncyBhcyBicmVhayBjb21tYW5kLi4uKlxbXHJcblxdK0V4ZWN1dGlvbiB3aWxsIGFsc28gc3RvcCB1cG9uIGV4aXQgZnJvbSB0aGUgY3VycmVudCBzdGFjayBmcmFtZS4iICJoZWxwIHVudGlsIFwidVwiIGFiYnJldmlhdGlvbiIKKyMgdGVzdCBoZWxwIHVudGlsCitnZGJfdGVzdCAiaGVscCB1bnRpbCIgIkV4ZWN1dGUgdW50aWwgdGhlIHByb2dyYW0gcmVhY2hlcyBhIHNvdXJjZSBsaW5lIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudC4qXFtcclxuXF0rb3IgYSBzcGVjaWZpZWQgbGluZSBvciBhZGRyZXNzIG9yIGZ1bmN0aW9uIC5zYW1lIGFyZ3MgYXMgYnJlYWsgY29tbWFuZC4uLipcW1xyXG5cXStFeGVjdXRpb24gd2lsbCBhbHNvIHN0b3AgdXBvbiBleGl0IGZyb20gdGhlIGN1cnJlbnQgc3RhY2sgZnJhbWUuIiAiaGVscCB1bnRpbCIKKyMgdGVzdCBoZWxwIHVuZGlzcGxheQorZ2RiX3Rlc3QgImhlbHAgdW5kaXNwbGF5IiAiQ2FuY2VsIHNvbWUgZXhwcmVzc2lvbnMgdG8gYmUgZGlzcGxheWVkIHdoZW4gcHJvZ3JhbSBzdG9wcy4uKlxbXHJcblxdK0FyZ3VtZW50cyBhcmUgdGhlIGNvZGUgbnVtYmVycyBvZiB0aGUgZXhwcmVzc2lvbnMgdG8gc3RvcCBkaXNwbGF5aW5nLi4qXFtcclxuXF0rTm8gYXJndW1lbnQgbWVhbnMgY2FuY2VsIGFsbCBhdXRvbWF0aWMtZGlzcGxheSBleHByZXNzaW9ucy4uKlxbXHJcblxdK1wiZGVsZXRlIGRpc3BsYXlcIiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIHRoaXMgY29tbWFuZC4uKlxbXHJcblxdK0RvIFwiaW5mbyBkaXNwbGF5XCIgdG8gc2VlIGN1cnJlbnQgbGlzdCBvZiBjb2RlIG51bWJlcnMuIiAiaGVscCB1bmRpc3BsYXkiCisjIHRlc3QgaGVscCB1bnNldCBlbnZpcm9ubWVudAorZ2RiX3Rlc3QgImhlbHAgdW5zZXQgZW52aXJvbm1lbnQiICJDYW5jZWwgZW52aXJvbm1lbnQgdmFyaWFibGUgVkFSIGZvciB0aGUgcHJvZ3JhbS4uKlxbXHJcblxdK1RoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBwcm9ncmFtIHVudGlsIHRoZSBuZXh0IFwicnVuXCIgY29tbWFuZC4iICJoZWxwIHVuc2V0IGVudmlyb25tZW50IgorIyB0ZXN0IGhlbHAgdW5zZXQKK2dkYl90ZXN0ICJoZWxwIHVuc2V0IiAiQ29tcGxlbWVudCB0byBjZXJ0YWluIFwic2V0XCIgY29tbWFuZHMuKlxbXHJcblxdK0xpc3Qgb2YgdW5zZXQgc3ViY29tbWFuZHM6LipcW1xyXG5cXSt1bnNldCBlbnZpcm9ubWVudCAtLSBDYW5jZWwgZW52aXJvbm1lbnQgdmFyaWFibGUgVkFSIGZvciB0aGUgcHJvZ3JhbS4qXFtcclxuXF0rVHlwZSBcImhlbHAgdW5zZXRcIiBmb2xsb3dlZCBieSB1bnNldCBzdWJjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4uKlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzLiIgImhlbHAgdW5zZXQiCisjIHRlc3QgaGVscCB1cAorZ2RiX3Rlc3QgImhlbHAgdXAiICJTZWxlY3QgYW5kIHByaW50IHN0YWNrIGZyYW1lIHRoYXQgY2FsbGVkIHRoaXMgb25lLi4qXFtcclxuXF0rQW4gYXJndW1lbnQgc2F5cyBob3cgbWFueSBmcmFtZXMgdXAgdG8gZ28uIiAiaGVscCB1cCIKKyMgdGVzdCBoZWxwIHVwLXNpbGVudGx5CitnZGJfdGVzdCAiaGVscCB1cC1zaWxlbnRseSIgIlNhbWUgYXMgdGhlIGB1cCcgY29tbWFuZCwgYnV0IGRvZXMgbm90IHByaW50IGFueXRoaW5nLi4qXFtcclxuXF0rVGhpcyBpcyB1c2VmdWwgaW4gY29tbWFuZCBzY3JpcHRzLiIgImhlbHAgdXAtc2lsZW50bHkiCisjIHRlc3QgaGVscCB1c2VyLWRlZmluZWQKK2dkYl90ZXN0ICJoZWxwIHVzZXItZGVmaW5lZCIgIlVzZXItZGVmaW5lZCBjb21tYW5kcy4uKlxbXHJcblxdK1RoZSBjb21tYW5kcyBpbiB0aGlzIGNsYXNzIGFyZSB0aG9zZSBkZWZpbmVkIGJ5IHRoZSB1c2VyLi4qXFtcclxuXF0rVXNlIHRoZSBcImRlZmluZVwiIGNvbW1hbmQgdG8gZGVmaW5lIGEgY29tbWFuZC4uKlxbXHJcblxdK0xpc3Qgb2YgY29tbWFuZHM6LipcW1xyXG5cXStUeXBlIFwiaGVscFwiIGZvbGxvd2VkIGJ5IGNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLi4qXFtcclxuXF0rQ29tbWFuZCBuYW1lIGFiYnJldmlhdGlvbnMgYXJlIGFsbG93ZWQgaWYgdW5hbWJpZ3VvdXMuIiAiaGVscCB1c2VyLWRlZmluZWQiCisjIHRlc3QgaGVscCB3YXRjaAorZ2RiX3Rlc3QgImhlbHAgd2F0Y2giICJTZXQgYSB3YXRjaHBvaW50IGZvciBhbiBleHByZXNzaW9uLi4qXFtcclxuXF0rQSB3YXRjaHBvaW50IHN0b3BzIGV4ZWN1dGlvbiBvZiB5b3VyIHByb2dyYW0gd2hlbmV2ZXIgdGhlIHZhbHVlIG9mLipcW1xyXG5cXSthbiBleHByZXNzaW9uIGNoYW5nZXMuIiAiaGVscCB3YXRjaCIKKyMgdGVzdCBoZWxwIHdoYXRpcworZ2RiX3Rlc3QgImhlbHAgd2hhdGlzIiAiUHJpbnQgZGF0YSB0eXBlIG9mIGV4cHJlc3Npb24gRVhQLiIgICJoZWxwIHdoYXRpcyIKKyMgdGVzdCBoZWxwIHdoZXJlCitnZGJfdGVzdCAiaGVscCB3aGVyZSIgIlByaW50IGJhY2t0cmFjZSBvZiBhbGwgc3RhY2sgZnJhbWVzLCBvciBpbm5lcm1vc3QgQ09VTlQgZnJhbWVzLi4qXFtcclxuXF0rV2l0aCBhIG5lZ2F0aXZlIGFyZ3VtZW50LCBwcmludCBvdXRlcm1vc3QgLUNPVU5UIGZyYW1lcy4uKlxbXHJcblxdK1VzZSBvZiB0aGUgJ2Z1bGwnIHF1YWxpZmllciBhbHNvIHByaW50cyB0aGUgdmFsdWVzIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMuIiAiaGVscCB3aGVyZSIKKyMgdGVzdCBoZWxwIHgKK2dkYl90ZXN0ICJoZWxwIHgiICJFeGFtaW5lIG1lbW9yeTogeC9GTVQgQUREUkVTUy4uKlxbXHJcblxdK0FERFJFU1MgaXMgYW4gZXhwcmVzc2lvbiBmb3IgdGhlIG1lbW9yeSBhZGRyZXNzIHRvIGV4YW1pbmUuLipcW1xyXG5cXStGTVQgaXMgYSByZXBlYXQgY291bnQgZm9sbG93ZWQgYnkgYSBmb3JtYXQgbGV0dGVyIGFuZCBhIHNpemUgbGV0dGVyLi4qXFtcclxuXF0rRGVmYXVsdHMgZm9yIGZvcm1hdCBhbmQgc2l6ZSBsZXR0ZXJzIGFyZSB0aG9zZSBwcmV2aW91c2x5IHVzZWQuLipcW1xyXG5cXStEZWZhdWx0IGNvdW50IGlzIDEuICBEZWZhdWx0IGFkZHJlc3MgaXMgZm9sbG93aW5nIGxhc3QgdGhpbmcgcHJpbnRlZC4qXFtcclxuXF0rd2l0aCB0aGlzIGNvbW1hbmQgb3IgXCJwcmludFwiLiIgImhlbHAgeCIKKyMgdGVzdCBoZWxwIGluZm8gYm9ndXMtZ2RiLWNvbW1hbmQKK2dkYl90ZXN0ICJoZWxwIGluZm8gYm9ndXMtZ2RiLWNvbW1hbmQiICJVbmRlZmluZWQgaW5mbyBjb21tYW5kOiBcImJvZ3VzLWdkYi1jb21tYW5kXCIuICBUcnkgXCJoZWxwIGluZm9cIi4iICAiaGVscCBpbmZvIGJvZ3VzLWdkYi1jb21tYW5kIgorIyB0ZXN0IGhlbHAgZ290Y2hhCitnZGJfdGVzdCAiaGVscCBnb3RjaGEiICJVbmRlZmluZWQgY29tbWFuZDogXCJnb3RjaGFcIi4gIFRyeSBcImhlbHBcIi4iICAiaGVscCBnb3RjaGEiCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2k0ODYtZWxmLnUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2k0ODYtZWxmLnUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyMzM4YgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvaTQ4Ni1lbGYudQpAQCAtMCwwICsxLDI4NyBAQAorYmVnaW4gNzc3IGk0ODYtZWxmCitNP1Q1LDFAJCEgMCAgICAgICAgICAgICggIFAgISAgICBXKCgkIiMwICAgIVwrQCAgICAgICAjMCAoICAlCitNICJAICUwIDEgIDggICAgVCAgICAtKCAkIiAgICAgIkAgICAgSCAgICAgNCAgICAgICAgICBQICAgLTAgCitNICAgICAgICAgICAgICEsICAgICAgICAgISAgICAgICAgICAhICAgIC0gICAgIzIgISBAICAgICAqIDggCitNICJAJiAgICUgICAgICEgICAgJCAgICE8IUAgIDcpOCQiICAgICAiNCAgICAyICggICA8ICAgICAkICAgCitNIEAgICAoICYgICIgRUAwKCAgICAgJyAgICAgICAgICAhUCAgICAgICAgIE89Ny1SK1ZRSThCXUw6NilDCitNK0ctTytDJCAgICwgICAgLCAgICAhQCAgICBMICAgICogICAgICAgICAgICAgICAhICAgICAgICAgICggCitNICAgJCAgICAgICAgICA0ICAgICMgICAgIiAgICAgRCAgICAnICAgICAgICAgICAgICAgICAgICAgICAgCitNICAkICAgIjxAQDAoJyAgICAhKCAgICAqICAgIEkpQCQiICAgICAgMSAvJ18jUCAgICYiNiEgQCQgICAgCitNJDAgKyAhQCAgICE8QUAwKCAgICAgISQgXD9cPyAgICBLKCgkIiQgICAgIDIgICAgKUAgICAvIjYhIEAgCitNICAgICQwI1FfUlQgICAjLEBAMCggICAgICEoICAgIFIgICAgLyg4JCIgMCAgICAxICBIIC9QICAgK1IiCitNISBAICAgICAkQCAgICREICAgIURFQDAoICAgICAhJCBcP10/ICAgIEApOCQiICAgICAgMSAvJ18gJV1DCitNOyY1QTtHNVAgJV1FO0YwIDdWNU49RkVSO1ZYIDdWNVQ5N0FUICYlVDk3QUk9ICE/OTYxQT0mJCA5N0FJCitNPSAhPzsmRUI3VzlFPEctSTtWWCA3VV1GPCctVDg3KVQgJV0nMyRdIjA0UT8zVDkmNFQ1NDdVMSEwRFElCitNN1AhPzElRS4wNFUpMFAgTz03LVIrVlFJOEJdTDo2KUMrRy1PK0MkICAnIjYhIEAnIDAgID0pOCQiIDwlCitNICAhWEVAMCghUEQgICdSNiEgQCchUCAgUFAgICAvXFU6KTgkIi9cRTspOCQiICAgICAjXyk3IjYhIEFICitNICAgICAuR0BfX19fX1I1VEVAMCg6IEAgICAjSVQvX19fX1xFPik4JCImQDAgICAgWjwjX19fX18pN1I2CitNISBBSCYgICAgLkZQX19fXzpAIUogKE9MNEtCPEBAMChBPCFUIzZCPEBAMChaKztfX19eI1EgMlhAKTgkCitNIig3ID0gN0hJP19fX1ZAWEFAMChaKU9fX19eKzEwQi01KDQwQjE1QEVAMCg0SFU1IyUpMFolX19fX19ICitNQ09fX19eQCEgMCAgQFwwLDQuQjBfX19fOkAiWCAwICAgKUggICAgICFQI1RQXkwmLFwjSyAsRyM1OE9MCitNWl82MEQpI0shQy8gWlAjKVBVNitbLk9VRCkiMFpQOFNQLkwgUjwtNUJeU0tdOSIwRC5MJixcI0sgLEcjCitNNThPTFpfNjBEKSNLIUMvIFpQIylQVTYrWy5PVUQpIjBaUDhTUC5MIFI8LTVCXlNLXTkiMEQuTCYsXCNLCitNICxHIzU4T0xaXzYwRCkjSyFDLyBaUCMpUFU2K1suT1VEKSIwWlA4U1AuTCBSPC01Ql5TS105IjBELkwmCitNLFwjSyAsRyM1OE9MWl82MEQpI0shQy8gWlAjKVBVNitbLk9VRCkiMFpQOFNQLkwgUjwtNUJeU0tdOSIwCitNRC5MKlcwNSBBQDAoWlAjKVBVNitbLk9RRCkiMFpQSz0hNEImISBDSyAsRyM1OE9MWl8mMEQpI0lcUCQgCitNICkjJiE/QjchIEAgUUA1VEVQMCggPDglLkk8JCIgKUZRUDVMRVAwKCBQIUZRUDU8RVAwKCEgIUZRUDQkCitNRVAwKCEwIychMSI3ISBAJiAgICBRUDdQRUAwKCFQICAgLDwlXSk4JCIgQCAgICMnITZCNyEgQCkgICAgCitNUVA3XEVAMCgiQCAgICw8JT4pPCQiIEwgICAiQTQoOCQiKixcRVAwKEg1QiYhIEJDIyk8JCIqJTRBQDAoCitNSFBCNyEgQkBeKTwkIiorNEVQMChIJzI3ISBCQi4pPCQiKiBaRVAwKEhPQjYhIEFGSDZSNyEgQUZIV1I3CitNISBBRkg1UjchIEFGSFRCNyEgQUZIMDI3ISBBRkhYIjchIEJBJCk8JCIqLDxFUDAoSD8iNiEgQkNDKTwkCitNIionVEVAMChIVSI3ISBCQTopPCQiKi9QRVAwKEg/UjYhIEJDMCk8JCIqJVhFUDAoSFYiNyEgQkEvKTwkCitNIiovQEVQMChIMFI3ISBCQyspPCQiKiQoRVAwKEhSQjchIEMnITgyNyEgQ1hFUDAoUVA3TEVQMCg9KTwkCitNIiw8JUIpPCQiI0o3ISBDJyE+QjchIEFMRVAwKFFQNjxFUDAoNyk8JCIsPCUgKTwkIiAyNyEgQychNFI3CitNISBAMEVQMChRUDY0RVAwKFwpOCQiLDwlNik8JCIvMjYhIEMnITciNyEgQUhFUDAoUVA3PEVQMChfKTgkCitNIiw8JSYpPCQiJ0I3ISBDJyE9QjchIEBcRVAwKFFQNkBFUDAoIik8JCIsPCUpKTwkIiAoICAgIychMTI3CitNISBAIiAgICBRUDYwRiAwKCAwICAgLDwlXyk8JCIgJCAgICJBRik8JCIqLCBGIDAoOUomPEYgMCg5Si40CitNRiAwKFI8LTVCXlNJIU9bX19ZICAgICMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLEEiCitNICAgICAgICA6NCAgICAgICAgICAgKCI2ISBAICAgICAgICAgICoqIiEgQlJAQDAoUEgoJCItKiIhIEAhCitNICAgIDogICAgIFAgICAiKEBAMCgjMCAgICNCJiEgQCQgICAgWiggJCIgNCAgICNMQDAwKCFAICAgIlIhCitNISBAKiAgICA+UCAgICBMICAgIDAgICAgJTAgICAgICAgICAjICAgIDkpOCQiICggICAgQCAgICAlICAgCitNICEkICAgIDcgICAgOigoJCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkICAgICAgICAgCitNICAgICAgMCBcP1wgICAgIFUoICQiICAgICAgIyAgJCAgICAgIC5CICEgQCAgICAgIFAgIiAgICAgICBMCitNQDAwKCAgICAgICwgIFAgICAgICBbKCQkIiAgICAgICMgIDAgICAgICAmQiIhIEAgICAgICBQICUgICAgCitNICAiKEBAMCggICAgICAsICFAICAgICAgQygoJCIgICAgICAjICA8ICAgICAgLVIiISBAICAgICAgUCAoCitNICAgICAgIFhBQDAoICAgICAgLCAiMCAgICAgIC8oOCQiICAgICAgIyAgSCAgICAgICVSNiEgQCAgICAgCitNIFAgKyAgICAgICFERUAwKCAgICAgICwgIyAgICAgICBAKTgkIiAgICAgICMgIFQgICAgICAvIjYhIEAgCitNICAgICBQIC4gICAgICAgICAgICAgICAgICAsICNQICAgICAgICAgICAgICAgICAjICEgICAgICAgICAgCitNICAgICAgICAgUCAxICAgICAgICAgICAgICAgICAgLCAkQCAgICAgICAgICAgICAgICAgIyAhLCAgICAgCitNICAgICAgICAgICAgIFAgNCAgSCAgICAgICAgICAgICAgIDAgXD9cMSAgICAgICAgICAgICAgICQgLydfCitNJiAgICAgICAgICAgICAgICEgI1FfUjAgICAgICAgICAgICAgICAwIFw/XEwgICAgICAgICAgICAgICAkCitNIC8nXy1AICAgICAgICAgICAgICAhICNRX1NUICAgISxAUDAoIzAgICAhKCAiICEpICAgIFwpOCQiIDAgCitNICAgMSAgWCA1QCAgIC8yNiEgQCQgICAgJDAgLiAmNCAgICBYQUAwKCAgICAgISggIjAhSyAgICBeKTgkCitNIiAoICAgIDEgIFggQDAgICAjMiQhIEAhIEAgICRAICggKDggICAjXEVAMCghICAgICEkICNAIjQgICAgCitNICk8JCIgMCAgICAxICBYIEswICAgKVIiISBAPCAgICAkQCAgICs4ICAgIkRGIDAoICAgICAhJCBcP15bCitNICAgICEpPCQiICggICAgMSAgWCBTICAgIClSIyEgQC0gICAgJEAgKCAuKCAgICAoRVAwKCIgICAgISQgCitNI0AjSyAgICAkKTwkIiAwICAgIDEgIFggXDAgICAtUiIhIEAgICAgICRAICggL0AgICAgNEVQMCghICAgCitNICEkICNAICMgMCAgOCk4JCIgMCAgICAxICBMICMgJCAgIUI3ISBAJCAgICAkMCAuICIwISAgIDxFUDAoCitNIiAgICAhJCAjQCBQIDAgICkpPCQiIDAgICAgMSAgWCAuICQgICVSIyEgQC0gICAgJEAgKCAkTCEgICBICitNRVAwKCQgICAgISQgI0AhOiAwICA3KDgkIiAgICAgIDEgLydfODAkICAjQjchIEAiICAgICQwIC4gJzQhCitNICAgWkVQMCggMCAgICEkICNAIiUgMCAgLyk8JCIgMCAgICAxICBYIEMwJCAgJCI3ISBAKCAgICAkMCAuCitNICokISAgIkxAQDAoMCAgICAhKCAgICJIIDAgIDgpOCQiIDAgICAgQSAgTCBMICQgIC1SIyEgQC0gICAgCitNJEAgKCArUCEgICNcQFAwKCMwICAgISggIiAjMSAwICAyKTwkIiAwICAgIDEgIFggWUAkICAkUjchIEAkCitNICAgICQwIC4gLzAhICAjUEVAMCggICAgICEkIFw/X1sgMCAgPygsJCIgVCAgICAyICBAICIgKCAgJSI3CitNISBAKCAgICAkMCAuICFUIiAgIThFUDAoISAgICAhJCAjQCBUIEAgIEsoLCQiIFQgICAgMiAgQCAvUCggCitNICVSNyEgQCIgICAgJDAgLiAkWCIgICAsQSAwKCQwICAgISggIiAhOyBAICBTKCgkIiAgICAgIDIgICAgCitNOCAoICAmIjchIEAoICAgICQwIC4gJzgiICAhSEVQMCghICAgICEkICNAIV0gQCAgOyk8JCIgKCAgICAxCitNICBYIEEwKCAgJyI3ISBAJCAgICAkMCAuICkwIiAgIVRFUDAoIDAgICAhJCAjQCJCIEAgID4pPCQiIDAgCitNICAgMSAgWCBMQCggICdSNyEgQCQgICAgJDAgLiAsICIgICIgRVAwKCEgICAgISQgI0AjNyBAICAvKDgkCitNIiAwICAgIDEgIEggWSAoICAkTiMhIEAgICAgICRAICggLlAiICAiJEVQMCghICAgICEkICNAI1sgQCAgCitNQik8JCIgMCAgICAxICBYICRQLCAgKFI3ISBAKCAgICAkMCAuICI4IyAgIlxAQDAoICAgICAhKCAgICBQCitNIFAgIEUpPCQiIDAgICAgMSAgWCAxMCwgIClCNyEgQCQgICAgJDAgLiAkUCMgICFERUAwKCAgICAgISQgCitNXD9dQiBQICBHKTwkIiAwICAgIDEgIFggPjAsICAqIjchIEAkICAgICQwIC4gKEgjICAhPEVAMCghICAgCitNICEkICJQIjwgUCAgSSk8JCIhQCAgICAxICBYIElALCAgK1I3ISBAOCAgICAkMCAuICsgIyAgIzRFUDAoCitNIEAgICAhJCAjQCJdIFAgIFYpPCQiIDAgICAgMSAgWCBTMCwgIC1SNyEgQCQgICAgJDAgLiAuLCMgICBACitNQSAwKCQwICAgISggIiAjUSBQICBPKCwkIiBUICAgIDIgIEAgIFAwICAoIjYhIEAgICAgICQwI1FfUFAkCitNICAjQEVQMCgiICAgICEkICNAIDohICAgWik8JCIgMCAgICAxICBYICpAMCAgLlIjISBALSAgICAkQCAoCitNICNUJCAgI0xFUDAoISAgICAhJCAjQCEzISAgIFwpPCQiIEAgICAgMSAgWCA4IDAgIChCIiEgQCAgICAgCitNJEAgJiAmOCQgICNYRVAwKCAwICAgISQgI0AhTSEgICBfKTwkIiAwICAgIDEgIFggPTAwICAmUiMhIEAtCitNICAgICRAICggKEgkICAgIEYgMChEICAgICEkICNAIjEhICAgQygsJCIgVCAgICAyICBAIEkwMCAgKSI4CitNISBAJCAgICAkMCAuICpcJCAgIjRGIDAoIiAgICAhJCAjQCJYISAgIFMoLCQiIFQgICAgMiAgQCBTIDAgCitNIClSOCEgQCggICAgJDAgLiAgIUktI0BWK0Y1TDlAIUM8RzBRK0csIDhXKVQ6MllTICc5QTsnNUU8UlU4CitNPSJZQyAmPUQ4RlVFK0YsIDxWQT85JiVUODJZQyAmLVI9JlhOPFAhVjdWLUg4Nyk/OUc1TjhQIVY3Vy1JCitNOVZZRTklXUk7RzAgPUVdVTtHLUk5VllFOSVdSTtHMCA3VjlJO0ZEID1FXVU7Ry1JOVZZRTklXUM6JiVSCitNN1YlUjxGJVkgJlVBOjZYID1FXVM6Nj1OOTYxPzsmXU45UCFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VyFPCitNOjZZVDk3KCA3Vi1MOTYlTj03ICA3VjVOOSAhVjdXNU48VkVHO0Y1RDdXLUg7VylUICc5Pz02WVM6Nj1OCitNOTYxPzxWQU88RzE/OUc1TjhQIVY3VjFPPTYpTDkwIVY3VkVOPSAhPzxXMUE8RzAgO0ZdTjwnKUk7NiVSCitNPjAhPzk2WVY6NylPO0AhVjdXNU48VkVHO0Y1RDdWUU87Rj0/PCZdSTtHMUU8QCFWN1ZFTj0lXUE8RylBCitNPjAhUDxGRU04NylZICc5PzxWRUc7RjVEN1YtSDg3KT85RzVOOFAhVjdWMU89NilMOTVdQTxHKUE+MCE/CitNOTcxRT4nMCA9RV1TOjY9Tjk2MT84VkFBPEVdQTxHKUE+MCFWN1c1TjxWRUc7RjVEN1YtSDg3KCA9RV1GCitNOyZdQT0gIVY3Vy1JOVZZRTklXUw7VllHN1YlUjxGJVkgJiVUOTdBST0gIUU7RzlJPEZdTiAnOT87Jl1OCitNOVVdRj02WUMgJzk/PTZZUzo2PU45NjE/OyZdTjlVXUY9NllDICc5PzxWRUc7RjVEN1ctSDtXKVQ3ViVSCitNPEYlWSAnOT86NllUN1chTzo2WVQ5NyggN1Y1RDg3MUEgJzk/PFZBTzxHMT85RzVOOFAhVjdXNU48VkVHCitNO0Y1RDdWRU49JV1BPEcpQT4wIVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICc5Pzo2WVQ3VjlVCitNO0YsID1FXVM6Nj1OOTYxPzxWQU88RzAgPUVdRjsmXUE9JV1GPTZZQyAmNVg6NzAgPUVdVTtHLUk5VllFCitNOSVdTDtWWUc3ViVSPEYlWSAnOT87Jl1OOVAhVjdXLUg7VylUICc5PzsmXU45VV1QO1ZFTj0mNVIgJzk/CitNPFZFRztGNUQ3Vi1IODcoID1FXVU7Ry1JOVZZRTklXUw7VllHICc5PzxWQU88RzE/ODcpUjg3RCA9RV1VCitNO0ctSTlWWUU5JV1TOiZdUj0lXUE8RylBPjAhPzsmRUI3VzlFPEctSTtWWCA3VlVDO1c1Tj0gIVY3Vi1ICitNODcpPzwmXUk7RzFFPEAhVjdXNU48VkVHO0Y1RDdWLUg4Nyk/PCZdSTtHMUU8QCFWN1ctSTlWWUU5JV1JCitNO0cxPzg3KVI4N0QgN1VdRjwnLVQ4NylUICc5PzxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAnLT87JkVOCitNOlAhPzFUUS8wRCUsN1RdJjFFLSU1JV00MDQpLDE1XCA9RV1TOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFCitNPEAhVjdWMU89NilMOTVdUDtWRU49JjVSICVdPzsmXU45VjFPPTYpTDk1XVU8VjVEICc5PzxXMVI9Ni1UCitNLDAhVjdXLVQ8RzVDPSMoID1FXUM6JiVSN1YlUjxGJVkgJzk/OUZRTzg3MT88Jl1JO0cxRTxAIVY3Vy1JCitNOVZZRTklXUw7VllHN1chTzo2WVQ5NyggPUVdRDtXNUI7JjU/OUc1TjhQIVY3Vy1JOVZZRTklXUk7RzE/CitNOUc1TjhQIT8xJUUuMDRVKTBQIVY3VjlMO1YlVDdWJVI8RiVZICc5PzxWQU88RzE/PCZdSTtHMUU8QCFWCitNN1ctSTlWWUU5JV1MO1ZZRzdWOVU7RiwgPUVdUzo2PU45NjE/OFZBQTxFXVA7VkVOPSY1UiAnOT87Jl1OCitNOVVdQTxHKUE+MCE/OjZZST0gIVY3Vi1IODcoIDhWUVU7Rk1FPEAhVjdXNU48VkVHO0Y1RDdWLUg4Nyk/CitNOUc1TjhQIVU3VlFJO0ZMID1FXVM6Nj1OOTYxPzxWQU88RzE/OUc1TjhQIVM8Jl1SPSctQzg3KCA9RV1VCitNO0ZFTztDKCA9RV1VO0ctSTlWWUU5JV1JO0cxPzlHNU44UCFWN1c1Tjo2XU4gICBOOjZZVDk3KVAgIllICitNODctSCAiWUQ+NllTPjZUICtGMVk7Ry1UPEAgTjxGNUwrRyFMPSAgTjo2WUk9ICBOPCZRVCAiWVQ5N0FUCitNICJZRjo2WUkgIllSO1YxQT0mJCArRjFBPSYkICtGPU89ICBOOSdFTjg2VUk4UCBOOEctUyAiWVM+NlVUCitNODYoICtHLVQ8RzFBOEAgTjxWQVM9JylUODYoICtGLU87NlVFO0cwICtGMUU4RzVHICJZTDo2WUUgJCBICitNKFJFTDo2KUMrNkRTLiM4WjsmRUI4UlVJLFNAVitWLVM9Ml1DPEcwUStHLCksMlhRLiAhQTxTSEAqJS0jCitNMSQ0SSgjNE4sIiBALCMwTywzRE8uMyAgMCJAQyo2UUk4RixNOjMsWC1DSUM8VzRPOFcpVDoyWVMiMyROCitNLEAhQTxTSEAqJS0jMSQ0SSgjNE4sIiBALCMwTywzRE8uMyAgMCJAQyo2UUk4RixNPCZdUj0jSUc5NlhPCitNPUYlTD02NVMrNUFUK0YsKSwyWFMgJCBIKFJFTDo2KUMuRkVOOFJdUz42WU87R0VNPFJZSCIzJE4sUywgCitNMCJAQyo2QUU4NjBaOzYlVDoiWUgiMyhOLDMkTiwyWFItUCFBOFZdTTwjSEAqJS0jMSQ0SSgjNE4sIiBACitNLCMwTywzRE8uMyAgO1chVDo2VFooIkEzMFQxJSoyIFUrQyBAKCMgVCtTJFkrU0RQICYlUy5CIEg0VC0kCitNMTJEQC0yWFAoIiBQLSJcUS4yXFksICFBOFZdTTwjSEAqJS0jMSQ0SSgjNE4sIiBALCMwTywzRE8uMyAgCitNODcsWigiQTMwVDElKjIgVStDIEAoIyBUK1MkWStTRFAgJCBIKFJFTDo2KUMrNkRTLiM4WjlWNU4rVy1ICitNN1YxQT0mJE44UERRK0MsIDg2LU87NyBaKCJBMzBUMSUqMiBVK0MgQCgjIFQrUyRZK1NEUCAmXVA9JkVNCitNLkIgSDRULSQxMkRALTJYUCgiIFAtIlxRLjJcWSwgIUE8U0hAKiUtIzEkNEkoIzROLCIgQCwjME8sM0RPCitNLjMgIDAiQEMqNlFJOEYsTTozLFgtQ0lMOjYpQys2RFMuIzhPOFctVStWLVI9JlhOPFBEUStDNCA4NyxaCitNKCJBMzBUMSUqMiBVK0MgQCgjIFQrUyRZK1NEUCAiIUw5IiBaKCJBMzBUMSUqMiBVK0MgQCgjIFQrUyRZCitNK1NEUCAgICArQCAgICEkICRAIVAlQCAgLiAhRzkmKU05MllDICM4ISAwICAgISQhMygsJCIiJCEtODgkCitNIiA4ISAgICAgIVQgICAgMyAhKCAzQCQgICNAID0lXVM9JylVOFcwIE1AIDggICAgKkAgICAgVCAkQCFVCitNICAgIC4gIVY3Vi1IODcpPzs2NU04RjVSICU0ICAwIEMgIDggISAgICAgICcqUCAgICBUICRAIkAgICAgCitNLiAhVjdXLUg7VylUN1ZVRTs2KUU8QCE1ICAwIChQICYgIDAiICAgICFSRCAgICAtICEoIFIwICAgI0AgCitNPUVdSTtHMT87NjVNOEY1UiAlNCAhUCBDICA4ICEgMCAgICAnKkAgICAgVCAkQCNTICAgIC4gIVY3VlFPCitNO0Y9Pzs2NU04RjVSICU0ICJAIEMgIDggISBAICAgICcqUCAgICBUICRAID4gMCAgLiAhVjdWOUw7ViVUCitNN1ZVRTs2KUU8QCE1ICBYIChQICYgIDAsICAgICFSUCAgICAtICEoIDJAJCAgI0AgPUVdRDtXNUI7JjU/CitNOzY1TThGNVIgJTQgI1AgQyAgOCAhISAgICAgJyEgICAgIUwgICAgMyAhKCA7ICggICNAICtDIUY4Nk1FCitNICs4ICYgICAgIkggICAgLSAhKCBEUCQgICNAID1FXUM6JiVSN1ZVRTs2KUU8QCE1ICAkIChQICYgIDAgCitNICAgICFSTCAgICAtICEoIE9AJCAgI0AgPUVdUzomXVI9JV1NOTZVQjk3KCA1MCAkICIsICFAICQgQCAgCitNICA8SSAgICAjMCAyIC48ISAgIFggJzk/OjZZVDdWVUU7NilFPEAhNSAgPCAoUCAmICAwJCAgICAhUkggCitNICAgLSAhKCAkMCggICNAID1FXUw7VllHN1ZVRTs2KUU8QCE1ICBIIChQICYgIDAoICAgICFSTCAgICAtCitNICEoIC8gKCAgI0AgPUVdRjsmXUE9JV1NOTZVQjk3KCA1MCAuICIsICFAICQjICAgICA8TCAgICAjMCAyCitNICZAIiAgIFggJzk/OSZdVThGUUU3VlVFOzYpRTxAITUgIFwgKFAgJiAgMDAgICAgIVAwICAgIDwgICAgCitNJVAgMiAoTCMgICBYICcxPz02WUk7VlggTUAgKCAgICAqQCAgICBUICRAIlIgQCAgLiAhVjdWLUg4Nyk/CitNOzY1TThGNVIgJTQgIDAgQyAgOCAhICAgICAgJypQICAgIFQgJEAjPSBAICAuICFWN1ctSDtXKVQ3VlVFCitNOzYpRTxAITUgIDAgKFAgJiAgMCAgICAgIVJEICAgIC0gISggIUAsICAjQCA9RV1JO0cxPzs2NU04RjVSCitNICU0ICFQIEMgIDggISAgICAgICcqQCAgICBUICRAIFAgUCAgLiAhVjdWUU87Rj0/OzY1TThGNVIgJTQgCitNIkAgQyAgOCAhICAgICAgJypQICAgIFQgJEAhOyBQICAuICFWN1Y5TDtWJVQ3VlVFOzYpRTxAITUgIFggCitNKFAgJiAgMCAgICAgIVJQICAgIC0gISggQVAsICAjQCA9RV1EO1c1QjsmNT87NjVNOEY1UiAlNCAjUCBDCitNICA4ICEgICAgICAnISAgICAhTCAgICA3ICEoIEowMCAgI0AgK0MlRjg2TUUgKzggIiAgICAiSCAgICAtCitNICEoIFQgLCAgI0AgPUVdQzomJVI3VlVFOzYpRTxAITUgICQgKFAgJiAgMCAgICAgIVJMICAgIC0gISggCitNXlAsICAjQCA9RV1TOiZdUj0lXU05NlVCOTcoIDUwICQgIiwgIUAgJCAgICAgIDxJICAgICMwIDIgIjAkCitNICAgWCAnOT86NllUN1ZVRTs2KUU8QCE1ICA8IChQICYgIDAgICAgICFSSCAgICAtICEoIDNAMCAgI0AgCitNPUVdTDtWWUc3VlVFOzYpRTxAITUgIEggKFAgJiAgMCAgICAgIVJMICAgIC0gISggPjAwICAjQCA9RV1GCitNOyZdQT0lXU05NlVCOTcoIDUwIC4gIiwgIUAgJCAgICAgIDxMICAgICMwIDIgKjQkICAgWCAnOT85Jl1VCitNOEZRRTdWVUU7NilFPEAhNSAgXCAoUCAmICAwICAgICAhUDAgICAgSiAgICAhQCAyIC08JCAgIFggJzk/CitNOFZBQTxFXUY9NllDICU0ICAwIDEgNFIjISBAQSA1RiMhIEAkICAgICwwICAgIDggJEAgLCEwICAuICFWCitNN1ctSTlWWUU5JV1DOiYlUjdWOVU7RiwgNTAgIiAhJCE3KCwkIiIkITo4LCQiIDAgICAgUyAgICAhQCAyCitNICQsJSAgIFggJzk/PTZZUzo2PU45NjE/OFZBQTxFXUY9NllDICU0ICBQIDEgNlIjISBAQSA3RiMhIEAkCitNICAgICpQICAgIDggJEAhUiEwICAuICFWN1ctSDtXKVQ3VjlVO0YsIDUwICQgISQhPygsJCIiJCFCOCwkCitNIiAwICAgIFIgICAgIUAgMiAqQCUgICBYICc5PzxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsIDUwICUgISQhCitNQygsJCIiJCFGOCwkIiAwICAgIFQgICAgIUAgMiAuICUgICBYICc5Pz02WVM6Nj1OOTYxPzxWQU88RzE/CitNOUc1TjhQITUgIDggJDAmPEBQMCgoMCZJQFAwKCEgICAgIkQgICAgJiAhKCAjMDggICNAID1FXUk7RzE/CitNOUc1TjhQITUgIDwgJDAmTEBQMCgoMCZZQFAwKCEgICAgIyAgICAgJiAhKCAwMDggICNAID1FXVM6Nj1OCitNOTYxPzo2WVQ3VjlVO0YsIDUwICggISQhTygsJCIiJCFSOCwkIiAwICAgIFIgICAgIUAgMiAnPCYgICBYCitNICc5Pz02WVM6Nj1OOTYxPzo2WVQ3VjlVO0YsIDUwICkgISQhUygsJCIiJCFWOCwkIiAwICAgIEogICAgCitNIUAgMiAqNCYgICBYICc5PzsmXU45VV1GPTZZQyAlNCAiQCAxID1SIyEgQEEgPkYjISBAJCAgICAsMCAgCitNICA4ICRAIzohQCAgLiAhVjdXLUk5VllFOSVdTDtWWUc3VjlVO0YsIDUwICsgISQhWygsJCIiJCFeOCwkCitNIiAwICAgIFMgICAgIUAgMiAhJCcgICBYICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1GPTZZQyAlNCAjICAxCitNID9SIyEgQEEgMEYkISBAJCAgICAqUCAgICA4ICRAISAhUCAgLiAhVjdWOUw7ViVUN1Y5VTtGLCA1MCAuCitNICEkISMoMCQiIiQhJzgwJCIgMCAgICBMICAgICFAIDIgJyAnICAgWCAnOT85Jl1VOEZRRTdWOVU7RiwgCitNNTAgLyAhJCEoKDAkIiIkISw4MCQiIDAgICAgNSAgICAlMCAyICpYJyAgIiMgIDQgID5IJyAgIDUgICAgCitNITAgMiApSCcgICIjICA0ICA+SCcgICAwICAgICEwIDIgKkgnICAhNSAgPCAhICAgICNQICAgICEgISggCitNWkA8ICApNCAgICJDICJAICAgQCAgICAgICAgICAgICAiICAgICAgICAwICAgICAoICAgICAgICIgICAgCitNIicoICtAICAgIUQgICAgMyAhKCA+UEAgICNAIDsmRU46UCJWIClAICAgIEYgICAgIzAgMiAiRCggICBYCitNICZZRT4nMCBAUCAlICAnSiFQICAoUCAmICAwICAgICAhUkggICAgLSAhKCA0UEAgICNAIDsmRU46VjlVCitNO0YsIEBQICUgICVQIVAgIChQICYgIDAkICAgICFSMCAgICAtICEoID1QQCAgI0AgPFcxVTlGOCA8QCJOCitNIVAgIChQICYgIDAoICAgICFQMCAgICA1ICAgICUwIDIgK0QoICAiIyAgNCAgPkgnICAgNSAgICAhMCAyCitNICo0KCAgIiMgIDQgID5IJyAgIDAgICAgITAgMiArNCggICE1ICA8ICEgICAgI1AgICAgISAhKCBdMEAgCitNICk0ICAgIkMgIkAgICBAICAgICAgICAgICAgICIgICAgICAgIDAgICAgICggICAgICAgIiAgICAiJyggCitNK0AgICAhUCAgICA3ICEoIEIwRCAgI0AgPSc1PzsmRU46UCJWICkgICAgIEYgICAgIzAgMiAjPCkgICBYCitNICZZRT4nMCBAUCAlICAnSiFQICAoUCAmICAwICAgICAhUkggICAgLSAhKCA4MEQgICNAIDsmRU46VjlVCitNO0YsIEBQICUgICVbIiAgIChQICYgIDAgICAgICFSMCAgICAtICEoIEEwRCAgI0AgPFcxVTlGOCA8QCJZCitNIiAgIChQICYgIDAgICAgICFQMCAgICBaICAgICEgIDIgLDwpICAgWCAiWFI5RiVLOTAiViAgMCAgICNTCitNICFMICBAICAgJilMPTY0ICAwICAgJj1SOTY1TiAgICAgICFSOTYwICEgICAgI1ggICAgJCAhKCAiMEggCitNICNAIDhWXUw7VylTICs4ICEgICAgLywgJ1AgIiAgICA8JkVOOlAgISAgICA8JzVSPCZRRSAgICAgICFZCitNOTZRTDtXPCAhICAgICMoICAgICQgISggL1BIICAjQCArQy1GODZNRSArOCAhICAgIC8sICRQICEgICAgCitNOUZdUjkgICAgICAgOFZBRT1HRCAhICAgICMkICAgICQgISggPSBIICAjQCA4ViVSPFAiViAgMCAgICNTCitNICEwICAwICAgJyFPPEctQzomNCAgICAgICYpTT1QICQgICAgLEAgICAgMCAkQCJKIkAgIC4gIE4tJjlBCitNOlY0IE1AICQgICAgXFAgMyAgJCAgICE0NEU1JSAgICAgICEmMDRRMzEwICQgICAgJyAgICAhOCAkQCMmCitNIkAgIC4gIUI7Vl1MOTYlTiAnKCA9IEggICMkICAgICQgISggXlBIICAjQCA4RzlBOycsIE1AICQgICAgCitNXFAgMyAgJCAgICFUPEc1RSAgICAgICFGODZRUzkwICQgICAgJzAgICAhOCAkQCA4IlAgIC4gIUI7Vl1MCitNOTYlTixAIVIgLDgqICAhJiAgICAhICAyICYoKyAgIFggJlVJPFZdUjkmNVI5NjAgTUAgJCAgICBcUCBDCitNICAsICAgIVQ6JylFOTAgICAgICA+RjVSO1AgISAgICA7VllFICAoICAgIVQ9VlwgISAgICAiLCAgICAmCitNICEoIEIwTCAgI0AgOzYlSTtAITUgIDwgJDAkVEEgMCgoMCRVQUAwKCEgICAgIjwgICAgJyAhKCBMIEwgCitNICNAIDxXIU88RzFTOFYlUiAnKCAvUEggICIsICEwICNEKUAkIiI0ICAgICcgISggVTBMICAjQCA4VlFVCitNO0ZNRTxAIVIgIEQqICAgQyAgNCAgX1I3ISBASCAgICAhUCAyIC9UKyAgIFggJllPO0chUjo2VUE8R0QgCitNPEAjJyIwICAoUCAlICAsNEVQMCgpMCAgICA8ICRAIEIjICAgLiAhUDxGRU04NylZICcoIEIwRCAgIiwgCitNITAgIykpPCQiIjAgICAgJyAhKCAxQFAgICNAID01XUw6NllLICcoIF0wQCAgIiwgITAgIyApQCQiIjwgCitNICAgJyAhKCA7MFAgICNAIDxVXUw6NllLICgsICEwICFaQDwgICIsICEwICNGKTwkIiI4ICAgICcgISggCitNRFBQICAjQCA9RV1VO0ZFTztDKCA8QCIrIFAgIChQICUgIC40RiAwKCkwICAgIDwgJEAiWCMgICAuICFWCitNN1c1Tjo2XU4gJyggOyAoICAiLCAhMCAjRylAJCIiPCAgICAnICEoIFdQUCAgI0AgPUVdUz0nKVU4VzBSCitNICcoIDNAJCAgIiwgITAgI08pPCQiIjwgICAgJyAhKCAhQFQgICNAID1FXVM9JylVOFcwUSAnKCArQCAgCitNICIsICEwICNJKTwkIiJcICAgICcgISggLTBUICAjQCA9RV1EO1c1QjsmNT88Jl1JO0cxRTxAIUMgICwgCitNIDBcIChQICUgIC5ARVAwKCtAICAgIDwgJEAhQyMwICAuICFWN1Y5TDtWJVQ3VyFPOjZZVDk3KCA4UCAjCitNICAkLiAiLCAhMCAjVik8JCIjOCAgICAnICEoIEYwVCAgI0AgPUVdVTtHLUk5VllFOSVdTDtWWUc3VyFPCitNOjZZVDk3KCA4UCAjICAkLCAiLCAhMCAjJik8JCIjMCAgICAnICEoIFMwVCAgI0AgPUVdUzo2PU45NjE/CitNOyZdTjlVXVA7VkVOPSY1UiAmLCAgUCAhIlAgQyAgNCAgXVI3ISBATSAgICAhUCAyIC9ILSAgIFggJzk/CitNOyZdTjlVXVA7VkVOPSY1UiAmLCAgUCAhIkAgQyAgNCAgVyI3ISBAVSAgICAhUCAyICJcLiAgIFggJzk/CitNPTZZUzo2PU45NjE/OjZZVDdXIU86NllUOTcoIDhQICMgICQpICIsICEwICM2KTwkIiMsICAgICcgISggCitNOEBYICAjQCA9RV1TOjY9Tjk2MT86NllUN1chTzo2WVQ5NyggOFAgIyAgJCggIiwgITAgI0UpPCQiIlAgCitNICAgJyAhKCBDQFggICNAID1FXUk7RzE/PCZdSTtHMUU8QCFDICAsICAwPCAoUCAlICAtLEVQMCgtUCAgCitNICA8ICRAIyUjQCAgLiAhVjdXNU48VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQ5NyggOFAgIyAgJCYgIiwgCitNITAgIyApPCQiIzQgICAgJyAhKCBeQFggICNAID1FXVM6Nj1OOTYxPzxWQU88RzE/PCZdSTtHMUU8QCFDCitNICAsICAwNCAoUCAlICAuPEVQMCgrQCAgICA8ICRAIEgjUCAgLiAhVjdXLUg7VylUN1chTzo2WVQ5NyggCitNOFAgIyAgJCQgIiwgITAgI1opPCQiIzggICAgJyAhKCA3QFwgICNAID1FXVU7Ry1JOVZZRTklXUM6JiVSCitNN1chTzo2WVQ5NyggOFAgIyAgJCMgIiwgITAgI0IpPCQiIzAgICAgJyAhKCBEQFwgICNAID1FXVM6Nj1OCitNOTYxPzhWQUE8RV1QO1ZFTj0mNVIgJiwgIFAgISBAIEMgIDQgIF5SNyEgQE0gICAgIVAgMiArXC8gICBYCitNICc5PzhWQUE8RV1QO1ZFTj0mNVIgJiwgIFAgISAwIEMgIDQgIFgyNyEgQEQgICAgIDAgMiAuLC8gICI1CitNICAgIEhQIDAgICAoICAgICAgICEgICAgIiU0ICNQIEwgICAgIVAgMiAgXDAgICBYICc5PzkmXVU4RlFFCitNN1YlUjxGJVkgJyggT1BcICAiLCAhMCAjKik8JCIiMCAgICAhICEoICxRICAgKTQgICAiQyAhICAgIEAgCitNICAgICAgJCAgICAoNTAgLiAiTCAgICAnICEoIDdBICAgI0AgPUVdRjsmXUE9JV1BPEcpQT4wIVIgIFwwCitNICAgQyAgNCAgXiI3ISBARCAgICAgMCAyICgoMCAgIjUgICAgSFAgMCAgICggICAgICAgISAgICAiJTQgCitNIyAgUyAgICAhUCAyICs0MCAgIFggJzk/PTZZUzo2PU45NjE/OyZdTjlVXUE8RylBPjAhUiAlWDAgICBDCitNICA0ICBWIjchIEBEICAgICAwIDIgLUQwICAiNSAgICBIUCAwICAgKCAgICAgICAhICAgICIlNCAiUCBRCitNICAgICFQIDIgIEgxICAgWCAnOT88VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA8QCJVJCAgIChQICUgIC0gCitNRVAwKCkgICAgICQgJEAgTiQwICBFMCAgICosICQgICAiICAgICAgICAwICAgIEE1ICBIICpAICAgIDwgCitNJEAhOCQwICAuICFWN1ZRTztGPT84NylSODdEIDxAICokMCAgKFAgJSAgL1BFUDAoKSAgICAgJCAkQCFcCitNJDAgIEUwICAgKiwgJCAgICIgICAgICAgIDAgICAgQTUgIEQgLEAgICAgPCAkQCJOJDAgIC4gIVY3VzVOCitNPFZFRztGNUQ3VkVOPSVdQTxHKUE+MCFSICVAMSAgIEMgIDQgIFUiNyEgQEQgICAgIDAgMiAtKDEgICI1CitNICAgIEhQIDAgICAoICAgICAgICEgICAgIiU0ICIgIFAgICAgIVAgMiAgKDIgICBYICc5PzxWRUc7RjVECitNN1ZFTj0lXUE8RylBPjAhUiAqWDEgICBDICA0ICBYUjchIEBEICAgICAwIDIgIjgyICAiNSAgICBIUCAwCitNICAgKCAgICAgICAhICAgICIlNCAhUCBJICAgICFQIDIgJFwyICAgWCAnOT86NllUN1YlUjxGJVkgJyggCitNIEEoICAiLCAhMCAjJyk8JCIiMCAgICAhICEoIDxRKCAgKTQgICAiQyAhICAgIEAgICAgICAgJCAgICAoCitNNTAgJiAjMCAgICAnICEoIElRKCAgI0AgPUVdVTtHLUk5VllFOSVdUzomXVI9JV1BPEcpQT4wIVIgJFwyCitNICAgQyAgNCAgWCI3ISBARCAgICAgMCAyICxMMiAgIjUgICAgSFAgMCAgICggICAgICAgISAgICAiJTQgCitNITAgUiAgICAhUCAyIC9UMiAgIFggJzk/PFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZICcoIElRKCAgIiwgCitNITAgIzIpPCQiIjAgICAgISAhKCAoMSwgICk0ICAgIkMgISAgICBAICAgICAgICQgICAgKDUwICQgIkwgCitNICAgJyAhKCAzISwgICNAID1FXVM6Jl1SPSVdQTxHKUE+MCFSIC9UMiAgIEMgIDQgIFdSNyEgQEQgICAgCitNIDAgMiAnIDMgICI1ICAgIEhQIDAgICAoICAgICAgICEgICAgIiU0ICBQIFMgICAgIVAgMiAqLDMgICBYCitNICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4wIVIgJFAzICAgQyAgNCAgX0I2ISBARCAgICAgMCAyCitNICw8MyAgIjUgICAgSFAgMCAgICggICAgICAgISAgICAiJTQgIEAgUSAgICAhUCAyIC9AMyAgIFggJzk/CitNPFZFRztGNUQ3Vi1IODcpPzg3KVI4N0QgPEAiQyRQICAoUCAlICAsWEVQMCgpICAgICAkICRAIDwlICAgCitNRTAgICAqLCAkICAgIiAgICAgICAgMCAgICBBNSAgJCAqQCAgICA8ICRAISYlICAgLiAhVjdWLUg4Nyk/CitNODcpUjg3RCA8QCNYJFAgIChQICUgIC80RVAwKCkgICAgIDwgJEAhSiUgICAuICFWN1YxTz02KUw5MCE1CitNICBcIChQICUgICwoRVAwKChQICAgIDwgJEAiLSUgICAuICFWN1Y5TDtWJVQgJTQgI0AgQyAgNCAgU1I3CitNISBASyAgICAhUCAyICtANCAgIFggJzk/PTZZUzo2PU45NjE/OyZdTjlQITUgIFAgKFAgJSAgLVhFUDAoCitNKjAgICAgPCAkQCNBJSAgIC4gIVY3Vy1JOVZZRTklXUw7VllHICU0ICJQIEMgIDQgIF9SNiEgQEIgICAgCitNIVAgMiAgLDUgICBYICc5PzsmXU45UCE1ICBIIChQICUgIC1IRVAwKCpAICAgIDwgJEAgTSUwICAuICFWCitNN1c1TjxWRUc7RjVEN1ZFTj0gITUgIEQgKFAgJSAgL1RFQDAoKiAgICAgPCAkQCE1JTAgIC4gIVY3Vy1JCitNOVZZRTklXUk7RzAgNTAgKCAiLCAhMCAjXCk4JCIiJCAgICAnICEoID1BNCAgI0AgPUVdSTtHMCA1MCAnCitNICIsICEwICMkKTwkIiJQICAgICcgISggSEE0ICAjQCA9RV1VO0ctSTlWWUU5JV1TOiZdUj0gITUgIDggCitNKFAgJSAgLCRFUDAoKkAgICAgPCAkQCMsJTAgIC4gIVY3Vy1JOVZZRTklXVM6Jl1SPSAhNSAgNCAoUCAlCitNICAtPEVQMCgoUCAgICA8ICRAI08lMCAgLiAhVjdXLUg7VylUICU0ICEgIEMgIDQgIFZSNyEgQEsgICAgCitNIVAgMiAhSDYgICBYICc5Pz02WVM6Nj1OOTYxPzhWQUE8QCE1ICAsIChQICUgICxaRVAwKCowICAgIDwgCitNJEAhIyVAICAuICFWN1ctSTlWWUU5JV1DOiYlUiAlNCAgQCBDICA0ICBXMjchIEBCICAgICFQIDIgJjQ2CitNICAgWCAnOT84VkFBPEAhNSAgJCAoUCAlICAvWEVQMCghICAgICA8ICAgICAgICIyIEAgIDMoLCQiJ0QgCitNICAjX19QICAgICFaICAgIF9fXDAgICAgPlAgICAvX18oICAgICdUICAgI19fUyAgICAhXiAgICBfX10gCitNICAgID9QICAgL19fNCAgICAoJCAgICNfX1YgICAgIiIgICAgX19dUCAgICBAUCAgIC9fX0AgICAgKDQgCitNICAjX19ZICAgICImICAgIF9fXkAgICAgQVAgICAvX19MICAgIChEICAgI19fXCAgICAiKiAgICBfX180CitNICAgIExAICAgL19fWiAgICArNCAgICNfX15YICAgIlYgICAgX19fVSAgICBNUCAgIC9fX18gICAgK0QgCitNICAjX19QLCEgICJaICAgIF9fXCwgMCAgTlAgICAvX18lMCQgICtUICAgI19fUVghICAiXiAgICBfX1xICitNIDAgIE9QICAgL19fLEAkICAsJCAgICNfX1NQISAgIyIgICAgX19dJiAwICBQUCAgIC9fXzQgJCAgLDQgCitNICAjX19VSCEgICMmICAgIF9fXUQgMCAgUjAgICAvX18+ICQgICxIICAgI19fWCghICAjKyAgICBfX14sCitNIDAgIFMwICAgL19fRUAkICAsWCAgICNfX1ooISAgIy8gICAgX19eTiAwICBUMCAgIC9fX05AJCAgLSggCitNICAjX19cMCEgICMzICAgIF9fXy4gMCAgVTAgICAvX19WICQgIC04ICAgI19fXighICAjNyAgICBfX19MCitNIDAgIFYwICAgL19fXUAkICAtSCAgICNfX1AgIiAgIzwgICAgX19cNCBAICBXMCAgIC9fXydAKCAgLVggCitNICAjX19SQCIgICNAICAgIF9fXFIgQCAgWDAgICAvX18vICggIC4oICAgI19fVDgiICAjRCAgICBfX10wCitNIEAgIFkwICAgL19fNkAoICAuOCAgICNfX1YwIiAgI0ggICAgX19dTiBAICBaMCAgIC9fXz4gKCAgLkggCitNICAjX19YKCIgICNMICAgIF9fXiwgQCAgWzAgICAvX19FQCggIC5cICAgI19fWiAiICAjUCAgICBfX15KCitNIEAgIFwwICAgL19fTSAoICAvKCAgICNfX1tYIiAgI1QgICAgX19fKCBAICBdQCAgIC9fX1RAKCAgLzwgCitNICAjX19dWCIgICAgICAgIF9fX0kgQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgMCAgICAkICAgICIgICAgVSggJCItMCAgICAzICAgICAgICAgICAgCitNICAgISAgICAgICAgICBEICAgICUgICAgIEAgICAuQiAhIENIICAgIDEgICAgICwgICAgICAgICAhICAgCitNICAwICAgIC8gICAgIlAgICAgKCAgICBMQDAwKCsgJCAgLCAgICAgJCAgICAgMCAgICAwICAgIDAgICAgCitNJVAgICAgLCAgICAiICAgIFsoJCQiLlAhICAhWyAgICAgICAgICAgICAgICEgICAgICAgICAhXCAgICApCitNICAgICBAICAgJkIiISBBSCBAICAoICAgICAsICAgICcgICAgISAgICAgQCAgICBIICAgICAwICAgIDggCitNICAiKEBAMChCICggICAkICAgICAgICAgICAgICAgMCAgICAgICAgICtAICAgICQgICAgJiAgICBDKCgkCitNIihQIiAgITAgICAgICAgICAgICAgICAkICAgICEgICAgIywgICAgISAgICAhQCAgIC1SIiEgQzwgQCAgCitNNjAsICAgICAgICAgICAgICEgICAgICAgICAgWSAgICAgMCAgICA4ICAgIFhBQDAoLiA4ICAgJCAgICAgCitNICAgICAgICAgIDAgICAgICAgICAvUCAgICAkICAgICIgICAgLyg4JCIjUCYgICBAICAgICAgICAgICAgCitNICAgJCAgICAgICAgICQ8ICAgICEgICAgIFAgICAlUjYhIEE8IUAgICIgICAgICAgICAgICAgICAhICAgCitNICAgICAgIS0gICAgIDAgICAgLCAgICFERUAwKDkgOCAgIVAgICAgICAgICAgICAgICAwICAgICQgICAgCitNNEAgICAgOCAgICAjICAgIEApOCQiKCAmICAhUCAgICAhICAgICAgICAgICQgICAgIiAgICAlTCAgICAoCitNICAgICBQICAgLyI2ISBDUCFAICBNICQgICAgICAgICAgICAgISAgICAgICAgICFAICAgICBAICAgICAgCitNICAgICAgICBcIDggICAgJyAgIDAgICAgJyAgICAgMCAgICAwICAgIDogICAgICwgICAgICAgICAgICAgCitNIC8gLSAgIzQhICAgICAgICAgICAgICAhICAgICAgICAgJyAgICAgIyAgICAgICAgICAgICAgIyQkQCAgCitNRCAgICAgICAgICAgICAgICAwICAgICAgICAhWiAgICAgMCAgICAgICAgICAgICAgNSEsICAiKCIgICAgCitNICAgICAgICAgICQgICAgICAgICBAUCAgICAkICAgICAgICAgICAgICAnQDUgICFQJUAgICAgICAgICAgCitNICAgJCAgICAgICAgIChIICAgICEgICAgICAgICAgICAgICNIKlAgIERAKCAgICAgICAgICAgICAgMCAgCislICAgICAgICAKKyAKK2VuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9pODYwLWVsZi51IGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9pODYwLWVsZi51Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNmU4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2k4NjAtZWxmLnUKQEAgLTAsMCArMSwzMTQgQEAKK2JlZ2luIDc3NSBpODYwLWVsZgorTT9UNSwxQCQiIDAgICAgICAgICAgICAgIiAgPCAgICAhICAgMzIgICAgIzAgICMtNCAgICAgICBUICIgIAorTSEwIEggITQgJDAgICAgOCAgICBUICAgMC0gICAgICAgICAiQCAgICBIICAgICA0ICAgICAgICAgIFAgIAorTSAtMCAgICAgICAgICAgICAgISwgICAgICAgICAhICAgICAgICAgICEgICAgLSAgICQjMCAgICAgICAgKAorTVwgICAiLyAgICAgJSAgIDAgICAgICAkICAgREQgICBJKSAgICAgICAgICI4ICAgIjcgICAgIDggICEgIAorTSAgICAgQCAgIjRQICAiRSwgICAgICAgICAnICAgICAgICAgICFQICAgICBPPTctUitWUUk4Ql1MOjYpQworTStHLU8rQyQgICAgICAgLCAgICAsICAgICFQICAgIFAgICAgKyAgICAgICAgICAgICAgICAgICAgIEAgIAorTSAgICAgICAjICAgICEwICAgICAgICAgJiAgICAhICAgICBEICAgICogICAgIiAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICEgICAgIDAgICRNICAgICEsJEAgICAgICAgIEggICJOIAorTSAgICAgISQgX18kICAgIC8gICBJKiAgICAgMDEgICArICAgICYgICAmMjAgICAgICQwI19cMCAgICFcIAorTSAhK0wgICAgRiEoICAgICAgICBGICAgSU8gICAgICAxIC9fUSAgICArMCAgJFIwICAgICAkQCAgICAgIAorTSAjKCAgIUQwICAgICEhJCAgIEggICAgXyAgIDMiICAgICAgMiAgICAgICAgMjAgICozICAgICAgJDAjXworTVwwICAgJVwgICJFLCAgICAgISQgX18kIDdWLUw5NiVOPTcgIDdWNU45ICE/OTZZVjo3KU87QCE/OTcxRQorTT4nMCA4NzFFPiZFVCAlXUU5JiVUODAhRT4mRVQgJV1MOjYpPz1GNVI8VkVPO0AhPzdWOVA8VzFBPEcwIAorTTdUPSwzVCkhMyVdLzFEOTMxNTE/NSQlIjMkNT8gJV0kNjRZITM0RSMgIl1VPFcoTzsmRUIrVlFJOEYsTgorTTxWXE4sMCAgICAgSS8gICAgQDAgICAgICAgIEkwICAgIUAwICAgICAgICBJMSAgICJAMCAgICAgICAgSQorTTIgICAiIDAgICAgICAgICAgKiAgICAhICAgQCBIICAgICogICAgIDdfUkRZWyFcICAhPz4qMzUgIC9AIAorTSVfXEkvPlA/ICAjRCcwICAwICNYICZPX19fO09PMCAgWyFcICAuUD4gICEgIC9AICVfXEkwPl5dICAjRAorTScwICxbIVggICZPX19eXDdfUkUlWyFcICAuMD0gIUEgIC9AIDpfX19aLl5dICAjTCdQICBbIVggICQgIAorTV4gIDdfUkUpW1tUICAuMD0gIjNMJ0AgIDpfX19YOiAgICAjKCAgIDQnJCAgIDgxIl9fIkAwUCAgJyQgIAorTSE+UDAgICM0MEAgLzZAICAgTjgwJE0iQCAgICA7X19fWC4/Pyo0U0wnQCAgO19fX1ZVT0AgICtMJCAgIAorTUgpICAgLjgwJjAhT19fXzhIICAgICZfX19cPkAgICAgO19fX1ZaODIgICg0PCAgMUFFKCAmKCkyJiAgPworTVk5JElbIVwgICZQICApSiQ8MCA0O19fX1VaICAgICJAJCAgIEggICAgJD9AXiAiJCdQICFIXCQgICogXworTSAgIkAgICAgMCAjWCAqICAgICJAICAgIEggICAgLEAgICBQPDAhQCFBJCtfXCogMCAgIiQwUCAgJSYsIAorTSA4MV8gISJHWEAgIDAgICggKiAgICAjKCAgICwnJCA4IDgxIl9fIkAkICAgQSQsICAhMUMgICYkP1AgMAorTUleKCAgJCAgIiAiQCAgICBSICAgIyFRICYgJiQwT19QSCEgICAoMSMgICA0OFAgIUEnXCAkKj9CICAhIAorTSAgQCBIICAgICxAICAgUDwwIUAhQSQrX1wqIDAgICIkMFAgICUmLCAgODFfICEiR1hAICAwICAoICogIAorTSAgIyggICAsJyQgOCA4MSJfXyJAJCAgIEEkLCAgITFDICAmJD9QIDBJXiggICQgICIgIkAgICAgUiAgIAorTSMhUSAmICYkME9fUEghICAgKDEjICAgNDhQICFBJ1wgJCo/QiAgISAgIEAgSCAgICAsQCAgIFA8MCFAIQorTUEkK19cKiAwICAiJDBQICAlJiwgIDgxXyAhIkdYQCAgMCAgKCAqICAgICMoICAgLCckIDggODEiX18iQAorTSQgICBBJCwgICExQyAgJiQ/UCAwSV4oICAkICAiICJAICAgIFIgICAjIVEgJiAmJDBPX1BIISAgICgxIworTSAgIDQ4UCAhQSdcICQqP0IgICEgICBAIEggICAgLEAgICBQPDAhQCFBJCtfXCogMCAgIiQwUCAgJSYsIAorTSA4MV8gISJHWEAgIDAgICggKiAgICAjKCAgICwnJCA4IDgxIl9fIkAkICAgQSQsICAhMUMgICYkP1AgMAorTUleKCAgJCAgIiAiQCAgICBSICAgIyFRICYgJiQwT19QSCEgICAoMSMgICA0OFAgIUEnXCAkKj9CICAhIAorTSAgQCBIICAgICxAICAgUDwwIUAhQSQrX1wkQCggPEYkMFAgICUmLCAgODFfICEiR1hAICAwICAoICogIAorTSAgIyggICAsJyQgOCA4MSJfXyEoIiAnKUEkLCAgITFDICAmJD9QIDBJXiggICQgICIgIkAgICAgUiAgIAorTSMhUSAmICYkME9fUFshXCAgKDEjICAiNCcgICEjXjQiUyBfRVhEM0wnUCAgWyFcICApMDwgICo0JyAgIworTSNeN0IiQV9FWENTTCdQICBbIVwgICkwPCAgMjQnICAlJ143QishX0VYPTNMJ1AgIFshXCAgKTA8ICA6NAorTScgICcnXjdBWDFfRVg8N0wnUCAgWyFcICApMDwgIEI0JyAgKSdeN0FQMV9FWENHTCdQICBbIVwgICkwPAorTSAgSjQnICArJ143QVMxX0VYREdMJ1AgIClfIDkoTlA/ICAgT1wiSC5bIVwgICI/UCYxQ0wnUCAgK18gSQorTVYuUD8gICAnXyJLLFshXCAgIF9FWEpDTCdQICAhX1BKMS5QPyAgIC9ZPigoWyFcICAgP1wqQEtMJ1AgIAorTSNeN0FSLlA/ICAgN18iSFxbIVwgICFfRVhEU0wnUCAgJV9QSisuUD8gICA/WT4oOFshXCAgIT9cKj0zTAorTSdQICAnXjdCNC5QPyAgIDdfIkdBWyFcICAhX0VYPldMJ1AgICVfUElRPlA/ICAgP1k+KT1bIVwgICE/XAorTSo8J0wnUCAgJ143Qig+UD8gICA3XyJIWVshXCAgIV9FWEw3TCdQICAlX1BJUz5QPyAgID9ZPigxWyFcIAorTSAhP1wqREdMJ1AgICdeN0IsPlA/ICAgR1wiSC5bIVwgICJfUCpLO0wnUCAgKV8gSVYuUD8gICBPXCJHWAorTVshXCAgLj9cKkxTTCdQICAnXjdCNT5QPyAgI0dfIkkkWyFcICAhX0VYTCdMJ1AgIFlfUEoiTlA/ICAgPworTVk+KTlbIVwgIC4/XCpDU0wnUCAgJ143Qk8+UD8gICNHXyJITFshXCAgIV9FWEZXTCdQICBZX1BJVS5QPworTSAgID9ZPicxWyFcICAuP1wqPiNMJ1AgICdeN0InPlA/ICAjR18iRyRbIVwgICFfRVhGN0wnUCAgWV9QSQorTVAuUD8gICA/WT4oSVshXCAgLj9cKkNDTCdQICAnXjdCMD5QPyAgI0dfIkcsWyFcICAhX0VYSydMJ1AgIAorTVlfUEoyLlA/ICAgP1k+J0lbIVwgIC4/XCpAU0wnUCAgJ143Qks+UD8gICNHXyJHOFshXCAgIV9FWEcnTAorTSdQICBbIVwgICkwPCAgKjQnICAiJ143QV0xX0VYPjdMJ1AgIFshXCAgKTA8ICAmNCcgICEnXjdDOjFfRQorTVhNJ0wnUCAgJV9QSjo+UD8gICA/WT4rOVshXCAgIT9cKldDTCdQICAnXjdDPC5QPyAgIDQ4UCAhQSdcIAorTSQqP0IgICEgICBAIEggICAgJCAgIiAiQCAgICBIICAgICAgICAgICAgICAgMCZEICAgICAgICEiUiAgIAorTSAgICAgICAgICAgICAgICAgICBJMyAgICAgICAgICAgICAgMlcgICAkT0AgICEsNCAgIDMsICAgICAkIAorTSAgIUggICAgIyAgICRLICAgICAtICAgOSAgICAgIDAgICEjSCAgICAhMCAgJEAgICAgICYgICAxLCAgIAorTSAgSCAgICFbICAgICJQICAgISAgICAgNSAgICAgICAgICAsICAiRFAgICAgIEAgICAjICAgICA0ICAgIAorTSFQICAgITwgICEpXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQgICAgIAorTSAgICAgIDAgX18kICAgICAgICAwVSAgICAgICMgICAhICAgICAgICAkLkAgICAgICBQICAgQCAgICAgIAorTSAhJFAgICAgICAsICAgLCAgICAgICAgMiAgICAgICAjICAgJCAgICAgICAgJEdQICAgICAgUCAgITAgIAorTSAgICAgISpQICAgICAgLCAgIDggICAgICAgIDJQICAgICAgIyAgICcgICAgICAgICRUICAgICAgIFAgIAorTSIgICAgICAgICFEICAgICAgICwgICBEICAgICAgICA5JCAgICAgICMgICAqICAgICAgICAqMjAgICAgIAorTSBQICAiUCAgICAgICAiRFAgICAgICAsICAgUCAgICAgICAgSTMgICAgICAjICAgLSAgICAgICAgKjwgIAorTSAgICAgUCAgI0AgICAgICAgICAgICAgICAgLCAgIFwgICAgICAgICAgICAgICAgIyAgIDAgICAgICAgIAorTSAgICAgICAgIFAgICQwICAgICAgICAgICAgICAgICwgICEoICAgICAgICAgICAgICAgICMgICAzICAgIAorTSAgICAgICAgICAgICBQICAlICAgICA8ICAgICAgICAgICAwIF9fJCAgICAuICAgICAgICAgICAkIC9fUQorTSAgICAlMCAgICAgICAgICAhICNfXDAgICAiJCAgICAgICAgICAgMCBfXyQgICAgSSAgICAgICAgICAgJAorTSAvX1EgICAgLFAgICAgICAgICAgISAjX1wwICAgI0ggICJHICAgICAhISQgICBYICAgISkgICBJUSAgIAorTSAgMDEgICAuICAgIDVAICAkX0AgICAgQCRAICAiICAgICYoICAhRCAgICAgICEoICAgRCAgICFIICAgSQorTVIgICAgICgxICAgLiAgICA/QCAgJUJAICAgKzgkQCAgIiAgICAoLCAgIkcsICAgICEhJCAgIFggICAiMQorTSAgIElUICAgICAwMSAgIC4gICAgSkAgICRYICAgICEsJEAgICAgICAgKywgICJOICAgICAgISQgX18kIAorTSAgIlggICBJVSAgICAgKDEgICAuICAgIFIwICAlLCAgICAgQCRAICAiICAgIC1cICAiRzggICAgIiEkIAorTSAgWCAgICNIICAgSVggICAgIDAxICAgLiAgICBbQCAgJFRAICAgICAkQCAgIiAgICAvNCAgIkdEICAgIAorTSEhJCAgIFggICAkICAgIEkqICAgICAwMSAgICsgICAhIjAgICo+QCAgICAkJDAgICNAICAgMiQgICJHTAorTSAgICAiISQgICBYICAgJE0gICBJXSAgICAgMDEgICAuICAgIS0wICAlIiAgICAgQCRAICAiICAgIDRAIAorTSAiR1ggICAgJCEkICAgWCAgICU3ICAgOSkgICAgICAxIC9fUSAgICE3QCAgKkBAICAgICIkMCAgI0AgIAorTSA3KCAgIkgqICAgICAxJCAgIFggICAmIiAgIEojICAgICAwMSAgIC4gICAhQkAgICpBICAgICAoJDAgIAorTSNAICAgOVggICEzMCAgICBGISggICAgICAgJkUgICBJKiAgICAgMEEgICArICAgIUswICAlNiAgICAgQAorTSRAICAiICAgIDtEICAiSDggICAgISEkICAgWCAgICcuICAgNUwgICAgIiAyICAgKCAgICFYUCAgKkFQIAorTSAgICQkMCAgI0AgICA/JCAgIkZcICAgICAhJCBfXyQgICAnWCAgIDQ8ICAgICIgMiAgICggICAiITAgIAorTSpCICAgICAoJDAgICNAICAgQUggICJISCAgICAhISQgICBYICAgKFEgICA0WiAgICAiIDIgICAoICAgIgorTS8gICAqQlAgICAgIiQwICAjQCAgIERMICAhNzggICAgKCEoICAgQCAgICk4ICAgNzwgICAgICAyICAgIAorTSAgICI3MCAgKkMgICAgICgkMCAgI0AgICBHLCAgIkhYICAgICEhJCAgIFggICApWiAgIEovICAgICAoMQorTSAgIC4gICAiQEAgICpEICAgICAkJDAgICNAICAgSSQgICJJJCAgICAgMSQgICBYICAgKj8gICBKMiAgIAorTSAgMDEgICAuICAgIktQICAqRFAgICAgJCQwICAjQCAgIEtUICAiSTAgICAgISEkICAgWCAgICs0ICAgOQorTSQgICAgIDAxICAgKiAgICJYMCAgJF1AICAgICAkQCAgIiAgICBORCAgIkk0ICAgICEhJCAgIFggICArWAorTSAgIEo2ICAgICAwMSAgIC4gICAjJCAgICpFUCAgICAoJDAgICNAICAgUiwgICE4QCAgICAgISggICAgIAorTSAgLE0gICBKOSAgICAgMDEgICAuICAgIzBAICAqRkAgICAgJCQwICAjQCAgIFREICAiRFAgICAgICEkIAorTV9fJCAgIC0/ICAgSjsgICAgIDAxICAgLiAgICM9QCAgKkcgICAgICQkMCAgI0AgICBYPCAgIkREICAgIAorTSEhJCAgIEwgICAuOSAgIEo+ICAgICFAMSAgIC4gICAjSFAgICpJICAgICA4JDAgICNAICAgWlQgICJKSAorTSAgICAgQSQgICBYICAgLlogICBKSyAgICAgMDEgICAuICAgI1JAICAqSyAgICAgJCQwICAjQCAgIF4gIAorTSAhOCAgICAgKCEoICAgQCAgIC9OICAgNSQgICAgIiAyICAgKCAgICQgICAgKjRQICAgICAkMCNfXDAgIAorTSEgRCAgIkpUICAgICIhJCAgIFggICAwNyAgIEpPICAgICAwMSAgIC4gICAkKVAgICU4QCAgICBAJEAgIAorTSIgICAhI0ggICJLICAgICAhISQgICBYICAgMTAgICBKUSAgICAgQDEgICAuICAgJDcwICAkSyAgICAgIAorTSRAICAhQCAgISYsICAiSywgICAgIDEkICAgWCAgIDFKICAgSlQgICAgIDAxICAgLiAgICQ8QCAgJSRAIAorTSAgIEAkQCAgIiAgICEoPCAgIks4ICAgIEQhJCAgIFggICAyLiAgIEs6ICAgICAwMSAgIC4gICAkRiAgIAorTSUpQCAgICBAJEAgICIgICAhKlAgICJNUCAgICAiISQgICBYICAgMlUgICBLPiAgICAgQDEgICAuICAgJAorTU8wICAlM0AgICAgQCRAICAiICFHOSYpTTkwIUM8RzBRK0csIDhXKVQ6MllTICc5QTsnNUU8UlU4PSJZQworTSAmPUQ4RlVFK0YsIDxWQT85JiVUODJZQyAmLVI9JlhOPFAhVjdXNU48VkVHO0Y1RDdWRU49ICFWN1ctSQorTTlWWUU5JV1JO0cwID1FXUM6JiVSN1Y5VTtGLCA3VjlJO0ZEID1FXVU7Ry1JOVZZRTklXUM6JiVSN1YlUgorTTxGJVkgJlVBOjZYID1FXVM6Nj1OOTYxPzsmXU45UCFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVAorTTk3KCA3Vi1MOTYlTj03ICA3VjVOOSAhVjdXNU48VkVHO0Y1RDdXLUg7VylUICc5Pz02WVM6Nj1OOTYxPworTTxWQU88RzE/OUc1TjhQIVY3VjFPPTYpTDkwIVY3VkVOPSAhPzxXMUE8RzAgO0ZdTjwnKUk7NiVSPjAhPworTTk2WVY6NylPO0AhVjdXNU48VkVHO0Y1RDdWUU87Rj0/PCZdSTtHMUU8QCFWN1ZFTj0lXUE8RylBPjAhUAorTTxGRU04NylZICc5PzxWRUc7RjVEN1YtSDg3KT85RzVOOFAhVjdWMU89NilMOTVdQTxHKUE+MCE/OTcxRQorTT4nMCA9RV1TOjY9Tjk2MT84VkFBPEVdQTxHKUE+MCFWN1c1TjxWRUc7RjVEN1YtSDg3KCA9RV1GOyZdQQorTT0gIVY3Vy1JOVZZRTklXUw7VllHN1YlUjxGJVkgJiVUOTdBST0gIUU7RzlJPEZdTiAnOT87Jl1OOVVdRgorTT02WUMgJzk/PFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1GPTZZQworTSAnOT86NllUN1chTzo2WVQ5NyggN1Y1RDg3MUEgJzk/PFZBTzxHMT85RzVOOFAhVjdXNU48VkVHO0Y1RAorTTdWRU49JV1BPEcpQT4wIVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICc5Pzo2WVQ3VjlVO0YsIAorTT1FXVM6Nj1OOTYxPzxWQU88RzAgPUVdRjsmXUE9JV1GPTZZQyAmNVg6NzAgPUVdVTtHLUk5VllFOSVdTAorTTtWWUc3ViVSPEYlWSAnOT87Jl1OOVAhVjdXLUg7VylUICc5PzsmXU45VV1QO1ZFTj0mNVIgJzk/PFZFRworTTtGNUQ3Vi1IODcoID1FXVU7Ry1JOVZZRTklXUw7VllHICc5PzxWQU88RzE/ODcpUjg3RCA9RV1VO0ctSQorTTlWWUU5JV1TOiZdUj0lXUE8RylBPjAhPzsmRUI3VzlFPEctSTtWWCA3VlVDO1c1Tj0gIVY3Vi1IODcpPworTTwmXUk7RzFFPEAhVjdXNU48VkVHO0Y1RDdWLUg4Nyk/PCZdSTtHMUU8QCFWN1ctSTlWWUU5JV1JO0cxPworTTg3KVI4N0QgN1VdRjwnLVQ4NylUICc5PzxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAnLT87JkVOOlAhPworTTFUUS8wRCUsN1RdJjFFLSU1JV00MDQpLDE1XCA9RV1TOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPEAhVgorTTdWMU89NilMOTVdUDtWRU49JjVSICVdPzsmXU45VjFPPTYpTDk1XVU8VjVEICc5PzxXMVI9Ni1ULDAhVgorTTdXLVQ8RzVDPSMoID1FXUM6JiVSN1YlUjxGJVkgJzk/OUZRTzg3MT88Jl1JO0cxRTxAIVY3Vy1JOVZZRQorTTklXUw7VllHN1chTzo2WVQ5NyggPUVdRDtXNUI7JjU/OUc1TjhQIVY3Vy1JOVZZRTklXUk7RzE/OUc1TgorTThQIT8xJUUuMDRVKTBQIVY3VjlMO1YlVDdWJVI8RiVZICc5PzxWQU88RzE/PCZdSTtHMUU8QCFWN1ctSQorTTlWWUU5JV1MO1ZZRzdWOVU7RiwgPUVdUzo2PU45NjE/OFZBQTxFXVA7VkVOPSY1UiAnOT87Jl1OOVVdQQorTTxHKUE+MCE/OjZZST0gIVY3Vi1IODcoIDhWUVU7Rk1FPEAhVjdXNU48VkVHO0Y1RDdWLUg4Nyk/OUc1TgorTThQIVU3VlFJO0ZMIDxXIU88RzFTOFYlUiAnOT88VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCA9RV1VO0ZFTworTTtDKCA9RV1VO0ZFTztAIVY3VzVOPFZFRztGNUQ3VkVOPSVdRj02WUMgICBOOjZZVDk3KVAgIllIODctSAorTSAiWUQ+NllTPjZUICtGMVk7Ry1UPEAgTjxGNUw4MllQOycwICtGRU46NzAgK0chTD0gIE49JjVYPSAgTgorTTlGRU46MCBOPEZdRDg3MUEgIllEODcxQSAiWUc7VzAgK0YxWTtGJU06NiwgK0YpUzxQIE48V0VNPSYlQgorTSAiWVM9JylUODYoICtHLUg8VzFSPSYlQiAiWUM7VlVNOTZZVCAiWUQ5NilVOVAgTjsmRU45MCBEMiY1QQorTTkmNVIuQiBPPCJdMjBVLE89NzFJOyMoTSxCWFErVzVTPEJdUzxGLE87JkVCK1ZRSThGLE86M0BWLCJdQworTTxXNE84VylULDJZUysnOEAsQlhRKCNEUitTIFUrUyRUKCMgVy5DJFYuQyhQKCYxQT1GRUQ7VjlGKCQ1WAorTTwiIEQgJCBIKFJFJjUlQEAsQlhRK0MgTiwyIVM4VjFFLkJdVTxXKE84Vi1TK1ZRSThCXUM8RzBRK0ZcIAorTSkkQUU4NjFFPENIQCtXIE80RC0zK1c1VDo2UFIrMyhOLDJdVTxXKE88VylDK1ZRSThCXUw6NilDK1ZEWAorTS1DIE84Vy1VK1YtUj0mRE48UlFWKCMoTiwyIFksQlxQLTJcUS0iIFAtU0hRLUNIUiwyIUQ4NzlJOSZdRgorTTlCISU+JyBAKSAhICoiLEkxRTE4KCMoTiwyWFArQyRAPFYtRDkzSE89Ny1SK1YtQzxSXUw6NihPOFcpVAorTToyWU8gIjEoOTYlRDk3KFooIl1QK1UpIzRSXVU9JkVMLEJUUitDJE89Ny1SK1ctUjhSXUw6NihPOyZFQgorTThSXVA7VylUK1Y9RTtCXVY4NlFVOTcsTTYnME44UlFWKCMoTiwyIFksQlxQLTJcUS0iIFAtU0hSLVNIUAorTSxCIUQ4NzlJOSZdRjlCISU+JyBAKSAgRDImNUE5JjVSLkIgTzwiXTIwVSxPPTcxSTsjKE0sQlhRK1c1UworTTxCXVM8RixPOyZFQitWUUk4RixPOjZZQytXLVk7Rl1OPjZVUytGQEw9QiBSK0MkQC4zKE8sIzRPLDMwQAorTSwjPFosQyhaLDNEQDkmJVY6NjFPOUY4QDE3QVAoIjAgKSRBRTg2MUU8Q0hAK1cgTzRELTMrVzVUOjZQUgorTSszKE4sMl1VPFcoTzxXKUMrVkFFODYwTzs2JVQ6IllIKyc4QCxCWFEoI0RSK1MgVStTJFQoIyBXLkMkUgorTS5DNFcoJjFBPUZFRDtWOUYoJDVYPCIgRCAmJUM7VlVQLkIgSDRULSQxMkRALTJYUCgjJFIrUyBYK1NAWQorTSAmJVMuQiBINFQtJDEyREAtMlhQKCMkUitTIFgrU0BZICQgSChSRSY1JUBALEJYUStDIE4sMiFTOFYxRQorTS5CXVU8VyhPOFYtUytWUUk4Ql1WODZRVTk3LE02JzBOO1AhQThWXU08I0hAKiUtIzEkNEkoIzROLCIgUQorTSxCXFAuIlxYLjAhQTxTSEAqJS0jMSQ0SSgjNE4sIiBRLEJcUC4iXFguMCBEMiY1QTkmNVIuQiBPPCJdMgorTTBVLE89NzFJOyMoTSxCWFErVzVTPEJdUzxGLE87JkVCK1ZRSThGLE86M0BWLCJdRzk2WE88VkE/OSYlVAorTTgyWUMrJzhALEJYUSgjRFIrUyBVK1MkVCgjIFcuQyRXLkM0VCgmMUE9RkVEO1Y5RigkNVg8IiBEICYlQworTTtWVVAuQiBINFQtJDEyREAtMlhQKCMkUitTIFgrU0BZICYlUy5CIEg0VC0kMTJEQC0yWFAoIyRSK1MgWAorTStTQFkgJCBIKFJFJjUlQEAsQlhRK0MgTiwyIVM4VjFFLkJdVTxXKE84Vi1TK1ZRSThCXUw6NilDK0ctTworTSAiMSg5NiVEOTcoWigiXVArVSkjNFJdVT0mRUwsQlRSK0MkTz03LVIrVy1SOFJdTDo2KE87JkVCOFJdSQorTS4jOFArVi1TPTJdQzxHMU4rRyxMPUIgUitDJEAuMyhPLCM0TywzMEAsIzxaLDM4WixDKEA5JiVWOjYxTworTTlGOEAxN0FQKCIwIDAiQEMqNDk0NiIgUitDJE4sIlhRKCctQzkmNForVzVTPEJdQzhXLE87JkVCK1YtUgorTT0mWE47UCBAOyYwQC5CIEg0VC0kMTJEQC0yWFAoIyRSK1MgWCtTQFkgICAgICJYICQwIDIgICA2PCAgWAorTTlWMUI7NjROOFAgIS1AICAgICQhJDAgICRfICEoMCAgJjAgISFAICAgICAgICAgPSAhLCAkQCAgIDRYIAorTS4nMT88VzFSPTYtVCAgIlYgICAgJiAgICAiSCAjMCAyICAgID0wIFg9RV1DOiYlUjdWVUU7NilFPEAgIAorTTUwICEgIiwgIUAwICAgICAhUCAgICJMICMwIDIgICAgSCAgWD1FXVM6Jl1SPSVdTTk2VUI5NyggICU0IAorTSEgIEMgIDgkICAgICBAPCAgICBJICBUICRAICAgLEQgLic5Pzo2WVQ3VlVFOzYpRTxAICA1MCAnICIsIAorTSFAMCAgICAkIVAgICAiSCAjMCAyICAgIFxQIFg9RV1MO1ZZRzdWVUU7NilFPEAgIDUwICogIiwgIUAwIAorTSAgICghUCAgICJMICMwIDIgICAhJ0AgWD1FXUY7Jl1BPSVdTTk2VUI5NyggICU0ICNAIEMgIDgkICAgIAorTSMgPCAgICBMICBUICRAICAgNEggLic5PzkmXVU4RlFFN1ZVRTs2KUU8QCAgNTAgLyAiLCAhQDAgICAgMAorTSFQICAgIDAgICAgOyAhLCAkQCAgIEZQIC4iWFA5RiVLOTAgIE1AICAgIUAgICAgSiAgVCAkQCAgIDksIAorTS4nOT84VkFBPEVdTTk2VUI5NyggICU0ICAwIEMgIDgkICAgICAgPCAgICBLICBUICRAICAgO1ggLic5PworTTxWQU88RzE/OzY1TThGNVIgICE1ICAwIChQICYhICAgICAoJyAgICAqMCAtICEoICAgJ0cgI0FWN1ZFTgorTT0lXU05NlVCOTcoICAlNCAhUCBDICA4JCAgICAhIDwgICAgSiAgVCAkQCAgIEEkIC4nOT87Jl1OOVVdTQorTTk2VUI5NyggICU0ICJAIEMgIDgkICAgICIgPCAgICBLICBUICRAICAgQ1AgLic5PzlGUU84NzE/OzY1TQorTThGNVIgICE1ICBYIChQICYhICAgICBQJyAgICArICAtICEoICAgKUggI0FWN1YxTz02KUw5NV1NOTZVQgorTTk3KCAgJTQgI1AgQyAgOCQgICAgJCA8ICAgICQgICAgJyAgNyAhKCAgIC4rICNBVDdXNU46Nl1OICAiVgorTSAgICAiICAgICJIICMwIDIgICAiTEAgWD1FXUM6JiVSN1ZVRTs2KUU8QCAgNTAgISAiLCAhQDAgICAgIAorTSFQICAgIkwgIzAgMiAgICJXMCBYPUVdUzomXVI9JV1NOTZVQjk3KCAgJTQgISAgQyAgOCQgICAgICA8IAorTSAgIEkgIFQgJEAgICBQOCAuJzk/OjZZVDdWVUU7NilFPEAgIDUwICcgIiwgIUAwICAgICAhUCAgICJIIAorTSMwIDIgICAjLCAgWD1FXUw7VllHN1ZVRTs2KUU8QCAgNTAgKiAiLCAhQDAgICAgICFQICAgIkwgIzAgMgorTSAgICM2UCBYPUVdRjsmXUE9JV1NOTZVQjk3KCAgJTQgI0AgQyAgOCQgICAgICA8ICAgIEwgIFQgJEAgIAorTSBYPCAuJzk/OSZdVThGUUU3VlVFOzYpRTxAICA1MCAvICIsICFAMCAgICAgIVAgICAgMCAgICA7ICE8IAorTSRAICAhKkQgLiJYUTlGJUs5MCAgTUAgICAgQCAgICBKICBUICRAICAgXSAgLic5PzhWQUE8RV1NOTZVQgorTTk3KCAgJTQgIDAgQyAgOCQgICAgICA8ICAgIEsgIFQgJEAgICBfTCAuJzk/PFZBTzxHMT87NjVNOEY1UgorTSAgITUgIDAgKFAgJiEgICAgICAnICAgICowIC0gISggICAwRCAjQVY3VkVOPSVdTTk2VUI5NyggICU0IAorTSFQIEMgIDgkICAgICAgPCAgICBKICBUICRAICAhJFggLic5PzsmXU45VV1NOTZVQjk3KCAgJTQgIkAgQworTSAgOCQgICAgICA8ICAgIEsgIFQgJEAgICEnRCAuJzk/OUZRTzg3MT87NjVNOEY1UiAgITUgIFggKFAgJgorTSEgICAgICAnICAgICsgIC0gISggICAyRSAjQVY3VjFPPTYpTDk1XU05NlVCOTcoICAlNCAjUCBDICA4JAorTSAgICAgIDwgICAgJCAgICAqQCAmICEoICAgMzcgI0FWN1YtSDg3KT85RzVOOFAgIDUwICEgMSQgICEvWAorTSAyJCAgITA4ICAgICEgICAgIyQgIUAgMiAgICUjICBYPUVdUzo2PU45NjE/OFZBQTxFXUY9NllDICAhNQorTSAgKCEkMCAgJSIgISgwICAlJCAgICAgJCAgICAsUCAmICEoICAgNSMgI0FWN1c1TjxWRUc7RjVEN1YtSAorTTg3KT85RzVOOFAgIDUwICMgMSQgICExKCAyJCAgITFIICAgICEgICAgIkwgIUAgMiAgICU8QCBYPUVdUworTTomXVI9JV1GPTZZQyAgITUgIDAhJDAgICUnICEoMCAgJSkgICAgICQgICAgLEAgJiAhKCAgIDZIICNBVgorTTdXLUk5VllFOSVdUzomXVI9JV1GPTZZQyAgITUgIDQhJDAgICUpQCEoMCAgJStAICAgICQgICAgLSAgJgorTSAhKCAgIDdAICNBVjdXNU48VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCAgJTQgIUAkMSAgIDRQICRBICAgNAorTVggICAgIDAgICAgSSAgOCAkQCAgIUBUIC4nOT86NllUN1Y5VTtGLCAgJTQgIVAkMSAgIDRaICRBICAgNQorTSIgICAgIDAgICAgUCAgOCAkQCAgIUQkIC4nOT88VkVHO0Y1RDdWRU49JV1GPTZZQyAgITUgIEAhJDAgIAorTSUxICEoMCAgJTMgICAgICQgICAgLEAgJiAhKCAgIDlXICNBVjdXNU48VkVHO0Y1RDdWRU49JV1GPTZZQworTSAgITUgIEQhJDAgICUzQCEoMCAgJTVAICAgICQgICAgKkAgJiAhKCAgIDpFICNBVjdWUU87Rj0/OUc1TgorTThQICA1MCAqIDEkICAhNUAgMiQgICE2ICAgICAhICAgICMkICFAIDIgICAmVkAgWD1FXVM6Nj1OOTYxPworTTsmXU45VV1GPTZZQyAgITUgIEwhJDAgICU4QCEoMCAgJTpAICAgICQgICAgLFAgJiAhKCAgIDwxICNBVgorTTdXNU48VkVHO0Y1RDdWUU87Rj0/OUc1TjhQICA1MCAsIDEkICAhNlAgMiQgICE3MCAgICAhICAgICJMIAorTSFAIDIgICAnMCAgWD1FXUY7Jl1BPSVdRj02WUMgICE1ICBYISQwICAlPUAhKDAgICU/QCAgICAkICAgIAorTSsgICYgISggICA9UCAjQVY3VjFPPTYpTDk1XUY9NllDICAhNSAgXCEkMCAgJUAgISgwICAlQiAgICAgJAorTSAgICAlMCA1ICEoICAgPk4gKCwgITAkICAgP0ogICAgJTAgJSAhKCAgID46ICgsICEwJCAgID9KICAgIAorTSQgICUgISggICA+SiAlNCAhUCAgICAwICAgIFwgICQgJEAgICFeSCBFMCAgICosICogICAiICAgICAgIAorTSAgICAgICAoICAgICAgICAgICQgICBAICAgICAgICAgIEBAIDxAICAgIlggICAgOSAhLCAkQCAgIidMIAorTS4mUUk7RkwgICs4ICAgIjggICAgKUAgLSAhKCAgIEBJICNBTjk3QVQgICIjICA0ISAgICdaQCBDICA4JAorTSAgICAgIDwgICAgSiAgVCAkQCAgIiUsIC4mUUk7Rk1GPTZZQyAgIiMgIDQhICAgJzwgIEMgIDgkICAgIAorTSEgPCAgICBEICBUICRAICAiJzwgLictVD02OUYgICFSICAgJ0tAIEMgIDgkICAgICIgPCAgICAkICAgIAorTSUwIDUgISggICBCWSAoLCAhMCQgICA/SiAgICAlMCAlICEoICAgQkUgKCwgITAkICAgP0ogICAgJCAgJQorTSAhKCAgIEJVICU0ICFQICAgIDAgICAgXCAgJCAkQCAgIi80IEUwICAgKiwgKiAgICIgICAgICAgICAgIAorTSAgICggICAgICAgICAgJCAgIEAgICAgICAgICAgQEAgPEAgICAiWCAgICA8ICE8ICRAICAiOEQgLicxVQorTTdWUUk7RkwgICs4ICAgIjAgICAgKUAgLSAhKCAgIERXICNBTjk3QVQgICIjICA0ISAgICdaQCBDICA4JAorTSAgICAgIDwgICAgSiAgVCAkQCAgIjYkIC4mUUk7Rk1GPTZZQyAgIiMgIDQhICAgKD5QIEMgIDgkICAgIAorTSAgPCAgICBEICBUICRAICAiODQgLictVD02OUYgICFSICAgKE4wIEMgIDgkICAgICAgPCAgICAkICAgIAorTS5AICQgISggICBHJyAjQE4sRjlBOlY0ICArOCAgICAkIC8sICZQICAgIClCOyc1RSAgICAgICVHPEY1RQorTTtAICAgICAgPEY1RCAgICAgIDAgICAgXiAgMCAkQCAgIkBEIC4mLU87Jl1SPFAgIE1AICAgIDAgXFAgPworTSAgICAgRyFJO0ZMICAgICAgNyFVPEchTDkwICAgICAgPjY1TDsmXVcgICAgICAwICAgIFIgIDAgJEAgIAorTSJDXCAuIlhTOUYlSzkwICBNQCAgICAwIFxQIDMgICAgIDY5TzxGMCAgICAgICYtSDk3OVkgICAgICAwIAorTSAgIFEgIDAgJEAgICJHMCAuJi1BPEcsICArOCAgICAkIC8sICUgICAgICVQO1cpUzhWQUUgICAgICAhQgorTTs3PCAgICAgISAgICAjKCAhICAyICAgKkpAIFgrQzFGODZNRSAgIlYgICAgISAjUyAhLCAgICAhNSUpNQorTTEwICAgICAgMUQlLDRUNCAgICAgISAgICAhUCAlQCAyICAgKlFAIFg4Rl1POyY1QTtAICA8QCAgIkcwIAorTSAgIFEgIDAgJEAgICJPTCAuJilWODZRUyAgIlYgICAgISAjUyAhLCAgICAhPScpVTkwICAgICAgOUYlTAorTTxWNCAgICAgISAgICAhVCAlQCAyICAgKyYgIFg4Rl1POyY1QTtDKCAgJyggICBLJiAgICAxQCAkICEoIAorTSAgTUIgI0FNOjctTzxGMUU8RjVEICAiViAgICAhICNTICIsICAgICM9JkFSOTY0ICAgICAgJ0lFPEZcIAorTSAgICAgNl1OOTAgICAgICI9Jz1PICAgICAgMCAgICBDICA4ICRAICAiWEQgLiZVQTo2WCAgJTQgIVAkMQorTSAgIDYqICRBICAgOSAgICAgIDAgICAgRyAgPCAkQCAgIlsgIC4nLVA7VylUPFYtQTxAICA8QCAgIkNcIAorTShQICUgUCAgKlZAICAgIEUgIDwgJEAgICJdNCAuJi1MPTZZSzk3KCAgJyggICBIKSAiLCAhMCwgICJLMAorTSAgICAqICAnICEoICAgT10gI0FOO1ZZUDxGRU04NylZICAhUiAgIClRUCBDICA0IyAgIElZICAgICI0IAorTSFQIDIgICAsKEAgWDwnKUk7NiVSPjAgIDxAICAiOEQgKFAgJSBQICAqPzAgICAgRCAgPCAkQCAgIyQ4IAorTS4nNT87JkVOOlAgIDxAICAiLzQgKFAgJSBQICAqTUAgICAgRyAgPCAkQCAgIyZUIC4nLT87JkVOOlAgIAorTUBQICUgMCAgIV5IIChQICUgUCAgKkZAICAgIEYgIDwgJEAgICMpLCAuJzk/PTZZSTtWWFIgICFSICAgIworTUJQIEMgIDQjICAgSzwgICAgIjQgIVAgMiAgICxOICBYPUVdVTtGRU87QCAgPEAgICBGUCAoUCAlIFAgIAorTSpXQCAgICBHICA8ICRAICAjLVwgLic5PzxXMVI9Ni1ULEAgIDxAICAgNFggKFAgJSBQICAqSSAgICAgRworTSAgPCAkQCAgIzA4IC4nOT88VzFSPTYtVCwwICA8QCAgICJYIChQICUgUCAgKkdAICAgIE8gIDwgJEAgIAorTSMzNCAuJzk/OSZdVThGUUU3VyFPOjZZVDk3KCAgJiwgIFAkICNQIEMgIDQjICAgSjwgICAgIlggIVAgMgorTSAgIC04UCBYPUVdRjsmXUE9JV1QO1ZFTj0mNVIgICFDICAsISAgWCAoUCAlIFAgICpKUCAgICBWICA8IAorTSRAICAjOUQgLic5Pz02WVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIgICFDICAsISAgUCAoUCAlIFAgIAorTSo+QCAgICBUICA8ICRAICAjPFQgLic5PzxWRUc7RjVEN1ZRTztGPT88Jl1JO0cxRTxAICA4UCAjIDAgKworTSAiLCAhMCwgICJKUCAgICArMCAnICEoICAgV1ogI0FWN1ZRTztGPT88Jl1JO0cxRTxAICA4UCAjIDAgKgorTSAiLCAhMCwgICJJICAgICAtMCAnICEoICAgWE8gI0FWN1c1TjxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UgorTSAgIUMgICwhICBEIChQICUgUCAgKkJAICAgIFMgIDwgJEAgICNGKCAuJzk/PFZFRztGNUQ3VkVOPSVdUAorTTtWRU49JjVSICAhQyAgLCEgIEAgKFAgJSBQICAqRjAgICAgTCAgPCAkQCAgI0hYIC4nOT86NllUN1chTworTTo2WVQ5NyggICYsICBQJCAhUCBDICA0IyAgIEonICAgICM8ICFQIDIgICAuUTAgWD1FXVU7Ry1JOVZZRQorTTklXVM6Jl1SPSVdUDtWRU49JjVSICAhQyAgLCEgIDggKFAgJSBQICAqPSAgICAgVSAgPCAkQCAgI09IIAorTS4nOT88VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQ5NyggICYsICBQJCAhMCBDICA0IyAgIEo7ICAgICJYIAorTSFQIDIgICAvKiAgWD1FXVM6Jl1SPSVdUDtWRU49JjVSICAhQyAgLCEgIDAgKFAgJSBQICAqS1AgICAgVgorTSAgPCAkQCAgI1VYIC4nOT89NllTOjY9Tjk2MT84VkFBPEVdUDtWRU49JjVSICAhQyAgLCEgICwgKFAgJQorTSBQICAqRUAgICAgVCAgPCAkQCAgI1koIC4nOT88VkVHO0Y1RDdWLUg4Nyk/PCZdSTtHMUU8QCAgOFAgIworTSAwICIgIiwgITAsICAiSyAgICAgKzAgJyAhKCAgIF5fICNBVjdWLUg4Nyk/PCZdSTtHMUU8QCAgOFAgIworTSAwICEgIiwgITAsICAiSTQgICAgKSAgISAhKCAgIF9DICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIAorTTUwIC8gICAgKyAgJyAhKCAgISAvICNBVjdWMU89NilMOTVdQTxHKUE+MCAgPEAgICNbXCAoUCAlIFAgIAorTSo/QCAgICBEICAkICRAICAkIywgRTAgICAqLCAkICAgIiAgICAgICAgICAhIiAhNSAgWCAgICBLICA8IAorTSRAICAkJVggLic5PzlGUU84NzE/ODcpUjg3RCAgJyggICEgLyAiLCAhMCwgICJKVCAgICApICAhICEoIAorTSAhIiIgKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgLCAgICAsUCAnICEoICAhIlUgI0FWN1c1TgorTTxWRUc7RjVEN1ZRTztGPT84NylSODdEICAnKCAgISE+ICIsICEwLCAgIkhQICAgICkgICEgISggICEjOQorTSApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCArICAgICwwICcgISggICEkKiAjQVY3Vy1JOVZZRQorTTklXUw7VllHN1YlUjxGJVkgICFSICAgME0wIEMgIDQjICAgSiQgICAgIjAgIDAgMiAgIDErQCI1ICAgIAorTUhQIDAgICAoICAgICAgICAgICQoICU0ICJAICAgIkggIVAgMiAgIDE2ICBYPUVdTDtWWUc3ViVSPEYlWQorTSAgIVIgICAxIkAgQyAgNCMgICBKUSAgICAiMCAgMCAyICAgMT8gIjUgICAgSFAgMCAgICggICAgICAgIAorTSAgJCggJTQgIjAgICAjKCAhUCAyICAgMUtAIFg9RV1VO0ctSTlWWUU5JV1JO0cxPzg3KVI4N0QgICcoIAorTSAhJTggIiwgITAsICAiSEAgICAgKSAgISAhKCAgIScyICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIAorTTUwICggICAgLCAgJyAhKCAgISgiICNBVjdXLUk5VllFOSVdSTtHMT84NylSODdEICAnKCAgISZOICIsIAorTSEwLCAgIkk8ICAgICkgICEgISggICEoRiApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCAnICAgIAorTSowICcgISggICEpLyAjQVY3VkVOPSVdQTxHKUE+MCAgPEAgICRAKCAoUCAlIFAgICo+UCAgICBEICAkIAorTSRAICAkRywgRTAgICAqLCAkICAgIiAgICAgICAgICAhIiAhNSAgOCAgICBUICA8ICRAICAkSjwgLic5PworTT02WVM6Nj1OOTYxPzxWQU88RzE/ODcpUjg3RCAgJyggICEpLyAiLCAhMCwgICJJMCAgICApICAhICEoIAorTSAhKysgKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgJSAgICAsQCAnICEoICAhK10gI0FWN1ctSQorTTlWWUU5JV1TOiZdUj0lXUE8RylBPjAgIDxAICAkSjwgKFAgJSBQICAqQUAgICAgRCAgJCAkQCAgJFIkIAorTUUwICAgKiwgJCAgICIgICAgICAgICAgISIgITUgIDAgICAgSyAgPCAkQCAgJFRQIC4nOT88VkFPPEcxPworTTg3KVI4N0QgICcoICAhK10gIiwgITAsICAiSSwgICAgKSAgISAhKCAgIS1QICk0ICAgIkMgISAgICBAIAorTSAgICAgICAgIDBAIDUwICMgICAgLFAgJyAhKCAgIS5DICNBVjdXNU48VkVHO0Y1RDdWLUg4Nyk/ODcpUgorTTg3RCAgJyggICEtLCAiLCAhMCwgICJHKCAgICApICAhICEoICAhLycgKTQgICAiQyAhICAgIEAgICAgIAorTSAgICAgMEAgNTAgIiAgICAsMCAnICEoICAhL1ggI0FWN1ctSTlWWUU5JV1DOiYlUjdWJVI8RiVZICAhUgorTSAgIDNIUCBDICA0IyAgIEoiICAgICIwICAwIDIgICA0JyAiNSAgICBIUCAwICAgKCAgICAgICAgICAkKAorTSAlNCAgMCAgICJIICFQIDIgICA0MUAgWD1FXUM6JiVSN1YlUjxGJVkgICFSICAgM14gIEMgIDQjICAgSgorTUogICAgIjAgIVAgMiAgIDQ6QCBYPUVdRDtXNUI7JjQgICU0ICNQIEMgIDQjICAgSVYgICAgIiwgIVAgMgorTSAgIDRDMCBYPUVdRjsmXUE9ICAgNTAgLiAiLCAhMCwgICJILCAgICAqUCAnICEoICAhMlggI0FWN1c1TgorTTxWRUc7RjVEN1ZRTztGPCAgJTQgIyAgQyAgNCMgICBKMiAgICAiRCAhUCAyICAgNFgwIFg9RV1TOjY9TgorTTk2MT87Jl1OOVAgIDUwICsgIiwgITAsICAiRywgICAgKEAgJyAhKCAgITQjICNBVjdWUU87RjwgICU0IAorTSJAIEMgIDQjICAgSi4gICAgIkggIVAgMiAgIDUrMCBYPUVdVTtHLUk5VllFOSVdSTtHMCAgJTQgIjAgQworTSAgNCMgICBJUCAgICAiQCAhUCAyICAgNTUwIFg9RV1TOjY9Tjk2MT86NllUICAhNSAgQCAoUCAlIFAgIAorTSo8MCAgICBBICA8ICRAICAlNzggLic5Pzo2WVQgICE1ICA8IChQICUgUCAgKj4gICAgIEwgIDwgJEAgIAorTSU6KCAuJzk/PTZZUzo2PU45NjE/PFZBTzxHMCAgJTQgIUAgQyAgNCMgICBJVSAgICAiSCAhUCAyICAgNQorTVMgIFg9RV1TOjY9Tjk2MT88VkFPPEcwICAlNCAhMCBDICA0IyAgIEorICAgICIsICFQIDIgICA1W1AgWAorTT1FXVM6Jl1SPSAgIDUwICQgIiwgITAsICAiSFwgICAgKlAgJyAhKCAgITg6ICNBVjdXNU48VkVHO0Y1RAorTTdWLUg4NyggICU0ICBQIEMgIDQjICAgSiJAICAgIkQgIVAgMiAgIDYwUCBYPUVdUzo2PU45NjE/OFZBQQorTTxAICA1MCAiICIsICEwLCAgIkkkICAgIChAICcgISggICE5RSAjQVY3Vi1IODcoICAlNCAgMCBDICA0IworTSAgIEpTICAgICAwICAgICcgICAgICAgIkRAICAkXyAgICAhWV9fXCAgICAoICAgID5PX18gICAgLCAgIAorTSAnT19fUCAgICVAICAgIV1fX1wgICAiICAgICA/T19fICAgIEogICAgJ19fX1AgICAtICAgICIhX19cIAorTSAgI1ggICAgQE9fXyAgICEoICAgICgvX19QICAgNEAgICAiJV9fXCAgICVQICAgIEFPX18gICAhRiAgIAorTSAoP19fUCAgIDwgICAgIilfX1wgICAnSCAgICBCT19fICAgIiQgICAgKytfX1AgICBDQCAgICJVX19cIAorTSAgKSQgICAgTU9fXyAgICIzICAgICs/X19QICAgRUAgICAiWV9fXCAgIClEICAgIE5PX18gICAiPCAgIAorTSArT19fUCAgIEdQICAgIl1fX1wgICAqKCAgICBPT19fICAgIkUgICAgK19fX1AgICBKICAgICMhX19cIAorTSAgKkwgICAgUE9fXyAgICJOICAgICwvX19QICAgTDAgICAjJV9fXCAgICswICAgIFFPX18gICAiWCAgIAorTSAsR19fUCAgIE8gICAgIypfX1wgICAsICAgICBSX19fICAgIyQgICAgLFdfX1AgICBSICAgICMuX19cIAorTSAgLFAgICAgU19fXyAgICMwICAgIC0nX19QICAgVSAgICAjMl9fXCAgIC1AICAgIFRfX18gICAjPCAgIAorTSAtN19fUCAgIFggICAgIzZfX1wgICAuMCAgICBVX19fICAgI0ggICAgLUdfX1AgICBbICAgICM6X19cIAorTSAgLyAgICAgVy9fXyAgICNUICAgIC1XX19QICAgXiAgICAjPl9fXCAgIC9QICAgIFgvX18gICAkICAgIAorTSAuJ19fUCAgISEgICAgI0JfX1wgICAwQCAgICBZL19fICAgJCwgICAgLjdfX1AgICEkICAgICNGX19cIAorTSAgMTAgICAgWi9fXyAgICQ4ICAgIC5HX19QICAhJyAgICAjSl9fXCAgIDIgICAgIFsvX18gICAkRCAgIAorTSAuV19fUCAgISogICAgI09fX1wgICAyUCAgICBcL19fICAgJE8gICAgLydfX1AgICEsQCAgICNSX19cIAorTSAgMzQgICAgXS9fXyAgICRYICAgIC87X19QICAhLyAgICAjV19fXCAgIDNQICAgICAvX18gICAlJCAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkIAorTSAgICEgICAgIEAgICQtMCAgICM0ICAgICRQICAgICAgICAgICAgICAgMCAgICAgICAgICkgICAgITAgIAorTSAgKCAgISNIICAgIFogICAgJEAgICAgIyAgICAgICAgICAwICAgICQgICAgI1AgICAgTCAgICAiICAgMQorTSwgICAgMyAgICAjMCAgICAhICAgICAoICAgICQgICAgJCAgICAhPCAgICAjICAgICBAICAkQCAgICAoIAorTSAgICA+UCAgICAgICAgICAgICAgIDAgICAgICAgICA/ICAgICEgICAgICggICEpXCAgICI/ICAgICMgIAorTSAgICMgICAgIVAgICAgMCAgICAsICAgICowICAgIFAgICAgJiAgIDJMICAgIEsgICAgIDAgICAgICAgIAorTSAgICAgICAwICAgICIgICAgIlwgICAgLCAgICAhQCAgJEwgICAgKyAgICAgQCAgICAgICAgICAgICAgIAorTSQgICAgIEAgICAgVCAgICAjICAgICA4ICAhLSAgICAjMCAgICE8ICAgICAgICAgICAgICAgISAgICAgKAorTSAgICAuQCAgICBQICAgICYgICA5ICAgICIwICAgICAwICAgICAgICAgICAgICAgMCAgICAiICAgICQgIAorTSAgICEgICAgIEAgICYxICAgIEQwICAgICUgICAgICAgICAgICAgICAiICAgICAgICAgISggICAgIDAgIAorTSAgLCAgIkREICAgKSkgICAgIEAgICAgICAgICAgICAgICAwICAgICAgICAgM0AgICAgJCAgICAjICAgSQorTSwgICAiMyAgICAgPCAgICAgICAgICAgICAgIDAgICAgISAgICAlLCAgICAmICAgICBQICAqNFAgICBFLAorTSAgICA8ICAgICAwICAgICAgICAgISAgICAgQCAgICE8ICAgICIgICAgICwgICJHICAgIClQICAgIDwgIAorTSAgICAgICAgICAgICAgQCAgICAgICAgIDgwICAgICggICAgICAgICAgICAgIjwgICAgPCAgICAgJCAgIAorTSAhUCAgICAkICAgICQgICAgJkQgICAgIyAgICAgICAgICAgICAhIyAgICAkVDAgICAgICAgICAgICAgIAorTSAwICAgICAgICAhUSAgICAgUCAgICAgICAgICAgICA1RDAgICApJCAgICAgICAgICAgICAgICQgICAgIAorTSAgICA+UCAgICAkICAgICAgICAgICAgICVCKCAgIDBOICAgICAgICAgICAgICAgISAgICAgICAgICgwIAorTSAgICEgICAgICAgICAgICAgIUkwICAgNjwgICAgICAgICAgICAgICAhICAgICAgICAgIisgICAgIDAgIAorPiAgICAgICAgICAgUFAgICAgSSggICAgICAgICAgICAgICAkICAgICAKKyAKK2VuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9pbnQtdHlwZS5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9pbnQtdHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OGNhOWMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2ludC10eXBlLmMKQEAgLTAsMCArMSwyNSBAQAorCitpbnQgeDsKK2ludCB5OworaW50IHo7CitpbnQgdzsKKworCisKK2ludCBtYWluICgpCit7CisgICAKKyNpZmRlZiB1c2VzdHVicworICAgIHNldF9kZWJ1Z190cmFwcygpOworICAgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorCisgICAgeCA9IDE0OworICAgIHkgPSAzOworICAgIHogPSAyOworICAgIHcgPSAyOworCisgICAgcmV0dXJuIDA7CisgICAgCit9CisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvaW50ZXJydXB0LmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2ludGVycnVwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMDY5N2IKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2ludGVycnVwdC5jCkBAIC0wLDAgKzEsMzcgQEAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQKK21haW4gKCkKK3sKKyAgY2hhciB4OworICBpbnQgbmJ5dGVzOworI2lmZGVmIHVzZXN0dWJzCisgIHNldF9kZWJ1Z190cmFwcygpOworICBicmVha3BvaW50KCk7CisjZW5kaWYKKyAgcHJpbnRmICgidGFsayB0byBtZSBiYWJ5XG4iKTsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgbmJ5dGVzID0gcmVhZCAoMCwgJngsIDEpOworICAgICAgaWYgKG5ieXRlcyA8IDApCisJeworI2lmZGVmIEVJTlRSCisJICBpZiAoZXJybm8gIT0gRUlOVFIpCisjZW5kaWYKKwkgICAgcGVycm9yICgiIik7CisJfQorICAgICAgZWxzZSBpZiAobmJ5dGVzID09IDApCisJeworCSAgcHJpbnRmICgiZW5kIG9mIGZpbGVcbiIpOworCSAgZXhpdCAoMCk7CisJfQorICAgICAgZWxzZQorCXdyaXRlICgxLCAmeCwgMSk7CisgICAgfQorfQorCitpbnQKK2Z1bmMxICgpCit7CisgIHJldHVybiA0OworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9pbnRlcnJ1cHQuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9pbnRlcnJ1cHQuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwY2Y4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2ludGVycnVwdC5leHAKQEAgLTAsMCArMSwxNzUgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCitpZiBbaG9zdF9pbmZvIGV4aXN0cyBuYW1lXSB7CisgICAgaWYgW2JvYXJkX2luZm8gaG9zdCBleGlzdHMgZ2RiLG5vaW50ZXJydXB0c10geworCXZlcmJvc2UgIlNraXBwaW5nIGludGVycnVwdC5leHAgYmVjYXVzZSBvZiBub2ludGVycnVwdHMuIgorCWNvbnRpbnVlCisgICAgfQorfQorCitpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYixub2luZmVyaW9yaW9dIHsKKyAgICB2ZXJib3NlICJTa2lwcGluZyBpbnRlcnJ1cHQuZXhwIGJlY2F1c2Ugb2Ygbm9pbmZlcmlvcmlvLiIKKyAgICByZXR1cm4KK30KKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgaW50ZXJydXB0CitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCitnZGJfc3RhcnQKKworCitpZiAhW2ZpbGUgZXhpc3RzICRiaW5maWxlXSB0aGVuIHsKKyAgICBwZXJyb3IgIiRiaW5maWxlIGRvZXMgbm90IGV4aXN0LiIKKyAgICByZXR1cm4gMAorfSBlbHNlIHsKKyAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKyAgICBnZGJfbG9hZCAkYmluZmlsZQorICAgICMgSG9wZSB0aGlzIGlzIHVuaXggOi0pCisgICAgZ2RiX3Rlc3QgInNoZWxsIHN0dHkgaW50ciAnXkMnIiAiIiBcCisJInNldCBpbnRlcnJ1cHQgY2hhcmFjdGVyIGluIGludGVycnVwdC5leHAiCisgICAgaWYgW3J1bnRvX21haW5dIHRoZW4geworCXNlbmRfZ2RiICJjb250aW51ZVxuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIlxyXG50YWxrIHRvIG1lIGJhYnlcclxuJCIgeworCQlwYXNzICJjaGlsZCBwcm9jZXNzIGlzIGFsaXZlIgorCSAgICB9CisJICAgIHRpbWVvdXQgeyBmYWlsICJydW4gKHRpbWVvdXQpIiB9CisJICAgIGVvZiB7IGZhaWwgInJ1biAoZW9mKSIgfQorCX0KKwkjIFRoaXMgc2hvdWxkIGFwcGVhciB0d2ljZSwgb25jZSBmb3IgdGhlIGVjaG8gYW5kIG9uY2UgZm9yIHRoZQorCSMgcHJvZ3JhbSdzIG91dHB1dC4gIFVuZGVyIGRlamFnbnUgKGJ1dCBub3QgaW50ZXJhY3RpdmVseSkgZm9yCisJIyBTdW5PUzQsIGl0IG9ubHkgYXBwZWFycyBvbmNlLiAgRG9uJ3Qgd29ycnkgYWJvdXQgaXQsIEkgaW1hZ2luZQorCSMgZGVqYWdudSBoYXMganVzdCBkb25lIHNvbWV0aGluZyB0byB0aGUgdHR5IG1vZGVzLgorCXNlbmRfZ2RiICJhXG4iCisJZ2RiX2V4cGVjdCB7CisJICAgIC1yZSAiXmFcclxuKHxhXHJcbikkIiB7CisJCXBhc3MgImNoaWxkIHByb2Nlc3MgYXRlIG91ciBjaGFyIgorCSAgICB9CisJICAgIHRpbWVvdXQgeyBmYWlsICJlY2hvIGEgKHRpbWVvdXQpIiB9CisJICAgIGVvZiB7IGZhaWwgImVjaG8gYSAoZW9mKSIgfQorCX0KKwkjIFdhaXQgdW50aWwgdGhlIHByb2dyYW0gaXMgaW4gdGhlIHJlYWQgc3lzdGVtIGNhbGwgYWdhaW4uCisJc2xlZXAgMgorCisJIyBDbnRybC1jIG1heSBmYWlsIGZvciBzaW11bGF0b3IgdGFyZ2V0cyBydW5uaW5nIG9uIGEgQlNEIGhvc3QuCisJIyBUaGlzIGlzIHRoZSByZXN1bHQgb2YgYSBjb21iaW5hdGlvbiBvZiB0aGUgcmVhZCBzeXNjYWxsCisJIyBiZWluZyByZXN0YXJ0ZWQgYW5kIGdkYiBjYXB0dXJpbmcgdGhlIGNudHJsLWMgc2lnbmFsLgorCisJIyBDbnRybC1jIG1heSBmYWlsIGZvciBzaW11bGF0b3IgdGFyZ2V0cyBvbiBzbG93IGhvc3RzLgorCSMgVGhpcyBpcyBiZWNhdXNlIHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBlbnRlcmluZworCSMgdGhlIHJlYWQgYW5kIGRlbGl2ZXJpbmcgdGhlIGNudHJsLWMuCisKKwlzZW5kX2dkYiAiXDAwMyIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICJQcm9ncmFtIHJlY2VpdmVkIHNpZ25hbCBTSUdJTlQuKiRnZGJfcHJvbXB0ICQiIHsKKwkJcGFzcyAic2VuZF9nZGIgY29udHJvbCBDIgorCSAgICB9CisJICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInNlbmRfZ2RiIGNvbnRyb2wgQyIgfQorCSAgICB0aW1lb3V0IHsgZmFpbCAic2VuZF9nZGIgY29udHJvbCBDICh0aW1lb3V0KSIgfQorCSAgICBlb2YgeyBmYWlsICJzZW5kX2dkYiBjb250cm9sIEMgKGVvZikiIH0KKwl9CisKKwlzZW5kX2dkYiAicCBmdW5jMSAoKVxuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIiA9IDQuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiY2FsbCBmdW5jdGlvbiB3aGVuIGFzbGVlcCIgfQorCSAgICAtcmUgIi4qUHJvZ3JhbSByZWNlaXZlZCBzaWduYWwgU0lHU0VHVi4qJGdkYl9wcm9tcHQgJCIgeworCQlzZXR1cF94ZmFpbCAiaSo4Ni1wYy1saW51eCotZ251KiIKKwkJZmFpbCAiY2hpbGQgZGllZCB3aGVuIHdlIGNhbGxlZCBmdW5jMSwgc2tpcHBlZCByZXN0IG9mIHRlc3RzIgorCQlyZXR1cm4KKwkgICAgfQorCSAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY2FsbCBmdW5jdGlvbiB3aGVuIGFzbGVlcCAod3Jvbmcgb3V0cHV0KSIgfQorCSAgICBkZWZhdWx0IHsKKworCQkjIFRoaXMgZmFpbCBwcm9iYWJseSBoYXBwZW5zIHdoZW5ldmVyIHdlIHVzZSAvcHJvYyAod2UKKwkJIyBkb24ndCB1c2UgUFJTQUJPUlQpLCBidXQgYXBwYXJlbnRseSBhbHNvIGhhcHBlbnMgb24KKwkJIyBvdGhlciBtYWNoaW5lcyBhcyB3ZWxsLgorCisJCXNldHVwX3hmYWlsICJzcGFyYyotKi1zb2xhcmlzMioiCisJCXNldHVwX3hmYWlsICJtaXBzLSotdWx0cml4KiIKKwkJc2V0dXBfeGZhaWwgImhwcGEqLSotKiIKKwkJc2V0dXBfeGZhaWwgImkzODYqLSotYnNkKiIKKwkJc2V0dXBfeGZhaWwgImkqODYtKi1zb2xhcmlzMioiCisJCXNldHVwX3hmYWlsICIqLSotc3lzdjQqIgorCQlzZXR1cF94ZmFpbCAidmF4LSotKiIKKwkJc2V0dXBfeGZhaWwgImFscGhhLSotKiIKKwkJc2V0dXBfeGZhaWwgIiotKi1pcml4KiIKKwkJc2V0dXBfeGZhaWwgIiotKi1ocHV4KiIKKwkJc2V0dXBfeGZhaWwgIiotKi0qbHlueCoiCisJCWZhaWwgImNhbGwgZnVuY3Rpb24gd2hlbiBhc2xlZXAgKHN0YXlzIGFzbGVlcCkiCisJCSMgU2VuZF9HZGIgYSBuZXdsaW5lIHRvIHdha2UgaXQgdXAKKwkJc2VuZF9nZGIgIlxuIgorCQlnZGJfdGVzdCAiIiAiID0gNCIgImNhbGwgZnVuY3Rpb24gYWZ0ZXIgd2FraW5nIGl0IgorCSAgICB9CisjCSAgICBlb2YgeyBmYWlsICJjYWxsIGZ1bmN0aW9uIHdoZW4gYXNsZWVwIChlb2YpIiB9CisJfQorCisJIyBOb3cgdHJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uIGFnYWluLgorCWdkYl90ZXN0ICJwIGZ1bmMxICgpIiAiID0gNCIgImNhbGwgZnVuY3Rpb24gYSBzZWNvbmQgdGltZSIKKworCSMgQW5kIHRoZSBwcm9ncmFtIHNob3VsZCBzdGlsbCBiZSBkb2luZyB0aGUgc2FtZSB0aGluZy4KKwkjIFRoZSBvcHRpb25hbCB0cmFpbGluZyBcclxuIGlzIGluIGNhc2Ugd2Ugc2VudCBhIG5ld2xpbmUgYWJvdmUKKwkjIHRvIHdha2UgdGhlIHByb2dyYW0sIGluIHdoaWNoIGNhc2UgdGhlIHByb2dyYW0gbm93IHNlbmRzIGl0CisJIyBiYWNrLiAgV2UgY2hlY2sgZm9yIGl0IGVpdGhlciBoZXJlIG9yIGluIHRoZSBuZXh0IGdkYl9leHBlY3QKKwkjIGNvbW1hbmQsIGJlY2F1c2Ugd2hpY2ggb25lIGl0IGVuZHMgdXAgaW4gaXMgdGltaW5nIGRlcGVuZGVudC4KKwlzZW5kX2dkYiAiY29udGludWVcbiIKKwkjIEZvciBzb21lIHJlYXNvbiwgaTM4Ni0qLXN5c3Y0IGdkYiBmYWlscyB0byBpc3N1ZSB0aGUgQ29udGludWluZworCSMgbWVzc2FnZSwgYnV0IG90aGVyd2lzZSBhcHBlYXJzIG5vcm1hbCAoRklYTUUpLgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIl5jb250aW51ZVxyXG5Db250aW51aW5nLlxyXG4oXHJcbnwpJCIgeyBwYXNzICJjb250aW51ZSIgfQorCSAgICAtcmUgIl5jb250aW51ZVxyXG5cclxuIiB7IGZhaWwgImNvbnRpbnVlIChtaXNzaW5nIENvbnRpbnVpbmcuKSIgfQorCSAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29udGludWUiIH0KKwkgICAgdGltZW91dCB7IGZhaWwgImNvbnRpbnVlICh0aW1lb3V0KSIgfQorCSAgICBlb2YgeyBmYWlsICJjb250aW51ZSAoZW9mKSIgfQorCX0KKworCXNlbmRfZ2RiICJkYXRhXG4iCisJIyBUaGUgb3B0aW9uYWwgbGVhZGluZyBcclxuIGlzIGluIGNhc2Ugd2Ugc2VudCBhIG5ld2xpbmUgYWJvdmUKKwkjIHRvIHdha2UgdGhlIHByb2dyYW0sIGluIHdoaWNoIGNhc2UgdGhlIHByb2dyYW0gbm93IHNlbmRzIGl0CisJIyBiYWNrLgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIl4oXHJcbnwpZGF0YVxyXG4ofGRhdGFcclxuKSQiIHsgcGFzcyAiZWNobyBkYXRhIiB9CisJICAgIHRpbWVvdXQgeyBmYWlsICJlY2hvIGRhdGEgKHRpbWVvdXQpIiB9CisJICAgIGVvZiB7IGZhaWwgImVjaG8gZGF0YSAoZW9mKSIgfQorCX0KKworCXNldHVwX3hmYWlsICJpKjg2LXBjLWxpbnV4Ki1nbnUqIgorCXNlbmRfZ2RiICJcMDA0IgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgImVuZCBvZiBmaWxlLipQcm9ncmFtIGV4aXRlZCBub3JtYWxseS4qJGdkYl9wcm9tcHQgJCIgeworCQlwYXNzICJzZW5kX2dkYiBlbmQgb2YgZmlsZSIKKwkgICAgfQorCSAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic2VuZCBlbmQgb2YgZmlsZSIgfQorCSAgICB0aW1lb3V0IHsgZmFpbCAic2VuZCBlbmQgb2YgZmlsZSAodGltZW91dCkiIH0KKwkgICAgZW9mIHsgZmFpbCAic2VuZCBlbmQgb2YgZmlsZSAoZW9mKSIgfQorCX0KKyAgICB9Cit9CityZXR1cm4gMApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9qdW1wLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2p1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTZkMGZkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9qdW1wLmMKQEAgLTAsMCArMSwxOSBAQAorLyogVGhpcyBwcm9ncmFtIGlzIHVzZWQgdG8gdGVzdCB0aGUgImp1bXAiIGNvbW1hbmQuICBUaGVyZSdzIG5vdGhpbmcKKyAgIHBhcnRpY3VsYXJseSBkZWVwIGFib3V0IHRoZSBmdW5jdGlvbmFsaXR5IG5vciBuYW1lcyBpbiBoZXJlLgorICAgKi8KKworc3RhdGljIGludCBzcXVhcmUgKHgpCisgIGludCAgeDsKK3sKKyAgcmV0dXJuIHgqeDsKK30KKworCittYWluICgpCit7CisgIGludCBpID0gOTk7CisKKyAgaSsrOworICBpID0gc3F1YXJlIChpKTsKKyAgaS0tOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9qdW1wLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvanVtcC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExMGUyMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvanVtcC5leHAKQEAgLTAsMCArMSwxOTIgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCisJfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworIyBhcmUgd2Ugb24gYSB0YXJnZXQgYm9hcmQKK2lmICFbaXNuYXRpdmVdIHRoZW4geworICByZXR1cm4gMAorfQorCitjbGVhcl94ZmFpbCAiKi0qLSoiCisKK3NldCB0ZXN0ZmlsZSAianVtcCIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworIyBCdWlsZCB0aGUgdGVzdCBjYXNlCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIGFkZGl0aW9uYWxfZmxhZ3M9LXd9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCisgICAgfQorCisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgcGVycm9yICJDb3VsZG4ndCBydW4gdG8gbWFpbiIKKyAgcmV0dXJuIC0xCit9CisKKyMgU2V0IGEgYnJlYWtwb2ludCBvbiB0aGUgc3RhdGVtZW50IHRoYXQgd2UncmUgYWJvdXQgdG8ganVtcCB0by4KKyMgVGhlIHN0YXRlbWVudCBkb2Vzbid0IGNvbnRhaW4gYSBmdW5jdGlvbiBjYWxsLgorIworc2VuZF9nZGIgImJyZWFrIDE4XG4iCitzZXQgYnBfb25fbm9uX2NhbGwgMAorZ2RiX2V4cGVjdCB7CisgIC1yZSAiXFtCYlxdcmVha3BvaW50IChcWzAtOVxdKikgYXQgMHhcWzAtOWEtZkEtRlxdKjogZmlsZSAuKiR7c3JjZmlsZX0sIGxpbmUgMTguKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtzZXQgYnBfb25fbm9uX2NhbGwgJGV4cGVjdF9vdXQoMSxzdHJpbmcpCisgICAgICAgICAgIHBhc3MgImJyZWFrIGJlZm9yZSBqdW1wIHRvIG5vbi1jYWxsIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiYnJlYWsgYmVmb3JlIGp1bXAgdG8gbm9uLWNhbGwifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgYnJlYWsgYmVmb3JlIGp1bXAgdG8gbm9uLWNhbGwifQorfQorCisjIENhbiB3ZSBqdW1wIHRvIHRoZSBzdGF0ZW1lbnQ/ICBEbyB3ZSBzdG9wIHRoZXJlPworIworc2VuZF9nZGIgImp1bXAgMThcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIkJyZWFrcG9pbnQgXFswLTlcXSosIC4qJHtzcmNmaWxlfToxOC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImp1bXAgdG8gbm9uLWNhbGwifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJqdW1wIHRvIG5vbi1jYWxsIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGp1bXAgdG8gbm9uLWNhbGwifQorfQorCisjIFNldCBhIGJyZWFrcG9pbnQgb24gdGhlIHN0YXRlbWVudCB0aGF0IHdlJ3JlIGFib3V0IHRvIGp1bXAgdG8uCisjIFRoZSBzdGF0ZW1lbnQgZG9lcyBjb250YWluIGEgZnVuY3Rpb24gY2FsbC4KKyMKK3NlbmRfZ2RiICJicmVhayAxN1xuIgorc2V0IGJwX29uX2NhbGwgMAorZ2RiX2V4cGVjdCB7CisgIC1yZSAiXFtCYlxdcmVha3BvaW50IChcWzAtOVxdKikgYXQgMHhcWzAtOWEtZkEtRlxdKjogZmlsZSAuKiR7c3JjZmlsZX0sIGxpbmUgMTcuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtzZXQgYnBfb25fY2FsbCAkZXhwZWN0X291dCgxLHN0cmluZykKKyAgICAgICAgICAgcGFzcyAiYnJlYWsgYmVmb3JlIGp1bXAgdG8gY2FsbCJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImJyZWFrIGJlZm9yZSBqdW1wIHRvIGNhbGwifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgYnJlYWsgYmVmb3JlIGp1bXAgdG8gY2FsbCJ9Cit9CisKKyMgQ2FuIHdlIGp1bXAgdG8gdGhlIHN0YXRlbWVudD8gIERvIHdlIHN0b3AgdGhlcmU/CisjCitzZW5kX2dkYiAianVtcCAxN1xuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiQnJlYWtwb2ludCBcWzAtOVxdKiwgLioke3NyY2ZpbGV9OjE3LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAianVtcCB0byBjYWxsIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAianVtcCB0byBjYWxsIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGp1bXAgdG8gY2FsbCJ9Cit9CisKKyMgSWYgd2UgZGlzYWJsZSB0aGUgYnJlYWtwb2ludCBhdCB0aGUgZnVuY3Rpb24gY2FsbCwgYW5kIHRoZW4KKyMgaWYgd2UganVtcCB0byB0aGF0IHN0YXRlbWVudCwgZG8gd2Ugbm90IHN0b3AgdGhlcmUsIGJ1dCBhdAorIyB0aGUgZm9sbG93aW5nIGJyZWFrcG9pbnQ/CisjCitzZW5kX2dkYiAiZGlzYWJsZSAkYnBfb25fY2FsbFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImRpc2FibGUgYnJlYWtwb2ludCBvbiBjYWxsIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGRpc2FibGUgYnJlYWtwb2ludCBvbiBjYWxsIn0KK30KKworc2VuZF9nZGIgImp1bXAgMTdcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIkJyZWFrcG9pbnQgXFswLTlcXSosIC4qJHtzcmNmaWxlfToxOC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImp1bXAgdG8gY2FsbCB3aXRoIGRpc2FibGVkIGJyZWFrcG9pbnQifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJqdW1wIHRvIGNhbGwgd2l0aCBkaXNhYmxlZCBicmVha3BvaW50In0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGp1bXAgdG8gY2FsbCB3aXRoIGRpc2FibGVkIGJyZWFrcG9pbnQifQorfQorCisjIFZlcmlmeSB0aGF0IEdEQiByZXNwb25kcyBncmFjZWZ1bGx5IHRvIHRoZSAianVtcCIgY29tbWFuZCB3aXRob3V0CisjIGFuIGFyZ3VtZW50LgorIworc2VuZF9nZGIgImp1bXBcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIkFyZ3VtZW50IHJlcXVpcmVkIC5zdGFydGluZyBhZGRyZXNzLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImp1bXAgd2l0aG91dCBhcmd1bWVudCBkaXNhbGxvd2VkIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAianVtcCB3aXRob3V0IGFyZ3VtZW50IGRpc2FsbG93ZWQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkganVtcCB3aXRob3V0IGFyZ3VtZW50IGRpc2FsbG93ZWQifQorfQorCisjIFZlcmlmeSB0aGF0IEdEQiByZXNwb25kcyBncmFjZWZ1bGx5IHRvIHRoZSAianVtcCIgY29tbWFuZCB3aXRoCisjIHRyYWlsaW5nIGp1bmsuCisjCitzZW5kX2dkYiAianVtcCAxNyAxMDBcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIkp1bmsgYXQgZW5kIG9mIGxpbmUgc3BlY2lmaWNhdGlvbjogMTAwLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAianVtcCB3aXRoIHRyYWlsaW5nIGFyZ3VtZW50IGp1bmsifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJqdW1wIHdpdGggdHJhaWxpbmcgYXJndW1lbnQganVuayJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBqdW1wIHdpdGggdHJhaWxpbmcgYXJndW1lbnQganVuayJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgR0RCIHJlc3BvbmRzIGdyYWNlZnVsbHkgdG8gYSByZXF1ZXN0IHRvIGp1bXAgb3V0IG9mCisjIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKE5vdGUgdGhhdCB0aGlzIHdpbGwgdmVyeSBsaWtlbHkgY2F1c2UgdGhlCisjIGluZmVyaW9yIHRvIGRpZS4gIEJlIHByZXBhcmVkIHRvIHJlcnVuIHRoZSBpbmZlcmlvciwgaWYgZnVydGhlcgorIyB0ZXN0aW5nIGlzIGRlc2lyZWQuKQorIworIyBUcnkgaXQgYm90aCB3YXlzOiBjb25maXJtaW5nIGFuZCBub3QgY29uZmlybWluZyB0aGUganVtcC4KKyMKK3NlbmRfZ2RiICJqdW1wIDhcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIkxpbmUgOCBpcyBub3QgaW4gYG1haW4nLiAgSnVtcCBhbnl3YXkuKnkgb3Igbi4gJCJcCisgICAgICAgICAge3NlbmRfZ2RiICJuXG4iCisgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgIC1yZSAiTm90IGNvbmZpcm1lZC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiYWJvcnRlZCBqdW1wIG91dCBvZiBjdXJyZW50IGZ1bmN0aW9uIn0KKyAgICAgICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge2ZhaWwgImFib3J0ZWQganVtcCBvdXQgb2YgY3VycmVudCBmdW5jdGlvbiJ9CisgICAgICAgICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGFib3J0ZWQganVtcCBvdXQgb2YgY3VycmVudCBmdW5jdGlvbiJ9CisgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImFib3J0ZWQganVtcCBvdXQgb2YgY3VycmVudCBmdW5jdGlvbiJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBhYm9ydGVkIGp1bXAgb3V0IG9mIGN1cnJlbnQgZnVuY3Rpb24ifQorfQorCitzZW5kX2dkYiAianVtcCA4XG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJMaW5lIDggaXMgbm90IGluIGBtYWluJy4gIEp1bXAgYW55d2F5Lip5IG9yIG4uICQiXAorICAgICAgICAgIHtzZW5kX2dkYiAieVxuIgorICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAtcmUgIkNvbnRpbnVpbmcgYXQuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge3Bhc3MgImp1bXAgb3V0IG9mIGN1cnJlbnQgZnVuY3Rpb24ifQorICAgICAgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICB7ZmFpbCAianVtcCBvdXQgb2YgY3VycmVudCBmdW5jdGlvbiJ9CisgICAgICAgICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGp1bXAgb3V0IG9mIGN1cnJlbnQgZnVuY3Rpb24ifQorICAgICAgICAgICB9CisgICAgICAgICAgfQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJqdW1wIG91dCBvZiBjdXJyZW50IGZ1bmN0aW9uIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGp1bXAgb3V0IG9mIGN1cnJlbnQgZnVuY3Rpb24ifQorfQorCitnZGJfZXhpdAorcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbGFuZ3MuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9sYW5ncy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY0Yzc5NwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbGFuZ3MuZXhwCkBAIC0wLDAgKzEsMTIyIEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSBsYW5ncworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiBbaXNfcmVtb3RlIGhvc3RdIHsKKyAgICByZW1vdGVfZG93bmxvYWQgaG9zdCAke3NyY2Rpcn0vJHtzdWJkaXJ9L2xhbmdzMS5mCisgICAgcmVtb3RlX2Rvd25sb2FkIGhvc3QgJHtzcmNkaXJ9LyR7c3ViZGlyfS9sYW5nczIuY3h4Cit9CisKKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9L2xhbmdzMC5jIiAiJHtiaW5maWxlfTAubyIgb2JqZWN0IHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9L2xhbmdzMS5jIiAiJHtiaW5maWxlfTEubyIgb2JqZWN0IHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9L2xhbmdzMi5jIiAiJHtiaW5maWxlfTIubyIgb2JqZWN0IHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworaWYgIHsgW2dkYl9jb21waWxlICIke2JpbmZpbGV9MC5vICR7YmluZmlsZX0xLm8gJHtiaW5maWxlfTIubyIgJHtiaW5maWxlfSBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworCisKKworIyBDcmVhdGUgYW5kIHNvdXJjZSB0aGUgZmlsZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlcgorIyB1c2VkIHRvIGNvbXBpbGUgdGhlIHRlc3QgY2FzZS4KK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9XSB7CisgICAgcmV0dXJuIC0xOworfQorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICRiaW5maWxlCisKK2dkYl90ZXN0ICJiIGxhbmdzMCIge0Z1bmN0aW9uICJsYW5nczAiIG5vdCBkZWZpbmVkXC59IFwKKyAgICAiYnJlYWsgb24gbm9uZXhpc3RlbnQgZnVuY3Rpb24gaW4gbGFuZ3MuZXhwIgorCitpZiBbcnVudG8gY3N1Yl0gdGhlbiB7CisKKyAgICBnZGJfdGVzdCAic2hvdyBsYW5ndWFnZSIgImN1cnJlbnRseSBjXCIuKiIgXAorCSJzaG93IGxhbmd1YWdlIGF0IGNzdWIgaW4gbGFuZ3MuZXhwIgorICAgICMgT24gc29tZSBtYWNoaW5lcywgZm9vIGRvZXNuJ3QgZ2V0IGRlbWFuZ2xlZCBiZWNhdXNlIHRoZSBOX1NPTCBmb3IKKyAgICAjIGxhbmdzMi5jeHggaXMgc2VlbiBvbmx5IGFmdGVyIHRoZSBmdW5jdGlvbiBzdGFiIGZvciBmb28uICBTbworICAgICMgdGhlIGZvbGxvd2luZyByZWdleHBzIGFyZSBrbHVkZ2VkIHRvIGFjY2VwdCBmb29fX0ZpIGFzIHdlbGwgYXMgZm9vLAorICAgICMgZXZlbiB0aG91Z2ggb25seSB0aGUgbGF0dGVyIGlzIGNvcnJlY3QuICBJIGhhdmVuJ3QgdHJpZWQgdG8geGZhaWwgaXQKKyAgICAjIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBkZXRhaWxzIG9mIHRoZSBjb21waWxlci4KKyAgICAKKyAgICBpZiB7ISRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiaHBwYSotKi1ocHV4KiIgfQorICAgIGdkYl90ZXN0ICJidCIgIiMwLipjc3ViLiojMS4qKGZvb3xmb29fX0ZpKSBcXCguKiMyLipjcHBzdWJfIC4qIzMuKmZzdWIuKiM0LipsYW5nczBfXzJkbyBcXCguKiM1ICBcWzAtOWEtZnhcXSogaW4gbWFpbi4qIiAiYmFja3RyYWNlIGluIGxhbmdzLmV4cCIKKworICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CisgICAgZ2RiX3Rlc3QgInVwIiAiLiogaW4gKGZvb3xmb29fX0ZpKSAuKiBhdCBsYW5nczJcXC5jeHguKnJldHVybiBjc3ViIFxcKC4qIiBcCisJInVwIHRvIGZvbyBpbiBsYW5ncy5leHAiCisgICAgZ2RiX3Rlc3QgInNob3cgbGFuZ3VhZ2UiICJjdXJyZW50bHkgY1xcK1xcKy4qIiBcCisJInNob3cgbGFuZ3VhZ2UgYXQgZm9vIGluIGxhbmdzLmV4cCIKKworICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CisgICAgZ2RiX3Rlc3QgInVwIiAiLiogaW4gY3Bwc3ViXyAuKiBhdCBsYW5nczJcXC5jeHguKnJldHVybiBmb28gXFwoLioiIFwKKwkidXAgdG8gY3Bwc3ViXyBpbiBsYW5ncy5leHAiCisgICAgZ2RiX3Rlc3QgInNob3cgbGFuZ3VhZ2UiICJjdXJyZW50bHkgY1xcK1xcKy4qIiBcCisJInNob3cgbGFuZ3VhZ2UgYXQgY3Bwc3ViXyBpbiBsYW5ncy5leHAiCisKKyAgICBpZiB7ISRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAicnM2MDAwLSotKiIgfQorICAgIGdkYl90ZXN0ICJ1cCIgIi4qIGluIGZzdWIuKiBhdCBsYW5nczFcXC5mLipyZXR1cm4gXFwoY3Bwc3ViIC4qIiBcCisJInVwIHRvIGZzdWIgaW4gbGFuZ3MuZXhwIgorICAgIGdkYl90ZXN0ICJzaG93IGxhbmd1YWdlIiAiY3VycmVudGx5IGZvcnRyYW4uKiIgXAorCSJzaG93IGxhbmd1YWdlIGF0IGZzdWIgaW4gbGFuZ3MuZXhwIgorCisgICAgaWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgImhwcGEqLSotaHB1eCoiIH0KKyAgICBnZGJfdGVzdCAidXAiICIuKiBpbiBsYW5nczBfXzJkbyAuKiBhdCAuKmxhbmdzMFxcLmMuKnJldHVybiBmc3ViLioiIFwKKwkidXAgdG8gbGFuZ3MwX18yZG8gaW4gbGFuZ3MuZXhwIgorICAgIGdkYl90ZXN0ICJzaG93IGxhbmd1YWdlIiAiY3VycmVudGx5IGNcIi4qIiBcCisJInNob3cgbGFuZ3VhZ2UgYXQgbGFuZ3MwX18yZG8gaW4gbGFuZ3MuZXhwIgorCisgICAgZ2RiX3Rlc3QgInVwIiAiLiogaW4gbWFpbiAuKiBhdCAuKmxhbmdzMFxcLmMuKmlmIFxcKGxhbmdzMF9fMmRvIFxcKC4qIiBcCisJInVwIHRvIG1haW4gaW4gbGFuZ3MuZXhwIgorICAgIGdkYl90ZXN0ICJzaG93IGxhbmd1YWdlIiAiY3VycmVudGx5IGNcIi4qIiBcCisJInNob3cgbGFuZ3VhZ2UgYXQgbWFpbiBpbiBsYW5ncy5leHAiCisKKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYixub3Jlc3VsdHNdIHsgcmV0dXJuIH0KKworICAgIGlmIFt0YXJnZXRfaW5mbyBleGlzdHMgdXNlX2dkYl9zdHViXSB7CisJZ2RiX2JyZWFrcG9pbnQgImV4aXQiCisJZ2RiX3Rlc3QgImNvbnQiICJCcmVha3BvaW50IC4qZXhpdC4qIiAiY29udGludWUgdG8gZXhpdCBpbiBsYW5ncy5leHAiCisgICAgfSBlbHNlIHsKKwlnZGJfdGVzdCAiY29udCIgIlByb2dyYW0gZXhpdGVkIG5vcm1hbGx5XFwuLioiIFwKKwkJImNvbnRpbnVlIHRvIGV4aXQgaW4gbGFuZ3MuZXhwIgorICAgIH0KK30KKworcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbGFuZ3MwLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2xhbmdzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YzBjZTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2xhbmdzMC5jCkBAIC0wLDAgKzEsMjggQEAKKy8qIFRoaXMgZmlsZSBpcyBhY3R1YWxseSBpbiBDLCBpdCBpcyBub3Qgc3VwcG9zZWQgdG8gc2ltdWxhdGUgc29tZXRoaW5nCisgICB0cmFuc2xhdGVkIGZyb20gYW5vdGhlciBsYW5ndWFnZSBvciBhbnl0aGluZyBsaWtlIHRoYXQuICAqLworaW50Citjc3ViICh4KQorICAgICBpbnQgeDsKK3sKKyAgcmV0dXJuIHggKyAxOworfQorCitpbnQKK2xhbmdzMF9fMmRvICgpCit7CisgIHJldHVybiBmc3ViXyAoKSArIDI7Cit9CisKK2ludAorbWFpbiAoKQoreworI2lmZGVmIHVzZXN0dWJzCisgIHNldF9kZWJ1Z190cmFwcygpOworICBicmVha3BvaW50KCk7CisjZW5kaWYKKyAgaWYgKGxhbmdzMF9fMmRvICgpID09IDUwMDMpCisgICAgLyogU3VjY2Vzcy4gICovCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbGFuZ3MxLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2xhbmdzMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NDIyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2xhbmdzMS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIGxhbmdzMS5mIC0tIHRyYW5zbGF0ZWQgYnkgZjJjICh2ZXJzaW9uIG9mIDUgTWF5IDE5OTAgIDE6MTI6MDgpLiAgKi8KKworLyogZjJjIG91dHB1dCBoYWNrZWQgYXMgZm9sbG93cyBmb3IgR0RCIHRlc3RzdWl0ZToKKyAgIDEuICBDaGFuZ2UgY29tbWVudGVkIG91dCAiIyIgbGluZXMgdG8gI2xpbmUgZGlyZWN0aXZlcy4KKyAgICAgICBJIGRvbid0IGtub3cgd2h5IHRoaXMgYmVoYXZpb3IgaXNuJ3QgdGhlIGRlZmF1bHQgZm9yIGYyYyAtZy4KKyAgIDIuICBSZW1vdmUgaW5jbHVkZSBvZiBmMmMuaCBhbmQgcHV0IGluIGp1c3QgYSB0eXBlZGVmIGZvciAiaW50ZWdlciIuCisgICBBZGRpdGlvbmFsIG5vdGVzOgorICAgMy4gIGYyYyB3YXMgY2FsbGVkIGFzICJmMmMgLWcgbGFuZ3MxLmYiLgorICAgNC4gIFdlIGRvbid0IG5lZWQgdG8gdXNlIHRoZSBmb3J0cmFuIGxpYnJhcmllcy4gICovCisKK3R5cGVkZWYgaW50IGludGVnZXI7CisKKy8qIFRhYmxlIG9mIGNvbnN0YW50IHZhbHVlcyAqLworCitzdGF0aWMgaW50ZWdlciBjX18xMDAwMCA9IDEwMDAwOworCisvKiBJIGFtIG5vdCBzdXJlIHdoZXRoZXIgdGhlcmUgaXMgYSB3YXkgdG8gaGF2ZSBhIGZvcnRyYW4gcHJvZ3JhbSB3aXRob3V0ICovCisvKiBhIE1BSU4sIGJ1dCBpdCBkb2VzIG5vdCByZWFsbHkgaGFybSB1cyB0byBoYXZlIG9uZS4gKi8KKy8qIE1haW4gcHJvZ3JhbSAqLyBNQUlOX18oKQoreworfSAvKiBNQUlOX18gKi8KKworI2xpbmUgNCAibGFuZ3MxLmYiCisvKiBTdWJyb3V0aW5lICovIGludCBmc3ViXygpCit7CisgICAgZXh0ZXJuIGludGVnZXIgY3Bwc3ViXygpOworCisjbGluZSA1ICJsYW5nczEuZiIKKyNsaW5lIDYgImxhbmdzMS5mIgorICAgIHJldHVybiBjcHBzdWJfKCZjX18xMDAwMCk7CisjbGluZSA3ICJsYW5nczEuZiIKK30gLyogZnN1Yl8gKi8KKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9sYW5nczEuZiBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbGFuZ3MxLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVjZTY5MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbGFuZ3MxLmYKQEAgLTAsMCArMSw3IEBACitjIEkgYW0gbm90IHN1cmUgd2hldGhlciB0aGVyZSBpcyBhIHdheSB0byBoYXZlIGEgZm9ydHJhbiBwcm9ncmFtIHdpdGhvdXQKK2MgYSBNQUlOLCBidXQgaXQgZG9lcyBub3QgcmVhbGx5IGhhcm0gdXMgdG8gaGF2ZSBvbmUuCisgICAgICBlbmQKKyAgICAgIHN1YnJvdXRpbmUgZnN1YgorICAgICAgICBpbnRlZ2VyKjQgY3Bwc3ViCisgICAgICAgIHJldHVybiAoY3Bwc3ViICgxMDAwMCkpCisgICAgICBlbmQKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbGFuZ3MyLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2xhbmdzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMmE2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2xhbmdzMi5jCkBAIC0wLDAgKzEsMTUgQEAKKy8qIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgYSB2YWd1ZSBzaW11bGF0aW9uIG9mIGNmcm9udCBvdXRwdXQuICAqLworI2xpbmUgMSAibGFuZ3MyLmN4eCIKK2V4dGVybiBpbnQgY3N1YiAoKTsKK2ludAorZm9vX19GaSAoeCkgaW50IHg7Cit7CisgIHJldHVybiBjc3ViICh4IC8gMik7Cit9CisKK2V4dGVybiBpbnQgY3Bwc3ViXyAoKTsKK2ludAorY3Bwc3ViXyAoeSkgaW50ICp5OworeworICByZXR1cm4gZm9vX19GaSAoKnkpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9sYW5nczIuY3h4IGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9sYW5nczIuY3h4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMmNhOGEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2xhbmdzMi5jeHgKQEAgLTAsMCArMSwxMyBAQAorZXh0ZXJuICJDIiBpbnQgY3N1YiAoaW50KTsKK2ludAorZm9vIChpbnQgeCkKK3sKKyAgcmV0dXJuIGNzdWIgKHggLyAyKTsKK30KKworZXh0ZXJuICJDIiBpbnQgY3Bwc3ViXyAoaW50ICopOworaW50CitjcHBzdWJfIChpbnQgKnkpCit7CisgIHJldHVybiBmb28gKCp5KTsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbGlzdC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2xpc3QuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OTdiOWEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2xpc3QuZXhwCkBAIC0wLDAgKzEsNTIxIEBACisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAoZm5mQGN5Z251cy5jb20pCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJsaXN0Igorc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCisjIE5lZWQgdG8gZG93bmxvYWQgdGhlIGhlYWRlciB0byB0aGUgaG9zdC4KK3JlbW90ZV9kb3dubG9hZCBob3N0ICR7c3JjZGlyfS8ke3N1YmRpcn0vbGlzdDAuaCBsaXN0MC5oCisKKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9L2xpc3QwLmMiICIke2JpbmZpbGV9MC5vIiBvYmplY3Qge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vbGlzdDEuYyIgIiR7YmluZmlsZX0xLm8iIG9iamVjdCB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtiaW5maWxlfTAubyAke2JpbmZpbGV9MS5vIiAke2JpbmZpbGV9IGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisKKworIyBDcmVhdGUgYW5kIHNvdXJjZSB0aGUgZmlsZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlcgorIyB1c2VkIHRvIGNvbXBpbGUgdGhlIHRlc3QgY2FzZS4KK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9XSB7CisgICAgcmV0dXJuIC0xOworfQorCisjCisjIExvY2FsIHV0aWxpdHkgcHJvYyBqdXN0IHRvIHNldCBhbmQgdmVyaWZ5IGxpc3RzaXplCisjIFJldHVybiAxIGlmIHN1Y2Nlc3MsIDAgaWYgZmFpbC4KKyMKKworc2V0IHNldF9saXN0c2l6ZV9jb3VudCAwOworCitwcm9jIHNldF9saXN0c2l6ZSB7IGFyZyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBzZXRfbGlzdHNpemVfY291bnQ7CisKKyAgICBpbmNyIHNldF9saXN0c2l6ZV9jb3VudDsKKyAgICBpZiBbZ2RiX3Rlc3QgInNldCBsaXN0c2l6ZSAkYXJnIiAiIiAic2V0dGluZyBsaXN0c2l6ZSB0byAkYXJnICMkc2V0X2xpc3RzaXplX2NvdW50Il0geworCXJldHVybiAwOworICAgIH0KKyAgICBpZiB7ICRhcmcgPD0gMCB9IHsKKwlzZXQgYXJnICJ1bmxpbWl0ZWQiOworICAgIH0KKworICAgIGlmIFtnZGJfdGVzdCAic2hvdyBsaXN0c2l6ZSIgIk51bWJlciBvZiBzb3VyY2UgbGluZXMuKiBpcyAke2FyZ30uKiIgInNob3cgbGlzdHNpemUgJGFyZyAjJHNldF9saXN0c2l6ZV9jb3VudCJdIHsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDEKK30KKworIworIyBUZXN0IGRpc3BsYXkgb2YgbGlzdHNpemUgbGluZXMgYXJvdW5kIGEgZ2l2ZW4gbGluZSBudW1iZXIuCisjCisKK3Byb2MgdGVzdF9saXN0c2l6ZSB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgICMgU2hvdyBkZWZhdWx0IHNpemUKKworICAgIGdkYl90ZXN0ICJzaG93IGxpc3RzaXplIiAiTnVtYmVyIG9mIHNvdXJjZSBsaW5lcyBnZGIgd2lsbCBsaXN0IGJ5IGRlZmF1bHQgaXMgMTAuKiIgInNob3cgZGVmYXVsdCBsaXN0IHNpemUiCisgICAgCisgICAgIyBTaG93IHRoZSBkZWZhdWx0IGxpbmVzCisgICAgIyBUaGUgc2Vjb25kIGNhc2UgaXMgZm9yIG9wdGltaXplZCBjb2RlLCBpdCBpcyBzdGlsbCBjb3JyZWN0LgorICAgIAorICAgIGlmICFbaXNuYXRpdmVdIHsKKwlydW50b19tYWluOworCXVuc3VwcG9ydGVkICJsaXN0IGRlZmF1bHQgbGluZXMgYXJvdW5kIG1haW4iOworICAgIH0gZWxzZSB7CisJZ2RiX3Rlc3QgImxpc3QiICIoMVxbIFx0XF0rI2luY2x1ZGUgXCJsaXN0MC5oXCIuKjEwXFsgXHRcXSt4ID0gMDt8Mi4qMTFcWyBcdFxdK2ZvbyAueFxbKylcXSs7KSIgImxpc3QgZGVmYXVsdCBsaW5lcyBhcm91bmQgbWFpbiIKKyAgICB9CisKKyAgICAjIEVuc3VyZSB3ZSBjYW4gbGltaXQgcHJpbnRvdXRzIHRvIG9uZSBsaW5lCisKKyAgICBpZiBbIHNldF9saXN0c2l6ZSAxIF0gdGhlbiB7CisJc2V0dXBfeGZhaWwgIiotKi0qIgorCWdkYl90ZXN0ICJsaXN0IDEiICIxXFsgXHRcXSsjaW5jbHVkZSBcImxpc3QwLmhcIiIgImxpc3QgbGluZSAxIHdpdGggbGlzdHNpemUgMSIKKwlzZXR1cF94ZmFpbCAiKi0qLSoiCisJZ2RiX3Rlc3QgImxpc3QgMiIgIjJcWyBcdFxdKyIgImxpc3QgbGluZSAyIHdpdGggbGlzdHNpemUgMSIKKyAgICB9ICAgIAorCisgICAgIyBUcnkganVzdCB0d28gbGluZXMKKyAgICAKKyAgICBpZiBbIHNldF9saXN0c2l6ZSAyIF0geworCWdkYl90ZXN0ICJsaXN0IDEiICIxXFsgXHRcXSsjaW5jbHVkZSBcImxpc3QwLmhcIiIgImxpc3QgbGluZSAxIHdpdGggbGlzdHNpemUgMiIKKwlnZGJfdGVzdCAibGlzdCAyIiAiMVxbIFx0XF0rI2luY2x1ZGUgXCJsaXN0MC5oXCJcclxuMlxbIFx0XF0rIiAibGlzdCBsaW5lIDIgd2l0aCBsaXN0c2l6ZSAyIgorCWdkYl90ZXN0ICJsaXN0IDMiICIyXFsgXHRcXStcclxuM1xbIFx0XF0rbWFpbiBcWykoXF0rIiAibGlzdCBsaW5lIDMgd2l0aCBsaXN0c2l6ZSAyIgorICAgIH0KKworICAgICMgVHJ5IHNtYWxsIGxpc3RzaXplID4gMSB0aGF0IGlzIGFuIG9kZCBudW1iZXIKKworICAgIGlmIFsgc2V0X2xpc3RzaXplIDMgXSB7CisJc2V0dXBfeGZhaWwgIiotKi0qIgorCWdkYl90ZXN0ICJsaXN0IDEiICIxXFsgXHRcXSsjaW5jbHVkZSBcImxpc3QwLmhcIjJcWyBcdFxdKyIgImxpc3QgbGluZSAxIHdpdGggbGlzdHNpemUgMyIKKwlzZXR1cF94ZmFpbCAiKi0qLSoiCisJZ2RiX3Rlc3QgImxpc3QgMiIgIjFcWyBcdFxdKyNpbmNsdWRlIFwibGlzdDAuaFwiLiozXFsgXHRcXSttYWluIFxbKShcXSsiICJsaXN0IGxpbmUgMiB3aXRoIGxpc3RzaXplIDMiCisJCisJc2V0dXBfeGZhaWwgIiotKi0qIgorCWdkYl90ZXN0ICJsaXN0IDMiICIyXFsgXHRcXStcclxuM1xbIFx0XF0rbWFpbiBcWyhcXStcWylcXStcclxuNFxbIFx0XF0rXHsiICJsaXN0IGxpbmUgMyB3aXRoIGxpc3RzaXplIDMiCisgICAgfQorCisgICAgIyBUcnkgc21hbGwgbGlzdHNpemUgPiAyIHRoYXQgaXMgYW4gZXZlbiBudW1iZXIuCisKKyAgICBpZiBbIHNldF9saXN0c2l6ZSA0IF0gdGhlbiB7CisJZ2RiX3Rlc3QgImxpc3QgMSIgIjFcWyBcdFxdKyNpbmNsdWRlIFwibGlzdDAuaFwiXHJcbjJcWyBcdFxdKyIgImxpc3QgbGluZSAxIHdpdGggbGlzdHNpemUgNCIKKwlnZGJfdGVzdCAibGlzdCAyIiAiMVxbIFx0XF0rI2luY2x1ZGUgXCJsaXN0MC5oXCIuKjNcWyBcdFxdK21haW4gXFspKFxdKyIgImxpc3QgbGluZSAyIHdpdGggbGlzdHNpemUgNCIKKwkKKwlnZGJfdGVzdCAibGlzdCAzIiAiMVxbIFx0XF0rI2luY2x1ZGUgXCJsaXN0MC5oXCIuKjRcWyBcdFxdK1x7IiAibGlzdCBsaW5lIDMgd2l0aCBsaXN0c2l6ZSA0IgorCWdkYl90ZXN0ICJsaXN0IDQiICIyXFsgXHRcXStcclxuLio1XFsgXHRcXStpbnQgeDsuKiIgImxpc3QgbGluZSA0IHdpdGggbGlzdHNpemUgNCIKKyAgICB9CisKKyAgICAjIFRyeSBhIHNpemUgbGFyZ2VyIHRoYW4gdGhlIGVudGlyZSBmaWxlLgorCisgICAgaWYgWyBzZXRfbGlzdHNpemUgMTAwIF0gdGhlbiB7CisJZ2RiX3Rlc3QgImxpc3QgMSIgIjFcWyBcdFxdKyNpbmNsdWRlIFwibGlzdDAuaFwiLipcclxuNDJcWyBcdFxdK1x9IiAibGlzdCBsaW5lIDEgd2l0aCBsaXN0c2l6ZSAxMDAiCisJCisJZ2RiX3Rlc3QgImxpc3QgMTAiICIxXFsgXHRcXSsjaW5jbHVkZSBcImxpc3QwLmhcIi4qXHJcbjQyXFsgXHRcXStcfSIgImxpc3QgbGluZSAxMCB3aXRoIGxpc3RzaXplIDEwMCIKKyAgICB9CisKKyAgICAjIFRyeSBsaXN0c2l6ZSBvZiAwIHdoaWNoIHN1cHByZXNzZXMgcHJpbnRpbmcuCisKKyAgICBzZXRfbGlzdHNpemUgMAorICAgIGdkYl90ZXN0ICJsaXN0IDEiICIiICJsaXN0c2l6ZSBvZiAwIHN1cHByZXNzZXMgb3V0cHV0IgorCisgICAgIyBUcnkgbGlzdHNpemUgb2YgLTEgd2hpY2ggaXMgc3BlY2lhbCwgYW5kIG1lYW5zIHVubGltaXRlZC4KKworICAgIHNldF9saXN0c2l6ZSAtMQorICAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICBnZGJfdGVzdCAibGlzdCAxIiAiMVxbIFx0XF0rI2luY2x1ZGUgLipcclxuMzlcWyBcdFxdK1x9IiAibGlzdCBsaW5lIDEgd2l0aCB1bmxpbWl0ZWQgbGlzdHNpemUiCit9CisKKyMKKyMgVGVzdCAibGlzdCBmaWxlbmFtZTpudW1iZXIiIGZvciBDIGluY2x1ZGUgZmlsZQorIworCitwcm9jIHRlc3RfbGlzdF9pbmNsdWRlX2ZpbGUge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJDT0ZGIgorICAgIGdkYl90ZXN0ICJsaXN0IGxpc3QwLmg6MSIgIjFcWyBcdFxdKy9cWypcXSsgQW4gaW5jbHVkZSBmaWxlIC4qNVxbIFx0XF0rZm9vIFxbKFxdK3hcWylcXSsiICJsaXN0IGxpbmUgMSBpbiBpbmNsdWRlIGZpbGUiCisKKyAgICBzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJDT0ZGIgorICAgIGdkYl90ZXN0ICJsaXN0IGxpc3QwLmg6MTAwIiAiTGluZSBudW1iZXIgOTUgb3V0IG9mIHJhbmdlOyAuKmxpc3QwLmggaGFzIDM2IGxpbmVzLiIgImxpc3QgbWVzc2FnZSBmb3IgbGluZXMgcGFzdCBFT0YiCit9CisKKyMKKyMgVGVzdCAibGlzdCBmaWxlbmFtZTpudW1iZXIiIGZvciBDIHNvdXJjZSBmaWxlCisjCisKK3Byb2MgdGVzdF9saXN0X2ZpbGVuYW1lX2FuZF9udW1iZXIge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBzZXQgdGVzdGNudCAwCisKKyAgICBzZW5kX2dkYiAibGlzdCBsaXN0MC5jOjFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIjFcWyBcdFxdKyNpbmNsdWRlIFwibGlzdDAuaFwiLio1XFsgXHRcXStpbnQgeDtcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBpbmNyIHRlc3RjbnQgCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImxpc3QgbGlzdDAuYzoxIiA7IGdkYl9zdXBwcmVzc190ZXN0cyB9CisJdGltZW91dCB7IGZhaWwgImxpc3QgbGlzdDAuYzoxICh0aW1lb3V0KSIgOyBnZGJfc3VwcHJlc3NfdGVzdHMgfQorICAgIH0KKyAgICBzZW5kX2dkYiAibGlzdCBsaXN0MC5jOjEwXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICI1XFsgXHRcXStpbnQgeDsuKjE0XFsgXHRcXStmb28gLnhcWyspXF0rO1xyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIGluY3IgdGVzdGNudCAKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibGlzdCBsaXN0LmM6MTAiIDsgZ2RiX3N1cHByZXNzX3Rlc3RzIH0KKwl0aW1lb3V0IHsgZmFpbCAibGlzdCBsaXN0LmM6MTAgKHRpbWVvdXQpIiA7IGdkYl9zdXBwcmVzc190ZXN0cyB9CisgICAgfQorICAgIHNlbmRfZ2RiICJsaXN0IGxpc3QxLmM6MVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiMVxbIFx0XF0rdm9pZC4qNVxbIFx0XF0rcHJpbnRmIFxbKFxdKy4qXFspXF0rO1xyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIGluY3IgdGVzdGNudCAKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibGlzdCBsaXN0MS5jOjEiIDsgZ2RiX3N1cHByZXNzX3Rlc3RzIH0KKwl0aW1lb3V0IHsgZmFpbCAibGlzdCBsaXN0MS5jOjEgKHRpbWVvdXQpIiA7IGdkYl9zdXBwcmVzc190ZXN0cyB9CisgICAgfQorICAgIHNlbmRfZ2RiICJsaXN0IGxpc3QxLmM6MTJcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIjdcWyBcdFxdK2xvbmdfbGluZSBcWyhcXSsuKlxbKVxdKzsuKjE0XFsgXHRcXStcfVxyXG4uKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgaW5jciB0ZXN0Y250IAorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJsaXN0IGxpc3QxLmM6MTIiIDsgZ2RiX3N1cHByZXNzX3Rlc3RzIH0KKwl0aW1lb3V0IHsgZmFpbCAibGlzdCBsaXN0MS5jOjEyICh0aW1lb3V0KSIgOyBnZGJfc3VwcHJlc3NfdGVzdHMgfQorICAgIH0KKyAgICBwYXNzICJsaXN0IGZpbGVuYW1lOm51bWJlciAoJHRlc3RjbnQgdGVzdHMpIgorICAgIGdkYl9zdG9wX3N1cHByZXNzaW5nX3Rlc3RzOworfQorCisjCisjIFRlc3QgImxpc3QgZnVuY3Rpb24iIGZvciBDIHNvdXJjZSBmaWxlCisjCisKK3Byb2MgdGVzdF9saXN0X2Z1bmN0aW9uIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBnY2NfY29tcGlsZWQKKworICAgICMgZ2NjIGFwcGVhcnMgdG8gZ2VuZXJhdGUgaW5jb3JyZWN0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgY29kZQorICAgICMgaW4gaW5jbHVkZSBmaWxlcywgd2hpY2ggYnJlYWtzIHRoaXMgdGVzdC4KKyAgICAjIFN1blBSTyBjYyBpcyB0aGUgc2Vjb25kIGNhc2UgYmVsb3csIGl0J3MgYWxzbyBjb3JyZWN0LgorICAgIHNldHVwX3hmYWlsICJhMjlrLSotdWRpIgorICAgIGdkYl90ZXN0ICJsaXN0IG1haW4iICIoNVxbIFx0XF0raW50IHg7LioxNFxbIFx0XF0rZm9vIFxbKFxdKy4qXFspXF0rO3wxXFsgXHRcXSsjaW5jbHVkZSAuKjhcWyBcdFxdK2JyZWFrcG9pbnRcWyhcXVxbKVxdKzspIiAibGlzdCBmdW5jdGlvbiBpbiBzb3VyY2UgZmlsZSAxIgorCisgICAgIyBVbHRyaXggZ2RiIHRha2VzIHRoZSBzZWNvbmQgY2FzZSBiZWxvdzsgaXQncyBhbHNvIGNvcnJlY3QuCisgICAgIyBTdW5QUk8gY2MgaXMgdGhlIHRoaXJkIGNhc2UuCisgICAgZ2RiX3Rlc3QgImxpc3QgYmFyIiAiKDFcWyBcdFxdK3ZvaWQuKjdcWyBcdFxdKmxvbmdfbGluZSAuLjsuKjlcWyBcdFxdKnwxXFsgXHRcXSt2b2lkLio4XFsgXHRcXStcfXwxXFsgXHRcXSt2b2lkLio3XFsgXHRcXSpsb25nX2xpbmUgLi47KSIgImxpc3QgZnVuY3Rpb24gaW4gc291cmNlIGZpbGUgMiIKKworICAgICMgVGVzdCAibGlzdCBmdW5jdGlvbiIgZm9yIEMgaW5jbHVkZSBmaWxlCisgICAgIyBVbHRyaXggZ2RiIGlzIHRoZSBzZWNvbmQgY2FzZSwgc3RpbGwgY29ycmVjdC4KKyAgICAjIFN1blBSTyBjYyBpcyB0aGUgdGhpcmQgY2FzZS4KKyAgICBzZXR1cF94ZmFpbCAicG93ZXJwYy0qLSoiCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJsaXN0IGZvbyIgIigzXFsgXHRcXSsuKjEyXFsgXHRcXStiYXIgXFsoXF0rLipcWylcXSs7fDJcWyBcdFxdK2luY2x1ZGluZyBmaWxlLioxMVxbIFx0XF0rYmFyIFxbKFxdKy4qXFspXF0rO3wxXFsgXHRcXSsvLiBBbiBpbmNsdWRlIGZpbGUuKjEwXFsgXHRcXStiYXIgXFsoXF0rLipcWylcXSs7KSIgImxpc3QgZnVuY3Rpb24gaW4gaW5jbHVkZSBmaWxlIgorfQorCitwcm9jIHRlc3RfbGlzdF9mb3J3YXJkIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgc2V0IHRlc3RjbnQgMAorCisgICAgc2VuZF9nZGIgImxpc3QgbGlzdDAuYzoxMFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiNVxbIFx0XF0raW50IHg7LioxNFxbIFx0XF0rZm9vIFxbKFxdKy4qXFspXF0rO1xyXG4kZ2RiX3Byb21wdCAkIiB7IGluY3IgdGVzdGNudCB9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibGlzdCBsaXN0MC5jOjEwIiA7IGdkYl9zdXBwcmVzc190ZXN0cyB9CisJdGltZW91dCB7IGZhaWwgImxpc3QgbGlzdDAuYzoxMCAodGltZW91dCkiIDsgZ2RiX3N1cHByZXNzX3Rlc3RzIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAibGlzdFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiMTVcWyBcdFxdK2ZvbyBcWyhcXSsuKlxbKVxdKzsuKjI0XFsgXHRcXStmb28gXFsoXF0rLipcWylcXSs7XHJcbiRnZGJfcHJvbXB0ICQiIHsgaW5jciB0ZXN0Y250IH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJsaXN0IDE1LTI0IiA7IGdkYl9zdXBwcmVzc190ZXN0cyB9CisJdGltZW91dCB7IGZhaWwgImxpc3QgMTUtMjQgKHRpbWVvdXQpIiA7IGdkYl9zdXBwcmVzc190ZXN0cyB9CisgICAgfQorCisgICAgc2VuZF9nZGIgImxpc3RcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIjI1XFsgXHRcXStmb28gXFsoXF0rLipcWylcXSs7LiozNFxbIFx0XF0rZm9vIFxbKFxdKy4qXFspXF0rO1xyXG4kZ2RiX3Byb21wdCAkIiB7IGluY3IgdGVzdGNudCB9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibGlzdCAyNS0zNCIgOyBnZGJfc3VwcHJlc3NfdGVzdHMgfQorCXRpbWVvdXQgeyBmYWlsICJsaXN0IDI1LTM0ICh0aW1lb3V0KSIgOyBnZGJfc3VwcHJlc3NfdGVzdHMgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJsaXN0XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIzNVxbIFx0XF0rZm9vIFxbKFxdKy4qXFspXF0rOy4qNDJcWyBcdFxdK1x9XHJcbiRnZGJfcHJvbXB0ICQiIHsgaW5jciB0ZXN0Y250IH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJsaXN0IDM1LTQyIiA7IGdkYl9zdXBwcmVzc190ZXN0cyB9CisJdGltZW91dCB7IGZhaWwgImxpc3QgMzUtNDIgKHRpbWVvdXQpIiA7IGdkYl9zdXBwcmVzc190ZXN0cyB9CisgICAgfQorCisgICAgcGFzcyAic3VjY2Vzc2l2ZSBsaXN0IGNvbW1hbmRzIHRvIHBhZ2UgZm9yd2FyZCAoJHRlc3RjbnQgdGVzdHMpIgorICAgIGdkYl9zdG9wX3N1cHByZXNzaW5nX3Rlc3RzOworfQorCitwcm9jIHRlc3RfbGlzdF9iYWNrd2FyZHMge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBzZXQgdGVzdGNudCAwCisKKyAgICBzZW5kX2dkYiAibGlzdCBsaXN0MC5jOjMzXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIyOFxbIFx0XF0rZm9vIFxbKFxdKy4qXFspXF0rOy4qMzdcWyBcdFxdK1xyXG4kZ2RiX3Byb21wdCAkIiB7IGluY3IgdGVzdGNudCB9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibGlzdCBsaXN0MC5jOjMzIiA7IGdkYl9zdXBwcmVzc190ZXN0cyB9CisJdGltZW91dCB7IGZhaWwgImxpc3QgbGlzdDAuYzozMyAodGltZW91dCkiIDsgZ2RiX3N1cHByZXNzX3Rlc3RzIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAibGlzdCAtXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIxOFxbIFx0XF0rZm9vIFxbKFxdKy4qXFspXF0rOy4qMjdcWyBcdFxdK2ZvbyBcWyhcXSsuKlxbKVxdKztcclxuJGdkYl9wcm9tcHQgJCIgeyBpbmNyIHRlc3RjbnQgfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImxpc3QgMTgtMjciIDsgZ2RiX3N1cHByZXNzX3Rlc3RzIH0KKwl0aW1lb3V0IHsgZmFpbCAibGlzdCAxOC0yNyAodGltZW91dCkiIDsgZ2RiX3N1cHByZXNzX3Rlc3RzIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAibGlzdCAtXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICI4XFsgXHRcXSticmVha3BvaW50XFsoXF1cWylcXTsuKjE3XFsgXHRcXStmb28gXFsoXF0rLipcWylcXSs7XHJcbiRnZGJfcHJvbXB0ICQiIHsgaW5jciB0ZXN0Y250IH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJsaXN0IDgtMTciIDsgZ2RiX3N1cHByZXNzX3Rlc3RzIH0KKwl0aW1lb3V0IHsgZmFpbCAibGlzdCA4LTE3ICh0aW1lb3V0KSIgOyBnZGJfc3VwcHJlc3NfdGVzdHMgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJsaXN0IC1cbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIjFcWyBcdFxdKyNpbmNsdWRlIC4qN1xbIFx0XF0rc2V0X2RlYnVnX3RyYXBzXFsoXF1cWylcXSs7XHJcbiRnZGJfcHJvbXB0ICQiIHsgaW5jciB0ZXN0Y250IH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJsaXN0IDEtNyIgOyBnZGJfc3VwcHJlc3NfdGVzdHMgfQorCXRpbWVvdXQgeyBmYWlsICJsaXN0IDEtNyAodGltZW91dCkiIDsgZ2RiX3N1cHByZXNzX3Rlc3RzIH0KKyAgICB9CisKKyAgICBwYXNzICIkdGVzdGNudCBzdWNjZXNzaXZlIFwibGlzdCAtXCIgY29tbWFuZHMgdG8gcGFnZSBiYWNrd2FyZHMiCisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7Cit9CisKKyMKKyMgVGVzdCAibGlzdCBmaXJzdCxsYXN0IgorIworCitwcm9jIHRlc3RfbGlzdF9yYW5nZSB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIGdkYl90ZXN0ICJsaXN0IGxpc3QwLmM6MixsaXN0MC5jOjUiICIyXFsgXHRcXStcclxuM1xbIFx0XF0rbWFpbiBcWykoXF0rLio1XFsgXHRcXStpbnQgeDsiICJsaXN0IHJhbmdlOyBmaWxlbmFtZTpsaW5lMSxmaWxlbmFtZTpsaW5lMiIKKworICAgIGdkYl90ZXN0ICJsaXN0IDIsNSIgIjJcWyBcdFxdK1xyXG4zXFsgXHRcXSttYWluIFxbKShcXSsuKjVcWyBcdFxdK2ludCB4OyIgImxpc3QgcmFuZ2U7IGxpbmUxLGxpbmUyIgorCisjICAgIGdkYl90ZXN0ICAgICAibGlzdCAtMSw2IiAJIkxpbmUgbnVtYmVyIDAgb3V0IG9mIHJhbmdlOyAuKmxpc3QwLmMgaGFzIDM5IGxpbmVzLiIgImxpc3QgcmFuZ2U7IGxvd2VyIGJvdW5kIG5lZ2F0aXZlIgorCisjICAgIGdkYl90ZXN0ICAgICAibGlzdCAtMTAwLC00MCIgCSJMaW5lIG51bWJlciAtNjAgb3V0IG9mIHJhbmdlOyAuKmxpc3QwLmMgaGFzIDM5IGxpbmVzLiIgImxpc3QgcmFuZ2U7IGJvdGggYm91bmRzIG5lZ2F0aXZlIgorCisgICAgZ2RiX3Rlc3QgImxpc3QgMzAsNDMiICIzMFxbIFx0XF0rZm9vIFxbKFxdKy4qXFspXF0rOy4qNDJcWyBcdFxdK1x9IiAibGlzdCByYW5nZTsgdXBwZXIgYm91bmQgcGFzdCBFT0YiCisKKyAgICBnZGJfdGVzdCAibGlzdCA0MywxMDAiICJMaW5lIG51bWJlciA0MyBvdXQgb2YgcmFuZ2U7IC4qbGlzdDAuYyBoYXMgNDIgbGluZXMuIiAibGlzdCByYW5nZTsgYm90aCBib3VuZHMgcGFzdCBFT0YiCisKKyAgICBnZGJfdGVzdCAibGlzdCBsaXN0MC5jOjIsbGlzdDEuYzoxNyIgIlNwZWNpZmllZCBzdGFydCBhbmQgZW5kIGFyZSBpbiBkaWZmZXJlbnQgZmlsZXMuIiAibGlzdCByYW5nZSwgbXVzdCBiZSBzYW1lIGZpbGVzIgorfQorCisjCisjIFRlc3QgImxpc3QgZmlsZW5hbWU6ZnVuY3Rpb24iCisjCisKK3Byb2MgdGVzdF9saXN0X2ZpbGVuYW1lX2FuZF9mdW5jdGlvbiB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIHNldCB0ZXN0Y250IDAKKworICAgICMgZ2NjIGFwcGVhcnMgdG8gZ2VuZXJhdGUgaW5jb3JyZWN0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgY29kZQorICAgICMgaW4gaW5jbHVkZSBmaWxlcywgd2hpY2ggYnJlYWtzIHRoaXMgdGVzdC4KKyAgICAjIFN1blBSTyBjYyBpcyB0aGUgc2Vjb25kIGNhc2UgYmVsb3csIGl0J3MgYWxzbyBjb3JyZWN0LgorICAgIHNldHVwX3hmYWlsICJhMjlrLSotdWRpIgorICAgIHNlbmRfZ2RiICJsaXN0IGxpc3QwLmM6bWFpblxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiMVxbIFx0XF0rI2luY2x1ZGUgLio4XFsgXHRcXSticmVha3BvaW50XFsoXF1cWylcXSs7XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgaW5jciB0ZXN0Y250CisJfQorCS1yZSAiNVxbIFx0XF0raW50IHg7LioxNFxbIFx0XF0rZm9vIFxbKFxdKy4qXFspXF0rO1xyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgImxpc3QgZnVuY3Rpb24gaW4gc291cmNlIGZpbGUgMSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibGlzdCBsaXN0MC5jOm1haW4iIH0KKwl0aW1lb3V0IHsgZmFpbCAibGlzdCBsaXN0MC5jOm1haW4gKHRpbWVvdXQpIiB9CisgICAgfQorCisgICAgIyBUaGUgaTk2MCBhbmQgYTI5ay1hbWQtdWRpIGFyZSB0aGUgc2Vjb25kIGNhc2UKKworICAgICMgTm90IHN1cmUgd2hhdCB0aGUgcG9pbnQgb2YgaGF2aW5nIHRoaXMgZnVuY3Rpb24gYmUgdW51c2VkIGlzLgorICAgICMgQUlYIGlzIGxlZ2l0aW1hdGVseSByZW1vdmluZyBpdC4KKyAgICBzZXR1cF94ZmFpbCAicnM2MDAwLSotYWl4KiIKKyAgICBzZW5kX2dkYiAibGlzdCBsaXN0MC5jOnVudXNlZFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiMzZcWyBcdFxdK1x9Lio0MlxbIFx0XF0rXH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBpbmNyIHRlc3RjbnQKKwl9CisJLXJlICIzNy4qNDJcWyBcdFxdK1x9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgaW5jciB0ZXN0Y250CisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImxpc3QgbGlzdDAuYzp1bnVzZWQiIH0KKwl0aW1lb3V0IHsgZmFpbCAibGlzdCBsaXN0MC5jOnVudXNlZCAodGltZW91dCkiIH0KKyAgICB9CisgICAgY2xlYXJfeGZhaWwgInJzNjAwMC0qLWFpeCoiCisKKyAgICAjIGdjYyBhcHBlYXJzIHRvIGdlbmVyYXRlIGluY29ycmVjdCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGNvZGUKKyAgICAjIGluIGluY2x1ZGUgZmlsZXMsIHdoaWNoIGJyZWFrcyB0aGlzIHRlc3QuCisgICAgIyBVbHRyaXggZ2RiIGlzIHRoZSBzZWNvbmQgY2FzZSwgb25lIGxpbmUgZGlmZmVyZW50IGJ1dCBzdGlsbCBjb3JyZWN0LgorICAgICMgU3VuUFJPIGNjIGlzIHRoZSB0aGlyZCBjYXNlLgorICAgIHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiAxODA0CisgICAgc2V0dXBfeGZhaWwgInBvd2VycGMtKi0qIiAxODA0CisgICAgc2V0dXBfeGZhaWwgImEyOWstKi11ZGkiCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiQ09GRiIKKyAgICBzZW5kX2dkYiAibGlzdCBsaXN0MC5oOmZvb1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiMlxbIFx0XF0raW5jbHVkaW5nIGZpbGUuICBUaGlzLioxMVxbIFx0XF0rYmFyIFxbKFxdKy4qXFspXF0rO1xyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIGluY3IgdGVzdGNudAorCX0KKwktcmUgIjFcWyBcdFxdKy8uIEFuIGluY2x1ZGUgZmlsZS4qMTBcWyBcdFxdK2JhciBcWyhcXSsuKlxbKVxdKztcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBpbmNyIHRlc3RjbnQKKwl9CisJLXJlICIzXFsgXHRcXSsuKjEyXFsgXHRcXStiYXIgXFsoXF0rLipcWylcXSs7XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgaW5jciB0ZXN0Y250CisJfQorCS1yZSAiTm8gc291cmNlIGZpbGUgbmFtZWQgbGlzdDAuaC5cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJsaXN0IGxpc3QwLmg6Zm9vIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJsaXN0IGxpc3QwLmg6Zm9vIiB9CisJdGltZW91dCB7IGZhaWwgImxpc3QgbGlzdDAuaDpmb28gKHRpbWVvdXQpIiB9CisgICAgfQorCisgICAgIyBVbHRyaXggZ2RiIGlzIHRoZSBzZWNvbmQgY2FzZS4KKyAgICAjIGEyOWstYW1kLXVkaSBpcyB0aGUgdGhpcmQgY2FzZS4KKyAgICBzZW5kX2dkYiAibGlzdCBsaXN0MS5jOmJhclxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiMVxbIFx0XF0rdm9pZC4qOFxbIFx0XF0rXH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBpbmNyIHRlc3RjbnQKKwl9CisJLXJlICIxXFsgXHRcXSt2b2lkLio3XFsgXHRcXSpsb25nX2xpbmUgLi47XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgaW5jciB0ZXN0Y250CisJfQorCS1yZSAiMVxbIFx0XF0rdm9pZC4qOVxbIFx0XF0qXHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgaW5jciB0ZXN0Y250CisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImxpc3QgbGlzdDEuYzpiYXIiIH0KKwl0aW1lb3V0IHsgZmFpbCAibGlzdCBsaXN0MS5jOmJhciAodGltZW91dCkiIH0KKyAgICB9CisKKyAgICAjIFRoZSBpOTYwIGFuZCBhMjlrLWFtZC11ZGkgYXJlIHRoZSBzZWNvbmQgY2FzZQorCisgICAgIyBOb3Qgc3VyZSB3aGF0IHRoZSBwb2ludCBvZiBoYXZpbmcgdGhpcyBmdW5jdGlvbiBiZSB1bnVzZWQgaXMuCisgICAgIyBBSVggaXMgbGVnaXRpbWF0ZWx5IHJlbW92aW5nIGl0LgorICAgIHNldHVwX3hmYWlsICJyczYwMDAtKi1haXgqIgorICAgIHNlbmRfZ2RiICJsaXN0IGxpc3QxLmM6dW51c2VkXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICI3XFsgXHRcXStsb25nX2xpbmUgXFsoXF1cWylcXTsuKjE0XFsgXHRcXStcfVxyXG4uKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgaW5jciB0ZXN0Y250CisJfQorCS1yZSAiOS4qMTRcWyBcdFxdK1x9XHJcbi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBpbmNyIHRlc3RjbnQKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibGlzdCBsaXN0MS5jOnVudXNlZCIgfQorCXRpbWVvdXQgeyBmYWlsICJsaXN0IGxpc3QxLmM6dW51c2VkICh0aW1lb3V0KSIgfQorICAgIH0KKyAgICBjbGVhcl94ZmFpbCAicnM2MDAwLSotYWl4KiIKKworICAgIHBhc3MgImxpc3QgZmlsZW5hbWU6ZnVuY3Rpb24gKCR0ZXN0Y250IHRlc3RzKSIKKworICAgICMgVGVzdCBzb21lIGludmFsaWQgc3BlY3MKKyAgICAjIFRoZSBmb2xsb3dpbmcgdGVzdCB0YWtlcyB0aGUgRklYTUUgcmVzdWx0IG9uIG1vc3Qgc3lzdGVtcyB1c2luZworICAgICMgRFdBUkYuICBJdCBmYWlscyB0byBub3RpY2UgdGhhdCBtYWluKCkgaXMgbm90IGluIHRoZSBmaWxlIHJlcXVlc3RlZC4KKyAgIAorICAgIHNldHVwX3hmYWlsICIqLSotKiIKKworIyBEb2VzIHRoaXMgYWN0dWFsbHkgd29yayBBTllXSEVSRT8gIEkgYmVsaWV2ZSBub3QsIGFzIHRoaXMgaXMgYW4gYGFzcGVjdCcgb2YKKyMgbG9va3VwX3N5bWJvbCgpLCB3aGVyZSwgd2hlbiBpdCBpcyBnaXZlbiBhIHNwZWNpZmljIHN5bXRhYiB3aGljaCBkb2VzIG5vdAorIyBjb250YWluIHRoZSByZXF1ZXN0ZWQgc3ltYm9sLCBpdCB3aWxsIHN1YnNlcXVlbnRseSBzZWFyY2ggYWxsIG9mIHRoZSBzeW10YWJzCisjIGZvciB0aGUgcmVxdWVzdGVkIHN5bWJvbC4KKworICAgIGdkYl90ZXN0ICJsaXN0IGxpc3QwLmM6Zm9vIiAiRnVuY3Rpb24gXCJmb29cIiBub3QgZGVmaW5lZCBpbiAuKmxpc3QwLmMiICJsaXN0IGZpbGVuYW1lOmZ1bmN0aW9uOyB3cm9uZyBmaWxlbmFtZSByZWplY3RlZCIKKworICAgIGdkYl90ZXN0ICJsaXN0IGZvb2Jhci5jOm1haW4iICJObyBzb3VyY2UgZmlsZSBuYW1lZCBmb29iYXIuYy4iICJsaXN0IGZpbGVuYW1lOmZ1bmN0aW9uOyBub25leGlzdGFudCBmaWxlIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJsaXN0IGxpc3QwLmg6Zm9vYmFyIiAiRnVuY3Rpb24gXCJmb29iYXJcIiBub3QgZGVmaW5lZC4iICJsaXN0IGZpbGVuYW1lOmZ1bmN0aW9uOyBub25leGlzdGFudCBmdW5jdGlvbiIKKworfQorCitwcm9jIHRlc3RfZm9yd2FyZF9zZWFyY2gge30geworCWdsb2JhbCB0aW1lb3V0CisKKwlnZGJfdGVzdCAic2V0IGxpc3RzaXplIDQiICIiCisJIyBPbiBTdW5PUzQsIHRoaXMgZ2l2ZXMgdXMgbGluZXMgMTktMjIuICBPbiBBSVgsIGl0IGdpdmVzIHVzCisJIyBsaW5lcyAyMC0yMy4gIFRoaXMgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBsaW5lIG51bWJlciBvZiBhIGZ1bmN0aW9uCisJIyBpcyBjb25zaWRlcmVkIHRvIGJlIHRoZSBvcGVuYnJhY2Ugb3IgdGhlIGZpcnN0IHN0YXRlbWVudC0tZWl0aGVyIG9uZQorCSMgaXMgYWNjZXB0YWJsZS4KKwlnZGJfdGVzdCAibGlzdCBsb25nX2xpbmUiICIyMFxbIFx0XF0rbG9uZ19saW5lIC4qIgorCisJZ2RiX3Rlc3QgInNlYXJjaCA0MzIxIiAiIG5vdCBmb3VuZCIKKworCWdkYl90ZXN0ICJzZWFyY2ggNjc4OSIgIjI0XFsgXHRcXStvb2YgLjY3ODkuOyIKKworCSMgVGVzdCB0aGF0IEdEQiB3b24ndCBjcmFzaCBpZiB0aGUgbGluZSBiZWluZyBzZWFyY2hlZCBpcyBleHRyZW1lbHkgbG9uZy4KKworCXNldCBvbGR0aW1lb3V0ICR0aW1lb3V0CisJc2V0IHRpbWVvdXQgW2V4cHIgIiR0aW1lb3V0ICsgMzAwIl0KKwl2ZXJib3NlICJUaW1lb3V0IGlzIG5vdyAkdGltZW91dCBzZWNvbmRzIiAyCisJZ2RiX3Rlc3QgInNlYXJjaCAxMjM0IiAiLioxMjM0LioiICJzZWFyY2ggZXh0cmVtZWx5IGxvbmcgbGluZSAoPiA1MDAwIGNoYXJzKSIKKwlzZXQgdGltZW91dCAkb2xkdGltZW91dAorCXZlcmJvc2UgIlRpbWVvdXQgaXMgbm93ICR0aW1lb3V0IHNlY29uZHMiIDIKK30KKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGJfc3R1Yl0geworICAgIGdkYl9zdGVwX2Zvcl9zdHViOworfQorCitnZGJfdGVzdCAic2V0IHdpZHRoIDAiICIiICJzZXQgd2lkdGggMCIKKwordGVzdF9saXN0c2l6ZQorZ2V0X2RlYnVnX2Zvcm1hdAoraWYgWyBzZXRfbGlzdHNpemUgMTAgXSB0aGVuIHsKKyAgICB0ZXN0X2xpc3RfaW5jbHVkZV9maWxlCisgICAgdGVzdF9saXN0X2ZpbGVuYW1lX2FuZF9udW1iZXIKKyAgICB0ZXN0X2xpc3RfZnVuY3Rpb24KKyAgICB0ZXN0X2xpc3RfZm9yd2FyZAorICAgIHRlc3RfbGlzdF9iYWNrd2FyZHMKKyAgICB0ZXN0X2xpc3RfcmFuZ2UKKyAgICB0ZXN0X2xpc3RfZmlsZW5hbWVfYW5kX2Z1bmN0aW9uCisgICAgdGVzdF9mb3J3YXJkX3NlYXJjaAorfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9saXN0MC5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9saXN0MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NTYxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2xpc3QwLmMKQEAgLTAsMCArMSw0MiBAQAorI2luY2x1ZGUgImxpc3QwLmgiCisKK21haW4gKCkKK3sKKyAgICBpbnQgeDsKKyNpZmRlZiB1c2VzdHVicworICAgIHNldF9kZWJ1Z190cmFwcygpOworICAgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICAgIHggPSAwOworICAgIGZvbyAoeCsrKTsKKyAgICBmb28gKHgrKyk7CisgICAgZm9vICh4KyspOworICAgIGZvbyAoeCsrKTsKKyAgICBmb28gKHgrKyk7CisgICAgZm9vICh4KyspOworICAgIGZvbyAoeCsrKTsKKyAgICBmb28gKHgrKyk7CisgICAgZm9vICh4KyspOworICAgIGZvbyAoeCsrKTsKKyAgICBmb28gKHgrKyk7CisgICAgZm9vICh4KyspOworICAgIGZvbyAoeCsrKTsKKyAgICBmb28gKHgrKyk7CisgICAgZm9vICh4KyspOworICAgIGZvbyAoeCsrKTsKKyAgICBmb28gKHgrKyk7CisgICAgZm9vICh4KyspOworICAgIGZvbyAoeCsrKTsKKyAgICBmb28gKHgrKyk7CisgICAgZm9vICh4KyspOworICAgIGZvbyAoeCsrKTsKKyAgICBmb28gKHgrKyk7CisgICAgZm9vICh4KyspOworICAgIGZvbyAoeCsrKTsKK30KKworc3RhdGljIHZvaWQKK3VudXNlZCAoKQoreworICAgIC8qIE5vdCB1c2VkIGZvciBhbnl0aGluZyAqLworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9saXN0MC5oIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9saXN0MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZDMzN2MKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2xpc3QwLmgKQEAgLTAsMCArMSwzNiBAQAorLyogQW4gaW5jbHVkZSBmaWxlIHRoYXQgYWN0dWFsbHkgY2F1c2VzIGNvZGUgdG8gYmUgZ2VuZXJhdGVkIGluIHRoZQorICAgaW5jbHVkaW5nIGZpbGUuICBUaGlzIGlzIGtub3duIHRvIGNhdXNlIHByb2JsZW1zIG9uIHNvbWUgc3lzdGVtcy4gKi8KKworc3RhdGljIHZvaWQKK2ZvbyAoeCkKK2ludCB4OworeworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbGlzdDEuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbGlzdDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTYzMmI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9saXN0MS5jCkBAIC0wLDAgKzEsMzMgQEAKK3ZvaWQKK2JhciAoeCkKK2ludCB4OworeworICAgIHByaW50ZiAoIiVkXG4iLCB4KTsKKworICAgIGxvbmdfbGluZSAoKTsKK30KKworc3RhdGljIHZvaWQKK3VudXNlZCAoKQoreworICAgIC8qIE5vdCB1c2VkIGZvciBhbnl0aGluZyAqLworfQorCisKKy8qIFRoaXMgcm91dGluZSBoYXMgYSB2ZXJ5IGxvbmcgbGluZSB0aGF0IHdpbGwgYnJlYWsgc2VhcmNoaW5nIGluIG9sZGVyCisgICB2ZXJzaW9ucyBvZiBHREIuICAqLworCitsb25nX2xpbmUgKCkKK3sKKyAgb29mICg2Nyk7CisKKyAgb29mICg2Nzg5KTsKKworICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgNSAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qIDEwICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogMTUgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAyMCAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qIDI1ICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogMzAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAzNSAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qIDQwICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogNDUgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiA1MCAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qIDU1ICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogNjAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiA2NSAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMjM0KTsgLyogNzAgKi8KK30KKworb29mIChuKQorICAgICBpbnQgbjsKK3sKKyAgcmV0dXJuIG4gKyAxOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9sb2dpY2FsLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbG9naWNhbC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1OGU2MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbG9naWNhbC5leHAKQEAgLTAsMCArMSw1NzUgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBFbGVuYSBaYW5ub25pIChlemFubm9uaUBjeWdudXMuY29tKQorCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBnZGIgdGVzdHN1aXRlCisKKyMKKyMgdGVzdHMgZm9yIGNvcnJlY3RlbnNzIG9mIGxvZ2ljYWwgb3BlcmF0b3JzLCBhc3NvY2lhdGl2aXR5IGFuZCBwcmVjZWRlbmNlCisjIHdpdGggaW50ZWdlciB0eXBlIHZhcmlhYmxlcworIyAKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCisJfQorCisjCisjIHRlc3QgcnVubmluZyBwcm9ncmFtcworIworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAiaW50LXR5cGUiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYWRkaXRpb25hbF9mbGFncz0td31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKKyAgICB9CisKKworCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworCisjCisjIHNldCBpdCB1cCBhdCBhIGJyZWFrcG9pbnQgc28gd2UgY2FuIHBsYXkgd2l0aCB0aGUgdmFyaWFibGUgdmFsdWVzCisjCisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgcGVycm9yICJjb3VsZG4ndCBydW4gdG8gYnJlYWtwb2ludCIKKyAgICBjb250aW51ZQorfQorCisjCisjIHRlc3QgZXhwcmVzc2lvbnMgd2l0aCAiaW50IiB0eXBlcworIworCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHg9MCIgIiIgInNldCB2YXJpYWJsZSB4PTAiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHk9MCIgIiIgInNldCB2YXJpYWJsZSB5PTAiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHo9MCIgIiIgInNldCB2YXJpYWJsZSB6PTAiCisKK3NlbmRfZ2RiICJwcmludCB4XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHgiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4IiB9ICAgIAorICB9CisKKworc2VuZF9nZGIgInByaW50IHlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiowLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHkiIH0gICAgCisgIH0KKworc2VuZF9nZGIgInByaW50IHpcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiowLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHoiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHoiIH0gICAgCisgIH0KKworCisjIHRydXRoIHRhYmxlcyBmb3IgJiYgLCB8fCAsICEgIAorCitzZW5kX2dkYiAicHJpbnQgeCAmJiB5XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4PHkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeDx5IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeDx5IiB9ICAgIAorICB9CisKKworCitzZW5kX2dkYiAicHJpbnQgeCB8fCB5XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4PD15IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHg8PXkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4PD15IiB9ICAgIAorICB9CisKK3NlbmRfZ2RiICJwcmludCAheFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeD55IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHg+eSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHg+eSIgfSAgICAKKyAgfQorCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHk9MSIgIiIgInNldCB2YXJpYWJsZSB5PTEiCisKK3NlbmRfZ2RiICJwcmludCB4ICYmIHlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiowLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHg8eSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4PHkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4PHkiIH0gICAgCisgIH0KKworCisKK3NlbmRfZ2RiICJwcmludCB4IHx8IHlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHg8PXkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeDw9eSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHg8PXkiIH0gICAgCisgIH0KKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB4PTEiICIiICJzZXQgdmFyaWFibGUgeD0xIgorCitzZW5kX2dkYiAicHJpbnQgeCAmJiB5XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4PHkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeDx5IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeDx5IiB9ICAgIAorICB9CisKKworCitzZW5kX2dkYiAicHJpbnQgeCB8fCB5XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4PD15IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHg8PXkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4PD15IiB9ICAgIAorICB9CisKK3NlbmRfZ2RiICJwcmludCAheFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeD55IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHg+eSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHg+eSIgfSAgICAKKyAgfQorCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHk9MCIgIiIgInNldCB2YXJpYWJsZSB5PTAiCisKK3NlbmRfZ2RiICJwcmludCB4ICYmIHlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiowLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHg8eSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4PHkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4PHkiIH0gICAgCisgIH0KKworCisKK3NlbmRfZ2RiICJwcmludCB4IHx8IHlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHg8PXkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeDw9eSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHg8PXkiIH0gICAgCisgIH0KKworCisjIGVuZCB0cnV0aCB0YWJsZXMgZm9yICYmLCB8fCwgIQorCisKKyMgdGVzdCBhc3NvY2lhdGl2aXR5IG9mICYmICwgfHwgLCAhCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeD0wIiAiIiAic2V0IHZhcmlhYmxlIHg9MCIKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeT0wIiAiIiAic2V0IHZhcmlhYmxlIHk9MCIKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgej0wIiAiIiAic2V0IHZhcmlhYmxlIHo9MCIKKworc2VuZF9nZGIgInByaW50IHggJiYgeSAmJiB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4ICYmICB5ICYmIHogKDAwMCkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeCAmJiB5ICYmIHogKDAwMCkgIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeCAmJiB5ICYmIHogKDAwMCkgIiB9ICAgIAorICB9CisKK3NlbmRfZ2RiICJwcmludCB4IHx8IHkgfHwgelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCB8fCB5IHx8IHogKDAwMCkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeCB8fCB5IHx8IHogKDAwMCkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4IHx8IHkgfHwgeiAoMDAwKSAiIH0gICAgCisgIH0KKworc2VuZF9nZGIgInByaW50ICEheFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgISF4ICgwKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAhIXggKDApIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgISF4ICgwKSAiIH0gICAgCisgIH0KKworCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHk9MSIgIiIgInNldCB2YXJpYWJsZSB5PTEiCisKK3NlbmRfZ2RiICJwcmludCB4ICYmIHkgJiYgelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCAmJiAgeSAmJiB6ICgwMTApIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHggJiYgeSAmJiB6ICgwMTApICIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHggJiYgeSAmJiB6ICgwMTApICIgfSAgICAKKyAgfQorCitzZW5kX2dkYiAicHJpbnQgeCB8fCB5IHx8IHpcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHggfHwgeSB8fCB6ICgwMTApIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHggfHwgeSB8fCB6ICgwMTApIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeCB8fCB5IHx8IHogKDAxMCkgIiB9ICAgIAorICB9CisKKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB6PTEiICIiICJzZXQgdmFyaWFibGUgej0xIgorCitzZW5kX2dkYiAicHJpbnQgeCAmJiB5ICYmIHpcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiowLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHggJiYgIHkgJiYgeiAoMDExKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4ICYmIHkgJiYgeiAoMDExKSAiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4ICYmIHkgJiYgeiAoMDExKSAiIH0gICAgCisgIH0KKworc2VuZF9nZGIgInByaW50IHggfHwgeSB8fCB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4IHx8IHkgfHwgeiAoMDExKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4IHx8IHkgfHwgeiAoMDExKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHggfHwgeSB8fCB6ICgwMTEpICIgfSAgICAKKyAgfQorCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeD0xIiAiIiAic2V0IHZhcmlhYmxlIHg9MSIKKworc2VuZF9nZGIgInByaW50IHggJiYgeSAmJiB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4ICYmICB5ICYmIHogKDExMSkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeCAmJiB5ICYmIHogKDExMSkgIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeCAmJiB5ICYmIHogKDExMSkgIiB9ICAgIAorICB9CisKK3NlbmRfZ2RiICJwcmludCB4IHx8IHkgfHwgelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCB8fCB5IHx8IHogKDExMSkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeCB8fCB5IHx8IHogKDExMSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4IHx8IHkgfHwgeiAoMTExKSAiIH0gICAgCisgIH0KKworc2VuZF9nZGIgInByaW50ICEheFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgISF4ICgxKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAhIXggKDEpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgISF4ICgxKSAiIH0gICAgCisgIH0KKworCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHo9MCIgIiIgInNldCB2YXJpYWJsZSB6PTAiCisKK3NlbmRfZ2RiICJwcmludCB4ICYmIHkgJiYgelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCAmJiAgeSAmJiB6ICgxMTApIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHggJiYgeSAmJiB6ICgxMTApICIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHggJiYgeSAmJiB6ICgxMTApICIgfSAgICAKKyAgfQorCitzZW5kX2dkYiAicHJpbnQgeCB8fCB5IHx8IHpcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHggfHwgeSB8fCB6ICgxMTApIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHggfHwgeSB8fCB6ICgxMTApIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeCB8fCB5IHx8IHogKDExMCkgIiB9ICAgIAorICB9CisKKworCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeT0wIiAiIiAic2V0IHZhcmlhYmxlIHk9MCIKKworc2VuZF9nZGIgInByaW50IHggJiYgeSAmJiB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4ICYmICB5ICYmIHogKDEwMCkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeCAmJiB5ICYmIHogKDEwMCkgIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeCAmJiB5ICYmIHogKDEwMCkgIiB9ICAgIAorICB9CisKK3NlbmRfZ2RiICJwcmludCB4IHx8IHkgfHwgelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCB8fCB5IHx8IHogKDEwMCkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeCB8fCB5IHx8IHogKDEwMCkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4IHx8IHkgfHwgeiAoMTAwKSAiIH0gICAgCisgIH0KKworCisKKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB6PTEiICIiICJzZXQgdmFyaWFibGUgej0xIgorCitzZW5kX2dkYiAicHJpbnQgeCAmJiB5ICYmIHpcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiowLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHggJiYgIHkgJiYgeiAoMTAxKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4ICYmIHkgJiYgeiAoMTAxKSAiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4ICYmIHkgJiYgeiAoMTAxKSAiIH0gICAgCisgIH0KKworc2VuZF9nZGIgInByaW50IHggfHwgeSB8fCB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4IHx8IHkgfHwgeiAoMTAxKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4IHx8IHkgfHwgeiAoMTAxKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHggfHwgeSB8fCB6ICgxMDEpICIgfSAgICAKKyAgfQorCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeD0wIiAiIiAic2V0IHZhcmlhYmxlIHg9MCIKKworc2VuZF9nZGIgInByaW50IHggJiYgeSAmJiB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4ICYmICB5ICYmIHogKDAwMSkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeCAmJiB5ICYmIHogKDAwMSkgIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeCAmJiB5ICYmIHogKDAwMSkgIiB9ICAgIAorICB9CisKK3NlbmRfZ2RiICJwcmludCB4IHx8IHkgfHwgelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCB8fCB5IHx8IHogKDAwMSkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeCB8fCB5IHx8IHogKDAwMSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4IHx8IHkgfHwgeiAoMDAxKSAiIH0gICAgCisgIH0KKworCisKKworIyB0ZXN0IHByZWNlZGVuY2Ugb2YgJiYsIHx8ICwhIAorCisKK3NlbmRfZ2RiICJwcmludCAheCAmJiB5XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAheCAmJiB5ICAoMDApIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICAheCAmJiB5ICgwMCkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAheCAmJiB5ICgwMCkgIiB9ICAgIAorICB9CisKKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB4PTEiICIiICJzZXQgdmFyaWFibGUgeD0xIgorCisKK3NlbmRfZ2RiICJwcmludCAheCAmJiB5XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAheCAmJiB5ICAoMTApIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICAheCAmJiB5ICgxMCkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAheCAmJiB5ICgxMCkgIiB9ICAgIAorICB9CisKKworCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeT0xIiAiIiAic2V0IHZhcmlhYmxlIHk9MSIKKworc2VuZF9nZGIgInByaW50ICF4IHx8IHlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICF4IHx8IHkgICgxMSkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgICF4IHx8IHkgKDExKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mICF4IHx8IHkgKDExKSAiIH0gICAgCisgIH0KKworCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHg9MCIgIiIgInNldCB2YXJpYWJsZSB4PTAiCisKKworc2VuZF9nZGIgInByaW50ICF4IHx8IHlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICF4IHx8IHkgICgwMSkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgICF4IHx8IHkgKDAxKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mICF4IHx8IHkgKDAxKSAiIH0gICAgCisgIH0KKworCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeD0xIiAiIiAic2V0IHZhcmlhYmxlIHg9MSIKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgej0wIiAiIiAic2V0IHZhcmlhYmxlIHo9MCIKKworc2VuZF9nZGIgInByaW50IHggfHwgeSAmJiB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4IHx8IHkgJiYgeiAgKDExMCkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgIHggfHwgeSAmJiB6ICgxMTApIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeCB8fCB5ICYmIHogKDExMCkgIiB9ICAgIAorICB9CisKKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB5PTAiICIiICJzZXQgdmFyaWFibGUgeT0wIgorCisKK3NlbmRfZ2RiICJwcmludCB4IHx8IHkgJiYgelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCB8fCB5ICYmIHogKDEwMCkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgIHggfHwgeSAmJiB6ICgxMDApIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeCB8fCB5ICYmIHogKDEwMCkgIiB9ICAgIAorICB9CisKKworCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHg9MCIgIiIgInNldCB2YXJpYWJsZSB4PTAiCisKK3NlbmRfZ2RiICJwcmludCB4IHx8ICF5ICYmIHpcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiowLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIAorICAgICAgICAgZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB4PTEiICIiICJzZXQgdmFyaWFibGUgeD0xIgorICAgICAgICAgc2VuZF9nZGIgInByaW50IHggfHwgIXkgJiYgelxuIgorICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHggfHwgIXkgJiYgeiAiCisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICB4IHx8ICF5ICYmIHoiIH0KKyAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4IHx8ICF5ICYmIHogIiB9ICAgIAorICAgICAgICAgICB9CisgICAgfSAgICAgICAKKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAgeCB8fCB5ICYmIHogIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeCB8fCB5ICYmIHogIiB9ICAgIAorIH0KKworCisKKworCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHg9MSIgIiIgInNldCB2YXJpYWJsZSB4PTEiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHk9MiIgIiIgInNldCB2YXJpYWJsZSB5PTIiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHc9MyIgIiIgInNldCB2YXJpYWJsZSB3PTMiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHo9MyIgIiIgInNldCB2YXJpYWJsZSB6PTMiCisKKworc2VuZF9nZGIgInByaW50IHggPiB5IHx8IHcgPT0gelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCA+IHkgfHwgdyA9PSB6IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICB4ID4geSB8fCB3ID09IHoiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4ID4geSB8fCB3ID09IHogIiB9ICAgIAorICB9CisKKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB4PTEiICIiICJzZXQgdmFyaWFibGUgeD0xIgorZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB5PTIiICIiICJzZXQgdmFyaWFibGUgeT0yIgorZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB3PTEiICIiICJzZXQgdmFyaWFibGUgdz0xIgorZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB6PTMiICIiICJzZXQgdmFyaWFibGUgej0zIgorCisKK3NlbmRfZ2RiICJwcmludCB4ID49IHkgJiYgdyAhPSB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4ID49IHkgfHwgdyAhPSB6IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICB4ID49IHkgfHwgdyAhPSB6IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeCA+PSB5IHx8IHcgIT0geiAiIH0gICAgCisgIH0KKworCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeD0yIiAiIiAic2V0IHZhcmlhYmxlIHg9MiIKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeT0yIiAiIiAic2V0IHZhcmlhYmxlIHk9MiIKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgdz0yIiAiIiAic2V0IHZhcmlhYmxlIHc9MiIKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgej0zIiAiIiAic2V0IHZhcmlhYmxlIHo9MyIKKworCitzZW5kX2dkYiAicHJpbnQgISB4ID4geSB8fCB3ICsgelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCA+IHkgfHwgdyAhPSB6IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICB4ID4geSB8fCB3ICE9IHoiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4ID4geSB8fCB3ICE9IHogIiB9ICAgIAorICB9CisKKworCisKKworCisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9sb25nX2xvbmcuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbG9uZ19sb25nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2NTI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbG9uZ19sb25nLmMKQEAgLTAsMCArMSw1NSBAQAorLyogVGVzdCBsb25nIGxvbmcgZXhwcmVzc2lvbjsgdGVzdCBwcmludGluZyBpbiBnZW5lcmFsLgorICoKKyAqIC9DTE8vQlVJTERfRU5WL0V4cG9ydHMvY2MgLWcgK2UgLW8gbG9uZ19sb25nIGxvbmdfbG9uZy5jCisgKgorICogb3IKKyAqCisgKiBjYyArZSArREEyLjAgLWcgLW8gbG9uZ19sb25nIGxvbmdfbG9uZy5jCisgKi8KKworbG9uZyBsb25nIGNhbGxlZSggaSApCitsb25nIGxvbmcgaTsKK3sKKyAgIHJlZ2lzdGVyIGxvbmcgbG9uZyByZXN1bHQ7CisKKyAgIHJlc3VsdCAgPSAweDEyMzQ1Njc4OworICAgcmVzdWx0ICA9IHJlc3VsdCA8PCBpOworICAgcmVzdWx0ICs9IDB4OWFiY2RlZjA7CisKKyAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBrbm93bl90eXBlcygpCit7CisgICBsb25nIGxvbmcgYmluID0gMCwgb2N0ID0gMCwgZGVjID0gMCwgaGV4ID0gMDsKKworICAgLyogS25vd24gdmFsdWVzLCBmaWxsaW5nIHRoZSBmdWxsIDY0IGJpdHMuCisgICAgKi8KKyAgIGJpbiA9IDB4MTIzNDU2Nzg5YWJjZGVmTEw7IC8qIDY0IGJpdHMgPSAxNiBoZXggZGlnaXRzICovCisgICBvY3QgPSAwMTIzNDU2NzEyMzQ1NjcwMTIzNDU2N0xMOyAvKiAgPSAyMSsgb2N0YWwgZGlnaXRzICovCisgICBkZWMgPSAxMjM0NTY3ODkwMTIzNDU2Nzg5MExMOyAgICAvKiAgPSAxOSsgZGVjaW1hbCBkaWdpdHMgKi8KKworICAgLyogU3RvcCBoZXJlIGFuZCBsb29rIQorICAgICovCisgICBoZXggPSBiaW4gLSBkZWMgfCBvY3Q7Cit9CisKK2ludCBtYWluKCkgeworCisgICByZWdpc3RlciBsb25nIGxvbmcgeCwgeTsKKyAgIHJlZ2lzdGVyIGxvbmcgbG9uZyBpOworICAgCisgICB4ID0gKGxvbmcgbG9uZykgMHhmZWRjYmE5ODc2NTQzMjEwTEw7CisgICB5ID0geCsrOworICAgeCArPXk7CisgICBpID0gMTE7CisgICB4ID0gY2FsbGVlKCBpICk7CisgICB5ICs9IHg7CisKKyAgIGtub3duX3R5cGVzKCk7CisgICAKKyAgIHJldHVybiAwOworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9sb25nX2xvbmcuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9sb25nX2xvbmcuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYTU5YzIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2xvbmdfbG9uZy5leHAKQEAgLTAsMCArMSwxNjMgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKworIyBsb25nX2xvbmcuZXhwICAgVGVzdCBwcmludGluZyBvZiA2NC1iaXQgdGhpbmdzIGluIDMyLWJpdCBnZGIuCisjICAgICAgICAgICAgICAgICBBbHNvIHRlc3QgZGlmZmVybmV0IGtpbmRzIG9mIGZvcm1hdHMuCisjCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHRlc3RmaWxlIGxvbmdfbG9uZworc2V0IHNyY2ZpbGUgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKKyMgV2hhdCBjb21waWxlciBhcmUgd2UgdXNpbmc/CisjCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0geworICAgIHJldHVybiAtMQorfQorCitpZiB7JGdjY19jb21waWxlZCA9PSAwfSB7CisgICAgaWYgW2lzdGFyZ2V0ICJocHBhKi1ocC1ocHV4KiJdIHRoZW4geworCSMjIyBGSVhNRSArZSBvbmx5IHdvcmtzIHdpdGggSFAncyBjb21waWxlcgorCXNldCBhZGRpdGlvbmFsX2ZsYWdzICJhZGRpdGlvbmFsX2ZsYWdzPStlIC13IgorICAgIH0gZWxzZSB7CisJIyBkb24ndCBrbm93IHdoYXQgdGhlIGNvbXBpbGVyIGlzLCBob3BlIGl0IHN1cHBvcnRzIGxvbmcgbG9uZyEKKwlzZXQgYWRkaXRpb25hbF9mbGFncyAiYWRkaXRpb25hbF9mbGFncz0tdyIKKyAgICB9Cit9IGVsc2UgeworICAgIHNldCBhZGRpdGlvbmFsX2ZsYWdzICJhZGRpdGlvbmFsX2ZsYWdzPS13IgorfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIFtsaXN0IGRlYnVnICRhZGRpdGlvbmFsX2ZsYWdzXV0gIT0gIiIgfSB7CisgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKKyMgdXNlIHRoaXMgdG8gZGVidWc6CisjbG9nX3VzZXIgMQorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworaWYgeyAhW3J1bnRvIGtub3duX3R5cGVzXSB9IHRoZW4geyAKKyAgIGZhaWwgInJ1biB0byBrbm93bl90eXBlcyIgCisgICByZXR1cm4gCit9CisKK2dkYl90ZXN0ICJuIDQiICAgIi4qMzQuKiIgImdldCB0byBrbm93biBwbGFjZSIKKworIyBDaGVjayB0aGUgaGFjayBmb3IgbG9uZyBsb25nIHByaW50cy4KKyMKK2dkYl90ZXN0ICJwL3ggaGV4IiAiLioweDAuKiIgImRlZmF1bHQgcHJpbnQgaGV4IgorZ2RiX3Rlc3QgInAveCBkZWMiICIuKjB4YWI1NGE5OGNlYjFmMGFkMi4qIiAiZGVmYXVsdCBwcmludCBkZWMiCitnZGJfdGVzdCAicC94IGJpbiIgIi4qMHgxMjM0NTY3ODlhYmNkZWYuKiIgImRlZmF1bHQgcHJpbnQgYmluIgorZ2RiX3Rlc3QgInAveCBvY3QiICIuKjB4YTcyZWU1Mzk3NzA1Mzk3Ny4qIiAiZGVmYXVsdCBwcmludCBvY3QiCisKK2dkYl90ZXN0ICJwL3ggaGV4IiAiLioweDAuKiIgImhleCBwcmludCIKK2dkYl90ZXN0ICJwL3UgZGVjIiAiLioxMjM0NTY3ODkwMTIzNDU2Nzg5MC4qIiAiZGVjaW1hbCBwcmludCIKK2dkYl90ZXN0ICJwL3QgYmluIiAiLioxMDAxMDAwMTEwMTAwMDEwMTAxMTAwMTExMTAwMDEwMDExMDEwMTAxMTExMDAxMTAxMTExMDExMTEuKiIgImJpbmFyeSBwcmludCIKK2dkYl90ZXN0ICJwL28gb2N0IiAiLiowMTIzNDU2NzEyMzQ1NjcwMTIzNDU2Ny4qIiAib2N0YWwgcHJpbnQiCisKKyMgVHJ5IGFsbCB0aGUgY29tYmluYXRpb25zIHRvIGJ1bXAgdXAgY292ZXJhZ2UuCisjCitnZGJfdGVzdCAicC9kIG9jdCIgIi4qMTIwNDY4MTgwODgyMzUzODMxNTkuKiIgIiIKK2dkYl90ZXN0ICJwL3Ugb2N0IiAiLioweGE3MmVlNTM5NzcwNTM5NzcuKiIgIiIKK2dkYl90ZXN0ICJwL28gb2N0IiAiLiouKiIgIiIKK2dkYl90ZXN0ICJwL3Qgb2N0IiAiLioxMDEwMDExMTAwMTAxMTEwMTExMDAxMDEwMDExMTAwMTAxMTEwMTExMDAwMDAxMDEwMDExMTAwMTAxMTEwMTExLioiICIiCitnZGJfdGVzdCAicC9hIG9jdCIgIi4qVGhhdCBvcGVyYXRpb24gaXMgbm90IGF2YWlsYWJsZS4qIiAiIgorZ2RiX3Rlc3QgInAvYyBvY3QiICIuKjB4YTcyZWU1Mzk3NzA1Mzk3Ny4qIiAiIgorZ2RiX3Rlc3QgInAvZiBvY3QiICIuKi01Ljk4MjI2NTM3OTc2MTU3MjNlLTEyMC4qIiAiIgorCitnZGJfdGVzdCAicC9kICooaW50ICopJm9jdCIgIi4qLTE0OTAwOTg4ODcuKiIgIiIKK2dkYl90ZXN0ICJwL3UgKihpbnQgKikmb2N0IiAiLioyODA0ODY4NDA5LioiICIiCitnZGJfdGVzdCAicC9vICooaW50ICopJm9jdCIgIi4qMDI0NzEzNTYyNDcxLioiICIiCitnZGJfdGVzdCAicC90ICooaW50ICopJm9jdCIgIi4qMTAxMDAxMTEwMDEwMTExMDExMTAwMTAxMDAxMTEwMDEuKiIgIiIKK2dkYl90ZXN0ICJwL2EgKihpbnQgKikmb2N0IiAiLioweGE3MmVlNTM5LioiICIiCitnZGJfdGVzdCAicC9jICooaW50ICopJm9jdCIgIi4qNTcgJzknLioiICIiCitnZGJfdGVzdCAicC9mICooaW50ICopJm9jdCIgIi4qLTIuNDI3MTYxMjZlLTE1LioiICIiCisKK2dkYl90ZXN0ICJwL2QgKihzaG9ydCAqKSZvY3QiICIuKi0yMjczOC4qIiAiIgorZ2RiX3Rlc3QgInAvdSAqKHNob3J0ICopJm9jdCIgIi4qNDI3OTguKiIgIiIKK2dkYl90ZXN0ICJwL28gKihzaG9ydCAqKSZvY3QiICIuKjAxMjM0NTYuKiIgIiIKK2dkYl90ZXN0ICJwL3QgKihzaG9ydCAqKSZvY3QiICIuKjEwMTAwMTExMDAxMDExMTAuKiIgIiIKK2dkYl90ZXN0ICJwL2EgKihzaG9ydCAqKSZvY3QiICIuKjB4ZmZmZmE3MmUuKiIgIiIKK2dkYl90ZXN0ICJwL2MgKihzaG9ydCAqKSZvY3QiICIuKiA0NiAnLicuKiIgIiIKK2dkYl90ZXN0ICJwL2EgKipzaG9ydCAqKSZvY3QiICIuKjB4ZmZmZmE3MmUgPC4qIiAiIgorZ2RiX3Rlc3QgInAvZiAqKHNob3J0ICopJm9jdCIgIi4qLTIyNzM4LioiICIiCisKK2dkYl90ZXN0ICJ4L3ggJm9jdCIgIi4qMHhhNzJlZTUzOS4qIiAiIgorZ2RiX3Rlc3QgIngvZCAmb2N0IiAiLiouLTE0OTAwOTg4ODcqIiAiIgorZ2RiX3Rlc3QgIngvdSAmb2N0IiAiLioyODA0ODY4NDA5LioiICIiCitnZGJfdGVzdCAieC9vICZvY3QiICIuKjAyNDcxMzU2MjQ3MS4qIiAiIgorZ2RiX3Rlc3QgIngvdCAmb2N0IiAiLioxMDEwMDExMTAwMTAxMTEwMTExMDAxMDEwMDExMTAwMS4qIiAiIgorZ2RiX3Rlc3QgIngvYSAmb2N0IiAiLioweGE3MmVlNTM5IDwuKiIgIiIKK2dkYl90ZXN0ICJ4L2MgJm9jdCIgIi4qLTg5ICdNLScnLioiICIiCitnZGJfdGVzdCAieC9mICZvY3QiICIuKi01Ljk4MjI2NTM3OTc2MTU3MjNlLTEyMC4qIiAiIgorCitnZGJfdGVzdCAieC8yeCAmb2N0IiAiLiouKiIgIiIKK2dkYl90ZXN0ICJ4LzJkICZvY3QiICIuKi4qIiAiIgorZ2RiX3Rlc3QgIngvMnUgJm9jdCIgIi4qLioiICIiCitnZGJfdGVzdCAieC8ybyAmb2N0IiAiLiouKiIgIiIKK2dkYl90ZXN0ICJ4LzJ0ICZvY3QiICIuKi4qIiAiIgorZ2RiX3Rlc3QgIngvMmEgJm9jdCIgIi4qLioiICIiCitnZGJfdGVzdCAieC8yYyAmb2N0IiAiLiouKiIgIiIKK2dkYl90ZXN0ICJ4LzJmICZvY3QiICIuKi4qIiAiIgorCitnZGJfdGVzdCAieC8yYnggJm9jdCIgIi4qLioiICIiCitnZGJfdGVzdCAieC8yYmQgJm9jdCIgIi4qLioiICIiCitnZGJfdGVzdCAieC8yYnUgJm9jdCIgIi4qLioiICIiCitnZGJfdGVzdCAieC8yYm8gJm9jdCIgIi4qLioiICIiCitnZGJfdGVzdCAieC8yYnQgJm9jdCIgIi4qLioiICIiCitnZGJfdGVzdCAieC8yYmEgJm9jdCIgIi4qLioiICIiCitnZGJfdGVzdCAieC8yYmMgJm9jdCIgIi4qLioiICIiCitnZGJfdGVzdCAieC8yYmYgJm9jdCIgIi4qLioiICIiCisKK2dkYl90ZXN0ICJ4LzJoeCAmb2N0IiAiLiouKiIgIiIKK2dkYl90ZXN0ICJ4LzJoZCAmb2N0IiAiLiouKiIgIiIKK2dkYl90ZXN0ICJ4LzJodSAmb2N0IiAiLiouKiIgIiIKK2dkYl90ZXN0ICJ4LzJobyAmb2N0IiAiLiouKiIgIiIKK2dkYl90ZXN0ICJ4LzJodCAmb2N0IiAiLiouKiIgIiIKK2dkYl90ZXN0ICJ4LzJoYSAmb2N0IiAiLiouKiIgIiIKK2dkYl90ZXN0ICJ4LzJoYyAmb2N0IiAiLiouKiIgIiIKK2dkYl90ZXN0ICJ4LzJoZiAmb2N0IiAiLiouKiIgIiIKKworZ2RiX3Rlc3QgIngvMnd4ICZvY3QiICIuKi4qIiAiIgorZ2RiX3Rlc3QgIngvMndkICZvY3QiICIuKi4qIiAiIgorZ2RiX3Rlc3QgIngvMnd1ICZvY3QiICIuKi4qIiAiIgorZ2RiX3Rlc3QgIngvMndvICZvY3QiICIuKi4qIiAiIgorZ2RiX3Rlc3QgIngvMnd0ICZvY3QiICIuKi4qIiAiIgorZ2RiX3Rlc3QgIngvMndhICZvY3QiICIuKi4qIiAiIgorZ2RiX3Rlc3QgIngvMndjICZvY3QiICIuKi4qIiAiIgorZ2RiX3Rlc3QgIngvMndmICZvY3QiICIuKi4qIiAiIgorCitnZGJfdGVzdCAieC8yZ3ggJm9jdCIgIi4qLioiICIiCitnZGJfdGVzdCAieC8yZ2QgJm9jdCIgIi4qLioiICIiCitnZGJfdGVzdCAieC8yZ3UgJm9jdCIgIi4qLioiICIiCitnZGJfdGVzdCAieC8yZ28gJm9jdCIgIi4qLioiICIiCitnZGJfdGVzdCAieC8yZ3QgJm9jdCIgIi4qLioiICIiCitnZGJfdGVzdCAieC8yZ2EgJm9jdCIgIi4qLioiICIiCitnZGJfdGVzdCAieC8yZ2MgJm9jdCIgIi4qLioiICIiCitnZGJfdGVzdCAieC8yZ2YgJm9jdCIgIi4qLioiICIiCisKK2dkYl9leGl0CityZXR1cm4gMApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tMzJyLmxkIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tMzJyLmxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NjA3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL20zMnIubGQKQEAgLTAsMCArMSwxNjAgQEAKK09VVFBVVF9GT1JNQVQoImVsZjMyLW0zMnIiLCAiZWxmMzItbTMyciIsCisJICAgICAgImVsZjMyLW0zMnIiKQorT1VUUFVUX0FSQ0gobTMycikKK0VOVFJZKF9zdGFydCkKKyBTRUFSQ0hfRElSKC91c3IvY3lnbnVzL20zMnItOTYxMDE4L0gtc3BhcmMtc3VuLXN1bm9zNC4xLy9saWIpOworLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitTRUNUSU9OUworeworICAgICBPVkVSTEFZIDB4MzAwMDAwIDogQVQgKDB4NDAwMDAwKQorICAgICAgICB7CisgICAgICAgICAgLm92bHkwIHsgZm9vLm8oLnRleHQpIH0KKyAgICAgICAgICAub3ZseTEgeyBiYXIubygudGV4dCkgfQorICAgICAgICB9CisgICAgIE9WRVJMQVkgMHgzODAwMDAgOiBBVCAoMHg0ODAwMDApCisgICAgICAgIHsKKyAgICAgICAgICAub3ZseTIgeyBiYXoubygudGV4dCkgfQorICAgICAgICAgIC5vdmx5MyB7IGdyYngubygudGV4dCkgfQorICAgICAgICB9CisgICAgIE9WRVJMQVkgMHgzNDAwMDAgOiBBVCAoMHg0NDAwMDApCisgICAgICAgIHsKKyAgICAgICAgICAuZGF0YTAwIHsgZm9vLm8oLmRhdGEpIH0KKyAgICAgICAgICAuZGF0YTAxIHsgYmFyLm8oLmRhdGEpIH0KKyAgICAgICAgfQorICAgICBPVkVSTEFZIDB4M0MwMDAwIDogQVQgKDB4NEMwMDAwKQorICAgICAgICB7CisgICAgICAgICAgLmRhdGEwMiB7IGJhei5vKC5kYXRhKSB9CisgICAgICAgICAgLmRhdGEwMyB7IGdyYngubyguZGF0YSkgfQorICAgICAgICB9CisKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSAweDIwODAwMDsKKyAgLmludGVycCAgICAgICAgOiB7ICooLmludGVycCkgCX0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmluaXQgICAgICA6IHsgKigucmVsLmluaXQpCX0KKyAgLnJlbGEuaW5pdCAgICAgOiB7ICooLnJlbGEuaW5pdCkJfQorICAucmVsLmZpbmkgICAgICA6IHsgKigucmVsLmZpbmkpCX0KKyAgLnJlbGEuZmluaSAgICAgOiB7ICooLnJlbGEuZmluaSkJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQkJfSA9MAorICAucGx0ICAgICAgICAgICA6IHsgKigucGx0KQkJfQorICAudGV4dCAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0KQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICAgICooLmdudS5saW5rb25jZS50KikKKyAgfSA9MAorICBfZXRleHQgPSAuOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAuZmluaSAgICAgICAgICA6IHsgKiguZmluaSkJCX0gPTAKKyAgLnJvZGF0YSAgICAgICAgOiB7ICooLnJvZGF0YSkgKiguZ251LmxpbmtvbmNlLnIqKSB9CisgIC5yb2RhdGExICAgICAgIDogeyAqKC5yb2RhdGExKQl9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCisgICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLworICAuID0gQUxJR04oMzIpICsgKEFMSUdOKDgpICYgKDMyIC0gMSkpOworICAuZGF0YSAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmdudS5saW5rb25jZS5kKikKKyAgICBfb3ZseV90YWJsZSA9IC47IAorICAgICAgX292bHkwX2VudHJ5ID0gLjsKKwlMT05HKEFCU09MVVRFKEFERFIoLm92bHkwKSkpOworCUxPTkcoU0laRU9GKC5vdmx5MCkpOworCUxPTkcoTE9BREFERFIoLm92bHkwKSk7CisJTE9ORygwKTsKKyAgICAgIF9vdmx5MV9lbnRyeSA9IC47CisJTE9ORyhBQlNPTFVURShBRERSKC5vdmx5MSkpKTsKKwlMT05HKFNJWkVPRigub3ZseTEpKTsKKwlMT05HKExPQURBRERSKC5vdmx5MSkpOworCUxPTkcoMCk7CisgICAgICBfb3ZseTJfZW50cnkgPSAuOworCUxPTkcoQUJTT0xVVEUoQUREUigub3ZseTIpKSk7CisJTE9ORyhTSVpFT0YoLm92bHkyKSk7CisJTE9ORyhMT0FEQUREUigub3ZseTIpKTsKKwlMT05HKDApOworICAgICAgX292bHkzX2VudHJ5ID0gLjsKKwlMT05HKEFCU09MVVRFKEFERFIoLm92bHkzKSkpOworCUxPTkcoU0laRU9GKC5vdmx5MykpOworCUxPTkcoTE9BREFERFIoLm92bHkzKSk7CisJTE9ORygwKTsKKyAgICAgIF9kYXRhMDBfZW50cnkgPSAuOworCUxPTkcoQUJTT0xVVEUoQUREUiguZGF0YTAwKSkpOworCUxPTkcoU0laRU9GKC5kYXRhMDApKTsKKwlMT05HKExPQURBRERSKC5kYXRhMDApKTsKKwlMT05HKDApOworICAgICAgX2RhdGEwMV9lbnRyeSA9IC47CisJTE9ORyhBQlNPTFVURShBRERSKC5kYXRhMDEpKSk7CisJTE9ORyhTSVpFT0YoLmRhdGEwMSkpOworCUxPTkcoTE9BREFERFIoLmRhdGEwMSkpOworCUxPTkcoMCk7CisgICAgICBfZGF0YTAyX2VudHJ5ID0gLjsKKwlMT05HKEFCU09MVVRFKEFERFIoLmRhdGEwMikpKTsKKwlMT05HKFNJWkVPRiguZGF0YTAyKSk7CisJTE9ORyhMT0FEQUREUiguZGF0YTAyKSk7CisJTE9ORygwKTsKKyAgICAgIF9kYXRhMDNfZW50cnkgPSAuOworCUxPTkcoQUJTT0xVVEUoQUREUiguZGF0YTAzKSkpOworCUxPTkcoU0laRU9GKC5kYXRhMDMpKTsKKwlMT05HKExPQURBRERSKC5kYXRhMDMpKTsKKwlMT05HKDApOworICAgIF9ub3ZseXMgPSAuOworCUxPTkcoKF9ub3ZseXMgLSBfb3ZseV90YWJsZSkgLyAxNik7CisKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICAuZGF0YTEgICAgICAgICA6IHsgKiguZGF0YTEpCQl9CisgIC5jdG9ycyAgICAgICAgIDogeyAqKC5jdG9ycykJCX0KKyAgLmR0b3JzICAgICAgICAgOiB7ICooLmR0b3JzKQkJfQorICAuZ290ICAgICAgICAgICA6IHsgKiguZ290LnBsdCkgKiguZ290KX0KKyAgLmR5bmFtaWMgICAgICAgOiB7ICooLmR5bmFtaWMpCX0KKyAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHMKKyAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzbworICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqLworICAuc2RhdGEgICAgICAgICA6IHsgKiguc2RhdGEpCQl9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuc2JzcyAgICAgICAgICA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfQorICAuYnNzICAgICAgICAgICA6IHsgKiguZHluYnNzKSAqKC5ic3MpICooQ09NTU9OKSB9CisgIF9lbmQgPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiIDAgICAgICAgIDogeyAqKC5zdGFiKQkJfQorICAuc3RhYnN0ciAwICAgICA6IHsgKiguc3RhYnN0cikJfQorICAuc3RhYi5leGNsIDAgICA6IHsgKiguc3RhYi5leGNsKQl9CisgIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKQl9CisgIC5zdGFiLmluZGV4IDAgIDogeyAqKC5zdGFiLmluZGV4KQl9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgMCAgICAgOiB7ICooLmNvbW1lbnQpCX0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIC5kZWJ1ZyBEV0FSRiBzZWN0aW9uIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgICBzZWN0aW9uIHNvIHdlIGJlZ2luIC5kZWJ1ZyBhdCAwLiAgSXQncyBub3QgY2xlYXIgeWV0IHdoYXQgbmVlZHMgdG8gaGFwcGVuCisgICAgIGZvciB0aGUgb3RoZXJzLiAgICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgCSAgfQorICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpCSAgfQorICAuc3RhY2sgICAweDVmZmZmYyA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0KKyAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAgLiAgKi8KK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTMycm92bHkuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTMycm92bHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGI5MGZlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tMzJyb3ZseS5jCkBAIC0wLDAgKzEsMjI1IEBACisKKy8qCisgKiBPdmx5bWdyLmMgLS0gUnVudGltZSBPdmVybGF5IE1hbmFnZXIgZm9yIHRoZSBHREIgdGVzdHN1aXRlLgorICovCisKKyNpbmNsdWRlICJvdmx5bWdyLmgiCisKKy8qIExvY2FsIGZ1bmN0aW9ucyBhbmQgZGF0YTogKi8KKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX292bHlfdGFibGVbXVs0XTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIF9ub3ZseXMgX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24gKCIuZGF0YSIpKSk7CitlbnVtIG92bHlfaW5kZXggeyBWTUEsIFNJWkUsIExNQSwgTUFQUEVEfTsKKworc3RhdGljIHZvaWQgb3ZseV9jb3B5ICh1bnNpZ25lZCBsb25nIGRzdCwgdW5zaWduZWQgbG9uZyBzcmMsIGxvbmcgc2l6ZSk7CisKKy8qIEZsdXNoIHRoZSBkYXRhIGFuZCBpbnN0cnVjdGlvbiBjYWNoZXMgYXQgYWRkcmVzcyBTVEFSVCBmb3IgU0laRSBieXRlcy4KKyAgIFN1cHBvcnQgZm9yIGVhY2ggbmV3IHBvcnQgbXVzdCBiZSBhZGRlZCBoZXJlLiAgKi8KKy8qIEZJWE1FOiBNaWdodCBiZSBiZXR0ZXIgdG8gaGF2ZSBhIHN0YW5kYXJkIGxpYmdsb3NzIGZ1bmN0aW9uIHRoYXQKKyAgIHBvcnRzIHByb3ZpZGUgdGhhdCB3ZSBjYW4gdGhlbiB1c2UuICBVc2UgbGliZ2xvc3MgaW5zdGVhZCBvZiBuZXdsaWIKKyAgIHNpbmNlIGxpYmdsb3NzIGlzIHRoZSBvbmUgaW50ZW5kZWQgdG8gaGFuZGxlIGxvdyBsZXZlbCBzeXN0ZW0gaXNzdWVzLgorICAgSSB3b3VsZCBzdWdnZXN0IHNvbWV0aGluZyBsaWtlIF9mbHVzaF9jYWNoZSB0byBhdm9pZCB0aGUgdXNlcidzIG5hbWVzcGFjZQorICAgYnV0IG5vdCBiZSBjb21wbGV0ZWx5IG9ic2N1cmUgYXMgb3RoZXIgdGhpbmdzIG1heSBuZWVkIHRoaXMgZmFjaWxpdHkuICAqLworIAorc3RhdGljIHZvaWQKK0ZsdXNoQ2FjaGUgKHZvaWQpCit7CisjaWZkZWYgX19NMzJSX18KKyAgdm9sYXRpbGUgY2hhciAqbXNwciA9IChjaGFyICopIDB4ZmZmZmZmZjc7CisgICptc3ByID0gMTsKKyNlbmRpZgorfQorCisvKiBPdmVybGF5TG9hZDoKKyAqIENvcHkgdGhlIG92ZXJsYXkgaW50byBpdHMgcnVudGltZSByZWdpb24sCisgKiBhbmQgbWFyayB0aGUgb3ZlcmxheSBhcyAibWFwcGVkIi4KKyAqLworCitib29sCitPdmVybGF5TG9hZCAodW5zaWduZWQgbG9uZyBvdmx5bm8pCit7CisgIHVuc2lnbmVkIGxvbmcgaTsKKworICBpZiAob3ZseW5vIDwgMCB8fCBvdmx5bm8gPj0gX25vdmx5cykKKyAgICBleGl0ICgtMSk7CS8qIGZhaWwsIGJhZCBvdmx5IG51bWJlciAqLworCisgIGlmIChfb3ZseV90YWJsZVtvdmx5bm9dW01BUFBFRF0pCisgICAgcmV0dXJuIFRSVUU7CS8qIHRoaXMgb3ZlcmxheSBhbHJlYWR5IG1hcHBlZCAtLSBub3RoaW5nIHRvIGRvISAqLworCisgIGZvciAoaSA9IDA7IGkgPCBfbm92bHlzOyBpKyspCisgICAgaWYgKGkgPT0gb3ZseW5vKQorICAgICAgX292bHlfdGFibGVbaV1bTUFQUEVEXSA9IDE7CS8qIHRoaXMgb25lIG5vdyBtYXBwZWQgKi8KKyAgICBlbHNlIGlmIChfb3ZseV90YWJsZVtpXVtWTUFdID09IF9vdmx5X3RhYmxlW292bHlub11bVk1BXSkKKyAgICAgIF9vdmx5X3RhYmxlW2ldW01BUFBFRF0gPSAwOwkvKiB0aGlzIG9uZSBub3cgdW4tbWFwcGVkICovCisKKyAgb3ZseV9jb3B5IChfb3ZseV90YWJsZVtvdmx5bm9dW1ZNQV0sIAorCSAgICAgX292bHlfdGFibGVbb3ZseW5vXVtMTUFdLCAKKwkgICAgIF9vdmx5X3RhYmxlW292bHlub11bU0laRV0pOworCisgIEZsdXNoQ2FjaGUgKCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIE92ZXJsYXlVbmxvYWQ6CisgKiBDb3B5IHRoZSBvdmVybGF5IGJhY2sgaW50byBpdHMgImxvYWQiIHJlZ2lvbi4KKyAqIERvZXMgTk9UIG1hcmsgb3ZlcmxheSBhcyAidW5tYXBwZWQiLCB0aGVyZWZvcmUgbWF5IGJlIGNhbGxlZAorICogbW9yZSB0aGFuIG9uY2UgZm9yIHRoZSBzYW1lIG1hcHBlZCBvdmVybGF5LgorICovCisgCitib29sCitPdmVybGF5VW5sb2FkICh1bnNpZ25lZCBsb25nIG92bHlubykKK3sKKyAgaWYgKG92bHlubyA8IDAgfHwgb3ZseW5vID49IF9ub3ZseXMpCisgICAgZXhpdCAoLTEpOyAgLyogZmFpbCwgYmFkIG92bHkgbnVtYmVyICovCisgCisgIGlmICghX292bHlfdGFibGVbb3ZseW5vXVtNQVBQRURdKQorICAgIGV4aXQgKC0xKTsgIC8qIGVycm9yLCBjYW4ndCBjb3B5IG91dCBhIHNlZ21lbnQgdGhhdCdzIG5vdCAiaW4iICovCisgCisgIG92bHlfY29weSAoX292bHlfdGFibGVbb3ZseW5vXVtMTUFdLCAKKwkgICAgIF9vdmx5X3RhYmxlW292bHlub11bVk1BXSwKKwkgICAgIF9vdmx5X3RhYmxlW292bHlub11bU0laRV0pOworCisgIHJldHVybiBUUlVFOworfQorCisjaWZkZWYgX19EMTBWX18KKyNkZWZpbmUgSU1BUDAgICAgICAgKCooc2hvcnQgKikoMHhmZjAwKSkKKyNkZWZpbmUgSU1BUDEgICAgICAgKCooc2hvcnQgKikoMHhmZjAyKSkKKyNkZWZpbmUgRE1BUCAgICAgICAgKCooc2hvcnQgKikoMHhmZjA0KSkKKworc3RhdGljIHZvaWQKK0QxMFZUcmFuc2xhdGUgKHVuc2lnbmVkIGxvbmcgbG9naWNhbCwKKwkgICAgICAgc2hvcnQgKmRtYXAsCisJICAgICAgIHVuc2lnbmVkIGxvbmcgKiphZGRyKQoreworICB1bnNpZ25lZCBsb25nIHBoeXNpY2FsOworICB1bnNpZ25lZCBsb25nIHNlZzsKKyAgdW5zaWduZWQgbG9uZyBvZmY7CisKKyAgLyogdG8gYWNjZXNzIGRhdGEsIHdlIHVzZSB0aGUgZm9sbG93aW5nIG1hcHBpbmcgCisgICAgIDB4MDB4eHh4eHg6IExvZ2ljYWwgZGF0YSBhZGRyZXNzIHNlZ21lbnQgICAgICAgIChETUFQIHRyYW5zbGF0ZWQgbWVtb3J5KQorICAgICAweDAxeHh4eHh4OiBMb2dpY2FsIGluc3RydWN0aW9uIGFkZHJlc3Mgc2VnbWVudCAoSU1BUCB0cmFuc2xhdGVkIG1lbW9yeSkKKyAgICAgMHgxMHh4eHh4eDogUGh5c2ljYWwgZGF0YSBtZW1vcnkgc2VnbWVudCAgICAgICAgKE9uLWNoaXAgZGF0YSBtZW1vcnkpCisgICAgIDB4MTF4eHh4eHg6IFBoeXNpY2FsIGluc3RydWN0aW9uIG1lbW9yeSBzZWdtZW50IChPbi1jaGlwIGluc24gbWVtb3J5KQorICAgICAweDEyeHh4eHh4OiBQaGlzaWNhbCB1bmlmaWVkIG1lbW9yeSBzZWdtZW50ICAgICAoVW5pZmllZCBtZW1vcnkpCisgICAgICovCisKKyAgLyogQWRkcmVzc2VzIG11c3QgYmUgY29ycmVjdGx5IGFsaWduZWQgKi8KKyAgaWYgKGxvZ2ljYWwgJiAoc2l6ZW9mICgqKmFkZHIpIC0gMSkpCisgICAgZXhpdCAoLTEpOworCisgIC8qIElmIHRoZSBhZGRyZXNzIGlzIGluIG9uZSBvZiB0aGUgdHdvIGxvZ2ljYWwgYWRkcmVzcyBzcGFjZXMsIGl0IGlzCisgICAgIGZpcnN0IHRyYW5zbGF0ZWQgaW50byBhIHBoeXNpY2FsIGFkZHJlc3MgKi8KKyAgc2VnID0gKGxvZ2ljYWwgPj4gMjQpOworICBvZmYgPSAobG9naWNhbCAmIDB4ZmZmZmZmTCk7CisgIHN3aXRjaCAoc2VnKSAKKyAgICAgIHsKKyAgICAgIGNhc2UgMHgwMDogLyogaW4gbG9naWNhbCBkYXRhIGFkZHJlc3Mgc2VnbWVudCAqLworCWlmIChvZmYgPD0gMHg3ZmZmTCkKKwkgIHBoeXNpY2FsID0gKDB4MTBMIDw8IDI0KSArIG9mZjsKKwllbHNlCisJICAvKiBMb2dpY2FsIGFkZHJlc3Mgb3V0IHNpZGUgb2Ygb24tY2hpcCBzZWdtZW50LCBub3QKKyAgICAgICAgICAgICBzdXBwb3J0ZWQgKi8KKwkgIGV4aXQgKC0xKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHgwMTogLyogaW4gbG9naWNhbCBpbnN0cnVjdGlvbiBhZGRyZXNzIHNlZ21lbnQgKi8KKwl7CisJICBzaG9ydCBtYXA7CisJICBpZiAob2ZmIDw9IDB4MWZmZmZMKQorCSAgICBtYXAgPSBJTUFQMDsKKwkgIGVsc2UgaWYgKG9mZiA8PSAweDNmZmZmTCkKKwkgICAgbWFwID0gSU1BUDE7CisJICBlbHNlCisJICAgIC8qIExvZ2ljYWwgYWRkcmVzcyBvdXRzaWRlIG9mIElNQVBbMDFdIHNlZ21lbnQsIG5vdAorCSAgICAgICBzdXBwb3J0ZWQgKi8KKwkgICAgZXhpdCAoLTEpOworCSAgaWYgKG1hcCAmIDB4MTAwMEwpCisJICAgIHsKKwkgICAgLyogSW5zdHJ1Y3Rpb24gbWVtb3J5ICovCisJICAgICAgcGh5c2ljYWwgPSAoMHgxMUwgPDwgMjQpIHwgb2ZmOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgLyogVW5pZmllZCBtZW1vcnkgKi8KKwkgICAgICBwaHlzaWNhbCA9ICgobWFwICYgMHg3ZkwpIDw8IDE3KSArIChvZmYgJiAweDFmZmZmTCk7CisJICAgICAgaWYgKHBoeXNpY2FsID4gMHhmZmZmZmZMKQorCQkvKiBBZGRyZXNzIG91dHNpZGUgb2YgdW5pZmllZCBhZGRyZXNzIHNlZ21lbnQgKi8KKwkJZXhpdCAoLTEpOworCSAgICAgIHBoeXNpY2FsIHw9ICgweDEyTCA8PCAyNCk7CisJICAgIH0KKwkgIGJyZWFrOworCX0KKyAgICAgIGNhc2UgMHgxMDoKKyAgICAgIGNhc2UgMHgxMToKKyAgICAgIGNhc2UgMHgxMjoKKwlwaHlzaWNhbCA9IGxvZ2ljYWw7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCWV4aXQgKC0xKTsJLyogZXJyb3IgKi8KKyAgICAgIH0KKworICBzZWcgPSAocGh5c2ljYWwgPj4gMjQpOworICBvZmYgPSAocGh5c2ljYWwgJiAweGZmZmZmZkwpOworICBzd2l0Y2ggKHNlZykgCisgICAgeworICAgIGNhc2UgMHgxMDoJLyogZHN0IGlzIGEgMTUgYml0IG9mZnNldCBpbnRvIHRoZSBvbi1jaGlwIG1lbW9yeSAqLworICAgICAgKmRtYXAgPSAwOworICAgICAgKmFkZHIgPSAobG9uZyAqKSAoMHgwMDAwICsgKChzaG9ydClvZmYgJiAweDdmZmYpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMToJLyogZHN0IGlzIGFuIDE4LWJpdCBvZmZzZXQgaW50byB0aGUgb24tY2hpcAorCQkgICBpbnN0cnVjdGlvbiBtZW1vcnkgKi8KKyAgICAgICpkbWFwID0gMHgxMDAwTCB8ICgob2ZmICYgMHgzZmZmZkwpID4+IDE0KTsKKyAgICAgICphZGRyID0gKGxvbmcgKikgKDB4ODAwMCArICgoc2hvcnQpb2ZmICYgMHgzZmZmKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTI6CS8qIGRzdCBpcyBhIDI0LWJpdCBvZmZzZXQgaW50byB1bmlmaWVkIG1lbW9yeSAqLworICAgICAgKmRtYXAgPSBvZmYgPj4gMTQ7CisgICAgICAqYWRkciA9IChsb25nICopICgweDgwMDAgKyAoKHNob3J0KW9mZiAmIDB4M2ZmZikpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGV4aXQgKC0xKTsJLyogZXJyb3IgKi8KKyAgICB9Cit9CisjZW5kaWYgLyogX19EMTBWX18gKi8KKworc3RhdGljIHZvaWQKK292bHlfY29weSAodW5zaWduZWQgbG9uZyBkc3QsIHVuc2lnbmVkIGxvbmcgc3JjLCBsb25nIHNpemUpCit7CisjaWZkZWYgIF9fTTMyUl9fCisgIG1lbWNweSAoKHZvaWQgKikgZHN0LCAodm9pZCAqKSBzcmMsIHNpemUpOworICByZXR1cm47CisjZW5kaWYgLyogTTMyUiAqLworCisjaWZkZWYgIF9fRDEwVl9fCisgIHVuc2lnbmVkIGxvbmcgKnMsICpkLCB0bXA7CisgIHNob3J0IGRtYXBfc3JjLCBkbWFwX2RzdDsKKyAgc2hvcnQgZG1hcF9zYXZlOworCisgIC8qIGFsbCBzZWN0aW9uIHNpemVzIHNob3VsZCBieSBtdWx0aXBsZXMgb2YgNCBieXRlcyAqLworICBkbWFwX3NhdmUgPSBETUFQOworCisgIEQxMFZUcmFuc2xhdGUgKHNyYywgJmRtYXBfc3JjLCAmcyk7CisgIEQxMFZUcmFuc2xhdGUgKGRzdCwgJmRtYXBfZHN0LCAmZCk7CisKKyAgd2hpbGUgKHNpemUgPiAwKQorICAgIHsKKyAgICAgIC8qIE5COiBUcmFuc2ZlciA0IGJ5dGUgKGxvbmcpIHF1YW50aXRlcywgcHJvYmxlbXMgb2NjdXJlCisJIHdoZW4gb25seSB0d28gYnl0ZXMgYXJlIHRyYW5zZmVyZWQgKi8KKyAgICAgIERNQVAgPSBkbWFwX3NyYzsKKyAgICAgIHRtcCA9ICpzOworICAgICAgRE1BUCA9IGRtYXBfZHN0OworICAgICAgKmQgPSB0bXA7IAorICAgICAgZCsrOworICAgICAgcysrOworICAgICAgc2l6ZSAtPSBzaXplb2YgKHRtcCk7CisgICAgICBzcmMgKz0gc2l6ZW9mICh0bXApOworICAgICAgZHN0ICs9IHNpemVvZiAodG1wKTsKKyAgICAgIGlmICgoc3JjICYgMHgzZmZmKSA9PSAwKQorCUQxMFZUcmFuc2xhdGUgKHNyYywgJmRtYXBfc3JjLCAmcyk7CisgICAgICBpZiAoKGRzdCAmIDB4M2ZmZikgPT0gMCkKKwlEMTBWVHJhbnNsYXRlIChkc3QsICZkbWFwX2RzdCwgJmQpOworICAgIH0KKyAgRE1BUCA9IGRtYXBfc2F2ZTsKKyNlbmRpZiAvKiBEMTBWICovCit9CisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTY4ay1hb3V0LnUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstYW91dC51Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOTVmYzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstYW91dC51CkBAIC0wLDAgKzEsNDU5IEBACitiZWdpbiA3NzcgbTY4ay1hb3V0CitNICAgISJQICAkICAgICEgICAgICAgICAgIyRAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICRZNl9fIShVU0IgMl5YICEkR00gIDBGMyRKPDlPUllUVjQiNjhQQ1MgICAkIDBPLjAgICQgME8iUlw1CitNOD9cICAgJSJXT1AgIyJcIDg/XCAgIC0uNihdLFtDQiBfXyEuN0RZVTNFOCAgJFk+M0c0ICAkQC4gICAgCitNICRDNyAgIVAgJiAgICApLjdEWVUyIFggICAgIDItPCAgJyAgOCAgICBEWT4zRzUoI0AgICAgIShVUCAgCitNPCAhQCAgICIzRVkuPTRALiAgICAgJEM3ICAhUCAmICAgICkuN0RZVTIgWCAgICAgMi08ICAnICA4ICAgCitNIERZPjNHNSgjQCAgICAhKFVQICA8ICFAICAgIjNFWS49NEAuICAgICAkQzcgICEiQCYgICAgKS43RFlVCitNMiBYICAgICAyLTwgICQqIDggICAgRFk+M0c1KCNAICAgICEoVVAgIDBIIUAgICAiM0VZLj00QC4gICAgCitNICRDNyAgISJAJiAgICApLjdEWVUyIFggICAgIDItPCAgJCogOCAgICBEWT4zRzUoI0AgICAgIShVUCAgCitNMEghQCAgICIzRVkuPTRALiAgICAgJEM3ICAjUiAlUC84ICAgIERZPjNHNSgjQCAgICAhKFVQICBcQCE8CitNI1YgICAgKS43RFlVMiBYICAgICAyLTwgICQoWSAgIDAtIS9cICAkICAhIFYkX1AgIEAgICQjQFNfICAjCitNICAgMC5DL1wgIDAgICEgXCxfUCAhMCAgJCNZUCFCLyAgICAwMCcgJyhcICAgISEkPCBAQ1AgICAkJEFQCitNIjIvICAgIDAzJyAqKFwgICAhITA8IExDUCAgICQlMENfJCsoICAgICAhITgoX1EgOjAgICAgIDA3Ii9cCitNICAgICAgICAkJiAzXjAgICQjMCAgISFEJF9EICAhIFYgICAwOUEvWSAgIDAuICAgJCZAU14wICAkI0ggCitNICEhTCxfRCAgISBcICAgMDwjL1kgICAwL0AgICQnMENeMCAgJCQgICAhIVwoX0QgICEhJCAgIDBBIi9ZCitNICAgMDIgICAkKFBDXjAgICQkUCAgISI0KF9EICAhITAgICAwRyIvWSAgIDA1ICAgJCowQ14wICAkJUAgCitNICEiTChfRCAgISE8ICAgME0iL1kgICAwOCAgICQrQENfICAgJCMwICAhIyQoX1AgICEgViAgIDBSIi9cCitNICAgMC4gICAkLFBDXyAgICQjSCAgISMwKF9QICAhIFwgICAwVSIvXCAgIDAvQCAgJC1AQ18gICAkJCAgCitNICEjPChfUCAgISEkICAgMFgiL1wgICAwMiAgICQuMENfICAgJCRQICAhI0goX1AgICEhMCAgIDBbIi9cCitNICAgMDUgICAkLyBDXyAgICQlQCAgISNUKF9QICAhITwgICAwXicgIihcICAgISc0PCAoQ1AgICAkPUFQCitNIDIvICAgIDFYJyAhKFwgICAhJzwoX0QgICEkXCAgIDExIy9ZICAgMSsgICAkMzEuN0RZVTAiQEMqNjFCCitNPidBWCtHLCktMlhSKCJBIjk3KUs5NlFFPjJEQC1SXFEsQlxYLTAgIDInRCAgISdIKCdEICAhJ0QzSSE4CitNQ1RZUiJIUS41QCAgOD9cICAgIDYrUlggIiYnXyAgICAlJUIvM0VZLj0wICAzRTggICRZPjNHNS41QCAgCitNPCAlLjAiLyAgICAzWScjXzNFWS49MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAhICwgICAgICRZVSAgISAqIixJOFcpVCwiWUMiMzBOLUIgSDBGNVI6VjVMOTdESSgjLE8sUyBPCitNLiMsICAgICAgICAhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAhIDAgICYwICAgICAgICAgIlAwICApKCAgICE0ICAgICRWMCAgICAgICAhNCAgICAmWCAgCitNICAgICAgICAgICAgLzggICAgICAgICAgICAgIDNYICAgICAgICAgICAgICA8SCAgICAgICAgICAgICAgCitNQyggICAgICAgICAgICAgIElYICAgICAgICAgICAgICBROCAgICAgICAgICAgICAgV1ggICAgICAgICAgCitNICAgIF4oICAgICAgICAgICAgICEiOCAgICAgICAgICAgICAhJyggICAgICAgICAgICAgISooICAgICAgCitNICAgICAgICEsQiAgICAkICAgICAgICAhLyIgICAgJCAgICAgICAgITMyICAgICQgICAgICAgICE4IiAgCitNICAoICAgICAgICAhOlIgICAgKCAgICAgICAgIT8yICAgICggICAgICAgICFEMiAgICAwICAgICAgICAhCitNRkIgICAgMCAgICAgICAgIUpCICAgIDAgICAgICAgICFPIiAgICAwICAgICAgICAhUUIgICAgMCAgICAgCitNICAgIVVSICAgIDAgICAgICAgICFaQiAgICAwICAgICAgICAhXTIgICAgQCAgICAgICAgIiBCICAgICQgCitNICAgICAgICInMiAgICAkICAgICAgICAiLTIgICAgJCAgICAgICAgIjYyICAgICggICAgICAgICI9MiAgCitNICAoICAgICAgICAiQ0IgICAgKCAgICAgICAgIkxSICAgIDAgICAgICAgICJTMiAgICAwICAgICAgICAiCitNWSIgICAgMCAgICAgICAgIyFSICAgIDAgICAgICAgICMmIiAgICAwICAgICAgICAjLCIgICAgMCAgICAgCitNICAgIzJCICAgIDAgICAgICAgICM5QiAgICBAICAgICAgICAjQSIgICAgJCAgICAgICAgI0ZCICAgICQgCitNICAgICAgICNNIiAgICAkICAgICAgICAjVFIgICAgKCAgICAgICAgI1pCICAgICggICAgICAgICQhMiAgCitNICAoICAgICAgICAkKTIgICAgMCAgICAgICAgJC5CICAgIDAgICAgICAgICQ0UiAgICAwICAgICAgICAkCitNPDIgICAgMCAgICAgICAgJEEiICAgIDAgICAgICAgICRHQiAgICAwICAgICAgICAkTkIgICAgMCAgICAgCitNICAgJFQyICAgIEAgICAgICAgICRaSCAgICFDX19fTCUgICAlQFIgICAhQCAgICAgICAgJUQyICAgIUAgCitNICAgICAgICYqWCAgICBDX19fTCUgICAmTyIgICAgQCAgICAgICAgJlIiICAgIEAgICAgICAgICc2QjAgCitNICAkICAgITQgICAgICQwICAnRCAgICE+ICAgJzoyMCAgICQgICAhSCAgICAgJDAgICdIICAgIVIgICAnCitNP1IwICAgJCAgICFcICAgICAkMCAgJ0wgICAiJiAgICdFUjAgICAoICAgIjAgICAgICQwICAnVCAgICI6CitNICAgJ0lSMCAgICggICAiRCAgICAgJDAgICdYICAgIk4gICAnT0IwICAgKCAgICJYICAgICAkMCAgJ1wgCitNICAjIiAgICdVUjAgICAwICAgIywgICAgICQwICAoJCAgICM2ICAgJ1kyMCAgIDAgICAjQCAgICAgJDAgCitNICgoICAgI0ogICAnXkIwICAgMCAgICNUICAgICAkMCAgKCwgICAjXiAgICgkMjAgICAwICAgJCggICAgCitNICQwICAoNCAgICQyICAgKCgiMCAgIDAgICAkPCAgICAgJDAgICg4ICAgJEYgICAoLUIwICAgMCAgICRQCitNICAgICAkMCAgKDwgICAkWiAgICgzQjAgICAwICAgJSQgICAgICQwICAoRCAgICUuICAgKDdCMCAgIEAgCitNICAlOiAgICAgJDAgIChIICAgJUQgICAoPCggICApQ19fX0wlICAgKFciICAgKUAgICAgICAgIChZWCAgCitNICkjX19fTCUgICApKVIgICApICAgICAgICAgKSxCICAgIDAgICAgICAgICk1SCAgICAzX19fTCUgICApCitNPzIgICAgMCAgICAgICAgKUMiICAgIDAgICAgICAgIClKSCAgICAzX19fTCUgICApUUIgICAgMCAgICAgCitNICAgKVUoICAgIDNfX19MJSAgIClcSCAgICAzX19fTCUgICAqI0ggICAgM19fX0wlICAgKiZYICAgIDNfCitNX19MJSAgICoyIjAgICAwICAgJVAgICAgICQwICArKCAgICVaICAgICAkMCAgKywgICAlWiAgICAgJDAgCitNICswICAgJVogICAgICQwICArNCAgICVaICAgICAkMCAgKzggICAmICAgICAgJDAgICs8ICAgJiggICAgCitNICQwICArQCAgICYwICAgICAkMCAgK0QgICAmMCAgICAgJDAgICtIICAgJjggICAgICQwICArTCAgICZACitNICAgICAkMCAgK1AgICAmSCAgICAgJDAgICtUICAgJkggICAgICQwICArWCAgICZQICAgICAkMCAgK1wgCitNICAmWCAgICAgJDAgICwgICAgJyAgICAgICQwICAsJCAgICcgICAgICAkMCAgLCggICAnKCAgICAgJDAgCitNICwsICAgJzAgICAgICQwICAsMCAgICc4ICAgICAkMCAgLDQgICAnOCAgICAgJDAgICw4ICAgJ0IgICAgCitNICQwICAsPCAgICdWICAgICAkMCAgLEAgICAnViAgICAgJDAgICxEICAgJ1YgICAgICQwICAsSCAgICggCitNICAgICAkMCAgLEwgICAoKiAgICAgJDAgICxQICAgKDQgICAgICQwICAsVCAgICg0ICAgICAkMCAgLFggCitNICAoPiAgICAgJDAgICxcICAgKEggICAgICQwICAtICAgIChSICAgICAkMCAgLSQgICAoUiAgICAgJDAgCitNIC0oICAgKFwgICAgICQwICAtLCAgICkmICAgICAkMCAgLTAgICApMCAgICAgJDAgIC00ICAgKTAgICAgCitNICQwICAtOCAgICk6ICAgICAkMCAgLTwgICApRCAgICAgJDAgIC1AICAgKU4gICAgICQwICAtRCAgIClOCitNICAgICAkMCAgLUggICApWCAgICAgJDAgIC1MICAgKiwgICAgICQwICAtUCAgICosICAgICAkMCAgLVQgCitNICAqNiAgICAgJDAgIC1YICAgKkAgICAgICQwICAtXCAgICpKICAgICAkMCAgLiAgICAqSiAgICAgJDAgCitNIC4kICAgKlQgICAgICQwICAuKCAgICpeICAgICAkMCAgLiwgICArKCAgICAgJDAgIC4wICAgKyggICAgCitNICQwICAuNCAgICsyICAgICAkMCAgLjggICArPCAgICAgJDAgIC48ICAgK0YgICAgICQwICAuQCAgICtGCitNICAgICAkMCAgLkQgICArUCAgICAgJDAgIC5IICAgK1ogICAgICQwICAuTCAgICwkICAgICAkMCAgLlAgCitNICAsJCAgICAgJDAgIC5UICAgLC4gICAgICQwICAuWCAgICw4ICAgICAkMCAgLlwgICAsOCAgICAgJDAgCitNIC8gICAgLEAgICAgICQwICAvJCAgICxIICAgICAkMCAgLyggICAsUCAgICAgJDAgIC8sICAgLFggICAgCitNICQwICAvMCAgICxYICAgICAkMCAgLzQgICAtIiAgICAgJDAgIC84ICAgLSIgICAgICQwICAvPCAgIC0sCitNICAgKjQgMCAgLzwgICAtMCAgICo1IDAgICAgICAgLTAgICAqNyAwICAgICAgIC4oICAgKjhQMCAhTiggCitNICAuRCAgICo6UDAgIFk4ICAgLkwgICAqPFAwICFOKCAgIC5UICAgKj8gPCAhNyggICEgJCAgICpBMDQgCitNITBYICAgICAgICAqQlA0ICBXWCAgICVQICAgKkQwNCAgWiAgICAuKCAgICpFUDQgIUJYICAgISogICAqCitNSFA8ICApKCAgISAoICAgKkpARCAhVDggICEgVCAgICpMQEQgIV5YICAhIFYgICAqUDBEICEmOCAgISBYCitNICAgKlRARCAhWUggICEgWiAgICpWUEQgICRQICAhIFwgICAqWlBEICA9SCAgISBeICAgKl8wRCAhXyAgCitNICEhICAgICshIEQgIiQwICAhISQgICArJEBEICFIICAgISEoICAgKyhARCAhW0QgICEhLCAgICsqQEQgCitNIiYkICAhITAgICArLjBEICEtRCAgISE0ICAgKzJARCAhTEAgICEhOCAgICs0UEQgITZMICAhITwgICArCitNNzBEICFXLCAgISFEICAgKzpQRCAhRVQgICEhRiAgICtAIEQgISZEICAhIUggICArRVBEICBJRCAgISFMCitNICAgK0lARCAgJlQgICEhUCAgICtPIEQgITIsICAhIVQgICArVSBEICFNVCAgISFcICAgK1gwRCAgQCwgCitNICEiJCAgICtdMEQgIDBEICAhIiwgICAsIlBEICA7TCAgISI0ICAgLCYwRCAgKjQgICEiPCAgICwrQEQgCitNIVRcICAhIkQgICAsMTBEICA8VCAgISJMICAgLDUgRCAgK0QgICEiVCAgICw5IEQgIiUoICAhIyQgICAsCitNPSBEICBfSCAgISMoICAgLEJQRCAhLEAgICEjLCAgICxJIEQgIUI4ICAhIzAgICAsTTBEICFBMCAgISM0CitNICAgLFMwRCAhWlAgICEjOCAgICxZUEQgIT9IICAhIzwgICAsXUBEICBcWCAgISNAICAgLSMgRCAiKDAgCitNICEjRCAgIC0pIEQgIEpYICAhI0ggICAtLSBEICFPMCAgISNMICAgLTJQRCAhXCggICEjUCAgIC05IEQgCitNIE84ICAhI1QgICAtPTBEICFUMCAgISNYICAgLUFQRCAhUkwgICEjXCAgIC1EQEQgIVJQICAhJDQgICAtCitNRzBEICFcOCAgISRMICAgLUlARCAhUiAgICEkVCAgIC1MIDQgIFpMICAgITQgICAtTzA0ICFWXCAgICFICitNICAgLVQwNCAhRzQgICAhXCAgIC1ZUDQgIThUICAgIjAgICAtXTA0ICEnPCAgICJEICAgLiJANCAgSCwgCitNICAiWCAgIC4oMDQgIVpcICAgIywgICAuKzA0ICAvLCAgICNAICAgLjAgNCAhLDQgICAjVCAgIC41MDQgCitNICxcICAgJCggICAuOEA0ICEpLCAgICQ8ICAgLj1ANCAgWUQgICAkUCAgIC5DIDQgITI8ICAgJSQgICAuCitNRkA0ICEpVCAgICU6ICAgLkowRCAhVDQgICEkXCAgIC5MMEQgIVg0ICAhJSQgICAuTjBEICFcXCAgISc0CitNICAgLlBARCAgRzwgICEnOCAgIC5TQEQgISlYICAhJzwgICAuVVBEICBPQCAgISdAICAgLlhARCAgMjwgCitNICEnRCAgIC5aUDQgIDpEICAgLVQgICAuXSA0ICA7MCAgIC4kICAgLl8wPCAhLDggICEgUCAgIC8hUDQgCitNIFk4ICAgLkQgICAvJDA0ICFOKCAgIC5MICAgLyYgNCAiIVAgICAuVCAgIC8nUEQgIVk8ICAhL0QgICAvCitNKUYtUj0jIE47UCFHOSYpTTkyWU8gJj1EOEZVRStGLCA6NllULkcwUS83KFEuUlRSLDMwVy0jQFMtQzBYCitNLlMoUS0jPFQuIyxWLSM8WyAmLUg4NyhaPSMoXTxDKFssI0xRLEM8WyAmUU87RjxaPSMsXTxDJFsrMyhRCitNLSM8VC4jLFYtI0BbLEMkVC1TMFgsUzhULVNMIDxWQU88RzBaPSMwXTxDJFsrMyxSLVM4WC5TLFItUzhXCitNLlAhVTtHLUk5VllFOSIhQzomJVIuRzBVLzcoUS5TIFssQzRVLlAhVTtHLUk5VllFOSIhUzomXVI9I0lUCitNLUNVUiwzTFAuUzhVLTMsVS5QIVU7Ry1JOVZZRTkiIUw7VllHLkcwVy83KFEuUyBbKzMkWyAnNU48VkVHCitNO0Y1RCgmRU49I0lULiNVUiwzTFAuUlRRLlAhRjsmXUE9I0lULjNVUiwzTFQuUyBbICYxTz02KUw5M0lUCitNLDMgXTxDJFsuI0xQLlAhVjtWRUQuRzBRLDNUUSwwIF8vU1xaPSMkUi8zJCA9RV1DOiYlUi5EPFIgJzk/CitNPFZFRztGNUQ3Vi1IODcoWjFTKCA9RV1VO0ctSTlWWUU5JV1DOiYlUi5EPFUgJzk/PFZBTzxHMFoxUzAgCitNPUVdUzo2PU45NjE/PFZBTzxHMFoxUzAgPUVdVTtHLUk5VllFOSVdUzomXVI9I0knLUAhVjdWRU49I0knCitNLDAhVjdXLUk5VllFOSVdSTtHMFoxUyQgPUVdVTtHLUk5VllFOSVdSTtHMFoxU0AgPUVdTDtWWUcuRDxRCitNICc5PzxWRUc7RjVEN1ZRTztGPFoxUyQgPUVdVTtHLUk5VllFOSVdTDtWWUcuRDxYICc5PzlGUU84NzBaCitNMVNEID1FXUQ7VzVCOyY0WjFTJFAgJzk/OFZBQTxFXUE8RylBPjNJJywzLF04NyhRLlMgWywzTFIgJzk/CitNPFZFRztGNUQ3Vi1IODcpPzg3KVI4N0RaMVMkUyAnOT89NllTOjY9Tjk2MT84VkFBPEVdQTxHKUE+M0knCitNLDMwXTg3KFEuUyBbLDNMVSAnOT88VkFPPEcxPzg3KVI4N0RaMVMkVS82JVIsM0xQLlMkWy0gIVY3Vy1JCitNOVZZRTklXVM6Jl1SPSVdQTxHKUE+M0knLDM0ID1FXVU7Ry1JOVZZRTklXVM6Jl1SPSVdQTxHKUE+M0knCitNLDM4XTg3KFEuUyBbLDNMViAnOT86NllUN1YlUjxGJVkuRDxRLVNVQTxDJFssI0xRLlMkID1FXVM6Nj1OCitNOTYxPzo2WVQ3ViVSPEYlWS5EPFEtUCFWN1c1TjxWRUc7RjVEN1ZFTj0lXUE8RylBPjNJJywzQF04NyhRCitNLlMgWywzTFggJzk/OyZdTjlVXUE8RylBPjNJJywzPCA9RV1TOjY9Tjk2MT87Jl1OOVVdQTxHKUE+M0knCitNLDM8ID1FXVU7Ry1JOVZZRTklXUw7VllHN1YlUjxGJVkuRDxRLiAhVjdWOUw7ViVUN1YlUjxGJVkuRDxRCitNLjNVQTxDJFssI0xRLlNEID1FXUQ7VzVCOyY1Pzg3KVI4N0RaMVMoUC82JVIsM0xQLlMkWywzICA9RV1DCitNOiYlUjdXIU86NllUOTcoWjFTKFEvMkhSICc5PzxWRUc7RjVEN1YtSDg3KT88Jl1JO0cxRTxDSScsQyQgCitNPUVdVTtHLUk5VllFOSVdQzomJVI3VyFPOjZZVDk3KFoxUyhSLzJIVSAnOT88VkFPPEcxPzwmXUk7RzFFCitNPENJJyxDLF0qQzAgPUVdUzo2PU45NjE/PFZBTzxHMT88Jl1JO0cxRTxDSScsQywgPUVdVTtHLUk5VllFCitNOSVdUzomXVI9JV1QO1ZFTj0mNVIuRDxSLSNUSi1AIVY3VkVOPSVdUDtWRU49JjVSLkQ8Ui0zVEosMCFWCitNN1ctSTlWWUU5JV1JO0cxPzwmXUk7RzFFPENJJyxDNCA9RV1VO0ctSTlWWUU5JV1JO0cxPzwmXUk7RzFFCitNPENJJyxDOF0qQ0AgPUVdTDtWWUc3VyFPOjZZVDk3KFoxUyhVICc5PzxWRUc7RjVEN1ZRTztGPT88Jl1JCitNO0cxRTxDSScsQzQgPUVdVTtHLUk5VllFOSVdTDtWWUc3VyFPOjZZVDk3KFoxUyhWICc5PzlGUU84NzE/CitNPCZdSTtHMUU8Q0knLEM8XSpDRCA9RV1EO1c1QjsmNT88Jl1JO0cxRTxDSScsQ0BdKkMkUCAnMT88VzFSCitNPTYtVC5FMFIuM1VTLEMxVjdWLUg4Nyk/OzY1TThGNVIuQyhMLCJQWC5XOT88VkFPPEcxPzs2NU04RjVSCitNLkMwTCwzOEwsMzhbPUVdSTtHMT87NjVNOEY1Ui5DJEwsUyhMLFMoWz1FXUw7VllHN1ZVRTs2KUU8Q0hRCitNKyM4VCsjLFIuVzk/OUZRTzg3MT87NjVNOEY1Ui5DREwuMzhMLFMoWz1FXUQ7VzVCOyY1Pzs2NU04RjVSCitNLkMkUCsjJFIuIlBWLSNMWyAnOT88VzFSPTYtVCwzSScsQ0QgPUVdUz0nKVU4VzBSLkQ8UywjVVMsQzFWCitNN1YtSDg3KT87NjVNOEY1Ui5DKEwsIlBYLlc5PzxWQU88RzE/OzY1TThGNVIuQzBMLDM4TCwzOFs9RV1JCitNO0cxPzs2NU04RjVSLkMkTCxTKEwsUyhbPUVdTDtWWUc3VlVFOzYpRTxDSFErIzhUKyMsUi5XOT85RlFPCitNODcxPzs2NU04RjVSLkNETC4zOEwsUyhbPUVdRDtXNUI7JjU/OzY1TThGNVIuQyRQKyMkUi4iUFYtI0xbCitNICcxPz02WUk7VlhaNSMsUS83NFg9RV1DOiYlUjdWVUU7NilFPENIUisjIEwuI01WN1ctSDtXKVQ3VlVFCitNOzYpRTxDSFQrIyBMLDM4Wz1FXUk7RzE/OzY1TThGNVIuQyRMLCJQUyxDTVY3VlFPO0Y9Pzs2NU04RjVSCitNLkMkTCwiUFMsQ01WN1Y5TDtWJVQ3VlVFOzYpRTxDSFkrIyBMLFMoWz1FXUQ7VzVCOyY1Pzs2NU04RjVSCitNLkMkUCsjIEwtQzBbLlAhVjdXNU46Nl1OLkQ8UywwIVY3VzVOOjZdTixDSScsUyhdPTNBVjdWLUg4Nyk/CitNOzY1TThGNVIuQyhMLCJQWC5XOT88VkFPPEcxPzs2NU04RjVSLkMwTCwiUFEtQ01WN1ZFTj0lXU05NlVCCitNOTcoWiwyUFArIyxSLlc5PzsmXU45VV1NOTZVQjk3KFosMlBQKyMsUi5XOT85RlFPODcxPzs2NU04RjVSCitNLkNETCwiUFMsQ01WN1YxTz02KUw5NV1NOTZVQjk3KFosMyBMLCJQVi0jTFsgJzk/OFZBQTxFXUY9NllDCitNLkQ4UiAnOT88VkVHO0Y1RDdWLUg4Nyk/OUc1TjhTSSYsQCFWN1c1TjxWRUc7RjVEN1YtSDg3KT85RzVOCitNOFNJJi0wIVY3Vy1IO1cpVDdWOVU7RixaMUMwID1FXVM6Nj1OOTYxPzxWQU88RzE/OUc1TjhTSSYtICFWCitNN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsWjFDOCA9RV1JO0cxPzlHNU44U0kmLDAhVjdXLUk5VllFCitNOSVdSTtHMT85RzVOOFNJJiwwIVY3VzVOPFZFRztGNUQ3VkVOPSVdRj02WUMuRDhYICc5PzsmXU45VV1GCitNPTZZQy5EOFEgJzk/PFZFRztGNUQ3VlFPO0Y9PzlHNU44U0kmLDAhVjdXNU48VkVHO0Y1RDdWUU87Rj0/CitNOUc1TjhTSSYuICFWN1Y5TDtWJVQ3VjlVO0YsWjFDRCA9RV1EO1c1QjsmNT85RzVOOFNJJiwzICA7JkVOCitNOlNJNCxTLF08UyRVLEZZRT4nMFosUzBdKkMsUysjIEwsUyhbOyZFTjpWOVU7RixaLFM0XSpDLFYvNjhTCitNLSJQUyxCUFMsQ01TPSc1RjlDSFMtU1VBPEMkWywjTFAuUyxYLzYlUiwzTFAuUyRbLFNEXTg3KFEuUyBbCitNLENMUi4yUFYtIlBRLDM0Ui5TTCA8VV1MOjZZSy5EPFMtICFUPTVdTDo2WUsuRTBULCNVVSwzMFQ7RjVYCitNPSNIUy0iUFArIyxSLlZRSTtGTUY9NllDLkMsVSsjIEwsUyhbPFcxVTlGOFosUzxMLCJQUSwzNFIuU0wgCitNPTVdTDo2WUsuRDxULCAhUDxGRU04NylZLkQ8VCwzVUU8RjVELkMgTDlXKUU5NlhaLDJRQjsnNUUuQyhMCitNLlAhQztWUU88RyxaNSMwUi82NVk5NlFMO1c8WiwiUVA9NylQOyY0WiwyUVA6NllLLkMoTC5QIU47VllQCitNPEZFTTg3KVkuRDxULEAhQzsnNU46VjVSLkQ8VCxTVUU4VkFFPUdEWiwiUUY7VylELkMkTC5QIUM4NylTCitNLkUwVC0jVUU4RlVXLkMgTDwmXVI8Vi1IOTNIUSsjTCA8VyFPPEcxUzhWJVIuRDxULSAhQjtWXUw5NiVOCitNLkcwVC0zVUUxRCUsNFQ0WiwiUTQ0RTUlLkMkTC5QIUI9RiVMPFNJNC0jOF05NjlBOyctRS5DIEw9JylVCitNOTNIUSsjTCA4Rl1POyY1QTtDKFo9IzBWICZVSTxWXVI5JjVSOTYwWjUjMFcvNjVUPVZcWixCUU87RjRaCitNLDJRWjk3KU8uQyBMPSZBUjk2NFosUlBbICZVQTo2WFoxQyQgKzZRRyAlXVM4Vi1TOjYwIDk3QUk9IllPCitNICY5QTpWLVUrRlwgN1Y1WDo3ME47UCFDOTcpUjtXKE47UCE/OTZZVjo3KU87QCFTPSYlUj0gIT87NiVJCitNO0AhPzk3QUk9ICE/OzZdTjhWXU49JylPOyAhTThWXVU7RzAgN1c5PzhWQUE8QCE/PUVdUzo2PU45NjE/CitNOFZBQTxAIT89RV1VO0ctSTlWWUU5JV1DOiYlUiAlXVY3Vy1IO1cpVCAlXVY3Vy1JOVZZRTklXVM6Jl1SCitNPSAhPz1FXVU7Ry1JOVZZRTklXVM6Jl1SPSAhPz1FXUk7RzAgN1c5PzxWRUc7RjVEN1ZFTj0gIT89RV1VCitNO0ctSTlWWUU5JV1JO0cwIDdXOT87Jl1OOVAhPz1FXVM6Nj1OOTYxPzsmXU45UCE/PUVdVTtHLUk5VllFCitNOSVdTDtWWUcgJV1WN1Y5TDtWJVQgJV1WN1YxTz02KUw5MCE/PUVdQzomJVI3ViVSPEYlWSAlXVY3Vy1JCitNOVZZRTklXUM6JiVSN1YlUjxGJVkgJV1WN1c1TjxWRUc7RjVEN1YtSDg3KT84NylSODdEIDdXOT88VkFPCitNPEcxPzg3KVI4N0QgN1c5PzxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWSAlXVY3VzVOPFZFRztGNUQ3Vy1ICitNO1cpVDdWJVI8RiVZICVdVjdWRU49JV1BPEcpQT4wIT89RV1TOjY9Tjk2MT86NllUN1YlUjxGJVkgJV1WCitNN1c1TjxWRUc7RjVEN1ZFTj0lXUE8RylBPjAhPz1FXUw7VllHN1YlUjxGJVkgJV1WN1ctSTlWWUU5JV1MCitNO1ZZRzdWJVI8RiVZICVdVjdXNU48VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA3Vzk/OUZRTzg3MT84NylSCitNODdEIDdXOT85Jl1VOEZRRTdWJVI8RiVZICVdVjdWLUg4Nyk/PCZdSTtHMUU8QCE/PUVdUzo2PU45NjE/CitNOFZBQTxFXVA7VkVOPSY1UiAlXVY3VzVOPFZFRztGNUQ3Vi1IODcpPzwmXUk7RzFFPEAhPz1FXVM6Jl1SCitNPSVdUDtWRU49JjVSICVdVjdXLUk5VllFOSVdUzomXVI9JV1QO1ZFTj0mNVIgJV1WN1c1TjxWRUc7RjVECitNN1ctSDtXKVQ3VyFPOjZZVDk3KCA3Vzk/OjZZVDdXIU86NllUOTcoIDdXOT88VkVHO0Y1RDdWRU49JV1QCitNO1ZFTj0mNVIgJV1WN1c1TjxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAlXVY3VlFPO0Y9PzwmXUk7RzFFCitNPEAhPz1FXVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT88Jl1JCitNO0cxRTxAIT89RV1GOyZdQT0lXVA7VkVOPSY1UiAlXVY3VjFPPTYpTDk1XVA7VkVOPSY1UiAlXVY3Vy1UCitNPEc1Qz0jJCA3Vzk/PFcxUj02LVQsQCE/PUVdVTtGRU87QCE/PUVdVTtGRU87QyggN1c5PzhWQUE8RV1GCitNPTZZQyAlXVY3Vy1JOVZZRTklXUM6JiVSN1Y5VTtGLCA3Vzk/PTZZUzo2PU45NjE/OFZBQTxFXUY9NllDCitNICVdVjdXLUg7VylUN1Y5VTtGLCA3Vzk/PFZFRztGNUQ3Vy1IO1cpVDdWOVU7RiwgN1c5Pz02WVM6Nj1OCitNOTYxPzxWQU88RzE/OUc1TjhQIT89RV1JO0cxPzlHNU44UCE/PUVdUzo2PU45NjE/OjZZVDdWOVU7RiwgCitNN1c5Pz02WVM6Nj1OOTYxPzo2WVQ3VjlVO0YsIDdXOT87Jl1OOVVdRj02WUMgJV1WN1ctSTlWWUU5JV1MCitNO1ZZRzdWOVU7RiwgN1c5Pz02WVM6Nj1OOTYxPzsmXU45VV1GPTZZQyAlXVY3VjlMO1YlVDdWOVU7RiwgCitNN1c5PzkmXVU4RlFFN1Y5VTtGLCA3Vy0/OyZFTjpQIT89NV1MOjZZSyAlXVA8RkVNODcpWSAlXU47VllQCitNPEZFTTg3KVkgJV1DOyc1TjpWNVIgJV1TPCZdUj0nLUM4NyggN1VdRDhGJVI5VywgN1VdRDhHLVU4RiwgCitNN1VdRDhHLVU4RlggN1VdTDlVXUY7JiVHICVdPzhWUUU4NllVPCAhPzdWNVg6NzAgOFY1UjxGXVIgJV1FCitNPEcpTjtQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCislICAgICAgICAKKyAKK2VuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWFvdXQyLnUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstYW91dDIudQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTIwOTYxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWFvdXQyLnUKQEAgLTAsMCArMSwyMjA4IEBACitiZWdpbiA3NzcgbTY4ay1hb3V0MgorTSAwKCEiUCAgQCAgICAsICAgICAgICAgICdCMCAgIiBAICAgICAgICAgICEtXiAgICkhPSdbUCAkKEArRQorTUA0R1MmIDBDUyAgIiAgISpOMCAgKEA5RyAgICY4MCAgKkRBNDIlLE8gRFpZICAgQkYkWlkgICBDOU1bXAorTSAgUE8gJFpZICAgRjAlQi8rUCEuTjAgIClNQS41T18oMi48UCAkQVogOlEoPiAgIDInSCFCRFpaIDM7PworTV8gICAgIEBNMC9fUDInQCAoJEFOX1xATyAkWlogM1M/XyAgICAhICxAICAgICIhRyIkJ1ogNzlAICAkVAorTSMmWCEiX18qOU8gRC8gICAnX180S09fLCBIK19fQCAgIUgoICBAICAoICswS09fMFQqW19VJEFaIDYpKAorTT4gICArUltfXCJcWiA5QE8uQCZAK1AhKD4gICAzS0ggUy1fXCAgICAmIlUgX15ATytPXywrUltfXCJcWgorTSA3QE8uQCVYK1JbX1QiICJUKltfWiJcIDNLSCBITV9cICAgICYiOCBFKltfUyJcIigiW19aLSJOX1xQTworTSAkWlogKSM/XyAgICAgUSg+QCRCMidAICAkQVogLEUuTkAhRjQoXE0wL19MMkpbX1UmOCQ2KF1AKERBWAorTSAgIE8gIlxaIDFATy5AJDgrUltfVS06Tl9dIE8gVFpaICQzP18gICAgIVEhXk9bKCs0Q19fIlVZICAoIAorTSAvX1grN0ggOy9fVDImW19aJEFYICAkQDtPX0hUPltfVyRaMDQoXSxXUCAsM0VZLj0yIU8gIFEoPiAgJQorTTghUEA7UCA8MidAIDFWIDIoJlwgIyRBWCAkRUAiIiFPICEhKD4gICMzRCFFIERZVStRQSg0JEFYICApKAorTT4gICAyJ0AgISRZICtXUCAgICFfICAxKD4gICEzRCAgICAgICtXNVM8Ql1MOjYoTzsmME48VlwgK1YxRQorTT1CXVo5NylPICAgICAgIDg4VylULCNIQDtGXEArVzVTPEJdTDo2KE87JjBOPFZcKiAgICApNi1SPSMgWgorTSgiXVU8VyhPOyZFQitWUUQrRy1PKCZVQTwnIUk7RjxAOUYlSTsnNVI5MEggICAgICRWLVI9IyBaKCZZTworTSgiXUQ5NzhPPkY1UjtQSCBAICAgIEggICAhKCAgICAnICAgICEwICAgICAgICRbWSAgIEVSICAgM0U4IAorTSAkKiA4ICAgIERZPjNHNS41QCAgMEghQCAgICIzRVkuPTRZNiAgISJAJiAgICApLjdEWVUzRTggICQqIAorTTggICAgRFk+M0c1LjVAICAwSCFAICAgIjNFWS49NFk2ICAhIkAmICAgICkuN0RZVTNFOCAgJCogOCAgIAorTSBEWT4zRzUuNUAgIDBIIUAgICAiM0VZLj00WTYgICEiQCYgICAgKS43RFlVM0U4ICAkKiA4ICAgIERZPgorTTNHNS41QCAgMEghQCAgICIzRVkuPTRZNiAgISJAJiAgICApLjdEWVUzRTggICcgIDggICAgRFk+M0c1LgorTTVAICA8ICFSICYgICAgKS43RFlVM0U4ICAmJ18gICAiMEQoWSAgKlA0IS9cICAkICBLITIkX1AgIEAgIgorTUwlMFNfICAjICAqUDVDL1wgIDAgIEshOCxfUCAhMCAiTCVJUCFCLyAgICpQNycgJyhcICAgSyFAPCBAQworTVAgICJMJjFQIjIvICAgKlA6JyAqKFwgICBLIUw8IExDUCAgIkwnIENfJCsoICAgICBLIVQoX1EgOjAgIAorTSAgKlA+JCpZICAqUD8hL1kgICpQNCAgIkwoIDNeMCAiTCUoICBLIiIkX0QgIEshNCAgKlBBIy9ZICAqUAorTTVAICJMKEBTXjAgIkwlQCAgSyIsLF9EICBLITogICpQRCIvWSAgKlA3ICAiTClAQ14wICJMJiAgIEsiQAorTShfRCAgSyFEICAqUEoiL1kgICpQOiAgIkwrIENeMCAiTCZQICBLIlgoX0QgIEshUCAgKlBQIi9ZICAqUAorTT0gICJMLEBDXjAgIkwnQCAgSyMwKF9EICBLIVwgICpQVSIvXCAgKlA0ICAiTC4gQ18gICJMJSggIEsjRAorTShfUCAgSyE0ICAqUFoiL1wgICpQNUAgIkwuUENfICAiTCVAICBLI1AoX1AgIEshOiAgKlBdIi9cICAqUAorTTcgICJML0BDXyAgIkwmICAgSyNcKF9QICBLIUQgICpRICIvXCAgKlA6ICAiTDAwQ18gICJMJlAgIEskKAorTShfUCAgSyFQICAqUSMiL1wgICpQPSAgIkwxIENfICAiTCdAICBLJDQ8IChDUCAgIkwxQENQICAiTDFRUAorTSAyLyAgICpRKCIvICAgKlEpIi9ZICAqUSogICJMMyBTXjAgIkw8ICAgSycoM0VZLj0wICAzRTggICJcKworTStQSSJAJCdZICAqUiMkSjA5UEE4MiUqIDJJIUZeJEogO1ExJ14wICJMQEElXFBQICglKS5EJUUqTVxJTQorTV1CMU5fX0BGO09fXDNFWS49NFk2ICAgTyJEN1kgICpSJSRKMjlQQEA2RFowMkkpRl4kKkcyJ0QgICI1IAorTTg/XCAgICNGKSZbX18kWT4zRzUuNUAgIDJLRCAgQCBcOUBJUCAyLyAgICggLyYmXDNFWS49NENHQCwhLgorTU4wICAqXEEqMCY8LDNLRCAgIk1IMy1cIyA0WVUyJ0AgLzRBWiAhOSg+ICAiM0tEICAiOy4yJ0AgOFRaWQorTSAgIEZWJFUjLUNAWC4jJEA5RlFPODcxSTtGPEA8Jl1JO0cwQDtGXVQoJiVWODZFTDg2KUw5MiBNKzIhUAorTTxGXUc8RiVNKCcpRTw3NUk8RjVTKCZFVCJAICAgICAgICRZNl9fQShVUiIgK0JYICImIDQoXlQgIiAgIgorTUxBQE8rMCAkK1A8QDU0WjA0JFxKPjAgIkxBQSpDNjtCM0tEICAiO1ArUD0uTjAgIClNQTgzVFNOKCgjXworTV4kWT4zRzQgICRZNl9fUE5DNEFYICBRLk4wICArUEE4M1JJIDJIVUYhJyNfOCFISktAICgqVlggIyAgJAorTSpXRCAgSyg4ICBAQ1MwICJMQUFQICJJTl9fUS43RFlVICAhLl4wICApTiEoPiAgJDNEIUVcRFlVMidAIAorTSA0WSAgICBDUCAgIiAkMVBfVFlVICAgICAgICAzRTggICRBWSAgIEchRFpZICAgVyglQS8zRVkuPTRZNgorTV9fQShVUiIgKkZYICInW18ySFVHPCMgTSAhICJAICAgIDAtRy5DIE0gISAoICAgJjlDIFArMCAwIiAgIAorTSBGPCQ/QCFAIyRBNTNLRCAgIj40NiRcTiAhIE0gISkpUCJcIDNLRCAgI0FWNiRdKkAmUCI/T1xQKzAgMAorTSIgICAgVjwwK1JUICIkWlkgICBQJ0VBLzBKVCAiJClNICEhIkUyTU0gIEAgISQqTSAgUEAhVFNOKCgjXworTV4kWT4zRzUuNU9fXCtIVEo7QCAoLCJUICQgQCAgICVGKUYgXCwiVCAkIEAgICAlRykkSk0gIEFHJ0IgTQorTSAgMlBLMCAoOFExKDU0WlkgICBJOEVBLywiVCAkIEAgICApR1RDIE0gISAoICAgJTlQMVBfViAiPCAgSgorTTtPX1wzRVkuPTRZNl9eUShVUiMgKkZYICMhUE4gIExQKzAgMCBIICAgICIyIyggICAgIiI5Q1BAKzAgKAorTVQqVCAjKyJNICAxQyAgIlwoJlQgISUpKCpUQCAhISUmX19cLCFAICo5QCAhJ0RBNTNLRCAgIkVCNiRdXgorTV9bIic5QCAhIyYgICAwMFArMCAwP0E7IEFXWCZMKD1GLCFVJl9fXSJFNEFYICAlKDtPX18kIlQgJERHIAorTStQIS5OMCAgKUxZXiA7Iic5UCAgVUAhTSAiICAkJyNfOCAgIFNDIE0gISFeJEwiJz9AKlBBVjhAMkpUIAorTSImPDooIlQgISsiTSAgQUYpJEo1OUIgUCswIDAgSCAgICAiJDlBMSg1NFpZICAgSVlFQS8ySCFHIUcjXworTTggICBDIyBNICEgIkAgICAgKDFGIC9cRjIlNS5OMCAgKjYpODNVLjU7MSBAOzAgJDREQEsyICAkJDQ7XworTV9WISwsIlQgJCBAICAgPUcsQiA1MSgiUEswICw7IkBAOzAgJCQoOCwhQCAqOVEgQDswICQ0REBLMiAgJAorTSQiQ19fViA8MiU0QDswICQ8ICAwJCYgJjIlNVAgISAmK1AhLk4wICApXyEwM1MgTSAhICggICAlOVAxUAorTV9WICQ8ICAwIURTTigsI19bJFk+M0c1LjVPX1AyLTxQUCJJTiAgQEg7MCAoKyJUICEpUiwqVFAgISMgTQorTSAhICJAICAgICgxRyEnWCA4IDBOKzAgLCpIPSpFNlAkP0AhQCBCWDUoIlQgIi0iTSAgUjBLMCAkTCg9TAorTSJEQTUzS0QgICJNIDYkXSpBRlxAK1A5KDUhIE0gISkpUCJcIDNLRCAgIjsuTyghRyJAIU0gIiAgJCcjXworTTggKVAgJFNOLCwjX1wkWT4zRzUuNU9fWDItPEBAIklOICBAUCswIDA/QSsgQVdYIkwoPUcnQyBNICEgIgorTUAgICAgMClGIScjXzgmQVBbXCFNICEhUiBIISEuVCAgJCMgTSAhICggICAmOURZKkswICg5QEkoNTRaWQorTSAgIEpARUEvKCJUICErIk0gIEFGLSMgTSAhICJAICAgICgxRioiSk0gIFEqRTZQJD9AIUAgQlg1KCJUIAorTSItIk0gIFIwSzAgJEwoPUwiREE1M0tEICAiTSA2JF1QICRTTigoI19eJFk+M0c1LjVPXlQyLTxAUCJJTgorTSAgQDArMCAyMjwgTCAjIE0gISAoICAgIjlROEA+MCAiIEkxIVwmWCAqVEAgIidYKCpUPCAjJiFaK1A5LgorTU4wICAtNyE4M1RKIDlQWCA7MCIgICEgTi8gICAgKCFAJ0RBTl9cME8hRFpZICAgWEFFIS8ySCFNIUJYTgorTV9fIU4hQlhcICAgJCAiICc0KCBPICRaWSAgIE8iJUEvKlQgICImPCwgJlQgIiAgMCpUPCAjJiBAKCdEIAorTSBAKjQwPyFOICJNKCAgQV4iIk0nICBQIjs/XV8gISAgOzAgJCAhIEs7MCAoICAxLFtCIyBfWzEuN0RZVQorTTNFO19dIilOICBAQDowIChUPkQgIyIgKEQqRCAhJkgmKFRAICEmICZMKSVMIEIqIDNFWS49NENHUCwgQAorTS4wICIgJFAsMCAgJDlAOFAvICAyOCIwLDAgICM5QDhQLyAgLjghQCwwICAiOUA4UC8gICo4IFAsMCAgIQorTTlAOFAvICAmM0clIV4wICJKWlFAIUItUSAgICAgQik4TF9QICAgICA5TyEuMERTPyBQLS49MCAgICAgIAorTSAkW1kgICBLWiAgIDNFOCAgJyghKFwkICBLKDwoJlggJCVSSCAgUS43RFlVM0U7X1kiWicyS0QgIEAhOAorTTlRSCxOMCAgICAoICBAITg5QCAgUSdYIyhcPCAgQCEsOCAgIE4iVVwgICBLVC9fVDBKW19eJCpOX19RKAorTTtPX0gyJltfXSRBWCAgPS5OMCAgLVohL1tQICwwS0QgIEsoPDNLRCAgI0g4MiZbX10kQU5fXkEoPiAgJworTTNLRCAgIz5AM15cICMkSlkgICpSJyY8JD9AJUAgR1giKFw8ICBAITgjK0QgICAgIiAgKCA2JjkuP0AsQworTVFQICIgJFEuTjAgIC5DISpAJjhWMidEICAiU0AyJ0QgIEArJDNLRCAgI0VQNCRdKD4wICArMiEoPjAgIgorTSBMMS5OMCAgLjchMDNUQVkgICgiUSRaWSAgIEdFJUEvM0tEICAjSDgjK0QgICAgIiAgKCA2JjgkPCAlQAorTSBHICArQltfWSRZPjNHNCooJSFMOTYlUzkyIU47VzFFLkIhLTBTOFguI0BRKCc1UDlXKUE5JjRAPSZcQAorTTAzRFMzQiFNODctSygmVUE+MiFCOTIhQTknOUk8ViVCOyY0TiggSCA0VjVFKCQ5TDtWJVQ6NllHKzUhTworTTo2WVQoJSFSO1Y9Ujg2VU05NyhHPFIhJz02RUQ5MlgqICRZNl9eUShVUyNAKidQICBAIlAqRTBKK0AgLAorTSsiWCAiJiAwTypUICImMCQqJFVAISRHTSAgMEo1JEotOUAxXiAmICQrQlQgIytaJTkuIS5OMCAgLSgwTgorTSAmPSQqKDxAMVQqMDBKQCAhIiUmICBAQTEwICwoJDhAQTJBJzYoPSpDNjw+TypUICImLCwqKFUpWzAgJAorTSpGVCAhJiAoKCQ8QEMyWC0qRTUqQzY7QkZcVEAxUiItKihVLFtDI0BfXlEuN0RZVTNFO19aJEM3LC8gSgorTTtAICgqJTRMJSY4JD4gIUAhQiEmKiJAICMiWEwgIDFGISdIIDggOEAxUkhIICBSXEFWPVROKDVFLiRKJgorTTlWQSpBJjg6KCQ4QCogICg2KCBPICRBWSAgKCBcJFpZICAgVTclIS84JFhKQUVCJipEOEwlNjgkPiAhQAorTS8iISYqIkAgIyYgVDJIPUcsJEolOUFIQDFSIEggIEE4QCJcIDInRCAgQCQkM0tEICAjNTw0JF1AJUJKJworTSpEPE4lNjgkPkAhQCFCIScqQkAgIytSJzlIUSJFNEE0M0tEICAjNSI2JF0sW0MjUF9eQS43RFlVM0U7XworTVkkQzcsKCBKO0AgKCglNSpCJjgkPCAhQCEiIEggIFBINCIpSCAgMSpDJjgkP0AhQClCWEwgIFFAKCtaIQorTTkxOEpDJE9MICAwSDU0Siw5QDFeICYgOCtCUCAjJiAyKkhESjIyKTUySEVGIScoIDggMEIqMCAsT0ghQgorTVQrKiA4TFBKQiIiLCg0RCAhJFNOLCgjX1kkWT4zRzUuNU9fRDItPFBeIkBOICBBOEEnWChOKD1EISdAKAorTTggOTZBLjIsWThRKk4wICIgKyFGISdIIDggSEA+MCAiICsgSiogICxOSDFEJSJcJDNLRCAgIy8oNiRdKgorTUAmOCY8ICFAICAjIionUCAgQCJQKkUxQCgrWiY4QFJeQSYwNDI+VCAhIkkjOCEiXEEmNCgyPlQgISJJIworTTggMEgzMkklKkE0RiswICQySDVGISdYIDggOEAxMlhIICBRKkBWOCQ/ICFAIUIhIysiQCAjK1okOStKXAorTUEmMlYoIlQgIykiJD9AQlBBVigwKkJUICIkQTQzS0QgICJXOjYkXUArQkhNICBATiE9WiQoJDRGJCk6JAorTSpULCAjIiEnKCgtMk4wICIgJzBLMVAgKDIlMS5OMCAgK0kxODNSISUoKDBAMTIgMFQ7RCAgQCJENEtEIAorTSBAIkhOK0QgIEAiODkgOTJOMCAiICdBOEEyICUzLlhQXi9fRDNFWS49NFk2X14hKFVTI1wpIlggIiEgIgorTT9ALyBBVjw2K1ApKD4wICIgMUEuTjAgIC01UTAzVyAgOCAgIFwrMlkgICggTSY0KE0rRCAgQCJYOFBZXgorTSVCLycgICggMScgIDggICBUQlAiNjg4QDFCQDBGO0QgIEAiRDRbRCAgQCJIKidQICBAIlAqRTEqQzY8IAorTSAqKE4rMCAoKUJUICMrUic5I0BKIU1KJE5IPUYlLUIjNFtEICBAIVQyJTEuTjAgICs9STgzViFQTkg9QworTSUiXCcrUDkoPjAgIiA1PS5OMCAgLTVRUCAmIU4qJFVANStSJzhTUEohXUojTkg5RiVCUCdWKC0zTjAgIgorTSAnMSg1JFpZICAgTVZFQS84IypaQUYsNCtQKSg+MCAiIDc5Lk4wICAtNVEwM1cgIDgjISlbMCAkOCEwTworTSBEQVkgICghRiRaWSAgIFU3JSEvPCAhQCVCSTQySFVGIC9dQitQME8hRFpZICAgTTIlIS88ICUsW0MjXAorTV9eIS43RFlVM0U7X1wkQzcsLCBIO0AgKCsiWCAkIlhOICBSPkFHKChPSCVFKCRPVDogIEpBUkImNEtEIAorTSBAIVQ0S0QgIEAiSDImVCAhJFpZICAgUCdFQS82JFBAIyRTTiwsI19cJFk+M0c1LjVPX0AyLTxYXiJJTgorTSAgQEAjN1gjUCg9RiQrT1kgICggTSY0KE5fRCAgQCJYOFE5KDU0QVkgICghTkRaWSAgIFU3JSEvPCAhQAorTSAgI1QxXldfXyJAMzA/LSggIlAoMidAICAyXCQyJS0uTjAgICxMIS9bUCAsP09eUEFWOCY8ICFAICAjKgorTStCWCAjJUInPkBCXkE2MCQ9QEFAIiU6J1koX0VDUjgnTigtRSQiXCMrUDEoNFRaWSAgIFEwJiAgIClaXAorTU4wICIgK0FEOEJBXCAgKCBMIkk0KCQ4SiQmICoyPlQgISYgIiokVEo1JEotOUAxXiAmICQrQlQgIytaJQorTTkzSE4rMCAoTyg9RVkrUic4TUhOIS1aJU9ILUUpREE0M0tEICAiVzo2JF0zTjAgIiAnMztOMCAiICowRgorTUFSXCMrUD0oNFRaWSAgIFEwJiBSK1JYICMkWlkgICBPIiVBLypEISpDNjw+NiRNOUEiXCQyJTUoNFRaWQorTSAgIF0iJF9PICBRKDRUWlkgICBQJ0VBLyggVSxbQ0NYX14hLjdEWVUzRTtfWSRDNy8uIEorQCAsKyJYIAorTSIiMSZVPDRGPyAgIiArIUAiIjktOCAxJ1swICQqRS0qQzY4JD9AIUAhIlhNICBSXkE2NCAgLDhIOzAgKAorTU8oUUYnJEEzM0tEICAiVzo2JF87TjAgIiAqMTJOMCAiICpBUCA2ICAgKjJcQyY2XCtAUz5FK1InOStCVQorTVFWLDoySlggJCY8MCtQOSg+MCAiIEQ9Lk4wICAtNVEwM1cjXzgnQlVRVjhOMiUtLk4wICArPUk4M1UqWQorTSAgKCA9LU5ZICAoIEklMlkgICggSilONDImUCAhJFpZICAgUCdFQS88ICVAMURBMzNLRCAgIlc6NiRdNAorTU4wICIgJzBAJS0mWSAgKCBJJTpZICAoIEoiICdEKDoxRSlaKikoPSg7ICAkM0tEICAjID42JF0oOkAgJAorTTNLRCAgIyA+NiRdUCA2ICI8ICEsW0NTQF9eMS43RFlVM0U7X10kQzcoLCEqTjAgIiAmUUYoRFpZICAgWAorTUlCLyAgICggOyRaWSAgIFRBIkkgMkhVRy5EQTUzS0QgICM1IjYkXE4uMCAiICZRM0FdWk4gIEEsPjcgJworTSAgKCA7JFBZPCA8ICBAIUwrIDxPIURaWSAgIFhYJUEvKkQhUl9bTyE5QDFQICYhLDJLRCAgQCJUOUA4QworTVMwICIgKzEhXTZAIChcQCAgQCJYKkg8QC4wICIgK0IwTjAgIiArMENQICAiICcjP04wICIgKjEyTjAgIgorTSAnMTJOMCAiICpBKDswICQzS0QgICMgPjYkXVAgNFNOKCwjX10kWT4zRzUuNU9fWDItPEBAJEpZICAoIAorTVEmPDYqR0QgIEAjJCgnRCAgQCMkKF0gICBAIyQ4ICAgQ0RKWSAgKCBQJllQK0NQICAiICQrUD0uTjAgIAorTS4uITgzUkkgPE9eUEA2ODIyJ0QgIEApWTNLRCAgIzU8NiRdUCAmITwyS0QgIEAiVDlAOENTMCAiICswSgorTUFUJ00gIDBDUiAgIiArUENfICAgIEAgICBAIyAwPzVYICIvKCAgKCBOIiBZICAoIE4pIlkgICggTSIvIAorTSAgKCA8LV5ZICAoIEslLlkgICggUCJJWSAgKCBPJ1gwV1tEICBAIlwoIFUsW0IiIF9fQS43RFlVM0U4IAorTSAiIU4gIEBATjAgIiAsMENbQCAoICAoIFEkWT4zRzUuNUAgIDxBOENQMCAiICQxLjdEWVUgICAgICRZNgorTV9eQE5BUlhZICAoIDEkQU5fXlEoPjQgMjUgJE8rQCAoM0tEICAjQlYySCFMIkIvJyAgKCAxJyAgOCApUAorTSAyWE5fXkEuN0RZVTNFO19fIlotMktEICBKWkw5Q0BKPyAgIiBJUFArMCAwIEggICAgJCM5QDBAIzYhSAorTTJeVCAlK09cICAoJScmN0QzS0QgICM4XDJIIUYjJygsKFwkICBAISQ8ICFAMUJJWSAgKk5LJEo1OVIwQAorTTUzIEggISAiQCAgICAwLUclRUEtTl9EICBKWlA5PjFSJiIvISAgKCAxJyAgOCFBKkU2ODIyJ0AgJSRBWAorTSAgJS5OMCAgLzkhMDNSSiAoITRKO09fXDNFWS49NFk2X19BKFVSIiAzS0QgICNCNitAISg+ICAkK1A9LgorTU4wICAvOSEwM1IvICAgKk5LJEpZICAqTksmOCQ8ICFANyIgJ1lYIE8gJFpZICAgTyIlQS8oXCAgIEAqNAorTTlBQE8uMCAiS0pRLk4wICAsIVk4M1QqWSAgKk5LJyAgOCJYQD4wICJLSlEhXCdQIChcQCAgSlpQK0NQIAorTSBAKjwqR0QgIEpaTDggOEpRVyg0V0gkLEFQICIhMVFFXEcgITMuWEBAL19YM0VZLj00WTZfX1BOQzRKWQorTSAgKk5LJjgqM0tEICAjOFwySCFHK0JJWSAgKk5LK09ZICAqTkwmMEAySTVGJERBWCAhMSg+ICAhM0tEIAorTSAjVjA0JFxKQCVBLU5fRCAgSlpQOT4gSjtPX1wzRVkuPTRZNl9fUE5DNEpOICBBRzlESlkgICpOSyY4SgorTSpHUCAgQCo8LCJUICQgKiAgICAhIFY8KjIlNEA7QCAoM0khODNUT00gITJbXyAgIiExUUQtRiM8KkdEIAorTSBKWkxOX0QgIEpaUDkiOSpFNjw4KCU0UCogIDAgSCAgICAkIzlQSE8lMiFOICBBLkQlQS82JFZbXjAgIgorTUtLIUVWQklOX19RLjdEWVUgICAgICAgIDNFO19WJEM3Ly4gTitAICg7UDlcKCtaJjswOV4lRiAgICo4RAorTTtAIDArIlggIyIgJzRYIVIgPiZBK1AlLk4wICAuLDk4M1JIIDJfRCAgSyhAMl81XCAiOTUyJShPIUJcJworTTNLRCAgI0VGM15cICMkSiA6VTkqQUY8VjA+W19dIikmKC1EQFYyIzkyPltfXSJQNDlQWVIgO1IhOVBASgorTUFCQlwgICBZJiQqRzIlME8hVFpZICAgWTlEX08gIFEqQCZMPDJISUciQFIyICAgWSYmOCIpKExPITRaWQorTSAgIFhVRUEvPCAhQCZCWFkgICggMSJcJTNLRCAgI0M2NiRcSkJSLycgICggMScjXzMuWFxYL184M0VZLgorTT00W1kgICBGWCRBWCAgOS4wJjdSM0c1Ll4wICApTiEoPiAgXjNEIUVcRFlVM09EICAiO0AyJ0AgNjRZIAorTTk/KS49NFtZICAgRlgkQVggJCEuMCY3UjNHNS5eMCAgKU4hKD4gIFYzRCFFXERZVTNPRCAgIjtAMidAIAorTTs0WSA5PykuPTRbWSAgIEZYJEFYICZZLjAmN1IzRzRAK1AgJDVIIVJfLCIhVCtEICBANDwrVCAgISRBWAorTSAhJS4wJjQwKCNEICBANDwoXlwgISAgIiExUS49NFtZICAgRlggICAgICAgICRDR1AsIS5OMCAgLkcgQAorTStQJDBZOEBAPyAgIkxCIEA8IEAgK1JcISciXE8gMVBPK1AkPCtSXCEnJFowV19QICAgIDAzS0QgICNKWAorTTMtXCMgXV9cICAgICIkQVggKE0uMCRbWSAgIEZYJEFYICZRLjAmN1IzRzUuNU9PWDItPEBAIklOICBBIQorTVtAIDArQEBQKzAgMCIgICAgNjg2LCJUICQgQCAgIEFHIiAhTSAgKCAkJiAkPC9dQDpDIE0gISAoICAgIgorTTlUWCI7P19bICEhIVtPUCAqVEAgIiQnTl8gIEsyICAkKldQICAgMCAgIFEoNTJcJytSWCAjJFpZICAgXQorTVgkX08gIFBOICRBNTNLRCAgIj40NiRcIDswICQgISEiSzAgKDBKVCAjJCo1OCEhKDUyXCcrUlggIyRaWQorTSAgIF1YIlggKCA9LFtCIiBeX0EuN0RZVSAgI1IuSVAgICAxLj0wICAgICAgICAgICAgICAgICAgICAjUgorTS5FMDQgIkNSICYwICMoIEVAICAgOUE7Ui5FMCAgIVtSICYwICMoICBAICAgOUAxUCA2ICIwSCEuPTNfUAorTSAgICAgICAhLiBfX19fWCAgICAgICAgIEdfUCAgICNcK1JcIF8kJ08gIDBAKiAkMCgsICwwICAoOVJQQAorTS4wICIgJFBAUCBRICAgMUYiJFpZICAgW1lGIDYjJCAgIFY4KDNLRCAgI0taOCBALDAgICI5QClBNkRZVQorTTA+XCAhIiA4IyQgICImPEooIUAsMCAgJDlAQS5OMCAgLyYhQCZAUSAgIC1GIiRaWSAgIFshRiAsIyQgIAorTSBGOCYzS0QgICNNVitVPCEgLV9cICAgISAkWVVcQSNQUC8oSE8gICAmJFlVXEFDMFAvKDBHICEuPTIpWQorTSAgKCVVIyBJX19YKCAgIC45UEBRPyEhQyAiIUAoRElJX19ZSlokQUggIiBPLyQgIiAgIE8uMCAiTEohLgorTU4wICAuKzs/XyAgICAgUFM/ISFDX19QUz8hISBfX1BARDIlMSAgMEE0MCAoKDUkICMiJTEgISBBNDAgNAorTSg1JCAmIiUxICFRLj0yKVkgICglVSMgSV9fWCggICAuOVApQChESUlfX1lKW0RBSCAiME8vJCAiICAgTworTS4wICJMSiEuTjAgIC4rOz9fICAgICBQUz8hIUNfX1BTPyEhIV9fUEJEIipIICAwQkogICgoSkAgIyIqSAorTSAhIEJKICA0KEpAICYiKkggIVBQKj9fXiIgICAjRj9WLFZAICgvX1wzRzdSJC8jIFQ/UCAgICA4XEFCXAorTSAiKVxYICAvJSIjOSgtREBWMiM5KC1EQFYyIzkoLURAVjIjOSgtRENfICAgICAjQCAgXiQoR1NAICBYIAorTSgtREBWMiM5KC1EQFYyIzkoLURAVjIpXFggICAgIi1cICAgICAgXDwoV1AgICAgICNRMEM/ICAgICAoKAorTVQvKFxCICAgICAgIFxDUjAgICAgICAhLj0yL1wgICAgIC4gICNYM1ImLSMgXEFCPCAtJ1wgICAgKyIpXAorTVggICwgIis4KE1AQlYiKzgoTUBCViIrOChNQjFfICAgICRQQj8uICAjUTBCViIrOChNQEI/LiAgICAgQAorTSogIDggSCAgICAgLyhUIChUIi1IICFQKTYiLVwgICAgICBHJCghISFaICAoM0tEICAjUz4oIkNfXyQnSAorTSAgQS5OMCAgLy1ZLj00QSAiICAgI1Y4OiBEID9fIi4wICAhKDAgQCAgIF1GIkApICdfUENKICAkICAhLgorTT0wICAgICAgICIhTyAgMEI7UCAoKCJcICMmXSwoQEYyQiZQICAgMSRAOyogOzAgIDAjKCgiICQgICY8JAorTSRNQTNAIigpIiAkICAmOD4oQCNEQiYgIihNQTFSL19cMEQhM0AmM1QoICQiQCAgICAgLUAgQSs4NDxDXworTV8kKSA0WCFEXSRZVUxcQU4kJiAiJE1BMVIvX1wwRCEzQCYzVDNHNzFQLS8gOCAoMyglJyhfX1EiMCUuIAorTTkvMS49MCAgICAhLjVPX1gyLTwgUCJQTiAgQSwrRiAmICBQTyFEWlkgICBPIiVBLytAIUYhJyAgOCBYTworTSFCXCczS0QgICRfWDQkXEAhVFNOICwjX14kWT4zRzUuNUAgICtSWCAiJFpZICAgUCdFQS8zRVkuPTRZNgorTV1IIShVU1NcM0tEICAlWFYoJCBANCFVMF9fXSJLT19YP0AkTTFfX1QwSltfXCJVTiAgU19ZIlVOX14zXworTVoiVU5fXkNfWyJVTl9eU19YIklOICBAPCc2PSYpRlggJCMgSyAhIV4kTCInP0AqUEFWOEAySkwgIiY8OgorTSgiTCAhKyJLICBBRipESjM5QjhQKlAgMCBIICAgICIkOUFJKDRUWlkgICBJWUVBLzJIIUcjJyNfOCAgLgorTT4nICA4ICAuPEcwICkmTCAhIlgzMD5bVlEiVShdSyEhW087JCs0Q1ZNJCdOXUwwTTIvOzQjIDggKTY8IAorTSBCQTNBVkhMLCJMICQgKiAgICAgQSY8KiggPSRAKyJLICBRTSVCPSogIDEoNFRaWSAgIEk4RUEvKSZMIAorTSEiWDM0WDw0UUUqIjggIC1OQiFOX15ASDQlQk5fXkEqQyY4JionRCAgQDREJyFRRyAgVkA0WD1KKyMgSworTSAhICJAICAgICgxRyJCICcxKCJQSlAgLDsxOEcyQCAkMiUtLk4wICAqNik4M1IxSyAgME4kVS4nJSw5MgorTUBGIyQoJltfWiIgMCcgIThLT19INFg9SisjIEsgISAiQCAgICAoMUciQiAnMSgiUEpQICw7MThHMkAgJAorTTIlLS5OMCAgKjYpODNSMUsgIDBOJFUuJyUsOTJARiAgIzI4QDtPX0grISE4S09fSDJIOUoxJS4nOkJQUAorTSpQIDAgSCAgICAiJDlQSEAhVDIgTCpMICMmVDYpVEggISRBMzNLRCAgIkVCNiRcRDpQICQrQS0zQVEzXAorTSAiVTJARDImOCBIQDtPX0grISE4S09fSConRCAgQDRIMj5bW1dSSFkgICglKiIgJjMnUCAgMCAgICBIQAorTTExRFAmICEsPyYgJiAgICAiRjtGOCAgIEIiSFkgICglKyIhTl9eQEwkJUJOX15BKVtPTz8ySDlHICAiWAorTTJIOUc6JyAvUCg4QDExRFAiICNIQ0Y7UjglQEouMCAiITJAQDtPX0grISE4S09fSDI+W1tXVEomOVAgIAorTUJESiY5U0lQI1wiJigkNDksIEAgWihZRlxGIEoqQ0QgIEA0SCgmW19aIlAwNipbX1okR05eXV0qQUY9PAorTTJIOUcjRyAnUCg4QDExRFAiICNGQ0Y7UjA+W1tXUjgoTjwtRCAgUDQnIVEzQVZITCwiTCAkICogICAgIAorTUEmPCooID0kQCsiSyAgUU0lQj0qICAxKDRUWlkgICBJOEVBLykmTCAhIlgzNFg8NFFFKiJOPC1FUUYgIAorTSJdOVwsJiAgX0cxNTM2IS4oJFUyMzEgMDI8IVw+KyImOE5ZIV5AIFA8QFZQJiUzKV9fUUZYIyBbJEA5LgorTV5QICJfSCtfN09bKl9QK14vT1oiX11TXkBPXzxfVVtfLC9XTl9MS18sJ0FVPFchTzsmRUg5Ji04NTRdJAorTTBCW1tUVChOXl0pIitPTzEwQltbVCQoTl5cXSIrT08uOCI4PT8gICFeXSlAJ0FVXCAgJ1tUNiA2JzdQIAorTSA/TzA4IFg9PyAgIV5cXUAhQVVcICAnW1NFKS0kITUpUCdQQEwoOUdXR1BDTCg5R1gnUEtMKDlHUEdQTQorTUwoOUdRJ1BQTCg5R1VGITwySltfXSY8OjImW1sgIlxOX14wTytAICgzS0QgICRTSjNeXCAjJCpOX18wLAorTUtAICAgIytfXCZYNCgiW19cJC9WIzIjWl8iVSldSkhNND9fSDghUE07T08kX15ATytPX1AyJltfWiJcTgorTSAgQS5OMCAgM0dZL1tQICw0RFQsJTAgSjlAICBIRSktMiZbW1IkQTUzS0QgICRePjQkXEogJj1UMkpbXworTV0mPDoyJltbICJcTl9eME8rQCAoM0tEICAkU0ozXlwgIyQqTl9fMCxLQCAgICMrW1ImWDQoIltbUiQvVgorTSMyI1pfIlUpXUpITTQ/X0A4IVBNO09PJF9eIE8rT08oMiZbX1giXE4gIEEuTjAgIDNHWS9bUCAsKCZbXworTVgiUDA2KltfWCRKJjpAQSRBQVVcICAnW1QySSU4JEBAO09fSCshIThLT19IMkg5Si5EMiYnN1AgID9PMQorTTgjIVwgJCpOX18hQCVBID0yPCFaLCkiJVcoOEIhTjYhVygnPEAiVSZfXyAwJTRCIDA/RCAgQDc9IiMgIAorTSBAICA5TUAsJTAgTjlAICBPJSktIyE0ICpGOCAgKEkyMzRBTl5PUSg1NFpZICAhL0dFIS8qICFHOiRKTgorTV9fMUcmREFOXlAgTytPX0QrUlggIiRaWSAgISxaRF9PICBRIktPX1QjKlggICAgUl5PUU4lIiBOXk9RIworTV1AVEBeT1BNMj86Sis1J19bJiA8KzZbW1EvX0wrUltaXyRBTl9eUE8rQCAoM0tEICAkWV4zXlwgIyIhTgorTV9eUEokJUJOX15QSjEmIFYoJltfWiJIMDYqW19aJiBKPkAgMCU0QiAwP0QgIEA3PSIjICAgQCAgOVE4MAorTSc0RyA+IyIwQS1KJShAN0VAPUohVkghQFZHS18jITQgKSY8IF9AKSJLT0tYKzdQICBANSReTzEiS09LUAorTSs3UCAgQDUkXk5RQCAgOUgnN1AgID9PMzggICY3QVVcICBLWlpWIC4nN1AgIi9LSzggOD0/ICAwXk5NKgorTUE2UCI+QCRAO09fSCohIThLT19IIyJYIDkvS0o5USAsK0AhJF5OSUciIFBOICZHWlpGOE4ySDFMIyJVXAorTSAgKCUxP0tUMSgxQCdESE5eXSlHIkJVXCAgKCUxX0tUOCBZKitPTzA5UEBNPyAgIiE0R1pdJEhOXlxZRworTSVCXE5eTzEuTjAgIDQpITgzUkEmRjwiWVE2XCIqQFAsK0AhOF5OSUYiIjhZICAoJSsmICYpQ0QgIEA0SAorTTI+W1tXUSBOXk5NKVAnKChMKCVHIicoMEwoJUclRiEgMkgxRzAnICdQKDBAMFFEUCIgI0ZDJjtSOCMhKgorTUEmPEw8IF8gQSIhIyYzICggLkIsOU8pQCciICQzJ1AgIDAgICAgSEAwUURQJiAhLD8kICQgICAgIkRKJAorTTlOMSFbT08/KUBAQCMpIiNUKDRNMC9LWDJCW1tTVjwgITs6WVBWOFI4ICAlS0BSTiAgICAgP0tYOyAgJQorTUhHSCErNDdaXiYgICE5QE0/ICAiITRPWl0mICAhOFBNPyAgIiE0W1pdJiAgITggMCtPS0oyPCFaNisiJQorTTleQVo7WyIlOVwhWj4rIiU5XSFAICA1RDJINUwgR0gmMkJbW1RWOFgoJltfWiJVMF5OIE06ICAkXk4xMAorTUtPX0gyJltWViRBTl5NQSg7T0s8KCA1MkAiXCArUltaWSJcTl5OIS5OMCAgOD9BL1tQIDg4IzhIO087NAorTT1BIzZDIiFOX15ASFQlQk5fXkJZUFY3UjImW1ZWJEFOXk1BKDtPSzwoIDUyQCJcIDImW1ZRJFpZICAiKAorTTwkX08gITBIMCRKTl5NQUciQlVcICAoJTQ/S1Q4IVkqK09PMjlQSE0/ICAiITUvWl0mIC4yQltbVCY8KAorTSs3UCAgQDU1Xk8wLCtAIFldTUFPJURHTl1NQSFbICAhKUBAQDBUSDA5UCAgU0UqIzgvMSFbT080KUBBKgorTSUmPCQmIVFAIEdAUCgkLDBBJSojMkg1RiFESE5eXF1HIiIhIyQqW19fVSojKzQ3WlwmIC4yQTFHJCUuTgorTV5PIEAwUSI8NEgtKktPS1A7TlEpW09PNCMiWCAsLzs4OVE4SitPSzw0WDVKJCQyJTggUSFbTzsgKkBBWAorTSEmIFg+QCEoO086XjwgIFAhMlwgM0tEICAnQjA0JF0iK087Ij4mMlpBJlc4Iyg0ICAgL0g7IEkhW086XworTSpAQVghNiAoMD5bVk9CSCg+IDhNMS86WDRYNEghNEpOXk1RTiIgUE4gIyNWViY4JD5CTUAgR0hNKCQwMAorTUE1LiQrNDNaWyIhJCQqW1paREhOXl0lRiEnSCE4IClaICEgTl5cWSlQLCIlOVAgI08iXE5eTzEuTjAgIAorTTQpITgzVCdOXl0wQiBZKihUKCcwS09LUFQqW1ZOIigmREggTTA/S1g4ICAjRERKJTsgKVohREhOXl0tRgorTS0iIU5fXkBNNC9LQCs2QCAhL0tENCpbX1okQU5dTUEoO09LODImW1pXIlwlK1JbWlkiXE5eTiEuTjAgIAorTThMWS9bUCA4OCMoSDtPOlQ9QSM2QyIhTl9eQEhUJUJOX15CWVBWN1IyJltWViRBTl5NQSg7T0s8K1A1KAorTTtPOyQzS0QgIChFJjNeXCAlIkEgMkpbWlYmPCorN1AgIEA1N15PMUAnREhOXl0pRyJCVVwgICglNj9LVAorTTggWSorT08wOVBATT8gICIhNU9aXSBQTiAjR1ZWJlw2Mj5bVlYkJ0wgICRGIiIhIzJBIUcgICs2NEgtQAorTV0kJ05eXTBGIiJATl5NUU4iQiEjJCtQICwlKiM4ITkqJSY4KCgkLDBPICBQOCAwQDBRIjw0SC0zQSY7SgorTTJCW1tTVjgkMkg1TyIiISMkKltfX1UqIyogNEAhOSIlKzQjWlwmIDw0SltaVyRKTl5NUU8hJEg0OUBAQAorTTBRIlwgIyFAISIhIyQpUTJAVS4kOk4hKitPTzE5QDhYPyAgITggKjlTISBOXlxZKVAiKCxQKCVHKEJcTgorTV5PMS5OMCAgNCkhODNUJ05eXTBCIFkqKFQoJzBLT0tQKEA6MkAiVSFeT0EpW09PNDggICIpJEolOyAxWgorTSFGICYySDVGIEdIITJCW1tUVjhUKCZbX1oiVTBeTiBNOiAgJF5OMTBLT19IMiZbVlYhIE5eXF0pUCJcIAorTStQNE8rT0tEK1JbWlgkWlkgICFFS0RfTyAhMUAsQkFOXUshViQtOiwoJltfWiJDMDYqW19aK0cjOT8pKAorTTtPOzgkIltbU1RHICtQIE8hNEFOXUwxLk4wICBCQ1EvW1AgMDI+W1ZWIFBOICJXVlYmOCwrN1AgIEA1PQorTV5PMTIzJiA+MkJbW1RGPCorN1AgIEA1P15PMUAjREhOXl0hRyIiVVwgICglOD9LVCQiW1paREIgMD9EIAorTSBANz0iIyAgICAgIDlSSEYjJiAqKCQsLCQgIUU5UEEyQFIhIzJBIUZcIiEjIyEgIDk2OCQkK1AgMTIhIworTTJBIUckJSojOC84RiMmICI0SCxAMFRIMDlPQSJLT0tQMkJbW1Q2OCQ+QCVAIEdIICQiW1tTREcgUCg1RworTSAgJC4rUltaXSRaWSAgITBEJUEvKEAuMkMtIiEoQDoyQCJVIV5PQUAgICNQKCZbX1oiIDAnNCNbVSVCTgorTV9eQSlbT080MD5QICAyOCg4ICAgVSIhTl9eQEg0JUJOX15BKkE2SCYqQ1FfX19fXzJIUUYhQkFZICAoJQorTSknQCA4IDpYQTZQKDRIMD03LzpPOU8xKitPTzE5QDFaIDYgIj5AIDArT08uMjwjIEE2PCgoIDowQSJVIAorTV5PQTMzIjgsRjwxQD9HSCErNDdfXiYhVjI+W1paRCdMICAkRiImIUooJFUyMzFVMF5OSDArT0tKMjwhWAorTT4rIiQ4TiEhXkAgXjxBMlAmJTMpX19RRlRDIFskQDkuXlAgIiBHI1k+T0s+X0FbWTwvRiJeN0tZQk9dMgorTV43S1pXT1JQX0FbX1VPRVpfXTtfUE9GIl9WW1k+T0YqPic1UztWWUw6NkFHOUY1RDhVQTUzVFEnMTQwIAorTSAkSk5eTyFMISdIIDggMEorT0tQMkpbWl4mUCQ+ICFAISJATl5PQE8rT0tUM0tEICAlIjA2JFxNMC86SgorTStSW1pbJFpZICAhMEQlQS9HKDY8QCIgI0QoUjxAKVIkRypbVkpESE5eXSVGPkYgVjRYPUorIyBLICEgIgorTUAgICAgKDFHIkIgJzEoIlBKUCAsOzE4RzJAICQyJS0uTjAgICo2KTgzUjFLICAwTiRVLiclL1AgKCUqIgorTTRYOUpRRiBcNFg9SisjIEsgISAiQCAgICAoMUciQiAnMSgiUEpQICw7MThHMkAgJDIlLS5OMCAgKjYpOAorTTNSMUsgIDBOJFUuJygmW1pdITMwNEgpMktPS1QoJltaXSRIMDlLUUAtRS4nOkJQUCpQIDAgSCAgICAiJAorTTlQSEAhVDIgTCpMICMmVDYpVEggISRBMzNLRCAgIkVCNiRcRDpQICQrQS0zQVEzXCAjITJARS5OXk9BSgorTVErRyM5JyEzQVZITCwiTCAkICogICAgIEEmPCooID0kQCsiSyAgUU0lQj0qICAxKDRUWlkgICBJOEVBLworTSkmTCAhIlgzNFg8NFclKiJOPC1FUiYgVjRYPUorIyBLICEgIkAgICAgKDFHIkIgJzEoIlBKUCAsOzE4RworTTJAICQyJS0uTjAgICo2KTgzUjFLICAwTiRVLiclL1AgLCUqIjRaW1pcJkskOCNRM0FWSEwsIkwgJCAqIAorTSAgICBBJjwqKCA9JEArIksgIFFNJUI9KiAgMSg0VFpZICAgSThFQS8pJkwgISJYMzRYPEA7T0tMJS0hMgorTUBFKk5eTlBAO09LTDJBIUZPJEhOXl0lRy8mIFY0WD1KKyMgSyAhICJAICAgICgxRyJCICcxKCJQSlAgLAorTTsxOEcyQCAkMiUtLk4wICAqNik4M1IxSyAgME4kVS4nJS9QICglKiI0WDlKUUBSTiAgICAgP19YOUEgQAorTTtPX0goJSE4S09fSCgoKSJLT19YJyFVRiAvKCQpVEggISI6JywiTCAkICogICAgIEEmPFAsIkwgJCBAIAorTSAgKUYnKTdLICBATyJEQVggIEhPKlAgKDNLRCAgJSooM15cICMkSiA5UEkoNFRaWSAgIEk4RUEvLCJMIAorTSQgQCAgIDVHIScjXzggKEAgRFNOLy9TVkAkWT4zRzUuNU9cPDItPFxYJEFYICxBIklUQU5fU0EuTjAgIAorTTQjQS9bUCAsPk9dXCAiQU4gIEEoPiAgRTIlMS5OMCAgODBBMDNSWCA5UCAgX0UqJyokPE8uMCAiITMhKAorTTUkWlkgICFBNiUhLytAICwtICBEPiAhRiREQTQzS0QgICUiUDYkXTNAIlAgNEg/OVFXWCAoIDtFQCQ/VgorTSIyI18uIlxZICAoJS0kQTQzS0QgICYlODQkXzlQIjEsNERQMCRERyA8Ry5QQDYpQDA/SCA6RygqTCFBNAorTVI/X1w5RShQLlEoJjNPTCAgT11aICFQIClAIEYgIjggKUAgRiAhOCAuICBSICJQICFQICE4KlggIVAgIgorTS5HUCAgNiBcLkdQICEmIFYuR1AgIFYgUC5HUCAhRiBKIiA8ICAmPCYuR1AgIVYgPi5HUCAiJiA4IiA8IAorTSAmPzAuR1AgIEYgLDxXIU47Jj1GOTQ9JSpCNCAySDlNI0coUk8oJUwiIjotTkg5TCBCSCY0SDk4MlBAJworTSAgJUcgL1tcIkg8ICAgICI4ICNfMEdYIDJINU00JE9OX1NATCtAIDAoRDhCS0AgLDJJNUYkRyghKkglQAorTSMlIk4gIFFAKiVCTiAgUUAoQiA1NFghUiFbIiE4QUBQLlBIJjNPTCAgT19IX15DX1ovX0JfXitfWi9fSAorTV9eQTJBVUImNiRWXkE2XlgzLlhcWC9cPDNFWS49NFk2X11RKFVTU1gpJlggIidIUisgNEo7QCAsKUJYIAorTSQmICxOSC1HICAjUjYpNTJBNSomKiRJWCAmICI0SDpaQFY8ICAtQSg+ICBFMiUxLk4wICA4MEEwM1JYIAorTTlQICBRJSonKiQ8Ty4wICIhM0EoNSRaWSAgIUE2JSEvK0AgLC0gIEQ+ICFGJCRBNDNLRCAgJSJQNiRcTAorTSAlKidWPD5aQUY6Uj4gJV4gIlxZICAoJS8kQTQzS0QgICYlODQkXzlQIjksNERQMCRURyA8Ry5QQDYpIgorTTA/SCAyJygqTCFBNFI/X1w5QzBQLlEoJjNPTCAgT11WICFQICkgIEQgIjAgKSAgRCAhOCArICBAICIgIAorTSFQICE4KlggIVAgIjYpNUAnIEAnICAhMEU2IDQiIDwgICVCNTggUVM8JllMOVY5RTFUNEopMCEyQTUqJgorTSIgPCAgNjwgX1MgKkFQICAgIClAIC9dVjJIMUcgL1wsMkgxRiAvXDIzLlhcXi9fPDNFWS49NFk2X18xKAorTVVQIyA/QCFcICIpTiAgQUAlJSomV0g8QiFeNiFXSCQyJjRHIVdIJVIsKVohJCElKEAkJ1kgICglVzBAUAorTSAgKCAgJjs6Mkg5RyRAUDEgIjFGIyIhTiAgUEBBVSkpKCBFQCBHICAzLlggUC9fVDNFWS49MilPICAwQAorTStQICg7UykiQDBATyAgICAhVjwkJEwlM0AiISBZKEFAIEIrITQ8Q19fJCkgNFghRF0iICgiICAgIDY8IgorTSxMJCggICAgOVAoMlA0WVUgICBCK1AgKDlQWDAgPiYpJEAjQUIxKCBYOEQyICIpTyAgMEArUCAsO1MgKAorTStQICAgID1HISErITRYIEAwLjIoOCAoQlA1JyhfX1EiMCUuIDkvMEAiIEAgICAlRyBDKyEiICAgICY8IgorTSRMJEArUCAkM0c0ICAgICAoJlwgISIpKDxPXSomNT8pX19RRiAvX1g0WEYzUiIgKTNHNCAgICAgICAhLgorTTVPX1AyLTwgUCIpTiAgQVIgISAxMjwgTiAkJ1kgICglVzBAUCAgKVggJjkkMD9EICBANz0iIyAgIFdAIAorTTlROTIyMSAxMjwgTiAmI0g8QCUyMjEgMTI8IE4gJiAuKCA9XCpbIiY5XllcKzsiJjleOSFeMCAiIT1UKAorTSwgICI+ICFGIScgIDgjKVwsKVInOCBbPEFCICZZOCM8QCcgUEQoPzxAJSkpJCElKVAiWCAwP0QgIEA3PQorTSIjICAgR0AgOU1RKkA2OCIxKDhAIURTTiAsI19cJFk+M0c0ICAgICAgICEuNU9fXDA/RCAgQDc9VD5YIAorTSIhIDA8QC8gQDRZPjNHNS41T19cMD9EICBANz1UPlggIiEgMDxAJyBANFk+M0c1LjVPX1wwP0QgIEA3PQorTVQ+WCAiISAwPEArIEA0WT4zRzUuNU9fXDA/RCAgQDc9VD5YICIhIDA8QDMgQDRZPjNHNS41T19cMD9EIAorTSBANz1UPlggIiEgMDxEIyBANFk+M0c1LjVPX1wwP0QgIEA3PVQ+WCAiISAwPEBDIEA0WT4zRzUuNU9fXAorTTA/RCAgQDc9VD5YICIhIDA8QSMgQDRZPjNHNS41T19cMD9EICBANz1UPlggIiEgMDxAPyBANFk+M0c1LgorTTVPX1wwP0QgIEA3PVQ+WCAiISAwIEggICAgIjczRVkuPTRZNl9fUSFeMCAiIT1XMVtAICgkISFSJVwiIQorTTNFWS49NFk2X19RIV4wICIhPVcxW0AgKCQhIVIoLCIhM0VZLj00WTZfX1FQICBSTiAgICA/UCAoNFwhJAorTSAkWT4zRzUuNU9fXCgiWCAiJylfUCglLjdEWVUzRTtfXCRDNyAsIEA7QCAoJEJYICNSWE4gISEzQVZMLAorTSchQlwgNjtWNFRAQCImICI8ICEsW0AjIF9fIS43RFlVM0U7XU8kQzcgLyEqLjAgIkxNIUYhRFpZICAhQAorTURCQE4gIEBKK0AgLDlAICQgREokOUAgIEVHQCA/QCBMLyAgIkxNIEovICAiTE1cTyEyXCYzS0QgICYkSAorTTQkXSpAJjgyNEg9UiNdSiFXKCVSIUtaITs+KSpBJj04MidEICBLKzAyJ0QgIEpbJDNLRCAgKE9YNCRdXgorTSNQOicgICpSVCJQXCAgKlMuNEFZICAoKDUkQVkgICpOUSRaWSAgIitUJSEvK1A9KD4wICJLTDEuTjAgIAorTUJdITAzV0gvV0g2XkFGNzQoI1AgIEpbJDggICNHQiBcICAqUlQmICAgWTBAISIoIFo4JSRALSIhIUggIAorTSBLKyE4ICAjQCRBWCAiXE8hNFpZICAhQSIlIS8ySCFHICAkVitQNS5OMCAgNCkhODNXWVhMKD1OICAsOAorTStQNSg+MCAiS0wxLk4wICBCX0EwM1JYXCAgKk5RJ1AgMidEICBAQTYrUD0uTjAgIDg5ITAzUlggOUAgIAorTU1HICA4ICAjKUJcJzInQCAgNFpZICAhMk4lIS8ySCFGICAiWjwgIUAgICwsK1A9KD4gICIzS0QgICUqWAorTTQkXSpAJjggICohUCAmICAgTyhPIVRBWCAgLS5OMCAgNEtBMDNUSiA5QCAgQUcgIDggICJWIlwnMidAIAorTSEkWlkgICEyTiUhLzJIIUY7JyAgOCAgIlAiXCcyJ0AgITRaWSAgITJOJSEvMkghRjUnICA4ICAiSiJcJworTTInQCAhRFpZICAhMk4lIS8ySCFGLycgIDggICJEIlwnMidAICFUWlkgICEyTiUhLzJIIUYpJyAgOCAgIgorTT4iICY8QDpQQDYoNiwjTCohRFtbICArXzBPXTxfVztfRC9eSF9cI19WJ1ggNEg5UiFbUiE7MCNfI0RBWQorTSAgKCg2JCpHM0tEICAmJjA0JF0qQCY4ICAuKSg+MCAiTE0hKDtPV1wrUDUuTjAgIDVRIS9bUCAsL0AhTQorTSAgJzoyRD1HLCRBWCAwJSg7T1dcMidEICBANzwzS0QgIChNIDNeXCAjJEFYIDAlKDtPW10yJ0QgIEA8IAorTTNLRCAgKE0gM15cICMkSiQ5QCAhVURBWSAgKlJXVEFOXzxQTyE0WlkgICE3PERfTyAgUE4gJj1QKCQ9KgorTSQmPSQyS0QgIEBBKDlQWE8uMCAiIiRBLk4wICAsIVk4M1IvJyAgKCgyJEFYICMhIVtPVywzXl9fVCIpLworTSwjUCAiUis4NDxDX18iXFkgICgoMSRaWSAgIiswJF9PICNBKkEmOCAgNlEoPjAgIkxOWE8hNEFYICAtKAorTT4wICIiJUkuTjAgIDZZOS9bUCAwL0AhTCFHICA4ICAhNERJJzlQUShRUlwnM0tEICAjQVY2JF0qQSY4IAorTSAzISg+MCAiTE9VKDtPVywrUDUuTjAgIDYmMS9bUCAsK0AhRyAgIz4oJD0qJCY8VDJLRCAgQEEsOVBYTworTS4wICIiJFEuTjAgICwhWTgzUi8nICAoKDMkQVggIyEoO09XLCtTRCAgQEEkM0tEICAoTSAzXlwgIyRKJAorTTlAICBVJEFZICAqUyMiXCUyJ0AgITRBWSAgKCg4RFpZICAhO0VEX08gISBeICZQLDBHRCAgQEAyPCAhQAorTSAgIlQyRD1HJEQpWSAgKCgkREMnK1A9Lk4wICAuJzk4M1RKJDlAICBDJEFZICAqUyZSXCUyJ0AgIURBWQorTSAgKCg6VFpZICAhO0VEX08gISBeICZUVDJEPUcjJEMnK1A9Lk4wICAuJzk4M1RKJDlFOSg+MCAiTFJITworTSE0QVggID0oPjAgIiInOS5OMCAgNlk5L1tQIDAvQCFMIScgIDgjWSoxVjxOMiw8TyFUWlkgICBYPUVBLworTTgiIEAhJ1gnTCg9QiYjIFsiQDkuXlAgIl8pW11ZT1hcX0o7XlhPXF5fWDtfTkQqRytQMS5OMCAgNEtBMAorTTNUU04gLyNdTyRZPjNHNS41T19cK0g8TytAIDArUlggIiRBWCAgJSg+MCAiIigpLk4wICA2WTkvW1AgMAorTStAIU8sREFYIEAoTytAICwrUD0uTjAgIEJJOS9bUCAsIyggICAgKCI5UFBPIVRaWSAgIFg9RUEvP09cTworTSFUWlkgICBYPUVBLyggPE4rT19cM0VZLj00WTZfWzEoVVIjQCtSWCAkIlxOICBBKD4gICIyJ0QgIEBCKworTTNLRCAgJU42M15cICQiSCA7MCAgT0RKJTlASEAvICAiIik5QCAgIlIyJltfUSJcJTNLRCAgI0ImNCRdKgorTUAmOCAgKVBAK09fNDUoIE8gJFpZICAgTyIlQS8rQCFHICAiJitSW19VIlwnK1A1Lk4wICBCSTkvW1AgLAorTUwqW19VJjlCKkZYICMiUCdXKltfVSIhJiQrUCAiRSomKCQ5IiQkQTUrUD0uTjAgIDZDKTAzUlAgOVMpKAorTTswICQrUDkuTjAgIDZDKTAzUlAgOVIhKDswICgrUDkuTjAgIDZGQTAzVEogOVBYTyE0WlkgICBYPUVBLworTSggPUAlQlwlM0tEICAjQVY2JFxPIVRaWSAgIFAnRUEvPCAhLFtCI0BfWzEuN0RZVTNFO19NJEM3KC4gTworTStAIDArUlggIiRBWCAgMSg+MCAiIik9Lk4wICA2WTkvW1AgMCsgIU0gICY6Mkg5RiJCIFwgICgoSFYgIAorTSA4WSg7T18kK1A5Lk4wICAuKDkwM1RKIDlAICE+IiBOX10xNEAiXCAzS0QgICJcKDYkXEogJjwgIDYoTworTStPXzQrUDRPIURaWSAgIipFRF9PICBSUEtPXzQ5QCAhL0JJTiAgUE4hPVpOX10wQDFRIlwgIEkyQVIhJworTTBBISg7MCAsK1A1Lk4wICA2QykwM1JYIDlQICEiREFNICEgTyFUWlkgICE6LEUhLytAIUcgICNWMiZUIAorTSUiXCczS0QgICVIUjQkXE4gJjwgIC4pKDswIDgrUD0uTjAgIDZDKTAzUlggOVAgIFNEQU0gIVBPIVRaWQorTSAgITo6JSEvK0AhRyAgIloyJlQgKCJcJzNLRCAgJUhSNCRcTiAmPCAgKjkoOzAgRCtQPS5OMCAgNkMpMAorTTNSWCA5UCAgRERBTSAiRE8hVFpZICAhOk4lIS8rQCFHP0RBTSAiSE8hVFpZICAhOyclIS8rQCFHOyRBTQorTSAiTE8hVFpZICAhOyclIS8rQCFHNkRBTSAiUE8hVFpZICAhOyclIS8rQCFHMiRBTSAiVE8hVFpZICAhOworTSclIS8rQCFHLURBTSAiWE8hVFpZICAhOk4lIS8rQCFHKSRBTSAiXE8hVFpZICAhOk4lIS8ySCFHJEJcJgorTTNLRCAgI0FWNiRcQC8gICJMT1VAJUJcJjNLRCAgI0FWNiRcTyE0WlkgICBQJ0VBLzwgISxbQiNAX1sxLgorTTdEWVUzRTtfXyJaJytCWCAiIiFOICBQQEFUQVggIEhPIVRaWSAgIUEiJSEvK0AhRiEnICA4IEBAMVQoMAorTTRIPEAhUlhOX19RLjdEWVUzRTtfXiJaJyhGWCAiJEgxOVBQQDtAICwoKEVAKERKJzlAMVAgJiBKPEMiXgorTUA2VC48Q0ZeQDZYKDxDIj5AMSonOCAwMk8gIV80REQwJDRHICtAIVIiS1ohOU0pIiYyICkrQltfXiRZPgorTTNHNS41T19UMi08IFAiKU4gIEEqJDY8QCMhJCAiRjgqKCZYICMhIlwgJ11ALUdQIDgiIVIsK1ohOzA5UgorTS47WiE7UDFQICYgRlcoOEIhTjYhVygnPEFXWFBHKD0yMjEgMTI8IE4gJygqT0glRlUiIU4gIFAwQUQoOQorTSggRSxbQCMgX18xLjdEWVUzRTtfXSJaLSpGWCAiJEg1OVVQQDtAICwjITQgIkY4MCQrUCA/ViEwJCtQIAorTSA2ISAwQSFALyIpLTREVDAkNEcgPEQ6UEA2P048RFpQQDY/SDxFMlBANj88PEVGUEA2PzY8RjpQQDY/NgorTTxGWlBANj8wPEcyUEA2PyQ8R0ZQQDY+XjwgIUAjQFA1ICBJRyEnICA4IDEiJzIgLSpGW19dJFk+M0c1LgorTTVPTzwyLTxAUCJJTiAgQE4rQCAwKCQ9KiQmOUoyJTUuTjAgIEMnITgzUlggOVA4QDFUSDA5RTkoPjAgIgorTSIqMS5OMCAgQychODNSWCA5UDhAMVRIMDlDWSouMCAiS0sxRiwkQVkgICgoSjRaWSAgIiw8JUEvK0AhRworTSFCIScyQSFGIiRBWSAgKChNJiAiK1A9KD4wICJLSzEuTjAgIEJfQTAzUlhcICAqTk0iIE4gIFBCIC5GIQorTTEoIzBAMDogICAqUlAyXCArUD0uTjAgIDgyQTAzVEogOUEwTyFSXE4gITEuTjAgIEJfQTAzVyAgOCAgIQorTVIiXCczS0QgICUiMDYkXVwjSyImO1A5UF9WICAgOykoPjAgIiIrOSg7T1AgM0tEICAoT1g0JF0oNTRBTgorTV8gIS5OMCAgQl0hMDNUQVkgICgoUFRBTl8gIS5OMCAgQl0hMDNSXCcyJltcICRaWSAgIitUJSEvMEo9KAorTTtPUCAzS0QgIChMVjQkXEwgJlE8IytEICAgICIgICggMSY5MDInRCAgQEMlMiZbXCAkWlkgICIrXiUhLworTTIlNSg7T1AgM0tEICAoTzA0JF0oPjAgIiItUSg7T1AgM0tEICAoTzA0JFxPIVRBTl8gIS5OMCAgQl0hMAorTTNUKkcyJltcICRaWSAgIistRSEvKyAhKkFGVC4rUDxPK0AgNDNLRCAgKE9YNCRcLEtAICAgICQgIyY4IAorTSAuMSg+MCAiIi1ZKDtPUCAzS0QgIChPMDQkXSJJVEFOXyAhLk4wICBCUzkwM1JYIDxPXl5ANjgqM0tEIAorTSAmIS44ICAgTERBWCAhQSg7T09IK1A9Lk4wICBCSTkvW1AgLDxBQlBANjw2M0tEICAmIS4rUD0uTjAgIAorTS4nOTgzVyNfOCAgIEEkQU5eXkEoPjAgIiFOMS5OMCAgQl9BMDNSL05eX0AgIEA7VDJLRCAgQDtYOVBYTworTS4wICIhT0EuTjAgICwhWTgzVEpOXl9RTzVCXE5eX1EuTjAgICtQQTgzUkkgK1JbW18kQTUrUD0uTjAgIAorTUJJOS9bUCAsTCpbW18mPDQrUD0uTjAgIC4nOTgzVFpZICAhQDNHI184IShDUzAgIiFPQE8hVFpZICAgWAorTT1FQS8oIDksW0IjIF5dUS43RFlVMEtEICBAO1grUD0uTjAgIC4nOTgzVFpZICAhQDNHI184LVEuNU9fXAorTSgjRCAgQEEkM0VZLj00WTZfXyEoVVIjICsjUCAgQENCK0NQICBARUgqR1AgIEBGXTJLRCAgQEAiOUAgIQorTVYkQVggKyEuTjAgICtQQTgzUi8gICAoKCBESlkgICgoIEY9WitQOS5OMCAgNCkhODNVKiArUCEuTjAgIAorTStQQTgzUi8gICAoKCFGPTwrUDhPLjAgIiIgOS5OMCAgQl9BMDNSXCczS0QgICUiMDYkXTJAIlwgM0tEIAorTSAiXCg2JFxDUCAgIiIgSUcrQlwnK1NEICBAQCozS0QgIChPWDQkXSg1NFpZICAhMEQlQS80SCBPICRaWQorTSAgIE8iJUEvKFwgICBAQC45QDlQICYgICA0MSg1MlxZICAoKCNEWlkgICIrXiUhLysjRCAgQEAmP0AgQAorTT4wICIiICkoPCcwICtQOS5OMCAgNkMpMDNSUCA0RDwsMVAgLDs+KV4gIiFZICAoKCBEQVA9IyBPIURaWQorTSAgITosRSEvKyAhMjFQUScgIFFNWEJQWSAgKCgiR1ggKCdEICBAQCIyJyFUOCJcJjNLRCAgJUhSNCRcTAorTSAlKScjJDwgIVZXQj9AIEA+MCAiIiApKDwnMVwrUDkuTjAgIDZDKTAzUlAgNEQ8LDFQICc7PihMLjAgIgorTSIgWEAuMCAiIiAoJkAgICAgKUBPICJcJjNLRCAgJUhSNCRcTCAiIFkgICgoIEA6ICAgICBHIlwgK1A5LgorTU4wICA2QykwM1JQICgjRCAgQEAiIUggICAgIkArUCBPIURaWSAgITosRSEvKyAgQC4wICIiICgmQCAgIAorTSAqME8gIlwmM0tEICAlSFI0JFxMICIgWSAgKCggQDogICAgIEoiXCArUDkuTjAgIDZDKTAzUlAgKCNEIAorTSBAQCIhSCAgICAiTCtQIE8hRFpZICAhOixFIS8oI0QgIEBAIjMuWEBQL19QM0VZLj00WTYgICEoPjAgIgorTUtLMSg+MCAiIU4xLk4wICBCX0EwM1QqWSAgKCZdJEpZICAoJl4mPC4rU0QgIEA7WDNLRCAgIyA+NiRdIgorTU4wICIhT0EiTjAgIiFPUS43RFlVM0U7X18iWic/QCEoPjAgIiI/OFAhVEMgKEAjSUA0MiBUKCQmQCAgIgorTUxNIE8gJFpZICAiK14lIS80RDwsMVAgJzs9OSg+MCAiIj9BKD4wICIhTjEuTjAgIEJfQTAzVEFZICAoKgorTSAkQVkgICpSUCRaWSAgIiteJSEvKF9QICBASCIgICpSTCIvXCAgKCohQCAiTEswTitPX1wzRVkuPTRZNgorTV9fMEA7QCAoJEJYICNbKDA5QDBAIiYgJjJBQUZdJyAgM0VZLj0wICAzRTtfXSJaJygmWCAjIilOICBAPgorTSYrWDE5QEEqJjY7VjwgIUAiQSAxMjwgMigkRyFEKCROK09fVDNFWS49MCAgM0U7X10iWi0oRlggIiIhTgorTSAgUUAlQkkoOCBAMCU7IDE5UDkyMzRINTlPMSolNjwmNERFKiQ2O0ZEXlggIiIgKSpGW19dJFk+M0c1LgorTTVPX1gyLTxAQCJYTiAgQUYhQlhZICAqTzEkSic5UThPK0AgLCtQPS5OMCAgODVBMDNdIicqRCEqJTY4JAorTTwgIUAqIlxOICBRKDU0WlkgICItIiUhLytAIUYiJCpZICAqTzEmICwoJD0iJCUqJyhcPCAgSl0kKCBVLAorTVtCIiBfX0EuN0RZVSAgICAgJFk2XzxBKFVTI0ArIlggJCJVWSAgKlMvL19UP0AkTTFfX1grNDtfXyRBTgorTV89USg7T1dAMiZbX10kQU4gIEEuTjAgIDxFOEA7QCA4KCpbXVkiSU4gITBKK0AgPCgiW11YJ1glTCg9QgorTT8jIFsiQDkuXlAgIiAiWCAjICAsICQ4IDYgITgoIltdWi0iJipIISpBRl02Ml5bXVsiQSUwPzlJKC9XTAorTStAQDhXO08nOT9JQDAnWCEqSD0qQUZcWCpENEgxTUclJk9QICwrTyw5P0FAKiQqNStDRCAgQEhAPEBCXAorTUA2VCw/IEFAIkQqNStDRCAgQEg8PyAsSjFSQSVXSDg4VztPJzk/SEAxNChQOiAgQCE0U04sLiNdUiRZPgorTTNHNS41T1coMi08QFwiSE4gISBNPjAgIkxTU19dJCpOX19ATTE/X1wyJltdVyRBTl8+ISg7T19UMiZYIAorTSIkWlkgICFSNUIhTiAhQEBLT1dEKiJYICciWE4gITBAK09XQD8gNlBBRiggICsoUC5QSCYzT0wgIEAhJAorTSAgUCAjICFSICg4IEFESiU7MFBAMVIgTl9fIjBBMiIgOCA4QDFSIk5fXyFeICRPTl8+UEwhJiAoKCQ4MAorTUc1Kic0SDpeS09fUDs/KEAxLSdOX18hIiQmIUQoJD0iRCIhJCQrUCAsI0lcICAmWkM2XDY/QCc+QS1KJAorTSsgNEAxUSJcICMhMjM1KidPSDlFXEQoVTIgIUAtQiEnMEkgTC4wICIiQiFeIitKJzswWVoiJiAsKCQ9IgorTUQiUFkgICgqJydIIytAOEoxLVIlKCQ8OlQlKidPSDlFXUIhJDBDITggIiAkMy5YQFwvVygzRVkuPTRZNgorTV9eIShVU1NAKiZYICMiWE4gITEuTjAgIDdDOEAwIiEwJyEgSjFUSkwgIDFHICAmICgkPDBPICBNNEg8SgorTTFWICAgNyg6XyAgUDJINUcgICYuJkw6OVMlLSorQEpZUVZQICA4IDpfICBQNERRQFxHWChNPD1MIiJBWQorTSAgKCouJiAuKidEICBASFQ4IDhIPjAgIiJDUSolJjwgIDU4OlcmI1YySlAgIiZYLiggSTZAJDIgTCpQIAorTSImXCAgKUg6WyAgLCZMOFY/ICAhP0AlQCFBSzI0RE0yQVQ3VD4gUSokRjtSMkg1RiMgUEUgIyFHXktQNQorTTlQKTIzMUtcICY0SDsgIChWPE0zMyRKLDpQODpfICBLOCBIOl8gIE0oIFEkQCJBIDImW19fJyAgLCBQTworTSAkWlkgICFYRCUhLz9AISlbT19cOCAxMkFVKSwjITAgLCY/Vj8gKl5BRlwkP0ApQCInUCNPSDlOICAiXAorTTI/OVhfJCdOX19RNjIiWCgmTVJZUVYvWjggICBJRyAhRChKUEsgICg7QzleICI5JzggQDpdK0AsNEg9MgorTTJSICpUKlAgIitaIDs+WDpRQjknMkMyWCMmPSBPSElMLyJYKylESDpdJ0AsNEg+XkJWV1Y4IlA6XyAgUAorTSZMOV4gJiAmJk9QICwlKicoIlAgIi0iKjEoIl5AJldOP0AhQCEhSzM0SD0nXSdALDJBLUZdJEolOUMwLAorTSkwIFA5X0pcJTY8SjREVUApQjFOICBASitAIDAoITFeITsiJzhAI15RQyBbIkA5Ll5QICJfRzteTy9aXAorTV9JO15LL1pMMEE1LFtDU0BfXiEuN0RZVTNFO11XIlVZICAqUy8vX1Q8QCRNMD9fWCs2WCAkL19cMiZbXQorTVckQU5fPiEoO09fVDImWCAiJFpZICAhUjVEX08gISBPK0AgOCtSWCAlJEFOXz4gTytAIDAzS0QgICYvOAorTSgiWCAmJFk+M0c1LjVPX1wrUlggJSQqRytSWCAkIlxOICBQTytAICgzS0QgICY2TjNFWS49MCAgM0U7XworTVwkQzcoLCBKO0AgLCsiWCAmIVhOICE8LCFQIFA5QDkqQUY8ICAsWEI7QCAwPEAmI0QyIU4gIEBAJCcoIworTUwoJUI3QyBbIkA5Ll5QICIgIEAgTCAhMCAkQCwhUCBVOzAgIEhAUCcgIzVOMCRKJjlDUSpLMCgwO1AgIAorTUQkJ00gIFBAKzAoMCQjIChfVEcgP0MiMEFXKCEySCFMIiQyIFAoJSRAJiAiUCglKkAmICwySlQgISY5QgorTTggOSpLMCAkOVVITiswKDA0WDxMIVYgLDJIPU0kQSpcICMhM0FVLiYwXzVIIyBQMSAjRUdaREonOzA5MgorTS03QCw4JCg7PyAgUSAgUEA7QCAoIypAICAgICEgIDFGIUUqTSAgQUAqJEpNIEEhTyJCIE0gQSA7TyAgUAorTSIgUTJLMCgwOCEpKkswKDA7QFA7PyAgUCAgUV4gMk0nIEEgQCswKDAwQzQoIyRTTigsI19cJFk+M0c1LgorTTVPTEwyLTxYUCNVXCAwI11eI1VcIDAjW1wkQU5eXlEoO09XWCtSWCAiJFpZICAhXkJEX08gIFEqS09PTAorTTpCISg7T09KKCJbW1skMiAgSCAgIC9fXytQISg7T1dYM0tEICAnUlYzXlwgIyRBTl5fISg7T1dYM0tEIAorTSAnXyo0JF0qS09PTDtASSFbT09QKzRDW1kmIVQyJltbWSJcTiAgUE8rT09MMidAICBEQU5eXyEuTjAgIAorTUAzKS9bUCA0KCJbW1kmPEg/QCZQQVY5KitSW1tbJEFZICAoKjckQU5eWTEuTjAgIEJPIS9bUCAsMiZbWworTUUkQVggIilAKCJcTl5eUSg+MCAiIkclKDtPTSQzS0QgIChLUDNeXCAjJEFOXlQxKD4gICwzS0QgICgjTgorTTQkXSg7T00gKCZbW1knICAsIkAgIEQnUCJAOVAgIyBIX19YTyAkWlkgICFYRCUhLz9AIStbT00gOCAxMgorTUFVKS0jITQgLCY/VilGWCAkKU8tPyAuXkFGWD4wPzlZKC9NICtAQEgyVCdOXlQhNjIiUCgoJDw4VCUqJworTTREVl5BRi9UKCZbW1knICAsIkAgIEU2ICtAIU0pTi4nMD8vOCAiUCgrUDhAO09PRDwgIFAsJ0AmK1AhLgorTU4wICA+KSEwM1VBLTYoOTVBVktCMEMvOCAiIU4gIUBAQzIhTl5eMFAqICAkMiwgQDtAIDQoKCEhW09PUAorTSgiW1tZKyIoOVBITyAkWlkgICIgVEVBLzMuWFhQL0xMM0VZLj00WTZeUjEoVVIjXCpGWCAlIkhOICEgTAorTStAICwrQlggIiIhTiAhQSJEIiEnMkpAICEmOFQ/QCBIIzYgKigkMDBPICBQNEg9MkErWiU4XykhXTdAIAorTSpAQUAiQiElJCtQICwlKic0SDZeQUYvUigmWCAnIiInOCAgIj1DVVwgMCNdXiNVXCAwI1tcJEFOXl5RKAorTTtPV1grUD0uTjAgID9ISS9bUCAsLzZbW1tPV1w9ISY0S09PTDxAIFIrT1daWjhGNEA0UFwoICggICRUMQorTTxBI0JKTTImTSg1RCBCMCUrQDZcQVYsIitAOSwvJ0AnICAtMjpAOicgIDpEVScoMFhKPTJBVDInMiZbWworTVoiXCcrUCkoPiAgKjImW11eJFpZICAiISxEX08gITBAK09PSDlSOV4gOyInOUQ4TyBEQVkgICgqQURBTgorTV5ZQS5OMCAgQk8hL1tQICwyJltbRiRBWCAiKUAnQlwiMidEICBASjwyJltbMiRaWSAgIipcJF9PICBRKAorTTtPTSgyJ0AgIyRaWSAgIiBbRSEvKCZbW1ogUUhfXyAgISZZViwiQCAhJEMgMSghSiEnWC9UKD9IQCJAIAorTT9AIVwgJiAuKCZbW1okSVA6IDlGIiUqJzUoOl5BJldOT0gxTCJCIU5eXkAgPCAgITJAOE4hIlAkWFg4SgorTSEuLiUoIDowQTJIIDghIEA7T09ILDshSCFFQCY0SD00QTUyJigmW1taJyAgLCJAICBLWiA5Pio5OiAgIgorTSgmW1taLkYkVjZAICEiIU5eXkEqOiAgJDsjISg7T00mLCJAICEkQyAxKCAiQCAgIF9fXE8gIlwoM0tEIAorTSAnUlYzXlwgIyRJTl5UOUciQiFOXl5AIDogICEgIDkoO09PUCtSW1taJFpZICAhX1JFIS8/QCBeK09PUgorTTRYPEwhXi4mMD85SSgvT1YrIEFAISUuJzU4OEAxREkwOV85KDtPTSA8ICBQLUdMQF5fOE8gJFpZICAhWAorTUQlIS8+QCEhW09NICsgQUAhJSolNEg4QDFAUDAgIyFHXSdQID4gLlpBJlhCMD85OSgvTSAqQEBIIzQnTgorTV5UITYyIjgoKCQwQjExIjE0SDUyQUUqJE5ILUNcJS4nOlMrQ0FUJ1Y+MiNbXUJYKDA/NUggIkgoMD5bWworTV1CQCgrUDRAMVcgICwhIE8gJFpZICAhWEQlIS82KDk4QTU2J09IMURZJChVOiAgQDtAIDwoKDhAO0AgOAorTUUoOEBARCdOXz9AQCtPT0hMKEFHIkJcIDNLRCAgKCMyNiRdLFtCI1xeUjEuN0RZVTNFO0owJEM3Li9QRgorTTtAIDArQlggIic4UDBKW19fIiEnKVUgICEiOkggIDAsSiAgICAgKCAhJjwsIypAICAgICEgIDFGICA5PgorTSomWCAjIFJMICAgIiAgICg7ITAsSyAgICAgJCAhJjg2IypQICAgICEgIEFMIyIhTiAhMV4iKF4wOCAgJgorTSwkJ05fXVBCMVMgXCAgPEBWNScoX19RIVtPXzwwXltfTyMgXCAgPEJWJScoX19QLEtPX19fX19fWSZYKAorTTBKW19YJiAgIDJQLEtAICAgKV9fWSZUKDBKW19QJiAgIC1YQCtPX0Q8QV0qQCZQKDEoIyBANDIgOCArIAorTUA3WD9MKD1GMSIgTl9eMTJAJkgiVCg/SkAiUCA/QCErW09fKDggMSJHNSonT0g5RV4nUCVPSDlMICAiMgorTVk4PSFdR0NIK0BBIVtPX0gwPkAgJSJQKCgkPSJEJUInT0g5RV1GIVIoIltfWSUqIDpAMV4nXSInWkggTAorTSAnWCAyXltfUiYgJDBJVTJBW1omOT9AQCtPX0Q8QV0qQCZQKDEoIyBANDIgOCArIEA3KD9ESCFQID4uQAorTTRYIE4hTjYnUDs5WFIkOiBQOzlYWiUqJitAOVwhO1omOyFTRUFUJ1Y+LkBOIiQnTl9eQSFaICA0KyBAQAorTTFUKjA2KD5eQUY3VjImW19PJFpZICAhUzolQS8ySltfWCY8ViMqUCAgICAhICAxRiIiWEwgIEEyQVYgJgorTStDUCAgIS0kMiZbTDwkQU5bJzEoO05RWCtQPSg7T188M0tEICAmPFAzXlwgJSYgKDBKW0w8JCpOWycwRAorTStOUVBVKltMPSdAIDJKUCAhJjgmMkpQICImUDQjKlAgICAgISAgMUY6QiBMICBBMkArIiI7ViAsSyAgIAorTSAgJCAhJjg6K0JQICIlMidHSCgsQVAgICBAIUMhQlhcICAgIiAnUCE4ITleICJQTCAgQTRBQFImICAgIgorTSAmLCYrI1AgICAoIDImW0o6JEFOWkZRKDtOSVArUDhPIVRBTl9bUS5OMCAgOi4pL1tQIDgqIltKOy1CTgorTVpGQCxLICAgICAkICEmOCAgQCBKK05RUE5KUCAiJlwkKkJQICInWCAySDVPJyRPSyAgUSFbTlFYKyBBIQorTVtOUVhWSEBAMUFLMDRIPTJBS1IlOT8wSjtOUVBWXltMPStPTCAgQU8hIklMICBCXkM2UDgwPkwgIyJQJworTVcoQztSIiEmJCtQICwlKic0SDpcQzY3Uk9KUCAiJjggICowRzFQKDAoICowQVI9ICAgQl5ARlEsT0pbTAorTTwmMColQzlZKC5RWDRIPUAgRzhQMD85WSguUVgrIEFAIktaTlsnIUQjJSonNEg4QDFAUDAgIyFHW0taTgorTVsnIUQhR1ghKzQ/X18kSk5fXCFHICAkTj9AJE0xX19cOCAgISkkSk5fXCFHICAkPDJKW0o7JlwmPUMhXAorTSAmICYlQltKPCdQIStAOSFdRkRAWkcgTCImIChPSDFMIyUqJzRIOEAxQFAwICMhR1wrWiQ7ICAgWidYIQorTSs0P19fJiAgIC1YSisgIChGSD0qQVY4Pj8gIStbTklQOCAxMkFFKS0jITQgLCY/VlZIOzpLTklMVypbSgorTTsmICI/ICJaQSZcIipAMEAhNDIgKVQgICIrSk5aRlFPIUJATlpGUUAgQkAlTygxTCRET0sgIFM7UVFLXAorTSAjITJBVSomTygxTV0rUiU7IUkrWlAgLFZcPEAhSSJOWkZQOl1AREBaRyEyQVUqJk8oNU1bKVJOWkZSXAorTUtOSUg7I0kqQUZQJD1DIUAhQThWOjIjSjwlKiY6QClcICRPVjoyI0o8JiAqTypbSjomUCo0SDkyMzBQNQorTSAjIUdcK1JOWkZBTChHUCErNDtfXyYgOjA+TCAjIlAoVyg9QCJCISYkK1AgLCUqJzRIOl5LICAoOz8gRworTTFQKDArUltfXyRHIytQLE8rQCA0MiUtKDUkWlkgICFGKCYgICBDOSpLICAoOzAgISdCICJUKlAgIiBSIAorTSAgICIgJlAgXl4xXiAkT0sgIFEhW05RWCsgQUAiIiEmJk0hMkFVKiZPSltMPCY3Uk9IKUwmRE9LICBRIQorTV03QCArIEM7UEIhJiQrUCAsJSonNEg6XEM2N1IqQDJYSyAgKDtQMEorICAoTkpbSjsmXCYqIltKOyYgIgorTSogNVwgJEokO1EpK1pQICxWXDw6XyAgUDRIPTJBS1IkOz8yXEE2UDoyXkwgIy1PJyggOjBLTklMJk84KQorTSguSVA0SD0yQUtSJTs+UStaUCAsVlw9QCIhS1wgIyEyQVUqJk8qUCAiJldSKVQ8IiQpMicpVCggIilSTgorTVpGUE4hS1pOWkZBTC8kSic7IDFWLCYgJiVDOVkoLklQNEg9SiBHWCAwPzlZKC5JUCsgQUAiS1pOWkZBTAorTSMlKic0SDhAMUBQMCAjIUdbS1pOWkZBTCFHWCErND9fXyJcTl9fUSlQUlwjK1JYICUkQTMyJTEuTjAgIAorTTlCIUAgICQyKyJQICIkMiYjKCggICAoIDsgI1pSIFImICAgIiAmUCBeS1pUQUZYWk0oOUYiIThOWydBXgorTSA2ICQ9QyFeICRPVj4yI0w+JiAqT0pbTDwmMCo0SD0yMzBQNSAjIUdcK1pOWychRCFHWCErND9fXyQqSworTSBBIUA7R1ggMD5MICMiQCYyXltMPiJIKDggQEAxMSI9NEg9MkEyIE5bJyIwQStaIDk+WV4gJE9LICBSNAorTUFCSCI4IDg6XyAgUDRIPl5BNldWKVQ8IiQrWk5bJyFEKyE4Vj4yI0w+JSonMl85WSguUVg4IEpeS05RUAorTTkgSTJBVSktIyE0ICwmP1BPSltMPCYwJj9AJE0xX19cMkpbX1AmPCY/QCRNMV9fXCtSW19fJEcjK1AsTworTStAIDQyJS0oNSRaWSAgIUYoIlhLIEEhKVpQICxWPD1AIUFDXCAjITJBUiBLIEEjMEFLWiA7PyEiSlAgKAorTSlUPCIkJChTPiBRLFtDQ1xaRCEuN0RZVTNFO19VIlotKkZYICQiIU4gITEiRCIhTiAgQE00L19YKzZAIAorTSEvX1xaPlggID9fWCpUICAhIlxOICBBLk4wICA9LCE4M1JKICghNVIhOyIhOEEwUC5QSCYzT0wgIEAgUAorTSAgUCAjICBQICMgICwkQU5fX0EoO09fODNLRCAgJzVYNCRcTytAIDQyJTRPK0AgLDImW19WJFpZICAhSworTU5CSU5fXTEuN0RZVTNFO19PJEM3LiwgSDtAICgoJlggJSQqMD9AIStbT19QMD5bX1wkJ0ggISBMIiJLVAorTT4gIThBW08mOT85QCUjIFsiQDkuXlAgIiAlICArQCBOICUgIDQgITApRlggJC5HTiAgJ19cIj0gICAxKAorTTUkWlkgICFWSEVBLylIIEAkV1glTCg9Q1JEQTQyJltfVCRaWSAgIVcxJSEvK1JYICUkQTMrUlggIyRBTgorTV9dIS5OMCAgOltJLFtDQyBfW1EuN0RZVSAgICAgJFk2X11BKFVQI1goJlggIiBSSCAgICAgQCAkOUAgIQorTShHWCA4IEAsMVAgJTkgUTIxVyAgLCA9KkwgUCw5XlgsMVAgJTkwQSJKICAkOCAgIF9ESSc5VUkiS09fXAorTT5AIFohV0AlRig2M1I2IC5XKDRBTCZQLEYgUTJLT19cNiRETCtPX1xPKDFFWkBSTiAgICAhP19cOyFTRQorTUFCVSZfXzBAK09fVDBLICgjJUJOX18wLEtAICAgITNfXSZXSjwgIFAhXk4oRDpAICImICI0RD1QICMgJworTTxAMjJAIikhMksiPCMmP04wRltfXkJYSCAgUCxBUCAgX19dQiInIDBYOlxdMC9fWiMoPCBfX19fOEA7QQorTUNVIU5fX0gsQVBfX19fXUIhTkYvNiZbX15AUicvX19fX1YoJlk4XTQ7T19aIyg9X19fX184QDEyO09fWgorTTwgIFArT19aRDpAICIgUU4gICdfXkY0Tj8gISpCNlRIPCAgUCtPX1o9QiI2QCJYKVk4PSNcJ0AsKkEkUgorTStPX1pYWlRIJD46TEMoNEJBQlAkNjg9SllEU04gL0NfViRZPjNHNS41QCAgPCAkUitAICpYWiIhTjAgIgorTUxUMS43RFlVM0U7X10iIU4gIEBNNC9fWCs2QCAhL19cLCJbX14gKSA/XyFGJkIgTl9fQCJAICAvX19dRgorTSJESk5fX1FGIScgIDgkMVAgNiEgLCJbX14gKSA/XyAsMCdfUDlDIEArT19YIEggICNfX185QEkqS09fXAorTTlAMVAgViA8KCJbX14gKiAgIF9fX1BSICAgMCAgJjQkPCAxQCFHICU4IClQIERZPjNHNS41T19EMi08IAorTVwnUCAoQlggIyIgTiAgQV4jLSInPiIiOEAzIVwgISMxUCJYMFhaXEokLkJNQyg8QEFCUCU2NEJRUCYzTAorTTMuWCBcL19EM0VZLj00WTZfXyEoVVIiICpGWCAiIiFOICBQTTQvX1grNkAgIS9fXFo+WCAgP19YKkggSworTTtPX1wgISFeIiQqVT4gUThBVyg0T0glTV0jIE5fX0AiMCdfUDlWUFArT19YIEQhX1wgUSA/XyFHICAiMgorTVo+WCAyX19YISggICAgL18qVCAgIidYIipUPCAhIiBOX19AIkAgIC9fX1wgQCAgMCAgIEswICAsMidAIAorTSJUQTUzS0QgICc0WjQkXUAmJEpOX19RRjcnWCMqVDwgISYgKjJKW19fJjg6MEpUICEkU04oKCNfXCRZPgorTTNHNEArT19YIEggICNfX185XiFeIEJNJyAgMEs/L19fXyBUICIiIE5fX0AiQCAgL19fXEswICAsMiU1LgorTU4wICA8VkE4M1YjIigiW19eICogICBfX19WPj4oIltfXiAqICAgX19fUEAgICEtRyInWCQqVDwgISYgMgorTT9AMEsxUCAkMidAICEkWlkgICFUSkVBLygiW19eICogICBfX19QIiAgIEAgICYgIF9UWS41T19AMi08IAorTVAiKU4gIEFcICQnTl9fIE4iJCdOX18hIVogIDAoQEBAMVIiUTogIThBRUInT0glRVxDIE5fXyAiMCdfXworTTlUSFArT19QIEQhX19QUSA/X11HMUcgIjgiWVAhJiBKMkpbX10mOF4ySltfXiY4WDJKW19fJjhSPCAtQAorTSUkSk5fXzFGJ0RKTl9fQUYmJEpOX19RRiRHICAzLlggUC9fQDNFWS49NElOX18pR1cnICE4LlEqO09fUgorTTlbUVAgIyBOX18oLEAgICBAICFESkcgJTgtMS41T188Mi08UFgiQU4gIFFcICQnTl9fIE4iJCdOX18hIQorTVogIDAqQEBAMVIiVDogIThBRUInT0g1RVxCSU4gIENJW0AgIV9fIEpAIk1OX18wICQiTU5fX0AgJSJNTgorTV9fUCAmJ1gwMEs1WCMlQic/ITJeQUZXVCwiW19cICkgP19dRzgjIE5fXyAiMCdfXyMkIV9fVjwgIChJUAorTSAjIE5fXyAiMCdfXyEoICAgI19fKlQgICInWCIqVDwgIScgICwiW19cQCIgICAkICAiTSAgIFEoPiAgLworTTIlNS5OMCAgPTNJMDNWICw/QCxLMVAgJDggMSJLMCAkMy5YUFgvXzwzRVkuPTcgICwiW19cSCJOX18yIAorTUtPX1hAKltfXyY/Pj9AKEsxUCAkKldTX19cIDEgIEFQICMgTl9fKEswICAsMiU1Lk4wICA8VkE4M1YiXgorTTwgIFArT19SQCpbX10oIk5fX0IgS09fXDlZWCgrQCAnX18pRyInWCQqVDwgISYgMj9AMEsxUCAkMidAIAorTSEkWlkgICFUSkVBLzwgIFArT19SICQiICAiTSAgIFEoPiAgMDggI183ICAgICAgICAkWTZfXzEoVVAjIAorTT8gLEA7QCAsL0JYICJHICAsIDxOICRRXCAgJCAgICAqPCMjMkAhJiE4ICEsPycgJyAgICAiRScuX14hLAorTVtAIyBfXzEuN0RZVTNFO19XJEM3Li9RXCAnQCA+QCBIO0AgMD1AIFYrQCAqKSAtM0BCSU4gIFFALCJcJgorTSggKjBBUyBUIkAgIkAgICBfX1xPICcgICwhNE8gJFpZICAhWV4kX08gIFBOICtaJjkgKTIxIlAnNEg1NAorTTMyWCVPSC1FUkI5TiAhMFAvL19fUCQ4VkAnKDBYSlhXMUAgIi1UMCAhJFNOLi9TX1ckWT4zRzUuNU9fPAorTTItPFhfJ1ggPiAhXCAiQU4gISFWICM4TiAgSEQgVS4iKkZYICMmIFgrUDxAIEkiJSwjMCogICogICAjXworTV9SXCA8ICBQJTJcIDNLRCAgJ0dYM15cICMiWCAjKD5SVCVYIDkwQTIxIDInTE0hPiAlKiY1JFRKIUtKIworTTk8KEY7QCA0KCA9LD8gICEgICBHJCM6ITMnUVAhUCAgKVEgQCFUUVwgICQgICI8MC1UJCAgRFFcPCA8IAorTSAiPDA8ICBQISQyIFk4QEIgLSohVCgnMEFTPSAgIDEsW0NDXF9dUS43RFlVICAgICAkWTZfX1BQK0AgKgorTVAuWCAjTSJOICEhLjdEWVUzRTtfXiRDNyAoMV4gI1hOICBLPktAICwoID0sPyAgICAgIEckJygwWFpBLAorTT8nICIgICBHJCgiIjMuWCBBL19YM0VZLj00WTZfX0BOQVJYTiAgQUcmIiFOICBRUCAjIDBXSCBQLy9fXworTVAkPFBQJygwWEpdRlsiWE5fX0EuN0RZVTNFO19eJEM3KCggTitAICg5UjBKO0AgLCtQPVAgIyA1K1AhLgorTU4wICA+QFEwM1JYICwjU19fXCEnLkwhUiQuKk85TiEsW0IiIF9fQS43RFlVM0U7X14kQzcgKDBQK0AgKgorTVAuWCAjTSJOICEgTiAkUVwgICAgICI8MDxBI0NKJFFcPCAoICAiPDBAKCksW0AiJF9fQS43RFlVM0U7XworTV8jIE4gIEsgW0AgLjNFWS49NFk2X19BKFVQIiQsIlggIkwjTiAgWE4gJFFcICAgICAiPDA8QSNDSiRRXAorTTwgKCAgIjwwQCgpLFtAIiRfX0EuN0RZVTNFO19eJEM3ICgwXitAIC48ICBQK0AgKltaQzBLQCAwK0AhLAorTT8gICAgICBHJCcoMFhaQSw/JyAiICAgRyQoIiIzLlggQS9fWDNFWS49NFk2X19QUCtAICpQL1BHJC0iTgorTSAgUS43RFlVM0U7X14kQzcgKDFeICNYTiAgSVIkLi5PV0pYICMiICczJ1AgICAgIClRIVIkLi5IMydRUAorTSBAICApUSIgQERTTiAoM19eJFk+M0c1LjVPX1gyLTwgQSJYTiAgQEAhVFFcICAgICAiPDA8QSNDSiRRXAorTTwgKCAgIjwwQCgpLFtAIiRfX0EuN0RZVTNFO19ZJEM3LC8gSDtAICguIlAgIEdYID8gIStbICAmPkAgWgorTStAIC48ICBQISJAIDgiME8hUlwlPCAgUCUyXCAzS0QgICdMQDNeXCAjIlggLCNTX19cIScuTCFSJC4qRworTTRIOlxBJjc4Mkg9RylET0wgIDhKIU4uJVZcNE8hVFpZICAhW0lFQS8rQCBQLy9fX1AkPFpQJSomPEEjQgorTUlWO0QuNDggIERTTiwvI19ZJFk+M0c1LjVPX0QyLTwgXiIhTiAgQF4qICAiPkAhXCAjOE4gIFkjWiAgJgorTT4gIFghViA4P0AgXiQ+Pk9XSDRQLy9fX1AkPFJQJygwWEpcSiFVKiZPKDFFWSRKJTlQUFAvL19fUCQ0UQorTUAmSCY0SDhRMUAgIjMuWCBeL19EM0VZLj00WTZfXkEoVVAjVChGWCAiJ1AgPkAgWiowICI0WDVLLiVRKQorTStARVAgIyBOICBZWCQpQiBYWDc6QVIpJSpAPV4gI1gxWjpdVCQuNk5XSDhAIVcoMFhKQFJAIConICAjXworTV9SUCc1NEZTUTYzPigmWCAkIyImMy5YIF0vX0gzRVkuPTRZNl9eQShVUyNAP0AhXCAiQU4gIEErWyAgJgorTT5AIForQCAuOCIwTyFSXCU8ICBQJTJcIDNLRCAgJ0pIM15cICMiWCAsI1NfX1whJy5MIVIkLipHNEg5UAorTSAjIEwgICpcQCY3MjJIPUcpRE9MICA4SiFOLiVWXDRPIVRaWSAgIVtJRUEvK0AgUC8vX19QJDxaUCUqJgorTTxBI0JJVjtELjQ4ICBEU04sLiNfWiRZPjNHNS41T19EMi08UF4iQU4gIEBeKyAgIj8gIEorQCAwMl5QIAorTSFHQCAuIlggI0c4IC1APUApIlwlK1AxUCAjIDUrUCEuTjAgID4/QS9bUCAsKkAgUC8vX19QJDRaUCcoMAorTVhKVTJBS1IjOT1BKkE2PCwsI1NfX1whJS44IUohRSomLjQ4ICBEU04sL0NfWSRZPjNHNS41T19EMi08UAorTVwiQU4gIEBYKyAgIj9AIVwgJE9MICA5WiAjSE4gIFlQICMgJCogIUApIlwnK1A1UCAjIDUrUCEuTjAgIAorTT5SIS9bUCAsK0AgUC8vX19QJDxaUCcoMFhKXTJBS1IkOT1BKkFWPEYyXlAgIUJIJlhYNztRMlwnM0tEIAorTSAnTkY2JFxOICMgXF9fXyAxU0sgNEg5UiQuKk85TjBZMUAgIjMuWFBcL19EM0VZLj00WTZfXUEoVVNDIAorTT9ALEI7QCAoMl5EICMnUCwrNDtfXy1PJjggMTNBVUUtMkk1R14iOU4gIFEqQVZVIDA+RCAjJCpOX18wQAorTSFeLiBEKltfXSJVIF9fQEoyIlAnWTg7PEIiIE5fX0EpXFBIJighNCJAICAgX19cWEAiID08QSNCSiNFIAorTSAgKTVLT19YTlw5Q1cuLic1KDxXMVAgIjJGTCAhRjhILidQICAzSVwgIClAI0QnSyAgOFFMXUAmVi9ZMgorTTMlMS0oIFFSICMoSyAgKlBANjdGNFZMICBCIEkgIEEyQCcoICxCTCAgTkYpRCgkQDtAIDAoKCEiOlAgJAorTTMuWFhQL184M0VZLj00WTZfXlEoVVMjQD8gIEg7QCAoK0JYICMkT0wgIDlAKCJcJzwgIFAlMlwgM0tEIAorTSAnTU40JFxOICMgXF9fXyAxU0sgPEEjQktVKiY8ICBQKyAgIk8oIUVVREonOVI5K1sgICYqQDtDQT1PJQorTStQPS5OMCAgPlo5ODNSWCAsI1NfX1whJy5MITJBRygwWEpdRlkjRSYgICksW0MjQF9eUS43RFlVM0U7XworTVwkQzcsLCBIO0AgKCpGWCAjJCdMICA4TCInICAsIlAgIEIhJiwjICpfQCogICAjX19YI1wpUSEoMCNNIAorTSAgOVAgIyBMICAoUiswICZMRyAqX0Y4KC5XUCAgMCAiOCIgWz8gICIgIClQICMgTCAgKEAxQyBQIk9YIgorTUAgICBfX14gXyI8MC5UICAiJ1ggL0JQICBFNic6UVNDQV1aJigkPVAgIyAwK1AhKDU0WlkgICFfNCUhLworTTU4Pl5BRjNIP0AhQCQkKkcyJTUuTjAgID9VITAzV1AwV0g4UCsgICQyLCFcJCkiJk9IIU9YQyBMICAxKAorTVArIic7UUhQKyAgJDIsIjBBUCogICAjX19SXCAyJTUuTjAgID5dMTAzVClNICAxLFtDIyBfXyEuN0RZVQorTSAgIS41T19QLCJYICRHKCAyRCFHJCIhTiAgUEI7QCAoLE1BMjA7KSA5P0EuN0RZVTNFO19fIlotKkZYIAorTSIkQTUzS0QgICMgPjYkXEo7T19cM0VZLj00WTZfViBDW0AgKCAgKCAxIlxOICBRKD4gIE8yJ0QgIEBLPgorTTInRCAgQEpUMiZbXzgkWlkgICIqXCRfTyAhMSg7T11AM0tEICAoU0A2JF0uTjAgIEMhIS43RFlVM0U7XworTTokQzcvL1BKO0AgKCoiWCAlJClOX19YTTM/X1gySDFNIkdbXys0P19dJiAgIC8xJEEkKk5fXzFAICAjSgorTS83UCAiT19SLzdEICBHOS5fXlBdPjAgIkJNI19bQ1VZICAoUFNPX1ArN1AgIEc5MF9eIE0/ICAiQk0rXworTVkiVVwgIChQVC9fSDBKW19VJCpOX11BIktPXzwrN1AgIEc5Vl9cQE0/ICAiSD07X1MiVVwgIClWIi9fMAorTSggMTJAJkgiNUgjREAlMiAvNCNfUUYgICApIF0/ICAiX18oXT4wICI9QlNfWyNVWSAgKVZGT19OLzdEIAorTSBATTRfXyBNPyAgIj1CW19YIlVcICApVkcvX0QrN1AgIEBNNl9eQE0/ICAiPUNDX1IiVVwgICopOE9fLAorTSs3UCAgQyIwX10gTT8gICI9RDNfVSJVXCAgKiomT184KzdQICBDIlBfXVBAISUqIDpAMV4jXSInWighNAorTUAjVSBfXDlAJSIgTiAgUV4gSyInOVAjXyNHWCpMKD1HIC9dVCsiWCAkJCdOX15QTiIkJ05fW0BKIiQnTgorTV9eUTwyIkAoKCQ9UCAjIDAoQDksMCEgICgkNFBAIiEnPCAgUCQkUSA4IDk0QTUyJ09IMUVXR1giKzQ/XworTU0nQCQwPzkoTiJAKDggUEAxJEkwOUBRM0tPXlQ1ODEqS09eVDsuWSpBRlxSK1A5UCAjIE5fW1BPICcgIAorTSwiW19OQlwgPCAgUCtPXlgrUCEoPjAgIiJOMS5OMCAgQkogQDtAIDg/QCRAQVYgICE3OFwrMCAiMD5bXworTU4iWCgwPltfUiJIKDA+W19OJVEoKiBAQDFXICAsISBAMTIhMDA/ICogIiknPCAgUCQyKSUoRSUjXDBIIAorTSwiRCAgSSEwVyQhNEFVQiVPSDFFVStRTl9cOUQhI1UmX1w6XDU2KCgoJlggJiIiLTgnIVggI0AmISgwIAorTSAgJCBYWFAmQSAgICBAOE8hJFpZICAgTyIlQS8qICFGIkIhTiAhQSJEJiAgIS8oQDtAIDgoKDFQICMgTQorTSAgKE8gJEFNICA4QDtAIDgoISE8QCJcIDNLRCAgKCJQM15cICMiIU4gIUBANCMlTSAgKCAgQiFOICFAQAorTTQjJU0gIDAgISIhTiAhQEo0I0omMEpbX1AkSk5fWzFLICAxJjwgIFArT19SKzQjX0QnICAsIltfUUJVIAorTV9aISFbT19AKzRDX0YkP05fW0ElW09fKDA+W19VIlUoX1kxKjRWPCAgX0FQICMgMyglKFAsIEgiIEggIAorTSAvX188QCBSJFIhMixDIDogICohICAjX19ZIiErNCNfTCcgICwiVCAgQlUgX1pRKktPX1Q7IlFALkMgTQorTSAgMShQJDIgOkAxXiNdIidaKCBNMC9fVDgiMFArMCAkMiwhJEAmSCI1SCNEQCJVIF9fMUAkIiBOX1khXgorTSBLIic5XFFeIksiJzldUCw7QCAiX18pRipHICAsISxAO09eNCglISFcIEggLCEjMTtPX148ICBQJFIhTgorTV9ZMEA0JCdQIkAgUCQuRShUNlQgISBSTiAgICAgP15QOVVQLEtAICAgICdfSyY9RigiW19EJ1giTCg9RworTSAgIzA/QEpQQVY8ICAsWUAgICMwPCAgUCRSXCAyJTUuTjAgID9AMTAzViAgIFExIklXICAsISxAO09eOAorTSglISFcIEggPCAgUCQiXCAyJTUuTjAgID85QS9bUCAsOCAgIltCIE5fWSFeIEsiJzldIV4iSyInOVs5QAorTSAgKzovIlQgIUJcTl9bIVAgIyAzKCUoUCwgSCAgSCAgIC9fXygmW19GIiEwMicgKiAkQU0gIDkuTjAgIAorTUArIS9bUCAsLlZbX0xAICIoIltfRCdYIkwoPUcnJ1gqTCg9RiAgKjI8ICBQIUJcIDIlNS5OMCAgPzE5MAorTTNWICAgR1kiSVcgICwgOE8gJEE1M0tEICAnVjgzXlwgIyYgICBGOSI7T15KOCA4XT8iPDBfWkhAK09eTAorTUwqW19MJjQkKCJbX0wlOiBENltfSkJATl9aUzhLT15QMD81KiFEKUhfX1hMISU2JjpQICFNJyAgLCJbXworTV9CKE5fXzIyQCJVIV9ZUFYhIjBOX1pRM0BCQCZYWDBOIUlaTl9bITJBUkgiPCAgUCRSITIsIyAqICAqIAorTSAgI19fUkFOX1lASDUkR1QiQCJcQEZQIipAOSpBVlAgIC0pXiAmICAgLFEoO09eRCggOjBBNEFUIkAhKAorTT03SCZGSD0yQTAqJSAgI19fUlwlM0tEICAnQy4zXlwgJCRJTl9aQUcmJCdVMiA5KDogICQ8ICBQK09eSAorTStQIS5OMCAgPkQhMDNUSU5fWjlHICAiMjA/NSghREFIICApUCAjIE5fWjhPICRaWSAgIVowJSEvOCc5KAorTTtPXkQoIDowQTRBVCJAISg9N0gmRkg9MkEwKiUgICNfX1JcJTNLRCAgJ0UoM15cICQkSU5fWkFHJiQnVQorTTIgOSg6ICAkPCAgUCtPXkgrUCEuTjAgID5GUTAzVElOX1o5RyskJ1UyIDkoOiAgIjwgIFArT15GK1AhLgorTU4wICA+RlEwM1YgMigiW19EJygiTCglRyAvXEw8QEpQQDY+KjI/NSghQ0JOX1owXiBXICAsIC0hXTBIJgorTTJGQ19fRjgkL0AtMzFbWU5fXDlDIycgICwgPjBLT15ALkAhQCBHSCAoIltfUCsiTl9bMUYwIlgmNSg9UAorTSAjICVPSCFCLSMgTCAgKlA7T15KOEJJUCAjIEwgIClSICMoNEAoJUcnI0gnMkpbX10mVCZPSltfRyZYLgorTTwgIFAhMCFVICAkKiFDUCU4IFEzQUU2JDJIOUogL1lMPyAgQCtPXkxUKltfTCNNICAgKVAgIyBNICApIQorTV0wSCYyRkNfX0Y4KDRWVCAgRiAiNEQ5UCAjICYwPzQqIUJYKDJFIUdcJEkmOVQpWCAjQCY8ICBQKzAgIgorTUQoME8gIlwnMiZUICFEWlkgICIgTCRfTyAgUj07MCAiKCJbX0QnWCJMKD1HIidYKkwoPUciJiAuKCAzSQorTUImICQoIDNFQi0lTSAgMTJLT18gNSRNOEtPXjQ2JEk4S09eOCgiW19QKyJOX1sxTyAvT0ooIltfXisiLQorTTlVKEAwIyBNICAqUDQmKSgoJltfXiMlTSAgKCAgQiFOX19AUTswICQgIDFQICMgTSAgKE8gJEFNICA4QAorTStPX1g3KCBPICRaWSAgIiBMJF9PICBQQDtAIDgrUSEuTjAgIEAtKTgzUiFOICFAQEtPX1gzLlhcXy9dSAorTTNFWS49MCAgM0U7XVIkQzcsLiBMK0AgLCs3RCAgSyxcX18xXiAyVSdfX0BNMU9fXDImW11XJEFOXz4hKAorTTtPX1QrUlggIiRaWSAgIVJVIiFOICEwQEtPV0QqRlggJCJITiAhQEArT1dAP0A2UEFWKVwsI0wqIURbWworTSAgKCArQCAsICBQIDFAITggJUBAK09XSFQoOEpAJEomO1U5K1tPV0wqJDUhXUZEQF8+UE4iIUM9Tlw9RQorTV5GISA/QCRKQVRKJjtTQEoxMkEmVjw0Ol8gIFBOXFFFXiYgSDBJNE4uMCAiIlJBUiIrUiE7MFFcIiYgKgorTTBJNE4uMCAiIlIxXCBSSScqJDc+QUFDPU5cPUVeQiElMEMhSCAiICUzLlhQWC9XKDNFWS49NFk2XzxRKAorTVVSI0ArIlggIyJVWSAgKlMvL19UMEpbX14iVSZfX1EoO09XPDImW11YJEFOX18wTytAICgzS0QgICcrNAorTSgmWCAlIiJOXz4wSitAIDgrQlggJCIgTl8+IVIhOyIhOEAgIEdDIFsiQDkuXlAgIiAkMCAjICAsICcgIAorTUJAIioySDlNIyIhJygiW19cKSImKCghQCFCIScoKltfXCdYIDJeW11bIlAlOCBAQDFBIj00SD0yQUtaTgorTV9fIU1cQiElVD5bX1wkKDA4JSBAMVQqMCgkNDBPICBQLkdQICA7Ui07UTFeID1aJVcoNEAxUSJcICMhMgorTTM1KidPSDlFXEQoVTYgIUApIiEnMEkhXiIrUic7IEBKLyAgIiJTRUAkQkhcICAoKy82ICooJD0iRCJIXAorTSAgKCsxQiAlMy5YQFgvVywzRVkuPTRZNl89UE0+MCAiTFNTX10nKCErNCdfXiJVTiAgU19fJEFOXz1RKAorTTtPV0AyJltfXSJcTiAgQS5OMCAgPE0xL1tQIDArUlggJSJcTiAhISg7T1dAK1JYICMkWlkgICFDViIgTgorTSAhMS43RFlVICAgICAkW1kgICBGWCRBWCAgLS4wJjdSM0c1LjVPX1wrSD0hW0AgLCtAQFAuMCAiIEwgKAorTSAgICE5QUhQLjAgIiBMICggICAoOVBIID4wICIgICgiUCYgJDwvXUAkREFZICAoIkwiXCcrUlggIiRaWQorTSAgIF1YIlhOX19RLjdEWVUgICAgICRZNl9eQE0/J19fX19fX1siVU4gIENfXCJVTl9fI19dI1VcICQrXworTV8kQU5fXlEoO0AgMCtSWCAjJFpZICAgXVgiIU5fXyEiJCIgTiAgQS43RFlVICAhLl4wICApTiEoPiAgJQorTTNEIUVcRFlVKEZcICEiIU8gIEBAK1AgLDtUUEIiOSooOyAgICEkMiFMSCFNICAhJCxAQCggMCAgOVAwMgorTVYlLiAoQEQoIDAgIDlBWEIgLjIoOCAoQlYlJyhfX1EiMCUuIDkvMEAgMCogICAgICBWICIkTUExUi9fXAorTTBEITNAJjNUKCJcICEkWVVMXEFOJSYgIiRNQTFSL19cMEQhM0AmM1QoIlwgISRZVVQ8IzNQJiAiJFIhMQorTVIvX1wwRCEzQCYzVCgiXCAhJFlVKCZcICEiKU8gIEBAIicrXzJBQTdSP19cOUAjX14lLig8T1wwVjU/KQorTV9fUUYgL19YM0c0ICAiIU8gIDBCO1AgKCggQVJfUSM5NVxHX18mOCBfX0EuPTRZNl9fUE5BVCpHMidAIAorTSFEWlkgICItNCUhLytAIUckIlwnMidAICFEWlkgICItNCUhLzghQTJOMCAiIlRQLE4wICAgICQgIEBNLAorTTlAOS5OMCAgKU8hKD4gICYzS0QgIChVJitQIS5OMCAgQz5ZMDNSWE5fX1EuN0RZVSAgICAgJFk2X18xKAorTVVTIiAqR0QgIEAgIDJIVUcnIkFOICBBKkU2PDQrUVUoNSRaWSAgIixKRSEvK0AhR1siICc4IClQICRTTgorTSwoI19dJFk+M0c1LjVPX1QoJlggIyIpTiAgQDImKygxOUBILCYwIF05TzBAIiYgMjJBJUYjIFBIICNXXworTV9WOCQoIEFAIEcgIDNFWS49MCAgICAhLjVAICAyJ0QgIEArJDNLRCAgIj40NiRcTytAICgzS0QgIChXWAorTTYkXS43RFlVICAgICAgICAzRTtfXCJaLSgmWCAjIilOICBASjImICgkITZQJDY8JjREVSolNjtUMkE1RworTSEiICk4IDkqJjY7RDwgIEo7T19QM0VZLj0wICAgICEuXjAgIClOISg+ICA0M0QhRVxEWVUzRTtfVyRDNworTSwoIE4rQCAoKzZYICMvX1QoID9FQCJJICFIICAgSl0sKiQgTTUvX1hWX1AgIEpfLCs1N19fJEFOX15BKAorTTtPX1QrUD0uTjAgIC1aIS9bUCAsMkghSzAiIE5fX0JQS09fTDlASEArT19cTCpbX1wmPFArNltfWy9fWAorTSoqW19eIiBOX18hUl5cIiErNCNfXyJKTl9fUSJJVEFOX18wTyFUWlkgICBXSCRKIDsgMVBfViAkKCJbXworTVokU04sKCNfVyRZPjNHNS5eMCAgKU4hKD4gIEUzRCFFXERZVTNFO19WJEM3LCAgSDtAICgyXltfWCRKLAorTTlSMSolJjxAKkhRKDUkWlkgICEwRCVBLypUICAhJSEtKktQICBKKUw8QChLMDAgJDQkVEAuMCAiICQyUAorTU4wICJIXyFEJEIgWSAgKCAxJCdZICAqQkEiQVAjICFAIUJBXCAgKkI7UkosK1E1Lk4wICA0KSE4M1JNIAorTSAgMTAzMkpcICAqQj83KCEqVCQgISQnTl9eIEAjOSIoWUghMkAiXCAyJltfWCRBWCAgKS5OMCAgQ0o5LAorTVtDICBfXUEuN0RZVSAgICAgICAgM09EICAiO0AyJ0AgPjRZIDk/KS49MCAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICQgSChSRS04VylULDJZUygjJE4tQiBYLiJcUCxCXFAuIiEjO1chWQorTTxCIFEuM0BVKCUtVTtCIS06Ni1SO1AgICAgICIgJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFEICAgICEgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFJO0ctRTxHMFooJilBOSIhQgorTTsmXUM6UiFTOjdJRSgiQEU5IkRAODcwQCkyLVgiQCFCOyZdQzpXLUk+RjRdLCIhQT0iIEUoV0AqICYpTAorTTtWLUs8VkVaOTNUUCgmJVQoIjRDPiBIIDlHKUU5M0hAOjZRTDk2PUE7IiFBOSYxUjk3LVMoIkBFKFdASQorTSJAIUY8RjVFLkIhQjg2MEA4RlFPOFZMQDxWRVo5MiBIKTYwSSgmJVQoIjRDPiBIIDlHKUU5M0hAOEZRTworTThWTVMoIjRDPiJQQCkyLVgoJl1WOTcpTDg3ICogJjlSOTY0WigmKUw7Vi1LKCI0Qz4iIVc4NyxAODZRUgorTTk2JUQ+MiFGPEY1RSJAIUY8RjVFLkIhQjsmXUM6UiBFKFdAQD1WJVMoJiVMPEY1QTknREA5RylFOTBIIAorTTxGNUE7JlFPOFNIQDo2UUw5Nj1BOyIhQTkmMVI5Ny1TKCJARShXQEkiQCFSOTYlTDsmXUMuQiFCODYwQAorTThGUU84VkxAPFZFWjkyIEgpNjBJKCYlVCgiNEM+IEggPEY1QTsmUU84U0hAOEYlRCgmKUw7Vi1LPFZFWgorTTkyQEU5IkRAODcwQCkyLVgiQCFSOTYlTDsmXUMuQiFCODYwQDhGUU84VkxAPFZFWjkyIEgpNjBJKCYlVAorTSgiNEM+IEggPEY1QTsmUU84U0hAOEZRTzhWTEApMi1YKCctVDxGJUQ5JlFFPFIhRjxGNUUoJilMO1YtSworTSgmKU89NllEODcpWSJAIUc5NzFGPEY1RTomMVIuQiFPPTcwQDtWOEA7NjVNO1cpWSAgICAgSlZMICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICIgMCAgICAgIAorTSAgICAgICAgICAgICAgICAgIDgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgSy0sICAgICAgICIhOjAgIEA2SyAgKCVPICAiITYsICBANU8gICglQEAgIgorTSE4WCAgICAgICJUICpQIEAgIyFYICMhOCAiVCAqUCBAICJUICpQIEAgIlQgKlAgQCAjIFEsQyxULTM4VworTS4jRFAgIixAKlJUTiwjJFIsUzBVLUM8WC42QSwpICBQLDMoUy0jNFYtU0BZLCAgQygiTE0rQyBRLEMsVAorTS0zOFcuI0VIKSAgICAgICAqJllVOyZQSSAjIFEsQyxULTM4Vy4jRUE4Ri1EOTY4ICwjJFIsUzBVLUM8WAorTS40JSIwVDElMUAgICAgICAgICAgICAgICAgICAgICAgKCIgQCgiIEAoIiBAKiJASCoiQEAoIiBAKCIgQAorTSgiIEAoIiBAKCIgQCgiIigkISAwJCEgMCQhIDAkISAwJCEgMDEkMSQxJDEkMSQxJDEhIDAkISAwJCEhIQorTTA0JSEwNCQhIDAkISAwJCEgMCQhIDAkISAwJCEgMCQhIDEgMCQhIDAkJCkiMEQpIjBAKCIgQCgiIEAoIgorTSBAKCIgQCgiIEAoIiBAKCIkISAwJCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICEgQCwkITA4JyIgRCoiUFAtI0BcMCQxKDMlITQ2JVFAOSZBTDwnMVg/KCIkQihSMEUpQjxIKjJISworTSsiVE4rUyBRLEMsVC0zOFcuI0RaLlNQXS9DXSA4NilDOSY1RjlWQUk6Rk1MOzZZTzwnJVI8VzFVPUc9WAorTT43STs3JVU+N1YhITBELSQxNDknMiRFKjJUUS0zRF0wNDUpMzUlNTY1VUE5NkdNXD83WV8gICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAhICAoKiMgICIiQFggIEBILyAgKCokICAiIkEkICBASDIgICgqJFAgIiJBMCAgQEg1ICAoKgorTSVHXV8/V11fP1ddXyAgKCglICAgICAgICAgICAgICAgICJcICtQIE8gJFEjN1UxKTM0NCAzJCUuMVRFLgorTTFEXCAzJC0/MFRdLDMkJTQxMCEsMFVdLTE1LTMwND0lNFAhLDBVXSM1JUUwMTAhLDBVXS41NFUlNERFIworTSAgISwwVV0tM1RZJTUkJTI2MCAgMyQlLjFQISwwVV1EOTY5QT02UVQgJCwgK1Y1VDhSXUw7Vi1BOyY0TworTSAiXCArVzVTPEJdUzomJVI5Ml1MOjYoTzsmXUM4NlFFK1AgTyAiWUM6MCEqODZYKjFGNUIiRFVBPEBJIQorTTwnKCozNiVZIkRJVTtASSo9NlAqMDc1RyJFLUU8IEkvOFcwKjNGXVYiRDFFOFBJKjg2WVU4NylZIkQ5RQorTThHKVU4NylZIkRVQTxGLUgiRCVQPEZFTCJEVUE+MEkqPTZZRSJESVU7J0QqMDc1Rz03LVQiRS1FPCcxRQorTTs2KUU8QEkvOFcxTzhGNVIiRFlPPUY1TThGNVIiRDFFOFY1TThGNVIgJS1VO0BJLTtWWCo1JzVFIkU9RQorTTkgSTQ6JzQqMUcpSSJFLUE9IEkzPTZZRDg3RCozNl1OOSYlWSJFMVU5Ny1EODdEKjVWNUQ7RjVTOSYlWQorTSJFMUg9NylTOSYlWSJEOVI6NjFBPjBJMzg3MVU8RjFBPjAgRTIjSEUzM0hFNFBIRTsyXEU5IlxFPjBIRQorTTgyIEU4QiBFOTIgRTUiIEU2QiBFNjBJITMwSTAzMEhFMDJQQCk0KEApNjRMKCI1OSJAISMgJjFFOUYlVQorTTsnMCAwUCFZOTcsIDtGXCAgICAgK0AgICAgICAgICAgICAgICAgICAgICAiIkIwICBASEgzRiUuICRFTgorTTlGRU46NzFZICAgICAgICIiRDAgIEBJLSAgKCo0MCAgICAhKTtGOUk7RkVUPjAhKTtGOCAzRiUuICAgIAorTSAgICAgICBAOEZFTjg3KVkoJjVYPCZdTjk2WVQoIjVEKCAgQDhGRU44NylZKCY1WDwmXU45NllUKCI1RAorTSggIEA5JjVDOjZVQTsiIUU+JyFPO0Y1Tj0iIEU5IiAgKCYxRThWRU04NlBAOTdBUDtWWUU7RzBAKTYwQAorTSAgICAoJlFJOEYsQDhGJVM5MiFDO1ZZVjk3KVM6Nl1OKCY5STsmNEApNyxAOyZFTjkyIEU5I0hAKTcsIAorTTdVQTgrRiwgIkIhPz0mRU05Ny0/PCZdVzk3KEA5RiVJOyY1RCgmMVU5MiFUO1IhRT4nIU87RjVOPSIgRQorTTkiIEU5IiBFOSIhTDk2OVQ7VzlFPENIQCk2MEAiQCAgICAgIiJSUCAgQExQM0YlLiAkRU45RkVOOjcxWQorTSAkRU45QCEpO0Y5STtGRVQ+MCEuODRYICAgICAgICAgICAgICAgM0wgICVBICY+UCJBSzIgPicgVCA1UworTS5dTDIrQ15DR1lXQjg7KzxYQklDIStSNClNNjs4NyBFRUwrQz07RDQiUlBBJ1FVSjgrQDMuWiopVEdVUworTTgvJzdXXDsqV1JMJjo4PFcpK0AmWzY6MztOTDkyPU1PRFhWIj01WVRGQzslO0s8US1JISJRPEBIPjhYRAorTUtAWz5BLCQ7RFwtR1A1PyNSWjtXTTkjQFtCUFYzLUZSN1BUMEVNMT1MKz1YVCYsJjkyUFJGSSRMPjs2UgorTTIzJCBfQiRIUlEmTzknOkRYNDggKFBFVzRRVy4gJDVXQ0wrPks8XCIrPzIlQklAVzxYNVs+PFo0QklQNgorTVlJJzNNLFQtWCQsLjc0UF5eX0U0Xk1SPSo+TDlCMkZPRz8xSD8nV1U+RF4nRDApRV9JSz00LjwzUk8wNQorTSc5Kks6JipEQCZBQzQkNlMyNU1QKixXUStRVjBEVCw+MjAiQldCODBQRCFKJSBQNEdPIl47VEAhUlwiIworTTA1W15YJkNdXyY6QjBcIlopSiZZXT45WytWSl0kRVRNLz9KQU4yPCxRQCM9KDAjMF82O0E+TyY/XzlaVworTU9QVzBUNSNfLkswNkc9LjEuJE82SS4zVDAzX04hOShILTtdNENTWVgnXVkzMkwrXFFNLEkhLyFKXzJBQQorTS07TDY2IFw+OSc5NUxWME9OOT4xV0hdUSUiOl5JKl9dIUI5MlI3MTlTJTUjKS80UzQ7XEJBJi8nOSkiSworTThPMCUgLVIrLDJCXjxJUTNKUzRDIENSSlxTXSdKIUghMyhGTlI+NkNHTVMrWCdeMSxKVVwhPVdRSyM2MAorTSdOJipNXSNZNiBTLCU2O0UqPiAiRzNFTjBVMS0sIFVcUkAlRig7WSwgPUw5JyQkNEZcLEFUKjIlN0ggWworTURRK18zV0gvQTRCVjIuIjEzU0FVTEZfJjRQJVg8OVZVSyowQCBIVT1ZJigqI0peKihGWCA7NDswJzYmWworTTA+KF5ESVM1QVBIMShVMThCNi8hKkBRKkNRTTwiKC5BU0E4MzlFXSYyPDEwRUw0LT4+Wls0ND5LWTciQgorTSxZXD5aPF0jJDgyXVYkLCpCPiQyRVwgNko/P0slQTssPjI9N1NZW0hVSCwgIylGITwnVSw0IlQ5XkBfLQorTTtTOFRZQkU8QEA/IldJVSczJSs5QF0nLTBcP0oiTVkrRUE/PUQzNzE+QE9IITs3OUs8QkkxRy8yTDQ2JgorTUBOPyZAKzohS15PQyFGRj03T0JSUSo+NF1KUSBQIldXTFxcOkE7Q1EgVUpKSyY0USZeTVJWJlwoVSRXKworTU0+UV5dTzQ+MTxKLCZSQURIRyxWNCA6U0IoISE6MzEpMD1FVS8tXTJUR1pZL0o7TEkqVSkpQTNPO05BNQorTUo3Qz04O1U5LjhRQj0vNjswVSM5NylRWjFNJCFDPCo4Ol5LSy4mKzpFLVhJWyhKMEZLPF8pPy8qJlpZSworTTosL05IWEZXTFpKWyNYX1tTLSdLO0FUIzpaOEpZIT0nOkIqPUxOLEpGWFlcNDw/I1tfPyQ1VkYpP1U3VQorTVhaJUtJWVNLIj5AW15MXE4/VTxAOUpNSSZOSDAiKUhVIzVAV0VfQ0RZNEhCSVZbQ0olOU49LCsqSyU7RgorTSNWWC4kUzhYLjEpUzhPNzc1J0JaWS1NUy01NCogPyE4RkUjOl1HSVJEWjFDMTlBPFpaQy4iJT5AUl5IRAorTU5CLjJQWENCMEMnMDA7SiclVSNOMyxFUDkvRzxOPl1JQD0jN1ZcMS1CTVpXNkRJLi5GOjQlJEBUMkw8UQorTToiWyUnQ1BeMl4hViVDVTJbIlUmL0BTQkNHR1YtXiNKKElQQiEuODQuNjNATSo2TzYrPVw6OEdKSTBeXgorTU9NX0EgIDs5Xk04Sk5cV0lXUUpZQkMmTl9MSyxfRDJNTEoiPTokK0Q2PCA+Uk5GVSk8WltBSjwxQSRPRgorTVg5USdAWSdVKUMpMCc+NSoySjIiWlc6XC41XzUnS0RfVEZfSFY+XDsjRC1CRlkyPUogUSopRClRQyI9SworTT8tKEo7MCJOKU4hVUlJM1IpU0lJXU1RPEdePlgiSTg+OVdEXVVMNDxYUVsxWDZcPUFRRE5BLTRNMUFMRgorTSkyT1wjXk9GOikjKCMxK0I9TiRBOilWQT8uWiYjKkZOWTtCTTg0JiUlVENROy5MN1JUIkc7PzhASy8mQAorTV8yMEs0TDk5MjIrL1ddSkRaUiJRNDUvXy5MPyggNStQI0chOT5HL05DVzdVXD1AQUwpLixePyEsMUlNUworTTFWOzo0N1w0PCAuTlMkXCUsMVAhMCE9O1VWVUI7LTY5JlheNTxGQy4gR04lWVRLKyQqOjAlQU5ZLkFaTgorTSpPS0VRXkJSRCU1NiBeO09IWUkwLlAtTVFITjJOSTs2SlpGXUwtRF8rOz8qJi1RMFQjRSdDPjI2RUchVAorTVROSzpLMUpWISRLPlxKTy04Q0tTW0REM01VQk0uOi0pMFtFTD40JFc9KjJONT0gLSs6XVNXVk5ZOkY0RAorTVtJKVQ+MCBWXyAtTCE+ICAhOz1SPSlRVDA8RkZEXkEyLl4pIE5BPV5LIEUqTlcoXFBWXzdQOlwyTkYiUgorTUdQLlhBUidMKURKISRFXC9aJFovVUwsT0QoIUQ7Mj8iISEvQCNNXyMpITJQIzlFM05HXiRcPlRYQkNVTAorTSo2O1kjMiArWC9GK15YT1FVKTRIKk44P001LDxcLkI8VyE1M0s0S0FHRyomN0deI09FUClTIEZDRSZbXAorTTsuNShMWDhSPjxdSVxcSEAwI19FIzE7WDpIRSwjR0dXOEhTOVRaNCslM1khND5LP1crLyZSUDlOMSwnIQorTTRYUj06LURFSzEuRzRAJi5fWy1RTEhUNVkwLzk/MyQ+PFYkX1tYVVI7JFEkISQ+IC1ALS44RklPIFNMLworTVZKKDgzUT8pSSAwWkdFNTJKKD1dNCRKS1UuPilBPUc4TUAiIStQPF5NPTddKkoqWEtePCgsUCwgW11cVQorTTdAXkY5JFIuMkUmR0IiLj5MMFBRPUM/PDctPC9DX1ZANy1WW1ZOX0lLXilaVjIrWC0oTyQnMi5NIUQ5UgorTThUJU9TQl1FQEZJIl5cID8qKFMtX1hNJzwxSD9ZJUwqQi9UI1lNXE4+Q1hSIVNEVUAkREFST0tLPSglIAorTS0zKiQqUC5bVTxJWCg6PyknLF9QJV1DIVUjP0VUJzZSLiZVSl1QR0RbLFhCLyZJXzQ0RVFdIkdaOlY1KgorTTJFLSsiSU8pTEM2LzFYJ11XTyZbPFlFVVUpIy5QX0klL19QWzhVNEE9WjpCSE1JQkcpNTFZL0YwXSs8MgorTUg+PFBJKiNRTUZCLUBOLjQmSUNNQzBWV0kpMClIJSQ3MSRcR1MjTkYtW0lEIj4sOVhETChHMURLREM8UAorTT0+Nz1AQDUgTzM7VyVLUSBEPjY8PlUnLV9ESFBRQD5WQyUmUCRdMlxWNT8oNkAnWylMTk01WkghQiZBVAorTUojJE41I0A0XVxIXCNDRlQ7X1pBVjA+VlRWSSJFTDpWWS04NSVEM15XMlswTjxHIyhHSyVcVkw3WUdZWworTVtATz8uV0QnITc/IVxKOVxXIlIxMyNeVFQ8PTJeMTspLEFJITtcMkssKVdQO0UlSy4rKSY1SzRGPDlIWgorTSlIPjpOOVxIRUw2QCo2XyhAIjkyWFIlT11CUz4tUD1eM0EkRTEiRFpKWC8lTVk7SVw7VlhAXk0sXC8sVAorTTIuTVRGUVYxKyJVNE9CRyFWSEVRSkxbIF5XKkw+JCQxV1AySUpGJjZcJDAoJkBcPDAmTFM5UjpDJiFGRgorTTk0S1RMVEU6VFEhViIwTyJZITdXNic6OkIrQSwyQytAUkNPNDsiNScjXyhOTjJZO0w5XVYwWUY2R11AQgorTVpGLiNYKyctJy4rSTdOQT42RkhcPyVbOyMrPzBMSlxXKC0gNyAqMkEgKzUmWVtLT048RFg0OEIiMCotWAorTUpUIlk9NDE5VkYwKE4tQyxEKVMqMTU+TERDUDxbIE1RWDtUXVg/ICdCRztRLjgyNDQ+WjxBR1hPN0Y2KworTSlZJTUqSSBeXlE/ISQiLVM1ID0wKDJZTSVJLzU3L1tUSzA1NSY3RjsoWy5bWkpUREBMPTJIPyRGQTpZLQorTTVdW1w+I1Q9JzAjUDMxKDI2SEokVzIlJlAqL0IhKCFfMFlPPlkmWFg6SidORjhVR1o3Wk4sVls+VU9IUAorTVkuWFwjOysmO1k0IVUnP1ZfRSM3TDNAR1xAUyY4Ois+MFdLQzFYSV48LEpeQEJPVig+OiM9IkVRRFteIQorTSQrSVkzI009Wyc0REk3VDNRJEdPIUYhTEFXLlROKjcjVCotXD8pOFtHKDtPVSRJPD0zUTtMQFhAMzFMRAorTT9WS0w3Lj8xREkoWVlWQjRdKiE5TCYgQiU8RThBTVYuUUNfSDsyND0kKEQ8VUJLXTZTOk0kUUsyQl0sQAorTUJXMEorRkA3IS8/ISY2MjBURilZUkNJJyBaRVVHXUQgWTVVI0FJIzlCJ0hGJDYkQUxRJiYpKkM4NiM8NworTTlfVDgwP1smTyQ9IF1TJDNKLDteSyUmN0E4XTNSLCxCOEMyLlciWV8iLyAnQlo7VzwpJDZRPFw2NkkwVworTVshSylBWkUpXkxDXEA+J1VNO0ItWDpaMyVVQzJLWCA+Mic9V08kLzg9QE0lUFdcOUpZWk4xKkI6Vkc8OworTVNKVykgMTEiPERTI1o0NjM4IzUsXjFNIERMQSE3OUcoUjlQR0RUIjhVTlZRNVlFMipSNitfNCc3LSQ2WgorTTJdNzFETyY9NiNAVl1ERTtIO0FRWyVKW046SUIoUSswKVIiISswT1VRUDhbVTU+JiRdXykjXEwyNSc/MgorTUktVTk0JDc2PzMzMEc/QDcpTjEiICErJlsxXV9CSkhdWTxKPyc3PTAqNlMoT1RRP08uWl9NOkooPkI8QAorTVtSPClBNEJMWCIrSSc2Ojo/I0kwVS0iVV8jWTApQEVZSEknQTdPLjhOUVQgQ0g1XCU2RlxIPSBZLDc+MQorTVUrPDUgKSMuJkhHUyxQTkIzP0cuKiIpR0JTK1RbMi1bRiRbWipQUDdTJ0Y1TVJePyBDL1VAPiRXS0M1XgorTS1WOkxEVEhaKkxGRFdATUBbS0EyI0s5TEtfJFVXKTFAW0wsKzotKjY1RT5WUVhNSzlaO0crUUdFRThSPAorTVM4MClMIUY+QU89KClDMjgwSSJQQFVSRCsxVkImRjFJXCw7WzE9JiVFSkEoWSM2LVtVOlxERjQgIjcsIQorTSkgNkxEJkEkWzpZXDlXJkI4T04sNkUlTCdWTSUvNjUnLF5BXyIxXl5RRT5PSUNQISklT1xaMVZcOCtRUworTVkzM1NRSyJNOVtPM1ksVkYvLlw0Xl1UTlRKPEZSXFpHUixcR1RfWS8vQikgNVQ3T0k/RD4tUCNLVU80OworTScuSUJBVlY0TU9aV0EiJkEoVzojMj0kIUInKiBSJz1dQCEySkBTSVsxNl8/PFMgKlxPVSRWQjcoPlxPVgorTVwsKSZHRVQ5IEU3VT1XTFJfQkE5PyogLDkjNFZMUipUVzJDQC5bVSYmNDIgXDU7P0NZNjhMNVI1LyQ7KworTTwwOCkpSS9ZKkY5XTdRLVtWTklFQCIsW0xSKDg3KzBJTDQtKT5GOF9RJkkyWVwtSyxFV18qITxFUSxeSworTT9aMDMuVjQzWTohLVtAJkc4MlQiLVIkW0UmUjA/IEAqTldfTzg4PE5KTElOQSlXTkk9MSBbXCZOSCw9XworTVMxUi9AKFI+Py1VXkQpOTM9NT46WVJfT1QmOCtSRkZQUyNYMEQwRkUsMl8/PiE2Q1opKz9PXEM0JDBfJworTV5PO1hJV19ATlE3OUQgTCxFSSAuKEgrRVY8OFA1Q0ArMF9MVj4mKEogUV1QOlRVXj8gJD85N0hCWSVBTgorTUkoTzVHWTIkVFFaJFpARl80NFxTW15SNzFHVjUlRkpcNl8zTkE0OUNIRTErPCUrNTFbLDAxOFRDQzNPVgorTUJAMjokPitAKzJGWF8rIC8pW1ZZQTBCWl0yU0czRT9KN1IpMTA7LltXITI7RkBPU1ZSWUhWPCY9TEU7VQorTTZLOjFZNi9bSyo+Wy4iKVtBJThJOCczJVlDJzkhXzBeIz0xUD5bKyxLQ0VXNVVVPE5MKlwzWTI+TFpHNgorTUlaNlhERS1HMj9IU0cgVF4gO1FZMU5GIjg3STxNSUdBPik8JThYUCsqJlM/WEhBXVRJTT86UT8iJjMnRgorTUZQXzMiQiozXkRSUShHO0gkVUpLLF5DJDlVSilLMUIkKUhJLEVEKjspVzZHWlMsSF9BJE1aTkw0R1xUQAorTT88Vl5BLENKXCVUJ18nREosUzohSFE3LUBdSFYzJkVTNVA/O1s5WlQjMlotMEdEQl0hQVBKVClWST5NWAorTTg3V0QrTjxPViNbQl1GQTkoNS4vLD8/Xi0wUDMgSEBMXl0hI0ZKRiVFIiBdXU4+KSMyPypZNUxCSE86VgorTUs0NTJVOy0qPkQqVD1MWChTLz05K0VETi0nRDRdQlRPICRPVTFQUUpXVUgqLl8wLUhbOUNSMi4vXCgmKAorTSwyN1c2LVY1IVFWS04pUF0yMzJeSTotUjdDQF4kTTpYVV1LUS84IjkpMic4NjRDN08iVUdJJUUyIjU/SworTUMwXyo5IkApXTRfXlI6KkNVU1hdUE5OQ0YsOVknOzRaUzpaNDokLDFGLVgyVC4sIlAsSkFbUlFSI0w6SQorTSYgNUhJID8jMTImQEchUyk2U18xMSQqVlReKz1OWFkvODAiKDBUSyRSUDksM0AnTVMlXFMnOlBeVEssVgorTT1VKy0xNFRSIjQqW05QPkw+KFEyR1UoM1oiJ0gpI1pOMik5SENEQyg4O0dQJD8kMUtAIjVZWipMQlpeRAorTTg/OjNaIzUuXURfQz9JMEZCUChJOiBWKFNYKU5UNDJZI1BRUyo+RyQ6USFKMC1MSV5GWlxTLDAkMzlWWgorTSM9QzZdRStYMzNLND1aK1k8LVMmTS4yOzA2IVNDRDM6RjhTP11NV01WLF9AMCw5MjE3SiI/LiY8T089VworTSpDQjxZJzZVSlRASUI5NCUtW1sxPShSPCctJVk2Iz04OyBAQDwiMzlPOE0oJThNRFo/RlM3JiYsLl1UKAorTSpGOEA5IElbQzdeNEU5OTpURDZIT0VXJUZKIVxONDVbWCgzQTM1J1UuOyUiSyQ4QiMnLzkqU0hBKkUyNQorTV9dRzUoKEJTTEpZU1FbRlE/Jj8mTFxYOTU3RjM7PDYjUzYlLUQsRFgnQFNETSUxSl4hUFNXUkNGOTYxOQorTSJDUydETyZaSDM9VlpAPjUgK1BFSV9MJzJDUks8TTNXOCE1RU0uLDxfLzxaKUJVIjE2IzZaNjs4MVpAVQorTUdQVjslV1FRLUVISjQyMUZNNjJDQEguXSJINlw7M1lFRjs8JTo+UF8nXV4vRUpKLl9dTVZcKFolLUw8XworTSA9VFUqUVRZQV1VV1tSQEcoTydEMEhfRU88P0kmVUhWUjg8QStYSFlWJCMuSVJLNFVFSCdHSzNBKFwkWAorTU4vIz0hSFddSjM2OydIVSZQQjpIQ0w2XFJTSFAkQ0hUOChdXyw1Tk1XIk9DLjcwNV04UDcmRzlWRCQ8OgorTV4iRS9GRkJLP1shJUxALTFEUkYyUFEzIlxLOiVAUDBcMF04MjciKDklSDReO1YlQDgtPyRZWjEmTVFeJworTSA1PlZHKl47S0peVF47Jy5fIC8xTTwkUldZPUkqX0UpUFRYIDRLUEJQKCIsUzxYIlVeWytDOFxTO19DMworTV5JIC8nSVYiXTk/SEpHLC0rN04zRi5RLyYuXUJPTipIJTRSLkI3JFxCVzQ0UjwqVSQkMEw6TCZBNF5bIAorTUhAT1ckOi0yRUIvWExZUCNVPTQ5TlM/SiJZRFMnUTtQVVsnOyxfMTlLKCMiPTo1QEBeTVYiR0hDI1wmRworTVNFMUxINT4nNVA8MjwuNkIzSVQxKz9EMVpFOkY5WDg2NVc+UCsrUFBFNTBIIlQzViYwQSxCWz8nOVZVIgorTS0pI0tfPElKWSo+WlpIWko+V1swJSxXMyI6JEU6Pic9QVosWVwhO0E8ViMzRlwpVE4/XlhHNzZQXElPQgorTTJXR1ZFR0FFQkBbTy82TSBIVC45UEMmSDZcRjpILS08Okg3KC0tXTVZWkksOVRLQywlUi8jPUInVkQ5XworTUxTNSc7RVxDUV05SF1eMDQ5XTpaUEokMyZZKEhdWV4kUkZJL0NcWEclRkIiJC5OXltGMiE6NTlMIj9GPworTUNMJDI9PzpAXUdSQiItUTszVjtbOTVdQltVLU4kUEMwPU4vWFguNjshJTpcLiZaOzAgSEolTSdGJVgmWQorTTA3XEdYXyBXKC5KJDBQIiU3SjA+MEBTVUY2Kj8uRlRcQDgzPlg5LyMyOS5fMUssTllYOCUiXkJQVDdcPAorTSY9TlY0WSwiWEEkNzYtNFszVVJRUVgrO1FAQSMtXCQ7Xls3R1JHLyNKMjxHVkhUIF0wMicwSFcoM0pTIgorTVI8IitENi5FJDMsW0s+OSgiTyFfKzlFRyksXUFGKUNEV1AlOjtQT1ZRSFtHRlAtQ1NWVDtNVFI7Ql0uQAorTTkiNypOViRRIDk/Ojw+VExeKiRQXiVVUVwsXU81ICY4NVguRVRXTEVTKTA8VDUzIzgxRVNJKSgpWShWXAorTUVdIk1VISVSVi5PJjBTUjQgKSlPNUk+JzUrQUhfPE5FVUFNUj8lXzA0L1kkICwhJjlVTSQgP1RVJCZCOQorTTFPVzM9LiYjNlhKI0QjMyk7WCNQIUVQOEFdMUw9OzQ3LCQrU1M+XlZYWj1FSFFBWy4gNlZYQCZMWzEySgorTSw9TzhTKU44OkVGXFwvJ0JHLyI9M0ExRiJaRUhaVTYzND4rV0lNOE9bWjBMUUZEKkpTKyQkPkoiUF9aWQorTUFcUSErTC5HOjIjITojUTw6MkIrVU0yPiNWMVw1NCNCPERUTTJWTUdYKDRFWS5UOj5FUklSI1FQSkEyUAorTSxWOlpTMC0vMDwjTTdJV0sjUCVQT1RbSCEnKC5ENUYgTSlKI10qJSFGViYqLUFGNlYvVk8gXTsoSD5RLgorTS47XjQuW0Y4UUcjOyw+LEYrQyAnNEAiLyZJXCFcPEhDVkYuTzVLTyQvIkVVJTtdS0IzMS0gUVo8RF1JXQorTTxeMkRNS1pNWD4oNi8+XC84NTYqMU08STs4UEpNQCdKS1dKUSteUk01MyA4M15XNlZITF0lJDw6LDZSVworTUY4LlMhT0BJJkBSUjY+KzBLUytFLjE0WF1PXzhRXyRBJUZAWV1WK19EN1o9UV4hXS8tK1daTk0kXT0iPworTSdfVicrTyNYLUFKKkNWUCNEKFdQLl1DRlZaIkJALkooIFVGRS9ZNCxFLDZOU1QjQVUxIjYxUz46J1dRWQorTUA/QSYnJjVZNzkhK0k8JFYpSVZQRC9dRSAvV1k0JDYuIT9OLTEzIjZLXCotWitZNV05V1gyXjMpIlQpUgorTUNEW0VZUEY0Ikg+TikrL1E+KUdLPV06N0E6QThJXjJRTzNAWkpGU083JTdWMlEmVi0kKylEWVUhUzdQIgorTUxcR1MvOkk0VyMvPlZBRk1ER0ItUiU8NyIyPkNZPkI0VTM/NjE5PlsgJltJL0EpMVAvOCpJXSs+LkAvMworTS80JlouOUAqQy9TQTVPUTdAViVOTEhBRlgnRyJSNEFAVTFDPlMhUUwqW1tBJ0VEJS9JJEcyVUslNSsmQgorTS0rOFM4OCZMPFtcTFxbSDtZUjJJKlI7XiUuKDZXVEJYVSsmJSJLW0RZQjYjST05V1lMTTs8QTknJylTTQorTTkjIDc/TyBZV0gtRVAuJVsoSDtSPiJUUiw7VixOR0sqI1AiV0JYJD0gVCMsMD5STUcvTElQWl89WCg+KgorTSYqUVArKF0pLyUgWURMIjQvSF4nXTwqXE8tQVsgUDEiVVpITCYpKj9OKTYzR11FMFIrUS9JLkY2OVArOgorTSJQOTZbWkIhSFdDQ1VFUVYuUDQ0TikkQ0tYIyNPSlwuITNFWVJXTD9UJ0UgKTpIKzc3VlFPOCwmLi0yQworTSpBMzE4IE4tMFMvRDlCSUk4XjFQVVUtSiQ4TFkzLzlVWSYmPFouTyAiKFBdU1NVSEVbXkZLW0Y7QlYuQAorTUAmOyU7T0IvXTxdXTdAJS40SktSWFlTKCxUMUw3Mjo0IyVVU1w2UEI9UTI3I1EqPk8/KFJINkInVCE4OQorTTxEJEAxQUBLST0wRTJCTS1RLys2VVVXXUhYOV0yWl49IiVBOixGQSlLXUtDUTtUQVFRLFJXLS8sWyQ3VAorTUUrMEUvNVgyK1ZHOz08TyEhN05KO0krUU4hRVoqIl44KiQuQi9OKCwgJ0hBICJPMCU1RDRBIzVbXTNFQAorTTUvQVIrPVtZXkY+RSYjO1tRP1NaLkpYTSouKi8hNCpIMDMlXjxHLkJXKVc1K04sRVVOLTRSNSwzUDQyMworTU5UKFQjO0o7MiZeTCIxUytJV0ddTUk0TU1bKj4/QCg5TVY7MCNVTVk0ISxRM084XTUqSlxUITFcS0ddWAorTTclOjMoVSBEKV9fMEhGQSc7R0hPRSpKLkYgO1FIQ01dWVsuMVw1TDQqVFgpSE4sWj5HLU5RK1s/XTVZMgorTVcqMEkvMUJOJF1VLDgzIzdKQiZDTEA3RjFQQUgwLTwwJjNIQiBSUT4tUiRFTkI0W0UxNSxASzUkNzRVWworTS82Mzs+SS8xUSNTMks9SEU5MiZCREYpPEgqKUNJMCdTRVBRRU8wMikqUzhePEUkU0RJS0wwVldBIF0kJQorTT1CUCtaN0xOSSRUR1BCPThJKTUsMlE2KDU/TS83PlZATEtJPS0yKUMnVUBENSFfXVc1NSteOVIoKilPKgorTTorJC01KEo+SjEkTUdXXzE7IFooOiwhNVcsJS4zM11PT1dCWzNZU0dCP04uVlo+W0M4IyAlWFRZQFQuNgorTScpPzgkJCA5OzAkSDBVIlg5RSYiN1cuTU4hRDpMPVxLRT03PCBHOS80RFVTUEQyKVUjKlYpTkBYOj1fVgorTVNHOTpPUyY7Vlg4TS1XSEZeQjBIKzZFJjhaWjw+VjBFWzQqSyI7IEktXFBGWi5INjVVQTMiUFZZSSEqLworTVtYLCRJRl5OR1MzI1EgLyhGVFdIOCAiOCo2OEUwWjFJQUhBMzRITklYIEdfOU5cUE5MSStZISw9JCtQTworTSoiRjk8PD4nIzQlLUkrS004UildISlXNUsnIVxfMzBDLU9bUT5WTlM/PjVbL0RFL0Y1L0NaODMmPUwkIworTVIjPjAqMyIuM1ReJl47Qz41N1NXOENbKVFTRDVTMjgnPig6SUBGPzI8TyMjMkhUJDclKTEyP0koW1NPKworTTcnMzlAVVxfSidaVSYsVy4jM1U0RkwyVS9VXkkmNS0lKUEkNFAoLiRRLV9ZNj5PJVRRJCwhUFApTk0gVQorTVYtQFwgPilNSjRPLy41Iz89T1deSEA8XUddNFZJN1tdXz87PlQ4XiVJRSRITygmUSIyXkpcICciMiJMMAorTS0pXUohQjpQRD04Oyk+IScwISJZIFJZUCdWT15RNE5HV1c4Ly0pMEo5Lyc6RVIsUU1aX1JUNjczIj47WAorTS47TEwkWy9QLC1GSkk1TTouK0FSS0EoM0slNzZWODRcJiYnIElURThQNF5FUThQOyNVJl5MTyQwI01APgorTUItUyMhPT1SPCIoKUMgIko8VkJYLFRQXzowRyEjKiZPLCtQMFQ9UCc5QEsnXiZVVSMvO1lKNTs8PUczIgorTV5EVCgyKyMtJDEsWVBKJ14xI0s3PTdbN10hWjQ8RU1PIldTQSsqPjcjWzMxNFBTVk5XXDQqN1Q9PiEnMworTS1QR11RQCcvXEhVL0ggJV1LIF0lMkRDUE44NF8tVCFBOiQoIF02KFA1LkEhIVVcIkE/QFEwXyAkNkwtVworTSJHWiVSUjcqNSwgU0spUURVO0pYTUBCJjVIIk8xJ1AuNzM0TSE1M0IjRSVIIi4vKD80IiJcVzhbR1VeLworTT0tOCBFLjQ0NSIsWF5MVSJAW1JXQFtWRFQuPDpKTk4uO0JeXShCP1k0VCYuO0UiISpdIyJfJ0UhTy0nUAorTTFEWjEtW0g8WEUgJyohRiAuPkZVMjA+WTBJWi03U0cpMTdKQU43KjQtQEg4OC5IQzheUSE1PC1TSk0iJAorTTdIRi01TTVBJzk8XyJeXCtdPiowJV5WQ0EnSEFQLDJWIlI4REMiNVVULCQiJltSWk9SRz4lOiZQWjhVRAorTT9ET1s3PyQkJVVUOV4xQyYiUDstUTU7TkY3W0MiSFE1NVI4JjBTSThJXVhRNCdIWSEvKEpIMiEyRFYnIgorTSY5NVY3WD85KFFMIVEoRVZAPUgpXz0yQUNMS0QqICkrNCMzOzc5KF1XWztRIURaVkZKPixZNzpOSkpbLAorTTZNKCo8MElFVy4tMzcyK14gID4sQD9fVzNXKE9UTVsmOlVNMU84QFJFJk9UIjA0Ui9IPUkkWEJRVEAsVgorTUhGRCRfV0M6NzJdSlREXEEwWyJORDBJWCQ5V1EwK15XWzpfSiUrOU5LXVpNNVpAST5ePVomTFZCJy8rNworTVg/MDApOE9fNitBSi4qMl5NSilIIC5dWlpJVFBEMj4pJipGM08hPVdbUCBUM1YsR09YPjcjKkdRLk8nXQorTVhBLC8qU1k4OVFAX19dXU1VSF0nQyUpMEkpOy5AI0REJD1NNiFCXydGKyRIWkZQKDBaLUhbLE1TKyYyMworTVo1LyQpWClZKUMmIjMhJyFILVdLVUNVKkIxP1k5QSBMKCgwVjQrWClCSCA/TSoyTVEhWjw/WyxQJzpdKgorTSRLVEFGTEUrTjFQL0Y3NUNBN1JOQTFMK0c0XTAjUVY/UlFCK1QiNTQvPTgwIyFPVz1UT0QiLk9HUzI8LAorTU8nUl5LTTEpNUg5NDs5VCpKVjI4KC9RPCY6LVkkQEdZS1cyRjg3KVJEKlpQUDJMMU8kVERJVCg2RF1VXgorTUZHSzA8Q09LWFg/SFRUNDw8L1NJJiYqRk1NRUUnUFs+KjEsRlNGMks+MClfKSQjSjorODs/ME1BXjxNTAorTTwzPlhSTyYuMyRdP0QqKlU5Ly5KKjtZNUgxXk9JTSBWSlI4PFFSM1ItQlVaXSMnP1YySVg6L0ZfKT4gOgorTSJXU19RTFc3UEo+QTMiQFI0LTU4RFMiWDMzVj5JJk5dTlojRVdESkwpNFBGW15GWiJcJzpTKiUrWk9fRworTTA7MCo0XCw3QjRWSEEgVU9fWFw8M0haXylKQC1fQj5FNlxCKlUwSDYrIDZGKVpbP1BeQ1InKUopVzImMAorTVEyIi5MJEhXJClVNi5QSyEvXVdILzEjNEM/SUNNNi4uPF0iSypBME0gOkk8XzAxLzJcVDoxNTI6RD5PLQorTTRQLiVbIkYsSyJBSSYrLEFKRz0+X08nMydMOiJaM1QgXUA+VC4hUjE1Ik4xOls2RzgxUl1JNTRGNVQ4VworTSxVODFTIz9RSDNeV1FSVi5BLVMtN1JHKiZJQidLKzVXMTwuQFMmLSAtOzspJE5bVV4oUDZKVyQqWVQ6XworTS9QOjA+OkguIUgoK0ZDIS1FQiA6PjpeISxHQidPQTA2IC5eSkJKMFcuO0IpKUI1N0wiIzA9KTc6ST1SSAorTVtCI1UvSiItID0+OTdGP0lEIV49QzwiNF8hPkg/SSQkPiQmPTdZSTtCSTEqPTYnLV09TE5YXjIvUEYjXAorTU84RStVNjEyTFVIIC1SXj5JTUdLWFQnNF4mRUtVXT88OylLNFNXKCMoQlImLCExWUw9M0pEQCY1TUciQAorTTVGPU1MVC9KPUxLIEBUTkxLJz1UWkYxKTVXWTQ7XFpRWEteNV1YPTpMXD9ASV46QEwvPlI+PlZISTktPgorTTJROVJOSlVSMyI9OkAjITIwU0BdSktFVTsrUS08RlxdJUU9PiBRLz9CPkUiI1UjX1RfJDJBNUtJLV9SMQorTSZUO19MQ1o+LVYlVjFMJENLUjQ9NTNUUSlCTiNdODghVCMkPFglMFRWVlxdMiVISSs2PilORFMwV1YyMworTVRBOFRaIV9WTFMuW19dOkQ8SkElLipBJzJGJ1JaX1UmQSAiWCg7X1BFP1ZcPVBISz1NRyhRNiVVPV5FNworTThNJyQ1OUtfI0c3IEFKKUEwMjVYIClZQCkjNUFFXE9ENjVWX0dYVSpUIzpcNE1ROFQ4WE8oJy1QMyBALAorTSc6NSM4MCVKSE1QQUksSUtZPzQxOVxeMzUuRjFVUTdYWUgqLlhYVV9EJDEkQiEgOUgkQU4rKl9LXVg5RgorTVMxUCNAXEwxK18iRlhBNTUgLl8oMzZMKDU1KVVBXUVEOyVBNU1GQkwlLEdeNl8hJVNXVysoUDpBMEVBQQorTTNQVF9WVUBFI1Y5Q19LQSojSl9YMSVGJlxTPydIQlAmI1NbMz0xMVZZPVwtJz5KVjs5Xj8jMixTRShAJAorTSpEQEciMixEPFlXPCFaPTgrKypCVCY+Lyc3S0IrKzFXNlxbST05KCUxTCdTMCEjOFhPIlQnWyQrVTlFKAorTUY1MT1CXk9UN0ksXzcyVUVVTFdUOEIkKVg4O1AqOCg3VEtNPT4yP1I8Ok41XU5UTCohQ0MnSCdFQlYtXworTUcsUi1EXF0yKlc9Il9QWS9OSCZeQSg/SF1cRFZVW0dNWFdfKVY4ITdGVEdWUU03OFJUPkZBPiZdJzNLMworTSFUIT1FNDtEOkFPQSAkT0w9PF49Mj9FM0FXNl46KElSS0xJSiAyRyhQWE8iJi1EL05ZNUpUUyInU0ZPLQorTThRREdNI09CTS9GN1E1RCozWExBLk9WKidcT1VBLFtcJT5MUzhJVzMrRkhKKDFJSFMyQyUzLlwkJkYrPworTSohKD8nKEs3R1xNRSpERVwkMEldRE5eLj5SUycnIyBHTU1bXzEzLDhPWV9MKSEmMkpKTlJbISo8TzIkSAorTTk8IklXJS9INiIvVV01WjlIJ1g4QltAPEQ2XSY6QUFZWCZEVk0qJ0A7VVo+Lzc7KF85Kl9XXzY0TCtcMQorTVwlSUhISk5ZK1Q2PFBbOE8rSFpGOjghIFtVXj45WlgpOU0zRzxdK0JRMkIuVShSWlgmQiExXVJEUz5GMQorTSBCPkYnOyhSIjA6SD1JU19HUlBQSzwwRiIvSD4iXldGL0dHWyZSVC4zSzswNVxNLDVMS0NROEdZSVtZXgorTVlTQTpULi8zJ1ouI0IlJVlaSyc0MVhXNS1RWVlFKEtMS0o7SDFdLTY/WUsrPChHJjpcVClWMVlYLyhYWworTTdXTyQvPzJIXDhNNjc6UUk4QDtSWUgmWzZJJkEpLktNODFdX15aQi5dLSs5JSs0XSlTN1RTWEpFTzNdMAorTStUPS1TKS1bU1o3V0NBSU9NQk8mJlgrNDIlKzFFWSY+JV9JUUpUK1AmSE8nOUpBKz8tNEJKWzY7P1EtKAorTUchQThUJThWXUExOzxIPiRYLFVGKS5YXCspUCUuNy81NSY0RDEkRCNWK1ckPyM9WDQkJlsoNlhfRU9eSworTUc0LlRZLDgpRyNHKzM9TklON0VZTjAmJFQoXjJBXk8xKCw+J144WCUgPEsyJipYOEBRMFZAS19eJFsnNQorTS4uTjA0QVpDLyhWRUhEV15GWVk9UVs8RkZVLU9AJVU4SlNBJUZaOURLLzxeMD1WOlw0JlNAIFRfJEReKQorTVAtQl5JMlgyMiZLRkwrUjpCJ1xdX1ZcKlNeSE4zWyY2PTpTTU8mVjcpIy5IIzswLklIWjdVQDRJViciMAorTUpLLitIWFo2Ql5NT0hXQVYzWldULytBSEApTitINylPXUdZNEJAWlBULF5VRk9AVS5UIUdOMSs9W19NMgorTUU3NzhcOC1fKTBPKSxNXlVeNkNWUjEqW0YzKkAwNllDTkBBO09HPyknJkArI0lLISorRldNPl4rXT02TQorTU83NFdKIFMrOzdAJUVCL0EpRCEuOjsjXVckIlZRNkUwIzI6UjRfMks9UCVWSz4vPVAyID9PL1I/LiM+UQorTUZOQicxSiUlLlhbU1JbSzBPLSIwLDFNIDAoI0E8SjUpLUlOW1YgIFw4NSNTIFZXV0JaQi83PC4kOCJLRgorTV8kXD8sLSdJLEcuKVI3JFFfSjM2VEFZPCREVkNcQShKLCtQUDggVDpbN01cWDIwSTxHOSo1TD5LXidIPworTUFNOk9cV1pUK146Vks8VjAvXCQwJE47L1U9XyAjKS5cXkBRSytGNC8qXDBbTkZFMUVAITElX0xcKTk3WgorTSUrPF00LS8tSVgpJCszQSJKQzpfUDlaPjZPQlAuRiEwU1lCQjkwIjU/K0whPVJEJVZJI0ctNlREMyc+UworTVApSCtGSD1TOV1IMT1DOFpcRCpGRVNEWj87LVtbL0BUJjE6UiUrW1MvUl0kMVFcTlIoPC4+NV1fN1A5MworTV48UjM4PjlBL0NZVSMiNyZPJkkgKDxBXUtEWEUoQF9PQUk5OiAnN0JaWylZN0A2PCVXPS8iQ0NcXC8ySAorTTAvXC44OlpVKVBSKSwqJClORCFbMjAkT1gnMFQ0I1cvLiQuXTpSQEg9PTNZQExcLkU0RVRHVyk4OCEoPgorTSs0RVlYKCs4PT43I1MiLEE/RlpKJT5eWywyVFchM0YzNzQ+TjNON0kyQVNLVi9PPDotMy4pPS1XKEEsLAorTSszJEFSQVA8IVxZNychRShUQEkpXyIiOSMnPC8tKFE1PlAoXUBPQksyTCI+Q1lAJydQLSlEISg4UjVPQworTT02Sys4WUQmRlw+QiAxL1BQS1A5Tl4oOiE/RlhYSzVIMCE7PysqU08hWl09SVk3TUEqNis6M0RNJVVTOgorTS9IIyJYRT5GWEcoLyNPVl0jO148T1RYQkwoJjovWEdCVV1eVVpCJ01WQkIqWiROXTsjTFMgRyNEL0RAPgorTSIpIj1GWD1VW0pcXjciWilHPzVEIlsxL1s7PiAoUkVMWVtSLE0pLyBKPCROXjZLUSldOCpJWU08JFY7PgorTVQ5O180Ji4xJjQzMUtKOlNTTUtIIkEiK11XQUE6W1ddW1QpSE1MJz0pQkJFQz0sPSlNJE9CKSxAJEA/OQorTTpAMUNfVD9LKSskKFZfWVdPRFtLQDsmQlg6WE43NTNeXzUtLzksV1BMLjJEKElJUCxTM09LXDE5UjtQRAorTTBfRl4+Tz9HKjo+Pz0qUjsnQE4wTyA4SSAgICAgICAhICM4IEdQJF0gQFgjJSAxLiE7VCc3UERWIlQkLQorTUAwX1QkSVAgICAgICAhOCArMCEjICVIIDwgIicgKVQgTSAjKiAuJCBdUCQuIDIwICAgMDogICQxWCEzMgorTSJGLCoyQEosIC8kIlghP0YiVjgxMSEiRyBUKD5RUVkmJDlMLCQyNC0pPlQ8ViBZWyMpWC0mIVhJJFpEKQorTTlCLjMjKVA7JzIpUyEyVDNXIjIpKS5EKUBRSFApLjQwSTBROiU5QEUzIStVJTpcO1wyJlomSSAoI0AgUworTSJBXDEsIE1fISRMNDlQKjsnIzgvQUIyIyY5OC9IIE5fIEJQJUpQLigoRlA9VVA9TCRLLC01USY/JV5AJAorTSMwTlUgJiQhRFFPXCNfVDQ4IFJOJSBYQSghQjMoSyQvPyIwNiI3TCAjQjhQIixUQlxBRlYkMFgkU0E9RAorTSVWSDM+QEQ8IyNURVMhJyUlP1QxViIvOyJdUENbMVAhIyJcRjkhOCYjTTAyIjFENSVWOEUmUCgrJSUsKAorTTohUVomTVxGNTElOSVSNCMnQVEkI1ssOEhSIy4gKVQpVSE/Xyg8OD0xIjVPKU0oNCghSl8nVDgiSlAjVAorTSdUOCRLIFpOKTNQIVEgJjElVkA9JkA3NSBPJEY4UDFGIlEsNjpBWF0jNywjPDBCXCFMVDBCMTI/I0U8KworTT8hMk4nTUhGPyFVMCgzUC88MEc/Iz1IKkYgTD8iXkA8XyBbNyZHLEAiQSQiJyEoP19BJzomMkA1QVIlRQorTSUiJDU8QVtOIEZQND5RNkcjUiQ4VSItViUwSCYtUU8nJCNcKSQiICQmOkQ3TCAkQilPSCBOUiwwKEEoMgorTStQJ0InWlwvWUAhLCJULEVEUVBRJlcsNktAUzknN0Q8MkIiQSJFMEEhIDowISYsP1gxK1AoO0wjVlE5PgorTShWXCwlQEYkJjRAJSVQQlAnKEQlTiBMRylLKCVNIDMuJjUkQ0RAKVcjJlgjUUI4JCNZMD4+QTQ7JDVUKAorTUtASkgjOiRBPlAjKiRXICEmMT1cICEkQkNRKlwjL0BGPCAlRyNbXDBKQiBAJFsgQyxBRy4oKkgvJ0BLUworTSExLCpZQTclKDMgPSAwVCEmVUAhXDBNTiJUODZMUVFDJD8wQzFRQVgjT1AyQFBMTyM2QDE0Ii1NIjdcKworTStRIzciS1gyIDA9LClGWEEiUCVLIVEkKiUxNiAhXkA4RkE4SihdUDI9MiRGJz8wKkUwJEEjMiAhJFBIOQorTSIpVDAiMEsyJ1AwMjhCJy0kL0w7XEBZPCY7JCE1IURfIiREKjwhQkEnVTg+SCE3Qik2LDBWIFYqJ1UwJworTT8gX0YiWlAtQDFEMClFMCg/QitCKF00N08iIVggVUQkMiAyPCBGUDJeUCI4ISQwPTBRKikjUyQvLyBIRworTSQzJC47ISQsIksgMF0wO0EmRCw1KlFSUyMnODc5MjJUIlxUI0VBXjMnIkA1NTAxKiZQND9BUTdQJ0JIOworTVEiMlQiUlwlNEIuKSk+IDciICJEKExUIipQJlIoL1QzNjFMKSI0ICEnMDlJJkNEOjYiPCUmUShGPkBGSworTSAkPDMvMTJTJDJQQyYgXlooKzQlXVAuTCVMIDRWMUxZJChQK0cwQzsiP1g6PyAiWiInVDQ/IUgvI09ERQorTUVRJDcmKzw4UFFcPSVdSCo+QixLKUBMJShAIFIjXUAxKDFcKiE5ODdUMjdSIDwkOiBROzQhSkw2PlBAXAorTSJaNC5cIENZKEY8My4hNT0gU1wrOkIvSSIpKEA6MT9HIiJAK1kxR1EkVyQqVDFRUiRPIDg6UDclIUtURgorTUcgVSggJ0wxQjIoSyksWCs9QENWKU4oLjsiIlkhQigvSlFQVCM1TDJSQTUpIiwoICAwJ1snUiQ0XSFaOworTShMXEAjQilKIT5MRE4xLSwjIFw1VSBHOCJURCBMICM1IkJcRlRQJTUmSTwzW0BCPyg4IEZNQTZFIU1QLAorTSchO1kiTFgmVkFPXSBKOEAxIEhRJSgkMCVQLi8iUjQ3LiA+QydFODErQVQhJVkoKzVAOiYlKFQ6OCInWAorTShMNCJUUEAtISokMSIwMyQmKTxEP0BaQSJNKChRMjRNKDpAIiFQJSYkUjgpU0AjUCJQJDdZIVFDJUQgNgorTSoxKjYgOSA+XSBGISJNIDtSUjpBJ1dAMyIgVFMmLEwgTyBNNCNCUCJTQEhJIENEMUMyM18nRDw6M0EiJQorTScrODFWQFczKU5QPEVATU0nJzQzTSAuLiEpKDpdQjQnJU04MVpQQDIpPzgnWiI1XilDSDpMQjhcIFZYQQorTTBQJz8jTyw+KTBGQyRPWDhRQUQ9IU1MQT9SNlUnPkg3TCIkVCNJTDosMjdNKEE8PCUgXTAgSCwtVEIvTAorTSFfUClUIF5eJEg4QkZAS04lMlREWjEmLSdPLD5AUV0gKS9IIz8wRjMiOiAiNFAqKCRGQEVVMDBNJjIgNgorTTQiMjYiLyxANzI3KSBcLCMnMFpPKEFIRi5QUE4mIVw6WiFSTCVKUCZeUSYzKSNINVgiJk8hXSArUSFVRQorTSNLUDZSIikoKCJEQjxRITooSDwkVlBaTSY8TCApQiw8IUlERSBQSUAkLTAqUTA5MSgyLDxeUSUwIDo4LQorTSxSMkMnUDQyWCFDXSRQICBBISooJFlIKFIwUVInUExCIVE4PSZeICdHMjlDJCI8PUNAIUohT0Q4UiFEXgorTSVQUEU1UDsvKEM8RjVQSy4iSjhCTjAyOiVZSCUuMERIIE84KFVCOV0pSFghMCBeLSJOPC5FUDJIJ1IsOAorTS5AP1AkN1g+KCFZXyNdPCRbQVI2JCpMIilQRUUnM0AuMjAyNyQiNCI5QS1XI0I4IlYwODEjJygjXVAxTgorTSYyVCw4MjoxJE00ICRQTiMjLygkLEBCLyNGLEUvQjtZIS9IOCMhL1ghVVgzVDFcXCRKJDVUISIsIV5cOworTVsgTzInSEAuXFEwUicmJDxNIjhPJkpIN1kyIiIlMFQiVFBcRydFOCg4IDlKJTZAMFBRQj4hMjQxISExPgorTSZCQCVHQCwgKEIgOUEgTEApIzAlPlAxLyk1LChYQS1cIS84N1ZRNisoSywpUlAkMydfTDIvQC8vICo0OgorTVUgPlUgWDhHIlA2LSAkWDlBQVgoICpMJD9QICQlMCArKCBQOSczOEU7MSo/IEMwPF4gTS4pNDgiVUBHRworTSY6QDkoQTovKChYOiEhXk0gUCAxJzFcLCBUIEVfUUkwJDEsPiFCJSYgNFAgSzIgUSgzKCAhIUZCIzo0LAorTSohLiYgSTAlXSFKRyYmKDkyUV9SJ09EQDpCMz8oXEQoJDEuPSMzUDpZUUVPJkFMMC1QMlgnVDQwKEBZTAorTSZSMChDMCxFISgoIEExISkmPlwnJFAvPiU4MEFNMCRMIjA4LU9BLjklLlg2VkInPyY6VCAsMTYwJTlAPworTUAgVVElUlw0WyE9KyVAIDcoQjEnIjpYJi5SKVshK1BGOlErUCJAVEJFQUJNKCZQO1ogUVkmJSAoXjFCMworTSIiWEQuQFtVKSIoLiYiMCgmKFgtWVFOSSUgOD4rIExBJy1YRScgRCMiVVAiQDE3XiEvPCg9MVZEJE9URAorTVgxTjYiIFgvI0AkIyUwXCVRMFFIJUxALSVQWyMjOjw3UTI4LyEiUDAtMFo6KUBEKlIxQ1shQjw3XiI1QgorTSA6LEJUISonIChMM1xCMzUmLSg5W1A/QCAiIDk5UEogIC9ULCAiI1YhUSQuJTFUJSYwPC1QUFFaIy40LQorTTVRXjMnMSggIzFDSCNALEY/IFI+IFksOFIhXkIoXkAwJ1A1LyNIJDY+QUtAIkZML0MwOjEgKUwqWjFFIQorTSYrWD5NUEc+I15MKiAhLkchKSggMzFEXyFVNDUsUVxKIkhMISsxLD4iMFA6LyI6IyAuTDhLIjlKJVRUMQorTUAyLVsmKSxBO0IyMidYTEZTIUQlJk84Ll0xPkgiPiQiTFFJUiFOJCw8UipKJycsN1AhU1wlQ1QxRTA2XworTSlGRDhXQSknJEgkLF1BOlslJlQ0R1FIIylIKCFKISRaICIsIkExX18pIlw2KSBHMSUnIDNYUV9ZIVwoQgorTSMhOTYnOiQsKyBKTCIkODwzUFshJi88NCsxNE0oIVwvUDBbVSVDREVJMSwjJElENlghJCopKEA3IyFdJQorTSJAICxQIV8jJUxIKVlSIlcjWDwiNDFHVCVMPCYqMSUsKC8oJE0yKlAjSCAvXzE6PiAkSDY+UTNMIDo0JgorTSEwKiwgSVA2LFA9NyNPJCA+QipXJjY0RVUgLF0hMzwmXiBZJyZHPCtRMVZAKFBMQltRJzIjNFgyUiBOOgorTSNfNDtbITdZJVVMK0QwNVYiX0wqNTBHLiEiWCpZQC0yKD9ILUxAMyUnJEAiSlBKXCNPUDZFQFxRJC5AQQorTSNBNzomQjAqRSFNJyUgXDpHIFNZJUtYJz5QQF0gPzA1PTE7WyZbXC86UC0pKEVcPVswKUkiVkQoUVAhXQorTSZGOEBXUD1FIiAoQ1IhW1snSjhCWTAsWyM4OD8gQioqJUI8QDhQQyIgOEw/RkA7QidZJEBJMUs9IU5cLworTUVASUkkKTAtVEI6NSU1VDA2MVArIVowQj0hJTohIEgjTUEvKCUqSCArMSczIUxcPSYgXlkoWCxGXFE7VQorTSdITC84IF1EJV1EIC5AKSAoUVAiRiBdLykrNEFOMVs8JUAkIyJAJ0EhViAkTSEvTSdLOD1JMi9HKT5YKgorTUAxJiUhUFA4UVEjSyMgKEBJMTpVIytYRiBQWSEiIiArLCE4SiAkVEM+QUIpIF00K1dRJlwlIUgmPUEgPworTSMnXCU9QTFfIU88Q1JRMSEgTCgqT0IjTilKQClcUEtfIjxULTMgSU0jSCQqSEA8JyAoSCNHQi4+KDRUMQorTTlCJzwmLCBGKkInTSk0UCNZMTs2Jzg8RSJSIkohSCQqUzIuJSgjVCZPMjkyIC00PlMwTEUhOCwoWSFDUAorTSgoRDM6MTJFIixMOVxSOUkiWjhEJVAuPyY/NCVMIVxOKD8gN0xRWlIiIVA3ViExQSBIMC1PMTxTJl04PQorTURRK1okP0grL0IyMiZCOCRWICBSKC48N1gxNCooVlQ5V0BBOyFCQCUkUFsjI148Oj9RISAkVlwjXVBSMAorTSU6NDJVQEsgJzY0IiUgL1cjNlA3WCFMVCEiJDRWQDZJJTw8ID9RVS4mPTQ9QSEzQSEnIDItQDstIjlUMworTV0iKlAjXjA9UUI6ViFVUDpcQFZaJTggLyIxLDghTzBGQTA0OCMzOCdVMVIzIURYPkNBMjspNCQkN0BbVgorTSFWJC0jQiQyJjAgIF9ASFopOzQ5MkEtQCA4VCokIVRcKSNMQCogIycoNzggSDFDOCY6VDVKMD5GIl9MNAorTUNQKE8kVVghLlA4MihJRDwkQiZOI0w4Pi8gUy4hUCg8OSBJKCU3VEVEQihCI0NMOEExPVwjQUghKCEhTgorTSVKMC1EUVAmJFMgQi1BQlMjVCRDUCFcMSQwRDE7UFA3Iz4oJkRRPi4hWEQ8U1FBUiImQDlIQTs2Iy1cLworTTBAKU0jV1w1QiFMUiUkID85MEdbJiUkO0dRVSAhK1AzKEBGSScqIC5BITshKTxARUlRTzAgO0w9TyIkMQorTSVeKD9QUTshIyggPjEiMFokLTxEQ0EoXCcoMEIoIF1NIERARFVRPEImRkQ2UlA1WilKODtMIEY6IiQgNAorTTdQO1ImO1BHIVI7RChbUDozMTIyIz1AOSkyNj8hRSg1MEBdWyIsJDk/MS9JJkhAQi8xN18jXDgmUiBSWAorTSgpXDRQQjtbJk4wNz9QMUIlJzxBLTE6MCY/RDNeQUtAIDxQIVZQNFEiTUQ/OCFGQidKODs6QjpFKSpcLgorTVQyOUokJjwvIFApUyk9RCg5MCJAITJcRVJCJVApJSxDITFSVSdfTDdAMU48J1lUNj8xVlYiNzwgQVAlVAorTSYpWDFfMD9LKF0sJSshNicoWExCREIsQigiQDE9QVxMJ1Q0PCwhJiIlXlAhKjAwOSZUMEVFMCRXKE88QgorTUxRPTojXlRFOzBHLCRGPDEzIFQtIzxMIiJSLlYnLkQ/MFAuViMtXCFIUVglIk5EMiUgNlopKCAmR0I4MAorTSBFIC8vMVcoJSswIjdQTC4nKiwsXyFTVCknXCNaQjFWIDkgIVkyO0IhLkQgLSFNXyMoKCowQS4vIy1MMAorTUMyM0QmTFA0VlFVNCEpPEQjISxRKFtEJS8gJFIiJSRGUSFeUCBdXDtTQThLJk9IOFMgRkwhLzQ/PTAqKgorTSM/SD4zMD01JzhYIjcgMCwnXyQ/WjA7USc6KC9VUDsxIkhQPzEwICEgNzAjMlBSPSVNTDYyIFpIIjZEQAorTUkhK0YgWigvWlFfNSJDUDlJUFNGJlRQQDNAK1UjLEwvLlFaOCA+QDxBQjNPIjxQQiNBVT0oPFg7IzBXRworTSg6RDc1MV45KFckNyIxPV4iXVwvUUBQWyhRLEJVIVhbIjogMTIhWUEgVCg2RCIzNyA/TC9FIik/JUU8QworTS8gUDsnNiwvUjBLNSdOREE4QT8qJjZEOE0gKkYlMkA1T0IwUyVQLCogQCFKIVooM0ZATjMpQUQkL0AoXgorTSkiIEEiMVo5JSFcRTAwVlIpRjQ8OiAuOCg4UDNKIjgrKTdAQlUyIi0oLVQ+TSBYJSg3WCtYIVolJDIoIAorTScgOFkkMkglM0EtWShKPENCIVRGIFQwLUBCMFEpIlgsU1AuMCAyKCVWMSUsJVFcMCxAXkMlTyhBUVAiRworTSgqUClMUUw0JFhUOT1QSEAgQUAqSlAjIScuOCtAMVlaIFEkL19BITghK1RCRSA6NiQ7VDkhMFQ9JjE8JQorTVhBPykhK1QkOzEvXiM1PCQtMD5GJkEsPF9RQCkmV0g2UVA0WiEiSCdDUCknICYgQjMwUCQkTCA8QUA0PgorTSZMSDdNQi8+I1RALTohMD0gSjQ9MzAvSSNGTCVVIEwgJldEL1xRMEsiXFgnWiE9ICNZJEE/IEhDJVYkNAorTVUwIzQkOlAqO1E0SCcpXEJBUEsiJkpIQENRSDQlQTREVEAyQSFXMCZDMU1GKTE0OkdAPz8kJEg9OCIuKQorTSJBNDwjMV8/KCBQJUshSzApL0w0WFI5RiQzLDZYIFAvJVlMPEQhIDMgXVgjPjIiRCdPLD4nIFBDKCY8QgorTUoxLVAlSSQuXVEhPCBULEApUFlKIzwwREtBTU8hVTA8MSElKyBAKDhTQS44IEA8IEVQMT8hWCA7XzAiKQorTSVGQEQvMEc+J1QgMidBV1sjJ1Q/MkFRJChULCtbICZNJClMIjsxKS8gRDBFUUInNCdKUDhEUiNZJFZEKQorTTlQJywnKkw6OjFFRClPXCMpMC4zKD9AMTcwIFgpJTw6XyBdLSgmMDdWIjhTIz5cIk0gM0sgMjAjMDBRVgorTSkrWC5HICQzISRMJVJBSyUhI0BBO1FfKyE3MDMpQExaKThUNkxAI0woL0w1KiIjKShCXC4oICFGJisgLworTUkwLEkiMlQ8N0AwRCBZXDgxIDxVIjA0OVIwI0omVlwkIzFeLCQrOEI0UDE3Ik4kNFhSLzYkUChBN1A+WworTSk+NEJdUE4rIUQ8IS8wJ1wkP1xFTkEpICZLQCc6IDNLKUZAPFlAIlAgM1QsPDE3MSJSICVFUChBKDQoRAorTSsiLT4kRSwyPEBFPCNfICVHQU9ZICI4KTEwQEEgNjw2IEIjPCcsOCY0MDAyKUcoIVsgJkolNSBEViE7JworTSYpNC0/UC1fKSAoISxQXU8gISg8TUA9IiFQVCE4IV41Iz5YRlAwW18oUFg9MzBYUigxLEBMQSFRIypIIgorTTowIEYlU0wtLCFHTiFAPDBTUUFSIV1AQyExN0ckSkQ2NzEsTCQtQDU7IUIkJFRMK0YwPyUnXiApJFBYPQorTSVPIDgsUDA7IjQgNCJBL1okI1RCRzBWUSgxTDRAUDRAKT1YRjJRREAgNVg7TSIkWyYxVDMoISJAIFtENgorTVsxKzQlVzg0QyIlKyBYRCg6IVhPIlNEMElCOzciOjA5UkAkSyFbPC5IMjFUJDs8MD8xIlEmXkAhKjBeSQorTSg1PCFQUFpdIlgwNyhBPSQjXlw1RVAqTykiTEQjQUs0JFc4P1gwODclUkhCRlBaQSkoKC1NUFlOIUJQOAorTSYwJSMlOzguRVIqKCgrRDpaIDdYIzYsRUwhT1YnOTBCPTBQLSFAODQhUSUuJkpIPFpCMSsgQygkV0ImUAorTSJOSDg8IVdHISNMQj5BJF4hOzAoWUFaVSgpNC43ME5IJEUsIVBQV0ghQlA9R1FFTSNcVD8pICUhJDogJgorTT9CL0IgNyw+W1AzOChROCNZMDxMKTEwNFwhNSglWEQwM0EuIyM5KD8oQEE7IVlcPF5SK04mQkQxNUBXRworTSIhUEJNMEMwJj4sIidQIkQlTVQyXiFbQiIlJCZPIFsqKDU0LC9QVzMiL1A7KDFRLCQvOC9YUC1aJ0EkRQorTTshWCAgI1Q3PVIqRidBMEMpIUhbIzJIJ1IgLVkjUTA5T0E3QyFeMEVKMDtBIlVcIjAhKiYkLVQnVVE7VAorTSJNSEJNUExMIiNAJ1NCKF0jITgiJyBRWykqVDVNIFcyJFNYLD1BVFAgRiQ1REI7TilEPDYnID1BICAkIworTVQhLVMiXiBDXUAuWyQyPCsgMC5KISVANURRNCshMUg3MEA+VShUUEErIT0pKFYkMFsxIy0gRDwwQlBWVQorTShVTCNGIEolJTFYI1AxPFkiU1A3NTIjQCE0JCEiMi03IS1ELSgyNlklQkw8JEFCLCRDQEVaUTBaKEBIKworTVtSMzAnXiAtVSBDTSJbQCA0US4jJCEoKCAwUlcoJ1g4KEA1UiFFSD9QITUqIF5APEcwLlojIjxDQVFAPworTSFGODwqQS4kJTJYKEhCOEggKCQjTiFNWyMhPClcMCEkIiRENyFROzAnVjg4NjIkJiRNLCAqMjZbIE8wNAorTStBJUMmIUwjLyFMXSA3VDUnMiUsJUlQPzohN1gpTVQvW1FdNSlLNDUuQjI+KTRUMUlQU1MpRywrWzAuSAorTSIrLCYmUiw7JDM4LEFAWTglQiwzL1BZJiMkPEBMUFwgI0o8N1ExPlEnLEwrMlE0LyA1MCsgMSE1KCMsKgorTSIhIlQkWlQ1UlBfVylJRCw1IVciIE4oMVQwPV0lNiwhOSIhSCBBVCNKUF5JJFUkPVlCLFYlJDgnSUIoWgorTSg1QClUUT45ITk4QF9RWzgkVyA3NUA8WCIgVCM0IEEwKFhAQEQhOighLzAqTiBGLSFcVCIoUTIyIiEoKgorTVgxRFkmV0w0XiFXIiE2VCUmISA3IFgsMVFQXEUjJDAvKVBXTCNQMCteQENHJ0UsMC9QWiInSzw3XlAoJAorTSNeTC5ZMCY7Jks0PURALT8mL1QpIEI3TSVUNCc2UEY8IShQPlhSJC4mKDgpNVAyVSk5KEFHIU9EJUZYNgorTV8iOj8jPSxGJyFJVSFPPCxIQU84Ii5UPEdRM1QoU1wwPSAvTSFSLDJXQU0wJkE8KlIyJDEoTUw6KjBBOworTSdWRCdOQio5Il5ILyVBKiAnQlxEQyFNTCdYICMyIVE3IjZcI0cxOiooOlxCQlA6WiZfIDNRMDJJJU84MQorTUBSJy4lR1RDMDAvRidYLDg+MC0gI1xcLEUxRSIiLlxFUkE2MCEwVD0oIFYiJUg8IlxQWkgmMSA8XFFEKgorTSFJVC03Ui9WJ0tANyAiJkYkNEQyJFE4PyVJQDlfUCojIyYwJ0IyJjMgOjA5TkFNKSJdUDk4IUMqJScoJAorTUJSOzkgMlAjKCFYJCdXUDo4MUlaJD9AOT1ATVElNVAvWzE7ICA6XD45QC0pIllAJCIhWEQpKlhHIFBANQorTSIlPDIxQCFRJygwLS4iKT4kIFQnLDFILSZCJDYtUCw7JE4wQkZSLkohJyQiKzBXPyQmVC9PQElEJVBAJworTVVBRyMhLEA4RjBIWyUrSDFKQChGIk1ANlMiOFIhIzAtJlFDIig9WD1TQFohJzMwJFkhPkYpNDA1TUBLUworTSgsUC87ITcuICZEK1RCNTMgKEgmPUFZTClFTEY3MFhCIEQ4OVVANE0nQ1QiJEBGXCMzTCNNQFVAJE08PQorTSRCOikpPygnISEvSyJZMDIhMFkkJEw8OiBRVSYkJ1xCM0FfOyFGMChEIDwyIkUoLjMyLigoJVA+PSI0KgorTSlMIDspUUMzKFFQITdAVjghXCAjICE5UyQ1LCs0QiFAIFw8JzJBJUMoQkw9UkBZRCY0UDJEIUcsIEJYKQorTTQyLEkiOVg0J0EyKyY9QCk1QSE4KTM4Ny0wUSIjUTQtRkAgMyYsNDs/IUNBIC4sNVJCOFEkJkAiJkFIXgorTSJMICUuQSItIiAgNkYxPCskQkAqUFBMIykxMERaQjVCIUJUI05AU08jRkxFKUEpNylDWDMqUEcmJjw0QAorTUsxJEwjJiggNyBRQSkrXCM5Qi8wJlwwIDZBL08kKzA0WCEsWCZYNCZDUDdQJlhMQk8xTF0mSigpVCAoXgorTSYiLDVcQCNBIUZQK0FQNEIpSlQlVlBINiNOOClNMigiIzZERVEwXFMgPTQ4VVIiXiU0XDVJQUlCJDFQIQorTSNQXk4gViw/R1FJISBZKCk6IEE1JycsRD4hOTMpPlQoTjBWMCNSJEZIUTw2JTVcOFJAIz4nXyRFMlA4JworTScrLCQ5QS1SIj5AOzRBO1UoUTREUTA4JilQQD0yIVIrJj5MIy9RQlwjS0QhQkA9NSAiNDFQME5GJS9YPgorTVUiLT0mOigoRTFDTCgzWChUUD5AIlhQQE5ANy4mPDwvJSAwPiA3VCJDMF1KKD4gQjgyO0glRUQrVSFJSQorTSVPICYoQEFVIjBcOSxRWUwgMEQ1KCEzWSAkLEIrIEI6JjA0M15ASUckNSQ4PEBcSyk4XC9aIVZEI11MKQorTTtRIi4oIkwqIDI1TiQrKDArMTg4IVVcQlZCJCQhUCAhXEFIJyJIRDckUUFeKTFYPDFQLzwlIVA1VjItKQorTSZKLCpAIVBMKD0gMFRQQicnWDwzI0AtXyUvIDlGUCNBJkhQOzhQNDUhMCQ8S0AwQCZQUDgxQjFcICEgOAorTSghRD4mWzAwIjIoMCVFTDc3MjpWJSskMCNAWSMkV1A2TzEoKCRHPDY5QV1KKTFAJT0xIkonMEQhQVArQgorTSNWRDFdQSJPJzlIIiQwJzgmQVRGL1FKMiMpSDxWMVdOJkk4Jz9SNFUmREQ/JkE8ICk8NCozIVZXJzVQQgorTTMhQFojV1QgPCAyWSU3LCo0UEY+JVRMKVRQMy4kIUQvVUBNXCBEODQ+IiAyISNARCAwMCkgRUg9JDBAMQorTSZVOC0sUCdJIEkoPTMxQDcjKkgqTDI1NCFBKCBcQEQzIzFEIyJRMjojISQ4UTAgOCEzIEBeMDMhIlU0RgorTUxSLikjTDwvIDBSLCEwLDRVIVtWJDpcMCFQOF0nIzQ0XjIvJCQsVEJRQF1PKU1YOT9QQTQmQ1wqIUE0UworTSI9WDMmID0tIU9ELCtROCwpS1gmXVEuXyJZTDgwQEdIJlMsLF1APjIhVVA3KSIsMSI3UEA9UFI5IStIKworTSdBLDQnLyQ0SiE8ISMhXC5QIFdWJ0lAJiJAKkgpPShGSzAyKSQoUCM/MixUKUNQLSFQKUwmOzQjSzInVgorTSA8WC1QUUdeITxERj0xVC8nMzA2TzBbSyhUWCQ+IUUnKU8sNUdSLTgjV1RERDA3OCJcJDsuMEolJUdMKQorTSZBSjoiMyAlWiBHOyk/PD0qIVk7KC5cK1YwK08nTiA8WkEoVCJMRDRbMEhZJVMkKlkhMEEkRlxCU0BfTgorTSItNEJPIiZeIEBMOyggSywkKyRAKUBbNCguIDkoMVZQJiRcLUUyMCYoKEhBOVAgXShdPD0kQF9MKEc8RgorTUlBICEnX0xGRDI1RSMzXDE6MEBMIjMoRkRBQEImJThBQlApJyQhPChFIiMmKTFcQEMiL1shQ1AsWkFUKQorTSkrNCBZUVssKTUsIDRRKiskLSQ1KCBbQyRPKCZbIEVGIVU0LV5BQD0nSUQgI0IiKCJCMDc1UTEgJTtIIQorTUBROigjKTgnNTBGTSdYIDZUQUEgJEosOyshNkYnNURESTFaRCM8TCpOUTlFIExEKCEwST8nMyAzQiEsRworTShHLDA8UjsqI1tYJS8wTDMhRTggIyImJiUjSEBQIUE4JEEgRC8wMjonJCAyXDAtVyEgVDJeQiVfJkcwNworTTchUV8nMURGJ0I6KiBMNC9GQCw/ITdAKTcxWDsnTVgkTiBSJCdWPEFJIVc9IVJMQl8hODkiIkAgTzBELAorTSYnXCBWQUApJTNQICAwIyIiSjhFL1ElOSNBLC0xUjMkJE9YQUNSO1ghPFgoJjBXNyIwUCMyMS44I15ENworTT9BSEEjVEA8STItSylNOEI3IVkhKS5QP1QwQj8lTyAuRFIyKSlNUENYUUYoKC5EQj8xSEAlXTAvTUIyPgorTSRRVDY+ICAtJUNMKE4xI04lP1g4OUAmUiEsND0pMEVaJUBIMjlAS1whIEQxISBQMSFDLCdSMUcvJFQsPQorTVRQMSokWDQgJVBEPSVHPDwrUEcnJUQ8ISkwMkohVkwhSlE3XyEjRC43IChMKUI0NEIhVyAnMDxCWVE1VQorTSBIUDc/MjZbI0ZMOV8gO0AkLEgpVyArViZELEVQMFIlKSZURkhBWDkoSEQsKEEgNCMxMCtEUVEiICNcLgorTTVRIUYhSUw0OlI8ISYwNEIrICxeJixQNFowTzAkWkA9QCFXRSFOQCpEIUJfJD88IFxSIiwjQShDSCIuJAorTSQkLCY0QjVXKFVANCEhPyQoWVQ3WEEnTSA8WCJaMVFWJjggO1hRQyshUiQjSSAwSyAyNCFOUUg3ICQkLgorTVEhI18gTlxFQFIoJyU4IEJTIVkkKDVUMEZBWzEpJjQ8NEBBICMmNDBKUT1CJEwwJCpBKlgnI1wlVCAqNQorTSk0KDA0Mi1SIEkgKShBMlAhVFwwXlIjIignRCsxITNaJSYwPUdAS00oOCg/PDE4SiNYREVXMEReIEIkIworTTkxSkgoQCguXUBBVCReJClKIEkkIF5QKkMwOUYmXEQ/STEqLCBaJEIxUjBYIUFAQjUxOEAoJChFQzE1TgorTSRANEZBUixNJF9AJyFRI1koPDQiLkI7TyY2MCMwIiYwIFQ4QzFRWlAlUSwhPzBLKyddREBTQC9DJUpEOAorTVJAMl4kWFw0USFMMCA6IDJWMTxYITEkPT8wNzsgVDwnQiE7ViVHJCxSIEgsJSggJU0gXSEkLCA6SEBFNAorTSdLLEQqIDJBIig0LShRXVIoK1BGSFAmVyU8ID8wUTs8ISxURUBBWkclVSRDODE2NSBcSCRJICVUJFQgKQorTSoiNl4oXjgkP1IrTyUmSCRTIEcmKDokRlBCICkoQTA9WFBfLik9TEZMIDdfKCNIL0tRPSspQ0g5TTIhKAorTSQoOD5aQEIqKSEsOEVRI14iTkgsUVBXQCc1TDgzUEE8JC1IKFJAPlcgRywxO0E4WiM1NC4oUSRZKDYoKgorTV5BRFMnVkg7MTE7NyZAWEFLIT5JIlpEIiIgXC4lJkxDVVFXMCI6XCpZQjVaKEBERjIhQFwgUjBALSAoIQorTSBISEEmIFA/KEgkK1gwMiohLyw+UyFeUiVAIDwyMF0xKT1cKSowK1QpP1BFITBMJCZVUCtKUDdLJi4sPAorTUVBVScnXlglVSA3PiIjTEY8MjZGJz1IRkNSJk0mVFwpK0ErXikpUCZTMjg3I1AwMjkiOzUgWlgjODBLPQorTSU0PCAjUCgwI0MgNl1AJT8gICAlPDFdPCRFID80QVYgJUo4LDAwPTsgLyQlOCEnSiMiOD9LMCxNIjZUPAorTVNBJUsnPFxCXEElRiI5LCJMITtLKCMoLSgyKiAkNTQ1Q1BPVSA2UC9LIiI1JCg8QEohOTwlWjwnSFFUXgorTSgxQCkmIjYxITcsQCRQSCIjUkQjKSE4VCFCUDVdQCNdIiQwPFAxQicoSFhFJEBQJCZDSCM2USxZID04JgorTSggXSojPFg2WTAhJCItMEY7QDsxJkQ0RVJQUV0gNyRENFFMLyZOKCdTUSM/IVxIOVMhXy0iOEApKjFUMworTSA8JCBSQF8gID5INFZCKSAnJiQzRSInQCVQUDVJMSw7JV0gMSdRQlMlTlglXSFXNiM0QDhXQUElIDpQJworTTQhL1MmIkgpPTE3KCFVREI5IjVEJ0M4LyoyNVsiRDA+NCEvIidPMDVMMTBEJCAoQ1hAJC0nX1QtXzIgSQorTSYlICsyUVggIzc4P1JBVjApRyxAIyA/IiVeWC1DIi9OKCwwJSkiIyMpJiQuRCFLSSlFNDElID5PKDckNworTVRRXkokIDA0SDBcNSkpXENCMjdIJyNAJ0owSCkjRiw5MSBBWSIyRDY1QidUJTBEO0QgUSshW0hEWTEqOgorTSUwWDlDMUgnKDRIQjFSIFUgX1ggISFUOyFFPDEyQTRXIkhQLUVAIzgoQERDTkIvICk0PCkrICMpJSs8NworTSFBNk8jPlAnJFAiNCRZSDZFUFU3IkVYMShRPEonJEQjLUAkUCUqIDMiQiZLI1FcOUswPDInW0Q3VzAzRAorTShLMERcMFU+JlwsMkQhOFwjREwoL1AmNiZQNDlfQjpOJSM8JDZRTkElNEBEVyApXSJdPDIgQEJFKDhAOQorTVQiID0mVTw2RzI0OyAnPDEmUigvIjtcRFYxMV0mJEw5TjA2XidLQCAkMV8lIUU8MFpSLkAnOyQqWSEqMQorTSElRCxaIjc/Ii5URDIyOkYmUSguIyBXQSgoPC49QiUoIFtAOSkwPCIpKDApMTFdSik5PDIzUC00J0FYKworTSNAKygmUjQzOEFWLCBUVCExMiY2JVFMPklAIiYjX1BAQCBIQiMyJC1HQEFEI1IoJENRWEkiWzQyR0FcNAorTSJaWC4+QUE2Jl84KFdBUzcmXzAgVyAnLSQyNDo6MFRfJz80LVMxITMkNjAnT1AhQCRPVDM6MD5DIUwoNgorTUsgSiIgPiA1RDIhUykrXDREUTFIJT00IThBX0shWExELUEzOiY0NCwvQENWJzU0N1MhWlAkTSRFV0I7MgorTSFMOCBNUFAuKEg8JThAOkAmRVQ0MTFITSE5JDknME5NJiksMVMwRikoK1wsSUEpSCkrVCs9QERPJTZAPAorTSNQR1AnUlw8T0EhJyFKWC5FUFomKEIkPjFATkkhISA+NUBLIyZGWDhOUi4nJVlcNVMhNV0mKiQmREI0IgorTSA8VC9FQSUqKEFYKiBAXUYpQTA7JlAiNiYtPD4gQFRTITMgP1AhPTQmTlAyXyBAWyMwKC4+IDJVICcsNgorTSQiISAjLlAhPUIsUyhDODNNQTBCJF4wNjBBSjomXzBFLzBQSSNOJC9IIS1EJy4sOkggNCIpODhEX1I5RgorTSlNJC1bUidfIjRAOlsxMUInJ1QsQ1BVJig2NClPQDhTI01QKypCLFslVSA+RlE6XSczTDtUMChAKFQgQAorTVNRVTYkPUwoK0BXMiFCRDtWQTpeIVxQJVJQOkQlOTwiLkAsNyJBKCwiISxHJEosPEYgOCkpLlg9PFEjSworTSNRQEYyQUs4KDUgL0chTzUlRjBFOFAsNicyWEVQMCM7JyhMKEVQRCcoPVQ0RCFfIiU3RDhMQU8hIENMKworTToiITEnIShGLzBdICRdKCpOQDgkKFVYIUJQVjAjLyQoWCE3QCFbMDRfQTMjJzNcLytSKzchNiwzIFI6VworTSApXCZbUEcmJSlYP18wOzcgSEQyVlE4JCVSKD9FMVxKI1IwI04wITslKSQiMkIiUSEzLCwgMTUhIkYgIgorTV0gWkYkXEQtOiE3QSJWVDBZIFBFIUMgMEUiOVcmSDA1SiFJXCBWTCtHQDVfJFooKU0wWVwiKCw2VUE+OQorTSYmLEUkUSU5KDhIJF5RQE0oPiggKiEpQCVASEYwUCE4IzYkNz5CJT0lITw/KDIxNyZJLCo3MTI9ISwwKgorTSlAN0cgRkQ3NyIjViA6UClBUi4uJExUIiVAMj4oXihAOlI1KiZBLCQlUUo0IUkgKj5AUl0nVEA6PEFWQgorTSJaJDEvQjNUIDsoPTdQKUcoVlA0LkFbSyJGSC86ISxcJ0pcKEtSJVwlKygmJCIjJSQqXDxbQUM7Jz1YQAorTVNBX0AiITQiJlEuSSc7MCVHITI7ID4oMF9SLlUnU1w5NkA9ICNMUDM7ITAzJDA8OkVQM0IoKjQtJ1BZIQorTSZGKDtDMik1Iz5ILlQxIFIgI1A3O0FcSyg3XCI0ISdIJCBILTMhVyEmTiQqQjBRMCgyQDhOME9DJlNIRAorTSQgPT0jI0gyXlFATCNSVCQlICxWKDMoOSIgPiEmRSRCKVAmTyYwNDxLIU8hIS04OilSLiwkNyw0IiEkRworTSQ7IDUnQDBIKC4wIlxAUF8gNjwiPkEwOicwXCcjUDFSJVM0IC0gODIoIThBLzBPQSNbTDA/QDEuIjs0LAorTU5AXEAnOCg6TyBRTyNEUDc/UEFGISlML11ATl4lQSAkK0FaPykrKCFIMSVcJVFILDQxXzcoQygxVUFSWgorTSItSCooUjcrKUdEKiAwXCMjTDwxMDAxIyZMUDwxUCwoKEc4OVFQPCQkVjA5WEA6TiROICZSMS1ZKT9QIQorTV0iKVgkUDgxUzBUPSJEPCc6QiczJVo8N0tQNTAjUkA3XDFBKyIsQC04UFtLKUZIIiQyJ1YkXFwyOjI3MgorTSZdICU+IDVJIl1ERFIhXDcgLkA7XEA0KCRcMDIzQUY2KTooM0AwUkwjKDQqOyEqQCdDMDNaUDZNKFEwIQorTSYwIjAlPVQvWEE5UiIqUCslQjk6IFhYLj8hNl0oMFxANDBKViNWSCEsIUQmISAwQ1xQQTwjRkwpOUA9OgorTSA6SCs6QD5BIzZMOUwgI1UmLTA2XFBFVik8KDhPMC5XICk4KDgxVFUlVFglQEBLKyAzLERbITpKJUYkJQorTS5QUloiIFxGXEFAQCFNSDJFMFNBIFw4QTdSKl4gJzQ4MTBDQiQtREIoUFU8IEssNzYxJjkiPkArTTBcSQorTSM/ICVZQTlAJkdUQ0lBWTchQ0RDLjFaWCFbQC5IQVpWJSlENEIwU0UoNjwqV1BFOyc9VCEuUURPJzA0KQorTUIgLk8jPlwnQVEoSShMXEMtQVAkIVxIOCMxIE8oQzQpXVBZICk9RDYtUUNTKShYLylAWFAjWSA8MTBHUworTSk+MCNYMENGJUo8KC0gOzQnLURFUTFZTyddODhLUEJRKUhYRVZALVQiRzQuVyBNNyInXDUzIVJeKFAkPQorTSUwKCMpMiwrPFFPQyhWSCElIFkpJFYsJzxQP1wgRUw0ISFQJyZXPD4oISVBKUhENENBOzkoVSQuPjFBKgorTSNfUCRZUD83KTxYLiohMFwjPShCMFFfLiRdXEItMUpBIyBILk4xUSwkUSwyIlEhJyFKLENGUi8+ITQwKworTTZBTS8lMDgtQTImVCZXMEQ7MFgjJyEwMSdSO04nRzggOjBOKyc3KCtBQF40KFs4OkIxMzwjPiwkNzExQgorTSYsVDs3QFspKTBARjtRKlsnMkBFVEFNPiNdSDAjQF9FISo4MFAgRV4oMDgsISA1UyY8KENSUVRXJ1gkMgorTURRLCogSDw4LiBTJiRJRCVTMio8JE9UKTZQNkgoKDwjIiI6SyglNEQhIFRWIk1YLCxRMSojSCgzQTA4IgorTSJDLENRQjE/KElEKUxRIVYiXzgzJCFaRihEMD9HIFlPJzc0Q0IwKjsnR1g2N1BDNSReKDU3Ui4jIzRYIQorTUlAXjomTzg0OyAzICFaVCE9UEslIF4wMC5QNTskXTA9XSAuTCIvPEInIi1DKEZAOFVASlEnXyw0WCElIgorTSZXLC4rUU85IU9UIDghUDghLVgjPlIoRCIyIDMyIEJFITg4PjwwT0EoIjw5QCFORiAyTDw/MDozKCEgPworTUgwOiYmPyw8UUEwOik5VEZdIE5BKT0wJUkwRD4nNCgkNCFHNSZHSChVQCglJDsoMS5RXVQiVEw2RUBXXgorTSdHNCo2QU8oKSZQN08wMCwgLUQjVSE5WShXSCReUUlOIlpUODNQSFMiLyRHIlAgICZVXC5UQFZTKStEPAorTSBBXiEnNSQ1LTFeTCAjRDJUIUJEIFFMNC0iOScgQChATDFHLSIkVEEoQStXJUNcO1MgSkYmPDA1MjAvWgorTSchLEFVUUNPJTNINTggIU8hJlQ9LlAoXCJFKDxTQFk4JjsoJjAxLk4hWFw/SyFeUCAtTDQkMjo7IStAMQorTSlQLUgkWDRFTkFALCQjQCBdUU1OIUtALTpQWTUgV1AtICBdIilBOEVTUFBaISRAKilBXi0lQFBEKFEqVgorTSZaPDJWICNYJlUgICMxIk8gOCQqQEBMWydTLDlbMjBAJjssRkghIFMlMCAxWEFfSikiVDw4QjgrJTk4LAorTUpQM1cmKEAgQUBDViEpJDdPUClVIj5UIi5QMFIjXiw4MlE/XSNdTD47UUFdJDEoIV4gQFokJlAgIyAmLAorTSgmQDpQUTJTIVtQKEcxPzMnNjhBSjAzWycoQDBUQFAnJyE0PFJROzYhVVAkMzIgRSAkRDE2ICgzJUEkMworTS9SLUcmOCQ4VCAyTyRPPCRPIjI1IVksMiVCIiIhLjBEJkBDWCYoNC1NIUxZKDxcNFZCKSwnJVwiNlIzWAorTScoIDVOUjtOI1YkOzgwKDEoNlQqUCE9RChVICc0ICg9KCY8MCwgRVIjQSwhIzIqOikpKCkyID06IC4kPQorTSYgRS0hWEwhSkBAKyMwRD8rMUEtKD1ENVhQQEUgSEw6UTA8JiVROEI3UFxQIVdUM1RRUiMiIjwxNDE3TQorTSA7NEJPMFROJTogP10gRU0jTVQyS0EzSyc9KCMwMCxcJC1YN00wPjcmUkQtIFI3VyEhXD8tMipSJ0tQLAorTTdQPjUlRSxEQkInJiY5REFQUEg1IypEOiIwXUAlQlQjIiIsISJCMCU/IiQgIzhIQE1BRCcpNDAuJiImRgorTSVYNCIvMC5VKC4gO1pSJk0iSCw5JzInUyc9KCMhICE5Ik4oPCAxSkcpMFg+P1A4MiE5NEA1QFlIJS5AMgorTSxCKjQoUzRDUlE3WCIzTEMoIVRYKFhMNS0xXi8hLSwkRjIjWSkuLEJCMDdWIFgsMjRBXCspN1ggVEFdXQorTSUvLEFOIic0I0xcO1dROVAjViw0MUErMygmLCVaUVsuIyJIOyogRyIlR1ggXTAxMCVZXCgiIFRTJ1M8OworTTQxWEghTSgxNiFZWCMnSClUISMoIyAgQVVAPiknQCAvXCEuJyclNDosQCEhJ10gNU9QUFsjOlA/OCBSKgorTShBJEYhMCNWIzA8P1JQSCQiMCw0IkFYJSVfXCpAQS1DKFQwLz9SIyEmMzgrUyBcJCFWNCsyMTZFKDNAIQorTT1BWCkiITAwOVFHSCVXLDAwMVQjJS84Ll8xVFkkJUAvVlFILSJaODlLIVwmJk5QLCRCLlcjXTAjVyIsRAorTSc1MCk/QE9OJixUL0tBLTUmIUwqNiI7LSEgWCtZQitbI0pIMCZQUUcjVigqPkBbVykyRCRPMCYqIFBcMworTVlBXUskVjgsLlE+IihcWDs9UU9DJThYMz0xMFsoOlgqUTIwTiNDLCs0US9FKSE4QyNQRSYkKTBCO0AgPworTSZMLClFMVc2IEEgN0cwVyEkRFg1KVFIQSQvODIlMD4oIig4I1IgVDAnPjg3UiEyKykzTCgyQiI6JCRUIgorTVdSLyckOzQ9MTFJOSJETDhPQVtDJ05QKiMgJz4nV1wqPVEqSSEpIDUlMTYqIUdcKiRRRzchWlBBRDE1WgorTSVZMD0pUilPIStAM1MxMVIgRiRDIUEnKCEoNCgsUCBMIF5EREwyIF4gLDAlWzAhUSM+NDchQUg8JVgwKgorTTQgV00gSiA2UkIqLCMqVC8yISIyID4gLzkgWVQpI0gxMCBHXiROWDJXITc/KFhUOSRQNj8lIlA0OFBPUAorTSJDTDVBQVU5IjIsK0IhVVMiSkA6WCBBPCA5OCtWITMiIkIgOloxJioiS1BCSVBePCMoKDk9UEY8J088QAorTUEgQyInLFRFL0FXKic9RDM5MF4kJS9ELzAgQCUoQkBBTUAhXCE5PCY6UTNYJ0MoJlcwSFUnLzggWDIvJgorTSdCWCBRMEk4KTNMO0VARC4oUFAhTDAnKidMTEJAIElGIy8oP0ZRSTwlRDw0ISFUNydUQEQlMUhIJ0xAIAorTSciJzcgQFQrNkFVQSI4SDwzMVhaKE1YICEgO1AkJyQgOlIrKyVMNEA4UFswJl4wQVxBOUEhW1BAQzFDJworTSRHRDMmUUc1IVUwO1QgTEkkNSQxNzEyOycgLCAsIjFJJ0owO1RQTEMnIERCNlI4MCk6PClMMEghJDJYQgorTVpBPVUjQSxFMFErUyYuUDhaITVGKFY4KFRBXj0kKSguJkFDQyEmIEM2MCZQKDgwRj0gJlskPzgzOzAtLQorTSVUODNRMVwsKTJAQ04yIyInIlAgP0A6KCEpQERBMShOJD9IIytBUDchXUAxOlE5USc2OCJBQT1PKU5MQQorTTlCOF8nRkghJTFHJic7ICNBMFQ4J1hILDUwWS0mNDgjQjBZKSQkVDJRIUg7KUgkMSAwMUMoJjQiRzFLPworTSBFKCE4MDY0IzNMNihRXjUhKTwwRFAmKSYlWCFQMTxLI1QsJUQgUkQgLFQrU1FAOyArUD4qUi4nITRcJworTThAO18oLCghTyAiQiI8VC5LMFQ6Ikw0IFlRSCgmUSQ5JkItISBaRCRFUVonJSEoNSkiLTooTURGSVAuVQorTSJHSCNDMjY2JSlcJyExUUokLCwuTSBXVykkKDkxME5EIypUMlxBSl8jRkg0SzE1RygqSCEiIiw3IksoJQorTVdRSj4hQTQqR1IwRSUnLERBUC9VKDs8PUJBUj4iQDQ0V1BVOCNSMCpPMTUoKUMgLVcgREknWVw1TTE9SgorTSBeRCBSMT4sJFI8NEYxLCsjM0xGP0E9ICgiXCIlISw8JDtQRi5QNS0iVzw9PSFRNiAyPCtTISBRKT1ULAorTVIhJScmOCA+RCIuNCgrXDlYMFE0JTMwP0ZQPSsmQUg7PkFWIiBXLDBMUCtbI19UIk0hV0EkOkwqJlIjWworTSIhJDRKMjJJJiM4PEMhNCwkISQuSEBCRiQyVDEsQUEiJC9IIFFQL10pSkw0X1E9RihULDtMMFQqJSk4JgorTSAyNjYhViAlVUI0JSdVMC07QSgmJTA4RyAiIDgkNVgtWSBVUiE0SCxCQTpfJUpAOkNAVEYiWUAmT0FNSQorTSU/MDYtMVk5IVU4PTMhS1ojU1Q5I0E1RyJMICJRUC9MKEAwMFxCOV4oQ0AkIVBRLiBOPCNRUCpMJ1JYNQorTStBPyknR0QjXjBRViFKMDcnUTVLJjw8PlxARyIjK1gzIzBASCE1WC9NQV83IUokKUYhTTUnU1Q8JjEoVgorTSZZUDkvUFYuKD0wLD9RVCslNFQkLSAmQyJDTCU/QUYlKUs8NzsiOjUkVyg9XiA0OCBTODJSUVRSKTc8JQorTURCLkUpTiwlXTE7KiVESDc3QFZeJTJcODsgMEgiTiwiNzAvXSQ3ICZKMStGKThYIS9QRDMoLFAtVlAgVQorTSVaREY8USBOKTNcPz0wQk8lTzxAX0IgTCRaUD9SMi1RIjkgQSxBQyYmLEREI1EoPylPWCRQMTtCIVYwQworTVBSLDUhMyw1RUIjTScrNENDIipVI01AQz5BPDIoQDxBLFE0NiIxVClQUDUuJTEwMVFBO04oMjA1TyIxLgorTSlEIDpAQDxMJkJYJkNSNyIgKDw8X0E3WiYpPD5FIU5IIzEkIE4wWVclXCgpT1IqTCUkIC5bQVVMKDcwKgorTT8wOTglOExGK1AkVCkqPEInMFAlJycwPEFAIEMpNlQzL1FURiROVC0gUThdJEZIQTJAQjAgXDA/ODBBQQorTSBNUDZIIi1KIFVAKiowKSEoNFw1RUE9LygsPCtdISNYIFU0LFtRTCYoKyg2R1FJQykiSCdLIFw2JylYKgorTVBQOEghSEwgPVAmIiJATD9fMFRKIEtULFQwKyYoSzQ3XlI7SShNSD9bQiJXJV9IRj1RK1YlSSRBOVFbWgorTScuRC1AMFEnIT4wNj4wWU4lVkQ0OyE1SCI9LDo6UiIvKFggMzxRXFMlSCArV1E6JiVOUCdDIFVLKCUoJgorTUBSIVEpPFg2OzExKSkmSEZWQEYhIFogLV9CI1UlIyQ9ODI6JClAVCMyICA6JywwKi8hUy0hJUg9TDFOKAorTSUqREFKIEwgKT48LiJQQCwkXVgqPDBXKiE0XCcxMSFcI0cwI0BQNSglOlwjXyE5XygyLCNYIiBaKSwsLAorTTshR0ogVUA4O0FAUiNUVEQ0Ii0rIjJQQ1VBWyAjMlhCQzBdJCMoSEAjQFxdISNMKUJBR0InNyglW1A/MgorTSUvXCROUSdVISAsQlQwTjolLDAnXVBbVCkzSEFYIDQqJiYsQFNBV1YgREBBOkI4ViRFJCkkQFxTJTwoKQorTUIwWEQiWyw9JzFVJSc2MENaMDxQKDcoO0tSKlAhSVBES0BBKCYqOCRIQFs4JDsgKkcwWiMkJVAjNCBcRQorTSBcVEFcICJLI0FIJyVBIiInXkAxJUAqICFHMENPMD5fJ0YgNjchXjUnPUgyPyElICYnSDQyIUU5JCM8NgorTTYwO1IiSTA4SUInWihMICc4IV9LI1ZYMkUhIyQhXTQxQVFMPCJdLEFaISJYJ15EPFoiJkcgVSAyM0EkMgorTSExTCZcIVJIJiQgNlkhREQgSzwpQyBJPyIxODAsITlNI1UgNlwxLVMnRUA1P1FQQyIuTD47ID9VKFpMKworTTkiKDQkSShAPSBFOyZFLCFZMV4pJ0s0JElQLzUhXFgwTTBEIiU4NCsrMCpEJFpcMUhRS1QiIjQ8W1BOJAorTSRMSDwyUV5LJV5QLzxQVl0hICwlTlFeRiQhRC5KQjRGIlhQK1RQLlAoS0RAUSBDPShEVEJbMCdXIUMwPQorTSciOCMmWDRDP0IqXyAlSCwyITchITg8L0ciKkIkQiAtUzBYUiREWEMgMTM+KCQsQUciLVkpKUA+XVE/RQorTSc1NEJRUFJYJlYgLCZQVlQjLERFWzIyPSE1WEJcIFhXKDNEL1JAICwgQShELjErISBPRDMsMUcuJkUsNQorTVkxOCUgTFw7MiAxSiEjOEI3ISRbJyIwQVchMUkhQ1BCOCFeMyU/MCNDQV02KEMkNSlAUTspRDQpTyBAXQorTSkuIEYiMFkrIlhAI0QxIykjUFw6WlFLMyUxIEYnMjIxJC1ANSlQVy0lVkgiIDBSOCM5WCE2QSBWIkwgNworTSFQUk8iLiw0JDE0UCZMOEZPQENBJzBIOV9QQz0pP0AvMlI4WSg5UC5VUT5RI144KEcgQUEkRyQ6NVIlNQorTSQ5QDFIIiVDKCA8QS5AUVAiUFRBQEE9Kyk5VCxdUDYjIFEgQ1IgXTUiJDRAJiFfPCUmWCNfMiQ0KU9MIAorTVFRP1QkPFAtLyElPyE9XENcUF5cJEFEMU4yOVYmXCAjUUI4WiI2KDhCIiMpIztILjZRLyogIlQ1OyFfWQorTSYuQDghUFpdJ1o0QEpRUTkiJzAtVyAyXyRDTCIrUCdfJURMNkZRViAmO1RCWVBCIyEkICheMD9RISZUIgorTS9CKyAjLCQqPjBVQCIiSD8pISY5ITRUO1EiJT8pMVAtXyAxPCUxQCBbIVU4JCg0QlVAMk4gQiA7KVA5NQorTSMtSEBVQT9XITdAIDNCLiYhMERGPjEiPiM+NCJOICdDJTFAKTdQSi8gOUQlW0AwMygzRCc1MT5MIzlMRAorTSBQLjIkNCAoQjFESCcuNCdYUSw5KFs8OkxAT1coKjAuWzFNWyFbMEA+IDc2JEo4RTAyKiUlQFQoUiIuMQorTSIwLEFFMiYsISo4Pl5CIF0oRzg6UTAhJSZUIDw7Iio6ISw0RiYxLzwkNjQmVEBIJCUrSCYrIjVBITlEOQorTSoiMiYhMiAgSFBITyZbMEM+USgwKCBMQlVRWSUjNyA6SVFARiFeXD0/ITZLJEFQM05BOV4nTywyK1AvUgorTSlQLCMhIVQmJy40QjswRT4oI0wpTiBISyAnOCUjQCNDKSogRldQXDwhIyw0T1FbRyQ2VEAoICQyIlU8RAorTS1AVD8iS0guNVBHJyc6PDovQSQlKFIsMyIwQ10hXUQ+NFEmQSRURC9GIDMhI0FYO1NBOEUlMCgkXDA1QworTSZbWD5dMDRHIU5ALEhCKFUiMVwsKjA6WiZPICIsUVRFJC1EQ0NAMT0oWVhFUEFIXyE1RDFXMFcuIyEoLQorTUpBWjoiV1xBJEIzIyY2NEQoUEhMIFdQIVRBKFImOUQvOzAlWSJCSCEnICFDIkcsRFkwQi8lOSA1K1BQXgorTSZdTEFTMSwiIDFQNzhCMUEjPjQlIUA5IiElUCopITIhJkhcQVVQOC0nIyg/OzEzWCg6UCA1MiFRJ10gOQorTV8xLFEgUVA2KSAnNyhJND1WITRUIzBUMixBWEAlSkQtMzBZUyAsXDpJMFAxI1c8NycwNEonIlghTUFXIQorTSFATDEpUCJXJFY0NC0iK0UkSSAhV1I4JSBbOD5AQThRIz9UMDBAXzEjPzAvKyAyWyc8TDdUUSRaJzkwPgorTU8gI0UjN1AmQ1FFVCBQWEM6IS9JI11ANE8gJkggVFxAX1AyXiQ9LCJeUU9eKDNIJz4hKlwiTTwvIVAgQworTSU1XCglMFclIy9EMjkyIVAiXDwuLDAwIykwLC9cMCAvKSssPTFRMk0hNkQiUFEmXyQ7NCAjUENKJVwgOQorTS4hWkMoREAoLiE7UiNFKC8hQUBCJzVUQy0wNCIlI0QuREEvLCJAKCRaQCQqJEIgRDogQkkhIzhAOlBRKworTSU0MChUQT8+JT4sMl0hIkwoK0glNCFZNiNPSCskME42ID8oJyVBMywoNTwvQCEqTiVZODRZITQiKC08OworTTcgXT4lT1g5OzElXCI9OCNLQCYjJ0xAIS1AQjIgUTRFLSBeOiY2KDIxIEIyJlc0JU9RWC4oX1gzPzAsRworTSlOOCtCUDYgKT4kREYwXysgSyhAXjBTOCgvNCU4IS1YITBMQjoiJikpRCBBRVFcUSJULEE5UjYgKDowPworTVQxXj0lLzA9RzFKSSBXUENSMVJZJSosOyxBKj8kQ0RBTzIkXygpXEVCUFMsKFdEMFkwUFgnJCBDLUI5RAorTSZaTChGIFUuJFcgLi9BKiAkXlAkW1FbTyE1QCA0UVNFJ1UsIjxAMj0oNkhGIkIzISVIOEYvIUsqJlBUOQorTVgyOFclTlA5XlBeLyg4OClYIi5dICtIPyogJEckI1gwI0BbJyEoLCdPUSAhIkY8LjQxLlkoJzgpLjE6MgorTShSNCVMQEYlI1VIJUxQUlooTSw2PDIsUyEjQEIzQE0wJFBULVBBUygnV0xESlEsJyM1RENHQUAlJTxIKworTStQJSUkNlQ+NUBYQyZMSDpQMC9ZKVA0PSZAOUMlRlQ3R0FfOSFKRDxKMDRfJDlQKz8gQiEoJiwuNSBeNAorTScjWEYjMjBcIT0wQzkhOychV0wwWFBTXyUiMD1UQThDICVUJjNRT0ogOCAlPlFUOiBIQCFDMFRUKCNAJQorTVQiIlsiKzRDXFAnQShcJEAsMCshKTNUPTQwTycoVlggPzEnWyguRDQiUipPIlE8MCshP1AlQ0AmJFBKLAorTSVfQEVaIiBeJEQ4I1UwJCgpK0Q8NVBXMidbMCklICQ4JlZQMCNRMlIpJiwsNFBeTCgxUCo7IE4vIEFcPworTTgwNU0jQEA2XjBeIiFTNCQwUDAoJTgkREQhTjQgSUw5OEI8IiVYUDdKUEZZJi5AOjxSJickJ0QvQkFGKQorTSI8UEQjIjlGIlc0KUZSI0shSkhDKFE3XiRORDQ3UUNYJiw4NkJBLiYpITw4NyItJCVIWDdYQFFYJT80KgorTT1AQyojUkQqIVIuRCk2NCZDIEQoITVAOy0gUkIkJixGIyEvJykmJEA6UClDJEMkOSEgNF8nTFxCPUIgJQorTSVHKD4/ITU3IV8kLCdBPk8iLkA5WzAwOyI6SDJNIENPJ1AkRjVAVksnKFQmOTFQOSZPUDUyUFJZIlc8LgorTUYwUiYoNURGQDBNSyBJTCRQQFEmKSdANzIiLEMnNjwoIDFVQighXDZZQDMmKTFAKEEgXDooMCA6IEIzRworTSBTLEVDMTcmKSY0JyJAUFsiXThCLlBfSCNeUD1LQic7I1YkJj8hLk4gK0w1ViAtKCgvXEZbUSg7KSE0PQorTUtCOVgiRVQrWjBaRiVELCFdMFg0IjlAQVNCM1MjSjgqSzFQViVPTDROQTBXKEE8KUBBKFooTFg+LSBGUworTSEmQEBYIiE0JFNANDtAKzwgMEAyI0EqKCQ/XCZZMVBSJilUNEkhOzcpJFhGOFFPUCUlUD8qUVZfIDVIRAorTVVSMk4mS1gxXCBeMyhTKDdWMU1JIjA0JkEiKDwnTyAzLFAiXSQmMCooIUU9Ji9UPStCI1cgPzA8KiEvQgorTSdIRC00QDA/Iy1UQCNRTTgjVEAiPFAnMSVRJDkyQEhEIj5YIyJAJEwlTzwhSCElQCAtJDgkQV1fI0pMPAorTSYhOi8jOywpViI5TidPPCE1UVRLJ1VALyIgPTslIzg2LCIrIydCPDIiUTVbJklIOjEhTzMmKSgmUyIlSgorTSUlPCZSMCtVKEFQJilAOzEhLjAgOlEvIyBPPDkzUEcrKTg8OD5RSUspMFQnJkA6NCgqQDhHIScpJ0hYKgorTSkwPF4hWzwwQ0FSMigiIDosMiAnJEc8PihQTEcmQDAmUlBVLiY4PCAqUDM6IDJAPjIwPzklKkwjLTAgMgorTSE0MDosITFKIDs0LEUwPkokOyAnMEAkPCZcKCIsIEQ8IDogOUhBREMiR0wzT1A3LSM7SEVGUDJfJiNUJQorTVExRjskRFwsTkBaQylFSEYoQD8iJyVMICcgRl0pSFhDNyA6WCg8NCciITMvJzU8IkRASF0mVUg/XTIqQgorTSEkIDVDUCMxIUxQPjwwTyYhKTw0NFBeVyY5SChXQTEvIFVIJDNQMjcpQkQjMDBNRSZVXCo0UEsvKCIoLworTVoxQSolW0gkTVFMRSNbJDlbITg3J1ogQzdQR0goXihCQlA1MyUmMCxaUEYoJVdERUUhPkIhJUwyMSBbLworTSBdJEZNMVMjKE1cODwgIF4gQlw0VDFBRSVDUDVDUEVOJSxQQTNBQE4pL0gvJ1FEPiU8KEExQFAkJDswQQorTTkgMikjVFBFKVAlRCE9LCc1MTBfJVs0MydCMl0jR0w5IFIqNyVcVDklQjdIKD88LUlATTkhXDAuI1AuUQorTSBHTDI0UFFPIl0gRU9ALSMmUFQrUFBdJCFeJDRHUiBAJCAgRiJALiUhMkAoPUAzTylCVCY1QTdKJVIwMworTStRV08lPkgiIyFIIiU0JCBMUCtNJCZML0kxOEMpJ0QgKDIhWSAwOCktUjY3KDVQPlUyJzcmWDxCNEEnJgorTSNFWC09UDYgJykoQDcwUV8hUkw2OjFWJCcnWEFfUV8gKFYkQFRRIDsmQlA6N1A3KykuRCFWMSI0KExMOAorTVVRNlohWzgrWkIjXihNNCBeUUc2J01UJFZSNkMjJlRBSVEyICUhMERBQTA2ICRQOVoxXTYkR0gnP0FHLworTSdRMD4gMV4tISVQISNRNycjUjghXSBGSCZVRDZaQVExIVA0RixRPyMmUUg4OSE+OSVFVDFcIjkwIDVIPQorTTZCJickLjQxITBDXyc4JCgiMVshIE1MLixBLScmPTAjWDAlNSNePENYMjo8JERYJ0EgJ0ciJEgtV1FfPQorTSQqNDZLIixPI1lcO0RATVEjTjQ4PkIwQCNJMD4qIE1UJE5YQywxNikgOCg2WkFIVSEqLCtfMTxbIF8kJgorTUIxMDkgXiAoQCAjWCE/ICc4UCRdJCRMIl0yJDYgSFA7SlIiMiY1VDBUUiIzITxUQDRCNC4lMUg/IFAiRQorTSZcREVLQE1PJiE0NzBSNjQoXiwxJTFKVyE+KDk2IiBFJFAkOjcxNEsgX1A7NyIsLCMqWDxbIC5HIlFIJworTTAiMzkiISw4U0IxMCA+UEQ+IV1EJzIgMzpAVEomRUBEMlA0WyJcXEUsIUw6ID5MPSciIkcpKDQ6XSIuRQorTSQoSDBFMSw2KCc8KCQyL0UoT0AhK1E9JicmSDdSIEQpJDpcPj5QQV0jK0xARCFaMiJGVCE7UDBAJCpYNgorTSciNzskUiQvJzFcSCAiRCQ1UEs9JlskMiAyJywgKjA/IiItJyFBLDU8UFghIls8LyMiI0QnRVAjUjFeWAorTSReWDEtQDFQITlUK1AgQUUgRTw7SEI6RCU8TEYjUTsrKEtMM0NBNyIiLCwhQCFHMSEmVDw7UisoIlJcKworTV5APz4oQlAxOzBJOiFUSCEoIU02JThQLy4wMi4pRDRBNFIgWidJPC48IC1GJlZcIUExViYhXFxAMEA/XgorTSc1RCpeUiBOISk0NCIgIVokRCw8MTFfViktSCxKIiA8JzdIQElCOCIpPyhCM0BOUCgoMEMsMjdeJlYgRworTSMxOD0hXyQkSiArWSNbND5MMiwkJilQLCFBKDcjUlRCPzE0RCg1NDMzUjslID88MilAJEgoOjwnJUBMSAorTSczLDdVQitVIDooRTEgRlAiJSQ8XUI6SyQzXCk9IEUmKD9EQSAiIyUmXCwkWTAzPCVTPD4xUTwvIV40JQorTVBBVzInKDQiU0BRUShCNCpQMEg9Jlw8OipQSSIiMTguKyI1LylMLCgtISM5JzUwRlQwLTkhKUwnL1ApVQorTSFRQDNFUSdXIkhcKS8hMD0iNyA9SSIjXilIQEYkUC00IVo4OF1CL1sgRjQvRiBLUCAkXDpVQTpXJ0hUQgorTScyOlkkQlwtOUE5XSBdSEFLMVNOKDs0PVoyLzgpOiAmTzA1OyIwVD9SIE9JJlFEMjMiOCUhSlg2STEwWgorTSMsNCBPMEBPIzA8Mz0xNDQkMiQyVDA2XSIvJC9eUEomJ0ZYP14gWTMkVlw6WUIwUCBMWEFWMCYkIExAKAorTVRQPTIiXTw2IyI2XCg+TEEqIS80KTpMRScwPUAkXUQmPFEnXCQxOD9MIEVOJj0wRlIxQUElPVAkOiBAVworTSQhKDslQFgyIVFcKEdRNjoiWjAqOEE4ISZBKD44IS9NKDUoJ0NRWSAhOSBAJyFfICRULCUyUVpFJiFIRgorTUJRRlgmUTw6QlEwSyc9VD5OUSNZIDVAJCBASFciRCQ/VTEuWiZJTDxAUiw7Jy1IQToxVV0iVjgyQyAuVgorTSguKCk1MVVCIi00IF9SK04nRTw3PlAsVChPNDVDMCdKJS9UIyMyOk0mIiQtO1EpPyFOJDQgMVVOJylcMgorTScxKlMkLUQsJjBSIiFESCpTIFpGJDJIQCMwPishIzQ0J1AyOyQ8NDRHUiUqJEY8LFxRKEIlVFA7JyFNJworTSZQMDNTIjI3ISgwRVlBRzAgSVggUFAzPyA0QDwlIF5CJUxINE5QKkwoUCgqUkFaViRYXEVVUjsrJ1IwOAorTVAxIiElPywzOSIlNSYmQDwkMSM4JidENlxBQyQkWUg5XyIkKiVPICMgQChKITE4L1ZCIFgkMDgyKyE+KAorTSBXSDMiUEoxJT0gPTxALzAlPCwhOiA8PCM1MDdFQUJLKSYsOUgxIUUkRShEU0I4OCNJNDwhIjU0Il4oMgorTSlRMzomNkQ0IDBCSyY/IEA0MDBWKEdMKCpQKU8mTDQ3WTI1JigzQDcsMEA2KEw4L1ZSJTsoOyA/SzEnTgorTSFFUDg/IjNVJl9URSRQXyEkJ1BAWkAmLCJHPCcuUiZUI1QkJDRBLiIiLjQ6PDElNCM7KDQ4Qio7JzAwOworTVVBIUEmO1AlXEFIIiInPDFNMEkoKCIoIVUhMFcoLURDMCI1PCFUPDFGIi8+Iik0QVQyJTEhQEgwSiIsVgorTSZKQCA6QTNNKCE0QyBQVCwgR1gmPiI7QCQ7VCQoQilBKUFcKEtATUghTDw2XkAlISFEKCpBUihcIjRcRAorTUMxRDAmPDgrMUEiISNQIClKMEE8Il84PyhBXikpLjQoMCIrNSJCMCBKUTczIEBQQCdBP1sjUzxGKVBGJgorTSI3OCdVMTYhJFUsMjtBMk4iPjw/KyAuVyhRQCU/UDZAIz04KDVAU1UkSiggQCIkIiFZTCVNIFVAJUAkKgorTSVAKikgQDxAI1E/SSVfTEZJQjtcIUpYRioxMUkgMVA+JVBJICgmTEJaUFgsJkAgKz4hKkIgKSwqTFA+NAorTShKLDI1QjROIFYsK18yMlspKDApTkAyMSgzUCM1MV1SICgsLlYwTzQmNkg1MiBDNChMWDcnUCo+IStAJAorTVBAI0QlXUgpXUI2SiYmVCUkQUxBKUZcPVkwXi0oVDAxXTEpIyRRWEQrIUhMKFQkNy4hJl0lIygvLCA/SgorTSFGXEBZISFXIkVMJTZBOk0nPzBFSjIhRCRHJDQ7UiIgICAsQF8gQFYhQlQrXTAwKiU1SCNDQjdVKUdQOgorTTtQJF0iUEgzL0I2QyE3OERSIDFTJkNEJDIiMiEmRSQiKSFPNCQzLClBUilGKSk0M0cyNFgpOFQ4KTEoOQorTSk4SCouMjlEIydMLFpCMDQhRygkM1E5JSIlLCs/MTYlJTswJy8wMz8iWjw0IjIqJSJDXEY/MV5XJUkoRgorTSBRL1ImS0g/LlAkTSZKMCgvQVMtKDVMLiNRSyAlS1Q0UEBPXSlBRDQpUiY4J0MkNywgLjwjJUAzOzBcKQorTSRYWC1LQjUvJS1UJjAwMSQgOyQmKSE8WiVZOC1WMTMqIjZMRkgxVzkoTDA4LCI6IiEhLDJSUFNMJ0YsKQorTVwxXDsmOVggMkIsOyVFSDNIQE0hJEZcM1ciMFolNyQlLEA6NikvMDE1MiNeIiFMMk4hQSspPTQiOSE5UworTSQ4SC82UTkpIz9cMklRNSkhSVw5KlIiOCgzVENeMUVHIlk0OytQSkYhRVAhKiBGLyE5WCc+QTQqKCpIMAorTS0hLVMpK0BAV0IxNCgqKD06Ujs+JSA0QkQwTVshUzw/JkAxRCBVLCs/UjowJUE8IycxJygnRiQ+KlIkPAorTSUuKCNUMFhcKFogPFEhK0MoPVRDUTI3KCdISEFTQi1MJzNIJjpBRlInU1gnOkIzPiBfPEA+UU88IU4wQAorTSJBN1YhOzBCMCBWISAmXEI2MUtYKDwkJE8hSEMlPDwqWSFaJyBIOCtWQFE/IUA0LidAIkImVlwsRDImQgorTSRDVCE2QjgzJCIgPFxQIFUhUzApRUE2KCQxRDVLMi9NIlpQNkohUF4mJ1hGR1ElNyEjJCpEMjdAJEI4OworTVBSMEIkTDhFP0FGUSExWEQ+UiNCKDQ8NycwRFYhJDRHITFdJCMyUDdeISNBJEMkNzwhOF0iOVgvJCBfWQorTSI9SDggIiErIzMgRlBSMVAlPFgqTSIjTSJePCFfUjEkJiY4Ni1BTz8kVyAkRVEgOChcNEEzMU9WJCE8QAorTUowPDIkPTgiRkFBQSNTQDI/MFlQKThINF0yOVwoQ1wlJTE7Tyg1TCJKQS4iISNYPkEwLTMlVUwqNiBRIgorTSlQTDFbUCQnJScwQiwxUyQjWVwhUzBIOSZcMCEsQTBAIks0JlZBJl8pJEAmQiBAKiYkVDJMMDslIFhUNworTVEhUEgnPCQiSDBPVCg9NDEwMEJZKCk4RThRRFwmTkQqREBdOSUiXCNRUUxWKUtQOUpRQSYmICRDXCAvUgorTSIpOEM9UEwlJlhEOl4yIEsmM1QzNjInKSBYRCFFUjdPIjEsKjpAQEshICQ1I1AzOSZFJEQoIjEyKDAoRAorTTlQNlYoW1gmMVEhKiY4VD45MDZbKC4wNSAgIyImP0w8XVAoISM/SCsyMUpTJEpAL10wKDonXUwsPkIzWworTSIjREEuMVMpJEtEMD4yN1YoS0wuKkA7SyhBJCA9ITZEJylYLzNBS04nVFAwNSFPQiUnMDRNUEhKIz5QQworTStROD4kR0Q7LjEmLSRUJCVXQTtBKD5cIDgwXSgkOjxAJiE1WiQnOD8/UDsyKDkgRVlCLFkhP0wkUVEiNworTSBTMDA+QDJCI0AsRl0wOyYhMSRANFA/SClMIDdNUTw0JCxIIz9QXF4iQ0wnXVIlTyI5WCEzIV8hIkhAOworTV0hLjElRVgxI0IpLCJFWCpIUSwnIC8wI11SPCMhTzQwKiAgISAgICAgICAhICU4IF9QJ1wgVFgkXSA7TgorTSIzVCtYIFs3JEIoNVBBRlYnP1hCRlAgICAgICAhICAhICBIIDkgL0ggICAgICAgISAgKCAgUCAkICAgIAorTSAgICAgICAgICAgICAhICAgMCAiICAwICIgIDAgIiAgMCAiICAwICIgIDAgIiAgMCAiICAmLyAgIDBLMAorTSAgLCAgICAgICAkICBAICMgIDAgITAgJiAgPCAiICApICBIICJQICwgIFQgI0AgMCAhKCAgICE6ICAkRworTSQuJCAhPzQwIC0yRSAuQU9QODtSICItQyQlWE06XDwgITokIFMuVDtTTS8iJCAgIjgzWEVTRVhAM15eIQorTUE6USE2UlVNIS5aPyQrLSshUTVbUjk/LiAsIUEgK0dVT1pNPEkvJyM4UkQgJzEgICAxVEQkLi1fV1UqNgorTTxXT1EgIDFfMDskS0VHIjVVQFkjQzA2Tyo9TDBMUUoyIiBZNCwgVjU/NDw0JktIQSAkRC08XTMnQi9XXworTTpCMjQjUFFYISEwMCApIzlFJjUiKy09QjEwJjooQjg3M1I8IEdRXCFPVktNOSZYWEVeVzpJX0dUWjNdLworTSBQIDglUSBBNlJdVUNbRkpIMyo+WylVMyRYQydNOFggIF4kIF1DMy85QyctMU9ZNVo7UikuREtKJzBeXgorTUQuMDAgJyY1ST8lVz0yRVlaJjZUSlA9RCU7NDFGPFJHJUFPLlAyPUQ4Wig4Uk5eRD5SNy1UPl1QOl1cXgorTSdZV0ogVV0zJC0nLFtCKUFUX0goPj4jJlZCOUdWV0ZLOThYOlFQQCBAWiQgLzZQUChWOiZZVldEKUs4WAorTS08PEw7I0stXDw+XitBTi4gITAwICYtMTgoXzlOIiVUK1sgLjQsRF4wTzNORVc5SCI8MVdZMSVUICAuLgorTUA+JDdMQ09EPi0gOickOCgjV0dVXSo9QllYSTE4TFc1Qlc/OUNRIkgrRCwoSksoOj8oWEFTRCNTQkxYKworTUEsMCspV1NLRSwuTSkxKSk4MCI6TSgoSVRVSkVSXlQ6TjpdPiYrKzkxWyJXTElVQyUjXiwgVVdbIExIMAorTSAiOC0+Mk9fPyZHT1guUUgnOjc1Mk5NRjJKMDAhUz9UXSNBJixAVCBdUCFNN0QkRT9OWF0rTkwyWkBcQgorTVgjLjRfOzguUClPTT4nUTk0XCBEOUtAM0g/NCAkLEwwRiQkVEIuICpWXEBDIExJX18wNjlGXClXLy4tWAorTVMoW1lXMj1LTzhZRkI7OCAgQiQgQkBQN05YWkQ1Sl4/SjA5J0xDOT0yVV9AQC1SSiJPI15WNCJIQ0gjMAorTTpRSUMoUSAgPjxELVAuRz8qOy8mUkRXLDdFNTxYMlBcSCYkWjI9TzI+LDUsIU06WE5UPjdBUFxAL0AkTgorTUU5RCkgXVxYXzBcNVkiXEM9LzdMVFxfPCIsMCRMLUpcUzdcOUlDLEYgXkQ/IERYJyQqNyZdSk0uMjFNRworTSswKU4vMDgxNiJHSz1BQzFfPS1BQiIrLFc1XFtFLlosNCtQSjxAITpYMCInPFkjWyozLVM4QikuLTpYKAorTVhMKV1PTS4nXzA3WV1TTS9INTBfOVA9JVVdMEYkNyciJkAgLSQgID5BNiU7O0RcSjoxQVtYQVAkNCMwSworTStdVEdbRi0wPDlGRlI+RDZDREhOKiE8KDtGXDoyMUVOICAoTVA/PThfLEpWOSRMSDo3UjdALSE4TCw3KAorTSs2TDc9Wzw8WTAzMzNDJDAtSl4rVFcvNDo1U0I0QCUjJC4xW04lVyhUTjk0QVM8KCYoMj4rUUlYUjUjWworTTssPyNFJzo4NkxRKTNCQElVT0VFVFVSKTUzUCxAWiQgI05PM0s6PSEzXjNXRTNYQTcxU1tXIypfN1FYSQorTVJdNzlLVT8yVigyWlMrXURMKitdTVFGJVdMSFEgPkAwIC0xIUYhOVs3LS8lLiggLlVRXFszXzVLN0hOPgorTUYjLVJcJTwxLCQnIVMvRFAuQ1cqKzVFTjJdIE4/OTU6ICRITUA/TyNULzEyKEJBME1QX1JcVTwzJSEvPAorTTBFVV1VQ0Q5Rj9BOS4hUCBEQTM2QUstV043SkVfRiQyTVYlSiAgTV8kJ0BBODpJUCBMJihQITkwJ0dNIgorTSxXRzUsIDFLKC0wKTAhQVhaWjUvS149VkxVVl8nPV40T1w4UzAjXVtPKFQgIDYkIEcnLDJdJVQnWDk9WAorTVlbJE9TRUZZN0pLOk0jPTlbJUQiVC5HQSJcP0Q/OEIkKDdATkhGRSg/MSUjTygpLT9ULzUkICE6XzcsPworTVklMEhIPic8M0YqL0YwPTxfXkZeQDpYX1pdQjspLVYwNyk6TyAlUFdGMERXWUpOODUjXjhQRFZTTyIsKgorTTYzVSFeLShCVCMvR0lfL1ZFRTIlQ1pFXktbODxGQCcgJUUoXFgqUyUrT1hAL1IvXUhJXllaQD9XJ0I7WgorTS1XXEMiVSUlIDkyWyQpMVggTz1UUChQOzcwIlBcLDlVSj1OWSUuKzk8TV1FI1RNLD1SQ0AlRldWRDwpMQorTTBcRy8pWTZLNT07QllCPjxKKyZGICNUQSAqUCtZUT4sPF8iIFk2Ik0sJTUvJi9CVypVQy0yOFZLPVVASworTUU/VU1DR04xTk49PzszKTYyUU5ONk85JD0jRiVHR1EnOj5MICIxICA8S0QsTCZdU0c2WDpMRDggPiVVRAorTUEgLV9YXCxBNy4uSSo9R1gxKSciWCw/UjJKWTQzPl82N0o8NVZNSDgoV1Y8Sj0tXklGXlkgICU9IDpSIQorTT9BXklYPiRFOSEqWz9HOj1IJDtRTiNSIF9KPy8zLjpCVCAlU0s4U0xVQ0FCQjwvJFEwN10nT0I0SDZbNQorTTZEWSkvPixYJy88MD80IlUwT0EuU1NMQT5PREU8Nk8gPjNPVDsuKURKWl47LVwlKjA7Ni1VJjghICJBIAorTSlURFErWCdQLl1fXlNCMSEpIVlfKExcUSIoX0EgK0ZSPTNSIkIhOjNTM1xaOlhGVEFdWChHRDUmOiRWRgorTSMvVztEWSc/KS5QMywmQSQpWUZUMD5aVkA8SyM2ICkxXD1FSCk6KV09RyYtIDRYMCAtTVVFITdSOF4oOgorTTwmJDMgMSBKOS4uUEZfXlAyRiUkSkUwJj1MUiRRLEBcIEg0WlRRJkY+JTA5J1dUKVsxI0M/N0wgKjRTNworTSdKO1QiIywgLFhTIUU8UTFSI1I8W1khSC02TiZZOj5WJS43UkUhLFteMzM6QzkoWjgrUCJCPVcyREZVOQorTTRfJT0zIy1FNSExRl8tKlYuWDAqKztQMzg6Ryk8ICAnLFEiJi5KTTtGQ0tSL1tLPSxEOztWKSEqNi5BKQorTTFMNEhDLDg/LCVOOiVQQUVAJ1BJQSskJk9XNi9JWFE1JV4iNF0xO1Q5SDtESVtXVjBLN0YsIlAgIDokIAorTTA2SkcqWS8lVSdBXVFOS0NLMk1MKl9SJDJfIVVLQTFVNidMVDhLOVpWWCwxIyU0IkYyXEJdXVpQWyAiQgorTS5cVkRdPDUvQkVNRUJbQi1cXSohK0ZEMCAlNFEiOk04VEo4LClMTTY4OC4nOkFTVFA3NidaJzhMMSQ/LworTTA6ICVHTEQoIUNaQE5MQ0hZXF8gNT4nWjErK08gN1pQKSIgRTxdJVJeOCdETiA2TiFRNyxAOzJPQylFIgorTTM3LCYsT082R09HMVBUIC5SKS0vMFtALEw4M1U9Pi8pNl8yLDhJL18hQjI3JlpdMl44TjsoOE8/PiM1NAorTVg7LVpVRVwlPjkrX1FKNE0gMTFPJCEsRC0iK1UxIjFdP0NWI0lZMy8mQVoiMlQgUTY/Syw5OjBfIVdGJAorTUs7TVlMWCNJOkclOTo4NEJSNi05Nk9VJEdELTk6JS1JVCw4Llk5XFhbJTM3LUcwICpGJCBPUylTIltAVAorTT4jUFQ4O1pTWkA5KkUpNkxDPyZfOlM8Kl8iI19HWjtTLkxbNEZdQCNSIldMRl1OSVI9WSleJkciU1BAVAorTT1FU0tEUDZRKio3KSVRXEAsRyNPICA4MCApX01eTVIgUzwvOydWQFgrSj1ZNi82Oig6U0Y2NUAzVTpJRgorTTY2QjssMkE5W1pENUgnWyZBM049SkklREFEVFU6M0JDOC8+Q0wwJV0wLlw2RiQwXEkqPVxWP047JyQlKgorTSlWWDdLRT9MOEhGSltSK1tXOzpCW14wN1g7V1IsVjooQCM+VCsjWl9OLVoxJjpRRCItM1Q6RFhVX1ZILgorTTlVOlklJCM7LlxJWCpJTUg6UyslVj82Tzo7UEY5KkwwRVtdTVAjPFxTS0pETDM0QUM0VF5DTTg+WjpLIAorTVEtVTsjXT9cJSNZPyJEID00PyJWPyZKKkBaPT4yMkMrJzleLkswMiZbOFIlXDteQFU2QzY/LkxCKCY0XQorTUxGKCVWUiQgS1BIUylaQV8yQFVBRlcoUUVeTkA7X1VLSDRMK1ldIDpYIzsvSkg1Rjs4ME1ILEc5JDVKUAorTSstVCJRIERHXjtHPkEpQkQtQV9GMkYmRSxTX0pKWlw1I1owJShZKzVaICNEJCAhW0ozWEVaK1pVQTwnXAorTUovMT0nIDw+LyJOSDZQQCxeNyU9KCArNiAhIChGVEpWTFg7SjsrRUUuMCchMjhRWT0/Ri1XKSY7KDZZUQorTVtCLilPPTVNTCswQiFIOjApW09NWk4sIChHUCFGIlonNltbM0dXKzhWMl4nJEE1MFFGTz47RyMvMk1ALworTVU5NVE7QjpSOUsiTVFDOEQnMTczNkNRIjUgWUNfVy8gUyU3TyVWN1kqLyk1Tyw/V0AtU01XLzFOW1xZPworTVclL1cgIDdHJCk/Kzo+QEZVVyheTS4ySkFFTjAuMio8LFA9VTJXS0lEMlUnXjc+OjtEI0clQE9YUSBSMgorTVwhI1I3VlAxKTwuKzBMR1lEOVVTIldSTyE/XE1BOyEjPTZETSpYMExJRT9PJC0gP1gwIixcMFZJL0lGOworTVMxTk4rP0sjITxYOEQuPUIpNFsjTlkzKSRbXThDTyE3ICE+NzpZVE0lNytLUFklXSJSJk1RXi5DU1IuQQorTVxeQiU/NE9WJyNJIChHIVU8OUtdSStKOj5GJz86QV8hJCAiSDk6XDEuSjQhNzUyRl49R1o0Wj0hN04rOworTTsrIEk0NDIyU1dQTkcjKiVTWD5WSiZENE5QKjE4OUY7QVhDRCYlL0Q8LUguRl5eKCFUVl5JMzxUO04wOQorTUgsQ0dFNDkzQjhETzMoNEchLUNLUDonIVogOSlQSTI1TjdJUDNYJSI9OjRZLkYsK0JSJyI1TU0mPSErXQorTVE0RypGRDdCOEQsWTovMTg1JidbL1EtOk1ONlsyMzZJLl4qQVAkUEIlMUIwSVRZJFYiViZARE49TyRKRworTTI9JCBPMiwwSVBGIyNEVichWSUkMyJIXSxULjEiN04zWUZPKCslMjo/IDxART8kJkI1QFJEQk5KITFPJQorTUBGJSM6QktFKFZbX1lIPyk3OU87Uk4qWzUnJkc/Qy06R1RcJzMuJjhISS5BLFglXz0uKDMgIVJBIC0zSQorTTslUV07WU9EVj4/WS5WXkE9VihUNDw6KzY+Qz4qXVk4U1NTXzYiKSY/ITZINVc1OSlOPUc0UT1XTVYvSworTVlAST9YX1RZOjMvSEgjNkghO0YnXUMkLzBSJD8wXU84Nk82NkpRTDlIRkBfICAwMCAuOEFaQ1MwPihVQworTVlTRlFbWjw3PTJCTjFZVkslLE1dOiZdRi46VV0nXzU2XjhLOTdPWF9MNTxAJ1pAVENMM0Q2VCtOUyY2WAorTTY5XSInQ007UEQsM11FXS5QLFUkR1tVJV5FMUNdIkVCLlIjOUsiQUtAPks9PFNUKl9TQENKU0AtRUgvXworTVFVICIxVSZfTDpSM0BAOy9EW1YiPVwwLyM/Lj4mV1RbVT9dVClOJ0ouJ0IzTiMuJixcID4wP0NdM0tQRAorTSwuREw0OTxcMS44QkM/XUVXOFlQMT8kS0M9XiMmRDE/JCZEV0hKOjpBPUM9MSEjLUAhTCJOMjAzVjM1KQorTTZTREEvIFFSIV1JPl5ZVzggQUggVD5DMDMgTE0hXTk5XD9BLCc7Q0pAXVMyXTFdTU07Wj8gVFElL0AwTAorTUxZRTJXIFQ+PkA6KypcUF4/Ly81KEVIJCBGJCAgTyYkO0AwQTQmMzIlVilCJzdMMjdWQzA9ST1KTDQ2SworTSpDKlVBQldCVF9YT00+MUIvMV4xLU5UKl5WWCgtJSZcMCNXPV1ZOU5MQCEySlgjSzdZLidYUUZGJj8rMworTS05XFNGRTsxT10pTk49QCBVKS0+IClQMCAvMz0iNSk9MTQrQUtLMFQrSi5TSFZcX1M3SU5NIkFXXVRPIQorTVItIUdUT0NAS0pAWzlaVyk1Sy1MUilUK0U5VyEgJU0oQkNVKk9DO1Q0TUdIMzcnOyg8N1knKCQpMkQ3OAorTTpNPkozJ1AoWDo2PD05TiggLjBcICE/WzAzQVw2K1IjMlYlVDdYQigpQ0NKNCwhUkcmVE4uXlRVN0RCLworTUY8Ml1VWkFZQEE6JEgsSlQ0O0ouMjVTJilNMylcX1JdTE8+RklUM1IzJzI+KEMiT1ZOPjVEQ0wgTV82IQorTUk8UkhYK0w/JkBfVUQ/KVxAKjUjICAuOyQpKDYuJVpPLk09KE9VWTpcVEVGNSpfWiROOTxaR0JRISVINAorTUBVKlVZQS4nRTE2XVYyTVxEKFgwIiBQNlFWQkonKzZAXVAjVk9EOi0/PDQ7UkxQMVlNVlhBTDsyVlUhOQorTTg3OShJXkgpWkU8L19YXT4xKVBPQ0Y8QSApLClbQksyLjg8XDorRzE4UlkgX1ItTCJYX0gkSjswIVxBIgorTVAtWVw6PjRRQVRIIzNbQlhMOCkuQ0FXMjQlQCQrPS9VQls6I0QgRVZaQTI1VCVRLS1fLDVGSD0oIFU5XgorTUFWSEMtSlE+L1tNU1NTQUcvT0kyS1QwNU5BICBFKUU/I187R01dLy8sQ0xKUF8tLi9JMj45T1IqNTExKAorTUw9W147TitdVzBPPUYlKjRFICQiM1o3VllRUVIjIkgyRE8uNU1TWTFJNy5OTDMiV0VKUjIxPUBJO1xNRAorTSEnR1IiR1pOXEg1JzJJJjgmQDVeLE4lVjxMUT4gVSI7IDUiPEs/JydXKlRMLiNVLS1XLyY5XSNKOzpAJgorTTQ5T1JeLDAjWDoqQDRCLFpVUSFTSjQyJVY7Sy8kQUAjPCg8WkZVKzw0TkNFTE9NLiFRPkYrW1ktVV4kKgorTUpeVS9DJitMPlxaWTAiJzQ5SCwgSDE1VVlMU0MqPyokK1AiIVVRI0U5Sik8JyRKRS9eRFwvMDFSKiNaSgorTTQ6Pi4pPSEzIF8vOjBeOChJOFRCJU45QCZGIjxdT1A0VCVANFIpVDo1XU5aTDksREE8OllbIUMoQzA2WQorTSpeKDlWKiM/RC1BNUZBTF5JMkI7VkJFMDolQS1ALzFVKzlRQzxFOyMuUCAzWDAgISwkUyEoVjtRMD0jVgorTUNdOSNTXigrRS9eMVE7X0A4X0c5UktHLV1ORjRIQExTOjI9LTlONFNEXztEMkxLK1xKQk89XEpcRy0uRworTSoyIz5FUUBVLSBTMSMoICojSUlNV1soRFRTIF9ZXCtfUjRQNDIrRSE/PlQxNVNRIihAL1ogICwwICg1NQorTSxTWywlQCFWS0MiVzBNT0JWIEErOzM4LC0jWStVVydBXjBMKVoxVy1DTVolKTchSyhfXzw2OiRTTyg3QQorTTwzVVY6SDgxJ1xFXl42JD5AVTkuSyJZKV0sMygwVUBQTCkxMkhIWDE/K1tNXSQ/JipSV0g8QFpbWyVVTworTTdbPVVSVEshTkNAQywyIiQsUSo8TSRANlZAVVJRRCEiT0FeJjonIkIzUSEjRCFFM1EmUCsnJkAhKkE9OgorTSNPRy8oXkFKVS8vJiZcIzssPFFcPlxYIy80TihUQE9FQTxfKE5YO0UxTEotWDgkNEMwUVssSSg0XUUyXQorTTI+JyQpXVI8WkslODJBJ1kkUSBWWiw5Wio5W1QlQ1wqXFRGRlNXPkUoWi5ET0VOIlMqKVIrUzQwMSdeXgorTUcxLlhKLChSM0xFLCxaVlxHT1paPUpQQSxCWSxTMyheJFkmVDwvWzktS008RVg1IiUhS10xTFM9Xi44WAorTUFdKUkhXSQ3JkArUV9DWlVKWlsjTj5ZTycgQCJPSiQgUjZAJiAsSElIO0Y7V0VUTiZQXlZRIiVRMFUiPworTTBYODY6UkcyOypEKFdULUBFMVRCKCogUDs7MidYXCk+OVw2PlBTTV1UJ0BQWTdeME4tQDtXSVc6WS0/RgorTTElWSRZODM+TERULTdJWSFNQkZCPUBYJ1U9QkMvJDlRQSwrTVMxU0EoQjwgOlEgIEFRJV5OXilaOjZCSAorTUM+UkgiIj0sODZHUzpBSFM9PS5NIUA2SyZOQjswT0s+ODBbPDtHKkZSTiMzWTpOWiwnSSczTT5KUk44UgorTVBUOFZBKzMlXTxGLC1aRyZOLSRbT0JJQ10hOSMlLFQ6Tjs0XSpQSFoxWjFYODs7WFktXEwkM0U5JV1BOAorTVlAIDAiSCVdMy0jVkQwWDNZN1BYRVhSLjNKXzdJXEg6QClWSjBZUkhCVCMrOjFaVzIpLk4xVjEjPkROQworTUI/WDYiWSc5UDFBXklRTE8gOCJCIyU+QSVSNSlcPU8lPz8/KiRcMS1IPT1CP00nPDM5TVwhSCtVPVxdNworTV9ERz44TU1aXyJNKTtEIjwgV1owICApLyQmSTpHJ1kyUEM9UjNIRz9NLVdfVSI5PT0kJjpRKkw1U0wgIQorTSRWPE1QV1IqVi0/KFItQiRGN009OkIqXiteVy9QN0NGW1QuPCk/M1omPERCS1VGOFJJQkFeKUVIJ0o3XAorTTknKjFMLD42TTs4V0UzUDlaVDBIPzRWNV0yKzVZRTJKRkQ4IlwsWUE7UCAgICAgICAwICIgIDAgIVAgKgorTSAgWCAkQCA3ICFQIChAIEkgIyQgLiAhICAkRCA0UCE9ICZAIDxQIV8gKEwgRiAiRiArNCBQUCMyIC4oIAorTVxQJCQgMTghKiAkWyA0WCE4QCVXIDhUIUhAJlggPFwhWVAnXyBBQCIsMCkrIEY0IkAgKjwgS0QiVTArUgorTSBRICMrUC0uIFZYI0NALk8gXSAjXEAwNSEjQCQ2UDFfISowJFJAM1AhMTglLzA1RSE4VCVNQDdAIUBIJgorTS0gOT8hSEwmTiA7RSFRKCcwID1PIVlYJ1NAP18iIyAoODBCMyIsOCheQEROIjYoICAgICAgICAgICAgIAorTSAgJCAgMCAhICAkICBAICIgICggIEAgIyAgLCAgUCAjICAwICEgICQgIDAgITAgJSAgNCAhMCAmICA4IAorTSFAICYgIDwgIVAgJyAgPCAiICAoICBAICIgICkgIEQgIjAgKSAgSCAiQCAqICBIICJQICsgIEwgIlAgLAorTSAgUCAjICAsICBUICMwIC0gIFQgI0AgLiAgWCAjQCAvICBcICNQIC8gISAgJCAgMCAhICAkMCAxICEkIAorTSQwIDIgISggJEAgMiAhLCAkUCAzICEsICUgIDQgITAgJSAgNSAhNCAlMCA1ICE4ICVAICAgJDggIDE2QAorTSAgODxAIjQ4ICJIIkQhV1ckSFQhJjA5MCBbTCJYMUk4IVMwOCghVE4mKSxFQ0BINSIiRCAgMCUwJDJMNworTStRI1EhOSgmNjIwLCAgPCA4IE1KJFYsQTRASyolLjA6UkIwLSAjLCVMIUpFJC1UMV9RQyEkQUgjSkFIRAorTSJQPCE1ICZAIEU4LidQSTghUiw0WzBRJSJfOCdQMCtJIis4K0ggUlYmOVwrUlA5PCgoPC45IDw8KFQ0PAorTUhAIkMkQDwgIDEwMCNDXCdHUUA7IjVUQltSL0wpPDA5MjFdVSA5TEVcMTo0ICBEKzQgVVskQiA1MSAjSworTSQkJD1cQEQwJ004Ll5RXiwjUUgmUVFYPiAjWChUIFojKTtIQFJBR1AmSzw4OTBaUiYvRChdUFxCJF8kIQorTSswXT0jSyQhRlIwICEgICQjIEZRI11EMEAxT0gnLCw4SEFNSyE+MDojQjkiJFw8OiNSOzoiSDxGLCIwTQorTSFdUCYxQTpUJiJUOlZSIyUoJShBMFEjIyRYXCxYME4uI1AsMkpBKUInPzAgIDI7MCJZLENKUF5HJUdYIQorTUJAKFQmOjBGPUBTJSBRJDpXUS4wJltIMEJRQFMjSSwjPyE6QCAgTDYwIiE8KDwgKihAR1ooTUgzJjA/MAorTSA9SCZMUVA2JydIREZBUlghPEAsU1E0SiJAPCE6Iio3ICRMK1whViElLTQ7OSE8XShOLC9CIF8uJyA4PAorTUxRLzckPSQgOSBARCE7UChSITZCJjE0Ri5AWFgjKiAhXDFdMCM2TCtLMFRbKTk0I1tSNyYkRlgmXUAgKgorTSU3SCtKQFZGJ0AoIV4xJyYjIVQrQVFTNCUjRDgxMEgvIytMOUwiJ1UpOTAgJUBfNydHWEVfMEJNJVtYOworTUAxTTImN1wpLSAnJCVYTCgwQUxLJlk0M0cyIE8oWFA3KCInXyE0XCAgQSogJzdALFdBK0soOzgiM0IoWAorTSheSCkwMilKJFQsRDghNzsnQjBAXFBISiZFKDRHMEdHI1pYJi9ASysoOiwhU1I8ICAgVEEsISgtJFosKQorTUIhU10iTyBEJCE0MSRbLD4iUTlaIz4kMzVARjEmRExGWSImUSc8XEBGUV5YIlEsOSpSJjwpOCgxO1FTRworTSAlTC8kIVVPKUIkIyRSJyopLUw6LEFAKCM0NCFLMScnJl0oOTYgIUooSjQiJDBSVCFNLEMsIU1TJ0YwOworTT4gXiIiXzwgOTAhVyItVCI2MUpAKFQ4OEFQLEYhQVBCRDFBTiE5KDdYQVBKJl5UPCwxIjUpJ1BFIkFIKworTSY5ICpEIjgrID9MN15AIi8jWkgqWUIvXCkuPCdKUD82I1YwLSwhKi0pP1wsOFBYJignSCBCMTMwJjM0MgorTSUxIDcgKkA9UUBfQCM+VCJEUDQjIitMKyMwKSMjLiQnNEAkTSFLQDcnUiwlKFdUP0VBLVslS1ggIEI1IAorTSJBUEYxMiM1JFosRjowTUgmQzxCJTIjVSMjMDtBMUU/KCNcKUtAOFYmViQlNiE9SCNSVDc5IT5XKDpMLworTS0yKjgoVDwsXSBYWSEgOCxUIjAuICEgJSQiNl8jJTgwT1EnMSgvOEU3IDM2JTxcMTAiOEIhQ1gpTyBDKgorTSIwQEEpMEMlKF1cIkoxR0YkWkBAOzEnPidcRCknQFkpJjo8QD4xPFckTiBCMiItSyAmWDIsIExNJVggLQorTVNBWVEiRjQmMUFBTCU+PC1bMDVAID9MOCtQRDwjWEw/TDBdOCFQWCBRUV81IEVIPEVBPlQmMFQxIDAnJQorTShLIC5XUS0kKExENVlARV0oLCwiVUE3UChTJC0gIFkkJSVQKTBCISQhQ1glK0BIPiBYPDZDIUhLIEBUKworTVVSNk4oOCwuTFBWTiQkRDdPMUNeIDk8KDcgI1AmLDAqNlBaRCgzTCFFIFFLI0ZEOFRBICYkSUwgTCApVQorTSJSNEQyIVYvJDdcKzNQKjYhK1g7JFE9Pik+XC1IUCRSIl80ID4hRkIoIDQmUkBHSSk3UENRIS89KT5cKgorTToiOTYnM1Q4SDIxRCIvRCYvMFEiKUwoIS5RK1chLCQgIFEjUCMuJEBCQU45IU88NFcxPl4jTVwzTSFcRAorTSFOXEQ2Ijk9Jk8wPiVRJDwnVTAmLyEyTCYlLCA0UCdaIENMLThQOC0nRUQkX0BXNCRFVDw0MT5DIjgsQgorTS1CKkIpKDhDSjEnSiAhMDAgIClAJjVIOSgxTTIpL0QqXlE0LCg1RDdIQicoKDg0ICdQSzEoVEg/WUFUJQorTSdVKDswIVJaIDJQJlkhJDQlPlg+KlIxWSVSLDZPIVwgIS9INlVCOTwgL0RFOUI3TSktJD5eMCwsICg4NQorTTQgSksiRCw1XTAuUyNfIC5EQUNcJiAgQitRLVYhJDw+TEIyUCA3KDgpUCcyJiwwJkVRVEsoUjw9LEEtOAorTSdEVCUqQCNZIFlQQEVQPFEkUFQnJEA8SSJQQCxZQDtIIDssOi9AIFEmUVQjO0ElICQ9UCNTMS8yKS08LAorTSQxPiMiSFwzW1E6TSdBSDFXUi1LJT5IRkUgN04gMkQlJEAsLigrMDxaIS5UIytMNDZCMzcmXVA6XCBNNworTSYzNCQ9QEErKShENisyIlwpJERGJSBZUyUqTDYxMT8wJUdYOzAiNFwmNVQ3RlBTJSI9KCVGQFJYJ084RgorTVEiJC4nQUQzKFFDUCAzLEBNUSBSJz9MPVpARzUhLywoKUEsNSNVJDAwQScyIltIOC9ATDUkMzAhSCBBKgorTShdJEJOQilaJUskJiRBMUglMjQyVTFBQidDTCAgUi5QJFA0PioxRy4mSDxCWFEvTSRAPEVSUDJZIEosIQorTTVQNTUjVVwlPDE+ICZeODc2IS1dJC0gIjkhRCEmVzxBV1FGIyI8WEMjIT8sJiokQ00gPE8gJ0QtSFEwKworTShSTDkxUC9bIC9QIjcxJlYnKFgvS0FSQiAhQDpcIShRJS9MJUJSITImN1Q9XUBAOyEhQDkoMSlZIyxAQgorTU4gUEEnMFQuPlFVUylNREA0IjZLJiYkRlcxNl0oQigpQ0FfRyU0NDAkISRaIDZQIjggPVomU0g/R0EiLAorTSI5VC4jQDs6IFowMDcxWyIpLDQ0MUAuKCAqKDg8IUMpJDFQIyRBIScmPiQvK1FUTiUtLEZZMD1PJEswNQorTSlBVUohQygiTTAjKyRUKEMjIVpZIzMkQT5QT0UgIlRAQTIlQyZYMEVeMCsnI1pAQDUiOkAoMFwvV1BXOQorTSFUODIsUFotISFEOSMxW00hWzQtU0IlUyJMPCQpQFIwJlA8RCxAICQjRSgsWzA8XCkrOCU3MUtOIDBEQgorTUNAUzMhQVBEWiFKXigpWC5YQDQ1KS4oOVcwMkgjLVRDPjFVKCBOWCYwUDk5KUUgK0IwQjskJyA3NVIgTQorTSFNQCRcUSUtIiU4JkNSMD0gQVAxMDFPVydPREZWIVI2JlMkLlAhKFQhWCgrLkEuMCJFRDEiIjNbIj08MAorTTcgQk0jJ1QqOTI5QSQxTCU3UCc4Jk48PENCM0AlRjwpITFaWCNZVDxSUDFLKFpAOToxWFoiIjg0K1I7JworTSUjSENaIE9RJT1cPDQgTEIoTjAlKyAgPSVaRCREUD0oIVogPVFAXz0lP0AgISBdQCI8SCJXQE9XIyMwPgorTSFBI0MnTFw8LzA0IiJVQCwzQEMpKDwkOUFAKyAhXThFLUBTPidEPCMvQCM3IC8gQlhQQCcpMzQgJiA3PgorTSAsVEI7IV9bKUA8IVUgLTUjTTA3ViA5NyRfIDg2QiAqKSBIJlNARE8mR1hBKiFfWSFHICQuUixMICFURQorTVgiLFIpR0QmKlEmWiAqTClRMCwgITlMMU0xLTYnMEAkNTA0RShJPCBKQjlKKFdIPzNAMUklQlw2LSAgUQorTSNANDNEQFxBJSpANDxRKVMkPiAjVUFHPCRCUDRIMCNWJj1YMzExQ1AkUEg7VkIqXCQlMDlHQChQI1sgPgorTTtRTF4mKTQsSkI1MSAsLDtEIE03IyJYNyIgSkImL1Q6IFFdRiheSC9fIE08JVZMP1ExX1gpSzxDUCBBPworTSI2IDNJQElOJixQLyBCJSYoVDBCTCBaUylBRDVcMC0nI0ZQOFIhKjYmTEQ3VlFFJCBeXClNQSBdJC0kLgorTSpATDooQzwpTVBRJSYmSDw/Ui5FI0pUQl9BSCIiJSAlISA/QCclKCElMCpUJz0oJjhBQCUhXVAiRkBXUworTSU4PDxVIFdaKUxAI0lQJk4jQyQhUEA8MiNfOCAnMC40IFNcMlhCKjMgKkQ8OlI2PyE/JDEvQSdEIVRIJgorTSBAUz0mTUw7WiIuKykuMEVfIDs3Jlo4QSBRNFwkUSAiMkE/IiNOMEE7QT9DJy40MEVQQV4oLiAiMCIvXAorTSBdSCpLIUM3JU1YJioyKDsgKjQtN0BDWyFQPDgoMStdISxIOVVBL1IkWSQsKVA+RicpTCREIUQzJjQ4IworTSwgWCklOEQzJzBUUiVPOC5YICMiJjxAIEAgOE4kKShCTVA5MyNXSDw5MTJJISYsQz8wND4lXCQuVFBQMworTSIhSEImIjowKUkgLCcxMUolIjAgITIoQCE3WEJJICxTITMkRFMiJyAlIigiRSEyPyk9SDBbIVdPIF0oQworTSkwUSUgKigsVlEzLilJPCtEMF8pIypMRyEiOFUmIzwtTlBbJCJHOCpPMjYsKE5cQkowPSUoRUwvW1FBOQorTSEgMDBGIU9OJzdAJi5APiMhSjArT1IsLSY/SCdAUDwqKDkkN1NAPE8hO0Q+TlA3ISAiMClQIC1EIjowKAorTS1ASj0nSTgqVVIvNSc3OEJKIiNUJTUsIl8hJS8jTVg9PFFTXiAiPDhIIS5aJktIIUBSOCUkTTwsIFA7SworTSk8QENHUCJWJVgkICwwNkMpNDwiQlA0SihRQCowMD0jI0U0IFwgJl0jTzQ4KFBbOydNODBCUFInKSYsQQorTSdASUIiSFAiQVBDWCEyKDdRQitaIC5QPkwgOSUoNUgrJ0EvQSREXC5BIjpfIkQ0MlYyOVQmKkw0STEuQgorTShVXCM0MVZSJDw0Q10hXlEgOUw8OlElLCNUSDJTQSRbJUpAOCZRUjghMVgiTjIpJSkyIDkzMExQI19AIworTTtCJlkjS0AqP0EvRyAwMCddQF0hJV1cOiogOk8oSVA0QiAjXyRBJEUkISxBKSg8IlEiMC4lI1AmJCAsUAorTSZGVDpaUDYjITUkIjIwRyAlUzBDT1IjUydUODEhIi8gKDdcJUMyMyIgLyQsIzBROSNTKEElUU5aISNUOworTSQhPSUgVFw+J1AqPSNXWCBCIVAuIVZAJjlSLCMnODRGVTFTSCdWUDg0MSRLIzw0KlAgX0shOVA3UjIuMworTSVVWCBMMTJCJV8sNipBO1YhWzxEJFAsJSFYODsuQTshICpYICAxUzAmLywrN1FEXSNKLD0uIDo6ICw4QgorTUhBP1cmNjQ8PjBeWCEpVCsqUFAmJU04IEQyNEolR1QjTVAgTiMgTCIiUFQ8J1YwLjBBIDcgKjRCTiAmXQorTSMvUDcrQjpWJCwwKzZQODIgJTwwWEA3USMoPD9cIVElJjAsP00xQVElWTxDPjBEKyVMQCVJUVlVIiRUPgorTVhSOVsnLlxBN0BMXyE6LDomICAmIz0gOjxRT1YnIEQ2OiBcICRPXDwqIFYyITtARiUhJkAkQVQxKiEwTgorTSg2JC4rMDAqIDxILCdQRkcgV1A+O0E2PCIsNEQyQi1KJkM0IU0hLlwhTkAxWkBFSCBITDU1QDQmIVxYJworTSZBT1soODAvNEBUOic8IDE2MVdfIVlcKzhQPy0lLlQkOjIpTiNFWDNaUU5LJlJQRV0hTjQkIiQ8RjI7MgorTSZVKCAqUTJQJzA0JCoiKTMhP1w2UyFJMSUvIEQ2MVRTJDpQKSMwICgkOUA+NEIsMiYgLD8zIEM6IStIRgorTTAhIzMhMDw4LzEnQyQjUCEhICZdJz84IlcwK1UpPTgiWVI3WCFWTDNZIjIvJzc4OEJROyAoLkgtPyEgXworTSUqSCAtMDBIIC48MUQyM0ElKDAmSkIvNCInVDMqUStGIzI8PkdRJSIlXkAyQzBdLiNTKCEnQicwIUcsQworTShAPDElLiw/WDEiVyZcTD1OUEg4I1EoOUkyNCMkJjRGVzBQJyg7TDI8QU5PIzU8OSpRWE0iX0BEOTAgKQorTSc8VDlRUTFKI1wwP1ZBNlgmQCQ6MUEqWyY6NCZYUSpcI1BIKDIwTD0kOVA1PiFLJCJISD9DUCouJUlUOgorTV5BK08mUixCQjFTLylGWERNQTMvIThUQjEyMy8pI1giL0AyNyBNIEI2ID00KTkgOiFQOSkjPyArKTEjUworTSFeXDooIDFHJFJQMlZSLkUmPig6KFEwVyBCMC1WMVZAJD48JzggLSEnSSwrPUIsRSBXNDA8MEAtJDIwPQorTT8xTTUjQSBFPlIoXihfLDRFIE5TIio4M0ohTlIjTlgzMUE0OSg/NCQjIE82IzowKERSNTMoI1ghOjIxOworTSVTQCVYQDwvIVRUJikxR1QjKTwySCIkOig3PC4pIVBfIyUsKF8gICEkJSBESlAxKCJbND1KIjJbIiA0PworTUQwTTcnWFgxNTFXNSEzUDJRQEk+Jz1cQiJCISAhKkAnViBcOCVGMC8zUUdBKCgwOksxUVAlNjQgJUEsJAorTSU1MCVbMDZUJShcLz9BK1ImK1wmP1BSMyRcMEVTIENBKUc8KFcwLUshQigxLVAtQyZGVCooUTxDJlQoOAorTSggVUEoOywhPjA3NiVbPDo9QFNRIjkoOTFBJyEjOFwtRjApQyAgQEBEIFs3KFEkQUEiK1kkSVA7PyI6NAorTSNYIEJBQUA9JzVMQDkhKyIjXEQkSSAsVSIxRCtUISApJCpAPV8gUS8hSTwzVyI6TCZLPEBQQVgqKSssQQorTSNAXFkiPEQ1SDAkLCU9TCkqUVswITA4LE4yNDsmRTw+VUE5NihKUDw1UVQxKDkoOjEgI18mRSxDMEE+VgorTSEvXCVcQFg8IytQQkNQKislIlgzLSBeKiM8LDQ/QFdOJStcQDlAIFQnWiA3IUA4RidCKCAqUEIoIj1MRQorTUxAOEcjJkwmPFBWTSNLOEAmUEYzIys4KyciKDUlXlwzWlBFSCIuTDBFIjo/JVwkRV1RNzMpP0g6REAxQgorTSciQEQpQFI4KSIsRlQhOE8pO0wtJiAvQCheJD5AMDc+JTA0OU5BLjYhU1QjSCEwQiA4ODY+IikrIiMwKgorTT0wJSokJSg3PVAwKCgqPCc/MFJQKEggMTMiMlkkVSg2P0EvLSA4QChNUCU6KS8gKFAwQ1gkWVxBRlAuLgorTSFGREJaIEYrKSNAIyBARFYhPyQzUlBISiAtMDYzUCNQJiZYQCdRICwkN0BGJFBDJihfWDBEQFQiJztURQorTT0xPTcgVFQ8VVIoKyRDWDhNMF9CKS5ARl4gWUUkQzwjLFFBTyhWQDRcMCo9ISMgRTRSJlIiUCQ1X1IgUAorTSMkJC4uISUpIUIwKDUwRzoiKFw8P0BWSCUnPCUiUE4xIkZUQiEiN1ojMDwtLyAhLSItVEBYIV8yJS4wKQorTTIiLkgkIlwiKDAnIyJcMDZMIFY+KE5QNjMwLVEnTEAiS1FUXyVbLC5CIFZaJUk4LzNSJ14nQ0AtOTEgIgorTSJHWDxYQSdWIDtcO0shWjUkQSQgW1E6UyBTWCMiUi1BJTpAQTMhJyEiXkhENDFbPShBLEMkUFZRJiBQJQorTUowOjMjPUQhTTA5JCBJJCYuQiYxJUhMNyQwXUghR0w3QSA0QCBDIDM/QS1VJ1dYOEFRWjYoMVQmRkEsJgorTSAgJCNUIDYjKUtcQUMxX1YlNVgwTTAkVictUCsiUUZBJEUkLidRKDwpLyQzIkBHSyVVTC45MVsvIig8LQorTUVSO0cjPDwuMCIsTSY5SCMlME5LJEdIRlkhWTklLCAtNlAzUSJZLD8sUShRIFpQNDRRTSokPlw/XVAtQgorTSIwSDMtIEdCIkIgJ1ZBRlwmIDgpSDBIUic/IEFcQDQuJD1QPlhASV4gJEw9SlBJXShDSEA9QVU+I1I4LQorTS1BXUMpUDglPVA1WScxVCAiMFEgJ0BQIy9QWV4hUzw1SlBTXSQmJCdUQidSIC4sJSYgVE4oOFgwXCElPAorTSdKUDhcQjIhJjtEOj5AXzclTCQiWTIkISU9NCdKMC0+ISs8Ml4hU1gkNSg/VjBFQSU0SCVNITUrIzpEMQorTSMyO1MoOSgmJkAyPCdHXDc4ICItKCZMNyFRI1wkLzhFOiFGNCRfWDNEQV4kIEFMQz1BVjshPjwqXiFELQorTSNVWC9QMDhQJCEoPlJRX0sjVTg8QSAlMyRfPEMnQic8ICNcI0AgViggU1AvSlIxOiAySC1YQSIyIEJEIworTVBQWEggOzQ7OEFDMCA4RCFFQVlXJDA0NkQhOk8mIUQrNiBbIyA2JEEzIT5bIkpEMyVRVlIgTTg6RDExTAorTSNePDReQUw8KCU4OEhRL1wnOEQ/QCA7JCM+QCpIQVFWKDhQRjExIT8oWTBDU0E6UiEqSClOIUA3KExEPAorTT0hSV0pKCQ6TTEnOyRYLCMgUCouIjpINTQxNU8nJSg4TCFbMig1ODFQUUkiIiU8MzohNywgOighICBIMAorTSY2WCExISMvIExYOl1RTTsoX0gyTkIpJyJaOCBYQClFJyckIFBRW1UhOzwxQ1E0QCk6UDswIjVLKFBcJAorTUZRTjcnOEgpJCFITShPXDNaQUlbITJIM0JRLksiO1RGM1BWWiEsUCcwUDJVKTJQKSRQUSEgWTwpS1E3MworTSkpICo7ISIsJ1goJT0hSkIoMyQqJlFSXigqUCM7UjotIi5AI1hBN0AgNVg4JUA8JCFaTDNLMCcvJVMgPworTU8wS0wjNUA6TyBVTyBGUCpNUVBQIjZUODhBQlkjPFwrWiI3VCNQPClGUjs7KUVcNllAKkwkW0wmODFRJQorTSNfKCQ0MF0pJ10sMiUgREYkXFBATzE6KCgzMEUsIFAqIVlEI0swMz4hWkArU0EyPCY5MDBGIVs1J0YgJAorTVZSNCIiXzxBJkBGXCFHWD9UIjhIJU84LV4gNVEnUywkPEAxQCNBKC9aUVI6IFRcJStQLyMgQjg6OUFYVAorTSdbLDBTIVFJIl9EQltBWDEmIiwyPzIrJiFXLEQ2MCwkIyU8Ml9CMUEnUkAgIDFZQCVBSCVeQiBdIS1EOgorTVxRWSkgSVBALEBKNSUsODkjQS5XJko4LS9BKiElMDQvUSI2LCcwUC9IQTgvIVA8IUtRRlEjTVhAWzEjWworTSdCUCgzIF5YKEE4KjMxWF4kLShGPSBWQyk8KChJMUEnKElEKDdQM0EnICQ3TzIsXSRBMDREIS8/JSJMKQorTSIhWUcnVFAqXUA0NCZUMCcoUjopISU8NyEyJyElLDA/LFA3SSU4LCtOUi9MJy4gKTRQRl4lNzwzPVEqRgorTSMtRDozUiZZJiFQPkEwICsnUCAuMCFPXSg7WDBJUC9KJUtYQkdAQE4hIFxAI1BLJSIrOEVSIDs3JiZUIQorTSFCJVQoMjRBXFBbQidVQDhAQVohIyFELCtRWzMgLkhBO0ItXiBRMC1NMTdVJlU8QixRKCAgSzAvJTEmRQorTSBOVCwjIDpBKDQoNkJCMEcgJThGISA8TyVfNDYzME9fIVMsNTAhRiAlJEhGMjAgMCRASDQnIC5HJSRUNworTT4wLUwoJ0w6JCAqWyhCMCkzIE0iIjggOiJAPU0hPzBDWkFFVSYxUDJJMFI2IiM8IDMwWVAnKkREQiFMLgorTSY7ODNFUU9ZJ19MIVQxOCEgT0g5QkBUOShGQDsiUV45ITgwJ1oyLV0oUVBDSEE7LiU0UCZUQUA9JlpUMworTUZBT0QoOyg4KTA9XyBeKCM1MFNIIz4gPDkwMTwoVEglQVE+VSdPXDJQUSgzKDQ4LUpRSUEmUEQxQFEjWgorTSUmKEEmQE5BJ08gMi0hSVEiNEwqXlEzTyk3QEZLIUkiKUlMQlVRVkAgSlQtMFIwKSJYWCE4UEYpKE0wPQorTVFSMU4nUjBAS0FeWyU1KEA1IFNeICNAIV5AMEAhU1giXUBYTiMxMDgpIUA2ICo0PlZRUkwlLjBERTEuXworTSJfSC0/QT8gKUdARU5BWjcmXDBAOzIrWyBBRCYtQTBWIlxAN1EiOyogNEwxUiEgISUvMEIkUUYmJTk0MQorTTwhOlgpNDgqNTFRPydPWCVBQUY6JVU4OERBVVgoTSgsTDIqKCUtMDg9UUEiJEFMRVBAWjAkOVA8PlE7NworTSYyKEQsMVsmJixMITkwVjohVFBDX0A8WSVTTDIvUTkoJFZUREQyJ1skISw5JlBaUChBQCZLQU0hIVFIJgorTSwwU1QlWCAiRiIjVyBIQEA/QSUnJTY8LyMyOz0lVzgyJyI3PSVOJDk7QDZAIT5YQE4gMy8lRTQkT1AuPAorTSkkOCVdITolI0YwIVkwLDkiMyg9MjA/XyBTQCdJMThUKSsoRCJCKzQmPkgqMUEyKiUrUCBYIjpRIio8MworTUYwKTMkTEg8TSEsNyk0KDZfUUwlKThAIC8wNSwhQTgiVUBHOiZHRDsoUFIpIzAsQUxRXDAoPzwvWFAuVAorTSYzKDI6UVcvJ1E8PlohL0IoUzw9WVFKXSczSCspMFpSJU9QIEsxRS8nRTAmUSAgIiAgICAgICAhICAsIAorTSFAICogIFwgJUAgPiAiPCAsMCBcICREIDVQIUYgJzggQVAiOiAqWCBQUCM5IC8gISIwJEMgM1ghNkAlVworTSA5OCFNQCc3ID9EIicgKSEgRjwiQ0AqViBNXCMiQCxWIFYsI0QwLyAgXyQkKFAxNiEoSCRPUDNWITJYJQorTTlQNkEhPVQmJkA5OCFJPCZVUDw5IVVQJ0ggP0UiIkwoPFBCXCIwOCk0MEY9Ij5MKi5ASioiTUwrKzBOIQorTSAgICAgICAgICAgWiggITU7Rk1OO1c9TigmNVI8Rl1SICBIICAgICAgICAgIEovVCAgKkNfICAiSSA4IAorTSBKMEAgICpELCAgIkkkQCAgSjEyICAqRDsgICJJJ1ggIEoyMCAgKkRIICAiSSpQICBKMl4gICpEVCAgIgorTUkuKCAgSjNOICAqRSEgICJJMSAgIEo0PCAgKkUrQCAiSTNUICBKNS0gICpFNyAgIkk2VCAgSjYhICAqRQorTUUwICJJOzAgIEo3IyAgKkVUQCAiST5IICBKN1cgICpGIzAgIklBUCAgSjhIICAqRi5QICJJRFAgIEo5QgorTSAgKkY/ICAiSUlIICBKOlkgICpGVUAgIklOPCAgSjwmICAqRylQICJJU1ggIEo9OCAgKkc+QCAiSVlAIAorTSBKPyggICpHV1AgIklfWCAgSkAuICAqSCkwICJKJEQgIEpBSiAgKkhAUCAiSilUICBKQlkgICpIVDAgIgorTUovKCAgSkQ0ICAqSSowICJKM1AgIEpFPiAgKkk8MCAiSjdYICBKRjIgICpJSUAgIko7RCAgSkcoICAqSQorTVcgICJKPyggIEpINCAgKkoqICAiSkM4ICBKSS4gICpKOjAgIkpHUCAgSkovICAqSkxQICJKTFQgIEpLSworTSAgKkpfICAiSlEoICBKTEMgICpLLEAgIkpUWCAgSk09ICAqSzwgICJKV1AgIEpOMyAgICA2VDVSPEZdUgorTSgjICAzRl1UKCZdVztGNVIgJFlPKCctVThWQEA5RkVMOTIhTzxCIUQ6NylFOFcxTzxHRCAzRlxAPFc1QworTToiIVA8Rl1DOTctUyAkRU49JjVSPEc1UD0mNUQoJy1ZPFcxRTsyIUM4NlFMICRETzNSIUU8RylPPEAhLgorTTtSIVM9Ni1IKCYxRT1GRUM5MiFPPEIhQTkmMVI5Ny1TICQlUjlSIUw6Ny1UKCcxTztSIUw7VllHICQ1WAorTTk2LEA5Rl1SOzYlVCgmNVI8Rl1SICQpQTkiIUY6NlFFKCZZVTs2KUU8QCEuO1IhQzomRUw5JylFO0AhLgorTTtSIU07VylFKCchUjtWLUU8Vy1FPFAhLjtXMEA5NllPPTY9SCgmVUU7Nl1SPjAhMDk3KU06Ny1TOjZdTgorTSgmMUU7RkVFOSAhIjg2MEA4NjFEPEY1UzxQISI7Jl1DOlIhRDk3OUk4VjRAPEY1UT02RVI5NjAgMSY1VgorTTo2LUUoJilVPFdEIDFGRUw5MiFFPiZFUz0nLCAwVylPPFcsTTkmNVY6Ni1FKCZRSTtGTCAzRlxAPFc1QworTToiIUQ5NzlJOFY0IDNGXVQoJiRAOSZFUjk2LVQ7VylZICRFUygmJEA5JkVSOTYtVDtXKVkgJEVOPUYlTAorTTo2MEA4NylHPTZVRTtHMCAxRkVMOTIhVDg2KUw5MiFPPUY1UjlGUU89UCE0O1ZcQDs2JU4+MiFPPCY1TgorTSgmOUk7JjVTICRFTjg3IVA8Rl1QPEZFQT0mNEA6Nl1DPSZQQDlGXVIoJjFFPUZFQzkwITQ5N0FUKCY5SQorTTsmNEA4RzVTPjAhJjo2UUUoJzFPO1IhTDg3KUc5MCEuO1IhUzwmJUM5MiFMOTY5VCgmXU4oJjFFPUZFQworTTkwISk7JlFFOVYlTCgnLUU5NkwgNEY1QTkiVU87RlFZKCY5STsmNEA8V0VTPSY1TSAlMU87UiFNODZZWQorTSgmUUk7Rk1TICQpUjtWTUU7QiFQOjchRSAkJVI5VzVNOTZZVCgnMU87UiFMODcpRzkwITI5Ny1VOycwQAorTT0mXU8oJlFBPEY9RSAkXVA5NylBPSZFTztCIVc7VzVMOSIhQjsmXUM6UCEvPCY1Ujg3MUk7VlhAO0ZdVworTSgmRU4oJyFSO1Y9Ujk3LVMgJF1QOTcpQT0mRU87QiFBOycpRTg2MVkoJkVOKCchUjtWPVI5Ny1TICUtTworTThWTUU9IiFPPCY1Ujg3MUk7VlhAO1ZYQDtGXU4rNy1POFZNRT0gISQ5Ny1UOjZZQT0mRU87QiFBOSYxUgorTTk3LVMoJylFPDc1STxGNUQgJFVFPFctQTlWNEA9Jl1PKCZRTztGPCA0JylPPSZdQztWUEA9VylPO0Y8QAorTT0nRVA5MiFGO1coQDxWXUM6VjVUICRdUD0mRU87QiFOO1cwQDxXNVA8Jl1SPSY1RCgmKVkoJyFSO1cxTworTThWXUwgJSFSO1cxTzhWXUwoJllPPSIhUz03IVA7VylUOTYwIDRWXUM6VjVUKCcxWTwmNEA7Rl1UKCctVQorTTwnIU88RzFFOSAhLzwmNVI4NzFJO1ZYQDtGXVQoJy1VPCchTzxHMUU5IiFPO0IhUztWLUs5NzAgNCcpTworTT0mXUM7VlBAOUYlTTo2UVkoJllPPSIhUz03IVA7VylUOTYwIDA2MUQ8RjVTPFIhRjg2VUk7J0RAO0ZdVAorTSgnLVU8JyFPPEcxRTkiIUI+MiFQPEZdVDtWLU87IiFGODZVSTsnRCAwNjFEPEY1UzxSIUE7JylFODYxWQorTSgmRU4oJzVTOTAhIzg2WEc9IiFBPFctSTlWWEA8RjVRPTY1Uz0mNUQoJiVEOScpRTxXLCAzRjVUPVZdUgorTTpSIUk8UiFEO1c9TiAkWUU9Jz1PPEZMQDo3LEA9NllSOTYlQzomJUI7JjQgM0Y1VD1WXVI6UiFEPEZdUAorTTwmNUQoJi1PO0ZZRThXMUk7VlhAO1ZYQDxGNVM5NzAgNFZdRj0nPUE8RjRAOFYlVTxWNUQoJi1PO0ZZRQorTThXMUk7VlhAODYpTzxHMCAwVl1OO0Y1Qz0mRU87QiFSOTctRT0iIUI+MiFQOTY1UiAkWU8oJilVOUY5RQorTTxCIVM8JiVDOTIhQT1GJUk7JiVCOyY0IDRWXUM6VjVUKCZFUygmJUw8RjVBOSdEQDhWXU47RjVDPSY1RAorTSAlLU84Vk1FPSIhSTxSIU47VzBAOFZdTjtGNUM9JjVEICQtQTtCPVQoJy1FO0YwQDg2OVQ5NyhAPFZdQworTTpWNVQoJy1IPTcxRDtXPU4gJTFPO1IhTTg2WVkoJylFOUY1Ujk2WUM5NyxaKCYtQTtCPVQoJy1QOyZFQworTTkwISM7VllOOTYtVDo2XU4oJzFJOzY1RCgmXVU9ICEjO1ZZTjk2LVQ6Nl1OKCcpRTlHNVM5NjAgNSZdTworTSgmVUE7R0RAOyY1Vjk2UVMoJl1GKCctWTs2KU87JkVDKCZRSTtGTVMgJDlJOyY0QDtGJU05MiFUO1ZcQAorTTsmXU45UCEoO1ctVCgmRVMoJjFPPVZYIDImXVM9IiFJPFIhVTtHKUU4Ni1IODYpTDkwISQ6NylFOFcxTworTTxHREA7Rl1UKCY1TTwnMVkgJTFPO1IhTTg2WVkoJyFSO1YtRTxXLUU8UCE0O1ZcQDs2JU4+MiFVPFY1UgorTTxQISQ6Ny1DKCclVTtXMUEoJjVYOFY1RTkmNUQgJS1UODZRRSgkWSY0UiFGOjZRRSgmQUE7RjFMOTAhNAorTTtWXEA7NiVOPjIhTDk3OUU7JyxAO1Y4QDxGNU07VzFFKCZFTignIUE9JkAgM0ZdVCgmJEA8VzFSOTYlTQorTSgmMUU9RkVDOTAhNDo2VUU8QiFFPichSTxGNUQgJF1VPSIhTzlCIVM9JylFODZUQDxGNVM7VzVSOFY1UworTSAkWU8oJlVFPFctQTlWNEA7VjhAOSY1Uzo3KUU5IiFUPjchRSAkWU89IiFBKCYxQT0mJEA7NjVTPFYlRworTTkwISk5JjVOPSZFRjo2NVIoJylFOzZdVjk2MCAxJjVBOSZRTzhWTEA8VkVUPTYlVDo2XU4oJjFFPSY1QworTT0mNUQrViVWO1ZFRDk2MCAzRlxAPEY1QztXKUQoJlFPOFZNUygmJVY4NkVMODYpTDkwIS04Ni1IOjZZRQorTSgmRVMoJllPPSIhTztCIVQ6JjRAO0Y1VD1WXVI6UCEvOEZJRThXMEA6NyxAPEY1TTtXMUUgJFFJO0ZMQAorTTomJVMoJilFOTZYQDxWNVY5NylFOSAhITknOUU8RzFJPFY0QDk3KVI7VyhAICUtUjs2XVU7RzBAOTcpUgorTTtXKEAgJC1POzZVVTtGRUM4NzFJO1ZYQDk3KVI7VyhAO1ZYQDxWNU45ICEwPEZdVDtWLU87IiFFPEcpTworTTxAIS09NlFUOjZBTzwiIUE9JzFFOzchVDk2MCAxNDEvNSQxLzUiJEEoMiQgNEY1TTtXMUUoJiVEOScpRQorTTxXLEA4VkFBO0Y9RTkgISY9NllDPSZFTztCIU47VzBAOjZVUDsmNU05NllUOTYwICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkISAgICAgICAoIiAgICAgMCEgICAgICAgKElAIAorTSAgID0hICAgICAgIChKICAgICBFISAgICAgICAoSiAgICAgVDkgICAgICAgKEogICAgITc5ICAgICAgIAorTShKICAgICE/QCAgICAgICAgICAgICAiIUAgICAgICAgICAgICAgIjNAICAgICAgICAgICAgICJaQCAgIAorTSAgICAgICAgICAjM0AgICAgICAgICAgICAgI1FAICAgICAgICAgICAgICQvQCAgICAgICAgICAgICAkSQorTUAgICAgICAgICAgICAgJStAICAgICAgICAgICAgICVOQCAgICAgICAgICAgICAmK0AgICAgICAgICAgIAorTSAgJkdAICAgICAgICAgICAgICZZQCAgICAgICAgICAgICAnLEAgICAgICAgICAgICAgJ0RAICAgICAgIAorTSAgICAgICdQQCAgICAgICAgICAgICAoTUAgICAgICAgICAgICAgKTpAICAgICAgICAgICAgICouQCAgIAorTSAgICAgICAgICArKEAgICAgICAgICAgICAgK1NAICAgICAgICAgICAgICAgMSAgID4wICAoSiAgICAgIAorTTEgICA+MCAgKEowICAgICAxICAgPjAgIChKSCAgICxEKSAgICAgICAoSiAgICAgIDEgICA+QCAgKEpYIAorTSAgICAxICAgPkAgIChLKCAgICAgMSAgID5AICAoS0AgICAsUykgICAgICAgKEpYICAgICAxICAgPlAgIAorTShLUCAgICAgMSAgID5QICAoTCAgICAgIDEgICA+UCAgKEw4ICAgLSopICAgICAgIChLUCAgICAgMSAgIAorTT8wICAoTEggICAgIDEgICA/MCAgKExYICAgICAxICAgPzAgIChNMCAgIC1DKSAgICAgICAoTEggICAgIAorTTEgICA/QCAgKE1AICAgICAxICAgP0AgIChNUCAgICAgMSAgID9AICAoTiggICAtUykgICAgICAgKE1AIAorTSAgICAxICAgP1AgIChOOCAgICAgMSAgID9QICAoTkggICAgIDEgICA/UCAgKE8gICAgLiopICAgICAgIAorTShOOCAgICAgMSAgIEAwICAoTzAgICAgIDEgICBAMCAgKE9AICAgICAxICAgQDAgIChPWCAgIC5DKSAgIAorTSAgICAoTzAgICAgIDEgICBAQCAgKFAoICAgICAxICAgQEAgIChQOCAgICAgMSAgIEBAICAoUFAgICAuUQorTSkgICAgICAgKFAoICAgICAxICAgQFAgIChRICAgICAgMSAgIEBQICAoUTAgICAgIDEgICBAUCAgKFFIIAorTSAgLyYpICAgICAgIChRICAgICAgMSAgIEEwICAoUVggICAgIDEgICBBMCAgKFIoICAgICAxICAgQTAgIAorTShSQCAgIC89KSAgICAgICAoUVggICAgIDEgICBBQCAgKFJQICAgICAxICAgQUAgIChTICAgICAgMSAgIAorTUFAICAoUzggICAvTCkgICAgICAgKFJQICAgICAxICAgQVAgIChTSCAgICAgMSAgIEFQICAoU1ggICAgIAorTTEgICBBUCAgKFQwICAgMCIpICAgICAgIChTSCAgICAgMSAgIEIwICAoVEAgICAgIDEgICBCMCAgKFRQIAorTSAgICAxICAgQjAgIChVKCAgIDA6KSAgICAgICAoVEAgICAgIDEgICBCQCAgKFU4ICAgICAxICAgQkAgIAorTShVSCAgICAgMSAgIEJAICAoViggICAwSykgICAgICAgKFU4ICAgMF1AICAgICAgICAgICAgIDFXQCAgIAorTSAgICAgICAgICAyS0AgICAgICAgICAgICAgMztAICAgICAgICAgICAgIDNNQCAgICAgICAgICAgICA0NAorTUAgICAgICAgICAgICAgNFBAICAgICAgICAgICAgIDUuQCAgICAgICAgICAgICA1SkAgICAgICAgICAgIAorTSAgNVdAICAgICAgICAgICAgICAgMSAgIExAICAoVjggICAgIDEgICBNMCAgKFcgICAgICAxICAgTUAgIAorTShXOCAgICAgMSAgIE1QICAoV1ggICAgIDEgICBOMCAgKFg4ICAgICAxICAgTkAgIChYWCAgICAgMSAgIAorTU5QICAoWTggICAgIDEgICBPMCAgKFlYICAgICAxICAgT0AgIChaOCAgICAgMSAgIE9QICAoWlggICAgIAorTTEgICBQMCAgKFs4ICAgICAxICAgUEAgIChbWCAgICAgMSAgIFBQICAoXDggICAgIDEgICBRMCAgKFxYIAorTSAgICAxICAgUUAgIChdQCAgICAgMSAgIFIwICAoXkAgICAgIDEgICBSQCAgKF8oICAgICAxICAgUlAgIAorTShfUCAgICAgMSAgIFMwICApIDggICAgIDEgICBTQCAgKSEgICAgICAxICAgU1AgICkhSCAgICAgMSAgIAorTVQwICApIjAgICAgIDEgICBUQCAgKSJYICAgICAxICAgVFAgICkjQCAgICAgMSAgIFUwICApJCggICAgIAorTTEgICBVQCAgKSRQICAgICAxICAgVVAgICklOCAgICAgMSAgIFYwICApJiAgICAgIDEgICBWQCAgKSZIIAorTSAgICAxICAgVyAgICknWCAgICAgMSAgIFcwICApKEAgICAgIDEgICBXQCAgKSkoICAgICAxICAgWCAgIAorTSkpUCAgICAgMSAgIFgwICApKjggICAgIDEgICBYQCAgKSsgICAgICAxICAgWSAgICkrSCAgICAgMSAgIAorTVkwICApLDAgICAgIDEgICBZQCAgKSxYICAgICAxICAgWiAgICktQCAgICAgMSAgIFowICApLiggICAgIAorTTEgICBaQCAgKS5QICAgICAxICAgWyAgICkvOCAgICAgMSAgIFswICApMCAgICAgIDEgICBbUCAgKTBIIAorTSAgICAxICAgXCAgICkxKCAgICAgMSAgIFwwICApMUAgICAgIDEgICBcQCAgKTIgICAgICAxICAgXSAgIAorTSkyOCAgICAgMSAgIF1AICApMyAgICAgIDEgICBdUCAgKTNIICAgICAxICAgXVAgICkzSCAgIDZEKSAgIAorTSAgICAoVjggICA2TCggICAgICAgICAgICAgNlYoICAgICAgICAgICAgIDcoKCAgICAgICAgICAgICA3PAorTSggICAgICAgICAgICAgN0coICAgICAgICAgICAgIDdZKCAgICAgICAgICAgICA4LSggICAgICAgICAgIAorTSAgODYoICAgICAgICAgICAgIDhGKCAgICAgICAgICAgICA4WCggICAgICAgICAgICAgOSIoICAgICAgIAorTSAgICAgIDkzKCAgICAgICAgICAgICA5RiggICAgICAgICAgICAgOVIoICAgICAgICAgICAgIDlfKCAgIAorTSAgICAgICAgICA6OiggICAgICAgICAgICAgOl0oICAgICAgICAgICAgIDtCKCAgICAgICAgICAgICA7XgorTSggICAgICAgICAgICAgPDcoICAgICAgICAgICAgIDxcKCAgICAgICAgICAgICA9NiggICAgICAgICAgIAorTSAgPU0oICAgICAgICAgICAgID4wKCAgICAgICAgICAgICA+SyggICAgICAgICAgICAgPyMoICAgICAgIAorTSAgICAgID9HKCAgICAgICAgICAgICBAJCggICAgICAgICAgICAgQEIoICAgICAgICAgICAgIEBYKCAgIAorTSAgICAgICAgICBBNiggICAgICAgICAgICAgQVYoICAgICAgICAgICAgIEItKCAgICAgICAgICAgICBCSAorTSggICAgICAgICAgICAgQygoICAgICAgICAgICAgIEM9KCAgICAgICAgICAgICBDViggICAgICAgICAgIAorTSAgRDQoICAgICAgICAgICAgIERKKCAgICAgICAgICAgICBFJCggICAgICAgICAgICAgRUMoICAgICAgIAorTSAgICAgIEVbKCAgICAgICAgICAgICBGNCggICAgICAgICAgICAgRkIoICAgICAgICAgICAgIEdAKCAgIAorTSAgICAgICAgICBILSggICAgICAgICAgICAgSSEoICAgICAgICAgICAgIEktKCAgICAgICAgICAgICBKKAorTSggICAgICAgICAgICAgSlMoICAgICAgICAgICAgIEtEKCAgICAgICAgICAgICBLTyggICAgICAgICAgIAorTSAgS1ooICAgICAgICAgICAgIEw+KCAgICAgICAgICAgICBMTSggICAgICAgICAgICAgTSsoICAgICAgIAorTSAgICAgIE05ISAgICAgICApNCAgICBNQiEgICAgICAgKTQgICAgTVE5ICAgICAgICk0ICAgIE46OSAgIAorTSAgICApNCAgICBOU0AgICAgICAgICAgICAgTzVAICAgICAgICAgICAgIE9HQCAgICAgICAgICAgICBQLgorTUAgICAgICAgICAgICAgUEdAICAgICAgICAgICAgIFElQCAgICAgICAgICAgICBRQ0AgICAgICAgICAgIAorTSAgUV1AICAgICAgICAgICAgIFI/QCAgICAgICAgICAgICBTIkAgICAgICAgICAgICAgUz9AICAgICAgIAorTSAgICAgIFNbQCAgICAgICAgICAgICBULUAgICAgICAgICAgICAgVEBAICAgICAgICAgICAgIFRYQCAgIAorTSAgICAgICAgICBVJEAgICAgICAgICAgICAgViJAICAgICAgICAgICAgIFcmQCAgICAgICAgICAgICBYNAorTUAgICAgICAgICAgICAgWStAICAgICAgICAgICAgIFk4QCAgICAgICAgICAgICBZQkAgICAgICAgICAgIAorTSAgWU1AICAgICAgICAgICAgIFo2QCAgICAgICAgICAgICBaXEAgICAgICAgICAgICAgWzEpICAgICAgIAorTSk0ICAgIFtHKCAgICAgICAgICAgICBbXikgICAgICAgKTggICAgXDQhQCAgICAgIiAjUCAgIFxDKSAgIAorTSAgICApOlggICBcTiEgICAgICAgKTxAICAgXFYhICAgICAgICk8QCAgIF0lOSAgICAgICApPEAgICBdTgorTTkgICAgICAgKTxAICAgXidAICAgICAgICAgICAgIF5JQCAgICAgICAgICAgICBeW0AgICAgICAgICAgIAorTSAgX0JAICAgICAgICAgICAgIF9bQCAgICAgICAgICAgICEgOUAgICAgICAgICAgICAhIFdAICAgICAgIAorTSAgICAgISExQCAgICAgICAgICAgICEhU0AgICAgICAgICAgICAhIjZAICAgICAgICAgICAgISJTQCAgIAorTSAgICAgICAgICEjL0AgICAgICAgICAgICAhI0FAICAgICAgICAgICAgISNUQCAgICAgICAgICAgICEkLAorTUAgICAgICAgICAgICAhJDhAICAgICAgICAgICAgISU2QCAgICAgICAgICAgICEmOkAgICAgICAgICAgIAorTSAhJ0hAICAgICAgICAgICAgISg/QCAgICAgICAgICAgICEoTEAgICAgICAgICAgICAhKFZAICAgICAgIAorTSAgICAgISkhQCAgICAgICAgICAgICEpSkAgICAgICAgICAgICAhKjBAICAgICAgICAgICAgISpFKCAgIAorTSAgICAgICAgICEqWSggICAgICAgICAgICAhKzYoICAgICAgICAgICAgIStIISAgICAgICApPEAgICErTAorTTkgICAgICAgKTxAICAgICAxICNfX1AgICk8QCAgIStTISAgICAgICApPEAgICErXSEgICAgICAgKUQgIAorTSAhLCQhICAgICAgIClIQCAgISwuISAgICAgICApTEAgICEsNiEgICAgICAgKUxAICAhLDohICAgICAgIAorTSlNQCAgISxCISAgICAgICApTiAgICEsSyEgICAgICAgKU8gICAhLFMhICAgICAgIClPICAgISxcISAgIAorTSAgICAqVkAgICEtKyEgICAgICAgKlxAICAhLTMhICAgICAgICpdICAgIS1AISAgICAgICAqXSAgICEtSgorTSEgICAgICAgKzRAICAhLVMhICAgICAgIC03ICAgIS1cISAgICAgICAtOkAgICEuJiEgICAgICAgLVogIAorTSAhLiwhICAgICAgIC1aICAgIS41ISAgICAgICAuJyAgICEuPSEgICAgICAgLicgICAhLkEhICAgICAgIAorTS4oICAgIS5JISAgICAgICAuKCAgICEuTSEgICAgICAgLikgICAhLl0hICAgICAgIC4pICAgIS8hISAgIAorTSAgICAuKiAgICEvLyEgICAgICAgLiogICAhLzMhICAgICAgIC4rICAgIS87ISAgICAgICAuKyAgICEvPworTSEgICAgICAgLiwgICAhL0ohICAgICAgIC4sICAgIS9OISAgICAgICAuLSAgICEvWyEgICAgICAgLi0gIAorTSAhL18hICAgICAgIC4uICAgITAmISAgICAgICAuMUAgICEwMSEgICAgICAgLjYgICAhMDshICAgICAgIAorTS43ICAgITBFISAgICAgICAuQUAgICEwUCEgICAgICAgLkMgICAhMFghICAgICAgIC5HICAgITEiISAgIAorTSAgICAvMEAgICExKiEgICAgICAgLzkgICAhMTMhICAgICAgIC8+ICAgITE8ISAgICAgICAzX0AgICExSQorTSEgICAgICAgM19AICAhMVEhICAgICAgIDQjQCAgITFaISAgICAgICA0KSAgICEyIyEgICAgICAgNCsgIAorTSAhMiohICAgICAgIDQ1QCAgITIzISAgICAgICA0SEAgICEyPCEgICAgICAgNEtAICAhMkghICAgICAgIAorTTgwQCAgITJRISAgICAgICA4MkAgICEyWiEgICAgICAgODVAICAhMyMhICAgICAgIDg5ICAgITMsISAgIAorTSAgICA4P0AgICEzNyEgICAgICAgOF1AICAhM0IhICAgICAgIDlCICAgITNRISAgICAgICA8VkAgICE0IAorTSEgICAgICAgPikgICAhNCohICAgICAgID4/QCAgITQ1ISAgICAgICA+SkAgICE0RCEgICAgICAgQCsgIAorTSAhNFMhICAgICAgIEInICAgITRfISAgICAgICBCSSAgICE1JiEgICAgICAgQkkgICAhNSohICAgICAgIAorTUJKICAgITUzISAgICAgICBCTyAgICE1PSEgICAgICAgQlMgICAhNUQhICAgICAgIEJTICAgITVIISAgIAorTSAgICBCVCAgICE1USEgICAgICAgQl0gICAhNVohICAgICAgIEJfQCAgITYjISAgICAgICBDISAgICE2KworTSEgICAgICAgQycgICAhNjQhICAgICAgIEMuICAgITY9ISAgICAgICBDMEAgICE2RyEgICAgICAgQzQgIAorTSAhNlQhICAgICAgIEM0ICAgITcjISAgICAgICBDNCAgICE3LCEgICAgICAgQzQgICAhNzAhICAgICAgIAorTUM1ICAgITc5ISAgICAgICBDPkAgICE3QCEgICAgICAgQz5AICAhN0QhICAgICAgIEM/QCAgITdOISAgIAorTSAgICBDSiAgICE3VyEgICAgICAgQ0ogICAhOCAhICAgICAgIENKICAgITgkISAgICAgICBDSyAgICE4KAorTTkgICAgICAgQ0sgICAgICAxICNfX1AgIENLICAgITgvITAgI0ggICApRCAgICE4NSBQICAgICAgICAgIAorTSAhOD8hMCAlI0AgICgiICAgIThFITAgICAgICAoVjggICE4SyEwICM4QCAgKElAICAhOFchMCAmWEAgIAorTSlNQCAgITheIVAgJTxAICIgICAgICE5JyEwICQwICAgKTxAICAhOS8hMCAjSSAgIChJQCAgITk7ITAgIAorTSAgICAoSiAgICE5SCEwICAgICAgKEpYICAhOVwhMCAgICAgIChLUCAgIToyITAgICAgICAoTEggICE6QAorTSEwICAgICAgKE1AICAhOlUhMCAgICAgIChOOCAgITssITAgICAgICAoTzAgICE7OCEwICAgICAgKFAoIAorTSAhO0shMCAgICAgIChRICAgITwgITAgICAgICAoUVggICE8LSEwICAgICAgKFJQICAhPEEhMCAgICAgIAorTShTSCAgITxXITAgICAgICAoVEAgICE9JSEwICAgICAgKFU4ICAhPTQhMCAgICAgICk6WCAgIT08IjAgIAorTSAgICJMJSAgICE9RCIwICAgICAiTCUoICAhPVMiMCAgICAgIkwlMCAgIT4kIjAgICAgICJMJTggICE+LQorTSIwICAgICAiTCVAICAhPj0iMCAgICAgIkwlSCAgIT5PIjAgICAgICJMJVAgICE+ViIwICAgICAiTCYgIAorTSAhPyQiMCAgICAgIkwmMCAgIT80IjAgICAgICJMJkAgICE/PCIwICAgICAiTCZQICAhP0siMCAgICAgIgorTUwnICAgIT9cIjAgICAgICJMJzAgICFAJSIwICAgICAiTCdAICAhQC8iMCAgICAgIkwoICAgIUA9IjAgIAorTSAgICJMKCggICFAUiIwICAgICAiTCgwICAhQSkiMCAgICAgIkwoQCAgIUE4IjAgICAgICJMKFAgICFBTgorTSIwICAgICAiTCkgICAhQiYiMCAgICAgIkwpQCAgIUIzIjAgICAgICJMKiAgICFCRyIwICAgICAiTCpAIAorTSAhQl0iMCAgICAgIkwrICAgIUMrIjAgICAgICJMK0AgICFDQCIwICAgICAiTCwgICAhQ1ciMCAgICAgIgorTUwsQCAgIUQmIjAgICAgICJMLSAgICFENiIwICAgICAiTC4gICAhREYiMCAgICAgIkwuMCAgIURdIjAgIAorTSAgICJMLkAgICFFNiIwICAgICAiTC5QICAhRUciMCAgICAgIkwvICAgIUVfIjAgICAgICJMLzAgICFGOQorTSIwICAgICAiTC9AICAhRkgiMCAgICAgIkwvUCAgIUZeIjAgICAgICJMMCAgICFHNiIwICAgICAiTDAwIAorTSAhR0YiMCAgICAgIkwwQCAgIUddIjAgICAgICJMMFAgICFINiIwICAgICAiTDEgICAhSEciMCAgICAgIgorTUwxMCAgIUhZIjAgICAgICJMMUAgICFJIiIwICAgICAiTDFQICAhSS4iMCAgICAgIkwyICAgIUk5IjAgIAorTSAgICJMMjAgICFJQiIwICAgICAiTDJAICAhSUoiMCAgICAgIkwzICAgIUlSIjAgICAgICJMPCAgICFJWworTSIwICAgICAiTDxAICAhSiUiMCAgICAgIkw9ICAgIUowIjAgICAgICJMPyAgICFKOyEwICAgICAgKTQgIAorTSAhSk4iMCAgICAgIkxAQCAgIUpdIVAgICAgICIgI0AgICFLLiFQICAgICAiICQgICAhS0AhMCAgICAgIAorTSk4ICAgIUtTIjAgICAgICJMQSAgICFMIiEwICY9ICAgKUhAICAhTCshMCAgICAgIClMWCAgIUwyITAgJgorTVkwICApPEAgICFMPiEwICI+ICAgKlxAICAhTEQhMCAlJkAgICpWQCAgIUxRITAgI0VAICApTyAgICFMWworTSIwICdCMCAiTEFAICAhTSshMCAmSlAgICtQQCAgIU0zITAgKCcgICApTiAgICFNOiFQICdFUCAiICQwIAorTSAhTUEhMCAkVzAgICo+OCAgIU1KITAgIjlAICApXyAgICFNUyEwICM+MCAgLCFYICAhTVkhUCAlXkAgIgorTSBJMCAgIU4hITAgJjMgICApWTAgICFOKSEwICQ5ICAgKkgoICAhTjMhMCAgL0AgICo2KCAgIU49ITAgIAorTSAgICAuKDggICFORCEwICUpUCAgKlQgICAhTk4hMCAgICAgIC4nOCAgIU5VITAgJyxQICAtNyAgICFOXQorTSEwICYgMCAgKVA4ICAhTyUhMCAlOjAgIC1SICAgIU8tIjAgIyggICJKWlAgICFPMyFQICM8QCAiICRQIAorTSAhTz4hMCAkNTAgICpeQCAgIU9IIVAgJkBQICIgJUAgICFPWiFQICU1MCAiICYgICAhUCEhUCAmSjAgIgorTSAmMCAgIVAqIVAgI1JQICIgJVAgICFQOyFQICM/QCAiICUwICAhUEwhUCAmO1AgIiAlICAgIVBfITAgJworTVVQICAtWiAgICFRJyEwICMuICAgKl0gICAhUTMhMCAlSSAgIC43ICAgIVE8ITAgJCowICAuQyAgICFRRAorTSEwICJMQCAgLkFAICAhUU4iMCAjSiAgIkxBUCAgIVFcIVAgIytAICIgSVAgICFSIiEwICYtUCAgLDhIIAorTSAhUishMCAjUDAgIC4uICAgIVIxITAgICAgICAuKjggICFSPiEwICZcMCAgLzBAICAhUkUhUCAjUEAgIgorTSArQCAgIVJOIVAgIzMwICIgJyAgICFSWiFQICcsQCAiICsgICAhUyEhUCAiSEAgIiArMCAgIVMqITAgIAorTSAgICAuKzggICFTMSEwICQ/QCAgLTpAICAhUzshMCAgICAgIC4pOCAgIVNKITAgIkhQICAtQ1AgICFTWAorTSEwICQ1UCAgLU0oICAhVCQhMCAlOlAgIC85ICAgIVQsIjAgJz9QICJMQiAgICFUNiEwICAgICAgLi04IAorTSAhVEIhMCAnPiAgIC4xQCAgIVRNITAgI0hQICAuNjggICFUViEwICAgICAgLiw4ICAhVSAiMCAgICAgIgorTUxUUCAgIVUlIVAgIC8wICIhMVAgICFVLCEwICAqMCAgLkcgICAhVTQhMCAkVTAgIC5LQCAgIVU/ITAgIgorTT9AICAvPiAgICFVSCIwICNeQCAiTEogICAhVVEhUCAoPlAgIiE9MCAgIVVbITAgJz5QICAzX0AgICFWIgorTSEwICZeUCAgLzxQICAhVikhMCAjPDAgIDQrICAgIVYvITAgIDVAICA4NUAgICFWNyFQICJRUCAiIT1QIAorTSAhVkAhMCAmVCAgIDRIQCAgIVZIITAgJyMgICA0I0AgICFWUCEwICEmQCAgQjQ4ICAhVlshMCAoQiAgIAorTThMWCAgIVclITAgICJAICA4MEAgICFXLSEwICU0ICAgN0M4ICAhVzkhMCAjXyAgIDMuSCAgIVdEITAgIAorTSkgICA0KSAgICFXTCEwICVRUCAgPikgICAhV14hMCAhRkAgIEJDUCAgIVgpITAgIDpAICA5OlggICFYMworTSEwICBGQCAgQicgICAhWD4hMCAoIiAgIDg/QCAgIVhIITAgIiUwICAzR1ggICFYUSBQICQ2XiAgICAgIAorTSAhWFshMCAmXCAgIDQ+QCAgIVkkITAgJihAICA0QyggICFZLSEwICVRMCAgNEYoICAhWTYhMCAoITAgIAorTTRHQCAgIVk/IjAgJFNAICJMSjAgICFZTCEwICU+ICAgNDtAICAhWVYhMCAmTTAgIDQ9ICAgIVlfITAgJQorTVUwICA0QCAgICFaKCEwICcoQCAgNDcgICAhWjEhMCAmJUAgIDRESCAgIVo6ITAgJlZAICA0QUAgICFaQworTSEwICVNUCAgNDVAICAhWkwhMCAlUCAgIDQ6ICAgIVpVITAgJklAICA0OEAgICFaXiEwICAgICAgQkk4IAorTSAhWyQhUCAnQkAgIiIkMCAgIVsrITAgJVAwICA1USAgICFbPCIwICFZMCAiTEsgICAhW0chMCAiXyAgIAorTTdEMCAgIVtUITAgKEcgICBCXSAgICFbXCIwICdPUCAiTEwgICAhXCYhMCAlUVAgIDRLQCAgIVwxITAgIAorTTUwICA4OSAgICFcOSEwICY+MCAgOCkoICAhXEchMCAgNlAgIDVXKCAgIVxaITAgJllQICBCVCAgICFdIgorTSIwICVcMCAiTE0gICAhXSwhMCAgJEAgIDgyQCAgIV00ITAgICAgICBCUzggICFdOiEwICgxMCAgNlk4IAorTSAhXUYhMCAgKDAgIEJfQCAgIV1OIVAgJlogICIhTjAgICFdXiFQICNVICAiIVAgICAhXikhMCAmOCAgIAorTUMnICAgIV4xIVAgIjcgICIiICggICFeOiEwICBTUCAgQzBAICAhXkMiMCAgSEAgIkxTUCAgIV5RIjAgJworTT0gICJMVCAgICFfKCIwICBIMCAiTFQwICAhX0AiMCAjRCAgIkxUQCAgIV9XITAgJEVAICA8RTggICIgKgorTSEwICM9QCAgOT9YICAiIDAhMCAmTiAgIDhdQCAgIiA3ITAgKEIgICA5UyAgICIgUiEwICU3MCAgPys4IAorTSAiISkhMCAnXiAgIDlCICAgIiE4ITAgJEggICBAMyggICIhUCEwICY0QCAgOi4oICAiIiwhMCAjVFAgIAorTTxWQCAgIiI7ITAgIDFAICBCTyAgICIiRCEwICEzICAgQC0oICAiIlUhMCAmICAgID9ISCAgIiMtITAgJworTSggICBALlggICIjRSEwICVQUCAgPTdAICAiI1UhMCAkNlAgID0sICAgIiQkITAgJUcgICA8TTAgICIkOgorTSEwICdPICAgOltIICAiJFAhMCAmQyAgID9cSCAgIiUsITAgIFhQICA9VDAgICIlPyEwICZXUCAgPUooIAorTSAiJVEhMCAkLiAgID0zSCAgIiYgITAgIkcgICA9KkggICImMyEwICclMCAgPj9AICAiJjohMCAiKiAgIAorTT4sWCAgIiZVITAgIFkgICA+NEAgICInMCEwICFBMCAgPkQgICAiJ0YhMCAhOCAgID5GUCAgIidcITAgIAorTTIgICA+QFAgICIoLiEwICA3ICAgPkpAICAiKD0hMCAjMDAgID85QCAgIihRITAgJiowICA/JUggICIpJworTSEwICgrUCAgP0AwICAiKUIhMCAjJyAgID8xOCAgIilWITAgJiEgICA+XTAgICIqLCEwICUrICAgPlVIIAorTSAiKkAhMCAlRSAgID5NWCAgIipOITAgIS4gICA+WjggICIrISEwICMhQCAgPlZYICAiKzUhMCAmKkAgIAorTT5SICAgIitFITAgJF8gICA+TlggICIrUyEwICVPICAgP1UgICAiLCQhMCAoJiAgIEJKICAgIiwsIVAgJworTVlAICIsKyAgICIsSyFQICNKICAiQkFIICAiLSwhUCAnOCAgIj1EMCAgIi1MIVAgKDxAICIsKSAgICIuIworTSFQICVYICAiQjYoICAiLjwhUCAoPyAgIj1DQCAgIi5UIVAgIU1AICIiVTggICIvJSFQICRSQCAiPUlQIAorTSAiLzghUCAjSEAgIj1CWCAgIi9KIVAgJlNAICIiVTAgICIvXyFQICdbQCAiPUlIICAiMDYhUCAlLSAgIgorTT1CUCAgIjBMITAgI1gwICBAKyAgICIxJCEwICZWICAgQyEgICAiMSshUCAoRVAgIj1AQCAgIjFCIVAgJgorTSEwICJIPTggICIxWyFQICAgUCAiPUc4ICAiMjMhUCAhVlAgIiwtICAgIjJEIVAgJFtQICJCTSggICIyVworTSFQICNRUCAiPUUgICAiMykhUCAmXFAgIiwsWCAgIjM+IVAgKCRQICJCTSAgICIzVSFQICU2MCAiPURYIAorTSAiNCshMCAnSEAgIEMuICAgIjQzITAgICAgICBDPlggICI0OSEwICdOICAgQzUgICAiNEEhMCAgICAgIAorTUM0OCAgIjRJITAgIztAICBDP0AgICI0UiFQICVQQCAiSEgwICAiNF8hMCAgICAgIENKOCAgIjUnIVAgIgorTUZAICJIXyAgICI1MSEwICAgICAiICAgICAiNTghUCAgICAgIkpaUCAgIjU/IjAgICAgICJMVFAgICI1RQorTStWUUk4Ql1DPEcwUCtGXCArVlFJOEJdLThXKVQsMllPICY9RDhGVUUrRlwgOVYtQyxFXUM7VlVQOjZRRQorTTkiWCArVi1ZOVZFTj0iXVA7JiVZK1Y5TjlCXUQ5NzlPK1Y9RDhHMUU8VzBPPSMkUCtQIUc5JilNOTJZQworTSAmRU49I0lULDNVUiwzTE0sQyRULVMwWCxTOFQuI0xSLDMwVy0jQFMtQzBXLlAhQzomJVIuRzBSLzcoUgorTS5TIFssMyhXLlAhTDtWWUcoJkVOPSNJVCxTVVIsM0xNLEMkVC1TMFgsUzhULiNMUiwzMFctI0BTLUMwVworTS5QIVU7Ry1JOVZZRTkiIUk7RzBaPSMwXTxDJFssI0xNLDNMIDsmXU45UiFVO0ctSTlWWUU5IiFJO0cwWgorTT0jNF08QyRbLCNMTSwzTCA8VkFPPEcwQDo2WVQuRzBWLzcoUS5SVFMsQzxWLiNMUyxDPFYtU0wgOyZdTgorTTlSIUw7VllHKCZFTj0jSVQtU1VSLDNMUC5SVFEuUCFTOiZdUj0iIVU7Ry1JOVZZRTkiIUk7RzBaPSNAXQorTTxDJFssI0xWLTM0Uy0zTCA7Jl1OOVIhTDtWWUcoJzVOPFZFRztGNUQoJkVOPSNJVC4zVVIsM0xQLlJUUQorTS5QIVM6Nj1OOTYwQDhWQUE8Q0lULDMgXTxDJFsrMyRSLiNMUSxDPFsgJzVOPFZFRztGNUQoJi1IODcoWgorTT0jJFEvNyhRLlMgWyxDNFUuUCFGOyZdQT0jSVQsMyhdPEMkWy0jTFAuUCFEO1c1QjsmNFo9IyRTLzcoUQorTS5TQFssI0wgOyZdTjlSIUQ7VzVCOyY0Wj0jJFQvNyhRLlNAWywjTCA9Rl1JOSNJVCwzNF0sMzQgPSVdUworTT0nKVU4VzBaNSMkVi83LFItJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVI9JV1NOTZVQgorTTk3KFotQlBRLUJQUS1DTTwgJzk/OjZZVDdWVUU7NilFPENIUSsjLFIrIyxSLlc5PzsmXU45VV1NOTZVQgorTTk3KFosUlBWLSJQUyxDTTwgJzk/OUZRTzg3MT87NjVNOEY1Ui5DJFIrI0RWKyMsUi5XOT85Jl1VOEZRRQorTTdWVUU7NilFPENIUSxSUFEsQ0BMLUMwWy5QIVQ3VzVOOjZdTi5FMFEtU1VVLic5PzhWQUE8RV1NOTZVQgorTTk3KFosQlBQKyNAWz1FXVM6Jl1SPSVdTTk2VUI5NyhaLUJQUCsjJFYuVVAgPUVdSTtHMT87NjVNOEY1UgorTS5DJEwsIlBTLENNVjdWUU87Rj0/OzY1TThGNVIuQyxMLCJQUyxDTTwgJzk/OUZRTzg3MT87NjVNOEY1UgorTS5DJFIrIyBMLFMoWz1FXUQ7VzVCOyY1Pzs2NU04RjVSLkMkUysjIEwtQzBbLlAhVjdWLUg4Nyk/OUc1TgorTThTSSYsQCFWN1ctSTlWWUU5JV1DOiYlUjdWOVU7RixaMUMkUCAnOT89NllTOjY9Tjk2MT84VkFBPEVdRgorTT02WUMuRDhRLDAhVjdXLUg7VylUN1Y5VTtGLFoxQzggPUVdUzo2PU45NjE/PFZBTzxHMT85RzVOOFNJJgorTS1AIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdWOVU7RixaMUNAID1FXUk7RzE/OUc1TjhTSSYsMCFWN1ctSQorTTlWWUU5JV1JO0cxPzlHNU44U0kmLDAhVjdXNU48VkVHO0Y1RDdWRU49JV1GPTZZQy5EOFQgJzk/OyZdTgorTTlVXUY9NllDLkQ4UyAnOT88VkVHO0Y1RDdWUU87Rj0/OUc1TjhTSSYsUCFWN1c1TjxWRUc7RjVEN1ZRTworTTtGPT85RzVOOFNJJi0wIVY3VjlMO1YlVDdWOVU7RixaMUMkUiAnOT85Jl1VOEZRRTdWOVU7RixaMUMkUworTSAmUUk7RkxaNSMkWC83LFEtMylOOTdBVC5DJFkvMkhRLiJQUCsjLFIuVlFJO0ZNRj02WUMuQyhQLzJIUgorTSwzVUYsM0RMLFMoTCxTKFs3ICFTPSc1RjlDSFIsQ1VBPEMkWywjTFAuUyhTLzYlUiwzTFAuUyRbLEMwXQorTTg3KFEuUyBbLENMUS1CUFYtIlBRLDM0Ui5TTCA9JzU/OyZFTjpTSTQsQzRdPTMkVC0mWUU+JzBaLDNETAorTSwiUFMsQ01MOjZZSzlHNU44U0hSLCJQUCsjLFIuVVAgPFcxVTlGOFosQyhMLCJQUSwzNFIuU0wgOFZdTAorTTtXKVMuRTBSLUNVRT42NUw7Jl1XLkMgTDwnNVI8JlFFLkMkTDwmRU46U0hSKyNMIDhWJVI8U0k0LEM8XQorTTk2KU09U0hQKychTzxHLUM6JjRaLDJQWyAmKU87VlFFODZYWj0jKFgvNjUmMDRRMzEzSFArJTEyNTQ0WgorTSwyUFsgJilWODZRUy5FMFIuM1VFOUYlTDxWNFosIlFUPEc1RS5DJEwuUCFCO1ZdTDk2JU4sQ0lULENEIAorTTs2RVM7VylEOTcpRTkjSTQsUyBdOTcxVztTSFIrJl1OOTNIUSsnSUU8RlxaLCJRVDonKUU5M0hTKyNMIAorTTs2JUk7Q0kmLDAhVjdWLUg4NyhaMVMoID1FXVM6Nj1OOTYxPzhWQUE8Q0knLDMgID1FXVU7Ry1JOVZZRQorTTklXUM6JiVSLkQ8USwwIVY3Vy1IO1cpVC5EPFYgJzk/PFZFRztGNUQ3Vy1IO1cpVC5EPFYgJzk/PTZZUworTTo2PU45NjE/PFZBTzxHMFoxU0AgPUVdSTtHMFoxUyQgPUVdUzo2PU45NjE/OjZZVC5EPFEgJzk/PTZZUworTTo2PU45NjE/OjZZVC5EPFQgJzk/OyZdTjlTSScsUCFWN1ctSTlWWUU5JV1MO1ZZRy5EPFMgJzk/PTZZUworTTo2PU45NjE/OyZdTjlTSSctMCFWN1Y5TDtWJVQuRDxRLEAhVjdWMU89NilMOTNJJywzLCA9RV1DOiYlUgorTTdWJVI8RiVZLkQ8UywzVUE8QyRbLCNMUS5TKCA9RV1TOjY9Tjk2MT84VkFBPEVdQTxHKUE+M0knLFMoXQorTTg3KFEuUyBbLDNMUSwgIVY3VzVOPFZFRztGNUQ3Vi1IODcpPzg3KVI4N0RaMVMsUy82JVIsM0xQLlMkWworTSwzJCA9RV1TOiZdUj0lXUE8RylBPjNJJyxTMF04NyhRLlMgWywzTFYgJzk/PFZFRztGNUQ3Vy1IO1cpVAorTTdWJVI8RiVZLkQ8Uy0gIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZLkQ8Uy0zVUE8QyRbLCNMUQorTS5TQCA9RV1JO0cxPzg3KVI4N0RaMVMsVi82JVIsM0xQLlMkWywwIVY3Vy1JOVZZRTklXUk7RzE/ODcpUgorTTg3RFoxUyxWICc5Pz02WVM6Nj1OOTYxPzo2WVQ3ViVSPEYlWS5EPFMtU1VBPEMkWywjTFEuUzAgPUVdTAorTTtWWUc3ViVSPEYlWS5EPFMuI1VBPEMkWywjTFEuUywgPUVdUzo2PU45NjE/OyZdTjlVXUE8RylBPjNJJworTSxTQCA9RV1VO0ctSTlWWUU5JV1MO1ZZRzdWJVI8RiVZLkQ8Uy4zVUE8QyRbLCNMUS5TNCA9RV1GOyZdQQorTT0lXUE8RylBPjNJJy0jIF04NyhRLlMgWywzTFEsQCFWN1YxTz02KUw5NV1BPEcpQT4zSSctIyRdODcoUQorTS5TIFssM0xRLFAhVjdWLUg4Nyk/PCZdSTtHMUU8Q0knLSMoXSpDKCA9RV1TOjY9Tjk2MT84VkFBPEVdUAorTTtWRU49JjVSLkQ8VCxTVEosMyAgPUVdVTtHLUk5VllFOSVdQzomJVI3VyFPOjZZVDk3KFoxUzBULzJIUQorTSwwIVY3Vy1IO1cpVDdXIU86NllUOTcoWjFTMFUvMkhWICc5PzxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVAorTTk3KFoxUzBVICc5Pz02WVM6Nj1OOTYxPzxWQU88RzE/PCZdSTtHMUU8Q0knLSM4XSpDQCA9RV1JO0cxPworTTwmXUk7RzFFPENJJy0jPF0qQyQgPUVdUzo2PU45NjE/OjZZVDdXIU86NllUOTcoWjFTMFcgJzk/PTZZUworTTo2PU45NjE/OjZZVDdXIU86NllUOTcoWjFTMFgvMkhUICc5PzsmXU45VV1QO1ZFTj0mNVIuRDxULjNUSgorTSxQIVY3Vy1JOVZZRTklXUw7VllHN1chTzo2WVQ5NyhaMVMwWSAnOT89NllTOjY9Tjk2MT87Jl1OOVVdUAorTTtWRU49JjVSLkQ8VSwjVEotMCFWN1Y5TDtWJVQ3VyFPOjZZVDk3KFoxUzRRLzJIUSxAIVY3VjFPPTYpTAorTTk1XVA7VkVOPSY1Ui5EPFUsQ1RKLDMsID1FXVM9JylVOFcwUS5EPFEtQCFWN1ctVDxHNUM9IyhaMVM0UworTS83LFItJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVI9JV1NOTZVQjk3KFotQlBRLUJQUQorTS1DTTwgJzk/OjZZVDdWVUU7NilFPENIUSsjLFIrIyxSLlc5PzsmXU45VV1NOTZVQjk3KFosUlBWLSJQUworTSxDTTwgJzk/OUZRTzg3MT87NjVNOEY1Ui5DJFIrI0RWKyMsUi5XOT85Jl1VOEZRRTdWVUU7NilFPENIUQorTSxSUFEsQ0BMLUMwWy5QIVY3VzVOOjZdTi5EPFEtUCFWN1c1Tjo2XU4sQ0knLTMwXT0zQVY3Vi1IODcpPworTTs2NU04RjVSLkMoTCwiUFguVzk/PFZBTzxHMT87NjVNOEY1Ui5DOEwsIlBRLUNNPCAnOT86NllUN1ZVRQorTTs2KUU8Q0hRKyMgTCxTKFs9RV1MO1ZZRzdWVUU7NilFPENIUysjIEwsUyhbNyAhVjdWOUw7ViVUN1ZVRQorTTs2KUU8Q0hRLEJQUCsjLFIuVzk/OSZdVThGUUU3VlVFOzYpRTxDSFEsUlBQKyM4VC5TTCA8VV1MOjZZSworTS5EPFEuMCFVN1ZRSTtGTFoxUyhVICchUjo2VUE8R0RaMVM0VS82NVI5NjBaLCJRRzxGNUU7Q0hRKyYpTAorTT02NFosQlBbICZZTztHIVI6NlVBPEdEWjFTKFYgJi1MPTZZSzk3KFoxUzRWLzY1QzomNVY+M0hQKyY5TworTTxGMFosMlBbICctUDtXKVQ8Vi1BPENJJyxDPCA3VV1NODZFTitGXCA5Vi1DLEVdQztWVVA6NlFFOSJYIAorTStXLUU7RjFBOjJdQThGLE88RkVDOiJdTDg3MUU8VzBPO1YpSjkmRVIrNy1VO0MsTzlWLUMrUCBOK0JcTgorTStCXUQ5NzlPK1Y9QzhSXUw6NilHOFYsUitGLCA6NllULkcwUS83KFEuUlRSLDMwVy0jQFMtQzBYLlMoUQorTS0jPFQuIyxWLSM8WyAmLUg4NyhaPSMoXTxDKFssI0xRLEM8WyAmUU87RjxAOjZZVC5HMFMvNyhRLlJUUgorTSwzMFctI0BTLUMwWC5TKFEtIzxULiMsVi0jPFsgJzVOPFZFRztGNUQoJkVOPSNJVC0jVVIsM0xQLlJUUQorTS5QIUw7VllHKCc1TjxWRUc7RjVEKCZFTj0jSVQtM1VSLDNMUC5SVFEuUCFTOiZdUj0iIUk7RzBaPSM4XQorTTxDJFsrMyxSLVM4WC5TLFItUzhXLlAhTDtWWUcoJlFPO0Y8QDo2WVQuRzBXLzcoUS5TIFsrMyRbICctSAorTTtXKVQoJzVOPFZFRztGNUQoJkVOPSNJVC4jVVIsM0xQLlM4VS0zLFUuUCFMO1ZZRygmUU87RjxAPTZZUworTTo2PU45NjBAOjZZVC5HMFkvNyhRLlMgWyszJFsgJy1JOVZZRTkiIUM6JiVSLkcwUSwjVVIsM0xNLDMoWAorTS5TJFItU0wgPTZZUzo2PU45NjBAOFZBQTxDSVQsMyRdPEMkWywjTFItMzRbICY5TDtWJVQuRzBRLENVUgorTSwzTFQuUyBbICYxTz02KUw5M0lULDMsXTxDJFsuI0xQLlAhTDtWWUcoJjFPPTYpTDkzSVQsMzBdPEMkWworTS4jTFAuUCFWO1ZFRC5HMFEtM1RRLTAhUjk2PT84VlFBPFcsWjUjJFYvNjUuM1VdMjE0PTMuQyBMMyRdPworTTFFISE3VSklMVUsWiwyUSY0JCU/NEQ1JzRTSFIrJDkwN1UpJTFVLFosUlE8ICQ5MDdUXTI3VDkwMDVdMgorTTE0PTMuQzBMMSQlNDA1XTIxND0zLkM0TDEkJTQwNV0vNEVdJjQkJT80RDUnNFNIViskMSE1JCU/M1UpPworTTFFIT80RDUnNFNIVyslUCAxJCU0MDVdLzRFXSY0JV0vNEVdJjQkJT80RDUnNFNIWCskJSQxJSk/NEQ1JworTTRTSFkrJD0lM0Q1MjA0UT80RDUnNFNIUSwiUScxNFklNEQlLDdUXTI3VDkwMDVdMjE0PTMuQyRRKyVQIAorTTFUNS4xNSkhMyVdLzRFXSY0JV0yMTQ9My5DJFIrJCUsMyVdMjE0PTMuQyRTKyRRKTM1XTIxND0/MFRRIQorTTRVLSU0U0hRLSJQWyAnIVQ8RjFJOUY5Pz0jSVQsMCFTOjdJRTdXMFo9IyQgPVYtSDg3KT89I0lULiAhTAorTTtWWUc7Jl1OOVNJNCwzPF08U0FIOjY9SC5DLEwsIlBTLENNTDtXPFosUlBTLEJQUyxDTFsgJlFPO0Y9PworTTsmXU45U0lULDNAXT0zQVMuQyRXKyMgTC1DMFs7JlBaLVJQUCsjOFQuU0wgOUc1TjhVXVA9JyhaPSMkWQorTS8ySFIsI1VGLDM0IDdVXUQ7VV1HOyZdQjg2UT85JzFPPEcsWjFDJFUgJV1FPiZFVDdWMVU7NlVZN1cpRQorTTlDSScsQyRdKkMkIDdVXUQ7VV1HOyZdQjg2UT84VzFPPEcsWjFDJFUgJV1JO0ZFVDo2JUw6N0lFOSJYUAorTSAlXT87NiVJO0NJJiwzNCA3VjVYOjcwTjtQIUc4VixSN1YtTzs3IUk7JjVEK0AgTzxWNU45JiVJK1YlQgorTThSXVI6Ni1IK1ZRQT0mNVM9Il1POEZJRDo3KE08VzVOLFJdRzhWLE8gIlhOK1JYTitWMUU9RlxPOVYtQworTStWUUk4Rj1DOFMoTjhQIUk7RzBaPSMkXTxDJFsrMyhRLSM8VC4jLFYtI0BbLEMkVC1TMFgsUzhULVNMIAorTThWQUE8Q0lULENVUixDTFAuUyRSLVNMIDsmXU45UiFJO0cwWj0jLF08QyRbKzMoUS0jPFQuIyxWLSNAWworTSxDJFQtUzBYLFM4VC1TTCA9NllTOjY9Tjk2MEA6NllULkcwVC83KFEuUyBbKzMkWyAmUU87RjxAPTZZUworTTo2PU45NjBAOjZZVC5HMFUvNyhRLlMgWyszJFsgJy1IO1cpVCgmRU49I0lULUNVUiwzTE0sUyhXLUNAWworTSxTKFctQzxbICZRTztGPEA7Jl1OOVIhSTtHMFo9IzxdPEMkWywjTE0sM0wgPFZBTzxHMEA9NllTOjY9TgorTTk2MEA6NllULkcwWC83KFEuUyBbLUM0VSxTNFsgJlFPO0Y8QDsmXU45UiFVO0ctSTlWWUU5IiFJO0cwWgorTT0jRF08QyRbLCNMTSwzTCA8VkVHO0Y1RCgmLUg4NyhaPSMkUC83KFEuUlRRLENAWywzKFcuUCFVO0ctSQorTTlWWUU5IiFDOiYlUi5HMFEsM1VSLDNMUC5TKFUtM0wgOUZRTzg3MFo9IyRSLzcoUS5TMFssI0wgOSZdVQorTThGUUUuRzBRLFNVUiwzTFguUyBbICZRTztGPEA5Jl1VOEZRRS5HMFEtI1VSLDNMWC5TIFsgJzlPOjYwWgorTT0jJFUvMyRVICcpRTlVXUM7JiVTPFNJNCwzOF05NFkvN1UpJTFVLFosIlEsM1VdJjQkJT80RDUnNFNIUQorTSskOTAwNV0yMTQ9My5DKEwxRSE/NEQ1JzRTSFMrJVAgMUUhPzNVKT8xRSEhN1UpJTFVLFotIlEkMDUxIQorTTdVKSUxVSxaLTJRJDA1MSE3VF0yN1Q5MDA1XTIxND0zLkM4TDEkJTQwNV0vNEVdJjQlXTIxND0zLkM8TAorTTcgISQwNTEhN1RdMjdUOTA3VF0yN1Q5MDA1XTIxND0zLkNATDA0MSQ0RV0yMTQ9My5DREwxVDUuMTUpIQorTTMlXTIxND0zLkMkUCskPSUzRDUyMDRRPzNVKT8xRSEhN1UpJTFVLFosMyRMNyAhJzE0WSU0RCUsN1RdMgorTTdUOTA3VSklMVUsWiwzKEwwNFEsN1UpJTFVLFosMyxMMyRFLTdVKSUxVV0jMyQlMzRUNTMuQyRUKyNMIAorTTwnMVI5JkVGOUVdVC5HMFEgJy1JPkY1Pz0jSVQsMCFXOFZBQTxFXVQuRzBYICZRTztGPUw7VllHLkUwUQorTS1TVVMuJkFJOVZAWixSUFArIyxSLlZRTz1TSFMrIyxSKyMsUi5TTCA7Jl1OOVVdTDtWWUcuRzBRLiNVVQorTS4nLFosMzxMLCJQVi0jTUw7I0hXKyMgTC1DMFsuUCFGPTZZQzdXIVQ8Q0lULDNEXSpDKFAvNjhRLTAhPworTTk3QUk9JV1EPTZVTT41XUQ5Ni1MLkQ8USAlXT8wVTEvNEVdLDI1LTQ3VVxaMVMoUS82JVIsM0xQLlMkWworTSwzRCA3VV0kNSRdMjdUUSk0VTE/N1NJJyxDJCArNlFHICZRSThGPE48UCEtPFc9ST0mLUgrRlwgOTdBSQorTT0iWU8gJl1ON1Y1WDo3ME47UCFXPEZFVDkyWU8gJjVSPEAhPzk3QUk9IllPICYtRTxHKU88QllPICY1UgorTTxGWU8rRlwgOUZRUzhHNUYrRlwgOUZRTzg3MT88Vz1JPSYtSCtGXCAzNkVOOjcwTjtQIUY8JV1HOyZdQgorTTg2UVMrRlwgOzZFTjo3MUY8IllPICZVQTsmUU84UllPICZFUzg3MVQ+MllPICY5STtGMUk7VyBOO1AhSQorTTtWKE47UCFTOjY9Vjk2LE47UCFDOyZdUzkyWU8gJjVSPEAhRjxXMUE9IllPICY1UjxAIUc5NzFEPSYlQgorTTsmNVM6N0lFK0ZcIDk3KVIgJj1FPSchQTlWNVM6N0lFK0ZcIDk3KVIgJkVPOFcxTCtGXCA5NylSICctSQorTTlWKUw7Vi1LK0ZcIDk3KVIgJy1JOVctRT0mVUE8VkxOO1AhRTxHKCA8VilSOlJZTyAnLUk5VzFSODZVUAorTStGXCA3Vy1JOVc5RThSWU8gJjlQPEZFTj0mOE47UCEtOSY1Rjg3NUw9IllPICZVQS4zLU4rRlwgOUchPworTTxWJVY5MllPICYpQztXIVkrRlwgOFYlTDsmXUMrRlwgOSZdUDxGWVQrRlwgOUchPzhWXU07Nl1OPFJZTworTSAmKVo5NylPK0ZcIDs2NU08VjVUK0ZcIDxXMVI7JjVOK0ZcIDg3MU86MllPICYtVD43IUU3UllPICZVRQorTTs2LUg8QllPICctRT0mUU84ViVMOTJZTyAnLVQ8Ri1IPEJZTyAnLVQ8Ri1NPCJZTyAnLVQ8Ry1QO0JZTworTSAnLVQ8RzFPOlJZTyAmNUM7VllWOTcpVCtGXCA5Vi1PO0c5RTxHME47UCFEO1c1QjsmNT85JjVDOjZUTgorTTtQIT89NllQODYtSzdWMUI7JjROO1AhPzhGJVM5NV0zK0ZcIDdWKUE8VjU/OjZQTjtQIT88VyFSOjZZVAorTTlFXVM9NyBOO1AhPz0mRU05Ny0/PCZdVzk3KE47UCFROTYtTztHOUU8RzBOO1AhUjk2JUQrRlwgOTcpUgorTSAnIVI6NllUOUJZTyAnLVA8RkVOPSY4TjtQIU88JjVOK0ZcIDk3KVIgJlVFOzYtUD4yWU8gJy1UPEYtQQorTT0iWU8gJy1UPEYtUD4yWU8gJiVCO1cpVCtGXCA5VjVUOTZZVitGXCA8JjVSPEZdUitGXCA8VzFSPCYpUgorTTpSWU8gJV1COjY9PzwmXVc5NyhOO1AhPzxWVUE7JlE/PCZdVzk3KE47UCFHOTcxUDo2ME47UCFFPEcoIAorTTxWRUc7RiVMK0ZcIDpWRUw7IllPICY1UjxAIT88JjVSPEZdUitGXCA5NylSOyctVCtGXCA9VylJPSY1VgorTStGXCA5NylSICJVTDlQIUw6NilHK0csIDdWNVg6NzAgN1VdJDY0WSEzNEUjICctVDg3KVQgJV1NODZFTgorTSAnLVQ4NylUN1Y5TDtWJVQgJV0/OTdBST0gIT85NllWOjcpTztAIS08Vz1JPSYtSCAmOFYuI0BYLDVdVQorTTxWNUQgJV1WN1YtSDg3KT85RzVOOFAhPz1FXVM6Nj1OOTYxPzhWQUE8RV1GPTZZQyAlXVY3VzVOPFZFRworTTtGNUQ3Vi1IODcpPzlHNU44UCE/PUVdUzomXVI9JV1GPTZZQyAlXVY3Vy1JOVZZRTklXVM6Jl1SPSVdRgorTT02WUMgJV1WN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsIDdXOT86NllUN1Y5VTtGLCA3Vzk/PFZFRworTTtGNUQ3VkVOPSVdRj02WUMgJV1WN1c1TjxWRUc7RjVEN1ZFTj0lXUY9NllDICVdVjdWUU87Rj0/OUc1TgorTThQIT89RV1TOjY9Tjk2MT87Jl1OOVVdRj02WUMgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT85RzVOOFAhPworTT1FXUY7Jl1BPSVdRj02WUMgJV1WN1YxTz02KUw5NV1GPTZZQyAlXT83VlVBOjZYIDdXOT84VkFBPEAhPworTT1FXVM6Nj1OOTYxPzhWQUE8QCE/PUVdVTtHLUk5VllFOSVdQzomJVIgJV1WN1ctSDtXKVQgJV1WN1ctSQorTTlWWUU5JV1TOiZdUj0gIT89RV1VO0ctSTlWWUU5JV1TOiZdUj0gIT89RV1JO0cwIDdXOT88VkVHO0Y1RAorTTdWRU49ICE/PUVdVTtHLUk5VllFOSVdSTtHMCA3Vzk/OyZdTjlQIT89RV1TOjY9Tjk2MT87Jl1OOVAhPworTT1FXVU7Ry1JOVZZRTklXUw7VllHICVdVjdWOUw7ViVUICVdVjdWMU89NilMOTAhPz1FXUM6JiVSN1YlUgorTTxGJVkgJV1WN1ctSTlWWUU5JV1DOiYlUjdWJVI8RiVZICVdVjdXNU48VkVHO0Y1RDdWLUg4Nyk/ODcpUgorTTg3RCA3Vzk/PFZBTzxHMT84NylSODdEIDdXOT88VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkgJV1WN1c1TgorTTxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWSAlXVY3VkVOPSVdQTxHKUE+MCE/PUVdUzo2PU45NjE/OjZZVAorTTdWJVI8RiVZICVdVjdXNU48VkVHO0Y1RDdWRU49JV1BPEcpQT4wIT89RV1MO1ZZRzdWJVI8RiVZICVdVgorTTdXLUk5VllFOSVdTDtWWUc3ViVSPEYlWSAlXVY3VzVOPFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgN1c5PworTTlGUU84NzE/ODcpUjg3RCA3Vzk/OSZdVThGUUU3ViVSPEYlWSAlXVY3Vi1IODcpPzwmXUk7RzFFPEAhPworTT1FXVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIgJV1WN1c1TjxWRUc7RjVEN1YtSDg3KT88Jl1JO0cxRQorTTxAIT89RV1TOiZdUj0lXVA7VkVOPSY1UiAlXVY3Vy1JOVZZRTklXVM6Jl1SPSVdUDtWRU49JjVSICVdVgorTTdXNU48VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQ5NyggN1c5Pzo2WVQ3VyFPOjZZVDk3KCA3Vzk/PFZFRworTTtGNUQ3VkVOPSVdUDtWRU49JjVSICVdVjdXNU48VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIgJV1WN1ZRTworTTtGPT88Jl1JO0cxRTxAIT89RV1TOjY9Tjk2MT87Jl1OOVVdUDtWRU49JjVSICVdVjdXNU48VkVHO0Y1RAorTTdWUU87Rj0/PCZdSTtHMUU8QCE/PUVdRjsmXUE9JV1QO1ZFTj0mNVIgJV1WN1YxTz02KUw5NV1QO1ZFTgorTT0mNVIgJV1QPEZFTTg3KVkgJV1OO1ZZUDxGRU04NylZICVdUzwmXVI9Jy1DODcoIDdWLUw9NllLOTcoIAorTTdXLT87JkVOOlAhPz01XUw6NllLICVdVjdXNU46Nl1OICVdVjdXNU46Nl1OLEAhPz1FXVM9JylVOFcwUQorTSAlXVY3Vy1UPEc1Qz0jKCA3VV0/OSZdPzlWUU84RiVMN1YxVDtXKVMgJV0/N1QxNDNVKT8zJEUzNSVdPworTSAlXT85N0FJPSVdRD02VU0+NV1SOTY4IDdVXUU+JkVUN1YxVTs2VVk3VjFFOFZQIDdVXT85Jl0/OVZRTworTThGJUw3Vi1UO1cpUyAlXT83VC00M1UpPzMkRTM1JV0/ICVdTztFXUU+JkVUICVdVzxGRVQ5MCE/OzctVworTTo3MUM6JjlQN1AhLTo2WUk9ICFGOyZdQT0lXVM9VkVUOFZAIDdVXUM7JjVBO0c1UCAlXT85N0FJPSVdSAorTTg2WUQ7JjVSPFAhPzs2JUw7Jl1DICYtRTxHKU88QCE/OTcpUjtGXCA3VV1XPEcxQzomTCA3VV1GOyctQgorTT02OCA3VjlSOTY0IDdVXVM7NilVOUAhPzlGOUw9Ny1IICVdPzlGRU45JilVOUAhPzdXQUY7Jy1CPTY4IAorTTdWOVM9JiVUICVdPzhHNUY8V0VOOFAhPzhWUU88VjQgN1ZFUzg3MVQ+MCE/OUYtTDtXLUUgJV0/OUc9QQorTTsmTCA1RlFJPFcwIDdWOVA3Vy1XOjcxQzogIT87NkVOOjcxRjwlXCA3VjlQN1ctVDg3MUU3VlVDLUNAWAorTS4jJCA3VDlNO1YxRSAlXSY8VzFBPSc1UyAlXUY8JV1TPSYlVDk1XVM9NllGPCYkIDdWOVA3Vy1UODcxRQorTTdXLUs+NjlGPCAhPzlHIT88VzFBPSY1PzxWXUY9Jz1BPEY0IDdXLUk5VzlFOFAhPzE0VTQ0VyFFOFZFQQorTTsgIT85RyFSOjZZVDlAIT87NiRZLFZZPyAlXS05JjVGODc1TD0gIT8xNFU0NFZFRztGJUw7JjVEICVdPworTTo2XUIgJV1SOTYlTDsmXUMgJV1TOEcpSyAlXUc5NzFQODY9RTxWRVo5MCE/OEYtTzwnRCA3VV1VOEZdVQorTTtGMCA3VV0/OzYlTDsmRU45RlwgN1VdUjtWXVQgJV0/OyYpTz02WUQgJV1JO1YtVDsgIT83VjlJO0YxSQorTTtXICA3Vj1FPSYxVDg2KUw5Ny1JPkY0IDdVXUY3VlVPPEY1Rjo2UUU8UCE/OUVdUDxGNUE7JlFPOFAhPworTThWJUw7Jl1DICVdPzxWRUc5RzVOOFAhPzxWRUc8VjVUOzYlUzpQIT83Vy1JOVcxUjg2VVAgJV0/PFZFRworTT1GNUMgJV1TOjY9QjsmXUM6UCE/OTZZRCAmLVU8RilSOlAhRjwlXVM4NzlFICY5UDdXKUU8VzFPPEY0IAorTTdVXUQ7VyFSO0cwIDdVXVM6V0U/OUYwIDdVXVM6V0VCODctRSAlXUI+RjVSO1AhPzhWOVI5NjQgN1YlVAorTTtWRCA3Vy1UPEctUDtAIT83Vi1UPjchRTdQIT87NjVNOFZBUiAlXU05NlVTOTcwIDdXJUY4Vl1OPUY1UgorTT0gIT85Ri1PO0c5RTxHMCA3Vy1UPEYtSDxAIT87Jl1DODZRRThWXU49QCE/N1ZVSzg3KUc7Jy1UICVdUworTT0nKUw5NlggN1VdRjtXNVI5JkVHOjcxUzw3NUk4VkwgN1clRzhWXU49RjVSPSAhPzlWLU87RzlFPEcwIAorTTdXJUU4Vl1OPUY1Uj0gIT85Ni1PO0c5RTxHMCA3VV1HOTcxQTxGPCA3VV1GPCYlQjg3LUUgJV1JPFchVQorTTtGLVQgJV1JPFY9Ujg3IUggJV1JPFYlUzhWRUkgJV1UO1YlUzhWRUkgJV0/OzYpPzhXNVI3VlVBPiAhPworTTo3LVg5JkVHOjcwIDdWRVM8VyFBOFY0IDdWRVM4NlFOPTZUIDdWRVM9NyFQOTcoIDdWRVM4VllUPEZQIAorTTdWRVM8JylJO0cwIDdWRVM4NlFQOiYkIDdWRVM5JkVHOjcwIDdWRVM7Jl1XOTcoIDdXKUU4NjAgN1ZRQworTTtWWVYgJV1HOTcxTDtWLUE7JjU/OFcxWTwmNCA3VV1MODZZRzo2WUY7UCE/OyZdQzg2UUQ9Ji1PO0c4IAorTTdXLVQ8Ri1BPSAhPzdWVVk3VzFJOzY0IDdXLUU9JlFPOFYlTDkwIT88VzFSPSZdSyAlXUk7RkVUN1ctVAorTTg3MUk4VywgN1Y9RT0mUU84ViVMOTVdTj02VUU8RkVDICVdTTk2VUM8J0QgN1VdTDtWLUE7JjVTICVdUworTT0nKUM7NyAgN1ZdUDk2WCA3Vl1QOTZZTDtWLUE7JjQgN1ctVDxGLVA+MCE/N1YtTzkmNT88VjVUN1ZFTgorTTlGXCA3VV1DPSdFUDk1XVU7ICE/OVY1VDk2WVYgJV0/OScxQztWWVYgJV1TPScpUDhHKUsgJV1GPCVdRAorTTo3KUU4VzFJO1ZYIDdVXUY8JV1DPTcpUjk2WVQ3VjFJPEY1Qz0mRU87QCE/N1Y5UDdWLVU8RylFO0cxPworTTk3QUM5NyFUOjZdTjxQIT83VjlQN1YtVTxHKUU7RzE/PCcpRThWRVM6Nl1OICVdRDtXNUI7JjU/PSZdPworTTkmNUM6NlVBOyAhPzlWLVY9ICE/N1Y9Qz1HMCA3VilJO0YlUj41XVQ7VV1EOTYtSTs2JUw3VkVOPSY1RworTTk3KCA3VV1SOjY9SD0lXVM6JkVGPSVdQjg3LUU3VzFXO1AhPzkmNUM6NlVBOyVdUjtXNU45ICE/N1YpSQorTTlVXUY7Jl1BPSVdVDo2VUU8VV1QO1c9RTxAIT84RkVOODcpWTdXMU83VjFFOFZFTTg2UT85RylBOFcxSQorTTtWWCA3VV1GPCVdTjtXKU04NlFJPkY0IDdXLVA8RkVOPSY4IDdVXUY8RjVFN1YpSTlVXUY7Jl1BPSAhPworTTdXNU48JiVDOlY1RDdXMU83VilJOVVdRjsmXUE9ICE/N1YpQTxWNT84Vl1OPUY1UjxWRU87RV1BOEZdUgorTT0gIT83VzVOPCYlQzpVXUQ7VzVCOyY0IDdVXUM7JiVTPFVdRDtXNUI7JjQgN1clVTg2MVI9NyFMOTVdVAorTTtVXUQ5Ni1JOzYlTCAlXT89NllQODYtSzk2MT89Jl0/OSY1Qzo2VUE7ICE/N1YpSTlVXUI6NllBPEdFPworTT0mXT84RkVHN1YxRThWRU04NlAgN1VdVTtHIUE4Vk0/PDc1QTknKVU8JlFFICVdPzhWUUE8Vy0/PDc1QQorTTknKVU8JlFFICVdPzlHIT87JjVGPSctSDo2OVQgJV0/OUchPzxWNVQ3VjVYOFY1UD0mRU87QCE/N1c1TQorTTg2LCA3VV1NPTZRVDo3IUw+NV1CODctRTdXMVc7VV1WOTYtVDtXKCA3VV1NPTZRVDo3IUw+NV1CODctRQorTTdXMUU7RV1WOTYtVDtXKCA3VV1DODcpUj41XVA8Rl1QODY9QT0mNT89Jz1PICVdPzhWJVI8R0U/PCcpTworTTwmJUc4NzFFN1cxRTtAIT83Vi1BPEcpWTdWRU43VihRLCMgUCwgIT83VyFSO1YxQzdWKFEsIyBQLCAhPworTTdWVVU7JzFJPCZRWTdWKUE8VjU/PSc9TyAlXT87JjVGPSVdUzomRUY9JV1CODctRTdXMVc7UCE/N1ZVVQorTTsnMUk8JlFZN1YpQTxWNT89JjVON1YpWTdXMVc7UCE/N1ZVVTsnMUk8JlFZN1YpQTxWNT89JjVOICVdPworTTsmNUY9JV1TOiZFRj0lXUI4Ny1FN1cxRTtAIT83VyFSO1YxPywzIFAsIyE/OEM4VS0zLFYgJV0/PCcpTworTTklXUItQzRVLFM4IDdVXUM4NylSPjVdTz03MT84QyRQLCMgUCAlXT88JylPOSVcVi0zNFMtRV1CLDMgUAorTSwjICA3VV1MPFZBSTlHMT84QyRQLCMgUCAlXT88JylPOSVdQiwzIFAsIyAgN1VdTT02UT8tQzRVLFM5UworTTomXVI9ICE/PCcpSTtHMUYgJV0/OyY1QTkmRU45VV1aOTcpTzxVXUI6Nj0/PCZdVzk3KVM3VzFFO0AhPworTTdWUUU4NjFJO0Y9Pz5GNVI7Vy0/PFZVQTsmUT88Jl1XOTcpUzdXMUU7QCE/N1ZRRTg2MUk7Rj0/PkY1UgorTTtXLT89JkVOPjVdUDtXPUU8Ry0/PSY1TiAlXT88VzFBPEcxPzhGRUc3VyFPPVY1UjxVXVQ5NlggN1VdUworTT0mJVI9JV1TOzYlTDslXVA7Vz1FPEctPz0mNU4gJV0/PFcxQTxHMT89JkVOPjVdUDtXPUU8Ry0/PSY1TgorTSAlXT84RkVHN1chTz1WNVI8VV1UOTZYIDdVXVM7NiVMOyVdUDtXPUU8Ry0/PSY1TiAlXT89JkVOPjVdUAorTTtXPUU8Ry0/PSY1TiAlXT87NiVYN1YpSTlVXVA7Vz1FPEctPz0mNU4gJV0/OzYlWDdXLU04NlFMN1chTworTT1WNVI8VV1UOTZYIDdVXU04N0E/PSZFTj41XVA7Vz1FPEctPz0mNU4gJV0/OFZdUD41XUI6Nj0/OUZRTworTTg3MT85JkVHOjcxUyAlXUE4Rl1SPSAhPzdXLVQ4NylUN1YpSTlVXVA7Vz1FPEctPz0nPU8gJV0/PFcxQQorTTxHMT88VlVBOyZRPzwmXVc5NylTN1cxVztQIT83Vy1UODcpVDdXMUk7R0U/PCZdVzk3KVM3VzFXO1AhPworTTdWKUk5VV1QO1c9RTxHLT89Jz1PICVdPzxWVUE7JlE/PCZdVzk3KVM3VzFXO1AhPzdXMUk7R0U/PCZdVworTTk3KVM3VzFXO1AhPzdWVUE+JV1COjY9PzwmXVc5NylTN1cxVztQIT83VlVBPiVdUzs2JUw7JV1QO1c9RQorTTxHLT89Jz1PICVdPzs2JVg3VzFJO0dFPzwmXVc5NylTN1cxVztQIT88JjVSPEZdUiAlXUs6NlFMICVdUworTTo2PU44NlAgN1Y9RT0nIUk5ICE/N1chRTxHKU88QCE/PFdFUzdWNVI8RlFJPFcwIDdXPVI6NzFFPUAhPworPTxXRVM3VllFPEcoIDdWNVQ5N0FUICVdRTkmJVQ4MCE/N1Y1TjkgIVIKKyAKK2VuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWVsZi51IGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWVsZi51Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZDA1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstZWxmLnUKQEAgLTAsMCArMSwyOTggQEAKK2JlZ2luIDc3NyBtNjhrLWVsZgorTT9UNSwxQCQiIDAgICAgICAgICAgICAgIiAgMCAgICAhQCAgJD4gICAgIzAgICMiMCAgICAgICBUICIgIAorTSEwIEggITQgJDAgICAgOCAgICBUQCAgIC0gICAgICAgICAiQCAgICBIICAgICA0ICAgICAgICAgIFAgIAorTSAtMCAgICAgICAgICAgICAgISwgICAgICAgICAhICAgICAgICAgICEgICAgLSggICAjMCAgICAgICAgKQorTUMgICAiOFAgICAgJSAgIEAgICAgICAkICAgRyBAICBJUCAgICAgICAgICI0ICAgIjYgICAgIDwgICIgIAorTSAgICAgQCAgIj4yICAiR0QgICAgICAgICAnICAgICAgICAgICFQICAgICBPPTctUitWUUk4Ql1MOjYpQworTStHLU8rQyQgICAgICAmJCAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgNCAgICAgICAgICBQICAgICAgICAgICAgICAhUCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgKyAgICAgICAgICAgICAgICAgICAgISAgICAgICAgICAgICAgICBAICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQCAgICAgICAgICAgICAgICAgIAorTSAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSFAICAgICAgICAgICAgICAgICAgICAgICAgICEgICAgICAgICAiMDIgICAgICAgICJIICArIUAgICAgIAorTSQwI19cMCAgICBeICAiRyQgICAgISEkICAgSCAgICA4QCAgKVAgICAgICAxIC9fUSAgICAnUCAgICAgIAorTSAgITokQCAgICAgICAiOiAgIkk0ICAgICAhJCBfXyQgICAgTSAgICAgICAgICAgMiAgICAgICAgLEggIAorTSEtQCAgICAkJDAgICIgICAgI1wgICAgICAgICAgISggICAgICAgISlAICBJUiAgICAgIDEgL19RICAgIAorTTdYICAqPjAgICAgICQwI19cMCE/OFZRRTg2WVU8ICE/OTZZRCAlXUU7RzlJPEZdTiAlXUU9JjVYPSAhQQorTT0mNVg6NzAgN1Y1RDg3MUEgJjVYOjcwIDdWUUk4RV1WOTcpUzo2XU4gJV0/OUchUz0mJVI9ICE/MVRRLworTTBEJSw3VF0mMUUtJTUlXTQwNCksMTVcIDdUMTkzRCUtMjQsICtXNVM8Ql1MOjYoTzsmRUI4UllTO1JYUQorTSAgIiAgIkc0ICAgJSUwICAgICIgICJHOCAgICElMCAgICAiICAiRzwgICApJTAgICAgIiAgIkdAICAgJworTSUwICAgICEuPTRZUStTTCE8ICAgKTs5Ll5QJVEgICBFTEAgICAgIS5eUCVRICAgRUpCXFwgICAgICYjXworTV9fX19XJFtbIDckICAiNjorU1AgICAgLDgvX19fX18oM09MITwwICApOEhPLyAgICAhQUBfX19fX1sxLgorTV5QJVEgICBFPkJcXCAgICApJiNfX19fX0giXFxAICApTyRaWUAgICQqJUEvKCNSICAgMFw5X1wgICAgLgorTStQIS5OOCAgISJBODNZX1wgICAgIyJaNjA+WCAhIl0oICAxKkYmO1woXEIgICJHJCtUQCAiJFpZQCAgJAorTSQkWllAICAkNCRaWUAgICdLIlogM0tGICAgMUQzRzUuPDAgICAgISgjT19fX19RKFtQICAgIDNSLV8gIAorTSA3ICAgICAkPCAhQF9QICAgIDNSLV0gICA3ICAgICAkMy5cICAgICQzRVkuPTRALl9fX19fJENPICAgIAorTSEvKFdcICAhPCAgICAgMVAgJiNfICAgICEvKFdUICAhPCAgICAgMSxbUCAgICAxLjdEWVUyIFtfX19fXAorTTIuXCAgICAkXEM/UCAgJVAgICAgIScgIDgvXCAgICAkXEM/MCAgJVAgICAgISRTTyAgICAhJFk+M0c1KAorTSNPX19fX1EoW1AgICAgM1ItXyAgIDcgICAgICQ8ICFAX1AgICAgM1ItXSAgIDcgICAgICQzLlwgICAgJAorTTNFWS49NEAuX19fX18kQ08gICAgIS8oV1wgICE8ICAgICAxUCAmI18gICAgIS8oV1QgICE8ICAgICAxLAorTVtQICAgIDEuN0RZVTIgW19fX19cMi5cICAgICRcQz9QICAlUCAgICAhJyAgOC9cICAgICRcQz8wICAlUAorTSAgICAhJFNPICAgICEkWT4zRzUoI09fX19fUShbUCAgICAzUi1fICAgNyAgICAgJDwgIUBfUCAgICAzUgorTS1dICAgNyAgICAgJDMuXCAgICAkM0VZLj00QC5fX19fXyRDTyAgICAhLyhXXCAgITwgICAgIDFQICYjXworTSAgICAhLyhXVCAgITwgICAgIDEsW1AgICAgMS43RFlVMiBbX19fX1wyLlwgICAgJFxDP1AgICVQICAgIAorTSEnICA4L1wgICAgJFxDPzAgICVQICAgICEkU08gICAgISRZPjNHNSgjT19fX19RKFtQICAgIDNSLV8gIAorTSA3ICAgICAkPCAhQF9QICAgIDNSLV0gICA3ICAgICAkMy5cICAgICQzRVkuPTRALl9fX19fJENPICAgIAorTSEvKFdcICAhPCAgICAgMVAgJiNfICAgICEvKFdUICAhPCAgICAgMSxbUCAgICAxLjdEWVUyIFtfX19fXAorTTIuXCAgICAkXEM/UCAgJVAgICAgIScgIDgvXCAgICAkXEM/MCAgJVAgICAgISRTTyAgICAhJFk+M0c1KAorTSNPX19fX1EoW1AgICAgM1ItXyAgIDcgICAgICRcQ1E0ICAgICAgICAgICAgOC9cICAgICRcQz8wICAlUAorTSAgICAhJFNPICAgICEkWT4zRzUoI09fX19fUShbUCAgICAzUi1fICAgNyAgICAgJFxDUTQgICAgICAgIAorTSAgICA4L1wgICAgJFxDPzAgICVQICAgICEkU08gICAgISRZPjNHNSgjT19fX19RKFtQICAgIDNSLV8gIAorTSA3ICAgICAkMENGICAiTUQkX1AgIDggICpOIDNfICAiQCAgSkkjL1wgIC4gICJLOCxfUCAhKCAgKkxAUworTV8gICVAICBKOyIvXCAgICAhSCAgKkdAQ18gICAgID4gICJJOChfUCAgICAoQCAgSjciL1wgICAgIjggIAorTSpNMENfICAgICBKICAiSUQoX1AgICAgK0AgIEpZIi9cMExAICAoICAqSkBDXyQhSSAgIiAgIklQKF9QIAorTSAgICBAICBKPSEvWUAgIEs5KCAgKlQgM144ICAqTiIgICJKQCRfRiAgIkpEQCAgSjgjL1lAICBKViggIAorTSpOQFNeOCAgKkxCICAiSlQsX0YgICJJTEAgIEpbIi9ZQCAgSj4oICAqSDBDXjggICpFQiAgIktYKF9GIAorTSAiSTxAICBKTyIvWUAgIEpVKCAgKlVQQ144ICAqRjIgICJKTChfRiAgIktEQCAgSlMiL1lAICBKSiggIAorTSpUUENeOCAgKkciICAiSjAoX0YgICJJVEAgIEpFIi9cQCAgSzkoICAqTyBDXyggICpOIiAgIk04KF9SIAorTSAiSkRAICBKXSIvXEAgIEpWKCAgKlUwQ18oICAqTEIgICJMKChfUiAgIklMQCAgSjoiL1xAICBKPiggIAorTSpLQENfKCAgKkVCICAiTCAoX1IgICJJPEAgIEpRIi9cQCAgSlUoICAqTVBDXyggICpGMiAgIk0oKF9SIAorTSAiS0RAICBKQCIvXEAgIEpKKCAgKlQwQ18oICAqRyIgICJMLChfUCAgICAiQCAgSkMiL1wgICAgIEggIAorTSpHUENfICAgICAmICAiUCAoX1AgICAgIUAgIEs6Ii9ZQCAgSyEoICAqVyBTXjggICshIiAgIlAoXEM/MAorTSAgJVAgICAgISRTTyAgICAhJFk+M0c1Lj00WVEgICAgICAgICAgIiAgIkdEICAgICAgICAgICIgICAwUAorTUAgICQxKCAgISVCICAgMUwgICAgIDAgICAmQCAgICAsQCAgJCQgICAgIFYgICBGXCAgICAhKCAgIC5AIAorTSAgICVAICAjOSAgICAgOiAgICpEICAgICJAICAgJ0wgICAgKyAgICAkICAgICE0ICAgICAgICAgIFggIAorTSo8QCAgICAiICAgICwgICAgITAgICAgJyAgICAlWCAgIF4gICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgMCAgICAgICAgICAhICNfXDAgICAgIiAgICM0ICAgICAgLCAgICQgICAgIAorTUAgICBaICAgICAgIyAgICIgICAgICggICBKMCAgICAgIFAgICBQICAgICIgICAtRCAgICAgICwgICAwIAorTSAgICBAICAjWCAgICAgICMgICAlICAgICAoICAhISAgICAgICBQICAhQCAgICAiICAgMDQgICAgICAsIAorTSAgPCAgICAgQCAgJD4gICAgICAjICAgKCAgICAgKCAgIjtQICAgICAgUCAgIjAgICAgIiAgIkcgICAgIAorTSAgLCAgIEggICAgIEAgIElSICAgICAgIyAgICsgICAgICggICo+MCAgICAgIFAgICMgICAgICIgICJJOAorTSAgICAgICwgICBUICAgICAgICAgICAgICAgICMgICAuICAgICAgICAgICAgICAgICBQICAjUCAgICAgIAorTSAgICAgICAgICAsICAhICAgICAgICAgICAgICAgICAjICAgMSAgICAgICAgICAgICAgICAgUCAgJEAgIAorTSAgICAgICAgICAgICAgLCAgISwgICAgICAgICAgICAgICAgIyAgIDQgICAgIkAgICAgICAgICAgISAjXworTVwwICAgISQgICAgICAgICAgIDAgX18kICAgIDggICAgICAgICAgICQgL19RICAgICkgICAgICAgICAgIAorTSEgI19cMCAgICJQICAgICAgICAgICAwIF9fJCAgICBWICAgICAgICAgICAkIC9fUSAgICAvOCAgIS1QIAorTSAgIFIkQCAgIiAgICAkRiAgIkk4ICAgICEhJCAgIFQgICAhNkAgIEo3ICAgICAwMSAgIC0gICAgOTggIAorTSI7UCAgICAgJEAgICIwICAgJk4gICJJQCAgICAgQSQgICBUICAgIiFAICAnSyAgICBBIDIgICAoICAgIAorTUFIICAqRjAgICAgJCQwICAjMCAgICkyICAiSUggICAgISEkICAgVCAgICJNQCAgJC8gICAgIjAyICAgIAorTSAgICBNSCAgKyFAICAgICAkMCNfXDAgICArTiAgIklMICAgICBBJCAgIFQgICAjLEAgICVVQCAgICMoMgorTSAgICggICAgWEggICpHICAgICAoJDAgICMwICAgLk4gICJJWCAgICAhISQgICBUICAgI1FAICAkPiAgIAorTSAgIDIgICAoICAgIF4oICAqR1AgICAgJCQwICAjMCAgIDAuICAiRyQgICAgISEkICAgSCAgICQsQCAgSgorTUAgICAgIDAxICAgLSAgICEpKCAgKkgwICAgICgkMCAgIzAgICAzIiAgIkosICAgICEhJCAgIFQgICAkWAorTUAgICUjQCAgICMoMiAgICggICAhMlggICpJICAgICAwJDAgICMwICAgNUogICBHICAgICAgISQgX18kIAorTSAgJUFAICBKSCAgICAgKDEgICAtICAgIT04ICAqSjAgICAgISQwICAjMCAgIDg2ICAiSkggICAgISEkIAorTSAgVCAgICYtQCAgSksgICAgIEAxICAgLSAgICFIOCAgISJAICAgITokQCAgICAgICA6QiAgIkckICAgIAorTSEiJCAgIEggICAmUEAgICZHQCAgICMoMiAgICggICAhTyggICFQKCAgICBSJEAgICIgICAgPSYgICJKVAorTSAgICAhISQgICBUICAgJ0ZAICBKTiAgICAgMDEgICAtICAgIV0oICAqRTAgICAgICQwI19cMCAgID9OIAorTSAgNVIgICAgLEEoICAgQCAgICgoQCAgSk8gICAgIEAxICAgLSAgICInOCAgKkwwICAgICQkMCAgIzAgIAorTSBDMiAgIDgoICAgICxBKCAgIEAgICAoX0AgIEpSICAgICAoMSAgIC0gICAiM0ggICFTMCAgICBcJEAgIAorTSIgICAgRU4gICAxRCAgICAgISggICAgICAgKUBAICBKUyAgICAgQDEgICAtICAgIj1IICAqTTAgICAgJAorTSQwICAjMCAgIEdWICAiSzggICAgIEEkICAgVCAgIColQCAgSlcgICAgIDAxICAgLSAgICJFKCAgKk4gIAorTSAgICEkMCAgIzAgICBKKiAgIktEICAgICEhJCAgIFQgICAqUkAgIEpaICAgICAwMSAgIC0gICAiUCggIAorTSpOUCAgICAkJDAgICMwICAgTT4gICAzOCAgICAhISQgICBAICAgK0RAICAkVSAgICAgIDIgICAoICAgIgorTVsoICAqTyAgICAgJCQwICAjMCAgIE9OICAiS1QgICAgISEkICAgVCAgICwzQCAgSl4gICAgIEAxICAgLQorTSAgICMpSCAgISUgICAgICAkQCAgICAgICBTIiAgIkwgICAgICEhJCAgIFQgICAtJUAgIEshICAgICAwMQorTSAgIC0gICAjMyggICo8QCAgICAgJDAjX1wwICAgViogICJMKCAgICAhISQgICBUICAgLVlAICBLIyAgIAorTSAgMDEgICAtICAgI0JIICAqPCAgICAgJCQwICAiQCAgIFlSICAiTDAgICAgJiEkICAgVCAgIC5GQCAgSworTSogICAgIUAxICAgLSAgICNMKCAgKlQgICAgICIkMCAgIzAgICBbViAgIk0kICAgICEhJCAgIFQgICAvLQorTUAgIEsyICAgICAwMSAgIC0gICAjWFggICFXICAgICBcJEAgICIgICAgXyYgICA4WiAgICAsQSggICBAIAorTSAgMCNAICBJWSAgICAgIDEgL19RICAgJCMoICAqVFAgICAgKCQwICAjMCAgISFKICAiTTQgICAgISEkIAorTSAgVCAgIDBKQCAgJlQgICAgIygyICAgKCAgICQvOCAgKlVAICAgICQkMCAgIzAgICElLiAgIk08ICAgIAorTSIhJCAgIFQgICAxQEAgICQkICAgICAgMiAgICYgICAkOUggICpWMCAgICAhJDAgICMwICAhJlYgICJNSAorTSAgICAhISQgICBUICAgMVVAICAlMCAgICAjKDIgICAoICAgJEJIICAqVyAgICAiMCQwICAjMCAgISkmIAorTSAgNkQgICAgLEEoICAgQCAgIDJFQCAgTCAgICAgIDAxICAgLSAgICRLWCAgKyBAICAgICgkMCAgIzAgIAorTSErQiAgIDlMICAgICxBKCAgIEAgICAzLEAgIEwkICAgICBAMSAgIC0gJlRWLiZMTjk2UUYgJi1SPSMkTgorTTxQIUM8RzFJK0csID1GJUw9NjVTKzVBVCtGLCA5VjFCOzY0TjhQIVM6JV1EODcxQStGLCA4VylUO0JZUworTSAnOT84VkFBPEVdRj02WUMgJzk/PFZFRztGNUQ3VkVOPSAhVjdXNU48VkVHO0Y1RDdWRU49ICE/OUZFTgorTTowIVY3VzVOPFZFRztGNUQ3Vi1IODcpPzg3KVI4N0QgOzYlSTtAIVY3Vy1JOVZZRTklXUw7VllHICc5PworTT02WVM6Nj1OOTYxPzxWQU88RzE/PCZdSTtHMUU8QCE/OFZRRTg2WVU8ICE/OTZZRCAnOT89NllTOjY9TgorTTk2MT88VkFPPEcwID1FXVU7Ry1JOVZZRTklXVM6Jl1SPSVdRj02WUMgJzk/OSZdVThGUUUgJzk/OjZZVAorTSAlXVM9JiVSPSAhTjtWWVA8RkVNODcpWSAlXUU7RzlJPEZdTiAnOT89NllTOjY9Tjk2MT87Jl1OOVVdUAorTTtWRU49JjVSICc5Pzo2WVQ3ViVSPEYlWSAnIVI6NlVBPEdEID1FXVM6Nj1OOTYxPzhWQUE8RV1GPTZZQworTSAnOT85Jl1VOEZRRTdWJVI8RiVZICVdRT0mNVg9ICFWN1ctSTlWWUU5JV1DOiYlUjdWJVI8RiVZICc5PworTT02WVM6Nj1OOTYxPzhWQUE8QCFWN1Y5TDtWJVQgJzk/PFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgODcxRQorTT4mRVQgJjVOPUZFUjtWWCA9RV1MO1ZZRzdWOVU7RiwgPUVdVTtHLUk5VllFOSVdTDtWWUc3VjlVO0YsIAorTT1FXVM6Nj1OOTYxPzxWQU88RzE/ODcpUjg3RCA9RV1JO0cxPzwmXUk7RzFFPEAhPzk2MUE9JiQgPUVdUworTTomXVI9JV1GPTZZQyAnOT89NllTOjY9Tjk2MT86NllUN1YlUjxGJVkgJzk/PTZZUzo2PU45NjE/OjZZVAorTTdXIU86NllUOTcoID1FXUk7RzE/OUc1TjhQIVY3Vy1JOVZZRTklXVM6Jl1SPSAhVjdWOUw7ViVUN1Y5VQorTTtGLCA5N0FJPSAhVjdXNU48VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA9RV1MO1ZZRyAnOT88VkFPPEcwIAorTT1FXUw7VllHN1chTzo2WVQ5NyggPUVdUzo2PU45NjE/OFZBQTxAIVY3VzVOPFZFRztGNUQ3VlFPO0Y8IAorTT1FXVM6Jl1SPSVdQTxHKUE+MCFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWSAlXUw6Nik/PUY1UgorTTxWRU87QCE/OzYtTz02WVQgJzk/OFZBQTxFXVA7VkVOPSY1UiAnOT89NllTOjY9Tjk2MT84VkFBPEVdUAorTTtWRU49JjVSICc5PzxWRUc7RjVEN1ZFTj0lXUE8RylBPjAhPzdWOVA8VzFBPEcwID1FXVM6Nj1OOTYxPworTTo2WVQ3VyFPOjZZVDk3KCA8VV1MOjZZSyAlXSczJF0iMDRRPzNUOSY0VDU0N1UxITBEUSU3UCFWN1ctSQorTTlWWUU5JV1TOiZdUj0lXVA7VkVOPSY1UiAnOT85Jl1VOEZRRTdXIU86NllUOTcoIDdVXUw7VllHOSZdVQorTThGUUU3VzVTOTYwID1FXVM9JylVOFcwUSAnOT88VzFSPTYtVCxAIVY3Vi1IODcpPzg3KVI4N0QgPUVdRgorTTsmXUE9JV1QO1ZFTj0mNVIgJzk/PFZFRztGNUQ3VlFPO0Y9PzwmXUk7RzFFPEAhVjdWMU89NilMOTVdRgorTT02WUMgJzk/PFZFRztGNUQ3VkVOPSVdRj02WUMgJV0kNjRZITM0RSMgJzk/OUZRTzg3MT84NylSODdEIAorTT1FXVM6Jl1SPSVdUDtWRU49JjVSICc5PzxWRUc7RjVEN1ZRTztGPT85RzVOOFAhVjdXLUk5VllFOSVdQworTTomJVI3VyFPOjZZVDk3KCA9RV1MO1ZZRzdWJVI8RiVZICVdSTtGRVQgJzk/OFZBQTxAIUM7JzVOOlY1UgorTSAnOT89NllTOjY9Tjk2MT84VkFBPEVdRj02WUMgJzU/OyZFTjpQIVY3Vy1JOVZZRTklXVM6Jl1SPSVdRgorTT02WUMgJy1QO1cpVDxWLUE8QCFWN1c1Tjo2XU4sQCFWN1c1TjxWRUc7RjVEN1ZFTj0lXUY9NllDICc5PworTT02WUk7VlggICJZSTtHMUU8RyAgK0ZBQTxWQCArRjFZO0ctWTswIE45J0VOPFcxUiAiWVI5NlFBK0chTAorTT0gIE46NllJPSAgTjwmUVQgIllUOTdBVCAiWUY6NllJICJZRDg3MUEgIllHO1cwICtGMVk7RiVNOjYsIAorTStGKVM8UCBOPFdFTT0mJUIgIllTPScpVDg2KCArRyFFPFY1TCAiWVM6Jy1UPEcxQThAIE44Vl1NOzY1TgorTT0gIE45JjVCPTY8ICtGUUk7RjQgMCJAQyo2UUk4RixNOzMsUi5GVFQrRjFFOUBEUStDMCAwIkBDKjZRSQorTThGLE07MyxSLkYtUz0yXUM8RzBRK0csKSwyWFEuICAgICAhICoiLEk7JkVCOFJVTSxTKFo7MzBOOSY1RgorTSIzJE4tICEgKiIsSTsmRUI4UlVNLFMoWjhXLVUrVi1SPSZETjxQRFErQywgODcsWigiQSMxJSxJKCM0TgorTSwiIFErUyhPLjMgICAgICAwIkBDKjZRSThGLE07MyxSLkZUVCtGMUU5QERRK0MwIDAiQEMqNlFJOEYsTQorTTszLFIuRi1TPTJdQzxHMU4rRywpLDJYViAiIUw5IiBaKCJBIzElLEkoIzROLCIgUStTKE8uMyAgICAgIAorTSAiWCAkMCAyICAgNjwgIFg5VjFCOzY0TjhQICEtQCAgICAkISQ4ICAhLVAhKDggICI7UCEhQCAgICAgIAorTSAgID0gISwgJEAgICA0WCAuJzE/PFcxUj02LVQgICJWICAgICYgICAgIkggIzAgMiAgICA9MCBYPUVdQworTTomJVI3VlVFOzYpRTxAICA1MCAhICIsICFAMCAgICAgIVAgICAiTCAjMCAyICAgIEggIFg9RV1TOiZdUgorTT0lXU05NlVCOTcoICAlNCAhICBDICA4JCAgICAgQDwgICAgSSAgVCAkQCAgICxEIC4nOT86NllUN1ZVRQorTTs2KUU8QCAgNTAgJyAiLCAhQDAgICAgJCFQICAgIkggIzAgMiAgICBcUCBYPUVdTDtWWUc3VlVFOzYpRQorTTxAICA1MCAqICIsICFAMCAgICAoIVAgICAiTCAjMCAyICAgISdAIFg9RV1GOyZdQT0lXU05NlVCOTcoIAorTSAlNCAjQCBDICA4JCAgICAjIDwgICAgTCAgVCAkQCAgIDRIIC4nOT85Jl1VOEZRRTdWVUU7NilFPEAgIAorTTUwIC8gIiwgIUAwICAgIDAhUCAgICAwICAgIDsgISwgJEAgICBGUCAuJ1hQOUYlSzkwICBNQCAgICFAIAorTSAgIEogIFQgJEAgICA5LCAuJzk/OFZBQTxFXU05NlVCOTcoICAlNCAgMCBDICA4JCAgICAgIDwgICAgSworTSAgVCAkQCAgIDtYIC4nOT88VkFPPEcxPzs2NU04RjVSICAhNSAgMCAoUCAmISAgICAgKCcgICAgKjAgLQorTSAhKCAgICdHICNBVjdWRU49JV1NOTZVQjk3KCAgJTQgIVAgQyAgOCQgICAgISA8ICAgIEogIFQgJEAgIAorTSBBJCAuJzk/OyZdTjlVXU05NlVCOTcoICAlNCAiQCBDICA4JCAgICAiIDwgICAgSyAgVCAkQCAgIENQIAorTS4nOT85RlFPODcxPzs2NU04RjVSICAhNSAgWCAoUCAmISAgICAgUCcgICAgKyAgLSAhKCAgIClIICNBVgorTTdWMU89NilMOTVdTTk2VUI5NyggICU0ICNQIEMgIDgkICAgICQgPCAgICAkICAgICcgIDcgISggICAuKworTSAjQVQ3VzVOOjZdTiAgIlYgICAgIiAgICAiSCAjMCAyICAgIkxAIFg9RV1DOiYlUjdWVUU7NilFPEAgIAorTTUwICEgIiwgIUAwICAgICAhUCAgICJMICMwIDIgICAiVzAgWD1FXVM6Jl1SPSVdTTk2VUI5NyggICU0IAorTSEgIEMgIDgkICAgICAgPCAgICBJICBUICRAICAgUDggLic5Pzo2WVQ3VlVFOzYpRTxAICA1MCAnICIsIAorTSFAMCAgICAgIVAgICAiSCAjMCAyICAgIywgIFg9RV1MO1ZZRzdWVUU7NilFPEAgIDUwICogIiwgIUAwIAorTSAgICAhUCAgICJMICMwIDIgICAjNlAgWD1FXUY7Jl1BPSVdTTk2VUI5NyggICU0ICNAIEMgIDgkICAgIAorTSAgPCAgICBMICBUICRAICAgWDwgLic5PzkmXVU4RlFFN1ZVRTs2KUU8QCAgNTAgLyAiLCAhQDAgICAgIAorTSFQICAgIDAgICAgOyAhPCAkQCAgISpEIC4nWFE5RiVLOTAgIE1AICAgIEAgICAgSiAgVCAkQCAgIF0gIAorTS4nOT84VkFBPEVdTTk2VUI5NyggICU0ICAwIEMgIDgkICAgICAgPCAgICBLICBUICRAICAgX0wgLic5PworTTxWQU88RzE/OzY1TThGNVIgICE1ICAwIChQICYhICAgICAgJyAgICAqMCAtICEoICAgMEQgI0FWN1ZFTgorTT0lXU05NlVCOTcoICAlNCAhUCBDICA4JCAgICAgIDwgICAgSiAgVCAkQCAgISRYIC4nOT87Jl1OOVVdTQorTTk2VUI5NyggICU0ICJAIEMgIDgkICAgICAgPCAgICBLICBUICRAICAhJ0QgLic5PzlGUU84NzE/OzY1TQorTThGNVIgICE1ICBYIChQICYhICAgICAgJyAgICArICAtICEoICAgMkUgI0FWN1YxTz02KUw5NV1NOTZVQgorTTk3KCAgJTQgI1AgQyAgOCQgICAgICA8ICAgICQgICAgKkAgJiAhKCAgIDM3ICNBVjdWLUg4Nyk/OUc1TgorTThQICA1MCAhIDEmICAgMzwgMiYgICA0LiAgICAhICAgICMkICFAIDIgICAlIyAgWD1FXVM6Nj1OOTYxPworTThWQUE8RV1GPTZZQyAgITUgICghJDggICEwWCEoOCAgITQgICAgICQgICAgLFAgJiAhKCAgIDUjICNBVgorTTdXNU48VkVHO0Y1RDdWLUg4Nyk/OUc1TjhQICA1MCAjIDEmICAgNSAgMiYgICA1UiAgICAhICAgICJMIAorTSFAIDIgICAlPEAgWD1FXVM6Jl1SPSVdRj02WUMgICE1ICAwISQ4ICAhNyghKDggICE6MCAgICAkICAgIAorTSxAICYgISggICA2SCAjQVY3Vy1JOVZZRTklXVM6Jl1SPSVdRj02WUMgICE1ICA0ISQ4ICAhOjAhKDggIAorTSE9OCAgICAkICAgIC0gICYgISggICA3QCAjQVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdWOVU7RiwgICU0IAorTSFAJDFAICAlVUAkQUAgICYiICAgICAwICAgIEkgIDggJEAgICFAVCAuJzk/OjZZVDdWOVU7RiwgICU0IAorTSFQJDFAICAmIiAkQUAgICYuQCAgICAwICAgIFAgIDggJEAgICFEJCAuJzk/PFZFRztGNUQ3VkVOPSVdRgorTT02WUMgICE1ICBAISQ4ICAhQ0ghKDggICFGUCAgICAkICAgICxAICYgISggICA5VyAjQVY3VzVOPFZFRworTTtGNUQ3VkVOPSVdRj02WUMgICE1ICBEISQ4ICAhRlAhKDggICFJWCAgICAkICAgICpAICYgISggICA6RQorTSAjQVY3VlFPO0Y9PzlHNU44UCAgNTAgKiAxJiAgIDo+IDImICAgOzAgICAgISAgICAjJCAhQCAyICAgJgorTVZAIFg9RV1TOjY9Tjk2MT87Jl1OOVVdRj02WUMgICE1ICBMISQ4ICAhTSAhKDggICFQKCAgICAkICAgIAorTSxQICYgISggICA8MSAjQVY3VzVOPFZFRztGNUQ3VlFPO0Y9PzlHNU44UCAgNTAgLCAxJiAgIDwiIDImIAorTSAgPFQgICAgISAgICAiTCAhQCAyICAgJzAgIFg9RV1GOyZdQT0lXUY9NllDICAhNSAgWCEkOCAgIVMwIQorTSg4ICAhVyAgICAgJCAgICArICAmICEoICAgPVAgI0FWN1YxTz02KUw5NV1GPTZZQyAgITUgIFwhJDggIAorTSFXICEoOCAgIVpQICAgICQgICAgJTAgNSAhKCAgID5OICgsICEwJCAgID9KICAgICUwICUgISggICA+OgorTSAoLCAhMCQgICA/SiAgICAkICAlICEoICAgPkogJTQgIVAgICAgMCAgICBcICAkICRAICAhXkggRTAgIAorTSAqLCAqICAgIiAgICAgICAgICAgICAgKCAgICAgICAgICAkICAgQCAgICAgICAgICBAQCA8QCAgICJYIAorTSAgIDkgISwgJEAgICInTCAuJlFJO0ZMICArOCAgICI4ICAgIClAIC0gISggICBASSAjQU45N0FUICAiIworTSAgNCEgICAnWkAgQyAgOCQgICAgICA8ICAgIEogIFQgJEAgICIlLCAuJlFJO0ZNRj02WUMgICIjICA0IQorTSAgICc8ICBDICA4JCAgICAhIDwgICAgRCAgVCAkQCAgIic8IC4nLVQ9NjlGICAhUiAgICdLQCBDICA4JAorTSAgICAiIDwgICAgJCAgICAlMCA1ICEoICAgQlkgKCwgITAkICAgP0ogICAgJTAgJSAhKCAgIEJFICgsIAorTSEwJCAgID9KICAgICQgICUgISggICBCVSAlNCAhUCAgICAwICAgIFwgICQgJEAgICIvNCBFMCAgICosIAorTSogICAiICAgICAgICAgICAgICAoICAgICAgICAgICQgICBAICAgICAgICAgIEBAIDxAICAgIlggICAgPAorTSAhPCAkQCAgIjhEIC4nMVU3VlFJO0ZMICArOCAgICIwICAgIClAIC0gISggICBEVyAjQU45N0FUICAiIworTSAgNCEgICAnWkAgQyAgOCQgICAgICA8ICAgIEogIFQgJEAgICI2JCAuJlFJO0ZNRj02WUMgICIjICA0IQorTSAgICg+UCBDICA4JCAgICAgIDwgICAgRCAgVCAkQCAgIjg0IC4nLVQ9NjlGICAhUiAgIChOMCBDICA4JAorTSAgICAgIDwgICAgJCAgICAuQCAkICEoICAgRycgI0FeLEY5QTpWNCAgKzggICAgJCAvLCAmUCAgICApQgorTTsnNUUgICAgICAlRzxGNUU7QCAgICAgIDxGNUQgICAgICAwICAgIF4gIDAgJEAgICJARCAuJi1POyZdUgorTTxQICBNQCAgICAwIFxQID8gICAgIEchSTtGTCAgICAgIDchVTxHIUw5MCAgICAgID42NUw7Jl1XICAgIAorTSAgMCAgICBSICAwICRAICAiQ1wgLidYUzlGJUs5MCAgTUAgICAgMCBcUCAzICAgICA2OU88RjAgICAgIAorTSAmLUg5NzlZICAgICAgMCAgICBRICAwICRAICAiRzAgLiYtQTxHLCAgKzggICAgJCAvLCAlICAgICAlUAorTTtXKVM4VkFFICAgICAgIUI7NzwgICAgICEgICAgIyggISAgMiAgICpKQCBYP0MxRjg2TUUgICJWICAgIAorTSEgI1MgISwgICAgITUlKTUxMCAgICAgIDFEJSw0VDQgICAgICEgICAgIVAgJUAgMiAgICpRQCBYOEZdTworTTsmNUE7QCAgPEAgICJHMCAgICBRICAwICRAICAiT0wgLiYpVjg2UVMgICJWICAgICEgI1MgISwgICAgIQorTT0nKVU5MCAgICAgIDlGJUw8VjQgICAgICEgICAgIVQgJUAgMiAgICsmICBYOEZdTzsmNUE7QyggICcoIAorTSAgSyYgICAgMUAgJCAhKCAgIE1CICNBTTo3LU88RjFFPEY1RCAgIlYgICAgISAjUyAiLCAgICAjPSZBUgorTTk2NCAgICAgICdJRTxGXCAgICAgIDZdTjkwICAgICAiPSc9TyAgICAgIDAgICAgQyAgOCAkQCAgIlhEIAorTS4mVUE6NlggICU0ICFQJDFAICAnSyAkQUAgIClPICAgICAwICAgIEcgIDwgJEAgICJbICAuJy1QO1cpVAorTTxWLUE8QCAgPEAgICJDXCAoUCAlIFggICsgICAgICBFICA8ICRAICAiXTQgLiYtTD02WUs5NyggICcoIAorTSAgSCkgIiwgITAuICAiTUggICAgKiAgJyAhKCAgIE9dICNBTjtWWVA8RkVNODcpWSAgIVIgICApUVAgQworTSAgNCNAICBKPyAgICAiNCAhUCAyICAgLChAIFg8JylJOzYlUj4wICA8QCAgIjhEIChQICUgWCAgKkhQIAorTSAgIEQgIDwgJEAgICMkOCAuJzU/OyZFTjpQICA8QCAgIi80IChQICUgWCAgKlcgICAgIEcgIDwgJEAgIAorTSMmVCAuJy0/OyZFTjpQICBAUCAlIDAgICFeSCAoUCAlIFggICpQMCAgICBGICA8ICRAICAjKSwgLic5PworTT02WUk7VlhSICAhUiAgICNCUCBDICA0I0AgIEwiICAgICI0ICFQIDIgICAsTiAgWD1FXVU7RkVPO0AgIAorTTxAICAgRlAgKFAgJSBYICArISAgICAgRyAgPCAkQCAgIy1cIC4nOT88VzFSPTYtVCxAICA8QCAgIDRYIAorTShQICUgWCAgKlJAICAgIEcgIDwgJEAgICMwOCAuJzk/PFcxUj02LVQsMCAgPEAgICAiWCAoUCAlIFggIAorTSpRICAgICBPICA8ICRAICAjMzQgLic5PzkmXVU4RlFFN1chTzo2WVQ5NyggICYsICBQJCAjUCBDICA0IworTUAgIEsjICAgICJYICFQIDIgICAtOFAgWD1FXUY7Jl1BPSVdUDtWRU49JjVSICAhQyAgLCEgIFggKFAgJQorTSBYICAqVDAgICAgViAgPCAkQCAgIzlEIC4nOT89NllTOjY9Tjk2MT87Jl1OOVVdUDtWRU49JjVSICAhQworTSAgLCEgIFAgKFAgJSBYICAqSCAgICAgVCAgPCAkQCAgIzxUIC4nOT88VkVHO0Y1RDdWUU87Rj0/PCZdSQorTTtHMUU8QCAgOFAgIyAwICsgIiwgITAuICAiTSggICAgKzAgJyAhKCAgIFdaICNBVjdWUU87Rj0/PCZdSQorTTtHMUU8QCAgOFAgIyAwICogIiwgITAuICAiSzwgICAgLTAgJyAhKCAgIFhPICNBVjdXNU48VkVHO0Y1RAorTTdWRU49JV1QO1ZFTj0mNVIgICFDICAsISAgRCAoUCAlIFggICpMMCAgICBTICA8ICRAICAjRiggLic5PworTTxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAgIUMgICwhICBAIChQICUgWCAgKlAgICAgIEwgIDwgJEAgIAorTSNIWCAuJzk/OjZZVDdXIU86NllUOTcoICAmLCAgUCQgIVAgQyAgNCNAICBKTiAgICAjPCAhUCAyICAgLgorTVEwIFg9RV1VO0ctSTlWWUU5JV1TOiZdUj0lXVA7VkVOPSY1UiAgIUMgICwhICA4IChQICUgWCAgKkZAIAorTSAgIFUgIDwgJEAgICNPSCAuJzk/PFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoICAmLCAgUCQgITAgQworTSAgNCNAICBLIiAgICAiWCAhUCAyICAgLyogIFg9RV1TOiZdUj0lXVA7VkVOPSY1UiAgIUMgICwhICAwIAorTShQICUgWCAgKlUwICAgIFYgIDwgJEAgICNVWCAuJzk/PTZZUzo2PU45NjE/OFZBQTxFXVA7VkVOPSY1UgorTSAgIUMgICwhICAsIChQICUgWCAgKk8wICAgIFQgIDwgJEAgICNZKCAuJzk/PFZFRztGNUQ3Vi1IODcpPworTTwmXUk7RzFFPEAgIDhQICMgMCAiICIsICEwLiAgIk04ICAgICswICcgISggICBeXyAjQVY3Vi1IODcpPworTTwmXUk7RzFFPEAgIDhQICMgMCAhICIsICEwLiAgIktQICAgICkgICEgISggICBfQyApNCAgICJDICEgIAorTSAgQCAgICAgICAgICAwQCA1MCAvICAgICsgICcgISggICEgLyAjQVY3VjFPPTYpTDk1XUE8RylBPjAgIAorTTxAICAjW1wgKFAgJSBYICAqSSAgICAgRCAgJCAkQCAgJCMsIEUwICAgKiwgJCAgICIgICAgICAgICAgIQorTSIgITUgIFggICAgSyAgPCAkQCAgJCVYIC4nOT85RlFPODcxPzg3KVI4N0QgICcoICAhIC8gIiwgITAuIAorTSAiTSwgICAgKSAgISAhKCAgISIiICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIDUwICwgICAgLFAgJworTSAhKCAgISJVICNBVjdXNU48VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCAgJyggICEhPiAiLCAhMC4gICJLLAorTSAgICApICAhICEoICAhIzkgKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgKyAgICAsMCAnICEoIAorTSAhJCogI0FWN1ctSTlWWUU5JV1MO1ZZRzdWJVI8RiVZICAhUiAgIDBNMCBDICA0I0AgIEpLICAgICIwIAorTSAwIDIgICAxK0AiNSAgICBIUCAwICAgKCAgICAgICAgICAkKCAlNCAiQCAgICJIICFQIDIgICAxNiAgWAorTT1FXUw7VllHN1YlUjxGJVkgICFSICAgMSJAIEMgIDQjQCAgSzcgICAgIjAgIDAgMiAgIDE/ICI1ICAgIAorTUhQIDAgICAoICAgICAgICAgICQoICU0ICIwICAgIyggIVAgMiAgIDFLQCBYPUVdVTtHLUk5VllFOSVdSQorTTtHMT84NylSODdEICAnKCAgISU4ICIsICEwLiAgIkpcICAgICkgICEgISggICEnMiApNCAgICJDICEgIAorTSAgQCAgICAgICAgICAwQCA1MCAoICAgICwgICcgISggICEoIiAjQVY3Vy1JOVZZRTklXUk7RzE/ODcpUgorTTg3RCAgJyggICEmTiAiLCAhMC4gICJLWCAgICApICAhICEoICAhKEYgKTQgICAiQyAhICAgIEAgICAgIAorTSAgICAgMEAgNTAgJyAgICAqMCAnICEoICAhKS8gI0FWN1ZFTj0lXUE8RylBPjAgIDxAICAkQCggKFAgJQorTSBYICAqSDAgICAgRCAgJCAkQCAgJEcsIEUwICAgKiwgJCAgICIgICAgICAgICAgISIgITUgIDggICAgVAorTSAgPCAkQCAgJEo8IC4nOT89NllTOjY9Tjk2MT88VkFPPEcxPzg3KVI4N0QgICcoICAhKS8gIiwgITAuIAorTSAiS0wgICAgKSAgISAhKCAgISsrICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIDUwICUgICAgLEAgJworTSAhKCAgIStdICNBVjdXLUk5VllFOSVdUzomXVI9JV1BPEcpQT4wICA8QCAgJEo8IChQICUgWCAgKkswIAorTSAgIEQgICQgJEAgICRSJCBFMCAgICosICQgICAiICAgICAgICAgICEiICE1ICAwICAgIEsgIDwgJEAgIAorTSRUUCAuJzk/PFZBTzxHMT84NylSODdEICAnKCAgIStdICIsICEwLiAgIktIICAgICkgICEgISggICEtUAorTSApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCAjICAgICxQICcgISggICEuQyAjQVY3VzVOPFZFRworTTtGNUQ3Vi1IODcpPzg3KVI4N0QgICcoICAhLSwgIiwgITAuICAiSUAgICAgKSAgISAhKCAgIS8nICk0IAorTSAgIkMgISAgICBAICAgICAgICAgIDBAIDUwICIgICAgLDAgJyAhKCAgIS9YICNBVjdXLUk5VllFOSVdQworTTomJVI3ViVSPEYlWSAgIVIgICAzSFAgQyAgNCNAICBKSCAgICAiMCAgMCAyICAgNCcgIjUgICAgSFAgMAorTSAgICggICAgICAgICAgJCggJTQgIDAgICAiSCAhUCAyICAgNDFAIFg9RV1DOiYlUjdWJVI8RiVZICAhUgorTSAgIDNeICBDICA0I0AgIEswICAgICIwICFQIDIgICA0OkAgWD1FXUQ7VzVCOyY0ICAlNCAjUCBDICA0IworTUAgIEo8ICAgICIsICFQIDIgICA0QzAgWD1FXUY7Jl1BPSAgIDUwIC4gIiwgITAuICAiSkggICAgKlAgJworTSAhKCAgITJYICNBVjdXNU48VkVHO0Y1RDdWUU87RjwgICU0ICMgIEMgIDQjQCAgSlkgICAgIkQgIVAgMgorTSAgIDRYMCBYPUVdUzo2PU45NjE/OyZdTjlQICA1MCArICIsICEwLiAgIklEICAgIChAICcgISggICE0IworTSAjQVY3VlFPO0Y8ICAlNCAiQCBDICA0I0AgIEpVICAgICJIICFQIDIgICA1KzAgWD1FXVU7Ry1JOVZZRQorTTklXUk7RzAgICU0ICIwIEMgIDQjQCAgSjcgICAgIkAgIVAgMiAgIDU1MCBYPUVdUzo2PU45NjE/OjZZVAorTSAgITUgIEAgKFAgJSBYICAqRUAgICAgQSAgPCAkQCAgJTc4IC4nOT86NllUICAhNSAgPCAoUCAlIFggIAorTSpHQCAgICBMICA8ICRAICAlOiggLic5Pz02WVM6Nj1OOTYxPzxWQU88RzAgICU0ICFAIEMgIDQjQCAgSgorTTsgICAgIkggIVAgMiAgIDVTICBYPUVdUzo2PU45NjE/PFZBTzxHMCAgJTQgITAgQyAgNCNAICBKUiAgIAorTSAiLCAhUCAyICAgNVtQIFg9RV1TOiZdUj0gICA1MCAkICIsICEwLiAgIks4ICAgICpQICcgISggICE4OgorTSAjQVY3VzVOPFZFRztGNUQ3Vi1IODcoICAlNCAgUCBDICA0I0AgIEpJICAgICJEICFQIDIgICA2MFAgWAorTT1FXVM6Nj1OOTYxPzhWQUE8QCAgNTAgIiAiLCAhMC4gICJLQCAgICAoQCAnICEoICAhOUUgI0FWN1YtSAorTTg3KCAgJTQgIDAgQyAgNCNAICBLOSAgICAgMCAgICAnICAgICAgICJESCAgIS1QICAgIVlfX1wgICAgIAorTSAgICA+T19fICAgICxAICAgJ09fX1AgICAmMCAgICFdX19cICAgIjYgICAgP09fXyAgICBSICAgICdfXworTV9QICAgL0ggICAiIV9fXCAgICRMICAgIEBPX18gICAhN0AgICAoL19fUCAgIDkgICAgIiVfX1wgICAnIgorTSAgICBBT19fICAgIV0gICAgKD9fX1AgICBCOCAgICIpX19cICAgKTggICAgQk9fXyAgICJFICAgICsrXworTV9QICAgTSAgICAiVV9fXCAgICtGICAgIE1PX18gICAiWyAgICArP19fUCAgIE8wICAgIllfX1wgICArXAorTSAgICBOT19fICAgIyEgICAgK09fX1AgICBQUCAgICJdX19cICAgLDQgICAgT09fXyAgICMnQCAgICtfXworTV9QICAgUkAgICAjIV9fXCAgICxSICAgIFBPX18gICAjLyAgICAsL19fUCAgIFQ4ICAgIyVfX1wgICAtMAorTSAgICBRT19fICAgIzZAICAgLEdfX1AgICBWWCAgICMqX19cICAgLVggICAgUl9fXyAgICNAQCAgICxXXworTV9QICAgWFAgICAjLl9fXCAgIC42ICAgIFNfX18gICAjSCAgICAtJ19fUCAgIFpIICAgIzJfX1wgICAuVAorTSAgICBUX19fICAgI09AICAgLTdfX1AgICBcQCAgICM2X19cICAgLzIgICAgVV9fXyAgICNXICAgIC1HXworTV9QICAgXjggICAjOl9fXCAgIC9QICAgIFcvX18gICAkISAgICAtV19fUCAgISBYICAgIz5fX1wgICAwOAorTSAgICBYL19fICAgJChAICAgLidfX1AgICEiUCAgICNCX19cICAgMFYgICAgWS9fXyAgICQwICAgIC43XworTV9QICAhJEggICAjRl9fXCAgIDE0ICAgIFovX18gICAkN0AgICAuR19fUCAgISZAICAgI0pfX1wgICAxUgorTSAgICBbL19fICAgJD8gICAgLldfX1AgICEoOCAgICNPX19cICAgMjAgICAgXC9fXyAgICRGQCAgIC8nXworTV9QICAhKjAgICAjUl9fXCAgIDJOICAgIF0vX18gICAkTiAgICAvO19fUCAgISwoICAgI1dfX1wgICAzLAorTSAgICAgL19fICAgJFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgJCAgICAhICAgICBIICAgLTAgICAjNCAgICAkUCAgICAgICAgICAgICAgIDAgIAorTSAgICAgICApICAgICEwICAgICogICAjSCAgICBaICAgIDtQICAgICMgICAgICAgICAgMCAgICAkICAgIAorTSNQICAgIEwgICAgIkAgICJJICAgIEowICAgIyAgICAgISAgICAgJCAgICAkICAgICQgICAgITwgICAgIworTSAgICAgSCAgIFYwICAgLUQgICAgPlAgICAgICAgICAgICAgICAwICAgICAgICAgPyAgICAhICAgICAqIAorTSAgL0AgICAjWCAgICAjICAgICAjICAgICFQICAgIDAgICAgLCAgICAqMCAgICAkICAgICZAICAkJCAgIAorTSEhICAgICAkICAgICAgICAgICAgICAgJCAgICAgICAgICJcICAgICEgICAgIUggICEhMCAgIDA0ICAgIAorTTkgICAgICAgICAgICAgICAhICAgICEwICAgIFQgICAgIDAgICAgOiAgIDFYICAgJD4gICAhNDAgICAgIAorTSAgICAgICAgICAwICAgICAgICAgLkAgICAgJCAgICAmQCAgKU8gICAiO1AgICAgJCAgICAgICAgICAgIAorTSAgICQgICAgICAgICAkICAgICAhICAgICBYICAqPCAgICBHICAgICAiICAgICAgICAgICAgICAgISAgIAorTSAgICAgICEmICAgICAwICAgIC4gICJHKCAgIClSICAgICFQICAgICAgICAgICAgICAgMCAgICAkICAgIAorTTJQICAgIDggICAgI0AgIElZICAgIj4wICAgIVAgICAgISAgICAgICAgICAkICAgICIgICAgJTAgICAgKAorTSAgICAgWCAgKkVAICAgSTggICAhUCAgICAgICAgICAgICAgICIgICAgICAgICAhOSAgICAgQCAgICAgIAorTSAgICAgICAqNiAgICFQICAgICAvICAgICcgICAgIDAgICAgMCAgICA4MCAgICAsICAgICAgICAgICAgIAorTSQ1QCAgIDM0ICAgICAgICAgICAgICAgISAgICAgICAgICZEICAgICMgICAgICAgICAgICAgIThMICAgIAorTSAgICAgICAgICAgICAgICAhICAgICAgICAgIVAgICAgIFAgICAgICAgICAgICAgNisgICAgKSAgICAgIAorTSAgICAgICAgICAkICAgICAgICAgPkAgICAgJCAgICAgICAgICAgICAlS1AgICAjLyAgICAgICAgICAgIAorTSAgICQgICAgICAgICAoLCAgICAhICAgICAgICAgICAgICE+LCAgIDY8ICAgICAgICAgICAgICAgISAgIAorSiAgICAgICIqICAgICAwICAgICAgICAgICAgIE1fICAgIEkwICAgICAgICAgICAgICAgMCAgICAgCisgCitlbmQKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbWFpbnQuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tYWludC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1OWVkMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbWFpbnQuZXhwCkBAIC0wLDAgKzEsNTc4IEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRWxlbmEgWmFubm9uaSAoZXphbm5vbmlAY3lnbnVzLmNvbSkKKworIyB0aGlzIGZpbGUgdGVzdHMgbWFpbnRlbmFuY2UgY29tbWFuZHMgYW5kIGhlbHAgb24gdGhvc2UuCisKKyMgc291cmNlIGZpbGUgdXNlZCBpcyBicmVhay5jCisKKworI21haW50ZW5hbmNlIGNoZWNrLXN5bXRhYnMgLS0gQ2hlY2sgY29uc2lzdGVuY3kgb2YgcHN5bXRhYnMgYW5kIHN5bXRhYnMKKyNtYWludGVuYW5jZSBzcGFjZSAtLSBTZXQgdGhlIGRpc3BsYXkgb2Ygc3BhY2UgdXNhZ2UKKyNtYWludGVuYW5jZSB0aW1lIC0tIFNldCB0aGUgZGlzcGxheSBvZiB0aW1lIHVzYWdlCisjbWFpbnRlbmFuY2UgZGVtYW5nbGUgLS0gRGVtYW5nbGUgYSBDKysgbWFuZ2xlZCBuYW1lCisjbWFpbnRlbmFuY2UgZHVtcC1tZSAtLSBHZXQgZmF0YWwgZXJyb3I7IG1ha2UgZGVidWdnZXIgZHVtcCBpdHMgY29yZQorI21haW50ZW5hbmNlIHByaW50IC0tIE1haW50ZW5hbmNlIGNvbW1hbmQgZm9yIHByaW50aW5nIEdEQiBpbnRlcm5hbCBzdGF0ZQorI21haW50ZW5hbmNlIGluZm8gLS0gQ29tbWFuZHMgZm9yIHNob3dpbmcgaW50ZXJuYWwgaW5mbyBhYm91dCB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZAorIworI21haW50ZW5hbmNlIHByaW50IHN0YXRpc3RpY3MgLS0gUHJpbnQgc3RhdGlzdGljcyBhYm91dCBpbnRlcm5hbCBnZGIgc3RhdGUKKyNtYWludGVuYW5jZSBwcmludCBvYmpmaWxlcyAtLSBQcmludCBkdW1wIG9mIGN1cnJlbnQgb2JqZWN0IGZpbGUgZGVmaW5pdGlvbnMKKyNtYWludGVuYW5jZSBwcmludCBwc3ltYm9scyAtLSBQcmludCBkdW1wIG9mIGN1cnJlbnQgcGFydGlhbCBzeW1ib2wgZGVmaW5pdGlvbnMKKyNtYWludGVuYW5jZSBwcmludCBtc3ltYm9scyAtLSBQcmludCBkdW1wIG9mIGN1cnJlbnQgbWluaW1hbCBzeW1ib2wgZGVmaW5pdGlvbnMKKyNtYWludGVuYW5jZSBwcmludCBzeW1ib2xzIC0tIFByaW50IGR1bXAgb2YgY3VycmVudCBzeW1ib2wgZGVmaW5pdGlvbnMKKyNtYWludGVuYW5jZSBwcmludCB0eXBlIC0tIFByaW50IGEgdHlwZSBjaGFpbiBmb3IgYSBnaXZlbiBzeW1ib2wKKyNtYWludGVuYW5jZSBwcmludCB1bndpbmQgLS0gUHJpbnQgdW53aW5kIHRhYmxlIGVudHJ5IGF0IGdpdmVuIGFkZHJlc3MKKyMKKyMKKyNtYWludGVuYW5jZSBpbmZvIHNlY3Rpb25zIC0tIExpc3QgdGhlIEJGRCBzZWN0aW9ucyBvZiB0aGUgZXhlYyBhbmQgY29yZSBmaWxlcworI21haW50ZW5hbmNlIGluZm8gYnJlYWtwb2ludHMgLS0gU3RhdHVzIG9mIGFsbCBicmVha3BvaW50cworIworCisKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisgICAgICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorICAgICAgICB9CisKK2dsb2JhbCB1c2VzdHVicworCisjCisjIHRlc3QgcnVubmluZyBwcm9ncmFtcworIworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAiYnJlYWsiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIGFkZGl0aW9uYWxfZmxhZ3M9LXd9XSAhPSAiIgorIH0geworICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCitpZiAhW3J1bnRvX21haW5dIHRoZW4geworICAgICAgICBwZXJyb3IgInRlc3RzIHN1cHByZXNzZWQiCit9CisKKworIyBUaGUgY29tbWFuZHMgd2UgdGVzdCBoZXJlIHByb2R1Y2UgbWFueSBsaW5lcyBvZiBvdXRwdXQ7IGRpc2FibGUgInByZXNzIAorIyA8cmV0dXJuPiB0byBjb250aW51ZSIgcHJvbXB0cy4KK3NlbmRfZ2RiICJzZXQgaGVpZ2h0IDBcbiIKK2dkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIgorCisjIHVzZSBhIGxhcmdlciBleHBlY3QgaW5wdXQgYnVmZmVyIGZvciBsb25nIGhlbHAgb3V0cHV0cy4KK21hdGNoX21heCA2MDAwCisKKyMKKyMgdGhpcyBjb21tYW5kIGRvZXMgbm90IHByb2R1Y2UgYW55IG91dHB1dAorIyB1bmxlc3MgdGhlcmUgaXMgc29tZSBwcm9ibGVtIHdpdGggdGhlIHN5bXRhYnMgYW5kIHBzeW10YWJzCisjIHNvIHRoYXQgYnJhbmNoIHdpbGwgcmVhbGx5IG5ldmVyIGJlIGNvdmVyZWQgaW4gdGhpcyB0ZXN0cyBoZXJlISEKKyMKKworc2VuZF9nZGIgIm1haW50IGNoZWNrLXN5bXRhYnNcbiIKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJebWFpbnQgY2hlY2stc3ltdGFicy4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAibWFpbnQgY2hlY2stc3ltdGFicyIgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJtYWludCBjaGVjay1zeW10YWJzIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBtYWludCBjaGVjay1zeW10YWJzIiB9CisgICAgICAgIH0KKworc2VuZF9nZGIgIm1haW50IHNwYWNlXG4iCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiXCJtYWludGVuYW5jZSBzcGFjZVwiIHRha2VzIGEgbnVtZXJpYyBhcmd1bWVudFxcLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgIm1haW50IHNwYWNlIiB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgIm1haW50IHNwYWNlIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBtYWludCBzcGFjZSIgfQorICAgICAgICB9CisKK3NlbmRfZ2RiICJtYWludCBzcGFjZSAxXG4iCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiU3BhY2UgdXNlZDogJGRlY2ltYWwgXFwoXFwrJGRlY2ltYWwgZm9yIHRoaXMgY29tbWFuZFxcKS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgIm1haW50IHNwYWNlIDEiIH0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgZmFpbCAibWFpbnQgc3BhY2UgMSIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgbWFpbnQgc3BhY2UgMSIgfQorICAgICAgICB9CisKKworc2VuZF9nZGIgIm1haW50IHRpbWVcbiIKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJcIm1haW50ZW5hbmNlIHRpbWVcIiB0YWtlcyBhIG51bWVyaWMgYXJndW1lbnRcXC4uKlNwYWNlIHVzZWQ6ICRkZWNpbWFsIFxcKFxcKyRkZWNpbWFsIGZvciB0aGlzIGNvbW1hbmRcXCkuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJtYWludCB0aW1lIiB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgIm1haW50IHRpbWUiIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIG1haW50IHRpbWUiIH0KKyAgICAgICAgfQorCitzZW5kX2dkYiAibWFpbnQgdGltZSAxXG4iCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiQ29tbWFuZCBleGVjdXRpb24gdGltZTogJGRlY2ltYWwuKlNwYWNlIHVzZWQ6ICRkZWNpbWFsIFxcKFxcKyRkZWNpbWFsIGZvciB0aGlzIGNvbW1hbmRcXCkuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJtYWludCB0aW1lIDEiIH0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgZmFpbCAibWFpbnQgdGltZSAxIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBtYWludCB0aW1lIDEiIH0KKyAgICAgICAgfQorCitzZW5kX2dkYiAibWFpbnQgdGltZSAwXG4iCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiU3BhY2UgdXNlZDogJGRlY2ltYWwgXFwoXFwrJGRlY2ltYWwgZm9yIHRoaXMgY29tbWFuZFxcKS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgIm1haW50IHRpbWUgMCIgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJtYWludCB0aW1lIDAiIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIG1haW50IHRpbWUgMCIgfQorICAgICAgICB9CisKKworc2VuZF9nZGIgIm1haW50IHNwYWNlIDBcbiIKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJtYWludCBzcGFjZSAwXHJcbiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJtYWludCBzcGFjZSAwIiB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgIm1haW50IHNwYWNlIDAiIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIG1haW50IHNwYWNlIDAiIH0KKyAgICAgICAgfQorCitzZW5kX2dkYiAibWFpbnQgZGVtYW5nbGVcbiIKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJcIm1haW50ZW5hbmNlIGRlbWFuZ2xlXCIgdGFrZXMgYW4gYXJndW1lbnQgdG8gZGVtYW5nbGVcXC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJtYWludCBkZW1hbmdsZSIgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJtYWludCBkZW1hbmdsZSIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgbWFpbnQgZGVtYW5nbGUiIH0KKyAgICAgICAgfQorCitzZW5kX2dkYiAibWFpbnQgZGVtYW5nbGUgbWFpblxuIgorZ2RiX2V4cGVjdCAgeworICAgICAgICAtcmUgIkNhbid0IGRlbWFuZ2xlIFwibWFpblwiLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAibWFpbnQgZGVtYW5nbGUiIH0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgZmFpbCAibWFpbnQgZGVtYW5nbGUiIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIG1haW50IGRlbWFuZ2xlIiB9CisgICAgICAgIH0KKworCitzZW5kX2dkYiAibWFpbnQgcHJpbnQgc3RhdGlzdGljc1xuIgorZ2RiX2V4cGVjdCAgeworICAgICAgICAtcmUgIlN0YXRpc3RpY3MgZm9yLipicmVhay4qTnVtYmVyIG9mIFwibWluaW1hbFwiIHN5bWJvbHMgcmVhZC4qTnVtYmVyIG9mIFwicGFydGlhbFwiIHN5bWJvbHMgcmVhZC4qTnVtYmVyIG9mIFwidHlwZXNcIiBkZWZpbmVkLipUb3RhbCBtZW1vcnkgdXNlZCBmb3IgcHN5bWJvbCBvYnN0YWNrLipUb3RhbCBtZW1vcnkgdXNlZCBmb3IgcHN5bWJvbCBjYWNoZS4qVG90YWwgbWVtb3J5IHVzZWQgZm9yIHN5bWJvbCBvYnN0YWNrLipUb3RhbCBtZW1vcnkgdXNlZCBmb3IgdHlwZSBvYnN0YWNrLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAibWFpbnQgcHJpbnQgc3RhdGlzdGljcyIgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJtYWludCBwcmludCBzdGF0aXN0aWNzIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBtYWludCBwcmludCBzdGF0aXN0aWNzIiB9CisgICAgICAgIH0KKworc2VuZF9nZGIgIm1haW50IHByaW50IG9iamZpbGVzXG4iCisjIFRvIGF2b2lkIHRpbWVvdXRzLCB3ZSBhdm9pZCBleHBlY3RzIHdpdGggbWFueSAuKiBwYXR0ZXJucyB0aGF0IG1hdGNoCisjIG1hbnkgbGluZXMuCitnZGJfZXhwZWN0ICB7CisgICAgLXJlICIuKk9iamVjdCBmaWxlLipicmVhazogIE9iamZpbGUgYXQgJGhleCwgYmZkIGF0ICRoZXgsIFxbMC05XF0qIG1pbnN5bXNcW1xyXHQgXF0rXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJtYWludCBwcmludCBvYmpmaWxlczogaGVhZGVyIiB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgeyBmYWlsICJtYWludCBwcmludCBvYmpmaWxlczogaGVhZGVyIiB9CisgICAgdGltZW91dCAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgbWFpbnQgcHJpbnQgb2JqZmlsZXM6IGhlYWRlciIgfQorfQorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKlBzeW10YWJzOlxbXHJcdCBcXStcbiIgeyBwYXNzICJtYWludCBwcmludCBvYmpmaWxlczogcHN5bXRhYnMiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgICB7IGZhaWwgIm1haW50IHByaW50IG9iamZpbGVzOiBwc3ltdGFicyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgbWFpbnQgcHJpbnQgb2JqZmlsZXM6IHBzeW10YWJzIiB9Cit9CitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qU3ltdGFiczpcW1xyXHQgXF0rXG4iICB7IHBhc3MgIm1haW50IHByaW50IG9iamZpbGVzOiBzeW10YWJzIiB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgICAgeyBmYWlsICJtYWludCBwcmludCBvYmpmaWxlczogc3ltdGFicyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgbWFpbnQgcHJpbnQgb2JqZmlsZXM6IHN5bXRhYnMiIH0KK30KK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgcGFzcyAibWFpbnQgcHJpbnQgb2JqZmlsZXM6IHByb21wdCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIG1haW50IHByaW50IG9iamZpbGVzOiBwcm9tcHQiIH0KK30KKworc2VuZF9nZGIgIm1haW50IHByaW50IHBzeW1ib2xzXG4iCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAicHJpbnQtcHN5bWJvbHMgdGFrZXMgYW4gb3V0cHV0IGZpbGUgbmFtZSBhbmQgb3B0aW9uYWwgc3ltYm9sIGZpbGUgbmFtZS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgIm1haW50IHByaW50IHBzeW1ib2xzIHcvbyBhcmdzIiB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgIm1haW50IHByaW50IHBzeW1ib2xzIHcvbyBhcmdzIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBtYWludCBwcmludCBwc3ltYm9scyB3L28gYXJncyIgfQorICAgICAgICB9CisKK3NlbmRfZ2RiICJtYWludCBwcmludCBwc3ltYm9scyBwc3ltYm9sc19vdXRwdXRcbiIKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJebWFpbnQgcHJpbnQgcHN5bWJvbHMgcHN5bWJvbHNfb3V0cHV0XHJcbiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgeworICAgICAgICAgIHNlbmRfZ2RiICJzaGVsbCBscyBwc3ltYm9sc19vdXRwdXRcbiIKKyAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAtcmUgInBzeW1ib2xzX291dHB1dFxyXG4kZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgeworCSAgICAgICAgICAjIFdlIHdhbnQgdGhpcyBncmVwIHRvIGJlIGFzIHNwZWNpZmljIGFzIHBvc3NpYmxlLAorCSAgICAgICAgICAjIHNvIGl0J3MgbGVzcyBsaWtlbHkgdG8gbWF0Y2ggc3ltYm9sIGZpbGUgbmFtZXMgaW4KKwkgICAgICAgICAgIyBwc3ltYm9sc19vdXRwdXQuICBZZXMsIHRoaXMgYWN0dWFsbHkgaGFwcGVuZWQ7CisJICAgICAgICAgICMgcG9vciBleHBlY3QgZ290IHRvbnMgb2Ygb3V0cHV0LCBhbmQgdGltZWQgb3V0CisJICAgICAgICAgICMgdHJ5aW5nIHRvIG1hdGNoIGl0LiAgIC0tLSBKaW0gQmxhbmR5IDxqaW1iQGN5Z251cy5jb20+CisgICAgICAgICAgICAgICAgICBzZW5kX2dkYiAic2hlbGwgZ3JlcCAnbWFpbi4qZnVuY3Rpb24nIHBzeW1ib2xzX291dHB1dFxuIgorICAgICAgICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAtcmUgIi5tYWluLiwgZnVuY3Rpb24sICRoZXguKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgIm1haW50IHByaW50IHBzeW1ib2xzIiB9CisgICAgICAgICAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJtYWludCBwcmludCBwc3ltYm9scyIgfQorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBtYWludCBwcmludCBwc3ltYm9scyIgfQorICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGdkYl90ZXN0ICJzaGVsbCBybSAtZiBwc3ltYm9sc19vdXRwdXQiICIiCisgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgIm1haW50IHByaW50IHBzeW1ib2xzIiB9CisgICAgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgbWFpbnQgcHJpbnQgcHN5bWJvbHMiIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgZmFpbCAibWFpbnQgcHJpbnQgcHN5bWJvbHMiIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIG1haW50IHByaW50IHBzeW1ib2xzIiB9CisgICAgICAgIH0KKworCitzZW5kX2dkYiAgIm1haW50IHByaW50IG1zeW1ib2xzXG4iCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAicHJpbnQtbXN5bWJvbHMgdGFrZXMgYW4gb3V0cHV0IGZpbGUgbmFtZSBhbmQgb3B0aW9uYWwgc3ltYm9sIGZpbGUgbmFtZS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgIm1haW50IHByaW50IG1zeW1ib2xzIHcvbyBhcmdzIiB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgIm1haW50IHByaW50IG1zeW1ib2xzIHcvbyBhcmdzIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBtYWludCBwcmludCBtc3ltYm9scyB3L28gYXJncyIgfQorICAgICAgICB9CisKK3NlbmRfZ2RiICJtYWludCBwcmludCBtc3ltYm9scyBtc3ltYm9sc19vdXRwdXRcbiIKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJebWFpbnQgcHJpbnQgbXN5bWJvbHMgbXN5bWJvbHNfb3V0cHV0XHJcbiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgeworICAgICAgICAgIHNlbmRfZ2RiICJzaGVsbCBscyBtc3ltYm9sc19vdXRwdXRcbiIKKyAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAtcmUgIm1zeW1ib2xzX291dHB1dFxyXG4kZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc2VuZF9nZGIgInNoZWxsIGdyZXAgZmFjdG9yaWFsIG1zeW1ib2xzX291dHB1dFxuIgorICAgICAgICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAtcmUgIlxcXFsgKiRkZWNpbWFsXFxcXSBUXFsgXHRcXSskaGV4IGZhY3RvcmlhbC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAibWFpbnQgcHJpbnQgbXN5bWJvbHMiIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgIm1haW50IHByaW50IG1zeW1ib2xzIiB9CisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIG1haW50IHByaW50IG1zeW1ib2xzIiB9CisgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZ2RiX3Rlc3QgInNoZWxsIHJtIC1mIG1zeW1ib2xzX291dHB1dCIgIiIKKworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJtYWludCBwcmludCBtc3ltYm9scyIgfQorICAgICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIG1haW50IHByaW50IG1zeW1ib2xzIiB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgIm1haW50IHByaW50IG1zeW1ib2xzIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBtYWludCBwcmludCBtc3ltYm9scyIgfQorICAgICAgICB9CisKKworc2VuZF9nZGIgIm1haW50IHByaW50IHN5bWJvbHNcbiIKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJBcmd1bWVudHMgbWlzc2luZzogYW4gb3V0cHV0IGZpbGUgbmFtZSBhbmQgYW4gb3B0aW9uYWwgc3ltYm9sIGZpbGUgbmFtZS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgIm1haW50IHByaW50IHN5bWJvbHMgdy9vIGFyZ3MiIH0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgZmFpbCAibWFpbnQgcHJpbnQgc3ltYm9scyB3L28gYXJncyIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgbWFpbnQgcHJpbnQgc3ltYm9scyB3L28gYXJncyIgfQorICAgICAgICB9CisKK3NlbmRfZ2RiICJtYWludCBwcmludCBzeW1ib2xzIHN5bWJvbHNfb3V0cHV0XG4iCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiXm1haW50IHByaW50IHN5bWJvbHMgc3ltYm9sc19vdXRwdXRcclxuJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICB7CisgICAgICAgICAgc2VuZF9nZGIgInNoZWxsIGxzIHN5bWJvbHNfb3V0cHV0XG4iCisgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgLXJlICJzeW1ib2xzX291dHB1dFxyXG4kZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgeworCSAgICAgICAgICAjIFNlZSBjb21tZW50cyBmb3IgYG1haW50IHByaW50IHBzeW1ib2xzJy4KKyAgICAgICAgICAgICAgICAgIHNlbmRfZ2RiICJzaGVsbCBncmVwICdtYWluLipibG9jaycgc3ltYm9sc19vdXRwdXRcbiIKKyAgICAgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgICAgLXJlICJpbnQgbWFpblxcKGludCwgY2hhciBcXCpcXCosIGNoYXIgXFwqXFwqXFwpOyBibG9jay4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAibWFpbnQgcHJpbnQgc3ltYm9scyIgfQorICAgICAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgZmFpbCAibWFpbnQgcHJpbnQgc3ltYm9scyIgfQorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBtYWludCBwcmludCBzeW1ib2xzIiB9CisgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZ2RiX3Rlc3QgInNoZWxsIHJtIC1mIHN5bWJvbHNfb3V0cHV0IiAiIgorCisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgIm1haW50IHByaW50IHN5bWJvbHMiIH0KKyAgICAgICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBtYWludCBwcmludCBzeW1ib2xzIiB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgIm1haW50IHByaW50IHN5bWJvbHMiIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIG1haW50IHByaW50IHN5bWJvbHMiIH0KKyAgICAgICAgfQorCisKK3NlbmRfZ2RiICJtYWludCBwcmludCB0eXBlIGFyZ2NcbiIKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJ0eXBlIG5vZGUgJGhleFxyXG5uYW1lIC5pbnQuIFxcKCRoZXhcXClcclxuY29kZSAkaGV4IFxcKFRZUEVfQ09ERV9JTlRcXClcclxubGVuZ3RoIDRcclxub2JqZmlsZSAkaGV4XHJcbnRhcmdldF90eXBlICRoZXhcclxucG9pbnRlcl90eXBlICRoZXhcclxucmVmZXJlbmNlX3R5cGUgJGhleFxyXG5mbGFncyAkaGV4XHJcbm5maWVsZHMgMCAkaGV4XHJcbnZwdHJfYmFzZXR5cGUgJGhleFxyXG52cHRyX2ZpZWxkbm8gLTFcclxudHlwZV9zcGVjaWZpYyAkaGV4XHJcbiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJtYWludCBwcmludCB0eXBlIiB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgIm1haW50IHByaW50IHR5cGUiIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIG1haW50IHByaW50IHR5cGUiIH0KKyAgICAgICAgfQorCisjc2VuZF9nZGIgIm1haW50IHByaW50IHVud2luZCAmbWFpblxuIgorI2dkYl9leHBlY3QgIHsKKyMgICAgICAgIC1yZSAiLip1bndpbmRfdGFibGVfZW50cnkgXFwoJGhleFxcKTpcclxuXHRyZWdpb25fc3RhcnQgPSAkaGV4IDxtYWluPlxyXG5cdHJlZ2lvbl9lbmQgPSAkaGV4IDxtYWluXFwrMjIwPlxyXG5cdGZsYWdzID0gQXJnc19zdG9yZWQgU2F2ZV9SUFxyXG5cdFJlZ2lvbl9kZXNjcmlwdGlvbiA9ICRoZXhcclxuXHRFbnRyeV9GUiA9ICRoZXhcclxuXHRFbnRyeV9HUiA9ICRoZXhcclxuXHRUb3RhbF9mcmFtZV9zaXplID0gJGhleFxyXG4kZ2RiX3Byb21wdCAkIlwKKyMgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgIm1haW50IHByaW50IHVud2luZCIgfQorIyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgZmFpbCAibWFpbnQgcHJpbnQgdW53aW5kIiB9CisjICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgbWFpbnQgcHJpbnQgdW53aW5kIiB9CisjICAgICAgICB9CisKK3NldCBvbGR0aW1lb3V0ICR0aW1lb3V0CitzZXQgdGltZW91dCBbZXhwciAkdGltZW91dCArIDMwMF0KKworIyBJdCdkIGJlIG5pY2UgdG8gY2hlY2sgZm9yIGV2ZXJ5IHBvc3NpYmxlIHNlY3Rpb24uICBIb3dldmVyLCB0aGF0J3MKKyMgcHJvYmxlbWF0aWMsIHNpbmNlIHRoZSByZWxhdGl2ZSBvcmRlcmluZyB3YW5kZXJzIGZyb20gcmVsZWFzZSB0bworIyByZWxlYXNlIG9mIHRoZSBjb21waWxlcnMuICBJbnN0ZWFkLCB3ZSdsbCBqdXN0IGNoZWNrIGZvciB0d28KKyMgc2VjdGlvbnMgd2hpY2ggYXBwZWFyIHRvIGFsd2F5cyBjb21lIG91dCBpbiB0aGUgc2FtZSByZWxhdGl2ZQorIyBvcmRlci4gIChJZiB0aGF0IGNoYW5nZXMsIHRoZW4gd2Ugc2hvdWxkIGp1c3QgY2hlY2sgZm9yIG9uZQorIyBzZWN0aW9uLikKKyMKKyMgQW5kIGJ5IHRoZSB3YXk6IFRoaXMgdGVzdHBvaW50IHdpbGwgYnJlYWsgZm9yIFBBNjQsIHdoZXJlIGEub3V0J3MKKyMgYXJlIEVMRiBmaWxlcy4KKyMKK3NlbmRfZ2RiICJtYWludCBpbmZvIHNlY3Rpb25zXG4iCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiRXhlYyBmaWxlOlxyXG4uKmJyZWFrLiwgZmlsZSB0eXBlLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAibWFpbnQgaW5mbyBzZWN0aW9ucyIgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJtYWludCBpbmZvIHNlY3Rpb25zIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBtYWludCBpbmZvIHNlY3Rpb25zIiB9CisgICAgICAgIH0KKworc2VuZF9nZGIgIm1haW50IGluZm8gYnJlYWtwb2ludHNcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiTnVtXFsgXHRcXStUeXBlXFsgXHRcXStEaXNwXFsgXHRcXStFbmJcWyBcdFxdK0FkZHJlc3NcWyBcdFxdK1doYXRcclxuMVxbIFx0XF0rYnJlYWtwb2ludFxbIFx0XF0ra2VlcFxbIFx0XF0reVxbIFx0XF0rJGhleCBpbiBtYWluIGF0LipicmVhay5jOjYwXHJcblxbIFx0XF0rYnJlYWtwb2ludCBhbHJlYWR5IGhpdCAxIHRpbWVcclxuLiokZ2RiX3Byb21wdCAkIlwKKwkJCQl7IHBhc3MgIm1haW50IGluZm8gYnJlYWtwb2ludHMiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJtYWludCBpbmZvIGJyZWFrcG9pbnRzIiB9CisgICAgdGltZW91dAkJCXsgZmFpbCAiKHRpbWVvdXQpIG1haW50IGluZm8gYnJlYWtwb2ludHMiIH0KK30KKworIyBUcnkgaXQgYWdhaW4sIGFuZCBjaGVjayBmb3Igc2hsaWIgZXZlbnQgaW5mby4gIE5vdCBzdXBwb3J0ZWQgZXZlcnl3aGVyZS4KK2lmIHshIFtpc3RhcmdldCAiaHBwYSotKi1ocHV4KiJdfSB0aGVuIHsKKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCit9CitzZW5kX2dkYiAibWFpbnQgaW5mbyBicmVha3BvaW50c1xuIgorZ2RiX2V4cGVjdCAgeworICAgIC1yZSAiTnVtXFsgXHRcXStUeXBlXFsgXHRcXStEaXNwXFsgXHRcXStFbmJcWyBcdFxdK0FkZHJlc3NcWyBcdFxdK1doYXRcclxuMVxbIFx0XF0rYnJlYWtwb2ludFxbIFx0XF0ra2VlcFxbIFx0XF0reVxbIFx0XF0rJGhleCBpbiBtYWluIGF0LipicmVhay5jOjYwXHJcblxbIFx0XF0rYnJlYWtwb2ludCBhbHJlYWR5IGhpdCAxIHRpbWVcclxuLTFcWyBcdFxdK3NobGliIGV2ZW50c1xbIFx0XF0ra2VlcFxbIFx0XF0reVxbIFx0XF0rJGhleC4qYnJlYWtwb2ludCBhbHJlYWR5IGhpdC4qJGdkYl9wcm9tcHQgJCJcCisJICAgIHsgcGFzcyAibWFpbnQgaW5mbyBicmVha3BvaW50czogc2hsaWIgZXZlbnRzIiB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwlmYWlsICJtYWludCBpbmZvIGJyZWFrcG9pbnRzOiBzaGxpYiBldmVudHMiCisgICAgfQorICAgIHRpbWVvdXQgeworCWZhaWwgIih0aW1lb3V0KSBtYWludCBpbmZvIGJyZWFrcG9pbnRzOiBzaGxpYiBldmVudHMiCisgICAgfQorfQorCisKK3NlbmRfZ2RiICJtYWludCBwcmludFxuIgorZ2RiX2V4cGVjdCAgeworICAgICAgICAtcmUgIlwibWFpbnRlbmFuY2UgcHJpbnRcIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIGEgcHJpbnQgY29tbWFuZFxcLlxyXG5MaXN0Lip1bmFtYmlndW91c1xcLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgIm1haW50IHByaW50IHcvbyBhcmdzIiB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgIm1haW50IHByaW50IHcvbyBhcmdzIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBtYWludCBwcmludCB3L28gYXJncyIgfQorICAgICAgICB9CisKK3NlbmRfZ2RiICJtYWludCBpbmZvXG4iCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiXCJtYWludGVuYW5jZSBpbmZvXCIgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiBhbiBpbmZvIGNvbW1hbmRcXC5cclxuTGlzdC4qdW5hbWJpZ3VvdXNcXC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJtYWludCBpbmZvIHcvbyBhcmdzIiB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgIm1haW50IGluZm8gdy9vIGFyZ3MiIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIG1haW50IGluZm8gdy9vIGFyZ3MiIH0KKyAgICAgICAgfQorCitzZW5kX2dkYiAibWFpbnRcbiIKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJcIm1haW50ZW5hbmNlXCIgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiBhIG1haW50ZW5hbmNlIGNvbW1hbmRcXC5cclxuTGlzdC4qdW5hbWJpZ3VvdXNcXC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJtYWludCB3L28gYXJncyIgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJtYWludCB3L28gYXJncyIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgbWFpbnQgdy9vIGFyZ3MiIH0KKyAgICAgICAgfQorCisKK3NldCB0aW1lb3V0ICRvbGR0aW1lb3V0CisKKyM9PT09PT09PT09PT10ZXN0IGhlbHAgb24gbWFpbnQgY29tbWFuZHMKKworc2VuZF9nZGIgImhlbHAgbWFpbnRcbiIKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJDb21tYW5kcyBmb3IgdXNlIGJ5IEdEQiBtYWludGFpbmVyc1xcLi4qSW5jbHVkZXMgY29tbWFuZHMgdG8gZHVtcCBzcGVjaWZpYyBpbnRlcm5hbCBHREIgc3RydWN0dXJlcyBpbi4qYSBodW1hbiByZWFkYWJsZSBmb3JtLCB0byBjYXVzZSBHREIgdG8gZGVsaWJlcmF0ZWx5IGR1bXAgY29yZSwuKnRvIHRlc3QgaW50ZXJuYWwgZnVuY3Rpb25zIHN1Y2ggYXMgdGhlIEMuLiBkZW1hbmdsZXIsIGV0Y1xcLi4qTGlzdCBvZiBtYWludGVuYW5jZSBzdWJjb21tYW5kczouKm1haW50ZW5hbmNlIGNoZWNrLXN5bXRhYnMuKm1haW50ZW5hbmNlIGRlbWFuZ2xlLiptYWludGVuYW5jZSBkdW1wLW1lLiptYWludGVuYW5jZSBpbmZvLiptYWludGVuYW5jZSBwcmludC4qbWFpbnRlbmFuY2Ugc3BhY2UuKm1haW50ZW5hbmNlIHRpbWUuKlR5cGUuKmhlbHAgbWFpbnRlbmFuY2UuKmZvbGxvd2VkIGJ5IG1haW50ZW5hbmNlIHN1YmNvbW1hbmQgbmFtZSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uXFwuLipDb21tYW5kIG5hbWUgYWJicmV2aWF0aW9ucyBhcmUgYWxsb3dlZCBpZiB1bmFtYmlndW91c1xcLi4qJGdkYl9wcm9tcHQgJCJcCisgeyBwYXNzICJoZWxwIG1haW50IiB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgImhlbHAgbWFpbnQiIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGhlbHAgbWFpbnQiIH0KKyAgICAgICAgfQorCisKK3NlbmRfZ2RiICJoZWxwIG1haW50IGNoZWNrLXN5bXRhYnNcbiIKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJDaGVjayBjb25zaXN0ZW5jeSBvZiBwc3ltdGFicyBhbmQgc3ltdGFic1xcLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgImhlbHAgbWFpbnQgY2hlY2stc3ltdGFicyIgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJoZWxwIG1haW50IGNoZWNrLXN5bXRhYnMiIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGhlbHAgbWFpbnQgY2hlY2stc3ltdGFicyIgfQorICAgICAgICB9CisKK3NlbmRfZ2RiICJoZWxwIG1haW50IHNwYWNlXG4iCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiU2V0IHRoZSBkaXNwbGF5IG9mIHNwYWNlIHVzYWdlXFwuXHJcbklmIG5vbnplcm8sIHdpbGwgY2F1c2UgdGhlIGV4ZWN1dGlvbiBzcGFjZSBmb3IgZWFjaCBjb21tYW5kIHRvIGJlXHJcbmRpc3BsYXllZCwgZm9sbG93aW5nIHRoZSBjb21tYW5kJ3Mgb3V0cHV0XFwuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAiaGVscCBtYWludCBzcGFjZSIgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJoZWxwIG1haW50IHNwYWNlIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBoZWxwIG1haW50IHNwYWNlIiB9CisgICAgICAgIH0KKworc2VuZF9nZGIgImhlbHAgbWFpbnQgdGltZVxuIgorZ2RiX2V4cGVjdCAgeworICAgICAgICAtcmUgIlNldCB0aGUgZGlzcGxheSBvZiB0aW1lIHVzYWdlXFwuXHJcbklmIG5vbnplcm8sIHdpbGwgY2F1c2UgdGhlIGV4ZWN1dGlvbiB0aW1lIGZvciBlYWNoIGNvbW1hbmQgdG8gYmVcclxuZGlzcGxheWVkLCBmb2xsb3dpbmcgdGhlIGNvbW1hbmQncyBvdXRwdXRcXC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJoZWxwIG1haW50IHRpbWUiIH0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgZmFpbCAiaGVscCBtYWludCB0aW1lIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBoZWxwIG1haW50IHRpbWUiIH0KKyAgICAgICAgfQorCitzZW5kX2dkYiAiaGVscCBtYWludCBkZW1hbmdsZVxuIgorZ2RiX2V4cGVjdCAgeworICAgICAgICAtcmUgIkRlbWFuZ2xlIGEgQ1xcK1xcKyBtYW5nbGVkIG5hbWVcXC5cclxuQ2FsbCBpbnRlcm5hbCBHREIgZGVtYW5nbGVyIHJvdXRpbmUgdG8gZGVtYW5nbGUgYSBDXFwrXFwrIGxpbmsgbmFtZVxyXG5hbmQgcHJpbnRzIHRoZSByZXN1bHRcXC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJoZWxwIG1haW50IGRlbWFuZ2xlIiB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgImhlbHAgbWFpbnQgZGVtYW5nbGUiIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGhlbHAgbWFpbnQgZGVtYW5nbGUiIH0KKyAgICAgICAgfQorCitzZW5kX2dkYiAiaGVscCBtYWludCBkdW1wLW1lXG4iCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiR2V0IGZhdGFsIGVycm9yOyBtYWtlIGRlYnVnZ2VyIGR1bXAgaXRzIGNvcmVcXC5cclxuR0RCIHNldHMgaXQncyBoYW5kbGluZyBvZiBTSUdRVUlUIGJhY2sgdG8gU0lHX0RGTCBhbmQgdGhlbiBzZW5kc1xyXG5pdHNlbGYgYSBTSUdRVUlUIHNpZ25hbFxcLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgImhlbHAgbWFpbnQgZHVtcC1tZSIgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJoZWxwIG1haW50IGR1bXAtbWUiIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGhlbHAgbWFpbnQgZHVtcC1tZSIgfQorICAgICAgICB9CisKK3NlbmRfZ2RiICJoZWxwIG1haW50IHByaW50IHN0YXRpc3RpY3NcbiIKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJQcmludCBzdGF0aXN0aWNzIGFib3V0IGludGVybmFsIGdkYiBzdGF0ZVxcLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgImhlbHAgbWFpbnQgcHJpbnQgc3RhdGlzdGljcyIgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJoZWxwIG1haW50IHByaW50IHN0YXRpc3RpY3MiIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGhlbHAgbWFpbnQgcHJpbnQgc3RhdGlzdGljcyIgfQorICAgICAgICB9CisKK3NlbmRfZ2RiICJoZWxwIG1haW50IHByaW50IG9iamZpbGVzXG4iCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiUHJpbnQgZHVtcCBvZiBjdXJyZW50IG9iamVjdCBmaWxlIGRlZmluaXRpb25zXFwuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAiaGVscCBtYWludCBwcmludCBvYmpmaWxlcyIgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJoZWxwIG1haW50IHByaW50IG9iamZpbGVzIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBoZWxwIG1haW50IHByaW50IG9iamZpbGVzIiB9CisgICAgICAgIH0KKworc2VuZF9nZGIgImhlbHAgbWFpbnQgcHJpbnQgcHN5bWJvbHNcbiIKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJQcmludCBkdW1wIG9mIGN1cnJlbnQgcGFydGlhbCBzeW1ib2wgZGVmaW5pdGlvbnNcXC5cclxuRW50cmllcyBpbiB0aGUgcGFydGlhbCBzeW1ib2wgdGFibGUgYXJlIGR1bXBlZCB0byBmaWxlIE9VVEZJTEVcXC5cclxuSWYgYSBTT1VSQ0UgZmlsZSBpcyBzcGVjaWZpZWQsIGR1bXAgb25seSB0aGF0IGZpbGUncyBwYXJ0aWFsIHN5bWJvbHNcXC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgeyBwYXNzICJoZWxwIG1haW50IHByaW50IHBzeW1ib2xzIiB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgImhlbHAgbWFpbnQgcHJpbnQgcHN5bWJvbHMiIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGhlbHAgbWFpbnQgcHJpbnQgcHN5bWJvbHMiIH0KKyAgICAgICAgfQorCitzZW5kX2dkYiAiaGVscCBtYWludCBwcmludCBtc3ltYm9sc1xuIgorZ2RiX2V4cGVjdCAgeworICAgICAgICAtcmUgIlByaW50IGR1bXAgb2YgY3VycmVudCBtaW5pbWFsIHN5bWJvbCBkZWZpbml0aW9uc1xcLlxyXG5FbnRyaWVzIGluIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZSBhcmUgZHVtcGVkIHRvIGZpbGUgT1VURklMRVxcLlxyXG5JZiBhIFNPVVJDRSBmaWxlIGlzIHNwZWNpZmllZCwgZHVtcCBvbmx5IHRoYXQgZmlsZSdzIG1pbmltYWwgc3ltYm9sc1xcLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgImhlbHAgbWFpbnQgcHJpbnQgbXN5bWJvbHMiIH0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgZmFpbCAiaGVscCBtYWludCBwcmludCBtc3ltYm9scyIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgaGVscCBtYWludCBwcmludCBtc3ltYm9scyIgfQorICAgICAgICB9CisKK3NlbmRfZ2RiICJoZWxwIG1haW50IHByaW50IHN5bWJvbHNcbiIKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJQcmludCBkdW1wIG9mIGN1cnJlbnQgc3ltYm9sIGRlZmluaXRpb25zXFwuXHJcbkVudHJpZXMgaW4gdGhlIGZ1bGwgc3ltYm9sIHRhYmxlIGFyZSBkdW1wZWQgdG8gZmlsZSBPVVRGSUxFXFwuXHJcbklmIGEgU09VUkNFIGZpbGUgaXMgc3BlY2lmaWVkLCBkdW1wIG9ubHkgdGhhdCBmaWxlJ3Mgc3ltYm9sc1xcLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgImhlbHAgbWFpbnQgcHJpbnQgc3ltYm9scyIgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJoZWxwIG1haW50IHByaW50IHN5bWJvbHMiIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGhlbHAgbWFpbnQgcHJpbnQgc3ltYm9scyIgfQorICAgICAgICB9CisKKworc2VuZF9nZGIgImhlbHAgbWFpbnQgcHJpbnQgdHlwZVxuIgorZ2RiX2V4cGVjdCAgeworICAgICAgICAtcmUgIlByaW50IGEgdHlwZSBjaGFpbiBmb3IgYSBnaXZlbiBzeW1ib2xcXC5cclxuRm9yIGVhY2ggbm9kZSBpbiBhIHR5cGUgY2hhaW4sIHByaW50IHRoZSByYXcgZGF0YSBmb3IgZWFjaCBtZW1iZXIgb2ZcclxudGhlIHR5cGUgc3RydWN0dXJlLCBhbmQgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBkYXRhXFwuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAiaGVscCBtYWludCBwcmludCB0eXBlIiB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgImhlbHAgbWFpbnQgcHJpbnQgdHlwZSIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgaGVscCBtYWludCBwcmludCB0eXBlIiB9CisgICAgICAgIH0KKworI3NlbmRfZ2RiICJoZWxwIG1haW50IHByaW50IHVud2luZFxuIgorI2dkYl9leHBlY3QgIHsKKyMgICAgICAgIC1yZSAiUHJpbnQgdW53aW5kIHRhYmxlIGVudHJ5IGF0IGdpdmVuIGFkZHJlc3NcXC4uKiRnZGJfcHJvbXB0ICQiXAorIyAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAiaGVscCBtYWludCBwcmludCB1bndpbmQiIH0KKyMgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgImhlbHAgbWFpbnQgcHJpbnQgdW53aW5kIiB9CisjICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgaGVscCBtYWludCBwcmludCB1bndpbmQiIH0KKyMgICAgICAgIH0KKworc2VuZF9nZGIgImhlbHAgbWFpbnQgaW5mbyBzZWN0aW9uc1xuIgorZ2RiX2V4cGVjdCAgeworICAgICAgICAtcmUgIkxpc3QgdGhlIEJGRCBzZWN0aW9ucyBvZiB0aGUgZXhlYyBhbmQgY29yZSBmaWxlc1xcLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgImhlbHAgbWFpbnQgaW5mbyBzZWN0aW9ucyIgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJoZWxwIG1haW50IGluZm8gc2VjdGlvbnMiIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGhlbHAgbWFpbnQgaW5mbyBzZWN0aW9ucyIgfQorICAgICAgICB9CisKKworc2VuZF9nZGIgImhlbHAgbWFpbnQgaW5mbyBicmVha3BvaW50c1xuIgorZ2RiX2V4cGVjdCAgeworLXJlICJTdGF0dXMgb2YgYWxsIGJyZWFrcG9pbnRzLCBvciBicmVha3BvaW50IG51bWJlciBOVU1CRVIuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiaGVscCBtYWludCBpbmZvIGJyZWFrcG9pbnRzIiB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgImhlbHAgbWFpbnQgaW5mbyBicmVha3BvaW50cyIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgaGVscCBtYWludCBpbmZvIGJyZWFrcG9pbnRzIiB9CisgICAgICAgIH0KKworI3NlbmRfZ2RiICJoZWxwIG1haW50IGluZm8gYnJlYWtwb2ludHNcbiIKKyNleHBlY3QgIHsKKyMgICAgICAgIC1yZSAiU3RhdHVzIG9mIGFsbCBicmVha3BvaW50cywgb3IgYnJlYWtwb2ludCBudW1iZXIgTlVNQkVSXFwuXFsgXHJcblx0XF0rVGhlIFwiVHlwZVwiIGNvbHVtbiBpbmRpY2F0ZXMgb25lIG9mOlxbIFxyXG5cdFxdK2JyZWFrcG9pbnRcWyBcdFxdKy0gbm9ybWFsIGJyZWFrcG9pbnRcWyBcclxuXHRcXSt3YXRjaHBvaW50XFsgXHRcXSstIHdhdGNocG9pbnRcWyBcclxuXHRcXStsb25nam1wXFsgXHRcXSstIGludGVybmFsIGJyZWFrcG9pbnQgdXNlZCB0byBzdGVwIHRocm91Z2ggbG9uZ2ptcFxcKFxcKVxbIFxyXG5cdFxdK2xvbmdqbXAgcmVzdW1lIC0gaW50ZXJuYWwgYnJlYWtwb2ludCBhdCB0aGUgdGFyZ2V0IG9mIGxvbmdqbXBcXChcXClcWyBcclxuXHRcXSt1bnRpbFxbIFx0XF0rLSBpbnRlcm5hbCBicmVha3BvaW50IHVzZWQgYnkgdGhlIFwidW50aWxcIiBjb21tYW5kXFsgXHJcblx0XF0rZmluaXNoXFsgXHRcXSstIGludGVybmFsIGJyZWFrcG9pbnQgdXNlZCBieSB0aGUgXCJmaW5pc2hcIiBjb21tYW5kXFsgXHJcblx0XF0rVGhlIFwiRGlzcFwiIGNvbHVtbiBjb250YWlucyBvbmUgb2YgXCJrZWVwXCIsIFwiZGVsXCIsIG9yIFwiZGlzXCIgdG8gaW5kaWNhdGVcWyBcclxuXHRcXSt0aGUgZGlzcG9zaXRpb24gb2YgdGhlIGJyZWFrcG9pbnQgYWZ0ZXIgaXQgZ2V0cyBoaXRcXC4gIFwiZGlzXCIgbWVhbnMgdGhhdCB0aGVcWyBcclxuXHRcXSticmVha3BvaW50IHdpbGwgYmUgZGlzYWJsZWRcXC4gIFRoZSBcIkFkZHJlc3NcIiBhbmQgXCJXaGF0XCIgY29sdW1ucyBpbmRpY2F0ZSB0aGVcWyBcclxuXHRcXSthZGRyZXNzIGFuZCBmaWxlLmxpbmUgbnVtYmVyIHJlc3BlY3RpdmVseVxcLlxbIFxyXG5cdFxdK0NvbnZlbmllbmNlIHZhcmlhYmxlIFwiLipcIiBhbmQgZGVmYXVsdCBleGFtaW5lIGFkZHJlc3MgZm9yIFwieFwiXFsgXHJcblx0XF0rYXJlIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCBicmVha3BvaW50IGxpc3RlZFxcLlxbIFxyXG5cdFxdK0NvbnZlbmllbmNlIHZhcmlhYmxlIFwiLmJwbnVtXCIgY29udGFpbnMgdGhlIG51bWJlciBvZiB0aGUgbGFzdFxbIFxyXG5cdFxdK2JyZWFrcG9pbnQgc2V0XFwuLiokZ2RiX3Byb21wdCAkIlwKKyMgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgImhlbHAgbWFpbnQgaW5mbyBicmVha3BvaW50cyIgfQorIyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgZmFpbCAiaGVscCBtYWludCBpbmZvIGJyZWFrcG9pbnRzIiB9CisjICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgaGVscCBtYWludCBpbmZvIGJyZWFrcG9pbnRzIiB9CisjICAgICAgICB9CisKK3NlbmRfZ2RiICJoZWxwIG1haW50IGluZm9cbiIKK2dkYl9leHBlY3QgIHsKKyAgICAgICAgLXJlICJDb21tYW5kcyBmb3Igc2hvd2luZyBpbnRlcm5hbCBpbmZvIGFib3V0IHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkLip1bmFtYmlndW91c1xcLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgImhlbHAgbWFpbnQgaW5mbyIgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJoZWxwIG1haW50IGluZm8iIH0KKyAgICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGhlbHAgbWFpbnQgaW5mbyIgfQorICAgICAgICB9CisKK3NlbmRfZ2RiICJoZWxwIG1haW50IHByaW50XG4iCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiTWFpbnRlbmFuY2UgY29tbWFuZCBmb3IgcHJpbnRpbmcgR0RCIGludGVybmFsIHN0YXRlXFwuXFtcclxuXF0rTGlzdCBvZiBtYWludGVuYW5jZSBwcmludCBzdWJjb21tYW5kczpcW1xyXG5cXSttYWludGVuYW5jZSBwcmludCBtc3ltYm9scyAtLSBQcmludCBkdW1wIG9mIGN1cnJlbnQgbWluaW1hbCBzeW1ib2wgZGVmaW5pdGlvbnMuKm1haW50ZW5hbmNlIHByaW50IG9iamZpbGVzIC0tIFByaW50IGR1bXAgb2YgY3VycmVudCBvYmplY3QgZmlsZSBkZWZpbml0aW9ucy4qbWFpbnRlbmFuY2UgcHJpbnQgcHN5bWJvbHMgLS0gUHJpbnQgZHVtcCBvZiBjdXJyZW50IHBhcnRpYWwgc3ltYm9sIGRlZmluaXRpb25zLiptYWludGVuYW5jZSBwcmludCBzdGF0aXN0aWNzIC0tIFByaW50IHN0YXRpc3RpY3MgYWJvdXQgaW50ZXJuYWwgZ2RiIHN0YXRlLiptYWludGVuYW5jZSBwcmludCBzeW1ib2xzIC0tIFByaW50IGR1bXAgb2YgY3VycmVudCBzeW1ib2wgZGVmaW5pdGlvbnMuKm1haW50ZW5hbmNlIHByaW50IHR5cGUgLS0gUHJpbnQgYSB0eXBlIGNoYWluIGZvciBhIGdpdmVuIHN5bWJvbC4qVHlwZSAuaGVscCBtYWludGVuYW5jZSBwcmludC4gZm9sbG93ZWQgYnkgbWFpbnRlbmFuY2UgcHJpbnQgc3ViY29tbWFuZCBuYW1lIGZvciBmdWxsIGRvY3VtZW50YXRpb25cXC5cW1xyXG5cXStDb21tYW5kIG5hbWUgYWJicmV2aWF0aW9ucyBhcmUgYWxsb3dlZCBpZiB1bmFtYmlndW91c1xcLi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgImhlbHAgbWFpbnQgcHJpbnQiIH0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgZmFpbCAiaGVscCBtYWludCBwcmludCIgfQorICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgaGVscCBtYWludCBwcmludCIgfQorICAgICAgICB9CisKK3NlbmRfZ2RiICJoZWxwIG1haW50XG4iCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiQ29tbWFuZHMgZm9yIHVzZSBieSBHREIgbWFpbnRhaW5lcnNcXC5cW1xyXG5cXStJbmNsdWRlcyBjb21tYW5kcyB0byBkdW1wIHNwZWNpZmljIGludGVybmFsIEdEQiBzdHJ1Y3R1cmVzIGluXFtcclxuXF0rYSBodW1hbiByZWFkYWJsZSBmb3JtLCB0byBjYXVzZSBHREIgdG8gZGVsaWJlcmF0ZWx5IGR1bXAgY29yZSxcW1xyXG5cXSt0byB0ZXN0IGludGVybmFsIGZ1bmN0aW9ucyBzdWNoIGFzIHRoZSBDXFwrXFwrIGRlbWFuZ2xlciwgZXRjXFwuLipUeXBlLipoZWxwIG1haW50ZW5hbmNlLipmb2xsb3dlZCBieSBtYWludGVuYW5jZSBzdWJjb21tYW5kIG5hbWUgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvblxcLlxbXHJcblxdK0NvbW1hbmQgbmFtZSBhYmJyZXZpYXRpb25zIGFyZSBhbGxvd2VkIGlmIHVuYW1iaWd1b3VzXFwuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAiaGVscCBtYWludCIgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJoZWxwIG1haW50IiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBoZWxwIG1haW50IiB9CisgICAgICAgIH0KKworI3NldCBvbGR0aW1lb3V0ICR0aW1lb3V0Cisjc2V0IHRpbWVvdXQgW2V4cHIgJHRpbWVvdXQgKyAzMDBdCisKK3NlbmRfZ2RiICJtYWludCBkdW1wLW1lXG4iCitnZGJfZXhwZWN0ICB7CisgICAgICAgIC1yZSAiU2hvdWxkIEdEQiBkdW1wIGNvcmUuKlxcKHkgb3IgblxcKSAkIlwKKyAgICAgICAgICB7IHNlbmRfZ2RiICJuXG4iCisgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgcGFzcyAibWFpbnQgZHVtcC1tZSIgfQorICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgeyBmYWlsICIodGltZW91dCkgIG1haW50IGR1bXAtbWUiIH0KKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBmYWlsICJtYWludCBkdW1wLW1lIiB9CisgICAgICAgIHRpbWVvdXQgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBtYWludCBkdW1wLW1lIiB9CisgICAgICAgIH0KKworI3NldCB0aW1lb3V0ICRvbGR0aW1lb3V0CisKKworZ2RiX2V4aXQKK3JldHVybiAwCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL21pcHMtZWNvZmYudSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbWlwcy1lY29mZi51Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZjY1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL21pcHMtZWNvZmYudQpAQCAtMCwwICsxLDY3MSBAQAorYmVnaW4gNzc3IG1pcHMtZWNvZmYKK00gNiAgIjJHPF8lMCAgIyAgICAgIDggIFggIDwhIlAoKiAgIEAgICAgJCAgICApPSAgJCAhUCAhICAgIDAKK00gICAgJCAgMCAvL19fX1ggICAgICAgIC1UICAgICAgICAgICAkICIqQCJZVDk3QVQgICAgICQgIVAgISAKK00gPCAgICFFMCAgICFQICAgICAgICAgICAgICAgICAgICAiIE46NllJPSAgICAgISAmUSAgMCFMMCAgICAKK00oICAgJlEgICAgICAgICAgICAgICAgIiAgICAgK0YxQT0mJCAgICAwICAgICQgICAgICAgIkkgICAiICAKK00gICAgICAgICAgICAgICAgICAgIDAiWUw6NzBYICAgICQgICpEISAgIkkgICAgIDAgICBKRCAgICAgICAKK00gICAgICAgICAgQCAgICBOOyZFVC0gICAgISAgIkogMCAgSkAgICAgJCAgICpKICAgICAgICAgICAgICAKK00gICAwICAgICtHLUQ4NzFBICAgMCAgSlAkICAqTCAgICAmICAgIkpQICAgICAgICAsICAgICAgICAgICIKK00gIllTOEctUyAgICAkICArJCEgICJRICAgICUgICAgICAgICAgICAgICMgICAgICAgICAgISAgTjhHLVMKK00gICAgICEgICMlIDAgIFEwICAiOlwgICAgICAgICAgICAgICAgICAgICAgICAgIiA8Ry1SOFAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAoXkQKK00gICBcJyEgISlaNCAhIj48QkggRElAICQgIDAwQCpeJUA5MCBQQyBBKVtXX1oqXiZAIyJPSCAgNCAgI1AKK00oMFAwIUw+T0EoJjAjISAhOSAgICAgICwkICVIICAgQCg4XiRAOSIvQTgmNENYOiAsIFAwIC5MICAgICAKK00jISAhSSAhICgiJCAgICAtIF4gICIgICAgICBHTzAgKCBeICAiICBAXiIkI1ggICggICAgICAgICAgICAKK00gICAgICAgICAgL0AgIEAgICEgQSBeICAiICAgICAgI1ggICggICAgICAvQCAgQCAgISBBIF4gICIgICAKK00gICAjWCAgKCAgICAgIC9AICBAICAhIEEgXiAgIiAgICAgICNYICAoICAgICAgL0AgIEAgICEgQSBeICAKK00iICAgICAgI1ggICggICAgICAvQCAgQCAgISBBIF4gICIgICAgICAjWCAgKCAgICAgIC9AICBAICAhIEEKK00gXiAgIiAgICAgICNYICAoICAgICAgL0AgIEAgICEgQSBeICAiICAgICAgI1ggICggICAgICAvQCAgQCAKK00gISBBIF4gICIgICAgICAjWCAgKCAgICAgIC9AICBAICAhIEEgXiAgIiAgICAgICNYICAoICAgICAgL0AKK00gIEAgICEgQSBeICAiICAgICAgI1ggICggICAgICAvQCAgQCAgISBBIF4gICIgICAgICAjWCAgKCAgICAKK00gIC9AICBAICAhIEEgXiAgIiAgICAgICNYICAoICAgICAkMiAgICAjWCAgKCAgICAgIC9AICBAICAgICAKK00gXiAgIiAgICAgISRAICAgMSggKCAgL0AgIEAgICAgICBeICAiICAgICAgI1ggICggICAgICouIEApIEQKK00jQCAhSFhaIEQyMC8gICpDQ1giMikhQCAgWj44QCkwRCYwICRJWUYgRUIwKCAgNkdCKCI4KSBEICFKXikKK01AKVBEIkAgJ0tYSiBIIjArICBCT0JYIkQpIFAgIjpeLEAqQEQjMCAqS1hWIEsiMC4gIE5PQ0giUFFYMiAKK00oICAgICAjR0EoIlRRWD4gJCw+JkAhM0dBWCJYWVg6IE8pLi9AKSAgICAgIEhYXiBQKS44QCkkICAgICAKK01IWUIgUEkuOUApKCAgICAgSFlGIFEoPihAKTAgICAgIElYQiBSKD4pQCk4ICAgICBJWEYgUyk+KkApQCAKK00gICAgSVhKIFQoXitAKVAgICAgIEtYTiBWKF4sQCogICAgICBLWFIgWCheLUAqMCAgICAgS1hWIFooXi4KK01AKkAgICAgIEtYWiBcKF4vQCpQICAgICBLWF4gXiheOEArICAgICAgS1lCISAsPihAKzAgICAgIFlYQiEKK00iLD4rQCtDJ0JIIlwvICQwIC4wSzhfI0QqRi9UKVlGIEQqXjlAMSBHQigiMUtYQiElIj4pQCkqT0I4JDgKK00pWEogRSpeKkAxUEdCWCI2S1hOISgiPixAKUJPQygkRClYViBHKl4tQDJAR0NIIkBLWFohKyI+L0AqMk8KK01DWCRQKVlCIEoqXjhAMzBHRjgiTEtZRiEuIj4oQCsiT0IoJFwpWEYgTSpeKUA0IEdCSCJYS1hKITEiMCsKK00gICpPQlglPCkgUCAgSl4sQDYgRCMwICFLWFYhOiIwLiAgJk9DSCVEQ1heITYjUCEkICJMK1YsUEFZQiEKK00yICAgICAiR0YoJTAgXiAgIiAgICQiJCNYICAoICAgICAgICAgICAjWCAgKCAgICAgICAgICAgICAgICAKK00pW1ddNCAiICYiJEQjT19fS1tcICchMUAgISZPS0AgRC8gMDAgIFAwIDswREEgKCQkJCAgITAhICYiJjAKK00zUCAgICAgICAhN0AgIEAgICAgIERZQiAwICAgICAgMyAgICMgICAgICEgICAiLCAgISBBKVguIDEjUCUKK00kICJDQCghICkqNCIkIj5EIEMgLCQgJ1RLWiwiTCheQyBLIEdJICheIyEgIV0gIUAqIiRHSSAoUCMhICIKK00oICAgKiIkJDAgIDEgJCBAKDI+RSAiUEQhQCgiIyEgIioqXkQgIkBEIDAoIiUkJCAiKF5EICJAXCEhICAKK00pKDAgICI+RSAiUCwkIChQKSA4IiBKXkAgIjIvSSAgSCMhICJdICAgICAiL0hAIEQgICAgICheXyAhUEcKK01PMCpQIF4gICIgICAgICAgICAgIClbV19YKl5fICFQLCQgLC5LWjAgKCBQMCBSQCAgICAgQ1owICggUDAKK00hNFAgICAgIENbXCAnIj5dICIgI1ggICggICAgICAgICAgICAgICAgICAgICAiPl1fXiIvQEggUEtbJCAKK00mKl5QICEwIEAoQEFLW1wgJyExICAgLCAwKCBBJCAgICUwICAkIiYvQ0ggUCAgICAgKFcvICAgICAgICAKK00kPiAgI1AgICQiJi4hMCAgICAgICAgKEAoIiQsJCAnNylBICAhISEgICAsIDAhQEEkICAgIUAhQCQiJi4KK00hMCAgICAgICAhMkBfXzwiKCIgQSAgIDAoOF5fICFSL0wgIDRDWyQgJiAvQCAgQEdPMCBARCooICApIiMKK00gICBESTAgISQkLCAhIjAmICNUMCAgICwpIDggLzIwJiAjVCA4ISBBJSQ4ICBSMiQgICQjWCAgKCAqIDAKK00oOSJCICAiMEBQICApKjQgIDEhI19fQCA4ISBBJSYgICIgICAkIiYwS09fXyAgICAgITMuICAwICAhIEEKK00gXiAgIiAiQCQiJCAgISBBIF4gICIgICAgICAgQCEgQUAqQCAgIzItICAsMSAgIEQgOjFQKEgiSSAgJCAKK01LR0BAJDIgICdQICAgICIgSkAgIiAgICAgISUgICFKKEsgICBAKkwgIFlCTCAgLDE4ICA0SihQICAiJkQKK01fX1YhWiAgISg+XCAhISQgICEsQEEgICRAPkdfX0AgICAgIDEoICAuICAgICAoJ0pfX1wgICAgICQ0ICAKK00iOEdMX19WIVpQICBGPlAgICE1QF9fJkxDICAgIF4gICIgICAgICAjWCAgKE4oUCAgWiIqICAqQEIwICEKK00gXiAgIioiKCAgICAgICAgICAgICAiMCIgXlQgICAgLCQuICAgUCAgICAgKCQgNTAgICAgICAvQCAgQCAKK00gICAgKSAoI1pQICAgIFAwWCAgIyAgICAgIEAwITUgICAgICAgXiAgIiAgICAgIDBQICA6ICggWCgxIkQKK00gIUAgQTBASiUiICAiIkMhICEgIElBIEAgKCgoKkEgQCAgMEhQMCAwJCAgIDZSQyEgISBIUDAgMCUiICAKK00hMCAgICAgUEhAICMsKCwgIFEhIyAgTCAgICAgJCwgICFQICAgICAgSUFAQUAqKCAgIjJFICAkREEgICEKK00lKi9fXyoiIl9fXCNYICAoIC4gMCgxISAgIUBEIDAgISQkJCAjUjAhICAoMDAwICcgICAgICgiQiAgIEQKK01JMCAhKSgwICAyMyZfX1wwICAgLkgoK19fWDJCICAgREkwICIpKDAgIEIzJl9fWDAgICAoSSgrX19IIkIKK00gICIkSFAgIUgoKCAgIjJFICAsREEgICMpLDtfXzoyI19fWEhQMCBAJSIgICVCQyEgISIsSEAgIEMqLCAKK00hKFJIICBCLEowICxDKkggJChSSyAhMixLICA4QypUICcqUiIgICJMQFAgJEsoQCAiKlIpICBSTEJAIDAKK01LKEwgJSpSLCAhQERJMCBAKSgwICgiMyZfXiAwIC9fSksoV19fIkMhICEgNCggIC4qLCQgIShSQiAgIiwKK01IUCAkQypAICIoUkkgIFJMQEAgIEsoLCAhKlIoICBAREkwIDApKDAgJCIzJl9fIDAgL19SSyhHX18iQyEKK00gIDA0KC9eVSAgICAgKFJCICAgREkwICQpKDAgISIzJl9fUDAgL19YSygrX18iQyEgISAgSUJAQCUiICAKK00hMCImKCIgUEhAICMsKCwgIFEhIyAgVCAgICAgJCwjX0swICAgICBEST9fXykoM19fUCJGJiIuIEhAICAKK00pKjdfX1IyJF9fXDRIX19cSCgoICAwL0AgIEAgWCEgQSQkICAmIjAhICAsMDAwIC8pICQgIEEhISAgPCAKK00gICAgQCorX19SMkVfX1xEQS9fXyksO19fUSAgICBaQEBAICBBKitfX0IyRV9fWERBL19eKSw7X19BICAKK00gIEJEQEAgIEAqK19fWDJDX19WQEBPX18pKjdfXzIyJF9fVERRT19dSSgsICAiQyEgIiA0KCAgNiosJCAKK00kKFJCX19SLEhfX1hDKkNfXShSSV9fIixKT19MQypPX1ooUkxfXjIsSz9fQEsoK19fKlIjX19CTEIvX1QKK01LKEdfXCpSKl9eUkxCX19ISyhTX1kiMkVfXiBEQS9fQCksO19YISAgX15KTEMwICAqLCQgJCEwQCAgWEgKK01QMCAkQyorX18oUkNfX0IsSi9fVEMqR19cKlIiX19STEBfX1hLKENfXSIyRV9fIERBL19QKSw7X1whICAKK01fXypMQjAgICosJCAhITBAX1ssICAgICBDKitfXyIyRV9fUERBL19cKSw7X18hICBfX0JMQEAgICAgICAKK00gICAgICAgICAgICApICgjW0AgICAgUDBYICAjICAgICAgQDAhNSAgICAgICBeICAiICAgJCIkMEAgIC8KK00pICggIDheI0AmICAgICAgKiYkICghIEAgIEhEIEAgISAgLVBAI1AhJCAgICtAQEEpJiwgIDpQRCBCIk8KK01AWCFAIF4gICIgICAkIiREIEAgISBeICAiICAgICAiL0BYIUApW1dfWCpeXyAhUk9MMCA4S1sgICUhQUAKK00gIFxEOE9fXy8gXDAgIjdPIEIgICBHIiAvISQwICI4USBCICFTWCBBQ0FAICAgICAgICAjIC9AKSAgICAKK00gIjgwX19QIiQwQEskIiNfXjAgICAgIi9PUCA8Q1sgICUoXlEgIUAjWCAgKClbVCAoKF4uQCcgR08/X0AKK00vIFwwICpeUCAhQEVbUDBVLyEgMCAgJy8iIk5PT1AgPCUiICAkMjgwISMwXCYhICBDUUArICAgICAgIDMKK00gICAlICAgICAgUDAgVzgiICIgQSQgICAgUCAgICAgLCQgLSYgQCBAKDheOUAnIEYkICAwIEFEKCpRMEAKK01fXyQgICAgIENbXCAnKF5QICFAI1ggICgpW1QgKCI+XV9dQk9MICA4ICgiICg6Xl8gIVA2ICAgIykgL18KK01fUSAgICI0RCBPX19EQCggIyAgICAgIFAzQCIjJDwgICUjITggIEBQM1AgJikgJCAgQTdBICA4ICAhQEEKK00jISAjPUAoICgiJDAgICAiICQgOCgwICAmIiYyISAgLSMhICJdKl5DICIyL0hQIEQhJCQgIEAgICAgIEQKK00gX19fREAoICMgICAgICBQNiAgKCRQICAhQCAgICAiLiEgICgjISAmJkpeQyAiMi9IUCBES0AgICIoWDkKK00gIEJCICAgLEtAICAgICFAJCImTiYwICRDW1wgJyheUCAhQCNYICAoKVtUICoiPl1fXiJPTCAgOCAoIiAKK00oMTggICEuT09QIDxDWFogPCNQLyQgIEVbUDBVLyEgMCAgJy8iIkw0KCAgKilBICQtISggICAsICAgICAKK00jISAjPUAoICgiJi9GKCFQKUEgICQgKDgiIkw0KC9fWCAgICAgISAgICNAICAhIEFEQCwgIyAgICAgIFAKK004QCAiJSQgICMjIUggIDIuITAgIERAMCAjMjAmICAkLCQgOVAgIDRIKFhYOSAgQk4gICAgICAgMCgxICAKK00gIkZOJjAgJCwmQCAhITQgICIgUDswIEAkJCAgJ0MhTSAiIi4gQCAoICAgICAhISAgIUhQOzAgQENARCAKK00hICAgICAgIDIwQEskIiAgJTMhTSAiICwkIDE0IEAgQCg5KCMgIFAgICAgICwmSCAhITUgICBYUDswIEAKK00sJkwgIEElQCAgTFA7MCBAQ0AoICIgICAgICAwMCAgJywmVCAoKFgsICAwICAgICAgJFAoKlEwQF9eWCAKK00gICAgLCZUICghJkAgIDAgICFAQSQgICAgQjAjX19cICAhQEEgJiAwKDheXyAhUi9MICA4IF4gICIiPl0KK00gIiBHTz9eUEtbICAnKl5fICJST0xQIEggKiIgKDpeUiAiMk9MMCBAS1owIDQpKCMgIFBEJDAhIikhKCAKK00hQjAzICAoUDtAITIlQlggKTMhTCAhOjIjUCAtLyFEMCAgIC9QKCAjLixAQUNTRCJIKFgiICAwICAgICAKK00gJUQoKlEgQCAkXCAgICAgQ1pAIDQiMCEgIEpAMiAgIENARCAhICAgICAgRSpAICFLQEggISkuSyAlLCAKK00gICAgJDYkICEgICAgICIvSEAhMCQgICA4KF5fICJQLCQgMTQgQCBAKDIwIV9fXDQwMCAkQ1osIDQhICAKK00gICxEIF9fX0NaLCA0ICAgICAgMCAgITQgJiAwKDMhTCAhODYzICA0LCdAICRIXk0gJSBHSTAhLEhaVCAKK00zKSgkICBWTiAgICAjISAmPiIwJiAgJEQgMCAhJSQkICEgICAgICIvSEAhMCQgICAxOF5fICJSMiNAICwKK00pICtfX1M3LyAiIDAgICBfSEBcICMjIVggISg2PiAgMCAgICAgKFgiICBAICAgICAkJCAgIyAgICAgIi4KK00mMCAkICAgICAhMTkgIFAgICAgIENAQCAgICAgICAgNSAgICggICAgICMhSSAkMDUoICAmICAgOCgwUDAKK00hKUgiICIgQSQgICAgQCEgJiIkICAhQEEkJiAgIFAgICAgIDAgICBEKSArX19ZKCMgIFAgICAgICwmSCAKK00xITUgX1o8UDtAITIjISAkNSAoICgiJi4gQCAgICAgICAiMSJfX1wkMDAgJktAKCAgKS5EICUsLCQgLygKK00gQCBIKDEgICAgSjIjUCAsQ1pMIDQoWCwgIDAgICAgIEg4TCAgKFgtICAwICAgICApOlggIDpYLiAgMjIKK00jUCAsICAgICAjJ1ggIiAzICAgJENaLCA0ISAgICAsRCBfX19DWiwgNCAgICAgICA4ISBBQ1tcICsoXlAKK00gIVIvTDAgQENbKCApKF5TICJAI1ggICgpW1QgNCI+XV9eIk9PUCA0ICggWCg4U0MgIEIwW1AgLEMuWCAKK00hICFAKiIkUV4gISRLLjQgISEsICAgQCFRMyBDRC9EICMzUCkkICBFKjAqQCAhRSBAICQpKCIkMCAgICoKK01LLiAgICkjSiAgVFwjISAgKThQIkggICo2KCAhOyIgQUMoVCAgICAgICAgIUhRIENLLiggIChTQiAgICAKK00gICAgISQkICEgISAmIiQwICAgIiAgIDgoMCEgJiImLENAICBDLlwgISAgICAgICFTXCBDIFAsKCpBIEAKK00gIEggICAgIEtaNCAnKl5GICFAIFgiIEEjISAlLUpeRyAiIi9JMCA8Q1o4ICYoXkcgIiAgICAgICYsICAKK00jUCAgJCImMFkgIC1LWjwgKCBQMCFHQk9JQCA4Q1o4ICYoXkcgIiAwUEAgJyAgIDAoOSNZICBQRCBPX18KK00tUkAgKCEgICAgKkBaICAsICAgMCg4Xl8gITBHTzAgQCBeICAiICAgICAgR08/X0hLW1wgJSkiIiAgUEQKK00gMCAiLCRYICRBJyEgIFAgICAgICwkXCBAQTdAICA4RCA/X08jISAmQFIwJCAgRDAgICBSKSArX19SMCEKK01fXlwgMDwgRC1RRCAgSiI5ICBSLEBQICggICAgICExQCAgPCAgICAgIyEgJFc6XkQgIUIvSSAgOCAgICAKK00gKFIjICBAICAgICBDKEAgISAgICAgIDQ6ICBAICAgMCg5IikgIFAgICAgICwySCAxITUgICFMICAhIEEKK01EKEwgIzNQLSQgIEVLMCpAICBNQEAgJi0qIiYsS0AgICAgICAgICcjPiIuTENQICBDKCggICAgICAgICQKK00wMCAkICQgOCgxICAgICggICFAQSAkIDgoOFJYICAiLEYwICQgICAgICAsOTAiLCEgUEBKJCIgICEgICAKK00kIiQsJCA0ViAgICAgICAgJCImL09QIDQpW1QgJiAvQCAgQCAgICAgKVtXX1gqXl8gITAgQCJAQUQqWCAKK00jKSJDICBUUVNQICQkPiAgIyAhQCwiJFwmMSAgKVNFQCIgICZQLCAjJjEgQSAgLShAI1AhJCAgICowQEEKK01LKiggIiIxKCAgQDAgICBUSyJAIkgiQyEgICgwKCAgMyAgICAgITMgICA4ICAgICAvICwwICIxQyQgIkwKK01IUCAoJCAgICEwIUAkIiRcIFEgICkmLSAgKlJDICBAIDghIEFEKkwgIzNQISQgICAiViIgICJQKCgyMSoKK00oICAwICAgP0siSCJIKl5FICIgRCEiICgjISAlNSpeRiAhUi9JMCBAQ1o4ICchISAgIFJMSEAgKEQqVCAKK00jKSJZICBWLEtQICgvICQwICM2TiAgQCAmNCIgSCpYICMgIEgiIiRFXiIgICQgICAjKlBYIEogXCJRICAKK01EKlAgIzI1SzggQCAhREMgIDJMMCgzUCEkICAgIyZCICAiVCgoOlJCICBARDJAIChLIkgiSChSTiAgQCAKK01QIiBBSypYICEgUDAhSEJPSTAgQENaNCAoISEgICBGL09QIDREKiggIyAgICAgIFAzUCAkJT4gICEoXl8KK00gITBUNjAhIEgrRCAjKF5fICEwR08wIEAgXiAgIiAgICAgIjBDQCAtLyAsMCAgIC4+KCAgO1FAQUMmLCIKK01IKFI4ICAwICAgICAgJ0AwKFAxISAgLCAgICAgIF4gICIqUiMgIDIsRjAgICAgICAgICE5IiJIMCggICIKK00gICAgICpSIiAgICNYICAoICAgICAgICAgICAgICAgICkgKCNaMCAgICBQI1ggICggICAgICNQISQgIkwKK00oQFA4IF4gICIiMCJfX1xHTz9eSEtbOCArKl5SICFST09QIFRLWzwgLCpeVSAiQi9DSCVQS1swICkqXlMKK00gIiJPTDAgOCAoIjAoOl5QICEwMVAgICQgICJQKDheJUA4MDAgICArKVk2ITwiPiJANzBHRTglUEtYKiEKK00/IzEvICAmT0NYJVAtS0AgIDAqQC4iJk9GKCVUICQgSCg6XidAN0IvQVglWCkhP19fUjA0X19YIFgoQEEKK00gICBQKDhYQyAgICAgICAgICYgMCgzITkgICQ3KCAgPSBCIiAoMCFAQCImLiBAICApRDAgIVAgJCgoKFAKK00yICAhJTAgICNAICQoKCAiKCNAQUtYPiE+ITJQICAqTihAICAgQiBIKDhYQyAgICAgICAgICYiICg4WCIKK00gICAgICAgICwkRCAgMSRAX184ICAgICAgQjAwKDAoIiIiTDQoICAjICUkKCpRIEAgJkggICAgICAmIDAKK00oMChAQCIkIDUoQEQgQSQoKlEwQF9dTCAgICAgQ1hKIT8gICAgICAyIkAgIyAgICAgISAgICAyT0E4JiQKK00kQzQgITIzJiAgJk9BOCYkJCAgIDpQICAkIiREUUAgISssJCAgQTBAX1xQICAgICApRCwgIVAgIyYoKk8KK01IUCBYICoiKCgwICAoIiQsJCA6QEtYNiFBKF4rQDdSL0hQIFgpNlAgISEhLCAgUCAwKCBBKSY4J19QICYKK00sTChQMSAgIyQoICAkICAmLFQgRCMwICQgOjA4KFAhQEwiJCAwWCBBJCAgICJAIzYsIiYvQTgmJENYWiEKK00/ICAgICAgIVE3QEMgIF8gQFAhWCwiLERRQEAgICA4UlBAICYsVCAiIUxAQSBTICgqUSBAICAwXCA3X18KK00kICAgMDAgICQiJFwgN19fLSInQCAwIyEiIkw0KCAgLSAsIjgoM1AkP19cVEEuICAjISAmSCpeRiAkQi8KK01JQCEoJSU8ICEjUCFAICAwICAgUyAgIDAoM1AhQCAgVCgyICAgLCRQKDBQMCFKICBQIiBBJSU8ICEwICAKK00gICAsJCA6TCBAIEAoMSAgICJAICAhIEFDWEIhPyAoMzIiJCEtRSBDKTRPX18qVDAgICJOIlAgIENYUiEKK00/ICggKiIkRUMwICQkQFQgITM6QiAgJi1DQCAgICAgICAjNy8gICZNQ1AgIENBQCAgICAgICAiT0YoJVwKK01DWUYhPyEgIF9XPk8oQCAgICQgWCgwI1AiIkwwKCAgJi0uRCAgOFNIICAgICAgICBLWEIhQCpTQyAgIFQKK01aMCAhJCskICEqWEkgICJPQVglWCQgICAhKl4lQDgwIFgiQEFLWDYhQSpeJ0A3QEYoQCAkQ1tcIC0oXlAKK00gITIvTDAgOENbKCAnKF5TICIiL00gIERDWzQgKiheViAiUi9NUCBQIF4gICIiPl0gJUAwQCAgLSAoIDAKK00oMjIiX19ST0BIJVhDJFggICIwIV9fWCFQN0BESyRcICAoUTkgICIvRiglXCAgICAgITw5ICAoICAgICAKK01LWCohQSAvQCAgQCAgICAgKVtXX1IqXlAgIUAgQCggQSRAICAuKl5fICFSLiBPX1wgICAgICMhLiAgJDEKK01QICAoICUgOChQKCAoIiQsJCA4OktaNCAvKF5FICNSLiBPX1wgICAgICAhMCYiLCAgUUIjS1osICkgIkAKK00oIiQsJCA1NEtaNCAvKF5DICIyL0kwIFwkJCAgITAhICgiJDA0ICAjICAgICAhMkAgIDBESVAgIyQgICAKK00oMCIgJCIkRElQICMgIDxYQEAjQyIiTDAoICAiICAgICAgI0AmIiZPSSAgVCBAIEgoMCAjLCggLCQgKFAKK01LWjwgKCheRCAjMi9JUCBAICUgKCpRIEAgISAgICAgICAgPVhAICEvJiIkIDwgQEslIiAgIlAgICAgICAKK008LEBDICFFIEBYXjhAOCAgIiRCICAkRTAoMSAgICAyTTYgICAjISAlNSAiQCgiJCAwIiBBICggMCg4Xl8KK00gIVIvTCAgOCBeICAiIj5dICNAICAgICAgICAgICIwIiBfTCAgICAsJC4gICBQICAgICAoJCA1MCAgICAKK00gIC9AICBAICAgICApICgjWyAgICAgUDBYICAjICAgICAgQDAhNSAgICAgICBeICAiICAgICAiL0BIJjgKK00gXiAgIiAgICAgIk9BKCY4IF4gICIgIiAkIiQgICAgICAgICAgIj5dX1siT09QIDwjISAmQCpeRCAlIi8KK01JICEwS1ooICkiMCU1IEAsJCA6XClaOCAqIDEhICA8RCBAICFDWjAgKSBQMCFILCAgICAgJCAgICBAICAKK00kIiREIEAgIUNbXCAnIj5dICUgI1ggICggICAgICAgICAgICAgICAgICAgICAjUCMkICIsOFBKJCkgKCMKK01eMCIjKCIkICAgICwlLiAgISNQISQgICA4ISBBIF4gICIqUEQiSDAoJCA1MCAgICAgI1AiJCAiLDBASiAKK00gICAgICAiIiIiTDAoICAiICAgICAgISAoIiREIEAvWSAgICAjITNAX18wXCAxICBLIjAqQSAvQCAgQCAKK00gISBBICAgICAgICAgICBEIEAwPiAgICAjISNAICAsICAgICAiISAlNCAgICAgICNYICAoICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgI1ggICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgKCIgQCgiIEAoIiBAKiJASCoiQEAoIiBAKCIgQCgiIEAoIiBAKCIgQCgiISgkISAwJCEgMCQhIDAKK00kISAwJCEgMEEoMiRBKDIkQSgyJEEhIDAkISAwJCEiIUA4JiFAOCQhIDAkISAwJCEgMCQhIDAkISAwJCEKK00gMCQhIDEgMCQhIDAkKCoiQEgqIkBAKCIgQCgiIEAoIiBAKCIgQCgiIEAoIiBAKCIkISAwJCIgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCgjISA0JiFQQCkKK00iQEwsIzBYLyQhJDIkUTA1JUE8OCYxSDsnIVQ+J1IgQShCLEQpMjhHKiJESipSUE0rQlxQLDMoUy0jNFYKK00tU0BZLkNMXC8zWF8wJiVCOFYxRTlGPUg6NklLOyZVTjtXIVE8Ry1UPTc5Vz4nRVo2VVE9N0VdQDA0KSMKK00xJDUmMVRBKTJETSwzNFkvNCUlMjRVMTU1RT04NjVJWz8nVV4/UCAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIzIlKSMzJCUzNFAgICAgIE87JkVCK1YtSDxGLUwKK004Ny1TK1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAhICA4IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICQgICAgICAgICAgICAgICAgICAgICIgMCAgICAgICAhICA4IUAwICYgOCFAKCAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKj0gJCAiRzAgICAKK00gICAgICAgIDAmRCAgICAgICAgICAgICAgICAgICQrKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgMCAgICYlUzhWRUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgJCAgKj0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgPCBEIiJAICAhRCAgICArICAgIFA4ICAgICAgICAgICAgICAgLSAgICxSICAgICRZICAgXUwgICAKK00gICAgICAgICAgICIkUCAgMyVQICAgQSwgICE0SiAgICFCMCAgJVNUICAgICdAICA4UUAgICAhPCAgIUsKK01CICAgICg8ICAmU1gsLyBAWCMgMDAtISBUJCAwKCoiISAhOSBcIyAwJCElQFAlIEEoISAwKDA0JSEwNCUKK00hMDQlITA0JSEwOCcsISQxKDEkMSgxJDEoMSQxKEEsUiRBKEIkQShCJEEoQiRBKEIlIiQxJDIkMSQyJDEKK00kMiQxJDIkMSgxJDEkMihCJFAkISwtIiAgIEJQNigsICIxJDAsLyA0JEEwRjUhIEIpMCYgICBaIF9fKiEKK00gIFwyJFA0UFgjJDclISQ4ICE8MiQxQCEkMSkwOCEgMCQhIDAkISAwJCEgMCQhIDAkISBQJCEgMCQhIDAKK00kISAwJCEgMCQhIDAkISBQJCIgMCQhICAkISQxJDAgMCQxJDEwLyBBLEEgMiQ4KCAiQSAwJDckMCghIEAKK00kLiEgXCgkICJBKDIsISBAJCEjMDwhIEAkISMwPCEgQFwjIDBYKCggIyEgMCQhIDAkISAwKCEgMCQhIDAKK00kKSIgICBEMCQtIVIkISAwJCIgMCQtITAkISMwPEEgMCghIDBUKCAgJCwhIFQkIDAkNyQwJCEgQCQiIDAKK01YJCNQQDAgKiRBKFAkIiAwJC0hUCQiIDAkLSFQJCIjUCwhI0BAQCAsJCEgMCQhIDAkISBAJCEgMCQhIDAKK01EKCAgIjEgMFQnKDAkISAwKCEgMFQlIDAkLSFSJCEgQCQhIzAgISAxJDIkNiUhKEIhIjw3JSMjMCwtIFIKK01UIyYkICBIMywxMDMgVCMwMDEwQyRSIDUkIiQyJFEhIFghIEBcISwiLC0hViRSOFQpIiNQKD8hKCEhQCgKK00gIUAhIiApMiYgIEggMSg4IDMoMCguIEBcITAyJCEjUCQvIUgiIDgxJSMkOCIiQCcgRCBAWDIjUCQuIEgKK00hQUAoISFAICQhI1AkLyBUIDEwMiQxJEMoUTQ4JiFAJikgKSBUIycwMiEjUCxCQCgtUiAyXCEjUCQxI1AKK00uICRAJC8gOCAhJDMuICAxJSEgMSAhKUE8LyAlPCkxUFQjMFBYMSBAWCMgMTBBIDUmJCNQJCE8NighIDAKK00kQkBBJFElIFwhKDBcISdQPDEnUChBIFBYIiBXKFElI1wiODEoQiwxJDQhIlAkIDBEJygzJEEgQFgkIEIKK00kQSBAKC4gRSYgKSBUJyRTJTMkIkAgIClAL19XQSAgKyUxJDUoLiBDJDIwMCVBPDQkLyBSJSAgMCQxJDEKK00gISAxJDElIjAiJCEwLCEwXCEwQiQyMEEoLyBAJDIjUCQyJDMkIiAwJDEkMSAhIDEkMSQgICAgICAgICAKK00gQCAgICAgICAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAgIUAgJzAgICAgICAuICAgICY8ICAgICAKK00gICAgOiAgICAgMCAgICA6ICAgICAgICAgICNfX19fXyAgICAgICAgICAgICAgICAgIVQgJ1AgICAoKCAKK00gICIkICAgICZAICAgJyAgICAgJiAgICAnICAgICAgICAgICBfX19fX1AgICAgICAgICAgICAgICAgID0KK00gIVwgICAiLyAgICBEUCAgICFMICAgIVwgICAgIiAgICAhXCAgICAgICAgICAvX19fX1wgICAgICAgICAKK00gICAgICAgICcwID8gICAgR0AgICAqICAgICA+ICAgICAgICAgIiQgICAgICAgICAgICAgICAjX19fX18KK00gICAgICAgICAgICAgICAgICFUICdQICAgJ0QgICAhWSAgICAgICAgICFAICAgIEUgICAgIUAgICAgICAKK00gICAgX19fX19QICAgICAgICAgICAgICAgICA9ICFcICAgIVogICAgPkAgICAgJCAgICBQICAgICowICAKK00gIFAgICAgICAgICAgL19fX19cICAgICAgICAgICAgICAgICAnMCA/ICAgID5QICAgJ0wgICAgIiAgICAKK00yICAgICJUICAgIDIgICAgICAgICAgI19fX19fICAgICAgICAgICAgICAgICAhVCAnUCAgICdUICAgIV0KK00gICAgIFAgICAmICAgICBRICAgICYgICAgICAgICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPSAhXCAKK00gICFeICAgID9AICAgIDAgICAhWCAgICAtMCAgICFYICAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAKK00gICAgJzAgPyAgICA/UCAgICdcICAgICUgICAgRCAgICAjRCAgICBEICAgICAgICAgICNfX19fXyAgICAKK00gICAgICAgICAgICAgIVQgJ1AgICAoJCAgICIhICAgICFAICAgKkAgICAgXSAgICAqQCAgICAgICAgICAKK01fX19fX1AgICAgICAgICAgICAgICAgID0gIVwgICAiIiAgICBAQCAgICA8ICAgIyAgICAgMDAgICAjICAKK00gICAgICAgICAvX19fX1wgICAgICAgICAgICAgICAgICcwID8gICAgQFAgICAoLCAgICAoICAgIFYgICAKK00gJDQgICAgViAgICAgICAgICAjX19fX18gICAgICAgICAgICAgICAgICFUICdQICAgKDQgICAiJSAgICAKK00iMCAgIC8gICAgISkgICAgLyAgICAgICAgICAgX19fX19QICAgICAgICAgICAgICAgICA9ICFcICAgIiYKK00gICAgQUAgICAgSCAgICQoICAgIDMwICAgJCggICAgICAgICAgL19fX19cICAgICAgICAgICAgICAgICAKK00nMCA/ICAgIEFQICAgKDwgICAgKyAgICEoICAgICUkICAgISggICAgICAgICAgI19fX19fICAgICAgICAKK00gICAgICAgICAhVCAnUCAgIChEICAgIikgICAgIyAgICAzUCAgICE1ICAgIDNQICAgICAgICAgIF9fX18KK01fUCAgICAgICAgICAgICAgICAgPSAhXCAgICIqICAgIEJAICAgIFQgICAlPCAgICBBMCAgICU8ICAgICAKK00gICAgIC9fX19fXCAgICAgICAgICAgICAgICAgJzAgPyAgICBMQCAgIC88ICAgIC4gICAgICAgICAgJCAKK00gICAgICAgICAgICAgICNfX19fXyAgICAgICAgICAgICAgICAgIVQgJ1AgICAgKCAgICAiICAgICAgICAKK00gICAgICAgIiAgICAgKCAgICAjX19fVUxfX19fX1AgICAgICAgICAgICAgIkwgID0gIVwgICAhPyAgICAKK01AUCAgICAgICAgICAgICAgIDAgICAgIiAgICAgX19fX18vX19fX1wgICAgICAgICAgICAgICIgICcwID8KK00gICAgJzAgICAiWCAgICAgICAgICAgICAgICQgICAgIEAgLCAgL19fX19TX19fX18gICAgICAgICAgICAKK00gICBAICFUICdQICAgIVggICAgRiAgICAgICAgIChQICAgICMgICAgKFAgICAgICAgICAgX19fX19QICAKK00gICAgICAgICAgICAgICA9ICFcICAgIFMgICAgLjAgICAgRCAgICAgICAgICAwICAgICAgICAgICAgICAKK00gL19fX19cICAgICAgICAgICAgICAgICAnMCA/ICAgIDhAICAgKUggICAgICAgICAgICAgICAkICAgICAKK00gICAgICAgICAgI19fX19fICAgICAgICAgICAgICAgICAhVCAnUCAgICBYICAgIDIgICAgICAgICAgICAKK00gICAhICAgICAgICAgICAgICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPSAhXCAgICAuICAgICRAICAKK00gICAgICAgICAgICAgMCAgICAgICAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAgICAgJzAgPyAgICAKK00qICAgIDJYICAgICAgICAgICAgICAgJCAgICAgICAgICAgICAgICNfX19fXyAgICAgICAgICAgICAgICAKK00gIVQgJ1AgICAgWCAgICAzICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICBfX19fX1AgICAgICAKK00gICAgICAgICAgID0gIVwgICAgNyAgICAnICAgICAgICAgISggICAgITAgICAhKiAgUCAgX19fX18vX18KK01fX1wgICAgICAgICAgICAgICIgICcwID8gICAgKDAgICAiNCAgICAkICAgICAgICAgICQgICAgIEAgJCAKK00gL19fX19TX19fX18gICAgICAgICAgICAgICBAICFUICdQICAgIkggICAgXSAgICAgICAgICdAICAgICMKK00gICAgJ0ggISAgI19fX19UX19fX19QICAgICAgICAgICAgICAqICA9ICFcICAgIS4gICAgOTAgICAgWCAKK00gICRYICAgICEwICAgJFogIDAgIF9fX19fL19fX19cICAgICAgICAgICAgICAiICAnMCA/ICAgIDxAICAKK00gKEQgICAgQiAgICJAICAgICA8ICAgIkBAIFwgIC9fX19dU19fX19fICAgICAgICAgICAgICAhMCAhVCAKK00nUCAgIClIICAgIlogICAgLTAgICErICAgICApICAgISsoICAgICNfX19fVF9fX19fUCAgICAgICAgICAKK00gICAgKCAgPSAhXCAgICMyICAgIFdAICAgJTggICA3KCAgICAiUCAgIDcqICAgICBfX19fXy9fX19fXCAKK00gICAgICAgICAgICAgIUAgJzAgPyAgICBaQCAgIC9AICAgIUsgICAmVSAgICAgVCAgICZVQCAgICAvX18KK01fXzNfX19fXyAgICAgICAgICAgICAgIEAgIVQgJ1AgICAwLCAgICQ7ICAgID4gICAiI0AgICAgLyAgICIKK00jQCAgICAgICAgICBfX19fX1AgICAgICAgICAgICAgICAgID0gIVwgICAkSSAgICEsICAgICk0ICAgICAKK00gICAgIDAgICAgICAgICAgICAgICAvX19fX1wgICAgICAgICAgICAgICAgICcwID8gICAgI0AgICAgXCAKK00gICAgICAgICAgICAgICQgICAgICAgICAgICAgICAjX19fX18gICAgICAgICAgICAgICAgICFUICdQICAKK00gISQgICAgPiAgICAgICAgICAgICAgICYgICAgICgjXyAgI19fX188X19fX19QICAgICAgICAgICAgICAKK002ICA9ICFcICAgIUQgICAgUTAgICAgICAgICw4ICAgICIgICAgLDwgICAgICAgICAgL19fX19cICAgICAKK00gICAgICAgICAgICAnMCA/ICAgIFMgICAgLUwgICAhLiAgICM2ICAgICBIICAgIzdAICQgIC9fX19eM18KK01fX19fICAgICAgICAgICAgICAgWCAhVCAnUCAgIC44ICAgJCEgICAgNSAgICAgICAgICAhICAgICAgICAKK00gICAgICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPSAhXCAgICAuICAgICRAICAgICAgICAgICAgICAKK00gMCAgICAgICAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAgICAgJzAgPyAgICAjQCAgICEoICAgICAKK00gICAgICAgICAgJCAgICAgICAgICAgICAgICNfX19fXyAgICAgICAgICAgICAgICAgIVQgJ1AgICAhXCAKK00gICBDICAgICAgICAgIFAgICAgIyAgICAgUCAgICAgICAgICBfX19fX1AgICAgICAgICAgICAgICAgID0KK00gIVwgICAgSiAgICAsICAgICAkICAgICAgICAgIDAgICAgIiAgICAgX19fX1MvX19fX1wgICAgICAgICAKK00gICAgICUgICcwID8gICAgJ0AgICAiQCAgICAgICAgICAgICAgICQgICAgICAgICAgICAgICAjX19fX18KK00gICAgICAgICAgICAgICAgICFUICdQICAgITwgICAgPyAgICAgICAgICMgICAgICQgICAgIlAgICAgICAKK00gICAgX19fX19QICAgICAgICAgICAgICAgICA9ICFcICAgIEUgICAgK1AgICAgQCAgICAgICAgICAwICAKK00gICAgICAgICAgICAgL19fX19cICAgICAgICAgICAgICAgICAnMCA/ICAgICNAICAgISggICAgICAgICAKK00gMCAgICAgTCggICsgICAgIyAgICAgIChLX19fICAgICUwISAgPCA4KCAgIiAgICAlMCAgICZAQCggICIKK00gICAgJzAhICBCQDgoICAmICAgICcwICAgIEBAKCAgJCAgICAqMCEgIEMgOCggICogICAgKjAgICAgUEAKK00oICAmICAgICwwISAgQ1A4KCAgLiAgICAsMCAgICBAQCggICggICAgIDAgICAgIEAoICAgICAgICAwICAKK00gICBMKCAgIiAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAiICAgICAwICAgICBAKCAgICAgICAKK00gMCAgICAgTCggICIgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAiKiAgICAwQCAgICFBSTggICkKK00gICAgMlAgICAgIEU4ICAoICAgIDYwICAgISBFOCAgIyAgICA6ICAgICIgRTggICQgICAgPTAgICAkIEUKK004ICAlICAgIEBQICAgJiBFOCAgJiAgICBEQCAgICggRTggICcgICAgICAgICAgIEE4ICAhICAgIEhAICAKK00gIUFJOCAgMSAgICBJUCAgICAgRTggICggICAgTTAgICAhIEU4ICAjICAgIFEgICAgIiBFOCAgJCAgICAKK01UMCAgICQgRTggICUgICAgV1AgICAmIEU4ICAmICAgIFtAICAgKCBFOCAgJyAgICAgICAgICAgQTggICkKK00gICAgX0AgICAgQU04ICA5ICAgISFAICAgICBFOCAgKCAgICElICAgICAgRTggICMgICAhKFAgICAgIEUKK004ICAkICAgISwgICAgICBFOCAgJSAgICEvQCAgICAgRTggICYgICAhMzAgICAgIEU4ICAnICAgICAgICAKK00gICBBOCAgMSAgICE3MCAgICBBTTggIEEgICAhOEAgICAgIEU4ICAoICAgITwgICAgICBFOCAgIyAgICEKK00/UCAgICAgRTggICQgICAhQyAgICAgIEU4ICAlICAgIUZAICAgICBFOCAgJiAgICFKMCAgICAgRTggICcKK00gICAgICAgICAgIEE4ICA5ICAgIU4wISAgRSA4KCAiJyAgICAgICAgICAgPCggIEQgICAgICAgICAgQEAKK00oICBCICAgIU4wICAgIUBAKCAgQSAgICFRMCEgIEZAOCggIikgICAgICAgICAgIDwoICBIICAgICAgICAKK00gIEBAKCAgRiAgICFRMCAgICFAQCggIEUgICAhViAhICBIIDgoICIrICAgICAgICAgICA8KCAgTCAgICAKK00gICAgICBAQCggIEogICAhViAgICAhQEAoICBJICAgIVswISAgSUA4KCAiLSAgICAgICAgICAgPCggIFAKK00gICAgICAgICAgQEAoICBOICAgIVswICAgIUBAKCAgTSAgICFeQCEgIEsgOCggIi8gICAgICAgICAgIDwKK00oICBUICAgICAgICAgIEBAKCAgUiAgICFeQCAgICFAQCggIFEgICAiI0AhICBMQDgoICIxICAgICAgICAKK00gICA8KCAgWCAgICAgICAgICBAQCggIFYgICAiI0AgICAhQEAoICBVICAgIikgISAgTiA4KCAiMyAgICAKK00gICAgICAgPCggIFwgICAgICAgICAgQEAoICBaICAgIikgICAgIUBAKCAgWSAgICIrUCEgIE9AOCggIjUKK00gICAgICAgICAgIDwoICEgICAgICAgICAgIEBAKCAgXiAgICIrUCAgICFAQCggIF0gICAiMDAhICBRIDgKK00oICI3ICAgICAgICAgICA8KCAhJCAgICAgICAgICBAQCggISIgICAiMDAgICAhQEAoICEhICAgIjUwISAKK00gUkA4KCAiOSAgICAgICAgICAgPCggISggICAgICAgICAgQEAoICEmICAgIjUwICAgIUBAKCAhJSAgICIKK004MCEgIFQgOCggIjsgICAgICAgICAgIDwoICEsICAgICAgICAgIEBAKCAhKiAgICI4MCAgICFAQCggISkKK00gICAiPSAhICBVQDgoICI9ICAgICAgICAgICA8KCAhMCAgICAgICAgICBAQCggIS4gICAiPSAgICAhQEAKK00oICEtICAgIkIwISAgVyA4KCAiPyAgICAgICAgICAgPCggITQgICAgICAgICAgUEAoICEyICAgIkIwICAKK00gIVBAKCAhMSAgICJFQCEgIFhQOCggIkEgICAgICAgICAgIDwoICE4ICAgICAgICAgISBAKCAhNiAgICIKK01FQCAgICIgQCggITUgICAiSSAgICApQUk4ICE+ICAgIkowICAgICBFOCAiRiAgICJLQCAgICIgRTggIkkKK00gICAiTVAgICAkIEU4ICJMICAgICAgICAgICBBOCAhOSAgICJPMCAgICkhTTggIUMgICAiUTAgICAgIEUKK004ICMkICAgIlJAICAgICBFOCAjJyAgICJUUCAgICAgRTggIyogICAgICAgICAgIEE4ICE+ICAgIlYwICAKK00gIDFROCAhSCAgICJXQCAgICAgRTggI0IgICAiWEAgICAgJEU4ICNDICAgIlogICAgIChFOCAjRCAgICAKK00gICAgICAgQTggIUMgICAiWzAgICAgMVE4ICFNICAgIl0gICAgICBFOCAjSyAgICJeUCAgICAkRTggI0wKK00gICAjIEAgICAgKEU4ICNNICAgICAgICAgICBBOCAhSCAgICMhUCAgICAxUTggIVEgICAjIyAgICAgIEUKK004ICNUICAgIyRAICAgICRFOCAjVSAgICAgICAgICAgQTggIU0gICAjJVAgICAgMVE4ICFVICAgIycgICAKK00gICBFOCAjXCAgICMoICAgICAkRTggI10gICAgICAgICAgIEE4ICFRICAgIyogICAgIDFROCAhWSAgICMKK00rMCAgICAgRTggJCQgICAjLFAgICAgJEU4ICQlICAgICAgICAgICBBOCAhVSAgICMuICAgICAgSTggJCYKK00gICAjMCAgICAgMVE4ICFeICAgIzFAICAgICBFOCAkLCAgICMzICAgICAkRTggJC0gICAgICAgICAgIEEKK004ICFaICAgIzQwICAgICBJOCAkLiAgICM2QCAgICAxUTggIiUgICAjOTAgICAgKEU4ICQ0ICAgIzowICAKK00gICRFOCAkNSAgICM7MCAgICAgRTggJDYgICAjPEAgICAgLEU4ICQ3ICAgICAgICAgICBBOCAhXyAgICMKK00+ICEgIFpQOCggJDggICAgICAgICAgIDwoICIoICAgICAgICAgPSBAKCAiJiAgICM+ICAgID4gQCggIiUKK00gICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJCAgICAlICEgITkgOCggIC0gICAgJSAgICAgQEAKK00oICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICUgICAgIjEgICJMIClLX19fICAgICUgISAKK00hOiA4KCAgLSAgICAlICAgIC5QQCggICIgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJCAgICAKK00jQCEgIUkgOCggIC0gICAgI0AgICAjMEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICYKK00gICAgIkAhICFNIDgoICAtICAgICJAICAgKFBAKCAgISAgICAkMCEgIVVQWCggIC8gICAgJDAgICAnMEAKK00oICAjICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICkgICAgI0AhICFdIDgoICAiICAgICUwISAKK00iIUA0K19fXyAgICAoQCEgIiYgNCtfX18gICAgKjAhICImQDQrX19fICAgICwgISAiJlA0K19fXyAgICAKK00tUCEgIicgNCtfX18gICAgI0AgICAqQEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICUKK00gICAgIzAhICIoIDgoICAiICAgICRQISAiKUA0K19fXyAgICAjMCAgICIgQCggICEgICAgIDAgICAgIEAKK00oICAgICAgICAwICAgICBMKCAgIiAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAiICAgICAwICAKK00gICBAKCAgICAgICAgMCAgICAgTCggICUgICAgIzAhICIqIDgoICAiICAgICRQISAiK0A0K19fXyAgICAKK00jMCAgICIgQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgOSAgICAjMCEgIiwgOCggICIKK00gICAgJSAhICIvIDQrX19fICAgICdQISAiMFA0K19fXyAgICAsMCEgIjFANCtfX18gICAgL1AhICIyUDQKK00rX19fICAgIDBQISAiMzA0K19fXyAgICA0MCEgIjYwNCtfX18gICAgNyAhICI3UDQrX19fICAgIDlQISAKK00iOUA0K19fXyAgICA8ICEgIjlANCtfX18gICAgPyAhICI/MDQrX19fICAgIEIgISAiQyA0K19fXyAgICAKK01EUCEgIkUwNCtfX18gICAgR1AhICJHMDQrX19fICAgIExAISAiSEA0K19fXyAgICBQICEgIkowNCtfX18KK00gICAgU0AhICJNMDQrX19fICAgIFYwISAiTlA0K19fXyAgICBZICEgIlBANCtfX18gICAgW0AhICJQQDQKK00rX19fICAgIF5QISAiVjA0K19fXyAgICEiICEgIlogNCtfX18gICAgIzAgICBQMEAoICAhICAgICAwICAKK00gICBAKCAgICAgICAgMCAgICAgTCggICUgICAgI0AhICJdIDgoICAiICAgICUwISAiXkA0K19fXyAgICAKK00jQCAgICIgQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgKCAgICAiQSAgIk4gKUtfX18KK00gICAgJFEgICBCICgzX19fICAgICdAISAiXyA4KCAgLSAgICAnQCAgICRAQCggICMgICAgKTAhICMjQDgKK00oICAvICAgICkwICAgJkBAKCAgJSAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAyICAgICJAISAKK00jKiA4KCAgLSAgICAiQCAgICdAQCggICEgICAgJFAhICMxQDgoICAvICAgICRQICAgLCBAKCAgIyAgICAKK00mQCEgIz1AOCggIDEgICAgJkAgICA0QEAoICAlICAgICgwISAjUiA4KCAgMyAgICAoMCAgIEMgQCggICcKK00gICAgKjAhICQ1IDgoICA1ICAgICowICAgMUBAKCAgKSAgICAsQCEgJEZAOCggIDcgICAgLEAgICAwUEAKK00oICArICAgIC5AISAkVzA4KCAgOSAgICAuQCAgIDYwQCggIC0gICAgMFAhICUtQDgoICA7ICAgIDBQICAKK00gJSBAKCAgLyAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAkICAgICMgISAlMyA4KCAgIiAgICAKK00jICAgICEgQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJCAgICAjQCEgJTQgOCggICIKK00gICAgI0AgICAhIEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICIgICAgIDAgICAgIEAKK00oICAgICAgICAwICAgICBMKCAgIiAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAtICAgICJBICAKK00iXyApU19fXyAgICAkMSAgIl9AKVNfX18gICAgJiEgICJfUClTX19fICAgICdRICAjICApU19fXyAgICAKK00pQSAgIyAwKVNfX18gICAgK1AhICU1IDgoICAtICAgICtQICAgUUBAKCAgJiAgICAtQCEgJiZAOCggIC8KK00gICAgLUAgICAkIEAoICAoICAgIC5QISAmKkA4KCAgMSAgICAuUCAgIDEgQCggICogICAgIDAgICAgIEAKK00oICAgICAgICAwICAgICBMKCAgJSAgICAjQCEgJjwgOCggICIgICAgJTAhICY9QDQrX19fICAgICNAICAKK00gIiBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAlICAgICNAISAmPiA4KCAgIiAgICAKK00lMCEgJj9ANCtfX18gICAgI0AgICAiIEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICYKK00gICAgIyAhICZAIDgoICAtICAgICMgICAgIFBAKCAgISAgICAlMCEgJkBQOCggIC8gICAgJTAgICAgUEAKK00oICAjICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICQgICAgIlAhICZCIDgoICAtICAgICJQICAKK00gJTBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAoICAgICMwISAmSCA4KCAgIiAgICAKK00jMCAgICJAQCggICEgICAgJFAhICZKQDQrX19fICAgICVQISAmSyA4KCAgJiAgICAnICEgJkxQNCtfX18KK00gICAgJVAgICAjQEAoICAkICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICUgICAgI0AhICZPIDgKK00oICAiICAgICUwISAmUEA0K19fXyAgICAjQCAgICIgQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAKK00gICBMKCAgIiAgICAgMCAgICAgQCggICBfX19fX1AgICAgICAgICAkICAgICAvX19fX1wgICAgICAgICAKK00hQCAgICAjX19fX18gICAgICAgICAgQCAgICAgX19fX19QICAgICAgICAgKiAgICAgICAgICAgJiAgICAKK00gQCAgICAwICAgICYgICAgIiAgICAgSCAgICArICAgICBQICAgIDQgICAgJyAgICAiMCAgICFIICAgICMKK00gIyAgX18gICEgICAgICAgICAgICAgICAgMCAgICBAIyAjICBfXyAgISAgICAgICAgICAgICAgICAwICAKK00gIEAjICMgIF9fICAhICAgICAgICAgICAgICAgIDAgICAgQCQgIyAgX18gICEgICAgICAgICAgICAgICAKK00gMCAgICEgJCAjICBfXyAgISAgICAgICAgICAgICAgICAwICAgISAlICMgIF9fICAhICAgICAgICAgICAKK00gICAgIDAgICAhICYgIyAgX18gICEgICAgICAgICAgICAgICAgMCAgICIgJiAjICBfXyAgISAgICAgICAKK00gICAgICAgICAwICAgIiAnICMgIF9fICAhICAgICAgICAgICAgICAgIDAgICAiICggIyAgX18gICEgICAKK00gICAgICAgICAgICAgMCAgICIgKCAjICBfXyAgISAgICAgICAgICAgICAgICAwICAgIiApICMgIF9fICAKK00hICAgICAgICAgICAgICAgIDAgICAiICogIyAgX18gICEgICAgICAgICAgICAgICAgMCAgICIgKyAjICAKK01fXyAgISAgICAgICAgICAgICAgICAwICAgJCAjICEgICBQIDAgICwgJCAgJCAhICAhICAwICA0ICQgICYKK00gISAgIUAgMCAgPCAkICAoICEgICIgIDAgIEQgJCAgKiAhICAiUCAwICBQICAgI19fX19fX19fX19QUCAKK00gICNfXCAgISAgICAgIFAgICAjX19fX19fX19fX1BQICAgI19cICApICAgICAgVCAgICNfX19fX19fX18KK01fUFQgICAjX1wgIDEgICAgICBUICAgI19fX19fX19fX19QVCAgICNfXCAgOSAgICAgICAgICI0IyAgICAKK00gICAgKjAsICAgICAgICBNIFAgICAgICAgIyQkICAgICAgICAtMDAgICAgICAgIFkhMCAgICAgICAjVCYKK00gICAgICAgIDAwOCAgICAgICAhJSFQICAgICAgICREKCAgICAgICAgMzBAICAgICAgICExIjAgICAgICAKK00gJTQqICAgICAgICA2MEwgICAgLCAgICBfX19fX19fX19fXCwgISAgX18gIDYwICAgICAsICEoMF9fICAKK002MCAgICAgLCAjLFBfXyAgIDAgICAgI19cICAkICAgICAgICAgICAgICAgIiAgICBQL19QICAwICAgICAKK00gICAgICAgICAgJCAgICkgX18gICEgICAgICAgICAgICAgICAgICAgISggLCAhICBfXyAgNjAgICAgIC0KK00gICAgX19fX19fX19fX1wsICEgIF9fICA2MCAgICAgLCAhKDBfXyAgNjAgICAgICwgIyxQX18gICAwICAKK00gICNfXCAgJCAgICAgICAgICAgICAgICIgICAgUC9fUCAgMCAgICAgICAgICAgICAgICQgICApIF9fICAKK00hICAgICAgICAgICAgICAgICAgICEoIC0gICAgX18gIDdAICAgICAuICAgIF9fX19fX19fX19cICAgICAKK00gICAgICAgICAgIC4gICAgX18gIDhQICAgICAuICAgIF9fX19fX19fX19cICAgICAgICAgICAgICAgIC4KK00gICAgX18gIDogICAgICAuICAgIF9fX19fX19fX19cICAgICAgICAgICBYICAgI19cICFNICAgICAgWCAKK00gICNfX19fX19fX19fUCAgICAgICAgICAjQCAgIC9fUCAnJCAgICAgI0AgICAvX19fX19fX19fXyAgICAKK00gICAgICAgLiAgICBfXyAgPTAgICAgIC4gICAgX19fX19fX19fX1wgICAgICAgICAgIFggICAjX1wgIVoKK00gICAgICBYICAgI19fX19fX19fX19QICAgICAgICAgICAgICAgICAgICAgICAgIikhQCAgICAgICAgICYKK00gICAgIEAgICAgMCAgICAmICAgICIgICAgIEggICAgKyAgICAgUCAgICA0ICAgICcgICAgIjAgICAhSCAKK00gICAgICAgIyFAICAgICAgICAgJiAgICAgQCAgICAwICAgICYgICAgIiAgICAgSCAgICArICAgICBQICAKK00gIDQgICAgJyAgICAiMCAgICFIICAgICAgICAkIUAgICAgICAgICAmICAgICBAICAgIDAgICAgJiAgICAKK00iICAgICBIICAgICsgICAgIFAgICAgNCAgICAnICAgICIwICAgIUggICAgICAgICMhQCAgICAgICAgICYKK00gICAgIEAgICAgMCAgICAmICAgICIgICAgIEggICAgKyAgICAgUCAgICA0ICAgICcgICAgIjAgICAhSCAKK00gICAgICAgIyBQIDAgICAgICA0IyAhICBfX19fX1AgICAgICAgICAoICAgICAvX19fX1wgICAgICAgICAKK00hICAgICAjX19fX18gICAgICAgICAgMCAgICAgX19fX19QICAgICAgICAgOCAgICAgL19fX19cICAgICAKK00gICAgISAgICAgICAgICAgIUAgICAgKCAgICAkICAgICFAICAgIEAgICAgKiAgICAiUCAgICAsICAgICUKK00gICAgIVAgICAgRCAgICA6ICAgICAgICAhMDggICAgICAgICcmQCAgICAgICAgICYgICAgIEAgICAgMCAKK00gICAmICAgICIgICAgIEggICAgKyAgICAgUCAgICA0ICAgICcgICAgIjAgICAhSCAgICAgICAgIyZAICAKK00gICAgICA0JiAgICAgICAgIVA4ICAgICAgICApIUAgICAgICAgIEwmICAgICAgICAjMDggICAgICAgIC8KK00hQCAgICAgICAhJCYgICAgX19fX19QICAgICAgICAgIyAgICAgL19fX19cICAgICAgICAgIFAgICAgICAKK00gICAgIUAgICAgKCAgICAkICAgICFAICAgIEAgICAgKiAgICAiUCAgICAsICAgICUgICAgIVAgICAgRCAKK00gICA6ICAgICAgICAgIDggICAgIiAgICAhICAgICA4ICAgICggICAgIkAgICAgTCAgICAjICAgICEwICAKK00gIDwgICAgKSAgICAmQCAgICAgICAgICYgICAgIEAgICAgMCAgICAmICAgICIgICAgIEggICAgKyAgICAKK00gUCAgICA0ICAgICcgICAgIjAgICAhSCAgICAgICAgKCZAIDAgICAgICBIOiAgICAgICAgIyFIICQgI18KK01fX19fICAgICAgICAgIDAgICAgIF9fX19fUCAgICAgICAgICQgICAgICAgICAgICYgICAgIEAgICAgMCAKK00gICAmICAgICIgICAgIEggICAgKyAgICAgUCAgICA0ICAgICcgICAgIjAgICAhSCAgICAgICAgIyFAICAKK00gICAgICA0JiAgICAgICAgICA4ICAgICIgICAgISAgICAgOCAgICAoICAgICJAICAgIEwgICAgIyAgICAKK00hMCAgICA8ICAgICkgICAgJkAgICAgICAgICwmICAgIF9fX19fUCAgICAgICAgICMgICAgIC9fX19fXCAKK00gICAgICAgICFQICAgICNfX19fXyAgICAgICAgICAwICAgICAgJi1SPSMlVDk3QVQrRywgNFUxITRFMSYKK000RFQgN1VdUz0mJVI9ICE/OzZdTjhWXU49JylPOyAhPzs2LU89NllUICVdUzwnKU84VlVPO0ctVDg3KVQKK00gICBPOEYlQjgyXUM+NyFSOTctUytXNVM8Ql1JO0YtTD02MUUrVylFOVYxRTlCWUggICBPOEYlQjgyXUMKK00+NyFSOTctUytXNVM8Ql1JO0YtTD02MUUrViVTOzJZSCAgIUM8RzBRPSZFTjo3ME48UCAgOVYxQjs2NE4KK004UCBcK1MxJDk2KVU5UlxeICchVTwmRUwuQl1DPjY9STtHME88JlFBPjJdRjtGOE85VjFCOzY0TjhQIFcKK00sIyhTLSNAUy1DRCAtMyxYLUAhVDdXLVQ8RzVDPSAhVjdWLUg4Nyk/OzY1TThGNVIgJzk/PFZBTzxHMT8KK007NjVNOEY1UiAnOT86NllUN1ZVRTs2KUU8QCFWN1ZRTztGPT87NjVNOEY1UiAnOT85RlFPODcxPzs2NU0KK004RjVSICc5PzkmXVU4RlFFN1ZVRTs2KUU8QCBOMUMkUSAnOT84VkFBPEVdTTk2VUI5NyggPUVdUzomXVIKK009JV1NOTZVQjk3KCA9RV1JO0cxPzs2NU04RjVSICc5PzsmXU45VV1NOTZVQjk3KCA9RV1GOyZdQT0lXU0KK005NlVCOTcoID1FXUQ7VzVCOyY1Pzs2NU04RjVSICcxPz02WUk7VlggPUVdQzomJVI3VlVFOzYpRTxAIVYKK003Vy1IO1cpVDdWVUU7NilFPEAhVjdWRU49JV1NOTZVQjk3KCA9RV1MO1ZZRzdWVUU7NilFPEAhVjdWOUwKK007ViVUN1ZVRTs2KUU8QCFWN1YxTz02KUw5NV1NOTZVQjk3KCArRDhRLFAhVjdWLUg4Nyk/OzY1TThGNVIKK00gJzk/PFZBTzxHMT87NjVNOEY1UiAnOT86NllUN1ZVRTs2KUU8QCFWN1ZRTztGPT87NjVNOEY1UiAnOT8KK005RlFPODcxPzs2NU04RjVSICc5PzkmXVU4RlFFN1ZVRTs2KUU8QCFWN1YtSDg3KT85RzVOOFAhVjdXLUkKK005VllFOSVdQzomJVI3VjlVO0YsID1FXVU7Ry1JOVZZRTklXUM6JiVSN1Y5VTtGLCA9RV1TOiZdUj0lXUYKK009NllDICc5PzxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsID1FXVU7Ry1JOVZZRTklXVM6Jl1SPSVdRj02WUMKK00gJzk/OjZZVDdWOVU7RiwgPUVdUzo2PU45NjE/OjZZVDdWOVU7RiwgPUVdVTtHLUk5VllFOSVdSTtHMT8KK005RzVOOFAhVjdWUU87Rj0/OUc1TjhQIVY3Vy1JOVZZRTklXUw7VllHN1Y5VTtGLCA9RV1VO0ctSTlWWUUKK005JV1MO1ZZRzdWOVU7RiwgPUVdRjsmXUE9JV1GPTZZQyAnOT85Jl1VOEZRRTdWOVU7RiwgOyZFTjpQIU4KK005N0FUICZRSTtGTUY9NllDICctVD02OUYgJzFVN1ZRSTtGTCA7RjVYPSAhTDo2WUs5RzVOOFAhUz0nNUYKK005QCBOMUMoWSAnKUU5ICFHPEY1RTtAIUI7JzVFICYtTzsmXVI8UCFZOTZRTDtXPCA8JzVSPCZRRSAnIUkKK007RkwgK0Q4UywwIUM6JjVWPjAhRjtXKUQgJi1BPEcsIDhGVVcgJyFPPEctQzomNCArRDhTLFAhJjA0UTMKK00xMCE0NEU1JSAmKU87VlFFODZYIDhHOUE7JywgOUYlTDxWNCA9JylVOTAhQjtWXUw5NiVOLEAhTTo3LU8KK008RjFFPEY1RCAnMVc7UCFPO0Y0ID5GNVI7UCFUOicpRTkwIU04NkVOICAhRzk2WE88VzFVOEY5UDk3LVQKK004NylUK0YsIDdVXVI5NiVEOTZZVjdXLUk5VjlQOTAgIDhXMVk8JjROOFAhRjo3KVM9JV1DODZRTCAlXVMKK005NzFDOicpQzsmJVM8UCAgOVY1TitWLVU5N0FJPSJZQyAmNVg6NzAgICY9RT0mNU49QllDICY9RT0mNU4KK009QCFOPUZVQT0mLUggICFHOTZYTzxXMVI4VyFZK0csIDxXMVI4VyFZICMkRCwjIFAsIyBQLCMgUCwgIEQKK005Jl1DOiMsICkmMU84VkBSICIxRDtWLUgsMCBEOSZdQzojICAgJy1ZPFJdPztXIUU7QllTICVdTzwmNU4KK00gI0RELCMgUCwjIFAsIyBQLCAgICtWKUE4RiRPOFdFUDxGNVM8Ul1VPFcoTzo2WUM7JzVEOTJdUz43LE4KK008UCAgK1YpQThGJE84V0VQPEY1UzxSXVU8VyhPOjZZQzsnNUQ5Ml1TPjcsTzxXRVM4ViVMOyJZSCAgIVMKK00+NyxPN1cpRTg2ME48UCE/PEY1QTkgIFkpIyBQLCMgUCwjIFAsIyAgICY9RTtCXUI4Vl1QPjJZUyAmVUUKK007Ni1QPjAhRztWOU88Rz1BPEYxUyAmOU88Rz1BPEYxUzdWKVk9JjVDO1chWSAjRFkpIyBQLCMgUCwjIFAKK00sIyAgPEY1VCAmOU88Rz1BOyZFRztGJUI7JjQgOUZdUj1VXUM7VyFZLEAhRjtXKVc3Vi1PPCdEUyAmOU8KK008Rz1BPEYxUyAmOU88Rz1BPEYxUzdTLFIgJjlPPEc9QTxGMVM3UyRWICY5TzxHPUE8RjFTN1MwIDlWXUIKK004Ni1LPVYlUjknLCA4RiVDOlc9QTxGMVM3VilZPSY1QztXIVkgI0RZKSMgUCwjIFAsIyBQLCMkIDhGJUMKK006ViVMOjY9Tjg2KUw5MCFCODYtSzdWLU88J0RSICYpQThWTT84Vl1QPjMsIDhGJUM6Vz1BPEYxUyAmKUEKK004Vk1XODcpRDxVXFMsQCFCODYtSz1WJVI5Jy0/LDM4IDhGJUM6Vz1BPEYxUzdTMCAgJy1ZPFJdPzhWUU8KK008VjROPFAhPzhWUU88VjQgLjIwUCwjIFAsIyBQLCMgUCAgIUE9JjVYOjcwTjhQIT83VllFPicxRjtAIT8KK003VjVYOjcxPzlGWVMgJiVUOTdBST0gIT83Vi1BOyZRPzk3QUk9JjlOPFAgIDlGUVM4RzVGK0YsIDdWLUwKK005NiVOPTcgIDlGLUw7Vy1FICY5RjsnNVM6ICE/OUZRUzhHNUYgJV1YOUZRUzhHNUYgJV1XPEcxQzomTCAKK003VjlJO0YxQj02OCA3VilVOUctWTtGLCAgJy1ZPFJdRT4mRVQrRywgN1Y1WDo3MCAgJi1SPSJdQzk3KVIKK007VyhOPFAhPzhWNVI8Rl1SICAhRDg3MUErRiwgICZVUDdWMUU5QllDICAhTTg2UUw7VixOOFAhQTsmUU8KK004VywgODZRTDtWLVAgJiVMOyZdQz0gIUE7JlFPOFdAIDg2UUw7Vi1FO0YwIDs2JUw7Jl1DICY5Ujk2NCAKK008RjVBOyZRTzhQICA8V0VTK1VdTDxWNUU6UllTICVdTDxWNUU6UCBZKSMgUCwjIFAsIyBQLCMgICAnLVkKK008Ul0/PVcpST0mNE48UCE/PVcpST0mNCAuMjBQLCMgUCwjIFAsIyBQICAhPztXLUU8RylPPEJZQyAlXU8KK008VjVSPEZdUiAlXVM5NzFPPFY1UjxGXVIgICE/OjctQT0nMVkrRiwgN1ZFUzg3MVQ+MCAgPFdFUytVXVMKK004RylLK0csIDdXLUI8RkwgOTcpUiAlXUI8RkwgLDIwUCwjIFAsIyBQLCMgUCAgIVM+NyxPN1ZFTzhXMUwKK00rRywgN1ZFTzhXMUwgI0RELCMgUCwjIFAsIyBQLCAgIDhXKVQ7RkVOOjcwTjxQICA3VjVOPUZFUjtWWCAKK005NllWOjcpTztAIT83VCVSOVYsIDdVXSE8Rj1WICY1UjxGWU8gJV0/PFcxQTxHMCA3Vj1QICVdPzo3LVQKK004NylUICVdPzxGNUE5JjVOPUVdUzo2PUY8JjQgN1ctRT0mLUg8Ri1MODctUyAmVUE6NlggOTdBST0gIT8KK007Nl1OOFZdTj0nKU87ICE/OzYtTz02WVQgJV1TPCcpTzhWVU87Ry1UODcpVCAnOT84VkFBPEAhVjdXLUkKK005VllFOSVdQzomJVIgJzk/PTZZUzo2PU45NjE/OFZBQTxAIVY3Vy1IO1cpVCAnOT88VkVHO0Y1RDdXLUgKK007VylUICc5Pz02WVM6Nj1OOTYxPzxWQU88RzAgPUVdSTtHMCA9RV1TOjY9Tjk2MT86NllUICc5Pz02WVMKK006Nj1OOTYxPzo2WVQgJzk/OyZdTjlQIVY3Vy1JOVZZRTklXUw7VllHICc5Pz02WVM6Nj1OOTYxPzsmXU4KK005UCFWN1Y5TDtWJVQgJzk/OSZdVThGUUUgJzk/OFZBQTxFXUE8RylBPjAhVjdXLUk5VllFOSVdQzomJVIKK003ViVSPEYlWSAnOT89NllTOjY9Tjk2MT84VkFBPEVdQTxHKUE+MCFWN1ctSDtXKVQ3ViVSPEYlWSAnOT8KK008VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkgJzk/PTZZUzo2PU45NjE/PFZBTzxHMT84NylSODdEID1FXUkKK007RzE/ODcpUjg3RCA9RV1TOjY9Tjk2MT86NllUN1YlUjxGJVkgJzk/PTZZUzo2PU45NjE/OjZZVDdWJVIKK008RiVZICc5PzsmXU45VV1BPEcpQT4wIVY3Vy1JOVZZRTklXUw7VllHN1YlUjxGJVkgJzk/PTZZUzo2PU4KK005NjE/OyZdTjlVXUE8RylBPjAhVjdWOUw7ViVUN1YlUjxGJVkgJzk/OSZdVThGUUU3ViVSPEYlWSAnOT8KK004VkFBPEVdUDtWRU49JjVSICc5PzxWRUc7RjVEN1YtSDg3KT88Jl1JO0cxRTxAIVY3VzVOPFZFRztGNUQKK003Vi1IODcpPzwmXUk7RzFFPEAhVjdXLUg7VylUN1chTzo2WVQ5NyggPUVdUzo2PU45NjE/PFZBTzxHMT8KK008Jl1JO0cxRTxAIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoID1FXUk7RzE/PCZdSTtHMUUKK008QCFWN1ctSTlWWUU5JV1JO0cxPzwmXUk7RzFFPEAhVjdXNU48VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIKK00gJzk/OyZdTjlVXVA7VkVOPSY1UiAnOT88VkVHO0Y1RDdWUU87Rj0/PCZdSTtHMUU8QCFWN1c1TjxWRUcKK007RjVEN1ZRTztGPT88Jl1JO0cxRTxAIVY3VjlMO1YlVDdXIU86NllUOTcoID1FXUQ7VzVCOyY1PzwmXUkKK007RzFFPEAhVjdXLVQ8RzVDPSMkID1FXVM9JylVOFcwUiAnOT89NllJO1ZYID1FXVU7RkVPO0MoID1FXUMKK006JiVSN1Y5VTtGLCA9RV1TOjY9Tjk2MT84VkFBPEVdRj02WUMgJzk/PTZZUzo2PU45NjE/OFZBQTxFXUYKK009NllDICc5PzxWQU88RzE/OUc1TjhQIVY3Vy1JOVZZRTklXVM6Jl1SPSVdRj02WUMgJzk/PTZZUzo2PU4KK005NjE/PFZBTzxHMT85RzVOOFAhVjdWRU49JV1GPTZZQyAnOT88VkVHO0Y1RDdWRU49JV1GPTZZQyAnOT8KK009NllTOjY9Tjk2MT86NllUN1Y5VTtGLCA9RV1MO1ZZRzdWOVU7RiwgPUVdUzo2PU45NjE/OyZdTjlVXUYKK009NllDICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1GPTZZQyAnOT85RlFPODcxPzlHNU44UCFWN1YxTz02KUwKK005NV1GPTZZQyAnLT87JkVOOlAhVTdWUUk7RkwgPCcpSTs2JVI+MCFOO1ZZUDxGRU04NylZICYtTD02WUsKK005NyggPFchTzxHMVM4ViVSICVdQz0nRVA5MCFHOTcxRTtHOCA8VzFSOFchWSAlXU88JjVOICVdUjk2JUQKK00gJlVFOzYtUD4wIT84VlFPPFY0IDdVXVQ8RiVQN1Y5UDk1XU89RjVSPEZFRDkwIT83Vi1BOyZRPzk3QUkKK009JjlOPFAhPzhWUUU4NllVPCAhPzk3QUk9ICE/OFY1UjxGXVIgJiVUOTdBST0gIT84RzVGOTZZRD0mJUIKK00gJV1JO1YoIDdXLVA8Rl1DOTYwIDdWUUE8VzFCPTY4IDdXLUk4RzVGICVdUztWKVU5QCE/PFZVQj02OCAKK005RjlMPTctSCAmOUM7Jl1TOTAhRjxGNUUgJV1MPFY1RTpQIT8+JjlMPFYpVTlAIT85RlFTOEc1RiAlXVcKK008RkVUOTAhPz1XKVQ4VkFLICVdQj02OVM+NllDICVdUzk3MU88VjVSPEZdUiAlXUY6NllEOEc1RiAmVUEKK007JlFPOFAhPzo3LUE9JzFZICVdTDtWLUsgJV1VOyZdQzpQIT87RlFPOFZMIDdWRUw7Vi1LICVdRjsmXUMKK006UCE/PVZRTzhWTCA3Vi1MO1YtSyAlXVQ7Jl1DOlAhPzhXMUw7Vi1LICVdRDsmXUM6UCE/OFYlUyAlXVUKK008VV1SPFcxSDxGNUE5JV1TPSYxSTtQIT88VilSOlAhPzhHKUsgJylFODZRTDtWLCA3Vl1TOTcpUjtXKCAKK003VkVPOFcxTCAmNU45ICE/OzZFTjhHKUsgJV1DPTcpQjxGTCA3VjVOOSAgICAkICFQICAgICAkICAgICAKK00gICAgMCAgICAgICAgICArICAgICAgICAgIiQgICAgICAgICAgICAgICAwICAgICAgICAgJCAgICAgICAKK00gICAlJjggICAgICAgICAgICAgPyAkICFQICAgICAkICAgISAgICAgKSAgICAgTCAgICAiICAgICAgICAKK00gICAgICAgICAgICAgICAkICAgICAgIDAgICAgICAgICAgNCAgICAlJzggICAgICAgICAgICAgICAkICEKK01QICAgICAkICAgIUQgICAgKDAgICAgVCAgICAiICAgICAgICAgICAgICAgICAgICAgICAkICAgICAgIDAKK00gICAgICAgICAgSCAgICAlJzggICAgICAgICAgICAgICAkICFQICAgICAkICAgIiUgICAgIzAgICAgXCAKK00gICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAgICAhJzggICAgICAKK00gICAgICAgICAkICI0ICAgICAkICAgIjIgICAjPzAgICAhJCAgICIqICAgICgwICAgLFwgICAgICAgICAKK00gICAkICBcICAgIDAgICAhJkAgICAhICAgICAhIDAgICAgICAgIVwgICAgXyAkICVEICAgICAkICAgMC8KK00gICAgKTAgICApTCAgICAkICAgIFwgICAgICggICAgICAgICAgICAzICAkICAgJEogICAgI1AgICAhJCAKK00gICAhIDggICAgICAgJVggICAgISAkICVIICAgICAkICAgMFQgICAgKDAgICApXCAgICAlICAgIFxAICAKK00gI0wgICAgICAgICAgICA0ICAkICAgJFkgICAgI1AgICAhKCAgICAhIDggICAgICAgJVwgICAgNyAkICYKK01EICAgICAkICAgMTUgICAgJFAgICAqMCAgICAkICAgISswICAgIFQgICAgICAgICAgICA1ICAkICAgJSgKK00gICAgI1AgICAhLCAgICAhIDggICAgICAgJzggICAgLCAkICZUICAgICAkICAgMUggICAgJjAgICAqQCAKK00gICAmICAgIS5AICAgJCAgICAgICAgICAgICA2ICAoICAgJTcgICAgJDAgICAhMCAgICAhIDggICAgICAKK00gKCggICAgMCAkICdUICAgICAkICAgMiEgICAgL0AgICAqWCAgICApICAgIT5AICAgIkggICAgICAgICAKK00gICA4ICAkICAgJUggICAgISAgICAhNCAgICAlJjggICAgICAgKSggICAgSiAkIChAICAgICAkICAgMl8KK00gICAgKCAgICArPCAgICAlICAgIUkgICAgIEAgICAgICAgICAgICA5ICAkICAgJUwgICAgISAgICAhSCAKK00gICAlJjggICAgICAgK1AgICAgJSAkIChAICAgICAkICAgMz8gICAgKDAgICArUCAgICAiICAgICAgICAKK00gICAgICAgICAgICAgICAhICAgICAgICQgICAgICAgICAhXCAgICAlJzggICAgICAgICAgICAgICAkICgKK01AICAgICAkICAgNCAgICAgKjAgICArWCAgICAiICAgICAgICAgICAgICAgICAgICAgICAhICAgICAgICQKK00gICAgICAgICAiMCAgICAlJzggICAgICAgICAgICAgICAkIChIICAgICAkICAgNEkgICAgKCAgICAsICAKK00gICAlICAgIUsgICAgIEAgICAgICAgICAgICA6ICAkICAgJVAgICAgISAgICAiRCAgICAlJjggICAgICAKK00gLCQgICAgJSAkIChQICAgICAkICAgNSkgICAhJSAgICAsNCAgICA5ICAgIU0gICAgLDggICAgICAgICAKK00gICA7ICAkICAgJVQgICAgISAgICAiWCAgICAlJjggICAgICAgLDggICAiVCAkICtUICAgICAkICAgOT0KK00gICAgKEAgICAtWCAgICAlICAgIj5AICAgIEAgICAgICAgICAgICA8ICAkICAgJVggICAgISAgICAjLCAKK00gICAlJjggICAgICAgN0ggICAgJSAkICtcICAgICAkICAgOV8gICAgLSAgICAuLCAgICAoICAgIkBAICAKK00gIlAgICAgICAgICAgICA9ICAoICAgJVwgICAgJDAgICAjQCAgICAhIDggICAgICAgN1wgICAgKCAkICwKK01IICAgICAkICAgOlMgICAgMyAgICAuTCAgICAyICAgIktAICAgQiggICAgICAgICAgICA/ICBAICAgJi0KK00gICAgJzAgICAjRCAgICAhIDggICAgICAgODwgICAiOyAkIDUsICAgICAkICAgO18gICAgJEAgICAvVCAKK00gICAkICAgJFQgICAgIDAgICAgICAgICAgICBHICAkICAgJkogICAgISAgICAjSCAgICAlJjggICAgICAKK00gQiggICAgIiAkIDUwICAgICAkICAgPDEgICAgJUAgICAwJCAgICAkICAgJFUgICAgIDAgICAgICAgICAKK00gICBIICAkICAgJk4gICAgISAgICAjXCAgICAjJjggICAgICAgQjAgICAgIyAkIDU0ICAgICAkICAgPEcKK00gICAgIiAgICAwNCAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlIgICAgIzAgICAkKCAKK00gICAhIDggICAgICAgICAgICAgICAkIDU0ICAgICAkICAgPE8gICAgIkAgICAwPCAgICAiICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgJl8gICAgIzAgICAkLCAgICAhIDggICAgICAgICAgICAgICAkIDUKK000ICAgICAkICAgPFkgICAgMFAgICAwRCAgICAtICAgJFYgICAgMUwgICAgICAgICAgICBJICAsICAgJywKK00gICAgJFAgICAkMCAgICAhIDggICAgICAgQjwgICAhTiAkIDlQICAgICAkICAgPVwgICAgKEAgICAxOCAKK00gICAlICAgJVxQICAgIEAgICAgICAgICAgICBMICAkICAgJz8gICAgISAgICAkNCAgICAlJjggICAgICAKK00gSTQgICAgJSAkIDlYICAgICAkICAgPj4gICAgKEAgICAxTCAgICAlICAgJV5QICAgIEAgICAgICAgICAKK00gICBNICAkICAgJ0MgICAgISAgICAkSCAgICAlJjggICAgICAgSUggICAgJSAkIDogICAgICAkICAgPyAKK00gICAgKDAgICAyICAgICAmICAgJiBQICAgIDggICAgICAgICAgICBOICAoICAgJ0cgICAgJDAgICAkXCAKK00gICAhIDggICAgICAgSVwgICAgIyAkIDooICAgICAkICAgP0EgICAgJFAgICAyOCAgICAkICAgJiIwICAKK00gITQgICAgICAgICAgICBQICAkICAgJ1ggICAgI1AgICAlICAgICAhIDggICAgICAgSiggICAgKSAkIDoKK01AICAgICAkICAgP1QgICAgKjAgICAySCAgICAoICAgJidAICAgIUggICAgICAgICAgICBRICAoICAgKCcKK00gICAgIiAgICAlJCAgICAlJjggICAgICAgSkwgICAgMCAkIDpcICAgICAkICAgQD0gICAgKEAgICAzKCAKK00gICAlICAgJi4gICAgIEAgICAgICAgICAgICBTICAkICAgKC8gICAgISAgICAlOCAgICAlJjggICAgICAKK00gS0wgICAgJSQkIDskICAgICAkICAgQF8gICAgIyAgICAzPCAgICAiICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAlTCAgICAhJzggICAgICAgICAgICAgICAgICAgICAgICAkICAgICEKK00gICAgIEAgICAgKCAgICAgICAgICAwICAgICQgICAgIiAgICAgQCAgICAgICAgICEgICAgIDAgICAgKCAKK00gICAiICAgICBQICAgIDAgICAgJSAgICAhQCAgICA8ICAgICggICAgIjAgICAgKCAgICAiICAgICAwICAKK00gICQgICAgKiAgICAgMCAgICAoICAgICsgICAgIyAgICAgSCAgICAhICAgICBAICAgIEwgICAgLCAgICAKK00iQCAgICAkICAgICIgICAgIlAgICAgUCAgICAtICAgICAwICAgICggICAgKyAgICAjICAgICBYICAgICIKK00gICAgIEAgICAgJCAgICAhICAgICNQICAgICQgICAgIiAgICAiUCAgICBQICAgIDAgICAgJDAgICAhKCAKK00gICAhICAgICBAICAgIEwgICAgLCAgICAkUCAgICAkICAgICIgICAgJSAgICAhNCAgICA2ICAgICVQICAKK00gICQgICAgIiAgICAiUCAgICBQICAgIDggICAgIDAgICAgKCAgICArICAgICMgICAgIUQgICAgOiAgICAKK00mUCAgICAkICAgICIgICAgIlAgICAgUCAgICA8ICAgICAwICAgICggICAgKyAgICAjICAgICFUICAgICAKK00gICAgICEgICJLICVLX19fICAgICAgICAgIEQwICBKUCE6X19fUCAgICAgICAgIDEkICAsJCA3L19fXCAKK00gICAgICAgICYhICAjITAlU19fXyAgICAgICAgICFcMCAgUDghPF9fX1AgICAgICAgICBFICQgIVAhQEAKK00gICggICAgICAgICArMSAgQkggNEtfX18gICAgIFAgICAjJCAwIUw8JUxfX19QICAgIDQgICAgWiAkICUKK01EIUBAICAkICAgICYgICAgMlAhICE6IDgoICAiICAgICEgICAgJUAgMCAuTCYiICBBMCAgICA8ICAgIT0KK00gJCAmRCFAQCAgJCAgICAgICAgIDhAISAgQkA4KCAgJCAgICAgICAgICZYIDAgKFAmIiAgIUAgICAgICAKK00gICFWICQgIi8hQEAgIEAgICAgJCAgICBBMSAgIlEgJVAgICggICAgISAgICAoUDAgIEwxITwgICIgICAKK00gIDAgICAiOiQgICskQDcgICBAICAgICQgICAgSkEgICJRMCVQICAjICAgICEgICAgKygwICBMNiE8ICAKK00gUCAgICAwICAgIyEkICArJiA3ICAgRCAgICAkICAgIFRBICAiUVAlUCAgJCAgICAhICAgIC1AMCAgTEAKK00hPCAgISAgICAgMCAgICNFJCAgKykgNyAgIEggICAgJCAgICBdISAgIlJAJVAgICUgICAgISAgICAvTDAKK00gIExMITwgICEwICAgIDAgICAkKSQgICssIDcgICBMICAgICQgICAhJjEgICJTMCVQICAmICAgICEgICAKK00gMiQwICBMWCE8ICAhUCAgICAwICAgJEokICArMCA3ICAgVCAgICAkICAgIS1RICAiVCglUCAgMyAgICAKK00hICAgIDRMMCAgTSQhPCAgJjAgICAgMCAgICVBJCAgKzIgNyAgIVwgICAgJCAgICE7USAgIlRQJVAgIEUKK00gICAgISAgICA4MDAgIE0wITwgICpQICAgIDAgICAmOyQgICs2IDcgICMkICAgICQgICAhSVEgICJWICUKK01QICBXICAgICEgICAgO0gwICBNSCE8ICAvMCAgICAwICAgJy8kICArPCA3ICAkLCAgICAkICAgIVchICAKK00iV0AlUCAhKSAgICAhICAgID8gMCAgTiAhPCAgM1AgICAgMCAgICgmJCAgK0IgNyAgJTQgICAgJCAgICIKK00lISAgOF8gJDggITsgICAgISAgICBCLDAgIE4wITwgIDgwICAgIDAgICAoUiQgICtFIDcgICYoICAgICQKK00gICAiMiEgICJZQCVQICFDICAgICEgICAgRiAwICBOPCE8ICA5ICAgICAwICAgKVAkICArSCA3ICAmNCAKK00gICAkICAgIkFRICAiWjAlUCAhRiAgICAhICAgIEogMCAgTkghPCAgOVAgICAgMCAgICpOJCAgK0sgNyAKK00gJkAgICAgJCAgICJQUSAgIlsgJVAgIUkgICAgISAgICBNSDAgIE5UITwgIDpAICAgIDAgICArSSQgICsKK01OIDcgICZMICAgICQgICAiX1EgICJbUCVQICFMICAgICEgICAgUTwwICBPICE8ICA7MCAgICAwICAgLEcKK00kICArUSA3ICAmWCAgICAkICAgIy4hICA4XCAkOCAhUiAgICAhICAgIFQoMCAmLzghJiAgPiAgICAgMCAKK00gIC0sJCAgK1IgNyAgJ1ggICAgJCAgICM1ISAgIl0gJVAgIiQgICAgISAgICBVVCAwICkwJiIgICgwICAKK00gIDAgICAtSSAkICI6IUBAICI0ICAgICQgICAjPyAhICBIIDgoICBJICAgICEgICAgWSQgMCAqOCYiICAKK00rMCAgICAwICAgLj4gJCAiTCFAQCAjJCAgICAkICAgI0xAISAgTEA4KCAgVSAgICAhICAgIFxAIDAgK0AKK00mIiAgLjAgICAgMCAgIC8zICQgIl4hQEAgI1QgICAgJCAgICNZMCEgIFEgOCggISEgICAgISAgICBfRCAKK00wICxIJiIgIDEwICAgIDAgICAwJSAkICMwIUBAICREICAgICQgICAkJiAhICBVQDgoICEtICAgICEgICAKK00hIlQgMCAtUCYiICA0MCAgICAwICAgMFogJCAjQyFAQCAlNCAgICAkICAgJDIhICAiXUAlUCAiXiAgICAKK00hICAgISRcMCAmLFAhJiAgVyAgICAgMCAgIDE2JCAgK1cgNyAgLjQgICAgJCAgICQ3QSAgIl4gJVAgI04KK00gICAgISAgICEmRDAgIE9EITwgIF1AICAgIDAgICAxUSQgICtaIDcgIC9YICAgICYgICAkPlEgICAgICQKK00zX19fICAgICIgICAhKCggMCA7MCYiICAgMCAgICBEICAgMikgJCAnVCFAQCAgJCAgICAqICAgJEQgISAKK00iKCA4KCAgISAgICAjMCAgISk4IDAgQkAmIiAgIDAgICAgWCAgIDI8ICQgKFAhQEAgICQgICAgLyAgICQKK01IUCEgIl0gOCggICEgICAgIVAgICEqSDAgIEswITpfX19QICAgISAgICAyXiAkICwuIUBAICA0ICAgIDEKK00gICAkUzAhICMqIDgoICAhICAgICRAICAhLTggMCE0UCYiICAgMCAgICEsICAgMzwgJCA1MCFAQCAgJCAKK00gICAwICAgJFkgISAiXyA4KCAgIyAgICAlICAgIS5MMCAgKkAhJF9fX1AgICAhMCAgIDNWJCAgJC0gMS8KK01fX1wgICAgNSAgICReUSAgIlAgJUtfX18gICAgJSAgICEwMDAgIEtQITpfX19QICAgITAgICA0LSQgIDAKK00gIDFPX19cICAgIDQgICAlJSEgIDAgICQ7X19fICAgICUgICAhMUwwICYgKCEmX19fUCAgICEkICAgNEIKK00gJCAtViFAQCAgNCAgICAxICAgJSowISAjMUA4KCAgIyAgICAlQCAgITMgIDAhQUgmIiAgIiAgICAhPCAKK00gIDRVICQgOVAhQEAgICQgICAgMSAgICUvICEgJDUgOCggICkgICAgJDAgICE0NCAwIFxAJiIgICFQICAKK00gIUAgICA1LSAkIDlYIUBAICAkICAgIDEgICAlNSAhICRGQDgoICArICAgICQwICAhNVAgMCEzOCYiICAKK00jUCAgICFEICAgNUUgJCA6IyFAQCAgLCAgICAxICAgJTwwISAkVzA4KCAgLSAgICAlQCAgITdIIDAhNTAKK00mIiAgIUAgICAhSCAgIDYhICQgOighQEAgICQgICAgNSAgICVCMSAgIyFQJVNfX18gICAgJTAgICE4XDAKK00gIFBAITxfX19QICAgITQgICA2NiQgICwpIDcvX19cICAgIDUgICAlRzEgICMiQCVTX19fICAgICUwICAKK00hOjAwICBQTCE8X19fUCAgICE0ICAgNkskICAsLCA3L19fXCAgICA1ICAgJUxBICAjIzAlU19fXyAgICAKK00lMCAgITtEMCAgUFghPF9fX1AgICAhNCAgIDcgJCAgLC8gNy9fX1wgICAgNSAgICVSISAgIyQgJVNfX18KK00gICAgJTAgICE8XDAgIFEkITxfX19QICAgITQgICA3NCQgICshIDZPX19cICAgIDsgICAlWVAhICZIIDgKK00oICAhICAgICZQICAhPlQgMCFKUCYiICAhICAgICE4ICAgN1IgJCA4SiFAQCAgSCAgICA5ICAgJV5AISAKK00mQCA4KCAgISAgICAnICAgIUAsIDAhS1AmIiAgIDAgICAhTCAgIDgqJCAiRzAhMU9fX1wgICAgOyAgICYKK0kjQSAgIkggJDNfX18gICAgJlAgICFBODAgIEokISRfX19QICBfX1wgICA4PiQgIkcwITFPX19cOworIAorZW5kCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL21pcHNfcHJvLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL21pcHNfcHJvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkMTg4NAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbWlwc19wcm8uYwpAQCAtMCwwICsxLDM1IEBACisvKiBUZXN0cyByZWdhcmRpbmcgZXhhbWluYXRpb24gb2YgcHJvbG9ndWVzLiAgKi8KKworaW50Citpbm5lciAoeikKKyAgICAgaW50IHo7Cit7CisgIHJldHVybiAyICogejsKK30KKworaW50CittaWRkbGUgKHgpCisgICAgIGludCB4OworeworICBpZiAoeCA9PSAwKQorICAgIHJldHVybiBpbm5lciAoNSk7CisgIGVsc2UKKyAgICByZXR1cm4gaW5uZXIgKDYpOworfQorCitpbnQKK3RvcCAoeSkKKyAgICAgaW50IHk7Cit7CisgIHJldHVybiBtaWRkbGUgKHkgKyAxKTsKK30KKworaW50CittYWluIChhcmdjLCBhcmd2KQoreworI2lmZGVmIHVzZXN0dWJzCisgIHNldF9kZWJ1Z190cmFwcygpOworICBicmVha3BvaW50KCk7CisjZW5kaWYKKyAgcmV0dXJuIHRvcCAoLTEpICsgdG9wICgxKTsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbWlwc19wcm8uZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9taXBzX3Byby5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyNDYxZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbWlwc19wcm8uZXhwCkBAIC0wLDAgKzEsNjIgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlIG1pcHNfcHJvCitzZXQgc3JjZmlsZSAke3NyY2Rpcn0vJHN1YmRpci8ke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKKyMgQ3JlYXRlIGFuZCBzb3VyY2UgdGhlIGZpbGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIKKyMgdXNlZCB0byBjb21waWxlIHRoZSB0ZXN0IGNhc2UuCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0geworICAgIHJldHVybiAtMTsKK30KKworCisjIFRoaXMgdGVzdCBtdXN0IGJlIGNvbXBpbGVkIHdpdGggLU8yIGlmIHVzaW5nIGdjYy4KKworaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geworICAgIGlmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIGFkZGl0aW9uYWxfZmxhZ3M9LU8yfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorICAgIH0KK30gZWxzZSB7CisgICAgaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCisgICAgfQorfQorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworaWYgW3J1bnRvIG1pZGRsZV0gdGhlbiB7CisgICAgIyBQUiAzMDE2CisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyAKKwlzZXR1cF94ZmFpbCAiaHBwYSotKi0qIiAibWlwcyotc2dpLWlyaXg0KiIgIm1pcHM2NCotKi1lbGYiCisgICAgfQorICAgIGdkYl90ZXN0ICJiYWNrdHJhY2UiICIjMC4qbWlkZGxlLiojMS4qdG9wLiojMi4qbWFpbi4qIgorfQorcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbWlzY2V4cHJzLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL21pc2NleHBycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZTIzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL21pc2NleHBycy5jCkBAIC0wLDAgKzEsMTY1IEBACit2b2lkIG1hcmtlcjEgKCkKK3sKKyAgICAKK30KKy8qCitzdGF0aWMgc3RydWN0IHsKKyAgICBjaGFyIGNbMTAwXTsKK30gY2JpZzsKKworCitzdGF0aWMgc3RydWN0IHsKKyAgICBpbnQgaVs4MDBdOworfSBpYmlnOworCisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGxvbmcgbFs5MDBdOworfSBsYmlnOworCitzdGF0aWMgc3RydWN0IHsKKyAgICBmbG9hdCBmWzIwMF07Cit9IGZiaWc7CisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGRvdWJsZSBkWzMwMF07Cit9IGRiaWc7CisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIHNob3J0IHNbNDAwXTsKK30gc2JpZzsqLworCisvKnN0cnVjdCB7CisgICAgbG9uZyBsWzkwMF07Cit9IGxiaWc7Ki8KKworaW50IG1haW4oKQoreworCitzdHJ1Y3QgeworICAgIGNoYXIgY1sxMDBdOworfSBjYmlnOworCisKK3N0cnVjdCB7CisgICAgaW50IGlbODAwXTsKK30gaWJpZzsKKworCitzdHJ1Y3QgeworICAgIGxvbmcgbFs5MDBdOworfSBsYmlnOworCitzdHJ1Y3QgeworICAgIGZsb2F0IGZbMjAwXTsKK30gZmJpZzsKKworc3RydWN0IHsKKyAgICBkb3VibGUgZFszMDBdOworfSBkYmlnOworCitzdHJ1Y3QgeworICAgIHNob3J0IHNbNDAwXTsKK30gc2JpZzsgCisgICAgaWJpZy5pWzEwMF0gPSA1OworICAgIGNiaWcuY1sxMDBdID0gJ0EnOworICAgIGZiaWcuZlsxMDBdID0gMTEuOTk5OTk7CisgICAgZGJpZy5kWzIwMl0gPSA5Ljk5OTk5OTk5OworICAgIHNiaWcuc1s5MF0gPSAyNTU7CisgICAgbGJpZy5sWzMzM10gPSA5OTk5OTk5OTk7CisgICAgCisgICAgI2lmZGVmIHVzZXN0dWJzCisgICAgICAgc2V0X2RlYnVnX3RyYXBzKCk7CisgICAgICAgYnJlYWtwb2ludCgpOworICAgICNlbmRpZgorICAgIG1hcmtlcjEoKTsKKyAgICByZXR1cm4gMDsKKworfQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9taXNjZXhwcnMuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9taXNjZXhwcnMuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYTI3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL21pc2NleHBycy5leHAKQEAgLTAsMCArMSwyODMgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGdkYiB0ZXN0c3VpdGUKKyMgZmlsZSB3cml0dGVuIGJ5IEVsZW5hIFphbm5vbmkgKGV6YW5ub25pQGN5Z251cy5jb20pCisKKyMKKyMgdGVzdHMgZm9yIGV4cHJlc3Npb25zIHdpdGggc3RydWN0L2FycmF5IGVsZW1lbnRzIGFuZCBtaXhlZCBvcGVyYXRvciB0eXBlcworIyB3aXRoIGVsZW1lbnRhcnkgdHlwZXMKKyMgCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgICAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKKyAgICAgICAgfQorCisjCisjIHRlc3QgcnVubmluZyBwcm9ncmFtcworIworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAibWlzY2V4cHJzIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIGFkZGl0aW9uYWxfZmxhZ3M9LXd9XSAhPSAiIiB9IHsKKyAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworCisjCisjIHNldCBpdCB1cCBhdCBhIGJyZWFrcG9pbnQgc28gd2UgY2FuIHBsYXkgd2l0aCB0aGUgdmFyaWFibGUgdmFsdWVzCisjCitpZiAhW3J1bnRvX21haW5dIHRoZW4geworICAgIHBlcnJvciAiY291bGRuJ3QgcnVuIHRvIGJyZWFrcG9pbnQiCisgICAgY29udGludWUKK30KKworc2VuZF9nZGIgImJyZWFrIG1hcmtlcjFcbiIgOyBnZGJfZXhwZWN0IC1yZSAiLiokZ2RiX3Byb21wdCAkIgorCisgICAgc2VuZF9nZGIgImNvbnRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJCcmVhay4qIG1hcmtlcjEgXFwoXFwpIGF0IC4qOiRkZWNpbWFsLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBzZW5kX2dkYiAidXBcbiIKKyAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorICAgICAgICAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJ1cCBmcm9tIG1hcmtlcjEiIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29udGludWUgdG8gbWFya2VyMSIgIH0KKyAgICAgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb250aW51ZSB0byBtYXJrZXIxIiAgfQorICAgIH0KKworZ2xvYmFsIGhleAorCitzZW5kX2dkYiAicHJpbnQgJmliaWcuaVxbMFxdXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IFxcKGludCBcXCpcXCkgJGhleC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAmaWJpZy5pXFswXF0iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgJmliaWcuaVxbMFxdIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgJmliaWcuaVxbMFxdIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50ICZjYmlnLmNcWzBcXVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAkaGV4IFwiXCIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgJmNiaWcuY1xbMFxdIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICZjYmlnLmNcWzBcXSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mICZjYmlnLmNcWzBcXSIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCAmZmJpZy5mXFswXF1cbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gXFwoZmxvYXQgXFwqXFwpICRoZXguKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgJmZiaWcuZlxbMFxdIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICZmYmlnLmZcWzBcXSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mICZmYmlnLmZcWzBcXSIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCAmZGJpZy5kXFswXF1cbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gXFwoZG91YmxlIFxcKlxcKSAkaGV4LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICZkYmlnLmRcWzBcXSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAmZGJpZy5kXFswXF0iIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAmZGJpZy5kXFswXF0iIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgJnNiaWcuc1xbMFxdXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IFxcKHNob3J0IGludCBcXCpcXCkgJGhleC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAmc2JpZy5zXFswXF0iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgJnNiaWcuc1xbMFxdIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgJnNiaWcuc1xbMFxdIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50ICZsYmlnLmxcWzBcXVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSBcXChsb25nIGludCBcXCpcXCkgJGhleC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAmbGJpZy5sXFswXF0iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgJmxiaWcubFxbMFxdIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgJmxiaWcubFxbMFxdIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgaWJpZy5pXFsxMDBcXSB8IDFcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gNS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBpYmlnLmlcWzEwMFxdIHwgMSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiBpYmlnLmlcWzEwMFxdIHwgMSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIGliaWcuaVxbMTAwXF0gfCAxIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgc2JpZy5zXFs5MFxdICYgMTI3XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDEyNy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBzYmlnLnNcWzkwXF0gJiAxMjciCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2Ygc2JpZy5zXFs5MFxdICYgMTI3IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2Ygc2JpZy5zXFs5MFxdICYgMTI3IiB9CisgIH0KKworc2VuZF9nZGIgInByaW50ICFpYmlnLmlcWzEwMFxdXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgIWliaWcuaVxbMTAwXF0iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgIWliaWcuaVxbMTAwXF0iIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAhaWJpZy5pXFsxMDBcXSIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCAhc2JpZy5zXFs5MFxdXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgIXNiaWcuc1xbOTBcXSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAhc2JpZy5zXFs5MFxdIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgIXNiaWcuc1xbOTBcXSIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50ICFmYmlnLmZcWzEwMFxdXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgIWliaWcuaVxbMTAwXF0iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgIWliaWcuaVxbMTAwXF0iIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAhaWJpZy5pXFsxMDBcXSIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCAhZGJpZy5kXFsyMDJcXVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAwLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICFpYmlnLmlcWzEwMFxdIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICFpYmlnLmlcWzEwMFxdIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgIWliaWcuaVxbMTAwXF0iIH0KKyAgfQorCisKKworc2VuZF9nZGIgInByaW50IHNiaWcuc1xbOTBcXSAqIDEwXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDI1NTAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgIXNiaWcuc1xbOTBcXSAqIDEwIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICFzYmlnLnNcWzkwXF0gKiAxMCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mICFzYmlnLnNcWzkwXF0gKiAxMCIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBpYmlnLmlcWzEwMFxdICogc2JpZy5zXFs5MFxdXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDEyNzUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgaWJpZy5pXFsxMDBcXSAqIHNiaWcuc1xbOTBcXSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiBpYmlnLmlcWzEwMFxdICogc2JpZy5zXFs5MFxdIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgaWJpZy5pXFsxMDBcXSAqIHNiaWcuc1xbOTBcXSIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBmYmlnLmZcWzEwMFxdICogZGJpZy5kXFsyMDJcXVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAxMTkuOTlcWzAtOVxdKi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBmYmlnLmZcWzEwMFxdICogZGJpZy5kXFsyMDJcXSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiBmYmlnLmZcWzEwMFxdICogZGJpZy5kXFsyMDJcXSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIGZiaWcuZlxbMTAwXF0gKiBkYmlnLmRcWzIwMlxdIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50ICEoc2JpZy5zXFs5MFxdICogMilcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAhKHNiaWcuc1xbOTBcXSAqIDIpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICEoc2JpZy5zXFs5MFxdICogMikiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAhKHNiaWcuc1xbOTBcXSAqIDIpIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgc2l6ZW9mKHNiaWcpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDgwMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBzaXplb2Yoc2JpZykiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2Ygc2l6ZW9mKHNiaWcpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2Ygc2l6ZW9mKHNiaWcpIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgc2l6ZW9mKGNiaWcpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDEwMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBzaXplb2YoY2JpZykiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2Ygc2l6ZW9mKGNiaWcpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2Ygc2l6ZW9mKGNiaWcpIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgc2l6ZW9mKGxiaWcpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDM2MDAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygc2l6ZW9mKGxiaWcpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHNpemVvZihsYmlnKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHNpemVvZihsYmlnKSIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBpYmlnLmlcWzEwMFxdIDw8IDJcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMjAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgaWJpZy5pXFsxMDBcXSA8PCAyIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIGliaWcuaVxbMTAwXF0gPDwgMiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIGliaWcuaVxbMTAwXF0gPDwgMiIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBzYmlnLnNcWzkwXF0gPj4gNFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAxNS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBzYmlnLnNcWzkwXF0gPj4gNCIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiBzYmlnLnNcWzkwXF0gPj4gNCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHNiaWcuc1xbOTBcXSA+PiA0IiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IGxiaWcubFxbMzMzXF0gPj4gNlxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAxNTYyNDk5OS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBsYmlnLmxcWzMzM1xdID4+IDYiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgbGJpZy5sXFszMzNcXSA+PiA2IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgbGJpZy5sXFszMzNcXSA+PiA2IiB9CisgIH0KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvbm9kZWJ1Zy5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9ub2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhZDA5OQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvbm9kZWJ1Zy5jCkBAIC0wLDAgKzEsNTggQEAKKy8qIFRlc3QgdGhhdCB0aGluZ3Mgc3RpbGwgKHNvcnQgb2YpIHdvcmsgd2hlbiBjb21waWxlZCB3aXRob3V0IC1nLiAgKi8KKworaW50IGRhdGFnbG9iYWwgPSAzOwkJCS8qIFNob3VsZCBnbyBpbiBnbG9iYWwgZGF0YSAqLworc3RhdGljIGludCBkYXRhbG9jYWwgPSA0OwkJLyogU2hvdWxkIGdvIGluIGxvY2FsIGRhdGEgKi8KK2ludCBic3NnbG9iYWw7CQkJCS8qIFNob3VsZCBnbyBpbiBnbG9iYWwgYnNzICovCitzdGF0aWMgaW50IGJzc2xvY2FsOwkJCS8qIFNob3VsZCBnbyBpbiBsb2NhbCBic3MgKi8KKworaW50Citpbm5lciAoeCkKKyAgICAgaW50IHg7Cit7CisgIHJldHVybiB4ICsgZGF0YWdsb2JhbCArIGRhdGFsb2NhbCArIGJzc2dsb2JhbCArIGJzc2xvY2FsOworfQorCitzdGF0aWMgc2hvcnQKK21pZGRsZSAoeCkKKyAgICAgaW50IHg7Cit7CisgIHJldHVybiAyICogaW5uZXIgKHgpOworfQorCitzaG9ydAordG9wICh4KQorICAgICBpbnQgeDsKK3sKKyAgcmV0dXJuIDIgKiBtaWRkbGUgKHgpOworfQorCitpbnQgCittYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisjaWZkZWYgdXNlc3R1YnMKKyAgc2V0X2RlYnVnX3RyYXBzKCk7CisgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICByZXR1cm4gdG9wIChhcmdjKTsKK30KKworY2hhciAqbWFsbG9jICgpOworCitpbnQgKng7CisKK2ludAorYXJyYXlfaW5kZXggKGFyciwgaSkKKyAgICAgY2hhciAqYXJyOworICAgICBpbnQgaTsKK3sKKyAgLyogVGhlIGJhc2ljIGNvbmNlcHQgaXMganVzdCAicmV0dXJuIGFycltpXTsiLiAgQnV0IGNhbGwgbWFsbG9jIHNvIHRoYXQgZ2RiCisgICAgIHdpbGwgYmUgYWJsZSB0byBjYWxsIGZ1bmN0aW9ucy4gICovCisgIGNoYXIgcmV0dmFsOworICB4ID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSk7CisgICp4ID0gaTsKKyAgcmV0dmFsID0gYXJyWyp4XTsKKyAgZnJlZSAoeCk7CisgIHJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL25vZGVidWcuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9ub2RlYnVnLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGY4YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9ub2RlYnVnLmV4cApAQCAtMCwwICsxLDE2MyBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUZXN0IHRoYXQgdGhpbmdzIHN0aWxsIChzb3J0IG9mKSB3b3JrIHdoZW4gY29tcGlsZWQgd2l0aG91dCAtZy4KKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgbm9kZWJ1Zworc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQoraWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlICIiXSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKKyMgQ3JlYXRlIGFuZCBzb3VyY2UgdGhlIGZpbGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIKKyMgdXNlZCB0byBjb21waWxlIHRoZSB0ZXN0IGNhc2UuCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0geworICAgIHJldHVybiAtMTsKK30KKworc291cmNlICR7YmluZmlsZX0uY2kKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAkYmluZmlsZQorCitpZiBbcnVudG8gaW5uZXJdIHRoZW4geworICAgIAorICAgICMgRXhwZWN0IHRvIGZpbmQgZ2xvYmFsL2xvY2FsIHN5bWJvbHMgaW4gZWFjaCBvZiB0ZXh0L2RhdGEvYnNzLgorICAgIAorICAgICMgVGhlIGV4YWN0IGZvcm1hdCBmb3Igc29tZSBvZiB0aGlzIG91dHB1dCBpcyBub3QgbmVjZXNzYXJpbHkKKyAgICAjIGlkZWFsLCBwYXJ0aWN1bGFybHkgaW50ZXJwcmV0aW5nICJwIHRvcCIgcmVxdWlyZXMgYSBmYWlyIGJpdCBvZgorICAgICMgc2F2dnkgYWJvdXQgZ2RiJ3Mgd29ya2luZ3MgYW5kIHRoZSBtZWFuaW5nIG9mIHRoZSAie30iCisgICAgIyBjb25zdHJ1Y3QuICBTbyB0aGUgZGV0YWlscyBtYXliZSBjb3VsZCBiZSB0d2Vha2VkLiAgQnV0IHRoZQorICAgICMgYmFzaWMgcHVycG9zZSBzaG91bGQgYmUgbWFpbnRhaW5lZCwgd2hpY2ggaXMgKGEpIHVzZXJzIHNob3VsZCBiZQorICAgICMgYWJsZSB0byBpbnRlcmFjdCB3aXRoIHRoZXNlIHZhcmlhYmxlcyB3aXRoIHNvbWUgY2FyZSAodGhleSBoYXZlCisgICAgIyB0byBrbm93IGhvdyB0byBpbnRlcnByZXQgdGhlbSBhY2NvcmRpbmcgdG8gdGhlaXIgcmVhbCB0eXBlLAorICAgICMgc2luY2UgZ2RiIGRvZXNuJ3Qga25vdyB0aGUgdHlwZSksIGJ1dCAoYikgdXNlcnMgc2hvdWxkIGJlIGFibGUKKyAgICAjIHRvIGRldGVjdCB0aGF0IGdkYiBkb2VzIG5vdCBrbm93IHRoZSB0eXBlLCByYXRoZXIgdGhhbiBqdXN0CisgICAgIyBiZWluZyB0b2xkIHRoZXkgYXJlIGludHMgb3IgZnVuY3Rpb25zIHJldHVybmluZyBpbnQgbGlrZSBvbGQKKyAgICAjIHZlcnNpb25zIG9mIGdkYiB1c2VkIHRvIGRvLgorICAgIAorICAgICMgT24gYWxwaGEgKGFuZCBvdGhlciBlY29mZiBzeXN0ZW1zKSB0aGUgbmF0aXZlIGNvbXBpbGVycyBwdXQKKyAgICAjIG91dCBkZWJ1Z2dpbmcgaW5mbyBmb3Igbm9uLWFnZ3JlZ2F0ZSByZXR1cm4gdmFsdWVzIG9mIGZ1bmN0aW9ucworICAgICMgZXZlbiB3aXRob3V0IC1nLCB3aGljaCBzaG91bGQgYmUgYWNjZXB0ZWQuCisgICAgIyBJcml4NSwgZXZlbiB0aG91Z2ggaXQgaXMgRUxGLCBjb3VudHMgYXMgImVjb2ZmIiBiZWNhdXNlIGl0CisgICAgIyBlbmNhcHN1bGF0ZXMgZWNvZmYgZGVidWdnaW5nIGluZm8gaW4gYSAubWRlYnVnIHNlY3Rpb24uCisgICAgIyBJcml4NiBnY2Mgb21pdHMgbm8gZGVidWcgaW5mbyBhdCBhbGwgZm9yIHN0YXRpYyBmdW5jdGlvbnMgYW5kCisgICAgIyB2YXJpYWJsZXMsIHNvIGFsbCB0ZXN0cyBpbnZvbHZpbmcgc3RhdGljcyBmYWlsLgorICAgIAorICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJtaXBzLXNnaS1pcml4NSoiICJtaXBzLXNnaS1pcml4NioiIH0KKyAgICBnZGJfdGVzdCAicCB0b3AiIFwKKwkieyg8KHRleHQgdmFyaWFibGV8ZnVuY3Rpb24pLCBubyBkZWJ1ZyBpbmZvPnxzaG9ydCBcXChcXCkpfSBcWzAtOWEtZnhdKiA8dG9wPiIKKyAgICBpZiB7ISRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAibWlwcy1zZ2ktaXJpeDUqIiAibWlwcy1zZ2ktaXJpeDYqIiB9CisgICAgZ2RiX3Rlc3QgIndoYXRpcyB0b3AiIFwKKwkiKDwodGV4dCB2YXJpYWJsZXxmdW5jdGlvbiksIG5vIGRlYnVnIGluZm8+fHNob3J0IFxcKFxcKSkiCisgICAgaWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIm1pcHMtc2dpLWlyaXg2KiIgfQorICAgIGdkYl90ZXN0ICJwdHlwZSB0b3AiICIoc2hvcnR8aW50KSBcXCgofDxub24tZmxvYXQgcGFyYW1ldGVyPnw8bm9uLWZsb2F0IHBhcmFtZXRlcj4sIDxub24tZmxvYXQgcGFyYW1ldGVyPilcXCkiCisgICAgCisgICAgaWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIm1pcHMtc2dpLWlyaXg1KiIgfQorICAgIHNldHVwX3hmYWlsICJtaXBzLXNnaS1pcml4NioiCisgICAgZ2RiX3Rlc3QgInAgbWlkZGxlIiBcCisJInsoPCh0ZXh0IHZhcmlhYmxlfGZ1bmN0aW9uKSwgbm8gZGVidWcgaW5mbz58c2hvcnQgXFwoXFwpKX0gXFswLTlhLWZ4XSogPG1pZGRsZT4iCisgICAgaWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIm1pcHMtc2dpLWlyaXg1KiIgfQorICAgIHNldHVwX3hmYWlsICJtaXBzLXNnaS1pcml4NioiCisgICAgZ2RiX3Rlc3QgIndoYXRpcyBtaWRkbGUiIFwKKwkiKDwodGV4dCB2YXJpYWJsZXxmdW5jdGlvbiksIG5vIGRlYnVnIGluZm8+fHNob3J0IFxcKFxcKSkiCisgICAgc2V0dXBfeGZhaWwgIm1pcHMtc2dpLWlyaXg2KiIKKyAgICBnZGJfdGVzdCAicHR5cGUgbWlkZGxlIiAiKHNob3J0fGludCkgXFwoKHw8bm9uLWZsb2F0IHBhcmFtZXRlcj58PG5vbi1mbG9hdCBwYXJhbWV0ZXI+LCA8bm9uLWZsb2F0IHBhcmFtZXRlcj4pXFwpIgorICAgIAorICAgIGdkYl90ZXN0ICJwIGRhdGFnbG9iYWwiICI9IDMiCisgICAgZ2RiX3Rlc3QgIndoYXRpcyBkYXRhZ2xvYmFsIiBcCisJIjwoZGF0YSB2YXJpYWJsZXx2YXJpYWJsZSksIG5vIGRlYnVnIGluZm8+IgorICAgIGdkYl90ZXN0ICJwdHlwZSBkYXRhZ2xvYmFsIiAiPChkYXRhIHZhcmlhYmxlfHZhcmlhYmxlKSwgbm8gZGVidWcgaW5mbz4iCisgICAgCisgICAgIyBUaGUgb25seSBzeW1ib2wgeGNvZmYgcHV0cyBvdXQgZm9yIHN0YXRpY3MgaXMgZm9yIHRoZSBUT0MgZW50cnkuCisgICAgIyBQb3NzaWJsZSwgYnV0IGhhaXJ5LCBmb3IgZ2RiIHRvIGRlYWwuICBSaWdodCBub3cgaXQgZG9lc24ndCwgaXQKKyAgICAjIGRvZXNuJ3Qga25vdyB0aGUgdmFyaWFibGVzIGV4aXN0IGF0IGFsbC4KKyAgICBzZXR1cF94ZmFpbCAicnM2MDAwKi0qLWFpeCoiCisgICAgc2V0dXBfeGZhaWwgInBvd2VycGMqLSotYWl4KiIKKyAgICBpZiB7ISRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiaHBwYSotKi1ocHV4KiIgfQorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIm1pcHMtc2dpLWlyaXg2KiIgfQorICAgIGdkYl90ZXN0ICJwIGRhdGFsb2NhbCIgIj0gNCIKKyAgICBzZXR1cF94ZmFpbCAicnM2MDAwKi0qLWFpeCoiCisgICAgc2V0dXBfeGZhaWwgInBvd2VycGMqLSotYWl4KiIKKyAgICBpZiB7ISRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiaHBwYSotKi1ocHV4KiIgfQorICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIm1pcHMtc2dpLWlyaXg2KiIgfQorICAgIGdkYl90ZXN0ICJ3aGF0aXMgZGF0YWxvY2FsIiAiPChkYXRhIHZhcmlhYmxlfHZhcmlhYmxlKSwgbm8gZGVidWcgaW5mbz4iCisgICAgc2V0dXBfeGZhaWwgInJzNjAwMCotKi1haXgqIgorICAgIHNldHVwX3hmYWlsICJwb3dlcnBjKi0qLWFpeCoiCisgICAgaWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgImhwcGEqLSotaHB1eCoiIH0KKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJtaXBzLXNnaS1pcml4NioiIH0KKyAgICBnZGJfdGVzdCAicHR5cGUgZGF0YWxvY2FsIiAiPChkYXRhIHZhcmlhYmxlfHZhcmlhYmxlKSwgbm8gZGVidWcgaW5mbz4iCisgICAgCisgICAgZ2RiX3Rlc3QgInAgYnNzZ2xvYmFsIiAiPSAwIgorICAgIGdkYl90ZXN0ICJ3aGF0aXMgYnNzZ2xvYmFsIiAiPChkYXRhIHZhcmlhYmxlfHZhcmlhYmxlKSwgbm8gZGVidWcgaW5mbz4iCisgICAgZ2RiX3Rlc3QgInB0eXBlIGJzc2dsb2JhbCIgIjwoZGF0YSB2YXJpYWJsZXx2YXJpYWJsZSksIG5vIGRlYnVnIGluZm8+IgorICAgIAorICAgIHNldHVwX3hmYWlsICJyczYwMDAqLSotYWl4KiIKKyAgICBzZXR1cF94ZmFpbCAicG93ZXJwYyotKi1haXgqIgorICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJocHBhKi0qLWhwdXgqIiB9CisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAibWlwcy1zZ2ktaXJpeDYqIiB9CisgICAgZ2RiX3Rlc3QgInAgYnNzbG9jYWwiICI9IDAiCisgICAgc2V0dXBfeGZhaWwgInJzNjAwMCotKi1haXgqIgorICAgIHNldHVwX3hmYWlsICJwb3dlcnBjKi0qLWFpeCoiCisgICAgaWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgImhwcGEqLSotaHB1eCoiIH0KKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJtaXBzLXNnaS1pcml4NioiIH0KKyAgICBnZGJfdGVzdCAid2hhdGlzIGJzc2xvY2FsIiAiPChkYXRhIHZhcmlhYmxlfHZhcmlhYmxlKSwgbm8gZGVidWcgaW5mbz4iCisgICAgc2V0dXBfeGZhaWwgInJzNjAwMCotKi1haXgqIgorICAgIHNldHVwX3hmYWlsICJwb3dlcnBjKi0qLWFpeCoiCisgICAgaWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgImhwcGEqLSotaHB1eCoiIH0KKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJtaXBzLXNnaS1pcml4NioiIH0KKyAgICBnZGJfdGVzdCAicHR5cGUgYnNzbG9jYWwiICI8KGRhdGEgdmFyaWFibGV8dmFyaWFibGUpLCBubyBkZWJ1ZyBpbmZvPiIKKyAgICAKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJtaXBzLXNnaS1pcml4NioiIH0KKyAgICBnZGJfdGVzdCAiYmFja3RyYWNlIDEwIiAiIzAuKmlubmVyLiojMS4qbWlkZGxlLiojMi4qdG9wLiojMy4qbWFpbi4qIiBcCisJImJhY2t0cmFjZSBmcm9tIGlubmVyIGluIG5vZGVidWcuZXhwIgorICAgICMgT3IgaWYgdGhhdCBkb2Vzbid0IHdvcmssIGF0IGxlYXN0IGhvcGUgZm9yIHRoZSBleHRlcm5hbCBzeW1ib2xzCisgICAgIyBDb21tZW50ZWQgb3V0IGJlY2F1c2UgaWYgd2UgYXJlbid0IGdvaW5nIHRvIHhmYWlsIHRoZSBhYm92ZSB0ZXN0CisgICAgIyBldmVyLCB3aHkgYm90aGVyIHdpdGggYSB3ZWFrZXIgdGVzdD8KKyAgICAjZ2RiX3Rlc3QgImJhY2t0cmFjZSAxMCIgIiMwLippbm5lci4qIzEuKiMyLip0b3AuKiMzLiptYWluLioiIFwKKwkjICAgICJiYWNrdHJhY2UgZnJvbSBpbm5lciBpbiBub2RlYnVnLmV4cCBmb3IgZXh0ZXJuYWxzIgorICAgIAorICAgICMgVGhpcyB0ZXN0IGlzIG5vdCBhcyBvYnNjdXJlIGFzIGl0IG1pZ2h0IGxvb2suICBgcCBnZXRlbnYgKCJURVJNIiknCisgICAgIyBpcyBhIHJlYWwtd29ybGQgZXhhbXBsZSwgYXQgbGVhc3Qgb24gbWFueSBzeXN0ZW1zLgorICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJocHBhKi0qLWhwdXgqIiAibWlwcy1zZ2ktaXJpeDYqIiB9CisgICAgaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGIsY2Fubm90X2NhbGxfZnVuY3Rpb25zXSB7CisJc2V0dXBfeGZhaWwgIiotKi0qIiAyNDE2CisJZmFpbCAicC9jIGFycmF5X2luZGV4KFwiYWJjZGVmXCIsMikiCisgICAgfSBlbHNlIHsKKwlnZGJfdGVzdCB7cC9jIGFycmF5X2luZGV4KCJhYmNkZWYiLDIpfSAiID0gOTkgJ2MnIgorICAgIH0KKyAgICAKKyAgICAjIE5vdywgdHJ5IHRoYXQgd2UgY2FuIGdpdmUgbmFtZXMgb2YgZmlsZS1sb2NhbCBzeW1ib2xzIHdoaWNoIGhhcHBlbgorICAgICMgdG8gYmUgdW5pcXVlLCBhbmQgaGF2ZSBpdCBzdGlsbCB3b3JrCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAibWlwcy1zZ2ktaXJpeDYqIiB9CisgICAgaWYgW3J1bnRvIG1pZGRsZV0gdGhlbiB7CisJZ2RiX3Rlc3QgImJhY2t0cmFjZSAxMCIgIiMwLiptaWRkbGUuKiMxLip0b3AuKiMyLiptYWluLioiIFwKKwkgICAgImJhY2t0cmFjZSBmcm9tIG1pZGRsZSBpbiBub2RlYnVnLmV4cCIKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL29wYXF1ZS5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL29wYXF1ZS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJlNjQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvb3BhcXVlLmV4cApAQCAtMCwwICsxLDI0NCBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEZyZWQgRmlzaC4gKGZuZkBjeWdudXMuY29tKQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAib3BhcXVlIgorc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS9vcGFxdWUKKworI2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS9vcGFxdWUwLmMgJHtzcmNkaXJ9LyR7c3ViZGlyfS9vcGFxdWUxLmMiICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworIyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCisjfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vb3BhcXVlMC5jIiAiJHtiaW5maWxlfTAubyIgb2JqZWN0IHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9L29wYXF1ZTEuYyIgIiR7YmluZmlsZX0xLm8iIG9iamVjdCB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtiaW5maWxlfTAubyAke2JpbmZpbGV9MS5vIiAke2JpbmZpbGV9IGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisKKyMgQ3JlYXRlIGFuZCBzb3VyY2UgdGhlIGZpbGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIKKyMgdXNlZCB0byBjb21waWxlIHRoZSB0ZXN0IGNhc2UuCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0geworICAgIHJldHVybiAtMTsKK30KKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworIworIyBUZXN0IGJhc2ljIG9wYXF1ZSBzdHJ1Y3R1cmUgaGFuZGxpbmcgKHN0YXRpY2FsbHkpLgorIyBUaGUgb3JkZXJpbmcgb2YgdGhlIHRlc3RzIGlzIHNpZ25pZmljYW50LiAgV2UgZmlyc3QgdHJ5IHRoZSB0aGluZ3MgdGhhdAorIyBtaWdodCBmYWlsIGlmIGdkYiBmYWlscyB0byBjb25uZWN0IHRoZSB1c2VzIG9mIG9wYXF1ZSBzdHJ1Y3R1cmVzIHRvCisjIHRoZSBhY3R1YWwgb3BhcXVlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorCisjIFdoZW4gd2Ugc3RhcnQgdXAsIGdkYiBzZXRzIHRoZSBmaWxlIGNvbnRhaW5pbmcgbWFpbigpIGFzIHRoZSBjdXJyZW50CisjIHNvdXJjZSBmaWxlLiAgVGhlIGFjdHVhbCBzdHJ1Y3R1cmUgZm9vIGlzIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgZmlsZS4KKyMgQSBwb2ludGVyIChmb29wKSB0byBhbiBpbnN0YW5jZSBvZiB0aGUgb3BhcXVlIHN0cnVjdCBpcyBkZWZpbmVkIGluIHRoZSBzYW1lCisjIHNvdXJjZSBmaWxlIGFzIG1haW4oKS4gIEVuc3VyZSB0aGF0IGdkYiBjb3JyZWN0bHkgImNvbm5lY3RlZCIgdGhlIGRlZmluaXRpb24KKyMgaW4gdGhlIG90aGVyIGZpbGUgd2l0aCB0aGUgcG9pbnRlciB0byB0aGUgb3BhcXVlIHN0cnVjdCBpbiB0aGUgZmlsZSBjb250YWluaW5nCisjICJmb29wIi4KKworIyBEZWZpbmUgYSBwcm9jZWR1cmUgdG8gc2V0IHVwIGFuIHhmYWlsIGZvciBhbGwgdGFyZ2V0cyB0aGF0IGRvIG5vdCBzdXBwb3J0CisjIHRoaXMgc29ydCBvZiBjcm9zcyByZWZlcmVuY2UuCisjIEFueSB0YXJnZXQgZ2NjIHRoYXQgaGFzIGEgREJYX05PX1hSRUZTIGRlZmluaXRpb24gaW4gaXRzIGNvbmZpZyBmaWxlIHdpbGwKKyMgbm90IHN1cHBvcnQgaXQgKEZJWE1FOiBJcyB0aGlzIHN0aWxsIHRydWU7IEkgc3VzcGVjdCBtYXliZSBub3QpLgorCisjIE5hdGl2ZSBhbHBoYSBlY29mZiBkb2Vzbid0IHN1cHBvcnQgaXQgZWl0aGVyLgorIyBJIGRvbid0IHRoaW5rIHRoaXMgdHlwZSBvZiBjcm9zcyByZWZlcmVuY2Ugd29ya3MgZm9yIGFueSBDT0ZGIHRhcmdldAorIyBlaXRoZXIuCisKK3Byb2Mgc2V0dXBfeGZhaWxfb25fb3BhcXVlX3BvaW50ZXIge30geworCWdsb2JhbCBnY2NfY29tcGlsZWQKKworCXNldHVwX3hmYWlsICJhMjlrLSotdWRpIiAidmF4LSotKiIgImkqODYtc2VxdWVudC1ic2QqIgorCWlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7CisJCXNldHVwX3hmYWlsICJhbHBoYS0qLSoiICJtaXBzLXNnaS1pcml4NSoiCisJfQorfQorCisjIFRoaXMgc2VlbXMgZWFzaWVyIHRoYW4gdHJ5aW5nIHRvIHRyYWNrIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB4bGM7IEknbQorIyBub3Qgc3VyZSB0aGVyZSBpcyBtdWNoIHJoeW1lIG9yIHJlYXNvbiByZWdhcmRpbmcgd2hpY2ggdGVzdHMgaXQgZmFpbHMKKyMgYW5kIHdoaWNoIG9uZXMgaXQgcGFzc2VzLgoraWYge1tpc3RhcmdldCAicnM2MDAwLSotYWl4KiJdICYmICEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsKKyAgICB3YXJuaW5nICJ4ZmFpbHMgaW4gb3BhcXVlLmV4cCBtYXkgbm90IGJlIHNldCB1cCBjb3JyZWN0bHkgZm9yIHhsYyIKK30KKworc2V0dXBfeGZhaWxfb25fb3BhcXVlX3BvaW50ZXIKK2dkYl90ZXN0ICJ3aGF0aXMgZm9vcCIgXAorICAgICJ0eXBlID0gc3RydWN0IGZvbyBcWypcXSsiIFwKKyAgICAid2hhdGlzIG9uIG9wYXF1ZSBzdHJ1Y3QgcG9pbnRlciAoc3RhdGljYWxseSkiCisKKworIyBFbnN1cmUgdGhhdCB3ZSBrbm93IHRoZSBmb3JtIG9mIHRoZSBzdHJ1Y3R1cmUgdGhhdCBmb29wIHBvaW50cyB0by4KKworc2V0dXBfeGZhaWxfb25fb3BhcXVlX3BvaW50ZXIKK2lmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiAiaHBwYSotKi1ocHV4KiIgfQorZ2RiX3Rlc3QgInB0eXBlIGZvb3AiIFwKKyAgICAidHlwZSA9IHN0cnVjdCBmb28gXHtcW1xyXG5cXSsgICAgaW50IGE7XFtcclxuXF0rICAgIGludCBiO1xbXHJcblxdK1x9IFxbKlxdKyIgXAorICAgICJwdHlwZSBvbiBvcGFxdWUgc3RydWN0IHBvaW50ZXIgKHN0YXRpY2FsbHkpIgorCisKKyMgQW4gaW5zdGFuY2Ugb2YgdGhlIG9wYXF1ZSBzdHJ1Y3R1cmUgKGFmb28pIGlzIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgZmlsZS4KKyMgRW5zdXJlIHRoYXQgd2UgY2FuIGxvY2F0ZSBhZm9vIGFuZCB0aGUgc3RydWN0dXJlIGRlZmluaXRpb24uCisKK2dkYl90ZXN0ICJ3aGF0aXMgYWZvbyIgXAorICAgICJ0eXBlID0gc3RydWN0IGZvbyIgXAorICAgICJ3aGF0aXMgb24gb3BhcXVlIHN0cnVjdCBpbnN0YW5jZSAoc3RhdGljYWxseSkiCisKKworIyBFbnN1cmUgdGhhdCB3ZSBrbm93IHRoZSBmb3JtIG9mICJhZm9vIi4KKworZ2RiX3Rlc3QgInB0eXBlIGFmb28iIFwKKyAgICAidHlwZSA9IHN0cnVjdCBmb28gXHtcW1xyXG5cXSsgICAgaW50IGE7XFtcclxuXF0rICAgIGludCBiO1xbXHJcblxdK1x9IiBcCisgICAgInB0eXBlIG9uIG9wYXF1ZSBzdHJ1Y3QgaW5zdGFuY2UgKHN0YXRpY2FsbHkpIgorCisKKyMgRW5zdXJlIHRoYXQgd2Uga25vdyB3aGF0IGEgc3RydWN0IGZvbyBsb29rcyBsaWtlLgorCitnZGJfdGVzdCAicHR5cGUgc3RydWN0IGZvbyIgXAorICAgICJ0eXBlID0gc3RydWN0IGZvbyBce1xbXHJcblxdKyAgICBpbnQgYTtcW1xyXG5cXSsgICAgaW50IGI7XFtcclxuXF0rXH0iIFwKKyAgICAicHR5cGUgb24gb3BhcXVlIHN0cnVjdCB0YWduYW1lIChzdGF0aWNhbGx5KSIKKworCisjCisjIERvbmUgd2l0aCBzdGF0aWMgdGVzdHMsIG5vdyB0ZXN0IGR5bmFtaWMgb3BhcXVlIHN0cnVjdHVyZSBoYW5kbGluZy4KKyMgV2UgcmVsb2FkIHRoZSBzeW1ib2wgdGFibGUgc28gd2UgZm9yZ2V0IGFib3V0IGFueXRoaW5nIHdlIG1pZ2h0CisjIGhhdmUgbGVhcm5lZCBkdXJpbmcgdGhlIHN0YXRpYyB0ZXN0cy4KKyMKKworaWYgW2lzdGFyZ2V0ICJtaXBzLWlkdC0qIl0gdGhlbiB7CisgICAgIyBSZXN0YXJ0IGJlY2F1c2UgSURUL1NJTSBydW5zIG91dCBvZiBmaWxlIGRlc2NyaXB0b3JzLgorICAgIGdkYl9leGl0CisgICAgZ2RiX3N0YXJ0Cit9CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworIyBSdW4gdG8gbWFpbiwgd2hlcmUgc3RydWN0IGZvbyBpcyBpbmNvbXBsZXRlLgoraWYgIVtydW50b19tYWluXSB7CisgICAgcGVycm9yICJjYW5ub3QgcnVuIHRvIGJyZWFrcG9pbnQgYXQgbWFpbiIKK30KKworCisjIFRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIGlzIG5vdyB0aGUgb25lIGNvbnRhaW5pbmcgbWFpbigpLiAgVGhlIHN0cnVjdHVyZSBmb28KKyMgaXMgZGVmaW5lZCBpbiBhIGRpZmZlcmVudCBmaWxlLCBidXQgd2UgaGF2ZSBhIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2Ugb2YKKyMgdGhlIG9wYXF1ZSBzdHJ1Y3R1cmUgaW4gdGhlIGN1cnJlbnQgZmlsZS4gIEVuc3VyZSB3ZSBrbm93IGl0J3MgdHlwZS4KKworc2V0dXBfeGZhaWxfb25fb3BhcXVlX3BvaW50ZXIKK2dkYl90ZXN0ICJ3aGF0aXMgZm9vcCIgXAorICAgICJ0eXBlID0gc3RydWN0IGZvbyBcWypcXSsiIFwKKyAgICAid2hhdGlzIG9uIG9wYXF1ZSBzdHJ1Y3QgcG9pbnRlciAoZHluYW1pY2FsbHkpIgorCisKKyMgRW5zdXJlIHRoYXQgd2Uga25vdyB0aGUgZm9ybSBvZiB0aGUgdGhpbmcgZm9vcCBwb2ludHMgdG8uCisKK3NldHVwX3hmYWlsX29uX29wYXF1ZV9wb2ludGVyCitpZiB7ISRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAicnM2MDAwLSotKiIgImhwcGEqLSotaHB1eCoiIH0KK2dkYl90ZXN0ICJwdHlwZSBmb29wIiBcCisgICAgInR5cGUgPSBzdHJ1Y3QgZm9vIFx7XFtcclxuXF0rICAgIGludCBhO1xbXHJcblxdKyAgICBpbnQgYjtcW1xyXG5cXStcfSBcWypcXSsiIFwKKyAgICAicHR5cGUgb24gb3BhcXVlIHN0cnVjdCBwb2ludGVyIChkeW5hbWljYWxseSkgMSIKKworZ2RiX3Rlc3QgIndoYXRpcyBhZm9vIiBcCisgICAgInR5cGUgPSBzdHJ1Y3QgZm9vIiBcCisgICAgIndoYXRpcyBvbiBvcGFxdWUgc3RydWN0IGluc3RhbmNlIChkeW5hbWljYWxseSkgMSIKKworCisjIEVuc3VyZSB0aGF0IHdlIGtub3cgdGhlIGZvcm0gb2YgYWZvbywgYW4gaW5zdGFuY2Ugb2YgYSBzdHJ1Y3QgZm9vLgorCitnZGJfdGVzdCAicHR5cGUgYWZvbyIgXAorICAgICJ0eXBlID0gc3RydWN0IGZvbyBce1xbXHJcblxdKyAgICBpbnQgYTtcW1xyXG5cXSsgICAgaW50IGI7XFtcclxuXF0rXH0iIFwKKyAgICAicHR5cGUgb24gb3BhcXVlIHN0cnVjdCBpbnN0YW5jZSAoZHluYW1pY2FsbHkpIDEiCisKKworIyBFbnN1cmUgdGhhdCB3ZSBrbm93IHRoZSBmb3JtIG9mIGFuIGV4cGxpY2l0IHN0cnVjdCBmb28uCisKK2lmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CitnZGJfdGVzdCAicHR5cGUgc3RydWN0IGZvbyIgXAorICAgICJ0eXBlID0gc3RydWN0IGZvbyBce1xbXHJcblxdKyAgICBpbnQgYTtcW1xyXG5cXSsgICAgaW50IGI7XFtcclxuXF0rXH0iIFwKKyAgICAicHR5cGUgb24gb3BhcXVlIHN0cnVjdCB0YWduYW1lIChkeW5hbWljYWxseSkgMSIKKworCisjIE5vdyByZWxvYWQgdGhlIHN5bWJvbHMgYWdhaW4gc28gd2UgZm9yZ2V0IGFib3V0IGFueXRoaW5nIHdlIG1pZ2h0CisjIGhhdmUgbGVhcm5lZCByZWFkaW5nIHRoZSBzeW1ib2xzIGR1cmluZyB0aGUgcHJldmlvdXMgdGVzdHMuCisKK2lmIFtpc3RhcmdldCAibWlwcy1pZHQtKiJdIHRoZW4geworICAgICMgUmVzdGFydCBiZWNhdXNlIElEVC9TSU0gcnVucyBvdXQgb2YgZmlsZSBkZXNjcmlwdG9ycy4KKyAgICBnZGJfZXhpdAorICAgIGdkYl9zdGFydAorfQorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKKyMgUnVuIHRvIGdldGZvbywgd2hlcmUgc3RydWN0IGZvbyBpcyBjb21wbGV0ZS4KK2lmICFbcnVudG8gZ2V0Zm9vXSB7CisgICAgcGVycm9yICJjYW5ub3QgcnVuIHRvIGJyZWFrcG9pbnQgYXQgZ2V0Zm9vIgorfQorCisKKyMgRW5zdXJlIHRoYXQgd2Uga25vdyB3aGF0IGZvb3AgaXMuCisKK3NldHVwX3hmYWlsX29uX29wYXF1ZV9wb2ludGVyCitnZGJfdGVzdCAid2hhdGlzIGZvb3AiIFwKKyAgICAidHlwZSA9IHN0cnVjdCBmb28gXFsqXF0rIiBcCisgICAgIndoYXRpcyBvbiBvcGFxdWUgc3RydWN0IHBvaW50ZXIgKGR5bmFtaWNhbGx5KSAxIgorCisKKyMgRW5zdXJlIHRoYXQgd2Uga25vdyB0aGUgZm9ybSBvZiB0aGUgdGhpbmcgZm9vcCBwb2ludHMgdG8uCisKK3NldHVwX3hmYWlsX29uX29wYXF1ZV9wb2ludGVyCitpZiB7ISRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAicnM2MDAwLSotKiIgImhwcGEqLSotaHB1eCoiIH0KK2dkYl90ZXN0ICJwdHlwZSBmb29wIiBcCisgICAgInR5cGUgPSBzdHJ1Y3QgZm9vIFx7XFtcclxuXF0rICAgIGludCBhO1xbXHJcblxdKyAgICBpbnQgYjtcW1xyXG5cXStcfSBcWypcXSsiIFwKKyAgICAicHR5cGUgb24gb3BhcXVlIHN0cnVjdCBwb2ludGVyIChkeW5hbWljYWxseSkgMiIKKworZ2RiX3Rlc3QgIndoYXRpcyBhZm9vIiBcCisgICAgInR5cGUgPSBzdHJ1Y3QgZm9vIiBcCisgICAgIndoYXRpcyBvbiBvcGFxdWUgc3RydWN0IGluc3RhbmNlIChkeW5hbWljYWxseSkgMiIKKworCisjIEVuc3VyZSB0aGF0IHdlIGtub3cgdGhlIGZvcm0gb2YgYWZvbywgYW4gaW5zdGFuY2Ugb2YgYSBzdHJ1Y3QgZm9vLgorCitnZGJfdGVzdCAicHR5cGUgYWZvbyIgXAorICAgICJ0eXBlID0gc3RydWN0IGZvbyBce1xbXHJcblxdKyAgICBpbnQgYTtcW1xyXG5cXSsgICAgaW50IGI7XFtcclxuXF0rXH0iIFwKKyAgICAicHR5cGUgb24gb3BhcXVlIHN0cnVjdCBpbnN0YW5jZSAoZHluYW1pY2FsbHkpIDIiCisKKworIyBFbnN1cmUgdGhhdCB3ZSBrbm93IHRoZSBmb3JtIG9mIGFuIGV4cGxpY2l0IHN0cnVjdCBmb28uCisKK2dkYl90ZXN0ICJwdHlwZSBzdHJ1Y3QgZm9vIiBcCisgICAgInR5cGUgPSBzdHJ1Y3QgZm9vIFx7XFtcclxuXF0rICAgIGludCBhO1xbXHJcblxdKyAgICBpbnQgYjtcW1xyXG5cXStcfSIgXAorICAgICJwdHlwZSBvbiBvcGFxdWUgc3RydWN0IHRhZ25hbWUgKGR5bmFtaWNhbGx5KSAyIgpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9vcGFxdWUwLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL29wYXF1ZTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmUyMzllCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9vcGFxdWUwLmMKQEAgLTAsMCArMSwyMCBAQAorLyogIE5vdGUgdGhhdCBzdHJ1Y3QgZm9vIGlzIG9wYXF1ZSAobmV2ZXIgZGVmaW5lZCkgaW4gdGhpcyBmaWxlLiAgVGhpcworICAgIGlzIGFsbG93ZWQgYnkgQyBzaW5jZSB0aGlzIGZpbGUgZG9lcyBub3QgcmVmZXJlbmNlIGFueSBtZW1iZXJzIG9mCisgICAgdGhlIHN0cnVjdHVyZS4gIFRoZSBkZWJ1Z2dlciBuZWVkcyB0byBiZSBhYmxlIHRvIGFzc29jaWF0ZSB0aGlzCisgICAgb3BhcXVlIHN0cnVjdHVyZSBkZWZpbml0aW9uIHdpdGggdGhlIGZ1bGwgZGVmaW5pdGlvbiBpbiBhbm90aGVyCisgICAgZmlsZS4KKyovCisKK3N0cnVjdCBmb28gKmZvb3A7CitleHRlcm4gc3RydWN0IGZvbyAqZ2V0Zm9vICgpOworCitpbnQgbWFpbiAoKQoreworI2lmZGVmIHVzZXN0dWJzCisgICAgc2V0X2RlYnVnX3RyYXBzKCk7CisgICAgYnJlYWtwb2ludCgpOworI2VuZGlmCisgICAgZm9vcCA9IGdldGZvbyAoKTsKKyAgICBwdXRmb28gKGZvb3ApOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9vcGFxdWUxLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL29wYXF1ZTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTNjODU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9vcGFxdWUxLmMKQEAgLTAsMCArMSwxOCBAQAorc3RydWN0IGZvbyB7CisgICAgaW50IGE7CisgICAgaW50IGI7Cit9IGFmb28gPSB7IDEsIDJ9OworCitzdHJ1Y3QgZm9vICpnZXRmb28gKCkKK3sKKyAgICByZXR1cm4gKCZhZm9vKTsKK30KKworI2lmZGVmIF9fU1REQ19fCit2b2lkIHB1dGZvbyAoc3RydWN0IGZvbyAqZm9vcCkKKyNlbHNlCit2b2lkIHB1dGZvbyAoZm9vcCkKKyAgICAgc3RydWN0IGZvbyAqZm9vcDsKKyNlbmRpZgoreworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9vdmVybGF5cy5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9vdmVybGF5cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMmVkNzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL292ZXJsYXlzLmMKQEAgLTAsMCArMSwzNCBAQAorLyogU3VwcG9ydCBwcm9ncmFtIGZvciB0ZXN0aW5nIGdkYidzIGFiaWxpdHkgdG8gZGVidWcgb3ZlcmxheXMKKyAgIGluIHRoZSBpbmZlcmlvci4gICovCisKKyNpbmNsdWRlICJvdmx5bWdyLmgiCisKK2V4dGVybiBpbnQgZm9vIFBBUkFNUygoaW50KSk7CitleHRlcm4gaW50IGJhciBQQVJBTVMoKGludCkpOworZXh0ZXJuIGludCBiYXogUEFSQU1TKChpbnQpKTsKK2V4dGVybiBpbnQgZ3JieCBQQVJBTVMoKGludCkpOworCitpbnQgbWFpbiAoKQoreworICBpbnQgYSwgYiwgYywgZCwgZTsKKworICBPdmVybGF5TG9hZCAoMCk7CisgIE92ZXJsYXlMb2FkICg0KTsKKyAgYSA9IGZvbyAoMSk7CisgIE92ZXJsYXlMb2FkICgxKTsKKyAgT3ZlcmxheUxvYWQgKDUpOworICBiID0gYmFyICgxKTsKKyAgT3ZlcmxheUxvYWQgKDIpOworICBPdmVybGF5TG9hZCAoNik7CisgIGMgPSBiYXogKDEpOworICBPdmVybGF5TG9hZCAoMyk7CisgIE92ZXJsYXlMb2FkICg3KTsKKyAgZCA9IGdyYnggKDEpOworICBlID0gYSArIGIgKyBjICsgZDsKKyAgcmV0dXJuIChlICE9ICgnZicgKyAnbycgKydvJworCQkrICdiJyArICdhJyArICdyJworCQkrICdiJyArICdhJyArICd6JworCQkrICdnJyArICdyJyArICdiJyArICd4JykpOworCit9CisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvb3ZlcmxheXMuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9vdmVybGF5cy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyZTczYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvb3ZlcmxheXMuZXhwCkBAIC0wLDAgKzEsMjQ2IEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisjIAorIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKyMgCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBNaWNoYWVsIFNueWRlciAobXNueWRlckBjeWdudXMuY29tKQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworIworIyB0ZXN0IHJ1bm5pbmcgcHJvZ3JhbXMKKyMKKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK2lmIFtpc3RhcmdldCAiZDEwdi0qLSoiXSB0aGVuIHsKKyAgICBzZXQgbGlua2VyX3NjcmlwdCAiJHtzcmNkaXJ9LyR7c3ViZGlyfS9kMTB2LmxkIjsKK30gZWxzZWlmIFtpc3RhcmdldCAibTMyci0qLSoiXSB0aGVuIHsKKyAgICBzZXQgbGlua2VyX3NjcmlwdCAiJHtzcmNkaXJ9LyR7c3ViZGlyfS9tMzJyLmxkIjsKK30gZWxzZSB7CisgICAgdmVyYm9zZSAiU2tpcHBpbmcgb3ZlcmxheSB0ZXN0IC0tIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyB0YXJnZXQuIgorICAgIHJldHVybiAKK30KKworc2V0IHRlc3RmaWxlICJvdmVybGF5cyIKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KK3NldCBzcmNmaWxlICR7c3JjZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0uYworc2V0IGZvbyAgICAgJHtzcmNkaXJ9LyR7c3ViZGlyfS9mb28uYworc2V0IGJhciAgICAgJHtzcmNkaXJ9LyR7c3ViZGlyfS9iYXIuYworc2V0IGJheiAgICAgJHtzcmNkaXJ9LyR7c3ViZGlyfS9iYXouYworc2V0IGdyYnggICAgJHtzcmNkaXJ9LyR7c3ViZGlyfS9ncmJ4LmMKKworaWYge1tnZGJfY29tcGlsZSAiJHtzcmNmaWxlfSIgIiR7dGVzdGZpbGV9Lm8iIG9iamVjdCB7ZGVidWd9XSAhPSAiIn0gdGhlbiB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQoraWYge1tnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS9vdmx5bWdyLmMiIG92bHltZ3IubyBvYmplY3Qge2RlYnVnfV0gIT0gIiJ9IHRoZW4geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KK2lmIHtbZ2RiX2NvbXBpbGUgIiR7Zm9vfSIgZm9vLm8gb2JqZWN0IHtkZWJ1Z30gXSAhPSAiIn0gdGhlbiB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCitpZiB7W2dkYl9jb21waWxlICIke2Jhcn0iIGJhci5vIG9iamVjdCB7ZGVidWd9XSAhPSAiIn0gdGhlbiB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQoraWYge1tnZGJfY29tcGlsZSAiJHtiYXp9IiBiYXoubyBvYmplY3Qge2RlYnVnfV0gIT0gIiJ9IHRoZW4geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KK2lmIHtbZ2RiX2NvbXBpbGUgIiR7Z3JieH0iIGdyYngubyBvYmplY3Qge2RlYnVnfV0gIT0gIiJ9IHRoZW4geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KK2lmICB7W2dkYl9jb21waWxlICIke3Rlc3RmaWxlfS5vIG92bHltZ3IubyBmb28ubyBiYXIubyBiYXoubyBncmJ4Lm8iICR7YmluZmlsZX0gZXhlY3V0YWJsZSAibGRzY3JpcHQ9LVdsLC1UJGxpbmtlcl9zY3JpcHQiXSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKK3JlbW90ZV9leGVjIGJ1aWxkICJtdiAke3Rlc3RmaWxlfS5vIGZvby5vIGJhci5vIGJhei5vIGdyYngubyBvdmx5bWdyLm8gJHtvYmpkaXJ9LyR7c3ViZGlyfSIKKworCitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisjCisjIHNldCBpdCB1cCBhdCBhIGJyZWFrcG9pbnQgc28gd2UgY2FuIHBsYXkgd2l0aCB0aGUgdmFyaWFibGUgdmFsdWVzCisjCisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgZ2RiX3N1cHByZXNzX3Rlc3RzOworfQorCisjIGNvdXBsZSBvZiBjb252ZW5pZW5jZSB2YXJpYWJsZXMKK3NldCBmcHRyY2FzdCBbc3RyaW5nX3RvX3JlZ2V4cCAiKGludCAoKikoaW50KSkiXQorc2V0IGlwdHJjYXN0IFtzdHJpbmdfdG9fcmVnZXhwICIoaW50ICopIl0KKworZ2RiX3Rlc3QgIm92ZXJsYXkgbWFudWFsIiAiIiAKK2dkYl90ZXN0ICJvdmVybGF5IGxpc3QiICJObyBzZWN0aW9ucyBhcmUgbWFwcGVkLiIgIkxpc3Qgd2l0aCBub25lIG1hcHBlZCIKKworIyBjYXB0dXJlIHRoZSBMTUEgYWRkcmVzc2VzIG9mIFtmb28gYmFyIGJheiBncmJ4IGZvb3ggYmFyeCBiYXp4IGdyYnh4XQorCitnZGJfdGVzdCAicHJpbnQgXCRmb29fbG1hID0gJmZvbyIgXAorCSIuKiAkZnB0cmNhc3QgMHguKiA8XFwqZm9vXFwqPiIgICJmb28gbG9hZCBhZGRyIgorZ2RiX3Rlc3QgInByaW50IFwkYmFyX2xtYSA9ICZiYXIiIFwKKwkiLiogJGZwdHJjYXN0IDB4LiogPFxcKmJhclxcKj4iICAiYmFyIGxvYWQgYWRkciIKK2dkYl90ZXN0ICJwcmludCBcJGJhel9sbWEgPSAmYmF6IiBcCisJIi4qICRmcHRyY2FzdCAweC4qIDxcXCpiYXpcXCo+IiAgImJheiBsb2FkIGFkZHIiCitnZGJfdGVzdCAicHJpbnQgXCRncmJ4X2xtYSA9ICZncmJ4IiBcCisJIi4qICRmcHRyY2FzdCAweC4qIDxcXCpncmJ4XFwqPiIgImdyYnggbG9hZCBhZGRyIgorZ2RiX3Rlc3QgInByaW50IFwkZm9veF9sbWEgPSAmZm9veCIgXAorCSIuKiAkaXB0cmNhc3QgMHguKiIgICJmb294IGxvYWQgYWRkciIKK2dkYl90ZXN0ICJwcmludCBcJGJhcnhfbG1hID0gJmJhcngiIFwKKwkiLiogJGlwdHJjYXN0IDB4LioiICAiYmFyeCBsb2FkIGFkZHIiCitnZGJfdGVzdCAicHJpbnQgXCRiYXp4X2xtYSA9ICZiYXp4IiBcCisJIi4qICRpcHRyY2FzdCAweC4qIiAgImJhenggbG9hZCBhZGRyIgorZ2RiX3Rlc3QgInByaW50IFwkZ3JieHhfbG1hID0gJmdyYnh4IiBcCisJIi4qICRpcHRyY2FzdCAweC4qIiAiZ3JieHggbG9hZCBhZGRyIgorCisjIG1hcCBlYWNoIG92ZXJsYXkgc3VjY2Vzc2l2ZWx5LCBhbmQKKyMgY2FwdHVyZSB0aGUgVk1BIGFkZHJlc3NlcyBvZiBbZm9vIGJhciBiYXogZ3JieCBmb294IGJhcnggYmF6eCBncmJ4eF0KKworZ2RiX3Rlc3QgIm92ZXJsYXkgbWFwIC5vdmx5MCIgIiIgCitnZGJfdGVzdCAib3ZlcmxheSBsaXN0IiAiU2VjdGlvbiAub3ZseTAsIGxvYWRlZCBhdC4qLCBtYXBwZWQgYXQuKiIgIkxpc3Qgb3ZseTAiCitnZGJfdGVzdCAicHJpbnQgXCRmb29fdm1hID0gJmZvbyIgXAorCSIuKiAkZnB0cmNhc3QgMHguKiA8Zm9vPiIgICJmb28gcnVudGltZSBhZGRyIgorCitnZGJfdGVzdCAib3ZlcmxheSBtYXAgLm92bHkxIiAiIiAKK2dkYl90ZXN0ICJvdmVybGF5IGxpc3QiICJTZWN0aW9uIC5vdmx5MSwgbG9hZGVkIGF0LiosIG1hcHBlZCBhdC4qIiAiTGlzdCBvdmx5MSIKK2dkYl90ZXN0ICJwcmludCBcJGJhcl92bWEgPSAmYmFyIiBcCisJIi4qICRmcHRyY2FzdCAweC4qIDxiYXI+IiAgImJhciBydW50aW1lIGFkZHIiCisKK2dkYl90ZXN0ICJvdmVybGF5IG1hcCAub3ZseTIiICIiIAorZ2RiX3Rlc3QgIm92ZXJsYXkgbGlzdCIgIlNlY3Rpb24gLm92bHkyLCBsb2FkZWQgYXQuKiwgbWFwcGVkIGF0LioiICJMaXN0IG92bHkyIgorZ2RiX3Rlc3QgInByaW50IFwkYmF6X3ZtYSA9ICZiYXoiIFwKKwkiLiogJGZwdHJjYXN0IDB4LiogPGJhej4iICAiYmF6IHJ1bnRpbWUgYWRkciIKKworZ2RiX3Rlc3QgIm92ZXJsYXkgbWFwIC5vdmx5MyIgIiIgCitnZGJfdGVzdCAib3ZlcmxheSBsaXN0IiAiU2VjdGlvbiAub3ZseTMsIGxvYWRlZCBhdC4qLCBtYXBwZWQgYXQuKiIgIkxpc3Qgb3ZseTMiCitnZGJfdGVzdCAicHJpbnQgXCRncmJ4X3ZtYSA9ICZncmJ4IiBcCisJIi4qICRmcHRyY2FzdCAweC4qIDxncmJ4PiIgICJncmJ4IHJ1bnRpbWUgYWRkciIKKworZ2RiX3Rlc3QgIm92ZXJsYXkgbWFwIC5kYXRhMDAiICIiIAorZ2RiX3Rlc3QgIm92ZXJsYXkgbGlzdCIgIlNlY3Rpb24gLmRhdGEwMCwgbG9hZGVkIC4qLCBtYXBwZWQgLioiICJMaXN0IGRhdGEwMCIKK2dkYl90ZXN0ICJwcmludCBcJGZvb3hfdm1hID0gJmZvb3giIFwKKwkiLiogJGlwdHJjYXN0IDB4LioiICAiZm9veCBydW50aW1lIGFkZHIiCisKK2dkYl90ZXN0ICJvdmVybGF5IG1hcCAuZGF0YTAxIiAiIiAKK2dkYl90ZXN0ICJvdmVybGF5IGxpc3QiICJTZWN0aW9uIC5kYXRhMDEsIGxvYWRlZCAuKiwgbWFwcGVkIC4qIiAiTGlzdCBkYXRhMDEiCitnZGJfdGVzdCAicHJpbnQgXCRiYXJ4X3ZtYSA9ICZiYXJ4IiBcCisJIi4qICRpcHRyY2FzdCAweC4qIiAgImJhcnggcnVudGltZSBhZGRyIgorCitnZGJfdGVzdCAib3ZlcmxheSBtYXAgLmRhdGEwMiIgIiIgCitnZGJfdGVzdCAib3ZlcmxheSBsaXN0IiAiU2VjdGlvbiAuZGF0YTAyLCBsb2FkZWQgLiosIG1hcHBlZCAuKiIgIkxpc3QgZGF0YTAyIgorZ2RiX3Rlc3QgInByaW50IFwkYmF6eF92bWEgPSAmYmF6eCIgXAorCSIuKiAkaXB0cmNhc3QgMHguKiIgICJiYXp4IHJ1bnRpbWUgYWRkciIKKworZ2RiX3Rlc3QgIm92ZXJsYXkgbWFwIC5kYXRhMDMiICIiIAorZ2RiX3Rlc3QgIm92ZXJsYXkgbGlzdCIgIlNlY3Rpb24gLmRhdGEwMywgbG9hZGVkIC4qLCBtYXBwZWQgLioiICJMaXN0IGRhdGEwMyIKK2dkYl90ZXN0ICJwcmludCBcJGdyYnh4X3ZtYSA9ICZncmJ4eCIgXAorCSIuKiAkaXB0cmNhc3QgMHguKiIgICJncmJ4eCBydW50aW1lIGFkZHIiCisKKyMgVmVyaWZ5IHRoYXQgTE1BICE9IFZNQQorCitnZGJfdGVzdCAicHJpbnQgXCRmb29fbG1hICAgIT0gXCRmb29fdm1hIiAiLiogPSAxIiAgICJmb28ncyBMTUEgICAhPSBWTUEiCitnZGJfdGVzdCAicHJpbnQgXCRiYXJfbG1hICAgIT0gXCRiYXJfdm1hIiAiLiogPSAxIiAgICJiYXIncyBMTUEgICAhPSBWTUEiCitnZGJfdGVzdCAicHJpbnQgXCRiYXpfbG1hICAgIT0gXCRiYXpfdm1hIiAiLiogPSAxIiAgICJiYXoncyBMTUEgICAhPSBWTUEiCitnZGJfdGVzdCAicHJpbnQgXCRncmJ4X2xtYSAgIT0gXCRncmJ4X3ZtYSIgIi4qID0gMSIgICJncmJ4J3MgTE1BICAhPSBWTUEiCitnZGJfdGVzdCAicHJpbnQgXCRmb294X2xtYSAgIT0gXCRmb294X3ZtYSIgIi4qID0gMSIgICJmb294J3MgTE1BICAhPSBWTUEiCitnZGJfdGVzdCAicHJpbnQgXCRiYXJ4X2xtYSAgIT0gXCRiYXJ4X3ZtYSIgIi4qID0gMSIgICJiYXJ4J3MgTE1BICAhPSBWTUEiCitnZGJfdGVzdCAicHJpbnQgXCRiYXp4X2xtYSAgIT0gXCRiYXp4X3ZtYSIgIi4qID0gMSIgICJiYXp4J3MgTE1BICAhPSBWTUEiCitnZGJfdGVzdCAicHJpbnQgXCRncmJ4eF9sbWEgIT0gXCRncmJ4eF92bWEiICIuKiA9IDEiICJncmJ4eCdzIExNQSAhPSBWTUEiCisKKyMgVmVyaWZ5IHRoYXQgZWFybHktbWFwcGVkIG92ZXJsYXlzIGhhdmUgYmVlbiBidW1wZWQgb3V0IAorIyBieSBsYXRlci1tYXBwZWQgb3ZlcmxheXMgbGF5ZWQgb3ZlciBpbiB0aGUgc2FtZSBWTUEgcmFuZ2UuCisKK3NlbmRfZ2RiICJvdmVybGF5IGxpc3RcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipvdmx5MCwgIiAJCXsgZmFpbCAiLm92bHkwICBub3QgdW5tYXBwZWQgYnkgLm92bHkxIiAgfQorICAgIC1yZSAiLipvdmx5MiwgIgkgCXsgZmFpbCAiLm92bHkyICBub3QgdW5tYXBwZWQgYnkgLm92bHkzIiAgfQorICAgIC1yZSAiLipkYXRhMDAsIgkJeyBmYWlsICIuZGF0YTAwIG5vdCB1bm1hcHBlZCBieSAuZGF0YTAxIiB9CisgICAgLXJlICIuKmRhdGEwMiwiCQl7IGZhaWwgIi5kYXRhMDIgbm90IHVubWFwcGVkIGJ5IC5kYXRhMDMiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBwYXNzICJBdXRvbWF0aWMgdW5tYXBwaW5nIiAgICAgICAgICAgICB9CisgICAgdGltZW91dAkJCXsgZmFpbCAiKHRpbWVvdXQpIEF1dG9tYXRpYyB1bm1hcHBpbmciICAgfQorfQorCisjIHRlc3QgYXV0b21hdGljIG1vZGUKKworZ2RiX3Rlc3QgIm92ZXJsYXkgYXV0byIgIiIKK2dkYl90ZXN0ICJvdmVybGF5IGxpc3QiICJObyBzZWN0aW9ucyBhcmUgbWFwcGVkLiIgIkxpc3Qgbm9uZSBtYXBwZWQgKGF1dG8pIgorZ2RiX3Rlc3QgImJyZWFrIGZvbyIgICJCcmVha3BvaW50IC4qYXQgLipmaWxlIC4qZm9vLmMuKiIgICJicmVhayBmb28iCitnZGJfdGVzdCAiYnJlYWsgYmFyIiAgIkJyZWFrcG9pbnQgLiphdCAuKmZpbGUgLipiYXIuYy4qIiAgImJyZWFrIGJhciIKK2dkYl90ZXN0ICJicmVhayBiYXoiICAiQnJlYWtwb2ludCAuKmF0IC4qZmlsZSAuKmJhei5jLioiICAiYnJlYWsgYmF6IgorZ2RiX3Rlc3QgImJyZWFrIGdyYngiICJCcmVha3BvaW50IC4qYXQgLipmaWxlIC4qZ3JieC5jLioiICJicmVhayBncmJ4IgorCitzZW5kX2dkYiAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiQnJlYWtwb2ludCAuKiBmb28gLng9MS4gYXQgLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgICAiaGl0IGZvbyIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIgkJCSAgICAgeyBmYWlsICAgImhpdCBmb28iIH0KKyAgICB0aW1lb3V0CQkJCSAgICAgeyBmYWlsICIodGltZW91dCkgaGl0IGZvbyIgfQorfQorCitzZW5kX2dkYiAiYmFja3RyYWNlXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIiMwIC4qZm9vIC4qIzEgLiptYWluIC4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBwYXNzICAgIkJUIGZvbyIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIgkJCSAgICAgeyBmYWlsICAgIkJUIGZvbyIgfQorICAgIHRpbWVvdXQJCQkJICAgICB7IGZhaWwgIih0aW1lb3V0KSBCVCBmb28iIH0KK30KKworCitzZW5kX2dkYiAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiQnJlYWtwb2ludCAuKiBiYXIgLng9MS4gYXQgLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgICAiaGl0IGJhciIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIgkJCSAgICAgeyBmYWlsICAgImhpdCBiYXIiIH0KKyAgICB0aW1lb3V0CQkJCSAgICAgeyBmYWlsICIodGltZW91dCkgaGl0IGJhciIgfQorfQorCitzZW5kX2dkYiAiYmFja3RyYWNlXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIiMwIC4qYmFyIC4qIzEgLiptYWluIC4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBwYXNzICAgIkJUIGJhciIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIgkJCSAgICAgeyBmYWlsICAgIkJUIGJhciIgfQorICAgIHRpbWVvdXQJCQkJICAgICB7IGZhaWwgIih0aW1lb3V0KSBCVCBiYXIiIH0KK30KKworc2VuZF9nZGIgImNvbnRpbnVlXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIkJyZWFrcG9pbnQgLiogYmF6IC54PTEuIGF0IC4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICAgImhpdCBiYXoiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJCQkgICAgIHsgZmFpbCAgICJoaXQgYmF6IiB9CisgICAgdGltZW91dAkJCQkgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGhpdCBiYXoiIH0KK30KKworc2VuZF9nZGIgImJhY2t0cmFjZVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIjMCAuKmJheiAuKiMxIC4qbWFpbiAuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgcGFzcyAgICJCVCBiYXoiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJCQkgICAgIHsgZmFpbCAgICJCVCBiYXoiIH0KKyAgICB0aW1lb3V0CQkJCSAgICAgeyBmYWlsICIodGltZW91dCkgQlQgYmF6IiB9Cit9CisKK3NlbmRfZ2RiICJjb250aW51ZVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJCcmVha3BvaW50IC4qIGdyYnggLng9MS4gYXQgLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgICAiaGl0IGdyYngiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJCQkgICAgICB7IGZhaWwgICAiaGl0IGdyYngiIH0KKyAgICB0aW1lb3V0CQkJCSAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGhpdCBncmJ4IiB9Cit9CisKK3NlbmRfZ2RiICJiYWNrdHJhY2VcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiIzAgLipncmJ4IC4qIzEgLiptYWluIC4qJGdkYl9wcm9tcHQgJCIgICAgICB7IHBhc3MgICAiQlQgZ3JieCIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIgkJCSAgICAgeyBmYWlsICAgIkJUIGdyYngiIH0KKyAgICB0aW1lb3V0CQkJCSAgICAgeyBmYWlsICIodGltZW91dCkgQlQgZ3JieCIgfQorfQorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL292bHltZ3IuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvb3ZseW1nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYjkwZmUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL292bHltZ3IuYwpAQCAtMCwwICsxLDIyNSBAQAorCisvKgorICogT3ZseW1nci5jIC0tIFJ1bnRpbWUgT3ZlcmxheSBNYW5hZ2VyIGZvciB0aGUgR0RCIHRlc3RzdWl0ZS4KKyAqLworCisjaW5jbHVkZSAib3ZseW1nci5oIgorCisvKiBMb2NhbCBmdW5jdGlvbnMgYW5kIGRhdGE6ICovCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIF9vdmx5X3RhYmxlW11bNF07CitleHRlcm4gdW5zaWduZWQgbG9uZyBfbm92bHlzIF9fYXR0cmlidXRlX18gKChzZWN0aW9uICgiLmRhdGEiKSkpOworZW51bSBvdmx5X2luZGV4IHsgVk1BLCBTSVpFLCBMTUEsIE1BUFBFRH07CisKK3N0YXRpYyB2b2lkIG92bHlfY29weSAodW5zaWduZWQgbG9uZyBkc3QsIHVuc2lnbmVkIGxvbmcgc3JjLCBsb25nIHNpemUpOworCisvKiBGbHVzaCB0aGUgZGF0YSBhbmQgaW5zdHJ1Y3Rpb24gY2FjaGVzIGF0IGFkZHJlc3MgU1RBUlQgZm9yIFNJWkUgYnl0ZXMuCisgICBTdXBwb3J0IGZvciBlYWNoIG5ldyBwb3J0IG11c3QgYmUgYWRkZWQgaGVyZS4gICovCisvKiBGSVhNRTogTWlnaHQgYmUgYmV0dGVyIHRvIGhhdmUgYSBzdGFuZGFyZCBsaWJnbG9zcyBmdW5jdGlvbiB0aGF0CisgICBwb3J0cyBwcm92aWRlIHRoYXQgd2UgY2FuIHRoZW4gdXNlLiAgVXNlIGxpYmdsb3NzIGluc3RlYWQgb2YgbmV3bGliCisgICBzaW5jZSBsaWJnbG9zcyBpcyB0aGUgb25lIGludGVuZGVkIHRvIGhhbmRsZSBsb3cgbGV2ZWwgc3lzdGVtIGlzc3Vlcy4KKyAgIEkgd291bGQgc3VnZ2VzdCBzb21ldGhpbmcgbGlrZSBfZmx1c2hfY2FjaGUgdG8gYXZvaWQgdGhlIHVzZXIncyBuYW1lc3BhY2UKKyAgIGJ1dCBub3QgYmUgY29tcGxldGVseSBvYnNjdXJlIGFzIG90aGVyIHRoaW5ncyBtYXkgbmVlZCB0aGlzIGZhY2lsaXR5LiAgKi8KKyAKK3N0YXRpYyB2b2lkCitGbHVzaENhY2hlICh2b2lkKQoreworI2lmZGVmIF9fTTMyUl9fCisgIHZvbGF0aWxlIGNoYXIgKm1zcHIgPSAoY2hhciAqKSAweGZmZmZmZmY3OworICAqbXNwciA9IDE7CisjZW5kaWYKK30KKworLyogT3ZlcmxheUxvYWQ6CisgKiBDb3B5IHRoZSBvdmVybGF5IGludG8gaXRzIHJ1bnRpbWUgcmVnaW9uLAorICogYW5kIG1hcmsgdGhlIG92ZXJsYXkgYXMgIm1hcHBlZCIuCisgKi8KKworYm9vbAorT3ZlcmxheUxvYWQgKHVuc2lnbmVkIGxvbmcgb3ZseW5vKQoreworICB1bnNpZ25lZCBsb25nIGk7CisKKyAgaWYgKG92bHlubyA8IDAgfHwgb3ZseW5vID49IF9ub3ZseXMpCisgICAgZXhpdCAoLTEpOwkvKiBmYWlsLCBiYWQgb3ZseSBudW1iZXIgKi8KKworICBpZiAoX292bHlfdGFibGVbb3ZseW5vXVtNQVBQRURdKQorICAgIHJldHVybiBUUlVFOwkvKiB0aGlzIG92ZXJsYXkgYWxyZWFkeSBtYXBwZWQgLS0gbm90aGluZyB0byBkbyEgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgX25vdmx5czsgaSsrKQorICAgIGlmIChpID09IG92bHlubykKKyAgICAgIF9vdmx5X3RhYmxlW2ldW01BUFBFRF0gPSAxOwkvKiB0aGlzIG9uZSBub3cgbWFwcGVkICovCisgICAgZWxzZSBpZiAoX292bHlfdGFibGVbaV1bVk1BXSA9PSBfb3ZseV90YWJsZVtvdmx5bm9dW1ZNQV0pCisgICAgICBfb3ZseV90YWJsZVtpXVtNQVBQRURdID0gMDsJLyogdGhpcyBvbmUgbm93IHVuLW1hcHBlZCAqLworCisgIG92bHlfY29weSAoX292bHlfdGFibGVbb3ZseW5vXVtWTUFdLCAKKwkgICAgIF9vdmx5X3RhYmxlW292bHlub11bTE1BXSwgCisJICAgICBfb3ZseV90YWJsZVtvdmx5bm9dW1NJWkVdKTsKKworICBGbHVzaENhY2hlICgpOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBPdmVybGF5VW5sb2FkOgorICogQ29weSB0aGUgb3ZlcmxheSBiYWNrIGludG8gaXRzICJsb2FkIiByZWdpb24uCisgKiBEb2VzIE5PVCBtYXJrIG92ZXJsYXkgYXMgInVubWFwcGVkIiwgdGhlcmVmb3JlIG1heSBiZSBjYWxsZWQKKyAqIG1vcmUgdGhhbiBvbmNlIGZvciB0aGUgc2FtZSBtYXBwZWQgb3ZlcmxheS4KKyAqLworIAorYm9vbAorT3ZlcmxheVVubG9hZCAodW5zaWduZWQgbG9uZyBvdmx5bm8pCit7CisgIGlmIChvdmx5bm8gPCAwIHx8IG92bHlubyA+PSBfbm92bHlzKQorICAgIGV4aXQgKC0xKTsgIC8qIGZhaWwsIGJhZCBvdmx5IG51bWJlciAqLworIAorICBpZiAoIV9vdmx5X3RhYmxlW292bHlub11bTUFQUEVEXSkKKyAgICBleGl0ICgtMSk7ICAvKiBlcnJvciwgY2FuJ3QgY29weSBvdXQgYSBzZWdtZW50IHRoYXQncyBub3QgImluIiAqLworIAorICBvdmx5X2NvcHkgKF9vdmx5X3RhYmxlW292bHlub11bTE1BXSwgCisJICAgICBfb3ZseV90YWJsZVtvdmx5bm9dW1ZNQV0sCisJICAgICBfb3ZseV90YWJsZVtvdmx5bm9dW1NJWkVdKTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIF9fRDEwVl9fCisjZGVmaW5lIElNQVAwICAgICAgICgqKHNob3J0ICopKDB4ZmYwMCkpCisjZGVmaW5lIElNQVAxICAgICAgICgqKHNob3J0ICopKDB4ZmYwMikpCisjZGVmaW5lIERNQVAgICAgICAgICgqKHNob3J0ICopKDB4ZmYwNCkpCisKK3N0YXRpYyB2b2lkCitEMTBWVHJhbnNsYXRlICh1bnNpZ25lZCBsb25nIGxvZ2ljYWwsCisJICAgICAgIHNob3J0ICpkbWFwLAorCSAgICAgICB1bnNpZ25lZCBsb25nICoqYWRkcikKK3sKKyAgdW5zaWduZWQgbG9uZyBwaHlzaWNhbDsKKyAgdW5zaWduZWQgbG9uZyBzZWc7CisgIHVuc2lnbmVkIGxvbmcgb2ZmOworCisgIC8qIHRvIGFjY2VzcyBkYXRhLCB3ZSB1c2UgdGhlIGZvbGxvd2luZyBtYXBwaW5nIAorICAgICAweDAweHh4eHh4OiBMb2dpY2FsIGRhdGEgYWRkcmVzcyBzZWdtZW50ICAgICAgICAoRE1BUCB0cmFuc2xhdGVkIG1lbW9yeSkKKyAgICAgMHgwMXh4eHh4eDogTG9naWNhbCBpbnN0cnVjdGlvbiBhZGRyZXNzIHNlZ21lbnQgKElNQVAgdHJhbnNsYXRlZCBtZW1vcnkpCisgICAgIDB4MTB4eHh4eHg6IFBoeXNpY2FsIGRhdGEgbWVtb3J5IHNlZ21lbnQgICAgICAgIChPbi1jaGlwIGRhdGEgbWVtb3J5KQorICAgICAweDExeHh4eHh4OiBQaHlzaWNhbCBpbnN0cnVjdGlvbiBtZW1vcnkgc2VnbWVudCAoT24tY2hpcCBpbnNuIG1lbW9yeSkKKyAgICAgMHgxMnh4eHh4eDogUGhpc2ljYWwgdW5pZmllZCBtZW1vcnkgc2VnbWVudCAgICAgKFVuaWZpZWQgbWVtb3J5KQorICAgICAqLworCisgIC8qIEFkZHJlc3NlcyBtdXN0IGJlIGNvcnJlY3RseSBhbGlnbmVkICovCisgIGlmIChsb2dpY2FsICYgKHNpemVvZiAoKiphZGRyKSAtIDEpKQorICAgIGV4aXQgKC0xKTsKKworICAvKiBJZiB0aGUgYWRkcmVzcyBpcyBpbiBvbmUgb2YgdGhlIHR3byBsb2dpY2FsIGFkZHJlc3Mgc3BhY2VzLCBpdCBpcworICAgICBmaXJzdCB0cmFuc2xhdGVkIGludG8gYSBwaHlzaWNhbCBhZGRyZXNzICovCisgIHNlZyA9IChsb2dpY2FsID4+IDI0KTsKKyAgb2ZmID0gKGxvZ2ljYWwgJiAweGZmZmZmZkwpOworICBzd2l0Y2ggKHNlZykgCisgICAgICB7CisgICAgICBjYXNlIDB4MDA6IC8qIGluIGxvZ2ljYWwgZGF0YSBhZGRyZXNzIHNlZ21lbnQgKi8KKwlpZiAob2ZmIDw9IDB4N2ZmZkwpCisJICBwaHlzaWNhbCA9ICgweDEwTCA8PCAyNCkgKyBvZmY7CisJZWxzZQorCSAgLyogTG9naWNhbCBhZGRyZXNzIG91dCBzaWRlIG9mIG9uLWNoaXAgc2VnbWVudCwgbm90CisgICAgICAgICAgICAgc3VwcG9ydGVkICovCisJICBleGl0ICgtMSk7CisJYnJlYWs7CisgICAgICBjYXNlIDB4MDE6IC8qIGluIGxvZ2ljYWwgaW5zdHJ1Y3Rpb24gYWRkcmVzcyBzZWdtZW50ICovCisJeworCSAgc2hvcnQgbWFwOworCSAgaWYgKG9mZiA8PSAweDFmZmZmTCkKKwkgICAgbWFwID0gSU1BUDA7CisJICBlbHNlIGlmIChvZmYgPD0gMHgzZmZmZkwpCisJICAgIG1hcCA9IElNQVAxOworCSAgZWxzZQorCSAgICAvKiBMb2dpY2FsIGFkZHJlc3Mgb3V0c2lkZSBvZiBJTUFQWzAxXSBzZWdtZW50LCBub3QKKwkgICAgICAgc3VwcG9ydGVkICovCisJICAgIGV4aXQgKC0xKTsKKwkgIGlmIChtYXAgJiAweDEwMDBMKQorCSAgICB7CisJICAgIC8qIEluc3RydWN0aW9uIG1lbW9yeSAqLworCSAgICAgIHBoeXNpY2FsID0gKDB4MTFMIDw8IDI0KSB8IG9mZjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgIC8qIFVuaWZpZWQgbWVtb3J5ICovCisJICAgICAgcGh5c2ljYWwgPSAoKG1hcCAmIDB4N2ZMKSA8PCAxNykgKyAob2ZmICYgMHgxZmZmZkwpOworCSAgICAgIGlmIChwaHlzaWNhbCA+IDB4ZmZmZmZmTCkKKwkJLyogQWRkcmVzcyBvdXRzaWRlIG9mIHVuaWZpZWQgYWRkcmVzcyBzZWdtZW50ICovCisJCWV4aXQgKC0xKTsKKwkgICAgICBwaHlzaWNhbCB8PSAoMHgxMkwgPDwgMjQpOworCSAgICB9CisJICBicmVhazsKKwl9CisgICAgICBjYXNlIDB4MTA6CisgICAgICBjYXNlIDB4MTE6CisgICAgICBjYXNlIDB4MTI6CisJcGh5c2ljYWwgPSBsb2dpY2FsOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlleGl0ICgtMSk7CS8qIGVycm9yICovCisgICAgICB9CisKKyAgc2VnID0gKHBoeXNpY2FsID4+IDI0KTsKKyAgb2ZmID0gKHBoeXNpY2FsICYgMHhmZmZmZmZMKTsKKyAgc3dpdGNoIChzZWcpIAorICAgIHsKKyAgICBjYXNlIDB4MTA6CS8qIGRzdCBpcyBhIDE1IGJpdCBvZmZzZXQgaW50byB0aGUgb24tY2hpcCBtZW1vcnkgKi8KKyAgICAgICpkbWFwID0gMDsKKyAgICAgICphZGRyID0gKGxvbmcgKikgKDB4MDAwMCArICgoc2hvcnQpb2ZmICYgMHg3ZmZmKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTE6CS8qIGRzdCBpcyBhbiAxOC1iaXQgb2Zmc2V0IGludG8gdGhlIG9uLWNoaXAKKwkJICAgaW5zdHJ1Y3Rpb24gbWVtb3J5ICovCisgICAgICAqZG1hcCA9IDB4MTAwMEwgfCAoKG9mZiAmIDB4M2ZmZmZMKSA+PiAxNCk7CisgICAgICAqYWRkciA9IChsb25nICopICgweDgwMDAgKyAoKHNob3J0KW9mZiAmIDB4M2ZmZikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDEyOgkvKiBkc3QgaXMgYSAyNC1iaXQgb2Zmc2V0IGludG8gdW5pZmllZCBtZW1vcnkgKi8KKyAgICAgICpkbWFwID0gb2ZmID4+IDE0OworICAgICAgKmFkZHIgPSAobG9uZyAqKSAoMHg4MDAwICsgKChzaG9ydClvZmYgJiAweDNmZmYpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBleGl0ICgtMSk7CS8qIGVycm9yICovCisgICAgfQorfQorI2VuZGlmIC8qIF9fRDEwVl9fICovCisKK3N0YXRpYyB2b2lkCitvdmx5X2NvcHkgKHVuc2lnbmVkIGxvbmcgZHN0LCB1bnNpZ25lZCBsb25nIHNyYywgbG9uZyBzaXplKQoreworI2lmZGVmICBfX00zMlJfXworICBtZW1jcHkgKCh2b2lkICopIGRzdCwgKHZvaWQgKikgc3JjLCBzaXplKTsKKyAgcmV0dXJuOworI2VuZGlmIC8qIE0zMlIgKi8KKworI2lmZGVmICBfX0QxMFZfXworICB1bnNpZ25lZCBsb25nICpzLCAqZCwgdG1wOworICBzaG9ydCBkbWFwX3NyYywgZG1hcF9kc3Q7CisgIHNob3J0IGRtYXBfc2F2ZTsKKworICAvKiBhbGwgc2VjdGlvbiBzaXplcyBzaG91bGQgYnkgbXVsdGlwbGVzIG9mIDQgYnl0ZXMgKi8KKyAgZG1hcF9zYXZlID0gRE1BUDsKKworICBEMTBWVHJhbnNsYXRlIChzcmMsICZkbWFwX3NyYywgJnMpOworICBEMTBWVHJhbnNsYXRlIChkc3QsICZkbWFwX2RzdCwgJmQpOworCisgIHdoaWxlIChzaXplID4gMCkKKyAgICB7CisgICAgICAvKiBOQjogVHJhbnNmZXIgNCBieXRlIChsb25nKSBxdWFudGl0ZXMsIHByb2JsZW1zIG9jY3VyZQorCSB3aGVuIG9ubHkgdHdvIGJ5dGVzIGFyZSB0cmFuc2ZlcmVkICovCisgICAgICBETUFQID0gZG1hcF9zcmM7CisgICAgICB0bXAgPSAqczsKKyAgICAgIERNQVAgPSBkbWFwX2RzdDsKKyAgICAgICpkID0gdG1wOyAKKyAgICAgIGQrKzsKKyAgICAgIHMrKzsKKyAgICAgIHNpemUgLT0gc2l6ZW9mICh0bXApOworICAgICAgc3JjICs9IHNpemVvZiAodG1wKTsKKyAgICAgIGRzdCArPSBzaXplb2YgKHRtcCk7CisgICAgICBpZiAoKHNyYyAmIDB4M2ZmZikgPT0gMCkKKwlEMTBWVHJhbnNsYXRlIChzcmMsICZkbWFwX3NyYywgJnMpOworICAgICAgaWYgKChkc3QgJiAweDNmZmYpID09IDApCisJRDEwVlRyYW5zbGF0ZSAoZHN0LCAmZG1hcF9kc3QsICZkKTsKKyAgICB9CisgIERNQVAgPSBkbWFwX3NhdmU7CisjZW5kaWYgLyogRDEwViAqLworfQorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL292bHltZ3IuaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvb3ZseW1nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMGQ0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL292bHltZ3IuaApAQCAtMCwwICsxLDE3IEBACisvKgorICogU2FtcGxlIHJ1bnRpbWUgb3ZlcmxheSBtYW5hZ2VyLgorICovCisKKyNpZmRlZiBOT19QUk9UT1RZUEVTCisjZGVmaW5lIFBBUkFNUyhwYXJhbWxpc3QpICgpCisjZWxzZQorI2RlZmluZSBQQVJBTVMocGFyYW1saXN0KSBwYXJhbWxpc3QKKyNlbmRpZgorCit0eXBlZGVmIGVudW0geyBGQUxTRSwgVFJVRSB9IGJvb2w7CisKKy8qIEVudHJ5IFBvaW50czogKi8KKworYm9vbCBPdmVybGF5TG9hZCAgIFBBUkFNUygodW5zaWduZWQgbG9uZyBvdmx5bm8pKTsKK2Jvb2wgT3ZlcmxheVVubG9hZCBQQVJBTVMoKHVuc2lnbmVkIGxvbmcgb3ZseW5vKSk7CisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvcG9pbnRlcnMuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvcG9pbnRlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2FjMmMyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9wb2ludGVycy5jCkBAIC0wLDAgKzEsMTc2IEBACisKKyNpZiAhZGVmaW5lZCAoX19TVERDX18pICYmICFkZWZpbmVkIChfQUlYKQorI2RlZmluZSBzaWduZWQgIC8qKi8KKyNlbmRpZgorCitjaGFyCQl2X2NoYXI7CitzaWduZWQgY2hhcgl2X3NpZ25lZF9jaGFyOwordW5zaWduZWQgY2hhcgl2X3Vuc2lnbmVkX2NoYXI7CisKK3Nob3J0CQl2X3Nob3J0Oworc2lnbmVkIHNob3J0CXZfc2lnbmVkX3Nob3J0OwordW5zaWduZWQgc2hvcnQJdl91bnNpZ25lZF9zaG9ydDsKKworaW50CQl2X2ludDsKK3NpZ25lZCBpbnQJdl9zaWduZWRfaW50OwordW5zaWduZWQgaW50CXZfdW5zaWduZWRfaW50OworCitsb25nCQl2X2xvbmc7CitzaWduZWQgbG9uZwl2X3NpZ25lZF9sb25nOwordW5zaWduZWQgbG9uZwl2X3Vuc2lnbmVkX2xvbmc7CisKK2Zsb2F0CQl2X2Zsb2F0OworZG91YmxlCQl2X2RvdWJsZTsKKworCisKK2NoYXIJCSp2X2NoYXJfcG9pbnRlcjsKK3NpZ25lZCBjaGFyCSp2X3NpZ25lZF9jaGFyX3BvaW50ZXI7Cit1bnNpZ25lZCBjaGFyCSp2X3Vuc2lnbmVkX2NoYXJfcG9pbnRlcjsKKworc2hvcnQJCSp2X3Nob3J0X3BvaW50ZXI7CitzaWduZWQgc2hvcnQJKnZfc2lnbmVkX3Nob3J0X3BvaW50ZXI7Cit1bnNpZ25lZCBzaG9ydAkqdl91bnNpZ25lZF9zaG9ydF9wb2ludGVyOworCitpbnQJCSp2X2ludF9wb2ludGVyOworaW50ICAgICAgICAgICAgICp2X2ludF9wb2ludGVyMjsKK3NpZ25lZCBpbnQJKnZfc2lnbmVkX2ludF9wb2ludGVyOwordW5zaWduZWQgaW50CSp2X3Vuc2lnbmVkX2ludF9wb2ludGVyOworCitsb25nCQkqdl9sb25nX3BvaW50ZXI7CitzaWduZWQgbG9uZwkqdl9zaWduZWRfbG9uZ19wb2ludGVyOwordW5zaWduZWQgbG9uZwkqdl91bnNpZ25lZF9sb25nX3BvaW50ZXI7CisKK2Zsb2F0CQkqdl9mbG9hdF9wb2ludGVyOworZG91YmxlCQkqdl9kb3VibGVfcG9pbnRlcjsKKworCitjaGFyCQl2X2NoYXJfYXJyYXlbMl07CitzaWduZWQgY2hhcgl2X3NpZ25lZF9jaGFyX2FycmF5WzJdOwordW5zaWduZWQgY2hhcgl2X3Vuc2lnbmVkX2NoYXJfYXJyYXlbMl07CisKK3Nob3J0CQl2X3Nob3J0X2FycmF5WzJdOworc2lnbmVkIHNob3J0CXZfc2lnbmVkX3Nob3J0X2FycmF5WzJdOwordW5zaWduZWQgc2hvcnQJdl91bnNpZ25lZF9zaG9ydF9hcnJheVsyXTsKKworaW50CQl2X2ludF9hcnJheVsyXTsKK3NpZ25lZCBpbnQJdl9zaWduZWRfaW50X2FycmF5WzJdOwordW5zaWduZWQgaW50CXZfdW5zaWduZWRfaW50X2FycmF5WzJdOworCitsb25nCQl2X2xvbmdfYXJyYXlbMl07CitzaWduZWQgbG9uZwl2X3NpZ25lZF9sb25nX2FycmF5WzJdOwordW5zaWduZWQgbG9uZwl2X3Vuc2lnbmVkX2xvbmdfYXJyYXlbMl07CisKK2Zsb2F0CQl2X2Zsb2F0X2FycmF5WzJdOworZG91YmxlCQl2X2RvdWJsZV9hcnJheVsyXTsKKworaW50IG1hdHJpeFsyXVszXSA9IHsgeyAwLCAxLCAyfSwgezMsIDQsIDV9fTsKK2ludCAoKnJwdHIpWzNdID0gbWF0cml4OworCitmbG9hdCAqKiBwdHJfdG9fcHRyX3RvX2Zsb2F0OworCitpbnQgeTsKKworaW50IG1haW4gKCkKK3sKKyAgICB2b2lkIGR1bW15KCk7CisgICAgCisgICAgLyogRW5zdXJlIHRoYXQgbWFsbG9jIGlzIGEgcG9pbnRlciB0eXBlOyBhdm9pZCB1c2Ugb2YgInZvaWQiIGFuZCBhbnkgaW5jbHVkZSBmaWxlcy4gKi8KKyAgICAvKiBleHRlcm4gY2hhciAqbWFsbG9jKCk7Ki8KKworICAgIC8qICB2b2lkICptYWxsb2Moc2l6ZV90KTsqLworICAgIAorCisgICAgCisjaWZkZWYgdXNlc3R1YnMKKyAgc2V0X2RlYnVnX3RyYXBzKCk7CisgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICBkdW1teSgpOworLyogIHZfaW50X3BvaW50ZXIyID0gJnZfaW50X3BvaW50ZXI7CisgIHZfdW5zaWduZWRfaW50X3BvaW50ZXIgPSAmdl9pbnQ7CisgIAorICB5ID0gKHZfdW5zaWduZWRfaW50X3BvaW50ZXIgPT0gdl9kb3VibGVfcG9pbnRlcik7CisgIAorICB4ID0gdl91bnNpZ25lZF9pbnRfcG9pbnRlciAqIHZfZG91YmxlX3BvaW50ZXI7CisgIAorICB2X3Vuc2lnbmVkX2ludF9wb2ludGVyID0gdl9kb3VibGVfcG9pbnRlcjsKKyAgCisgIHZfdW5zaWduZWRfaW50X3BvaW50ZXIgPSB2X3Vuc2lnbmVkX2ludDsqLworICAKKyAgcmV0dXJuIDA7CisgIAorfQorCit2b2lkIGR1bW15KCkKK3sKKyAgICAKKyAgCisgIHZfY2hhciA9IDA7CisgIHZfc2lnbmVkX2NoYXIgPSAxOworICB2X3Vuc2lnbmVkX2NoYXIgPSAyOworCisgIHZfc2hvcnQgPSAzOworICB2X3NpZ25lZF9zaG9ydCA9IDQ7CisgIHZfdW5zaWduZWRfc2hvcnQgPSA1OyAgICAKKworICB2X2ludCA9IDY7CisgIHZfc2lnbmVkX2ludCA9IDc7CisgIHZfdW5zaWduZWRfaW50ID0gODsgICAgCisKKyAgdl9sb25nID0gOTsKKyAgdl9zaWduZWRfbG9uZyA9IDEwOworICB2X3Vuc2lnbmVkX2xvbmcgPSAxMTsgICAgCisgIAorICB2X2Zsb2F0ID0gMTAwLjA7CisgIHZfZG91YmxlID0gMjAwLjA7CisKKworCisgIHZfY2hhcl9wb2ludGVyID0gJnZfY2hhcjsKKyAgdl9zaWduZWRfY2hhcl9wb2ludGVyID0gJnZfc2lnbmVkX2NoYXI7CisgIHZfdW5zaWduZWRfY2hhcl9wb2ludGVyID0gJnZfdW5zaWduZWRfY2hhcjsKKworICB2X3Nob3J0X3BvaW50ZXIgPSAmdl9zaG9ydDsKKyAgdl9zaWduZWRfc2hvcnRfcG9pbnRlciA9ICZ2X3NpZ25lZF9zaG9ydDsKKyAgdl91bnNpZ25lZF9zaG9ydF9wb2ludGVyID0gJnZfdW5zaWduZWRfc2hvcnQ7CisKKyAgdl9pbnRfcG9pbnRlciA9ICZ2X2ludDsKKyAgdl9zaWduZWRfaW50X3BvaW50ZXIgPSAmdl9zaWduZWRfaW50OworICB2X3Vuc2lnbmVkX2ludF9wb2ludGVyID0gJnZfdW5zaWduZWRfaW50OworCisgIHZfbG9uZ19wb2ludGVyID0gJnZfbG9uZzsKKyAgdl9zaWduZWRfbG9uZ19wb2ludGVyID0gJnZfc2lnbmVkX2xvbmc7CisgIHZfdW5zaWduZWRfbG9uZ19wb2ludGVyID0gJnZfdW5zaWduZWRfbG9uZzsKKworICB2X2Zsb2F0X3BvaW50ZXIgPSAmdl9mbG9hdDsKKyAgdl9kb3VibGVfcG9pbnRlciA9ICZ2X2RvdWJsZTsKKworICBwdHJfdG9fcHRyX3RvX2Zsb2F0ID0gJnZfZmxvYXRfcG9pbnRlcjsKKyAgCisgIAorICB2X2NoYXJfYXJyYXlbMF0gPSB2X2NoYXI7CisgIHZfc2lnbmVkX2NoYXJfYXJyYXlbMF0gPSB2X3NpZ25lZF9jaGFyOworICB2X3Vuc2lnbmVkX2NoYXJfYXJyYXlbMF0gPSB2X3Vuc2lnbmVkX2NoYXI7CisKKyAgdl9zaG9ydF9hcnJheVswXSA9IHZfc2hvcnQ7CisgIHZfc2lnbmVkX3Nob3J0X2FycmF5WzBdID0gdl9zaWduZWRfc2hvcnQ7CisgIHZfdW5zaWduZWRfc2hvcnRfYXJyYXlbMF0gPSB2X3Vuc2lnbmVkX3Nob3J0OworCisgIHZfaW50X2FycmF5WzBdID0gdl9pbnQ7CisgIHZfaW50X2FycmF5WzFdID0gdl9pbnQgKiAzOworICAKKyAgdl9zaWduZWRfaW50X2FycmF5WzBdID0gdl9zaWduZWRfaW50OworICB2X3Vuc2lnbmVkX2ludF9hcnJheVswXSA9IHZfdW5zaWduZWRfaW50OworCisgIHZfbG9uZ19hcnJheVswXSA9IHZfbG9uZzsKKyAgdl9zaWduZWRfbG9uZ19hcnJheVswXSA9IHZfc2lnbmVkX2xvbmc7CisgIHZfdW5zaWduZWRfbG9uZ19hcnJheVswXSA9IHZfdW5zaWduZWRfbG9uZzsKKworICB2X2Zsb2F0X2FycmF5WzBdID0gdl9mbG9hdDsKKyAgdl9kb3VibGVfYXJyYXlbMF0gPSB2X2RvdWJsZTsKKworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9wb2ludGVycy5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3BvaW50ZXJzLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTBlNDRmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9wb2ludGVycy5leHAKQEAgLTAsMCArMSwzNTggQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBFbGVuYSBaYW5ub25pIChlemFubm9uaUBjeWdudXMuY29tKQorCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBnZGIgdGVzdHN1aXRlCisjCisjIHRlc3RzIGZvciBwb2ludGVyIGFyaXRobWV0aWMgYW5kIHBvaW50ZXIgZGVyZWZlcmVuY2luZworIyB3aXRoIGludGVnZXIgdHlwZSB2YXJpYWJsZXMgYW5kIHBvaW50ZXJzIHRvIGludGVnZXJzCisjIAorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKKwl9CisKKyMKKyMgdGVzdCBydW5uaW5nIHByb2dyYW1zCisjCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJwb2ludGVycyIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1ZyBhZGRpdGlvbmFsX2ZsYWdzPS13fV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorICAgIH0KKworCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworCisjCisjIHNldCBpdCB1cCBhdCBhIGJyZWFrcG9pbnQgc28gd2UgY2FuIHBsYXkgd2l0aCB0aGUgdmFyaWFibGUgdmFsdWVzCisjCisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgcGVycm9yICJjb3VsZG4ndCBydW4gdG8gYnJlYWtwb2ludCIKKyAgICBjb250aW51ZQorfQorCitnZGJfdGVzdCAibmV4dCIgInJldHVybiAwOyIgImNvbnRpbnVpbmcgYWZ0ZXIgZHVtbXkoKSIKKworCisjCisjIGxldCdzIHNlZSBpZiBnZGIgY2F0Y2hlcyBzb21lIGlsbGVnYWwgb3BlcmF0aW9ucyBvbiBwb2ludGVycworIworIyBJIG11c3QgY29tbWVudCB0aGVzZSBvdXQgYmVjYXVzZSBzdHJpY3QgdHlwZSBjaGVja2luZyBpcyBub3QKKyMgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbiBvZiBHREIuIEkgZG8gbm90IHJlYWxseSBrbm93CisjIHdoYXQgdGhlIGV4cGVjdGVkIGdkYiByZXBseSBpcy4KKyMKKworI3NlbmRfZ2RiICJwcmludCB2X2ludF9wb2ludGVyMiA9ICZ2X2ludF9wb2ludGVyXG4iCisjZ2RiX2V4cGVjdCB7CisjICAgIC1yZSAiLiouKiRnZGJfcHJvbXB0ICQiIHsKKyMgICAgICAgIHBhc3MgImlsbGVnYWwgcG9pbnRlciBhc3NpZ25tZW50IHJlamVjdGVkIgorIyAgICAgIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiaWxsZWdhbCBwb2ludGVyIGFzc2lnbm1lbnQgcmVqZWN0ZWQiIH0KKyMgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgaWxsZWdhbCBwb2ludGVyIGFzc2lnbm1lbnQgcmVqZWN0ZWQiIH0gICAgCisjICB9CisKKworI3NlbmRfZ2RiICJwcmludCB2X3Vuc2lnbmVkX2ludF9wb2ludGVyID0gJnZfaW50XG4iCisjZ2RiX2V4cGVjdCB7CisjICAgIC1yZSAiLiouKiRnZGJfcHJvbXB0ICQiIHsKKyMgICAgICAgIHBhc3MgImlsbGVnYWwgcG9pbnRlciBhc3NpZ25tZW50IHJlamVjdGVkIgorIyAgICAgIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiaWxsZWdhbCBwb2ludGVyIGFzc2lnbm1lbnQgcmVqZWN0ZWQiIH0KKyMgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgaWxlZ2FsIHBvaW50ZXIgYXNzaWdubWVudCByZWplY3RlZCIgfSAgICAKKyMgIH0KKworI3NlbmRfZ2RiICJwcmludCB2X3Vuc2lnbmVkX2ludF9wb2ludGVyID09IHZfZG91YmxlX3BvaW50ZXJcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAgLXJlICIuKi4qJGdkYl9wcm9tcHQgJCIgeworIyAgICAgICAgcGFzcyAiaWxsZWdhbCBwb2ludGVyIG9wZXJhdGlvbiAoKykgcmVqZWN0ZWQiCisjICAgICAgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJpbGxlZ2FsIHBvaW50ZXIgb3BlcmF0aW9uICgrKSByZWplY3RlZCIgfQorIyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBpbGxlZ2FsIHBvaW50ZXIgb3BlcmF0aW9uICgrKSByZWplY3RlZCIgfSAgICAKKyMgIH0KKworCisjc2VuZF9nZGIgInByaW50IHZfdW5zaWduZWRfaW50X3BvaW50ZXIgKiB2X2RvdWJsZV9wb2ludGVyXG4iCisjZ2RiX2V4cGVjdCB7CisjICAgIC1yZSAiLipBcmd1bWVudCB0byBhcml0aG1ldGljIG9wZXJhdGlvbiBub3QgYSBudW1iZXIgb3IgYm9vbGVhbi4qJGdkYl9wcm9tcHQgJCIgeworIyAgICAgICAgcGFzcyAiaWxsZWdhbCBwb2ludGVyIG9wZXJhdGlvbiAoKikgcmVqZWN0ZWQiCisjICAgICAgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJpbGxlZ2FsIHBvaW50ZXIgb3BlcmF0aW9uICgqKSByZWplY3RlZCIgfQorIyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBpbGxlZ2FsIHBvaW50ZXIgb3BlcmF0aW9uICgqKSByZWplY3RlZCIgfSAgICAKKyMgIH0KKworCisjc2VuZF9nZGIgInByaW50IHZfdW5zaWduZWRfaW50X3BvaW50ZXIgPSB2X2RvdWJsZV9wb2ludGVyXG4iCisjZ2RiX2V4cGVjdCB7CisjICAgIC1yZSAiLiouKiRnZGJfcHJvbXB0ICQiIHsKKyMgICAgICAgIHBhc3MgImlsZWdhbCBwb2ludGVyIGFzc2lnbm1lbnQgcmVqZWN0ZWQiCisjICAgICAgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJpbGxlZ2FsIHBvaW50ZXIgYXNzaWdubWVudCByZWplY3RlZCIgfQorIyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBpbGxlZ2FsIHBvaW50ZXIgYXNzaWdubWVudCByZWplY3RlZCIgfSAgICAKKyMgIH0KKworCisjc2VuZF9nZGIgInByaW50IHZfdW5zaWduZWRfaW50X3BvaW50ZXIgPSB2X3Vuc2lnbmVkX2ludFxuIgorI2dkYl9leHBlY3QgeworIyAgICAtcmUgIi4qLiokZ2RiX3Byb21wdCAkIiB7CisjICAgICAgICBwYXNzICJpbGxlZ2FsIHBvaW50ZXIgYXNzaWdubWVudCByZWplY3RlZCIKKyMgICAgICB9CisjICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImlsbGVnYWwgcG9pbnRlciBhc3NpZ25tZW50IHJlamVjdGVkIiB9CisjICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGlsbGVnYWwgcG9pbnRlciBhc3NpZ25tZW50IHJlamVjdGVkIiB9ICAgIAorIyAgfQorCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHZfaW50X3BvaW50ZXI9JnZfaW50X2FycmF5XFswXF0iICIiICJzZXQgcG9pbnRlciB0byBiZWdpbm5pbmcgb2YgYXJyYXkiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHZfaW50X3BvaW50ZXIyPSZ2X2ludF9hcnJheVxbMVxdIiAiIiAic2V0IHBvaW50ZXIgdG8gZW5kIG9mIGFycmF5IgorCisKK3NlbmRfZ2RiICJwcmludCAqdl9pbnRfcG9pbnRlclxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKj0gNi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBvYmplY3QgcG9pbnRlZCB0byIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBvYmplY3QgcG9pbnRlZCB0byIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IG9iamVjdCBwb2ludGVkIHRvIiB9ICAgIAorICB9CisgIAorc2VuZF9nZGIgInByaW50ICp2X2ludF9wb2ludGVyMlxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKj0gMTguKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgb2JqZWN0IHBvaW50ZWQgdG8iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgb2JqZWN0IHBvaW50ZWQgdG8iIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBvYmplY3QgcG9pbnRlZCB0byIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB2X2ludF9wb2ludGVyID09IHZfaW50X3BvaW50ZXIyXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qPSAwLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInBvaW50ZXIxPT1wb2ludGVyMiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwb2ludGVyMT09cG9pbnRlcjIiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwb2ludGVyMT09cG9pbnRlcjIiIH0gICAgCisgIH0KKworc2VuZF9nZGIgInByaW50IHZfaW50X3BvaW50ZXIgIT0gdl9pbnRfcG9pbnRlcjJcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLio9IDEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicG9pbnRlcjEhPXBvaW50ZXIyIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInBvaW50ZXIxIT1wb2ludGVyMiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHBvaW50ZXIxIT1wb2ludGVyMiIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCB2X2ludF9wb2ludGVyIDw9IHZfaW50X3BvaW50ZXIyXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qPSAxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInBvaW50ZXIxPD1wb2ludGVyMiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwb2ludGVyMTw9cG9pbnRlcjIiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwb2ludGVyMTw9cG9pbnRlcjIiIH0gICAgCisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgdl9pbnRfcG9pbnRlciA+PSB2X2ludF9wb2ludGVyMlxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKj0gMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwb2ludGVyMT49cG9pbnRlcjIiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicG9pbnRlcjE+PXBvaW50ZXIyIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcG9pbnRlcjE+PXBvaW50ZXIyIiB9ICAgIAorICB9CisKKworc2VuZF9nZGIgInByaW50IHZfaW50X3BvaW50ZXIgPCB2X2ludF9wb2ludGVyMlxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKj0gMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwb2ludGVyMTxwb2ludGVyMiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwb2ludGVyMTxwb2ludGVyMiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHBvaW50ZXIxPHBvaW50ZXIyIiB9ICAgIAorICB9CisKK3NlbmRfZ2RiICJwcmludCB2X2ludF9wb2ludGVyID4gdl9pbnRfcG9pbnRlcjJcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLio9IDAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicG9pbnRlcjE+cG9pbnRlcjIiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicG9pbnRlcjE+cG9pbnRlcjIiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwb2ludGVyMT5wb2ludGVyMiIgfSAgICAKKyAgfQorCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeSA9ICp2X2ludF9wb2ludGVyKysiICIiICJzZXQgeSA9ICp2X2ludF9wb2ludGVyKysiCitzZW5kX2dkYiAicHJpbnQgeVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKj0gNi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBzZW5kX2dkYiAicHJpbnQgKnZfaW50X3BvaW50ZXJcbiIKKyAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgLXJlICIuKj0gMTguKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgcGFzcyAicG9pbnRlciBhc3NpZ25tZW50IGFuZCBpbmNyZW1lbnQiCisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicG9pbnRlciBhc3NpZ25tZW50IGFuZCBpbmNyZW1lbnQiIH0KKyAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwb2ludGVyIGFzc2lnbm1lbnQgYW5kIGluY3JlbWVudCIgfSAgICAKKyAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwb2ludGVyIGFzc2lnbm1lbnQgYW5kIGluY3JlbWVudCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHBvaW50ZXIgYXNzaWdubWVudCBhbmQgaW5jcmVtZW50IiB9ICAgIAorICB9CisKKworCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeSA9ICotLXZfaW50X3BvaW50ZXIyIiAiIiAic2V0IHkgPSAqLS12X2ludF9wb2ludGVyMiIKK3NlbmRfZ2RiICJwcmludCB5XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qPSA2LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHNlbmRfZ2RiICJwcmludCAqdl9pbnRfcG9pbnRlcjJcbiIKKyAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgLXJlICIuKj0gNi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICBwYXNzICJwb2ludGVyIGRlY3JlbWVudCBhbmQgYXNzaWdubWVudCIKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwb2ludGVyIGRlY3JlbWVudCBhbmQgYXNzaWdubWVudCIgfQorICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHBvaW50ZXIgZGVjcmVtZW50IGFuZCBhc3NpZ25tZW50IiB9ICAgIAorICAgICAgICAgfQorICAgICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInBvaW50ZXIgZGVjcmVtZW50IGFuZCBhc3NpZ25tZW50IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcG9pbnRlciBkZWNyZW1lbnQgYW5kIGFzc2lnbm1lbnQiIH0gICAgCisgIH0KKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB5ID12X2ludF9wb2ludGVyLXZfaW50X3BvaW50ZXIyIiAiIiAic2V0IHkgPXZfaW50X3BvaW50ZXItdl9pbnRfcG9pbnRlcjIiCitzZW5kX2dkYiAicHJpbnQgeVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKj0gMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwb2ludGVyMS1wb2ludGVyMiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwb2ludGVyMS1wb2ludGVyMiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHBvaW50ZXIxLXBvaW50ZXIyIiB9ICAgIAorICB9CisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgdl9pbnRfcG9pbnRlcj12X2ludF9hcnJheSIgIiIgInNldCB2X2ludF9wb2ludGVyPXZfaW50X2FycmF5Igorc2VuZF9nZGIgInByaW50ICp2X2ludF9wb2ludGVyXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qPSA2LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IGFycmF5IGVsZW1lbnQgdGhyb3VnaCBwb2ludGVyIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGFycmF5IGVsZW1lbnQgdGhyb3VnaCBwb2ludGVyIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgYXJyYXkgZWxlbWVudCB0aHJvdWdoIHBvaW50ZXIiIH0gICAgCisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgKih2X2ludF9wb2ludGVyKzEpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qPSAxOC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBhcnJheSBlbGVtZW50IHRocm91Z2ggcG9pbnRlciIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBhcnJheSBlbGVtZW50IHRocm91Z2ggcG9pbnRlciIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGFycmF5IGVsZW1lbnQgdGhyb3VnaCBwb2ludGVyIiB9ICAgIAorICB9CisKKyMgdGVzdCBwcmludCBlbGVtZW50cyBvZiBhcnJheSB0aHJvdWdoIHBvaW50ZXJzCisKK3NlbmRfZ2RiICJwcmludCAoKnJwdHIpXFswXF1cbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLio9IDAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgYXJyYXkgZWxlbWVudCB0aHJvdWdoIHBvaW50ZXIiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgYXJyYXkgZWxlbWVudCB0aHJvdWdoIHBvaW50ZXIiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBhcnJheSBlbGVtZW50IHRocm91Z2ggcG9pbnRlciIgfSAgICAKKyAgfQorCitzZW5kX2dkYiAicHJpbnQgKCpycHRyKVxbMVxdXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qPSAxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IGFycmF5IGVsZW1lbnQgdGhyb3VnaCBwb2ludGVyIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGFycmF5IGVsZW1lbnQgdGhyb3VnaCBwb2ludGVyIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgYXJyYXkgZWxlbWVudCB0aHJvdWdoIHBvaW50ZXIiIH0gICAgCisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgKCpycHRyKVxbMlxdXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qPSAyLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IGFycmF5IGVsZW1lbnQgdGhyb3VnaCBwb2ludGVyIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGFycmF5IGVsZW1lbnQgdGhyb3VnaCBwb2ludGVyIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgYXJyYXkgZWxlbWVudCB0aHJvdWdoIHBvaW50ZXIiIH0gICAgCisgIH0KKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSBycHRyID0gcnB0cisxIiAiIiAiaW5jcmVtZW50IHJwdHIiCisKK3NlbmRfZ2RiICJwcmludCAoKnJwdHIpXFswXF1cbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLio9IDMuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgYXJyYXkgZWxlbWVudCB0aHJvdWdoIHBvaW50ZXIiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgYXJyYXkgZWxlbWVudCB0aHJvdWdoIHBvaW50ZXIiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBhcnJheSBlbGVtZW50IHRocm91Z2ggcG9pbnRlciIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAoKnJwdHIpXFsxXF1cbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLio9IDQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgYXJyYXkgZWxlbWVudCB0aHJvdWdoIHBvaW50ZXIiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgYXJyYXkgZWxlbWVudCB0aHJvdWdoIHBvaW50ZXIiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBhcnJheSBlbGVtZW50IHRocm91Z2ggcG9pbnRlciIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAoKnJwdHIpXFsyXF1cbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLio9IDUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgYXJyYXkgZWxlbWVudCB0aHJvdWdoIHBvaW50ZXIiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgYXJyYXkgZWxlbWVudCB0aHJvdWdoIHBvaW50ZXIiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBhcnJheSBlbGVtZW50IHRocm91Z2ggcG9pbnRlciIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAqKCAqKG1hdHJpeCsxKSArMilcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLio9IDUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgYXJyYXkgZWxlbWVudCB3LyBwb2ludGVyIGFyaXRobWV0aWMiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgYXJyYXkgZWxlbWVudCB3LyBwb2ludGVyIGFyaXRoZW10aWMiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBhcnJheSBlbGVtZW50IHcvIHBvaW50ZXIgYXJpdGhtZXRpYyIgfSAgICAKKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCAqKnB0cl90b19wdHJfdG9fZmxvYXRcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLio9IDEwMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB0aHJvdWdoIHB0ciB0byBwdHIiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdGhyb3VnaCBwdHIgdG8gcHRyIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdGhyb3VnaCBwdHIgdG8gcHRyIiB9ICAgIAorICB9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3BvaW50ZXJzMi5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9wb2ludGVyczIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzMwNjIxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9wb2ludGVyczIuYwpAQCAtMCwwICsxLDUxIEBACit2b2lkIG1hcmtlcjEgKCkKK3sKKyAgICAKK30KKworCitpbnQgbWFpbigpCit7CisgICAgY2hhciBDLCAqcEMsICoqcHBDLCAqKipwcHBDLCAqKioqcHBwcEMsICoqKioqcHBwcHBDLCAqKioqKipwcHBwcHBDOworICAgIHVuc2lnbmVkIGNoYXIgVUMsICpwVUM7CisgICAgc2hvcnQgUywgKnBTOworICAgIHVuc2lnbmVkIHNob3J0IFVTLCAqcFVTOworICAgIGludCBJLCAqcEk7CisgICAgdW5zaWduZWQgaW50IFVJLCAqcFVJOworICAgIGxvbmcgTCwgKnBMOworICAgIHVuc2lnbmVkIGxvbmcgVUwsICpwVUw7CisgICAgZmxvYXQgRiwgKnBGOworICAgIGRvdWJsZSBELCAqcEQ7CisgICAgQyA9ICdBJzsKKyAgICBVQyA9IDIxOworICAgIFMgPSAtMTQ7CisgICAgVVMgPSA3OworICAgIEkgPSAxMDI7CisgICAgVUkgPSAxMDAyOworICAgIEwgPSAtMjM0OworICAgIFVMID0gMjM0OworICAgIEYgPSAxLjI1RTEwOworICAgIEQgPSAtMS4zNzVFLTEyMzsKKyAgICBwQyA9ICZDOworICAgIHBwQyA9ICZwQzsKKyAgICBwcHBDID0gJnBwQzsKKyAgICBwcHBwQyA9ICZwcHBDOworICAgIHBwcHBwQyA9ICZwcHBwQzsKKyAgICBwcHBwcHBDID0gJnBwcHBwQzsKKyAgICBwVUMgPSAmVUM7CisgICAgcFMgPSAmUzsKKyAgICBwVVMgPSAmVVM7CisgICAgcEkgPSAmSTsKKyAgICBwVUkgPSAmVUk7CisgICAgcEwgPSAmTDsKKyAgICBwVUwgPSAmVUw7CisgICAgcEYgPSAmRjsKKyAgICBwRCA9ICZEOworICAgIAorICAgICNpZmRlZiB1c2VzdHVicworICAgICAgIHNldF9kZWJ1Z190cmFwcygpOworICAgICAgIGJyZWFrcG9pbnQoKTsKKyAgICAjZW5kaWYKKyAgICBtYXJrZXIxKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3BvaW50ZXJzMi5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3BvaW50ZXJzMi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0ZTExMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvcG9pbnRlcnMyLmV4cApAQCAtMCwwICsxLDI4OCBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OAorIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBFbGVuYSBaYW5ub25pLiAoZXphbm5vbmlAY3lnbnVzLmNvbSkKKworCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBnZGIgdGVzdHN1aXRlCisjCisjIHRlc3RzIGZvciBwb2ludGVycyAKKyMgd2l0aCBlbGVtZW50YXJ5IHR5cGUgdmFyaWFibGVzIGFuZCBwb2ludGVycy4KKyMgCisKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisgICAgICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorICAgICAgICB9CisKKyMKKyMgdGVzdCBydW5uaW5nIHByb2dyYW1zCisjCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJwb2ludGVyczIiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworCisjCisjIHNldCBpdCB1cCBhdCBhIGJyZWFrcG9pbnQgc28gd2UgY2FuIHBsYXkgd2l0aCB0aGUgdmFyaWFibGUgdmFsdWVzCisjCitpZiAhW3J1bnRvX21haW5dIHRoZW4geworICAgIHBlcnJvciAiY291bGRuJ3QgcnVuIHRvIGJyZWFrcG9pbnQiCisgICAgY29udGludWUKK30KKworc2VuZF9nZGIgImJyZWFrIG1hcmtlcjFcbiIgOyBnZGJfZXhwZWN0IC1yZSAiLiokZ2RiX3Byb21wdCAkIgorCisgICAgc2VuZF9nZGIgImNvbnRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJCcmVhay4qIG1hcmtlcjEgXFwoXFwpIGF0IC4qOiRkZWNpbWFsLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBzZW5kX2dkYiAidXBcbiIKKyAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorICAgICAgICAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJ1cCBmcm9tIG1hcmtlcjEiIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29udGludWUgdG8gbWFya2VyMSIgIH0KKyAgICAgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb250aW51ZSB0byBtYXJrZXIxIiAgfQorICAgIH0KKworCitzZW5kX2dkYiAicHJpbnQgKnBVQ1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAyMSBcJy4wMjVcJy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAqcFVDIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICpwVUMiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAqcFVDIiB9CisgIH0KKworCitzZW5kX2dkYiAicHR5cGUgcFVDXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSB1bnNpZ25lZCBjaGFyIFxcKi4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgcFVDIiB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgeyAgZmFpbCAicHR5cGUgcFVDIiB9CisgICAgdGltZW91dCAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBwVUMiIH0KK30KKworc2VuZF9nZGIgInByaW50ICpwU1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAtMTQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgKnBTIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICpwUyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mICpwUyIgfQorICB9CisKKworc2VuZF9nZGIgInB0eXBlIHBTXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSBzaG9ydCBcXCouKiRnZGJfcHJvbXB0ICQiICB7IHBhc3MgInB0eXBlIHBTIiB9CisgICAgLXJlICJ0eXBlID0gc2hvcnQgaW50IFxcKi4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgcFMiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBwUyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgcFMiIH0KK30KKworc2VuZF9nZGIgInByaW50ICpwVVNcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gNy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAqcFVTIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICpwVVMiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAqcFVTIiB9CisgIH0KKworCitzZW5kX2dkYiAicHR5cGUgcFVTXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSB1bnNpZ25lZCBzaG9ydCBcXCouKiRnZGJfcHJvbXB0ICQiICB7IHBhc3MgInB0eXBlIHBVUyIgfQorICAgIC1yZSAidHlwZSA9IHNob3J0IHVuc2lnbmVkIGludCBcXCouKiRnZGJfcHJvbXB0ICQiICB7IHBhc3MgInB0eXBlIHBVUyIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgIGZhaWwgInB0eXBlIHBVUyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgcFVTIiB9Cit9CisKK3NlbmRfZ2RiICJwcmludCAqcElcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMTAyLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICpwSSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAqcEkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAqcEkiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwdHlwZSBwSVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gaW50IFxcKi4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgcEkiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBwSSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgcEkiIH0KK30KKworc2VuZF9nZGIgInByaW50ICpwVUlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMTAwMi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAqcFVJIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICpwVUkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAqcFVJIiB9CisgIH0KKworCitzZW5kX2dkYiAicHR5cGUgcFVJXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSB1bnNpZ25lZCBpbnQgXFwqLiokZ2RiX3Byb21wdCAkIiAgeyBwYXNzICJwdHlwZSBwVUkiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBwVUkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHBVSSIgfQorfQorCitzZW5kX2dkYiAicHJpbnQgKnBMXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IC0yMzQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgKnBMIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICpwTCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mICpwTCIgfQorICB9CisKKworc2VuZF9nZGIgInB0eXBlIHBMXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSBsb25nIFxcKi4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgcEwiIH0KKyAgICAtcmUgInR5cGUgPSBsb25nIGludCBcXCouKiRnZGJfcHJvbXB0ICQiICB7IHBhc3MgInB0eXBlIHBMIiB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgeyAgZmFpbCAicHR5cGUgcEwiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHBMIiB9Cit9CisKK3NlbmRfZ2RiICJwcmludCAqcFVMXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDIzNC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAqcFVMIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICpwVUwiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAqcFVMIiB9CisgIH0KKworCitzZW5kX2dkYiAicHR5cGUgcFVMXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSB1bnNpZ25lZCBsb25nIFxcKi4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgcFVMIiB9CisgICAgLXJlICJ0eXBlID0gbG9uZyB1bnNpZ25lZCBpbnQgXFwqLiokZ2RiX3Byb21wdCAkIiAgeyBwYXNzICJwdHlwZSBwVUwiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBwVUwiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHBVTCIgfQorfQorCitzZW5kX2dkYiAicHJpbnQgKnBGXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDEuMlxbMC05XF0qZVxcKzEwLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICpwRiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAqcEYiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAqcEYiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwdHlwZSBwRlxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gZmxvYXQgXFwqLiokZ2RiX3Byb21wdCAkIiAgeyBwYXNzICJwdHlwZSBwRiIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgIGZhaWwgInB0eXBlIHBGIiB9CisgICAgdGltZW91dCAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBwRiIgfQorfQorCitzZW5kX2dkYiAicHJpbnQgKnBEXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IC0xLjM3NWUtMTIzLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mICpwRCIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAqcEQiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAqcEQiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwdHlwZSBwRFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gZG91YmxlIFxcKi4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgcEQiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBwRCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgcEQiIH0KK30KKworc2VuZF9nZGIgInByaW50ICoqKioqKnBwcHBwcENcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gNjUgXCdBXCcuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgKioqKioqcHBwcHBwQyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAqKioqKipwcHBwcHBDIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgKioqKioqcHBwcHBwQyIgfQorICB9CisKKworc2VuZF9nZGIgInB0eXBlIHBDXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSBjaGFyIFxcKi4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgcEMiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBwQyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgcEMiIH0KK30KKworc2VuZF9nZGIgInB0eXBlIHBwQ1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gY2hhciBcXCpcXCouKiRnZGJfcHJvbXB0ICQiICB7IHBhc3MgInB0eXBlIHBwQyIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgIGZhaWwgInB0eXBlIHBwQyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgcHBDIiB9Cit9CisKK3NlbmRfZ2RiICJwdHlwZSBwcHBDXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSBjaGFyIFxcKlxcKlxcKi4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgIHBwcEMiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBwcHBDIiB9CisgICAgdGltZW91dCAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBwcHBDIiB9Cit9CisKK3NlbmRfZ2RiICJwdHlwZSBwcHBwQ1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gY2hhciBcXCpcXCpcXCpcXCouKiRnZGJfcHJvbXB0ICQiICB7IHBhc3MgInB0eXBlIHBwcHBDIiB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgeyAgZmFpbCAicHR5cGUgcHBwcEMiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHBwcHBDIiB9Cit9CisKK3NlbmRfZ2RiICJwdHlwZSBwcHBwcENcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAidHlwZSA9IGNoYXIgXFwqXFwqXFwqXFwqXFwqLiokZ2RiX3Byb21wdCAkIiAgeyBwYXNzICJwdHlwZSBwcHBwcEMiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBwcHBwcEMiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHBwcHBwQyIgfQorfQorCitzZW5kX2dkYiAicHR5cGUgcHBwcHBwQ1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gY2hhciBcXCpcXCpcXCpcXCpcXCpcXCouKiRnZGJfcHJvbXB0ICQiICB7IHBhc3MgInB0eXBlIHBwcHBwcEMiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBwcHBwcHBDIiB9CisgICAgdGltZW91dCAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBwcHBwcHBDIiB9Cit9CisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvcHJpbnRjbWRzLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3ByaW50Y21kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMjIzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3ByaW50Y21kcy5jCkBAIC0wLDAgKzEsMTAxIEBACisvKiBUaGlzIHRhYmxlIGlzIHVzZWQgYXMgYSBzb3VyY2UgZm9yIGV2ZXJ5IGFzY2lpIGNoYXJhY3Rlci4KKyAgIEl0IGlzIGV4cGxpY2l0bHkgdW5zaWduZWQgdG8gYXZvaWQgZGlmZmVyZW5jZXMgZHVlIHRvIG5hdGl2ZSBjaGFyYWN0ZXJzCisgICBiZWluZyBlaXRoZXIgc2lnbmVkIG9yIHVuc2lnbmVkLiAqLworCit1bnNpZ25lZCBjaGFyIGN0YWJsZTFbMjU2XSA9IHsKKyAgMDAwMCwgMDAwMSwgMDAwMiwgMDAwMywgMDAwNCwgMDAwNSwgMDAwNiwgMDAwNywKKyAgMDAxMCwgMDAxMSwgMDAxMiwgMDAxMywgMDAxNCwgMDAxNSwgMDAxNiwgMDAxNywKKyAgMDAyMCwgMDAyMSwgMDAyMiwgMDAyMywgMDAyNCwgMDAyNSwgMDAyNiwgMDAyNywKKyAgMDAzMCwgMDAzMSwgMDAzMiwgMDAzMywgMDAzNCwgMDAzNSwgMDAzNiwgMDAzNywKKyAgMDA0MCwgMDA0MSwgMDA0MiwgMDA0MywgMDA0NCwgMDA0NSwgMDA0NiwgMDA0NywKKyAgMDA1MCwgMDA1MSwgMDA1MiwgMDA1MywgMDA1NCwgMDA1NSwgMDA1NiwgMDA1NywKKyAgMDA2MCwgMDA2MSwgMDA2MiwgMDA2MywgMDA2NCwgMDA2NSwgMDA2NiwgMDA2NywKKyAgMDA3MCwgMDA3MSwgMDA3MiwgMDA3MywgMDA3NCwgMDA3NSwgMDA3NiwgMDA3NywKKyAgMDEwMCwgMDEwMSwgMDEwMiwgMDEwMywgMDEwNCwgMDEwNSwgMDEwNiwgMDEwNywKKyAgMDExMCwgMDExMSwgMDExMiwgMDExMywgMDExNCwgMDExNSwgMDExNiwgMDExNywKKyAgMDEyMCwgMDEyMSwgMDEyMiwgMDEyMywgMDEyNCwgMDEyNSwgMDEyNiwgMDEyNywKKyAgMDEzMCwgMDEzMSwgMDEzMiwgMDEzMywgMDEzNCwgMDEzNSwgMDEzNiwgMDEzNywKKyAgMDE0MCwgMDE0MSwgMDE0MiwgMDE0MywgMDE0NCwgMDE0NSwgMDE0NiwgMDE0NywKKyAgMDE1MCwgMDE1MSwgMDE1MiwgMDE1MywgMDE1NCwgMDE1NSwgMDE1NiwgMDE1NywKKyAgMDE2MCwgMDE2MSwgMDE2MiwgMDE2MywgMDE2NCwgMDE2NSwgMDE2NiwgMDE2NywKKyAgMDE3MCwgMDE3MSwgMDE3MiwgMDE3MywgMDE3NCwgMDE3NSwgMDE3NiwgMDE3NywKKyAgMDIwMCwgMDIwMSwgMDIwMiwgMDIwMywgMDIwNCwgMDIwNSwgMDIwNiwgMDIwNywKKyAgMDIxMCwgMDIxMSwgMDIxMiwgMDIxMywgMDIxNCwgMDIxNSwgMDIxNiwgMDIxNywKKyAgMDIyMCwgMDIyMSwgMDIyMiwgMDIyMywgMDIyNCwgMDIyNSwgMDIyNiwgMDIyNywKKyAgMDIzMCwgMDIzMSwgMDIzMiwgMDIzMywgMDIzNCwgMDIzNSwgMDIzNiwgMDIzNywKKyAgMDI0MCwgMDI0MSwgMDI0MiwgMDI0MywgMDI0NCwgMDI0NSwgMDI0NiwgMDI0NywKKyAgMDI1MCwgMDI1MSwgMDI1MiwgMDI1MywgMDI1NCwgMDI1NSwgMDI1NiwgMDI1NywKKyAgMDI2MCwgMDI2MSwgMDI2MiwgMDI2MywgMDI2NCwgMDI2NSwgMDI2NiwgMDI2NywKKyAgMDI3MCwgMDI3MSwgMDI3MiwgMDI3MywgMDI3NCwgMDI3NSwgMDI3NiwgMDI3NywKKyAgMDMwMCwgMDMwMSwgMDMwMiwgMDMwMywgMDMwNCwgMDMwNSwgMDMwNiwgMDMwNywKKyAgMDMxMCwgMDMxMSwgMDMxMiwgMDMxMywgMDMxNCwgMDMxNSwgMDMxNiwgMDMxNywKKyAgMDMyMCwgMDMyMSwgMDMyMiwgMDMyMywgMDMyNCwgMDMyNSwgMDMyNiwgMDMyNywKKyAgMDMzMCwgMDMzMSwgMDMzMiwgMDMzMywgMDMzNCwgMDMzNSwgMDMzNiwgMDMzNywKKyAgMDM0MCwgMDM0MSwgMDM0MiwgMDM0MywgMDM0NCwgMDM0NSwgMDM0NiwgMDM0NywKKyAgMDM1MCwgMDM1MSwgMDM1MiwgMDM1MywgMDM1NCwgMDM1NSwgMDM1NiwgMDM1NywKKyAgMDM2MCwgMDM2MSwgMDM2MiwgMDM2MywgMDM2NCwgMDM2NSwgMDM2NiwgMDM2NywKKyAgMDM3MCwgMDM3MSwgMDM3MiwgMDM3MywgMDM3NCwgMDM3NSwgMDM3NiwgMDM3NworfTsKKwordW5zaWduZWQgY2hhciBjdGFibGUyW10gPSB7CisgICdhJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywKKyAgJ2EnLCdhJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLAorICAnYScsJ2EnLCdhJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsCisgICdhJywnYScsJ2EnLCdhJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywKKyAgJ2EnLCdhJywnYScsJ2EnLCdhJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLAorICAnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsCisgICdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywKKyAgJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLAorICAnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsCisgICdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywKKyAgJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnWCcsJ1gnLCdYJywnWCcsJ1gnLAorICAnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnWCcsJ1gnLCdYJywnWCcsCisgICdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnWCcsJ1gnLCdYJywKKyAgJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnWCcsJ1gnLAorICAnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnWCcsCisgICdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJworfTsKKworLyogU2luZ2xlIGFuZCBtdWx0aWRpbWVuc2lvbmFsIGFycmF5cyB0byB0ZXN0IGFjY2VzcyBhbmQgcHJpbnRpbmcgb2YgYXJyYXkKKyAgIG1lbWJlcnMuICovCisKK2ludCBpbnQxZGltWzEyXSA9IHswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExfTsKK2ludCBpbnQyZGltWzNdWzRdID0ge3swLDEsMiwzfSx7NCw1LDYsN30sezgsOSwxMCwxMX19OworaW50IGludDNkaW1bMl1bM11bMl0gPSB7e3swLDF9LHsyLDN9LHs0LDV9fSx7ezYsN30sezgsOX0sezEwLDExfX19OworaW50IGludDRkaW1bMV1bMl1bM11bMl0gPSB7e3t7MCwxfSx7MiwzfSx7NCw1fX0se3s2LDd9LHs4LDl9LHsxMCwxMX19fX07CisKK2NoYXIgKnRlc3RzdHJpbmcgPSAidGVzdHN0cmluZyBjb250ZW50cyI7CisKKy8qIFRlc3QgcHJpbnRpbmcgb2YgYSBzdHJ1Y3QgY29udGFpbmluZyBjaGFyYWN0ZXIgYXJyYXlzLiAqLworCitzdHJ1Y3Qgc29tZV9hcnJheXMgeworICAgIHVuc2lnbmVkIGNoYXIgYXJyYXkxWzRdOworICAgIHVuc2lnbmVkIGNoYXIgYXJyYXkyWzFdOworICAgIHVuc2lnbmVkIGNoYXIgYXJyYXkzWzFdOworICAgIHVuc2lnbmVkIGNoYXIgYXJyYXk0WzJdOworICAgIHVuc2lnbmVkIGNoYXIgYXJyYXk1WzRdOworfSBhcnJheXMgPSB7CisgIHsnYScsICdiJywgJ2MnLCAnXDAnfSwKKyAgeydkJ30sCisgIHsnZSd9LAorICB7J2YnLCAnZycgfSwKKyAgeydoJywgJ2knLCAnaicsICdcMCd9Cit9OworCitzdHJ1Y3Qgc29tZV9hcnJheXMgKnBhcnJheXMgPSAmYXJyYXlzOworCisvKiAtLSAqLworCittYWluICgpCit7CisjaWZkZWYgdXNlc3R1YnMKKyAgc2V0X2RlYnVnX3RyYXBzKCk7CisgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICBtYWxsb2MoMSk7CisKKyAgLyogUHJldmVudCBBSVggbGlua2VyIGZyb20gcmVtb3ZpbmcgdmFyaWFibGVzLiAgKi8KKyAgcmV0dXJuIGN0YWJsZTFbMF0gKyBjdGFibGUyWzBdICsgaW50MWRpbVswXSArIGludDJkaW1bMF1bMF0KKyAgICArIGludDNkaW1bMF1bMF1bMF0gKyBpbnQ0ZGltWzBdWzBdWzBdWzBdICsgdGVzdHN0cmluZ1swXSArCisgICAgICAqcGFycmF5cyAtPiBhcnJheTE7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3ByaW50Y21kcy5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3ByaW50Y21kcy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk1M2VjNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvcHJpbnRjbWRzLmV4cApAQCAtMCwwICsxLDY5NSBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEZyZWQgRmlzaC4gKGZuZkBjeWdudXMuY29tKQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAicHJpbnRjbWRzIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQoraWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworIyBTZXQgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgdG8gQy4gIFRoaXMgY291bnRzIGFzIGEgdGVzdC4gIElmIGl0CisjIGZhaWxzLCB0aGVuIHdlIHNraXAgdGhlIG90aGVyIHRlc3RzLgorCitwcm9jIHNldF9sYW5nX2Mge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBpZiBbZ2RiX3Rlc3QgInNldCBsYW5ndWFnZSBjIiAiIiAic2V0IGxhbmd1YWdlIGMiXSB7CisJcmV0dXJuIDAKKyAgICB9CisKKyAgICBpZiBbZ2RiX3Rlc3QgInNob3cgbGFuZ3VhZ2UiICIuKiBzb3VyY2UgbGFuZ3VhZ2UgaXMgXCJjXCIuKiJdIHsKKwlyZXR1cm4gMAorICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworcHJvYyB0ZXN0X2ludGVnZXJfbGl0ZXJhbHNfYWNjZXB0ZWQge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICAjIFRlc3QgdmFyaW91cyBkZWNpbWFsIHZhbHVlcy4KKworICAgIGdkYl90ZXN0ICJwIDEyMyIgIiA9IDEyMyIKKyAgICBnZGJfdGVzdCAicCAtMTIzIiAiID0gLTEyMyIKKyAgICBnZGJfdGVzdCAicC9kIDEyMyIgIiA9IDEyMyIKKworICAgICMgVGVzdCB2YXJpb3VzIG9jdGFsIHZhbHVlcy4KKworICAgIGdkYl90ZXN0ICJwIDAxMjMiICIgPSA4MyIKKyAgICBnZGJfdGVzdCAicCAwMDEyMyIgIiA9IDgzIgorICAgIGdkYl90ZXN0ICJwIC0wMTIzIiAiID0gLTgzIgorICAgIGdkYl90ZXN0ICJwL28gMDEyMyIgIiA9IDAxMjMiCisKKyAgICAjIFRlc3QgdmFyaW91cyBoZXhhZGVjaW1hbCB2YWx1ZXMuCisKKyAgICBnZGJfdGVzdCAicCAweDEyMyIgIiA9IDI5MSIKKyAgICBnZGJfdGVzdCAicCAtMHgxMjMiICIgPSAtMjkxIgorICAgIGdkYl90ZXN0ICJwIDB4MDEyMyIgIiA9IDI5MSIKKyAgICBnZGJfdGVzdCAicCAtMHgwMTIzIiAiID0gLTI5MSIKKyAgICBnZGJfdGVzdCAicCAweEFCQ0RFRiIgIiA9IDExMjU5Mzc1IgorICAgIGdkYl90ZXN0ICJwIDB4YWJjZGVmIiAiID0gMTEyNTkzNzUiCisgICAgZ2RiX3Rlc3QgInAgMHhBYkNkRWYiICIgPSAxMTI1OTM3NSIKKyAgICBnZGJfdGVzdCAicC94IDB4MTIzIiAiID0gMHgxMjMiCit9CisKK3Byb2MgdGVzdF9jaGFyYWN0ZXJfbGl0ZXJhbHNfYWNjZXB0ZWQge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBnZGJfdGVzdCAicCAnYSciICIgPSA5NyAnYSciCisgICAgZ2RiX3Rlc3QgInAvYyAnYSciICIgPSA5NyAnYSciCisgICAgZ2RiX3Rlc3QgInAveCAnYSciICIgPSAweDYxIgorICAgIGdkYl90ZXN0ICJwL2QgJ2EnIiAiID0gOTciCisgICAgZ2RiX3Rlc3QgInAvdCAnYSciICIgPSAxMTAwMDAxIgorICAgIGdkYl90ZXN0ICJwICdcXDE0MSciICIgPSA5NyAnYSciCisgICAgZ2RiX3Rlc3QgInAveCAnXFwzNzcnIiAiID0gMHhmZiIKKyAgICAjIE5vdGUgInAgJ1wnJyIgPT4gIj0gMzkgJ1wnJyIKKyAgICBnZGJfdGVzdCAicCAnXFwnJyIgIiA9IDM5ICdcXFxcJyciCisgICAgIyBOb3RlICJwICdcXCciID0+ICI9IDkyICdcXCciCisgICAgZ2RiX3Rlc3QgInAgJ1xcXFwnIiAiID0gOTIgJ1xcXFxcXFxcJyIKK30KKworcHJvYyB0ZXN0X2ludGVnZXJfbGl0ZXJhbHNfcmVqZWN0ZWQge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICB0ZXN0X3ByaW50X3JlamVjdCAicCAweCIgCisgICAgZ2RiX3Rlc3QgInAgJyciICJFbXB0eSBjaGFyYWN0ZXIgY29uc3RhbnRcXC4iCisgICAgZ2RiX3Rlc3QgInAgJycnIiAiRW1wdHkgY2hhcmFjdGVyIGNvbnN0YW50XFwuIgorICAgIHRlc3RfcHJpbnRfcmVqZWN0ICJwICdcXCciCisKKyAgICAjIE5vdGUgdGhhdCB0aGlzIHR1cm5zIGludG8gInAgJ1xcXCciIGF0IGdkYidzIGlucHV0LgorICAgIHRlc3RfcHJpbnRfcmVqZWN0ICJwICdcXFxcXFwnIgorCisgICAgIyBUZXN0IHZhcmlvdXMgZGVjaW1hbCB2YWx1ZXMuCisKKyAgICB0ZXN0X3ByaW50X3JlamVjdCAicCBERUFEQkVFRiIKKworICAgICMgR2RiIGN1cnJlbnRseSBmYWlscyB0aGlzIHRlc3QgZm9yIGFsbCBjb25maWd1cmF0aW9ucy4gIFRoZSBDCisgICAgIyBsZXhlciB0aGlua3MgdGhhdCAxMjNERUFEQkVFRiBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgYnV0CisgICAgIyB0aGVuIGZhaWxzIHRvIG5vdGljZSB0aGF0IGF0b2YoKSBvbmx5IGVhdHMgdGhlIDEyMyBwYXJ0LgorICAgICMgRklYTUU6ICBUaGlzIHNob3VsZCBiZSBwdXQgaW50byBQUk1TLgorICAgICMgRml4ZWQsIDQvMjUvOTcsIGJ5IEJvYiBNYW5zb24uCisKKyAgICB0ZXN0X3ByaW50X3JlamVjdCAicCAxMjNERUFEQkVFRiIKKyAgICB0ZXN0X3ByaW50X3JlamVjdCAicCAxMjNmb29iYXIuYmF6Zm9vMyIKKyAgICB0ZXN0X3ByaW50X3JlamVjdCAicCAxMjNFRUVFRUVFRUVFRUVFRUVFRTMzMzMzazMzMyIKKyAgICBnZGJfdGVzdCAicCAxMjMuNCs1Ni43IiAiMTgwLigwOTlcWzAtOV0qfDEwMFxbMC05XF0qKSIgImNoZWNrIGZvciBmbG9hdGluZyBhZGRpdGlvbiIKKworICAgICMgVGVzdCB2YXJpb3VzIG9jdGFsIHZhbHVlcy4KKworICAgIHRlc3RfcHJpbnRfcmVqZWN0ICJwIDA5IiAKKyAgICB0ZXN0X3ByaW50X3JlamVjdCAicCAwNzkiIAorCisgICAgIyBUZXN0IHZhcmlvdXMgaGV4YWRlY2ltYWwgdmFsdWVzLgorCisgICAgdGVzdF9wcmludF9yZWplY3QgInAgMHhHIiAKKyAgICB0ZXN0X3ByaW50X3JlamVjdCAicCAweEFHIiAKK30KKworcHJvYyB0ZXN0X3ByaW50X2FsbF9jaGFycyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzBcXSIgICAiID0gMCAnXFxcXDAwMCciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMVxdIiAgICIgPSAxICdcXFxcMDAxJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyXF0iICAgIiA9IDIgJ1xcXFwwMDInIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzNcXSIgICAiID0gMyAnXFxcXDAwMyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbNFxdIiAgICIgPSA0ICdcXFxcMDA0JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs1XF0iICAgIiA9IDUgJ1xcXFwwMDUnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzZcXSIgICAiID0gNiAnXFxcXDAwNiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbN1xdIiAgICIgPSA3ICdcXFxcYSciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbOFxdIiAgICIgPSA4ICdcXFxcYiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbOVxdIiAgICIgPSA5ICdcXFxcdCciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTBcXSIgICIgPSAxMCAnXFxcXG4nIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzExXF0iICAiID0gMTEgJ1xcXFwwMTMnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzEyXF0iICAiID0gMTIgJ1xcXFxmJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxM1xdIiAgIiA9IDEzICdcXFxcciciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTRcXSIgICIgPSAxNCAnXFxcXDAxNiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTVcXSIgICIgPSAxNSAnXFxcXDAxNyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTZcXSIgICIgPSAxNiAnXFxcXDAyMCciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTdcXSIgICIgPSAxNyAnXFxcXDAyMSciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMThcXSIgICIgPSAxOCAnXFxcXDAyMiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTlcXSIgICIgPSAxOSAnXFxcXDAyMyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjBcXSIgICIgPSAyMCAnXFxcXDAyNCciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjFcXSIgICIgPSAyMSAnXFxcXDAyNSciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjJcXSIgICIgPSAyMiAnXFxcXDAyNiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjNcXSIgICIgPSAyMyAnXFxcXDAyNyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjRcXSIgICIgPSAyNCAnXFxcXDAzMCciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjVcXSIgICIgPSAyNSAnXFxcXDAzMSciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjZcXSIgICIgPSAyNiAnXFxcXDAzMiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjdcXSIgICIgPSAyNyAnXFxcXGUnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzI4XF0iICAiID0gMjggJ1xcXFwwMzQnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzI5XF0iICAiID0gMjkgJ1xcXFwwMzUnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzMwXF0iICAiID0gMzAgJ1xcXFwwMzYnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzMxXF0iICAiID0gMzEgJ1xcXFwwMzcnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzMyXF0iICAiID0gMzIgJyAnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzMzXF0iICAiID0gMzMgJyEnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzM0XF0iICAiID0gMzQgJ1wiJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFszNVxdIiAgIiA9IDM1ICcjJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFszNlxdIiAgIiA9IDM2ICdcXFwkJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFszN1xdIiAgIiA9IDM3ICclJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFszOFxdIiAgIiA9IDM4ICcmJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFszOVxdIiAgIiA9IDM5ICdcXFxcJyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbNDBcXSIgICIgPSA0MCAnXFwoJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs0MVxdIiAgIiA9IDQxICdcXCknIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzQyXF0iICAiID0gNDIgJ1xcKiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbNDNcXSIgICIgPSA0MyAnXFwrJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs0NFxdIiAgIiA9IDQ0ICcsJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs0NVxdIiAgIiA9IDQ1ICctJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs0NlxdIiAgIiA9IDQ2ICcuJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs0N1xdIiAgIiA9IDQ3ICcvJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs0OFxdIiAgIiA9IDQ4ICcwJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs0OVxdIiAgIiA9IDQ5ICcxJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs1MFxdIiAgIiA9IDUwICcyJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs1MVxdIiAgIiA9IDUxICczJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs1MlxdIiAgIiA9IDUyICc0JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs1M1xdIiAgIiA9IDUzICc1JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs1NFxdIiAgIiA9IDU0ICc2JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs1NVxdIiAgIiA9IDU1ICc3JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs1NlxdIiAgIiA9IDU2ICc4JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs1N1xdIiAgIiA9IDU3ICc5JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs1OFxdIiAgIiA9IDU4ICc6JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs1OVxdIiAgIiA9IDU5ICc7JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs2MFxdIiAgIiA9IDYwICc8JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs2MVxdIiAgIiA9IDYxICc9JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs2MlxdIiAgIiA9IDYyICc+JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs2M1xdIiAgIiA9IDYzICdcXD8nIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzY0XF0iICAiID0gNjQgJ0AnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzY1XF0iICAiID0gNjUgJ0EnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzY2XF0iICAiID0gNjYgJ0InIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzY3XF0iICAiID0gNjcgJ0MnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzY4XF0iICAiID0gNjggJ0QnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzY5XF0iICAiID0gNjkgJ0UnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzcwXF0iICAiID0gNzAgJ0YnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzcxXF0iICAiID0gNzEgJ0cnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzcyXF0iICAiID0gNzIgJ0gnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzczXF0iICAiID0gNzMgJ0knIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzc0XF0iICAiID0gNzQgJ0onIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzc1XF0iICAiID0gNzUgJ0snIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzc2XF0iICAiID0gNzYgJ0wnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzc3XF0iICAiID0gNzcgJ00nIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzc4XF0iICAiID0gNzggJ04nIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzc5XF0iICAiID0gNzkgJ08nIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzgwXF0iICAiID0gODAgJ1AnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzgxXF0iICAiID0gODEgJ1EnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzgyXF0iICAiID0gODIgJ1InIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzgzXF0iICAiID0gODMgJ1MnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzg0XF0iICAiID0gODQgJ1QnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzg1XF0iICAiID0gODUgJ1UnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzg2XF0iICAiID0gODYgJ1YnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzg3XF0iICAiID0gODcgJ1cnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzg4XF0iICAiID0gODggJ1gnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzg5XF0iICAiID0gODkgJ1knIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzkwXF0iICAiID0gOTAgJ1onIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzkxXF0iICAiID0gOTEgJ1xcXFsnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzkyXF0iICAiID0gOTIgJ1xcXFxcXFxcJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs5M1xdIiAgIiA9IDkzICdcXFxdJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFs5NFxdIiAgIiA9IDk0ICdcXF4nIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzk1XF0iICAiID0gOTUgJ18nIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzk2XF0iICAiID0gOTYgJ2AnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzk3XF0iICAiID0gOTcgJ2EnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzk4XF0iICAiID0gOTggJ2InIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzk5XF0iICAiID0gOTkgJ2MnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzEwMFxdIiAiID0gMTAwICdkJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxMDFcXSIgIiA9IDEwMSAnZSciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTAyXF0iICIgPSAxMDIgJ2YnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzEwM1xdIiAiID0gMTAzICdnJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxMDRcXSIgIiA9IDEwNCAnaCciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTA1XF0iICIgPSAxMDUgJ2knIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzEwNlxdIiAiID0gMTA2ICdqJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxMDdcXSIgIiA9IDEwNyAnayciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTA4XF0iICIgPSAxMDggJ2wnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzEwOVxdIiAiID0gMTA5ICdtJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxMTBcXSIgIiA9IDExMCAnbiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTExXF0iICIgPSAxMTEgJ28nIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzExMlxdIiAiID0gMTEyICdwJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxMTNcXSIgIiA9IDExMyAncSciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTE0XF0iICIgPSAxMTQgJ3InIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzExNVxdIiAiID0gMTE1ICdzJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxMTZcXSIgIiA9IDExNiAndCciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTE3XF0iICIgPSAxMTcgJ3UnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzExOFxdIiAiID0gMTE4ICd2JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxMTlcXSIgIiA9IDExOSAndyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTIwXF0iICIgPSAxMjAgJ3gnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzEyMVxdIiAiID0gMTIxICd5JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxMjJcXSIgIiA9IDEyMiAneiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTIzXF0iICIgPSAxMjMgJ1xbe1xdKyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTI0XF0iICIgPSAxMjQgJ1xbfFxdKyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTI1XF0iICIgPSAxMjUgJ1xbfVxdKyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTI2XF0iICIgPSAxMjYgJ1xbflxdJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxMjdcXSIgIiA9IDEyNyAnXFxcXDE3NyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTI4XF0iICIgPSAxMjggJ1xcXFwyMDAnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzEyOVxdIiAiID0gMTI5ICdcXFxcMjAxJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxMzBcXSIgIiA9IDEzMCAnXFxcXDIwMiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTMxXF0iICIgPSAxMzEgJ1xcXFwyMDMnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzEzMlxdIiAiID0gMTMyICdcXFxcMjA0JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxMzNcXSIgIiA9IDEzMyAnXFxcXDIwNSciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTM0XF0iICIgPSAxMzQgJ1xcXFwyMDYnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzEzNVxdIiAiID0gMTM1ICdcXFxcMjA3JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxMzZcXSIgIiA9IDEzNiAnXFxcXDIxMCciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTM3XF0iICIgPSAxMzcgJ1xcXFwyMTEnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzEzOFxdIiAiID0gMTM4ICdcXFxcMjEyJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxMzlcXSIgIiA9IDEzOSAnXFxcXDIxMyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTQwXF0iICIgPSAxNDAgJ1xcXFwyMTQnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE0MVxdIiAiID0gMTQxICdcXFxcMjE1JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxNDJcXSIgIiA9IDE0MiAnXFxcXDIxNiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTQzXF0iICIgPSAxNDMgJ1xcXFwyMTcnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE0NFxdIiAiID0gMTQ0ICdcXFxcMjIwJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxNDVcXSIgIiA9IDE0NSAnXFxcXDIyMSciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTQ2XF0iICIgPSAxNDYgJ1xcXFwyMjInIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE0N1xdIiAiID0gMTQ3ICdcXFxcMjIzJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxNDhcXSIgIiA9IDE0OCAnXFxcXDIyNCciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTQ5XF0iICIgPSAxNDkgJ1xcXFwyMjUnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE1MFxdIiAiID0gMTUwICdcXFxcMjI2JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxNTFcXSIgIiA9IDE1MSAnXFxcXDIyNyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTUyXF0iICIgPSAxNTIgJ1xcXFwyMzAnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE1M1xdIiAiID0gMTUzICdcXFxcMjMxJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxNTRcXSIgIiA9IDE1NCAnXFxcXDIzMiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTU1XF0iICIgPSAxNTUgJ1xcXFwyMzMnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE1NlxdIiAiID0gMTU2ICdcXFxcMjM0JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxNTdcXSIgIiA9IDE1NyAnXFxcXDIzNSciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTU4XF0iICIgPSAxNTggJ1xcXFwyMzYnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE1OVxdIiAiID0gMTU5ICdcXFxcMjM3JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxNjBcXSIgIiA9IDE2MCAnXFxcXDI0MCciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTYxXF0iICIgPSAxNjEgJ1xcXFwyNDEnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE2MlxdIiAiID0gMTYyICdcXFxcMjQyJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxNjNcXSIgIiA9IDE2MyAnXFxcXDI0MyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTY0XF0iICIgPSAxNjQgJ1xcXFwyNDQnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE2NVxdIiAiID0gMTY1ICdcXFxcMjQ1JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxNjZcXSIgIiA9IDE2NiAnXFxcXDI0NiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTY3XF0iICIgPSAxNjcgJ1xcXFwyNDcnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE2OFxdIiAiID0gMTY4ICdcXFxcMjUwJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxNjlcXSIgIiA9IDE2OSAnXFxcXDI1MSciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTcwXF0iICIgPSAxNzAgJ1xcXFwyNTInIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE3MVxdIiAiID0gMTcxICdcXFxcMjUzJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxNzJcXSIgIiA9IDE3MiAnXFxcXDI1NCciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTczXF0iICIgPSAxNzMgJ1xcXFwyNTUnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE3NFxdIiAiID0gMTc0ICdcXFxcMjU2JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxNzVcXSIgIiA9IDE3NSAnXFxcXDI1NyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTc2XF0iICIgPSAxNzYgJ1xcXFwyNjAnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE3N1xdIiAiID0gMTc3ICdcXFxcMjYxJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxNzhcXSIgIiA9IDE3OCAnXFxcXDI2MiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTc5XF0iICIgPSAxNzkgJ1xcXFwyNjMnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE4MFxdIiAiID0gMTgwICdcXFxcMjY0JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxODFcXSIgIiA9IDE4MSAnXFxcXDI2NSciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTgyXF0iICIgPSAxODIgJ1xcXFwyNjYnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE4M1xdIiAiID0gMTgzICdcXFxcMjY3JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxODRcXSIgIiA9IDE4NCAnXFxcXDI3MCciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTg1XF0iICIgPSAxODUgJ1xcXFwyNzEnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE4NlxdIiAiID0gMTg2ICdcXFxcMjcyJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxODdcXSIgIiA9IDE4NyAnXFxcXDI3MyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTg4XF0iICIgPSAxODggJ1xcXFwyNzQnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE4OVxdIiAiID0gMTg5ICdcXFxcMjc1JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxOTBcXSIgIiA9IDE5MCAnXFxcXDI3NiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTkxXF0iICIgPSAxOTEgJ1xcXFwyNzcnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE5MlxdIiAiID0gMTkyICdcXFxcMzAwJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxOTNcXSIgIiA9IDE5MyAnXFxcXDMwMSciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTk0XF0iICIgPSAxOTQgJ1xcXFwzMDInIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE5NVxdIiAiID0gMTk1ICdcXFxcMzAzJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxOTZcXSIgIiA9IDE5NiAnXFxcXDMwNCciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMTk3XF0iICIgPSAxOTcgJ1xcXFwzMDUnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzE5OFxdIiAiID0gMTk4ICdcXFxcMzA2JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxOTlcXSIgIiA9IDE5OSAnXFxcXDMwNyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjAwXF0iICIgPSAyMDAgJ1xcXFwzMTAnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzIwMVxdIiAiID0gMjAxICdcXFxcMzExJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyMDJcXSIgIiA9IDIwMiAnXFxcXDMxMiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjAzXF0iICIgPSAyMDMgJ1xcXFwzMTMnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzIwNFxdIiAiID0gMjA0ICdcXFxcMzE0JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyMDVcXSIgIiA9IDIwNSAnXFxcXDMxNSciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjA2XF0iICIgPSAyMDYgJ1xcXFwzMTYnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzIwN1xdIiAiID0gMjA3ICdcXFxcMzE3JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyMDhcXSIgIiA9IDIwOCAnXFxcXDMyMCciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjA5XF0iICIgPSAyMDkgJ1xcXFwzMjEnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzIxMFxdIiAiID0gMjEwICdcXFxcMzIyJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyMTFcXSIgIiA9IDIxMSAnXFxcXDMyMyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjEyXF0iICIgPSAyMTIgJ1xcXFwzMjQnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzIxM1xdIiAiID0gMjEzICdcXFxcMzI1JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyMTRcXSIgIiA9IDIxNCAnXFxcXDMyNiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjE1XF0iICIgPSAyMTUgJ1xcXFwzMjcnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzIxNlxdIiAiID0gMjE2ICdcXFxcMzMwJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyMTdcXSIgIiA9IDIxNyAnXFxcXDMzMSciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjE4XF0iICIgPSAyMTggJ1xcXFwzMzInIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzIxOVxdIiAiID0gMjE5ICdcXFxcMzMzJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyMjBcXSIgIiA9IDIyMCAnXFxcXDMzNCciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjIxXF0iICIgPSAyMjEgJ1xcXFwzMzUnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzIyMlxdIiAiID0gMjIyICdcXFxcMzM2JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyMjNcXSIgIiA9IDIyMyAnXFxcXDMzNyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjI0XF0iICIgPSAyMjQgJ1xcXFwzNDAnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzIyNVxdIiAiID0gMjI1ICdcXFxcMzQxJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyMjZcXSIgIiA9IDIyNiAnXFxcXDM0MiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjI3XF0iICIgPSAyMjcgJ1xcXFwzNDMnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzIyOFxdIiAiID0gMjI4ICdcXFxcMzQ0JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyMjlcXSIgIiA9IDIyOSAnXFxcXDM0NSciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjMwXF0iICIgPSAyMzAgJ1xcXFwzNDYnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzIzMVxdIiAiID0gMjMxICdcXFxcMzQ3JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyMzJcXSIgIiA9IDIzMiAnXFxcXDM1MCciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjMzXF0iICIgPSAyMzMgJ1xcXFwzNTEnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzIzNFxdIiAiID0gMjM0ICdcXFxcMzUyJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyMzVcXSIgIiA9IDIzNSAnXFxcXDM1MyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjM2XF0iICIgPSAyMzYgJ1xcXFwzNTQnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzIzN1xdIiAiID0gMjM3ICdcXFxcMzU1JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyMzhcXSIgIiA9IDIzOCAnXFxcXDM1NiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjM5XF0iICIgPSAyMzkgJ1xcXFwzNTcnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzI0MFxdIiAiID0gMjQwICdcXFxcMzYwJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyNDFcXSIgIiA9IDI0MSAnXFxcXDM2MSciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjQyXF0iICIgPSAyNDIgJ1xcXFwzNjInIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzI0M1xdIiAiID0gMjQzICdcXFxcMzYzJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyNDRcXSIgIiA9IDI0NCAnXFxcXDM2NCciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjQ1XF0iICIgPSAyNDUgJ1xcXFwzNjUnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzI0NlxdIiAiID0gMjQ2ICdcXFxcMzY2JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyNDdcXSIgIiA9IDI0NyAnXFxcXDM2NyciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjQ4XF0iICIgPSAyNDggJ1xcXFwzNzAnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzI0OVxdIiAiID0gMjQ5ICdcXFxcMzcxJyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyNTBcXSIgIiA9IDI1MCAnXFxcXDM3MiciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjUxXF0iICIgPSAyNTEgJ1xcXFwzNzMnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzI1MlxdIiAiID0gMjUyICdcXFxcMzc0JyIKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsyNTNcXSIgIiA9IDI1MyAnXFxcXDM3NSciCisgICAgZ2RiX3Rlc3QgInAgY3RhYmxlMVxbMjU0XF0iICIgPSAyNTQgJ1xcXFwzNzYnIgorICAgIGdkYl90ZXN0ICJwIGN0YWJsZTFcWzI1NVxdIiAiID0gMjU1ICdcXFxcMzc3JyIKK30KKworIyBUZXN0IGludGVyYWN0aW9uIG9mIHRoZSBudW1iZXIgb2YgcHJpbnQgZWxlbWVudHMgdG8gcHJpbnQgYW5kIHRoZQorIyByZXBlYXQgY291bnQsIHNldCB0byB0aGUgZGVmYXVsdCBvZiAxMC4KKworcHJvYyB0ZXN0X3ByaW50X3JlcGVhdHNfMTAge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBmb3IgeyBzZXQgeCAxOyB9IHsgJHggPD0gMTYgfSB7IGluY3IgeDsgfSB7CisJZ2RiX3Rlc3QgInNldCBwcmludCBlbGVtZW50cyAkeCIgIiIgIiIKKwlmb3IgeyBzZXQgZSAxOyB9IHsgJGUgPD0gMTYgfSB7aW5jciBlOyB9IHsKKwkgICAgc2V0IHYgW2V4cHIgJGUgLSAxXTsKKwkgICAgc2V0IGNvbW1hbmQgInAgJmN0YWJsZTJcWyR7dn0qMTZcXSIKKwkgICAgaWYgeyAkeCA8ICRlIH0geworCQlzZXQgYXZhbCAkeDsKKwkgICAgfSBlbHNlIHsKKwkJc2V0IGF2YWwgJGU7CisJICAgIH0KKwkgICAgc2V0IHh2YWwgW2V4cHIgJHggLSAkZV07CisJICAgIGlmIHsgJHh2YWwgPCAwIH0geworCQlzZXQgeHZhbCAwOworCSAgICB9CisJICAgIGlmIHsgJGF2YWwgPiAxMCB9IHsKKwkJc2V0IGEgIidhJyA8cmVwZWF0cyAkYXZhbCB0aW1lcz4iOworCQlpZiB7ICR4dmFsID4gMCB9IHsKKwkJICAgIHNldCBhICIke2F9LCBcXFwiIjsKKwkJfQorCSAgICB9IGVsc2UgeworCQlzZXQgYSAiXFxcIltzdHJpbmcgcmFuZ2UgImFhYWFhYWFhYWFhYWFhYWEiIDEgJGF2YWxdIjsKKwkJaWYgeyAkeHZhbCA+IDEwIH0geworCQkgICAgc2V0IGEgIiRhXFxcIiwgIjsKKwkJfQorCSAgICB9CisJICAgIHNldCB4c3RyICIiOworCSAgICBpZiB7ICR4dmFsID4gMTAgfSB7CisJCXNldCB4c3RyICInWCcgPHJlcGVhdHMgJHh2YWwgdGltZXM+IjsKKwkgICAgfSBlbHNlIHsKKwkJaWYgeyAkeHZhbCA+IDAgfSB7CisJCSAgICBzZXQgeHN0ciAiW3N0cmluZyByYW5nZSAiWFhYWFhYWFhYWFhYWFhYWCIgMSAkeHZhbF1cXFwiIjsKKwkJfSBlbHNlIHsKKwkJICAgIGlmIHsgJGF2YWwgPD0gMTAgfSB7CisJCQlzZXQgeHN0ciAiXFxcIiI7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICBpZiB7ICRhdmFsIDwgMTYgfSB7CisJCXNldCB4c3RyICIke3hzdHJ9XFsuXF1cWy5cXVxbLlxdIgorCSAgICB9CisJICAgIHNldCBzdHJpbmcgIiA9IFxbKFxddW5zaWduZWQgY2hhciBcWypcXVxbKVxdICR7YX0ke3hzdHJ9IjsKKwkgICAgZ2RiX3Rlc3QgIiRjb21tYW5kIiAiJHN0cmluZyIgIiRjb21tYW5kIHdpdGggcHJpbnQgZWxlbWVudHMgc2V0IHRvICR4IjsKKwl9CisgICAgfQorfQorCitwcm9jIHRlc3RfcHJpbnRfc3RyaW5ncyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgICMgV2UgYWNjZXB0ICIodW5zaWduZWQgY2hhciAqKSAiIGJlZm9yZSB0aGUgc3RyaW5nLiAgY2hhciB2cy4gdW5zaWduZWQgY2hhcgorICAgICMgaXMgYWxyZWFkeSB0ZXN0ZWQgZWxzZXdoZXJlLgorCisgICAgIyBUZXN0IHRoYXQgc2V0dGluZyBwcmludCBlbGVtZW50cyB1bmxpbWl0ZWQgZG9lc24ndCBjb21wbGV0ZWx5IHN1cHByZXNzCisgICAgIyBwcmludGluZzsgdGhpcyB3YXMgYSBidWcgaW4gb2xkZXIgZ2RiJ3MuCisgICAgZ2RiX3Rlc3QgInNldCBwcmludCBlbGVtZW50cyAwIiAiIiAiIgorICAgIGdkYl90ZXN0ICJwIHRlc3RzdHJpbmciIFwKKwkiID0gKC51bnNpZ25lZCBjaGFyIC4uICk/XCJ0ZXN0c3RyaW5nIGNvbnRlbnRzXCIiICJwIHRlc3RzdHJpbmcgd2l0aCBlbGVtZW50cyBzZXQgdG8gMCIKKyAgICBnZGJfdGVzdCAic2V0IHByaW50IGVsZW1lbnRzIDEiICIiICIiCisgICAgZ2RiX3Rlc3QgInAgdGVzdHN0cmluZyIgXAorCSIgPSAoLnVuc2lnbmVkIGNoYXIgLi4gKT9cInRcIlxcLlxcLlxcLiIgInAgdGVzdHN0cmluZyB3aXRoIGVsZW1lbnRzIHNldCB0byAxIgorICAgIGdkYl90ZXN0ICJzZXQgcHJpbnQgZWxlbWVudHMgNSIgIiIgIiIKKyAgICBnZGJfdGVzdCAicCB0ZXN0c3RyaW5nIiBcCisJIiA9ICgudW5zaWduZWQgY2hhciAuLiApP1widGVzdHNcIlxcLlxcLlxcLiIgInAgdGVzdHN0cmluZyB3aXRoIGVsZW1lbnRzIHNldCB0byA1IgorICAgIGdkYl90ZXN0ICJzZXQgcHJpbnQgZWxlbWVudHMgMTkiICIiICIiCisgICAgZ2RiX3Rlc3QgInAgdGVzdHN0cmluZyIgXAorCSIgPSAoLnVuc2lnbmVkIGNoYXIgLi4gKT9cInRlc3RzdHJpbmcgY29udGVudHNcIiIgInAgdGVzdHN0cmluZyB3aXRoIGVsZW1lbnRzIHNldCB0byAxOSIKKyAgICBnZGJfdGVzdCAic2V0IHByaW50IGVsZW1lbnRzIDIwIiAiIiAiIgorICAgIGdkYl90ZXN0ICJwIHRlc3RzdHJpbmciIFwKKwkiID0gKC51bnNpZ25lZCBjaGFyIC4uICk/XCJ0ZXN0c3RyaW5nIGNvbnRlbnRzXCIiICJwIHRlc3RzdHJpbmcgd2l0aCBlbGVtZW50cyBzZXQgdG8gMjAiCisKKyAgICBnZGJfdGVzdCAic2V0IHByaW50IGVsZW1lbnRzIDgiICIiICIiCisKKyAgICBnZGJfdGVzdCAicCAmY3RhYmxlMVxbMFxdIiBcCisJIiA9IFxcKHVuc2lnbmVkIGNoYXIgXFwqXFwpIFwiXCIiCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzFcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIlxcXFwwMDFcXFxcMDAyXFxcXDAwM1xcXFwwMDRcXFxcMDA1XFxcXDAwNlxcXFxhXFxcXGJcIi4uLiIKKyAgICBnZGJfdGVzdCAicCAmY3RhYmxlMVxbMSo4XF0iIFwKKwkiID0gXFwodW5zaWduZWQgY2hhciBcXCpcXCkgXCJcXFxcYlxcXFx0XFxcXG5cXFxcMDEzXFxcXGZcXFxcclxcXFwwMTZcXFxcMDE3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzIqOFxdIiBcCisJIiA9IFxcKHVuc2lnbmVkIGNoYXIgXFwqXFwpIFwiXFxcXDAyMFxcXFwwMjFcXFxcMDIyXFxcXDAyM1xcXFwwMjRcXFxcMDI1XFxcXDAyNlxcXFwwMjdcIi4uLiIKKyAgICBnZGJfdGVzdCAicCAmY3RhYmxlMVxbMyo4XF0iIFwKKwkiID0gXFwodW5zaWduZWQgY2hhciBcXCpcXCkgXCJcXFxcMDMwXFxcXDAzMVxcXFwwMzJcXFxcZVxcXFwwMzRcXFxcMDM1XFxcXDAzNlxcXFwwMzdcIi4uLiIKKyAgICBnZGJfdGVzdCAicCAmY3RhYmxlMVxbNCo4XF0iIFwKKwkiID0gXFwodW5zaWduZWQgY2hhciBcXCpcXCkgXCIgIVxcXFxcIiNcXFwkJSYnXCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzUqOFxdIiBcCisJIiA9IFxcKHVuc2lnbmVkIGNoYXIgXFwqXFwpIFwiXFwoXFwpXFwqXFwrLC0uL1wiLi4uIgorICAgIGdkYl90ZXN0ICJwICZjdGFibGUxXFs2KjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIjAxMjM0NTY3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzcqOFxdIiBcCisJIiA9IFxcKHVuc2lnbmVkIGNoYXIgXFwqXFwpIFwiODk6Ozw9PlxcP1wiLi4uIgorICAgIGdkYl90ZXN0ICJwICZjdGFibGUxXFs4KjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIkBBQkNERUZHXCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzkqOFxdIiBcCisJIiA9IFxcKHVuc2lnbmVkIGNoYXIgXFwqXFwpIFwiSElKS0xNTk9cIi4uLiIKKyAgICBnZGJfdGVzdCAicCAmY3RhYmxlMVxbMTAqOFxdIiBcCisJIiA9IFxcKHVuc2lnbmVkIGNoYXIgXFwqXFwpIFwiUFFSU1RVVldcIi4uLiIKKyAgICBnZGJfdGVzdCAicCAmY3RhYmxlMVxbMTEqOFxdIiBcCisJIiA9IFxcKHVuc2lnbmVkIGNoYXIgXFwqXFwpIFwiWFlaXFxcW1xcXFxcXFxcXFxcXVxcXl9cIi4uLiIKKyAgICBnZGJfdGVzdCAicCAmY3RhYmxlMVxbMTIqOFxdIiBcCisJIiA9IFxcKHVuc2lnbmVkIGNoYXIgXFwqXFwpIFwiYGFiY2RlZmdcIi4uLiIKKyAgICBnZGJfdGVzdCAicCAmY3RhYmxlMVxbMTMqOFxdIiBcCisJIiA9IFxcKHVuc2lnbmVkIGNoYXIgXFwqXFwpIFwiaGlqa2xtbm9cIi4uLiIKKyAgICBnZGJfdGVzdCAicCAmY3RhYmxlMVxbMTQqOFxdIiBcCisJIiA9IFxcKHVuc2lnbmVkIGNoYXIgXFwqXFwpIFwicHFyc3R1dndcIi4uLiIKKyAgICBnZGJfdGVzdCAicCAmY3RhYmxlMVxbMTUqOFxdIiBcCisJIiA9IFxcKHVuc2lnbmVkIGNoYXIgXFwqXFwpIFwieHl6XFt7fH1cXStcXH5cXFxcMTc3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzE2KjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIlxcXFwyMDBcXFxcMjAxXFxcXDIwMlxcXFwyMDNcXFxcMjA0XFxcXDIwNVxcXFwyMDZcXFxcMjA3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzE3KjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIlxcXFwyMTBcXFxcMjExXFxcXDIxMlxcXFwyMTNcXFxcMjE0XFxcXDIxNVxcXFwyMTZcXFxcMjE3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzE4KjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIlxcXFwyMjBcXFxcMjIxXFxcXDIyMlxcXFwyMjNcXFxcMjI0XFxcXDIyNVxcXFwyMjZcXFxcMjI3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzE5KjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIlxcXFwyMzBcXFxcMjMxXFxcXDIzMlxcXFwyMzNcXFxcMjM0XFxcXDIzNVxcXFwyMzZcXFxcMjM3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzIwKjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIlxcXFwyNDBcXFxcMjQxXFxcXDI0MlxcXFwyNDNcXFxcMjQ0XFxcXDI0NVxcXFwyNDZcXFxcMjQ3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzIxKjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIlxcXFwyNTBcXFxcMjUxXFxcXDI1MlxcXFwyNTNcXFxcMjU0XFxcXDI1NVxcXFwyNTZcXFxcMjU3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzIyKjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIlxcXFwyNjBcXFxcMjYxXFxcXDI2MlxcXFwyNjNcXFxcMjY0XFxcXDI2NVxcXFwyNjZcXFxcMjY3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzIzKjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIlxcXFwyNzBcXFxcMjcxXFxcXDI3MlxcXFwyNzNcXFxcMjc0XFxcXDI3NVxcXFwyNzZcXFxcMjc3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzI0KjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIlxcXFwzMDBcXFxcMzAxXFxcXDMwMlxcXFwzMDNcXFxcMzA0XFxcXDMwNVxcXFwzMDZcXFxcMzA3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzI1KjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIlxcXFwzMTBcXFxcMzExXFxcXDMxMlxcXFwzMTNcXFxcMzE0XFxcXDMxNVxcXFwzMTZcXFxcMzE3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzI2KjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIlxcXFwzMjBcXFxcMzIxXFxcXDMyMlxcXFwzMjNcXFxcMzI0XFxcXDMyNVxcXFwzMjZcXFxcMzI3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzI3KjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIlxcXFwzMzBcXFxcMzMxXFxcXDMzMlxcXFwzMzNcXFxcMzM0XFxcXDMzNVxcXFwzMzZcXFxcMzM3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzI4KjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIlxcXFwzNDBcXFxcMzQxXFxcXDM0MlxcXFwzNDNcXFxcMzQ0XFxcXDM0NVxcXFwzNDZcXFxcMzQ3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzI5KjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIlxcXFwzNTBcXFxcMzUxXFxcXDM1MlxcXFwzNTNcXFxcMzU0XFxcXDM1NVxcXFwzNTZcXFxcMzU3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzMwKjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIlxcXFwzNjBcXFxcMzYxXFxcXDM2MlxcXFwzNjNcXFxcMzY0XFxcXDM2NVxcXFwzNjZcXFxcMzY3XCIuLi4iCisgICAgZ2RiX3Rlc3QgInAgJmN0YWJsZTFcWzMxKjhcXSIgXAorCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKlxcKSBcIlxcXFwzNzBcXFxcMzcxXFxcXDM3MlxcXFwzNzNcXFxcMzc0XFxcXDM3NVxcXFwzNzZcXFxcMzc3XCIuLi4iCit9CisKK3Byb2MgdGVzdF9wcmludF9pbnRfYXJyYXlzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgZ2RiX3Rlc3QgInNldCBwcmludCBlbGVtZW50cyAyNCIgIiIgIiIKKworICAgIGdkYl90ZXN0ICJwIGludDFkaW0iIFwKKwkiID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMX0iCisgICAgZ2RiX3Rlc3QgInAgaW50MmRpbSIgXAorCSIgPSB7ezAsIDEsIDIsIDN9LCB7NCwgNSwgNiwgN30sIHs4LCA5LCAxMCwgMTF9fSIKKyAgICBnZGJfdGVzdCAicCBpbnQzZGltIiBcCisJIiA9IHt7ezAsIDF9LCB7MiwgM30sIHs0LCA1fX0sIHt7NiwgN30sIHs4LCA5fSwgezEwLCAxMX19fSIKKyAgICBnZGJfdGVzdCAicCBpbnQ0ZGltIiBcCisJIiA9IHt7e3swLCAxfSwgezIsIDN9LCB7NCwgNX19LCB7ezYsIDd9LCB7OCwgOX0sIHsxMCwgMTF9fX19IgorfQorCitwcm9jIHRlc3RfYXJ0aWZpY2lhbF9hcnJheXMge30geworICAgICMgU2VuZCBcMDI2QCBpbnN0ZWFkIG9mIGp1c3QgQCBpbiBjYXNlIHRoZSBraWxsIGNoYXJhY3RlciBpcyBALgorICAgIGdkYl90ZXN0ICJwIGludDFkaW1cWzBcXVwwMjZAMiIgIiA9IHswLCAxfSIge3AgaW50MWRpbVswXUAyfQorICAgIGdkYl90ZXN0ICJwIGludDFkaW1cWzBcXVwwMjZAMlwwMjZAMyIgXAorCSIoe3swLCAxfSwgezIsIDN9LCB7NCwgNX19fFxbQ2NcXWFubm90LiopIiBcCisJe3AgaW50MWRpbVswXUAyQDN9CisgICAgZ2RiX3Rlc3Qge3AveCAoc2hvcnQgW10pMHgxMjM0NTY3OH0gXAorCSIgPSAoezB4MTIzNCwgMHg1Njc4fXx7MHg1Njc4LCAweDEyMzR9KSIKK30KKworcHJvYyB0ZXN0X3ByaW50X2NoYXJfYXJyYXlzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKworICAgIGdkYl90ZXN0ICJzZXQgcHJpbnQgZWxlbWVudHMgMjQiICIiICIiCisgICAgZ2RiX3Rlc3QgInNldCBwcmludCBhZGRyZXNzIG9uIiAiIiAiIgorCisgICAgZ2RiX3Rlc3QgInAgYXJyYXlzIiBcCisJIiA9IHthcnJheTEgPSBcImFiY1wiLCBhcnJheTIgPSBcImRcIiwgYXJyYXkzID0gXCJlXCIsIGFycmF5NCA9IFwiZmdcIiwgYXJyYXk1ID0gXCJoaWpcIn0iCisKKyAgICBnZGJfdGVzdCAicCBwYXJyYXlzIgkJIiA9IFxcKHN0cnVjdCBzb21lX2FycmF5cyBcXCpcXCkgJGhleCIKKyAgICBnZGJfdGVzdCAicCBwYXJyYXlzLT5hcnJheTEiCSIgPSBcImFiY1wiIgorICAgIGdkYl90ZXN0ICJwICZwYXJyYXlzLT5hcnJheTEiCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKFxcKlxcKVxcXFs0XFxcXVxcKSAkaGV4IgorICAgIGdkYl90ZXN0ICJwIHBhcnJheXMtPmFycmF5MiIJIiA9IFwiZFwiIgorICAgIGdkYl90ZXN0ICJwICZwYXJyYXlzLT5hcnJheTIiCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKFxcKlxcKVxcXFsxXFxcXVxcKSAkaGV4IgorICAgIGdkYl90ZXN0ICJwIHBhcnJheXMtPmFycmF5MyIJIiA9IFwiZVwiIgorICAgIGdkYl90ZXN0ICJwICZwYXJyYXlzLT5hcnJheTMiCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKFxcKlxcKVxcXFsxXFxcXVxcKSAkaGV4IgorICAgIGdkYl90ZXN0ICJwIHBhcnJheXMtPmFycmF5NCIJIiA9IFwiZmdcIiIKKyAgICBnZGJfdGVzdCAicCAmcGFycmF5cy0+YXJyYXk0IgkiID0gXFwodW5zaWduZWQgY2hhciBcXChcXCpcXClcXFxbMlxcXF1cXCkgJGhleCIKKyAgICBnZGJfdGVzdCAicCBwYXJyYXlzLT5hcnJheTUiCSIgPSBcImhpalwiIgorICAgIGdkYl90ZXN0ICJwICZwYXJyYXlzLT5hcnJheTUiCSIgPSBcXCh1bnNpZ25lZCBjaGFyIFxcKFxcKlxcKVxcXFs0XFxcXVxcKSAkaGV4IgorCisgICAgZ2RiX3Rlc3QgInNldCBwcmludCBhZGRyZXNzIG9mZiIgIiIgIiIKK30KKworcHJvYyB0ZXN0X3ByaW50X3N0cmluZ19jb25zdGFudHMge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBnZGJfdGVzdCAic2V0IHByaW50IGVsZW1lbnRzIDUwIiAiIiAiIgorCisgICAgaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGIsY2Fubm90X2NhbGxfZnVuY3Rpb25zXSB7CisJc2V0dXBfeGZhaWwgIiotKi0qIiAyNDE2CisJZmFpbCAiVGhpcyB0YXJnZXQgY2FuIG5vdCBjYWxsIGZ1bmN0aW9ucyIKKwlyZXR1cm4KKyAgICB9CisKKyAgICBzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIgMjQxNgorICAgIGdkYl90ZXN0ICJwIFwiYSBzdHJpbmdcIiIJCSIgPSBcImEgc3RyaW5nXCIiCisgICAgc2V0dXBfeGZhaWwgImEyOWstKi11ZGkiIDI0MTYKKyAgICBnZGJfdGVzdCAicCBcImVtYmVkZGVkIFxcMDAwIG51bGxcIiIgIiA9IFwiZW1iZWRkZWQgXFxcXDAwMCBudWxsXCIiCisgICAgc2V0dXBfeGZhaWwgImEyOWstKi11ZGkiIDI0MTYKKyAgICBnZGJfdGVzdCAicCBcImFiY2RcIlxbMlxdIgkiID0gOTkgJ2MnIgorICAgIHNldHVwX3hmYWlsICJhMjlrLSotdWRpIiAyNDE2CisgICAgZ2RiX3Rlc3QgInAgc2l6ZW9mIChcImFiY2RlZlwiKSIJIiA9IDciCisgICAgc2V0dXBfeGZhaWwgImEyOWstKi11ZGkiIDI0MTYKKyAgICBnZGJfdGVzdCAicHR5cGUgXCJmb29cIiIJCSIgPSBjaGFyIFxcXFs0XFxcXSIKKyAgICBzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIgMjQxNgorICAgIGdkYl90ZXN0ICJwICpcImZvb1wiIgkJIiA9IDEwMiAnZiciCisgICAgc2V0dXBfeGZhaWwgImEyOWstKi11ZGkiIDI0MTYKKyAgICBnZGJfdGVzdCAicHR5cGUgKlwiZm9vXCIiCQkiID0gY2hhciIKKyAgICBzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIgMjQxNgorICAgIGdkYl90ZXN0ICJwICYqXCJmb29cIiIJCSIgPSBcImZvb1wiIgorICAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICBnZGJfdGVzdCAicHR5cGUgJipcImZvb1wiIgkidHlwZSA9IGNoYXIgXFwqIgorICAgIHNldHVwX3hmYWlsICJhMjlrLSotdWRpIiAyNDE2CisgICAgZ2RiX3Rlc3QgInAgKGNoYXIgKilcImZvb1wiIgkiID0gXCJmb29cIiIKK30KKworcHJvYyB0ZXN0X3ByaW50X2FycmF5X2NvbnN0YW50cyB7fSB7CisKKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYixjYW5ub3RfY2FsbF9mdW5jdGlvbnNdIHsKKwlzZXR1cF94ZmFpbCAiKi0qLSoiIDI0MTYKKwlmYWlsICJUaGlzIHRhcmdldCBjYW4gbm90IGNhbGwgZnVuY3Rpb25zIgorCXJldHVybgorICAgIH0KKworICAgIHNldHVwX3hmYWlsICJhMjlrLSotdWRpIiAyNDE2CisgICAgZ2RiX3Rlc3QgInByaW50IHsnYScsJ2InLCdjJ30iCSIgPSBcImFiY1wiIgorICAgIHNldHVwX3hmYWlsICJhMjlrLSotdWRpIiAyNDE2CisgICAgZ2RiX3Rlc3QgInByaW50IHswLDEsMn0iCQkiID0gezAsIDEsIDJ9IgorICAgIHNldHVwX3hmYWlsICJhMjlrLSotdWRpIiAyNDE2CisgICAgZ2RiX3Rlc3QgInByaW50IHsobG9uZykwLChsb25nKTEsKGxvbmcpMn0iCSIgPSB7MCwgMSwgMn0iCisgICAgc2V0dXBfeGZhaWwgImEyOWstKi11ZGkiIDI0MTYKKyAgICBnZGJfdGVzdCAicHJpbnQge3swLDEsMn0sezMsNCw1fX0iICAiID0ge3swLCAxLCAyfSwgezMsIDQsIDV9fSIKKyAgICBzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIgMjQxNgorICAgIGdkYl90ZXN0ICJwcmludCB7NCw1LDZ9XFsyXF0iCSIgPSA2IgorICAgIHNldHVwX3hmYWlsICJhMjlrLSotdWRpIiAyNDE2CisgICAgZ2RiX3Rlc3QgInByaW50IComezQsNSw2fVxbMVxdIgkiID0gNSIKK30KKworcHJvYyB0ZXN0X3ByaW50ZiB7fSB7CisgICAgZ2RiX3Rlc3QgInByaW50ZiBcIng9JWQseT0lZCx6PSVkXFxuXCIsIDUsIDYsIDciICJ4PTUseT02LHo9NyIKKyAgICBnZGJfdGVzdCAicHJpbnRmIFwic3RyaW5nPSUuNHN4eFxcblwiLCB0ZXN0c3RyaW5nIiAic3RyaW5nPXRlc3R4eCIKKyAgICBnZGJfdGVzdCAicHJpbnRmIFwic3RyaW5nPSVzeHhcXG5cIiwgdGVzdHN0cmluZyIgXAorCSJzdHJpbmc9dGVzdHN0cmluZyBjb250ZW50c3h4IgorCisgICAgZ2RiX3Rlc3QgInByaW50ZiBcIiVmIGlzIGZ1blxcblwiLCAxLjAiICIxXC4wKyBpcyBmdW4iCisKKyAgICAjIFRlc3QgbWl4aW5nIGFyZ3Mgb2YgZGlmZmVyZW50IHNpemVzLgorICAgIGdkYl90ZXN0ICJwcmludGYgXCJ4PSVkLHk9JWYsej0lZFxcblwiLCA1LCA2LjAsIDciICJ4PTUseT02XC4wKyx6PTciCisgICAgZ2RiX3Rlc3QgInByaW50ZiBcIiV4ICVmLCAlYyAleCwgJXgsICVmXFxuXCIsIDB4YmFkLCAtOTkuNTQxLCAneicsXAorMHhmZWVkZmFjZSwgMHhkZWFkYmVlZiwgNS4wIiAiYmFkIC05OS41NFxbMC05XF0rLCB6IGZlZWRmYWNlLCBkZWFkYmVlZiwgNS4wKyIKK30KKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKworZ2RiX3Rlc3QgInByaW50IFwkcGMiICJObyByZWdpc3RlcnNcXC4iCisjIEZJWE1FOiBzaG91bGQgYWxzbyB0ZXN0ICJwcmludCAkcGMiIHdoZW4gdGhlcmUgaXMgYW4gZXhlY2ZpbGUgYnV0IG5vCisjIHJlbW90ZSBkZWJ1Z2dpbmcgdGFyZ2V0LCBwcm9jZXNzIG9yIGNvcmVmaWxlLgorCitnZGJfbG9hZCAke2JpbmZpbGV9CisKK2dkYl90ZXN0ICJzZXQgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncyIgIiIKK2dkYl90ZXN0ICJzZXQgcHJpbnQgYWRkcmVzcyBvZmYiICIiICIiCitnZGJfdGVzdCAic2V0IHdpZHRoIDAiICIiCisKK2lmIFtzZXRfbGFuZ19jXSB0aGVuIHsKKyAgICBnZGJfdGVzdCAicCBjdGFibGUxXFsxMjBcXSIgIjEyMCAneCciICJwIGN0YWJsZTFcWzEyMFxdICMxIgorCisgICAgaWYgW3J1bnRvX21haW5dIHRoZW4geworCXRlc3RfaW50ZWdlcl9saXRlcmFsc19hY2NlcHRlZAorCXRlc3RfaW50ZWdlcl9saXRlcmFsc19yZWplY3RlZAorCXRlc3RfY2hhcmFjdGVyX2xpdGVyYWxzX2FjY2VwdGVkCisJdGVzdF9wcmludF9hbGxfY2hhcnMKKwl0ZXN0X3ByaW50X3JlcGVhdHNfMTAKKwl0ZXN0X3ByaW50X3N0cmluZ3MKKwl0ZXN0X3ByaW50X2ludF9hcnJheXMKKwl0ZXN0X2FydGlmaWNpYWxfYXJyYXlzCisJdGVzdF9wcmludF9jaGFyX2FycmF5cworIyBXZSB1c2VkIHRvIGRvIHRoZSBydW50byBtYWluIGhlcmUuCisJdGVzdF9wcmludF9zdHJpbmdfY29uc3RhbnRzCisJdGVzdF9wcmludF9hcnJheV9jb25zdGFudHMKKwl0ZXN0X3ByaW50ZgorICAgIH0KK30gZWxzZSB7CisgICAgZmFpbCAiQyBwcmludCBjb21tYW5kIHRlc3RzIHN1cHByZXNzZWQiCit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3B0eXBlLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3B0eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxMzQzNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvcHR5cGUuYwpAQCAtMCwwICsxLDMxMyBAQAorLyoKKyAqCVRlc3QgZmlsZSB3aXRoIGxvdHMgb2YgZGlmZmVyZW50IHR5cGVzLCBmb3IgdGVzdGluZyB0aGUKKyAqCSJwdHlwZSIgY29tbWFuZC4KKyAqLworCisvKgorICoJRmlyc3QgdGhlIGJhc2ljIEMgdHlwZXMuCisgKi8KKworI2lmICFkZWZpbmVkIChfX1NURENfXykgJiYgIWRlZmluZWQgKF9BSVgpCisjZGVmaW5lIHNpZ25lZCAgLyoqLworI2VuZGlmCisKK2NoYXIJCXZfY2hhcjsKK3NpZ25lZCBjaGFyCXZfc2lnbmVkX2NoYXI7Cit1bnNpZ25lZCBjaGFyCXZfdW5zaWduZWRfY2hhcjsKKworc2hvcnQJCXZfc2hvcnQ7CitzaWduZWQgc2hvcnQJdl9zaWduZWRfc2hvcnQ7Cit1bnNpZ25lZCBzaG9ydAl2X3Vuc2lnbmVkX3Nob3J0OworCitpbnQJCXZfaW50Oworc2lnbmVkIGludAl2X3NpZ25lZF9pbnQ7Cit1bnNpZ25lZCBpbnQJdl91bnNpZ25lZF9pbnQ7CisKK2xvbmcJCXZfbG9uZzsKK3NpZ25lZCBsb25nCXZfc2lnbmVkX2xvbmc7Cit1bnNpZ25lZCBsb25nCXZfdW5zaWduZWRfbG9uZzsKKworZmxvYXQJCXZfZmxvYXQ7Citkb3VibGUJCXZfZG91YmxlOworCisvKgorICoJTm93IHNvbWUgZGVyaXZlZCB0eXBlcywgd2hpY2ggYXJlIGFycmF5cywgZnVuY3Rpb25zLXJldHVybmluZywKKyAqCXBvaW50ZXJzLCBzdHJ1Y3R1cmVzLCB1bmlvbnMsIGFuZCBlbnVtZXJhdGlvbnMuCisgKi8KKworLyoqKiogYXJyYXlzICoqKioqKiovCisKK2NoYXIJCXZfY2hhcl9hcnJheVsyXTsKK3NpZ25lZCBjaGFyCXZfc2lnbmVkX2NoYXJfYXJyYXlbMl07Cit1bnNpZ25lZCBjaGFyCXZfdW5zaWduZWRfY2hhcl9hcnJheVsyXTsKKworc2hvcnQJCXZfc2hvcnRfYXJyYXlbMl07CitzaWduZWQgc2hvcnQJdl9zaWduZWRfc2hvcnRfYXJyYXlbMl07Cit1bnNpZ25lZCBzaG9ydAl2X3Vuc2lnbmVkX3Nob3J0X2FycmF5WzJdOworCitpbnQJCXZfaW50X2FycmF5WzJdOworc2lnbmVkIGludAl2X3NpZ25lZF9pbnRfYXJyYXlbMl07Cit1bnNpZ25lZCBpbnQJdl91bnNpZ25lZF9pbnRfYXJyYXlbMl07CisKK2xvbmcJCXZfbG9uZ19hcnJheVsyXTsKK3NpZ25lZCBsb25nCXZfc2lnbmVkX2xvbmdfYXJyYXlbMl07Cit1bnNpZ25lZCBsb25nCXZfdW5zaWduZWRfbG9uZ19hcnJheVsyXTsKKworZmxvYXQJCXZfZmxvYXRfYXJyYXlbMl07Citkb3VibGUJCXZfZG91YmxlX2FycmF5WzJdOworCisvKiBQUiAzNzQyICovCit0eXBlZGVmIGNoYXIgdF9jaGFyX2FycmF5W107CisKKy8qKioqIHBvaW50ZXJzICoqKioqKiovCisKK2NoYXIJCSp2X2NoYXJfcG9pbnRlcjsKK3NpZ25lZCBjaGFyCSp2X3NpZ25lZF9jaGFyX3BvaW50ZXI7Cit1bnNpZ25lZCBjaGFyCSp2X3Vuc2lnbmVkX2NoYXJfcG9pbnRlcjsKKworc2hvcnQJCSp2X3Nob3J0X3BvaW50ZXI7CitzaWduZWQgc2hvcnQJKnZfc2lnbmVkX3Nob3J0X3BvaW50ZXI7Cit1bnNpZ25lZCBzaG9ydAkqdl91bnNpZ25lZF9zaG9ydF9wb2ludGVyOworCitpbnQJCSp2X2ludF9wb2ludGVyOworc2lnbmVkIGludAkqdl9zaWduZWRfaW50X3BvaW50ZXI7Cit1bnNpZ25lZCBpbnQJKnZfdW5zaWduZWRfaW50X3BvaW50ZXI7CisKK2xvbmcJCSp2X2xvbmdfcG9pbnRlcjsKK3NpZ25lZCBsb25nCSp2X3NpZ25lZF9sb25nX3BvaW50ZXI7Cit1bnNpZ25lZCBsb25nCSp2X3Vuc2lnbmVkX2xvbmdfcG9pbnRlcjsKKworZmxvYXQJCSp2X2Zsb2F0X3BvaW50ZXI7Citkb3VibGUJCSp2X2RvdWJsZV9wb2ludGVyOworCisvKioqKiBzdHJ1Y3RzICoqKioqKiovCisKK3N0cnVjdCB0X3N0cnVjdCB7CisgICAgY2hhcgl2X2NoYXJfbWVtYmVyOworICAgIHNob3J0CXZfc2hvcnRfbWVtYmVyOworICAgIGludAkJdl9pbnRfbWVtYmVyOworICAgIGxvbmcJdl9sb25nX21lbWJlcjsKKyAgICBmbG9hdAl2X2Zsb2F0X21lbWJlcjsKKyAgICBkb3VibGUJdl9kb3VibGVfbWVtYmVyOworfSB2X3N0cnVjdDE7CisKK3N0cnVjdCB0X3N0cnVjdCAqdl90X3N0cnVjdF9wOworCitzdHJ1Y3QgeworICAgIGNoYXIJdl9jaGFyX21lbWJlcjsKKyAgICBzaG9ydAl2X3Nob3J0X21lbWJlcjsKKyAgICBpbnQJCXZfaW50X21lbWJlcjsKKyAgICBsb25nCXZfbG9uZ19tZW1iZXI7CisgICAgZmxvYXQJdl9mbG9hdF9tZW1iZXI7CisgICAgZG91YmxlCXZfZG91YmxlX21lbWJlcjsKK30gdl9zdHJ1Y3QyOworCisvKiB0eXBlZGVmJ2Qgc3RydWN0IHdpdGhvdXQgYSB0YWcuICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBkb3VibGUgdl9kb3VibGVfbWVtYmVyOworICBpbnQgdl9pbnRfbWVtYmVyOworfSB0X3N0cnVjdDM7CisvKiBHQ0Mgc2VlbXMgdG8gd2FudCBhIHZhcmlhYmxlIG9mIHRoaXMgdHlwZSwgb3IgZWxzZSBpdCB3b24ndCBwdXQgb3V0CisgICBhIHN5bWJvbC4gICovCit0X3N0cnVjdDMgdl9zdHJ1Y3QzOworCisvKioqKiB1bmlvbnMgKioqKioqKi8KKwordW5pb24gdF91bmlvbiB7CisgICAgY2hhcgl2X2NoYXJfbWVtYmVyOworICAgIHNob3J0CXZfc2hvcnRfbWVtYmVyOworICAgIGludAkJdl9pbnRfbWVtYmVyOworICAgIGxvbmcJdl9sb25nX21lbWJlcjsKKyAgICBmbG9hdAl2X2Zsb2F0X21lbWJlcjsKKyAgICBkb3VibGUJdl9kb3VibGVfbWVtYmVyOworfSB2X3VuaW9uOworCit1bmlvbiB7CisgICAgY2hhcgl2X2NoYXJfbWVtYmVyOworICAgIHNob3J0CXZfc2hvcnRfbWVtYmVyOworICAgIGludAkJdl9pbnRfbWVtYmVyOworICAgIGxvbmcJdl9sb25nX21lbWJlcjsKKyAgICBmbG9hdAl2X2Zsb2F0X21lbWJlcjsKKyAgICBkb3VibGUJdl9kb3VibGVfbWVtYmVyOworfSB2X3VuaW9uMjsKKworLyogdHlwZWRlZidkIHVuaW9uIHdpdGhvdXQgYSB0YWcuICAqLwordHlwZWRlZiB1bmlvbiB7CisgIGRvdWJsZSB2X2RvdWJsZV9tZW1iZXI7CisgIGludCB2X2ludF9tZW1iZXI7Cit9IHRfdW5pb24zOworLyogR0NDIHNlZW1zIHRvIHdhbnQgYSB2YXJpYWJsZSBvZiB0aGlzIHR5cGUsIG9yIGVsc2UgaXQgd29uJ3QgcHV0IG91dAorICAgYSBzeW1ib2wuICAqLwordF91bmlvbjMgdl91bmlvbjM7CisKKy8qKiogRnVuY3Rpb25zIHJldHVybmluZyB0eXBlICoqKioqKioqLworCitjaGFyCQl2X2NoYXJfZnVuYyAoKSB7IHJldHVybigwKTsgfQorc2lnbmVkIGNoYXIJdl9zaWduZWRfY2hhcl9mdW5jICgpIHsgcmV0dXJuICgwKTsgfQordW5zaWduZWQgY2hhcgl2X3Vuc2lnbmVkX2NoYXJfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KKworc2hvcnQJCXZfc2hvcnRfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KK3NpZ25lZCBzaG9ydAl2X3NpZ25lZF9zaG9ydF9mdW5jICgpIHsgcmV0dXJuICgwKTsgfQordW5zaWduZWQgc2hvcnQJdl91bnNpZ25lZF9zaG9ydF9mdW5jICgpIHsgcmV0dXJuICgwKTsgfQorCitpbnQJCXZfaW50X2Z1bmMgKCkgeyByZXR1cm4gKDApOyB9CitzaWduZWQgaW50CXZfc2lnbmVkX2ludF9mdW5jICgpIHsgcmV0dXJuICgwKTsgfQordW5zaWduZWQgaW50CXZfdW5zaWduZWRfaW50X2Z1bmMgKCkgeyByZXR1cm4gKDApOyB9CisKK2xvbmcJCXZfbG9uZ19mdW5jICgpIHsgcmV0dXJuICgwKTsgfQorc2lnbmVkIGxvbmcJdl9zaWduZWRfbG9uZ19mdW5jICgpIHsgcmV0dXJuICgwKTsgfQordW5zaWduZWQgbG9uZwl2X3Vuc2lnbmVkX2xvbmdfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KKworZmxvYXQJCXZfZmxvYXRfZnVuYyAoKSB7IHJldHVybiAoMC4wKTsgfQorZG91YmxlCQl2X2RvdWJsZV9mdW5jICgpIHsgcmV0dXJuICgwLjApOyB9CisKKy8qKioqIFNvbWUgbWlzYyBtb3JlIGNvbXBsaWNhdGVkIHRoaW5ncyAqKioqKioqLworCitzdHJ1Y3QgbGluayB7CisJc3RydWN0IGxpbmsgKm5leHQ7CisjaWZkZWYgX19TVERDX18KKwlzdHJ1Y3QgbGluayAqKCpsaW5rZnVuYykgKHN0cnVjdCBsaW5rICp0aGlzLCBpbnQgZmxhZ3MpOworI2Vsc2UKKwlzdHJ1Y3QgbGluayAqKCpsaW5rZnVuYykgKCk7CisjZW5kaWYKKwlzdHJ1Y3QgdF9zdHJ1Y3Qgc3R1ZmZbMV1bMl1bM107Cit9ICpzX2xpbms7CisKK3VuaW9uIHR1X2xpbmsgeworCXN0cnVjdCBsaW5rICpuZXh0OworI2lmZGVmIF9fU1REQ19fCisJc3RydWN0IGxpbmsgKigqbGlua2Z1bmMpIChzdHJ1Y3QgbGluayAqdGhpcywgaW50IGZsYWdzKTsKKyNlbHNlCisJc3RydWN0IGxpbmsgKigqbGlua2Z1bmMpICgpOworI2VuZGlmCisJc3RydWN0IHRfc3RydWN0IHN0dWZmWzFdWzJdWzNdOworfSB1X2xpbms7CisKK3N0cnVjdCBvdXRlcl9zdHJ1Y3QgeworCWludCBvdXRlcl9pbnQ7CisJc3RydWN0IGlubmVyX3N0cnVjdCB7CisJCWludCBpbm5lcl9pbnQ7CisJCWxvbmcgaW5uZXJfbG9uZzsKKwl9aW5uZXJfc3RydWN0X2luc3RhbmNlOworCXVuaW9uIGlubmVyX3VuaW9uIHsKKwkJaW50IGlubmVyX3VuaW9uX2ludDsKKwkJbG9uZyBpbm5lcl91bmlvbl9sb25nOworCX1pbm5lcl91bmlvbl9pbnN0YW5jZTsKKwlsb25nIG91dGVyX2xvbmc7Cit9IG5lc3RlZF9zdTsKKworLyoqKiogRW51bWVyYXRpb25zICoqKioqKiovCisKK2VudW0gCisvKiBXb3JrIGFyb3VuZCB0aGUgYnVnIGZvciBjb21waWxlcnMgd2hpY2ggZG9uJ3QgcHV0IG91dCB0aGUgcmlnaHQgc3RhYnMuICAqLworI2lmIF9fR05VQ19fIDwgMiAmJiAhZGVmaW5lZCAoX0FJWCkKK3ByaW1hcnkxX3RhZworI2VuZGlmCit7cmVkMSwgZ3JlZW4xLCBibHVlMX0gcHJpbWFyeTE7CisKK2VudW0ge3JlZCwgZ3JlZW4sIGJsdWV9IHByaW1hcnk7CitlbnVtIGNvbG9ycyB7eWVsbG93LCBwdXJwbGUsIHBpbmt9IG5vbnByaW1hcnk7CisKK2VudW0ge2NoZXZ5LCBmb3JkfSBjbHVua2VyOworZW51bSBjYXJzIHtibXcsIHBvcnNjaGV9IHNwb3J0c2NhcjsKKwordHlwZWRlZiBlbnVtIHtGQUxTRSwgVFJVRX0gYm9vbGVhbjsKK2Jvb2xlYW4gdl9ib29sZWFuOwordHlwZWRlZiBlbnVtIGJ2YWxzIHtmYWxzZSwgdHJ1ZX0gYm9vbGVhbjI7Citib29sZWFuMiB2X2Jvb2xlYW4yOworCitlbnVtIG1pc29yZGVyZWQge3R3byA9IDIsIG9uZSA9IDEsIHplcm8gPSAwLCB0aHJlZSA9IDN9OworCisvKioqKioqKioqKiovCisKK21haW4gKCkKK3sKKyAgLyogRW5zdXJlIHRoYXQgbWFsbG9jIGlzIGEgcG9pbnRlciB0eXBlOyBhdm9pZCB1c2Ugb2YgInZvaWQiIGFuZCBhbnkgaW5jbHVkZSBmaWxlcy4gKi8KKyAgZXh0ZXJuIGNoYXIgKm1hbGxvYygpOworCisgIC8qIFNlZW1zIGxpa2Ugd2UgbmVlZCBhIHZhcmlhYmxlIG9mIHRoaXMgdHlwZSB0byBnZXQgdGhlIHR5cGUgdG8gYmUgcHV0CisgICAgIGluIHRoZSBleGVjdXRhYmxlLCBhdCBsZWFzdCBmb3IgQUlYIHhsYy4gICovCisgIGVudW0gbWlzb3JkZXJlZCB2X21pc29yZGVyZWQgPSB0aHJlZTsKKworICAvKiBTb21lIG9mIHRoZSB0ZXN0cyBpbiBwdHlwZS5leHAgcmVxdWlyZSBpbnZva2luZyBtYWxsb2MsIHNvIG1ha2UKKyAgICAgc3VyZSBpdCBpcyBsaW5rZWQgaW4gdG8gdGhpcyBwcm9ncmFtLiAgKi8KKyAgdl9jaGFyX3BvaW50ZXIgPSAoY2hhciAqKSBtYWxsb2MgKDEpOworCisjaWZkZWYgdXNlc3R1YnMKKyAgc2V0X2RlYnVnX3RyYXBzKCk7CisgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICAvKiBTb21lIGxpbmtlcnMgKGUuZy4gb24gQUlYKSByZW1vdmUgdW5yZWZlcmVuY2VkIHZhcmlhYmxlcywKKyAgICAgc28gbWFrZSBzdXJlIHRvIHJlZmVyZW5jZSB0aGVtLiAqLworICBwcmltYXJ5ID0gYmx1ZTsKKyAgcHJpbWFyeTEgPSBibHVlMTsKKyAgbm9ucHJpbWFyeSA9IHBpbms7CisgIHNwb3J0c2NhciA9IHBvcnNjaGU7CisgIGNsdW5rZXIgPSBmb3JkOworICB2X3N0cnVjdDEudl9pbnRfbWVtYmVyID0gNTsKKyAgdl9zdHJ1Y3QyLnZfaW50X21lbWJlciA9IDY7CisgIHZfc3RydWN0My52X2ludF9tZW1iZXIgPSA3OworCisgIHZfY2hhciA9IDA7CisgIHZfc2lnbmVkX2NoYXIgPSAwOworICB2X3Vuc2lnbmVkX2NoYXIgPSAwOworCisgIHZfc2hvcnQgPSAwOworICB2X3NpZ25lZF9zaG9ydCA9IDA7CisgIHZfdW5zaWduZWRfc2hvcnQgPSAwOworCisgIHZfaW50ID0gMDsKKyAgdl9zaWduZWRfaW50ID0gMDsKKyAgdl91bnNpZ25lZF9pbnQgPSAwOworCisgIHZfbG9uZyA9IDA7CisgIHZfc2lnbmVkX2xvbmcgPSAwOworICB2X3Vuc2lnbmVkX2xvbmcgPSAwOworCisgIHZfZmxvYXQgPSAwOworICB2X2RvdWJsZSA9IDA7CisKKyAgdl9jaGFyX2FycmF5WzBdID0gMDsKKyAgdl9zaWduZWRfY2hhcl9hcnJheVswXSA9IDA7CisgIHZfdW5zaWduZWRfY2hhcl9hcnJheVswXSA9IDA7CisKKyAgdl9zaG9ydF9hcnJheVswXSA9IDA7CisgIHZfc2lnbmVkX3Nob3J0X2FycmF5WzBdID0gMDsKKyAgdl91bnNpZ25lZF9zaG9ydF9hcnJheVswXSA9IDA7CisKKyAgdl9pbnRfYXJyYXlbMF0gPSAwOworICB2X3NpZ25lZF9pbnRfYXJyYXlbMF0gPSAwOworICB2X3Vuc2lnbmVkX2ludF9hcnJheVswXSA9IDA7CisKKyAgdl9sb25nX2FycmF5WzBdID0gMDsKKyAgdl9zaWduZWRfbG9uZ19hcnJheVswXSA9IDA7CisgIHZfdW5zaWduZWRfbG9uZ19hcnJheVswXSA9IDA7CisKKyAgdl9mbG9hdF9hcnJheVswXSA9IDA7CisgIHZfZG91YmxlX2FycmF5WzBdID0gMDsKKworICB2X2NoYXJfcG9pbnRlciA9IDA7CisgIHZfc2lnbmVkX2NoYXJfcG9pbnRlciA9IDA7CisgIHZfdW5zaWduZWRfY2hhcl9wb2ludGVyID0gMDsKKworICB2X3Nob3J0X3BvaW50ZXIgPSAwOworICB2X3NpZ25lZF9zaG9ydF9wb2ludGVyID0gMDsKKyAgdl91bnNpZ25lZF9zaG9ydF9wb2ludGVyID0gMDsKKworICB2X2ludF9wb2ludGVyID0gMDsKKyAgdl9zaWduZWRfaW50X3BvaW50ZXIgPSAwOworICB2X3Vuc2lnbmVkX2ludF9wb2ludGVyID0gMDsKKworICB2X2xvbmdfcG9pbnRlciA9IDA7CisgIHZfc2lnbmVkX2xvbmdfcG9pbnRlciA9IDA7CisgIHZfdW5zaWduZWRfbG9uZ19wb2ludGVyID0gMDsKKworICB2X2Zsb2F0X3BvaW50ZXIgPSAwOworICB2X2RvdWJsZV9wb2ludGVyID0gMDsKKworICBuZXN0ZWRfc3Uub3V0ZXJfaW50ID0gMDsKKyAgdl90X3N0cnVjdF9wID0gMDsKKworICB2X2Jvb2xlYW4gPSBGQUxTRTsKKyAgdl9ib29sZWFuMiA9IGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9wdHlwZS5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3B0eXBlLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWY2NzcxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9wdHlwZS5leHAKQEAgLTAsMCArMSw1MzIgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5ODgsIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTQsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUuIChyb2JAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCisJfQorCisjCisjIHRlc3QgcnVubmluZyBwcm9ncmFtcworIworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAicHR5cGUiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisjIENyZWF0ZSBhbmQgc291cmNlIHRoZSBmaWxlIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyCisjIHVzZWQgdG8gY29tcGlsZSB0aGUgdGVzdCBjYXNlLgoraWYgW2dldF9jb21waWxlcl9pbmZvICR7YmluZmlsZX1dIHsKKyAgICByZXR1cm4gLTE7Cit9CisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisjIFRlc3QgcHR5cGUgb2YgdW5uYW1lZCBlbnVtZXJhdGlvbiBtZW1iZXJzIGJlZm9yZSBhbnkgYWN0aW9uIGNhdXNlcworIyB0aGUgcGFydGlhbCBzeW1ib2wgdGFibGUgdG8gYmUgZXhwYW5kZWQgdG8gZnVsbCBzeW1ib2xzLiAgVGhpcyBmYWlscworIyB3aXRoIHN0YWJzIGNvbXBpbGVycyB3aGljaCBmYWlsIHRvIHVzZSBhIG5hbWVsZXNzIHN0YWIgKHN1Y2ggYXMKKyMgcHJlLTIuNC41IHZlcnNpb25zIG9mIGdjYyBhbmQgbW9zdCBub24tZ2NjIGNvbXBpbGVycykuCisKK3NlbmRfZ2RiICJwdHlwZSByZWQxXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSBlbnVtIHByaW1hcnkxX3RhZyBce3JlZDEsIGdyZWVuMSwgYmx1ZTFcfS4qJGdkYl9wcm9tcHQgJCJcCisJeworCSAgICAjIFRoZSB3b3JrYXJvdW5kIGlzIGluIGVmZmVjdC4gIEFzIHRoaXMgaXMgYSBjb21waWxlciwgbm90IEdEQiwKKwkgICAgIyBidWcsIHdlJ2xsIG1ha2UgaXQgYSBQQVNTIGJ1dCBwZXJoYXBzIGl0IHNob3VsZCBiZSBhbiBYRkFJTC4KKwkgICAgcGFzcyAicHR5cGUgdW5uYW1lZCBlbnVtZXJhdGlvbiBtZW1iZXIgKHdvcmtlZCBhcm91bmQpIgorCX0KKyAgICAtcmUgInR5cGUgPSBlbnVtIFx7cmVkMSwgZ3JlZW4xLCBibHVlMVx9LiokZ2RiX3Byb21wdCAkIlwKKwkJCXsgcGFzcyAicHR5cGUgdW5uYW1lZCBlbnVtZXJhdGlvbiBtZW1iZXIiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJwdHlwZSB1bm5hbWVkIGVudW1lcmF0aW9uIG1lbWJlciIgfQorICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHVubmFtZWQgZW51bWVyYXRpb24gbWVtYmVyIiB9Cit9CisKKyMKKyMgdGVzdCBwdHlwZSBjb21tYW5kIHdpdGggc3RydWN0dXJlcworIworIyBIZXJlIGFuZCBlbHNld2hlcmUsIHdlIGFjY2VwdAorIyAibG9uZyIsICJsb25nIGludCIsIG9yICJpbnQiIGZvciBsb25nIHZhcmlhYmxlcyAod2hhdGlzLmV4cCBhbHJlYWR5CisjIGhhcyBhbiBYRkFJTCBmb3IgImludCIgKFN1biBjYyBidWcpLCBzbyBubyBuZWVkIHRvIGZhaWwgaXQgaGVyZSkuCitnZGJfdGVzdCAicHR5cGUgc3RydWN0IHRfc3RydWN0IiAidHlwZSA9IHN0cnVjdCB0X3N0cnVjdCBcey4qXFtcclxuXF0gICAgKHVuc2lnbmVkIHwpY2hhciB2X2NoYXJfbWVtYmVyOy4qXFtcclxuXF0gICAgKHNob3J0fHNob3J0IGludCkgdl9zaG9ydF9tZW1iZXI7LipcW1xyXG5cXSAgICBpbnQgdl9pbnRfbWVtYmVyOy4qXFtcclxuXF0gICAgKGxvbmd8bG9uZyBpbnR8aW50KSB2X2xvbmdfbWVtYmVyOy4qXFtcclxuXF0gICAgZmxvYXQgdl9mbG9hdF9tZW1iZXI7LipcW1xyXG5cXSAgICBkb3VibGUgdl9kb3VibGVfbWVtYmVyOy4qXFtcclxuXF1cfS4qIiAicHR5cGUgc3RydWN0dXJlIiAKKworCisjIFRlc3QgdGhlIGVxdWl2YWxlbmNlIGJldHdlZW4gJy4nIGFuZCAnLT4nIGZvciBzdHJ1Y3QgbWVtYmVyIHJlZmVyZW5jZXMuCisKK2lmIFtnZGJfdGVzdCAicHR5cGUgdl9zdHJ1Y3QxLnZfZmxvYXRfbWVtYmVyIgkidHlwZSA9IGZsb2F0Il08MCB0aGVuIHsKKyAgICByZXR1cm4gLTEKK30KK2lmIFtnZGJfdGVzdCAicHR5cGUgdl9zdHJ1Y3QxLT52X2Zsb2F0X21lbWJlciIJInR5cGUgPSBmbG9hdCJdPDAgdGhlbiB7CisgICAgcmV0dXJuIC0xCit9CitpZiBbZ2RiX3Rlc3QgInB0eXBlIHZfdF9zdHJ1Y3RfcC52X2Zsb2F0X21lbWJlciIJInR5cGUgPSBmbG9hdCJdPDAgdGhlbiB7CisgICAgcmV0dXJuIC0xCit9CitpZiBbZ2RiX3Rlc3QgInB0eXBlIHZfdF9zdHJ1Y3RfcC0+dl9mbG9hdF9tZW1iZXIiCSJ0eXBlID0gZmxvYXQiXTwwIHRoZW4geworICAgIHJldHVybiAtMQorfQorCisKKyMgSUJNJ3MgeGxjIHB1dHMgb3V0IGJvZ3VzIHN0YWJzLS10aGUgc3R1ZmYgZmllbGQgaXMgdHlwZSA0MiwKKyMgd2hpY2ggaXNuJ3QgZGVmaW5lZC4KKworZ2RiX3Rlc3QgInB0eXBlIHN0cnVjdCBsaW5rIiAidHlwZSA9IHN0cnVjdCBsaW5rIFx7LipcW1xyXG5cXSAgICBzdHJ1Y3QgbGluayBcWypcXW5leHQ7LipcW1xyXG5cXSAgICBzdHJ1Y3QgbGluayBcWyooXF0rbGlua2Z1bmNcWykoXF0rKHN0cnVjdCBsaW5rIFxbKlxdLCBpbnRcWylcXXwpOy4qXFtcclxuXF0gICAgc3RydWN0IHRfc3RydWN0IHN0dWZmLjEuLjIuLjMuOy4qXFtcclxuXF1cfS4qIiAicHR5cGUgbGlua2VkIGxpc3Qgc3RydWN0dXJlIiAKKworIworIyB0ZXN0IHB0eXBlIGNvbW1hbmQgd2l0aCB1bmlvbnMKKyMKK2dkYl90ZXN0ICJwdHlwZSB1bmlvbiB0X3VuaW9uIiAidHlwZSA9IHVuaW9uIHRfdW5pb24gXHsuKlxbXHJcblxdICAgICh1bnNpZ25lZCB8KWNoYXIgdl9jaGFyX21lbWJlcjsuKlxbXHJcblxdICAgIChzaG9ydHxzaG9ydCBpbnQpIHZfc2hvcnRfbWVtYmVyOy4qXFtcclxuXF0gICAgaW50IHZfaW50X21lbWJlcjsuKlxbXHJcblxdICAgIChsb25nfGxvbmcgaW50fGludCkgdl9sb25nX21lbWJlcjsuKlxbXHJcblxdICAgIGZsb2F0IHZfZmxvYXRfbWVtYmVyOy4qXFtcclxuXF0gICAgZG91YmxlIHZfZG91YmxlX21lbWJlcjsuKlxbXHJcblxdXH0uKiIgInB0eXBlIHVuaW9uIiAKKworIyBJQk0ncyB4bGMgcHV0cyBvdXQgYm9ndXMgc3RhYnMtLXRoZSBzdHVmZiBmaWVsZCBpcyB0eXBlIDQyLAorIyB3aGljaCBpc24ndCBkZWZpbmVkLgorZ2RiX3Rlc3QgInB0eXBlIHVuaW9uIHR1X2xpbmsiICJ0eXBlID0gdW5pb24gdHVfbGluayAuKlxbXHJcblxdICAgIHN0cnVjdCBsaW5rIFxbKlxdbmV4dDsuKlxbXHJcblxdICAgIHN0cnVjdCBsaW5rIFxbKFwqXF0rbGlua2Z1bmNcWykoXF0rKHN0cnVjdCBsaW5rIFxbKlxdLCBpbnRcWylcXXwpOy4qXFtcclxuXF0gICAgc3RydWN0IHRfc3RydWN0IHN0dWZmLjEuLjIuLjMuOy4qXFtcclxuXF1cfS4qIiAicHR5cGUgbGlua2VkIGxpc3QgdW5pb24iIAorCisjCisjIHRlc3QgcHR5cGUgY29tbWFuZCB3aXRoIGVudW1zCisjCisKK2dkYl90ZXN0ICJwdHlwZSBwcmltYXJ5IiAidHlwZSA9IGVudW0gLnJlZCwgZ3JlZW4sIGJsdWUuKiIgInB0eXBlIHVubmFtZWQgZW51bWVyYXRpb24iIAorCitnZGJfdGVzdCAicHR5cGUgZW51bSBjb2xvcnMiICJ0eXBlID0gZW51bSBjb2xvcnMgXHt5ZWxsb3csIHB1cnBsZSwgcGlua1x9LioiICJwdHlwZSBuYW1lZCBlbnVtZXJhdGlvbiIgCisKKworIworIyB0ZXN0IHB0eXBlIGNvbW1hbmQgd2l0aCBlbnVtcyBhcyB0eXBlZGVmCisjCitnZGJfdGVzdCAicHR5cGUgYm9vbGVhbiIgInR5cGUgPSBlbnVtIFx7RkFMU0UsIFRSVUVcfS4qIiAicHR5cGUgdW5uYW1lZCB0eXBlZGVmJ2QgZW51bWVyYXRpb24iIAorCisjIEFuZCBjaGVjayB0aGF0IHdoYXRpcyBzaG93cyB0aGUgbmFtZSwgbm90ICJlbnVtIHsuLi59Ii4KKyMgVGhpcyBwcm9iYWJseSBmYWlscyBmb3IgYWxsIERXQVJGIDEgY2FzZXMsIHNvIGFzc3VtZSBzbyBmb3Igbm93LiAtZm5mCisjIFRoZSBwcm9ibGVtIHdpdGggeGxjIGlzIHRoYXQgdGhlIHN0YWJzIGxvb2sgbGlrZQorIyAgIDp0NTE9ZUZBTFNFOjAsVFJVRToxLDsKKyMgICBib29sZWFuOnQ1NT01MQorIyAgIHZfYm9vbGVhbjpHNTEKKyMgR0RCJ3MgYmVoYXZpb3IgaXMgY29ycmVjdDsgdGhlIHR5cGUgd2hpY2ggdGhlIHZhcmlhYmxlIGlzIGRlZmluZWQKKyMgYXMgKDUxKSBkb2Vzbid0IGhhdmUgYSBuYW1lLiAgT25seSA1NSBoYXMgYSBuYW1lLgorCitpZiB7ISRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAicnM2MDAwLSotKiIgImkqODYtKi1zeXN2NCoiIH0KK3NldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKK2dkYl90ZXN0ICJ3aGF0aXMgdl9ib29sZWFuIiAidHlwZSA9IGJvb2xlYW4iIFwKKyAgIndoYXRpcyB1bm5hbWVkIHR5cGVkZWYnZCBlbnVtIChjb21waWxlciBidWcgaW4gSUJNJ3MgeGxjKSIKKworIyBTYW1lIHRoaW5nIHdpdGggc3RydWN0IGFuZCB1bmlvbi4KK2dkYl90ZXN0ICJwdHlwZSB0X3N0cnVjdDMiICJ0eXBlID0gc3RydWN0IFx7LioKKyAqZG91YmxlIHZfZG91YmxlX21lbWJlcjsuKgorICppbnQgdl9pbnRfbWVtYmVyOy4qXH0iICJwcmludGluZyB0eXBlZGVmJ2Qgc3RydWN0IgorCitnZGJfdGVzdCAicHR5cGUgdF91bmlvbjMiICJ0eXBlID0gdW5pb24gXHsuKgorICpkb3VibGUgdl9kb3VibGVfbWVtYmVyOy4qCisgKmludCB2X2ludF9tZW1iZXI7LipcfSIgInByaW50aW5nIHR5cGVkZWYnZCB1bmlvbiIKKworZ2RiX3Rlc3QgInB0eXBlIGVudW0gYnZhbHMiICJ0eXBlID0gZW51bSBidmFscyBce2ZhbHNlLCB0cnVlXH0uKiIgInB0eXBlIG5hbWVkIHR5cGVkZWYnZCBlbnVtZidkIGVudW0iIAorCisjCisjIHRlc3QgcHR5cGUgY29tbWFuZCB3aXRoIG91dC1vZi1vcmRlciBlbnVtIHZhbHVlcworIworZ2RiX3Rlc3QgInB0eXBlIGVudW0gbWlzb3JkZXJlZCIgInR5cGUgPSBlbnVtIG1pc29yZGVyZWQgXHt0d28gPSAyLCBvbmUgPSAxLCB6ZXJvID0gMCwgdGhyZWUgPSAzXH0uKiIgInB0eXBlIG1pc29yZGVyZWQgZW51bWVyYXRpb24iIAorCisjCisjIHRlc3QgcHR5cGUgY29tbWFuZCB3aXRoIGEgbmFtZWQgZW51bSdzIHZhbHVlCisjCitnZGJfdGVzdCAicHR5cGUgdGhyZWUiICJ0eXBlID0gZW51bSBtaXNvcmRlcmVkIFx7dHdvID0gMiwgb25lID0gMSwgemVybyA9IDAsIHRocmVlID0gM1x9LioiICJwdHlwZSBuYW1lZCBlbnVtZXJhdGlvbiBtZW1iZXIiIAorCitnZGJfdGVzdCAicHR5cGUgcmVkIiAidHlwZSA9IGVudW0gXHtyZWQsIGdyZWVuLCBibHVlXH0uKiIgInB0eXBlIHVubmFtZWQgZW51bWVyYXRpb24gbWVtYmVyICMyIiAKKworIworIyB0ZXN0IHB0eXBlIGNvbW1hbmQgd2l0aCBiYXNpYyBDIHR5cGVzCisjCisjIEkndmUgY29tbWVudGVkIG1vc3Qgb2YgdGhpcyBvdXQgYmVjYXVzZSBpdCBkdXBsaWNhdGVzIHRlc3RzIGluIHdoYXRpcy5leHAuCisjIEkndmUganVzdCBsZWZ0IGluIGEgdG9rZW4gdGVzdCBvciAyIHdoaWNoIGlzIGRlc2lnbmVkIHRvIHRlc3QgdGhhdCBwdHlwZSAKKyMgYWN0cyBsaWtlIHdoYXRpcyBmb3IgYmFzaWMgdHlwZXMuICBJZiBpdCBpcyB0aG91Z2h0IHRvIGJlIG5lY2Vzc2FyeSB0bworIyB0ZXN0IGJvdGggd2hhdGlzIGFuZCBwdHlwZSBmb3IgYWxsIHRoZSB0eXBlcywgdGhlIHRlc3RzIHNob3VsZCBiZQorIyBtZXJnZWQgaW50byB3aGF0aXMuZXhwLCBvciBlbHNlIG1haW50ZW5hbmNlIHdpbGwgYmUgYSByb3lhbCBwYWluIC1raW5nZG9uCisjc2V0dXBfeGZhaWwgImk5NjAtKi0qIiAxODIxCisjc2V0dXBfeGZhaWwgIm1pcHMtaWR0LSoiICJtaXBzLXNnaS0qIiAiYTI5ay0qLSoiCisjc2VuZCAicHR5cGUgdl9jaGFyXG4iCisjZ2RiX2V4cGVjdCB7CisjICAgIC1yZSAidHlwZSA9IGNoYXIuKiRnZGJfcHJvbXB0ICQiCXsgcGFzcyAicHR5cGUgY2hhciIgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJwdHlwZSBjaGFyIiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIGNoYXIiIH0KKyN9CisjCisjCisjc2V0dXBfeGZhaWwgIm1pcHMtKi0qIiAiYTI5ay0qLSoiCisjc2VuZCAicHR5cGUgdl9zaWduZWRfY2hhclxuIgorI2dkYl9leHBlY3QgeworIyAgICAtcmUgInR5cGUgPSBzaWduZWQgY2hhci4qJGdkYl9wcm9tcHQgJCIJeyBwYXNzICJwdHlwZSBzaWduZWQgY2hhciIgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJwdHlwZSBzaWduZWQgY2hhciIgfQorIyAgICB0aW1lb3V0CQl7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBzaWduZWQgY2hhciIgfQorI30KKyMKKyMKKyNzZW5kICJwdHlwZSB2X3Vuc2lnbmVkX2NoYXJcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAgLXJlICJ0eXBlID0gdW5zaWduZWQgY2hhci4qJGdkYl9wcm9tcHQgJCIJeyBwYXNzICJwdHlwZSB1bnNpZ25lZCBjaGFyIiB9CisjICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIgl7IGZhaWwgInB0eXBlIHVuc2lnbmVkIGNoYXIiIH0KKyMgICAgdGltZW91dAkJeyBmYWlsICIodGltZW91dCkgcHR5cGUgdW5zaWduZWQgY2hhciIgfQorI30KKworZ2RiX3Rlc3QgInB0eXBlIHZfc2hvcnQiICJ0eXBlID0gc2hvcnQofCBpbnQpLioiICJwdHlwZSBzaG9ydCIgCisKKyNzZW5kICJwdHlwZSB2X3NpZ25lZF9zaG9ydFxuIgorI2dkYl9leHBlY3QgeworIyAgICAtcmUgInR5cGUgPSBzaG9ydC4qJGdkYl9wcm9tcHQgJCIJeyBwYXNzICJwdHlwZSBzaWduZWQgc2hvcnQiIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCXsgZmFpbCAicHR5cGUgc2lnbmVkIHNob3J0IiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHNpZ25lZCBzaG9ydCIgfQorI30KKyMKKyMKKyNzZW5kICJwdHlwZSB2X3Vuc2lnbmVkX3Nob3J0XG4iCisjZ2RiX2V4cGVjdCB7CisjICAgIC1yZSAidHlwZSA9IHVuc2lnbmVkIHNob3J0LiokZ2RiX3Byb21wdCAkIgl7IHBhc3MgInB0eXBlIHVuc2lnbmVkIHNob3J0IiB9CisjICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIgl7IGZhaWwgInB0eXBlIHVuc2lnbmVkIHNob3J0IiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHVuc2lnbmVkIHNob3J0IiB9CisjfQorCisKK2dkYl90ZXN0ICJwdHlwZSB2X2ludCIgInR5cGUgPSBpbnQuKiIgInB0eXBlIGludCIgCisKKyNzZW5kICJwdHlwZSB2X3NpZ25lZF9pbnRcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAgLXJlICJ0eXBlID0gaW50LiokZ2RiX3Byb21wdCAkIgl7IHBhc3MgInB0eXBlIHNpZ25lZCBpbnQiIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCXsgZmFpbCAicHR5cGUgc2lnbmVkIGludCIgfQorIyAgICB0aW1lb3V0CQl7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBzaWduZWQgaW50IiB9CisjfQorIworIworI3NlbmQgInB0eXBlIHZfdW5zaWduZWRfaW50XG4iCisjZ2RiX2V4cGVjdCB7CisjICAgIC1yZSAidHlwZSA9IHVuc2lnbmVkIGludC4qJGdkYl9wcm9tcHQgJCIJeyBwYXNzICJwdHlwZSB1bnNpZ25lZCBpbnQiIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCXsgZmFpbCAicHR5cGUgdW5zaWduZWQgaW50IiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHVuc2lnbmVkIGludCIgfQorI30KKyMKKyMKKyNzZW5kICJwdHlwZSB2X2xvbmdcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAgLXJlICJ0eXBlID0gbG9uZy4qJGdkYl9wcm9tcHQgJCIJeyBwYXNzICJwdHlwZSBsb25nIiB9CisjICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIgl7IGZhaWwgInB0eXBlIGxvbmciIH0KKyMgICAgdGltZW91dAkJeyBmYWlsICIodGltZW91dCkgcHR5cGUgbG9uZyIgfQorI30KKyMKKyMKKyNzZW5kICJwdHlwZSB2X3NpZ25lZF9sb25nXG4iCisjZ2RiX2V4cGVjdCB7CisjICAgIC1yZSAidHlwZSA9IGxvbmcuKiRnZGJfcHJvbXB0ICQiCXsgcGFzcyAicHR5cGUgc2lnbmVkIGxvbmciIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCXsgZmFpbCAicHR5cGUgc2lnbmVkIGxvbmciIH0KKyMgICAgdGltZW91dAkJeyBmYWlsICIodGltZW91dCkgcHR5cGUgc2lnbmVkIGxvbmciIH0KKyN9CisjCisjCisjc2VuZCAicHR5cGUgdl91bnNpZ25lZF9sb25nXG4iCisjZ2RiX2V4cGVjdCB7CisjICAgIC1yZSAidHlwZSA9IHVuc2lnbmVkIGxvbmcuKiRnZGJfcHJvbXB0ICQiCXsgcGFzcyAicHR5cGUgdW5zaWduZWQgbG9uZyIgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJwdHlwZSB1bnNpZ25lZCBsb25nIiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHVuc2lnbmVkIGxvbmciIH0KKyN9CisjCisjCisjc2VuZCAicHR5cGUgdl9mbG9hdFxuIgorI2dkYl9leHBlY3QgeworIyAgICAtcmUgInR5cGUgPSBmbG9hdC4qJGdkYl9wcm9tcHQgJCIJeyBwYXNzICJwdHlwZSBmbG9hdCIgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJwdHlwZSBmbG9hdCIgfQorIyAgICB0aW1lb3V0CQl7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBmbG9hdCIgfQorI30KKyMKKyMKKyNzZW5kICJwdHlwZSB2X2RvdWJsZVxuIgorI2dkYl9leHBlY3QgeworIyAgICAtcmUgInR5cGUgPSBkb3VibGUuKiRnZGJfcHJvbXB0ICQiCXsgcGFzcyAicHR5cGUgZG91YmxlIiB9CisjICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIgl7IGZhaWwgInB0eXBlIGRvdWJsZSIgfQorIyAgICB0aW1lb3V0CQl7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBkb3VibGUiIH0KKyN9CisKKworIworIyB0ZXN0IHB0eXBlIGNvbW1hbmQgd2l0aCBhcnJheXMKKyMKKyNzZXR1cF94ZmFpbCAiaTk2MC0qLSoiIDE4MjEKKyNzZXR1cF94ZmFpbCAibWlwcy1pZHQtKiIgIm1pcHMtc2dpLSoiICJhMjlrLSotKiIKKyNzZW5kICJwdHlwZSB2X2NoYXJfYXJyYXlcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAgLXJlICJ0eXBlID0gY2hhciAuMi4uKiRnZGJfcHJvbXB0ICQiCXsgcGFzcyAicHR5cGUgY2hhciBhcnJheSIgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJwdHlwZSBjaGFyIGFycmF5IiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIGNoYXIgYXJyYXkiIH0KKyN9CisjCisjCisjc2V0dXBfeGZhaWwgIm1pcHMtKi0qIiAiYTI5ay0qLSoiCisjc2VuZCAicHR5cGUgdl9zaWduZWRfY2hhcl9hcnJheVxuIgorI2dkYl9leHBlY3QgeworIyAgICAtcmUgInR5cGUgPSAofHNpZ25lZCApY2hhciAuMi4uKiRnZGJfcHJvbXB0ICQiCXsgcGFzcyAicHR5cGUgc2lnbmVkIGNoYXIgYXJyYXkiIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCXsgZmFpbCAicHR5cGUgc2lnbmVkIGNoYXIgYXJyYXkiIH0KKyMgICAgdGltZW91dAkJeyBmYWlsICIodGltZW91dCkgcHR5cGUgc2lnbmVkIGNoYXIgYXJyYXkiIH0KKyN9CisjCisjCisjc2VuZCAicHR5cGUgdl91bnNpZ25lZF9jaGFyX2FycmF5XG4iCisjZ2RiX2V4cGVjdCB7CisjICAgIC1yZSAidHlwZSA9IHVuc2lnbmVkIGNoYXIgLjIuLiokZ2RiX3Byb21wdCAkIgl7IHBhc3MgInB0eXBlIHVuc2lnbmVkIGNoYXIgYXJyYXkiIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCXsgZmFpbCAicHR5cGUgdW5zaWduZWQgY2hhciBhcnJheSIgfQorIyAgICB0aW1lb3V0CQl7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSB1bnNpZ25lZCBjaGFyIGFycmF5IiB9CisjfQorIworIworIworI3NlbmQgInB0eXBlIHZfaW50X2FycmF5XG4iCisjZ2RiX2V4cGVjdCB7CisjICAgIC1yZSAidHlwZSA9IGludCAuMi4uKiRnZGJfcHJvbXB0ICQiCXsgcGFzcyAicHR5cGUgaW50IGFycmF5IiB9CisjICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIgl7IGZhaWwgInB0eXBlIGludCBhcnJheSIgfQorIyAgICB0aW1lb3V0CQl7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBpbnQgYXJyYXkiIH0KKyN9CisjCisjCisjc2VuZCAicHR5cGUgdl9zaWduZWRfaW50X2FycmF5XG4iCisjZ2RiX2V4cGVjdCB7CisjICAgIC1yZSAidHlwZSA9IGludCAuMi4uKiRnZGJfcHJvbXB0ICQiCXsgcGFzcyAicHR5cGUgc2lnbmVkIGludCBhcnJheSIgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJwdHlwZSBzaWduZWQgaW50IGFycmF5IiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHNpZ25lZCBpbnQgYXJyYXkiIH0KKyN9CisjCisjCisjc2VuZCAicHR5cGUgdl91bnNpZ25lZF9pbnRfYXJyYXlcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAgLXJlICJ0eXBlID0gdW5zaWduZWQgaW50IC4yLi4qJGdkYl9wcm9tcHQgJCIJeyBwYXNzICJwdHlwZSB1bnNpZ25lZCBpbnQgYXJyYXkiIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCXsgZmFpbCAicHR5cGUgdW5zaWduZWQgaW50IGFycmF5IiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHVuc2lnbmVkIGludCBhcnJheSIgfQorI30KKyMKKyMKKyNzZW5kICJwdHlwZSB2X2xvbmdfYXJyYXlcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAgLXJlICJ0eXBlID0gKGxvbmd8aW50fGxvbmcgaW50KSAuMi4uKiRnZGJfcHJvbXB0ICQiCXsgCisjCXBhc3MgInB0eXBlIGxvbmcgYXJyYXkiIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCXsgZmFpbCAicHR5cGUgbG9uZyBhcnJheSIgfQorIyAgICB0aW1lb3V0CQl7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBsb25nIGFycmF5IiB9CisjfQorIworIworI3NlbmQgInB0eXBlIHZfc2lnbmVkX2xvbmdfYXJyYXlcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAgLXJlICJ0eXBlID0gKGxvbmd8aW50fGxvbmcgaW50KSAuMi4uKiRnZGJfcHJvbXB0ICQiCXsgCisjCXBhc3MgInB0eXBlIHNpZ25lZCBsb25nIGFycmF5IiB9CisjICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIgl7IGZhaWwgInB0eXBlIHNpZ25lZCBsb25nIGFycmF5IiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHNpZ25lZCBsb25nIGFycmF5IiB9CisjfQorIworIworI3NlbmQgInB0eXBlIHZfdW5zaWduZWRfbG9uZ19hcnJheVxuIgorI2dkYl9leHBlY3QgeworIyAgICAtcmUgInR5cGUgPSB1bnNpZ25lZCBsb25nIC4yLi4qJGdkYl9wcm9tcHQgJCIJeyBwYXNzICJwdHlwZSB1bnNpZ25lZCBsb25nIGFycmF5IiB9CisjICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIgl7IGZhaWwgInB0eXBlIHVuc2lnbmVkIGxvbmcgYXJyYXkiIH0KKyMgICAgdGltZW91dAkJeyBmYWlsICIodGltZW91dCkgcHR5cGUgdW5zaWduZWQgbG9uZyBhcnJheSIgfQorI30KKyMKKyMKKyNzZW5kICJwdHlwZSB2X2Zsb2F0X2FycmF5XG4iCisjZ2RiX2V4cGVjdCB7CisjICAgIC1yZSAidHlwZSA9IGZsb2F0IC4yLi4qJGdkYl9wcm9tcHQgJCIJeyBwYXNzICJwdHlwZSBmbG9hdCBhcnJheSIgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJwdHlwZSBmbG9hdCBhcnJheSIgfQorIyAgICB0aW1lb3V0CQl7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBmbG9hdCBhcnJheSIgfQorI30KKyMKKyMKKyNzZW5kICJwdHlwZSB2X2RvdWJsZV9hcnJheVxuIgorI2dkYl9leHBlY3QgeworIyAgICAtcmUgInR5cGUgPSBkb3VibGUgLjIuLiokZ2RiX3Byb21wdCAkIgl7IHBhc3MgInB0eXBlIGRvdWJsZSBhcnJheSIgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJwdHlwZSBkb3VibGUgYXJyYXkiIH0KKyMgICAgdGltZW91dAkJeyBmYWlsICIodGltZW91dCkgcHR5cGUgZG91YmxlIGFycmF5IiB9CisjfQorIworCitpZiB7ISRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAicnM2MDAwLSotKiIgImkqODYtKi1zeXN2NCoiIH0KK3NldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKK2dkYl90ZXN0ICJwdHlwZSB0X2NoYXJfYXJyYXkiICJ0eXBlID0gKHx1bnNpZ25lZCApY2hhciBcXFxbMD9cXFxdIgorCisjCisjIworIyMgdGVzdCBwdHlwZSBjb21tYW5kIHdpdGggcG9pbnRlcnMKKyMjCisjc2V0dXBfeGZhaWwgImk5NjAtKi0qIiAxODIxCisjc2V0dXBfeGZhaWwgIm1pcHMtaWR0LSoiICJtaXBzLXNnaS0qIiAiYTI5ay0qLSoiCisjc2VuZCAicHR5cGUgdl9jaGFyX3BvaW50ZXJcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAgLXJlICJ0eXBlID0gY2hhciBcKi4qJGdkYl9wcm9tcHQgJCIJeyBwYXNzICJwdHlwZSBjaGFyIHBvaW50ZXIiIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCXsgZmFpbCAicHR5cGUgY2hhciBwb2ludGVyIiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIGNoYXIgcG9pbnRlciIgfQorI30KKyMKKyMKKyNzZXR1cF94ZmFpbCAibWlwcy0qLSoiICJhMjlrLSotKiIKKyNzZW5kICJwdHlwZSB2X3NpZ25lZF9jaGFyX3BvaW50ZXJcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAgLXJlICJ0eXBlID0gKHxzaWduZWQgKWNoYXIgXCouKiRnZGJfcHJvbXB0ICQiCisjCXsgcGFzcyAicHR5cGUgc2lnbmVkIGNoYXIgcG9pbnRlciIgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJwdHlwZSBzaWduZWQgY2hhciBwb2ludGVyIiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHNpZ25lZCBjaGFyIHBvaW50ZXIiIH0KKyN9CisjCisjCisjc2VuZCAicHR5cGUgdl91bnNpZ25lZF9jaGFyX3BvaW50ZXJcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAgLXJlICJ0eXBlID0gdW5zaWduZWQgY2hhciBcKi4qJGdkYl9wcm9tcHQgJCIJeyBwYXNzICJwdHlwZSB1bnNpZ25lZCBjaGFyIHBvaW50ZXIiIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCXsgZmFpbCAicHR5cGUgdW5zaWduZWQgY2hhciBwb2ludGVyIiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHVuc2lnbmVkIGNoYXIgcG9pbnRlciIgfQorI30KKyMKKyMKKyNzZW5kICJwdHlwZSB2X3Nob3J0X3BvaW50ZXJcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAgLXJlICJ0eXBlID0gKHNob3J0fHNob3J0IGludCkgXCouKiRnZGJfcHJvbXB0ICQiCXsgcGFzcyAicHR5cGUgc2hvcnQgcG9pbnRlciIgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJwdHlwZSBzaG9ydCBwb2ludGVyIiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHNob3J0IHBvaW50ZXIiIH0KKyN9CisjCisjCisjc2VuZCAicHR5cGUgdl9zaWduZWRfc2hvcnRfcG9pbnRlclxuIgorI2dkYl9leHBlY3QgeworIyAgICAtcmUgInR5cGUgPSBzaG9ydCBcKi4qJGdkYl9wcm9tcHQgJCIJeyBwYXNzICJwdHlwZSBzaWduZWQgc2hvcnQgcG9pbnRlciIgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJwdHlwZSBzaWduZWQgc2hvcnQgcG9pbnRlciIgfQorIyAgICB0aW1lb3V0CQl7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBzaWduZWQgc2hvcnQgcG9pbnRlciIgfQorI30KKyMKKyMKKyNzZW5kICJwdHlwZSB2X3Vuc2lnbmVkX3Nob3J0X3BvaW50ZXJcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAgLXJlICJ0eXBlID0gdW5zaWduZWQgc2hvcnQgXCouKiRnZGJfcHJvbXB0ICQiCXsgcGFzcyAicHR5cGUgdW5zaWduZWQgc2hvcnQgcG9pbnRlciIgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJwdHlwZSB1bnNpZ25lZCBzaG9ydCBwb2ludGVyIiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHVuc2lnbmVkIHNob3J0IHBvaW50ZXIiIH0KKyN9CisjCisjCisjc2VuZCAicHR5cGUgdl9pbnRfcG9pbnRlclxuIgorI2dkYl9leHBlY3QgeworIyAgICAtcmUgInR5cGUgPSBpbnQgXCouKiRnZGJfcHJvbXB0ICQiCXsgcGFzcyAicHR5cGUgaW50IHBvaW50ZXIiIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCXsgZmFpbCAicHR5cGUgaW50IHBvaW50ZXIiIH0KKyMgICAgdGltZW91dAkJeyBmYWlsICIodGltZW91dCkgcHR5cGUgaW50IHBvaW50ZXIiIH0KKyN9CisjCisjCisjc2VuZCAicHR5cGUgdl9zaWduZWRfaW50X3BvaW50ZXJcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAgLXJlICJ0eXBlID0gaW50IFwqLiokZ2RiX3Byb21wdCAkIgl7IHBhc3MgInB0eXBlIHNpZ25lZCBpbnQgcG9pbnRlciIgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJwdHlwZSBzaWduZWQgaW50IHBvaW50ZXIiIH0KKyMgICAgdGltZW91dAkJeyBmYWlsICIodGltZW91dCkgcHR5cGUgc2lnbmVkIGludCBwb2ludGVyIiB9CisjfQorIworIworI3NlbmQgInB0eXBlIHZfdW5zaWduZWRfaW50X3BvaW50ZXJcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAgLXJlICJ0eXBlID0gdW5zaWduZWQgaW50IFwqLiokZ2RiX3Byb21wdCAkIgl7IHBhc3MgInB0eXBlIHVuc2lnbmVkIGludCBwb2ludGVyIiB9CisjICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIgl7IGZhaWwgInB0eXBlIHVuc2lnbmVkIGludCBwb2ludGVyIiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHVuc2lnbmVkIGludCBwb2ludGVyIiB9CisjfQorIworIworI3NlbmQgInB0eXBlIHZfbG9uZ19wb2ludGVyXG4iCisjZ2RiX2V4cGVjdCB7CisjICAgIC1yZSAidHlwZSA9IGxvbmcgXCouKiRnZGJfcHJvbXB0ICQiCXsgcGFzcyAicHR5cGUgbG9uZyBwb2ludGVyIiB9CisjICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIgl7IGZhaWwgInB0eXBlIGxvbmcgcG9pbnRlciIgfQorIyAgICB0aW1lb3V0CQl7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBsb25nIHBvaW50ZXIiIH0KKyN9CisjCisjCisjc2VuZCAicHR5cGUgdl9zaWduZWRfbG9uZ19wb2ludGVyXG4iCisjZ2RiX2V4cGVjdCB7CisjICAgIC1yZSAidHlwZSA9IGxvbmcgXCouKiRnZGJfcHJvbXB0ICQiCXsgcGFzcyAicHR5cGUgc2lnbmVkIGxvbmcgcG9pbnRlciIgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJwdHlwZSBzaWduZWQgbG9uZyBwb2ludGVyIiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHNpZ25lZCBsb25nIHBvaW50ZXIiIH0KKyN9CisjCisjCisjc2VuZCAicHR5cGUgdl91bnNpZ25lZF9sb25nX3BvaW50ZXJcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAgLXJlICJ0eXBlID0gdW5zaWduZWQgbG9uZyBcKi4qJGdkYl9wcm9tcHQgJCIJeyBwYXNzICJwdHlwZSB1bnNpZ25lZCBsb25nIHBvaW50ZXIiIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCXsgZmFpbCAicHR5cGUgdW5zaWduZWQgbG9uZyBwb2ludGVyIiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHVuc2lnbmVkIGxvbmcgcG9pbnRlciIgfQorI30KKyMKKyMKKyNzZW5kICJwdHlwZSB2X2Zsb2F0X3BvaW50ZXJcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAgLXJlICJ0eXBlID0gZmxvYXQgXCouKiRnZGJfcHJvbXB0ICQiCXsgcGFzcyAicHR5cGUgZmxvYXQgcG9pbnRlciIgfQorIyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJwdHlwZSBmbG9hdCBwb2ludGVyIiB9CisjICAgIHRpbWVvdXQJCXsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIGZsb2F0IHBvaW50ZXIiIH0KKyN9CisjCisjCisjc2VuZCAicHR5cGUgdl9kb3VibGVfcG9pbnRlclxuIgorI2dkYl9leHBlY3QgeworIyAgICAtcmUgInR5cGUgPSBkb3VibGUgXCouKiRnZGJfcHJvbXB0ICQiCXsgcGFzcyAicHR5cGUgZG91YmxlIHBvaW50ZXIiIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCXsgZmFpbCAicHR5cGUgZG91YmxlIHBvaW50ZXIiIH0KKyMgICAgdGltZW91dAkJeyBmYWlsICIodGltZW91dCkgcHR5cGUgZG91YmxlIHBvaW50ZXIiIH0KKyN9CisKKyMKKyMgdGVzdCBwdHlwZSBjb21tYW5kIHdpdGggbmVzdGVkIHN0cnVjdHVyZSBhbmQgdW5pb24KKyMKK2dkYl90ZXN0ICJwdHlwZSBzdHJ1Y3Qgb3V0ZXJfc3RydWN0IiAidHlwZSA9IHN0cnVjdCBvdXRlcl9zdHJ1Y3QgXHsuKlxbXHJcblxdICAgIGludCBvdXRlcl9pbnQ7LipcW1xyXG5cXSAgICBzdHJ1Y3QgaW5uZXJfc3RydWN0IGlubmVyX3N0cnVjdF9pbnN0YW5jZTsuKlxbXHJcblxdICAgIHVuaW9uIGlubmVyX3VuaW9uIGlubmVyX3VuaW9uX2luc3RhbmNlOy4qXFtcclxuXF0gICAgKGxvbmd8bG9uZyBpbnR8aW50KSBvdXRlcl9sb25nOy4qXFtcclxuXF1cfS4qIiAicHR5cGUgb3V0ZXIgc3RydWN0dXJlIiAKKworZ2RiX3Rlc3QgInB0eXBlIHN0cnVjdCBpbm5lcl9zdHJ1Y3QiICJ0eXBlID0gc3RydWN0IGlubmVyX3N0cnVjdCBcey4qXFtcclxuXF0gICAgaW50IGlubmVyX2ludDsuKlxbXHJcblxdICAgIChsb25nfGxvbmcgaW50fGludCkgaW5uZXJfbG9uZzsuKlxbXHJcblxdXH0uKiIgInB0eXBlIGlubmVyIHN0cnVjdHVyZSIgCisKK2dkYl90ZXN0ICJwdHlwZSB1bmlvbiBpbm5lcl91bmlvbiIgInR5cGUgPSB1bmlvbiBpbm5lcl91bmlvbiBcey4qXFtcclxuXF0gICAgaW50IGlubmVyX3VuaW9uX2ludDsuKlxbXHJcblxdICAgIChsb25nfGxvbmcgaW50fGludCkgaW5uZXJfdW5pb25fbG9uZzsuKlxbXHJcblxdXH0uKiIgInB0eXBlIGlubmVyIHVuaW9uIiAKKworZ2RiX3Rlc3QgInB0eXBlIG5lc3RlZF9zdSIgInR5cGUgPSBzdHJ1Y3Qgb3V0ZXJfc3RydWN0IFx7LipcW1xyXG5cXSAgICBpbnQgb3V0ZXJfaW50Oy4qXFtcclxuXF0gICAgc3RydWN0IGlubmVyX3N0cnVjdCBpbm5lcl9zdHJ1Y3RfaW5zdGFuY2U7LipcW1xyXG5cXSAgICB1bmlvbiBpbm5lcl91bmlvbiBpbm5lcl91bmlvbl9pbnN0YW5jZTsuKlxbXHJcblxdICAgIChsb25nfGxvbmcgaW50fGludCkgb3V0ZXJfbG9uZzsuKlxbXHJcblxdXH0uKiIgInB0eXBlIG5lc3RlZCBzdHJ1Y3R1cmUiIAorCitnZGJfdGVzdCAicHR5cGUgbmVzdGVkX3N1Lm91dGVyX2ludCIgInR5cGUgPSBpbnQuKiIgInB0eXBlIG91dGVyIGludCIgCisKK2dkYl90ZXN0ICJwdHlwZSBuZXN0ZWRfc3UuaW5uZXJfc3RydWN0X2luc3RhbmNlIiAidHlwZSA9IHN0cnVjdCBpbm5lcl9zdHJ1Y3QgXHsuKlxbXHJcblxdICAgIGludCBpbm5lcl9pbnQ7LipcW1xyXG5cXSAgICAobG9uZ3xsb25nIGludHxpbnQpIGlubmVyX2xvbmc7LipcW1xyXG5cXVx9LioiICJwdHlwZSBuZXN0ZWQgc3RydWN0dXJlICMyIiAKKworZ2RiX3Rlc3QgInB0eXBlIG5lc3RlZF9zdS5pbm5lcl9zdHJ1Y3RfaW5zdGFuY2UuaW5uZXJfaW50IiAidHlwZSA9IGludC4qIiAicHR5cGUgaW5uZXIgaW50IiAKKworZ2RiX3Rlc3QgInB0eXBlIG5lc3RlZF9zdS5pbm5lcl91bmlvbl9pbnN0YW5jZSIgInR5cGUgPSB1bmlvbiBpbm5lcl91bmlvbiBcey4qXFtcclxuXF0gICAgaW50IGlubmVyX3VuaW9uX2ludDsuKlxbXHJcblxdICAgIChsb25nfGxvbmcgaW50fGludCkgaW5uZXJfdW5pb25fbG9uZzsuKlxbXHJcblxdXH0uKiIgInB0eXBlIG5lc3RlZCB1bmlvbiIgCisKKyMgVGVzdCBwcmludGluZyB0eXBlIG9mIHN0cmluZyBjb25zdGFudHMgYW5kIGFycmF5IGNvbnN0YW50cywgYnV0CisjIHJlcXVpcmVzIGEgcnVubmluZyBwcm9jZXNzLiAgVGhlc2UgY2FsbCBtYWxsb2MsIGFuZCBjYW4gdGFrZSBhIGxvbmcKKyMgdGltZSB0byBleGVjdXRlIG92ZXIgYSBzbG93IHNlcmlhbCBsaW5rLCBzbyBpbmNyZWFzZSB0aGUgdGltZW91dC4KKworIyBVREkgY2FuJ3QgZG8gdGhpcyAoUFIgMjQxNikuICBYRkFJTCBpcyBub3Qgc3VpdGFibGUsIGJlY2F1c2UgYXR0ZW1wdGluZworIyB0aGUgb3BlcmF0aW9uIGNhdXNlcyBhIHNsb3cgcGFpbmZ1bCBkZWF0aCByYXRoZXIgdGhhbiBhIG5pY2Ugc2ltcGxlIGZhaWx1cmUuCisKK2lmIFtydW50b19tYWluXSB0aGVuIHsKKworICBnZXRfZGVidWdfZm9ybWF0CisgIGlmIFt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiLGNhbm5vdF9jYWxsX2Z1bmN0aW9uc10geworICAgIHNldHVwX3hmYWlsICIqLSotKiIgMjQxNgorICAgIGZhaWwgIlRoaXMgdGFyZ2V0IGNhbiBub3QgY2FsbCBmdW5jdGlvbnMiCisgICAgY29udGludWUKKyAgfQorCisgIGdkYl90ZXN0ICJwdHlwZSBcImFiY1wiIgkidHlwZSA9IGNoYXIgXFxcWzRcXFxdIgorICBnZGJfdGVzdCAicHR5cGUgeydhJywnYicsJ2MnfSIJInR5cGUgPSBjaGFyIFxcXFszXFxcXSIKKyAgZ2RiX3Rlc3QgInB0eXBlIHswLDEsMn0iCQkidHlwZSA9IGludCBcXFxbM1xcXF0iCisgIGdkYl90ZXN0ICJwdHlwZSB7KGxvbmcpMCwobG9uZykxLChsb25nKTJ9IgkgICJ0eXBlID0gbG9uZyBcXFxbM1xcXF0iCisgIGdkYl90ZXN0ICJwdHlwZSB7KGZsb2F0KTAsKGZsb2F0KTEsKGZsb2F0KTJ9IiAidHlwZSA9IGZsb2F0IFxcXFszXFxcXSIKKyAgZ2RiX3Rlc3QgInB0eXBlIHt7MCwxLDJ9LHszLDQsNX19IgkidHlwZSA9IGludCBcXFxbMlxcXF1cXFxbM1xcXF0iCisgIGdkYl90ZXN0ICJwdHlwZSB7NCw1LDZ9XFsyXF0iCSJ0eXBlID0gaW50IgorICBnZGJfdGVzdCAicHR5cGUgKiZ7NCw1LDZ9XFsxXF0iCSJ0eXBlID0gaW50IgorfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9yYWRpeC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3JhZGl4LmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODFiZGUyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9yYWRpeC5leHAKQEAgLTAsMCArMSwyMDEgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBGcmVkIEZpc2guIChmbmZAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitwcm9jIHRlc3RfaW5wdXRfcmFkaXhfMiB7fSB7CisgICAgZ2RiX3Rlc3QgInNldCByYWRpeCIgXAorCSJJbnB1dCBhbmQgb3V0cHV0IHJhZGljZXMgbm93IHNldCB0byBkZWNpbWFsIDEwLCBoZXggYSwgb2N0YWwgMTIuIiBcCisJInNldCByYWRpeCAjMSIKKyAgICBnZGJfdGVzdCAic2V0IGlucHV0LXJhZGl4IDIiIFwKKwkiSW5wdXQgcmFkaXggbm93IHNldCB0byBkZWNpbWFsIDIsIGhleCAyLCBvY3RhbCAyLiIKKyAgICBnZGJfdGVzdCAic2hvdyByYWRpeCIgXAorCSJJbnB1dCByYWRpeCBzZXQgdG8gZGVjaW1hbCAyLCBoZXggMiwgb2N0YWwgMi5cclxuT3V0cHV0IHJhZGl4IHNldCB0byBkZWNpbWFsIDEwLCBoZXggYSwgb2N0YWwgMTIuIiBcCisJInNob3cgcmFkaXggIzEiCisgICAgZ2RiX3Rlc3QgInAgMDEwIgkJIjgiCisgICAgZ2RiX3Rlc3QgInAgMjAuIgkJIjIwIgorICAgIGdkYl90ZXN0ICJwIChpbnQpIDIwLiIJIjIwIgorICAgIGdkYl90ZXN0ICJwIDB4ZiIJCSIxNSIKKyAgICBnZGJfdGVzdCAicCAxMCIJCSIyIgorICAgIGdkYl90ZXN0ICJwIC0xMDEiCQkiLTUiCisgICAgZ2RiX3Rlc3QgInAgMTAxIgkJIjUiCisgICAgZ2RiX3Rlc3QgInAgMTAxMDEiCQkiMjEiCisgICAgZ2RiX3Rlc3QgInAgNCIJCSJJbnZhbGlkIG51bWJlciBcIjRcIlxcLiIKKyAgICBnZGJfdGVzdCAicCAtMiIJCSJJbnZhbGlkIG51bWJlciBcIjJcIlxcLiIKK30KKworIyBUZXN0IGlucHV0IHJhZGl4IDMgKGFuIG5vbi10eXBpY2FsIHJhZGl4KQorCitwcm9jIHRlc3RfaW5wdXRfcmFkaXhfMyB7fSB7CisgICAgZ2RiX3Rlc3QgInNldCByYWRpeCIgXAorCSJJbnB1dCBhbmQgb3V0cHV0IHJhZGljZXMgbm93IHNldCB0byBkZWNpbWFsIDEwLCBoZXggYSwgb2N0YWwgMTIuIiBcCisJInNldCByYWRpeCAjMiIKKyAgICBnZGJfdGVzdCAic2V0IGlucHV0LXJhZGl4IDMiIFwKKwkiSW5wdXQgcmFkaXggbm93IHNldCB0byBkZWNpbWFsIDMsIGhleCAzLCBvY3RhbCAzLiIKKyAgICBnZGJfdGVzdCAic2hvdyByYWRpeCIgXAorCSJJbnB1dCByYWRpeCBzZXQgdG8gZGVjaW1hbCAzLCBoZXggMywgb2N0YWwgMy5cclxuT3V0cHV0IHJhZGl4IHNldCB0byBkZWNpbWFsIDEwLCBoZXggYSwgb2N0YWwgMTIuIiBcCisJInNob3cgcmFkaXggIzIiCisgICAgZ2RiX3Rlc3QgInAgMDEwIgkJIjgiCisgICAgZ2RiX3Rlc3QgInAgMjAuIgkJIjIwIgorICAgIGdkYl90ZXN0ICJwIChpbnQpIDIwLiIJIjIwIgorICAgIGdkYl90ZXN0ICJwIDB4ZiIJCSIxNSIKKyAgICBnZGJfdGVzdCAicCAxMCIJCSIzIgorICAgIGdkYl90ZXN0ICJwIDAiCQkiMCIKKyAgICBnZGJfdGVzdCAicCAxIgkJIjEiCisgICAgZ2RiX3Rlc3QgInAgMiIJCSIyIgorICAgIGdkYl90ZXN0ICJwIDEwIgkJIjMiCisgICAgZ2RiX3Rlc3QgInAgMjAiCQkiNiIKKyAgICBnZGJfdGVzdCAicCAxMDAiCQkiOSIKKyAgICBnZGJfdGVzdCAicCAtMTAwIgkJIi05IgorICAgIGdkYl90ZXN0ICJwIDMiCQkiSW52YWxpZCBudW1iZXIgXCIzXCIuIgorICAgIGdkYl90ZXN0ICJwIDMwIgkJIkludmFsaWQgbnVtYmVyIFwiMzBcIi4iCit9CisKK3Byb2MgdGVzdF9pbnB1dF9yYWRpeF84IHt9IHsKKyAgICBnZGJfdGVzdCAic2V0IHJhZGl4IiBcCisJIklucHV0IGFuZCBvdXRwdXQgcmFkaWNlcyBub3cgc2V0IHRvIGRlY2ltYWwgMTAsIGhleCBhLCBvY3RhbCAxMi4iIFwKKwkic2V0IHJhZGl4ICMzIgorICAgIGdkYl90ZXN0ICJzZXQgaW5wdXQtcmFkaXggOCIgXAorCSJJbnB1dCByYWRpeCBub3cgc2V0IHRvIGRlY2ltYWwgOCwgaGV4IDgsIG9jdGFsIDEwLiIKKyAgICBnZGJfdGVzdCAic2hvdyByYWRpeCIgXAorCSJJbnB1dCByYWRpeCBzZXQgdG8gZGVjaW1hbCA4LCBoZXggOCwgb2N0YWwgMTAuXHJcbk91dHB1dCByYWRpeCBzZXQgdG8gZGVjaW1hbCAxMCwgaGV4IGEsIG9jdGFsIDEyLiIgXAorCSJzZXQgcmFkaXggIzMiCisgICAgZ2RiX3Rlc3QgInAgMDEwIgkJIjgiCisgICAgZ2RiX3Rlc3QgInAgMjAuIgkJIjIwIgorICAgIGdkYl90ZXN0ICJwIChpbnQpIDIwLiIJIjIwIgorICAgIGdkYl90ZXN0ICJwIDB4ZiIJCSIxNSIKKyAgICBnZGJfdGVzdCAicCAxMCIJCSI4IgorICAgIGdkYl90ZXN0ICJwIDIwIgkJIjE2IgorICAgIGdkYl90ZXN0ICJwIC0yMCIJCSItMTYiCisgICAgZ2RiX3Rlc3QgInAgMTAwIgkJIjY0IgorICAgIGdkYl90ZXN0ICJwIDgiCQkiSW52YWxpZCBudW1iZXIgXCI4XCIuIgorICAgIGdkYl90ZXN0ICJwIC05IgkJIkludmFsaWQgbnVtYmVyIFwiOVwiLiIKK30KKworcHJvYyB0ZXN0X2lucHV0X3JhZGl4XzEwIHt9IHsKKyAgICBnZGJfdGVzdCAic2V0IHJhZGl4IiBcCisJIklucHV0IGFuZCBvdXRwdXQgcmFkaWNlcyBub3cgc2V0IHRvIGRlY2ltYWwgMTAsIGhleCBhLCBvY3RhbCAxMi4iIFwKKwkic2V0IHJhZGl4ICM0IgorICAgIGdkYl90ZXN0ICJzZXQgaW5wdXQtcmFkaXggMTAiIFwKKwkiSW5wdXQgcmFkaXggbm93IHNldCB0byBkZWNpbWFsIDEwLCBoZXggYSwgb2N0YWwgMTIuIgorICAgIGdkYl90ZXN0ICJzaG93IHJhZGl4IiBcCisJIklucHV0IGFuZCBvdXRwdXQgcmFkaWNlcyBzZXQgdG8gZGVjaW1hbCAxMCwgaGV4IGEsIG9jdGFsIDEyLiIgXAorCSJzaG93IHJhZGl4ICM0IgorICAgIGdkYl90ZXN0ICJwIDAxMCIJCSI4IgorICAgIGdkYl90ZXN0ICJwIDIwLiIJCSIyMCIKKyAgICBnZGJfdGVzdCAicCAoaW50KSAyMC4iCSIyMCIKKyAgICBnZGJfdGVzdCAicCAweGYiCQkiMTUiCisgICAgZ2RiX3Rlc3QgInAgMTAiCQkiMTAiCisgICAgZ2RiX3Rlc3QgInAgLTEyIgkJIi0xMiIKK30KKworcHJvYyB0ZXN0X2lucHV0X3JhZGl4XzE2IHt9IHsKKyAgICBnZGJfdGVzdCAic2V0IHJhZGl4IiBcCisJIklucHV0IGFuZCBvdXRwdXQgcmFkaWNlcyBub3cgc2V0IHRvIGRlY2ltYWwgMTAsIGhleCBhLCBvY3RhbCAxMi4iIFwKKwkic2V0IHJhZGl4ICM1IgorICAgIGdkYl90ZXN0ICJzZXQgaW5wdXQtcmFkaXggMTYiIFwKKwkiSW5wdXQgcmFkaXggbm93IHNldCB0byBkZWNpbWFsIDE2LCBoZXggMTAsIG9jdGFsIDIwLiIKKyAgICBnZGJfdGVzdCAic2hvdyByYWRpeCIgXAorCSJJbnB1dCByYWRpeCBzZXQgdG8gZGVjaW1hbCAxNiwgaGV4IDEwLCBvY3RhbCAyMC5cclxuT3V0cHV0IHJhZGl4IHNldCB0byBkZWNpbWFsIDEwLCBoZXggYSwgb2N0YWwgMTIuIiBcCisJInNob3cgcmFkaXggIzUiCisgICAgZ2RiX3Rlc3QgInAgMDEwIgkJIjgiCisgICAgZ2RiX3Rlc3QgInAgMjAuIgkJIjIwIgorICAgIGdkYl90ZXN0ICJwIChpbnQpIDIwLiIJIjIwIgorICAgIGdkYl90ZXN0ICJwIDB4ZiIJCSIxNSIKKyAgICBnZGJfdGVzdCAicCAxMCIJCSIxNiIKKyAgICBnZGJfdGVzdCAicCAxMDAiCQkiMjU2IgorfQorCitwcm9jIHRlc3Rfb3V0cHV0X3JhZGl4Xzgge30geworICAgIGdkYl90ZXN0ICJzZXQgcmFkaXgiIFwKKwkiSW5wdXQgYW5kIG91dHB1dCByYWRpY2VzIG5vdyBzZXQgdG8gZGVjaW1hbCAxMCwgaGV4IGEsIG9jdGFsIDEyLiIgXAorCSJzZXQgcmFkaXggIzYiCisgICAgZ2RiX3Rlc3QgInNldCBvdXRwdXQtcmFkaXggOCIgXAorCSJPdXRwdXQgcmFkaXggbm93IHNldCB0byBkZWNpbWFsIDgsIGhleCA4LCBvY3RhbCAxMC4iCisgICAgZ2RiX3Rlc3QgInNob3cgcmFkaXgiIFwKKwkiSW5wdXQgcmFkaXggc2V0IHRvIGRlY2ltYWwgMTAsIGhleCBhLCBvY3RhbCAxMi5cclxuT3V0cHV0IHJhZGl4IHNldCB0byBkZWNpbWFsIDgsIGhleCA4LCBvY3RhbCAxMC4iIFwKKwkic2hvdyByYWRpeCAjNiIKKyAgICBnZGJfdGVzdCAicCAwMTAiCQkiMDEwIgorICAgICMgRklYTUU6ICBJZiBnZGIgY2FuJ3QgaGFuZGxlIGZsb2F0IHByaW50aW5nIGluIGRpZmZlcmVudCByYWRpY2VzLCBpdAorICAgICMgc2hvdWxkIGF0IGxlYXN0IHdhcm4gb25jZSB0aGUgZmlyc3QgdGltZSB0aGF0IGlzIGF0dGVtcHRlZC4KKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgZ2RiX3Rlc3QgInAgMjAuIgkJIjI0IgkiRmxvYXQgcHJpbnRpbmcgd2hlbiBvdXRwdXQgcmFkaXggaXMgOCIKKyAgICBnZGJfdGVzdCAicCAoaW50KSAyMC4iCSIyNCIKKyAgICBnZGJfdGVzdCAicCAweGYiCQkiMTciCisgICAgZ2RiX3Rlc3QgInAgMTAiCQkiMTIiCisgICAgZ2RiX3Rlc3QgInAgMTAwIgkJIjE0NCIKK30KKworcHJvYyB0ZXN0X291dHB1dF9yYWRpeF8xMCB7fSB7CisgICAgZ2RiX3Rlc3QgInNldCByYWRpeCIgXAorCSJJbnB1dCBhbmQgb3V0cHV0IHJhZGljZXMgbm93IHNldCB0byBkZWNpbWFsIDEwLCBoZXggYSwgb2N0YWwgMTIuIiBcCisJInNldCByYWRpeCAjNyIKKyAgICBnZGJfdGVzdCAic2V0IG91dHB1dC1yYWRpeCAxMCIgXAorCSJPdXRwdXQgcmFkaXggbm93IHNldCB0byBkZWNpbWFsIDEwLCBoZXggYSwgb2N0YWwgMTIuIgorICAgIGdkYl90ZXN0ICJzaG93IHJhZGl4IiBcCisJIklucHV0IGFuZCBvdXRwdXQgcmFkaWNlcyBzZXQgdG8gZGVjaW1hbCAxMCwgaGV4IGEsIG9jdGFsIDEyLiIgXAorCSJzaG93IHJhZGl4ICM3IgorICAgIGdkYl90ZXN0ICJwIDAxMCIJCSI4IgorICAgIGdkYl90ZXN0ICJwIDIwLiIJCSIyMCIKKyAgICBnZGJfdGVzdCAicCAoaW50KSAyMC4iCSIyMCIKKyAgICBnZGJfdGVzdCAicCAweGYiCQkiMTUiCisgICAgZ2RiX3Rlc3QgInAgMTAiCQkiMTAiCisgICAgZ2RiX3Rlc3QgInAgMTAwIgkJIjEwMCIKK30KKworcHJvYyB0ZXN0X291dHB1dF9yYWRpeF8xNiB7fSB7CisgICAgZ2RiX3Rlc3QgInNldCByYWRpeCIgXAorCSJJbnB1dCBhbmQgb3V0cHV0IHJhZGljZXMgbm93IHNldCB0byBkZWNpbWFsIDEwLCBoZXggYSwgb2N0YWwgMTIuIiBcCisJInNldCByYWRpeCAjOCIKKyAgICBnZGJfdGVzdCAic2V0IG91dHB1dC1yYWRpeCAxNiIgXAorCSJPdXRwdXQgcmFkaXggbm93IHNldCB0byBkZWNpbWFsIDE2LCBoZXggMTAsIG9jdGFsIDIwLiIKKyAgICBnZGJfdGVzdCAic2hvdyByYWRpeCIgXAorCSJJbnB1dCByYWRpeCBzZXQgdG8gZGVjaW1hbCAxMCwgaGV4IGEsIG9jdGFsIDEyLlxyXG5PdXRwdXQgcmFkaXggc2V0IHRvIGRlY2ltYWwgMTYsIGhleCAxMCwgb2N0YWwgMjAuIiBcCisJInNob3cgcmFkaXggIzgiCisgICAgZ2RiX3Rlc3QgInAgMDEwIgkJIjgiCisgICAgIyBGSVhNRTogIElmIGdkYiBjYW4ndCBoYW5kbGUgZmxvYXQgcHJpbnRpbmcgaW4gZGlmZmVyZW50IHJhZGljZXMsIGl0CisgICAgIyBzaG91bGQgYXQgbGVhc3Qgd2FybiBvbmNlIHRoZSBmaXJzdCB0aW1lIHRoYXQgaXMgYXR0ZW1wdGVkLgorICAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICBnZGJfdGVzdCAicCAyMC4iCQkiMTQiCSJGbG9hdCBwcmludGluZyB3aGVuIG91dHB1dCByYWRpeCBpcyAxNiIKKyAgICBnZGJfdGVzdCAicCAoaW50KSAyMC4iCSIxNCIKKyAgICBnZGJfdGVzdCAicCAweGYiCQkiZiIKKyAgICBnZGJfdGVzdCAicCAxMCIJCSJhIgorICAgIGdkYl90ZXN0ICJwIDEwMCIJCSI2NCIKK30KKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CisKK3Rlc3RfaW5wdXRfcmFkaXhfMgordGVzdF9pbnB1dF9yYWRpeF8zCit0ZXN0X2lucHV0X3JhZGl4XzgKK3Rlc3RfaW5wdXRfcmFkaXhfMTAKK3Rlc3RfaW5wdXRfcmFkaXhfMTYKK3Rlc3Rfb3V0cHV0X3JhZGl4XzgKK3Rlc3Rfb3V0cHV0X3JhZGl4XzEwCit0ZXN0X291dHB1dF9yYWRpeF8xNgpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9yZWN1cnNlLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3JlY3Vyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDY4OTJkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9yZWN1cnNlLmMKQEAgLTAsMCArMSwyNSBAQAorLyogVHJpdmlhbCBjb2RlIHVzZWQgdG8gdGVzdCB3YXRjaHBvaW50cyBpbiByZWN1cnNpdmUgY29kZSBhbmQgCisgICBhdXRvLWRlbGV0aW9uIG9mIHdhdGNocG9pbnRzIGFzIHRoZXkgZ28gb3V0IG9mIHNjb3BlLiAgKi8KKworc3RhdGljIGludCAKK3JlY3Vyc2UgKGEpCisgICAgIGludCBhOworeworICBpbnQgYiA9IDA7CisKKyAgaWYgKGEgPT0gMSkKKyAgICByZXR1cm4gMTsKKworICBiID0gYTsKKyAgYiAqPSByZWN1cnNlIChhIC0gMSk7CisgIHJldHVybiBiOworfQorCittYWluKCkKK3sKKyNpZmRlZiB1c2VzdHVicworICBzZXRfZGVidWdfdHJhcHMoKTsKKyAgYnJlYWtwb2ludCgpOworI2VuZGlmCisgIHJlY3Vyc2UgKDEwKTsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvcmVjdXJzZS5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3JlY3Vyc2UuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZTFiMzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3JlY3Vyc2UuZXhwCkBAIC0wLDAgKzEsMTQ1IEBACisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgSmVmZiBMYXcuIChsYXdAY3MudXRhaC5lZHUpCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJyZWN1cnNlIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQoraWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworcHJvYyByZWN1cnNlX3Rlc3RzIHt9IHsKKworICAgIGlmIFtydW50byByZWN1cnNlXSB0aGVuIHsKKwkjIEZpcnN0IHdlIG5lZWQgdG8gc3RlcCBvdmVyIHRoZSBhc3NpZ25tZW50IG9mIGIsIHNvIGl0IGhhcyBhIGtub3duCisJIyB2YWx1ZS4KKwlnZGJfdGVzdCAibmV4dCIgImlmIFxcKGEgPT0gMVxcKSIgIm5leHQgb3ZlciBiID0gMCBpbiBmaXJzdCBpbnN0YW5jZSIKKwlnZGJfdGVzdCAid2F0Y2ggYiIgIi4qXFtXd1xdYXRjaHBvaW50IFxbMC05XSo6IGIiIFwKKwkgICAgInNldCBmaXJzdCBpbnN0YW5jZSB3YXRjaHBvaW50IgorCisJIyBDb250aW51ZSB1bnRpbCBpbml0aWFsIHNldCBvZiBiLgorCWlmIFtnZGJfdGVzdCAiY29udGludWUiIFwKKwkgICAgIkNvbnRpbnVpbmcuKlxbV3dcXWF0Y2hwb2ludC4qOiBiLipPbGQgdmFsdWUgPSAwLipOZXcgdmFsdWUgPSAxMC4qIiBcCisJICAgICJjb250aW51ZSB0byBmaXJzdCBpbnN0YW5jZSB3YXRjaHBvaW50LCBmaXJzdCB0aW1lIl0gdGhlbiB7CisJICAgIGdkYl9zdXBwcmVzc190ZXN0czsKKwl9CisKKwkjIENvbnRpbnVlIGlud2FyZCBmb3IgYSBmZXcgaXRlcmF0aW9ucworCWdkYl90ZXN0ICJjb250aW51ZSIgIkJyZWFrcG9pbnQuKiByZWN1cnNlIFxcKGE9OVxcKS4qIiBcCisJICAgICJjb250aW51ZSB0byByZWN1cnNlIChhID0gOSkiCisJZ2RiX3Rlc3QgImNvbnRpbnVlIiAiQnJlYWtwb2ludC4qIHJlY3Vyc2UgXFwoYT04XFwpLioiIFwKKwkgICAgImNvbnRpbnVlIHRvIHJlY3Vyc2UgKGEgPSA4KSIKKwlnZGJfdGVzdCAiY29udGludWUiICJCcmVha3BvaW50LiogcmVjdXJzZSBcXChhPTdcXCkuKiIgXAorCSAgICAiY29udGludWUgdG8gcmVjdXJzZSAoYSA9IDcpIgorCWdkYl90ZXN0ICJjb250aW51ZSIgIkJyZWFrcG9pbnQuKiByZWN1cnNlIFxcKGE9NlxcKS4qIiBcCisJICAgICJjb250aW51ZSB0byByZWN1cnNlIChhID0gNikiCisJZ2RiX3Rlc3QgImNvbnRpbnVlIiAiQnJlYWtwb2ludC4qIHJlY3Vyc2UgXFwoYT01XFwpLioiIFwKKwkgICAgImNvbnRpbnVlIHRvIHJlY3Vyc2UgKGEgPSA1KSIKKworCSMgUHV0IGEgd2F0Y2hwb2ludCBvbiBhbm90aGVyIGluc3RhbmNlIG9mIGIKKwkjIEZpcnN0IHdlIG5lZWQgdG8gc3RlcCBvdmVyIHRoZSBhc3NpZ25tZW50IG9mIGIsIHNvIGl0IGhhcyBhIGtub3duCisJIyB2YWx1ZS4KKwlnZGJfdGVzdCAibmV4dCIgImlmIFxcKGEgPT0gMVxcKSIgIm5leHQgb3ZlciBiID0gMCBpbiBzZWNvbmQgaW5zdGFuY2UiCisJZ2RiX3Rlc3QgIndhdGNoIGIiICIuKlxbV3dcXWF0Y2hwb2ludCBcWzAtOV0qOiBiIiBcCisJICAgICJzZXQgc2Vjb25kIGluc3RhbmNlIHdhdGNocG9pbnQiCisKKwkjIENvbnRpbnVlIHVudGlsIGluaXRpYWwgc2V0IG9mIGIgKHNlY29uZCBpbnN0YW5jZSkuCisJaWYgW2dkYl90ZXN0ICJjb250aW51ZSIgXAorCSAgICAiQ29udGludWluZy4qXFtXd1xdYXRjaHBvaW50Lio6IGIuKk9sZCB2YWx1ZSA9IDAuKk5ldyB2YWx1ZSA9IDUuKiJcCisJICAgICJjb250aW51ZSB0byBzZWNvbmQgaW5zdGFuY2Ugd2F0Y2hwb2ludCwgZmlyc3QgdGltZSJdIHRoZW4geworCWdkYl9zdXBwcmVzc190ZXN0czsKKwl9CisKKwkjIENvbnRpbnVlIGlud2FyZCBmb3IgYSBmZXcgaXRlcmF0aW9ucworCWdkYl90ZXN0ICJjb250aW51ZSIgIkJyZWFrcG9pbnQuKiByZWN1cnNlIFxcKGE9NFxcKS4qIiBcCisJICAgICJjb250aW51ZSB0byByZWN1cnNlIChhID0gNCkiCisJZ2RiX3Rlc3QgImNvbnRpbnVlIiAiQnJlYWtwb2ludC4qIHJlY3Vyc2UgXFwoYT0zXFwpLioiIFwKKwkgICAgImNvbnRpbnVlIHRvIHJlY3Vyc2UgKGEgPSAzKSIKKwlnZGJfdGVzdCAiY29udGludWUiICJCcmVha3BvaW50LiogcmVjdXJzZSBcXChhPTJcXCkuKiIgXAorCSAgICAiY29udGludWUgdG8gcmVjdXJzZSAoYSA9IDIpIgorCWdkYl90ZXN0ICJjb250aW51ZSIgIkJyZWFrcG9pbnQuKiByZWN1cnNlIFxcKGE9MVxcKS4qIiBcCisJICAgICJjb250aW51ZSB0byByZWN1cnNlIChhID0gMSkiCisKKwkjIENvbnRpbnVlIHVudGlsIHNlY29uZCBzZXQgb2YgYiAoc2Vjb25kIGluc3RhbmNlKS4KKwlpZiBbZ2RiX3Rlc3QgImNvbnRpbnVlIiBcCisJICAgICJDb250aW51aW5nLipcW1d3XF1hdGNocG9pbnQuKjogYi4qT2xkIHZhbHVlID0gNS4qTmV3IHZhbHVlID0gMTIwLipyZXR1cm4uKiIgXAorCSAgICAiY29udGludWUgdG8gc2Vjb25kIGluc3RhbmNlIHdhdGNocG9pbnQsIHNlY29uZCB0aW1lIl0gdGhlbiB7IAorCSAgICBnZGJfc3VwcHJlc3NfdGVzdHM7CisJfQorCisJIyBDb250aW51ZSBhZ2Fpbi4gIFdlIHNob3VsZCBoYXZlIGEgd2F0Y2hwb2ludCBnbyBvdXQgb2Ygc2NvcGUgbm93CisJaWYgW2dkYl90ZXN0ICJjb250aW51ZSIgXAorCSAgICAiQ29udGludWluZy4qXFtXd1xdYXRjaHBvaW50LipkZWxldGVkLipyZWN1cnNlIFxcKGE9NlxcKSAuKiIgXAorCSAgICAic2Vjb25kIGluc3RhbmNlIHdhdGNocG9pbnQgZGVsZXRlZCB3aGVuIGxlYXZpbmcgc2NvcGUiXSB0aGVuIHsKKwkgICAgZ2RiX3N1cHByZXNzX3Rlc3RzOworCX0KKworCSMgQ29udGludWUgdW50aWwgc2Vjb25kIHNldCBvZiBiIChmaXJzdCBpbnN0YW5jZSkuCisJIyAyNDMyMCBpcyBhbGxvd2VkIGFzIHRoZSBmaW5hbCB2YWx1ZSBmb3IgYiBhcyB0aGF0J3MgdGhlIHZhbHVlCisJIyBiIHdvdWxkIGhhdmUgb24gc3lzdGVtcyB3aXRoIDE2Yml0IGludGVnZXJzLgorCSMKKwkjIFdlIGNvdWxkIGZpeCB0aGUgdGVzdCBwcm9ncmFtIHRvIGRlYWwgd2l0aCB0aGlzIHRvby4KKwlpZiBbZ2RiX3Rlc3QgImNvbnRpbnVlIiBcCisJICAgICJDb250aW51aW5nLipcW1d3XF1hdGNocG9pbnQuKmIuKk9sZCB2YWx1ZSA9IDEwLipOZXcgdmFsdWUgPSBcKDM2Mjg4MDB8MjQzMjBcKS4qcmV0dXJuLioiIFwKKwkgICAgImNvbnRpbnVlIHRvIGZpcnN0IGluc3RhbmNlIHdhdGNocG9pbnQsIHNlY29uZCB0aW1lIl0gdGhlbiB7CisJICAgIGdkYl9zdXBwcmVzc190ZXN0cworCX0KKworCSMgQ29udGludWUgYWdhaW4uICBXZSBzaG91bGQgaGF2ZSBhIHdhdGNocG9pbnQgZ28gb3V0IG9mIHNjb3BlIG5vdworCWlmIFtnZGJfdGVzdCAiY29udGludWUiIFwKKwkgICAgIkNvbnRpbnVpbmcuKlxbV3dcXWF0Y2hwb2ludC4qZGVsZXRlZC4qbWFpbiBcXChcXCkgLioiIFwKKwkgICAgImZpcnN0IGluc3RhbmNlIHdhdGNocG9pbnQgZGVsZXRlZCB3aGVuIGxlYXZpbmcgc2NvcGUiXSB0aGVuIHsKKwkgICAgZ2RiX3N1cHByZXNzX3Rlc3RzOworCX0KKyAgICB9CisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7Cit9CisKKyMgT25seSBlbmFibGVkIGZvciBzb21lIHRhcmdldHMgbWVyZWx5IGJlY2F1c2UgaXQgaGFzIG5vdCBiZWVuIHRlc3RlZCAKKyMgZWxzZXdoZXJlLgoraWYge1tpc3RhcmdldCAic3BhcmMqLSotc3Vub3M0KiJdIHx8IFtpc3RhcmdldCAiaHBwYSotKi1ic2QqIl0gfHwgW2lzdGFyZ2V0ICJocHBhKi0qLWhwdXgqIl0gfHwgW2lzdGFyZ2V0ICJzcGFyY2xldC0qLSoiXSB8fCBbaXN0YXJnZXQgIm0zMnItKi1lbGYiXSB8fCBbaXN0YXJnZXQgIm1uMTAyMDAtKi0qIl0gfHwgW2lzdGFyZ2V0ICJtbjEwMzAwLSotKiJdfSB0aGVuIHsKKworICAgICMgUHJlc2VydmUgdGhlIG9sZCB0aW1lb3V0LCBhbmQgc2V0IGEgbmV3IG9uZSB0aGF0IHNob3VsZCBiZQorICAgICMgc3VmZmljaWVudCB0byBhdm9pZCB0aW1pbmcgb3V0IGR1cmluZyB0aGlzIHRlc3QuCisgICAgc2V0IG9sZHRpbWVvdXQgJHRpbWVvdXQKKyAgICBzZXQgdGltZW91dCBbZXhwciAiJHRpbWVvdXQgKyA2MCJdCisgICAgdmVyYm9zZSAiVGltZW91dCBpcyBub3cgJHRpbWVvdXQgc2Vjb25kcyIgMgorCisgICAgcmVjdXJzZV90ZXN0cworCisgICAgIyBSZXN0b3JlIHRoZSBwcmVzZXJ2ZWQgb2xkIHRpbWVvdXQgdmFsdWUuCisgICAgc2V0IHRpbWVvdXQgJG9sZHRpbWVvdXQKKyAgICB2ZXJib3NlICJUaW1lb3V0IGlzIG5vdyAkdGltZW91dCBzZWNvbmRzIiAyCit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3JlZ3MuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9yZWdzLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDhiOTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9yZWdzLmV4cApAQCAtMCwwICsxLDg2IEBACisjIFRlc3RzIG9mIHJlZ2lzdGVyIGRpc3BsYXlzIGZvciBHREIuCisjICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFN0YW4gU2hlYnMuIChzaGVic0BjeWdudXMuY29tKQorCisjIFRoaXMgZG9lcyBub3QgKHlldCkgaGF2ZSBhbiBhc3NvY2lhdGVkIGV4ZWN1dGFibGUsIHNpbmNlIHRoZSBJRFQgYm9hcmQKKyMgd2lsbCBkaXNwbGF5IHJlZ2lzdGVycyBldmVuIHdpdGhvdXQgYSBwcm9ncmFtIGJlaW5nIGxvYWRlZC4KKyMgQSBtb3JlIGNvbXByZWhlbnNpdmUgcmVnaXN0ZXIgdGVzdCB3b3VsZCBhY3R1YWxseSB0ZXN0IHJlYWRpbmcKKyMgYW5kIHdyaXRpbmcgb2YgcmVnaXN0ZXJzIGluIGEgcmVhbCBwcm9ncmFtLCBhbHRob3VnaCBzb21lIGNhcmUKKyMgd291bGQgYmUgcmVxdWlyZWQgaW4gdGhlIHdyaXRpbmcgb2YgdGhlIHRlc3RzLgorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKKwl9CisKKyMgVGhlc2UgdGVzdHMgZXhlcmNpc2UgSURULXNwZWNpZmljIE1JUFMgcmVnaXN0ZXJzIGZvciBzZXZlcmFsCisjIGRpZmZlcmVudCBwcm9jZXNzb3IgbW9kZWxzLgorCisjIFRoaXMgc2hvdWxkIGRldGVjdCB0aGUgYWN0dWFsIHByb2Nlc3NvciBpbiB1c2UgYW5kIGNoYW5nZQorIyB0aGUgZXhwZWN0ZWQgcmVzdWx0cyBhcHByb3ByaWF0ZWx5LiAgRklYTUUKKworcHJvYyBpZHRfcmVnaXN0ZXJfdGVzdHMgeyB9IHsKKwkjIFRlc3QgdGhlIGdlbmVyaWMgSURUIGNoaXAuCisJZ2RiX3Rlc3QgImluZm8gcmVnaXN0ZXJzIiAiLioiCisJZ2RiX3Rlc3QgImluZm8gcmVnaXN0ZXIgemVybyIgInplcm8ocjApOiAweDA7IgorCSMgRklYTUUgYWNjZXNzIGVhY2ggZ2VuZXJpYyByZWdpc3RlciBpbmRpdmlkdWFsbHkKKwkjIFRlc3QgdGhlIDMwNDEuCisJZ2RiX3Rlc3QgInNldCBwcm9jZXNzb3IgcjMwNDEiICIuKiIKKwlnZGJfdGVzdCAiaW5mbyByZWdpc3RlcnMiICIuKiIKKwlnZGJfdGVzdCAiaW5mbyByZWdpc3RlciBidXMiICAiYnVzLioweC4qIgorCWdkYl90ZXN0ICJpbmZvIHJlZ2lzdGVyIGNjZmciICJjY2ZnLioweC4qIgorCWdkYl90ZXN0ICJpbmZvIHJlZ2lzdGVyIHBvcnQiICJwb3J0LioweC4qIgorCWdkYl90ZXN0ICJpbmZvIHJlZ2lzdGVyIGNtcCIgICJjbXAuKjB4LioiCisJZ2RiX3Rlc3QgImluZm8gcmVnaXN0ZXIgZWxvIiAgImVsbzogaW52YWxpZCByZWdpc3RlciIKKwlnZGJfdGVzdCAiaW5mbyByZWdpc3RlciBlaGkiICAiZWhpOiBpbnZhbGlkIHJlZ2lzdGVyIgorCWdkYl90ZXN0ICJpbmZvIHJlZ2lzdGVyIGNmZyIgICJjZmc6IGludmFsaWQgcmVnaXN0ZXIiCisJZ2RiX3Rlc3QgImluZm8gcmVnaXN0ZXIgY3R4dCIgImN0eHQ6IGludmFsaWQgcmVnaXN0ZXIiCisJIyBUZXN0IHRoZSAzMDUxLgorCWdkYl90ZXN0ICJzZXQgcHJvY2Vzc29yIHIzMDUxIiAiLioiCisJZ2RiX3Rlc3QgImluZm8gcmVnaXN0ZXJzIiAiLioiCisJZ2RiX3Rlc3QgImluZm8gcmVnaXN0ZXIgYnVzIiAgImJ1czogaW52YWxpZCByZWdpc3RlciIKKwlnZGJfdGVzdCAiaW5mbyByZWdpc3RlciBjY2ZnIiAiY2NmZzogaW52YWxpZCByZWdpc3RlciIKKwlnZGJfdGVzdCAiaW5mbyByZWdpc3RlciBwb3J0IiAicG9ydDogaW52YWxpZCByZWdpc3RlciIKKwlnZGJfdGVzdCAiaW5mbyByZWdpc3RlciBjbXAiICAiY21wOiBpbnZhbGlkIHJlZ2lzdGVyIgorCWdkYl90ZXN0ICJpbmZvIHJlZ2lzdGVyIGVsbyIgICJlbG8uKjB4LioiCisJZ2RiX3Rlc3QgImluZm8gcmVnaXN0ZXIgZWhpIiAgImVoaS4qMHguKiIKKwlnZGJfdGVzdCAiaW5mbyByZWdpc3RlciBjZmciICAiY2ZnOiBpbnZhbGlkIHJlZ2lzdGVyIgorCWdkYl90ZXN0ICJpbmZvIHJlZ2lzdGVyIGN0eHQiICJjdHh0OiBpbnZhbGlkIHJlZ2lzdGVyIgorCSMgVGVzdCB0aGUgMzA3MS4KKwlnZGJfdGVzdCAic2V0IHByb2Nlc3NvciByMzA3MSIgIi4qIgorCWdkYl90ZXN0ICJpbmZvIHJlZ2lzdGVycyIgIi4qIgorCWdkYl90ZXN0ICJpbmZvIHJlZ2lzdGVyIGJ1cyIgICJidXM6IGludmFsaWQgcmVnaXN0ZXIiCisJZ2RiX3Rlc3QgImluZm8gcmVnaXN0ZXIgY2NmZyIgImNjZmc6IGludmFsaWQgcmVnaXN0ZXIiCisJZ2RiX3Rlc3QgImluZm8gcmVnaXN0ZXIgcG9ydCIgInBvcnQ6IGludmFsaWQgcmVnaXN0ZXIiCisJZ2RiX3Rlc3QgImluZm8gcmVnaXN0ZXIgY21wIiAgImNtcDogaW52YWxpZCByZWdpc3RlciIKKwlnZGJfdGVzdCAiaW5mbyByZWdpc3RlciBlbG8iICAiZWxvLioweC4qIgorCWdkYl90ZXN0ICJpbmZvIHJlZ2lzdGVyIGVoaSIgICJlaGkuKjB4LioiCisJZ2RiX3Rlc3QgImluZm8gcmVnaXN0ZXIgY2ZnIiAgImNmZy4qMHguKiIKKwlnZGJfdGVzdCAiaW5mbyByZWdpc3RlciBjdHh0IiAiY3R4dC4qMHguKiIKK30KKworaWYgW2lzdGFyZ2V0ICJtaXBzKi1pZHQtKiJdIHRoZW4geworICAgIGdkYl9leGl0CisgICAgZ2RiX3N0YXJ0CisgICAgZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisgICAgaWR0X3JlZ2lzdGVyX3Rlc3RzCit9IGVsc2UgeworICAgIHZlcmJvc2UgInJlZ3MuZXhwIHRlc3RzIGlnbm9yZWQgZm9yIHRoaXMgdGFyZ2V0IgorfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9yZWxhdGlvbmFsLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvcmVsYXRpb25hbC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwYjM4YQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvcmVsYXRpb25hbC5leHAKQEAgLTAsMCArMSw0ODEgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBFbGVuYSBaYW5ub25pIChlemFubm9uaUBjeWdudXMuY29tKQorCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBnZGIgdGVzdHN1aXRlCisjCisjIHRlc3RzIGZvciBjb3JyZWN0ZW5zcyBvZiByZWxhdGlvbmFsIG9wZXJhdG9ycywgYXNzb2NpYXRpdml0eSBhbmQgcHJlY2VkZW5jZQorIyB3aXRoIGludGVnZXIgdHlwZSB2YXJpYWJsZXMKKyMgCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorCX0KKworIworIyB0ZXN0IHJ1bm5pbmcgcHJvZ3JhbXMKKyMKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgImludC10eXBlIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQoraWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1ZyBhZGRpdGlvbmFsX2ZsYWdzPS13fV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorICAgIH0KKworCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworCisjCisjIHNldCBpdCB1cCBhdCBhIGJyZWFrcG9pbnQgc28gd2UgY2FuIHBsYXkgd2l0aCB0aGUgdmFyaWFibGUgdmFsdWVzCisjCisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgcGVycm9yICJjb3VsZG4ndCBydW4gdG8gYnJlYWtwb2ludCIKKyAgICBjb250aW51ZQorfQorCisjCisjIHRlc3QgZXhwcmVzc2lvbnMgd2l0aCAiaW50IiB0eXBlcworIworCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHg9MTQiICIiICJzZXQgdmFyaWFibGUgeD0xNCIKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeT0yIiAiIiAic2V0IHZhcmlhYmxlIHk9MiIKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgej0yIiAiIiAic2V0IHZhcmlhYmxlIHo9MiIKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgdz0zIiAiIiAic2V0IHZhcmlhYmxlIHc9MyIKKworc2VuZF9nZGIgInByaW50IHhcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxNC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHgiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4IiB9ICAgIAorICB9CisKKworc2VuZF9nZGIgInByaW50IHlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioyLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHkiIH0gICAgCisgIH0KKworc2VuZF9nZGIgInByaW50IHpcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioyLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHoiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHoiIH0gICAgCisgIH0KKworc2VuZF9nZGIgInByaW50IHdcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiozLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHciCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgdyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHciIH0gICAgCisgIH0KKworCisKK3NlbmRfZ2RiICJwcmludCB4IDwgeVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeDx5IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHg8eSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHg8eSIgfSAgICAKKyAgfQorCitzZW5kX2dkYiAicHJpbnQgeCA8PSB5XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4PD15IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHg8PXkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4PD15IiB9ICAgIAorICB9CisKK3NlbmRfZ2RiICJwcmludCB4ID4geVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeD55IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHg+eSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHg+eSIgfSAgICAKKyAgfQorCitzZW5kX2dkYiAicHJpbnQgeCA+PSB5XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4Pj15IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHg+PXkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4Pj15IiB9ICAgIAorICB9CisKK3NlbmRfZ2RiICJwcmludCB4ID09IHlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiowLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHg9PXkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeD09eSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHg9PXkiIH0gICAgCisgIH0KKworc2VuZF9nZGIgInByaW50IHggIT0geVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeCE9eSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4IT15IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeCE9eSIgfSAgICAKKyAgfQorCisKKworIyBUZXN0IGFzc29jaWF0aXZpdHkgb2YgPCwgPiwgPD0sID49LCA9PSwgIT0KKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB4PTMiICIiICJzZXQgdmFyaWFibGUgeCIKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeT01IiAiIiAgInNldCB2YXJpYWJsZSB5IgorZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB6PTIiICIiICAic2V0IHZhcmlhYmxlIHoiCisKKworCitzZW5kX2dkYiAicHJpbnQgeCA8IHkgPCB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHg8eTx6IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHg8eTx6IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeDx5PHoiIH0gICAgCisgIH0KKworc2VuZF9nZGIgInByaW50IHggPD0geSA8PSB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHg8PXk8PXoiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeDw9eTw9eiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHg8PXk8PXoiIH0gICAgCisgIH0KKworc2VuZF9nZGIgInByaW50IHggPiB5ID4gelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4Pnk+eiIKKyAgICAgIH0KKyAgICAtcmUgOCIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeD55PnoiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4Pnk+eiIgfSAgICAKKyAgfQorCitzZW5kX2dkYiAicHJpbnQgeCA+PSB5ID49IHpcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiowXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeD49eT49eiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4Pj15Pj16IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeD49eT49eiIgfSAgICAKKyAgfQorCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHg9MiIgIiIgInNldCB2YXJpYWJsZSB4IgorZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB5PTIiICIiICAic2V0IHZhcmlhYmxlIHkiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHo9MSIgIiIgICJzZXQgdmFyaWFibGUgeiIKKworCitzZW5kX2dkYiAicHJpbnQgeCA9PSB5ID09IHpcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHg9PXk9PXoiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeD09eT09eiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHg9PXk9PXoiIH0gICAgCisgIH0KKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB6PTAiICIiICAic2V0IHZhcmlhYmxlIHoiCisKKworc2VuZF9nZGIgInByaW50IHggIT0geSAhPSB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHghPXkhPXoiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeCE9eSE9eiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHghPXkhPXoiIH0gICAgCisgIH0KKworCisjIHRlc3QgcHJlY2VkZW5jZSBydWxlcyBvbiBwYWlycyBvZiByZWxhdGlvbmFsIG9wZXJhdG9ycworCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHg9MCIgIiIgInNldCB2YXJpYWJsZSB4IgorZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB5PTIiICIiICAic2V0IHZhcmlhYmxlIHkiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHo9MiIgIiIgICJzZXQgdmFyaWFibGUgeiIKKworCitzZW5kX2dkYiAicHJpbnQgeCA8IHkgPT0gelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeDx5PT16IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHg8eT09eiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHg8eT09eiIgfSAgICAKKyAgfQorCisjIDAgIDIgIDIKK3NlbmRfZ2RiICJwcmludCB4IDwgeSAhPSB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4PHkhPXoiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeDx5IT16IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeDx5IT16IiB9ICAgIAorICB9CisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeD0yIiAiIiAic2V0IHZhcmlhYmxlIHgiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHk9MyIgIiIgICJzZXQgdmFyaWFibGUgeSIKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgej0xIiAiIiAgInNldCB2YXJpYWJsZSB6IgorCisKKyMgMiAzIDEKK3NlbmRfZ2RiICJwcmludCB4IDwgeSA8PSB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4PHk8PXoiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeDx5PD16IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeDx5PD16IiB9ICAgIAorICB9CisKKworIyAyIDMgMQorc2VuZF9nZGIgInByaW50IHggPCB5ID49IHpcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHg8eT49eiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4PHk+PXoiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4PHk+PXoiIH0gICAgCisgIH0KKworCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHo9MCIgIiIgIiBzZXQgdmFyaWFibGUgeiIKKworCisjIDIgMyAwCitzZW5kX2dkYiAicHJpbnQgeCA8IHkgPiB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4PHk+eiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4PHk+eiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHg8eT56IiB9ICAgIAorICB9CisKKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB4PTEiICIiICIgc2V0IHZhcmlhYmxlIHgiCisKKyMgMSAzIDAKK3NlbmRfZ2RiICJwcmludCB4ID4geSA+PSB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4Pnk+PXoiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeD55Pj16IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeD55Pj16IiB9ICAgIAorICB9CisKKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB6PTIiICIiICIgc2V0IHZhcmlhYmxlIHoiCisKKyMgMSAzIDIKK3NlbmRfZ2RiICJwcmludCB4ID4geSA9PSB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4Pnk9PXoiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeD55PT16IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeD55PT16IiB9ICAgIAorICB9CisKKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB4PTIiICIiICIgc2V0IHZhcmlhYmxlIHgiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHo9MCIgIiIgIiBzZXQgdmFyaWFibGUgeiIKKworIyAyIDMgMAorc2VuZF9nZGIgInByaW50IHggPiB5ICE9IHpcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiowLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHg+eSE9eiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4PnkhPXoiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4PnkhPXoiIH0gICAgCisgIH0KKworCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHg9NCIgIiIgInNldCB4IHRvIDQiCisKKyMgNCAzIDAKK3NlbmRfZ2RiICJwcmludCB4ID4geSA8PSB6XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4Pnk8PXoiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeD55PD16IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeD55PD16IiB9ICAgIAorICB9CisKKyMgNCAzIDAKK3NlbmRfZ2RiICJwcmludCB4ID49IHkgPT0gelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4Pj15PT16IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHg+PXk9PXoiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4Pj15PT16IiB9ICAgIAorICB9CisKKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB4PTIiICIiICIgc2V0IHZhcmlhYmxlIHgiCisKKyMgMiAzIDAKK3NlbmRfZ2RiICJwcmludCB4ID49IHkgIT0gelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4Pj15IT16IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHg+PXkhPXoiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4Pj15IT16IiB9ICAgIAorICB9CisKKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB4PTAiICIiICIgc2V0IHZhcmlhYmxlIHgiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHo9NCIgIiIgIiBzZXQgdmFyaWFibGUgeiIKKworIyAwIDMgNCAKK3NlbmRfZ2RiICJwcmludCB4ID49IHkgPD0gelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjFcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4Pj15PD16IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHg+PXk8PXoiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4Pj15PD16IiB9ICAgIAorICB9CisKKyMgMCAzIDQKK3NlbmRfZ2RiICJwcmludCB4IDw9IHkgPT0gelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4PD15PT16IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHg8PXk9PXoiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4PD15PT16IiB9ICAgIAorICB9CisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeD0yIiAiIiAiIHNldCB2YXJpYWJsZSB4IgorCisjIDIgMyA0CitzZW5kX2dkYiAicHJpbnQgeCA8PSB5ICE9IHpcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioxXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeDw9eSE9eiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB4PD15IT16IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeDw9eSE9eiIgfSAgICAKKyAgfQorCisKKyMgMiAzIDQKK3NlbmRfZ2RiICJwcmludCB4ID09IHkgIT0gelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjFcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4PT15IT16IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHg9PXkhPXoiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB4PT15IT16IiB9ICAgIAorICB9CisKKyAgICAgICAgCisKKyMgdGVzdCB1c2Ugb2YgcGFyZW50aGVzaXMgdG8gZW5mb3JjZSBkaWZmZXJlbnQgb3JkZXIgb2YgZXZhbHVhdGlvbgorCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgej0wIiAiIiAiIHNldCB2YXJpYWJsZSB6IgorCisjIDIgMyAwCitzZW5kX2dkYiAicHJpbnQgeCA+PSAoeSA8IHopXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHg+PSh5PHopIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHg+PSh5PHopIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeD49KHk8eikiIH0gICAgCisgIH0KKworCisjIDIgMyAwCitzZW5kX2dkYiAicHJpbnQgeCA+PSAoeSAhPSB6KVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjFcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4Pj0oeSE9eikiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeD49KHkqIT16KSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHg+PSh5IT16KSIgfSAgICAKKyAgfQorCisjIDIgMyAwCitzZW5kX2dkYiAicHJpbnQgeCA9PSAoeSA9PSB6KVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiB4PT0oeT09eikiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeD09KHk9PXopIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeD09KHk9PXopIiB9ICAgIAorICB9CisKKworZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB4PTEiICIiICIgc2V0IHZhcmlhYmxlIHgiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHo9NCIgIiIgIiBzZXQgdmFyaWFibGUgeiIKKworIyAxIDMgNAorc2VuZF9nZGIgInByaW50ICh4ID09IHkpIDwgelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjFcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAoeD09eSk8eiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiAoeD09eSk8eiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mICh4PT15KTx6IiB9ICAgIAorICB9CisKKworCisKKworCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3JlcmVhZC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3JlcmVhZC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkYWJkNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvcmVyZWFkLmV4cApAQCAtMCwwICsxLDExNyBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHByb3RvdHlwZXMgMQorCisjIGJ1aWxkIHRoZSBmaXJzdCB0ZXN0IGNhc2UKKworc2V0IHRlc3RmaWxlMSAicmVyZWFkMSIKK3NldCBzcmNmaWxlMSAke3Rlc3RmaWxlMX0uYworc2V0IGJpbmZpbGUxICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZTF9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGUxfSIgIiR7YmluZmlsZTF9IiBleGVjdXRhYmxlIHtkZWJ1ZyBhZGRpdGlvbmFsX2ZsYWdzPS13fV0gIT0gIiIgfSB7CisgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKKyMgYnVpbGQgdGhlIHNlY29uZCB0ZXN0IGNhc2UKKworc2V0IHRlc3RmaWxlMiAicmVyZWFkMiIKK3NldCBzcmNmaWxlMiAke3Rlc3RmaWxlMn0uYworc2V0IGJpbmZpbGUyICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZTJ9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGUyfSIgIiR7YmluZmlsZTJ9IiBleGVjdXRhYmxlIHtkZWJ1ZyBhZGRpdGlvbmFsX2ZsYWdzPS13fV0gIT0gIiIgfSB7CisgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworc2V0IHRlc3RmaWxlICJyZXJlYWQiCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisKK3NldCBwcm1zX2lkIDEzNDg0CitzZXQgYnVnX2lkIDAKKworIyBMb2FkIHRoZSBmaXJzdCBleGVjdXRhYmxlLgorCitnZGJfdGVzdCAic2hlbGwgbXYgJHtiaW5maWxlMX0gJHtiaW5maWxlfSIgIiIgIiIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworIyBTZXQgYSBicmVha3BvaW50IGF0IGZvbworCitnZGJfdGVzdCAiYnJlYWsgZm9vIiBcCisgICAgIkJyZWFrcG9pbnQuKmF0LiogZmlsZSAuKiRzcmNmaWxlMSwgbGluZSAxNC4qIiBcCisgICAgImJyZWFrcG9pbnQgZm9vIGluIGZpcnN0IGZpbGUiCisKKworIyBSdW4sIHNob3VsZCBzZWUgIkJyZWFrcG9pbnQgMSwgZm9vICgpIGF0IGhlbGxvMS5jOjE0IgorCitnZGJfcnVuX2NtZAorCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qQnJlYWtwb2ludC4qIGZvbyAuKiBhdCAuKiRzcmNmaWxlMToxNC4qJGdkYl9wcm9tcHQgJCIgIHsKKwlwYXNzICJydW4gdG8gZm9vKCkiOworICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgInJ1biB0byBmb28oKSI7CisJZ2RiX3N1cHByZXNzX3Rlc3RzOworICAgIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAicnVuIHRvIGZvbygpICh0aW1lb3V0KSIgOyBnZGJfc3VwcHJlc3NfdGVzdHMgfQorfQorCisjIFJlc3RvcmUgZmlyc3QgZXhlY3V0YWJsZSB0byBpdHMgb3JpZ2luYWwgbmFtZSwgYW5kIG1vdmUKKyMgc2Vjb25kIGV4ZWN1dGFibGUgaW50byBpdHMgcGxhY2UuICBFbnN1cmUgdGhhdCB0aGUgbmV3CisjIGV4ZWN1dGFibGUgaXMgYXQgbGVhc3QgYSBzZWNvbmQgb2xkZXIgdGhhbiB0aGUgb2xkLgorCitnZGJfdGVzdCAic2hlbGwgbXYgJHtiaW5maWxlfSAke2JpbmZpbGUxfSIgIiIgIiIKK2dkYl90ZXN0ICJzaGVsbCBtdiAke2JpbmZpbGUyfSAke2JpbmZpbGV9IiAiIiAiIgorZ2RiX3Rlc3QgInNoZWxsIHNsZWVwIDEiICIiICIiCitnZGJfdGVzdCAic2hlbGwgdG91Y2ggJHtiaW5maWxlfSIgIiIgIiIKKworIyBSdW4gYSBzZWNvbmQgdGltZTsgR0RCIHNob3VsZCBkZXRlY3QgdGhhdCB0aGUgZXhlY3V0YWJsZSBoYXMgY2hhbmdlZAorIyBhbmQgcmVzZXQgdGhlIGJyZWFrcG9pbnRzIGNvcnJlY3RseS4KKyMgU2hvdWxkIHNlZSAiQnJlYWtwb2ludCAxLCBmb28gKCkgYXQgcmVyZWFkMi5jOjkiCisKK2dkYl9ydW5fY21kCitnZGJfZXhwZWN0IHsKKyMgICAgLXJlICIuKnJlLXJlYWRpbmcgc3ltYm9scy4qQnJlYWtwb2ludC4qIGZvbyAuKiBhdCAuKiRzcmNmaWxlMjo5LiokZ2RiX3Byb21wdCAkIiB7fQorICAgIC1yZSAiLipCcmVha3BvaW50LiogZm9vIC4qIGF0IC4qOjkuKiRnZGJfcHJvbXB0ICQiIHsKKwlwYXNzICJydW4gdG8gZm9vKCkgc2Vjb25kIHRpbWUgIjsKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwlmYWlsICJydW4gdG8gZm9vKCkgc2Vjb25kIHRpbWUiOworCWdkYl9zdXBwcmVzc190ZXN0czsKKyAgICB9CisgICAgdGltZW91dCB7IGZhaWwgInJ1biB0byBmb28oKSBzZWNvbmQgdGltZSAodGltZW91dCkiIDsgZ2RiX3N1cHByZXNzX3Rlc3RzIH0KK30KKworIyBFbmQgb2YgdGVzdHMuCisKK2dkYl9zdG9wX3N1cHByZXNzaW5nX3Rlc3RzCisKK3JldHVybiAwCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3JlcmVhZDEuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvcmVyZWFkMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOTgwMTAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3JlcmVhZDEuYwpAQCAtMCwwICsxLDI2IEBACisvKiBwciAxMzQ4NCAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IHg7CisKK3ZvaWQgYmFyKCkKK3sKKyAgeC0tOworfQorCit2b2lkIGZvbygpCit7CisgIHgrKzsKK30KKworaW50IG1haW4oKQoreworI2lmZGVmIHVzZXN0dWJzCisgIHNldF9kZWJ1Z190cmFwcyAoKTsKKyAgYnJlYWtwb2ludCAoKTsKKyNlbmRpZgorICBmb28oKTsKKyAgYmFyKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9yZXJlYWQyLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3JlcmVhZDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDlmN2I3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9yZXJlYWQyLmMKQEAgLTAsMCArMSwyMSBAQAorLyogcHIgMTM0ODQgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCB4OworCit2b2lkIGZvbygpCit7CisgIHgrKzsKKyAgcHJpbnRmKCJUaGlzIGlzIGZvb1xuIik7Cit9CisKK2ludCBtYWluKCkKK3sKKyNpZmRlZiB1c2VzdHVicworICBzZXRfZGVidWdfdHJhcHMgKCk7CisgIGJyZWFrcG9pbnQgKCk7CisjZW5kaWYKKyAgZm9vKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9yZXN0b3JlLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3Jlc3RvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjVkNjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9yZXN0b3JlLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qIFRlc3QgR0RCJ3MgYWJpbGl0eSB0byByZXN0b3JlIHNhdmVkIHJlZ2lzdGVycyBmcm9tIHN0YWNrIGZyYW1lcworICAgd2hlbiB1c2luZyB0aGUgYHJldHVybicgY29tbWFuZC4KKyAgIEppbSBCbGFuZHkgPGppbWJAY3lnbnVzLmNvbT4gLS0tIERlY2VtYmVyIDE5OTggKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIFRoaXMgaXMgdGhlIEVtYWNzIExpc3AgZXhwcmVzc2lvbiBJIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGZ1bmN0aW9ucworICAgaW4gdGhpcyBmaWxlLiAgSWYgcGVvcGxlIG1vZGlmeSB0aGUgZnVuY3Rpb25zIG1hbnVhbGx5LCBpbnN0ZWFkIG9mCisgICBjaGFuZ2luZyB0aGlzIGV4cHJlc3Npb24gYW5kIHJlLXJ1bm5pbmcgaXQsIHRoZW4gZXZhbHVhdGluZyB0aGlzCisgICBleHByZXNzaW9uIGNvdWxkIHdpcGUgb3V0IHRoZWlyIHdvcmssIHNvIHlvdSBwcm9iYWJseSBzaG91bGRuJ3QKKyAgIHJlLXJ1biBpdC4gIEJ1dCBJIGxlYXZlIGl0IGhlcmUgZm9yIHJlZmVyZW5jZS4gCisKKyAgIChkZWZ1biBjYWxsZWUgKG4pIChmb3JtYXQgImNhbGxlZSVkIiBuKSkKKyAgIChkZWZ1biBjYWxsZXIgKG4pIChmb3JtYXQgImNhbGxlciVkIiBuKSkKKyAgIChkZWZ1biBsb2NhbCAgKG4pIChmb3JtYXQgImwlZCIgIG4pKQorICAgKGRlZnVuIGxvY2FsLXN1bSAobikKKyAgICAgKGxldCAoKGogMSkpCisgICAgICAgKHdoaWxlICg8PSBqIG4pCisgICAgICAgICAoaW5zZXJ0IChsb2NhbCBqKSkKKwkgKGlmICg8IGogbikgKGluc2VydCAiKyIpKQorICAgICAgICAgKHNldHEgaiAoMSsgaikpKSkpCisgICAoZGVmdW4gbG9jYWwtY2hhaW4gKG4gcHJldmlvdXMgZmlyc3QtZW5kKQorICAgICAobGV0ICgoaiAxKSkKKyAgICAgICAod2hpbGUgKDw9IGogbikKKwkgKGluc2VydCAiICByZWdpc3RlciBpbnQgIiAobG9jYWwgaikKKyAgICAgICAgICAgICAgICAgIiA9IGluY3JlbWVudCAoIiBwcmV2aW91cyAgIik7IikKKwkgKGlmIGZpcnN0LWVuZCAKKwkgICAocHJvZ24KKyAgICAgICAgICAgICAoaW5zZXJ0ICIgIC8iICIqICIgZmlyc3QtZW5kICIgKiIgIi8iKQorICAgICAgICAgICAgIChzZXRxIGZpcnN0LWVuZCBuaWwpKSkKKwkgKGluc2VydCAiXG4iKQorCSAoc2V0cSBwcmV2aW91cyAobG9jYWwgaikpCisJIChzZXRxIGogKDErIGopKSkpCisgICAgIHByZXZpb3VzKQorCisgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgKGxldCAoKGxpbWl0IDUpKQorICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1heCkpCisgICAgICAgKHNlYXJjaC1iYWNrd2FyZCAiZ2VuZXJhdGVkIGNvZGUgc3RhcnRzIGhlcmUiKQorICAgICAgIChmb3J3YXJkLWxpbmUgMSkKKyAgICAgICAobGV0ICgoc3RhcnQgKHBvaW50KSkpCisJIChzZWFyY2gtZm9yd2FyZCAiZ2VuZXJhdGVkIGNvZGUgZW5kcyBoZXJlIikKKwkgKGZvcndhcmQtbGluZSAwKQorCSAoZGVsZXRlLXJlZ2lvbiBzdGFydCAocG9pbnQpKSkKKworICAgICAgIDs7IEdlbmVyYXRlIGNhbGxlZSBmdW5jdGlvbnMuCisgICAgICAgKGxldCAoKGkgMCkpCisJICh3aGlsZSAoPD0gaSBsaW1pdCkKKyAgICAgICAgICAgKGluc2VydCAoZm9ybWF0ICIvJXMgUmV0dXJucyBuICogJWQgKyAlZCAlcy9cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIqIiBpICgvICgrIGkgKCogaSBpKSkgMikgIioiKSkKKwkgICAoaW5zZXJ0ICJpbnRcbiIpCisJICAgKGluc2VydCAoY2FsbGVlIGkpICIgKGludCBuKVxuIikKKwkgICAoaW5zZXJ0ICJ7XG4iKQorCSAgIChsb2NhbC1jaGFpbiBpICJuIiAoY2FsbGVlIGkpKQorCSAgIChpbnNlcnQgIiAgcmV0dXJuICIpCisJICAgKGlmICg8PSBpIDApIChpbnNlcnQgIm4iKQorCSAgICAgKGxvY2FsLXN1bSBpKSkKKwkgICAoaW5zZXJ0ICI7XG4iKQorCSAgIChpbnNlcnQgIn1cblxuIikKKwkgICAoc2V0cSBpICgxKyBpKSkpKQorCisgICAgICAgOzsgR2VuZXJhdGUgY2FsbGVyIGZ1bmN0aW9ucy4KKyAgICAgICAobGV0ICgoaSAxKSkKKwkgKHdoaWxlICg8PSBpIGxpbWl0KQorCSAgIChpbnNlcnQgImludFxuIikKKwkgICAoaW5zZXJ0IChjYWxsZXIgaSkgIiAodm9pZClcbiIpCisJICAgKGluc2VydCAie1xuIikKKwkgICAobGV0ICgobGFzdCAobG9jYWwtY2hhaW4gaSAiMHhmZWViIiAoY2FsbGVyIGkpKSkpCisJICAgICAoaW5zZXJ0ICIgIHJlZ2lzdGVyIGludCBuO1xuIikKKwkgICAgIChsZXQgKChqIDApKQorCSAgICAgICAod2hpbGUgKDw9IGogbGltaXQpCisJICAgICAgICAgKGluc2VydCAiICBuID0gIiAoY2FsbGVlIGopICIgKCIgCisgICAgICAgICAgICAgICAgICAgICAgICAgKGlmICg+IGogMCkgIm4gKyAiICIiKQorCQkgICAgICAgICBsYXN0ICIpO1xuIikKKwkgICAgICAgICAoc2V0cSBqICgxKyBqKSkpKSkKKwkgICAoaW5zZXJ0ICIgIHJldHVybiBuKyIpCisJICAgKGxvY2FsLXN1bSBpKQorICAgICAgICAgICAoaW5zZXJ0ICI7XG4iKQorCSAgIChpbnNlcnQgIn1cblxuIikKKwkgICAoc2V0cSBpICgxKyBpKSkpKQorCisgICAgICAgOzsgR2VuZXJhdGUgZHJpdmVyIGZ1bmN0aW9uLgorICAgICAgIChpbnNlcnQgInZvaWRcbiIpCisgICAgICAgKGluc2VydCAiZHJpdmVyICh2b2lkKVxuIikKKyAgICAgICAoaW5zZXJ0ICJ7XG4iKQorICAgICAgIChsZXQgKChpIDEpKQorCSAod2hpbGUgKDw9IGkgbGltaXQpCisJICAgKGluc2VydCAiICBwcmludGYgKFwiIiAoY2FsbGVyIGkpICIgKCkgPT4gJWRcXG5cIiwgIgorCQkgICAoY2FsbGVyIGkpICIgKCkpO1xuIikKKwkgICAoc2V0cSBpICgxKyBpKSkpKQorICAgICAgIChpbnNlcnQgIn1cblxuIikpKQorCisJICovCisKK2ludAoraW5jcmVtZW50IChpbnQgbikKK3sKKyAgcmV0dXJuIG4gKyAxOworfQorCisvKiBnZW5lcmF0ZWQgY29kZSBzdGFydHMgaGVyZSAqLworLyogUmV0dXJucyBuICogMCArIDAgKi8KK2ludAorY2FsbGVlMCAoaW50IG4pCit7CisgIHJldHVybiBuOworfQorCisvKiBSZXR1cm5zIG4gKiAxICsgMSAqLworaW50CitjYWxsZWUxIChpbnQgbikKK3sKKyAgcmVnaXN0ZXIgaW50IGwxID0gaW5jcmVtZW50IChuKTsgIC8qIGNhbGxlZTEgKi8KKyAgcmV0dXJuIGwxOworfQorCisvKiBSZXR1cm5zIG4gKiAyICsgMyAqLworaW50CitjYWxsZWUyIChpbnQgbikKK3sKKyAgcmVnaXN0ZXIgaW50IGwxID0gaW5jcmVtZW50IChuKTsgIC8qIGNhbGxlZTIgKi8KKyAgcmVnaXN0ZXIgaW50IGwyID0gaW5jcmVtZW50IChsMSk7CisgIHJldHVybiBsMStsMjsKK30KKworLyogUmV0dXJucyBuICogMyArIDYgKi8KK2ludAorY2FsbGVlMyAoaW50IG4pCit7CisgIHJlZ2lzdGVyIGludCBsMSA9IGluY3JlbWVudCAobik7ICAvKiBjYWxsZWUzICovCisgIHJlZ2lzdGVyIGludCBsMiA9IGluY3JlbWVudCAobDEpOworICByZWdpc3RlciBpbnQgbDMgPSBpbmNyZW1lbnQgKGwyKTsKKyAgcmV0dXJuIGwxK2wyK2wzOworfQorCisvKiBSZXR1cm5zIG4gKiA0ICsgMTAgKi8KK2ludAorY2FsbGVlNCAoaW50IG4pCit7CisgIHJlZ2lzdGVyIGludCBsMSA9IGluY3JlbWVudCAobik7ICAvKiBjYWxsZWU0ICovCisgIHJlZ2lzdGVyIGludCBsMiA9IGluY3JlbWVudCAobDEpOworICByZWdpc3RlciBpbnQgbDMgPSBpbmNyZW1lbnQgKGwyKTsKKyAgcmVnaXN0ZXIgaW50IGw0ID0gaW5jcmVtZW50IChsMyk7CisgIHJldHVybiBsMStsMitsMytsNDsKK30KKworLyogUmV0dXJucyBuICogNSArIDE1ICovCitpbnQKK2NhbGxlZTUgKGludCBuKQoreworICByZWdpc3RlciBpbnQgbDEgPSBpbmNyZW1lbnQgKG4pOyAgLyogY2FsbGVlNSAqLworICByZWdpc3RlciBpbnQgbDIgPSBpbmNyZW1lbnQgKGwxKTsKKyAgcmVnaXN0ZXIgaW50IGwzID0gaW5jcmVtZW50IChsMik7CisgIHJlZ2lzdGVyIGludCBsNCA9IGluY3JlbWVudCAobDMpOworICByZWdpc3RlciBpbnQgbDUgPSBpbmNyZW1lbnQgKGw0KTsKKyAgcmV0dXJuIGwxK2wyK2wzK2w0K2w1OworfQorCitpbnQKK2NhbGxlcjEgKHZvaWQpCit7CisgIHJlZ2lzdGVyIGludCBsMSA9IGluY3JlbWVudCAoMHhmZWViKTsgIC8qIGNhbGxlcjEgKi8KKyAgcmVnaXN0ZXIgaW50IG47CisgIG4gPSBjYWxsZWUwIChsMSk7CisgIG4gPSBjYWxsZWUxIChuICsgbDEpOworICBuID0gY2FsbGVlMiAobiArIGwxKTsKKyAgbiA9IGNhbGxlZTMgKG4gKyBsMSk7CisgIG4gPSBjYWxsZWU0IChuICsgbDEpOworICBuID0gY2FsbGVlNSAobiArIGwxKTsKKyAgcmV0dXJuIG4rbDE7Cit9CisKK2ludAorY2FsbGVyMiAodm9pZCkKK3sKKyAgcmVnaXN0ZXIgaW50IGwxID0gaW5jcmVtZW50ICgweGZlZWIpOyAgLyogY2FsbGVyMiAqLworICByZWdpc3RlciBpbnQgbDIgPSBpbmNyZW1lbnQgKGwxKTsKKyAgcmVnaXN0ZXIgaW50IG47CisgIG4gPSBjYWxsZWUwIChsMik7CisgIG4gPSBjYWxsZWUxIChuICsgbDIpOworICBuID0gY2FsbGVlMiAobiArIGwyKTsKKyAgbiA9IGNhbGxlZTMgKG4gKyBsMik7CisgIG4gPSBjYWxsZWU0IChuICsgbDIpOworICBuID0gY2FsbGVlNSAobiArIGwyKTsKKyAgcmV0dXJuIG4rbDErbDI7Cit9CisKK2ludAorY2FsbGVyMyAodm9pZCkKK3sKKyAgcmVnaXN0ZXIgaW50IGwxID0gaW5jcmVtZW50ICgweGZlZWIpOyAgLyogY2FsbGVyMyAqLworICByZWdpc3RlciBpbnQgbDIgPSBpbmNyZW1lbnQgKGwxKTsKKyAgcmVnaXN0ZXIgaW50IGwzID0gaW5jcmVtZW50IChsMik7CisgIHJlZ2lzdGVyIGludCBuOworICBuID0gY2FsbGVlMCAobDMpOworICBuID0gY2FsbGVlMSAobiArIGwzKTsKKyAgbiA9IGNhbGxlZTIgKG4gKyBsMyk7CisgIG4gPSBjYWxsZWUzIChuICsgbDMpOworICBuID0gY2FsbGVlNCAobiArIGwzKTsKKyAgbiA9IGNhbGxlZTUgKG4gKyBsMyk7CisgIHJldHVybiBuK2wxK2wyK2wzOworfQorCitpbnQKK2NhbGxlcjQgKHZvaWQpCit7CisgIHJlZ2lzdGVyIGludCBsMSA9IGluY3JlbWVudCAoMHhmZWViKTsgIC8qIGNhbGxlcjQgKi8KKyAgcmVnaXN0ZXIgaW50IGwyID0gaW5jcmVtZW50IChsMSk7CisgIHJlZ2lzdGVyIGludCBsMyA9IGluY3JlbWVudCAobDIpOworICByZWdpc3RlciBpbnQgbDQgPSBpbmNyZW1lbnQgKGwzKTsKKyAgcmVnaXN0ZXIgaW50IG47CisgIG4gPSBjYWxsZWUwIChsNCk7CisgIG4gPSBjYWxsZWUxIChuICsgbDQpOworICBuID0gY2FsbGVlMiAobiArIGw0KTsKKyAgbiA9IGNhbGxlZTMgKG4gKyBsNCk7CisgIG4gPSBjYWxsZWU0IChuICsgbDQpOworICBuID0gY2FsbGVlNSAobiArIGw0KTsKKyAgcmV0dXJuIG4rbDErbDIrbDMrbDQ7Cit9CisKK2ludAorY2FsbGVyNSAodm9pZCkKK3sKKyAgcmVnaXN0ZXIgaW50IGwxID0gaW5jcmVtZW50ICgweGZlZWIpOyAgLyogY2FsbGVyNSAqLworICByZWdpc3RlciBpbnQgbDIgPSBpbmNyZW1lbnQgKGwxKTsKKyAgcmVnaXN0ZXIgaW50IGwzID0gaW5jcmVtZW50IChsMik7CisgIHJlZ2lzdGVyIGludCBsNCA9IGluY3JlbWVudCAobDMpOworICByZWdpc3RlciBpbnQgbDUgPSBpbmNyZW1lbnQgKGw0KTsKKyAgcmVnaXN0ZXIgaW50IG47CisgIG4gPSBjYWxsZWUwIChsNSk7CisgIG4gPSBjYWxsZWUxIChuICsgbDUpOworICBuID0gY2FsbGVlMiAobiArIGw1KTsKKyAgbiA9IGNhbGxlZTMgKG4gKyBsNSk7CisgIG4gPSBjYWxsZWU0IChuICsgbDUpOworICBuID0gY2FsbGVlNSAobiArIGw1KTsKKyAgcmV0dXJuIG4rbDErbDIrbDMrbDQrbDU7Cit9CisKK3ZvaWQKK2RyaXZlciAodm9pZCkKK3sKKyAgcHJpbnRmICgiY2FsbGVyMSAoKSA9PiAlZFxuIiwgY2FsbGVyMSAoKSk7CisgIHByaW50ZiAoImNhbGxlcjIgKCkgPT4gJWRcbiIsIGNhbGxlcjIgKCkpOworICBwcmludGYgKCJjYWxsZXIzICgpID0+ICVkXG4iLCBjYWxsZXIzICgpKTsKKyAgcHJpbnRmICgiY2FsbGVyNCAoKSA9PiAlZFxuIiwgY2FsbGVyNCAoKSk7CisgIHByaW50ZiAoImNhbGxlcjUgKCkgPT4gJWRcbiIsIGNhbGxlcjUgKCkpOworfQorCisvKiBnZW5lcmF0ZWQgY29kZSBlbmRzIGhlcmUgKi8KKworbWFpbiAoKQoreworICByZWdpc3RlciBpbnQgbG9jYWw7CisjaWZkZWYgdXNlc3R1YnMKKyAgc2V0X2RlYnVnX3RyYXBzKCk7CisgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICBkcml2ZXIgKCk7CisgIHByaW50ZigiZXhpdGluZ1xuIik7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3Jlc3RvcmUuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9yZXN0b3JlLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGI3MTRiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9yZXN0b3JlLmV4cApAQCAtMCwwICsxLDExMSBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGVzdCBHREIncyBhYmlsaXR5IHRvIHJlc3RvcmUgc2F2ZWQgcmVnaXN0ZXJzIGZyb20gc3RhY2sgZnJhbWVzCisjIHdoZW4gdXNpbmcgdGhlIGByZXR1cm4nIGNvbW1hbmQuCisjCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBKaW0gQmxhbmR5IDxqaW1iQGN5Z251cy5jb20+LCB3aXRoCisjIGZyYWdtZW50cyBib3Jyb3dlZCBmcm9tIHJldHVybi5leHAuCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJyZXN0b3JlIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQoraWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworcHJvYyByZXN0b3JlX3Rlc3RzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIGlmIHsgISBbIHJ1bnRvIGRyaXZlciBdIH0gdGhlbiB7IHJldHVybiAwIH0KKworICAgIHNldCBsaW1pdCA1CisKKyAgICAjIFNldCBicmVha3BvaW50cyBhdCBlYWNoIG9mIHRoZSBgY2FsbGVyJyBmdW5jdGlvbnMuCisgICAgZm9yIHtzZXQgYyAxfSB7JGMgPD0gJGxpbWl0fSB7aW5jciBjfSB7CisgICAgICBnZGJfdGVzdCAiYnJlYWsgY2FsbGVyJGMiICJCcmVha3BvaW50LipcWzAtOVxdKlxcLiIgImJyZWFrIGNhbGxlciRjIgorICAgIH0KKworICAgICMgU2V0IGJyZWFrcG9pbnRzIGF0IGVhY2ggb2YgdGhlIGBjYWxsZWUnIGZ1bmN0aW9ucy4KKyAgICBmb3Ige3NldCBjIDF9IHskYyA8PSAkbGltaXR9IHtpbmNyIGN9IHsKKyAgICAgIGdkYl90ZXN0ICJicmVhayBjYWxsZWUkYyIgIkJyZWFrcG9pbnQuKlxbMC05XF0qXFwuIiAiYnJlYWsgY2FsbGVyJGMiCisgICAgfQorCisgICAgIyBGb3IgZWFjaCBjYWxsZXIgZnVuY3Rpb24sCisgICAgIyAgIGNhbGwgZWFjaCBvZiB0aGUgY2FsbGVlIGZ1bmN0aW9ucywKKyAgICAjICAgZm9yY2UgYSByZXR1cm4gZnJvbSB0aGUgY2FsbGVlLCBhbmQKKyAgICAjICAgbWFrZSBzdXJlIHRoYXQgdGhlIGxvY2FsIHZhcmlhYmxlcyBzdGlsbCBoYXZlIHRoZSByaWdodCB2YWx1ZXMuCisgICAgZm9yIHtzZXQgYyAxfSB7JGMgPD0gJGxpbWl0fSB7aW5jciBjfSB7CisKKwkjIENvbnRpbnVlIHRvIHRoZSBuZXh0IGNhbGxlciBmdW5jdGlvbi4KKwlnZGJfdGVzdCAiY29udGludWUiICIuKi9cXCogY2FsbGVyJGMgXFwqLyIgInJ1biB0byBjYWxsZXIkYyIKKworCSMgRG8gZWFjaCBjYWxsZWUgZnVuY3Rpb24uCisgICAgICAgIGZvciB7c2V0IGUgMX0geyRlIDw9ICRsaW1pdH0ge2luY3IgZX0geworICAJICAgIGdkYl90ZXN0ICIgIGNvbnRpbnVlIiAiLiovXFwqIGNhbGxlZSRlIFxcKi8iICJydW4gdG8gY2FsbGVlJGUiCisKKyAgICAgICAgICAgICMgRG8gYSBmb3JjZWQgcmV0dXJuIGZyb20gdGhlIGNhbGxlZS4KKwkgICAgc2VuZF9nZGIgInJldHVybiAwXG4iCisJICAgIGdkYl9leHBlY3QgeworCQktcmUgIk1ha2UgLiogcmV0dXJuIG5vdy4qeSBvciBuLiAkIiB7CisJCSAgICBzZW5kX2dkYiAieVxuIgorCQkgICAgZXhwX2NvbnRpbnVlCisJCX0KKwkJLXJlICIkZ2RiX3Byb21wdCAkIiB7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIyBDaGVjayB0aGF0IHRoZSB2YWx1ZXMgb2YgdGhlIGxvY2FsIHZhcmlhYmxlcyBhcmUgd2hhdAorCSAgICAjIHRoZXkgc2hvdWxkIGJlLgorICAgICAgICAgICAgZm9yIHtzZXQgdmFyIDF9IHskdmFyIDw9ICRjfSB7aW5jciB2YXJ9IHsKKyAgICAgICAgICAgICAgICBzZXQgZXhwZWN0ZWQgW2V4cHIgMHhmZWViICsgJHZhcl0KKwkgICAgICAgIGdkYl90ZXN0ICJwcmludCBsJHZhciIgIiA9ICRleHBlY3RlZCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsZXIkYyBjYWxsZWQgY2FsbGVlJGU7IHZhcmlhYmxlIGwkdmFyIHJlc3RvcmVkIgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc2VuZF9nZGIgImNvbnRpbnVlXG4iCisKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJleGl0aW5nIiB7CisgICAgICAgICAgICAgcGFzcyAicnVuIHRvIGNvbXBsZXRpb24iCisgICAgICAgIH0KKyAgICAgICAgdGltZW91dCB7IAorICAgICAgICAgICAgIGZhaWwgIih0aW1lb3V0KSBydW4gdG8gY29tcGxldGlvbiIKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCitzZXQgdGltZW91dCAzMAorcmVzdG9yZV90ZXN0cwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9yZXR1cm4uYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvcmV0dXJuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5ZDFhMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvcmV0dXJuLmMKQEAgLTAsMCArMSwzNSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisvKiAgVGVzdCAicmV0dXJuIiBjb21tYW5kLiAgKi8KKworZnVuYzEgKCkKK3sKKyAgcHJpbnRmKCJpbiBmdW5jMVxuIik7Cit9CisKK2ludAorZnVuYzIgKCkKK3sKKyAgcmV0dXJuIC01OworfQorCitkb3VibGUKK2Z1bmMzICgpCit7CisgIHJldHVybiAtNS4wOworfQorCitpbnQgdG1wMjsKK2RvdWJsZSB0bXAzOworCittYWluICgpCit7CisjaWZkZWYgdXNlc3R1YnMKKyAgc2V0X2RlYnVnX3RyYXBzKCk7CisgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICBmdW5jMSAoKTsKKyAgcHJpbnRmKCJpbiBtYWluIGFmdGVyIGZ1bmMxXG4iKTsKKyAgdG1wMiA9IGZ1bmMyICgpOworICB0bXAzID0gZnVuYzMgKCk7CisgIHByaW50ZigiZXhpdGluZ1xuIik7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3JldHVybi5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3JldHVybi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNhODVlOAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvcmV0dXJuLmV4cApAQCAtMCwwICsxLDEyNCBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEplZmYgTGF3LiAobGF3QGNzLnV0YWguZWR1KQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAicmV0dXJuIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQoraWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworcHJvYyByZXR1cm5fdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisKKyAgICBpZiB7ICEgWyBydW50byBmdW5jMSBdIH0gdGhlbiB7IHJldHVybiAwIH0KKyAgICBzZW5kX2dkYiAicmV0dXJuXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJNYWtlIC4qIHJldHVybiBub3cuKnkgb3Igbi4gJCIgeworCSAgICBzZW5kX2dkYiAieVxuIgorCSAgICBleHBfY29udGludWUKKwl9CisJLXJlICJmdW5jMSAuLjsuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2VuZF9nZGIgInN0ZXBcbiIKKwkgICAgZXhwX2NvbnRpbnVlCisJfQorICAgIC1yZSAiLippbiBtYWluIGFmdGVyIGZ1bmMxLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInNpbXBsZSByZXR1cm4iIH0KKyAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic2ltcGxlIHJldHVybiIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgc2ltcGxlIHJldHVybiIgfQorICAgIH0KKworICAgICMgU2V0IGJyZWFrcG9pbnRzIGluIG90aGVyIGludGVyZXN0aW5nIGZ1bmN0aW9ucy4KKyAgICBnZGJfdGVzdCAiYnJlYWsgZnVuYzIiICIiICJicmVhayBmdW5jMiIKKyAgICBnZGJfdGVzdCAiYnJlYWsgZnVuYzMiICIiICJicmVhayBmdW5jMyIKKworICAgIGdkYl90ZXN0ICJjb250aW51ZSIgInJldHVybiAtNTsiICJjb250aW51ZSB0byByZXR1cm4gb2YgLTUiCisgICAgc2VuZF9nZGIgInJldHVybiA1XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJNYWtlIC4qIHJldHVybiBub3cuKnkgb3Igbi4gJCIgeworCSAgICBzZW5kX2dkYiAieVxuIgorCSAgICBleHBfY29udGludWUKKwl9CisgICAgLXJlICIuKnRtcDIgPSBmdW5jMi4qJGdkYl9wcm9tcHQgJCIgeyB9CisgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImRpZCBub3QgcmV0dXJuIChpbnRlZ2VyIHRlc3QpIiB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBkaWQgbm90IHJldHVybiAoaW50ZWdlciB0ZXN0KSIgfQorICAgIH0KKyAgICBnZGJfdGVzdCAibmV4dCIgInRtcDMgPSBmdW5jMy4qIiAibmV4dCBvdmVyIGNhbGwgdG8gZnVuYzIiCisKKyAgICBnZGJfdGVzdCAicCB0bXAyIiAiLiogPSA1IiAiY29ycmVjdCB2YWx1ZSByZXR1cm5lZCAoaW50ZWdlciB0ZXN0KSIKKworICAgIGdkYl90ZXN0ICJjb250aW51ZSIgInJldHVybiAtNS4wOyIgImNvbnRpbnVlIHRvIHJldHVybiBvZiAtNS4wIgorICAgIHNlbmRfZ2RiICJyZXR1cm4gNS4wXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJNYWtlIC4qIHJldHVybiBub3cuKnkgb3Igbi4gJCIgeworCSAgICBzZW5kX2dkYiAieVxuIgorCSAgICBleHBfY29udGludWUKKwl9CisJLXJlICIuKnRtcDMgPSBmdW5jMy4qJGdkYl9wcm9tcHQgJCIgeyB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImRpZCBub3QgcmV0dXJuIChkb3VibGUgdGVzdCkiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGRpZCBub3QgcmV0dXJuIChkb3VibGUgdGVzdCkiIH0KKyAgICB9CisKKyAgICBnZGJfdGVzdCAibmV4dCIgInByaW50Zi4qIiAibmV4dCBvdmVyIGNhbGwgdG8gZnVuYzMiCisKKyAgICAjIFRoaXMgdGVzdCBpcyBnb2luZyB0byBmYWlsIG9uIGFsbCBpKjg2IHN5c3RlbXMgdXNpbmcgYW4gaSo4Ny4KKyAgICAjIFdoZW4gcmV0dXJuaW5nIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgZnJvbSBhIGZ1bmN0aW9uLCBhbGwga25vd24KKyAgICAjIGNvbXBpbGVycyBkbyB0aGlzIHZpYSBhIGBmbGRsJyBpbnN0cnVjdGlvbiwgd2hpY2ggcHVzaGVzIHRoZSBmbG9hdGluZworICAgICMgdmFsdWUgb24gdGhlIGkzODcgc3RhY2suIFRoaXMgY2F1c2VzIHR3byBwcm9ibGVtczoKKyAgICAjIGEpIE1vc3QgaSo4NiB0YXJnZXRzIGRvIG5vdCBzdG9yZSAob3IgY2Fubm90IHN0b3JlLCBzZWUgY29tbWVudCBpbgorICAgICMgICAgaW4gaTM4NnYtbmF0LmM6aTM4Nl9yZWdpc3Rlcl91X2FkZHIpIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMKKyAgICAjICAgIHRvIHRoZSB0YXJnZXQuCisgICAgIyBiKSBnZGIgd291bGQgaGF2ZSB0byBmaWd1cmUgb3V0IGlmIHRoZSBgZmxkbCcgaW5zdHJ1Y3Rpb24gKG9yIHZhcmlhbnRzCisgICAgIyAgICBvZiBpdCkgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZC4gSWYgbm90LCBpdCB3b3VsZCBoYXZlIHRvIHNpbXVsYXRlCisgICAgIyAgICBhIHB1c2ggaW5zdHJ1Y3Rpb24sIGFzIGl0IGlzIG5vdCBlbm91Z2ggdG8gd3JpdGUgdGhlIHJlZ2lzdGVyLAorICAgICMgICAgdGhlIGZsb2F0aW5nIHBvaW50IGBzdGFjayBwb2ludGVyJyBoYXMgdG8gYmUgdXBkYXRlZCB0b28uCisgICAgIyAgICBEbyBub3QgZXhwZWN0IHRoaXMgdG8gZ2V0IGZpeGVkIGFueXRpbWUgc29vbi4KKworICAgICMgVGhpcyB0ZXN0IGFsc28gZmFpbHMgZm9yIHNwYXJjIFNvbGFyaXMgMi4zICYgMi40LCBidXQgcGFzc2VzIHVuZGVyIDIuNQorICAgICMgQXQgdGhlIHRpbWUgdGhlIGBuZXh0JyBpcyBpc3N1ZWQsIHRoZSBmbG9hdGluZyBwb2ludCB1bml0IGZvciB0aGUKKyAgICAjIHByb2Nlc3MgaXMgbm90IHlldCBpbml0aWFsaXplZCwgYW5kIHRoZSBzdG9yaW5nIG9mIHRoZSBmbG9hdGluZworICAgICMgcG9pbnQgdmFsdWUgdG8gdGhlIGZsb2F0aW5nIHBvaW50IHJldHVybiByZWdpc3RlciBpcyBpZ25vcmVkLgorICAgICMgWGZhaWwgaXQgZm9yIGN1cnJlbnQgdmVyc2lvbnMgdGhhdCBhcmUga25vd24gdG8gZmFpbC4gIFByZXN1bWFibHkKKyAgICAjIGlmIHNvbWUgZnV0dXJlIHZlcnNpb24gZG9lcyBpbml0aWFsaXplIHRoZSBmbG9hdGluZyBwb2ludCB1bml0IGF0CisgICAgIyBwcm9jZXNzIHN0YXJ0LCBtYWtpbmcgdGhpcyB0ZXN0IHBhc3MsIGl0IHdpbGwgYmUgZm9yIGEgdmVyc2lvbiB0aGF0CisgICAgIyBpcyBub3QgeGZhaWxlZC4KKworICAgIHNldHVwX3hmYWlsICJpKjg2LSotKiIgInNwYXJjLSotc29sYXJpczIuMyoiICJzcGFyYy0qLXNvbGFyaXMyLjQqIgorICAgIGdkYl90ZXN0ICJwIHRtcDMiICIuKiA9IDUuKiIgImNvcnJlY3QgdmFsdWUgcmV0dXJuZWQgZG91YmxlIHRlc3QgKGtub3duIHByb2JsZW0gd2l0aCBpKjg2IGFuZCBzcGFyYyBzb2xhcmlzIgorfQorCisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKK3NldCB0aW1lb3V0IDMwCityZXR1cm5fdGVzdHMKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvcnVuLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3J1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZWM3MjAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3J1bi5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKglUaGlzIHNpbXBsZSBjbGFzc2ljYWwgZXhhbXBsZSBvZiByZWN1cnNpb24gaXMgdXNlZnVsIGZvcgorICoJdGVzdGluZyBzdGFjayBiYWNrdHJhY2VzIGFuZCBzdWNoLgorICovCisKKyNpZmRlZiB2eHdvcmtzCisKKyMgIGluY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIFZ4V29ya3MgZG9lcyBub3Qgc3VwcGx5IGF0b2kuICAqLworc3RhdGljIGludAorYXRvaSAoeikKKyAgICAgY2hhciAqejsKK3sKKyAgaW50IGkgPSAwOworCisgIHdoaWxlICgqeiA+PSAnMCcgJiYgKnogPD0gJzknKQorICAgIGkgPSBpICogMTAgKyAoKnorKyAtICcwJyk7CisgIHJldHVybiBpOworfQorCisvKiBJIGRvbid0IGtub3cgb2YgYW55IHdheSB0byBwYXNzIGFuIGFycmF5IHRvIFZ4V29ya3MuICBUaGlzIGZ1bmN0aW9uCisgICBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGZyb20gZ2RiLiAgKi8KKwordnhtYWluIChhcmcpCitjaGFyICphcmc7Cit7CisgIGNoYXIgKmFyZ3ZbMl07CisKKyAgYXJndlswXSA9ICIiOworICBhcmd2WzFdID0gYXJnOworICBtYWluICgyLCBhcmd2LCAoY2hhciAqKikgMCk7Cit9CisKKyNlbHNlIC8qICEgdnh3b3JrcyAqLworIyAgaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZiAvKiAhIHZ4d29ya3MgKi8KKworbWFpbiAoYXJnYywgYXJndiwgZW52cCkKK2ludCBhcmdjOworY2hhciAqYXJndltdLCAqKmVudnA7Cit7CisjaWZkZWYgdXNlc3R1YnMKKyAgICBzZXRfZGVidWdfdHJhcHMoKTsKKyAgICBicmVha3BvaW50KCk7CisjZW5kaWYKKyNpZmRlZiBGQUtFQVJHVgorICAgIHByaW50ZiAoIiVkXG4iLCBmYWN0b3JpYWwgKDEpKTsKKyNlbHNlICAgIAorICAgIGlmIChhcmdjICE9IDIpIHsKKwlwcmludGYgKCJ1c2FnZTogIGZhY3RvcmlhbCA8bnVtYmVyPlxuIik7CisJcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKwlwcmludGYgKCIlZFxuIiwgZmFjdG9yaWFsIChhdG9pIChhcmd2WzFdKSkpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitpbnQgZmFjdG9yaWFsICh2YWx1ZSkKK2ludCB2YWx1ZTsKK3sKKyAgICBpZiAodmFsdWUgPiAxKSB7CisJdmFsdWUgKj0gZmFjdG9yaWFsICh2YWx1ZSAtIDEpOworICAgIH0KKyAgICByZXR1cm4gKHZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc2NvcGUuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zY29wZS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5MmNhNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc2NvcGUuZXhwCkBAIC0wLDAgKzEsNjEwIEBACisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAoZm5mQGN5Z251cy5jb20pCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJzY29wZSIKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vc2NvcGUwLmMiICIke2JpbmZpbGV9MC5vIiBvYmplY3Qge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vc2NvcGUxLmMiICIke2JpbmZpbGV9MS5vIiBvYmplY3Qge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7YmluZmlsZX0wLm8gJHtiaW5maWxlfTEubyIgJHtiaW5maWxlfSBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworIyBDcmVhdGUgYW5kIHNvdXJjZSB0aGUgZmlsZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlcgorIyB1c2VkIHRvIGNvbXBpbGUgdGhlIHRlc3QgY2FzZS4KK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9XSB7CisgICAgcmV0dXJuIC0xOworfQorCisjIFRlc3QgbG9jYXRpbmcgdmFyaW91cyB0aGluZ3Mgd2hlbiBzdG9wcGVkIGp1c3QgaW5zaWRlIG1haW4sIGFmdGVyCisjIHJ1bm5pbmcgaW5pdDAoKS4gIFRvIHByZXZlbnQgY2FzY2FkaW5nIG9mIGVycm9ycywgd2UgcmVwb3J0IHRoZQorIyBmaXJzdCBvbmUgYW5kIHF1aXQuICBJZiBhbGwgcGFzcywgdGhlbiB3ZSBwcmludCB0aGUgcGFzcyByZXN1bHRzLgorCitwcm9jIHRlc3RfYXRfbWFpbiB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgZGVjaW1hbAorICAgIGdsb2JhbCBkZXRfZmlsZQorICAgIGdsb2JhbCBzcmNkaXIKKyAgICBnbG9iYWwgc3ViZGlyCisgICAgZ2xvYmFsIGdjY19jb21waWxlZAorCisgICAgIyBza2lwIHBhc3QgaW5pdC4gIFRoZXJlIG1heSBiZSBhIGNhbGwgdG8gX19tYWluIGF0IHRoZSBzdGFydCBvZgorICAgICMgbWFpbiwgc28gdGhlIGZpcnN0IG5leHQgbWF5IG9ubHkgZ2V0IHVzIHRvIHRoZSBpbml0MCBjYWxsLgorICAgIGlmIFtnZGJfdGVzdCAibmV4dCIgIiRkZWNpbWFsLipmb28gXFwoXFwpOyIgIm5leHQgb3ZlciBpbml0MCgpIGluIG1haW4iICAiJGRlY2ltYWwuKmluaXQwIFxcKFxcKTsiICJuZXh0Il0geyAKKyAgICAgIGdkYl9zdXBwcmVzc190ZXN0cyA7IAorICAgIH0KKworCisgICAgIyBQcmludCBzY29wZTAuYzo6ZmlsZWxvY2FsLCB3aGljaCBpcyAxCisKKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50IGZpbGVsb2NhbCIgIlxcXCQkZGVjaW1hbCA9IDEiICJwcmludCBmaWxlbG9jYWwiIF0geyAKKyAgICAgIGdkYl9zdXBwcmVzc190ZXN0cyA7IAorICAgIH0KKworCisgICAgaWYgW2dkYl90ZXN0ICJwcmludCAnc2NvcGUwLmMnOjpmaWxlbG9jYWwiICJcXFwkJGRlY2ltYWwgPSAxIiAicHJpbnQgJ3Njb3BlMC5jJzo6ZmlsZWxvY2FsIGF0IG1haW4iICAiTm8gc3ltYm9sIFwic2NvcGUwLmNcIiBpbiBjdXJyZW50IGNvbnRleHQuKiIgInByaW50ICckc3JjZGlyLyRzdWJkaXIvc2NvcGUwLmMnOjpmaWxlbG9jYWwiXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICAjIFByaW50IHNjb3BlMC5jOjpmaWxlbG9jYWxfYnNzLCB3aGljaCBpcyAxMDEKKworICAgIGlmIFtnZGJfdGVzdCAicHJpbnQgZmlsZWxvY2FsX2JzcyIgIlxcXCQkZGVjaW1hbCA9IDEwMSIgInByaW50IGZpbGVsb2NhbF9ic3MiIF0geyAKKyAgICAgIGdkYl9zdXBwcmVzc190ZXN0cyA7IAorICAgIH0KKworCisgICAgaWYgW2dkYl90ZXN0ICJwcmludCAnc2NvcGUwLmMnOjpmaWxlbG9jYWxfYnNzIiAiXFxcJCRkZWNpbWFsID0gMTAxIiAicHJpbnQgJ3Njb3BlMC5jJzo6ZmlsZWxvY2FsX2JzcyBpbiB0ZXN0X2F0X21haW4iICAiTm8gc3ltYm9sIFwic2NvcGUwLmNcIiBpbiBjdXJyZW50IGNvbnRleHQuKiIgInByaW50ICckc3JjZGlyLyRzdWJkaXIvc2NvcGUwLmMnOjpmaWxlbG9jYWxfYnNzIl0geyAKKyAgICAgIGdkYl9zdXBwcmVzc190ZXN0cyA7IAorICAgIH0KKworCisgICAgIyBQcmludCBzY29wZTAuYzo6ZmlsZWxvY2FsX3JvLCB3aGljaCBpcyAyMDEKKworICAgICMgTm8gY2x1ZSB3aHkgdGhlIHBvd2VycGMgZmFpbHMgdGhpcyB0ZXN0LgorICAgIHNldHVwX3hmYWlsICJwb3dlcnBjLSotKiIKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CisgICAgaWYgW2dkYl90ZXN0ICJwcmludCBmaWxlbG9jYWxfcm8iICJcXFwkJGRlY2ltYWwgPSAyMDEiICJwcmludCBmaWxlbG9jYWxfcm8gaW4gdGVzdF9hdF9tYWluIiBdIHsgCisgICAgICBnZGJfc3VwcHJlc3NfdGVzdHMgOyAKKyAgICB9CisKKworICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiIH0KKyAgICBzZXR1cF94ZmFpbCAicG93ZXJwYy0qLSoiCisgICAgaWYgW2dkYl90ZXN0ICJwcmludCAnc2NvcGUwLmMnOjpmaWxlbG9jYWxfcm8iICJcXFwkJGRlY2ltYWwgPSAyMDEiICJwcmludCAnc2NvcGUwLmMnOjpmaWxlbG9jYWxfcm8iICAiTm8gc3ltYm9sIFwic2NvcGUwLmNcIiBpbiBjdXJyZW50IGNvbnRleHQuKiIgInByaW50ICckc3JjZGlyLyRzdWJkaXIvc2NvcGUwLmMnOjpmaWxlbG9jYWxfcm8iXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICAjIFByaW50IHNjb3BlMS5jOjpmaWxlbG9jYWwsIHdoaWNoIGlzIDIKKworICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiIH0KKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50ICdzY29wZTEuYyc6OmZpbGVsb2NhbCIgIlxcXCQkZGVjaW1hbCA9IDIiICJwcmludCAnc2NvcGUxLmMnOjpmaWxlbG9jYWwiICAiTm8gc3ltYm9sIFwic2NvcGUxLmNcIiBpbiBjdXJyZW50IGNvbnRleHQuKiIgInByaW50ICckc3JjZGlyLyRzdWJkaXIvc2NvcGUxLmMnOjpmaWxlbG9jYWwiXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICAjIFByaW50IHNjb3BlMS5jOjpmaWxlbG9jYWxfYnNzLCB3aGljaCBpcyAxMDIKKworICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiIH0KKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50ICdzY29wZTEuYyc6OmZpbGVsb2NhbF9ic3MiICJcXFwkJGRlY2ltYWwgPSAxMDIiICJwcmludCAnc2NvcGUxLmMnOjpmaWxlbG9jYWxfYnNzIiAgIk5vIHN5bWJvbCBcInNjb3BlMS5jXCIgaW4gY3VycmVudCBjb250ZXh0LioiICJwcmludCAnJHNyY2Rpci8kc3ViZGlyL3Njb3BlMS5jJzo6ZmlsZWxvY2FsX2JzcyJdIHsgCisgICAgICBnZGJfc3VwcHJlc3NfdGVzdHMgOyAKKyAgICB9CisKKworICAgICMgUHJpbnQgc2NvcGUxLmM6OmZpbGVsb2NhbF9ybywgd2hpY2ggaXMgMjAyCisKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CisgICAgaWYgW2dkYl90ZXN0ICJwcmludCAnc2NvcGUxLmMnOjpmaWxlbG9jYWxfcm8iICJcXFwkJGRlY2ltYWwgPSAyMDIiICJwcmludCAnc2NvcGUxLmMnOjpmaWxlbG9jYWxfcm8iICAiTm8gc3ltYm9sIFwic2NvcGUxLmNcIiBpbiBjdXJyZW50IGNvbnRleHQuKiIgInByaW50ICckc3JjZGlyLyRzdWJkaXIvc2NvcGUxLmMnOjpmaWxlbG9jYWxfcm8iXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICAjIFByaW50IHNjb3BlMS5jOjpmb286OmZ1bmNsb2NhbCwgd2hpY2ggaXMgMworCisgICAgaWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgImhwcGEqLSotaHB1eCoiIH0KKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50IGZvbzo6ZnVuY2xvY2FsIiAiXFxcJCRkZWNpbWFsID0gMyIgInByaW50IGZvbzo6ZnVuY2xvY2FsIiBdIHsgCisgICAgICBnZGJfc3VwcHJlc3NfdGVzdHMgOyAKKyAgICB9CisKKworICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiIH0KKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50ICdzY29wZTEuYyc6OmZvbzo6ZnVuY2xvY2FsIiAiXFxcJCRkZWNpbWFsID0gMyIgInByaW50ICdzY29wZTEuYyc6OmZvbzo6ZnVuY2xvY2FsIiAgIk5vIHN5bWJvbCBcInNjb3BlMS5jXCIgaW4gY3VycmVudCBjb250ZXh0LioiICJwcmludCAnJHNyY2Rpci8kc3ViZGlyL3Njb3BlMS5jJzo6Zm9vOjpmdW5jbG9jYWwiXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICAjIFByaW50IHNjb3BlMS5jOjpmb286OmZ1bmNsb2NhbF9ybywgd2hpY2ggaXMgMjAzCisKKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50IGZvbzo6ZnVuY2xvY2FsX3JvIiAiXFxcJCRkZWNpbWFsID0gMjAzIiAicHJpbnQgZm9vOjpmdW5jbG9jYWxfcm8iIF0geyAKKyAgICAgIGdkYl9zdXBwcmVzc190ZXN0cyA7IAorICAgIH0KKworCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAicnM2MDAwLSotKiIgfQorICAgIGlmIFtnZGJfdGVzdCAicHJpbnQgJ3Njb3BlMS5jJzo6Zm9vOjpmdW5jbG9jYWxfcm8iICJcXFwkJGRlY2ltYWwgPSAyMDMiICJwcmludCAnc2NvcGUxLmMnOjpmb286OmZ1bmNsb2NhbF9ybyIgICJObyBzeW1ib2wgXCJzY29wZTEuY1wiIGluIGN1cnJlbnQgY29udGV4dC4qIiAicHJpbnQgJyRzcmNkaXIvJHN1YmRpci9zY29wZTEuYyc6OmZvbzo6ZnVuY2xvY2FsX3JvIl0geyAKKyAgICAgIGdkYl9zdXBwcmVzc190ZXN0cyA7IAorICAgIH0KKworCisgICAgIyBQcmludCBzY29wZTEuYzo6YmFyOjpmdW5jbG9jYWwsIHdoaWNoIGlzIDQKKworICAgIGlmIFtnZGJfdGVzdCAicHJpbnQgYmFyOjpmdW5jbG9jYWwiICJcXFwkJGRlY2ltYWwgPSA0IiAicHJpbnQgYmFyOjpmdW5jbG9jYWwiIF0geyAKKyAgICAgIGdkYl9zdXBwcmVzc190ZXN0cyA7IAorICAgIH0KKworCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAicnM2MDAwLSotKiIgfQorICAgIGlmIFtnZGJfdGVzdCAicHJpbnQgJ3Njb3BlMS5jJzo6YmFyOjpmdW5jbG9jYWwiICJcXFwkJGRlY2ltYWwgPSA0IiAicHJpbnQgJ3Njb3BlMS5jJzo6YmFyOjpmdW5jbG9jYWwiICAiTm8gc3ltYm9sIFwic2NvcGUxLmNcIiBpbiBjdXJyZW50IGNvbnRleHQuKiIgInByaW50ICckc3JjZGlyLyRzdWJkaXIvc2NvcGUxLmMnOjpiYXI6OmZ1bmNsb2NhbCJdIHsgCisgICAgICBnZGJfc3VwcHJlc3NfdGVzdHMgOyAKKyAgICB9CisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7CisKK30KKworcHJvYyB0ZXN0X2F0X2ZvbyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgZGVjaW1hbAorICAgIGdsb2JhbCBkZXRfZmlsZQorICAgIGdsb2JhbCBzcmNkaXIKKyAgICBnbG9iYWwgc3ViZGlyCisgICAgZ2xvYmFsIGdjY19jb21waWxlZAorCisgICAgaWYgW2dkYl90ZXN0ICJuZXh0IiAiLipiYXIgXFwoXFwpOyIgIiIgXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICAjIFByaW50IHNjb3BlMC5jOjpmaWxlbG9jYWwsIHdoaWNoIGlzIDEKKworICAgIGlmIFtnZGJfdGVzdCAicHJpbnQgJ3Njb3BlMC5jJzo6ZmlsZWxvY2FsIiAiXFxcJCRkZWNpbWFsID0gMSIgInByaW50ICdzY29wZTAuYyc6OmZpbGVsb2NhbCBhdCBmb28iICAiTm8gc3ltYm9sIFwic2NvcGUwLmNcIiBpbiBjdXJyZW50IGNvbnRleHQuKiIgInByaW50ICckc3JjZGlyLyRzdWJkaXIvc2NvcGUwLmMnOjpmaWxlbG9jYWwiXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICAjIFByaW50IHNjb3BlMC5jOjpmaWxlbG9jYWxfYnNzLCB3aGljaCBpcyAxMDEKKworICAgIGlmIFtnZGJfdGVzdCAicHJpbnQgJ3Njb3BlMC5jJzo6ZmlsZWxvY2FsX2JzcyIgIlxcXCQkZGVjaW1hbCA9IDEwMSIgInByaW50ICdzY29wZTAuYyc6OmZpbGVsb2NhbF9ic3MgaW4gdGVzdF9hdF9mb28iICAiTm8gc3ltYm9sIFwic2NvcGUwLmNcIiBpbiBjdXJyZW50IGNvbnRleHQuKiIgInByaW50ICckc3JjZGlyLyRzdWJkaXIvc2NvcGUwLmMnOjpmaWxlbG9jYWxfYnNzIl0geyAKKyAgICAgIGdkYl9zdXBwcmVzc190ZXN0cyA7IAorICAgIH0KKworCisgICAgIyBQcmludCBzY29wZTAuYzo6ZmlsZWxvY2FsX3JvLCB3aGljaCBpcyAyMDEKKworICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiIH0KKyAgICBzZXR1cF94ZmFpbCAicG93ZXJwYy0qLSoiCisgICAgaWYgW2dkYl90ZXN0ICJwcmludCAnc2NvcGUwLmMnOjpmaWxlbG9jYWxfcm8iICJcXFwkJGRlY2ltYWwgPSAyMDEiICJwcmludCAnc2NvcGUwLmMnOjpmaWxlbG9jYWxfcm8iICAiTm8gc3ltYm9sIFwic2NvcGUwLmNcIiBpbiBjdXJyZW50IGNvbnRleHQuKiIgInByaW50ICckc3JjZGlyLyRzdWJkaXIvc2NvcGUwLmMnOjpmaWxlbG9jYWxfcm8iXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZmlsZWxvY2FsIiAiXFxcJCRkZWNpbWFsID0gMiIgInByaW50IGZpbGVsb2NhbCBhdCBmb28iCisKKyAgICAjIFByaW50IHNjb3BlMS5jOjpmaWxlbG9jYWwsIHdoaWNoIGlzIDIKKworICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiIH0KKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50ICdzY29wZTEuYyc6OmZpbGVsb2NhbCIgIlxcXCQkZGVjaW1hbCA9IDIiICJwcmludCAnc2NvcGUxLmMnOjpmaWxlbG9jYWwgYXQgZm9vIiAgIk5vIHN5bWJvbCBcInNjb3BlMS5jXCIgaW4gY3VycmVudCBjb250ZXh0LioiICJwcmludCAnJHNyY2Rpci8kc3ViZGlyL3Njb3BlMS5jJzo6ZmlsZWxvY2FsIl0geyAKKyAgICAgIGdkYl9zdXBwcmVzc190ZXN0cyA7IAorICAgIH0KKworCisgICAgZ2RiX3Rlc3QgInByaW50IGZpbGVsb2NhbF9ic3MiICJcXFwkJGRlY2ltYWwgPSAxMDIiIFwKKwkicHJpbnQgZmlsZWxvY2FsX2JzcyBhdCBmb28iCisKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CisgICAgZ2RiX3Rlc3QgInByaW50ICdzY29wZTEuYyc6OmZpbGVsb2NhbF9ic3MiICJcXFwkJGRlY2ltYWwgPSAxMDIiICJwcmludCAnc2NvcGUxLmMnOjpmaWxlbG9jYWxfYnNzIGF0IGZvbyIgICJObyBzeW1ib2wgXCJzY29wZTEuY1wiIGluIGN1cnJlbnQgY29udGV4dC4qIiAicHJpbnQgJyRzcmNkaXIvJHN1YmRpci9zY29wZTEuYyc6OmZpbGVsb2NhbF9ic3MiCisKKworICAgIGdkYl90ZXN0ICJwcmludCBmaWxlbG9jYWxfcm8iICJcXFwkJGRlY2ltYWwgPSAyMDIiIFwKKwkicHJpbnQgZmlsZWxvY2FsX3JvIGF0IGZvbyIKKworICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiIH0KKyAgICBnZGJfdGVzdCAicHJpbnQgJ3Njb3BlMS5jJzo6ZmlsZWxvY2FsX3JvIiAiXFxcJCRkZWNpbWFsID0gMjAyIiAicHJpbnQgJ3Njb3BlMS5jJzo6ZmlsZWxvY2FsX3JvIGF0IGZvbyIgICJObyBzeW1ib2wgXCJzY29wZTEuY1wiIGluIGN1cnJlbnQgY29udGV4dC4qIiAicHJpbnQgJyRzcmNkaXIvJHN1YmRpci9zY29wZTEuYyc6OmZpbGVsb2NhbF9ybyIKKworCisgICAgIyBQcmludCBzY29wZTEuYzo6Zm9vOjpmdW5jbG9jYWwsIHdoaWNoIGlzIDMKKworICAgIGdkYl90ZXN0ICJwcmludCBmdW5jbG9jYWwiICJcXFwkJGRlY2ltYWwgPSAzIiAicHJpbnQgZnVuY2xvY2FsIGF0IGZvbyIKKworICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJocHBhKi0qLWhwdXgqIiB9CisgICAgZ2RiX3Rlc3QgInByaW50IGZvbzo6ZnVuY2xvY2FsIiAiXFxcJCRkZWNpbWFsID0gMyIgXAorCSJwcmludCBmb286OmZ1bmNsb2NhbCBhdCBmb28iCisKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CisgICAgaWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgImhwcGEqLSotaHB1eCoiIH0KKyAgICBnZGJfdGVzdCAicHJpbnQgJ3Njb3BlMS5jJzo6Zm9vOjpmdW5jbG9jYWwiICJcXFwkJGRlY2ltYWwgPSAzIiAicHJpbnQgJ3Njb3BlMS5jJzo6Zm9vOjpmdW5jbG9jYWwgYXQgZm9vIiAgIk5vIHN5bWJvbCBcInNjb3BlMS5jXCIgaW4gY3VycmVudCBjb250ZXh0LioiICJwcmludCAnJHNyY2Rpci8kc3ViZGlyL3Njb3BlMS5jJzo6Zm9vOjpmdW5jbG9jYWwiCisKKworICAgICMgUHJpbnQgc2NvcGUxLmM6OmZvbzo6ZnVuY2xvY2FsX2Jzcywgd2hpY2ggaXMgMTAzCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZnVuY2xvY2FsX2JzcyIgIlxcXCQkZGVjaW1hbCA9IDEwMyIgXAorCSJwcmludCBmdW5jbG9jYWxfYnNzIGF0IGZvbyIKKworICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJocHBhKi0qLWhwdXgqIiB9CisgICAgZ2RiX3Rlc3QgInByaW50IGZvbzo6ZnVuY2xvY2FsX2JzcyIgIlxcXCQkZGVjaW1hbCA9IDEwMyIgXAorCSJwcmludCBmb286OmZ1bmNsb2NhbF9ic3MgYXQgZm9vIgorCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAicnM2MDAwLSotKiIgfQorICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJocHBhKi0qLWhwdXgqIiB9CisgICAgZ2RiX3Rlc3QgInByaW50ICdzY29wZTEuYyc6OmZvbzo6ZnVuY2xvY2FsX2JzcyIgIlxcXCQkZGVjaW1hbCA9IDEwMyIgInByaW50ICdzY29wZTEuYyc6OmZvbzo6ZnVuY2xvY2FsX2JzcyBhdCBmb28iICAiTm8gc3ltYm9sIFwic2NvcGUxLmNcIiBpbiBjdXJyZW50IGNvbnRleHQuKiIgInByaW50ICckc3JjZGlyLyRzdWJkaXIvc2NvcGUxLmMnOjpmb286OmZ1bmNsb2NhbF9ic3MiCisKKworICAgICMgUHJpbnQgc2NvcGUxLmM6OmZvbzo6ZnVuY2xvY2FsX3JvLCB3aGljaCBpcyAyMDMKKworICAgIGdkYl90ZXN0ICJwcmludCBmdW5jbG9jYWxfcm8iICJcXFwkJGRlY2ltYWwgPSAyMDMiIFwKKwkicHJpbnQgZnVuY2xvY2FsX3JvIGF0IGZvbyIKKworICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJocHBhKi0qLWhwdXgqIiB9CisgICAgZ2RiX3Rlc3QgInByaW50IGZvbzo6ZnVuY2xvY2FsX3JvIiAiXFxcJCRkZWNpbWFsID0gMjAzIiBcCisJInByaW50IGZvbzo6ZnVuY2xvY2FsX3JvIGF0IGZvbyIKKworICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiIH0KKyAgICBpZiB7ISRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiaHBwYSotKi1ocHV4KiIgfQorICAgIGdkYl90ZXN0ICJwcmludCAnc2NvcGUxLmMnOjpmb286OmZ1bmNsb2NhbF9ybyIgIlxcXCQkZGVjaW1hbCA9IDIwMyIgInByaW50ICdzY29wZTEuYyc6OmZvbzo6ZnVuY2xvY2FsX3JvIGF0IGZvbyIgICJObyBzeW1ib2wgXCJzY29wZTEuY1wiIGluIGN1cnJlbnQgY29udGV4dC4qIiAicHJpbnQgJyRzcmNkaXIvJHN1YmRpci9zY29wZTEuYyc6OmZvbzo6ZnVuY2xvY2FsX3JvIgorCisKKyAgICAjIFByaW50IHNjb3BlMS5jOjpiYXI6OmZ1bmNsb2NhbCwgd2hpY2ggaXMgNAorCisgICAgaWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgImhwcGEqLSotaHB1eCoiIH0KKyAgICBnZGJfdGVzdCAicHJpbnQgYmFyOjpmdW5jbG9jYWwiICJcXFwkJGRlY2ltYWwgPSA0IiBcCisJInByaW50IGJhcjo6ZnVuY2xvY2FsIGF0IGZvbyIKKworICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiIH0KKyAgICBpZiB7ISRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiaHBwYSotKi1ocHV4KiIgfQorICAgIGdkYl90ZXN0ICJwcmludCAnc2NvcGUxLmMnOjpiYXI6OmZ1bmNsb2NhbCIgIlxcXCQkZGVjaW1hbCA9IDQiICJwcmludCAnc2NvcGUxLmMnOjpiYXI6OmZ1bmNsb2NhbCBhdCBmb28iICAiTm8gc3ltYm9sIFwic2NvcGUxLmNcIiBpbiBjdXJyZW50IGNvbnRleHQuKiIgInByaW50ICckc3JjZGlyLyRzdWJkaXIvc2NvcGUxLmMnOjpiYXI6OmZ1bmNsb2NhbCIKKyAgICBnZGJfc3RvcF9zdXBwcmVzc2luZ190ZXN0czsKKworfQorCitwcm9jIHRlc3RfYXRfYmFyIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBkZWNpbWFsCisgICAgZ2xvYmFsIGRldF9maWxlCisgICAgZ2xvYmFsIHNyY2RpcgorICAgIGdsb2JhbCBzdWJkaXIKKyAgICBnbG9iYWwgZ2NjX2NvbXBpbGVkCisKKyAgICBpZiBbZ2RiX3Rlc3QgIm5leHQiICIuKiIgIiIgXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICAjIFByaW50IHNjb3BlMC5jOjpmaWxlbG9jYWwsIHdoaWNoIGlzIDEKKworICAgIGlmIFtnZGJfdGVzdCAicHJpbnQgJ3Njb3BlMC5jJzo6ZmlsZWxvY2FsIiAiXFxcJCRkZWNpbWFsID0gMSIgInByaW50ICdzY29wZTAuYyc6OmZpbGVsb2NhbCBhdCBiYXIiICAiTm8gc3ltYm9sIFwic2NvcGUwLmNcIiBpbiBjdXJyZW50IGNvbnRleHQuKiIgInByaW50ICckc3JjZGlyLyRzdWJkaXIvc2NvcGUwLmMnOjpmaWxlbG9jYWwiXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICMgUHJpbnQgc2NvcGUwLmM6OmZpbGVsb2NhbF9ic3MsIHdoaWNoIGlzIDEwMQorCisgICAgaWYgW2dkYl90ZXN0ICJwcmludCAnc2NvcGUwLmMnOjpmaWxlbG9jYWxfYnNzIiAiXFxcJCRkZWNpbWFsID0gMTAxIiAicHJpbnQgJ3Njb3BlMC5jJzo6ZmlsZWxvY2FsX2JzcyBpbiB0ZXN0X2F0X2JhciIgICJObyBzeW1ib2wgXCJzY29wZTAuY1wiIGluIGN1cnJlbnQgY29udGV4dC4qIiAicHJpbnQgJyRzcmNkaXIvJHN1YmRpci9zY29wZTAuYyc6OmZpbGVsb2NhbF9ic3MiXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICMgUHJpbnQgc2NvcGUwLmM6OmZpbGVsb2NhbF9ybywgd2hpY2ggaXMgMjAxCisKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CisgICAgc2V0dXBfeGZhaWwgInBvd2VycGMtKi0qIgorICAgIGlmIFtnZGJfdGVzdCAicHJpbnQgJ3Njb3BlMC5jJzo6ZmlsZWxvY2FsX3JvIiAiXFxcJCRkZWNpbWFsID0gMjAxIiAicHJpbnQgJ3Njb3BlMC5jJzo6ZmlsZWxvY2FsX3JvIGF0IGJhciIgICJObyBzeW1ib2wgXCJzY29wZTAuY1wiIGluIGN1cnJlbnQgY29udGV4dC4qIiAicHJpbnQgJyRzcmNkaXIvJHN1YmRpci9zY29wZTAuYyc6OmZpbGVsb2NhbF9ybyJdIHsgCisgICAgICBnZGJfc3VwcHJlc3NfdGVzdHMgOyAKKyAgICB9CisKKworICAgICMgUHJpbnQgc2NvcGUxLmM6OmZpbGVsb2NhbCwgd2hpY2ggaXMgMgorCisgICAgaWYgW2dkYl90ZXN0ICJwcmludCBmaWxlbG9jYWwiICJcXFwkJGRlY2ltYWwgPSAyIiAicHJpbnQgZmlsZWxvY2FsIGF0IGJhciIgXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CisgICAgaWYgW2dkYl90ZXN0ICJwcmludCAnc2NvcGUxLmMnOjpmaWxlbG9jYWwiICJcXFwkJGRlY2ltYWwgPSAyIiAicHJpbnQgJ3Njb3BlMS5jJzo6ZmlsZWxvY2FsIGF0IGJhciIgICJObyBzeW1ib2wgXCJzY29wZTEuY1wiIGluIGN1cnJlbnQgY29udGV4dC4qIiAicHJpbnQgJyRzcmNkaXIvJHN1YmRpci9zY29wZTEuYyc6OmZpbGVsb2NhbCJdIHsgCisgICAgICBnZGJfc3VwcHJlc3NfdGVzdHMgOyAKKyAgICB9CisKKworICAgICMgUHJpbnQgc2NvcGUxLmM6OmZpbGVsb2NhbF9ic3MsIHdoaWNoIGlzIDEwMgorCisgICAgaWYgW2dkYl90ZXN0ICJwcmludCBmaWxlbG9jYWxfYnNzIiAiXFxcJCRkZWNpbWFsID0gMTAyIiAicHJpbnQgZmlsZWxvY2FsX2JzcyBhdCBiYXIiIF0geyAKKyAgICAgIGdkYl9zdXBwcmVzc190ZXN0cyA7IAorICAgIH0KKworCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAicnM2MDAwLSotKiIgfQorICAgIGlmIFtnZGJfdGVzdCAicHJpbnQgJ3Njb3BlMS5jJzo6ZmlsZWxvY2FsX2JzcyIgIlxcXCQkZGVjaW1hbCA9IDEwMiIgInByaW50ICdzY29wZTEuYyc6OmZpbGVsb2NhbF9ic3MgYXQgYmFyIiAgIk5vIHN5bWJvbCBcInNjb3BlMS5jXCIgaW4gY3VycmVudCBjb250ZXh0LioiICJwcmludCAnJHNyY2Rpci8kc3ViZGlyL3Njb3BlMS5jJzo6ZmlsZWxvY2FsX2JzcyJdIHsgCisgICAgICBnZGJfc3VwcHJlc3NfdGVzdHMgOyAKKyAgICB9CisKKworICAgICMgUHJpbnQgc2NvcGUxLmM6OmZpbGVsb2NhbF9ybywgd2hpY2ggaXMgMjAyCisKKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50IGZpbGVsb2NhbF9ybyIgIlxcXCQkZGVjaW1hbCA9IDIwMiIgInByaW50IGZpbGVsb2NhbF9ybyBpbiB0ZXN0X2F0X2JhciIgXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CisgICAgaWYgW2dkYl90ZXN0ICJwcmludCAnc2NvcGUxLmMnOjpmaWxlbG9jYWxfcm8iICJcXFwkJGRlY2ltYWwgPSAyMDIiICJwcmludCAnc2NvcGUxLmMnOjpmaWxlbG9jYWxfcm8gYXQgYmFyIiAgIk5vIHN5bWJvbCBcInNjb3BlMS5jXCIgaW4gY3VycmVudCBjb250ZXh0LioiICJwcmludCAnJHNyY2Rpci8kc3ViZGlyL3Njb3BlMS5jJzo6ZmlsZWxvY2FsX3JvIl0geyAKKyAgICAgIGdkYl9zdXBwcmVzc190ZXN0cyA7IAorICAgIH0KKworCisgICAgIyBQcmludCBzY29wZTEuYzo6Zm9vOjpmdW5jbG9jYWwsIHdoaWNoIGlzIDMKKworICAgIGlmIHshJGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJocHBhKi0qLWhwdXgqIiB9CisgICAgaWYgW2dkYl90ZXN0ICJwcmludCBmb286OmZ1bmNsb2NhbCIgIlxcXCQkZGVjaW1hbCA9IDMiICJwcmludCBmb286OmZ1bmNsb2NhbCBhdCBiYXIiIF0geyAKKyAgICAgIGdkYl9zdXBwcmVzc190ZXN0cyA7IAorICAgIH0KKworCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAicnM2MDAwLSotKiIgfQorICAgIGlmIFtnZGJfdGVzdCAicHJpbnQgJ3Njb3BlMS5jJzo6Zm9vOjpmdW5jbG9jYWwiICJcXFwkJGRlY2ltYWwgPSAzIiAicHJpbnQgJ3Njb3BlMS5jJzo6Zm9vOjpmdW5jbG9jYWwgYXQgYmFyIiAgIk5vIHN5bWJvbCBcInNjb3BlMS5jXCIgaW4gY3VycmVudCBjb250ZXh0LioiICJwcmludCAnJHNyY2Rpci8kc3ViZGlyL3Njb3BlMS5jJzo6Zm9vOjpmdW5jbG9jYWwiXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICAjIFByaW50IHNjb3BlMS5jOjpmb286OmZ1bmNsb2NhbF9ic3MsIHdoaWNoIGlzIDEwMworCisgICAgaWYgW2dkYl90ZXN0ICJwcmludCBmb286OmZ1bmNsb2NhbF9ic3MiICJcXFwkJGRlY2ltYWwgPSAxMDMiICJwcmludCBmb286OmZ1bmNsb2NhbF9ic3MgYXQgYmFyIiBdIHsgCisgICAgICBnZGJfc3VwcHJlc3NfdGVzdHMgOyAKKyAgICB9CisKKworICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiIH0KKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50ICdzY29wZTEuYyc6OmZvbzo6ZnVuY2xvY2FsX2JzcyIgIlxcXCQkZGVjaW1hbCA9IDEwMyIgInByaW50ICdzY29wZTEuYyc6OmZvbzo6ZnVuY2xvY2FsX2JzcyBhdCBiYXIiICAiTm8gc3ltYm9sIFwic2NvcGUxLmNcIiBpbiBjdXJyZW50IGNvbnRleHQuKiIgInByaW50ICckc3JjZGlyLyRzdWJkaXIvc2NvcGUxLmMnOjpmb286OmZ1bmNsb2NhbF9ic3MiXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICAjIFByaW50IHNjb3BlMS5jOjpmb286OmZ1bmNsb2NhbF9ybywgd2hpY2ggaXMgMjAzCisKKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50IGZvbzo6ZnVuY2xvY2FsX3JvIiAiXFxcJCRkZWNpbWFsID0gMjAzIiAicHJpbnQgZm9vOjpmdW5jbG9jYWxfcm8gYXQgYmFyIiBdIHsgCisgICAgICBnZGJfc3VwcHJlc3NfdGVzdHMgOyAKKyAgICB9CisKKworICAgIGlmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiIH0KKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50ICdzY29wZTEuYyc6OmZvbzo6ZnVuY2xvY2FsX3JvIiAiXFxcJCRkZWNpbWFsID0gMjAzIiAicHJpbnQgJ3Njb3BlMS5jJzo6Zm9vOjpmdW5jbG9jYWxfcm8gYXQgYmFyIiAgIk5vIHN5bWJvbCBcInNjb3BlMS5jXCIgaW4gY3VycmVudCBjb250ZXh0LioiICJwcmludCAnJHNyY2Rpci8kc3ViZGlyL3Njb3BlMS5jJzo6Zm9vOjpmdW5jbG9jYWxfcm8iXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICAjIFByaW50IHNjb3BlMS5jOjpiYXI6OmZ1bmNsb2NhbCwgd2hpY2ggaXMgNAorCisgICAgaWYgW2dkYl90ZXN0ICJwcmludCBmdW5jbG9jYWwiICJcXFwkJGRlY2ltYWwgPSA0IiAicHJpbnQgZnVuY2xvY2FsIGF0IGJhciIgXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50IGJhcjo6ZnVuY2xvY2FsIiAiXFxcJCRkZWNpbWFsID0gNCIgInByaW50IGJhcjo6ZnVuY2xvY2FsIGF0IGJhciIgXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICJyczYwMDAtKi0qIiB9CisgICAgaWYgW2dkYl90ZXN0ICJwcmludCAnc2NvcGUxLmMnOjpiYXI6OmZ1bmNsb2NhbCIgIlxcXCQkZGVjaW1hbCA9IDQiICJwcmludCAnc2NvcGUxLmMnOjpiYXI6OmZ1bmNsb2NhbCBhdCBiYXIiICAiTm8gc3ltYm9sIFwic2NvcGUxLmNcIiBpbiBjdXJyZW50IGNvbnRleHQuKiIgInByaW50ICckc3JjZGlyLyRzdWJkaXIvc2NvcGUxLmMnOjpiYXI6OmZ1bmNsb2NhbCJdIHsgCisgICAgICBnZGJfc3VwcHJlc3NfdGVzdHMgOyAKKyAgICB9CisKKworICAgICMgUHJpbnQgc2NvcGUxLmM6OmJhcjo6ZnVuY2xvY2FsX2Jzcywgd2hpY2ggaXMgMTA0CisKKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50IGZ1bmNsb2NhbF9ic3MiICJcXFwkJGRlY2ltYWwgPSAxMDQiICJwcmludCBmdW5jbG9jYWxfYnNzIGF0IGJhciIgXSB7IAorICAgICAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisgICAgfQorCisKKyAgICBpZiBbZ2RiX3Rlc3QgInByaW50IGJhcjo6ZnVuY2xvY2FsX2JzcyIgIlxcXCQkZGVjaW1hbCA9IDEwNCIgInByaW50IGJhcjo6ZnVuY2xvY2FsX2JzcyBhdCBiYXIiIF0geyAKKyAgICAgIGdkYl9zdXBwcmVzc190ZXN0cyA7IAorICAgIH0KKworCisgICAgaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAicnM2MDAwLSotKiIgfQorICAgIGlmIFtnZGJfdGVzdCAicHJpbnQgJ3Njb3BlMS5jJzo6YmFyOjpmdW5jbG9jYWxfYnNzIiAiXFxcJCRkZWNpbWFsID0gMTA0IiAicHJpbnQgJ3Njb3BlMS5jJzo6YmFyOjpmdW5jbG9jYWxfYnNzIGF0IGJhciIgICJObyBzeW1ib2wgXCJzY29wZTEuY1wiIGluIGN1cnJlbnQgY29udGV4dC4qIiAicHJpbnQgJyRzcmNkaXIvJHN1YmRpci9zY29wZTEuYyc6OmJhcjo6ZnVuY2xvY2FsX2JzcyJdIHsgCisgICAgICBnZGJfc3VwcHJlc3NfdGVzdHMgOyAKKyAgICB9CisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7CisKK30KKworIyBUaGlzIHRlc3QgaGFzIGxpdHRsZSB0byBkbyB3aXRoIGxvY2FsIHNjb3BlcywgYnV0IGl0IGlzIGluIHNjb3BlLmV4cCBhbnl3YXkuCisjIFRoYXQncyBsaWZlLgorCitwcm9jIHRlc3RfYXRfYXV0b3ZhcnMge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGRlY2ltYWwKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIHNyY2ZpbGUKKworICAgICMgVGVzdCBzeW1ib2wgdGFibGUgbG9va3VwIHdpdGggMTAwIGxvY2FsIChhdXRvKSB2YXJpYWJsZXMuCisKKyAgICBnZGJfYnJlYWtwb2ludCBtYXJrZXIxCisKKyAgICBpZiBbZ2RiX3Rlc3QgImNvbnQiICJCcmVhay4qIG1hcmtlcjEgXFwoXFwpIGF0IC4qOiRkZWNpbWFsLioiICJjb250aW51ZSB0byBtYXJrZXIxIl0geworCWdkYl9zdXBwcmVzc190ZXN0czsKKyAgICB9CisKKyAgICBpZiBbZ2RiX3Rlc3QgInVwIiAiLioiICIiIF0geyAKKwlnZGJfc3VwcHJlc3NfdGVzdHMgOyAKKyAgICB9CisKKyAgICBzZXQgY291bnQgMAorICAgIHdoaWxlIHskY291bnQgPCAxMDB9IHsKKwlpZiBbZ2RiX3Rlc3QgInByaW50IGkkY291bnQiICIuKiA9ICRjb3VudCIgIiIgXSB7IAorCSAgZ2RiX3N1cHByZXNzX3Rlc3RzIDsgCisJfQorCisJc2V0IGNvdW50IFtleHByICRjb3VudCsxXQorICAgIH0KKyAgICBjbGVhcl94ZmFpbCAiKi0qLSoiCisgICAgcGFzcyAiJGNvdW50IGF1dG8gdmFyaWFibGVzIGNvcnJlY3RseSBpbml0aWFsaXplZCIKKworICAgICMgVGVzdCB0aGF0IGJsb2NrIHZhcmlhYmxlIHNvcnRpbmcgaXMgbm90IHNjcmV3aW5nIHVzLgorICAgIGdkYl90ZXN0ICJmcmFtZSIgIiMuKmF1dG92YXJzIFxcKGJjZD01LCBhYmM9NlxcKS4qIiAiYXJncyBpbiBjb3JyZWN0IG9yZGVyIgorfQorCitwcm9jIHRlc3RfYXRfbG9jYWxzY29wZXMge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGRlY2ltYWwKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIHNyY2ZpbGUKKworICAgIGdkYl9icmVha3BvaW50IG1hcmtlcjIKKyAgICBnZGJfYnJlYWtwb2ludCBtYXJrZXIzCisgICAgZ2RiX2JyZWFrcG9pbnQgbWFya2VyNAorCisgICAgaWYgW2dkYl90ZXN0ICJjb250IiAiQnJlYWsuKiBtYXJrZXIyIFxcKFxcKSBhdCAuKjokZGVjaW1hbC4qIiAiY29udGludWUgdG8gbWFya2VyMiJdIHsKKwlnZGJfc3VwcHJlc3NfdGVzdHM7CisgICAgfQorICAgIGlmIFtnZGJfdGVzdCAidXAiICIuKiIgIiIgXSB7IAorCWdkYl9zdXBwcmVzc190ZXN0cyA7IAorICAgIH0KKworICAgICMgU2hvdWxkIGJlIGF0IGZpcnN0IChvdXRlcm1vc3QpIHNjb3BlLiAgQ2hlY2sgdmFsdWVzLgorCisgICAgZ2RiX3Rlc3QgInByaW50IGxvY2FsdmFsIiAiID0gMTAiICJwcmludCBsb2NhbHZhbCwgb3V0ZXIgc2NvcGUiCisgICAgZ2RiX3Rlc3QgInByaW50IGxvY2FsdmFsMSIgIiA9IDExIiAicHJpbnQgbG9jYWx2YWwxLCBvdXRlciBzY29wZSIKKyAgICBnZGJfdGVzdCAicHJpbnQgbG9jYWx2YWwyIiAiTm8gc3ltYm9sIFwibG9jYWx2YWwyXCIgaW4gY3VycmVudCBjb250ZXh0LiIgXAorCSJwcmludCBsb2NhbHZhbDIsIG91dGVyIHNjb3BlIgorICAgIGdkYl90ZXN0ICJwcmludCBsb2NhbHZhbDMiICJObyBzeW1ib2wgXCJsb2NhbHZhbDNcIiBpbiBjdXJyZW50IGNvbnRleHQuIiBcCisJInByaW50IGxvY2FsdmFsMywgb3V0ZXIgc2NvcGUiCisKKyAgICBpZiBbZ2RiX3Rlc3QgImNvbnQiICJCcmVhay4qIG1hcmtlcjMgXFwoXFwpIGF0IC4qOiRkZWNpbWFsLioiIFwKKwkiY29udGludWUgdG8gbWFya2VyMyBpbiBzY29wZS5leHAiXSB0aGVuIHsgZ2RiX3N1cHByZXNzX3Rlc3RzIH0KKyAgICBpZiBbZ2RiX3Rlc3QgInVwIiAiIiAidXAgZnJvbSBtYXJrZXIzIGluIHNjb3BlLmV4cCJdIHRoZW4geyBnZGJfc3VwcHJlc3NfdGVzdHMgfQorCisgICAgIyBTaG91bGQgYmUgYXQgbmV4dCAoZmlyc3QgbmVzdGVkKSBzY29wZS4gIENoZWNrIHZhbHVlcy4KKworICAgIGdkYl90ZXN0ICJwcmludCBsb2NhbHZhbCIgIiA9IDIwIiBcCisJInByaW50IGxvY2FsdmFsLCBmaXJzdCBuZXN0ZWQgc2NvcGUiCisgICAgZ2RiX3Rlc3QgInByaW50IGxvY2FsdmFsMSIgIiA9IDExIiAicHJpbnQgbG9jYWx2YWwxLCBmaXJzdCBuZXN0ZWQgc2NvcGUiCisgICAgZ2RiX3Rlc3QgInByaW50IGxvY2FsdmFsMiIgIiA9IDEyIiAicHJpbnQgbG9jYWx2YWwyLCBmaXJzdCBuZXN0ZWQgc2NvcGUiCisgICAgZ2RiX3Rlc3QgInByaW50IGxvY2FsdmFsMyIgIk5vIHN5bWJvbCBcImxvY2FsdmFsM1wiIGluIGN1cnJlbnQgY29udGV4dC4iIFwKKwkicHJpbnQgbG9jYWx2YWwzLCBmaXJzdCBuZXN0ZWQgc2NvcGUiCisKKyAgICAjIFRoaXMgdGVzdCB3aWxsIG9ubHkgZmFpbCBpZiB0aGUgZmlsZSB3YXMgY29tcGlsZWQgYnkgZ2NjLCBidXQKKyAgICAjIHRoZXJlJ3Mgbm8gd2F5IHRvIGNoZWNrIHRoYXQuCisgICAgc2V0dXBfeGZhaWwgImEyOWstKi11ZGkiIDI0MjMKKyAgICBpZiBbZ2RiX3Rlc3QgImNvbnQiICJCcmVhay4qIG1hcmtlcjQuKmF0IC4qOiRkZWNpbWFsLioiIFwKKwkiY29udGludWUgdG8gbWFya2VyNCBpbiBzY29wZS5leHAiXSB0aGVuIHsgZ2RiX3N1cHByZXNzX3Rlc3RzIH0KKyAgICBpZiBbZ2RiX3Rlc3QgInVwIiAiIiAidXAgZnJvbSBtYXJrZXI0IGluIHNjb3BlLmV4cCJdIHRoZW4geyBnZGJfc3VwcHJlc3NfdGVzdHMgfQorCisgICAgZ2RiX3Rlc3QgInByaW50IGxvY2FsdmFsIiAiID0gMzAiICJwcmludCBsb2NhbHZhbCwgaW5uZXJtb3N0IHNjb3BlIgorICAgIGdkYl90ZXN0ICJwcmludCBsb2NhbHZhbDEiICIgPSAxMSIgInByaW50IGxvY2FsdmFsMSwgaW5uZXJtb3N0IHNjb3BlIgorICAgIGdkYl90ZXN0ICJwcmludCBsb2NhbHZhbDIiICIgPSAxMiIgInByaW50IGxvY2FsdmFsMiwgaW5uZXJtb3N0IHNjb3BlIgorICAgIGdkYl90ZXN0ICJwcmludCBsb2NhbHZhbDMiICIgPSAxMyIgInByaW50IGxvY2FsdmFsMywgaW5uZXJtb3N0IHNjb3BlIgorICAgIGdkYl9zdG9wX3N1cHByZXNzaW5nX3Rlc3RzOworfQorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCitpZiBbaXN0YXJnZXQgIiotKi12eHdvcmtzKiJdIHsKKyAgICBzZXQgdGltZW91dCAxMjAKKyAgICB2ZXJib3NlICJUaW1lb3V0IGlzIG5vdyAkdGltZW91dCBzZWNvbmRzIiAyCit9CisKKyMgVGVzdCB0aGF0IHZhcmlhYmxlcyBpbiB2YXJpb3VzIHNlZ21lbnRzIHByaW50IG91dCBjb3JyZWN0bHkgYmVmb3JlCisjIHRoZSBwcm9ncmFtIGlzIHJ1bi4gIAorCisjIEFJWC0tc2VjdGlvbnMgZ2V0IG1hcHBlZCB0byB0aGUgc2FtZSBhZGRyZXNzIHNvIHdlIGNhbid0IGdldCB0aGUgcmlnaHQgb25lLgorc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiCitzZXR1cF94ZmFpbCAicG93ZXJwYy0qLSoiCisKK2dkYl90ZXN0ICJwcmludCAnc2NvcGUwLmMnOjpmaWxlbG9jYWxfcm8iICI9IDIwMSIKKworIyBnZGIgY3VycmVudGx5IGNhbm5vdCBhY2Nlc3MgYnNzIG1lbW9yeSBvbiBzb21lIHRhcmdldHMgaWYgdGhlIGluZmVyaW9yCisjIGlzIG5vdCBydW5uaW5nLgorIworIyBGb3IgUEEgYm9hcmRzIHVzaW5nIG1vbml0b3IvcmVtb3RlLXBhLmMsIHRoZSBic3MgdGVzdCBpcyBnb2luZyB0byAKKyMgcmFuZG9tbHkgZmFpbC4gIFdlJ3ZlIGFscmVhZHkgcHV0IHJlbW90ZS1wYSBvbiB0aGUgdGFyZ2V0IHN0YWNrLAorIyBzbyB3ZSBhY3R1YWxseSByZWFkIG1lbW9yeSBmcm9tIHRoZSBib2FyZC4gIFByb2JsZW0gaXMgY3J0MC5vCisjIGlzIHJlc3BvbnNpYmxlIGZvciBjbGVhcmluZyBic3MgYW5kIHRoYXQgaGFzbnQnIGhhcHBlbmVkIHlldC4KKyMKKyMgVGhpcyBpcyBhIHByb2JsZW0gZm9yIGFsbCBub24tbmF0aXZlIHRhcmdldHMuIC0tIG1hbnNvbgoraWYgIVtpc25hdGl2ZV0geworICAgIHVuc3VwcG9ydGVkICJwcmludCAnc2NvcGUwLmMnOjpmaWxlbG9jYWxfYnNzIGJlZm9yZSBydW4iCit9IGVsc2UgeworICAgIGdkYl90ZXN0ICJwcmludCAnc2NvcGUwLmMnOjpmaWxlbG9jYWxfYnNzIiAiPSAwIiBcCisJInByaW50ICdzY29wZTAuYyc6OmZpbGVsb2NhbF9ic3MgYmVmb3JlIHJ1biIKK30KKworZ2RiX3Rlc3QgInByaW50ICdzY29wZTAuYyc6OmZpbGVsb2NhbCIgIj0gMSIgXAorICAgICJwcmludCAnc2NvcGUwLmMnOjpmaWxlbG9jYWwgYmVmb3JlIHJ1biIKKworaWYgW3J1bnRvX21haW5dIHRoZW4geyB0ZXN0X2F0X21haW4gfQoraWYgW2lzdGFyZ2V0ICJtaXBzLWlkdC0qIl0gdGhlbiB7CisgICAgIyBSZXN0YXJ0IGJlY2F1c2UgSURUL1NJTSBydW5zIG91dCBvZiBmaWxlIGRlc2NyaXB0b3JzLgorICAgIGdkYl9leGl0CisgICAgZ2RiX3N0YXJ0CisgICAgZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisgICAgZ2RiX2xvYWQgJHtiaW5maWxlfQorfQoraWYgW3J1bnRvIGZvb10gdGhlbiB7IHRlc3RfYXRfZm9vIH0KK2lmIFtpc3RhcmdldCAibWlwcy1pZHQtKiJdIHRoZW4geworICAgICMgUmVzdGFydCBiZWNhdXNlIElEVC9TSU0gcnVucyBvdXQgb2YgZmlsZSBkZXNjcmlwdG9ycy4KKyAgICBnZGJfZXhpdAorICAgIGdkYl9zdGFydAorICAgIGdkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorICAgIGdkYl9sb2FkICR7YmluZmlsZX0KK30KK2lmIFtydW50byBiYXJdIHRoZW4geyB0ZXN0X2F0X2JhciB9CitpZiBbaXN0YXJnZXQgIm1pcHMtaWR0LSoiXSB0aGVuIHsKKyAgICAjIFJlc3RhcnQgYmVjYXVzZSBJRFQvU0lNIHJ1bnMgb3V0IG9mIGZpbGUgZGVzY3JpcHRvcnMuCisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKyAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKyAgICBnZGJfbG9hZCAke2JpbmZpbGV9Cit9CitpZiBbcnVudG8gbG9jYWxzY29wZXNdIHRoZW4geyB0ZXN0X2F0X2xvY2Fsc2NvcGVzIH0KK2lmIFtpc3RhcmdldCAibWlwcy1pZHQtKiJdIHRoZW4geworICAgICMgUmVzdGFydCBiZWNhdXNlIElEVC9TSU0gcnVucyBvdXQgb2YgZmlsZSBkZXNjcmlwdG9ycy4KKyAgICBnZGJfZXhpdAorICAgIGdkYl9zdGFydAorICAgIGdkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorICAgIGdkYl9sb2FkICR7YmluZmlsZX0KK30KK2lmIFtydW50byBhdXRvdmFyc10gdGhlbiB7IHRlc3RfYXRfYXV0b3ZhcnMgfQorCitpZiBbaXN0YXJnZXQgIiotKi12eHdvcmtzKiJdIHsKKyAgICBzZXQgdGltZW91dCAxMjAKKyAgICB2ZXJib3NlICJUaW1lb3V0IGlzIG5vdyAkdGltZW91dCBzZWNvbmRzIiAyCit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3Njb3BlMC5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zY29wZTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTFiODllCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zY29wZTAuYwpAQCAtMCwwICsxLDE3NiBAQAorc3RhdGljIGludCBmaWxlbG9jYWwgPSAxOwkvKiBJbiBEYXRhIHNlY3Rpb24gKi8KK3N0YXRpYyBpbnQgZmlsZWxvY2FsX2JzczsJLyogSW4gQlNTIHNlY3Rpb24gKi8KKyNpZm5kZWYgX19TVERDX18KKyNkZWZpbmUJY29uc3QJLyoqLworI2VuZGlmCitzdGF0aWMgY29uc3QgaW50IGZpbGVsb2NhbF9ybyA9IDIwMTsJLyogSW4gUmVhZC1Pbmx5IERhdGEgc2VjdGlvbiAqLworCittYWluICgpCit7CisjaWZkZWYgdXNlc3R1YnMKKyAgc2V0X2RlYnVnX3RyYXBzKCk7CisgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICBpbml0MCAoKTsKKyAgZm9vICgpOworICBhdXRvdmFycyAoNSwgNik7CisgIGxvY2Fsc2NvcGVzICgwKTsKK30KKworLyogT24gc29tZSBzeXN0ZW1zLCBzdWNoIGFzIEFJWCwgdW5yZWZlcmVuY2VkIHZhcmlhYmxlcyBhcmUgZGVsZXRlZAorICAgZnJvbSB0aGUgZXhlY3V0YWJsZS4gICovCit1c2VzdGF0aWNzICgpCit7CisgIHVzZWl0IChmaWxlbG9jYWwpOworICB1c2VpdCAoZmlsZWxvY2FsX2Jzcyk7CisgIHVzZWl0IChmaWxlbG9jYWxfcm8pOworfQorCitpbml0MCAoKQoreworICBmaWxlbG9jYWxfYnNzID0gMTAxOworICBpbml0MSAoKTsKK30KKworLyogVGhpcyBpcyB0byBkZXJhaWwgb3B0aW1pemVyIGluIGxvY2Fsc2NvcGVzLgorICAgUmV0dXJuIDEgKyAyICsgLiAuIC4gKyBOLiAgKi8KK2ludAorc3VtX3VwdG8gKG4pCisgICAgIGludCBuOworeworICBpbnQgaTsKKyAgaW50IHJldHZhbCA9IDA7CisKKyAgZm9yIChpID0gMTsgaSA8PSBuOyArK2kpCisgICAgcmV0dmFsICs9IGk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK2ludAordXNlaXQgKHZhbCkKK3sKKyAgICBzdGF0aWMgaW50IHVzZWR2YWw7CisKKyAgICB1c2VkdmFsID0gdmFsOworICAgIHJldHVybiB2YWwgKyBzdW1fdXB0byAoMCk7Cit9CisKK2ludAorYXV0b3ZhcnMgKGJjZCwgYWJjKQorICAgICBpbnQgYmNkOworICAgICBpbnQgYWJjOworeworICAgIGludCAgaTAgPSAgdXNlaXQgKDApLCAgaTEgPSAgdXNlaXQgKDEpLCAgaTIgPSAgdXNlaXQgKDIpOworICAgIGludCAgaTMgPSAgdXNlaXQgKDMpLCAgaTQgPSAgdXNlaXQgKDQpLCAgaTUgPSAgdXNlaXQgKDUpOworICAgIGludCAgaTYgPSAgdXNlaXQgKDYpLCAgaTcgPSAgdXNlaXQgKDcpLCAgaTggPSAgdXNlaXQgKDgpOworICAgIGludCAgaTkgPSAgdXNlaXQgKDkpLCBpMTAgPSB1c2VpdCAoMTApLCBpMTEgPSB1c2VpdCAoMTEpOworICAgIGludCBpMTIgPSB1c2VpdCAoMTIpLCBpMTMgPSB1c2VpdCAoMTMpLCBpMTQgPSB1c2VpdCAoMTQpOworICAgIGludCBpMTUgPSB1c2VpdCAoMTUpLCBpMTYgPSB1c2VpdCAoMTYpLCBpMTcgPSB1c2VpdCAoMTcpOworICAgIGludCBpMTggPSB1c2VpdCAoMTgpLCBpMTkgPSB1c2VpdCAoMTkpLCBpMjAgPSB1c2VpdCAoMjApOworICAgIGludCBpMjEgPSB1c2VpdCAoMjEpLCBpMjIgPSB1c2VpdCAoMjIpLCBpMjMgPSB1c2VpdCAoMjMpOworICAgIGludCBpMjQgPSB1c2VpdCAoMjQpLCBpMjUgPSB1c2VpdCAoMjUpLCBpMjYgPSB1c2VpdCAoMjYpOworICAgIGludCBpMjcgPSB1c2VpdCAoMjcpLCBpMjggPSB1c2VpdCAoMjgpLCBpMjkgPSB1c2VpdCAoMjkpOworICAgIGludCBpMzAgPSB1c2VpdCAoMzApLCBpMzEgPSB1c2VpdCAoMzEpLCBpMzIgPSB1c2VpdCAoMzIpOworICAgIGludCBpMzMgPSB1c2VpdCAoMzMpLCBpMzQgPSB1c2VpdCAoMzQpLCBpMzUgPSB1c2VpdCAoMzUpOworICAgIGludCBpMzYgPSB1c2VpdCAoMzYpLCBpMzcgPSB1c2VpdCAoMzcpLCBpMzggPSB1c2VpdCAoMzgpOworICAgIGludCBpMzkgPSB1c2VpdCAoMzkpLCBpNDAgPSB1c2VpdCAoNDApLCBpNDEgPSB1c2VpdCAoNDEpOworICAgIGludCBpNDIgPSB1c2VpdCAoNDIpLCBpNDMgPSB1c2VpdCAoNDMpLCBpNDQgPSB1c2VpdCAoNDQpOworICAgIGludCBpNDUgPSB1c2VpdCAoNDUpLCBpNDYgPSB1c2VpdCAoNDYpLCBpNDcgPSB1c2VpdCAoNDcpOworICAgIGludCBpNDggPSB1c2VpdCAoNDgpLCBpNDkgPSB1c2VpdCAoNDkpLCBpNTAgPSB1c2VpdCAoNTApOworICAgIGludCBpNTEgPSB1c2VpdCAoNTEpLCBpNTIgPSB1c2VpdCAoNTIpLCBpNTMgPSB1c2VpdCAoNTMpOworICAgIGludCBpNTQgPSB1c2VpdCAoNTQpLCBpNTUgPSB1c2VpdCAoNTUpLCBpNTYgPSB1c2VpdCAoNTYpOworICAgIGludCBpNTcgPSB1c2VpdCAoNTcpLCBpNTggPSB1c2VpdCAoNTgpLCBpNTkgPSB1c2VpdCAoNTkpOworICAgIGludCBpNjAgPSB1c2VpdCAoNjApLCBpNjEgPSB1c2VpdCAoNjEpLCBpNjIgPSB1c2VpdCAoNjIpOworICAgIGludCBpNjMgPSB1c2VpdCAoNjMpLCBpNjQgPSB1c2VpdCAoNjQpLCBpNjUgPSB1c2VpdCAoNjUpOworICAgIGludCBpNjYgPSB1c2VpdCAoNjYpLCBpNjcgPSB1c2VpdCAoNjcpLCBpNjggPSB1c2VpdCAoNjgpOworICAgIGludCBpNjkgPSB1c2VpdCAoNjkpLCBpNzAgPSB1c2VpdCAoNzApLCBpNzEgPSB1c2VpdCAoNzEpOworICAgIGludCBpNzIgPSB1c2VpdCAoNzIpLCBpNzMgPSB1c2VpdCAoNzMpLCBpNzQgPSB1c2VpdCAoNzQpOworICAgIGludCBpNzUgPSB1c2VpdCAoNzUpLCBpNzYgPSB1c2VpdCAoNzYpLCBpNzcgPSB1c2VpdCAoNzcpOworICAgIGludCBpNzggPSB1c2VpdCAoNzgpLCBpNzkgPSB1c2VpdCAoNzkpLCBpODAgPSB1c2VpdCAoODApOworICAgIGludCBpODEgPSB1c2VpdCAoODEpLCBpODIgPSB1c2VpdCAoODIpLCBpODMgPSB1c2VpdCAoODMpOworICAgIGludCBpODQgPSB1c2VpdCAoODQpLCBpODUgPSB1c2VpdCAoODUpLCBpODYgPSB1c2VpdCAoODYpOworICAgIGludCBpODcgPSB1c2VpdCAoODcpLCBpODggPSB1c2VpdCAoODgpLCBpODkgPSB1c2VpdCAoODkpOworICAgIGludCBpOTAgPSB1c2VpdCAoOTApLCBpOTEgPSB1c2VpdCAoOTEpLCBpOTIgPSB1c2VpdCAoOTIpOworICAgIGludCBpOTMgPSB1c2VpdCAoOTMpLCBpOTQgPSB1c2VpdCAoOTQpLCBpOTUgPSB1c2VpdCAoOTUpOworICAgIGludCBpOTYgPSB1c2VpdCAoOTYpLCBpOTcgPSB1c2VpdCAoOTcpLCBpOTggPSB1c2VpdCAoOTgpOworICAgIGludCBpOTkgPSB1c2VpdCAoOTkpOworCisgICAgLyogVXNlIGFsbCAxMDAgb2YgdGhlIGxvY2FsIHZhcmlhYmxlcyB0byBkZXJhaWwgYWdyZXNzaXZlIG9wdGltaXplcnMuICAqLworCisgICAgdXNlaXQgKCBpMCk7IHVzZWl0ICggaTEpOyB1c2VpdCAoIGkyKTsgdXNlaXQgKCBpMyk7IHVzZWl0ICggaTQpOworICAgIHVzZWl0ICggaTUpOyB1c2VpdCAoIGk2KTsgdXNlaXQgKCBpNyk7IHVzZWl0ICggaTgpOyB1c2VpdCAoIGk5KTsKKyAgICB1c2VpdCAoaTEwKTsgdXNlaXQgKGkxMSk7IHVzZWl0IChpMTIpOyB1c2VpdCAoaTEzKTsgdXNlaXQgKGkxNCk7CisgICAgdXNlaXQgKGkxNSk7IHVzZWl0IChpMTYpOyB1c2VpdCAoaTE3KTsgdXNlaXQgKGkxOCk7IHVzZWl0IChpMTkpOworICAgIHVzZWl0IChpMjApOyB1c2VpdCAoaTIxKTsgdXNlaXQgKGkyMik7IHVzZWl0IChpMjMpOyB1c2VpdCAoaTI0KTsKKyAgICB1c2VpdCAoaTI1KTsgdXNlaXQgKGkyNik7IHVzZWl0IChpMjcpOyB1c2VpdCAoaTI4KTsgdXNlaXQgKGkyOSk7CisgICAgdXNlaXQgKGkzMCk7IHVzZWl0IChpMzEpOyB1c2VpdCAoaTMyKTsgdXNlaXQgKGkzMyk7IHVzZWl0IChpMzQpOworICAgIHVzZWl0IChpMzUpOyB1c2VpdCAoaTM2KTsgdXNlaXQgKGkzNyk7IHVzZWl0IChpMzgpOyB1c2VpdCAoaTM5KTsKKyAgICB1c2VpdCAoaTQwKTsgdXNlaXQgKGk0MSk7IHVzZWl0IChpNDIpOyB1c2VpdCAoaTQzKTsgdXNlaXQgKGk0NCk7CisgICAgdXNlaXQgKGk0NSk7IHVzZWl0IChpNDYpOyB1c2VpdCAoaTQ3KTsgdXNlaXQgKGk0OCk7IHVzZWl0IChpNDkpOworICAgIHVzZWl0IChpNTApOyB1c2VpdCAoaTUxKTsgdXNlaXQgKGk1Mik7IHVzZWl0IChpNTMpOyB1c2VpdCAoaTU0KTsKKyAgICB1c2VpdCAoaTU1KTsgdXNlaXQgKGk1Nik7IHVzZWl0IChpNTcpOyB1c2VpdCAoaTU4KTsgdXNlaXQgKGk1OSk7CisgICAgdXNlaXQgKGk2MCk7IHVzZWl0IChpNjEpOyB1c2VpdCAoaTYyKTsgdXNlaXQgKGk2Myk7IHVzZWl0IChpNjQpOworICAgIHVzZWl0IChpNjUpOyB1c2VpdCAoaTY2KTsgdXNlaXQgKGk2Nyk7IHVzZWl0IChpNjgpOyB1c2VpdCAoaTY5KTsKKyAgICB1c2VpdCAoaTcwKTsgdXNlaXQgKGk3MSk7IHVzZWl0IChpNzIpOyB1c2VpdCAoaTczKTsgdXNlaXQgKGk3NCk7CisgICAgdXNlaXQgKGk3NSk7IHVzZWl0IChpNzYpOyB1c2VpdCAoaTc3KTsgdXNlaXQgKGk3OCk7IHVzZWl0IChpNzkpOworICAgIHVzZWl0IChpODApOyB1c2VpdCAoaTgxKTsgdXNlaXQgKGk4Mik7IHVzZWl0IChpODMpOyB1c2VpdCAoaTg0KTsKKyAgICB1c2VpdCAoaTg1KTsgdXNlaXQgKGk4Nik7IHVzZWl0IChpODcpOyB1c2VpdCAoaTg4KTsgdXNlaXQgKGk4OSk7CisgICAgdXNlaXQgKGk5MCk7IHVzZWl0IChpOTEpOyB1c2VpdCAoaTkyKTsgdXNlaXQgKGk5Myk7IHVzZWl0IChpOTQpOworICAgIHVzZWl0IChpOTUpOyB1c2VpdCAoaTk2KTsgdXNlaXQgKGk5Nyk7IHVzZWl0IChpOTgpOyB1c2VpdCAoaTk5KTsKKworICAgIHVzZWl0IChhYmMpOyB1c2VpdCAoYmNkKTsKKworICAgIG1hcmtlcjEgKCk7CisgICAgcmV0dXJuIGkwICsgaTEgKyBpMiArIGkzICsgaTQgKyBpNSArIGk2ICsgaTcgKyBpOCArIGk5ICsgaTEwCisgICAgICArIGkxMSArIGkxMiArIGkxMyArIGkxNCArIGkxNSArIGkxNiArIGkxNyArIGkxOCArIGkxOSArIGkyMAorICAgICAgKyBpMjEgKyBpMjIgKyBpMjMgKyBpMjQgKyBpMjUgKyBpMjYgKyBpMjcgKyBpMjggKyBpMjkgKyBpMzAKKyAgICAgICsgaTMxICsgaTMyICsgaTMzICsgaTM0ICsgaTM1ICsgaTM2ICsgaTM3ICsgaTM4ICsgaTM5ICsgaTQwCisgICAgICArIGk0MSArIGk0MiArIGk0MyArIGk0NCArIGk0NSArIGk0NiArIGk0NyArIGk0OCArIGk0OSArIGk1MAorICAgICAgKyBpNTEgKyBpNTIgKyBpNTMgKyBpNTQgKyBpNTUgKyBpNTYgKyBpNTcgKyBpNTggKyBpNTkgKyBpNjAKKyAgICAgICsgaTYxICsgaTYyICsgaTYzICsgaTY0ICsgaTY1ICsgaTY2ICsgaTY3ICsgaTY4ICsgaTY5ICsgaTcwCisgICAgICArIGk3MSArIGk3MiArIGk3MyArIGk3NCArIGk3NSArIGk3NiArIGk3NyArIGk3OCArIGk3OSArIGk4MAorICAgICAgKyBpODEgKyBpODIgKyBpODMgKyBpODQgKyBpODUgKyBpODYgKyBpODcgKyBpODggKyBpODkgKyBpOTAKKyAgICAgICsgaTkxICsgaTkyICsgaTkzICsgaTk0ICsgaTk1ICsgaTk2ICsgaTk3ICsgaTk4ICsgaTk5ICsgYWJjICsgYmNkOworfQorCitpbnQKK2xvY2Fsc2NvcGVzICh4KQorICAgICBpbnQgeDsKK3sKKyAgICBpbnQgbG9jYWx2YWw7CisgICAgaW50IHJldHZhbDsKKyAgICBpbnQgaTsKKworICAgIGxvY2FsdmFsID0gMDsKKyAgICB1c2VpdCAobG9jYWx2YWwpOworCisgICAgeworCWludCBsb2NhbHZhbCA9IHggKyA0ICsgc3VtX3VwdG8gKDMpOyAvKiAxMCAqLworCWludCBsb2NhbHZhbDEgPSB4ICsgNSArIHN1bV91cHRvICgzKTsgLyogMTEgKi8KKworCXVzZWl0IChsb2NhbHZhbCk7CisJdXNlaXQgKGxvY2FsdmFsMSk7CisJbWFya2VyMiAoKTsKKwl7CisJICAgIGludCBsb2NhbHZhbCA9IGxvY2FsdmFsMSArIDMgKyBzdW1fdXB0byAoMyk7IC8qIDIwICovCisJICAgIGludCBsb2NhbHZhbDIgPSBsb2NhbHZhbDEgKyBzdW1fdXB0byAoMSk7IC8qIDEyICovCisJICAgIHVzZWl0IChsb2NhbHZhbCk7CisJICAgIHVzZWl0IChsb2NhbHZhbDIpOworCSAgICBtYXJrZXIzICgpOworCSAgICB7CisJCWludCBsb2NhbHZhbCA9IGxvY2FsdmFsMiArIDMgKyBzdW1fdXB0byAoNSk7IC8qIDMwICovCisJCWludCBsb2NhbHZhbDMgPSBsb2NhbHZhbDIgKyBzdW1fdXB0byAoMSk7IC8qIDEzICovCisJCXVzZWl0IChsb2NhbHZhbCk7CisJCXVzZWl0IChsb2NhbHZhbDMpOworCQltYXJrZXI0ICgpOworCQlyZXR2YWwgPSB4ICsgbG9jYWx2YWwxICsgbG9jYWx2YWwyICsgbG9jYWx2YWwzOworCSAgICB9CisJfQorICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCittYXJrZXIxICgpIHt9CittYXJrZXIyICgpIHt9CittYXJrZXIzICgpIHt9CittYXJrZXI0ICgpIHt9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3Njb3BlMS5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zY29wZTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2NhZDZmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zY29wZTEuYwpAQCAtMCwwICsxLDQ1IEBACitzdGF0aWMgaW50IGZpbGVsb2NhbCA9IDI7CS8qIEluIERhdGEgc2VjdGlvbiAqLworc3RhdGljIGludCBmaWxlbG9jYWxfYnNzOwkvKiBJbiBCU1Mgc2VjdGlvbiAqLworI2lmbmRlZiBfX1NURENfXworI2RlZmluZQljb25zdAkvKiovCisjZW5kaWYKK3N0YXRpYyBjb25zdCBpbnQgZmlsZWxvY2FsX3JvID0gMjAyOwkvKiBJbiBSZWFkLU9ubHkgRGF0YSBzZWN0aW9uICovCisKK2ZvbyAoKQoreworICBzdGF0aWMgaW50IGZ1bmNsb2NhbCA9IDM7CS8qIEluIERhdGEgc2VjdGlvbiAqLworICBzdGF0aWMgaW50IGZ1bmNsb2NhbF9ic3M7CS8qIEluIEJTUyBzZWN0aW9uICovCisgIHN0YXRpYyBjb25zdCBpbnQgZnVuY2xvY2FsX3JvID0gMjAzOwkvKiBSTyBEYXRhICovCisgIHN0YXRpYyBjb25zdCBpbnQgZnVuY2xvY2FsX3JvX2JzczsJLyogUk8gRGF0YSAqLworCisgIGZ1bmNsb2NhbF9ic3MgPSAxMDM7CisgIGJhciAoKTsKK30KKworYmFyICgpCit7CisgIHN0YXRpYyBpbnQgZnVuY2xvY2FsID0gNDsJLyogSW4gZGF0YSBzZWN0aW9uICovCisgIHN0YXRpYyBpbnQgZnVuY2xvY2FsX2JzczsJLyogSW4gQlNTIHNlY3Rpb24gKi8KKyAgZnVuY2xvY2FsX2JzcyA9IDEwNDsKK30KKworaW5pdDEgKCkKK3sKKyAgZmlsZWxvY2FsX2JzcyA9IDEwMjsKK30KKworLyogT24gc29tZSBzeXN0ZW1zLCBzdWNoIGFzIEFJWCwgdW5yZWZlcmVuY2VkIHZhcmlhYmxlcyBhcmUgZGVsZXRlZAorICAgZnJvbSB0aGUgZXhlY3V0YWJsZS4gICovCit1c2VzdGF0aWNzMSAoKQoreworICB1c2VpdDEgKGZpbGVsb2NhbCk7CisgIHVzZWl0MSAoZmlsZWxvY2FsX2Jzcyk7CisgIHVzZWl0MSAoZmlsZWxvY2FsX3JvKTsKK30KKwordXNlaXQxICh2YWwpCit7CisgICAgc3RhdGljIGludCB1c2VkdmFsOworCisgICAgdXNlZHZhbCA9IHZhbDsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc2VjdC1jbWQuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zZWN0LWNtZC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdiZGUwNAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc2VjdC1jbWQuZXhwCkBAIC0wLDAgKzEsMTA5IEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorCX0KKworZ2xvYmFsIHVzZXN0dWJzCisKKyMKKyMgdGVzdCBydW5uaW5nIHByb2dyYW1zCisjCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworIyBUaGlzIHRlc3QgZXhpc3RzIHNvbGVseSB0byBleGVyY2lzZSB0aGUgInNlY3Rpb24iIGNvbW1hbmQgZm9yCisjIGNvZGUtY292ZXJhZ2Ugb24gSFAtVVguICAoU28gZmFyIGFzIEkgY2FuIHRlbGwsIHRoZSAic2VjdGlvbiIKKyMgY29tbWFuZCBpc24ndCBuZWVkZWQgb24gSFAtVVgsIGJ1dCBwcm9iYWJseSBpcyBmb3IgZW1iZWRkZWQKKyMgYXBwcy4pCisjCitpZiAhW2lzdGFyZ2V0ICJocHBhKi0qLWhwdXgqIl0gdGhlbiB7CisgIHJldHVybgorfQorCitzZXQgdGVzdGZpbGUgImJyZWFrIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQoraWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7IGZhaWwgInNlY3Rpb24gY29tbWFuZCB0ZXN0cyBzdXBwcmVzc2VkIiB9CisKKyMgR2V0IHRoZSAkQ09ERSQgc2VjdGlvbidzIHN0YXJ0aW5nIGFkZHJlc3MuCisjCisjIChOb3RlIHRoYXQgdGhpcyB3b3JrcyBmb3IgUEEzMiBwcm9ncmFtcywgd2hpY2ggdXNlIHRoZSBTT00gZmlsZQorIyBmb3JtYXQuICBQQTY0IHVzZXMgRUxGLCBhbmQgd2hlbiBzdXBwb3J0IGZvciB0aGF0IGlzIGFkZGVkLCBpdCdzCisjIG5vdCBjbGVhciB0aGF0IHRoZXJlJ2xsIGJlIGEgc2VjdGlvbiBuYW1lZCAiJENPREUkIiBpbiBzdWNoCisjIHByb2dyYW1zLikKKyMKK3NlbmRfZ2RiICJpbmZvIGZpbGVzXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICIuKigweFxbMC05YS1mQS1GXF0qKSAtICgweFxbMC05YS1mQS1GXF0qKSBpcyAuQ09ERS4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJpbmZvIGZpbGVzIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiaW5mbyBmaWxlcyJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBpbmZvIGZpbGVzIn0KK30KKworIyBSZXNldCB0aGUgc2VjdGlvbiB0byB0aGF0IHNhbWUgc3RhcnRpbmcgYWRkcmVzcywgd2hpY2ggc2hvdWxkIGJlCisjIGhhcm1sZXNzIChpLmUuLCB3ZSBqdXN0IHdhbnQgdG8gZXhlcmNpc2UgdGhlIHNlY3Rpb24gY29tbWFuZCkuCisjCitzZW5kX2dkYiAic2VjdGlvbiBcJENPREVcJCAkZXhwZWN0X291dCgxLHN0cmluZylcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIi4qJGV4cGVjdF9vdXQoMSxzdHJpbmcpIFwtICRleHBlY3Rfb3V0KDIsc3RyaW5nKSBpcyAuQ09ERS4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzZXQgc2VjdGlvbiBjb21tYW5kIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAic2V0IHNlY3Rpb24gY29tbWFuZCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZXQgc2VjdGlvbiBjb21tYW5kIn0KK30KKworIyBWZXJpZnkgdGhhdCBHREIgcmVzcG9uZHMgZ3JhY2VmdWxseSB0byBhIG5vbi1leGlzdGVudCBzZWN0aW9uIG5hbWUuCisjCitzZW5kX2dkYiAic2VjdGlvbiBGT09CQVJCQVogMHgxMjM0XG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJTZWN0aW9uIEZPT0JBUkJBWiBub3QgZm91bmRcclxuJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgIm5vbi1leGlzdGVudCBzZWN0aW9uIGRpc2FsbG93ZWQifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJub24tZXhpc3RlbnQgc2VjdGlvbiBkaXNhbGxvd2VkIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIG5vbi1leGlzdGVudCBzZWN0aW9uIGRpc2FsbG93ZWQifQorfQorCisjIFdlICJoYXBwZW4gdG8ga25vdyIgdGhhdCBHREIgdXNlcyBhIGZpeGVkIHNpemUgY2hhcmFjdGVyIGJ1ZmZlciB0bworIyBwYXJzZSB0aGUgc2VjdGlvbiBuYW1lIGludG8sIGFuZCB0aGUgYnVmZmVyIGlzIGRlY2xhcmVkIHRvIGJlIDEwMAorIyBjaGFyYWN0ZXJzIGluIGxlbmd0aC4gIFZlcmlmeSB0aGF0IEdEQiBncmFjZWZ1bGx5IGhhbmRsZXMgc2VjdGlvbgorIyBuYW1lcyBsb25nZXIgdGhhbiB0aGF0LiAgKFRoZSBzZWN0aW9uIGlzIGFsc28gbm9uLWV4aXN0ZW50LikKKyMKK3NlbmRfZ2RiICJzZWN0aW9uIEEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjMgMHgxMjM0XG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJTZWN0aW9uIEEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSBub3QgZm91bmRcclxuJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgIm5vbi1leGlzdGVudCB0b28tbG9uZyBzZWN0aW9uIGRpc2FsbG93ZWQifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJub24tZXhpc3RlbnQgdG9vLWxvbmcgc2VjdGlvbiBkaXNhbGxvd2VkIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIG5vbi1leGlzdGVudCB0b28tbG9uZyBzZWN0aW9uIGRpc2FsbG93ZWQifQorfQorCitnZGJfZXhpdAorcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc2V0c2hvdy5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zZXRzaG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0ZTdhOQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc2V0c2hvdy5jCkBAIC0wLDAgKzEsMjIgQEAKKy8qIElNUE9SVEFOVDogbGVhdmUgdGhpcyBjb21tZW50IGluIHRoZSBmaXJzdCBsaW5lIG9mIHRoaXMgc291cmNlIGZpbGUuICovCisvKiAgICAgICAgICAgIHRoaXMgd2lsbCBndWFyYW50ZWUgdGhhdCBsaW5lIDEgY29udGFpbnMgbm8gY29kZS4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCAKK21haW4oYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKiphcmd2OworeworICBpbnQgaSA9IDE7CisjaWZkZWYgdXNlc3R1YnMKKyAgc2V0X2RlYnVnX3RyYXBzKCk7CisgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorCisgIGlmIChhcmdjIDw9IDAgfHwgYXJnYyA+IDgpCisgICAgcmV0dXJuIC0xOworICB3aGlsZSAoaSA8IGFyZ2MpCisgICAgcHJpbnRmICgiJXMgIiwgYXJndltpKytdKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NldHNob3cuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zZXRzaG93LmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2MyZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zZXRzaG93LmV4cApAQCAtMCwwICsxLDI0MyBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IE1pY2hhZWwgU255ZGVyIChtc255ZGVyQGN5Z251cy5jb20pCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJzZXRzaG93Igorc2V0IHNyY2ZpbGUgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CitpZiB7IFtnZGJfY29tcGlsZSAke3NyY2ZpbGV9ICR7YmluZmlsZX0gZXhlY3V0YWJsZSB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworIyBtYWtlIHN1cmUgJHBjIGlzIHNhbmUsIGluIGNhc2Ugd2UncmUgdGFsa2luZyB0byBhIGJvYXJkLgoraWYgeyAhW3J1bnRvX21haW5dIH0geworICAgIGdkYl9zdXBwcmVzc190ZXN0czsKK30KKworIworIyBUZXN0IGdkYiBzZXQgYW5kIHNob3cgY29tbWFuZHMuCisjIEFkZCB0ZXN0cyBoZXJlIGZvciBzaG93IGFuZCBzZXQgdGhhdCBkb24ndCBmaXQgbmVhdGx5IGVsc2V3aGVyZS4KKyMgRklYTUU6IG1hbnkgcnVkaW1lbnRhcnkgdGVzdHMgZm9yIHNldCBhbmQgc2hvdyBjb21tYW5kcyBoYXZlIGJlZW4KKyMgICAgICAgIGFkZGVkIGJlbG93LCBidXQgbW9zdCBkbyBub3RoaW5nIG1vcmUgdGhhbiBjaGVjayB0aGF0IGEgCisjICAgICAgICB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgc3VjY2Vzc2Z1bGx5LCBpZS4gdGhleSBkbyBub3QgdGVzdAorIyAgICAgICAgd2hldGhlciBzZXR0aW5nIHRoZSB2YXJpYWJsZSBoYXMgaGFkIHRoZSBkZXNpcmVkIGVmZmVjdC4KKyMKKworI3Rlc3QgZGVmYXVsdCBhbm5vdGF0aW9uX2xldmVsIGlzIDAKK2dkYl90ZXN0ICJzaG93IGFubm90YXRlIiAiQW5ub3RhdGlvbl9sZXZlbCBpcyAwLi4qIiAgImRlZmF1bHQgYW5ub3RhdGlvbl9sZXZlbCBpcyB6ZXJvIgorCisjdGVzdCBzZXQgYW5ub3RhdGUgMgorc2VuZF9nZGIgInNldCBhbm5vdGF0ZSAyXG4iCitnZGJfZXhwZWN0IHsKKwktcmUgIi4qXDAzMlwwMzJwcmUtcHJvbXB0LiokZ2RiX3Byb21wdCAuKlwwMzJcMDMycHJvbXB0LiokIiBcCisJCQkJeyBwYXNzICJzZXQgYW5ub3RhdGUgMiIgfQorIAktcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJzZXQgYW5ub3RhdGUgMiIgfQorCXRpbWVvdXQJCQl7IGZhaWwgIih0aW1lb3V0KSBzZXQgYW5ub3RhdGUgMiIgfQorICAgIH0KKworc2VuZF9nZGIgInNob3cgYW5ub3RhdGVcbiIKK2dkYl9leHBlY3QgeworCS1yZSAiLipcMDMyXDAzMnBvc3QtcHJvbXB0LipBbm5vdGF0aW9uX2xldmVsIGlzIDIuLipcMDMyXDAzMnByZS1wcm9tcHQuKiRnZGJfcHJvbXB0IC4qXDAzMlwwMzJwcm9tcHQuKiQiIFwKKwkJCQl7IHBhc3MgInNob3cgYW5ub3RhdGUgKDIpIiB9CisgCS1yZSAiLiokZ2RiX3Byb21wdCAkIgl7IGZhaWwgInNob3cgYW5ub3RhdGUgKDIpIiB9CisJdGltZW91dAkJCXsgZmFpbCAiKHRpbWVvdXQpIHNob3cgYW5ub3RhdGUgKDIpIiB9CisgICAgfQorCisjdGVzdCBhbm5vdGF0aW9uX2xldmVsIDIKK3NlbmRfZ2RiICJpbmZvIGxpbmUgMVxuIgorZ2RiX2V4cGVjdCB7CisJLXJlICIuKlwwMzJcMDMycG9zdC1wcm9tcHQuKkxpbmUgMSBvZiAuKiBpcyBhdCBhZGRyZXNzIC4qIGJ1dCBjb250YWlucyBubyBjb2RlLio6MTowOmJlZzoweC4qXDAzMlwwMzJwcmUtcHJvbXB0LiokZ2RiX3Byb21wdCAuKlwwMzJcMDMycHJvbXB0LiokIiBcCisJCQkJeyBwYXNzICJhbm5vdGF0aW9uX2xldmVsIDIiIH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJhbm5vdGF0aW9uX2xldmVsIDIiIH0KKwl0aW1lb3V0CQkJeyBmYWlsICIodGltZW91dCkgYW5ub3RhdGlvbl9sZXZlbCAyIiB9CisgICAgfQorCisjdGVzdCBzZXQgYW5ub3RhdGUgMQorZ2RiX3Rlc3QgInNldCBhbm5vdGF0ZSAxIiAiLipwb3N0LXByb21wdC4qIiAgInNldCBhbm5vdGF0ZSAxIiAKK2dkYl90ZXN0ICJzaG93IGFubm90YXRlIiAiQW5ub3RhdGlvbl9sZXZlbCBpcyAxLi4qIiAgInNob3cgYW5ub3RhdGUgKDEpIiAKKyN0ZXN0IGFubm90YXRpb25fbGV2ZWwgMQorZ2RiX3Rlc3QgImluZm8gbGluZSAxIiAiTGluZSAxIG9mIC4qIGlzIGF0IGFkZHJlc3MgLiogYnV0IGNvbnRhaW5zIG5vIGNvZGUuKjoxOjA6YmVnOjB4LioiICAiYW5ub3RhdGlvbl9sZXZlbCAxIiAKKyN0ZXN0IHNldCBhbm5vdGF0ZSAwCitnZGJfdGVzdCAic2V0IGFubm90YXRlIDAiICIiICJzZXQgYW5ub3RhdGUgMCIgCitnZGJfdGVzdCAic2hvdyBhbm5vdGF0ZSIgIkFubm90YXRpb25fbGV2ZWwgaXMgMC4uKiIgICJzaG93IGFubm90YXRlICgwKSIgCisjdGVzdCBhbm5vdGF0aW9uX2xldmVsIDAKK2dkYl90ZXN0ICJpbmZvIGxpbmUgMSIgIkxpbmUgMSBvZiAuKiBpcyBhdCBhZGRyZXNzIC4qIGJ1dCBjb250YWlucyBubyBjb2RlLioiICAiYW5ub3RhdGlvbl9sZXZlbCAwIiAKKyN0ZXN0IHNldCBhcmdzCitnZGJfdGVzdCAic2V0IGFyZ3MgZm9vIGJhciBibHVwIGJheiBidWJibGUiICIiICJzZXQgYXJncyIgCisjdGVzdCBzaG93IGFyZ3MKK2dkYl90ZXN0ICJzaG93IGFyZ3MiICJBcmd1bWVudCBsaXN0IHRvIGdpdmUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZCB3aGVuIGl0IGlzIHN0YXJ0ZWQgaXMgXCJmb28gYmFyIGJsdXAgYmF6IGJ1YmJsZVwiLi4qIiAic2hvdyBhcmdzIgorCisjIERvbid0IHRlc3QgaWYgd2UgY2FuJ3QgcGFzcyBhcmdzIG9yIGlmIHdlJ3JlIHVzaW5nIGEgc3R1Yi4KK2lmIHsgIVt0YXJnZXRfaW5mbyBleGlzdHMgdXNlX2dkYl9zdHViXSAmJiAhW3RhcmdldF9pbmZvIGV4aXN0cyBub2FyZ3NdIH0geworICAgICN0ZXN0IHBhc3NpbmcgYXJncworICAgIGdkYl90ZXN0ICJjb250IiAiQ29udGludWluZy4qIiAiY29udGludWluZyIKKyAgICBkZWxldGVfYnJlYWtwb2ludHMKKyAgICBnZGJfdGVzdCAicnVuIiAiU3RhcnRpbmcgcHJvZ3JhbTouKmZvbyBiYXIgYmx1cCBiYXogYnViYmxlLioiICJwYXNzaW5nIGFyZ3MiCit9CisjdGVzdCBzZXQgY2hlY2sgcmFuZ2Ugb24KK2dkYl90ZXN0ICJzZXQgY2hlY2sgcmFuZ2Ugb24iICIiICJzZXQgY2hlY2sgcmFuZ2Ugb24iIAorI3Rlc3Qgc2hvdyBjaGVjayByYW5nZSBvbgorZ2RiX3Rlc3QgInNob3cgY2hlY2sgcmFuZ2UiICJSYW5nZSBjaGVja2luZyBpcyBcIm9uXCJcLi4qIiAic2hvdyBjaGVjayByYW5nZSAob24pIiAKKyN0ZXN0IHNldCBjaGVjayByYW5nZSBhdXRvCitnZGJfdGVzdCAic2V0IGNoZWNrIHJhbmdlIGF1dG8iICIiICJzZXQgY2hlY2sgcmFuZ2UgYXV0byIgCisjdGVzdCBzaG93IGNoZWNrIHJhbmdlIGF1dG8KK2dkYl90ZXN0ICJzaG93IGNoZWNrIHJhbmdlIiAiUmFuZ2UgY2hlY2tpbmcgaXMgXCJhdXRvOyBjdXJyZW50bHkgLioiICJzaG93IGNoZWNrIHJhbmdlIChhdXRvKSIgCisjdGVzdCBzZXQgY2hlY2sgdHlwZSBvbgorZ2RiX3Rlc3QgInNldCBjaGVjayB0eXBlIG9uIiAiIiAic2V0IGNoZWNrIHR5cGUgb24iIAorI3Rlc3Qgc2hvdyBjaGVjayB0eXBlIG9uCitnZGJfdGVzdCAic2hvdyBjaGVjayB0eXBlIiAiVHlwZSBjaGVja2luZyBpcyBcIm9uXCIuLioiICJzaG93IGNoZWNrIHR5cGUgKG9uKSIgCisjdGVzdCBzZXQgY2hlY2sgdHlwZSBhdXRvCitnZGJfdGVzdCAic2V0IGNoZWNrIHR5cGUgYXV0byIgIiIgInNldCBjaGVjayB0eXBlIGF1dG8iIAorI3Rlc3Qgc2hvdyBjaGVjayB0eXBlCitnZGJfdGVzdCAic2hvdyBjaGVjayB0eXBlIiAiVHlwZSBjaGVja2luZyBpcyBcImF1dG87IGN1cnJlbnRseSAuKiIgInNob3cgY2hlY2sgdHlwZSAoYXV0bykiIAorI3Rlc3Qgc2V0IGNvbXBsYWludHMgMTAwCitnZGJfdGVzdCAic2V0IGNvbXBsYWludHMgMTAwIiAiIiAic2V0IGNvbXBsYWludHMgMTAwIiAKKyN0ZXN0IHNob3cgY29tcGxhaW50cyAxMDAKK2dkYl90ZXN0ICJzaG93IGNvbXBsYWludHMiICJNYXggbnVtYmVyIG9mIGNvbXBsYWludHMgYWJvdXQgaW5jb3JyZWN0IHN5bWJvbHMgaXMgMTAwLi4qIiAic2hvdyBjb21wbGFpbnRzICgxMDApIiAKKyN0ZXN0IHNldCBjb21wbGFpbnRzIDAKK2dkYl90ZXN0ICJzZXQgY29tcGxhaW50cyAwIiAiIiAic2V0IGNvbXBsYWludHMgMCIgCisjdGVzdCBzaG93IGNvbXBsYWludHMgMAorZ2RiX3Rlc3QgInNob3cgY29tcGxhaW50cyIgIk1heCBudW1iZXIgb2YgY29tcGxhaW50cyBhYm91dCBpbmNvcnJlY3Qgc3ltYm9scyBpcyAwLi4qIiAic2hvdyBjb21wbGFpbnRzICgwKSIgCisjdGVzdCBzZXQgY29uZmlybSBvZmYKK2dkYl90ZXN0ICJzZXQgY29uZmlybSBvZmYiICIiICJzZXQgY29uZmlybSBvZmYiIAorI3Rlc3Qgc2hvdyBjb25maXJtIG9mZgorZ2RiX3Rlc3QgInNob3cgY29uZmlybSIgIldoZXRoZXIgdG8gY29uZmlybSBwb3RlbnRpYWxseSBkYW5nZXJvdXMgb3BlcmF0aW9ucyBpcyBvZmYuLioiICJzaG93IGNvbmZpcm0gKG9mZikiIAorI3Rlc3Qgc2V0IGNvbmZpcm0gb24KK2dkYl90ZXN0ICJzZXQgY29uZmlybSBvbiIgIiIgInNldCBjb25maXJtIG9uIiAKKyN0ZXN0IHNob3cgY29uZmlybSBvbgorZ2RiX3Rlc3QgInNob3cgY29uZmlybSIgIldoZXRoZXIgdG8gY29uZmlybSBwb3RlbnRpYWxseSBkYW5nZXJvdXMgb3BlcmF0aW9ucyBpcyBvbi4uKiIgInNob3cgY29uZmlybSAob24pIiAKKyN0ZXN0IHNldCBlZGl0aW5nIG9mZgorZ2RiX3Rlc3QgInNldCBlZGl0aW5nIG9mZiIgIiIgInNldCBlZGl0aW5nIG9mZiIgCisjdGVzdCBzaG93IGVkaXRpbmcgb2ZmCitnZGJfdGVzdCAic2hvdyBlZGl0aW5nIiAiRWRpdGluZyBvZiBjb21tYW5kIGxpbmVzIGFzIHRoZXkgYXJlIHR5cGVkIGlzIG9mZi4uKiIgInNob3cgZWRpdGluZyAob2ZmKSIgCisjdGVzdCBzZXQgZWRpdGluZyBvbgorI2dkYl90ZXN0ICJzZXQgZWRpdGluZyBvbiIgIiIgInNldCBlZGl0aW5nIG9uIiAKKyN0ZXN0IHNob3cgZWRpdGluZyBvbgorI2dkYl90ZXN0ICJzaG93IGVkaXRpbmciICJFZGl0aW5nIG9mIGNvbW1hbmQgbGluZXMgYXMgdGhleSBhcmUgdHlwZWQgaXMgb24uLioiICJzaG93IGVkaXRpbmcgKG9uKSIgCisjdGVzdCBzZXQgZW52aXJvbm1lbnQgRk9PQkFSQkFaCitnZGJfdGVzdCAic2V0IGVudmlyb25tZW50IEZPT0JBUkJBWiA9IGdyYnhncmJ4Z3JieCIgIiIgICAgInNldCBlbnZpcm9ubWVudCBGT09CQVJCQVoiIAorI3Rlc3Qgc2hvdyBlbnZpcm9ubWVudCBGT09CQVJCQVoKK2dkYl90ZXN0ICJzaG93IGVudmlyb25tZW50IEZPT0JBUkJBWiIgIkZPT0JBUkJBWiA9IGdyYnhncmJ4Z3JieC4qIiAgInNob3cgZW52aXJvbm1lbnQgRk9PQkFSQkFaIiAKKyN0ZXN0IHNldCBoZWlnaHQgMTAwCitnZGJfdGVzdCAic2V0IGhlaWdodCAxMDAiICIiICJzZXQgaGVpZ2h0IDEwMCIgCisjdGVzdCBzaG93IGhlaWdodCAxMDAKK2dkYl90ZXN0ICJzaG93IGhlaWdodCIgIk51bWJlciBvZiBsaW5lcyBnZGIgdGhpbmtzIGFyZSBpbiBhIHBhZ2UgaXMgMTAwLi4qIiAic2hvdyBoZWlnaHQiIAorI3Rlc3Qgc2V0IGhpc3RvcnkgZXhwYW5zaW9uIG9uCitnZGJfdGVzdCAic2V0IGhpc3RvcnkgZXhwYW5zaW9uIG9uIiAiIiAic2V0IGhpc3RvcnkgZXhwYW5zaW9uIG9uIiAKKyN0ZXN0IHNob3cgaGlzdG9yeSBleHBhbnNpb24gb24KK2dkYl90ZXN0ICJzaG93IGhpc3RvcnkgZXhwYW5zaW9uIG9uIiAiSGlzdG9yeSBleHBhbnNpb24gb24gY29tbWFuZCBpbnB1dCBpcyBvbi4qIiAic2hvdyBoaXN0b3J5IGV4cGFuc2lvbiIgCisjdGVzdCBzZXQgaGlzdG9yeSBmaWxlbmFtZSBmb29iYXIuYmF6CitnZGJfdGVzdCAic2V0IGhpc3RvcnkgZmlsZW5hbWUgZm9vYmFyLmJheiIgIiIgICAgInNldCBoaXN0b3J5IGZpbGVuYW1lIGZvb2Jhci5iYXoiIAorI3Rlc3Qgc2hvdyBoaXN0b3J5IGZpbGVuYW1lIGZvb2Jhci5iYXoKK2dkYl90ZXN0ICJzaG93IGhpc3RvcnkgZmlsZW5hbWUiICJUaGUgZmlsZW5hbWUgaW4gd2hpY2ggdG8gcmVjb3JkIHRoZSBjb21tYW5kIGhpc3RvcnkgaXMgXCJmb29iYXIuYmF6XCIuLioiICAic2hvdyBoaXN0b3J5IGZpbGVuYW1lIChmb29iYXIuYmF6KSIgCisjdGVzdCBzZXQgaGlzdG9yeSBzYXZlIG9uCitnZGJfdGVzdCAic2V0IGhpc3Rvcnkgc2F2ZSBvbiIgIiIgInNldCBoaXN0b3J5IHNhdmUgb24iIAorI3Rlc3Qgc2hvdyBoaXN0b3J5IHNhdmUgb24KK2dkYl90ZXN0ICJzaG93IGhpc3Rvcnkgc2F2ZSIgIlNhdmluZyBvZiB0aGUgaGlzdG9yeSByZWNvcmQgb24gZXhpdCBpcyBvbi4uKiIgICJzaG93IGhpc3Rvcnkgc2F2ZSAob24pIiAKKyN0ZXN0IHNldCBoaXN0b3J5IHNpemUgMTAwCitnZGJfdGVzdCAic2V0IGhpc3Rvcnkgc2l6ZSAxMDAiICIiICJzZXQgaGlzdG9yeSBzaXplIDEwMCIgCisjdGVzdCBzaG93IGhpc3Rvcnkgc2l6ZSAxMDAKK2dkYl90ZXN0ICJzaG93IGhpc3Rvcnkgc2l6ZSIgIlRoZSBzaXplIG9mIHRoZSBjb21tYW5kIGhpc3RvcnkgaXMgMTAwLi4qIiAic2hvdyBoaXN0b3J5IHNpemUgKDEwMCkiIAorI3Rlc3Qgc2V0IGxhbmd1YWdlIGFzbQorZ2RiX3Rlc3QgInNldCBsYW5ndWFnZSBhc20iICIiICJzZXQgbGFuZ3VhZ2UgYXNtIiAKKyN0ZXN0IHNob3cgbGFuZ3VhZ2UgYXNtCitnZGJfdGVzdCAic2hvdyBsYW5ndWFnZSIgIlRoZSBjdXJyZW50IHNvdXJjZSBsYW5ndWFnZSBpcyBcImFzbVwiLi4qIiAic2hvdyBsYW5ndWFnZSAoYXNtKSIgCisjdGVzdCBzZXQgbGFuZ3VhZ2UgYXV0bworZ2RiX3Rlc3QgInNldCBsYW5ndWFnZSBhdXRvIiAiIiAic2V0IGxhbmd1YWdlIGF1dG8iIAorI3Rlc3Qgc2hvdyBsYW5ndWFnZQorZ2RiX3Rlc3QgInNob3cgbGFuZ3VhZ2UiICJUaGUgY3VycmVudCBzb3VyY2UgbGFuZ3VhZ2UgaXMgXCJhdXRvLipcIi4uKiIgInNob3cgbGFuZ3VhZ2UgKGF1dG8pIiAKKyN0ZXN0IHNldCBsaXN0c2l6ZSAxMDAKK2dkYl90ZXN0ICJzZXQgbGlzdHNpemUgMTAwIiAiIiAic2V0IGxpc3RzaXplIDEwMCIgCisjdGVzdCBzaG93IGxpc3RzaXplIDEwMAorZ2RiX3Rlc3QgInNob3cgbGlzdHNpemUiICJOdW1iZXIgb2Ygc291cmNlIGxpbmVzIGdkYiB3aWxsIGxpc3QgYnkgZGVmYXVsdCBpcyAxMDAuLioiICJzaG93IGxpc3RzaXplICgxMDApIiAKKworaWYgIVtib2FyZF9pbmZvIHRhcmdldCBleGlzdHMgZ2RiX3Byb21wdF0geworICAgICN0ZXN0IHNldCBwcm9tcHQgKEZvb0JhckJheikgCisgICAgc2V0IG5ld3Byb21wdCAiXFwoRm9vQmFyQmF6XFwpIgorICAgIHNlbmRfZ2RiICJzZXQgcHJvbXB0IChGb29CYXJCYXopIFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiJG5ld3Byb21wdCAkIgl7IHBhc3MgInNldCBwcm9tcHQgKEZvb0JhckJheikgIiB9CisJdGltZW91dAkJCXsgZmFpbCAiKHRpbWVvdXQpIHNldCBwcm9tcHQgKEZvb0JhckJheikgIiB9CisgICAgfQorCisgICAgI3Rlc3Qgc2hvdyBwcm9tcHQgKEZvb0JhckJheikgCisgICAgc2VuZF9nZGIgInNob3cgcHJvbXB0XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJHZGIncyBwcm9tcHQgaXMgXCIkbmV3cHJvbXB0IFwiLi4qICQiIFwKKwkJeyBwYXNzICJzaG93IHByb21wdCAoRm9vQmFyQmF6KSAiIH0KKwl0aW1lb3V0CQkJeyBmYWlsICIodGltZW91dCkgc2hvdyBwcm9tcHQgKEZvb0JhckJheikgIiB9CisgICAgfQorCisgICAgI3Rlc3Qgc2V0IHByb21wdCAoZ2RiKSAKKyAgICBzZW5kX2dkYiAic2V0IHByb21wdCAoZ2RiKSBcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIiRnZGJfcHJvbXB0ICQiCQl7IHBhc3MgInNldCBwcm9tcHQgKGdkYikgIiB9CisJdGltZW91dAkJCXsgZmFpbCAiKHRpbWVvdXQpIHNldCBwcm9tcHQgKGdkYikgIiB9CisgICAgfQorfQorCisjdGVzdCBzZXQgcmFkaXggMTEKK2dkYl90ZXN0ICJzZXQgcmFkaXggMTEiICJVbnN1cHBvcnRlZCBvdXRwdXQgcmFkaXggYGBkZWNpbWFsIDExJyc7IG91dHB1dCByYWRpeCB1bmNoYW5nZWQuLioiICAic2V0IHJhZGl4IDExIiAKKyN0ZXN0IHNldCByYWRpeCAxNgorZ2RiX3Rlc3QgInNldCByYWRpeCAxNiIgIklucHV0IGFuZCBvdXRwdXQgcmFkaWNlcyBub3cgc2V0IHRvIGRlY2ltYWwgMTYsIGhleCAxMCwgb2N0YWwgMjAuLioiICAic2V0IHJhZGl4IDE2IiAKKyN0ZXN0IHNob3cgcmFkaXggMTYKK2dkYl90ZXN0ICJzaG93IHJhZGl4IiAiSW5wdXQgYW5kIG91dHB1dCByYWRpY2VzIHNldCB0byBkZWNpbWFsIDE2LCBoZXggMTAsIG9jdGFsIDIwLi4qIiAgInNob3cgcmFkaXggKDE2KSIgCisjdGVzdCBzZXQgcmFkaXggMTAKK2dkYl90ZXN0ICJzZXQgcmFkaXgiICJJbnB1dCBhbmQgb3V0cHV0IHJhZGljZXMgbm93IHNldCB0byBkZWNpbWFsIDEwLCBoZXggYSwgb2N0YWwgMTIuLioiICAic2V0IHJhZGl4IDEwIiAKKyN0ZXN0IHNob3cgcmFkaXggMTAKK2dkYl90ZXN0ICJzaG93IHJhZGl4IiAiSW5wdXQgYW5kIG91dHB1dCByYWRpY2VzIHNldCB0byBkZWNpbWFsIDEwLCBoZXggYSwgb2N0YWwgMTIuLioiICJzaG93IHJhZGl4ICgxMCkiIAorI3Rlc3Qgc2V0IHdpZHRoIDkwCitnZGJfdGVzdCAic2V0IHdpZHRoIDkwIiAiIiAic2V0IHdpZHRoIDkwIgorI3Rlc3Qgc2hvdyB3aWR0aCA5MAorZ2RiX3Rlc3QgInNob3cgd2lkdGgiICJOdW1iZXIgb2YgY2hhcmFjdGVycyBnZGIgdGhpbmtzIGFyZSBpbiBhIGxpbmUgaXMgOTAuLioiICJzaG93IHdpZHRoICg5MCkiIAorI3Rlc3Qgc2V0IHdyaXRlIG9uCisjIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgb24gdGFyZ2V0cyB3aGljaCB1c2UgZXhlYy5vLgorZ2RiX3Rlc3QgInNldCB3cml0ZSBvbiIgIiIgICJzZXQgd3JpdGUgb24iIAorI3Rlc3Qgc2hvdyB3cml0ZSBvbgorIyBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIG9uIHRhcmdldHMgd2hpY2ggdXNlIGV4ZWMuby4KK2dkYl90ZXN0ICJzaG93IHdyaXRlIiAiV3JpdGluZyBpbnRvIGV4ZWN1dGFibGUgYW5kIGNvcmUgZmlsZXMgaXMgb24uLioiICJzaG93IHdyaXRlIChvbikiIAorI3Rlc3Qgc2V0IHN5bWJvbC1yZWxvYWRpbmcgb24KK2dkYl90ZXN0ICJzZXQgc3ltYm9sLXJlbG9hZGluZyBvbiIgIiIgInNldCBzeW1ib2wtcmVsb2FkaW5nIG9uIiAKKyN0ZXN0IHNob3cgc3ltYm9sLXJlbG9hZGluZyBvbgorZ2RiX3Rlc3QgInNob3cgc3ltYm9sLXJlbG9hZGluZyIgIkR5bmFtaWMgc3ltYm9sIHRhYmxlIHJlbG9hZGluZyBtdWx0aXBsZSB0aW1lcyBpbiBvbmUgcnVuIGlzIG9uLi4qIiAic2hvdyBzeW1ib2wtcmVsb2FkaW5nIChvbikiIAorI3Rlc3Qgc2hvdyB1c2VyCitnZGJfdGVzdCAic2hvdyB1c2VyIiAiIiAic2hvdyB1c2VyIiAKKyN0ZXN0IHNldCB2ZXJib3NlIG9uCitnZGJfdGVzdCAic2V0IHZlcmJvc2Ugb24iICIiICJzZXQgdmVyYm9zZSBvbiIgCisjdGVzdCBzaG93IHZlcmJvc2Ugb24KK2dkYl90ZXN0ICJzaG93IHZlcmJvc2UiICJWZXJib3NlIHByaW50aW5nIG9mIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgaXMgb24uLioiICJzaG93IHZlcmJvc2UgKG9uKSIgCisjdGVzdCBzZXQgdmVyYm9zZSBvZmYKK2dkYl90ZXN0ICJzZXQgdmVyYm9zZSBvZmYiICIiICJzZXQgdmVyYm9zZSBvZmYiIAorI3Rlc3Qgc2hvdyB2ZXJib3NlIG9mZgorZ2RiX3Rlc3QgInNob3cgdmVyYm9zZSIgIlZlcmJvc2l0eSBpcyBvZmYuLioiICJzaG93IHZlcmJvc2UgKG9mZikiIApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zZXR2YXIuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc2V0dmFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2MjE1NQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc2V0dmFyLmMKQEAgLTAsMCArMSwyNzEgQEAKK21haW4gKGFyZ2MsIGFyZ3YsIGVudnApCisgICAgIGludCBhcmdjOworICAgICBjaGFyICoqYXJndjsKKyAgICAgY2hhciAqKmVudnA7Cit7CisgICAgZXh0ZXJuIHZvaWQgZHVtbXkoKTsKKyNpZmRlZiB1c2VzdHVicworICAgIHNldF9kZWJ1Z190cmFwcygpOworICAgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICAgIGR1bW15KCk7Cit9CisKKy8qIFdlIHB1dCBtYWluKCkgcmlnaHQgdXAgZnJvbnQgc28gaXRzIGxpbmUgbnVtYmVyIGRvZXNuJ3Qga2VlcCBjaGFuZ2luZy4gICovCisKKy8qCisgKglUZXN0IGZpbGUgd2l0aCBsb3RzIG9mIGRpZmZlcmVudCB0eXBlcywgZm9yIHRlc3RpbmcgdGhlCisgKgkid2hhdGlzIiBjb21tYW5kLgorICovCisKKy8qCisgKglGaXJzdCB0aGUgYmFzaWMgQyB0eXBlcy4KKyAqLworCisjaWYgIWRlZmluZWQgKF9fU1REQ19fKSAmJiAhZGVmaW5lZCAoX0FJWCkKKyNkZWZpbmUgc2lnbmVkICAvKiovCisjZW5kaWYKKworY2hhcgkJdl9jaGFyOworc2lnbmVkIGNoYXIJdl9zaWduZWRfY2hhcjsKK3Vuc2lnbmVkIGNoYXIJdl91bnNpZ25lZF9jaGFyOworCitzaG9ydAkJdl9zaG9ydDsKK3NpZ25lZCBzaG9ydAl2X3NpZ25lZF9zaG9ydDsKK3Vuc2lnbmVkIHNob3J0CXZfdW5zaWduZWRfc2hvcnQ7CisKK2ludAkJdl9pbnQ7CitzaWduZWQgaW50CXZfc2lnbmVkX2ludDsKK3Vuc2lnbmVkIGludAl2X3Vuc2lnbmVkX2ludDsKKworbG9uZwkJdl9sb25nOworc2lnbmVkIGxvbmcJdl9zaWduZWRfbG9uZzsKK3Vuc2lnbmVkIGxvbmcJdl91bnNpZ25lZF9sb25nOworCitmbG9hdAkJdl9mbG9hdDsKK2RvdWJsZQkJdl9kb3VibGU7CisKKy8qCisgKglOb3cgc29tZSBkZXJpdmVkIHR5cGVzLCB3aGljaCBhcmUgYXJyYXlzLCBmdW5jdGlvbnMtcmV0dXJuaW5nLAorICoJcG9pbnRlcnMsIHN0cnVjdHVyZXMsIHVuaW9ucywgYW5kIGVudW1lcmF0aW9ucy4KKyAqLworCisvKioqKiBhcnJheXMgKioqKioqKi8KKworY2hhcgkJdl9jaGFyX2FycmF5WzJdOworc2lnbmVkIGNoYXIJdl9zaWduZWRfY2hhcl9hcnJheVsyXTsKK3Vuc2lnbmVkIGNoYXIJdl91bnNpZ25lZF9jaGFyX2FycmF5WzJdOworCitzaG9ydAkJdl9zaG9ydF9hcnJheVsyXTsKK3NpZ25lZCBzaG9ydAl2X3NpZ25lZF9zaG9ydF9hcnJheVsyXTsKK3Vuc2lnbmVkIHNob3J0CXZfdW5zaWduZWRfc2hvcnRfYXJyYXlbMl07CisKK2ludAkJdl9pbnRfYXJyYXlbMl07CitzaWduZWQgaW50CXZfc2lnbmVkX2ludF9hcnJheVsyXTsKK3Vuc2lnbmVkIGludAl2X3Vuc2lnbmVkX2ludF9hcnJheVsyXTsKKworbG9uZwkJdl9sb25nX2FycmF5WzJdOworc2lnbmVkIGxvbmcJdl9zaWduZWRfbG9uZ19hcnJheVsyXTsKK3Vuc2lnbmVkIGxvbmcJdl91bnNpZ25lZF9sb25nX2FycmF5WzJdOworCitmbG9hdAkJdl9mbG9hdF9hcnJheVsyXTsKK2RvdWJsZQkJdl9kb3VibGVfYXJyYXlbMl07CisKKy8qKioqIHBvaW50ZXJzICoqKioqKiovCisKK2NoYXIJCSp2X2NoYXJfcG9pbnRlcjsKK3NpZ25lZCBjaGFyCSp2X3NpZ25lZF9jaGFyX3BvaW50ZXI7Cit1bnNpZ25lZCBjaGFyCSp2X3Vuc2lnbmVkX2NoYXJfcG9pbnRlcjsKKworc2hvcnQJCSp2X3Nob3J0X3BvaW50ZXI7CitzaWduZWQgc2hvcnQJKnZfc2lnbmVkX3Nob3J0X3BvaW50ZXI7Cit1bnNpZ25lZCBzaG9ydAkqdl91bnNpZ25lZF9zaG9ydF9wb2ludGVyOworCitpbnQJCSp2X2ludF9wb2ludGVyOworc2lnbmVkIGludAkqdl9zaWduZWRfaW50X3BvaW50ZXI7Cit1bnNpZ25lZCBpbnQJKnZfdW5zaWduZWRfaW50X3BvaW50ZXI7CisKK2xvbmcJCSp2X2xvbmdfcG9pbnRlcjsKK3NpZ25lZCBsb25nCSp2X3NpZ25lZF9sb25nX3BvaW50ZXI7Cit1bnNpZ25lZCBsb25nCSp2X3Vuc2lnbmVkX2xvbmdfcG9pbnRlcjsKKworZmxvYXQJCSp2X2Zsb2F0X3BvaW50ZXI7Citkb3VibGUJCSp2X2RvdWJsZV9wb2ludGVyOworCisvKioqKiBzdHJ1Y3RzICoqKioqKiovCisKK3N0cnVjdCB0X3N0cnVjdCB7CisgICAgY2hhcgl2X2NoYXJfbWVtYmVyOworICAgIHNob3J0CXZfc2hvcnRfbWVtYmVyOworICAgIGludAkJdl9pbnRfbWVtYmVyOworICAgIGxvbmcJdl9sb25nX21lbWJlcjsKKyAgICBmbG9hdAl2X2Zsb2F0X21lbWJlcjsKKyAgICBkb3VibGUJdl9kb3VibGVfbWVtYmVyOworfSB2X3N0cnVjdDE7CisKK3N0cnVjdCB7CisgICAgY2hhcgl2X2NoYXJfbWVtYmVyOworICAgIHNob3J0CXZfc2hvcnRfbWVtYmVyOworICAgIGludAkJdl9pbnRfbWVtYmVyOworICAgIGxvbmcJdl9sb25nX21lbWJlcjsKKyAgICBmbG9hdAl2X2Zsb2F0X21lbWJlcjsKKyAgICBkb3VibGUJdl9kb3VibGVfbWVtYmVyOworfSB2X3N0cnVjdDI7CisKKy8qKioqIHVuaW9ucyAqKioqKioqLworCit1bmlvbiB0X3VuaW9uIHsKKyAgICBjaGFyCXZfY2hhcl9tZW1iZXI7CisgICAgc2hvcnQJdl9zaG9ydF9tZW1iZXI7CisgICAgaW50CQl2X2ludF9tZW1iZXI7CisgICAgbG9uZwl2X2xvbmdfbWVtYmVyOworICAgIGZsb2F0CXZfZmxvYXRfbWVtYmVyOworICAgIGRvdWJsZQl2X2RvdWJsZV9tZW1iZXI7Cit9IHZfdW5pb247CisKK3VuaW9uIHsKKyAgICBjaGFyCXZfY2hhcl9tZW1iZXI7CisgICAgc2hvcnQJdl9zaG9ydF9tZW1iZXI7CisgICAgaW50CQl2X2ludF9tZW1iZXI7CisgICAgbG9uZwl2X2xvbmdfbWVtYmVyOworICAgIGZsb2F0CXZfZmxvYXRfbWVtYmVyOworICAgIGRvdWJsZQl2X2RvdWJsZV9tZW1iZXI7Cit9IHZfdW5pb24yOworCisvKioqIEZ1bmN0aW9ucyByZXR1cm5pbmcgdHlwZSAqKioqKioqKi8KKworY2hhcgkJdl9jaGFyX2Z1bmMgKCkgeyByZXR1cm4oMCk7IH0KK3NpZ25lZCBjaGFyCXZfc2lnbmVkX2NoYXJfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KK3Vuc2lnbmVkIGNoYXIJdl91bnNpZ25lZF9jaGFyX2Z1bmMgKCkgeyByZXR1cm4gKDApOyB9CisKK3Nob3J0CQl2X3Nob3J0X2Z1bmMgKCkgeyByZXR1cm4gKDApOyB9CitzaWduZWQgc2hvcnQJdl9zaWduZWRfc2hvcnRfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KK3Vuc2lnbmVkIHNob3J0CXZfdW5zaWduZWRfc2hvcnRfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KKworaW50CQl2X2ludF9mdW5jICgpIHsgcmV0dXJuICgwKTsgfQorc2lnbmVkIGludAl2X3NpZ25lZF9pbnRfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KK3Vuc2lnbmVkIGludAl2X3Vuc2lnbmVkX2ludF9mdW5jICgpIHsgcmV0dXJuICgwKTsgfQorCitsb25nCQl2X2xvbmdfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KK3NpZ25lZCBsb25nCXZfc2lnbmVkX2xvbmdfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KK3Vuc2lnbmVkIGxvbmcJdl91bnNpZ25lZF9sb25nX2Z1bmMgKCkgeyByZXR1cm4gKDApOyB9CisKK2Zsb2F0CQl2X2Zsb2F0X2Z1bmMgKCkgeyByZXR1cm4gKDAuMCk7IH0KK2RvdWJsZQkJdl9kb3VibGVfZnVuYyAoKSB7IHJldHVybiAoMC4wKTsgfQorCisvKioqKiBTb21lIG1pc2MgbW9yZSBjb21wbGljYXRlZCB0aGluZ3MgKioqKioqKi8KKworc3RydWN0IGxpbmsgeworCXN0cnVjdCBsaW5rICpuZXh0OworI2lmZGVmIF9fU1REQ19fCisJc3RydWN0IGxpbmsgKigqbGlua2Z1bmMpIChzdHJ1Y3QgbGluayAqdGhpcywgaW50IGZsYWdzKTsKKyNlbHNlCisJc3RydWN0IGxpbmsgKigqbGlua2Z1bmMpICgpOworI2VuZGlmCisJc3RydWN0IHRfc3RydWN0IHN0dWZmWzFdWzJdWzNdOworfSAqc19saW5rOworCit1bmlvbiB0dV9saW5rIHsKKwlzdHJ1Y3QgbGluayAqbmV4dDsKKyNpZmRlZiBfX1NURENfXworCXN0cnVjdCBsaW5rICooKmxpbmtmdW5jKSAoc3RydWN0IGxpbmsgKnRoaXMsIGludCBmbGFncyk7CisjZWxzZQorCXN0cnVjdCBsaW5rICooKmxpbmtmdW5jKSAoKTsKKyNlbmRpZgorCXN0cnVjdCB0X3N0cnVjdCBzdHVmZlsxXVsyXVszXTsKK30gdV9saW5rOworCisvKioqKiBFbnVtZXJhdGlvbnMgKioqKioqKi8KKworZW51bSBjb2xvcnMge3JlZCwgZ3JlZW4sIGJsdWV9IGNvbG9yOworZW51bSBjYXJzIHtjaGV2eSwgZm9yZCwgcG9yc2NoZX0gY2x1bmtlcjsKKworLyoqKiogRW51bWVyYXRpb24gYml0ZmllbGRzLCBzdXBwb3J0ZWQgYnkgR05VIEMgKioqKioqKi8KKworI2lmZGVmIF9fR05VQ19fCitlbnVtIHNlbnVtIHtzbTEgPSAtMSwgczEgPSAxfTsKK3N0cnVjdCBzZW51bV9maWVsZCB7ZW51bSBzZW51bSBmaWVsZDoyOyB9IHNlZjsKK2VudW0gdWVudW0ge3UxID0gMSwgdTIgPSAyfTsKK3N0cnVjdCB1ZW51bV9maWVsZCB7ZW51bSB1ZW51bSBmaWVsZDoyOyB9IHVlZjsKKyNlbmRpZgorCit2b2lkCitkdW1teSAoKQoreworICAvKiBzZXR2YXIuZXhwIHdhbnRzIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY29uc3RhbnRzLiAgU28gbWFrZSBzdXJlIG1hbGxvYworICAgICBnZXRzIGxpbmtlZCBpbnRvIHRoZSBwcm9ncmFtLiAgKi8KKyAgbWFsbG9jICgxKTsKKworICAvKiBTb21lIGxpbmtlcnMgKGUuZy4gb24gQUlYKSByZW1vdmUgdW5yZWZlcmVuY2VkIHZhcmlhYmxlcywKKyAgICAgc28gbWFrZSBzdXJlIHRvIHJlZmVyZW5jZSB0aGVtLiAqLworICB2X2NoYXIgPSAwOworICB2X3NpZ25lZF9jaGFyID0gMTsKKyAgdl91bnNpZ25lZF9jaGFyID0gMjsKKworICB2X3Nob3J0ID0gMzsKKyAgdl9zaWduZWRfc2hvcnQgPSA0OworICB2X3Vuc2lnbmVkX3Nob3J0ID0gNTsgICAgCisKKyAgdl9pbnQgPSA2OworICB2X3NpZ25lZF9pbnQgPSA3OworICB2X3Vuc2lnbmVkX2ludCA9IDg7ICAgIAorCisgIHZfbG9uZyA9IDk7CisgIHZfc2lnbmVkX2xvbmcgPSAxMDsKKyAgdl91bnNpZ25lZF9sb25nID0gMTE7ICAgIAorICAKKyAgdl9mbG9hdCA9IDEwMC4wOworICB2X2RvdWJsZSA9IDIwMC4wOworCisKKyAgdl9jaGFyX2FycmF5WzBdID0gdl9jaGFyOworICB2X3NpZ25lZF9jaGFyX2FycmF5WzBdID0gdl9zaWduZWRfY2hhcjsKKyAgdl91bnNpZ25lZF9jaGFyX2FycmF5WzBdID0gdl91bnNpZ25lZF9jaGFyOworCisgIHZfc2hvcnRfYXJyYXlbMF0gPSB2X3Nob3J0OworICB2X3NpZ25lZF9zaG9ydF9hcnJheVswXSA9IHZfc2lnbmVkX3Nob3J0OworICB2X3Vuc2lnbmVkX3Nob3J0X2FycmF5WzBdID0gdl91bnNpZ25lZF9zaG9ydDsKKworICB2X2ludF9hcnJheVswXSA9IHZfaW50OworICB2X3NpZ25lZF9pbnRfYXJyYXlbMF0gPSB2X3NpZ25lZF9pbnQ7CisgIHZfdW5zaWduZWRfaW50X2FycmF5WzBdID0gdl91bnNpZ25lZF9pbnQ7CisKKyAgdl9sb25nX2FycmF5WzBdID0gdl9sb25nOworICB2X3NpZ25lZF9sb25nX2FycmF5WzBdID0gdl9zaWduZWRfbG9uZzsKKyAgdl91bnNpZ25lZF9sb25nX2FycmF5WzBdID0gdl91bnNpZ25lZF9sb25nOworCisgIHZfZmxvYXRfYXJyYXlbMF0gPSB2X2Zsb2F0OworICB2X2RvdWJsZV9hcnJheVswXSA9IHZfZG91YmxlOworCisgIHZfY2hhcl9wb2ludGVyID0gJnZfY2hhcjsKKyAgdl9zaWduZWRfY2hhcl9wb2ludGVyID0gJnZfc2lnbmVkX2NoYXI7CisgIHZfdW5zaWduZWRfY2hhcl9wb2ludGVyID0gJnZfdW5zaWduZWRfY2hhcjsKKworICB2X3Nob3J0X3BvaW50ZXIgPSAmdl9zaG9ydDsKKyAgdl9zaWduZWRfc2hvcnRfcG9pbnRlciA9ICZ2X3NpZ25lZF9zaG9ydDsKKyAgdl91bnNpZ25lZF9zaG9ydF9wb2ludGVyID0gJnZfdW5zaWduZWRfc2hvcnQ7CisKKyAgdl9pbnRfcG9pbnRlciA9ICZ2X2ludDsKKyAgdl9zaWduZWRfaW50X3BvaW50ZXIgPSAmdl9zaWduZWRfaW50OworICB2X3Vuc2lnbmVkX2ludF9wb2ludGVyID0gJnZfdW5zaWduZWRfaW50OworCisgIHZfbG9uZ19wb2ludGVyID0gJnZfbG9uZzsKKyAgdl9zaWduZWRfbG9uZ19wb2ludGVyID0gJnZfc2lnbmVkX2xvbmc7CisgIHZfdW5zaWduZWRfbG9uZ19wb2ludGVyID0gJnZfdW5zaWduZWRfbG9uZzsKKworICB2X2Zsb2F0X3BvaW50ZXIgPSAmdl9mbG9hdDsKKyAgdl9kb3VibGVfcG9pbnRlciA9ICZ2X2RvdWJsZTsKKworICBjb2xvciA9IHJlZDsKKyAgY2x1bmtlciA9IHBvcnNjaGU7CisKKyAgdV9saW5rLm5leHQgPSBzX2xpbms7CisKKyAgdl9zdHJ1Y3QyLnZfaW50X21lbWJlciA9IHZfc3RydWN0MS52X2ludF9tZW1iZXI7CisgIHZfdW5pb24yLnZfc2hvcnRfbWVtYmVyID0gdl91bmlvbi52X3Nob3J0X21lbWJlcjsKKworI2lmZGVmIF9fR05VQ19fCisgIHNlZi5maWVsZCA9IHMxOworICB1ZWYuZmllbGQgPSB1MTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zZXR2YXIuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zZXR2YXIuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZDNlYjQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NldHZhci5leHAKQEAgLTAsMCArMSw0MjAgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgICBDb3B5cmlnaHQgKEMpIDE5ODgsIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTQsIDE5OTUKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUm9iIFNhdm95ZS4gKHJvYkBjeWdudXMuY29tKQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKKwl9CisKKyMKKyMgdGVzdCBydW5uaW5nIHByb2dyYW1zCisjCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJzZXR2YXIiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisjIENyZWF0ZSBhbmQgc291cmNlIHRoZSBmaWxlIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyCisjIHVzZWQgdG8gY29tcGlsZSB0aGUgdGVzdCBjYXNlLgoraWYgW2dldF9jb21waWxlcl9pbmZvICR7YmluZmlsZX1dIHsKKyAgICByZXR1cm4gLTE7Cit9CisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJGJpbmZpbGUKKworIworIyBzZXQgaXQgdXAgYXQgYSBicmVha3BvaW50IHNvIHdlIGNhbnBsYXkgd2l0aCB0aGUgdmFyaWFibGUgdmFsdWVzCisjCitzZW5kX2dkYiAic2V0IHByaW50IHNldmVuYml0LXN0cmluZ3NcbiIgOyBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKKworaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgICBwZXJyb3IgImNvdWxkbid0IHJ1biB0byBicmVha3BvaW50IgorICAgIGNvbnRpbnVlCit9CisKKyMgRGV0ZXJtaW5lIGV4cGVjdGVkIG91dHB1dCBmb3IgdW5zaWduZWQgbG9uZyB2YXJpYWJsZXMsCisjIHRoZSBvdXRwdXQgdmFyaWVzIHdpdGggc2l6ZW9mICh1bnNpZ25lZCBsb25nKS4KKworc2V0IHVsb25nX21pbnVzXzEgNDI5NDk2NzI5NQorc2V0IHVsb25nX21pbnVzXzQ1NiA0Mjk0OTY2ODQwCitzZW5kX2dkYiAicHJpbnQgc2l6ZW9mICh1bnNpZ25lZCBsb25nKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSA0LiokZ2RiX3Byb21wdCAkIiB7fQorICAgIC1yZSAiLlxbMC05XF0qID0gOC4qJGdkYl9wcm9tcHQgJCIgeworCXNldCB1bG9uZ19taW51c18xIDE4NDQ2NzQ0MDczNzA5NTUxNjE1CisJc2V0IHVsb25nX21pbnVzXzQ1NiAxODQ0Njc0NDA3MzcwOTU1MTE2MAorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSBmYWlsICJnZXR0aW5nIHNpemVvZiB1bnNpZ25lZCBsb25nIgorICAgIH0KKyAgICBkZWZhdWx0CXsgZmFpbCAiKHRpbWVvdXQpIGdldHRpbmcgc2l6ZW9mIHVuc2lnbmVkIGxvbmciIH0KK30KKworcHJvYyB0ZXN0X3NldCB7IGFyZ3MgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIHNldCBsZW5ndGggW2V4cHIgW2xsZW5ndGggJGFyZ3NdIC0gMV07CisgICAgc2V0IG1lc3NhZ2UgIltsaW5kZXggJGFyZ3MgJGxlbmd0aF0iOworICAgIHNldCBmaW5hbCBbZXhwciAkbGVuZ3RoIC0gMl07CisgICAgc2V0IGNvdW50IDE7CisKKyAgICAjIFNldCB1cCB0aGUgdmFyaWFibGVzLgorICAgIGZvciB7c2V0IHggMDt9IHskeCA8ICRsZW5ndGh9IHtpbmNyIHg7fSB7CisJaWYgeyAiW2xpbmRleCAkYXJncyAkeF0iICE9ICIiIH0geworCSAgICBzZXQgYXJnIFtsaW5kZXggJGFyZ3MgJHhdOworCSAgICBpZiB7ICgkeCA9PSAkZmluYWwpIHx8IChbc3RyaW5nIGZpcnN0ICIuKiIgW2xpbmRleCAkYXJncyBbZXhwciAkeCArIDFdXV0gPj0gMCkgfSB7CisJCXNldCBtYXRjaCBbbGluZGV4ICRhcmdzIFtleHByICR4ICsgMV1dOworCQlpZiB7ICRjb3VudCA9PSAxIH0geworCQkgICAgc2V0IG1lc3MgIiRtZXNzYWdlIgorCQl9IGVsc2UgeworCQkgICAgc2V0IG1lc3MgIiRtZXNzYWdlICgjJGNvdW50KSI7CisJCX0KKwkJaW5jciBjb3VudDsKKwkJaW5jciB4OworCSAgICB9IGVsc2UgeworCQlzZXQgbWVzcyAiIjsKKwkJc2V0IG1hdGNoICIiCisJICAgIH0KKwkgICAgdmVyYm9zZSAiZG9pbmcgJGFyZyAkbWF0Y2giCisJICAgIGlmIFtnZGJfdGVzdCAiJGFyZyIgIiRtYXRjaCIgIiRtZXNzIl0geworCQlmYWlsICIkbWVzc2FnZSAtLSAkbWF0Y2giOworCQlyZXR1cm4gMTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyMKKyMgdGVzdCAic2V0IHZhcmlhYmxlIiBmb3IgdHlwZSAiY2hhciIKKyMKKyMgQmVjYXVzZSBiYXJlIGNoYXIgdHlwZXMgY2FuIGJlIGVpdGhlciBzaWduZWQgb3IgdW5zaWduZWQsIHdlIGp1c3QgdGVzdCB0aGUKKyMgcmFuZ2Ugb2YgdmFsdWVzIHRoYXQgYXJlIGNvbW1vbiB0byBib3RoICgwLTEyNykuCisjICAgIAorCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfY2hhcj0wIiAicHJpbnQgdl9jaGFyIiAiLlxbMC05XF0qID0gMCBcJy4wMDBcJyIgICAgICAgICJzZXQgdmFyaWFibGUgY2hhcj0wIiAKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl9jaGFyPTEiICJwcmludCB2X2NoYXIiICIuXFswLTlcXSogPSAxIFwnLjAwMVwnIiAgICAgICAgInNldCB2YXJpYWJsZSBjaGFyPTEiIAordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X2NoYXI9MjciICJwcmludCB2X2NoYXIiICIuXFswLTlcXSogPSAyNyBcJy5lXCciICAgICAgICAic2V0IHZhcmlhYmxlIGNoYXI9MjcgKEVzYykiIAordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X2NoYXI9MzIiICJwcmludCB2X2NoYXIiICIuXFswLTlcXSogPSAzMiBcJyBcJyIgICAgICAgICJzZXQgdmFyaWFibGUgY2hhcj0zMiAoU1BDKSIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfY2hhcj02NSIgInByaW50IHZfY2hhciIgIi5cWzAtOVxdKiA9IDY1IFwnQVwnIiAgICAgICAgInNldCB2YXJpYWJsZSBjaGFyPTY1ICgnQScpIiAKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl9jaGFyPTk3IiAicHJpbnQgdl9jaGFyIiAiLlxbMC05XF0qID0gOTcgXCdhXCciICAgICAgICAic2V0IHZhcmlhYmxlIGNoYXI9OTcgKCdhJykiIAordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X2NoYXI9MTI2IiAicHJpbnQgdl9jaGFyIiAiLlxbMC05XF0qID0gMTI2IFwnflwnIiAgICAgICAgInNldCB2YXJpYWJsZSBjaGFyPTEyNiAoJ34nKSIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfY2hhcj0xMjciICJwcmludCB2X2NoYXIiICIuXFswLTlcXSogPSAxMjcgXCcuMTc3XCciICAgICAgICAic2V0IHZhcmlhYmxlIGNoYXI9MTI3ICg4LWJpdCkiIAorIworIyB0ZXN0ICJzZXQgdmFyaWFibGUiIGZvciB0eXBlICJzaWduZWQgY2hhciIKKyMgICAgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfY2hhcj0wIiAicHJpbnQgdl9zaWduZWRfY2hhciIgIi5cWzAtOVxdKiA9IDAgXCcuMDAwXCciICAgICAgICAic2V0IHZhcmlhYmxlIHNpZ25lZCBjaGFyPTAiIAordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X3NpZ25lZF9jaGFyPTEiICJwcmludCB2X3NpZ25lZF9jaGFyIiAiLlxbMC05XF0qID0gMSBcJy4wMDFcJyIgICAgICAgICJzZXQgdmFyaWFibGUgc2lnbmVkIGNoYXI9MSIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2NoYXI9MjciICJwcmludCB2X3NpZ25lZF9jaGFyIiAiLlxbMC05XF0qID0gMjcgXCcuZVwnIiAgICAgICAgInNldCB2YXJpYWJsZSBzaWduZWQgY2hhcj0yNyAoRXNjKSIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2NoYXI9MzIiICJwcmludCB2X3NpZ25lZF9jaGFyIiAiLlxbMC05XF0qID0gMzIgXCcgXCciICAgICAgICAic2V0IHZhcmlhYmxlIHNpZ25lZCBjaGFyPTMyIChTUEMpIiAKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl9zaWduZWRfY2hhcj02NSIgInByaW50IHZfc2lnbmVkX2NoYXIiICIuXFswLTlcXSogPSA2NSBcJ0FcJyIgICAgICAgICJzZXQgdmFyaWFibGUgc2lnbmVkIGNoYXI9NjUgKCdBJykiIAordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X3NpZ25lZF9jaGFyPTk3IiAicHJpbnQgdl9zaWduZWRfY2hhciIgIi5cWzAtOVxdKiA9IDk3IFwnYVwnIiAgICAgICAgInNldCB2YXJpYWJsZSBzaWduZWQgY2hhcj05NyAoJ2EnKSIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2NoYXI9MTI2IiAicHJpbnQgdl9zaWduZWRfY2hhciIgIi5cWzAtOVxdKiA9IDEyNiBcJ35cJyIgICAgICAgICJzZXQgdmFyaWFibGUgc2lnbmVkIGNoYXI9MTI2ICgnficpIiAKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl9zaWduZWRfY2hhcj0xMjciICJwcmludCB2X3NpZ25lZF9jaGFyIiAiLlxbMC05XF0qID0gMTI3IFwnLjE3N1wnIiAgICAgICAgInNldCB2YXJpYWJsZSBzaWduZWQgY2hhcj0xMjcgKDgtYml0KSIgCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2NoYXI9LTEiICIiCitpZiB7ISRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAibWlwcy1zZ2ktaXJpeDQqIiB9CitnZGJfdGVzdCAicHJpbnQgdl9zaWduZWRfY2hhciIgIi5cWzAtOVxdKiA9IC0xIFwnLjM3N1wnIiBcCisgICAgInNldCB2YXJpYWJsZSBzaWduZWQgY2hhcj0tMSAoLTEpIgorZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB2X3NpZ25lZF9jaGFyPTB4RkYiICIiCitpZiB7ISRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAibWlwcy1zZ2ktaXJpeDQqIiB9CitnZGJfdGVzdCAicHJpbnQgdl9zaWduZWRfY2hhciIgIi5cWzAtOVxdKiA9IC0xIFwnLjM3N1wnIiBcCisgICAgInNldCB2YXJpYWJsZSBzaWduZWQgY2hhcj0weEZGICgweEZGKSIKKyMKKyMgdGVzdCAic2V0IHZhcmlhYmxlIiBmb3IgdHlwZSAidW5zaWduZWQgY2hhciIKKyMKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9jaGFyPTAiICJwcmludCB2X3Vuc2lnbmVkX2NoYXIiICIuXFswLTlcXSogPSAwIFwnLjAwMFwnIiAgICAgICAgInNldCB2YXJpYWJsZSB1bnNpZ25lZCBjaGFyPTAiIAordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX2NoYXI9MSIgInByaW50IHZfdW5zaWduZWRfY2hhciIgIi5cWzAtOVxdKiA9IDEgXCcuMDAxXCciICAgICAgICAic2V0IHZhcmlhYmxlIHVuc2lnbmVkIGNoYXI9MSIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfdW5zaWduZWRfY2hhcj0yNyIgInByaW50IHZfdW5zaWduZWRfY2hhciIgIi5cWzAtOVxdKiA9IDI3IFwnLmVcJyIgICAgICAgICJzZXQgdmFyaWFibGUgdW5zaWduZWQgY2hhcj0yNyAoRXNjKSIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfdW5zaWduZWRfY2hhcj0zMiIgInByaW50IHZfdW5zaWduZWRfY2hhciIgIi5cWzAtOVxdKiA9IDMyIFwnIFwnIiAgICAgICAgInNldCB2YXJpYWJsZSB1bnNpZ25lZCBjaGFyPTMyIChTUEMpIiAKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9jaGFyPTY1IiAicHJpbnQgdl91bnNpZ25lZF9jaGFyIiAiLlxbMC05XF0qID0gNjUgXCdBXCciICAgICAgICAic2V0IHZhcmlhYmxlIHVuc2lnbmVkIGNoYXI9NjUgKCdBJykiIAordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX2NoYXI9OTciICJwcmludCB2X3Vuc2lnbmVkX2NoYXIiICIuXFswLTlcXSogPSA5NyBcJ2FcJyIgICAgICAgICJzZXQgdmFyaWFibGUgdW5zaWduZWQgY2hhcj05NyAoJ2EnKSIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfdW5zaWduZWRfY2hhcj0xMjYiICJwcmludCB2X3Vuc2lnbmVkX2NoYXIiICIuXFswLTlcXSogPSAxMjYgXCd+XCciICAgICAgICAic2V0IHZhcmlhYmxlIHVuc2lnbmVkIGNoYXI9MTI2ICgnficpIiAKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9jaGFyPX4wIiAicHJpbnQgdl91bnNpZ25lZF9jaGFyIiAiLlxbMC05XF0qID0gMjU1IFwnLjM3N1wnIiAgICAgICAgInNldCB2YXJpYWJsZSB1bnNpZ25lZCBjaGFyPTI1NSAoOC1iaXQpIiAKKyMKKyMgdGVzdCAic2V0IHZhcmlhYmxlIiBmb3IgdHlwZSAic2hvcnQiCisjCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfc2hvcnQ9MCIgInByaW50IHZfc2hvcnQiICIuXFswLTlcXSogPSAwIiAgICAgICAgInNldCB2YXJpYWJsZSBzaG9ydD0wIiAKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl9zaG9ydD0xIiAicHJpbnQgdl9zaG9ydCIgIi5cWzAtOVxdKiA9IDEiICAgICAgICAic2V0IHZhcmlhYmxlIHNob3J0PTEiIAordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X3Nob3J0PS0xIiAicHJpbnQgdl9zaG9ydCIgIi5cWzAtOVxdKiA9IC0xIiAgICAgICAgInNldCB2YXJpYWJsZSBzaG9ydD0tMSAobWludXMpIiAKKyMKKyMgdGVzdCAic2V0IHZhcmlhYmxlIiBmb3IgdHlwZSAic2lnbmVkIHNob3J0IgorIwordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X3NpZ25lZF9zaG9ydD0wIiAicHJpbnQgdl9zaWduZWRfc2hvcnQiICIuXFswLTlcXSogPSAwIiAgICAgICAgInNldCB2YXJpYWJsZSBzaWduZWQgc2hvcnQ9MCIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX3Nob3J0PTEiICJwcmludCB2X3NpZ25lZF9zaG9ydCIgIi5cWzAtOVxdKiA9IDEiICAgICAgICAic2V0IHZhcmlhYmxlIHNpZ25lZCBzaG9ydD0xIiAKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl9zaWduZWRfc2hvcnQ9LTEiICJwcmludCB2X3NpZ25lZF9zaG9ydCIgIi5cWzAtOVxdKiA9IC0xIiAgICAgICAgInNldCB2YXJpYWJsZSBzaWduZWQgc2hvcnQ9LTEgKG1pbnVzKSIgCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yIHR5cGUgInVuc2lnbmVkIHNob3J0IgorIwordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX3Nob3J0PTAiICJwcmludCB2X3Vuc2lnbmVkX3Nob3J0IiAiLlxbMC05XF0qID0gMCIgICAgICAgICJzZXQgdmFyaWFibGUgdW5zaWduZWQgc2hvcnQ9MCIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfdW5zaWduZWRfc2hvcnQ9MSIgInByaW50IHZfdW5zaWduZWRfc2hvcnQiICIuXFswLTlcXSogPSAxIiAgICAgICAgInNldCB2YXJpYWJsZSB1bnNpZ25lZCBzaG9ydD0xIiAKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9zaG9ydD1+MCIgInByaW50IHZfdW5zaWduZWRfc2hvcnQiICIuXFswLTlcXSogPSA2NTUzNSIgICAgICAgICJzZXQgdmFyaWFibGUgdW5zaWduZWQgc2hvcnQ9fjAgKG1pbnVzKSIgCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yIHR5cGUgImludCIKKyMKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl9pbnQ9MCIgInByaW50IHZfaW50IiAiLlxbMC05XF0qID0gMCIgICAgICAgICJzZXQgdmFyaWFibGUgaW50PTAiIAordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X2ludD0xIiAicHJpbnQgdl9pbnQiICIuXFswLTlcXSogPSAxIiAgICAgICAgInNldCB2YXJpYWJsZSBpbnQ9MSIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfaW50PS0xIiAicHJpbnQgdl9pbnQiICIuXFswLTlcXSogPSAtMSIgICAgICAgICJzZXQgdmFyaWFibGUgaW50PS0xIChtaW51cykiIAorIworIyB0ZXN0ICJzZXQgdmFyaWFibGUiIGZvciB0eXBlICJzaWduZWQgaW50IgorIwordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X3NpZ25lZF9pbnQ9MCIgInByaW50IHZfc2lnbmVkX2ludCIgIi5cWzAtOVxdKiA9IDAiICAgICAgICAic2V0IHZhcmlhYmxlIHNpZ25lZCBpbnQ9MCIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2ludD0xIiAicHJpbnQgdl9zaWduZWRfaW50IiAiLlxbMC05XF0qID0gMSIgICAgICAgICJzZXQgdmFyaWFibGUgc2lnbmVkIGludD0xIiAKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl9zaWduZWRfaW50PS0xIiAicHJpbnQgdl9zaWduZWRfaW50IiAiLlxbMC05XF0qID0gLTEiICAgICAgICAic2V0IHZhcmlhYmxlIHNpZ25lZCBpbnQ9LTEgKG1pbnVzKSIgCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yIHR5cGUgInVuc2lnbmVkIGludCIKKyMKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9pbnQ9MCIgInByaW50IHZfdW5zaWduZWRfaW50IiAiLlxbMC05XF0qID0gMCIgICAgICAgICJzZXQgdmFyaWFibGUgdW5zaWduZWQgaW50PTAiIAordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX2ludD0xIiAicHJpbnQgdl91bnNpZ25lZF9pbnQiICIuXFswLTlcXSogPSAxIiAgICAgICAgInNldCB2YXJpYWJsZSB1bnNpZ25lZCBpbnQ9MSIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfdW5zaWduZWRfaW50PX4wIiAicHJpbnQgdl91bnNpZ25lZF9pbnQiICIuXFswLTlcXSogPSAoNDI5NDk2NzI5NXw2NTUzNSkiICAgICAgICAic2V0IHZhcmlhYmxlIHVuc2lnbmVkIGludD1+MCAobWludXMpIiAKKyN0ZXN0X3NldCAiLlxbMC05XF0qID0gNjU1MzUiICAgICAgICAic2V0IHZhcmlhYmxlIHVuc2lnbmVkIGludD1+MCAobWludXMpIiAKKyMKKyMgdGVzdCAic2V0IHZhcmlhYmxlIiBmb3IgdHlwZSAibG9uZyIKKyMKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl9sb25nPTAiICJwcmludCB2X2xvbmciICIuXFswLTlcXSogPSAwIiAgICAgICAgInNldCB2YXJpYWJsZSBsb25nPTAiIAordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X2xvbmc9MSIgInByaW50IHZfbG9uZyIgIi5cWzAtOVxdKiA9IDEiICAgICAgICAic2V0IHZhcmlhYmxlIGxvbmc9MSIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfbG9uZz0tMSIgInByaW50IHZfbG9uZyIgIi5cWzAtOVxdKiA9IC0xIiAgICAgICAgInNldCB2YXJpYWJsZSBsb25nPS0xIChtaW51cykiIAorIworIyB0ZXN0ICJzZXQgdmFyaWFibGUiIGZvciB0eXBlICJzaWduZWQgbG9uZyIKKyMKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl9zaWduZWRfbG9uZz0wIiAicHJpbnQgdl9zaWduZWRfbG9uZyIgIi5cWzAtOVxdKiA9IDAiICAgICAgICAic2V0IHZhcmlhYmxlIHNpZ25lZCBsb25nPTAiIAordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X3NpZ25lZF9sb25nPTEiICJwcmludCB2X3NpZ25lZF9sb25nIiAiLlxbMC05XF0qID0gMSIgICAgICAgICJzZXQgdmFyaWFibGUgc2lnbmVkIGxvbmc9MSIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2xvbmc9LTEiICJwcmludCB2X3NpZ25lZF9sb25nIiAiLlxbMC05XF0qID0gLTEiICAgICAgICAic2V0IHZhcmlhYmxlIHNpZ25lZCBsb25nPS0xIChtaW51cykiIAorIworIyB0ZXN0ICJzZXQgdmFyaWFibGUiIGZvciB0eXBlICJ1bnNpZ25lZCBsb25nIgorIwordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX2xvbmc9MCIgInByaW50IHZfdW5zaWduZWRfbG9uZyIgIi5cWzAtOVxdKiA9IDAiICAgICAgICAic2V0IHZhcmlhYmxlIHVuc2lnbmVkIGxvbmc9MCIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfdW5zaWduZWRfbG9uZz0xIiAicHJpbnQgdl91bnNpZ25lZF9sb25nIiAiLlxbMC05XF0qID0gMSIgICAgICAgICJzZXQgdmFyaWFibGUgdW5zaWduZWQgbG9uZz0xIiAKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9sb25nPX4wIiAicHJpbnQgdl91bnNpZ25lZF9sb25nIiAiLlxbMC05XF0qID0gJHVsb25nX21pbnVzXzEiICAgICAgICAic2V0IHZhcmlhYmxlIHVuc2lnbmVkIGxvbmc9fjAgKG1pbnVzKSIgCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yIHR5cGUgImZsb2F0IgorIwordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X2Zsb2F0PTAuMCIgInByaW50IHZfZmxvYXQiICIuXFswLTlcXSogPSAwIiAgICAgICAgInNldCB2YXJpYWJsZSBmbG9hdD0wIiAKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl9mbG9hdD0xLjAiICJwcmludCB2X2Zsb2F0IiAiLlxbMC05XF0qID0gMSIgICAgICAgICJzZXQgdmFyaWFibGUgZmxvYXQ9MSIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfZmxvYXQ9LTEuMCIgInByaW50IHZfZmxvYXQiICIuXFswLTlcXSogPSAtMSIgICAgICAgICJzZXQgdmFyaWFibGUgZmxvYXQ9LTEgKG1pbnVzKSIgCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yIHR5cGUgImRvdWJsZSIKKyMKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl9kb3VibGU9MC4wIiAicHJpbnQgdl9kb3VibGUiICIuXFswLTlcXSogPSAwIiAgICAgICAgInNldCB2YXJpYWJsZSBkb3VibGU9MCIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfZG91YmxlPTEuMCIgInByaW50IHZfZG91YmxlIiAiLlxbMC05XF0qID0gMSIgICAgICAgICJzZXQgdmFyaWFibGUgZG91YmxlPTEiIAordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X2RvdWJsZT0tMS4wIiAicHJpbnQgdl9kb3VibGUiICIuKi5cWzAtOVxdKiA9IC0xIiAgICAgICAgInNldCB2YXJpYWJsZSBkb3VibGU9LTEgKG1pbnVzKSIgCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yICJjaGFyIGFycmF5WzJdIgorIwordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X2NoYXJfYXJyYXlcWzBcXT0naCciICJzZXQgdmFyaWFibGUgdl9jaGFyX2FycmF5XFsxXF09J2knIiAicHJpbnQgdl9jaGFyX2FycmF5IiAiLiouXFswLTlcXSogPS4qXCJoaVwiIiAgICAgICAgInNldCB2YXJpYWJsZSBjaGFyIGFycmF5PVwiaGlcIiAoc3RyaW5nKSIgCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yICJzaWduZWQgY2hhciBhcnJheVsyXSIKKyMKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl9zaWduZWRfY2hhcl9hcnJheVxbMFxdPSdoJyIgInNldCB2YXJpYWJsZSB2X3NpZ25lZF9jaGFyX2FycmF5XFsxXF09J2knIiAicHJpbnQgdl9zaWduZWRfY2hhcl9hcnJheSIgIi4qLlxbMC05XF0qID0uKlwiaGlcIiIgICAgICAgICJzZXQgdmFyaWFibGUgc2lnbmVkIGNoYXIgYXJyYXk9XCJoaVwiIChzdHJpbmcpIiAKKyMKKyMgdGVzdCAic2V0IHZhcmlhYmxlIiBmb3IgInVuc2lnbmVkIGNoYXIgYXJyYXlbMl0iCisjCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfdW5zaWduZWRfY2hhcl9hcnJheVxbMFxdPSdoJyIgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX2NoYXJfYXJyYXlcWzFcXT0naSciICJwcmludCB2X3Vuc2lnbmVkX2NoYXJfYXJyYXkiICIuKi5cWzAtOVxdKiA9LipcImhpXCIiICAgICAgICAic2V0IHZhcmlhYmxlIHVuc2lnbmVkIGNoYXIgYXJyYXk9XCJoaVwiIChzdHJpbmcpIiAKKyMKKyMgdGVzdCAic2V0IHZhcmlhYmxlIiBmb3IgInNob3J0IGFycmF5WzJdIgorIwordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X3Nob3J0X2FycmF5XFswXF09MTIzIiAic2V0IHZhcmlhYmxlIHZfc2hvcnRfYXJyYXlcWzFcXT0tNDU2IiAicHJpbnQgdl9zaG9ydF9hcnJheSIgIi4qLlxbMC05XF0qID0uKlx7MTIzLC4qLTQ1Nlx9IiAgICAgICAgInNldCB2YXJpYWJsZSBzaG9ydCBhcnJheSIgCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yICJzaWduZWQgc2hvcnQgYXJyYXlbMl0iCisjCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX3Nob3J0X2FycmF5XFswXF09MTIzIiAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX3Nob3J0X2FycmF5XFsxXF09LTQ1NiIgInByaW50IHZfc2lnbmVkX3Nob3J0X2FycmF5IiAiLiouXFswLTlcXSogPS4qXHsxMjMsLiotNDU2XH0iICAgICAgICAic2V0IHZhcmlhYmxlIHNpZ25lZCBzaG9ydCBhcnJheSIgCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yICJ1bnNpZ25lZCBzaG9ydCBhcnJheVsyXSIKKyMKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9zaG9ydF9hcnJheVxbMFxdPTEyMyIgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX3Nob3J0X2FycmF5XFsxXF09LTQ1NiIgInByaW50IHZfdW5zaWduZWRfc2hvcnRfYXJyYXkiICIuKi5cWzAtOVxdKiA9LipcezEyMywuKjY1MDgwXH0iICAgICAgICAic2V0IHZhcmlhYmxlIHVuc2lnbmVkIHNob3J0IGFycmF5IiAKKyMKKyMgdGVzdCAic2V0IHZhcmlhYmxlIiBmb3IgImludCBhcnJheVsyXSIKKyMKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl9pbnRfYXJyYXlcWzBcXT0xMjMiICJzZXQgdmFyaWFibGUgdl9pbnRfYXJyYXlcWzFcXT0tNDU2IiAicHJpbnQgdl9pbnRfYXJyYXkiICIuKi5cWzAtOVxdKiA9LipcezEyMywuKi00NTZcfSIgICAgICAgICJzZXQgdmFyaWFibGUgaW50IGFycmF5IiAKKyMKKyMgdGVzdCAic2V0IHZhcmlhYmxlIiBmb3IgInNpZ25lZCBpbnQgYXJyYXlbMl0iCisjCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2ludF9hcnJheVxbMFxdPTEyMyIgInNldCB2YXJpYWJsZSB2X3NpZ25lZF9pbnRfYXJyYXlcWzFcXT0tNDU2IiAicHJpbnQgdl9zaWduZWRfaW50X2FycmF5IiAiLiouXFswLTlcXSogPS4qXHsxMjMsLiotNDU2XH0iICAgICAgICAic2V0IHZhcmlhYmxlIHNpZ25lZCBpbnQgYXJyYXkiIAorIworIyB0ZXN0ICJzZXQgdmFyaWFibGUiIGZvciAidW5zaWduZWQgaW50IGFycmF5WzJdIgorIwordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX2ludF9hcnJheVxbMFxdPTEyMyIgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX2ludF9hcnJheVxbMVxdPS00NTYiICJwcmludCB2X3Vuc2lnbmVkX2ludF9hcnJheSIgIi4qLlxbMC05XF0qID0uKlx7MTIzLC4qKDQyOTQ5NjY4NDB8NjUwODApXH0iICAgICAgICAic2V0IHZhcmlhYmxlIHVuc2lnbmVkIGludCBhcnJheSIgCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yICJsb25nIGFycmF5WzJdIgorIwordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X2xvbmdfYXJyYXlcWzBcXT0xMjMiICJzZXQgdmFyaWFibGUgdl9sb25nX2FycmF5XFsxXF09LTQ1NiIgInByaW50IHZfbG9uZ19hcnJheSIgIi4qLlxbMC05XF0qID0uKlx7MTIzLC4qLTQ1Nlx9IiAgICAgICAgInNldCB2YXJpYWJsZSBsb25nIGFycmF5IiAKKyMKKyMgdGVzdCAic2V0IHZhcmlhYmxlIiBmb3IgInNpZ25lZCBsb25nIGFycmF5WzJdIgorIwordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X3NpZ25lZF9sb25nX2FycmF5XFswXF09MTIzIiAic2V0IHZhcmlhYmxlIHZfc2lnbmVkX2xvbmdfYXJyYXlcWzFcXT0tNDU2IiAicHJpbnQgdl9zaWduZWRfbG9uZ19hcnJheSIgIi4qLlxbMC05XF0qID0uKlx7MTIzLC4qLTQ1Nlx9IiAgICAgICAgInNldCB2YXJpYWJsZSBzaWduZWQgbG9uZyBhcnJheSIgCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yICJ1bnNpZ25lZCBsb25nIGFycmF5WzJdIgorIwordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X3Vuc2lnbmVkX2xvbmdfYXJyYXlcWzBcXT0xMjMiICJzZXQgdmFyaWFibGUgdl91bnNpZ25lZF9sb25nX2FycmF5XFsxXF09LTQ1NiIgInByaW50IHZfdW5zaWduZWRfbG9uZ19hcnJheSIgIi4qLlxbMC05XF0qID0uKlx7MTIzLC4qJHVsb25nX21pbnVzXzQ1Nlx9IiAgICAgICAgInNldCB2YXJpYWJsZSB1bnNpZ25lZCBsb25nIGFycmF5IiAKKyMKKyMgdGVzdCAic2V0IHZhcmlhYmxlIiBmb3IgImZsb2F0IGFycmF5WzJdIgorIwordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X2Zsb2F0X2FycmF5XFswXF09MTIzLjAiICJzZXQgdmFyaWFibGUgdl9mbG9hdF9hcnJheVxbMVxdPS00NTYuMCIgInByaW50IHZfZmxvYXRfYXJyYXkiICIuKi5cWzAtOVxdKiA9LipcezEyMywuKi00NTZcfSIgICAgICAgICJzZXQgdmFyaWFibGUgZmxvYXQgYXJyYXkiIAorIworIyB0ZXN0ICJzZXQgdmFyaWFibGUiIGZvciAiZG91YmxlIGFycmF5WzJdIgorIwordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X2RvdWJsZV9hcnJheVxbMFxdPTEyMy4wIiAic2V0IHZhcmlhYmxlIHZfZG91YmxlX2FycmF5XFsxXF09LTQ1Ni4wIiAicHJpbnQgdl9kb3VibGVfYXJyYXkiICIuKi5cWzAtOVxdKiA9LipcezEyMywuKi00NTZcfSIgICAgICAgICJzZXQgdmFyaWFibGUgZG91YmxlIGFycmF5IiAKKyMKKyMgdGVzdCAic2V0IHZhcmlhYmxlIiBmb3IgdHlwZSAiY2hhciAqIgorIwordGVzdF9zZXQgInNldCB2X2NoYXJfcG9pbnRlcj12X2NoYXJfYXJyYXkiICJzZXQgdmFyaWFibGUgKih2X2NoYXJfcG9pbnRlcik9J2gnIiAic2V0IHZhcmlhYmxlICoodl9jaGFyX3BvaW50ZXIrMSk9J2knIiAicHJpbnQgdl9jaGFyX2FycmF5IiAiLiouXFswLTlcXSogPS4qXCJoaVwiIiAgInByaW50ICoodl9jaGFyX3BvaW50ZXIrMSkiICIuKi5cWzAtOVxdKiA9IDEwNSBcJ2lcJyIgICAgICJzZXQgdmFyaWFibGUgY2hhciBwb2ludGVyPVwiaGlcIiAoc3RyaW5nKSIgCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yIHR5cGUgInNpZ25lZCBjaGFyICoiCisjCit0ZXN0X3NldCAic2V0IHZfc2lnbmVkX2NoYXJfcG9pbnRlcj12X3NpZ25lZF9jaGFyX2FycmF5IiAic2V0IHZhcmlhYmxlICoodl9zaWduZWRfY2hhcl9wb2ludGVyKT0naCciICJzZXQgdmFyaWFibGUgKih2X3NpZ25lZF9jaGFyX3BvaW50ZXIrMSk9J2knIiAicHJpbnQgdl9zaWduZWRfY2hhcl9hcnJheSIgIi4qLlxbMC05XF0qID0uKlwiaGlcIiIgICJwcmludCAqKHZfc2lnbmVkX2NoYXJfcG9pbnRlcisxKSIgIi4qLlxbMC05XF0qID0gMTA1IFwnaVwnIiAgICAgInNldCB2YXJpYWJsZSBzaWduZWQgY2hhciBwb2ludGVyPVwiaGlcIiAoc3RyaW5nKSIgCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yIHR5cGUgInVuc2lnbmVkIGNoYXIgKiIKKyMKK3Rlc3Rfc2V0ICJzZXQgdl91bnNpZ25lZF9jaGFyX3BvaW50ZXI9dl91bnNpZ25lZF9jaGFyX2FycmF5IiAic2V0IHZhcmlhYmxlICoodl91bnNpZ25lZF9jaGFyX3BvaW50ZXIpPSdoJyIgInNldCB2YXJpYWJsZSAqKHZfdW5zaWduZWRfY2hhcl9wb2ludGVyKzEpPSdpJyIgInByaW50IHZfdW5zaWduZWRfY2hhcl9hcnJheSIgIi4qLlxbMC05XF0qID0uKlwiaGlcIiIgICJwcmludCAqKHZfdW5zaWduZWRfY2hhcl9wb2ludGVyKzEpIiAiLiouXFswLTlcXSogPSAxMDUgXCdpXCciICAgICAic2V0IHZhcmlhYmxlIHVuc2lnbmVkIGNoYXIgcG9pbnRlcj1cImhpXCIgKHN0cmluZykiIAorIworIyB0ZXN0ICJzZXQgdmFyaWFibGUiIGZvciB0eXBlICJzaG9ydCAqIgorIwordGVzdF9zZXQgInNldCB2X3Nob3J0X3BvaW50ZXI9dl9zaG9ydF9hcnJheSIgInNldCB2YXJpYWJsZSAqKHZfc2hvcnRfcG9pbnRlcik9MTIzIiAic2V0IHZhcmlhYmxlICoodl9zaG9ydF9wb2ludGVyKzEpPS00NTYiICJwcmludCB2X3Nob3J0X2FycmF5IiAiLiouXFswLTlcXSogPS4qXHsxMjMsLiotNDU2XH0iICAicHJpbnQgKih2X3Nob3J0X3BvaW50ZXIrMSkiICIuKi5cWzAtOVxdKiA9IC00NTYiICAgICAic2V0IHZhcmlhYmxlIHNob3J0IHBvaW50ZXIiIAorIworIyB0ZXN0ICJzZXQgdmFyaWFibGUiIGZvciB0eXBlICJzaWduZWQgc2hvcnQgKiIKKyMKK2dkYl90ZXN0ICJzZXQgdl9zaWduZWRfc2hvcnRfcG9pbnRlcj12X3NpZ25lZF9zaG9ydF9hcnJheSIgIiIKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgKih2X3NpZ25lZF9zaG9ydF9wb2ludGVyKT0xMjMiICIiCitnZGJfdGVzdCAic2V0IHZhcmlhYmxlICoodl9zaWduZWRfc2hvcnRfcG9pbnRlcisxKT0tNDU2IiAiIgorZ2RiX3Rlc3QgInByaW50IHZfc2lnbmVkX3Nob3J0X2FycmF5IiAiLlxbMC05XF0qID0uKlx7MTIzLC4qLTQ1Nlx9IiBcCisgICAgInNldCB2YXJpYWJsZSBzaWduZWQgc2hvcnQgcG9pbnRlciIKK2dkYl90ZXN0ICJwcmludCAqKHZfc2lnbmVkX3Nob3J0X3BvaW50ZXIrMSkiICIuXFswLTlcXSouKj0uKi00NTYiCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yIHR5cGUgInVuc2lnbmVkIHNob3J0ICoiCisjCitnZGJfdGVzdCAic2V0IHZfdW5zaWduZWRfc2hvcnRfcG9pbnRlcj12X3Vuc2lnbmVkX3Nob3J0X2FycmF5IiAiIgorZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSAqKHZfdW5zaWduZWRfc2hvcnRfcG9pbnRlcik9MTIzIiAiIgorZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSAqKHZfdW5zaWduZWRfc2hvcnRfcG9pbnRlcisxKT0tNDU2IiAiIgorZ2RiX3Rlc3QgInByaW50IHZfdW5zaWduZWRfc2hvcnRfYXJyYXkiICIuXFswLTlcXSogPS4qXHsxMjMsLio2NTA4MFx9IiBcCisgICAgInNldCB2YXJpYWJsZSB1bnNpZ25lZCBzaG9ydCBwb2ludGVyIgorZ2RiX3Rlc3QgInByaW50ICoodl91bnNpZ25lZF9zaG9ydF9wb2ludGVyKzEpIiAiLlxbMC05XF0qID0gNjUwODAiCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yIHR5cGUgImludCAqIgorIwordGVzdF9zZXQgInNldCB2X2ludF9wb2ludGVyPXZfaW50X2FycmF5IiAic2V0IHZhcmlhYmxlICoodl9pbnRfcG9pbnRlcik9MTIzIiAic2V0IHZhcmlhYmxlICoodl9pbnRfcG9pbnRlcisxKT0tNDU2IiAicHJpbnQgdl9pbnRfYXJyYXkiICIuKi5cWzAtOVxdKiA9LipcezEyMywuKi00NTZcfSIgICJwcmludCAqKHZfaW50X3BvaW50ZXIrMSkiICIuKi5cWzAtOVxdKiA9IC00NTYiICAgICAic2V0IHZhcmlhYmxlIGludCBwb2ludGVyIiAKKyMKKyMgdGVzdCAic2V0IHZhcmlhYmxlIiBmb3IgdHlwZSAic2lnbmVkIGludCAqIgorIwordGVzdF9zZXQgInNldCB2X3NpZ25lZF9pbnRfcG9pbnRlcj12X3NpZ25lZF9pbnRfYXJyYXkiICJzZXQgdmFyaWFibGUgKih2X3NpZ25lZF9pbnRfcG9pbnRlcik9MTIzIiAic2V0IHZhcmlhYmxlICoodl9zaWduZWRfaW50X3BvaW50ZXIrMSk9LTQ1NiIgInByaW50IHZfc2lnbmVkX2ludF9hcnJheSIgIi4qLlxbMC05XF0qID0uKlx7MTIzLC4qLTQ1Nlx9IiAgInByaW50ICoodl9zaWduZWRfaW50X3BvaW50ZXIrMSkiICIuKi5cWzAtOVxdKiA9IC00NTYiICAgICAic2V0IHZhcmlhYmxlIHNpZ25lZCBpbnQgcG9pbnRlciIgCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yIHR5cGUgInVuc2lnbmVkIGludCAqIgorIwordGVzdF9zZXQgInNldCB2X3Vuc2lnbmVkX2ludF9wb2ludGVyPXZfdW5zaWduZWRfaW50X2FycmF5IiAic2V0IHZhcmlhYmxlICoodl91bnNpZ25lZF9pbnRfcG9pbnRlcik9MTIzIiAic2V0IHZhcmlhYmxlICoodl91bnNpZ25lZF9pbnRfcG9pbnRlcisxKT0tNDU2IiAicHJpbnQgdl91bnNpZ25lZF9pbnRfYXJyYXkiICIuKi5cWzAtOVxdKiA9LipcezEyMywuKig0Mjk0OTY2ODQwfDY1MDgwKVx9IiAic2V0IHZhcmlhYmxlIHVuc2lnbmVkIGludCBwb2ludGVyIgordGVzdF9zZXQgIiIgInByaW50ICoodl91bnNpZ25lZF9pbnRfcG9pbnRlcisxKSIgIi4qLlxbMC05XF0qID0gKDQyOTQ5NjY4NDB8NjUwODApIiAgICAgInByaW50IHZhcmlhYmxlIHVuc2lnbmVkIGludCBwb2ludGVyKzEiCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yIHR5cGUgImxvbmcgKiIKKyMKK3Rlc3Rfc2V0ICJzZXQgdl9sb25nX3BvaW50ZXI9dl9sb25nX2FycmF5IiAic2V0IHZhcmlhYmxlICoodl9sb25nX3BvaW50ZXIpPTEyMyIgInNldCB2YXJpYWJsZSAqKHZfbG9uZ19wb2ludGVyKzEpPS00NTYiICJwcmludCB2X2xvbmdfYXJyYXkiICIuKi5cWzAtOVxdKiA9LipcezEyMywuKi00NTZcfSIgICJwcmludCAqKHZfbG9uZ19wb2ludGVyKzEpIiAiLiouXFswLTlcXSogPSAtNDU2IiAgICAgInNldCB2YXJpYWJsZSBsb25nIHBvaW50ZXIiIAorIworIyB0ZXN0ICJzZXQgdmFyaWFibGUiIGZvciB0eXBlICJzaWduZWQgbG9uZyAqIgorIwordGVzdF9zZXQgInNldCB2X3NpZ25lZF9sb25nX3BvaW50ZXI9dl9zaWduZWRfbG9uZ19hcnJheSIgInNldCB2YXJpYWJsZSAqKHZfc2lnbmVkX2xvbmdfcG9pbnRlcik9MTIzIiAic2V0IHZhcmlhYmxlICoodl9zaWduZWRfbG9uZ19wb2ludGVyKzEpPS00NTYiICJwcmludCB2X3NpZ25lZF9sb25nX2FycmF5IiAiLiouXFswLTlcXSogPS4qXHsxMjMsLiotNDU2XH0iICAicHJpbnQgKih2X3NpZ25lZF9sb25nX3BvaW50ZXIrMSkiICIuKi5cWzAtOVxdKiA9IC00NTYiICAgICAic2V0IHZhcmlhYmxlIHNpZ25lZCBsb25nIHBvaW50ZXIiIAorIworIyB0ZXN0ICJzZXQgdmFyaWFibGUiIGZvciB0eXBlICJ1bnNpZ25lZCBsb25nICoiCisjCit0ZXN0X3NldCAic2V0IHZfdW5zaWduZWRfbG9uZ19wb2ludGVyPXZfdW5zaWduZWRfbG9uZ19hcnJheSIgInNldCB2YXJpYWJsZSAqKHZfdW5zaWduZWRfbG9uZ19wb2ludGVyKT0xMjMiICJzZXQgdmFyaWFibGUgKih2X3Vuc2lnbmVkX2xvbmdfcG9pbnRlcisxKT0tNDU2IiAicHJpbnQgdl91bnNpZ25lZF9sb25nX2FycmF5IiAiLiouXFswLTlcXSogPS4qXHsxMjMsLiokdWxvbmdfbWludXNfNDU2XH0iICAicHJpbnQgKih2X3Vuc2lnbmVkX2xvbmdfcG9pbnRlcisxKSIgIi4qLlxbMC05XF0qID0gJHVsb25nX21pbnVzXzQ1NiIgICAgICJzZXQgdmFyaWFibGUgdW5zaWduZWQgbG9uZyBwb2ludGVyIiAKKyMKKyMgdGVzdCAic2V0IHZhcmlhYmxlIiBmb3IgdHlwZSAiZmxvYXQgKiIKKyMKK3Rlc3Rfc2V0ICJzZXQgdl9mbG9hdF9wb2ludGVyPXZfZmxvYXRfYXJyYXkiICJzZXQgdmFyaWFibGUgKih2X2Zsb2F0X3BvaW50ZXIpPTEyMy4wIiAic2V0IHZhcmlhYmxlICoodl9mbG9hdF9wb2ludGVyKzEpPS00NTYuMCIgInByaW50IHZfZmxvYXRfYXJyYXkiICIuKi5cWzAtOVxdKiA9LipcezEyMywuKi00NTZcfSIgICJwcmludCAqKHZfZmxvYXRfcG9pbnRlcisxKSIgIi4qLlxbMC05XF0qID0gLTQ1NiIgICAgICJzZXQgdmFyaWFibGUgZmxvYXQgcG9pbnRlciIgCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yIHR5cGUgImRvdWJsZSAqIgorIwordGVzdF9zZXQgInNldCB2X2RvdWJsZV9wb2ludGVyPXZfZG91YmxlX2FycmF5IiAic2V0IHZhcmlhYmxlICoodl9kb3VibGVfcG9pbnRlcik9MTIzLjAiICJzZXQgdmFyaWFibGUgKih2X2RvdWJsZV9wb2ludGVyKzEpPS00NTYuMCIgInByaW50IHZfZG91YmxlX2FycmF5IiAiLiouXFswLTlcXSogPS4qXHsxMjMsLiotNDU2XH0iICAicHJpbnQgKih2X2RvdWJsZV9wb2ludGVyKzEpIiAiLiouXFswLTlcXSogPSAtNDU2IiAgICAgInNldCB2YXJpYWJsZSBkb3VibGUgcG9pbnRlciIgCisjCisjIHRlc3QgInNldCB2YXJpYWJsZSIgZm9yIHN0cnVjdCBtZW1iZXJzCisjCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfc3RydWN0MS52X2NoYXJfbWVtYmVyPSdoJyIgInByaW50IHZfc3RydWN0MS52X2NoYXJfbWVtYmVyIiAiLiouXFswLTlcXSogPSAxMDQgXCdoXCciICAgICAgICAic2V0IHZhcmlhYmxlIHN0cnVjdHVyZSBjaGFyIG1lbWJlciIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfc3RydWN0MS52X3Nob3J0X21lbWJlcj0xIiAicHJpbnQgdl9zdHJ1Y3QxLnZfc2hvcnRfbWVtYmVyIiAiLiouXFswLTlcXSogPSAxIiAgICAgICAgInNldCB2YXJpYWJsZSBzdHJ1Y3R1cmUgc2hvcnQgbWVtYmVyIiAKK3Rlc3Rfc2V0ICJzZXQgdmFyaWFibGUgdl9zdHJ1Y3QxLnZfaW50X21lbWJlcj0yIiAicHJpbnQgdl9zdHJ1Y3QxLnZfaW50X21lbWJlciIgIi4qLlxbMC05XF0qID0gMiIgICAgICAgICJzZXQgdmFyaWFibGUgc3RydWN0dXJlIGludCBtZW1iZXIiIAordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X3N0cnVjdDEudl9sb25nX21lbWJlcj0zIiAicHJpbnQgdl9zdHJ1Y3QxLnZfbG9uZ19tZW1iZXIiICIuKi5cWzAtOVxdKiA9IDMiICAgICAgICAic2V0IHZhcmlhYmxlIHN0cnVjdHVyZSBsb25nIG1lbWJlciIgCit0ZXN0X3NldCAic2V0IHZhcmlhYmxlIHZfc3RydWN0MS52X2Zsb2F0X21lbWJlcj00LjAiICJwcmludCB2X3N0cnVjdDEudl9mbG9hdF9tZW1iZXIiICIuKi5cWzAtOVxdKiA9IDQiICAgICAgICAic2V0IHZhcmlhYmxlIHN0cnVjdHVyZSBmbG9hdCBtZW1iZXIiIAordGVzdF9zZXQgInNldCB2YXJpYWJsZSB2X3N0cnVjdDEudl9kb3VibGVfbWVtYmVyPTUuMCIgInByaW50IHZfc3RydWN0MS52X2RvdWJsZV9tZW1iZXIiICIuKi5cWzAtOVxdKiA9IDUiICAgICAgICAic2V0IHZhcmlhYmxlIHN0cnVjdHVyZSBkb3VibGUgbWVtYmVyIiAKKworZ2RiX3Rlc3QgInByaW50IHZfc3RydWN0MSIgXAorICAiLiouXFswLTlcXSogPSBcey4qdl9jaGFyX21lbWJlciA9IDEwNCBcJ2hcJywuKnZfc2hvcnRfbWVtYmVyID0gMSxcCisuKnZfaW50X21lbWJlciA9IDIsLipcCit2X2xvbmdfbWVtYmVyID0gMywuKnZfZmxvYXRfbWVtYmVyID0gNCwuKnZfZG91YmxlX21lbWJlciA9IDUuKlx9IiBcCisgICJzZXQgcHJpbnQgc3RydWN0dXJlICMxIgorCisjIFRoaXMgc2hvdWxkIGJlIGFuIGVycm9yLiAgR0NDIGV4dGVuc2lvbnMgZm9yIHN0cnVjdHVyZSBjb25zdGFudHMgcmVxdWlyZQorIyB0aGUgdHlwZSBvZiB0aGUgc3RydWN0dXJlIHRvIGJlIHNwZWNpZmllZCwgYXMgaW4KKyMgdl9zdHJ1Y3QxID0gKHN0cnVjdCB0X3N0cnVjdCkgezMyLCAzMywgMzQsIDM1LCAzNiwgMzd9CisjIEdEQiBzaG91bGQgZG8gdGhlIHNhbWUgaWYgaXQgd2FudHMgdG8gcHJvdmlkZSB0aGlzIGZlYXR1cmUuCitpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYixjYW5ub3RfY2FsbF9mdW5jdGlvbnNdIHsKKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiIDI0MTYKKyAgICBmYWlsICJzZXQgdmFyaWFibGUgdl9zdHJ1Y3QxID0gezMyLCAzMywgMzQsIDM1LCAzNiwgMzd9IgorICAgIGNvbnRpbnVlCit9CitnZGJfdGVzdCAic2V0IHZhcmlhYmxlIHZfc3RydWN0MSA9IHszMiwgMzMsIDM0LCAzNSwgMzYsIDM3fSIgIkludmFsaWQuKiIKKworIyBBbmQgYWZ0ZXIgdGhlIGVycm9yIHRoZSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHVuY2hhbmdlZC4KK2dkYl90ZXN0ICJwcmludCB2X3N0cnVjdDEiIFwKKyAgIi4qLlxbMC05XF0qID0gXHsuKnZfY2hhcl9tZW1iZXIgPSAxMDQgXCdoXCcsLip2X3Nob3J0X21lbWJlciA9IDEsXAorLip2X2ludF9tZW1iZXIgPSAyLC4qXAordl9sb25nX21lbWJlciA9IDMsLip2X2Zsb2F0X21lbWJlciA9IDQsLip2X2RvdWJsZV9tZW1iZXIgPSA1LipcfSIgXAorICAic2V0IHByaW50IHN0cnVjdHVyZSAjMiIKKworIyBUZXN0IHByaW50aW5nIG9mIGVudW1lcmF0aW9uIGJpdGZpZWxkcy4KKyMgR05VIEMgc3VwcG9ydHMgdGhlbSwgc29tZSBvdGhlciBjb21waWxlcnMgZG9uJ3QuCisKK2lmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsKKyAgICBnZGJfdGVzdCAicHJpbnQgc2VmLmZpZWxkPXNtMSIgIi4qLlxbMC05XF0qID0gc20xIgorICAgIGdkYl90ZXN0ICJwcmludCBzZWYuZmllbGQiICIuKi5cWzAtOVxdKiA9IHNtMSIgInByaW50IHNlZi5maWVsZCAoc20xKSIKKyAgICBnZGJfdGVzdCAicHJpbnQgc2VmLmZpZWxkPXMxIiAiLiouXFswLTlcXSogPSBzMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgc2VmLmZpZWxkIiAiLiouXFswLTlcXSogPSBzMSIgInByaW50IHNlZi5maWVsZCAoczEpIgorICAgIGdkYl90ZXN0ICJwcmludCB1ZWYuZmllbGQ9dTIiICIuKi5cWzAtOVxdKiA9IHUyIgorICAgIGdkYl90ZXN0ICJwcmludCB1ZWYuZmllbGQiICIuKi5cWzAtOVxdKiA9IHUyIiAicHJpbnQgdWVmLmZpZWxkICh1MikiCisgICAgZ2RiX3Rlc3QgInByaW50IHVlZi5maWVsZD11MSIgIi4qLlxbMC05XF0qID0gdTEiCisgICAgZ2RiX3Rlc3QgInByaW50IHVlZi5maWVsZCIgIi4qLlxbMC05XF0qID0gdTEiICJwcmludCB1ZWYuZmllbGQgKHUxKSIKKworICAgICMgVGVzdCBmb3IgdHJ1bmNhdGlvbiB3aGVuIGFzc2lnbmluZyBpbnZhbGlkIHZhbHVlcyB0byBiaXRmaWVsZHMuCisgICAgZ2RiX3Rlc3QgInByaW50IHNlZi5maWVsZD03IiBcCisJIi4qd2FybmluZzogVmFsdWUgZG9lcyBub3QgZml0IGluIDIgYml0cy4qXFswLTlcXSogPSBzbTEiCisgICAgZ2RiX3Rlc3QgInByaW50IHVlZi5maWVsZD02IiBcCisJIi4qd2FybmluZzogVmFsdWUgZG9lcyBub3QgZml0IGluIDIgYml0cy4qXFswLTlcXSogPSB1MiIKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc2hsaWItY2FsbC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NobGliLWNhbGwuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNGQ3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NobGliLWNhbGwuZXhwCkBAIC0wLDAgKzEsMjU4IEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIGZpbGUgdG8gdGVzdCBjYWxscyBpbnRvIHNoYXJlZCBsaWJyYXJpZXMKKyMgdGhlIHNvdXJjZSBmaWxlcyBmb3IgdGhpcyB0ZXN0IGFyZToKKyMKKyMgc2htYWluLmMKKyMgc2hyMS5jIChzaGFyZWQgbGliKQorIyBzaHIyLmMgKHNoYXJlZCBsaWIpCisjIHNzLmggKGhlYWRlciBmb3Igc2hyMi5jKQorIworIyBmaWxlIHdyaXR0ZW4gYnkgRWxlbmEgWmFubm9uaTogZWx6QGNoLmFwb2xsby5jb20KKyMKKworI2RlYnVnIHNobWFpbgorI3Byb3AgbGliIHNocjEuc2wKKyNwcm9wIGxpYiBzaHIyLnNsCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgICAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKKyMgYXJlIHdlIG9uIGEgdGFyZ2V0IGJvYXJkPworaWYgIVtpc25hdGl2ZV0gdGhlbiB7CisgICAgcmV0dXJuIDAKK30KKworc2V0IHRlc3RmaWxlICJzaG1haW4iCitzZXQgbGliZmlsZSAic2hyIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCisjIGJ1aWxkIHRoZSBmaXJzdCB0ZXN0IGNhc2UKK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9XSB7CisgICAgcmV0dXJuIC0xCit9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfS5vIiBvYmplY3Qge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisKKyMgQnVpbGQgdGhlIHNoYXJlZCBsaWJyYXJpZXMgdGhpcyB0ZXN0IGNhc2UgbmVlZHMuCisjCisKK2lmIHskZ2NjX2NvbXBpbGVkID09IDB9IHsKKyAgICBpZiBbaXN0YXJnZXQgImhwcGEqLWhwLWhwdXgqIl0gdGhlbiB7CisJc2V0IGFkZGl0aW9uYWxfZmxhZ3MgImFkZGl0aW9uYWxfZmxhZ3M9K3oiCisgICAgfSBlbHNlIHsKKwkjIGRvbid0IGtub3cgd2hhdCB0aGUgY29tcGlsZXIgaXMuLi4KKwlzZXQgYWRkaXRpb25hbF9mbGFncyAiIgorICAgIH0KK30gZWxzZSB7CisgICAgc2V0IGFkZGl0aW9uYWxfZmxhZ3MgImFkZGl0aW9uYWxfZmxhZ3M9LWZwaWMiCit9CisKK2lmIHtbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtsaWJmaWxlfTEuYyIgIiR7b2JqZGlyfS8ke3N1YmRpcn0vJHtsaWJmaWxlfTEubyIgb2JqZWN0IFtsaXN0IGRlYnVnICRhZGRpdGlvbmFsX2ZsYWdzXV0gIT0gIiJ9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKK2lmIHtbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtsaWJmaWxlfTIuYyIgIiR7b2JqZGlyfS8ke3N1YmRpcn0vJHtsaWJmaWxlfTIubyIgb2JqZWN0IFtsaXN0IGRlYnVnICRhZGRpdGlvbmFsX2ZsYWdzXV0gIT0gIiJ9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKK2lmIFtpc3RhcmdldCAiaHBwYSotKi1ocHV4KiJdIHsKKyAgICByZW1vdGVfZXhlYyBidWlsZCAibGQgLWIgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke2xpYmZpbGV9MS5vIC1vICR7b2JqZGlyfS8ke3N1YmRpcn0vJHtsaWJmaWxlfTEuc2wiCisgICAgcmVtb3RlX2V4ZWMgYnVpbGQgImxkIC1iICR7b2JqZGlyfS8ke3N1YmRpcn0vJHtsaWJmaWxlfTIubyAtbyAke29iamRpcn0vJHtzdWJkaXJ9LyR7bGliZmlsZX0yLnNsIgorfSBlbHNlIHsKKyAgICBzZXQgYWRkaXRpb25hbF9mbGFncyAiYWRkaXRpb25hbF9mbGFncz0tc2hhcmVkIgorICAgIGlmIHtbZ2RiX2NvbXBpbGUgIiR7b2JqZGlyfS8ke3N1YmRpcn0vJHtsaWJmaWxlfTEubyIgIiR7b2JqZGlyfS8ke3N1YmRpcn0vJHtsaWJmaWxlfTEuc2wiIGV4ZWN1dGFibGUgW2xpc3QgZGVidWcgJGFkZGl0aW9uYWxfZmxhZ3NdXSAhPSAiIn0geworCWdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorICAgIH0KKyAgICBpZiB7W2dkYl9jb21waWxlICIke29iamRpcn0vJHtzdWJkaXJ9LyR7bGliZmlsZX0yLm8iICIke29iamRpcn0vJHtzdWJkaXJ9LyR7bGliZmlsZX0yLnNsIiBleGVjdXRhYmxlIFtsaXN0IGRlYnVnICRhZGRpdGlvbmFsX2ZsYWdzXV0gIT0gIiJ9IHsKKwlnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKKyAgICB9Cit9CitpZiB7W2dkYl9jb21waWxlICIke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9Lm8gJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke2xpYmZpbGV9MS5zbCAke29iamRpcn0vJHtzdWJkaXJ9LyR7bGliZmlsZX0yLnNsIiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWd9XSAhPSAiIn0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworCisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CitzZW5kX2dkYiAic2V0IHByaW50IHNldmVuYml0LXN0cmluZ3NcbiIgOyBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKK3NlbmRfZ2RiICJzZXQgcHJpbnQgYWRkcmVzcyBvZmZcbiIgOyBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKK3NlbmRfZ2RiICJzZXQgd2lkdGggMFxuIiA7IGdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIgorCisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgICAgIHBlcnJvciAiQyBmdW5jdGlvbiBjYWxsaW5nIHRlc3RzIHN1cHByZXNzZWQiCit9CisKKworI3N0ZXAgLW92ZXIKKworICAgIHNlbmRfZ2RiICJuZXh0XG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAiLipnID0gc2hyMVxcKGdcXCkuKiRnZGJfcHJvbXB0ICQiIHtwYXNzICJuZXh0IHRvIHNocjIifQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJuZXh0IHRvIHNocjIiIH0KKyAgICAgICAgdGltZW91dCB7IGZhaWwgIm5leHQgdG8gc2hyMiAodGltZW91dCkiIH0KKyAgICB9CisKKworCisjcHJpbnQgZworCitzZW5kX2dkYiAicHJpbnQgZ1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKlxbMC05XF0qID0gMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBnIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50ICBnIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgZyIgfQorICB9CisKKworI3N0ZXAgLW92ZXIKKyAgICBzZW5kX2dkYiAibmV4dFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIi4qYWRkcmVzcyBvZiBzZ3MgaXMgJGhleC4qZyA9IHNocjJcXChnXFwpLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgcGFzcyAibmV4dCBvdmVyIHNocjEiIH0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibmV4dCBvdmVyIHNocjEiIH0KKyAgICAgICAgdGltZW91dCB7IGZhaWwgIm5leHQgb3ZlciBzaHIxICh0aW1lb3V0KSIgfQorICAgIH0KKworI3ByaW50IGcKK3NlbmRfZ2RiICJwcmludCBnXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qXFswLTlcXSogPSAyLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IGciIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCAgZyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGciIH0KKyAgfQorCisjcHJpbnQgc2hyMSgxKQorc2VuZF9nZGIgInByaW50IHNocjEoMSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiphZGRyZXNzIG9mIHNncyBpcyAkaGV4LipcWzAtOVxdKiA9IDIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgc2hyMSgxKSIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50ICBzaHIxKDEpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgc2hyMSgxKSIgfQorICB9CisKKyNwcmludCBzaHIxKGcpCitzZW5kX2dkYiAicHJpbnQgc2hyMShnKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKmFkZHJlc3Mgb2Ygc2dzIGlzICRoZXguKlxbMC05XF0qID0gNC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBzaHIxKGcpIiB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgIHNocjEoZykiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBzaHIxKGcpIiB9CisgIH0KKworI2JyZWFrIHNocjIKKyNnbworZ2RiX3Rlc3QgImJyZWFrIHNocjIiIFwKKyAgICAiQnJlYWtwb2ludC4qZmlsZS4qc2hyMi5jLCBsaW5lLioiIFwKKyAgICAiYnJlYWtwb2ludCBmdW5jdGlvbiBzaHIyIgorCitnZGJfdGVzdCBjb250aW51ZSAiQ29udGludWluZ1xcLi4qQnJlYWtwb2ludCBcWzAtOVxdKywgc2hyMiBcXCguKlxcKSBhdC4qc2hyMlxcLmM6My4qMy4qcmV0dXJuIDIueDsiIFwKKyJydW4gdW50aWwgYnJlYWtwb2ludCBzZXQgYXQgYSBmdW5jdGlvbiIKKworCisjcHJpbnQgc2hyMSgxKQorc2VuZF9nZGIgInByaW50IHNocjEoMSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiphZGRyZXNzIG9mIHNncyBpcyAkaGV4LipcWzAtOVxdKiA9IDIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgc2hyMSgxKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCAgc2hyMSgxKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHNocjEoMSkiIH0KKyAgfQorCisjcHJpbnQgbWFpbnNocjEoMSkKK3NlbmRfZ2RiICJwcmludCBtYWluc2hyMSgxKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKlxbMC05XF0qID0gMi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBtYWluc2hyMSgxKSBmcm9tIHNobGliIGZ1bmMiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgIG1haW5zaHIxKDEpIGZyb20gc2hsaWIgZnVuYyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IG1haW5zaHIxKDEpIGZyb20gc2hsaWIgZnVuYyIgfQorICB9CisKKyNzdGVwIC1yZXR1cm4KKyAgICBzZW5kX2dkYiAic3RlcFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIi4qXFxcfS4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJzdGVwIGluc2lkZSBzaHIyIChzaGxpYiBmdW5jKSJ9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInN0ZXAgaW5zaWRlIHNocjIgKHNobGliIGZ1bmMpIiB9CisgICAgICAgIHRpbWVvdXQgeyBmYWlsICJzdGVwIGluc2lkZSBzaHIyIChzaGxpYiBmdW5jKSAodGltZW91dCkiIH0KKyAgICB9CisgICAgCisgICAgc2VuZF9nZGIgInN0ZXBcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJtYWluIFxcKFxcKSBhdC4qZyA9IG1haW5zaHIxXFwoZ1xcKTsuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAic3RlcCBvdXQgb2Ygc2hyMiB0byBtYWluIn0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic3RlcCBvdXQgb2Ygc2hyMiB0byBtYWluIiB9CisgICAgICAgIHRpbWVvdXQgeyBmYWlsICJzdGVwIG91dCBvZiBzaHIyIHRvIG1haW4gKHRpbWVvdXQpIiB9CisgICAgfQorCisjcHJpbnQgbWFpbnNocjEoMSkKK3NlbmRfZ2RiICJwcmludCBtYWluc2hyMSgxKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKlxbMC05XF0qID0gMi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBtYWluc2hyMSgxKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCAgbWFpbnNocjEoMSkgZnJvbSBtYWluIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgbWFpbnNocjEoMSkgZnJvbSBtYWluIiB9CisgIH0KKworI3N0ZXAKKyAgICBzZW5kX2dkYiAic3RlcFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIi4qbWFpbnNocjEgXFwoZz00XFwpIGF0LipyZXR1cm4gMi5nOy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJzdGVwIGludG8gbWFpbnNocjEifQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJzdGVwIGludG8gbWFpbnNocjEiIH0KKyAgICAgICAgdGltZW91dCB7IGZhaWwgInN0ZXAgaW50byBtYWluc2hyMSAodGltZW91dCkiIH0KKyAgICB9CisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CitzZW5kX2dkYiAic2V0IHByaW50IHNldmVuYml0LXN0cmluZ3NcbiIgOyBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKK3NlbmRfZ2RiICJzZXQgcHJpbnQgYWRkcmVzcyBvZmZcbiIgOyBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKK3NlbmRfZ2RiICJzZXQgd2lkdGggMFxuIiA7IGdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIgorCisjIFBSJ3MgMTY0OTUsIDE4MjEzCisjIHRlc3QgdGhhdCB3ZSBjYW4gcmUtc2V0IGJyZWFrcG9pbnRzIGluIHNoYXJlZCBsaWJyYXJpZXMKK2dkYl90ZXN0ICJicmVhayBzaHIxIiAiQnJlYWtwb2ludCAxIGF0IC4qIiAic2V0IGJwIGluIHNoYXJlZCBsaWJyYXJ5IgorZ2RiX3Rlc3QgInJ1biIgIlN0YXJ0aW5nIHByb2dyYW06LipCcmVha3BvaW50IDEsLioiICJydW4gdG8gYnAgaW4gc2hhcmVkIGxpYnJhcnkiCitnZGJfdGVzdCAiY29udCIgIlByb2dyYW0gZXhpdGVkIG5vcm1hbGx5LiIKK2dkYl90ZXN0ICJydW4iICJTdGFydGluZyBwcm9ncmFtOi4qQnJlYWtwb2ludCAxLC4qIiAicmUtcnVuIHRvIGJwIGluIHNoYXJlZCBsaWJyYXJ5IChQUidzIDE2NDk1LCAxODIxMykiCitnZGJfdGVzdCAiY29udCIgIlByb2dyYW0gZXhpdGVkIG5vcm1hbGx5LiIKKworcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc2htYWluLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NobWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYTUwOTEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NobWFpbi5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIEEgdGVzdCAqLworCisjaW5jbHVkZSAic3MuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCitleHRlcm4gaW50IHNocjEoKTsKK2V4dGVybiBpbnQgc2hyMigpOworZXh0ZXJuIGZsb2F0IHNnOworCitpbnQgZWdsb2I7CisKK3N0cnVjdCB7CisgaW50IGE7ICAKKyBpbnQgYjsKK30gczsKKworaW50IGc7CisKK2ludCBsb2NhbF9zdHJ1Y3RhcmcoeCkKK3N0cnVjdCBzIHg7Cit7CisgIHJldHVybiB4LmI7Cit9CisKK21haW4oKQoreworICBzdHJ1Y3QgcyB5OworICBnID0gMTsKKyAgZyA9IHNocjEoZyk7CisgIGcgPSBzaHIyKGcpOworICBnID0gbWFpbnNocjEoZyk7CisgIHNnID0gMS4xOworICBwcmludGYoImFkZHJlc3Mgb2Ygc2cgaXMgMHgleFxuIiwgJnNnKTsKKyAgeS5hID0gMzsKKyAgeS5iID0gNDsKKyAgZyA9IGxvY2FsX3N0cnVjdGFyZyh5KTsKKyAgZyA9IHN0cnVjdGFyZyh5KTsKKyAgZyA9IHBzdHJ1Y3RhcmcoJnkpOworCisgIHJldHVybiAoMCk7Cit9CisKK2ludCBtYWluc2hyMShnKQoraW50IGc7Cit7CisgIHJldHVybiAyKmc7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NocjEuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc2hyMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZmFmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NocjEuYwpAQCAtMCwwICsxLDQ3IEBACisjaW5jbHVkZSAic3MuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCit0eXBlZGVmIGZsb2F0IGY7CisKK2Zsb2F0IHNnID0gNS41OworaW50IHNnaSA9IDI7CitzdGF0aWMgaW50IHNncyA9IDc7CisKK2ludCBzaHIxKHgpCitpbnQgeDsKK3sKKyAgZiBtdW1ibGU7CisgIGludCBsOworICBsID0gMTsKKyAgeworICAgIGludCBsOworICAgIGwgPSAyOworICB9CisgIG11bWJsZSA9IDcuNzsKKyAgc2cgPSA2LjY7CisgIHNnaSsrOworICBzZ3MgPSA4OworICBwcmludGYoImFkZHJlc3Mgb2Ygc2dzIGlzIDB4JXhcbiIsICZzZ3MpOworICByZXR1cm4gMip4OworfQorCitzdGF0aWMgaW50IHNocjFfbG9jYWwoeCkKK2ludCB4OworeworICByZXR1cm4gMip4OworfQorCitpbnQgc3RydWN0YXJnKHgpCitzdHJ1Y3QgcyB4OworeworICByZXR1cm4geC5hOworfQorCitpbnQgcHN0cnVjdGFyZyh4KQorc3RydWN0IHMgKng7Cit7CisgIHJldHVybiB4LT5hOworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zaHIyLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NocjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGQ1ZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zaHIyLmMKQEAgLTAsMCArMSwxMSBAQAoraW50IHNocjIoeCkKK3sKKyAgcmV0dXJuIDIqeDsKK30KKworaW50IHNocjJfbG9jYWwoeCkKK3sKKyAgcmV0dXJuIDIqeDsKK30KKworCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NpZ2FsbC5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zaWdhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWIwOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zaWdhbGwuYwpAQCAtMCwwICsxLDEzODMgQEAKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2lmZGVmIF9fc2hfXworI2RlZmluZSBzaWduYWwoYSxiKQkvKiBTaWduYWxzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyB0YXJnZXQgLSBtYWtlIHRoZW0gZ28gYXdheSAqLworI2VuZGlmCisKKy8qIFNpZ25hbCBoYW5kbGVycywgd2Ugc2V0IGJyZWFrcG9pbnRzIGluIHRoZW0gdG8gbWFrZSBzdXJlIHRoYXQgdGhlCisgICBzaWduYWxzIHJlYWxseSBnZXQgZGVsaXZlcmVkLiAgKi8KKwordm9pZAoraGFuZGxlX0FCUlQgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlX0hVUCAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfUVVJVCAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfSUxMIChzaWcpCisgICAgIGludCBzaWc7Cit7Cit9CisKK3ZvaWQKK2hhbmRsZV9FTVQgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlX0ZQRSAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfQlVTIChzaWcpCisgICAgIGludCBzaWc7Cit7Cit9CisKK3ZvaWQKK2hhbmRsZV9TRUdWIChzaWcpCisgICAgIGludCBzaWc7Cit7Cit9CisKK3ZvaWQKK2hhbmRsZV9TWVMgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlX1BJUEUgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlX0FMUk0gKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlX1VSRyAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfVFNUUCAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfQ09OVCAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfQ0hMRCAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfVFRJTiAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfVFRPVSAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfSU8gKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlX1hDUFUgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlX1hGU1ogKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlX1ZUQUxSTSAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfUFJPRiAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfV0lOQ0ggKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlX0xPU1QgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlX1VTUjEgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlX1VTUjIgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlX1BXUiAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfUE9MTCAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfV0lORCAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfUEhPTkUgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlX1dBSVRJTkcgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlX0xXUCAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfREFOR0VSIChzaWcpCisgICAgIGludCBzaWc7Cit7Cit9CisKK3ZvaWQKK2hhbmRsZV9HUkFOVCAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfUkVUUkFDVCAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfTVNHIChzaWcpCisgICAgIGludCBzaWc7Cit7Cit9CisKK3ZvaWQKK2hhbmRsZV9TT1VORCAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfU0FLIChzaWcpCisgICAgIGludCBzaWc7Cit7Cit9CisKK3ZvaWQKK2hhbmRsZV9QUklPIChzaWcpCisgICAgIGludCBzaWc7Cit7Cit9CisKK3ZvaWQKK2hhbmRsZV8zMyAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfMzQgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlXzM1IChzaWcpCisgICAgIGludCBzaWc7Cit7Cit9CisKK3ZvaWQKK2hhbmRsZV8zNiAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfMzcgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlXzM4IChzaWcpCisgICAgIGludCBzaWc7Cit7Cit9CisKK3ZvaWQKK2hhbmRsZV8zOSAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfNDAgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlXzQxIChzaWcpCisgICAgIGludCBzaWc7Cit7Cit9CisKK3ZvaWQKK2hhbmRsZV80MiAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfNDMgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlXzQ0IChzaWcpCisgICAgIGludCBzaWc7Cit7Cit9CisKK3ZvaWQKK2hhbmRsZV80NSAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfNDYgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlXzQ3IChzaWcpCisgICAgIGludCBzaWc7Cit7Cit9CisKK3ZvaWQKK2hhbmRsZV80OCAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfNDkgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlXzUwIChzaWcpCisgICAgIGludCBzaWc7Cit7Cit9CisKK3ZvaWQKK2hhbmRsZV81MSAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfNTIgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlXzUzIChzaWcpCisgICAgIGludCBzaWc7Cit7Cit9CisKK3ZvaWQKK2hhbmRsZV81NCAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfNTUgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlXzU2IChzaWcpCisgICAgIGludCBzaWc7Cit7Cit9CisKK3ZvaWQKK2hhbmRsZV81NyAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfNTggKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlXzU5IChzaWcpCisgICAgIGludCBzaWc7Cit7Cit9CisKK3ZvaWQKK2hhbmRsZV82MCAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfNjEgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKK30KKwordm9pZAoraGFuZGxlXzYyIChzaWcpCisgICAgIGludCBzaWc7Cit7Cit9CisKK3ZvaWQKK2hhbmRsZV82MyAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorCit2b2lkCitoYW5kbGVfVEVSTSAoc2lnKQorICAgICBpbnQgc2lnOworeworfQorDAorLyogRnVuY3Rpb25zIHRvIHNlbmQgc2lnbmFscy4gIFRoZXNlIGFsc28gc2VydmUgYXMgbWFya2Vycy4gICovCitpbnQKK2dlbl9BQlJUICgpCit7CisgIGtpbGwgKGdldHBpZCAoKSwgU0lHQUJSVCk7Cit9ICAKKworaW50CitnZW5fSFVQICgpCit7CisjaWZkZWYgU0lHSFVQCisgIGtpbGwgKGdldHBpZCAoKSwgU0lHSFVQKTsKKyNlbHNlCisgIGhhbmRsZV9IVVAgKDApOworI2VuZGlmCit9ICAKKworaW50CitnZW5fUVVJVCAoKQoreworI2lmZGVmIFNJR1FVSVQKKyAga2lsbCAoZ2V0cGlkICgpLCBTSUdRVUlUKTsKKyNlbHNlCisgIGhhbmRsZV9RVUlUICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl9JTEwgKCkKK3sKKyNpZmRlZiBTSUdJTEwKKyAga2lsbCAoZ2V0cGlkICgpLCBTSUdJTEwpOworI2Vsc2UKKyAgaGFuZGxlX0lMTCAoMCk7CisjZW5kaWYKK30KKworaW50CitnZW5fRU1UICgpCit7CisjaWZkZWYgU0lHRU1UCisgIGtpbGwgKGdldHBpZCAoKSwgU0lHRU1UKTsKKyNlbHNlCisgIGhhbmRsZV9FTVQgKDApOworI2VuZGlmCit9CisKK2ludCB4OworCitpbnQKK2dlbl9GUEUgKCkKK3sKKyAgLyogVGhlIGludGVudCBiZWhpbmQgZ2VuZXJhdGluZyBTSUdGUEUgdGhpcyB3YXkgaXMgdG8gY2hlY2sgdGhlIG1hcHBpbmcKKyAgICAgZnJvbSB0aGUgQ1BVIGV4Y2VwdGlvbiBpdHNlbGYgdG8gdGhlIHNpZ25hbHMuICBJdCB3b3VsZCBiZSBuaWNlIHRvCisgICAgIGRvIHRoZSBzYW1lIGZvciBTSUdCVVMsIFNJR1NFR1YsIGV0Yy4sIGJ1dCBJIHN1c3BlY3QgdGhhdCBldmVuIHRoaXMKKyAgICAgdGVzdCBtaWdodCB0dXJuIG91dCB0byBiZSBpbnN1ZmZpY2llbnRseSBwb3J0YWJsZS4gICovCisKKyNpZiAwCisgIC8qIExvc2VzIG9uIHRoZSBQQSBiZWNhdXNlIGFmdGVyIHRoZSBzaWduYWwgaGFuZGxlciBleGVjdXRlcyB3ZSB0cnkgdG8KKyAgICAgcmUtZXhlY3V0ZSB0aGUgZmFpbGluZyBpbnN0cnVjdGlvbiBhZ2Fpbi4gIFBlcmhhcHMgd2UgY291bGQgc2lnbG9uZ2ptcAorICAgICBvdXQgb2YgdGhlIHNpZ25hbCBoYW5kbGVyPyAgKi8KKyAgLyogVGhlIGV4cGVjdCBzY3JpcHQgbG9va3MgZm9yIHRoZSB3b3JkICJraWxsIjsgZG9uJ3QgZGVsZXRlIGl0LiAgKi8KKyAgcmV0dXJuIDUgLyB4OyAvKiBhbmQgd2UgYm90aCBzdGFydGVkIGp1bXBpbmcgdXAgYW5kIGRvd24geWVsbGluZyBraWxsICovCisjZWxzZQorICBraWxsIChnZXRwaWQgKCksIFNJR0ZQRSk7CisjZW5kaWYKK30KKworaW50CitnZW5fQlVTICgpCit7CisjaWZkZWYgU0lHQlVTCisgIGtpbGwgKGdldHBpZCAoKSwgU0lHQlVTKTsKKyNlbHNlCisgIGhhbmRsZV9CVVMgKDApOworI2VuZGlmCit9CisKK2ludAorZ2VuX1NFR1YgKCkKK3sKKyNpZmRlZiBTSUdTRUdWCisgIGtpbGwgKGdldHBpZCAoKSwgU0lHU0VHVik7CisjZWxzZQorICBoYW5kbGVfU0VHViAoMCk7CisjZW5kaWYKK30KKworaW50CitnZW5fU1lTICgpCit7CisjaWZkZWYgU0lHU1lTCisgIGtpbGwgKGdldHBpZCAoKSwgU0lHU1lTKTsKKyNlbHNlCisgIGhhbmRsZV9TWVMgKDApOworI2VuZGlmCit9CisKK2ludAorZ2VuX1BJUEUgKCkKK3sKKyNpZmRlZiBTSUdQSVBFCisgIGtpbGwgKGdldHBpZCAoKSwgU0lHUElQRSk7CisjZWxzZQorICBoYW5kbGVfUElQRSAoMCk7CisjZW5kaWYKK30KKworaW50CitnZW5fQUxSTSAoKQoreworI2lmZGVmIFNJR0FMUk0KKyAga2lsbCAoZ2V0cGlkICgpLCBTSUdBTFJNKTsKKyNlbHNlCisgIGhhbmRsZV9BTFJNICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl9VUkcgKCkKK3sKKyNpZmRlZiBTSUdVUkcKKyAga2lsbCAoZ2V0cGlkICgpLCBTSUdVUkcpOworI2Vsc2UKKyAgaGFuZGxlX1VSRyAoMCk7CisjZW5kaWYKK30KKworaW50CitnZW5fVFNUUCAoKQoreworI2lmZGVmIFNJR1RTVFAKKyAga2lsbCAoZ2V0cGlkICgpLCBTSUdUU1RQKTsKKyNlbHNlCisgIGhhbmRsZV9UU1RQICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl9DT05UICgpCit7CisjaWZkZWYgU0lHQ09OVAorICBraWxsIChnZXRwaWQgKCksIFNJR0NPTlQpOworI2Vsc2UKKyAgaGFuZGxlX0NPTlQgKDApOworI2VuZGlmCit9CisKK2ludAorZ2VuX0NITEQgKCkKK3sKKyNpZmRlZiBTSUdDSExECisgIGtpbGwgKGdldHBpZCAoKSwgU0lHQ0hMRCk7CisjZWxzZQorICBoYW5kbGVfQ0hMRCAoMCk7CisjZW5kaWYKK30KKworaW50CitnZW5fVFRJTiAoKQoreworI2lmZGVmIFNJR1RUSU4KKyAga2lsbCAoZ2V0cGlkICgpLCBTSUdUVElOKTsKKyNlbHNlCisgIGhhbmRsZV9UVElOICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl9UVE9VICgpCit7CisjaWZkZWYgU0lHVFRPVQorICBraWxsIChnZXRwaWQgKCksIFNJR1RUT1UpOworI2Vsc2UKKyAgaGFuZGxlX1RUT1UgKDApOworI2VuZGlmCit9CisKK2ludAorZ2VuX0lPICgpCit7CisjaWZkZWYgU0lHSU8KKyAga2lsbCAoZ2V0cGlkICgpLCBTSUdJTyk7CisjZWxzZQorICBoYW5kbGVfSU8gKDApOworI2VuZGlmCit9CisKK2ludAorZ2VuX1hDUFUgKCkKK3sKKyNpZmRlZiBTSUdYQ1BVCisgIGtpbGwgKGdldHBpZCAoKSwgU0lHWENQVSk7CisjZWxzZQorICBoYW5kbGVfWENQVSAoMCk7CisjZW5kaWYKK30KKworaW50CitnZW5fWEZTWiAoKQoreworI2lmZGVmIFNJR1hGU1oKKyAga2lsbCAoZ2V0cGlkICgpLCBTSUdYRlNaKTsKKyNlbHNlCisgIGhhbmRsZV9YRlNaICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl9WVEFMUk0gKCkKK3sKKyNpZmRlZiBTSUdWVEFMUk0KKyAga2lsbCAoZ2V0cGlkICgpLCBTSUdWVEFMUk0pOworI2Vsc2UKKyAgaGFuZGxlX1ZUQUxSTSAoMCk7CisjZW5kaWYKK30KKworaW50CitnZW5fUFJPRiAoKQoreworI2lmZGVmIFNJR1BST0YKKyAga2lsbCAoZ2V0cGlkICgpLCBTSUdQUk9GKTsKKyNlbHNlCisgIGhhbmRsZV9QUk9GICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl9XSU5DSCAoKQoreworI2lmZGVmIFNJR1dJTkNICisgIGtpbGwgKGdldHBpZCAoKSwgU0lHV0lOQ0gpOworI2Vsc2UKKyAgaGFuZGxlX1dJTkNIICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl9MT1NUICgpCit7CisjaWYgZGVmaW5lZChTSUdMT1NUKSAmJiAoIWRlZmluZWQoU0lHQUJSVCkgfHwgU0lHTE9TVCAhPSBTSUdBQlJUKQorICBraWxsIChnZXRwaWQgKCksIFNJR0xPU1QpOworI2Vsc2UKKyAgaGFuZGxlX0xPU1QgKDApOworI2VuZGlmCit9CisKK2ludAorZ2VuX1VTUjEgKCkKK3sKKyNpZmRlZiBTSUdVU1IxCisgIGtpbGwgKGdldHBpZCAoKSwgU0lHVVNSMSk7CisjZWxzZQorICBoYW5kbGVfVVNSMSAoMCk7CisjZW5kaWYKK30KKworaW50CitnZW5fVVNSMiAoKQoreworI2lmZGVmIFNJR1VTUjIKKyAga2lsbCAoZ2V0cGlkICgpLCBTSUdVU1IyKTsKKyNlbHNlCisgIGhhbmRsZV9VU1IyICgwKTsKKyNlbmRpZgorfSAgCisKK2ludAorZ2VuX1BXUiAoKQoreworI2lmZGVmIFNJR1BXUgorICBraWxsIChnZXRwaWQgKCksIFNJR1BXUik7CisjZWxzZQorICBoYW5kbGVfUFdSICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl9QT0xMICgpCit7CisjaWYgZGVmaW5lZCAoU0lHUE9MTCkgJiYgKCFkZWZpbmVkIChTSUdJTykgfHwgU0lHUE9MTCAhPSBTSUdJTykKKyAga2lsbCAoZ2V0cGlkICgpLCBTSUdQT0xMKTsKKyNlbHNlCisgIGhhbmRsZV9QT0xMICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl9XSU5EICgpCit7CisjaWZkZWYgU0lHV0lORAorICBraWxsIChnZXRwaWQgKCksIFNJR1dJTkQpOworI2Vsc2UKKyAgaGFuZGxlX1dJTkQgKDApOworI2VuZGlmCit9CisKK2ludAorZ2VuX1BIT05FICgpCit7CisjaWZkZWYgU0lHUEhPTkUKKyAga2lsbCAoZ2V0cGlkICgpLCBTSUdQSE9ORSk7CisjZWxzZQorICBoYW5kbGVfUEhPTkUgKDApOworI2VuZGlmCit9CisKK2ludAorZ2VuX1dBSVRJTkcgKCkKK3sKKyNpZmRlZiBTSUdXQUlUSU5HCisgIGtpbGwgKGdldHBpZCAoKSwgU0lHV0FJVElORyk7CisjZWxzZQorICBoYW5kbGVfV0FJVElORyAoMCk7CisjZW5kaWYKK30KKworaW50CitnZW5fTFdQICgpCit7CisjaWZkZWYgU0lHTFdQCisgIGtpbGwgKGdldHBpZCAoKSwgU0lHTFdQKTsKKyNlbHNlCisgIGhhbmRsZV9MV1AgKDApOworI2VuZGlmCit9CisKK2ludAorZ2VuX0RBTkdFUiAoKQoreworI2lmZGVmIFNJR0RBTkdFUgorICBraWxsIChnZXRwaWQgKCksIFNJR0RBTkdFUik7CisjZWxzZQorICBoYW5kbGVfREFOR0VSICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl9HUkFOVCAoKQoreworI2lmZGVmIFNJR0dSQU5UCisgIGtpbGwgKGdldHBpZCAoKSwgU0lHR1JBTlQpOworI2Vsc2UKKyAgaGFuZGxlX0dSQU5UICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl9SRVRSQUNUICgpCit7CisjaWZkZWYgU0lHUkVUUkFDVAorICBraWxsIChnZXRwaWQgKCksIFNJR1JFVFJBQ1QpOworI2Vsc2UKKyAgaGFuZGxlX1JFVFJBQ1QgKDApOworI2VuZGlmCit9CisKK2ludAorZ2VuX01TRyAoKQoreworI2lmZGVmIFNJR01TRworICBraWxsIChnZXRwaWQgKCksIFNJR01TRyk7CisjZWxzZQorICBoYW5kbGVfTVNHICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl9TT1VORCAoKQoreworI2lmZGVmIFNJR1NPVU5ECisgIGtpbGwgKGdldHBpZCAoKSwgU0lHU09VTkQpOworI2Vsc2UKKyAgaGFuZGxlX1NPVU5EICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl9TQUsgKCkKK3sKKyNpZmRlZiBTSUdTQUsKKyAga2lsbCAoZ2V0cGlkICgpLCBTSUdTQUspOworI2Vsc2UKKyAgaGFuZGxlX1NBSyAoMCk7CisjZW5kaWYKK30KKworaW50CitnZW5fUFJJTyAoKQoreworI2lmZGVmIFNJR1BSSU8KKyAga2lsbCAoZ2V0cGlkICgpLCBTSUdQUklPKTsKKyNlbHNlCisgIGhhbmRsZV9QUklPICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl8zMyAoKQoreworI2lmZGVmIFNJRzMzCisgIGtpbGwgKGdldHBpZCAoKSwgMzMpOworI2Vsc2UKKyAgaGFuZGxlXzMzICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl8zNCAoKQoreworI2lmZGVmIFNJRzM0CisgIGtpbGwgKGdldHBpZCAoKSwgMzQpOworI2Vsc2UKKyAgaGFuZGxlXzM0ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl8zNSAoKQoreworI2lmZGVmIFNJRzM1CisgIGtpbGwgKGdldHBpZCAoKSwgMzUpOworI2Vsc2UKKyAgaGFuZGxlXzM1ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl8zNiAoKQoreworI2lmZGVmIFNJRzM2CisgIGtpbGwgKGdldHBpZCAoKSwgMzYpOworI2Vsc2UKKyAgaGFuZGxlXzM2ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl8zNyAoKQoreworI2lmZGVmIFNJRzM3CisgIGtpbGwgKGdldHBpZCAoKSwgMzcpOworI2Vsc2UKKyAgaGFuZGxlXzM3ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl8zOCAoKQoreworI2lmZGVmIFNJRzM4CisgIGtpbGwgKGdldHBpZCAoKSwgMzgpOworI2Vsc2UKKyAgaGFuZGxlXzM4ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl8zOSAoKQoreworI2lmZGVmIFNJRzM5CisgIGtpbGwgKGdldHBpZCAoKSwgMzkpOworI2Vsc2UKKyAgaGFuZGxlXzM5ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl80MCAoKQoreworI2lmZGVmIFNJRzQwCisgIGtpbGwgKGdldHBpZCAoKSwgNDApOworI2Vsc2UKKyAgaGFuZGxlXzQwICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl80MSAoKQoreworI2lmZGVmIFNJRzQxCisgIGtpbGwgKGdldHBpZCAoKSwgNDEpOworI2Vsc2UKKyAgaGFuZGxlXzQxICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl80MiAoKQoreworI2lmZGVmIFNJRzQyCisgIGtpbGwgKGdldHBpZCAoKSwgNDIpOworI2Vsc2UKKyAgaGFuZGxlXzQyICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl80MyAoKQoreworI2lmZGVmIFNJRzQzCisgIGtpbGwgKGdldHBpZCAoKSwgNDMpOworI2Vsc2UKKyAgaGFuZGxlXzQzICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl80NCAoKQoreworI2lmZGVmIFNJRzQ0CisgIGtpbGwgKGdldHBpZCAoKSwgNDQpOworI2Vsc2UKKyAgaGFuZGxlXzQ0ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl80NSAoKQoreworI2lmZGVmIFNJRzQ1CisgIGtpbGwgKGdldHBpZCAoKSwgNDUpOworI2Vsc2UKKyAgaGFuZGxlXzQ1ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl80NiAoKQoreworI2lmZGVmIFNJRzQ2CisgIGtpbGwgKGdldHBpZCAoKSwgNDYpOworI2Vsc2UKKyAgaGFuZGxlXzQ2ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl80NyAoKQoreworI2lmZGVmIFNJRzQ3CisgIGtpbGwgKGdldHBpZCAoKSwgNDcpOworI2Vsc2UKKyAgaGFuZGxlXzQ3ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl80OCAoKQoreworI2lmZGVmIFNJRzQ4CisgIGtpbGwgKGdldHBpZCAoKSwgNDgpOworI2Vsc2UKKyAgaGFuZGxlXzQ4ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl80OSAoKQoreworI2lmZGVmIFNJRzQ5CisgIGtpbGwgKGdldHBpZCAoKSwgNDkpOworI2Vsc2UKKyAgaGFuZGxlXzQ5ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl81MCAoKQoreworI2lmZGVmIFNJRzUwCisgIGtpbGwgKGdldHBpZCAoKSwgNTApOworI2Vsc2UKKyAgaGFuZGxlXzUwICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl81MSAoKQoreworI2lmZGVmIFNJRzUxCisgIGtpbGwgKGdldHBpZCAoKSwgNTEpOworI2Vsc2UKKyAgaGFuZGxlXzUxICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl81MiAoKQoreworI2lmZGVmIFNJRzUyCisgIGtpbGwgKGdldHBpZCAoKSwgNTIpOworI2Vsc2UKKyAgaGFuZGxlXzUyICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl81MyAoKQoreworI2lmZGVmIFNJRzUzCisgIGtpbGwgKGdldHBpZCAoKSwgNTMpOworI2Vsc2UKKyAgaGFuZGxlXzUzICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl81NCAoKQoreworI2lmZGVmIFNJRzU0CisgIGtpbGwgKGdldHBpZCAoKSwgNTQpOworI2Vsc2UKKyAgaGFuZGxlXzU0ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl81NSAoKQoreworI2lmZGVmIFNJRzU1CisgIGtpbGwgKGdldHBpZCAoKSwgNTUpOworI2Vsc2UKKyAgaGFuZGxlXzU1ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl81NiAoKQoreworI2lmZGVmIFNJRzU2CisgIGtpbGwgKGdldHBpZCAoKSwgNTYpOworI2Vsc2UKKyAgaGFuZGxlXzU2ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl81NyAoKQoreworI2lmZGVmIFNJRzU3CisgIGtpbGwgKGdldHBpZCAoKSwgNTcpOworI2Vsc2UKKyAgaGFuZGxlXzU3ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl81OCAoKQoreworI2lmZGVmIFNJRzU4CisgIGtpbGwgKGdldHBpZCAoKSwgNTgpOworI2Vsc2UKKyAgaGFuZGxlXzU4ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl81OSAoKQoreworI2lmZGVmIFNJRzU5CisgIGtpbGwgKGdldHBpZCAoKSwgNTkpOworI2Vsc2UKKyAgaGFuZGxlXzU5ICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl82MCAoKQoreworI2lmZGVmIFNJRzYwCisgIGtpbGwgKGdldHBpZCAoKSwgNjApOworI2Vsc2UKKyAgaGFuZGxlXzYwICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl82MSAoKQoreworI2lmZGVmIFNJRzYxCisgIGtpbGwgKGdldHBpZCAoKSwgNjEpOworI2Vsc2UKKyAgaGFuZGxlXzYxICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl82MiAoKQoreworI2lmZGVmIFNJRzYyCisgIGtpbGwgKGdldHBpZCAoKSwgNjIpOworI2Vsc2UKKyAgaGFuZGxlXzYyICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl82MyAoKQoreworI2lmZGVmIFNJRzYzCisgIGtpbGwgKGdldHBpZCAoKSwgNjMpOworI2Vsc2UKKyAgaGFuZGxlXzYzICgwKTsKKyNlbmRpZgorfQorCitpbnQKK2dlbl9URVJNICgpCit7CisgIGtpbGwgKGdldHBpZCAoKSwgU0lHVEVSTSk7Cit9ICAKKwwKK2ludAorbWFpbiAoKQoreworI2lmZGVmIHVzZXN0dWJzCisgIHNldF9kZWJ1Z190cmFwcyAoKTsKKyAgYnJlYWtwb2ludCAoKTsKKyNlbmRpZgorICBzaWduYWwgKFNJR0FCUlQsIGhhbmRsZV9BQlJUKTsKKyNpZmRlZiBTSUdIVVAKKyAgc2lnbmFsIChTSUdIVVAsIGhhbmRsZV9IVVApOworI2VuZGlmCisjaWZkZWYgU0lHUVVJVAorICBzaWduYWwgKFNJR1FVSVQsIGhhbmRsZV9RVUlUKTsKKyNlbmRpZgorI2lmZGVmIFNJR0lMTAorICBzaWduYWwgKFNJR0lMTCwgaGFuZGxlX0lMTCk7CisjZW5kaWYKKyNpZmRlZiBTSUdFTVQKKyAgc2lnbmFsIChTSUdFTVQsIGhhbmRsZV9FTVQpOworI2VuZGlmCisjaWZkZWYgU0lHRlBFCisgIHNpZ25hbCAoU0lHRlBFLCBoYW5kbGVfRlBFKTsKKyNlbmRpZgorI2lmZGVmIFNJR0JVUworICBzaWduYWwgKFNJR0JVUywgaGFuZGxlX0JVUyk7CisjZW5kaWYKKyNpZmRlZiBTSUdTRUdWCisgIHNpZ25hbCAoU0lHU0VHViwgaGFuZGxlX1NFR1YpOworI2VuZGlmCisjaWZkZWYgU0lHU1lTCisgIHNpZ25hbCAoU0lHU1lTLCBoYW5kbGVfU1lTKTsKKyNlbmRpZgorI2lmZGVmIFNJR1BJUEUKKyAgc2lnbmFsIChTSUdQSVBFLCBoYW5kbGVfUElQRSk7CisjZW5kaWYKKyNpZmRlZiBTSUdBTFJNCisgIHNpZ25hbCAoU0lHQUxSTSwgaGFuZGxlX0FMUk0pOworI2VuZGlmCisjaWZkZWYgU0lHVVJHCisgIHNpZ25hbCAoU0lHVVJHLCBoYW5kbGVfVVJHKTsKKyNlbmRpZgorI2lmZGVmIFNJR1RTVFAKKyAgc2lnbmFsIChTSUdUU1RQLCBoYW5kbGVfVFNUUCk7CisjZW5kaWYKKyNpZmRlZiBTSUdDT05UCisgIHNpZ25hbCAoU0lHQ09OVCwgaGFuZGxlX0NPTlQpOworI2VuZGlmCisjaWZkZWYgU0lHQ0hMRAorICBzaWduYWwgKFNJR0NITEQsIGhhbmRsZV9DSExEKTsKKyNlbmRpZgorI2lmZGVmIFNJR1RUSU4KKyAgc2lnbmFsIChTSUdUVElOLCBoYW5kbGVfVFRJTik7CisjZW5kaWYKKyNpZmRlZiBTSUdUVE9VCisgIHNpZ25hbCAoU0lHVFRPVSwgaGFuZGxlX1RUT1UpOworI2VuZGlmCisjaWZkZWYgU0lHSU8KKyAgc2lnbmFsIChTSUdJTywgaGFuZGxlX0lPKTsKKyNlbmRpZgorI2lmZGVmIFNJR1hDUFUKKyAgc2lnbmFsIChTSUdYQ1BVLCBoYW5kbGVfWENQVSk7CisjZW5kaWYKKyNpZmRlZiBTSUdYRlNaCisgIHNpZ25hbCAoU0lHWEZTWiwgaGFuZGxlX1hGU1opOworI2VuZGlmCisjaWZkZWYgU0lHVlRBTFJNCisgIHNpZ25hbCAoU0lHVlRBTFJNLCBoYW5kbGVfVlRBTFJNKTsKKyNlbmRpZgorI2lmZGVmIFNJR1BST0YKKyAgc2lnbmFsIChTSUdQUk9GLCBoYW5kbGVfUFJPRik7CisjZW5kaWYKKyNpZmRlZiBTSUdXSU5DSAorICBzaWduYWwgKFNJR1dJTkNILCBoYW5kbGVfV0lOQ0gpOworI2VuZGlmCisjaWYgZGVmaW5lZChTSUdMT1NUKSAmJiAoIWRlZmluZWQoU0lHQUJSVCkgfHwgU0lHTE9TVCAhPSBTSUdBQlJUKQorICBzaWduYWwgKFNJR0xPU1QsIGhhbmRsZV9MT1NUKTsKKyNlbmRpZgorI2lmZGVmIFNJR1VTUjEKKyAgc2lnbmFsIChTSUdVU1IxLCBoYW5kbGVfVVNSMSk7CisjZW5kaWYKKyNpZmRlZiBTSUdVU1IyCisgIHNpZ25hbCAoU0lHVVNSMiwgaGFuZGxlX1VTUjIpOworI2VuZGlmCisjaWZkZWYgU0lHUFdSCisgIHNpZ25hbCAoU0lHUFdSLCBoYW5kbGVfUFdSKTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNJR1BPTEwpICYmICghZGVmaW5lZCAoU0lHSU8pIHx8IFNJR1BPTEwgIT0gU0lHSU8pCisgIHNpZ25hbCAoU0lHUE9MTCwgaGFuZGxlX1BPTEwpOworI2VuZGlmCisjaWZkZWYgU0lHV0lORAorICBzaWduYWwgKFNJR1dJTkQsIGhhbmRsZV9XSU5EKTsKKyNlbmRpZgorI2lmZGVmIFNJR1BIT05FCisgIHNpZ25hbCAoU0lHUEhPTkUsIGhhbmRsZV9QSE9ORSk7CisjZW5kaWYKKyNpZmRlZiBTSUdXQUlUSU5HCisgIHNpZ25hbCAoU0lHV0FJVElORywgaGFuZGxlX1dBSVRJTkcpOworI2VuZGlmCisjaWZkZWYgU0lHTFdQCisgIHNpZ25hbCAoU0lHTFdQLCBoYW5kbGVfTFdQKTsKKyNlbmRpZgorI2lmZGVmIFNJR0RBTkdFUgorICBzaWduYWwgKFNJR0RBTkdFUiwgaGFuZGxlX0RBTkdFUik7CisjZW5kaWYKKyNpZmRlZiBTSUdHUkFOVAorICBzaWduYWwgKFNJR0dSQU5ULCBoYW5kbGVfR1JBTlQpOworI2VuZGlmCisjaWZkZWYgU0lHUkVUUkFDVAorICBzaWduYWwgKFNJR1JFVFJBQ1QsIGhhbmRsZV9SRVRSQUNUKTsKKyNlbmRpZgorI2lmZGVmIFNJR01TRworICBzaWduYWwgKFNJR01TRywgaGFuZGxlX01TRyk7CisjZW5kaWYKKyNpZmRlZiBTSUdTT1VORAorICBzaWduYWwgKFNJR1NPVU5ELCBoYW5kbGVfU09VTkQpOworI2VuZGlmCisjaWZkZWYgU0lHU0FLCisgIHNpZ25hbCAoU0lHU0FLLCBoYW5kbGVfU0FLKTsKKyNlbmRpZgorI2lmZGVmIFNJR1BSSU8KKyAgc2lnbmFsIChTSUdQUklPLCBoYW5kbGVfUFJJTyk7CisjZW5kaWYKKyNpZmRlZiBfX0x5bnhfXworICAvKiBMeW54IGRvZXNuJ3Qgc2VlbSB0byBoYXZlIGFueXRoaW5nIGluIHNpZ25hbC5oIGZvciB0aGlzLiAgKi8KKyAgc2lnbmFsICgzMywgaGFuZGxlXzMzKTsKKyAgc2lnbmFsICgzNCwgaGFuZGxlXzM0KTsKKyAgc2lnbmFsICgzNSwgaGFuZGxlXzM1KTsKKyAgc2lnbmFsICgzNiwgaGFuZGxlXzM2KTsKKyAgc2lnbmFsICgzNywgaGFuZGxlXzM3KTsKKyAgc2lnbmFsICgzOCwgaGFuZGxlXzM4KTsKKyAgc2lnbmFsICgzOSwgaGFuZGxlXzM5KTsKKyAgc2lnbmFsICg0MCwgaGFuZGxlXzQwKTsKKyAgc2lnbmFsICg0MSwgaGFuZGxlXzQxKTsKKyAgc2lnbmFsICg0MiwgaGFuZGxlXzQyKTsKKyAgc2lnbmFsICg0MywgaGFuZGxlXzQzKTsKKyAgc2lnbmFsICg0NCwgaGFuZGxlXzQ0KTsKKyAgc2lnbmFsICg0NSwgaGFuZGxlXzQ1KTsKKyAgc2lnbmFsICg0NiwgaGFuZGxlXzQ2KTsKKyAgc2lnbmFsICg0NywgaGFuZGxlXzQ3KTsKKyAgc2lnbmFsICg0OCwgaGFuZGxlXzQ4KTsKKyAgc2lnbmFsICg0OSwgaGFuZGxlXzQ5KTsKKyAgc2lnbmFsICg1MCwgaGFuZGxlXzUwKTsKKyAgc2lnbmFsICg1MSwgaGFuZGxlXzUxKTsKKyAgc2lnbmFsICg1MiwgaGFuZGxlXzUyKTsKKyAgc2lnbmFsICg1MywgaGFuZGxlXzUzKTsKKyAgc2lnbmFsICg1NCwgaGFuZGxlXzU0KTsKKyAgc2lnbmFsICg1NSwgaGFuZGxlXzU1KTsKKyAgc2lnbmFsICg1NiwgaGFuZGxlXzU2KTsKKyAgc2lnbmFsICg1NywgaGFuZGxlXzU3KTsKKyAgc2lnbmFsICg1OCwgaGFuZGxlXzU4KTsKKyAgc2lnbmFsICg1OSwgaGFuZGxlXzU5KTsKKyAgc2lnbmFsICg2MCwgaGFuZGxlXzYwKTsKKyAgc2lnbmFsICg2MSwgaGFuZGxlXzYxKTsKKyAgc2lnbmFsICg2MiwgaGFuZGxlXzYyKTsKKyAgc2lnbmFsICg2MywgaGFuZGxlXzYzKTsKKyNlbmRpZiAvKiBseW54ICovCisgIHNpZ25hbCAoU0lHVEVSTSwgaGFuZGxlX1RFUk0pOworCisgIHggPSAwOworCisgIGdlbl9BQlJUICgpOworICBnZW5fSFVQICgpOworICBnZW5fUVVJVCAoKTsKKyAgZ2VuX0lMTCAoKTsKKyAgZ2VuX0VNVCAoKTsKKyAgZ2VuX0ZQRSAoKTsKKyAgZ2VuX0JVUyAoKTsKKyAgZ2VuX1NFR1YgKCk7CisgIGdlbl9TWVMgKCk7CisgIGdlbl9QSVBFICgpOworICBnZW5fQUxSTSAoKTsKKyAgZ2VuX1VSRyAoKTsKKyAgZ2VuX1RTVFAgKCk7CisgIGdlbl9DT05UICgpOworICBnZW5fQ0hMRCAoKTsKKyAgZ2VuX1RUSU4gKCk7CisgIGdlbl9UVE9VICgpOworICBnZW5fSU8gKCk7CisgIGdlbl9YQ1BVICgpOworICBnZW5fWEZTWiAoKTsKKyAgZ2VuX1ZUQUxSTSAoKTsKKyAgZ2VuX1BST0YgKCk7CisgIGdlbl9XSU5DSCAoKTsKKyAgZ2VuX0xPU1QgKCk7CisgIGdlbl9VU1IxICgpOworICBnZW5fVVNSMiAoKTsKKyAgZ2VuX1BXUiAoKTsKKyAgZ2VuX1BPTEwgKCk7CisgIGdlbl9XSU5EICgpOworICBnZW5fUEhPTkUgKCk7CisgIGdlbl9XQUlUSU5HICgpOworICBnZW5fTFdQICgpOworICBnZW5fREFOR0VSICgpOworICBnZW5fR1JBTlQgKCk7CisgIGdlbl9SRVRSQUNUICgpOworICBnZW5fTVNHICgpOworICBnZW5fU09VTkQgKCk7CisgIGdlbl9TQUsgKCk7CisgIGdlbl9QUklPICgpOworICBnZW5fMzMgKCk7CisgIGdlbl8zNCAoKTsKKyAgZ2VuXzM1ICgpOworICBnZW5fMzYgKCk7CisgIGdlbl8zNyAoKTsKKyAgZ2VuXzM4ICgpOworICBnZW5fMzkgKCk7CisgIGdlbl80MCAoKTsKKyAgZ2VuXzQxICgpOworICBnZW5fNDIgKCk7CisgIGdlbl80MyAoKTsKKyAgZ2VuXzQ0ICgpOworICBnZW5fNDUgKCk7CisgIGdlbl80NiAoKTsKKyAgZ2VuXzQ3ICgpOworICBnZW5fNDggKCk7CisgIGdlbl80OSAoKTsKKyAgZ2VuXzUwICgpOworICBnZW5fNTEgKCk7CisgIGdlbl81MiAoKTsKKyAgZ2VuXzUzICgpOworICBnZW5fNTQgKCk7CisgIGdlbl81NSAoKTsKKyAgZ2VuXzU2ICgpOworICBnZW5fNTcgKCk7CisgIGdlbl81OCAoKTsKKyAgZ2VuXzU5ICgpOworICBnZW5fNjAgKCk7CisgIGdlbl82MSAoKTsKKyAgZ2VuXzYyICgpOworICBnZW5fNjMgKCk7CisgIGdlbl9URVJNICgpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zaWdhbGwuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zaWdhbGwuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NWUwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NpZ2FsbC5leHAKQEAgLTAsMCArMSwyMTAgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKK2lmIFt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiLG5vc2lnbmFsc10geworICAgIHZlcmJvc2UgIlNraXBwaW5nIHNpZ2FsbC5leHAgYmVjYXVzZSBvZiBub3NpZ25hbHMuIgorICAgIGNvbnRpbnVlCit9CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisKK3NldCB0ZXN0ZmlsZSBzaWdhbGwKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKKyMgTWFrZSB0aGUgZmlyc3Qgc2lnbmFsIFNJR0FCUlQgYmVjYXVzZSBpdCBpcyBhbHdheXMgc3VwcG9ydGVkLgorc2V0IHNpZ19zdXBwb3J0ZWQgMQorc2V0IHRoaXNzaWcgIkFCUlQiCisKK3Byb2MgdGVzdF9vbmVfc2lnIHtuZXh0c2lnfSB7CisgICAgZ2xvYmFsIHNpZ19zdXBwb3J0ZWQKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCB0aGlzc2lnCisKKyAgICBzZXQgdGhpc19zaWdfc3VwcG9ydGVkICRzaWdfc3VwcG9ydGVkCisgICAgZ2RiX3Rlc3QgImhhbmRsZSBTSUckdGhpc3NpZyBzdG9wIHByaW50IiBcCisJIlNJRyR0aGlzc2lnXFsgXHRcXSpZZXNcWyBcdFxdKlllc1xbIFx0XF0qWWVzLioiCisgICAgZ2RiX3Rlc3QgImIgaGFuZGxlXyR0aGlzc2lnIiAiQnJlYWtwb2ludCBcWzAtOVxdKyAuKiIKKyAgICBnZGJfdGVzdCAiYiBnZW5fJG5leHRzaWciICJCcmVha3BvaW50IFxbMC05XF0rIC4qIgorCisgICAgc2V0IG5lZWRfYW5vdGhlcl9jb250aW51ZSAxCisgICAgc2V0IG1pc3NlZF9oYW5kbGVyIDAKKyAgICBpZiAkdGhpc19zaWdfc3VwcG9ydGVkIHRoZW4geworCXNlbmRfZ2RiICJjb250aW51ZVxuIgorCWlmIHsgJHRoaXNzaWcgPT0gIklPIiB9IHsKKwkgICAgc2V0dXBfeGZhaWwgImkqODYtcGMtbGludXhvbGRsZC1nbnUiICJpKjg2LXBjLWxpbnV4YW91dC1nbnUiCisJfQorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIkNvbnRpbnVpbmcuKlByb2dyYW0gcmVjZWl2ZWQgc2lnbmFsIFNJRyR0aGlzc2lnLiokZ2RiX3Byb21wdCAkIiB7CisJCXBhc3MgImdldCBzaWduYWwgJHRoaXNzaWciCisJICAgIH0KKwkgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkJZmFpbCAiZ2V0IHNpZ25hbCAkdGhpc3NpZyIKKwkJc2V0IG5lZWRfYW5vdGhlcl9jb250aW51ZSAwCisJICAgIH0KKwkgICAgZGVmYXVsdCB7CisJCWZhaWwgImdldCBzaWduYWwgJHRoaXNzaWcgKGVvZiBvciB0aW1lb3V0KSIKKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgWyBpc3RhcmdldCAiYWxwaGEtZGVjLW9zZjMqIiBdIHRoZW4geworCSMgT1NGLzEtMy54IGlzIHVuYWJsZSB0byBjb250aW51ZSB3aXRoIGEgam9iIGNvbnRyb2wgc3RvcCBzaWduYWwuCisJIyBUaGUgaW5mZXJpb3IgcmVtYWlucyBzdG9wcGVkIHdpdGhvdXQgYW4gZXZlbnQgb2YgaW50ZXJlc3QKKwkjIGFuZCBHREIgd2FpdHMgZm9yZXZlciBmb3IgdGhlIGluZmVyaW9yIHRvIHN0b3Agb24gYW4gZXZlbnQKKwkjIG9mIGludGVyZXN0LiBXb3JrIGFyb3VuZCB0aGUga2VybmVsIGJ1Zy4KKwlpZiB7ICR0aGlzc2lnID09ICJUU1RQIiB8fCAkdGhpc3NpZyA9PSAiVFRJTiIgfHwgJHRoaXNzaWcgPT0gIlRUT1UiIH0geworCSAgICBzZXR1cF94ZmFpbCAiYWxwaGEtZGVjLW9zZjMqIgorCSAgICBmYWlsICJjYW5ub3QgY29udGludWUgZnJvbSBzaWduYWwgJHRoaXNzaWciCisJICAgIHNldCBuZWVkX2Fub3RoZXJfY29udGludWUgMAorCX0KKyAgICB9CisKKyAgICBpZiAkbmVlZF9hbm90aGVyX2NvbnRpbnVlIHRoZW4geworCXNlbmRfZ2RiICJjb250aW51ZVxuIgorCWlmIHsgJHRoaXNzaWcgPT0gIlVSRyIgfSB7CisJICAgIHNldHVwX3hmYWlsICJpKjg2LXBjLWxpbnV4b2xkbGQtZ251IiAiaSo4Ni1wYy1saW51eGFvdXQtZ251IgorCX0KKyAgICAgICAgIyBFaXRoZXIgTHlueCBvciBHREIgc2NyZXdzIHVwIG9uIFNJR1BSSU8KKwlpZiB7ICR0aGlzc2lnID09ICJQUklPIiB9IHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qbHlueCoiCisJfQorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIkJyZWFrcG9pbnQuKmhhbmRsZV8kdGhpc3NpZy4qJGdkYl9wcm9tcHQgJCIgeworCQlwYXNzICJzZW5kIHNpZ25hbCAkdGhpc3NpZyIKKwkgICAgfQorCSAgICAtcmUgIkJyZWFrcG9pbnQuKmdlbl8kbmV4dHNpZy4qa2lsbC4qJGdkYl9wcm9tcHQgJCIgeworCQlmYWlsICJtaXNzZWQgYnJlYWtwb2ludCBhdCBoYW5kbGVfJHRoaXNzaWciCisJCXNldCBtaXNzZWRfaGFuZGxlciAxCisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgeyAkbWlzc2VkX2hhbmRsZXIgPT0gIjAiIH0gdGhlbiB7CisgICAgICAgIHNlbmRfZ2RiICJzaWduYWwgMFxuIgorICAgICAgICBnZGJfZXhwZWN0IHsKKwkgICAgLXJlICJCcmVha3BvaW50LipnZW5fJG5leHRzaWcuKmtpbGwuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgICAgIHBhc3MgImFkdmFuY2UgdG8gJG5leHRzaWciCisJICAgICAgICBzZXQgc2lnX3N1cHBvcnRlZCAxCisJICAgIH0KKwkgICAgLXJlICJCcmVha3BvaW50LipnZW5fJG5leHRzaWcuKmhhbmRsZS4qJGdkYl9wcm9tcHQgJCIgeworCSAgICAgICAgcGFzcyAiYWR2YW5jZSB0byAkbmV4dHNpZyIKKwkgICAgICAgIHNldCBzaWdfc3VwcG9ydGVkIDAKKwkgICAgfQorCSAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJhZHZhbmNlIHRvICRuZXh0c2lnIiB9CisJICAgIGRlZmF1bHQgeyBmYWlsICJhZHZhbmNlIHRvICRuZXh0c2lnIChlb2Ygb3IgdGltZW91dCkiIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzZXQgdGhpc3NpZyAkbmV4dHNpZworfQorCitnZGJfbG9hZCAkYmluZmlsZQorCitydW50byBnZW5fQUJSVAordGVzdF9vbmVfc2lnIEhVUAordGVzdF9vbmVfc2lnIFFVSVQKK3Rlc3Rfb25lX3NpZyBJTEwKK3Rlc3Rfb25lX3NpZyBFTVQKK3Rlc3Rfb25lX3NpZyBGUEUKK3Rlc3Rfb25lX3NpZyBCVVMKK3Rlc3Rfb25lX3NpZyBTRUdWCit0ZXN0X29uZV9zaWcgU1lTCit0ZXN0X29uZV9zaWcgUElQRQordGVzdF9vbmVfc2lnIEFMUk0KK3Rlc3Rfb25lX3NpZyBVUkcKK3Rlc3Rfb25lX3NpZyBUU1RQCit0ZXN0X29uZV9zaWcgQ09OVAordGVzdF9vbmVfc2lnIENITEQKK3Rlc3Rfb25lX3NpZyBUVElOCit0ZXN0X29uZV9zaWcgVFRPVQordGVzdF9vbmVfc2lnIElPCit0ZXN0X29uZV9zaWcgWENQVQordGVzdF9vbmVfc2lnIFhGU1oKK3Rlc3Rfb25lX3NpZyBWVEFMUk0KK3Rlc3Rfb25lX3NpZyBQUk9GCit0ZXN0X29uZV9zaWcgV0lOQ0gKK3Rlc3Rfb25lX3NpZyBMT1NUCit0ZXN0X29uZV9zaWcgVVNSMQordGVzdF9vbmVfc2lnIFVTUjIKK3Rlc3Rfb25lX3NpZyBQV1IKK3Rlc3Rfb25lX3NpZyBQT0xMCit0ZXN0X29uZV9zaWcgV0lORAordGVzdF9vbmVfc2lnIFBIT05FCit0ZXN0X29uZV9zaWcgV0FJVElORwordGVzdF9vbmVfc2lnIExXUAordGVzdF9vbmVfc2lnIERBTkdFUgordGVzdF9vbmVfc2lnIEdSQU5UCit0ZXN0X29uZV9zaWcgUkVUUkFDVAordGVzdF9vbmVfc2lnIE1TRwordGVzdF9vbmVfc2lnIFNPVU5ECit0ZXN0X29uZV9zaWcgU0FLCit0ZXN0X29uZV9zaWcgUFJJTwordGVzdF9vbmVfc2lnIDMzCit0ZXN0X29uZV9zaWcgMzQKK3Rlc3Rfb25lX3NpZyAzNQordGVzdF9vbmVfc2lnIDM2Cit0ZXN0X29uZV9zaWcgMzcKK3Rlc3Rfb25lX3NpZyAzOAordGVzdF9vbmVfc2lnIDM5Cit0ZXN0X29uZV9zaWcgNDAKK3Rlc3Rfb25lX3NpZyA0MQordGVzdF9vbmVfc2lnIDQyCit0ZXN0X29uZV9zaWcgNDMKK3Rlc3Rfb25lX3NpZyA0NAordGVzdF9vbmVfc2lnIDQ1Cit0ZXN0X29uZV9zaWcgNDYKK3Rlc3Rfb25lX3NpZyA0NwordGVzdF9vbmVfc2lnIDQ4Cit0ZXN0X29uZV9zaWcgNDkKK3Rlc3Rfb25lX3NpZyA1MAordGVzdF9vbmVfc2lnIDUxCit0ZXN0X29uZV9zaWcgNTIKK3Rlc3Rfb25lX3NpZyA1MwordGVzdF9vbmVfc2lnIDU0Cit0ZXN0X29uZV9zaWcgNTUKK3Rlc3Rfb25lX3NpZyA1NgordGVzdF9vbmVfc2lnIDU3Cit0ZXN0X29uZV9zaWcgNTgKK3Rlc3Rfb25lX3NpZyA1OQordGVzdF9vbmVfc2lnIDYwCit0ZXN0X29uZV9zaWcgNjEKK3Rlc3Rfb25lX3NpZyA2MgordGVzdF9vbmVfc2lnIDYzCit0ZXN0X29uZV9zaWcgVEVSTQorCisjIFRoZSBsYXN0IHNpZ25hbCAoU0lHVEVSTSkgZ2V0cyBoYW5kbGVkIHNsaWdodGx5IGRpZmZlcmVudGx5IGJlY2F1c2UKKyMgd2UgYXJlIG5vdCBzZXR0aW5nIHVwIGZvciBhbm90aGVyIHRlc3QuCitnZGJfdGVzdCAiaGFuZGxlIFNJR1RFUk0gc3RvcCBwcmludCIgXAorICAgICJTSUdURVJNXFsgXHRcXSpZZXNcWyBcdFxdKlllc1xbIFx0XF0qWWVzLioiCitnZGJfdGVzdCAiYiBoYW5kbGVfVEVSTSIgIkJyZWFrcG9pbnQgXFswLTlcXSsgLioiCitnZGJfdGVzdCAiY29udGludWUiIFwKKyAgICAiQ29udGludWluZy4qUHJvZ3JhbSByZWNlaXZlZCBzaWduYWwgU0lHVEVSTS4qIiBcCisgICAgImdldCBzaWduYWwgVEVSTSIKK2dkYl90ZXN0ICJjb250aW51ZSIgIkJyZWFrcG9pbnQuKmhhbmRsZV9URVJNLioiICJzZW5kIHNpZ25hbCBURVJNIgorZ2RiX3Rlc3QgImNvbnRpbnVlIiAiUHJvZ3JhbSBleGl0ZWQgbm9ybWFsbHlcXC4iICJjb250aW51ZSB0byBzaWdhbGwgZXhpdCIKKworcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc2lnbmFscy5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zaWduYWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgwZTZlNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc2lnbmFscy5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qIFRlc3QgR0RCIGRlYWxpbmcgd2l0aCBzdHVmZiBsaWtlIHN0ZXBwaW5nIGludG8gc2lndHJhbXAuICAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpZmRlZiBfX3NoX18KKyNkZWZpbmUgc2lnbmFsKGEsYikJLyogU2lnbmFscyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgdGFyZ2V0IC0gbWFrZSB0aGVtIGdvIGF3YXkgKi8KKyNkZWZpbmUgYWxhcm0oYSkJLyogRGl0dG8gZm9yIGFsYXJtKCkgKi8KKyNlbmRpZgorCitzdGF0aWMgaW50IGNvdW50ID0gMDsKKworc3RhdGljIHZvaWQKK2hhbmRsZXIgKHNpZykKKyAgICAgaW50IHNpZzsKK3sKKyAgc2lnbmFsIChzaWcsIGhhbmRsZXIpOworICArK2NvdW50OworfQorCitzdGF0aWMgdm9pZAorZnVuYzEgKCkKK3sKKyAgKytjb3VudDsKK30KKworc3RhdGljIHZvaWQKK2Z1bmMyICgpCit7CisgICsrY291bnQ7Cit9CisKK2ludAorbWFpbiAoKQoreworI2lmZGVmIHVzZXN0dWJzCisgIHNldF9kZWJ1Z190cmFwcygpOworICBicmVha3BvaW50KCk7CisjZW5kaWYKKyNpZmRlZiBTSUdBTFJNCisgIHNpZ25hbCAoU0lHQUxSTSwgaGFuZGxlcik7CisjZW5kaWYKKyNpZmRlZiBTSUdVU1IxCisgIHNpZ25hbCAoU0lHVVNSMSwgaGFuZGxlcik7CisjZW5kaWYKKyAgYWxhcm0gKDEpOworICArK2NvdW50OyAvKiBmaXJzdCAqLworICBhbGFybSAoMSk7CisgICsrY291bnQ7IC8qIHNlY29uZCAqLworICBmdW5jMSAoKTsKKyAgYWxhcm0gKDEpOworICBmdW5jMiAoKTsKKyAgcmV0dXJuIGNvdW50OworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zaWduYWxzLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc2lnbmFscy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliZjQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc2lnbmFscy5leHAKQEAgLTAsMCArMSw2MjggQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKK2lmIFt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiLG5vc2lnbmFsc10geworICAgIHZlcmJvc2UgIlNraXBwaW5nIHNpZ25hbHMuZXhwIGJlY2F1c2Ugb2Ygbm9zaWduYWxzLiIKKyAgICBjb250aW51ZQorfQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSBzaWduYWxzCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisjIENyZWF0ZSBhbmQgc291cmNlIHRoZSBmaWxlIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyCisjIHVzZWQgdG8gY29tcGlsZSB0aGUgdGVzdCBjYXNlLgoraWYgW2dldF9jb21waWxlcl9pbmZvICR7YmluZmlsZX1dIHsKKyAgICByZXR1cm4gLTE7Cit9CisKK3Byb2Mgc2lnbmFsX3Rlc3RzXzEge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgaWYgW3J1bnRvX21haW5dIHRoZW4geworCWdkYl90ZXN0ICJuZXh0IiAic2lnbmFsIFxcKFNJR1VTUjEuKiIgXAorCQkibmV4dCBvdmVyIHNpZ25hbCAoU0lHQUxSTSwgaGFuZGxlcikiCisJZ2RiX3Rlc3QgIm5leHQiICJhbGFybSBcXCguKiIgXAorCQkibmV4dCBvdmVyIHNpZ25hbCAoU0lHVVNSMSwgaGFuZGxlcikiCisJZ2RiX3Rlc3QgIm5leHQiICJcXCtcXCtjb3VudDsgL1xcKiBmaXJzdCBcXCovIiBcCisJCSJuZXh0IG92ZXIgYWxhcm0gKDEpIgorCSMgQW4gYWxhcm0gaGFzIGJlZW4gc2lnbmFsZWQsIGdpdmUgdGhlIHNpZ25hbCB0aW1lIHRvIGdldCBkZWxpdmVyZWQuCisJc2xlZXAgMgorCisJIyBpMzg2IEJTRCBjdXJyZW50bHkgZmFpbHMgdGhlIG5leHQgdGVzdCB3aXRoIGEgU0lHVFJBUC4KKwlzZXR1cF94ZmFpbCAiaSo4Ni0qLWJzZCoiCisJIyBCdXQgRHluaXggaGFzIGEgREVDUl9QQ19BRlRFUl9CUkVBSyBvZiB6ZXJvLCBzbyB0aGUgZmFpbHVyZQorCSMgaXMgc2hhZG93ZWQgYnkgaGl0dGluZyB0aGUgdGhyb3VnaF9zaWd0cmFtcF9icmVha3BvaW50LgorCWNsZWFyX3hmYWlsICJpKjg2LXNlcXVlbnQtYnNkKiIKKwkjIFVuaXZlbCBTVlI0IGkzODYgY29udGludWVzIGluc3RlYWQgb2Ygc3RlcHBpbmcuCisJc2V0dXBfeGZhaWwgImkqODYtdW5pdmVsLXN5c3Y0KiIKKwkjIGx5bnggZmFpbHMgd2l0aCAibmV4dCIgYWN0aW5nIGxpa2UgImNvbnRpbnVlIgorCXNldHVwX3hmYWlsICIqLSotKmx5bngqIgorCSMgbGludXggKGFvdXQgdmVyc2lvbnMpIGFsc28gZmFpbHMgd2l0aCAibmV4dCIgYWN0aW5nIGxpa2UgImNvbnRpbnVlIgorCSMgdGhpcyBpcyBwcm9iYWJseSBtb3JlIGRlcGVuZGFudCBvbiB0aGUga2VybmVsIHZlcnNpb24gdGhhbiBvbiB0aGUKKwkjIG9iamVjdCBmaWxlIGZvcm1hdCBvciB1dGlscy4gIChzaWdoKQorCXNldHVwX3hmYWlsICJpKjg2LXBjLWxpbnV4YW91dC1nbnUiICJpKjg2LXBjLWxpbnV4b2xkbGQtZ251IgorCXNlbmRfZ2RiICJuZXh0XG4iCisJZ2RiX2V4cGVjdCB7CisJICAgIC1yZSAiYWxhcm0gLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgIm5leHQgdG8gMm5kIGFsYXJtICgxKSIgfQorCSAgICAtcmUgIlByb2dyYW0gcmVjZWl2ZWQgc2lnbmFsIFNJR1RSQVAuKmZpcnN0LiokZ2RiX3Byb21wdCAkIiB7CisKKwkJIyBUaGlzIGNhbiBoYXBwZW4gb24gbWFjaGluZXMgdGhhdCBoYXZlIGEgdHJhY2UgZmxhZworCQkjIGluIHRoZWlyIFBTIHJlZ2lzdGVyLgorCQkjIFRoZSB0cmFjZSBmbGFnIGluIHRoZSBQUyByZWdpc3RlciB3aWxsIGJlIHNldCBkdWUgdG8KKwkJIyB0aGUgYG5leHQnIGNvbW1hbmQuCisJCSMgQmVmb3JlIGNhbGxpbmcgdGhlIHNpZ25hbCBoYW5kbGVyLCB0aGUgUFMgcmVnaXN0ZXIKKwkJIyBpcyBwdXNoZWQgYWxvbmcgd2l0aCB0aGUgY29udGV4dCBvbiB0aGUgdXNlciBzdGFjay4KKwkJIyBXaGVuIHRoZSBzaWduYWwgaGFuZGxlciBoYXMgZmluaXNoZWQsIGl0IHJlZW50ZXJzIHRoZQorCQkjIHRoZSBrZXJuZWwgdmlhIGEgc2lncmV0dXJuIHN5c2NhbGwsIHdoaWNoIHJlc3RvcmVzIHRoZQorCQkjIFBTIHJlZ2lzdGVyIGFsb25nIHdpdGggdGhlIGNvbnRleHQuCisJCSMgSWYgdGhlIGtlcm5lbCBlcnJvbmVvdXNseSBkb2VzIG5vdCBjbGVhciB0aGUgdHJhY2UgZmxhZworCQkjIGluIHRoZSBwdXNoZWQgY29udGV4dCwgZ2RiIHdpbGwgcmVjZWl2ZSBhIFNJR1RSQVAgZnJvbQorCQkjIHRoZSBzZXQgdHJhY2UgZmxhZyBpbiB0aGUgcmVzdG9yZWQgY29udGV4dCBhZnRlciB0aGUKKwkJIyBzaWduYWwgaGFuZGxlciBoYXMgZmluaXNoZWQuCisKKwkJIyBJIGRvIG5vdCB5ZXQgdW5kZXJzdGFuZCB3aHkgdGhlIFNJR1RSQVAgZG9lcyBub3Qgb2NjdXIKKwkJIyBhZnRlciBzdGVwcGluZyB0aGUgaW5zdHJ1Y3Rpb24gYXQgdGhlIHJlc3RvcmVkIFBDIG9uCisJCSMgaTM4NiBCU0RJIDEuMCBzeXN0ZW1zLgorCisJCSMgTm90ZSB0aGF0IHRoZSB2YXggdW5kZXIgVWx0cml4IGFsc28gZXhoaWJpdHMKKwkJIyB0aGlzIGJlaGF2aW91ciAoaXQgaXMgdW5jb3ZlcmVkIGJ5IHRoZSBgY29udGludWUgZnJvbQorCQkjIGEgYnJlYWsgaW4gYSBzaWduYWwgaGFuZGxlcicgdGVzdCBiZWxvdykuCisJCSMgV2l0aCB0aGlzIHRlc3QgdGhlIGZhaWx1cmUgaXMgc2hhZG93ZWQgYnkgaGl0dGluZyB0aGUKKwkJIyB0aHJvdWdoX3NpZ3RyYW1wX2JyZWFrcG9pbnQgdXBvbiByZXR1cm4gZnJvbSB0aGUgc2lnbmFsCisJCSMgaGFuZGxlci4KKworCQkjIFNWUjQgYW5kIExpbnV4IGJhc2VkIGkqODYgc3lzdGVtcyBleGhpYml0IHRoaXMgYmVoYXZpb3VyCisJCSMgYXMgd2VsbCAoaXQgaXMgdW5jb3ZlcmVkIGJ5IHRoZSBgY29udGludWUgZnJvbSBhIGJyZWFrCisJCSMgaW4gYSBzaWduYWwgaGFuZGxlcicgdGVzdCBiZWxvdykuCisJCSMgQXMgdGhlc2Ugc3lzdGVtcyB1c2UgcHJvY2ZzLCB3aGVyZSB3ZSB0ZWxsIHRoZSBrZXJuZWwgbm90CisJCSMgdG8gdGVsbCBnZGIgYWJvdXQgYHBhc3MnIHNpZ25hbHMsIGFuZCB0aGUgdHJhY2UgZmxhZyBpcworCQkjIGNsZWFyZWQgYnkgdGhlIGtlcm5lbCBiZWZvcmUgZW50ZXJpbmcgdGhlIHNpZ3RyYW1wCisJCSMgcm91dGluZSwgR0RCIHdpbGwgbm90IG5vdGljZSB0aGUgZXhlY3V0aW9uIG9mIHRoZSBzaWduYWwgCisJCSMgaGFuZGxlci4KKwkJIyBVcG9uIHJldHVybiBmcm9tIHRoZSBzaWduYWwgaGFuZGxlciwgR0RCIHdpbGwgcmVjZWl2ZQorCQkjIGEgU0lHVFJBUCBmcm9tIHRoZSBzZXQgdHJhY2UgZmxhZyBpbiB0aGUgcmVzdG9yZWQgY29udGV4dC4KKwkJIyBUaGUgU0lHVFJBUCBtYXJrcyB0aGUgZW5kIG9mIGEgKGFsYmVpdCBsb25nIHdpbmRlZCkKKwkJIyBzaW5nbGUgc3RlcCBmb3IgR0RCLCBjYXVzaW5nIHRoaXMgdGVzdCB0byBwYXNzLgorCisJCWZhaWwgIm5leHQgdG8gMm5kIGFsYXJtICgxKSAocHJvYmFibHkga2VybmVsIGJ1ZykiCisJCWdkYl90ZXN0ICJuZXh0IiAiYWxhcm0uKiIgIm5leHQgdG8gMm5kIGFsYXJtICgxKSIKKwkgICAgfQorCSAgICAtcmUgIlByb2dyYW0gZXhpdGVkIHdpdGggY29kZS4qJGdkYl9wcm9tcHQgJCIgeworCisJCSMgVGhpcyBpcyBhcHBhcmVudGx5IGEgYnVnIGluIHRoZSBVbml4V2FyZSBrZXJuZWwgKGJ1dAorCQkjIGhhcyBub3QgYmVlbiBpbnZlc3RpZ2F0ZWQgYmV5b25kIHRoZQorCQkjIHJlc3VtZS90YXJnZXRfd2FpdCBsZXZlbCwgYW5kIGhhcyBub3QgYmVlbiByZXBvcnRlZAorCQkjIHRvIFVuaXZlbCkuICBJZiBpdCBzdGVwcyB3aGVuIGEgc2lnbmFsIGlzIHBlbmRpbmcsCisJCSMgaXQgZG9lcyBhIGNvbnRpbnVlIGluc3RlYWQuICBJIGRvbid0IGtub3cgd2hldGhlcgorCQkjIHRoZXJlIGlzIGEgd29ya2Fyb3VuZC4KKworCQkjIFBlcmhhcHMgdGhpcyBwcm9ibGVtIGV4aXN0cyBvbiBvdGhlciBTVlI0IHN5c3RlbXM7CisJCSMgYnV0IChhKSB3ZSBoYXZlIG5vIHJlYXNvbiB0byB0aGluayBzbywgYW5kIChiKSBpZiB3ZQorCQkjIHB1dCBhIHdyb25nIHhmYWlsIGhlcmUsIHdlIG5ldmVyIGdldCBhbiBYUEFTUyB0byBsZXQKKwkJIyB1cyBrbm93IHRoYXQgaXQgd2FzIGluY29ycmVjdCAoYW5kIHRoZW4gaWYgc3VjaCBhCisJCSMgY29uZmlndXJhdGlvbiByZWdyZXNzZXMgd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZykuCisJCSMgU29sYXJpcyBpcyBub3QgYSByZWxldmFudCBkYXRhIHBvaW50IGVpdGhlciB3YXkKKwkJIyBiZWNhdXNlIGl0IGxhY2tzIHNpbmdsZSBzdGVwcGluZy4KKworCQkjIGZuZjogSSBkb24ndCBhZ3JlZSB3aXRoIHRoZSBhYm92ZSBwaGlsb3NvcGh5LiAgV2UKKwkJIyBjYW4gbmV2ZXIgYmUgc3VyZSB0aGF0IGFueSBwYXJ0aWN1bGFyIFhGQUlMIGlzCisJCSMgc3BlY2lmaWVkIDEwMCUgY29ycmVjdGx5IGluIHRoYXQgbm8gc3lzdGVtcyB3aXRoCisJCSMgdGhlIGJ1ZyBhcmUgbWlzc2VkIGFuZCBhbGwgc3lzdGVtcyB3aXRob3V0IHRoZSBidWcKKwkJIyBhcmUgZXhjbHVkZWQuICBJZiB3ZSBpbmNsdWRlIGFuIFhGQUlMIHRoYXQgaXNuJ3QKKwkJIyBhcHByb3ByaWF0ZSBmb3IgYSBwYXJ0aWN1bGFyIHN5c3RlbSwgdGhlbiB3aGVuIHRoYXQKKwkJIyBzeXN0ZW0gZ2V0cyB0ZXN0ZWQgaXQgd2lsbCBYUEFTUywgYW5kIHNvbWVvbmUgc2hvdWxkCisJCSMgaW52ZXN0aWdhdGUgYW5kIGZpeCB0aGUgc2V0dXBfeGZhaWwgYXMgYXBwcm9wcmlhdGUsCisJCSMgb3IgbW9yZSBwcmVmZXJhYmx5LCB0aGUgYWN0dWFsIGJ1Zy4gIEVhY2ggc3VjaCBjYXNlCisJCSMgYWRkcyBtb3JlIGRhdGEgdG8gbmFycm93aW5nIGRvd24gdGhlIHNjb3BlIG9mIHRoZQorCQkjIHByb2JsZW0gYW5kIHVsdGltYXRlbHkgZml4aW5nIGl0LgorCisJCXNldHVwX3hmYWlsICJpKjg2LSotc3lzdjQqIgorCQlmYWlsICInbmV4dCcgYmVoYXZlZCBhcyAnY29udGludWUgKGtub3duIFNWUjQgYnVnKSciCisJCXJldHVybiAwCisJICAgIH0KKwkgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibmV4dCB0byAybmQgYWxhcm0gKDEpIiB9CisJICAgIHRpbWVvdXQgeyBmYWlsICJuZXh0IHRvIDJuZCBhbGFybSAoMSk7ICh0aW1lb3V0KSIgfQorCSAgICBlb2YgeyBmYWlsICJuZXh0IHRvIDJuZCBhbGFybSAoMSk7IChlb2YpIiB9CisJfQorCisJZ2RiX3Rlc3QgImJyZWFrIGhhbmRsZXIiICJCcmVha3BvaW50IFxbMC05XF0rIC4qIgorCWdkYl90ZXN0ICJuZXh0IiAiXFwrXFwrY291bnQ7IC9cXCogc2Vjb25kIFxcKi8iIFwKKwkgICAgIm5leHQgdG8gMm5kICsrY291bnQgaW4gc2lnbmFsc190ZXN0c18xIgorCSMgQW4gYWxhcm0gaGFzIGJlZW4gc2lnbmFsZWQsIGdpdmUgdGhlIHNpZ25hbCB0aW1lIHRvIGdldCBkZWxpdmVyZWQuCisJc2xlZXAgMgorCisJc2V0IGJhc2hfYnVnIDAKKwlzZW5kX2dkYiAibmV4dFxuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIkJyZWFrcG9pbnQuKmhhbmRsZXIuKiRnZGJfcHJvbXB0ICQiIHsKKwkJcGFzcyAibmV4dCB0byBoYW5kbGVyIGluIHNpZ25hbHNfdGVzdHNfMSIKKwkgICAgfQorCSAgICAtcmUgIlByb2dyYW0gcmVjZWl2ZWQgc2lnbmFsIFNJR0VNVC4qJGdkYl9wcm9tcHQgJCIgeworCQkjIEJhc2ggdmVyc2lvbnMgYmVmb3JlIDEuMTMuNSBjYXVzZSB0aGlzIGJlaGF2aW91cgorCQkjIGJ5IGJsb2NraW5nIFNJR1RSQVAuCisJCWZhaWwgIm5leHQgdG8gaGFuZGxlciBpbiBzaWduYWxzX3Rlc3RzXzEgKGtub3duIHByb2JsZW0gd2l0aCBiYXNoIHZlcnNpb25zIGJlZm9yZSAxLjEzLjUpIgorCQlzZXQgYmFzaF9idWcgMQorCQlnZGJfdGVzdCAic2lnbmFsIDAiICJCcmVha3BvaW50LipoYW5kbGVyLioiCisJICAgIH0KKwkgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibmV4dCB0byBoYW5kbGVyIGluIHNpZ25hbHNfdGVzdHNfMSIgfQorCSAgICB0aW1lb3V0IHsgZmFpbCAibmV4dCB0byBoYW5kbGVyIGluIHNpZ25hbHNfdGVzdHNfMSAodGltZW91dCkiIH0KKwkgICAgZW9mIHsgZmFpbCAibmV4dCB0byBoYW5kbGVyIGluIHNpZ25hbHNfdGVzdHNfMSAoZW9mKSIgfQorCX0KKworCSMgVGhpcyBkb2Vzbid0IHRlc3QgdGhhdCBtYWluIGlzIGZyYW1lICMyLCBqdXN0IHRoYXQgbWFpbiBpcyBmcmFtZQorCSMgIzIsICMzLCBvciBoaWdoZXIuICBBdCBzb21lIHBvaW50IHRoaXMgc2hvdWxkIGJlIGZpeGVkIChidXQKKwkjIGl0IHF1aXRlIHBvc3NpYmx5IHdvdWxkIGludHJvZHVjZSBuZXcgRkFJTHMgb24gc29tZSBzeXN0ZW1zKS4KKwlzZXR1cF94ZmFpbCAiaSo4Ni1wYy1saW51eC1nbnUqIiAiaSo4Ni0qLWJzZGkyLjAiCisJZ2RiX3Rlc3QgImJhY2t0cmFjZSAxMCIgIiMwLipoYW5kbGVyLiojMS4qIzIuKm1haW4uKiIgXAorCSAgICAiYmFja3RyYWNlIGluIHNpZ25hbHNfdGVzdHNfMSIKKworCWdkYl90ZXN0ICJicmVhayBmdW5jMSIgIkJyZWFrcG9pbnQgXFswLTlcXSsgLioiCisJZ2RiX3Rlc3QgImJyZWFrIGZ1bmMyIiAiQnJlYWtwb2ludCBcWzAtOVxdKyAuKiIKKworCSMgVmF4IFVsdHJpeCBhbmQgaTM4NiBCU0QgY3VycmVudGx5IGZhaWwgdGhlIG5leHQgdGVzdCB3aXRoCisJIyBhIFNJR1RSQVAsIGJ1dCB3aXRoIGRpZmZlcmVudCBzeW1wdG9tcy4KKwlzZXR1cF94ZmFpbCAidmF4LSotdWx0cml4KiIKKwlzZXR1cF94ZmFpbCAiaSo4Ni0qLWJzZCoiCisJc2V0dXBfeGZhaWwgImkqODYtcGMtbGludXgtZ251KiIKKwlzZXR1cF94ZmFpbCAiaSo4Ni0qLXNvbGFyaXMyKiIKKwlzZW5kX2dkYiAiY29udGludWVcbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICJCcmVha3BvaW50LipmdW5jMS4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJjb250aW51ZSB0byBmdW5jMSIgfQorCSAgICAtcmUgIlByb2dyYW0gcmVjZWl2ZWQgc2lnbmFsIFNJR1RSQVAuKnNlY29uZC4qJGdkYl9wcm9tcHQgJCIgeworCisJCSMgU2VlIGV4cGxhbmF0aW9uIGZvciBgbmV4dCB0byAybmQgYWxhcm0gKDEpJyBmYWlsIGFib3ZlLgorCQkjIFdlIGRpZCBzdGVwIGludG8gdGhlIHNpZ25hbCBoYW5kbGVyLCBoaXQgYSBicmVha3BvaW50CisJCSMgaW4gdGhlIGhhbmRsZXIgYW5kIGNvbnRpbnVlZCBmcm9tIHRoZSBicmVha3BvaW50LgorCQkjIFRoZSBzZXQgdHJhY2UgZmxhZyBpbiB0aGUgcmVzdG9yZWQgY29udGV4dCBpcyBjYXVzaW5nCisJCSMgdGhlIFNJR1RSQVAsIHdpdGhvdXQgc3RlcHBpbmcgYW4gaW5zdHJ1Y3Rpb24uCisKKwkJZmFpbCAiY29udGludWUgdG8gZnVuYzEgKHByb2JhYmx5IGtlcm5lbCBidWcpIgorCQlnZGJfdGVzdCAiY29udGludWUiICJCcmVha3BvaW50LipmdW5jMS4qIiBcCisJCSAgICAiZXh0cmEgY29udGludWUgdG8gZnVuYzEiCisJICAgIH0KKwkgICAgLXJlICJQcm9ncmFtIHJlY2VpdmVkIHNpZ25hbCBTSUdUUkFQLipmdW5jMSAuLjsuKiRnZGJfcHJvbXB0ICQiIHsKKworCQkjIE9uIHRoZSB2YXggdW5kZXIgVWx0cml4IHRoZSBzZXQgdHJhY2UgZmxhZyBpbiB0aGUgcmVzdG9yZWQKKwkJIyBjb250ZXh0IGlzIGNhdXNpbmcgdGhlIFNJR1RSQVAsIGJ1dCBhZnRlciBzdGVwcGluZyBvbmUKKwkJIyBpbnN0cnVjdGlvbiwgYXMgZXhwZWN0ZWQuCisKKwkJZmFpbCAiY29udGludWUgdG8gZnVuYzEgKHByb2JhYmx5IGtlcm5lbCBidWcpIgorCQlnZGJfdGVzdCAiY29udGludWUiICJCcmVha3BvaW50LipmdW5jMS4qIiBcCisJCSAgICAiZXh0cmEgY29udGludWUgdG8gZnVuYzEiCisJICAgIH0KKwkgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29udGludWUgdG8gZnVuYzEiIH0KKwkgICAgZGVmYXVsdCB7IGZhaWwgImNvbnRpbnVlIHRvIGZ1bmMxIiB9CisJfQorCisJc2V0dXBfeGZhaWwgIiotKi1pcml4KiIKKwlzZW5kX2dkYiAic2lnbmFsIFNJR1VTUjFcbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICJCcmVha3BvaW50LipoYW5kbGVyLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInNpZ25hbCBTSUdVU1IxIiB9CisJICAgIC1yZSAiUHJvZ3JhbSByZWNlaXZlZCBzaWduYWwgU0lHVVNSMS4qJGdkYl9wcm9tcHQgJCIgeworCQkjIFRoaXMgaXMgd2hhdCBpcml4NCBhbmQgaXJpeDUgZG8uCisJCSMgSXQgd291bGQgYXBwZWFyIHRvIGJlIGEga2VybmVsIGJ1Zy4KKwkJZmFpbCAic2lnbmFsIFNJR1VTUjEiCisJCWdkYl90ZXN0ICJjb250aW51ZSIgIkJyZWFrcG9pbnQuKmhhbmRsZXIuKiIgInBhc3MgaXQgU0lHVVNSMSIKKwkgICAgfQorCSAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJzaWduYWwgU0lHVVNSMSIgfQorCSAgICBkZWZhdWx0IHsgZmFpbCAic2lnbmFsIFNJR1VTUjEiIH0KKwl9CisKKwkjIFdpbGwgdGVuZCB0byB3cm9uZ2x5IHJlcXVpcmUgYW4gZXh0cmEgY29udGludWUuCisKKwkjIFRoZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCB0aGUgYnJlYWtwb2ludCBhdCBmdW5jMSB3aWxsIGJlCisJIyBpbnNlcnRlZCwgYW5kIHdoZW4gdGhlIHN5c3RlbSBmaW5pc2hlcyB3aXRoIHRoZSBzaWduYWwKKwkjIGhhbmRsZXIgaXQgd2lsbCB0cnkgdG8gZXhlY3V0ZSB0aGVyZS4gIEZvciBHREIgdG8gdHJ5IHRvCisJIyByZW1lbWJlciB0aGF0IGl0IHdhcyBnb2luZyB0byBzdGVwIG92ZXIgYSBicmVha3BvaW50IHdoZW4gYQorCSMgc2lnbmFsIGhhcHBlbmVkLCBkaXN0aW5ndWlzaCB0aGlzIGNhc2UgZnJvbSB0aGUgY2FzZSB3aGVyZQorCSMgZnVuYzEgaXMgY2FsbGVkIGZyb20gdGhlIHNpZ25hbCBoYW5kbGVyLCBldGMuLCBzZWVtcworCSMgZXhjZWVkaW5nbHkgZGlmZmljdWx0LiAgU28gZG9uJ3QgZXhwZWN0IHRoaXMgdG8gZ2V0IGZpeGVkCisJIyBhbnl0aW1lIHNvb24uCisKKwlzZXR1cF94ZmFpbCAiKi0qLSoiCisJc2VuZF9nZGIgImNvbnRpbnVlXG4iCisJZ2RiX2V4cGVjdCB7CisJICAgIC1yZSAiQnJlYWtwb2ludC4qZnVuYzIuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiY29udGludWUgdG8gZnVuYzIiIH0KKwkgICAgLXJlICJCcmVha3BvaW50LipmdW5jMS4qJGdkYl9wcm9tcHQgJCIgeworCSAgICAJZmFpbCAiY29udGludWUgdG8gZnVuYzIiCisJCWdkYl90ZXN0ICJjb250aW51ZSIgIkJyZWFrcG9pbnQuKmZ1bmMyLioiIFwKKwkJICAgICJleHRyYSBjb250aW51ZSB0byBmdW5jMiIKKwkgICAgfQorCSAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb250aW51ZSB0byBmdW5jMiIgfQorCSAgICBkZWZhdWx0IHsgZmFpbCAiY29udGludWUgdG8gZnVuYzIiIH0KKwl9CisKKwlzbGVlcCAyCisKKyAgICAgICAgIyBHREIgeWFua3Mgb3V0IHRoZSBicmVha3BvaW50cyB0byBzdGVwIG92ZXIgdGhlIGJyZWFrcG9pbnQgaXQKKyAgICAgICAgIyBzdG9wcGVkIGF0LCB3aGljaCBtZWFucyB0aGUgYnJlYWtwb2ludCBhdCBoYW5kbGVyIGlzIHlhbmtlZC4KKwkjIEJ1dCBpZiBTT0ZUV0FSRV9TSU5HTEVfU1RFUF9QLCB3ZSB3b24ndCBnZXQgYW5vdGhlciBjaGFuY2UgdG8KKwkjIHJlaW5zZXJ0IHRoZW0gKGF0IGxlYXN0IG5vdCB3aXRoIHByb2Nmcywgd2hlcmUgd2UgdGVsbCB0aGUga2VybmVsCisJIyBub3QgdG8gdGVsbCBnZGIgYWJvdXQgYHBhc3MnIHNpZ25hbHMpLiAgU28gdGhlIGZpeCB3b3VsZCBhcHBlYXIgdG8KKwkjIGJlIHRvIGp1c3QgeWFuayB0aGF0IG9uZSBicmVha3BvaW50IHdoZW4gd2Ugc3RlcCBvdmVyIGl0LgorCisJc2V0dXBfeGZhaWwgInNwYXJjKi0qLSoiCisJc2V0dXBfeGZhaWwgInJzNjAwMC0qLSoiCisJc2V0dXBfeGZhaWwgInBvd2VycGMtKi0qIgorCisJIyBBIGZhdWx0eSBiYXNoIHdpbGwgbm90IHN0ZXAgdGhlIGluZmVyaW9yIGludG8gc2lndHJhbXAgb24gc3VuMy4KKwlpZiB7JGJhc2hfYnVnfSB0aGVuIHsKKwkgICAgc2V0dXBfeGZhaWwgIm02OCotKi1zdW5vczQqIgorCX0KKworCXNldHVwX3hmYWlsICJpKjg2LXBjLWxpbnV4LWdudSoiCisJc2V0dXBfeGZhaWwgImkqODYtKi1zb2xhcmlzMioiCisJZ2RiX3Rlc3QgImNvbnRpbnVlIiAiQnJlYWtwb2ludC4qaGFuZGxlci4qIiAiY29udGludWUgdG8gaGFuZGxlciIKKworCSMgSWYgdGhlIFNPRlRXQVJFX1NJTkdMRV9TVEVQX1AgZmFpbHVyZSBoYXBwZW5lZCwgd2UgaGF2ZSBhbHJlYWR5CisJIyBleGl0ZWQuCisgICAgICAgICMgSWYgd2Ugc3VjY2VlZGVkIGEgY29udGludWUgd2lsbCByZXR1cm4gZnJvbSB0aGUgaGFuZGxlciB0byBmdW5jMi4KKwkjIEdEQiBub3cgaGFzIGBmb3Jnb3R0ZW4nIHRoYXQgaXQgaW50ZW5kZWQgdG8gc3RlcCBvdmVyIHRoZQorCSMgYnJlYWtwb2ludCBhdCBmdW5jMiBhbmQgd2lsbCBzdG9wIGF0IGZ1bmMyLgorCXNldHVwX3hmYWlsICIqLSotKiIKKwkjIFRoZSBzdW4zIHdpdGggYSBmYXVsdHkgYmFzaCB3aWxsIGFsc28gYmUgYGZvcmdldGZ1bCcgYnV0IGl0CisJIyBhbHJlYWR5IGdvdCB0aGUgc3B1cmlvdXMgc3RvcCBhdCBmdW5jMiBhbmQgdGhpcyBjb250aW51ZSB3aWxsIHdvcmsuCisJaWYgeyRiYXNoX2J1Z30gdGhlbiB7CisJICAgICBjbGVhcl94ZmFpbCAibTY4Ki0qLXN1bm9zNCoiCisJfQorCWdkYl90ZXN0ICJjb250aW51ZSIgIlByb2dyYW0gZXhpdGVkIHdpdGggY29kZSAwMTBcXC4iIFwKKwkgICAgImNvbnRpbnVlIHRvIGV4aXQgaW4gc2lnbmFsc190ZXN0c18xICIKKyAgICB9Cit9CisKKyMgT24gYSBmZXcgbG9zaW5nIHN5c3RlbXMsIHB0cmFjZSAoUFRfQ09OVElOVUUpIG9yIHB0cmFjZSAoUFRfU1RFUCkKKyMgY2F1c2VzIHBlbmRpbmcgc2lnbmFscyB0byBiZSBjbGVhcmVkLCB3aGljaCBjYXVzZXMgdGhlc2UgdGVzdHMgdG8KKyMgZ2V0IG5vd2hlcmUgZmFzdC4gIFRoaXMgaXMgdG90YWxseSBsb3NpbmcgYmVoYXZpb3IgKHBlcmhhcHMgdGhlcmUKKyMgYXJlIGNhc2VzIGluIHdoaWNoIGlzIGl0IHVzZWZ1bCBidXQgdGhlIHVzZXIgbmVlZHMgbW9yZSBjb250cm9sLAorIyB3aGljaCB0aGV5IG1vc3RseSBoYXZlIGluIEdEQiksIGJ1dCBzb21lIHBlb3BsZSBhcHBhcmVudGx5IHRoaW5rIGl0CisjIGlzIGEgZmVhdHVyZS4gIEl0IGlzIGRvY3VtZW50ZWQgaW4gdGhlIHB0cmFjZSBtYW5wYWdlIG9uIE1vdG9yb2xhCisjIERlbHRhIFNlcmllcyBzeXNWNjggUjNWNy4xIGFuZCBvbiBIUFVYIDkuMC4gIEV2ZW4gdGhlIG5vbi1IUFVYIFBBCisjIE9TZXMgKEJTRCBhbmQgT1NGLzEpIHNlZW0gdG8gaGF2ZSBmaWd1cmVkIHRoZXkgaGFkIHRvIGNvcHkgdGhpcworIyBicmFpbmRhbWFnZS4KKworaWYge1sgaXN0YXJnZXQgIm02OCotbW90b3JvbGEtKiIgXSB8fCBbIGlzdGFyZ2V0ICJocHBhKi0qLWJzZCoiIF0gfHwKKyAgICBbIGlzdGFyZ2V0ICJocHBhKi0qLW9zZioiIF19IHRoZW4geworICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgIGZhaWwgInB0cmFjZSBsb3NlcyBvbiBzaWduYWxzIG9uIHRoaXMgdGFyZ2V0IgorICByZXR1cm4gMAorfQorCisjIGx5bngyLjIuMiBkb2Vzbid0IGxvc2Ugc2lnbmFscywgaW5zdGVhZCBpdCBzY3Jld3MgdXAgdGhlIHN0YWNrIHBvaW50ZXIKKyMgaW4gc29tZSBvZiB0aGVzZSB0ZXN0cyBsZWFkaW5nIHRvIG1hc3NpdmUgcHJvYmxlbXMuICBJJ3ZlCisjIHJlcG9ydGVkIHRoaXMgdG8gbHlueCwgaG9wZWZ1bGx5IGl0J2xsIGJlIGZpeGVkIGluIGx5bngyLjMuCisjIFNldmVyZSBicmFpbmRhbWFnZS4KK2lmIFsgaXN0YXJnZXQgIiotKi0qbHlueCoiIF0gdGhlbiB7CisgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgZmFpbCAia2VybmVsIHNjcm9nZ3Mgc3RhY2sgcG9pbnRlciBpbiBzaWduYWwgdGVzdHMgb24gdGhpcyB0YXJnZXQiCisgIHJldHVybiAwCit9CisKK2dkYl9leGl0CitnZGJfc3RhcnQKKworIyBUaGlzIHdpbGwgbmVlZCB0byBiZSB1cGRhdGVkIGFzIHRoZSBleGFjdCBsaXN0IG9mIHNpZ25hbHMgY2hhbmdlcywKKyMgYnV0IEkgd2FudCB0byB0ZXN0IHRoYXQgVEFSR0VUX1NJR05BTF8wLCBUQVJHRVRfU0lHTkFMX0RFRkFVTFQsIGFuZAorIyBUQVJHRVRfU0lHTkFMX1VOS05PV04gYXJlIHNraXBwZWQuCitwcm9jIHRlc3RfaGFuZGxlX2FsbF9wcmludCB7fSB7CisgICAgZ2xvYmFsIHRpbWVvdXQKKyAgICAjIEluY3JlYXNlIHRpbWVvdXQgYW5kIGV4cGVjdCBpbnB1dCBidWZmZXIgZm9yIGxhcmdlIG91dHB1dCBmcm9tIGdkYi4KKyAgICAjIEFsbG93IGJsYW5rIG9yIFRBQiBhcyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCisgICAgc2V0IG9sZHRpbWVvdXQgJHRpbWVvdXQKKyAgICBzZXQgdGltZW91dCBbZXhwciAiJHRpbWVvdXQgKyAzNjAiXQorICAgIHZlcmJvc2UgIlRpbWVvdXQgaXMgbm93ICR0aW1lb3V0IHNlY29uZHMiIDIKKyAgICBpZiB7IFtpc3RhcmdldCAiKi0qLWdudSoiXSB8fCBbaXN0YXJnZXQgIiotKi1tYWNoKiJdIH0geworCWdkYl90ZXN0ICJoYW5kbGUgYWxsIHByaW50IiAiU2lnbmFsXFsgCVxdK1N0b3BcWyAJXF0rUHJpbnRcWyAJXF0rUGFzcyB0byBwcm9ncmFtXFsgCVxdK0Rlc2NyaXB0aW9uXHJcblNJR0hVUFxbIAlcXStZZXNcWyAJXF0rWWVzXFsgCVxdK1llc1xbIAlcXStIYW5ndXAuKlNJRzYzXFsgCVxdK1llc1xbIAlcXStZZXNcWyAJXF0rWWVzXFsgCVxdK1JlYWwtdGltZSBldmVudCA2My4qRVhDX0JSRUFLUE9JTlRcWyAJXF0rWWVzXFsgCVxdK1llc1xbIAlcXStZZXNcWyAJXF0rQnJlYWtwb2ludCIKKyAgICB9IGVsc2UgeworCWdkYl90ZXN0ICJoYW5kbGUgYWxsIHByaW50IiAiU2lnbmFsXFsgCVxdK1N0b3BcWyAJXF0rUHJpbnRcWyAJXF0rUGFzcyB0byBwcm9ncmFtXFsgCVxdK0Rlc2NyaXB0aW9uXHJcblNJR0hVUFxbIAlcXStZZXNcWyAJXF0rWWVzXFsgCVxdK1llc1xbIAlcXStIYW5ndXAuKlNJRzYzXFsgCVxdK1llc1xbIAlcXStZZXNcWyAJXF0rWWVzXFsgCVxdK1JlYWwtdGltZSBldmVudCA2MyIKKyAgICB9CisgICAgc2V0IHRpbWVvdXQgJG9sZHRpbWVvdXQKKyAgICB2ZXJib3NlICJUaW1lb3V0IHJlc3RvcmVkIHRvICR0aW1lb3V0IHNlY29uZHMiIDIKK30KK3Rlc3RfaGFuZGxlX2FsbF9wcmludAorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICRiaW5maWxlCitzaWduYWxfdGVzdHNfMQorCisjIEZvcmNlIGEgcmVzeW5jLCBzbyB3ZSdyZSBsb29raW5nIGF0IHRoZSByaWdodCBwcm9tcHQuICBPbiBTQ08gd2UKKyMgd2VyZSBnZXR0aW5nIG91dCBvZiBzeW5jIChJIGRvbid0IHVuZGVyc3RhbmQgd2h5KS4KK3NlbmRfZ2RiICJwIDErMVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICI9IDIuKiRnZGJfcHJvbXB0ICQiIHt9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgcGVycm9yICJzeW5jIHRyb3VibGUgaW4gc2lnbmFscy5leHAiIH0KKyAgICBkZWZhdWx0IHsgcGVycm9yICJzeW5jIHRyb3VibGUgaW4gc2lnbmFscy5leHAiIH0KK30KKworaWYgW3J1bnRvX21haW5dIHRoZW4geworICAgIGdkYl90ZXN0ICJicmVhayBoYW5kbGVyIGlmIDAiICJCcmVha3BvaW50IFxbMC05XF0rIC4qIgorICAgIGdkYl90ZXN0ICJzZXQgXCRoYW5kbGVyX2JyZWFrcG9pbnRfbnVtYmVyID0gXCRicG51bSIgIiIKKworICAgICMgR2V0IHRvIHRoZSBwb2ludCB3aGVyZSBhIHNpZ25hbCBpcyB3YWl0aW5nIHRvIGJlIGRlbGl2ZXJlZAorICAgIGdkYl90ZXN0ICJuZXh0IiAic2lnbmFsIFxcKFNJR1VTUjEuKiIgIm5leHQgdG8gc2lnbmFsIGluIHNpZ25hbHMuZXhwIgorICAgIGdkYl90ZXN0ICJuZXh0IiAiYWxhcm0gXFwoLioiICJuZXh0IHRvIGFsYXJtICMxIGluIHNpZ25hbHMuZXhwIgorICAgIGdkYl90ZXN0ICJuZXh0IiAiXFwrXFwrY291bnQ7IC9cXCogZmlyc3QgXFwqLyIgXAorCSJuZXh0IHRvICsrY291bnQgIzEgaW4gc2lnbmFscy5leHAiCisgICAgIyBHaXZlIHRoZSBzaWduYWwgdGltZSB0byBnZXQgZGVsaXZlcmVkCisgICAgc2xlZXAgMgorCisgICAgIyBOb3cgY2FsbCBhIGZ1bmN0aW9uLiAgV2hlbiBHREIgdHJpZXMgdG8gcnVuIHRoZSBzdGFjayBkdW1teSwKKyAgICAjIGl0IHdpbGwgaGl0IHRoZSBicmVha3BvaW50IGF0IGhhbmRsZXIuICBQcm92aWRlZCBpdCBkb2Vzbid0CisgICAgIyBsb3NlIGl0cyBjb29sLCB0aGlzIGlzIG5vdCBhIHByb2JsZW0sIGl0IGp1c3QgaGFzIHRvIG5vdGUKKyAgICAjIHRoYXQgdGhlIGJyZWFrcG9pbnQgY29uZGl0aW9uIGlzIGZhbHNlIGFuZCBrZWVwIGdvaW5nLgorCisgICAgZ2RiX3Rlc3QgInAgZnVuYzEgKCkiICJecCBmdW5jMSBcXChcXClcclxuLlxbMC05XF0qID0gdm9pZCIgXAorCSJwIGZ1bmMxICgpICMxIGluIHNpZ25hbHMuZXhwIgorCisgICAgIyBNYWtlIHN1cmUgdGhlIGNvdW50IGdvdCBpbmNyZW1lbnRlZC4KKworICAgICMgSGF2ZW4ndCBpbnZlc3RpZ2F0ZWQgdGhpcyB4ZmFpbAorICAgIHNldHVwX3hmYWlsICJyczYwMDAtKi0qIgorICAgIHNldHVwX3hmYWlsICJwb3dlcnBjLSotKiIKKyAgICBnZGJfdGVzdCAicCBjb3VudCIgIj0gMiIgInAgY291bnQgIzEgaW4gc2lnbmFscy5leHAiCisgICAgaWYgeyBbaXN0YXJnZXQgInJzNjAwMC0qLSoiXSB8fCBbaXN0YXJnZXQgInBvd2VycGMtKi0qIl0gfSB7IHJldHVybiAwIH0KKworICAgIGdkYl90ZXN0ICJjb25kaXRpb24gXCRoYW5kbGVyX2JyZWFrcG9pbnRfbnVtYmVyIiAibm93IHVuY29uZGl0aW9uYWxcXC4iCisgICAgZ2RiX3Rlc3QgIm5leHQiICJhbGFybSBcXCguKiIgIm5leHQgdG8gYWxhcm0gIzIgaW4gc2lnbmFscy5leHAiCisgICAgZ2RiX3Rlc3QgIm5leHQiICJcXCtcXCtjb3VudDsgL1xcKiBzZWNvbmQgXFwqLyIgXAorCSJuZXh0IHRvICsrY291bnQgIzIgaW4gc2lnbmFscy5leHAiCisgICAgc2xlZXAgMgorCisgICAgIyBUaGlzIHRpbWUgd2Ugc3RvcCB3aGVuIEdEQiB0cmllcyB0byBydW4gdGhlIHN0YWNrIGR1bW15LgorICAgICMgU28gaXQgaXMgT0sgdGhhdCB3ZSBkbyBub3QgcHJpbnQgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBmdW5jdGlvbi4KKyAgICBnZGJfdGVzdCAicCBmdW5jMSAoKSIgXAorIkJyZWFrcG9pbnQgXFswLTlcXSosIGhhbmRsZXIuKgorVGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgc3RvcHBlZCB3aGlsZSBpbiBhIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIEdEQi4qIiBcCisJInAgZnVuYzEgKCkgIzIgaW4gc2lnbmFscy5leHAiCisgICAgIyBCdXQgd2Ugc2hvdWxkIGJlIGFibGUgdG8gYmFja3RyYWNlLi4uCisgICAgIyBPbiBhbHBoYS0qLW9zZjIuMCB0aGlzIHRlc3Qgd29ya3Mgd2hlbiBydW4gbWFudWFsbHkgYnV0IHNvbWV0aW1lIGZhaWxzIHdoZW4KKyAgICAjIHJ1biB1bmRlciBkZWphZ251LCBtYWtpbmcgaXQgdmVyeSBoYXJkIHRvIGRlYnVnIHRoZSBwcm9ibGVtLiAgV2VpcmQuLi4KKyAgICBnZGJfdGVzdCAiYnQgMTAiICIjMC4qaGFuZGxlci4qIzEuKiMyLiptYWluLioiICJidCBpbiBzaWduYWxzLmV4cCIKKyAgICAjIC4uLmFuZCBjb250aW51ZS4uLgorICAgIGdkYl90ZXN0ICJjb250aW51ZSIgIkNvbnRpbnVpbmdcXC4iICJjb250aW51ZSBpbiBzaWduYWxzLmV4cCIKKyAgICAjIC4uLmFuZCB0aGVuIGNvdW50IHNob3VsZCBoYXZlIGJlZW4gaW5jcmVtZW50ZWQKKyAgICBnZGJfdGVzdCAicCBjb3VudCIgIj0gNSIgInAgY291bnQgIzIgaW4gc2lnbmFscy5leHAiCisKKworIyBWZXJpZnkgdGhhdCAiaW5mbyBzaWduYWxzIiBwcm9kdWNlcyByZWFzb25hYmxlIG91dHB1dC4KKyMKKyAgICBzZW5kX2dkYiAiaW5mbyBzaWduYWxzXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIlNJR0hVUC4qU0lHSU5ULipTSUdRVUlULipTSUdJTEwuKlNJR1RSQVAuKlNJR0FCUlQuKlNJR0VNVC4qU0lHRlBFLipTSUdLSUxMLipTSUdCVVMuKlNJR1NFR1YuKlNJR1NZUy4qU0lHUElQRS4qU0lHQUxSTS4qU0lHVEVSTS4qU0lHVVJHLipTSUdTVE9QLipTSUdUU1RQLipTSUdDT05ULipTSUdDSExELipTSUdUVElOLipTSUdUVE9VLipTSUdJTy4qU0lHWENQVS4qU0lHWEZTWi4qU0lHVlRBTFJNLipTSUdQUk9GLipTSUdXSU5DSC4qU0lHTE9TVC4qU0lHVVNSMS4qU0lHVVNSMi4qU0lHUFdSLipTSUdQT0xMLipTSUdXSU5ELipTSUdQSE9ORS4qU0lHV0FJVElORy4qU0lHTFdQLipTSUdEQU5HRVIuKlNJR0dSQU5ULipTSUdSRVRSQUNULipTSUdNU0cuKlNJR1NPVU5ELipTSUdTQUsuKlNJR1BSSU8uKlNJRzMzLipTSUczNC4qU0lHMzUuKlNJRzM2LipTSUczNy4qU0lHMzguKlNJRzM5LipTSUc0MC4qU0lHNDEuKlNJRzQyLipTSUc0My4qU0lHNDQuKlNJRzQ1LipTSUc0Ni4qU0lHNDcuKlNJRzQ4LipTSUc0OS4qU0lHNTAuKlNJRzUxLipTSUc1Mi4qU0lHNTMuKlNJRzU0LipTSUc1NS4qU0lHNTYuKlNJRzU3LipTSUc1OC4qU0lHNTkuKlNJRzYwLipTSUc2MS4qU0lHNjIuKlNJRzYzLipVc2UgdGhlIFwiaGFuZGxlXCIgY29tbWFuZCB0byBjaGFuZ2UgdGhlc2UgdGFibGVzLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAge3Bhc3MgImluZm8gc2lnbmFscyJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICB7ZmFpbCAiaW5mbyBzaWduYWxzIn0KKyAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBpbmZvIHNpZ25hbHMifQorICAgIH0KKworIyBWZXJpZnkgdGhhdCAiaW5mbyBzaWduYWwiIGNvcnJlY3RseSBoYW5kbGVzIGFuIGFyZ3VtZW50LCBiZSBpdCBhCisjIHN5bWJvbGljIHNpZ25hbCBuYW1lLCBvciBhbiBpbnRlZ2VyIElELgorIworICAgIHNlbmRfZ2RiICJpbmZvIHNpZ25hbCBTSUdUUkFQXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIi4qU0lHVFJBUFxbIFx0XF0qWWVzXFsgXHRcXSpZZXNcWyBcdFxdKk5vXFsgXHRcXSpUcmFjZS9icmVha3BvaW50IHRyYXAuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICB7cGFzcyAiaW5mbyBzaWduYWwgU0lHVFJBUCJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICB7ZmFpbCAiaW5mbyBzaWduYWwgU0lHVFJBUCJ9CisgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaW5mbyBzaWduYWwgU0lHVFJBUCJ9CisgICAgfQorCisgICAgc2VuZF9nZGIgImluZm8gc2lnbmFsIDVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiLipTSUdUUkFQXFsgXHRcXSpZZXNcWyBcdFxdKlllc1xbIFx0XF0qTm9cWyBcdFxdKlRyYWNlL2JyZWFrcG9pbnQgdHJhcC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgIHtwYXNzICJpbmZvIHNpZ25hbCA1In0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgIHtmYWlsICJpbmZvIHNpZ25hbCA1In0KKyAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBpbmZvIHNpZ25hbCA1In0KKyAgICB9CisKKyMgVmVyaWZ5IHRoYXQgImhhbmRsZSIgd2l0aCBpbGxlZ2FsIGFyZ3VtZW50cyBpcyBncmFjZWZ1bGx5LCB1bSwgaGFuZGxlZC4KKyMKKyAgICBzZW5kX2dkYiAiaGFuZGxlXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIkFyZ3VtZW50IHJlcXVpcmVkIC5zaWduYWwgdG8gaGFuZGxlLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAge3Bhc3MgImhhbmRsZSB3aXRob3V0IGFyZ3VtZW50cyJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICB7ZmFpbCAiaGFuZGxlIHdpdGhvdXQgYXJndW1lbnRzIn0KKyAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBoYW5kbGUgd2l0aG91dCBhcmd1bWVudHMifQorICAgIH0KKworICAgIHNlbmRfZ2RiICJoYW5kbGUgU0lHRk9PXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIlVucmVjb2duaXplZCBvciBhbWJpZ3VvdXMgZmxhZyB3b3JkOiBcIlNJR0ZPT1wiLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAge3Bhc3MgImhhbmRsZSB3aXRoIGJvZ3VzIFNJRyJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICB7ZmFpbCAiaGFuZGxlIHdpdGggYm9ndXMgU0lHIn0KKyAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBoYW5kbGUgd2l0aCBib2d1cyBTSUcifQorICAgIH0KKworICAgIHNlbmRfZ2RiICJoYW5kbGUgU0lHSFVQIGZydW1wXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIlVucmVjb2duaXplZCBvciBhbWJpZ3VvdXMgZmxhZyB3b3JkOiBcImZydW1wXCIuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICB7cGFzcyAiaGFuZGxlIFNJRyB3aXRoIGJvZ3VzIGFjdGlvbiJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICB7ZmFpbCAiaGFuZGxlIFNJRyB3aXRoIGJvZ3VzIGFjdGlvbiJ9CisgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaGFuZGxlIFNJRyB3aXRoIGJvZ3VzIGFjdGlvbiJ9CisgICAgfQorCisjIFZlcmlmeSB0aGF0ICJoYW5kbGUiIGNhbiB0YWtlIG11bHRpcGxlIGFjdGlvbnMgcGVyIFNJRywgYW5kIHRoYXQgaW4KKyMgdGhlIGNhc2Ugb2YgY29uZmxpY3RpbmcgYWN0aW9ucywgdGhhdCB0aGUgcmlnaHRtb3N0IGFjdGlvbiAid2lucyIuCisjCisgICAgc2VuZF9nZGIgImhhbmRsZSBTSUdIVVAgcHJpbnQgbm9wcmludFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICIuKlNJR0hVUFxbIFx0XF0qTm9cWyBcdFxdKk5vXFsgXHRcXSpZZXNcWyBcdFxdKkhhbmd1cC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgIHtwYXNzICJoYW5kbGUgU0lHIHdpdGggbXVsdGlwbGUgY29uZmxpY3RpbmcgYWN0aW9ucyJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICB7ZmFpbCAiaGFuZGxlIFNJRyB3aXRoIG11bHRpcGxlIGNvbmZsaWN0aW5nIGFjdGlvbnMifQorICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGhhbmRsZSBTSUcgd2l0aCBtdWx0aXBsZSBjb25mbGljdGluZyBhY3Rpb25zIn0KKyAgICB9CisKKyMgRXhlcmNpc2UgYWxsIHRoZSB2YXJpb3VzIGFjdGlvbnMuICAoV2UgZG9uJ3QgY2FyZSB3aGF0IHRoZSBvdXRjb21lCisjIGlzLCB0aGlzIGlzIGp1c3QgdG8gZW5zdXJlIHRoYXQgdGhleSBhbGwgY2FuIGJlIHBhcnNlZC4pCisjCisgICAgc2VuZF9nZGIgImhhbmRsZSBTSUdIVVAgcHJpbnQgbm9wcmludCBzdG9wIG5vc3RvcCBpZ25vcmUgbm9pZ25vcmUgcGFzcyBub3Bhc3NcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiLipTaWduYWwuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICB7cGFzcyAiaGFuZGxlIFNJRyBwYXJzZXMgYWxsIGxlZ2FsIGFjdGlvbnMifQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAge2ZhaWwgImhhbmRsZSBTSUcgcGFyc2VzIGFsbCBsZWdhbCBhY3Rpb25zIn0KKyAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBoYW5kbGUgU0lHIHBhcnNlcyBhbGwgbGVnYWwgYWN0aW9ucyJ9CisgICAgfQorCisjIFZlcmlmeSB0aGF0IHdlIGNhbiAiaGFuZGxlIiBtdWx0aXBsZSBzaWduYWxzIGF0IG9uY2UsIGludGVyc3BlcnNlZAorIyB3aXRoIGFjdGlvbnMuCisjCisgICAgc2VuZF9nZGIgImhhbmRsZSBTSUc2MyBwcmludCBTSUdJTExcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiLipTSUdJTExcWyBcdFxdKlllc1xbIFx0XF0qWWVzXFsgXHRcXSpZZXNcWyBcdFxdKklsbGVnYWwgaW5zdHJ1Y3Rpb24uKlNJRzYzXFsgXHRcXSpZZXNcWyBcdFxdKlllc1xbIFx0XF0qWWVzXFsgXHRcXSpSZWFsLXRpbWUgZXZlbnQgNjMuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICB7cGFzcyAiaGFuZGxlIG11bHRpcGxlIFNJR3MifQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAge2ZhaWwgImhhbmRsZSBtdWx0aXBsZSBTSUdzIn0KKyAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBoYW5kbGUgbXVsdGlwbGUgU0lHcyJ9CisgICAgfQorCisjIFZlcmlmeSB0aGF0ICJoYW5kbGUiIGNhbiB0YWtlIGEgbnVtZXJpYyBhcmd1bWVudCBmb3IgdGhlIHNpZ25hbCBJRCwKKyMgcmF0aGVyIHRoYW4gYSBzeW1ib2xpYyBuYW1lLiAgKFRoaXMgbWF5IG5vdCBiZSBwb3J0YWJsZTsgd29ya3MgZm9yCisjIEhQLVVYLikKKyMKKyMgQWxzbyBub3RlIHRoYXQgdGhpcyB0ZXN0cG9pbnQgb3ZlcnJpZGVzIFNJR1RSQVAsIHdoaWNoIG9uIEhQLVVYIGF0CisjIGxlYXN0LCBpcyB1c2VkIHRvIGltcGxlbWVudCBzaW5nbGUtc3RlcHMgYW5kIGJyZWFrcG9pbnRzLiAgRG9uJ3QKKyMgZXhwZWN0IHRvIHJ1biB0aGUgaW5mZXJpb3IgYWZ0ZXIgdGhpcyEKKyMKKyAgICBzZW5kX2dkYiAiaGFuZGxlIDUgbm9wYXNzXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIi4qU0lHVFJBUCBpcyB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4qQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNoYW5nZSBpdC4qeSBvciBuLioiXAorICAgICAgICAgICAgICB7c2VuZF9nZGIgInlcbiIKKyAgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAtcmUgIi4qU0lHVFJBUFxbIFx0XF0qWWVzXFsgXHRcXSpZZXNcWyBcdFxdKk5vXFsgXHRcXSpUcmFjZS9icmVha3BvaW50IHRyYXAuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJvdmVycmlkZSBTSUdUUkFQICgjNSkifQorICAgICAgICAgICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgIHtmYWlsICJvdmVycmlkZSBTSUdUUkFQICgjNSkifQorICAgICAgICAgICAgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgb3ZlcnJpZGUgU0lHVFJBUCAoIzUpIn0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAge2ZhaWwgIm92ZXJyaWRlIFNJR1RSQVAgKCM1KSJ9CisgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgb3ZlcnJpZGUgU0lHVFJBUCAoIzUpIn0KKyAgICB9CisKKyMgR0RCIGRvZXNuJ3Qgc2VlbSB0byBhbGxvdyBudW1lcmljIHNpZ25hbCBJRHMgbGFyZ2VyIHRoYW4gMTUuICBWZXJpZnkKKyMgdGhhdCByZXN0cmljdGlvbi4gID8/cmVocmF1ZXI6IE5vdCBzdXJlIGlmIHRoaXMgaXMgYSBmZWF0dXJlIG9yIGEKKyMgYnVnLCBhY3R1YWxseS4gIFdoeSBpcyB0aGUgcmFuZ2UgMS0xNT8KKyMKKyAgICBzZW5kX2dkYiAiaGFuZGxlIDU4XG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIk9ubHkgc2lnbmFscyAxLTE1IGFyZSB2YWxpZCBhcyBudW1lcmljIHNpZ25hbHMuKlVzZSBcImluZm8gc2lnbmFsc1wiIGZvciBhIGxpc3Qgb2Ygc3ltYm9saWMgc2lnbmFscy4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgIHtwYXNzICJpbnZhbGlkIHNpZ25hbCBudW1iZXIgcmVqZWN0ZWQifQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAge2ZhaWwgImludmFsaWQgc2lnbmFsIG51bWJlciByZWplY3RlZCJ9CisgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaW52YWxpZCBzaWduYWwgbnVtYmVyIHJlamVjdGVkIn0KKyAgICB9CisKKyMgVmVyaWZ5IHRoYXQgd2UgY2FuIGFjY2VwdCBhIHNpZ25hbCBJRCByYW5nZSAobnVtYmVyLW51bWJlcikuCisjID8/cmVocmF1ZXI6IFRoaXMgZmVhdHVyZSBpc24ndCBkb2N1bWVudGVkIG9uIHRoZSBxdWljay1yZWZlcmVuY2UKKyMgY2FyZC4KKyMKKyAgICBzZW5kX2dkYiAiaGFuZGxlIDEzLTE1XG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIi4qU0lHUElQRS4qU0lHQUxSTS4qU0lHVEVSTS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgIHtwYXNzICJoYW5kbGUgbXVsdGlwbGUgU0lHcyB2aWEgaW50ZWdlciByYW5nZSJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICB7ZmFpbCAiaGFuZGxlIG11bHRpcGxlIFNJR3MgdmlhIGludGVnZXIgcmFuZ2UifQorICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGhhbmRsZSBtdWx0aXBsZSBTSUdzIHZpYSBpbnRlZ2VyIHJhbmdlIn0KKworICAgIH0KKworIyBCaXphcnJlbHkgZW5vdWdoLCBHREIgYWxzbyBhbGxvd3MgeW91IHRvIHJldmVyc2UgdGhlIHJhbmdlCisjIHN0YXQsIHN0b3AgSURzLiAgRS5nLiwgIjMtMSIgYW5kICIxLTMiIG1lYW4gdGhlIHNhbWUgdGhpbmcuCisjIFByb2JhYmx5IHRoaXMgaXNuJ3QgZG9jdW1lbnRlZCwgYnV0IHRoZSBjb2RlIGFudGljaXBhdGVzIGl0LAorIyBzbyB3ZSdkIGJlc3QgdGVzdCBpdC4uLgorIworICAgIHNlbmRfZ2RiICJoYW5kbGUgMTUtMTNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiLipTSUdQSVBFLipTSUdBTFJNLipTSUdURVJNLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAge3Bhc3MgImhhbmRsZSBtdWx0aXBsZSBTSUdzIHZpYSBpbnRlZ2VyIHJhbmdlIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgIHtmYWlsICJoYW5kbGUgbXVsdGlwbGUgU0lHcyB2aWEgaW50ZWdlciByYW5nZSJ9CisgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgaGFuZGxlIG11bHRpcGxlIFNJR3MgdmlhIGludGVnZXIgcmFuZ2UifQorCisgICAgfQorCisjIFNJR0lOVCBpcyB1c2VkIGJ5IHRoZSBkZWJ1Z2dlciBhcyB3ZWxsLiAgVmVyaWZ5IHRoYXQgd2UgY2FuIGNoYW5nZQorIyBvdXIgbWluZHMgYWJvdXQgY2hhbmdpbmcgaXQuCisjCisgICAgc2VuZF9nZGIgImhhbmRsZSBTSUdJTlQgbm9wYXNzXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIi4qU0lHSU5UIGlzIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLipBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2hhbmdlIGl0Lip5IG9yIG4uKiJcCisgICAgICAgICAgICAgIHtzZW5kX2dkYiAiblxuIgorIyA/P3JlaHJhdWVyOiBXaGVuIHlvdSBhbnN3ZXIgIm4iLCB0aGUgaGVhZGVyIGZvciB0aGUgc2lnbmFsIGluZm8gaXMKKyMgcHJpbnRlZCwgYnV0IG5vdCB0aGUgYWN0dWFsIGhhbmRsZXIgc2V0dGluZ3MuICBQcm9iYWJseSBhIGJ1Zy4KKyMKKyAgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAtcmUgIk5vdCBjb25maXJtZWQsIHVuY2hhbmdlZC4qU2lnbmFsLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAib3ZlcnJpZGUgU0lHSU5UIn0KKyAgICAgICAgICAgICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICB7ZmFpbCAib3ZlcnJpZGUgU0lHSU5UIn0KKyAgICAgICAgICAgICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIG92ZXJyaWRlIFNJR0lOVCJ9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgIHtmYWlsICJvdmVycmlkZSBTSUdJTlQifQorICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIG92ZXJyaWRlIFNJR0lOVCJ9CisgICAgfQorCisjIFZlcmlmeSB0aGF0IEdEQiByZXNwb25kcyBncmFjZWZ1bGx5IHRvIHRoZSAic2lnbmFsIiBjb21tYW5kIHdpdGgKKyMgYSBtaXNzaW5nIGFyZ3VtZW50LgorIworICAgIHNlbmRfZ2RiICJzaWduYWxcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiQXJndW1lbnQgcmVxdWlyZWQgLnNpZ25hbCBudW1iZXIuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAge3Bhc3MgInNpZ25hbCB3aXRob3V0IGFyZ3VtZW50cyBkaXNhbGxvd2VkIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgIHtmYWlsICJzaWduYWwgd2l0aG91dCBhcmd1bWVudHMgZGlzYWxsb3dlZCJ9CisgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc2lnbmFsIHdpdGhvdXQgYXJndW1lbnRzIGRpc2FsbG93ZWQifQorICAgIH0KKworIyBWZXJpZnkgdGhhdCB3ZSBjYW4gc3VjY2Vzc2Z1bGx5IHNlbmQgYSBzaWduYWwgb3RoZXIgdGhhbiAwIHRvCisjIHRoZSBpbmZlcmlvci4gIChUaGlzIHByb2JhYmx5IGNhdXNlcyB0aGUgaW5mZXJpb3IgdG8gcnVuIGF3YXkuCisjIEJlIHByZXBhcmVkIHRvIHJlcnVuIHRvIG1haW4gZm9yIGZ1cnRoZXIgdGVzdGluZy4pCisjCisgICAgc2VuZF9nZGIgInNpZ25hbCA1XG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIkNvbnRpbnVpbmcgd2l0aCBzaWduYWwgU0lHVFJBUC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgIHtwYXNzICJzZW50IHNpZ25hbCA1In0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgIHtmYWlsICJzZW50IHNpZ25hbCA1In0KKyAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZW50IHNpZ25hbCA1In0KKyAgICB9CisKK30KKworcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc21va2UuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc21va2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWQzNGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zbW9rZS5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qIFRlc3QgdmFyaW91cyBraW5kcyBvZiBzdGVwcGluZy4KKyovCitpbnQgZ2xvYiA9IDA7CisKK2ludCBjYWxsZWUoKSB7CisgICAgZ2xvYisrOworICAgIHJldHVybiAoMCk7Cit9CisKK2ludCBtYWluICgpIHsKKyAgIGludCB3LHgseSx6OworICAgaW50IGFbMTBdLCBiWzEwXTsKKworICAgLyogVGVzdCAibmV4dCIgYW5kICJzdGVwIiAqLworICAgdyA9IDA7CisgICB4ID0gMTsKKyAgIHkgPSAyOworICAgeiA9IDM7CisgICB3ID0gdyArIDI7CisgICB4ID0geCArIDM7CisgICB5ID0geSArIDQ7CisgICB6ID0geiArIDU7CisKKyAgIC8qIFRlc3QgdGhhdCAibmV4dCIgZ29lcyBvdmVyIGEgY2FsbCAqLworICAgY2FsbGVlKCk7IC8qIE9WRVIgKi8KKworICAgLyogVGVzdCB0aGF0ICJzdGVwIiBkb2Vzbid0ICovCisgICBjYWxsZWUoKTsgLyogSU5UTyAqLworCisgICAvKiBUZXN0ICJzdGVwaSIgKi8KKyAgIGFbNV0gPSBhWzNdIC0gYVs0XTsKKyAgIGNhbGxlZSgpOyAvKiBTVEVQSSAqLworICAgCisgICAvKiBUZXN0ICJuZXh0aSIgKi8KKyAgIGNhbGxlZSgpOyAvKiBORVhUSSAqLworCisgICB5ID0gdyArIHo7CisKKyAgIHJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3Ntb2tlLmNjIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zbW9rZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzFmZGFmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zbW9rZS5jYwpAQCAtMCwwICsxLDQ4MCBAQAorLy8gVGVzdCB2YXJpb3VzIC0qLSBDKysgLSotIHRoaW5ncy4KKwordHlwZWRlZiBzdHJ1Y3QgZmxlZXAgZmxlZXA7CitzdHJ1Y3QgZmxlZXAgeyBpbnQgYTsgfSBzOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09IHNpbXBsZSBjbGFzcyBzdHJ1Y3R1cmVzICA9PT09PT09PT09PT09PT09PT09PT09PQorCitzdHJ1Y3QgZGVmYXVsdF9wdWJsaWNfc3RydWN0IHsKKyAvLyBkZWZhdWx0cyB0byBwdWJsaWM6CisgIGludCBhOworICBpbnQgYjsKK307CisKK3N0cnVjdCBleHBsaWNpdF9wdWJsaWNfc3RydWN0IHsKKyBwdWJsaWM6CisgIGludCBhOworICBpbnQgYjsKK307CisKK3N0cnVjdCBwcm90ZWN0ZWRfc3RydWN0IHsKKyBwcm90ZWN0ZWQ6CisgIGludCBhOworICBpbnQgYjsKK307CisKK3N0cnVjdCBwcml2YXRlX3N0cnVjdCB7CisgcHJpdmF0ZToKKyAgaW50IGE7CisgIGludCBiOworfTsKKworc3RydWN0IG1peGVkX3Byb3RlY3Rpb25fc3RydWN0IHsKKyBwdWJsaWM6CisgIGludCBhOworICBpbnQgYjsKKyBwcml2YXRlOgorICBpbnQgYzsKKyAgaW50IGQ7CisgcHJvdGVjdGVkOgorICBpbnQgZTsKKyAgaW50IGY7CisgcHVibGljOgorICBpbnQgZzsKKyBwcml2YXRlOgorICBpbnQgaDsKKyBwcm90ZWN0ZWQ6CisgIGludCBpOworfTsKKworY2xhc3MgcHVibGljX2NsYXNzIHsKKyBwdWJsaWM6CisgIGludCBhOworICBpbnQgYjsKK307CisKK2NsYXNzIHByb3RlY3RlZF9jbGFzcyB7CisgcHJvdGVjdGVkOgorICBpbnQgYTsKKyAgaW50IGI7Cit9OworCitjbGFzcyBkZWZhdWx0X3ByaXZhdGVfY2xhc3MgeworIC8vIGRlZmF1bHRzIHRvIHByaXZhdGU6CisgIGludCBhOworICBpbnQgYjsKK307CisKK2NsYXNzIGV4cGxpY2l0X3ByaXZhdGVfY2xhc3MgeworIHByaXZhdGU6CisgIGludCBhOworICBpbnQgYjsKK307CisKK2NsYXNzIG1peGVkX3Byb3RlY3Rpb25fY2xhc3MgeworIHB1YmxpYzoKKyAgaW50IGE7CisgIGludCBiOworIHByaXZhdGU6CisgIGludCBjOworICBpbnQgZDsKKyBwcm90ZWN0ZWQ6CisgIGludCBlOworICBpbnQgZjsKKyBwdWJsaWM6CisgIGludCBnOworIHByaXZhdGU6CisgIGludCBoOworIHByb3RlY3RlZDoKKyAgaW50IGk7Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IHNpbXBsZSBpbmhlcml0YW5jZSA9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBBIHsKKyBwdWJsaWM6CisgIGludCBhOworICBpbnQgeDsKK307CisKK0EgZ19BOworCitjbGFzcyBCIDogcHVibGljIEEgeworIHB1YmxpYzoKKyAgaW50IGI7CisgIGludCB4OworfTsKKworQiBnX0I7CisKK2NsYXNzIEMgOiBwdWJsaWMgQSB7CisgcHVibGljOgorICBpbnQgYzsKKyAgaW50IHg7Cit9OworCitDIGdfQzsKKworY2xhc3MgRCA6IHB1YmxpYyBCLCBwdWJsaWMgQyB7CisgcHVibGljOgorICBpbnQgZDsKKyAgaW50IHg7Cit9OworCitEIGdfRDsKKworY2xhc3MgRSA6IHB1YmxpYyBEIHsKKyBwdWJsaWM6CisgIGludCBlOworICBpbnQgeDsKK307CisKK0UgZ19FOworCitjbGFzcyBjbGFzc193aXRoX2Fub25fdW5pb24KK3sKKyBwdWJsaWM6CisgIGludCBvbmU7CisgIHVuaW9uCisgIHsKKyAgICBpbnQgYTsKKyAgICBsb25nIGI7CisgIH07Cit9OworCitjbGFzc193aXRoX2Fub25fdW5pb24gZ19hbm9uX3VuaW9uOworCit2b2lkIGluaGVyaXRhbmNlMiAodm9pZCkKK3sKK30KKwordm9pZCBpbmhlcml0YW5jZTEgKHZvaWQpCit7CisgIGludCBpdmFsOworICBpbnQgKmludHA7CisKKyAgLy8ge0E6OmEsIEE6Onh9CisKKyAgZ19BLkE6OmEgPSAxOworICBnX0EuQTo6eCA9IDI7CisKKyAgLy8ge3tBOjphLEE6Onh9LEI6OmIsQjo6eH0KKworICBnX0IuQTo6YSA9IDM7CisgIGdfQi5BOjp4ID0gNDsKKyAgZ19CLkI6OmIgPSA1OworICBnX0IuQjo6eCA9IDY7CisKKyAgLy8ge3tBOjphLEE6Onh9LEM6OmMsQzo6eH0KKworICBnX0MuQTo6YSA9IDc7CisgIGdfQy5BOjp4ID0gODsKKyAgZ19DLkM6OmMgPSA5OworICBnX0MuQzo6eCA9IDEwOworCisgIC8vIHt7e0E6OmEsQTo6eH0sQjo6YixCOjp4fSx7e0E6OmEsQTo6eH0sQzo6YyxDOjp4fSxEOjpkLEQ6Onh9CisKKyAgLy8gVGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBjb2RlIGlzIG5vbi1wb3J0YWJsZSwgYnV0IGFsbG93cyB1cworICAvLyB0byBpbml0aWFsaXplIGFsbCBtZW1iZXJzIG9mIGdfRCB1bnRpbCB3ZSBjYW4gZmlsbCBpbiB0aGUgbWlzc2luZworICAvLyBpbml0aWFsaXphdGlvbiBjb2RlIHdpdGggbGVnYWwgQysrIGNvZGUuCisKKyAgZm9yIChpbnRwID0gKGludCAqKSAmZ19ELCBpdmFsID0gMTE7CisgICAgICAgaW50cCA8ICgoaW50ICopICZnX0QgKyBzaXplb2YgKGdfRCkgLyBzaXplb2YgKGludCkpOworICAgICAgIGludHArKywgaXZhbCsrKQorICAgIHsKKyAgICAgICppbnRwID0gaXZhbDsKKyAgICB9CisKKyAgLy8gT3ZlcmxheSB0aGUgbm9ucG9ydGFibGUgaW5pdGlhbGl6YXRpb24gd2l0aCBsZWdhbCBpbml0aWFsaXphdGlvbi4KKworICAvLyA/Pz8/PyA9IDExOyAgKGdfRC5BOjphID0gMTE7IGlzIGFtYmlndW91cykKKyAgLy8gPz8/Pz8gPSAxMjsgIChnX0QuQTo6eCA9IDEyOyBpcyBhbWJpZ3VvdXMpCisgIGdfRC5COjpiID0gMTM7CisgIGdfRC5COjp4ID0gMTQ7CisgIC8vID8/Pz8/ID0gMTU7CisgIC8vID8/Pz8/ID0gMTY7CisgIGdfRC5DOjpjID0gMTc7CisgIGdfRC5DOjp4ID0gMTg7CisgIGdfRC5EOjpkID0gMTk7CisgIGdfRC5EOjp4ID0gMjA7CisKKworICAvLyB7e3t7QTo6YSxBOjp4fSxCOjpiLEI6Onh9LHt7QTo6YSxBOjp4fSxDOjpjLEM6Onh9LEQ6OmQsRDo6eH19LEU6OmUsRTo6eH0KKworICAvLyBUaGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uIGNvZGUgaXMgbm9uLXBvcnRhYmxlLCBidXQgYWxsb3dzIHVzCisgIC8vIHRvIGluaXRpYWxpemUgYWxsIG1lbWJlcnMgb2YgZ19EIHVudGlsIHdlIGNhbiBmaWxsIGluIHRoZSBtaXNzaW5nCisgIC8vIGluaXRpYWxpemF0aW9uIGNvZGUgd2l0aCBsZWdhbCBDKysgY29kZS4KKworICBmb3IgKGludHAgPSAoaW50ICopICZnX0UsIGl2YWwgPSAyMTsKKyAgICAgICBpbnRwIDwgKChpbnQgKikgJmdfRSArIHNpemVvZiAoZ19FKSAvIHNpemVvZiAoaW50KSk7CisgICAgICAgaW50cCsrLCBpdmFsKyspCisgIHsKKyAgICAqaW50cCA9IGl2YWw7CisgIH0KKworICAvLyBPdmVybGF5IHRoZSBub25wb3J0YWJsZSBpbml0aWFsaXphdGlvbiB3aXRoIGxlZ2FsIGluaXRpYWxpemF0aW9uLgorCisgIC8vID8/Pz8/ID0gMjE7ICAoZ19FLkE6OmEgPSAyMTsgaXMgYW1iaWd1b3VzKQorICAvLyA/Pz8/PyA9IDIyOyAgKGdfRS5BOjp4ID0gMjI7IGlzIGFtYmlndW91cykKKyAgZ19FLkI6OmIgPSAyMzsKKyAgZ19FLkI6OnggPSAyNDsKKyAgLy8gPz8/Pz8gPSAyNTsKKyAgLy8gPz8/Pz8gPSAyNjsKKyAgZ19FLkM6OmMgPSAyNzsKKyAgZ19FLkM6OnggPSAyODsKKyAgZ19FLkQ6OmQgPSAyOTsKKyAgZ19FLkQ6OnggPSAzMDsKKyAgZ19FLkU6OmUgPSAzMTsKKyAgZ19FLkU6OnggPSAzMjsKKworICBnX2Fub25fdW5pb24ub25lID0gMTsKKyAgZ19hbm9uX3VuaW9uLmEgPSAyOworCisgIGluaGVyaXRhbmNlMiAoKTsJCit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PSB2aXJ0dWFsIGJhc2UgY2xhc3Nlcz09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgdkEgeworIHB1YmxpYzoKKyAgaW50IHZhOworICBpbnQgdng7Cit9OworCit2QSBnX3ZBOworCitjbGFzcyB2QiA6IHB1YmxpYyB2aXJ0dWFsIHZBIHsKKyBwdWJsaWM6CisgIGludCB2YjsKKyAgaW50IHZ4OworfTsKKwordkIgZ192QjsKKworY2xhc3MgdkMgOiBwdWJsaWMgdmlydHVhbCB2QSB7CisgcHVibGljOgorICBpbnQgdmM7CisgIGludCB2eDsKK307CisKK3ZDIGdfdkM7CisKK2NsYXNzIHZEIDogcHVibGljIHZpcnR1YWwgdkIsIHB1YmxpYyB2aXJ0dWFsIHZDIHsKKyBwdWJsaWM6CisgIGludCB2ZDsKKyAgaW50IHZ4OworfTsKKwordkQgZ192RDsKKworY2xhc3MgdkUgOiBwdWJsaWMgdmlydHVhbCB2RCB7CisgcHVibGljOgorICBpbnQgdmU7CisgIGludCB2eDsKK307CisKK3ZFIGdfdkU7CisKK3ZvaWQgaW5oZXJpdGFuY2U0ICh2b2lkKQoreworfQorCit2b2lkIGluaGVyaXRhbmNlMyAodm9pZCkKK3sKKyAgaW50IGl2YWw7CisgIGludCAqaW50cDsKKworICAvLyB7dkE6OnZhLCB2QTo6dnh9CisKKyAgZ192QS52QTo6dmEgPSAxOworICBnX3ZBLnZBOjp2eCA9IDI7CisKKyAgLy8ge3t2QTo6dmEsIHZBOjp2eH0sIHZCOjp2YiwgdkI6OnZ4fQorCisgIGdfdkIudkE6OnZhID0gMzsKKyAgZ192Qi52QTo6dnggPSA0OworICBnX3ZCLnZCOjp2YiA9IDU7CisgIGdfdkIudkI6OnZ4ID0gNjsKKworICAvLyB7e3ZBOjp2YSwgdkE6OnZ4fSwgdkM6OnZjLCB2Qzo6dnh9CisKKyAgZ192Qy52QTo6dmEgPSA3OworICBnX3ZDLnZBOjp2eCA9IDg7CisgIGdfdkMudkM6OnZjID0gOTsKKyAgZ192Qy52Qzo6dnggPSAxMDsKKworICAvLyB7e3t7dkE6OnZhLCB2QTo6dnh9LCB2Qjo6dmIsIHZCOjp2eH0sIHZDOjp2YywgdkM6OnZ4fSwgdkQ6OnZkLHZEOjp2eH0KKworICBnX3ZELnZBOjp2YSA9IDExOworICBnX3ZELnZBOjp2eCA9IDEyOworICBnX3ZELnZCOjp2YiA9IDEzOworICBnX3ZELnZCOjp2eCA9IDE0OworICBnX3ZELnZDOjp2YyA9IDE1OworICBnX3ZELnZDOjp2eCA9IDE2OworICBnX3ZELnZEOjp2ZCA9IDE3OworICBnX3ZELnZEOjp2eCA9IDE4OworCisKKyAgLy8ge3t7e3t2QTo6dmEsdkE6OnZ4fSx2Qjo6dmIsdkI6OnZ4fSx2Qzo6dmMsdkM6OnZ4fSx2RDo6dmQsdkQ6OnZ4fSx2RTo6dmUsdkU6OnZ4fQorCisgIGdfdkQudkE6OnZhID0gMTk7CisgIGdfdkQudkE6OnZ4ID0gMjA7CisgIGdfdkQudkI6OnZiID0gMjE7CisgIGdfdkQudkI6OnZ4ID0gMjI7CisgIGdfdkQudkM6OnZjID0gMjM7CisgIGdfdkQudkM6OnZ4ID0gMjQ7CisgIGdfdkQudkQ6OnZkID0gMjU7CisgIGdfdkQudkQ6OnZ4ID0gMjY7CisgIGdfdkUudkU6OnZlID0gMjc7CisgIGdfdkUudkU6OnZ4ID0gMjg7CisKKyAgaW5oZXJpdGFuY2U0ICgpOwkKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBCYXNlMSB7CisgcHVibGljOgorICBpbnQgeDsKKyAgQmFzZTEoaW50IGkpIHsgeCA9IGk7IH0KK307CisKK2NsYXNzIEZvbworeworIHB1YmxpYzoKKyAgaW50IHg7CisgIGludCB5OworICBzdGF0aWMgaW50IHN0OworICBGb28gKGludCBpLCBpbnQgaikgeyB4ID0gaTsgeSA9IGo7IH0KKyAgaW50IG9wZXJhdG9yISAoKTsKKyAgb3BlcmF0b3IgaW50ICgpOworICBpbnQgdGltZXMgKGludCB5KTsKK307CisKK2NsYXNzIEJhciA6IHB1YmxpYyBCYXNlMSwgcHVibGljIEZvbyB7CisgcHVibGljOgorICBpbnQgejsKKyAgQmFyIChpbnQgaSwgaW50IGosIGludCBrKSA6IEJhc2UxICgxMCprKSwgRm9vIChpLCBqKSB7IHogPSBrOyB9Cit9OworCitpbnQgRm9vOjpvcGVyYXRvciEgKCkgeyByZXR1cm4gIXg7IH0KKworaW50IEZvbzo6dGltZXMgKGludCB5KSB7IHJldHVybiB4ICogeTsgfQorCitpbnQgRm9vOjpzdCA9IDEwMDsKKworRm9vOjpvcGVyYXRvciBpbnQoKSB7IHJldHVybiB4OyB9CisKK0ZvbyBmb28oMTAsIDExKTsKK0JhciBiYXIoMjAsIDIxLCAyMik7CisKK2NsYXNzIENvbnRhaW5zX3N0YXRpY19pbnN0YW5jZQoreworIHB1YmxpYzoKKyAgaW50IHg7CisgIGludCB5OworICBDb250YWluc19zdGF0aWNfaW5zdGFuY2UgKGludCBpLCBpbnQgaikgeyB4ID0gaTsgeSA9IGo7IH0KKyAgc3RhdGljIENvbnRhaW5zX3N0YXRpY19pbnN0YW5jZSBudWxsOworfTsKKworQ29udGFpbnNfc3RhdGljX2luc3RhbmNlIENvbnRhaW5zX3N0YXRpY19pbnN0YW5jZTo6bnVsbCgwLDApOworQ29udGFpbnNfc3RhdGljX2luc3RhbmNlIGNzaSgxMCwyMCk7CisKK2NsYXNzIENvbnRhaW5zX25lc3RlZF9zdGF0aWNfaW5zdGFuY2UKK3sKKyBwdWJsaWM6CisgIGNsYXNzIE5lc3RlZAorICB7CisgICBwdWJsaWM6CisgICAgTmVzdGVkKGludCBpKSA6IHooaSkge30KKyAgICBpbnQgejsKKyAgICBzdGF0aWMgQ29udGFpbnNfbmVzdGVkX3N0YXRpY19pbnN0YW5jZSB4eDsKKyAgfTsKKworICBDb250YWluc19uZXN0ZWRfc3RhdGljX2luc3RhbmNlKGludCBpLCBpbnQgaikgOiB4KGkpLCB5KGopIHt9CisKKyAgaW50IHg7CisgIGludCB5OworCisgIHN0YXRpYyBDb250YWluc19uZXN0ZWRfc3RhdGljX2luc3RhbmNlIG51bGw7CisgIHN0YXRpYyBOZXN0ZWQgeXk7Cit9OworCitDb250YWluc19uZXN0ZWRfc3RhdGljX2luc3RhbmNlIENvbnRhaW5zX25lc3RlZF9zdGF0aWNfaW5zdGFuY2U6Om51bGwoMCwgMCk7CitDb250YWluc19uZXN0ZWRfc3RhdGljX2luc3RhbmNlOjpOZXN0ZWQgQ29udGFpbnNfbmVzdGVkX3N0YXRpY19pbnN0YW5jZTo6eXkoNSk7CitDb250YWluc19uZXN0ZWRfc3RhdGljX2luc3RhbmNlCisgIENvbnRhaW5zX25lc3RlZF9zdGF0aWNfaW5zdGFuY2U6Ok5lc3RlZDo6eHgoMSwyKTsKK0NvbnRhaW5zX25lc3RlZF9zdGF0aWNfaW5zdGFuY2UgY25zaSgzMCw0MCk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IG9uZTsKKyAgaW50IHR3bzsKK30gdGFnbGVzc19zdHJ1Y3Q7Cit0YWdsZXNzX3N0cnVjdCB2X3RhZ2xlc3M7CisKKy8qIFRyeSB0byBnZXQgdGhlIGNvbXBpbGVyIHRvIGFsbG9jYXRlIGEgY2xhc3MgaW4gYSByZWdpc3Rlci4gICovCitjbGFzcyBzbWFsbCB7CisgcHVibGljOgorICBpbnQgeDsKKyAgaW50IG1ldGhvZCAoKTsKK307CitpbnQgc21hbGw6Om1ldGhvZCAoKQoreworICByZXR1cm4geCArIDU7Cit9Cit2b2lkIG1hcmtlcl9yZWcxICgpIHt9CisKK2ludAorcmVnaXN0ZXJfY2xhc3MgKCkKK3sKKyAgLyogV2UgZG9uJ3QgY2FsbCBhbnkgbWV0aG9kcyBmb3Igdiwgc28gZ2NjIHZlcnNpb24gY3lnbnVzLTIuMy4zLTkzMDIyMAorICAgICBtaWdodCBwdXQgdGhpcyB2YXJpYWJsZSBpbiBhIHJlZ2lzdGVyLiAgVGhpcyBpcyBhIGxvc2UsIHRob3VnaCwgYmVjYXVzZQorICAgICBpdCBtZWFucyB0aGF0IEdEQiBjYW4ndCBjYWxsIGFueSBtZXRob2RzIGZvciB0aGF0IHZhcmlhYmxlLiAgKi8KKyAgcmVnaXN0ZXIgc21hbGwgdjsKKworICBpbnQgaTsKKworICAvKiBQZXJmb3JtIGEgY29tcHV0YXRpb24gc3VmZmljaWVudGx5IGNvbXBsaWNhdGVkIHRoYXQgb3B0aW1pemluZyBjb21waWxlcnMKKyAgICAgd29uJ3Qgb3B0aW1pemVkIG91dCB0aGUgdmFyaWFibGUuICBJZiBzb21lIGNvbXBpbGVyIGNvbnN0YW50LWZvbGRzIHRoaXMKKyAgICAgd2hvbGUgbG9vcCwgbWF5YmUgdXNpbmcgYSBwYXJhbWV0ZXIgdG8gdGhpcyBmdW5jdGlvbiBoZXJlIHdvdWxkIGhlbHAuICAqLworICB2LnggPSAwOworICBmb3IgKGkgPSAwOyBpIDwgMTM7ICsraSkKKyAgICB2LnggKz0gaTsKKyAgLS12Lng7IC8qIHYueCBpcyBub3cgNzcgKi8KKyAgbWFya2VyX3JlZzEgKCk7CisgIHJldHVybiB2LnggKyA1OworfQorCitpbnQKK21haW4oKQoreworI2lmZGVmIHVzZXN0dWJzCisgIHNldF9kZWJ1Z190cmFwcygpOworICBicmVha3BvaW50KCk7CisjZW5kaWYKKyAgaW5oZXJpdGFuY2UxICgpOworICBpbmhlcml0YW5jZTMgKCk7CisgIHJlZ2lzdGVyX2NsYXNzICgpOworCisgIC8qIEZJWE1FOiBwbWkgZ2V0cyBvcHRpbWl6ZWQgb3V0LiAgTmVlZCB0byBkbyBzb21lIG1vcmUgY29tcHV0YXRpb24gd2l0aAorICAgICBpdCBvciBzb21ldGhpbmcuICAoTm8gb25lIG5vdGljZXMsIGJlY2F1c2UgdGhlIHRlc3QgaXMgeGZhaWwnZCBhbnl3YXksCisgICAgIGJ1dCB0aGF0IHByb2JhYmx5IHdvbid0IGFsd2F5cyBiZSB0cnVlLi4uKS4gICovCisgIGludCBGb286OiogcG1pID0gJkZvbzo6eTsKKworICAvKiBNYWtlIHN1cmUgdGhlIEFJWCBsaW5rZXIgZG9lc24ndCByZW1vdmUgdGhlIHZhcmlhYmxlLiAgKi8KKyAgdl90YWdsZXNzLm9uZSA9IDU7CisKKyAgcmV0dXJuIGZvby4qcG1pOworfQorCisvKiBDcmVhdGUgYW4gaW5zdGFuY2UgZm9yIHNvbWUgY2xhc3Nlcywgb3RoZXJ3aXNlIHRoZXkgZ2V0IG9wdGltaXplZCBhd2F5LiAgKi8KK2RlZmF1bHRfcHVibGljX3N0cnVjdCBkZWZhdWx0X3B1YmxpY19zOworZXhwbGljaXRfcHVibGljX3N0cnVjdCBleHBsaWNpdF9wdWJsaWNfczsKK3Byb3RlY3RlZF9zdHJ1Y3QgcHJvdGVjdGVkX3M7Citwcml2YXRlX3N0cnVjdCBwcml2YXRlX3M7CittaXhlZF9wcm90ZWN0aW9uX3N0cnVjdCBtaXhlZF9wcm90ZWN0aW9uX3M7CitwdWJsaWNfY2xhc3MgcHVibGljX2M7Citwcm90ZWN0ZWRfY2xhc3MgcHJvdGVjdGVkX2M7CitkZWZhdWx0X3ByaXZhdGVfY2xhc3MgZGVmYXVsdF9wcml2YXRlX2M7CitleHBsaWNpdF9wcml2YXRlX2NsYXNzIGV4cGxpY2l0X3ByaXZhdGVfYzsKK21peGVkX3Byb3RlY3Rpb25fY2xhc3MgbWl4ZWRfcHJvdGVjdGlvbl9jOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zbW9rZS5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3Ntb2tlLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmRlN2M4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zbW9rZS5leHAKQEAgLTAsMCArMSwxODEgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgc21va2UuZXhwIC0tIEV4cGVjdCBzY3JpcHQgdG8gdGVzdCBnZGIgYmVmb3JlIGNoZWNraW5zCisKKyMgdXNlIHRoaXMgdG8gZGVidWc6CisjCisjbG9nX3VzZXIgMQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHRlc3RmaWxlIHNtb2tlCitzZXQgdGVzdGZpbGUxIHNtb2tlMQorc2V0IGNfc3JjZmlsZSAgICR7c3JjZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0uYworc2V0IGNwcF9zcmNmaWxlICR7c3JjZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0uY2MKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KK3NldCBiaW5maWxlMSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGUxfQorCisjcmVtb3RlX2V4ZWMgYnVpbGQgInJtIC1mICR7YmluZmlsZX0iCityZW1vdGVfZXhlYyBidWlsZCAicm0gLWYgY29yZSIKKworIyAiQyIgc2VjdGlvbiwgdXNpbmcgc291cmNlIGNvcGllZCBmcm9tICJzdGVwLXRlc3QuYyIgZnJvbSAiZ2RiLmJhc2UiCisjCitpZiB7IFtnZGJfY29tcGlsZSAiJHtjX3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisjIFNvbWUgYmFzaWMgdGVzdHMKKyMKK2dkYl90ZXN0ICJ0YiBtYWluIiAgICIuKkJyZWFrcG9pbnQgMSBhdC4qbGluZSAxNS4qIiAidGVtcCBicmVha3BvaW50IgorZ2RiX3Rlc3QgImIgY2FsbGVlIiAgIi4qQnJlYWtwb2ludCAyIGF0LipsaW5lIDYuKiIgICJicmVha3BvaW50IgorZ2RiX3Rlc3QgImwgMTAiICAgICAgIi4qMTAuKmludCBtYWluLioxMS4qaW50IHcseCx5LHo7LioxMi4qaW50IGEuKiIgImxpc3QiCitnZGJfdGVzdCAiYyIgIi4qVGhlIHByb2dyYW0gaXMgbm90IGJlaW5nIHJ1bi4qIiAiY2F0Y2ggZXJyb3IiCitnZGJfdGVzdCAiciIgIi4qU3RhcnRpbmcgcHJvZ3JhbS4qbWFpbi4qMTUuKiIgICAiaGl0IGJwIgorZ2RiX3Rlc3QgImhlbCByIiAiLipTdGFydCBkZWJ1Z2dlZCBwcm9ncmFtLip3aXRob3V0IGFyZ3VtZW50cy4qIiAiaGVscCIKK2dkYl90ZXN0ICJuIiAiLip4ID0gMTsuKiIgIm5leHQiCitnZGJfdGVzdCAicyIgIi4qeSA9IDI7LioiICJzdGVwIgorZ2RiX3Rlc3QgInAvdCB5IiAiLiogPSAxLioiICJwcmludCB5IGluIGJpbmFyeSIKK2dkYl90ZXN0ICJwIDErMiozKzQiICIuKiA9IDExLioiICJjYWxjdWxhdGUiCitnZGJfdGVzdCAicC90IDErMiozKzQiICIuKiA9IDEwMTEuKiIgImJpbmFyeSIKKworIyBOb3RlOiBhY2NlcHQgZWl0aGVyICJXYXRjaHBvaW50IiBvciAiSGFyZHdhcmUgd2F0Y2hwb2ludCI7CisjICAgICAgIDEwLjIwIGNhbid0IGRvIHRoZSBoYXJkd2FyZSB3YXRjaC4gIFRoZSBoYXJkd2FyZSBraW5kCisjICAgICAgIHRyaWdnZXJzIG9uZSBsaW5lIGVhcmxpZXIgdGhhbiB0aGUgcmVndWxhciBraW5kLgorIworZ2RiX3Rlc3QgIndhdCB5IiAiLiphdGNocG9pbnQuKnkuKiIgInNldCB3YXRjaCIKK2dkYl90ZXN0ICJjIiAiLiphdGNocG9pbnQuKk9sZC4qPSAuKk5ldy4qPSAyLioxXFs3OFxdLioiICJjb250aW51ZSwgaGl0IHdhdGNoIgorCitnZGJfdGVzdCAic2V0IGdsb2I9OTk5IiAiLiouKiIgInNldCIKK2dkYl90ZXN0ICJwIGdsb2IiICAgIi4qPSA5OTkuKi4qIiAicHJpbnQgZ2xvYiIKK2dkYl90ZXN0ICJwL3ggZ2xvYiIgIi4qPSAweDNlNy4qIiAiaGV4IgorZ2RiX3Rlc3QgImMiICIuKmF0Y2hwb2ludC4qT2xkLio9IDIuKk5ldy4qPSA2LioyXFsxMlxdLioiICJjb250aW51ZSwgMm5kIGhpdCB3YXRjaCIKK2dkYl90ZXN0ICJkIDUiICJObyBicmVha3BvaW50IG51bWJlciA1LiIgImRlbCBub24gZXhpc3Rpbmcgd2F0Y2giCitnZGJfdGVzdCAiYyIgIi4qQnJlYWtwb2ludC4qY2FsbGVlLio2LioiICJoaXQgYnAiCitnZGJfdGVzdCAiYnQiICIuKmNhbGxlZS4qNi4qbWFpbi4qMjUuKiIgImJ0IgorZ2RiX3Rlc3QgImZpbiIgIi4qUnVuIHRpbGwgZXhpdC4qY2FsbGVlLipWYWx1ZSByZXR1cm5lZC4qMC4qIiAiZmluaXNoIgorZ2RiX3Rlc3QgImMiICAiLipCcmVha3BvaW50LipjYWxsZWUuKjYuKiIgImhpdCBicCBhZ2FpbiIKK2dkYl90ZXN0ICJjbGUiICIuKkRlbGV0ZWQgYnJlYWtwb2ludC4qIiAiY2xlYXIiCitnZGJfdGVzdCAid2F0IGdsb2IiICIuKmF0Y2hwb2ludC4qZ2xvYi4qIiAic2V0IDJuZCB3YXRjaCIKK2dkYl90ZXN0ICJpIHdhdCIgIi4qIiAiIgorZ2RiX3Rlc3QgIndoZSIgIi4qIiAiIgorCisjID8/cmVocmF1ZXI6IFdlJ3JlIG5vdyBkaXNhYmxpbmcgd2F0Y2hwb2ludHMgd2hpbGUgYW4gaW50ZXJhY3RpdmUKKyMgY2FsbCBpcyAiaW4gZmxpZ2h0Ii4gIFdoZW4vaWYgd2UgY2FuIHRlYWNoIGdkYiBob3cgdG8gdW53aW5kIHRocm91Z2gKKyMgdGhlIGNhbGwgZHVtbXkgZnJhbWUsIHdlIGNhbiB0aGVuIGFsbG93IHdhdGNoZXMgZHVyaW5nIGNhbGxzLCBhbmQKKyMgYWxzbyB0aGVuIHJlc3RvcmUgdGhpcyB0ZXN0cG9pbnQgdG8gdGhlIG9yaWdpbmFsLCBjb21tZW50ZWQtb3V0IGZvcm0uCisjCitnZGJfdGVzdCAiY2FsbCBjYWxsZWUoKSIgIi4qXFswLTlcXSogPSAwLioiICJjYWxsLCBkaWRuJ3QgaGl0IHdhdGNoIgorI2dkYl90ZXN0ICJjYWxsIGNhbGxlZSgpIiAiLiphdGNocG9pbnQuKk9sZC4qPSAxMDAwLipOZXcuKj0gMTAwMS4qXFs2N1xdLipiZWluZyBkZWJ1Zy4qaXMgZG9uZS4qIiAiY2FsbCwgaGl0IHdhdGNoIgorCitnZGJfdGVzdCAiZCA0IiAiLioiICJkZWwgd2F0Y2ggMiIKK2dkYl90ZXN0ICJkIDMiICIuKiIgImRlbCB3YXRjaCAxIgorZ2RiX3Rlc3QgImluZm8gYnJlYWsiICJObyBicmVha3BvaW50cyBvciB3YXRjaHBvaW50cy4iCisjIHNpbmNlIHdlIGhhdmUgZGVsZXRlZCBhbGwgdGhlIHdhdGNocG9pbnRzIHRoaXMgdGVzdCBpcyB1c2VsZXNzCisjZ2RiX3Rlc3QgImMiICIuKkNvbnRpbnVpbmcuKiIgImVuZCBjYWxsIgorZ2RiX3Rlc3QgImMiICIuKlByb2dyYW0gZXhpdGVkIG5vcm1hbGx5LioiICJwZ20gZXhpdCIKKworIyBDaGVjayBmb3IgcHJvZHVjdGlvbiBvZiBhIGNvcmUgZmlsZQorIworI3NldCBleGVjX291dHB1dCBbZXhlY3V0ZV9hbnl3aGVyZSAibHMgY29yZSJdCitzZXQgZXhlY19vdXRwdXQgW3JlbW90ZV9leGVjIGJ1aWxkICJscyBjb3JlIl0KKworaWYgWyByZWdleHAgImNvcmUgbm90IGZvdW5kIiAkZXhlY19vdXRwdXRdICB7CisgICAgcGFzcyAiTm8gY29yZSBkdW1wZWQgb24gcXVpdCIKK30gZWxzZSB7CisgIGlmIFsgcmVnZXhwICJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiAkZXhlY19vdXRwdXRdIHsKKyAgICAgIHBhc3MgImxzOiBjb3JlOiBObyBjb3JlIGR1bXBlZCBvbiBxdWl0IgorICB9IGVsc2UgeworICAgICAgcmVtb3RlX2V4ZWMgYnVpbGQgInJtIC1mIGNvcmUiCisgICAgICBmYWlsICJDb3JlIGR1bXBlZCBvbiBxdWl0IgorICB9Cit9CisKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgIkMrKyIgc2VjdGlvbiwgdXNpbmcgc291cmNlIGNvcGllZCBmcm9tICJtaXNjLmNjIiBmcm9tICJnZGIuYysrIgorIworCisjCisjcmVtb3RlX2V4ZWMgYnVpbGQgInJtIC1mICR7YmluZmlsZX0iCisjcmVtb3RlX2V4ZWMgYnVpbGQgIkNDIC1nIC1vICR7YmluZmlsZX0gJHtjcHBfc3JjZmlsZX0iCitpZiB7W2dkYl9jb21waWxlICIke2NwcF9zcmNmaWxlfSIgIiR7YmluZmlsZTF9IiBleGVjdXRhYmxlIHtjKysgZGVidWd9XSAhPSAiIn0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGUxfQorCisjIFRlc3RzLCBzb21lIGNvcGllZCBmcm9tIG1pc2MuZXhwLgorIworCisgICAgIyBTZWUgd2hhdCBsYW5ndWFnZSBnZGIgdGhpbmtzIG1haW4oKSBpcywgcHJpb3IgdG8gcmVhZGluZyBmdWxsIHN5bWJvbHMuCisgICAgIyBJIHRoaW5rIHRoaXMgZmFpbHMgZm9yIENPRkYgdGFyZ2V0cy4KKyAgICBzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIKKyAgICBzZW5kX2dkYiAic2hvdyBsYW5ndWFnZVxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIi4qIHNvdXJjZSBsYW5ndWFnZSBpcyBcImF1dG87IGN1cnJlbnRseSBjXFwrXFwrXCIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIHBhc3MgImRlZHVjZWQgbGFuZ3VhZ2UgaXMgQysrLCBiZWZvcmUgZnVsbCBzeW1ib2xzIgorICAgICAgICB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7ICAgIGZhaWwgInNvdXJjZSBsYW5ndWFnZSBub3QgY29ycmVjdCBmb3IgQysrIChwc3ltdGFicyBvbmx5KSJ9CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgCisgICAgICAgIHRpbWVvdXQgeyBmYWlsICJjYW4ndCBzaG93IGxhbmd1YWdlICh0aW1lb3V0KSJ9CisgICAgICAgICAgICByZXR1cm4KKyAgICB9CisKK2dkYl90ZXN0ICJiIG1haW4iICIuKkJyZWFrcG9pbnQgMSBhdC4qIiAiIgorZ2RiX3Rlc3QgInIiICIuKlN0YXJ0aW5nIHByb2dyYW0uKkJyZWFrcG9pbnQgMS4qIiAicnVuIHRvIG1haW4iCitnZGJfdGVzdCAicHR5cGUgRm9vIiAiLip0eXBlID0gY2xhc3MgRm9vLipzdGF0aWMgaW50IHN0Oy4qaW50IG9wZXJhdG9yLioiICJwdHlwZSIKK2dkYl90ZXN0ICJzdGVwIiAiLippbmhlcml0YW5jZTEuKiIgInN0ZXAiCitnZGJfdGVzdCAicHR5cGUgZ19hbm9uX3VuaW9uIiAiLiphbm9uX3VuaW9uLip1bmlvbi4qaW50IGE7LioiICJhbm9uIgorZ2RiX3Rlc3QgInAgZ19FIiAiLipjbGFzcyBELipjbGFzcyBCLipjbGFzcyBBLipjbGFzcyBDLipjbGFzcyBBLip4ID0gMC4qIiAicHJpbnQgaW5oZXJpdGVkIGNsYXNzICIKK2dkYl90ZXN0ICJwIGdfRS54ID0gOTkiICIuKndhcm4uKnggYW1iaWd1b3VzOyB1c2luZyBFOjp4LiBVc2UgYSBjYXN0IHRvIGRpc2FtYmlnLio5OS4qIiAic2V0IHZpYSBwcmludCIKK2dkYl90ZXN0ICJjIiAiLipQcm9ncmFtIGV4aXRlZC4qIiAicnVuIHRvIGVuZCIKKworZ2RiX2V4aXQKKworIyBDaGVjayBmb3IgcHJvZHVjdGlvbiBvZiBhIGNvcmUgZmlsZQorIworI3NldCBleGVjX291dHB1dCBbZXhlY3V0ZV9hbnl3aGVyZSAibHMgY29yZSJdCitzZXQgZXhlY19vdXRwdXQgW3JlbW90ZV9leGVjIGJ1aWxkICJscyBjb3JlIl0KK2lmIFsgcmVnZXhwICJjb3JlIG5vdCBmb3VuZCIgJGV4ZWNfb3V0cHV0XSAgeworICAgIHBhc3MgIk5vIGNvcmUgZHVtcGVkIG9uIHF1aXQiCit9IGVsc2UgeworICBpZiBbIHJlZ2V4cCAiTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIgJGV4ZWNfb3V0cHV0XSB7CisgICAgICBwYXNzICJsczogY29yZTogTm8gY29yZSBkdW1wZWQgb24gcXVpdCIKKyAgfSBlbHNlIHsKKyAgICAgIHJlbW90ZV9leGVjIGJ1aWxkICJybSAtZiBjb3JlIgorICAgICAgZmFpbCAiQ29yZSBkdW1wZWQgb24gcXVpdCIKKyAgfQorfQorCisjIGV4ZWN1dGVfYW55d2hlcmUgInJtIC1mICR7YmluZmlsZTF9IgorIworcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc28taW1wbC1sZC5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zby1pbXBsLWxkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmYTE4OQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc28taW1wbC1sZC5jCkBAIC0wLDAgKzEsMTggQEAKKy8qIFRoaXMgcHJvZ3JhbSBpcyBsaW5rZWQgYWdhaW5zdCBTT00gc2hhcmVkIGxpYnJhcmllcywgd2hpY2ggdGhlIGxvYWRlcgorICAgYXV0b21hdGljYWxseSBsb2FkcyBhbG9uZyB3aXRoIHRoZSBwcm9ncmFtIGl0c2VsZikuCisgICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworZXh0ZXJuIGludCBzb2xpYl9tYWluIChpbnQpOworCittYWluICgpCit7CisgIGludCAgcmVzdWx0OworCisgIC8qIENhbGwgYSBzaGxpYiBmdW5jdGlvbi4gKi8KKyAgcmVzdWx0ID0gc29saWJfbWFpbiAoMTAwKTsKKworICAvKiBDYWxsIGl0IGFnYWluLiAqLworICByZXN1bHQgPSBzb2xpYl9tYWluIChyZXN1bHQpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zby1pbXBsLWxkLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc28taW1wbC1sZC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyYWExZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc28taW1wbC1sZC5leHAKQEAgLTAsMCArMSwxNjcgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorCX0KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKKyMgYXJlIHdlIG9uIGEgdGFyZ2V0IGJvYXJkCitpZiAhW2lzbmF0aXZlXSB0aGVuIHsKKyAgICByZXR1cm4KK30KKworIyBUaGlzIHRlc3QgaXMgcHJlc2VudGx5IG9ubHkgdmFsaWQgb24gSFAtVVgsIHNpbmNlIGl0IHJlcXVpcmVzCisjIHRoYXQgd2UgdXNlIEhQLVVYLXNwZWNpZmljIGNvbXBpbGVyICYgbGlua2VyIG9wdGlvbnMgdG8gYnVpbGQKKyMgdGhlIHRlc3RjYXNlLgorIworc2V0dXBfeGZhaWwgIiotKi0qIgorY2xlYXJfeGZhaWwgImhwcGEqLSotKmhwdXgqIgorCitzZXQgbGliZmlsZSAic29saWIiCitzZXQgdGVzdGZpbGUgInNvLWltcGwtbGQiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9XSB7CisgICAgcmV0dXJuIC0xCit9CisKKyMgQnVpbGQgdGhlIHNoYXJlZCBsaWJyYXJpZXMgdGhpcyB0ZXN0IGNhc2UgbmVlZHMuCisjCisjY2QgJHtzdWJkaXJ9CisjcmVtb3RlX2V4ZWMgYnVpbGQgIiRDQyAtZyAreiAtYyAke2xpYmZpbGV9MS5jIC1vICR7bGliZmlsZX0xLm8iCisKKworaWYgeyRnY2NfY29tcGlsZWQgPT0gMH0geworICAgIGlmIFtpc3RhcmdldCAiaHBwYSotaHAtaHB1eCoiXSB0aGVuIHsKKwlzZXQgYWRkaXRpb25hbF9mbGFncyAiYWRkaXRpb25hbF9mbGFncz0reiIKKyAgICB9IGVsc2UgeworCSMgZG9uJ3Qga25vdyB0aGF0IHRoZSBjb21waWxlciBpcywgaG9wZSBmb3IgdGhlIGJlc3QuLi4KKwlzZXQgYWRkaXRpb25hbF9mbGFncyAiIgorICAgIH0KK30gZWxzZSB7CisgICAgc2V0IGFkZGl0aW9uYWxfZmxhZ3MgImFkZGl0aW9uYWxfZmxhZ3M9LWZwaWMiCit9CisKK2lmIHtbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtsaWJmaWxlfTEuYyIgIiR7bGliZmlsZX0xLm8iIG9iamVjdCBbbGlzdCBkZWJ1ZyAkYWRkaXRpb25hbF9mbGFnc11dICE9ICIifSB7CisgICAgcGVycm9yICJDb3VsZG4ndCBjb21waWxlICR7bGliZmlsZX0xLmMiCisgICAgcmV0dXJuIC0xCit9CisKK2lmIFtpc3RhcmdldCAiaHBwYSotaHAtaHB1eCoiXSB0aGVuIHsKKyAgICByZW1vdGVfZXhlYyBidWlsZCAibGQgLWIgJHtsaWJmaWxlfTEubyAtbyAke2xpYmZpbGV9MS5zbCIKK30gZWxzZSB7CisgICAgc2V0IGFkZGl0aW9uYWxfZmxhZ3MgImFkZGl0aW9uYWxfZmxhZ3M9LXNoYXJlZCIKKyAgICBnZGJfY29tcGlsZSAiJHtsaWJmaWxlfTEubyIgIiR7bGliZmlsZX0xLnNsIiBleGVjdXRhYmxlIFtsaXN0IGRlYnVnICRhZGRpdGlvbmFsX2ZsYWdzXQorfQorCisjIEJ1aWxkIHRoZSB0ZXN0IGNhc2UKKyNyZW1vdGVfZXhlYyBidWlsZCAiJENDIC1BYSAtZyAke3NyY2ZpbGV9ICR7bGliZmlsZX0xLnNsIC1vICR7YmluZmlsZX0iCisKKworaWYgeyRnY2NfY29tcGlsZWQgPT0gMH0geworICAgIGlmIFtpc3RhcmdldCAiaHBwYSotaHAtaHB1eCoiXSB0aGVuIHsKKwlzZXQgYWRkaXRpb25hbF9mbGFncyAiYWRkaXRpb25hbF9mbGFncz0tQWUiCisgICAgfSBlbHNlIHsKKwkjIGRvbid0IGtub3cgd2hhdCB0aGUgY29tcGlsZXIgaXMsIGhvcGUgZm9yIHRoZSBiZXN0LCBtYXliZSBpdCdzIEFOU0kuLi4KKwlzZXQgYWRkaXRpb25hbF9mbGFncyAiIgorICAgIH0KK30gZWxzZSB7CisgICAgc2V0IGFkZGl0aW9uYWxfZmxhZ3MgIiIKK30KKworaWYge1tnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9ICR7bGliZmlsZX0xLnNsIiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSBbbGlzdCBkZWJ1ZyAkYWRkaXRpb25hbF9mbGFnc11dICE9ICIifSB7CisgICAgcGVycm9yICJDb3VsZG4ndCBidWlsZCAke2JpbmZpbGV9IgorICAgIHJldHVybiAtMQorfQorI2NkIC4uCisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworIyBUaGlzIHByb2dyYW0gaW1wbGljaXRseSBsb2FkcyBTT00gc2hhcmVkIGxpYnJhcmllcy4KKyMKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7IGZhaWwgImltcGxpY2l0IHNvbGlicyB0ZXN0cyBzdXBwcmVzc2VkIiB9CisKKyMgVmVyaWZ5IHRoYXQgd2UgY2FuIHN0ZXAgb3ZlciB0aGUgZmlyc3Qgc2hsaWIgY2FsbC4KKyMKK3NlbmRfZ2RiICJuZXh0XG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICIxN1xbIFx0XF0qcmVzdWx0ID0gc29saWJfbWFpbiAucmVzdWx0LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAic3RlcCBvdmVyIHNvbGliIGNhbGwifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJzdGVwIG92ZXIgc29saWIgY2FsbCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzdGVwIG92ZXIgc29saWIgY2FsbCJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgd2UgY2FuIHN0ZXAgaW50byB0aGUgc2Vjb25kIHNobGliIGNhbGwuCisjCitzZW5kX2dkYiAic3RlcFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAic29saWJfbWFpbiAuYXJnPTEwMDAwLiBhdC4qJHtsaWJmaWxlfTEuYzo4LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAic3RlcCBpbnRvIHNvbGliIGNhbGwifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJzdGVwIGludG8gc29saWIgY2FsbCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzdGVwIGludG8gc29saWIgY2FsbCJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgd2UgY2FuIHN0ZXAgd2l0aGluIHRoZSBzaGxpYiBjYWxsLgorIworc2VuZF9nZGIgIm5leHRcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIjlcWyBcdFxdKlx9LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAic3RlcCBpbiBzb2xpYiBjYWxsIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAic3RlcCBpbiBzb2xpYiBjYWxsIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHN0ZXAgaW4gc29saWIgY2FsbCJ9Cit9CisKKyMgVmVyaWZ5IHRoYXQgd2UgY2FuIHN0ZXAgb3V0IG9mIHRoZSBzaGxpYiBjYWxsLCBhbmQgYmFjayBvdXQgaW50bworIyB0aGUgY2FsbGVyLgorIworc2VuZF9nZGIgIm5leHRcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiMHhcWzAtOWEtZlxdKlxbIFx0XF0qOVxbIFx0XF0qLiokZ2RiX3Byb21wdCAkIiB7CisJIyB3ZSBoYXZlbid0IGxlZnQgdGhlIGNhbGxlZSB5ZXQsIHNvIGRvIGFub3RoZXIgbmV4dAorCXNlbmRfZ2RiICJuZXh0XG4iCisJZ2RiX2V4cGVjdCB7CisJICAgIC1yZSAibWFpbiAuLiBhdC4qc28taW1wbC1sZC5jOjE4LiokZ2RiX3Byb21wdCAkIlwKKwkJe3Bhc3MgInN0ZXAgb3V0IG9mIHNvbGliIGNhbGwifQorCSAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorCQl7ZmFpbCAic3RlcCBvdXQgb2Ygc29saWIgY2FsbCJ9CisJICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzdGVwIG91dCBvZiBzb2xpYiBjYWxsIn0KKwl9CisgICAgfQorCisgICAgLXJlICJtYWluIC4uIGF0Lipzby1pbXBsLWxkLmM6MTguKiRnZGJfcHJvbXB0ICQiXAorCXtwYXNzICJzdGVwIG91dCBvZiBzb2xpYiBjYWxsIn0KKyAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorCXtmYWlsICJzdGVwIG91dCBvZiBzb2xpYiBjYWxsIn0KKyAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc3RlcCBvdXQgb2Ygc29saWIgY2FsbCJ9Cit9CisKK2dkYl9leGl0CityZXR1cm4gMApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zby1pbmRyLWNsLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NvLWluZHItY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzI5YmFkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zby1pbmRyLWNsLmMKQEAgLTAsMCArMSwyMyBAQAorLyogVGhpcyBwcm9ncmFtIGlzIGxpbmtlZCBhZ2FpbnN0IFNPTSBzaGFyZWQgbGlicmFyaWVzLCB3aGljaCB0aGUgbG9hZGVyCisgICBhdXRvbWF0aWNhbGx5IGxvYWRzIGFsb25nIHdpdGggdGhlIHByb2dyYW0gaXRzZWxmKS4KKyAgICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitleHRlcm4gaW50IHNvbGliX21haW4gKGludCk7CisKK3N0YXRpYyBpbnQKK3NvbGliX3dyYXBwZXIgKGZ1bmN0aW9uKQorICBpbnQgKCpmdW5jdGlvbikoaW50KTsKK3sKKyAgcmV0dXJuICgqZnVuY3Rpb24pKDEwMCk7Cit9CisKKworbWFpbiAoKQoreworICBpbnQgIHJlc3VsdDsKKworICAvKiBUaGlzIGlzIGFuIGluZGlyZWN0IGNhbGwgdG8gc29saWJfbWFpbi4gKi8KKyAgcmVzdWx0ID0gc29saWJfd3JhcHBlciAoc29saWJfbWFpbik7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NvLWluZHItY2wuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zby1pbmRyLWNsLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzc4NzhlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zby1pbmRyLWNsLmV4cApAQCAtMCwwICsxLDE0NiBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKKwl9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCisjIGFyZSB3ZSBvbiBhIHRhcmdldCBib2FyZAoraWYgIVtpc25hdGl2ZV0gdGhlbiB7CisgICAgcmV0dXJuCit9CisKKyMgVGhpcyB0ZXN0IGlzIHByZXNlbnRseSBvbmx5IHZhbGlkIG9uIEhQLVVYLCBzaW5jZSBpdCByZXF1aXJlcworIyB0aGF0IHdlIHVzZSBIUC1VWC1zcGVjaWZpYyBjb21waWxlciAmIGxpbmtlciBvcHRpb25zIHRvIGJ1aWxkCisjIHRoZSB0ZXN0Y2FzZS4KKyMKK3NldHVwX3hmYWlsICIqLSotKiIKK2NsZWFyX3hmYWlsICJocHBhKi0qLSpocHV4KiIKKworc2V0IGxpYmZpbGUgInNvbGliIgorc2V0IHRlc3RmaWxlICJzby1pbmRyLWNsIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0geworICAgIHJldHVybiAtMQorfQorCisjIEJ1aWxkIHRoZSBzaGFyZWQgbGlicmFyaWVzIHRoaXMgdGVzdCBjYXNlIG5lZWRzLgorIworI2NkICR7c3ViZGlyfQorI3JlbW90ZV9leGVjIGJ1aWxkICIkQ0MgLWcgK3ogLWMgJHtsaWJmaWxlfTEuYyAtbyAke2xpYmZpbGV9MS5vIgorCisKK2lmIHskZ2NjX2NvbXBpbGVkID09IDB9IHsKKyAgICBpZiBbaXN0YXJnZXQgImhwcGEqLWhwLWhwdXgqIl0gdGhlbiB7CisJc2V0IGFkZGl0aW9uYWxfZmxhZ3MgImFkZGl0aW9uYWxfZmxhZ3M9K3oiCisgICAgfSBlbHNlIHsKKwkjIGRvbid0IGtub3cgd2hhdCB0aGUgY29tcGlsZXIgaXMuLi4KKwlzZXQgYWRkaXRpb25hbF9mbGFncyAiIgorICAgIH0KK30gZWxzZSB7CisgICAgc2V0IGFkZGl0aW9uYWxfZmxhZ3MgImFkZGl0aW9uYWxfZmxhZ3M9LWZwaWMiCit9CitpZiB7W2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7bGliZmlsZX0xLmMiICIke29iamRpcn0vJHtzdWJkaXJ9LyR7bGliZmlsZX0xLm8iIG9iamVjdCBbbGlzdCBkZWJ1ZyAkYWRkaXRpb25hbF9mbGFnc11dICE9ICIifSB7CisgICAgcGVycm9yICJDb3VsZG4ndCBjb21waWxlICR7bGliZmlsZX0xLmMiCisgICAgcmV0dXJuIC0xCit9CisKK2lmIFtpc3RhcmdldCAiaHBwYSotaHAtaHB1eCoiXSB0aGVuIHsKKyAgICByZW1vdGVfZXhlYyBidWlsZCAibGQgLWIgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke2xpYmZpbGV9MS5vIC1vICR7b2JqZGlyfS8ke3N1YmRpcn0vJHtsaWJmaWxlfTEuc2wiCit9IGVsc2UgeworICAgIHNldCBhZGRpdGlvbmFsX2ZsYWdzICJhZGRpdGlvbmFsX2ZsYWdzPS1zaGFyZWQiCisgICAgZ2RiX2NvbXBpbGUgIiR7b2JqZGlyfS8ke3N1YmRpcn0vJHtsaWJmaWxlfTEubyIgIiR7b2JqZGlyfS8ke3N1YmRpcn0vJHtsaWJmaWxlfTEuc2wiIGV4ZWN1dGFibGUgW2xpc3QgZGVidWcgJGFkZGl0aW9uYWxfZmxhZ3NdCit9CisKKyMgQnVpbGQgdGhlIHRlc3QgY2FzZQorI3JlbW90ZV9leGVjIGJ1aWxkICIkQ0MgLUFhIC1nICR7c3JjZmlsZX0gJHtsaWJmaWxlfTEuc2wgLW8gJHtiaW5maWxlfSIKKworCitpZiB7JGdjY19jb21waWxlZCA9PSAwfSB7CisgICAgaWYgW2lzdGFyZ2V0ICJocHBhKi1ocC1ocHV4KiJdIHRoZW4geworCXNldCBhZGRpdGlvbmFsX2ZsYWdzICJhZGRpdGlvbmFsX2ZsYWdzPS1BZSIKKyAgICB9IGVsc2UgeworCSMgZG9uJ3Qga25vdyB3aGF0IHRoZSBjb21waWxlciBpcywgaG9wZSBmb3IgdGhlIGJlc3QsIG1heWJlIGl0J3MgQU5TSS4uLgorCXNldCBhZGRpdGlvbmFsX2ZsYWdzICIiCisgICAgfQorfSBlbHNlIHsKKyAgICBzZXQgYWRkaXRpb25hbF9mbGFncyAiIgorfQoraWYge1tnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9ICR7b2JqZGlyfS8ke3N1YmRpcn0vJHtsaWJmaWxlfTEuc2wiICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIFtsaXN0IGRlYnVnICRhZGRpdGlvbmFsX2ZsYWdzXV0gIT0gIiJ9IHsKKyAgICBwZXJyb3IgIkNvdWxkbid0IGJ1aWxkICR7YmluZmlsZX0iCisgICAgcmV0dXJuIC0xCit9CisKKyNjZCAuLgorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKKyMgVGhpcyBwcm9ncmFtIGltcGxpY2l0bHkgbG9hZHMgU09NIHNoYXJlZCBsaWJyYXJpZXMuICBXZSB3aXNoIHRvIHRlc3QKKyMgd2hldGhlciBhIHVzZXIgY2FuIHNldCBicmVha3BvaW50cyBpbiBhIHNobGliIGJlZm9yZSBydW5uaW5nIHRoZQorIyBwcm9ncmFtLCB3aGVyZSB0aGUgcHJvZ3JhbSBkb2Vzbid0IGRpcmVjdGx5IGNhbGwgdGhlIHNobGliLCBidXQKKyMgaW5kaXJlY3RseSBkb2VzIHZpYSBwYXNzaW5nIGl0cyBhZGRyZXNzIHRvIGFub3RoZXIgZnVuY3Rpb24uCisjCisjID8/cmVocmF1ZXI6IEN1cnJlbnRseSwgdGhpcyBkb2Vzbid0IHdvcmssIGJ1dCB3ZSBkbyBjYXRjaCB0aGUgY2FzZQorIyBhbmQgZXhwbGljaXRseSBkaXNhbGxvdyBpdC4gIFRoZSByZWFzb24gaXQgZmFpbHMgYXBwZWFycyB0byBiZSB0aGF0CisjCisjICBbMV0gZ2RiIGNvbnN1bHRzIG9ubHkgdGhlIGxpbmtlciBzeW1ib2wgdGFibGUgaW4gdGhpcyBzY2VuYXJpbywgYW5kCisjICBbMl0gRm9yIGEgc2hsaWIgZnVuY3Rpb24gdGhhdCBpcyBvbmx5IGluZGlyZWN0bHkgY2FsbGVkIGZyb20gdGhlCisjICAgICAgbWFpbiBhLm91dCwgdGhlcmUgaXMgaW4gdGhlIGxpbmtlciBzeW1ib2wgdGFibGUgYSBzdHViIHdob3NlCisjICAgICAgYWRkcmVzcyBpcyBuZWdhdGl2ZS4gIFBvc3NpYmx5IHRoaXMgaXMgdG8gYmUgaW50ZXJwcmV0ZWQgYXMKKyMgICAgICBhbiBpbmRleCBpbnRvIHRoZSBETFQ/PworIworc2VuZF9nZGIgImJyZWFrIHNvbGliX21haW5cbiIKK2dkYl9leHBlY3QgeworICAtcmUgIkNhbm5vdCBicmVhayBvbiBzb2xpYl9tYWluIHdpdGhvdXQgYSBydW5uaW5nIHByb2dyYW0uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJicmVhayBvbiBpbmRpcmVjdCBzb2xpYiBjYWxsIGJlZm9yZSBydW5uaW5nIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiYnJlYWsgb24gaW5kaXJlY3Qgc29saWIgY2FsbCBiZWZvcmUgcnVubmluZyJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBicmVhayBvbiBpbmRpcmVjdCBzb2xpYiBjYWxsIGJlZm9yZSBydW5uaW5nIn0KK30KKworIyBIb3dldmVyLCBpZiB3ZSBkbyBydW4gdG8gdGhlIHByb2dyYW0ncyBtYWluLCB3ZSB0aGVuIG91Z2h0IHRvIGJlCisjIGFibGUgdG8gc2V0IGEgYnJlYWtwb2ludCBvbiB0aGUgaW5kaXJlY3RseSBjYWxsZWQgZnVuY3Rpb24uICAoQXBwYXJlbnRseSwKKyMgb25jZSB0aGUgaW5mZXJpb3IgaXMgcnVubmluZywgZ2RiIGNvbnN1bHRzIHRoZSBkZWJ1ZyBpbmZvIHJhdGhlciB0aGFuCisjIHRoZSBsaW5rZXIgc3ltYm9sIHRhYmxlLCBhbmQgaXMgYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IGFkZHJlc3MuKQorIworaWYgIVtydW50b19tYWluXSB0aGVuIHsgZmFpbCAiaW5kaXJlY3Qgc29saWIgY2FsbCB0ZXN0cyBzdXBwcmVzc2VkIiB9CisKKyMgVmVyaWZ5IHRoYXQgd2UgY2FuIHN0ZXAgb3ZlciB0aGUgZmlyc3Qgc2hsaWIgY2FsbC4KKyMKK3NlbmRfZ2RiICJicmVhayBzb2xpYl9tYWluXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICIuKlxbQmJcXXJlYWtwb2ludCBcWzAtOVxdKiBhdCAweFxbMC05YS1mQS1GXF0qOiBmaWxlLioke2xpYmZpbGV9MS5jLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAiYnJlYWsgb24gaW5kaXJlY3Qgc29saWIgY2FsbCBhZnRlciBydW5uaW5nIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiYnJlYWsgb24gaW5kaXJlY3Qgc29saWIgY2FsbCBhZnRlciBydW5uaW5nIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGJyZWFrIG9uIGluZGlyZWN0IHNvbGliIGNhbGwgYWZ0ZXIgcnVubmluZyJ9Cit9CisKK2dkYl9leGl0CityZXR1cm4gMApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zb2xpYi5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zb2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOWQzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NvbGliLmMKQEAgLTAsMCArMSw1OSBAQAorLyogVGhpcyBwcm9ncmFtIHVzZXMgSFAtVVgtc3BlY2lmaWMgZmVhdHVyZXMgdG8gbG9hZCBhbmQgdW5sb2FkIFNPTQorICAgc2hhcmVkIGxpYnJhcmllcyB0aGF0IGl0IHdhc24ndCBsaW5rZWQgYWdhaW5zdCAoaS5lLiwgbGlicmFyaWVzCisgICB0aGF0IHRoZSBsb2FkZXIgZG9lc24ndCBhdXRvbWF0aWNhbGx5IGxvYWQgYWxvbmcgd2l0aCB0aGUgcHJvZ3JhbQorICAgaXRzZWxmKS4KKyAgICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGRsLmg+CisKK21haW4gKCkKK3sKKyAgc2hsX3QgIHNvbGliX2hhbmRsZTsKKyAgaW50ICBkdW1teTsKKyAgaW50ICBzdGF0dXM7CisgIGludCAgKCpzb2xpYl9tYWluKSAoKTsKKworICAvKiBMb2FkIGEgc2hsaWIsIHdpdGggaW1tZWRpYXRlIGJpbmRpbmcgb2YgYWxsIHN5bWJvbHMuCisKKyAgICAgTm90ZSB0aGF0IHRoZSBwYXRobmFtZSBvZiB0aGUgbG9hZGVkIHNobGliIGlzIGFzc3VtZWQgdG8gYmUgcmVsYXRpdmUKKyAgICAgdG8gdGhlIHRlc3RzdWl0ZSBkaXJlY3RvcnkgKGZyb20gd2hlbmNlIHRoZSB0ZXN0ZWQgR0RCIGlzIHJ1biksIG5vdAorICAgICBmcm9tIGRvdC8uCisgICAqLworICBkdW1teSA9IDE7ICAvKiBQdXQgc29tZSBjb2RlIGJldHdlZW4gc2hsXyBjYWxscy4uLiAqLworICBzb2xpYl9oYW5kbGUgPSBzaGxfbG9hZCAoImdkYi5iYXNlL3NvbGliMS5zbCIsIEJJTkRfSU1NRURJQVRFLCAwKTsKKworICAvKiBGaW5kIGEgZnVuY3Rpb24gd2l0aGluIHRoZSBzaGxpYiwgYW5kIGNhbGwgaXQuICovCisgIHN0YXR1cyA9IHNobF9maW5kc3ltICgmc29saWJfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgInNvbGliX21haW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9QUk9DRURVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyAqKSAmc29saWJfbWFpbik7CisgIHN0YXR1cyA9ICgqc29saWJfbWFpbikgKGR1bW15KTsKKworICAvKiBVbmxvYWQgdGhlIHNobGliLiAqLworICBzdGF0dXMgPSBzaGxfdW5sb2FkIChzb2xpYl9oYW5kbGUpOworCisgIC8qIExvYWQgYSBkaWZmZXJlbnQgc2hsaWIsIHdpdGggZGVmZXJyZWQgYmluZGluZyBvZiBhbGwgc3ltYm9scy4gKi8KKyAgZHVtbXkgPSAyOworICBzb2xpYl9oYW5kbGUgPSBzaGxfbG9hZCAoImdkYi5iYXNlL3NvbGliMi5zbCIsIEJJTkRfREVGRVJSRUQsIDApOworCisgIC8qIEZpbmQgYSBmdW5jdGlvbiB3aXRoaW4gdGhlIHNobGliLCBhbmQgY2FsbCBpdC4gKi8KKyAgc3RhdHVzID0gc2hsX2ZpbmRzeW0gKCZzb2xpYl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAic29saWJfbWFpbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1BST0NFRFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nICopICZzb2xpYl9tYWluKTsKKyAgc3RhdHVzID0gKCpzb2xpYl9tYWluKSAoZHVtbXkpOworCisgIC8qIFVubG9hZCB0aGUgc2hsaWIuICovCisgIHN0YXR1cyA9IHNobF91bmxvYWQgKHNvbGliX2hhbmRsZSk7CisKKyAgLyogUmVsb2FkIHRoZSBmaXJzdCBzaGxpYiBhZ2Fpbiwgd2l0aCBkZWZlcnJlZCBzeW1ib2wgYmluZGluZyB0aGlzIHRpbWUuICovCisgIGR1bW15ID0gMzsKKyAgc29saWJfaGFuZGxlID0gc2hsX2xvYWQgKCJnZGIuYmFzZS9zb2xpYjEuc2wiLCBCSU5EX0lNTUVESUFURSwgMCk7CisKKyAgLyogVW5sb2FkIGl0IHdpdGhvdXQgdHJ5aW5nIHRvIGZpbmQgYW55IHN5bWJvbHMgaW4gaXQuICovCisgIHN0YXR1cyA9IHNobF91bmxvYWQgKHNvbGliX2hhbmRsZSk7CisKKyAgLyogQWxsIGRvbmUuICovCisgIGR1bW15ID0gLTE7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NvbGliLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc29saWIuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NTIxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NvbGliLmV4cApAQCAtMCwwICsxLDMxOSBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKKwl9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCisjIGFyZSB3ZSBvbiBhIHRhcmdldCBib2FyZAoraWYgIVtpc25hdGl2ZV0gdGhlbiB7CisgICAgcmV0dXJuCit9CisKKyMgVGhpcyB0ZXN0IGlzIHByZXNlbnRseSBvbmx5IHZhbGlkIG9uIEhQLVVYLiAgSXQgdmVyaWZpZXMgR0RCJ3MKKyMgYWJpbGl0eSB0byBjYXRjaCBsb2FkcyBhbmQgdW5sb2FkcyBvZiBzaGFyZWQgbGlicmFyaWVzLgorIworCisjc2V0dXBfeGZhaWwgIiotKi0qIgorI2NsZWFyX3hmYWlsICJocHBhKi0qLSpocHV4KiIKK2lmIHshW2lzdGFyZ2V0ICJocHBhKi0qLWhwdXgqIl19IHsKKyAgICByZXR1cm4gMAorfQorCitzZXQgdGVzdGZpbGUgInNvbGliIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCisjIGJ1aWxkIHRoZSBmaXJzdCB0ZXN0IGNhc2UKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9XSB7CisgICAgcmV0dXJuIC0xCit9CisKKyMgQnVpbGQgdGhlIHNoYXJlZCBsaWJyYXJpZXMgdGhpcyB0ZXN0IGNhc2UgbmVlZHMuCisjCisjY2QgJHtzdWJkaXJ9CisjcmVtb3RlX2V4ZWMgYnVpbGQgIiRDQyAtZyAreiAtYyAke3Rlc3RmaWxlfTEuYyAtbyAke3Rlc3RmaWxlfTEubyIKKyNyZW1vdGVfZXhlYyBidWlsZCAiJENDIC1nICt6IC1jICR7dGVzdGZpbGV9Mi5jIC1vICR7dGVzdGZpbGV9Mi5vIgorCitpZiB7JGdjY19jb21waWxlZCA9PSAwfSB7CisgICAgaWYgW2lzdGFyZ2V0ICJocHBhKi1ocC1ocHV4KiJdIHRoZW4geworCXNldCBhZGRpdGlvbmFsX2ZsYWdzICJhZGRpdGlvbmFsX2ZsYWdzPSt6IgorICAgIH0gZWxzZSB7CisJIyBkb24ndCBrbm93IHdoYXQgdGhlIGNvbXBpbGVyIGlzLi4uCisJc2V0IGFkZGl0aW9uYWxfZmxhZ3MgIiIKKyAgICB9Cit9IGVsc2UgeworICAgIHNldCBhZGRpdGlvbmFsX2ZsYWdzICJhZGRpdGlvbmFsX2ZsYWdzPS1mcGljIgorfQorCitpZiB7W2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9MS5jIiAiJHtiaW5maWxlfTEubyIgb2JqZWN0IFtsaXN0IGRlYnVnICRhZGRpdGlvbmFsX2ZsYWdzXV0gIT0gIiJ9IHsKKyAgICBwZXJyb3IgIkNvdWxkbid0IGNvbXBpbGUgJHt0ZXN0ZmlsZX0xLmMiCisgICAgI3JldHVybiAtMQorfQoraWYge1tnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfTIuYyIgIiR7YmluZmlsZX0yLm8iIG9iamVjdCBbbGlzdCBkZWJ1ZywgJGFkZGl0aW9uYWxfZmxhZ3NdXSAhPSAiIn0geworICAgIHBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3Rlc3RmaWxlfTIuYyIKKyAgICAjcmV0dXJuIC0xCit9CisKK2lmIFtpc3RhcmdldCAiaHBwYSotKi1ocHV4KiJdIHsKKyAgICByZW1vdGVfZXhlYyBidWlsZCAibGQgLWIgJHtiaW5maWxlfTEubyAtbyAke2JpbmZpbGV9MS5zbCIKKyAgICByZW1vdGVfZXhlYyBidWlsZCAibGQgLWIgJHtiaW5maWxlfTIubyAtbyAke2JpbmZpbGV9Mi5zbCIKK30gZWxzZSB7CisgICAgc2V0IGFkZGl0aW9uYWxfZmxhZ3MgImFkZGl0aW9uYWxfZmxhZ3M9LXNoYXJlZCIKKyAgICBnZGJfY29tcGlsZSAiJHtiaW5maWxlfTEubyIgIiR7YmluZmlsZX0xLnNsIiBleGVjdXRhYmxlIFtsaXN0IGRlYnVnICRhZGRpdGlvbmFsX2ZsYWdzXQorICAgIGdkYl9jb21waWxlICIke2JpbmZpbGV9Mi5vIiAiJHtiaW5maWxlfTIuc2wiIGV4ZWN1dGFibGUgW2xpc3QgZGVidWcgJGFkZGl0aW9uYWxfZmxhZ3NdCit9CisjY2QgLi4KKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisjIFRoaXMgcHJvZ3JhbSBtYW51YWxseSBsb2FkcyBhbmQgdW5sb2FkcyBTT00gc2hhcmVkIGxpYnJhcmllcywgdmlhIGNhbGxzCisjIHRvIHNobF9sb2FkIGFuZCBzaGxfdW5sb2FkLgorIworaWYgIVtydW50b19tYWluXSB0aGVuIHsgZmFpbCAiY2F0Y2ggbG9hZC91bmxvYWQgdGVzdHMgc3VwcHJlc3NlZCIgfQorCisjIFZlcmlmeSB0aGF0IHdlIGNvbXBsYWluIGlmIHRoZSB1c2VyIHRlbGxzIHVzIHRvIGNhdGNoIHNvbWV0aGluZyB3ZQorIyBkb24ndCB1bmRlcnN0YW5kLgorIworc2VuZF9nZGIgImNhdGNoIGFfY29sZFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiVW5rbm93biBldmVudCBraW5kIHNwZWNpZmllZCBmb3IgY2F0Y2guKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJib2d1cyBjYXRjaCBraW5kIGlzIGRpc2FsbG93ZWQifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJib2d1cyBjYXRjaCBraW5kIGlzIGRpc2FsbG93ZWQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgYm9ndXMgY2F0Y2gga2luZCBpcyBkaXNhbGxvd2VkIn0KK30KKworIyBWZXJpZnkgdGhhdCB3ZSBjYW4gc2V0IGEgZ2VuZXJpYyBjYXRjaHBvaW50IG9uIHNobGliIGxvYWRzLiAgSS5lLiwgdGhhdAorIyB3ZSBjYW4gY2F0Y2ggYW55IHNobGliIGxvYWQsIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgbmFtZS4KKyMKK3NlbmRfZ2RiICJjYXRjaCBsb2FkXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJDYXRjaHBvaW50IFxbMC05XF0qIC5sb2FkIDxhbnkgbGlicmFyeT4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzZXQgZ2VuZXJpYyBjYXRjaCBsb2FkIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAic2V0IGdlbmVyaWMgY2F0Y2ggbG9hZCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZXQgZ2VuZXJpYyBjYXRjaCBsb2FkIn0KK30KKworc2VuZF9nZGIgImNvbnRpbnVlXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJDYXRjaHBvaW50IFxbMC05XF0gLmxvYWRlZCBnZGIuYmFzZS9zb2xpYjEuc2wuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJjYXVnaHQgZ2VuZXJpYyBzb2xpYiBsb2FkIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiY2F1Z2h0IGdlbmVyaWMgc29saWIgbG9hZCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBjYXVnaHQgZ2VuZXJpYyBzb2xpYiBsb2FkIn0KK30KKworIyBTZXQgYSBicmVha3BvaW50IG9uIHRoZSBsaW5lIGZvbGxvd2luZyB0aGUgc2hsX2xvYWQgY2FsbCwgYW5kCisjIGNvbnRpbnVlLgorIworIyA/P3JlaHJhdWVyOiBJdCBhcHBlYXJzIHRoYXQgd2UgY2FuJ3QganVzdCBzYXkgImZpbmlzaCIgZnJvbSBoZXJlOworIyBHREIgaXMgZ2V0dGluZyBjb25mdXNlZCBieSB0aGUgZGxkJ3MgcHJlc2Vuc2Ugb24gdGhlIHN0YWNrLgorIworc2VuZF9nZGIgImJyZWFrIDI3XG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJCcmVha3BvaW50IFxbMC05XF0qIGF0LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAic2V0IGJyZWFrIGFmdGVyIHNobF9sb2FkIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAic2V0IGJyZWFrIGFmdGVyIHNobF9sb2FkIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHNldCBicmVhayBhZnRlciBzaGxfbG9hZCJ9Cit9CisKK3NlbmRfZ2RiICJjb250aW51ZVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiQnJlYWtwb2ludCBcWzAtOVxdKiwgbWFpbiAuLiBhdCAuKnNvbGliLmM6MjcuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJjb250aW51ZSBhZnRlciBnZW5lcmljIGNhdGNoIGxvYWQifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJjb250aW51ZSBhZnRlciBnZW5lcmljIGNhdGNoIGxvYWQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgY29udGludWUgYWZ0ZXIgZ2VuZXJpYyBjYXRjaCBsb2FkIn0KK30KKworIyBTdGVwIG92ZXIgdGhlIGNhbGwgdG8gc2hsX2ZpbmRzeW0uCisjCisjID8/cmVocmF1ZXI6IEluIHRoZW9yeSwgc2luY2UgdGhlIGNhbGwgdG8gc2hsX2xvYWQgYXNrZWQgZm9yCisjIGltbWVkaWF0ZSBiaW5kaW5nIG9mIHRoZSBzaGxpYidzIHN5bWJvbHMsIGFuZCBzaW5jZSB0aGUKKyMgc2hsaWIncyBzeW1ib2xzIHNob3VsZCBoYXZlIGJlZW4gYXV0by1sb2FkZWQsIHdlIG91Z2h0IHRvCisjIGJlIGFibGUgdG8gc2V0IGEgYnJlYWtwb2ludCBvbiBzb2xpYl9tYWluIG5vdy4gIEhvd2V2ZXIsCisjIHRoYXQgc2VlbXMgbm90IHRvIGJlIHRoZSBjYXNlLiAgRHVubm8gd2h5IGZvciBzdXJlOyBwZXJoYXBzCisjIHRoZSBicmVha3BvaW50IHdhbnRzIHRvIGJlIHNldCBvbiBhbiBpbXBvcnQgc3R1YiBpbiB0aGUKKyMgbWFpbiBwcm9ncmFtIGZvciBzb2xpYl9tYWluPyAgVGhlcmUgd291bGRuJ3QgYmUgb25lLCBpbgorIyB0aGlzIGNhc2UuLi4KKyMgCitzZW5kX2dkYiAibmV4dFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInN0ZXAgb3ZlciBzaGxfZmluZHN5bSJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzdGVwIG92ZXIgc2hsX2ZpbmRzeW0ifQorfQorCisjIFZlcmlmeSB0aGF0IHdlIGNhbiBjYXRjaCBhbiB1bmxvYWQgb2YgYW55IGxpYnJhcnkuCisjCitzZW5kX2dkYiAiY2F0Y2ggdW5sb2FkXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJDYXRjaHBvaW50IFxbMC05XF0qIC51bmxvYWQgPGFueSBsaWJyYXJ5Pi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInNldCBnZW5lcmljIGNhdGNoIHVubG9hZCJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgInNldCBnZW5lcmljIGNhdGNoIHVubG9hZCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZXQgZ2VuZXJpYyBjYXRjaCBsb2FkIn0KK30KKworc2VuZF9nZGIgImNvbnRpbnVlXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJDYXRjaHBvaW50IFxbMC05XF0gLnVubG9hZGVkIGdkYi5iYXNlL3NvbGliMS5zbC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImNhdWdodCBnZW5lcmljIHNvbGliIHVubG9hZCJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImNhdWdodCBnZW5lcmljIHNvbGliIHVubG9hZCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBjYXVnaHQgZ2VuZXJpYyBzb2xpYiB1bmxvYWQifQorfQorCisjIFZlcmlmeSB0aGF0IHdlIGNhbiBjYXRjaCBhIGxvYWQgb2YgYSBzcGVjaWZpYyBsaWJyYXJ5LiAgKERlbGV0ZQorIyBhbGwgdGhlIG90aGVyIGNhdGNocG9pbnRzIGZpcnN0LCBzbyB0aGF0IHRoZSBnZW5lcmljIGNhdGNocG9pbnRzCisjIHdlJ3ZlIHByZXZpb3VzbHkgc2V0IGRvbid0IHRyaWdnZXIuKQorIworc2VuZF9nZGIgImRlbGV0ZVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiRGVsZXRlIGFsbCBicmVha3BvaW50cy4qeSBvciBuLioiXAorICAgICAgICAgIHtzZW5kX2dkYiAieVxuIgorICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge3Bhc3MgImRlbGV0ZSBhbGwgY2F0Y2hwb2ludHMifQorICAgICAgICAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBkZWxldGUgYWxsIGNhdGNocG9pbnRzIn0KKyAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiZGVsZXRlIGFsbCBjYXRjaHBvaW50cyJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBkZWxldGUgYWxsIGNhdGNocG9pbnRzIn0KK30KKworc2VuZF9nZGIgImNhdGNoIGxvYWQgZ2RiLmJhc2Uvc29saWIyLnNsXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJDYXRjaHBvaW50IFxbMC05XF0qIC5sb2FkIGdkYi5iYXNlL3NvbGliMi5zbC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInNldCBzcGVjaWZpYyBjYXRjaCBsb2FkIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAic2V0IHNwZWNpZmljIGNhdGNoIGxvYWQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc2V0IHNwZWNpZmljIGNhdGNoIGxvYWQifQorfQorCitzZW5kX2dkYiAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIkNhdGNocG9pbnQgXFswLTlcXSAubG9hZGVkIGdkYi5iYXNlL3NvbGliMi5zbC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImNhdWdodCBzcGVjaWZpYyBzb2xpYiBsb2FkIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAiY2F1Z2h0IHNwZWNpZmljIHNvbGliIGxvYWQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgY2F1Z2h0IHNwZWNpZmljIHNvbGliIGxvYWQifQorfQorCisjIFZlcmlmeSB0aGF0IHdlIGNhbiBjYXRjaCBhbiB1bmxvYWQgb2YgYSBzcGVjaWZpYyBsaWJyYXJ5LgorIworc2VuZF9nZGIgImNhdGNoIHVubG9hZCBnZGIuYmFzZS9zb2xpYjIuc2xcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIkNhdGNocG9pbnQgXFswLTlcXSogLnVubG9hZCBnZGIuYmFzZS9zb2xpYjIuc2wuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzZXQgc3BlY2lmaWMgY2F0Y2ggdW5sb2FkIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAic2V0IHNwZWNpZmljIGNhdGNoIHVubG9hZCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZXQgc3BlY2lmaWMgY2F0Y2ggdW5sb2FkIn0KK30KKworc2VuZF9nZGIgImNvbnRpbnVlXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJDYXRjaHBvaW50IFxbMC05XF0gLnVubG9hZGVkIGdkYi5iYXNlL3NvbGliMi5zbC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgImNhdWdodCBzcGVjaWZpYyBzb2xpYiB1bmxvYWQifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJjYXVnaHQgc3BlY2lmaWMgc29saWIgdW5sb2FkIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGNhdWdodCBzcGVjaWZpYyBzb2xpYiB1bmxvYWQifQorfQorCisjIFZlcmlmeSB0aGF0IHdlIGNhbiBzZXQgYSBjYXRjaHBvaW50IG9uIGEgc3BlY2lmaWMgbGlicmFyeSB0aGF0CisjIGhhcHBlbnMgbm90IHRvIGJlIGxvYWRlZCBieSB0aGUgcHJvZ3JhbS4gIEFuZCwgdGhhdCB0aGlzIGNhdGNocG9pbnQKKyMgd29uJ3QgdHJpZ2dlciBpbmFwcHJvcHJpYXRlbHkgd2hlbiBvdGhlciBzaGxpYnMgYXJlIGxvYWRlZC4KKyMKK3NlbmRfZ2RiICJicmVhayA1NVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiQnJlYWtwb2ludCBcWzAtOVxdKiBhdC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInNldCBicmVhayBvbiBzaGxfdW5sb2FkIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAic2V0IGJyZWFrIG9uIHNobF91bmxvYWQifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc2V0IGJyZWFrIG9uIHNobF91bmxvYWQifQorfQorCitzZW5kX2dkYiAiYnJlYWsgNThcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIkJyZWFrcG9pbnQgXFswLTlcXSogYXQuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzZXQgYnJlYWsgYWZ0ZXIgc2hsX3VubG9hZCJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgInNldCBicmVhayBhZnRlciBzaGxfdW5sb2FkIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHNldCBicmVhayBhZnRlciBzaGxfdW5sb2FkIn0KK30KKworc2VuZF9nZGIgImNhdGNoIGxvYWQgZm9vYmFyLnNsXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJDYXRjaHBvaW50IFxbMC05XF0qIC5sb2FkIGZvb2Jhci5zbC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInNldCBzcGVjaWZpYyBjYXRjaCBsb2FkIGZvciBub25sb2FkZWQgc2hsaWIifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJzZXQgc3BlY2lmaWMgY2F0Y2ggbG9hZCBmb3Igbm9ubG9hZGVkIHNobGliIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHNldCBzcGVjaWZpYyBjYXRjaCBsb2FkIGZvciBub25sb2FkZWQgc2hsaWIifQorfQorCitzZW5kX2dkYiAiY2F0Y2ggdW5sb2FkIGZvb2Jhci5zbFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiQ2F0Y2hwb2ludCBcWzAtOVxdKiAudW5sb2FkIGZvb2Jhci5zbC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInNldCBzcGVjaWZpYyBjYXRjaCB1bmxvYWQgZm9yIG5vbmxvYWRlZCBzaGxpYiJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgInNldCBzcGVjaWZpYyBjYXRjaCB1bmxvYWQgZm9yIG5vbmxvYWRlZCBzaGxpYiJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZXQgc3BlY2lmaWMgY2F0Y2ggdW5sb2FkIGZvciBub25sb2FkZWQgc2hsaWIifQorfQorCitzZW5kX2dkYiAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIkJyZWFrcG9pbnQgXFswLTlcXSouKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzcGVjaWZpYyBjYXRjaCBsb2FkIGRvZXNuJ3QgdHJpZ2dlciBpbmFwcHJvcHJpYXRlbHkifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJzcGVjaWZpYyBjYXRjaCBsb2FkIGRvZXNuJ3QgdHJpZ2dlciBpbmFwcHJvcHJpYXRlbHkifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc3BlY2lmaWMgY2F0Y2ggbG9hZCBkb2Vzbid0IHRyaWdnZXIgaW5hcHByb3ByaWF0ZWx5In0KK30KKworc2VuZF9nZGIgImNvbnRpbnVlXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJCcmVha3BvaW50IFxbMC05XF0qLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAic3BlY2lmaWMgY2F0Y2ggdW5sb2FkIGRvZXNuJ3QgdHJpZ2dlciBpbmFwcHJvcHJpYXRlbHkifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJzcGVjaWZpYyBjYXRjaCB1bmxvYWQgZG9lc24ndCB0cmlnZ2VyIGluYXBwcm9wcmlhdGVseSJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzcGVjaWZpYyBjYXRjaCB1bmxvYWQgZG9lc24ndCB0cmlnZ2VyIGluYXBwcm9wcmlhdGVseSJ9Cit9CisKKyMgPz9yZWhyYXVlcjogVGhlcmUgb3VnaHQgdG8gYmUgdGVzdHBvaW50cyBoZXJlIHRoYXQgdmVyaWZ5IHRoYXQKKyMgbG9hZC91bmxvYWQgY2F0Y2hwb2ludHMgY2FuIHVzZSBjb25kaXRpb25hbHMsIGNhbiBiZSB0ZW1wb3JhcnksCisjIHNlbGYtZGlzYWJsaW5nLCBldGMgZXRjLgorIworCitnZGJfZXhpdAorcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc29saWIxLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NvbGliMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlY2YwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NvbGliMS5jCkBAIC0wLDAgKzEsOSBAQAorLyogVGhpcyBwcm9ncmFtIGlzIGludGVuZGVkIHRvIGJlIGJ1aWx0IGFzIGFuIEhQLVVYIFNPTSBzaGFyZWQKKyAgIGxpYnJhcnksIGZvciB1c2UgYnkgdGhlIHNvbGliLmV4cCB0ZXN0Y2FzZS4gIEl0IHNpbXBseSByZXR1cm5zCisgICB0aGUgc3F1YXJlIG9mIGl0cyBpbnRlZ2VyIGFyZ3VtZW50LgorICAgKi8KK2ludCAgc29saWJfbWFpbiAoYXJnKQorICBpbnQgIGFyZzsKK3sKKyAgcmV0dXJuIGFyZyphcmc7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NvbGliMi5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zb2xpYjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2Q0NTEzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zb2xpYjIuYwpAQCAtMCwwICsxLDkgQEAKKy8qIFRoaXMgcHJvZ3JhbSBpcyBpbnRlbmRlZCB0byBiZSBidWlsdCBhcyBhbiBIUC1VWCBTT00gc2hhcmVkCisgICBsaWJyYXJ5LCBmb3IgdXNlIGJ5IHRoZSBzb2xpYi5leHAgdGVzdGNhc2UuICBJdCBzaW1wbHkgcmV0dXJucworICAgdGhlIGN1YmUgb2YgaXRzIGludGVnZXIgYXJndW1lbnQuCisgICAqLworaW50ICBzb2xpYl9tYWluIChhcmcpCisgIGludCAgYXJnOworeworICByZXR1cm4gYXJnKmFyZyphcmc7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NwYXJjLWFvdXQudSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3BhcmMtYW91dC51Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNGVlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NwYXJjLWFvdXQudQpAQCAtMCwwICsxLDczMiBAQAorYmVnaW4gNzc3IHNwYXJjLWFvdXQKK01AMCwhIlAgICggICAgIiAgICAgICAgICAjWVAgICIgQCAgICAgICAgICAiXCQiICBUIC5AMCkoI0gkMjUKK00qQiAiRSAqQCEpMCIwIEg3ICAgMFUiK0BIICwgICBDIiAmKChAKSAgIDAqICAgMCEgICAgMCAgICJAJCAKK00gICEgICBAJCAwICAgJCAgIC02PChaIEAwICAoIFAkICAgISAgIEAkIDAgICApV0NPVkBPICAgKEtBN0IKK00qISQgICBCMCRCKCwwICAgMlkoMCggIkwkICAoREAuQDckICAgJE40JCIgQEAqKEAoISogICRcISAgICAKK01QQS5AN0giQDgwTDJAICErIDAgICAuQCNIJiMiIFohRFhALkA6KjAlICAmMiEoIDErUCAgIipYNVhEQjAKK00kIiAgRSEgQCExPEAgICI2JE4gIkYhICAlRCAgICMyOiQiICBJQSAgIikgIiAhMzIgWiFERSEgQCFRPEAKK00gICI2JE4gMkYhICAlRCAgICJOOiQgIDQrUCAgIipYNVhHMDEgICAoRCEoQiZUICAgIi4yJCIgIEpBICAKK00iLCgjSCZCIEQgICEgSCAgIlJcICAgQk4lPikoRCAzICRJKDAgISY0JCIgJyVSICAgKTgyWCEqOCQgIDUKK00wICAgJVlIMCggIyIgWiFQSCAzICA+OENIJ1NKKFoiIFsiLkBBICwgICBDIiAmKChQQi5AQiAsICAhIyIKK00gJiJAUEIuQEMgLCAgIEIiJCYhRFBCLkBEKSAwKCAmP1EgICBEQSBAPygnJ1ggQiFaICAgJCggICFIKDAKK00oIDQwQCAgJEBBIEAxUSIgICAqIiQiICNEPSBAICBKICAgMCEgICAgQDwvQCIgJCAgICIwJCIgIkRAN0AKK00hLTAlUCAiIiQiICREPSBAICkgMCgnXiIkIiAhRD0gQCAgICAwICBPPTctUitWUUk4Ql1MOSJZUztQIE8KK005JjVWK1dJRTxGXCAgICAgICAgICY2LVI9IyBaKCZZTygiXVU8VyhPOyZFQitWUUQrRy1PIkAgICAgICAKK00gICBGOFcpVCwjSEArVzVTPEJdTDo2KE87JjBOPFZcQDs2JVA8JkVOOVIhRjg2RUw9NylFIkAgICAgICAKK00gITFDPEcwUC5CIU47UiBPOSY1VitXSUU8RlwqICAgICAgIj1YW14wTCEgQCAjIiAgICYhUV4gKEA+QCAKK00gKVdDT1kiUCQiICAsKCAgIDgnJ1ggQiFaICAgRz4uX0QrIDAoICBQQCAgIUA8P0AiKCdIICAiPVhbXjAKK01MISBAICMiICAgJiFRXiAoQD5AICApV0NPWSJQJCIgICwoICAgOCcnWCBCIVogICBHPi5fRCsgMCggIFAKK01AICAhQDw/QCIoJ0ggICI9WFteMEwhIEAgIyIgICAmIVFeIChAPkAgIClXQ09ZIlAkIiAgLCggICA4JycKK01YIEIhWiAgIEc+Ll9EKyAwKCAgUEAgICFAPD9AIignSCAgIj1YW14wTCEgQCAjIiAgICYhUV4gKEA+QCAKK00gKVdDT1kiUCQiICAsKCAgIDgnJ1ggQiFaICAgRz4uX0QrIDAoICBQQCAgIUA8P0AiKCdIICAgICAgICAKK01HPi5fRCEkICAgQyEgQi4gLCggICA4JydYIEIhWiAgIEc+Ll9EISQgICEjISZCIkgsKCAgIDgnJ1ggQiEKK01aICAgMExAICApV0NPV0EgICAjRCAwICAgISQgICEjICpCLDAkMCAgJCkoMCggJzIqQik4JDAgICQpKDAKK00oICsyKkIlWCQwICAkKSgwKCAvMixCJFAkMCAgJCkoMCggMzIsQiQoJDAgICQpKDAoIDcyLEInQCQwICAKK00kKSgwKCA7MihCJygkMCAgJCkoMCggPzIoQiZAJDAgICQpKDAoIEMyKEIkICQwICAkKSgwKCBHMihCLCgKK00kMCAgJCkoMCggSzIoQikoJDAgICQpKDAoIE8yKEIlQCQwICAkISwgICBDNCBGLlRVIihBKiEkICAhIDMKK00gICAwVSFJQEwtMFooOEAxICAgMCRQICAkLTAqOFEjNCpCJlAkMCAgJCEsICAhIzQiRik4VSJIQUYhJCAKK00gISAzICAgMFUgSUE+LTBKKC5AMSAgIDAkUCAgJC0wMjgzIzQsQilIJDAgICQhLCAgISM0JEYkKFUjKEIKK00sISQgICEgMyAgIDBVISlBWC0wUig1QDEgICAwJFAgICQtMCI4PEM0KEIlICQwICAkISwgICEjNCBGJkAKK01VIihBLiEkICAhIDMgICAwVSApQSAtMEIoQkAxICAgMCRQICAkLTAiOFBDNChCJkgkMCAgJCEsICAhIzQKK00gRikoVSIoQUQhJCAgISAzICAgMFUgKUE4LTBCKC4gMSAgIDAkUCAgJC0wIjgyQzQoQilAJDAgICQhLCAKK00gISM0JkYmKFUjSEEkISQgICEgNSAgIDBEQSpDJC0oQigvQDEgICAwJTAgICQpKDJIRUMyKEIjOCQwICAKK00kITQgICEiMiRKJVhUQihBUCEkICAhIDUgICAwREEqQSwtKEIoNyAxICAgMCUwICAkKSgySDBDMihCJTAKK00kMCAgJCE0ICAhIjIkSidAVEIoQyAhJCAgISA1ICAgMERBKkFSLShCKEUgMSAgIDAlMCAgJCkoMkg6IzIKK00oQihAJDAgICQhNCAgISIyJEokIFRCKEEyISQgICEgNSAgIDBEQSpDIi0oQigvIDEgICAwJTAgICQpKDIKK01IREMyKEIjMCQwICAkITQgICEiMiRKJUBUQihBTiEkICAhIDUgICAwREEqQSotKEIoNkAxICAgMCUwICAKK00kKSgySDhDMihCJzgkMCAgJCkoMCggKzIoQiMoJDAgICQpKDAoICsyKEIoWCQwICAkKSgwKCAnMihCJzAKK00kMCAgJCkoMCggJzIoQidIJDAgICQhLCAgISM0IEYpIFUiKEI8ISQgICEgMyAgIDBVISlBKC0wUig4IiEKK01RXiAoQD5AICApV0NPWSAxICAgMFUgKEMoKCJCT19cMkAgIC1EQShDKC0gIjggMiBIQiAgIEggICI5MDAKK00oICI2IEYgJERBIEAgKSgiOCAzMCBEICtAKihAICEqX19fVjQgSiAhREkqICAgMiAgIEgxICAgMEhBKEMKK00oKiRKOCArMCEgIDFHXCggICogJC9fUiBJIiAgLStfX189ICQgISYhUV4gKEA+QCAgKVdDT1kgMSAgIDAKK01UQChDJygiQjggICJAICApSCEoQyctICQgICI/UEAgIEggMEAhLSAkICAiIEhCICAkS19fXlAkICAgIDEKK00gICApRCEoQkIkICAhRTYyJCIgIEA8P0AiKCdIICAiPVhbXjAkUCAgJC0gIjgrUiBIQiAgJEggICEpIDAKK00oICVfX19fR1QiKUBPKCcnWCBCIVogICAgICAgICAgIDAmUCAgIDI2X19fX1EgICAwJ0AgICBGNl9fX18KK01NICAgMCgwICAgNjZfX19fSyAgIDApICAgJFY2X19fXzMgICAgIDQgICAgNiAgICAyQCAgICAgICAgICAKK00gICAgJiAgICAgSCAgICA3ICAgICEgICAgIUQgICAgKSAgICA1MCAgICBUICAgIEEgICAgKEAgICAiVCAKK00gICBHICAgIDFfX19fX1wgICAgICAgICAtQCAgICAjX19fX18gICAgICAgICAkJCAgICAgICAgICFAICAKK00gI1ggICAgIiAgICAlMCAgICBQICAgIFIgICAgKkAgICAgICAgICBLICAgICxQICAgIjAgICAgVSAgICAKK00hUCAgICIwICAgICEgICAgKCAgICAgLCAgICA6ICAgICIgICAgI0AgICAgKyAgICAsICAgICBYICAgIDwKK00gICAgI1AgICAhTCAgICAwICAgICkwICAgISQgICAgPSAgICAkQCAgICFYICAgIDMgICAgJ1AgICAhMCAKK00gICBZICAgICUwICAgIiggICAgNiAgICAqUCAgICE8ICAgISYgICAgJiAgICAiLCAgICA5ICAgICwwICAKK00gIUggICAgRyAgICAmUCAgICI4ICAgIDwgICAgKiAgICAhVCAgICBKICAgICdAICAgIkQgICAgPyAgICAKK00vUCAgICIgICAgISEgICAgKDAgICAiUCAgICBDICAgICtQICAgIjQgICAgTiAgICApQCAgICAgICAgIEgKK00gICAgICAgICAiRCAgICBbICAgICsgICAgIzggICAgTSAgICAtUCAgICJYICAgIFQgICAgK1AgICAjVCAKK00gICBQICAgIC5AICAgIyQgICAhLyAgICAsQCAgICAgICAgIFMgICAgMEAgICAjMCAgICAgICAgIC0wICAKK00gJDQgICAgVyAgICAvICAgICNAICAgISAgICAgLjAgICAgICAgICBaICAgICAgICAgI0wgICAhNCAgICAKK00vICAgICUoICAgIF0gICAgMFAgICAjWCAgICEkICAgIC9QICAgJEQgICAhICAgICAyICAgICQoICAgICAKK00gICAgMFAgICAgICAgICEkICAgIDMwICAgJDQgICAhKiAgICAxQCAgICRQICAgIScgICAgMlAgICAkQCAKK00gICEwICAgIDIwICAgJFggICAhKyAgICA0MCAgICRQICAgITMgICAgMzAgICAgICAgICEuICAgICAgICAKK00gJFwgICAgICAgICA0ICAgICAgICAgITEgICAgICAgICAlKCAgICAgICAgIDRQICAgICAgICAgICEwICcKK01DICAgLFtAICAgICchUCAmWDAgIDAsQCAgICAuIjAgJVMgICAwUkAgICAgMyEwICUjQCAgKCIgICAgIDkKK00gMCAjOEAgICAgICAgICBFIDAgJlhAICAgICAgICAgTCEwICM/QCAgKFtAICAgIFIhUCAlPEAgIDAqICAKK00gICBbIVAgJy4wICAwICAgICAhJSAwICNIICAgICAgICAgISshMCAgXFAgIChRUCAgICE+ITAgJ0tQICAKK00oUEAgICAhSiIwICdTUCAgMCxAICAgIVMhMCAiQFAgIChPMCAgICIqIjAgJl0gICAwLSAgICAiQSIwICMKK01eQCAgMC1AICAgIlgiMCAnM1AgIDAuICAgICMvIjAgJDowICAwLkAgICAjRiIwICJLQCAgMC8gICAgI1YKK00iMCAoNEAgIDAvQCAgICQmIjAgJkAgICAwMCAgICAkNiIwICAzICAgMDBAICAgJEYiMCAgTjAgIDAxICAKK00gICRWIjAgJ1FAICAwMiAgICAkXyIwICZSICAgMDJAICAgJSgiMCAnRkAgIDAzICAgICUxITAgJERQICAKK00oVUAgICAlRSEwICc7UCAgKEowICAgJVkiMCAiIFAgIDAzQCAgICYtITAgIFNQICAoVDAgICAmOiEwICMKK01KUCAgKEkgICAgJkciMCAmVzAgIDA0ICAgICZUITAgJElAICApVFAgICAmXCIwIChBICAgMDRAICAgJzQKK00iMCAmJSAgIDA1ICAgICdMIjAgJShQICAwNUAgICAoJCIwICRWMCAgMDYgICAgKDUiMCAiXUAgIDA2QCAKK00gIChGIjAgJilAICAwNyAgICAoVyIwICQ5QCAgMDdAICAgKSgiMCAnKCAgIDA4ICAgICkyIjAgJTpQICAKK00wOEAgICApPCEwICRRMCAgKFMgICAgKVEhMCAkPVAgIChOICAgIComIjAgIEkwICAwOSAgICAqOyIwICYKK003MCAgMDlAICAgKlAhMCAlKVAgIChYMCAgICpeITAgJUMwICAoTFAgICArLCIwICgxICAgMDogICAgKzoKK00iMCAhTlAgIDA6QCAgICtIIjAgJzxQICAwOyAgICArViIwICdQQCAgMDtAICAgLC8iMCAkUiAgIDA8ICAKK00gICxIIjAgJ1wgICAwPEAgICAsTyIwICJeICAgMD0gICAgLFoiMCAnMSAgIDA9QCAgIC0sIjAgIVZAICAKK00wPiAgICAtPiIwICRHQCAgMD5AICAgLUciMCAnKlAgIDA/ICAgIC1SIjAgJysgICAwQEAgICAtXSEwICMKK01GMCAgKFZQICAgLjMhMCAmPTAgIChLQCAgIC5JIjAgI1NAICAwQiAgICAuXyIwICEiMCAgMEJAICAgLzUKK00iMCAgOzAgIDBDICAgIC9LIjAgIj1QICAwQ0AgICAvVyIwICcxMCAgMEQgICAgL18hMCAkRzAgIChZUCAKK00gIDAuIjAgKDgwICAwREAgICAwPSIwICVeQCAgMEUgICAgMEwiMCAnW0AgIDBFQCAgIDBbIjAgIVMwICAKK00wRiAgICAxKiIwICJGMCAgMEZAICAgMTkiMCAnQTAgIDBHICAgIDFBIjAgJ0sgICAwUCAgICAxWyIwICcKK01OMCAgMFBAICAgMiMiMCAnMUAgIDBRICAgIDIrIDAgJj0gICAgICAgICAyNCFQICJGICAgMCwgICAgMkYKK00iMCAnPDAgIDBRQCAgIDJVIjAgIlRQICAwUiAgICAzJCEwICY+MCAgKVAgICAgMzchMCAmQjAgIClIQCAKK00gIDNKIVAgJUggICAwK0E/OTcxRT4nMCA3VjVEODcxQSAlXUU7RjAgPFcxQTxHMCA8VzFBPEcxPzlGUU8KK004NzAgN1VdRT4mRVQgJV1NODZFTiAlXUU7RzlJPEZdTiAlXT8xJUUuMDRVKTBQIT85N0FJPSAhPz1FXVMKK006Nj1OOTYxPzo2WVQ3VjlVO0YsIDdXOT86NllUN1Y5VTtGLCA3VyFSOjZVQTxHRCA3Vzk/PTZZUzo2PU4KK005NjE/PFZBTzxHMT85RzVOOFAhPz1FXVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIgJV1WN1ctSTlWWUUKK005JV1DOiYlUjdXIU86NllUOTcoIDdXOT89NllTOjY9Tjk2MT87Jl1OOVVdQTxHKUE+MCE/PUVdVTtHLUkKK005VllFOSVdQzomJVI3ViVSPEYlWSAlXVY3VlFPO0Y9PzwmXUk7RzFFPEAhPz1FXUM6JiVSN1chTzo2WVQKK005NyggN1c5Pz02WVM6Nj1OOTYxPzo2WVQgJV1WN1ctSTlWWUU5JV1TOiZdUj0gIT89RV1EO1c1QjsmNT8KK004NylSODdEIDdXOT89NllJO1ZYIDdXOT85RlFPODcwIDdXOT88VkFPPEcwIDdXOT88VkVHO0Y1RDdWUU8KK007Rj0/OUc1TjhQIT89RV1TOjY9Tjk2MT84VkFBPEVdRj02WUMgJV1WN1ctSTlWWUU5JV1JO0cxPzg3KVIKK004N0QgN1c5PzsmXU45VV1GPTZZQyAlXVY3Vi1IODcpPzlHNU44UCE/PUVdSTtHMT84NylSODdEIDdVXT8KK007NiVJO0AhPz1FXVU7Ry1JOVZZRTklXUk7RzE/PCZdSTtHMUU8QCE/PUVdUzo2PU45NjE/PFZBTzxHMT8KK008Jl1JO0cxRTxAIT89RV1VO0ctSTlWWUU5JV1TOiZdUj0lXUE8RylBPjAhPz1FXVU7Ry1JOVZZRTklXUwKK007VllHICVdVjdWOUw7ViVUN1chTzo2WVQ5NyggN1c5PzxWQU88RzE/PCZdSTtHMUU8QCE/PUVdVTtHLUkKK005VllFOSVdQzomJVIgJV1WN1c1Tjo2XU4sQCE/PUVdRDtXNUI7JjQgN1c5Pz02WVM6Nj1OOTYxPzo2WVQKK003VjlVO0YsIDdXOT88VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCA3Vzk/PFZFRztGNUQ3VlFPO0Y9Pzg3KVIKK004N0QgN1c5PzxWRUc7RjVEN1YtSDg3KT84NylSODdEIDdXOT85RlFPODcxPzlHNU44UCE/PUVdUzomXVIKK009JV1GPTZZQyAlXVY3Vy1JOVZZRTklXUk7RzAgN1c5PzsmXU45VV1BPEcpQT4wIT89RV1DOiYlUjdWJVIKK008RiVZICVdVjdXNU48VkVHO0Y1RDdWUU87Rj0/PCZdSTtHMUU8QCE/PUVdVTtHLUk5VllFOSVdQzomJVIKK003VyFPOjZZVDk3KCA3Vzk/OjZZVCAlXVM8Jl1SPSctQzg3KCA3Vzk/OSZdVThGUUU3VyFPOjZZVDk3KCAKK003Vzk/PTZZUzo2PU45NjE/PFZBTzxHMCA3Vi1MPTZZSzk3KCA3Vzk/PFcxUj02LVQsMCE/PUVdUz0nKVUKK004VzBSICVdVjdXNU48VkVHO0Y1RDdWUU87Rj0/OUc1TjhQIT89RV1VO0ctSTlWWUU5JV1DOiYlUjdWOVUKK007RiwgN1c5PzxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAlXVY3VzVOPFZFRztGNUQ3VkVOPSVdQTxHKUEKK00+MCE/PUVdUzo2PU45NjE/PFZBTzxHMT84NylSODdEIDdWWU87RyFSOjZVQTxHRCA3Vy0/OyZFTjpQIT8KK009RV1EO1c1QjsmNT85RzVOOFAhPz1FXVM6Nj1OOTYxPzsmXU45UCE/PUVdSTtHMT88Jl1JO0cxRTxAIT8KK009RV1TOjY9Tjk2MT84VkFBPEAhPz1FXUY7Jl1BPSVdQTxHKUE+MCE/PUVdUzomXVI9JV1BPEcpQT4wIT8KK009NV1MOjZZSyAlXVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoIDdXOT87Jl1OOVAhPz1FXUMKK006JiVSICVdTztFXUU+JkVUICVdPzk3QUk9JV1EPTZVTT41XUQ5Ni1MICVdPzdULTQzVSk/MyRFMzUlXT8KK00gJV0/N1QxNDNVKT8zJEUzNSVdPyAlXT83VjFPN1Y9TDtWKUE7JV1DPSZdUjxQIT83VV1EO1VdRzsmXUIKK004NlE/OScxTzxHLCA3VV1FPiZFVDdWMVU7NlVZN1cpRTlAICAgICAgICJdVTxXKE87Jl1DODZQTzsmRUIKK00rVj1DOFJVTDo2KE88VzVOLSJcUitDJE8uQl1VPFcoTzsmXUM4NlBPOyZFQitQICAgICAgICAgICAgIDMKK01EKCAgICAgICAwICYgICAgICYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgIyAgISAjICAgMCIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKK01AICAgJFRAICAkITwgICEgOCAgICFXQCAgID5IICAgKjYgICAgICAgICAgNSAgIC4yICAgITAgICAiICAKK00gICAgLyAgIDAgICMgICAgQDwhQCAgJCAgICI9WFteQD9fX19fICQgICAiPVhbXkA/X19fXjAkICAgJj0KK01YW15AP19fX11AJCAgICo9WFteQD9fX19cUCQgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAkIUkKK00gICAgICAgICAgISBQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgMCYgICAgICAhICAgICAgIFgkICAgICAgIEAoICAgICE0JCAgICAgICBCRCAgICAhVCQKK00gICAgICAgQkQgICAgIlFEICAgICAgIEJEICAgICU1RCAgICAgICBCRCAgICAlViAgICAgICAgICAgICAKK00gJ14gICAgICAgICAgICAgICkmICAgICAgICAgICAgICArQiAgICAgICAgICAgICAgLSYgICAgICAgICAKK00gICAgIC5eICAgICAgICAgICAgICAwViAgICAgICAgICAgICAgMj4gICAgICAgICAgICAgIDRGICAgICAKK00gICAgICAgICA2UiAgICAgICAgICAgICAgOEYgICAgICAgICAgICAgIDo2ICAgICAgICAgICAgICA7PiAKK00gICAgICAgICAgICAgPEogICAgICAgICAgICAgID4qICAgICAgICAgICAgICA+WiAgICAgICAgICAgICAKK00gSEIgICAgICAgICAgICAgICAhJCAgIVkgICBCRCAgICAgISQgICFZICAgQkUgICAgICEkICAhWSAgIEIKK01HICAgIFFIRCAgICAgICBCRCAgICAgISQgICFaICAgQkkgICAgICEkICAhWiAgIEJKICAgICAhJCAgIVoKK00gICBCTCAgICBSREQgICAgICAgQkkgICAgICEkICAhWyAgIEJOICAgICAhJCAgIVsgICBCTyAgICAgISQKK00gICFbICAgQlEgICAgVCBEICAgICAgIEJOICAgICAhJCAgIV0gICBCUyAgICAgISQgICFdICAgQlQgICAKK00gICEkICAhXSAgIEJWICAgIFVERCAgICAgICBCUyAgICAgISQgICFeICAgQlggICAgICEkICAhXiAgIEIKK01ZICAgICAhJCAgIV4gICBCWyAgICBWREQgICAgICAgQlggICAgICEkICAhXyAgIEJdICAgICAhJCAgIV8KK00gICBCXiAgICAgISQgICFfICAgQyAgICAgWCBEICAgICAgIEJdICAgICAhJCAgIiEgICBDIiAgICAgISQKK00gICIhICAgQyMgICAgICEkICAiISAgIEMlICAgIFlERCAgICAgICBDIiAgICAgISQgICIiICAgQycgICAKK00gICEkICAiIiAgIEMoICAgICAhJCAgIiIgICBDKiAgICBaPEQgICAgICAgQycgICAgICEkICAiIyAgIEMKK00sICAgICAhJCAgIiMgICBDLSAgICAgISQgICIjICAgQy8gICAgW1BEICAgICAgIEMsICAgICAhJCAgIiUKK00gICBDMSAgICAgISQgICIlICAgQzIgICAgICEkICAiJSAgIEM0ICAgIF0sRCAgICAgICBDMSAgICAgISQKK00gICImICAgQzYgICAgICEkICAiJiAgIEM3ICAgICAhJCAgIiYgICBDOSAgICBeKEQgICAgICAgQzYgICAKK00gICEkICAiJyAgIEM7ICAgICAhJCAgIicgICBDPCAgICAgISQgICInICAgQz4gICAgX0BEICAgICAgIEMKK007ICAgICAhJCAgIikgICBDQSAgICAgISQgICIpICAgQ0IgICAgICEkICAiKSAgIENFICAgISEgRCAgICAKK00gICBDQSAgICAgISQgICIqICAgQ0cgICAgICEkICAiKiAgIENIICAgICAhJCAgIiogICBDSyAgICEiJEQKK00gICAgICAgQ0cgICAhIy4gICAgICAgICAgICAgISleICAgICAgICAgICAgICEtXiAgICAgICAgICAgICAKK00hMDogICAgICAgICAgICAgITIqICAgICAgICAgICAgICE0IiAgICAgICAgICAgICAhNVIgICAgICAgICAKK00gICAgITZGICAgICAgICAgICAgICAgISQgICJSICAgQ04gICAgICEkICAiVSAgIENRICAgICAhJCAgIlYKK00gICBDUyAgICAgISQgICJXICAgQ1YgICAgICEkICAiWSAgIENZICAgICAhJCAgIlogICBDXCAgICAgISQKK00gICJbICAgQ18gICAgICEkICAiXSAgIEQiICAgICAhJCAgIl4gICBEJSAgICAgISQgICJfICAgRCggICAKK00gICEkICAjISAgIEQrICAgICAhJCAgIyIgICBELiAgICAgISQgICMjICAgRDEgICAgICEkICAjJSAgIEQKK000ICAgICAhJCAgIyYgICBEOCAgICAgISQgICMpICAgRDwgICAgICEkICAjKiAgIERAICAgICAhJCAgIysKK00gICBERCAgICAgISQgICMtICAgREggICAgICEkICAjLiAgIERMICAgICAhJCAgIy8gICBEUCAgICAgISQKK00gICMxICAgRFQgICAgICEkICAjMiAgIERYICAgICAhJCAgIzMgICBEXCAgICAgISQgICM1ICAgRSAgICAKK00gICEkICAjNiAgIEUkICAgICAhJCAgIzcgICBFKCAgICAgISQgICM5ICAgRSwgICAgICEkICAjOiAgIEUKK00wICAgICAhJCAgIzwgICBFNCAgICAgISQgICM9ICAgRTggICAgICEkICAjPiAgIEU8ICAgICAhJCAgI0AKK00gICBFQCAgICAgISQgICNBICAgRUQgICAgICEkICAjQiAgIEVIICAgICAhJCAgI0QgICBFTCAgICAgISQKK00gICNFICAgRVAgICAgICEkICAjRiAgIEVUICAgICAhJCAgI0ggICBFWCAgICAgISQgICNJICAgRVwgICAKK00gICEkICAjSiAgIEYgICAgICAhJCAgI0wgICBGJCAgICAgISQgICNNICAgRiggICAgICEkICAjTyAgIEYKK00sICAgICAhJCAgI1AgICBGLyAgICAgISQgICNRICAgRjIgICAgICEkICAjUiAgIEY1ICAgICAhJCAgI1QKK00gICBGOCAgICAgISQgICNWICAgRjwgICAgICEkICAjVyAgIEZAICAgICAhJCAgI1cgICBGQCAgICE5OEQKK00gICAgICAgQ04gICAhOVhAICAgICAgICAgICAgITpAQCAgICAgICAgICAgICE7SEAgICAgICAgICAgICAKK00hPFhAICAgICAgICAgICAgIT1EQCAgICAgICAgICAgICE+TEAgICAgICAgICAgICAhP1xAICAgICAgICAKK00gICAgIUBAQCAgICAgICAgICAgICFBQEAgICAgICAgICAgICAhQkhAICAgICAgICAgICAgIUMwQCAgICAKK00gICAgICAgICFENEAgICAgICAgICAgICAhRUBAICAgICAgICAgICAgIUYwQCAgICAgICAgICAgICFHJEAKK00gICAgICAgICAgICAhSFBAICAgICAgICAgICAgIUpcQCAgICAgICAgICAgICFNMEAgICAgICAgICAgICAKK00hTyBAICAgICAgICAgICAgIVBEQCAgICAgICAgICAgICFSWEAgICAgICAgICAgICAhVEBAICAgICAgICAKK00gICAgIVVcQCAgICAgICAgICAgICFYKEAgICAgICAgICAgICAhWVRAICAgICAgICAgICAgIVs0QCAgICAKK00gICAgICAgICFdREAgICAgICAgICAgICAhXzhAICAgICAgICAgICAgIiEwQCAgICAgICAgICAgICIiSEAKK00gICAgICAgICAgICAiJEBAICAgICAgICAgICAgIiZAQCAgICAgICAgICAgICInXEAgICAgICAgICAgICAKK00iKUhAICAgICAgICAgICAgIitIQCAgICAgICAgICAgICIsXEAgICAgICAgICAgICAiLkBAICAgICAgICAKK00gICAgIjA4QCAgICAgICAgICAgICIxUEAgICAgICAgICAgICAiMzhAICAgICAgICAgICAgIjU0QCAgICAKK00gICAgICAgICI2VEAgICAgICAgICAgICAiODhAICAgICAgICAgICAgIjkwQCAgICAgICAgICAgICJCXEAKK00gICAgICAgICAgICAiQ0xAICAgICAgICAgICAgIkxYQCAgICAgICAgICAgICJNREAgICAgICAgICAgICAKK00iTjBAICAgICAgICAgICAgIlBAQCAgICAgICAgICAgICJRPEAgICAgICAgICAgICAiUzRAICAgICAgICAKK00gICAgIlQsJCAgICAgICBGQiAgICJUUCQgICAgICAgRkIgICAiVUwmICAgICAgISBPICAgIlZJRCAgICAKK00gICBGQiAgICJXVUQgICAgICAgRkIgICAiWEYgICAgICAgICAgICAgIlpOICAgICAgICAgICAgICJbViAKK00gICAgICAgICAgICAiXjIgICAgICAgICAgICAgIl9WICAgICAgICAgICAgICMhTiAgICAgICAgICAgICAKK00jI0YgICAgICAgICAgICAgIyUuICAgICAgICAgICAgICMnNiAgICAgICAgICAgICAjKUIgICAgICAgICAKK00gICAgIys2ICAgICAgICAgICAgICMtJiAgICAgICAgICAgICAjLi4gICAgICAgICAgICAgIy86ICAgICAKK00gICAgICAgICMwWiAgICAgICAgICAgICAjMUogICAgICAgICAgICAgIzZOICAgICAgICAgICAgICM3QiAKK00gICAgICAgICAgICAjOCogICAgICAgICAgICAgIzhWICAgICAgICAgICAgICM7OiAgICAgICAgICAgICAKK00jPVIgICAgICAgICAgICAgIz8kRCAgICAgICBGQiAgICNAPEAgICAgICAgICAgICAjQVhEICAgICAgIEcKK00gICAgI0MwRCAgICAgICBHMyAgICNDXCQgICAgICAgRz4gICAjRDwkICAgICAgIEc+ICAgI0U5RCAgICAKK00gICBHPiAgICNGRUQgICAgICAgRz4gICAjRzYgICAgICAgICAgICAgI0k+ICAgICAgICAgICAgICNKRiAKK00gICAgICAgICAgICAjTSIgICAgICAgICAgICAgI05GICAgICAgICAgICAgICNQPiAgICAgICAgICAgICAKK00jUjYgICAgICAgICAgICAgI1NeICAgICAgICAgICAgICNWJiAgICAgICAgICAgICAjWDIgICAgICAgICAKK00gICAgI1omICAgICAgICAgICAgICNbViAgICAgICAgICAgICAjXF4gICAgICAgICAgICAgI14qICAgICAKK00gICAgICAgICNfSiAgICAgICAgICAgICAkIDogICAgICAgICAgICAgJCU+ICAgICAgICAgICAgICQmMiAKK00gICAgICAgICAgICAkJlogICAgICAgICAgICAgJCdGICAgICAgICAgICAgICQqKiAgICAgICAgICAgICAKK00kLEIgICAgICAgICAgICAgJC1UQCAgICAgICAgICAgICQvJEAgICAgICAgICAgICAkMFhAICAgICAgICAKK00gICAgJDIgJCAgICAgICBHPiAgICQyMUQgICAgICAgRz4gICAgICEkIC9fXyAgIEc+ICAgJDJMJSAgPiwKK00gICBTTiAgICQzKCcgIDtBICAhIFIgICAkM0QpICA3LCAgISMqICAgJDNYJSAgNC4gICBAKCAgICQ0MCUKK00gIC1eICAgQ04gICAkNEgnICA1UiAgISBIICAgJDUsJSAgI1MgICBDJyAgICQ2OCUgID5PICAgQyIgICAKK00kNygpICA/LyAgISBSICAgJDdMJSAgKiMgICBCXSAgICQ5KCkgIDtUICAhIFQgICAkOkQpICAvWiAgISAKK01WICAgJDwgKSAgPS8gICEgWCAgICQ9PCkgIDFJICAhIFogICAkPlgpICAqTiAgISBcICAgJD9YKSAgQTIKK00gICEgXiAgICRAWCkgIDogICAhISAgICAkQVgpICAhLCAgISEiICAgJEJYKSAgIlkgICEhJCAgICRDWCkKK00gID8mICAhISggICAkRDwpICA7KCAgISEqICAgJEUgKSAgPjogICEhLCAgICRFRCUgIDIzICAgQzYgICAKK00kRlQlICA9TyAgIEJJICAgJEgkKSAgKCMgICEhLiAgICRJNCUgICMvICAgQzEgICAkSiglICAuSyAgIEIKK01EICAgJEpcKSAgOz0gICEhMCAgICRLUCUgIDJGICAgRzMgICAkTDApICBCJCAgISEyICAgJE1QKSAgODQKK00gICEhNCAgICRPMCkgIDRDICAhITYgICAkUFApICAzOSAgISE4ICAgJFFUKSAgK1YgICEhOiAgICRSWCkKK00gIDhGICAhITwgICAkU1wpICAxRiAgISE+ICAgJFUgKSAgPEAgICEhQCAgICRVSCkgIDVLICAhIUIgICAKK00kVjAlICAzJSAgIEMsICAgJFdEJSAgMVcgICBCWCAgICRYWCkgICJFICAhIUQgICAkWiwpICA5PSAgISEKK01GICAgJFtAJSAgNEcgICBDQSAgICRcOCUgIDYtICAgQlMgICAkXTApICBBJCAgISFIICAgJF4oKSAgJlsKK00gICEhSiAgICRfICkgID1TICAhIUwgICAkX1gpICA/IiAgISFOICAgJSE8KSAgMyggICEhUCAgICUjICkKK00gID9QICAhIVIgICAlIzwpICArWCAgISFUICAgJSQoKSAgPSQgICEhViAgICUlMCkgICc6ICAhIVggICAKK00lJjgpICAyPiAgISFaICAgJSZcKSAgPEsgICEhXCAgICUnSCkgIDxMICAhIiIgICAlKDQlICAuOSAgIEMKK007ICAgJSlMJSAgOVUgICBCTiAgICUrJCkgIC8uICAhIiggICAlLDwpICAkKSAgISIqICAgJS1UKSAgIU0KK00gICEiLCAgICUvLCkgIClXICAhIi4gICAlL1wpICA9JSAgISIwICAgJTA8JSAgMj0gICBDRyAgICUxOCkKK00gIEFBICAhIjIgICAlMjQpICA3WiAgISI0ICAgJTMwKSAgP04gICEiNiAgICU0LCkgICctICAhIjggICAKK00lNSgpICAqOSAgISI6ICAgJTYkKSAgPiUgICEiPCAgICU2RCkgID5MICAhIyAgICAlOCwpICA+WSAgISMKK00iICAgJThMKSAgPSYgICEjJCAgICU5LCcgICo4ICAhIFAgICAlOjQpICA9USAgISMmICAgJTswKSAgKzMKK00gICEjKCAgICU8LCUgIDlZICAgRyAgICAlPTglICA6KSAgIEZCICAgJT5EJyAgNkAgICEgTiAgICU/ST8KK003VDE5M0QlLTI0LCA4VylULCJZTyAmPUQ4RlVFK0ZcIDlWLUMsRV1DO1ZVUDo2UUU5IlggK1ZBTzs2NE8KK005VllVK1Y9RDhCXVc7VylLK1ZZRT1SXUQ5NzlPK1Y9RDhHMUU8VzBPPSMkUCtQIUc5JilNOTJZQyAmRU4KK009I0lULDNVUiwzTE0sQyRULVMwWCxTOFQuI0xSLDMwVy0jQFMtQzBXLlAhQzomJVIuRzBSLzcoUi5TIFsKK00sMyhXLlAhTDtWWUcoJkVOPSNJVCxTVVIsM0xNLEMkVC1TMFgsUzhULiNMUiwzMFctI0BTLUMwVy5QIVUKK007Ry1JOVZZRTkiIUk7RzBaPSMwXTxDJFssI0xNLDNMIDsmXU45UiFVO0ctSTlWWUU5IiFJO0cwWj0jNF0KK008QyRbLCNMTSwzTCA8VkFPPEcwQDo2WVQuRzBWLzcoUS5SVFMsQzxWLiNMUyxDPFYtU0wgOyZdTjlSIUwKK007VllHKCZFTj0jSVQtU1VSLDNMUC5SVFEuUCFTOiZdUj0iIVU7Ry1JOVZZRTkiIUk7RzBaPSNAXTxDJFsKK00sI0xWLTM0Uy0zTCA7Jl1OOVIhTDtWWUcoJzVOPFZFRztGNUQoJkVOPSNJVC4zVVIsM0xQLlJUUS5QIVMKK006Nj1OOTYwQDhWQUE8Q0lULDMgXTxDJFsrMyRSLiNMUSxDPFsgJzVOPFZFRztGNUQoJi1IODcoWj0jJFEKK00vNyhRLlMgWyxDNFUuUCFGOyZdQT0jSVQsMyhdPEMkWy0jTFAuUCFEO1c1QjsmNFo9IyRTLzcoUS5TQFsKK00sI0wgOyZdTjlSIUQ7VzVCOyY0Wj0jJFQvNyhRLlNAWywjTCA9Rl1JOSNJVCwzNF0sMzQgPSVdUz0nKVUKK004VzBaNSMkVi83LFItJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVI9JV1NOTZVQjk3KFoKK00tQlBRLUJQUS1DTVY3VkVOPSVdTTk2VUI5NyhaLDJQUyxCUFMsQ01WN1ZRTztGPT87NjVNOEY1Ui5DLEwKK00tQzBMLFMoWz1FXUY7Jl1BPSVdTTk2VUI5NyhaLDMoTC4zOEwsUyhbPUVdRDtXNUI7JjU/OzY1TThGNVIKK00uQyRTKyMkUi4iUFYtI0xbICcxPz02WUk7VlhaNSMkVy83NFg9RV1DOiYlUjdWVUU7NilFPENIUisjIEwKK00uI01WN1ctSDtXKVQ3VlVFOzYpRTxDSFYrIyBMLDM4Wz1FXUk7RzE/OzY1TThGNVIuQyRMLCJQUyxDTVYKK003VlFPO0Y9Pzs2NU04RjVSLkMsTCwiUFMsQ01WN1Y5TDtWJVQ3VlVFOzYpRTxDSFEsQlBQKyMsUi5XOT8KK005Jl1VOEZRRTdWVUU7NilFPENIUSxSUFArIzhULlNMID1FXUM6JiVSN1Y5VTtGLFoxQyggPUVdUzo2PU4KK005NjE/OFZBQTxFXUY9NllDLkQ4USwgIVY3VzVOPFZFRztGNUQ3Vi1IODcpPzlHNU44U0kmLDMkID1FXVMKK006Jl1SPSVdRj02WUMuRDhWICc5PzxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsWjFDOCA9RV1VO0ctSTlWWUUKK005JV1TOiZdUj0lXUY9NllDLkQ4WCAnOT86NllUN1Y5VTtGLFoxQyQgPUVdUzo2PU45NjE/OjZZVDdWOVUKK007RixaMUMkID1FXVU7Ry1JOVZZRTklXUk7RzE/OUc1TjhTSSYtICFWN1ZRTztGPT85RzVOOFNJJixQIVYKK003Vy1JOVZZRTklXUw7VllHN1Y5VTtGLFoxQywgPUVdVTtHLUk5VllFOSVdTDtWWUc3VjlVO0YsWjFDNCAKK009RV1GOyZdQT0lXUY9NllDLkQ4USxAIVY3VjFPPTYpTDk1XUY9NllDLkQ4USxQIUw6NllLLkUwUS4jVVMKK00sMzRSO0Y1WD0jSFEuM1RKLDNATCwiUFMsQ01MOjZZSzlHNU44U0hSLCNUSixDJF05QyRZKyMsUisjLFIKK00uVy1UPTY5Ri5DKFIvNiVSLDNMUC5TIFssQyxdODcoUS5TIFssM0xSLSNVQTxDJFssI0xSLlMkVisjOFQKK00rIyRRLTMoWy5QIVQ9NV1MOjZZSy5FMFItM1VVLDMwVDtGNVg9I0hRLjJQUCsjLFIuVlFJO0ZNRj02WUMKK00uQyhQKyMgTCxTKFs8VzFVOUY4WixDKEwsIlBRLDM0Ui5TTCA4Vl1MO1cpUy5FMFItQ1VFPjY1TDsmXVcKK00uQyBMPCc1UjwmUUUuQyRMPCZFTjpTSFIrI0wgOFYlUjxTSTQsQzxdOTYpTT1TSFArJyFPPEctQzomNFoKK00sMlBbICYpTztWUUU4NlhaPSMoWC82NSYwNFEzMTNIUCslMTI1NDRaLDJQWyAmKVY4NlFTLkUwUi4zVUUKK005RiVMPFY0WiwiUVQ8RzVFLkMkTC5QIUI7Vl1MOTYlTixDSVQsQ0QgOzZFUztXKUQ5NylFOSNJNCxTIF0KK005NzFXO1NIUismXU45M0hRKydJRTxGXFosIlFUOicpRTkzSFMrI0wgOzYlSTtDSSYsMCFWN1YtSDg3KFoKK00xUyggPUVdUzo2PU45NjE/OFZBQTxDSScsMyAgPUVdVTtHLUk5VllFOSVdQzomJVIuRDxRLDAhVjdXLUgKK007VylULkQ8ViAnOT88VkVHO0Y1RDdXLUg7VylULkQ8ViAnOT89NllTOjY9Tjk2MT88VkFPPEcwWjFTQCAKK009RV1JO0cwWjFTJCA9RV1TOjY9Tjk2MT86NllULkQ8USAnOT89NllTOjY9Tjk2MT86NllULkQ8VCAnOT8KK007Jl1OOVNJJyxQIVY3Vy1JOVZZRTklXUw7VllHLkQ8UyAnOT89NllTOjY9Tjk2MT87Jl1OOVNJJy0wIVYKK003VjlMO1YlVC5EPFEsQCFWN1YxTz02KUw5M0knLDMsID1FXUM6JiVSN1YlUjxGJVkuRDxTLDNVQTxDJFsKK00sI0xRLlMoID1FXVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4zSScsUyhdODcoUS5TIFssM0xRLCAhVjdXNU4KK008VkVHO0Y1RDdWLUg4Nyk/ODcpUjg3RFoxUyxTLzYlUiwzTFAuUyRbLDMkID1FXVM6Jl1SPSVdQTxHKUEKK00+M0knLFMwXTg3KFEuUyBbLDNMViAnOT88VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkuRDxTLSAhVjdXNU4KK008VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkuRDxTLTNVQTxDJFssI0xRLlNAID1FXUk7RzE/ODcpUjg3RFoKK00xUyxWLzYlUiwzTFAuUyRbLDAhVjdXLUk5VllFOSVdSTtHMT84NylSODdEWjFTLFYgJzk/PTZZUzo2PU4KK005NjE/OjZZVDdWJVI8RiVZLkQ8Uy1TVUE8QyRbLCNMUS5TMCA9RV1MO1ZZRzdWJVI8RiVZLkQ8Uy4jVUEKK008QyRbLCNMUS5TLCA9RV1TOjY9Tjk2MT87Jl1OOVVdQTxHKUE+M0knLFNAID1FXVU7Ry1JOVZZRTklXUwKK007VllHN1YlUjxGJVkuRDxTLjNVQTxDJFssI0xRLlM0ID1FXUY7Jl1BPSVdQTxHKUE+M0knLSMgXTg3KFEKK00uUyBbLDNMUSxAIVY3VjFPPTYpTDk1XUE8RylBPjNJJy0jJF04NyhRLlMgWywzTFEsUCFWN1YtSDg3KT8KK008Jl1JO0cxRTxDSSctIyhdKkMoID1FXVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIuRDxULFNUSiwzICAKK009RV1VO0ctSTlWWUU5JV1DOiYlUjdXIU86NllUOTcoWjFTMFQvMkhRLDAhVjdXLUg7VylUN1chTzo2WVQKK005NyhaMVMwVS8ySFYgJzk/PFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoWjFTMFUgJzk/PTZZUzo2PU4KK005NjE/PFZBTzxHMT88Jl1JO0cxRTxDSSctIzhdKkNAID1FXUk7RzE/PCZdSTtHMUU8Q0knLSM8XSpDJCAKK009RV1TOjY9Tjk2MT86NllUN1chTzo2WVQ5NyhaMVMwVyAnOT89NllTOjY9Tjk2MT86NllUN1chTzo2WVQKK005NyhaMVMwWC8ySFQgJzk/OyZdTjlVXVA7VkVOPSY1Ui5EPFQuM1RKLFAhVjdXLUk5VllFOSVdTDtWWUcKK003VyFPOjZZVDk3KFoxUzBZICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIuRDxVLCNUSi0wIVYKK003VjlMO1YlVDdXIU86NllUOTcoWjFTNFEvMkhRLEAhVjdWMU89NilMOTVdUDtWRU49JjVSLkQ8VSxDVEoKK00sMywgPUVdUz0nKVU4VzBRLkQ8US1AIVY3Vy1UPEc1Qz0jKFoxUzRTLzcsUi0nOT84VkFBPEVdTTk2VUIKK005NyhaLEJQUCsjQFs9RV1TOiZdUj0lXU05NlVCOTcoWi1CUFEtQlBRLUNNVjdWRU49JV1NOTZVQjk3KFoKK00sMlBTLEJQUyxDTVY3VlFPO0Y9Pzs2NU04RjVSLkMsTC1DMEwsUyhbPUVdRjsmXUE9JV1NOTZVQjk3KFoKK00sMyhMLjM4TCxTKFs9RV1EO1c1QjsmNT87NjVNOEY1Ui5DJFMrIyRSLiJQVi0jTFsgJzk/PTZZSTtWWFoKK00xUyRXICc5Pz02WUk7VlhSLkQ8VS0jVVUuJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVIKK009JV1NOTZVQjk3KFotQlBQKyMkVi5XOT86NllUN1ZVRTs2KUU8Q0hRKyMgTCxTKFs9RV1MO1ZZRzdWVUUKK007NilFPENIUysjIEwsUyhbPUVdRjsmXUE9JV1NOTZVQjk3KFosMyhMLCJQUyxDTVY3VjFPPTYpTDk1XU0KK005NlVCOTcoWiwzLEwsIlBWLSNMWyAnLT87JkVOOlNJJywzRCA9NV1MOjZZSy5EPFItMCFQPEZFTTg3KVkKK00uRDxVLTNVRTxGNUQuQyBMOVcpRTk2WFosMlFCOyc1RS5DKEwuUCFOO1ZZUDxGRU04NylZLkQ8Ui1AIUMKK007JzVOOlY1Ui5EPFUtQ1VFOFZBRT1HRFosIlFGO1cpRC5DJEwuUCFTPCZdUj0nLUM4NyhaMVMoVyAlXT8KK007NiVJO0JZTyAmPUM4Uyk/OFZdTTwmRUw5NjBOICVdSTtGRVQ6NiVMOjdJRTkiWFAgIl1HO0c0TzlWLUMKK00rVj1DOFMoTzxXKUMrUCBOK1ZRSThGPUM4UyhOOFAhSTtHMFo9IyRdPEMkWyszKFEtIzxULiMsVi0jQFsKK00sQyRULVMwWCxTOFQtU0wgOFZBQTxDSVQsQ1VSLENMUC5TJFItU0wgOyZdTjlSIUk7RzBaPSMsXTxDJFsKK00rMyhRLSM8VC4jLFYtI0BbLEMkVC1TMFgsUzhULVNMID02WVM6Nj1OOTYwQDo2WVQuRzBULzcoUS5TIFsKK00rMyRbICZRTztGPEA9NllTOjY9Tjk2MEA6NllULkcwVS83KFEuUyBbKzMkWyAnLUg7VylUKCZFTj0jSVQKK00tQ1VSLDNMTSxTKFctQ0BbLFMoVy1DPFsgJlFPO0Y8QDsmXU45UiFJO0cwWj0jPF08QyRbLCNMTSwzTCAKK008VkFPPEcwQD02WVM6Nj1OOTYwQDo2WVQuRzBYLzcoUS5TIFstQzRVLFM0WyAmUU87RjxAOyZdTjlSIVUKK007Ry1JOVZZRTkiIUk7RzBaPSNEXTxDJFssI0xNLDNMIDxWRUc7RjVEKCYtSDg3KFo9IyRQLzcoUS5SVFEKK00sQ0BbLDMoVy5QIVU7Ry1JOVZZRTkiIUM6JiVSLkcwUSwzVVIsM0xQLlMoVS0zTCA5RlFPODcwWj0jJFIKK00vNyhRLlMwWywjTCA5Jl1VOEZRRS5HMFEsU1VSLDNMWC5TIFsgJlFPO0Y8QDkmXVU4RlFFLkcwUS0jVVIKK00sM0xYLlMgWyAnOU86NjBaPSMkVS8zJFUgJylFOVVdQzsmJVM8U0k0LDM4XTk0WS83VSklMVUsWiwiUScKK00xNFklNEQlLDdVKSUxVSxaLDJRJjQlXTIxND0zLkMoTDA0USw3VSklMVUsWixSUSwyNFU/NEQ1JzdULSwKK00wNS0zMTUsWi0iUFsgJyFUPEYxSTlGOT89I0lULDAhUzo3SUU3VzBaPSMkID1WLUg4Nyk/PSNJVC4gIUwKK007VllHOyZdTjlTSTQsMzxdPFNBSDo2PUguQyxMLCJQUyxDTUw7VzxaLFJQUyxCUFMsQ0xbICZRTztGPT8KK007Jl1OOVNJVCwzQF09M0FTLkMkVysjIEwtQzBbOyZQWi1SUFArIzhULlNMIDlHNU44VV1QPScoWj0jJFkKK00vMkhSLCNVRiwzNCA3VV1EO1VdRzsmXUI4NlE/OScxTzxHLFoxQyRVICVdRT4mRVQ3VjFVOzZVWTdXKUUKK005Q0knLEMkXSpDJCA3VV1EO1VdRzsmXUI4NlE/OFcxTzxHLFoxQyRVICVdPzs2JUk7Q0kmLDM0IDdWNVgKK006NzBOO1AhRzhWLFI3Vi1POzchSTsmNUQrQCBPOVZZVStWPUM4Ul1HOFYsUitXLVI4UlwgK0JdTDo2KUcKK004VixSK0YsIDo2WVQuRzBRLzcoUS5SVFIsMzBXLSNAUy1DMFguUyhRLSM8VC4jLFYtIzxbICYtSDg3KFoKK009IyhdPEMoWywjTFEsQzxbICZRTztGPEA6NllULkcwUy83KFEuUlRSLDMwVy0jQFMtQzBYLlMoUS0jPFQKK00uIyxWLSM8WyAnNU48VkVHO0Y1RCgmRU49I0lULSNVUiwzTFAuUlRRLlAhTDtWWUcoJzVOPFZFRztGNUQKK00oJkVOPSNJVC0zVVIsM0xQLlJUUS5QIVM6Jl1SPSIhSTtHMFo9IzhdPEMkWyszLFItUzhYLlMsUi1TOFcKK00uUCFMO1ZZRygmUU87RjxAOjZZVC5HMFcvNyhRLlMgWyszJFsgJy1IO1cpVCgnNU48VkVHO0Y1RCgmRU4KK009I0lULiNVUiwzTFAuUzhVLTMsVS5QIUw7VllHKCZRTztGPEA9NllTOjY9Tjk2MEA6NllULkcwWS83KFEKK00uUyBbKzMkWyAnLUk5VllFOSIhQzomJVIuRzBRLCNVUiwzTE0sMyhYLlMkUi1TTCA9NllTOjY9Tjk2MEAKK004VkFBPENJVCwzJF08QyRbLCNMUi0zNFsgJjlMO1YlVC5HMFEsQ1VSLDNMVC5TIFsgJjFPPTYpTDkzSVQKK00sMyxdPEMkWy4jTFAuUCFMO1ZZRygmMU89NilMOTNJVCwzMF08QyRbLiNMUC5QIVY7VkVELkcwUS0zVFEKK00tMCFSOTY9PzhWUUE8VyxaNSMkVi82NS4zVV0yMTQ9My5DIEwxVDUuMTUpITMlXTIxND0zLkMkTDFFIT8KK000RDUnNFNIUiskJSwzJV0yMTQ9My5DLEwzJEUtN1UpJTFVXSMzJCUzNFQ1My5DMEwuUCFQPScpRDo2OUYKK003VzBaPSMkIDxWRVo5NV1ULkcwUSAnPUM6JiVSN1cwWj0jQCA7Jl1OOVZRTztGPFo1IyRXLzcsWDomRUcKK006I0hTKyMgTCxTKFs7Jl1XLkMsTCxTKEwsUyhbLlAhTDtWWUc3VlFPO0Y8Wj0jJFgvNzRYPFNIUS1SUFAKK00rIzhULlZRTC5DPEwsIlBWLSNMWyAmOVU7Ri0/PCcxUi5HMFEuM1RKLEMgXTlDJFUgJV1FPiZFVDdWMVUKK007NlVZN1YxRThWUFoxUyQgN1VdIzUkXTI3VFEpNFUxPzdTSScsQyRdODcoUS5TIFssM0xRLjAhPzdUMTQKK00zVSk/MyRFMzUlXT8uRDxSLDAgTTsmPCA7JkVCOVJZUyAlXUU9JjVYPSAhPzk2MUE9JiQgN1Y1TjkgIVMKK009JiVSPSAhPzs2JUk7QCE/OTZZVjo3KU87QCE/PUVdUzo2PU45NjE/OjZZVDdWOVU7RiwgN1c5Pzo2WVQKK003VjlVO0YsIDdXIVI6NlVBPEdEIDdXOT89NllTOjY9Tjk2MT88VkFPPEcxPzlHNU44UCE/PUVdUzo2PU4KK005NjE/OyZdTjlVXVA7VkVOPSY1UiAlXVY3Vy1JOVZZRTklXUM6JiVSN1chTzo2WVQ5NyggN1c5Pz02WVMKK006Nj1OOTYxPzsmXU45VV1BPEcpQT4wIT89RV1VO0ctSTlWWUU5JV1DOiYlUjdWJVI8RiVZICVdVjdWUU8KK007Rj0/PCZdSTtHMUU8QCE/PUVdQzomJVI3VyFPOjZZVDk3KCA3Vzk/PTZZUzo2PU45NjE/OjZZVCAlXVYKK003Vy1JOVZZRTklXVM6Jl1SPSAhPz1FXUQ7VzVCOyY1Pzg3KVI4N0QgN1c5Pz02WUk7VlggN1c5PzlGUU8KK004NzAgN1c5PzxWQU88RzAgN1c5PzxWRUc7RjVEN1ZRTztGPT85RzVOOFAhPz1FXVM6Nj1OOTYxPzhWQUEKK008RV1GPTZZQyAlXVY3Vy1JOVZZRTklXUk7RzE/ODcpUjg3RCA3Vzk/OyZdTjlVXUY9NllDICVdVjdWLUgKK004Nyk/OUc1TjhQIT89RV1JO0cxPzg3KVI4N0QgN1VdPzs2JUk7QCE/PUVdVTtHLUk5VllFOSVdSTtHMT8KK008Jl1JO0cxRTxAIT89RV1TOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPEAhPz1FXVU7Ry1JOVZZRTklXVMKK006Jl1SPSVdQTxHKUE+MCE/PUVdVTtHLUk5VllFOSVdTDtWWUcgJV1WN1Y5TDtWJVQ3VyFPOjZZVDk3KCAKK003Vzk/PFZBTzxHMT88Jl1JO0cxRTxAIT89RV1VO0ctSTlWWUU5JV1DOiYlUiAlXVY3VzVOOjZdTixAIT8KK009RV1EO1c1QjsmNCA3Vzk/PTZZUzo2PU45NjE/OjZZVDdWOVU7RiwgN1c5PzxWRUc7RjVEN1ctSDtXKVQKK003VjlVO0YsIDdXOT88VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA3Vzk/PFZFRztGNUQ3Vi1IODcpPzg3KVIKK004N0QgN1c5PzlGUU84NzE/OUc1TjhQIT89RV1TOiZdUj0lXUY9NllDICVdVjdXLUk5VllFOSVdSTtHMCAKK003Vzk/OyZdTjlVXUE8RylBPjAhPz1FXUM6JiVSN1YlUjxGJVkgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT8KK008Jl1JO0cxRTxAIT89RV1VO0ctSTlWWUU5JV1DOiYlUjdXIU86NllUOTcoIDdXOT86NllUICVdUzwmXVIKK009Jy1DODcoIDdXOT85Jl1VOEZRRTdXIU86NllUOTcoIDdXOT89NllTOjY9Tjk2MT88VkFPPEcwIDdWLUwKK009NllLOTcoIDdXOT88VzFSPTYtVCwwIT89RV1TPScpVThXMFIgJV1WN1c1TjxWRUc7RjVEN1ZRTztGPT8KK005RzVOOFAhPz1FXVU7Ry1JOVZZRTklXUM6JiVSN1Y5VTtGLCA3Vzk/PFZFRztGNUQ3VkVOPSVdUDtWRU4KK009JjVSICVdVjdXNU48VkVHO0Y1RDdWRU49JV1BPEcpQT4wIT89RV1TOjY9Tjk2MT88VkFPPEcxPzg3KVIKK004N0QgN1ZZTztHIVI6NlVBPEdEIDdXLT87JkVOOlAhPz1FXUQ7VzVCOyY1PzlHNU44UCE/PUVdUzo2PU4KK005NjE/OyZdTjlQIT89RV1JO0cxPzwmXUk7RzFFPEAhPz1FXVM6Nj1OOTYxPzhWQUE8QCE/PUVdRjsmXUEKK009JV1BPEcpQT4wIT89RV1TOiZdUj0lXUE8RylBPjAhPz01XUw6NllLICVdVjdXNU48VkVHO0Y1RDdXLUgKK007VylUN1chTzo2WVQ5NyggN1c5PzsmXU45UCE/PUVdQzomJVIgJV0/OTdBST0lXUQ9NlVNPjVdRDk2LUwKK00gJV0/N1QtNDNVKT8zJEUzNSVdPyAlXT83VDE0M1UpPzMkRTM1JV0/ICVdPzdWMU83Vj1MO1YpQTslXUMKK009Jl1SPFAhPzdVXUQ7VV1HOyZdQjg2UT85JzFPPEcsIDdVXUU+JkVUN1YxVTs2VVk3VylFOUAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyggICAgICAgICAgICAKKyAKK2VuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zcGFyYy1lbGYudSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3BhcmMtZWxmLnUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyMGMwZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3BhcmMtZWxmLnUKQEAgLTAsMCArMSwzMzYgQEAKK2JlZ2luIDc3NyBzcGFyYy1lbGYKK00/VDUsMUAkIiAwICAgICAgICAgICAgICIgICggICAgISAgJC8lICAgICMwICAjOzAgICAgICAgVCAiICAKK00hMCBIICE8ICRQICAgIDggICAgVCAgJCAtICAgICAgICAgIkAgICAgSCAgICAgNCAgICAgICAgICBQICAKK00gLTAgICAgICAgICAgICAgICEkICAgICAgICAgISAgICAgICAgICAhICAgIC0gICEgIzAgICAgICAgIDMKK009ICAgJFcwICAgICUgICQgICAgICAgJCAgIS5IICAoM0ogICAgICAgICAjTCAgICJNICAgICA8ICAwICAKK00gICAgIEAgICUgUCAgQTAsICAgICAgICAgKEAgICAgICAgICAhUCAgICAgTz03LVIrVlFJOEJdTDkiWVMKK007UlhRICAgICAgICAgJSwgICAhSCAgICAyUCAgICAgICAgICAgICAgLkAgICAmKCAgICBXICAgIDUgICAKK00gICAgICAgICAgICA0UCAgICVcICAgIUQgICAgNCAgICAkICAgICEqICAgIDVQICAgIzggICAgICAgICAKK00yMCAgICMsICAgIE0gICAgL1AgICAlWCAgICAgICAgICAgICAgIjQgICAgPCAgICAwUCAgICAgICAgITEKK00gICAgKiAgICAgICAgICEiICAgICAgICAgIjAgICAhOyAgICAsICAgICMkICAgIFIgICAgMVAgICAkNCAKK00gICEuICAgIDggICAgICAgICAgQyAgICArQCAgICVAICAgICAgICAgLzAgICAgICAgICAgICAgICggICAKK00gJDAgICAhPCAgICAyICAgICAgICAgICAgICAgKyAgICAgICAgICEvICAgICAgICAgICAgICAhNiAgICAKK00gICAgICY8ICAgITogICAgNjAgICAmOCAgICAgICAgIC5QICAgICAgICAgICAgICAgICAgICVUICAgICAKK00gICAgK1AgICAgICAgICFFICAgICAgICAgICAgICAhQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQCAgICJEICAgICAgICAgICAgICAgICAKK00gICA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1AgICAgICAgICAgICAgICAgICAKK00gIjggICAgOyAgICAgICAgICFUICAgICAgICAgICAgICAhSCAgICBeICAgIDAwICAgIkwgICAgVSAgICAKK00gICAgICAgICAgIDcgICAgICAgICAgICAgICAgICAgICAgICAgIiggICAgICAgICAgICAgICRQICAgICAKK00gICAgICAgICAkOCAgICBYICAgIDRAICAgIzAgICAhLSAgICAgICAgICNQICAgICAgICAgICAgICAgICAKK00gICBHICAgICAgICAgJTQgICAgICAgICAgICAgICFAICAgID4gICAgICAgICAgICAgICBZICAgIDhQICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICQgVSAgICAgICMgICAhICAgICAgICEgLkAgICAgICBQICAKK00gQCAgICAgICAwLzwgICAgICAsICAgLCAgICAgICAkKjcgICAgICAjICAgJCAgICAgICAhI01AICAgICAKK00gUCAgITAgICAgICAgMFtEICAgICAgLCAgIDggICAgICAgJC8iICAgICAgIyAgICcgICAgICAgISNRMCAKK00gICAgIFAgICIgICAgICAgIDEtUCAgICAgICwgICBEICAgICAgICQzQCAgICAgICMgICAqICAgICAgICIKK00kWkAgICAgICBQICAiUCAgICAgICBBMCAgICAgICAsICAgUCAgICAgICAoNCMgICAgICAjICAgLSAgICAKK00gICAiJSlAICAgICAgUCAgI0AgICAgICAgICAgICAgICAgLCAgIFwgICAgICAgICAgICAgICAgIyAgIDAKK00gICAgICAgICAgICAgICAgIFAgICQwICAgICAgICAgICAgICAgICwgICEoICAgICAgICAgICAgICAgICMKK00gICAzICAgICAgICAgICAgICAgICBQICAlICAgICAgICAgICAgICAgICAsICAhNCAgICAgICAgICAgICAKK00gICAjICAgNiAgICAgMCAiJSlAICAgICgkMCAgI0AgICAgRCAgMS1QICAgICAhKCAgIEQgICAgLyAgKDQKK01IICAgICAwMSAgIC4gICAgJUAgIiUqQCAgICIwJDAgICNAICAgIVQgIEE0WCAgICAhISQgICBYICAgIFQKK00gICg1LyAgICAgMDEgICAuICAgIC5AICIlNCAgICAgISQwICAjQCAgICRAICBBNSQgICAgISEkICAgWCAKK00gICE2ICAoNTIgICAgIEAxICAgLiAgICA3UCAiJTUgICAgICgkMCAgI0AgICAnNCAgQTU4ICAgICIhJCAKK00gIFggICAiKiAgKDU4ICAgICAwMSAgIC4gICAgR1AgIiU2MCAgICAkJDAgICNAICAgKjwgIEE1SCAgICAKK00hISQgICBYICAgIlQgICQwOSAgICAhMDIgICAoICAgIFIwICEjWEAgICAgNCRAICAiICAgIC00ICBBNVAKK00gICAgIiEkICAgWCAgICM+ICAoNT4gICAgIDAxICAgLiAgICBaICAiJTdQICAgICIkMCAgI0AgICAvWCAKK00gQTVeICAgICBBJCAgIFggICAkLyAgKDVAICAgICBAMSAgIC4gICAhKFAgISNQQCAgICAgJEAgICFQICAKK00gMkQgIEE2KCAgICAgQSQgICBYICAgJFggICQvUSAgICAhMDIgICAoICAgITEwICIlOFAgICAgJCQwICAKK00jQCAgIDRUICBBNjAgICAgIEEkICAgWCAgICU6ICAoNUYgICAgIUAxICAgLiAgICE5ICAiJTsgICAgIDgKK00kMCAgI0AgICA2WCAgQTcoICAgICEhJCAgIFggICAlVSAgKDVTICAgICAwMSAgIC4gICAhQSAgIiU9ICAKK00gICAkJDAgICNAICAgOVAgIDEhMCAgICAlISggICBAICAgJk8gICg1VSAgICAgMDEgICAuICAgIVFAICIKK00lPUAgICAgIiQwICAjQCAgIDxYICAwX0wgICAgJSEoICAgQCAgICdEICAoNCMgICAgICAxIC9fUSAgICEKK01bMCAhJCpAICAgKygkQCAgIiAgICA/KCAgMS4gICAgICEhJCAgIEggICAnXyAgJDBEICAgICFAMiAgICgKK00gICAiIzAgIiU9SCAgICAiJDAgICNAICAgQiQgIDEgNCAgICAlISggICBAICAgKFMgICg1VyAgICAgMDEKK00gICAuICAgIjBQICIlPiAgICAgJCQwICAjQCAgIEUoICBBN0ggICAgJCEkICAgWCAgIClBICAkLyUgICAKK00gJzAyICAgKCAgICI6ICAiJSkwICAgICAkMCNfXDAgICBGXCAgMSBIICAgICUhKCAgIEAgICAqIyAgKDUKK01eICAgICBAMSAgIC4gICAiQ1AgIiVAICAgICAkJDAgICNAICAgSTwgIDEhWCAgICAmISggICBAICAgKkQKK00gICQwLyAgICAhMDIgICAoICAgIkwgICIlQDAgICAgKCQwICAjQCAgIEwsICBBOTAgICAgISIkICAgWCAKK00gICsrICAoNiMgICAgIDAxICAgLiAgICJXICAiJUEgICAgICQkMCAgI0AgICBPKCAgMF84ICAgICUhKCAKK00gIEAgICAsJiAgKDYlICAgICAwMSAgIC4gICAjJTAgIiVBQCAgICAkJDAgICNAICAgUlQgIDBeUCAgICAKK00lISggICBAICAgLSIgICg2NyAgICAgIDEgL19RICAgIzFQICIlQVAgICAgJCQwICAjQCAgIFVYICBBOEAKK00gICAgISEkICAgWCAgIC1MICAoNikgICAgICQxICAgLiAgICM/ICAiJUJAICAgICQkMCAgI0AgICBYUCAKK00gQThMICAgICEhJCAgIFggICAuPCAgJDNKICAgICAgMSAvX1EgICAjSFAgIiVDICAgICAoJDAgICNAICAKK00gWyQgIEE4WCAgICAhISQgICBYICAgLyYgICg0ICAgICAgIDEgL19RICAgI1cgICEkICAgICAgNCRAICAKK00iICAgIF48ICAwXjwgICAgJSEoICAgQCAgIC9aICAoNi8gICAgIDAxICAgLiAgICQiICAiJUQgICAgICEKK00kMCAgI0AgICEgXCAgQTkkICAgICEhJCAgIFggICAwOiAgKDYyICAgICBAMSAgIC4gICAkKVAgIiReMCAKK00gICAwJEAgICAgICAhIlAgIEEvOCAgICA2ISggICAgICAgMFMgICgzXCAgICAgQDIgICAgICAgJC4wICIKK00lRSAgICAgJCQwICAjQCAgISQoICBBOTQgICAgISEkICAgWCAgIDE7ICAoNjYgICAgIDAxICAgLiAnOT8KK009NllJO1ZYIDdWOUk7RkQgPFVdTDo2WUsgJzU/OyZFTjpQIVY3Vy1JOVZZRTklXVM6Jl1SPSVdUDtWRU4KK009JjVSICc5Pzo2WVQgJzk/PFZFRztGNUQ3Vi1IODcoID1FXUk7RzE/PCZdSTtHMUU8QCFWN1YxTz02KUwKK005MCFWN1c1TjxWRUc7RjVEN1ZRTztGPT84NylSODdEID1FXVU7Ry1JOVZZRTklXUk7RzE/ODcpUjg3RCAKK009RV1TOjY9Tjk2MT86NllUN1chTzo2WVQ5NyggOFZRVTtGTUU8QCFWN1ctSTlWWUU5JV1JO0cwID1FXVUKK007Ry1JOVZZRTklXUw7VllHN1Y5VTtGLCA9RV1DOiYlUjdWOVU7RiwgPUVdVTtGRU87QyggPFchTzxHMVMKK004ViVSICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4wIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVCAnOT8KK008VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA3VkVOOjcwID1FXVM6Nj1OOTYxPzxWQU88RzAgPUVdUzomXVIKK009JV1GPTZZQyAnOT85RlFPODcwID1FXUM6JiVSN1YlUjxGJVkgJzk/PFcxUj02LVQsMCFWN1ctVDxHNUMKK009IyggPUVdTDtWWUcgJzk/OyZdTjlVXVA7VkVOPSY1UiAnOT89NllTOjY9Tjk2MT87Jl1OOVVdUDtWRU4KK009JjVSICc5PzxWRUc7RjVEN1ZRTztGPT85RzVOOFAhVjdXNU48VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIKK00gJzk/PFZBTzxHMCA9RV1VO0ctSTlWWUU5JV1TOiZdUj0lXUY9NllDICVdJDY0WSEzNEUjICZVQTo2WCAKK003VlFJOEVdVjk3KVM6Nl1OICc5PzkmXVU4RlFFN1Y5VTtGLCA9RV1TOjY9Tjk2MT84VkFBPEVdQTxHKUEKK00+MCFWN1ctSTlWWUU5JV1JO0cxPzlHNU44UCFWN1c1TjxWRUc7RjVEN1ZRTztGPCA9RV1VO0ctSTlWWUUKK005JV1JO0cwID1FXUQ7VzVCOyY1Pzg3KVI4N0QgN1ctVDg3KVQgJV1FOSYlVDgwIVY3VzVOPFZFRztGNUQKK003VkVOPSVdRj02WUMgJzk/OjZZVDdWJVI8RiVZICchUjo2VUE8R0QgPUVdRjsmXUE9JV1GPTZZQyAnOT8KK007Jl1OOVVdRj02WUMgJzk/PFZFRztGNUQ3VkVOPSVdQTxHKUE+MCFFO0c5STxGXU4gJzk/OSZdVThGUUUKK003VyFPOjZZVDk3KCA9RV1TOjY9Tjk2MT84VkFBPEVdUDtWRU49JjVSICc5PzxWRUc7RjVEN1ctSDtXKVQKK003VjlVO0YsID1FXUM6JiVSN1chTzo2WVQ5NyggPUVdVTtHLUk5VllFOSVdQzomJVI3VyFPOjZZVDk3KCAKK009RV1VO0ctSTlWWUU5JV1DOiYlUjdWOVU7RiwgN1Y1TjkgIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdWJVIKK008RiVZICc5PzxWRUc7RjVEN1ZRTztGPCA9RV1VO0ctSTlWWUU5JV1DOiYlUiAnOT88VkFPPEcxPzwmXUkKK007RzFFPEAhVjdWOUw7ViVUN1chTzo2WVQ5NyggN1Y1VDk3QVQgJzk/OUZRTzg3MT84NylSODdEID1FXVMKK006Nj1OOTYxPzxWQU88RzE/ODcpUjg3RCA3VD0sM1QpITMlXS8xRDkzMTUxPzUkJSIzJDU/ICc5Pzo2WVQKK003VjlVO0YsID1FXVM6Nj1OOTYxPzhWQUE8RV1GPTZZQyAnOT88VkFPPEcxPzg3KVI4N0QgPUVdQzomJVIKK00gJllPO0chUjo2VUE8R0QgPUVdTDtWWUc3ViVSPEYlWSAmNVg6NzAgODcxRT4mRVQgJV1FPiZFVCAlXUUKK007RzlJPEZdTiAnOT89NllTOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPEAhVjdXLUk5VllFOSVdTDtWWUcKK003VyFPOjZZVDk3KCA7JkVCOFJZUztSWFEgICAgIEE5MCAgIUUkUCAgICAgICBBLzggICFDJTAgICAgICAKK00gQS9EICAhQiUwICAgICAgIEEvUCAgIUQlMCAgICAiPVhbXkBAPD9AIignSCAgIlwkIiAgWCAuQDAqKCMKK01IJDI8KFogQEApICAgMCogICAyMCQgICEwICEhKkAkICAgIDEgICEkRCEoQzwkICAwMjghICAgID9fX18KK01cICQgICAiMCQgIDBEQSAgJDk0TCggKjQgSiAkRSAxICJBPCAgKDY2JE4pMFUiKyAgJCAgICRYISAgICAKK00wICEhJlAkICAgISAgJCQ8IDAgICApV0NPWSJQJCIgICwoICAgOCcnWCBCIVogICBHPi5fRCsgMCggIFAKK01AICAhQDw/QCIoJ0ggICI9WFteMEwhIEAgIyIgICAmIVFeIChAPkAgIClXQ09ZIlAkIiAgLCggICA4JycKK01YIEIhWiAgIEc+Ll9EKyAwKCAgUEAgICFAPD9AIignSCAgIj1YW14wTCEgQCAjIiAgICYhUV4gKEA+QCAKK00gKVdDT1kiUCQiICAsKCAgIDgnJ1ggQiFaICAgRz4uX0QrIDAoICBQQCAgIUA8P0AiKCdIICAiPVhbXjAKK01MISBAICMiICAgJiFRXiAoQD5AICApV0NPWSJQJCIgICwoICAgOCcnWCBCIVogICBHPi5fRCsgMCggIFAKK01AICAhQDw/QCIoJ0ggICI9WFteMEwhIEAgIyIgICAmIVFeIChAPkAgIClXQ09ZIDEgICEkUDAoQ0IjIiAKK00gICYhUV4gKEA+QCAgKVdDT1kgMSAgISRQMUhDRCMiICAgJiFRXiAoQD5AICApV0NPWSAxICAiJVAiSEIKK00wISQgICg2MiQiICFUQkhBMCEkICAoNjIkIiAiVEJIQikhJCAgKDYyJCIgI1RDKEFWISQgICg2MiQiICQKK01UQyhBQiEkICAoNjIkIiAlVEMoQT9BJCAgKDYyJCIgJlRCKEEvISQgICg2MiQiICdUQihBOiEkICAoNjIKK00kIiAoVEIoQVghJCAgKDYyJCIgKVRCKEFSISQgICg2MiQiICpUQihCKCEkICAoNjIkIiArVEIoQVchJCAKK00gKDQzICAhJFUgKUNGLTBCKDhQMSAgIiUkUCAgMS0wOjhaIzQuQiUoJDAgIEExLCAgKDc0IkYpIFUiSEEKK01EISQgICg0MyAgIiVVIElBMC0wSig9SDEgICIlJFAgIEE9MCo4QjM0KkIlXCQwICBBMSwgICg3NCRGJzgKK01VIyhCLyEkICAoNDMgICIlVSEpQUItMFIoQ0AxICAiJSRQICBBPTAyODdbNCxCKDwkMCAgQTEsICAoNzQKK00gRiRcVSIoQV4hJCAgKDQzICAiJVUgKUE6LTBCKEAwMSAgIiUkUCAgQT0wIjg+IzQoQiU4JDAgIEExLCAKK00gKDc0IEYnKFUiKEIyISQgICg0MyAgIiVVIClCKC0wQig4IDEgICIlJFAgIEE9MCI4PVM0KEIlMCQwICAKK01BMSwgICg3NCBGJixVIihCLCEkICAoNDMgICIlVSFJQTItMFooPkAxICAiJSUwICBBOSgySEQjMihCKDQKK00kMCAgQTE0ICAoNjIkSiUgVEIoQiQhJCAgKDQ1ICAiJURBKkIpLShCKEFAMSAgIiUlMCAgQTkoMkg9QzIKK00oQihIJDAgIEExNCAgKDYyJEomKFRCKEEuISQgICg0NSAgIiVEQSpBP00oQihFMDEgICIlJTAgIEE5KDIKK01IM1MyKEIlJCQwICBBMTQgICg2MiRKJUhUQihBOCEkICAoNDUgICIlREEqQVgtKEIoPTAxICAiJSUwICAKK01BOSgySDxDMihCJywkMCAgQTE0ICAoNjIkSihAVEIoQjYhJCAgKDQ1ICAiJURBKkFXLShCKD0gMSAgIiUKK00lMCAgQTkoMkg4UzIoQihMJDAgIEExNCAgKDYyJEolKFRCKEIjISQgICg2MiQiICJUQihCICEkICAoNjIKK00kIiAiVEIoQjEhJCAgKDYyJCIgIVRCKEE+ISQgICg2MiQiICFUQihBOSEkICAoNDMgICIlVSApQEgtMEIKK00oKkAxICAiJSRQICBBPTAyOClDNCxCJVBAPD9AIignSCAgIj1YW15AQDw/QCIoJ0ggICAgICAgICAgICAKK00gMCAgICAgICAgICAgICAgICAgICAgICAgICAgMExAICAgICAgICEgOjAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICAjIFAKK01PX19TIDAgICAgLCAgI1BQT19fUCAwICAgICwgICRAUE9fX00gMCAgICAkICAgICAgQTAsICAgICAgICAKK00gICAgICAgISAgICQ8MCAgICBQICAwXCggICAgIzAgISRXICAgICAkICAkIFogICAgIDQgIDBJPCAgICAKK00hQCAhIF1QICAgICogICAkPlAgICAgTCAgICAwICAgICUwICAgICAgICAgIyAgKDNKICAgICAoICAgIEQKK00gICAgJSAgICAgPCAgICA3ICAkLlkgICAgIDwgIDBbOCAgICAiICAgICMgICAgICkgICAgIyAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgICAgICAgICAgICQgL19RICAgICAgICEKK00gLTAgICAgICBQICAgMCAgICAgICAwI0ggICAgICAsICAgKCAgICAgICAkI1cgICAgICAjICAgIyAgICAKK00gICAhIkVQICAgICAgUCAgISAgICAgICAgMFs4ICAgICAgLCAgIDQgICAgICAgJC5ZICAgICAgIyAgICYKK00gICAgICAgISNQQCAgICAgIFAgICFQICAgICAgIDBcNCAgICAgICwgICBAICAgICAgICQzPCAgICAgICMKK00gICApICAgICAgICEkWCAgICAgICBQICAiQCAgICAgICBBLkggICAgICAsICAgTCAgICAgICAoNCAgICAKK00gICAjICAgLCAgICAgICAiJSBQICAgICAgUCAgIzAgICAgICAgQTI4ICAgICAgLCAgIFggICAgICAgICAKK00gICAgICAgIyAgIC8gICAgICAgICAgICAgICAgIFAgICQgICAgICAgICAgICAgICAgICwgICEkICAgICAKK00gICAgICAgICAgICMgICAyICAgICAgICAgICAgICAgICBQICAkUCAgICAgICAgICAgICAgICAsICAhMCAKK00gICAgICAgICAgICAgICAjICAgNSAgICAgICAgICAgICAgICAgUCAgJUAgICAgPCAgICAgICAgICAgMCAKK01fXyQgICAgLiAgICAgICAgICAgJCAvX1EgICAgJkAgICAgICAgICAgISAjX1wwICAgIiggICAgICAgICAKK00gIDAgX18kICAgIEkgICg0RiAgICAgQDEgICAuICAgICwwICEkVyAgICAgICRAICAiMCAgICM8ICBBMkAKK00gICAgISEkICAgWCAgICBeICAoNEogICAgKSAxICAgLiAgICAxMCAiJTNAICAgICQkMCAgI0AgICAlUCAKK00gQTRcICAgICEhJCAgIFggICAhQiAgKDUwICAgICAkMSAgIC4gICAgPCAgIiU0MCAgICAkJDAgICNAICAKK00gJ1ggIEE1KCAgICAiISQgICBYICAgIicgICg1NCAgICAgQDEgICAuICAgIEcwICIlNUAgICAgKCQwICAKK00jQCAgICsoICBBNUAgICAgISEkICAgWCAgICMnICAoNTkgICAgIDAxICAgLiAgICBTUCAiJTZAICAgICQKK00kMCAgI0AgICAtUCAgMSFEICAgICUhKCAgIEAgICAjUSAgJC9CICAgICEwMiAgICggICAgXzAgIiU3ICAKK00gICAoJDAgICNAICAgMDggIEE1WCAgICAhISQgICBYICAgJDAgICg1PyAgICAgKDEgICAuICAgISlAICIKK00lN1ggICAgIiQwICAjQCAgIDM8ICBBNiAgICAgIiEkICAgWCAgICUrICAkLyIgICAgICAyICAgJyAgICEKK000MCAiJThAICAgICIkMCAgI0AgICA2ICAgMF8kICAgICUhKCAgIEAgICAlTSAgKDVDICAgICAwMSAgIC4KK00gICAhPTAgIiU5ICAgICAiJDAgICNAICAgOCggIEE2OCAgICAmISQgICBYICAgJiwgICg1TCAgICAhQDEKK00gICAuICAgIUVAICIlPEAgICAgJCQwICAjQCAgIDlUICBBNywgICAgISEkICAgWCAgICZMICAoNVQgICAKK00gIDAxICAgLiAgICFRICAhJCUgICAgIDQkQCAgIiAgICA9PCAgQTc0ICAgICEhJCAgIFggICAnTiAgKDUKK01WICAgICAoMSAgIC4gICAhXUAgISNeUCAgICA0JEAgICIgICAgQFAgIEEwLCAgICAgISQgX18kICAgKDUKK00gICQwSiAgICBMQDIgICAoICAgIiZAICEkWCAgICAgJCQwICAiQCAgIEI8ICAxIjAgICAgJiEoICAgQCAKK00gIChVICAoNVZAICAgICgxICAgLiAgICIyMCAhJCEwICAgIDQkQCAgIiAgICBFTCAgQTc8ICAgICEhJCAKK00gIFggICApSyAgKDVYICAgICAwMSAgIC4gICAiPkAgIiU+QCAgICAwJDAgICNAICAgSEQgIDBcNCAgICAKK009ISggICBAICAgKjAgICg0RSAgICAgIDEgL19RICAgIkVQICEkIkAgICAgNCRAICAiICAgIEpMICBBN1gKK00gICAgIiEkICAgWCAgICpXICAoNiAgICAgIDAxICAgLiAgICJPUCAhJCdAICAgIDgkQCAgIiAgICBMUCAKK00gMSBcICAgICUhKCAgIEAgICArOCAgKDYhICAgICBAMSAgIC4gICAiWlAgIiVFICAgICAkKDAgICNAICAKK00gTywgIEE4LCAgICAhISQgICBYICAgLCQgICg2JCAgICAgMDEgICAuICAgIyZAICEjXUAgICAgNCRAICAKK00iICAgIFJYICBBODQgICAgISEkICAgWCAgICxdICAoNiYgICAgIDAxICAgLiAgICM1MCAhI1sgICAgIDQKK00kQCAgIiAgICBWSCAgQTk8ICAgICAhJCBfXyQgICAtTyAgKDYnICAgICAwMSAgIC4gICAjQUAgIiVCICAKK00gICAkJDAgICNAICAgWTAgIEE4RCAgICAgMSQgICBYICAgLkQgICg2KiAgICAgMDEgICAuICAgI00gICIKK00lQlAgICAgJCQwICAjQCAgIFwwICAxLkggICAgICEkIF9fJCAgIC8rICAoNiwgICAgIEAxICAgLiAgICMKK01WMCAiJUNAICAgICQkMCAgI0AgICBeWCAgQTAgICAgICAhJCBfXyQgICAwJCAgJDAgICAgICEwMiAgICgKK00gICAkI1AgISNZUCAgICA0JEAgICIgICAhIiggIEE4XCAgICAhISQgICBYICAgMFAgICg2MCAgICAgJDEKK00gICAuICAgJC1QICIlRDAgICAgJCQwICAjQCAgISQoICBBOSggICAgIiEkICAgWCAgIDEvICAoM1kgICAKK00gISAyICAgICAgICQ1ICAiJF1AICAgITgkQCAgICAgICElTCAgQS9QICAgICIhKCAgICAgICAxQSAgKDYKK000ICAgICAwMSAgIC4gICAkOkAgIiVFMCAgICAkJDAgICNAICAhKCwgIEE5OCAgICAhISQgICBYIDlWMUIKK007NjQgOFcpVDoyWVMgJzlBOyc1RTxSVTg4MllDICY9RDhGVUUrRiwgOFcpVDtCWVMgJzk/PTZZSTtWWCAKK003VjlJO0ZEIDxVXUw6NllLICc1PzsmRU46UCFWN1ctSTlWWUU5JV1TOiZdUj0lXVA7VkVOPSY1UiAnOT8KK006NllUICc5PzxWRUc7RjVEN1YtSDg3KCA9RV1JO0cxPzwmXUk7RzFFPEAhVjdWMU89NilMOTAhVjdXNU4KK008VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA9RV1VO0ctSTlWWUU5JV1JO0cxPzg3KVI4N0QgPUVdUzo2PU4KK005NjE/OjZZVDdXIU86NllUOTcoIDhWUVU7Rk1FPEAhVjdXLUk5VllFOSVdSTtHMCA9RV1VO0ctSTlWWUUKK005JV1MO1ZZRzdWOVU7RiwgPUVdQzomJVI3VjlVO0YsID1FXVU7RkVPO0MoIDxXIU88RzFTOFYlUiAnOT8KK009NllTOjY9Tjk2MT84VkFBPEVdQTxHKUE+MCFWN1c1TjxWRUc7RjVEN1ctSDtXKVQgJzk/PFZFRztGNUQKK003VlFPO0Y9Pzg3KVI4N0QgN1ZFTjo3MCA9RV1TOjY9Tjk2MT88VkFPPEcwID1FXVM6Jl1SPSVdRj02WUMKK00gJzk/OUZRTzg3MCA9RV1DOiYlUjdWJVI8RiVZICc5PzxXMVI9Ni1ULDAhVjdXLVQ8RzVDPSMoID1FXUwKK007VllHICc5PzsmXU45VV1QO1ZFTj0mNVIgJzk/PTZZUzo2PU45NjE/OyZdTjlVXVA7VkVOPSY1UiAnOT8KK008VkVHO0Y1RDdWUU87Rj0/OUc1TjhQIVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICc5PzxWQU8KK008RzAgPUVdVTtHLUk5VllFOSVdUzomXVI9JV1GPTZZQyAlXSQ2NFkhMzRFIyAmVUE6NlggN1ZRSThFXVYKK005NylTOjZdTiAnOT85Jl1VOEZRRTdWOVU7RiwgPUVdUzo2PU45NjE/OFZBQTxFXUE8RylBPjAhVjdXLUkKK005VllFOSVdSTtHMT85RzVOOFAhVjdXNU48VkVHO0Y1RDdWUU87RjwgPUVdVTtHLUk5VllFOSVdSTtHMCAKK009RV1EO1c1QjsmNT84NylSODdEIDdXLVQ4NylUICVdRTkmJVQ4MCFWN1c1TjxWRUc7RjVEN1ZFTj0lXUYKK009NllDICc5Pzo2WVQ3ViVSPEYlWSAnIVI6NlVBPEdEID1FXUY7Jl1BPSVdRj02WUMgJzk/OyZdTjlVXUYKK009NllDICc5PzxWRUc7RjVEN1ZFTj0lXUE8RylBPjAhRTtHOUk8Rl1OICc5PzkmXVU4RlFFN1chTzo2WVQKK005NyggPUVdUzo2PU45NjE/OFZBQTxFXVA7VkVOPSY1UiAnOT88VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLCAKK009RV1DOiYlUjdXIU86NllUOTcoID1FXVU7Ry1JOVZZRTklXUM6JiVSN1chTzo2WVQ5NyggPUVdVTtHLUkKK005VllFOSVdQzomJVI3VjlVO0YsIDdWNU45ICFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWSAnOT8KK008VkVHO0Y1RDdWUU87RjwgPUVdVTtHLUk5VllFOSVdQzomJVIgJzk/PFZBTzxHMT88Jl1JO0cxRTxAIVYKK003VjlMO1YlVDdXIU86NllUOTcoIDdWNVQ5N0FUICc5PzlGUU84NzE/ODcpUjg3RCA9RV1TOjY9Tjk2MT8KK008VkFPPEcxPzg3KVI4N0QgN1Q9LDNUKSEzJV0vMUQ5MzE1MT81JCUiMyQ1PyAnOT86NllUN1Y5VTtGLCAKK009RV1TOjY9Tjk2MT84VkFBPEVdRj02WUMgJzk/PFZBTzxHMT84NylSODdEID1FXUM6JiVSICZZTztHIVIKK006NlVBPEdEID1FXUw7VllHN1YlUjxGJVkgJjVYOjcwIDg3MUU+JkVUICVdRT4mRVQgJV1FO0c5STxGXU4KK00gJzk/PTZZUzo2PU45NjE/PFZBTzxHMT88Jl1JO0cxRTxAIVY3Vy1JOVZZRTklXUw7VllHN1chTzo2WVQKK005NyggICc5QTsnNUU8UlU4ODJZQyAiXUQ6NzlFK1cpRTsmNUE8VjRPOEJVUz43LUk5RkVYK1c1UzxCXVMKK008RixPOyZFQitWUUk4RixPICchTzxHME85VjVOK1c5QTsnNUU8UlU4ODJZQyAgICA2JzBALlIhNi8zKE4KK00sICFNODZFTiAlXUw6Nik/PUY1UjxWRU87QCBPPSZVUCAiXVU8VyhPOFYtUytWUUk4Ql1WODZRVTk3LE0KK002JiROO1AgIDlWMUI7NjROOFAgTz0mVVArUCFHOSYpTTkyWUMgJj1DOFMpPzhWXU08JkVMOTYwTiAmRU4KK009I0lULDNVUiwzTE0sQyRULVMwWCxTOFQuI0xSLDMwVy0jQFMtQzBXLlAhQzomJVIuRzBSLzcoUi5TIFsKK00sMyhXLlAhTDtWWUcoJkVOPSNJVCxTVVIsM0xNLEMkVC1TMFgsUzhULiNMUiwzMFctI0BTLUMwVy5QIVUKK007Ry1JOVZZRTkiIUk7RzBaPSMwXTxDJFssI0xNLDNMIDsmXU45UiFVO0ctSTlWWUU5IiFJO0cwWj0jNF0KK008QyRbLCNMTSwzTCA8VkFPPEcwQDo2WVQuRzBWLzcoUS5SVFMsQzxWLiNMUyxDPFYtU0wgOyZdTjlSIUwKK007VllHKCZFTj0jSVQtU1VSLDNMUC5SVFEuUCFTOiZdUj0iIVU7Ry1JOVZZRTkiIUk7RzBaPSNAXTxDJFsKK00sI0xWLTM0Uy0zTCA7Jl1OOVIhTDtWWUcoJzVOPFZFRztGNUQoJkVOPSNJVC4zVVIsM0xQLlJUUS5QIVMKK006Nj1OOTYwQDhWQUE8Q0lULDMgXTxDJFsrMyRSLiNMUSxDPFsgJzVOPFZFRztGNUQoJi1IODcoWj0jJFEKK00vNyhRLlMgWyxDNFUuUCFGOyZdQT0jSVQsMyhdPEMkWy0jTFAuUCFEO1c1QjsmNFo9IyRTLzcoUS5TQFsKK00sI0wgOyZdTjlSIUQ7VzVCOyY0Wj0jJFQvNyhRLlNAWywjTCA9Rl1JOSNJVCwzNF0sMzQgPSVdUz0nKVUKK004VzBaNSMkVi83LFItJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVI9JV1NOTZVQjk3KFoKK00tQlBRLUJQUS1DTVY3VkVOPSVdTTk2VUI5NyhaLDJQUyxCUFMsQ01WN1ZRTztGPT87NjVNOEY1Ui5DLEwKK00tQzBMLFMoWz1FXUY7Jl1BPSVdTTk2VUI5NyhaLDMoTC4zOEwsUyhbPUVdRDtXNUI7JjU/OzY1TThGNVIKK00uQyRTKyMkUi4iUFYtI0xbICcxPz02WUk7VlhaNSMkVy83NFg9RV1DOiYlUjdWVUU7NilFPENIUisjIEwKK00uI01WN1ctSDtXKVQ3VlVFOzYpRTxDSFYrIyBMLDM4Wz1FXUk7RzE/OzY1TThGNVIuQyRMLCJQUyxDTVYKK003VlFPO0Y9Pzs2NU04RjVSLkMsTCwiUFMsQ01WN1Y5TDtWJVQ3VlVFOzYpRTxDSFEsQlBQKyMsUi5XOT8KK005Jl1VOEZRRTdWVUU7NilFPENIUSxSUFArIzhULlNMID1FXUM6JiVSN1Y5VTtGLFoxQyggPUVdUzo2PU4KK005NjE/OFZBQTxFXUY9NllDLkQ4USwgIVY3VzVOPFZFRztGNUQ3Vi1IODcpPzlHNU44U0kmLDMkID1FXVMKK006Jl1SPSVdRj02WUMuRDhWICc5PzxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsWjFDOCA9RV1VO0ctSTlWWUUKK005JV1TOiZdUj0lXUY9NllDLkQ4WCAnOT86NllUN1Y5VTtGLFoxQyQgPUVdUzo2PU45NjE/OjZZVDdWOVUKK007RixaMUMkID1FXVU7Ry1JOVZZRTklXUk7RzE/OUc1TjhTSSYtICFWN1ZRTztGPT85RzVOOFNJJixQIVYKK003Vy1JOVZZRTklXUw7VllHN1Y5VTtGLFoxQywgPUVdVTtHLUk5VllFOSVdTDtWWUc3VjlVO0YsWjFDNCAKK009RV1GOyZdQT0lXUY9NllDLkQ4USxAIVY3VjFPPTYpTDk1XUY9NllDLkQ4USxQIUw6NllLLkUwUS4jVVMKK00sMzRSO0Y1WD0jSFEuM1RKLDNATCwiUFMsQ01MOjZZSzlHNU44U0hSLCNUSixDJF05QyRZKyMsUisjLFIKK00uVy1UPTY5Ri5DKFIvNiVSLDNMUC5TIFssQyxdODcoUS5TIFssM0xSLSNVQTxDJFssI0xSLlMkVisjOFQKK00rIyRRLTMoWy5QIVQ9NV1MOjZZSy5FMFItM1VVLDMwVDtGNVg9I0hRLjJQUCsjLFIuVlFJO0ZNRj02WUMKK00uQyhQKyMgTCxTKFs8VzFVOUY4WixDKEwsIlBRLDM0Ui5TTCA4Vl1MO1cpUy5FMFItQ1VFPjY1TDsmXVcKK00uQyBMPCc1UjwmUUUuQyRMPCZFTjpTSFIrI0wgOFYlUjxTSTQsQzxdOTYpTT1TSFArJyFPPEctQzomNFoKK00sMlBbICYpTztWUUU4NlhaPSMoWC82NSYwNFEzMTNIUCslMTI1NDRaLDJQWyAmKVY4NlFTLkUwUi4zVUUKK005RiVMPFY0WiwiUVQ8RzVFLkMkTC5QIUI7Vl1MOTYlTixDSVQsQ0QgOzZFUztXKUQ5NylFOSNJNCxTIF0KK005NzFXO1NIUismXU45M0hRKydJRTxGXFosIlFUOicpRTkzSFMrI0wgOzYlSTtDSSYsMCFWN1YtSDg3KFoKK00xUyggPUVdUzo2PU45NjE/OFZBQTxDSScsMyAgPUVdVTtHLUk5VllFOSVdQzomJVIuRDxRLDAhVjdXLUgKK007VylULkQ8ViAnOT88VkVHO0Y1RDdXLUg7VylULkQ8ViAnOT89NllTOjY9Tjk2MT88VkFPPEcwWjFTQCAKK009RV1JO0cwWjFTJCA9RV1TOjY9Tjk2MT86NllULkQ8USAnOT89NllTOjY9Tjk2MT86NllULkQ8VCAnOT8KK007Jl1OOVNJJyxQIVY3Vy1JOVZZRTklXUw7VllHLkQ8UyAnOT89NllTOjY9Tjk2MT87Jl1OOVNJJy0wIVYKK003VjlMO1YlVC5EPFEsQCFWN1YxTz02KUw5M0knLDMsID1FXUM6JiVSN1YlUjxGJVkuRDxTLDNVQTxDJFsKK00sI0xRLlMoID1FXVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4zSScsUyhdODcoUS5TIFssM0xRLCAhVjdXNU4KK008VkVHO0Y1RDdWLUg4Nyk/ODcpUjg3RFoxUyxTLzYlUiwzTFAuUyRbLDMkID1FXVM6Jl1SPSVdQTxHKUEKK00+M0knLFMwXTg3KFEuUyBbLDNMViAnOT88VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkuRDxTLSAhVjdXNU4KK008VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkuRDxTLTNVQTxDJFssI0xRLlNAID1FXUk7RzE/ODcpUjg3RFoKK00xUyxWLzYlUiwzTFAuUyRbLDAhVjdXLUk5VllFOSVdSTtHMT84NylSODdEWjFTLFYgJzk/PTZZUzo2PU4KK005NjE/OjZZVDdWJVI8RiVZLkQ8Uy1TVUE8QyRbLCNMUS5TMCA9RV1MO1ZZRzdWJVI8RiVZLkQ8Uy4jVUEKK008QyRbLCNMUS5TLCA9RV1TOjY9Tjk2MT87Jl1OOVVdQTxHKUE+M0knLFNAID1FXVU7Ry1JOVZZRTklXUwKK007VllHN1YlUjxGJVkuRDxTLjNVQTxDJFssI0xRLlM0ID1FXUY7Jl1BPSVdQTxHKUE+M0knLSMgXTg3KFEKK00uUyBbLDNMUSxAIVY3VjFPPTYpTDk1XUE8RylBPjNJJy0jJF04NyhRLlMgWywzTFEsUCFWN1YtSDg3KT8KK008Jl1JO0cxRTxDSSctIyhdKkMoID1FXVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIuRDxULFNUSiwzICAKK009RV1VO0ctSTlWWUU5JV1DOiYlUjdXIU86NllUOTcoWjFTMFQvMkhRLDAhVjdXLUg7VylUN1chTzo2WVQKK005NyhaMVMwVS8ySFYgJzk/PFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoWjFTMFUgJzk/PTZZUzo2PU4KK005NjE/PFZBTzxHMT88Jl1JO0cxRTxDSSctIzhdKkNAID1FXUk7RzE/PCZdSTtHMUU8Q0knLSM8XSpDJCAKK009RV1TOjY9Tjk2MT86NllUN1chTzo2WVQ5NyhaMVMwVyAnOT89NllTOjY9Tjk2MT86NllUN1chTzo2WVQKK005NyhaMVMwWC8ySFQgJzk/OyZdTjlVXVA7VkVOPSY1Ui5EPFQuM1RKLFAhVjdXLUk5VllFOSVdTDtWWUcKK003VyFPOjZZVDk3KFoxUzBZICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIuRDxVLCNUSi0wIVYKK003VjlMO1YlVDdXIU86NllUOTcoWjFTNFEvMkhRLEAhVjdWMU89NilMOTVdUDtWRU49JjVSLkQ8VSxDVEoKK00sMywgPUVdUz0nKVU4VzBRLkQ8US1AIVY3Vy1UPEc1Qz0jKFoxUzRTLzcsUi0nOT84VkFBPEVdTTk2VUIKK005NyhaLEJQUCsjQFs9RV1TOiZdUj0lXU05NlVCOTcoWi1CUFEtQlBRLUNNVjdWRU49JV1NOTZVQjk3KFoKK00sMlBTLEJQUyxDTVY3VlFPO0Y9Pzs2NU04RjVSLkMsTC1DMEwsUyhbPUVdRjsmXUE9JV1NOTZVQjk3KFoKK00sMyhMLjM4TCxTKFs9RV1EO1c1QjsmNT87NjVNOEY1Ui5DJFMrIyRSLiJQVi0jTFsgJzk/PTZZSTtWWFoKK00xUyRXICc5Pz02WUk7VlhSLkQ8VS0jVVUuJzk/OFZBQTxFXU05NlVCOTcoWixCUFArI0BbPUVdUzomXVIKK009JV1NOTZVQjk3KFotQlBQKyMkVi5XOT86NllUN1ZVRTs2KUU8Q0hRKyMgTCxTKFs9RV1MO1ZZRzdWVUUKK007NilFPENIUysjIEwsUyhbPUVdRjsmXUE9JV1NOTZVQjk3KFosMyhMLCJQUyxDTVY3VjFPPTYpTDk1XU0KK005NlVCOTcoWiwzLEwsIlBWLSNMWyAnLT87JkVOOlNJJywzRCA9NV1MOjZZSy5EPFItMCFQPEZFTTg3KVkKK00uRDxVLTNVRTxGNUQuQyBMOVcpRTk2WFosMlFCOyc1RS5DKEwuUCFOO1ZZUDxGRU04NylZLkQ8Ui1AIUMKK007JzVOOlY1Ui5EPFUtQ1VFOFZBRT1HRFosIlFGO1cpRC5DJEwuUCFTPCZdUj0nLUM4NyhaMVMoVyAgIE4KK006NllUOTcpUCAiWUg4Ny1IICJZRD42WVM+NlQgK0YxWTtHLVQ8QCBOPEY1TDgyWUI8VywgK0cpRTsmJE4KK008JlFUICJZSTtGRVQgIllUOTdBVCAiWUY6NllJICJZUjtWMUE9JiQgK0chTD0gIE45Vl1UICJZRD42WUEKK007NkVDICJZQjxXLCArRy1ZOzcxQThAIE48VzFSPSYlQiAiWVM9JiVCK0ZFTjkmNVg8VzFSICJZUz0mJUIKK008VzFSICJZUzonLVQ8RzFBOEAgTjhWXU07NjVOPSAgTjxXMUE4QllJO0YxRT4gIE48VzFBOEAgIDg3LFoKK00oJCxAMSY1Vjk2UU88JlVFO0cwQDRWNVQoIiBIMFQxMyoyITM0JCUyMFZdTTwmRUw5NylTKCMoTiwiIFEKK00uIiEtODdEQCwzRFksQEggICYlUy5CISMoJDFFPUY1TDtXIU05NllUKCUtRT0iIEAqJC0kNFJEQDRVISEKK000RC1POzchSTsmNVI8UiBSK0MgQCwzQEAzNiVZKCMkWS4zKCogICEgKiIsSTRXNU4zVSxALTJYUCgmOUMKK008UlhAKCRJVTtGNEAsM0RZLEAgIDg3LFooJCxAMSY1Vjk2UU88JlVFO0cwQDRWNVQoIiBIMFQxMyoyITMKK000JCUyMFZdTTwmRUw5NylTKCMoTiwiIFEuIiEtODdEQCwzRFksQEggMVQtIy5CIEgxVFk1KjIhQz42PU4KK009NyxNLEJYUCtDKCAgJiVTLkIhIygkMUU9RjVMO1chTTk2WVQoJS1FPSIgQCokLSQ0UkRANFUhITRELU8KK007NyFJOyY1UjxSIFIrQyBALDNAQDM2JVkoIyRZLjMoKiAmUUQuQiBINFQ9NSoyITM9NlkvNFJdMzVFKFQKK00oIkEsMlJUUStDIEkgICAgICAgICAgJCAgICAnICAgIEIwICAgIFVEICAgICAgICAgICAgICM9RCAgICMKK00gICAgICAgICAmTFggICAgICAgICAgICAgJyBYICAgICAgICAgICAgICRYXCAgICAqQT02IUAgICAlREoKK00gICAgICAgICAgICAgJVhAICAgICAgICAgICAgICAkICAgIlwgICArIyAgICAgRUQgICAgICAkL0IgICAKK00gIF1EICAgICAgJC9CICAgICE8XCAgICAgICAgICAgICAiOiAgICAgICAgICAgICAgJEIgICAgICAgICAKK00gICAgICVKICAgICAgICAgICAgICAoJiAgICAgICAgICAgICAgKUogICAgICAgICAgICAgICtCICAgICAKK00gICAgICAgICAtOiAgICAgICAgICAgICAgLyIgICAgICAgICAgICAgIDEqICAgICAgICAgICAgICAzNiAKK00gICAgICAgICAgICAgNSogICAgICAgICAgICAgIDZaICAgICAgICAgICAgICA4IiAgICAgICAgICAgICAKK00gOS4gICAgICAgICAgICAgIDpOICAgICAgICAgICAgICA7PiAgICAgICAgICAgICAgRSYgICAgICAgICAKK00gICAgIE4sRCAgICAgICQvQiAgICAgISQgICFZICAgICAgICAgICEkICAhWSAgICAhICAgICAhJCAgIVkKK00gICAgIyAgICBPKEQgICAgICAkL0cgICAgICEkICAhWiAgICAgICAgICAhJCAgIVogICAgISAgICAgISQKK00gICFaICAgICMgICAgUEREICAgICAgJC9MICAgICAhJCAgIVsgICAgICAgICAgISQgICFbICAgICEgICAKK00gICEkICAhWyAgICAjICAgIFIoRCAgICAgICQvUSAgICAgISQgICFdICAgICAgICAgICEkICAhXSAgICAKK00hICAgICAhJCAgIV0gICAgIyAgICBTKEQgICAgICAkL1YgICAgICEkICAhXiAgICAgICAgICAhJCAgIV4KK00gICAgISAgICAgISQgICFeICAgICMgICAgVEREICAgICAgJC9bICAgICAhJCAgIV8gICAgICAgICAgISQKK00gICFfICAgICEgICAgICEkICAhXyAgICAjICAgIFYoRCAgICAgICQwICAgICAgISQgICIhICAgICAgICAKK00gICEkICAiISAgICAhICAgICAhJCAgIiEgICAgIyAgICBXIEQgICAgICAkMCUgICAgICEkICAiIiAgICAKK00gICAgICAhJCAgIiIgICAgISAgICAgISQgICIiICAgICMgICAgWDREICAgICAgJDAqICAgICAhJCAgIiMKK00gICAgICAgICAgISQgICIjICAgICEgICAgICEkICAiIyAgICAjICAgIFlQRCAgICAgICQwLyAgICAgISQKK00gICIlICAgICAgICAgICEkICAiJSAgICAhICAgICAhJCAgIiUgICAgIyAgICBaTEQgICAgICAkMDQgICAKK00gICEkICAiJiAgICAgICAgICAhJCAgIiYgICAgISAgICAgISQgICImICAgICMgICAgXCREICAgICAgJDAKK005ICAgICAhJCAgIicgICAgICAgICAgISQgICInICAgICEgICAgICEkICAiJyAgICAjICAgIF1ERCAgICAKK00gICQwPiAgICAgISQgICIpICAgICAgICAgICEkICAiKSAgICAhICAgICAhJCAgIikgICAgJCAgICBeSEQKK00gICAgICAkMEQgICAgICEkICAiKiAgICAgICAgICAhJCAgIiogICAgISAgICAgISQgICIqICAgICQgICAKK00gX1IgICAgICAgICAgICAgISZCICAgICAgICAgICAgICEqQiAgICAgICAgICAgICAhLF4gICAgICAgICAKK00gICAgIS5OICAgICAgICAgICAgICEwRiAgICAgICAgICAgICAhMjYgICAgICAgICAgICAgITMqICAgICAKK00gICAgICAgICE1XEQgICAgICAkMEogICAgICEkICAiUiAgICAgICAgICAhJCAgIlUgICAgISAgICAgISQKK00gICJWICAgICMgICAgICEkICAiVyAgICAmICAgICAhJCAgIlkgICAgKSAgICAgISQgICJaICAgICwgICAKK00gICEkICAiWyAgICAvICAgICAhJCAgIl0gICAgMiAgICAgISQgICJeICAgIDUgICAgICEkICAiXyAgICAKK004ICAgICAhJCAgIyEgICAgOyAgICAgISQgICMiICAgID4gICAgICEkICAjIyAgICBBICAgICAhJCAgIyUKK00gICAgRCAgICAgISQgICMmICAgIEggICAgICEkICAjKSAgICBMICAgICAhJCAgIyogICAgUCAgICAgISQKK00gICMrICAgIFQgICAgICEkICAjLSAgICBYICAgICAhJCAgIy4gICAgXCAgICAgISQgICMvICAgISAgICAKK00gICEkICAjMSAgICEkICAgICAhJCAgIzIgICAhKCAgICAgISQgICMzICAgISwgICAgICEkICAjNSAgICEKK00wICAgICAhJCAgIzYgICAhNCAgICAgISQgICM3ICAgITggICAgICEkICAjOSAgICE8ICAgICAhJCAgIzoKK00gICAhQCAgICAgISQgICM8ICAgIUQgICAgICEkICAjPSAgICFIICAgICAhJCAgIz4gICAhTCAgICAgISQKK00gICNAICAgIVAgICAgICEkICAjQSAgICFUICAgICAhJCAgI0IgICAhWCAgICAgISQgICNEICAgIVwgICAKK00gICEkICAjRSAgICIgICAgICAhJCAgI0YgICAiJCAgICAgISQgICNIICAgIiggICAgICEkICAjSSAgICIKK00sICAgICAhJCAgI0ogICAiMCAgICAgISQgICNMICAgIjQgICAgICEkICAjTSAgICI4ICAgICAhJCAgI08KK00gICAiPCAgICAgISQgICNQICAgIj8gICAgICEkICAjUSAgICJCICAgICAhJCAgI1IgICAiRSAgICAgISQKK00gICNUICAgIkggICAgICEkICAjViAgICJMICAgICAhJCAgI1cgICAiUCAgICAgISQgICNXICAgIlAgICAKK00hNjxAICAgICAgICAgICAgITckQCAgICAgICAgICAgICE4LEAgICAgICAgICAgICAhOTxAICAgICAgICAKK00gICAgITooQCAgICAgICAgICAgICE7MEAgICAgICAgICAgICAhPEBAICAgICAgICAgICAgIT0kQCAgICAKK00gICAgICAgICE+JEAgICAgICAgICAgICAhPyxAICAgICAgICAgICAgIT9UQCAgICAgICAgICAgICFAWEAKK00gICAgICAgICAgICAhQiRAICAgICAgICAgICAgIUJUQCAgICAgICAgICAgICFDSEAgICAgICAgICAgICAKK00hRTRAICAgICAgICAgICAgIUdAQCAgICAgICAgICAgICFJVEAgICAgICAgICAgICAhS0RAICAgICAgICAKK00gICAgIU0oQCAgICAgICAgICAgICFPPEAgICAgICAgICAgICAhUSRAICAgICAgICAgICAgIVJAQCAgICAKK00gICAgICAgICFUTEAgICAgICAgICAgICAhVjhAICAgICAgICAgICAgIVdYQCAgICAgICAgICAgICFaKEAKK00gICAgICAgICAgICAhW1xAICAgICAgICAgICAgIV1UQCAgICAgICAgICAgICFfLEAgICAgICAgICAgICAKK00iISRAICAgICAgICAgICAgIiMkQCAgICAgICAgICAgICIkQEAgICAgICAgICAgICAiJixAICAgICAgICAKK00gICAgIigsQCAgICAgICAgICAgICIpQEAgICAgICAgICAgICAiKyRAICAgICAgICAgICAgIixcQCAgICAKK00gICAgICAgICIuNEAgICAgICAgICAgICAiL1xAICAgICAgICAgICAgIjFYQCAgICAgICAgICAgICIzOEAKK00gICAgICAgICAgICAiNFxAICAgICAgICAgICAgIjVUQCAgICAgICAgICAgICI/QEAgICAgICAgICAgICAKK00iQDBAICAgICAgICAgICAgIkk8QCAgICAgICAgICAgICJKKEAgICAgICAgICAgICAiSlRAICAgICAgICAKK00gICAgIk0kQCAgICAgICAgICAgICJOIEAgICAgICAgICAgICAiT1hAICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgICAgIDAgICAgKCAKK00gMCM0ICAgIFUgICAgISQgICAgICAgICAgICAgICAkICAgICAgICAgIjAgICAgNCAgICAiICAkIFogICAKK00gLkAgICArVCAgICAgUCAgICAgICAgICQgICAgISAgICAgXCAgICArICAgICBAICEgXVAgICAvPCAgICYKK01AICAgICAwICAgIDcgICAgISAgICAhICAgICA3ICAgICBQICAgICggIDBJPCAgICo3ICAgISdMICAgICAKK00gICAgICAgICAgJCAgICAgICAgICdQICAgIDAgICAgIiAgJC5WICAgI01AICAgICwgICAgIFAgICAgWCAKK00gICAkICAgICMgICAgIkQgICAgJCAgICAgQCAhI04wICAgW0QgICAgKSAgICAgLCAgICArICAgICEgICAKK00gIFAgICAgUyAgICAgMCAgICA4ICAwXCggICAvIiAgICAgUCAgICAgICAgICAgICAgIDAgICAgICAgICAKK00uMCAgICAkICAgICYgICQvJSAgICNRMCAgIDE8ICAgICAgICAgICAgICAgJCAgICAgICAgICNcICAgICEKK00gICAgIUAgISRXICAgIS1QICAgICMgICAgICAgICAgICAgICAhICAgICAgICAgISUgICAgIDAgICAgKCAKK00gMS4gICAgM0AgICAgIkAgICAgICAgICAgICAgICBAICAgICAgICAgMzAgICAgJCAgICAnICAoM0ogICAKK00kWkAgICAhOCAgICAgICAgICAgICAgICQgICAgISAgICAlKCAgICAhICAgICBQICIlICAgICEwICAgICAKK00jICAgICAgICAgICAgICAgISAgICAgMCAgICE3ICAgICFAICAgICwgIEEwLCAgIDQjICAgIChAICAgICQKK00gICAgICAgICAgMCAgICAoICAgIDggICAgIEAgICAgIyAgKDRGICAgJSlAICAgJyQgICAgICAgICAgICAKK00gICAoICAgICAgICAgJjQgICAgIiAgICAgICAgICAgICAhMjggICAmVCAgICAhICAgICA8ICAgICEgICAKK00gISAgICAhTSAgICAgUCAgICAgICAgICAgICA7OiAgICEpRCAgICAgICAgICAgICAgICQgICAgICAgICAKK009MCAgICAsICAgICAgICAgICAgICggJCAgICIpICAgICAgICAgICAgICAgISAgICAgICAgICgwICAgICMKK00gICAgICAgICAgICAgIiIqICAgKyMgICAgICAgICAgICAgICAgMCAgICAgICAgIi0gICAgIFAgICAgICAKK00gICAgICAgS0VAICAgKyggICAgICAgICAgICAgICAkICAgICAgICAgRVAgICAgJCAgICAgICAgICAgICAKK00rJEAgICAlKSAgICAgICAgICAgICAgICEgICAgICAgICAqICAgICAhICAgICAgICAgICAgICJWNCAgICAKK004ICAgICAgICAgICAgICAgISAgICAgUCAgICJMICAgICAwICAgICAgICAgICAgIE1dICAgIi1QICAgICAKKywgICAgICAgICAgMCAgICAsCisgCitlbmQKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3MuaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTRjMTYyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zcy5oCkBAIC0wLDAgKzEsNCBAQAorc3RydWN0IHMgeworICBpbnQgYTsKKyAgaW50IGI7Cit9OwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zdGVwLXRlc3QuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3RlcC10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzMDcyNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3RlcC10ZXN0LmMKQEAgLTAsMCArMSw1OCBAQAorLyogVGVzdCB2YXJpb3VzIGtpbmRzIG9mIHN0ZXBwaW5nLgorKi8KK2ludCBnbG9iID0gMDsKKworaW50IGNhbGxlZSgpIHsKKyAgICBnbG9iKys7ICAgCit9CisKKy8qIEEgc3RydWN0dXJlIHdoaWNoLCB3ZSBob3BlLCB3aWxsIG5lZWQgdG8gYmUgcGFzc2VkIHVzaW5nIG1lbWNweS4gICovCitzdHJ1Y3QgcmhvbWJvaWRhbCB7CisgIGludCByYXRoZXJfbGFyZ2VbMTAwXTsKK307CisKK3ZvaWQKK2xhcmdlX3N0cnVjdF9ieV92YWx1ZSAoc3RydWN0IHJob21ib2lkYWwgcikKK3sKKyAgZ2xvYiArPSByLnJhdGhlcl9sYXJnZVs0Ml07IC8qIHN0ZXAtdGVzdC5leHA6IGFycml2ZSBoZXJlIDEgKi8KK30KKworaW50IG1haW4gKCkgeworICAgaW50IHcseCx5LHo7CisgICBpbnQgYVsxMF0sIGJbMTBdOworCisgICAvKiBUZXN0ICJuZXh0IiBhbmQgInN0ZXAiICovCisgICB3ID0gMDsKKyAgIHggPSAxOworICAgeSA9IDI7CisgICB6ID0gMzsKKyAgIHcgPSB3ICsgMjsKKyAgIHggPSB4ICsgMzsKKyAgIHkgPSB5ICsgNDsKKyAgIHogPSB6ICsgNTsKKworICAgLyogVGVzdCB0aGF0ICJuZXh0IiBnb2VzIG92ZXIgYSBjYWxsICovCisgICBjYWxsZWUoKTsgLyogT1ZFUiAqLworCisgICAvKiBUZXN0IHRoYXQgInN0ZXAiIGRvZXNuJ3QgKi8KKyAgIGNhbGxlZSgpOyAvKiBJTlRPICovCisKKyAgIC8qIFRlc3QgInN0ZXBpIiAqLworICAgYVs1XSA9IGFbM10gLSBhWzRdOworICAgY2FsbGVlKCk7IC8qIFNURVBJICovCisgICAKKyAgIC8qIFRlc3QgIm5leHRpIiAqLworICAgY2FsbGVlKCk7IC8qIE5FWFRJICovCisKKyAgIHkgPSB3ICsgejsKKworICAgeworICAgICBzdHJ1Y3QgcmhvbWJvaWRhbCByOworICAgICBtZW1zZXQgKHIucmF0aGVyX2xhcmdlLCAwLCBzaXplb2YgKHIucmF0aGVyX2xhcmdlKSk7CisgICAgIHIucmF0aGVyX2xhcmdlWzQyXSA9IDEwOworICAgICBsYXJnZV9zdHJ1Y3RfYnlfdmFsdWUgKHIpOyAgLyogc3RlcC10ZXN0LmV4cDogbGFyZ2Ugc3RydWN0IGJ5IHZhbHVlICovCisgICB9CisKKyAgIGV4aXQgKDApOworfQorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3N0ZXAtdGVzdC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3N0ZXAtdGVzdC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE1NzE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3RlcC10ZXN0LmV4cApAQCAtMCwwICsxLDE1MyBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyB1c2UgdGhpcyB0byBkZWJ1ZzoKKyMKKyNsb2dfdXNlciAxCisKKyMgc3RlcC10ZXN0LmV4cCAtLSBFeHBlY3Qgc2NyaXB0IHRvIHRlc3Qgc3RlcHBpbmcgaW4gZ2RiCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgdGVzdGZpbGUgc3RlcC10ZXN0CitzZXQgc3JjZmlsZSAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworcmVtb3RlX2V4ZWMgYnVpbGQgInJtIC1mICR7YmluZmlsZX0iCitpZiB7IFtnZGJfY29tcGlsZSAiJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgIGZhaWwgIkNhbid0IHJ1biB0byBtYWluIgorICAgcmV0dXJuIDAKK30KKworIyBWYW5pbGxhIHN0ZXAvbmV4dAorIworZ2RiX3Rlc3QgIm5leHQiICIuKiR7ZGVjaW1hbH0uKnggPSAxOy4qIiAibmV4dCAxIgorZ2RiX3Rlc3QgInN0ZXAiICIuKiR7ZGVjaW1hbH0uKnkgPSAyOy4qIiAic3RlcCAxIgorCisjIFdpdGggY291bnQKKyMKK2dkYl90ZXN0ICJuZXh0IDIiICIuKiR7ZGVjaW1hbH0uKncgPSB3LioyOy4qIiAibmV4dCAyIgorZ2RiX3Rlc3QgInN0ZXAgMyIgIi4qJHtkZWNpbWFsfS4qeiA9IHouKjU7LioiICJzdGVwIDMiCitnZGJfdGVzdCAibmV4dCIgIi4qJHtkZWNpbWFsfS4qY2FsbGVlLipPVkVSLioiICJuZXh0IDMiCisKKyMgU3RlcCBvdmVyIGNhbGwKKyMKK2dkYl90ZXN0ICJuZXh0IiAiLioke2RlY2ltYWx9LipjYWxsZWUuKklOVE8uKiIgIm5leHQgb3ZlciIKKworIyBTdGVwIGludG8gY2FsbAorIworZ2RiX3Rlc3QgInN0ZXAiICIuKiR7ZGVjaW1hbH0uKmdsb2IuKiIgICAic3RlcCBpbnRvIgorCisjIFN0ZXAgb3V0IG9mIGNhbGwKKyMKKyMgSSB3b25kZXIgaWYgdGhpcyBpcyByZWFsbHkgcG9ydGFibGUuICBBcmUgdGhlcmUgYW55IGNhbGxlci1zYXZlcworIyBwbGF0Zm9ybXMsIG9uIHdoaWNoIGBmaW5pc2gnIHdpbGwgcmV0dXJuIHlvdSB0byBzb21lIGtpbmQgb2YgcG9wCisjIGluc3RydWN0aW9uLCB3aGljaCBpcyBhdHRyaWJ1dGVkIHRvIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uCisjIGNhbGw/CitnZGJfdGVzdCAiZmluaXNoIiAiLioke2RlY2ltYWx9LiphLio1Lio9IGEuKjMuKiIgInN0ZXAgb3V0IgorCisjIyMgVGVzdGluZyBuZXh0aSBhbmQgc3RlcGkuCisjIyMKKyMjIyB0ZXN0X2kgTkFNRSBDT01NQU5EIEhFUkUgVEhFUkUKKyMjIworIyMjIFNlbmQgQ09NTUFORCB0byBnZGIgb3ZlciBhbmQgb3Zlciwgd2hpbGUgdGhlIG91dHB1dCBtYXRjaGVzIHRoZQorIyMjIHJlZ2V4cCBIRVJFLCBmb2xsb3dlZCBieSB0aGUgZ2RiIHByb21wdC4gIFBhc3MgaWYgdGhlIG91dHB1dAorIyMjIGV2ZW50dWFsbHkgbWF0Y2hlcyB0aGUgcmVnZXhwIFRIRVJFLCBmb2xsb3dlZCBieSB0aGUgZ2RiIHByb21wdDsKKyMjIyBmYWlsIGlmIHdlIGhhdmUgdG8gaXRlcmF0ZSBtb3JlIHRoYW4gYSBodW5kcmVkIHRpbWVzLCB3ZSB0aW1lIG91dAorIyMjIHRhbGtpbmcgdG8gZ2RiLCBvciB3ZSBnZXQgb3V0cHV0IHdoaWNoIGlzIG5laXRoZXIgSEVSRSBub3IgVEhFUkUuICA6KQorIyMjCisjIyMgVXNlIE5BTUUgYXMgdGhlIG5hbWUgb2YgdGhlIHRlc3QuCisjIyMKKyMjIyBUaGUgZXhhY3QgcmVnZXhwcyB1c2VkIGFyZSAiJEhFUkUuKiRnZGJfcHJvbXB0ICQiCisjIyMgICAgICAgICAgICAgICAgICAgICAgICBhbmQgIiRUSEVSRS4qJGdkYl9wcm9tcHQgJCIKKyMjIyAKK3Byb2MgdGVzdF9pIHtuYW1lIGNvbW1hbmQgaGVyZSB0aGVyZX0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgCisgICAgc2V0IGkgMAorICAgIHdoaWxlIDEgeworCXNlbmRfZ2RiICIke2NvbW1hbmR9XG4iCisJZ2RiX2V4cGVjdCB7CisJICAgIC1yZSAiJGhlcmUuKiRnZGJfcHJvbXB0ICQiIHsKKwkJIyBPa2F5LCB3ZSdyZSBzdGlsbCBvbiB0aGUgc2FtZSBsaW5lLiAgSnVzdCBzdGVwIGFnYWluLgorCSAgICB9CisJICAgIC1yZSAiJHRoZXJlLiokZ2RiX3Byb21wdCAkIiB7CisJCSMgV2UndmUgcmVhY2hlZCB0aGUgbmV4dCBsaW5lLiAgUmFoLgorCQlwYXNzICIkbmFtZSIKKwkJcmV0dXJuCisJICAgIH0KKwkgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7CisJCSMgV2UgZ290IHNvbWV0aGluZyBlbHNlLiAgRmFpbC4KKwkJZmFpbCAiJG5hbWUiCisJCXJldHVybgorCSAgICB9CisJICAgIHRpbWVvdXQgeworCQlmYWlsICIkbmFtZSAodGltZW91dCkiCisJCXJldHVybgorCSAgICB9CisJfQorCisJIyBIYXZlIHdlIGdvbmUgZm9yIHRvbyBtYW55IHN0ZXBzIHdpdGhvdXQgc2VlaW5nIGFueSBwcm9ncmVzcz8KKwlpZiB7W2luY3IgaV0gPj0gMTAwfSB7CisJICAgIGZhaWwgIiRuYW1lIChubyBwcm9ncmVzcyBhZnRlciAxMDAgc3RlcHMpIgorCSAgICByZXR1cm4KKwl9CisgICAgfQorfQorCit0ZXN0X2kgInN0ZXBpIHRvIG5leHQgbGluZSIgInN0ZXBpIiBcCisgICAgICAgIi4qJHtkZWNpbWFsfS4qYS4qNS4qID0gYS4qMyIgXAorICAgICAgICIuKiR7ZGVjaW1hbH0uKmNhbGxlZS4qU1RFUEkiCit0ZXN0X2kgInN0ZXBpIGludG8gZnVuY3Rpb24iICJzdGVwaSIgXAorICAgICAgICIuKiR7ZGVjaW1hbH0uKmNhbGxlZS4qU1RFUEkiIFwKKyAgICAgICAiLipjYWxsZWUgXFwoXFwpIGF0IC4qc3RlcC10ZXN0XFwuYyIKK2dkYl90ZXN0ICJmaW5pc2giICAiLioke2RlY2ltYWx9LipjYWxsZWUuKk5FWFRJLioiICJzdGVwaTogZmluaXNoIGNhbGwiCit0ZXN0X2kgIm5leHRpIG92ZXIgZnVuY3Rpb24iICJuZXh0aSIgXAorICAgICAgICIuKiR7ZGVjaW1hbH0uKmNhbGxlZS4qTkVYVEkiIFwKKyAgICAgICAiLioke2RlY2ltYWx9Lip5ID0gdyBcXCsgejsiCisKKyMgT24gc29tZSBwbGF0Zm9ybXMsIGlmIHdlIHRyeSB0byBzdGVwIGludG8gYSBmdW5jdGlvbiBjYWxsIHRoYXQKKyMgcGFzc2VzIGEgbGFyZ2Ugc3RydWN0dXJlIGJ5IHZhbHVlLCB0aGVuIHdlIGFjdHVhbGx5IGVuZCB1cCBzdGVwcGluZworIyBpbnRvIG1lbWNweSwgYmNvcHksIG9yIHNvbWUgc3VjaCAtLS0gR0NDIGVtaXRzIHRoZSBjYWxsIHRvIHBhc3MgdGhlCisjIGFyZ3VtZW50LiAgT3BpbmlvbiBpcyBiaXR0ZXJseSBkaXZpZGVkIGFib3V0IHdoZXRoZXIgdGhpcyBpcyB0aGUKKyMgcmlnaHQgYmVoYXZpb3IgZm9yIEdEQiBvciBub3QsIGJ1dCB3ZSdsbCBjYXRjaCBpdCBoZXJlLCBzbyBmb2xrcworIyB3b24ndCBmb3JnZXQgYWJvdXQgaXQuCisKK3NlbmRfZ2RiICJicmVhayBbZ2RiX2dldF9saW5lX251bWJlciAic3RlcC10ZXN0LmV4cDogbGFyZ2Ugc3RydWN0IGJ5IHZhbHVlIl1cbiIKK2dkYl90ZXN0ICJjb250aW51ZSIgXAorICAgICAgICAgIi4qQnJlYWtwb2ludCAke2RlY2ltYWx9LC4qbGFyZ2Vfc3RydWN0X2J5X3ZhbHVlLioiIFwKKwkgInJ1biB0byBwYXNzIGxhcmdlIHN0cnVjdCIKK2dkYl90ZXN0ICJzdGVwIiBcCisgICAgICAgICAiLipzdGVwLXRlc3QuZXhwOiBhcnJpdmUgaGVyZSAxLioiIFwKKyAgICAgICAgICJsYXJnZSBzdHJ1Y3QgYnkgdmFsdWUiCisKK2dkYl90ZXN0ICJjb250aW51ZSIgIi4qUHJvZ3JhbSBleGl0ZWQgbm9ybWFsbHkuKiIgInJ1biB0byBmaW5pc2giCisKK3JldHVybiAwCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3N0cnVjdHMyLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3N0cnVjdHMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmNTllOQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3RydWN0czIuYwpAQCAtMCwwICsxLDM4IEBACisvKiBwciAxMzUzNiAqLworCitzdGF0aWMgdm9pZCBwYXJhbV9yZWcgKHJlZ2lzdGVyIGNoYXIgcHJfY2hhciwKKwkJICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgcHJfdWNoYXIsCisJCSAgICAgICByZWdpc3RlciBzaG9ydCBwcl9zaG9ydCwKKwkJICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIHNob3J0IHByX3VzaG9ydCk7CisKK2ludCBia3B0OworCitpbnQKK21haW4gKCkKK3sKKyNpZmRlZiB1c2VzdHVicworICBzZXRfZGVidWdfdHJhcHMgKCk7CisgIGJyZWFrcG9pbnQgKCk7CisjZW5kaWYKKworICBia3B0ID0gMDsKKyAgcGFyYW1fcmVnICgxMjAsIDEzMCwgMzIwMDAsIDMzMDAwKTsKKyAgcGFyYW1fcmVnICgxMzAsIDEyMCwgMzMwMDAsIDMyMDAwKTsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHVtbXkgKCkge30KKworc3RhdGljIHZvaWQKK3BhcmFtX3JlZyhyZWdpc3RlciBjaGFyIHByX2NoYXIsCisJICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIHByX3VjaGFyLAorCSAgcmVnaXN0ZXIgc2hvcnQgcHJfc2hvcnQsCisJICByZWdpc3RlciB1bnNpZ25lZCBzaG9ydCBwcl91c2hvcnQpCit7CisgIGJrcHQgPSAxOworICBkdW1teSAoKTsKKyAgcHJfY2hhciA9IDE7CisgIHByX3VjaGFyID0gcHJfc2hvcnQgPSBwcl91c2hvcnQgPSAxOworICBkdW1teSAoKTsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3RydWN0czIuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9zdHJ1Y3RzMi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ2NTJiZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3RydWN0czIuZXhwCkBAIC0wLDAgKzEsNzkgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCBwcm90b3R5cGVzIDEKK3NldCB0ZXN0ZmlsZSAic3RydWN0czIiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKKyMgYnVpbGQgdGhlIGZpcnN0IHRlc3QgY2FzZQoraWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICMgYnVpbHQgdGhlIHNlY29uZCB0ZXN0IGNhc2Ugc2luY2Ugd2UgY2FuJ3QgdXNlIHByb3RvdHlwZXMKKyAgICB3YXJuaW5nICJQcm90b3R5cGVzIG5vdCBzdXBwb3J0ZWQsIHJlYnVpbGRpbmcgd2l0aCAtRE5PX1BST1RPVFlQRVMiCisgICAgaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1ZyBhZGRpdGlvbmFsX2ZsYWdzPS1ETk9fUFJPVE9UWVBFU31dICE9ICIiIH0geworCWdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorICAgIH0KKyAgICBzZXQgcHJvdG90eXBlcyAwCit9CisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworZ2RiX3Rlc3QgInNldCB3aWR0aCAwIiAiIiAiIgorCitpZiB7ICFbcnVudG9fbWFpbl0gfSB0aGVuIHsKKyAgICBnZGJfc3VwcHJlc3NfdGVzdHMKK30KKworIyBPaywgd2UncmUgZmluYWxseSByZWFkeSB0byBhY3R1YWxseSBkbyBvdXIgdGVzdHMuCisKK3NldCBwcm1zX2lkIDEzNTM2CitzZXQgYnVnX2lkIDAKKworZ2RiX3Rlc3QgImYiIFwKKyAgICAiLipia3B0ID0gMC4qIiBcCisgICAgInN0cnVjdHMyIHNhbml0eSBjaGVjayIKKworZ2RiX3Rlc3QgImJyZWFrIHBhcmFtX3JlZyIgXAorICAgICJCcmVha3BvaW50IC4qIGF0IC4qIiBcCisgICAgInN0cnVjdHMyIGJyZWFrcG9pbnQgc2V0IgorCitnZGJfdGVzdCAiY29udGludWUiIFwKKyAgICAiLipwcl9jaGFyPTEyMC4qcHJfdWNoYXI9MTMwLipwcl9zaG9ydD0zMjAwMC4qcHJfdXNob3J0PTMzMDAwLipia3B0ID0gMS4qIiBcCisgICAgInN0cnVjdHMyIGNvbnRpbnVlMSIKKworZ2RiX3Rlc3QgImNvbnRpbnVlIiBcCisgICAgIi4qcHJfY2hhcj0tMTI2Lipwcl91Y2hhcj0xMjAuKnByX3Nob3J0PS0zMjUzNi4qcHJfdXNob3J0PTMyMDAwLipia3B0ID0gMS4qIiBcCisgICAgInN0cnVjdHMyIGNvbnRpbnVlMiIKKworIyBFbmQgb2YgdGVzdHMuCisKK2dkYl9zdG9wX3N1cHByZXNzaW5nX3Rlc3RzCisKK3JldHVybiAwCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3Rlcm0uZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS90ZXJtLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTFhOTRjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS90ZXJtLmV4cApAQCAtMCwwICsxLDczIEBACisjICAgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUm9iIFNhdm95ZS4gKHJvYkBjeWdudXMuY29tKQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworIyBUaGlzIG9ubHkgd29ya3MgZm9yIG5hdGl2ZSwgSSB0aGluay4KK2lmICFbaXNuYXRpdmVdIHRoZW4geworICAgIGNvbnRpbnVlCit9CisKK2dkYl9zdGFydAorCisjCisjIHRlc3QgcnVubmluZyBwcm9ncmFtcworIworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAicnVuIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQoraWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworZGVsZXRlX2JyZWFrcG9pbnRzCitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworZ2RiX3Rlc3QgInNldCBwcmludCBzZXZlbmJpdC1zdHJpbmdzIiAiIiAidGVzdCBzZXQgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncyIKK2dkYl90ZXN0ICJzZXQgcHJpbnQgYWRkcmVzcyBvZmYiICIiICJ0ZXN0IHNldCBwcmludCBhZGRyZXNzIG9mZiIKK2dkYl90ZXN0ICJzZXQgd2lkdGggMCIgIiIgInRlc3Qgc2V0IHdpZHRoIDAiCitnZGJfdGVzdCAiaW5mbyB0ZXJtaW5hbCIgIk5vIHNhdmVkIHRlcm1pbmFsIGluZm9ybWF0aW9uLioiICJ0ZXN0IGluZm8gdGVybWluYWwiCitnZGJfcnVuX2NtZCA1CitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qMTIwLipQcm9ncmFtIGV4aXRlZCBub3JtYWxseS4qJGdkYl9wcm9tcHQgJCIgeworCWdkYl90ZXN0ICJpbmZvIHRlcm1pbmFsIiAiTm8gc2F2ZWQgdGVybWluYWwgaW5mb3JtYXRpb24uKiIgInRlc3QgaW5mbyB0ZXJtaW5hbCAjMiIKKyAgICB9CisgICAgZGVmYXVsdCB7CisJZmFpbCAidGVybS5leHAsIGZhY3RvcmlhbCBkaWRuJ3QgcnVuIHRvIGNvbXBsZXRpb24gZm9yIGluZm8gdGVybWluYWwiCisgICAgfQorfQorCisjIEluIG1pZC1leGVjdXRpb24KK2dkYl9icmVha3BvaW50IG1haW4KK2dkYl9ydW5fY21kIDUKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipCcmVha3BvaW50IFxbMC05XF0rLC4qbWFpbi4qaWYgLmFyZ2MgIT0gMi4qJGdkYl9wcm9tcHQgJCIgeworCWdkYl90ZXN0ICJpbmZvIHRlcm1pbmFsIiAiSW5mZXJpb3IncyB0ZXJtaW5hbCBzdGF0dXMgLmN1cnJlbnRseSBzYXZlZCBieSBHREIuOi4qIiAiaW5mbyB0ZXJtaW5hbCBhdCBicmVha3BvaW50IgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJpbmZvIHRlcm1pbmFsIGF0IGJyZWFrcG9pbnQiIH0KKyAgICB0aW1lb3V0CQl7IGZhaWwgIih0aW1lb3V0KSBpbmZvIHRlcm1pbmFsIGF0IGJyZWFrcG9pbnQiIH0KK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvdHdpY2UuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvdHdpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTBhMmIzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS90d2ljZS5jCkBAIC0wLDAgKzEsMTkgQEAKK2ludCBub3RoaW5nICgpCisKK3sKKyAgICBpbnQgeCA9IDMgOworICAgIHJldHVybiB4IDsKK30KKworCittYWluICgpCisKK3sKKyAgICBpbnQgeSA7CisjaWZkZWYgdXNlc3R1YnMKKyAgICBzZXRfZGVidWdfdHJhcHMoKTsKKyAgICBicmVha3BvaW50KCk7CisjZW5kaWYgICAgCisgICAgeSA9IG5vdGhpbmcgKCkgOworICAgIHByaW50ZiAoImhlbGxvXG4iKSA7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3R3aWNlLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvdHdpY2UuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOGM0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3R3aWNlLmV4cApAQCAtMCwwICsxLDYzIEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSB0d2ljZS10bXAKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KK3NldCBvcHRpb25zIGRlYnVnCitsYXBwZW5kIG9wdGlvbnMgImFkZGl0aW9uYWxfZmxhZ3M9LUkuIgorCitzZXQgZmlsZWlkIFtvcGVuICR7b2JqZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSB3XTsKK3B1dHMgJGZpbGVpZCAiI2luY2x1ZGUgXCJ0d2ljZS5jXCIiOworY2xvc2UgJGZpbGVpZDsKKworcmVtb3RlX2Rvd25sb2FkIGhvc3QgJHtzcmNkaXJ9LyR7c3ViZGlyfS90d2ljZS5jIHR3aWNlLmMKKworaWYgIHsgW2dkYl9jb21waWxlICIke29iamRpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlICRvcHRpb25zXSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAkYmluZmlsZQorCitpZiBbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgIyBUZXN0IHRoYXQgR0RCIGNhbiBzdGlsbCBkZXRlY3Qgd2hldGhlciB3ZSBoYXZlIGxpbmUgbnVtYmVycworICAgICMgZXZlbiBpZiB3ZSdyZSBleGVjdXRpbmcgY29kZSBpbiBhbiBpbmNsdWRlIGZpbGUuCisKKyAgICAjIFRoZSBidWcgd2FzIGZpeGVkIGJ5CisgICAgI1R1ZSBKdW4gMjkgMTE6MDI6NTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisgICAgIworICAgICMJKiBpbmZydW4uYyAod2FpdF9mb3JfaW5mZXJpb3IpOiBVc2UgZmluZF9wY19saW5lIG5vdAorICAgICMJZmluZF9wY19zeW10YWIgdG8gY2hlY2sgd2hldGhlciB0aGVyZSBpcyBsaW5lIG51bWJlcgorICAgICMJaW5mb3JtYXRpb24uCisKKyAgICBnZGJfdGVzdCAic3RlcCIgIm5vdGhpbmcgXFwoXFwpIGF0LioiCit9CityZXR1cm4gMApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS92YXJhcmdzLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3ZhcmFyZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjlkN2RmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS92YXJhcmdzLmMKQEAgLTAsMCArMSwxMDggQEAKKy8qIHZhcmFyZ3MuYyAtIAorICogKEFkZGVkIGFzIHBhcnQgb2YgZml4IGZvciBidWcgMTUzMDYgLSAiY2FsbCIgdG8gdmFyYXJncyBmdW5jdGlvbnMgZmFpbHMpCisgKiBUaGlzIHByb2dyYW0gaXMgaW50ZW5kZWQgdG8gbGV0IG1lIHRyeSBvdXQgImNhbGwiIHRvIHZhcmFyZ3MgZnVuY3Rpb25zCisgKiB3aXRoIHZhcnlpbmcgbnVtYmVycyBvZiBkZWNsYXJlZCBhcmdzIGFuZCB2YXJpb3VzIGFyZ3VtZW50IHR5cGVzLgorICogLSBSVCA5LzI3Lzk1CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK2ludCBmaW5kX21heDEoaW50LCAuLi4pOworaW50IGZpbmRfbWF4MihpbnQsIGludCwgLi4uKTsKK2RvdWJsZSBmaW5kX21heF9kb3VibGUoaW50LCBkb3VibGUsIC4uLik7CisKK2NoYXIgY2g7Cit1bnNpZ25lZCBjaGFyIHVjOworc2hvcnQgczsKK3Vuc2lnbmVkIHNob3J0IHVzOworaW50IGEsYixjLGQ7CitpbnQgbWF4X3ZhbDsKK2Zsb2F0IGZhLGZiLGZjLGZkOworZG91YmxlIGRhLGRiLGRjLGRkOworZG91YmxlIGRtYXhfdmFsOworCittYWluKCkgeworICBjID0gLTE7CisgIHVjID0gMTsKKyAgcyA9IC0yOworICB1cyA9IDI7CisgIGEgPSAxOworICBiID0gNjA7CisgIG1heF92YWwgPSBmaW5kX21heDEoMSwgNjApOworICBtYXhfdmFsID0gZmluZF9tYXgxKGEsIGIpOworICBhID0gMzsKKyAgYiA9IDE7CisgIGMgPSA0OworICBkID0gMjsKKyAgbWF4X3ZhbCA9IGZpbmRfbWF4MSgzLCAxLCA0LCAyKTsKKyAgbWF4X3ZhbCA9IGZpbmRfbWF4MihhLCBiLCBjLCBkKTsKKyAgZGEgPSAzLjA7CisgIGRiID0gMS4wOworICBkYyA9IDQuMDsKKyAgZGQgPSAyLjA7CisgIGRtYXhfdmFsID0gZmluZF9tYXhfZG91YmxlKDMsIDEuMCwgNC4wLCAyLjApOworICBkbWF4X3ZhbCA9IGZpbmRfbWF4X2RvdWJsZShhLCBkYiwgZGMsIGRkKTsKK30KKworLyogSW50ZWdlciB2YXJhcmdzLCAxIGRlY2xhcmVkIGFyZyAqLworCitpbnQgZmluZF9tYXgxKGludCBudW1fdmFscywgLi4uKSB7CisgIGludCBtYXhfdmFsID0gMDsKKyAgaW50IHg7CisgIGludCBpOworICB2YV9saXN0IGFyZ3A7CisgIHZhX3N0YXJ0KGFyZ3AsIG51bV92YWxzKTsKKyAgcHJpbnRmKCJmaW5kX21heCglZCwiLCBudW1fdmFscyk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fdmFsczsgaSsrKSB7CisgICAgeCA9IHZhX2FyZyhhcmdwLCBpbnQpOworICAgIGlmIChtYXhfdmFsIDwgeCkgbWF4X3ZhbCA9IHg7CisgICAgaWYgKGkgPCBudW1fdmFscyAtIDEpCisgICAgICBwcmludGYoIiAlZCwiLCB4KTsKKyAgICBlbHNlCisgICAgICBwcmludGYoIiAlZCkiLCB4KTsKKyAgfQorICBwcmludGYoIiByZXR1cm5zICVkXG4iLCBtYXhfdmFsKTsKKyAgcmV0dXJuIG1heF92YWw7Cit9CisKKy8qIEludGVnZXIgdmFyYXJncywgMiBkZWNsYXJlZCBhcmdzICovCisKK2ludCBmaW5kX21heDIoaW50IG51bV92YWxzLCBpbnQgZmlyc3RfdmFsLCAuLi4pIHsKKyAgaW50IG1heF92YWwgPSAwOworICBpbnQgeDsKKyAgaW50IGk7CisgIHZhX2xpc3QgYXJncDsKKyAgdmFfc3RhcnQoYXJncCwgZmlyc3RfdmFsKTsKKyAgeCA9IGZpcnN0X3ZhbDsKKyAgaWYgKG1heF92YWwgPCB4KSBtYXhfdmFsID0geDsKKyAgcHJpbnRmKCJmaW5kX21heCglZCwgJWQiLCBudW1fdmFscywgZmlyc3RfdmFsKTsKKyAgZm9yIChpID0gMTsgaSA8IG51bV92YWxzOyBpKyspIHsKKyAgICB4ID0gdmFfYXJnKGFyZ3AsIGludCk7CisgICAgaWYgKG1heF92YWwgPCB4KSBtYXhfdmFsID0geDsKKyAgICBwcmludGYoIiwgJWQiLCB4KTsKKyAgfQorICBwcmludGYoIikgcmV0dXJucyAlZFxuIiwgbWF4X3ZhbCk7CisgIHJldHVybiBtYXhfdmFsOworfQorCisvKiBEb3VibGUtZmxvYXQgdmFyYXJncywgMiBkZWNsYXJlZCBhcmdzICovCisKK2RvdWJsZSBmaW5kX21heF9kb3VibGUoaW50IG51bV92YWxzLCBkb3VibGUgZmlyc3RfdmFsLCAuLi4pIHsKKyAgZG91YmxlIG1heF92YWwgPSAwOworICBkb3VibGUgeDsKKyAgaW50IGk7CisgIHZhX2xpc3QgYXJncDsKKyAgdmFfc3RhcnQoYXJncCwgZmlyc3RfdmFsKTsKKyAgeCA9IGZpcnN0X3ZhbDsKKyAgaWYgKG1heF92YWwgPCB4KSBtYXhfdmFsID0geDsKKyAgcHJpbnRmKCJmaW5kX21heCglZiwgJWYiLCBudW1fdmFscywgZmlyc3RfdmFsKTsKKyAgZm9yIChpID0gMTsgaSA8IG51bV92YWxzOyBpKyspIHsKKyAgICB4ID0gdmFfYXJnKGFyZ3AsIGRvdWJsZSk7CisgICAgaWYgKG1heF92YWwgPCB4KSBtYXhfdmFsID0geDsKKyAgICBwcmludGYoIiwgJWYiLCB4KTsKKyAgfQorICBwcmludGYoIikgcmV0dXJucyAlZlxuIiwgbWF4X3ZhbCk7CisgIHJldHVybiBtYXhfdmFsOworfQorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3ZhcmFyZ3MuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS92YXJhcmdzLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjU0OGIyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS92YXJhcmdzLmV4cApAQCAtMCwwICsxLDEzOSBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRWxlbmEgWmFubm9uaSAoZXphbm5vbmlAY3lnbnVzLmNvbSkKKworCisjIHRoaXMgZmlsZSB0ZXN0cyBjb21tYW5kIGxpbmUgY2FsbHMgd2l0aCBmdW5jdGlvbnMgaGF2aW5nIHZhcmlhYmxlCisjIGFyZ3MgbGlzdAorIyBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlOiB2YXJhcmdzLmMKKworI3ByaW50IGZpbmRfbWF4MSg1LDEsMiwzLDQsNSkKKyNwcmludCBmaW5kX21heDEoMSwzKQorI2NhbGwgZmluZF9tYXgxKDEwLDEsMiwzLDQsNSw2LDcsOCwyOSwwKQorI3ByaW50IGZpbmRfbWF4MigzLDEsMiwzKQorI3ByaW50IGZpbmRfbWF4X2RvdWJsZSg1LDEuMCwxNy4wLDIuMCwzLjAsNC4wKQorI3F1aXQKKworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgcHJvdG90eXBlcyAwCitzZXQgdGVzdGZpbGUgInZhcmFyZ3MiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9XSB7CisgICAgcmV0dXJuIC0xCit9CisKK2lmIHskZ2NjX2NvbXBpbGVkID09IDB9IHsKKyAgICBpZiBbaXN0YXJnZXQgImhwcGEqLWhwLWhwdXgqIl0gdGhlbiB7CisJc2V0IGFkZGl0aW9uYWxfZmxhZ3MgImFkZGl0aW9uYWxfZmxhZ3M9LUFlIgorICAgIH0gZWxzZSB7CisJIyBkb24ndCBrbm93IHdoYXQgdGhlIGNvbXBpbGVyIGlzLCBob3BlIGZvciB0aGUgYmVzdCwgbWF5YmUgaXQncyBBTlNJLi4uCisJc2V0IGFkZGl0aW9uYWxfZmxhZ3MgIiIKKyAgICB9Cit9IGVsc2UgeworICAgIHNldCBhZGRpdGlvbmFsX2ZsYWdzICIiCit9CisKKyMgYnVpbGQgdGhlIGZpcnN0IHRlc3QgY2FzZQorI2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSBbbGlzdCBkZWJ1ZyAkYWRkaXRpb25hbF9mbGFnc11dICE9ICIiIH0geworIyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCisjfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUgW2xpc3QgZGVidWcgJGFkZGl0aW9uYWxfZmxhZ3NdXSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CitzZW5kX2dkYiAic2V0IHByaW50IHNldmVuYml0LXN0cmluZ3NcbiIgOyBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKK3NlbmRfZ2RiICJzZXQgcHJpbnQgYWRkcmVzcyBvZmZcbiIgOyBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKK3NlbmRfZ2RiICJzZXQgd2lkdGggMFxuIiA7IGdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIgorCisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgcGVycm9yICJjb3VsZG4ndCBydW4gdG8gYnJlYWtwb2ludCIKKyAgICBjb250aW51ZQorfQorCisKK3NlbmRfZ2RiICJwcmludCBmaW5kX21heDEoNSwxLDIsMyw0LDUpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qZmluZF9tYXhcXCg1LCAxLCAyLCAzLCA0LCA1XFwpIHJldHVybnMgNVxbIFxyXG5cXSsuXFswLTlcXSsgPSA1LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IGZpbmRfbWF4MSg1LDEsMiwzLDQsNSkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZmluZF9tYXgxKDUsMSwyLDMsNCw1KSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGZpbmRfbWF4MSg1LDEsMiwzLDQsNSkiIH0KKyAgfQorCisKKworCitzZW5kX2dkYiAicHJpbnQgZmluZF9tYXgxKDEsMylcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipmaW5kX21heFxcKDEsIDNcXCkgcmV0dXJucyAzXFsgXHJcblxdKy5cWzAtOVxdKyA9IDMuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgZmluZF9tYXgxKDEsMykiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZmluZF9tYXgxKDEsMykiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBmaW5kX21heDEoMSwzKSIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IGZpbmRfbWF4MSgxMCwxLDIsMyw0LDUsNiw3LDgsMjksMClcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipmaW5kX21heFxcKDEwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCAyOSwgMFxcKSByZXR1cm5zIDI5XFsgXHJcblxdKy5cWzAtOVxdKyA9IDI5LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IGZpbmRfbWF4MSgxMCwxLDIsMyw0LDUsNiw3LDgsMjksMCkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZmluZF9tYXgxKDEwLDEsMiwzLDQsNSw2LDcsOCwyOSwwKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGZpbmRfbWF4MSgxMCwxLDIsMyw0LDUsNiw3LDgsMjksMCkiIH0KKyAgfQorCisKKworc2VuZF9nZGIgInByaW50IGZpbmRfbWF4MigzLDEsMiwzKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKmZpbmRfbWF4XFwoMywgMSwgMiwgM1xcKSByZXR1cm5zIDNcWyBcclxuXF0rLlxbMC05XF0rID0gMy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBmaW5kX21heDIoMywxLDIsMykiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZmluZF9tYXgyKDMsMSwyLDMpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgZmluZF9tYXgyKDMsMSwyLDMpIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgZmluZF9tYXhfZG91YmxlKDUsMS4wLDE3LjAsMi4wLDMuMCw0LjApXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qZmluZF9tYXhcXCguKlxcKSByZXR1cm5zIDE3XFwuMDAwMDAwXFsgXHJcblxdKy5cWzAtOVxdKyA9IDE3LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IGZpbmRfbWF4X2RvdWJsZSg1LDEuMCwxNy4wLDIuMCwzLjAsNC4wKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBmaW5kX21heF9kb3VibGUoNSwxLjAsMTcuMCwyLjAsMy4wLDQuMCkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBmaW5kX21heF9kb3VibGUoNSwxLjAsMTcuMCwyLjAsMy4wLDQuMCkiIH0KKyAgfQorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3ZvbGF0aWxlLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvdm9sYXRpbGUuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYTJiNTkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3ZvbGF0aWxlLmV4cApAQCAtMCwwICsxLDI0MyBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBXcml0dGVuIGJ5IFNhdGlzaCBQYWkgPHBhaUBhcG9sbG8uaHAuY29tPiAxOTk3LTA3LTA3CisjICAgIEluIHRoZSBzcGlyaXQgb2YgY29uc3R2YXJzLmV4cDogYWRkZWQgdm9sYXRpbGUsIGNvbnN0LXZvbGF0aWxlIHN0dWZmLgorCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBnZGIgdGVzdHN1aXRlCisjIFRlc3RzIGZvcjoKKyMgICAgICAgICAgIHZvbGF0aWxlIHZhcnMKKyMgICAgICAgICAgIHBvaW50ZXJzIHRvIHZvbGF0aWxlIHZhcnMKKyMgICAgICAgICAgIGNvbnN0IHZvbGF0aWxlIHZhcnMKKyMgICAgICAgICAgIHBvaW50ZXJzIHRvIGNvbnN0IHZvbGF0aWxlIHZhcnMKKyMgICAgICAgICAgIGNvbnN0IHBvaW50ZXJzIHRvIHZvbGF0aWxlIHZhcnMKKyMgICAgICAgICAgIHZvbGF0aWxlIHBvaW50ZXJzIHRvIGNvbnN0IHZhcnMKKyMgICAgICAgICAgIGNvbnN0IHZvbGF0aWxlIHBvaW50ZXJzIHRvIGNvbnN0IHZhcnMKKyMgICAgICAgICAgIGNvbnN0IHZvbGF0aWxlIHBvaW50ZXJzIHRvIHZvbGF0aWxlIHZhcnMKKyMgICAgICAgICAgIC4uLiBldGMuICAoeW91IGdldCB0aGUgaWRlYSkKKyMgTW9zdGx5IHdpdGggY2hhciBhbmQgdW5zaWduZWQgY2hhci4gICAgICAgICAgICAgICAgICAgIAorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCisgICAgICAgIH0KKworIworIyB0ZXN0IHJ1bm5pbmcgcHJvZ3JhbXMKKyMKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCisjIFVzZSB0aGUgc2FtZSB0ZXN0IHByb2dyYW0gY29uc3R2YXJzLmMuCisKK3NldCB0ZXN0ZmlsZSAiY29uc3R2YXJzIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCityZW1vdGVfZXhlYyBidWlsZCAicm0gLWYgJHtiaW5maWxlfS5jaSIKK2lmICBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0geworICAgIHJldHVybiAtMQorfQorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworc291cmNlICR7YmluZmlsZX0uY2kKKworIworIyBzZXQgaXQgdXAgYXQgYSBicmVha3BvaW50IHNvIHdlIGNhbiBwbGF5IHdpdGggdGhlIHZhcmlhYmxlIHZhbHVlcworIworaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgICBwZXJyb3IgImNvdWxkbid0IHJ1biB0byBicmVha3BvaW50IgorICAgIGNvbnRpbnVlCit9CisKK3NlbmRfZ2RiICJicmVhayBtYXJrZXIxXG4iIDsgZ2RiX2V4cGVjdCAtcmUgIi4qJGdkYl9wcm9tcHQgJCIKKworICAgIHNlbmRfZ2RiICJjb250XG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAiQnJlYWsuKiBtYXJrZXIxIFxcKFxcKSBhdCAuKjokZGVjaW1hbC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgc2VuZF9nZGIgInVwXG4iCisgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIge30KKyAgICAgICAgICAgICAgICB0aW1lb3V0IHsgZmFpbCAidXAgZnJvbSBtYXJrZXIxIiB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLXJlICJCcmVhay4qIG1hcmtlcjFfXy4qIFxcKFxcKSBhdCAuKjokZGVjaW1hbC4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJjb250aW51ZSB0byBtYXJrZXIxIChkZW1hbmdsaW5nKSIKKyAgICAgICAgICAgIHNlbmRfZ2RiICJ1cFxuIgorICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9CisgICAgICAgICAgICAgICAgdGltZW91dCB7IGZhaWwgInVwIGZyb20gbWFya2VyMSIgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb250aW51ZSB0byBtYXJrZXIxIiAgfQorICAgICAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGNvbnRpbnVlIHRvIG1hcmtlcjEiICB9CisgICAgfQorCisjIEFzIG9mIEZlYiAxOTk5LCBHQ0MgZG9lcyBub3QgaXNzdWUgaW5mbyBhYm91dCB2b2xhdGlsaXR5IG9mIHZhcnMsIHNvCisjIHRoZXNlIHRlc3RzIGFyZSBhbGwgZXhwZWN0ZWQgdG8gZmFpbCBpZiBHQ0MgaXMgdGhlIGNvbXBpbGVyLiAtc3RzCisKK2lmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CitnZGJfdGVzdCAicHR5cGUgdm94IiAidHlwZSA9IHZvbGF0aWxlIGNoYXIiCisKK2lmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CitnZGJfdGVzdCAicHR5cGUgdmljdHVhbHMiICJ0eXBlID0gdm9sYXRpbGUgdW5zaWduZWQgY2hhciIKKworaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KK2dkYl90ZXN0ICJwdHlwZSB2aXhlbiIgInR5cGUgPSB2b2xhdGlsZSBzaG9ydCIKKworaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KK2dkYl90ZXN0ICJwdHlwZSB2aXRyaW9sIiAidHlwZSA9IHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IgorCitpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorZ2RiX3Rlc3QgInB0eXBlIHZlbGx1bSIgInR5cGUgPSB2b2xhdGlsZSBsb25nIgorCitpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorZ2RiX3Rlc3QgInB0eXBlIHZhbHZlIiAidHlwZSA9IHZvbGF0aWxlIHVuc2lnbmVkIGxvbmciCisKK2lmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CitnZGJfdGVzdCAicHR5cGUgdmFjdWl0eSIgInR5cGUgPSB2b2xhdGlsZSBmbG9hdCIKKworaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KK2dkYl90ZXN0ICJwdHlwZSB2ZXJ0aWdvIiAidHlwZSA9IHZvbGF0aWxlIGRvdWJsZSIKKworaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KK2dkYl90ZXN0ICJwdHlwZSB2YW1waXJlIiAidHlwZSA9IHZvbGF0aWxlIGNoYXIgKiIKKworaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KK2dkYl90ZXN0ICJwdHlwZSB2aXBlciIgInR5cGUgPSB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICoiCisKK2lmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CitnZGJfdGVzdCAicHR5cGUgdmlnb3VyIiAidHlwZSA9IHZvbGF0aWxlIHNob3J0ICoiCisKK2lmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CitnZGJfdGVzdCAicHR5cGUgdmFwb3VyIiAidHlwZSA9IHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICoiCisKK2lmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CitnZGJfdGVzdCAicHR5cGUgdmVudHJpY2xlIiAidHlwZSA9IHZvbGF0aWxlIGxvbmcgKiIKKworaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KK2dkYl90ZXN0ICJwdHlwZSB2aWdpbnRpbGxpb24iICJ0eXBlID0gdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqIgorCitpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorZ2RiX3Rlc3QgInB0eXBlIHZvY2F0aW9uIiAidHlwZSA9IHZvbGF0aWxlIGZsb2F0ICoiCisKK2lmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CitnZGJfdGVzdCAicHR5cGUgdmVyYWNpdHkiICJ0eXBlID0gdm9sYXRpbGUgZG91YmxlICoiCisKK2lmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CitnZGJfdGVzdCAicHR5cGUgdmFwaWRpdHkiICJ0eXBlID0gdm9sYXRpbGUgY2hhciAqIHZvbGF0aWxlIgorCitpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorZ2RiX3Rlc3QgInB0eXBlIHZlbG9jaXR5IiAidHlwZSA9IHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKiB2b2xhdGlsZSIKKworaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KK2dkYl90ZXN0ICJwdHlwZSB2ZW5lZXIiICJ0eXBlID0gdm9sYXRpbGUgc2hvcnQgKiB2b2xhdGlsZSIKKworaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KK2dkYl90ZXN0ICJwdHlwZSB2aWRlbyIgInR5cGUgPSB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqIHZvbGF0aWxlIgorCitpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorZ2RiX3Rlc3QgInB0eXBlIHZhY3V1bSIgInR5cGUgPSB2b2xhdGlsZSBsb25nICogdm9sYXRpbGUiCisKK2lmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CitnZGJfdGVzdCAicHR5cGUgdmVuaWFsaXR5IiAidHlwZSA9IHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKiB2b2xhdGlsZSIKKworaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KK2dkYl90ZXN0ICJwdHlwZSB2aXRhbGl0eSIgInR5cGUgPSB2b2xhdGlsZSBmbG9hdCAqIHZvbGF0aWxlIgorCitpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorZ2RiX3Rlc3QgInB0eXBlIHZvcmFjaXR5IiAidHlwZSA9IHZvbGF0aWxlIGRvdWJsZSAqIHZvbGF0aWxlIgorCitpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorZ2RiX3Rlc3QgInB0eXBlIHZpY3RvciIgInR5cGUgPSBjb25zdCB2b2xhdGlsZSBjaGFyIgorCitpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorZ2RiX3Rlc3QgInB0eXBlIHZpY2FyIiAidHlwZSA9IGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIiCisKK2lmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CitnZGJfdGVzdCAicHR5cGUgdmljdG9yeSIgInR5cGUgPSBjb25zdCB2b2xhdGlsZSBjaGFyICoiCisKK2lmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CitnZGJfdGVzdCAicHR5cGUgdmljYXJhZ2UiICJ0eXBlID0gY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqIgorCitpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorZ2RiX3Rlc3QgInB0eXBlIHZlaW4iICJ0eXBlID0gdm9sYXRpbGUgY2hhciAqIGNvbnN0IgorCitpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorZ2RiX3Rlc3QgInB0eXBlIHZvZ3VlIiAidHlwZSA9IHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKiBjb25zdCIKKworaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KK2dkYl90ZXN0ICJwdHlwZSBjYXZlcm4iICJ0eXBlID0gY29uc3Qgdm9sYXRpbGUgY2hhciAqIGNvbnN0IgorCitpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorZ2RiX3Rlc3QgInB0eXBlIGNvdmVybGV0IiAidHlwZSA9IGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKiBjb25zdCIKKworaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KK2dkYl90ZXN0ICJwdHlwZSBjYXZlYXQiICJ0eXBlID0gY29uc3QgY2hhciAqIHZvbGF0aWxlIgorCitpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorZ2RiX3Rlc3QgInB0eXBlIGNvdmVuYW50IiAidHlwZSA9IGNvbnN0IHVuc2lnbmVkIGNoYXIgKiB2b2xhdGlsZSIKKworaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KK2dkYl90ZXN0ICJwdHlwZSB2aXppZXIiICJ0eXBlID0gY29uc3Qgdm9sYXRpbGUgY2hhciAqIHZvbGF0aWxlIgorCitpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorZ2RiX3Rlc3QgInB0eXBlIHZhbmFkaXVtIiAidHlwZSA9IGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKiB2b2xhdGlsZSIKKworaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KK2dkYl90ZXN0ICJwdHlwZSB2YW5lIiAidHlwZSA9IGNoYXIgKiBjb25zdCB2b2xhdGlsZSIKKworaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KK2dkYl90ZXN0ICJwdHlwZSB2ZWxkdCIgInR5cGUgPSB1bnNpZ25lZCBjaGFyICogY29uc3Qgdm9sYXRpbGUiCisKK2lmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CitnZGJfdGVzdCAicHR5cGUgY292ZSIgInR5cGUgPSBjb25zdCBjaGFyICogY29uc3Qgdm9sYXRpbGUiCisKK2lmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CitnZGJfdGVzdCAicHR5cGUgY2F2aXR5IiAidHlwZSA9IGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBjb25zdCB2b2xhdGlsZSIKKworaWYgeyRnY2NfY29tcGlsZWR9IHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KK2dkYl90ZXN0ICJwdHlwZSB2YWd1cyIgInR5cGUgPSB2b2xhdGlsZSBjaGFyICogY29uc3Qgdm9sYXRpbGUiCisKK2lmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CitnZGJfdGVzdCAicHR5cGUgdmFncmFuY3kiICJ0eXBlID0gdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqIGNvbnN0IHZvbGF0aWxlIgorCitpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQorZ2RiX3Rlc3QgInB0eXBlIHZhZ2FyeSIgInR5cGUgPSBjb25zdCB2b2xhdGlsZSBjaGFyICogY29uc3Qgdm9sYXRpbGUiCisKK2lmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CitnZGJfdGVzdCAicHR5cGUgdmVuZG9yIiAidHlwZSA9IGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKiBjb25zdCB2b2xhdGlsZSIKKworIyB0ZXN0IGZ1bmN0aW9uIHBhcmFtZXRlcnMKK2lmIHskZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9CitzZW5kX2dkYiAicHR5cGUgcXV4MlxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gaW50IFxcKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIsIGNvbnN0IHZvbGF0aWxlIGludCwgdm9sYXRpbGUgc2hvcnQgJiwgdm9sYXRpbGUgbG9uZyBcXCosIGZsb2F0IFxcKiB2b2xhdGlsZSwgY29uc3Qgdm9sYXRpbGUgc2lnbmVkIGNoYXIgXFwqIGNvbnN0IHZvbGF0aWxlXFwpIiB7CisgICAgICAgIHBhc3MgInB0eXBlIHF1eDIiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInB0eXBlIHF1eDIiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBxdXgyIiB9CisgIH0gICAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvd2F0Y2hwb2ludC5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS93YXRjaHBvaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1NGYzZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvd2F0Y2hwb2ludC5jCkBAIC0wLDAgKzEsMTI0IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKy8qCisgKglTaW5jZSB1c2luZyB3YXRjaHBvaW50cyBjYW4gYmUgdmVyeSBzbG93LCB3ZSBoYXZlIHRvIHRha2Ugc29tZSBwYWlucyB0bworICoJZW5zdXJlIHRoYXQgd2UgZG9uJ3QgcnVuIHRvbyBsb25nIHdpdGggdGhlbSBlbmFibGVkIG9yIHdlIHJ1biB0aGUgcmlzaworICoJb2YgaGF2aW5nIHRoZSB0ZXN0IHRpbWVvdXQuICBUbyBoZWxwIGF2b2lkIHRoaXMsIHdlIGluc2VydCBzb21lIG1hcmtlcgorICoJZnVuY3Rpb25zIGluIHRoZSBleGVjdXRpb24gc3RyZWFtIHNvIHdlIGNhbiBzZXQgYnJlYWtwb2ludHMgYXQga25vd24KKyAqCWxvY2F0aW9ucywgd2l0aG91dCB3b3JyeWluZyBhYm91dCBpbnZhbGlkYXRpbmcgbGluZSBudW1iZXJzIGJ5IGNoYW5naW5nCisgKgl0aGlzIGZpbGUuICBXZSB1c2UgbnVsbCBib2RpZWQgZnVuY3Rpb25zIGFyZSBtYXJrZXJzIHNpbmNlIGdkYiBkb2VzCisgKglub3Qgc3VwcG9ydCBicmVha3BvaW50cyBhdCBsYWJlbGVkIHRleHQgcG9pbnRzIGF0IHRoaXMgdGltZS4KKyAqCisgKglPbmUgcGxhY2Ugd2UgbmVlZCBpcyBhIG1hcmtlciBmb3Igd2hlbiB3ZSBzdGFydCBleGVjdXRpbmcgb3VyIHRlc3RzCisgKglpbnN0cnVjdGlvbnMgcmF0aGVyIHRoYW4gYW55IHByb2Nlc3Mgc3RhcnR1cCBjb2RlLCBzbyB3ZSBpbnNlcnQgb25lCisgKglyaWdodCBhZnRlciBlbnRlcmluZyBtYWluKCkuICBBbm90aGVyIGlzIHJpZ2h0IGJlZm9yZSB3ZSBmaW5pc2gsIGJlZm9yZQorICoJd2Ugc3RhcnQgZXhlY3V0aW5nIGFueSBwcm9jZXNzIHRlcm1pbmF0aW9uIGNvZGUuCisgKgorICoJQW5vdGhlciBwcm9ibGVtIHdlIGhhdmUgdG8gZ3VhcmQgYWdhaW5zdCwgYXQgbGVhc3QgZm9yIHRoZSB0ZXN0CisgKglzdWl0ZSwgaXMgdGhhdCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBsaW5lIHRoYXQgY2F1c2VzIHRoZQorICoJd2F0Y2hwb2ludCB0byBiZSBoaXQgaXMgc3RpbGwgdGhlIGN1cnJlbnQgbGluZSB3aGVuIGdkYiBub3RpY2VzCisgKgl0aGUgaGl0LiAgRGVwZW5kaW5nIHVwb24gdGhlIHNwZWNpZmljIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciwKKyAqCXRoZSBpbnN0cnVjdGlvbiBhZnRlciB0aGUgb25lIHRoYXQgdHJpZ2dlcnMgdGhlIGhpdCBtYXkgYmUgcGFydCBvZgorICoJdGhlIHNhbWUgbGluZSBvciBwYXJ0IG9mIHRoZSBuZXh0IGxpbmUuICBUaHVzIHdlIGVuc3VyZSB0aGF0IHRoZXJlCisgKglhcmUgYWx3YXlzIHNvbWUgaW5zdHJ1Y3Rpb25zIHRvIGV4ZWN1dGUgb24gdGhlIHNhbWUgbGluZSBhZnRlciB0aGUKKyAqCWNvZGUgdGhhdCBzaG91bGQgdHJpZ2dlciB0aGUgaGl0LgorICovCisKK2ludCBjb3VudCA9IC0xOworaW50IGl2YWwxID0gLTE7CitpbnQgaXZhbDIgPSAtMTsKK2ludCBpdmFsMyA9IC0xOworaW50IGl2YWw0ID0gLTE7CitjaGFyIGJ1ZlsxMF07CitzdHJ1Y3QgZm9vCit7CisgIGludCB2YWw7Cit9Oworc3RydWN0IGZvbyBzdHJ1Y3QxLCBzdHJ1Y3QyLCAqcHRyMSwgKnB0cjI7CisKK2ludCBkb3JlYWQgPSAwOworCit2b2lkIG1hcmtlcjEgKCkKK3sKK30KKwordm9pZCBtYXJrZXIyICgpCit7Cit9CisKK3ZvaWQgbWFya2VyNCAoKQoreworfQorCit2b2lkIG1hcmtlcjUgKCkKK3sKK30KKwordm9pZAorZnVuYzIgKCkKK3sKK30KKworaW50CitmdW5jMSAoKQoreworICAvKiBUaGUgcG9pbnQgb2YgdGhpcyBpcyB0aGF0IHdlIHdpbGwgc2V0IGEgYnJlYWtwb2ludCBhdCB0aGlzIGNhbGwuCisKKyAgICAgVGhlbiwgaWYgREVDUl9QQ19BRlRFUl9CUkVBSyBlcXVhbHMgdGhlIHNpemUgb2YgYSBmdW5jdGlvbiBjYWxsCisgICAgIGluc3RydWN0aW9uICh0cnVlIG9uIGEgc3VuMyBpZiB0aGlzIGlzIGdjYy1jb21waWxlZC0tRklYTUUgd2UKKyAgICAgc2hvdWxkIHVzZSBhc20oKSB0byBtYWtlIGl0IHdvcmsgZm9yIGFueSBjb21waWxlciwgcHJlc2VudCBvcgorICAgICBmdXR1cmUpLCB0aGVuIHdlIHdpbGwgZW5kIHVwIGJyYW5jaGluZyB0byB0aGUgbG9jYXRpb24ganVzdCBhZnRlcgorICAgICB0aGUgYnJlYWtwb2ludC4gIEFuZCB3ZSBiZXR0ZXIgbm90IGNvbmZ1c2UgdGhhdCB3aXRoIGhpdHRpbmcgdGhlCisgICAgIGJyZWFrcG9pbnQuICAqLworICBmdW5jMiAoKTsKKyAgcmV0dXJuIDczOworfQorCitpbnQgbWFpbiAoKQoreworI2lmZGVmIHVzZXN0dWJzCisgIHNldF9kZWJ1Z190cmFwcygpOworICBicmVha3BvaW50KCk7CisjZW5kaWYKKyAgc3RydWN0MS52YWwgPSAxOworICBzdHJ1Y3QyLnZhbCA9IDI7CisgIHB0cjEgPSAmc3RydWN0MTsKKyAgcHRyMiA9ICZzdHJ1Y3QyOworICBtYXJrZXIxICgpOworICBmdW5jMSAoKTsKKyAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgNDsgY291bnQrKykgeworICAgIGl2YWwxID0gY291bnQ7CisgICAgaXZhbDMgPSBjb3VudDsgaXZhbDQgPSBjb3VudDsKKyAgfQorICBpdmFsMSA9IGNvdW50OyAvKiBPdXRzaWRlIGxvb3AgKi8KKyAgaXZhbDIgPSBjb3VudDsKKyAgaXZhbDMgPSBjb3VudDsgaXZhbDQgPSBjb3VudDsKKyAgbWFya2VyMiAoKTsKKyAgaWYgKGRvcmVhZCkKKyAgICB7CisgICAgICBzdGF0aWMgY2hhciBtc2dbXSA9ICJ0eXBlIHN0dWZmIGZvciBidWYgbm93OiI7CisgICAgICB3cml0ZSAoMSwgbXNnLCBzaXplb2YgKG1zZykgLSAxKTsKKyAgICAgIHJlYWQgKDAsICZidWZbMF0sIDUpOworICAgIH0KKyAgbWFya2VyNCAoKTsKKworICAvKiBXZSBoYXZlIGEgd2F0Y2hwb2ludCBvbiBwdHIxLT52YWwuICBJdCBzaG91bGQgYmUgdHJpZ2dlcmVkIGlmCisgICAgIHB0cjEncyB2YWx1ZSBjaGFuZ2VzLiAgKi8KKyAgcHRyMSA9IHB0cjI7CisKKyAgLyogVGhpcyBzaG91bGQgbm90IHRyaWdnZXIgdGhlIHdhdGNocG9pbnQuICBJZiBpdCBkb2VzLCB0aGVuIHdlCisgICAgIHVzZWQgdGhlIHdyb25nIHZhbHVlIGNoYWluIHRvIHJlLWluc2VydCB0aGUgd2F0Y2hwb2ludHMgb3Igd2UKKyAgICAgYXJlIG5vdCBldmFsdWF0aW5nIHRoZSB3YXRjaHBvaW50IGV4cHJlc3Npb24gY29ycmVjdGx5LiAgKi8KKyAgc3RydWN0MS52YWwgPSA1OworICBtYXJrZXI1ICgpOworCisgIC8qIFdlIGhhdmUgYSB3YXRjaHBvaW50IG9uIHB0cjEtPnZhbC4gIEl0IHNob3VsZCBiZSB0cmlnZ2VyZWQgaWYKKyAgICAgcHRyMSdzIHZhbHVlIGNoYW5nZXMuICAqLworICBwdHIxID0gcHRyMjsKKworICAvKiBUaGlzIHNob3VsZCBub3QgdHJpZ2dlciB0aGUgd2F0Y2hwb2ludC4gIElmIGl0IGRvZXMsIHRoZW4gd2UKKyAgICAgdXNlZCB0aGUgd3JvbmcgdmFsdWUgY2hhaW4gdG8gcmUtaW5zZXJ0IHRoZSB3YXRjaHBvaW50cyBvciB3ZQorICAgICBhcmUgbm90IGV2YWx1YXRpbmcgdGhlIHdhdGNocG9pbnQgZXhwcmVzc2lvbiBjb3JyZWN0bHkuICAqLworICBzdHJ1Y3QxLnZhbCA9IDU7CisgIG1hcmtlcjUgKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS93YXRjaHBvaW50LmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvd2F0Y2hwb2ludC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI5NTQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvd2F0Y2hwb2ludC5leHAKQEAgLTAsMCArMSw1ODMgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBGcmVkIEZpc2guIChmbmZAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgIndhdGNocG9pbnQiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKKworaWYgW2dldF9jb21waWxlcl9pbmZvICR7YmluZmlsZX1dIHsKKyAgICByZXR1cm4gLTEKK30KKworIyBpZiB3ZSBhcmUgb24gSFBVWCBhbmQgd2UgYXJlIG5vdCBjb21waWxlZCB3aXRoIGdjYywgdGhlbiBza2lwIHRoZXNlIHRlc3RzLgorCitpZiBbaXN0YXJnZXQgaHBwYSotKi1ocHV4Kl0geworICAgIGlmIHshJGdjY19jb21waWxlZH0geworCWNvbnRpbnVlIAorICAgIH0KK30KKworCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisjIFByZXBhcmUgZm9yIHdhdGNocG9pbnQgdGVzdHMgYnkgc2V0dGluZyB1cCB0d28gYnJlYWtwb2ludHMgYW5kIG9uZQorIyB3YXRjaHBvaW50LgorIworIyBXZSB1c2UgYnJlYWtwb2ludHMgYXQgbWFya2VyIGZ1bmN0aW9ucyB0byBnZXQgcGFzdCBhbGwgdGhlIHN0YXJ0dXAgY29kZSwKKyMgc28gd2UgY2FuIGdldCB0byB0aGUgd2F0Y2hwb2ludHMgaW4gYSByZWFzb25hYmxlIGFtb3VudCBvZiB0aW1lIGZyb20gYQorIyBrbm93biBzdGFydGluZyBwb2ludC4KKyMKKyMgRm9yIHNpbXBsaWNpdHksIHNvIHdlIGFsd2F5cyBrbm93IGhvdyB0byByZWZlcmVuY2Ugc3BlY2lmaWMgYnJlYWtwb2ludHMgb3IKKyMgd2F0Y2hwb2ludHMgYnkgbnVtYmVyLCB3ZSBleHBlY3QgYSBwYXJ0aWN1bGFyIG9yZGVyaW5nIGFuZCBudW1iZXJpbmcgb2YKKyMgZWFjaCBpbiB0aGUgY29tYmluZWQgYnJlYWtwb2ludC93YXRjaHBvaW50IHRhYmxlLCBhcyBmb2xsb3dzOgorIworIwlOdW1iZXIJCVdoYXQJCVdoZXJlCisjCTEJCUJyZWFrcG9pbnQJbWFya2VyMSgpCisjCTIJCUJyZWFrcG9pbnQJbWFya2VyMigpCisjCTMJCVdhdGNocG9pbnQJaXZhbDMKKworcHJvYyBpbml0aWFsaXplIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorICAgIGdsb2JhbCBzcmNmaWxlCisKKyAgICBpZiBbZ2RiX3Rlc3QgImJyZWFrIG1hcmtlcjEiICJCcmVha3BvaW50IDEgYXQgJGhleDogZmlsZSAuKiRzcmNmaWxlLCBsaW5lICRkZWNpbWFsLioiICJzZXQgYnJlYWtwb2ludCBhdCBtYXJrZXIxIiBdIHsgCisgICAgICByZXR1cm4gMDsgCisgICAgfQorCisKKyAgICBpZiBbZ2RiX3Rlc3QgImJyZWFrIG1hcmtlcjIiICJCcmVha3BvaW50IDIgYXQgJGhleDogZmlsZSAuKiRzcmNmaWxlLCBsaW5lICRkZWNpbWFsLioiICJzZXQgYnJlYWtwb2ludCBhdCBtYXJrZXIyIiBdIHsgCisgICAgICByZXR1cm4gMDsgCisgICAgfQorCisKKyAgICBpZiBbZ2RiX3Rlc3QgImluZm8gYnJlYWsiICIxXFsgXF0qYnJlYWtwb2ludC4qbWFya2VyMS4qXHJcbjJcWyBcXSpicmVha3BvaW50LiptYXJrZXIyLioiICJpbmZvIGJyZWFrIGluIHdhdGNocG9pbnQuZXhwIiBdIHsgCisgICAgICByZXR1cm4gMDsgCisgICAgfQorCisKKyAgICBpZiBbZ2RiX3Rlc3QgIndhdGNoIGl2YWwzIiAiLipcW1d3XF1hdGNocG9pbnQgMzogaXZhbDMiICJzZXQgd2F0Y2hwb2ludCBvbiBpdmFsMyIgXSB7IAorICAgICAgcmV0dXJuIDA7IAorICAgIH0KKworCisgICAgIyAiaW5mbyB3YXRjaCIgaXMgdGhlIHNhbWUgYXMgImluZm8gYnJlYWsiCisKKyAgICBpZiBbZ2RiX3Rlc3QgImluZm8gd2F0Y2giICIxXFsgXF0qYnJlYWtwb2ludC4qbWFya2VyMS4qXHJcbjJcWyBcXSpicmVha3BvaW50LiptYXJrZXIyLipcclxuM1xbIFxdKi4qd2F0Y2hwb2ludC4qaXZhbDMiICJ3YXRjaHBvaW50IGZvdW5kIGluIHdhdGNocG9pbnQvYnJlYWtwb2ludCB0YWJsZSIgXSB7IAorICAgICAgcmV0dXJuIDA7IAorICAgIH0KKworCisgICAgIyBBZnRlciBpbnN0YWxsaW5nIHRoZSB3YXRjaHBvaW50LCB3ZSBkaXNhYmxlIGl0IHVudGlsIHdlIGFyZSByZWFkeQorICAgICMgdG8gdXNlIGl0LiAgVGhpcyBhbGxvd3MgdGhlIHRlc3QgcHJvZ3JhbSB0byBydW4gYXQgZnVsbCBzcGVlZCB1bnRpbAorICAgICMgd2UgZ2V0IHRvIHRoZSBmaXJzdCBtYXJrZXIgZnVuY3Rpb24uCisKKyAgICBpZiBbZ2RiX3Rlc3QgImRpc2FibGUgMyIgImRpc2FibGUgM1xbXHJcblxdKyIgImRpc2FibGUgd2F0Y2hwb2ludCIgXSB7IAorICAgICAgcmV0dXJuIDA7IAorICAgIH0KKworCisgICAgcmV0dXJuIDEKK30KKworIworIyBUZXN0IHNpbXBsZSB3YXRjaHBvaW50LgorIworCitwcm9jIHRlc3Rfc2ltcGxlX3dhdGNocG9pbnQge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICAjIEVuc3VyZSB0aGF0IHRoZSB3YXRjaHBvaW50IGlzIGRpc2FibGVkIHdoZW4gd2Ugc3RhcnR1cC4KKworICAgIGlmIFtnZGJfdGVzdCAiZGlzYWJsZSAzIiAiXmRpc2FibGUgM1xbXHJcblxdKyIgImRpc2FibGUgd2F0Y2hwb2ludCBpbiB0ZXN0X3NpbXBsZV93YXRjaHBvaW50IiBdIHsgCisgICAgICByZXR1cm4gMDsgCisgICAgfQorCisKKyAgICAjIFJ1biB1bnRpbCB3ZSBnZXQgdG8gdGhlIGZpcnN0IG1hcmtlciBmdW5jdGlvbi4KKworICAgIGdkYl9ydW5fY21kCisgICAgc2V0IHRpbWVvdXQgNjAwCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJCcmVha3BvaW50IDEsIG1hcmtlcjEgLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInJ1biB0byBtYXJrZXIxIGluIHRlc3Rfc2ltcGxlX3dhdGNocG9pbnQiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInJ1biB0byBtYXJrZXIxIGluIHRlc3Rfc2ltcGxlX3dhdGNocG9pbnQiCisJICAgIHJldHVybgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicnVuIHRvIG1hcmtlcjEgaW4gdGVzdF9zaW1wbGVfd2F0Y2hwb2ludCAodGltZW91dCkiCisJICAgIHJldHVybgorCX0KKyAgICB9CisKKyAgICAjIEFmdGVyIHJlYWNoaW5nIHRoZSBtYXJrZXIgZnVuY3Rpb24sIGVuYWJsZSB0aGUgd2F0Y2hwb2ludC4KKworICAgIGlmIFtnZGJfdGVzdCAiZW5hYmxlIDMiICJeZW5hYmxlIDNcW1xyXG5cXSsiICJlbmFibGUgd2F0Y2hwb2ludCIgXSB7IAorICAgICAgcmV0dXJuIDsgCisgICAgfQorCisKKyAgICBnZGJfdGVzdCAiYnJlYWsgZnVuYzEiICJCcmVha3BvaW50LiphdC4qIgorICAgIGdkYl90ZXN0ICJzZXQgXCRmdW5jMV9icmVha3BvaW50X251bWJlciA9IFwkYnBudW0iICIiCisKKyAgICBnZGJfdGVzdCAiY29udGludWUiICJDb250aW51aW5nLipCcmVha3BvaW50IFxbMC05XF0qLCBmdW5jMS4qIiBcCisJImNvbnRpbnVlIHRvIGJyZWFrcG9pbnQgYXQgZnVuYzEiCisKKyAgICAjIENvbnRpbnVlIHVudGlsIHRoZSBmaXJzdCBjaGFuZ2UsIGZyb20gLTEgdG8gMAorCisgICAgc2VuZF9nZGIgImNvbnRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIkNvbnRpbnVpbmcuKlxbV3dcXWF0Y2hwb2ludC4qaXZhbDMuKk9sZCB2YWx1ZSA9IC0xLipOZXcgdmFsdWUgPSAwLippdmFsMyA9IGNvdW50OyBpdmFsNCA9IGNvdW50Oy4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJ3YXRjaHBvaW50IGhpdCwgZmlyc3QgdGltZSIKKwl9CisJLXJlICJDb250aW51aW5nLipCcmVha3BvaW50LipmdW5jMS4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBzZXR1cF94ZmFpbCAibTY4Ki0qLSoiIDI1OTcKKwkgICAgZmFpbCAidGhvdWdodCBpdCBoaXQgYnJlYWtwb2ludCBhdCBmdW5jMSB0d2ljZSIKKwkgICAgZ2RiX3Rlc3QgImRlbGV0ZSBcJGZ1bmMxX2JyZWFrcG9pbnRfbnVtYmVyIiAiIgorCSAgICBnZGJfdGVzdCAiY29udGludWUiICJcCitDb250aW51aW5nLipcW1d3XF1hdGNocG9pbnQuKml2YWwzLipPbGQgdmFsdWUgPSAtMS4qTmV3IHZhbHVlID0gMC4qaXZhbDMgPSBjb3VudDsiIFwKKwkJIndhdGNocG9pbnQgaGl0LCBmaXJzdCB0aW1lIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJ3YXRjaHBvaW50IGhpdCwgZmlyc3QgdGltZSIgOyByZXR1cm4gfQorCXRpbWVvdXQgeyBmYWlsICJ3YXRjaHBvaW50IGhpdCwgZmlyc3QgdGltZSAodGltZW91dCkiIDsgcmV0dXJuIH0KKwllb2YgeyBmYWlsICJ3YXRjaHBvaW50IGhpdCwgZmlyc3QgdGltZSAoZW9mKSIgOyByZXR1cm4gfQorICAgIH0KKworICAgIGdkYl90ZXN0ICJkZWxldGUgXCRmdW5jMV9icmVha3BvaW50X251bWJlciIgIiIKKworICAgICMgQ29udGludWUgdW50aWwgdGhlIG5leHQgY2hhbmdlLCBmcm9tIDAgdG8gMS4KKyAgICBnZGJfdGVzdCAiY29udCIgIkNvbnRpbnVpbmcuKlxbV3dcXWF0Y2hwb2ludC4qaXZhbDMuKk9sZCB2YWx1ZSA9IDAuKk5ldyB2YWx1ZSA9IDEuKml2YWwzID0gY291bnQ7IGl2YWw0ID0gY291bnQ7LioiICJ3YXRjaHBvaW50IGhpdCwgc2Vjb25kIHRpbWUiCisKKyAgICAjIENvbnRpbnVlIHVudGlsIHRoZSBuZXh0IGNoYW5nZSwgZnJvbSAxIHRvIDIuCisgICAgZ2RiX3Rlc3QgImNvbnQiICJDb250aW51aW5nLipcW1d3XF1hdGNocG9pbnQuKml2YWwzLipPbGQgdmFsdWUgPSAxLipOZXcgdmFsdWUgPSAyLippdmFsMyA9IGNvdW50OyBpdmFsNCA9IGNvdW50Oy4qIiAid2F0Y2hwb2ludCBoaXQsIHRoaXJkIHRpbWUiCisgICAgCisgICAgIyBDb250aW51ZSB1bnRpbCB0aGUgbmV4dCBjaGFuZ2UsIGZyb20gMiB0byAzLgorICAgIGdkYl90ZXN0ICJjb250IiAiQ29udGludWluZy4qXFtXd1xdYXRjaHBvaW50LippdmFsMy4qT2xkIHZhbHVlID0gMi4qTmV3IHZhbHVlID0gMy4qaXZhbDMgPSBjb3VudDsgaXZhbDQgPSBjb3VudDsuKiIgIndhdGNocG9pbnQgaGl0LCBmb3VydGggdGltZSIKKworICAgICMgQ29udGludWUgdW50aWwgdGhlIG5leHQgY2hhbmdlLCBmcm9tIDMgdG8gNC4KKyAgICAjIE5vdGUgdGhhdCB0aGlzIG9uZSBpcyBvdXRzaWRlIHRoZSBsb29wLgorCisgICAgZ2RiX3Rlc3QgImNvbnQiICJDb250aW51aW5nLipcW1d3XF1hdGNocG9pbnQuKml2YWwzLipPbGQgdmFsdWUgPSAzLipOZXcgdmFsdWUgPSA0LippdmFsMyA9IGNvdW50OyBpdmFsNCA9IGNvdW50Oy4qIiAid2F0Y2hwb2ludCBoaXQsIGZpZnRoIHRpbWUiCisKKyAgICAjIENvbnRpbnVlIHVudGlsIHdlIGhpdCB0aGUgZmluaXNoaW5nIG1hcmtlciBmdW5jdGlvbi4KKyAgICAjIE1ha2Ugc3VyZSB3ZSBoaXQgbm8gbW9yZSB3YXRjaHBvaW50cy4KKworICAgIGdkYl90ZXN0ICJjb250IiAiQ29udGludWluZy4qQnJlYWtwb2ludC4qbWFya2VyMiBcKFwpLioiIFwKKwkiY29udGludWUgdG8gbWFya2VyMiIKKworICAgICMgRGlzYWJsZSB0aGUgd2F0Y2hwb2ludCBzbyB3ZSBydW4gYXQgZnVsbCBzcGVlZCB1bnRpbCB3ZSBleGl0LgorCisgICAgaWYgW2dkYl90ZXN0ICJkaXNhYmxlIDMiICJeZGlzYWJsZSAzXFtcclxuXF0rIiAid2F0Y2hwb2ludCBkaXNhYmxlZCIgXSB7IAorICAgICAgcmV0dXJuIDsgCisgICAgfQorCisKKyAgICAjIFJ1biB1bnRpbCBwcm9jZXNzIGV4aXRzLgorCisgICAgaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGIsbm9yZXN1bHRzXSB7IHJldHVybiB9CisKKyAgICBnZGJfdGVzdCAiY29udCIgIkNvbnRpbnVpbmcuKlByb2dyYW0gZXhpdGVkIG5vcm1hbGx5LioiIFwKKwkiY29udGludWUgdG8gZXhpdCBpbiB0ZXN0X3NpbXBsZV93YXRjaHBvaW50IgorfQorCisjIFRlc3QgZGlzYWJsaW5nIHdhdGNocG9pbnRzLgorCitwcm9jIHRlc3RfZGlzYWJsaW5nX3dhdGNocG9pbnRzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBiaW5maWxlCisgICAgZ2xvYmFsIHNyY2ZpbGUKKyAgICBnbG9iYWwgZGVjaW1hbAorICAgIGdsb2JhbCBoZXgKKworICAgICMgRW5zdXJlIHRoYXQgdGhlIHdhdGNocG9pbnQgaXMgZGlzYWJsZWQgd2hlbiB3ZSBzdGFydHVwLgorCisgICAgaWYgW2dkYl90ZXN0ICJkaXNhYmxlIDMiICJeZGlzYWJsZSAzXFtcclxuXF0rIiAiZGlzYWJsZSB3YXRjaHBvaW50IGluIHRlc3RfZGlzYWJsaW5nX3dhdGNocG9pbnRzIiBdIHsgCisgICAgICByZXR1cm4gMDsgCisgICAgfQorCisKKyAgICAjIFJ1biB1bnRpbCB3ZSBnZXQgdG8gdGhlIGZpcnN0IG1hcmtlciBmdW5jdGlvbi4KKworICAgIGdkYl9ydW5fY21kCisgICAgc2V0IHRpbWVvdXQgNjAwCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJCcmVha3BvaW50IDEsIG1hcmtlcjEgLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInJ1biB0byBtYXJrZXIxIGluIHRlc3RfZGlzYWJsaW5nX3dhdGNocG9pbnRzIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJydW4gdG8gbWFya2VyMSBpbiB0ZXN0X2Rpc2FibGluZ193YXRjaHBvaW50cyIKKwkgICAgcmV0dXJuCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJydW4gdG8gbWFya2VyMSBpbiB0ZXN0X2Rpc2FibGluZ193YXRjaHBvaW50cyAodGltZW91dCkiCisJICAgIHJldHVybgorCX0KKyAgICB9CisKKyAgICAjIEFmdGVyIHJlYWNoaW5nIHRoZSBtYXJrZXIgZnVuY3Rpb24sIGVuYWJsZSB0aGUgd2F0Y2hwb2ludC4KKworICAgIGlmIFtnZGJfdGVzdCAiZW5hYmxlIDMiICJeZW5hYmxlIDNcW1xyXG5cXSsiICJ3YXRjaHBvaW50IGVuYWJsZWQiIF0geyAKKyAgICAgIHJldHVybiA7IAorICAgIH0KKworCisgICAgIyBDb250aW51ZSB1bnRpbCB0aGUgZmlyc3QgY2hhbmdlLCBmcm9tIC0xIHRvIDAKKyAgICAjIERvbid0IGNoZWNrIHRoZSBvbGQgdmFsdWUsIGJlY2F1c2Ugb24gVnhXb3JrcyB0aGUgdmFyaWFibGUgdmFsdWUKKyAgICAjIHdpbGwgbm90IGhhdmUgYmVlbiByZWluaXRpYWxpemVkLgorICAgIGdkYl90ZXN0ICJjb250IiAiQ29udGludWluZy4qXFtXd1xdYXRjaHBvaW50LippdmFsMy4qT2xkIHZhbHVlID0gLipOZXcgdmFsdWUgPSAwLippdmFsMyA9IGNvdW50OyBpdmFsNCA9IGNvdW50Oy4qIiAid2F0Y2hwb2ludCBoaXQgaW4gdGVzdF9kaXNhYmxpbmdfd2F0Y2hwb2ludHMsIGZpcnN0IHRpbWUiCisgICAgCisgICAgIyBDb250aW51ZSB1bnRpbCB0aGUgbmV4dCBjaGFuZ2UsIGZyb20gMCB0byAxLgorICAgIGdkYl90ZXN0ICJjb250IiAiQ29udGludWluZy4qXFtXd1xdYXRjaHBvaW50LippdmFsMy4qT2xkIHZhbHVlID0gMC4qTmV3IHZhbHVlID0gMS4qaXZhbDMgPSBjb3VudDsgaXZhbDQgPSBjb3VudDsuKiIgIndhdGNocG9pbnQgaGl0IGluIHRlc3RfZGlzYWJsaW5nX3dhdGNocG9pbnRzLCBzZWNvbmQgdGltZSIKKyAgICAKKyAgICAjIERpc2FibGUgdGhlIHdhdGNocG9pbnQgYnV0IGxlYXZlIGJyZWFrcG9pbnRzCisKKyAgICBpZiBbZ2RiX3Rlc3QgImRpc2FibGUgMyIgIl5kaXNhYmxlIDNcW1xyXG5cXSsiICJkaXNhYmxlIHdhdGNocG9pbnQgIzIgaW4gdGVzdF9kaXNhYmxpbmdfd2F0Y2hwb2ludHMiIF0geyAKKyAgICAgIHJldHVybiAwOyAKKyAgICB9CisKKworICAgICMgQ2hlY2sgd2F0Y2hwb2ludCBsaXN0LCBsb29raW5nIGZvciB0aGUgZW50cnkgdGhhdCBjb25maXJtcyB0aGUKKyAgICAjIHdhdGNocG9pbnQgaXMgZGlzYWJsZWQuCisgICAgZ2RiX3Rlc3QgImluZm8gd2F0Y2hwb2ludHMiICIzXFsgXF0qLip3YXRjaHBvaW50XFsgXF0qa2VlcFxbIFxdKm5cWyBcXSppdmFsM1xyXG4uKiIgIndhdGNocG9pbnQgZGlzYWJsZWQgaW4gdGFibGUiCisKKyAgICAjIENvbnRpbnVlIHVudGlsIHdlIGhpdCB0aGUgZmluaXNoaW5nIG1hcmtlciBmdW5jdGlvbi4KKyAgICAjIE1ha2Ugc3VyZSB3ZSBoaXQgbm8gbW9yZSB3YXRjaHBvaW50cy4KKyAgICBnZGJfdGVzdCAiY29udCIgIkNvbnRpbnVpbmcuKkJyZWFrcG9pbnQuKm1hcmtlcjIgXFwoXFwpLioiIFwKKwkiZGlzYWJsZWQgd2F0Y2hwb2ludCBza2lwcGVkIgorICAgIAorICAgIGlmIFt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiLG5vcmVzdWx0c10geyByZXR1cm4gfQorCisgICAgZ2RiX3Rlc3QgImNvbnQiICJDb250aW51aW5nLipQcm9ncmFtIGV4aXRlZCBub3JtYWxseS4qIiBcCisJImNvbnRpbnVlIHRvIGV4aXQgaW4gdGVzdF9kaXNhYmxpbmdfd2F0Y2hwb2ludHMiCit9CisKKyMgVGVzdCBzdGVwcGluZyBhbmQgb3RoZXIgbXVuZGFuZSBvcGVyYXRpb25zIHdpdGggd2F0Y2hwb2ludHMgZW5hYmxlZAorcHJvYyB0ZXN0X3N0ZXBwaW5nIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgaWYgW3J1bnRvIG1hcmtlcjFdIHRoZW4geworCWdkYl90ZXN0ICJ3YXRjaCBpdmFsMiIgIi4qXFtXd1xdYXRjaHBvaW50IFxbMC05XF0qOiBpdmFsMiIKKworCSMgV2VsbCwgbGV0J3Mgbm90IGJlIHRvbyBtdW5kYW5lLiAgSXQgc2hvdWxkIGJlIGEgKmJpdCogb2YgYSBjaGFsbGVuZ2UKKwlnZGJfdGVzdCAiYnJlYWsgZnVuYzIgaWYgMCIgIkJyZWFrcG9pbnQuKmF0LioiCisJZ2RiX3Rlc3QgInAgXCRmdW5jMl9icmVha3BvaW50X251bWJlciA9IFwkYnBudW0iICIgPSAuKiIKKworCSMgVGhlIEhQUEEgaGFzIGEgcHJvYmxlbSBoZXJlIGlmIGl0J3Mgbm90IHVzaW5nIGhhcmR3YXJlIHdhdGNocG9pbnRzCisJaWYge1sgaXN0YXJnZXQgImhwcGEqLSotKiIgXSAmJiAhWyBpc3RhcmdldCAiaHBwYSotKi0qYnNkKiIgXX0gdGhlbiB7CisJICAgICMgRG9uJ3QgYWN0dWFsbHkgdHJ5IGRvaW5nIHRoZSBjYWxsLCBpZiB3ZSBkbyB3ZSBjYW4ndCBjb250aW51ZS4KKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJjYWxsaW5nIGZ1bmN0aW9uIHdpdGggd2F0Y2hwb2ludCBlbmFibGVkIgorCX0gZWxzZSB7CisJICAgICMgVGhlIHByb2JsZW0gaXMgdGhhdCBHREIgY29uZnVzZXMgc3RlcHBpbmcgdGhyb3VnaCB0aGUgY2FsbAorCSAgICAjIGR1bW15IHdpdGggaGl0dGluZyB0aGUgYnJlYWtwb2ludCBhdCB0aGUgZW5kIG9mIHRoZSBjYWxsIGR1bW15LgorCSAgICAjIFdpbGwgYmUgZml4ZWQgb25jZSBhbGwgYXJjaGl0ZWN0dXJlcyBkZWZpbmUgCisJICAgICMgQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVC4KKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICAjIFRoaXMgZG9lc24ndCBvY2N1ciBpZiB0aGUgY2FsbCBkdW1teSBzdGFydHMgd2l0aCBhIGNhbGwsCisJICAgICMgYmVjYXVzZSB3ZSBhcmUgb3V0IG9mIHRoZSBkdW1teSBieSB0aGUgZmlyc3QgdGltZSB0aGUgaW5mZXJpb3IKKwkgICAgIyBzdG9wcy4KKwkgICAgY2xlYXJfeGZhaWwgImQxMHYqLSotKiIKKwkgICAgY2xlYXJfeGZhaWwgIm02OCotKi0qIgorCSAgICBjbGVhcl94ZmFpbCAiaSo4NiotKi0qIgorCSAgICBjbGVhcl94ZmFpbCAidmF4LSotKiIKKwkgICAgIyBUaGUgZm9sbG93aW5nIGFyY2hpdGVjdHVyZXMgZGVmaW5lIENBTExfRFVNTVlfQlJFQUtQT0lOVF9PRkZTRVQuCisJICAgIGNsZWFyX3hmYWlsICJhbHBoYS0qLSoiCisJICAgIGNsZWFyX3hmYWlsICJtaXBzKi0qLSoiCisJICAgIGNsZWFyX3hmYWlsICJzcGFyYy0qLSoiCisJICAgIGNsZWFyX3hmYWlsICJocHBhKi0qLSpic2QqIgorCSAgICAjIEl0IHdvcmtzIHdpdGggdGhlIGdlbmVyaWMgaW5mZXJpb3IgZnVuY3Rpb24gY2FsbGluZyBjb2RlIHRvby4KKwkgICAgY2xlYXJfeGZhaWwgIm1uMTAyMDAqLSotKiIKKwkgICAgY2xlYXJfeGZhaWwgIm1uMTAzMDAqLSotKiIKKwkgICAgZ2RiX3Rlc3QgInAgZnVuYzEgKCkiICI9IDczIiBcCisJCSJjYWxsaW5nIGZ1bmN0aW9uIHdpdGggd2F0Y2hwb2ludCBlbmFibGVkIgorCX0KKworCSMgCisJIyAiZmluaXNoIiBicmluZ3MgdXMgYmFjayB0byBtYWluLgorCSMgT24gc29tZSB0YXJnZXRzIChlLmcuIGFscGhhKSBnZGIgd2lsbCBzdG9wIGZyb20gdGhlIGZpbmlzaCBpbiBtaWRsaW5lCisJIyBvZiB0aGUgbWFya2VyMSBjYWxsLiBUaGlzIGlzIGR1ZSB0byByZWdpc3RlciByZXN0b3JpbmcgY29kZSBvbgorCSMgdGhlIGFscGhhIGFuZCBtaWdodCBiZSBjYXVzZWQgYnkgc3RhY2sgYWRqdXN0bWVudCBpbnN0cnVjdGlvbnMKKwkjIG9uIG90aGVyIHRhcmdldHMuIEluIHRoaXMgY2FzZSB3ZSB3aWxsIHN0ZXAgb25jZSBtb3JlLgorCSMKKworCXNlbmRfZ2RiICJmaW5pc2hcbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICJSdW4uKmV4aXQgZnJvbS4qbWFya2VyMS4qIGF0IiB7IH0KKwkgICAgZGVmYXVsdCB7IGZhaWwgImZpbmlzaCBmcm9tIG1hcmtlcjEiIDsgcmV0dXJuIH0KKwl9CisKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICJtYXJrZXIxIFxcKFxcKTsuKiRnZGJfcHJvbXB0ICQiIHsKKwkJc2VuZF9nZGIgInN0ZXBcbiIKKwkJZXhwX2NvbnRpbnVlCisJICAgIH0KKwkgICAgLXJlICJmdW5jMSBcXChcXCk7LiokZ2RiX3Byb21wdCAkIiB7CisJCXBhc3MgImZpbmlzaCBmcm9tIG1hcmtlcjEiCisJICAgIH0KKwkgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkJZmFpbCAiZmluaXNoIGZyb20gbWFya2VyMSIKKwkgICAgfQorCSAgICBkZWZhdWx0IHsgZmFpbCAiZmluaXNoIGZyb20gbWFya2VyMSIgOyByZXR1cm4gfQorCX0KKworCWdkYl90ZXN0ICJuZXh0IiAiZm9yIFxcKGNvdW50ID0gMC4qIiAibmV4dCB0byBgZm9yJyBpbiB3YXRjaHBvaW50LmV4cCIKKworCSMgTm93IHRlc3QgdGhhdCAidW50aWwiIHdvcmtzLiAgSXQncyBhIGJpdCB0cmlja3kgdG8gdGVzdAorCSMgInVudGlsIiwgYmVjYXVzZSBjb21waWxlcnMgZG9uJ3QgYWx3YXlzIGFycmFuZ2UgdGhlIGNvZGUKKwkjIGV4YWN0bHkgdGhlIHNhbWUgd2F5LCBhbmQgd2UgbWlnaHQgZ2V0IHNsaWdodGx5IGRpZmZlcmVudAorCSMgc2VxdWVuY2VzIG9mIHN0YXRlbWVudHMuICBCdXQgdGhlIGZvbGxvd2luZyBzaG91bGQgYmUgdHJ1ZQorCSMgKGlmIG5vdCBpdCBpcyBhIGNvbXBpbGVyIG9yIGEgZGVidWdnZXIgYnVnKTogVGhlIHVzZXIgd2hvCisJIyBkb2VzICJ1bnRpbCIgYXQgZXZlcnkgc3RhdGVtZW50IG9mIGEgbG9vcCBzaG91bGQgZW5kIHVwCisJIyBzdGVwcGluZyB0aHJvdWdoIHRoZSBsb29wIG9uY2UsIGFuZCB0aGUgZGVidWdnZXIgc2hvdWxkIG5vdAorCSMgc3RvcCBmb3IgYW55IG9mIHRoZSByZW1haW5pbmcgaXRlcmF0aW9ucy4KKworCWdkYl90ZXN0ICJ1bnRpbCIgIml2YWwxID0gY291bnQuKiIgInVudGlsIHRvIGl2YWwxIGFzc2lnbm1lbnQiCisJZ2RiX3Rlc3QgInVudGlsIiAiaXZhbDMgPSBjb3VudC4qIiAidW50aWwgdG8gaXZhbDMgYXNzaWdubWVudCIKKwlzZW5kX2dkYiAidW50aWxcbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICIoZm9yIFxcKGNvdW50ID0gMHxcfSkuKiRnZGJfcHJvbXB0ICQiIHsKKwkJZ2RiX3Rlc3QgInVudGlsIiAiaXZhbDEgPSBjb3VudDsgLy4gT3V0c2lkZSBsb29wIC4vIiBcCisJCSAgICAidW50aWwgb3V0IG9mIGxvb3AiCisJICAgIH0KKwkgICAgLXJlICJpdmFsMSA9IGNvdW50OyAvLiBPdXRzaWRlIGxvb3AgLi8uKiRnZGJfcHJvbXB0ICQiIHsKKwkJcGFzcyAidW50aWwgb3V0IG9mIGxvb3AiCisJICAgIH0KKwkgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkJZmFpbCAidW50aWwgb3V0IG9mIGxvb3AiCisJICAgIH0KKwkgICAgZGVmYXVsdCB7IGZhaWwgInVudGlsIG91dCBvZiBsb29wIiA7IHJldHVybiB9CisJfQorCisJZ2RiX3Rlc3QgInN0ZXAiICJpdmFsMiA9IGNvdW50LioiICJzdGVwIHRvIGl2YWwyIGFzc2lnbm1lbnQiCisgICAgfQorfQorCisjIFRlc3Qgc3RlcHBpbmcgYW5kIG90aGVyIG11bmRhbmUgb3BlcmF0aW9ucyB3aXRoIHdhdGNocG9pbnRzIGVuYWJsZWQKK3Byb2MgdGVzdF93YXRjaHBvaW50X3RyaWdnZXJlZF9pbl9zeXNjYWxsIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGIsbm9pbmZlcmlvcmlvXSB7CisJdmVyYm9zZSAiU2tpcHBpbmcgdGVzdF93YXRjaHBvaW50X3RyaWdnZXJlZF9pbl9zeXNjYWxsIGR1ZSB0byBub2luZmVyaW9yaW8iCisJcmV0dXJuCisgICAgfQorICAgICMgUnVuIHVudGlsIHdlIGdldCB0byB0aGUgZmlyc3QgbWFya2VyIGZ1bmN0aW9uLgorICAgIHNldCB4IDAKKyAgICBzZXQgeSAwCisgICAgc2V0IHRlc3RuYW1lICJXYXRjaCBidWZmZXIgcGFzc2VkIHRvIHJlYWQgc3lzY2FsbCIKKyAgICBpZiBbcnVudG8gbWFya2VyMl0gdGhlbiB7CisJZ2RiX3Rlc3QgIndhdGNoIGJ1ZlxbMFxdIiAiLipcW1d3XF1hdGNocG9pbnQgXFswLTlcXSo6IGJ1ZlxcXFswXFxcXSIKKwlnZGJfdGVzdCAid2F0Y2ggYnVmXFsxXF0iICIuKlxbV3dcXWF0Y2hwb2ludCBcWzAtOVxdKjogYnVmXFxcWzFcXFxdIgorCWdkYl90ZXN0ICJ3YXRjaCBidWZcWzJcXSIgIi4qXFtXd1xdYXRjaHBvaW50IFxbMC05XF0qOiBidWZcXFxbMlxcXF0iCisJZ2RiX3Rlc3QgIndhdGNoIGJ1ZlxbM1xdIiAiLipcW1d3XF1hdGNocG9pbnQgXFswLTlcXSo6IGJ1ZlxcXFszXFxcXSIKKwlnZGJfdGVzdCAid2F0Y2ggYnVmXFs0XF0iICIuKlxbV3dcXWF0Y2hwb2ludCBcWzAtOVxdKjogYnVmXFxcWzRcXFxdIgorCWdkYl90ZXN0ICJicmVhayBtYXJrZXI0IiAiLipCcmVha3BvaW50LioiCisKKwlnZGJfdGVzdCAic2V0IGRvcmVhZCA9IDEiICIiCisKKwkjIElmIHdlIHNlbmRfZ2RiICIxMjNcbiIgYmVmb3JlIGdkYiBoYXMgc3dpdGNoZWQgdGhlIHR0eSwgdGhlbiBpdCBnb2VzCisJIyB0byBnZGIsIG5vdCB0aGUgaW5mZXJpb3IsIGFuZCB3ZSBsb3NlLiAgU28gdGhhdCBpcyB3aHkgd2UgaGF2ZQorCSMgd2F0Y2hwb2ludC5jIHByb21wdCB1cywgc28gd2UgY2FuIHdhaXQgZm9yIHRoYXQgcHJvbXB0LgorCXNlbmRfZ2RiICJjb250aW51ZVxuIjsKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICJDb250aW51aW5nXFwuXHJcbnR5cGUgc3R1ZmYgZm9yIGJ1ZiBub3c6IiB7CisJCXBhc3MgImNvbnRpbnVlIHRvIHJlYWQiCisJICAgIH0KKwkgICAgZGVmYXVsdCB7CisJCWZhaWwgImNvbnRpbnVlIHRvIHJlYWQiOworCQlyZXR1cm4gOworCSAgICB9CisJfQorCisJc2VuZF9nZGIgIjEyM1xuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIi4qXFtXd1xdYXRjaHBvaW50LipidWZcXFxbMFxcXF0uKk9sZCB2YWx1ZSA9IDAuKk5ldyB2YWx1ZSA9IDQ5XFteXG5cXSpcbiIgeyBzZXQgeCBbZXhwciAkeCsxXSA7IGV4cF9jb250aW51ZSB9CisJICAgIC1yZSAiLipcW1d3XF1hdGNocG9pbnQuKmJ1ZlxcXFsxXFxcXS4qT2xkIHZhbHVlID0gMC4qTmV3IHZhbHVlID0gNTBcW15cblxdKlxuIiB7IHNldCB4IFtleHByICR4KzFdIDsgZXhwX2NvbnRpbnVlIH0KKwkgICAgLXJlICIuKlxbV3dcXWF0Y2hwb2ludC4qYnVmXFxcWzJcXFxdLipPbGQgdmFsdWUgPSAwLipOZXcgdmFsdWUgPSA1MVxbXlxuXF0qXG4iIHsgc2V0IHggW2V4cHIgJHgrMV0gOyBleHBfY29udGludWUgfQorCSAgICAtcmUgIi4qXFtXd1xdYXRjaHBvaW50LipidWZcXFxbM1xcXF0uKk9sZCB2YWx1ZSA9IDAuKk5ldyB2YWx1ZSA9IDEwXFteXG5cXSpcbiIgeyBzZXQgeCBbZXhwciAkeCsxXSA7IGV4cF9jb250aW51ZSB9CisJICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInNlbnQgMTIzIiB9CisJICAgIHRpbWVvdXQgeyBmYWlsICJzZW50IDEyMyAodGltZW91dCkiIH0KKwl9CisKKwkjIEV4YW1pbmUgdGhlIHZhbHVlcyBpbiBidWYgdG8gc2VlIGhvdyBtYW55IHdhdGNocG9pbnRzIHdlCisJIyBzaG91bGQgaGF2ZSBwcmludGVkLgorCXNlbmRfZ2RiICJwcmludCBidWZcWzBcXVxuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIi4qPSA0OS4qJGdkYl9wcm9tcHQgJCIgeyBzZXQgeSBbZXhwciAkeSsxXTsgcGFzcyAicHJpbnQgYnVmXFswXF0ifQorCSAgICAtcmUgIi4qPSAwLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IGJ1ZlxbMFxdIn0KKwkgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgYnVmXFswXF0ifQorCSAgICBkZWZhdWx0IHsgZmFpbCAicHJpbnQgYnVmXFswXF0ifQorCX0KKwlzZW5kX2dkYiAicHJpbnQgYnVmXFsxXF1cbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICIuKj0gNTAuKiRnZGJfcHJvbXB0ICQiIHsgc2V0IHkgW2V4cHIgJHkrMV07IHBhc3MgInByaW50IGJ1ZlxbMVxdIn0KKwkgICAgLXJlICIuKj0gMC4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBidWZcWzFcXSJ9CisJICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGJ1ZlxbMVxdIn0KKwkgICAgZGVmYXVsdCB7IGZhaWwgInByaW50IGJ1ZlxbMVxdIn0KKwl9CisJc2VuZF9nZGIgInByaW50IGJ1ZlxbMlxdXG4iCisJZ2RiX2V4cGVjdCB7CisJICAgIC1yZSAiLio9IDUxLiokZ2RiX3Byb21wdCAkIiB7IHNldCB5IFtleHByICR5KzFdOyBwYXNzICJwcmludCBidWZcWzJcXSJ9CisJICAgIC1yZSAiLio9IDAuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgYnVmXFsyXF0ifQorCSAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBidWZcWzJcXSJ9CisJICAgIGRlZmF1bHQgeyBmYWlsICJwcmludCBidWZcWzJcXSJ9CisJfQorCXNlbmRfZ2RiICJwcmludCBidWZcWzNcXVxuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIi4qPSAxMC4qJGdkYl9wcm9tcHQgJCIgeyBzZXQgeSBbZXhwciAkeSsxXTsgcGFzcyAicHJpbnQgYnVmXFszXF0ifQorCSAgICAtcmUgIi4qPSAwLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IGJ1ZlxbM1xdIn0KKwkgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgYnVmXFszXF0iIH0KKwkgICAgZGVmYXVsdCB7IGZhaWwgInByaW50IGJ1ZlxbM1xdIiB9CisJfQorCisJIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgorCWlmIFtleHByICR4PT0keV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgIiR0ZXN0bmFtZSAob25seSB0cmlnZ2VyZWQgJHggd2F0Y2hwb2ludHMsIGV4cGVjdGVkICR5KSJ9CisKKwkjIENvbnRpbnVlIHVudGlsIHdlIGhpdCB0aGUgZmluaXNoaW5nIG1hcmtlciBmdW5jdGlvbi4KKwkjIE1ha2Ugc3VyZSB3ZSBoaXQgbm8gbW9yZSB3YXRjaHBvaW50cy4KKwlnZGJfdGVzdCAiY29udCIgIkNvbnRpbnVpbmcuKkJyZWFrcG9pbnQuKm1hcmtlcjQgXFwoXFwpLioiIFwKKwkgICAgImNvbnRpbnVlIHRvIG1hcmtlcjQiCisKKwkjIERpc2FibGUgZXZlcnl0aGluZyBzbyB3ZSBjYW4gZmluaXNoIHRoZSBwcm9ncmFtIGF0IGZ1bGwgc3BlZWQKKwlnZGJfdGVzdCAiZGlzYWJsZSIgIiIgImRpc2FibGUgaW4gdGVzdF93YXRjaHBvaW50X3RyaWdnZXJlZF9pbl9zeXNjYWxsIgorCisJaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGIsbm9yZXN1bHRzXSB7IHJldHVybiB9CisKKwlnZGJfdGVzdCAiY29udCIgIkNvbnRpbnVpbmcuKlByb2dyYW0gZXhpdGVkIG5vcm1hbGx5LioiIFwKKwkgICAgImNvbnRpbnVlIHRvIGV4aXQgaW4gdGVzdF93YXRjaHBvaW50X3RyaWdnZXJlZF9pbl9zeXNjYWxsIgorICAgIH0KK30KKworIyBEbyBhIHNpbXBsZSB0ZXN0IG9mIG9mIHdhdGNoaW5nIHRocm91Z2ggYSBwb2ludGVyIHdoZW4gdGhlIHBvaW50ZXIKKyMgaXRzZWxmIGNoYW5nZXMuICBTaG91bGQgYWRkIHNvbWUgbW9yZSBjb21wbGljYXRlZCBzdHVmZiBoZXJlLgorCitwcm9jIHRlc3RfY29tcGxleF93YXRjaHBvaW50IHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgaWYgW3J1bnRvIG1hcmtlcjRdIHRoZW4geworCWdkYl90ZXN0ICJ3YXRjaCBwdHIxLT52YWwiICIuKlxbV3dcXWF0Y2hwb2ludCBcWzAtOVxdKjogcHRyMS0+dmFsIgorCWdkYl90ZXN0ICJicmVhayBtYXJrZXI1IiAiLipCcmVha3BvaW50LioiCisKKwlnZGJfdGVzdCAiY29udCIgIkNvbnRpbnVpbmcuKlxbV3dcXWF0Y2hwb2ludC4qcHRyMS0+dmFsLipPbGQgdmFsdWUgPSAxLipOZXcgdmFsdWUgPSAyLioiICJUZXN0IGNvbXBsZXggd2F0Y2hwb2ludCIKKworCSMgQ29udGludWUgdW50aWwgd2UgaGl0IHRoZSBtYXJrZXI1IGZ1bmN0aW9uLgorCSMgTWFrZSBzdXJlIHdlIGhpdCBubyBtb3JlIHdhdGNocG9pbnRzLgorCisJZ2RiX3Rlc3QgImNvbnQiICJDb250aW51aW5nLipCcmVha3BvaW50LiptYXJrZXI1IFxcKFxcKS4qIiBcCisJICAgICJkaWQgbm90IHRyaWdnZXIgd3Jvbmcgd2F0Y2hwb2ludCIKKworCSMgRGlzYWJsZSBldmVyeXRoaW5nIHNvIHdlIGNhbiBmaW5pc2ggdGhlIHByb2dyYW0gYXQgZnVsbCBzcGVlZAorCWdkYl90ZXN0ICJkaXNhYmxlIiAiIiAiZGlzYWJsZSBpbiB0ZXN0X2NvbXBsZXhfd2F0Y2hwb2ludCIKKworCWlmIFt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiLG5vcmVzdWx0c10geyByZXR1cm4gfQorCisKKwlnZGJfdGVzdCAiY29udCIgIkNvbnRpbnVpbmcuKlByb2dyYW0gZXhpdGVkIG5vcm1hbGx5LioiIFwKKwkgICAgImNvbnRpbnVlIHRvIGV4aXQgaW4gdGVzdF9jb21wbGV4X3dhdGNocG9pbnQiCisgICAgfQorfQorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAkYmluZmlsZQorc2V0IHRpbWVvdXQgNjAwCQordmVyYm9zZSAiVGltZW91dCBub3cgNjAwIHNlYy5cbiIKKworaWYgW2luaXRpYWxpemVdIHRoZW4geworCisgICAgdGVzdF9zaW1wbGVfd2F0Y2hwb2ludAorCisgICAgIyBUaGUgSURUL3NpbSBtb25pdG9yIG9ubHkgaGFzIDggKCEpIG9wZW4gZmlsZXMsIG9mIHdoaWNoIGl0IHVzZXMKKyAgICAjIDQgKCEpLiAgU28gd2UgaGF2ZSB0byBtYWtlIHN1cmUgb25lIHByb2dyYW0gZXhpdHMgYmVmb3JlCisgICAgIyBzdGFydGluZyBhbm90aGVyIG9uZS4KKyAgICBpZiBbaXN0YXJnZXQgIm1pcHMtaWR0LSoiXSB0aGVuIHsKKwlnZGJfZXhpdAorCWdkYl9zdGFydAorCWdkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCWdkYl9sb2FkICRiaW5maWxlCisJaW5pdGlhbGl6ZQorICAgIH0KKworICAgIHRlc3RfZGlzYWJsaW5nX3dhdGNocG9pbnRzCisKKyAgICAjIFNlZSBhYm92ZS4KKyAgICBpZiBbaXN0YXJnZXQgIm1pcHMtaWR0LSoiXSB0aGVuIHsKKwlnZGJfZXhpdAorCWdkYl9zdGFydAorCWdkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCWdkYl9sb2FkICRiaW5maWxlCisJaW5pdGlhbGl6ZQorICAgIH0KKworICAgIGlmICFbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYixjYW5ub3RfY2FsbF9mdW5jdGlvbnNdIHsKKwl0ZXN0X3N0ZXBwaW5nCisKKwkjIFNlZSBhYm92ZS4KKwlpZiBbaXN0YXJnZXQgIm1pcHMtaWR0LSoiXSB0aGVuIHsKKwkgICAgZ2RiX2V4aXQKKwkgICAgZ2RiX3N0YXJ0CisJICAgIGdkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCSAgICBnZGJfbG9hZCAkYmluZmlsZQorCSAgICBpbml0aWFsaXplCisJfQorICAgIH0KKworICAgICMgT25seSBlbmFibGVkIGZvciBzb21lIHRhcmdldHMgbWVyZWx5IGJlY2F1c2UgaXQgaGFzIG5vdCBiZWVuIHRlc3RlZCAKKyAgICAjIGVsc2V3aGVyZS4KKyAgICAjIE9uIHNwYXJjLXN1bi1zdW5vczQuMS4zLCBHREIgd2FzIHJ1bm5pbmcgYWxsIHRoZSB3YXkgdG8gdGhlIG1hcmtlcjQgCisgICAgIyBicmVha3BvaW50IGJlZm9yZSBzdG9wcGluZyBmb3IgdGhlIHdhdGNocG9pbnQuICBJIGRvbid0IGtub3cgd2h5LgorICAgIGlmIHtbaXN0YXJnZXQgImhwcGEqLSotKiJdfSB0aGVuIHsKKwl0ZXN0X3dhdGNocG9pbnRfdHJpZ2dlcmVkX2luX3N5c2NhbGwKKyAgICB9CisKKyAgICAjIFNlZSBhYm92ZS4KKyAgICBpZiBbaXN0YXJnZXQgIm1pcHMtaWR0LSoiXSB0aGVuIHsKKwlnZGJfZXhpdAorCWdkYl9zdGFydAorCWdkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCWdkYl9sb2FkICRiaW5maWxlCisJaW5pdGlhbGl6ZQorICAgIH0KKworICAgICMgT25seSBlbmFibGVkIGZvciBzb21lIHRhcmdldHMgbWVyZWx5IGJlY2F1c2UgaXQgaGFzIG5vdCBiZWVuIHRlc3RlZCAKKyAgICAjIGVsc2V3aGVyZS4KKyAgICBpZiB7W2lzdGFyZ2V0ICJocHBhKi0qLSoiXSB8fCBcCisJICAgIFtpc3RhcmdldCAic3BhcmMqLSotc3Vub3MqIl0gfHwgXAorCSAgICBbaXN0YXJnZXQgIm0zMnItKi0qIl19IHRoZW4geworCXRlc3RfY29tcGxleF93YXRjaHBvaW50CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS93aGF0aXMtZXhwLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvd2hhdGlzLWV4cC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViOTdlZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvd2hhdGlzLWV4cC5leHAKQEAgLTAsMCArMSwyMTcgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBFbGVuYSBaYW5ub25pIChlemFubm9uaUBjeWdudXMuY29tKQorCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBnZGIgdGVzdHN1aXRlCisjCisjIHRlc3RzIGZvciB3aGF0aXMgY29tbWFuZCBvbiBleHByZXNzaW9ucy4KKyMgdXNlZCBpbiBmaWxlIGV2YWwuYy4gVGhpcyBmbGF2b3Igb2Ygd2hhdGlzCisjIGNvbW1hbmQgcGVyZm9ybXMgZXZhbHVhdGlvbiBvZiBleHByZXNzaW9ucyB3L28gYWN0dWFsbHkKKyMgY29tcHV0aW5nIHRoZSB2YWx1ZSwgYnV0IGp1c3QgdGhlIHR5cGUKKyMgb2YgdGhlIHJlc3VsdC4gSXQgZ29lcyB0aHJvdWdoIHRoZSBldmFsdWF0ZV9zdWJleHBfc3RhbmRhcmQKKyMgd2l0aCB0aGUgRVZBTF9BVk9JRF9TSURFX0VGRkVDVFMgZmxhZyByYXRoZXIgdGhhbiBFVkFMX05PUk1BTAorIyAKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCisJfQorCisjCisjIHRlc3QgcnVubmluZyBwcm9ncmFtcworIworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAiaW50LXR5cGUiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIGFkZGl0aW9uYWxfZmxhZ3M9LXd9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCisgICAgfQorCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisKKyMKKyMgc2V0IGl0IHVwIGF0IGEgYnJlYWtwb2ludCBzbyB3ZSBjYW4gcGxheSB3aXRoIHRoZSB2YXJpYWJsZSB2YWx1ZXMKKyMKKworaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgICBwZXJyb3IgImNvdWxkbid0IHJ1biB0byBicmVha3BvaW50IgorICAgIGNvbnRpbnVlCit9CisKKyMKKyMgdGVzdCBleHByZXNzaW9ucyB3aXRoICJpbnQiIHR5cGVzCisjCisKK2dkYl90ZXN0ICJzZXQgdmFyaWFibGUgeD0xNCIgIiIgInNldCB2YXJpYWJsZSB4PTE0IgorZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB5PTIiICIiICJzZXQgdmFyaWFibGUgeT0yIgorZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB6PTIiICIiICJzZXQgdmFyaWFibGUgej0yIgorZ2RiX3Rlc3QgInNldCB2YXJpYWJsZSB3PTMiICIiICJzZXQgdmFyaWFibGUgdz0zIgorCitzZW5kX2dkYiAicHJpbnQgeFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjE0LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHgiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgeCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHgiIH0gICAgCisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgeVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB5IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeSIgfSAgICAKKyAgfQorCitzZW5kX2dkYiAicHJpbnQgelxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgeiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB6IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgeiIgfSAgICAKKyAgfQorCitzZW5kX2dkYiAicHJpbnQgd1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjMuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgdyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiB3IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgdyIgfSAgICAKKyAgfQorCisKKworc2VuZF9nZGIgIndoYXRpcyB4K3lcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLip0eXBlID0gbG9uZy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJ3aGF0aXMgdmFsdWUgb2YgeCt5IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgIndoYXRpcyB2YWx1ZSBvZiB4K3kiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSB3aGF0aXMgdmFsdWUgb2YgeCt5IiB9ICAgIAorICB9CisKK3NlbmRfZ2RiICJ3aGF0aXMgeC15XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qdHlwZSA9IGxvbmcuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAid2hhdGlzIHZhbHVlIG9mIHgteSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJ3aGF0aXMgdmFsdWUgb2YgeC15IiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgd2hhdGlzIHZhbHVlIG9mIHgteSIgfSAgICAKKyAgfQorCitzZW5kX2dkYiAid2hhdGlzIHgqeVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKnR5cGUgPSBsb25nLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgIndoYXRpcyB2YWx1ZSBvZiB4KnkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAid2hhdGlzIHZhbHVlIG9mIHgqeSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHdoYXRpcyB2YWx1ZSBvZiB4KnkiIH0gICAgCisgIH0KKworc2VuZF9nZGIgIndoYXRpcyB4L3lcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLip0eXBlID0gaW50LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgIndoYXRpcyB2YWx1ZSBvZiB4L3kiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAid2hhdGlzIHZhbHVlIG9mIHgveSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHdoYXRpcyB2YWx1ZSBvZiB4L3kiIH0gICAgCisgIH0KKworc2VuZF9nZGIgIndoYXRpcyB4JXlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLip0eXBlID0gaW50LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgIndoYXRpcyB2YWx1ZSBvZiB4JXkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAid2hhdGlzIHZhbHVlIG9mIHgleSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHdoYXRpcyB2YWx1ZSBvZiB4JXkiIH0gICAgCisgIH0KKworCisKK3NlbmRfZ2RiICJ3aGF0aXMgeD15XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qdHlwZSA9IGludC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJ3aGF0aXMgdmFsdWUgb2YgeD15IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgIndoYXRpcyB2YWx1ZSBvZiB4PXkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSB3aGF0aXMgdmFsdWUgb2YgeD15IiB9CisgIH0KKworCitzZW5kX2dkYiAid2hhdGlzIHgrPTJcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLip0eXBlID0gaW50LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgIndoYXRpcyB2YWx1ZSBvZiB4Kz0yIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgIndoYXRpcyB2YWx1ZSBvZiB4Kz0yIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgd2hhdGlzIHZhbHVlIG9mIHgrPTIiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJ3aGF0aXMgKyt4XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qdHlwZSA9IGludC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJ3aGF0aXMgdmFsdWUgb2YgKyt4IgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgIndoYXRpcyB2YWx1ZSBvZiArK3giIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSB3aGF0aXMgdmFsdWUgb2YgKyt4IiB9CisgIH0KKworc2VuZF9nZGIgIndoYXRpcyAtLXhcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLip0eXBlID0gaW50LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgIndoYXRpcyB2YWx1ZSBvZiAtLXgiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAid2hhdGlzIHZhbHVlIG9mIC0teCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHdoYXRpcyB2YWx1ZSBvZiAtLXgiIH0KKyAgfQorCitzZW5kX2dkYiAid2hhdGlzIHgrK1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKnR5cGUgPSBpbnQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAid2hhdGlzIHZhbHVlIG9mIHgrKyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJ3aGF0aXMgdmFsdWUgb2YgeCsrIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgd2hhdGlzIHZhbHVlIG9mIHgrKyIgfQorICB9CisKK3NlbmRfZ2RiICJ3aGF0aXMgeC0tXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qdHlwZSA9IGludC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJ3aGF0aXMgdmFsdWUgb2YgeC0tIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgIndoYXRpcyB2YWx1ZSBvZiB4LS0iIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSB3aGF0aXMgdmFsdWUgb2YgeC0tIiB9CisgIH0KKworZ2RiX2V4aXQKK3JldHVybiAwCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3doYXRpcy5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS93aGF0aXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDhkMWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS93aGF0aXMuYwpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqCVRlc3QgZmlsZSB3aXRoIGxvdHMgb2YgZGlmZmVyZW50IHR5cGVzLCBmb3IgdGVzdGluZyB0aGUKKyAqCSJ3aGF0aXMiIGNvbW1hbmQuCisgKi8KKworLyoKKyAqCUZpcnN0IHRoZSBiYXNpYyBDIHR5cGVzLgorICovCisKKyNpZiAhKGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfQUlYKSkKKyNkZWZpbmUgc2lnbmVkICAvKiovCisjZW5kaWYKKworY2hhcgkJdl9jaGFyOworc2lnbmVkIGNoYXIJdl9zaWduZWRfY2hhcjsKK3Vuc2lnbmVkIGNoYXIJdl91bnNpZ25lZF9jaGFyOworCitzaG9ydAkJdl9zaG9ydDsKK3NpZ25lZCBzaG9ydAl2X3NpZ25lZF9zaG9ydDsKK3Vuc2lnbmVkIHNob3J0CXZfdW5zaWduZWRfc2hvcnQ7CisKK2ludAkJdl9pbnQ7CitzaWduZWQgaW50CXZfc2lnbmVkX2ludDsKK3Vuc2lnbmVkIGludAl2X3Vuc2lnbmVkX2ludDsKKworbG9uZwkJdl9sb25nOworc2lnbmVkIGxvbmcJdl9zaWduZWRfbG9uZzsKK3Vuc2lnbmVkIGxvbmcJdl91bnNpZ25lZF9sb25nOworCitmbG9hdAkJdl9mbG9hdDsKK2RvdWJsZQkJdl9kb3VibGU7CisKKy8qCisgKglOb3cgc29tZSBkZXJpdmVkIHR5cGVzLCB3aGljaCBhcmUgYXJyYXlzLCBmdW5jdGlvbnMtcmV0dXJuaW5nLAorICoJcG9pbnRlcnMsIHN0cnVjdHVyZXMsIHVuaW9ucywgYW5kIGVudW1lcmF0aW9ucy4KKyAqLworCisvKioqKiBhcnJheXMgKioqKioqKi8KKworY2hhcgkJdl9jaGFyX2FycmF5WzJdOworc2lnbmVkIGNoYXIJdl9zaWduZWRfY2hhcl9hcnJheVsyXTsKK3Vuc2lnbmVkIGNoYXIJdl91bnNpZ25lZF9jaGFyX2FycmF5WzJdOworCitzaG9ydAkJdl9zaG9ydF9hcnJheVsyXTsKK3NpZ25lZCBzaG9ydAl2X3NpZ25lZF9zaG9ydF9hcnJheVsyXTsKK3Vuc2lnbmVkIHNob3J0CXZfdW5zaWduZWRfc2hvcnRfYXJyYXlbMl07CisKK2ludAkJdl9pbnRfYXJyYXlbMl07CitzaWduZWQgaW50CXZfc2lnbmVkX2ludF9hcnJheVsyXTsKK3Vuc2lnbmVkIGludAl2X3Vuc2lnbmVkX2ludF9hcnJheVsyXTsKKworbG9uZwkJdl9sb25nX2FycmF5WzJdOworc2lnbmVkIGxvbmcJdl9zaWduZWRfbG9uZ19hcnJheVsyXTsKK3Vuc2lnbmVkIGxvbmcJdl91bnNpZ25lZF9sb25nX2FycmF5WzJdOworCitmbG9hdAkJdl9mbG9hdF9hcnJheVsyXTsKK2RvdWJsZQkJdl9kb3VibGVfYXJyYXlbMl07CisKKy8qKioqIHBvaW50ZXJzICoqKioqKiovCisKKy8qIE1ha2Ugc3VyZSB0aGV5IHN0aWxsIHByaW50IGFzIHBvaW50ZXIgdG8gZm9vIGV2ZW4gdGhlcmUgaXMgYSB0eXBlZGVmCisgICBmb3IgdGhhdCB0eXBlLiAgVGVzdCB0aGlzIG5vdCBqdXN0IGZvciBjaGFyICosIHdoaWNoIG1pZ2h0IGJlCisgICBhIHNwZWNpYWwgY2FzZSBrbHVkZ2UgaW4gR0RCIChVbml4IHN5c3RlbSBpbmNsdWRlIGZpbGVzIGxpa2UgdG8gZGVmaW5lCisgICBjYWRkcl90KSwgYnV0IGZvciBhIHZhcmlldHkgb2YgdHlwZXMuICAqLwordHlwZWRlZiBjaGFyICpjaGFyX2FkZHI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICp1c2hvcnRfYWRkcjsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgKnNsb25nX2FkZHI7CisKK2NoYXIJCSp2X2NoYXJfcG9pbnRlcjsKK3NpZ25lZCBjaGFyCSp2X3NpZ25lZF9jaGFyX3BvaW50ZXI7Cit1bnNpZ25lZCBjaGFyCSp2X3Vuc2lnbmVkX2NoYXJfcG9pbnRlcjsKKworc2hvcnQJCSp2X3Nob3J0X3BvaW50ZXI7CitzaWduZWQgc2hvcnQJKnZfc2lnbmVkX3Nob3J0X3BvaW50ZXI7Cit1bnNpZ25lZCBzaG9ydAkqdl91bnNpZ25lZF9zaG9ydF9wb2ludGVyOworCitpbnQJCSp2X2ludF9wb2ludGVyOworc2lnbmVkIGludAkqdl9zaWduZWRfaW50X3BvaW50ZXI7Cit1bnNpZ25lZCBpbnQJKnZfdW5zaWduZWRfaW50X3BvaW50ZXI7CisKK2xvbmcJCSp2X2xvbmdfcG9pbnRlcjsKK3NpZ25lZCBsb25nCSp2X3NpZ25lZF9sb25nX3BvaW50ZXI7Cit1bnNpZ25lZCBsb25nCSp2X3Vuc2lnbmVkX2xvbmdfcG9pbnRlcjsKKworZmxvYXQJCSp2X2Zsb2F0X3BvaW50ZXI7Citkb3VibGUJCSp2X2RvdWJsZV9wb2ludGVyOworCisvKioqKiBzdHJ1Y3RzICoqKioqKiovCisKK3N0cnVjdCB0X3N0cnVjdCB7CisgICAgY2hhcgl2X2NoYXJfbWVtYmVyOworICAgIHNob3J0CXZfc2hvcnRfbWVtYmVyOworICAgIGludAkJdl9pbnRfbWVtYmVyOworICAgIGxvbmcJdl9sb25nX21lbWJlcjsKKyAgICBmbG9hdAl2X2Zsb2F0X21lbWJlcjsKKyAgICBkb3VibGUJdl9kb3VibGVfbWVtYmVyOworfSB2X3N0cnVjdDE7CisKK3N0cnVjdCB7CisgICAgY2hhcgl2X2NoYXJfbWVtYmVyOworICAgIHNob3J0CXZfc2hvcnRfbWVtYmVyOworICAgIGludAkJdl9pbnRfbWVtYmVyOworICAgIGxvbmcJdl9sb25nX21lbWJlcjsKKyAgICBmbG9hdAl2X2Zsb2F0X21lbWJlcjsKKyAgICBkb3VibGUJdl9kb3VibGVfbWVtYmVyOworfSB2X3N0cnVjdDI7CisKKy8qKioqIHVuaW9ucyAqKioqKioqLworCit1bmlvbiB0X3VuaW9uIHsKKyAgICBjaGFyCXZfY2hhcl9tZW1iZXI7CisgICAgc2hvcnQJdl9zaG9ydF9tZW1iZXI7CisgICAgaW50CQl2X2ludF9tZW1iZXI7CisgICAgbG9uZwl2X2xvbmdfbWVtYmVyOworICAgIGZsb2F0CXZfZmxvYXRfbWVtYmVyOworICAgIGRvdWJsZQl2X2RvdWJsZV9tZW1iZXI7Cit9IHZfdW5pb247CisKK3VuaW9uIHsKKyAgICBjaGFyCXZfY2hhcl9tZW1iZXI7CisgICAgc2hvcnQJdl9zaG9ydF9tZW1iZXI7CisgICAgaW50CQl2X2ludF9tZW1iZXI7CisgICAgbG9uZwl2X2xvbmdfbWVtYmVyOworICAgIGZsb2F0CXZfZmxvYXRfbWVtYmVyOworICAgIGRvdWJsZQl2X2RvdWJsZV9tZW1iZXI7Cit9IHZfdW5pb24yOworCisvKioqIEZ1bmN0aW9ucyByZXR1cm5pbmcgdHlwZSAqKioqKioqKi8KKworY2hhcgkJdl9jaGFyX2Z1bmMgKCkgeyByZXR1cm4oMCk7IH0KK3NpZ25lZCBjaGFyCXZfc2lnbmVkX2NoYXJfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KK3Vuc2lnbmVkIGNoYXIJdl91bnNpZ25lZF9jaGFyX2Z1bmMgKCkgeyByZXR1cm4gKDApOyB9CisKK3Nob3J0CQl2X3Nob3J0X2Z1bmMgKCkgeyByZXR1cm4gKDApOyB9CitzaWduZWQgc2hvcnQJdl9zaWduZWRfc2hvcnRfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KK3Vuc2lnbmVkIHNob3J0CXZfdW5zaWduZWRfc2hvcnRfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KKworaW50CQl2X2ludF9mdW5jICgpIHsgcmV0dXJuICgwKTsgfQorc2lnbmVkIGludAl2X3NpZ25lZF9pbnRfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KK3Vuc2lnbmVkIGludAl2X3Vuc2lnbmVkX2ludF9mdW5jICgpIHsgcmV0dXJuICgwKTsgfQorCitsb25nCQl2X2xvbmdfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KK3NpZ25lZCBsb25nCXZfc2lnbmVkX2xvbmdfZnVuYyAoKSB7IHJldHVybiAoMCk7IH0KK3Vuc2lnbmVkIGxvbmcJdl91bnNpZ25lZF9sb25nX2Z1bmMgKCkgeyByZXR1cm4gKDApOyB9CisKK2Zsb2F0CQl2X2Zsb2F0X2Z1bmMgKCkgeyByZXR1cm4gKDAuMCk7IH0KK2RvdWJsZQkJdl9kb3VibGVfZnVuYyAoKSB7IHJldHVybiAoMC4wKTsgfQorCisvKioqKiBTb21lIG1pc2MgbW9yZSBjb21wbGljYXRlZCB0aGluZ3MgKioqKioqKi8KKworc3RydWN0IGxpbmsgeworCXN0cnVjdCBsaW5rICpuZXh0OworI2lmZGVmIF9fU1REQ19fCisJc3RydWN0IGxpbmsgKigqbGlua2Z1bmMpIChzdHJ1Y3QgbGluayAqdGhpcywgaW50IGZsYWdzKTsKKyNlbHNlCisJc3RydWN0IGxpbmsgKigqbGlua2Z1bmMpICgpOworI2VuZGlmCisJc3RydWN0IHRfc3RydWN0IHN0dWZmWzFdWzJdWzNdOworfSAqc19saW5rOworCit1bmlvbiB0dV9saW5rIHsKKwlzdHJ1Y3QgbGluayAqbmV4dDsKKyNpZmRlZiBfX1NURENfXworCXN0cnVjdCBsaW5rICooKmxpbmtmdW5jKSAoc3RydWN0IGxpbmsgKnRoaXMsIGludCBmbGFncyk7CisjZWxzZQorCXN0cnVjdCBsaW5rICooKmxpbmtmdW5jKSAoKTsKKyNlbmRpZgorCXN0cnVjdCB0X3N0cnVjdCBzdHVmZlsxXVsyXVszXTsKK30gdV9saW5rOworCitzdHJ1Y3Qgb3V0ZXJfc3RydWN0IHsKKwlpbnQgb3V0ZXJfaW50OworCXN0cnVjdCBpbm5lcl9zdHJ1Y3QgeworCQlpbnQgaW5uZXJfaW50OworCQlsb25nIGlubmVyX2xvbmc7CisJfWlubmVyX3N0cnVjdF9pbnN0YW5jZTsKKwl1bmlvbiBpbm5lcl91bmlvbiB7CisJCWludCBpbm5lcl91bmlvbl9pbnQ7CisJCWxvbmcgaW5uZXJfdW5pb25fbG9uZzsKKwl9aW5uZXJfdW5pb25faW5zdGFuY2U7CisJbG9uZyBvdXRlcl9sb25nOworfSBuZXN0ZWRfc3U7CisKKy8qKioqIEVudW1lcmF0aW9ucyAqKioqKioqLworCitlbnVtIGNvbG9ycyB7cmVkLCBncmVlbiwgYmx1ZX0gY29sb3I7CitlbnVtIGNhcnMge2NoZXZ5LCBmb3JkLCBwb3JzY2hlfSBjbHVua2VyOworCisvKioqKioqKioqKiovCisKK21haW4gKCkKK3sKKyNpZmRlZiB1c2VzdHVicworICBzZXRfZGVidWdfdHJhcHMoKTsKKyAgYnJlYWtwb2ludCgpOworI2VuZGlmCisgIC8qIFNvbWUgbGlua2VycyAoZS5nLiBvbiBBSVgpIHJlbW92ZSB1bnJlZmVyZW5jZWQgdmFyaWFibGVzLAorICAgICBzbyBtYWtlIHN1cmUgdG8gcmVmZXJlbmNlIHRoZW0uICovCisgIHZfY2hhciA9IDA7CisgIHZfc2lnbmVkX2NoYXIgPSAxOworICB2X3Vuc2lnbmVkX2NoYXIgPSAyOworCisgIHZfc2hvcnQgPSAzOworICB2X3NpZ25lZF9zaG9ydCA9IDQ7CisgIHZfdW5zaWduZWRfc2hvcnQgPSA1OyAgICAKKworICB2X2ludCA9IDY7CisgIHZfc2lnbmVkX2ludCA9IDc7CisgIHZfdW5zaWduZWRfaW50ID0gODsgICAgCisKKyAgdl9sb25nID0gOTsKKyAgdl9zaWduZWRfbG9uZyA9IDEwOworICB2X3Vuc2lnbmVkX2xvbmcgPSAxMTsgICAgCisgIAorICB2X2Zsb2F0ID0gMTAwLjA7CisgIHZfZG91YmxlID0gMjAwLjA7CisKKworICB2X2NoYXJfYXJyYXlbMF0gPSB2X2NoYXI7CisgIHZfc2lnbmVkX2NoYXJfYXJyYXlbMF0gPSB2X3NpZ25lZF9jaGFyOworICB2X3Vuc2lnbmVkX2NoYXJfYXJyYXlbMF0gPSB2X3Vuc2lnbmVkX2NoYXI7CisKKyAgdl9zaG9ydF9hcnJheVswXSA9IHZfc2hvcnQ7CisgIHZfc2lnbmVkX3Nob3J0X2FycmF5WzBdID0gdl9zaWduZWRfc2hvcnQ7CisgIHZfdW5zaWduZWRfc2hvcnRfYXJyYXlbMF0gPSB2X3Vuc2lnbmVkX3Nob3J0OworCisgIHZfaW50X2FycmF5WzBdID0gdl9pbnQ7CisgIHZfc2lnbmVkX2ludF9hcnJheVswXSA9IHZfc2lnbmVkX2ludDsKKyAgdl91bnNpZ25lZF9pbnRfYXJyYXlbMF0gPSB2X3Vuc2lnbmVkX2ludDsKKworICB2X2xvbmdfYXJyYXlbMF0gPSB2X2xvbmc7CisgIHZfc2lnbmVkX2xvbmdfYXJyYXlbMF0gPSB2X3NpZ25lZF9sb25nOworICB2X3Vuc2lnbmVkX2xvbmdfYXJyYXlbMF0gPSB2X3Vuc2lnbmVkX2xvbmc7CisKKyAgdl9mbG9hdF9hcnJheVswXSA9IHZfZmxvYXQ7CisgIHZfZG91YmxlX2FycmF5WzBdID0gdl9kb3VibGU7CisKKyAgdl9jaGFyX3BvaW50ZXIgPSAmdl9jaGFyOworICB2X3NpZ25lZF9jaGFyX3BvaW50ZXIgPSAmdl9zaWduZWRfY2hhcjsKKyAgdl91bnNpZ25lZF9jaGFyX3BvaW50ZXIgPSAmdl91bnNpZ25lZF9jaGFyOworCisgIHZfc2hvcnRfcG9pbnRlciA9ICZ2X3Nob3J0OworICB2X3NpZ25lZF9zaG9ydF9wb2ludGVyID0gJnZfc2lnbmVkX3Nob3J0OworICB2X3Vuc2lnbmVkX3Nob3J0X3BvaW50ZXIgPSAmdl91bnNpZ25lZF9zaG9ydDsKKworICB2X2ludF9wb2ludGVyID0gJnZfaW50OworICB2X3NpZ25lZF9pbnRfcG9pbnRlciA9ICZ2X3NpZ25lZF9pbnQ7CisgIHZfdW5zaWduZWRfaW50X3BvaW50ZXIgPSAmdl91bnNpZ25lZF9pbnQ7CisKKyAgdl9sb25nX3BvaW50ZXIgPSAmdl9sb25nOworICB2X3NpZ25lZF9sb25nX3BvaW50ZXIgPSAmdl9zaWduZWRfbG9uZzsKKyAgdl91bnNpZ25lZF9sb25nX3BvaW50ZXIgPSAmdl91bnNpZ25lZF9sb25nOworCisgIHZfZmxvYXRfcG9pbnRlciA9ICZ2X2Zsb2F0OworICB2X2RvdWJsZV9wb2ludGVyID0gJnZfZG91YmxlOworCisgIGNvbG9yID0gcmVkOworICBjbHVua2VyID0gcG9yc2NoZTsKKworICB1X2xpbmsubmV4dCA9IHNfbGluazsKKworICB2X3VuaW9uMi52X3Nob3J0X21lbWJlciA9IHZfdW5pb24udl9zaG9ydF9tZW1iZXI7CisKKyAgdl9zdHJ1Y3QxLnZfY2hhcl9tZW1iZXIgPSAwOworICB2X3N0cnVjdDIudl9jaGFyX21lbWJlciA9IDA7CisKKyAgbmVzdGVkX3N1Lm91dGVyX2ludCA9IDA7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS93aGF0aXMuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS93aGF0aXMuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNGU4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3doYXRpcy5leHAKQEAgLTAsMCArMSwzOTMgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5ODgsIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUuIChyb2JAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgeworICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCisjCisjIHRlc3QgcnVubmluZyBwcm9ncmFtcworIworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSB3aGF0aXMKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKKyMgQ3JlYXRlIGFuZCBzb3VyY2UgdGhlIGZpbGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIKKyMgdXNlZCB0byBjb21waWxlIHRoZSB0ZXN0IGNhc2UuCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0geworICAgIHJldHVybiAtMTsKK30KKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICRiaW5maWxlCisKKyMgSWYgd2UgZGlkIG5vdCB1c2UgdGhlIHNpZ25lZCBrZXl3b3JkIHdoZW4gY29tcGlsaW5nIHRoZSBmaWxlLCBkb24ndAorIyBleHBlY3QgR0RCIHRvIGtub3cgdGhhdCBjaGFyIGlzIHNpZ25lZC4KK2lmICRzaWduZWRfa2V5d29yZF9ub3RfdXNlZCB0aGVuIHsKKyAgICBzZXQgc2lnbmVkX2NoYXIgImNoYXIiCit9IGVsc2UgeworICAgIHNldCBzaWduZWRfY2hhciAic2lnbmVkIGNoYXIiCit9CisKKyMgRGVmaW5lIGEgcHJvY2VkdXJlIHRvIHNldCB1cCBhbiB4ZmFpbCBmb3IgYWxsIHRhcmdldHMgdGhhdCBwdXQgb3V0IGEKKyMgYGxvbmcnIHR5cGUgYXMgYW4gYGludCcgdHlwZS4KKyMgU3VuL1VsdHJpeCBjYyBoYXZlIHRoaXMgcHJvYmxlbS4KKyMgSXQgd2FzIHNhaWQgdGhhdCBDT0ZGIHRhcmdldHMgY2FuIG5vdCBkaXN0aW5ndWlzaCBpbnQgZnJvbSBsb25nIGVpdGhlci4KKworcHJvYyBzZXR1cF94ZmFpbF9vbl9sb25nX3ZzX2ludCB7fSB7CisgICAgZ2xvYmFsIGdjY19jb21waWxlZAorCisgICAgaWYgeyEkZ2NjX2NvbXBpbGVkfSB7CisJc2V0dXBfeGZhaWwgIiotc3VuLXN1bm9zNCoiICIqLSotdWx0cml4KiIgImkqODYtc2VxdWVudC1ic2QqIgorICAgIH0KK30KKworIworIyBUZXN0IHdoYXRpcyBjb21tYW5kIHdpdGggYmFzaWMgQyB0eXBlcworIworIyBUaGUgbmFtZSBwcmludGVkIG5vdyAoYXMgb2YgMjMgTWF5IDE5OTMpIGlzIHdoYXRldmVyIG5hbWUgdGhlIGNvbXBpbGVyCisjIHVzZXMgaW4gdGhlIHN0YWJzLiAgU28gd2UgbmVlZCB0byBkZWFsIHdpdGggbmFtZXMgYm90aCBmcm9tIGdjYyBhbmQKKyMgbmF0aXZlIGNvbXBpbGVycy4KKyMKK2dkYl90ZXN0ICJ3aGF0aXMgdl9jaGFyIiBcCisgICAgInR5cGUgPSAodW5zaWduZWQgY2hhcnxjaGFyKSIgXAorICAgICJ3aGF0aXMgY2hhciIKKworc2V0dXBfeGZhaWwgImEyOWstKi0qIgoraWYgeyEkZ2NjX2NvbXBpbGVkfSB0aGVuIHsgc2V0dXBfeGZhaWwgIm1pcHMtc2dpLWlyaXgqIiB9CitnZGJfdGVzdCAid2hhdGlzIHZfc2lnbmVkX2NoYXIiIFwKKyAgICAidHlwZSA9ICRzaWduZWRfY2hhciIgXAorICAgICJ3aGF0aXMgc2lnbmVkIGNoYXIiCisKK2dkYl90ZXN0ICJ3aGF0aXMgdl91bnNpZ25lZF9jaGFyIiBcCisgICAgInR5cGUgPSB1bnNpZ25lZCBjaGFyIiBcCisgICAgIndoYXRpcyB1bnNpZ25lZCBjaGFyIgorCitnZGJfdGVzdCAid2hhdGlzIHZfc2hvcnQiIFwKKyAgICAidHlwZSA9IChzaG9ydHxzaG9ydCBpbnQpIiBcCisgICAgIndoYXRpcyBzaG9ydCIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X3NpZ25lZF9zaG9ydCIgXAorICAgICJ0eXBlID0gKHNob3J0fHNob3J0IGludHxzaWduZWQgc2hvcnR8c2lnbmVkIHNob3J0IGludCkiIFwKKyAgICAid2hhdGlzIHNpZ25lZCBzaG9ydCIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X3Vuc2lnbmVkX3Nob3J0IiBcCisgICAgInR5cGUgPSAodW5zaWduZWQgc2hvcnR8c2hvcnQgdW5zaWduZWQgaW50KSIgXAorICAgICJ3aGF0aXMgdW5zaWduZWQgc2hvcnQiIAorCitnZGJfdGVzdCAid2hhdGlzIHZfaW50IiBcCisgICAgInR5cGUgPSBpbnQiIFwKKyAgICAid2hhdGlzIGludCIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X3NpZ25lZF9pbnQiIFwKKyAgICAidHlwZSA9IChzaWduZWQgfClpbnQiIFwKKyAgICAid2hhdGlzIHNpZ25lZCBpbnQiCisKK2dkYl90ZXN0ICJ3aGF0aXMgdl91bnNpZ25lZF9pbnQiIFwKKyAgICAidHlwZSA9IHVuc2lnbmVkIGludCIgXAorICAgICJ3aGF0aXMgdW5zaWduZWQgaW50IgorCitzZXR1cF94ZmFpbF9vbl9sb25nX3ZzX2ludAorIyBBSVggeGxjIGdldHMgdGhpcyB3cm9uZyBhbmQgdW5zaWduZWQgbG9uZyByaWdodC4gIEdvIGZpZ3VyZS4KK2lmIHshJGdjY19jb21waWxlZH0gdGhlbiB7c2V0dXBfeGZhaWwgInJzNjAwMC0qLWFpeCoifQorZ2RiX3Rlc3QgIndoYXRpcyB2X2xvbmciIFwKKyAgICAidHlwZSA9IChsb25nfGxvbmcgaW50KSIgXAorICAgICJ3aGF0aXMgbG9uZyIKKworc2V0dXBfeGZhaWxfb25fbG9uZ192c19pbnQKKyMgQUlYIHhsYyBnZXRzIHRoaXMgd3JvbmcgYW5kIHVuc2lnbmVkIGxvbmcgcmlnaHQuICBHbyBmaWd1cmUuCitpZiB7ISRnY2NfY29tcGlsZWR9IHRoZW4ge3NldHVwX3hmYWlsICJyczYwMDAtKi1haXgqIn0KK2dkYl90ZXN0ICJ3aGF0aXMgdl9zaWduZWRfbG9uZyIgXAorICAgICJ0eXBlID0gKHNpZ25lZCB8KShsb25nfGxvbmcgaW50KSIgXAorICAgICJ3aGF0aXMgc2lnbmVkIGxvbmciCisKK3NldHVwX3hmYWlsX29uX2xvbmdfdnNfaW50CitnZGJfdGVzdCAid2hhdGlzIHZfdW5zaWduZWRfbG9uZyIgXAorICAgICJ0eXBlID0gKHVuc2lnbmVkIGxvbmd8bG9uZyB1bnNpZ25lZCBpbnQpIiBcCisgICAgIndoYXRpcyB1bnNpZ25lZCBsb25nIgorCitnZGJfdGVzdCAid2hhdGlzIHZfZmxvYXQiIFwKKyAgICAidHlwZSA9IGZsb2F0IiBcCisgICAgIndoYXRpcyBmbG9hdCIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X2RvdWJsZSIgXAorICAgICJ0eXBlID0gZG91YmxlIiBcCisgICAgIndoYXRpcyBkb3VibGUiCisKKworIyB0ZXN0IHdoYXRpcyBjb21tYW5kIHdpdGggYXJyYXlzCisjCisjIFdlIGFscmVhZHkgdGVzdGVkIHdoZXRoZXIgY2hhciBwcmludHMgYXMgImNoYXIiLCBzbyBoZXJlIHdlIGFjY2VwdAorIyAidW5zaWduZWQgY2hhciIsICJzaWduZWQgY2hhciIsIGFuZCBvdGhlciBwZXJ2ZXJzaW9ucy4gIE5vIG5lZWQgZm9yIG1vcmUKKyMgdGhhbiBvbmUgeGZhaWwgZm9yIHRoZSBzYW1lIHRoaW5nLgorZ2RiX3Rlc3QgIndoYXRpcyB2X2NoYXJfYXJyYXkiIFwKKyAgICAidHlwZSA9IChzaWduZWQgfHVuc2lnbmVkIHwpY2hhciBcXFxbMlxcXF0iIFwKKyAgICAid2hhdGlzIGNoYXIgYXJyYXkiCisKK2dkYl90ZXN0ICJ3aGF0aXMgdl9zaWduZWRfY2hhcl9hcnJheSIgXAorICAgICJ0eXBlID0gKHNpZ25lZCB8dW5zaWduZWQgfCljaGFyIFxcXFsyXFxcXSIgXAorICAgICJ3aGF0aXMgc2lnbmVkIGNoYXIgYXJyYXkiCisKK2dkYl90ZXN0ICJ3aGF0aXMgdl91bnNpZ25lZF9jaGFyX2FycmF5IiBcCisgICAgInR5cGUgPSB1bnNpZ25lZCBjaGFyIFxcXFsyXFxcXSIgXAorICAgICJ3aGF0aXMgdW5zaWduZWQgY2hhciBhcnJheSIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X3Nob3J0X2FycmF5IiBcCisgICAgInR5cGUgPSAoc2hvcnR8c2hvcnQgaW50KSBcXFxbMlxcXF0iIFwKKyAgICAid2hhdGlzIHNob3J0IGFycmF5IgorCitnZGJfdGVzdCAid2hhdGlzIHZfc2lnbmVkX3Nob3J0X2FycmF5IiBcCisgICAgInR5cGUgPSAoc2lnbmVkIHwpKHNob3J0fHNob3J0IGludCkgXFxcWzJcXFxdIiBcCisgICAgIndoYXRpcyBzaWduZWQgc2hvcnQgYXJyYXkiCisKK2dkYl90ZXN0ICJ3aGF0aXMgdl91bnNpZ25lZF9zaG9ydF9hcnJheSIgXAorICAgICJ0eXBlID0gKHVuc2lnbmVkIHNob3J0fHNob3J0IHVuc2lnbmVkIGludCkgXFxcWzJcXFxdIiBcCisgICAgIndoYXRpcyB1bnNpZ25lZCBzaG9ydCBhcnJheSIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X2ludF9hcnJheSIgXAorICAgICJ0eXBlID0gaW50IFxcXFsyXFxcXSIgXAorICAgICJ3aGF0aXMgaW50IGFycmF5IgorCitnZGJfdGVzdCAid2hhdGlzIHZfc2lnbmVkX2ludF9hcnJheSIgXAorICAgICJ0eXBlID0gKHNpZ25lZCB8KWludCBcXFxbMlxcXF0iIFwKKyAgICAid2hhdGlzIHNpZ25lZCBpbnQgYXJyYXkiCisKK2dkYl90ZXN0ICJ3aGF0aXMgdl91bnNpZ25lZF9pbnRfYXJyYXkiIFwKKyAgICAidHlwZSA9IHVuc2lnbmVkIGludCBcXFxbMlxcXF0iIFwKKyAgICAid2hhdGlzIHVuc2lnbmVkIGludCBhcnJheSIKKworIyBXZSBhbHJlYWR5IHRlc3RlZCB3aGV0aGVyIGxvbmcgcHJpbnRzIGFzIGxvbmcsIHNvIGhlcmUgd2UgYWNjZXB0IGludAorIyBObyBuZWVkIGZvciBtb3JlIHRoYW4gb25lIHhmYWlsIGZvciB0aGUgc2FtZSB0aGluZy4KK2dkYl90ZXN0ICJ3aGF0aXMgdl9sb25nX2FycmF5IiBcCisgICAgInR5cGUgPSAoaW50fGxvbmd8bG9uZyBpbnQpIFxcXFsyXFxcXSIgXAorICAgICJ3aGF0aXMgbG9uZyBhcnJheSIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X3NpZ25lZF9sb25nX2FycmF5IiBcCisgICAgInR5cGUgPSAoc2lnbmVkIHwpKGludHxsb25nfGxvbmcgaW50KSBcXFxbMlxcXF0iIFwKKyAgICAid2hhdGlzIHNpZ25lZCBsb25nIGFycmF5IgorCitnZGJfdGVzdCAid2hhdGlzIHZfdW5zaWduZWRfbG9uZ19hcnJheSIgXAorICAgICJ0eXBlID0gKHVuc2lnbmVkIChpbnR8bG9uZ3xsb25nIGludCl8bG9uZyB1bnNpZ25lZCBpbnQpIFxcXFsyXFxcXSIgXAorICAgICJ3aGF0aXMgdW5zaWduZWQgbG9uZyBhcnJheSIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X2Zsb2F0X2FycmF5IiBcCisgICAgInR5cGUgPSBmbG9hdCBcXFxbMlxcXF0iIFwKKyAgICAid2hhdGlzIGZsb2F0IGFycmF5IgorCitnZGJfdGVzdCAid2hhdGlzIHZfZG91YmxlX2FycmF5IiBcCisgICAgInR5cGUgPSBkb3VibGUgXFxcWzJcXFxdIiBcCisgICAgIndoYXRpcyBkb3VibGUgYXJyYXkiCisKKworIyB0ZXN0IHdoYXRpcyBjb21tYW5kIHdpdGggcG9pbnRlcnMKKyMKKyMgV2UgYWxyZWFkeSB0ZXN0ZWQgd2hldGhlciBjaGFyIHByaW50cyBhcyBjaGFyLCBzbyBhY2NlcHQgdmFyaW91cyBwZXJ2ZXJzaW9ucworIyBoZXJlLiAgV2UgZXNwZWNpYWxseSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSB0ZXN0IHRoYXQgaXQgZG9lc24ndCBwcmludCBhcworIyBjYWRkcl90LgorZ2RiX3Rlc3QgIndoYXRpcyB2X2NoYXJfcG9pbnRlciIgXAorICAgICJ0eXBlID0gKHVuc2lnbmVkIHxzaWduZWQgfCljaGFyIFxcKiIgXAorICAgICJ3aGF0aXMgY2hhciBwb2ludGVyIgorCitnZGJfdGVzdCAid2hhdGlzIHZfc2lnbmVkX2NoYXJfcG9pbnRlciIgXAorICAgICJ0eXBlID0gKHVuc2lnbmVkIHxzaWduZWQgfCljaGFyIFxcKiIgXAorICAgICJ3aGF0aXMgc2lnbmVkIGNoYXIgcG9pbnRlciIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X3Vuc2lnbmVkX2NoYXJfcG9pbnRlciIgXAorICAgICJ0eXBlID0gdW5zaWduZWQgY2hhciBcXCoiIFwKKyAgICAid2hhdGlzIHVuc2lnbmVkIGNoYXIgcG9pbnRlciIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X3Nob3J0X3BvaW50ZXIiIFwKKyAgICAidHlwZSA9IChzaG9ydHxzaG9ydCBpbnQpIFxcKiIgXAorICAgICJ3aGF0aXMgc2hvcnQgcG9pbnRlciIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X3NpZ25lZF9zaG9ydF9wb2ludGVyIiBcCisgICAgInR5cGUgPSAoc2lnbmVkIHwpKHNob3J0fHNob3J0IGludCkgXFwqIiBcCisgICAgIndoYXRpcyBzaWduZWQgc2hvcnQgcG9pbnRlciIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X3Vuc2lnbmVkX3Nob3J0X3BvaW50ZXIiIFwKKyAgICAidHlwZSA9ICh1bnNpZ25lZCBzaG9ydHxzaG9ydCB1bnNpZ25lZCBpbnQpIFxcKiIgXAorICAgICJ3aGF0aXMgdW5zaWduZWQgc2hvcnQgcG9pbnRlciIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X2ludF9wb2ludGVyIiBcCisgICAgInR5cGUgPSBpbnQgXFwqIiBcCisgICAgIndoYXRpcyBpbnQgcG9pbnRlciIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X3NpZ25lZF9pbnRfcG9pbnRlciIgXAorICAgICJ0eXBlID0gKHNpZ25lZCB8KWludCBcXCoiIFwKKyAgICAid2hhdGlzIHNpZ25lZCBpbnQgcG9pbnRlciIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X3Vuc2lnbmVkX2ludF9wb2ludGVyIiBcCisgICAgInR5cGUgPSB1bnNpZ25lZCBpbnQgXFwqIiBcCisgICAgIndoYXRpcyB1bnNpZ25lZCBpbnQgcG9pbnRlciIKKworIyBXZSBhbHJlYWR5IHRlc3RlZCB3aGV0aGVyIGxvbmcgcHJpbnRzIGFzIGxvbmcsIHNvIGhlcmUgd2UgYWNjZXB0IGludAorZ2RiX3Rlc3QgIndoYXRpcyB2X2xvbmdfcG9pbnRlciIgXAorICAgICJ0eXBlID0gKGxvbmd8aW50fGxvbmcgaW50KSBcXCoiIFwKKyAgICAid2hhdGlzIGxvbmcgcG9pbnRlciIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X3NpZ25lZF9sb25nX3BvaW50ZXIiIFwKKyAgICAidHlwZSA9IChzaWduZWQgfCkobG9uZ3xpbnR8bG9uZyBpbnQpIFxcKiIgXAorICAgICJ3aGF0aXMgc2lnbmVkIGxvbmcgcG9pbnRlciIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X3Vuc2lnbmVkX2xvbmdfcG9pbnRlciIgXAorICAgICJ0eXBlID0gKHVuc2lnbmVkIChpbnR8bG9uZ3xsb25nIGludCl8bG9uZyB1bnNpZ25lZCBpbnQpIFxcKiIgXAorICAgICJ3aGF0aXMgdW5zaWduZWQgbG9uZyBwb2ludGVyIgorCitnZGJfdGVzdCAid2hhdGlzIHZfZmxvYXRfcG9pbnRlciIgXAorICAgICJ0eXBlID0gZmxvYXQgXFwqIiBcCisgICAgIndoYXRpcyBmbG9hdCBwb2ludGVyIgorCitnZGJfdGVzdCAid2hhdGlzIHZfZG91YmxlX3BvaW50ZXIiIFwKKyAgICAidHlwZSA9IGRvdWJsZSBcXCoiIFwKKyAgICAid2hhdGlzIGRvdWJsZSBwb2ludGVyIgorCisKKyMgdGVzdCB3aGF0aXMgY29tbWFuZCB3aXRoIHN0cnVjdHVyZSB0eXBlcworZ2RiX3Rlc3QgIndoYXRpcyB2X3N0cnVjdDEiIFwKKyAgICAidHlwZSA9IHN0cnVjdCB0X3N0cnVjdCIgXAorICAgICJ3aGF0aXMgbmFtZWQgc3RydWN0dXJlIgorCitnZGJfdGVzdCAid2hhdGlzIHZfc3RydWN0MiIgXAorICAgICJ0eXBlID0gc3RydWN0IFx7Li4uXH0iIFwKKyAgICAid2hhdGlzIHVubmFtZWQgc3RydWN0dXJlIgorCisKKyMgdGVzdCB3aGF0aXMgY29tbWFuZCB3aXRoIHVuaW9uIHR5cGVzCitnZGJfdGVzdCAid2hhdGlzIHZfdW5pb24iIFwKKyAgICAidHlwZSA9IHVuaW9uIHRfdW5pb24iIFwKKyAgICAid2hhdGlzIG5hbWVkIHVuaW9uIgorCitnZGJfdGVzdCAid2hhdGlzIHZfdW5pb24yIiBcCisgICAgInR5cGUgPSB1bmlvbiBcey4uLlx9IiBcCisgICAgIndoYXRpcyB1bm5hbWVkIHVuaW9uIgorCisKKworIyB0ZXN0IHdoYXRpcyBjb21tYW5kIHdpdGggZnVuY3Rpb25zIHJldHVybiB0eXBlCitnZGJfdGVzdCAid2hhdGlzIHZfY2hhcl9mdW5jIiBcCisgICAgInR5cGUgPSAoc2lnbmVkIHx1bnNpZ25lZCB8KWNoYXIgXFwoXFwpIiBcCisgICAgIndoYXRpcyBjaGFyIGZ1bmN0aW9uIgorCitnZGJfdGVzdCAid2hhdGlzIHZfc2lnbmVkX2NoYXJfZnVuYyIgXAorICAgICJ0eXBlID0gKHNpZ25lZCB8dW5zaWduZWQgfCljaGFyIFxcKFxcKSIgXAorICAgICJ3aGF0aXMgc2lnbmVkIGNoYXIgZnVuY3Rpb24iCisKK2dkYl90ZXN0ICJ3aGF0aXMgdl91bnNpZ25lZF9jaGFyX2Z1bmMiIFwKKyAgICAidHlwZSA9IHVuc2lnbmVkIGNoYXIgXFwoXFwpIglcCisgICAgIndoYXRpcyB1bnNpZ25lZCBjaGFyIGZ1bmN0aW9uIgorCitnZGJfdGVzdCAid2hhdGlzIHZfc2hvcnRfZnVuYyIgXAorICAgICJ0eXBlID0gc2hvcnQgKGludCB8KVxcKFxcKSIgXAorICAgICJ3aGF0aXMgc2hvcnQgZnVuY3Rpb24iCisKK2dkYl90ZXN0ICJ3aGF0aXMgdl9zaWduZWRfc2hvcnRfZnVuYyIgXAorICAgICJ0eXBlID0gKHNpZ25lZCB8KXNob3J0IChpbnQgfClcXChcXCkiIFwKKyAgICAid2hhdGlzIHNpZ25lZCBzaG9ydCBmdW5jdGlvbiIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X3Vuc2lnbmVkX3Nob3J0X2Z1bmMiIFwKKyAgICAidHlwZSA9ICh1bnNpZ25lZCBzaG9ydHxzaG9ydCB1bnNpZ25lZCBpbnQpIFxcKFxcKSIgXAorICAgICJ3aGF0aXMgdW5zaWduZWQgc2hvcnQgZnVuY3Rpb24iCisKK2dkYl90ZXN0ICJ3aGF0aXMgdl9pbnRfZnVuYyIgXAorICAgICJ0eXBlID0gaW50IFxcKFxcKSIgXAorICAgICJ3aGF0aXMgaW50IGZ1bmN0aW9uIgorCitnZGJfdGVzdCAid2hhdGlzIHZfc2lnbmVkX2ludF9mdW5jIiBcCisgICAgInR5cGUgPSAoc2lnbmVkIHwpaW50IFxcKFxcKSIgXAorICAgICJ3aGF0aXMgc2lnbmVkIGludCBmdW5jdGlvbiIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X3Vuc2lnbmVkX2ludF9mdW5jIiBcCisgICAgInR5cGUgPSB1bnNpZ25lZCBpbnQgXFwoXFwpIiBcCisgICAgIndoYXRpcyB1bnNpZ25lZCBpbnQgZnVuY3Rpb24iCisKK2dkYl90ZXN0ICJ3aGF0aXMgdl9sb25nX2Z1bmMiIFwKKyAgICAidHlwZSA9IChsb25nfGludHxsb25nIGludCkgXFwoXFwpIiBcCisgICAgIndoYXRpcyBsb25nIGZ1bmN0aW9uIgorCitnZGJfdGVzdCAid2hhdGlzIHZfc2lnbmVkX2xvbmdfZnVuYyIgXAorICAgICJ0eXBlID0gKHNpZ25lZCB8KShpbnR8bG9uZ3xsb25nIGludCkgXFwoXFwpIiBcCisgICAgIndoYXRpcyBzaWduZWQgbG9uZyBmdW5jdGlvbiIKKworZ2RiX3Rlc3QgIndoYXRpcyB2X3Vuc2lnbmVkX2xvbmdfZnVuYyIgXAorICAgICJ0eXBlID0gKHVuc2lnbmVkIChpbnR8bG9uZ3xsb25nIGludCl8bG9uZyB1bnNpZ25lZCBpbnQpIFxcKFxcKSIgXAorICAgICJ3aGF0aXMgdW5zaWduZWQgbG9uZyBmdW5jdGlvbiIKKworIyBTdW4gL2Jpbi9jYyBjYWxscyB0aGlzIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGRvdWJsZS4KK2lmIHshJGdjY19jb21waWxlZH0gdGhlbiB7c2V0dXBfeGZhaWwgIiotc3VuLXN1bm9zNCoifQorZ2RiX3Rlc3QgIndoYXRpcyB2X2Zsb2F0X2Z1bmMiIFwKKyAgICAidHlwZSA9IGZsb2F0IFxcKFxcKSIgXAorICAgICJ3aGF0aXMgZmxvYXQgZnVuY3Rpb24iCisKK2dkYl90ZXN0ICJ3aGF0aXMgdl9kb3VibGVfZnVuYyIgXAorICAgICJ0eXBlID0gZG91YmxlIFxcKFxcKSIgXAorICAgICJ3aGF0aXMgZG91YmxlIGZ1bmN0aW9uIiBcCisKKworIyB0ZXN0IHdoYXRpcyBjb21tYW5kIHdpdGggc29tZSBtaXNjIGNvbXBsaWNhdGVkIHR5cGVzCitnZGJfdGVzdCAid2hhdGlzIHNfbGluayIgXAorICAgICJ0eXBlID0gc3RydWN0IGxpbmsgXFwqIiBcCisgICAgIndoYXRpcyBjb21wbGljYXRlZCBzdHJ1Y3R1cmUiCisKK2dkYl90ZXN0ICJ3aGF0aXMgdV9saW5rIiBcCisgICAgInR5cGUgPSB1bmlvbiB0dV9saW5rIiBcCisgICAgIndoYXRpcyBjb21wbGljYXRlZCB1bmlvbiIKKworCisjIHRlc3Qgd2hhdGlzIGNvbW1hbmQgd2l0aCBlbnVtZXJhdGlvbnMKK2dkYl90ZXN0ICJ3aGF0aXMgY2x1bmtlciIgXAorICAgICJ0eXBlID0gZW51bSBjYXJzIiBcCisgICAgIndoYXRpcyBlbnVtZXJhdGlvbiIKKworCisjIHRlc3Qgd2hhdGlzIGNvbW1hbmQgd2l0aCBuZXN0ZWQgc3RydWN0IGFuZCB1bmlvbgorZ2RiX3Rlc3QgIndoYXRpcyBuZXN0ZWRfc3UiIFwKKyAgICAidHlwZSA9IHN0cnVjdCBvdXRlcl9zdHJ1Y3QiIFwKKyAgICAid2hhdGlzIG91dGVyIHN0cnVjdHVyZSIKKworZ2RiX3Rlc3QgIndoYXRpcyBuZXN0ZWRfc3Uub3V0ZXJfaW50IiBcCisgICAgInR5cGUgPSBpbnQiIFwKKyAgICAid2hhdGlzIG91dGVyIHN0cnVjdHVyZSBtZW1iZXIiCisKK2dkYl90ZXN0ICJ3aGF0aXMgbmVzdGVkX3N1LmlubmVyX3N0cnVjdF9pbnN0YW5jZSIgXAorICAgICJ0eXBlID0gc3RydWN0IGlubmVyX3N0cnVjdCIgXAorICAgICJ3aGF0aXMgaW5uZXIgc3RydWN0dXJlIgorCitnZGJfdGVzdCAid2hhdGlzIG5lc3RlZF9zdS5pbm5lcl9zdHJ1Y3RfaW5zdGFuY2UuaW5uZXJfaW50IiBcCisgICAgInR5cGUgPSBpbnQiIFwKKyAgICAid2hhdGlzIGlubmVyIHN0cnVjdHVyZSBtZW1iZXIiCisKK2dkYl90ZXN0ICJ3aGF0aXMgbmVzdGVkX3N1LmlubmVyX3VuaW9uX2luc3RhbmNlIiBcCisgICAgInR5cGUgPSB1bmlvbiBpbm5lcl91bmlvbiIgXAorICAgICJ3aGF0aXMgaW5uZXIgdW5pb24iCisKK2dkYl90ZXN0ICJ3aGF0aXMgbmVzdGVkX3N1LmlubmVyX3VuaW9uX2luc3RhbmNlLmlubmVyX3VuaW9uX2ludCIgXAorICAgICJ0eXBlID0gaW50IiBcCisgICAgIndoYXRpcyBpbm5lciB1bmlvbiBtZW1iZXIiCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jKysvTWFrZWZpbGUuaW4gYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhMTIzNAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDIwIEBACitWUEFUSCA9IEBzcmNkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorCitQUk9HUyA9IGFub24tdW5pb24gY29tcGlsZXIgY3BsdXNmdW5jcyBkZXJpdmF0aW9uIGluaGVyaXQgbG9jYWwgXAorCW1lbWJlci1wdHIgbWV0aG9kIG1pc2MgXAorICAgICAgICBvdmVybG9hZCBvdmxkYnJlYWsgcmVmLXR5cGVzIHJlZi10eXBlczIgdGVtcGxhdGVzIHVzZXJkZWYgdmlydGZ1bmMKKworYWxsOiAKKwlAZWNobyAiTm90aGluZyB0byBiZSBkb25lIGZvciBhbGwuLi4iCisKKyMjIyMgaG9zdCwgdGFyZ2V0LCBhbmQgc2l0ZSBzcGVjaWZpYyBNYWtlZmlsZSBmcmFncyBjb21lIGluIGhlcmUuCisKK2NsZWFuIG1vc3RseWNsZWFuOgorCS1ybSAtZiAqLmNpICoubyAke09CSlN9ICR7UFJPR1N9ICp+IGNvcmUgCisKK2Rpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogY2xlYW4KKwktcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cyBjb25maWcubG9nCisKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChzcmNkaXIpL2NvbmZpZ3VyZS5pbgorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9hbm9uLXVuaW9uLmNjIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL2Fub24tdW5pb24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU4YTMwNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9hbm9uLXVuaW9uLmNjCkBAIC0wLDAgKzEsNTQgQEAKKworc3RydWN0IEZvbyB7CisgIHVuaW9uIHsKKyAgICBpbnQgemVybzsKKyAgICB1bnNpZ25lZCBpbnQgb25lOworICB9IG51bTE7CisKKyAgdW5pb24geworICAgIGludCBwZWJibGU7CisgICAgc3RydWN0IHsKKyAgICAgIGludCByb2NrOworICAgICAgdW5zaWduZWQgaW50IHJvY2syOworICAgIH0geDsKKyAgICB1bmlvbiB7CisgICAgICBpbnQgcXV4OworICAgICAgdW5zaWduZWQgaW50IG11eDsKKyAgICB9OworICAgIHVuc2lnbmVkIGludCBib3VsZGVyOworICB9OworICB1bmlvbiB7CisgICAgaW50IHBhcGVyOworICAgIHVuc2lnbmVkIGludCBjbG90aDsKKyAgfTsKKyAgdW5pb24geworICAgIGludCB0d287CisgICAgdW5zaWduZWQgaW50IHRocmVlOworICB9IG51bTI7Cit9OworCit1bmlvbiBCYXIgeworICBpbnQgeDsKKyAgdW5zaWduZWQgaW50IHk7Cit9OworCitGb28gZm9vOworQmFyIGJhcjsKKworaW50IG1haW4oKQoreworICBmb28ucGFwZXIgPSAzMzsKKyAgZm9vLnBlYmJsZSA9IDQ0OworICBmb28ubXV4ID0gNTU7CisKKyAgYmFyLnggPSAzMzsKKworICB1bmlvbgorICB7CisgICAgaW50IHo7CisgICAgdW5zaWduZWQgaW50IHc7CisgIH07CisKKyAgdyA9IDQ1OworCit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jKysvYW5vbi11bmlvbi5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvYW5vbi11bmlvbi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMxNzFhMgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9hbm9uLXVuaW9uLmV4cApAQCAtMCwwICsxLDMzNyBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMKKyMgVGVzdHMgZm9yIGFub255bW91cyB1bmlvbiBzdXBwb3J0CisjIFdyaXR0ZW4gYnkgU2F0aXNoIFBhaSA8cGFpQGFwb2xsby5ocC5jb20+IDE5OTctMDgtMTkKKworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZ2RiIHRlc3RzdWl0ZQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCisgICAgICAgIH0KKworIworIyB0ZXN0IHJ1bm5pbmcgcHJvZ3JhbXMKKyMKKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAiYW5vbi11bmlvbiIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmNjCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIGMrK31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworCitpZiAhW3J1bnRvX21haW5dIHRoZW4geworICAgIHBlcnJvciAiY291bGRuJ3QgcnVuIHRvIGJyZWFrcG9pbnQiCisgICAgY29udGludWUKK30KKworc2VuZF9nZGIgInNldCB3aWR0aCAwXG4iCitnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKKworI3NlbmRfZ2RiICJwdHlwZSBmb29cbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAtcmUgIlxyXG4kZ2RiX3Byb21wdCAkIiB7CisjICAgICAgcGFzcyAicHR5cGUgZm9vIgorIyAgICB9CisjICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInB0eXBlIGZvbyIgfQorIyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIGZvbyIgfQorI30KKworI3NlbmRfZ2RiICJwdHlwZSBiYXJcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAtcmUgIlxyXG4kZ2RiX3Byb21wdCAkIiB7CisjICAgICAgcGFzcyAicHR5cGUgZm9vIgorIyAgICB9CisjICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInB0eXBlIGZvbyIgfQorIyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIGZvbyIgfQorI30KKworIyBOT1RFOiBBZGQgLS0gcHR5cGUgZm9vLngsIGV0Yy4gd2hlbiB0aGluZ3MgYXJlIHdvcmtpbmcKKworIyBQcmludCBvdXQgdGhlIGJpZyBhbm9uIHVuaW9uLgorc2VuZF9nZGIgInByaW50IGZvb1xuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxcJFxbMC05XF0qID0gXHtudW0xID0gXHt6ZXJvID0gMCwgb25lID0gMFx9LCBce3BlYmJsZSA9IDAsIHggPSBce3JvY2sgPSAwLCByb2NrMiA9IDBcfSwgXHtxdXggPSAwLCBtdXggPSAwXH0sIGJvdWxkZXIgPSAwXH0sIFx7cGFwZXIgPSAwLCBjbG90aCA9IDBcfSwgbnVtMiA9IFx7dHdvID0gMCwgdGhyZWUgPSAwXH1cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJwcmludCBmb28gMSIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZm9vIDEiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGZvbyAxIiB9Cit9CisKKyMgU3RlcCBvdmVyIGFzc2lnbm1lbnQgdG8gbWVtYmVyCisKK3NlbmRfZ2RiICJuZXh0XG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiNDFcWyBcdFxdKmZvby5wZWJibGUgPSA0NDtcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAibmV4dCAxIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJuZXh0IDEiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIG5leHQgMSIgfQorfQorCisjIE5vdyBwcmludCBvdXQgYW5vbiB1bmlvbiBhZ2Fpbgorc2VuZF9nZGIgInByaW50IGZvb1xuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxcJFxbMC05XF0qID0gXHtudW0xID0gXHt6ZXJvID0gMCwgb25lID0gMFx9LCBce3BlYmJsZSA9IDAsIHggPSBce3JvY2sgPSAwLCByb2NrMiA9IDBcfSwgXHtxdXggPSAwLCBtdXggPSAwXH0sIGJvdWxkZXIgPSAwXH0sIFx7cGFwZXIgPSAzMywgY2xvdGggPSAzM1x9LCBudW0yID0gXHt0d28gPSAwLCB0aHJlZSA9IDBcfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInByaW50IGZvbyAyIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBmb28gMiIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgZm9vIDIiIH0KK30KKworIyBNb2RpZnkgdGhlIG1lbWJlciBqdXN0IHNldAorc2VuZF9nZGIgInNldCB2YXIgZm9vLmNsb3RoID0gMzVcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAic2V0IHZhciBmb28uY2xvdGgiCisgICAgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgc2V0IHZhciBmb28uY2xvdGgiIH0KK30KKworIyBOb3cgcHJpbnQgb3V0IGFub24gdW5pb24gYWdhaW4gdG8gc2VlIGlmIHRoZSByaWdodCBtZW1iZXIgd2FzIHNldCAKK3NlbmRfZ2RiICJwcmludCBmb29cbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcXCRcWzAtOVxdKiA9IFx7bnVtMSA9IFx7emVybyA9IDAsIG9uZSA9IDBcfSwgXHtwZWJibGUgPSAwLCB4ID0gXHtyb2NrID0gMCwgcm9jazIgPSAwXH0sIFx7cXV4ID0gMCwgbXV4ID0gMFx9LCBib3VsZGVyID0gMFx9LCBce3BhcGVyID0gMzUsIGNsb3RoID0gMzVcfSwgbnVtMiA9IFx7dHdvID0gMCwgdGhyZWUgPSAwXH1cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJwcmludCBmb28gMyIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZm9vIDMiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGZvbyAzIiB9Cit9CisKKworIyBTdGVwIG92ZXIgbmV4dCBhc3NpZ25tZW50IHRvIG1lbWJlcgorCitzZW5kX2dkYiAibmV4dFxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIjQyXFsgXHRcXSpmb28ubXV4ID0gNTU7XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgIm5leHQgMiIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibmV4dCAyIiB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBuZXh0IDIiIH0KK30KKworIyBOb3cgcHJpbnQgb3V0IGFub24gdW5pb24gYWdhaW4gCitzZW5kX2dkYiAicHJpbnQgZm9vXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiXFwkXFswLTlcXSogPSBce251bTEgPSBce3plcm8gPSAwLCBvbmUgPSAwXH0sIFx7cGViYmxlID0gNDQsIHggPSBce3JvY2sgPSA0NCwgcm9jazIgPSAwXH0sIFx7cXV4ID0gNDQsIG11eCA9IDQ0XH0sIGJvdWxkZXIgPSA0NFx9LCBce3BhcGVyID0gMzUsIGNsb3RoID0gMzVcfSwgbnVtMiA9IFx7dHdvID0gMCwgdGhyZWUgPSAwXH1cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJwcmludCBmb28gNCIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZm9vIDQiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGZvbyA0IiB9Cit9CisKKyMgTW9kaWZ5IHRoZSBtZW1iZXIganVzdCBzZXQKK3NlbmRfZ2RiICJzZXQgdmFyIGZvby5wZWJibGUgPSA0NVxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJzZXQgdmFyIGZvby5wZWJibGUiCisgICAgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgc2V0IHZhciBmb28ucGViYmxlIiB9Cit9CisKKyMgTm93IHByaW50IG91dCBhbm9uIHVuaW9uIGFnYWluIHRvIHNlZSBpZiB0aGUgcmlnaHQgbWVtYmVyIHdhcyBzZXQgCitzZW5kX2dkYiAicHJpbnQgZm9vXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiXFwkXFswLTlcXSogPSBce251bTEgPSBce3plcm8gPSAwLCBvbmUgPSAwXH0sIFx7cGViYmxlID0gNDUsIHggPSBce3JvY2sgPSA0NSwgcm9jazIgPSAwXH0sIFx7cXV4ID0gNDUsIG11eCA9IDQ1XH0sIGJvdWxkZXIgPSA0NVx9LCBce3BhcGVyID0gMzUsIGNsb3RoID0gMzVcfSwgbnVtMiA9IFx7dHdvID0gMCwgdGhyZWUgPSAwXH1cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJwcmludCBmb28gNSIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZm9vIDUiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGZvbyA1IiB9Cit9CisKKyMgTW9kaWZ5IGFub3RoZXIgbWVtYmVyIGF0IGEgZGlmZmVyZW50IGxldmVsCitzZW5kX2dkYiAic2V0IHZhciBmb28ucXV4ID0gNDZcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAic2V0IHZhciBmb28ucXV4IgorICAgIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHNldCB2YXIgZm9vLnF1eCIgfQorfQorCisjIE5vdyBwcmludCBvdXQgYW5vbiB1bmlvbiBhZ2FpbiB0byBzZWUgaWYgdGhlIHJpZ2h0IG1lbWJlciB3YXMgc2V0IAorc2VuZF9nZGIgInByaW50IGZvb1xuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxcJFxbMC05XF0qID0gXHtudW0xID0gXHt6ZXJvID0gMCwgb25lID0gMFx9LCBce3BlYmJsZSA9IDQ2LCB4ID0gXHtyb2NrID0gNDYsIHJvY2syID0gMFx9LCBce3F1eCA9IDQ2LCBtdXggPSA0Nlx9LCBib3VsZGVyID0gNDZcfSwgXHtwYXBlciA9IDM1LCBjbG90aCA9IDM1XH0sIG51bTIgPSBce3R3byA9IDAsIHRocmVlID0gMFx9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAicHJpbnQgZm9vIDYiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGZvbyA2IiB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBmb28gNiIgfQorfQorCisjIE1vZGlmeSB0aGUgbWVtYmVyIGF0IGFub3RoZXIgbGV2ZWwsIGJ1dCBub3QgdGhlIGZpcnN0IG9uZSBpbiB0aGUgdW5pb24KK3NlbmRfZ2RiICJzZXQgdmFyIGZvby5tdXggPSA0N1xuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJzZXQgdmFyIGZvby5tdXgiCisgICAgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgc2V0IHZhciBmb28ubXV4IiB9Cit9CisKKyMgTm93IHByaW50IG91dCBhbm9uIHVuaW9uIGFnYWluIHRvIHNlZSBpZiB0aGluZ3Mgd29ya2VkCitzZW5kX2dkYiAicHJpbnQgZm9vXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiXFwkXFswLTlcXSogPSBce251bTEgPSBce3plcm8gPSAwLCBvbmUgPSAwXH0sIFx7cGViYmxlID0gNDcsIHggPSBce3JvY2sgPSA0Nywgcm9jazIgPSAwXH0sIFx7cXV4ID0gNDcsIG11eCA9IDQ3XH0sIGJvdWxkZXIgPSA0N1x9LCBce3BhcGVyID0gMzUsIGNsb3RoID0gMzVcfSwgbnVtMiA9IFx7dHdvID0gMCwgdGhyZWUgPSAwXH1cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJwcmludCBmb28gNyIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZm9vIDciIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGZvbyA3IiB9Cit9CisKKyMgTW9kaWZ5IGEgbWVtYmVyIG9mIGEgc3RydWN0IGluIGFuIGFub24gdW5pb24KK3NlbmRfZ2RiICJzZXQgdmFyIGZvby54LnJvY2sgPSA0OFxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJzZXQgdmFyIGZvby54LnJvY2siCisgICAgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgc2V0IHZhciBmb28ueC5yb2NrIiB9Cit9CisKKyMgTm93IHByaW50IG91dCBhbm9uIHVuaW9uIGFnYWluIHRvIHNlZSBpZiB0aGluZ3Mgd29ya2VkCitzZW5kX2dkYiAicHJpbnQgZm9vXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiXFwkXFswLTlcXSogPSBce251bTEgPSBce3plcm8gPSAwLCBvbmUgPSAwXH0sIFx7cGViYmxlID0gNDgsIHggPSBce3JvY2sgPSA0OCwgcm9jazIgPSAwXH0sIFx7cXV4ID0gNDgsIG11eCA9IDQ4XH0sIGJvdWxkZXIgPSA0OFx9LCBce3BhcGVyID0gMzUsIGNsb3RoID0gMzVcfSwgbnVtMiA9IFx7dHdvID0gMCwgdGhyZWUgPSAwXH1cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJwcmludCBmb28gOCIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZm9vIDgiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGZvbyA4IiB9Cit9CisKKyMgTW9kaWZ5IGEgbWVtYmVyIG9mIGEgc3RydWN0IGluIGFuIGFub24gdW5pb24sIGJ1dCBzb21ldGhpbmcKKyMgdGhhdCBkb2Vzbid0IGFsaWFzIHRvIHNvbWUgb3RoZXIgdW5pb24gbWVtYmVyCitzZW5kX2dkYiAic2V0IHZhciBmb28ueC5yb2NrMiA9IDQ5XG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInNldCB2YXIgZm9vLngucm9jazIiCisgICAgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgc2V0IHZhciBmb28ueC5yb2NrMiIgfQorfQorCisjIE5vdyBwcmludCBvdXQgYW5vbiB1bmlvbiBhZ2FpbiB0byBzZWUgaWYgdGhpbmdzIHdvcmtlZAorc2VuZF9nZGIgInByaW50IGZvb1xuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxcJFxbMC05XF0qID0gXHtudW0xID0gXHt6ZXJvID0gMCwgb25lID0gMFx9LCBce3BlYmJsZSA9IDQ4LCB4ID0gXHtyb2NrID0gNDgsIHJvY2syID0gNDlcfSwgXHtxdXggPSA0OCwgbXV4ID0gNDhcfSwgYm91bGRlciA9IDQ4XH0sIFx7cGFwZXIgPSAzNSwgY2xvdGggPSAzNVx9LCBudW0yID0gXHt0d28gPSAwLCB0aHJlZSA9IDBcfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInByaW50IGZvbyA5IgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBmb28gOSIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgZm9vIDkiIH0KK30KKworCisjIFN0ZXAgb3ZlciBuZXh0IHR3byBhc3NpZ25tZW50cworc2VuZF9nZGIgIm5leHQgMlxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIjUyXFsgXHRcXSp3ID0gNDU7XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgIm5leHQgMyIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibmV4dCAzIiB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBuZXh0IDMiIH0KK30KKworIyBUZXN0cyBmb3IgYW5vbiB1bmlvbnMgdGhhdCBhcmUgbm90IG1lbWJlcnMgb2YgYSBjbGFzcyBvciBzdHJ1Y3QKKworIyB3IGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQ7IGl0IGNvbnRhaW5zIGdhcmJhZ2UKKyNzZW5kX2dkYiAicHJpbnQgd1xuIgorI2dkYl9leHBlY3QgeworIyAgIC1yZSAiXFwkXFswLTlcXSogPSAwXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyMgICAgICBwYXNzICJwcmludCB3IDEiCisjICAgIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdyAxIiB9CisjICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdyAxIiB9CisjfQorIworIyB6IGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQ7IGl0IGNvbnRhaW5zIGdhcmJhZ2UKKyNzZW5kX2dkYiAicHJpbnQgelxuIgorI2dkYl9leHBlY3QgeworIyAgIC1yZSAiXFwkXFswLTlcXSogPSAwXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyMgICAgICBwYXNzICJwcmludCB6IDEiCisjICAgIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgeiAxIiB9CisjICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgeiAxIiB9CisjfQorCisjIFN0ZXAgb3ZlciBuZXh0IGFzc2lnbm1lbnQgdG8gdworc2VuZF9nZGIgIm5leHRcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICI1NFxbIFx0XF0qXH1cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAibmV4dCA0IgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJuZXh0IDQiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIG5leHQgNCIgfQorfQorCisjIFNlZSBpZiB0aGUgY2hhbmdlIGluIHZhbHVlIGlzIG5vdGljZWQKK3NlbmRfZ2RiICJwcmludCB3XG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiXFwkXFswLTlcXSogPSA0NVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJwcmludCB3IDIiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHcgMiIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdyAyIiB9Cit9CisKKyMgU2VlIGlmIHogc2hvd3MgdGhlIHNhbWUgdmFsdWUKK3NlbmRfZ2RiICJwcmludCB6XG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiXFwkXFswLTlcXSogPSA0NVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJwcmludCB6IDIiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHogMiIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgeiAyIiB9Cit9CisKKyMgU2V0IHRoZSBhbm9uIHVuaW9uIG1lbWJlciAKK3NlbmRfZ2RiICJzZXQgdmFyIHogPSAyN1xuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJzZXQgdmFyIHoiCisgICAgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgc2V0IHZhciB6IiB9Cit9CisKKyMgU2VlIGlmIHRoZSBjaGFuZ2UgaW4gdmFsdWUgaXMgbm90aWNlZAorc2VuZF9nZGIgInByaW50IHdcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcXCRcWzAtOVxdKiA9IDI3XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInByaW50IHcgMyIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdyAzIiB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB3IDMiIH0KK30KKworIyBTZWUgaWYgeiBzaG93cyB0aGUgc2FtZSB2YWx1ZQorc2VuZF9nZGIgInByaW50IHpcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcXCRcWzAtOVxdKiA9IDI3XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInByaW50IHogMyIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgeiAzIiB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB6IDMiIH0KK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9jbGFzc2VzLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9jbGFzc2VzLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTk3Y2I0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL2NsYXNzZXMuZXhwCkBAIC0wLDAgKzEsODUwIEBACisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAoZm5mQGN5Z251cy5jb20pCisKK3NldCB3cyAiXFtcclxuXHQgXF0rIgorc2V0IG5sICJcW1xyXG5cXSsiCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW4gZXhlY3V0YWJsZSB0byB0ZXN0LiAgSWYgbm90LCB0aGVuIGVpdGhlciB3ZQorIyBoYXZlbid0IHRyaWVkIHRvIGNvbXBpbGUgb25lLCBvciB0aGUgY29tcGlsYXRpb24gZmFpbGVkIGZvciBzb21lIHJlYXNvbi4KKyMgSW4gZWl0aGVyIGNhc2UsIGp1c3Qgbm90aWZ5IHRoZSB1c2VyIGFuZCBza2lwIHRoZSB0ZXN0cyBpbiB0aGlzIGZpbGUuCisKK3NldCB0ZXN0ZmlsZSAibWlzYyIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmNjCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKKyMgQ3JlYXRlIGFuZCBzb3VyY2UgdGhlIGZpbGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIKKyMgdXNlZCB0byBjb21waWxlIHRoZSB0ZXN0IGNhc2UuCisKK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9ICJjKysiXSB7CisgICAgcmV0dXJuIC0xCit9CisKKyMgaWYgd2UgYXJlIG9uIEhQVVggYW5kIHdlIGFyZSBub3QgY29tcGlsZWQgd2l0aCBnY2MsIHRoZW4gc2tpcCB0aGVzZSB0ZXN0cy4KKworaWYgW2lzdGFyZ2V0IGhwcGEqLSotaHB1eCpdIHsKKyAgICBpZiB7ISRnY2NfY29tcGlsZWR9IHsKKwljb250aW51ZSAKKyAgICB9Cit9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYysrfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisjCisjIFRlc3QgcHR5cGUgb2YgY2xhc3Mgb2JqZWN0cy4KKyMKKworcHJvYyB0ZXN0X3B0eXBlX2NsYXNzX29iamVjdHMge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIHdzCisgICAgZ2xvYmFsIG5sCisKKyAgICAjIE5vdGUgdGhhdCBzdHJ1Y3QgbWVtYmVycyBhcmUgcHVibGljIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0IHByaW50CisgICAgIyAicHVibGljOiIgZm9yIHRoZSBwdWJsaWMgbWVtYmVycyBvZiBzdHJ1Y3RzLgorICAgICMgQWNjZXB0IGl0IGFzIGFuIGV4cGVjdGVkIGZhaWx1cmUgaWYgZ2RiIGp1c3QgZmFpbHMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgorICAgICMgY2xhc3MgYW5kIHN0cnVjdCwgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBpcyBPSy4KKworICAgIHNlbmRfZ2RiICJwdHlwZSBzdHJ1Y3QgZGVmYXVsdF9wdWJsaWNfc3RydWN0XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gc3RydWN0IGRlZmF1bHRfcHVibGljX3N0cnVjdCBceyR7d3N9aW50IGE7JHt3c31pbnQgYjskbmxcfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgc3RydWN0IGRlZmF1bHRfcHVibGljX3N0cnVjdCIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgZGVmYXVsdF9wdWJsaWNfc3RydWN0IFx7JG5sLippbnQgYTske3dzfWludCBiOyRubC4qXH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHR5cGUgc3RydWN0IGRlZmF1bHRfcHVibGljX3N0cnVjdCIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHR5cGUgc3RydWN0IGRlZmF1bHRfcHVibGljX3N0cnVjdCIgfQorCXRpbWVvdXQgeyBmYWlsICJwdHlwZSBzdHJ1Y3QgZGVmYXVsdF9wdWJsaWNfc3RydWN0ICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgICMgTm90ZSB0aGF0IHN0cnVjdCBtZW1iZXJzIGFyZSBwdWJsaWMgYnkgZGVmYXVsdCwgc28gd2UgZG9uJ3QgcHJpbnQKKyAgICAjICJwdWJsaWM6IiBmb3IgdGhlIHB1YmxpYyBtZW1iZXJzIG9mIHN0cnVjdHMuCisgICAgIyBBY2NlcHQgaXQgYXMgYW4gZXhwZWN0ZWQgZmFpbHVyZSBpZiBnZGIganVzdCBmYWlscyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCisgICAgIyBjbGFzcyBhbmQgc3RydWN0LCBhbmQgZXZlcnl0aGluZyBlbHNlIGlzIE9LLgorCisgICAgc2VuZF9nZGIgInB0eXBlIHN0cnVjdCBleHBsaWNpdF9wdWJsaWNfc3RydWN0XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gc3RydWN0IGV4cGxpY2l0X3B1YmxpY19zdHJ1Y3QgXHske3dzfWludCBhOyR7d3N9aW50IGI7JG5sLipcfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgc3RydWN0IGV4cGxpY2l0X3B1YmxpY19zdHJ1Y3QiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIGV4cGxpY2l0X3B1YmxpY19zdHJ1Y3QgXHskbmwuKmludCBhOyR7d3N9aW50IGI7JG5sLipcfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwdHlwZSBzdHJ1Y3QgZXhwbGljaXRfcHVibGljX3N0cnVjdCIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHR5cGUgc3RydWN0IGV4cGxpY2l0X3B1YmxpY19zdHJ1Y3QiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHR5cGUgc3RydWN0IGV4cGxpY2l0X3B1YmxpY19zdHJ1Y3QgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgIyBBY2NlcHQgaXQgYXMgYW4gZXhwZWN0ZWQgZmFpbHVyZSBpZiBnZGIganVzdCBmYWlscyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCisgICAgIyBjbGFzcyBhbmQgc3RydWN0LCBhbmQgZXZlcnl0aGluZyBlbHNlIGlzIE9LLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIHNlbmRfZ2RiICJwdHlwZSBzdHJ1Y3QgcHJvdGVjdGVkX3N0cnVjdFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IHN0cnVjdCBwcm90ZWN0ZWRfc3RydWN0IFx7JHt3c31wcm90ZWN0ZWQ6JHt3c31pbnQgYTske3dzfWludCBiOyRubFx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBzdHJ1Y3QgcHJvdGVjdGVkX3N0cnVjdCAoRklYTUUpIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBwcm90ZWN0ZWRfc3RydWN0IFx7JHt3c31wcm90ZWN0ZWQ6JHt3c31pbnQgYTske3dzfWludCBiOyRubC4qXH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHR5cGUgc3RydWN0IHByb3RlY3RlZF9zdHJ1Y3QgKEZJWE1FKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHR5cGUgc3RydWN0IHByb3RlY3RlZF9zdHJ1Y3QiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHR5cGUgc3RydWN0IHByb3RlY3RlZF9zdHJ1Y3QgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgIyBBY2NlcHQgaXQgYXMgYW4gZXhwZWN0ZWQgZmFpbHVyZSBpZiBnZGIganVzdCBmYWlscyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCisgICAgIyBjbGFzcyBhbmQgc3RydWN0LCBhbmQgZXZlcnl0aGluZyBlbHNlIGlzIE9LLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIHNlbmRfZ2RiICJwdHlwZSBzdHJ1Y3QgcHJpdmF0ZV9zdHJ1Y3RcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBzdHJ1Y3QgcHJpdmF0ZV9zdHJ1Y3QgXHske3dzfXByaXZhdGU6JHt3c31pbnQgYTske3dzfWludCBiOyRubFx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBzdHJ1Y3QgcHJpdmF0ZV9zdHJ1Y3QgKEZJWE1FKSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgcHJpdmF0ZV9zdHJ1Y3QgXHske3dzfXByaXZhdGU6JHt3c31pbnQgYTske3dzfWludCBiOyRubC4qXH0kbmwkZ2RiX3Byb21wdCAkIiB7IAorCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJICAgIGZhaWwgInB0eXBlIHN0cnVjdCBwcml2YXRlX3N0cnVjdCAoRklYTUUpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBzdHJ1Y3QgcHJpdmF0ZV9zdHJ1Y3QiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHR5cGUgc3RydWN0IHByaXZhdGVfc3RydWN0ICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgICMgQWNjZXB0IGl0IGFzIGFuIGV4cGVjdGVkIGZhaWx1cmUgaWYgZ2RiIGp1c3QgZmFpbHMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgorICAgICMgY2xhc3MgYW5kIHN0cnVjdCwgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBpcyBPSy4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBzZW5kX2dkYiAicHR5cGUgc3RydWN0IG1peGVkX3Byb3RlY3Rpb25fc3RydWN0XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gc3RydWN0IG1peGVkX3Byb3RlY3Rpb25fc3RydWN0IFx7JHt3c31pbnQgYTske3dzfWludCBiOyR7d3N9cHJpdmF0ZToke3dzfWludCBjOyR7d3N9aW50IGQ7JHt3c31wcm90ZWN0ZWQ6JHt3c31pbnQgZTske3dzfWludCBmOyR7d3N9cHVibGljOiR7d3N9aW50IGc7JHt3c31wcml2YXRlOiR7d3N9aW50IGg7JHt3c31wcm90ZWN0ZWQ6JHt3c31pbnQgaTskbmxcfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgc3RydWN0IG1peGVkX3Byb3RlY3Rpb25fc3RydWN0IChGSVhNRSkiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIG1peGVkX3Byb3RlY3Rpb25fc3RydWN0IFx7JHt3c31wdWJsaWM6JHt3c31pbnQgYTske3dzfWludCBiOyR7d3N9cHJpdmF0ZToke3dzfWludCBjOyR7d3N9aW50IGQ7JHt3c31wcm90ZWN0ZWQ6JHt3c31pbnQgZTske3dzfWludCBmOyR7d3N9cHVibGljOiR7d3N9aW50IGc7JHt3c31wcml2YXRlOiR7d3N9aW50IGg7JHt3c31wcm90ZWN0ZWQ6JHt3c31pbnQgaTskbmwuKlx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJICAgIGZhaWwgInB0eXBlIHN0cnVjdCBtaXhlZF9wcm90ZWN0aW9uX3N0cnVjdCAoRklYTUUpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBzdHJ1Y3QgbWl4ZWRfcHJvdGVjdGlvbl9zdHJ1Y3QiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHR5cGUgc3RydWN0IG1peGVkX3Byb3RlY3Rpb25fc3RydWN0ICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgICMgQWNjZXB0IGl0IGFzIGFuIGV4cGVjdGVkIGZhaWx1cmUgaWYgZ2RiIGp1c3QgZmFpbHMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgorICAgICMgY2xhc3MgYW5kIHN0cnVjdCwgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBpcyBPSy4KKworICAgIHNlbmRfZ2RiICJwdHlwZSBjbGFzcyBwdWJsaWNfY2xhc3NcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBwdWJsaWNfY2xhc3MgXHske3dzfXB1YmxpYzoke3dzfWludCBhOyR7d3N9aW50IGI7JG5sLipcfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgY2xhc3MgcHVibGljX2NsYXNzIChGSVhNRSkiCisJfQorCS1yZSAidHlwZSA9IHN0cnVjdCBwdWJsaWNfY2xhc3MgXHske3dzfWludCBhOyR7d3N9aW50IGI7JG5sXH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgcHVibGljX2NsYXNzIChGSVhNRSkiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInB0eXBlIGNsYXNzIHB1YmxpY19jbGFzcyIgfQorCXRpbWVvdXQgeyBmYWlsICJwdHlwZSBjbGFzcyBwdWJsaWNfY2xhc3MgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIGNsYXNzIHByb3RlY3RlZF9jbGFzc1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIHByb3RlY3RlZF9jbGFzcyBceyR7d3N9cHJvdGVjdGVkOiR7d3N9aW50IGE7JHt3c31pbnQgYjskbmwuKlx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyBwcm90ZWN0ZWRfY2xhc3MiCisJfQorCS1yZSAidHlwZSA9IHN0cnVjdCBwcm90ZWN0ZWRfY2xhc3MgXHske3dzfWludCBhOyR7d3N9aW50IGI7JG5sXH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgcHJvdGVjdGVkX2NsYXNzIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBjbGFzcyBwcm90ZWN0ZWRfY2xhc3MiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHR5cGUgY2xhc3MgcHJvdGVjdGVkX2NsYXNzICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgICMgQWNjZXB0IGl0IGFzIGFuIGV4cGVjdGVkIGZhaWx1cmUgaWYgZ2RiIGp1c3QgZW1pdHMgYSBzdXBlcmZsb3VzICJwcml2YXRlOiIKKyAgICAjIGF0dHJpYnV0ZSwgc2luY2UgY2xhc3NlcyBkZWZhdWx0IHRvIHByaXZhdGUgYW5kIGZvciBjb25zaXN0ZW5jeSB3aXRoCisgICAgIyBzdHJ1Y3RzICh3aGVyZSB3ZSBkb24ndCBwcmludCB0aGUgInB1YmxpYzoiIGF0dHJpYnV0ZSkgd2UgZG9uJ3QgcHJpbnQKKyAgICAjIHRoZSAicHJpdmF0ZToiIGF0dHJpYnV0ZS4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBzZW5kX2dkYiAicHR5cGUgY2xhc3MgZGVmYXVsdF9wcml2YXRlX2NsYXNzXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgZGVmYXVsdF9wcml2YXRlX2NsYXNzIFx7JHt3c31pbnQgYTske3dzfWludCBiOyRubC4qXH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIGRlZmF1bHRfcHJpdmF0ZV9jbGFzcyAoRklYTUUpIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBkZWZhdWx0X3ByaXZhdGVfY2xhc3MgXHske3dzfXByaXZhdGU6JHt3c31pbnQgYTske3dzfWludCBiOyRubC4qXH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgZGVmYXVsdF9wcml2YXRlX2NsYXNzIChGSVhNRSkiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInB0eXBlIGNsYXNzIGRlZmF1bHRfcHJpdmF0ZV9jbGFzcyIgfQorCXRpbWVvdXQgeyBmYWlsICJwdHlwZSBjbGFzcyBkZWZhdWx0X3ByaXZhdGVfY2xhc3MgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIGNsYXNzIGV4cGxpY2l0X3ByaXZhdGVfY2xhc3NcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBleHBsaWNpdF9wcml2YXRlX2NsYXNzIFx7JHt3c31wcml2YXRlOiR7d3N9aW50IGE7JHt3c31pbnQgYjskbmwuKlx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyBleHBsaWNpdF9wcml2YXRlX2NsYXNzIgorCX0KKwktcmUgInR5cGUgPSBzdHJ1Y3QgZXhwbGljaXRfcHJpdmF0ZV9jbGFzcyBceyR7d3N9aW50IGE7JHt3c31pbnQgYjskbmwuKlx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJICAgIGZhaWwgInB0eXBlIGNsYXNzIGV4cGxpY2l0X3ByaXZhdGVfY2xhc3MiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInB0eXBlIGNsYXNzIGV4cGxpY2l0X3ByaXZhdGVfY2xhc3MiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHR5cGUgY2xhc3MgZXhwbGljaXRfcHJpdmF0ZV9jbGFzcyAodGltZW91dCkiIDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgY2xhc3MgbWl4ZWRfcHJvdGVjdGlvbl9jbGFzc1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIG1peGVkX3Byb3RlY3Rpb25fY2xhc3MgXHske3dzfXB1YmxpYzoke3dzfWludCBhOyR7d3N9aW50IGI7JHt3c31wcml2YXRlOiR7d3N9aW50IGM7JHt3c31pbnQgZDske3dzfXByb3RlY3RlZDoke3dzfWludCBlOyR7d3N9aW50IGY7JHt3c31wdWJsaWM6JHt3c31pbnQgZzske3dzfXByaXZhdGU6JHt3c31pbnQgaDske3dzfXByb3RlY3RlZDoke3dzfWludCBpOyRubC4qXH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIG1peGVkX3Byb3RlY3Rpb25fY2xhc3MiCisJfQorCS1yZSAidHlwZSA9IHN0cnVjdCBtaXhlZF9wcm90ZWN0aW9uX2NsYXNzIFx7JHt3c31pbnQgYTske3dzfWludCBiOyR7d3N9aW50IGM7JHt3c31pbnQgZDske3dzfWludCBlOyR7d3N9aW50IGY7JHt3c31pbnQgZzske3dzfWludCBoOyR7d3N9aW50IGk7JG5sLipcfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwdHlwZSBjbGFzcyBtaXhlZF9wcm90ZWN0aW9uX2NsYXNzIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBjbGFzcyBtaXhlZF9wcm90ZWN0aW9uX2NsYXNzIiB9CisJdGltZW91dCB7IGZhaWwgInB0eXBlIGNsYXNzIG1peGVkX3Byb3RlY3Rpb25fY2xhc3MgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgIyBUaGlzIGNsYXNzIGRvZXMgbm90IHVzZSBhbnkgQysrLXNwZWNpZmljIGZlYXR1cmVzLCBzbyBpdCdzIGZpbmUgZm9yCisgICAgIyBpdCB0byBwcmludCBhcyAic3RydWN0Ii4KKyAgICBzZW5kX2dkYiAicHR5cGUgY2xhc3MgQVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IChjbGFzc3xzdHJ1Y3QpIEEgXHsoJHt3c31wdWJsaWM6fCkke3dzfWludCBhOyR7d3N9aW50IHg7KCgke3dzfUEgJiBvcGVyYXRvcj1cXChBIGNvbnN0ICZcXCk7KXwoJHt3c31BXFwoQSBjb25zdCAmXFwpOyl8KCR7d3N9QVxcKHZvaWRcXCk7KSkqJHt3c31cfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgY2xhc3MgQSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgQSIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIGNsYXNzIEEgKHRpbWVvdXQpIgorCSAgICByZXR1cm4KKwl9CisgICAgfQorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIHNlbmRfZ2RiICJwdHlwZSBjbGFzcyBCXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgQiA6IHB1YmxpYyBBIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgYjske3dzfWludCB4OyR7d3N9QiAmIG9wZXJhdG9yPVxcKEIgY29uc3QgJlxcKTske3dzfUJcXChCIGNvbnN0ICZcXCk7JHt3c31CXFwodm9pZFxcKTske3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyBCIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBCIDogcHVibGljIEEgXHske3dzfXB1YmxpYzoke3dzfWludCBiOyR7d3N9aW50IHg7KCgke3dzfUIgJiBvcGVyYXRvcj1cXChCIGNvbnN0ICZcXCk7KXwoJHt3c31CXFwoQiBjb25zdCAmXFwpOyl8KCR7d3N9QlxcKHZvaWRcXCk7KSkqJHt3c31cfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgY2xhc3MgQiAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIGNsYXNzIEIiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyBCICh0aW1lb3V0KSIKKwkgICAgcmV0dXJuCisJfQorICAgIH0KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBzZW5kX2dkYiAicHR5cGUgY2xhc3MgQ1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIEMgOiBwdWJsaWMgQSBceyR7d3N9cHVibGljOiR7d3N9aW50IGM7JHt3c31pbnQgeDske3dzfUMgJiBvcGVyYXRvcj1cXChDIGNvbnN0ICZcXCk7JHt3c31DXFwoQyBjb25zdCAmXFwpOyR7d3N9Q1xcKHZvaWRcXCk7JHt3c31cfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgY2xhc3MgQyIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgQyA6IHB1YmxpYyBBIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgYzske3dzfWludCB4OygoJHt3c31DICYgb3BlcmF0b3I9XFwoQyBjb25zdCAmXFwpOyl8KCR7d3N9Q1xcKEMgY29uc3QgJlxcKTspfCgke3dzfUNcXCh2b2lkXFwpOykpKiR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIEMgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyBDIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgQyAodGltZW91dCkiCisJICAgIHJldHVybgorCX0KKyAgICB9CisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgc2VuZF9nZGIgInB0eXBlIGNsYXNzIERcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBEIDogcHVibGljIEIsIHB1YmxpYyBDIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgZDske3dzfWludCB4OyR7d3N9RCAmIG9wZXJhdG9yPVxcKEQgY29uc3QgJlxcKTske3dzfURcXChEIGNvbnN0ICZcXCk7JHt3c31EXFwodm9pZFxcKTske3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyBEIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBEIDogcHVibGljIEIsIHB1YmxpYyBDIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgZDske3dzfWludCB4OygoJHt3c31EICYgb3BlcmF0b3I9XFwoRCBjb25zdCAmXFwpOyl8KCR7d3N9RFxcKEQgY29uc3QgJlxcKTspfCgke3dzfURcXCh2b2lkXFwpOykpKiR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIEQgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyBEIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgRCAodGltZW91dCkiCisJICAgIHJldHVybgorCX0KKyAgICB9CisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgc2VuZF9nZGIgInB0eXBlIGNsYXNzIEVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBFIDogcHVibGljIEQgXHske3dzfXB1YmxpYzoke3dzfWludCBlOyR7d3N9aW50IHg7JHt3c31FICYgb3BlcmF0b3I9XFwoRSBjb25zdCAmXFwpOyR7d3N9RVxcKEUgY29uc3QgJlxcKTske3dzfUVcXCh2b2lkXFwpOyR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIEUiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIEUgOiBwdWJsaWMgRCBceyR7d3N9cHVibGljOiR7d3N9aW50IGU7JHt3c31pbnQgeDsoKCR7d3N9RSAmIG9wZXJhdG9yPVxcKEUgY29uc3QgJlxcKTspfCgke3dzfUVcXChFIGNvbnN0ICZcXCk7KXwoJHt3c31FXFwodm9pZFxcKTspKSoke3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyBFIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyBFIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgRSAodGltZW91dCkiCisJICAgIHJldHVybgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgY2xhc3MgdkFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSAoY2xhc3N8c3RydWN0KSB2QSBceygke3dzfXB1YmxpYzp8KSR7d3N9aW50IHZhOyR7d3N9aW50IHZ4OyR7d3N9dkEgJiBvcGVyYXRvcj1cXCh2QSBjb25zdCAmXFwpOyR7d3N9dkFcXCh2QSBjb25zdCAmXFwpOyR7d3N9dkFcXCh2b2lkXFwpOyR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIHZBIgorCX0KKwktcmUgInR5cGUgPSAoY2xhc3N8c3RydWN0KSB2QSBceygke3dzfXB1YmxpYzp8KSR7d3N9aW50IHZhOyR7d3N9aW50IHZ4OygoJHt3c312QSAmIG9wZXJhdG9yPVxcKHZBIGNvbnN0ICZcXCk7KXwoJHt3c312QVxcKHZBIGNvbnN0ICZcXCk7KXwoJHt3c312QVxcKHZvaWRcXCk7KSkqJHt3c31cfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgY2xhc3MgdkEgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyB2QSIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIGNsYXNzIHZBICh0aW1lb3V0KSIKKwkgICAgcmV0dXJuCisJfQorICAgIH0KKworICAgICMgQWNjZXB0IHRoZSBmb3JtIHdpdGggZW1iZWRkZWQgR05VIHN0eWxlIG1hbmdsZWQgdmlydHVhbCB0YWJsZSBjb25zdHJ1Y3RzCisgICAgIyBmb3Igbm93LCBidXQgd2l0aCBhIEZJWE1FLiAgQXQgc29tZSBmdXR1cmUgcG9pbnQsIGdkYiBzaG91bGQgdXNlIGEKKyAgICAjIHBvcnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgdmlydHVhbCB0YWJsZSBjb25zdHJ1Y3RzLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIHNlbmRfZ2RiICJwdHlwZSBjbGFzcyB2QlxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIHZCIDogcHVibGljIHZpcnR1YWwgdkEgXHske3dzfXByaXZhdGU6JHt3c312QSBcXCpfdmIudkE7JHt3c31wdWJsaWM6JHt3c31pbnQgdmI7JHt3c31pbnQgdng7JHt3c312QiAmIG9wZXJhdG9yPVxcKHZCIGNvbnN0ICZcXCk7JHt3c312QlxcKGludCwgdkIgY29uc3QgJlxcKTske3dzfXZCXFwoaW50XFwpOyR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgdkIgKEZJWE1FOiBub24tcG9ydGFibGUgdmlydHVhbCB0YWJsZSBjb25zdHJ1Y3RzKSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgdkIgOiBwdWJsaWMgdmlydHVhbCB2QSBceyR7d3N9cHJpdmF0ZToke3dzfXZBIFxcKl92Yi52QTske3dzfXB1YmxpYzoke3dzfWludCB2Yjske3dzfWludCB2eDsoKCR7d3N9dkIgJiBvcGVyYXRvcj1cXCh2QiBjb25zdCAmXFwpOyl8KCR7d3N9dkJcXChpbnQsIHZCIGNvbnN0ICZcXCk7KXwoJHt3c312QlxcKGludFxcKTspKSoke3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJICAgIGZhaWwgInB0eXBlIGNsYXNzIHZCIChGSVhNRSkgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyB2QiIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIGNsYXNzIHZCICh0aW1lb3V0KSIKKwkgICAgcmV0dXJuCisJfQorICAgIH0KKworICAgICMgQWNjZXB0IHRoZSBmb3JtIHdpdGggZW1iZWRkZWQgR05VIHN0eWxlIG1hbmdsZWQgdmlydHVhbCB0YWJsZSBjb25zdHJ1Y3RzCisgICAgIyBmb3Igbm93LCBidXQgd2l0aCBhIEZJWE1FLiAgQXQgc29tZSBmdXR1cmUgcG9pbnQsIGdkYiBzaG91bGQgdXNlIGEKKyAgICAjIHBvcnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgdmlydHVhbCB0YWJsZSBjb25zdHJ1Y3RzLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIHNlbmRfZ2RiICJwdHlwZSBjbGFzcyB2Q1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIHZDIDogcHVibGljIHZpcnR1YWwgdkEgXHske3dzfXByaXZhdGU6JHt3c312QSBcXCpfdmIudkE7JHt3c31wdWJsaWM6JHt3c31pbnQgdmM7JHt3c31pbnQgdng7JHt3c312QyAmIG9wZXJhdG9yPVxcKHZDIGNvbnN0ICZcXCk7JHt3c312Q1xcKGludCwgdkMgY29uc3QgJlxcKTske3dzfXZDXFwoaW50XFwpOyR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgdkMgKEZJWE1FOiBub24tcG9ydGFibGUgdmlydHVhbCB0YWJsZSBjb25zdHJ1Y3RzKSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgdkMgOiBwdWJsaWMgdmlydHVhbCB2QSBceyR7d3N9cHJpdmF0ZToke3dzfXZBIFxcKl92Yi52QTske3dzfXB1YmxpYzoke3dzfWludCB2Yzske3dzfWludCB2eDsoKCR7d3N9dkMgJiBvcGVyYXRvcj1cXCh2QyBjb25zdCAmXFwpOyl8KCR7d3N9dkNcXChpbnQsIHZDIGNvbnN0ICZcXCk7KXwoJHt3c312Q1xcKGludFxcKTspKSoke3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJICAgIGZhaWwgInB0eXBlIGNsYXNzIHZDIChGSVhNRSkgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyB2QyIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIGNsYXNzIHZDICh0aW1lb3V0KSIKKwkgICAgcmV0dXJuCisJfQorICAgIH0KKworICAgICMgQWNjZXB0IHRoZSBmb3JtIHdpdGggZW1iZWRkZWQgR05VIHN0eWxlIG1hbmdsZWQgdmlydHVhbCB0YWJsZSBjb25zdHJ1Y3RzCisgICAgIyBmb3Igbm93LCBidXQgd2l0aCBhIEZJWE1FLiAgQXQgc29tZSBmdXR1cmUgcG9pbnQsIGdkYiBzaG91bGQgdXNlIGEKKyAgICAjIHBvcnRhYmxlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgdmlydHVhbCB0YWJsZSBjb25zdHJ1Y3RzLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIHNlbmRfZ2RiICJwdHlwZSBjbGFzcyB2RFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIHZEIDogcHVibGljIHZpcnR1YWwgdkIsIHB1YmxpYyB2aXJ0dWFsIHZDIFx7JHt3c31wcml2YXRlOiR7d3N9dkMgXFwqX3ZiLnZDOyR7d3N9dkIgXFwqX3ZiLnZCOyR7d3N9cHVibGljOiR7d3N9aW50IHZkOyR7d3N9aW50IHZ4OyR7d3N9dkQgJiBvcGVyYXRvcj1cXCh2RCBjb25zdCAmXFwpOyR7d3N9dkRcXChpbnQsIHZEIGNvbnN0ICZcXCk7JHt3c312RFxcKGludFxcKTske3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJICAgIGZhaWwgInB0eXBlIGNsYXNzIHZEIChGSVhNRTogbm9uLXBvcnRhYmxlIHZpcnR1YWwgdGFibGUgY29uc3RydWN0cykiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIHZEIDogcHVibGljIHZpcnR1YWwgdkIsIHB1YmxpYyB2aXJ0dWFsIHZDIFx7JHt3c31wcml2YXRlOiR7d3N9dkMgXFwqX3ZiLnZDOyR7d3N9dkIgXFwqX3ZiLnZCOyR7d3N9cHVibGljOiR7d3N9aW50IHZkOyR7d3N9aW50IHZ4OygoJHt3c312RCAmIG9wZXJhdG9yPVxcKHZEIGNvbnN0ICZcXCk7KXwoJHt3c312RFxcKGludCwgdkQgY29uc3QgJlxcKTspfCgke3dzfXZEXFwoaW50XFwpOykpKiR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgdkQgKEZJWE1FKSAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIGNsYXNzIHZEIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgdkQgKHRpbWVvdXQpIgorCSAgICByZXR1cm4KKwl9CisgICAgfQorCisgICAgIyBBY2NlcHQgdGhlIGZvcm0gd2l0aCBlbWJlZGRlZCBHTlUgc3R5bGUgbWFuZ2xlZCB2aXJ0dWFsIHRhYmxlIGNvbnN0cnVjdHMKKyAgICAjIGZvciBub3csIGJ1dCB3aXRoIGEgRklYTUUuICBBdCBzb21lIGZ1dHVyZSBwb2ludCwgZ2RiIHNob3VsZCB1c2UgYQorICAgICMgcG9ydGFibGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSB2aXJ0dWFsIHRhYmxlIGNvbnN0cnVjdHMuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgc2VuZF9nZGIgInB0eXBlIGNsYXNzIHZFXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgdkUgOiBwdWJsaWMgdmlydHVhbCB2RCBceyR7d3N9cHJpdmF0ZToke3dzfXZEIFxcKl92Yi52RDske3dzfXB1YmxpYzoke3dzfWludCB2ZTske3dzfWludCB2eDske3dzfXZFICYgb3BlcmF0b3I9XFwodkUgY29uc3QgJlxcKTske3dzfXZFXFwoaW50LCB2RSBjb25zdCAmXFwpOyR7d3N9dkVcXChpbnRcXCk7JHt3c31cfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwdHlwZSBjbGFzcyB2RSAoRklYTUU6IG5vbi1wb3J0YWJsZSB2aXJ0dWFsIHRhYmxlIGNvbnN0cnVjdHMpIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyB2RSA6IHB1YmxpYyB2aXJ0dWFsIHZEIFx7JHt3c31wcml2YXRlOiR7d3N9dkQgXFwqX3ZiLnZEOyR7d3N9cHVibGljOiR7d3N9aW50IHZlOyR7d3N9aW50IHZ4OygoJHt3c312RSAmIG9wZXJhdG9yPVxcKHZFIGNvbnN0ICZcXCk7KXwoJHt3c312RVxcKGludCwgdkUgY29uc3QgJlxcKTspfCgke3dzfXZFXFwoaW50XFwpOykpKiR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgdkUgKEZJWE1FKSAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIGNsYXNzIHZFIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgdkUgKHRpbWVvdXQpIgorCSAgICByZXR1cm4KKwl9CisgICAgfQorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIHNlbmRfZ2RiICJwdHlwZSBjbGFzcyBCYXNlMVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIEJhc2UxIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgeDske3dzfUJhc2UxICYgb3BlcmF0b3I9XFwoQmFzZTEgY29uc3QgJlxcKTske3dzfUJhc2UxXFwoQmFzZTEgY29uc3QgJlxcKTske3dzfUJhc2UxXFwoaW50XFwpOyR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIEJhc2UxIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBCYXNlMSBceyR7d3N9cHVibGljOiR7d3N9aW50IHg7KCgke3dzfUJhc2UxICYgb3BlcmF0b3I9XFwoQmFzZTEgY29uc3QgJlxcKTspfCgke3dzfUJhc2UxXFwoQmFzZTEgY29uc3QgJlxcKTspfCgke3dzfUJhc2UxXFwoaW50XFwpOykpKiR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIEJhc2UxIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgQmFzZTEiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyBCYXNlMSAodGltZW91dCkiCisJICAgIHJldHVybgorCX0KKyAgICB9CisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgc2VuZF9nZGIgInB0eXBlIGNsYXNzIEZvb1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIEZvbyBceyR7d3N9cHVibGljOiR7d3N9aW50IHg7JHt3c31pbnQgeTske3dzfXN0YXRpYyBpbnQgc3Q7JHt3c31Gb28gJiBvcGVyYXRvcj1cXChGb28gY29uc3QgJlxcKTske3dzfUZvb1xcKEZvbyBjb25zdCAmXFwpOyR7d3N9Rm9vXFwoaW50LCBpbnRcXCk7JHt3c31pbnQgb3BlcmF0b3IhXFwodm9pZFxcKTske3dzfWludCBvcGVyYXRvciBpbnRcXCh2b2lkXFwpOyR7d3N9aW50IHRpbWVzXFwoaW50XFwpOyR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIEZvbyIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgRm9vIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgeDske3dzfWludCB5OyR7d3N9c3RhdGljIGludCBzdDsoKCR7d3N9Rm9vICYgb3BlcmF0b3I9XFwoRm9vIGNvbnN0ICZcXCk7KXwoJHt3c31Gb29cXChGb28gY29uc3QgJlxcKTspfCgke3dzfUZvb1xcKGludCwgaW50XFwpOyl8KCR7d3N9aW50IG9wZXJhdG9yIVxcKHZvaWRcXCk7KXwoJHt3c31pbnQgb3BlcmF0b3IgaW50XFwodm9pZFxcKTspfCgke3dzfWludCB0aW1lc1xcKGludFxcKTspKSoke3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyBGb28gKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyBGb28iCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyBGb28gKHRpbWVvdXQpIgorCSAgICByZXR1cm4KKwl9CisgICAgfQorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIHNlbmRfZ2RiICJwdHlwZSBjbGFzcyBCYXJcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBCYXIgOiBwdWJsaWMgQmFzZTEsIHB1YmxpYyBGb28gXHske3dzfXB1YmxpYzoke3dzfWludCB6OyR7d3N9QmFyICYgb3BlcmF0b3I9XFwoQmFyIGNvbnN0ICZcXCk7JHt3c31CYXJcXChCYXIgY29uc3QgJlxcKTske3dzfUJhclxcKGludCwgaW50LCBpbnRcXCk7JHt3c31cfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgY2xhc3MgQmFyIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBCYXIgOiBwdWJsaWMgQmFzZTEsIHB1YmxpYyBGb28gXHske3dzfXB1YmxpYzoke3dzfWludCB6OygoJHt3c31CYXIgJiBvcGVyYXRvcj1cXChCYXIgY29uc3QgJlxcKTspfCgke3dzfUJhclxcKEJhciBjb25zdCAmXFwpOyl8KCR7d3N9QmFyXFwoaW50LCBpbnQsIGludFxcKTspKSoke3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyBCYXIgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyBCYXIiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyBCYXIgKHRpbWVvdXQpIgorCSAgICByZXR1cm4KKwl9CisgICAgfQorfQorCisjCisjIFRlc3Qgc2ltcGxlIGFjY2VzcyB0byBjbGFzcyBtZW1iZXJzLgorIworCitwcm9jIHRlc3Rfbm9uX2luaGVyaXRlZF9tZW1iZXJfYWNjZXNzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIAorICAgICMgUHJpbnQgbm9uLWluaGVyaXRlZCBtZW1iZXJzIG9mIGdfQS4KKworICAgIGdkYl90ZXN0ICJwcmludCBnX0EuYSIgIi4qID0gMSIgImdfQS5hIGluY29ycmVjdCIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0EueCIgIi4qID0gMiIgImdfQS54IGluY29ycmVjdCIKKworICAgICMgUHJpbnQgbm9uLWluaGVyaXRlZCBtZW1iZXJzIG9mIGdfQi4KKworICAgIGdkYl90ZXN0ICJwcmludCBnX0IuYiIgIi4qID0gNSIgImdfQi5iIGluY29ycmVjdCIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0IueCIgIi4qID0gNiIgImdfQi54IGluY29ycmVjdCIKKworICAgICMgUHJpbnQgbm9uLWluaGVyaXRlZCBtZW1iZXJzIG9mIGdfQy4KKworICAgIGdkYl90ZXN0ICJwcmludCBnX0MuYyIgIi4qID0gOSIgImdfQy5jIGluY29ycmVjdCIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0MueCIgIi4qID0gMTAiICJnX0MueCBpbmNvcnJlY3QiCisKKyAgICAjIFByaW50IG5vbi1pbmhlcml0ZWQgbWVtYmVycyBvZiBnX0QuCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19ELmQiICIuKiA9IDE5IiAiZ19ELmQgaW5jb3JyZWN0IgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRC54IiAiLiogPSAyMCIgImdfRC54IGluY29ycmVjdCIKKworICAgICMgUHJpbnQgbm9uLWluaGVyaXRlZCBtZW1iZXJzIG9mIGdfRS4KKworICAgIGdkYl90ZXN0ICJwcmludCBnX0UuZSIgIi4qID0gMzEiICJnX0UuZSBpbmNvcnJlY3QiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19FLngiICIuKiA9IDMyIiAiZ19FLnggaW5jb3JyZWN0IgorfQorCisjCisjIFRyeSBhY2Nlc3MgdG8gbm9uLW1lbWJlcnMgdGhhdCBhcmUgbWVtYmVycyBvZiBhbm90aGVyIGNsYXNzLgorIyBTaG91bGQgZ2l2ZSBlcnJvcnMuCisjCisKK3Byb2MgdGVzdF93cm9uZ19jbGFzc19tZW1iZXJzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQS5iIiAiVGhlcmUgaXMgbm8gbWVtYmVyKCBvciBtZXRob2R8KSBuYW1lZCBiLiIgInByaW50IGdfQS5iIHNob3VsZCBiZSBlcnJvciIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0IuYyIgIlRoZXJlIGlzIG5vIG1lbWJlciggb3IgbWV0aG9kfCkgbmFtZWQgYy4iICJwcmludCBnX0IuYyBzaG91bGQgYmUgZXJyb3IiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19CLmQiICJUaGVyZSBpcyBubyBtZW1iZXIoIG9yIG1ldGhvZHwpIG5hbWVkIGQuIiAicHJpbnQgZ19CLmQgc2hvdWxkIGJlIGVycm9yIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQy5iIiAiVGhlcmUgaXMgbm8gbWVtYmVyKCBvciBtZXRob2R8KSBuYW1lZCBiLiIgInByaW50IGdfQy5iIHNob3VsZCBiZSBlcnJvciIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0MuZCIgIlRoZXJlIGlzIG5vIG1lbWJlciggb3IgbWV0aG9kfCkgbmFtZWQgZC4iICJwcmludCBnX0MuZCBzaG91bGQgYmUgZXJyb3IiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19ELmUiICJUaGVyZSBpcyBubyBtZW1iZXIoIG9yIG1ldGhvZHwpIG5hbWVkIGUuIiAicHJpbnQgZ19ELmUgc2hvdWxkIGJlIGVycm9yIgorfQorCisjCisjIFRyeSBhY2Nlc3MgdG8gbm9uLW1lbWJlcnMgdGhhdCBhcmUgbm90IG1lbWJlcnMgb2YgYW55IGNsYXNzLgorIyBTaG91bGQgZ2l2ZSBlcnJvcnMuCisjCisKK3Byb2MgdGVzdF9ub25leGlzdGFudF9tZW1iZXJzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQS55IiAiVGhlcmUgaXMgbm8gbWVtYmVyKCBvciBtZXRob2R8KSBuYW1lZCB5LiIgInByaW50IGdfQS55IHNob3VsZCBiZSBlcnJvciIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0IueiIgIlRoZXJlIGlzIG5vIG1lbWJlciggb3IgbWV0aG9kfCkgbmFtZWQgei4iICJwcmludCBnX0IueiBzaG91bGQgYmUgZXJyb3IiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19DLnEiICJUaGVyZSBpcyBubyBtZW1iZXIoIG9yIG1ldGhvZHwpIG5hbWVkIHEuIiAicHJpbnQgZ19DLnEgc2hvdWxkIGJlIGVycm9yIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRC5wIiAiVGhlcmUgaXMgbm8gbWVtYmVyKCBvciBtZXRob2R8KSBuYW1lZCBwLiIgInByaW50IGdfRC5wIHNob3VsZCBiZSBlcnJvciIKK30KKworIworIyBQb2ludGVycyB0byBjbGFzcyBtZW1iZXJzCisjCisKK3Byb2MgdGVzdF9wb2ludGVyc190b19jbGFzc19tZW1iZXJzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBkZWNpbWFsCisgICAgZ2xvYmFsIG5sCisKKyAgICBnZGJfdGVzdCAicHJpbnQgQmFyOjp6IiAiLiogPSAuaW50XFsgXF0qXFsoIFxdKkJhcjo6JlxbKVxdK1xbIFxdKkJhcjo6eiIgInByaW50IEJhcjo6eiIKKworICAgIGdkYl90ZXN0ICJwcmludCAmRm9vOjp4IiAiLiogPSAuaW50XFsgXF0qXFsoIFxdKkZvbzo6XFsqKVxdK1xbIFxdKiZGb286OngiICJwcmludCAmRm9vOjp4IgorCisgICAgZ2RiX3Rlc3QgInByaW50IChpbnQpJkZvbzo6eCIgIi4qID0gMCIgInByaW50IChpbnQpJkZvbzo6eCIKKworICAgIHNlbmRfZ2RiICJwcmludCAoaW50KSZCYXI6OnkgPT0gMipzaXplb2YoaW50KVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSB0cnVlJG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwcmludCAoaW50KSZCYXI6OnkgPT0gMipzaXplb2YoaW50KSIKKwl9CisJLXJlICJUaGVyZSBpcyBubyBmaWVsZCBuYW1lZCB5LiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHJpbnQgKGludCkmQmFyOjp5ID09IDIqc2l6ZW9mKGludCkiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IChpbnQpJkJhcjo6eSA9PSAyKnNpemVvZihpbnQpIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IChpbnQpJkJhcjo6eSA9PSAyKnNpemVvZihpbnQpICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJuZXh0XG4iCisgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiJGRlY2ltYWxcWyBcdFxdK2luaGVyaXRhbmNlMyBcWykoXF0rOyRubCRnZGJfcHJvbXB0ICQiIHt9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibmV4dCB0byBpbmhlcml0YW5jZTMiIDsgcmV0dXJuIH0KKyAgICB9CisgICAgY2xlYXJfeGZhaWwgIiotKi0qIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCAoaW50KXBtaSA9PSBzaXplb2YoaW50KSIgIi4qID0gZmFsc2UiICJwcmludCAoaW50KXBtaSA9PSBzaXplb2YoaW50KSIKK30KKworIworIyBUZXN0IHN0YXRpYyBtZW1iZXJzLgorIworCitwcm9jIHRlc3Rfc3RhdGljX21lbWJlcnMge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBubAorCisgICAgc2VuZF9nZGIgInByaW50IEZvbzo6c3RcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qID0gMTAwJG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwcmludCBGb286OnN0IgorCX0KKwktcmUgIlRoZXJlIGlzIG5vIGZpZWxkIG5hbWVkIHN0LiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHJpbnQgRm9vOjpzdCIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgRm9vOjpzdCIgfQorICAgICAgIHRpbWVvdXQgeyBmYWlsICJwcmludCBGb286OnN0ICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJzZXQgZm9vLnN0ID0gMjAwXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9CisgICAgfQorCisgICAgc2VuZF9nZGIgInByaW50IGJhci5zdFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSAyMDAkbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInByaW50IGJhci5zdCIKKwl9CisJLXJlICJUaGVyZSBpcyBubyBtZW1iZXIoIG9yIG1ldGhvZHwpIG5hbWVkIHN0LiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHJpbnQgYmFyLnN0IgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBiYXIuc3QiIH0KKyAgICAgICB0aW1lb3V0IHsgZmFpbCAicHJpbnQgYmFyLnN0ICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwcmludCAmZm9vLnN0XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IC5pbnQgXFsqKVxdKyAkaGV4JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwcmludCAmZm9vLnN0IgorCX0KKwktcmUgIlRoZXJlIGlzIG5vIG1lbWJlciggb3IgbWV0aG9kfCkgbmFtZWQgc3QuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwcmludCAmZm9vLnN0IgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCAmZm9vLnN0IiB9CisgICAgICAgdGltZW91dCB7IGZhaWwgInByaW50ICZmb28uc3QgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgc2V0IGdvdF9iYXJfc3QgMAorICAgIHNlbmRfZ2RiICJwcmludCAmQmFyOjpzdFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSAuaW50IFxbKilcXSsgJGhleCRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHJpbnQgJkJhcjo6c3QiCisJICAgIHNldCBnb3RfYmFyX3N0IDEKKwl9CisJLXJlICJUaGVyZSBpcyBubyBmaWVsZCBuYW1lZCBzdC4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJICAgIGZhaWwgInByaW50ICZCYXI6OnN0IgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCAmQmFyOjpzdCIgfQorICAgICAgIHRpbWVvdXQgeyBmYWlsICJwcmludCAmQmFyOjpzdCAodGltZW91dCkiIDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICBpZiAkZ290X2Jhcl9zdCB0aGVuIHsKKwlnZGJfdGVzdCAicHJpbnQgKlwkIiAiLiogPSAyMDAiICJwcmludCAqXCQiCisgICAgfQorCisgICAgZ2RiX3Rlc3QgInNldCBwcmludCBzdGF0aWMtbWVtYmVycyBvZmYiICIiCisgICAgZ2RiX3Rlc3QgInByaW50IGNzaSIgXAorCSJ7eCA9IDEwLCB5ID0gMjB9IiBcCisJInByaW50IGNzaSB3aXRob3V0IHN0YXRpYyBtZW1iZXJzIgorICAgIGdkYl90ZXN0ICJwcmludCBjbnNpIiBcCisJInt4ID0gMzAsIHkgPSA0MH0iIFwKKwkicHJpbnQgY25zaSB3aXRob3V0IHN0YXRpYyBtZW1iZXJzIgorCisgICAgZ2RiX3Rlc3QgInNldCBwcmludCBzdGF0aWMtbWVtYmVycyBvbiIgIiIKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInByaW50IGNzaSIgXAorCSJ7eCA9IDEwLCB5ID0gMjAsIHN0YXRpYyBudWxsID0ge3ggPSAwLCB5ID0gMCwgc3RhdGljIG51bGwgPSA8c2FtZSBhcyBzdGF0aWMgbWVtYmVyIG9mIGFuIGFscmVhZHkgc2VlbiB0eXBlPn19IiBcCisJInByaW50IGNzaSB3aXRoIHN0YXRpYyBtZW1iZXJzIgorICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgY25zaSIgXAorCSJ7eCA9IDMwLCB5ID0gNDAsIHN0YXRpYyBudWxsID0ge3ggPSAwLCB5ID0gMCwgc3RhdGljIG51bGwgPSA8c2FtZSBhcyBzdGF0aWMgbWVtYmVyIG9mIGFuIGFscmVhZHkgc2VlbiB0eXBlPiwgc3RhdGljIHl5ID0ge3ogPSA1LCBzdGF0aWMgeHggPSB7eCA9IDEsIHkgPSAyLCBzdGF0aWMgbnVsbCA9IDxzYW1lIGFzIHN0YXRpYyBtZW1iZXIgb2YgYW4gYWxyZWFkeSBzZWVuIHR5cGU+LCBzdGF0aWMgeXkgPSA8c2FtZSBhcyBzdGF0aWMgbWVtYmVyIG9mIGFuIGFscmVhZHkgc2VlbiB0eXBlPn19fSwgc3RhdGljIHl5ID0gPHNhbWUgYXMgc3RhdGljIG1lbWJlciBvZiBhbiBhbHJlYWR5IHNlZW4gdHlwZT59IiBcCisJInByaW50IGNuc2kgd2l0aCBzdGF0aWMgbWVtYmVycyIKK30KKworcHJvYyBkb190ZXN0cyB7fSB7CisgICAgZ2xvYmFsIHBybXNfaWQKKyAgICBnbG9iYWwgYnVnX2lkCisgICAgZ2xvYmFsIHN1YmRpcgorICAgIGdsb2JhbCBvYmpkaXIKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgZ2xvYmFsIGJpbmZpbGUKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgc2V0IHBybXNfaWQgMAorICAgIHNldCBidWdfaWQgMAorCisgICAgIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKyAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKyAgICBnZGJfbG9hZCAkYmluZmlsZQorCisgICAgc2VuZF9nZGIgInNldCBsYW5ndWFnZSBjKytcbiIKKyAgICBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKKyAgICBzZW5kX2dkYiAic2V0IHdpZHRoIDBcbiIKKyAgICBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKKworICAgICMgR2V0IHRoZSBkZWJ1ZyBmb3JtYXQgZm9yIHRoZSBjb21waWxlZCB0ZXN0IGNhc2UuCisKKyAgICBpZiBbIHJ1bnRvX21haW4gXSB0aGVuIHsKKwlnZXRfZGVidWdfZm9ybWF0CisgICAgfQorCisgICAgdGVzdF9wdHlwZV9jbGFzc19vYmplY3RzCisKKyAgICBpZiBbIHJ1bnRvICdpbmhlcml0YW5jZTIodm9pZCknIF0gdGhlbiB7CisJdGVzdF9ub25faW5oZXJpdGVkX21lbWJlcl9hY2Nlc3MKKwl0ZXN0X3dyb25nX2NsYXNzX21lbWJlcnMKKwl0ZXN0X25vbmV4aXN0YW50X21lbWJlcnMKKyAgICB9CisKKyAgICBpZiBbaXN0YXJnZXQgIm1pcHMtaWR0LSoiXSB0aGVuIHsKKwkjIFJlc3RhcnQgYmVjYXVzZSBJRFQvU0lNIHJ1bnMgb3V0IG9mIGZpbGUgZGVzY3JpcHRvcnMuCisJZ2RiX2V4aXQKKwlnZGJfc3RhcnQKKwlnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKwlnZGJfbG9hZCAkYmluZmlsZQorICAgIH0KKworICAgIGlmIFsgcnVudG9fbWFpbiBdIHRoZW4geworCXRlc3RfcG9pbnRlcnNfdG9fY2xhc3NfbWVtYmVycworCXRlc3Rfc3RhdGljX21lbWJlcnMKKyAgICB9CisKKyAgICBpZiBbaXN0YXJnZXQgIm1pcHMtaWR0LSoiXSB0aGVuIHsKKwkjIFJlc3RhcnQgYmVjYXVzZSBJRFQvU0lNIHJ1bnMgb3V0IG9mIGZpbGUgZGVzY3JpcHRvcnMuCisJZ2RiX2V4aXQKKwlnZGJfc3RhcnQKKwlnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKwlnZGJfbG9hZCAkYmluZmlsZQorICAgIH0KKyAKKyAgICBpZiBbIHJ1bnRvIG1hcmtlcl9yZWcxIF0gdGhlbiB7CisKKwlnZGJfdGVzdCAiZmluaXNoIiAiUnVuIHRpbGwgZXhpdCBmcm9tLioiICJmaW5pc2ggZnJvbSBtYXJrZXJfcmVnMSIKKworCXNlbmRfZ2RiICJwcmludCB2Lm1ldGhvZCAoKVxuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIj0gODIuKiRnZGJfcHJvbXB0ICQiIHsKKwkJcGFzcyAiY2FsbGluZyBtZXRob2QgZm9yIHNtYWxsIGNsYXNzIgorCSAgICB9CisJICAgIC1yZSAiQWRkcmVzcyByZXF1ZXN0ZWQgZm9yIGlkZW50aWZpZXIgLnYuIHdoaWNoIGlzIGluIGEgcmVnaXN0ZXIuKiRnZGJfcHJvbXB0ICQiIHsKKwkJc2V0dXBfeGZhaWwgIiotKi0qIiAyOTcyCisJCWZhaWwgImNhbGxpbmcgbWV0aG9kIGZvciBzbWFsbCBjbGFzcyIKKwkgICAgfQorCSAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjYWxsaW5nIG1ldGhvZCBmb3Igc21hbGwgY2xhc3MiIH0KKwkgICAgdGltZW91dCB7IGZhaWwgImNhbGxpbmcgbWV0aG9kIGZvciBzbWFsbCBjbGFzcyAodGltZW91dCkiIH0KKwkgICAgZW9mIHsgZmFpbCAiY2FsbGluZyBtZXRob2QgZm9yIHNtYWxsIGNsYXNzIChlb2YpIiB9CisJfQorICAgIH0KKworfQorCitkb190ZXN0cworCisKKyMgU29tZSBhZGRpdGlvbmFsIHRlc3RzIGZvciBlbnVtcyBpbnNpZGUgY2xhc3NlcworCisKKyMgc2V0IGEgYnJlYWtwb2ludCBhbmQgZ28gdGhlcmUKK3NlbmRfZ2RiICJicmVhayA0OThcbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJCcmVha3BvaW50IFxbMC05XF0gYXQuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAic2V0IGJyZWFrIDQ5OCIgfQorICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAic2V0IGJyZWFrIDQ5OCIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgc2V0IGJyZWFrIDQ5OCIgfQorfQorc2VuZF9nZGIgImNvbnRpbnVlXG4iICAgCitnZGJfZXhwZWN0IHsgICAKKyAgIC1yZSAiQ29udGludWluZ1xcLlxyXG5cclxuQnJlYWtwb2ludCBcWzAtOVxdKiwgbWFpbi4uLi5hdC4qbWlzY1xcLmNjOjQ5OFxyXG40OTguKlxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgImNvbnRpbnVlIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJjb250aW51ZSIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY29udGludWUiIH0KK30KKworIyBwcmludCB0aGUgb2JqZWN0CitzZW5kX2dkYiAicHJpbnQgb2JqX3dpdGhfZW51bVxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgIlxcJFxbMC05XF0qID0gXFx7cHJpdl9lbnVtID0gcmVkLCB4ID0gMFxcfS4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBvYmpfd2l0aF9lbnVtICgxKSIgfQorICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHJpbnQgb2JqX3dpdGhfZW51bSAoMSkiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IG9ial93aXRoX2VudW0gKDEpIiB9Cit9CisKK3NlbmRfZ2RiICJuZXh0XG4iICAgCitnZGJfZXhwZWN0IHsgICAKKyAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgIm5leHQiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIG5leHQiIH0KK30KKworIyBwcmludCB0aGUgb2JqZWN0IGFnYWluCitzZW5kX2dkYiAicHJpbnQgb2JqX3dpdGhfZW51bVxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgIlxcJFxbMC05XF0qID0gXFx7cHJpdl9lbnVtID0gZ3JlZW4sIHggPSAwXFx9LiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IG9ial93aXRoX2VudW0gKDIpIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwcmludCBvYmpfd2l0aF9lbnVtICgyKSIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgb2JqX3dpdGhfZW51bSAoMikiIH0KK30KKworIyBwcmludCBvdXQgdGhlIGVudW0gbWVtYmVyCitzZW5kX2dkYiAicHJpbnQgb2JqX3dpdGhfZW51bS5wcml2X2VudW1cbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJcXCRcWzAtOVxdKiA9IGdyZWVuLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IG9ial93aXRoX2VudW0ucHJpdl9lbnVtIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwcmludCBvYmpfd2l0aF9lbnVtLnByaXZfZW51bSIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgb2JqX3dpdGhfZW51bS5wcml2X2VudW0iIH0KK30KKworIyBwdHlwZSBvbiB0aGUgZW51bSBtZW1iZXIKK3NlbmRfZ2RiICJwdHlwZSBvYmpfd2l0aF9lbnVtLnByaXZfZW51bVxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgInR5cGUgPSBlbnVtIENsYXNzV2l0aEVudW06OlByaXZFbnVtIFxce3JlZCwgZ3JlZW4sIGJsdWUsIHllbGxvdyA9IDQyXFx9LiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIG9ial93aXRoX2VudW0ucHJpdl9lbnVtIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwdHlwZSBvYmpfd2l0aF9lbnVtLnByaXZfZW51bSIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgb2JqX3dpdGhfZW51bS5wcml2X2VudW0iIH0KK30KKworIyBwdHlwZSBvbiB0aGUgb2JqZWN0CitzZW5kX2dkYiAicHR5cGUgb2JqX3dpdGhfZW51bVxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgInR5cGUgPSBjbGFzcyBDbGFzc1dpdGhFbnVtIFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSplbnVtIENsYXNzV2l0aEVudW06OlByaXZFbnVtIHByaXZfZW51bTtcclxuXFsgXHRcXSppbnQgeDtcclxuXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgb2JqX3dpdGhfZW51bSIgfQorICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHR5cGUgb2JqX3dpdGhfZW51bSIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgb2JqX3dpdGhfZW51bSIgfQorfQorCitzZW5kX2dkYiAicHJpbnQgKENsYXNzV2l0aEVudW06OlByaXZFbnVtKSA0MlxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgIlxcJFxbMC05XF0qID0geWVsbG93LiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IChDbGFzc1dpdGhFbnVtOjpQcml2RW51bSkgNDIiIH0KKyAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgInByaW50IChDbGFzc1dpdGhFbnVtOjpQcml2RW51bSkgNDIiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IChDbGFzc1dpdGhFbnVtOjpQcml2RW51bSkgNDIiIH0KK30KKworCitzZW5kX2dkYiAibWFpbnQgZGVtYW5nbGUgaW5oZXJpdGFuY2UxX19GdlxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgImluaGVyaXRhbmNlMVxcKHZvaWRcXCkuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiZGVtYW5nbGUiIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgZmFpbCAiZGVtYW5nbGUiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGRlbWFuZ2xlIiB9Cit9CisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9jb21waWxlci5jYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9jb21waWxlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTM1Yzc1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL2NvbXBpbGVyLmNjCkBAIC0wLDAgKzEsMzQgQEAKKy8qIE9mdGVuIHRoZSBiZWhhdmlvciBvZiBhbnkgcGFydGljdWxhciB0ZXN0IGRlcGVuZHMgdXBvbiB3aGF0IGNvbXBpbGVyIHdhcworICAgdXNlZCB0byBjb21waWxlIHRoZSB0ZXN0LiAgQXMgZWFjaCB0ZXN0IGlzIGNvbXBpbGVkLCB0aGlzIGZpbGUgaXMKKyAgIHByZXByb2Nlc3NlZCBieSB0aGUgc2FtZSBjb21waWxlciB1c2VkIHRvIGNvbXBpbGUgdGhhdCBzcGVjaWZpYyB0ZXN0CisgICAoZGlmZmVyZW50IHRlc3RzIG1pZ2h0IGJlIGNvbXBpbGVkIGJ5IGRpZmZlcmVudCBjb21waWxlcnMsIHBhcnRpY3VsYXJseQorICAgaWYgY29tcGlsZWQgYXQgZGlmZmVyZW50IHRpbWVzKSwgYW5kIHVzZWQgdG8gZ2VuZXJhdGUgYSAqLmNpIChjb21waWxlcgorICAgaW5mbykgZmlsZSBmb3IgdGhhdCB0ZXN0LgorCisgICBJLkUuLCB3aGVuIGNhbGxmdW5jcyBpcyBjb21waWxlZCwgYSBjYWxsZnVuY3MuY2kgZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCwKKyAgIHdoaWNoIGNhbiB0aGVuIGJlIHNvdXJjZWQgYnkgY2FsbGZ1bmNzLmV4cCB0byBnaXZlIGNhbGxmdW5jcy5leHAgYWNjZXNzCisgICB0byBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQuCisKKyAgIFRPRE86ICBJdCBtaWdodCBiZSBhIGdvb2QgaWRlYSB0byBhZGQgZXhwZWN0IGNvZGUgdGhhdCB0ZXN0cyBlYWNoCisgICBkZWZpbml0aW9uIG1hZGUgd2l0aCAnc2V0IiB0byBzZWUgaWYgb25lIGFscmVhZHkgZXhpc3RzLCBhbmQgaWYgc28KKyAgIHdhcm4gYWJvdXQgY29uZmxpY3RzIGlmIGl0IGlzIGJlaW5nIHNldCB0byBzb21ldGhpbmcgZWxzZS4gICovCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDYKK3NldCBzdXBwb3J0c190ZW1wbGF0ZV9kZWJ1Z2dpbmcgMQorI2Vsc2UKK3NldCBzdXBwb3J0c190ZW1wbGF0ZV9kZWJ1Z2dpbmcgMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAKK3NldCBzdXBwb3J0c190ZW1wbGF0ZV9kZWJ1Z2dpbmcgMQorI2Vsc2UKK3NldCBzdXBwb3J0c190ZW1wbGF0ZV9kZWJ1Z2dpbmcgMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykKK3NldCBnY2NfY29tcGlsZWQgX19HTlVDX18KKyNlbHNlCitzZXQgZ2NjX2NvbXBpbGVkIDAKKyNlbmRpZgorCityZXR1cm4gMApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL2NvbmZpZ3VyZSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQwYjUxNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9jb25maWd1cmUKQEAgLTAsMCArMSw4OTkgQEAKKyMhIC9iaW4vc2gKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2J1aWxkPU5PTkUKK2NhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2V4ZWNfcHJlZml4PU5PTkUKK2hvc3Q9Tk9ORQorbm9fY3JlYXRlPQorbm9ub3B0PU5PTkUKK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3RhcmdldD1OT05FCit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorc3ViZGlycz0KK01GTEFHUz0gTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT1jcGx1c2Z1bmNzLmNjCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19wcm9nPSQwCisgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCisKKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgLiAkY2FjaGVfZmlsZQorZWxzZQorICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgPiAkY2FjaGVfZmlsZQorZmkKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworCisKK0NDPSR7Q0MtY2N9CisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTczOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKKworaG9zdF9hbGlhcz0kaG9zdAorY2FzZSAiJGhvc3RfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkKKyAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6CisgICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkgOzsKKyAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCitob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkaG9zdCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU5NDogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKwordGFyZ2V0X2FsaWFzPSR0YXJnZXQKK2Nhc2UgIiR0YXJnZXRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKwordGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAordGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK3RhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCit0YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjEyOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIERFRlMuCisjIFByb3RlY3QgYWdhaW5zdCBzaGVsbCBleHBhbnNpb24gd2hpbGUgZXhlY3V0aW5nIE1ha2VmaWxlIHJ1bGVzLgorIyBQcm90ZWN0IGFnYWluc3QgTWFrZWZpbGUgbWFjcm8gZXhwYW5zaW9uLgorY2F0ID4gY29uZnRlc3QuZGVmcyA8PFxFT0YKK3MlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJS1EXDE9XDIlZworcyVbIAlgfiMkXiYqKCl7fVxcfDsnIjw+P10lXFwmJWcKK3MlXFslXFwmJWcKK3MlXF0lXFwmJWcKK3MlXCQlJCQlZworRU9GCitERUZTPWBzZWQgLWYgY29uZnRlc3QuZGVmcyBjb25mZGVmcy5oIHwgdHIgJ1wwMTInICcgJ2AKK3JtIC1mIGNvbmZ0ZXN0LmRlZnMKKworCisjIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKworZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUworcm0gLWYgJENPTkZJR19TVEFUVVMKK2NhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisjISAvYmluL3NoCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAorIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMKKyMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCisjCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKK2ZvciBhY19vcHRpb24KK2RvCisgIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCisgICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQorICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSIKKyAgICBleGl0IDAgOzsKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCisgICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7CisgIGVzYWMKK2RvbmUKKworYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KK3NlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Cisgcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKKyRhY192cHN1YgorJGV4dHJhc3ViCitzJUBTSEVMTEAlJFNIRUxMJWcKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBDQ0AlJENDJWcKK3MlQGhvc3RAJSRob3N0JWcKK3MlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKK3MlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCitzJUBob3N0X29zQCUkaG9zdF9vcyVnCitzJUB0YXJnZXRAJSR0YXJnZXQlZworcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKK3MlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKK3MlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKK3MlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCitzJUBidWlsZEAlJGJ1aWxkJWcKK3MlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZworcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKK3MlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCitzJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jKysvY29uZmlndXJlLmluIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTg5Y2I4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDE1IEBACitkbmwgUHJvY2VzcyB0aGlzIGZpbGUgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorZG5sIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCBmcmFnbWVudCB0aGF0IHN1cHBsaWVzIHRoZSBpbmZvcm1hdGlvbgorZG5sIG5lY2Vzc2FyeSB0byB0YWlsb3IgYSB0ZW1wbGF0ZSBjb25maWd1cmUgc2NyaXB0IGludG8gdGhlIGNvbmZpZ3VyZQorZG5sIHNjcmlwdCBhcHByb3ByaWF0ZSBmb3IgdGhpcyBkaXJlY3RvcnkuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sKK2RubCBhbnkgZXhpc3RpbmcgY29uZmlndXJlIHNjcmlwdC4KKworQUNfUFJFUkVRKDIuNSkKK0FDX0lOSVQoY3BsdXNmdW5jcy5jYykKKworQ0M9JHtDQy1jY30KK0FDX1NVQlNUKENDKQorQUNfQ09ORklHX0FVWF9ESVIoYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLikKK0FDX0NBTk9OSUNBTF9TWVNURU0KKworQUNfT1VUUFVUKE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL2NwbHVzZnVuY3MuY2MgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvY3BsdXNmdW5jcy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjRjZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL2NwbHVzZnVuY3MuY2MKQEAgLTAsMCArMSwxODUgQEAKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworY2xhc3MgZm9vIHsKK3B1YmxpYzoKKyAgZm9vICAoaW50KTsKKyAgZm9vICAoaW50LCBjb25zdCBjaGFyICopOworICBmb28gIChmb28mKTsKKyAgfmZvbyAoKTsKKworICB2b2lkICBvcGVyYXRvciAqICAgICAgKGZvbyYpOworICB2b2lkICBvcGVyYXRvciAlICAgICAgKGZvbyYpOworICB2b2lkICBvcGVyYXRvciAtICAgICAgKGZvbyYpOworICB2b2lkICBvcGVyYXRvciA+PiAgICAgKGZvbyYpOworICB2b2lkICBvcGVyYXRvciAhPSAgICAgKGZvbyYpOworICB2b2lkICBvcGVyYXRvciA+ICAgICAgKGZvbyYpOworICB2b2lkICBvcGVyYXRvciA+PSAgICAgKGZvbyYpOworICB2b2lkICBvcGVyYXRvciB8ICAgICAgKGZvbyYpOworICB2b2lkICBvcGVyYXRvciAmJiAgICAgKGZvbyYpOworICB2b2lkICBvcGVyYXRvciAhICAgICAgKHZvaWQpOworICB2b2lkICBvcGVyYXRvciArKyAgICAgKGludCk7CisgIHZvaWQgIG9wZXJhdG9yID0gICAgICAoZm9vJik7CisgIHZvaWQgIG9wZXJhdG9yICs9ICAgICAoZm9vJik7CisgIHZvaWQgIG9wZXJhdG9yICo9ICAgICAoZm9vJik7CisgIHZvaWQgIG9wZXJhdG9yICU9ICAgICAoZm9vJik7CisgIHZvaWQgIG9wZXJhdG9yID4+PSAgICAoZm9vJik7CisgIHZvaWQgIG9wZXJhdG9yIHw9ICAgICAoZm9vJik7CisgIHZvaWQgIG9wZXJhdG9yICwgICAgICAoZm9vJik7CisgIHZvaWQgIG9wZXJhdG9yIC8gICAgICAoZm9vJik7CisgIHZvaWQgIG9wZXJhdG9yICsgICAgICAoZm9vJik7CisgIHZvaWQgIG9wZXJhdG9yIDw8ICAgICAoZm9vJik7CisgIHZvaWQgIG9wZXJhdG9yID09ICAgICAoZm9vJik7CisgIHZvaWQgIG9wZXJhdG9yIDwgICAgICAoZm9vJik7CisgIHZvaWQgIG9wZXJhdG9yIDw9ICAgICAoZm9vJik7CisgIHZvaWQgIG9wZXJhdG9yICYgICAgICAoZm9vJik7CisgIHZvaWQgIG9wZXJhdG9yIF4gICAgICAoZm9vJik7CisgIHZvaWQgIG9wZXJhdG9yIHx8ICAgICAoZm9vJik7CisgIHZvaWQgIG9wZXJhdG9yIH4gICAgICAodm9pZCk7CisgIHZvaWQgIG9wZXJhdG9yIC0tICAgICAoaW50KTsKKyAgdm9pZCAgb3BlcmF0b3IgLT4gICAgICh2b2lkKTsKKyAgdm9pZCAgb3BlcmF0b3IgLT0gICAgIChmb28mKTsKKyAgdm9pZCAgb3BlcmF0b3IgLz0gICAgIChmb28mKTsKKyAgdm9pZCAgb3BlcmF0b3IgPDw9ICAgIChmb28mKTsKKyAgdm9pZCAgb3BlcmF0b3IgJj0gICAgIChmb28mKTsKKyAgdm9pZCAgb3BlcmF0b3IgXj0gICAgIChmb28mKTsKKyAgdm9pZCAgb3BlcmF0b3IgLT4qICAgIChmb28mKTsKKyAgdm9pZCAgb3BlcmF0b3IgW10gICAgIChmb28mKTsKKyAgdm9pZCAgb3BlcmF0b3IgKCkgICAgIChmb28mKTsKKyAgdm9pZCogb3BlcmF0b3IgbmV3ICAgIChzaXplX3QpOworICB2b2lkICBvcGVyYXRvciBkZWxldGUgKHZvaWQgKik7CisgIC8qKi8gIG9wZXJhdG9yIGludCAgICAoKTsKKyAgLyoqLyAgb3BlcmF0b3IgY2hhciogICgpOworCisgIGludCBmb29mdW5jIChpbnQpOyAvLyBmb3JjZWQgdG8gaGF2ZSBpbnQgcmV0dXJuIHR5cGUsIHdoaWNoIGlzIHJlcXVpcmVkCisgIGludCBmb29mdW5jIChpbnQsIHNpZ25lZCBjaGFyICopOyAvLyBmb3JjZWQgdG8gaGF2ZSBpbnQgcmV0dXJuIHR5cGUsIHdoaWNoIGlzIHJlcXVpcmVkCisgIGludCBpZm9vOworICBjb25zdCBjaGFyICpjY3Bmb287Cit9OworCisjaWZkZWYgdXNlc3R1YnMKK2V4dGVybiAiQyIgeyAKKyAgIHZvaWQgc2V0X2RlYnVnX3RyYXBzKCk7CisgICB2b2lkIGJyZWFrcG9pbnQoKTsKK307CisjZW5kaWYKKworbWFpbiAoKSB7CisjaWZkZWYgdXNlc3R1YnMKKyAgIHNldF9kZWJ1Z190cmFwcygpOworICAgYnJlYWtwb2ludCgpOworI2VuZGlmCisgICBpbnQgej0zOworfQorCitmb286OmZvbyAgKGludCBpKSAgICAgICAgICAgICAgICAgIHsgaWZvbyA9IGk7fQorZm9vOjpmb28gIChpbnQgaSwgY29uc3QgY2hhciAqY2NwKSB7IGlmb28gPSBpOyBjY3Bmb28gPSBjY3A7IH0KK2Zvbzo6Zm9vICAoZm9vJiBhZm9vKSAgICAgICAgICAgICAgeyBhZm9vLmlmb28gPSAwOyB9Citmb286On5mb28gKCkgICAgICAgICAgICAgICAgICAgICAgIHt9CisKK3ZvaWQgIGZvbzo6b3BlcmF0b3IgKiAgICAgIChmb28mIGFmb28pIHsgYWZvby5pZm9vID0gMDsgfQordm9pZCAgZm9vOjpvcGVyYXRvciAlICAgICAgKGZvbyYgYWZvbykgeyBhZm9vLmlmb28gPSAwOyB9Cit2b2lkICBmb286Om9wZXJhdG9yIC0gICAgICAoZm9vJiBhZm9vKSB7IGFmb28uaWZvbyA9IDA7IH0KK3ZvaWQgIGZvbzo6b3BlcmF0b3IgPj4gICAgIChmb28mIGFmb28pIHsgYWZvby5pZm9vID0gMDsgfQordm9pZCAgZm9vOjpvcGVyYXRvciAhPSAgICAgKGZvbyYgYWZvbykgeyBhZm9vLmlmb28gPSAwOyB9Cit2b2lkICBmb286Om9wZXJhdG9yID4gICAgICAoZm9vJiBhZm9vKSB7IGFmb28uaWZvbyA9IDA7IH0KK3ZvaWQgIGZvbzo6b3BlcmF0b3IgPj0gICAgIChmb28mIGFmb28pIHsgYWZvby5pZm9vID0gMDsgfQordm9pZCAgZm9vOjpvcGVyYXRvciB8ICAgICAgKGZvbyYgYWZvbykgeyBhZm9vLmlmb28gPSAwOyB9Cit2b2lkICBmb286Om9wZXJhdG9yICYmICAgICAoZm9vJiBhZm9vKSB7IGFmb28uaWZvbyA9IDA7IH0KK3ZvaWQgIGZvbzo6b3BlcmF0b3IgISAgICAgICh2b2lkKSB7fQordm9pZCAgZm9vOjpvcGVyYXRvciArKyAgICAgKGludCBpdmFsKSB7IGl2YWwgPSAwOyB9Cit2b2lkICBmb286Om9wZXJhdG9yID0gICAgICAoZm9vJiBhZm9vKSB7IGFmb28uaWZvbyA9IDA7IH0KK3ZvaWQgIGZvbzo6b3BlcmF0b3IgKz0gICAgIChmb28mIGFmb28pIHsgYWZvby5pZm9vID0gMDsgfQordm9pZCAgZm9vOjpvcGVyYXRvciAqPSAgICAgKGZvbyYgYWZvbykgeyBhZm9vLmlmb28gPSAwOyB9Cit2b2lkICBmb286Om9wZXJhdG9yICU9ICAgICAoZm9vJiBhZm9vKSB7IGFmb28uaWZvbyA9IDA7IH0KK3ZvaWQgIGZvbzo6b3BlcmF0b3IgPj49ICAgIChmb28mIGFmb28pIHsgYWZvby5pZm9vID0gMDsgfQordm9pZCAgZm9vOjpvcGVyYXRvciB8PSAgICAgKGZvbyYgYWZvbykgeyBhZm9vLmlmb28gPSAwOyB9Cit2b2lkICBmb286Om9wZXJhdG9yICwgICAgICAoZm9vJiBhZm9vKSB7IGFmb28uaWZvbyA9IDA7IH0KK3ZvaWQgIGZvbzo6b3BlcmF0b3IgLyAgICAgIChmb28mIGFmb28pIHsgYWZvby5pZm9vID0gMDsgfQordm9pZCAgZm9vOjpvcGVyYXRvciArICAgICAgKGZvbyYgYWZvbykgeyBhZm9vLmlmb28gPSAwOyB9Cit2b2lkICBmb286Om9wZXJhdG9yIDw8ICAgICAoZm9vJiBhZm9vKSB7IGFmb28uaWZvbyA9IDA7IH0KK3ZvaWQgIGZvbzo6b3BlcmF0b3IgPT0gICAgIChmb28mIGFmb28pIHsgYWZvby5pZm9vID0gMDsgfQordm9pZCAgZm9vOjpvcGVyYXRvciA8ICAgICAgKGZvbyYgYWZvbykgeyBhZm9vLmlmb28gPSAwOyB9Cit2b2lkICBmb286Om9wZXJhdG9yIDw9ICAgICAoZm9vJiBhZm9vKSB7IGFmb28uaWZvbyA9IDA7IH0KK3ZvaWQgIGZvbzo6b3BlcmF0b3IgJiAgICAgIChmb28mIGFmb28pIHsgYWZvby5pZm9vID0gMDsgfQordm9pZCAgZm9vOjpvcGVyYXRvciBeICAgICAgKGZvbyYgYWZvbykgeyBhZm9vLmlmb28gPSAwOyB9Cit2b2lkICBmb286Om9wZXJhdG9yIHx8ICAgICAoZm9vJiBhZm9vKSB7IGFmb28uaWZvbyA9IDA7IH0KK3ZvaWQgIGZvbzo6b3BlcmF0b3IgfiAgICAgICh2b2lkKSB7fQordm9pZCAgZm9vOjpvcGVyYXRvciAtLSAgICAgKGludCBpdmFsKSB7IGl2YWwgPSAwOyB9Cit2b2lkICBmb286Om9wZXJhdG9yIC0+ICAgICAodm9pZCkge30KK3ZvaWQgIGZvbzo6b3BlcmF0b3IgLT0gICAgIChmb28mIGFmb28pIHsgYWZvby5pZm9vID0gMDsgfQordm9pZCAgZm9vOjpvcGVyYXRvciAvPSAgICAgKGZvbyYgYWZvbykgeyBhZm9vLmlmb28gPSAwOyB9Cit2b2lkICBmb286Om9wZXJhdG9yIDw8PSAgICAoZm9vJiBhZm9vKSB7IGFmb28uaWZvbyA9IDA7IH0KK3ZvaWQgIGZvbzo6b3BlcmF0b3IgJj0gICAgIChmb28mIGFmb28pIHsgYWZvby5pZm9vID0gMDsgfQordm9pZCAgZm9vOjpvcGVyYXRvciBePSAgICAgKGZvbyYgYWZvbykgeyBhZm9vLmlmb28gPSAwOyB9Cit2b2lkICBmb286Om9wZXJhdG9yIC0+KiAgICAoZm9vJiBhZm9vKSB7IGFmb28uaWZvbyA9IDA7IH0KK3ZvaWQgIGZvbzo6b3BlcmF0b3IgW10gICAgIChmb28mIGFmb28pIHsgYWZvby5pZm9vID0gMDsgfQordm9pZCAgZm9vOjpvcGVyYXRvciAoKSAgICAgKGZvbyYgYWZvbykgeyBhZm9vLmlmb28gPSAwOyB9Cit2b2lkKiBmb286Om9wZXJhdG9yIG5ldyAgICAoc2l6ZV90IGl2YWwpIHsgaXZhbCA9IDA7IHJldHVybiAwOyB9Cit2b2lkICBmb286Om9wZXJhdG9yIGRlbGV0ZSAodm9pZCAqcHRyKSB7IHB0ciA9IDA7IH0KKy8qKi8gIGZvbzo6b3BlcmF0b3IgaW50ICAgICgpIHsgcmV0dXJuIDA7IH0KKy8qKi8gIGZvbzo6b3BlcmF0b3IgY2hhciogICgpIHsgcmV0dXJuIDA7IH0KKworLyogU29tZSBmdW5jdGlvbnMgdG8gdGVzdCBvdmVybG9hZGluZyBieSB2YXJ5aW5nIG9uZSBhcmd1bWVudCB0eXBlLiAqLworCit2b2lkIG92ZXJsb2FkMWFyZyAodm9pZCkJCXsgICAgICAgICAgfQordm9pZCBvdmVybG9hZDFhcmcgKGNoYXIgYXJnKQkJeyBhcmcgPSAwOyB9Cit2b2lkIG92ZXJsb2FkMWFyZyAoc2lnbmVkIGNoYXIgYXJnKQl7IGFyZyA9IDA7IH0KK3ZvaWQgb3ZlcmxvYWQxYXJnICh1bnNpZ25lZCBjaGFyIGFyZykJeyBhcmcgPSAwOyB9Cit2b2lkIG92ZXJsb2FkMWFyZyAoc2hvcnQgYXJnKQkJeyBhcmcgPSAwOyB9Cit2b2lkIG92ZXJsb2FkMWFyZyAodW5zaWduZWQgc2hvcnQgYXJnKQl7IGFyZyA9IDA7IH0KK3ZvaWQgb3ZlcmxvYWQxYXJnIChpbnQgYXJnKQkJeyBhcmcgPSAwOyB9Cit2b2lkIG92ZXJsb2FkMWFyZyAodW5zaWduZWQgaW50IGFyZykJeyBhcmcgPSAwOyB9Cit2b2lkIG92ZXJsb2FkMWFyZyAobG9uZyBhcmcpCQl7IGFyZyA9IDA7IH0KK3ZvaWQgb3ZlcmxvYWQxYXJnICh1bnNpZ25lZCBsb25nIGFyZykJeyBhcmcgPSAwOyB9Cit2b2lkIG92ZXJsb2FkMWFyZyAoZmxvYXQgYXJnKQkJeyBhcmcgPSAwOyB9Cit2b2lkIG92ZXJsb2FkMWFyZyAoZG91YmxlIGFyZykJCXsgYXJnID0gMDsgfQorCisvKiBTb21lIGZ1bmN0aW9ucyB0byB0ZXN0IG92ZXJsb2FkaW5nIGJ5IHZhcnlpbmcgYXJndW1lbnQgY291bnQuICovCisKK3ZvaWQgb3ZlcmxvYWRhcmdzIChpbnQgYTEpCQkJCXsgYTEgPSAwOyB9Cit2b2lkIG92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIpCQkJeyBhMSA9IGEyID0gMDsgfQordm9pZCBvdmVybG9hZGFyZ3MgKGludCBhMSwgaW50IGEyLCBpbnQgYTMpCQl7IGExID0gYTIgPSBhMyA9IDA7IH0KK3ZvaWQgb3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMiwgaW50IGEzLCBpbnQgYTQpCisJCQl7IGExID0gYTIgPSBhMyA9IGE0ID0gMDsgfQordm9pZCBvdmVybG9hZGFyZ3MgKGludCBhMSwgaW50IGEyLCBpbnQgYTMsIGludCBhNCwgaW50IGE1KQorCQkJeyBhMSA9IGEyID0gYTMgPSBhNCA9IGE1ID0gMDsgfQordm9pZCBvdmVybG9hZGFyZ3MgKGludCBhMSwgaW50IGEyLCBpbnQgYTMsIGludCBhNCwgaW50IGE1LCBpbnQgYTYpCisJCQl7IGExID0gYTIgPSBhMyA9IGE0ID0gYTUgPSBhNiA9IDA7IH0KK3ZvaWQgb3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMiwgaW50IGEzLCBpbnQgYTQsIGludCBhNSwgaW50IGE2LCBpbnQgYTcpCisJCQl7IGExID0gYTIgPSBhMyA9IGE0ID0gYTUgPSBhNiA9IGE3ID0gMDsgfQordm9pZCBvdmVybG9hZGFyZ3MgKGludCBhMSwgaW50IGEyLCBpbnQgYTMsIGludCBhNCwgaW50IGE1LCBpbnQgYTYsIGludCBhNywKKwkJICAgaW50IGE4KQorCQkJeyBhMSA9IGEyID0gYTMgPSBhNCA9IGE1ID0gYTYgPSBhNyA9IGE4ID0gMDsgfQordm9pZCBvdmVybG9hZGFyZ3MgKGludCBhMSwgaW50IGEyLCBpbnQgYTMsIGludCBhNCwgaW50IGE1LCBpbnQgYTYsIGludCBhNywKKwkJICAgaW50IGE4LCBpbnQgYTkpCisJCQl7IGExID0gYTIgPSBhMyA9IGE0ID0gYTUgPSBhNiA9IGE3ID0gYTggPSBhOSA9IDA7IH0KK3ZvaWQgb3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMiwgaW50IGEzLCBpbnQgYTQsIGludCBhNSwgaW50IGE2LCBpbnQgYTcsCisJCSAgIGludCBhOCwgaW50IGE5LCBpbnQgYTEwKQorCQkJeyBhMSA9IGEyID0gYTMgPSBhNCA9IGE1ID0gYTYgPSBhNyA9IGE4ID0gYTkgPQorCQkJICBhMTAgPSAwOyB9Cit2b2lkIG92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIsIGludCBhMywgaW50IGE0LCBpbnQgYTUsIGludCBhNiwgaW50IGE3LAorCQkgICBpbnQgYTgsIGludCBhOSwgaW50IGExMCwgaW50IGExMSkKKwkJCXsgYTEgPSBhMiA9IGEzID0gYTQgPSBhNSA9IGE2ID0gYTcgPSBhOCA9IGE5ID0KKwkJCSAgYTEwID0gYTExID09IDA7IH0KKworLyogU29tZSBoYWlyeSBmdW5jdGlvbiBkZWZpbml0aW9ucy4KKyAgIFVzZSB0eXBlZGVmcyB0byBoZWxwIG1haW50YWluIHNhbml0eS4gKi8KKwordHlwZWRlZiBpbnQgICAoKlBGUGNfaSkoY2hhciAqKTsKK3R5cGVkZWYgc2hvcnQgKCpQRlBsX3MpKGxvbmcgKik7Cit0eXBlZGVmIHNob3J0ICgqUEZQY19zKShjaGFyICopOwordHlwZWRlZiBpbnQgICAoKlBGbF9pKShsb25nKTsKK3R5cGVkZWYgUEZsX2kgKCpQRlBjX1BGbF9pKShjaGFyICopOwordHlwZWRlZiBQRmxfaSAoKlBGUGlfUEZsX2kpKGludCAqKTsKK3R5cGVkZWYgUEZsX2kgKCpQRlBGUGNfaV9QRmxfaSkoUEZQY19pKTsKK3R5cGVkZWYgUEZsX2kgKCpQRnNfUEZsX2kpKHNob3J0KTsKK3R5cGVkZWYgaW50ICAgKCpQRlBGUGxfc19pKShQRlBsX3MpOwordHlwZWRlZiBpbnQgICAoKlBGUEZQY19zX2kpKFBGUGNfcyk7CisKK1BGc19QRmxfaSBoYWlyeWZ1bmMxIChpbnQgYXJnKQkJCXsgYXJnID0gMDsgcmV0dXJuIDA7IH0KK2ludCAgICAgICBoYWlyeWZ1bmMyIChQRlBjX2kgYXJnKQkJeyBhcmcgPSAwOyByZXR1cm4gMDsgfQoraW50CSAgaGFpcnlmdW5jMyAoUEZQRlBsX3NfaSBhcmcpCQl7IGFyZyA9IDA7IHJldHVybiAwOyB9CitpbnQJICBoYWlyeWZ1bmM0IChQRlBGUGNfc19pIGFyZykJCXsgYXJnID0gMDsgcmV0dXJuIDA7IH0KK2ludAkgIGhhaXJ5ZnVuYzUgKFBGUGNfUEZsX2kgYXJnKQkJeyBhcmcgPSAwOyByZXR1cm4gMDsgfQoraW50CSAgaGFpcnlmdW5jNiAoUEZQaV9QRmxfaSBhcmcpCQl7IGFyZyA9IDA7IHJldHVybiAwOyB9CitpbnQJICBoYWlyeWZ1bmM3IChQRlBGUGNfaV9QRmxfaSBhcmcpCXsgYXJnID0gMDsgcmV0dXJuIDA7IH0KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9jcGx1c2Z1bmNzLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9jcGx1c2Z1bmNzLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzZkMzc5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL2NwbHVzZnVuY3MuZXhwCkBAIC0wLDAgKzEsMzAwIEBACisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAoZm5mQGN5Z251cy5jb20pCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCisjIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFuIGV4ZWN1dGFibGUgdG8gdGVzdC4gIElmIG5vdCwgdGhlbiBlaXRoZXIgd2UKKyMgaGF2ZW4ndCB0cmllZCB0byBjb21waWxlIG9uZSwgb3IgdGhlIGNvbXBpbGF0aW9uIGZhaWxlZCBmb3Igc29tZSByZWFzb24uCisjIEluIGVpdGhlciBjYXNlLCBqdXN0IG5vdGlmeSB0aGUgdXNlciBhbmQgc2tpcCB0aGUgdGVzdHMgaW4gdGhpcyBmaWxlLgorCitzZXQgdGVzdGZpbGUgImNwbHVzZnVuY3MiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQoraWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1ZyBjKyt9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKKyMKKyMgIENhdXNlIGdkYiB0byBsb29rdXAgYSBzcGVjaWZpYyBDKysgZnVuY3Rpb24gYW5kIHByaW50IHRoZSBkZW1hbmdsZWQKKyMgIGZvcm0uCisjCisKK3Byb2MgaW5mb19mdW5jIHsgcmVnZXggZGVtYW5nbGVkIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBzZW5kX2dkYiAiaW5mbyBmdW5jdGlvbiAkcmVnZXhcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIkZpbGUgLio6XHJcbiRkZW1hbmdsZWRcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJpbmZvIGZ1bmN0aW9uIGZvciBcIiRyZWdleFwiIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJpbmZvIGZ1bmN0aW9uIGZvciBcIiRyZWdleFwiIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAiaW5mbyBmdW5jdGlvbiBmb3IgXCIkcmVnZXhcIiAodGltZW91dCkiCisJfQorICAgIH0KK30KKworIworIyAgUnVuIHByaW50ICYnJGFyZycgb24gdGhlIGlucHV0IGFyZyBhbmQgdmVyaWZ5IHRoYXQgd2UgY2FuIGNvcnJlY3RseQorIyAgbG9va3VwIHRoZSBmdWxseSBxdWFsaWZpZWQgQysrIGZ1bmN0aW9uLgorIyAgV2UgaWdub3JlIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gc2luY2Ugd2UgYXJlIG9ubHkgaW50ZXJlc3RlZAorIyAgaW4gdGhlIHJvb3RuYW1lIGFuZCBhcmd1bWVudHMgcGFydC4KKyMKKworcHJvYyBwcmludF9hZGRyX29mIHsgYXJnIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorCisgICAgc2V0IHBhdHRlcm4gW3N0cmluZ190b19yZWdleHAgJGFyZ10KKyAgICBzZW5kX2dkYiAicHJpbnQgJickYXJnJ1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSAuKiAkaGV4IDwkcGF0dGVybj5cclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCAmJyRhcmcnIiB9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHJpbnQgJickYXJnJyIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInByaW50ICYnJGFyZycgKHRpbWVvdXQpIgorCX0KKyAgICB9Cit9CisKKyMKKyMgVGVzdCBuYW1lIGRlbWFuZ2xpbmcgZm9yIG9wZXJhdG9ycy4KKyMKKyMgVGhlICcoJyBhdCB0aGUgZW5kIG9mIGVhY2ggcmVnZXggaW5wdXQgcGF0dGVybiBpcyBzbyB0aGF0IHdlIG1hdGNoIG9ubHkKKyMgdGhlIG9uZSB3ZSBhcmUgbG9va2luZyBmb3IuICBJLkUuICJvcGVyYXRvciYiIHdvdWxkIG1hdGNoIGJvdGgKKyMgIm9wZXJhdG9yJihmb28gJikiIGFuZCAib3BlcmF0b3ImJihmb28gJikiLgorIworCitwcm9jIHRlc3RfbG9va3VwX29wZXJhdG9yX2Z1bmN0aW9ucyB7fSB7CisKKyAgICAjIFRoZXNlIHRlc3RzIGRvbid0IHdvcmsgZm9yIENPRkYgdGFyZ2V0czsgZG9uJ3QgZXZlbiB0cnkgdGhlbQorICAgIGlmIFtpc3RhcmdldCAiYTI5ay0qLXVkaSJdIHRoZW4geworCXNldHVwX3hmYWlsICJhMjlrLSotdWRpIgorCWZhaWwgInNraXBwaW5nIG9wZXJhdG9yIHRlc3RzIgorCXJldHVybgorICAgIH0KKworICAgIGluZm9fZnVuYyAib3BlcmF0b3ImJigiICAidm9pZCBmb286Om9wZXJhdG9yJiZcXChmb28gJlxcKTsiCisgICAgaW5mb19mdW5jICJvcGVyYXRvciY9KCIgICJ2b2lkIGZvbzo6b3BlcmF0b3ImPVxcKGZvbyAmXFwpOyIKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yJigiICAidm9pZCBmb286Om9wZXJhdG9yJlxcKGZvbyAmXFwpOyIKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yLz0oIiAgInZvaWQgZm9vOjpvcGVyYXRvci89XFwoZm9vICZcXCk7IgorICAgIGluZm9fZnVuYyAib3BlcmF0b3JePSgiICAidm9pZCBmb286Om9wZXJhdG9yLj1cXChmb28gJlxcKTsiCisgICAgaW5mb19mdW5jICJvcGVyYXRvcjw8PSgiICAidm9pZCBmb286Om9wZXJhdG9yPDw9XFwoZm9vICZcXCk7IgorICAgIGluZm9fZnVuYyAib3BlcmF0b3IlPSgiICAidm9pZCBmb286Om9wZXJhdG9yJT1cXChmb28gJlxcKTsiCisgICAgaW5mb19mdW5jICJvcGVyYXRvci09KCIgICJ2b2lkIGZvbzo6b3BlcmF0b3ItPVxcKGZvbyAmXFwpOyIKKworICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYW55IHdheSB0byBnZXQgR0RCIHRvIHRyZWF0ICcqJyBhcyBhCisgICAgIyBjaGFyYWN0ZXIgdG8gbWF0Y2gsIHJhdGhlciB0aGFuIGFzIGEgcmVnZXggc3BlY2lhbCBjaGFyYWN0ZXIuCisgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIGluZm9fZnVuYyAib3BlcmF0b3JcKj0oIiAgInZvaWQgZm9vOjpvcGVyYXRvclxcKj1cXChmb28gJlxcKTsiCisKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yfD0oIiAgInZvaWQgZm9vOjpvcGVyYXRvclxcfD1cXChmb28gJlxcKTsiCisgICAgaW5mb19mdW5jICJvcGVyYXRvcis9KCIgICJ2b2lkIGZvbzo6b3BlcmF0b3IuPVxcKGZvbyAmXFwpOyIKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yPj49KCIgICJ2b2lkIGZvbzo6b3BlcmF0b3JcPlw+PVxcKGZvbyAmXFwpOyIKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yPSgiICAidm9pZCBmb286Om9wZXJhdG9yPVxcKGZvbyAmXFwpOyIKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yKCkoIiAgInZvaWQgZm9vOjpvcGVyYXRvclxcKFxcKVxcKGZvbyAmXFwpOyIKKworICAgICMgVGhlIGZ1bmN0aW9uIHNob3VsZCBiZSAib3BlcmF0b3IsIiBub3QgIm9wZXJhdG9yLCAiLiAgKG5vdGUgc3BhY2UpCisgICAgIyBUaGlzIHRlc3Qgd2lsbCB3b3JrOyBJJ3ZlIGNvbW1lbnRlZCBpdCBvdXQgYmVjYXVzZSBpdCBzaG91bGQgbm90CisgICAgIyBjb3VudCBhcyBhIHBhc3MsIHNpbmNlIGl0IGlzIGluY29ycmVjdC4gIElhbiBUYXlsb3IuCisgICAgIyBpbmZvX2Z1bmMgIm9wZXJhdG9yLCAoIiAgInZvaWQgZm9vOjpvcGVyYXRvciwgXFwoZm9vICZcXCk7IgorICAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yLCgiICAidm9pZCBmb286Om9wZXJhdG9yLFxcKGZvbyAmXFwpOyIKKworICAgIGluZm9fZnVuYyAib3BlcmF0b3J+KCIgICJ2b2lkIGZvbzo6b3BlcmF0b3J+XFwodm9pZFxcKTsiCisgICAgaW5mb19mdW5jICJvcGVyYXRvciBkZWxldGUoIiAgInZvaWQgZm9vOjpvcGVyYXRvciBkZWxldGVcXCh2b2lkIFxcKlxcKTsiCisgICAgaW5mb19mdW5jICJvcGVyYXRvci8oIiAgInZvaWQgZm9vOjpvcGVyYXRvci9cXChmb28gJlxcKTsiCisgICAgaW5mb19mdW5jICJvcGVyYXRvcj09KCIgICJ2b2lkIGZvbzo6b3BlcmF0b3I9PVxcKGZvbyAmXFwpOyIKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yXigiICAidm9pZCBmb286Om9wZXJhdG9yXFxeXFwoZm9vICZcXCk7IgorCisgICAgaW5mb19mdW5jICJvcGVyYXRvcj49KCIgICJ2b2lkIGZvbzo6b3BlcmF0b3I+PVxcKGZvbyAmXFwpOyIKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yPigiICAidm9pZCBmb286Om9wZXJhdG9yPlxcKGZvbyAmXFwpOyIKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yPD0oIiAgInZvaWQgZm9vOjpvcGVyYXRvcjw9XFwoZm9vICZcXCk7IgorICAgIGluZm9fZnVuYyAib3BlcmF0b3I8PCgiICAidm9pZCBmb286Om9wZXJhdG9yPDxcXChmb28gJlxcKTsiCisgICAgaW5mb19mdW5jICJvcGVyYXRvcjwoIiAgInZvaWQgZm9vOjpvcGVyYXRvcjxcXChmb28gJlxcKTsiCisgICAgaW5mb19mdW5jICJvcGVyYXRvciUoIiAgInZvaWQgZm9vOjpvcGVyYXRvciVcXChmb28gJlxcKTsiCisgICAgaW5mb19mdW5jICJvcGVyYXRvci0oIiAgInZvaWQgZm9vOjpvcGVyYXRvci1cXChmb28gJlxcKTsiCisKKyAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFueXdheSB0byBnZXQgJyonIHRyZWF0ZWQgYXMgYSBjaGFyYWN0ZXIKKyAgICAjIHRvIG1hdGNoLCByYXRoZXIgdGhhbiBhcyBhIHJlZ2V4IHNwZWNpYWwgY2hhcmFjdGVyLgorICAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yXCooIiAgInZvaWQgZm9vOjpvcGVyYXRvclxcKlxcKGZvbyAmXFwpOyIKKworICAgIGluZm9fZnVuYyAib3BlcmF0b3ItLSgiICAidm9pZCBmb286Om9wZXJhdG9yLS1cXChpbnRcXCk7IgorICAgIGluZm9fZnVuYyAib3BlcmF0b3IhPSgiICAidm9pZCBmb286Om9wZXJhdG9yIT1cXChmb28gJlxcKTsiCisgICAgaW5mb19mdW5jICJvcGVyYXRvciEoIiAgInZvaWQgZm9vOjpvcGVyYXRvciFcXCh2b2lkXFwpOyIKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yIG5ldygiICAidm9pZCBcXCpmb286Om9wZXJhdG9yIG5ld1xcKC4qXFwpOyIKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yfHwoIiAgInZvaWQgZm9vOjpvcGVyYXRvclxcfFxcfFxcKGZvbyAmXFwpOyIKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yIGNoYXIgXFwqKCIgICJjaGFyIFxcKmZvbzo6b3BlcmF0b3IgY2hhciBcXCpcXCh2b2lkXFwpOyIKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yIGludCgiICAiaW50IGZvbzo6b3BlcmF0b3IgaW50XFwodm9pZFxcKTsiCisgICAgaW5mb19mdW5jICJvcGVyYXRvcnwoIiAgInZvaWQgZm9vOjpvcGVyYXRvclxcfFxcKGZvbyAmXFwpOyIKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yKygiICAidm9pZCBmb286Om9wZXJhdG9yXFwrXFwoZm9vICZcXCk7IgorICAgIGluZm9fZnVuYyAib3BlcmF0b3IrKygiICAidm9pZCBmb286Om9wZXJhdG9yXFwrXFwrXFwoaW50XFwpOyIKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yLT4oIiAgInZvaWQgZm9vOjpvcGVyYXRvci0+XFwodm9pZFxcKTsiCisgICAgaW5mb19mdW5jICJvcGVyYXRvci0+XFwqKCIgICJ2b2lkIGZvbzo6b3BlcmF0b3ItPlxcKlxcKGZvbyAmXFwpOyIKKyAgICBpbmZvX2Z1bmMgIm9wZXJhdG9yPj4oIiAgInZvaWQgZm9vOjpvcGVyYXRvclw+XD5cXChmb28gJlxcKTsiCisKKyAgICAjIEdEQiBzYXlzICJgb3BlcmF0b3IgXFtcXSgnIG5vdCBzdXBwb3J0ZWQiLiAgSSBkb24ndCBrbm93IHdoeS4KKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgaW5mb19mdW5jICJvcGVyYXRvclxcXFtcXFxdKCIgInZvaWQgZm9vOjpvcGVyYXRvclxcXFtcXFxdXFwoZm9vICZcXCk7IgorICAgICMgQnV0IHRoaXMgd29ya3MsIGZvciBzb21lIHJlYXNvbi4KKyAgICBpbmZvX2Z1bmMgIi5wZXJhdG9yXFxcW1xcXF0oIiAidm9pZCBmb286Om9wZXJhdG9yXFxcW1xcXF1cXChmb28gJlxcKTsiCit9CisKKworcHJvYyB0ZXN0X3BhZGRyX29wZXJhdG9yX2Z1bmN0aW9ucyB7fSB7CisgICAgZ2xvYmFsIGhleAorCisgICAgcHJpbnRfYWRkcl9vZiAiZm9vOjpvcGVyYXRvciYmKGZvbyAmKSIKKyAgICBwcmludF9hZGRyX29mICJmb286Om9wZXJhdG9yJj0oZm9vICYpIgorICAgIHByaW50X2FkZHJfb2YgImZvbzo6b3BlcmF0b3ImKGZvbyAmKSIKKyAgICBwcmludF9hZGRyX29mICJmb286Om9wZXJhdG9yLz0oZm9vICYpIgorICAgIHByaW50X2FkZHJfb2YgImZvbzo6b3BlcmF0b3JePShmb28gJikiCisgICAgcHJpbnRfYWRkcl9vZiAiZm9vOjpvcGVyYXRvcjw8PShmb28gJikiCisgICAgcHJpbnRfYWRkcl9vZiAiZm9vOjpvcGVyYXRvciU9KGZvbyAmKSIKKyAgICBwcmludF9hZGRyX29mICJmb286Om9wZXJhdG9yLT0oZm9vICYpIgorICAgIHByaW50X2FkZHJfb2YgImZvbzo6b3BlcmF0b3IqPShmb28gJikiCisgICAgcHJpbnRfYWRkcl9vZiAiZm9vOjpvcGVyYXRvcnw9KGZvbyAmKSIKKyAgICBwcmludF9hZGRyX29mICJmb286Om9wZXJhdG9yKz0oZm9vICYpIgorICAgIHByaW50X2FkZHJfb2YgImZvbzo6b3BlcmF0b3I+Pj0oZm9vICYpIgorICAgIHByaW50X2FkZHJfb2YgImZvbzo6b3BlcmF0b3I9KGZvbyAmKSIKKyAgICBwcmludF9hZGRyX29mICJmb286Om9wZXJhdG9yKCkoZm9vICYpIgorICAgIHByaW50X2FkZHJfb2YgImZvbzo6b3BlcmF0b3IsIChmb28gJikiCisgICAgcHJpbnRfYWRkcl9vZiAiZm9vOjpvcGVyYXRvcn4odm9pZCkiCisgICAgcHJpbnRfYWRkcl9vZiAiZm9vOjpvcGVyYXRvciBkZWxldGUodm9pZCAqKSIKKyAgICBwcmludF9hZGRyX29mICJmb286Om9wZXJhdG9yLyhmb28gJikiCisgICAgcHJpbnRfYWRkcl9vZiAiZm9vOjpvcGVyYXRvcj09KGZvbyAmKSIKKyAgICBwcmludF9hZGRyX29mICJmb286Om9wZXJhdG9yXihmb28gJikiCisgICAgcHJpbnRfYWRkcl9vZiAiZm9vOjpvcGVyYXRvcj49KGZvbyAmKSIKKyAgICBwcmludF9hZGRyX29mICJmb286Om9wZXJhdG9yPihmb28gJikiCisgICAgcHJpbnRfYWRkcl9vZiAiZm9vOjpvcGVyYXRvcjw9KGZvbyAmKSIKKyAgICBwcmludF9hZGRyX29mICJmb286Om9wZXJhdG9yPDwoZm9vICYpIgorICAgIHByaW50X2FkZHJfb2YgImZvbzo6b3BlcmF0b3I8KGZvbyAmKSIKKyAgICBwcmludF9hZGRyX29mICJmb286Om9wZXJhdG9yJShmb28gJikiCisgICAgcHJpbnRfYWRkcl9vZiAiZm9vOjpvcGVyYXRvci0oZm9vICYpIgorICAgIHByaW50X2FkZHJfb2YgImZvbzo6b3BlcmF0b3IqKGZvbyAmKSIKKyAgICBwcmludF9hZGRyX29mICJmb286Om9wZXJhdG9yLS0oaW50KSIKKyAgICBwcmludF9hZGRyX29mICJmb286Om9wZXJhdG9yIT0oZm9vICYpIgorICAgIHByaW50X2FkZHJfb2YgImZvbzo6b3BlcmF0b3IhKHZvaWQpIgorICAgIGdkYl90ZXN0ICJwcmludCAmJ2Zvbzo6b3BlcmF0b3IgbmV3JyIgXAorCSIgPSAuKiAkaGV4IDxmb286Om9wZXJhdG9yIG5ld1xcKC4qXFwpPiIKKyAgICBwcmludF9hZGRyX29mICJmb286Om9wZXJhdG9yfHwoZm9vICYpIgorICAgIHByaW50X2FkZHJfb2YgImZvbzo6b3BlcmF0b3IgY2hhciAqKHZvaWQpIgorICAgIHByaW50X2FkZHJfb2YgImZvbzo6b3BlcmF0b3IgaW50KHZvaWQpIgorICAgIHByaW50X2FkZHJfb2YgImZvbzo6b3BlcmF0b3J8KGZvbyAmKSIKKyAgICBwcmludF9hZGRyX29mICJmb286Om9wZXJhdG9yKyhmb28gJikiCisgICAgcHJpbnRfYWRkcl9vZiAiZm9vOjpvcGVyYXRvcisrKGludCkiCisgICAgcHJpbnRfYWRkcl9vZiAiZm9vOjpvcGVyYXRvci0+KHZvaWQpIgorICAgIHByaW50X2FkZHJfb2YgImZvbzo6b3BlcmF0b3ItPiooZm9vICYpIgorICAgIHByaW50X2FkZHJfb2YgImZvbzo6b3BlcmF0b3I+Pihmb28gJikiCisgICAgZ2RiX3Rlc3QgInByaW50ICYnZm9vOjpvcGVyYXRvclxbXF0oZm9vICYpJyIgXAorCSIgPSAuKjB4XFswLTlhLWZcXSsgPGZvbzo6b3BlcmF0b3JcXFxbXFxcXVxcKGZvbyAmXFwpPiIKK30KKworIworIyBUZXN0IG92ZXJsb2FkZWQgZnVuY3Rpb25zICgxIGFyZykuCisjCisKK3Byb2MgdGVzdF9wYWRkcl9vdmVybG9hZGVkX2Z1bmN0aW9ucyB7fSB7CisgICAgcHJpbnRfYWRkcl9vZiAib3ZlcmxvYWQxYXJnKHNpZ25lZCBjaGFyKSIKKyAgICBwcmludF9hZGRyX29mICJvdmVybG9hZDFhcmcodW5zaWduZWQgY2hhcikiCisgICAgcHJpbnRfYWRkcl9vZiAib3ZlcmxvYWQxYXJnKHVuc2lnbmVkIGludCkiCisgICAgcHJpbnRfYWRkcl9vZiAib3ZlcmxvYWQxYXJnKHVuc2lnbmVkIGxvbmcpIgorICAgIHByaW50X2FkZHJfb2YgIm92ZXJsb2FkMWFyZyh1bnNpZ25lZCBzaG9ydCkiCisgICAgcHJpbnRfYWRkcl9vZiAib3ZlcmxvYWQxYXJnKGNoYXIpIgorICAgIHByaW50X2FkZHJfb2YgIm92ZXJsb2FkMWFyZyhkb3VibGUpIgorICAgIHByaW50X2FkZHJfb2YgIm92ZXJsb2FkMWFyZyhmbG9hdCkiCisgICAgcHJpbnRfYWRkcl9vZiAib3ZlcmxvYWQxYXJnKGludCkiCisgICAgcHJpbnRfYWRkcl9vZiAib3ZlcmxvYWQxYXJnKGxvbmcpIgorICAgIHByaW50X2FkZHJfb2YgIm92ZXJsb2FkMWFyZyhzaG9ydCkiCisgICAgcHJpbnRfYWRkcl9vZiAib3ZlcmxvYWQxYXJnKHZvaWQpIgorICAgIHByaW50X2FkZHJfb2YgIm92ZXJsb2FkYXJncyhpbnQpIgorICAgIHByaW50X2FkZHJfb2YgIm92ZXJsb2FkYXJncyhpbnQsIGludCkiCisgICAgcHJpbnRfYWRkcl9vZiAib3ZlcmxvYWRhcmdzKGludCwgaW50LCBpbnQpIgorICAgIHByaW50X2FkZHJfb2YgIm92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQpIgorICAgIHByaW50X2FkZHJfb2YgIm92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCkiCisgICAgcHJpbnRfYWRkcl9vZiAib3ZlcmxvYWRhcmdzKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpIgorICAgIHByaW50X2FkZHJfb2YgIm92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpIgorICAgIHByaW50X2FkZHJfb2YgIm92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCkiCisgICAgcHJpbnRfYWRkcl9vZiAib3ZlcmxvYWRhcmdzKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpIgorICAgIHByaW50X2FkZHJfb2YgIm92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpIgorICAgIHByaW50X2FkZHJfb2YgIm92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCkiCit9CisKK3Byb2MgdGVzdF9wYWRkcl9oYWlyeV9mdW5jdGlvbnMge30geworICAgIHByaW50X2FkZHJfb2YgImhhaXJ5ZnVuYzEoaW50KSIKKyAgICBwcmludF9hZGRyX29mICJoYWlyeWZ1bmMyKGludCAoKikoY2hhciAqKSkiCisgICAgcHJpbnRfYWRkcl9vZiAiaGFpcnlmdW5jMyhpbnQgKCopKHNob3J0ICgqKShsb25nICopKSkiCisgICAgcHJpbnRfYWRkcl9vZiAiaGFpcnlmdW5jNChpbnQgKCopKHNob3J0ICgqKShjaGFyICopKSkiCisgICAgcHJpbnRfYWRkcl9vZiAiaGFpcnlmdW5jNShpbnQgKCooKikoY2hhciAqKSkobG9uZykpIgorICAgIHByaW50X2FkZHJfb2YgImhhaXJ5ZnVuYzYoaW50ICgqKCopKGludCAqKSkobG9uZykpIgorICAgIHByaW50X2FkZHJfb2YgImhhaXJ5ZnVuYzcoaW50ICgqKCopKGludCAoKikoY2hhciAqKSkpKGxvbmcpKSIKK30KKworcHJvYyBkb190ZXN0cyB7fSB7CisgICAgZ2xvYmFsIHBybXNfaWQKKyAgICBnbG9iYWwgYnVnX2lkCisgICAgZ2xvYmFsIHN1YmRpcgorICAgIGdsb2JhbCBvYmpkaXIKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgZ2xvYmFsIGJpbmZpbGUKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgc2V0IHBybXNfaWQgMAorICAgIHNldCBidWdfaWQgMAorCisgICAgIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKyAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKyAgICBnZGJfbG9hZCAkYmluZmlsZQorCisgICAgc2VuZF9nZGIgInNldCBsYW5ndWFnZSBjKytcbiIKKyAgICBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKKyAgICBzZW5kX2dkYiAic2V0IHdpZHRoIDBcbiIKKyAgICBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKKworICAgICMgR2V0IHRoZSBkZWJ1ZyBmb3JtYXQgZm9yIHRoZSBjb21waWxlZCB0ZXN0IGNhc2UuICBJZiB0aGF0CisgICAgIyBmb3JtYXQgaXMgRFdBUkYgMSB0aGVuIGp1c3Qgc2tpcCBhbGwgdGhlIHRlc3RzIHNpbmNlIG5vbmUgb2YKKyAgICAjIHRoZW0gd2lsbCBwYXNzLgorCisgICAgaWYgWyBydW50b19tYWluXSB0aGVuIHsKKwlnZXRfZGVidWdfZm9ybWF0CisJaWYgWyBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiIF0gdGhlbiB7CisJICAgIGZhaWwgIkMrKyB0ZXN0cyBza2lwcGVkIGR1ZSB0byBsaW1pdGVkIEMrKyBzdXBwb3J0IGluIERXQVJGIDEgZGVidWcgZm9ybWF0IgorCSAgICByZXR1cm4KKwl9CisJY2xlYXJfeGZhaWwgIiotKi0qIgorICAgIH0KKworICAgIHRlc3RfcGFkZHJfb3ZlcmxvYWRlZF9mdW5jdGlvbnMKKyAgICB0ZXN0X3BhZGRyX29wZXJhdG9yX2Z1bmN0aW9ucworICAgIHRlc3RfcGFkZHJfaGFpcnlfZnVuY3Rpb25zCisgICAgdGVzdF9sb29rdXBfb3BlcmF0b3JfZnVuY3Rpb25zCit9CisKK2RvX3Rlc3RzCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jKysvZGVtYW5nbGUuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL2RlbWFuZ2xlLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDFkMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL2RlbWFuZ2xlLmV4cApAQCAtMCwwICsxLDE1MTcgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBGcmVkIEZpc2guIChmbmZAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKKyMKKyMgIFRlc3QgZ251IHN0eWxlIG5hbWUgZGVtYW5nbGluZworIworCitwcm9jIHRlc3RfZ251X3N0eWxlX2RlbWFuZ2xpbmcge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICAjIFNldCB0aGUgZGVtYW5nbGluZyBzdHlsZSB0byAiZ251IiBhbmQgdGhlbiBjaGVjayB0byBtYWtlIHN1cmUKKyAgICAjIGl0IHJlYWxseSBnb3Qgc2V0LiAgUmV0dXJuIGlmIHRoZSBzdHlsZSBmYWlsZWQgdG8gZ2V0IHNldCBmb3IKKyAgICAjIHNvbWUgcmVhc29uLgorCisgICAgc2VuZF9nZGIgInNldCBkZW1hbmdsZS1zdHlsZSBnbnVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInNldCBkZW1hbmdsZS1zdHlsZSBnbnVcW1xyXG5cXSskZ2RiX3Byb21wdCAkIiB7fQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInNldCBkZW1hbmdsZS1zdHlsZSBnbnUgZmFpbGVkIiA7IHJldHVybiB9CisJdGltZW91dCB7IGZhaWwgInNldCBkZW1hbmdsZS1zdHlsZSBnbnUgZmFpbGVkICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJzaG93IGRlbWFuZ2xlLXN0eWxlXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJUaGUgY3VycmVudCBDXFsrXF0rIGRlbWFuZ2xpbmcgc3R5bGUgaXMgXCJnbnVcIi5cclxuJGdkYl9wcm9tcHQgJCIge30KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJkZW1hbmdsaW5nIHN0eWxlIG5vdCBzZXQgdG8gZ251IiB9CisJdGltZW91dCB7IGZhaWwgInNob3cgZGVtYW5nbGUtc3R5bGUgdGltZWQgb3V0IiB9CisgICAgfQorCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBBYm9ydF9fRlA2RWRpdG9yaVBDYyIgXAorCSJBYm9ydFxbKFxdK0VkaXRvciBcWypcXSssIGludCwgKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFsqXF0rXFspXF0rIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBBZGRBbGlnbm1lbnRfXzlpdlRTb2x2ZXJVaVAxMml2SW50ZXJhY3RvclA3aXZUR2x1ZSIgIml2VFNvbHZlcjo6QWRkQWxpZ25tZW50KHVuc2lnbmVkIGludCwgaXZJbnRlcmFjdG9yICosIGl2VEdsdWUgKikiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBBcHBlbmRfXzE1TmFtZUNob29zZXJWaWV3UENjIiBcCisJIk5hbWVDaG9vc2VyVmlldzo6QXBwZW5kXFsoXF0rKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFsqXF0rXFspXF0rIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBBcnJvd2hlYWRJbnRlcnNlY3RzX185QXJyb3dMaW5lUDlBcnJvd2hlYWRSNkJveE9ialA3R3JhcGhpYyIgIkFycm93TGluZTo6QXJyb3doZWFkSW50ZXJzZWN0cyhBcnJvd2hlYWQgKiwgQm94T2JqICYsIEdyYXBoaWMgKikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIEF0RW5kX18xM2l2UnViYmVyR3JvdXAiICJpdlJ1YmJlckdyb3VwOjpBdEVuZCh2b2lkKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgQmdGaWx0ZXJfXzlpdlRTb2x2ZXJQMTJpdkludGVyYWN0b3IiICJpdlRTb2x2ZXI6OkJnRmlsdGVyKGl2SW50ZXJhY3RvciAqKSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIEJpdFBhdHRlcm50b2FfX0ZSQzEwQml0UGF0dGVybmNjYyIgXAorCSJCaXRQYXR0ZXJudG9hXFsoXF0rKGNvbnN0IEJpdFBhdHRlcm58Qml0UGF0dGVybiBjb25zdCkgJiwgY2hhciwgY2hhciwgY2hhclxbKVxdKyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgQ2hlY2tfXzZVQXJyYXlpIiAiVUFycmF5OjpDaGVjayhpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBDb3JlQ29uc3REZWNsc19fOFRleHRDb2RlUjdvc3RyZWFtIiAiVGV4dENvZGU6OkNvcmVDb25zdERlY2xzKG9zdHJlYW0gJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIERldGFjaF9fOFN0YXRlVmFyUDEyU3RhdGVWYXJWaWV3IiAiU3RhdGVWYXI6OkRldGFjaChTdGF0ZVZhclZpZXcgKikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIERvbmVfXzlDb21wb25lbnRHOEl0ZXJhdG9yIiAiQ29tcG9uZW50OjpEb25lKEl0ZXJhdG9yKSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIERyYXdEZXN0aW5hdGlvblRyYW5zZm9ybWVkSW1hZ2VfX0ZQN19YSW1hZ2VpaVQwaWlVbFVpaWlVaVVsVWxQNF9YR0NSQzEzaXZUcmFuc2Zvcm1lcmlpaWkiIFwKKwkiRHJhd0Rlc3RpbmF0aW9uVHJhbnNmb3JtZWRJbWFnZVxbKFxdK19YSW1hZ2UgXFsqXF0rLCBpbnQsIGludCwgX1hJbWFnZSBcWypcXSssIGludCwgaW50LCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBpbnQsIGludCwgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIF9YR0MgXFsqXF0rLCAoY29uc3QgaXZUcmFuc2Zvcm1lcnxpdlRyYW5zZm9ybWVyIGNvbnN0KSAmLCBpbnQsIGludCwgaW50LCBpbnRcWylcXSsiCisKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIEVkaXRfXzEyU3RyaW5nRWRpdG9yUENjaWkiIFwKKwkiU3RyaW5nRWRpdG9yOjpFZGl0XFsoXF0rKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFsqXF0rLCBpbnQsIGludFxbKVxdKyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgRWZmZWN0X18xMVJlbGF0ZU1hbmlwUjdpdkV2ZW50IiAiUmVsYXRlTWFuaXA6OkVmZmVjdChpdkV2ZW50ICYpIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gRmlsdGVyTmFtZV9fRlBDYyIgXAorCSJGaWx0ZXJOYW1lXFsoXF0rKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFsqXF0rXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gRmlsdGVyX182UFNUZXh0UENjaSIgXAorCSJQU1RleHQ6OkZpbHRlclxbKFxdKyhjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdKywgaW50XFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gRmluZENvbG9yX183Q2F0YWxvZ1BDY2lpaSIgXAorCSJDYXRhbG9nOjpGaW5kQ29sb3JcWyhcXSsoY29uc3QgY2hhcnxjaGFyIGNvbnN0KSBcWypcXSssIGludCwgaW50LCBpbnRcWylcXSsiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIEZpbmRGaXhlZF9fRlJQNENOZXRQNENOZXQiICJGaW5kRml4ZWQoQ05ldCAqJiwgQ05ldCAqKSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIEZpbmRGb250X183Q2F0YWxvZ1BDY04yMSIgXAorCSJDYXRhbG9nOjpGaW5kRm9udFxbKFxdKyhjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdKywgKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFsqXF0rLCAoY29uc3QgY2hhcnxjaGFyIGNvbnN0KSBcWypcXStcWylcXSsiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIEZpeDQ4X2Fib3J0X19GUjh0d29sb25ncyIgIkZpeDQ4X2Fib3J0KHR3b2xvbmdzICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBHZXRCYXJJbmZvX18xNWl2Ml82X1ZTY3JvbGxlclAxM2l2UGVyc3BlY3RpdmVSaVQyIiAiaXYyXzZfVlNjcm9sbGVyOjpHZXRCYXJJbmZvKGl2UGVyc3BlY3RpdmUgKiwgaW50ICYsIGludCAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgR2V0QmdDb2xvcl9fQzlpdlBhaW50ZXIiICJpdlBhaW50ZXI6OkdldEJnQ29sb3Iodm9pZCkgY29uc3QiCisKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIElpc2RvdWJsZV9fRlBDNkludFJlcCIgXAorCSJJaXNkb3VibGVcWyhcXSsoY29uc3QgSW50UmVwfEludFJlcCBjb25zdCkgXFsqXF0rXFspXF0rIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBJbnNlcnRCb2R5X18xNUhfUHVsbHJpZ2h0TWVudWlpIiAiSF9QdWxscmlnaHRNZW51OjpJbnNlcnRCb2R5KGludCwgaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgSW5zZXJ0Q2hhcmFjdGVyX185VGV4dE1hbmlwYyIgIlRleHRNYW5pcDo6SW5zZXJ0Q2hhcmFjdGVyKGNoYXIpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIEluc2VydFRvcGxldmVsX183aXZXb3JsZFAxMml2SW50ZXJhY3RvclQxIiAiaXZXb3JsZDo6SW5zZXJ0VG9wbGV2ZWwoaXZJbnRlcmFjdG9yICosIGl2SW50ZXJhY3RvciAqKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgSW5zZXJ0VG9wbGV2ZWxfXzdpdldvcmxkUDEyaXZJbnRlcmFjdG9yVDFpaVVpIiAiaXZXb3JsZDo6SW5zZXJ0VG9wbGV2ZWwoaXZJbnRlcmFjdG9yICosIGl2SW50ZXJhY3RvciAqLCBpbnQsIGludCwgdW5zaWduZWQgaW50KSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIElzQURpcmVjdG9yeV9fRlBDY1I0c3RhdCIgXAorCSJJc0FEaXJlY3RvcnlcWyhcXSsoY29uc3QgY2hhcnxjaGFyIGNvbnN0KSBcWypcXSssIHN0YXQgJlxbKVxdKyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgSXNBR3JvdXBfX0ZQMTFHcmFwaGljVmlld1AxMUdyYXBoaWNDb21wIiAiSXNBR3JvdXAoR3JhcGhpY1ZpZXcgKiwgR3JhcGhpY0NvbXAgKikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIElzQV9fMTBCdXR0b25Db2RlVWwiICJCdXR0b25Db2RlOjpJc0EodW5zaWduZWQgbG9uZykiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgUmVhZE5hbWVfX0ZSN2lzdHJlYW1QYyIgIlJlYWROYW1lKGlzdHJlYW0gJiwgY2hhciAqKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgUmVkcmF3X18xM1N0cmluZ0Jyb3dzZXJpaWlpIiAiU3RyaW5nQnJvd3Nlcjo6UmVkcmF3KGludCwgaW50LCBpbnQsIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIFJvdGF0ZV9fMTNpdlRyYW5zZm9ybWVyZiIgIml2VHJhbnNmb3JtZXI6OlJvdGF0ZShmbG9hdCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIFJvdGF0ZWRfX0MxM2l2VHJhbnNmb3JtZXJmIiAiaXZUcmFuc2Zvcm1lcjo6Um90YXRlZChmbG9hdCkgY29uc3QiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIFJvdW5kX19GZiIgIlJvdW5kKGZsb2F0KSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBTZXRFeHBvcnRfXzE2TWVtYmVyU2hhcmVkTmFtZVVpIiAiTWVtYmVyU2hhcmVkTmFtZTo6U2V0RXhwb3J0KHVuc2lnbmVkIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIFNldF9fMTRpdkNvbnRyb2xTdGF0ZTEzQ29udHJvbFN0YXR1c1VpIiAiaXZDb250cm9sU3RhdGU6OlNldChDb250cm9sU3RhdHVzLCB1bnNpZ25lZCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBTZXRfXzVERmFjZVBjaWkiICJERmFjZTo6U2V0KGNoYXIgKiwgaW50LCBpbnQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIFZDb252ZXJ0X185aXZUU29sdmVyUDEyaXZJbnRlcmFjdG9yUlA4VEVsZW1lbnRUMiIgIml2VFNvbHZlcjo6VkNvbnZlcnQoaXZJbnRlcmFjdG9yICosIFRFbGVtZW50IComLCBURWxlbWVudCAqJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIFZDb252ZXJ0X185aXZUU29sdmVyUDdpdlRHbHVlUlA4VEVsZW1lbnQiICJpdlRTb2x2ZXI6OlZDb252ZXJ0KGl2VEdsdWUgKiwgVEVsZW1lbnQgKiYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBWT3JkZXJfXzlpdlRTb2x2ZXJVaVJQMTJpdkludGVyYWN0b3JUMiIgIml2VFNvbHZlcjo6Vk9yZGVyKHVuc2lnbmVkIGludCwgaXZJbnRlcmFjdG9yIComLCBpdkludGVyYWN0b3IgKiYpIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gVmFsaWRfXzdDYXRhbG9nUENjUlA0VG9vbCIgXAorCSJDYXRhbG9nOjpWYWxpZFxbKFxdKyhjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdKywgVG9vbCBcWypcXSsmXFspXF0rIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfMTBQYWdlQnV0dG9uXCRfX2JvdGgiICJQYWdlQnV0dG9uOjpfX2JvdGgiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF8zUk5HXCRzaW5nbGVNYW50aXNzYSIgIlJORzo6c2luZ2xlTWFudGlzc2EiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF81SUNvbXBcJF9yZWxlYXNlIiAiSUNvbXA6Ol9yZWxlYXNlIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfXCRfMTBCaXRtYXBDb21wIiAiQml0bWFwQ29tcDo6fkJpdG1hcENvbXAodm9pZCkiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX1wkXzlfX2lvX2RlZnMiICJfX2lvX2RlZnM6On5fX2lvX2RlZnModm9pZCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9cJF9RMjNmb28zYmFyIiAiZm9vOjpiYXI6On5iYXIodm9pZCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9cJF9RMzNmb28zYmFyNGJlbGwiICJmb286OmJhcjo6YmVsbDo6fmJlbGwodm9pZCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fMTBpdlRlbGx0YWxlaVA3aXZHbHlwaCIgIml2VGVsbHRhbGU6Oml2VGVsbHRhbGUoaW50LCBpdkdseXBoICopIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfXzEwaXZWaWV3cG9ydGlQMTJpdkludGVyYWN0b3JVaSIgIml2Vmlld3BvcnQ6Oml2Vmlld3BvcnQoaW50LCBpdkludGVyYWN0b3IgKiwgdW5zaWduZWQgaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX18xMG9zdHJzdHJlYW0iICJvc3Ryc3RyZWFtOjpvc3Ryc3RyZWFtKHZvaWQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfXzEwb3N0cnN0cmVhbVBjaWkiICJvc3Ryc3RyZWFtOjpvc3Ryc3RyZWFtKGNoYXIgKiwgaW50LCBpbnQpIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX18xMUJhc2ljRGlhbG9naVBDY1AxM2l2QnV0dG9uU3RhdGVOMjJVaSIgXAorCSJCYXNpY0RpYWxvZzo6QmFzaWNEaWFsb2dcWyhcXStpbnQsIChjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdKywgaXZCdXR0b25TdGF0ZSBcWypcXSssIChjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdKywgKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFsqXF0rLCB1bnNpZ25lZCBpbnRcWylcXSsiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fMTFCaXRtYXBUYWJsZWkiICJCaXRtYXBUYWJsZTo6Qml0bWFwVGFibGUoaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX18xMlZpZXdwb3J0Q29kZVAxMlZpZXdwb3J0Q29tcCIgIlZpZXdwb3J0Q29kZTo6Vmlld3BvcnRDb2RlKFZpZXdwb3J0Q29tcCAqKSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fMTJpdjJfNl9Cb3JkZXJpUENjaSIgXAorCSJpdjJfNl9Cb3JkZXI6Oml2Ml82X0JvcmRlclxbKFxdK2ludCwgKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFsqXF0rLCBpbnRcWylcXSsiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fMTJpdjJfNl9Cb3JkZXJpaSIgIml2Ml82X0JvcmRlcjo6aXYyXzZfQm9yZGVyKGludCwgaW50KSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fMTJpdkJhY2tncm91bmRpUDdpdkdseXBoUEM3aXZDb2xvciIgXAorCSJpdkJhY2tncm91bmQ6Oml2QmFja2dyb3VuZFxbKFxdK2ludCwgaXZHbHlwaCBcWypcXSssIChjb25zdCBpdkNvbG9yfGl2Q29sb3IgY29uc3QpIFxbKlxdK1xbKVxdKyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX18xMml2QnJlYWtfTGlzdGwiICJpdkJyZWFrX0xpc3Q6Oml2QnJlYWtfTGlzdChsb25nKSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fMTRUZXh0SW50ZXJhY3RvcmlQQ2NVaSIgXAorCSJUZXh0SW50ZXJhY3Rvcjo6VGV4dEludGVyYWN0b3JcWyhcXStpbnQsIChjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdKywgdW5zaWduZWQgaW50XFspXF0rIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfXzE0aXYyXzZfTWVudUl0ZW1pUDEyaXZJbnRlcmFjdG9yIiAiaXYyXzZfTWVudUl0ZW06Oml2Ml82X01lbnVJdGVtKGludCwgaXZJbnRlcmFjdG9yICopIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX18xNGl2Ml82X01lbnVJdGVtaVBDY1AxMml2SW50ZXJhY3RvciIgXAorCSJpdjJfNl9NZW51SXRlbTo6aXYyXzZfTWVudUl0ZW1cWyhcXStpbnQsIChjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdKywgaXZJbnRlcmFjdG9yIFxbKlxdK1xbKVxdKyIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfXzIwRGlzcGxheUxpc3RfSXRlcmF0b3JSMTFEaXNwbGF5TGlzdCIgIkRpc3BsYXlMaXN0X0l0ZXJhdG9yOjpEaXNwbGF5TGlzdF9JdGVyYXRvcihEaXNwbGF5TGlzdCAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX18zZm9vUlQwIiAiZm9vOjpmb28oZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfXzNmb29pTjMxIiAiZm9vOjpmb28oaW50LCBpbnQsIGludCwgaW50KSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fM2Zvb2lQQ2MiIFwKKwkiZm9vOjpmb29cWyhcXStpbnQsIChjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdK1xbKVxdKyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX18zZm9vaVJUMGlUMmlUMiIgImZvbzo6Zm9vKGludCwgZm9vICYsIGludCwgZm9vICYsIGludCwgZm9vICYpIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX182R2V0T3B0aVBQY1BDYyIgXAorCSJHZXRPcHQ6OkdldE9wdFxbKFxdK2ludCwgY2hhciBcWypcXStcWypcXSssIChjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdK1xbKVxdKyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX182S2V5TWFwUFQwIiAiS2V5TWFwOjpLZXlNYXAoS2V5TWFwICopIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX183aXZXb3JsZFBDY1JpUFBjUEMxMml2T3B0aW9uRGVzY1BDMTRpdlByb3BlcnR5RGF0YSIgXAorCSJpdldvcmxkOjppdldvcmxkXFsoXF0rKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFsqXF0rLCBpbnQgJiwgY2hhciBcWypcXStcWypcXSssIChjb25zdCBpdk9wdGlvbkRlc2N8aXZPcHRpb25EZXNjIGNvbnN0KSBcWypcXSssIChjb25zdCBpdlByb3BlcnR5RGF0YXxpdlByb3BlcnR5RGF0YSBjb25zdCkgXFsqXF0rXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX183cHJvY2J1ZlBDY2kiIFwKKwkicHJvY2J1Zjo6cHJvY2J1ZlxbKFxdKyhjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdKywgaW50XFspXF0rIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfXzhBcnJvd0NtZFA2RWRpdG9yVWlVaSIgIkFycm93Q21kOjpBcnJvd0NtZChFZGl0b3IgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fOUZfRWxsaXBzZWlpaWlQN0dyYXBoaWMiICJGX0VsbGlwc2U6OkZfRWxsaXBzZShpbnQsIGludCwgaW50LCBpbnQsIEdyYXBoaWMgKikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fOUZyYW1lRGF0YVA5RnJhbWVDb21waSIgIkZyYW1lRGF0YTo6RnJhbWVEYXRhKEZyYW1lQ29tcCAqLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfXzlIVkdyYXBoaWNQOUNhbnZhc1ZhclA3R3JhcGhpYyIgIkhWR3JhcGhpYzo6SFZHcmFwaGljKENhbnZhc1ZhciAqLCBHcmFwaGljICopIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX1EyM2ZvbzNiYXIiICJmb286OmJhcjo6YmFyKHZvaWQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX1EzM2ZvbzNiYXI0YmVsbCIgImZvbzo6YmFyOjpiZWxsOjpiZWxsKHZvaWQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FhX18zZm9vUlQwIiAiZm9vOjpvcGVyYXRvciYmKGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19hYWRfXzNmb29SVDAiICJmb286Om9wZXJhdG9yJj0oZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FkX18zZm9vUlQwIiAiZm9vOjpvcGVyYXRvciYoZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2Fkdl9fM2Zvb1JUMCIgImZvbzo6b3BlcmF0b3IvPShmb28gJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fYWVyX18zZm9vUlQwIiAiZm9vOjpvcGVyYXRvcl49KGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19hbHNfXzNmb29SVDAiICJmb286Om9wZXJhdG9yPDw9KGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19hbWRfXzNmb29SVDAiICJmb286Om9wZXJhdG9yJT0oZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FtaV9fM2Zvb1JUMCIgImZvbzo6b3BlcmF0b3ItPShmb28gJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fYW1sX18zRml4UlQwIiAiRml4OjpvcGVyYXRvcio9KEZpeCAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19hbWxfXzVGaXgxNmkiICJGaXgxNjo6b3BlcmF0b3IqPShpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FtbF9fNUZpeDMyUlQwIiAiRml4MzI6Om9wZXJhdG9yKj0oRml4MzIgJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fYW9yX18zZm9vUlQwIiAiZm9vOjpvcGVyYXRvcnw9KGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19hcGxfXzNmb29SVDAiICJmb286Om9wZXJhdG9yKz0oZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2Fyc19fM2Zvb1JUMCIgImZvbzo6b3BlcmF0b3I+Pj0oZm9vICYpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fYXNfXzNmb29SVDAiICJmb286Om9wZXJhdG9yPShmb28gJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY2xfXzNmb29SVDAiICJmb286Om9wZXJhdG9yKCkoZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2NsX182Tm9ybWFsIiAiTm9ybWFsOjpvcGVyYXRvcigpKHZvaWQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2NsX182U3RyaW5naWkiICJTdHJpbmc6Om9wZXJhdG9yKCkoaW50LCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2NtX18zZm9vUlQwIiAiZm9vOjpvcGVyYXRvciwgKGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jb19fM2ZvbyIgImZvbzo6b3BlcmF0b3J+KHZvaWQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2RsX18zZm9vUHYiICJmb286Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2R2X18zZm9vUlQwIiAiZm9vOjpvcGVyYXRvci8oZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2VxX18zZm9vUlQwIiAiZm9vOjpvcGVyYXRvcj09KGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19lcl9fM2Zvb1JUMCIgImZvbzo6b3BlcmF0b3JeKGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19nZV9fM2Zvb1JUMCIgImZvbzo6b3BlcmF0b3I+PShmb28gJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fZ3RfXzNmb29SVDAiICJmb286Om9wZXJhdG9yPihmb28gJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fbGVfXzNmb29SVDAiICJmb286Om9wZXJhdG9yPD0oZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2xzX18zZm9vUlQwIiAiZm9vOjpvcGVyYXRvcjw8KGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19sc19fRlI3b3N0cmVhbVBGUjNpb3NfUjNpb3MiICJvcGVyYXRvcjw8KG9zdHJlYW0gJiwgaW9zICYoKikoaW9zICYpKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19sc19fRlI3b3N0cmVhbVIzRml4IiAib3BlcmF0b3I8PChvc3RyZWFtICYsIEZpeCAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19sdF9fM2Zvb1JUMCIgImZvbzo6b3BlcmF0b3I8KGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19tZF9fM2Zvb1JUMCIgImZvbzo6b3BlcmF0b3IlKGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19taV9fM2Zvb1JUMCIgImZvbzo6b3BlcmF0b3ItKGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19tbF9fM2Zvb1JUMCIgImZvbzo6b3BlcmF0b3IqKGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19tbV9fM2Zvb2kiICJmb286Om9wZXJhdG9yLS0oaW50KSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX25lX18zZm9vUlQwIiAiZm9vOjpvcGVyYXRvciE9KGZvbyAmKSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fbmVfX0ZSQzdDb21wbGV4VDAiIFwKKwkib3BlcmF0b3IhPVxbKFxdKyhjb25zdCBDb21wbGV4fENvbXBsZXggY29uc3QpICYsIChjb25zdCBDb21wbGV4fENvbXBsZXggY29uc3QpICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX25lX19GUkM3Q29tcGxleGQiIFwKKwkib3BlcmF0b3IhPVxbKFxdKyhjb25zdCBDb21wbGV4fENvbXBsZXggY29uc3QpICYsIGRvdWJsZVxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fbmVfX0ZSQzlTdWJTdHJpbmdSQzZTdHJpbmciIFwKKwkib3BlcmF0b3IhPVxbKFxdKyhjb25zdCBTdWJTdHJpbmd8U3ViU3RyaW5nIGNvbnN0KSAmLCAoY29uc3QgU3RyaW5nfFN0cmluZyBjb25zdCkgJlxbKVxdKyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19udF9fM2ZvbyIgImZvbzo6b3BlcmF0b3IhKHZvaWQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX253X18zZm9vaSIgImZvbzo6b3BlcmF0b3IgbmV3KGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fb29fXzNmb29SVDAiICJmb286Om9wZXJhdG9yfHwoZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX29wUGNfXzNmb28iICJmb286Om9wZXJhdG9yIGNoYXIgKih2b2lkKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19vcGlfXzNmb28iICJmb286Om9wZXJhdG9yIGludCh2b2lkKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19vcl9fM2Zvb1JUMCIgImZvbzo6b3BlcmF0b3J8KGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19wbF9fM2Zvb1JUMCIgImZvbzo6b3BlcmF0b3IrKGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19wcF9fM2Zvb2kiICJmb286Om9wZXJhdG9yKysoaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19yZl9fM2ZvbyIgImZvbzo6b3BlcmF0b3ItPih2b2lkKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19ybV9fM2Zvb1JUMCIgImZvbzo6b3BlcmF0b3ItPiooZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3JzX18zZm9vUlQwIiAiZm9vOjpvcGVyYXRvcj4+KGZvbyAmKSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fdmNfXzNmb29SVDAiICJmb286Om9wZXJhdG9yXFxcW1xcXF1cXChmb28gJlxcKSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9nc3ViX182U3RyaW5nUkM1UmVnZXhQQ2NpIiBcCisJIlN0cmluZzo6X2dzdWJcWyhcXSsoY29uc3QgUmVnZXh8UmVnZXggY29uc3QpICYsIChjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdKywgaW50XFspXF0rIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfbmV3X0ZpeF9fRlVzIiAiX25ld19GaXgodW5zaWduZWQgc2hvcnQpIgorCisgICAgIyBnY2MgMi40LjUgKGFuZCBlYXJsaWVyKSBzdHlsZSB2aXJ0dWFsIHRhYmxlcy4gIFdlIHdhbnQgdG8gY29udGludWUgdG8KKyAgICAjIGNvcnJlY3RseSBkZW1hbmdsZSB0aGVzZSBldmVuIGlmIG5ld2VyIGNvbXBpbGVycyB1c2UgYSBkaWZmZXJlbnQgZm9ybS4KKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX3Z0LmZvbyIgImZvbyB2aXJ0dWFsIHRhYmxlIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfdnQuZm9vLmJhciIgImZvbzo6YmFyIHZpcnR1YWwgdGFibGUiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF92dFwkZm9vIiAiZm9vIHZpcnR1YWwgdGFibGUiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF92dFwkZm9vXCRiYXIiICJmb286OmJhciB2aXJ0dWFsIHRhYmxlIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGFwcGVuZF9fN2l2R2x5cGhQVDAiICJpdkdseXBoOjphcHBlbmQoaXZHbHlwaCAqKSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGFyZ19fRlJDN0NvbXBsZXgiIFwKKwkiYXJnXFsoXF0rKGNvbnN0IENvbXBsZXh8Q29tcGxleCBjb25zdCkgJlxbKVxdKyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgY2xlYXJva19fRlA3X3dpbl9zdGkiICJjbGVhcm9rKF93aW5fc3QgKiwgaW50KSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBjb21wbGV4ZnVuYzJfX0ZQRlBjX2kiICJjb21wbGV4ZnVuYzIoaW50ICgqKShjaGFyICopKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgY29tcGxleGZ1bmMzX19GUEZQRlBsX3NfaSIgImNvbXBsZXhmdW5jMyhpbnQgKCopKHNob3J0ICgqKShsb25nICopKSkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGNvbXBsZXhmdW5jNF9fRlBGUEZQY19zX2kiICJjb21wbGV4ZnVuYzQoaW50ICgqKShzaG9ydCAoKikoY2hhciAqKSkpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBjb21wbGV4ZnVuYzVfX0ZQRlBjX1BGbF9pIiAiY29tcGxleGZ1bmM1KGludCAoKigqKShjaGFyICopKShsb25nKSkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGNvbXBsZXhmdW5jNl9fRlBGUGlfUEZsX2kiICJjb21wbGV4ZnVuYzYoaW50ICgqKCopKGludCAqKSkobG9uZykpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBjb21wbGV4ZnVuYzdfX0ZQRlBGUGNfaV9QRmxfaSIgImNvbXBsZXhmdW5jNyhpbnQgKCooKikoaW50ICgqKShjaGFyICopKSkobG9uZykpIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gY29udGFpbnNfX0M5Qml0U3RyaW5nUkMxMEJpdFBhdHRlcm4iIFwKKwkiQml0U3RyaW5nOjpjb250YWluc1xbKFxdKyhjb25zdCBCaXRQYXR0ZXJufEJpdFBhdHRlcm4gY29uc3QpICZcWylcXSsgY29uc3QiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBjb250YWluc19fQzlCaXRTdHJpbmdSQzEyQml0U3ViU3RyaW5naSIgXAorCSJCaXRTdHJpbmc6OmNvbnRhaW5zXFsoXF0rKGNvbnN0IEJpdFN1YlN0cmluZ3xCaXRTdWJTdHJpbmcgY29uc3QpICYsIGludFxbKVxdKyBjb25zdCIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGNvbnRhaW5zX19DOUJpdFN0cmluZ1JUMCIgXAorCSJCaXRTdHJpbmc6OmNvbnRhaW5zXFsoXF0rKGNvbnN0IEJpdFN0cmluZ3xCaXRTdHJpbmcgY29uc3QpICZcWylcXSsgY29uc3QiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBkaXZfX0ZQQzZJbnRSZXBUMFA2SW50UmVwIiBcCisJImRpdlxbKFxdKyhjb25zdCBJbnRSZXB8SW50UmVwIGNvbnN0KSBcWypcXSssIChjb25zdCBJbnRSZXB8SW50UmVwIGNvbnN0KSBcWypcXSssIEludFJlcCBcWypcXStcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBkaXZfX0ZQQzZJbnRSZXBsUDZJbnRSZXAiIFwKKwkiZGl2XFsoXF0rKGNvbnN0IEludFJlcHxJbnRSZXAgY29uc3QpIFxbKlxdKywgbG9uZywgSW50UmVwIFxbKlxdK1xbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGRpdl9fRlJDOFJhdGlvbmFsVDBSOFJhdGlvbmFsIiBcCisJImRpdlxbKFxdKyhjb25zdCBSYXRpb25hbHxSYXRpb25hbCBjb25zdCkgJiwgKGNvbnN0IFJhdGlvbmFsfFJhdGlvbmFsIGNvbnN0KSAmLCBSYXRpb25hbCAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZGl2aWRlX19GUkM3SW50ZWdlclQwUjdJbnRlZ2VyVDIiIFwKKwkiZGl2aWRlXFsoXF0rKGNvbnN0IEludGVnZXJ8SW50ZWdlciBjb25zdCkgJiwgKGNvbnN0IEludGVnZXJ8SW50ZWdlciBjb25zdCkgJiwgSW50ZWdlciAmLCBJbnRlZ2VyICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBkaXZpZGVfX0ZSQzdJbnRlZ2VybFI3SW50ZWdlclJsIiBcCisJImRpdmlkZVxbKFxdKyhjb25zdCBJbnRlZ2VyfEludGVnZXIgY29uc3QpICYsIGxvbmcsIEludGVnZXIgJiwgbG9uZyAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZW5hYmxlX18xNERvY3VtZW50Vmlld2VyUENjVWkiIFwKKwkiRG9jdW1lbnRWaWV3ZXI6OmVuYWJsZVxbKFxdKyhjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdKywgdW5zaWduZWQgaW50XFspXF0rIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGZvb19fRmlOMzAiICJmb28oaW50LCBpbnQsIGludCwgaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZm9vX19GaVIzZm9vaVQxaVQxIiAiZm9vKGludCwgZm9vICYsIGludCwgZm9vICYsIGludCwgZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBmb29fX18zYmFybCIgImJhcjo6Zm9vXyhsb25nKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgaW5zZXJ0X18xNWl2Q2xpcHBpbmdTdGFja2xSUDhfWFJlZ2lvbiIgIml2Q2xpcHBpbmdTdGFjazo6aW5zZXJ0KGxvbmcsIF9YUmVnaW9uIComKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgaW5zZXJ0X18xNkNob29zZXJJbmZvX0xpc3RsUjExQ2hvb3NlckluZm8iICJDaG9vc2VySW5mb19MaXN0OjppbnNlcnQobG9uZywgQ2hvb3NlckluZm8gJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGluc2VydF9fMTdGb250RmFtaWx5UmVwTGlzdGxSUDE1aXZGb250RmFtaWx5UmVwIiAiRm9udEZhbWlseVJlcExpc3Q6Omluc2VydChsb25nLCBpdkZvbnRGYW1pbHlSZXAgKiYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBsZWF2ZW9rX19GUDdfd2luX3N0YyIgImxlYXZlb2soX3dpbl9zdCAqLCBjaGFyKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgbGVmdF9tb3Zlcl9fQzdpdk1GS2l0UDEyaXZBZGp1c3RhYmxlUDdpdlN0eWxlIiAiaXZNRktpdDo6bGVmdF9tb3ZlcihpdkFkanVzdGFibGUgKiwgaXZTdHlsZSAqKSBjb25zdCIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIG1hdGNoZXNfX0M5Qml0U3RyaW5nUkMxMEJpdFBhdHRlcm5pIiBcCisJIkJpdFN0cmluZzo6bWF0Y2hlc1xbKFxdKyhjb25zdCBCaXRQYXR0ZXJufEJpdFBhdHRlcm4gY29uc3QpICYsIGludFxbKVxdKyBjb25zdCIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIG1hdGNoZXNfX0M5U3ViU3RyaW5nUkM1UmVnZXgiIFwKKwkiU3ViU3RyaW5nOjptYXRjaGVzXFsoXF0rKGNvbnN0IFJlZ2V4fFJlZ2V4IGNvbnN0KSAmXFspXF0rIGNvbnN0IgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkMWFyZ19fRlNjIiAib3ZlcmxvYWQxYXJnKHNpZ25lZCBjaGFyKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgb3ZlcmxvYWQxYXJnX19GVWMiICJvdmVybG9hZDFhcmcodW5zaWduZWQgY2hhcikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkMWFyZ19fRlVpIiAib3ZlcmxvYWQxYXJnKHVuc2lnbmVkIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkMWFyZ19fRlVsIiAib3ZlcmxvYWQxYXJnKHVuc2lnbmVkIGxvbmcpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBvdmVybG9hZDFhcmdfX0ZVcyIgIm92ZXJsb2FkMWFyZyh1bnNpZ25lZCBzaG9ydCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkMWFyZ19fRmMiICJvdmVybG9hZDFhcmcoY2hhcikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkMWFyZ19fRmQiICJvdmVybG9hZDFhcmcoZG91YmxlKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgb3ZlcmxvYWQxYXJnX19GZiIgIm92ZXJsb2FkMWFyZyhmbG9hdCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkMWFyZ19fRmkiICJvdmVybG9hZDFhcmcoaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgb3ZlcmxvYWQxYXJnX19GbCIgIm92ZXJsb2FkMWFyZyhsb25nKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgb3ZlcmxvYWQxYXJnX19GcyIgIm92ZXJsb2FkMWFyZyhzaG9ydCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkMWFyZ19fRnYiICJvdmVybG9hZDFhcmcodm9pZCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkYXJnc19fRmkiICJvdmVybG9hZGFyZ3MoaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgb3ZlcmxvYWRhcmdzX19GaWkiICJvdmVybG9hZGFyZ3MoaW50LCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBvdmVybG9hZGFyZ3NfX0ZpaWkiICJvdmVybG9hZGFyZ3MoaW50LCBpbnQsIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkYXJnc19fRmlpaWkiICJvdmVybG9hZGFyZ3MoaW50LCBpbnQsIGludCwgaW50KSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBvdmVybG9hZGFyZ3NfX0ZpaWlpaSIgIm92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkYXJnc19fRmlpaWlpaSIgIm92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgb3ZlcmxvYWRhcmdzX19GaWlpaWlpaSIgIm92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBvdmVybG9hZGFyZ3NfX0ZpaWlpaWlpaSIgIm92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkYXJnc19fRmlpaWlpaWlpaSIgIm92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgb3ZlcmxvYWRhcmdzX19GaWlpaWlpaWlpaSIgIm92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBvdmVybG9hZGFyZ3NfX0ZpaWlpaWlpaWlpaSIgIm92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCkiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBwaWNrX18xM2l2Q29tcG9zaXRpb25QOGl2Q2FudmFzUkMxMml2QWxsb2NhdGlvbmlSNWl2SGl0IiBcCisJIml2Q29tcG9zaXRpb246OnBpY2tcWyhcXStpdkNhbnZhcyBcWypcXSssIChjb25zdCBpdkFsbG9jYXRpb258aXZBbGxvY2F0aW9uIGNvbnN0KSAmLCBpbnQsIGl2SGl0ICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBwb2ludGVyX19DMTFpdkhTY3JvbGxlclJDN2l2RXZlbnRSQzEyaXZBbGxvY2F0aW9uIiBcCisJIml2SFNjcm9sbGVyOjpwb2ludGVyXFsoXF0rKGNvbnN0IGl2RXZlbnR8aXZFdmVudCBjb25zdCkgJiwgKGNvbnN0IGl2QWxsb2NhdGlvbnxpdkFsbG9jYXRpb24gY29uc3QpICZcWylcXSsgY29uc3QiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHBva2VfXzhpdlJhc3RlclVsVWxmZmZmIiAiaXZSYXN0ZXI6OnBva2UodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBwb2xhcl9fRmRkIiAicG9sYXIoZG91YmxlLCBkb3VibGUpIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gcmVhZF9fMTBvc1N0ZElucHV0UlBDYyIgXAorCSJvc1N0ZElucHV0OjpyZWFkXFsoXF0rKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFsqXF0rJlxbKVxdKyIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBzY2FsZV9fMTNpdlRyYW5zZm9ybWVyZmYiICJpdlRyYW5zZm9ybWVyOjpzY2FsZShmbG9hdCwgZmxvYXQpIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gc2NhbndfXzEyQ3Vyc2VzV2luZG93UENjZSIgXAorCSJDdXJzZXNXaW5kb3c6OnNjYW53XFsoXF0rKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFsqXF0rLC4uLlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIHNjbXBfX0ZQQ2NUMCIgXAorCSJzY21wXFsoXF0rKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFsqXF0rLCAoY29uc3QgY2hhcnxjaGFyIGNvbnN0KSBcWypcXStcWylcXSsiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHNnZXRuX183ZmlsZWJ1ZlBjaSIgImZpbGVidWY6OnNnZXRuKGNoYXIgKiwgaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgc2hpZnRfX0ZQNV9GcmVwaVQwIiAic2hpZnQoX0ZyZXAgKiwgaW50LCBfRnJlcCAqKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgdGVzdF9fQzZCaXRTZXRpIiAiQml0U2V0Ojp0ZXN0KGludCkgY29uc3QiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHRlc3RfX0M2Qml0U2V0aWkiICJCaXRTZXQ6OnRlc3QoaW50LCBpbnQpIGNvbnN0IgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gdGVzdGJpdF9fRlJDN0ludGVnZXJsIiBcCisJInRlc3RiaXRcWyhcXSsoY29uc3QgSW50ZWdlcnxJbnRlZ2VyIGNvbnN0KSAmLCBsb25nXFspXF0rIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSB0ZXh0X3NvdXJjZV9fOERvY3VtZW50bCIgIkRvY3VtZW50Ojp0ZXh0X3NvdXJjZShsb25nKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgdmFyaWFuY2VfXzZFcmxhbmdkIiAiRXJsYW5nOjp2YXJpYW5jZShkb3VibGUpIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gdmZvcm1fXzhpb3N0cmVhbVBDY1BjIiBcCisJImlvc3RyZWFtOjp2Zm9ybVxbKFxdKyhjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdKywgY2hhciBcWypcXStcWylcXSsiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHZpZXdfXzE0RG9jdW1lbnRWaWV3ZXJQOEl0ZW1WaWV3UDExVGFidWxhckl0ZW0iICJEb2N1bWVudFZpZXdlcjo6dmlldyhJdGVtVmlldyAqLCBUYWJ1bGFySXRlbSAqKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgeHlfZXh0ZW50c19fMTFpdkV4dGVuc2lvbmZmZmYiICJpdkV4dGVuc2lvbjo6eHlfZXh0ZW50cyhmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHplcm9fXzhvc01lbW9yeVB2VWkiICJvc01lbW9yeTo6emVybyh2b2lkICosIHVuc2lnbmVkIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF8yVDRcJE4iICJUNDo6TiIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX1EyMlQ0MnQxXCROIiAiVDQ6OnQxOjpOIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBnZXRfXzJUMSIgIlQxOjpnZXQodm9pZCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGdldF9fUTIyVDExYSIgIlQxOjphOjpnZXQodm9pZCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGdldF9fUTMyVDExYTFiIiAiVDE6OmE6OmI6OmdldCh2b2lkKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZ2V0X19RNDJUMTFhMWIxYyIgIlQxOjphOjpiOjpjOjpnZXQodm9pZCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGdldF9fUTUyVDExYTFiMWMxZCIgIlQxOjphOjpiOjpjOjpkOjpnZXQodm9pZCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHB1dF9fMlQxaSIgIlQxOjpwdXQoaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgcHV0X19RMjJUMTFhaSIgIlQxOjphOjpwdXQoaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgcHV0X19RMzJUMTFhMWJpIiAiVDE6OmE6OmI6OnB1dChpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBwdXRfX1E0MlQxMWExYjFjaSIgIlQxOjphOjpiOjpjOjpwdXQoaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgcHV0X19RNTJUMTFhMWIxYzFkaSIgIlQxOjphOjpiOjpjOjpkOjpwdXQoaW50KSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBiYXJfXzNmb29QdiIgICAgICAgImZvbzo6YmFyKHZvaWQgKikiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBiYXJfXzNmb29QQ3YiIFwKKwkiZm9vOjpiYXJcWyhcXSsoY29uc3Qgdm9pZHx2b2lkIGNvbnN0KSAqXFsqXF0rXFspXF0rIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBiYXJfX0MzZm9vUHYiICAgICAgImZvbzo6YmFyKHZvaWQgKikgY29uc3QiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBiYXJfX0MzZm9vUEN2IiBcCisJImZvbzo6YmFyXFsoXF0rKGNvbnN0IHZvaWR8dm9pZCBjb25zdCkgKlxbKlxdK1xbKVxdKyBjb25zdCIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19lcV9fM2Zvb1JUMCIgICAgICJmb286Om9wZXJhdG9yPT0oZm9vICYpIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19lcV9fM2Zvb1JDM2ZvbyIgXAorCSAiZm9vOjpvcGVyYXRvcj09XFsoXF0rKGNvbnN0IGZvb3xmb28gY29uc3QpICZcWylcXSsiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fZXFfX0MzZm9vUjNmb28iICAiZm9vOjpvcGVyYXRvcj09KGZvbyAmKSBjb25zdCIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fZXFfX0MzZm9vUlQwIiBcCisJICAgImZvbzo6b3BlcmF0b3I9PVxbKFxdKyhjb25zdCBmb298Zm9vIGNvbnN0KSAmXFspXF0rIGNvbnN0IgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGVsZW1fX3Q2dmVjdG9yMVpkaSIgInZlY3Rvcjxkb3VibGU+OjplbGVtKGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGVsZW1fX3Q2dmVjdG9yMVppaSIgInZlY3RvcjxpbnQ+OjplbGVtKGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fdDZ2ZWN0b3IxWmRpIiAgICAgInZlY3Rvcjxkb3VibGU+Ojp2ZWN0b3IoaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX190NnZlY3RvcjFaaWkiICAgICAidmVjdG9yPGludD46OnZlY3RvcihpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfXCRfdDZ2ZWN0b3IxWmRpIiAgICAidmVjdG9yPGRvdWJsZT46On52ZWN0b3IoaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX1wkX3Q2dmVjdG9yMVppaSIgICAgInZlY3RvcjxpbnQ+Ojp+dmVjdG9yKGludCkiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19ud19fdDJUMTFaY1VpIiAiVDE8Y2hhcj46Om9wZXJhdG9yIG5ldyh1bnNpZ25lZCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX253X190MlQxMVoxdFVpIiAiVDE8dD46Om9wZXJhdG9yIG5ldyh1bnNpZ25lZCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2RsX190MlQxMVpjUHYiICJUMTxjaGFyPjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fZGxfX3QyVDExWjF0UHYiICJUMTx0Pjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fdDJUMTFaY2kiICJUMTxjaGFyPjo6VDEoaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX190MlQxMVpjIiAiVDE8Y2hhcj46OlQxKHZvaWQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3QyVDExWjF0aSIgIlQxPHQ+OjpUMShpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3QyVDExWjF0IiAiVDE8dD46OlQxKHZvaWQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fUTJ0NExpc3QxWjEwVkhETEVudGl0eTNQaXgiIFwKKwkiTGlzdDxWSERMRW50aXR5Pjo6UGl4OjpQaXgodm9pZCkiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19RMnQ0TGlzdDFaMTBWSERMRW50aXR5M1BpeFBRMnQ0TGlzdDFaMTBWSERMRW50aXR5N2VsZW1lbnQiIFwKKwkiTGlzdDxWSERMRW50aXR5Pjo6UGl4OjpQaXgoTGlzdDxWSERMRW50aXR5Pjo6ZWxlbWVudCAqKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX1EydDRMaXN0MVoxMFZIRExFbnRpdHkzUGl4UkNRMnQ0TGlzdDFaMTBWSERMRW50aXR5M1BpeCIgXAorCSJMaXN0PFZIRExFbnRpdHk+OjpQaXg6OlBpeChMaXN0PFZIRExFbnRpdHk+OjpQaXggY29uc3QgJikiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19RMnQ0TGlzdDFaMTBWSERMRW50aXR5N2VsZW1lbnRSQzEwVkhETEVudGl0eVBUMCIgXAorCSJMaXN0PFZIRExFbnRpdHk+OjplbGVtZW50OjplbGVtZW50KFZIRExFbnRpdHkgY29uc3QgJiwgTGlzdDxWSERMRW50aXR5Pjo6ZWxlbWVudCAqKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX1EydDRMaXN0MVoxMFZIRExFbnRpdHk3ZWxlbWVudFJDUTJ0NExpc3QxWjEwVkhETEVudGl0eTdlbGVtZW50IiBcCisJIkxpc3Q8VkhETEVudGl0eT46OmVsZW1lbnQ6OmVsZW1lbnQoTGlzdDxWSERMRW50aXR5Pjo6ZWxlbWVudCBjb25zdCAmKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2NsX19DMTFWSERMTGlicmFyeUd0NFBpeFgzWjExVkhETExpYnJhcnlaMTRWSERMTGlicmFyeVJlcFp0NExpc3QxWjEwVkhETEVudGl0eSIgXAorCSJWSERMTGlicmFyeTo6b3BlcmF0b3IoKShQaXhYPFZIRExMaWJyYXJ5LCBWSERMTGlicmFyeVJlcCwgTGlzdDxWSERMRW50aXR5PiA+KSBjb25zdCIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2NsX19DdDRMaXN0MVoxMFZIRExFbnRpdHlSQ1EydDRMaXN0MVoxMFZIRExFbnRpdHkzUGl4IiBcCisJIkxpc3Q8VkhETEVudGl0eT46Om9wZXJhdG9yKCkoTGlzdDxWSERMRW50aXR5Pjo6UGl4IGNvbnN0ICYpIGNvbnN0IgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fbmVfX0ZQdlJDUTJ0NExpc3QxWjEwVkhETEVudGl0eTNQaXgiIFwKKwkib3BlcmF0b3IhPSh2b2lkICosIExpc3Q8VkhETEVudGl0eT46OlBpeCBjb25zdCAmKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX25lX19GUHZSQ3Q0UGl4WDNaMTFWSERMTGlicmFyeVoxNFZIRExMaWJyYXJ5UmVwWnQ0TGlzdDFaMTBWSERMRW50aXR5IiBcCisJIm9wZXJhdG9yIT0odm9pZCAqLCBQaXhYPFZIRExMaWJyYXJ5LCBWSERMTGlicmFyeVJlcCwgTGlzdDxWSERMRW50aXR5PiA+IGNvbnN0ICYpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fdDRMaXN0MVoxMFZIRExFbnRpdHlSQ3Q0TGlzdDFaMTBWSERMRW50aXR5IiBcCisJIkxpc3Q8VkhETEVudGl0eT46Okxpc3QoTGlzdDxWSERMRW50aXR5PiBjb25zdCAmKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3Q0UGl4WDNaMTFWSERMTGlicmFyeVoxNFZIRExMaWJyYXJ5UmVwWnQ0TGlzdDFaMTBWSERMRW50aXR5IiBcCisJIlBpeFg8VkhETExpYnJhcnksIFZIRExMaWJyYXJ5UmVwLCBMaXN0PFZIRExFbnRpdHk+ID46OlBpeFgodm9pZCkiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX190NFBpeFgzWjExVkhETExpYnJhcnlaMTRWSERMTGlicmFyeVJlcFp0NExpc3QxWjEwVkhETEVudGl0eVAxNFZIRExMaWJyYXJ5UmVwR1EydDRMaXN0MVoxMFZIRExFbnRpdHkzUGl4IiBcCisJIlBpeFg8VkhETExpYnJhcnksIFZIRExMaWJyYXJ5UmVwLCBMaXN0PFZIRExFbnRpdHk+ID46OlBpeFgoVkhETExpYnJhcnlSZXAgKiwgTGlzdDxWSERMRW50aXR5Pjo6UGl4KSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3Q0UGl4WDNaMTFWSERMTGlicmFyeVoxNFZIRExMaWJyYXJ5UmVwWnQ0TGlzdDFaMTBWSERMRW50aXR5UkN0NFBpeFgzWjExVkhETExpYnJhcnlaMTRWSERMTGlicmFyeVJlcFp0NExpc3QxWjEwVkhETEVudGl0eSIgXAorCSJQaXhYPFZIRExMaWJyYXJ5LCBWSERMTGlicmFyeVJlcCwgTGlzdDxWSERMRW50aXR5PiA+OjpQaXhYKFBpeFg8VkhETExpYnJhcnksIFZIRExMaWJyYXJ5UmVwLCBMaXN0PFZIRExFbnRpdHk+ID4gY29uc3QgJikiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgbmV4dEVfX0MxMVZIRExMaWJyYXJ5UnQ0UGl4WDNaMTFWSERMTGlicmFyeVoxNFZIRExMaWJyYXJ5UmVwWnQ0TGlzdDFaMTBWSERMRW50aXR5IiBcCisJIlZIRExMaWJyYXJ5OjpuZXh0RShQaXhYPFZIRExMaWJyYXJ5LCBWSERMTGlicmFyeVJlcCwgTGlzdDxWSERMRW50aXR5PiA+ICYpIGNvbnN0IgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG5leHRfX0N0NExpc3QxWjEwVkhETEVudGl0eVJRMnQ0TGlzdDFaMTBWSERMRW50aXR5M1BpeCIgXAorCSJMaXN0PFZIRExFbnRpdHk+OjpuZXh0KExpc3Q8VkhETEVudGl0eT46OlBpeCAmKSBjb25zdCIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfR0xPQkFMX1wkRFwkc2V0IiAiZ2xvYmFsIGRlc3RydWN0b3JzIGtleWVkIHRvIHNldCIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfR0xPQkFMX1wkSVwkc2V0IiAiZ2xvYmFsIGNvbnN0cnVjdG9ycyBrZXllZCB0byBzZXQiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19hc19fdDVMaXN0UzFaVWlSQ3Q1TGlzdFMxWlVpIiBcCisJIkxpc3RTPHVuc2lnbmVkIGludD46Om9wZXJhdG9yPShMaXN0Uzx1bnNpZ25lZCBpbnQ+IGNvbnN0ICYpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY2xfX0N0NUxpc3RTMVpVaVJDUTJ0NUxpc3RTMVpVaTNWaXgiIFwKKwkiTGlzdFM8dW5zaWduZWQgaW50Pjo6b3BlcmF0b3IoKShMaXN0Uzx1bnNpZ25lZCBpbnQ+OjpWaXggY29uc3QgJikgY29uc3QiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jbF9fQ3Q1U2V0TFMxWlVpUkNRMnQ1U2V0TFMxWlVpM1ZpeCIgXAorCSJTZXRMUzx1bnNpZ25lZCBpbnQ+OjpvcGVyYXRvcigpKFNldExTPHVuc2lnbmVkIGludD46OlZpeCBjb25zdCAmKSBjb25zdCIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3QxMExpc3RTX2xpbmsxWlVpUkNVaVBUMCIgXAorCSJMaXN0U19saW5rPHVuc2lnbmVkIGludD46Okxpc3RTX2xpbmsodW5zaWduZWQgaW50IGNvbnN0ICYsIExpc3RTX2xpbms8dW5zaWduZWQgaW50PiAqKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3QxMExpc3RTX2xpbmsxWlVpUkN0MTBMaXN0U19saW5rMVpVaSIgXAorCSJMaXN0U19saW5rPHVuc2lnbmVkIGludD46Okxpc3RTX2xpbmsoTGlzdFNfbGluazx1bnNpZ25lZCBpbnQ+IGNvbnN0ICYpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fdDVMaXN0UzFaVWlSQ3Q1TGlzdFMxWlVpIiBcCisJIkxpc3RTPHVuc2lnbmVkIGludD46Okxpc3RTKExpc3RTPHVuc2lnbmVkIGludD4gY29uc3QgJikiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgbmV4dF9fQ3Q1TGlzdFMxWlVpUlEydDVMaXN0UzFaVWkzVml4IiBcCisJIkxpc3RTPHVuc2lnbmVkIGludD46Om5leHQoTGlzdFM8dW5zaWduZWQgaW50Pjo6Vml4ICYpIGNvbnN0IgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fbmVfX0ZQdlJDUTJ0NVNldExTMVpVaTNWaXgiIFwKKwkib3BlcmF0b3IhPSh2b2lkICosIFNldExTPHVuc2lnbmVkIGludD46OlZpeCBjb25zdCAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX190OExpc3RFbGVtMVo1TGFiZWxSdDRMaXN0MVo1TGFiZWwiIFwKKwkiTGlzdEVsZW08TGFiZWw+OjpMaXN0RWxlbShMaXN0PExhYmVsPiAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX190OEJEREhvb2tWMVpQY1JDUGMiIFwKKwkiQkRESG9va1Y8Y2hhciAqPjo6QkRESG9va1YoY2hhciAqY29uc3QgJikiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX3Z0XCR0OEJEREhvb2tWMVpQYyIgIkJEREhvb2tWPGNoYXIgKj4gdmlydHVhbCB0YWJsZSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX25lX19GUHZSQ1EyMTFCRERGdW5jdGlvbjRWaXhCIiBcCisJIm9wZXJhdG9yIT0odm9pZCAqLCBCRERGdW5jdGlvbjo6Vml4QiBjb25zdCAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19lcV9fRlB2UkNRMjExQkRERnVuY3Rpb240Vml4QiIgXAorCSJvcGVyYXRvcj09KHZvaWQgKiwgQkRERnVuY3Rpb246OlZpeEIgY29uc3QgJikiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgcmVsYXRpdmVJZF9fQ1EzNlRfcGhpMjEwVF9wcmVzZXJ2ZThGUENfbmV4dFJDUTI2VF9waGkyMTBUX3ByZXNlcnZlUkMxMFBhcmFtZXRlcnMiIFwKKwkgIlRfcGhpMjo6VF9wcmVzZXJ2ZTo6RlBDX25leHQ6OnJlbGF0aXZlSWQoVF9waGkyOjpUX3ByZXNlcnZlIGNvbnN0ICYsIFBhcmFtZXRlcnMgY29uc3QgJikgY29uc3QiCisKK30KKworIworIyAgVGVzdCBsdWNpZCBzdHlsZSBuYW1lIGRlbWFuZ2xpbmcKKyMKKworcHJvYyB0ZXN0X2x1Y2lkX3N0eWxlX2RlbWFuZ2xpbmcge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICAjIFNldCB0aGUgZGVtYW5nbGluZyBzdHlsZSB0byAibHVjaWQiIGFuZCB0aGVuIGNoZWNrIHRvIG1ha2Ugc3VyZQorICAgICMgaXQgcmVhbGx5IGdvdCBzZXQuICBSZXR1cm4gaWYgdGhlIHN0eWxlIGZhaWxlZCB0byBnZXQgc2V0IGZvcgorICAgICMgc29tZSByZWFzb24uCisKKyAgICBzZW5kX2dkYiAic2V0IGRlbWFuZ2xlLXN0eWxlIGx1Y2lkXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJzZXQgZGVtYW5nbGUtc3R5bGUgbHVjaWRcW1xyXG5cXSskZ2RiX3Byb21wdCAkIiB7fQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInNldCBkZW1hbmdsZS1zdHlsZSBsdWNpZCBmYWlsZWQiIDsgcmV0dXJuIH0KKwl0aW1lb3V0IHsgZmFpbCAic2V0IGRlbWFuZ2xlLXN0eWxlIGx1Y2lkIGZhaWxlZCAodGltZW91dCkiIDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAic2hvdyBkZW1hbmdsZS1zdHlsZVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiVGhlIGN1cnJlbnQgQ1xbK1xdKyBkZW1hbmdsaW5nIHN0eWxlIGlzIFwibHVjaWRcIi5cclxuJGdkYl9wcm9tcHQgJCIge30KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJkZW1hbmdsaW5nIHN0eWxlIG5vdCBzZXQgdG8gbHVjaWQiIH0KKwl0aW1lb3V0IHsgZmFpbCAic2hvdyBkZW1hbmdsZS1zdHlsZSB0aW1lZCBvdXQiIH0KKyAgICB9CisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgV1NfX0ZSN2lzdHJlYW0iICJXUyhpc3RyZWFtICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FhX18zZm9vRlIzZm9vIiAiZm9vOjpvcGVyYXRvciYmKGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19hYWRfXzNmb29GUjNmb28iICJmb286Om9wZXJhdG9yJj0oZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FkX18zZm9vRlIzZm9vIiAiZm9vOjpvcGVyYXRvciYoZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2Fkdl9fM2Zvb0ZSM2ZvbyIgImZvbzo6b3BlcmF0b3IvPShmb28gJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fYWR2X183Y29tcGxleEY3Y29tcGxleCIgImNvbXBsZXg6Om9wZXJhdG9yLz0oY29tcGxleCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fYWVyX18zZm9vRlIzZm9vIiAiZm9vOjpvcGVyYXRvcl49KGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19hbHNfXzNmb29GUjNmb28iICJmb286Om9wZXJhdG9yPDw9KGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19hbWRfXzNmb29GUjNmb28iICJmb286Om9wZXJhdG9yJT0oZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FtaV9fM2Zvb0ZSM2ZvbyIgImZvbzo6b3BlcmF0b3ItPShmb28gJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fYW11X18zZm9vRlIzZm9vIiAiZm9vOjpvcGVyYXRvcio9KGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19hbXVfXzdjb21wbGV4Rjdjb21wbGV4IiAiY29tcGxleDo6b3BlcmF0b3IqPShjb21wbGV4KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19hb3JfXzNmb29GUjNmb28iICJmb286Om9wZXJhdG9yfD0oZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FwbF9fM2Zvb0ZSM2ZvbyIgImZvbzo6b3BlcmF0b3IrPShmb28gJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fYXJzX18zZm9vRlIzZm9vIiAiZm9vOjpvcGVyYXRvcj4+PShmb28gJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fYXNfXzE4aXN0cmVhbV93aXRoYXNzaWduRlA5c3RyZWFtYnVmIiAiaXN0cmVhbV93aXRoYXNzaWduOjpvcGVyYXRvcj0oc3RyZWFtYnVmICopIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FzX18xOGlzdHJlYW1fd2l0aGFzc2lnbkZSN2lzdHJlYW0iICJpc3RyZWFtX3dpdGhhc3NpZ246Om9wZXJhdG9yPShpc3RyZWFtICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FzX18zZm9vRlIzZm9vIiAiZm9vOjpvcGVyYXRvcj0oZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FzX18zaW9zRlIzaW9zIiAiaW9zOjpvcGVyYXRvcj0oaW9zICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2NsX18zZm9vRlIzZm9vIiAiZm9vOjpvcGVyYXRvcigpKGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jbV9fM2Zvb0ZSM2ZvbyIgImZvbzo6b3BlcmF0b3IsIChmb28gJikiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jb19fM2Zvb0Z2IiAiZm9vOjpvcGVyYXRvcn4odm9pZCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfXzEwaXN0cnN0cmVhbUZQYyIgImlzdHJzdHJlYW06OmlzdHJzdHJlYW0oY2hhciAqKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fMTBpc3Ryc3RyZWFtRlBjaSIgImlzdHJzdHJlYW06OmlzdHJzdHJlYW0oY2hhciAqLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18xMG9zdHJzdHJlYW1GUGNpVDIiICJvc3Ryc3RyZWFtOjpvc3Ryc3RyZWFtKGNoYXIgKiwgaW50LCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18xMG9zdHJzdHJlYW1GdiIgIm9zdHJzdHJlYW06Om9zdHJzdHJlYW0odm9pZCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfXzEwc21hbmlwX2ludEZQRlIzaW9zaV9SM2lvc2kiICJzbWFuaXBfaW50OjpzbWFuaXBfaW50KGlvcyAmKCopKGlvcyAmLCBpbnQpLCBpbnQpIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19jdF9fMTFjX2V4Y2VwdGlvbkZQY1JDN2NvbXBsZXhUMiIgImNfZXhjZXB0aW9uOjpjX2V4Y2VwdGlvblxbKFxdK2NoYXIgXFsqXF0rLCAoY29uc3QgY29tcGxleHxjb21wbGV4IGNvbnN0KSAmLCAoY29uc3QgY29tcGxleHxjb21wbGV4IGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19jdF9fMTFmc3RyZWFtYmFzZUZQQ2NpVDIiICJmc3RyZWFtYmFzZTo6ZnN0cmVhbWJhc2VcWyhcXSsoY29uc3QgY2hhcnxjaGFyIGNvbnN0KSBcWypcXSssIGludCwgaW50XFspXF0rIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18xMWZzdHJlYW1iYXNlRmkiICJmc3RyZWFtYmFzZTo6ZnN0cmVhbWJhc2UoaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fMTFmc3RyZWFtYmFzZUZpUGNUMSIgImZzdHJlYW1iYXNlOjpmc3RyZWFtYmFzZShpbnQsIGNoYXIgKiwgaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fMTFmc3RyZWFtYmFzZUZ2IiAiZnN0cmVhbWJhc2U6OmZzdHJlYW1iYXNlKHZvaWQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18xMXNtYW5pcF9sb25nRlBGUjNpb3NsX1IzaW9zbCIgInNtYW5pcF9sb25nOjpzbWFuaXBfbG9uZyhpb3MgJigqKShpb3MgJiwgbG9uZyksIGxvbmcpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18xMXN0ZGlvc3RyZWFtRlA0RklMRSIgInN0ZGlvc3RyZWFtOjpzdGRpb3N0cmVhbShGSUxFICopIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18xMnN0cnN0cmVhbWJ1ZkZQRmxfUHZQRlB2X3YiICJzdHJzdHJlYW1idWY6OnN0cnN0cmVhbWJ1Zih2b2lkICooKikobG9uZyksIHZvaWQgKCopKHZvaWQgKikpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18xMnN0cnN0cmVhbWJ1ZkZQVWNpVDEiICJzdHJzdHJlYW1idWY6OnN0cnN0cmVhbWJ1Zih1bnNpZ25lZCBjaGFyICosIGludCwgdW5zaWduZWQgY2hhciAqKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fMTJzdHJzdHJlYW1idWZGUGNpVDEiICJzdHJzdHJlYW1idWY6OnN0cnN0cmVhbWJ1ZihjaGFyICosIGludCwgY2hhciAqKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fMTJzdHJzdHJlYW1idWZGaSIgInN0cnN0cmVhbWJ1Zjo6c3Ryc3RyZWFtYnVmKGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfXzEyc3Ryc3RyZWFtYnVmRnYiICJzdHJzdHJlYW1idWY6OnN0cnN0cmVhbWJ1Zih2b2lkKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fMTNzdHJzdHJlYW1iYXNlRlBjaVQxIiAic3Ryc3RyZWFtYmFzZTo6c3Ryc3RyZWFtYmFzZShjaGFyICosIGludCwgY2hhciAqKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fM2Zvb0ZSM2ZvbyIgImZvbzo6Zm9vKGZvbyAmKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18zZm9vRmkiICJmb286OmZvbyhpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18zZm9vRmlOMzEiICJmb286OmZvbyhpbnQsIGludCwgaW50LCBpbnQpIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19jdF9fM2Zvb0ZpUENjIiBcCisJImZvbzo6Zm9vXFsoXF0raW50LCAoY29uc3QgY2hhcnxjaGFyIGNvbnN0KSBcWypcXStcWylcXSsiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfXzNmb29GaVIzZm9vVDFUMlQxVDIiICJmb286OmZvbyhpbnQsIGZvbyAmLCBpbnQsIGZvbyAmLCBpbnQsIGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fM2lvc0ZQOXN0cmVhbWJ1ZiIgImlvczo6aW9zKHN0cmVhbWJ1ZiAqKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fN2ZpbGVidWZGaVBjVDEiICJmaWxlYnVmOjpmaWxlYnVmKGludCwgY2hhciAqLCBpbnQpIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19jdF9fN2ZzdHJlYW1GUENjaVQyIiBcCisJImZzdHJlYW06OmZzdHJlYW1cWyhcXSsoY29uc3QgY2hhcnxjaGFyIGNvbnN0KSBcWypcXSssIGludCwgaW50XFspXF0rIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X183ZnN0cmVhbUZpUGNUMSIgImZzdHJlYW06OmZzdHJlYW0oaW50LCBjaGFyICosIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfXzdpc3RyZWFtRlA5c3RyZWFtYnVmIiAiaXN0cmVhbTo6aXN0cmVhbShzdHJlYW1idWYgKikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfXzdpc3RyZWFtRlA5c3RyZWFtYnVmaVA3b3N0cmVhbSIgImlzdHJlYW06OmlzdHJlYW0oc3RyZWFtYnVmICosIGludCwgb3N0cmVhbSAqKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fN2lzdHJlYW1GaVBjVDEiICJpc3RyZWFtOjppc3RyZWFtKGludCwgY2hhciAqLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X183aXN0cmVhbUZpVDFQN29zdHJlYW0iICJpc3RyZWFtOjppc3RyZWFtKGludCwgaW50LCBvc3RyZWFtICopIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X183b3N0cmVhbUZQOXN0cmVhbWJ1ZiIgIm9zdHJlYW06Om9zdHJlYW0oc3RyZWFtYnVmICopIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X183b3N0cmVhbUZpUGMiICJvc3RyZWFtOjpvc3RyZWFtKGludCwgY2hhciAqKSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fY3RfXzhpZnN0cmVhbUZQQ2NpVDIiIFwKKwkiaWZzdHJlYW06Omlmc3RyZWFtXFsoXF0rKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFsqXF0rLCBpbnQsIGludFxbKVxdKyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fOGlmc3RyZWFtRmlQY1QxIiAiaWZzdHJlYW06Omlmc3RyZWFtKGludCwgY2hhciAqLCBpbnQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfX1EyM2ZvbzNiYXJGdiIgImZvbzo6YmFyOjpiYXIodm9pZCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfX1EzM2ZvbzNiYXI0YmVsbEZ2IiAiZm9vOjpiYXI6OmJlbGw6OmJlbGwodm9pZCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fZGxfXzNmb29TRlB2IiAiZm9vOjpvcGVyYXRvciBkZWxldGUodm9pZCAqKSBzdGF0aWMiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fZGxfX0ZQdiIgIm9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2R0X18xMGlzdHJzdHJlYW1GdiIgImlzdHJzdHJlYW06On5pc3Ryc3RyZWFtKHZvaWQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fZHRfX1EyM2ZvbzNiYXJGdiIgImZvbzo6YmFyOjp+YmFyKHZvaWQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2R0X19RMzNmb28zYmFyNGJlbGxGdiIgImZvbzo6YmFyOjpiZWxsOjp+YmVsbCh2b2lkKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19kdl9fM2Zvb0ZSM2ZvbyIgImZvbzo6b3BlcmF0b3IvKGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19kdl9fRjdjb21wbGV4VDEiICJvcGVyYXRvci8oY29tcGxleCwgY29tcGxleCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fZXFfXzNmb29GUjNmb28iICJmb286Om9wZXJhdG9yPT0oZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2VyX18zZm9vRlIzZm9vIiAiZm9vOjpvcGVyYXRvcl4oZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2dlX18zZm9vRlIzZm9vIiAiZm9vOjpvcGVyYXRvcj49KGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19ndF9fM2Zvb0ZSM2ZvbyIgImZvbzo6b3BlcmF0b3I+KGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19sZV9fM2Zvb0ZSM2ZvbyIgImZvbzo6b3BlcmF0b3I8PShmb28gJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fbHNfXzNmb29GUjNmb28iICJmb286Om9wZXJhdG9yPDwoZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2xzX183b3N0cmVhbUZQOXN0cmVhbWJ1ZiIgIm9zdHJlYW06Om9wZXJhdG9yPDwoc3RyZWFtYnVmICopIgorCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX2xzX183b3N0cmVhbUZQQ2MiIFwKKwkib3N0cmVhbTo6b3BlcmF0b3I8PFxbKFxdKyhjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdK1xbKVxdKyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19sc19fN29zdHJlYW1GUEZSM2lvc19SM2lvcyIgIm9zdHJlYW06Om9wZXJhdG9yPDwoaW9zICYoKikoaW9zICYpKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19sc19fN29zdHJlYW1GUHYiICJvc3RyZWFtOjpvcGVyYXRvcjw8KHZvaWQgKikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fbHNfXzdvc3RyZWFtRlVpIiAib3N0cmVhbTo6b3BlcmF0b3I8PCh1bnNpZ25lZCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2xzX183b3N0cmVhbUZVbCIgIm9zdHJlYW06Om9wZXJhdG9yPDwodW5zaWduZWQgbG9uZykiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fbHNfXzdvc3RyZWFtRmQiICJvc3RyZWFtOjpvcGVyYXRvcjw8KGRvdWJsZSkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fbHNfXzdvc3RyZWFtRmYiICJvc3RyZWFtOjpvcGVyYXRvcjw8KGZsb2F0KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19sc19fN29zdHJlYW1GaSIgIm9zdHJlYW06Om9wZXJhdG9yPDwoaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19sc19fN29zdHJlYW1GbCIgIm9zdHJlYW06Om9wZXJhdG9yPDwobG9uZykiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fbHNfX0ZSN29zdHJlYW03Y29tcGxleCIgIm9wZXJhdG9yPDwob3N0cmVhbSAmLCBjb21wbGV4KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19sdF9fM2Zvb0ZSM2ZvbyIgImZvbzo6b3BlcmF0b3I8KGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19tZF9fM2Zvb0ZSM2ZvbyIgImZvbzo6b3BlcmF0b3IlKGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19taV9fM2Zvb0ZSM2ZvbyIgImZvbzo6b3BlcmF0b3ItKGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19tbF9fM2Zvb0ZSM2ZvbyIgImZvbzo6b3BlcmF0b3IqKGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19tbF9fRjdjb21wbGV4VDEiICJvcGVyYXRvciooY29tcGxleCwgY29tcGxleCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fbW1fXzNmb29GaSIgImZvbzo6b3BlcmF0b3ItLShpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX25lX18zZm9vRlIzZm9vIiAiZm9vOjpvcGVyYXRvciE9KGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19udF9fM2Zvb0Z2IiAiZm9vOjpvcGVyYXRvciEodm9pZCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fbndfXzNmb29TRmkiICJmb286Om9wZXJhdG9yIG5ldyhpbnQpIHN0YXRpYyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19ud19fRlVpIiAib3BlcmF0b3IgbmV3KHVuc2lnbmVkIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fbndfX0ZVaVB2IiAib3BlcmF0b3IgbmV3KHVuc2lnbmVkIGludCwgdm9pZCAqKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19vb19fM2Zvb0ZSM2ZvbyIgImZvbzo6b3BlcmF0b3J8fChmb28gJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fb3BQY19fM2Zvb0Z2IiAiZm9vOjpvcGVyYXRvciBjaGFyICoodm9pZCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fb3BpX18zZm9vRnYiICJmb286Om9wZXJhdG9yIGludCh2b2lkKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19vcl9fM2Zvb0ZSM2ZvbyIgImZvbzo6b3BlcmF0b3J8KGZvbyAmKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3BsX18zZm9vRlIzZm9vIiAiZm9vOjpvcGVyYXRvcisoZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3BwX18zZm9vRmkiICJmb286Om9wZXJhdG9yKysoaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19wdF9fM2Zvb0Z2IiAiZm9vOjpvcGVyYXRvci0+KHZvaWQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3JtX18zZm9vRlIzZm9vIiAiZm9vOjpvcGVyYXRvci0+Kihmb28gJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fcnNfXzNmb29GUjNmb28iICJmb286Om9wZXJhdG9yPj4oZm9vICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3JzX183aXN0cmVhbUZQOXN0cmVhbWJ1ZiIgImlzdHJlYW06Om9wZXJhdG9yPj4oc3RyZWFtYnVmICopIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3JzX183aXN0cmVhbUZQRlIzaW9zX1IzaW9zIiAiaXN0cmVhbTo6b3BlcmF0b3I+Pihpb3MgJigqKShpb3MgJikpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3JzX183aXN0cmVhbUZQRlI3aXN0cmVhbV9SN2lzdHJlYW0iICJpc3RyZWFtOjpvcGVyYXRvcj4+KGlzdHJlYW0gJigqKShpc3RyZWFtICYpKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19yc19fN2lzdHJlYW1GUFVjIiAiaXN0cmVhbTo6b3BlcmF0b3I+Pih1bnNpZ25lZCBjaGFyICopIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3JzX183aXN0cmVhbUZQYyIgImlzdHJlYW06Om9wZXJhdG9yPj4oY2hhciAqKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19yc19fN2lzdHJlYW1GUlVpIiAiaXN0cmVhbTo6b3BlcmF0b3I+Pih1bnNpZ25lZCBpbnQgJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fcnNfXzdpc3RyZWFtRlJVbCIgImlzdHJlYW06Om9wZXJhdG9yPj4odW5zaWduZWQgbG9uZyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19yc19fN2lzdHJlYW1GUlVzIiAiaXN0cmVhbTo6b3BlcmF0b3I+Pih1bnNpZ25lZCBzaG9ydCAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19yc19fN2lzdHJlYW1GUmQiICJpc3RyZWFtOjpvcGVyYXRvcj4+KGRvdWJsZSAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19yc19fN2lzdHJlYW1GUmYiICJpc3RyZWFtOjpvcGVyYXRvcj4+KGZsb2F0ICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3JzX183aXN0cmVhbUZSaSIgImlzdHJlYW06Om9wZXJhdG9yPj4oaW50ICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3JzX183aXN0cmVhbUZSbCIgImlzdHJlYW06Om9wZXJhdG9yPj4obG9uZyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19yc19fN2lzdHJlYW1GUnMiICJpc3RyZWFtOjpvcGVyYXRvcj4+KHNob3J0ICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3JzX19GUjdpc3RyZWFtUjdjb21wbGV4IiAib3BlcmF0b3I+Pihpc3RyZWFtICYsIGNvbXBsZXggJikiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX3ZjX18zZm9vRlIzZm9vIiAiZm9vOjpvcGVyYXRvclxcXFtcXFxdXFwoZm9vICZcXCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fdnRibF9fMTBpc3Ryc3RyZWFtIiAiaXN0cnN0cmVhbSB2aXJ0dWFsIHRhYmxlIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3Z0YmxfXzE3b3N0cmVhbV9faW9zdHJlYW1fXzE5aW9zdHJlYW1fd2l0aGFzc2lnbiIgImlvc3RyZWFtX3dpdGhhc3NpZ246Om9zdHJlYW1fX2lvc3RyZWFtIHZpcnR1YWwgdGFibGUiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX192dGJsX18zaW9zIiAiaW9zIHZpcnR1YWwgdGFibGUiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fdnRibF9fM2lvc19fMTNzdHJzdHJlYW1iYXNlIiAic3Ryc3RyZWFtYmFzZTo6aW9zIHZpcnR1YWwgdGFibGUiCisKKyAgICAjIEdEQiA5MzA0MTQgZGVtYW5nbGVzIHRoaXMgYXMgdF9jY19tYWluXyAob2J2aW91c2x5IHdyb25nKS4KKyAgICAjIEdEQiA5MzA3MDEgZ2V0cyBpbnRvIGFuIGluZmluaXRlIGxvb3AuCisgICAgIyBHREIgOTMwNzI3IHNheXMgIkNhbid0IGRlbWFuZ2xlIi4KKyAgICAjIFdoYXQgaXMgdGhlIGNvcnJlY3QgZGVtYW5nbGluZz8gIEZJWE1FLgorICAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX192dGJsX18zZm9vX192dF9jY19tYWluXyIgIiIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBhYnNfX0Y3Y29tcGxleCIgImFicyhjb21wbGV4KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgYWxsb2NhdGVfXzlzdHJlYW1idWZGdiIgInN0cmVhbWJ1Zjo6YWxsb2NhdGUodm9pZCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGF0dGFjaF9fMTFmc3RyZWFtYmFzZUZpIiAiZnN0cmVhbWJhc2U6OmF0dGFjaChpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBiaXRhbGxvY19fM2lvc1NGdiIgImlvczo6Yml0YWxsb2Modm9pZCkgc3RhdGljIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBjaHJfX0ZpVDEiICJjaHIoaW50LCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBjb21wbGV4X2Vycm9yX19GUjExY19leGNlcHRpb24iICJjb21wbGV4X2Vycm9yKGNfZXhjZXB0aW9uICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBjb21wbGV4ZnVuYzJfX0ZQRlBjX2kiICJjb21wbGV4ZnVuYzIoaW50ICgqKShjaGFyICopKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgY29tcGxleGZ1bmMzX19GUEZQRlBsX3NfaSIgImNvbXBsZXhmdW5jMyhpbnQgKCopKHNob3J0ICgqKShsb25nICopKSkiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgY29tcGxleGZ1bmM0X19GUEZQRlBjX3NfaSIgImNvbXBsZXhmdW5jNChpbnQgKCopKHNob3J0ICgqKShjaGFyICopKSkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGNvbXBsZXhmdW5jNV9fRlBGUGNfUEZsX2kiICJjb21wbGV4ZnVuYzUoaW50ICgqKCopKGNoYXIgKikpKGxvbmcpKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgY29tcGxleGZ1bmM2X19GUEZQaV9QRmxfaSIgImNvbXBsZXhmdW5jNihpbnQgKCooKikoaW50ICopKShsb25nKSkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGNvbXBsZXhmdW5jN19fRlBGUEZQY19pX1BGbF9pIiAiY29tcGxleGZ1bmM3KGludCAoKigqKShpbnQgKCopKGNoYXIgKikpKShsb25nKSkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGNvbXBsaWNhdGVkX3B1dF9fN29zdHJlYW1GYyIgIm9zdHJlYW06OmNvbXBsaWNhdGVkX3B1dChjaGFyKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgY29udjEwX19GbFBjIiAiY29udjEwKGxvbmcsIGNoYXIgKikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGNvbnYxNl9fRlVsUGMiICJjb252MTYodW5zaWduZWQgbG9uZywgY2hhciAqKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZGVjX19GUjNpb3MiICJkZWMoaW9zICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBkZWNfX0ZsaSIgImRlYyhsb25nLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBkb2ZpZWxkX19GUDdvc3RyZWFtUGNpVDJUMyIgImRvZmllbGQob3N0cmVhbSAqLCBjaGFyICosIGludCwgY2hhciAqLCBpbnQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGZsYWdzX18zaW9zRmwiICJpb3M6OmZsYWdzKGxvbmcpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBmbGFnc19fM2lvc0Z2IiAiaW9zOjpmbGFncyh2b2lkKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZm9vX19GaU4zMSIgImZvbyhpbnQsIGludCwgaW50LCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBmb29fX0ZpUjNmb29UMVQyVDFUMiIgImZvbyhpbnQsIGZvbyAmLCBpbnQsIGZvbyAmLCBpbnQsIGZvbyAmKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZm9vX19fM2JhckZsIiAiYmFyOjpmb29fKGxvbmcpIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZm9ybV9fRlBDY2UiICJmb3JtXFsoXF0rKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFsqXF0rLC4uLlxbKVxdKyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZ2V0X183aXN0cmVhbUZQY2ljIiAiaXN0cmVhbTo6Z2V0KGNoYXIgKiwgaW50LCBjaGFyKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZ2V0X183aXN0cmVhbUZSOXN0cmVhbWJ1ZmMiICJpc3RyZWFtOjpnZXQoc3RyZWFtYnVmICYsIGNoYXIpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBnZXRfY29tcGxpY2F0ZWRfXzdpc3RyZWFtRlJVYyIgImlzdHJlYW06OmdldF9jb21wbGljYXRlZCh1bnNpZ25lZCBjaGFyICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBnZXRfY29tcGxpY2F0ZWRfXzdpc3RyZWFtRlJjIiAiaXN0cmVhbTo6Z2V0X2NvbXBsaWNhdGVkKGNoYXIgJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGdldGxpbmVfXzdpc3RyZWFtRlBVY2ljIiAiaXN0cmVhbTo6Z2V0bGluZSh1bnNpZ25lZCBjaGFyICosIGludCwgY2hhcikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGdldGxpbmVfXzdpc3RyZWFtRlBjaWMiICJpc3RyZWFtOjpnZXRsaW5lKGNoYXIgKiwgaW50LCBjaGFyKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBpZ25vcmVfXzdpc3RyZWFtRmlUMSIgImlzdHJlYW06Omlnbm9yZShpbnQsIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGluaXRfXzEyc3Ryc3RyZWFtYnVmRlBjaVQxIiAic3Ryc3RyZWFtYnVmOjppbml0KGNoYXIgKiwgaW50LCBjaGFyICopIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBpbml0X18zaW9zRlA5c3RyZWFtYnVmIiAiaW9zOjppbml0KHN0cmVhbWJ1ZiAqKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgaW5pdGNvdW50X18xM0lvc3RyZWFtX2luaXQiICJJb3N0cmVhbV9pbml0Ojppbml0Y291bnQiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGlwZnhfXzdpc3RyZWFtRmkiICJpc3RyZWFtOjppcGZ4KGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGxzX2NvbXBsaWNhdGVkX183b3N0cmVhbUZVYyIgIm9zdHJlYW06OmxzX2NvbXBsaWNhdGVkKHVuc2lnbmVkIGNoYXIpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBsc19jb21wbGljYXRlZF9fN29zdHJlYW1GYyIgIm9zdHJlYW06OmxzX2NvbXBsaWNhdGVkKGNoYXIpIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gb3Blbl9fMTFmc3RyZWFtYmFzZUZQQ2NpVDIiIFwKKwkiZnN0cmVhbWJhc2U6Om9wZW5cWyhcXSsoY29uc3QgY2hhcnxjaGFyIGNvbnN0KSBcWypcXSssIGludCwgaW50XFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gb3Blbl9fN2ZpbGVidWZGUENjaVQyIiBcCisJImZpbGVidWY6Om9wZW5cWyhcXSsoY29uc3QgY2hhcnxjaGFyIGNvbnN0KSBcWypcXSssIGludCwgaW50XFspXF0rIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkMWFyZ19fRlNjIiAib3ZlcmxvYWQxYXJnKHNpZ25lZCBjaGFyKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgb3ZlcmxvYWQxYXJnX19GVWMiICJvdmVybG9hZDFhcmcodW5zaWduZWQgY2hhcikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkMWFyZ19fRlVpIiAib3ZlcmxvYWQxYXJnKHVuc2lnbmVkIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkMWFyZ19fRlVsIiAib3ZlcmxvYWQxYXJnKHVuc2lnbmVkIGxvbmcpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBvdmVybG9hZDFhcmdfX0ZVcyIgIm92ZXJsb2FkMWFyZyh1bnNpZ25lZCBzaG9ydCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkMWFyZ19fRmMiICJvdmVybG9hZDFhcmcoY2hhcikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkMWFyZ19fRmQiICJvdmVybG9hZDFhcmcoZG91YmxlKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgb3ZlcmxvYWQxYXJnX19GZiIgIm92ZXJsb2FkMWFyZyhmbG9hdCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkMWFyZ19fRmkiICJvdmVybG9hZDFhcmcoaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgb3ZlcmxvYWQxYXJnX19GbCIgIm92ZXJsb2FkMWFyZyhsb25nKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgb3ZlcmxvYWQxYXJnX19GcyIgIm92ZXJsb2FkMWFyZyhzaG9ydCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkMWFyZ19fRnYiICJvdmVybG9hZDFhcmcodm9pZCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkYXJnc19fRmlOMjEiICJvdmVybG9hZGFyZ3MoaW50LCBpbnQsIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkYXJnc19fRmlOMzEiICJvdmVybG9hZGFyZ3MoaW50LCBpbnQsIGludCwgaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgb3ZlcmxvYWRhcmdzX19GaU40MSIgIm92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkYXJnc19fRmlONTEiICJvdmVybG9hZGFyZ3MoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIG92ZXJsb2FkYXJnc19fRmlONjEiICJvdmVybG9hZGFyZ3MoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBvdmVybG9hZGFyZ3NfX0ZpTjcxIiAib3ZlcmxvYWRhcmdzKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgb3ZlcmxvYWRhcmdzX19GaU44MSIgIm92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgb3ZlcmxvYWRhcmdzX19GaU45MSIgIm92ZXJsb2FkYXJncyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBvdmVybG9hZGFyZ3NfX0ZpTjkxTjExIiAib3ZlcmxvYWRhcmdzKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgb3ZlcmxvYWRhcmdzX19GaVQxIiAib3ZlcmxvYWRhcmdzKGludCwgaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgcG9sYXJfX0ZkVDEiICJwb2xhcihkb3VibGUsIGRvdWJsZSkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHBvd19fRjdjb21wbGV4VDEiICJwb3coY29tcGxleCwgY29tcGxleCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHBvd19fRjdjb21wbGV4ZCIgInBvdyhjb21wbGV4LCBkb3VibGUpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBwb3dfX0Y3Y29tcGxleGkiICJwb3coY29tcGxleCwgaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgcG93X19GZDdjb21wbGV4IiAicG93KGRvdWJsZSwgY29tcGxleCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHBzdGFydF9fRlBjaVQyIiAicHN0YXJ0KGNoYXIgKiwgaW50LCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBwdXRfXzdvc3RyZWFtRmMiICJvc3RyZWFtOjpwdXQoY2hhcikiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgcmVhZF9fN2lzdHJlYW1GUGNpIiAiaXN0cmVhbTo6cmVhZChjaGFyICosIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHJlc2V0aW9zZmxhZ3NfX0ZSM2lvc2wiICJyZXNldGlvc2ZsYWdzKGlvcyAmLCBsb25nKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgcmVzdG9yZV9lcnJub19fRlJpIiAicmVzdG9yZV9lcnJubyhpbnQgJikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHJzX2NvbXBsaWNhdGVkX183aXN0cmVhbUZSVWMiICJpc3RyZWFtOjpyc19jb21wbGljYXRlZCh1bnNpZ25lZCBjaGFyICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSByc19jb21wbGljYXRlZF9fN2lzdHJlYW1GUmMiICJpc3RyZWFtOjpyc19jb21wbGljYXRlZChjaGFyICYpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBzZWVrZ19fN2lzdHJlYW1GbDhzZWVrX2RpciIgImlzdHJlYW06OnNlZWtnKGxvbmcsIHNlZWtfZGlyKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgc2Vla29mZl9fMTJzdHJzdHJlYW1idWZGbDhzZWVrX2RpcmkiICJzdHJzdHJlYW1idWY6OnNlZWtvZmYobG9uZywgc2Vla19kaXIsIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHNlZWtvZmZfXzlzdHJlYW1idWZGbFEyXzNpb3MxMmlvc19zZWVrX2RpcmkiICJzdHJlYW1idWY6OnNlZWtvZmYobG9uZywgaW9zOjppb3Nfc2Vla19kaXIsIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHNlZWtwb3NfXzlzdHJlYW1idWZGbGkiICJzdHJlYW1idWY6OnNlZWtwb3MobG9uZywgaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgc2V0X25ld19oYW5kbGVyX19GUEZ2X3YiICJzZXRfbmV3X2hhbmRsZXIodm9pZCAoKikodm9pZCkpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBzZXRiX185c3RyZWFtYnVmRlBjVDFpIiAic3RyZWFtYnVmOjpzZXRiKGNoYXIgKiwgY2hhciAqLCBpbnQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHNldGJfX0ZSM2lvc2kiICJzZXRiKGlvcyAmLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBzZXRidWZfXzExZnN0cmVhbWJhc2VGUGNpIiAiZnN0cmVhbWJhc2U6OnNldGJ1ZihjaGFyICosIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHNldGJ1Zl9fOXN0cmVhbWJ1ZkZQVWNpIiAic3RyZWFtYnVmOjpzZXRidWYodW5zaWduZWQgY2hhciAqLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBzZXRidWZfXzlzdHJlYW1idWZGUGNpVDIiICJzdHJlYW1idWY6OnNldGJ1ZihjaGFyICosIGludCwgaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgc2V0Zl9fM2lvc0ZsVDEiICJpb3M6OnNldGYobG9uZywgbG9uZykiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHNldGZpbGxfX0ZSM2lvc2kiICJzZXRmaWxsKGlvcyAmLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBzZXRnX185c3RyZWFtYnVmRlBjTjIxIiAic3RyZWFtYnVmOjpzZXRnKGNoYXIgKiwgY2hhciAqLCBjaGFyICopIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBzZXRwX185c3RyZWFtYnVmRlBjVDEiICJzdHJlYW1idWY6OnNldHAoY2hhciAqLCBjaGFyICopIgorCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBzcHV0bl9fOXN0cmVhbWJ1ZkZQQ2NpIiBcCisJInN0cmVhbWJ1Zjo6c3B1dG5cWyhcXSsoY29uc3QgY2hhcnxjaGFyIGNvbnN0KSBcWypcXSssIGludFxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIHN0cl9fRlBDY2kiIFwKKwkic3RyXFsoXF0rKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFsqXF0rLCBpbnRcWylcXSsiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHRpZV9fM2lvc0ZQN29zdHJlYW0iICJpb3M6OnRpZShvc3RyZWFtICopIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSB1Y29udjEwX19GVWxQYyIgInVjb252MTAodW5zaWduZWQgbG9uZywgY2hhciAqKSIKKworICAgIGdkYl90ZXN0ICJtYWludCBkZW0gd3JpdGVfXzdvc3RyZWFtRlBDY2kiIFwKKwkib3N0cmVhbTo6d3JpdGVcWyhcXSsoY29uc3QgY2hhcnxjaGFyIGNvbnN0KSBcWypcXSssIGludFxbKVxdKyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgeGdldF9fN2lzdHJlYW1GUGMiICJpc3RyZWFtOjp4Z2V0KGNoYXIgKikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHhzZ2V0bl9fOXN0cmVhbWJ1ZkZQY2kiICJzdHJlYW1idWY6OnhzZ2V0bihjaGFyICosIGludCkiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSB4c3B1dG5fXzlzdHJlYW1idWZGUENjaSIgXAorCSJzdHJlYW1idWY6OnhzcHV0blxbKFxdKyhjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdKywgaW50XFspXF0rIgorfQorCisjCisjICBUZXN0IGFybSBzdHlsZSBuYW1lIGRlbWFuZ2xpbmcKKyMKKworcHJvYyB0ZXN0X2FybV9zdHlsZV9kZW1hbmdsaW5nIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgIyBTZXQgdGhlIGRlbWFuZ2xpbmcgc3R5bGUgdG8gImFybSIgYW5kIHRoZW4gY2hlY2sgdG8gbWFrZSBzdXJlCisgICAgIyBpdCByZWFsbHkgZ290IHNldC4gIFJldHVybiBpZiB0aGUgc3R5bGUgZmFpbGVkIHRvIGdldCBzZXQgZm9yCisgICAgIyBzb21lIHJlYXNvbi4KKworICAgIHNlbmRfZ2RiICJzZXQgZGVtYW5nbGUtc3R5bGUgYXJtXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJzZXQgZGVtYW5nbGUtc3R5bGUgYXJtXFtcclxuXF0rJGdkYl9wcm9tcHQgJCIge30KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJzZXQgZGVtYW5nbGUtc3R5bGUgYXJtIGZhaWxlZCIgOyByZXR1cm4gfQorCXRpbWVvdXQgeyBmYWlsICJzZXQgZGVtYW5nbGUtc3R5bGUgYXJtIGZhaWxlZCAodGltZW91dCkiIDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAic2hvdyBkZW1hbmdsZS1zdHlsZVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiVGhlIGN1cnJlbnQgQ1xbK1xdKyBkZW1hbmdsaW5nIHN0eWxlIGlzIFwiYXJtXCIuXHJcbiRnZGJfcHJvbXB0ICQiIHt9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiZGVtYW5nbGluZyBzdHlsZSBub3Qgc2V0IHRvIGFybSIgfQorCXRpbWVvdXQgeyBmYWlsICJzaG93IGRlbWFuZ2xlLXN0eWxlIHRpbWVkIG91dCIgfQorICAgIH0KKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2R0X18yMVQ1X19wdF9fMTFfUEZpUFBkUHZfaUZ2IiAiVDU8aW50ICgqKShpbnQsIGRvdWJsZSAqKiwgdm9pZCAqKT46On5UNSh2b2lkKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18xY0ZpIiAiYzo6YyhpbnQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fZHRfXzExVDVfX3B0X18yX2lGdiIgIlQ1PGludD46On5UNSh2b2lkKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2R0X18xMVQ1X19wdF9fMl9jRnYiICJUNTxjaGFyPjo6flQ1KHZvaWQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfXzJUMkZpIiAiVDI6OlQyKGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fZHRfXzJUMUZ2IiAiVDE6On5UMSh2b2lkKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2R0X18xMlQ1X19wdF9fM18xeEZ2IiAiVDU8eD46On5UNSh2b2lkKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2R0X18xN1Q1X19wdF9fOF9QRmNQdl9pRnYiICJUNTxpbnQgKCopKGNoYXIsIHZvaWQgKik+Ojp+VDUodm9pZCkiCisKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0ZQMWNQQzFjVDEiIFwKKwkiZ1xbKFxdK2MgKlxbKlxdKywgKGNvbnN0IGN8YyBjb25zdCkgKlxbKlxdKywgYyAqXFsqXF0rXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRlBVbFBDVWxUMSIgXAorCSJnXFsoXF0rdW5zaWduZWQgbG9uZyBcWypcXSssIChjb25zdCB1bnNpZ25lZCBsb25nfHVuc2lnbmVkIGxvbmcgY29uc3QpIFxbKlxdKywgdW5zaWduZWQgbG9uZyBcWypcXStcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GUFVpUENVaVQxIiBcCisJImdcWyhcXSt1bnNpZ25lZCBpbnQgXFsqXF0rLCAoY29uc3QgdW5zaWduZWQgaW50fHVuc2lnbmVkIGludCBjb25zdCkgXFsqXF0rLCB1bnNpZ25lZCBpbnQgXFsqXF0rXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRlBVc1BDVXNUMSIgXAorCSJnXFsoXF0rdW5zaWduZWQgc2hvcnQgXFsqXF0rLCAoY29uc3QgdW5zaWduZWQgc2hvcnR8dW5zaWduZWQgc2hvcnQgY29uc3QpIFxbKlxdKywgdW5zaWduZWQgc2hvcnQgXFsqXF0rXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRlBVY1BDVWNUMSIgXAorCSJnXFsoXF0rdW5zaWduZWQgY2hhciBcWypcXSssIChjb25zdCB1bnNpZ25lZCBjaGFyfHVuc2lnbmVkIGNoYXIgY29uc3QpIFxbKlxdKywgdW5zaWduZWQgY2hhciBcWypcXStcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVRQbFBDbFQyIiBcCisJImdcWyhcXStULCBsb25nIFxbKlxdKywgKGNvbnN0IGxvbmd8bG9uZyBjb25zdCkgXFsqXF0rLCBsb25nIFxbKlxdK1xbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxUlJsUkNsVDIiIFwKKwkiZ1xbKFxdK1IsIGxvbmcgJiwgKGNvbnN0IGxvbmd8bG9uZyBjb25zdCkgJiwgbG9uZyAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFUUGlQQ2lUMiIgXAorCSJnXFsoXF0rVCwgaW50IFxbKlxdKywgKGNvbnN0IGludHxpbnQgY29uc3QpIFxbKlxdKywgaW50IFxbKlxdK1xbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxUlJpUkNpVDIiIFwKKwkiZ1xbKFxdK1IsIGludCAmLCAoY29uc3QgaW50fGludCBjb25zdCkgJiwgaW50ICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVRQc1BDc1QyIiBcCisJImdcWyhcXStULCBzaG9ydCBcWypcXSssIChjb25zdCBzaG9ydHxzaG9ydCBjb25zdCkgXFsqXF0rLCBzaG9ydCBcWypcXStcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVJSc1JDc1QyIiBcCisJImdcWyhcXStSLCBzaG9ydCAmLCAoY29uc3Qgc2hvcnR8c2hvcnQgY29uc3QpICYsIHNob3J0ICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVRQY1BDY1QyIiBcCisJImdcWyhcXStULCBjaGFyIFxbKlxdKywgKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFsqXF0rLCBjaGFyIFxbKlxdK1xbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxUlJjUkNjVDIiIFwKKwkiZ1xbKFxdK1IsIGNoYXIgJiwgKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgJiwgY2hhciAmXFspXF0rIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfXzIxVDVfX3B0X18xMV9QRmlQUGRQdl9pRmkiICJUNTxpbnQgKCopKGludCwgZG91YmxlICoqLCB2b2lkICopPjo6VDUoaW50KSIKKworICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19ndF9fRlJDMlQyYyIgXAorCSJvcGVyYXRvcj5cWyhcXSsoY29uc3QgVDJ8VDIgY29uc3QpICYsIGNoYXJcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX2dlX19GUkMyVDJjIiBcCisJIm9wZXJhdG9yPj1cWyhcXSsoY29uc3QgVDJ8VDIgY29uc3QpICYsIGNoYXJcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX2x0X19GUkMyVDJjIiBcCisJIm9wZXJhdG9yPFxbKFxdKyhjb25zdCBUMnxUMiBjb25zdCkgJiwgY2hhclxbKVxdKyIKKworICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19sZV9fRlJDMlQyYyIgXAorCSJvcGVyYXRvcjw9XFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSAmLCBjaGFyXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19uZV9fRlJDMlQyYyIgXAorCSJvcGVyYXRvciE9XFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSAmLCBjaGFyXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19lcV9fRlJDMlQyYyIgXAorCSJvcGVyYXRvcj09XFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSAmLCBjaGFyXFspXF0rIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FtZF9fRlIyVDJpIiAib3BlcmF0b3IlPShUMiAmLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2Fkdl9fRlIyVDJpIiAib3BlcmF0b3IvPShUMiAmLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FtdV9fRlIyVDJpIiAib3BlcmF0b3IqPShUMiAmLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FtaV9fRlIyVDJpIiAib3BlcmF0b3ItPShUMiAmLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FwbF9fRlIyVDJpIiAib3BlcmF0b3IrPShUMiAmLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX253X18yVDFTRlVpIiAiVDE6Om9wZXJhdG9yIG5ldyh1bnNpZ25lZCBpbnQpIHN0YXRpYyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19kbF9fMlQxU0ZQdiIgIlQxOjpvcGVyYXRvciBkZWxldGUodm9pZCAqKSBzdGF0aWMiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHB1dF9fMlQ3U0ZpIiAiVDc6OnB1dChpbnQpIHN0YXRpYyIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2RsX18xMlQ1X19wdF9fM18xeFNGUHYiICJUNTx4Pjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGhfX0ZVYyIgImgodW5zaWduZWQgY2hhcikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGZfX0ZpYyIgImYoaW50LCBjaGFyKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgaF9fRlVpIiAiaCh1bnNpZ25lZCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBoX19GY2kiICJoKGNoYXIsIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGhfX0ZVbCIgImgodW5zaWduZWQgbG9uZykiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGhfX0ZjbCIgImgoY2hhciwgbG9uZykiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGhfX0ZVcyIgImgodW5zaWduZWQgc2hvcnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBoX19GY3MiICJoKGNoYXIsIHNob3J0KSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fYW1kX19GUjJUMlJDMlQyIiBcCisJIm9wZXJhdG9yJT1cWyhcXStUMiAmLCAoY29uc3QgVDJ8VDIgY29uc3QpICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX2Fkdl9fRlIyVDJSQzJUMiIgXAorCSJvcGVyYXRvci89XFsoXF0rVDIgJiwgKGNvbnN0IFQyfFQyIGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19hbXVfX0ZSMlQyUkMyVDIiIFwKKwkib3BlcmF0b3JcWypcXSs9XFsoXF0rVDIgJiwgKGNvbnN0IFQyfFQyIGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19hbWlfX0ZSMlQyUkMyVDIiIFwKKwkib3BlcmF0b3ItPVxbKFxdK1QyICYsIChjb25zdCBUMnxUMiBjb25zdCkgJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fYXBsX19GUjJUMlJDMlQyIiBcCisJIm9wZXJhdG9yXFsrXF0rPVxbKFxdK1QyICYsIChjb25zdCBUMnxUMiBjb25zdCkgJlxbKVxdKyIKKworICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFTUlBVbFJQQ1VsVDIiIFwKKwkiZ1xbKFxdK1MsIHVuc2lnbmVkIGxvbmcgXFsqXF0rJiwgKGNvbnN0IHVuc2lnbmVkIGxvbmd8dW5zaWduZWQgbG9uZyBjb25zdCkgXFsqXF0rJiwgdW5zaWduZWQgbG9uZyBcWypcXSsmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFTUlBVaVJQQ1VpVDIiIFwKKwkiZ1xbKFxdK1MsIHVuc2lnbmVkIGludCBcWypcXSsmLCAoY29uc3QgdW5zaWduZWQgaW50fHVuc2lnbmVkIGludCBjb25zdCkgXFsqXF0rJiwgdW5zaWduZWQgaW50IFxbKlxdKyZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVNSUFVzUlBDVXNUMiIgXAorCSJnXFsoXF0rUywgdW5zaWduZWQgc2hvcnQgXFsqXF0rJiwgKGNvbnN0IHVuc2lnbmVkIHNob3J0fHVuc2lnbmVkIHNob3J0IGNvbnN0KSBcWypcXSsmLCB1bnNpZ25lZCBzaG9ydCBcWypcXSsmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFTUlBVY1JQQ1VjVDIiIFwKKwkiZ1xbKFxdK1MsIHVuc2lnbmVkIGNoYXIgXFsqXF0rJiwgKGNvbnN0IHVuc2lnbmVkIGNoYXJ8dW5zaWduZWQgY2hhciBjb25zdCkgXFsqXF0rJiwgdW5zaWduZWQgY2hhciBcWypcXSsmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFUMVNSUGxSUENsVDMiIFwKKwkiZ1xbKFxdK1QsIFMsIGxvbmcgXFsqXF0rJiwgKGNvbnN0IGxvbmd8bG9uZyBjb25zdCkgXFsqXF0rJiwgbG9uZyBcWypcXSsmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFUMVNSUGlSUENpVDMiIFwKKwkiZ1xbKFxdK1QsIFMsIGludCBcWypcXSsmLCAoY29uc3QgaW50fGludCBjb25zdCkgXFsqXF0rJiwgaW50IFxbKlxdKyZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVQxU1JQY1JQQ2NUMyIgXAorCSJnXFsoXF0rVCwgUywgY2hhciBcWypcXSsmLCAoY29uc3QgY2hhcnxjaGFyIGNvbnN0KSBcWypcXSsmLCBjaGFyIFxbKlxdKyZcWylcXSsiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgWF9fMTJUNV9fcHRfXzNfMXgiICJUNTx4Pjo6WCIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18xMVQ1X19wdF9fMl9pRmkiICJUNTxpbnQ+OjpUNShpbnQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfXzExVDVfX3B0X18yX2NGaSIgIlQ1PGNoYXI+OjpUNShpbnQpIgorCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX2d0X19GUkMyVDJUMSIgXAorCSJvcGVyYXRvcj5cWyhcXSsoY29uc3QgVDJ8VDIgY29uc3QpICYsIChjb25zdCBUMnxUMiBjb25zdCkgJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fZ2VfX0ZSQzJUMlQxIiBcCisJIm9wZXJhdG9yPj1cWyhcXSsoY29uc3QgVDJ8VDIgY29uc3QpICYsIChjb25zdCBUMnxUMiBjb25zdCkgJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fbHRfX0ZSQzJUMlQxIiBcCisJIm9wZXJhdG9yPFxbKFxdKyhjb25zdCBUMnxUMiBjb25zdCkgJiwgKGNvbnN0IFQyfFQyIGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19sZV9fRlJDMlQyVDEiIFwKKwkib3BlcmF0b3I8PVxbKFxdKyhjb25zdCBUMnxUMiBjb25zdCkgJiwgKGNvbnN0IFQyfFQyIGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19uZV9fRlJDMlQyVDEiIFwKKwkib3BlcmF0b3IhPVxbKFxdKyhjb25zdCBUMnxUMiBjb25zdCkgJiwgKGNvbnN0IFQyfFQyIGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19lcV9fRlJDMlQyVDEiIFwKKwkib3BlcmF0b3I9PVxbKFxdKyhjb25zdCBUMnxUMiBjb25zdCkgJiwgKGNvbnN0IFQyfFQyIGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRmNSMWNSQzFjVDIiIFwKKwkiZ1xbKFxdK2NoYXIsIGMgJiwgKGNvbnN0IGN8YyBjb25zdCkgJiwgYyAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRmNSUGRSUENkVDIiIFwKKwkiZ1xbKFxdK2NoYXIsIGRvdWJsZSAqXFsqXF0rJiwgKGNvbnN0IGRvdWJsZXxkb3VibGUgY29uc3QpICpcWypcXSsmLCBkb3VibGUgKlxbKlxdKyZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GY1JQZlJQQ2ZUMiIgXAorCSJnXFsoXF0rY2hhciwgZmxvYXQgKlxbKlxdKyYsIChjb25zdCBmbG9hdHxmbG9hdCBjb25zdCkgKlxbKlxdKyYsIGZsb2F0ICpcWypcXSsmXFspXF0rIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBoX19GY1QxIiAiaChjaGFyLCBjaGFyKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZl9fRmljZCIgImYoaW50LCBjaGFyLCBkb3VibGUpIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFUMVNkUlBzUlBDc1Q0IiBcCisJImdcWyhcXStULCBTLCBkb3VibGUsIHNob3J0IFxbKlxdKyYsIChjb25zdCBzaG9ydHxzaG9ydCBjb25zdCkgXFsqXF0rJiwgc2hvcnQgXFsqXF0rJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxY0MxY1QxIiBcCisJImdcWyhcXStjLCAoY29uc3QgY3xjIGNvbnN0KSwgY1xbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0ZQZFBDZFQxIiBcCisJImdcWyhcXStkb3VibGUgKlxbKlxdKywgKGNvbnN0IGRvdWJsZXxkb3VibGUgY29uc3QpICpcWypcXSssIGRvdWJsZSAqXFsqXF0rXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRlBmUENmVDEiIFwKKwkiZ1xbKFxdK2Zsb2F0ICpcWypcXSssIChjb25zdCBmbG9hdHxmbG9hdCBjb25zdCkgKlxbKlxdKywgZmxvYXQgKlxbKlxdK1xbKVxdKyIKKworICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRlVsQ1VsVDEiIFwKKwkiZ1xbKFxdK3Vuc2lnbmVkIGxvbmcsIChjb25zdCB1bnNpZ25lZCBsb25nfHVuc2lnbmVkIGxvbmcgY29uc3QpLCB1bnNpZ25lZCBsb25nXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRlBsUENsVDEiIFwKKwkiZ1xbKFxdK2xvbmcgXFsqXF0rLCAoY29uc3QgbG9uZ3xsb25nIGNvbnN0KSBcWypcXSssIGxvbmcgXFsqXF0rXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRlVpQ1VpVDEiIFwKKwkiZ1xbKFxdK3Vuc2lnbmVkIGludCwgKGNvbnN0IHVuc2lnbmVkIGludHx1bnNpZ25lZCBpbnQgY29uc3QpLCB1bnNpZ25lZCBpbnRcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GUGlQQ2lUMSIgXAorCSJnXFsoXF0raW50IFxbKlxdKywgKGNvbnN0IGludHxpbnQgY29uc3QpIFxbKlxdKywgaW50IFxbKlxdK1xbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0ZVc0NVc1QxIiBcCisJImdcWyhcXSt1bnNpZ25lZCBzaG9ydCwgKGNvbnN0IHVuc2lnbmVkIHNob3J0fHVuc2lnbmVkIHNob3J0IGNvbnN0KSwgdW5zaWduZWQgc2hvcnRcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GUHNQQ3NUMSIgXAorCSJnXFsoXF0rc2hvcnQgXFsqXF0rLCAoY29uc3Qgc2hvcnR8c2hvcnQgY29uc3QpIFxbKlxdKywgc2hvcnQgXFsqXF0rXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRlVjQ1VjVDEiIFwKKwkiZ1xbKFxdK3Vuc2lnbmVkIGNoYXIsIChjb25zdCB1bnNpZ25lZCBjaGFyfHVuc2lnbmVkIGNoYXIgY29uc3QpLCB1bnNpZ25lZCBjaGFyXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRlBjUENjVDEiIFwKKwkiZ1xbKFxdK2NoYXIgXFsqXF0rLCAoY29uc3QgY2hhcnxjaGFyIGNvbnN0KSBcWypcXSssIGNoYXIgXFsqXF0rXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFUbENsVDIiIFwKKwkiZ1xbKFxdK1QsIGxvbmcsIChjb25zdCBsb25nfGxvbmcgY29uc3QpLCBsb25nXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFUaUNpVDIiIFwKKwkiZ1xbKFxdK1QsIGludCwgKGNvbnN0IGludHxpbnQgY29uc3QpLCBpbnRcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVRzQ3NUMiIgXAorCSJnXFsoXF0rVCwgc2hvcnQsIChjb25zdCBzaG9ydHxzaG9ydCBjb25zdCksIHNob3J0XFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFUY0NjVDIiIFwKKwkiZ1xbKFxdK1QsIGNoYXIsIChjb25zdCBjaGFyfGNoYXIgY29uc3QpLCBjaGFyXFspXF0rIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fZGxfXzE3VDVfX3B0X184X1BGY1B2X2lTRlB2IiAiVDU8aW50ICgqKShjaGFyLCB2b2lkICopPjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljIgorCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBwcmludGZfX0ZQQ2NlIiBcCisJInByaW50ZlxbKFxdKyhjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdKywuLi5cWylcXSsiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgWF9fMTdUNV9fcHRfXzhfUEZjUHZfaSIgIlQ1PGludCAoKikoY2hhciwgdm9pZCAqKT46OlgiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fMTJUNV9fcHRfXzNfMXhGaSIgIlQ1PHg+OjpUNShpbnQpIgorCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVNSVWxSQ1VsVDIiIFwKKwkiZ1xbKFxdK1MsIHVuc2lnbmVkIGxvbmcgJiwgKGNvbnN0IHVuc2lnbmVkIGxvbmd8dW5zaWduZWQgbG9uZyBjb25zdCkgJiwgdW5zaWduZWQgbG9uZyAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFTUlBsUlBDbFQyIiBcCisJImdcWyhcXStTLCBsb25nIFxbKlxdKyYsIChjb25zdCBsb25nfGxvbmcgY29uc3QpIFxbKlxdKyYsIGxvbmcgXFsqXF0rJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxUlJVaVJDVWlUMiIgXAorCSJnXFsoXF0rUiwgdW5zaWduZWQgaW50ICYsIChjb25zdCB1bnNpZ25lZCBpbnR8dW5zaWduZWQgaW50IGNvbnN0KSAmLCB1bnNpZ25lZCBpbnQgJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxU1JQaVJQQ2lUMiIgXAorCSJnXFsoXF0rUywgaW50IFxbKlxdKyYsIChjb25zdCBpbnR8aW50IGNvbnN0KSBcWypcXSsmLCBpbnQgXFsqXF0rJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxUlJVc1JDVXNUMiIgXAorCSJnXFsoXF0rUiwgdW5zaWduZWQgc2hvcnQgJiwgKGNvbnN0IHVuc2lnbmVkIHNob3J0fHVuc2lnbmVkIHNob3J0IGNvbnN0KSAmLCB1bnNpZ25lZCBzaG9ydCAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFTUlBzUlBDc1QyIiBcCisJImdcWyhcXStTLCBzaG9ydCBcWypcXSsmLCAoY29uc3Qgc2hvcnR8c2hvcnQgY29uc3QpIFxbKlxdKyYsIHNob3J0IFxbKlxdKyZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVJSVWNSQ1VjVDIiIFwKKwkiZ1xbKFxdK1IsIHVuc2lnbmVkIGNoYXIgJiwgKGNvbnN0IHVuc2lnbmVkIGNoYXJ8dW5zaWduZWQgY2hhciBjb25zdCkgJiwgdW5zaWduZWQgY2hhciAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFTUlBjUlBDY1QyIiBcCisJImdcWyhcXStTLCBjaGFyIFxbKlxdKyYsIChjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdKyYsIGNoYXIgXFsqXF0rJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxVDFSUmxSQ2xUMyIgXAorCSJnXFsoXF0rVCwgUiwgbG9uZyAmLCAoY29uc3QgbG9uZ3xsb25nIGNvbnN0KSAmLCBsb25nICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVQxUlJpUkNpVDMiIFwKKwkiZ1xbKFxdK1QsIFIsIGludCAmLCAoY29uc3QgaW50fGludCBjb25zdCkgJiwgaW50ICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVQxUlJzUkNzVDMiIFwKKwkiZ1xbKFxdK1QsIFIsIHNob3J0ICYsIChjb25zdCBzaG9ydHxzaG9ydCBjb25zdCkgJiwgc2hvcnQgJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxVDFSUmNSQ2NUMyIgXAorCSJnXFsoXF0rVCwgUiwgY2hhciAmLCAoY29uc3QgY2hhcnxjaGFyIGNvbnN0KSAmLCBjaGFyICZcWylcXSsiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19kbF9fMjFUNV9fcHRfXzExX1BGaVBQZFB2X2lTRlB2IiAiVDU8aW50ICgqKShpbnQsIGRvdWJsZSAqKiwgdm9pZCAqKT46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIHN0YXRpYyIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3N0ZF9fZm9vIiAiZ2xvYmFsIGRlc3RydWN0b3JzIGtleWVkIHRvIGZvbyIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX3N0aV9fYmFyIiAiZ2xvYmFsIGNvbnN0cnVjdG9ycyBrZXllZCB0byBiYXIiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZl9fRmljZFBjUEZjaV92IiAiZihpbnQsIGNoYXIsIGRvdWJsZSwgY2hhciAqLCB2b2lkICgqKShjaGFyLCBpbnQpKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZl9fRmljZFBjUEZpY192IiAiZihpbnQsIGNoYXIsIGRvdWJsZSwgY2hhciAqLCB2b2lkICgqKShpbnQsIGNoYXIpKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZ2V0X18yVDdTRnYiICJUNzo6Z2V0KHZvaWQpIHN0YXRpYyIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBYX18yMVQ1X19wdF9fMTFfUEZpUFBkUHZfaSIgIlQ1PGludCAoKikoaW50LCBkb3VibGUgKiosIHZvaWQgKik+OjpYIgorCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GY1JkUkNkVDIiIFwKKwkiZ1xbKFxdK2NoYXIsIGRvdWJsZSAmLCAoY29uc3QgZG91YmxlfGRvdWJsZSBjb25zdCkgJiwgZG91YmxlICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GY1JmUkNmVDIiIFwKKwkiZ1xbKFxdK2NoYXIsIGZsb2F0ICYsIChjb25zdCBmbG9hdHxmbG9hdCBjb25zdCkgJiwgZmxvYXQgJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fbWRfX0ZDMlQyaSIgXAorCSJvcGVyYXRvciVcWyhcXSsoY29uc3QgVDJ8VDIgY29uc3QpLCBpbnRcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX2R2X19GQzJUMmkiIFwKKwkib3BlcmF0b3IvXFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSwgaW50XFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19tbF9fRkMyVDJpIiBcCisJIm9wZXJhdG9yXFsqXF0rXFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSwgaW50XFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19taV9fRkMyVDJpIiBcCisJIm9wZXJhdG9yLVxbKFxdKyhjb25zdCBUMnxUMiBjb25zdCksIGludFxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fcGxfX0ZDMlQyaSIgXAorCSJvcGVyYXRvclxbK1xdK1xbKFxdKyhjb25zdCBUMnxUMiBjb25zdCksIGludFxbKVxdKyIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2RsX18xMVQ1X19wdF9fMl9pU0ZQdiIgIlQ1PGludD46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIHN0YXRpYyIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2RsX18xMVQ1X19wdF9fMl9jU0ZQdiIgIlQ1PGNoYXI+OjpvcGVyYXRvciBkZWxldGUodm9pZCAqKSBzdGF0aWMiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgaF9fRmMiICJoKGNoYXIpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBoX19GZCIgImgoZG91YmxlKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgaF9fRmYiICJoKGZsb2F0KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgaF9fRmkiICJoKGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGZfX0ZpIiAiZihpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBoX19GbCIgImgobG9uZykiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgaF9fRnMiICJoKHNob3J0KSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fbWRfX0ZDMlQyUkMyVDIiIFwKKwkib3BlcmF0b3IlXFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSwgKGNvbnN0IFQyfFQyIGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19kdl9fRkMyVDJSQzJUMiIgXAorCSJvcGVyYXRvci9cWyhcXSsoY29uc3QgVDJ8VDIgY29uc3QpLCAoY29uc3QgVDJ8VDIgY29uc3QpICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX21sX19GQzJUMlJDMlQyIiBcCisJIm9wZXJhdG9yXFsqXF0rXFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSwgKGNvbnN0IFQyfFQyIGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19taV9fRkMyVDJSQzJUMiIgXAorCSJvcGVyYXRvci1cWyhcXSsoY29uc3QgVDJ8VDIgY29uc3QpLCAoY29uc3QgVDJ8VDIgY29uc3QpICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX3BsX19GQzJUMlJDMlQyIiBcCisJIm9wZXJhdG9yXFsrXF0rXFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSwgKGNvbnN0IFQyfFQyIGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRmNSUDFjUlBDMWNUMiIgXAorCSJnXFsoXF0rY2hhciwgYyAqXFsqXF0rJiwgKGNvbnN0IGN8YyBjb25zdCkgKlxbKlxdKyYsIGMgKlxbKlxdKyZcWylcXSsiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgWF9fMTFUNV9fcHRfXzJfYyIgIlQ1PGNoYXI+OjpYIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIFhfXzExVDVfX3B0X18yX2kiICJUNTxpbnQ+OjpYIgorCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GZENkVDEiIFwKKwkiZ1xbKFxdK2RvdWJsZSwgKGNvbnN0IGRvdWJsZXxkb3VibGUgY29uc3QpLCBkb3VibGVcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GZkNmVDEiIFwKKwkiZ1xbKFxdK2Zsb2F0LCAoY29uc3QgZmxvYXR8ZmxvYXQgY29uc3QpLCBmbG9hdFxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0ZsQ2xUMSIgXAorCSJnXFsoXF0rbG9uZywgKGNvbnN0IGxvbmd8bG9uZyBjb25zdCksIGxvbmdcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GaUNpVDEiIFwKKwkiZ1xbKFxdK2ludCwgKGNvbnN0IGludHxpbnQgY29uc3QpLCBpbnRcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19Gc0NzVDEiIFwKKwkiZ1xbKFxdK3Nob3J0LCAoY29uc3Qgc2hvcnR8c2hvcnQgY29uc3QpLCBzaG9ydFxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0ZjQ2NUMSIgXAorCSJnXFsoXF0rY2hhciwgKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCksIGNoYXJcWylcXSsiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fMTdUNV9fcHRfXzhfUEZjUHZfaUZpIiAiVDU8aW50ICgqKShjaGFyLCB2b2lkICopPjo6VDUoaW50KSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBmX19GaWNkUGMiICJmKGludCwgY2hhciwgZG91YmxlLCBjaGFyICopIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX253X19GVWkiICJvcGVyYXRvciBuZXcodW5zaWduZWQgaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fUTNfMlQxMWExYlNGaSIgIlQxOjphOjpiOjpiKGludCkgc3RhdGljIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2R0X19RM18yVDExYTFiU0ZpIiAiVDE6OmE6OmI6On5iKGludCkgc3RhdGljIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBwdXRfX1EzXzJUMTFhMWJTRmkiICJUMTo6YTo6Yjo6cHV0KGludCkgc3RhdGljIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBnZXRfX1EyXzJUMTFhU0Z2IiAiVDE6OmE6OmdldCh2b2lkKSBzdGF0aWMiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHB1dF9fMlQxU0ZpIiAiVDE6OnB1dChpbnQpIHN0YXRpYyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgcHV0X19RNV8yVDExYTFiMWMxZFNGaSIgIlQxOjphOjpiOjpjOjpkOjpwdXQoaW50KSBzdGF0aWMiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGdldF9fUTRfMlQxMWExYjFjU0Z2IiAiVDE6OmE6OmI6OmM6OmdldCh2b2lkKSBzdGF0aWMiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHB1dF9fUTJfMlQxMWFTRmkiICJUMTo6YTo6cHV0KGludCkgc3RhdGljIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBwdXRfX1E0XzJUMTFhMWIxY1NGaSIgIlQxOjphOjpiOjpjOjpwdXQoaW50KSBzdGF0aWMiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGdldF9fUTNfMlQxMWExYlNGdiIgIlQxOjphOjpiOjpnZXQodm9pZCkgc3RhdGljIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBnZXRfXzJUMVNGdiIgIlQxOjpnZXQodm9pZCkgc3RhdGljIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBnZXRfX1E1XzJUMTFhMWIxYzFkU0Z2IiAiVDE6OmE6OmI6OmM6OmQ6OmdldCh2b2lkKSBzdGF0aWMiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19kdF9fMTFUMV9fcHRfXzJfY0Z2IiAiVDE8Y2hhcj46On5UMSh2b2lkKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2R0X18xMlQxX19wdF9fM18xdEZ2IiAiVDE8dD46On5UMSh2b2lkKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2RsX18xMlQxX19wdF9fM18xdFNGUHYiICJUMTx0Pjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfXzExVDFfX3B0X18yX2NGaSIgIlQxPGNoYXI+OjpUMShpbnQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfXzExVDFfX3B0X18yX2NGdiIgIlQxPGNoYXI+OjpUMSh2b2lkKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18xMlQxX19wdF9fM18xdEZpIiAiVDE8dD46OlQxKGludCkiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fMTJUMV9fcHRfXzNfMXRGdiIgIlQxPHQ+OjpUMSh2b2lkKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2RsX18xMVQxX19wdF9fMl9jU0ZQdiIgIlQxPGNoYXI+OjpvcGVyYXRvciBkZWxldGUodm9pZCAqKSBzdGF0aWMiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgYmFyX18zZm9vRlB2IiAgICAgICAiZm9vOjpiYXIodm9pZCAqKSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGJhcl9fM2Zvb0ZQQ3YiIFwKKwkgICAgICJmb286OmJhclxbKFxdKyhjb25zdCB2b2lkfHZvaWQgY29uc3QpICpcWypcXStcWylcXSsiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGJhcl9fM2Zvb0NGUHYiICAgICAgImZvbzo6YmFyKHZvaWQgKikgY29uc3QiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBiYXJfXzNmb29DRlBDdiIgXAorCSAgICAiZm9vOjpiYXJcWyhcXSsoY29uc3Qgdm9pZHx2b2lkIGNvbnN0KSAqXFsqXF0rXFspXF0rIGNvbnN0IgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2VxX18zZm9vRlIzZm9vIiAgICJmb286Om9wZXJhdG9yPT0oZm9vICYpIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19lcV9fM2Zvb0ZSQzNmb28iIFwKKwkgImZvbzo6b3BlcmF0b3I9PVxbKFxdKyhjb25zdCBmb298Zm9vIGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2VxX18zZm9vQ0ZSM2ZvbyIgICJmb286Om9wZXJhdG9yPT0oZm9vICYpIGNvbnN0IgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19lcV9fM2Zvb0NGUkMzZm9vIiBcCisJImZvbzo6b3BlcmF0b3I9PVxbKFxdKyhjb25zdCBmb298Zm9vIGNvbnN0KSAmXFspXF0rIGNvbnN0IgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGVsZW1fXzE1dmVjdG9yX19wdF9fMl9kRmkiICJ2ZWN0b3I8ZG91YmxlPjo6ZWxlbShpbnQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGVsZW1fXzE1dmVjdG9yX19wdF9fMl9pRmkiICJ2ZWN0b3I8aW50Pjo6ZWxlbShpbnQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfXzE1dmVjdG9yX19wdF9fMl9kRmkiICJ2ZWN0b3I8ZG91YmxlPjo6dmVjdG9yKGludCkiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fMTV2ZWN0b3JfX3B0X18yX2lGaSIgInZlY3RvcjxpbnQ+Ojp2ZWN0b3IoaW50KSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18yNURMaXN0Tm9kZV9fcHRfXzlfUjZSTGFiZWxGUjZSTGFiZWxQMjVETGlzdE5vZGVfX3B0X185X1I2UkxhYmVsVDIiIFwKKwkiRExpc3ROb2RlPFJMYWJlbCAmPjo6RExpc3ROb2RlKFJMYWJlbCAmLCBETGlzdE5vZGU8UkxhYmVsICY+ICosIERMaXN0Tm9kZTxSTGFiZWwgJj4gKikiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgYmFyX18zZm9vRmlUMTZGb29CYXIiICJmb286OmJhcihpbnQsIGludCwgRm9vQmFyKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBiYXJfXzNmb29GUGlONTFQZE4zN1BjTjIxMVQxaU4yMTUiIFwKKyAgICAgICJmb286OmJhcihpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBkb3VibGUgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICosIGludCwgaW50LCBpbnQpIgorCit9CisKK3Byb2MgdGVzdF9ocF9zdHlsZV9kZW1hbmdsaW5nIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgIyBTZXQgdGhlIGRlbWFuZ2xpbmcgc3R5bGUgdG8gImhwIiBhbmQgdGhlbiBjaGVjayB0byBtYWtlIHN1cmUKKyAgICAjIGl0IHJlYWxseSBnb3Qgc2V0LiAgUmV0dXJuIGlmIHRoZSBzdHlsZSBmYWlsZWQgdG8gZ2V0IHNldCBmb3IKKyAgICAjIHNvbWUgcmVhc29uLgorCisgICAgc2VuZF9nZGIgInNldCBkZW1hbmdsZS1zdHlsZSBocFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAic2V0IGRlbWFuZ2xlLXN0eWxlIGhwXFtcclxuXF0rJGdkYl9wcm9tcHQgJCIge30KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJzZXQgZGVtYW5nbGUtc3R5bGUgaHAgZmFpbGVkIiA7IHJldHVybiB9CisJdGltZW91dCB7IGZhaWwgInNldCBkZW1hbmdsZS1zdHlsZSBocCBmYWlsZWQgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInNob3cgZGVtYW5nbGUtc3R5bGVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIlRoZSBjdXJyZW50IENcWytcXSsgZGVtYW5nbGluZyBzdHlsZSBpcyBcImhwXCIuXHJcbiRnZGJfcHJvbXB0ICQiIHt9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiZGVtYW5nbGluZyBzdHlsZSBub3Qgc2V0IHRvIGhwIiB9CisJdGltZW91dCB7IGZhaWwgInNob3cgZGVtYW5nbGUtc3R5bGUgdGltZWQgb3V0IChIUCkiIH0KKyAgICB9CisKKyAgICAjIEhQIGFDQyBtYW5nbGluZyBzdHlsZSBpcyBiYXNlZCBvbiBBUk0gZm9yIGFsbCB0aGUgYmFzaWMgc3R1ZmYsCisgICAgIyBzbyBmaXJzdCB3ZSB1c2Ugc29tZSBvZiB0aGUgQVJNIHRlc3RzIGhlcmUuICBMYXRlciB3ZSBoYXZlIEhQLXNwZWNpZmljCisgICAgIyB0ZXN0cy4KKyAgICAgICAgCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GUDFjUEMxY1QxIiBcCisJImdcWyhcXStjICpcWypcXSssIChjb25zdCBjfGMgY29uc3QpICpcWypcXSssIGMgKlxbKlxdK1xbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0ZQVWxQQ1VsVDEiIFwKKwkiZ1xbKFxdK3Vuc2lnbmVkIGxvbmcgXFsqXF0rLCAoY29uc3QgdW5zaWduZWQgbG9uZ3x1bnNpZ25lZCBsb25nIGNvbnN0KSBcWypcXSssIHVuc2lnbmVkIGxvbmcgXFsqXF0rXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRlBVaVBDVWlUMSIgXAorCSJnXFsoXF0rdW5zaWduZWQgaW50IFxbKlxdKywgKGNvbnN0IHVuc2lnbmVkIGludHx1bnNpZ25lZCBpbnQgY29uc3QpIFxbKlxdKywgdW5zaWduZWQgaW50IFxbKlxdK1xbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0ZQVXNQQ1VzVDEiIFwKKwkiZ1xbKFxdK3Vuc2lnbmVkIHNob3J0IFxbKlxdKywgKGNvbnN0IHVuc2lnbmVkIHNob3J0fHVuc2lnbmVkIHNob3J0IGNvbnN0KSBcWypcXSssIHVuc2lnbmVkIHNob3J0IFxbKlxdK1xbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0ZQVWNQQ1VjVDEiIFwKKwkiZ1xbKFxdK3Vuc2lnbmVkIGNoYXIgXFsqXF0rLCAoY29uc3QgdW5zaWduZWQgY2hhcnx1bnNpZ25lZCBjaGFyIGNvbnN0KSBcWypcXSssIHVuc2lnbmVkIGNoYXIgXFsqXF0rXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFUUGxQQ2xUMiIgXAorCSJnXFsoXF0rVCwgbG9uZyBcWypcXSssIChjb25zdCBsb25nfGxvbmcgY29uc3QpIFxbKlxdKywgbG9uZyBcWypcXStcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVJSbFJDbFQyIiBcCisJImdcWyhcXStSLCBsb25nICYsIChjb25zdCBsb25nfGxvbmcgY29uc3QpICYsIGxvbmcgJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxVFBpUENpVDIiIFwKKwkiZ1xbKFxdK1QsIGludCBcWypcXSssIChjb25zdCBpbnR8aW50IGNvbnN0KSBcWypcXSssIGludCBcWypcXStcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVJSaVJDaVQyIiBcCisJImdcWyhcXStSLCBpbnQgJiwgKGNvbnN0IGludHxpbnQgY29uc3QpICYsIGludCAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFUUHNQQ3NUMiIgXAorCSJnXFsoXF0rVCwgc2hvcnQgXFsqXF0rLCAoY29uc3Qgc2hvcnR8c2hvcnQgY29uc3QpIFxbKlxdKywgc2hvcnQgXFsqXF0rXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFSUnNSQ3NUMiIgXAorCSJnXFsoXF0rUiwgc2hvcnQgJiwgKGNvbnN0IHNob3J0fHNob3J0IGNvbnN0KSAmLCBzaG9ydCAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFUUGNQQ2NUMiIgXAorCSJnXFsoXF0rVCwgY2hhciBcWypcXSssIChjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdKywgY2hhciBcWypcXStcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVJSY1JDY1QyIiBcCisJImdcWyhcXStSLCBjaGFyICYsIChjb25zdCBjaGFyfGNoYXIgY29uc3QpICYsIGNoYXIgJlxbKVxdKyIKKworICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19ndF9fRlJDMlQyYyIgXAorCSJvcGVyYXRvcj5cWyhcXSsoY29uc3QgVDJ8VDIgY29uc3QpICYsIGNoYXJcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX2dlX19GUkMyVDJjIiBcCisJIm9wZXJhdG9yPj1cWyhcXSsoY29uc3QgVDJ8VDIgY29uc3QpICYsIGNoYXJcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX2x0X19GUkMyVDJjIiBcCisJIm9wZXJhdG9yPFxbKFxdKyhjb25zdCBUMnxUMiBjb25zdCkgJiwgY2hhclxbKVxdKyIKKworICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19sZV9fRlJDMlQyYyIgXAorCSJvcGVyYXRvcjw9XFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSAmLCBjaGFyXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19uZV9fRlJDMlQyYyIgXAorCSJvcGVyYXRvciE9XFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSAmLCBjaGFyXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19lcV9fRlJDMlQyYyIgXAorCSJvcGVyYXRvcj09XFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSAmLCBjaGFyXFspXF0rIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FtZF9fRlIyVDJpIiAib3BlcmF0b3IlPShUMiAmLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2Fkdl9fRlIyVDJpIiAib3BlcmF0b3IvPShUMiAmLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FtdV9fRlIyVDJpIiAib3BlcmF0b3IqPShUMiAmLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FtaV9fRlIyVDJpIiAib3BlcmF0b3ItPShUMiAmLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2FwbF9fRlIyVDJpIiAib3BlcmF0b3IrPShUMiAmLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX253X18yVDFTRlVpIiAiVDE6Om9wZXJhdG9yIG5ldyh1bnNpZ25lZCBpbnQpIHN0YXRpYyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19kbF9fMlQxU0ZQdiIgIlQxOjpvcGVyYXRvciBkZWxldGUodm9pZCAqKSBzdGF0aWMiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHB1dF9fMlQ3U0ZpIiAiVDc6OnB1dChpbnQpIHN0YXRpYyIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBoX19GVWMiICJoKHVuc2lnbmVkIGNoYXIpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBmX19GaWMiICJmKGludCwgY2hhcikiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGhfX0ZVaSIgImgodW5zaWduZWQgaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgaF9fRmNpIiAiaChjaGFyLCBpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBoX19GVWwiICJoKHVuc2lnbmVkIGxvbmcpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBoX19GY2wiICJoKGNoYXIsIGxvbmcpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBoX19GVXMiICJoKHVuc2lnbmVkIHNob3J0KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgaF9fRmNzIiAiaChjaGFyLCBzaG9ydCkiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX2FtZF9fRlIyVDJSQzJUMiIgXAorCSJvcGVyYXRvciU9XFsoXF0rVDIgJiwgKGNvbnN0IFQyfFQyIGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19hZHZfX0ZSMlQyUkMyVDIiIFwKKwkib3BlcmF0b3IvPVxbKFxdK1QyICYsIChjb25zdCBUMnxUMiBjb25zdCkgJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fYW11X19GUjJUMlJDMlQyIiBcCisJIm9wZXJhdG9yXFsqXF0rPVxbKFxdK1QyICYsIChjb25zdCBUMnxUMiBjb25zdCkgJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fYW1pX19GUjJUMlJDMlQyIiBcCisJIm9wZXJhdG9yLT1cWyhcXStUMiAmLCAoY29uc3QgVDJ8VDIgY29uc3QpICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX2FwbF9fRlIyVDJSQzJUMiIgXAorCSJvcGVyYXRvclxbK1xdKz1cWyhcXStUMiAmLCAoY29uc3QgVDJ8VDIgY29uc3QpICZcWylcXSsiCisKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxU1JQVWxSUENVbFQyIiBcCisJImdcWyhcXStTLCB1bnNpZ25lZCBsb25nIFxbKlxdKyYsIChjb25zdCB1bnNpZ25lZCBsb25nfHVuc2lnbmVkIGxvbmcgY29uc3QpIFxbKlxdKyYsIHVuc2lnbmVkIGxvbmcgXFsqXF0rJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxU1JQVWlSUENVaVQyIiBcCisJImdcWyhcXStTLCB1bnNpZ25lZCBpbnQgXFsqXF0rJiwgKGNvbnN0IHVuc2lnbmVkIGludHx1bnNpZ25lZCBpbnQgY29uc3QpIFxbKlxdKyYsIHVuc2lnbmVkIGludCBcWypcXSsmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFTUlBVc1JQQ1VzVDIiIFwKKwkiZ1xbKFxdK1MsIHVuc2lnbmVkIHNob3J0IFxbKlxdKyYsIChjb25zdCB1bnNpZ25lZCBzaG9ydHx1bnNpZ25lZCBzaG9ydCBjb25zdCkgXFsqXF0rJiwgdW5zaWduZWQgc2hvcnQgXFsqXF0rJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxU1JQVWNSUENVY1QyIiBcCisJImdcWyhcXStTLCB1bnNpZ25lZCBjaGFyIFxbKlxdKyYsIChjb25zdCB1bnNpZ25lZCBjaGFyfHVuc2lnbmVkIGNoYXIgY29uc3QpIFxbKlxdKyYsIHVuc2lnbmVkIGNoYXIgXFsqXF0rJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxVDFTUlBsUlBDbFQzIiBcCisJImdcWyhcXStULCBTLCBsb25nIFxbKlxdKyYsIChjb25zdCBsb25nfGxvbmcgY29uc3QpIFxbKlxdKyYsIGxvbmcgXFsqXF0rJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxVDFTUlBpUlBDaVQzIiBcCisJImdcWyhcXStULCBTLCBpbnQgXFsqXF0rJiwgKGNvbnN0IGludHxpbnQgY29uc3QpIFxbKlxdKyYsIGludCBcWypcXSsmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFUMVNSUGNSUENjVDMiIFwKKwkiZ1xbKFxdK1QsIFMsIGNoYXIgXFsqXF0rJiwgKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFsqXF0rJiwgY2hhciBcWypcXSsmXFspXF0rIgorCisKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fZ3RfX0ZSQzJUMlQxIiBcCisJIm9wZXJhdG9yPlxbKFxdKyhjb25zdCBUMnxUMiBjb25zdCkgJiwgKGNvbnN0IFQyfFQyIGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19nZV9fRlJDMlQyVDEiIFwKKwkib3BlcmF0b3I+PVxbKFxdKyhjb25zdCBUMnxUMiBjb25zdCkgJiwgKGNvbnN0IFQyfFQyIGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19sdF9fRlJDMlQyVDEiIFwKKwkib3BlcmF0b3I8XFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSAmLCAoY29uc3QgVDJ8VDIgY29uc3QpICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX2xlX19GUkMyVDJUMSIgXAorCSJvcGVyYXRvcjw9XFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSAmLCAoY29uc3QgVDJ8VDIgY29uc3QpICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX25lX19GUkMyVDJUMSIgXAorCSJvcGVyYXRvciE9XFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSAmLCAoY29uc3QgVDJ8VDIgY29uc3QpICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX2VxX19GUkMyVDJUMSIgXAorCSJvcGVyYXRvcj09XFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSAmLCAoY29uc3QgVDJ8VDIgY29uc3QpICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GY1IxY1JDMWNUMiIgXAorCSJnXFsoXF0rY2hhciwgYyAmLCAoY29uc3QgY3xjIGNvbnN0KSAmLCBjICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GY1JQZFJQQ2RUMiIgXAorCSJnXFsoXF0rY2hhciwgZG91YmxlICpcWypcXSsmLCAoY29uc3QgZG91YmxlfGRvdWJsZSBjb25zdCkgKlxbKlxdKyYsIGRvdWJsZSAqXFsqXF0rJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0ZjUlBmUlBDZlQyIiBcCisJImdcWyhcXStjaGFyLCBmbG9hdCAqXFsqXF0rJiwgKGNvbnN0IGZsb2F0fGZsb2F0IGNvbnN0KSAqXFsqXF0rJiwgZmxvYXQgKlxbKlxdKyZcWylcXSsiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGhfX0ZjVDEiICJoKGNoYXIsIGNoYXIpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBmX19GaWNkIiAiZihpbnQsIGNoYXIsIGRvdWJsZSkiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVQxU2RSUHNSUENzVDQiIFwKKwkiZ1xbKFxdK1QsIFMsIGRvdWJsZSwgc2hvcnQgXFsqXF0rJiwgKGNvbnN0IHNob3J0fHNob3J0IGNvbnN0KSBcWypcXSsmLCBzaG9ydCBcWypcXSsmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFjQzFjVDEiIFwKKwkiZ1xbKFxdK2MsIChjb25zdCBjfGMgY29uc3QpLCBjXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRlBkUENkVDEiIFwKKwkiZ1xbKFxdK2RvdWJsZSAqXFsqXF0rLCAoY29uc3QgZG91YmxlfGRvdWJsZSBjb25zdCkgKlxbKlxdKywgZG91YmxlICpcWypcXStcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GUGZQQ2ZUMSIgXAorCSJnXFsoXF0rZmxvYXQgKlxbKlxdKywgKGNvbnN0IGZsb2F0fGZsb2F0IGNvbnN0KSAqXFsqXF0rLCBmbG9hdCAqXFsqXF0rXFspXF0rIgorCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GVWxDVWxUMSIgXAorCSJnXFsoXF0rdW5zaWduZWQgbG9uZywgKGNvbnN0IHVuc2lnbmVkIGxvbmd8dW5zaWduZWQgbG9uZyBjb25zdCksIHVuc2lnbmVkIGxvbmdcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GUGxQQ2xUMSIgXAorCSJnXFsoXF0rbG9uZyBcWypcXSssIChjb25zdCBsb25nfGxvbmcgY29uc3QpIFxbKlxdKywgbG9uZyBcWypcXStcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GVWlDVWlUMSIgXAorCSJnXFsoXF0rdW5zaWduZWQgaW50LCAoY29uc3QgdW5zaWduZWQgaW50fHVuc2lnbmVkIGludCBjb25zdCksIHVuc2lnbmVkIGludFxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0ZQaVBDaVQxIiBcCisJImdcWyhcXStpbnQgXFsqXF0rLCAoY29uc3QgaW50fGludCBjb25zdCkgXFsqXF0rLCBpbnQgXFsqXF0rXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRlVzQ1VzVDEiIFwKKwkiZ1xbKFxdK3Vuc2lnbmVkIHNob3J0LCAoY29uc3QgdW5zaWduZWQgc2hvcnR8dW5zaWduZWQgc2hvcnQgY29uc3QpLCB1bnNpZ25lZCBzaG9ydFxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0ZQc1BDc1QxIiBcCisJImdcWyhcXStzaG9ydCBcWypcXSssIChjb25zdCBzaG9ydHxzaG9ydCBjb25zdCkgXFsqXF0rLCBzaG9ydCBcWypcXStcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GVWNDVWNUMSIgXAorCSJnXFsoXF0rdW5zaWduZWQgY2hhciwgKGNvbnN0IHVuc2lnbmVkIGNoYXJ8dW5zaWduZWQgY2hhciBjb25zdCksIHVuc2lnbmVkIGNoYXJcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GUGNQQ2NUMSIgXAorCSJnXFsoXF0rY2hhciBcWypcXSssIChjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdKywgY2hhciBcWypcXStcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVRsQ2xUMiIgXAorCSJnXFsoXF0rVCwgbG9uZywgKGNvbnN0IGxvbmd8bG9uZyBjb25zdCksIGxvbmdcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVRpQ2lUMiIgXAorCSJnXFsoXF0rVCwgaW50LCAoY29uc3QgaW50fGludCBjb25zdCksIGludFxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxVHNDc1QyIiBcCisJImdcWyhcXStULCBzaG9ydCwgKGNvbnN0IHNob3J0fHNob3J0IGNvbnN0KSwgc2hvcnRcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVRjQ2NUMiIgXAorCSJnXFsoXF0rVCwgY2hhciwgKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCksIGNoYXJcWylcXSsiCisKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIHByaW50Zl9fRlBDY2UiIFwKKwkicHJpbnRmXFsoXF0rKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFsqXF0rLC4uLlxbKVxdKyIKKworCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVNSVWxSQ1VsVDIiIFwKKwkiZ1xbKFxdK1MsIHVuc2lnbmVkIGxvbmcgJiwgKGNvbnN0IHVuc2lnbmVkIGxvbmd8dW5zaWduZWQgbG9uZyBjb25zdCkgJiwgdW5zaWduZWQgbG9uZyAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFTUlBsUlBDbFQyIiBcCisJImdcWyhcXStTLCBsb25nIFxbKlxdKyYsIChjb25zdCBsb25nfGxvbmcgY29uc3QpIFxbKlxdKyYsIGxvbmcgXFsqXF0rJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxUlJVaVJDVWlUMiIgXAorCSJnXFsoXF0rUiwgdW5zaWduZWQgaW50ICYsIChjb25zdCB1bnNpZ25lZCBpbnR8dW5zaWduZWQgaW50IGNvbnN0KSAmLCB1bnNpZ25lZCBpbnQgJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxU1JQaVJQQ2lUMiIgXAorCSJnXFsoXF0rUywgaW50IFxbKlxdKyYsIChjb25zdCBpbnR8aW50IGNvbnN0KSBcWypcXSsmLCBpbnQgXFsqXF0rJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxUlJVc1JDVXNUMiIgXAorCSJnXFsoXF0rUiwgdW5zaWduZWQgc2hvcnQgJiwgKGNvbnN0IHVuc2lnbmVkIHNob3J0fHVuc2lnbmVkIHNob3J0IGNvbnN0KSAmLCB1bnNpZ25lZCBzaG9ydCAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFTUlBzUlBDc1QyIiBcCisJImdcWyhcXStTLCBzaG9ydCBcWypcXSsmLCAoY29uc3Qgc2hvcnR8c2hvcnQgY29uc3QpIFxbKlxdKyYsIHNob3J0IFxbKlxdKyZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVJSVWNSQ1VjVDIiIFwKKwkiZ1xbKFxdK1IsIHVuc2lnbmVkIGNoYXIgJiwgKGNvbnN0IHVuc2lnbmVkIGNoYXJ8dW5zaWduZWQgY2hhciBjb25zdCkgJiwgdW5zaWduZWQgY2hhciAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRjFTUlBjUlBDY1QyIiBcCisJImdcWyhcXStTLCBjaGFyIFxbKlxdKyYsIChjb25zdCBjaGFyfGNoYXIgY29uc3QpIFxbKlxdKyYsIGNoYXIgXFsqXF0rJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxVDFSUmxSQ2xUMyIgXAorCSJnXFsoXF0rVCwgUiwgbG9uZyAmLCAoY29uc3QgbG9uZ3xsb25nIGNvbnN0KSAmLCBsb25nICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVQxUlJpUkNpVDMiIFwKKwkiZ1xbKFxdK1QsIFIsIGludCAmLCAoY29uc3QgaW50fGludCBjb25zdCkgJiwgaW50ICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GMVQxUlJzUkNzVDMiIFwKKwkiZ1xbKFxdK1QsIFIsIHNob3J0ICYsIChjb25zdCBzaG9ydHxzaG9ydCBjb25zdCkgJiwgc2hvcnQgJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0YxVDFSUmNSQ2NUMyIgXAorCSJnXFsoXF0rVCwgUiwgY2hhciAmLCAoY29uc3QgY2hhcnxjaGFyIGNvbnN0KSAmLCBjaGFyICZcWylcXSsiCisKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBmX19GaWNkUGNQRmNpX3YiICJmKGludCwgY2hhciwgZG91YmxlLCBjaGFyICosIHZvaWQgKCopKGNoYXIsIGludCkpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBmX19GaWNkUGNQRmljX3YiICJmKGludCwgY2hhciwgZG91YmxlLCBjaGFyICosIHZvaWQgKCopKGludCwgY2hhcikpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBnZXRfXzJUN1NGdiIgIlQ3OjpnZXQodm9pZCkgc3RhdGljIgorCisKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0ZjUmRSQ2RUMiIgXAorCSJnXFsoXF0rY2hhciwgZG91YmxlICYsIChjb25zdCBkb3VibGV8ZG91YmxlIGNvbnN0KSAmLCBkb3VibGUgJlxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGdfX0ZjUmZSQ2ZUMiIgXAorCSJnXFsoXF0rY2hhciwgZmxvYXQgJiwgKGNvbnN0IGZsb2F0fGZsb2F0IGNvbnN0KSAmLCBmbG9hdCAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19tZF9fRkMyVDJpIiBcCisJIm9wZXJhdG9yJVxbKFxdKyhjb25zdCBUMnxUMiBjb25zdCksIGludFxbKVxdKyIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fZHZfX0ZDMlQyaSIgXAorCSJvcGVyYXRvci9cWyhcXSsoY29uc3QgVDJ8VDIgY29uc3QpLCBpbnRcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX21sX19GQzJUMmkiIFwKKwkib3BlcmF0b3JcWypcXStcWyhcXSsoY29uc3QgVDJ8VDIgY29uc3QpLCBpbnRcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX21pX19GQzJUMmkiIFwKKwkib3BlcmF0b3ItXFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSwgaW50XFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19wbF9fRkMyVDJpIiBcCisJIm9wZXJhdG9yXFsrXF0rXFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSwgaW50XFspXF0rIgorCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgaF9fRmMiICJoKGNoYXIpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBoX19GZCIgImgoZG91YmxlKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgaF9fRmYiICJoKGZsb2F0KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgaF9fRmkiICJoKGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGZfX0ZpIiAiZihpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBoX19GbCIgImgobG9uZykiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgaF9fRnMiICJoKHNob3J0KSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIF9fbWRfX0ZDMlQyUkMyVDIiIFwKKwkib3BlcmF0b3IlXFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSwgKGNvbnN0IFQyfFQyIGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19kdl9fRkMyVDJSQzJUMiIgXAorCSJvcGVyYXRvci9cWyhcXSsoY29uc3QgVDJ8VDIgY29uc3QpLCAoY29uc3QgVDJ8VDIgY29uc3QpICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX21sX19GQzJUMlJDMlQyIiBcCisJIm9wZXJhdG9yXFsqXF0rXFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSwgKGNvbnN0IFQyfFQyIGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19taV9fRkMyVDJSQzJUMiIgXAorCSJvcGVyYXRvci1cWyhcXSsoY29uc3QgVDJ8VDIgY29uc3QpLCAoY29uc3QgVDJ8VDIgY29uc3QpICZcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBfX3BsX19GQzJUMlJDMlQyIiBcCisJIm9wZXJhdG9yXFsrXF0rXFsoXF0rKGNvbnN0IFQyfFQyIGNvbnN0KSwgKGNvbnN0IFQyfFQyIGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRmNSUDFjUlBDMWNUMiIgXAorCSJnXFsoXF0rY2hhciwgYyAqXFsqXF0rJiwgKGNvbnN0IGN8YyBjb25zdCkgKlxbKlxdKyYsIGMgKlxbKlxdKyZcWylcXSsiCisKKworICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRmRDZFQxIiBcCisJImdcWyhcXStkb3VibGUsIChjb25zdCBkb3VibGV8ZG91YmxlIGNvbnN0KSwgZG91YmxlXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRmZDZlQxIiBcCisJImdcWyhcXStmbG9hdCwgKGNvbnN0IGZsb2F0fGZsb2F0IGNvbnN0KSwgZmxvYXRcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GbENsVDEiIFwKKwkiZ1xbKFxdK2xvbmcsIChjb25zdCBsb25nfGxvbmcgY29uc3QpLCBsb25nXFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRmlDaVQxIiBcCisJImdcWyhcXStpbnQsIChjb25zdCBpbnR8aW50IGNvbnN0KSwgaW50XFspXF0rIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gZ19fRnNDc1QxIiBcCisJImdcWyhcXStzaG9ydCwgKGNvbnN0IHNob3J0fHNob3J0IGNvbnN0KSwgc2hvcnRcWylcXSsiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBnX19GY0NjVDEiIFwKKwkiZ1xbKFxdK2NoYXIsIChjb25zdCBjaGFyfGNoYXIgY29uc3QpLCBjaGFyXFspXF0rIgorCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZl9fRmljZFBjIiAiZihpbnQsIGNoYXIsIGRvdWJsZSwgY2hhciAqKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19ud19fRlVpIiAib3BlcmF0b3IgbmV3KHVuc2lnbmVkIGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfX1EzXzJUMTFhMWJTRmkiICJUMTo6YTo6Yjo6YihpbnQpIHN0YXRpYyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19kdF9fUTNfMlQxMWExYlNGaSIgIlQxOjphOjpiOjp+YihpbnQpIHN0YXRpYyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgcHV0X19RM18yVDExYTFiU0ZpIiAiVDE6OmE6OmI6OnB1dChpbnQpIHN0YXRpYyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZ2V0X19RMl8yVDExYVNGdiIgIlQxOjphOjpnZXQodm9pZCkgc3RhdGljIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBwdXRfXzJUMVNGaSIgIlQxOjpwdXQoaW50KSBzdGF0aWMiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHB1dF9fUTVfMlQxMWExYjFjMWRTRmkiICJUMTo6YTo6Yjo6Yzo6ZDo6cHV0KGludCkgc3RhdGljIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBnZXRfX1E0XzJUMTFhMWIxY1NGdiIgIlQxOjphOjpiOjpjOjpnZXQodm9pZCkgc3RhdGljIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBwdXRfX1EyXzJUMTFhU0ZpIiAiVDE6OmE6OnB1dChpbnQpIHN0YXRpYyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgcHV0X19RNF8yVDExYTFiMWNTRmkiICJUMTo6YTo6Yjo6Yzo6cHV0KGludCkgc3RhdGljIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBnZXRfX1EzXzJUMTFhMWJTRnYiICJUMTo6YTo6Yjo6Z2V0KHZvaWQpIHN0YXRpYyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZ2V0X18yVDFTRnYiICJUMTo6Z2V0KHZvaWQpIHN0YXRpYyIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZ2V0X19RNV8yVDExYTFiMWMxZFNGdiIgIlQxOjphOjpiOjpjOjpkOjpnZXQodm9pZCkgc3RhdGljIgorCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgYmFyX18zZm9vRlB2IiAgICAgICAiZm9vOjpiYXIodm9pZCAqKSIKKyAgICBnZGJfdGVzdCAibWFpbnQgZGVtIGJhcl9fM2Zvb0ZQQ3YiIFwKKwkgICAgICJmb286OmJhclxbKFxdKyhjb25zdCB2b2lkfHZvaWQgY29uc3QpICpcWypcXStcWylcXSsiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGJhcl9fM2Zvb0NGUHYiICAgICAgImZvbzo6YmFyKHZvaWQgKikgY29uc3QiCisgICAgZ2RiX3Rlc3QgIm1haW50IGRlbSBiYXJfXzNmb29DRlBDdiIgXAorCSAgICAiZm9vOjpiYXJcWyhcXSsoY29uc3Qgdm9pZHx2b2lkIGNvbnN0KSAqXFsqXF0rXFspXF0rIGNvbnN0IgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2VxX18zZm9vRlIzZm9vIiAgICJmb286Om9wZXJhdG9yPT0oZm9vICYpIgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19lcV9fM2Zvb0ZSQzNmb28iIFwKKwkgImZvbzo6b3BlcmF0b3I9PVxbKFxdKyhjb25zdCBmb298Zm9vIGNvbnN0KSAmXFspXF0rIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2VxX18zZm9vQ0ZSM2ZvbyIgICJmb286Om9wZXJhdG9yPT0oZm9vICYpIGNvbnN0IgorICAgIGdkYl90ZXN0ICJtYWludCBkZW0gX19lcV9fM2Zvb0NGUkMzZm9vIiBcCisJImZvbzo6b3BlcmF0b3I9PVxbKFxdKyhjb25zdCBmb298Zm9vIGNvbnN0KSAmXFspXF0rIGNvbnN0IgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGJhcl9fM2Zvb0ZpVDE2Rm9vQmFyIiAiZm9vOjpiYXIoaW50LCBpbnQsIEZvb0JhcikiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgYmFyX18zZm9vRlBpTjUxUGROMzdQY04yMTFUMWlOMjE1IiBcCisgICAgICAiZm9vOjpiYXIoaW50ICosIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKiwgZG91YmxlICosIGRvdWJsZSAqLCBkb3VibGUgKiwgZG91YmxlICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQsIGludCwgaW50KSIKKworCisgICAgIyBIUCBhQ0Mgc3BlY2lmaWMgdGVzdHMuIEhQIGFDQyBkZW1hbmdsaW5nIGRvZXMgbm90IHVzZSBfX3B0X18gZm9yCisgICAgIyB0ZW1wbGF0ZSBzcGVjaWZpY2F0aW9ucy4gIFRoZXJlIGFyZSBvdGhlciBkaWZmZXJlbmNlcyBhcyB3ZWxsLgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fZHRfXzJUNVhUUEZpUFBkUHZfaV9fRnYiICJUNTxpbnQgKCopKGludCwgZG91YmxlICoqLCB2b2lkICopPjo6flQ1KHZvaWQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfXzFjRmkiICJjOjpjKGludCkiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19kdF9fMlQ1WFRpX19GdiIgIlQ1PGludD46On5UNSh2b2lkKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2R0X18yVDVYVGNfX0Z2IiAiVDU8Y2hhcj46On5UNSh2b2lkKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18yVDJGaSIgIlQyOjpUMihpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2R0X18yVDFGdiIgIlQxOjp+VDEodm9pZCkiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19kdF9fMlQ1WFQxeF9fRnYiICJUNTx4Pjo6flQ1KHZvaWQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fZHRfXzJUNVhUUEZjUHZfaV9fRnYiICJUNTxpbnQgKCopKGNoYXIsIHZvaWQgKik+Ojp+VDUodm9pZCkiCisgICAgCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfXzJUNVhUUEZpUFBkUHZfaV9fRmkiICJUNTxpbnQgKCopKGludCwgZG91YmxlICoqLCB2b2lkICopPjo6VDUoaW50KSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2RsX18yVDVYVDF4X19TRlB2IiAiVDU8eD46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIHN0YXRpYyIKKyAgICAKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgWF9fMlQ1WFQxeCIgIlQ1PHg+OjpYIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfXzJUNVhUaV9fRmkiICJUNTxpbnQ+OjpUNShpbnQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfXzJUNVhUY19fRmkiICJUNTxjaGFyPjo6VDUoaW50KSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2RsX18yVDVYVFBGY1B2X2lfX1NGUHYiICJUNTxpbnQgKCopKGNoYXIsIHZvaWQgKik+OjpvcGVyYXRvciBkZWxldGUodm9pZCAqKSBzdGF0aWMiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgWF9fMlQ1WFRQRmNQdl9pIiAiVDU8aW50ICgqKShjaGFyLCB2b2lkICopPjo6WCIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18yVDVYVDF4X19GaSIgIlQ1PHg+OjpUNShpbnQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fZGxfXzJUNVhUUEZpUFBkUHZfaV9fU0ZQdiIgIlQ1PGludCAoKikoaW50LCBkb3VibGUgKiosIHZvaWQgKik+OjpvcGVyYXRvciBkZWxldGUodm9pZCAqKSBzdGF0aWMiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIFhfXzJUNVhUUEZpUFBkUHZfaSIgIlQ1PGludCAoKikoaW50LCBkb3VibGUgKiosIHZvaWQgKik+OjpYIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fZGxfXzJUNVhUaV9fU0ZQdiIgIlQ1PGludD46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIHN0YXRpYyIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2RsX18yVDVYVGNfX1NGUHYiICJUNTxjaGFyPjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgc3RhdGljIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIFhfXzJUNVhUYyIgIlQ1PGNoYXI+OjpYIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIFhfXzJUNVhUaSIgIlQ1PGludD46OlgiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fMlQ1WFRQRmNQdl9pX19GaSIgIlQ1PGludCAoKikoY2hhciwgdm9pZCAqKT46OlQ1KGludCkiCisgICAgCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fZHRfXzJUMVhUY19fRnYiICJUMTxjaGFyPjo6flQxKHZvaWQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fZHRfXzJUMVhUMXRfX0Z2IiAiVDE8dD46On5UMSh2b2lkKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2RsX18yVDFYVDF0X19TRlB2IiAiVDE8dD46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICopIHN0YXRpYyIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18yVDFYVGNfX0ZpIiAiVDE8Y2hhcj46OlQxKGludCkiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgX19jdF9fMlQxWFRjX19GdiIgIlQxPGNoYXI+OjpUMSh2b2lkKSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18yVDFYVDF0X19GaSIgIlQxPHQ+OjpUMShpbnQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fY3RfXzJUMVhUMXRfX0Z2IiAiVDE8dD46OlQxKHZvaWQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIF9fZGxfXzJUMVhUY19fU0ZQdiIgIlQxPGNoYXI+OjpvcGVyYXRvciBkZWxldGUodm9pZCAqKSBzdGF0aWMiCisKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZWxlbV9fNnZlY3RvclhUZF9fRmkiICJ2ZWN0b3I8ZG91YmxlPjo6ZWxlbShpbnQpIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGVsZW1fXzZ2ZWN0b3JYVGlfX0ZpIiAidmVjdG9yPGludD46OmVsZW0oaW50KSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X182dmVjdG9yWFRkX19GaSIgInZlY3Rvcjxkb3VibGU+Ojp2ZWN0b3IoaW50KSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X182dmVjdG9yWFRpX19GaSIgInZlY3RvcjxpbnQ+Ojp2ZWN0b3IoaW50KSIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X185RExpc3ROb2RlWFRSNlJMYWJlbF9fRlI2UkxhYmVsUDlETGlzdE5vZGVYVFI2UkxhYmVsX1QyIiBcCisJIkRMaXN0Tm9kZTxSTGFiZWwgJj46OkRMaXN0Tm9kZShSTGFiZWwgJiwgRExpc3ROb2RlPFJMYWJlbCAmPiAqLCBETGlzdE5vZGU8UkxhYmVsICY+ICopIgorCisKKyAgICAjIEFic29sdXRlIGludGVnZXIgY29uc3RhbnRzIGluIHRlbXBsYXRlIGFyZ3MKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBlbGVtX182dmVjdG9yWFRpVVAzNF9fRmkiICJ2ZWN0b3I8aW50LDM0VT46OmVsZW0oaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZWxlbV9fNnZlY3RvclhVUDI3MDFUZF9fRmkiICJ2ZWN0b3I8MjcwMVUsZG91YmxlPjo6ZWxlbShpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBlbGVtX182dmVjdG9yWFRpU1AzMzRfX0ZpIiAidmVjdG9yPGludCwzMzQ+OjplbGVtKGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGVsZW1fXzZ2ZWN0b3JYVGlTTjY3X19GaSIgInZlY3RvcjxpbnQsLTY3Pjo6ZWxlbShpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBlbGVtX182dmVjdG9yWFRpU01fX1NDRlBQZCIgInZlY3RvcjxpbnQsLTIxNDc0ODM2NDg+OjplbGVtKGRvdWJsZSAqKikgc3RhdGljIGNvbnN0IgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBlbGVtX182dmVjdG9yWFRpU042N1VQNDAwMFRSc19fRmkiICJ2ZWN0b3I8aW50LC02Nyw0MDAwVSxzaG9ydCAmPjo6ZWxlbShpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBlbGVtX182dmVjdG9yWFRpU042N1RSZFRGUHZfaV9fRmkiICJ2ZWN0b3I8aW50LC02Nyxkb3VibGUgJixpbnQgKHZvaWQgKik+OjplbGVtKGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIFhfXzZ2ZWN0b3JYVGlTTjY3VGRUUHZVUDVUUnMiICJ2ZWN0b3I8aW50LC02Nyxkb3VibGUsdm9pZCAqLDVVLHNob3J0ICY+OjpYIgorCisgICAgIyBOYW1lZCBjb25zdGFudHMgaW4gdGVtcGxhdGUgYXJncworCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGVsZW1fXzZ2ZWN0b3JYVGlBM2Zvb19fRmkiICJ2ZWN0b3I8aW50LCZmb28+OjplbGVtKGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIGVsZW1fXzZ2ZWN0b3JYVGlBM2Zvb1RQdkE1TGFiZWxfX0ZpUFB2VDIiICJ2ZWN0b3I8aW50LCZmb28sdm9pZCAqLCZMYWJlbD46OmVsZW0oaW50LCB2b2lkICoqLCB2b2lkICoqKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZWxlbV9fNnZlY3RvclhUaVNONDJBM2Zvb19fRmkiICJ2ZWN0b3I8aW50LC00MiwmZm9vPjo6ZWxlbShpbnQpIgorCisgICAgIyBBbHRlcm5hdGUgZW50cnkgcG9pbnRzIGZvciBmdW5jdGlvbnMKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18yVDVYVFBGY1B2X2lfX0ZpXzIiICJUNTxpbnQgKCopKGNoYXIsIHZvaWQgKik+OjpUNShpbnQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBfX2N0X18yVDVYVFBGY1B2X2lfX0ZpXzE5IiAiVDU8aW50ICgqKShjaGFyLCB2b2lkICopPjo6VDUoaW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgZl9fRmljZFBjUEZjaV92XzM0IiAiZihpbnQsIGNoYXIsIGRvdWJsZSwgY2hhciAqLCB2b2lkICgqKShjaGFyLCBpbnQpKSIKKworCisgICAgIyBUZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9ucworCisjIEZJWE1FISAgVGhlICMgY2hhcmFjdGVycyBkb24ndCBnbyB0aHJvdWdoIGV4cGVjdCwgYW5kIGJhY2tzbGFzaGVzIGRvbid0IHNlZW0gdG8gd29yay4KKyMgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHNwZWNfXzEzU3BlYzwjMSwjMS4qPlhUaVRQaV9GUGkiICJTcGVjPGludCxpbnQgKj46OnNwZWMoaW50ICopIgorIyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgc3BlY19fMTZTcGVjPCMxLCMxLiYsIzE+WFRpVFJpVGlfRlBpIiAiU3BlYzxpbnQsaW50ICYsIGludD46OnNwZWMoaW50ICopIgorIyBGYWtlIHRlc3QgLS0gcmVwbGFjZSAjIHdpdGggJQorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBzcGVjX18xM1NwZWM8JTEsJTEuKj5YVGlUUGlfRlBpIiAiU3BlYzxpbnQsaW50ICo+OjpzcGVjKGludCAqKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgc3BlY19fMTZTcGVjPCUxLCUxLiYsJTE+WFRpVFJpVGlfRlBpIiAiU3BlYzxpbnQsaW50ICYsaW50Pjo6c3BlYyhpbnQgKikiCisKKyAgICAjIEdsb2JhbCB0ZW1wbGF0ZSBmdW5jdGlvbnMKKworICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBhZGRfX1hUY19GY1QxIiAiYWRkPGNoYXI+KGNoYXIsIGNoYXIpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJtYWludCBkZW1hbmdsZSBhZGRfX1hUY1NQOUE1bGFiZWxfRmNQUGxUMSIgImFkZDxjaGFyLDksJmxhYmVsPihjaGFyLCBsb25nICoqLCBjaGFyKSIKKyAgICBnZGJfdGVzdF9leGFjdCAibWFpbnQgZGVtYW5nbGUgYWRkX19YVFBmVEZQZF9mX0ZjVDEiICJhZGQ8ZmxvYXQgKixmbG9hdCAoZG91YmxlICopPihjaGFyLCBjaGFyKSIKKworICAgICMgVGVtcGxhdGUgZm9yIHRlbXBsYXRlIGFyZworCisgICAgZ2RiX3Rlc3RfZXhhY3QgIm1haW50IGRlbWFuZ2xlIHVuTGlua19fMTJiYXNpY19zdHJpbmdYVGNUMThzdHJpbmdfY2hhcl90cmFpdHNYVGNfVDlhbGxvY2F0b3JfRnYiICJiYXNpY19zdHJpbmc8Y2hhcixzdHJpbmdfY2hhcl90cmFpdHM8Y2hhcj4sYWxsb2NhdG9yPjo6dW5MaW5rKHZvaWQpIgorCit9CisjIFRlc3Qgc3VwcG9ydCBmb3IgZGlmZmVyZW50IGRlbWFuZ2xpbmcgc3R5bGVzLiAgTm90ZSB0aGF0IHRoaXMgZG9lcworIyBub3QgZGVwZW5kIHVwb24gcnVubmluZyB0aGUgdGVzdCBwcm9ncmFtIGFuZCBkb2VzIG5vdCBkZXBlbmQgdXBvbgorIyBnZGIgYmVpbmcgYWJsZSB0byBsb29rdXAgYW55IEMrKyBzeW1ib2xzLiAgSXQgc2ltcGx5IGNhbGxzIHRoZSAKKyMgaW50ZXJuYWwgZGVtYW5nbGVyIHdpdGggc3ludGhlc2l6ZWQgc3RyaW5ncyBhbmQgdGVzdHMgdGhlIHJlc3VsdHMuCisKK3Byb2MgZG9fdGVzdHMge30geworICAgIGdsb2JhbCBwcm1zX2lkCisgICAgZ2xvYmFsIGJ1Z19pZAorICAgIGdsb2JhbCBzdWJkaXIKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgc2V0IHBybXNfaWQgMAorICAgIHNldCBidWdfaWQgMAorCisgICAgIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKworICAgIHNlbmRfZ2RiICJzZXQgbGFuZ3VhZ2UgYysrXG4iCisgICAgZ2RiX2V4cGVjdCAtcmUgIiRnZGJfcHJvbXB0ICQiCisgICAgc2VuZF9nZGIgInNldCB3aWR0aCAwXG4iCisgICAgZ2RiX2V4cGVjdCAtcmUgIiRnZGJfcHJvbXB0ICQiCisgICAgCisgICAgdGVzdF9sdWNpZF9zdHlsZV9kZW1hbmdsaW5nCisgICAgdGVzdF9nbnVfc3R5bGVfZGVtYW5nbGluZworICAgIHRlc3RfYXJtX3N0eWxlX2RlbWFuZ2xpbmcKKyAgICB0ZXN0X2hwX3N0eWxlX2RlbWFuZ2xpbmcKK30KKworZG9fdGVzdHMKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9kZXJpdmF0aW9uLmNjIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL2Rlcml2YXRpb24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllZmE3NgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9kZXJpdmF0aW9uLmNjCkBAIC0wLDAgKzEsMjQwIEBACitjbGFzcyBBIHsKK3B1YmxpYzoKKyAgICBpbnQgYTsKKyAgICBpbnQgYWE7CisKKyAgICBBKCkKKyAgICB7CisgICAgICAgIGE9MTsKKyAgICAgICAgYWE9MjsKKyAgICB9CisgICAgaW50IGFmb28oKTsKKyAgICBpbnQgZm9vKCk7CisgICAgCit9OworCisKKworY2xhc3MgQiB7CitwdWJsaWM6CisgICAgaW50IGI7CisgICAgaW50IGJiOworCisgICAgQigpCisgICAgeworICAgICAgICBiPTM7CisgICAgICAgIGJiPTQ7CisgICAgfQorICAgIGludCBiZm9vKCk7CisgICAgaW50IGZvbygpOworICAgIAorfTsKKworCisKK2NsYXNzIEMgeworcHVibGljOgorICAgIGludCBjOworICAgIGludCBjYzsKKworICAgIEMoKQorICAgIHsKKyAgICAgICAgYz01OworICAgICAgICBjYz02OworICAgIH0KKyAgICBpbnQgY2ZvbygpOworICAgIGludCBmb28oKTsKKyAgICAKK307CisKKworCitjbGFzcyBEIDogcHJpdmF0ZSBBLCBwdWJsaWMgQiwgcHJvdGVjdGVkIEMgeworcHVibGljOgorICAgIGludCBkOworICAgIGludCBkZDsKKworICAgIEQoKQorICAgIHsKKyAgICAgICAgZCA9NzsKKyAgICAgICAgZGQ9ODsKKyAgICB9CisgICAgaW50IGRmb28oKTsKKyAgICBpbnQgZm9vKCk7CisgICAgCit9OworCisKK2NsYXNzIEUgOiBwdWJsaWMgQSwgQiwgcHJvdGVjdGVkIEMgeworcHVibGljOgorICAgIGludCBlOworICAgIGludCBlZTsKKworICAgIEUoKQorICAgIHsKKyAgICAgICAgZSA9OTsKKyAgICAgICAgZWU9MTA7CisgICAgfQorICAgIGludCBlZm9vKCk7CisgICAgaW50IGZvbygpOworICAgIAorfTsKKworCitjbGFzcyBGIDogQSwgcHVibGljIEIsIEMgeworcHVibGljOgorICAgIGludCBmOworICAgIGludCBmZjsKKworICAgIEYoKQorICAgIHsKKyAgICAgICAgZiA9MTE7CisgICAgICAgIGZmPTEyOworICAgIH0KKyAgICBpbnQgZmZvbygpOworICAgIGludCBmb28oKTsKKyAgICAKK307CisKK2NsYXNzIEcgOiBwcml2YXRlIEEsIHB1YmxpYyBCLCBwcm90ZWN0ZWQgQyB7CitwdWJsaWM6CisgICAgaW50IGc7CisgICAgaW50IGdnOworICAgIGludCBhOworICAgIGludCBiOworICAgIGludCBjOworCisgICAgRygpCisgICAgeworICAgICAgICBnID0xMzsKKyAgICAgICAgZ2cgPTE0OworICAgICAgICBhPTE1OworICAgICAgICBiPTE2OworICAgICAgICBjPTE3OworICAgICAgICAKKyAgICB9CisgICAgaW50IGdmb28oKTsKKyAgICBpbnQgZm9vKCk7CisgICAgCit9OworCisKKworCitpbnQgQTo6YWZvbygpIHsKKyAgICByZXR1cm4gMTsKK30KKworaW50IEI6OmJmb28oKSB7CisgICAgcmV0dXJuIDI7Cit9CisKK2ludCBDOjpjZm9vKCkgeworICAgIHJldHVybiAzOworfQorCitpbnQgRDo6ZGZvbygpIHsKKyAgICByZXR1cm4gNDsKK30KKworaW50IEU6OmVmb28oKSB7CisgICAgcmV0dXJuIDU7Cit9CisKK2ludCBGOjpmZm9vKCkgeworICAgIHJldHVybiA2OworfQorCitpbnQgRzo6Z2ZvbygpIHsKKyAgICByZXR1cm4gNzc7Cit9CisKK2ludCBBOjpmb28oKQoreworICAgIHJldHVybiA3OworICAgIAorfQorCitpbnQgQjo6Zm9vKCkKK3sKKyAgICByZXR1cm4gODsKKyAgICAKK30KKworaW50IEM6OmZvbygpCit7CisgICAgcmV0dXJuIDk7CisgICAgCit9CisKK2ludCBEOjpmb28oKQoreworICAgIHJldHVybiAxMDsKKyAgICAKK30KKworaW50IEU6OmZvbygpCit7CisgICAgcmV0dXJuIDExOworICAgIAorfQorCitpbnQgRjo6Zm9vKCkKK3sKKyAgICByZXR1cm4gMTI7CisgICAgCit9CisKK2ludCBHOjpmb28oKQoreworICAgIHJldHVybiAxMzsKKyAgICAKK30KKworCit2b2lkIG1hcmtlcjEoKQoreworfQorCisKK2ludCBtYWluKHZvaWQpCit7CisKKyAgICBBIGFfaW5zdGFuY2U7CisgICAgQiBiX2luc3RhbmNlOworICAgIEMgY19pbnN0YW5jZTsKKyAgICBEIGRfaW5zdGFuY2U7CisgICAgRSBlX2luc3RhbmNlOworICAgIEYgZl9pbnN0YW5jZTsKKyAgICBHIGdfaW5zdGFuY2U7CisgICAgCisgICAgI2lmZGVmIHVzZXN0dWJzCisgICAgICAgc2V0X2RlYnVnX3RyYXBzKCk7CisgICAgICAgYnJlYWtwb2ludCgpOworICAgICNlbmRpZgorICAgIAorCisgICAgbWFya2VyMSgpOworICAgIAorICAgIGFfaW5zdGFuY2UuYSA9IDIwOworICAgIGFfaW5zdGFuY2UuYWEgPSAyMTsKKyAgICBiX2luc3RhbmNlLmIgPSAyMjsKKyAgICBiX2luc3RhbmNlLmJiID0gMjM7CisgICAgY19pbnN0YW5jZS5jID0gMjQ7CisgICAgY19pbnN0YW5jZS5jYyA9IDI1OworICAgIGRfaW5zdGFuY2UuZCA9IDI2OworICAgIGRfaW5zdGFuY2UuZGQgPSAyNzsKKyAgICBlX2luc3RhbmNlLmUgPSAyODsKKyAgICBlX2luc3RhbmNlLmVlID0yOTsKKyAgICBmX2luc3RhbmNlLmYgPTMwOworICAgIGZfaW5zdGFuY2UuZmYgPTMxOworICAgIAorICAgIAorICAgIAorCisgICAgcmV0dXJuIDA7CisgICAgCit9CisKKyAgICAKKyAgICAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9kZXJpdmF0aW9uLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9kZXJpdmF0aW9uLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDNjYzJjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL2Rlcml2YXRpb24uZXhwCkBAIC0wLDAgKzEsMzE2IEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRWxlbmEgWmFubm9uaSAoZXphbm5vbmlAY3lnbnVzLmNvbSkKKworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZ2RiIHRlc3RzdWl0ZQorIworCisjCisjIHRlc3RzIGZvciBpbmhlcml0YW5jZSwgd2l0aCBzZXZlcmFsIGRlcml2YXRpb25zIHR5cGVzIGNvbWJpbmF0aW9ucyAocHJpdmF0ZSwKKyMgcHVibGljLCBwcm90ZWN0ZWQpIAorIyBjbGFzc2VzIGhhdmUgc2ltcGxlIG1lbWJlcnMgYW5kIG1lbWJlciBmdW5jdGlvbnMuCisjIAorCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgICAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKKyAgICAgICAgfQorCisjCisjIHRlc3QgcnVubmluZyBwcm9ncmFtcworIworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAiZGVyaXZhdGlvbiIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmNjCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYysrfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KK3JlbW90ZV9maWxlIGJ1aWxkIGRlbGV0ZSAke2JpbmZpbGV9LmNpCisgaWYgeyFbaXN0YXJnZXQgImhwcGEqLSotaHB1eCoiXX0geworICAgICBpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vY29tcGlsZXIuY2MiICIke2JpbmZpbGV9LmNpIiBwcmVwcm9jZXNzICIiXSAhPSAiIgorfSB7CisgICAgICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0bworbWF0aWNhbGx5IGZhaWwuIgorICAgICB9CisgfSBlbHNlIHsKKyAgICAgaWYgeyBbZ2RiX3ByZXByb2Nlc3MgIiR7c3JjZGlyfS8ke3N1YmRpcn0vY29tcGlsZXIuY2MiICIke2JpbmZpbGV9LmNpIiAiYysrIl0gIT0gIiIgfSB7CisgICAgICAgICBwZXJyb3IgIkNvdWxkbid0IG1ha2UgJHtiaW5maWxlfS5jaSBmaWxlIgorICAgICAgICAgcmV0dXJuIDE7CisgICAgIH0KKyB9CisgCitzb3VyY2UgJHtiaW5maWxlfS5jaQorCisjCisjIHNldCBpdCB1cCBhdCBhIGJyZWFrcG9pbnQgc28gd2UgY2FuIHBsYXkgd2l0aCB0aGUgdmFyaWFibGUgdmFsdWVzCisjCitpZiAhW3J1bnRvX21haW5dIHRoZW4geworICAgIHBlcnJvciAiY291bGRuJ3QgcnVuIHRvIGJyZWFrcG9pbnQiCisgICAgY29udGludWUKK30KKworc2VuZF9nZGIgImJyZWFrIG1hcmtlcjFcbiIgOyBnZGJfZXhwZWN0IC1yZSAiLiokZ2RiX3Byb21wdCAkIgorCisgICAgc2VuZF9nZGIgImNvbnRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJCcmVhay4qIG1hcmtlcjEgXFwoXFwpIGF0IC4qOiRkZWNpbWFsLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBzZW5kX2dkYiAidXBcbiIKKyAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorICAgICAgICAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJ1cCBmcm9tIG1hcmtlcjEiIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29udGludWUgdG8gbWFya2VyMSIgIH0KKyAgICAgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb250aW51ZSB0byBtYXJrZXIxIiAgfQorICAgIH0KKworCisKK3NlbmRfZ2RiICJwcmludCBhX2luc3RhbmNlXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IFx7YSA9IDEsIGFhID0gMlx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgYV9pbnN0YW5jZSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiBhX2luc3RhbmNlIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgYV9pbnN0YW5jZSIgfQorICB9CisKKworc2VuZF9nZGIgInB0eXBlIGFfaW5zdGFuY2VcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAidHlwZSA9IGNsYXNzIEEgXHtcclxuXFtcdCBcXSpwdWJsaWM6XHJcblxbXHQgXF0qaW50IGE7XHJcblxbXHQgXF0qaW50IGFhO1xbXHJcblx0IFxdK0FcXCh2b2lkXFwpO1xyXG5cW1x0IFxdKmludCBhZm9vXFwodm9pZFxcKTtcclxuXFtcdCBcXSppbnQgZm9vXFwodm9pZFxcKTtcclxuXH0uKiRnZGJfcHJvbXB0ICQiICB7IHBhc3MgInB0eXBlIGFfaW5zdGFuY2UiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBhX2luc3RhbmNlIiB9CisgICAgdGltZW91dCAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBhX2luc3RhbmNlIiB9Cit9CisKKworc2VuZF9nZGIgInByaW50IGRfaW5zdGFuY2VcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gXHs8QT4gPSBce2EgPSAxLCBhYSA9IDJcfSwgPEI+ID0gXHtiID0gMywgYmIgPSA0XH0sIDxDPiA9IFx7YyA9IDUsIGNjID0gNlx9LCBkID0gNywgZGQgPSA4XH1cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBkX2luc3RhbmNlIgorICAgICAgfQorICAgIC1yZSAiLlxbMC05XF0qID0gXHs8Y2xhc3MgQT4gPSBce2EgPSAxLCBhYSA9IDJcfSwgPGNsYXNzIEI+ID0gXHtiID0gMywgYmIgPSA0XH0sIDxjbGFzcyBDPiA9IFx7YyA9IDUsIGNjID0gNlx9LCBkID0gNywgZGQgPSA4XH1cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBkX2luc3RhbmNlIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIGRfaW5zdGFuY2UiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBkX2luc3RhbmNlIiB9CisgIH0KKworICBpZiB7JGdjY19jb21waWxlZH0gdGhlbiB7CisgICAgICBzZW5kX2dkYiAicHR5cGUgZF9pbnN0YW5jZVxuIgorICAgICAgZ2RiX2V4cGVjdCB7CisJICAtcmUgInR5cGUgPSBjbGFzcyBEIDogcHJpdmF0ZSBBLCBwdWJsaWMgQiwgcHJpdmF0ZSBDIFx7XHJcblxbXHQgXF0qcHVibGljOlxyXG5cW1x0IFxdKmludCBkO1xyXG5cW1x0IFxdKmludCBkZDtcW1xyXG5cdCBcXStEXFwodm9pZFxcKTtcclxuXFtcdCBcXSppbnQgZGZvb1xcKHZvaWRcXCk7XHJcblxbXHQgXF0qaW50IGZvb1xcKHZvaWRcXCk7XHJcblx9LiokZ2RiX3Byb21wdCAkIiAgeyBwYXNzICJwdHlwZSBkX2luc3RhbmNlIiB9CisJICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBkX2luc3RhbmNlIiB9CisJICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIGRfaW5zdGFuY2UiIH0KKyAgICAgIH0KKyAgfSBlbHNlIHsKKyAgICAgIHNlbmRfZ2RiICJwdHlwZSBkX2luc3RhbmNlXG4iCisgICAgICBnZGJfZXhwZWN0IHsKKwkgIC1yZSAidHlwZSA9IGNsYXNzIEQgOiBwcml2YXRlIEEsIHB1YmxpYyBCLCBwcm90ZWN0ZWQgQyBce1xyXG5cW1x0IFxdKnB1YmxpYzpcclxuXFtcdCBcXSppbnQgZDtcclxuXFtcdCBcXSppbnQgZGQ7XFtcclxuXHQgXF0rRFxcKHZvaWRcXCk7XHJcblxbXHQgXF0qaW50IGRmb29cXCh2b2lkXFwpO1xyXG5cW1x0IFxdKmludCBmb29cXCh2b2lkXFwpO1xyXG5cfS4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgZF9pbnN0YW5jZSIgfQorCSAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgeyAgZmFpbCAicHR5cGUgZF9pbnN0YW5jZSIgfQorCSAgdGltZW91dCAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBkX2luc3RhbmNlIiB9CisgICAgICB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgZV9pbnN0YW5jZVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSBcezxBPiA9IFx7YSA9IDEsIGFhID0gMlx9LCA8Qj4gPSBce2IgPSAzLCBiYiA9IDRcfSwgPEM+ID0gXHtjID0gNSwgY2MgPSA2XH0sIGUgPSA5LCBlZSA9IDEwXH1cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBlX2luc3RhbmNlIgorICAgICAgfQorICAgIC1yZSAiLlxbMC05XF0qID0gXHs8Y2xhc3MgQT4gPSBce2EgPSAxLCBhYSA9IDJcfSwgPGNsYXNzIEI+ID0gXHtiID0gMywgYmIgPSA0XH0sIDxjbGFzcyBDPiA9IFx7YyA9IDUsIGNjID0gNlx9LCBlID0gOSwgZWUgPSAxMFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgZV9pbnN0YW5jZSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiBlX2luc3RhbmNlIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgZV9pbnN0YW5jZSIgfQorICB9CisKKyAgaWYgeyRnY2NfY29tcGlsZWR9IHsKKyAgICAgIHNlbmRfZ2RiICJwdHlwZSBlX2luc3RhbmNlXG4iCisgICAgICBnZGJfZXhwZWN0IHsKKwkgIC1yZSAidHlwZSA9IGNsYXNzIEUgOiBwdWJsaWMgQSwgcHJpdmF0ZSBCLCBwcml2YXRlIEMgXHtcclxuXFtcdCBcXSpwdWJsaWM6XHJcblxbXHQgXF0qaW50IGU7XHJcblxbXHQgXF0qaW50IGVlO1xbXHJcblx0IFxdK0VcXCh2b2lkXFwpO1xyXG5cW1x0IFxdKmludCBlZm9vXFwodm9pZFxcKTtcclxuXFtcdCBcXSppbnQgZm9vXFwodm9pZFxcKTtcclxuXH0uKiRnZGJfcHJvbXB0ICQiICB7IHBhc3MgInB0eXBlIGVfaW5zdGFuY2UiIH0KKwkgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgIGZhaWwgInB0eXBlIGVfaW5zdGFuY2UiIH0KKwkgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgZV9pbnN0YW5jZSIgfQorICAgICAgfQorICB9IGVsc2UgeworICAgICAgc2VuZF9nZGIgInB0eXBlIGVfaW5zdGFuY2VcbiIKKyAgICAgIGdkYl9leHBlY3QgeworCSAgLXJlICJ0eXBlID0gY2xhc3MgRSA6IHB1YmxpYyBBLCBwcml2YXRlIEIsIHByb3RlY3RlZCBDIFx7XHJcblxbXHQgXF0qcHVibGljOlxyXG5cW1x0IFxdKmludCBlO1xyXG5cW1x0IFxdKmludCBlZTtcW1xyXG5cdCBcXStFXFwodm9pZFxcKTtcclxuXFtcdCBcXSppbnQgZWZvb1xcKHZvaWRcXCk7XHJcblxbXHQgXF0qaW50IGZvb1xcKHZvaWRcXCk7XHJcblx9LiokZ2RiX3Byb21wdCAkIiAgeyBwYXNzICJwdHlwZSBlX2luc3RhbmNlIiB9CisJICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBlX2luc3RhbmNlIiB9CisJICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIGVfaW5zdGFuY2UiIH0KKyAgICAgIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCBmX2luc3RhbmNlXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IFx7PEE+ID0gXHthID0gMSwgYWEgPSAyXH0sIDxCPiA9IFx7YiA9IDMsIGJiID0gNFx9LCA8Qz4gPSBce2MgPSA1LCBjYyA9IDZcfSwgZiA9IDExLCBmZiA9IDEyXH1cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBmX2luc3RhbmNlIgorICAgICAgfQorICAgIC1yZSAiLlxbMC05XF0qID0gXHs8Y2xhc3MgQT4gPSBce2EgPSAxLCBhYSA9IDJcfSwgPGNsYXNzIEI+ID0gXHtiID0gMywgYmIgPSA0XH0sIDxjbGFzcyBDPiA9IFx7YyA9IDUsIGNjID0gNlx9LCBmID0gMTEsIGZmID0gMTJcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIGZfaW5zdGFuY2UiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgZl9pbnN0YW5jZSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIGZfaW5zdGFuY2UiIH0KKyAgfQorCitzZW5kX2dkYiAicHR5cGUgZl9pbnN0YW5jZVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gY2xhc3MgRiA6IHByaXZhdGUgQSwgcHVibGljIEIsIHByaXZhdGUgQyBce1xyXG5cW1x0IFxdKnB1YmxpYzpcclxuXFtcdCBcXSppbnQgZjtcclxuXFtcdCBcXSppbnQgZmY7XFtcclxuXHQgXF0rRlxcKHZvaWRcXCk7XHJcblxbXHQgXF0qaW50IGZmb29cXCh2b2lkXFwpO1xyXG5cW1x0IFxdKmludCBmb29cXCh2b2lkXFwpO1xyXG5cfS4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgZl9pbnN0YW5jZSIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgIGZhaWwgInB0eXBlIGZfaW5zdGFuY2UiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIGZfaW5zdGFuY2UiIH0KK30KKworCisKK3NlbmRfZ2RiICJwcmludCBkX2luc3RhbmNlLmFcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBkX2luc3RhbmNlLmEiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgZF9pbnN0YW5jZS5hIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgZF9pbnN0YW5jZS5hIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IGRfaW5zdGFuY2UuYWFcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBkX2luc3RhbmNlLmFhIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIGRfaW5zdGFuY2UuYWEiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBkX2luc3RhbmNlLmFhIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IGRfaW5zdGFuY2UuYlxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAzLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIGRfaW5zdGFuY2UuYiIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiBkX2luc3RhbmNlLmIiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBkX2luc3RhbmNlLmIiIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgZF9pbnN0YW5jZS5iYlxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSA0LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIGRfaW5zdGFuY2UuYmIiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgZF9pbnN0YW5jZS5iYiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIGRfaW5zdGFuY2UuYmIiIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgZF9pbnN0YW5jZS5jXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgZF9pbnN0YW5jZS5jIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIGRfaW5zdGFuY2UuYyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIGRfaW5zdGFuY2UuYyIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBkX2luc3RhbmNlLmNjXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDYuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgZF9pbnN0YW5jZS5jYyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiBkX2luc3RhbmNlLmNjIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgZF9pbnN0YW5jZS5jYyIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBkX2luc3RhbmNlLmRcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gNy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBkX2luc3RhbmNlLmQiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgZF9pbnN0YW5jZS5kIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgZF9pbnN0YW5jZS5kIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IGRfaW5zdGFuY2UuZGRcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gOC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBkX2luc3RhbmNlLmRkIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIGRfaW5zdGFuY2UuZGQiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBkX2luc3RhbmNlLmRkIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IGdfaW5zdGFuY2UuYVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAxNS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBnX2luc3RhbmNlLmEiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgZ19pbnN0YW5jZS5hIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgZ19pbnN0YW5jZS5hIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IGdfaW5zdGFuY2UuYlxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAxNi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBnX2luc3RhbmNlLmIiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgZ19pbnN0YW5jZS5iIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgZ19pbnN0YW5jZS5iIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IGdfaW5zdGFuY2UuY1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAxNy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBnX2luc3RhbmNlLmMiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgZ19pbnN0YW5jZS5jIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgZ19pbnN0YW5jZS5jIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IGdfaW5zdGFuY2UuYWZvbygpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgZ19pbnN0YW5jZS5hZm9vKCkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgZ19pbnN0YW5jZS5hZm9vKCkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBnX2luc3RhbmNlLmFmb28oKSIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBnX2luc3RhbmNlLmJmb28oKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAyLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIGdfaW5zdGFuY2UuYmZvbygpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIGdfaW5zdGFuY2UuYmZvbygpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgZ19pbnN0YW5jZS5iZm9vKCkiIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgZ19pbnN0YW5jZS5jZm9vKClcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBnX2luc3RhbmNlLmNmb28oKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiBnX2luc3RhbmNlLmNmb28oKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIGdfaW5zdGFuY2UuY2ZvbygpIiB9CisgIH0KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9pbmhlcml0LmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9pbmhlcml0LmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzdhOTBjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL2luaGVyaXQuZXhwCkBAIC0wLDAgKzEsODU5IEBACisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAoZm5mQGN5Z251cy5jb20pCisKK3NldCB3cyAiXFtcclxuXHQgXF0rIgorc2V0IG5sICJcW1xyXG5cXSsiCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCisjIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFuIGV4ZWN1dGFibGUgdG8gdGVzdC4gIElmIG5vdCwgdGhlbiBlaXRoZXIgd2UKKyMgaGF2ZW4ndCB0cmllZCB0byBjb21waWxlIG9uZSwgb3IgdGhlIGNvbXBpbGF0aW9uIGZhaWxlZCBmb3Igc29tZSByZWFzb24uCisjIEluIGVpdGhlciBjYXNlLCBqdXN0IG5vdGlmeSB0aGUgdXNlciBhbmQgc2tpcCB0aGUgdGVzdHMgaW4gdGhpcyBmaWxlLgorIyBOb3RlIC0gY3JlYXRlIHNlcGFyYXRlICJpbmhlcml0IiBleGVjdXRhYmxlIGZyb20gbWlzYy5jYworCitzZXQgdGVzdGZpbGUgImluaGVyaXQiCitzZXQgc3JjZmlsZSBtaXNjLmNjCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKKworIyBDcmVhdGUgYW5kIHNvdXJjZSB0aGUgZmlsZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlcgorIyB1c2VkIHRvIGNvbXBpbGUgdGhlIHRlc3QgY2FzZS4KKworaWYgW2dldF9jb21waWxlcl9pbmZvICR7YmluZmlsZX0gImMrKyJdIHsKKyAgICByZXR1cm4gLTEKK30KKworIyBpZiB3ZSBhcmUgb24gSFBVWCBhbmQgd2UgYXJlIG5vdCBjb21waWxlZCB3aXRoIGdjYywgdGhlbiBza2lwIHRoZXNlIHRlc3RzLgorCitpZiBbaXN0YXJnZXQgaHBwYSotKi1ocHV4Kl0geworICAgIGlmIHshJGdjY19jb21waWxlZH0geworCWNvbnRpbnVlIAorICAgIH0KK30KKworCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIGMrK31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworIworIyBTaW5nbGUgaW5oZXJpdGFuY2UsIHByaW50IGluZGl2aWR1YWwgbWVtYmVycy4KKyMKKworcHJvYyB0ZXN0X3ByaW50X3NpX21lbWJlcnMge30geworICAgICMgUHJpbnQgYWxsIG1lbWJlcnMgb2YgZ19BIHVzaW5nIGZ1bGx5IHF1YWxpZmllZCBmb3JtLgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQS5BOjphIiAiLiogPSAxIiAicHJpbnQgZ19BLkE6OmEiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19BLkE6OngiICIuKiA9IDIiICJwcmludCBnX0EuQTo6eCIKKworICAgICMgUHJpbnQgbWVtYmVycyBvZiBnX0EgdXNpbmcgbm9uYW1iaWd1b3VzIGNvbXBhY3QgZm9ybS4KKworICAgIGdkYl90ZXN0ICJwcmludCBnX0EuYSIgIi4qID0gMSIgInByaW50IGdfQS5hIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQS54IiAiLiogPSAyIiAicHJpbnQgZ19BLngiCisKKyAgICAjIFByaW50IGFsbCBtZW1iZXJzIG9mIGdfQiB1c2luZyBmdWxseSBxdWFsaWZpZWQgZm9ybS4KKworICAgIGdkYl90ZXN0ICJwcmludCBnX0IuQTo6YSIgIi4qID0gMyIgInByaW50IGdfQi5BOjphIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQi5BOjp4IiAiLiogPSA0IiAicHJpbnQgZ19CLkE6OngiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19CLkI6OmIiICIuKiA9IDUiICJwcmludCBnX0IuQjo6YiIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0IuQjo6eCIgIi4qID0gNiIgInByaW50IGdfQi5COjp4IgorCisgICAgIyBQcmludCBtZW1iZXJzIG9mIGdfQiB1c2luZyBub25hbWJpZ3VvdXMgY29tcGFjdCBmb3JtLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX0IuYSIgIi4qID0gMyIgInByaW50IGdfQi5hIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQi5iIiAiLiogPSA1IiAicHJpbnQgZ19CLmIiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19CLngiICIuKiA9IDYiICJwcmludCBnX0IueCIKKworICAgICMgUHJpbnQgYWxsIG1lbWJlcnMgb2YgZ19DIHVzaW5nIGZ1bGx5IHF1YWxpZmllZCBmb3JtLgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQy5BOjphIiAiLiogPSA3IiAicHJpbnQgZ19DLkE6OmEiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19DLkE6OngiICIuKiA9IDgiICJwcmludCBnX0MuQTo6eCIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0MuQzo6YyIgIi4qID0gOSIgInByaW50IGdfQy5DOjpjIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQy5DOjp4IiAiLiogPSAxMCIgInByaW50IGdfQy5DOjp4IgorCisgICAgIyBQcmludCBtZW1iZXJzIG9mIGdfQyB1c2luZyBub25hbWJpZ3VvdXMgY29tcGFjdCBmb3JtLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX0MuYSIgIi4qID0gNyIgInByaW50IGdfQy5hIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQy5jIiAiLiogPSA5IiAicHJpbnQgZ19DLmMiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19DLngiICIuKiA9IDEwIiAicHJpbnQgZ19DLngiCit9CisKKyMKKyMgU2luZ2xlIGluaGVyaXRhbmNlLCBwcmludCB0eXBlIGRlZmluaXRpb25zLgorIworCitwcm9jIHRlc3RfcHR5cGVfc2kge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIHdzCisgICAgZ2xvYmFsIG5sCisKKyAgICAjIFByaW50IGNsYXNzIEEgYXMgYSB0eXBlLgorCisgICAgc2VuZF9nZGIgInB0eXBlIEFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBBIFx7JG5sLipcWyBcXSppbnQgYTskbmxcWyBcXSppbnQgeDskbmwuKlxbIFxdKlx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBBIChGSVhNRSkiCisJfQorCS1yZSAidHlwZSA9IHN0cnVjdCBBIFx7JG5sXFsgXF0qaW50IGE7JG5sXFsgXF0qaW50IHg7JG5sXFsgXF0qXH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHR5cGUgQSAoRklYTUUpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBBIiB9CisJdGltZW91dCB7IGZhaWwgInB0eXBlIEEgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgIyBQcmludCBjbGFzcyBBIGFzIGFuIGV4cGxpY2l0IGNsYXNzLgorCisgICAgc2VuZF9nZGIgInB0eXBlIGNsYXNzIEFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBBIFx7JG5sLipcWyBcXSppbnQgYTskbmxcWyBcXSppbnQgeDskbmwuKlxbIFxdKlx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyBBIChGSVhNRSkiCisJfQorCS1yZSAidHlwZSA9IHN0cnVjdCBBIFx7JG5sXFsgXF0qaW50IGE7JG5sXFsgXF0qaW50IHg7JG5sXFsgXF0qXH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgQSAoRklYTUUpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBjbGFzcyBBIiB9CisJdGltZW91dCB7IGZhaWwgInB0eXBlIGNsYXNzIEEgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgIyBQcmludCB0eXBlIG9mIGFuIG9iamVjdCBvZiB0eXBlIEEuCisKKyAgICBzZW5kX2dkYiAicHR5cGUgZ19BXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgQSBceyRubC4qXFsgXF0qaW50IGE7JG5sXFsgXF0qaW50IHg7JG5sLipcWyBcXSpcfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgZ19BIChGSVhNRSkiCisJfQorCS1yZSAidHlwZSA9IHN0cnVjdCBBIFx7JG5sXFsgXF0qaW50IGE7JG5sXFsgXF0qaW50IHg7JG5sXFsgXF0qXH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHR5cGUgZ19BIChGSVhNRSkiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInB0eXBlIGdfQSIgfQorCXRpbWVvdXQgeyBmYWlsICJwdHlwZSBnX0EgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgIyBQcmludCBjbGFzcyBCIGFzIGEgdHlwZS4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHR5cGUgQiIgInR5cGUgPSBjbGFzcyBCIDogcHVibGljIEEgXHskbmxcWyBcXSpwdWJsaWM6JG5sXFsgXF0qaW50IGI7JG5sXFsgXF0qaW50IHg7JG5sLipcfSIgInB0eXBlIEIiCisKKyAgICAjIFByaW50IGNsYXNzIEIgYXMgYW4gZXhwbGljaXQgY2xhc3MuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIGNsYXNzIEIiICJ0eXBlID0gY2xhc3MgQiA6IHB1YmxpYyBBIFx7JG5sXFsgXF0qcHVibGljOiRubFxbIFxdKmludCBiOyRubFxbIFxdKmludCB4OyRubC4qXH0iICJwdHlwZSBjbGFzcyBCIgorCisgICAgIyBQcmludCB0eXBlIG9mIGFuIG9iamVjdCBvZiB0eXBlIEIuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIGdfQiIgInR5cGUgPSBjbGFzcyBCIDogcHVibGljIEEgXHskbmxcWyBcXSpwdWJsaWM6JG5sXFsgXF0qaW50IGI7JG5sXFsgXF0qaW50IHg7JG5sLipcfSIgInB0eXBlIGdfQiIKKworICAgICMgUHJpbnQgY2xhc3MgQyBhcyBhIHR5cGUuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIEMiICJ0eXBlID0gY2xhc3MgQyA6IHB1YmxpYyBBIFx7JG5sXFsgXF0qcHVibGljOiRubFxbIFxdKmludCBjOyRubFxbIFxdKmludCB4OyRubC4qXH0iICJwdHlwZSBDIgorCisgICAgIyBQcmludCBjbGFzcyBDIGFzIGFuIGV4cGxpY2l0IGNsYXNzLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwdHlwZSBjbGFzcyBDIiAidHlwZSA9IGNsYXNzIEMgOiBwdWJsaWMgQSBceyRubFxbIFxdKnB1YmxpYzokbmxcWyBcXSppbnQgYzskbmxcWyBcXSppbnQgeDskbmwuKlx9IiAicHR5cGUgY2xhc3MgQyIKKworICAgICMgUHJpbnQgdHlwZSBvZiBhbiBvYmplY3Qgb2YgdHlwZSBnX0MuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIGdfQyIgInR5cGUgPSBjbGFzcyBDIDogcHVibGljIEEgXHskbmxcWyBcXSpwdWJsaWM6JG5sXFsgXF0qaW50IGM7JG5sXFsgXF0qaW50IHg7JG5sLipcfSIgInB0eXBlIGdfQyIKKworICAgICMgZ2NjIGN5Z251cy0yLjMuMyAoUTEpIGhhcyB0aGlzIGJ1ZywgYnV0IGl0IHdhcyBmaXhlZCBhcyBvZgorICAgICMgY3lnbnVzLTIuMy4zLTkzMDQxNy4gIFBSIDI4MTkuCisgICAgc2VuZF9nZGIgInB0eXBlIHRhZ2xlc3Nfc3RydWN0XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgXHske3dzfXB1YmxpYzoke3dzfWludCBvbmU7JHt3c31pbnQgdHdvOyR7d3N9dGFnbGVzc19zdHJ1Y3QgJiBvcGVyYXRvcj1cXCh0YWdsZXNzX3N0cnVjdCAmXFwpOyR7d3N9XFxcJF8xIFxcKHRhZ2xlc3Nfc3RydWN0ICZcXCk7JHt3c31cXFwkXzEgXFwoXFwpOyR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHRhZ2xlc3Mgc3RydWN0IgorCX0KKwktcmUgInR5cGUgPSAoc3RydWN0fGNsYXNzKS4qXHsuKmludCBvbmU7LippbnQgdHdvOy4qXH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHRhZ2xlc3Mgc3RydWN0IChvYnNvbGV0ZSBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgdGFnbGVzcyBzdHJ1Y3QiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSB0YWdsZXNzIHN0cnVjdCAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSB2X3RhZ2xlc3NcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBceyR7d3N9cHVibGljOiR7d3N9aW50IG9uZTske3dzfWludCB0d287JHt3c310YWdsZXNzX3N0cnVjdCAmIG9wZXJhdG9yPVxcKHRhZ2xlc3Nfc3RydWN0ICZcXCk7JHt3c31cXFwkXzEgXFwodGFnbGVzc19zdHJ1Y3QgJlxcKTske3dzfVxcXCRfMSBcXChcXCk7JHt3c31cfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgdmFyaWFibGUgb2YgdHlwZSB0YWdsZXNzIHN0cnVjdCIKKwl9CisJLXJlICJ0eXBlID0gKHN0cnVjdHxjbGFzcykuKlx7LippbnQgb25lOy4qaW50IHR3bzsuKlx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSB2YXJpYWJsZSBvZiB0eXBlIHRhZ2xlc3Mgc3RydWN0IChvYnNvbGV0ZSBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgdmFyaWFibGUgb2YgdHlwZSB0YWdsZXNzIHN0cnVjdCIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIHZhcmlhYmxlIG9mIHR5cGUgdGFnbGVzcyBzdHJ1Y3QgKHRpbWVvdXQpIgorCX0KKyAgICB9Cit9CisKKyMKKyMgU2luZ2xlIGluaGVyaXRhbmNlLCBwcmludCBjb21wbGV0ZSBjbGFzc2VzLgorIworCitwcm9jIHRlc3RfcHJpbnRfc2lfY2xhc3NlcyB7fSB7CisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX0EuCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19BIiAiLiogPSBce2EgPSAxLCB4ID0gMlx9IiAicHJpbnQgZ19BIgorCisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX0IuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQiIgIi4qID0gXHtcPEFcPiA9IFx7YSA9IDMsIHggPSA0XH0sIGIgPSA1LCB4ID0gNlx9IiAicHJpbnQgZ19CIgorCisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX0MuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQyIgIi4qID0gXHtcPEFcPiA9IFx7YSA9IDcsIHggPSA4XH0sIGMgPSA5LCB4ID0gMTBcfSIgInByaW50IGdfQyIKK30KKworIworIyBTaW5nbGUgaW5oZXJpdGFuY2UsIHByaW50IGFub255bW91cyB1bmlvbnMuCisjIEdEQiB2ZXJzaW9ucyBwcmlvciB0byA0LjE0IGVudGVyZWQgYW4gaW5maW5pdGUgbG9vcCB3aGVuIHByaW50aW5nCisjIHRoZSB0eXBlIG9mIGEgY2xhc3MgY29udGFpbmluZyBhbiBhbm9ueW1vdXMgdW5pb24sIGFuZCB0aGV5IHdlcmUgYWxzbworIyBpbmNhcGFibGUgb2YgcHJpbnRpbmcgdGhlIG1lbWJlciBvZiBhbiBhbm9ueW1vdXMgdW5pb24uCisjIFdlIHRlc3QgdGhlIHByaW50aW5nIG9mIHRoZSBtZW1iZXIgZmlyc3QsIGFuZCBwZXJmb3JtIHRoZSBvdGhlciB0ZXN0cworIyBvbmx5IGlmIHRoZSB0ZXN0IHN1Y2NlZWRzLCB0byBhdm9pZCB0aGUgaW5maW5pdGUgbG9vcC4KKyMKKworcHJvYyB0ZXN0X3ByaW50X2Fub25fdW5pb24ge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIHdzCisgICAgZ2xvYmFsIG5sCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInByaW50IGdfYW5vbl91bmlvbi5hIiAiLiogPSAyIiAicHJpbnQgYW5vbnltb3VzIHVuaW9uIG1lbWJlciIKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgc2VuZF9nZGIgInByaW50IGdfYW5vbl91bmlvblxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSBce29uZSA9IDEsICA9IFx7YSA9IDIsIGIgPSAyXH1cfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHJpbnQgdmFyaWFibGUgb2YgdHlwZSBhbm9ueW1vdXMgdW5pb24iCisJfQorCS1yZSAiLiogPSAuKlx7b25lID0gMSwgID0gXHthID0gMiwgYiA9IC4qXH1cfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHJpbnQgdmFyaWFibGUgb2YgdHlwZSBhbm9ueW1vdXMgdW5pb24gKG9ic29sZXRlIGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwcmludCB2YXJpYWJsZSBvZiB0eXBlIGFub255bW91cyB1bmlvbiIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInByaW50IHZhcmlhYmxlb2YgdHlwZSBhbm9ueW1vdXMgdW5pb24gKHRpbWVvdXQpIgorCX0KKyAgICB9CisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIHNlbmRfZ2RiICJwdHlwZSBnX2Fub25fdW5pb25cbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBjbGFzc193aXRoX2Fub25fdW5pb24gXHske3dzfXB1YmxpYzoke3dzfWludCBvbmU7JHt3c311bmlvbiBceyR7d3N9cHVibGljOiR7d3N9aW50IGE7JHt3c31sb25nIGludCBiOyR7d3N9dW5pb24gXHtcLlwuXC5cfSAmIG9wZXJhdG9yPVxcKHVuaW9uIFx7XC5cLlwuXH0gJlxcKTske3dzfVxcXCRfMCBcXCh1bmlvbiBce1wuXC5cLlx9ICZcXCk7JHt3c31cXFwkXzAgXFwoXFwpOyR7d3N9XH07JHt3c31jbGFzc193aXRoX2Fub25fdW5pb24gJiBvcGVyYXRvcj1cXChjbGFzc193aXRoX2Fub25fdW5pb24gY29uc3QgJlxcKTske3dzfWNsYXNzX3dpdGhfYW5vbl91bmlvblxcKGNsYXNzX3dpdGhfYW5vbl91bmlvbiBjb25zdCAmXFwpOyR7d3N9Y2xhc3Nfd2l0aF9hbm9uX3VuaW9uXFwodm9pZFxcKTske3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwcmludCB0eXBlIG9mIGFub255bW91cyB1bmlvbiIKKwl9CisJLXJlICJ0eXBlID0gKHN0cnVjdHxjbGFzcykuKlx7LippbnQgb25lOy4qdW5pb24gXHsuKmludCBhOy4qKGxvbmd8bG9uZyBpbnR8aW50KSBiOy4qXH07LipcfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHJpbnQgdHlwZSBvZiBhbm9ueW1vdXMgdW5pb24gKG9ic29sZXRlIGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwcmludCB0eXBlIG9mIGFub255bW91cyB1bmlvbiIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInByaW50IHR5cGUgb2YgYW5vbnltb3VzIHVuaW9uICh0aW1lb3V0KSIKKwl9CisgICAgfQorfQorCisjCisjIE11bHRpcGxlIGluaGVyaXRhbmNlLCBwcmludCBpbmRpdmlkdWFsIG1lbWJlcnMuCisjCisKK3Byb2MgdGVzdF9wcmludF9taV9tZW1iZXJzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBubAorCisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX0EuCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19BLkE6OmEiICIuKiA9IDEiICJwcmludCBnX0EuQTo6YSIKKyAgICAKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19BLkE6OngiICIuKiA9IDIiICJwcmludCBnX0EuQTo6eCIKKworICAgICMgUHJpbnQgYWxsIG1lbWJlcnMgb2YgZ19CLgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQi5BOjphIiAiLiogPSAzIiAicHJpbnQgZ19CLkE6OmEiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19CLkE6OngiICIuKiA9IDQiICJwcmludCBnX0IuQTo6eCIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0IuQjo6YiIgIi4qID0gNSIgInByaW50IGdfQi5COjpiIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQi5COjp4IiAiLiogPSA2IiAicHJpbnQgZ19CLkI6OngiCisKKyAgICAjIFByaW50IGFsbCBtZW1iZXJzIG9mIGdfQy4KKworICAgIGdkYl90ZXN0ICJwcmludCBnX0MuQTo6YSIgIi4qID0gNyIgInByaW50IGdfQy5BOjphIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQy5BOjp4IiAiLiogPSA4IiAicHJpbnQgZ19DLkE6OngiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19DLkM6OmMiICIuKiA9IDkiICJwcmludCBnX0MuQzo6YyIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0MuQzo6eCIgIi4qID0gMTAiICJwcmludCBnX0MuQzo6eCIKKworICAgICMgUHJpbnQgYWxsIG1lbWJlcnMgb2YgZ19ELgorCisgICAgIyBUaGUgZm9sbG93aW5nIGlzIGFtYmlndW91cywgYW5kIGdkYiBzaG91bGQgZGV0ZWN0IHRoaXMuCisgICAgIyBGb3Igbm93LCBhY2NlcHQgZ2RiJ3MgYmVoYXZpb3IgYXMgYW4gZXhwZWN0ZWQgZmFpbHVyZSBpZiBpdAorICAgICMgc2ltcGx5IHByaW50cyBlaXRoZXIgbWVtYmVyIGNvcnJlY3RseS4KKworICAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICBzZW5kX2dkYiAicHJpbnQgZ19ELkE6OmFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qID0gMTEkbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInByaW50IGdfRC5BOjphIChGSVhNRSkiCisJfQorCS1yZSAiLiogPSAxNSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHJpbnQgZ19ELkE6OmEgKEZJWE1FKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZ19ELkE6OmEiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHJpbnQgZ19ELkE6OmEgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgIyBUaGUgZm9sbG93aW5nIGlzIGFtYmlndW91cywgYW5kIGdkYiBzaG91bGQgZGV0ZWN0IHRoaXMuCisgICAgIyBGb3Igbm93LCBhY2NlcHQgZ2RiJ3MgYmVoYXZpb3IgYXMgYW4gZXhwZWN0ZWQgZmFpbHVyZSBpZiBpdAorICAgICMgc2ltcGx5IHByaW50cyBlaXRoZXIgbWVtYmVyIGNvcnJlY3RseS4KKworICAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICBzZW5kX2dkYiAicHJpbnQgZ19ELkE6OnhcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qID0gMTIkbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInByaW50IGdfRC5BOjp4IChGSVhNRSkiCisJfQorCS1yZSAiLiogPSAxNiRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHJpbnQgZ19ELkE6OnggKEZJWE1FKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZ19ELkE6OngiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHJpbnQgZ19ELkE6OnggKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRC5COjpiIiAiLiogPSAxMyIgInByaW50IGdfRC5COjpiIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRC5COjp4IiAiLiogPSAxNCIgInByaW50IGdfRC5COjp4IgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX0QuQzo6YyIgIi4qID0gMTciICJwcmludCBnX0QuQzo6YyIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19ELkM6OngiICIuKiA9IDE4IiAicHJpbnQgZ19ELkM6OngiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19ELkQ6OmQiICIuKiA9IDE5IiAicHJpbnQgZ19ELkQ6OmQiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19ELkQ6OngiICIuKiA9IDIwIiAicHJpbnQgZ19ELkQ6OngiCisKKyAgICAjIFByaW50IGFsbCBtZW1iZXJzIG9mIGdfRS4KKworICAgICMgVGhlIGZvbGxvd2luZyBpcyBhbWJpZ3VvdXMsIGFuZCBnZGIgc2hvdWxkIGRldGVjdCB0aGlzLgorICAgICMgRm9yIG5vdywgYWNjZXB0IGdkYidzIGJlaGF2aW9yIGFzIGFuIGV4cGVjdGVkIGZhaWx1cmUgaWYgaXQKKyAgICAjIHNpbXBseSBwcmludHMgZWl0aGVyIG1lbWJlciBjb3JyZWN0bHkuCisKKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgc2VuZF9nZGIgInByaW50IGdfRS5BOjphXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IDIxJG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwcmludCBnX0UuQTo6YSAoRklYTUUpIgorCX0KKwktcmUgIi4qID0gMjUkbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInByaW50IGdfRS5BOjphIChGSVhNRSkiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGdfRS5BOjphIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IGdfRS5BOjphICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgICMgVGhlIGZvbGxvd2luZyBpcyBhbWJpZ3VvdXMsIGFuZCBnZGIgc2hvdWxkIGRldGVjdCB0aGlzLgorICAgICMgRm9yIG5vdywgYWNjZXB0IGdkYidzIGJlaGF2aW9yIGFzIGFuIGV4cGVjdGVkIGZhaWx1cmUgaWYgaXQKKyAgICAjIHNpbXBseSBwcmludHMgZWl0aGVyIG1lbWJlciBjb3JyZWN0bHkuCisKKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgc2VuZF9nZGIgInByaW50IGdfRS5BOjp4XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IDIyJG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwcmludCBnX0UuQTo6eCAoRklYTUUpIgorCX0KKwktcmUgIi4qID0gMjYkbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInByaW50IGdfRS5BOjp4IChGSVhNRSkiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGdfRS5BOjp4IiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IGdfRS5BOjp4ICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgIGdkYl90ZXN0ICJwcmludCBnX0UuQjo6YiIgIi4qID0gMjMiICJwcmludCBnX0UuQjo6YiIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0UuQjo6eCIgIi4qID0gMjQiICJwcmludCBnX0UuQjo6eCIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19FLkM6OmMiICIuKiA9IDI3IiAicHJpbnQgZ19FLkM6OmMiCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRS5DOjp4IiAiLiogPSAyOCIgInByaW50IGdfRS5DOjp4IgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRS5EOjpkIiAiLiogPSAyOSIgInByaW50IGdfRS5EOjpkIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRS5EOjp4IiAiLiogPSAzMCIgInByaW50IGdfRS5EOjp4IgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRS5FOjplIiAiLiogPSAzMSIgInByaW50IGdfRS5FOjplIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRS5FOjp4IiAiLiogPSAzMiIgInByaW50IGdfRS5FOjp4IgorfQorCisjCisjIE11bHRpcGxlIGluaGVyaXRhbmNlLCBwcmludCB0eXBlIGRlZmluaXRpb25zLgorIworCitwcm9jIHRlc3RfcHR5cGVfbWkge30geworICAgIGdsb2JhbCBubAorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwdHlwZSBEIiAidHlwZSA9IGNsYXNzIEQgOiBwdWJsaWMgQiwgcHVibGljIEMgXHskbmxcWyBcXSpwdWJsaWM6JG5sXFsgXF0qaW50IGQ7JG5sXFsgXF0qaW50IHg7JG5sLipcfSIgInB0eXBlIEQiCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIGNsYXNzIEQiICJ0eXBlID0gY2xhc3MgRCA6IHB1YmxpYyBCLCBwdWJsaWMgQyBceyRubFxbIFxdKnB1YmxpYzokbmxcWyBcXSppbnQgZDskbmxcWyBcXSppbnQgeDskbmwuKlx9IiAicHR5cGUgY2xhc3MgRCIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHR5cGUgZ19EIiAidHlwZSA9IGNsYXNzIEQgOiBwdWJsaWMgQiwgcHVibGljIEMgXHskbmxcWyBcXSpwdWJsaWM6JG5sXFsgXF0qaW50IGQ7JG5sXFsgXF0qaW50IHg7JG5sLipcfSIgInB0eXBlIGdfRCIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHR5cGUgRSIgInR5cGUgPSBjbGFzcyBFIDogcHVibGljIEQgXHskbmxcWyBcXSpwdWJsaWM6JG5sXFsgXF0qaW50IGU7JG5sXFsgXF0qaW50IHg7JG5sLipcfSIgInB0eXBlIEUiCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIGNsYXNzIEUiICJ0eXBlID0gY2xhc3MgRSA6IHB1YmxpYyBEIFx7JG5sXFsgXF0qcHVibGljOiRubFxbIFxdKmludCBlOyRubFxbIFxdKmludCB4OyRubC4qXH0iICJwdHlwZSBjbGFzcyBFIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwdHlwZSBnX0UiICJ0eXBlID0gY2xhc3MgRSA6IHB1YmxpYyBEIFx7JG5sXFsgXF0qcHVibGljOiRubFxbIFxdKmludCBlOyRubFxbIFxdKmludCB4OyRubC4qXH0iICJwdHlwZSBnX0UiCit9CisKKyMKKyMgTXVsdGlwbGUgaW5oZXJpdGFuY2UsIHByaW50IGNvbXBsZXRlIGNsYXNzZXMuCisjCisKK3Byb2MgdGVzdF9wcmludF9taV9jbGFzc2VzIHt9IHsKKyAgICAjIFByaW50IGFsbCBtZW1iZXJzIG9mIGdfRC4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19EIiAiLiogPSBce1w8Qlw+ID0gXHtcPEFcPiA9IFx7YSA9IDExLCB4ID0gMTJcfSwgYiA9IDEzLCB4ID0gMTRcfSwgXDxDXD4gPSBce1w8QVw+ID0gXHthID0gMTUsIHggPSAxNlx9LCBjID0gMTcsIHggPSAxOFx9LCBkID0gMTksIHggPSAyMFx9IiAicHJpbnQgZ19EIgorCisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX0UuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRSIgIi4qID0gXHtcPERcPiA9IFx7XDxCXD4gPSBce1w8QVw+ID0gXHthID0gMjEsIHggPSAyMlx9LCBiID0gMjMsIHggPSAyNFx9LCBcPENcPiA9IFx7XDxBXD4gPSBce2EgPSAyNSwgeCA9IDI2XH0sIGMgPSAyNywgeCA9IDI4XH0sIGQgPSAyOSwgeCA9IDMwXH0sIGUgPSAzMSwgeCA9IDMyXH0iICJwcmludCBnX0UiCit9CisKKyMKKyMgU2luZ2xlIHZpcnR1YWwgaW5oZXJpdGFuY2UsIHByaW50IGluZGl2aWR1YWwgbWVtYmVycy4KKyMKKworcHJvYyB0ZXN0X3ByaW50X3N2aV9tZW1iZXJzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBkZWNpbWFsCisgICAgZ2xvYmFsIG5sCisKKyAgICAjIFByaW50IGFsbCBtZW1iZXJzIG9mIGdfdkEuCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192QS52QTo6dmEiICIuKiA9IDEiICJwcmludCBnX3ZBLnZBOjp2YSIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX3ZBLnZBOjp2eCIgIi4qID0gMiIgInByaW50IGdfdkEudkE6OnZ4IgorCisgICAgIyBQcmludCBtZW1iZXJzIG9mIGdfdkEgdXNpbmcgY29tcGFjdCBmb3JtLgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkEudmEiICIuKiA9IDEiICJwcmludCBnX3ZBLnZhIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkEudngiICIuKiA9IDIiICJwcmludCBnX3ZBLnZ4IgorCisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX3ZCLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIHNlbmRfZ2RiICJwcmludCBnX3ZCLnZBOjp2YVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSAzJG5sJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBnX3ZCLnZBOjp2YSIgfQorCS1yZSAiLip2aXJ0dWFsIGJhc2VjbGFzcyBib3RjaC4qJGdkYl9wcm9tcHQgJCIgeworCSAgICAjIERvZXMgbm90IGhhcHBlbiB3aXRoIGdjYyBjeWdudXMtMi40LjUtOTMwODI4CisJICAgIGZhaWwgInByaW50IGdfdkIudkE6OnZhIChrbm93biBidWcgd2l0aCBnY2MgY3lnbnVzLTIuNC41LTkzMDQxNykiCisJICAgICMgTWFueSBvZiB0aGUgcmVzdCBvZiB0aGVzZSB0ZXN0cyBoYXZlIHRoZSBzYW1lIHByb2JsZW0uCisJICAgIHJldHVybiAwCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGdfdkIudkE6OnZhIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IGdfdkIudkE6OnZhICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192Qi52QTo6dngiICIuKiA9IDQiICJwcmludCBnX3ZCLnZBOjp2eCIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX3ZCLnZCOjp2YiIgIi4qID0gNSIgInByaW50IGdfdkIudkI6OnZiIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkIudkI6OnZ4IiAiLiogPSA2IiAicHJpbnQgZ192Qi52Qjo6dngiCisKKyAgICAjIFByaW50IG1lbWJlcnMgb2YgZ192QiB1c2luZyBjb21wYWN0IGZvcm0uCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkIudmEiICIuKiA9IDMiICJwcmludCBnX3ZCLnZhIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkIudmIiICIuKiA9IDUiICJwcmludCBnX3ZCLnZiIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkIudngiICIuKiA9IDYiICJwcmludCBnX3ZCLnZ4IgorCisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX3ZDLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX3ZDLnZBOjp2YSIgIi4qID0gNyIgInByaW50IGdfdkMudkE6OnZhIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX3ZDLnZBOjp2eCIgIi4qID0gOCIgInByaW50IGdfdkMudkE6OnZ4IgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkMudkM6OnZjIiAiLiogPSA5IiAicHJpbnQgZ192Qy52Qzo6dmMiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192Qy52Qzo6dngiICIuKiA9IDEwIiAicHJpbnQgZ192Qy52Qzo6dngiCisKKyAgICAjIFByaW50IG1lbWJlcnMgb2YgZ192QyB1c2luZyBjb21wYWN0IGZvcm0uCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkMudmEiICIuKiA9IDciICJwcmludCBnX3ZDLnZhIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkMudmMiICIuKiA9IDkiICJwcmludCBnX3ZDLnZjIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkMudngiICIuKiA9IDEwIiAicHJpbnQgZ192Qy52eCIKK30KKworIworIyBTaW5nbGUgdmlydHVhbCBpbmhlcml0YW5jZSwgcHJpbnQgdHlwZSBkZWZpbml0aW9ucy4KKyMKKworcHJvYyB0ZXN0X3B0eXBlX3ZpIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBubAorCisgICAgIyBUaGlzIGNsYXNzIGRvZXMgbm90IHVzZSBhbnkgQysrLXNwZWNpZmljIGZlYXR1cmVzLCBzbyBpdCdzIGZpbmUgZm9yCisgICAgIyBpdCB0byBwcmludCBhcyAic3RydWN0Ii4KKyAgICBzZW5kX2dkYiAicHR5cGUgdkFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyB2QSBceyRubFxbIFxdKnB1YmxpYzokbmxcWyBcXSppbnQgdmE7JG5sXFsgXF0qaW50IHZ4OyRubC4qXH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHZBIgorCX0KKwktcmUgInR5cGUgPSBzdHJ1Y3QgdkEgXHskbmxcWyBcXSppbnQgdmE7JG5sXFsgXF0qaW50IHZ4OyRubFx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSB2QSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHR5cGUgdkEiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHR5cGUgdkEgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgIyBUaGlzIGNsYXNzIGRvZXMgbm90IHVzZSBhbnkgQysrLXNwZWNpZmljIGZlYXR1cmVzLCBzbyBpdCdzIGZpbmUgZm9yCisgICAgIyBpdCB0byBwcmludCBhcyAic3RydWN0Ii4KKyAgICBzZW5kX2dkYiAicHR5cGUgY2xhc3MgdkFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyB2QSBceyRubFxbIFxdKnB1YmxpYzokbmxcWyBcXSppbnQgdmE7JG5sXFsgXF0qaW50IHZ4OyRubC4qXH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIHZBIgorCX0KKwktcmUgInR5cGUgPSBzdHJ1Y3QgdkEgXHskbmxcWyBcXSppbnQgdmE7JG5sXFsgXF0qaW50IHZ4OyRubFx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyB2QSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHR5cGUgY2xhc3MgdkEiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHR5cGUgY2xhc3MgdkEgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgIyBUaGlzIGNsYXNzIGRvZXMgbm90IHVzZSBhbnkgQysrLXNwZWNpZmljIGZlYXR1cmVzLCBzbyBpdCdzIGZpbmUgZm9yCisgICAgIyBpdCB0byBwcmludCBhcyAic3RydWN0Ii4KKyAgICBzZW5kX2dkYiAicHR5cGUgZ192QVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIHZBIFx7JG5sXFsgXF0qcHVibGljOiRubFxbIFxdKmludCB2YTskbmxcWyBcXSppbnQgdng7JG5sLipcfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgZ192QSIKKwl9CisJLXJlICJ0eXBlID0gc3RydWN0IHZBIFx7JG5sXFsgXF0qaW50IHZhOyRubFxbIFxdKmludCB2eDskbmxcfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgZ192QSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHR5cGUgZ192QSIgfQorCXRpbWVvdXQgeyBmYWlsICJwdHlwZSBnX3ZBICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHR5cGUgdkIiICJwdHlwZSB2QlxbXHJcblxdK3R5cGUgPSBjbGFzcyB2QiA6IHB1YmxpYyB2aXJ0dWFsIHZBIFx7JG5sICBwcml2YXRlOiRubFxbIFxdK3ZBIFxbKlxdK192YlxbXFxcJFwuXF0rdkE7JG5sICBwdWJsaWM6JG5sXFsgXF0raW50IHZiOyRubFxbIFxdK2ludCB2eDskbmwuKlx9IiAicHR5cGUgdkIiCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIGNsYXNzIHZCIiAidHlwZSA9IGNsYXNzIHZCIDogcHVibGljIHZpcnR1YWwgdkEgXHskbmxcWyBcXSpwcml2YXRlOiRubFxbIFxdKnZBIFxbKlxdK192YlxbXFxcJFwuXF12QTskbmxcWyBcXSpwdWJsaWM6JG5sXFsgXF0qaW50IHZiOyRubFxbIFxdKmludCB2eDskbmwuKlx9IiAicHR5cGUgY2xhc3MgdkIiCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIGdfdkIiICJ0eXBlID0gY2xhc3MgdkIgOiBwdWJsaWMgdmlydHVhbCB2QSBceyRubFxbIFxdKnByaXZhdGU6JG5sXFsgXF0qdkEgXFsqXF0rX3ZiXFtcXFwkXC5cXXZBOyRubFxbIFxdKnB1YmxpYzokbmxcWyBcXSppbnQgdmI7JG5sXFsgXF0qaW50IHZ4OyRubC4qXH0iICJwdHlwZSBnX3ZCIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwdHlwZSB2QyIgInR5cGUgPSBjbGFzcyB2QyA6IHB1YmxpYyB2aXJ0dWFsIHZBIFx7JG5sXFsgXF0qcHJpdmF0ZTokbmxcWyBcXSp2QSBcWypcXStfdmJcW1xcXCRcLlxddkE7JG5sXFsgXF0qcHVibGljOiRubFxbIFxdKmludCB2YzskbmxcWyBcXSppbnQgdng7JG5sLipcfSIgInB0eXBlIHZDIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwdHlwZSBjbGFzcyB2QyIgInR5cGUgPSBjbGFzcyB2QyA6IHB1YmxpYyB2aXJ0dWFsIHZBIFx7JG5sXFsgXF0qcHJpdmF0ZTokbmxcWyBcXSp2QSBcWypcXStfdmJcW1xcXCRcLlxddkE7JG5sXFsgXF0qcHVibGljOiRubFxbIFxdKmludCB2YzskbmxcWyBcXSppbnQgdng7JG5sLipcfSIgInB0eXBlIGNsYXNzIHZDIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwdHlwZSBnX3ZDIiAidHlwZSA9IGNsYXNzIHZDIDogcHVibGljIHZpcnR1YWwgdkEgXHskbmxcWyBcXSpwcml2YXRlOiRubFxbIFxdKnZBIFxbKlxdK192YlxbXFxcJFwuXF12QTskbmxcWyBcXSpwdWJsaWM6JG5sXFsgXF0qaW50IHZjOyRubFxbIFxdKmludCB2eDskbmwuKlx9IiAicHR5cGUgZ192QyIKK30KKworIworIyBTaW5nbGUgdmlydHVhbCBpbmhlcml0YW5jZSwgcHJpbnQgY29tcGxldGUgY2xhc3Nlcy4KKyMKKworcHJvYyB0ZXN0X3ByaW50X3N2aV9jbGFzc2VzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorICAgIGdsb2JhbCBubAorCisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX3ZBLgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkEiICIuKiA9IFx7dmEgPSAxLCB2eCA9IDJcfSIgInByaW50IGdfdkEiCisKKyAgICAjIFByaW50IGFsbCBtZW1iZXJzIG9mIGdfdkIuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgc2VuZF9nZGIgInByaW50IGdfdkJcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qID0gXHtcPHZBXD4gPSBce3ZhID0gMywgdnggPSA0XH0sIF92YlxbXFxcJFwuXF12QSA9ICRoZXgsIHZiID0gNSwgdnggPSA2XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInByaW50IGdfdkIiCisJfQorCS1yZSAiLippbnZhbGlkIGFkZHJlc3MgMHgwLiokZ2RiX3Byb21wdCAkIiB7CisJICAgICMgRG9lcyBub3QgaGFwcGVuIHdpdGggZ2NjIGN5Z251cy0yLjQuNS05MzA4MjgKKwkgICAgZmFpbCAicHJpbnQgZ192QiAoa25vd24gYnVnIHdpdGggZ2NjIGN5Z251cy0yLjQuNS05MzA0MTcpIgorCSAgICAjIE1hbnkgb2YgdGhlIHJlc3Qgb2YgdGhlc2UgdGVzdHMgaGF2ZSB0aGUgc2FtZSBwcm9ibGVtLgorCSAgICByZXR1cm4gMAorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBnX3ZCIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IGdfdkIgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX3ZDLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX3ZDIiAiLiogPSBce1w8dkFcPiA9IFx7dmEgPSA3LCB2eCA9IDhcfSwgX3ZiXFtcXFwkXC5cXXZBID0gJGhleCwgdmMgPSA5LCB2eCA9IDEwXH0iICJwcmludCBnX3ZDIgorfQorCisjCisjIE11bHRpcGxlIHZpcnR1YWwgaW5oZXJpdGFuY2UsIHByaW50IGluZGl2aWR1YWwgbWVtYmVycy4KKyMKKworcHJvYyB0ZXN0X3ByaW50X212aV9tZW1iZXJzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBkZWNpbWFsCisgICAgZ2xvYmFsIG5sCisKKyAgICAjIFByaW50IGFsbCBtZW1iZXJzIG9mIGdfdkQuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgc2VuZF9nZGIgInByaW50IGdfdkQudkE6OnZhXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IDE5JG5sJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBnX3ZELnZBOjp2YSIgfQorCS1yZSAiLip2aXJ0dWFsIGJhc2VjbGFzcyBib3RjaC4qJGdkYl9wcm9tcHQgJCIgeworCSAgICAjIERvZXMgbm90IGhhcHBlbiB3aXRoIGdjYyBjeWdudXMtMi40LjUtOTMwODI4CisJICAgIGZhaWwgInByaW50IGdfdkQudkE6OnZhIChrbm93biBidWcgd2l0aCBnY2MgY3lnbnVzLTIuNC41LTkzMDQxNykiCisJICAgICMgTWFueSBvZiB0aGUgcmVzdCBvZiB0aGVzZSB0ZXN0cyBoYXZlIHRoZSBzYW1lIHByb2JsZW0uCisJICAgIHJldHVybiAwCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGdfdkQudkE6OnZhIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IGdfdkQudkE6OnZhICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192RC52QTo6dngiICIuKiA9IDIwIiAicHJpbnQgZ192RC52QTo6dngiCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkQudkI6OnZiIiAiLiogPSAyMSIgInByaW50IGdfdkQudkI6OnZiIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX3ZELnZCOjp2eCIgIi4qID0gMjIiICJwcmludCBnX3ZELnZCOjp2eCIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192RC52Qzo6dmMiICIuKiA9IDIzIiAicHJpbnQgZ192RC52Qzo6dmMiCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkQudkM6OnZ4IiAiLiogPSAyNCIgInByaW50IGdfdkQudkM6OnZ4IgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkQudkQ6OnZkIiAiLiogPSAyNSIgInByaW50IGdfdkQudkQ6OnZkIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkQudkQ6OnZ4IiAiLiogPSAyNiIgInByaW50IGdfdkQudkQ6OnZ4IgorCisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX3ZFLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX3ZFLnZBOjp2YSIgIi4qID0gMCIgInByaW50IGdfdkUudkE6OnZhIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX3ZFLnZBOjp2eCIgIi4qID0gMCIgInByaW50IGdfdkUudkE6OnZ4IgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX3ZFLnZCOjp2YiIgIi4qID0gMCIgInByaW50IGdfdkUudkI6OnZiIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX3ZFLnZCOjp2eCIgIi4qID0gMCIgInByaW50IGdfdkUudkI6OnZ4IgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX3ZFLnZDOjp2YyIgIi4qID0gMCIgInByaW50IGdfdkUudkM6OnZjIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX3ZFLnZDOjp2eCIgIi4qID0gMCIgInByaW50IGdfdkUudkM6OnZ4IgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX3ZFLnZEOjp2ZCIgIi4qID0gMCIgInByaW50IGdfdkUudkQ6OnZkIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkUudkQ6OnZ4IiAiLiogPSAwIiAicHJpbnQgZ192RS52RDo6dngiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192RS52RTo6dmUiICIuKiA9IDI3IiAicHJpbnQgZ192RS52RTo6dmUiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192RS52RTo6dngiICIuKiA9IDI4IiAicHJpbnQgZ192RS52RTo6dngiCit9CisKKyMKKyMgTXVsdGlwbGUgdmlydHVhbCBpbmhlcml0YW5jZSwgcHJpbnQgdHlwZSBkZWZpbml0aW9ucy4KKyMKKworcHJvYyB0ZXN0X3B0eXBlX212aSB7fSB7CisgICAgZ2xvYmFsIG5sCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIHZEIiAidHlwZSA9IGNsYXNzIHZEIDogcHVibGljIHZpcnR1YWwgdkIsIHB1YmxpYyB2aXJ0dWFsIHZDIFx7JG5sXFsgXF0qcHJpdmF0ZTokbmxcWyBcXSp2QyBcWypcXStfdmJcW1xcXCRcLlxddkM7JG5sXFsgXF0qdkIgXFsqXF0rX3ZiXFtcXFwkXC5cXXZCOyRubFxbIFxdKnB1YmxpYzokbmxcWyBcXSppbnQgdmQ7JG5sXFsgXF0qaW50IHZ4OyRubC4qXH0iICJwdHlwZSB2RCIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHR5cGUgY2xhc3MgdkQiICJ0eXBlID0gY2xhc3MgdkQgOiBwdWJsaWMgdmlydHVhbCB2QiwgcHVibGljIHZpcnR1YWwgdkMgXHskbmxcWyBcXSpwcml2YXRlOiRubFxbIFxdKnZDIFxbKlxdK192YlxbXFxcJFwuXF12QzskbmxcWyBcXSp2QiBcWypcXStfdmJcW1xcXCRcLlxddkI7JG5sXFsgXF0qcHVibGljOiRubFxbIFxdKmludCB2ZDskbmxcWyBcXSppbnQgdng7JG5sLipcfSIgInB0eXBlIGNsYXNzIHZEIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwdHlwZSBnX3ZEIiAidHlwZSA9IGNsYXNzIHZEIDogcHVibGljIHZpcnR1YWwgdkIsIHB1YmxpYyB2aXJ0dWFsIHZDIFx7JG5sXFsgXF0qcHJpdmF0ZTokbmxcWyBcXSp2QyBcWypcXStfdmJcW1xcXCRcLlxddkM7JG5sXFsgXF0qdkIgXFsqXF0rX3ZiXFtcXFwkXC5cXXZCOyRubFxbIFxdKnB1YmxpYzokbmxcWyBcXSppbnQgdmQ7JG5sXFsgXF0qaW50IHZ4OyRubC4qXH0iICJwdHlwZSBnX3ZEIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwdHlwZSB2RSIgInR5cGUgPSBjbGFzcyB2RSA6IHB1YmxpYyB2aXJ0dWFsIHZEIFx7JG5sXFsgXF0qcHJpdmF0ZTokbmxcWyBcXSp2RCBcWypcXStfdmJcW1xcXCRcLlxddkQ7JG5sXFsgXF0qcHVibGljOiRubFxbIFxdKmludCB2ZTskbmxcWyBcXSppbnQgdng7JG5sLipcfSIgInB0eXBlIHZFIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwdHlwZSBjbGFzcyB2RSIgInR5cGUgPSBjbGFzcyB2RSA6IHB1YmxpYyB2aXJ0dWFsIHZEIFx7JG5sXFsgXF0qcHJpdmF0ZTokbmxcWyBcXSp2RCBcWypcXStfdmJcW1xcXCRcLlxddkQ7JG5sXFsgXF0qcHVibGljOiRubFxbIFxdKmludCB2ZTskbmxcWyBcXSppbnQgdng7JG5sLipcfSIgInB0eXBlIGNsYXNzIHZFIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwdHlwZSBnX3ZFIiAidHlwZSA9IGNsYXNzIHZFIDogcHVibGljIHZpcnR1YWwgdkQgXHskbmxcWyBcXSpwcml2YXRlOiRubFxbIFxdKnZEIFxbKlxdK192YlxbXFxcJFwuXF12RDskbmxcWyBcXSpwdWJsaWM6JG5sXFsgXF0qaW50IHZlOyRubFxbIFxdKmludCB2eDskbmwuKlx9IiAicHR5cGUgZ192RSIKK30KKworIworIyBNdWx0aXBsZSB2aXJ0dWFsIGluaGVyaXRhbmNlLCBwcmludCBjb21wbGV0ZSBjbGFzc2VzLgorIworCitwcm9jIHRlc3RfcHJpbnRfbXZpX2NsYXNzZXMge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisgICAgZ2xvYmFsIG5sCisKKyAgICAjIFByaW50IGFsbCBtZW1iZXJzIG9mIGdfdkQuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgc2VuZF9nZGIgInByaW50IGdfdkRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qID0gXHtcPHZCXD4gPSBce1w8dkFcPiA9IFx7dmEgPSAxOSwgdnggPSAyMFx9LCBfdmJcW1xcXCRcLlxddkEgPSAkaGV4LCB2YiA9IDIxLCB2eCA9IDIyXH0sIFw8dkNcPiA9IFx7X3ZiXFtcXFwkXC5cXXZBID0gJGhleCwgdmMgPSAyMywgdnggPSAyNFx9LCBfdmJcW1xcXCRcLlxddkMgPSAkaGV4LCBfdmJcW1xcXCRcLlxddkIgPSAkaGV4LCB2ZCA9IDI1LCB2eCA9IDI2XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInByaW50IGdfdkQiCisJfQorCS1yZSAiLippbnZhbGlkIGFkZHJlc3MgMHgwLiokZ2RiX3Byb21wdCAkIiB7CisJICAgICMgRG9lcyBub3QgaGFwcGVuIHdpdGggZ2NjIGN5Z251cy0yLjQuNS05MzA4MjgKKwkgICAgZmFpbCAicHJpbnQgZ192RCAoa25vd24gYnVnIHdpdGggZ2NjIGN5Z251cy0yLjQuNS05MzA0MTcpIgorCSAgICAjIE1hbnkgb2YgdGhlIHJlc3Qgb2YgdGhlc2UgdGVzdHMgaGF2ZSB0aGUgc2FtZSBwcm9ibGVtLgorCSAgICByZXR1cm4gMAorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBnX3ZEIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IGdfdkQgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX3ZFLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX3ZFIiAiLiogPSBce1w8dkRcPiA9IFx7XDx2Qlw+ID0gXHtcPHZBXD4gPSBce3ZhID0gMCwgdnggPSAwXH0sIF92YlxbXFxcJFwuXF12QSA9ICRoZXgsIHZiID0gMCwgdnggPSAwXH0sIFw8dkNcPiA9IFx7X3ZiXFtcXFwkXC5cXXZBID0gJGhleCwgdmMgPSAwLCB2eCA9IDBcfSwgX3ZiXFtcXFwkXC5cXXZDID0gJGhleCwgX3ZiXFtcXFwkXC5cXXZCID0gJGhleCwgdmQgPSAwLCB2eCA9IDBcfSwgX3ZiXFtcXFwkXC5cXXZEID0gJGhleCwgdmUgPSAyNywgdnggPSAyOFx9IiAicHJpbnQgZ192RSIKK30KKworcHJvYyBkb190ZXN0cyB7fSB7CisgICAgZ2xvYmFsIHBybXNfaWQKKyAgICBnbG9iYWwgYnVnX2lkCisgICAgZ2xvYmFsIHN1YmRpcgorICAgIGdsb2JhbCBvYmpkaXIKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgZ2xvYmFsIGJpbmZpbGUKKworICAgIHNldCBwcm1zX2lkIDAKKyAgICBzZXQgYnVnX2lkIDAKKworICAgICMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworICAgIGdkYl9leGl0CisgICAgZ2RiX3N0YXJ0CisgICAgZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisgICAgZ2RiX2xvYWQgJGJpbmZpbGUKKworICAgIGdkYl90ZXN0ICJzZXQgbGFuZ3VhZ2UgYysrIiAiIgorICAgIGdkYl90ZXN0ICJzZXQgd2lkdGggMCIgIiIKKworICAgICMgR2V0IHRoZSBkZWJ1ZyBmb3JtYXQgZm9yIHRoZSBjb21waWxlZCB0ZXN0IGNhc2UuCisKKyAgICBpZiB7ICFbIHJ1bnRvX21haW5dIH0geworCWdkYl9zdXBwcmVzc190ZXN0czsKKyAgICB9IGVsc2UgeworCWdldF9kZWJ1Z19mb3JtYXQKKyAgICB9CisKKyAgICB0ZXN0X3B0eXBlX3NpCisgICAgdGVzdF9wdHlwZV9taQorICAgIHRlc3RfcHR5cGVfdmkKKyAgICB0ZXN0X3B0eXBlX212aQorCisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7CisgICAgCisgICAgaWYgeyAhWyBydW50byAnaW5oZXJpdGFuY2UyKHZvaWQpJyBdIH0geworCWdkYl9zdXBwcmVzc190ZXN0czsKKyAgICB9CisKKyAgICB0ZXN0X3ByaW50X3NpX21lbWJlcnMKKyAgICB0ZXN0X3ByaW50X3NpX2NsYXNzZXMKKyAgICB0ZXN0X3ByaW50X21pX21lbWJlcnMKKyAgICB0ZXN0X3ByaW50X21pX2NsYXNzZXMKKyAgICB0ZXN0X3ByaW50X2Fub25fdW5pb24KKworICAgIGdkYl9zdG9wX3N1cHByZXNzaW5nX3Rlc3RzOworCisgICAgaWYgeyAhWyBydW50byAnaW5oZXJpdGFuY2U0KHZvaWQpJyBdIH0geworCWdkYl9zdXBwcmVzc190ZXN0czsKKyAgICB9CisKKyAgICB0ZXN0X3ByaW50X3N2aV9tZW1iZXJzCisgICAgdGVzdF9wcmludF9zdmlfY2xhc3NlcworICAgIHRlc3RfcHJpbnRfbXZpX21lbWJlcnMKKyAgICB0ZXN0X3ByaW50X212aV9jbGFzc2VzCit9CisKK2RvX3Rlc3RzCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jKysvbG9jYWwuY2MgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvbG9jYWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgxMWRlYgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9sb2NhbC5jYwpAQCAtMCwwICsxLDY3IEBACisvLyBUZXN0cyBmb3IgbG9jYWwgdHlwZXMKKwordm9pZCBtYXJrZXIxICh2b2lkKQoreyAKK30KKworICAKK2ludCBmb29iYXIgKGludCB4KQoreworICBjbGFzcyBMb2NhbCB7CisgIHB1YmxpYzoKKyAgICBpbnQgbG9jMTsKKyAgICBjaGFyIGxvY19mb28gKGNoYXIgYykKKyAgICB7CisgICAgICByZXR1cm4gYyArIDM7CisgICAgfQorICB9OworCisgIExvY2FsIGw7CisgIHN0YXRpYyBMb2NhbCBsMTsKKyAgY2hhciAgYzsKKworICBsLmxvYzEgPSAyMzsKKworICBjID0gbC5sb2NfZm9vKCd4Jyk7CisgIHJldHVybiBjICsgMjsKK30KKworaW50IG1haW4oKQoreworICBpbnQgYzsKKyAgCisgIGMgPSBmb29iYXIgKDMxKTsKKyAgCisgeyAvLyBpbm5lciBibG9jaworICAgY2xhc3MgSW5uZXJMb2NhbCB7CisgICBwdWJsaWM6CisgICAgIGNoYXIgaWxjOworICAgICBpbnQgKiBpcDsKKyAgICAgaW50IGlsX2ZvbyAodW5zaWduZWQgY29uc3QgY2hhciAmIHVjY3IpCisgICAgIHsKKyAgICAgICByZXR1cm4gdWNjciArIDMzMzsKKyAgICAgfQorICAgICBjbGFzcyBOZXN0ZWRJbm5lckxvY2FsIHsKKyAgICAgcHVibGljOgorICAgICAgIGludCBuaWw7CisgICAgICAgaW50IG5pbF9mb28gKGludCBpKQorICAgICAgIHsKKyAgICAgICAgIHJldHVybiBpICogMjc7CisgICAgICAgfQorICAgICB9OworICAgICBOZXN0ZWRJbm5lckxvY2FsIG5lc3QxOworICAgfTsKKworICAgSW5uZXJMb2NhbCBpbDsKKworICAgaWwuaWxjID0gJ2InOworICAgaWwuaXAgPSAmYzsKKyB9CisgbWFya2VyMSgpOworfQorCisgIAorCisgIAorICAKKyAgICAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9sb2NhbC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvbG9jYWwuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYTg0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvbG9jYWwuZXhwCkBAIC0wLDAgKzEsMTEwIEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyB0ZXN0cyBmb3IgbG9jYWwgdmFyaWFibGVzCisjIFdyaXR0ZW4gYnkgU2F0aXNoIFBhaSA8cGFpQGFwb2xsby5ocC5jb20+IDE5OTctMDctMDgKKworCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBnZGIgdGVzdHN1aXRlCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgICAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKKyAgICAgICAgfQorCisjCisjIHRlc3QgcnVubmluZyBwcm9ncmFtcworIworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAibG9jYWwiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIGMrK31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworCisjCisjIHNldCBpdCB1cCBhdCBhIGJyZWFrcG9pbnQgc28gd2UgY2FuIHBsYXkgd2l0aCB0aGUgdmFyaWFibGUgdmFsdWVzCisjCitpZiAhW3J1bnRvX21haW5dIHRoZW4geworICAgIHBlcnJvciAiY291bGRuJ3QgcnVuIHRvIGJyZWFrcG9pbnQiCisgICAgY29udGludWUKK30KKworc2VuZF9nZGIgImJyZWFrIG1hcmtlcjFcbiIgOyBnZGJfZXhwZWN0IC1yZSAiLiokZ2RiX3Byb21wdCAkIgorCisgICAgc2VuZF9nZGIgImNvbnRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJCcmVhay4qIG1hcmtlcjEgXFwoXFwpIGF0IC4qOiRkZWNpbWFsLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBzZW5kX2dkYiAidXBcbiIKKyAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorICAgICAgICAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJ1cCBmcm9tIG1hcmtlcjEiIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29udGludWUgdG8gbWFya2VyMSIgIH0KKyAgICAgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb250aW51ZSB0byBtYXJrZXIxIiAgfQorICAgIH0KKworc2VuZF9nZGIgInB0eXBlIExvY2FsXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSBjbGFzcyBMb2NhbCBce1xyXG5cW1x0IFxdKnB1YmxpYzpcclxuXFtcdCBcXSppbnQgbG9jMTtcclxuXHJcblxbXHQgXF0qLmNoYXIgbG9jX2Zvb1xcKGNoYXJcXCk7XHJcblxbXHQgXF0qXH1cW1x0IFxdKlxcKExvY2FsIGF0Lipsb2NhbFxcLkM6MTBcXCkuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgTG9jYWwiIH0KKyAgICAtcmUgInR5cGUgPSBjbGFzcyBMb2NhbCBce1xyXG5cW1x0IFxdKnB1YmxpYzpcclxuXFtcdCBcXSppbnQgbG9jMTtcclxuXHJcblxbXHQgXF0qLmNoYXIgbG9jX2Zvb1xcKGNoYXJcXCk7XHJcblxbXHQgXF0qXH1cW1x0IFxdKlxcKExvY2FsIGF0Lipsb2NhbFxcLkM6XFswLTlcXSpcXCkuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgTG9jYWwgKGluY29ycmVjdCBsaW5lIG51bWJlcj8pIiB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgeyAgZmFpbCAicHR5cGUgTG9jYWwiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIExvY2FsIiB9Cit9CisKK3NlbmRfZ2RiICJwdHlwZSBJbm5lckxvY2FsXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSBjbGFzcyBJbm5lckxvY2FsIFx7XHJcblxbXHQgXF0qcHVibGljOlxyXG5cW1x0IFxdKmNoYXIgaWxjO1xyXG5cW1x0IFxdKmludCBcXCppcDtcclxuXFtcdCBcXSpJbm5lckxvY2FsOjpOZXN0ZWRJbm5lckxvY2FsIG5lc3QxO1xyXG5cclxuXFtcdCBcXSouaW50IGlsX2Zvb1xcKGNvbnN0IHVuc2lnbmVkIGNoYXIgJlxcKTtcclxuXFtcdCBcXSpcfVxbXHQgXF0qXFwoTG9jYWwgYXQuKmxvY2FsXFwuQzozNlxcKS4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwdHlwZSBJbm5lckxvY2FsIiB9CisgICAgLXJlICJ0eXBlID0gY2xhc3MgSW5uZXJMb2NhbCBce1xyXG5cW1x0IFxdKnB1YmxpYzpcclxuXFtcdCBcXSpjaGFyIGlsYztcclxuXFtcdCBcXSppbnQgXFwqaXA7XHJcblxbXHQgXF0qY2xhc3MgSW5uZXJMb2NhbDo6TmVzdGVkSW5uZXJMb2NhbCBuZXN0MTtcclxuXHJcblxbXHQgXF0qLmludCBpbF9mb29cXChjb25zdCB1bnNpZ25lZCBjaGFyICZcXCk7XHJcblxbXHQgXF0qXH1cW1x0IFxdKlxcKExvY2FsIGF0Lipsb2NhbFxcLkM6MzZcXCkuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgSW5uZXJMb2NhbCIgfQorICAgIC1yZSAidHlwZSA9IGNsYXNzIElubmVyTG9jYWwgXHtcclxuXFtcdCBcXSpwdWJsaWM6XHJcblxbXHQgXF0qY2hhciBpbGM7XHJcblxbXHQgXF0qaW50IFxcKmlwO1xyXG5cW1x0IFxdKklubmVyTG9jYWw6Ok5lc3RlZElubmVyTG9jYWwgbmVzdDE7XHJcblxyXG5cW1x0IFxdKi5pbnQgaWxfZm9vXFwoY29uc3QgdW5zaWduZWQgY2hhciAmXFwpO1xyXG5cW1x0IFxdKlx9XFtcdCBcXSpcXChMb2NhbCBhdC4qbG9jYWxcXC5DOlxbMC05XF0qXFwpLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIElubmVyTG9jYWwgKGluY29ycmVjdCBsaW5lIG51bWJlcj8iIH0KKyAgICAtcmUgInR5cGUgPSBjbGFzcyBJbm5lckxvY2FsIFx7XHJcblxbXHQgXF0qcHVibGljOlxyXG5cW1x0IFxdKmNoYXIgaWxjO1xyXG5cW1x0IFxdKmludCBcXCppcDtcclxuXFtcdCBcXSpjbGFzcyBJbm5lckxvY2FsOjpOZXN0ZWRJbm5lckxvY2FsIG5lc3QxO1xyXG5cclxuXFtcdCBcXSouaW50IGlsX2Zvb1xcKGNvbnN0IHVuc2lnbmVkIGNoYXIgJlxcKTtcclxuXFtcdCBcXSpcfVxbXHQgXF0qXFwoTG9jYWwgYXQuKmxvY2FsXFwuQzpcWzAtOVxdKlxcKS4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwdHlwZSBJbm5lckxvY2FsIChpbmNvcnJlY3QgbGluZSBudW1iZXI/IiB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgeyAgZmFpbCAicHR5cGUgSW5uZXJMb2NhbCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgSW5uZXJMb2NhbCIgfQorfQorCisKK3NlbmRfZ2RiICJwdHlwZSBOZXN0ZWRJbm5lckxvY2FsXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSBjbGFzcyBJbm5lckxvY2FsOjpOZXN0ZWRJbm5lckxvY2FsIFx7XHJcblxbXHQgXF0qcHVibGljOlxyXG5cW1x0IFxdKmludCBuaWw7XHJcblxyXG5cW1x0IFxdKi5pbnQgbmlsX2Zvb1xcKGludFxcKTtcclxuXFtcdCBcXSpcfVxbXHQgXF0qXFwoTG9jYWwgYXQuKmxvY2FsXFwuQzo0NFxcKS4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwdHlwZSBOZXN0ZWRJbm5lckxvY2FsIiB9CisgICAgLXJlICJ0eXBlID0gY2xhc3MgSW5uZXJMb2NhbDo6TmVzdGVkSW5uZXJMb2NhbCBce1xyXG5cW1x0IFxdKnB1YmxpYzpcclxuXFtcdCBcXSppbnQgbmlsO1xyXG5cclxuXFtcdCBcXSouaW50IG5pbF9mb29cXChpbnRcXCk7XHJcblxbXHQgXF0qXH1cW1x0IFxdKlxcKExvY2FsIGF0Lipsb2NhbFxcLkM6XFswLTlcXSpcXCkuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgTmVzdGVkSW5uZXJMb2NhbCAoaW5jb3JyZWN0IGxpbmUgbnVtYmVyPykiIH0KKyAgICAtcmUgIk5vIHN5bWJvbC4qaW4gY3VycmVudCBjb250ZXh0LiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIE5lc3RlZElubmVyTG9jYWwgKGtub3duIGFDQyBsaW1pdGF0aW9uKSIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgIGZhaWwgInB0eXBlIE5lc3RlZElubmVyTG9jYWwiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIE5lc3RlZElubmVyTG9jYWwiIH0KK30gICAgIAorCitzZW5kX2dkYiAicHR5cGUgSW5uZXJMb2NhbDo6TmVzdGVkSW5uZXJMb2NhbFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gY2xhc3MgSW5uZXJMb2NhbDo6TmVzdGVkSW5uZXJMb2NhbCBce1xyXG5cW1x0IFxdKnB1YmxpYzpcclxuXFtcdCBcXSppbnQgbmlsO1xyXG5cclxuXFtcdCBcXSouaW50IG5pbF9mb29cXChpbnRcXCk7XHJcblxbXHQgXF0qXH1cW1x0IFxdKlxcKExvY2FsIGF0Lipsb2NhbFxcLkM6NDRcXCkuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgSW5uZXJMb2NhbDo6TmVzdGVkSW5uZXJMb2NhbCIgfQorICAgIC1yZSAidHlwZSA9IGNsYXNzIElubmVyTG9jYWw6Ok5lc3RlZElubmVyTG9jYWwgXHtcclxuXFtcdCBcXSpwdWJsaWM6XHJcblxbXHQgXF0qaW50IG5pbDtcclxuXHJcblxbXHQgXF0qLmludCBuaWxfZm9vXFwoaW50XFwpO1xyXG5cW1x0IFxdKlx9XFtcdCBcXSpcXChMb2NhbCBhdC4qbG9jYWxcXC5DOlxbMC05XF0qXFwpLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIElubmVyTG9jYWw6Ok5lc3RlZElubmVyTG9jYWwgKGluY29ycmVjdCBsaW5lIG51bWJlcj8pIiB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgeyAgZmFpbCAicHR5cGUgSW5uZXJMb2NhbDo6TmVzdGVkSW5uZXJMb2NhbCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgSW5uZXJMb2NhbDo6TmVzdGVkSW5uZXJMb2NhbCIgfQorfQorCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9tZW1iZXItcHRyLmNjIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL21lbWJlci1wdHIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlYjkyNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9tZW1iZXItcHRyLmNjCkBAIC0wLDAgKzEsMTA2IEBACitleHRlcm4gIkMiIHsKKyNpbmNsdWRlIDxzdGRpby5oPgorfQorCisKK2NsYXNzIEEgeworcHVibGljOgorICBBKCk7CisgIGludCBmb28gKGludCB4KTsKKyAgaW50IGJhciAoaW50IHkpOworICB2aXJ0dWFsIGludCBiYXogKGludCB6KTsKKyAgY2hhciBjOworICBpbnQgIGo7CisgIGludCAgamo7CisgIHN0YXRpYyBpbnQgczsKK307CisKK2NsYXNzIEIgeworcHVibGljOgorICBzdGF0aWMgaW50IHM7Cit9OworCitpbnQgQTo6cyA9IDEwOworaW50IEI6OnMgPSAyMDsKKworQTo6QSgpCit7CisgIGMgPSAneCc7CisgIGogPSA1OworfQorCitpbnQgQTo6Zm9vIChpbnQgZHVtbXkpCit7CisgIGogKz0gMzsKKyAgcmV0dXJuIGogKyBkdW1teTsKK30KKworaW50IEE6OmJhciAoaW50IGR1bW15KQoreworICBpbnQgcjsKKyAgaiArPSAxMzsKKyAgciA9IHRoaXMtPmZvbygxNSk7CisgIHJldHVybiByICsgaiArIDIgKiBkdW1teTsKK30KKworaW50IEE6OmJheiAoaW50IGR1bW15KQoreworICBpbnQgcjsKKyAgaiArPSAxNTsKKyAgciA9IHRoaXMtPmZvbygxNSk7CisgIHJldHVybiByICsgaiArIDEyICogZHVtbXk7Cit9CisKK2ludCBmdW0gKGludCBkdW1teSkKK3sKKyAgcmV0dXJuIDIgKyAxMyAqIGR1bW15OworfQorCit0eXBlZGVmIGludCAoQTo6KlBNRikoaW50KTsKKwordHlwZWRlZiBpbnQgQTo6KlBNSTsKKworaW50IG1haW4gKCkKK3sKKyAgQSBhOworICBBICogYV9wOworICBQTUYgcG1mOworCisgIFBNRiAqIHBtZl9wOworICBQTUkgcG1pOworCisgIGEuaiA9IDEyMTsKKyAgYS5qaiA9IDEzMzE7CisgIAorICBpbnQgazsKKworICBhX3AgPSAmYTsKKworICBwbWkgPSAmQTo6ajsKKyAgcG1mID0gJkE6OmJhcjsKKyAgcG1mX3AgPSAmcG1mOworCisgIHBtaSA9IE5VTEw7CisgIAorICBrID0gKGEuKnBtZikoMyk7CisKKyAgcG1pID0gJkE6OmpqOworICBwbWYgPSAmQTo6Zm9vOworICBwbWZfcCA9ICZwbWY7CisKKyAgayA9IChhLipwbWYpKDQpOworCisgIGsgPSAoYS4qKnBtZl9wKSg1KTsKKworICBrID0gYS4qcG1pOworICAKKworICBrID0gYS5iYXIoMik7CisKKyAgayArPSBmdW0gKDQpOworCisgIEIgYjsKKworICBrICs9IGIuczsKKyAgCit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jKysvbWVtYmVyLXB0ci5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvbWVtYmVyLXB0ci5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0ZGQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9tZW1iZXItcHRyLmV4cApAQCAtMCwwICsxLDUxMCBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisjIFRlc3RzIGZvciBwb2ludGVyLXRvLW1lbWJlciBzdXBwb3J0CisjIFdyaXR0ZW4gYnkgU2F0aXNoIFBhaSA8cGFpQGFwb2xsby5ocC5jb20+IDE5OTctMDgtMTkKKworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZ2RiIHRlc3RzdWl0ZQorCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgICAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKKyAgICAgICAgfQorCisjCisjIHRlc3QgcnVubmluZyBwcm9ncmFtcworIworCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJtZW1iZXItcHRyIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uY2MKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1ZyBjKyt9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKKworaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgICBwZXJyb3IgImNvdWxkbid0IHJ1biB0byBicmVha3BvaW50IgorICAgIGNvbnRpbnVlCit9CisKK3NlbmRfZ2RiICJicmVhayA4M1xuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIkJyZWFrcG9pbnQgXFswLTlcXSouKmxpbmUgODNcXC5cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAic2V0IGJyZWFrIGF0IDgzIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJzZXQgYnJlYWsgYXQgODMiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHNldCBicmVhayBhdCA4MyIgfQorfQorCitzZW5kX2dkYiAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJDb250aW51aW5nXFwuXHJcblxyXG5CcmVha3BvaW50LiphdC4qbWVtYmVyLXB0clxcLmNjOjgzXHJcbjgzXFsgXHRdKnBtaSA9IE5VTEw7XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgImNvbnRpbnVlIHRvIDgzIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb250aW51ZSB0byA4MyIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgY29udGludWUgdG8gODMiIH0KK30KKworIyBwdHlwZSBvbiBwb2ludGVyIHRvIGRhdGEgbWVtYmVyCisKK3NlbmRfZ2RiICJwdHlwZSBwbWlcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJ0eXBlID0gaW50IFxcKCBBOjpcXCpcXClcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAicHR5cGUgcG1pIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBwbWkiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHBtaSIgfQorfQorCisjIHByaW50IHBvaW50ZXIgdG8gZGF0YSBtZW1iZXIKKworc2VuZF9nZGIgInByaW50IHBtaVxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxcJFxbMC05XF0qID0gXFwoaW50IFxcKCBBOjpcXCpcXClcXCkgJkE6OmpcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAicHJpbnQgcG1pIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwbWkiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHBtaSIgfQorfQorCisKKyMgcHJpbnQgZGVyZWZlcmVuY2VkIHBvaW50ZXIgdG8gZGF0YSBtZW1iZXIKKworc2VuZF9nZGIgInByaW50IGEuKnBtaVxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxcJFxbMC05XF0qID0gMTIxXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInByaW50IGEuKnBtaSIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgYS4qcG1pIiB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBhLipwbWkiIH0KK30KKworIyBwcmludCBkZXJlZmVyZW5jZWQgcG9pbnRlciB0byBkYXRhIG1lbWJlcgorIyB0aGlzIHRpbWUsIGRlcmVmZXJlbmNlZCB0aHJvdWdoIGEgcG9pbnRlcgorCitzZW5kX2dkYiAicHJpbnQgYV9wLT4qcG1pXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiXFwkXFswLTlcXSogPSAxMjFcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAicHJpbnQgYS0+KnBtaSIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgYS0+KnBtaSIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgYS0+KnBtaSIgfQorfQorCisKKyMgc2V0IHRoZSBwb2ludGVyIHRvIGRhdGEgbWVtYmVyCisKK3NlbmRfZ2RiICJzZXQgdmFyIHBtaSA9ICZBOjpqalxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInNldCB2YXIgKG5vdCByZWFsbHkgYSBwYXNzKSIKKyAgICB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSAiIH0KK30KKworIyBOb3cgcHJpbnQgdGhlIHBvaW50ZXIgYWdhaW4KKworc2VuZF9nZGIgInByaW50IHBtaVxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxcJFxbMC05XF0qID0gXFwoaW50IFxcKCBBOjpcXCpcXClcXCkgJkE6OmpqXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInByaW50IHBtaSBhZnRlciBzZXR0aW5nIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwbWkgYWZ0ZXIgc2V0dGluZyIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgcG1pIGFmdGVyIHNldHRpbmciIH0KK30KKworIyBwcmludCBkZXJlZmVyZW5jZWQgcG9pbnRlciB0byBkYXRhIG1lbWJlciBhZ2FpbgorCitzZW5kX2dkYiAicHJpbnQgYS4qcG1pXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiXFwkXFswLTlcXSogPSAxMzMxXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInByaW50IGEuKnBtaSBhZnRlciBzZXR0aW5nIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBhLipwbWkgYWZ0ZXIgc2V0dGluZyIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgYS4qcG1pIGFmdGVyIHNldHRpbmciIH0KK30KKworIyBzZXQgdGhlIHBvaW50ZXIgdG8gZGF0YSBtZW1iZXIgYmFjayB0byBBOjpqCisKK3NlbmRfZ2RiICJzZXQgdmFyIHBtaSA9ICZBOjpqXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAic2V0IHZhciBiYWNrIHRvIEE6OmogKG5vdCByZWFsbHkgYSBwYXNzKSIKKyAgICB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBzZXQgdmFyIHBtaSIgfQorfQorCisjIHByaW50IGRlcmVmZXJlbmNlZCBwb2ludGVyIHRvIGRhdGEgbWVtYmVyIHlldCBhZ2FpbiAoZXh0cmEgY2hlY2ssIHdoeSBub3QpCisKK3NlbmRfZ2RiICJwcmludCBhLipwbWlcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcXCRcWzAtOVxdKiA9IDEyMVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJwcmludCBhLipwbWkgYWZ0ZXIgcmVzZXR0aW5nIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBhLipwbWkgYWZ0ZXIgcmVzZXR0aW5nIiB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBhLipwbWkgYWZ0ZXIgcmVzZXR0aW5nIiB9Cit9CisKKyMgU2V0IHRoZSBkYXRhIG1lbWJlciBwb2ludGVkIHRvLgorCitzZW5kX2dkYiAicHJpbnQgYS4qcG1pID0gMzNcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcXCRcWzAtOVxdKiA9IDMzXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInByaW50IGNvbW1hbmQgdG8gc2V0IgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBjb21tYW5kIHRvIHNldCIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgY29tbWFuZCB0byBzZXQiIH0KK30KKworIyBOb3cgY2hlY2sgdGhhdCB0aGUgZGF0YSByZWFsbHkgd2FzIGNoYW5nZWQKK3NlbmRfZ2RiICJwcmludCBhLipwbWlcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcXCRcWzAtOVxdKiA9IDMzXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInByaW50IGEuKnBtaSBhZnRlciBzZXR0aW5nIG1lbWJlciBwb2ludGVkIHRvIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBhLipwbWkgYWZ0ZXIgc2V0dGluZyBtZW1iZXIgcG9pbnRlZCB0byIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgYS4qcG1pIGFmdGVyIHNldHRpbmcgbWVtYmVyIHBvaW50ZWQgdG8iIH0KK30KKworIyBEb3VibGUtY2hlY2sgYnkgcHJpbnRpbmcgYS4KK3NlbmRfZ2RiICJwcmludCBhXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiXFwkXFswLTlcXSogPSBce2MgPSAxMjAgJ3gnLCBqID0gMzMsIGpqID0gMTMzMSwgc3RhdGljIHMgPSAxMCwgVmlydHVhbCB0YWJsZSBhdCAkaGV4XH1cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAicHJpbnQgYSBhZnRlciBzZXR0aW5nIG1lbWJlciBwb2ludGVkIHRvIGJ5IHBtaSIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgYSBhZnRlciBzZXR0aW5nIG1lbWJlciBwb2ludGVkIHRvIGJ5IHBtaSIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgYSBhZnRlciBzZXR0aW5nIG1lbWJlciBwb2ludGVkIHRvIGJ5IHBtaSIgfQorfQorCisKKyMgU2V0IHRoZSBkYXRhIG1lbWJlciBwb2ludGVkIHRvLCB1c2luZyAtPioKKworc2VuZF9nZGIgInByaW50IGFfcC0+KnBtaSA9IDQ0XG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiXFwkXFswLTlcXSogPSA0NFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJwcmludCBjb21tYW5kIHRvIHNldCAoLT4pIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBjb21tYW5kIHRvIHNldCAoLT4pIiB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBjb21tYW5kIHRvIHNldCAoLT4pIiB9Cit9CisKKyMgTm93IGNoZWNrIHRoYXQgdGhlIGRhdGEgcmVhbGx5IHdhcyBjaGFuZ2VkCitzZW5kX2dkYiAicHJpbnQgYV9wLT4qcG1pXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiXFwkXFswLTlcXSogPSA0NFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJwcmludCBhX3AtPipwbWkgYWZ0ZXIgc2V0dGluZyBtZW1iZXIgcG9pbnRlZCB0byIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgYV9wLT4qcG1pIGFmdGVyIHNldHRpbmcgbWVtYmVyIHBvaW50ZWQgdG8iIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGFfcC0+KnBtaSBhZnRlciBzZXR0aW5nIG1lbWJlciBwb2ludGVkIHRvIiB9Cit9CisKKyMgRG91YmxlLWNoZWNrIGJ5IHByaW50aW5nIGEuCitzZW5kX2dkYiAicHJpbnQgYVxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxcJFxbMC05XF0qID0gXHtjID0gMTIwICd4JywgaiA9IDQ0LCBqaiA9IDEzMzEsIHN0YXRpYyBzID0gMTAsIFZpcnR1YWwgdGFibGUgYXQgJGhleFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInByaW50IGEgYWZ0ZXIgc2V0dGluZyBtZW1iZXIgcG9pbnRlZCB0byBieSBwbWkgKC0+KSAiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGEgYWZ0ZXIgc2V0dGluZyBtZW1iZXIgcG9pbnRlZCB0byBieSBwbWkgKC0+KSAiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGEgYWZ0ZXIgc2V0dGluZyBtZW1iZXIgcG9pbnRlZCB0byBieSBwbWkgKC0+KSAiIH0KK30KKworCisjIERvIGEgcHR5cGUgb24gdGhlIGRlcmVmZXJlbmNlZCBwb2ludGVyIHRvIG1lbWJlcgorIyBwYWkvMTk5Ny0wOC0yMCBEb2Vzbid0IHdvcmsKKworIyBzZW5kX2dkYiAicHR5cGUgYS4qcG1pXG4iCisjIGdkYl9leHBlY3QgeworIyAgIC1yZSAidHlwZSA9IGludFxyXG4kZ2RiX3Byb21wdCAkIiB7CisjICAgICAgcGFzcyAicHR5cGUgYS4qcG1pIgorIyAgICB9CisjICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInB0eXBlIGEuKnBtaSIgfQorIyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIGEuKnBtaSIgfQorI30KKworIyBUcnkgdG8gZGVyZWZlcmVuY2UgdGhlIHBvaW50ZXIgdG8gZGF0YSBtZW1iZXIgd2l0aG91dCBhbnkgb2JqZWN0CisKK3NlbmRfZ2RiICJwcmludCAqcG1pXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiQXR0ZW1wdCB0byBkZXJlZmVyZW5jZSBwb2ludGVyIHRvIG1lbWJlciB3aXRob3V0IGFuIG9iamVjdFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJhdHRlbXB0IHRvIHByaW50IHB0ciB0byBtZW1iZXIgd2l0aG91dCBvYmplY3QiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImF0dGVtcHQgdG8gcHJpbnQgcHRyIHRvIG1lbWJlciB3aXRob3V0IG9iamVjdCIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgYXR0ZW1wdCB0byBwcmludCBwdHIgdG8gbWVtYmVyIHdpdGhvdXQgb2JqZWN0IiB9Cit9CisKKyMgVHJ5IHRvIHB0eXBlIGEgZGVyZWZlcmVuY2Ugb2YgdGhlIHBvaW50ZXIgdG8gZGF0YSBtZW1iZXIgd2l0aG91dCBhbnkgb2JqZWN0CisKK3NlbmRfZ2RiICJwdHlwZSAqcG1pXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiQXR0ZW1wdCB0byBkZXJlZmVyZW5jZSBwb2ludGVyIHRvIG1lbWJlciB3aXRob3V0IGFuIG9iamVjdFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJhdHRlbXB0IHRvIHB0eXBlIHB0ciB0byBtZW1iZXIgd2l0aG91dCBvYmplY3QiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImF0dGVtcHQgdG8gcHR5cGUgcHRyIHRvIG1lbWJlciB3aXRob3V0IG9iamVjdCIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgYXR0ZW1wdCB0byBwdHlwZSBwdHIgdG8gbWVtYmVyIHdpdGhvdXQgb2JqZWN0IiB9Cit9CisKKyMgUHR5cGUgYSBwb2ludGVyIHRvIGEgbWV0aG9kLgorCitzZW5kX2dkYiAicHR5cGUgcG1mXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAidHlwZSA9IGludCBcXCggQTo6XFwqXFwpXFwoXFwuXFwuXFwuXFwpXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInB0eXBlIHBtZiIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHR5cGUgcG1mIiB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBwbWYiIH0KK30KKworIyBwcmludCBhIHBvaW50ZXIgdG8gYSBtZXRob2QKKworc2VuZF9nZGIgInByaW50IHBtZlxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxcJFxbMC05XF0qID0gXFwoaW50IFxcKCBBOjpcXCpcXClcXChcXC5cXC5cXC5cXClcXCkgXFw/XFw/IDxub3Qgc3VwcG9ydGVkIHdpdGggSFAgYUNDPlxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJwcmludCBwbWYiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHBtZiIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgcG1mIiB9Cit9CisKKworIyBQdHlwZSBhIHBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIGEgbWV0aG9kCisKK3NlbmRfZ2RiICJwdHlwZSBwbWZfcFxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgInR5cGUgPSBpbnQgXFwoIEE6OlxcKlxcKlxcKVxcKFxcLlxcLlxcLlxcKVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJwdHlwZSBwbWZfcCIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHR5cGUgcG1mX3AiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHBtZl9wIiB9Cit9CisKKyMgcHJpbnQgYSBwb2ludGVyIHRvIGEgcG9pbnRlciB0byBhIG1ldGhvZAorCitzZW5kX2dkYiAicHJpbnQgcG1mX3BcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcXCRcWzAtOVxdKiA9IFxcKGludCBcXCggQTo6XFwqXFwqXFwpXFwoXFwuXFwuXFwuXFwpXFwpICRoZXhcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAicHJpbnQgcG1mX3AiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHBtZl9wIiB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBwbWZfcCIgfQorfQorCisjIHByaW50IGRlcmVmZXJlbmNlZCBwb2ludGVyIHRvIG1ldGhvZAorCitzZW5kX2dkYiAicHJpbnQgYS4qcG1mXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiUG9pbnRlcnMgdG8gbWV0aG9kcyBub3Qgc3VwcG9ydGVkIHdpdGggSFAgYUNDXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInByaW50IGEuKnBtZiAoa25vd24gYUNDIGxpbWl0YXRpb24pIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBhLipwbWYgLS0gPz8iIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGEuKnBtZiIgfQorfQorCisjIHByaW50IGRlcmVmZXJlbmNlZCBwb2ludGVyIHRvIG1ldGhvZCwgdXNpbmcgLT4qCisKK3NlbmRfZ2RiICJwcmludCBhX3AtPipwbWZcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJQb2ludGVycyB0byBtZXRob2RzIG5vdCBzdXBwb3J0ZWQgd2l0aCBIUCBhQ0NcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAicHJpbnQgYV9wLT4qcG1mIChrbm93biBhQ0MgbGltaXRhdGlvbikiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGFfcC0+KnBtZiAtLSA/PyIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgYV9wLT4qcG1mIiB9Cit9CisKKyMgc2V0IHRoZSBwb2ludGVyIHRvIGRhdGEgbWVtYmVyCisKK3NlbmRfZ2RiICJzZXQgdmFyIHBtZiA9ICZBOjpmb29cbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJBc3NpZ25tZW50IHRvIHBvaW50ZXJzIHRvIG1ldGhvZHMgbm90IGltcGxlbWVudGVkIHdpdGggSFAgYUNDXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInNldCB2YXIgcG1mIChrbm93biBhQ0MgbGltaXRhdGlvbikiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInNldCB2YXIgcG1mIC0tID8/IiB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBzZXQgdmFyIHBtZiIgfQorfQorCisjIFRyeSB0byBkZXJlZmVyZW5jZSB0aGUgcG9pbnRlciB0byBtZXRob2Qgd2l0aG91dCBhbnkgb2JqZWN0CisKK3NlbmRfZ2RiICJwcmludCAqcG1mXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiQXR0ZW1wdCB0byBkZXJlZmVyZW5jZSBwb2ludGVyIHRvIG1lbWJlciB3aXRob3V0IGFuIG9iamVjdFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJhdHRlbXB0IHRvIHByaW50ICBwdHIgdG8gbWV0aG9kIHdpdGhvdXQgb2JqZWN0IgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJhdHRlbXB0IHRvIHByaW50IHB0ciB0byBtZXRob2Qgd2l0aG91dCBvYmplY3QiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGF0dGVtcHQgdG8gcHJpbnQgcHRyIHRvIG1ldGhvZCB3aXRob3V0IG9iamVjdCIgfQorfQorCisjIFRyeSB0byBwdHlwZSBhIGRlcmVmZXJlbmNlIG9mIHRoZSBwb2ludGVyIHRvIG1ldGhvZCB3aXRob3V0IGFueSBvYmplY3QKKworc2VuZF9nZGIgInB0eXBlICpwbWlcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJBdHRlbXB0IHRvIGRlcmVmZXJlbmNlIHBvaW50ZXIgdG8gbWVtYmVyIHdpdGhvdXQgYW4gb2JqZWN0XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgImF0dGVtcHQgdG8gcHR5cGUgcHRyIHRvIG1lbWJlciB3aXRob3V0IG9iamVjdCIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiYXR0ZW1wdCB0byBwdHlwZSBwdHIgdG8gbWVtYmVyIHdpdGhvdXQgb2JqZWN0IiB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBhdHRlbXB0IHRvIHB0eXBlIHB0ciB0byBtZW1iZXIgd2l0aG91dCBvYmplY3QiIH0KK30KKworIyBDaGVjayBjYXN0IG9mIHBvaW50ZXIgdG8gbWVtYmVyIHRvIGludGVnZXIKK3NlbmRfZ2RiICJwcmludCAoaW50KSBwbWlcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcXCRcWzAtOVxdKiA9IDhcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAiY2FzdGluZyBwbWkgdG8gaW50IgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjYXN0aW5nIHBtaSB0byBpbnQiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGNhc3RpbmcgcG1pIHRvIGludCIgfQorfQorCisjIENoZWNrIGNhc3Qgb2YgcG9pbnRlciB0byBtZXRob2QgdG8gaW50ZWdlcgorc2VuZF9nZGIgInByaW50IChpbnQpIHBtZlxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlBvaW50ZXJzIHRvIG1ldGhvZHMgbm90IHN1cHBvcnRlZCB3aXRoIEhQIGFDQ1xyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJjYXN0aW5nIHBtZiB0byBpbnQgKGtub3duIGFDQyBsaW1pdGF0aW9uKSIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY2FzdGluZyBwbWYgdG8gaW50IC0tID8/IiB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjYXN0aW5nIHBtZiB0byBpbnQiIH0KK30KKworIyBUcnkgdG8gaW52b2tlIGEgZnVuY3Rpb24gdGhyb3VnaCBhIHBvaW50ZXIgdG8gZGF0YSBtZW1iZXIKK3NlbmRfZ2RiICJwcmludCAoYS4qcG1pKSgzKVxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIk5vdCBpbXBsZW1lbnRlZDogZnVuY3Rpb24gaW52b2NhdGlvbiB0aHJvdWdoIHBvaW50ZXIgdG8gbWV0aG9kIHdpdGggSFAgYUNDXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInByaW50IChhLipwbWkpKDMpIC0tIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGJlIGRpZmZlcmVudCIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgKGEuKnBtaSkoMykgLS0gPz8/IiB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBwcmludCAoYS4qcG1pKSgzKSIgfQorfQorCisjIFRyeSB0byBpbnZva2UgYSBmdW5jdGlvbiB0aHJvdWdoIGEgcG9pbnRlciB0byBhIG1ldGhvZAorc2VuZF9nZGIgInByaW50IChhLipwbWYpKDMpXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiTm90IGltcGxlbWVudGVkOiBmdW5jdGlvbiBpbnZvY2F0aW9uIHRocm91Z2ggcG9pbnRlciB0byBtZXRob2Qgd2l0aCBIUCBhQ0NcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAicHJpbnQgKGEuKnBtaSkoMykgLS0ga25vd24gYUNDIGxpbWl0YXRpb24iCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IChhLipwbWYpKDMpIC0tID8/PyIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgKGEuKnBtZikoMykiIH0KK30KKworCisjIEdvIHBhc3QgYXNzaWdubWVudCBvZiBOVUxMIHRvIHBtaQorc2VuZF9nZGIgIm5leHRcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcclxuODVcWyBcdFxdKmsgPSBcXChhLlxcKnBtZlxcKVxcKDNcXCk7XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgIm5leHQgcGFzdCA4MyIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibmV4dCBwYXN0IDgzIiB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBuZXh0IHBhc3QgODMiIH0KK30KKworI3NlbmRfZ2RiICJwcmludCBwbWlcbiIKKyNnZGJfZXhwZWN0IHsKKyMgICAtcmUgIkF0dGVtcHRlZCBkZXJlZmVyZW5jZSBvZiBudWxsIHBvaW50ZXItdG8tbWVtYmVyXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyMgICAgICBwYXNzICIiCisjICAgIH0KKyMgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiIiB9CisjICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgIiB9CisjfQorCisjIERlcmVmZXJlbmNlIHRoZSBudWxsIHBvaW50ZXIgdG8gbWVtYmVyCitzZW5kX2dkYiAicHJpbnQgYS4qcG1pXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiQXR0ZW1wdGVkIGRlcmVmZXJlbmNlIG9mIG51bGwgcG9pbnRlci10by1tZW1iZXJcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAicHJpbnQgYS4qTlVMTCIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgYS4qTlVMTCIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgYS4qTlVMTCIgfQorfQorCisKKyMgR28gdG8gYW5vdGhlciBwYXJ0IG9mIHRoZSBwcm9ncmFtCitzZW5kX2dkYiAiYnJlYWsgOTFcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJCcmVha3BvaW50IFxbMC05XF0qLipsaW5lIDkxXFwuXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInNldCBicmVhayBhdCA5MSIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic2V0IGJyZWFrIGF0IDkxIiB9CisgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBzZXQgYnJlYWsgYXQgOTEiIH0KK30KKworc2VuZF9nZGIgImNvbnRpbnVlXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiQ29udGludWluZ1xcLlxyXG5cclxuQnJlYWtwb2ludC4qYXQuKm1lbWJlci1wdHJcXC5jYzo5MVxyXG45MVxbIFx0XSprID0gXFwoYS5cXCpwbWZcXClcXCg0XFwpO1xyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJjb250aW51ZSB0byA5MSIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29udGludWUgdG8gOTEiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGNvbnRpbnVlIHRvIDkxIiB9Cit9CisKKworIyBOb3cgY2hlY2sgYWdhaW4gdGhhdCBwbWkgd29ya3MgZXZlbiB3aGVuIG5vdCBzZXQgdG8KKyMgc29tZXRoaW5nIHRoYXQncyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvYmplY3QKKworc2VuZF9nZGIgInByaW50IHBtaVxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxcJFxbMC05XF0qID0gXFwoaW50IFxcKCBBOjpcXCpcXClcXCkgJkE6OmpqXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgInByaW50IHBtaSAoMikiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHBtaSAoMikiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHBtaSAoMikiIH0KK30KKworCisjIHByaW50IGRlcmVmZXJlbmNlZCBwb2ludGVyIHRvIGRhdGEgbWVtYmVyCisKK3NlbmRfZ2RiICJwcmludCBhLipwbWlcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcXCRcWzAtOVxdKiA9IDEzMzFcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAicHJpbnQgYS4qcG1pICgyKSIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgYS4qcG1pICgyKSIgfQorICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgYS4qcG1pICgyKSIgfQorfQorCisjIHByaW50IGRlcmVmZXJlbmNlZCBwb2ludGVyIHRvIGRhdGEgbWVtYmVyCisjIHRoaXMgdGltZSwgZGVyZWZlcmVuY2VkIHRocm91Z2ggYSBwb2ludGVyCisKK3NlbmRfZ2RiICJwcmludCBhX3AtPipwbWlcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcXCRcWzAtOVxdKiA9IDEzMzFcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAicHJpbnQgYS0+KnBtaSIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgYS0+KnBtaSAoMikiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGEtPipwbWkgKDIpIiB9Cit9CisKKworIyBwIGEuKnBtZiAtIGZhaWwKKworIyBwIHBtaQorCisjIHAgYS4qcG1pCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9tZXRob2QuY2MgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvbWV0aG9kLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OWIwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvbWV0aG9kLmNjCkBAIC0wLDAgKzEsODAgQEAKKy8vIENsYXNzIGZ1bmsgaGFzIGEgY29uc3RydWN0b3IgYW5kIGFuIG9yZGluYXJ5IG1ldGhvZAorLy8gVGVzdCBmb3IgQ0hGdHMyMzQyNgorCitjbGFzcyBmdW5rCit7CitwdWJsaWM6CisgIGZ1bmsoKTsKKyAgdm9pZCBnZXRGdW5reShpbnQgYSwgaW50IGIpOworICBpbnQgZGF0YV87Cit9OworCitmdW5rOjpmdW5rKCkKKyAgOiBkYXRhXygzMykKK3sKK30KKwordm9pZCBmdW5rOjpnZXRGdW5reShpbnQgYSwgaW50IGIpCit7CisgIGludCByZXM7CisgIHJlcyA9IGEgKyBiIC0gZGF0YV87CisgIGRhdGFfID0gcmVzOworfQorCisvLyBDbGFzcyBBIGhhcyBjb25zdCBhbmQgdm9sYXRpbGUgbWV0aG9kcworCitjbGFzcyBBIHsKK3B1YmxpYzoKKyAgaW50IHg7CisgIGludCB5OworICBpbnQgZm9vIChpbnQgYXJnKTsKKyAgaW50IGJhciAoaW50IGFyZykgY29uc3Q7CisgIGludCBiYXogKGludCBhcmcsIGNoYXIgYykgdm9sYXRpbGU7CisgIGludCBxdXggKGludCBhcmcsIGZsb2F0IGYpIGNvbnN0IHZvbGF0aWxlOworfTsKKworaW50IEE6OmZvbyAoaW50IGFyZykKK3sKKyAgeCArPSBhcmc7CisgIHJldHVybiBhcmcgKjI7Cit9CisKK2ludCBBOjpiYXIgKGludCBhcmcpIGNvbnN0Cit7CisgIHJldHVybiBhcmcgKyAyICogeDsKK30KKworaW50IEE6OmJheiAoaW50IGFyZywgY2hhciBjKSB2b2xhdGlsZQoreworICByZXR1cm4gYXJnIC0gMiAqIHggKyBjOworfQorCitpbnQgQTo6cXV4IChpbnQgYXJnLCBmbG9hdCBmKSBjb25zdCB2b2xhdGlsZQoreworICBpZiAoZiA+IDApCisgICAgcmV0dXJuIDIgKiBhcmcgLSB4OworICBlbHNlCisgICAgcmV0dXJuIDIgKiBhcmcgKyB4OworfQorCisKK2ludCBtYWluKCkKK3sKKyAgQSBhOworICBpbnQgazsKKworICBrID0gMTA7CisgIGEueCA9IGsgKiAyOworCisgIGsgPSBhLmZvbygxMyk7CisgIAorICBrICs9IGEuYmFyKDE1KTsKKworICAvLyBUZXN0IGZvciBDSEZ0czIzNDI2IGZvbGxvd3MKKyAgZnVuayBmOworICBmLmdldEZ1bmt5KDEsIDIpOworICByZXR1cm4gMDsKK30KKworCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9tZXRob2QuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL21ldGhvZC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5MzlkYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9tZXRob2QuZXhwCkBAIC0wLDAgKzEsMjMzIEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyB0ZXN0cyBmb3IgbWlzYy4gQysrIG1ldGhvZCBzdHVmZgorIyBXcml0dGVuIGJ5IFNhdGlzaCBQYWkgPHBhaUBhcG9sbG8uaHAuY29tPiAxOTk3LTA3LTA4CisKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGdkYiB0ZXN0c3VpdGUKKworIyBUaGlzIHRlc3RzOgorIyAwLiBtZXRob2QgYXJndW1lbnRzIGFyZSBjb3JyZWN0CisjIDEuIGFjY2VzcyB0byBjbGFzcyBkYXRhIG1lbWJlcnMgaW5zaWRlIG1ldGhvZCBzY29wZXMKKyMgMi4gY29ycmVjdCBwYXJhbSB0eXBlcyBmb3IgbWV0aG9kcyBpbiBwdHlwZS4KKyMgMy4gY29uc3QgYW5kIHZvbGF0aWxlIG1ldGhvZHMKKworIyAoIzAgYW5kICMxIGFib3ZlIHJlbGF0ZSB0byBhbiBIUCBzcGVjaWZpYyBwcm9ibGVtIC0tIEdEQiBtdXN0IGNvcnJlY3RseQorIyBpbnRlZ3JhdGUgRlBBUkFNIHN5bWJvbHMgaW4gSFAgZGVidWcgaW5mbyBpbnRvIHRoZSBsb2NhbCB2YXIgbGlzdAorIyBmb3IgdGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCdzIGJsb2NrLikKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisgICAgICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorICAgICAgICB9CisKKyMKKyMgdGVzdCBydW5uaW5nIHByb2dyYW1zCisjCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJtZXRob2QiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIGMrK31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisKKyMKKyMgc2V0IGl0IHVwIGF0IGEgYnJlYWtwb2ludCBzbyB3ZSBjYW4gcGxheSB3aXRoIHRoZSB2YXJpYWJsZSB2YWx1ZXMKKyMKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgcGVycm9yICJjb3VsZG4ndCBydW4gdG8gYnJlYWtwb2ludCIKKyAgICBjb250aW51ZQorfQorCitzZW5kX2dkYiAiYnJlYWsgQTo6Zm9vXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiQnJlYWtwb2ludCBcWzAtOVxdKiBhdCAkaGV4LipmaWxlIC4qbWV0aG9kLmNjLCBsaW5lIDM4KlxcLlxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgcGFzcyAic2V0IGJyZWFrcG9pbnQgb24gQTo6Zm9vIgorICAgfQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic2V0IGJyZWFrcG9pbnQgb24gQTo6Zm9vIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHNldCBicmVha3BvaW50IG9uIEE6OmZvbyIgfQorfQorCitzZW5kX2dkYiAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJDb250aW51aW5nXFwuXHJcblxyXG5CcmVha3BvaW50IFxbMC05XF0qLCBBOjpmb28gXFwodGhpcz0kaGV4LCBhcmc9MTNcXCkgYXQgLiptZXRob2RcXC5jYzozOFxyXG4zOFxbXHQgXF0qeCBcXCs9IGFyZztcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAiY29udGludWVkIGFuZCBnb3QgYnJlYWtwb2ludCBpbiBBOjpmb28iCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb250aW51aW5nIGFuZCBicmVha2luZyBpbiBBOjpmb28iIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgY29udGludWUiIH0KK30KKworIyBDaGVjayBhYmlsaXR5IHRvIGFjY2VzcyB0aGlzLXJlbGF0aXZlIHN0dWZmLgorCitzZW5kX2dkYiAicHJpbnQgeFxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxcJFxbMC05XF0qID0gMjBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgIHBhc3MgImFjY2VzcyB0aGlzLXJlbGF0aXZlIHggKGluIGZvbykiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB4IChpbiBmb28pIiB9IAorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB4IChpbiBmb28pIiB9Cit9CisKKyMgQ2hlY2sgYWNjZXNzIHRvIHRoaXMgcG9pbnRlciAgICAgICAKKworc2VuZF9nZGIgInByaW50IHRoaXNcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcXCRcWzAtOVxdKiA9IFxcKEEgXFwqXFwpICRoZXhcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgIHBhc3MgInByaW50IHRoaXMgKGluIGZvbykiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB0aGlzIChpbiBmb28pIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHRoaXMgKGluIGZvbykiIH0KK30KKworIyBOb3cgZG8gZXZlcnl0aGluZyBvdmVyIGFnYWluIGZvciBBOjpiYXIsIGJlY2F1c2Ugc29tZXRpbWVzIHByb2Nlc3Npbmcgb25lIG1ldGhvZAorIyAodGhlIGZpcnN0IG9uZSkgaXMgZmluZSwgYnV0IHRoZSBzZWNvbmQgb25lJ3MgZGVidWcgaW5mbyBnZXRzIG11bmdlZCBiZXlvbmQgcmVjb2duaXRpb24uCisKK3NlbmRfZ2RiICJicmVhayBBOjpiYXJcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJCcmVha3BvaW50IFxbMC05XF0qIGF0ICRoZXguKmZpbGUgLiptZXRob2QuY2MsIGxpbmUgNDRcXC5cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgIHBhc3MgInNldCBicmVha3BvaW50IG9uIEE6OmJhciIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInNldCBicmVha3BvaW50IG9uIEE6OmJhciIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBzZXQgYnJlYWtwb2ludCBvbiBBOjpiYXIiIH0KK30KKworc2VuZF9nZGIgImNvbnRpbnVlXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiQ29udGludWluZ1xcLlxyXG5cclxuQnJlYWtwb2ludCBcWzAtOVxdKiwgQTo6YmFyIFxcKHRoaXM9JGhleCwgYXJnPTE1XFwpIGF0IC4qbWV0aG9kXFwuY2M6NDRcclxuNDRcW1x0IFxdKnJldHVybiBhcmcgXFwrIDIgXFwqIHg7XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgImNvbnRpbnVlZCBhbmQgZ290IGJyZWFrcG9pbnQgaW4gQTo6YmFyIgorICAgfQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29udGludWluZyBhbmQgYnJlYWtpbmcgaW4gQTo6YmFyIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGNvbnRpbnVlIiB9Cit9CisKKyMgQ2hlY2sgYWJpbGl0eSB0byBhY2Nlc3MgdGhpcy1yZWxhdGl2ZSBzdHVmZi4KKworc2VuZF9nZGIgInByaW50IHhcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcXCRcWzAtOVxdKiA9IDMzXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICBwYXNzICJhY2Nlc3MgdGhpcy1yZWxhdGl2ZSB4IChpbiBiYXIpIgorICAgfQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgeCAoaW4gYmFyKSIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB4IChpbiBiYXIpIiB9Cit9CisKKyMgQ2hlY2sgYWNjZXNzIHRvIHRoaXMgcG9pbnRlciAgICAgICAKKworc2VuZF9nZGIgInByaW50IHRoaXNcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcXCRcWzAtOVxdKiA9IFxcKGNvbnN0IGNsYXNzIEEgXFwqXFwpICRoZXhcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgIHBhc3MgInByaW50IHRoaXMgKGluIGJhcikiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB0aGlzIChpbiBiYXIpIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHRoaXMgKGluIGJhcikiIH0KK30KKworIyBDaGVjayBhZ2FpbiB3aXRoIGZ1bms6OmdldEZ1bmt5ICh0aGlzIGlzIHRoZSBvcmlnaW5hbCB0ZXN0IGNhc2UKKyMgZm9yIENIRnRzMjM0MjYpOyBzb21ldGltZXMgaGF2aW5nIGEgY29uc3RydWN0b3Igd2l0aCBubyBhcmd1bWVudHMKKyMgd2lsbCBudWtlIHRoZSBkZWJ1ZyBpbmZvIHJlYWQgaW4gZm9yIG90aGVyIG1ldGhvZHMgaW4gdGhlIGNsYXNzLgorCitzZW5kX2dkYiAiYnJlYWsgZnVuazo6Z2V0RnVua3lcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJCcmVha3BvaW50IFxbMC05XF0qIGF0ICRoZXguKmZpbGUgLiptZXRob2QuY2MsIGxpbmUgMjBcXC5cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgIHBhc3MgInNldCBicmVha3BvaW50IG9uIGZ1bms6OmdldEZ1bmt5IgorICAgfQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic2V0IGJyZWFrcG9pbnQgb24gZnVuazo6Z2V0ZnVua3kiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgc2V0IGJyZWFrcG9pbnQgb24gZnVuazo6Z2V0ZnVua3kiIH0KK30KKworc2VuZF9nZGIgImNvbnRpbnVlXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiQ29udGludWluZ1xcLlxyXG5cclxuQnJlYWtwb2ludCBcWzAtOVxdKiwgZnVuazo6Z2V0RnVua3kgXFwodGhpcz0kaGV4LCBhPTEsIGI9MlxcKSBhdCAuKm1ldGhvZFxcLmNjOjIwXHJcbjIwXFtcdCBcXSpyZXMgPSBhIFxcKyBiIC0gZGF0YV87XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgImNvbnRpbnVlZCBhbmQgZ290IGJyZWFrcG9pbnQgaW4gZnVuazo6Z2V0ZnVua3kiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb250aW51aW5nIGFuZCBicmVha2luZyBpbiBmdW5rOjpnZXRmdW5reSIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb250aW51ZSIgfQorfQorCisjIENoZWNrIGFiaWxpdHkgdG8gYWNjZXNzIHRoaXMtcmVsYXRpdmUgc3R1ZmYuCisKK3NlbmRfZ2RiICJwcmludCBkYXRhX1xuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxcJFxbMC05XF0qID0gMzNcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgIHBhc3MgImFjY2VzcyB0aGlzLXJlbGF0aXZlIGRhdGFfIGluIGdldEZ1bmt5IgorICAgfQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZGF0YV8gaW4gZ2V0RnVua3kiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgZGF0YV8gaW4gZ2V0RnVua3kiIH0KK30KKworIyBDaGVjayBhY2Nlc3MgdG8gdGhpcyBwb2ludGVyICAgICAgIAorCitzZW5kX2dkYiAicHJpbnQgdGhpc1xuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxcJFxbMC05XF0qID0gXFwoZnVuayBcXCpcXCkgJGhleFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgcGFzcyAicHJpbnQgdGhpcyBpbiBnZXRGdW5reSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHRoaXMgaW4gZ2V0ZnVua3kiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdGhpcyBpbiBnZXRmdW5reSIgfQorfQorCisjIENoZWNrIGFjY2VzcyB0byBsb2NhbCB2YXJpYWJsZQorCitzZW5kX2dkYiAicHJpbnQgcmVzXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiXFwkXFswLTlcXSogPSBcWzAtOVxdKlxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgcGFzcyAicHJpbnQgcmVzIGluIGdldEZ1bmt5IgorICAgfQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgcmVzIGluIGdldGZ1bmt5IiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHJlcyBpbiBnZXRmdW5reSIgfQorfQorCisKKyMgQ2hlY2sgcHR5cGUgb2YgY2xhc3MgLS0gc2hvdWxkIHNob3cgY29uc3Qvdm9sYXRpbGUgbWV0aG9kcworCitzZW5kX2dkYiAicHR5cGUgQVxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgInR5cGUgPSBjbGFzcyBBIFx7XHJcblxbIFxdKnB1YmxpYzpcclxuXFsgXF0qaW50IHg7XHJcblxbIFxdKmludCB5O1xyXG5cclxuXFxbIFxdKkEgJiBvcGVyYXRvcj1cXChBIGNvbnN0ICZcXCk7XHJcblxbIFxdKkFcXChBIGNvbnN0ICZcXClcclxuXFsgXF0qQVxcKHZvaWRcXClcclxuWyBcXSppbnQgZm9vXFwoaW50XFwpO1xyXG5cWyBcXSppbnQgYmFyXFwoaW50XFwpIGNvbnN0O1xyXG5cWyBcXSppbnQgYmF6XFwoaW50LCBjaGFyXFwpIHZvbGF0aWxlO1xyXG5cWyBcXSppbnQgcXV4XFwoaW50LCBmbG9hdFxcKSBjb25zdCB2b2xhdGlsZTtcclxuXH1cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAicHR5cGUgQSIKKyAgIH0KKyAgIC1yZSAidHlwZSA9IGNsYXNzIEEgXHtcclxuXFsgXF0qcHVibGljOlxyXG5cWyBcXSppbnQgeDtcclxuXFsgXF0qaW50IHk7XHJcblxyXG5cWyBcXSppbnQgZm9vXFwoaW50XFwpO1xyXG5cWyBcXSppbnQgYmFyXFwoaW50XFwpIGNvbnN0O1xyXG5cWyBcXSppbnQgYmF6XFwoaW50LCBjaGFyXFwpO1xyXG5cWyBcXSppbnQgcXV4XFwoaW50LCBmbG9hdFxcKSBjb25zdDtcclxuXH1cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAicHR5cGUgQSAoSFAgYUNDIGJ1ZyAtLSB2b2xhdGlsZSBub3QgaW5kaWNhdGVkKSIKKyAgIH0KKyAgIC1yZSAidHlwZSA9IGNsYXNzIEEgXHtcclxuXFsgXF0qcHVibGljOlxyXG5cWyBcXSppbnQgeDtcclxuXFsgXF0qaW50IHk7XHJcblxyXG5cWyBcXSppbnQgZm9vXFwoaW50XFwpO1xyXG5cWyBcXSppbnQgYmFyXFwoaW50XFwpIGNvbnN0O1xyXG5cWyBcXSppbnQgYmF6XFwoaW50LCBjaGFyXFwpIHZvbGF0aWxlO1xyXG5cWyBcXSppbnQgcXV4XFwoaW50LCBmbG9hdFxcKSBjb25zdCB2b2xhdGlsZTtcclxuXH1cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAicHR5cGUgQSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInB0eXBlIEEiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHR5cGUgQSIgfQorfQorCitzZW5kX2dkYiAiY29udFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJDb250aW51aW5nLlxyXG5cclxuUHJvZ3JhbSBleGl0ZWQgbm9ybWFsbHkuXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAiZmluaXNoIHByb2dyYW0iCisgICAgfQorICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJmaW5pc2ggcHJvZ3JhbSIgIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGZpbmlzaCBwcm9ncmFtIiAgfQorfQorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jKysvbWlzYy5jYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9taXNjLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZWI3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvbWlzYy5jYwpAQCAtMCwwICsxLDUxNyBAQAorLy8gVGVzdCB2YXJpb3VzIC0qLSBDKysgLSotIHRoaW5ncy4KKwordHlwZWRlZiBzdHJ1Y3QgZmxlZXAgZmxlZXA7CitzdHJ1Y3QgZmxlZXAgeyBpbnQgYTsgfSBzOworCisvLyA9PT09PT09PT09PT09PT09PT09PT09IHNpbXBsZSBjbGFzcyBzdHJ1Y3R1cmVzICA9PT09PT09PT09PT09PT09PT09PT09PQorCitzdHJ1Y3QgZGVmYXVsdF9wdWJsaWNfc3RydWN0IHsKKyAvLyBkZWZhdWx0cyB0byBwdWJsaWM6CisgIGludCBhOworICBpbnQgYjsKK307CisKK3N0cnVjdCBleHBsaWNpdF9wdWJsaWNfc3RydWN0IHsKKyBwdWJsaWM6CisgIGludCBhOworICBpbnQgYjsKK307CisKK3N0cnVjdCBwcm90ZWN0ZWRfc3RydWN0IHsKKyBwcm90ZWN0ZWQ6CisgIGludCBhOworICBpbnQgYjsKK307CisKK3N0cnVjdCBwcml2YXRlX3N0cnVjdCB7CisgcHJpdmF0ZToKKyAgaW50IGE7CisgIGludCBiOworfTsKKworc3RydWN0IG1peGVkX3Byb3RlY3Rpb25fc3RydWN0IHsKKyBwdWJsaWM6CisgIGludCBhOworICBpbnQgYjsKKyBwcml2YXRlOgorICBpbnQgYzsKKyAgaW50IGQ7CisgcHJvdGVjdGVkOgorICBpbnQgZTsKKyAgaW50IGY7CisgcHVibGljOgorICBpbnQgZzsKKyBwcml2YXRlOgorICBpbnQgaDsKKyBwcm90ZWN0ZWQ6CisgIGludCBpOworfTsKKworY2xhc3MgcHVibGljX2NsYXNzIHsKKyBwdWJsaWM6CisgIGludCBhOworICBpbnQgYjsKK307CisKK2NsYXNzIHByb3RlY3RlZF9jbGFzcyB7CisgcHJvdGVjdGVkOgorICBpbnQgYTsKKyAgaW50IGI7Cit9OworCitjbGFzcyBkZWZhdWx0X3ByaXZhdGVfY2xhc3MgeworIC8vIGRlZmF1bHRzIHRvIHByaXZhdGU6CisgIGludCBhOworICBpbnQgYjsKK307CisKK2NsYXNzIGV4cGxpY2l0X3ByaXZhdGVfY2xhc3MgeworIHByaXZhdGU6CisgIGludCBhOworICBpbnQgYjsKK307CisKK2NsYXNzIG1peGVkX3Byb3RlY3Rpb25fY2xhc3MgeworIHB1YmxpYzoKKyAgaW50IGE7CisgIGludCBiOworIHByaXZhdGU6CisgIGludCBjOworICBpbnQgZDsKKyBwcm90ZWN0ZWQ6CisgIGludCBlOworICBpbnQgZjsKKyBwdWJsaWM6CisgIGludCBnOworIHByaXZhdGU6CisgIGludCBoOworIHByb3RlY3RlZDoKKyAgaW50IGk7Cit9OworCitjbGFzcyBjb25zdF92b2xfbWV0aG9kX2NsYXNzIHsKK3B1YmxpYzoKKyAgaW50IGE7CisgIGludCBiOworICBpbnQgZm9vIChpbnQgJikgY29uc3Q7CisgIGludCBiYXIgKGludCAmKSB2b2xhdGlsZTsKKyAgaW50IGJheiAoaW50ICYpIGNvbnN0IHZvbGF0aWxlOworfTsKKworaW50IGNvbnN0X3ZvbF9tZXRob2RfY2xhc3M6OmZvbyAoaW50ICYgaXIpIGNvbnN0Cit7CisgIHJldHVybiBpciArIDM7Cit9CitpbnQgY29uc3Rfdm9sX21ldGhvZF9jbGFzczo6YmFyIChpbnQgJiBpcikgdm9sYXRpbGUKK3sKKyAgcmV0dXJuIGlyICsgNDsKK30KK2ludCBjb25zdF92b2xfbWV0aG9kX2NsYXNzOjpiYXogKGludCAmIGlyKSBjb25zdCB2b2xhdGlsZQoreworICByZXR1cm4gaXIgKyA1OworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IHNpbXBsZSBpbmhlcml0YW5jZSA9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBBIHsKKyBwdWJsaWM6CisgIGludCBhOworICBpbnQgeDsKK307CisKK0EgZ19BOworCitjbGFzcyBCIDogcHVibGljIEEgeworIHB1YmxpYzoKKyAgaW50IGI7CisgIGludCB4OworfTsKKworQiBnX0I7CisKK2NsYXNzIEMgOiBwdWJsaWMgQSB7CisgcHVibGljOgorICBpbnQgYzsKKyAgaW50IHg7Cit9OworCitDIGdfQzsKKworY2xhc3MgRCA6IHB1YmxpYyBCLCBwdWJsaWMgQyB7CisgcHVibGljOgorICBpbnQgZDsKKyAgaW50IHg7Cit9OworCitEIGdfRDsKKworY2xhc3MgRSA6IHB1YmxpYyBEIHsKKyBwdWJsaWM6CisgIGludCBlOworICBpbnQgeDsKK307CisKK0UgZ19FOworCitjbGFzcyBjbGFzc193aXRoX2Fub25fdW5pb24KK3sKKyBwdWJsaWM6CisgIGludCBvbmU7CisgIHVuaW9uCisgIHsKKyAgICBpbnQgYTsKKyAgICBsb25nIGI7CisgIH07Cit9OworCitjbGFzc193aXRoX2Fub25fdW5pb24gZ19hbm9uX3VuaW9uOworCit2b2lkIGluaGVyaXRhbmNlMiAodm9pZCkKK3sKK30KKwordm9pZCBpbmhlcml0YW5jZTEgKHZvaWQpCit7CisgIGludCBpdmFsOworICBpbnQgKmludHA7CisKKyAgLy8ge0E6OmEsIEE6Onh9CisKKyAgZ19BLkE6OmEgPSAxOworICBnX0EuQTo6eCA9IDI7CisKKyAgLy8ge3tBOjphLEE6Onh9LEI6OmIsQjo6eH0KKworICBnX0IuQTo6YSA9IDM7CisgIGdfQi5BOjp4ID0gNDsKKyAgZ19CLkI6OmIgPSA1OworICBnX0IuQjo6eCA9IDY7CisKKyAgLy8ge3tBOjphLEE6Onh9LEM6OmMsQzo6eH0KKworICBnX0MuQTo6YSA9IDc7CisgIGdfQy5BOjp4ID0gODsKKyAgZ19DLkM6OmMgPSA5OworICBnX0MuQzo6eCA9IDEwOworCisgIC8vIHt7e0E6OmEsQTo6eH0sQjo6YixCOjp4fSx7e0E6OmEsQTo6eH0sQzo6YyxDOjp4fSxEOjpkLEQ6Onh9CisKKyAgLy8gVGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBjb2RlIGlzIG5vbi1wb3J0YWJsZSwgYnV0IGFsbG93cyB1cworICAvLyB0byBpbml0aWFsaXplIGFsbCBtZW1iZXJzIG9mIGdfRCB1bnRpbCB3ZSBjYW4gZmlsbCBpbiB0aGUgbWlzc2luZworICAvLyBpbml0aWFsaXphdGlvbiBjb2RlIHdpdGggbGVnYWwgQysrIGNvZGUuCisKKyAgZm9yIChpbnRwID0gKGludCAqKSAmZ19ELCBpdmFsID0gMTE7CisgICAgICAgaW50cCA8ICgoaW50ICopICZnX0QgKyBzaXplb2YgKGdfRCkgLyBzaXplb2YgKGludCkpOworICAgICAgIGludHArKywgaXZhbCsrKQorICAgIHsKKyAgICAgICppbnRwID0gaXZhbDsKKyAgICB9CisKKyAgLy8gT3ZlcmxheSB0aGUgbm9ucG9ydGFibGUgaW5pdGlhbGl6YXRpb24gd2l0aCBsZWdhbCBpbml0aWFsaXphdGlvbi4KKworICAvLyA/Pz8/PyA9IDExOyAgKGdfRC5BOjphID0gMTE7IGlzIGFtYmlndW91cykKKyAgLy8gPz8/Pz8gPSAxMjsgIChnX0QuQTo6eCA9IDEyOyBpcyBhbWJpZ3VvdXMpCisgIGdfRC5COjpiID0gMTM7CisgIGdfRC5COjp4ID0gMTQ7CisgIC8vID8/Pz8/ID0gMTU7CisgIC8vID8/Pz8/ID0gMTY7CisgIGdfRC5DOjpjID0gMTc7CisgIGdfRC5DOjp4ID0gMTg7CisgIGdfRC5EOjpkID0gMTk7CisgIGdfRC5EOjp4ID0gMjA7CisKKworICAvLyB7e3t7QTo6YSxBOjp4fSxCOjpiLEI6Onh9LHt7QTo6YSxBOjp4fSxDOjpjLEM6Onh9LEQ6OmQsRDo6eH19LEU6OmUsRTo6eH0KKworICAvLyBUaGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uIGNvZGUgaXMgbm9uLXBvcnRhYmxlLCBidXQgYWxsb3dzIHVzCisgIC8vIHRvIGluaXRpYWxpemUgYWxsIG1lbWJlcnMgb2YgZ19EIHVudGlsIHdlIGNhbiBmaWxsIGluIHRoZSBtaXNzaW5nCisgIC8vIGluaXRpYWxpemF0aW9uIGNvZGUgd2l0aCBsZWdhbCBDKysgY29kZS4KKworICBmb3IgKGludHAgPSAoaW50ICopICZnX0UsIGl2YWwgPSAyMTsKKyAgICAgICBpbnRwIDwgKChpbnQgKikgJmdfRSArIHNpemVvZiAoZ19FKSAvIHNpemVvZiAoaW50KSk7CisgICAgICAgaW50cCsrLCBpdmFsKyspCisgIHsKKyAgICAqaW50cCA9IGl2YWw7CisgIH0KKworICAvLyBPdmVybGF5IHRoZSBub25wb3J0YWJsZSBpbml0aWFsaXphdGlvbiB3aXRoIGxlZ2FsIGluaXRpYWxpemF0aW9uLgorCisgIC8vID8/Pz8/ID0gMjE7ICAoZ19FLkE6OmEgPSAyMTsgaXMgYW1iaWd1b3VzKQorICAvLyA/Pz8/PyA9IDIyOyAgKGdfRS5BOjp4ID0gMjI7IGlzIGFtYmlndW91cykKKyAgZ19FLkI6OmIgPSAyMzsKKyAgZ19FLkI6OnggPSAyNDsKKyAgLy8gPz8/Pz8gPSAyNTsKKyAgLy8gPz8/Pz8gPSAyNjsKKyAgZ19FLkM6OmMgPSAyNzsKKyAgZ19FLkM6OnggPSAyODsKKyAgZ19FLkQ6OmQgPSAyOTsKKyAgZ19FLkQ6OnggPSAzMDsKKyAgZ19FLkU6OmUgPSAzMTsKKyAgZ19FLkU6OnggPSAzMjsKKworICBnX2Fub25fdW5pb24ub25lID0gMTsKKyAgZ19hbm9uX3VuaW9uLmEgPSAyOworCisgIGluaGVyaXRhbmNlMiAoKTsJCit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PSB2aXJ0dWFsIGJhc2UgY2xhc3Nlcz09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgdkEgeworIHB1YmxpYzoKKyAgaW50IHZhOworICBpbnQgdng7Cit9OworCit2QSBnX3ZBOworCitjbGFzcyB2QiA6IHB1YmxpYyB2aXJ0dWFsIHZBIHsKKyBwdWJsaWM6CisgIGludCB2YjsKKyAgaW50IHZ4OworfTsKKwordkIgZ192QjsKKworY2xhc3MgdkMgOiBwdWJsaWMgdmlydHVhbCB2QSB7CisgcHVibGljOgorICBpbnQgdmM7CisgIGludCB2eDsKK307CisKK3ZDIGdfdkM7CisKK2NsYXNzIHZEIDogcHVibGljIHZpcnR1YWwgdkIsIHB1YmxpYyB2aXJ0dWFsIHZDIHsKKyBwdWJsaWM6CisgIGludCB2ZDsKKyAgaW50IHZ4OworfTsKKwordkQgZ192RDsKKworY2xhc3MgdkUgOiBwdWJsaWMgdmlydHVhbCB2RCB7CisgcHVibGljOgorICBpbnQgdmU7CisgIGludCB2eDsKK307CisKK3ZFIGdfdkU7CisKK3ZvaWQgaW5oZXJpdGFuY2U0ICh2b2lkKQoreworfQorCit2b2lkIGluaGVyaXRhbmNlMyAodm9pZCkKK3sKKyAgaW50IGl2YWw7CisgIGludCAqaW50cDsKKworICAvLyB7dkE6OnZhLCB2QTo6dnh9CisKKyAgZ192QS52QTo6dmEgPSAxOworICBnX3ZBLnZBOjp2eCA9IDI7CisKKyAgLy8ge3t2QTo6dmEsIHZBOjp2eH0sIHZCOjp2YiwgdkI6OnZ4fQorCisgIGdfdkIudkE6OnZhID0gMzsKKyAgZ192Qi52QTo6dnggPSA0OworICBnX3ZCLnZCOjp2YiA9IDU7CisgIGdfdkIudkI6OnZ4ID0gNjsKKworICAvLyB7e3ZBOjp2YSwgdkE6OnZ4fSwgdkM6OnZjLCB2Qzo6dnh9CisKKyAgZ192Qy52QTo6dmEgPSA3OworICBnX3ZDLnZBOjp2eCA9IDg7CisgIGdfdkMudkM6OnZjID0gOTsKKyAgZ192Qy52Qzo6dnggPSAxMDsKKworICAvLyB7e3t7dkE6OnZhLCB2QTo6dnh9LCB2Qjo6dmIsIHZCOjp2eH0sIHZDOjp2YywgdkM6OnZ4fSwgdkQ6OnZkLHZEOjp2eH0KKworICBnX3ZELnZBOjp2YSA9IDExOworICBnX3ZELnZBOjp2eCA9IDEyOworICBnX3ZELnZCOjp2YiA9IDEzOworICBnX3ZELnZCOjp2eCA9IDE0OworICBnX3ZELnZDOjp2YyA9IDE1OworICBnX3ZELnZDOjp2eCA9IDE2OworICBnX3ZELnZEOjp2ZCA9IDE3OworICBnX3ZELnZEOjp2eCA9IDE4OworCisKKyAgLy8ge3t7e3t2QTo6dmEsdkE6OnZ4fSx2Qjo6dmIsdkI6OnZ4fSx2Qzo6dmMsdkM6OnZ4fSx2RDo6dmQsdkQ6OnZ4fSx2RTo6dmUsdkU6OnZ4fQorCisgIGdfdkQudkE6OnZhID0gMTk7CisgIGdfdkQudkE6OnZ4ID0gMjA7CisgIGdfdkQudkI6OnZiID0gMjE7CisgIGdfdkQudkI6OnZ4ID0gMjI7CisgIGdfdkQudkM6OnZjID0gMjM7CisgIGdfdkQudkM6OnZ4ID0gMjQ7CisgIGdfdkQudkQ6OnZkID0gMjU7CisgIGdfdkQudkQ6OnZ4ID0gMjY7CisgIGdfdkUudkU6OnZlID0gMjc7CisgIGdfdkUudkU6OnZ4ID0gMjg7CisKKyAgaW5oZXJpdGFuY2U0ICgpOwkKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBCYXNlMSB7CisgcHVibGljOgorICBpbnQgeDsKKyAgQmFzZTEoaW50IGkpIHsgeCA9IGk7IH0KK307CisKK2NsYXNzIEZvbworeworIHB1YmxpYzoKKyAgaW50IHg7CisgIGludCB5OworICBzdGF0aWMgaW50IHN0OworICBGb28gKGludCBpLCBpbnQgaikgeyB4ID0gaTsgeSA9IGo7IH0KKyAgaW50IG9wZXJhdG9yISAoKTsKKyAgb3BlcmF0b3IgaW50ICgpOworICBpbnQgdGltZXMgKGludCB5KTsKK307CisKK2NsYXNzIEJhciA6IHB1YmxpYyBCYXNlMSwgcHVibGljIEZvbyB7CisgcHVibGljOgorICBpbnQgejsKKyAgQmFyIChpbnQgaSwgaW50IGosIGludCBrKSA6IEJhc2UxICgxMCprKSwgRm9vIChpLCBqKSB7IHogPSBrOyB9Cit9OworCitjbGFzcyBDbGFzc1dpdGhFbnVtIHsKK3B1YmxpYzoKKyAgZW51bSBQcml2RW51bSB7IHJlZCwgZ3JlZW4sIGJsdWUsIHllbGxvdyA9IDQyIH07CisgIFByaXZFbnVtIHByaXZfZW51bTsKKyAgaW50IHg7Cit9OworCitpbnQgRm9vOjpvcGVyYXRvciEgKCkgeyByZXR1cm4gIXg7IH0KKworaW50IEZvbzo6dGltZXMgKGludCB5KSB7IHJldHVybiB4ICogeTsgfQorCitpbnQgRm9vOjpzdCA9IDEwMDsKKworRm9vOjpvcGVyYXRvciBpbnQoKSB7IHJldHVybiB4OyB9CisKK0ZvbyBmb28oMTAsIDExKTsKK0JhciBiYXIoMjAsIDIxLCAyMik7CisKK2NsYXNzIENvbnRhaW5zX3N0YXRpY19pbnN0YW5jZQoreworIHB1YmxpYzoKKyAgaW50IHg7CisgIGludCB5OworICBDb250YWluc19zdGF0aWNfaW5zdGFuY2UgKGludCBpLCBpbnQgaikgeyB4ID0gaTsgeSA9IGo7IH0KKyAgc3RhdGljIENvbnRhaW5zX3N0YXRpY19pbnN0YW5jZSBudWxsOworfTsKKworQ29udGFpbnNfc3RhdGljX2luc3RhbmNlIENvbnRhaW5zX3N0YXRpY19pbnN0YW5jZTo6bnVsbCgwLDApOworQ29udGFpbnNfc3RhdGljX2luc3RhbmNlIGNzaSgxMCwyMCk7CisKK2NsYXNzIENvbnRhaW5zX25lc3RlZF9zdGF0aWNfaW5zdGFuY2UKK3sKKyBwdWJsaWM6CisgIGNsYXNzIE5lc3RlZAorICB7CisgICBwdWJsaWM6CisgICAgTmVzdGVkKGludCBpKSA6IHooaSkge30KKyAgICBpbnQgejsKKyAgICBzdGF0aWMgQ29udGFpbnNfbmVzdGVkX3N0YXRpY19pbnN0YW5jZSB4eDsKKyAgfTsKKworICBDb250YWluc19uZXN0ZWRfc3RhdGljX2luc3RhbmNlKGludCBpLCBpbnQgaikgOiB4KGkpLCB5KGopIHt9CisKKyAgaW50IHg7CisgIGludCB5OworCisgIHN0YXRpYyBDb250YWluc19uZXN0ZWRfc3RhdGljX2luc3RhbmNlIG51bGw7CisgIHN0YXRpYyBOZXN0ZWQgeXk7Cit9OworCitDb250YWluc19uZXN0ZWRfc3RhdGljX2luc3RhbmNlIENvbnRhaW5zX25lc3RlZF9zdGF0aWNfaW5zdGFuY2U6Om51bGwoMCwgMCk7CitDb250YWluc19uZXN0ZWRfc3RhdGljX2luc3RhbmNlOjpOZXN0ZWQgQ29udGFpbnNfbmVzdGVkX3N0YXRpY19pbnN0YW5jZTo6eXkoNSk7CitDb250YWluc19uZXN0ZWRfc3RhdGljX2luc3RhbmNlCisgIENvbnRhaW5zX25lc3RlZF9zdGF0aWNfaW5zdGFuY2U6Ok5lc3RlZDo6eHgoMSwyKTsKK0NvbnRhaW5zX25lc3RlZF9zdGF0aWNfaW5zdGFuY2UgY25zaSgzMCw0MCk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IG9uZTsKKyAgaW50IHR3bzsKK30gdGFnbGVzc19zdHJ1Y3Q7Cit0YWdsZXNzX3N0cnVjdCB2X3RhZ2xlc3M7CisKKy8qIFRyeSB0byBnZXQgdGhlIGNvbXBpbGVyIHRvIGFsbG9jYXRlIGEgY2xhc3MgaW4gYSByZWdpc3Rlci4gICovCitjbGFzcyBzbWFsbCB7CisgcHVibGljOgorICBpbnQgeDsKKyAgaW50IG1ldGhvZCAoKTsKK307CisKK2ludAorc21hbGw6Om1ldGhvZCAoKQoreworICByZXR1cm4geCArIDU7Cit9CisKK3ZvaWQgbWFya2VyX3JlZzEgKCkge30KKworaW50CityZWdpc3Rlcl9jbGFzcyAoKQoreworICAvKiBXZSBkb24ndCBjYWxsIGFueSBtZXRob2RzIGZvciB2LCBzbyBnY2MgdmVyc2lvbiBjeWdudXMtMi4zLjMtOTMwMjIwCisgICAgIG1pZ2h0IHB1dCB0aGlzIHZhcmlhYmxlIGluIGEgcmVnaXN0ZXIuICBUaGlzIGlzIGEgbG9zZSwgdGhvdWdoLCBiZWNhdXNlCisgICAgIGl0IG1lYW5zIHRoYXQgR0RCIGNhbid0IGNhbGwgYW55IG1ldGhvZHMgZm9yIHRoYXQgdmFyaWFibGUuICAqLworICByZWdpc3RlciBzbWFsbCB2OworCisgIGludCBpOworCisgIC8qIFBlcmZvcm0gYSBjb21wdXRhdGlvbiBzdWZmaWNpZW50bHkgY29tcGxpY2F0ZWQgdGhhdCBvcHRpbWl6aW5nIGNvbXBpbGVycworICAgICB3b24ndCBvcHRpbWl6ZWQgb3V0IHRoZSB2YXJpYWJsZS4gIElmIHNvbWUgY29tcGlsZXIgY29uc3RhbnQtZm9sZHMgdGhpcworICAgICB3aG9sZSBsb29wLCBtYXliZSB1c2luZyBhIHBhcmFtZXRlciB0byB0aGlzIGZ1bmN0aW9uIGhlcmUgd291bGQgaGVscC4gICovCisgIHYueCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAxMzsgKytpKQorICAgIHYueCArPSBpOworICAtLXYueDsgLyogdi54IGlzIG5vdyA3NyAqLworICBtYXJrZXJfcmVnMSAoKTsKKyAgcmV0dXJuIHYueCArIDU7Cit9CisKK2ludAorbWFpbigpCit7CisjaWZkZWYgdXNlc3R1YnMKKyAgc2V0X2RlYnVnX3RyYXBzKCk7CisgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICBpbmhlcml0YW5jZTEgKCk7CisgIGluaGVyaXRhbmNlMyAoKTsKKyAgcmVnaXN0ZXJfY2xhc3MgKCk7CisKKyAgLyogRklYTUU6IHBtaSBnZXRzIG9wdGltaXplZCBvdXQuICBOZWVkIHRvIGRvIHNvbWUgbW9yZSBjb21wdXRhdGlvbiB3aXRoCisgICAgIGl0IG9yIHNvbWV0aGluZy4gIChObyBvbmUgbm90aWNlcywgYmVjYXVzZSB0aGUgdGVzdCBpcyB4ZmFpbCdkIGFueXdheSwKKyAgICAgYnV0IHRoYXQgcHJvYmFibHkgd29uJ3QgYWx3YXlzIGJlIHRydWUuLi4pLiAgKi8KKyAgaW50IEZvbzo6KiBwbWkgPSAmRm9vOjp5OworCisgIC8qIE1ha2Ugc3VyZSB0aGUgQUlYIGxpbmtlciBkb2Vzbid0IHJlbW92ZSB0aGUgdmFyaWFibGUuICAqLworICB2X3RhZ2xlc3Mub25lID0gNTsKKworICAvKiBDbGFzcyB3aXRoIGVudW1lcmF0aW9uIGluc2lkZSBpdCAqLyAKKyAgQ2xhc3NXaXRoRW51bSBvYmpfd2l0aF9lbnVtOworICBvYmpfd2l0aF9lbnVtLnByaXZfZW51bSA9IENsYXNzV2l0aEVudW06OmdyZWVuOworCisgIHJldHVybiBmb28uKnBtaTsKK30KKworLyogQ3JlYXRlIGFuIGluc3RhbmNlIGZvciBzb21lIGNsYXNzZXMsIG90aGVyd2lzZSB0aGV5IGdldCBvcHRpbWl6ZWQgYXdheS4gICovCisKK2RlZmF1bHRfcHVibGljX3N0cnVjdCBkZWZhdWx0X3B1YmxpY19zOworZXhwbGljaXRfcHVibGljX3N0cnVjdCBleHBsaWNpdF9wdWJsaWNfczsKK3Byb3RlY3RlZF9zdHJ1Y3QgcHJvdGVjdGVkX3M7Citwcml2YXRlX3N0cnVjdCBwcml2YXRlX3M7CittaXhlZF9wcm90ZWN0aW9uX3N0cnVjdCBtaXhlZF9wcm90ZWN0aW9uX3M7CitwdWJsaWNfY2xhc3MgcHVibGljX2M7Citwcm90ZWN0ZWRfY2xhc3MgcHJvdGVjdGVkX2M7CitkZWZhdWx0X3ByaXZhdGVfY2xhc3MgZGVmYXVsdF9wcml2YXRlX2M7CitleHBsaWNpdF9wcml2YXRlX2NsYXNzIGV4cGxpY2l0X3ByaXZhdGVfYzsKK21peGVkX3Byb3RlY3Rpb25fY2xhc3MgbWl4ZWRfcHJvdGVjdGlvbl9jOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL21pc2MuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL21pc2MuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOTBmYmIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvbWlzYy5leHAKQEAgLTAsMCArMSwxMDYgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBGcmVkIEZpc2guIChmbmZAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW4gZXhlY3V0YWJsZSB0byB0ZXN0LiAgSWYgbm90LCB0aGVuIGVpdGhlciB3ZQorIyBoYXZlbid0IHRyaWVkIHRvIGNvbXBpbGUgb25lLCBvciB0aGUgY29tcGlsYXRpb24gZmFpbGVkIGZvciBzb21lIHJlYXNvbi4KKyMgSW4gZWl0aGVyIGNhc2UsIGp1c3Qgbm90aWZ5IHRoZSB1c2VyIGFuZCBza2lwIHRoZSB0ZXN0cyBpbiB0aGlzIGZpbGUuCisKK3NldCB0ZXN0ZmlsZSAibWlzYyIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmNjCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIGMrK31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworIworIyBEZWR1Y2UgbGFuZ3VhZ2Ugb2YgbWFpbigpCisjCisKK3Byb2MgZGVkdWNlX2xhbmd1YWdlX29mX21haW4ge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICAjIFNlZSB3aGF0IGxhbmd1YWdlIGdkYiB0aGlua3MgbWFpbigpIGlzLCBwcmlvciB0byByZWFkaW5nIGZ1bGwgc3ltYm9scy4KKyAgICAjIEkgdGhpbmsgdGhpcyBmYWlscyBmb3IgQ09GRiB0YXJnZXRzLgorICAgIHNldHVwX3hmYWlsICJhMjlrLSotdWRpIgorICAgIHNlbmRfZ2RiICJzaG93IGxhbmd1YWdlXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiBzb3VyY2UgbGFuZ3VhZ2UgaXMgXCJhdXRvOyBjdXJyZW50bHkgY1xbK1xdK1wiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgImRlZHVjZWQgbGFuZ3VhZ2UgaXMgQysrLCBiZWZvcmUgZnVsbCBzeW1ib2xzIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJzb3VyY2UgbGFuZ3VhZ2Ugbm90IGNvcnJlY3QgZm9yIEMrKyAocHN5bXRhYnMgb25seSkiCisJICAgIHJldHVybgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAiY2FuJ3Qgc2hvdyBsYW5ndWFnZSAodGltZW91dCkiCisJICAgIHJldHVybgorCX0KKyAgICB9CisKKyAgICBydW50b19tYWluCisKKyAgICAjIFNlZSBpZiBvdXIgaWRlYSBvZiB0aGUgbGFuZ3VhZ2UgaGFzIGNoYW5nZWQuCisKKyAgICBzZW5kX2dkYiAic2hvdyBsYW5ndWFnZVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogc291cmNlIGxhbmd1YWdlIGlzIFwiYXV0bzsgY3VycmVudGx5IGNcWytcXStcIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJkZWR1Y2VkIGxhbmd1YWdlIGlzIEMrKywgYWZ0ZXIgZnVsbCBzeW1ib2xzIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJzb3VyY2UgbGFuZ3VhZ2Ugbm90IGNvcnJlY3QgZm9yIEMrKyAoZnVsbCBzeW1ib2xzKSIKKwkgICAgcmV0dXJuCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJjYW4ndCBzaG93IGxhbmd1YWdlICh0aW1lb3V0KSIKKwkgICAgcmV0dXJuCisJfQorICAgIH0KK30KKworcHJvYyBkb190ZXN0cyB7fSB7CisgICAgZ2xvYmFsIHBybXNfaWQKKyAgICBnbG9iYWwgYnVnX2lkCisgICAgZ2xvYmFsIHN1YmRpcgorICAgIGdsb2JhbCBvYmpkaXIKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgZ2xvYmFsIGJpbmZpbGUKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgc2V0IHBybXNfaWQgMAorICAgIHNldCBidWdfaWQgMAorCisgICAgIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKyAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKyAgICBnZGJfbG9hZCAkYmluZmlsZQorCisgICAgZGVkdWNlX2xhbmd1YWdlX29mX21haW4KKyAgICAjIENoZWNrIGZvciBmaXhlcyBmb3IgUFJzIDg5MTYgYW5kIDg2MzAKKyAgICBnZGJfdGVzdCAicHJpbnQgcy5hIiAiLiogPSAwIiAicHJpbnQgcy5hIGZvciBmb28gc3RydWN0IChrbm93biBnY2MgMi43LjIgYW5kIGVhcmxpZXIgYnVnKSIKK30KKworZG9fdGVzdHMKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9vdmVybG9hZC5jYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9vdmVybG9hZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGZlYjNiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL292ZXJsb2FkLmNjCkBAIC0wLDAgKzEsMTUxIEBACisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK2NsYXNzIGZvbyB7CitwdWJsaWM6CisgIGZvbyAgKGludCk7CisgIGZvbyAgKGludCwgY29uc3QgY2hhciAqKTsKKyAgZm9vICAoZm9vJik7CisgIH5mb28gKCk7CisgIHZvaWQgZm9vZnVuYyAoaW50KTsKKyAgdm9pZCBmb29mdW5jIChpbnQsIHNpZ25lZCBjaGFyICopOworICBpbnQgaWZvbzsKKyAgY29uc3QgY2hhciAqY2NwZm9vOworCitpbnQgb3ZlcmxvYWQxYXJnICh2b2lkKTsKK2ludCBvdmVybG9hZDFhcmcgKGNoYXIpOyAgICAgICAgIAoraW50IG92ZXJsb2FkMWFyZyAoc2lnbmVkIGNoYXIpOworaW50IG92ZXJsb2FkMWFyZyAodW5zaWduZWQgY2hhcik7CitpbnQgb3ZlcmxvYWQxYXJnIChzaG9ydCk7CitpbnQgb3ZlcmxvYWQxYXJnICh1bnNpZ25lZCBzaG9ydCk7CitpbnQgb3ZlcmxvYWQxYXJnIChpbnQpOworaW50IG92ZXJsb2FkMWFyZyAodW5zaWduZWQgaW50KTsKK2ludCBvdmVybG9hZDFhcmcgKGxvbmcpOworaW50IG92ZXJsb2FkMWFyZyAodW5zaWduZWQgbG9uZyk7CitpbnQgb3ZlcmxvYWQxYXJnIChmbG9hdCk7CitpbnQgb3ZlcmxvYWQxYXJnIChkb3VibGUpOworCitpbnQgb3ZlcmxvYWRhcmdzIChpbnQgYTEpOworaW50IG92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIpOworaW50IG92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIsIGludCBhMyk7CitpbnQgb3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMiwgaW50IGEzLCBpbnQgYTQpOworaW50IG92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIsIGludCBhMywgaW50IGE0LCBpbnQgYTUpOworaW50IG92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIsIGludCBhMywgaW50IGE0LCBpbnQgYTUsIGludCBhNik7CitpbnQgb3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMiwgaW50IGEzLCBpbnQgYTQsIGludCBhNSwgaW50IGE2LCBpbnQgYTcpOworaW50IG92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIsIGludCBhMywgaW50IGE0LCBpbnQgYTUsIGludCBhNiwgaW50IGE3LCBpbnQgYTgpOworaW50IG92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIsIGludCBhMywgaW50IGE0LCBpbnQgYTUsIGludCBhNiwgaW50IGE3LCBpbnQgYTgsIGludCBhOSk7CitpbnQgb3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMiwgaW50IGEzLCBpbnQgYTQsIGludCBhNSwgaW50IGE2LCBpbnQgYTcsCisgICAgICAgICAgICAgICAgICAgaW50IGE4LCBpbnQgYTksIGludCBhMTApOworaW50IG92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIsIGludCBhMywgaW50IGE0LCBpbnQgYTUsIGludCBhNiwgaW50IGE3LAorICAgICAgICAgICAgICAgICAgIGludCBhOCwgaW50IGE5LCBpbnQgYTEwLCBpbnQgYTExKTsKKworCit9OworCit2b2lkIG1hcmtlcjEoKQore30KKworaW50IG1haW4gKCkgCit7CisgICAgY2hhciBhcmcyID0gMjsKKyAgICBzaWduZWQgY2hhciBhcmczID0zOworICAgIHVuc2lnbmVkIGNoYXIgYXJnNCA9NDsKKyAgICBzaG9ydCBhcmc1ID01OworICAgIHVuc2lnbmVkIHNob3J0IGFyZzYgPTY7CisgICAgaW50IGFyZzcgPTc7CisgICAgdW5zaWduZWQgaW50IGFyZzggPTg7CisgICAgbG9uZyBhcmc5ID05OworICAgIHVuc2lnbmVkIGxvbmcgYXJnMTAgPTEwOworICAgIGZsb2F0IGFyZzExID0xMDAuMDsKKyAgICBkb3VibGUgYXJnMTIgPSAyMDAuMDsKKworICAgIGNoYXIgKnN0ciA9ICJBIjsKKyAgICBmb28gZm9vX2luc3RhbmNlMSgxMTEpOworICAgIGZvbyBmb29faW5zdGFuY2UyKDIyMiwgc3RyKTsKKyAgICBmb28gZm9vX2luc3RhbmNlMyhmb29faW5zdGFuY2UyKTsKKworICAgICNpZmRlZiB1c2VzdHVicworICAgICAgIHNldF9kZWJ1Z190cmFwcygpOworICAgICAgIGJyZWFrcG9pbnQoKTsKKyAgICAjZW5kaWYKKworCisgICAgbWFya2VyMSgpOworICAgIHJldHVybiAwOyAKK30KKworZm9vOjpmb28gIChpbnQgaSkgICAgICAgICAgICAgICAgICB7IGlmb28gPSBpOyBjY3Bmb28gPSBOVUxMOyB9Citmb286OmZvbyAgKGludCBpLCBjb25zdCBjaGFyICpjY3ApIHsgaWZvbyA9IGk7IGNjcGZvbyA9IGNjcDsgfQorZm9vOjpmb28gIChmb28mIGFmb28pICAgICAgICAgICAgICB7IGlmb28gPSBhZm9vLmlmb287IGNjcGZvbyA9IGFmb28uY2NwZm9vO30KK2Zvbzo6fmZvbyAoKSAgICAgICAgICAgICAgICAgICAgICAge30KKworCisvKiBTb21lIGZ1bmN0aW9ucyB0byB0ZXN0IG92ZXJsb2FkaW5nIGJ5IHZhcnlpbmcgb25lIGFyZ3VtZW50IHR5cGUuICovCisKK2ludCBmb286Om92ZXJsb2FkMWFyZyAodm9pZCkgICAgICAgICAgICAgICAgeyAgcmV0dXJuIDE7IH0KK2ludCBmb286Om92ZXJsb2FkMWFyZyAoY2hhciBhcmcpICAgICAgICAgICAgeyBhcmcgPSAwOyByZXR1cm4gMjt9CitpbnQgZm9vOjpvdmVybG9hZDFhcmcgKHNpZ25lZCBjaGFyIGFyZykgICAgIHsgYXJnID0gMDsgcmV0dXJuIDM7fQoraW50IGZvbzo6b3ZlcmxvYWQxYXJnICh1bnNpZ25lZCBjaGFyIGFyZykgICB7IGFyZyA9IDA7IHJldHVybiA0O30KK2ludCBmb286Om92ZXJsb2FkMWFyZyAoc2hvcnQgYXJnKSAgICAgICAgICAgeyBhcmcgPSAwOyByZXR1cm4gNTt9CitpbnQgZm9vOjpvdmVybG9hZDFhcmcgKHVuc2lnbmVkIHNob3J0IGFyZykgIHsgYXJnID0gMDsgcmV0dXJuIDY7fQoraW50IGZvbzo6b3ZlcmxvYWQxYXJnIChpbnQgYXJnKSAgICAgICAgICAgICB7IGFyZyA9IDA7IHJldHVybiA3O30KK2ludCBmb286Om92ZXJsb2FkMWFyZyAodW5zaWduZWQgaW50IGFyZykgICAgeyBhcmcgPSAwOyByZXR1cm4gODt9CitpbnQgZm9vOjpvdmVybG9hZDFhcmcgKGxvbmcgYXJnKSAgICAgICAgICAgIHsgYXJnID0gMDsgcmV0dXJuIDk7fQoraW50IGZvbzo6b3ZlcmxvYWQxYXJnICh1bnNpZ25lZCBsb25nIGFyZykgICB7IGFyZyA9IDA7IHJldHVybiAxMDt9CitpbnQgZm9vOjpvdmVybG9hZDFhcmcgKGZsb2F0IGFyZykgICAgICAgICAgIHsgYXJnID0gMDsgcmV0dXJuIDExO30KK2ludCBmb286Om92ZXJsb2FkMWFyZyAoZG91YmxlIGFyZykgICAgICAgICAgeyBhcmcgPSAwOyByZXR1cm4gMTI7fQorCisKKy8qIFNvbWUgZnVuY3Rpb25zIHRvIHRlc3Qgb3ZlcmxvYWRpbmcgYnkgdmFyeWluZyBhcmd1bWVudCBjb3VudC4gKi8KKworaW50IGZvbzo6b3ZlcmxvYWRhcmdzIChpbnQgYTEpICAgICAgICAgICAgICAgICAKK3sgYTEgPSAwOyAKK3JldHVybiAxO30KKworaW50IGZvbzo6b3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMikgICAgICAgICAgCit7IGExID0gYTIgPSAwOyAKK3JldHVybiAyO30KKworaW50IGZvbzo6b3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMiwgaW50IGEzKSAgICAgICAgICAgICAgCit7IGExID0gYTIgPSBhMyA9IDA7IAorcmV0dXJuIDM7fQorCitpbnQgZm9vOjpvdmVybG9hZGFyZ3MgKGludCBhMSwgaW50IGEyLCBpbnQgYTMsIGludCBhNCkKK3sgYTEgPSBhMiA9IGEzID0gYTQgPSAwOyAKK3JldHVybiA0O30KKworaW50IGZvbzo6b3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMiwgaW50IGEzLCBpbnQgYTQsIGludCBhNSkKK3sgYTEgPSBhMiA9IGEzID0gYTQgPSBhNSA9IDA7IAorcmV0dXJuIDU7fQorCitpbnQgZm9vOjpvdmVybG9hZGFyZ3MgKGludCBhMSwgaW50IGEyLCBpbnQgYTMsIGludCBhNCwgaW50IGE1LCBpbnQgYTYpCit7IGExID0gYTIgPSBhMyA9IGE0ID0gYTUgPSBhNiA9IDA7IAorcmV0dXJuIDY7fQorCitpbnQgZm9vOjpvdmVybG9hZGFyZ3MgKGludCBhMSwgaW50IGEyLCBpbnQgYTMsIGludCBhNCwgaW50IGE1LCBpbnQgYTYsIGludCBhNykKK3sgYTEgPSBhMiA9IGEzID0gYTQgPSBhNSA9IGE2ID0gYTcgPSAwOyAKK3JldHVybiA3O30KKworaW50IGZvbzo6b3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMiwgaW50IGEzLCBpbnQgYTQsIGludCBhNSwgaW50IGE2LCBpbnQgYTcsCisgICAgICAgICAgICAgICAgICAgaW50IGE4KQoreyBhMSA9IGEyID0gYTMgPSBhNCA9IGE1ID0gYTYgPSBhNyA9IGE4ID0gMDsgCityZXR1cm4gODt9CisKK2ludCBmb286Om92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIsIGludCBhMywgaW50IGE0LCBpbnQgYTUsIGludCBhNiwgaW50IGE3LAorICAgICAgICAgICAgICAgICAgIGludCBhOCwgaW50IGE5KQoreyAKKyAgYTEgPSBhMiA9IGEzID0gYTQgPSBhNSA9IGE2ID0gYTcgPSBhOCA9IGE5ID0gMDsgCisgIHJldHVybiA5OworfQorCitpbnQgZm9vOjpvdmVybG9hZGFyZ3MgKGludCBhMSwgaW50IGEyLCBpbnQgYTMsIGludCBhNCwgaW50IGE1LCBpbnQgYTYsIGludCBhNywKKyAgICAgICAgICAgICAgICAgICBpbnQgYTgsIGludCBhOSwgaW50IGExMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgYTEgPSBhMiA9IGEzID0gYTQgPSBhNSA9IGE2ID0gYTcgPSBhOCA9IGE5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgYTEwID0gMDsgcmV0dXJuIDEwO30KKworaW50IGZvbzo6b3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMiwgaW50IGEzLCBpbnQgYTQsIGludCBhNSwgaW50IGE2LCBpbnQgYTcsCisgICAgICAgICAgICAgICAgICAgaW50IGE4LCBpbnQgYTksIGludCBhMTAsIGludCBhMTEpCisgICAgICAgICAgICAgICAgICAgICAgICB7IGExID0gYTIgPSBhMyA9IGE0ID0gYTUgPSBhNiA9IGE3ID0gYTggPSBhOSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGExMCA9IGExMSA9IDA7IHJldHVybiAxMTt9CisKKworCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jKysvb3ZlcmxvYWQuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL292ZXJsb2FkLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWRkYjE2MwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9vdmVybG9hZC5leHAKQEAgLTAsMCArMSwzMzggQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIHdyaXR0ZW4gYnkgRWxlbmEgWmFubm9uaSAoZXphbm5vbmlAY3lnbnVzLmNvbSkKKworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZ2RiIHRlc3RzdWl0ZQorIworIyB0ZXN0cyBmb3Igb3ZlcmxvYWRlZCBtZW1iZXIgZnVuY3Rpb25zLiBDb21tYW5kIExpbmUgY2FsbHMKKyMKKworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCisgICAgICAgIH0KKworIworIyB0ZXN0IHJ1bm5pbmcgcHJvZ3JhbXMKKyMKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgIm92ZXJsb2FkIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uY2MKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1ZyBjKyt9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKKyMgc2V0IGl0IHVwIGF0IGEgYnJlYWtwb2ludCBzbyB3ZSBjYW4gcGxheSB3aXRoIHRoZSB2YXJpYWJsZSB2YWx1ZXMKKyMKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgcGVycm9yICJjb3VsZG4ndCBydW4gdG8gYnJlYWtwb2ludCIKKyAgICBjb250aW51ZQorfQorCitzZW5kX2dkYiAiYnJlYWsgbWFya2VyMVxuIiA7IGdkYl9leHBlY3QgLXJlICIuKiRnZGJfcHJvbXB0ICQiCisKKyAgICBzZW5kX2dkYiAiY29udFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIkJyZWFrLiogbWFya2VyMSBcXChcXCkgYXQgLio6JGRlY2ltYWwuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIHNlbmRfZ2RiICJ1cFxuIgorICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9CisgICAgICAgICAgICAgICAgdGltZW91dCB7IGZhaWwgInVwIGZyb20gbWFya2VyMSIgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb250aW51ZSB0byBtYXJrZXIxIiAgfQorICAgICAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGNvbnRpbnVlIHRvIG1hcmtlcjEiICB9CisgICAgfQorCisKK3NlbmRfZ2RiICJwcmludCBmb29faW5zdGFuY2UxXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IFx7aWZvbyA9IDExMSwgY2NwZm9vID0gMHgwXH1cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBmb29faW5zdGFuY2UxIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGZvb19pbnN0YW5jZTEiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBmb29faW5zdGFuY2UxIiB9CisgIH0KKworCitzZW5kX2dkYiAicHR5cGUgZm9vX2luc3RhbmNlMVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAidHlwZSA9IGNsYXNzIGZvbyBcey4qcHVibGljOi4qaW50IGlmb287Lipjb25zdCBjaGFyIFxcKmNjcGZvbzsuKmZvb1xcKGludFxcKTsuKmZvb1xcKGludCwgKGNvbnN0IGNoYXJ8Y2hhciBjb25zdCkgXFwqXFwpOy4qZm9vXFwoZm9vICZcXCk7Lip+Zm9vXFwodm9pZFxcKTsuKnZvaWQgZm9vZnVuY1xcKGludFxcKTsuKnZvaWQgZm9vZnVuY1xcKGludCwgc2lnbmVkIGNoYXIgXFwqXFwpOy4qaW50IG92ZXJsb2FkMWFyZ1xcKHZvaWRcXCk7LippbnQgb3ZlcmxvYWQxYXJnXFwoY2hhclxcKTsuKmludCBvdmVybG9hZDFhcmdcXChzaWduZWQgY2hhclxcKTsuKmludCBvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBjaGFyXFwpOy4qaW50IG92ZXJsb2FkMWFyZ1xcKHNob3J0XFwpOy4qaW50IG92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIHNob3J0XFwpOy4qaW50IG92ZXJsb2FkMWFyZ1xcKGludFxcKTsuKmludCBvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBpbnRcXCk7LippbnQgb3ZlcmxvYWQxYXJnXFwobG9uZ1xcKTsuKmludCBvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBsb25nXFwpOy4qaW50IG92ZXJsb2FkMWFyZ1xcKGZsb2F0XFwpOy4qaW50IG92ZXJsb2FkMWFyZ1xcKGRvdWJsZVxcKTsuKmludCBvdmVybG9hZGFyZ3NcXChpbnRcXCk7LippbnQgb3ZlcmxvYWRhcmdzXFwoaW50LCBpbnRcXCk7LippbnQgb3ZlcmxvYWRhcmdzXFwoaW50LCBpbnQsIGludFxcKTsuKmludCBvdmVybG9hZGFyZ3NcXChpbnQsIGludCwgaW50LCBpbnRcXCk7LippbnQgb3ZlcmxvYWRhcmdzXFwoaW50LCBpbnQsIGludCwgaW50LCBpbnRcXCk7LippbnQgb3ZlcmxvYWRhcmdzXFwoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludFxcKTsuKmludCBvdmVybG9hZGFyZ3NcXChpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnRcXCk7LippbnQgb3ZlcmxvYWRhcmdzXFwoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnRcXCk7LippbnQgb3ZlcmxvYWRhcmdzXFwoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludFxcKTsuKmludCBvdmVybG9hZGFyZ3NcXChpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnRcXCk7LippbnQgb3ZlcmxvYWRhcmdzXFwoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnRcXCk7XHJcblx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHR5cGUgZm9vX2luc3RhbmNlMSAoSFAgYUNDIC0tIGtub3duIHF1aXJrIHdpdGggfmZvbyBwYXJhbWV0ZXIgbGlzdCkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHR5cGUgZm9vX2luc3RhbmNlMSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIGZvb19pbnN0YW5jZTEiIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgZm9vX2luc3RhbmNlMlxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSBce2lmb28gPSAyMjIsIGNjcGZvbyA9ICRoZXggXCJBXCJcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IGZvb19pbnN0YW5jZTIiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZm9vX2luc3RhbmNlMiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGZvb19pbnN0YW5jZTIiIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgZm9vX2luc3RhbmNlM1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSBce2lmb28gPSAyMjIsIGNjcGZvbyA9ICRoZXggXCJBXCJcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IGZvb19pbnN0YW5jZTMiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZm9vX2luc3RhbmNlMyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGZvb19pbnN0YW5jZTMiIH0KKyAgfQorCisKKworc2VuZF9nZGIgInByaW50IGZvb19pbnN0YW5jZTEub3ZlcmxvYWRhcmdzKDEpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDFcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyAxIGFyZyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyAxIGFyZyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGNhbGwgb3ZlcmxvYWRlZCBmdW5jIDEgYXJnIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IGZvb19pbnN0YW5jZTEub3ZlcmxvYWRhcmdzKDEsIDIpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDJcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyAyIGFyZ3MiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgMiBhcmdzIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgMiAgYXJncyIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IGZvb19pbnN0YW5jZTEub3ZlcmxvYWRhcmdzKDEsIDIsIDMpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDNcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyAzIGFyZ3MiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgMyBhcmdzIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgMyBhcmdzIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgZm9vX2luc3RhbmNlMS5vdmVybG9hZGFyZ3MoMSwgMiwgMywgNClcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gNFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IGNhbGwgb3ZlcmxvYWRlZCBmdW5jIDQgYXJncyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyA0IGFyZ3MiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyA0IGFyZ3MiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCBmb29faW5zdGFuY2UxLm92ZXJsb2FkYXJncygxLCAyLCAzLCA0LCA1KVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSA1XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgNSBhcmdzIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGNhbGwgb3ZlcmxvYWRlZCBmdW5jIDUgYXJncyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGNhbGwgb3ZlcmxvYWRlZCBmdW5jIDUgYXJncyIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IGZvb19pbnN0YW5jZTEub3ZlcmxvYWRhcmdzKDEsIDIsIDMsIDQsIDUsIDYpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDZcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyA2IGFyZ3MiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgNiBhcmdzIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgNiBhcmdzIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgZm9vX2luc3RhbmNlMS5vdmVybG9hZGFyZ3MoMSwgMiwgMywgNCwgNSwgNiwgNylcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gN1xyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IGNhbGwgb3ZlcmxvYWRlZCBmdW5jIDcgYXJncyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyA3IGFyZ3MiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyA3IGFyZ3MiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCBmb29faW5zdGFuY2UxLm92ZXJsb2FkYXJncygxLCAyLCAzLCA0LCA1LCA2LCA3LCA4KVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSA4XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgOCBhcmdzIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGNhbGwgb3ZlcmxvYWRlZCBmdW5jIDggYXJncyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGNhbGwgb3ZlcmxvYWRlZCBmdW5jIDggYXJncyIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IGZvb19pbnN0YW5jZTEub3ZlcmxvYWRhcmdzKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDlcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyA5IGFyZ3MiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgOSBhcmdzIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgOSBhcmdzIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgZm9vX2luc3RhbmNlMS5vdmVybG9hZGFyZ3MoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTApXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDEwXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgMTAgYXJncyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyAxMCBhcmdzIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgMTAgYXJncyIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IGZvb19pbnN0YW5jZTEub3ZlcmxvYWRhcmdzKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMTFcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyAxMSBhcmdzIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGNhbGwgb3ZlcmxvYWRlZCBmdW5jIDExIGFyZ3MiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyAxMSBhcmdzIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgZm9vX2luc3RhbmNlMS5vdmVybG9hZDFhcmcoKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAxXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgdm9pZCBhcmciCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgdm9pZCBhcmciIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyB2b2lkIGFyZyIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBmb29faW5zdGFuY2UxLm92ZXJsb2FkMWFyZygoY2hhcilhcmcyKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAyXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgY2hhciBhcmciCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgY2hhciBhcmciIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyBjaGFyIGFyZyIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBmb29faW5zdGFuY2UxLm92ZXJsb2FkMWFyZygoc2lnbmVkIGNoYXIpYXJnMylcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gM1xyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IGNhbGwgb3ZlcmxvYWRlZCBmdW5jIHNpZ25lZCBjaGFyIGFyZyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyBzaWduZWQgY2hhciBhcmciIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyBzaWduZWQgY2hhciBhcmciIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCBmb29faW5zdGFuY2UxLm92ZXJsb2FkMWFyZygodW5zaWduZWQgY2hhcilhcmc0KVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSA0XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgdW5zaWduZWQgY2hhciBhcmciCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgdW5zaWduZWQgY2hhciBhcmciIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyB1bnNpZ25lZCBjaGFyIGFyZyIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IGZvb19pbnN0YW5jZTEub3ZlcmxvYWQxYXJnKChzaG9ydClhcmc1KVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSA1XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgc2hvcnQgYXJnIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGNhbGwgb3ZlcmxvYWRlZCBmdW5jIHNob3J0IGFyZyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGNhbGwgb3ZlcmxvYWRlZCBmdW5jIHNob3J0IGFyZyIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IGZvb19pbnN0YW5jZTEub3ZlcmxvYWQxYXJnKCh1bnNpZ25lZCBzaG9ydClhcmc2KVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSA2XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgdW5zaWduZWQgc2hvcnQgYXJnIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGNhbGwgb3ZlcmxvYWRlZCBmdW5jIHVuc2lnbmVkIHNob3J0ICBhcmciIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyB1bnNpZ25lZCBzaG9ydCBhcmciIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCBmb29faW5zdGFuY2UxLm92ZXJsb2FkMWFyZygoaW50KWFyZzcpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDdcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyBpbnQgYXJnIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGNhbGwgb3ZlcmxvYWRlZCBmdW5jIGludCBhcmciIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyBpbnQgYXJnIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgZm9vX2luc3RhbmNlMS5vdmVybG9hZDFhcmcoKHVuc2lnbmVkIGludClhcmc4KVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSA4XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgdW5zaWduZWQgaW50IGFyZyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyB1bnNpZ25lZCBpbnQgYXJnIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgdW5zaWduZWQgaW50IGFyZyIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IGZvb19pbnN0YW5jZTEub3ZlcmxvYWQxYXJnKChsb25nKWFyZzkpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDlcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyBsb25nIGFyZyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyBsb25nIGFyZyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGNhbGwgb3ZlcmxvYWRlZCBmdW5jIGxvbmcgYXJnIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgZm9vX2luc3RhbmNlMS5vdmVybG9hZDFhcmcoKHVuc2lnbmVkIGxvbmcpYXJnMTApXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDEwXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgdW5zaWduZWQgbG9uZyBhcmciCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgdW5zaWduZWQgbG9uZyBhcmciIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyB1bnNpZ25lZCBsb25nIGFyZyIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IGZvb19pbnN0YW5jZTEub3ZlcmxvYWQxYXJnKChmbG9hdClhcmcxMSlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMTFcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyBmbG9hdCBhcmciCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgZmxvYXQgYXJnIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgY2FsbCBvdmVybG9hZGVkIGZ1bmMgZmxvYXQgYXJnIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgZm9vX2luc3RhbmNlMS5vdmVybG9hZDFhcmcoKGRvdWJsZSlhcmcxMilcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMTJcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyBkb3VibGUgYXJnIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGNhbGwgb3ZlcmxvYWRlZCBmdW5jIGRvdWJsZSBhcmciIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBjYWxsIG92ZXJsb2FkZWQgZnVuYyBkb3VibGUgYXJnIiB9CisgIH0KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9vdmxkYnJlYWsuY2MgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvb3ZsZGJyZWFrLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNWI1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvb3ZsZGJyZWFrLmNjCkBAIC0wLDAgKzEsMTc3IEBACisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK2NsYXNzIGZvbyB7CitwdWJsaWM6CisgIGZvbyAgKGludCk7CisgIGZvbyAgKGludCwgY29uc3QgY2hhciAqKTsKKyAgZm9vICAoZm9vJik7CisgIH5mb28gKCk7CisgIHZvaWQgZm9vZnVuYyAoaW50KTsKKyAgdm9pZCBmb29mdW5jIChpbnQsIHNpZ25lZCBjaGFyICopOworICBpbnQgaWZvbzsKKyAgY29uc3QgY2hhciAqY2NwZm9vOworCitpbnQgb3ZlcmxvYWQxYXJnICh2b2lkKTsKK2ludCBvdmVybG9hZDFhcmcgKGNoYXIpOyAgICAgICAgIAoraW50IG92ZXJsb2FkMWFyZyAoc2lnbmVkIGNoYXIpOworaW50IG92ZXJsb2FkMWFyZyAodW5zaWduZWQgY2hhcik7CitpbnQgb3ZlcmxvYWQxYXJnIChzaG9ydCk7CitpbnQgb3ZlcmxvYWQxYXJnICh1bnNpZ25lZCBzaG9ydCk7CitpbnQgb3ZlcmxvYWQxYXJnIChpbnQpOworaW50IG92ZXJsb2FkMWFyZyAodW5zaWduZWQgaW50KTsKK2ludCBvdmVybG9hZDFhcmcgKGxvbmcpOworaW50IG92ZXJsb2FkMWFyZyAodW5zaWduZWQgbG9uZyk7CitpbnQgb3ZlcmxvYWQxYXJnIChmbG9hdCk7CitpbnQgb3ZlcmxvYWQxYXJnIChkb3VibGUpOworCitpbnQgb3ZlcmxvYWRhcmdzIChpbnQgYTEpOworaW50IG92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIpOworaW50IG92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIsIGludCBhMyk7CitpbnQgb3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMiwgaW50IGEzLCBpbnQgYTQpOworaW50IG92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIsIGludCBhMywgaW50IGE0LCBpbnQgYTUpOworaW50IG92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIsIGludCBhMywgaW50IGE0LCBpbnQgYTUsIGludCBhNik7CitpbnQgb3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMiwgaW50IGEzLCBpbnQgYTQsIGludCBhNSwgaW50IGE2LCBpbnQgYTcpOworaW50IG92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIsIGludCBhMywgaW50IGE0LCBpbnQgYTUsIGludCBhNiwgaW50IGE3LCBpbnQgYTgpOworaW50IG92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIsIGludCBhMywgaW50IGE0LCBpbnQgYTUsIGludCBhNiwgaW50IGE3LCBpbnQgYTgsIGludCBhOSk7CitpbnQgb3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMiwgaW50IGEzLCBpbnQgYTQsIGludCBhNSwgaW50IGE2LCBpbnQgYTcsCisgICAgICAgICAgICAgICAgICAgaW50IGE4LCBpbnQgYTksIGludCBhMTApOworaW50IG92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIsIGludCBhMywgaW50IGE0LCBpbnQgYTUsIGludCBhNiwgaW50IGE3LAorICAgICAgICAgICAgICAgICAgIGludCBhOCwgaW50IGE5LCBpbnQgYTEwLCBpbnQgYTExKTsKKworCit9OworCit2b2lkIG1hcmtlcjEoKQore30KKworaW50IG1haW4gKCkgCit7CisgICAgY2hhciBhcmcyID0gMjsKKyAgICBzaWduZWQgY2hhciBhcmczID0zOworICAgIHVuc2lnbmVkIGNoYXIgYXJnNCA9NDsKKyAgICBzaG9ydCBhcmc1ID01OworICAgIHVuc2lnbmVkIHNob3J0IGFyZzYgPTY7CisgICAgaW50IGFyZzcgPTc7CisgICAgdW5zaWduZWQgaW50IGFyZzggPTg7CisgICAgbG9uZyBhcmc5ID05OworICAgIHVuc2lnbmVkIGxvbmcgYXJnMTAgPTEwOworICAgIGZsb2F0IGFyZzExID0xMDAuMDsKKyAgICBkb3VibGUgYXJnMTIgPSAyMDAuMDsKKworICAgIGNoYXIgY2g9J0EnOworICAgIGZvbyBmb29faW5zdGFuY2UxKDExMSk7CisgICAgZm9vIGZvb19pbnN0YW5jZTIoMjIyLCAmY2gpOworICAgIGZvbyBmb29faW5zdGFuY2UzKGZvb19pbnN0YW5jZTIpOworCisgICAgZm9vX2luc3RhbmNlMS5vdmVybG9hZDFhcmcoKTsKKyAgICBmb29faW5zdGFuY2UxLm92ZXJsb2FkMWFyZyhhcmcyKTsKKyAgICBmb29faW5zdGFuY2UxLm92ZXJsb2FkMWFyZyhhcmczKTsKKyAgICBmb29faW5zdGFuY2UxLm92ZXJsb2FkMWFyZyhhcmc0KTsKKyAgICBmb29faW5zdGFuY2UxLm92ZXJsb2FkMWFyZyhhcmc1KTsKKyAgICBmb29faW5zdGFuY2UxLm92ZXJsb2FkMWFyZyhhcmc2KTsKKyAgICBmb29faW5zdGFuY2UxLm92ZXJsb2FkMWFyZyhhcmc3KTsKKyAgICBmb29faW5zdGFuY2UxLm92ZXJsb2FkMWFyZyhhcmc4KTsKKyAgICBmb29faW5zdGFuY2UxLm92ZXJsb2FkMWFyZyhhcmc5KTsKKyAgICBmb29faW5zdGFuY2UxLm92ZXJsb2FkMWFyZyhhcmcxMCk7CisgICAgZm9vX2luc3RhbmNlMS5vdmVybG9hZDFhcmcoYXJnMTEpOworICAgIGZvb19pbnN0YW5jZTEub3ZlcmxvYWQxYXJnKGFyZzEyKTsKKworICAgIGZvb19pbnN0YW5jZTEub3ZlcmxvYWRhcmdzKDEpOworICAgIGZvb19pbnN0YW5jZTEub3ZlcmxvYWRhcmdzKDEsIDIpOworICAgIGZvb19pbnN0YW5jZTEub3ZlcmxvYWRhcmdzKDEsIDIsIDMpOworICAgIGZvb19pbnN0YW5jZTEub3ZlcmxvYWRhcmdzKDEsIDIsIDMsIDQpOworICAgIGZvb19pbnN0YW5jZTEub3ZlcmxvYWRhcmdzKDEsIDIsIDMsIDQsIDUpOworICAgIGZvb19pbnN0YW5jZTEub3ZlcmxvYWRhcmdzKDEsIDIsIDMsIDQsIDUsIDYpOworICAgIGZvb19pbnN0YW5jZTEub3ZlcmxvYWRhcmdzKDEsIDIsIDMsIDQsIDUsIDYsIDcpOworICAgIGZvb19pbnN0YW5jZTEub3ZlcmxvYWRhcmdzKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgpOworICAgIGZvb19pbnN0YW5jZTEub3ZlcmxvYWRhcmdzKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpOworICAgIGZvb19pbnN0YW5jZTEub3ZlcmxvYWRhcmdzKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwKTsKKyAgICBmb29faW5zdGFuY2UxLm92ZXJsb2FkYXJncygxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEpOworICAgCisKKyAgICAjaWZkZWYgdXNlc3R1YnMKKyAgICAgICBzZXRfZGVidWdfdHJhcHMoKTsKKyAgICAgICBicmVha3BvaW50KCk7CisgICAgI2VuZGlmCisKKworICAgIG1hcmtlcjEoKTsKKyAgICByZXR1cm4gMDsgCit9CisKK2Zvbzo6Zm9vICAoaW50IGkpICAgICAgICAgICAgICAgICAgeyBpZm9vID0gaTt9Citmb286OmZvbyAgKGludCBpLCBjb25zdCBjaGFyICpjY3ApIHsgaWZvbyA9IGk7IGNjcGZvbyA9IGNjcDsgfQorZm9vOjpmb28gIChmb28mIGFmb28pICAgICAgICAgICAgICB7IGlmb28gPSBhZm9vLmlmb287IGNjcGZvbyA9IGFmb28uY2NwZm9vO30KK2Zvbzo6fmZvbyAoKSAgICAgICAgICAgICAgICAgICAgICAge30KKworCisvKiBTb21lIGZ1bmN0aW9ucyB0byB0ZXN0IG92ZXJsb2FkaW5nIGJ5IHZhcnlpbmcgb25lIGFyZ3VtZW50IHR5cGUuICovCisKK2ludCBmb286Om92ZXJsb2FkMWFyZyAodm9pZCkgICAgICAgICAgICAgICAgeyAgcmV0dXJuIDE7IH0KK2ludCBmb286Om92ZXJsb2FkMWFyZyAoY2hhciBhcmcpICAgICAgICAgICAgeyBhcmcgPSAwOyByZXR1cm4gMjt9CitpbnQgZm9vOjpvdmVybG9hZDFhcmcgKHNpZ25lZCBjaGFyIGFyZykgICAgIHsgYXJnID0gMDsgcmV0dXJuIDM7fQoraW50IGZvbzo6b3ZlcmxvYWQxYXJnICh1bnNpZ25lZCBjaGFyIGFyZykgICB7IGFyZyA9IDA7IHJldHVybiA0O30KK2ludCBmb286Om92ZXJsb2FkMWFyZyAoc2hvcnQgYXJnKSAgICAgICAgICAgeyBhcmcgPSAwOyByZXR1cm4gNTt9CitpbnQgZm9vOjpvdmVybG9hZDFhcmcgKHVuc2lnbmVkIHNob3J0IGFyZykgIHsgYXJnID0gMDsgcmV0dXJuIDY7fQoraW50IGZvbzo6b3ZlcmxvYWQxYXJnIChpbnQgYXJnKSAgICAgICAgICAgICB7IGFyZyA9IDA7IHJldHVybiA3O30KK2ludCBmb286Om92ZXJsb2FkMWFyZyAodW5zaWduZWQgaW50IGFyZykgICAgeyBhcmcgPSAwOyByZXR1cm4gODt9CitpbnQgZm9vOjpvdmVybG9hZDFhcmcgKGxvbmcgYXJnKSAgICAgICAgICAgIHsgYXJnID0gMDsgcmV0dXJuIDk7fQoraW50IGZvbzo6b3ZlcmxvYWQxYXJnICh1bnNpZ25lZCBsb25nIGFyZykgICB7IGFyZyA9IDA7IHJldHVybiAxMDt9CitpbnQgZm9vOjpvdmVybG9hZDFhcmcgKGZsb2F0IGFyZykgICAgICAgICAgIHsgYXJnID0gMDsgcmV0dXJuIDExO30KK2ludCBmb286Om92ZXJsb2FkMWFyZyAoZG91YmxlIGFyZykgICAgICAgICAgeyBhcmcgPSAwOyByZXR1cm4gMTI7fQorCisKKy8qIFNvbWUgZnVuY3Rpb25zIHRvIHRlc3Qgb3ZlcmxvYWRpbmcgYnkgdmFyeWluZyBhcmd1bWVudCBjb3VudC4gKi8KKworaW50IGZvbzo6b3ZlcmxvYWRhcmdzIChpbnQgYTEpICAgICAgICAgICAgICAgICAKK3sgYTEgPSAwOyAKK3JldHVybiAxO30KKworaW50IGZvbzo6b3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMikgICAgICAgICAgCit7IGExID0gYTIgPSAwOyAKK3JldHVybiAyO30KKworaW50IGZvbzo6b3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMiwgaW50IGEzKSAgICAgICAgICAgICAgCit7IGExID0gYTIgPSBhMyA9IDA7IAorcmV0dXJuIDM7fQorCitpbnQgZm9vOjpvdmVybG9hZGFyZ3MgKGludCBhMSwgaW50IGEyLCBpbnQgYTMsIGludCBhNCkKK3sgYTEgPSBhMiA9IGEzID0gYTQgPSAwOyAKK3JldHVybiA0O30KKworaW50IGZvbzo6b3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMiwgaW50IGEzLCBpbnQgYTQsIGludCBhNSkKK3sgYTEgPSBhMiA9IGEzID0gYTQgPSBhNSA9IDA7IAorcmV0dXJuIDU7fQorCitpbnQgZm9vOjpvdmVybG9hZGFyZ3MgKGludCBhMSwgaW50IGEyLCBpbnQgYTMsIGludCBhNCwgaW50IGE1LCBpbnQgYTYpCit7IGExID0gYTIgPSBhMyA9IGE0ID0gYTUgPSBhNiA9IDA7IAorcmV0dXJuIDY7fQorCitpbnQgZm9vOjpvdmVybG9hZGFyZ3MgKGludCBhMSwgaW50IGEyLCBpbnQgYTMsIGludCBhNCwgaW50IGE1LCBpbnQgYTYsIGludCBhNykKK3sgYTEgPSBhMiA9IGEzID0gYTQgPSBhNSA9IGE2ID0gYTcgPSAwOyAKK3JldHVybiA3O30KKworaW50IGZvbzo6b3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMiwgaW50IGEzLCBpbnQgYTQsIGludCBhNSwgaW50IGE2LCBpbnQgYTcsCisgICAgICAgICAgICAgICAgICAgaW50IGE4KQoreyBhMSA9IGEyID0gYTMgPSBhNCA9IGE1ID0gYTYgPSBhNyA9IGE4ID0gMDsgCityZXR1cm4gODt9CisKK2ludCBmb286Om92ZXJsb2FkYXJncyAoaW50IGExLCBpbnQgYTIsIGludCBhMywgaW50IGE0LCBpbnQgYTUsIGludCBhNiwgaW50IGE3LAorICAgICAgICAgICAgICAgICAgIGludCBhOCwgaW50IGE5KQoreyAKKyAgYTEgPSBhMiA9IGEzID0gYTQgPSBhNSA9IGE2ID0gYTcgPSBhOCA9IGE5ID0gMDsgCisgIHJldHVybiA5OworfQorCitpbnQgZm9vOjpvdmVybG9hZGFyZ3MgKGludCBhMSwgaW50IGEyLCBpbnQgYTMsIGludCBhNCwgaW50IGE1LCBpbnQgYTYsIGludCBhNywKKyAgICAgICAgICAgICAgICAgICBpbnQgYTgsIGludCBhOSwgaW50IGExMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgYTEgPSBhMiA9IGEzID0gYTQgPSBhNSA9IGE2ID0gYTcgPSBhOCA9IGE5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgYTEwID0gMDsgcmV0dXJuIDEwO30KKworaW50IGZvbzo6b3ZlcmxvYWRhcmdzIChpbnQgYTEsIGludCBhMiwgaW50IGEzLCBpbnQgYTQsIGludCBhNSwgaW50IGE2LCBpbnQgYTcsCisgICAgICAgICAgICAgICAgICAgaW50IGE4LCBpbnQgYTksIGludCBhMTAsIGludCBhMTEpCisgICAgICAgICAgICAgICAgICAgICAgICB7IGExID0gYTIgPSBhMyA9IGE0ID0gYTUgPSBhNiA9IGE3ID0gYTggPSBhOSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGExMCA9IGExMSA9IDA7IHJldHVybiAxMTt9CisKKworCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jKysvb3ZsZGJyZWFrLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9vdmxkYnJlYWsuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MGI1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvb3ZsZGJyZWFrLmV4cApAQCAtMCwwICsxLDY4MCBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgd3JpdHRlbiBieSBFbGVuYSBaYW5ub25pIChlemFubm9uaUBjeWdudXMuY29tKQorCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBnZGIgdGVzdHN1aXRlCisjCisjIHRlc3RzIGZvciBvdmVybG9hZGVkIG1lbWJlciBmdW5jdGlvbnMuIFNldCBicmVha3BvaW50cyBvbgorIyBvdmVybG9hZGVkIG1lbWJlciBmdW5jdGlvbnMKKyMKKworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCisgICAgICAgIH0KKworIworIyB0ZXN0IHJ1bm5pbmcgcHJvZ3JhbXMKKyMKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgIm92bGRicmVhayIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmNjCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYysrfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworIyBzZXQgaXQgdXAgYXQgYSBicmVha3BvaW50IHNvIHdlIGNhbiBwbGF5IHdpdGggdGhlIHZhcmlhYmxlIHZhbHVlcworIworaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgICBwZXJyb3IgImNvdWxkbid0IHJ1biB0byBicmVha3BvaW50IgorICAgIGNvbnRpbnVlCit9CisKKworCitzZW5kX2dkYiAiYnJlYWsgZm9vOjpvdmVybG9hZDFhcmdcbiIgCitnZGJfZXhwZWN0IHsKKy1yZSAiXFxcWzBcXFxdIGNhbmNlbFxyXG5cXFxbMVxcXF0gYWxsXHJcblxcXFsyXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGRvdWJsZVxcKSBhdC4qJHNyY2ZpbGU6MTIxXHJcblxcXFszXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGZsb2F0XFwpIGF0Liokc3JjZmlsZToxMjBcclxuXFxcWzRcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgbG9uZ1xcKSBhdC4qJHNyY2ZpbGU6MTE5XHJcblxcXFs1XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGxvbmdcXCkgYXQuKiRzcmNmaWxlOjExOFxyXG5cXFxbNlxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBpbnRcXCkgYXQuKiRzcmNmaWxlOjExN1xyXG5cXFxbN1xcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChpbnRcXCkgYXQuKiRzcmNmaWxlOjExNlxyXG5cXFxbOFxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBzaG9ydFxcKSBhdC4qJHNyY2ZpbGU6MTE1XHJcblxcXFs5XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTRcclxuXFxcWzEwXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExM1xyXG5cXFxbMTFcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoc2lnbmVkIGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMlxyXG5cXFxbMTJcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTExXHJcblxcXFsxM1xcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh2b2lkXFwpIGF0Liokc3JjZmlsZToxMTBcclxuPiAkIiB7CisgICAgICAgICAgICBzZW5kX2dkYiAiMTJcbiIKKyAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgLXJlICJCcmVha3BvaW50IDIgYXQgJGhleDogZmlsZS4qJHNyY2ZpbGUsIGxpbmUgMTExLlxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgInNldCBicCBvbiBvdmVybG9hZDFhcmcoY2hhcikiIH0KKyAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgInNldCBicCBvbiBvdmVybG9hZDFhcmcoY2hhcikgd3JvbmcgYnAgcmVwbHkiIH0KKyAgICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZmFpbCAiKHRpbWVvdXQpc2V0IGJwIG9uIG92ZXJsb2FkMWFyZyhjaGFyKSB3cm9uZyBicCByZXBseSIgfQorICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKGNoYXIpKHdyb25nIG1lbnUpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dClzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKGNoYXIpKHdyb25nIG1lbnUpIiB9CisgIH0KKworCitnZGJfdGVzdCAiaW5mbyBicmVhayIgXAorICAgICJOdW0gVHlwZVxbXHQgXF0rRGlzcCBFbmIgQWRkcmVzc1xbXHQgXF0rV2hhdC4qCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIG1haW4gYXQuKiRzcmNmaWxlOjQ5XHIKK1xbXHQgXF0rYnJlYWtwb2ludCBhbHJlYWR5IGhpdCAxIHRpbWVccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMSIgXAorICAgICJicmVha3BvaW50IGluZm8iCisKKworc2VuZF9nZGIgImJyZWFrIGZvbzo6b3ZlcmxvYWQxYXJnXG4iIAorZ2RiX2V4cGVjdCB7CistcmUgIlxcXFswXFxcXSBjYW5jZWxcclxuXFxcWzFcXFxdIGFsbFxyXG5cXFxbMlxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChkb3VibGVcXCkgYXQuKiRzcmNmaWxlOjEyMVxyXG5cXFxbM1xcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChmbG9hdFxcKSBhdC4qJHNyY2ZpbGU6MTIwXHJcblxcXFs0XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIGxvbmdcXCkgYXQuKiRzcmNmaWxlOjExOVxyXG5cXFxbNVxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChsb25nXFwpIGF0Liokc3JjZmlsZToxMThcclxuXFxcWzZcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgaW50XFwpIGF0Liokc3JjZmlsZToxMTdcclxuXFxcWzdcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoaW50XFwpIGF0Liokc3JjZmlsZToxMTZcclxuXFxcWzhcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgc2hvcnRcXCkgYXQuKiRzcmNmaWxlOjExNVxyXG5cXFxbOVxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChzaG9ydFxcKSBhdC4qJHNyY2ZpbGU6MTE0XHJcblxcXFsxMFxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBjaGFyXFwpIGF0Liokc3JjZmlsZToxMTNcclxuXFxcWzExXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHNpZ25lZCBjaGFyXFwpIGF0Liokc3JjZmlsZToxMTJcclxuXFxcWzEyXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMVxyXG5cXFxbMTNcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodm9pZFxcKSBhdC4qJHNyY2ZpbGU6MTEwXHJcbj4gJCIgeworICAgICAgICAgICAgc2VuZF9nZGIgIjExXG4iCisgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgIC1yZSAiQnJlYWtwb2ludCAzIGF0ICRoZXg6IGZpbGUuKiRzcmNmaWxlLCBsaW5lIDExMi5cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICAgICBwYXNzICJzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKHNpZ25lZCBjaGFyKSIgfQorICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZmFpbCAic2V0IGJwIG9uIG92ZXJsb2FkMWFyZyhzaWduZWQgY2hhcikgd3JvbmcgYnAgcmVwbHkiIH0KKyAgICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZmFpbCAiKHRpbWVvdXQpc2V0IGJwIG9uIG92ZXJsb2FkMWFyZyhzaWduZWQgY2hhcikgd3JvbmcgYnAgcmVwbHkiIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic2V0IGJwIG9uIG92ZXJsb2FkMWFyZyhzaWduZWQgY2hhcikod3JvbmcgbWVudSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KXNldCBicCBvbiBvdmVybG9hZDFhcmcoc2lnbmVkIGNoYXIpKHdyb25nIG1lbnUpIiB9CisgIH0KKworCitnZGJfdGVzdCAiaW5mbyBicmVhayIgXAorICAgICJOdW0gVHlwZVxbXHQgXF0rRGlzcCBFbmIgQWRkcmVzc1xbXHQgXF0rV2hhdC4qCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIG1haW4gYXQuKiRzcmNmaWxlOjQ5XHIKK1xbXHQgXF0rYnJlYWtwb2ludCBhbHJlYWR5IGhpdCAxIHRpbWVccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMVxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwoc2lnbmVkIGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMiIgXAorICAgICJicmVha3BvaW50IGluZm8iCisKKworCisKKworc2VuZF9nZGIgImJyZWFrIGZvbzo6b3ZlcmxvYWQxYXJnXG4iIAorZ2RiX2V4cGVjdCB7CistcmUgIlxcXFswXFxcXSBjYW5jZWxcclxuXFxcWzFcXFxdIGFsbFxyXG5cXFxbMlxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChkb3VibGVcXCkgYXQuKiRzcmNmaWxlOjEyMVxyXG5cXFxbM1xcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChmbG9hdFxcKSBhdC4qJHNyY2ZpbGU6MTIwXHJcblxcXFs0XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIGxvbmdcXCkgYXQuKiRzcmNmaWxlOjExOVxyXG5cXFxbNVxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChsb25nXFwpIGF0Liokc3JjZmlsZToxMThcclxuXFxcWzZcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgaW50XFwpIGF0Liokc3JjZmlsZToxMTdcclxuXFxcWzdcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoaW50XFwpIGF0Liokc3JjZmlsZToxMTZcclxuXFxcWzhcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgc2hvcnRcXCkgYXQuKiRzcmNmaWxlOjExNVxyXG5cXFxbOVxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChzaG9ydFxcKSBhdC4qJHNyY2ZpbGU6MTE0XHJcblxcXFsxMFxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBjaGFyXFwpIGF0Liokc3JjZmlsZToxMTNcclxuXFxcWzExXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHNpZ25lZCBjaGFyXFwpIGF0Liokc3JjZmlsZToxMTJcclxuXFxcWzEyXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMVxyXG5cXFxbMTNcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodm9pZFxcKSBhdC4qJHNyY2ZpbGU6MTEwXHJcbj4gJCIgeworICAgICAgICAgICAgc2VuZF9nZGIgIjEwXG4iCisgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgIC1yZSAiQnJlYWtwb2ludCA0IGF0ICRoZXg6IGZpbGUuKiRzcmNmaWxlLCBsaW5lIDExMy5cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICAgICBwYXNzICJzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKHVuc2lnbmVkIGNoYXIpIiB9CisgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICAgICBmYWlsICJzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKHVuc2lnbmVkIGNoYXIpIHdyb25nIGJwIHJlcGx5IiB9CisgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgIih0aW1lb3V0KXNldCBicCBvbiBvdmVybG9hZDFhcmcodW5zaWduZWQgY2hhcikgd3JvbmcgYnAgcmVwbHkiIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic2V0IGJwIG9uIG92ZXJsb2FkMWFyZyh1bnNpZ25lZCBjaGFyKSh3cm9uZyBtZW51KSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpc2V0IGJwIG9uIG92ZXJsb2FkMWFyZyh1bnNpZ25lZCBjaGFyKSh3cm9uZyBtZW51KSIgfQorICB9CisKKworCitnZGJfdGVzdCAiaW5mbyBicmVhayIgXAorICAgICJOdW0gVHlwZVxbXHQgXF0rRGlzcCBFbmIgQWRkcmVzc1xbXHQgXF0rV2hhdC4qCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIG1haW4gYXQuKiRzcmNmaWxlOjQ5XHIKK1xbXHQgXF0rYnJlYWtwb2ludCBhbHJlYWR5IGhpdCAxIHRpbWVccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMVxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwoc2lnbmVkIGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMlxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEzIiBcCisgICAgImJyZWFrcG9pbnQgaW5mbyIKKworCisKK3NlbmRfZ2RiICJicmVhayBmb286Om92ZXJsb2FkMWFyZ1xuIiAKK2dkYl9leHBlY3QgeworLXJlICJcXFxbMFxcXF0gY2FuY2VsXHJcblxcXFsxXFxcXSBhbGxcclxuXFxcWzJcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoZG91YmxlXFwpIGF0Liokc3JjZmlsZToxMjFcclxuXFxcWzNcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoZmxvYXRcXCkgYXQuKiRzcmNmaWxlOjEyMFxyXG5cXFxbNFxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBsb25nXFwpIGF0Liokc3JjZmlsZToxMTlcclxuXFxcWzVcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwobG9uZ1xcKSBhdC4qJHNyY2ZpbGU6MTE4XHJcblxcXFs2XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIGludFxcKSBhdC4qJHNyY2ZpbGU6MTE3XHJcblxcXFs3XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGludFxcKSBhdC4qJHNyY2ZpbGU6MTE2XHJcblxcXFs4XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTVcclxuXFxcWzlcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoc2hvcnRcXCkgYXQuKiRzcmNmaWxlOjExNFxyXG5cXFxbMTBcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEzXHJcblxcXFsxMVxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChzaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEyXHJcblxcXFsxMlxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChjaGFyXFwpIGF0Liokc3JjZmlsZToxMTFcclxuXFxcWzEzXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHZvaWRcXCkgYXQuKiRzcmNmaWxlOjExMFxyXG4+ICQiIHsKKyAgICAgICAgICAgIHNlbmRfZ2RiICI5XG4iCisgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgIC1yZSAiQnJlYWtwb2ludCA1IGF0ICRoZXg6IGZpbGUuKiRzcmNmaWxlLCBsaW5lIDExNC5cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICAgICBwYXNzICJzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKHNob3J0KSIgfQorICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZmFpbCAic2V0IGJwIG9uIG92ZXJsb2FkMWFyZyhzaG9ydCkgd3JvbmcgYnAgcmVwbHkiIH0KKyAgICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZmFpbCAiKHRpbWVvdXQpc2V0IGJwIG9uIG92ZXJsb2FkMWFyZyhzaG9ydCkgd3JvbmcgYnAgcmVwbHkiIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic2V0IGJwIG9uIG92ZXJsb2FkMWFyZyhzaG9ydCkod3JvbmcgbWVudSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KXNldCBicCBvbiBvdmVybG9hZDFhcmcoc2hvcnQpKHdyb25nIG1lbnUpIiB9CisgIH0KKworCitnZGJfdGVzdCAiaW5mbyBicmVhayIgXAorICAgICJOdW0gVHlwZVxbXHQgXF0rRGlzcCBFbmIgQWRkcmVzc1xbXHQgXF0rV2hhdC4qCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIG1haW4gYXQuKiRzcmNmaWxlOjQ5XHIKK1xbXHQgXF0rYnJlYWtwb2ludCBhbHJlYWR5IGhpdCAxIHRpbWVccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMVxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwoc2lnbmVkIGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMlxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEzXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChzaG9ydFxcKSBhdC4qJHNyY2ZpbGU6MTE0IiBcCisgICAgImJyZWFrcG9pbnQgaW5mbyIKKworCisKK3NlbmRfZ2RiICJicmVhayBmb286Om92ZXJsb2FkMWFyZ1xuIiAKK2dkYl9leHBlY3QgeworLXJlICJcXFxbMFxcXF0gY2FuY2VsXHJcblxcXFsxXFxcXSBhbGxcclxuXFxcWzJcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoZG91YmxlXFwpIGF0Liokc3JjZmlsZToxMjFcclxuXFxcWzNcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoZmxvYXRcXCkgYXQuKiRzcmNmaWxlOjEyMFxyXG5cXFxbNFxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBsb25nXFwpIGF0Liokc3JjZmlsZToxMTlcclxuXFxcWzVcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwobG9uZ1xcKSBhdC4qJHNyY2ZpbGU6MTE4XHJcblxcXFs2XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIGludFxcKSBhdC4qJHNyY2ZpbGU6MTE3XHJcblxcXFs3XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGludFxcKSBhdC4qJHNyY2ZpbGU6MTE2XHJcblxcXFs4XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTVcclxuXFxcWzlcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoc2hvcnRcXCkgYXQuKiRzcmNmaWxlOjExNFxyXG5cXFxbMTBcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEzXHJcblxcXFsxMVxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChzaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEyXHJcblxcXFsxMlxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChjaGFyXFwpIGF0Liokc3JjZmlsZToxMTFcclxuXFxcWzEzXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHZvaWRcXCkgYXQuKiRzcmNmaWxlOjExMFxyXG4+ICQiIHsKKyAgICAgICAgICAgIHNlbmRfZ2RiICI4XG4iCisgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgIC1yZSAiQnJlYWtwb2ludCA2IGF0ICRoZXg6IGZpbGUuKiRzcmNmaWxlLCBsaW5lIDExNS5cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICAgICBwYXNzICJzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKHVuc2lnbmVkIHNob3J0KSIgfQorICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZmFpbCAic2V0IGJwIG9uIG92ZXJsb2FkMWFyZyh1bnNpZ25lZCBzaG9ydCkgd3JvbmcgYnAgcmVwbHkiIH0KKyAgICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZmFpbCAiKHRpbWVvdXQpc2V0IGJwIG9uIG92ZXJsb2FkMWFyZyh1bnNpZ25lZCBzaG9ydCkgd3JvbmcgYnAgcmVwbHkiIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic2V0IGJwIG9uIG92ZXJsb2FkMWFyZyh1bnNpZ25lZCBzaG9ydCkod3JvbmcgbWVudSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KXNldCBicCBvbiBvdmVybG9hZDFhcmcodW5zaWduZWQgc2hvcnQpKHdyb25nIG1lbnUpIiB9CisgIH0KKworCitnZGJfdGVzdCAiaW5mbyBicmVhayIgXAorICAgICJOdW0gVHlwZVxbXHQgXF0rRGlzcCBFbmIgQWRkcmVzc1xbXHQgXF0rV2hhdC4qCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIG1haW4gYXQuKiRzcmNmaWxlOjQ5XHIKK1xbXHQgXF0rYnJlYWtwb2ludCBhbHJlYWR5IGhpdCAxIHRpbWVccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMVxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwoc2lnbmVkIGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMlxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEzXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChzaG9ydFxcKSBhdC4qJHNyY2ZpbGU6MTE0XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBzaG9ydFxcKSBhdC4qJHNyY2ZpbGU6MTE1IiBcCisgICAgImJyZWFrcG9pbnQgaW5mbyIKKworCisKK3NlbmRfZ2RiICJicmVhayBmb286Om92ZXJsb2FkMWFyZ1xuIiAKK2dkYl9leHBlY3QgeworLXJlICJcXFxbMFxcXF0gY2FuY2VsXHJcblxcXFsxXFxcXSBhbGxcclxuXFxcWzJcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoZG91YmxlXFwpIGF0Liokc3JjZmlsZToxMjFcclxuXFxcWzNcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoZmxvYXRcXCkgYXQuKiRzcmNmaWxlOjEyMFxyXG5cXFxbNFxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBsb25nXFwpIGF0Liokc3JjZmlsZToxMTlcclxuXFxcWzVcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwobG9uZ1xcKSBhdC4qJHNyY2ZpbGU6MTE4XHJcblxcXFs2XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIGludFxcKSBhdC4qJHNyY2ZpbGU6MTE3XHJcblxcXFs3XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGludFxcKSBhdC4qJHNyY2ZpbGU6MTE2XHJcblxcXFs4XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTVcclxuXFxcWzlcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoc2hvcnRcXCkgYXQuKiRzcmNmaWxlOjExNFxyXG5cXFxbMTBcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEzXHJcblxcXFsxMVxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChzaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEyXHJcblxcXFsxMlxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChjaGFyXFwpIGF0Liokc3JjZmlsZToxMTFcclxuXFxcWzEzXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHZvaWRcXCkgYXQuKiRzcmNmaWxlOjExMFxyXG4+ICQiIHsKKyAgICAgICAgICAgIHNlbmRfZ2RiICI3XG4iCisgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgIC1yZSAiQnJlYWtwb2ludCA3IGF0ICRoZXg6IGZpbGUuKiRzcmNmaWxlLCBsaW5lIDExNi5cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICAgICBwYXNzICJzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKGludCkiIH0KKyAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgInNldCBicCBvbiBvdmVybG9hZDFhcmcoaW50KSB3cm9uZyBicCByZXBseSIgfQorICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBmYWlsICIodGltZW91dClzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKGludCkgd3JvbmcgYnAgcmVwbHkiIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic2V0IGJwIG9uIG92ZXJsb2FkMWFyZyhpbnQpKHdyb25nIG1lbnUpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dClzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKGludCkod3JvbmcgbWVudSkiIH0KKyAgfQorCisKK2dkYl90ZXN0ICJpbmZvIGJyZWFrIiBcCisgICAgIk51bSBUeXBlXFtcdCBcXStEaXNwIEVuYiBBZGRyZXNzXFtcdCBcXStXaGF0LioKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gbWFpbiBhdC4qJHNyY2ZpbGU6NDlccgorXFtcdCBcXSticmVha3BvaW50IGFscmVhZHkgaGl0IDEgdGltZVxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwoY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTExXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChzaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEyXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBjaGFyXFwpIGF0Liokc3JjZmlsZToxMTNccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTRccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTVccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGludFxcKSBhdC4qJHNyY2ZpbGU6MTE2IiBcCisgICAgImJyZWFrcG9pbnQgaW5mbyIKKworCisKK3NlbmRfZ2RiICJicmVhayBmb286Om92ZXJsb2FkMWFyZ1xuIiAKK2dkYl9leHBlY3QgeworLXJlICJcXFxbMFxcXF0gY2FuY2VsXHJcblxcXFsxXFxcXSBhbGxcclxuXFxcWzJcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoZG91YmxlXFwpIGF0Liokc3JjZmlsZToxMjFcclxuXFxcWzNcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoZmxvYXRcXCkgYXQuKiRzcmNmaWxlOjEyMFxyXG5cXFxbNFxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBsb25nXFwpIGF0Liokc3JjZmlsZToxMTlcclxuXFxcWzVcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwobG9uZ1xcKSBhdC4qJHNyY2ZpbGU6MTE4XHJcblxcXFs2XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIGludFxcKSBhdC4qJHNyY2ZpbGU6MTE3XHJcblxcXFs3XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGludFxcKSBhdC4qJHNyY2ZpbGU6MTE2XHJcblxcXFs4XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTVcclxuXFxcWzlcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoc2hvcnRcXCkgYXQuKiRzcmNmaWxlOjExNFxyXG5cXFxbMTBcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEzXHJcblxcXFsxMVxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChzaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEyXHJcblxcXFsxMlxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChjaGFyXFwpIGF0Liokc3JjZmlsZToxMTFcclxuXFxcWzEzXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHZvaWRcXCkgYXQuKiRzcmNmaWxlOjExMFxyXG4+ICQiIHsKKyAgICAgICAgICAgIHNlbmRfZ2RiICI2XG4iCisgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgIC1yZSAiQnJlYWtwb2ludCA4IGF0ICRoZXg6IGZpbGUuKiRzcmNmaWxlLCBsaW5lIDExNy5cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICAgICBwYXNzICJzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKHVuc2lnbmVkIGludCkiIH0KKyAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgInNldCBicCBvbiBvdmVybG9hZDFhcmcodW5zaWduZWQgaW50KSB3cm9uZyBicCByZXBseSIgfQorICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBmYWlsICIodGltZW91dClzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKHVuc2lnbmVkIGludCkgd3JvbmcgYnAgcmVwbHkiIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic2V0IGJwIG9uIG92ZXJsb2FkMWFyZyh1bnNpZ25lZCBpbnQpKHdyb25nIG1lbnUpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dClzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKHVuc2lnbmVkIGludCkod3JvbmcgbWVudSkiIH0KKyAgfQorCisKK2dkYl90ZXN0ICJpbmZvIGJyZWFrIiBcCisgICAgIk51bSBUeXBlXFtcdCBcXStEaXNwIEVuYiBBZGRyZXNzXFtcdCBcXStXaGF0LioKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gbWFpbiBhdC4qJHNyY2ZpbGU6NDlccgorXFtcdCBcXSticmVha3BvaW50IGFscmVhZHkgaGl0IDEgdGltZVxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwoY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTExXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChzaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEyXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBjaGFyXFwpIGF0Liokc3JjZmlsZToxMTNccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTRccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTVccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGludFxcKSBhdC4qJHNyY2ZpbGU6MTE2XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBpbnRcXCkgYXQuKiRzcmNmaWxlOjExNyIgXAorICAgICJicmVha3BvaW50IGluZm8iCisKKworCitzZW5kX2dkYiAiYnJlYWsgZm9vOjpvdmVybG9hZDFhcmdcbiIgCitnZGJfZXhwZWN0IHsKKy1yZSAiXFxcWzBcXFxdIGNhbmNlbFxyXG5cXFxbMVxcXF0gYWxsXHJcblxcXFsyXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGRvdWJsZVxcKSBhdC4qJHNyY2ZpbGU6MTIxXHJcblxcXFszXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGZsb2F0XFwpIGF0Liokc3JjZmlsZToxMjBcclxuXFxcWzRcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgbG9uZ1xcKSBhdC4qJHNyY2ZpbGU6MTE5XHJcblxcXFs1XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGxvbmdcXCkgYXQuKiRzcmNmaWxlOjExOFxyXG5cXFxbNlxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBpbnRcXCkgYXQuKiRzcmNmaWxlOjExN1xyXG5cXFxbN1xcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChpbnRcXCkgYXQuKiRzcmNmaWxlOjExNlxyXG5cXFxbOFxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBzaG9ydFxcKSBhdC4qJHNyY2ZpbGU6MTE1XHJcblxcXFs5XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTRcclxuXFxcWzEwXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExM1xyXG5cXFxbMTFcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoc2lnbmVkIGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMlxyXG5cXFxbMTJcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTExXHJcblxcXFsxM1xcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh2b2lkXFwpIGF0Liokc3JjZmlsZToxMTBcclxuPiAkIiB7CisgICAgICAgICAgICBzZW5kX2dkYiAiNVxuIgorICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAtcmUgIkJyZWFrcG9pbnQgOSBhdCAkaGV4OiBmaWxlLiokc3JjZmlsZSwgbGluZSAxMTguXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcGFzcyAic2V0IGJwIG9uIG92ZXJsb2FkMWFyZyhsb25nKSIgfQorICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZmFpbCAic2V0IGJwIG9uIG92ZXJsb2FkMWFyZyhsb25nKSB3cm9uZyBicCByZXBseSIgfQorICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBmYWlsICIodGltZW91dClzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKGxvbmcpIHdyb25nIGJwIHJlcGx5IiB9CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInNldCBicCBvbiBvdmVybG9hZDFhcmcobG9uZykod3JvbmcgbWVudSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KXNldCBicCBvbiBvdmVybG9hZDFhcmcobG9uZykod3JvbmcgbWVudSkiIH0KKyAgfQorCisKK2dkYl90ZXN0ICJpbmZvIGJyZWFrIiBcCisgICAgIk51bSBUeXBlXFtcdCBcXStEaXNwIEVuYiBBZGRyZXNzXFtcdCBcXStXaGF0LioKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gbWFpbiBhdC4qJHNyY2ZpbGU6NDlccgorXFtcdCBcXSticmVha3BvaW50IGFscmVhZHkgaGl0IDEgdGltZVxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwoY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTExXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChzaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEyXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBjaGFyXFwpIGF0Liokc3JjZmlsZToxMTNccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTRccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTVccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGludFxcKSBhdC4qJHNyY2ZpbGU6MTE2XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBpbnRcXCkgYXQuKiRzcmNmaWxlOjExN1xyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwobG9uZ1xcKSBhdC4qJHNyY2ZpbGU6MTE4IiBcCisgICAgImJyZWFrcG9pbnQgaW5mbyIKKworCisKK3NlbmRfZ2RiICJicmVhayBmb286Om92ZXJsb2FkMWFyZ1xuIiAKK2dkYl9leHBlY3QgeworLXJlICJcXFxbMFxcXF0gY2FuY2VsXHJcblxcXFsxXFxcXSBhbGxcclxuXFxcWzJcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoZG91YmxlXFwpIGF0Liokc3JjZmlsZToxMjFcclxuXFxcWzNcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoZmxvYXRcXCkgYXQuKiRzcmNmaWxlOjEyMFxyXG5cXFxbNFxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBsb25nXFwpIGF0Liokc3JjZmlsZToxMTlcclxuXFxcWzVcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwobG9uZ1xcKSBhdC4qJHNyY2ZpbGU6MTE4XHJcblxcXFs2XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIGludFxcKSBhdC4qJHNyY2ZpbGU6MTE3XHJcblxcXFs3XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGludFxcKSBhdC4qJHNyY2ZpbGU6MTE2XHJcblxcXFs4XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTVcclxuXFxcWzlcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoc2hvcnRcXCkgYXQuKiRzcmNmaWxlOjExNFxyXG5cXFxbMTBcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEzXHJcblxcXFsxMVxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChzaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEyXHJcblxcXFsxMlxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChjaGFyXFwpIGF0Liokc3JjZmlsZToxMTFcclxuXFxcWzEzXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHZvaWRcXCkgYXQuKiRzcmNmaWxlOjExMFxyXG4+ICQiIHsKKyAgICAgICAgICAgIHNlbmRfZ2RiICI0XG4iCisgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgIC1yZSAiQnJlYWtwb2ludCAxMCBhdCAkaGV4OiBmaWxlLiokc3JjZmlsZSwgbGluZSAxMTkuXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcGFzcyAic2V0IGJwIG9uIG92ZXJsb2FkMWFyZyh1bnNpZ25lZCBsb25nKSIgfQorICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZmFpbCAic2V0IGJwIG9uIG92ZXJsb2FkMWFyZyh1bnNpZ25lZCBsb25nKSB3cm9uZyBicCByZXBseSIgfQorICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBmYWlsICIodGltZW91dClzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKHVuc2lnbmVkIGxvbmcpIHdyb25nIGJwIHJlcGx5IiB9CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInNldCBicCBvbiBvdmVybG9hZDFhcmcodW5zaWduZWQgbG9uZykod3JvbmcgbWVudSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KXNldCBicCBvbiBvdmVybG9hZDFhcmcodW5zaWduZWQgbG9uZykod3JvbmcgbWVudSkiIH0KKyAgfQorCisKK2dkYl90ZXN0ICJpbmZvIGJyZWFrIiBcCisgICAgIk51bSBUeXBlXFtcdCBcXStEaXNwIEVuYiBBZGRyZXNzXFtcdCBcXStXaGF0LioKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gbWFpbiBhdC4qJHNyY2ZpbGU6NDlccgorXFtcdCBcXSticmVha3BvaW50IGFscmVhZHkgaGl0IDEgdGltZVxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwoY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTExXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChzaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEyXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBjaGFyXFwpIGF0Liokc3JjZmlsZToxMTNccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTRccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTVccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGludFxcKSBhdC4qJHNyY2ZpbGU6MTE2XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBpbnRcXCkgYXQuKiRzcmNmaWxlOjExN1xyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwobG9uZ1xcKSBhdC4qJHNyY2ZpbGU6MTE4XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBsb25nXFwpIGF0Liokc3JjZmlsZToxMTkiIFwKKyAgICAiYnJlYWtwb2ludCBpbmZvIgorCisKK3NlbmRfZ2RiICJicmVhayBmb286Om92ZXJsb2FkMWFyZ1xuIiAKK2dkYl9leHBlY3QgeworLXJlICJcXFxbMFxcXF0gY2FuY2VsXHJcblxcXFsxXFxcXSBhbGxcclxuXFxcWzJcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoZG91YmxlXFwpIGF0Liokc3JjZmlsZToxMjFcclxuXFxcWzNcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoZmxvYXRcXCkgYXQuKiRzcmNmaWxlOjEyMFxyXG5cXFxbNFxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBsb25nXFwpIGF0Liokc3JjZmlsZToxMTlcclxuXFxcWzVcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwobG9uZ1xcKSBhdC4qJHNyY2ZpbGU6MTE4XHJcblxcXFs2XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIGludFxcKSBhdC4qJHNyY2ZpbGU6MTE3XHJcblxcXFs3XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGludFxcKSBhdC4qJHNyY2ZpbGU6MTE2XHJcblxcXFs4XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTVcclxuXFxcWzlcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoc2hvcnRcXCkgYXQuKiRzcmNmaWxlOjExNFxyXG5cXFxbMTBcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEzXHJcblxcXFsxMVxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChzaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEyXHJcblxcXFsxMlxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChjaGFyXFwpIGF0Liokc3JjZmlsZToxMTFcclxuXFxcWzEzXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHZvaWRcXCkgYXQuKiRzcmNmaWxlOjExMFxyXG4+ICQiIHsKKyAgICAgICAgICAgIHNlbmRfZ2RiICIzXG4iCisgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgIC1yZSAiQnJlYWtwb2ludCAxMSBhdCAkaGV4OiBmaWxlLiokc3JjZmlsZSwgbGluZSAxMjAuXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcGFzcyAic2V0IGJwIG9uIG92ZXJsb2FkMWFyZyhmbG9hdCkiIH0KKyAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgInNldCBicCBvbiBvdmVybG9hZDFhcmcoZmxvYXQpIHdyb25nIGJwIHJlcGx5IiB9CisgICAgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgIih0aW1lb3V0KXNldCBicCBvbiBvdmVybG9hZDFhcmcoZmxvYXQpIHdyb25nIGJwIHJlcGx5IiB9CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInNldCBicCBvbiBvdmVybG9hZDFhcmcoZmxvYXQpKHdyb25nIG1lbnUpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dClzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKGZsb2F0KSh3cm9uZyBtZW51KSIgfQorICB9CisKK2dkYl90ZXN0ICJpbmZvIGJyZWFrIiBcCisgICAgIk51bSBUeXBlXFtcdCBcXStEaXNwIEVuYiBBZGRyZXNzXFtcdCBcXStXaGF0LioKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gbWFpbiBhdC4qJHNyY2ZpbGU6NDlccgorXFtcdCBcXSticmVha3BvaW50IGFscmVhZHkgaGl0IDEgdGltZVxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwoY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTExXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChzaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEyXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBjaGFyXFwpIGF0Liokc3JjZmlsZToxMTNccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTRccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTVccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGludFxcKSBhdC4qJHNyY2ZpbGU6MTE2XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBpbnRcXCkgYXQuKiRzcmNmaWxlOjExN1xyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwobG9uZ1xcKSBhdC4qJHNyY2ZpbGU6MTE4XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBsb25nXFwpIGF0Liokc3JjZmlsZToxMTlccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGZsb2F0XFwpIGF0Liokc3JjZmlsZToxMjAiIFwKKyAgICAiYnJlYWtwb2ludCBpbmZvIgorCisKKworc2VuZF9nZGIgImJyZWFrIGZvbzo6b3ZlcmxvYWQxYXJnXG4iIAorZ2RiX2V4cGVjdCB7CistcmUgIlxcXFswXFxcXSBjYW5jZWxcclxuXFxcWzFcXFxdIGFsbFxyXG5cXFxbMlxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChkb3VibGVcXCkgYXQuKiRzcmNmaWxlOjEyMVxyXG5cXFxbM1xcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChmbG9hdFxcKSBhdC4qJHNyY2ZpbGU6MTIwXHJcblxcXFs0XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIGxvbmdcXCkgYXQuKiRzcmNmaWxlOjExOVxyXG5cXFxbNVxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChsb25nXFwpIGF0Liokc3JjZmlsZToxMThcclxuXFxcWzZcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgaW50XFwpIGF0Liokc3JjZmlsZToxMTdcclxuXFxcWzdcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoaW50XFwpIGF0Liokc3JjZmlsZToxMTZcclxuXFxcWzhcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgc2hvcnRcXCkgYXQuKiRzcmNmaWxlOjExNVxyXG5cXFxbOVxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChzaG9ydFxcKSBhdC4qJHNyY2ZpbGU6MTE0XHJcblxcXFsxMFxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBjaGFyXFwpIGF0Liokc3JjZmlsZToxMTNcclxuXFxcWzExXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHNpZ25lZCBjaGFyXFwpIGF0Liokc3JjZmlsZToxMTJcclxuXFxcWzEyXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMVxyXG5cXFxbMTNcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodm9pZFxcKSBhdC4qJHNyY2ZpbGU6MTEwXHJcbj4gJCIgeworICAgICAgICAgICAgc2VuZF9nZGIgIjJcbiIKKyAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgLXJlICJCcmVha3BvaW50IDEyIGF0ICRoZXg6IGZpbGUuKiRzcmNmaWxlLCBsaW5lIDEyMS5cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICAgICBwYXNzICJzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKGRvdWJsZSkiIH0KKyAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgInNldCBicCBvbiBvdmVybG9hZDFhcmcoZG91YmxlKSB3cm9uZyBicCByZXBseSIgfQorICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBmYWlsICIodGltZW91dClzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKGRvdWJsZSkgd3JvbmcgYnAgcmVwbHkiIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic2V0IGJwIG9uIG92ZXJsb2FkMWFyZyhkb3VibGUpKHdyb25nIG1lbnUpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dClzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKGRvdWJsZSkod3JvbmcgbWVudSkiIH0KKyAgfQorCisKK2dkYl90ZXN0ICJpbmZvIGJyZWFrIiBcCisgICAgIk51bSBUeXBlXFtcdCBcXStEaXNwIEVuYiBBZGRyZXNzXFtcdCBcXStXaGF0LioKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gbWFpbiBhdC4qJHNyY2ZpbGU6NDlccgorXFtcdCBcXSticmVha3BvaW50IGFscmVhZHkgaGl0IDEgdGltZVxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwoY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTExXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChzaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEyXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBjaGFyXFwpIGF0Liokc3JjZmlsZToxMTNccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTRccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTVccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGludFxcKSBhdC4qJHNyY2ZpbGU6MTE2XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBpbnRcXCkgYXQuKiRzcmNmaWxlOjExN1xyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwobG9uZ1xcKSBhdC4qJHNyY2ZpbGU6MTE4XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBsb25nXFwpIGF0Liokc3JjZmlsZToxMTlccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGZsb2F0XFwpIGF0Liokc3JjZmlsZToxMjBccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGRvdWJsZVxcKSBhdC4qJHNyY2ZpbGU6MTIxIiBcCisgICAgImJyZWFrcG9pbnQgaW5mbyIKKworCisKK3NlbmRfZ2RiICJicmVhayBmb286Om92ZXJsb2FkMWFyZ1xuIiAKK2dkYl9leHBlY3QgeworLXJlICJcXFxbMFxcXF0gY2FuY2VsXHJcblxcXFsxXFxcXSBhbGxcclxuXFxcWzJcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoZG91YmxlXFwpIGF0Liokc3JjZmlsZToxMjFcclxuXFxcWzNcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoZmxvYXRcXCkgYXQuKiRzcmNmaWxlOjEyMFxyXG5cXFxbNFxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBsb25nXFwpIGF0Liokc3JjZmlsZToxMTlcclxuXFxcWzVcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwobG9uZ1xcKSBhdC4qJHNyY2ZpbGU6MTE4XHJcblxcXFs2XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIGludFxcKSBhdC4qJHNyY2ZpbGU6MTE3XHJcblxcXFs3XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGludFxcKSBhdC4qJHNyY2ZpbGU6MTE2XHJcblxcXFs4XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTVcclxuXFxcWzlcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoc2hvcnRcXCkgYXQuKiRzcmNmaWxlOjExNFxyXG5cXFxbMTBcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEzXHJcblxcXFsxMVxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChzaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEyXHJcblxcXFsxMlxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChjaGFyXFwpIGF0Liokc3JjZmlsZToxMTFcclxuXFxcWzEzXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHZvaWRcXCkgYXQuKiRzcmNmaWxlOjExMFxyXG4+ICQiIHsKKyAgICAgICAgICAgIHNlbmRfZ2RiICIxM1xuIgorICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAtcmUgIkJyZWFrcG9pbnQgMTMgYXQgJGhleDogZmlsZS4qJHNyY2ZpbGUsIGxpbmUgMTEwLlxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgInNldCBicCBvbiBvdmVybG9hZDFhcmcodm9pZCkiIH0KKyAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgInNldCBicCBvbiBvdmVybG9hZDFhcmcodm9pZCkgd3JvbmcgYnAgcmVwbHkiIH0KKyAgICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZmFpbCAiKHRpbWVvdXQpc2V0IGJwIG9uIG92ZXJsb2FkMWFyZyh2b2lkKSB3cm9uZyBicCByZXBseSIgfQorICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKHZvaWQpKHdyb25nIG1lbnUpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dClzZXQgYnAgb24gb3ZlcmxvYWQxYXJnKHZvaWQpKHdyb25nIG1lbnUpIiB9CisgIH0KKworCitnZGJfdGVzdCAiaW5mbyBicmVhayIgXAorICAgICJOdW0gVHlwZVxbXHQgXF0rRGlzcCBFbmIgQWRkcmVzc1xbXHQgXF0rV2hhdC4qCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIG1haW4gYXQuKiRzcmNmaWxlOjQ5XHIKK1xbXHQgXF0rYnJlYWtwb2ludCBhbHJlYWR5IGhpdCAxIHRpbWVccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMVxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwoc2lnbmVkIGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMlxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEzXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChzaG9ydFxcKSBhdC4qJHNyY2ZpbGU6MTE0XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBzaG9ydFxcKSBhdC4qJHNyY2ZpbGU6MTE1XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChpbnRcXCkgYXQuKiRzcmNmaWxlOjExNlxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgaW50XFwpIGF0Liokc3JjZmlsZToxMTdccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGxvbmdcXCkgYXQuKiRzcmNmaWxlOjExOFxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgbG9uZ1xcKSBhdC4qJHNyY2ZpbGU6MTE5XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChmbG9hdFxcKSBhdC4qJHNyY2ZpbGU6MTIwXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChkb3VibGVcXCkgYXQuKiRzcmNmaWxlOjEyMVxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwodm9pZFxcKSBhdC4qJHNyY2ZpbGU6MTEwIiBcCisgICAgImJyZWFrcG9pbnQgaW5mbyIKKworCisKKworc2VuZF9nZGIgImJyZWFrIGZvbzo6b3ZlcmxvYWQxYXJnXG4iIAorZ2RiX2V4cGVjdCB7CistcmUgIlxcXFswXFxcXSBjYW5jZWxcclxuXFxcWzFcXFxdIGFsbFxyXG5cXFxbMlxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChkb3VibGVcXCkgYXQuKiRzcmNmaWxlOjEyMVxyXG5cXFxbM1xcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChmbG9hdFxcKSBhdC4qJHNyY2ZpbGU6MTIwXHJcblxcXFs0XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIGxvbmdcXCkgYXQuKiRzcmNmaWxlOjExOVxyXG5cXFxbNVxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChsb25nXFwpIGF0Liokc3JjZmlsZToxMThcclxuXFxcWzZcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgaW50XFwpIGF0Liokc3JjZmlsZToxMTdcclxuXFxcWzdcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoaW50XFwpIGF0Liokc3JjZmlsZToxMTZcclxuXFxcWzhcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgc2hvcnRcXCkgYXQuKiRzcmNmaWxlOjExNVxyXG5cXFxbOVxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChzaG9ydFxcKSBhdC4qJHNyY2ZpbGU6MTE0XHJcblxcXFsxMFxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBjaGFyXFwpIGF0Liokc3JjZmlsZToxMTNcclxuXFxcWzExXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHNpZ25lZCBjaGFyXFwpIGF0Liokc3JjZmlsZToxMTJcclxuXFxcWzEyXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMVxyXG5cXFxbMTNcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodm9pZFxcKSBhdC4qJHNyY2ZpbGU6MTEwXHJcbj4gJCIgeworICAgICAgICAgICAgc2VuZF9nZGIgIjBcbiIKKyAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgLXJlICJjYW5jZWxsZWRcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICAgICBwYXNzICJzZXQgYnAgY2FuY2VsbGVkIiB9CisgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICAgICBmYWlsICJzZXQgYnAgY2FuY2VsbGVkICB3cm9uZyBicCByZXBseSIgfQorICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBmYWlsICIodGltZW91dClzZXQgYnAgY2FuY2VsbGVkIHdyb25nIGJwIHJlcGx5IiB9CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInNldCBicCBjYW5jZWxsZWQod3JvbmcgbWVudSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KXNldCBicCBjYW5jZWxsZWQod3JvbmcgbWVudSkiIH0KKyAgfQorCisKKworCitnZGJfdGVzdCAiaW5mbyBicmVhayIgXAorICAgICJOdW0gVHlwZVxbXHQgXF0rRGlzcCBFbmIgQWRkcmVzc1xbXHQgXF0rV2hhdC4qCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIG1haW4gYXQuKiRzcmNmaWxlOjQ5XHIKK1xbXHQgXF0rYnJlYWtwb2ludCBhbHJlYWR5IGhpdCAxIHRpbWVccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMVxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwoc2lnbmVkIGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMlxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEzXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChzaG9ydFxcKSBhdC4qJHNyY2ZpbGU6MTE0XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBzaG9ydFxcKSBhdC4qJHNyY2ZpbGU6MTE1XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChpbnRcXCkgYXQuKiRzcmNmaWxlOjExNlxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgaW50XFwpIGF0Liokc3JjZmlsZToxMTdccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGxvbmdcXCkgYXQuKiRzcmNmaWxlOjExOFxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgbG9uZ1xcKSBhdC4qJHNyY2ZpbGU6MTE5XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChmbG9hdFxcKSBhdC4qJHNyY2ZpbGU6MTIwXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChkb3VibGVcXCkgYXQuKiRzcmNmaWxlOjEyMVxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwodm9pZFxcKSBhdC4qJHNyY2ZpbGU6MTEwIiBcCisgICAgImJyZWFrcG9pbnQgaW5mbyIKKworCisKKworCitzZW5kX2dkYiAiZGVsZXRlIGJyZWFrcG9pbnRzXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJEZWxldGUgYWxsIGJyZWFrcG9pbnRzLiokIiB7CisgICAgICAgIHNlbmRfZ2RiICJ5XG4iCisgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICBzZW5kX2dkYiAiaW5mbyBicmVha3BvaW50c1xuIgorICAgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAtcmUgIk5vIGJyZWFrcG9pbnRzIG9yIHdhdGNocG9pbnRzLi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyAiRGVsZXRlZCBhbGwgYnJlYWtwb2ludHMiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgIHsgZmFpbCAiRGVsZXRlZCBhbGwgYnJlYWtwb2ludHMiIH0KKyAgICAgICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAgICAgICAgeyBmYWlsICJEZWxldGVkIGFsbCBicmVha3BvaW50cyAodGltZW91dCkiIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aW1lb3V0ICAgICAgICAgICAgICAgICB7IGZhaWwgIkRlbGV0ZWQgYWxsIGJyZWFrcG9pbnRzICh0aW1lb3V0KSIgfQorICAgICAgICB9CisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgICAgICB7IGZhaWwgIkRlbGV0ZWQgYWxsIGJyZWFrcG9pbnRzIiB9CisgICAgdGltZW91dCAgICAgICAgICAgICAgICAgeyBmYWlsICJEZWxldGVkIGFsbCBicmVha3BvaW50cyAodGltZW91dCkiIH0KK30KKworICAgICAgICAgIAorCisKK3NlbmRfZ2RiICJicmVhayBmb286Om92ZXJsb2FkMWFyZ1xuIiAKK2dkYl9leHBlY3QgeworLXJlICJcXFxbMFxcXF0gY2FuY2VsXHJcblxcXFsxXFxcXSBhbGxcclxuXFxcWzJcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoZG91YmxlXFwpIGF0Liokc3JjZmlsZToxMjFcclxuXFxcWzNcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoZmxvYXRcXCkgYXQuKiRzcmNmaWxlOjEyMFxyXG5cXFxbNFxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBsb25nXFwpIGF0Liokc3JjZmlsZToxMTlcclxuXFxcWzVcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwobG9uZ1xcKSBhdC4qJHNyY2ZpbGU6MTE4XHJcblxcXFs2XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIGludFxcKSBhdC4qJHNyY2ZpbGU6MTE3XHJcblxcXFs3XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKGludFxcKSBhdC4qJHNyY2ZpbGU6MTE2XHJcblxcXFs4XFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHVuc2lnbmVkIHNob3J0XFwpIGF0Liokc3JjZmlsZToxMTVcclxuXFxcWzlcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwoc2hvcnRcXCkgYXQuKiRzcmNmaWxlOjExNFxyXG5cXFxbMTBcXFxdIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEzXHJcblxcXFsxMVxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChzaWduZWQgY2hhclxcKSBhdC4qJHNyY2ZpbGU6MTEyXHJcblxcXFsxMlxcXF0gZm9vOjpvdmVybG9hZDFhcmdcXChjaGFyXFwpIGF0Liokc3JjZmlsZToxMTFcclxuXFxcWzEzXFxcXSBmb286Om92ZXJsb2FkMWFyZ1xcKHZvaWRcXCkgYXQuKiRzcmNmaWxlOjExMFxyXG4+ICQiIHsKKyAgICAgICAgICAgIHNlbmRfZ2RiICIxXG4iCisgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgIC1yZSAiQnJlYWtwb2ludCAkZGVjaW1hbCBhdCAkaGV4OiBmaWxlLiokc3JjZmlsZSwgbGluZSAxMjEuXHJcbkJyZWFrcG9pbnQgJGRlY2ltYWwgYXQgJGhleDogZmlsZS4qJHNyY2ZpbGUsIGxpbmUgMTIwLlxyXG5CcmVha3BvaW50ICRkZWNpbWFsIGF0ICRoZXg6IGZpbGUuKiRzcmNmaWxlLCBsaW5lIDExOS5cclxuQnJlYWtwb2ludCAkZGVjaW1hbCBhdCAkaGV4OiBmaWxlLiokc3JjZmlsZSwgbGluZSAxMTguXHJcbkJyZWFrcG9pbnQgJGRlY2ltYWwgYXQgJGhleDogZmlsZS4qJHNyY2ZpbGUsIGxpbmUgMTE3LlxyXG5CcmVha3BvaW50ICRkZWNpbWFsIGF0ICRoZXg6IGZpbGUuKiRzcmNmaWxlLCBsaW5lIDExNi5cclxuQnJlYWtwb2ludCAkZGVjaW1hbCBhdCAkaGV4OiBmaWxlLiokc3JjZmlsZSwgbGluZSAxMTUuXHJcbkJyZWFrcG9pbnQgJGRlY2ltYWwgYXQgJGhleDogZmlsZS4qJHNyY2ZpbGUsIGxpbmUgMTE0LlxyXG5CcmVha3BvaW50ICRkZWNpbWFsIGF0ICRoZXg6IGZpbGUuKiRzcmNmaWxlLCBsaW5lIDExMy5cclxuQnJlYWtwb2ludCAkZGVjaW1hbCBhdCAkaGV4OiBmaWxlLiokc3JjZmlsZSwgbGluZSAxMTIuXHJcbkJyZWFrcG9pbnQgJGRlY2ltYWwgYXQgJGhleDogZmlsZS4qJHNyY2ZpbGUsIGxpbmUgMTExLlxyXG5CcmVha3BvaW50ICRkZWNpbWFsIGF0ICRoZXg6IGZpbGUuKiRzcmNmaWxlLCBsaW5lIDExMC5cclxuTXVsdGlwbGUgYnJlYWtwb2ludHMgd2VyZSBzZXQuXHJcblVzZSB0aGUgLmRlbGV0ZS4gY29tbWFuZCB0byBkZWxldGUgdW53YW50ZWQgYnJlYWtwb2ludHMuXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcGFzcyAic2V0IGJwIG9uIGFsbCBvdmVybG9hZDFhcmcoKSIgfQorICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZmFpbCAic2V0IGJwIG9uIGFsbCBvdmVybG9hZDFhcmcoKSB3cm9uZyBicCByZXBseSIgfQorICAgICAgICAgICAgICAgdGltZW91dCAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBmYWlsICIodGltZW91dClzZXQgYnAgb24gYWxsIG92ZXJsb2FkMWFyZygpIHdyb25nIGJwIHJlcGx5IiB9CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInNldCBicCBvbiBhbGwgb3ZlcmxvYWQxYXJnKCkod3JvbmcgbWVudSkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KXNldCBicCBvbiBhbGwgb3ZlcmxvYWQxYXJnKCkod3JvbmcgbWVudSkiIH0KKyAgfQorCisKKworZ2RiX3Rlc3QgImluZm8gYnJlYWsiIFwKKyAgICAiTnVtIFR5cGVcW1x0IFxdK0Rpc3AgRW5iIEFkZHJlc3NcW1x0IFxdK1doYXQuKgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGRvdWJsZVxcKSBhdC4qJHNyY2ZpbGU6MTIxXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChmbG9hdFxcKSBhdC4qJHNyY2ZpbGU6MTIwXHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBsb25nXFwpIGF0Liokc3JjZmlsZToxMTlccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGxvbmdcXCkgYXQuKiRzcmNmaWxlOjExOFxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwodW5zaWduZWQgaW50XFwpIGF0Liokc3JjZmlsZToxMTdccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGludFxcKSBhdC4qJHNyY2ZpbGU6MTE2XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBzaG9ydFxcKSBhdC4qJHNyY2ZpbGU6MTE1XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXChzaG9ydFxcKSBhdC4qJHNyY2ZpbGU6MTE0XHIKK1xbMC05XF0rXFtcdCBcXSticmVha3BvaW50ICAgICBrZWVwIHlcW1x0IFxdKyRoZXggaW4gZm9vOjpvdmVybG9hZDFhcmdcXCh1bnNpZ25lZCBjaGFyXFwpIGF0Liokc3JjZmlsZToxMTNccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKHNpZ25lZCBjaGFyXFwpIGF0Liokc3JjZmlsZToxMTJccgorXFswLTlcXStcW1x0IFxdK2JyZWFrcG9pbnQgICAgIGtlZXAgeVxbXHQgXF0rJGhleCBpbiBmb286Om92ZXJsb2FkMWFyZ1xcKGNoYXJcXCkgYXQuKiRzcmNmaWxlOjExMVxyCitcWzAtOVxdK1xbXHQgXF0rYnJlYWtwb2ludCAgICAga2VlcCB5XFtcdCBcXSskaGV4IGluIGZvbzo6b3ZlcmxvYWQxYXJnXFwodm9pZFxcKSBhdC4qJHNyY2ZpbGU6MTEwIiBcCisgICAgImJyZWFrcG9pbnQgaW5mbyIKKworCisgICAgc2VuZF9nZGIgImNvbnRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJDb250aW51aW5nLlxyXG5cclxuQnJlYWtwb2ludCAyNSwgZm9vOjpvdmVybG9hZDFhcmcgXFwodGhpcz0kaGV4XFwpIGF0Liokc3JjZmlsZToxMTBcclxuMTEwXFtcdCBcXStpbnQgZm9vOjpvdmVybG9hZDFhcmcgXFwodm9pZFxcKVxbXHQgXF0rXHsgIHJldHVybiAxOyBcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBwYXNzICJjb250aW51ZSB0byBicCBvdmVybG9hZGVkIDogdm9pZCIKKyAgICAgICAgfQorICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29udGludWUgdG8gYnAgb3ZlcmxvYWRlZCA6IHZvaWQiICB9CisgICAgICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgY29udGludWUgdG8gYnAgb3ZlcmxvYWRlZCA6IHZvaWQiICB9CisgICAgfQorCisKKyAgICBzZW5kX2dkYiAiY29udFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIkNvbnRpbnVpbmcuXHJcblxyXG5CcmVha3BvaW50IDI0LCBmb286Om92ZXJsb2FkMWFyZyBcXCh0aGlzPSRoZXgsIGFyZz0yIFxcJ1xcXFwwMDJcXCdcXCkgYXQuKiRzcmNmaWxlOjExMVxyXG4xMTFcW1x0IFxdK2ludCBmb286Om92ZXJsb2FkMWFyZyBcXChjaGFyIGFyZ1xcKS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgcGFzcyAiY29udGludWUgdG8gYnAgb3ZlcmxvYWRlZCA6IGNoYXIiCisgICAgICAgIH0KKyAgICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbnRpbnVlIHRvIGJwIG92ZXJsb2FkZWQgOiBjaGFyIiAgfQorICAgICAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGNvbnRpbnVlIHRvIGJwIG92ZXJsb2FkZWQgOiBjaGFyIiAgfQorICAgIH0KKworCisgICAgc2VuZF9nZGIgImNvbnRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJDb250aW51aW5nLlxyXG5cclxuQnJlYWtwb2ludCAyMywgZm9vOjpvdmVybG9hZDFhcmcgXFwodGhpcz0kaGV4LCBhcmc9MyBcXCdcXFxcMDAzXFwnXFwpIGF0Liokc3JjZmlsZToxMTJcclxuMTEyXFtcdCBcXStpbnQgZm9vOjpvdmVybG9hZDFhcmcgXFwoc2lnbmVkIGNoYXIgYXJnXFwpLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBwYXNzICJjb250aW51ZSB0byBicCBvdmVybG9hZGVkIDogc2lnbmVkIGNoYXIiCisgICAgICAgIH0KKyAgICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbnRpbnVlIHRvIGJwIG92ZXJsb2FkZWQgOiBzaWduZWQgY2hhciIgIH0KKyAgICAgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb250aW51ZSB0byBicCBvdmVybG9hZGVkIDogc2lnbmVkIGNoYXIiICB9CisgICAgfQorCisKKyAgICBzZW5kX2dkYiAiY29udFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIkNvbnRpbnVpbmcuXHJcblxyXG5CcmVha3BvaW50IDIyLCBmb286Om92ZXJsb2FkMWFyZyBcXCh0aGlzPSRoZXgsIGFyZz00IFxcJ1xcXFwwMDRcXCdcXCkgYXQuKiRzcmNmaWxlOjExM1xyXG4xMTNcW1x0IFxdK2ludCBmb286Om92ZXJsb2FkMWFyZyBcXCh1bnNpZ25lZCBjaGFyIGFyZ1xcKS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgcGFzcyAiY29udGludWUgdG8gYnAgb3ZlcmxvYWRlZCA6IHVuc2lnbmVkIGNoYXIiCisgICAgICAgIH0KKyAgICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbnRpbnVlIHRvIGJwIG92ZXJsb2FkZWQgOiB1bnNpZ25lZCBjaGFyIiAgfQorICAgICAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGNvbnRpbnVlIHRvIGJwIG92ZXJsb2FkZWQgOiB1bnNpZ25lZCBjaGFyIiAgfQorICAgIH0KKworCisgICAgc2VuZF9nZGIgImNvbnRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJDb250aW51aW5nLlxyXG5cclxuQnJlYWtwb2ludCAyMSwgZm9vOjpvdmVybG9hZDFhcmcgXFwodGhpcz0kaGV4LCBhcmc9NVxcKSBhdC4qJHNyY2ZpbGU6MTE0XHJcbjExNFxbXHQgXF0raW50IGZvbzo6b3ZlcmxvYWQxYXJnIFxcKHNob3J0IGFyZ1xcKS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgcGFzcyAiY29udGludWUgdG8gYnAgb3ZlcmxvYWRlZCA6IHNob3J0IgorICAgICAgICB9CisgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb250aW51ZSB0byBicCBvdmVybG9hZGVkIDogc2hvcnQiICB9CisgICAgICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgY29udGludWUgdG8gYnAgb3ZlcmxvYWRlZCA6IHNob3J0IiAgfQorICAgIH0KKworCisgICAgc2VuZF9nZGIgImNvbnRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJDb250aW51aW5nLlxyXG5cclxuQnJlYWtwb2ludCAyMCwgZm9vOjpvdmVybG9hZDFhcmcgXFwodGhpcz0kaGV4LCBhcmc9NlxcKSBhdC4qJHNyY2ZpbGU6MTE1XHJcbjExNVxbXHQgXF0raW50IGZvbzo6b3ZlcmxvYWQxYXJnIFxcKHVuc2lnbmVkIHNob3J0IGFyZ1xcKS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgcGFzcyAiY29udGludWUgdG8gYnAgb3ZlcmxvYWRlZCA6IHVuc2lnbmVkIHNob3J0IgorICAgICAgICB9CisgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb250aW51ZSB0byBicCBvdmVybG9hZGVkIDogdW5zaWduZWQgc2hvcnQiICB9CisgICAgICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgY29udGludWUgdG8gYnAgb3ZlcmxvYWRlZCA6IHVuc2lnbmVkIHNob3J0IiAgfQorICAgIH0KKworCisgICAgc2VuZF9nZGIgImNvbnRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJDb250aW51aW5nLlxyXG5cclxuQnJlYWtwb2ludCAxOSwgZm9vOjpvdmVybG9hZDFhcmcgXFwodGhpcz0kaGV4LCBhcmc9N1xcKSBhdC4qJHNyY2ZpbGU6MTE2XHJcbjExNlxbXHQgXF0raW50IGZvbzo6b3ZlcmxvYWQxYXJnIFxcKGludCBhcmdcXCkuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIHBhc3MgImNvbnRpbnVlIHRvIGJwIG92ZXJsb2FkZWQgOiBpbnQiCisgICAgICAgIH0KKyAgICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbnRpbnVlIHRvIGJwIG92ZXJsb2FkZWQgOiBpbnQiICB9CisgICAgICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgY29udGludWUgdG8gYnAgb3ZlcmxvYWRlZCA6IGludCIgIH0KKyAgICB9CisKKworICAgIHNlbmRfZ2RiICJjb250XG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAiQ29udGludWluZy5cclxuXHJcbkJyZWFrcG9pbnQgMTgsIGZvbzo6b3ZlcmxvYWQxYXJnIFxcKHRoaXM9JGhleCwgYXJnPThcXCkgYXQuKiRzcmNmaWxlOjExN1xyXG4xMTdcW1x0IFxdK2ludCBmb286Om92ZXJsb2FkMWFyZyBcXCh1bnNpZ25lZCBpbnQgYXJnXFwpLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBwYXNzICJjb250aW51ZSB0byBicCBvdmVybG9hZGVkIDogdW5zaWduZWQgaW50IgorICAgICAgICB9CisgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb250aW51ZSB0byBicCBvdmVybG9hZGVkIDogdW5zaWduZWQgaW50IiAgfQorICAgICAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGNvbnRpbnVlIHRvIGJwIG92ZXJsb2FkZWQgOiB1bnNpZ25lZCBpbnQiICB9CisgICAgfQorCisKKyAgICBzZW5kX2dkYiAiY29udFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIkNvbnRpbnVpbmcuXHJcblxyXG5CcmVha3BvaW50IDE3LCBmb286Om92ZXJsb2FkMWFyZyBcXCh0aGlzPSRoZXgsIGFyZz05XFwpIGF0Liokc3JjZmlsZToxMThcclxuMTE4XFtcdCBcXStpbnQgZm9vOjpvdmVybG9hZDFhcmcgXFwobG9uZyBhcmdcXCkuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIHBhc3MgImNvbnRpbnVlIHRvIGJwIG92ZXJsb2FkZWQgOiBsb25nIgorICAgICAgICB9CisgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb250aW51ZSB0byBicCBvdmVybG9hZGVkIDogbG9uZyIgIH0KKyAgICAgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb250aW51ZSB0byBicCBvdmVybG9hZGVkIDogbG9uZyIgIH0KKyAgICB9CisKKworICAgIHNlbmRfZ2RiICJjb250XG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAiQ29udGludWluZy5cclxuXHJcbkJyZWFrcG9pbnQgMTYsIGZvbzo6b3ZlcmxvYWQxYXJnIFxcKHRoaXM9JGhleCwgYXJnPTEwXFwpIGF0Liokc3JjZmlsZToxMTlcclxuMTE5XFtcdCBcXStpbnQgZm9vOjpvdmVybG9hZDFhcmcgXFwodW5zaWduZWQgbG9uZyBhcmdcXCkuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIHBhc3MgImNvbnRpbnVlIHRvIGJwIG92ZXJsb2FkZWQgOiB1bnNpZ25lZCBsb25nIgorICAgICAgICB9CisgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb250aW51ZSB0byBicCBvdmVybG9hZGVkIDogdW5zaWduZWQgbG9uZyIgIH0KKyAgICAgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb250aW51ZSB0byBicCBvdmVybG9hZGVkIDogdW5zaWduZWQgbG9uZyIgIH0KKyAgICB9CisKKworICAgIHNlbmRfZ2RiICJjb250XG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAiQ29udGludWluZy5cclxuXHJcbkJyZWFrcG9pbnQgMTUsIGZvbzo6b3ZlcmxvYWQxYXJnIFxcKHRoaXM9JGhleCwgYXJnPTEwMFxcKSBhdC4qJHNyY2ZpbGU6MTIwXHJcbjEyMFxbXHQgXF0raW50IGZvbzo6b3ZlcmxvYWQxYXJnIFxcKGZsb2F0IGFyZ1xcKS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgcGFzcyAiY29udGludWUgdG8gYnAgb3ZlcmxvYWRlZCA6IGZsb2F0IgorICAgICAgICB9CisgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb250aW51ZSB0byBicCBvdmVybG9hZGVkIDogZmxvYXQiICB9CisgICAgICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgY29udGludWUgdG8gYnAgb3ZlcmxvYWRlZCA6IGZsb2F0IiAgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJjb250XG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAiQ29udGludWluZy5cclxuXHJcbkJyZWFrcG9pbnQgMTQsIGZvbzo6b3ZlcmxvYWQxYXJnIFxcKHRoaXM9JGhleCwgYXJnPTIwMFxcKSBhdC4qJHNyY2ZpbGU6MTIxXHJcbjEyMVxbXHQgXF0raW50IGZvbzo6b3ZlcmxvYWQxYXJnIFxcKGRvdWJsZSBhcmdcXCkuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIHBhc3MgImNvbnRpbnVlIHRvIGJwIG92ZXJsb2FkZWQgOiBkb3VibGUiCisgICAgICAgIH0KKyAgICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbnRpbnVlIHRvIGJwIG92ZXJsb2FkZWQgOiBkb3VibGUiICB9CisgICAgICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgY29udGludWUgdG8gYnAgb3ZlcmxvYWRlZCA6IGRvdWJsZSIgIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAiY29udFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIkNvbnRpbnVpbmcuXHJcblxyXG5Qcm9ncmFtIGV4aXRlZCBub3JtYWxseS5cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgcGFzcyAiZmluaXNoIHByb2dyYW0iCisgICAgICAgIH0KKyAgICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImZpbmlzaCBwcm9ncmFtIiAgfQorICAgICAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGZpbmlzaCBwcm9ncmFtIiAgfQorICAgIH0KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9yZWYtdHlwZXMuY2MgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvcmVmLXR5cGVzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZTVjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvcmVmLXR5cGVzLmNjCkBAIC0wLDAgKzEsMzAgQEAKK3ZvaWQgbWFya2VyMSAodm9pZCkKK3sKKyAgICAKK30KKworCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgc2hvcnQgczsKKyAgICBzaG9ydCAmcnMgPSBzOworICAgIHNob3J0ICpwczsKKyAgICBzaG9ydCAqJnJwcyA9IHBzOworICAgIHNob3J0IGFzWzRdOworICAgIHNob3J0ICgmcmFzKVs0XSA9IGFzOworICAgIHMgPSAtMTsKKyAgICBwcyA9ICZzOworICAgIGFzWzBdID0gMDsKKyAgICBhc1sxXSA9IDE7CisgICAgYXNbMl0gPSAyOworICAgIGFzWzNdID0gMzsKKworICAgI2lmZGVmIHVzZXN0dWJzCisgICAgICAgc2V0X2RlYnVnX3RyYXBzKCk7CisgICAgICAgYnJlYWtwb2ludCgpOworICAgICNlbmRpZgorICAgIG1hcmtlcjEoKTsKKyAKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9yZWYtdHlwZXMuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL3JlZi10eXBlcy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YyNTU5MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9yZWYtdHlwZXMuZXhwCkBAIC0wLDAgKzEsMjc2IEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyB3cml0dGVuIGJ5IEVsZW5hIFphbm5vbmkgKGV6YW5ub25pQGN5Z251cy5jb20pCisKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGdkYiB0ZXN0c3VpdGUKKyMKKyMgdGVzdHMgZm9yIHJlZmVyZW5jZSB0eXBlcworIyB3aXRoIHNob3J0IHR5cGUgdmFyaWFibGVzLgorIyAKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisgICAgICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorICAgICAgICB9CisKKyMKKyMgdGVzdCBydW5uaW5nIHByb2dyYW1zCisjCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJyZWYtdHlwZXMiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIGMrK31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKKworIworIyBzZXQgaXQgdXAgYXQgYSBicmVha3BvaW50IHNvIHdlIGNhbiBwbGF5IHdpdGggdGhlIHZhcmlhYmxlIHZhbHVlcworIworaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgICBwZXJyb3IgImNvdWxkbid0IHJ1biB0byBicmVha3BvaW50IgorICAgIGNvbnRpbnVlCit9CisKK3NlbmRfZ2RiICJicmVhayBtYXJrZXIxXG4iIDsgZ2RiX2V4cGVjdCAtcmUgIi4qJGdkYl9wcm9tcHQgJCIKKworICAgIHNlbmRfZ2RiICJjb250XG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAiQnJlYWsuKiBtYXJrZXIxIFxcKFxcKSBhdCAuKjokZGVjaW1hbC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgc2VuZF9nZGIgInVwXG4iCisgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIge30KKyAgICAgICAgICAgICAgICB0aW1lb3V0IHsgZmFpbCAidXAgZnJvbSBtYXJrZXIxIiB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbnRpbnVlIHRvIG1hcmtlcjEiICB9CisgICAgICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgY29udGludWUgdG8gbWFya2VyMSIgIH0KKyAgICB9CisKKworcHJvYyBnZGJfc3RhcnRfYWdhaW4ge30geworZ2xvYmFsIHNyY2RpcgorZ2xvYmFsIHN1YmRpcgorZ2xvYmFsIGJpbmZpbGUKK2dsb2JhbCBnZGJfcHJvbXB0CitnbG9iYWwgZGVjaW1hbAorCitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCitzb3VyY2UgJHtiaW5maWxlfS5jaQorCisjCisjIHNldCBpdCB1cCBhdCBhIGJyZWFrcG9pbnQgc28gd2UgY2FuIHBsYXkgd2l0aCB0aGUgdmFyaWFibGUgdmFsdWVzCisjCitpZiAhW3J1bnRvX21haW5dIHRoZW4geworICAgIHBlcnJvciAiY291bGRuJ3QgcnVuIHRvIGJyZWFrcG9pbnQiCisgICAgY29udGludWUKK30KKworc2VuZF9nZGIgImJyZWFrIG1hcmtlcjFcbiIgOyBnZGJfZXhwZWN0IC1yZSAiLiokZ2RiX3Byb21wdCAkIgorCisgICAgc2VuZF9nZGIgImNvbnRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJCcmVhay4qIG1hcmtlcjEgXFwoXFwpIGF0IC4qOiRkZWNpbWFsLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBzZW5kX2dkYiAidXBcbiIKKyAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorICAgICAgICAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJ1cCBmcm9tIG1hcmtlcjEiIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29udGludWUgdG8gbWFya2VyMSIgIH0KKyAgICAgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb250aW51ZSB0byBtYXJrZXIxIiAgfQorICAgIH0KK30KKworCisKKworCitzZW5kX2dkYiAicHJpbnQgc1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAtMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBzIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHMiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBzIiB9CisgIH0KKworCitzZW5kX2dkYiAicHR5cGUgc1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gc2hvcnQuKiRnZGJfcHJvbXB0ICQiICB7IHBhc3MgInB0eXBlIHMiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBzIiB9CisgICAgdGltZW91dCAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBzIiB9Cit9CisKKworc2VuZF9nZGIgInByaW50ICpwc1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAtMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBwcyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiBwcyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHBzIiB9CisgIH0KKworCitzZW5kX2dkYiAicHR5cGUgcHNcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAidHlwZSA9IHNob3J0IFwqLiokZ2RiX3Byb21wdCAkIiAgeyBwYXNzICJwdHlwZSBwcyIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgIGZhaWwgInB0eXBlIHBzIiB9CisgICAgdGltZW91dCAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBwcyIgfQorfQorCitzZW5kX2dkYiAicHJpbnQgYXNcWzBcXVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAwLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIGFzXFswXF0iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgYXNcWzBcXSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIGFzXFswXF0iIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwdHlwZSBhc1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gc2hvcnQgXFxcWzRcXFxdLiokZ2RiX3Byb21wdCAkIiAgeyBwYXNzICJwdHlwZSBhcyIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgIGZhaWwgInB0eXBlIGFzIiB9CisgICAgdGltZW91dCAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBhcyIgfQorfQorCitzZW5kX2dkYiAicHJpbnQgYXNcWzFcXVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAxLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIGFzXFsxXF0iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgYXNcWzFcXSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIGFzXFsxXF0iIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgYXNcWzJcXVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAyLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIGFzXFsyXF0iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgYXNcWzJcXSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIGFzXFsyXF0iIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgYXNcWzNcXVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAzLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIGFzXFszXF0iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgYXNcWzNcXSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIGFzXFszXF0iIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgcnNcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gXFwoc2hvcnQgJlxcKSBAJGhleDogLTEuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgcnMiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgcnMiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBycyIgfQorICAgIGVvZiB7IGZhaWwgInByaW50IHJzICgkR0RCIGR1bXBlZCBjb3JlKSAoRklYTUUpIiA7IGdkYl9zdGFydF9hZ2FpbiA7IH0KKworICB9CisKK3NlbmRfZ2RiICJwdHlwZSByc1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gc2hvcnQgJi4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgcnMiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBycyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgcnMiIH0KK30KKworCitzZW5kX2dkYiAicHJpbnQgKnJwc1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAtMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAqcnBzIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mICpycHMiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAqcnBzIiB9CisgIH0KKworCitzZW5kX2dkYiAicHR5cGUgcnBzXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSBzaG9ydCBcXComLiokZ2RiX3Byb21wdCAkIiAgeyBwYXNzICJwdHlwZSBycHMiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBycHMiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHJwcyIgfQorfQorCisKKworc2VuZF9nZGIgInByaW50IHJhc1xbMFxdXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgcmFzXFswXF0iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgcmFzXFswXF0iIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiByYXNcWzBcXSIgfQorICB9CisKKworc2VuZF9nZGIgInB0eXBlIHJhc1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gc2hvcnQgXFxcKCZcXFwpXFxcWzRcXFxdLiokZ2RiX3Byb21wdCAkIiAgeyBwYXNzICJwdHlwZSByYXMiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSByYXMiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHJhcyIgfQorfQorCitzZW5kX2dkYiAicHJpbnQgcmFzXFsxXF1cbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiByYXNcWzFcXSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiByYXNcWzFcXSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHJhc1xbMVxdIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IHJhc1xbMlxdXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgcmFzXFsyXF0iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgcmFzXFsyXF0iIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiByYXNcWzJcXSIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCByYXNcWzNcXVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAzLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHJhc1xbM1xdIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHJhc1xbM1xdIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgcmFzXFszXF0iIH0KKyAgfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL3JlZi10eXBlczIuY2MgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvcmVmLXR5cGVzMi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmM5ODJkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL3JlZi10eXBlczIuY2MKQEAgLTAsMCArMSw0NyBAQAoraW50IGYoKQoreworICAgIGludCBmMTsKKyAgICBmMSA9IDE7CisgICAgcmV0dXJuIGYxOworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIGNoYXIgQzsKKyAgICB1bnNpZ25lZCBjaGFyIFVDOworICAgIHNob3J0IFM7CisgICAgdW5zaWduZWQgc2hvcnQgVVM7CisgICAgaW50IEk7CisgICAgdW5zaWduZWQgaW50IFVJOworICAgIGxvbmcgTDsKKyAgICB1bnNpZ25lZCBsb25nIFVMOworICAgIGZsb2F0IEY7CisgICAgZG91YmxlIEQ7CisgICAgY2hhciAmckMgPSBDOworICAgIHVuc2lnbmVkIGNoYXIgJnJVQyA9IFVDOworICAgIHNob3J0ICZyUyA9IFM7CisgICAgdW5zaWduZWQgc2hvcnQgJnJVUyA9IFVTOworICAgIGludCAmckkgPSBJOworICAgIHVuc2lnbmVkIGludCAmclVJID0gVUk7CisgICAgbG9uZyAmckwgPSBMOworICAgIHVuc2lnbmVkIGxvbmcgJnJVTCA9IFVMOworICAgIGZsb2F0ICZyRiA9IEY7CisgICAgZG91YmxlICZyRCA9IEQ7CisgICAgQyA9ICdBJzsKKyAgICBVQyA9IDIxOworICAgIFMgPSAtMTQ7CisgICAgVVMgPSA3OworICAgIEkgPSAxMDI7CisgICAgVUkgPSAxMDAyOworICAgIEwgPSAtMjM0OworICAgIFVMID0gMjM0OworICAgIEYgPSAxLjI1RTEwOworICAgIEQgPSAtMS4zNzVFLTEyMzsKKyAgICBJID0gZigpOworICAgICNpZmRlZiB1c2VzdHVicworICAgICAgIHNldF9kZWJ1Z190cmFwcygpOworICAgICAgIGJyZWFrcG9pbnQoKTsKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gMDsKKyAgICAKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9yZWYtdHlwZXMyLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy9yZWYtdHlwZXMyLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzU0MTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL3JlZi10eXBlczIuZXhwCkBAIC0wLDAgKzEsNDUwIEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyB3cml0dGVuIGJ5IEVsZW5hIFphbm5vbmkgKGV6YW5ub25pQGN5Z251cy5jb20pCisKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGdkYiB0ZXN0c3VpdGUKKyMKKyMgdGVzdHMgZm9yIHJlZmVyZW5jZSB0eXBlcworIyB3aXRoIGVsZW1lbnRhcnkgdHlwZSB2YXJpYWJsZXMuCisjIAorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCisgICAgICAgIH0KKworIworIyB0ZXN0IHJ1bm5pbmcgcHJvZ3JhbXMKKyMKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgInJlZi10eXBlczIiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIGMrK31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKKworIworIyBzZXQgaXQgdXAgYXQgYSBicmVha3BvaW50IHNvIHdlIGNhbiBwbGF5IHdpdGggdGhlIHZhcmlhYmxlIHZhbHVlcworIworaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgICBwZXJyb3IgImNvdWxkbid0IHJ1biB0byBicmVha3BvaW50IgorICAgIGNvbnRpbnVlCit9CisKK3NlbmRfZ2RiICJicmVhayBmXG4iIDsgZ2RiX2V4cGVjdCAtcmUgIi4qJGdkYl9wcm9tcHQgJCIKKworICAgIHNlbmRfZ2RiICJjb250XG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAiQnJlYWsuKiBmIFxcKFxcKSBhdCAuKjokZGVjaW1hbC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgc2VuZF9nZGIgInVwXG4iCisgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIge30KKyAgICAgICAgICAgICAgICB0aW1lb3V0IHsgZmFpbCAidXAgZnJvbSBmIiB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbnRpbnVlIHRvIGYiICB9CisgICAgICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgY29udGludWUgdG8gZiIgIH0KKyAgICB9CisKKworc2VuZF9nZGIgInByaW50IENcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gNjUgXCdBXCcuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgQyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiBDIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgQyIgfQorICB9CisKKworc2VuZF9nZGIgInB0eXBlIENcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAidHlwZSA9IGNoYXIuKiRnZGJfcHJvbXB0ICQiICB7IHBhc3MgInB0eXBlIEMiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBDIiB9CisgICAgdGltZW91dCAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBDIiB9Cit9CisKKworc2VuZF9nZGIgInByaW50IFVDXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDIxICdcLjAyNSdcLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIFVDIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIFVDIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgVUMiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwdHlwZSBVQ1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gdW5zaWduZWQgY2hhci4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgVUMiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBVQyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgVUMiIH0KK30KKworCitzZW5kX2dkYiAicHJpbnQgU1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAtMTQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgUyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiBTIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgUyIgfQorICB9CisKKworc2VuZF9nZGIgInB0eXBlIFNcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAidHlwZSA9IHNob3J0LiokZ2RiX3Byb21wdCAkIiAgeyBwYXNzICJwdHlwZSBTIiB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgeyAgZmFpbCAicHR5cGUgUyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgUyIgfQorfQorCisKK3NlbmRfZ2RiICJwcmludCBVU1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSA3LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIFVTIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIFVTIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgVVMiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwdHlwZSBVU1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gdW5zaWduZWQgc2hvcnQuKiRnZGJfcHJvbXB0ICQiICB7IHBhc3MgInB0eXBlIFVTIiB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgeyAgZmFpbCAicHR5cGUgVVMiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIFVTIiB9Cit9CisKKworc2VuZF9nZGIgInByaW50IElcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMTAyLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIEkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgSSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIEkiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwdHlwZSBJXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSBpbnQuKiRnZGJfcHJvbXB0ICQiICB7IHBhc3MgInB0eXBlIEkiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBJIiB9CisgICAgdGltZW91dCAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBJIiB9Cit9CisKKworc2VuZF9nZGIgInByaW50IFVJXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IDEwMDIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgVUkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgVUkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBVSSIgfQorICB9CisKKworc2VuZF9nZGIgInB0eXBlIFVJXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSB1bnNpZ25lZCBpbnQuKiRnZGJfcHJvbXB0ICQiICB7IHBhc3MgInB0eXBlIFVJIiB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgeyAgZmFpbCAicHR5cGUgVUkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIFVJIiB9Cit9CisKKworc2VuZF9nZGIgInByaW50IExcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gLTIzNC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBMIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIEwiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBMIiB9CisgIH0KKworCitzZW5kX2dkYiAicHR5cGUgTFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gbG9uZy4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgTCIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgIGZhaWwgInB0eXBlIEwiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIEwiIH0KK30KKworCitzZW5kX2dkYiAicHJpbnQgVUxcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gMjM0LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIFVMIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIFVMIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgVUwiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwdHlwZSBVTFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gdW5zaWduZWQgbG9uZy4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgVUwiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSBVTCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgVUwiIH0KK30KKworCitzZW5kX2dkYiAicHJpbnQgRlxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAxLjJcWzAtOVxdKmVcXCsxMC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBGIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIEYiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBGIiB9CisgIH0KKworCisKK3NlbmRfZ2RiICJwdHlwZSBGXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSBmbG9hdC4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgRiIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgIGZhaWwgInB0eXBlIEYiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIEYiIH0KK30KKworCitzZW5kX2dkYiAicHJpbnQgRFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSAtMS4zNzVlLTEyMy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBEIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIEQiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBEIiB9CisgIH0KKworCitzZW5kX2dkYiAicHR5cGUgRFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gZG91YmxlLiokZ2RiX3Byb21wdCAkIiAgeyBwYXNzICJwdHlwZSBEIiB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgeyAgZmFpbCAicHR5cGUgRCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgRCIgfQorfQorCisKKworIworIyB0ZXN0IHJlZmVyZW5jZSB0eXBlcworIworCisKKworCitzZW5kX2dkYiAicHR5cGUgckNcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAidHlwZSA9IGNoYXIgJi4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgckMiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSByQyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgckMiIH0KK30KKworCisKKworc2VuZF9nZGIgInB0eXBlIHJVQ1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gdW5zaWduZWQgY2hhciAmLiokZ2RiX3Byb21wdCAkIiAgeyBwYXNzICJwdHlwZSByVUMiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSByVUMiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHJVQyIgfQorfQorCisKKworc2VuZF9nZGIgInB0eXBlIHJTXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSBzaG9ydCAmLiokZ2RiX3Byb21wdCAkIiAgeyBwYXNzICJwdHlwZSByUyIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgIGZhaWwgInB0eXBlIHJTIiB9CisgICAgdGltZW91dCAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSByUyIgfQorfQorCisKKworc2VuZF9nZGIgInB0eXBlIHJVU1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gdW5zaWduZWQgc2hvcnQgJi4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgclVTIiB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgeyAgZmFpbCAicHR5cGUgclVTIiB9CisgICAgdGltZW91dCAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSByVVMiIH0KK30KKworCitzZW5kX2dkYiAicHR5cGUgcklcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAidHlwZSA9IGludCAmLiokZ2RiX3Byb21wdCAkIiAgeyBwYXNzICJwdHlwZSBySSIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgIGZhaWwgInB0eXBlIHJJIiB9CisgICAgdGltZW91dCAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBySSIgfQorfQorCisKKworc2VuZF9nZGIgInB0eXBlIHJVSVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gdW5zaWduZWQgaW50ICYuKiRnZGJfcHJvbXB0ICQiICB7IHBhc3MgInB0eXBlIHJVSSIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgIGZhaWwgInB0eXBlIHJVSSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgclVJIiB9Cit9CisKKworCitzZW5kX2dkYiAicHR5cGUgckxcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAidHlwZSA9IGxvbmcgJi4qJGdkYl9wcm9tcHQgJCIgIHsgcGFzcyAicHR5cGUgckwiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICB7ICBmYWlsICJwdHlwZSByTCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgckwiIH0KK30KKworCitzZW5kX2dkYiAicHR5cGUgclVMXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSB1bnNpZ25lZCBsb25nICYuKiRnZGJfcHJvbXB0ICQiICB7IHBhc3MgInB0eXBlIHJVTCIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgIGZhaWwgInB0eXBlIHJVTCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgclVMIiB9Cit9CisKKworc2VuZF9nZGIgInB0eXBlIHJGXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgInR5cGUgPSBmbG9hdCAmLiokZ2RiX3Byb21wdCAkIiAgeyBwYXNzICJwdHlwZSByRiIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgIGZhaWwgInB0eXBlIHJGIiB9CisgICAgdGltZW91dCAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSByRiIgfQorfQorCisKK3NlbmRfZ2RiICJwdHlwZSByRFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJ0eXBlID0gZG91YmxlICYuKiRnZGJfcHJvbXB0ICQiICB7IHBhc3MgInB0eXBlIHJEIiB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgeyAgZmFpbCAicHR5cGUgckQiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHJEIiB9Cit9CisKKworc2VuZF9nZGIgInByaW50IHJDXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IFxcKGNoYXIgJlxcKSBAJGhleDogNjUgXCdBXCcuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgckMiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgckMiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiByQyIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IHJVQ1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSBcXCh1bnNpZ25lZCBjaGFyICZcXCkgQCRoZXg6IDIxIFwnLjAyNVwnLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHJVQyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiByVUMiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiByVUMiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCByU1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSBcXChzaG9ydCAmXFwpIEAkaGV4OiAtMTQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgclMiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgclMiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiByUyIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IHJVU1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSBcXCh1bnNpZ25lZCBzaG9ydCAmXFwpIEAkaGV4OiA3LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHJVUyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiByVVMiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiByVVMiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCBySVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSBcXChpbnQgJlxcKSBAJGhleDogMTAyLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHJJIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHJJIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgckkiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCByVUlcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gXFwodW5zaWduZWQgaW50ICZcXCkgQCRoZXg6IDEwMDIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgVUkiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgclVJIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgclVJIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgckxcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gXFwobG9uZyAmXFwpIEAkaGV4OiAtMjM0LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIHJMIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIHJMIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgckwiIH0KKyAgfQorCisKKworc2VuZF9nZGIgInByaW50IHJVTFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuXFswLTlcXSogPSBcXCh1bnNpZ25lZCBsb25nICZcXCkgQCRoZXg6IDIzNC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiByVUwiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgclVMIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgclVMIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgckZcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLlxbMC05XF0qID0gXFwoZmxvYXQgJlxcKSBAJGhleDogMS4yXFswLTlcXSplXFwrMTAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgckYiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgckYiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiByRiIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IHJEXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi5cWzAtOVxdKiA9IFxcKGRvdWJsZSAmXFwpIEAkaGV4OiAtMS4zNzVlLTEyMy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiByRCIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiByRCIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHJEIiB9CisgIH0KKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL3RlbXBsYXRlcy5jYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy90ZW1wbGF0ZXMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyNDFkYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy90ZW1wbGF0ZXMuY2MKQEAgLTAsMCArMSw3ODUgQEAKKy8qIFRoaXMgdGVzdCBjb2RlIGlzIGZyb20gV2VuZGVsbCBCYWtlciAod2Jha2VyQGNvbWV0LmJlcmtlbGV5LmVkdSkgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitpbnQgYV9pOworY2hhciBhX2M7Citkb3VibGUgYV9kOworCit0eXBlZGVmIHZvaWQgKlBpeDsKKworaW50CitmKGludCBpKQoreyByZXR1cm4gMDsgfQorCitpbnQKK2YoaW50IGksIGNoYXIgYykKK3sgcmV0dXJuIDA7IH0KKworaW50CitmKGludCBpLCBjaGFyIGMsIGRvdWJsZSBkKQoreyByZXR1cm4gMDsgfQorCitpbnQKK2YoaW50IGksIGNoYXIgYywgZG91YmxlIGQsIGNoYXIgKmNzKQoreyByZXR1cm4gMDsgfQorCitpbnQKK2YoaW50IGksIGNoYXIgYywgZG91YmxlIGQsIGNoYXIgKmNzLCB2b2lkICgqZmlnKShpbnQsIGNoYXIpKQoreyByZXR1cm4gMDsgfQorCitpbnQKK2YoaW50IGksIGNoYXIgYywgZG91YmxlIGQsIGNoYXIgKmNzLCB2b2lkICgqZmlnKShjaGFyLCBpbnQpKQoreyByZXR1cm4gMDsgfQorCitjbGFzcyBSIHsKK3B1YmxpYzoKKyAgICBpbnQgaTsKK307CitjbGFzcyBTIHsKK3B1YmxpYzoKKyAgICBpbnQgaTsKK307CitjbGFzcyBUIHsKK3B1YmxpYzoKKyAgICBpbnQgaTsKK307CisKK2NoYXIgZyhjaGFyLCBjb25zdCBjaGFyLCB2b2xhdGlsZSBjaGFyKQoreyByZXR1cm4gJ2MnOyB9CitjaGFyIGcoUiwgY2hhciYsIGNvbnN0IGNoYXImLCB2b2xhdGlsZSBjaGFyJikKK3sgcmV0dXJuICdjJzsgfQorY2hhciBnKGNoYXIqLCBjb25zdCBjaGFyKiwgdm9sYXRpbGUgY2hhciopCit7IHJldHVybiAnYyc7IH0KK2NoYXIgZyhTLCBjaGFyKiYsIGNvbnN0IGNoYXIqJiwgdm9sYXRpbGUgY2hhciomKQoreyByZXR1cm4gJ2MnOyB9CisKK3NpZ25lZCBjaGFyIGcoVCxzaWduZWQgY2hhciwgY29uc3Qgc2lnbmVkIGNoYXIsIHZvbGF0aWxlIHNpZ25lZCBjaGFyKQoreyByZXR1cm4gJ2MnOyB9CitzaWduZWQgY2hhciBnKFQsIFIsIHNpZ25lZCBjaGFyJiwgY29uc3Qgc2lnbmVkIGNoYXImLCB2b2xhdGlsZSBzaWduZWQgY2hhciYpCit7IHJldHVybiAnYyc7IH0KK3NpZ25lZCBjaGFyIGcoVCwgc2lnbmVkIGNoYXIqLCBjb25zdCBzaWduZWQgY2hhciosIHZvbGF0aWxlIHNpZ25lZCBjaGFyKikKK3sgcmV0dXJuICdjJzsgfQorc2lnbmVkIGNoYXIgZyhULCBTLCBzaWduZWQgY2hhciomLCBjb25zdCBzaWduZWQgY2hhciomLCB2b2xhdGlsZSBzaWduZWQgY2hhciomKQoreyByZXR1cm4gJ2MnOyB9CisKK3Vuc2lnbmVkIGNoYXIgZyh1bnNpZ25lZCBjaGFyLCBjb25zdCB1bnNpZ25lZCBjaGFyLCB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKQoreyByZXR1cm4gJ2MnOyB9Cit1bnNpZ25lZCBjaGFyIGcoUiwgdW5zaWduZWQgY2hhciYsIGNvbnN0IHVuc2lnbmVkIGNoYXImLCB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyJikKK3sgcmV0dXJuICdjJzsgfQordW5zaWduZWQgY2hhciBnKHVuc2lnbmVkIGNoYXIqLCBjb25zdCB1bnNpZ25lZCBjaGFyKiwgdm9sYXRpbGUgdW5zaWduZWQgY2hhciopCit7IHJldHVybiAnYyc7IH0KK3Vuc2lnbmVkIGNoYXIgZyhTLCB1bnNpZ25lZCBjaGFyKiYsIGNvbnN0IHVuc2lnbmVkIGNoYXIqJiwgdm9sYXRpbGUgdW5zaWduZWQgY2hhciomKQoreyByZXR1cm4gJ2MnOyB9CisKK3Nob3J0IGcoc2hvcnQsIGNvbnN0IHNob3J0LCB2b2xhdGlsZSBzaG9ydCkKK3sgcmV0dXJuIDA7IH0KK3Nob3J0IGcoUiwgc2hvcnQmLCBjb25zdCBzaG9ydCYsIHZvbGF0aWxlIHNob3J0JikKK3sgcmV0dXJuIDA7IH0KK3Nob3J0IGcoc2hvcnQqLCBjb25zdCBzaG9ydCosIHZvbGF0aWxlIHNob3J0KikKK3sgcmV0dXJuIDA7IH0KK3Nob3J0IGcoUywgc2hvcnQqJiwgY29uc3Qgc2hvcnQqJiwgdm9sYXRpbGUgc2hvcnQqJikKK3sgcmV0dXJuIDA7IH0KKworc2lnbmVkIHNob3J0IGcoVCwgc2lnbmVkIHNob3J0LCBjb25zdCBzaWduZWQgc2hvcnQsIHZvbGF0aWxlIHNpZ25lZCBzaG9ydCkKK3sgcmV0dXJuIDA7IH0KK3NpZ25lZCBzaG9ydCBnKFQsIFIsIHNpZ25lZCBzaG9ydCYsIGNvbnN0IHNpZ25lZCBzaG9ydCYsIHZvbGF0aWxlIHNpZ25lZCBzaG9ydCYpCit7IHJldHVybiAwOyB9CitzaWduZWQgc2hvcnQgZyhULCBzaWduZWQgc2hvcnQqLCBjb25zdCBzaWduZWQgc2hvcnQqLCB2b2xhdGlsZSBzaWduZWQgc2hvcnQqKQoreyByZXR1cm4gMDsgfQorc2lnbmVkIHNob3J0IGcoVCwgUywgZG91YmxlLCBzaWduZWQgc2hvcnQqJiwgY29uc3Qgc2lnbmVkIHNob3J0KiYsIHZvbGF0aWxlIHNpZ25lZCBzaG9ydComKQoreyByZXR1cm4gMDsgfQorCit1bnNpZ25lZCBzaG9ydCBnKHVuc2lnbmVkIHNob3J0LCBjb25zdCB1bnNpZ25lZCBzaG9ydCwgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQpCit7IHJldHVybiAwOyB9Cit1bnNpZ25lZCBzaG9ydCBnKFIsIHVuc2lnbmVkIHNob3J0JiwgY29uc3QgdW5zaWduZWQgc2hvcnQmLCB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCYpCit7IHJldHVybiAwOyB9Cit1bnNpZ25lZCBzaG9ydCBnKHVuc2lnbmVkIHNob3J0KiwgY29uc3QgdW5zaWduZWQgc2hvcnQqLCB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCopCit7IHJldHVybiAwOyB9Cit1bnNpZ25lZCBzaG9ydCBnKFMsIHVuc2lnbmVkIHNob3J0KiYsIGNvbnN0IHVuc2lnbmVkIHNob3J0KiYsIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0KiYpCit7IHJldHVybiAwOyB9CisKK2ludCBnKGludCwgY29uc3QgaW50LCB2b2xhdGlsZSBpbnQpCit7IHJldHVybiAwOyB9CitpbnQgZyhSLCBpbnQmLCBjb25zdCBpbnQmLCB2b2xhdGlsZSBpbnQmKQoreyByZXR1cm4gMDsgfQoraW50IGcoaW50KiwgY29uc3QgaW50Kiwgdm9sYXRpbGUgaW50KikKK3sgcmV0dXJuIDA7IH0KK2ludCBnKFMsIGludComLCBjb25zdCBpbnQqJiwgdm9sYXRpbGUgaW50KiYpCit7IHJldHVybiAwOyB9CisKK3NpZ25lZCBpbnQgZyhULCBzaWduZWQgaW50LCBjb25zdCBzaWduZWQgaW50LCB2b2xhdGlsZSBzaWduZWQgaW50KQoreyByZXR1cm4gMDsgfQorc2lnbmVkIGludCBnKFQsIFIsIHNpZ25lZCBpbnQmLCBjb25zdCBzaWduZWQgaW50Jiwgdm9sYXRpbGUgc2lnbmVkIGludCYpCit7IHJldHVybiAwOyB9CitzaWduZWQgaW50IGcoVCwgc2lnbmVkIGludCosIGNvbnN0IHNpZ25lZCBpbnQqLCB2b2xhdGlsZSBzaWduZWQgaW50KikKK3sgcmV0dXJuIDA7IH0KK3NpZ25lZCBpbnQgZyhULCBTLCBzaWduZWQgaW50KiYsIGNvbnN0IHNpZ25lZCBpbnQqJiwgdm9sYXRpbGUgc2lnbmVkIGludComKQoreyByZXR1cm4gMDsgfQorCit1bnNpZ25lZCBpbnQgZyh1bnNpZ25lZCBpbnQsIGNvbnN0IHVuc2lnbmVkIGludCwgdm9sYXRpbGUgdW5zaWduZWQgaW50KQoreyByZXR1cm4gMDsgfQordW5zaWduZWQgaW50IGcoUiwgdW5zaWduZWQgaW50JiwgY29uc3QgdW5zaWduZWQgaW50Jiwgdm9sYXRpbGUgdW5zaWduZWQgaW50JikKK3sgcmV0dXJuIDA7IH0KK3Vuc2lnbmVkIGludCBnKHVuc2lnbmVkIGludCosIGNvbnN0IHVuc2lnbmVkIGludCosIHZvbGF0aWxlIHVuc2lnbmVkIGludCopCit7IHJldHVybiAwOyB9Cit1bnNpZ25lZCBpbnQgZyhTLCB1bnNpZ25lZCBpbnQqJiwgY29uc3QgdW5zaWduZWQgaW50KiYsIHZvbGF0aWxlIHVuc2lnbmVkIGludComKQoreyByZXR1cm4gMDsgfQorCitsb25nIGcobG9uZywgY29uc3QgbG9uZywgdm9sYXRpbGUgbG9uZykKK3sgcmV0dXJuIDA7IH0KK2xvbmcgZyhSLCBsb25nJiwgY29uc3QgbG9uZyYsIHZvbGF0aWxlIGxvbmcmKQoreyByZXR1cm4gMDsgfQorbG9uZyBnKGxvbmcqLCBjb25zdCBsb25nKiwgdm9sYXRpbGUgbG9uZyopCit7IHJldHVybiAwOyB9Citsb25nIGcoUywgbG9uZyomLCBjb25zdCBsb25nKiYsIHZvbGF0aWxlIGxvbmcqJikKK3sgcmV0dXJuIDA7IH0KKworc2lnbmVkIGxvbmcgZyhULCBzaWduZWQgbG9uZywgY29uc3Qgc2lnbmVkIGxvbmcsIHZvbGF0aWxlIHNpZ25lZCBsb25nKQoreyByZXR1cm4gMDsgfQorc2lnbmVkIGxvbmcgZyhULCBSLCBzaWduZWQgbG9uZyYsIGNvbnN0IHNpZ25lZCBsb25nJiwgdm9sYXRpbGUgc2lnbmVkIGxvbmcmKQoreyByZXR1cm4gMDsgfQorc2lnbmVkIGxvbmcgZyhULCBzaWduZWQgbG9uZyosIGNvbnN0IHNpZ25lZCBsb25nKiwgdm9sYXRpbGUgc2lnbmVkIGxvbmcqKQoreyByZXR1cm4gMDsgfQorc2lnbmVkIGxvbmcgZyhULCBTLCBzaWduZWQgbG9uZyomLCBjb25zdCBzaWduZWQgbG9uZyomLCB2b2xhdGlsZSBzaWduZWQgbG9uZyomKQoreyByZXR1cm4gMDsgfQorCit1bnNpZ25lZCBsb25nIGcodW5zaWduZWQgbG9uZywgY29uc3QgdW5zaWduZWQgbG9uZywgdm9sYXRpbGUgdW5zaWduZWQgbG9uZykKK3sgcmV0dXJuIDA7IH0KK3Vuc2lnbmVkIGxvbmcgZyhTLCB1bnNpZ25lZCBsb25nJiwgY29uc3QgdW5zaWduZWQgbG9uZyYsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcmKQoreyByZXR1cm4gMDsgfQordW5zaWduZWQgbG9uZyBnKHVuc2lnbmVkIGxvbmcqLCBjb25zdCB1bnNpZ25lZCBsb25nKiwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyopCit7IHJldHVybiAwOyB9Cit1bnNpZ25lZCBsb25nIGcoUywgdW5zaWduZWQgbG9uZyomLCBjb25zdCB1bnNpZ25lZCBsb25nKiYsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcqJikKK3sgcmV0dXJuIDA7IH0KKworI2lmZGVmIF9fR05VQ19fCitsb25nIGxvbmcgZyhsb25nIGxvbmcsIGNvbnN0IGxvbmcgbG9uZywgdm9sYXRpbGUgbG9uZyBsb25nKQoreyByZXR1cm4gMDsgfQorbG9uZyBsb25nIGcoUywgbG9uZyBsb25nJiwgY29uc3QgbG9uZyBsb25nJiwgdm9sYXRpbGUgbG9uZyBsb25nJikKK3sgcmV0dXJuIDA7IH0KK2xvbmcgbG9uZyBnKGxvbmcgbG9uZyosIGNvbnN0IGxvbmcgbG9uZyosIHZvbGF0aWxlIGxvbmcgbG9uZyopCit7IHJldHVybiAwOyB9Citsb25nIGxvbmcgZyhSLCBsb25nIGxvbmcqJiwgY29uc3QgbG9uZyBsb25nKiYsIHZvbGF0aWxlIGxvbmcgbG9uZyomKQoreyByZXR1cm4gMDsgfQorCitzaWduZWQgbG9uZyBsb25nIGcoVCwgc2lnbmVkIGxvbmcgbG9uZywgY29uc3Qgc2lnbmVkIGxvbmcgbG9uZywgdm9sYXRpbGUgc2lnbmVkIGxvbmcgbG9uZykKK3sgcmV0dXJuIDA7IH0KK3NpZ25lZCBsb25nIGxvbmcgZyhULCBSLCBzaWduZWQgbG9uZyBsb25nJiwgY29uc3Qgc2lnbmVkIGxvbmcgbG9uZyYsIHZvbGF0aWxlIHNpZ25lZCBsb25nIGxvbmcmKQoreyByZXR1cm4gMDsgfQorc2lnbmVkIGxvbmcgbG9uZyBnKFQsIHNpZ25lZCBsb25nIGxvbmcqLCBjb25zdCBzaWduZWQgbG9uZyBsb25nKiwgdm9sYXRpbGUgc2lnbmVkIGxvbmcgbG9uZyopCit7IHJldHVybiAwOyB9CitzaWduZWQgbG9uZyBsb25nIGcoVCwgUywgc2lnbmVkIGxvbmcgbG9uZyomLCBjb25zdCBzaWduZWQgbG9uZyBsb25nKiYsIHZvbGF0aWxlIHNpZ25lZCBsb25nIGxvbmcqJikKK3sgcmV0dXJuIDA7IH0KKwordW5zaWduZWQgbG9uZyBsb25nIGcodW5zaWduZWQgbG9uZyBsb25nLCBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbG9uZykKK3sgcmV0dXJuIDA7IH0KK3Vuc2lnbmVkIGxvbmcgbG9uZyBnKFIsIHVuc2lnbmVkIGxvbmcgbG9uZyosIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyosIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbG9uZyopCit7IHJldHVybiAwOyB9Cit1bnNpZ25lZCBsb25nIGxvbmcgZyh1bnNpZ25lZCBsb25nIGxvbmcmLCBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcmLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvbmcmKQoreyByZXR1cm4gMDsgfQordW5zaWduZWQgbG9uZyBsb25nIGcoUywgdW5zaWduZWQgbG9uZyBsb25nKiYsIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyomLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvbmcqJikKK3sgcmV0dXJuIDA7IH0KKyNlbmRpZgorCitmbG9hdCBnKGZsb2F0LCBjb25zdCBmbG9hdCwgdm9sYXRpbGUgZmxvYXQpCit7IHJldHVybiAwOyB9CitmbG9hdCBnKGNoYXIsIGZsb2F0JiwgY29uc3QgZmxvYXQmLCB2b2xhdGlsZSBmbG9hdCYpCit7IHJldHVybiAwOyB9CitmbG9hdCBnKGZsb2F0KiwgY29uc3QgZmxvYXQqLCB2b2xhdGlsZSBmbG9hdCopCit7IHJldHVybiAwOyB9CitmbG9hdCBnKGNoYXIsIGZsb2F0KiYsIGNvbnN0IGZsb2F0KiYsIHZvbGF0aWxlIGZsb2F0KiYpCit7IHJldHVybiAwOyB9CisKK2RvdWJsZSBnKGRvdWJsZSwgY29uc3QgZG91YmxlLCB2b2xhdGlsZSBkb3VibGUpCit7IHJldHVybiAwOyB9Citkb3VibGUgZyhjaGFyLCBkb3VibGUmLCBjb25zdCBkb3VibGUmLCB2b2xhdGlsZSBkb3VibGUmKQoreyByZXR1cm4gMDsgfQorZG91YmxlIGcoZG91YmxlKiwgY29uc3QgZG91YmxlKiwgdm9sYXRpbGUgZG91YmxlKikKK3sgcmV0dXJuIDA7IH0KK2RvdWJsZSBnKGNoYXIsIGRvdWJsZSomLCBjb25zdCBkb3VibGUqJiwgdm9sYXRpbGUgZG91YmxlKiYpCit7IHJldHVybiAwOyB9CisKKyNpZmRlZiBfX0dOVUNfXworbG9uZyBkb3VibGUgZyhsb25nIGRvdWJsZSwgY29uc3QgbG9uZyBkb3VibGUsIHZvbGF0aWxlIGxvbmcgZG91YmxlKQoreyByZXR1cm4gMDsgfQorbG9uZyBkb3VibGUgZyhjaGFyLCBsb25nIGRvdWJsZSYsIGNvbnN0IGxvbmcgZG91YmxlJiwgdm9sYXRpbGUgbG9uZyBkb3VibGUmKQoreyByZXR1cm4gMDsgfQorbG9uZyBkb3VibGUgZyhsb25nIGRvdWJsZSosIGNvbnN0IGxvbmcgZG91YmxlKiwgdm9sYXRpbGUgbG9uZyBkb3VibGUqKQoreyByZXR1cm4gMDsgfQorbG9uZyBkb3VibGUgZyhjaGFyLCBsb25nIGRvdWJsZSomLCBjb25zdCBsb25nIGRvdWJsZSomLCB2b2xhdGlsZSBsb25nIGRvdWJsZSomKQoreyByZXR1cm4gMDsgfQorI2VuZGlmCisKK2NsYXNzIGMgeworcHVibGljOgorICAgIGMoaW50KSB7fTsKKyAgICBpbnQgaTsKK307CisKK2NsYXNzIGMgZyhjLCBjb25zdCBjLCB2b2xhdGlsZSBjKQoreyByZXR1cm4gMDsgfQorYyBnKGNoYXIsIGMmLCBjb25zdCBjJiwgdm9sYXRpbGUgYyYpCit7IHJldHVybiAwOyB9CitjIGcoYyosIGNvbnN0IGMqLCB2b2xhdGlsZSBjKikKK3sgcmV0dXJuIDA7IH0KK2MgZyhjaGFyLCBjKiYsIGNvbnN0IGMqJiwgdm9sYXRpbGUgYyomKQoreyByZXR1cm4gMDsgfQorCisvKgordm9pZCBoKGNoYXIgPSAnYScpCit7IH0KK3ZvaWQgaChjaGFyLCBzaWduZWQgY2hhciA9ICdhJykKK3sgfQordm9pZCBoKHVuc2lnbmVkIGNoYXIgPSAnYScpCit7IH0KKyovCisvKgordm9pZCBoKGNoYXIgPSAoY2hhciknYScpCit7IH0KK3ZvaWQgaChjaGFyLCBzaWduZWQgY2hhciA9IChzaWduZWQgY2hhciknYScpCit7IH0KK3ZvaWQgaCh1bnNpZ25lZCBjaGFyID0gKHVuc2lnbmVkIGNoYXIpJ2EnKQoreyB9CisKKwordm9pZCBoKHNob3J0ID0gKHNob3J0KTQzKQoreyB9Cit2b2lkIGgoY2hhciwgc2lnbmVkIHNob3J0ID0gKHNpZ25lZCBzaG9ydCk0MykKK3sgfQordm9pZCBoKHVuc2lnbmVkIHNob3J0ID0gKHVuc2lnbmVkIHNob3J0KTQzKQoreyB9CisKK3ZvaWQgaChpbnQgPSAoaW50KTQzKQoreyB9Cit2b2lkIGgoY2hhciwgc2lnbmVkIGludCA9IChzaWduZWQgaW50KTQzKQoreyB9Cit2b2lkIGgodW5zaWduZWQgaW50ID0gKHVuc2lnbmVkIGludCk0MykKK3sgfQorCisKK3ZvaWQgaChsb25nID0gKGxvbmcpNDMpCit7IH0KK3ZvaWQgaChjaGFyLCBzaWduZWQgbG9uZyA9IChzaWduZWQgbG9uZyk0MykKK3sgfQordm9pZCBoKHVuc2lnbmVkIGxvbmcgPSAodW5zaWduZWQgbG9uZyk0MykKK3sgfQorCisjaWZkZWYgX19HTlVDX18KK3ZvaWQgaChsb25nIGxvbmcgPSA0MykKK3sgfQordm9pZCBoKGNoYXIsIHNpZ25lZCBsb25nIGxvbmcgPSA0MykKK3sgfQordm9pZCBoKHVuc2lnbmVkIGxvbmcgbG9uZyA9IDQzKQoreyB9CisjZW5kaWYKKwordm9pZCBoKGZsb2F0ID0gNC4zZS0xMCkKK3sgfQordm9pZCBoKGRvdWJsZSA9IDQuMykKK3sgfQorI2lmZGVmIF9fR05VQ19fCit2b2lkIGgobG9uZyBkb3VibGUgPSA0LjMzZTMzKQoreyB9CisjZW5kaWYKKyovCit2b2lkIHByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLiApCit7CisgICAgLy8gZWxpcHNpcworfQorCitjbGFzcyBUMSB7CitwdWJsaWM6CisgICAgc3RhdGljIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3QpOworICAgIHN0YXRpYyB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwb2ludGVyKTsKKworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFQxJik7CisgICAgVDEmIG9wZXJhdG9yPShpbnQpOworCisgICAgaW50IG9wZXJhdG9yPT0oaW50KSBjb25zdDsKKyAgICBpbnQgb3BlcmF0b3I9PShjb25zdCBUMSYpIGNvbnN0OworICAgIGludCBvcGVyYXRvciE9KGludCkgY29uc3Q7CisgICAgaW50IG9wZXJhdG9yIT0oY29uc3QgVDEmKSBjb25zdDsKKworICAgIGludCBvcGVyYXRvcjw9KGludCkgY29uc3Q7CisgICAgaW50IG9wZXJhdG9yPD0oY29uc3QgVDEmKSBjb25zdDsKKyAgICBpbnQgb3BlcmF0b3I8KGludCkgY29uc3Q7CisgICAgaW50IG9wZXJhdG9yPChjb25zdCBUMSYpIGNvbnN0OworICAgIGludCBvcGVyYXRvcj49KGludCkgY29uc3Q7CisgICAgaW50IG9wZXJhdG9yPj0oY29uc3QgVDEmKSBjb25zdDsKKyAgICBpbnQgb3BlcmF0b3I+KGludCkgY29uc3Q7CisgICAgaW50IG9wZXJhdG9yPihjb25zdCBUMSYpIGNvbnN0OworCisgICAgdm9pZCBvcGVyYXRvcisoaW50KSBjb25zdDsKKyAgICBUMSYgb3BlcmF0b3IrKGNvbnN0IFQxJikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvcis9KGludCkgY29uc3Q7CisgICAgVDEmIG9wZXJhdG9yKz0oY29uc3QgVDEmKSBjb25zdDsKKworICAgIFQxJiBvcGVyYXRvcisrKCkgY29uc3Q7CisKKyAgICB2b2lkIG9wZXJhdG9yLShpbnQpIGNvbnN0OworICAgIFQxJiBvcGVyYXRvci0oY29uc3QgVDEmKSBjb25zdDsKKyAgICB2b2lkIG9wZXJhdG9yLT0oaW50KSBjb25zdDsKKyAgICBUMSYgb3BlcmF0b3ItPShjb25zdCBUMSYpIGNvbnN0OworCisgICAgVDEmIG9wZXJhdG9yLS0oKSBjb25zdDsKKworICAgIHZvaWQgb3BlcmF0b3IqKGludCkgY29uc3Q7CisgICAgVDEmIG9wZXJhdG9yKihjb25zdCBUMSYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3IqPShpbnQpIGNvbnN0OworICAgIFQxJiBvcGVyYXRvcio9KGNvbnN0IFQxJikgY29uc3Q7CisKKyAgICB2b2lkIG9wZXJhdG9yLyhpbnQpIGNvbnN0OworICAgIFQxJiBvcGVyYXRvci8oY29uc3QgVDEmKSBjb25zdDsKKyAgICB2b2lkIG9wZXJhdG9yLz0oaW50KSBjb25zdDsKKyAgICBUMSYgb3BlcmF0b3IvPShjb25zdCBUMSYpIGNvbnN0OworCisgICAgdm9pZCBvcGVyYXRvciUoaW50KSBjb25zdDsKKyAgICBUMSYgb3BlcmF0b3IlKGNvbnN0IFQxJikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvciU9KGludCkgY29uc3Q7CisgICAgVDEmIG9wZXJhdG9yJT0oY29uc3QgVDEmKSBjb25zdDsKKworICAgIHZvaWQgb3BlcmF0b3ImJihpbnQpIGNvbnN0OworICAgIFQxJiBvcGVyYXRvciYmKGNvbnN0IFQxJikgY29uc3Q7CisKKyAgICB2b2lkIG9wZXJhdG9yfHwoaW50KSBjb25zdDsKKyAgICBUMSYgb3BlcmF0b3J8fChjb25zdCBUMSYpIGNvbnN0OworCisgICAgdm9pZCBvcGVyYXRvciYoaW50KSBjb25zdDsKKyAgICBUMSYgb3BlcmF0b3ImKGNvbnN0IFQxJikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvciY9KGludCkgY29uc3Q7CisgICAgVDEmIG9wZXJhdG9yJj0oY29uc3QgVDEmKSBjb25zdDsKKworICAgIHZvaWQgb3BlcmF0b3J8KGludCkgY29uc3Q7CisgICAgVDEmIG9wZXJhdG9yfChjb25zdCBUMSYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3J8PShpbnQpIGNvbnN0OworICAgIFQxJiBvcGVyYXRvcnw9KGNvbnN0IFQxJikgY29uc3Q7CisKKyAgICB2b2lkIG9wZXJhdG9yXihpbnQpIGNvbnN0OworICAgIFQxJiBvcGVyYXRvcl4oY29uc3QgVDEmKSBjb25zdDsKKyAgICB2b2lkIG9wZXJhdG9yXj0oaW50KSBjb25zdDsKKyAgICBUMSYgb3BlcmF0b3JePShjb25zdCBUMSYpIGNvbnN0OworCisgICAgVDEmIG9wZXJhdG9yISgpIGNvbnN0OworICAgIFQxJiBvcGVyYXRvcn4oKSBjb25zdDsKK307CisKK3ZvaWQqIAorVDE6Om9wZXJhdG9yIG5ldyhzaXplX3QpCit7IHJldHVybiAwOyB9CisKK3ZvaWQKK1QxOjpvcGVyYXRvciBkZWxldGUodm9pZCAqcG9pbnRlcikKK3sgfQorCitjbGFzcyBUMiB7CitwdWJsaWM6CisgICAgVDIoaW50IGkpOiBpbnRlZ2VyKGkpCisJeyB9CisgICAgaW50IGludGVnZXI7Cit9OworCitpbnQgb3BlcmF0b3I9PShjb25zdCBUMiYsIGNvbnN0IFQyJikKK3sgcmV0dXJuIDA7IH0KK2ludCBvcGVyYXRvcj09KGNvbnN0IFQyJiwgY2hhcikKK3sgcmV0dXJuIDA7IH0KK2ludCBvcGVyYXRvciE9KGNvbnN0IFQyJiwgY29uc3QgVDImKQoreyByZXR1cm4gMDsgfQoraW50IG9wZXJhdG9yIT0oY29uc3QgVDImLCBjaGFyKQoreyByZXR1cm4gMDsgfQorCitpbnQgb3BlcmF0b3I8PShjb25zdCBUMiYsIGNvbnN0IFQyJikKK3sgcmV0dXJuIDA7IH0KK2ludCBvcGVyYXRvcjw9KGNvbnN0IFQyJiwgY2hhcikKK3sgcmV0dXJuIDA7IH0KK2ludCBvcGVyYXRvcjwoY29uc3QgVDImLCBjb25zdCBUMiYpCit7IHJldHVybiAwOyB9CitpbnQgb3BlcmF0b3I8KGNvbnN0IFQyJiwgY2hhcikKK3sgcmV0dXJuIDA7IH0KK2ludCBvcGVyYXRvcj49KGNvbnN0IFQyJiwgY29uc3QgVDImKQoreyByZXR1cm4gMDsgfQoraW50IG9wZXJhdG9yPj0oY29uc3QgVDImLCBjaGFyKQoreyByZXR1cm4gMDsgfQoraW50IG9wZXJhdG9yPihjb25zdCBUMiYsIGNvbnN0IFQyJikKK3sgcmV0dXJuIDA7IH0KK2ludCBvcGVyYXRvcj4oY29uc3QgVDImLCBjaGFyKQoreyByZXR1cm4gMDsgfQorCitUMiBvcGVyYXRvcisoY29uc3QgVDIgdCwgaW50IGkpCit7IHJldHVybiB0LmludGVnZXIgKyBpOyB9CitUMiBvcGVyYXRvcisoY29uc3QgVDIgYSwgY29uc3QgVDImIGIpCit7IHJldHVybiBhLmludGVnZXIgKyBiLmludGVnZXI7IH0KK1QyJiBvcGVyYXRvcis9KFQyJiB0LCBpbnQgaSkKK3sgdC5pbnRlZ2VyICs9IGk7IHJldHVybiB0OyB9CitUMiYgb3BlcmF0b3IrPShUMiYgYSwgY29uc3QgVDImIGIpCit7IGEuaW50ZWdlciArPSBiLmludGVnZXI7IHJldHVybiBhOyB9CisKK1QyIG9wZXJhdG9yLShjb25zdCBUMiB0LCBpbnQgaSkKK3sgcmV0dXJuIHQuaW50ZWdlciAtIGk7IH0KK1QyIG9wZXJhdG9yLShjb25zdCBUMiBhLCBjb25zdCBUMiYgYikKK3sgcmV0dXJuIGEuaW50ZWdlciAtIGIuaW50ZWdlcjsgfQorVDImIG9wZXJhdG9yLT0oVDImIHQsIGludCBpKQoreyB0LmludGVnZXIgLT0gaTsgcmV0dXJuIHQ7IH0KK1QyJiBvcGVyYXRvci09KFQyJiBhLCBjb25zdCBUMiYgYikKK3sgYS5pbnRlZ2VyIC09IGIuaW50ZWdlcjsgcmV0dXJuIGE7IH0KKworVDIgb3BlcmF0b3IqKGNvbnN0IFQyIHQsIGludCBpKQoreyByZXR1cm4gdC5pbnRlZ2VyICogaTsgfQorVDIgb3BlcmF0b3IqKGNvbnN0IFQyIGEsIGNvbnN0IFQyJiBiKQoreyByZXR1cm4gYS5pbnRlZ2VyICogYi5pbnRlZ2VyOyB9CitUMiYgb3BlcmF0b3IqPShUMiYgdCwgaW50IGkpCit7IHQuaW50ZWdlciAqPSBpOyByZXR1cm4gdDsgfQorVDImIG9wZXJhdG9yKj0oVDImIGEsIGNvbnN0IFQyJiBiKQoreyBhLmludGVnZXIgKj0gYi5pbnRlZ2VyOyByZXR1cm4gYTsgfQorCitUMiBvcGVyYXRvci8oY29uc3QgVDIgdCwgaW50IGkpCit7IHJldHVybiB0LmludGVnZXIgLyBpOyB9CitUMiBvcGVyYXRvci8oY29uc3QgVDIgYSwgY29uc3QgVDImIGIpCit7IHJldHVybiBhLmludGVnZXIgLyBiLmludGVnZXI7IH0KK1QyJiBvcGVyYXRvci89KFQyJiB0LCBpbnQgaSkKK3sgdC5pbnRlZ2VyIC89IGk7IHJldHVybiB0OyB9CitUMiYgb3BlcmF0b3IvPShUMiYgYSwgY29uc3QgVDImIGIpCit7IGEuaW50ZWdlciAvPSBiLmludGVnZXI7IHJldHVybiBhOyB9CisKK1QyIG9wZXJhdG9yJShjb25zdCBUMiB0LCBpbnQgaSkKK3sgcmV0dXJuIHQuaW50ZWdlciAlIGk7IH0KK1QyIG9wZXJhdG9yJShjb25zdCBUMiBhLCBjb25zdCBUMiYgYikKK3sgcmV0dXJuIGEuaW50ZWdlciAlIGIuaW50ZWdlcjsgfQorVDImIG9wZXJhdG9yJT0oVDImIHQsIGludCBpKQoreyB0LmludGVnZXIgJT0gaTsgcmV0dXJuIHQ7IH0KK1QyJiBvcGVyYXRvciU9KFQyJiBhLCBjb25zdCBUMiYgYikKK3sgYS5pbnRlZ2VyICU9IGIuaW50ZWdlcjsgcmV0dXJuIGE7IH0KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NsYXNzIFQ1IHsKK3B1YmxpYzoKKyAgICBUNShpbnQpOworICAgIFQ1KGNvbnN0IFQ1PFQ+Jik7CisgICAgflQ1KCk7CisgICAgc3RhdGljIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3QpOworICAgIHN0YXRpYyB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwb2ludGVyKTsKKyAgICBpbnQgdmFsdWUoKTsKKyAgICAKKyAgICBzdGF0aWMgVCBYOworICAgIFQgeDsKKyAgICBpbnQgdmFsOworfTsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK1Q1PFQ+OjpUNShpbnQgdikKK3sgdmFsID0gdjsgfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorVDU8VD46OlQ1KGNvbnN0IFQ1PFQ+JikKK3t9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitUNTxUPjo6flQ1KCkKK3t9CisKK3RlbXBsYXRlPGNsYXNzIFQ+Cit2b2lkKgorVDU8VD46Om9wZXJhdG9yIG5ldyhzaXplX3QpCit7IHJldHVybiAwOyB9CisKK3RlbXBsYXRlPGNsYXNzIFQ+Cit2b2lkCitUNTxUPjo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKnBvaW50ZXIpCit7IH0KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2ludAorVDU8VD46OnZhbHVlKCkKK3sgcmV0dXJuIHZhbDsgfQorCisKKyNpZiAhIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoR0NDX0JVRykKK3RlbXBsYXRlPGNsYXNzIFQ+CitUIFQ1PFQ+OjpYOworI2VuZGlmCisKKworCisKK1Q1PGNoYXI+IHQ1YygxKTsKK1Q1PGludD4gdDVpKDIpOworVDU8aW50ICgqKShjaGFyLCB2b2lkICopPiB0NWZpMSgzKTsKK1Q1PGludCAoKikoaW50LCBkb3VibGUgKiosIHZvaWQgKik+IHQ1ZmkyKDQpOworCisgCisKKworCisKK2NsYXNzIHggeworcHVibGljOgorICAgIGludCAoKm1hbmFnZVs1XSkoZG91YmxlLAorCQkgICAgIHZvaWQgKigqbWFsbG9jKSh1bnNpZ25lZCBzaXplKSwKKwkJICAgICB2b2lkICgqZnJlZSkodm9pZCAqcG9pbnRlcikpOworICAgIGludCAoKmRldmljZVs1XSkoaW50IG9wZW4oY29uc3QgY2hhciAqLCB1bnNpZ25lZCBtb2RlLCB1bnNpZ25lZCBwZXJtcywgaW50IGV4dHJhID0gMCksIAorCQkgICAgIGludCAqKCpyZWFkKShpbnQgZmQsIHZvaWQgKnBsYWNlLCB1bnNpZ25lZCBzaXplKSwKKwkJICAgICBpbnQgKigqd3JpdGUpKGludCBmZCwgdm9pZCAqcGxhY2UsIHVuc2lnbmVkIHNpemUpLAorCQkgICAgIHZvaWQgKCpjbG9zZSkoaW50IGZkKSk7Cit9OworVDU8eD4gdDV4KDUpOworCisjaWYgIWRlZmluZWQoX19HTlVDX18pIHx8IChfX0dOVUNfXyA+PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDYpCit0ZW1wbGF0ZSBjbGFzcyBUNTxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIFQ1PGludD47Cit0ZW1wbGF0ZSBjbGFzcyBUNTxpbnQgKCopKGNoYXIsIHZvaWQgKik+OwordGVtcGxhdGUgY2xhc3MgVDU8aW50ICgqKShpbnQsIGRvdWJsZSAqKiwgdm9pZCAqKT47Cit0ZW1wbGF0ZSBjbGFzcyBUNTx4PjsKKyNlbmRpZgorCitjbGFzcyBUNyB7CitwdWJsaWM6CisgICAgc3RhdGljIGludCBnZXQoKTsKKyAgICBzdGF0aWMgdm9pZCBwdXQoaW50KTsKK307CisKK2ludAorVDc6OmdldCgpCit7IHJldHVybiAxOyB9CisKK3ZvaWQKK1Q3OjpwdXQoaW50IGkpCit7CisgICAgLy8gbm90aGluZworfQorCisvLyBNb3JlIHRlbXBsYXRlIGtpbmRzLiAgR0RCIDQuMTYgZGlkbid0IGhhbmRsZSB0aGVzZSwgYnV0CisvLyBXaWxkZWJlZXN0IGRvZXMuICBOb3RlOiBBc3N1bWluZyBIUCBhQ0MgaXMgdXNlZCB0byBjb21waWxlCisvLyB0aGlzIGZpbGU7IHdpdGggZysrIG9yIEhQIGNmcm9udCBvciBvdGhlciBjb21waWxlcnMgdGhlCisvLyBkZW1hbmdsaW5nIG1heSBub3QgZ2V0IGRvbmUgY29ycmVjdGx5LgorCisvLyBPcmRpbmFyeSB0ZW1wbGF0ZSwgdG8gYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IHR5cGVzCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2xhc3MgRm9vIHsKK3B1YmxpYzoKKyAgaW50IHg7CisgIFQgdDsKKyAgVCBmb28gKGludCwgVCk7Cit9OworCisKK3RlbXBsYXRlPGNsYXNzIFQ+IFQgRm9vPFQ+Ojpmb28gKGludCBpLCBUIHR0KQoreworICByZXR1cm4gdHQ7Cit9CisKKy8vIFRlbXBsYXRlIHdpdGggaW50IHBhcmFtZXRlcgorCit0ZW1wbGF0ZTxjbGFzcyBULCBpbnQgc3o+CitjbGFzcyBCYXIgeworcHVibGljOgorICBpbnQgeDsKKyAgVCB0OworICBUIGJhciAoaW50LCBUKTsKK307CisKKwordGVtcGxhdGU8Y2xhc3MgVCwgaW50IHN6PiBUIEJhcjxULCBzej46OmJhciAoaW50IGksIFQgdHQpCit7CisgIGlmIChpIDwgc3opCisgICAgcmV0dXJuIHR0OworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIGZ1bmN0aW9uIHRlbXBsYXRlIHdpdGggaW50IHBhcmFtZXRlcgordGVtcGxhdGU8Y2xhc3MgVD4gaW50IGR1bW15IChUIHR0LCBpbnQgaSkKK3sKKyAgcmV0dXJuIHR0OworfQorCisvLyBUZW1wbGF0ZSB3aXRoIHBhcnRpYWwgc3BlY2lhbGl6YXRpb25zCit0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDI+CitjbGFzcyBTcGVjIHsKK3B1YmxpYzoKKyAgaW50IHg7CisgIFQxIHNwZWMgKFQyKTsKK307CisKK3RlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBUMj4KK1QxIFNwZWM8VDEsIFQyPjo6c3BlYyAoVDIgdDIpCit7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2xhc3MgU3BlYzxULCBUKj4geworcHVibGljOgorICBpbnQgeDsKKyAgVCBzcGVjIChUKik7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBUPgorVCBTcGVjPFQsIFQqPjo6c3BlYyAoVCAqIHRwKQoreworICByZXR1cm4gKnRwOworfQorCisvLyBUZW1wbGF0ZSB3aXRoIGNoYXIgcGFyYW1ldGVyCit0ZW1wbGF0ZTxjbGFzcyBULCBjaGFyIHN6PgorY2xhc3MgQmF6IHsKK3B1YmxpYzoKKyAgaW50IHg7CisgIFQgdDsKKyAgVCBiYXogKGludCwgVCk7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBULCBjaGFyIHN6PiBUIEJhejxULCBzej46OmJheiAoaW50IGksIFQgdHQpCit7CisgIGlmIChpIDwgc3opCisgICAgcmV0dXJuIHR0OworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIFRlbXBsYXRlIHdpdGggY2hhciAqIHBhcmFtZXRlcgordGVtcGxhdGU8Y2xhc3MgVCwgY2hhciAqIHN6PgorY2xhc3MgUXV4IHsKK3B1YmxpYzoKKyAgaW50IHg7CisgIFQgdDsKKyAgVCBxdXggKGludCwgVCk7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBULCBjaGFyICogc3o+IFQgUXV4PFQsIHN6Pjo6cXV4IChpbnQgaSwgVCB0dCkKK3sKKyAgaWYgKHN6WzBdID09ICdxJykKKyAgICByZXR1cm4gdHQ7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLy8gVGVtcGxhdGUgd2l0aCBhIGZ1bmN0aW9uIHBvaW50ZXIgcGFyYW1ldGVyCit0ZW1wbGF0ZTxjbGFzcyBULCBpbnQgKCpmKShpbnQpID4KK2NsYXNzIFF1eDEgeworcHVibGljOgorICBpbnQgeDsKKyAgVCB0OworICBUIHF1eCAoaW50LCBUKTsKK307CisKK3RlbXBsYXRlPGNsYXNzIFQsIGludCAoKmYpKGludCk+IFQgUXV4MTxULCBmPjo6cXV4IChpbnQgaSwgVCB0dCkKK3sKKyAgaWYgKGYgIT0gMCkKKyAgICByZXR1cm4gdHQ7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLy8gU29tZSBmdW5jdGlvbnMgdG8gcHJvdmlkZSBhcyBhcmd1bWVudHMgdG8gdGVtcGxhdGUKK2ludCBnZjEgKGludCBhKSB7CisgIHJldHVybiBhICogMiArIDEzOworfQoraW50IGdmMiAoaW50IGEpIHsKKyAgcmV0dXJuIGEgKiAyICsgMjY7Cit9CisKK2NoYXIgc3RyaW5nWzNdOworCisKKy8vIFRlbXBsYXRlIGZvciBuZXN0ZWQgaW5zdGFudGlhdGlvbnMKKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NsYXNzIEdhcnBseSB7CitwdWJsaWM6CisgIGludCB4OworICBUIHQ7CisgIFQgZ2FycGx5IChpbnQsIFQpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gVCBHYXJwbHk8VD46OmdhcnBseSAoaW50IGksIFQgdHQpCit7CisgIGlmIChpID4geCkKKyAgICByZXR1cm4gdHQ7CisgIGVsc2UKKyAgICB7CisgICAgICB4ICs9IGk7CisgICAgICByZXR1cm4gdHQ7CisgICAgfQorfQorCisKK2ludCBtYWluKCkKK3sKKyAgICBpbnQgaTsKKyNpZmRlZiB1c2VzdHVicworICAgIHNldF9kZWJ1Z190cmFwcygpOworICAgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICAgIGkgPSBpICsgMTsKKworICAgIC8vIE5ldyB0ZXN0cyBhZGRlZCBoZXJlCisKKyAgRm9vPGludD4gZmludDsKKyAgRm9vPGNoYXI+IGZjaGFyOworICBGb288dm9sYXRpbGUgY2hhciAqPiBmdnBjaGFyOworCisgIEJhcjxpbnQsIDMzPiBiaW50OworICBCYXI8aW50LCAoNCA+IDMpPiBiaW50MjsKKworICBCYXo8aW50LCAncyc+IGJhemludDsKKyAgQmF6PGNoYXIsICdhJz4gYmF6aW50MjsKKworICBRdXg8Y2hhciwgc3RyaW5nPiBxdXhpbnQyOworICBRdXg8aW50LCBzdHJpbmc+IHF1eGludDsKKworICBRdXgxPGludCwgZ2YxPiBxdXgxMTsKKworICBpbnQgeCA9IGZpbnQuZm9vKDMzLCA0Nyk7CisgIGNoYXIgYyA9IGZjaGFyLmZvbygzMywgJ3gnKTsKKyAgdm9sYXRpbGUgY2hhciAqIGNwID0gZnZwY2hhci5mb28oMzMsIDApOworICAKKyAgaW50IHkgPSBkdW1teTxpbnQ+ICg0MDAsIDYwMCk7CisKKyAgaW50IHogPSBiaW50LmJhcig1NSwgNjYpOworICB6ICs9IGJpbnQyLmJhcig1NSwgNjYpOworCisgIGMgPSBiYXppbnQyLmJheig0LCAneScpOworICBjID0gcXV4aW50Mi5xdXgoNCwgJ3onKTsKKyAgCisgIHkgPSBiYXppbnQuYmF6KDQsMyk7CisgIHkgPSBxdXhpbnQucXV4KDQsIDIyKTsKKyAgeSArPSBxdXgxMS5xdXgoNCwgMjIpOworCisgIHkgKj0gZ2YxKHkpIC0gZ2YyKHkpOworICAKKyAgU3BlYzxpbnQsIGNoYXI+IHNpYzsKKyAgU3BlYzxpbnQsIGludCAqPiBzaWlwOworCisgIHNpYy5zcGVjICgnYycpOworICBzaWlwLnNwZWMgKCZ4KTsKKworICBHYXJwbHk8aW50PiBmOworICBHYXJwbHk8Y2hhcj4gZmM7CisgIGYueCA9IDEzOworCisgIEdhcnBseTxHYXJwbHk8Y2hhcj4gPiBuZjsKKyAgbmYueCA9IDMxOworICAKKyAgeCA9IGYuZ2FycGx5ICgzLCA0KTsKKyAgCisgIGZjID0gbmYuZ2FycGx5ICgzLCBmYyk7CisKKyAgeSA9IHggKyBmYy54OworICAKKworICByZXR1cm4gMDsKKyAgICAKK30KKworCisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL3RlbXBsYXRlcy5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvdGVtcGxhdGVzLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTI1ZWFhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL3RlbXBsYXRlcy5leHAKQEAgLTAsMCArMSwyMDIgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBGcmVkIEZpc2guIChmbmZAY3lnbnVzLmNvbSkKKworc2V0IHdzICJcW1xyXG5cdCBcXSsiCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgdGVzdGZpbGUgInRlbXBsYXRlcyIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmNjCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKKyMgQ3JlYXRlIGFuZCBzb3VyY2UgdGhlIGZpbGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIKKyMgdXNlZCB0byBjb21waWxlIHRoZSB0ZXN0IGNhc2UuCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfSAiYysrIl0geworICAgIHJldHVybiAtMQorfQorc291cmNlICR7YmluZmlsZX0uY2kKKworIyBpZiB3ZSBhcmUgb24gSFBVWCBhbmQgd2UgYXJlIG5vdCBjb21waWxlZCB3aXRoIGdjYywgdGhlbiBza2lwIHRoZXNlIHRlc3RzLgorCitpZiBbaXN0YXJnZXQgaHBwYSotKi1ocHV4Kl0geworICAgIGlmIHshJGdjY19jb21waWxlZH0geworCWNvbnRpbnVlIAorICAgIH0KK30KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1ZyBjKyt9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKK3NvdXJjZSAke2JpbmZpbGV9LmNpCisKKyMKKyMgIFRlc3QgcHJpbnRpbmcgb2YgdGhlIHR5cGVzIG9mIHRlbXBsYXRlcy4KKyMKKworcHJvYyB0ZXN0X3B0eXBlX29mX3RlbXBsYXRlcyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgd3MKKworICAgIHNlbmRfZ2RiICJwdHlwZSBUNTxpbnQ+XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgVDU8aW50PiBceyR7d3N9cHVibGljOiR7d3N9c3RhdGljIGludCBYOyR7d3N9aW50IHg7JHt3c31pbnQgdmFsOyR7d3N9VDVcXDxpbnQ+ICYgb3BlcmF0b3I9XFwoVDU8aW50PiBjb25zdCAmXFwpOyR7d3N9VDVcXChpbnRcXCk7JHt3c31UNVxcKFQ1PGludD4gY29uc3QgJlxcKTske3dzfX5UNVxcKHZvaWRcXCk7JHt3c31zdGF0aWMgdm9pZCBcXCogb3BlcmF0b3IgbmV3XFwodW5zaWduZWQgKGludHxsb25nKVxcKTske3dzfXN0YXRpYyB2b2lkIG9wZXJhdG9yIGRlbGV0ZVxcKHZvaWQgXFwqXFwpOyR7d3N9aW50IHZhbHVlXFwodm9pZFxcKTske3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgVDU8aW50PiIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgVDU8aW50PiBceyR7d3N9cHVibGljOiR7d3N9c3RhdGljIGludCBYOyR7d3N9aW50IHg7JHt3c31pbnQgdmFsOygoJHt3c31UNVxcPGludD4gJiBvcGVyYXRvcj1cXChUNTxpbnQ+IGNvbnN0ICZcXCk7KXwoJHt3c31UNVxcKGludFxcKTspfCgke3dzfVQ1XFwoVDU8aW50PiBjb25zdCAmXFwpOyl8KCR7d3N9flQ1XFwodm9pZFxcKTspfCgke3dzfXN0YXRpYyB2b2lkIFxcKiBvcGVyYXRvciBuZXdcXCh1bnNpZ25lZCAoaW50fGxvbmcpXFwpOyl8KCR7d3N9c3RhdGljIHZvaWQgb3BlcmF0b3IgZGVsZXRlXFwodm9pZCBcXCpcXCk7KXwoJHt3c31pbnQgdmFsdWVcXCh2b2lkXFwpOykpKiR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBUNTxpbnQ+IChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgVDU8aW50PiIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIFQ1PGludD4gKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgdDVpXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgVDU8aW50PiBceyR7d3N9cHVibGljOiR7d3N9c3RhdGljIGludCBYOyR7d3N9aW50IHg7JHt3c31pbnQgdmFsOyR7d3N9VDU8aW50PiAmIG9wZXJhdG9yPVxcKFQ1PGludD4gY29uc3QgJlxcKTske3dzfVQ1XFwoaW50XFwpOyR7d3N9VDVcXChUNTxpbnQ+IGNvbnN0ICZcXCk7JHt3c31+VDVcXCh2b2lkXFwpOyR7d3N9c3RhdGljIHZvaWQgXFwqIG9wZXJhdG9yIG5ld1xcKHVuc2lnbmVkIChpbnR8bG9uZylcXCk7JHt3c31zdGF0aWMgdm9pZCBvcGVyYXRvciBkZWxldGVcXCh2b2lkIFxcKlxcKTske3dzfWludCB2YWx1ZVxcKHZvaWRcXCk7JHt3c31cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHQ1aSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgVDU8aW50PiBceyR7d3N9cHVibGljOiR7d3N9c3RhdGljIGludCBYOyR7d3N9aW50IHg7JHt3c31pbnQgdmFsOygoJHt3c31UNTxpbnQ+ICYgb3BlcmF0b3I9XFwoVDU8aW50PiBjb25zdCAmXFwpOyl8KCR7d3N9VDVcXChpbnRcXCk7KXwoJHt3c31UNVxcKFQ1PGludD4gY29uc3QgJlxcKTspfCgke3dzfX5UNVxcKHZvaWRcXCk7KXwoJHt3c31zdGF0aWMgdm9pZCBcXCogb3BlcmF0b3IgbmV3XFwodW5zaWduZWQgKGludHxsb25nKVxcKTspfCgke3dzfXN0YXRpYyB2b2lkIG9wZXJhdG9yIGRlbGV0ZVxcKHZvaWQgXFwqXFwpOyl8KCR7d3N9aW50IHZhbHVlXFwodm9pZFxcKTspKSoke3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgdDVpIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgdDVpIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgdDVpICh0aW1lb3V0KSIKKwl9CisgICAgfQorfQorCisjCisjICBUZXN0IGJyZWFrcG9pbnQgc2V0dGluZyBvbiB0ZW1wbGF0ZSBtZXRob2RzLgorIworCitwcm9jIHRlc3RfdGVtcGxhdGVfYnJlYWtwb2ludHMge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIHRlc3RmaWxlCisgICAgZ2xvYmFsIHNyY2RpcgorCisgICAgc2VuZF9nZGIgImJyZWFrIFQ1PGludD46OlQ1XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIwLiBjYW5jZWwuKlxbXHJcblxdKi4xLiBhbGwuKlxbXHJcblxdKi4yLiBUNTxpbnQ+OjpUNVxcKGludFxcKSBhdCAuKlxbXHJcblxdKi4zLiBUNTxpbnQ+OjpUNVxcKFQ1PGludD4gY29uc3QgJlxcKSBhdCAuKlxbXHJcblxdKj4gJCIgeworCSAgICBnZGJfdGVzdCAiMCIgXAorCQkiY2FuY2VsbGVkIiBcCisJCSJjb25zdHJ1Y3RvciBicmVha3BvaW50IChvYnNvbGV0ZSBmb3JtYXQhKSIKKwl9CisJLXJlICIuMC4gY2FuY2VsXFtcclxuXF0qLjEuIGFsbFxbXHJcblxdKi4yLiBUNTxpbnQ+OjpUNVxcKFQ1PGludD4gY29uc3QgJlxcKSBhdCAuKnRlbXBsYXRlcy5jYzouKlxbXHJcblxdKi4zLiBUNTxpbnQ+OjpUNVxcKGludFxcKSBhdCAuKnRlbXBsYXRlcy5jYzouKlxbXHJcblxdKj4gJCIgeworCSAgICBnZGJfdGVzdCAiMCIgXAorCQkiY2FuY2VsbGVkIiBcCisJCSJjb25zdHJ1Y3RvciBicmVha3BvaW50IgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb25zdHJ1Y3RvciBicmVha3BvaW50IiB9CisJZGVmYXVsdCB7IGZhaWwgImNvbnN0cnVjdG9yIGJyZWFrcG9pbnQgKHRpbWVvdXQpIiB9CisgICAgfQorICAgIAorICAgZ2RiX3Rlc3QgImJyZWFrIFQ1PGludD46On5UNSIgXAorCSJCcmVha3BvaW50LiphdC4qIGZpbGUgLioke3Rlc3RmaWxlfS5jYywgbGluZS4qIiBcCisJImRlc3RydWN0b3IgYnJlYWtwb2ludCIgICAgCisgICAgCisgICAgZ2RiX3Rlc3QgImJyZWFrIFQ1PGludD46OnZhbHVlIiBcCisJIkJyZWFrcG9pbnQuKmF0LiogZmlsZSAuKiR7dGVzdGZpbGV9LmNjLCBsaW5lLioiIFwKKwkidmFsdWUgbWV0aG9kIGJyZWFrcG9pbnQiCisKKyAgICBkZWxldGVfYnJlYWtwb2ludHMKK30KKworIworIyAgVGVzdCBjYWxsaW5nIG9mIHRlbXBsYXRlIG1ldGhvZHMuCisjCisKK3Byb2MgdGVzdF90ZW1wbGF0ZV9jYWxscyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIGlmIFt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiLGNhbm5vdF9jYWxsX2Z1bmN0aW9uc10geworCXNldHVwX3hmYWlsICIqLSotKiIgMjQxNgorCWZhaWwgIlRoaXMgdGFyZ2V0IGNhbiBub3QgY2FsbCBmdW5jdGlvbnMiCisJcmV0dXJuCisgICAgfQorCisgICAgc2VuZF9nZGIgInByaW50IHQ1aS52YWx1ZSgpXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IDJcW1xyXG5cXSokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IHQ1aS52YWx1ZSgpIiB9CisJLXJlICJDYW5ub3QgaW52b2tlIGZ1bmN0aW9ucyBvbiB0aGlzIG1hY2hpbmUuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHJpbnQgdDVpLnZhbHVlKCkiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHQ1aS52YWx1ZSgpIiB9CisJZGVmYXVsdCB7IGZhaWwgInByaW50IHQ1aS52YWx1ZSgpICh0aW1lb3V0KSIgfQorICAgIH0KK30KKworCitwcm9jIGRvX3Rlc3RzIHt9IHsKKyAgICBnbG9iYWwgcHJtc19pZAorICAgIGdsb2JhbCBidWdfaWQKKyAgICBnbG9iYWwgc3ViZGlyCisgICAgZ2xvYmFsIG9iamRpcgorICAgIGdsb2JhbCBzcmNkaXIKKyAgICBnbG9iYWwgYmluZmlsZQorICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIHN1cHBvcnRzX3RlbXBsYXRlX2RlYnVnZ2luZworCisgICAgc2V0IHBybXNfaWQgMAorICAgIHNldCBidWdfaWQgMAorCisgICAgIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKyAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKyAgICBnZGJfbG9hZCAkYmluZmlsZQorCisgICAgaWYgeyAhJHN1cHBvcnRzX3RlbXBsYXRlX2RlYnVnZ2luZyB9IHsKKwl3YXJuaW5nICJjb21waWxlciBsYWNrcyBkZWJ1Z2dpbmcgaW5mbyBmb3IgdGVtcGxhdGVzOyB0ZXN0cyBzdXBwcmVzc2VkLiIgMAorCXJldHVybgorICAgIH0KKworICAgICMgR2V0IHRoZSBkZWJ1ZyBmb3JtYXQgZm9yIHRoZSBjb21waWxlZCB0ZXN0IGNhc2UuICBJZiB0aGF0CisgICAgIyBmb3JtYXQgaXMgRFdBUkYgMSB0aGVuIGp1c3Qgc2tpcCBhbGwgdGhlIHRlc3RzIHNpbmNlIG5vbmUgb2YKKyAgICAjIHRoZW0gd2lsbCBwYXNzLgorCisgICAgaWYgWyBydW50b19tYWluXSB0aGVuIHsKKwlnZXRfZGVidWdfZm9ybWF0CisJaWYgWyBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiIF0gdGhlbiB7CisJICAgIGZhaWwgIkMrKyB0ZXN0cyBza2lwcGVkIGR1ZSB0byBsaW1pdGVkIEMrKyBzdXBwb3J0IGluIERXQVJGIDEgZGVidWcgZm9ybWF0IgorCSAgICByZXR1cm4KKwl9CisJY2xlYXJfeGZhaWwgIiotKi0qIgorICAgIH0KKworICAgIHRlc3RfcHR5cGVfb2ZfdGVtcGxhdGVzCisgICAgdGVzdF90ZW1wbGF0ZV9icmVha3BvaW50cworCisgICAgaWYgWyBydW50b19tYWluXSB7CisJdGVzdF90ZW1wbGF0ZV9jYWxscworICAgIH0KK30KKworZG9fdGVzdHMKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL3VzZXJkZWYuY2MgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvdXNlcmRlZi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWQ2Yzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL3VzZXJkZWYuY2MKQEAgLTAsMCArMSwzMzkgQEAKKyNpbmNsdWRlIDxpb3N0cmVhbS5oPgorCit2b2lkIG1hcmtlcjEoKQoreworICByZXR1cm47Cit9CisKK2NsYXNzIEExIHsKKyAgaW50IHg7CisgIGludCB5OworCitmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvdXRzLCBBMSBvbmUpOworCitwdWJsaWM6CisKKyAgQTEoaW50IGEsIGludCBiKQorICB7CisgICB4PWE7CisgICB5PWI7CisgIH0KKworQTEgb3BlcmF0b3IrPShpbnQgdmFsdWUpOworQTEgb3BlcmF0b3IrKGNvbnN0IEExJik7CitBMSBvcGVyYXRvci0oY29uc3QgQTEmKTsKK0ExIG9wZXJhdG9yJShjb25zdCBBMSYpOworaW50IG9wZXJhdG9yPT0oY29uc3QgQTEmKTsKK2ludCBvcGVyYXRvciE9KGNvbnN0IEExJik7CitpbnQgb3BlcmF0b3ImJihjb25zdCBBMSYpOworaW50IG9wZXJhdG9yfHwoY29uc3QgQTEmKTsKK0ExIG9wZXJhdG9yPDwoaW50KTsKK0ExIG9wZXJhdG9yPj4oaW50KTsKK0ExIG9wZXJhdG9yfChjb25zdCBBMSYpOworQTEgb3BlcmF0b3JeKGNvbnN0IEExJik7CitBMSBvcGVyYXRvciYoY29uc3QgQTEmKTsKK2ludCBvcGVyYXRvcjwoY29uc3QgQTEmKTsKK2ludCBvcGVyYXRvcjw9KGNvbnN0IEExJik7CitpbnQgb3BlcmF0b3I+PShjb25zdCBBMSYpOworaW50IG9wZXJhdG9yPihjb25zdCBBMSYpOworQTEgb3BlcmF0b3IqKGNvbnN0IEExJik7CitBMSBvcGVyYXRvci8oY29uc3QgQTEmKTsKK0ExIG9wZXJhdG9yPShjb25zdCBBMSYpOworCitBMSBvcGVyYXRvcn4oKTsKK0ExIG9wZXJhdG9yLSgpOworaW50IG9wZXJhdG9yISgpOworQTEgb3BlcmF0b3IrKygpOworQTEgb3BlcmF0b3IrKyhpbnQpOworQTEgb3BlcmF0b3ItLSgpOyAKK0ExIG9wZXJhdG9yLS0oaW50KTsKKworfTsKKworCitBMSBBMTo6b3BlcmF0b3IrKGNvbnN0IEExJiBzZWNvbmQpCit7CisgQTEgc3VtKDAsMCk7Cisgc3VtLnggPSB4ICsgc2Vjb25kLng7Cisgc3VtLnkgPSB5ICsgc2Vjb25kLnk7CisgCisgcmV0dXJuIChzdW0pOworfQorCitBMSBBMTo6b3BlcmF0b3IqKGNvbnN0IEExJiBzZWNvbmQpCit7CisgQTEgcHJvZHVjdCgwLDApOworIHByb2R1Y3QueCA9IHRoaXMtPnggKiBzZWNvbmQueDsKKyBwcm9kdWN0LnkgPSB0aGlzLT55ICogc2Vjb25kLnk7CisgCisgcmV0dXJuIHByb2R1Y3Q7Cit9CisKK0ExIEExOjpvcGVyYXRvci0oY29uc3QgQTEmIHNlY29uZCkKK3sKKyBBMSBkaWZmKDAsMCk7CisgZGlmZi54ID0geCAtIHNlY29uZC54OworIGRpZmYueSA9IHkgLSBzZWNvbmQueTsKKyAKKyByZXR1cm4gZGlmZjsKK30KKworQTEgQTE6Om9wZXJhdG9yLyhjb25zdCBBMSYgc2Vjb25kKQoreworIEExIGRpdigwLDApOworIGRpdi54ID0geCAvIHNlY29uZC54OworIGRpdi55ID0geSAvIHNlY29uZC55OworIAorIHJldHVybiBkaXY7Cit9CisKK0ExIEExOjpvcGVyYXRvciUoY29uc3QgQTEmIHNlY29uZCkKK3sKKyBBMSByZW0oMCwwKTsKKyByZW0ueCA9IHggJSBzZWNvbmQueDsKKyByZW0ueSA9IHkgJSBzZWNvbmQueTsKKyAKKyByZXR1cm4gcmVtOworfQorCitpbnQgQTE6Om9wZXJhdG9yPT0oY29uc3QgQTEmIHNlY29uZCkKK3sKKyBpbnQgYSA9ICh4ID09IHNlY29uZC54KTsKKyBpbnQgYiA9ICh5ID09IHNlY29uZC55KTsKKyAKKyByZXR1cm4gKGEgJiYgYik7Cit9CisKK2ludCBBMTo6b3BlcmF0b3IhPShjb25zdCBBMSYgc2Vjb25kKQoreworIGludCBhID0gKHggIT0gc2Vjb25kLngpOworIGludCBiID0gKHkgIT0gc2Vjb25kLnkpOworIAorIHJldHVybiAoYSB8fCBiKTsKK30KKworaW50IEExOjpvcGVyYXRvciYmKGNvbnN0IEExJiBzZWNvbmQpCit7CisgcmV0dXJuICggeCAmJiBzZWNvbmQueCk7Cit9CisKK2ludCBBMTo6b3BlcmF0b3J8fChjb25zdCBBMSYgc2Vjb25kKQoreworIHJldHVybiAoIHggfHwgc2Vjb25kLngpOworfQorCitBMSBBMTo6b3BlcmF0b3I8PChpbnQgdmFsdWUpCit7CisgQTEgbHNoZnQoMCwwKTsKKyBsc2hmdC54ID0geCA8PCB2YWx1ZTsKKyBsc2hmdC55ID0geSA8PCB2YWx1ZTsKKyAKKyByZXR1cm4gbHNoZnQ7Cit9CisKK0ExIEExOjpvcGVyYXRvcj4+KGludCB2YWx1ZSkKK3sKKyBBMSByc2hmdCgwLDApOworIHJzaGZ0LnggPSB4ID4+IHZhbHVlOworIHJzaGZ0LnkgPSB5ID4+IHZhbHVlOworIAorIHJldHVybiByc2hmdDsKK30KKworQTEgQTE6Om9wZXJhdG9yfChjb25zdCBBMSYgc2Vjb25kKQoreworIEExIGFiaXRvcigwLDApOworIGFiaXRvci54ID0geCB8IHNlY29uZC54OworIGFiaXRvci55ID0geSB8IHNlY29uZC55OworIAorIHJldHVybiBhYml0b3I7Cit9CisKK0ExIEExOjpvcGVyYXRvcl4oY29uc3QgQTEmIHNlY29uZCkKK3sKKyBBMSBheG9yKDAsMCk7CisgYXhvci54ID0geCBeIHNlY29uZC54OworIGF4b3IueSA9IHkgXiBzZWNvbmQueTsKKyAKKyByZXR1cm4gYXhvcjsKK30KKworQTEgQTE6Om9wZXJhdG9yJihjb25zdCBBMSYgc2Vjb25kKQoreworIEExIGFiaXRhbmQoMCwwKTsKKyBhYml0YW5kLnggPSB4ICYgc2Vjb25kLng7CisgYWJpdGFuZC55ID0geSAmIHNlY29uZC55OworIAorIHJldHVybiBhYml0YW5kOworfQorCitpbnQgQTE6Om9wZXJhdG9yPChjb25zdCBBMSYgc2Vjb25kKQoreworIEExIGIoMCwwKTsKKyBiLnggPSAzOworIHJldHVybiAoeCA8IHNlY29uZC54KTsKK30KKworaW50IEExOjpvcGVyYXRvcjw9KGNvbnN0IEExJiBzZWNvbmQpCit7CisgcmV0dXJuICh4IDw9IHNlY29uZC54KTsKK30KKworaW50IEExOjpvcGVyYXRvcj49KGNvbnN0IEExJiBzZWNvbmQpCit7CisgcmV0dXJuICh4ID49IHNlY29uZC54KTsKK30KKworaW50IEExOjpvcGVyYXRvcj4oY29uc3QgQTEmIHNlY29uZCkKK3sKKyByZXR1cm4gKHggPiBzZWNvbmQueCk7Cit9CisKK2ludCBBMTo6b3BlcmF0b3IhKHZvaWQpCit7CisgcmV0dXJuICgheCk7Cit9CisKK0ExIEExOjpvcGVyYXRvci0odm9pZCkKK3sKKyBBMSBuZWcoMCwwKTsKKyBuZWcueCA9IC14OworIG5lZy55ID0gLXk7CisKKyByZXR1cm4gKG5lZyk7Cit9CisKK0ExIEExOjpvcGVyYXRvcn4odm9pZCkKK3sKKyBBMSBhY29tcGwoMCwwKTsKKyBhY29tcGwueCA9IH54OworIGFjb21wbC55ID0gfnk7CisKKyByZXR1cm4gKGFjb21wbCk7Cit9CisKK0ExIEExOjpvcGVyYXRvcisrKCkgLy8gcHJlIGluY3JlbWVudAoreworIHggPSB4ICsxOworIAorIHJldHVybiAoKnRoaXMpOworfQorCitBMSBBMTo6b3BlcmF0b3IrKyhpbnQpIC8vIHBvc3QgaW5jcmVtZW50Cit7CisgeSA9IHkgKzE7CisgCisgcmV0dXJuICgqdGhpcyk7Cit9CisKK0ExIEExOjpvcGVyYXRvci0tKCkgLy8gcHJlIGRlY3JlbWVudAoreworIHggPSB4IC0xOworIAorIHJldHVybiAoKnRoaXMpOworfQorCitBMSBBMTo6b3BlcmF0b3ItLShpbnQpIC8vIHBvc3QgZGVjcmVtZW50Cit7CisgeSA9IHkgLTE7CisgCisgcmV0dXJuICgqdGhpcyk7Cit9CisKKworQTEgQTE6Om9wZXJhdG9yPShjb25zdCBBMSYgc2Vjb25kKQoreworCisgeCA9IHNlY29uZC54OworIHkgPSBzZWNvbmQueTsKKworIHJldHVybiAoKnRoaXMpOworfQorCitBMSBBMTo6b3BlcmF0b3IrPShpbnQgdmFsdWUpCit7CisKKyB4ICs9IHZhbHVlOworIHkgKz0gdmFsdWU7CisKKyByZXR1cm4gKCp0aGlzKTsKK30KKworb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvdXRzLCBBMSBvbmUpCit7CisgcmV0dXJuIChvdXRzIDw8IGVuZGwgPDwgInggPSAiIDw8IG9uZS54IDw8IGVuZGwgPDwgInkgPSAiIDw8IG9uZS55IDw8IGVuZGwgPDwgIi0tLS0tLS0iIDw8IGVuZGwpOyAKK30KKworaW50IG1haW4gKHZvaWQpCit7CisgQTEgb25lKDIsMyk7CisgQTEgdHdvKDQsNSk7CisgQTEgdGhyZWUoMCwwKTsKKyBpbnQgdmFsOworIAorIG1hcmtlcjEoKTsKKyBjb3V0IDw8IG9uZTsKKyBjb3V0IDw8IHR3bzsKKyB0aHJlZSA9IG9uZSArIHR3bzsKKyBjb3V0IDw8ICIrICIgPDwgIHRocmVlOworIHRocmVlID0gb25lIC0gdHdvOworIGNvdXQgPDwgICItICIgPDwgdGhyZWU7CisgdGhyZWUgPSBvbmUgKiB0d287CisgY291dCA8PCIqICIgPDwgIHRocmVlOworIHRocmVlID0gb25lIC8gdHdvOworIGNvdXQgPDwgIi8gIiA8PCB0aHJlZTsKKyB0aHJlZSA9IG9uZSAlIHR3bzsKKyBjb3V0IDw8ICIlICIgPDwgdGhyZWU7CisgdGhyZWUgPSBvbmUgfCB0d287CisgY291dCA8PCAifCAiIDw8dGhyZWU7CisgdGhyZWUgPSBvbmUgXiB0d287CisgY291dCA8PCAiXiAiIDw8dGhyZWU7CisgdGhyZWUgPSBvbmUgJiB0d287CisgY291dCA8PCAiJiAiPDwgdGhyZWU7CisKKyB2YWwgPSBvbmUgJiYgdHdvOworIGNvdXQgPDwgIiYmICIgPDwgdmFsIDw8IGVuZGwgPDwgIi0tLS0tIjw8ZW5kbDsKKyB2YWwgPSBvbmUgfHwgdHdvOworIGNvdXQgPDwgInx8ICIgPDwgdmFsIDw8IGVuZGwgPDwgIi0tLS0tIjw8ZW5kbDsKKyB2YWwgPSBvbmUgPT0gdHdvOworIGNvdXQgPDwgIiA9PSAiIDw8IHZhbCA8PCBlbmRsIDw8ICItLS0tLSI8PGVuZGw7CisgdmFsID0gb25lICE9IHR3bzsKKyBjb3V0IDw8ICIhPSAiIDw8IHZhbCA8PCBlbmRsIDw8ICItLS0tLSI8PGVuZGw7CisgdmFsID0gb25lID49IHR3bzsKKyBjb3V0IDw8ICI+PSAiIDw8IHZhbCA8PCBlbmRsIDw8ICItLS0tLSI8PGVuZGw7CisgdmFsID0gb25lIDw9IHR3bzsKKyBjb3V0IDw8ICI8PSAiIDw8IHZhbCA8PCBlbmRsIDw8ICItLS0tLSI8PGVuZGw7CisgdmFsID0gb25lIDwgdHdvOworIGNvdXQgPDwgIjwgIiA8PCB2YWwgPDwgZW5kbCA8PCAiLS0tLS0iPDxlbmRsOworIHZhbCA9IG9uZSA+IHR3bzsKKyBjb3V0IDw8ICI+ICIgPDwgdmFsIDw8IGVuZGwgPDwgIi0tLS0tIjw8ZW5kbDsKKyAKKyB0aHJlZSA9IG9uZSA8PCAyOworIGNvdXQgPDwgImxzaCAiIDw8IHRocmVlOworIHRocmVlID0gb25lID4+IDI7CisgY291dCA8PCAicnNoICIgPDwgdGhyZWU7CisKKyB0aHJlZSA9IG9uZTsKKyBjb3V0IDw8ICIgPSAiPDwgdGhyZWU7CisgdGhyZWUgKz0gNTsKKyBjb3V0IDw8ICIgKz0gIjw8IHRocmVlOworIAorIHZhbCA9ICghb25lKTsKKyBjb3V0IDw8ICIhICIgPDwgdmFsIDw8IGVuZGwgPDwgIi0tLS0tIjw8ZW5kbDsKKyB0aHJlZSA9ICgtb25lKTsKKyBjb3V0IDw8ICItICIgPDwgdGhyZWU7CisgdGhyZWUgPSAofm9uZSk7CisgY291dCA8PCAiIH4iIDw8IHRocmVlOworIHRocmVlKys7CisgY291dCA8PCAicG9zdGluYyAiIDw8IHRocmVlOworIHRocmVlLS07CisgY291dCA8PCAicG9zdGRlYyAiIDw8IHRocmVlOworIAorIC0tdGhyZWU7CisgY291dCA8PCAicHJlZGVjICIgPDwgdGhyZWU7CisgKyt0aHJlZTsKKyBjb3V0IDw8ICJwcmVpbmMgIiA8PCB0aHJlZTsKKworIHJldHVybiAwOworCit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jKysvdXNlcmRlZi5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jKysvdXNlcmRlZi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliYjA1MwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy91c2VyZGVmLmV4cApAQCAtMCwwICsxLDMxNyBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgd3JpdHRlbiBieSBFbGVuYSBaYW5ub25pIChlemFubm9uaUBjeWdudXMuY29tKQorIworIyB0ZXN0aW5nIG92ZXJsb2FkZWQgb3BlcmF0b3JzIHJlc29sdXRpb24uCisjIAorIyBzb3VyY2UgZmlsZSAidXNlcmRlZi5jYyIKKyMKKworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW4gZXhlY3V0YWJsZSB0byB0ZXN0LiAgSWYgbm90LCB0aGVuIGVpdGhlciB3ZQorIyBoYXZlbid0IHRyaWVkIHRvIGNvbXBpbGUgb25lLCBvciB0aGUgY29tcGlsYXRpb24gZmFpbGVkIGZvciBzb21lIHJlYXNvbi4KKyMgSW4gZWl0aGVyIGNhc2UsIGp1c3Qgbm90aWZ5IHRoZSB1c2VyIGFuZCBza2lwIHRoZSB0ZXN0cyBpbiB0aGlzIGZpbGUuCisKK3NldCB0ZXN0ZmlsZSAidXNlcmRlZiIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmNjCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYysrfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgcGVycm9yICJjb3VsZG4ndCBydW4gdG8gYnJlYWtwb2ludCIKKyAgICBjb250aW51ZQorfQorCitzZW5kX2dkYiAiYnJlYWsgbWFya2VyMVxuIiA7IGdkYl9leHBlY3QgLXJlICIuKiRnZGJfcHJvbXB0ICQiCisgICAgc2VuZF9nZGIgImNvbnRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJCcmVhay4qIG1hcmtlcjEgXFwoXFwpIGF0IC4qOiRkZWNpbWFsLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBzZW5kX2dkYiAidXBcbiIKKyAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInVwIGZyb20gbWFya2VyMSIgfQorICAgICAgICAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJ1cCBmcm9tIG1hcmtlcjEiIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29udGludWUgdG8gbWFya2VyMSIgIH0KKyAgICAgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb250aW51ZSB0byBtYXJrZXIxIiAgfQorICAgIH0KKworCisgICAgc2V0dXBfeGZhaWwgaHBwYV8qXyoKK3NlbmRfZ2RiICJwcmludCBvbmUrdHdvXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIkZJWE1FLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIG9uZSArIHR3byIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyB4ZmFpbCAicHJpbnQgdmFsdWUgb2Ygb25lIHR3byIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIG9uZSB0d28iIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgb25lLXR3b1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKkZJWE1FLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIG9uZSAtIHR3byIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyB4ZmFpbCAicHJpbnQgdmFsdWUgb2Ygb25lIC0gdHdvIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2Ygb25lIC0gdHdvIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IG9uZSp0d29cbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipGSVhNRS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBvbmUgKiB0d28iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgeGZhaWwgInByaW50IHZhbHVlIG9mIG9uZSAqIHR3byIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIG9uZSAqIHR3byIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBvbmUvdHdvXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qRklYTUUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygb25lIC8gdHdvIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IHhmYWlsICJwcmludCB2YWx1ZSBvZiBvbmUgLyB0d28iIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBvbmUgLyB0d28iIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgb25lJXR3b1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKkZJWE1FLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIG9uZSAlIHR3byIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyB4ZmFpbCAicHJpbnQgdmFsdWUgb2Ygb25lICUgdHdvIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2Ygb25lICUgdHdvIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IG9uZSYmdHdvXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qRklYTUUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygb25lICYmIHR3byIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyB4ZmFpbCAicHJpbnQgdmFsdWUgb2Ygb25lICYmIHR3byIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIG9uZSAmJiB0d28iIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgb25lfHx0d29cbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipGSVhNRS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBvbmV8fCB0d28iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgeGZhaWwgInByaW50IHZhbHVlIG9mIG9uZXx8IHR3byIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIG9uZXx8IHR3byIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBvbmUmdHdvXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qRklYTUUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygb25lICYgdHdvIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IHhmYWlsICJwcmludCB2YWx1ZSBvZiBvbmUgJiB0d28iIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBvbmUgJiB0d28iIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgb25lfHR3b1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKkZJWE1FLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIG9uZSB8IHR3byIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyB4ZmFpbCAicHJpbnQgdmFsdWUgb2Ygb25lIHwgdHdvIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2Ygb25lIHwgdHdvIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IG9uZSBeIHR3b1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKkZJWE1FLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIG9uZSBeICB0d28iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgeGZhaWwgInByaW50IHZhbHVlIG9mIG9uZSBeICB0d28iIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBvbmUgXiAgdHdvIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IG9uZSA8IHR3b1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKkZJWE1FLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIG9uZSA8ICB0d28iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgeGZhaWwgInByaW50IHZhbHVlIG9mIG9uZSA8ICB0d28iIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBvbmUgPCAgdHdvIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IG9uZSA8PSB0d29cbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipGSVhNRS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBvbmUgPD0gIHR3byIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyB4ZmFpbCAicHJpbnQgdmFsdWUgb2Ygb25lIDw9ICB0d28iIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBvbmUgPD0gIHR3byIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBvbmUgPiB0d29cbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipGSVhNRS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBvbmUgID4gdHdvIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IHhmYWlsICJwcmludCB2YWx1ZSBvZiBvbmUgPiAgdHdvIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2Ygb25lID4gIHR3byIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBvbmUgPj0gdHdvXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qRklYTUUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygb25lID49ICB0d28iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgeGZhaWwgInByaW50IHZhbHVlIG9mIG9uZSA+PSAgdHdvIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2Ygb25lID49ICB0d28iIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCBvbmU9PXR3b1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKkZJWE1FLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIG9uZSA9PSB0d28iCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgeGZhaWwgInByaW50IHZhbHVlIG9mIG9uZSA9PSB0d28iIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBvbmUgPT0gdHdvIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IG9uZSE9dHdvXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qRklYTUUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygb25lICE9IHR3byIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyB4ZmFpbCAicHJpbnQgdmFsdWUgb2Ygb25lICE9IHR3byIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIG9uZSAhPSB0d28iIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgb25lPDwzMVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKkZJWE1FLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIG9uZTw8MzEiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgeGZhaWwgInByaW50IHZhbHVlIG9mIG9uZTw8MzEiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBvbmU8PDMxIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IG9uZT4+MzFcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipGSVhNRS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBvbmU+PjMxIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IHhmYWlsICJwcmludCB2YWx1ZSBvZiBvbmU+PjMxIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2Ygb25lPj4zMSIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCAhb25lXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qRklYTUUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgIW9uZSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyB4ZmFpbCAicHJpbnQgdmFsdWUgb2YgIW9uZSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mICFvbmUiIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgfm9uZVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKkZJWE1FLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIH5vbmUiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgeGZhaWwgInByaW50IHZhbHVlIG9mIH5vbmUiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiB+b25lIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IC1vbmVcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipGSVhNRS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAtb25lIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IHhmYWlsICJwcmludCB2YWx1ZSBvZiAtb25lIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgLW9uZSIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBvbmUrK1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKkZJWE1FLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIG9uZSsrIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IHhmYWlsICJwcmludCB2YWx1ZSBvZiBvbmUrKyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIG9uZSsrIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50ICsrb25lXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qRklYTUUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgKytvbmU+PjMxIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IHhmYWlsICJwcmludCB2YWx1ZSBvZiArK29uZSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mICsrb25lIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IG9uZS0tXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qLkZJWE1FKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2Ygb25lLS0+PjMxIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IHhmYWlsICJwcmludCB2YWx1ZSBvZiBvbmUtLT4+MzEiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBvbmUtLT4+MzEiIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgLS1vbmVcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipGSVhNRS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiAtLW9uZSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyB4ZmFpbCAicHJpbnQgdmFsdWUgb2YgLS1vbmUiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiAtLW9uZSIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBvbmUrPTdcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipGSVhNRS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBvbmUrPTciCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgeGZhaWwgInByaW50IHZhbHVlIG9mIG9uZSs9NyIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIG9uZSs9NyIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCB0d289b25lXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qRklYTUUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgdHdvPW9uZSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyB4ZmFpbCAicHJpbnQgdmFsdWUgb2YgdHdvPW9uZSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIHR3bz1vbmUiIH0KKyAgfQorCitnZGJfZXhpdAorcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy92aXJ0ZnVuYy5jYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmMrKy92aXJ0ZnVuYy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODNkNTAyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL3ZpcnRmdW5jLmNjCkBAIC0wLDAgKzEsMTk5IEBACisvLyBQbHMgdHJ5IHRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBvbiB2aXJ0dWFsIGZ1bmN0aW9ucyBhbmQgdHJ5IHRvIGRvIHByaW50IG9uCisvLyAgbW9zdCBvZiB0aGUgY29kZSBpbiBtYWluKCkuICBBbG1vc3Qgbm9uZSBvZiB0aGVtIHdvcmtzICEKKworLy8KKy8vIFRoZSBpbmhlcml0YW5jZSBzdHJ1Y3R1cmUgaXM6CisvLworLy8gViA6IFZBIFZCCisvLyBBIDogKFYpCisvLyBCIDogQQorLy8gRCA6IEFEIChWKQorLy8gQyA6IChWKQorLy8gRSA6IEIgKFYpIEQgQworLy8KKworY2xhc3MgVkEgCit7CitwdWJsaWM6CisgICAgaW50IHZhOworfTsKKworY2xhc3MgVkIKK3sKK3B1YmxpYzoKKyAgICBpbnQgdmI7CisgICAgaW50IGZ2YigpOworICAgIHZpcnR1YWwgaW50IHZ2YigpOworfTsKKworY2xhc3MgViA6IHB1YmxpYyBWQSwgcHVibGljIFZCCit7CitwdWJsaWM6CisgICAgaW50IGYoKTsKKyAgICB2aXJ0dWFsIGludCB2digpOworICAgIGludCB3OworfTsKKworY2xhc3MgQSA6IHZpcnR1YWwgcHVibGljIFYKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGludCBmKCk7Citwcml2YXRlOgorICAgIGludCBhOworfTsKKworY2xhc3MgQiA6IHB1YmxpYyBBCit7CitwdWJsaWM6CisgICAgaW50IGYoKTsKK3ByaXZhdGU6CisgICAgaW50IGI7Cit9OworCitjbGFzcyBDIDogcHVibGljIHZpcnR1YWwgVgoreworcHVibGljOgorICAgIGludCBjOworfTsKKworY2xhc3MgQUQKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGludCB2ZygpID0gMDsKK307CisKK2NsYXNzIEQgOiBwdWJsaWMgQUQsIHZpcnR1YWwgcHVibGljIFYKK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgdm9pZCBzKCk7CisgICAgdmlydHVhbCBpbnQgdmcoKTsKKyAgICB2aXJ0dWFsIGludCB2ZCgpOworICAgIGludCBmZCgpOworICAgIGludCBkOworfTsKKworY2xhc3MgRSA6IHB1YmxpYyBCLCB2aXJ0dWFsIHB1YmxpYyBWLCBwdWJsaWMgRCwgcHVibGljIEMKK3sKK3B1YmxpYzoKKyAgICBpbnQgZigpOworICAgIGludCB2ZygpOworICAgIGludCB2digpOworICAgIGludCBlOworfTsKKworRCAgIGRkOworRCogIHBwZCA9ICZkZDsKK0FEKiBwQWQgPSAmZGQ7CisKK0EgICBhOworQiAgIGI7CitDICAgYzsKK0QgICBkOworRSAgIGU7CitWICAgdjsKK1ZCICB2YjsKKworCitBKiAJcEFhCT0gCSZhOworQSoJcEFlCT0JJmU7CisKK0IqCXBCZQk9CSZlOworCitEKglwRGQJPQkmZDsKK0QqCXBEZQk9CSZlOworCitWKglwVmEJPQkmYTsKK1YqCXBWdgk9CSZ2OworVioJcFZlCT0JJmU7CitWKiAgICAgcFZkCT0JJmQ7CisKK0FEKglwQURlCT0JJmU7CisKK0UqCXBFZQk9CSZlOworCitWQiogICAgIHBWQgk9CSZ2YjsKKwordm9pZCBpbml0KCkKK3sKKwlhLnZiID0gMTsKKwliLnZiID0gMjsKKwljLnZiID0gMzsKKwlkLnZiID0gNDsKKwllLnZiID0gNTsKKwl2LnZiID0gNjsKKwl2Yi52YiA9IDc7CisKKwlkLmQJPSAxOworCWUuZAk9ICAyOworfQorCitleHRlcm4gIkMiIGludCBwcmludGYoY29uc3QgY2hhciAqLCAuLi4pOworCitpbnQgYWxsX2NvdW50ID0gMDsKK2ludCBmYWlsZWRfY291bnQgPSAwOworCisjZGVmaW5lIFRFU1QoRVhQUiwgRVhQRUNURUQpIFwKKyAgIHJldCA9IEVYUFI7IFwKKyAgIGlmIChyZXQgIT0gRVhQRUNURUQpIHtcCisgICAgICBwcmludGYoIkZhaWxlZCAlcyBpcyAlZCwgc2hvdWxkIGJlICVkIVxuIiwgI0VYUFIsIHJldCwgRVhQRUNURUQpOyBcCisgICAgICBmYWlsZWRfY291bnQrKzsgfSBcCisgICBhbGxfY291bnQrKzsKKworaW50IHJldDsKKwordm9pZCB0ZXN0X2NhbGxzKCkKK3sKKwlURVNUKHBBZS0+ZigpLCAyMCk7CisJVEVTVChwQWEtPmYoKSwgMSk7CisKKwlURVNUKHBEZS0+dmcoKSwgMjAyKTsKKwlURVNUKHBBRGUtPnZnKCksIDIwMik7CisJVEVTVChwRGQtPnZnKCksIDEwMSk7CisKKwlURVNUKHBFZS0+dnZiKCksIDQxMSk7CisKKwlURVNUKHBWQi0+dnZiKCksIDQwNyk7CisKKwlURVNUKHBCZS0+dnZiKCksIDQxMSk7CisJVEVTVChwRGUtPnZ2YigpLCA0MTEpOworCisgICAgICAgIFRFU1QocEVlLT52ZCgpLCAyODIpOworICAgICAgICBURVNUKHBFZS0+ZnZiKCksIDMxMSk7CisgICAgCisgICAgICAgIFRFU1QocEVlLT5EOjp2ZygpLCAxMDIpOworCXByaW50ZigiRGlkICVkIHRlc3RzLCBvZiB3aGljaCAlZCBmYWlsZWQuXG4iLCBhbGxfY291bnQsIGZhaWxlZF9jb3VudCk7Cit9CisjaWZkZWYgdXNlc3R1YnMKK2V4dGVybiAiQyIgeworICB2b2lkIHNldF9kZWJ1Z190cmFwcygpOworICB2b2lkIGJyZWFrcG9pbnQoKTsKK307CisjZW5kaWYKKworbWFpbigpCit7CisjaWZkZWYgdXNlc3R1YnMKKyAgIHNldF9kZWJ1Z190cmFwcygpOworICAgYnJlYWtwb2ludCgpOworI2VuZGlmCisgICAgaW5pdCgpOworCisgICAgZS53ID0gNzsKKyAgICBlLnZiID0gMTE7CisKKyAgICB0ZXN0X2NhbGxzKCk7Cit9CisKK2ludCBBOjpmKCkge3JldHVybiAxO30KK2ludCBCOjpmKCkge3JldHVybiAyO30KK3ZvaWQgRDo6cygpIHt9CitpbnQgRTo6ZigpIHtyZXR1cm4gMjA7fQoraW50IEQ6OnZnKCkge3JldHVybiAxMDArZDt9CitpbnQgRTo6dmcoKSB7cmV0dXJuIDIwMCtkO30KK2ludCBWOjpmKCkge3JldHVybiA2MDArdzt9CitpbnQgVjo6dnYoKSB7cmV0dXJuIDQwMCt3O30KK2ludCBFOjp2digpIHtyZXR1cm4gNDUwK3c7fQoraW50IEQ6OmZkKCkge3JldHVybiAyNTArZDt9CitpbnQgRDo6dmQoKSB7cmV0dXJuIDI4MCtkO30KK2ludCBWQjo6ZnZiKCkge3JldHVybiAzMDArdmI7fQoraW50IFZCOjp2dmIoKSB7cmV0dXJuIDQwMCt2Yjt9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jKysvdmlydGZ1bmMuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL3ZpcnRmdW5jLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGRiNzU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYysrL3ZpcnRmdW5jLmV4cApAQCAtMCwwICsxLDc1MSBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEZyZWQgRmlzaC4gKGZuZkBjeWdudXMuY29tKQorCitzZXQgd3MgIlxbXHJcblx0IFxdKyIKK3NldCBubCAiXFtcclxuXF0rIgorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHRlc3RmaWxlICJ2aXJ0ZnVuYyIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmNjCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9ICJjKysiXSB7CisgICAgcmV0dXJuIC0xCit9CisKKyMgaWYgd2UgYXJlIG9uIEhQVVggYW5kIHdlIGFyZSBub3QgY29tcGlsZWQgd2l0aCBnY2MsIHRoZW4gc2tpcCB0aGVzZSB0ZXN0cy4KKworaWYgW2lzdGFyZ2V0IGhwcGEqLSotaHB1eCpdIHsKKyAgICBpZiB7ISRnY2NfY29tcGlsZWR9IHsKKwljb250aW51ZSAKKyAgICB9Cit9CisKKworCisjIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFuIGV4ZWN1dGFibGUgdG8gdGVzdC4gIElmIG5vdCwgdGhlbiBlaXRoZXIgd2UKKyMgaGF2ZW4ndCB0cmllZCB0byBjb21waWxlIG9uZSwgb3IgdGhlIGNvbXBpbGF0aW9uIGZhaWxlZCBmb3Igc29tZSByZWFzb24uCisjIEluIGVpdGhlciBjYXNlLCBqdXN0IG5vdGlmeSB0aGUgdXNlciBhbmQgc2tpcCB0aGUgdGVzdHMgaW4gdGhpcyBmaWxlLgorCitzZXQgc3JjICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2MrKyBkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworcHJvYyBnZGJfdmlydGZ1bmNfaW5pdCB7fSB7CisgICAgZ2xvYmFsIHNyY2RpciBzdWJkaXIgYmluZmlsZQorICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKyAgICBnZGJfbG9hZCAkYmluZmlsZQorCisgICAgc2VuZF9nZGIgInNldCBsYW5ndWFnZSBjKytcbiIKKyAgICBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKKyAgICBzZW5kX2dkYiAic2V0IHdpZHRoIDBcbiIKKyAgICBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKK30KKworcHJvYyBnZGJfdmlydGZ1bmNfcmVzdGFydCB7fSB7CisgICAgZ2RiX2V4aXQ7CisgICAgZ2RiX3N0YXJ0OworICAgIGdkYl92aXJ0ZnVuY19pbml0OworICAgIHJ1bnRvICd0ZXN0X2NhbGxzKHZvaWQpJzsKK30KKworIworIyAgVGVzdCBwcmludGluZyBvZiB0aGUgdHlwZXMgb2YgdmFyaW91cyBjbGFzc2VzLgorIworCitwcm9jIHRlc3RfcHR5cGVfb2ZfY2xhc3NlcyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgd3MKKyAgICBnbG9iYWwgbmwKKworICAgICMgVGhpcyB1c2VkIHRvIGJlIGEgZmFpbCBpZiBpdCBwcmludGVkICJzdHJ1Y3QiIG5vdCAiY2xhc3MiLiAgQnV0CisgICAgIyBzaW5jZSB0aGlzIHN0cnVjdCBkb2Vzbid0IHVzZSBhbnkgc3BlY2lhbCBDKysgZmVhdHVyZXMsIGl0IGlzCisgICAgIyBjb25zaWRlcmVkIHJpZ2h0IGZvciBHREIgdG8gcHJpbnQgaXQgYXMgInN0cnVjdCIuCisgICAgc2VuZF9nZGIgInB0eXBlIFZBXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gKHN0cnVjdHxjbGFzcykgVkEgXHsoJHt3c31wdWJsaWM6fCkke3dzfWludCB2YTske3dzfVZBICYgb3BlcmF0b3I9XFwoVkEgY29uc3QgJlxcKTske3dzfVZBXFwoVkEgY29uc3QgJlxcKTske3dzfVZBXFwodm9pZFxcKTske3dzfVx9LiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIFZBIgorCX0KKwktcmUgInR5cGUgPSAoc3RydWN0fGNsYXNzKSBWQSBceygke3dzfXB1YmxpYzp8KSR7d3N9aW50IHZhOygoJHt3c31WQSAmIG9wZXJhdG9yPVxcKFZBIGNvbnN0ICZcXCk7KXwoJHt3c31WQVxcKFZBIGNvbnN0ICZcXCk7KXwoJHt3c31WQVxcKHZvaWRcXCk7KSkqJHt3c31cfS4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBWQSAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIFZBIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgVkEgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgVkJcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBWQiBceyR7d3N9cHVibGljOiR7d3N9aW50IHZiOyR7d3N9VkIgJiBvcGVyYXRvcj1cXChWQiBjb25zdCAmXFwpOyR7d3N9VkJcXChWQiBjb25zdCAmXFwpOyR7d3N9VkJcXCh2b2lkXFwpOyR7d3N9aW50IGZ2YlxcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2dmJcXCh2b2lkXFwpOyR7d3N9XH0uKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgVkIiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIFZCIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgdmI7KCgke3dzfVZCICYgb3BlcmF0b3I9XFwoVkIgY29uc3QgJlxcKTspfCgke3dzfVZCXFwoVkIgY29uc3QgJlxcKTspfCgke3dzfVZCXFwodm9pZFxcKTspfCgke3dzfWludCBmdmJcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdnZiXFwodm9pZFxcKTspKSoke3dzfVx9LiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIFZCIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgVkIiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBWQiAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBWXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgViA6IHB1YmxpYyBWQSwgcHVibGljIFZCIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgdzske3dzfVYgJiBvcGVyYXRvcj1cXChWIGNvbnN0ICZcXCk7JHt3c31WXFwoViBjb25zdCAmXFwpOyR7d3N9VlxcKHZvaWRcXCk7JHt3c31pbnQgZlxcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2dlxcKHZvaWRcXCk7JHt3c31cfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgViIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgViA6IHB1YmxpYyBWQSwgcHVibGljIFZCIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgdzsoKCR7d3N9ViAmIG9wZXJhdG9yPVxcKFYgY29uc3QgJlxcKTspfCgke3dzfVZcXChWIGNvbnN0ICZcXCk7KXwoJHt3c31WXFwodm9pZFxcKTspfCgke3dzfWludCBmXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZ2XFwodm9pZFxcKTspKSoke3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBWIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgViIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIFYgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgQVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIEEgOiBwdWJsaWMgdmlydHVhbCBWIFx7JHt3c31wcml2YXRlOiR7d3N9ViBcWypcXStfdmJcW1xcXCRcLlxdK1Y7JHt3c31pbnQgYTske3dzfXB1YmxpYzoke3dzfUEgJiBvcGVyYXRvcj1cXChBIGNvbnN0ICZcXCk7JHt3c31BXFwoaW50LCBBIGNvbnN0ICZcXCk7JHt3c31BXFwoaW50XFwpOyR7d3N9dmlydHVhbCBpbnQgZlxcKHZvaWRcXCk7JHt3c31cfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgQSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgQSA6IHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192YlxbXFxcJFwuXF0rVjske3dzfWludCBhOyR7d3N9cHVibGljOigoJHt3c31BICYgb3BlcmF0b3I9XFwoQSBjb25zdCAmXFwpOyl8KCR7d3N9QVxcKGludCwgQSBjb25zdCAmXFwpOyl8KCR7d3N9QVxcKGludFxcKTspfCgke3dzfXZpcnR1YWwgaW50IGZcXCh2b2lkXFwpOykpKiR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIEEgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBBIDogcHVibGljIHZpcnR1YWwgViBceyR7d3N9cHJpdmF0ZToke3dzfVYgXFsqXF0rX3ZiLkZPTzske3dzfWludCBhOyR7d3N9cHVibGljOiR7d3N9dmlydHVhbCBpbnQgZi52b2lkLjske3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICAjIFRoaXMgaGFwcGVucyBiZWNhdXNlIHRoZSB0eXBlIGlzIGRlZmluZWQgb25seSBhZnRlciBpdCBpcworCSAgICAjIHRvbyBsYXRlLgorCSAgICBmYWlsICJwdHlwZSBBIChrbm93biBmYWlsdXJlIHdpdGggZ2NjIGN5Z251cy0yLjQuNS05MzA0MTcpIgorCSAgICAjIE1hbnkgb2YgdGhlIHJlc3Qgb2YgdGhlc2UgdGVzdHMgaGF2ZSB0aGUgc2FtZSBwcm9ibGVtLgorCSAgICByZXR1cm4gMAorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBBIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgQSAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBCXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgQiA6IHB1YmxpYyBBIFx7JHt3c31wcml2YXRlOiR7d3N9aW50IGI7JHt3c31wdWJsaWM6JHt3c31CICYgb3BlcmF0b3I9XFwoQiBjb25zdCAmXFwpOyR7d3N9QlxcKGludCwgQiBjb25zdCAmXFwpOyR7d3N9QlxcKGludFxcKTske3dzfXZpcnR1YWwgaW50IGZcXCh2b2lkXFwpOyR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIEIiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIEIgOiBwdWJsaWMgQSBceyR7d3N9cHJpdmF0ZToke3dzfWludCBiOyR7d3N9cHVibGljOigoJHt3c31CICYgb3BlcmF0b3I9XFwoQiBjb25zdCAmXFwpOyl8KCR7d3N9QlxcKGludCwgQiBjb25zdCAmXFwpOyl8KCR7d3N9QlxcKGludFxcKTspfCgke3dzfXZpcnR1YWwgaW50IGZcXCh2b2lkXFwpOykpKiR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIEIgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBCIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgQiAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBDXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgQyA6IHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5WOyR7d3N9cHVibGljOiR7d3N9aW50IGM7JHt3c31DICYgb3BlcmF0b3I9XFwoQyBjb25zdCAmXFwpOyR7d3N9Q1xcKGludCwgQyBjb25zdCAmXFwpOyR7d3N9Q1xcKGludFxcKTske3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBDIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBDIDogcHVibGljIHZpcnR1YWwgViBceyR7d3N9cHJpdmF0ZToke3dzfVYgXFsqXF0rX3ZiLlY7JHt3c31wdWJsaWM6JHt3c31pbnQgYzsoKCR7d3N9QyAmIG9wZXJhdG9yPVxcKEMgY29uc3QgJlxcKTspfCgke3dzfUNcXChpbnQsIEMgY29uc3QgJlxcKTspfCgke3dzfUNcXChpbnRcXCk7KSkqJHt3c31cfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgQyAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIEMiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBDICh0aW1lb3V0KSIKKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIEFEXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgQUQgXHske3dzfXB1YmxpYzoke3dzfUFEICYgb3BlcmF0b3I9XFwoQUQgY29uc3QgJlxcKTske3dzfUFEXFwoQUQgY29uc3QgJlxcKTske3dzfUFEXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTske3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBBRCIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgQUQgXHske3dzfXB1YmxpYzooKCR7d3N9QUQgJiBvcGVyYXRvcj1cXChBRCBjb25zdCAmXFwpOyl8KCR7d3N9QURcXChBRCBjb25zdCAmXFwpOyl8KCR7d3N9QURcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdmdcXCh2b2lkXFwpOykpKiR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIEFEIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgQUQiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBBRCAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBEXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgRCA6IHB1YmxpYyBBRCwgcHVibGljIHZpcnR1YWwgViBceyR7d3N9cHJpdmF0ZToke3dzfVYgXFsqXF0rX3ZiLlY7JHt3c31wdWJsaWM6JHt3c31pbnQgZDske3dzfUQgJiBvcGVyYXRvcj1cXChEIGNvbnN0ICZcXCk7JHt3c31EXFwoaW50LCBEIGNvbnN0ICZcXCk7JHt3c31EXFwoaW50XFwpOyR7d3N9c3RhdGljIHZvaWQgc1xcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2ZFxcKHZvaWRcXCk7JHt3c31pbnQgZmRcXCh2b2lkXFwpOyR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIEQiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIEQgOiBwdWJsaWMgQUQsIHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5WOyR7d3N9cHVibGljOiR7d3N9aW50IGQ7KCgke3dzfUQgJiBvcGVyYXRvcj1cXChEIGNvbnN0ICZcXCk7KXwoJHt3c31EXFwoaW50LCBEIGNvbnN0ICZcXCk7KXwoJHt3c31EXFwoaW50XFwpOyl8KCR7d3N9c3RhdGljIHZvaWQgc1xcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2ZFxcKHZvaWRcXCk7KXwoJHt3c31pbnQgZmRcXCh2b2lkXFwpOykpKiR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIEQgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBEIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgRCAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBFXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgRSA6IHB1YmxpYyBCLCBwdWJsaWMgdmlydHVhbCBWLCBwdWJsaWMgRCwgcHVibGljIEMgXHske3dzfXB1YmxpYzoke3dzfWludCBlOyR7d3N9RSAmIG9wZXJhdG9yPVxcKEUgY29uc3QgJlxcKTske3dzfUVcXChpbnQsIEUgY29uc3QgJlxcKTske3dzfUVcXChpbnRcXCk7JHt3c312aXJ0dWFsIGludCBmXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZ2XFwodm9pZFxcKTske3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBFIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBFIDogcHVibGljIEIsIHB1YmxpYyB2aXJ0dWFsIFYsIHB1YmxpYyBELCBwdWJsaWMgQyBceyR7d3N9cHVibGljOiR7d3N9aW50IGU7KCgke3dzfUUgJiBvcGVyYXRvcj1cXChFIGNvbnN0ICZcXCk7KXwoJHt3c31FXFwoaW50LCBFIGNvbnN0ICZcXCk7KXwoJHt3c31FXFwoaW50XFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgZlxcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2dlxcKHZvaWRcXCk7KSkqJHt3c31cfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgRSAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIEUiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBFICh0aW1lb3V0KSIKKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIGRkXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgRCA6IHB1YmxpYyBBRCwgcHVibGljIHZpcnR1YWwgViBceyR7d3N9cHJpdmF0ZToke3dzfVYgXFsqXF0rX3ZiLlY7JHt3c31wdWJsaWM6JHt3c31pbnQgZDske3dzfUQgJiBvcGVyYXRvcj1cXChEIGNvbnN0ICZcXCk7JHt3c31EXFwoaW50LCBEIGNvbnN0ICZcXCk7JHt3c31EXFwoaW50XFwpOyR7d3N9c3RhdGljIHZvaWQgc1xcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2ZFxcKHZvaWRcXCk7JHt3c31pbnQgZmRcXCh2b2lkXFwpOyR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGRkIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBEIDogcHVibGljIEFELCBwdWJsaWMgdmlydHVhbCBWIFx7JHt3c31wcml2YXRlOiR7d3N9ViBcWypcXStfdmIuVjske3dzfXB1YmxpYzoke3dzfWludCBkOygoJHt3c31EICYgb3BlcmF0b3I9XFwoRCBjb25zdCAmXFwpOyl8KCR7d3N9RFxcKGludCwgRCBjb25zdCAmXFwpOyl8KCR7d3N9RFxcKGludFxcKTspfCgke3dzfXN0YXRpYyB2b2lkIHNcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdmdcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdmRcXCh2b2lkXFwpOyl8KCR7d3N9aW50IGZkXFwodm9pZFxcKTspKSoke3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBkZCAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIGRkIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgZGQgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgcHBkXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgRCA6IHB1YmxpYyBBRCwgcHVibGljIHZpcnR1YWwgViBceyR7d3N9cHJpdmF0ZToke3dzfVYgXFsqXF0rX3ZiLlY7JHt3c31wdWJsaWM6JHt3c31pbnQgZDske3dzfUQgJiBvcGVyYXRvcj1cXChEIGNvbnN0ICZcXCk7JHt3c31EXFwoaW50LCBEIGNvbnN0ICZcXCk7JHt3c31EXFwoaW50XFwpOyR7d3N9c3RhdGljIHZvaWQgc1xcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2ZFxcKHZvaWRcXCk7JHt3c31pbnQgZmRcXCh2b2lkXFwpOyR7d3N9XH0gXFsqXF0rJG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwcGQiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIEQgOiBwdWJsaWMgQUQsIHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5WOyR7d3N9cHVibGljOiR7d3N9aW50IGQ7KCgke3dzfUQgJiBvcGVyYXRvcj1cXChEIGNvbnN0ICZcXCk7KXwoJHt3c31EXFwoaW50LCBEIGNvbnN0ICZcXCk7KXwoJHt3c31EXFwoaW50XFwpOyl8KCR7d3N9c3RhdGljIHZvaWQgc1xcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2ZFxcKHZvaWRcXCk7KXwoJHt3c31pbnQgZmRcXCh2b2lkXFwpOykpKiR7d3N9XH0gXFsqXF0rJG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwcGQgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBwcGQiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBwcGQgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgcEFkXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgQUQgXHske3dzfXB1YmxpYzoke3dzfUFEICYgb3BlcmF0b3I9XFwoQUQgY29uc3QgJlxcKTske3dzfUFEXFwoQUQgY29uc3QgJlxcKTske3dzfUFEXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTske3dzfVx9IFxbKlxdKyRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgcEFkIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBBRCBceyR7d3N9cHVibGljOigoJHt3c31BRCAmIG9wZXJhdG9yPVxcKEFEIGNvbnN0ICZcXCk7KXwoJHt3c31BRFxcKEFEIGNvbnN0ICZcXCk7KXwoJHt3c31BRFxcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7KSkqJHt3c31cfSBcWypcXSskbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBBZCAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIHBBZCIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIHBBZCAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBhXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgQSA6IHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5WOyR7d3N9aW50IGE7JHt3c31wdWJsaWM6JHt3c31BICYgb3BlcmF0b3I9XFwoQSBjb25zdCAmXFwpOyR7d3N9QVxcKGludCwgQSBjb25zdCAmXFwpOyR7d3N9QVxcKGludFxcKTske3dzfXZpcnR1YWwgaW50IGZcXCh2b2lkXFwpOyR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGEiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIEEgOiBwdWJsaWMgdmlydHVhbCBWIFx7JHt3c31wcml2YXRlOiR7d3N9ViBcWypcXStfdmIuVjske3dzfWludCBhOyR7d3N9cHVibGljOigoJHt3c31BICYgb3BlcmF0b3I9XFwoQSBjb25zdCAmXFwpOyl8KCR7d3N9QVxcKGludCwgQSBjb25zdCAmXFwpOyl8KCR7d3N9QVxcKGludFxcKTspfCgke3dzfXZpcnR1YWwgaW50IGZcXCh2b2lkXFwpOykpKiR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGEgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBhIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgYSAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBiXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgQiA6IHB1YmxpYyBBIFx7JHt3c31wcml2YXRlOiR7d3N9aW50IGI7JHt3c31wdWJsaWM6JHt3c31CICYgb3BlcmF0b3I9XFwoQiBjb25zdCAmXFwpOyR7d3N9QlxcKGludCwgQiBjb25zdCAmXFwpOyR7d3N9QlxcKGludFxcKTske3dzfXZpcnR1YWwgaW50IGZcXCh2b2lkXFwpOyR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGIiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIEIgOiBwdWJsaWMgQSBceyR7d3N9cHJpdmF0ZToke3dzfWludCBiOyR7d3N9cHVibGljOigoJHt3c31CICYgb3BlcmF0b3I9XFwoQiBjb25zdCAmXFwpOyl8KCR7d3N9QlxcKGludCwgQiBjb25zdCAmXFwpOyl8KCR7d3N9QlxcKGludFxcKTspfCgke3dzfXZpcnR1YWwgaW50IGZcXCh2b2lkXFwpOykpKiR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGIgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBiIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgYiAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBjXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgQyA6IHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5WOyR7d3N9cHVibGljOiR7d3N9aW50IGM7JHt3c31DICYgb3BlcmF0b3I9XFwoQyBjb25zdCAmXFwpOyR7d3N9Q1xcKGludCwgQyBjb25zdCAmXFwpOyR7d3N9Q1xcKGludFxcKTske3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBDIDogcHVibGljIHZpcnR1YWwgViBceyR7d3N9cHJpdmF0ZToke3dzfVYgXFsqXF0rX3ZiLlY7JHt3c31wdWJsaWM6JHt3c31pbnQgYzsoKCR7d3N9QyAmIG9wZXJhdG9yPVxcKEMgY29uc3QgJlxcKTspfCgke3dzfUNcXChpbnQsIEMgY29uc3QgJlxcKTspfCgke3dzfUNcXChpbnRcXCk7KSkqJHt3c31cfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgYyAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIGMiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBjICh0aW1lb3V0KSIKKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIGRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBEIDogcHVibGljIEFELCBwdWJsaWMgdmlydHVhbCBWIFx7JHt3c31wcml2YXRlOiR7d3N9ViBcWypcXStfdmIuVjske3dzfXB1YmxpYzoke3dzfWludCBkOyR7d3N9RCAmIG9wZXJhdG9yPVxcKEQgY29uc3QgJlxcKTske3dzfURcXChpbnQsIEQgY29uc3QgJlxcKTske3dzfURcXChpbnRcXCk7JHt3c31zdGF0aWMgdm9pZCBzXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZkXFwodm9pZFxcKTske3dzfWludCBmZFxcKHZvaWRcXCk7JHt3c31cfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgZCIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgRCA6IHB1YmxpYyBBRCwgcHVibGljIHZpcnR1YWwgViBceyR7d3N9cHJpdmF0ZToke3dzfVYgXFsqXF0rX3ZiLlY7JHt3c31wdWJsaWM6JHt3c31pbnQgZDsoKCR7d3N9RCAmIG9wZXJhdG9yPVxcKEQgY29uc3QgJlxcKTspfCgke3dzfURcXChpbnQsIEQgY29uc3QgJlxcKTspfCgke3dzfURcXChpbnRcXCk7KXwoJHt3c31zdGF0aWMgdm9pZCBzXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZkXFwodm9pZFxcKTspfCgke3dzfWludCBmZFxcKHZvaWRcXCk7KSkqJHt3c31cfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgZCAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIGQiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBkICh0aW1lb3V0KSIKKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIGVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBFIDogcHVibGljIEIsIHB1YmxpYyB2aXJ0dWFsIFYsIHB1YmxpYyBELCBwdWJsaWMgQyBceyR7d3N9cHVibGljOiR7d3N9aW50IGU7JHt3c31FICYgb3BlcmF0b3I9XFwoRSBjb25zdCAmXFwpOyR7d3N9RVxcKGludCwgRSBjb25zdCAmXFwpOyR7d3N9RVxcKGludFxcKTske3dzfXZpcnR1YWwgaW50IGZcXCh2b2lkXFwpOyR7d3N9dmlydHVhbCBpbnQgdmdcXCh2b2lkXFwpOyR7d3N9dmlydHVhbCBpbnQgdnZcXCh2b2lkXFwpOyR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGUiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIEUgOiBwdWJsaWMgQiwgcHVibGljIHZpcnR1YWwgViwgcHVibGljIEQsIHB1YmxpYyBDIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgZTsoKCR7d3N9RSAmIG9wZXJhdG9yPVxcKEUgY29uc3QgJlxcKTspfCgke3dzfUVcXChpbnQsIEUgY29uc3QgJlxcKTspfCgke3dzfUVcXChpbnRcXCk7KXwoJHt3c312aXJ0dWFsIGludCBmXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZ2XFwodm9pZFxcKTspKSoke3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBlIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgZSIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIGUgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgdlxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIFYgOiBwdWJsaWMgVkEsIHB1YmxpYyBWQiBceyR7d3N9cHVibGljOiR7d3N9aW50IHc7JHt3c31WICYgb3BlcmF0b3I9XFwoViBjb25zdCAmXFwpOyR7d3N9VlxcKFYgY29uc3QgJlxcKTske3dzfVZcXCh2b2lkXFwpOyR7d3N9aW50IGZcXCh2b2lkXFwpOyR7d3N9dmlydHVhbCBpbnQgdnZcXCh2b2lkXFwpOyR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHYiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIFYgOiBwdWJsaWMgVkEsIHB1YmxpYyBWQiBceyR7d3N9cHVibGljOiR7d3N9aW50IHc7KCgke3dzfVYgJiBvcGVyYXRvcj1cXChWIGNvbnN0ICZcXCk7KXwoJHt3c31WXFwoViBjb25zdCAmXFwpOyl8KCR7d3N9VlxcKHZvaWRcXCk7KXwoJHt3c31pbnQgZlxcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2dlxcKHZvaWRcXCk7KSkqJHt3c31cfSRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgdiAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIHYiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSB2ICh0aW1lb3V0KSIKKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIHZiXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgVkIgXHske3dzfXB1YmxpYzoke3dzfWludCB2Yjske3dzfVZCICYgb3BlcmF0b3I9XFwoVkIgY29uc3QgJlxcKTske3dzfVZCXFwoVkIgY29uc3QgJlxcKTske3dzfVZCXFwodm9pZFxcKTske3dzfWludCBmdmJcXCh2b2lkXFwpOyR7d3N9dmlydHVhbCBpbnQgdnZiXFwodm9pZFxcKTske3dzfVx9JG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSB2YiIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgVkIgXHske3dzfXB1YmxpYzoke3dzfWludCB2YjsoKCR7d3N9VkIgJiBvcGVyYXRvcj1cXChWQiBjb25zdCAmXFwpOyl8KCR7d3N9VkJcXChWQiBjb25zdCAmXFwpOyl8KCR7d3N9VkJcXCh2b2lkXFwpOyl8KCR7d3N9aW50IGZ2YlxcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2dmJcXCh2b2lkXFwpOykpKiR7d3N9XH0kbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHZiIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgdmIiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSB2YiAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBwQWFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBBIDogcHVibGljIHZpcnR1YWwgViBceyR7d3N9cHJpdmF0ZToke3dzfVYgXFsqXF0rX3ZiLlY7JHt3c31pbnQgYTske3dzfXB1YmxpYzoke3dzfUEgJiBvcGVyYXRvcj1cXChBIGNvbnN0ICZcXCk7JHt3c31BXFwoaW50LCBBIGNvbnN0ICZcXCk7JHt3c31BXFwoaW50XFwpOyR7d3N9dmlydHVhbCBpbnQgZlxcKHZvaWRcXCk7JHt3c31cfSBcWypcXSskbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBBYSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgQSA6IHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5WOyR7d3N9aW50IGE7JHt3c31wdWJsaWM6KCgke3dzfUEgJiBvcGVyYXRvcj1cXChBIGNvbnN0ICZcXCk7KXwoJHt3c31BXFwoaW50LCBBIGNvbnN0ICZcXCk7KXwoJHt3c31BXFwoaW50XFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgZlxcKHZvaWRcXCk7KSkqJHt3c31cfSBcWypcXSskbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBBYSAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIHBBYSIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIHBBYSAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBwQWVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBBIDogcHVibGljIHZpcnR1YWwgViBceyR7d3N9cHJpdmF0ZToke3dzfVYgXFsqXF0rX3ZiLlY7JHt3c31pbnQgYTske3dzfXB1YmxpYzoke3dzfUEgJiBvcGVyYXRvcj1cXChBIGNvbnN0ICZcXCk7JHt3c31BXFwoaW50LCBBIGNvbnN0ICZcXCk7JHt3c31BXFwoaW50XFwpOyR7d3N9dmlydHVhbCBpbnQgZlxcKHZvaWRcXCk7JHt3c31cfSBcWypcXSskbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBBZSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgQSA6IHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5WOyR7d3N9aW50IGE7JHt3c31wdWJsaWM6KCgke3dzfUEgJiBvcGVyYXRvcj1cXChBIGNvbnN0ICZcXCk7KXwoJHt3c31BXFwoaW50LCBBIGNvbnN0ICZcXCk7KXwoJHt3c31BXFwoaW50XFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgZlxcKHZvaWRcXCk7KSkqJHt3c31cfSBcWypcXSskbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBBZSAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIHBBZSIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIHBBZSAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBwQmVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBCIDogcHVibGljIEEgXHske3dzfXByaXZhdGU6JHt3c31pbnQgYjske3dzfXB1YmxpYzoke3dzfUIgJiBvcGVyYXRvcj1cXChCIGNvbnN0ICZcXCk7JHt3c31CXFwoaW50LCBCIGNvbnN0ICZcXCk7JHt3c31CXFwoaW50XFwpOyR7d3N9dmlydHVhbCBpbnQgZlxcKHZvaWRcXCk7JHt3c31cfSBcWypcXSskbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBCZSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgQiA6IHB1YmxpYyBBIFx7JHt3c31wcml2YXRlOiR7d3N9aW50IGI7JHt3c31wdWJsaWM6KCgke3dzfUIgJiBvcGVyYXRvcj1cXChCIGNvbnN0ICZcXCk7KXwoJHt3c31CXFwoaW50LCBCIGNvbnN0ICZcXCk7KXwoJHt3c31CXFwoaW50XFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgZlxcKHZvaWRcXCk7KSkqJHt3c31cfSBcWypcXSskbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBCZSAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIHBCZSIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIHBCZSAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBwRGRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBEIDogcHVibGljIEFELCBwdWJsaWMgdmlydHVhbCBWIFx7JHt3c31wcml2YXRlOiR7d3N9ViBcWypcXStfdmIuVjske3dzfXB1YmxpYzoke3dzfWludCBkOyR7d3N9RCAmIG9wZXJhdG9yPVxcKEQgY29uc3QgJlxcKTske3dzfURcXChpbnQsIEQgY29uc3QgJlxcKTske3dzfURcXChpbnRcXCk7JHt3c31zdGF0aWMgdm9pZCBzXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZkXFwodm9pZFxcKTske3dzfWludCBmZFxcKHZvaWRcXCk7JHt3c31cfSBcWypcXSskbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBEZCIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgRCA6IHB1YmxpYyBBRCwgcHVibGljIHZpcnR1YWwgViBceyR7d3N9cHJpdmF0ZToke3dzfVYgXFsqXF0rX3ZiLlY7JHt3c31wdWJsaWM6JHt3c31pbnQgZDsoKCR7d3N9RCAmIG9wZXJhdG9yPVxcKEQgY29uc3QgJlxcKTspfCgke3dzfURcXChpbnQsIEQgY29uc3QgJlxcKTspfCgke3dzfURcXChpbnRcXCk7KXwoJHt3c31zdGF0aWMgdm9pZCBzXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZkXFwodm9pZFxcKTspfCgke3dzfWludCBmZFxcKHZvaWRcXCk7KSkqJHt3c31cfSBcWypcXSskbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBEZCAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIHBEZCIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIHBEZCAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBwRGVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBEIDogcHVibGljIEFELCBwdWJsaWMgdmlydHVhbCBWIFx7JHt3c31wcml2YXRlOiR7d3N9ViBcWypcXStfdmIuVjske3dzfXB1YmxpYzoke3dzfWludCBkOyR7d3N9RCAmIG9wZXJhdG9yPVxcKEQgY29uc3QgJlxcKTske3dzfURcXChpbnQsIEQgY29uc3QgJlxcKTske3dzfURcXChpbnRcXCk7JHt3c31zdGF0aWMgdm9pZCBzXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZkXFwodm9pZFxcKTske3dzfWludCBmZFxcKHZvaWRcXCk7JHt3c31cfSBcWypcXSskbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBEZSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgRCA6IHB1YmxpYyBBRCwgcHVibGljIHZpcnR1YWwgViBceyR7d3N9cHJpdmF0ZToke3dzfVYgXFsqXF0rX3ZiLlY7JHt3c31wdWJsaWM6JHt3c31pbnQgZDsoKCR7d3N9RCAmIG9wZXJhdG9yPVxcKEQgY29uc3QgJlxcKTspfCgke3dzfURcXChpbnQsIEQgY29uc3QgJlxcKTspfCgke3dzfURcXChpbnRcXCk7KXwoJHt3c31zdGF0aWMgdm9pZCBzXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZkXFwodm9pZFxcKTspfCgke3dzfWludCBmZFxcKHZvaWRcXCk7KSkqJHt3c31cfSBcWypcXSskbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBEZSAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIHBEZSIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIHBEZSAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBwVmFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBWIDogcHVibGljIFZBLCBwdWJsaWMgVkIgXHske3dzfXB1YmxpYzoke3dzfWludCB3OyR7d3N9ViAmIG9wZXJhdG9yPVxcKFYgY29uc3QgJlxcKTske3dzfVZcXChWIGNvbnN0ICZcXCk7JHt3c31WXFwodm9pZFxcKTske3dzfWludCBmXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZ2XFwodm9pZFxcKTske3dzfVx9IFxbKlxdKyRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgcFZhIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBWIDogcHVibGljIFZBLCBwdWJsaWMgVkIgXHske3dzfXB1YmxpYzoke3dzfWludCB3OygoJHt3c31WICYgb3BlcmF0b3I9XFwoViBjb25zdCAmXFwpOyl8KCR7d3N9VlxcKFYgY29uc3QgJlxcKTspfCgke3dzfVZcXCh2b2lkXFwpOyl8KCR7d3N9aW50IGZcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdnZcXCh2b2lkXFwpOykpKiR7d3N9XH0gXFsqXF0rJG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwVmEgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBwVmEiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBwVmEgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgcFZ2XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgViA6IHB1YmxpYyBWQSwgcHVibGljIFZCIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgdzske3dzfVYgJiBvcGVyYXRvcj1cXChWIGNvbnN0ICZcXCk7JHt3c31WXFwoViBjb25zdCAmXFwpOyR7d3N9VlxcKHZvaWRcXCk7JHt3c31pbnQgZlxcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2dlxcKHZvaWRcXCk7JHt3c31cfSBcWypcXSskbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBWdiIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgViA6IHB1YmxpYyBWQSwgcHVibGljIFZCIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgdzsoKCR7d3N9ViAmIG9wZXJhdG9yPVxcKFYgY29uc3QgJlxcKTspfCgke3dzfVZcXChWIGNvbnN0ICZcXCk7KXwoJHt3c31WXFwodm9pZFxcKTspfCgke3dzfWludCBmXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZ2XFwodm9pZFxcKTspKSoke3dzfVx9IFxbKlxdKyRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgcFZ2IChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgcFZ2IgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgcFZ2ICh0aW1lb3V0KSIKKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIHBWZVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIFYgOiBwdWJsaWMgVkEsIHB1YmxpYyBWQiBceyR7d3N9cHVibGljOiR7d3N9aW50IHc7JHt3c31WICYgb3BlcmF0b3I9XFwoViBjb25zdCAmXFwpOyR7d3N9VlxcKFYgY29uc3QgJlxcKTske3dzfVZcXCh2b2lkXFwpOyR7d3N9aW50IGZcXCh2b2lkXFwpOyR7d3N9dmlydHVhbCBpbnQgdnZcXCh2b2lkXFwpOyR7d3N9XH0gXFsqXF0rJG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwVmUiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIFYgOiBwdWJsaWMgVkEsIHB1YmxpYyBWQiBceyR7d3N9cHVibGljOiR7d3N9aW50IHc7KCgke3dzfVYgJiBvcGVyYXRvcj1cXChWIGNvbnN0ICZcXCk7KXwoJHt3c31WXFwoViBjb25zdCAmXFwpOyl8KCR7d3N9VlxcKHZvaWRcXCk7KXwoJHt3c31pbnQgZlxcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2dlxcKHZvaWRcXCk7KSkqJHt3c31cfSBcWypcXSskbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBWZSAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIHBWZSIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIHBWZSAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBwVmRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBWIDogcHVibGljIFZBLCBwdWJsaWMgVkIgXHske3dzfXB1YmxpYzoke3dzfWludCB3OyR7d3N9ViAmIG9wZXJhdG9yPVxcKFYgY29uc3QgJlxcKTske3dzfVZcXChWIGNvbnN0ICZcXCk7JHt3c31WXFwodm9pZFxcKTske3dzfWludCBmXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZ2XFwodm9pZFxcKTske3dzfVx9IFxbKlxdKyRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgcFZkIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBWIDogcHVibGljIFZBLCBwdWJsaWMgVkIgXHske3dzfXB1YmxpYzoke3dzfWludCB3OygoJHt3c31WICYgb3BlcmF0b3I9XFwoViBjb25zdCAmXFwpOyl8KCR7d3N9VlxcKFYgY29uc3QgJlxcKTspfCgke3dzfVZcXCh2b2lkXFwpOyl8KCR7d3N9aW50IGZcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdnZcXCh2b2lkXFwpOykpKiR7d3N9XH0gXFsqXF0rJG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwVmQgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBwVmQiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBwVmQgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgcEFEZVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIEFEIFx7JHt3c31wdWJsaWM6JHt3c31BRCAmIG9wZXJhdG9yPVxcKEFEIGNvbnN0ICZcXCk7JHt3c31BRFxcKEFEIGNvbnN0ICZcXCk7JHt3c31BRFxcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7JHt3c31cfSBcWypcXSskbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBBRGUiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIEFEIFx7JHt3c31wdWJsaWM6KCgke3dzfUFEICYgb3BlcmF0b3I9XFwoQUQgY29uc3QgJlxcKTspfCgke3dzfUFEXFwoQUQgY29uc3QgJlxcKTspfCgke3dzfUFEXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTspKSoke3dzfVx9IFxbKlxdKyRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgcEFEZSAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIHBBRGUiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBwQURlICh0aW1lb3V0KSIKKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIHBFZVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIEUgOiBwdWJsaWMgQiwgcHVibGljIHZpcnR1YWwgViwgcHVibGljIEQsIHB1YmxpYyBDIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgZTske3dzfUUgJiBvcGVyYXRvcj1cXChFIGNvbnN0ICZcXCk7JHt3c31FXFwoaW50LCBFIGNvbnN0ICZcXCk7JHt3c31FXFwoaW50XFwpOyR7d3N9dmlydHVhbCBpbnQgZlxcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2dlxcKHZvaWRcXCk7JHt3c31cfSBcWypcXSskbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBFZSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgRSA6IHB1YmxpYyBCLCBwdWJsaWMgdmlydHVhbCBWLCBwdWJsaWMgRCwgcHVibGljIEMgXHske3dzfXB1YmxpYzoke3dzfWludCBlOygoJHt3c31FICYgb3BlcmF0b3I9XFwoRSBjb25zdCAmXFwpOyl8KCR7d3N9RVxcKGludCwgRSBjb25zdCAmXFwpOyl8KCR7d3N9RVxcKGludFxcKTspfCgke3dzfXZpcnR1YWwgaW50IGZcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdmdcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdnZcXCh2b2lkXFwpOykpKiR7d3N9XH0gXFsqXF0rJG5sJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwRWUgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBwRWUiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBwRWUgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgcFZCXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgVkIgXHske3dzfXB1YmxpYzoke3dzfWludCB2Yjske3dzfVZCICYgb3BlcmF0b3I9XFwoVkIgY29uc3QgJlxcKTske3dzfVZCXFwoVkIgY29uc3QgJlxcKTske3dzfVZCXFwodm9pZFxcKTske3dzfWludCBmdmJcXCh2b2lkXFwpOyR7d3N9dmlydHVhbCBpbnQgdnZiXFwodm9pZFxcKTske3dzfVx9IFxbKlxdKyRubCRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgcFZCIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBWQiBceyR7d3N9cHVibGljOiR7d3N9aW50IHZiOygoJHt3c31WQiAmIG9wZXJhdG9yPVxcKFZCIGNvbnN0ICZcXCk7KXwoJHt3c31WQlxcKFZCIGNvbnN0ICZcXCk7KXwoJHt3c31WQlxcKHZvaWRcXCk7KXwoJHt3c31pbnQgZnZiXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZ2YlxcKHZvaWRcXCk7KSkqJHt3c31cfSBcWypcXSskbmwkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBWQiAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIHBWQiIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIHBWQiAodGltZW91dCkiCisJfQorICAgIH0KK30KKworIworIyAgVGVzdCBjYWxsaW5nIG9mIHZpcnR1YWwgZnVuY3Rpb25zLgorIworCitwcm9jIHRlc3RfdmlydHVhbF9jYWxscyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgR0RCCisgICAgZ2xvYmFsIG5sCisKKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYixjYW5ub3RfY2FsbF9mdW5jdGlvbnNdIHsKKwlzZXR1cF94ZmFpbCAiKi0qLSoiIDI0MTYKKwlmYWlsICJUaGlzIHRhcmdldCBjYW4gbm90IGNhbGwgZnVuY3Rpb25zIgorCXJldHVybiAwCisgICAgfQorCisgICAgc2VuZF9nZGIgInByaW50IHBBZS0+ZigpXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IDIwJG5sJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBwQWUtPmYoKSIgfQorCS1yZSAiQ2Fubm90IGludm9rZSBmdW5jdGlvbnMgb24gdGhpcyBtYWNoaW5lLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInByaW50IHBBZS0+ZigpIChjYW5ub3QgaW52b2tlIGZ1bmN0aW9ucywgc2tpcHBpbmcgdmlydHVhbCBjYWxscykiCisJICAgIHJldHVybiAwCisJfQorCS1yZSAiLipDYW5ub3QgYWNjZXNzIG1lbW9yeSBhdCBhZGRyZXNzIDB4OC4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwcmludCBwQWUtPmYoKSBcCisoa25vd24gZmFpbHVyZSB3aXRoIGdjYyBjeWdudXMtMi40LjUtOTMwNDE3LCBza2lwcGluZyB2aXJ0dWFsIGNhbGxzKSIKKwkgICAgcmV0dXJuIDAKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgcEFlLT5mKCkiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHJpbnQgcEFlLT5mKCkgKHRpbWVvdXQpIiB9CisJZW9mIHsgZmFpbCAicHJpbnQgcEFlLT5mKCkgKCRHREIgZHVtcGVkIGNvcmUpIChGSVhNRSkiIDsgZ2RiX3ZpcnRmdW5jX3Jlc3RhcnQ7IHJldHVybiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInByaW50IHBBYS0+ZigpXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IDEkbmwkZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IHBBYS0+ZigpIiB9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgcEFhLT5mKCkiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHJpbnQgcEFhLT5mKCkgKHRpbWVvdXQpIiB9CisJZW9mIHsgZmFpbCAicHJpbnQgcEFhLT5mKCkgKCRHREIgZHVtcGVkIGNvcmUpIChGSVhNRSkiIDsgZ2RiX3ZpcnRmdW5jX3Jlc3RhcnQ7IHJldHVybiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInByaW50IHBEZS0+dmcoKVxuIgorIyAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qID0gMjAyJG5sJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBwRGUtPnZnKCkiIH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwRGUtPnZnKCkiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHJpbnQgcERlLT52ZygpICh0aW1lb3V0KSIgfQorCWVvZiB7IGZhaWwgInByaW50IHBEZS0+dmcoKSAoJEdEQiBkdW1wZWQgY29yZSkgKEZJWE1FKSIgOyBnZGJfdmlydGZ1bmNfcmVzdGFydDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHJpbnQgcEFEZS0+dmcoKVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSAyMDIkbmwkZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IHBBRGUtPnZnKCkiIH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwQURlLT52ZygpIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IHBBRGUtPnZnKCkgKHRpbWVvdXQpIiB9CisJZW9mIHsgZmFpbCAicHJpbnQgcEFEZS0+dmcoKSAoJEdEQiBkdW1wZWQgY29yZSkgKEZJWE1FKSIgOyBnZGJfdmlydGZ1bmNfcmVzdGFydDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHJpbnQgcERkLT52ZygpXG4iCisjICAgc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSAxMDEkbmwkZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IHBEZC0+dmcoKSIgfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHBEZC0+dmcoKSIgfQorCXRpbWVvdXQgeyBmYWlsICJwcmludCBwRGQtPnZnKCkgKHRpbWVvdXQpIiB9CisJZW9mIHsgZmFpbCAicHJpbnQgcERkLT52ZygpICgkR0RCIGR1bXBlZCBjb3JlKSAoRklYTUUpIiA7IGdkYl92aXJ0ZnVuY19yZXN0YXJ0OyByZXR1cm4gfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwcmludCBwRWUtPnZ2YigpXG4iCisjICAgc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSA0MTEkbmwkZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IHBFZS0+dnZiKCkiIH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwRWUtPnZ2YigpIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IHBFZS0+dnZiKCkgKHRpbWVvdXQpIiB9CisJZW9mIHsgZmFpbCAicHJpbnQgcEVlLT52dmIoKSAoJEdEQiBkdW1wZWQgY29yZSkgKEZJWE1FKSIgOyBnZGJfdmlydGZ1bmNfcmVzdGFydDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHJpbnQgcFZCLT52dmIoKVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSA0MDckbmwkZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IHBWQi0+dnZiKCkiIH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwVkItPnZ2YigpIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IHBWQi0+dnZiKCkgKHRpbWVvdXQpIiB9CisJZW9mIHsgZmFpbCAicHJpbnQgcFZCLT52dmIoKSAoJEdEQiBkdW1wZWQgY29yZSkgKEZJWE1FKSIgOyBnZGJfdmlydGZ1bmNfcmVzdGFydDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHJpbnQgcEJlLT52dmIoKVxuIgorIyAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qID0gNDExJG5sJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBwQmUtPnZ2YigpIiB9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgcEJlLT52dmIoKSIgfQorCXRpbWVvdXQgeyBmYWlsICJwcmludCBwQmUtPnZ2YigpICh0aW1lb3V0KSIgfQorCWVvZiB7IGZhaWwgInByaW50IHBCZS0+dnZiKCkgKCRHREIgZHVtcGVkIGNvcmUpIChGSVhNRSkiIDsgZ2RiX3ZpcnRmdW5jX3Jlc3RhcnQ7IHJldHVybiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInByaW50IHBEZS0+dnZiKClcbiIKKyMgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IDQxMSRubCRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgcERlLT52dmIoKSIgfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHBEZS0+dnZiKCkiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHJpbnQgcERlLT52dmIoKSAodGltZW91dCkiIH0KKwllb2YgeyBmYWlsICJwcmludCBwRGUtPnZ2YigpICgkR0RCIGR1bXBlZCBjb3JlKSAoRklYTUUpIiA7IGdkYl92aXJ0ZnVuY19yZXN0YXJ0OyByZXR1cm4gfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwcmludCBwRWUtPnZkKClcbiIKKyMgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IDI4MiRubCRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgcEVlLT52ZCgpIiB9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgcEVlLT52ZCgpIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IHBFZS0+dmQoKSAodGltZW91dCkiIH0KKwllb2YgeyBmYWlsICJwcmludCBwRWUtPnZkKCkgKCRHREIgZHVtcGVkIGNvcmUpIChGSVhNRSkiIDsgZ2RiX3ZpcnRmdW5jX3Jlc3RhcnQ7IHJldHVybiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInByaW50IHBFZS0+ZnZiKClcbiIKKyMgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IDMxMSRubCRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgcEVlLT5mdmIoKSIgfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHBFZS0+ZnZiKCkiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHJpbnQgcEVlLT5mdmIoKSAodGltZW91dCkiIH0KKwllb2YgeyBmYWlsICJwcmludCBwRWUtPmZ2YigpICgkR0RCIGR1bXBlZCBjb3JlKSAoRklYTUUpIiA7IGdkYl92aXJ0ZnVuY19yZXN0YXJ0OyByZXR1cm4gfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwcmludCBwRWUtPkQ6OnZnKClcbiIKKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IDEwMiRubCRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgcEVlLT5EOjp2ZygpIiB9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgcEVlLT5EOjp2ZygpIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IHBFZS0+RDo6dmcoKSAodGltZW91dCkiIH0KKwllb2YgeyBmYWlsICJwcmludCBwRWUtPkQ6OnZnKCkgKCRHREIgZHVtcGVkIGNvcmUpIChGSVhNRSkiIDsgZ2RiX3ZpcnRmdW5jX3Jlc3RhcnQ7IHJldHVybiB9CisgICAgfQorfQorCitwcm9jIGRvX3Rlc3RzIHt9IHsKKyAgICBnbG9iYWwgcHJtc19pZAorICAgIGdsb2JhbCBidWdfaWQKKworICAgIHNldCBwcm1zX2lkIDAKKyAgICBzZXQgYnVnX2lkIDAKKworICAgIGdkYl9zdGFydDsKKyAgICBnZGJfdmlydGZ1bmNfaW5pdDsKKworICAgICMgR2V0IHRoZSBkZWJ1ZyBmb3JtYXQgZm9yIHRoZSBjb21waWxlZCB0ZXN0IGNhc2UuICBJZiB0aGF0CisgICAgIyBmb3JtYXQgaXMgRFdBUkYgMSB0aGVuIGp1c3Qgc2tpcCBhbGwgdGhlIHRlc3RzIHNpbmNlIG5vbmUgb2YKKyAgICAjIHRoZW0gd2lsbCBwYXNzLgorCisgICAgaWYgWyBydW50b19tYWluIF0gdGhlbiB7CisJZ2V0X2RlYnVnX2Zvcm1hdAorCWlmIFsgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIiBdIHRoZW4geworCSAgICBmYWlsICJDKysgdGVzdHMgc2tpcHBlZCBkdWUgdG8gbGltaXRlZCBDKysgc3VwcG9ydCBpbiBEV0FSRiAxIGRlYnVnIGZvcm1hdCIKKwkgICAgcmV0dXJuCisJfQorCWNsZWFyX3hmYWlsICIqLSotKiIKKyAgICB9CisKKyAgICB0ZXN0X3B0eXBlX29mX2NsYXNzZXMKKworICAgIGlmIFsgcnVudG8gJ3Rlc3RfY2FsbHModm9pZCknIF0gdGhlbiB7CisJdGVzdF92aXJ0dWFsX2NhbGxzCisgICAgfQorfQorCitkb190ZXN0cwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvQ2hhbmdlTG9nIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjQ0ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9DaGFuZ2VMb2cKQEAgLTAsMCArMSwzMTMgQEAKK1RodSBNYXkgMjEgMDI6NDU6MTggMTk5OCAgRmVsaXggTGVlICA8ZmxlZUB6b2cuY3lnbnVzLmNvbT4KKworCSogY2hleHAuZXhwOiBmaXggdGVzdHMgdGhhdCBhc3N1bWUgPjE2LWJpdCBpbnRzLgorCitXZWQgU2VwIDEwIDE1OjAxOjU1IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiAqLmV4cDogVGhlIGVuZC1hbGwgYmUtYWxsIG9mIHF1b3RpbmcgZml4ZXMuIEhhLgorCitUaHUgQXVnIDIxIDEwOjMxOjIzIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBlbnVtLmV4cDogTW9yZSBxdW90aW5nIGZpeGVzLgorCSogcHItOTk0Ni5leHA6IERpdHRvLgorCSogZ2NoMTI4MC5leHA6IERpdHRvLgorCSogZ2NoMTI3Mi5leHA6IERpdHRvLgorCitUdWUgQXVnIDEyIDIxOjQ4OjA4IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiB0ZXN0czIuZXhwOiBGaXggcXVvdGluZy4KKwkqIHRlc3RzMS5leHA6IERpdHRvLgorCSogcHItOTk0Ni5leHA6IERpdHRvLgorCSogZW51bS5leHA6IERpdHRvLgorCSogYnVpbHRpbnMuZXhwOiBEaXR0by4KKwkqIHBvd2Vyc2V0LmV4cDogRGl0dG8uCisJKiBtaXNjLmV4cDogRGl0dG8uCisJKiBnY2g5ODEuZXhwOiBEaXR0by4KKwkqIGdjaDkyMi5leHA6IERpdHRvLgorCSogZ2NoMTI4MC5leHA6IERpdHRvLgorCSogZ2NoMTI3Mi5leHA6IERpdHRvLgorCSogZ2NoMTA0MS5leHA6IERpdHRvLgorCitTYXQgTm92IDIzIDE0OjAwOjU5IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBtaXNjLmV4cDogQ2hhbmdlIHg4NiBsaW51eCBzZXR1cF94ZmFpbHMgdG8gdXNlIG5ldworIAlpKjg2LXBjLWxpbnV4Ki1nbnUgcXVhZHMuCisJKiB0dXBsZXMuZXhwOiBEaXR0by4KKwkqIHRlc3RzMi5leHA6IERpdHRvLgorCSogcHItNTAxNi5leHA6IERpdHRvLgorCisJKiB0dXBsZXMuZXhwOiBBZGQgaSo4Ni1wYy1saW51eC1nbnUgc2V0dXBfZmFpbCB0byBleGlzdGluZworCXhmYWlscyBmb3IgJ3NldCB2YXIgdnMxIDo9IFsgImJhciIsIDQyLCBtX3BzWyBhIF0gXScsCisJJ3NldCB2YXIgJGkgOj0gbV9zMVsiZm9vIiwgNDQsIG1fcHNbYSBdXScsIGFuZAorCSdzZXQgdmFyIHZzMiA6PSBbIDEwKzMsIG1fczFbICJmb28iICwgNDIsIG1fcHNbIGIgXV1dJy4KKwkKK01vbiBOb3YgMTEgMTA6Mjc6MzIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNhbGxjaC5leHA6IEFkZCBtaXBzKi1zZ2ktaXJpeCogeGZhaWwgZm9yCisJImNhbGwga2luZyhhLCBvdHRvW1sxMCwgMTVdLCBbMjAsIDI1XV0pIi4KKwkqIHByLTg3NDIuZXhwOiBBZGQgbWlwcyotc2dpLWlyaXgqIHhmYWlscyBmb3IKKwkicGFzcyBpbnQgcG93ZXJzZXQgdHVwbGUiCisJInBhc3Mgc2V0IHBvd2Vyc2V0IHR1cGxlIgorCSJwYXNzIG1vZGVsZXNzIGludCBwb3dlcnNldCB0dXBsZSIgYW5kCisJInBhc3MgbW9kZWxlc3Mgc2V0IHBvd2Vyc2V0IHR1cGxlIi4KKwkqIHR1cGxlcy5leHA6IEFkZCBzcGFyYy0qLXNvbGFyaXMqIGFuZCBzcGFyYy0qLXN1bm9zKgorCXhmYWlscyBmb3Igc2V2ZXJhbCAic2V0IHZhciIgY29tbWFuZHMgdGhhdCBhcmUgZmFpbGluZy4KKwlDb252ZXJ0IG1vc3Qgb2YgdGhlIHNldCBjb21tYW5kcyBpbnRvIGdkYl90ZXN0X2V4YWN0CisJY29tbWFuZHMuCisKK0ZyaSBPY3QgMTEgMTY6NDg6NTYgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGV4cHN0cnVjdC5leHAgKG9iamZpbGUyKTogU2V0IGFuZCB1c2UsIGxpa2Ugb3RoZXIgY2hpbGwgdGVzdHMuCisJKiBwci00OTc1LmV4cDogRGl0dG8uCisJKiBwci01NjQ2LmV4cDogRGl0dG8uCisJKiBwci04MTM0LmV4cDogRGl0dG8uCisKK1RodSBTZXAgIDUgMDE6NTQ6NDIgMTk5NiAgV2lsZnJpZWQgTW9zZXIgKEFsY2F0ZWwpICA8bW9zZXJAcnRsLmN5Z251cy5jb20+CisKKwkqIGdjaDEyODAuZXhwOiBFbmhhbmNlIHRlc3QgY2FzZS4KKworV2VkIFNlcCAgNCAwNzozMDo0NCAxOTk2ICBXaWxmcmllZCBNb3NlciAoQWxjYXRlbCkgIDxtb3NlckBydGwuY3lnbnVzLmNvbT4KKworCSogZ2NoMTI3Mi57Y2gsZXhwfSwgZ2NoMTI4MC57Y2gsZXhwfSwgcHItOTk0Ni57Y2gsZXhwfTogCisJTmV3IHRlc3QgY2FzZXMuCisKK1N1biBBdWcgMTggMTM6Mjk6NDggMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHRlc3RzMi5leHA6IFJlbW92ZSBtaXBzLXNnaS1pcml4KiBzZXR1cF94ZmFpbCBmb3IKKwkicmVhbCB3cml0ZSA0IiBhbmQgInJlYWwgd3JpdGUgOCIuCisKK01vbiBKdW4gMTAgMTQ6MDQ6MDUgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHRlc3RzMS5leHAgKHRlc3RfbW9kZXMpOiBSZW1vdmUgKi0qLSogc2V0dXBfc2ZhaWwgZm9yIAorCSJwcmludCB1bm51bWJlcmVkIHNldCByYW5nZSBtb2RlIiBhbmQKKwkicHJpbnQgbnVtYmVyZWQgc2V0IHJhbmdlIG1vZGUiLgorCitXZWQgQXByIDE3IDAxOjIzOjA2IDE5OTYgIFdpbGZyaWVkIE1vc2VyIChBbGNhdGVsKSAgPG1vc2VyQHJ0bC5jeWdudXMuY29tPgorCisJKiB0ZXN0czEue2NoLGV4cH06IFRldHMgY2FzZSBtb2RpZmllZCBhbmQgZW5oYW5jZWQuCisKK1R1ZSBBcHIgIDkgMDE6MTg6MDQgMTk5NiAgV2lsZnJpZWQgTW9zZXIgKEFsY2F0ZWwpICA8bW9zZXJAcnRsLmN5Z251cy5jb20+CisKKwkqIGdjaDk4MS57Y2gsZXhwfSwgZ2NoMTA0MS57Y2gsZXhwfTogTmV3IHRlc3QgY2FzZXMuCisKK1dlZCBNYXIgIDYgMDA6Mjk6MzUgMTk5NiAgV2lsZnJpZWQgTW9zZXIgKEFsY2F0ZWwpICA8bW9zZXJAcnRsLmN5Z251cy5jb20+CisKKwkqIHBvd2Vyc2V0LmV4cDogQWRkIHRlc3QuCisKK1R1ZSBNYXIgIDUgMjM6NDE6MzkgMTk5NiAgV2lsZnJpZWQgTW9zZXIgKEFsY2F0ZWwpICA8bW9zZXJAcnRsLmN5Z251cy5jb20+CisKKwkqIGdjaDkyMi57Y2gsZXhwfSwgcG93ZXJzZXQue2NoLGV4cH06IE5ldyB0ZXN0IGNhc2VzLgorCisJKiBidWlsdGlucy5leHAsIGNoaWxsdmFycy5leHAsIG1pc2MuZXhwLCB0ZXN0czEuZXhwOiBVcGRhdGVkCisJZHVlIHRvIG5ldyBmb3JtYXQgb2Ygbm9ucHJpbnRhYmxlIGNoYXJhY3RlcnMgKGNvbnRyb2wgc2VxdWVuY2UKKwlpbnN0ZWFkIG9mIEMneHgnKS4KKwkKK1R1ZSBNYXIgIDUgMDA6MDk6MTcgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIHN0cmluZy5jaCwgc3RyaW5nLmV4cDogIEFkZCB0ZXN0cyAoZnJvbSBDeWdudXMgUFIgY2hpbGwvOTA3OCkuCisKKwkqIHByLTkwOTUuY2gsIHByLTkwOTUuZXhwOiAgTmV3IHRlc3QgY2FzZS4KKworRnJpIEZlYiAgOSAwODoyMjoxNiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogQWRkIG1pc3NpbmcgJ3snLgorCitUdWUgRmViICA2IDIxOjUyOjI2IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBwci04ODk0LmV4cCwgcHItODg5NC5jaCwgcHItODg5NC1ncnQuY2g6ICBOZXcgdGVzdCBjYXNlLgorCitNb24gSmFuIDI5IDAwOjA1OjAxIDE5OTYgIFdpbGZyaWVkIE1vc2VyIChBbGNhdGVsKSAgPG1vc2VyQHJ0bC5jeWdudXMuY29tPgorCisJKiBidWlsdGlucy5jaCwgYnVpbHRpbnMuZXhwOiBFbmhhbmNlIHRlc3QgY2FzZS4KKworCSogZXh0c3RydWN0LmNoLCBleHRzdHJ1Y3QtZ3J0LmNoLCBleHRzdHJ1Y3QuZXhwOiBOZXcgdGVzdCBjYXNlLgorCitUdWUgSmFuIDIzIDE2OjU3OjEzIDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBlbnVtLmNoLCBlbnVtLmV4cDogIE5ldyB0ZXN0IGNhc2UgKGNvdmVycyBQUnMgODg2OSBhbmQgODg3MCkuCisKK1RodSBKYW4gMTEgMTc6MzQ6MDEgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChQUk9HUyk6ICBSZW1vdmVkLgorCShjbGVhbiBtb3N0bHljbGVhbik6ICBSZW1vdmUgKi5leGUgcmF0aGVyIHRoYW4gJHtQUk9HU30uCisKKwkqIHByLTg3NDIuY2gsIHByLTg3NDIuZXhwOiAgTmV3IHRlc3QgY2FzZS4KKworVHVlIEphbiAgOSAwNDo0NzoyNyAxOTk2ICBXaWxmcmllZCBNb3NlciAoQWxjYXRlbCkgIDxtb3NlckBydGwuY3lnbnVzLmNvbT4KKworCSogbWlzYy5jaCwgbWlzYy5leHA6IEVuaGFuY2UgdGVzdCBjYXNlLgorCitTYXQgRGVjIDMwIDE1OjMxOjU5IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiB0ZXN0czIuZXhwOiBTZXR1cF94ZmFpbCAiaSo4Ni0qLWxpbnV4IiBhbmQgCisJIm1pcHMtc2dpLWlyaXgqIiBmb3IgInJlYWwgd3JpdGUgNCIgYW5kICJyZWFsIHdyaXRlIDgiLgorCUNvbmRpdGlvbmFsaXplIGJvdGggdGVzdHMgZm9yIHN5c3RlbSBzcGVjaWZpYyB2YWx1ZQorCW9mICJpbmZpbml0eSIgc3RyaW5nLgorCitGcmkgRGVjIDI5IDEwOjQ2OjA5IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBidWlsdGlucy5leHAgKHRlc3Rfc2l6ZSk6ICBBbHBoYSBzZWVtcyB0byBoYXZlIGxvbmcgYnVpbHRpbnMuCisJKiB0ZXN0czEuZXhwOiBTZXR1cCB4ZmFpbCAiKi0qLSoiIGZvciAicHR5cGUgcjIiLgorCSogdGVzdHMyLmV4cDogQWRkIGNoZWNrIHRvIHNraXAgY2hpbGwgdGVzdHMuCisJCitNb24gRGVjIDExIDE2OjUzOjQwIDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiB0dXBsZXMuY2gsIHR1cGxlcy5leHA6ICBFeGhhbmNlIHRlc3QgY2FzZXMgKGZyb20gUFIgODY0MykuCisKK01vbiBEZWMgMTEgMDY6NTc6MDcgMTk5NSAgV2lsZnJpZWQgTW9zZXIgKEFsY2F0ZWwpICA8bW9zZXJAcnRsLmN5Z251cy5jb20+CisKKwkqIGJ1aWx0aW5zLmV4cCwgcHItNTAxNi57Y2gsZXhwfSwgcmVzdWx0LntjaCxleHB9LAorCXRlc3RzMS57Y2gsZXhwfTogRW5oYW5jZSB0ZXN0IGNhc2VzLgorCitUaHUgRGVjICA3IDA1OjE2OjM0IDE5OTUgIFdpbGZyaWVkIE1vc2VyIChBbGNhdGVsKSAgPG1vc2VyQHJ0bC5jeWdudXMuY29tPgorCisJKiBidWlsdGlucy5jaCwgYnVpbHRpbnMuZXhwLCBNYWtlZmlsZS5pbjogTmV3IHRlc3QgY2FzZS4KKworVHVlIERlYyAgNSAwMTo1MTo0NSAxOTk1ICBXaWxmcmllZCBNb3NlciAoQWxjYXRlbCkgIDxtb3NlckBydGwuY3lnbnVzLmNvbT4KKworCSogdGVzdHMyLmV4cDogQWRkIGNvbXBpbGluZyBvZiB0aGUgdGVzdCBjYXNlLgorCitGcmkgRGVjICAxIDAwOjA4OjM3IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBwci04NDA1LmNoLCBwci04NDA1LmV4cCwgTWFrZWZpbGUuaW46ICBOZXcgdGVzdCBjYXNlLgorCisJKiB0ZXN0czEuZXhwLCB0ZXN0czIuZXhwICh0ZXN0X3ByaW50X3JlamVjdCk6ICBSZW1vdmU7ICBjYXVzZXMKKwljb25mbGljdHMgd2l0aCBsYXRlciB0ZXN0cyB1c2luZyB0ZXN0X3ByaW50X3JlamVjdCBpbiAuLi9saWIvZ2RiLmV4cC4KKwkocGFzc2NvdW50KTogIFJlbW92ZS4KKwkqIHRlc3RzMi5leHAgKHRlc3RfcHJpbnRfYWNjZXB0KTogIFJlbW92ZWQuCisJKHRlc3Rfd3JpdGUpOiAgUmUtd3JpdGUgdG8gdXNlIGdkYl90ZXN0IHJhdGhlciB0aGFuIHRlc3RfcHJpbnRfYWNjZXB0LgorCSogdGVzdHMxLmV4cCAodGVzdF9wcmludF9hY2NlcHRfZXhhY3QpOiAgUmVtb3ZlZC4KKwkodGVzdHNfbG9jYXRpb25zKTogIFJld3JpdGUgdG8gdXNlIGdkYl90ZXN0IGFuZCBub3QgYWJvdmUgcHJvYy4KKwkKKwkqIHRlc3RzMS5jaCwgdGVzdHMxLmV4cCwgdGVzdHMyLmNoLCB0ZXN0czIuZXhwLCBNYWtlZmlsZS5pbjoKKwlOZXcgKGV4dGVuc2l2ZSkgdGVzdCBjYXNlcy4KKwkqIGNoZXhwLmV4cDogIEZpeCByZWxhdGlvbnMgdG8gcmV0dXJuIFRSVUUgb3IgRkFMU0UuCisKK1dlZCBOb3YgMjkgMTk6Mjg6MTMgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiAgQWRkIC5leHAuY2hlY2sgcnVsZS4KKwkqIGNhbGxjaC5jaDogIEFkZCBtaXNzaW5nICIlLiIgdG8gZm9ybWF0IHN0cmluZ3MuCisJKiBjYWxsY2guZXhwOiAgRml4IGFyZ3VtZW50IHRvIGdkYl9sb2FkLgorCSogY2hleHAuZXhwOiAgQWRkIHNwZWNpZmljIGVycm9yIG1lc3NhZ2VzIHRvIHRlc3RfcHJpbnRfcmVqZWN0IGNhbGxzLgorCSogbWlzYy5leHA6ICBBZGQgYSB0ZXN0IGZvciBQUiA4NDk2LgorCSogcHItNjYzMi5leHAsIHByLTgxMzYuZXhwOiAgTGluayBleGVjdXRhYmxlcyBmcm9tIHR3byAubyBmaWxlcy4KKworU2F0IE5vdiAyNSAyMDo0OToyNyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAcGh5ZGVhdXguY3lnbnVzLmNvbT4KKworCSogcHItNTAxNi5leHA6IHhmYWlsICJ3aGF0aXMgaSIgZm9yIGFscGhhLW9zZi1kZWMtb3NmMiosIHNhbWUgYXMgbGludXguCisKK1N1biBPY3QgMjkgMTc6NTg6MDEgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHByLTUwMTYuZXhwOiB4ZmFpbCAid2hhdGlzIGkiIGZvciBzcGFyYy1zdW4tc3Vub3M0Kiwgc2FtZSBhcyBsaW51eC4KKworV2VkIE9jdCAgNCAxODoyMDo1MyAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogcHItODEzNi57Y2gsZXhwfSwgcHItODEzNC5leHAsIGZ1bmMxLmNoLCBNYWtlZmlsZS5pbjogTmV3IHRlc3QgY2FzZXMuCisKK1dlZCBTZXAgMjcgMTE6NTE6NTAgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIHR1cGxlcy5jaC4gdHVwbGVzLmV4cDogIEFkZCBuZXcgdGVzdCBmb3Igc2V0dGluZyBhIHZhcmlhbnQgcmVjb3JkCisJdXNpbmcgYSB0dXBsZSwgYW5kIGFjY2VzcyB0aGUgZmllbGRzLgorCitUaHUgQXVnICAzIDEwOjQ1OjM3IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBVcGRhdGUgYWxsIEZTRiBhZGRyZXNzZXMgZXhjZXB0IHRob3NlIGluIENPUFlJTkcqIGZpbGVzLgorCitUaHUgSnVsIDI3IDIwOjM2OjMwIDE5OTUgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBwci01MDE2LmV4cDogeGZhaWwgImkqODYtKi1saW51eCoiIGZvciAid2hhdGlzIGludC1yYW5nZSIKKwl0ZXN0LiAgVGhpbmtzIGl0IGlzICJfY2ludCIgcmF0aGVyIHRoYW4gIm1faW5kZXgiLgorCSogbWlzYy5leHA6IHhmYWlsICJpKjg2LSotbGludXgqIiBmb3IgImluZm8gbGluZSIgdGVzdC4KKwlMaW5lIG51bWJlciBpcyBvZmYgYnkgb25lLgorCitXZWQgSnVuIDE0IDEzOjA3OjQ1IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBjaGlsbHZhcnMuZXhwLCBzdHJpbmcuZXhwOiAgTmV3IHRlc3RzIGZvciBMT1dFUi9VUFBFUi9MRU5HVEguCisKK1dlZCBKdW4gIDcgMTc6NTI6MzggMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIGNoaWxsdmFycy5jaCAoeHB0cik6ICBEZWNsYXJlIG5ldyB2YXJpYWJsZS4KKwkqIGNoaWxsdmFycy5leHAgKHRlc3RfcHRyKTogIE5ldyBmdW5jdGlvbiB0byB0ZXN0IEVYUFItPk1PREVOQU1FLgorCitUdWUgTWFyIDI4IDE3OjEzOjEzIDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBwci02NjMyLmNoLCBwci02NjMyLWdydC5jaCwgcHItNjYzMi5leHAsIE1ha2VmaWxlLmluOiAgTmV3IHRlc3QgY2FzZS4KKworVHVlIE1hciAyMSAxMjoxMDowNiAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogdHVwbGVzLmV4cCAoZG9fdGVzdHMpOiBNYWtlIG5hbWVzIG9mICJwcmludCB2X3BzIiB0ZXN0IHVuaXF1ZS4KKworV2VkIE1hciAgOCAxMzoyNjozNiAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogKi5leHA6IFNraXAgYWxsIHRlc3RzIHNpbGVudGx5IGlmIHNraXBfY2hpbGxfdGVzdHMgcmV0dXJucyB0cnVlLgorCisJKiBtaXNjLmV4cDogUmVtb3ZlIHJlZmVyZW5jZSB0byBub24tZXhpc3RlbnQgdmFyaWFibGUgcGFzc2NvdW50LgorCitUdWUgTWFyICA3IDE5OjMwOjA1IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBzdHJpbmcuY2gsIHN0cmluZy5leHAsIE1ha2VmaWxlLmluOiAgTmV3IHRlc3QgY2FzZS4KKworTW9uIE1hciAgNiAxNDoxMTowMSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogdHVwbGVzLmNoIChzZXRubW9kZSk7ICBOZXcgbW9kdWxlLgorCSogdHVwbGVzLmV4cDogIEFkZCBzb21lIGV4dHJhIHRlc3RzLgorCitTYXQgTWFyICA0IDE1OjE2OjE3IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgorCisJKiBjYWxsY2guY2gsIGNhbGxjaC5leHAsIE1ha2VmaWxlLmluOiAgTmV3IHRlc3QgY2FzZS4KKworVGh1IE1hciAgMiAwNjoxNzo0MSAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogbWlzYy5leHA6IElmIGV4ZWN1dGFibGUgZG9lcyBub3QgZXhpc3QsIGlzc3VlIHdhcm5pbmcgYW5kIHNraXAKKwlyZW1haW5pbmcgdGVzdHMsIGxpa2Ugb3RoZXIgY2hpbGwgdGVzdHMuCisKK1dlZCBNYXIgIDEgMjA6Mjg6NDIgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIG1pc2MuY2gsIG1pc2MuZXhwLCBNYWtlZmlsZS5pbjogIE5ldyB0ZXN0IGNhc2UuCisKK01vbiBGZWIgMjAgMTY6MTk6NTggMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIGNoaWxsdmFycy5jaDogIEFkZCBtaXNzaW5nIElOSVQncy4KKwkqIGNoaWxsdmFycy5leHA6ICBBbGxvdyBidWlsdGluIHR5cGVzIGFzIGVpdGhlciBjYXNlLiBFLmcuIChCT09MfGJvb2wpLgorCSogcHItNTAxNi5leHA6ICBMaWtld2lzZS4KKworU3VuIEZlYiAxMiAxMToyNjowOCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogcHItNjI5Mi5jaCwgcHItNjI5Mi5leHAsIE1ha2VmaWxlLmluOiAgTmV3IHRlc3QgY2FzZS4KKworV2VkIEZlYiAgMSAxMzowOTo0OCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KKworCSogdHVwbGVzLmNoLCB0dXBsZXMuZXhwLCBNYWtlZmlsZS5pbjogIE5ldyB0ZXN0IGNhc2UuCisKK01vbiBOb3YgMjggMTg6Mzk6MDggMTk5NCAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+CisKKwkqIHByLTU5ODQuY2gsIHByLTU5ODQuZXhwLCBNYWtlZmlsZS5pbjogIE5ldyB0ZXN0IGNhc2UuCisKK0ZyaSBTZXAgMTYgMTY6NTU6MDMgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIHByLTU2NDYuY2gsIHByLTU2NDYtZ3J0LmNoLCBwci01NjQ2LmV4cCwgTWFrZWZpbGUuaW46IE5ldyB0ZXN0Y2FzZS4KKworVHVlIFNlcCAgNiAxMzoyMToyNyAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogcHItNTAxNi5jaCwgcHItNTAxNi5leHAsIE1ha2VmaWxlLmluOiAgTmV3IHRlc3RjYXNlLgorCSogTWFrZWZpbGUuaW4gKC5leGUuY2hlY2spOiAgTmV3IHJ1bGUsIHRvIHJ1biBqdXN0IG9uZSB0ZXN0LgorCitUdWUgSnVuIDE0IDE2OjIwOjE4IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQorCisJKiByZXN1bHQuY2gsIHJlc3VsdC5leHAsIE1ha2VmaWxlLmluOiAgTmV3IHRlc3QgY2FzZS4KKwkqIHByLTQ5NzUuY2gsIHByLTQ5NzUtZ3J0LmNoLCBwci00OTc1LmV4cCwgTWFrZWZpbGUuaW46ICBEaXR0by4KKworVGh1IEp1biAgOSAxNToyMDo0MyAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogcHItNTAyMi5jaCwgcHItNTAyMi5leHA6ICBOZXcgdGVzdGNhc2UuCisJKiBjaGlsbHZhcnMuZXhwOiAgUmVtb3ZlIHNwdXJpb3VzIG5ld2xpbmUuCisKKwkqIE1ha2VmaWxlLmluOiAgQnVuY2ggb2YgZml4ZXMgc28gaXQgYWN0dWFsbHkgd29ya3MgaW4gdGhpcworCWRpcmVjdG9yeS4gIChFLmcuIGFkZCBleHRyYSAuLi8gd2hlcmUgbmVlZGVkLikKKwlBbHNvLCBhZGQgLmV4ZSB0byBleGVjdXRhYmxlcywgc28gd2UgY2FuIHVzZSBzdWZmaXggcnVsZXMuCisJKiBjaGV4cC5leHAgKHRlc3RfcHJpbnRfcmVqZWN0KTogIFVwZGF0ZSBzeW50YXggZXJyb3IgbWVzc2FnZS4KKwkqIGNoaWxsdmFycy5jaCAobW9kdWxlIFBSXzUwMjApOiAgTW92ZWQgZnJvbSBoZXJlIC4uLgorCSogcHItNTAyMi5jaDogLi4uIHRvIHRoaXMgbmV3IGZpbGUuCisJKiBjaGlsbHZhcnMuZXhwLCBwci01MDIwLmV4cCAoYmluZmlsZSk6ICBBZGQgLmV4ZSBleHRlbnNpb24uCisJKiBjaGlsbHZhcnMuZXhwLCBwci01MDIwLmV4cDogRG9uJ3QgY2hlY2sgYWxsX2ZsYWcuCisJKiBwci01MDIwLmV4cDogIEFkZCBtb3JlIHRlc3RzOyBmaXggInByaW50IHkgcHJldHR5IiBvdXRwdXQuCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9NYWtlZmlsZS5pbiBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NjViNTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDI2IEBACitzcmNkaXIgPSBAc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorCithbGw6IAorCUBlY2hvICJOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIGFsbC4uLiIKKworIyMjIyBob3N0LCB0YXJnZXQsIGFuZCBzaXRlIHNwZWNpZmljIE1ha2VmaWxlIGZyYWdzIGNvbWUgaW4gaGVyZS4KKworLlNVRkZJWEVTOiAuY2ggLm8gLmV4ZSAuZXhwIC5jaGVjaworCisjIERvICdtYWtlIGNoaWxsdmFycy5jaGVjaycgdG8gcnVuIGp1c3QgdGhlIGNoaWxsdmFycy57Y2gsZXhwfSB0ZXN0LgorCisuZXhwLmNoZWNrOgorCXJvb3RtZT1gcHdkYC87IGV4cG9ydCByb290bWU7IFwKKwljZCAuLiA7IFwKKwkkKE1BS0UpIGp1c3QtY2hlY2sgUlVOVEVTVEZMQUdTPSIke1JVTlRFU1RGTEFHU30gJCouZXhwIiBcCisJICBFWFBFQ1Q9JHtFWFBFQ1R9CisKK2NsZWFuIG1vc3RseWNsZWFuOgorCS1ybSAtZiAqLm8gJHtPQkpTfSAqLmV4ZSAqfiBjb3JlIAorCitkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW46IGNsZWFuCisJLXJtIC1mIE1ha2VmaWxlIGNvbmZpZy5zdGF0dXMgY29uZmlnLmxvZworCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQoc3JjZGlyKS9jb25maWd1cmUuaW4KKwkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9idWlsdGlucy5jaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2J1aWx0aW5zLmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTJjODMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9idWlsdGlucy5jaApAQCAtMCwwICsxLDgzIEBACit4eDogTU9EVUxFCisKK0RDTCB2X2Jvb2wgQk9PTCBJTklUIDo9IEZBTFNFOworRENMIHZfY2hhciBDSEFSIElOSVQgOj0gJ1gnOworRENMIHZfYnl0ZSBCWVRFIElOSVQgOj0gLTMwOworRENMIHZfdWJ5dGUgVUJZVEUgSU5JVCA6PSAzMDsKK0RDTCB2X2ludCBJTlQgSU5JVCA6PSAtMzMzOworRENMIHZfdWludCBVSU5UIElOSVQgOj0gMzMzOworRENMIHZfbG9uZyBMT05HIElOSVQgOj0gLTQ0NDQ7CitEQ0wgdl91bG9uZyBVTE9ORyBJTklUIDo9IDQ0NDQ7CitEQ0wgdl9wdHIgUFRSOworCitTWU5NT0RFIG1fc2V0ID0gU0VUIChlMSwgZTIsIGUzLCBlNCwgZTUsIGU2KTsKK0RDTCB2X3NldCBtX3NldCBJTklUIDo9IGUzOworCitTWU5NT0RFIG1fc2V0X3JhbmdlID0gbV9zZXQoZTI6ZTUpOworRENMIHZfc2V0X3JhbmdlIG1fc2V0X3JhbmdlIElOSVQgOj0gZTM7CisKK1NZTk1PREUgbV9udW1iZXJlZF9zZXQgPSBTRVQgKG4xID0gMjUsIG4yID0gMjIsIG4zID0gMzUsIG40ID0gMzMsCisJCQkgICAgICBuNSA9IDQ1LCBuNiA9IDQzKTsKK0RDTCB2X251bWJlcmVkX3NldCBtX251bWJlcmVkX3NldCBJTklUIDo9IG4zOworCitTWU5NT0RFIG1fY2hhcl9yYW5nZSA9IENIQVIoJ0EnOidaJyk7CitEQ0wgdl9jaGFyX3JhbmdlIG1fY2hhcl9yYW5nZSBJTklUIDo9ICdHJzsKKworU1lOTU9ERSBtX2Jvb2xfcmFuZ2UgPSBCT09MKEZBTFNFOkZBTFNFKTsKK0RDTCB2X2Jvb2xfcmFuZ2UgbV9ib29sX3JhbmdlOworCitTWU5NT0RFIG1fbG9uZ19yYW5nZSA9IExPTkcoMjU1OjMyMTEpOworRENMIHZfbG9uZ19yYW5nZSBtX2xvbmdfcmFuZ2UgSU5JVCA6PSAxMDAwOworCitTWU5NT0RFIG1fcmFuZ2UgPSBSQU5HRSgxMjoyOCk7CitEQ0wgdl9yYW5nZSBtX3JhbmdlIElOSVQgOj0gMjM7CisKK1NZTk1PREUgbV9jaGFycyA9IENIQVJTKDIwKTsKK1NZTk1PREUgbV9jaGFyc192ID0gQ0hBUlMoMjApIFZBUllJTkc7CitEQ0wgdl9jaGFycyBDSEFSUygyMCk7CitEQ0wgdl9jaGFyc192IENIQVJTKDIwKSBWQVJZSU5HIElOSVQgOj0gImZvbyBiYXIiOworCitTWU5NT0RFIG1fYml0cyA9IEJPT0xTKDEwKTsKK0RDTCB2X2JpdHMgQk9PTFMoMTApOworCitTWU5NT0RFIG1fYXJyID0gQVJSQVkoMToxMCkgQllURTsKK0RDTCB2X2FyciBBUlJBWSgxOjEwKSBCWVRFOworCitTWU5NT0RFIG1fY2hhcl9hcnIgPSBBUlJBWSAoQ0hBUikgQllURTsKK0RDTCB2X2NoYXJfYXJyIEFSUkFZKENIQVIpIEJZVEU7CisKK1NZTk1PREUgbV9ib29sX2FyciA9IEFSUkFZIChCT09MKSBCWVRFOworRENMIHZfYm9vbF9hcnIgQVJSQVkgKEJPT0wpIEJZVEU7CisKK1NZTk1PREUgbV9pbnRfYXJyID0gQVJSQVkgKElOVCkgQllURTsKK0RDTCB2X2ludF9hcnIgQVJSQVkgKElOVCkgQllURTsKKworU1lOTU9ERSBtX3NldF9hcnIgPSBBUlJBWSAobV9zZXQpIEJZVEU7CitEQ0wgdl9zZXRfYXJyIEFSUkFZIChtX3NldCkgQllURTsKKworU1lOTU9ERSBtX251bWJlcmVkX3NldF9hcnIgPSBBUlJBWSAobV9udW1iZXJlZF9zZXQpIEJZVEU7CitEQ0wgdl9udW1iZXJlZF9zZXRfYXJyIEFSUkFZIChtX251bWJlcmVkX3NldCkgQllURTsKKworU1lOTU9ERSBtX2NoYXJfcmFuZ2VfYXJyID0gQVJSQVkgKG1fY2hhcl9yYW5nZSkgQllURTsKK0RDTCB2X2NoYXJfcmFuZ2VfYXJyIEFSUkFZIChtX2NoYXJfcmFuZ2UpIEJZVEU7CisKK1NZTk1PREUgbV9zZXRfcmFuZ2VfYXJyID0gQVJSQVkgKG1fc2V0X3JhbmdlKSBCWVRFOworRENMIHZfc2V0X3JhbmdlX2FyciBBUlJBWSAobV9zZXRfcmFuZ2UpIEJZVEU7CisKK1NZTk1PREUgbV9ib29sX3JhbmdlX2FyciA9IEFSUkFZIChtX2Jvb2xfcmFuZ2UpIEJZVEU7CitEQ0wgdl9ib29sX3JhbmdlX2FyciBBUlJBWSAobV9ib29sX3JhbmdlKSBCWVRFOworCitTWU5NT0RFIG1fbG9uZ19yYW5nZV9hcnIgPSBBUlJBWSAobV9sb25nX3JhbmdlKSBCWVRFOworRENMIHZfbG9uZ19yYW5nZV9hcnIgQVJSQVkgKG1fbG9uZ19yYW5nZSkgQllURTsKKworU1lOTU9ERSBtX3JhbmdlX2FyciA9IEFSUkFZIChtX3JhbmdlKSBCWVRFOworRENMIHZfcmFuZ2VfYXJyIEFSUkFZIChtX3JhbmdlKSBCWVRFOworCitTWU5NT0RFIG1fc3RydWN0ID0gU1RSVUNUIChpIExPTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjIENIQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzIENIQVJTKDMwKSk7CitEQ0wgdl9zdHJ1Y3QgbV9zdHJ1Y3Q7CisKK3ZfYm9vbCA6PSBUUlVFOworCitFTkQgeHg7CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9idWlsdGlucy5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9idWlsdGlucy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1Y2EyMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2J1aWx0aW5zLmV4cApAQCAtMCwwICsxLDQ0MSBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHRlc3RzIHZhcmlvdXMgQ2hpbGwgdmFsdWVzLCBleHByZXNzaW9ucywgYW5kIHR5cGVzLgorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworaWYgW3NraXBfY2hpbGxfdGVzdHNdIHRoZW4geyBjb250aW51ZSB9CisKK3NldCB0ZXN0ZmlsZSAiYnVpbHRpbnMiCitzZXQgc3JjZmlsZSAke3NyY2Rpcn0vJHN1YmRpci8ke3Rlc3RmaWxlfS5jaAorc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5leGUKK2lmICB7IFtjb21waWxlICIke3NyY2ZpbGV9IC1nIC13IC1vICR7YmluZmlsZX0gJHtDSElMTF9SVDB9ICR7Q0hJTExfTElCfSJdICE9ICIiIH0geworICAgIHBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3NyY2ZpbGV9IgorICAgIHJldHVybiAtMQorfQorCisjIFNldCB0aGUgY3VycmVudCBsYW5ndWFnZSB0byBjaGlsbC4gIFRoaXMgY291bnRzIGFzIGEgdGVzdC4gIElmIGl0CisjIGZhaWxzLCB0aGVuIHdlIHNraXAgdGhlIG90aGVyIHRlc3RzLgorCitwcm9jIHNldF9sYW5nX2NoaWxsIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBiaW5maWxlIG9iamRpciBzdWJkaXIKKworICAgIHZlcmJvc2UgImxvYWRpbmcgZmlsZSAnJGJpbmZpbGUnIgorICAgIGdkYl9sb2FkICRiaW5maWxlCisgICAgc2VuZF9nZGIgInNldCBsYW5ndWFnZSBjaGlsbFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorCXRpbWVvdXQgeyBmYWlsICJzZXQgbGFuZ3VhZ2UgY2hpbGwgKHRpbWVvdXQpIiA7IHJldHVybiAwIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAic2hvdyBsYW5ndWFnZVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogc291cmNlIGxhbmd1YWdlIGlzIFwiY2hpbGxcIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJzZXQgbGFuZ3VhZ2UgdG8gXCJjaGlsbFwiIgorCSAgICBzZW5kX2dkYiAiYnJlYWsgeHhfXG4iCisJICAgIGdkYl9leHBlY3QgeworCQktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCQkgICAgc2VuZF9nZGIgInJ1blxuIiAKKwkJICAgIGdkYl9leHBlY3QgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9CisJCSAgICByZXR1cm4gMQorCQl9CisJCXRpbWVvdXQgeworCQkgICAgZmFpbCAiY2FuJ3Qgc2V0IGJyZWFrcG9pbnQgKHRpbWVvdXQpIgorCQkgICAgcmV0dXJuIDAKKwkJfQorCSAgICB9CisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInNldHRpbmcgbGFuZ3VhZ2UgdG8gXCJjaGlsbFwiIgorCSAgICByZXR1cm4gMAorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAiY2FuJ3Qgc2hvdyBsYW5ndWFnZSAodGltZW91dCkiCisJICAgIHJldHVybiAwCisJfQorICAgIH0KK30KKworIyBUZXN0aW5nIHByaW50aW5nIG9mIGEgc3BlY2lmaWMgdmFsdWUuICBJbmNyZW1lbnQgcGFzc2NvdW50IGZvcgorIyBzdWNjZXNzIG9yIGlzc3VlIGZhaWwgbWVzc2FnZSBmb3IgZmFpbHVyZS4gIEluIGJvdGggY2FzZXMsIHJldHVybgorIyBhIDEgdG8gaW5kaWNhdGUgdGhhdCBtb3JlIHRlc3RzIGNhbiBwcm9jZWVkLiAgSG93ZXZlciBhIHRpbWVvdXQKKyMgaXMgYSBzZXJpb3VzIGVycm9yLCBnZW5lcmF0ZXMgYSBzcGVjaWFsIGZhaWwgbWVzc2FnZSwgYW5kIGNhdXNlcworIyBhIDAgdG8gYmUgcmV0dXJuZWQgdG8gaW5kaWNhdGUgdGhhdCBtb3JlIHRlc3RzIGFyZSBsaWtlbHkgdG8gZmFpbAorIyBhcyB3ZWxsLgorIworIyBBcmdzIGFyZToKKyMKKyMJRmlyc3Qgb25lIGlzIHN0cmluZyB0byBzZW5kX2dkYiB0byBnZGIKKyMJU2Vjb25kIG9uZSBpcyBzdHJpbmcgdG8gbWF0Y2ggZ2RiIHJlc3VsdCB0bworIwlUaGlyZCBvbmUgaXMgYW4gb3B0aW9uYWwgbWVzc2FnZSB0byBiZSBwcmludGVkCisKK3Byb2MgdGVzdF9wcmludF9hY2NlcHQgeyBhcmdzIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIHBhc3Njb3VudAorICAgIGdsb2JhbCB2ZXJib3NlCisKKyAgICBpZiBbbGxlbmd0aCAkYXJnc109PTMgdGhlbiB7CisJc2V0IG1lc3NhZ2UgW2xpbmRleCAkYXJncyAyXQorICAgIH0gZWxzZSB7CisJc2V0IG1lc3NhZ2UgW2xpbmRleCAkYXJncyAwXQorICAgIH0KKyAgICBzZXQgc2VuZHRoaXMgW2xpbmRleCAkYXJncyAwXQorICAgIHNldCBleHBlY3R0aGlzIFtsaW5kZXggJGFyZ3MgMV0KKyAgICBzZXQgcmVzdWx0IFtnZGJfdGVzdCAkc2VuZHRoaXMgIi4qID0gJHtleHBlY3R0aGlzfSIgJG1lc3NhZ2VdCisgICAgaWYgJHJlc3VsdD09MCB7aW5jciBwYXNzY291bnR9CisgICAgcmV0dXJuICRyZXN1bHQKK30KKworcHJvYyB0ZXN0X2xvd2VyIHt9IHsKKyAgICBnbG9iYWwgcGFzc2NvdW50CisKKyAgICB2ZXJib3NlICJ0ZXN0aW5nIGJ1aWx0aW4gTE9XRVIiCisgICAgc2V0IHBhc3Njb3VudCAwCisKKyAgICAjIGRpc2NyZXRlIG1vZGUgbmFtZXMKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIoYm9vbCkiICJGQUxTRSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIoY2hhcikiIHsnXF5bKF0wWyldJ30KKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIoYnl0ZSkiICItMTI4IgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsb3dlcih1Ynl0ZSkiICIwIgorICAgIGlmIFtpc3RhcmdldCAiYWxwaGEtKi0qIl0gdGhlbiB7CisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKGludCkiICItMjE0NzQ4MzY0OCIKKyAgICB9IGVsc2UgeworCXRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsb3dlcihpbnQpIiAiLTMyNzY4IgorICAgIH0KKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIodWludCkiICIwIgorICAgIHNldHVwX3hmYWlsICJhbHBoYS0qLSoiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKGxvbmcpIiAiLTIxNDc0ODM2NDgiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKHVsb25nKSIgIjAiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKG1fc2V0KSIgImUxIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsb3dlcihtX3NldF9yYW5nZSkiICJlMiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIobV9udW1iZXJlZF9zZXQpIiAibjIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKG1fY2hhcl9yYW5nZSkiICInQSciCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKG1fYm9vbF9yYW5nZSkiICJGQUxTRSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIobV9sb25nX3JhbmdlKSIgIjI1NSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIobV9yYW5nZSkiICIxMiIKKworICAgICMgZGlzY3JldGUgbG9jYXRpb25zCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKHZfYm9vbCkiICJGQUxTRSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIodl9jaGFyKSIgeydcXlsoXTBbKV0nfQorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsb3dlcih2X2J5dGUpIiAiLTEyOCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIodl91Ynl0ZSkiICIwIgorICAgIGlmIFtpc3RhcmdldCAiYWxwaGEtKi0qIl0gdGhlbiB7CisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKHZfaW50KSIgIi0yMTQ3NDgzNjQ4IgorICAgIH0gZWxzZSB7CisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKHZfaW50KSIgIi0zMjc2OCIKKyAgICB9CisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKHZfdWludCkiICIwIgorICAgIHNldHVwX3hmYWlsICJhbHBoYS0qLSoiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKHZfbG9uZykiICItMjE0NzQ4MzY0OCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIodl91bG9uZykiICIwIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsb3dlcih2X3NldCkiICJlMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIodl9zZXRfcmFuZ2UpIiAiZTIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKHZfbnVtYmVyZWRfc2V0KSIgIm4yIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsb3dlcih2X2NoYXJfcmFuZ2UpIiAiJ0EnIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsb3dlcih2X2Jvb2xfcmFuZ2UpIiAiRkFMU0UiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKHZfbG9uZ19yYW5nZSkiICIyNTUiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKHZfcmFuZ2UpIiAiMTIiCisKKyAgICAjIHN0cmluZyBtb2RlIG5hbWVzCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKG1fY2hhcnMpIiAiMCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIobV9jaGFyc192KSIgIjAiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKG1fYml0cykiICIwIgorCisgICAgIyBzdHJpbmcgbG9jYXRpb25zCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKHZfY2hhcnMpIiAiMCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIodl9jaGFyc192KSIgIjAiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKHZfYml0cykiICIwIgorCisgICAgIyBzdHJpbmcgZXhwcmVzc2lvbnMKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIoXCJhYmNkXCIpIiAiMCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIoQicwMTAxMDEnKSIgIjAiCisKKyAgICAjIGFycmF5IG1vZGUgbmFtZQorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsb3dlcihtX2FycikiICIxIjsKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIobV9jaGFyX2FycikiIHsnXF5bKF0wWyldJ30KKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIobV9ib29sX2FycikiICJGQUxTRSIKKyAgICBpZiBbaXN0YXJnZXQgImFscGhhLSotKiJdIHRoZW4geworCXRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsb3dlcihtX2ludF9hcnIpIiAiLTIxNDc0ODM2NDgiCisgICAgfSBlbHNlIHsKKwl0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIobV9pbnRfYXJyKSIgIi0zMjc2OCIKKyAgICB9CisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKG1fc2V0X2FycikiICJlMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIobV9zZXRfcmFuZ2VfYXJyKSIgImUyIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsb3dlcihtX251bWJlcmVkX3NldF9hcnIpIiAibjIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKG1fY2hhcl9yYW5nZV9hcnIpIiAiJ0EnIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsb3dlcihtX2Jvb2xfcmFuZ2VfYXJyKSIgIkZBTFNFIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsb3dlcihtX2xvbmdfcmFuZ2VfYXJyKSIgIjI1NSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIobV9yYW5nZV9hcnIpIiAiMTIiCisKKyAgICAjIGFycmF5IGxvY2F0aW9ucworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsb3dlcih2X2FycikiICIxIjsKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIodl9jaGFyX2FycikiIHsnXF5bKF0wWyldJ30KKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIodl9ib29sX2FycikiICJGQUxTRSIKKyAgICBpZiBbaXN0YXJnZXQgImFscGhhLSotKiJdIHRoZW4geworCXRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsb3dlcih2X2ludF9hcnIpIiAiLTIxNDc0ODM2NDgiCisgICAgfSBlbHNlIHsKKwl0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIodl9pbnRfYXJyKSIgIi0zMjc2OCIKKyAgICB9CisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKHZfc2V0X2FycikiICJlMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIodl9zZXRfcmFuZ2VfYXJyKSIgImUyIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsb3dlcih2X251bWJlcmVkX3NldF9hcnIpIiAibjIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxvd2VyKHZfY2hhcl9yYW5nZV9hcnIpIiAiJ0EnIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsb3dlcih2X2Jvb2xfcmFuZ2VfYXJyKSIgIkZBTFNFIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsb3dlcih2X2xvbmdfcmFuZ2VfYXJyKSIgIjI1NSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbG93ZXIodl9yYW5nZV9hcnIpIiAiMTIiCit9CisKK3Byb2MgdGVzdF91cHBlciB7fSB7CisgICAgZ2xvYmFsIHBhc3Njb3VudAorCisgICAgdmVyYm9zZSAidGVzdGluZyBidWlsdGluIFVQUEVSIgorICAgIHNldCBwYXNzY291bnQgMAorCisgICAgIyBkaXNjcmV0ZSBtb2RlIG5hbWVzCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKGJvb2wpIiAiVFJVRSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdXBwZXIoY2hhcikiIHsnXF5bKF0yNTVbKV0nfQorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcihieXRlKSIgIjEyNyIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdXBwZXIodWJ5dGUpIiAiMjU1IgorICAgIGlmIFtpc3RhcmdldCAiYWxwaGEtKi0qIl0gdGhlbiB7CisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKGludCkiICIyMTQ3NDgzNjQ3IgorCXRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcih1aW50KSIgIjQyOTQ5NjcyOTUiCisJc2V0dXBfeGZhaWwgImFscGhhLSotKiIKKwl0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdXBwZXIobG9uZykiICI0Mjk0OTY3Mjk1IgorCXRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcih1bG9uZykiICIxODQ0Njc0NDA3MzcwOTU1MTYxNSIKKyAgICB9IGVsc2UgeworCXRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcihpbnQpIiAiMzI3NjciCisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHVpbnQpIiAiNjU1MzUiCisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKGxvbmcpIiAiMjE0NzQ4MzY0NyIKKwl0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdXBwZXIodWxvbmcpIiAiNDI5NDk2NzI5NSIKKyAgICB9CisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKG1fc2V0KSIgImU2IgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcihtX3NldF9yYW5nZSkiICJlNSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdXBwZXIobV9udW1iZXJlZF9zZXQpIiAibjUiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKG1fY2hhcl9yYW5nZSkiICInWiciCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKG1fYm9vbF9yYW5nZSkiICJGQUxTRSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdXBwZXIobV9sb25nX3JhbmdlKSIgIjMyMTEiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKG1fcmFuZ2UpIiAiMjgiCisKKyAgICAjIGRpc2NyZXRlIGxvY2F0aW9ucworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcih2X2Jvb2wpIiAiVFJVRSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdXBwZXIodl9jaGFyKSIgeydcXlsoXTI1NVspXSd9CisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHZfYnl0ZSkiICIxMjciCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHZfdWJ5dGUpIiAiMjU1IgorICAgIGlmIFtpc3RhcmdldCAiYWxwaGEtKi0qIl0gdGhlbiB7CisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHZfaW50KSIgIjIxNDc0ODM2NDciCisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHZfdWludCkiICI0Mjk0OTY3Mjk1IgorCXNldHVwX3hmYWlsICJhbHBoYS0qLSoiCisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHZfbG9uZykiICI0Mjk0OTY3Mjk1IgorCXRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcih2X3Vsb25nKSIgIjE4NDQ2NzQ0MDczNzA5NTUxNjE1IgorICAgIH0gZWxzZSB7CisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHZfaW50KSIgIjMyNzY3IgorCXRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcih2X3VpbnQpIiAiNjU1MzUiCisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHZfbG9uZykiICIyMTQ3NDgzNjQ3IgorCXRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcih2X3Vsb25nKSIgIjQyOTQ5NjcyOTUiCisgICAgfQorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcih2X3NldCkiICJlNiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdXBwZXIodl9zZXRfcmFuZ2UpIiAiZTUiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHZfbnVtYmVyZWRfc2V0KSIgIm41IgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcih2X2NoYXJfcmFuZ2UpIiAiJ1onIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcih2X2Jvb2xfcmFuZ2UpIiAiRkFMU0UiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHZfbG9uZ19yYW5nZSkiICIzMjExIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcih2X3JhbmdlKSIgIjI4IgorCisgICAgIyBzdHJpbmcgbW9kZSBuYW1lcworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcihtX2NoYXJzKSIgIjE5IgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcihtX2NoYXJzX3YpIiAiMTkiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKG1fYml0cykiICI5IgorCisgICAgIyBzdHJpbmcgbG9jYXRpb25zCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHZfY2hhcnMpIiAiMTkiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHZfY2hhcnNfdikiICIxOSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdXBwZXIodl9iaXRzKSIgIjkiCisKKyAgICAjIHN0cmluZyBleHByZXNzaW9ucworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcihcImFiY2RcIikiICIzIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcihCJzAxMDEwMScpIiAiNSIKKworICAgICMgYXJyYXkgbW9kZSBuYW1lCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKG1fYXJyKSIgIjEwIjsKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdXBwZXIobV9jaGFyX2FycikiIHsnXF5bKF0yNTVbKV0nfQorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcihtX2Jvb2xfYXJyKSIgIlRSVUUiCisgICAgaWYgW2lzdGFyZ2V0ICJhbHBoYS0qLSoiXSB0aGVuIHsKKwl0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdXBwZXIobV9pbnRfYXJyKSIgIjIxNDc0ODM2NDciCisgICAgfSBlbHNlIHsKKwl0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdXBwZXIobV9pbnRfYXJyKSIgIjMyNzY3IgorICAgIH0KKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdXBwZXIobV9zZXRfYXJyKSIgImU2IgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcihtX3NldF9yYW5nZV9hcnIpIiAiZTUiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKG1fbnVtYmVyZWRfc2V0X2FycikiICJuNSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdXBwZXIobV9jaGFyX3JhbmdlX2FycikiICInWiciCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKG1fYm9vbF9yYW5nZV9hcnIpIiAiRkFMU0UiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKG1fbG9uZ19yYW5nZV9hcnIpIiAiMzIxMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdXBwZXIobV9yYW5nZV9hcnIpIiAiMjgiCisKKyAgICAjIGFycmF5IGxvY2F0aW9ucworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcih2X2FycikiICIxMCI7CisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHZfY2hhcl9hcnIpIiB7J1xeWyhdMjU1WyldJ30KKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdXBwZXIodl9ib29sX2FycikiICJUUlVFIgorICAgIGlmIFtpc3RhcmdldCAiYWxwaGEtKi0qIl0gdGhlbiB7CisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHZfaW50X2FycikiICIyMTQ3NDgzNjQ3IgorICAgIH0gZWxzZSB7CisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHZfaW50X2FycikiICIzMjc2NyIKKyAgICB9CisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHZfc2V0X2FycikiICJlNiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdXBwZXIodl9zZXRfcmFuZ2VfYXJyKSIgImU1IgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcih2X251bWJlcmVkX3NldF9hcnIpIiAibjUiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHZfY2hhcl9yYW5nZV9hcnIpIiAiJ1onIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcih2X2Jvb2xfcmFuZ2VfYXJyKSIgIkZBTFNFIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB1cHBlcih2X2xvbmdfcmFuZ2VfYXJyKSIgIjMyMTEiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHVwcGVyKHZfcmFuZ2VfYXJyKSIgIjI4IgorfQorCitwcm9jIHRlc3RfbGVuZ3RoIHt9IHsKKyAgICBnbG9iYWwgcGFzc2NvdW50CisKKyAgICB2ZXJib3NlICJ0ZXN0aW5nIGJ1aWx0aW4gTEVOR1RIIgorICAgIHNldCBwYXNzY291bnQgMAorCisgICAgIyBzdHJpbmcgbG9jYXRpb25zCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxlbmd0aCh2X2NoYXJzKSIgIjIwIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsZW5ndGgodl9jaGFyc192KSIgIjciOworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBsZW5ndGgodl9iaXRzKSIgIjEwIjsKKworICAgICMgc3RyaW5nIGV4cHJlc3Npb25zCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxlbmd0aChcInRoZSBxdWljayBicm93biBmb3ggLi4uXCIpIiAiMjMiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxlbmd0aChCJzAxMDEwMTAxMDEwMScpIiAiMTIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxlbmd0aChcImZvbyBcIiAvLyBcImJhclwiKSIgIjciCisKKyAgICAjIGNoZWNrIHNvbWUgZmFpbHVyZXMKKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxlbmd0aChtX2NoYXJzKSIgInR5cGVuYW1lIGluIGludmFsaWQgY29udGV4dCIKKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGxlbmd0aCh2X2J5dGUpIiAiYmFkIGFyZ3VtZW50IHRvIExFTkdUSCBidWlsdGluIgorICAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbGVuZ3RoKGInMDAwMDAwJyAvLyBiJzExMTExMScpIiAiMTIiCit9CisKK3Byb2MgdGVzdF9zaXplIHt9IHsKKyAgICBnbG9iYWwgcGFzc2NvdW50CisKKyAgICB2ZXJib3NlICJ0ZXN0aW5nIGJ1aWx0aW4gU0laRSIKKyAgICBzZXQgcGFzc2NvdW50IDAKKworICAgICMgbW9kZXMKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgc2l6ZShib29sKSIgIjEiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHNpemUoY2hhcikiICIxIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzaXplKGJ5dGUpIiAiMSIKKyAgICBpZiBbaXN0YXJnZXQgImFscGhhLSotKiJdIHRoZW4geworCXRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzaXplKGludCkiICI0IgorCXRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzaXplKHVsb25nKSIgIjgiCisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHNpemUocHRyKSIgIjgiCisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHNpemUobV9jaGFyc192KSIgIjI0IgorCXRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzaXplKG1fc3RydWN0KSIgIjQwIgorICAgIH0gZWxzZSB7CisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHNpemUoaW50KSIgIjIiCisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHNpemUodWxvbmcpIiAiNCIKKwl0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgc2l6ZShwdHIpIiAiNCIKKwl0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgc2l6ZShtX2NoYXJzX3YpIiAiMjIiCisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHNpemUobV9zdHJ1Y3QpIiAiMzYiCisgICAgfQorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzaXplKG1fc2V0KSIgIjEiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHNpemUobV9udW1iZXJlZF9zZXQpIiAiMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgc2l6ZShtX2NoYXJfcmFuZ2UpIiAiMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgc2l6ZShtX3JhbmdlX2FycikiICIxNyIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgc2l6ZShtX2NoYXJzKSIgIjIwIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzaXplKG1fYml0cykiICIyIgorCisgICAgIyBsb2NhdGlvbnMKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgc2l6ZSh2X2Jvb2wpIiAiMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgc2l6ZSh2X2NoYXIpIiAiMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgc2l6ZSh2X2J5dGUpIiAiMSIKKyAgICBpZiBbaXN0YXJnZXQgImFscGhhLSotKiJdIHRoZW4geworCXRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzaXplKHZfaW50KSIgIjQiCisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHNpemUodl91bG9uZykiICI4IgorCXRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzaXplKHZfcHRyKSIgIjgiCisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHNpemUodl9jaGFyc192KSIgIjI0IgorCXRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzaXplKHZfc3RydWN0KSIgIjQwIgorICAgIH0gZWxzZSB7CisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHNpemUodl9pbnQpIiAiMiIKKwl0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgc2l6ZSh2X3Vsb25nKSIgIjQiCisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHNpemUodl9wdHIpIiAiNCIKKwl0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgc2l6ZSh2X2NoYXJzX3YpIiAiMjIiCisJdGVzdF9wcmludF9hY2NlcHQgInByaW50IHNpemUodl9zdHJ1Y3QpIiAiMzYiCisgICAgfQorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzaXplKHZfc2V0KSIgIjEiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHNpemUodl9udW1iZXJlZF9zZXQpIiAiMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgc2l6ZSh2X2NoYXJfcmFuZ2UpIiAiMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgc2l6ZSh2X3JhbmdlX2FycikiICIxNyIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgc2l6ZSh2X2NoYXJzKSIgIjIwIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzaXplKHZfYml0cykiICIyIgorfQorCitwcm9jIHRlc3RfbnVtIHt9IHsKKyAgICBnbG9iYWwgcGFzc2NvdW50CisKKyAgICB2ZXJib3NlICJ0ZXN0aW5nIGJ1aWx0aW4gTlVNIgorICAgIHNldCBwYXNzY291bnQgMAorCisgICAgIyBjb25zdGFudHMKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbnVtKGZhbHNlKSIgIjAiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IG51bSh0cnVlKSIgIjEiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IG51bSgxMCkiICIxMCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbnVtKDMzLTM0KSIgIi0xIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBudW0oJ1gnKSIgIjg4IgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBudW0oZTUpIiAiNCIKKworICAgICMgbG9jYXRpb25zCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IG51bSh2X2Jvb2wpIiAiMCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbnVtKHZfY2hhcikiICI4OCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbnVtKHZfYnl0ZSkiICItMzAiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IG51bSh2X3VieXRlKSIgIjMwIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBudW0odl9pbnQpIiAiLTMzMyIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbnVtKHZfdWludCkiICIzMzMiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IG51bSh2X2xvbmcpIiAiLTQ0NDQiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IG51bSh2X3Vsb25nKSIgIjQ0NDQiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IG51bSh2X3NldCkiICIyIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBudW0odl9zZXRfcmFuZ2UpIiAiMiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbnVtKHZfbnVtYmVyZWRfc2V0KSIgIjM1IgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBudW0odl9jaGFyX3JhbmdlKSIgIjcxIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBudW0odl9sb25nX3JhbmdlKSIgIjEwMDAiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IG51bSh2X3JhbmdlKSIgIjIzIgorfQorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCitnZGJfdGVzdCAic2V0IHByaW50IHNldmVuYml0LXN0cmluZ3MiICIuKiIKKworaWYgW3NldF9sYW5nX2NoaWxsXSB0aGVuIHsKKyAgICAjIHRlc3QgYnVpbHRpbnMgYXMgZGVzY3JpYmVkIGluIGNoYXB0ZXIgNi4yMC4zIFouMjAwCisgICAgdGVzdF9udW0KKyAgICB0ZXN0X3NpemUKKyAgICB0ZXN0X2xvd2VyCisgICAgdGVzdF91cHBlcgorICAgIHRlc3RfbGVuZ3RoCit9IGVsc2UgeworICAgIHdhcm5pbmcgIiR0ZXN0X25hbWUgdGVzdHMgc3VwcHJlc3NlZC4iCit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9jYWxsY2guY2ggYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9jYWxsY2guY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwMWQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2NhbGxjaC5jaApAQCAtMCwwICsxLDUwIEBACitoYWNrIDogbW9kdWxlCisKK2RjbCBpIGludDsKK25ld21vZGUgb3R0byA9IGFycmF5IChib29sLCBib29sKSBieXRlOworbmV3bW9kZSBzdHIxID0gc3RydWN0IChmMSBpbnQsIGYyIGJvb2wpOworbmV3bW9kZSBzdHIyID0gc3RydWN0IChmMSBvdHRvKTsKKworZGNsIGEgb3R0byA6PSBbWzEsMV0sWzEsMV1dOworZGNsIGIgc3RyMSA6PSBbMTAsIGZhbHNlXTsKK2RjbCBjIHN0cjI7CisKK2ZyZWQgOiBwcm9jIChhIGludCBpbiwgYiBpbnQgbG9jKTsKKyAgd3JpdGV0ZXh0KHN0ZG91dCwgImEgaXMgJyVDJzsgYiBpcyAnJUMnLiUvIiwgYSwgYik7CitlbmQgZnJlZDsKKwora2xhdXMgOiBwcm9jICgpOworICB3cml0ZXRleHQoc3Rkb3V0LCAiaGVyZSdzIGtsYXVzIGNhbGxpbmcuJS8iKTsKK2VuZCBrbGF1czsKKwora2luZyA6IHByb2MgKHAgb3R0byBsb2MsIHggb3R0byBpbik7CisgIGRjbCBpLCBqIGJvb2w7CisgIHAgOj0gW1toJ2ZmLGgnZmZdLFtoJ2ZmLGgnZmZdXTsKKyAgZG8gZm9yIGk6PSBsb3dlcihib29sKSB0byB1cHBlcihib29sKTsKKyAgICBkbyBmb3Igajo9IGxvd2VyKGJvb2wpIHRvIHVwcGVyKGJvb2wpOworICAgICAgd3JpdGV0ZXh0KHN0ZG91dCwgIngoJUMsICVDKSA9ICVDJS4uJS8iLCBpLCBqLCB4KGksIGopKTsKKyAgICAgIHdyaXRldGV4dChzdGRvdXQsICJwKCVDLCAlQykgPSAlQyUuLiUvIiwgaSwgaiwgcChpLCBqKSk7CisgICAgb2Q7CisgIG9kOworZW5kIGtpbmc7CisKK3JhbHBoIDogcHJvYyAoeCBzdHIxIGluKTsKKyAgd3JpdGV0ZXh0KHN0ZG91dCwgInguZjEgPSAlQywgeC5mMiA9ICVDJS4uJS8iLCB4LmYxLCB4LmYyKTsKK2VuZCByYWxwaDsKKword2hpdG5leSA6IHByb2MgKHggc3RyMiBpbik7CisgIGRjbCBpLCBqIGJvb2w7CisKKyAgZG8gZm9yIGk6PSBsb3dlcihib29sKSB0byB1cHBlcihib29sKTsKKyAgICBkbyBmb3Igajo9IGxvd2VyKGJvb2wpIHRvIHVwcGVyKGJvb2wpOworICAgICAgd3JpdGV0ZXh0KHN0ZG91dCwgInguZjEoJUMsICVDKSA9ICVDJS4uJS8iLCBpLCBqLCB4LmYxKGksIGopKTsKKyAgICAgb2Q7CisgIG9kOworCitlbmQgd2hpdG5leTsKKworYyA6PSBbYV07CitpOj0xMjsKK3dyaXRldGV4dChzdGRvdXQsICJkb25lLiUvIik7CisKK2VuZCBoYWNrOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvY2FsbGNoLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2NhbGxjaC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3OWEwNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2NhbGxjaC5leHAKQEAgLTAsMCArMSw2OSBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHRlc3RzIHRoYXQgZ2RiIGNhbiBjYWxsIGZ1bmN0aW9ucyBpbiBhIENoaWxsIGluZmVyaW9yLgorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworaWYgW3NraXBfY2hpbGxfdGVzdHNdIHRoZW4geyBjb250aW51ZSB9CisKK3NldCB0ZXN0ZmlsZSAiY2FsbGNoIgorc2V0IHNyY2ZpbGUgJHtzcmNkaXJ9LyRzdWJkaXIvJHt0ZXN0ZmlsZX0uY2gKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0uZXhlCitpZiAgeyBbY29tcGlsZSAiJHtzcmNmaWxlfSAtZyAtbyAke2JpbmZpbGV9ICR7Q0hJTExfUlQwfSAke0NISUxMX0xJQn0iXSAhPSAiIiB9IHsKKyAgICBwZXJyb3IgIkNvdWxkbid0IGNvbXBpbGUgJHtzcmNmaWxlfSIKKyAgICByZXR1cm4gLTEKK30KKworcHJvYyBkb190ZXN0cyB7fSB7CisgICAgZ2xvYmFsIHBybXNfaWQgYnVnX2lkIHN1YmRpciBvYmpkaXIgc3JjZGlyIGJpbmZpbGUgZ2RiX3Byb21wdAorCisgICAgc2V0IHBybXNfaWQgMAorICAgIHNldCBidWdfaWQgMAorCisgICAgIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKyAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKyAgICBnZGJfbG9hZCAkYmluZmlsZQorCisgICAgc2VuZF9nZGIgInNldCBsYW5ndWFnZSBjaGlsbFxuIiA7IAorCisgICAgZ2RiX3Rlc3QgImJyZWFrIGNhbGxjaC5jaDo0OCIgIiIKKyAgICBzZW5kX2dkYiAicnVuXG4iOyBnZGJfZXhwZWN0IC1yZSAiQnJlYWtwb2ludCAuKmNhbGxjaC5jaDo0OC4qJGdkYl9wcm9tcHQgJCIKKyAgICBnZGJfdGVzdCB7c2V0IGZyZWQoMTAsIGkpfSB7YSBpcyAnMTAnOyBiIGlzICcxMicufQorICAgIGdkYl90ZXN0X2V4YWN0ICJjYWxsIGtsYXVzKCkiIHtoZXJlJ3Mga2xhdXMgY2FsbGluZy59CisgICAgZ2RiX3Rlc3RfZXhhY3QgImNhbGwgZnJlZCgpIiB7dG9vIGZldyBhcmd1bWVudHMgaW4gZnVuY3Rpb24gY2FsbH0KKyAgICAjIFRvbyBtYW55IGFyZ3VtZW50cyBhcmUgYWxsb3dlZAorICAgIGdkYl90ZXN0X2V4YWN0ICJjYWxsIGtsYXVzKDEwLCAyMCwgMzApIiB7aGVyZSdzIGtsYXVzIGNhbGxpbmcufQorICAgIGdkYl90ZXN0ICJwcmludCBhIiB7ID0gXFtcKEZBTFNFOlRSVUVcKTogXFtcKEZBTFNFOlRSVUVcKTogMVxdXF19XAorCSJwcmludCBhIGJlZm9yZSBraW5nIgorICAgICMgQ3VycmVudCBnZGIgcHJpbnRzIDI1NSBmb3IgdGhlIHJlc3VsdHMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gYmUgLTEuCisgICAgc2V0dXBfeGZhaWwgIm1pcHMqLXNnaS1pcml4KiIKKyAgICBnZGJfdGVzdCB7Y2FsbCBraW5nKGEsIG90dG9bWzEwLCAxNV0sIFsyMCwgMjVdXSl9ICJ4XFwoRkFMU0UsIEZBTFNFXFwpID0gMTAuKnBcXChGQUxTRSwgRkFMU0VcXCkgPSAtMS4qeFxcKEZBTFNFLCBUUlVFXFwpID0gMTUuKnBcXChGQUxTRSwgVFJVRVxcKSA9IC0xLip4XFwoVFJVRSwgRkFMU0VcXCkgPSAyMC4qcFxcKFRSVUUsIEZBTFNFXFwpID0gLTEuKnhcXChUUlVFLCBUUlVFXFwpID0gMjUuKnBcXChUUlVFLCBUUlVFXFwpID0gLTEuKiIKKyAgICBnZGJfdGVzdCAicHJpbnQgYSIgeyA9IFxbXChGQUxTRTpUUlVFXCk6IFxbXChGQUxTRTpUUlVFXCk6IC0xXF1cXX1cCisJInByaW50IGEgYWZ0ZXIga2luZyIKKyAgICBnZGJfdGVzdF9leGFjdCAiY2FsbCByYWxwaChiKSIge3guZjEgPSAxMCwgeC5mMiA9IEZBTFNFLn0KKyAgICBnZGJfdGVzdCAiY2FsbCB3aGl0bmV5KGMpIiAieC5mMVxcKEZBTFNFLCBGQUxTRVxcKSA9IDEuKnguZjFcXChGQUxTRSwgVFJVRVxcKSA9IDEuKnguZjFcXChUUlVFLCBGQUxTRVxcKSA9IDEuKnguZjFcXChUUlVFLCBUUlVFXFwpID0gMS4qIgorfQorCitkb190ZXN0cwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvY2hleHAuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvY2hleHAuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDRhYmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9jaGV4cC5leHAKQEAgLTAsMCArMSw0NTAgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBGcmVkIEZpc2guIChmbmZAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCisjIFNldCB0aGUgY3VycmVudCBsYW5ndWFnZSB0byBjaGlsbC4gIFRoaXMgY291bnRzIGFzIGEgdGVzdC4gIElmIGl0CisjIGZhaWxzLCB0aGVuIHdlIHNraXAgdGhlIG90aGVyIHRlc3RzLgorCitwcm9jIHNldF9sYW5nX2NoaWxsIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgc2VuZF9nZGIgInNldCBsYW5ndWFnZSBjaGlsbFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorCXRpbWVvdXQgeyBmYWlsICJzZXQgbGFuZ3VhZ2UgY2hpbGwgKHRpbWVvdXQpIiA7IHJldHVybiAwIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAic2hvdyBsYW5ndWFnZVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogc291cmNlIGxhbmd1YWdlIGlzIFwiY2hpbGxcIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJzZXQgbGFuZ3VhZ2UgdG8gXCJjaGlsbFwiIgorCSAgICByZXR1cm4gMQorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJzZXR0aW5nIGxhbmd1YWdlIHRvIFwiY2hpbGxcIiIKKwkgICAgcmV0dXJuIDAKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgImNhbid0IHNob3cgbGFuZ3VhZ2UgKHRpbWVvdXQpIgorCSAgICByZXR1cm4gMAorCX0KKyAgICB9Cit9CisKK3Byb2MgdGVzdF9pbnRlZ2VyX2xpdGVyYWxzX2FjY2VwdGVkIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgIyBUZXN0IHZhcmlvdXMgZGVjaW1hbCB2YWx1ZXMuCisKKyAgICBnZGJfdGVzdCAicCAxMjMiICIgPSAxMjMiCisgICAgZ2RiX3Rlc3QgInAgLTEyMyIgIiA9IC0xMjMiCisgICAgZ2RiX3Rlc3QgInAgRCcxMjMiICIgPSAxMjMiCisgICAgZ2RiX3Rlc3QgInAgZCcxMjMiICIgPSAxMjMiCisgICAgZ2RiX3Rlc3QgInAgLUQnMTIzIiAiID0gLTEyMyIKKyAgICBnZGJfdGVzdCAicCAtZCcxMjMiICIgPSAtMTIzIgorICAgIGdkYl90ZXN0ICJwIDEyXzM0NSIgIiA9IDEyMzQ1IgorICAgIGdkYl90ZXN0ICJwIF9fMV8yXzNfXyIgIiA9IDEyMyIKKyAgICBnZGJfdGVzdCAicC9kIDEyMyIgIiA9IEQnMTIzIgorCisgICAgIyBUZXN0IHZhcmlvdXMgYmluYXJ5IHZhbHVlcy4KKworICAgIGdkYl90ZXN0ICJwIEInMTExIiAiID0gNyIKKyAgICBnZGJfdGVzdCAicCBiJzExMSIgIiA9IDciCisgICAgZ2RiX3Rlc3QgInAgLUInMTExIiAiID0gLTciCisgICAgZ2RiX3Rlc3QgInAgQicwMTExIiAiID0gNyIKKyAgICBnZGJfdGVzdCAicCBiJzAxMTEiICIgPSA3IgorICAgIGdkYl90ZXN0ICJwIC1iJzAxMTEiICIgPSAtNyIKKyAgICBnZGJfdGVzdCAicCBCJ18wXzFfMV8xXyIgIiA9IDciCisgICAgZ2RiX3Rlc3QgInAgYidfMF8xXzFfMV8iICIgPSA3IgorICAgIGdkYl90ZXN0ICJwIC1iJ18wXzFfMV8xXyIgIiA9IC03IgorICAgIGdkYl90ZXN0ICJwL3QgQicxMTEiICIgPSBCJzExMSIKKworICAgICMgVGVzdCB2YXJpb3VzIG9jdGFsIHZhbHVlcy4KKworICAgIGdkYl90ZXN0ICJwIE8nMTIzIiAiID0gODMiCisgICAgZ2RiX3Rlc3QgInAgbycxMjMiICIgPSA4MyIKKyAgICBnZGJfdGVzdCAicCAtbycwMTIzIiAiID0gLTgzIgorICAgIGdkYl90ZXN0ICJwIE8nMDEyMyIgIiA9IDgzIgorICAgIGdkYl90ZXN0ICJwIG8nMDEyMyIgIiA9IDgzIgorICAgIGdkYl90ZXN0ICJwIC1vJzEyMyIgIiA9IC04MyIKKyAgICBnZGJfdGVzdCAicCBPJ18xXzJfM18iICIgPSA4MyIKKyAgICBnZGJfdGVzdCAicCBvJ18xXzJfM18iICIgPSA4MyIKKyAgICBnZGJfdGVzdCAicCAtbydfMV8yXzNfIiAiID0gLTgzIgorICAgIGdkYl90ZXN0ICJwL28gTycxMjMiICIgPSBPJzEyMyIKKworICAgICMgVGVzdCB2YXJpb3VzIGhleGFkZWNpbWFsIHZhbHVlcy4KKworICAgIGdkYl90ZXN0ICJwIEgnMTIzIiAiID0gMjkxIgorICAgIGdkYl90ZXN0ICJwIGgnMTIzIiAiID0gMjkxIgorICAgIGdkYl90ZXN0ICJwIC1oJzEyMyIgIiA9IC0yOTEiCisgICAgZ2RiX3Rlc3QgInAgSCcwMTIzIiAiID0gMjkxIgorICAgIGdkYl90ZXN0ICJwIGgnMDEyMyIgIiA9IDI5MSIKKyAgICBnZGJfdGVzdCAicCAtaCcwMTIzIiAiID0gLTI5MSIKKyAgICBnZGJfdGVzdCAicCBIJ18xXzJfM18iICIgPSAyOTEiCisgICAgZ2RiX3Rlc3QgInAgaCdfMV8yXzNfIiAiID0gMjkxIgorICAgIGdkYl90ZXN0ICJwIC1oJ18xXzJfM18iICIgPSAtMjkxIgorICAgIGdkYl90ZXN0ICJwIEgnQUJDIiAiID0gMjc0OCIKKyAgICBnZGJfdGVzdCAicCBIJ2FiYyIgIiA9IDI3NDgiCisgICAgZ2RiX3Rlc3QgInAgSCdBYkMiICIgPSAyNzQ4IgorICAgIGdkYl90ZXN0ICJwIEgnX0FfYl9DXyIgIiA9IDI3NDgiCisgICAgZ2RiX3Rlc3QgInAgSCdfRF9lX0ZfIiAiID0gMzU2NyIKKyAgICBnZGJfdGVzdCAicCBIJ19kX0VfZl8iICIgPSAzNTY3IgorICAgIGdkYl90ZXN0ICJwL3ggSCcxMjMiICIgPSBIJzEyMyIKK30KKworcHJvYyB0ZXN0X2NoYXJhY3Rlcl9saXRlcmFsc19hY2NlcHRlZCB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgICMgVGVzdCB2YXJpb3VzIGRlY2ltYWwgdmFsdWVzLgorCisgICAgZ2RiX3Rlc3QgInAgJ2EnIiAiID0gJ2EnIgorICAgIGdkYl90ZXN0ICJwL3ggJ2EnIiAiID0gSCc2MSIKKyAgICBnZGJfdGVzdCAicC9kICdhJyIgIiA9IEQnOTciCisgICAgZ2RiX3Rlc3QgInAvdCAnYSciICIgPSBCJzExMDAwMDEiCisgICAgIyBnZGJfdGVzdCAicCAnXig5NyknIiAiID0gJ2EnIgkobm90IGluIEdOVSBDaGlsbCkKKyAgICBnZGJfdGVzdCAicCBDJzYxJyIgIiA9ICdhJyIKKyAgICBnZGJfdGVzdCAicCBjJzYxJyIgIiA9ICdhJyIKKyAgICBnZGJfdGVzdCAicC94IEMnRkYnIiAiID0gSCdmZiIKKyAgICAjIGdkYl90ZXN0ICJwL3ggJ14oSCdGRiknIiAiID0gSCdmZiIJKG5vdCBpbiBHTlUgQ2hpbGwpCisgICAgIyBnZGJfdGVzdCAicC94ICdeKEQnMjU1KSciICIgPSBIJ2ZmIgkobm90IGluIEdOVSBDaGlsbCkKK30KKworcHJvYyB0ZXN0X2ludGVnZXJfbGl0ZXJhbHNfcmVqZWN0ZWQge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICAjIFRoZXNlIGFyZSB2YWxpZCBpbnRlZ2VyIGxpdGVyYWxzIGluIFouMjAwLCBidXQgbm90IEdOVS1DaGlsbC4KKworICAgIHRlc3RfcHJpbnRfcmVqZWN0ICJwIF8iCisgICAgdGVzdF9wcmludF9yZWplY3QgInAgX18iCisKKyAgICB0ZXN0X3ByaW50X3JlamVjdCAicCBEJyIgCisgICAgdGVzdF9wcmludF9yZWplY3QgInAgRCdfIiAKKyAgICB0ZXN0X3ByaW50X3JlamVjdCAicCBEJ19fIiAKKworICAgIHRlc3RfcHJpbnRfcmVqZWN0ICJwIEInIiAKKyAgICB0ZXN0X3ByaW50X3JlamVjdCAicCBCJ18iIAorICAgIHRlc3RfcHJpbnRfcmVqZWN0ICJwIEInX18iIAorCisgICAgdGVzdF9wcmludF9yZWplY3QgInAgTyciIAorICAgIHRlc3RfcHJpbnRfcmVqZWN0ICJwIE8nXyIgCisgICAgdGVzdF9wcmludF9yZWplY3QgInAgTydfXyIgCisKKyAgICB0ZXN0X3ByaW50X3JlamVjdCAicCBIJyIgCisgICAgdGVzdF9wcmludF9yZWplY3QgInAgSCdfIiAKKyAgICB0ZXN0X3ByaW50X3JlamVjdCAicCBIJ19fIiAKKworICAgICMgVGVzdCB2YXJpb3VzIGRlY2ltYWwgdmFsdWVzLgorCisgICAgdGVzdF9wcmludF9yZWplY3QgInAgRCdERUFEQkVFRiIKKyAgICB0ZXN0X3ByaW50X3JlamVjdCAicCBEJzEyM0RFQURCRUVGIgorCisgICAgIyBUZXN0IHZhcmlvdXMgYmluYXJ5IHZhbHVlcy4KKworICAgIHRlc3RfcHJpbnRfcmVqZWN0ICJwIEInMiIgIlRvby1sYXJnZSBkaWdpdCBpbiBiaXRzdHJpbmcgb3IgaW50ZWdlci4iCisgICAgdGVzdF9wcmludF9yZWplY3QgInAgQicxMiIgICJUb28tbGFyZ2UgZGlnaXQgaW4gYml0c3RyaW5nIG9yIGludGVnZXIuIgorCisgICAgIyBUZXN0IHZhcmlvdXMgb2N0YWwgdmFsdWVzLgorCisgICAgdGVzdF9wcmludF9yZWplY3QgInAgTyc5IiAgIlRvby1sYXJnZSBkaWdpdCBpbiBiaXRzdHJpbmcgb3IgaW50ZWdlci4iCisgICAgdGVzdF9wcmludF9yZWplY3QgInAgTyc3OSIgICJUb28tbGFyZ2UgZGlnaXQgaW4gYml0c3RyaW5nIG9yIGludGVnZXIuIgorCisgICAgIyBUZXN0IHZhcmlvdXMgaGV4YWRlY2ltYWwgdmFsdWVzLgorCisgICAgdGVzdF9wcmludF9yZWplY3QgInAgSCdHIiAiSW52YWxpZCBjaGFyYWN0ZXIgaW4gYml0c3RyaW5nIG9yIGludGVnZXIuIgorICAgIHRlc3RfcHJpbnRfcmVqZWN0ICJwIEgnQUciICJJbnZhbGlkIGNoYXJhY3RlciBpbiBiaXRzdHJpbmcgb3IgaW50ZWdlci4iCit9CisKK3Byb2MgdGVzdF9ib29sZWFuX2xpdGVyYWxzX2FjY2VwdGVkIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgIyBUZXN0IHRoZSBvbmx5IHBvc3NpYmxlIHZhbHVlcyBmb3IgYSBib29sZWFuLCBUUlVFIGFuZCBGQUxTRS4KKworICAgIGdkYl90ZXN0ICJwIFRSVUUiICIgPSBUUlVFIgorICAgIGdkYl90ZXN0ICJwIEZBTFNFIiAiID0gRkFMU0UiCit9CisKK3Byb2MgdGVzdF9mbG9hdF9saXRlcmFsc19hY2NlcHRlZCB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgICMgVGVzdCB2YXJpb3VzIGZsb2F0aW5nIHBvaW50IGZvcm1hdHMKKworICAgIGdkYl90ZXN0ICJwIC40NCA8IC40NSIgIiA9IFRSVUUiCisgICAgZ2RiX3Rlc3QgInAgLjQ0ID4gLjQ1IiAiID0gRkFMU0UiCisgICAgZ2RiX3Rlc3QgInAgMC40NCA8IDAuNDUiICIgPSBUUlVFIgorICAgIGdkYl90ZXN0ICJwIDAuNDQgPiAwLjQ1IiAiID0gRkFMU0UiCisgICAgZ2RiX3Rlc3QgInAgNDQuIDwgNDUuIiAiID0gVFJVRSIKKyAgICBnZGJfdGVzdCAicCA0NC4gPiA0NS4iICIgPSBGQUxTRSIKKyAgICBnZGJfdGVzdCAicCA0NC4wIDwgNDUuMCIgIiA9IFRSVUUiCisgICAgZ2RiX3Rlc3QgInAgNDQuMCA+IDQ1LjAiICIgPSBGQUxTRSIKKyAgICBnZGJfdGVzdCAicCAxMEQyMCA8IDEwRDIxIiAiID0gVFJVRSIKKyAgICBnZGJfdGVzdCAicCAxMEQyMCA+IDEwRDIxIiAiID0gRkFMU0UiCisgICAgZ2RiX3Rlc3QgInAgMTBkMjAgPCAxMGQyMSIgIiA9IFRSVUUiCisgICAgZ2RiX3Rlc3QgInAgMTBkMjAgPiAxMGQyMSIgIiA9IEZBTFNFIgorICAgIGdkYl90ZXN0ICJwIDEwRTIwIDwgMTBFMjEiICIgPSBUUlVFIgorICAgIGdkYl90ZXN0ICJwIDEwRTIwID4gMTBFMjEiICIgPSBGQUxTRSIKKyAgICBnZGJfdGVzdCAicCAxMGUyMCA8IDEwZTIxIiAiID0gVFJVRSIKKyAgICBnZGJfdGVzdCAicCAxMGUyMCA+IDEwZTIxIiAiID0gRkFMU0UiCisgICAgZ2RiX3Rlc3QgInAgMTAuRDIwIDwgMTAuRDIxIiAiID0gVFJVRSIKKyAgICBnZGJfdGVzdCAicCAxMC5EMjAgPiAxMC5EMjEiICIgPSBGQUxTRSIKKyAgICBnZGJfdGVzdCAicCAxMC5kMjAgPCAxMC5kMjEiICIgPSBUUlVFIgorICAgIGdkYl90ZXN0ICJwIDEwLmQyMCA+IDEwLmQyMSIgIiA9IEZBTFNFIgorICAgIGdkYl90ZXN0ICJwIDEwLkUyMCA8IDEwLkUyMSIgIiA9IFRSVUUiCisgICAgZ2RiX3Rlc3QgInAgMTAuRTIwID4gMTAuRTIxIiAiID0gRkFMU0UiCisgICAgZ2RiX3Rlc3QgInAgMTAuZTIwIDwgMTAuZTIxIiAiID0gVFJVRSIKKyAgICBnZGJfdGVzdCAicCAxMC5lMjAgPiAxMC5lMjEiICIgPSBGQUxTRSIKKyAgICBnZGJfdGVzdCAicCAxMC4wRDIwIDwgMTAuMEQyMSIgIiA9IFRSVUUiCisgICAgZ2RiX3Rlc3QgInAgMTAuMEQyMCA+IDEwLjBEMjEiICIgPSBGQUxTRSIKKyAgICBnZGJfdGVzdCAicCAxMC4wZDIwIDwgMTAuMGQyMSIgIiA9IFRSVUUiCisgICAgZ2RiX3Rlc3QgInAgMTAuMGQyMCA+IDEwLjBkMjEiICIgPSBGQUxTRSIKKyAgICBnZGJfdGVzdCAicCAxMC4wRTIwIDwgMTAuMEUyMSIgIiA9IFRSVUUiCisgICAgZ2RiX3Rlc3QgInAgMTAuMEUyMCA+IDEwLjBFMjEiICIgPSBGQUxTRSIKKyAgICBnZGJfdGVzdCAicCAxMC4wZTIwIDwgMTAuMGUyMSIgIiA9IFRSVUUiCisgICAgZ2RiX3Rlc3QgInAgMTAuMGUyMCA+IDEwLjBlMjEiICIgPSBGQUxTRSIKKyAgICBnZGJfdGVzdCAicCAxMC4wRCsyMCA8IDEwLjBEKzIxIiAiID0gVFJVRSIKKyAgICBnZGJfdGVzdCAicCAxMC4wRCsyMCA+IDEwLjBEKzIxIiAiID0gRkFMU0UiCisgICAgZ2RiX3Rlc3QgInAgMTAuMGQrMjAgPCAxMC4wZCsyMSIgIiA9IFRSVUUiCisgICAgZ2RiX3Rlc3QgInAgMTAuMGQrMjAgPiAxMC4wZCsyMSIgIiA9IEZBTFNFIgorICAgIGdkYl90ZXN0ICJwIDEwLjBFKzIwIDwgMTAuMEUrMjEiICIgPSBUUlVFIgorICAgIGdkYl90ZXN0ICJwIDEwLjBFKzIwID4gMTAuMEUrMjEiICIgPSBGQUxTRSIKKyAgICBnZGJfdGVzdCAicCAxMC4wZSsyMCA8IDEwLjBlKzIxIiAiID0gVFJVRSIKKyAgICBnZGJfdGVzdCAicCAxMC4wZSsyMCA+IDEwLjBlKzIxIiAiID0gRkFMU0UiCisgICAgZ2RiX3Rlc3QgInAgMTAuMEQtMTEgPCAxMC4wRC0xMCIgIiA9IFRSVUUiCisgICAgZ2RiX3Rlc3QgInAgMTAuMEQtMTEgPiAxMC4wRC0xMCIgIiA9IEZBTFNFIgorICAgIGdkYl90ZXN0ICJwIDEwLjBkLTExIDwgMTAuMGQtMTAiICIgPSBUUlVFIgorICAgIGdkYl90ZXN0ICJwIDEwLjBkLTExID4gMTAuMGQtMTAiICIgPSBGQUxTRSIKKyAgICBnZGJfdGVzdCAicCAxMC4wRS0xMSA8IDEwLjBFLTEwIiAiID0gVFJVRSIKKyAgICBnZGJfdGVzdCAicCAxMC4wRS0xMSA+IDEwLjBFLTEwIiAiID0gRkFMU0UiCisgICAgZ2RiX3Rlc3QgInAgMTAuMGUtMTEgPCAxMC4wZS0xMCIgIiA9IFRSVUUiCisgICAgZ2RiX3Rlc3QgInAgMTAuMGUtMTEgPiAxMC4wZS0xMCIgIiA9IEZBTFNFIgorICAgICMgbG9va3MgZnVubnksIGJ1dCBhcHBhcmVudGx5IGxlZ2FsCisgICAgZ2RiX3Rlc3QgInAgXy4xZSsxMCA8IF8uMWUrMTEiICIgPSBUUlVFIgorICAgIGdkYl90ZXN0ICJwIF8uMWUrMTAgPiBfLjFlKzExIiAiID0gRkFMU0UiCisgICAgZ2RiX3Rlc3QgInAgX18uMWUtMTIgPCBfXy4xZS0xMSIgIiA9IFRSVUUiCisgICAgZ2RiX3Rlc3QgInAgX18uMWUtMTIgPiBfXy4xZS0xMSIgIiA9IEZBTFNFIgorfQorCitwcm9jIHRlc3RfY29udmVuaWVuY2VfdmFyaWFibGVzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgZ2RiX3Rlc3QgInNldCBcJGZvbyA6PSAxMDEiCSIgOj0gMTAxXFtcclxdKiIgXAorCSJTZXQgYSBuZXcgY29udmVuaWVuY2UgdmFyaWFibGUiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgXCRmb28iCQkiID0gMTAxIiBcCisJIlByaW50IGNvbnRlbnRzIG9mIG5ldyBjb252ZW5pZW5jZSB2YXJpYWJsZSIKKworICAgIGdkYl90ZXN0ICJzZXQgXCRmb28gOj0gMzAxIgkiIDo9IDMwMVxbXHJcXSoiIFwKKwkiU2V0IGNvbnZlbmllbmNlIHZhcmlhYmxlIHRvIGEgbmV3IHZhbHVlIgorCisgICAgZ2RiX3Rlc3QgInByaW50IFwkZm9vIgkJIiA9IDMwMSIgXAorCSJQcmludCBuZXcgY29udGVudHMgb2YgY29udmVuaWVuY2UgdmFyaWFibGUiCisKKyAgICBnZGJfdGVzdCAic2V0IFwkXyA6PSAxMSIJCSIgOj0gMTFcW1xyXF0qIiBcCisJIlNldCBjb252ZW5pZW5jZSB2YXJpYWJsZSBcJF8iCisKKyAgICBnZGJfdGVzdCAicHJpbnQgXCRfIgkJIiA9IDExIiBcCisJIlByaW50IGNvbnRlbnRzIG9mIGNvbnZlbmllbmNlIHZhcmlhYmxlIFwkXyIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJGZvbyArIDEwIgkiID0gMzExIiBcCisJIlVzZSBjb252ZW5pZW5jZSB2YXJpYWJsZSBpbiBhcml0aG1ldGljIGV4cHJlc3Npb24iCisKKyAgICBnZGJfdGVzdCAicHJpbnQgKFwkZm9vIDo9IDMyKSArIDQiCSIgPSAzNiIgXAorCSJVc2UgY29udmVuaWVuY2UgdmFyaWFibGUgYXNzaWdubWVudCBpbiBhcml0aG1ldGljIGV4cHJlc3Npb24iCisKKyAgICBnZGJfdGVzdCAicHJpbnQgXCRiYXIiCQkiID0gdm9pZCIgXAorCSJQcmludCBjb250ZW50cyBvZiB1bmluaXRpYWxpemVkIGNvbnZlbmllbmNlIHZhcmlhYmxlIgorfQorCitwcm9jIHRlc3RfdmFsdWVfaGlzdG9yeSB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIGdkYl90ZXN0ICJwcmludCAxMDEiCSJcXFwkMSA9IDEwMSIgXAorCSJTZXQgdmFsdWUtaGlzdG9yeVxbMVxdIHVzaW5nIFwkMSIKKworICAgIGdkYl90ZXN0ICJwcmludCAxMDIiIAkiXFxcJDIgPSAxMDIiIFwKKwkiU2V0IHZhbHVlLWhpc3RvcnlcWzJcXSB1c2luZyBcJDIiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgMTAzIgkiXFxcJDMgPSAxMDMiIFwKKwkiU2V0IHZhbHVlLWhpc3RvcnlcWzNcXSB1c2luZyBcJDMiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgXCRcJCIJIlxcXCQ0ID0gMTAyIiBcCisJIlByaW50IHZhbHVlLWhpc3RvcnlcW01BWC0xXF0gdXNpbmcgaW5wbGljaXQgaW5kZXggXCRcJCIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJFwkIgkiXFxcJDUgPSAxMDMiIFwKKwkiUHJpbnQgdmFsdWUtaGlzdG9yeVxbTUFYLTFcXSBhZ2FpbiB1c2luZyBpbXBsaWNpdCBpbmRleCBcJFwkIgorCisgICAgZ2RiX3Rlc3QgInByaW50IFwkIgkiXFxcJDYgPSAxMDMiIFwKKwkiUHJpbnQgdmFsdWUtaGlzdG9yeVxbTUFYXF0gdXNpbmcgaW1wbGljaXQgaW5kZXggXCQiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgXCRcJDIiCSJcXFwkNyA9IDEwMiIgXAorCSJQcmludCB2YWx1ZS1oaXN0b3J5XFtNQVgtMlxdIHVzaW5nIGV4cGxpY2l0IGluZGV4IFwkXCQyIgorCisgICAgZ2RiX3Rlc3QgInByaW50IFwkMCIJIlxcXCQ4ID0gMTAyIiBcCisJIlByaW50IHZhbHVlLWhpc3RvcnlcW01BWFxdIHVzaW5nIGV4cGxpY2l0IGluZGV4IFwkMCIKKworICAgIGdkYl90ZXN0ICJwcmludCAxMDgiCSJcXFwkOSA9IDEwOCIgIiIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJFwkMCIJIlxcXCQxMCA9IDEwOCIgXAorCSJQcmludCB2YWx1ZS1oaXN0b3J5XFtNQVhcXSB1c2luZyBleHBsaWNpdCBpbmRleCBcJFwkMCIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJDEiCSJcXFwkMTEgPSAxMDEiIFwKKwkiUHJpbnQgdmFsdWUtaGlzdG9yeVxbMVxdIHVzaW5nIGV4cGxpY2l0IGluZGV4IFwkMSIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJDIiCSJcXFwkMTIgPSAxMDIiIFwKKwkiUHJpbnQgdmFsdWUtaGlzdG9yeVxbMlxdIHVzaW5nIGV4cGxpY2l0IGluZGV4IFwkMiIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJDMiCSJcXFwkMTMgPSAxMDMiIFwKKwkiUHJpbnQgdmFsdWUtaGlzdG9yeVxbM1xdIHVzaW5nIGV4cGxpY2l0IGluZGV4IFwkMyIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJC0zIgkiXFxcJDE0ID0gMTAwIiBcCisJIlByaW50ICh2YWx1ZS1oaXN0b3J5XFtNQVhcXSAtIDMpIHVzaW5nIGltcGxpY2l0IGluZGV4IFwkIgorCisgICAgZ2RiX3Rlc3QgInByaW50IFwkMSArIDMiCSJcXFwkMTUgPSAxMDQiIFwKKwkiVXNlIHZhbHVlLWhpc3RvcnkgZWxlbWVudCBpbiBhcml0aG1ldGljIGV4cHJlc3Npb24iCit9CisKK3Byb2MgdGVzdF9hcml0aG1ldGljX2V4cHJlc3Npb25zIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgIyBUZXN0IHVuYXJ5IG1pbnVzIHdpdGggdmFyaW91cyBvcGVyYW5kcworCisjICAgIGdkYl90ZXN0ICJwIC0oVFJVRSkiCSIgPSAtMSIJInVuYXJ5IG1pbnVzIGFwcGxpZWQgdG8gYm9vbCIKKyMgICAgZ2RiX3Rlc3QgInAgLSgnYScpIgkiID0geHh4IgkidW5hcnkgbWludXMgYXBwbGllZCB0byBjaGFyIgorICAgIGdkYl90ZXN0ICJwIC0oMSkiCQkiID0gLTEiCSJ1bmFyeSBtaW51cyBhcHBsaWVkIHRvIGludCIKKyAgICBnZGJfdGVzdCAicCAtKDEuMCkiCSIgPSAtMSIJInVuYXJ5IG1pbnVzIGFwcGxpZWQgdG8gcmVhbCIKKworICAgICMgVGVzdCBhZGRpdGlvbiB3aXRoIHZhcmlvdXMgb3BlcmFuZHMKKworICAgIGdkYl90ZXN0ICJwIFRSVUUgKyAxIgkiID0gMiIJImJvb2wgcGx1cyBpbnQiCisgICAgZ2RiX3Rlc3QgInAgJ2EnICsgMSIJIiA9IDk4IgkiY2hhciBwbHVzIGludCIKKyAgICBnZGJfdGVzdCAicCAxICsgMSIJCSIgPSAyIgkiaW50IHBsdXMgaW50IgorICAgIGdkYl90ZXN0ICJwIDEuMCArIDEiCSIgPSAyIgkicmVhbCBwbHVzIGludCIKKyAgICBnZGJfdGVzdCAicCAxLjAgKyAyLjAiCSIgPSAzIgkicmVhbCBwbHVzIHJlYWwiCisKKyAgICAjIFRlc3Qgc3VidHJhY3Rpb24gd2l0aCB2YXJpb3VzIG9wZXJhbmRzCisKKyAgICBnZGJfdGVzdCAicCBUUlVFIC0gMSIJIiA9IDAiCSJib29sIG1pbnVzIGludCIKKyAgICBnZGJfdGVzdCAicCAnYicgLSAxIgkiID0gOTciCSJjaGFyIG1pbnVzIGludCIKKyAgICBnZGJfdGVzdCAicCAzIC0gMSIJCSIgPSAyIgkiaW50IG1pbnVzIGludCIKKyAgICBnZGJfdGVzdCAicCAzLjAgLSAxIgkiID0gMiIJInJlYWwgbWludXMgaW50IgorICAgIGdkYl90ZXN0ICJwIDUuMCAtIDIuMCIJIiA9IDMiCSJyZWFsIG1pbnVzIHJlYWwiCisKKyAgICAjIFRlc3QgbXVsdGlwbGljYXRpb24gd2l0aCB2YXJpb3VzIG9wZXJhbmRzCisKKyAgICBnZGJfdGVzdCAicCBUUlVFICogMSIJIiA9IDEiCSJib29sIHRpbWVzIGludCIKKyAgICBnZGJfdGVzdCAicCAnYScgKiAyIgkiID0gMTk0IgkiY2hhciB0aW1lcyBpbnQiCisgICAgZ2RiX3Rlc3QgInAgMiAqIDMiCQkiID0gNiIJImludCB0aW1lcyBpbnQiCisgICAgZ2RiX3Rlc3QgInAgMi4wICogMyIJIiA9IDYiCSJyZWFsIHRpbWVzIGludCIKKyAgICBnZGJfdGVzdCAicCAyLjAgKiAzLjAiCSIgPSA2IgkicmVhbCB0aW1lcyByZWFsIgorCisgICAgIyBUZXN0IGRpdmlzaW9uIHdpdGggdmFyaW91cyBvcGVyYW5kcworCisgICAgZ2RiX3Rlc3QgInAgVFJVRSAvIDEiCSIgPSAxIgkiYm9vbCBkaXZpZGVkIGJ5IGludCIKKyAgICBnZGJfdGVzdCAicCAnYScgLyAyIgkiID0gNDgiCSJjaGFyIGRpdmlkZWQgYnkgaW50IgorICAgIGdkYl90ZXN0ICJwIDYgLyAzIgkJIiA9IDIiCSJpbnQgZGl2aWRlZCBieSBpbnQiCisgICAgZ2RiX3Rlc3QgInAgNi4wIC8gMyIJIiA9IDIiCSJyZWFsIGRpdmlkZWQgYnkgaW50IgorICAgIGdkYl90ZXN0ICJwIDYuMCAvIDMuMCIJIiA9IDIiCSJyZWFsIGRpdmlkZWQgYnkgcmVhbCIKKworICAgICMgVGVzdCBtb2R1bG8gd2l0aCB2YXJpb3VzIG9wZXJhbmRzCisKKyAgICBnZGJfdGVzdCAicCBUUlVFIE1PRCAxIgkiID0gMCIJImJvb2wgbW9kdWxvIGludCIKKyAgICBnZGJfdGVzdCAicCAnYScgTU9EIDIiCSIgPSAxIgkiY2hhciBtb2R1bG8gaW50IgorICAgIGdkYl90ZXN0ICJwIC01IE1PRCAzIgkiID0gMSIJIm5lZ2F0aXZlIGludCBtb2R1bG8gaW50IgorICAgIGdkYl90ZXN0ICJwIDUgTU9EIDEiCSIgPSAwIgkiaW50IG1vZHVsbyBpbnQiCisgICAgZ2RiX3Rlc3QgInAgNSBNT0QgMiIJIiA9IDEiCSJpbnQgbW9kdWxvIGludCIKKyAgICBnZGJfdGVzdCAicCA1IE1PRCAzIgkiID0gMiIJImludCBtb2R1bG8gaW50IgorICAgIGdkYl90ZXN0ICJwIDUgTU9EIDQiCSIgPSAxIgkiaW50IG1vZHVsbyBpbnQiCisgICAgZ2RiX3Rlc3QgInAgNSBNT0QgNSIJIiA9IDAiCSJpbnQgbW9kdWxvIGludCIKKyAgICBnZGJfdGVzdCAicCAwIE1PRCAxIgkiID0gMCIJImludCBtb2R1bG8gaW50IgorICAgIGdkYl90ZXN0ICJwIDAgTU9EIDIiCSIgPSAwIgkiaW50IG1vZHVsbyBpbnQiCisgICAgZ2RiX3Rlc3QgInAgMCBNT0QgMyIJIiA9IDAiCSJpbnQgbW9kdWxvIGludCIKKyAgICBnZGJfdGVzdCAicCAwIE1PRCA0IgkiID0gMCIJImludCBtb2R1bG8gaW50IgorICAgIGdkYl90ZXN0ICJwIC01IE1PRCAxIgkiID0gMCIJImludCBtb2R1bG8gaW50IgorICAgIGdkYl90ZXN0ICJwIC01IE1PRCAyIgkiID0gMSIJImludCBtb2R1bG8gaW50IgorICAgIGdkYl90ZXN0ICJwIC01IE1PRCAzIgkiID0gMSIJImludCBtb2R1bG8gaW50IgorICAgIGdkYl90ZXN0ICJwIC01IE1PRCA0IgkiID0gMyIJImludCBtb2R1bG8gaW50IgorICAgIGdkYl90ZXN0ICJwIC01IE1PRCA1IgkiID0gMCIJImludCBtb2R1bG8gaW50IgorICAgIGdkYl90ZXN0ICJwIC01IE1PRCA1IgkiID0gMCIJImludCBtb2R1bG8gaW50IgorICAgIHRlc3RfcHJpbnRfcmVqZWN0ICJwIDYuMCBNT0QgMyIgXAorCSJJbnRlZ2VyLW9ubHkgb3BlcmF0aW9uIG9uIGZsb2F0aW5nIHBvaW50IG51bWJlci4qIgorICAgIHRlc3RfcHJpbnRfcmVqZWN0ICJwIDYuMCBNT0QgMy4wIiBcCisJIkludGVnZXItb25seSBvcGVyYXRpb24gb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyLioiCisgICAgdGVzdF9wcmludF9yZWplY3QgInAgLTUgTU9EIC0xIiBcCisJIlNlY29uZCBvcGVyYW5kIG9mIE1PRCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLioiCisgICAgdGVzdF9wcmludF9yZWplY3QgInAgLTUgTU9EIDAiIFwKKwkiU2Vjb25kIG9wZXJhbmQgb2YgTU9EIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uKiIKKworICAgICMgVGVzdCByZW1haW5kZXIgd2l0aCB2YXJpb3VzIG9wZXJhbmRzCisKKyAgICBnZGJfdGVzdCAicCBUUlVFIFJFTSAxIgkiID0gMCIJImJvb2wgcmVtYWluZGVyIGludCIKKyAgICBnZGJfdGVzdCAicCAnYScgUkVNIDIiCSIgPSAxIgkiY2hhciByZW1haW5kZXIgaW50IgorICAgIGdkYl90ZXN0ICJwIDUgUkVNIDUiCSIgPSAwIgkiaW50IHJlbWFpbmRlciBpbnQiCisgICAgZ2RiX3Rlc3QgInAgNSBSRU0gNCIJIiA9IDEiCSJpbnQgcmVtYWluZGVyIGludCIKKyAgICBnZGJfdGVzdCAicCA1IFJFTSAzIgkiID0gMiIJImludCByZW1haW5kZXIgaW50IgorICAgIGdkYl90ZXN0ICJwIDUgUkVNIDIiCSIgPSAxIgkiaW50IHJlbWFpbmRlciBpbnQiCisgICAgZ2RiX3Rlc3QgInAgNSBSRU0gMSIJIiA9IDAiCSJpbnQgcmVtYWluZGVyIGludCIKKyAgICBnZGJfdGVzdCAicCA1IFJFTSAtMSIJIiA9IDAiCSJpbnQgcmVtYWluZGVyIGludCIKKyAgICBnZGJfdGVzdCAicCA1IFJFTSAtMiIJIiA9IDEiCSJpbnQgcmVtYWluZGVyIGludCIKKyAgICBnZGJfdGVzdCAicCA1IFJFTSAtMyIJIiA9IDIiCSJpbnQgcmVtYWluZGVyIGludCIKKyAgICBnZGJfdGVzdCAicCA1IFJFTSAtNCIJIiA9IDEiCSJpbnQgcmVtYWluZGVyIGludCIKKyAgICBnZGJfdGVzdCAicCA1IFJFTSAtNSIJIiA9IDAiCSJpbnQgcmVtYWluZGVyIGludCIKKyAgICBnZGJfdGVzdCAicCAtNSBSRU0gNSIJIiA9IDAiCSJpbnQgcmVtYWluZGVyIGludCIKKyAgICBnZGJfdGVzdCAicCAtNSBSRU0gNCIJIiA9IC0xIgkiaW50IHJlbWFpbmRlciBpbnQiCisgICAgZ2RiX3Rlc3QgInAgLTUgUkVNIDMiCSIgPSAtMiIJImludCByZW1haW5kZXIgaW50IgorICAgIGdkYl90ZXN0ICJwIC01IFJFTSAyIgkiID0gLTEiCSJpbnQgcmVtYWluZGVyIGludCIKKyAgICBnZGJfdGVzdCAicCAtNSBSRU0gMSIJIiA9IDAiCSJpbnQgcmVtYWluZGVyIGludCIKKyAgICBnZGJfdGVzdCAicCAtNSBSRU0gLTEiCSIgPSAwIgkiaW50IHJlbWFpbmRlciBpbnQiCisgICAgZ2RiX3Rlc3QgInAgLTUgUkVNIC0yIgkiID0gLTEiCSJpbnQgcmVtYWluZGVyIGludCIKKyAgICBnZGJfdGVzdCAicCAtNSBSRU0gLTMiCSIgPSAtMiIJImludCByZW1haW5kZXIgaW50IgorICAgIGdkYl90ZXN0ICJwIC01IFJFTSAtNCIJIiA9IC0xIgkiaW50IHJlbWFpbmRlciBpbnQiCisgICAgZ2RiX3Rlc3QgInAgLTUgUkVNIC01IgkiID0gMCIJImludCByZW1haW5kZXIgaW50IgorICAgIGdkYl90ZXN0ICJwIDYgUkVNIDMiCSIgPSAwIgkiaW50IHJlbWFpbmRlciBpbnQiCisgICAgdGVzdF9wcmludF9yZWplY3QgInAgNi4wIFJFTSAzIiBcCisJIkludGVnZXItb25seSBvcGVyYXRpb24gb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyLioiCisgICAgdGVzdF9wcmludF9yZWplY3QgInAgNi4wIFJFTSAzLjAiIFwKKwkiSW50ZWdlci1vbmx5IG9wZXJhdGlvbiBvbiBmbG9hdGluZyBwb2ludCBudW1iZXIuKiIKK30KKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKworZ2RiX3Rlc3QgInNldCBwcmludCBzZXZlbmJpdC1zdHJpbmdzIiAiIgorCitpZiBbc2V0X2xhbmdfY2hpbGxdIHRoZW4geworICAgIHRlc3RfdmFsdWVfaGlzdG9yeQorICAgIHRlc3RfY29udmVuaWVuY2VfdmFyaWFibGVzCisgICAgdGVzdF9pbnRlZ2VyX2xpdGVyYWxzX2FjY2VwdGVkCisgICAgdGVzdF9pbnRlZ2VyX2xpdGVyYWxzX3JlamVjdGVkCisgICAgdGVzdF9ib29sZWFuX2xpdGVyYWxzX2FjY2VwdGVkCisgICAgdGVzdF9jaGFyYWN0ZXJfbGl0ZXJhbHNfYWNjZXB0ZWQKKyAgICB0ZXN0X2Zsb2F0X2xpdGVyYWxzX2FjY2VwdGVkCisgICAgdGVzdF9hcml0aG1ldGljX2V4cHJlc3Npb25zCit9IGVsc2UgeworICAgIHdhcm5pbmcgIiR0ZXN0X25hbWUgdGVzdHMgc3VwcHJlc3NlZC4iIDAKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2NoaWxsdmFycy5jaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2NoaWxsdmFycy5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWRmY2JhCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvY2hpbGx2YXJzLmNoCkBAIC0wLDAgKzEsMjA0IEBACit0ZXN0dmFyczogTU9EVUxFCisKK0RDTCBib29sX3RydWUgQk9PTCBJTklUIDo9IFRSVUU7CitEQ0wgYm9vbF9mYWxzZSBCT09MIElOSVQgOj0gRkFMU0U7CitEQ0wgYm9vbHRhYmxlMSBBUlJBWSAoMDozKSBCT09MIElOSVQgOj0gWyBUUlVFLCBGQUxTRSwgRkFMU0UsIFRSVUUgXTsKK0RDTCBib29sdGFibGUyIEFSUkFZICg0OjcpIEJPT0wgSU5JVCA6PSBbIFRSVUUsIEZBTFNFLCBGQUxTRSwgVFJVRSBdOworCitEQ0wgY29udHJvbF9jaGFyIENIQVIgSU5JVCA6PSBDJzA3JzsKK0RDTCBwcmludGFibGVfY2hhciBDSEFSIElOSVQgOj0gJ2EnOworRENMIGNoYXJ0YWJsZTEgQVJSQVkgKDA6MikgQ0hBUiBJTklUIDo9IFsgQycwMCcsIEMnMDEnLCBDJzAyJyBdOworRENMIGNoYXJ0YWJsZTIgQVJSQVkgKDM6NSkgQ0hBUiBJTklUIDo9IFsgQycwMCcsIEMnMDEnLCBDJzAyJyBdOworCitEQ0wgc3RyaW5nMSBDSEFSUyAoNCkgSU5JVCA6PSAnYWJjZCc7CitEQ0wgc3RyaW5nMiBDSEFSUyAoNSkgSU5JVCA6PSAnZWYnIC8vIEMnMDAnIC8vICdnaCc7CitEQ0wgc3RyaW5nMyBDSEFSUyAoNikgSU5JVCA6PSAnZWYnIC8vICdnaCcgLy8gJ2lqJzsKK0RDTCBzdHJpbmc0IENIQVJTICg3KSBJTklUIDo9ICg2KSAneicgLy8gQycwMCc7CisKK0RDTCBieXRlX2xvdyBCWVRFIElOSVQgOj0gLTEyODsKK0RDTCBieXRlX2hpZ2ggQllURSBJTklUIDo9IDEyNzsKK0RDTCBieXRldGFibGUxIEFSUkFZICgwOjQpIEJZVEUgSU5JVCA6PSBbIC0yLCAtMSwgMCwgMSwgMiBdOworRENMIGJ5dGV0YWJsZTIgQVJSQVkgKDU6OSkgQllURSBJTklUIDo9IFsgLTIsIC0xLCAwLCAxLCAyIF07CitEQ0wgYnl0ZXRhYmxlMyBBUlJBWSAoMToyLCdjJzonZCcsRkFMU0U6VFJVRSkgQllURQorCUlOSVQgOj0gWyBbIFsgMCwgMSBdLCBbIDIsIDMgXSBdLCBbIFsgNCwgNSBdLCBbIDYsIDcgXSBdIF07CitEQ0wgYnl0ZXRhYmxlNCBBUlJBWSAoMToyKSBBUlJBWSAoJ2MnOidkJykgQVJSQVkgKEZBTFNFOlRSVUUpIEJZVEUKKwlJTklUIDo9IFsgWyBbIDAsIDEgXSwgWyAyLCAzIF0gXSwgWyBbIDQsIDUgXSwgWyA2LCA3IF0gXSBdOworCitEQ0wgdWJ5dGVfbG93IFVCWVRFIElOSVQgOj0gMDsKK0RDTCB1Ynl0ZV9oaWdoIFVCWVRFIElOSVQgOj0gMjU1OworRENMIHVieXRldGFibGUxIEFSUkFZICgwOjQpIFVCWVRFIElOSVQgOj0gWyAwLCAxLCAyLCAzLCA0IF07CitEQ0wgdWJ5dGV0YWJsZTIgQVJSQVkgKDU6OSkgVUJZVEUgSU5JVCA6PSBbIDAsIDEsIDIsIDMsIDQgXTsKKworRENMIGludF9sb3cgSU5UIElOSVQgOj0gLTMyXzc2ODsKK0RDTCBpbnRfaGlnaCBJTlQgSU5JVCA6PSAzMl83Njc7CitEQ0wgaW50dGFibGUxIEFSUkFZICgwOjQpIElOVCBJTklUIDo9IFsgLTIsIC0xLCAwLCAxLCAyIF07CitEQ0wgaW50dGFibGUyIEFSUkFZICg1OjkpIElOVCBJTklUIDo9IFsgLTIsIC0xLCAwLCAxLCAyIF07CisKK0RDTCB1aW50X2xvdyBVSU5UIElOSVQgOj0gMDsKK0RDTCB1aW50X2hpZ2ggVUlOVCBJTklUIDo9IDY1XzUzNTsKK0RDTCB1aW50dGFibGUxIEFSUkFZICgwOjQpIFVJTlQgSU5JVCA6PSBbIDAsIDEsIDIsIDMsIDQgXTsKK0RDTCB1aW50dGFibGUyIEFSUkFZICg1OjkpIFVJTlQgSU5JVCA6PSBbIDAsIDEsIDIsIDMsIDQgXTsKKworRENMIGxvbmdfbG93IExPTkcgSU5JVCA6PSAtMl8xNDdfNDgzXzY0ODsKK0RDTCBsb25nX2hpZ2ggTE9ORyBJTklUIDo9IDJfMTQ3XzQ4M182NDc7CitEQ0wgbG9uZ3RhYmxlMSBBUlJBWSAoMDo0KSBMT05HIElOSVQgOj0gWyAtMiwgLTEsIDAsIDEsIDIgXTsKK0RDTCBsb25ndGFibGUyIEFSUkFZICg1OjkpIExPTkcgSU5JVCA6PSBbIC0yLCAtMSwgMCwgMSwgMiBdOworCitEQ0wgdWxvbmdfbG93IFVMT05HIElOSVQgOj0gMDsKK0RDTCB1bG9uZ19oaWdoIFVMT05HIElOSVQgOj0gNF8yOTRfOTY3XzI5NTsKK0RDTCB1bG9uZ3RhYmxlMSBBUlJBWSAoMDo0KSBVTE9ORyBJTklUIDo9IFsgMCwgMSwgMiwgMywgNCBdOworRENMIHVsb25ndGFibGUyIEFSUkFZICg1OjkpIFVMT05HIElOSVQgOj0gWyAwLCAxLCAyLCAzLCA0IF07CisKK0RDTCByZWFsMSBGTE9BVCBJTklUIDo9IDMuMTQxNTkyNjUzNTg7CitEQ0wgcmVhbDIgRkxPQVQgSU5JVCA6PSAtMy4xNDE1OTI2NTM1ODsKK0RDTCByZWFsdGFibGUxIEFSUkFZICgwOjQpIEZMT0FUIElOSVQgOj0gWyAtMi4wLCAtMS4wLCAwLjAsIDEuMCwgMi4wIF07CitEQ0wgcmVhbHRhYmxlMiBBUlJBWSAoNTo5KSBGTE9BVCBJTklUIDo9IFsgLTIuMCwgLTEuMCwgMC4wLCAxLjAsIDIuMCBdOworCitEQ0wgbG9uZ19yZWFsMSBET1VCTEUgSU5JVCA6PSAzLjE0ZTMwMDsKK0RDTCBsb25nX3JlYWwyIERPVUJMRSBJTklUIDo9IC0zLjE0ZS0zMDA7CitEQ0wgbG9uZ3JlYWx0YWJsZTEgQVJSQVkgKDA6NCkgRE9VQkxFIElOSVQgOj0gWyAtMi4wLCAtMS4wLCAwLjAsIDEuMCwgMi4wIF07CitEQ0wgbG9uZ3JlYWx0YWJsZTIgQVJSQVkgKDU6OSkgRE9VQkxFIElOSVQgOj0gWyAtMi4wLCAtMS4wLCAwLjAsIDEuMCwgMi4wIF07CisKKy8qIERDTCBwb3dlcnNldDEgUE9XRVJTRVQgSU5UKDA6Nyk7Ki8KKy8qIERDTCBjaGFyczEgQ0hBUiAoMTYpIElOSVQgOj0gKDE2KSdiJzsgKi8KKy8qIERDTCBiaXRzMSBCSVQoMjApIDo9IEInMTExMTExMTEwMDAwMTAxMDEwMTEnOyAqLworCitORVdNT0RFIHNpbXBsZV9zdHJ1Y3QgPSBTVFJVQ1QgKGFib29sIEJPT0wsIGFpbnQgSU5ULCBhc3RyaW5nIENIQVJTICg4KSk7CitEQ0wgc3RydWN0MSBzaW1wbGVfc3RydWN0IDo9IFsgVFJVRSwgMTIzLCAiYSBzdHJpbmciIF07CisKK05FV01PREUgbmVzdGVkX3N0cnVjdCA9IFNUUlVDVCAoYWJvb2wgQk9PTCwgbnN0cnVjdCBzaW1wbGVfc3RydWN0LCBhaW50IElOVCk7CitEQ0wgc3RydWN0MiBuZXN0ZWRfc3RydWN0IDo9IFsgVFJVRSwgWyBGQUxTRSwgNDU2LCAiZGVhZGJlZWYiIF0sIDc4OSBdOworCisvKiBUaGlzIHRhYmxlIGlzIHVzZWQgYXMgYSBzb3VyY2UgZm9yIGV2ZXJ5IGFzY2lpIGNoYXJhY3Rlci4gKi8KKworRENMIGFzY2lpdGFibGUgQVJSQVkgKDA6MjU1KSBDSEFSIElOSVQgOj0gWworICAgIEMnMDAnLCBDJzAxJywgQycwMicsIEMnMDMnLCBDJzA0JywgQycwNScsIEMnMDYnLCBDJzA3JywKKyAgICBDJzA4JywgQycwOScsIEMnMGEnLCBDJzBiJywgQycwYycsIEMnMGQnLCBDJzBlJywgQycwZicsCisgICAgQycxMCcsIEMnMTEnLCBDJzEyJywgQycxMycsIEMnMTQnLCBDJzE1JywgQycxNicsIEMnMTcnLAorICAgIEMnMTgnLCBDJzE5JywgQycxYScsIEMnMWInLCBDJzFjJywgQycxZCcsIEMnMWUnLCBDJzFmJywKKyAgICBDJzIwJywgQycyMScsIEMnMjInLCBDJzIzJywgQycyNCcsIEMnMjUnLCBDJzI2JywgQycyNycsCisgICAgQycyOCcsIEMnMjknLCBDJzJhJywgQycyYicsIEMnMmMnLCBDJzJkJywgQycyZScsIEMnMmYnLAorICAgIEMnMzAnLCBDJzMxJywgQyczMicsIEMnMzMnLCBDJzM0JywgQyczNScsIEMnMzYnLCBDJzM3JywKKyAgICBDJzM4JywgQyczOScsIEMnM2EnLCBDJzNiJywgQyczYycsIEMnM2QnLCBDJzNlJywgQyczZicsCisgICAgQyc0MCcsIEMnNDEnLCBDJzQyJywgQyc0MycsIEMnNDQnLCBDJzQ1JywgQyc0NicsIEMnNDcnLAorICAgIEMnNDgnLCBDJzQ5JywgQyc0YScsIEMnNGInLCBDJzRjJywgQyc0ZCcsIEMnNGUnLCBDJzRmJywKKyAgICBDJzUwJywgQyc1MScsIEMnNTInLCBDJzUzJywgQyc1NCcsIEMnNTUnLCBDJzU2JywgQyc1NycsCisgICAgQyc1OCcsIEMnNTknLCBDJzVhJywgQyc1YicsIEMnNWMnLCBDJzVkJywgQyc1ZScsIEMnNWYnLAorICAgIEMnNjAnLCBDJzYxJywgQyc2MicsIEMnNjMnLCBDJzY0JywgQyc2NScsIEMnNjYnLCBDJzY3JywKKyAgICBDJzY4JywgQyc2OScsIEMnNmEnLCBDJzZiJywgQyc2YycsIEMnNmQnLCBDJzZlJywgQyc2ZicsCisgICAgQyc3MCcsIEMnNzEnLCBDJzcyJywgQyc3MycsIEMnNzQnLCBDJzc1JywgQyc3NicsIEMnNzcnLAorICAgIEMnNzgnLCBDJzc5JywgQyc3YScsIEMnN2InLCBDJzdjJywgQyc3ZCcsIEMnN2UnLCBDJzdmJywKKyAgICBDJzgwJywgQyc4MScsIEMnODInLCBDJzgzJywgQyc4NCcsIEMnODUnLCBDJzg2JywgQyc4NycsCisgICAgQyc4OCcsIEMnODknLCBDJzhhJywgQyc4YicsIEMnOGMnLCBDJzhkJywgQyc4ZScsIEMnOGYnLAorICAgIEMnOTAnLCBDJzkxJywgQyc5MicsIEMnOTMnLCBDJzk0JywgQyc5NScsIEMnOTYnLCBDJzk3JywKKyAgICBDJzk4JywgQyc5OScsIEMnOWEnLCBDJzliJywgQyc5YycsIEMnOWQnLCBDJzllJywgQyc5ZicsCisgICAgQydhMCcsIEMnYTEnLCBDJ2EyJywgQydhMycsIEMnYTQnLCBDJ2E1JywgQydhNicsIEMnYTcnLAorICAgIEMnYTgnLCBDJ2E5JywgQydhYScsIEMnYWInLCBDJ2FjJywgQydhZCcsIEMnYWUnLCBDJ2FmJywKKyAgICBDJ2IwJywgQydiMScsIEMnYjInLCBDJ2IzJywgQydiNCcsIEMnYjUnLCBDJ2I2JywgQydiNycsCisgICAgQydiOCcsIEMnYjknLCBDJ2JhJywgQydiYicsIEMnYmMnLCBDJ2JkJywgQydiZScsIEMnYmYnLAorICAgIEMnYzAnLCBDJ2MxJywgQydjMicsIEMnYzMnLCBDJ2M0JywgQydjNScsIEMnYzYnLCBDJ2M3JywKKyAgICBDJ2M4JywgQydjOScsIEMnY2EnLCBDJ2NiJywgQydjYycsIEMnY2QnLCBDJ2NlJywgQydjZicsCisgICAgQydkMCcsIEMnZDEnLCBDJ2QyJywgQydkMycsIEMnZDQnLCBDJ2Q1JywgQydkNicsIEMnZDcnLAorICAgIEMnZDgnLCBDJ2Q5JywgQydkYScsIEMnZGInLCBDJ2RjJywgQydkZCcsIEMnZGUnLCBDJ2RmJywKKyAgICBDJ2UwJywgQydlMScsIEMnZTInLCBDJ2UzJywgQydlNCcsIEMnZTUnLCBDJ2U2JywgQydlNycsCisgICAgQydlOCcsIEMnZTknLCBDJ2VhJywgQydlYicsIEMnZWMnLCBDJ2VkJywgQydlZScsIEMnZWYnLAorICAgIEMnZjAnLCBDJ2YxJywgQydmMicsIEMnZjMnLCBDJ2Y0JywgQydmNScsIEMnZjYnLCBDJ2Y3JywKKyAgICBDJ2Y4JywgQydmOScsIEMnZmEnLCBDJ2ZiJywgQydmYycsIEMnZmQnLCBDJ2ZlJywgQydmZicKK107CisKK0RDTCBjaGFybWF0cml4IEFSUkFZICgwOjI1NSkgQ0hBUiBJTklUIDo9IFsKKyAgJ2EnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLAorICAnYScsJ2EnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsCisgICdhJywnYScsJ2EnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywKKyAgJ2EnLCdhJywnYScsJ2EnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLAorICAnYScsJ2EnLCdhJywnYScsJ2EnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsCisgICdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywKKyAgJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLAorICAnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywnWCcsCisgICdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLCdYJywKKyAgJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdYJywnWCcsJ1gnLCdYJywnWCcsJ1gnLAorICAnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdYJywnWCcsJ1gnLCdYJywnWCcsCisgICdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdYJywnWCcsJ1gnLCdYJywKKyAgJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdYJywnWCcsJ1gnLAorICAnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdYJywnWCcsCisgICdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdYJywKKyAgJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnLCdhJywnYScsJ2EnCitdOworCitEQ0wgeHB0ciBQVFIgSU5JVCA6PSAtPmludF9oaWdoOworCitib29sZWFuczogUFJPQyAoKTsKKworCURDTCB2YWwxIEJPT0wgOj0gVFJVRTsKKwlEQ0wgdmFsMiBCT09MIDo9IEZBTFNFOworCURDTCB2YWwzIEJPT0wgOj0gVFJVRTsKKworCXZhbDEgOj0gVFJVRSBYT1IgVFJVRTsKKwl2YWwxIDo9IFRSVUUgWE9SIEZBTFNFOworCXZhbDEgOj0gRkFMU0UgWE9SIFRSVUU7CisJdmFsMSA6PSBGQUxTRSBYT1IgRkFMU0U7CisJdmFsMSA6PSB2YWwyIFhPUiB2YWwzOworCisJdmFsMSA6PSBUUlVFIEFORCBUUlVFOworCXZhbDEgOj0gVFJVRSBBTkQgRkFMU0U7CisJdmFsMSA6PSBGQUxTRSBBTkQgVFJVRTsKKwl2YWwxIDo9IEZBTFNFIEFORCBGQUxTRTsKKwl2YWwxIDo9IHZhbDIgQU5EIHZhbDM7CisKKwl2YWwxIDo9IFRSVUUgQU5ESUYgVFJVRTsKKwl2YWwxIDo9IFRSVUUgQU5ESUYgRkFMU0U7CisJdmFsMSA6PSBGQUxTRSBBTkRJRiBUUlVFOworCXZhbDEgOj0gRkFMU0UgQU5ESUYgRkFMU0U7CisJdmFsMSA6PSB2YWwyIEFORElGIHZhbDM7CisKKwl2YWwxIDo9IFRSVUUgT1IgVFJVRTsKKwl2YWwxIDo9IFRSVUUgT1IgRkFMU0U7CisJdmFsMSA6PSBGQUxTRSBPUiBUUlVFOworCXZhbDEgOj0gRkFMU0UgT1IgRkFMU0U7CisJdmFsMSA6PSB2YWwyIE9SIHZhbDM7CisKKy0tCXZhbDEgOj0gTk9UIFRSVUU7CistLQl2YWwxIDo9IE5PVCBGQUxTRTsKKy0tCXZhbDEgOj0gTk9UIHZhbDI7CistLQl2YWwxIDo9IE5PVCB2YWwzOworCQorRU5EIGJvb2xlYW5zOworCitzY2FsYXJfYXJpdGhtZXRpYzogUFJPQyAoKTsKKworCURDTCB2YWwxIElOVCA6PSAxOworCURDTCB2YWwyIElOVCA6PSAyOworCURDTCB2YWwzIElOVCA6PSAzOworCisJdmFsMSA6PSAtdmFsMjsKKwl2YWwxIDo9IHZhbDIgKyB2YWwzOworCXZhbDEgOj0gdmFsMiAtIHZhbDM7CisJdmFsMSA6PSB2YWwyICogdmFsMzsKKwl2YWwxIDo9IHZhbDIgLyB2YWwzOworCXZhbDEgOj0gdmFsMiBNT0QgdmFsMzsKKwl2YWwxIDo9IHZhbDIgUkVNIHZhbDM7CisJCitFTkQgc2NhbGFyX2FyaXRobWV0aWM7CisKK3dyaXRlX2FycmF5czogUFJPQyAoKTsKKworCWludHRhYmxlMSgwKSA6PSAwOworCWludHRhYmxlMSgxKSA6PSAxOworCWludHRhYmxlMSgyKSA6PSAyOworCWludHRhYmxlMSgzKSA6PSAzOworCWludHRhYmxlMSg0KSA6PSA0OworCWludHRhYmxlMig1KSA6PSA1OworCWludHRhYmxlMig2KSA6PSA2OworCWludHRhYmxlMig3KSA6PSA3OworCWludHRhYmxlMig4KSA6PSA4OworCWludHRhYmxlMig5KSA6PSA5OworCitFTkQgd3JpdGVfYXJyYXlzOworCit1aW50X2xvdyA6PSAwOworCitzY2FsYXJfYXJpdGhtZXRpYyAoKTsKK3dyaXRlX2FycmF5cyAoKTsKK2Jvb2xlYW5zICgpOworCitFTkQ7CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9jaGlsbHZhcnMuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvY2hpbGx2YXJzLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzdjOTRkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvY2hpbGx2YXJzLmV4cApAQCAtMCwwICsxLDMxNiBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEZyZWQgRmlzaC4gKGZuZkBjeWdudXMuY29tKQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworaWYgW3NraXBfY2hpbGxfdGVzdHNdIHRoZW4geyBjb250aW51ZSB9CisKK3NldCB0ZXN0ZmlsZSAiY2hpbGx2YXJzIgorc2V0IHNyY2ZpbGUgJHtzcmNkaXJ9LyRzdWJkaXIvJHt0ZXN0ZmlsZX0uY2gKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0uZXhlCitpZiAgeyBbY29tcGlsZSAiJHtzcmNmaWxlfSAtZyAtbyAke2JpbmZpbGV9ICR7Q0hJTExfUlQwfSAke0NISUxMX0xJQn0iXSAhPSAiIiB9IHsKKyAgICBwZXJyb3IgIkNvdWxkbid0IGNvbXBpbGUgJHtzcmNmaWxlfSIKKyAgICByZXR1cm4gLTEKK30KKworcHJvYyBkb190ZXN0cyB7fSB7CisgICAgZ2xvYmFsIHBybXNfaWQgYnVnX2lkIHN1YmRpciBvYmpkaXIgc3JjZGlyIGJpbmZpbGUgZ2RiX3Byb21wdAorCisgICAgc2V0IHBybXNfaWQgMAorICAgIHNldCBidWdfaWQgMAorCisgICAgIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKyAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKyAgICBnZGJfbG9hZCAkYmluZmlsZQorCisgICAgZ2RiX3Rlc3QgInNldCBsYW5ndWFnZSBjaGlsbCIgIiIKKworICAgICMgVGhpcyBpcyBuZWVkZWQgKGF0IGxlYXN0IG9uIFN1bk9TNCkgdG8gbWFrZSBzdXJlIHRoZQorICAgICMgdGhlIHN5bWJvbCB0YWJsZSBpcyByZWFkLgorICAgIGdkYl90ZXN0ICJicmVhayBjaGlsbHZhcnMuY2g6MyIgIiIKKyAgICBnZGJfdGVzdCAiZGVsZXRlIDEiICIiCisKKyAgICBnZGJfdGVzdCAic2V0IHdpZHRoIDAiICIiCisgICAgZ2RiX3Rlc3QgInNldCBwcmludCBzZXZlbmJpdC1zdHJpbmdzIiAiIgorICAgIGdkYl90ZXN0ICJzZXQgcHJpbnQgYWRkcmVzcyBvZmYiICIiCisKKyAgICB0ZXN0X0JPT0wKKyAgICB0ZXN0X0NIQVIKKyAgICB0ZXN0X0JZVEUKKyAgICB0ZXN0X1VCWVRFCisgICAgdGVzdF9JTlQKKyAgICB0ZXN0X1VJTlQKKyAgICB0ZXN0X0xPTkcKKyAgICB0ZXN0X1VMT05HCisgICAgdGVzdF9SRUFMCisgICAgdGVzdF9MT05HX1JFQUwKKyAgICB0ZXN0X1BPV0VSU0VUCisgICAgdGVzdF9hcnJheXMKKyAgICB0ZXN0X3N0cmluZ3MKKyAgICB0ZXN0X3N0cnVjdHMKKworICAgIHRlc3RfcHRyCit9CisKK3Byb2MgdGVzdF9CT09MIHt9IHsKKworICAgIGdkYl90ZXN0ICJwdHlwZSBib29sX3RydWUiCQkidHlwZSA9IChCT09MfGJvb2wpIgorICAgIGdkYl90ZXN0ICJwdHlwZSBib29sX2ZhbHNlIgkJInR5cGUgPSAoQk9PTHxib29sKSIKKyAgICBnZGJfdGVzdCAid2hhdGlzIGJvb2xfdHJ1ZSIJCSJ0eXBlID0gKEJPT0x8Ym9vbCkiCisgICAgZ2RiX3Rlc3QgIndoYXRpcyBib29sX2ZhbHNlIgkidHlwZSA9IChCT09MfGJvb2wpIgorICAgIGdkYl90ZXN0ICJwcmludCBib29sX2ZhbHNlIgkJIiA9IEZBTFNFIgorICAgIGdkYl90ZXN0ICJwcmludCBib29sX3RydWUiCQkiID0gVFJVRSIKKworfQorCitwcm9jIHRlc3RfQ0hBUiB7fSB7CisgICAgZ2RiX3Rlc3QgInB0eXBlIGNvbnRyb2xfY2hhciIJInR5cGUgPSAoQ0hBUnxjaGFyKSIKKyAgICBnZGJfdGVzdCAid2hhdGlzIGNvbnRyb2xfY2hhciIJInR5cGUgPSAoQ0hBUnxjaGFyKSIKKyAgICBnZGJfdGVzdCAicHJpbnQgY29udHJvbF9jaGFyIgl7ID0gJ1xeWyhdN1spXSd9CisgICAgZ2RiX3Rlc3QgInB0eXBlIHByaW50YWJsZV9jaGFyIgkidHlwZSA9IChDSEFSfGNoYXIpIgorICAgIGdkYl90ZXN0ICJ3aGF0aXMgcHJpbnRhYmxlX2NoYXIiCSJ0eXBlID0gKENIQVJ8Y2hhcikiCisgICAgZ2RiX3Rlc3QgInByaW50IHByaW50YWJsZV9jaGFyIgkiID0gJ2EnIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGxvd2VyKGNoYXIpIgl7ID0gJ1xeWyhdMFspXSd9CisgICAgZ2RiX3Rlc3QgInByaW50IHVwcGVyKGNoYXIpIgl7ID0gJ1xeWyhdMjU1WyldJ30KK30KKworcHJvYyB0ZXN0X0JZVEUge30geworICAgIGdkYl90ZXN0ICJwdHlwZSBieXRlX2xvdyIJCSJ0eXBlID0gKEJZVEV8Ynl0ZSkiCisgICAgZ2RiX3Rlc3QgIndoYXRpcyBieXRlX2xvdyIJCSJ0eXBlID0gKEJZVEV8Ynl0ZSkiCisgICAgZ2RiX3Rlc3QgInByaW50IGJ5dGVfbG93IgkJIiA9IC0xMjgiCisgICAgZ2RiX3Rlc3QgInB0eXBlIGJ5dGVfaGlnaCIJCSJ0eXBlID0gKEJZVEV8Ynl0ZSkiCisgICAgZ2RiX3Rlc3QgIndoYXRpcyBieXRlX2hpZ2giCQkidHlwZSA9IChCWVRFfGJ5dGUpIgorICAgIGdkYl90ZXN0ICJwcmludCBieXRlX2hpZ2giCQkiID0gMTI3IgorCisgICAgZ2RiX3Rlc3QgInByaW50IGxvd2VyKGJ5dGUpIgkiID0gLTEyOCIKKyAgICBnZGJfdGVzdCAicHJpbnQgdXBwZXIoYnl0ZSkiCSIgPSAxMjciCisgICAgZ2RiX3Rlc3QgInByaW50IGxvd2VyKGJ5dGVfaGlnaCkiCSIgPSAtMTI4IgorICAgIGdkYl90ZXN0ICJwcmludCB1cHBlcihieXRlX2hpZ2gpIgkiID0gMTI3IgorfQorCitwcm9jIHRlc3RfVUJZVEUge30geworICAgIGdkYl90ZXN0ICJwdHlwZSB1Ynl0ZV9sb3ciCQkidHlwZSA9IChVQllURXx1Ynl0ZSkiCisgICAgZ2RiX3Rlc3QgIndoYXRpcyB1Ynl0ZV9sb3ciCQkidHlwZSA9IChVQllURXx1Ynl0ZSkiCisgICAgZ2RiX3Rlc3QgInByaW50IHVieXRlX2xvdyIJCSIgPSAwIgorICAgIGdkYl90ZXN0ICJwdHlwZSB1Ynl0ZV9oaWdoIgkJInR5cGUgPSAoVUJZVEV8dWJ5dGUpIgorICAgIGdkYl90ZXN0ICJ3aGF0aXMgdWJ5dGVfaGlnaCIJInR5cGUgPSAoVUJZVEV8dWJ5dGUpIgorICAgIGdkYl90ZXN0ICJwcmludCB1Ynl0ZV9oaWdoIgkJIiA9IDI1NSIKK30KKworcHJvYyB0ZXN0X0lOVCB7fSB7CisgICAgZ2RiX3Rlc3QgInB0eXBlIGludF9sb3ciCQkidHlwZSA9IChJTlR8aW50KSIKKyAgICBnZGJfdGVzdCAid2hhdGlzIGludF9sb3ciCQkidHlwZSA9IChJTlR8aW50KSIKKyAgICBnZGJfdGVzdCAicHJpbnQgaW50X2xvdyIJCSIgPSAtMzI3NjgiCisgICAgZ2RiX3Rlc3QgInB0eXBlIGludF9oaWdoIgkJInR5cGUgPSAoSU5UfGludCkiCisgICAgZ2RiX3Rlc3QgIndoYXRpcyBpbnRfaGlnaCIJCSJ0eXBlID0gKElOVHxpbnQpIgorICAgIGdkYl90ZXN0ICJwcmludCBpbnRfaGlnaCIJCSIgPSAzMjc2NyIKK30KKworcHJvYyB0ZXN0X1VJTlQge30geworICAgIGdkYl90ZXN0ICJwdHlwZSB1aW50X2xvdyIJCSJ0eXBlID0gKFVJTlR8dWludCkiCisgICAgZ2RiX3Rlc3QgIndoYXRpcyB1aW50X2xvdyIJCSJ0eXBlID0gKFVJTlR8dWludCkiCisgICAgZ2RiX3Rlc3QgInByaW50IHVpbnRfbG93IgkJIiA9IDAiCisgICAgZ2RiX3Rlc3QgInB0eXBlIHVpbnRfaGlnaCIJCSJ0eXBlID0gKFVJTlR8dWludCkiCisgICAgZ2RiX3Rlc3QgIndoYXRpcyB1aW50X2hpZ2giCQkidHlwZSA9IChVSU5UfHVpbnQpIgorICAgIGdkYl90ZXN0ICJwcmludCB1aW50X2hpZ2giCQkiID0gNjU1MzUiCit9CisKK3Byb2MgdGVzdF9MT05HIHt9IHsKKyAgICBnZGJfdGVzdCAicHR5cGUgbG9uZ19sb3ciCQkidHlwZSA9IChMT05HfGxvbmcpIgorICAgIGdkYl90ZXN0ICJ3aGF0aXMgbG9uZ19sb3ciCQkidHlwZSA9IChMT05HfGxvbmcpIgorICAgIGdkYl90ZXN0ICJwcmludCBsb25nX2xvdyIJCSIgPSAtMjE0NzQ4MzY0OCIKKyAgICBnZGJfdGVzdCAicHR5cGUgbG9uZ19oaWdoIgkJInR5cGUgPSAoTE9OR3xsb25nKSIKKyAgICBnZGJfdGVzdCAid2hhdGlzIGxvbmdfaGlnaCIJCSJ0eXBlID0gKExPTkd8bG9uZykiCisgICAgZ2RiX3Rlc3QgInByaW50IGxvbmdfaGlnaCIJCSIgPSAyMTQ3NDgzNjQ3IgorfQorCitwcm9jIHRlc3RfVUxPTkcge30geworICAgIGdkYl90ZXN0ICJwdHlwZSB1bG9uZ19sb3ciCQkidHlwZSA9IChVTE9OR3x1bG9uZykiCisgICAgZ2RiX3Rlc3QgIndoYXRpcyB1bG9uZ19sb3ciCQkidHlwZSA9IChVTE9OR3x1bG9uZykiCisgICAgZ2RiX3Rlc3QgInByaW50IHVsb25nX2xvdyIJCSIgPSAwIgorICAgIGdkYl90ZXN0ICJwdHlwZSB1bG9uZ19oaWdoIgkJInR5cGUgPSAoVUxPTkd8dWxvbmcpIgorICAgIGdkYl90ZXN0ICJ3aGF0aXMgdWxvbmdfaGlnaCIJInR5cGUgPSAoVUxPTkd8dWxvbmcpIgorICAgIGdkYl90ZXN0ICJwcmludCB1bG9uZ19oaWdoIgkJIiA9IDQyOTQ5NjcyOTUiCit9CisKK3Byb2MgdGVzdF9SRUFMIHt9IHsKKyAgICBnZGJfdGVzdCAicHR5cGUgcmVhbDEiCQkidHlwZSA9IChGTE9BVHxmbG9hdCkiCisgICAgZ2RiX3Rlc3QgIndoYXRpcyByZWFsMSIJCSJ0eXBlID0gKEZMT0FUfGZsb2F0KSIKKyAgICBnZGJfdGVzdCAicHJpbnQgcmVhbDEiCQkiID0gMy4xNDE1OTI3NCIKK30KKworcHJvYyB0ZXN0X0xPTkdfUkVBTCB7fSB7CisgICAgZ2RiX3Rlc3QgInB0eXBlIGxvbmdfcmVhbDEiCQkidHlwZSA9IChET1VCTEV8ZG91YmxlKSIKKyAgICBnZGJfdGVzdCAid2hhdGlzIGxvbmdfcmVhbDEiCSJ0eXBlID0gKERPVUJMRXxkb3VibGUpIgorICAgIGdkYl90ZXN0ICJwcmludCBsb25nX3JlYWwxIgkJIiA9IDNcXC4xNDAwMDAwMDAwMDAwMDAxZVxcKzMwMCIKK30KKworcHJvYyB0ZXN0X1BPV0VSU0VUIHt9IHsKK30KKworcHJvYyB0ZXN0X2FycmF5cyB7fSB7CisgICAgZ2RiX3Rlc3QgInB0eXBlIGJvb2x0YWJsZTEiCQkidHlwZSA9IEFSUkFZIFxcKCswOjNcXCkrIChCT09MfGJvb2wpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCBib29sdGFibGUxIglcCisJeyA9IFsoMCk6IFRSVUUsICgxOjIpOiBGQUxTRSwgKDMpOiBUUlVFXX0KKworICAgIGdkYl90ZXN0ICJwdHlwZSBib29sdGFibGUyIgkJInR5cGUgPSBBUlJBWSBcXCgrNDo3XFwpKyAoQk9PTHxib29sKSIKKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgYm9vbHRhYmxlMiIgeyA9IFsoNCk6IFRSVUUsICg1OjYpOiBGQUxTRSwgKDcpOiBUUlVFXX0KKworICAgIGdkYl90ZXN0ICJwdHlwZSBjaGFydGFibGUxIgkJInR5cGUgPSBBUlJBWSBcXCgrMDoyXFwpKyAoQ0hBUnxjaGFyKSIKKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgY2hhcnRhYmxlMSIgIHs9IFsoMCk6ICdeKDApJywgKDEpOiAnXigxKScsICgyKTogJ14oMiknXX0KKworICAgIGdkYl90ZXN0ICJwdHlwZSBjaGFydGFibGUyIgkJInR5cGUgPSBBUlJBWSBcXCgrMzo1XFwpKyAoQ0hBUnxjaGFyKSIKKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgY2hhcnRhYmxlMiIJXAorCXs9IFsoMyk6ICdeKDApJywgKDQpOiAnXigxKScsICg1KTogJ14oMiknXX0KKworICAgIGdkYl90ZXN0ICJwdHlwZSBieXRldGFibGUxIgkJInR5cGUgPSBBUlJBWSBcXCgrMDo0XFwpKyAoQllURXxieXRlKSIKKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgYnl0ZXRhYmxlMSIJCVwKKyAgICAgICB7PSBbKDApOiAtMiwgKDEpOiAtMSwgKDIpOiAwLCAoMyk6IDEsICg0KTogMl19CisKKyAgICBnZGJfdGVzdCAicHR5cGUgYnl0ZXRhYmxlMiIJCSJ0eXBlID0gQVJSQVkgXFwoKzU6OVxcKSsgKEJZVEV8Ynl0ZSkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IGJ5dGV0YWJsZTIiCVwKKwl7PSBbKDUpOiAtMiwgKDYpOiAtMSwgKDcpOiAwLCAoOCk6IDEsICg5KTogMl19CisKKyAgICBnZGJfdGVzdCAicHR5cGUgYnl0ZXRhYmxlMyIgXAorCSJ0eXBlID0gQVJSQVkgXFwoMToyXFwpIEFSUkFZIFxcKCdjJzonZCdcXCkgQVJSQVkgXFwoRkFMU0U6VFJVRVxcKSAoQllURXxieXRlKSIKKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgYnl0ZXRhYmxlMyIgXAorICAgIHs9IFsoMSk6IFsoJ2MnKTogWyhGQUxTRSk6IDAsIChUUlVFKTogMV0sICgnZCcpOiBbKEZBTFNFKTogMiwgKFRSVUUpOiAzXV0sICgyKTogWygnYycpOiBbKEZBTFNFKTogNCwgKFRSVUUpOiA1XSwgKCdkJyk6IFsoRkFMU0UpOiA2LCAoVFJVRSk6IDddXV19CisgICAgZ2RiX3Rlc3QgInB0eXBlIGJ5dGV0YWJsZTQiIFwKKwkidHlwZSA9IEFSUkFZIFxcKDE6MlxcKSBBUlJBWSBcXCgnYyc6J2QnXFwpIEFSUkFZIFxcKEZBTFNFOlRSVUVcXCkgKEJZVEV8Ynl0ZSkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IGJ5dGV0YWJsZTQiIFwKKyAgICB7PSBbKDEpOiBbKCdjJyk6IFsoRkFMU0UpOiAwLCAoVFJVRSk6IDFdLCAoJ2QnKTogWyhGQUxTRSk6IDIsIChUUlVFKTogM11dLCAoMik6IFsoJ2MnKTogWyhGQUxTRSk6IDQsIChUUlVFKTogNV0sICgnZCcpOiBbKEZBTFNFKTogNiwgKFRSVUUpOiA3XV1dfQorCisgICAgZ2RiX3Rlc3QgInB0eXBlIHVieXRldGFibGUxIgkidHlwZSA9IEFSUkFZIFxcKCswOjRcXCkrIChVQllURXx1Ynl0ZSkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IHVieXRldGFibGUxIglcCisJez0gWygwKTogMCwgKDEpOiAxLCAoMik6IDIsICgzKTogMywgKDQpOiA0XX0KKworICAgIGdkYl90ZXN0ICJwdHlwZSB1Ynl0ZXRhYmxlMiIJInR5cGUgPSBBUlJBWSBcXCgrNTo5XFwpKyAoVUJZVEV8dWJ5dGUpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCB1Ynl0ZXRhYmxlMiIJXAorCXs9IFsoNSk6IDAsICg2KTogMSwgKDcpOiAyLCAoOCk6IDMsICg5KTogNF19CisKKyAgICBnZGJfdGVzdCAicHR5cGUgaW50dGFibGUxIgkJInR5cGUgPSBBUlJBWSBcXCgrMDo0XFwpKyAoSU5UfGludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IGludHRhYmxlMSIJXAorCXs9IFsoMCk6IC0yLCAoMSk6IC0xLCAoMik6IDAsICgzKTogMSwgKDQpOiAyXX0KKworICAgIGdkYl90ZXN0ICJwdHlwZSBpbnR0YWJsZTIiCQkidHlwZSA9IEFSUkFZIFxcKCs1OjlcXCkrIChJTlR8aW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgaW50dGFibGUyIgkJXAorCXs9IFsoNSk6IC0yLCAoNik6IC0xLCAoNyk6IDAsICg4KTogMSwgKDkpOiAyXX0KKworICAgIGdkYl90ZXN0ICJwdHlwZSB1aW50dGFibGUxIgkJInR5cGUgPSBBUlJBWSBcXCgrMDo0XFwpKyAoVUlOVHx1aW50KSIKKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgdWludHRhYmxlMSIJXAorCXs9IFsoMCk6IDAsICgxKTogMSwgKDIpOiAyLCAoMyk6IDMsICg0KTogNF19CisKKyAgICBnZGJfdGVzdCAicHR5cGUgdWludHRhYmxlMiIJCSJ0eXBlID0gQVJSQVkgXFwoKzU6OVxcKSsgKFVJTlR8dWludCkiCisgICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IHVpbnR0YWJsZTIiCVwKKwl7PSBbKDUpOiAwLCAoNik6IDEsICg3KTogMiwgKDgpOiAzLCAoOSk6IDRdfQorCisgICAgZ2RiX3Rlc3QgInB0eXBlIGxvbmd0YWJsZTEiCQkidHlwZSA9IEFSUkFZIFxcKCswOjRcXCkrIChMT05HfGxvbmcpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCBsb25ndGFibGUxIglcCisJez0gWygwKTogLTIsICgxKTogLTEsICgyKTogMCwgKDMpOiAxLCAoNCk6IDJdfQorCisgICAgZ2RiX3Rlc3QgInB0eXBlIGxvbmd0YWJsZTIiCQkidHlwZSA9IEFSUkFZIFxcKCs1OjlcXCkrIChMT05HfGxvbmcpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCBsb25ndGFibGUyIglcCisJez0gWyg1KTogLTIsICg2KTogLTEsICg3KTogMCwgKDgpOiAxLCAoOSk6IDJdfQorCisgICAgZ2RiX3Rlc3QgInB0eXBlIHVsb25ndGFibGUxIgkidHlwZSA9IEFSUkFZIFxcKCswOjRcXCkrIChVTE9OR3x1bG9uZykiCisgICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IHVsb25ndGFibGUxIglcCisJez0gWygwKTogMCwgKDEpOiAxLCAoMik6IDIsICgzKTogMywgKDQpOiA0XX0KKworICAgIGdkYl90ZXN0ICJwdHlwZSB1bG9uZ3RhYmxlMiIJInR5cGUgPSBBUlJBWSBcXCgrNTo5XFwpKyAoVUxPTkd8dWxvbmcpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCB1bG9uZ3RhYmxlMiIJXAorCXs9IFsoNSk6IDAsICg2KTogMSwgKDcpOiAyLCAoOCk6IDMsICg5KTogNF19CisKKyAgICBnZGJfdGVzdCAicHR5cGUgcmVhbHRhYmxlMSIJCSJ0eXBlID0gQVJSQVkgXFwoKzA6NFxcKSsgKEZMT0FUfGZsb2F0KSIKKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgcmVhbHRhYmxlMSIJXAorCXs9IFsoMCk6IC0yLCAoMSk6IC0xLCAoMik6IDAsICgzKTogMSwgKDQpOiAyXX0KKworICAgIGdkYl90ZXN0ICJwdHlwZSByZWFsdGFibGUyIgkJInR5cGUgPSBBUlJBWSBcXCgrNTo5XFwpKyAoRkxPQVR8ZmxvYXQpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCByZWFsdGFibGUyIglcCisJez0gWyg1KTogLTIsICg2KTogLTEsICg3KTogMCwgKDgpOiAxLCAoOSk6IDJdfQorCisgICAgZ2RiX3Rlc3QgInB0eXBlIGxvbmdyZWFsdGFibGUxIgkidHlwZSA9IEFSUkFZIFxcKCswOjRcXCkrIChET1VCTEV8ZG91YmxlKSIKKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgbG9uZ3JlYWx0YWJsZTEiIFwKKwl7PSBbKDApOiAtMiwgKDEpOiAtMSwgKDIpOiAwLCAoMyk6IDEsICg0KTogMl19CisKKyAgICBnZGJfdGVzdCAicHR5cGUgbG9uZ3JlYWx0YWJsZTIiCSJ0eXBlID0gQVJSQVkgXFwoKzU6OVxcKSsgKERPVUJMRXxkb3VibGUpIgorICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCBsb25ncmVhbHRhYmxlMiIJXAorCXs9IFsoNSk6IC0yLCAoNik6IC0xLCAoNyk6IDAsICg4KTogMSwgKDkpOiAyXX0KKworICAgIGdkYl90ZXN0ICJwcmludCBsZW5ndGgobG9uZ3JlYWx0YWJsZTIpIiB7PSA1fQorICAgIGdkYl90ZXN0ICJwcmludCBsb3dlcihsb25ncmVhbHRhYmxlMikiIHs9IDV9CisgICAgZ2RiX3Rlc3QgInByaW50IHVwcGVyKGxvbmdyZWFsdGFibGUyKSIgez0gOX0KK30KKworcHJvYyB0ZXN0X3N0cmluZ3Mge30geworCisgICAgZ2RiX3Rlc3QgInB0eXBlIHN0cmluZzEiCQkidHlwZSA9IENIQVJTIFxbKFxdNFxbKVxdKyIKKyAgICBnZGJfdGVzdCAicHJpbnQgc3RyaW5nMSIJCSIgPSBcImFiY2RcIiIKKworICAgIGdkYl90ZXN0ICJwdHlwZSBzdHJpbmcyIgkJInR5cGUgPSBDSEFSUyBcWyhcXSs1XFspXF0rIgorICAgIGdkYl90ZXN0ICJwcmludCBzdHJpbmcyIgkJeyA9IFwiZWZcXlwoMFwpZ2hcIn0KKworICAgIGdkYl90ZXN0ICJwdHlwZSBzdHJpbmczIgkJInR5cGUgPSBDSEFSUyBcWyhcXSs2XFspXF0rIgorICAgIGdkYl90ZXN0ICJwcmludCBzdHJpbmczIgkJIiA9IFwiZWZnaGlqXCIiCisKKyAgICBnZGJfdGVzdCAicHR5cGUgc3RyaW5nNCIJCSJ0eXBlID0gQ0hBUlMgXFsoXF0rN1xbKVxdKyIKKyAgICBnZGJfdGVzdCAicHJpbnQgc3RyaW5nNCIJCXsgPSBcInp6enp6elxeXCgwXClcIn0KKworICAgICMgVGhlc2UgdGVzdHMgcmVxdWlyZSBhIHJ1bm5pbmcgcHJvY2Vzcywgc28gcnVuIHRvIG9uZSBvZiB0aGUgcHJvY3MKKyAgICAjIGFuZCB0aGVuIGRvIHRoZSB0ZXN0cy4KKworICAgIGlmIFtydW50byBzY2FsYXJfYXJpdGhtZXRpY10gdGhlbiB7CisJZ2RiX3Rlc3QgInB0eXBlIHN0cmluZzEvL3N0cmluZzIiCSJ0eXBlID0gQ0hBUlMgXFwoOVxcKSIKKwlnZGJfdGVzdCAicHJpbnQgc3RyaW5nMS8vc3RyaW5nMiIgICAgeyA9IFwiYWJjZGVmXF5cKDBcKWdoXCJ9CisJZ2RiX3Rlc3RfZXhhY3Qge3B0eXBlICJhIGNoaWxsIHN0cmluZyJ9IHt0eXBlID0gQ0hBUlMgKDE0KX0KKwlnZGJfdGVzdCAicHJpbnQgJ2EgY2hpbGwgc3RyaW5nJyIJIiA9IFwiYSBjaGlsbCBzdHJpbmdcIiIKKwlnZGJfdGVzdCAicHJpbnQgXCJlZlwiLy9jJzAwJy8vXCJnaFwiIgl7ID0gXCJlZlxeXCgwXClnaFwifQorCWdkYl90ZXN0ICJwcmludCBzdHJpbmcxIC8vIFwiZWZnaFwiIgkiID0gXCJhYmNkZWZnaFwiIgorCWdkYl90ZXN0ICJwcmludCAoNikgJ3onIgkJIiA9IFwienp6enp6XCIiCisJZ2RiX3Rlc3QgInB0eXBlICg2KSAneiciCQkidHlwZSA9IENIQVJTIFxbKFxdKzZcWylcXSsiCisJZ2RiX3Rlc3QgInByaW50ICgxKzIqMykgJ3gnIgkJIiA9IFwieHh4eHh4eFwiIgorCWdkYl90ZXN0ICJwdHlwZSAoMSsyKjMpICd4JyIJCSJ0eXBlID0gQ0hBUlMgXFsoXF0rN1xbKVxdKyIKKyAgICB9CisKK30KKworcHJvYyB0ZXN0X3N0cnVjdHMge30geworICAgIGdkYl90ZXN0ICJwdHlwZSBzdHJ1Y3QxIiBcCisJInR5cGUgPSBTVFJVQ1QgXFwoKy4qYWJvb2wgKEJPT0x8Ym9vbCksLiphaW50IChJTlR8aW50KSwuKmFzdHJpbmcgQ0hBUlMgXFwoKzhcXCkrLipcXCkrIgorICAgIGdkYl90ZXN0ICJwcmludCBzdHJ1Y3QxIiBcCisJIi4qID0gXFxcW1wuYWJvb2w6IFRSVUUsIFwuYWludDogMTIzLCBcLmFzdHJpbmc6IFwiYSBzdHJpbmdcIlxcXF0iCisgICAgZ2RiX3Rlc3QgInB0eXBlIHN0cnVjdDIiIFwKKwkidHlwZSA9IFNUUlVDVCBcXCgrLiphYm9vbCAoQk9PTHxib29sKSwuKm5zdHJ1Y3Qgc2ltcGxlX3N0cnVjdCwuKmFpbnQgKElOVHxpbnQpLipcXCkrIgorICAgIGdkYl90ZXN0ICJwcmludCBzdHJ1Y3QyIiBcCisJIi4qID0gXFxcWy5hYm9vbDogVFJVRSwgXC5uc3RydWN0OiBcXFxbXC5hYm9vbDogRkFMU0UsIFwuYWludDogNDU2LCBcLmFzdHJpbmc6IFwiZGVhZGJlZWZcIlxcXF0sIFwuYWludDogNzg5XFxcXSIKK30KKworcHJvYyB0ZXN0X3B0ciB7fSB7CisgICAgIyBUaGlzIGlzIHRvIHRlc3QgQ3lnbnVzIFBSIDY5MzIKKyAgICBnZGJfdGVzdCAicHJpbnQgeHB0ci0+aW50IiAiLiogPSAzMjc2NyIKK30KKworZG9fdGVzdHMKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2NvbmZpZ3VyZSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNGU0MjlkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvY29uZmlndXJlCkBAIC0wLDAgKzEsODk5IEBACisjISAvYmluL3NoCisKKyMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEgCisjIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworIyBEZWZhdWx0czoKK2FjX2hlbHA9CithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCisjIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46CisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCisgICAgZXhpdCAwIDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Li9jb25maWcubG9nCisKK2VjaG8gIlwKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorIiAxPiY1CisKKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCithY19jb25maWd1cmVfYXJncz0KK2ZvciBhY19hcmcKK2RvCisgIGNhc2UgIiRhY19hcmciIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBlc2FjCitkb25lCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKyMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCisjIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCitpZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID4gY29uZmRlZnMuaAorCisjIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0CisjIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorYWNfdW5pcXVlX2ZpbGU9Y2hleHAuZXhwCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19wcm9nPSQwCisgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCisKKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgLiAkY2FjaGVfZmlsZQorZWxzZQorICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgPiAkY2FjaGVfZmlsZQorZmkKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworCisKK0NDPSR7Q0MtY2N9CisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTczOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKKworaG9zdF9hbGlhcz0kaG9zdAorY2FzZSAiJGhvc3RfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkKKyAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6CisgICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkgOzsKKyAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCitob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkaG9zdCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU5NDogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKwordGFyZ2V0X2FsaWFzPSR0YXJnZXQKK2Nhc2UgIiR0YXJnZXRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKwordGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAordGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK3RhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCit0YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjEyOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIERFRlMuCisjIFByb3RlY3QgYWdhaW5zdCBzaGVsbCBleHBhbnNpb24gd2hpbGUgZXhlY3V0aW5nIE1ha2VmaWxlIHJ1bGVzLgorIyBQcm90ZWN0IGFnYWluc3QgTWFrZWZpbGUgbWFjcm8gZXhwYW5zaW9uLgorY2F0ID4gY29uZnRlc3QuZGVmcyA8PFxFT0YKK3MlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJS1EXDE9XDIlZworcyVbIAlgfiMkXiYqKCl7fVxcfDsnIjw+P10lXFwmJWcKK3MlXFslXFwmJWcKK3MlXF0lXFwmJWcKK3MlXCQlJCQlZworRU9GCitERUZTPWBzZWQgLWYgY29uZnRlc3QuZGVmcyBjb25mZGVmcy5oIHwgdHIgJ1wwMTInICcgJ2AKK3JtIC1mIGNvbmZ0ZXN0LmRlZnMKKworCisjIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKworZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUworcm0gLWYgJENPTkZJR19TVEFUVVMKK2NhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisjISAvYmluL3NoCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAorIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMKKyMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCisjCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKK2ZvciBhY19vcHRpb24KK2RvCisgIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCisgICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQorICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSIKKyAgICBleGl0IDAgOzsKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCisgICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7CisgIGVzYWMKK2RvbmUKKworYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KK3NlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Cisgcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKKyRhY192cHN1YgorJGV4dHJhc3ViCitzJUBTSEVMTEAlJFNIRUxMJWcKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBDQ0AlJENDJWcKK3MlQGhvc3RAJSRob3N0JWcKK3MlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKK3MlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCitzJUBob3N0X29zQCUkaG9zdF9vcyVnCitzJUB0YXJnZXRAJSR0YXJnZXQlZworcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKK3MlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKK3MlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKK3MlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCitzJUBidWlsZEAlJGJ1aWxkJWcKK3MlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZworcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKK3MlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCitzJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9jb25maWd1cmUuaW4gYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VlZDAyNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDExIEBACitkbmwgUHJvY2VzcyB0aGlzIGZpbGUgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorCitBQ19QUkVSRVEoMi41KQorQUNfSU5JVChjaGV4cC5leHApCisKK0NDPSR7Q0MtY2N9CitBQ19TVUJTVChDQykKK0FDX0NPTkZJR19BVVhfRElSKGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4pCitBQ19DQU5PTklDQUxfU1lTVEVNCisKK0FDX09VVFBVVChNYWtlZmlsZSkKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2VudW0uY2ggYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9lbnVtLmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MWZjOTQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9lbnVtLmNoCkBAIC0wLDAgKzEsOSBAQAoraHVnbzogbW9kdWxlCisKKyAgc3lubW9kZSBtX3NldCA9IHNldCAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSk7CisgIGRjbCB4IGxvbmc7CisgIGRjbCB5IG1fc2V0OworCisgIHdyaXRldGV4dCAoc3Rkb3V0LCAiZG9uZS4lLyIpOworCitlbmQgaHVnbzsKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2VudW0uZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvZW51bS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRmZWUzNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2VudW0uZXhwCkBAIC0wLDAgKzEsODUgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBXaWxmcmllZCBNb3NlciAobW9zZXJAYXV0LmFsY2F0ZWwuYXQKKyMKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK2lmIFtza2lwX2NoaWxsX3Rlc3RzXSB0aGVuIHsgY29udGludWUgfQorCitzZXQgdGVzdGZpbGUgImVudW0iCitzZXQgc3JjZmlsZSAke3NyY2Rpcn0vJHN1YmRpci8ke3Rlc3RmaWxlfS5jaAorc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5leGUKK2lmICB7IFtjb21waWxlICIke3NyY2ZpbGV9IC1nIC1vICR7YmluZmlsZX0gJHtDSElMTF9SVDB9ICR7Q0hJTExfTElCfSJdICE9ICIiIH0geworICAgIHBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3NyY2ZpbGV9IgorICAgIHJldHVybiAtMQorfQorCisjIFNldCB0aGUgY3VycmVudCBsYW5ndWFnZSB0byBjaGlsbC4gIFRoaXMgY291bnRzIGFzIGEgdGVzdC4gIElmIGl0CisjIGZhaWxzLCB0aGVuIHdlIHNraXAgdGhlIG90aGVyIHRlc3RzLgorCitwcm9jIHNldF9sYW5nX2NoaWxsIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBiaW5maWxlIG9iamRpciBzdWJkaXIKKworICAgIHZlcmJvc2UgImxvYWRpbmcgZmlsZSAnJGJpbmZpbGUnIgorICAgIGdkYl9sb2FkICRiaW5maWxlCisKKyAgICBzZW5kX2dkYiAic2V0IGxhbmd1YWdlIGNoaWxsXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9CisJdGltZW91dCB7IGZhaWwgInNldCBsYW5ndWFnZSBjaGlsbCAodGltZW91dCkiIDsgcmV0dXJuIDAgfQorICAgIH0KKworICAgIHJldHVybiBbZ2RiX3Rlc3QgInNob3cgbGFuZ3VhZ2UiICIuKiBzb3VyY2UgbGFuZ3VhZ2UgaXMgXCJjaGlsbFwiLioiIFwKKwkic2V0IGxhbmd1YWdlIHRvIFwiY2hpbGxcIiJdCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCitnZGJfdGVzdCAic2V0IHByaW50IHNldmVuYml0LXN0cmluZ3MiICIuKiIKKworaWYgIVtzZXRfbGFuZ19jaGlsbF0gdGhlbiB7CisgICAgcnVudG8gaHVnb18KKworICAgIHNlbmRfZ2RiICJzZXQgdmFyIFwkaSA6PSBkXG4iCisgICAgZ2RiX2V4cGVjdCAtcmUgIi4qJGdkYl9wcm9tcHQgJCIKKyAgICBnZGJfdGVzdCAicHJpbnQgXCRpIiB7ID0gZH0KKyAgICBnZGJfdGVzdCAicHJpbnQgc2l6ZSAoXCRpKSIgeyA9IDF9CisgICAgZ2RiX3Rlc3QgInByaW50IGIrYyIgeyA9IDN9CisgICAgZ2RiX3Rlc3QgInByaW50IGMqZCIgeyA9IDZ9CisgICAgZ2RiX3Rlc3QgInByaW50IGE8YiIgeyA9IFRSVUV9CisgICAgZ2RiX3Rlc3QgInByaW50IGE9YiIgeyA9IEZBTFNFfQorICAgIGdkYl90ZXN0ICJwcmludCBhPWEiIHsgPSBUUlVFfQorICAgIGdkYl90ZXN0ICJwcmludCBhLz1cJGkiIHsgPSBUUlVFfQorCisjIFRoaXMgaXMgUFIgODg3MAorICAgIGdkYl90ZXN0ICJicmVhayBtYWxsb2MiICIuKiIKKyAgICBnZGJfdGVzdCB7c2V0IHZhciAkaiA6PSBtX3NldFtiXX0gIi4qaW52YWxpZC4qdHVwbGUuKiIKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2V4dHN0cnVjdC1ncnQuY2ggYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9leHRzdHJ1Y3QtZ3J0LmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZDBkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9leHRzdHJ1Y3QtZ3J0LmNoCkBAIC0wLDAgKzEsMTIgQEAKK3BvdDE6IE1PRFVMRQorCitTWU5NT0RFIG1fYXJyYXkxID0gQVJSQVkgKDI6MykgdWxvbmc7CitTWU5NT0RFIG1fc3RydWN0ID0gU1RSVUNUIChmMSBpbnQsCisJCQkgICBmMiBSRUYgbV9hcnJheTEsCisJCQkgICBmMyBtX2FycmF5MSk7CitTWU5NT0RFIG1fYXJyYXkzID0gQVJSQVkgKDU6NikgbV9zdHJ1Y3Q7CitTWU5NT0RFIG1fYXJyYXk0ID0gQVJSQVkgKDc6OCkgQVJSQVkgKDk6MTApIG1fc3RydWN0OworCitHUkFOVCBhbGw7CisKK0VORCBwb3QxOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvZXh0c3RydWN0LmNoIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvZXh0c3RydWN0LmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OWY2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9leHRzdHJ1Y3QuY2gKQEAgLTAsMCArMSwxNiBAQAorcG90dGVuZG86IE1PRFVMRQorCis8PiBVU0VfU0VJWkVfRklMRSAiZXh0c3RydWN0LWdydC5ncnQiIDw+CitTRUlaRSBtX2FycmF5MzsKK1NFSVpFIG1fYXJyYXk0OworCitTWU5NT0RFIG1feCA9IFNUUlVDVCAoaSBsb25nLAorCQkgICAgICBhciBtX2FycmF5Myk7CitTWU5NT0RFIG1feSA9IFNUUlVDVCAoaSBsb25nLAorCQkgICAgICBhciBtX2FycmF5NCk7CisKK0RDTCB4IExPTkc7CisKK3ggOj0gMTA7CisKK0VORCBwb3R0ZW5kbzsKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2V4dHN0cnVjdC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9leHRzdHJ1Y3QuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDYxY2IKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9leHRzdHJ1Y3QuZXhwCkBAIC0wLDAgKzEsNjYgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBQZXIgQm90aG5lci4gKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK2lmIFtza2lwX2NoaWxsX3Rlc3RzXSB0aGVuIHsgY29udGludWUgfQorCitzZXQgdGVzdGZpbGUyICJleHRzdHJ1Y3QtZ3J0Igorc2V0IHNyY2ZpbGUyICR7c3JjZGlyfS8kc3ViZGlyLyR7dGVzdGZpbGUyfS5jaAorc2V0IG9iamZpbGUyICR7b2JqZGlyfS8kc3ViZGlyLyR7dGVzdGZpbGUyfS5vCitpZiAgeyBbY29tcGlsZSAiJHtzcmNmaWxlMn0gLWcgLWMgLW8gJHtvYmpmaWxlMn0iXSAhPSAiIiB9IHsKKyAgICBwZXJyb3IgIkNvdWxkbid0IGNvbXBpbGUgJHtzcmNmaWxlMn0iCisgICAgcmV0dXJuIC0xCit9CisKK3NldCB0ZXN0ZmlsZSAiZXh0c3RydWN0Igorc2V0IHNyY2ZpbGUgJHtzcmNkaXJ9LyRzdWJkaXIvJHt0ZXN0ZmlsZX0uY2gKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0uZXhlCitpZiAgeyBbY29tcGlsZSAiJHtzcmNmaWxlfSAtZyAke29iamZpbGUyfSAtbyAke2JpbmZpbGV9ICR7Q0hJTExfUlQwfSAke0NISUxMX0xJQn0iXSAhPSAiIiB9IHsKKyAgICBwZXJyb3IgIkNvdWxkbid0IGNvbXBpbGUgJHtzcmNmaWxlfSIKKyAgICByZXR1cm4gLTEKK30KKworcHJvYyBkb190ZXN0cyB7fSB7CisgICAgZ2xvYmFsIHBybXNfaWQgYnVnX2lkIHN1YmRpciBvYmpkaXIgc3JjZGlyIGJpbmZpbGUgZ2RiX3Byb21wdAorCisgICAgc2V0IHBybXNfaWQgMAorICAgIHNldCBidWdfaWQgMAorCisgICAgIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKyAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKyAgICBnZGJfbG9hZCAkYmluZmlsZQorCisgICAgZ2RiX3Rlc3QgInNldCBsYW5ndWFnZSBjaGlsbCIgIiIKKworICAgIGdkYl90ZXN0ICJzZXQgdmFyIFwkaSA6PSBtX3hcW1xdIiAiIgorICAgIGdkYl90ZXN0ICJwcmludCBcJGkiIHsgPSBcWy5pOiAwLCAuYXI6IFxbXCg1OjZcKTogXFsuZjE6IDAsIC5mMjogTlVMTCwgLmYzOiBcW1woMjozXCk6IDBcXVxdXF1cXX0KKworICAgIGdkYl90ZXN0ICJzZXQgdmFyIFwkaiA6PSBtX3lcW1xdIiAiIgorICAgIGdkYl90ZXN0ICJwcmludCBcJGoiIHsgPSBcWy5pOiAwLCAuYXI6IFxbXCg3OjhcKTogXFtcKDk6MTBcKTogXFsuZjE6IDAsIC5mMjogTlVMTCwgLmYzOiBcW1woMjozXCk6IDBcXVxdXF1cXVxdfQorfQorCitkb190ZXN0cwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvZnVuYzEuY2ggYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9mdW5jMS5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGQyOGNlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvZnVuYzEuY2gKQEAgLTAsMCArMSw5IEBACitmdW5jMTogTU9EVUxFCisKK1NZTk1PREUgbV9zZXQgPSBTRVQgKGUxLCBlMiwgZTMsIGU0LCBlNSwgZTYsIGU3LCBlOCwgZTksIGUxMCk7CitTWU5NT0RFIG1fc2V0cmFuZ2UgPSBSQU5HRSAoZTM6ZTgpOworU1lOTU9ERSBtX3BzID0gUE9XRVJTRVQgbV9zZXQ7CitTWU5NT0RFIG1fcmFuZ2VwcyA9IFBPV0VSU0VUIFJBTkdFKDA6MzEpOworR1JBTlQgQUxMOworCitFTkQgZnVuYzE7CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9nY2gxMDQxLmNoIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvZ2NoMTA0MS5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWNlODBiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvZ2NoMTA0MS5jaApAQCAtMCwwICsxLDE3IEBACithcnI6IE1PRFVMRQorCitTWU5NT0RFIG1fY2hhcnMgPSBDSEFSUygzMCkgVkFSWUlORzsKK1NZTk1PREUgbV9zID0gU1RSVUNUIChsIExPTkcsIGMgbV9jaGFycywgYiBCT09MKTsKKworRENMIGExIEFSUkFZICgxOjEwMDApIExPTkcgSU5JVCA6PSBbKDU6MTAwKTogMzMsICgxOjQpOiA0NCwgKEVMU0UpOiA1NSBdOworRENMIGEyIEFSUkFZICgxOjEwKSBtX3MgSU5JVCA6PSBbKCopOiBbIDIyLCAibW93aSIsIFRSVUUgXSBdOworRENMIGEzIEFSUkFZIChDSEFSKSBDSEFSIElOSVQgOj0gWygqKTogJ1gnXTsKKworU1lOTU9ERSBtX3NldCA9IFNFVCAoZTEsIGUyLCBlMywgZTQsIGU1LCBlNiwgZTcsIGU5LCBlMTApOworRENMIGE0IEFSUkFZIChtX3NldCkgQk9PTCBJTklUIDo9IFsoKik6IFRSVUVdOworCithMSA6PSBbKDU6MTAwKTogMzMsICgxOjQpOiA0NCwgKEVMU0UpOiA1NSBdOworYTEgOj0gWyAoKik6IDIyIF07CithMiA6PSBbKCopOiBbIDIyLCAibW93aSIsIFRSVUUgXSBdOworCitFTkQgYXJyOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvZ2NoMTA0MS5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9nY2gxMDQxLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2VjMGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvZ2NoMTA0MS5leHAKQEAgLTAsMCArMSw3NiBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEZyZWQgRmlzaC4gKGZuZkBjeWdudXMuY29tKQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgTWFydGluIFBvdHRlbmRvcmZlciAocG90dGVuZG9AYXV0LmFsY2F0ZWwuYXQpCisjCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitpZiBbc2tpcF9jaGlsbF90ZXN0c10gdGhlbiB7IGNvbnRpbnVlIH0KKworc2V0IHRlc3RmaWxlICJnY2gxMDQxIgorc2V0IHNyY2ZpbGUgJHtzcmNkaXJ9LyRzdWJkaXIvJHt0ZXN0ZmlsZX0uY2gKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0uZXhlCitpZiAgeyBbY29tcGlsZSAiJHtzcmNmaWxlfSAtZyAtbyAke2JpbmZpbGV9ICR7Q0hJTExfUlQwfSAke0NISUxMX0xJQn0iXSAhPSAiIiB9IHsKKyAgICBwZXJyb3IgIkNvdWxkbid0IGNvbXBpbGUgJHtzcmNmaWxlfSIKKyAgICByZXR1cm4gLTEKK30KKworIyBTZXQgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgdG8gY2hpbGwuICBUaGlzIGNvdW50cyBhcyBhIHRlc3QuICBJZiBpdAorIyBmYWlscywgdGhlbiB3ZSBza2lwIHRoZSBvdGhlciB0ZXN0cy4KKworcHJvYyBzZXRfbGFuZ19jaGlsbCB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgYmluZmlsZSBvYmpkaXIgc3ViZGlyCisKKyAgICB2ZXJib3NlICJsb2FkaW5nIGZpbGUgJyRiaW5maWxlJyIKKyAgICBnZGJfbG9hZCAkYmluZmlsZQorCisgICAgc2VuZF9nZGIgInNldCBsYW5ndWFnZSBjaGlsbFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorCXRpbWVvdXQgeyBmYWlsICJzZXQgbGFuZ3VhZ2UgY2hpbGwgKHRpbWVvdXQpIiA7IHJldHVybiAwIH0KKyAgICB9CisKKyAgICByZXR1cm4gW2dkYl90ZXN0ICJzaG93IGxhbmd1YWdlIiAiLiogc291cmNlIGxhbmd1YWdlIGlzIFwiY2hpbGxcIi4qIiBcCisJInNldCBsYW5ndWFnZSB0byBcImNoaWxsXCIiXQorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKworZ2RiX3Rlc3QgInNldCBwcmludCBzZXZlbmJpdC1zdHJpbmdzIiAiLioiCisKK2lmICFbc2V0X2xhbmdfY2hpbGxdIHRoZW4geworICAgIHJ1bnRvIGFycl8KKyAgICAjIGNoZWNrIGlmIGFycmF5IHNsaWNlcyBwcmludCBjb3JyZWN0IGluZGV4CisgICAgZ2RiX3Rlc3Qge3ByaW50IGExKDEwOjMwKX0geyA9IFxbXCgxMDozMFwpOiAzM1xdfQorICAgIGdkYl90ZXN0IHtwcmludCBhMigzOjUpfSB7ID0gXFtcKDM6NVwpOiBcWy5sOiAyMiwgLmM6ICJtb3dpIiwgLmI6IFRSVUVcXVxdfQorICAgIGdkYl90ZXN0IHtwcmludCBhMygnYSc6J2MnKX0geyA9IFxbXCgnYSc6J2MnXCk6ICdYJ1xdfQorICAgIGdkYl90ZXN0IHtwcmludCBhNChlMjplNSl9IHsgPSBcW1woZTI6ZTVcKTogVFJVRVxdfQorfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvZ2NoMTI3Mi5jaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2djaDEyNzIuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExMmQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2djaDEyNzIuY2gKQEAgLTAsMCArMSwyMSBAQAorZ2NoMTI3MjogTU9EVUxFCisKK1NZTk1PREUgbV9hcnJheSA9IEFSUkFZICgwOjk5KSBJTlQ7CitEQ0wgZm9vIG1fYXJyYXk7CisKK1NZTk1PREUgbV94eHggPSBBUlJBWSAoMToxMCkgTE9ORzsKKworU1lOTU9ERSBtX3N0cnVjdCA9IFNUUlVDVCAoaSBMT05HLCBiIEJPT0wpOworU1lOTU9ERSBtX2JhciA9IEFSUkFZICgtMTA6MjApIG1fc3RydWN0OworRENMIGJhciBtX2JhcjsKKworU1lOTU9ERSBtX3BzID0gUE9XRVJTRVQgTE9ORyAoMDoyMCk7CisKK2JycnI6IFBST0MgKCkKK0VORDsKKworZm9vIDo9IFsgKCopOiAyMjIgXTsKKworYnJyciAoKTsKKworRU5EIGdjaDEyNzI7CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9nY2gxMjcyLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2djaDEyNzIuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNjA3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9nY2gxMjcyLmV4cApAQCAtMCwwICsxLDg2IEBACisjIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgV2lsZnJpZWQgTW9zZXIgKG1vc2VyQGF1dC5hbGNhdGVsLmF0KQorIworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKK2lmIFtza2lwX2NoaWxsX3Rlc3RzXSB0aGVuIHsgY29udGludWUgfQorCitzZXQgdGVzdGZpbGUgImdjaDEyNzIiCitzZXQgc3JjZmlsZSAke3NyY2Rpcn0vJHN1YmRpci8ke3Rlc3RmaWxlfS5jaAorc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5leGUKK2lmICB7IFtjb21waWxlICIke3NyY2ZpbGV9IC1nIC1vICR7YmluZmlsZX0gJHtDSElMTF9SVDB9ICR7Q0hJTExfTElCfSJdICE9ICIiIH0geworICAgIHBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3NyY2ZpbGV9IgorICAgIHJldHVybiAtMQorfQorCisjIFNldCB0aGUgY3VycmVudCBsYW5ndWFnZSB0byBjaGlsbC4gIFRoaXMgY291bnRzIGFzIGEgdGVzdC4gIElmIGl0CisjIGZhaWxzLCB0aGVuIHdlIHNraXAgdGhlIG90aGVyIHRlc3RzLgorCitwcm9jIHNldF9sYW5nX2NoaWxsIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBiaW5maWxlIG9iamRpciBzdWJkaXIKKworICAgIHZlcmJvc2UgImxvYWRpbmcgZmlsZSAnJGJpbmZpbGUnIgorICAgIGdkYl9sb2FkICRiaW5maWxlCisKKyAgICBzZW5kX2dkYiAic2V0IGxhbmd1YWdlIGNoaWxsXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorICAgICAgICB0aW1lb3V0IHsgZmFpbCAic2V0IGxhbmd1YWdlIGNoaWxsICh0aW1lb3V0KSIgOyByZXR1cm4gMCB9CisgICAgfQorCisgICAgcmV0dXJuIFtnZGJfdGVzdCAic2hvdyBsYW5ndWFnZSIgIi4qIHNvdXJjZSBsYW5ndWFnZSBpcyBcImNoaWxsXCIuKiIgXAorICAgICAgICAic2V0IGxhbmd1YWdlIHRvIFwiY2hpbGxcIiJdCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCitnZGJfdGVzdCAic2V0IHByaW50IHNldmVuYml0LXN0cmluZ3MiICIuKiIKKworaWYgIVtzZXRfbGFuZ19jaGlsbF0gdGhlbiB7CisgICAgcnVudG8gYnJycgorCisgICAgIyBjaGVjayBmb28KKyAgICBnZGJfdGVzdCB7cHJpbnQgZm9vfSB7ID0gXFtcKDA6OTlcKTogMjIyXF19CisgICAgZ2RiX3Rlc3QgInNldCB2YXIgZm9vIDo9IG1fYXJyYXlcW1woXCpcKTo0NFxdIiAiLioiCisgICAgZ2RiX3Rlc3Qge3ByaW50IGZvb30geyA9IFxbXCgwOjk5XCk6IDQ0XF19CisKKyAgICAjIGNoZWNrIGJhcgorICAgIGdkYl90ZXN0IHtwcmludCBiYXJ9IHsgPSBcW1woLTEwOjIwXCk6IFxbLmk6IDAsIC5iOiBGQUxTRVxdXF19CisgICAgZ2RiX3Rlc3QgInNldCB2YXIgYmFyIDo9IG1fYmFyXFtcKFwqXCk6IFxbNDIsIFRSVUVcXVxdIiAiLioiCisgICAgZ2RiX3Rlc3Qge3ByaW50IGJhcn0geyA9IFxbXCgtMTA6MjBcKTogXFsuaTogNDIsIC5iOiBUUlVFXF1cXX0KKworICAgICMgc29tZSBmYWlsdWVzCisgICAgZ2RiX3Rlc3QgInNldCB2YXIgZm9vIDo9IFxbXChcKlwpOjQ0XF0iIHtcKFwqXCkgb25seSBwb3NzaWJsZSB3aXRoIG1vZGVuYW1lIGluIGZyb250IG9mIHR1cGxlIFwobW9kZVxbXC5cLlxdXCl9CisgICAgZ2RiX3Rlc3QgInNldCB2YXIgZm9vIDo9IG1feHh4XFtcKFwqXCk6NDRcXSIge0ludmFsaWQgY2FzdFwufQorICAgIGdkYl90ZXN0ICJzZXQgdmFyIGZvbyA6PSBtX3N0cnVjdFxbXChcKlwpOjQ0XF0iIHtcKFwqXCkgaW4gaW52YWxpZCBjb250ZXh0fQorICAgIGdkYl90ZXN0ICJzZXQgdmFyIGZvbyA6PSBtX3BzXFtcKFwqXCk6NDRcXSIge1woXCpcKSBpbiBpbnZhbGlkIGNvbnRleHR9Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9nY2gxMjgwLmNoIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvZ2NoMTI4MC5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmJhNzFmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvZ2NoMTI4MC5jaApAQCAtMCwwICsxLDEzIEBACitnY2gxMjgwOiBNT0RVTEUKKworU1lOTU9ERSBtX3ggPSBBUlJBWSAoMTozKSBMT05HOworRENMIHZfeCBtX3g7CitEQ0wgdl94eCBtX3g7CisKK2RvaXQ6IFBST0MgKCkKK0VORCBkb2l0OworCit2X3ggOj0gWyAxMSwgMTIsIDEzIF07Citkb2l0ICgpOworCitFTkQgZ2NoMTI4MDsKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2djaDEyODAuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvZ2NoMTI4MC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2NjI1ZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2djaDEyODAuZXhwCkBAIC0wLDAgKzEsNzYgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBXaWxmcmllZCBNb3NlciAobW9zZXJAYXV0LmFsY2F0ZWwuYXQpCisjCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgICAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworaWYgW3NraXBfY2hpbGxfdGVzdHNdIHRoZW4geyBjb250aW51ZSB9CisKK3NldCB0ZXN0ZmlsZSAiZ2NoMTI4MCIKK3NldCBzcmNmaWxlICR7c3JjZGlyfS8kc3ViZGlyLyR7dGVzdGZpbGV9LmNoCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LmV4ZQoraWYgIHsgW2NvbXBpbGUgIiR7c3JjZmlsZX0gLWcgLW8gJHtiaW5maWxlfSAke0NISUxMX1JUMH0gJHtDSElMTF9MSUJ9Il0gIT0gIiIgfSB7CisgICAgcGVycm9yICJDb3VsZG4ndCBjb21waWxlICR7c3JjZmlsZX0iCisgICAgcmV0dXJuIC0xCit9CisKKyMgU2V0IHRoZSBjdXJyZW50IGxhbmd1YWdlIHRvIGNoaWxsLiAgVGhpcyBjb3VudHMgYXMgYSB0ZXN0LiAgSWYgaXQKKyMgZmFpbHMsIHRoZW4gd2Ugc2tpcCB0aGUgb3RoZXIgdGVzdHMuCisKK3Byb2Mgc2V0X2xhbmdfY2hpbGwge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGJpbmZpbGUgb2JqZGlyIHN1YmRpcgorCisgICAgdmVyYm9zZSAibG9hZGluZyBmaWxlICckYmluZmlsZSciCisgICAgZ2RiX2xvYWQgJGJpbmZpbGUKKworICAgIHNlbmRfZ2RiICJzZXQgbGFuZ3VhZ2UgY2hpbGxcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9CisgICAgICAgIHRpbWVvdXQgeyBmYWlsICJzZXQgbGFuZ3VhZ2UgY2hpbGwgKHRpbWVvdXQpIiA7IHJldHVybiAwIH0KKyAgICB9CisKKyAgICByZXR1cm4gW2dkYl90ZXN0ICJzaG93IGxhbmd1YWdlIiAiLiogc291cmNlIGxhbmd1YWdlIGlzIFwiY2hpbGxcIi4qIiBcCisgICAgICAgICJzZXQgbGFuZ3VhZ2UgdG8gXCJjaGlsbFwiIl0KK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisKK2dkYl90ZXN0ICJzZXQgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncyIgIi4qIgorCitpZiAhW3NldF9sYW5nX2NoaWxsXSB0aGVuIHsKKyAgICBydW50byBkb2l0CisgICAgZ2RiX3Rlc3QgIm5leHQiICIiCisgICAgIyBjaGVjayB0b28gbWFueSBhcnJheSBlbGVtZW50cworICAgIGdkYl90ZXN0IHtzZXQgdmFyIHZfeCA6PSBbMSwyLDMsNCw1XX0ge1RvbyBtYW55IGFycmF5IGVsZW1lbnRzfQorICAgIGdkYl90ZXN0IHtzZXQgdmFyICRpIDo9IG1feFsoMyk6IDIyLCAyNV19IHtUb28gbWFueSBhcnJheSBlbGVtZW50c30KKyAgICBnZGJfdGVzdCAic2V0IHZhciBcJGkgOj0gbV94XFtcKDJcKTogMjIsIDI1XF0iICIiCisgICAgZ2RiX3Rlc3Qge3ByaW50ICRpfSB7ID0gXFtcKDFcKTogMCwgXCgyXCk6IDIyLCBcKDNcKTogMjVcXX0KK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2djaDkyMi5jaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2djaDkyMi5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2U4YTIzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvZ2NoOTIyLmNoCkBAIC0wLDAgKzEsMjMgQEAKK3h4IDogbW9kdWxlCisgIAorZGNsIGEgY2hhcnMoMjAwKSB2YXJ5aW5nIGluaXQgOj0gKDcwKSdeKDApJyAvLyAiSmFzb24iIl4oMCw1KSIiSHVnb14oMTApIiAvLyAoNzApJ14oMSknOworZGNsIGIgY2hhcnMoMjApIHZhcnlpbmcgaW5pdCA6PSAiSmFzb24iIl4oMCw1KSIiSHVnb14oMTApIjsKK2RjbCBjIGNoYXJzKDI1NikgdmFyeWluZyBpbml0IDo9ICg3MCknYScgLy8gIl4oMCw1KUphc29uIiAvLyAoNzApJ2InOworZGNsIGQgY2hhciBpbml0IDo9ICdeKDExKSc7CisKK2J1bGs6IFBST0MgKCk7CitFTkQgYnVsazsKKworYSA6PSAoNTApICdeKDI1NSwwLDIyMiwxMjcpJzsKK2IgOj0gKDEpJ14oMjAwKSc7CitkIDo9ICdhJzsKKworYzo9ICgyNTYpIiAiOworCitETyBGT1IgaTo9IDAgQlkgMSBUTyAyNTU7CisgICBjICgyNTUtaSkgOj0gY2hhciAoaSk7CitPRDsKKyAgCitidWxrICgpOworCitlbmQgeHg7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvZ2NoOTIyLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2djaDkyMi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmYjZkYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2djaDkyMi5leHAKQEAgLTAsMCArMSwxODMgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB0ZXN0cyB2YXJpb3VzIENoaWxsIHZhbHVlcywgZXhwcmVzc2lvbnMsIGFuZCB0eXBlcy4KKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgV2lsZnJpZWQgTW9zZXIgKG1vc2VyQGF1dC5hbGNhdGVsLmF0KQorIwkJCSAgIEt1cnQgRnVjaHMgKGZ1Y2hzX2tAYXV0LmFsY2F0ZWwuYXQpCisjCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitpZiBbc2tpcF9jaGlsbF90ZXN0c10gdGhlbiB7IGNvbnRpbnVlIH0KKworc2V0IHRlc3RmaWxlICJnY2g5MjIiCitzZXQgc3JjZmlsZSAke3NyY2Rpcn0vJHN1YmRpci8ke3Rlc3RmaWxlfS5jaAorc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5leGUKK2lmICB7IFtjb21waWxlICIke3NyY2ZpbGV9IC1nIC13IC1vICR7YmluZmlsZX0gJHtDSElMTF9SVDB9ICR7Q0hJTExfTElCfSJdICE9ICIiIH0geworICAgIHBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3NyY2ZpbGV9IgorICAgIHJldHVybiAtMQorfQorCisjIFNldCB0aGUgY3VycmVudCBsYW5ndWFnZSB0byBjaGlsbC4gIFRoaXMgY291bnRzIGFzIGEgdGVzdC4gIElmIGl0CisjIGZhaWxzLCB0aGVuIHdlIHNraXAgdGhlIG90aGVyIHRlc3RzLgorCitwcm9jIHNldF9sYW5nX2NoaWxsIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBiaW5maWxlIG9iamRpciBzdWJkaXIKKworICAgIHZlcmJvc2UgImxvYWRpbmcgZmlsZSAnJGJpbmZpbGUnIgorICAgIGdkYl9sb2FkICRiaW5maWxlCisgICAgc2VuZF9nZGIgInNldCBsYW5ndWFnZSBjaGlsbFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorCXRpbWVvdXQgeyBmYWlsICJzZXQgbGFuZ3VhZ2UgY2hpbGwgKHRpbWVvdXQpIiA7IHJldHVybiAwIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAic2hvdyBsYW5ndWFnZVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogc291cmNlIGxhbmd1YWdlIGlzIFwiY2hpbGxcIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJzZXQgbGFuZ3VhZ2UgdG8gXCJjaGlsbFwiIgorCSAgICBzZW5kX2dkYiAiYnJlYWsgeHhfXG4iCisJICAgIGdkYl9leHBlY3QgeworCQktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCQkgICAgc2VuZF9nZGIgInJ1blxuIiAKKwkJICAgIGdkYl9leHBlY3QgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9CisJCSAgICByZXR1cm4gMQorCQl9CisJCXRpbWVvdXQgeworCQkgICAgZmFpbCAiY2FuJ3Qgc2V0IGJyZWFrcG9pbnQgKHRpbWVvdXQpIgorCQkgICAgcmV0dXJuIDAKKwkJfQorCSAgICB9CisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInNldHRpbmcgbGFuZ3VhZ2UgdG8gXCJjaGlsbFwiIgorCSAgICByZXR1cm4gMAorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAiY2FuJ3Qgc2hvdyBsYW5ndWFnZSAodGltZW91dCkiCisJICAgIHJldHVybiAwCisJfQorICAgIH0KK30KKworIyBUZXN0aW5nIHByaW50aW5nIG9mIGEgc3BlY2lmaWMgdmFsdWUuICBJbmNyZW1lbnQgcGFzc2NvdW50IGZvcgorIyBzdWNjZXNzIG9yIGlzc3VlIGZhaWwgbWVzc2FnZSBmb3IgZmFpbHVyZS4gIEluIGJvdGggY2FzZXMsIHJldHVybgorIyBhIDEgdG8gaW5kaWNhdGUgdGhhdCBtb3JlIHRlc3RzIGNhbiBwcm9jZWVkLiAgSG93ZXZlciBhIHRpbWVvdXQKKyMgaXMgYSBzZXJpb3VzIGVycm9yLCBnZW5lcmF0ZXMgYSBzcGVjaWFsIGZhaWwgbWVzc2FnZSwgYW5kIGNhdXNlcworIyBhIDAgdG8gYmUgcmV0dXJuZWQgdG8gaW5kaWNhdGUgdGhhdCBtb3JlIHRlc3RzIGFyZSBsaWtlbHkgdG8gZmFpbAorIyBhcyB3ZWxsLgorIworIyBBcmdzIGFyZToKKyMKKyMJRmlyc3Qgb25lIGlzIHN0cmluZyB0byBzZW5kX2dkYiB0byBnZGIKKyMJU2Vjb25kIG9uZSBpcyBzdHJpbmcgdG8gbWF0Y2ggZ2RiIHJlc3VsdCB0bworIwlUaGlyZCBvbmUgaXMgYW4gb3B0aW9uYWwgbWVzc2FnZSB0byBiZSBwcmludGVkCisKK3Byb2MgdGVzdF9wcmludF9hY2NlcHQgeyBhcmdzIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIHBhc3Njb3VudAorICAgIGdsb2JhbCB2ZXJib3NlCisKKyAgICBpZiBbbGxlbmd0aCAkYXJnc109PTMgdGhlbiB7CisJc2V0IG1lc3NhZ2UgW2xpbmRleCAkYXJncyAyXQorICAgIH0gZWxzZSB7CisJc2V0IG1lc3NhZ2UgW2xpbmRleCAkYXJncyAwXQorICAgIH0KKyAgICBzZXQgc2VuZHRoaXMgW2xpbmRleCAkYXJncyAwXQorICAgIHNldCBleHBlY3R0aGlzIFtsaW5kZXggJGFyZ3MgMV0KKyAgICBzZXQgcmVzdWx0IFtnZGJfdGVzdCAkc2VuZHRoaXMgIi4qID0gJHtleHBlY3R0aGlzfSIgJG1lc3NhZ2VdCisgICAgaWYgJHJlc3VsdD09MCB7aW5jciBwYXNzY291bnR9CisgICAgcmV0dXJuICRyZXN1bHQKK30KKworCitwcm9jIHRlc3RfY2hhcnMge30geworICAgIGdsb2JhbCBwYXNzY291bnQgZ2RiX3Byb21wdAorCisgICAgdmVyYm9zZSAiVGVzdGluZyBDaGFycyIKKyAgICBzZXQgcGFzc2NvdW50IDAKKworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBhIiB7J1xeXCgwXCknPHJlcGVhdHMgNzAgdGltZXM+Ly8iSmFzb24iIlxeXCgwLDVcKSIiSHVnb1xeXCgxMFwpIi8vJ1xeXCgxXCknPHJlcGVhdHMgNzAgdGltZXM+fQorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBiIiB7Ikphc29uIiJcXlwoMCw1XCkiIkh1Z29cXlwoMTBcKSJ9CisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGMiIHsnYSc8cmVwZWF0cyA3MCB0aW1lcz4vLyJcXlwoMCw1XClKYXNvbiIvLydiJzxyZXBlYXRzIDcwIHRpbWVzPn0KKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgZCIgeydcXlwoMTFcKSd9CisKKyAgICBnZGJfdGVzdCAic2V0IHZhciBhIDo9ICgxMDApJ1xeKDAsMjU1KSciICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGEiIHsiXF5cKDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1LDAsMjU1XCkifQorCisgICAgc2VuZF9nZGIgInNldCB2YXIgYSA6PSAoMTApJ1xeKDEpJy8vKDI2KVwiXF4oNjYsNjcpXCIvL1wiIFwiLy8nSScvLycgJy8vJ2EnLy8nbScvL1wiIEh1Z29cIiBcbiIgOyBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgYSIgeyJcXlwoMSwxLDEsMSwxLDEsMSwxLDEsMVwpQkNCQ0JDQkNCQ0JDQkNCQ0JDQkNCQ0JDQkNCQ0JDQkNCQ0JDQkNCQ0JDQkNCQ0JDQkNCQyBJIGFtIEh1Z28ifQorICAgIHNlbmRfZ2RiICJzZXQgdmFyIGIgOj0gXCJIdWdvIFwiXCJcXigzLDQpXCJcIk90dG9cXigxNylcIiBcbiIgOyBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgYiIgeyJIdWdvICIiXF5cKDMsNFwpIiJPdHRvXF5cKDE3XCkifQorICAgIHNlbmRfZ2RiICJzZXQgdmFyIGMgOj0gKDcwKSdiJyAvLyBcIlxeKDIsMylIdWdvIFwiIC8vICg3MCknYycgXG4iIDsgZ2RiX2V4cGVjdCAtcmUgIiRnZGJfcHJvbXB0ICQiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGMiIHsnYic8cmVwZWF0cyA3MCB0aW1lcz4vLyJcXlwoMiwzXClIdWdvICIvLydjJzxyZXBlYXRzIDcwIHRpbWVzPn0KKyAgICBnZGJfdGVzdCAic2V0IHZhciBkIDo9ICdcXigxOTkpJyIgIiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgZCIgeydcXlwoMTk5XCknfQorCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50ICgxMCknXF4oMCknLy8oMjYpXCJcXig2Niw2NylcIi8vXCIgXCIvLydJJy8vJyAnLy8nYScvLydtJy8vXCIgSHVnb1wiIiB7IlxeXCgwLDAsMCwwLDAsMCwwLDAsMCwwXClCQ0JDQkNCQ0JDQkNCQ0JDQkNCQ0JDQkNCQ0JDQkNCQ0JDQkNCQ0JDQkNCQ0JDQkNCQ0JDIEkgYW0gSHVnbyJ9CisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IFwiSmFzb25cIlwiXF4oMCw1KVwiXCJIdWdvXF4oMTApXCIiIHsiSmFzb24iIlxeXCgwLDVcKSIiSHVnb1xeXCgxMFwpIn0KKworICAgIHNlbmRfZ2RiICJzZXQgdmFyIGEgOj0gXCJcIiBcbiIgOyBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgYSIgeyIifQorICAgIHNlbmRfZ2RiICJzZXQgdmFyIGEgOj0gXCJcIlwiXCIgXG4iIDsgZ2RiX2V4cGVjdCAtcmUgIiRnZGJfcHJvbXB0ICQiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGEiIHsiIiIifQorICAgIHNlbmRfZ2RiICJzZXQgdmFyIGEgOj0gXCIgXCJcIlwiIFxuIiA7IGdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBhIiB7IiAiIiJ9CisgICAgc2VuZF9nZGIgInNldCB2YXIgYSA6PSBcIlxeXF5cIiBcbiIgOyBnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgYSIgeyJcXlxeIn0KKyAgICBzZW5kX2dkYiAic2V0IHZhciBhIDo9IFwiJ1wiIFxuIiA7IGdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBhIiB7IicifQorfQorCisKK3Byb2MgdGVzdF9jb2RlIHt9IHsKKyAgICBnbG9iYWwgcGFzc2NvdW50IGdkYl9wcm9tcHQKKworICAgIHZlcmJvc2UgIlRlc3RpbmcgQ2hhcnMiCisgICAgc2V0IHBhc3Njb3VudCAwCisKKyAgICBydW50byBidWxrCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGEiIHsiXF5cKDI1NSwwLDIyMiwxMjcsMjU1LDAsMjIyLDEyNywyNTUsMCwyMjIsMTI3LDI1NSwwLDIyMiwxMjcsMjU1LDAsMjIyLDEyNywyNTUsMCwyMjIsMTI3LDI1NSwwLDIyMiwxMjcsMjU1LDAsMjIyLDEyNywyNTUsMCwyMjIsMTI3LDI1NSwwLDIyMiwxMjcsMjU1LDAsMjIyLDEyNywyNTUsMCwyMjIsMTI3LDI1NSwwLDIyMiwxMjcsMjU1LDAsMjIyLDEyNywyNTUsMCwyMjIsMTI3LDI1NSwwLDIyMiwxMjcsMjU1LDAsMjIyLDEyNywyNTUsMCwyMjIsMTI3LDI1NSwwLDIyMiwxMjcsMjU1LDAsMjIyLDEyNywyNTUsMCwyMjIsMTI3LDI1NSwwLDIyMiwxMjcsMjU1LDAsMjIyLDEyNywyNTUsMCwyMjIsMTI3LDI1NSwwLDIyMiwxMjcsMjU1LDAsMjIyLDEyNywyNTUsMCwyMjIsMTI3LDI1NSwwLDIyMiwxMjcsMjU1LDAsMjIyLDEyNywyNTUsMCwyMjIsMTI3LDI1NSwwLDIyMiwxMjcsMjU1LDAsMjIyLDEyNywyNTUsMCwyMjIsMTI3LDI1NSwwLDIyMiwxMjcsMjU1LDAsMjIyLDEyNywyNTUsMCwyMjIsMTI3LDI1NSwwLDIyMiwxMjcsMjU1LDAsMjIyLDEyNywyNTUsMCwyMjIsMTI3LDI1NSwwLDIyMiwxMjcsMjU1LDAsMjIyLDEyNywyNTUsMCwyMjIsMTI3LDI1NSwwLDIyMiwxMjcsMjU1LDAsMjIyLDEyNywyNTUsMCwyMjIsMTI3LDI1NSwwLDIyMiwxMjcsMjU1LDAsMjIyLDEyNywyNTUsMCwyMjIsMTI3LDI1NSwwLDIyMiwxMjcsMjU1LDAsMjIyLDEyN1wpIn0KKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgYiIgeyJcXlwoMjAwXCkifQorIyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgYyIgeydhJzxyZXBlYXRzIDcwIHRpbWVzPi8vIlxeXCgwLDVcKUphc29uIi8vJ2InPHJlcGVhdHMgNzAgdGltZXM+fQorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBkIiB7J2EnfQorfQorCisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisKK2dkYl90ZXN0ICJzZXQgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncyIgIi4qIgorCisKK2lmIFtzZXRfbGFuZ19jaGlsbF0gdGhlbiB7CisgICAgIyB0ZXN0IGJ1aWx0aW5zIGFzIGRlc2NyaWJlZCBpbiBjaGFwdGVyIDYuMjAuMyBaLjIwMAorCisgICAgdGVzdF9jaGFycworIyAgICB0ZXN0X2NvZGUKK30gZWxzZSB7CisgICAgd2FybmluZyAiJHRlc3RfbmFtZSB0ZXN0cyBzdXBwcmVzc2VkLiIKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2djaDk4MS5jaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2djaDk4MS5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGYwNDc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvZ2NoOTgxLmNoCkBAIC0wLDAgKzEsNjAgQEAKK3h4OiBNT0RVTEUKKworU1lOTU9ERSBtX3NldDEgPSBTRVQgKGUxLCBlMiwgZTMsIGU0LCBlNSk7CitEQ0wgdl9zZXQxIG1fc2V0MSBJTklUIDo9IGUzOworCitTWU5NT0RFIG1fc2V0MiA9IFNFVCAoYTE9MSwgYTI9MiwgYTM9MTcsIGE0PTksIGE1PTgsIGE2PTAsIGE3PTE0LCBhOD0zMywgYTk9MTIpOworRENMIHYxX3NldDIgbV9zZXQyIElOSVQgOj0gYTE7CitEQ0wgdjJfc2V0MiBtX3NldDIgSU5JVCA6PSBhMjsKK0RDTCB2M19zZXQyIG1fc2V0MiBJTklUIDo9IGEzOworRENMIHY0X3NldDIgbV9zZXQyIElOSVQgOj0gYTQ7CitEQ0wgdjVfc2V0MiBtX3NldDIgSU5JVCA6PSBhNTsKK0RDTCB2Nl9zZXQyIG1fc2V0MiBJTklUIDo9IGE2OworRENMIHY3X3NldDIgbV9zZXQyIElOSVQgOj0gYTc7CitEQ0wgdjhfc2V0MiBtX3NldDIgSU5JVCA6PSBhODsKK0RDTCB2OV9zZXQyIG1fc2V0MiBJTklUIDo9IGE5OworCitTWU5NT0RFIG1fc2V0MyA9IFNFVCAoYjEsIGIyLCBiMywgYjQsIGI1ID0gNDcxMSwgYjYsIGI3ID0gNDcxMyk7CitEQ0wgdl9zZXQzIG1fc2V0MyBJTklUIDo9IGI3OworCitTWU5NT0RFIG1fc2V0NCA9IFNFVChzMT0xMTExMTEsIHMyLCBzMywgczQpOyAKK0RDTCB2MV9zZXQ0IG1fc2V0NCBJTklUIDo9IHMxOworCitTWU5NT0RFIG1fc2V0X3JhbmdlID0gbV9zZXQxKGUyOmU1KTsKK0RDTCB2X3NldF9yYW5nZSBtX3NldF9yYW5nZSBJTklUIDo9IGUzOworCitTWU5NT0RFIG1fc2V0X3JhbmdlX2FyciA9IEFSUkFZIChtX3NldF9yYW5nZSkgQllURTsKK0RDTCB2X3NldF9yYW5nZV9hcnIgQVJSQVkgKG1fc2V0X3JhbmdlKSBCWVRFOworCitTWU5NT0RFIG1fc2V0X2FyciA9IEFSUkFZIChtX3NldDEpIEJZVEU7CitEQ0wgdl9zZXRfYXJyIEFSUkFZIChtX3NldDEpIEJZVEU7CisKK05FV01PREUgbV9wb3dlcjEgPSBQT1dFUlNFVCBtX3NldDE7CitEQ0wgdjFfcG93ZXIxIFJFQUQgbV9wb3dlcjEgSU5JVCA6PSBbZTEsZTIsZTMsZTQsZTVdOworRENMIHYyX3Bvd2VyMSBtX3Bvd2VyMSBJTklUIDo9IFtdOworCitORVdNT0RFIG1fcG93ZXIyID0gUE9XRVJTRVQgbV9zZXQyOworRENMIHZfcG93ZXIyIG1fcG93ZXIyIElOSVQgOj0gW107CisKK05FV01PREUgbV9wb3dlcjMgPSBQT1dFUlNFVCBtX3NldDM7CitEQ0wgdl9wb3dlcjMgbV9wb3dlcjMgSU5JVCA6PSBbYjE6YjJdOworCitORVdNT0RFIG1fcG93ZXI0ID0gUE9XRVJTRVQgQ0hBUjsKK0RDTCB2X3Bvd2VyNCBtX3Bvd2VyNCBJTklUIDo9IFsnYic6J3gnXTsKKworTkVXTU9ERSBtX3Bvd2VyNSA9IFBPV0VSU0VUIElOVCAoMjo0MDApOworRENMIHZfcG93ZXI1IG1fcG93ZXI1IElOSVQgOj0gWzI6MTAwXTsKKworTkVXTU9ERSBtX3Bvd2VyNiA9IFBPV0VSU0VUIElOVDsKK0RDTCB2X3Bvd2VyNiBtX3Bvd2VyNjsKKworTkVXTU9ERSBtX3Bvd2VyNyA9IFBPV0VSU0VUIExPTkc7CitEQ0wgdl9wb3dlcjcgbV9wb3dlcjc7CisKKwordl9zZXQxOj0gZTI7Cit2Ml9wb3dlcjE6PSBbZTFdOworCit2X3NldDE6PSBlMTsKKworRU5EIHh4OwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvZ2NoOTgxLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2djaDk4MS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5NDhiMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL2djaDk4MS5leHAKQEAgLTAsMCArMSwyNDkgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB0ZXN0cyB2YXJpb3VzIENoaWxsIHZhbHVlcywgZXhwcmVzc2lvbnMsIGFuZCB0eXBlcy4KKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgV2lsZnJpZWQgTW9zZXIgKG1vc2VyQGF1dC5hbGNhdGVsLmF0KQorIwkJCSAgIEt1cnQgRnVjaHMgKGZ1Y2hzX2tAYXV0LmFsY2F0ZWwuYXQpCisjCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitpZiBbc2tpcF9jaGlsbF90ZXN0c10gdGhlbiB7IGNvbnRpbnVlIH0KKworc2V0IHRlc3RmaWxlICJnY2g5ODEiCitzZXQgc3JjZmlsZSAke3NyY2Rpcn0vJHN1YmRpci8ke3Rlc3RmaWxlfS5jaAorc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5leGUKK2lmICB7IFtjb21waWxlICIke3NyY2ZpbGV9IC1nIC13IC1vICR7YmluZmlsZX0gJHtDSElMTF9SVDB9ICR7Q0hJTExfTElCfSJdICE9ICIiIH0geworICAgIHBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3NyY2ZpbGV9IgorICAgIHJldHVybiAtMQorfQorCisjIFNldCB0aGUgY3VycmVudCBsYW5ndWFnZSB0byBjaGlsbC4gIFRoaXMgY291bnRzIGFzIGEgdGVzdC4gIElmIGl0CisjIGZhaWxzLCB0aGVuIHdlIHNraXAgdGhlIG90aGVyIHRlc3RzLgorCitwcm9jIHNldF9sYW5nX2NoaWxsIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBiaW5maWxlIG9iamRpciBzdWJkaXIKKworICAgIHZlcmJvc2UgImxvYWRpbmcgZmlsZSAnJGJpbmZpbGUnIgorICAgIGdkYl9sb2FkICRiaW5maWxlCisgICAgc2VuZF9nZGIgInNldCBsYW5ndWFnZSBjaGlsbFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorCXRpbWVvdXQgeyBmYWlsICJzZXQgbGFuZ3VhZ2UgY2hpbGwgKHRpbWVvdXQpIiA7IHJldHVybiAwIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAic2hvdyBsYW5ndWFnZVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogc291cmNlIGxhbmd1YWdlIGlzIFwiY2hpbGxcIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJzZXQgbGFuZ3VhZ2UgdG8gXCJjaGlsbFwiIgorCSAgICBzZW5kX2dkYiAiYnJlYWsgeHhfXG4iCisJICAgIGdkYl9leHBlY3QgeworCQktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCQkgICAgc2VuZF9nZGIgInJ1blxuIiAKKwkJICAgIGdkYl9leHBlY3QgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9CisJCSAgICByZXR1cm4gMQorCQl9CisJCXRpbWVvdXQgeworCQkgICAgZmFpbCAiY2FuJ3Qgc2V0IGJyZWFrcG9pbnQgKHRpbWVvdXQpIgorCQkgICAgcmV0dXJuIDAKKwkJfQorCSAgICB9CisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInNldHRpbmcgbGFuZ3VhZ2UgdG8gXCJjaGlsbFwiIgorCSAgICByZXR1cm4gMAorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAiY2FuJ3Qgc2hvdyBsYW5ndWFnZSAodGltZW91dCkiCisJICAgIHJldHVybiAwCisJfQorICAgIH0KK30KKworIyBUZXN0aW5nIHByaW50aW5nIG9mIGEgc3BlY2lmaWMgdmFsdWUuICBJbmNyZW1lbnQgcGFzc2NvdW50IGZvcgorIyBzdWNjZXNzIG9yIGlzc3VlIGZhaWwgbWVzc2FnZSBmb3IgZmFpbHVyZS4gIEluIGJvdGggY2FzZXMsIHJldHVybgorIyBhIDEgdG8gaW5kaWNhdGUgdGhhdCBtb3JlIHRlc3RzIGNhbiBwcm9jZWVkLiAgSG93ZXZlciBhIHRpbWVvdXQKKyMgaXMgYSBzZXJpb3VzIGVycm9yLCBnZW5lcmF0ZXMgYSBzcGVjaWFsIGZhaWwgbWVzc2FnZSwgYW5kIGNhdXNlcworIyBhIDAgdG8gYmUgcmV0dXJuZWQgdG8gaW5kaWNhdGUgdGhhdCBtb3JlIHRlc3RzIGFyZSBsaWtlbHkgdG8gZmFpbAorIyBhcyB3ZWxsLgorIworIyBBcmdzIGFyZToKKyMKKyMJRmlyc3Qgb25lIGlzIHN0cmluZyB0byBzZW5kX2dkYiB0byBnZGIKKyMJU2Vjb25kIG9uZSBpcyBzdHJpbmcgdG8gbWF0Y2ggZ2RiIHJlc3VsdCB0bworIwlUaGlyZCBvbmUgaXMgYW4gb3B0aW9uYWwgbWVzc2FnZSB0byBiZSBwcmludGVkCisKK3Byb2MgdGVzdF9wcmludF9hY2NlcHQgeyBhcmdzIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIHBhc3Njb3VudAorICAgIGdsb2JhbCB2ZXJib3NlCisKKyAgICBpZiBbbGxlbmd0aCAkYXJnc109PTMgdGhlbiB7CisJc2V0IG1lc3NhZ2UgW2xpbmRleCAkYXJncyAyXQorICAgIH0gZWxzZSB7CisJc2V0IG1lc3NhZ2UgW2xpbmRleCAkYXJncyAwXQorICAgIH0KKyAgICBzZXQgc2VuZHRoaXMgW2xpbmRleCAkYXJncyAwXQorICAgIHNldCBleHBlY3R0aGlzIFtsaW5kZXggJGFyZ3MgMV0KKyAgICBzZXQgcmVzdWx0IFtnZGJfdGVzdCAkc2VuZHRoaXMgIi4qID0gJHtleHBlY3R0aGlzfSIgJG1lc3NhZ2VdCisgICAgaWYgJHJlc3VsdD09MCB7aW5jciBwYXNzY291bnR9CisgICAgcmV0dXJuICRyZXN1bHQKK30KKworcHJvYyB0ZXN0X3Bvd2VyIHt9IHsKKyAgICBnbG9iYWwgcGFzc2NvdW50IGdkYl9wcm9tcHQKKworICAgIHZlcmJvc2UgIlRlc3Rpbmcgc29tZSBQT1dFUlNFVCBTdHVmZiIKKyAgICBzZXQgcGFzc2NvdW50IDAKKworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2MV9wb3dlcjEiIHtcW2UxOmU1XF19CisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHYyX3Bvd2VyMSIge1xbXF19CisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IFNJWkUodjFfcG93ZXIxKSIgIjEiCisKKyAgICBnZGJfdGVzdCAic2V0IHYxX3Bvd2VyMSA6PSBcW2IxXF0iICAiIgorIyAgIGlmIEdEQiBoYXMgcmVqZWN0ZWQgdGhlIGltcHJvcGVyIHZhbHVlcywgd2UgaGF2ZSB0byBnZGJfZXhwZWN0IHRoZSBzYW1lIQorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2MV9wb3dlcjEiIHtcW2UxOmU1XF19CisKKyAgICBnZGJfdGVzdCAic2V0IHYxX3Bvd2VyMSA6PSBcW2ExLGEyXF0iICAiIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2MV9wb3dlcjEiIHtcW2UxOmU1XF19CisgICAgZ2RiX3Rlc3QgInNldCB2MV9wb3dlcjEgOj0gXFtiMSxiMixiMyxlNFxdIiAgIiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdjFfcG93ZXIxIiB7XFtlMTplNVxdfQorICAgIGdkYl90ZXN0ICJzZXQgdjFfcG93ZXIxIDo9IFxbZTQ6ZTVcXSIgICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHYxX3Bvd2VyMSIge1xbZTQ6ZTVcXX0KKyAgICBnZGJfdGVzdCAic2V0IHYxX3Bvd2VyMSA6PSBcW2UxLCBlMjplMywgZTVcXSIgICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHYxX3Bvd2VyMSIge1xbZTE6ZTMsIGU1XF19CisgICAgZ2RiX3Rlc3QgInNldCB2MV9wb3dlcjEgOj0gXFtlMSwgZTI6ZTQsIGU0OmU1XF0iICAiIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2MV9wb3dlcjEiIHtcW2UxOmU1XF19CisgICAgZ2RiX3Rlc3QgInNldCB2MV9wb3dlcjEgOj0gXFtlMSwgZTE6ZTMsIGUxOmUyLCBlMjplM1xdIiAgIiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdjFfcG93ZXIxIiB7XFtlMTplM1xdfQorCisgICAgZ2RiX3Rlc3QgInNldCB2X3Bvd2VyMiA6PSBcW2UyXF0iICAiIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2X3Bvd2VyMiIge1xbXF19CisgICAgZ2RiX3Rlc3QgInNldCB2X3Bvd2VyMiA6PSBcWzEsMiwzXF0iICAiIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2X3Bvd2VyMiIge1xbXF19CisgICAgZ2RiX3Rlc3QgInNldCB2X3Bvd2VyMiA6PSBcW2UyLCBiMiwgYjFcXSIgICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfcG93ZXIyIiB7XFtcXX0KKworIyBOb3RlLCB0aGF0IHRoaXMgaXMgYSBudW1iZXJlZCBTRVQsIHNvIGExOmEzIGNvbnRhaW5zIGFsbCBlbGVtZW50cyAoZXhlcHQgYTYpCisgICAgZ2RiX3Rlc3QgInNldCB2X3Bvd2VyMiA6PSBcW2ExOmEzLCBhNjphNCwgYTc6YTlcXSIgICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfcG93ZXIyIiB7XFthNjphM1xdfQorICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjIgOj0gXFthMSwgYTQ6YTYsIGE5XF0iICAiIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2X3Bvd2VyMiIge1xbYTEsIGE5XF19CisgICAgZ2RiX3Rlc3QgInNldCB2X3Bvd2VyMiA6PSBcW2ExOmEyLCBhNiwgYTlcXSIgICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfcG93ZXIyIiB7XFthNjphMiwgYTlcXX0KKyAgICBnZGJfdGVzdCAic2V0IHZfcG93ZXIyIDo9IFxbYTEsIGE0LCBhNzphOCwgYTk6YTNcXSIgICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfcG93ZXIyIiB7XFthMSwgYTQsIGE5OmE4XF19CisgICAgZ2RiX3Rlc3QgInNldCB2X3Bvd2VyMiA6PSBcW2ExLCBhNDphOFxdIiAgIiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdl9wb3dlcjIiIHtcW2ExLCBhNDphOFxdfQorICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjIgOj0gXFthOCxhMyxhNyxhOSxhNSxhNlxdIiAgIiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdl9wb3dlcjIiIHtcW2E2LCBhNSwgYTksIGE3LCBhMywgYThcXX0KKworICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjMgOj0gXFtiMTpiMixlMVxdIiAgIiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdl9wb3dlcjMiIHtcW2IxOmIyXF19CisgICAgZ2RiX3Rlc3QgInNldCB2X3Bvd2VyMyA6PSBcW2IxLCBiMywgYjY6YjdcXSIgICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfcG93ZXIzIiB7XFtiMSwgYjMsIGI2OmI3XF19CisgICAgZ2RiX3Rlc3QgInNldCB2X3Bvd2VyMyA6PSBcW2IxLCBiMzpiNCwgYjdcXSIgICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfcG93ZXIzIiB7XFtiMSwgYjM6YjQsIGI3XF19CisgICAgZ2RiX3Rlc3QgInNldCB2X3Bvd2VyMyA6PSBcW2IxLCBiNDpiNiwgYjdcXSIgICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfcG93ZXIzIiB7XFtiMSwgYjQ6YjdcXX0KKyAgICBnZGJfdGVzdCAic2V0IHZfcG93ZXIzIDo9IFxbYjE6YjdcXSIgICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfcG93ZXIzIiB7XFtiMTpiN1xdfQorICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjMgOj0gXFtiNTpiNywgYjFcXSIgICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfcG93ZXIzIiB7XFtiMSwgYjU6YjdcXX0KKworICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjQgOj0gXFtcImJcIlxdIiAiIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2X3Bvd2VyNCIge1xbJ2InOid4J1xdfQorICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjQgOj0gXFs1XF0iICAiIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2X3Bvd2VyNCIge1xbJ2InOid4J1xdfQorICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjQgOj0gXFsnYyc6J2YnLCdnJzonaCcsJ28nOid0J1xdIiAiIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2X3Bvd2VyNCIge1xbJ2MnOidoJywgJ28nOid0J1xdfQorICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjQgOj0gXFsnYScsJ2InLCdjJywnZCcsJ2UnLCdmJ1xdIiAiIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2X3Bvd2VyNCIge1xbJ2EnOidmJ1xdfQorICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjQgOj0gXFsnXF4oMCknOidcXigyMDApJ1xdIiAiIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2X3Bvd2VyNCIge1xbJ1xeXCgwXCknOidcXlwoMjAwXCknXF19CisKKyAgICBnZGJfdGVzdCAic2V0IHZfcG93ZXI1IDo9IFxbYThcXSIgICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfcG93ZXI1IiB7XFsyOjEwMFxdfQorICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjUgOj0gXFs0XF0iICAiIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2X3Bvd2VyNSIge1xbNFxdfQorICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjUgOj0gXFszOjk1LDk6MTAwLDEwOjEwNywyMDA6MjUwXF0iICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfcG93ZXI1IiB7XFszOjEwNywgMjAwOjI1MFxdfQorICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjUgOj0gXFsyLCAxMDA6MTIwLCAzNTA6NDAwXF0iICAiIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2X3Bvd2VyNSIge1xbMiwgMTAwOjEyMCwgMzUwOjQwMFxdfQorICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjUgOj0gXFsyOjY0LDY1OjEyNywxMjg6MjU2LDI1NjozOTksNDAwXF0iICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfcG93ZXI1IiB7XFsyOjQwMFxdfQorICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjUgOj0gXFszOjk1LCA5OToxMDAsIDEwMToxMDcsIDIwMDoyNTBcXSIgICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfcG93ZXI1IiB7XFszOjk1LCA5OToxMDcsIDIwMDoyNTBcXX0KKworICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjYgOj0gXFthOFxdIiAgIiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdl9wb3dlcjYiIHtcW1xdfQorICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjYgOj0gXFs0XF0iICAiIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2X3Bvd2VyNiIge1xbNFxdfQorICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjYgOj0gXFszOjk1LCA5OToxMDAsIDEwMToxMDcsIDIwMDoyNTBcXSIgICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfcG93ZXI2IiB7XFszOjk1LCA5OToxMDcsIDIwMDoyNTBcXX0KKyAgICBnZGJfdGVzdCAic2V0IHZfcG93ZXI2IDo9IFxbLTExMTowLCAxOjExMiwgMTExMTE6MjIyMjJcXSIgICIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfcG93ZXI2IiB7XFstMTExOjExMiwgMTExMTE6MjIyMjJcXX0KKyAgICBnZGJfdGVzdCAic2V0IHZfcG93ZXI2IDo9IFxbMCwgMjAwOjQwMDAsIDY2NjY6OTk5OVxdIiAgIiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdl9wb3dlcjYiIHtcWzAsIDIwMDo0MDAwLCA2NjY2Ojk5OTlcXX0KKworIyAgICBnZGJfdGVzdCAic2V0IHZfcG93ZXI3IDo9IFxbYThcXSIgICIiCisjICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2X3Bvd2VyNyIge1xbMjoxMDBcXX0KKyMgICAgZ2RiX3Rlc3QgInNldCB2X3Bvd2VyNyA6PSBcWzRcXSIgICIiCisjICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2X3Bvd2VyNyIge1xbNFxdfQorIyAgICBnZGJfdGVzdCAic2V0IHZfcG93ZXI3IDo9IFxbMzo5NSwgOTk6MTAwLCAxMDE6MTA3LCAyMDA6MjUwXF0iICIiCisjICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2X3Bvd2VyNyIge1xbMzo5NSwgOTk6MTA3LCAyMDA6MjUwXF19CisjICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjcgOj0gXFswLCAxMDAwLCAxMDAwMDAwLCAxMDAwMDAwMDAwMFxdIiAgIiIKKyMgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfcG93ZXI3IiB7XFswLCAxMDAwLCAxMDAwMDAwLCAxMDAwMDAwMDAwXF19CisjICAgIGdkYl90ZXN0ICJzZXQgdl9wb3dlcjcgOj0gXFstMjAwMDA6MTAwMDAwLCAxMTExMTE6MjIyMjIyMlxdIiAgIiIKKyMgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfcG93ZXI3IiB7XFstMjAwMDA6MTAwMDAwLCAxMTExMTE6MjIyMjIyMlxdfQorIyAgICBnZGJfdGVzdCAic2V0IHZfcG93ZXI3IDo9IFxbXF0iICAiIgorIyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdl9wb3dlcjciIHtcWzM6OTUsIDk5OjEwNywgMjAwOjI1MFxdfQorIyAgICBnZGJfdGVzdCAic2V0IHZfcG93ZXI3IDo9IFxbMjotNTAwLCAtNTAxOjEsIDIwOjM3MCwgLTg4ODotOTIwLCAxMDAwOjIwMDAsIDE4MDA6MjUwMFxdXCAiICIiCisjICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCB2X3Bvd2VyNyIge1xbLTkyMDotODg4LCAtNTAxOjIsIDIwOjM3MCwgMTAwMDoyNTAwXF19CisjICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBTSVpFKHZfcG93ZXI3KSIgIiIKKworCisgICAgcnVudG8gNTgKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgdl9zZXQxIElOIHYxX3Bvd2VyMSIgIlRSVUUiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHZfc2V0MSBJTiB2Ml9wb3dlcjEiICJGQUxTRSIKKworfQorCisKKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKworZ2RiX3Rlc3QgInNldCBwcmludCBzZXZlbmJpdC1zdHJpbmdzIiAiLioiCisKKworaWYgW3NldF9sYW5nX2NoaWxsXSB0aGVuIHsKKyAgICAjIHRlc3QgYnVpbHRpbnMgYXMgZGVzY3JpYmVkIGluIGNoYXB0ZXIgNi4yMC4zIFouMjAwCisKKyAgICB0ZXN0X3Bvd2VyIAorfSBlbHNlIHsKKyAgICB3YXJuaW5nICIkdGVzdF9uYW1lIHRlc3RzIHN1cHByZXNzZWQuIgorfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvbWlzYy5jaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL21pc2MuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmMTJjOAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL21pc2MuY2gKQEAgLTAsMCArMSwxMiBAQAorbWlzY190ZXN0cyA6IE1PRFVMRTsKKworRENMIG90dG8gSU5UIDo9IDQyOworCitEQ0wgZm9vIFNUUlVDVCAobCBMT05HLCBjIENIQVIsIGIgQk9PTCwgcyBDSEFSUygzKSk7CisKK2R1bW15ZnVuYzogUFJPQygpOworRU5EIGR1bW15ZnVuYzsKKworZHVtbXlmdW5jKCk7CisKK0VORCBtaXNjX3Rlc3RzOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvbWlzYy5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9taXNjLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODRjMzRkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvbWlzYy5leHAKQEAgLTAsMCArMSwxMDAgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBGcmVkIEZpc2guIChmbmZAY3lnbnVzLmNvbSkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnRpbiBQb3R0ZW5kb3JmZXIgKHBvdHRlbmRvQGF1dC5hbGNhdGVsLmF0KQorIworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworaWYgW3NraXBfY2hpbGxfdGVzdHNdIHRoZW4geyBjb250aW51ZSB9CisKK3NldCB0ZXN0ZmlsZSAibWlzYyIKK3NldCBzcmNmaWxlICR7c3JjZGlyfS8kc3ViZGlyLyR7dGVzdGZpbGV9LmNoCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LmV4ZQoraWYgIHsgW2NvbXBpbGUgIiR7c3JjZmlsZX0gLWcgLW8gJHtiaW5maWxlfSAke0NISUxMX1JUMH0gJHtDSElMTF9MSUJ9Il0gIT0gIiIgfSB7CisgICAgcGVycm9yICJDb3VsZG4ndCBjb21waWxlICR7c3JjZmlsZX0iCisgICAgcmV0dXJuIC0xCit9CisKKyMgU2V0IHRoZSBjdXJyZW50IGxhbmd1YWdlIHRvIGNoaWxsLiAgVGhpcyBjb3VudHMgYXMgYSB0ZXN0LiAgSWYgaXQKKyMgZmFpbHMsIHRoZW4gd2Ugc2tpcCB0aGUgb3RoZXIgdGVzdHMuCisKK3Byb2Mgc2V0X2xhbmdfY2hpbGwge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGJpbmZpbGUgb2JqZGlyIHN1YmRpcgorCisgICAgdmVyYm9zZSAibG9hZGluZyBmaWxlICckYmluZmlsZSciCisgICAgZ2RiX2xvYWQgJGJpbmZpbGUKKworICAgIHNlbmRfZ2RiICJzZXQgbGFuZ3VhZ2UgY2hpbGxcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIge30KKwl0aW1lb3V0IHsgZmFpbCAic2V0IGxhbmd1YWdlIGNoaWxsICh0aW1lb3V0KSIgOyByZXR1cm4gMCB9CisgICAgfQorCisgICAgcmV0dXJuIFtnZGJfdGVzdCAic2hvdyBsYW5ndWFnZSIgIi4qIHNvdXJjZSBsYW5ndWFnZSBpcyBcImNoaWxsXCIuKiIgXAorCSJzZXQgbGFuZ3VhZ2UgdG8gXCJjaGlsbFwiIl0KK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisKK2dkYl90ZXN0ICJzZXQgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncyIgIi4qIgorCitpZiAhW3NldF9sYW5nX2NoaWxsXSB0aGVuIHsKKyAgICBydW50byBkdW1teWZ1bmMKKyAgICAjIGNoZWNrIHVwcGVyL2xvd2VyIGNhc2UgCisgICAgZ2RiX3Rlc3QgInB0eXBlIEJPT0wiICIgPSAoYm9vbHxCT09MKSIKKyAgICBnZGJfdGVzdCAicHR5cGUgYm9vbCIgIiA9IChib29sfEJPT0wpIgorICAgIGdkYl90ZXN0ICJwcmludCBvdHRvIiAiID0gNDIiCisgICAgZ2RiX3Rlc3QgInByaW50IE9UVE8iICIgPSA0MiIKKyAgICBnZGJfdGVzdCAicHJpbnQgb3RUTyIgIiA9IDQyIgorICAgIGdkYl90ZXN0ICJwcmludCBPVHRvIiAiID0gNDIiCisgICAgZ2RiX3Rlc3QgInByaW50IE5VTEwiICIgPSBOVUxMIiAicHJpbnQgZW1wdGluZXNzIGxpdGVyYWwiCisKKyAgICAjIFRoaXMgdGVzdHMgUFIgODQ5Ni4KKyAgICBnZGJfdGVzdCB7cHJpbnRmICIlZCAlZC4iLCAgMys0LDJ9ICI3IDIuIiAicHJpbnRmIHdpdGggMiBhcmd1bWVudHMiCisKKyAgICAjIFRoaXMgdGVzdHMgR0NILzkyNAorICAgIGdkYl90ZXN0IHtwcmludCAoaCcyMyl9IHsgPSAzNX0gInByaW50IHBhcmFudGlzZWQgaW50ZWdlciBsaXRlcmFsIgorCisgICAgIyBMaW51eCB0aGlua3MgdGhpcyBpcyBhdCBsaW5lIDYsIGJ1dCBpcyBvdGhlcndpc2Ugb2suCisgICAgc2V0dXBfeGZhaWwgImkqODYtcGMtbGludXgqLWdudSIKKyAgICBnZGJfdGVzdCAiaW5mbyBsaW5lIiBcCisJe0xpbmUgNyBvZiAuKm1pc2MuY2guKiBhdCBhZGRyZXNzIEgnWzAtOWEtZkEtRl0rLip9XAorCSJpbmZvIGFib3V0IGN1cnJlbnQgbGluZSIKKworICAgICMgY2hlY2sgYXJyYXkgKCkgdHlwZSAoZXhwcikKKyAgICBzZXR1cF94ZmFpbCAibTY4Ki0qLWhwdXgqIgorICAgIGdkYl90ZXN0ICJwcmludCBhcnJheSAoKSB1Ynl0ZSAoZm9vKSIgeyA9IFxbXCgwOjExXCk6IDBcXX0KKwkKKyAgICBzZW5kX2dkYiAic2V0IHZhciBcJGkgOj0gZm9vXG4iCisgICAgZ2RiX2V4cGVjdCAtcmUgIi4qJGdkYl9wcm9tcHQgJCIKKyAgICBzZXR1cF94ZmFpbCAibTY4Ki0qLWhwdXgqIgorICAgIGdkYl90ZXN0ICJwcmludC94IGFycmF5ICgpIGJ5dGUgKFwkaSkiIHsgPSBcW1woMDoxMVwpOiBIJzBcXX0KK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3Bvd2Vyc2V0LmNoIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcG93ZXJzZXQuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzMTcyZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3Bvd2Vyc2V0LmNoCkBAIC0wLDAgKzEsMzMgQEAKKy0tCistLSBjaGVjayBwb3dlcnNldCBvcGVyYXRvcnMgYW5kIGJ1aWx0LWlucworLS0KKworcHM6IE1PRFVMRQorCitTWU5NT0RFIG1fcHMxID0gUE9XRVJTRVQgVUxPTkcgKDA6OCk7CitEQ0wgdl9wczEgbV9wczEgSU5JVCA6PSBbMSwzLDUsN107CisKK1NZTk1PREUgbV9wczIgPSBQT1dFUlNFVCBMT05HICgtMTAwOjEwMCk7CitEQ0wgdl9wczIgbV9wczIgSU5JVCA6PSBbIC0xMDA6LTk1LCAtMToxLCA5NToxMDBdOworCitTWU5NT0RFIG1fc2V0ID0gU0VUIChhYSwgYmIsIGNjLCBkZCwgZWUsIGZmLCBnZywgaGgsIGlpLCBqaik7CitTWU5NT0RFIG1fcHMzID0gUE9XRVJTRVQgbV9zZXQ7CitEQ0wgdl9wczMgbV9wczMgSU5JVCA6PSBbYmIsIGRkLCBmZiwgaWldOworCitTWU5NT0RFIG1fcHM0ID0gUE9XRVJTRVQgQ0hBUignICc6J3onKTsKK0RDTCB2X3BzNCBtX3BzNCBJTklUIDo9IFsgJy4nLCAnLCcsICdBJzonRicsICd4JzoneicgXTsKKworU1lOTU9ERSBtX3BzNSA9IFBPV0VSU0VUIEJPT0w7CitEQ0wgdl9wczUgbV9wczUgSU5JVCA6PSBbIEZBTFNFIF07CitEQ0wgdl9wczUxIG1fcHM1IElOSVQgOj0gWyBdOworCitTWU5NT0RFIG1faW50X3JhbmdlID0gSU5UKC0xMDA6MTAwKTsKK1NZTk1PREUgbV9pbnRfc3VicmFuZ2UgPSBtX2ludF9yYW5nZSgtNTA6NTApOworU1lOTU9ERSBtX3BzNiA9IFBPV0VSU0VUIG1faW50X3N1YnJhbmdlOworRENMIHZfcHM2IG1fcHM2IElOSVQgOj0gWyBMT1dFUihtX2ludF9zdWJyYW5nZSk6VVBQRVIobV9pbnRfc3VicmFuZ2UpIF07CisKK0RDTCB4IElOVDsKKworeCA6PSAyNTsKKworRU5EIHBzOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcG93ZXJzZXQuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcG93ZXJzZXQuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNDc1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wb3dlcnNldC5leHAKQEAgLTAsMCArMSwxODcgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB0ZXN0cyB2YXJpb3VzIENoaWxsIHZhbHVlcywgZXhwcmVzc2lvbnMsIGFuZCB0eXBlcy4KKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK2lmIFtza2lwX2NoaWxsX3Rlc3RzXSB0aGVuIHsgY29udGludWUgfQorCitzZXQgdGVzdGZpbGUgInBvd2Vyc2V0Igorc2V0IHNyY2ZpbGUgJHtzcmNkaXJ9LyRzdWJkaXIvJHt0ZXN0ZmlsZX0uY2gKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0uZXhlCitpZiAgeyBbY29tcGlsZSAiJHtzcmNmaWxlfSAtZyAtdyAtbyAke2JpbmZpbGV9ICR7Q0hJTExfUlQwfSAke0NISUxMX0xJQn0iXSAhPSAiIiB9IHsKKyAgICBwZXJyb3IgIkNvdWxkbid0IGNvbXBpbGUgJHtzcmNmaWxlfSIKKyAgICByZXR1cm4gLTEKK30KKworIyBTZXQgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgdG8gY2hpbGwuICBUaGlzIGNvdW50cyBhcyBhIHRlc3QuICBJZiBpdAorIyBmYWlscywgdGhlbiB3ZSBza2lwIHRoZSBvdGhlciB0ZXN0cy4KKworcHJvYyBzZXRfbGFuZ19jaGlsbCB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgYmluZmlsZSBvYmpkaXIgc3ViZGlyCisKKyAgICB2ZXJib3NlICJsb2FkaW5nIGZpbGUgJyRiaW5maWxlJyIKKyAgICBnZGJfbG9hZCAkYmluZmlsZQorICAgIHNlbmRfZ2RiICJzZXQgbGFuZ3VhZ2UgY2hpbGxcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIge30KKwl0aW1lb3V0IHsgZmFpbCAic2V0IGxhbmd1YWdlIGNoaWxsICh0aW1lb3V0KSIgOyByZXR1cm4gMCB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInNob3cgbGFuZ3VhZ2VcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qIHNvdXJjZSBsYW5ndWFnZSBpcyBcImNoaWxsXCIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAic2V0IGxhbmd1YWdlIHRvIFwiY2hpbGxcIiIKKwkgICAgc2VuZF9nZGIgImJyZWFrIHh4X1xuIgorCSAgICBnZGJfZXhwZWN0IHsKKwkJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkJICAgIHNlbmRfZ2RiICJydW5cbiIgCisJCSAgICBnZGJfZXhwZWN0IC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorCQkgICAgcmV0dXJuIDEKKwkJfQorCQl0aW1lb3V0IHsKKwkJICAgIGZhaWwgImNhbid0IHNldCBicmVha3BvaW50ICh0aW1lb3V0KSIKKwkJICAgIHJldHVybiAwCisJCX0KKwkgICAgfQorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJzZXR0aW5nIGxhbmd1YWdlIHRvIFwiY2hpbGxcIiIKKwkgICAgcmV0dXJuIDAKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgImNhbid0IHNob3cgbGFuZ3VhZ2UgKHRpbWVvdXQpIgorCSAgICByZXR1cm4gMAorCX0KKyAgICB9Cit9CisKKyMgVGVzdGluZyBwcmludGluZyBvZiBhIHNwZWNpZmljIHZhbHVlLiAgSW5jcmVtZW50IHBhc3Njb3VudCBmb3IKKyMgc3VjY2VzcyBvciBpc3N1ZSBmYWlsIG1lc3NhZ2UgZm9yIGZhaWx1cmUuICBJbiBib3RoIGNhc2VzLCByZXR1cm4KKyMgYSAxIHRvIGluZGljYXRlIHRoYXQgbW9yZSB0ZXN0cyBjYW4gcHJvY2VlZC4gIEhvd2V2ZXIgYSB0aW1lb3V0CisjIGlzIGEgc2VyaW91cyBlcnJvciwgZ2VuZXJhdGVzIGEgc3BlY2lhbCBmYWlsIG1lc3NhZ2UsIGFuZCBjYXVzZXMKKyMgYSAwIHRvIGJlIHJldHVybmVkIHRvIGluZGljYXRlIHRoYXQgbW9yZSB0ZXN0cyBhcmUgbGlrZWx5IHRvIGZhaWwKKyMgYXMgd2VsbC4KKyMKKyMgQXJncyBhcmU6CisjCisjCUZpcnN0IG9uZSBpcyBzdHJpbmcgdG8gc2VuZF9nZGIgdG8gZ2RiCisjCVNlY29uZCBvbmUgaXMgc3RyaW5nIHRvIG1hdGNoIGdkYiByZXN1bHQgdG8KKyMJVGhpcmQgb25lIGlzIGFuIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYmUgcHJpbnRlZAorCitwcm9jIHRlc3RfcHJpbnRfYWNjZXB0IHsgYXJncyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBwYXNzY291bnQKKyAgICBnbG9iYWwgdmVyYm9zZQorCisgICAgaWYgW2xsZW5ndGggJGFyZ3NdPT0zIHRoZW4geworCXNldCBtZXNzYWdlIFtsaW5kZXggJGFyZ3MgMl0KKyAgICB9IGVsc2UgeworCXNldCBtZXNzYWdlIFtsaW5kZXggJGFyZ3MgMF0KKyAgICB9CisgICAgc2V0IHNlbmR0aGlzIFtsaW5kZXggJGFyZ3MgMF0KKyAgICBzZXQgZXhwZWN0dGhpcyBbbGluZGV4ICRhcmdzIDFdCisgICAgc2V0IHJlc3VsdCBbZ2RiX3Rlc3QgJHNlbmR0aGlzICIuKiA9ICR7ZXhwZWN0dGhpc30iICRtZXNzYWdlXQorICAgIGlmICRyZXN1bHQ9PTAge2luY3IgcGFzc2NvdW50fQorICAgIHJldHVybiAkcmVzdWx0Cit9CisKK3Byb2MgdGVzdF9jYXJkIHt9IHsKKyAgICBnbG9iYWwgcGFzc2NvdW50CisKKyAgICB2ZXJib3NlICJ0ZXN0aW5nIGJ1aWx0aW4gQ0FSRCIKKyAgICBzZXQgcGFzc2NvdW50IDAKKworICAgICMgZGlzY3JldGUgbW9kZSBuYW1lcworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBjYXJkKHZfcHMxKSIgIjQiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGNhcmQodl9wczIpIiAiMTUiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGNhcmQodl9wczMpIiAiNCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgY2FyZCh2X3BzNCkiICIxMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgY2FyZCh2X3BzNSkiICIxIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBjYXJkKHZfcHM1MSkiICIwIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBjYXJkKHZfcHM2KSIgIjEwMSIKKworICAgICMgYSBmYWlsdXJlCisgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBjYXJkKG1fcHMxKSIgInR5cGVuYW1lIGluIGludmFsaWQgY29udGV4dCIKK30KKworcHJvYyB0ZXN0X21pbiB7fSB7CisgICAgZ2xvYmFsIHBhc3Njb3VudAorCisgICAgdmVyYm9zZSAidGVzdGluZyBidWlsdGluIE1JTiIKKyAgICBzZXQgcGFzc2NvdW50IDAKKworICAgICMgZGlzY3JldGUgbW9kZSBuYW1lcworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBtaW4odl9wczEpIiAiMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbWluKHZfcHMyKSIgIi0xMDAiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IG1pbih2X3BzMykiICJiYiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbWluKHZfcHM0KSIgIicsJyIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbWluKHZfcHM1KSIgIkZBTFNFIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBtaW4odl9wczYpIiAiLTUwIgorCisgICAgIyBhIGZhaWx1cmUKKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IG1pbih2X3BzNTEpIiAiTUlOIGZvciBlbXB0eSBwb3dlcnNldCIKKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IG1pbihtX3BzMSkiICJ0eXBlbmFtZSBpbiBpbnZhbGlkIGNvbnRleHQiCit9CisKK3Byb2MgdGVzdF9tYXgge30geworICAgIGdsb2JhbCBwYXNzY291bnQKKworICAgIHZlcmJvc2UgInRlc3RpbmcgYnVpbHRpbiBNSU4iCisgICAgc2V0IHBhc3Njb3VudCAwCisKKyAgICAjIGRpc2NyZXRlIG1vZGUgbmFtZXMKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbWF4KHZfcHMxKSIgIjciCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IG1heCh2X3BzMikiICIxMDAiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IG1heCh2X3BzMykiICJpaSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbWF4KHZfcHM0KSIgIid6JyIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbWF4KHZfcHM1KSIgIkZBTFNFIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBtYXgodl9wczYpIiAiNTAiCisKKyAgICAjIHRlc3QgYW4gSU4KKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgMCBpbiB2X3BzNiIgIlRSVUUiCisKKyAgICAjIGEgZmFpbHVyZQorICAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgbWF4KHZfcHM1MSkiICJNQVggZm9yIGVtcHR5IHBvd2Vyc2V0IgorfQorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCitnZGJfdGVzdCAic2V0IHByaW50IHNldmVuYml0LXN0cmluZ3MiICIuKiIKKworaWYgW3NldF9sYW5nX2NoaWxsXSB0aGVuIHsKKyAgICAjIHRlc3QgYnVpbHRpbnMgYXMgZGVzY3JpYmVkIGluIGNoYXB0ZXIgNi4yMC4zIFouMjAwCisgICAgdGVzdF9jYXJkCisgICAgdGVzdF9taW4KKyAgICB0ZXN0X21heAorfSBlbHNlIHsKKyAgICB3YXJuaW5nICIkdGVzdF9uYW1lIHRlc3RzIHN1cHByZXNzZWQuIgorfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNDk3NS1ncnQuY2ggYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci00OTc1LWdydC5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzk2MzYyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNDk3NS1ncnQuY2gKQEAgLTAsMCArMSwxMyBAQAorZ2RiX2J1Z19ncnQ6IE1PRFVMRQorTkVXTU9ERSBpc19jaGFubmVsX3R5cGUgPSBTRVQgKGNoYW5fMSwKKyAgICAgY2hhbl8yLAorICAgICBjaGFuXzMsCisgICAgIGNoYW5fNCwKKyAgICAgY2hhbl81LAorICAgICBjaGFuXzYsCisgICAgIGNoYW5fNywKKyAgICAgY2hhbl84LAorICAgICBjaGFuXzksCisgICAgIGNoYW5fMTApOworR1JBTlQgaXNfY2hhbm5lbF90eXBlOworRU5EOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNDk3NS5jaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTQ5NzUuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiYTA2NAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTQ5NzUuY2gKQEAgLTAsMCArMSw0MyBAQAorLyoKKz5OdW1iZXI6ICAgICAgICAgNDk3NQorPkNhdGVnb3J5OiAgICAgICBjaGlsbAorPlN5bm9wc2lzOiAgICAgICBTZWdtZW50YXRpb24gZmF1bHQgb2YgZ2RiIDQuMTIuMQorPkRlc2NyaXB0aW9uOgorCisgICAgUHJvYmxlbTogZ2RiIDQuMTIuMSBzZWdtZW50IGZhdWx0cyB3aXRoIGZvbGxvd2luZyBjaGlsbCBwcm9ncmFtLgorKi8KKworZ2RiX2J1ZzogTU9EVUxFCisKKzw+IFVTRV9TRUlaRV9GSUxFICJwci00OTc1LWdydC5ncnQiIDw+CitTRUlaRSBpc19jaGFubmVsX3R5cGU7CisKKyAgU1lOTU9ERSBjaGFuX3R5cGUgPSBQT1dFUlNFVCBpc19jaGFubmVsX3R5cGU7CisgIFNZTiAgICAgaHVnbyBjaGFuX3R5cGUgPSBbY2hhbl8xLCBjaGFuXzNdOworCitEQ0wgb3R0byBpc19jaGFubmVsX3R5cGUgOj0gY2hhbl8yOworCit4OiBQUk9DICgpOworCisgIElGIG90dG8gSU4gaHVnbyBUSEVOCisgICAgV1JJVEVURVhUIChTVERPVVQsICJvdHRvIElOIGh1Z28lLyIpOworICBFTFNFCisgICAgV1JJVEVURVhUIChTVERPVVQsICJZb3UgbG9vc2UlLyIpOworICBGSTsKK0VORCB4OworCit4ICgpOworCitFTkQgZ2RiX2J1ZzsKKy8qCitDb21waWxlZCB3aXRoOgorCisgICBjaGlsbCAtUyAtZmdyYW50LW9ubHkgcHItMzE1LWdydC5jaAorICAgY2hpbGwgLWcgLW8gcHItMzE1IHByLTMxNS5jaAorCitSdW4gZ2RiIHdpdGgKKworICAgZ2RiIHByLTMxNSAtLXJlYWRub3cKKword2lsbCByZXN1bHQgaW4gYSBzaWdzZWd2IGluIGZpbGUgZ2RidHlwZXMuYyBmdW5jdGlvbiBmb3JjZV90b19yYW5nZV90eXBlLgorKi8KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTQ5NzUuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNDk3NS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5ZTdkYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTQ5NzUuZXhwCkBAIC0wLDAgKzEsNjcgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBQZXIgQm90aG5lci4gKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK2lmIFtza2lwX2NoaWxsX3Rlc3RzXSB0aGVuIHsgY29udGludWUgfQorCitzZXQgdGVzdGZpbGUyICJwci00OTc1LWdydCIKK3NldCBzcmNmaWxlMiAke3NyY2Rpcn0vJHN1YmRpci8ke3Rlc3RmaWxlMn0uY2gKK3NldCBvYmpmaWxlMiAke29iamRpcn0vJHN1YmRpci8ke3Rlc3RmaWxlMn0ubworaWYgIHsgW2NvbXBpbGUgIiR7c3JjZmlsZTJ9IC1nIC1jIC1vICR7b2JqZmlsZTJ9Il0gIT0gIiIgfSB7CisgICAgcGVycm9yICJDb3VsZG4ndCBjb21waWxlICR7c3JjZmlsZTJ9IgorICAgIHJldHVybiAtMQorfQorCitzZXQgdGVzdGZpbGUgInByLTQ5NzUiCitzZXQgc3JjZmlsZSAke3NyY2Rpcn0vJHN1YmRpci8ke3Rlc3RmaWxlfS5jaAorc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5leGUKK2lmICB7IFtjb21waWxlICIke3NyY2ZpbGV9IC1nICR7b2JqZmlsZTJ9IC1vICR7YmluZmlsZX0gJHtDSElMTF9SVDB9ICR7Q0hJTExfTElCfSJdICE9ICIiIH0geworICAgIHBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3NyY2ZpbGV9IgorICAgIHJldHVybiAtMQorfQorCitwcm9jIGRvX3Rlc3RzIHt9IHsKKyAgICBnbG9iYWwgcHJtc19pZCBidWdfaWQgc3ViZGlyIG9iamRpciBzcmNkaXIgYmluZmlsZSBnZGJfcHJvbXB0CisKKyAgICBzZXQgcHJtc19pZCAwCisgICAgc2V0IGJ1Z19pZCAwCisKKyAgICAjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKKyAgICBnZGJfZXhpdAorICAgIGdkYl9zdGFydAorICAgIGdkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorICAgIGdkYl9sb2FkICRiaW5maWxlCisKKyAgICBnZGJfdGVzdCAic2V0IGxhbmd1YWdlIGNoaWxsIiAiIgorCisgICAgIyBUaGlzIGlzIG5lZWRlZCAoYXQgbGVhc3Qgb24gU3VuT1M0KSB0byBtYWtlIHN1cmUgdGhlCisgICAgIyB0aGUgc3ltYm9sIHRhYmxlIGlzIHJlYWQuCisgICAgcnVudG8gIngiCisgICAgIyAiWW91IGxvb3NlIj8gIFdoeSwgdGhhbmsgeW91LiAgKEJ1dCBJIHN1c3BlY3QgIllvdSBsb3NlIiBtaWdodCBoYXZlCisgICAgIyBiZWVuIHdoYXQgd2FzIGludGVuZGVkKS4KKyAgICBnZGJfdGVzdCAiZmluaXNoIiAiWW91IGxvb3NlLioiICJSdW5zIGFuZCByZWFkcyBzeW1ib2xzIE9LIgorfQorCitkb190ZXN0cwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNTAxNi5jaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTUwMTYuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmNDllOAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTUwMTYuY2gKQEAgLTAsMCArMSwyNCBAQAordmVjdG9yOiBNT0RVTEUKKworU1lOTU9ERSBtX2luZGV4ID0gUkFOR0UoMToxMCk7CitORVdNT0RFIHZlY3RvciA9IEFSUkFZIChtX2luZGV4KSBJTlQ7CisKK0RDTCBhLCBiLCBjIHZlY3RvcjsKKworZHVtcDogUFJPQyggYSB2ZWN0b3IgTE9DLCBjIENIQVIgKTsKKyAgRENMIGkgbV9pbmRleCA6PSA1OworICBETyBGT1IgaSBJTiBtX2luZGV4OworICAgIFdSSVRFVEVYVCggU1RET1VULCAiJUMoJUMpPSVDICIsIGMsIGksIGEoaSkgKTsKKyAgT0Q7CisgIFdSSVRFVEVYVCggU1RET1VULCAiJS8iICk7CitFTkQgZHVtcDsKKworYSA6PSB2ZWN0b3IgWyAxLCAtMSwgMiwgLTIsIDMsIC0zLCA0LCAtNCwgNSwgLTUgXTsKK2IgOj0gYTsKK2IoNCkgOj0gNDsKK2IoNykgOj0gNzsKK2MgOj0gdmVjdG9yIFsoKik6IDBdOworCitkdW1wKGEsJ2EnKTsKKworRU5EIHZlY3RvcjsKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTUwMTYuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNTAxNi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4NGQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTUwMTYuZXhwCkBAIC0wLDAgKzEsNjIgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBQZXIgQm90aG5lci4gKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK2lmIFtza2lwX2NoaWxsX3Rlc3RzXSB0aGVuIHsgY29udGludWUgfQorCitzZXQgdGVzdGZpbGUgInByLTUwMTYiCitzZXQgc3JjZmlsZSAke3NyY2Rpcn0vJHN1YmRpci8ke3Rlc3RmaWxlfS5jaAorc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5leGUKK2lmICB7IFtjb21waWxlICIke3NyY2ZpbGV9IC1nIC1vICR7YmluZmlsZX0gJHtDSElMTF9SVDB9ICR7Q0hJTExfTElCfSJdICE9ICIiIH0geworICAgIHBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3NyY2ZpbGV9IgorICAgIHJldHVybiAtMQorfQorCitwcm9jIGRvX3Rlc3RzIHt9IHsKKyAgICBnbG9iYWwgcHJtc19pZCBidWdfaWQgc3ViZGlyIG9iamRpciBzcmNkaXIgYmluZmlsZSBnZGJfcHJvbXB0CisKKyAgICBzZXQgcHJtc19pZCAwCisgICAgc2V0IGJ1Z19pZCAwCisKKyAgICAjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKKyAgICBnZGJfZXhpdAorICAgIGdkYl9zdGFydAorICAgIGdkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorICAgIGdkYl9sb2FkICRiaW5maWxlCisKKyAgICBnZGJfdGVzdCAic2V0IGxhbmd1YWdlIGNoaWxsIiAiIgorCisgICAgcnVudG8gZHVtcAorICAgICMgTGludXggdGhpbmtzIHR5cGUgaXMgIl9jaW50IiAoYW5kIHNvIGRvZXMgc3BhcmMtc3VuLXN1bm9zNCwgYWxwaGEtZGVjLW9zZjIuMCkKKyAgICAjc2V0dXBfeGZhaWwgImkqODYtcGMtbGludXgqLWdudSIgInNwYXJjLXN1bi1zdW5vczQqIiAiYWxwaGEtZGVjLW9zZjIqIgorICAgIGdkYl90ZXN0ICJ3aGF0aXMgaSIgInR5cGUgPSBtX2luZGV4IiAid2hhdGlzIGludC1yYW5nZSIKKyAgICBnZGJfdGVzdF9leGFjdCAicHR5cGUgbV9pbmRleCIgInR5cGUgPSBSQU5HRSAoMToxMCkiICJwdHlwZSBtX2luZGV4IgorICAgIGdkYl90ZXN0X2V4YWN0ICJ3aGF0aXMgYSIgInR5cGUgPSAvKkxPQyovIHZlY3RvciIKKyAgICBnZGJfdGVzdCAicHR5cGUgYSIgInR5cGUgPSAvXFwqTE9DXFwqLyBBUlJBWSBcXCgxOjEwXFwpIChJTlR8aW50KSIKKyAgICBnZGJfdGVzdCAic3RlcCIgIiIKKyAgICBnZGJfdGVzdF9leGFjdCAid2hhdGlzIGkiICJ0eXBlID0gbG9uZyIgIndoYXRpcyBsb29wIGNvdW50ZXIgaSIKK30KKworZG9fdGVzdHMKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTUwMjAuY2ggYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci01MDIwLmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYmE3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci01MDIwLmNoCkBAIC0wLDAgKzEsMTkgQEAKKworUFJfNTAyMDogTU9EVUxFCisgIGR1bW15X3ByXzUwMjA6IFBST0MgKCk7CisgIEVORDsKKyAgTkVXTU9ERSB4ID0gU1RSVUNUIChsIExPTkcsIGIgQk9PTCk7CisgIE5FV01PREUgYXNldCA9IFNFVCAoYWEsIGJiKTsKKworICBEQ0wgeSBBUlJBWSAoJ2EnOidiJykgeDsKKyAgRENMIHNldGFyciBBUlJBWSAoYXNldCkgeDsKKyAgRENMIGludGFyciBBUlJBWSgxMDoxMSkgeDsKKyAgRENMIGJvb2xhcnIgQVJSQVkgKEJPT0wpIHg7CisKKyAgeSgnYScpLmwsIHNldGFycihhYSkubCwgaW50YXJyKDEwKS5sLCBib29sYXJyKEZBTFNFKS5sIDo9IDEwOworICB5KCdhJykuYiwgc2V0YXJyKGFhKS5iLCBpbnRhcnIoMTApLmIsIGJvb2xhcnIoRkFMU0UpLmIgOj0gVFJVRTsKKyAgeSgnYicpLmwsIHNldGFycihiYikubCwgaW50YXJyKDExKS5sLCBib29sYXJyKFRSVUUpLmwgOj0gMTExOworICB5KCdiJykuYiwgc2V0YXJyKGJiKS5iLCBpbnRhcnIoMTEpLmIsIGJvb2xhcnIoVFJVRSkuYiA6PSBGQUxTRTsKKworICBkdW1teV9wcl81MDIwICgpOworRU5EOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNTAyMC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci01MDIwLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWRlY2UzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNTAyMC5leHAKQEAgLTAsMCArMSw4NSBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFBlciBCb3RobmVyLiAoYm90aG5lckBjeWdudXMuY29tKQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworaWYgW3NraXBfY2hpbGxfdGVzdHNdIHRoZW4geyBjb250aW51ZSB9CisKK3NldCB0ZXN0ZmlsZSAicHItNTAyMCIKK3NldCBzcmNmaWxlICR7c3JjZGlyfS8kc3ViZGlyLyR7dGVzdGZpbGV9LmNoCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LmV4ZQoraWYgIHsgW2NvbXBpbGUgIiR7c3JjZmlsZX0gLWcgLW8gJHtiaW5maWxlfSAke0NISUxMX1JUMH0gJHtDSElMTF9MSUJ9Il0gIT0gIiIgfSB7CisgICAgcGVycm9yICJDb3VsZG4ndCBjb21waWxlICR7c3JjZmlsZX0iCisgICAgcmV0dXJuIC0xCit9CisKK3Byb2MgZG9fdGVzdHMge30geworICAgIGdsb2JhbCBwcm1zX2lkIGJ1Z19pZCBzdWJkaXIgb2JqZGlyIHNyY2RpciBiaW5maWxlIGdkYl9wcm9tcHQKKworICAgIHNldCBwcm1zX2lkIDAKKyAgICBzZXQgYnVnX2lkIDAKKworICAgICMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworICAgIGdkYl9leGl0CisgICAgZ2RiX3N0YXJ0CisgICAgZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisgICAgZ2RiX2xvYWQgJGJpbmZpbGUKKworICAgIGdkYl90ZXN0ICJzZXQgbGFuZ3VhZ2UgY2hpbGwiICIiCisKKyAgICAjIFRoaXMgaXMgbmVlZGVkIChhdCBsZWFzdCBvbiBTdW5PUzQpIHRvIG1ha2Ugc3VyZSB0aGUKKyAgICAjIHRoZSBzeW1ib2wgdGFibGUgaXMgcmVhZC4KKyAgICBnZGJfdGVzdCAiYnJlYWsgY2hpbGx2YXJzLmNoOjMiICIiCisgICAgZ2RiX3Rlc3QgImRlbGV0ZSAxIiAiIgorCisgICAgZ2RiX3Rlc3QgInNldCB3aWR0aCAwIiAiIgorICAgIGdkYl90ZXN0ICJzZXQgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncyIgIiIKKyAgICBnZGJfdGVzdCAic2V0IHByaW50IGFkZHJlc3Mgb2ZmIiAiIgorCisgICAgdGVzdF9wcl81MDIwCit9CisKK3Byb2MgdGVzdF9wcl81MDIwIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIHJ1bnRvIGR1bW15X3ByXzUwMjAKKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgeSIgXAorCXs9IFsoJ2EnKTogWy5sOiAxMCwgLmI6IFRSVUVdLCAoJ2InKTogWy5sOiAxMTEsIC5iOiBGQUxTRV1dfQorICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCBib29sYXJyIiBcCisJez0gWyhGQUxTRSk6IFsubDogMTAsIC5iOiBUUlVFXSwgKFRSVUUpOiBbLmw6IDExMSwgLmI6IEZBTFNFXV19CisgICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IGludGFyciIgXAorCXs9IFsoMTApOiBbLmw6IDEwLCAuYjogVFJVRV0sICgxMSk6IFsubDogMTExLCAuYjogRkFMU0VdXX0KKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgc2V0YXJyIiBcCisJez0gWyhhYSk6IFsubDogMTAsIC5iOiBUUlVFXSwgKGJiKTogWy5sOiAxMTEsIC5iOiBGQUxTRV1dfQorICAgIGdkYl90ZXN0ICJzZXQgcHJpbnQgcHJldHR5IiAiIgorICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCB5IiBcCit7PSBbKCdhJyk6IFsNCisgICAgLmw6IDEwLCANCisgICAgLmI6IFRSVUUNCisgIF0sICgnYicpOiBbDQorICAgIC5sOiAxMTEsIA0KKyAgICAuYjogRkFMU0UNCisgIF1dfSAicHJpbnQgeSBwcmV0dHkiCit9CisKK2RvX3Rlc3RzCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci01MDIyLmNoIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNTAyMi5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWFhZDRlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNTAyMi5jaApAQCAtMCwwICsxLDEyIEBACitQUl81MDIyOiBNT0RVTEUKKyAgZHVtbXlfcHJfNTAyMjogUFJPQyAoKTsKKyAgRU5EOworICBEQ0wgcCBQVFI7CisgIERDTCBpIElOVDsKKworICBwIDo9IE5VTEw7CisgIGR1bW15X3ByXzUwMjIgKCk7CisgIGkgOj0gMTM7CisgIHAgOj0gLT5pOworICBkdW1teV9wcl81MDIyICgpOworRU5EOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNTAyMi5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci01MDIyLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTdlMzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNTAyMi5leHAKQEAgLTAsMCArMSw3MCBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFBlciBCb3RobmVyLiAoYm90aG5lckBjeWdudXMuY29tKQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworaWYgW3NraXBfY2hpbGxfdGVzdHNdIHRoZW4geyBjb250aW51ZSB9CisKK3NldCB0ZXN0ZmlsZSAicHItNTAyMiIKK3NldCBzcmNmaWxlICR7c3JjZGlyfS8kc3ViZGlyLyR7dGVzdGZpbGV9LmNoCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LmV4ZQoraWYgIHsgW2NvbXBpbGUgIiR7c3JjZmlsZX0gLWcgLW8gJHtiaW5maWxlfSAke0NISUxMX1JUMH0gJHtDSElMTF9MSUJ9Il0gIT0gIiIgfSB7CisgICAgcGVycm9yICJDb3VsZG4ndCBjb21waWxlICR7c3JjZmlsZX0iCisgICAgcmV0dXJuIC0xCit9CisKK3Byb2MgZG9fdGVzdHMge30geworICAgIGdsb2JhbCBwcm1zX2lkIGJ1Z19pZCBzdWJkaXIgb2JqZGlyIHNyY2RpciBiaW5maWxlIGdkYl9wcm9tcHQKKworICAgIHNldCBwcm1zX2lkIDAKKyAgICBzZXQgYnVnX2lkIDAKKworICAgICMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworICAgIGdkYl9leGl0CisgICAgZ2RiX3N0YXJ0CisgICAgZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisgICAgZ2RiX2xvYWQgJGJpbmZpbGUKKworICAgIGdkYl90ZXN0ICJzZXQgbGFuZ3VhZ2UgY2hpbGwiICIiCisKKyAgICAjIFRoaXMgaXMgbmVlZGVkIChhdCBsZWFzdCBvbiBTdW5PUzQpIHRvIG1ha2Ugc3VyZSB0aGUKKyAgICAjIHRoZSBzeW1ib2wgdGFibGUgaXMgcmVhZC4KKyAgICBnZGJfdGVzdCAiYnJlYWsgZ2RibWUuY2g6MyIgIiIKKyAgICBnZGJfdGVzdCAiZGVsZXRlIDEiICIiCisKKyAgICBnZGJfdGVzdCAic2V0IHdpZHRoIDAiICIiCisgICAgZ2RiX3Rlc3QgInNldCBwcmludCBzZXZlbmJpdC1zdHJpbmdzIiAiIgorCisgICAgdGVzdF9wcl81MDIyCit9CisKK3Byb2MgdGVzdF9wcl81MDIyIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIHJ1bnRvIGR1bW15X3ByXzUwMjIKKyAgICBnZGJfdGVzdCAicCBwIiAiID0gTlVMTCIgInByaW50IE5VTEwgcG9pbnRlciIKKyAgICBnZGJfdGVzdCAiY29udGludWUiICIiCisgICAgZ2RiX3Rlc3QgInAgcCIgez0gUFRSXChIJ1swLTlhLWZBLUZdK1wpfSAicHJpbnQgbm9uLU5VTEwgcG9pbnRlciIKK30KKworZG9fdGVzdHMKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTU2NDYtZ3J0LmNoIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNTY0Ni1ncnQuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhOTAwMgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTU2NDYtZ3J0LmNoCkBAIC0wLDAgKzEsNSBAQAoreDogTU9EVUxFCitORVdNT0RFIGFfc2V0ID0gU0VUIChhLCBiLCBjLCBkKTsKK05FV01PREUgYV9wcyA9IFBPV0VSU0VUIGFfc2V0OworR1JBTlQgYV9wczsKK0VORDsKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTU2NDYuY2ggYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci01NjQ2LmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMTRjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci01NjQ2LmNoCkBAIC0wLDAgKzEsMTUgQEAKK3k6IE1PRFVMRQorCis8PiBVU0VfU0VJWkVfRklMRSAicHItNTY0Ni1ncnQuZ3J0IiA8PgorU0VJWkUgYV9wczsKKworcDogUFJPQyAoKTsKKworICBEQ0wgeHggYV9wczsKKworICB4eCA6PSBbYSwgYl07CitFTkQgcDsKKworcCgpOworCitFTkQgeTsKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTU2NDYuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNTY0Ni5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4YjM2YQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTU2NDYuZXhwCkBAIC0wLDAgKzEsNjQgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBQZXIgQm90aG5lci4gKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK2lmIFtza2lwX2NoaWxsX3Rlc3RzXSB0aGVuIHsgY29udGludWUgfQorCitzZXQgdGVzdGZpbGUyICJwci01NjQ2LWdydCIKK3NldCBzcmNmaWxlMiAke3NyY2Rpcn0vJHN1YmRpci8ke3Rlc3RmaWxlMn0uY2gKK3NldCBvYmpmaWxlMiAke29iamRpcn0vJHN1YmRpci8ke3Rlc3RmaWxlMn0ubworaWYgIHsgW2NvbXBpbGUgIiR7c3JjZmlsZTJ9IC1nIC1jIC1vICR7b2JqZmlsZTJ9Il0gIT0gIiIgfSB7CisgICAgcGVycm9yICJDb3VsZG4ndCBjb21waWxlICR7c3JjZmlsZTJ9IgorICAgIHJldHVybiAtMQorfQorCitzZXQgdGVzdGZpbGUgInByLTU2NDYiCitzZXQgc3JjZmlsZSAke3NyY2Rpcn0vJHN1YmRpci8ke3Rlc3RmaWxlfS5jaAorc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5leGUKK2lmICB7IFtjb21waWxlICIke3NyY2ZpbGV9IC1nICR7b2JqZmlsZTJ9IC1vICR7YmluZmlsZX0gJHtDSElMTF9SVDB9ICR7Q0hJTExfTElCfSJdICE9ICIiIH0geworICAgIHBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3NyY2ZpbGV9IgorICAgIHJldHVybiAtMQorfQorCitwcm9jIGRvX3Rlc3RzIHt9IHsKKyAgICBnbG9iYWwgcHJtc19pZCBidWdfaWQgc3ViZGlyIG9iamRpciBzcmNkaXIgYmluZmlsZSBnZGJfcHJvbXB0CisKKyAgICBzZXQgcHJtc19pZCAwCisgICAgc2V0IGJ1Z19pZCAwCisKKyAgICAjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKKyAgICBnZGJfZXhpdAorICAgIGdkYl9zdGFydAorICAgIGdkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorICAgIGdkYl9sb2FkICRiaW5maWxlCisKKyAgICBnZGJfdGVzdCAic2V0IGxhbmd1YWdlIGNoaWxsIiAiIgorCisgICAgcnVudG8gcAorICAgIGdkYl90ZXN0ICJuZXh0IiAiIgorICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCB4eCIgez0gW2E6Yl19Cit9CisKK2RvX3Rlc3RzCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci01OTg0LmNoIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNTk4NC5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTc0YTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNTk4NC5jaApAQCAtMCwwICsxLDggQEAKK3g6IG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxpbmUgMQorICBwOnByb2MgKHQgY2hhciAoMjApIHZhcnlpbmcpOyAgLS0gICAgICAyCisJICB3cml0ZXRleHQoc3Rkb3V0LCB0KTsgIC0tICAgICAgMworICBlbmQgcDsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gICAgICA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgICAgIDUKKyAgcCgiSmFzb24gRGFyay4lLyIpOyAgICAgICAgICAgIC0tICAgICAgNgorICBwKCJIZWxsbyBXb3JsZC4lLyIpOyAgICAgICAgICAgLS0gICAgICA3CitlbmQgeDsgICAgICAgIApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNTk4NC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci01OTg0LmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGVhMzdlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNTk4NC5leHAKQEAgLTAsMCArMSw1NyBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFBlciBCb3RobmVyLiAoYm90aG5lckBjeWdudXMuY29tKQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworaWYgW3NraXBfY2hpbGxfdGVzdHNdIHRoZW4geyBjb250aW51ZSB9CisKK3NldCB0ZXN0ZmlsZSAicHItNTk4NCIKK3NldCBzcmNmaWxlICR7c3JjZGlyfS8kc3ViZGlyLyR7dGVzdGZpbGV9LmNoCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LmV4ZQoraWYgIHsgW2NvbXBpbGUgIiR7c3JjZmlsZX0gLWcgLW8gJHtiaW5maWxlfSAke0NISUxMX1JUMH0gJHtDSElMTF9MSUJ9Il0gIT0gIiIgfSB7CisgICAgcGVycm9yICJDb3VsZG4ndCBjb21waWxlICR7c3JjZmlsZX0iCisgICAgcmV0dXJuIC0xCit9CisKK3Byb2MgZG9fdGVzdHMge30geworICAgIGdsb2JhbCBwcm1zX2lkIGJ1Z19pZCBzdWJkaXIgb2JqZGlyIHNyY2RpciBiaW5maWxlIGdkYl9wcm9tcHQKKworICAgIHNldCBwcm1zX2lkIDAKKyAgICBzZXQgYnVnX2lkIDAKKworICAgICMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworICAgIGdkYl9leGl0CisgICAgZ2RiX3N0YXJ0CisgICAgZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisgICAgZ2RiX2xvYWQgJGJpbmZpbGUKKworICAgIHNlbmRfZ2RiICJzZXQgbGFuZ3VhZ2UgY2hpbGxcbiIgOyAKKworICAgIGdkYl90ZXN0ICJicmVhayBwci01OTg0LmNoOjYiICIiCisgICAgc2VuZF9nZGIgInJ1blxuIjsgZ2RiX2V4cGVjdCAtcmUgIkJyZWFrcG9pbnQgLipwci01OTg0LmNoOjYiCisgICAgZ2RiX2V4cGVjdCAtcmUgIiRnZGJfcHJvbXB0ICQiCisgICAgZ2RiX3Rlc3QgIm5leHQiICJKYXNvbiBEYXJrLioiICJuZXh0IG92ZXIgSmFzb24gRGFyayIKK30KKworZG9fdGVzdHMKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTYyOTIuY2ggYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci02MjkyLmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZWQ5NTMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci02MjkyLmNoCkBAIC0wLDAgKzEsMTcgQEAKK2hhY2sgOiBtb2R1bGUKKworZGNsIGkgaW50OworCitmcmVkIDogcHJvYyAoYSBpbnQgaW4sIGIgaW50IGxvYyk7CisgIHdyaXRldGV4dChzdGRvdXQsICJhIHdhcyAnJUMnOyBiIHdhcyAnJUMnLiUvIiwgYSwgYik7CisgIGIgKyA6PSAxOworZW5kIGZyZWQ7CisKK2tsYXVzIDogcHJvYyAoKTsKKyAgd3JpdGV0ZXh0KHN0ZG91dCwgImhlcmUncyBrbGF1cyBjYWxsaW5nLiUvIik7CitlbmQga2xhdXM7CisKK2k6PTEyOword3JpdGV0ZXh0KHN0ZG91dCwgImRvbmUuJS8iKTsKKworZW5kIGhhY2s7CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci02MjkyLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTYyOTIuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMjc2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci02MjkyLmV4cApAQCAtMCwwICsxLDU4IEBACisjIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIuIChib3RobmVyQGN5Z251cy5jb20pCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitpZiBbc2tpcF9jaGlsbF90ZXN0c10gdGhlbiB7IGNvbnRpbnVlIH0KKworc2V0IHRlc3RmaWxlICJwci02MjkyIgorc2V0IHNyY2ZpbGUgJHtzcmNkaXJ9LyRzdWJkaXIvJHt0ZXN0ZmlsZX0uY2gKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0uZXhlCitpZiAgeyBbY29tcGlsZSAiJHtzcmNmaWxlfSAtZyAtbyAke2JpbmZpbGV9ICR7Q0hJTExfUlQwfSAke0NISUxMX0xJQn0iXSAhPSAiIiB9IHsKKyAgICBwZXJyb3IgIkNvdWxkbid0IGNvbXBpbGUgJHtzcmNmaWxlfSIKKyAgICByZXR1cm4gLTEKK30KKworcHJvYyBkb190ZXN0cyB7fSB7CisgICAgZ2xvYmFsIHBybXNfaWQgYnVnX2lkIHN1YmRpciBvYmpkaXIgc3JjZGlyIGJpbmZpbGUgZ2RiX3Byb21wdAorCisgICAgc2V0IHBybXNfaWQgMAorICAgIHNldCBidWdfaWQgMAorCisgICAgIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKyAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKyAgICBnZGJfbG9hZCAkYmluZmlsZQorCisgICAgc2VuZF9nZGIgInNldCBsYW5ndWFnZSBjaGlsbFxuIiA7IAorCisgICAgZ2RiX3Rlc3QgImJyZWFrIHByLTYyOTIuY2g6MTUiICIiCisgICAgc2VuZF9nZGIgInJ1blxuIjsgZ2RiX2V4cGVjdCAtcmUgIkJyZWFrcG9pbnQgLipwci02MjkyLmNoOjE1LiokZ2RiX3Byb21wdCAkIgorICAgIGdkYl90ZXN0X2V4YWN0ICJjYWxsIGtsYXVzKCkiIHtoZXJlJ3Mga2xhdXMgY2FsbGluZy59CisgICAgZ2RiX3Rlc3Qge3NldCBmcmVkKDEwLCBpKX0ge2Egd2FzICcxMCc7IGIgd2FzICcxMicufQorICAgIGdkYl90ZXN0ICJwcmludCBpIiB7ID0gMTN9ICJwcmludCBpIGFmdGVyIGNhbGwiCit9CisKK2RvX3Rlc3RzCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci02NjMyLWdydC5jaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTY2MzItZ3J0LmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NDM0ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci02NjMyLWdydC5jaApAQCAtMCwwICsxLDM0IEBACittYXJrdXMxOiBNT0RVTEUKKworU1lOTU9ERSBtX2R1bW15ID0gU0VUIChkdW1teV8xLAorICAgICAgICAgICAgICAgICAgICAgICBkdW1teV8yLAorICAgICAgICAgICAgICAgICAgICAgICBkdW1teV8zLAorICAgICAgICAgICAgICAgICAgICAgICBkdW1teV80LAorICAgICAgICAgICAgICAgICAgICAgICBkdW1teV81LAorICAgICAgICAgICAgICAgICAgICAgICBkdW1teV82LAorICAgICAgICAgICAgICAgICAgICAgICBkdW1teV83LAorICAgICAgICAgICAgICAgICAgICAgICBkdW1teV84LAorICAgICAgICAgICAgICAgICAgICAgICBkdW1teV85LAorICAgICAgICAgICAgICAgICAgICAgICBkdW1teV8xMCwKKyAgICAgICAgICAgICAgICAgICAgICAgZHVtbXlfMTEsCisgICAgICAgICAgICAgICAgICAgICAgIGR1bW15XzEyLAorICAgICAgICAgICAgICAgICAgICAgICBkdW1teV8xMywKKyAgICAgICAgICAgICAgICAgICAgICAgZHVtbXlfMTQsCisgICAgICAgICAgICAgICAgICAgICAgIGR1bW15XzE1LAorICAgICAgICAgICAgICAgICAgICAgICBkdW1teV8xNiwKKyAgICAgICAgICAgICAgICAgICAgICAgZHVtbXlfMTcsCisgICAgICAgICAgICAgICAgICAgICAgIGR1bW15XzE4LAorICAgICAgICAgICAgICAgICAgICAgICBkdW1teV8xOSwKKyAgICAgICAgICAgICAgICAgICAgICAgZHVtbXlfMjAsCisgICAgICAgICAgICAgICAgICAgICAgIGR1bW15XzIxLAorICAgICAgICAgICAgICAgICAgICAgICBkdW1teV8yMiwKKyAgICAgICAgICAgICAgICAgICAgICAgZHVtbXlfMjMsCisgICAgICAgICAgICAgICAgICAgICAgIGR1bW15XzI0LAorICAgICAgICAgICAgICAgICAgICAgICBkdW1teV8yNSwKKyAgICAgICAgICAgICAgICAgICAgICAgZHVtbXlfMjYpOworCitTWU5NT0RFIG1fZHVtbXlfcmFuZ2UgPSBtX2R1bW15KGR1bW15XzYgOiBkdW1teV8yMik7CisKK0dSQU5UIG1fZHVtbXksIG1fZHVtbXlfcmFuZ2U7CisKK0VORCBtYXJrdXMxOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNjYzMi5jaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTY2MzIuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyYzdhZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTY2MzIuY2gKQEAgLTAsMCArMSwzMSBAQAorbWFya3VzOiBNT0RVTEUKKworPD4gVVNFX1NFSVpFX0ZJTEUgInByLTY2MzItZ3J0LmdydCIgPD4KK1NFSVpFIG1fZHVtbXksIG1fZHVtbXlfcmFuZ2U7CisKK0RDTCB2IG1fZHVtbXlfcmFuZ2U7CisKK05FV01PREUgaXNfc3RyX2Rlc2NyID0gU1RSVUNUIChwIFBUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsIElOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnIFNUUlVDVCAoeCBVQllURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSBTRVQgKGFhLCBiYiwgY2MsIGRkLCBlZSwgZmYpKSk7CitEQ0wgZGVzIGlzX3N0cl9kZXNjcjsKKworTkVXTU9ERSBpc19jYl9kZWJ1ZyA9IFNUUlVDVCAoaSBJTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIG1fZHVtbXlfcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwIFBUUik7CitORVdNT0RFIGlzX2NiX2RlYnVnX2FycmF5ID0gQVJSQVkgKDA6MjApIGlzX2NiX2RlYnVnOworRENMIGNiX2RlYnVnIGlzX2NiX2RlYnVnX2FycmF5OworRENMIGNiX2RlYnVnX2luZGV4IElOVCA6PSAwOworCitwOiBQUk9DIChwcCBpc19zdHJfZGVzY3IgSU4sIHggbV9kdW1teV9yYW5nZSBJTikKKyAgRE8gV0lUSCBjYl9kZWJ1ZyhjYl9kZWJ1Z19pbmRleCk7CisgICAgY2hhbm5lbCA6PSB4OworICBPRDsKK0VORCBwOworCitwIChkZXMsIGR1bW15XzEwKTsKK1dSSVRFVEVYVCAoc3Rkb3V0LCAiY2JfZGVidWcoJUMpLmNoYW5uZWwgOj0gJUMlLyIsIAorICAgICAgICAgICBjYl9kZWJ1Z19pbmRleCwgY2JfZGVidWcoY2JfZGVidWdfaW5kZXgpLmNoYW5uZWwpOworCitFTkQgbWFya3VzOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNjYzMi5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci02NjMyLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2UzNDJjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItNjYzMi5leHAKQEAgLTAsMCArMSw2NiBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFBlciBCb3RobmVyLiAoYm90aG5lckBjeWdudXMuY29tKQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworCitpZiBbc2tpcF9jaGlsbF90ZXN0c10gdGhlbiB7IGNvbnRpbnVlIH0KKworc2V0IHRlc3RmaWxlMiAicHItNjYzMi1ncnQiCitzZXQgc3JjZmlsZTIgJHtzcmNkaXJ9LyRzdWJkaXIvJHt0ZXN0ZmlsZTJ9LmNoCitzZXQgb2JqZmlsZTIgJHtvYmpkaXJ9LyRzdWJkaXIvJHt0ZXN0ZmlsZTJ9Lm8KK2lmICB7IFtjb21waWxlICIke3NyY2ZpbGUyfSAtZyAtYyAtbyAke29iamZpbGUyfSJdICE9ICIiIH0geworICAgIHBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3NyY2ZpbGUyfSIKKyAgICByZXR1cm4gLTEKK30KKworc2V0IHRlc3RmaWxlICJwci02NjMyIgorc2V0IHNyY2ZpbGUgJHtzcmNkaXJ9LyRzdWJkaXIvJHt0ZXN0ZmlsZX0uY2gKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0uZXhlCitpZiAgeyBbY29tcGlsZSAiJHtzcmNmaWxlfSAke29iamZpbGUyfSAtZyAtbyAke2JpbmZpbGV9ICR7Q0hJTExfUlQwfSAke0NISUxMX0xJQn0iXSAhPSAiIiB9IHsKKyAgICBwZXJyb3IgIkNvdWxkbid0IGNvbXBpbGUgJHtzcmNmaWxlfSIKKyAgICByZXR1cm4gLTEKK30KKworcHJvYyBkb190ZXN0cyB7fSB7CisgICAgZ2xvYmFsIHBybXNfaWQgYnVnX2lkIHN1YmRpciBvYmpkaXIgc3JjZGlyIGJpbmZpbGUgZ2RiX3Byb21wdAorCisgICAgc2V0IHBybXNfaWQgMAorICAgIHNldCBidWdfaWQgMAorCisgICAgIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKyAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKyAgICBnZGJfbG9hZCAkYmluZmlsZQorCisgICAgZ2RiX3Rlc3QgInNldCBsYW5ndWFnZSBjaGlsbCIgIiIKKworICAgIHJ1bnRvIHAKKyAgICBnZGJfdGVzdCAid2hhdGlzIHgiIHt0eXBlID0gbV9kdW1teV9yYW5nZX0KKyAgICBnZGJfdGVzdF9leGFjdCAicHR5cGUgeCIge3R5cGUgPSBtX2R1bW15IChkdW1teV82OmR1bW15XzIyKX0KKyAgICBnZGJfdGVzdCAicHJpbnQgeCIgeyA9IGR1bW15XzEwfQorfQorCitkb190ZXN0cwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItODEzNC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci04MTM0LmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmJkNjZjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItODEzNC5leHAKQEAgLTAsMCArMSw2NSBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFBlciBCb3RobmVyLiAoYm90aG5lckBjeWdudXMuY29tKQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworaWYgW3NraXBfY2hpbGxfdGVzdHNdIHRoZW4geyBjb250aW51ZSB9CisKKyMgTm90ZSB3ZSB1c2UgcHItODEzNi5jaCBmb3IgcHItODEzNC5leHAgYXMgd2VsbCBhcyBwci04MTM2LmV4cC4KK3NldCB0ZXN0ZmlsZTIgImZ1bmMxIgorc2V0IHNyY2ZpbGUyICR7c3JjZGlyfS8kc3ViZGlyLyR7dGVzdGZpbGUyfS5jaAorc2V0IG9iamZpbGUyICR7b2JqZGlyfS8kc3ViZGlyLyR7dGVzdGZpbGUyfS5vCitpZiAgeyBbY29tcGlsZSAiJHtzcmNmaWxlMn0gLWcgLWMgLW8gJHtvYmpmaWxlMn0iXSAhPSAiIiB9IHsKKyAgICBwZXJyb3IgIkNvdWxkbid0IGNvbXBpbGUgJHtzcmNmaWxlMn0iCisgICAgcmV0dXJuIC0xCit9CisKK3NldCB0ZXN0ZmlsZSAicHItODEzNCIKK3NldCBzcmNmaWxlICR7c3JjZGlyfS8kc3ViZGlyL3ByLTgxMzYuY2gKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0uZXhlCitpZiAgeyBbY29tcGlsZSAiJHtzcmNmaWxlfSAtZyAke29iamZpbGUyfSAtbyAke2JpbmZpbGV9ICR7Q0hJTExfUlQwfSAke0NISUxMX0xJQn0iXSAhPSAiIiB9IHsKKyAgICBwZXJyb3IgIkNvdWxkbid0IGNvbXBpbGUgJHtzcmNmaWxlfSIKKyAgICByZXR1cm4gLTEKK30KKworcHJvYyBkb190ZXN0cyB7fSB7CisgICAgZ2xvYmFsIHBybXNfaWQgYnVnX2lkIHN1YmRpciBvYmpkaXIgc3JjZGlyIGJpbmZpbGUgZ2RiX3Byb21wdAorCisgICAgc2V0IHBybXNfaWQgMAorICAgIHNldCBidWdfaWQgMAorCisgICAgIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKyAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKyAgICBnZGJfbG9hZCAkYmluZmlsZQorCisgICAgZ2RiX3Rlc3QgInNldCBsYW5ndWFnZSBjaGlsbCIgIiIKKworICAgIHJ1bnRvIHAxCisgICAgZ2RiX3Rlc3QgInByaW50IGZpcnN0IiAiPSAxIgorICAgIGdkYl90ZXN0ICJwcmludCBsYXN0IiAiPSAxMCIKK30KKworZG9fdGVzdHMKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTgxMzYuY2ggYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci04MTM2LmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzODAxMTAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci04MTM2LmNoCkBAIC0wLDAgKzEsMzQgQEAKKy0tIE5PVEU6IFRoaXMgdGVzdCBpcyB1c2VkIGZvciBwci0zMTM0LmV4cCBhcyB3ZWxsIGFzIHByLTgxMzYuCitmdW5jOiBNT0RVTEUKKworPD4gVVNFX1NFSVpFX0ZJTEUgImZ1bmMxLmdydCIgPD4KK1NFSVpFIEFMTDsKKworTkVXTU9ERSBtX3N0cnVjdCA9IFNUUlVDVCAoaSBMT05HLCBzdHIgQ0hBUlMoNTApIFZBUllJTkcpOworRENMIGluc2FyciBBUlJBWSAoMToxMCkgSU5UOworCitEQ0wgc2V0cmFuZ2UgbV9zZXRyYW5nZSA6PSBlNTsKKworRENMIHBzIG1fcHMgOj0gWyBlMywgZTc6ZTkgXTsKK0RDTCByYW5nZV9wcyBtX3JhbmdlcHMgOj0gWyAyLCAzLCA0LCAyOCBdOworCitwMTogUFJPQyAoZmlyc3QgSU5UIElOLCBsYXN0IElOVCBJTiwgcyBtX3N0cnVjdCBJTik7CisKKyAgRENMIGZvbyBMT05HIDo9IDM7CisKKyAgc3RhcnRhbGw6IFBST0MgKCkKKyAgICBETyBGT1IgaSA6PSBmaXJzdCB0byBsYXN0OworICAgICAgaW5zYXJyKGkpIDo9IGk7CisgICAgT0Q7CisgICAgRE8gRk9SIGkgOj0gZmlyc3QgVE8gbGFzdDsKKyAgICAgIFdSSVRFVEVYVCAoc3Rkb3V0LCAiaW5zYXJyKCVDKSA6PSAlQyUvIiwgaSwgaW5zYXJyKGkpKTsKKyAgICBPRDsKKyAgRU5EIHN0YXJ0YWxsOworCisgIHN0YXJ0YWxsICgpOworCitFTkQgcDE7CisKK3AxIChMT1dFUiAoaW5zYXJyKSwgVVBQRVIgKGluc2FyciksIFsgMTAsICJUaGlzIGlzIGEgc3RyaW5nLiIgXSk7CisKK0VORCBmdW5jOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItODEzNi5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci04MTM2LmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmYzNjBjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItODEzNi5leHAKQEAgLTAsMCArMSw2MyBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFBlciBCb3RobmVyLiAoYm90aG5lckBjeWdudXMuY29tKQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworaWYgW3NraXBfY2hpbGxfdGVzdHNdIHRoZW4geyBjb250aW51ZSB9CisKK3NldCB0ZXN0ZmlsZTIgImZ1bmMxIgorc2V0IHNyY2ZpbGUyICR7c3JjZGlyfS8kc3ViZGlyLyR7dGVzdGZpbGUyfS5jaAorc2V0IG9iamZpbGUyICR7b2JqZGlyfS8kc3ViZGlyLyR7dGVzdGZpbGUyfS5vCitpZiAgeyBbY29tcGlsZSAiJHtzcmNmaWxlMn0gLWcgLWMgLW8gJHtvYmpmaWxlMn0iXSAhPSAiIiB9IHsKKyAgICBwZXJyb3IgIkNvdWxkbid0IGNvbXBpbGUgJHtzcmNmaWxlMn0iCisgICAgcmV0dXJuIC0xCit9CisKK3NldCB0ZXN0ZmlsZSAicHItODEzNiIKK3NldCBzcmNmaWxlICR7c3JjZGlyfS8kc3ViZGlyL3ByLTgxMzYuY2gKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0uZXhlCitpZiAgeyBbY29tcGlsZSAiJHtzcmNmaWxlfSAtZyAke29iamZpbGUyfSAtbyAke2JpbmZpbGV9ICR7Q0hJTExfUlQwfSAke0NISUxMX0xJQn0iXSAhPSAiIiB9IHsKKyAgICBwZXJyb3IgIkNvdWxkbid0IGNvbXBpbGUgJHtzcmNmaWxlfSIKKyAgICByZXR1cm4gLTEKK30KKworcHJvYyBkb190ZXN0cyB7fSB7CisgICAgZ2xvYmFsIHBybXNfaWQgYnVnX2lkIHN1YmRpciBvYmpkaXIgc3JjZGlyIGJpbmZpbGUgZ2RiX3Byb21wdAorCisgICAgc2V0IHBybXNfaWQgMAorICAgIHNldCBidWdfaWQgMAorCisgICAgIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKyAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKyAgICBnZGJfbG9hZCAkYmluZmlsZQorCisgICAgZ2RiX3Rlc3QgInNldCBsYW5ndWFnZSBjaGlsbCIgIiIKKworICAgIHJ1bnRvIHAxCisgICAgZ2RiX3Rlc3QgInByaW50IHBzIiB7PSBcW2UzLCBlNzplOVxdfQorfQorCitkb190ZXN0cwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItODQwNS5jaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTg0MDUuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTliMjUzMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTg0MDUuY2gKQEAgLTAsMCArMSwxOSBAQAorZW1wdHliaXQ6IE1PRFVMRQorCitTWU5NT0RFIGI4ID0gQk9PTFMoOCk7CitTWU4gYml0OCBiOCA9IEInMDAwMDAwMDAnOworCitTWU5NT0RFIGNoYXJfbSA9IENIQVJTKDQwKSBWQVJZSU5HOworCitTWU5NT0RFIHN0cnVfbSA9IFNUUlVDVCAoYyBjaGFyX20sIGIgYjgsIGJvbyBCT09MKTsKK0RDTCB4eCBzdHJ1X207CisKK1NZTk1PREUgbV9zdHJ1ID0gU1RSVUNUIChjIGNoYXJfbSwgaSBMT05HLCBib28gQk9PTCk7CitEQ0wgeXkgbV9zdHJ1OworCitTWU5NT0RFIG1fYXJyID0gQVJSQVkgKDE6MTApIExPTkc7CitEQ0wgenogbV9hcnI7CisKK1dSSVRFVEVYVCAoc3Rkb3V0LCAiJUMlLyIsIGJpdDgpOworCitFTkQgZW1wdHliaXQ7CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci04NDA1LmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTg0MDUuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZjIzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci04NDA1LmV4cApAQCAtMCwwICsxLDYxIEBACisjIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIuIChib3RobmVyQGN5Z251cy5jb20pCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitwcm9jIGRvX3Rlc3RzIHt9IHsKKyAgICBnbG9iYWwgcHJtc19pZCBidWdfaWQgc3ViZGlyIG9iamRpciBzcmNkaXIgYmluZmlsZSBnZGJfcHJvbXB0CisKKyAgICBzZXQgcHJtc19pZCAwCisgICAgc2V0IGJ1Z19pZCAwCisKKyAgICAjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKKyAgICBnZGJfZXhpdAorICAgIGdkYl9zdGFydAorICAgIGdkYl9sb2FkICRiaW5maWxlCisKKyAgICBnZGJfdGVzdCAic2V0IGxhbmd1YWdlIGNoaWxsIiAiIgorICAgIGdkYl90ZXN0ICJzZXQgdmFyIFwkaTo9eHgiICIiCisgICAgZ2RiX3Rlc3QgInByaW50IFwkaSIgez0gXFsuYzogIiIsIC5iOiBCJzAwMDAwMDAwJywgLmJvbzogRkFMU0VcXX0KK30KKworaWYgW3NraXBfY2hpbGxfdGVzdHNdIHRoZW4geyBjb250aW51ZSB9CisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW4gZXhlY3V0YWJsZSB0byB0ZXN0LiAgSWYgbm90LCB0aGVuIGVpdGhlciB3ZQorIyBoYXZlbid0IHRyaWVkIHRvIGNvbXBpbGUgb25lLCBvciB0aGUgY29tcGlsYXRpb24gZmFpbGVkIGZvciBzb21lIHJlYXNvbi4KKyMgSW4gZWl0aGVyIGNhc2UsIGp1c3Qgbm90aWZ5IHRoZSB1c2VyIGFuZCBza2lwIHRoZSB0ZXN0cyBpbiB0aGlzIGZpbGUuCisKK3NldCB0ZXN0ZmlsZSAicHItODQwNSIKK3NldCBzcmNmaWxlICR7c3JjZGlyfS8kc3ViZGlyLyR7dGVzdGZpbGV9LmNoCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LmV4ZQoraWYgIHsgW2NvbXBpbGUgIiR7c3JjZmlsZX0gLWcgLXcgLW8gJHtiaW5maWxlfSAke0NISUxMX1JUMH0gJHtDSElMTF9MSUJ9Il0gIT0gIiIgfSB7CisgICAgcGVycm9yICJDb3VsZG4ndCBjb21waWxlICR7c3JjZmlsZX0iCisgICAgcmV0dXJuIC0xCit9CisKK2lmICFbZmlsZSBleGlzdHMgJGJpbmZpbGVdIHRoZW4geworICAgIHdhcm5pbmcgIiRiaW5maWxlIGRvZXMgbm90IGV4aXN0OyB0ZXN0cyBzdXBwcmVzc2VkLiIgMAorfSBlbHNlIHsKKyAgICBkb190ZXN0cworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItODc0Mi5jaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTg3NDIuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0MTE0OQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTg3NDIuY2gKQEAgLTAsMCArMSwzMiBAQAoraHVnbyA6IG1vZHVsZQorICAKKyAgc3lubW9kZSBhID0gcmFuZ2UoMToxMCk7CisgIHN5bm1vZGUgcCA9IHBvd2Vyc2V0IGE7CisgIAorICBzeW5tb2RlIHMgPSBzZXQgKHNhLCBzYiwgc2MpOworICBzeW5tb2RlIHNfcHMgPSBwb3dlcnNldCBzOworICAKKyAgeDogcHJvYyAocHMgcCk7CisgICAgZGNsIGkgYTsKKyAgICBkbyBmb3IgaSBpbiBwczsKKyAgICAgIHdyaXRldGV4dCAoc3Rkb3V0LCAiJUMgIiwgaSk7CisgICAgb2Q7CisgICAgd3JpdGV0ZXh0KHN0ZG91dCwgIiUvIik7CisgIGVuZCB4OworICAKKyAgeSA6IHByb2MgKHBzIHNfcHMpOworICAgIGRjbCBpIHM7CisgICAgZG8gZm9yIGkgaW4gcHM7CisgICAgICB3cml0ZXRleHQgKHN0ZG91dCwgIiVDICIsIGkpOworICAgIG9kOworICAgIHdyaXRldGV4dChzdGRvdXQsICIlLyIpOworICBlbmQgeTsKKworICBkdW1teTogcHJvYyAoKTsKKyAgZW5kIGR1bW15OworICAgICAgCisgIHgoWzEsMiwzXSk7CisgIHkoW3NhLCBzY10pOworICBkdW1teSAoKTsKKyAgCitlbmQgaHVnbzsKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTg3NDIuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItODc0Mi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0OWMyOAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTg3NDIuZXhwCkBAIC0wLDAgKzEsNjQgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBQZXIgQm90aG5lci4gKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK2lmIFtza2lwX2NoaWxsX3Rlc3RzXSB0aGVuIHsgY29udGludWUgfQorCitzZXQgdGVzdGZpbGUgInByLTg3NDIiCitzZXQgc3JjZmlsZSAke3NyY2Rpcn0vJHN1YmRpci8ke3Rlc3RmaWxlfS5jaAorc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5leGUKK2lmICB7IFtjb21waWxlICIke3NyY2ZpbGV9IC1nIC1vICR7YmluZmlsZX0gJHtDSElMTF9SVDB9ICR7Q0hJTExfTElCfSJdICE9ICIiIH0geworICAgIHBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3NyY2ZpbGV9IgorICAgIHJldHVybiAtMQorfQorCitwcm9jIGRvX3Rlc3RzIHt9IHsKKyAgICBnbG9iYWwgcHJtc19pZCBidWdfaWQgc3ViZGlyIG9iamRpciBzcmNkaXIgYmluZmlsZSBnZGJfcHJvbXB0CisKKyAgICBzZXQgcHJtc19pZCAwCisgICAgc2V0IGJ1Z19pZCAwCisKKyAgICAjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKKyAgICBnZGJfZXhpdAorICAgIGdkYl9zdGFydAorICAgIGdkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorICAgIGdkYl9sb2FkICRiaW5maWxlCisKKyAgICBnZGJfdGVzdCAic2V0IGxhbmd1YWdlIGNoaWxsIiAiIgorCisgICAgcnVudG8gZHVtbXkKKworICAgICMgSGF2ZW4ndCBpbnZlc3RpZ2F0ZWQgd2h5IHRoZXNlIGZhaWwgb24gbWlwcy1zZ2ktaXJpeCoKKyAgICBzZXR1cF94ZmFpbCAibTY4Ki0qLWhwdXgqIiAibWlwcyotc2dpLWlyaXgqIgorICAgIGdkYl90ZXN0IHtjYWxsIHgocCBbMSwgMywgNV0pfSAiMSAzIDUgIiAicGFzcyBpbnQgcG93ZXJzZXQgdHVwbGUiCisgICAgc2V0dXBfeGZhaWwgIm1pcHMqLXNnaS1pcml4KiIKKyAgICBnZGJfdGVzdCB7Y2FsbCB5KHNfcHMgW3NjXSl9ICJzYyAiICJwYXNzIHNldCBwb3dlcnNldCB0dXBsZSIKKyAgICBzZXR1cF94ZmFpbCAibTY4Ki0qLWhwdXgqIiAibWlwcyotc2dpLWlyaXgqIgorICAgIGdkYl90ZXN0IHtjYWxsIHgoWzEsIDMsIDVdKX0gIjEgMyA1ICIgInBhc3MgbW9kZWxlc3MgaW50IHBvd2Vyc2V0IHR1cGxlIgorICAgIHNldHVwX3hmYWlsICJtaXBzKi1zZ2ktaXJpeCoiCisgICAgZ2RiX3Rlc3Qge2NhbGwgeShbc2NdKX0gInNjICIgInBhc3MgbW9kZWxlc3Mgc2V0IHBvd2Vyc2V0IHR1cGxlIgorfQorCitkb190ZXN0cwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItODg5NC1ncnQuY2ggYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci04ODk0LWdydC5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzIwMTcwCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItODg5NC1ncnQuY2gKQEAgLTAsMCArMSw2IEBACit5eTogTU9EVUxFCisKK1NZTk1PREUgbV9ieXRlID0gSU5UICgwOjI1NSk7CitHUkFOVCBBTEw7CisKK0VORCB5eTsKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTg4OTQuY2ggYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci04ODk0LmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MWQ1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci04ODk0LmNoCkBAIC0wLDAgKzEsMTIgQEAKK3h4OiBNT0RVTEUKKworPD4gVVNFX1NFSVpFX0ZJTEUgInByLTg4OTQtZ3J0LmdydCIgPD4KK1NFSVpFIG1fYnl0ZTsKKworU1lOTU9ERSBtX3N0cnVjdCA9IFNUUlVDVCAoYSwgYiwgYyBtX2J5dGUpOworCitEQ0wgdiBtX3N0cnVjdDsKKwordi5hIDo9IDEwMDsKKworRU5EIHh4OwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItODg5NC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci04ODk0LmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGVmNmY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItODg5NC5leHAKQEAgLTAsMCArMSw2MSBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitpZiBbc2tpcF9jaGlsbF90ZXN0c10gdGhlbiB7IGNvbnRpbnVlIH0KKworc2V0IHRlc3RmaWxlMiAicHItODg5NC1ncnQiCitzZXQgc3JjZmlsZTIgJHtzcmNkaXJ9LyRzdWJkaXIvJHt0ZXN0ZmlsZTJ9LmNoCitzZXQgb2JqZmlsZTIgJHtvYmpkaXJ9LyRzdWJkaXIvJHt0ZXN0ZmlsZTJ9Lm8KK2lmICB7IFtjb21waWxlICIke3NyY2ZpbGUyfSAtZyAtYyAtbyAke29iamZpbGUyfSJdICE9ICIiIH0geworICAgIHBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3NyY2ZpbGUyfSIKKyAgICByZXR1cm4gLTEKK30KKworc2V0IHRlc3RmaWxlICJwci04ODk0Igorc2V0IHNyY2ZpbGUgJHtzcmNkaXJ9LyRzdWJkaXIvJHRlc3RmaWxlLmNoCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LmV4ZQoraWYgIHsgW2NvbXBpbGUgIiR7c3JjZmlsZX0gLWcgJHtvYmpmaWxlMn0gLW8gJHtiaW5maWxlfSAke0NISUxMX1JUMH0gJHtDSElMTF9MSUJ9Il0gIT0gIiIgfSB7CisgICAgcGVycm9yICJDb3VsZG4ndCBjb21waWxlICR7c3JjZmlsZX0iCisgICAgcmV0dXJuIC0xCit9CisKK3Byb2MgZG9fdGVzdHMge30geworICAgIGdsb2JhbCBwcm1zX2lkIGJ1Z19pZCBzdWJkaXIgb2JqZGlyIHNyY2RpciBiaW5maWxlIGdkYl9wcm9tcHQKKworICAgIHNldCBwcm1zX2lkIDAKKyAgICBzZXQgYnVnX2lkIDAKKworICAgICMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworICAgIGdkYl9leGl0CisgICAgZ2RiX3N0YXJ0CisgICAgZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisgICAgZ2RiX2xvYWQgJGJpbmZpbGUKKworICAgIGdkYl90ZXN0ICJzZXQgbGFuZ3VhZ2UgY2hpbGwiICIiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgc2l6ZShtX2J5dGUpIiB7ID0gMn0KKyAgICBnZGJfdGVzdCAicHJpbnQgc2l6ZShtX3N0cnVjdCkiIHsgPSA2fQorfQorCitkb190ZXN0cwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItOTA5NS5jaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTkwOTUuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmZmI3MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTkwOTUuY2gKQEAgLTAsMCArMSwxMyBAQAorZ2RiMTogTU9EVUxFCisKK1NZTk1PREUgbV9hcnIxID0gQVJSQVkgKDE6MTApIFVCWVRFOworU1lOTU9ERSBtX3N0cnVjdCA9IFNUUlVDVCAoIGkgTE9ORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwIFJFRiBtX2FycjEpOworU1lOTU9ERSBtX2FycjIgPSBBUlJBWSAoMDoxMCkgUkVGIG1fc3RydWN0OworCitEQ0wgdl9hcnIxIG1fYXJyMSBJTklUIDo9IFsgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAgXTsKK0RDTCB2X3N0cnVjdCBtX3N0cnVjdCBJTklUIDo9IFsgMTAsIC0+dl9hcnIxIF07CitEQ0wgdl9hcnIyIG1fYXJyMiBJTklUIDo9IFsgKDUpOiAtPnZfc3RydWN0LCAoRUxTRSk6IE5VTEwgXTsKKworV1JJVEVURVhUIChzdGRvdXQsICJ2X2FycjIoNSktPi5wLT4oNSkgPSAlQyUvIiwgdl9hcnIyKDUpLT4ucC0+KDUpKTsKK0VORCBnZGIxOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItOTA5NS5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci05MDk1LmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzVjZTk3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItOTA5NS5leHAKQEAgLTAsMCArMSw2MiBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFBlciBCb3RobmVyLiAoYm90aG5lckBjeWdudXMuY29tKQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworcHJvYyBkb190ZXN0cyB7fSB7CisgICAgZ2xvYmFsIHBybXNfaWQgYnVnX2lkIHN1YmRpciBvYmpkaXIgc3JjZGlyIGJpbmZpbGUgZ2RiX3Byb21wdAorCisgICAgc2V0IHBybXNfaWQgMAorICAgIHNldCBidWdfaWQgMAorCisgICAgIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKyAgICBnZGJfbG9hZCAkYmluZmlsZQorCisgICAgZ2RiX3Rlc3QgInNldCBsYW5ndWFnZSBjaGlsbCIgIiIKKyAgICBydW50byBwci05MDk1LmNoOjEyCisgICAgZ2RiX3Rlc3Qge3Agdl9hcnIyKDUpLT4ucCg1KX0gInJlZmVyZW5jZSB2YWx1ZSB1c2VkIGFzIGZ1bmN0aW9uIiBcCisJImJhZCBjYWxsIHVzaW5nIHBvaW50ZXIiCit9CisKK2lmIFtza2lwX2NoaWxsX3Rlc3RzXSB0aGVuIHsgY29udGludWUgfQorCisjIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFuIGV4ZWN1dGFibGUgdG8gdGVzdC4gIElmIG5vdCwgdGhlbiBlaXRoZXIgd2UKKyMgaGF2ZW4ndCB0cmllZCB0byBjb21waWxlIG9uZSwgb3IgdGhlIGNvbXBpbGF0aW9uIGZhaWxlZCBmb3Igc29tZSByZWFzb24uCisjIEluIGVpdGhlciBjYXNlLCBqdXN0IG5vdGlmeSB0aGUgdXNlciBhbmQgc2tpcCB0aGUgdGVzdHMgaW4gdGhpcyBmaWxlLgorCitzZXQgdGVzdGZpbGUgInByLTkwOTUiCitzZXQgc3JjZmlsZSAke3NyY2Rpcn0vJHN1YmRpci8ke3Rlc3RmaWxlfS5jaAorc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5leGUKK2lmICB7IFtjb21waWxlICIke3NyY2ZpbGV9IC1nIC13IC1vICR7YmluZmlsZX0gJHtDSElMTF9SVDB9ICR7Q0hJTExfTElCfSJdICE9ICIiIH0geworICAgIHBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3NyY2ZpbGV9IgorICAgIHJldHVybiAtMQorfQorCitpZiAhW2ZpbGUgZXhpc3RzICRiaW5maWxlXSB0aGVuIHsKKyAgICB3YXJuaW5nICIkYmluZmlsZSBkb2VzIG5vdCBleGlzdDsgdGVzdHMgc3VwcHJlc3NlZC4iIDAKK30gZWxzZSB7CisgICAgZG9fdGVzdHMKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTk5NDYuY2ggYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci05OTQ2LmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOTIxMGEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9wci05OTQ2LmNoCkBAIC0wLDAgKzEsMTAgQEAKK3g6IG1vZHVsZQorCitzeW5tb2RlIGFzZXQgPSBTRVQgKHN0b3BwZWQsIG1vdmluZyk7CisKK0RDTCB4eXogYXNldDsKKworeHl6IDo9IG1vdmluZzsKK3h5eiA6PSBTVUNDICh4eXopOworCitFTkQgeDsKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTk5NDYuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcHItOTk0Ni5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiNTkyZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3ByLTk5NDYuZXhwCkBAIC0wLDAgKzEsNzkgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBGcmVkIEZpc2guIChmbmZAY3lnbnVzLmNvbSkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnRpbiBQb3R0ZW5kb3JmZXIgKHBvdHRlbmRvQGF1dC5hbGNhdGVsLmF0KQorIworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKK2lmIFtza2lwX2NoaWxsX3Rlc3RzXSB0aGVuIHsgY29udGludWUgfQorCitzZXQgdGVzdGZpbGUgInByLTk5NDYiCitzZXQgc3JjZmlsZSAke3NyY2Rpcn0vJHN1YmRpci8ke3Rlc3RmaWxlfS5jaAorc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5leGUKK2lmICB7IFtjb21waWxlICIke3NyY2ZpbGV9IC1nIC1vICR7YmluZmlsZX0gJHtDSElMTF9SVDB9ICR7Q0hJTExfTElCfSJdICE9ICIiIH0geworICAgIHBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3NyY2ZpbGV9IgorICAgIHJldHVybiAtMQorfQorCisjIFNldCB0aGUgY3VycmVudCBsYW5ndWFnZSB0byBjaGlsbC4gIFRoaXMgY291bnRzIGFzIGEgdGVzdC4gIElmIGl0CisjIGZhaWxzLCB0aGVuIHdlIHNraXAgdGhlIG90aGVyIHRlc3RzLgorCitwcm9jIHNldF9sYW5nX2NoaWxsIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBiaW5maWxlIG9iamRpciBzdWJkaXIKKworICAgIHZlcmJvc2UgImxvYWRpbmcgZmlsZSAnJGJpbmZpbGUnIgorICAgIGdkYl9sb2FkICRiaW5maWxlCisKKyAgICBzZW5kX2dkYiAic2V0IGxhbmd1YWdlIGNoaWxsXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorICAgICAgICB0aW1lb3V0IHsgZmFpbCAic2V0IGxhbmd1YWdlIGNoaWxsICh0aW1lb3V0KSIgOyByZXR1cm4gMCB9CisgICAgfQorCisgICAgcmV0dXJuIFtnZGJfdGVzdCAic2hvdyBsYW5ndWFnZSIgIi4qIHNvdXJjZSBsYW5ndWFnZSBpcyBcImNoaWxsXCIuKiIgXAorICAgICAgICAic2V0IGxhbmd1YWdlIHRvIFwiY2hpbGxcIiJdCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCitnZGJfdGVzdCAic2V0IHByaW50IHNldmVuYml0LXN0cmluZ3MiICIuKiIKKworaWYgIVtzZXRfbGFuZ19jaGlsbF0gdGhlbiB7CisgICAgcnVudG8geF8KKyAgICBnZGJfdGVzdCAibmV4dCIgIiIKKyAgICAjIGNoZWNrIGNvbXBhcmlzb24gb2YgU0VUJ3MKKyAgICBnZGJfdGVzdCB7cHJpbnQgeHl6PW1vdmluZ30geyA9IFRSVUV9CisgICAgZ2RiX3Rlc3Qge3ByaW50IHh5ei89bW92aW5nfSB7ID0gRkFMU0V9CisgICAgZ2RiX3Rlc3Qge3ByaW50IHh5ejxtb3Zpbmd9IHsgPSBGQUxTRX0KKyAgICBnZGJfdGVzdCB7cHJpbnQgeHl6PD1tb3Zpbmd9IHsgPSBUUlVFfQorICAgIGdkYl90ZXN0IHtwcmludCB4eXo+bW92aW5nfSB7ID0gRkFMU0V9CisgICAgZ2RiX3Rlc3Qge3ByaW50IHh5ej49bW92aW5nfSB7ID0gVFJVRX0KK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3Jlc3VsdC5jaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3Jlc3VsdC5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGM2NWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvcmVzdWx0LmNoCkBAIC0wLDAgKzEsMjkgQEAKK3Rlc3RfcmVzdWx0OiAgTU9EVUxFCisKKyAgRENMIGkgSU5UIDo9IDU7CisKKyAgU1lOTU9ERSBtX3N0cnVjdCA9IFNUUlVDVCAobCBMT05HLCBiIEJPT0wpOworICBEQ0wgdl9zdHJ1Y3QgbV9zdHJ1Y3QgOj0gWyAyMCwgVFJVRSBdOworCisgIHNpbXBsZV9mdW5jOiBQUk9DICgpIFJFVFVSTlMgKElOVCk7CisgICAgRENMIGogSU5UIDo9IGk7CisgICAgUkVTVUxUIDEwOworICAgIGkgKyA6PSAyOworICAgIFJFU1VMVCBqICsgMjsKKyAgICBpICsgOj0gMjsKKyAgRU5EIHNpbXBsZV9mdW5jOworCisgIHJldF9zdHJ1Y3Q6IFBST0MgKCkgUkVUVVJOUyAobV9zdHJ1Y3QpCisgICAgRENMIHYgbV9zdHJ1Y3QgOj0gWyAzMywgRkFMU0UgXTsKKyAgICBSRVNVTFQgdjsKKyAgICB2LmwgOj0gMTg7CisgIEVORCByZXRfc3RydWN0OworCisgIGkgOj0gc2ltcGxlX2Z1bmMgKCk7CisgIGkgOj0gc2ltcGxlX2Z1bmMgKCk7CisgIGkgKiA6PSAxMDsKKworICB2X3N0cnVjdCA6PSByZXRfc3RydWN0ICgpOworCisgIGkgOj0gMzM7IC0tIGZvciBnZGIKK0VORCB0ZXN0X3Jlc3VsdDsKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3Jlc3VsdC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9yZXN1bHQuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Y2EzMzUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9yZXN1bHQuZXhwCkBAIC0wLDAgKzEsNzcgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBQZXIgQm90aG5lci4gKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK2lmIFtza2lwX2NoaWxsX3Rlc3RzXSB0aGVuIHsgY29udGludWUgfQorCitzZXQgdGVzdGZpbGUgInJlc3VsdCIKK3NldCBzcmNmaWxlICR7c3JjZGlyfS8kc3ViZGlyLyR7dGVzdGZpbGV9LmNoCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LmV4ZQoraWYgIHsgW2NvbXBpbGUgIiR7c3JjZmlsZX0gLWcgLW8gJHtiaW5maWxlfSAke0NISUxMX1JUMH0gJHtDSElMTF9MSUJ9Il0gIT0gIiIgfSB7CisgICAgcGVycm9yICJDb3VsZG4ndCBjb21waWxlICR7c3JjZmlsZX0iCisgICAgcmV0dXJuIC0xCit9CisKK3Byb2MgZG9fdGVzdHMge30geworICAgIGdsb2JhbCBwcm1zX2lkIGJ1Z19pZCBzdWJkaXIgb2JqZGlyIHNyY2RpciBiaW5maWxlIGdkYl9wcm9tcHQKKworICAgIHNldCBwcm1zX2lkIDAKKyAgICBzZXQgYnVnX2lkIDAKKworICAgICMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworICAgIGdkYl9leGl0CisgICAgZ2RiX3N0YXJ0CisgICAgZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisgICAgZ2RiX2xvYWQgJGJpbmZpbGUKKworICAgIGdkYl90ZXN0ICJzZXQgbGFuZ3VhZ2UgY2hpbGwiICIiCisKKyAgICBnZGJfdGVzdCAic2V0IHdpZHRoIDAiICIiCisgICAgZ2RiX3Rlc3QgInNldCBwcmludCBzZXZlbmJpdC1zdHJpbmdzIiAiIgorICAgIGdkYl90ZXN0ICJzZXQgcHJpbnQgYWRkcmVzcyBvZmYiICIiCisKKyAgICAjIHNpbXBsZSBmdW5jdGlvbgorICAgIHJ1bnRvIHNpbXBsZV9mdW5jCisgICAgZ2RiX3Rlc3QgInN0ZXAgMiIgIiIKKyAgICBnZGJfdGVzdCAicHJpbnQgaiIgIj0gNSIKKyAgICBnZGJfdGVzdCAicCBSRVNVTFQiICI9IDEwIgorICAgIGdkYl90ZXN0ICJjb250aW51ZSIgIiIKKyAgICBnZGJfdGVzdCAicHJpbnQgaSIgIj0gNyIKKyAgICBnZGJfdGVzdCAic3RlcCA0IiAiIgorICAgIGdkYl90ZXN0ICJzZXQgUkVTVUxUIDo9IDUwIiAiIgorICAgIGdkYl90ZXN0ICJmaW5pc2giICIiCisgICAgZ2RiX3Rlc3QgInN0ZXAiICIiCisgICAgZ2RiX3Rlc3QgInByaW50IGkiICI9IDUwIgorCisgICAgIyByZXR1cm5pbmcgYSBzdHJ1Y3R1cmUKKyAgICBydW50byByZXRfc3RydWN0CisgICAgZ2RiX3Rlc3QgInN0ZXAgMiIgIiIKKyAgICBnZGJfdGVzdCAicCByZXN1bHQiIHtcWy5sOiAzMywgLmI6IEZBTFNFXF19CisgICAgZ2RiX3Rlc3QgInNldCB2YXIgcmVzdWx0IDo9IFxbMzgzLCBUUlVFXF0iICIiCisgICAgZ2RiX3Rlc3QgImZpbmlzaCIgIiIKKyAgICBnZGJfdGVzdCAicCB2X3N0cnVjdCIge1xbLmw6IDM4MywgLmI6IFRSVUVcXX0KK30KKworZG9fdGVzdHMKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3N0cmluZy5jaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3N0cmluZy5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTAzYzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvc3RyaW5nLmNoCkBAIC0wLDAgKzEsMjQgQEAKK3NzOiBNT0RVTEUKKworLyogVGhlc2UgZGVjbGFyYXRpb25zIGFyZSBmcm9tIEN5Z251cyBQUiBjaGlsbC85MDc4LiAqLworICBTWU5NT0RFIG1fY2hhcjIwID0gQ0hBUlMoMjApIFZBUllJTkc7CisKKyAgRENMIGZvbyBtX2NoYXIyMCBJTklUIDo9ICJNb3NlciAiOworICBEQ0wgYmFyIG1fY2hhcjIwIElOSVQgOj0gIldpbGZyaWVkIjsKKworICBEQ0wgZm9vMSBDSEFSUyg1KSBJTklUIDo9ICIxMjM0NSI7CisgIERDTCBiYXIxIENIQVJTKDUpIElOSVQgOj0gImFiY2RlIjsKKworLyogVGhpcyBpcyBDeW51cyBQUiBjaGlsbC81Njk2LiAqLworCitEQ0wgczIwIENIQVJTKDIwKSBWQVJZSU5HOworCitEQ0wgczEwIENIQVJTKDEwKTsKKworCitzMjAgOj0gIk1vc2VyIFdpbGZyaWVkIjsKK1MxMCA6PSAiMTIzNDU2Nzg5MCI7CisKK1dSSVRFVEVYVCAoc3Rkb3V0LCAiczIwIDo9ICIiJUMiIiwgczEwIDo9ICIiJUMiIiUvIiwgczIwLCBzMTApOworCitFTkQgc3M7CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC9zdHJpbmcuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvc3RyaW5nLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWJkN2U5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvc3RyaW5nLmV4cApAQCAtMCwwICsxLDczIEBACisjIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK2lmIFtza2lwX2NoaWxsX3Rlc3RzXSB0aGVuIHsgY29udGludWUgfQorCitzZXQgdGVzdGZpbGUgInN0cmluZyIKK3NldCBzcmNmaWxlICR7c3JjZGlyfS8kc3ViZGlyLyR7dGVzdGZpbGV9LmNoCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LmV4ZQoraWYgIHsgW2NvbXBpbGUgIiR7c3JjZmlsZX0gLWcgLW8gJHtiaW5maWxlfSAke0NISUxMX1JUMH0gJHtDSElMTF9MSUJ9Il0gIT0gIiIgfSB7CisgICAgcGVycm9yICJDb3VsZG4ndCBjb21waWxlICR7c3JjZmlsZX0iCisgICAgcmV0dXJuIC0xCit9CisKK3Byb2MgZG9fdGVzdHMge30geworICAgIGdsb2JhbCBwcm1zX2lkIGJ1Z19pZCBzdWJkaXIgb2JqZGlyIHNyY2RpciBiaW5maWxlIGdkYl9wcm9tcHQKKworICAgIHNldCBwcm1zX2lkIDAKKyAgICBzZXQgYnVnX2lkIDAKKworICAgICMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworICAgIGdkYl9leGl0CisgICAgZ2RiX3N0YXJ0CisgICAgZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisgICAgZ2RiX2xvYWQgJGJpbmZpbGUKKworICAgIGdkYl90ZXN0ICJzZXQgbGFuZ3VhZ2UgY2hpbGwiICIiCisKKyAgICAjIFRoZXNlIHRlc3RzIGJhc2VkIG9uIEN5Z251cyBQUiBjaGlsbC81Njk2LgorICAgIHJ1bnRvIHN0cmluZy5jaDoyMgorICAgIGdkYl90ZXN0ICJwIHMyMCIgeyA9ICJNb3NlciBXaWxmcmllZCJ9ICJwcmludCBzaW1wbGUgdnN0cmluZyIKKyAgICBnZGJfdGVzdCAicCBzMjAoMSkiIHsgPSAnbyd9ICJwcmludCB2c3RyaW5nIGVsZW1lbnQiCisgICAgZ2RiX3Rlc3QgInAgczIwKDE6MykiIHsgPSAib3NlIn0gInByaW50IHZzdHJpbmcgc2xpY2UgKDopIgorICAgIGdkYl90ZXN0ICJwIHMyMCgyIHVwIDMpIiB7ID0gInNlciJ9ICJwcmludCB2c3RyaW5nIHNsaWNlICh1cCkiCisgICAgZ2RiX3Rlc3QgInAgczEwIiB7ID0gIjEyMzQ1Njc4OTAifSAicHJpbnQgc2ltcGxlIHN0cmluZyIKKyAgICBnZGJfdGVzdCAicCBzMTAoMSkiIHsgPSAnMid9ICJwcmludCBzdHJpbmcgZWxlbWVudCIKKyAgICBnZGJfdGVzdCAicCBzMTAoMTozKSIgeyA9ICIyMzQifSAicHJpbnQgc3RyaW5nIHNsaWNlICg6KSIKKyAgICBnZGJfdGVzdCAicCBzMTAoMiB1cCAzKSIgeyA9ICIzNDUifSAicHJpbnQgc3RyaW5nIHNsaWNlICh1cCkiCisKKyAgICBnZGJfdGVzdCAicCBsZW5ndGgoczEwKSIgeyA9IDEwfSAicHJpbnQgc3RyaW5nIGxlbmd0aCIKKyAgICBnZGJfdGVzdCAicCBsZW5ndGgoczIwKSIgeyA9IDE0fSAicHJpbnQgdmFyeWluZyBzdHJpbmcgbGVuZ3RoIgorICAgIGdkYl90ZXN0ICJwIGxvd2VyKHMxMCkiIHsgPSAwfSAicHJpbnQgc3RyaW5nIGxvd2VyIgorICAgIGdkYl90ZXN0ICJwIHVwcGVyKHMxMCkiIHsgPSA5fSAicHJpbnQgc3RyaW5nIHVwcGVyIgorICAgIGdkYl90ZXN0ICJwIGxvd2VyKHMyMCkiIHsgPSAwfSAicHJpbnQgdmFyeWluZyBzdHJpbmcgbG93ZXIiCisgICAgZ2RiX3Rlc3QgInAgdXBwZXIoczIwKSIgeyA9IDE5fSAicHJpbnQgdmFyeWluZyBzdHJpbmcgdXBwZXIiCisKKyAgICAjIFRoZXNlIHRlc3RzIGFyZSBiYXNlZCBvbiBDeWdudXMgUFIgY2hpbGwvOTA3OC4KKyAgICBnZGJfdGVzdCAicHJpbnQgZm9vIC8vIGJhciIgeyA9ICJNb3NlciBXaWxmcmllZCJ9CisgICAgZ2RiX3Rlc3QgInByaW50IGZvbyAvLyBiYXIxIiB7ID0gIk1vc2VyIGFiY2RlIn0KKyAgICBnZGJfdGVzdCAicHJpbnQgZm9vMSAvLyBiYXIxIiB7ID0gIjEyMzQ1YWJjZGUifQorfQorCitkb190ZXN0cwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvdGVzdHMxLmNoIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvdGVzdHMxLmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NDVkMDcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC90ZXN0czEuY2gKQEAgLTAsMCArMSwyNDAgQEAKKy0tIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworLS0gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy0tIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CistLSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorLS0gKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy0tIAorLS0gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCistLSBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLS0gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLS0gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy0tIAorLS0gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy0tIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCistLSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCisKKy0tIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorLS0gYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworLS0KKy0tIHRlc3QgcHJvZ3JhbSAxIChyZWZlciB0byB0ZXN0czEuZXhwKQorLS0KKworLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluIGxpYmNoaWxsLmEgKi8KKworcnVudGltZTogU1BFQyBNT0RVTEUKK0RDTCBjaGlsbF9hcmdjIGxvbmc7CitEQ0wgY2hpbGxfYXJndiBSRUYgQVJSQVkgKDA6MTAwMCkgUkVGIENIQVJTICgxMDAwKSBWQVJZSU5HOworX19wcmludF9ldmVudDogUFJPQyAoYXJnMCBwdHIsCisgICAgICAgYXJnMSBwdHIpIEVORDsKK19fcHJpbnRfYnVmZmVyOiBQUk9DIChhcmcwIHB0ciwKKyAgICAgICBhcmcxIHB0cikgRU5EOworR1JBTlQgQUxMOworRU5EOworCit0ZXN0czE6IG1vZHVsZTsKKworc2VpemUgCV9fcHJpbnRfZXZlbnQsCisJX19wcmludF9idWZmZXI7CisKK25ld21vZGUJc2V0MSA9IHNldChhYWEsIGJiYiwgY2NjKTsKK25ld21vZGUJbnNldDEgPSBzZXQobmEgPSAxLCBuYiA9IDM0LCBuYyA9IDIwKTsKK25ld21vZGUgcjExID0gcmFuZ2UgKDAgOiB1cHBlcih1Ynl0ZSkpOworbmV3bW9kZSByMTIgPSByYW5nZSAoMCA6IHVwcGVyKHVpbnQpKTsKKy0tbmV3bW9kZSByMTMgPSByYW5nZSAoMCA6IHVwcGVyKHVsb25nKSk7IC0tIGJ1ZyBpbiBnbnVjaGlsbAorbmV3bW9kZSByMTQgPSByYW5nZSAobG93ZXIoYnl0ZSkgOiB1cHBlcihieXRlKSk7CituZXdtb2RlIHIxNSA9IHJhbmdlIChsb3dlcihpbnQpIDogdXBwZXIoaW50KSk7CituZXdtb2RlIHIxNiA9IHJhbmdlIChsb3dlcihsb25nKTogdXBwZXIobG9uZykpOworbmV3bW9kZSByMiA9IHNldDEoYmJiIDogY2NjKTsKK25ld21vZGUgcjMgPSBuc2V0MShuYSA6IG5hKTsKK25ld21vZGUgcjQgPSBuc2V0MShuYyA6IG5iKTsKK25ld21vZGUgcjUgPSBuc2V0MShsb3dlcihuc2V0MSkgOiB1cHBlcihuc2V0MSkpOworCituZXdtb2RlIHBtMSA9IHBvd2Vyc2V0IHNldChwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgsIHA5LCBwMTApOworbmV3bW9kZSBwbTIgPSBwb3dlcnNldCBieXRlICgxOjgpOworbmV3bW9kZSBwbTMgPSBwb3dlcnNldCBpbnQgKC0zMjc2ODozMjc2Nyk7CituZXdtb2RlIHBtNCA9IHBvd2Vyc2V0IGxvbmcgKC0zMjc2ODozMjc2OCk7CituZXdtb2RlIHBtNSA9IHBvd2Vyc2V0IGxvbmcgKGxvd2VyKGxvbmcpOnVwcGVyKGxvbmcpKTsKK25ld21vZGUgcmVmMSA9IHJlZiBwbTE7CituZXdtb2RlIHJlZjIgPSByZWYgYnl0ZTsKK25ld21vZGUgcmVmMyA9IHB0cjsKK3N5bm1vZGUgcmVmNCA9IHB0cjsKK3N5bm1vZGUgc3luX2ludCA9IGludDsKKworbmV3bW9kZSBwcm0xID0gcHJvYyAoKTsKK25ld21vZGUgcHJtMiA9IHByb2MgKGJvb2wgaW4sIGludCBvdXQsIGxvbmcgaW5vdXQpIHJldHVybnMgKGNoYXIpOworbmV3bW9kZSBwcm0zID0gcHJvYyAocG0xLCByZWYxIGxvYykgcmV0dXJucyAocmVmMyk7CituZXdtb2RlIHBybTQgPSBwcm9jICgpIGV4Y2VwdGlvbnMoZXgxLCBleDIsIGV4Myk7CituZXdtb2RlIHBybTUgPSBwcm9jIChyMTEsIHIxNiBpbm91dCwgcjUgb3V0KSByZXR1cm5zIChyMikgZXhjZXB0aW9ucyAoZXgxKTsKKworbmV3bW9kZSBldjFtID0gZXZlbnQ7CituZXdtb2RlIGV2Mm0gPSBldmVudCAoNDIpOworCituZXdtb2RlIGJ1MW0gPSBidWZmZXIgcmVmMTsKK25ld21vZGUgYnUybSA9IGJ1ZmZlciAoNDIpIHVieXRlOworCituZXdtb2RlIHN0cm0xID0gY2hhciAoNSk7CitzeW5tb2RlIHN0cm0yID0gY2hhciAoNykgdmFyeWluZzsKKworc3lubW9kZSBic3RyMSA9IGJpdCgyMCk7CistLW5ld21vZGUgYnN0cjIgPSBiaXQoMTApIHZhcnlpbmc7CisKK25ld21vZGUgYXJyMW0gPSBhcnJheSgxOjEwMCkgc2V0MTsKK25ld21vZGUgYXJyMm0gPSBhcnJheSgxOjEwMCwgMToxMDApIHNldDE7CituZXdtb2RlIGFycjNtID0gYXJyYXkocjExLCByMTIsIHIxNCkgc2V0MTsKK25ld21vZGUgYXJyNG0gPSBhcnJheShyMikgYXJyYXkgKHIzKSBhcnJheSAocjQsIHI1KSBwbTE7CituZXdtb2RlIGFycjVtID0gYXJyYXkoMToxMCkgaW50OworbmV3bW9kZSBhcnI2bSA9IGFycmF5KDE6NSwgMTozLCAxOjIpIGxvbmc7CisKK25ld21vZGUgc3RydTFtID0gc3RydWN0IChhLCBiIGxvbmcsIAorCQkJIGNhc2UgYiBvZiAKKwkJCSAgICg0Mik6IGNoMSBjaGFycygyMCksCisJCQkgICAoNTIpOiBjaDIgY2hhcnMoMTApCisJCQkgICBlbHNlICBjaDMgY2hhcnMoMSkKKyAgCQkJIGVzYWMpOworCituZXdtb2RlIHN0cnUybSA9IHN0cnVjdCAoZiBzZXQxLAorCQkJIGNhc2UgZiBvZgorCQkJICAgIChhYWEpOiBjaDEgY2hhcigyMCksCisJCQkgICAgKGJiYik6IGNoMiBjaGFyKDEwKSB2YXJ5aW5nCisJCQkgZWxzZQljaDMgY2hhcigwKSB2YXJ5aW5nCisJCQkgZXNhYyk7CituZXdtb2RlIHN0cnUzbSA9IHN0cnVjdCAoZiByMywKKwkJCSBjYXNlIGYgb2YKKwkJCSAgICAobmEpOiBjaDEgY2hhcigyMCkKKwkJCSBlc2FjKTsKK25ld21vZGUgc3RydTRtID0gc3RydWN0IChpIGxvbmcsCisJCQkgY2FzZSBvZgorCQkJICAgOiBpMSwgaTExIGludCwKKwkJCSAgICAgYjEgYm9vbCwKKwkJCSAgICAgYzEgY2hhciwKKwkJCSAgIDogaTIsIGkyMiBsb25nLAorCQkJICAgICBiczIgYm9vbHMgKDEwKSwKKwkJCSAgIDoKKwkJCSAgICAgczMgc3RydWN0IChpMyBpbnQsCisJCQkJCWNhc2Ugb2YKKwkJCQkJICA6IGZvbyBsb25nCisJCQkJCSAgZWxzZSBiYXIgY2hhcgorCQkJCQllc2FjKQorCQkJICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IHN0cnUybQorICAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgeSBzdHJ1M20pOworCitzeW5tb2RlIG1feHl6bW9kZSA9IHN0cnVjdCAobmV4dCByZWYgbV94eXptb2RlLAorCQkJICAgIGkgbG9uZyk7CisKKy0tIHNldCBtb2RlIGxvY2F0aW9ucworZGNsIHMxbCBzZXQxIDo9IGNjYzsKK2RjbCBzMmwgbnNldDEgOj0gbmI7CisKKy0tIHJhbmdlIG1vZGUgbG9jYXRpb25zCitkY2wgcmwxIHIxMSA6PSAzOworZGNsIHJsMiByMTEgOj0gbG93ZXIocjExKTsKK2RjbCBybDMgcjExIDo9IHVwcGVyKHIxMSk7CisKK2RjbCBybDUgcjEyIDo9IDY1NTMwOworZGNsIHJsNiByMTIgOj0gbG93ZXIocjEyKTsKK2RjbCBybDcgcjEyIDo9IHVwcGVyKHIxMik7CisKKy0tZGNsIHJsOSByMTMgOj0gMTI4OworLS1kY2wgcmwxMCByMTMgOj0gbG93ZXIocjEzKTsKKy0tZGNsIHJsMTEgcjEzIDo9IHVwcGVyKHIxMyk7CisKK2RjbCBybDEzIHIxNCA6PSAtMTIxOworZGNsIHJsMTQgcjE0IDo9IGxvd2VyKHIxNCk7CitkY2wgcmwxNSByMTQgOj0gdXBwZXIocjE0KTsKKworZGNsIHJsMTcgcjE1IDo9IC0zMjcyMDsKK2RjbCBybDE4IHIxNSA6PSBsb3dlcihyMTUpOworZGNsIHJsMTkgcjE1IDo9IHVwcGVyKHIxNSk7CisKK2RjbCBybDIxIHIxNiA6PSAyMTQ3NDgzNjQzOworZGNsIHJsMjIgcjE2IDo9IGxvd2VyKHIxNik7CitkY2wgcmwyMyByMTYgOj0gdXBwZXIocjE2KTsKKworLS0gcG93ZXJzZXQgbW9kZSBsb2NhdGlvbnMKK2RjbCBwbDEgcG0xIDo9IFtwMTpwMTBdOworZGNsIHBsMiBwbTEgOj0gW107CitkY2wgcGwzIHBtMSA6PSBbcDEsIHAxMF07CitkY2wgcGw0IHBtMSA6PSBbcDE6cDIsIHA0OnA2LCBwODpwMTBdOworZGNsIHBsNSBwbTEgOj0gW3AxOnA0LCBwNiwgcDg6cDEwXTsKK2RjbCBwbDYgcG0xIDo9IFtwMSwgcDM6cDgsIHAxMF07IAorCitkY2wgcGw3IHBtMiA6PSBbMTo4XTsKK2RjbCBwbDggcG0zIDo9IFstMzI3Njg6MzI3NjddOworLS1kY2wgcGw5IHBtNSA6PSBbLTIxNDc0ODM2NDg6MjE0NzQ4MzY0N107CisKKy0tIHJlZmVyZW5jZSBtb2RlIGxvY2F0aW9ucworZGNsIHJlZjNsIHJlZjM7CitkY2wgcmVmNGwgcmVmNDsKK2RjbCByZWY1bCwgcmVmNmwsIHJlZjdsLCByZWY4bCBwdHI7CitkY2wgc3luX2ludGwxIHN5bl9pbnQgOj0gNDI7CitkY2wgaW50bDEgaW50IDo9IC00MjsKKworLS0gc3luY2hyb25pemF0aW9uIG1vZGUgbG9jYXRpb25zCitkY2wgZXYxbCBldjFtOworZGNsIGV2MmwgZXYybTsKK2RjbCBidTFsIGJ1MW07CitkY2wgYnUybCBidTJtOworCistLSB0aW1pbmcgbW9kZSBsb2NhdGlvbnMKK2RjbCB0aWwxIHRpbWU7CisKKy0tIHN0cmluZyBtb2RlIGxvY2F0aW9ucworZGNsIHN0cmwxLCBzdHJsMiBzdHJtMjsKK2RjbCBic3RybDEgYnN0cjEgOj0gQicxMDEwMTAxMDEwMTAxMDEwMTAxMCc7CisKKy0tIGFycmF5IG1vZGUgbG9jYXRpb25zCitkY2wgYXJybDEgYXJyMW07CitkY2wgYXJybDIgYXJyNW0gOj0gWzEsIC0xLCAzMjc2NywgLTMyNzY4LCAwLCAxMCwgMTEsIDEyLCAxMywgNDJdOworZGNsIGFycmwzIGFycjZtIDo9IFsoMTo1KTogWygxOjMpOiBbKDE6Mik6IC0yMTQ3NDgzNjQ4XV1dOworZGNsIGFycmw0IGFycjZtIDo9IFsoMToyKTogWygxOjMpOiBbKDE6Mik6IC0yMTQ3NDgzNjQ4XV0sCisJCSAgICAgICgzKTogWygxOjMpOiBbKDE6Mik6IDEwMF1dLAorCQkgICAgKDQ6NSk6IFsoMTozKTogWygxOjIpOiAtMjE0NzQ4MzY0OF1dXTsKK2RjbCBhcnJsNSBhcnJheSgxOjEwKSBuc2V0MTsKKworLS0gc3RydWN0dXJlIG1vZGUgbG9jYXRpb25zCitkY2wgc3RydWwxIHN0cnUxbSA6PSBbLTIxNDc0ODM2NDgsIDQyLCAiMTIzNDU2Nzg5MDA5ODc2NTQzMjEiXTsKKworZHVtbXlmdW5jOiBwcm9jKCk7CitlbmQgZHVtbXlmdW5jOworCityZWYzbDo9LT5wbDE7CQktLSBuZXdtb2RlIHJlZgorcmVmNGw6PS0+cGwxOwkJLS0gc3lubW9kZSByZWYKK3JlZjVsOj0tPnBsMTsJCS0tIHB0cgorCityZWY2bDo9LT5zeW5faW50bDE7CS0tIHJlZiB0byBzeW5tb2RlCityZWY3bDo9LT5pbnRsMTsJCS0tIHJlZiB0byBwcmVkZWZpbmVkIG1vZGUKK3JlZjhsOj0tPnBsMTsJCS0tIHJlZiB0byBuZXdtb2RlCisKK3N0cmwxIDo9ICJoYSIgLy8gQyc2ZScgLy8gInMiIC8vICJpIiAvLyBDJzAwJzsKK3N0cmwyIDo9IEMnMDAnIC8vICJvcGUiOworCitfX3ByaW50X2V2ZW50KGFkZHIoZXYxbCksIGFkZHIoImV2MWwiKSk7CitfX3ByaW50X2V2ZW50KGFkZHIoZXYybCksIGFkZHIoImV2MmwiKSk7CitfX3ByaW50X2J1ZmZlcihhZGRyKGJ1MWwpLCBhZGRyKCJidTFtIikpOworX19wcmludF9idWZmZXIoYWRkcihidTJsKSwgYWRkcigiYnUybSIpKTsKKwordGlsMSA6PSBhYnN0aW1lKDE5NzAsIDMsIDEyLCAxMCwgNDMsIDApOword3JpdGV0ZXh0KHN0ZG91dCwgImxvd2VyKHBtMykgPSAlQzsgdXBwZXIocG0zKSA9ICVDJS4uJS8iLCAKKwkgICAgICAgICAgbG93ZXIocG0zKSwgdXBwZXIocG0zKSk7Cit3cml0ZXRleHQoc3Rkb3V0LCAibG93ZXIocG01KSA9ICVDOyB1cHBlcihwbTUpID0gJUMlLi4lLyIsIAorCSAgICAgICAgICBsb3dlcihwbTUpLCB1cHBlcihwbTUpKTsKKy0td3JpdGV0ZXh0KHN0ZG91dCwgImxvd2VyKHBsOSkgPSAlQzsgdXBwZXIocGw5KSA9ICVDJS4uJS8iLCAKKy0tCSAgICAgICAgICBsb3dlcihwbDkpLCB1cHBlcihwbDkpKTsKK3dyaXRldGV4dChzdGRvdXQsICJkYXRlID0gJUMlLi4lLyIsIHRpbDEpOworCit3cml0ZXRleHQoc3Rkb3V0LCAic2xpY2UxID0gJUMlLi4lLyIsIHN0cmwxKDMgOiA1KSk7Cit3cml0ZXRleHQoc3Rkb3V0LCAic2xpY2UyID0gJUMlLi4lLyIsIHN0cmwyKDAgOiAzKSk7CistLXdyaXRldGV4dChzdGRvdXQsICJzbGljZTMgPSAlQyUuLiUvIiwgc3RybDEoMCB1cCAyMCkpOword3JpdGV0ZXh0KHN0ZG91dCwgInNsaWNlNCA9ICVDJS4uJS8iLCBic3RybDEoMCkpOworLS13cml0ZXRleHQoc3Rkb3V0LCAic2xpY2U1ID0gJUMlLi4lLyIsIGFycmwzKDE6NSkpOworCisKK3dyaXRldGV4dChzdGRvdXQsICJkb25lLiUvIik7CisKK2R1bW15ZnVuYygpOworCitlbmQgdGVzdHMxOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvdGVzdHMxLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3Rlc3RzMS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkZTFlYgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3Rlc3RzMS5leHAKQEAgLTAsMCArMSw4MjIgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB0ZXN0cyB2YXJpb3VzIENoaWxsIHZhbHVlcywgZXhwcmVzc2lvbnMsIGFuZCB0eXBlcy4KKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK2lmIFtza2lwX2NoaWxsX3Rlc3RzXSB0aGVuIHsgY29udGludWUgfQorCitzZXQgdGVzdGZpbGUgInRlc3RzMSIKK3NldCBzcmNmaWxlICR7c3JjZGlyfS8kc3ViZGlyLyR7dGVzdGZpbGV9LmNoCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LmV4ZQoraWYgIHsgW2NvbXBpbGUgIiR7c3JjZmlsZX0gLWcgLXcgLW8gJHtiaW5maWxlfSAke0NISUxMX1JUMH0gJHtDSElMTF9MSUJ9Il0gIT0gIiIgfSB7CisgICAgcGVycm9yICJDb3VsZG4ndCBjb21waWxlICR7c3JjZmlsZX0iCisgICAgcmV0dXJuIC0xCit9CisKKyMgU2V0IHRoZSBjdXJyZW50IGxhbmd1YWdlIHRvIGNoaWxsLiAgVGhpcyBjb3VudHMgYXMgYSB0ZXN0LiAgSWYgaXQKKyMgZmFpbHMsIHRoZW4gd2Ugc2tpcCB0aGUgb3RoZXIgdGVzdHMuCisKK3Byb2Mgc2V0X2xhbmdfY2hpbGwge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGJpbmZpbGUgb2JqZGlyIHN1YmRpcgorCisgICAgdmVyYm9zZSAibG9hZGluZyBmaWxlICckYmluZmlsZSciCisgICAgZ2RiX2xvYWQgJGJpbmZpbGUKKyAgICBzZW5kX2dkYiAic2V0IGxhbmd1YWdlIGNoaWxsXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9CisJdGltZW91dCB7IGZhaWwgInNldCBsYW5ndWFnZSBjaGlsbCAodGltZW91dCkiIDsgcmV0dXJuIDAgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJzaG93IGxhbmd1YWdlXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiBzb3VyY2UgbGFuZ3VhZ2UgaXMgXCJjaGlsbFwiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInNldCBsYW5ndWFnZSB0byBcImNoaWxsXCIiCisJICAgIHNlbmRfZ2RiICJicmVhayBkdW1teWZ1bmNcbiIKKwkgICAgZ2RiX2V4cGVjdCB7CisJCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJCSAgICBzZW5kX2dkYiAicnVuXG4iIAorCQkgICAgZ2RiX2V4cGVjdCAtcmUgIi4qJGdkYl9wcm9tcHQgJCIge30KKwkJICAgIHJldHVybiAxCisJCX0KKwkJdGltZW91dCB7CisJCSAgICBmYWlsICJjYW4ndCBzZXQgYnJlYWtwb2ludCAodGltZW91dCkiCisJCSAgICByZXR1cm4gMAorCQl9CisJICAgIH0KKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAic2V0dGluZyBsYW5ndWFnZSB0byBcImNoaWxsXCIiCisJICAgIHJldHVybiAwCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJjYW4ndCBzaG93IGxhbmd1YWdlICh0aW1lb3V0KSIKKwkgICAgcmV0dXJuIDAKKwl9CisgICAgfQorfQorCisjIFRlc3RpbmcgcHJpbnRpbmcgb2YgYSBzcGVjaWZpYyB2YWx1ZS4gIEluY3JlbWVudCBwYXNzY291bnQgZm9yCisjIHN1Y2Nlc3Mgb3IgaXNzdWUgZmFpbCBtZXNzYWdlIGZvciBmYWlsdXJlLiAgSW4gYm90aCBjYXNlcywgcmV0dXJuCisjIGEgMSB0byBpbmRpY2F0ZSB0aGF0IG1vcmUgdGVzdHMgY2FuIHByb2NlZWQuICBIb3dldmVyIGEgdGltZW91dAorIyBpcyBhIHNlcmlvdXMgZXJyb3IsIGdlbmVyYXRlcyBhIHNwZWNpYWwgZmFpbCBtZXNzYWdlLCBhbmQgY2F1c2VzCisjIGEgMCB0byBiZSByZXR1cm5lZCB0byBpbmRpY2F0ZSB0aGF0IG1vcmUgdGVzdHMgYXJlIGxpa2VseSB0byBmYWlsCisjIGFzIHdlbGwuCisjCisjIEFyZ3MgYXJlOgorIworIwlGaXJzdCBvbmUgaXMgc3RyaW5nIHRvIHNlbmRfZ2RiIHRvIGdkYgorIwlTZWNvbmQgb25lIGlzIHN0cmluZyB0byBtYXRjaCBnZGIgcmVzdWx0IHRvCisjCVRoaXJkIG9uZSBpcyBhbiBvcHRpb25hbCBtZXNzYWdlIHRvIGJlIHByaW50ZWQKKworcHJvYyB0ZXN0X3ByaW50X2FjY2VwdCB7IGFyZ3MgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgcGFzc2NvdW50CisgICAgZ2xvYmFsIHZlcmJvc2UKKworICAgIGlmIFtsbGVuZ3RoICRhcmdzXT09MyB0aGVuIHsKKwlzZXQgbWVzc2FnZSBbbGluZGV4ICRhcmdzIDJdCisgICAgfSBlbHNlIHsKKwlzZXQgbWVzc2FnZSBbbGluZGV4ICRhcmdzIDBdCisgICAgfQorICAgIHNldCBzZW5kdGhpcyBbbGluZGV4ICRhcmdzIDBdCisgICAgc2V0IGV4cGVjdHRoaXMgW2xpbmRleCAkYXJncyAxXQorICAgIHNldCByZXN1bHQgW2dkYl90ZXN0ICRzZW5kdGhpcyAiLiogPSAke2V4cGVjdHRoaXN9IiAkbWVzc2FnZV0KKyAgICBpZiAkcmVzdWx0PT0wIHtpbmNyIHBhc3Njb3VudH0KKyAgICByZXR1cm4gJHJlc3VsdAorfQorCisjIFRlc3RpbmcgcHJpbnRpbmcgb2YgYSBzcGVjaWZpYyB2YWx1ZS4gIEluY3JlbWVudCBwYXNzY291bnQgZm9yCisjIHN1Y2Nlc3Mgb3IgaXNzdWUgZmFpbCBtZXNzYWdlIGZvciBmYWlsdXJlLiAgSW4gYm90aCBjYXNlcywgcmV0dXJuCisjIGEgMSB0byBpbmRpY2F0ZSB0aGF0IG1vcmUgdGVzdHMgY2FuIHByb2NlZWQuICBIb3dldmVyIGEgdGltZW91dAorIyBpcyBhIHNlcmlvdXMgZXJyb3IsIGdlbmVyYXRlcyBhIHNwZWNpYWwgZmFpbCBtZXNzYWdlLCBhbmQgY2F1c2VzCisjIGEgMCB0byBiZSByZXR1cm5lZCB0byBpbmRpY2F0ZSB0aGF0IG1vcmUgdGVzdHMgYXJlIGxpa2VseSB0byBmYWlsCisjIGFzIHdlbGwuCisKKyMgdmFyaW91cyB0ZXN0cyBpZiBtb2RlcyBhcmUgdHJlYXRlZCBjb3JyZWN0bHkKKyMgdXNpbmcgcHR5cGUKK3Byb2MgdGVzdF9tb2RlcyB7fSB7CisgICAgZ2xvYmFsIHBhc3Njb3VudAorCisgICAgdmVyYm9zZSAidGVzdGluZyBjaGlsbCBtb2RlcyIKKyAgICBzZXQgcGFzc2NvdW50IDAKKworICAgICMgZGlzY3JldGUgbW9kZXMKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgQllURSIgImJ5dGUiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIFVCWVRFIiAidWJ5dGUiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIElOVCIgImludCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgVUlOVCIgInVpbnQiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIExPTkciICJsb25nIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBVTE9ORyIgInVsb25nIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBCT09MIiAiYm9vbCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgQ0hBUiIgImNoYXIiCisKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgc2V0MSIgIlNFVCBcWyhcXWFhYSwgYmJiLCBjY2NcWylcXSIgXAorCSJwcmludCB1bm51bWJlcmVkIHNldCBtb2RlIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBuc2V0MSIgIlNFVCBcWyhcXW5hID0gMSwgbmIgPSAzNCwgbmMgPSAyMFxbKVxdIiBcCisJInByaW50IG51bWJlcmVkIHNldCBtb2RlIgorCisgICAgIyBtcDoKKyAgICAjIGRpc3BsYXkgbWF5YmUgaW4gaGV4IHZhbHVlcyA/CisgICAgIworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSByMTEiICJ1Ynl0ZSBcXCgwOjI1NVxcKSIgXAorCSJwcmludCB1Ynl0ZSByYW5nZSBtb2RlIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSByMTIiICJ1aW50IFxcKDA6NjU1MzVcXCkiIFwKKwkicHJpbnQgdWludCByYW5nZSBtb2RlIgorIyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcjEzIiAidWxvbmcgXFwoMDo0Mjk0OTY3Mjk1XFwpIiBcCisjCSJwcmludCB1bG9uZyByYW5nZSBtb2RlIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSByMTQiICJieXRlIFxcKC0xMjg6MTI3XFwpIiBcCisJInByaW50IGJ5dGUgcmFuZ2UgbW9kZSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcjE1IiAiaW50IFxcKC0zMjc2ODozMjc2N1xcKSIgXAorCSJwcmludCBpbnQgcmFuZ2UgbW9kZSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcjE2IiAibG9uZyBcXCgtMjE0NzQ4MzY0ODoyMTQ3NDgzNjQ3XFwpIiBcCisJInByaW50IGxvbmcgcmFuZ2UgbW9kZSIKKworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSByMiIgInNldDEgXFwoYmJiOmNjY1xcKSIgXAorCSJwcmludCB1bm51bWJlcmVkIHNldCByYW5nZSBtb2RlIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSByMyIgIm5zZXQxIFxcKG5hOm5hXFwpIiBcCisJInByaW50IG51bWJlcmVkIHNldCByYW5nZSBtb2RlIgorICAgICMgcmVhbGx5IHRoaXMgb3JkZXIgPworICAgICMgSSdtIG5vdCBzdXJlIHdoYXQgc2hvdWxkIGhhcHBlbiBmb3IgdGhlIG5leHQgdHdvIHRlc3RzLgorICAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcjQiICJuc2V0MSBcXChuYiA9IDM0Om5jID0gMjBcXCkiIFwKKwkicHJpbnQgbnVtYmVyZWQgc2V0IHJhbmdlIG1vZGUiCisgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSByNSIgIm5zZXQxIFxcKG5hID0gMSwgbmIgPSAzNCwgbmMgPSAyMFxcKSIgXAorCSJwcmludCBudW1iZXJlZCBzZXQgcmFuZ2UgbW9kZSIKKworICAgICMgcG93ZXJzZXQgbW9kZXMKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcG0xIiBcCisJIlBPV0VSU0VUIFNFVCBcWyhcXXAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDksIHAxMFxbKVxdIiBcCisJInByaW50IHBvd2Vyc2V0IG1vZGUgMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcG0yIiAiUE9XRVJTRVQgYnl0ZSBcXCgxOjhcXCkiIFwKKwkicHJpbnQgcG93ZXJzZXQgbW9kZSAyIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBwbTMiICJQT1dFUlNFVCBpbnQgXFwoLTMyNzY4OjMyNzY3XFwpIiBcCisJInByaW50IHBvd2Vyc2V0IG1vZGUgMyIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcG00IiAiUE9XRVJTRVQgbG9uZyBcXCgtMzI3Njg6MzI3NjhcXCkiIFwKKwkicHJpbnQgcG93ZXJzZXQgbW9kZSA0IgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBwbTUiIFwKKwkiUE9XRVJTRVQgbG9uZyBcXCgtMjE0NzQ4MzY0ODoyMTQ3NDgzNjQ3XFwpIiBcCisJInByaW50IHBvd2Vyc2V0IG1vZGUgNSIKKyAgICAKKyAgICAjIHJlZmVyZW5jZSBtb2RlcworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSByZWYxIiAiUkVGIHBtMSIgXAorCSJwcmludCByZWZlcmVuY2UgdG8gcG93ZXJzZXQgbW9kZSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcmVmMiIgIlJFRiBieXRlIiBcCisJInByaW50IHJlZmVyZW5jZSB0byBieXRlIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSByZWYzIiAiUFRSIiBcCisJInByaW50IGZyZWUgcmVmZXJlbmNlIHR5cGUiCisKKyAgICAjIHByb2NlZHVyZSBtb2RlcworICAgICMgRklYTUU6IHdlIGhhdmUgdG8gdGFsayBhYm91dCB0aGlzIC4uLiAKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcHJtMSIgXAorCSJSRUYgUFJPQyBcWyhcXVxbKVxdIiBcCisJInByaW50IHByb2NlZHVyZSBtb2RlIDEiCisgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBwcm0yIiBcCisJIlJFRiBQUk9DIFxbKFxdYm9vbCBpbiwgaW50IG91dCBsb25nIGlub3V0XFspXF0gUkVUVVJOUyBcWyhcXWNoYXJcWylcXSIgXAorCSJwcmludCBwcm9jZWR1cmUgbW9kZSAyIgorICAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcHJtMyIgXAorCSJSRUYgUFJPQyBcWyhcXXBtMSwgcmVmIGxvY1xbKVxdIFJFVFVSTlMgXFsoXF1yZWYzXFspXF0iIFwKKwkicHJpbnQgcHJvY2VkdXJlIG1vZGUgMyIKKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIHBybTQiIFwKKwkiXFsoXF0gXFspXF0gRVhDRVBUSU9OUyBcWyhcXWV4MSwgZXgyLCBleDNcWylcXSIgXAorCSJwcmludCBwcm9jZWR1cmUgbW9kZSA0IgorICAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcHJtNSIgXAorCSJSRUYgUFJPQyBcWyhcXXIxMSwgcjE2IGlub3V0LCByNSBvdXRcWylcXSBSRVRVUk5TIFxbKFxdcjJcWylcXSBFWENFUFRJT05TIFxbKFxdZXgxXFspXF0iIFwKKwkicHJpbnQgcHJvY2VkdXJlIG1vZGUgNSIKKworICAgICMgc3luY2hyb25pemF0aW9uIG1vZGVzCisgICAgIyBGSVhNRTogc2luY2UgZ2RiIGRvZXNuJ3QgcHJvY2VzcyBldmVudHMgJiBidWZmZXJzIHNvIGZhciwgdGhpcyBoYXMgYmUgCisgICAgIyAgICAgICAgZmlsbGVkIGxhdGVyLi4uCisgICAgeGZhaWwgInN5bmNocm9uaXphdGlvbiBtb2RlIGhhbmRsaW5nIgorCisgICAgIyB0aW1pbmcgbW9kZXMKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgRFVSQVRJT04iICJkdXJhdGlvbiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgVElNRSIgInRpbWUiCisKKyAgICAjIHN0cmluZyBtb2RlcworICAgICMgc29tZSB0ZXN0cyBhcmUgZG9uZSBpbiBjaGlsbHZhcnMuZXhwCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIHN0cm0xIiAiQ0hBUlMgXFwoNVxcKSIgInByaW50IGNoYXIgc3RyaW5nIG1vZGUiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIHN0cm0yIiAiQ0hBUlMgXFsoXF03XFspXF0gVkFSWUlORyIgXAorCSJwcmludCB2YXJ5aW5nIGNoYXIgc3RyaW5nIG1vZGUiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIGJzdHIxIiAiQk9PTFMgXFwoMjBcXCkiICJwcmludCBiaXQgc3RyaW5nIG1vZGUiCisKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgQicwMDAnIiAiQk9PTFMgXFwoM1xcKSIgImJpdCBzdHJpbmcgbGl0ZXJhbCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgQicxMTExMDAwMCciICJCT09MUyBcXCg4XFwpIiAiYml0IHN0cmluZyBsaXRlcmFsIgorICAgICMgRklYTUU6IGFkanVzdCBlcnJvciBtZXNzYWdlCisgICAgZ2RiX3Rlc3QgInB0eXBlIEInMDAxMTAyMTEnIiB7LipUb28tbGFyZ2UgZGlnaXQuKlsuXX0gXAorCSJyZWplY3QgaW52YWxpZCBiaXRzdHJpbmciCisKKyAgICAjIGFycmF5IG1vZGVzCisgICAgIyBzb21lIHRlc3RzIGFyZSBkb25lIGluIGNoaWxsdmFycy5leHAKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgYXJyMW0iICJBUlJBWSBcXCgxOjEwMFxcKSBzZXQxIiBcCisJInByaW50IGFycmF5IG1vZGUgMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgYXJyMm0iICJBUlJBWSBcXCgxOjEwMFxcKSBBUlJBWSBcXCgxOjEwMFxcKSBzZXQxIlwKKwkicHJpbnQgYXJyYXkgbW9kZSAyIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBhcnIzbSIgIkFSUkFZIFxcKDA6MjU1XFwpIEFSUkFZIFxcKDA6NjU1MzVcXCkgQVJSQVkgXFwoLTEyODoxMjdcXCkgc2V0MSIgXAorCSJwcmludCBhcnJheSBtb2RlIDMiCisgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBhcnI0bSIgIkFSUkFZIFxcKGI6Y1xcKSBBUlJBWSBcXChuYSA9IDE6bmEgPSAxXFwpIEFSUkFZIFxcKG5jOm5iXFwpIEFSUkFZIFxcKG5hID0gMTpuYyA9IDIwXFwpIFBPV0VSU0VUIFNFVCBcWyhcXXAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDksIHAxMFxbKVxdIiBcCisJInByaW50IGFycmF5IG1vZGUgNCIKKyAgICAKKyAgICAjIHN0cnVjdHVyZSBtb2RlcworICAgICMgc29tZSBjaGVja3MgYXJlIGluIGNoaWxsdmFycy5leHAKKyAgICAjIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgc3RydTFtIiAiU1RSVUNUIFxcKC4qYSBsb25nLC4qYiBsb25nLC4qQ0FTRSBPRi4qOi4qY2gxIENIQVJTIFxcKDIwXFwpLio6LipjaDIgQ0hBUlMgXFwoMTBcXCkuKkVMU0UuKmNoMyBDSEFSUyBcXCgxXFwpLipFU0FDLipcXCkiIFwKKwkicHJpbnQgc3RydWN0dXJlIG1vZGUgMSIKKyAgICAjc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBzdHJ1Mm0iICJTVFJVQ1QgXFwoLipmIHNldDEsLipDQVNFIE9GLio6LipjaDEgQ0hBUlMgXFwoMjBcXCkuKjouKmNoMiBDSEFSUyBcXCgxMFxcKSBWQVJZSU5HLipFTFNFLipjaDMgQ0hBUlMgXFwoMFxcKSBWQVJZSU5HLipFU0FDLipcXCkiIFwKKwkicHJpbnQgc3RydWN0dXJlIG1vZGUgMiIKKyAgICAjc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBzdHJ1M20iICJTVFJVQ1QgXFwoLipmIHIzLC4qQ0FTRSBPRi4qOi4qY2gxIENIQVJTIFxcKDIwXFwpLipFU0FDLipcXCkiIFwKKwkicHJpbnQgc3RydWN0dXJlIG1vZGUgMyIKKyAgICAjIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgc3RydTRtIiAiU1RSVUNUIFxcKC4qaSBsb25nLC4qQ0FTRSBPRi4qOi4qaTEgaW50LC4qaTExIGludCwuKmIxIGJvb2wsLipjMSBjaGFyLio6LippMiBsb25nLC4qaTIyIGxvbmcsLipiczIgQk9PTFMgXFwoMTBcXCkuKjouKnMzIFNUUlVDVCBcXCguKmkzIGludCwuKkNBU0UgT0YuKjouKmZvbyBsb25nLipFTFNFLipiYXIgY2hhci4qRVNBQy4qXFwpLipFTFNFLip4IHN0cnUybS4qRVNBQywuKnkgc3RydTNtLipcXCkiIFwKKwkicHJpbnQgc3RydWN0dXJlIG1vZGUgNCIKKyAgIAorICAgIAorICAgIGlmICRwYXNzY291bnQgdGhlbiB7CisJcGFzcyAiJHBhc3Njb3VudCBjb3JyZWN0IG1vZGVzIHByaW50ZWQiCisgICAgfQorfQorCisjIHZhcmlvdXMgdGVzdHMgaWYgbG9jYXRpb25zIGFyZSB0cmVhdGVkIGNvcnJlY3RseQorIyByZWFkIGFjY2VzcyB1c2luZyBwdHlwZSwgcHJpbnQsIHdoYXRpcworcHJvYyB0ZXN0X2xvY2F0aW9ucyB7fSB7CisgICAgZ2xvYmFsIHBhc3Njb3VudAorCisgICAgc2V0IHBhc3Njb3VudCAwCisgICAgdmVyYm9zZSAidGVzdGluZyByZWFkIGFjY2VzcyB0byBsb2NhdGlvbnMiCisgICAgIyB2YXJpb3VzIGxvY2F0aW9uIHRlc3RzIGNhbiBiZSBmb3VuZCBpbiBjaGlsbHZhcnMuZXhwCisKKyAgICAjIHNldCBsb2NhdGlvbnMKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgczFsIiAiU0VUIFxcKGFhYSwgYmJiLCBjY2NcXCkiIFwKKwkicHJpbnQgbW9kZSBvZiBzZXQgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgIndoYXRpcyBzMWwiICJzZXQxIiBcCisJInByaW50IG1vZGVuYW1lIG9mIHNldCBsb2NhdGlvbiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgczFsIiAiY2NjIiAicHJpbnQgc2V0IGxvY2F0aW9uIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBzMmwiICJTRVQgXFwobmEgPSAxLCBuYiA9IDM0LCBuYyA9IDIwXFwpIiBcCisJInByaW50IG1vZGUgb2YgbnVtYmVyZWQgc2V0IGxvY2F0aW9uIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJ3aGF0aXMgczJsIiAibnNldDEiIFwKKwkicHJpbnQgbW9kZSBuYW1lIG9mIG51bWJlcmVkIHNldCBsb2NhdGlvbiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgczJsIiAibmIiICJwcmludCBudW1iZXJlcyBzZXQgbG9jYXRpb24iCisKKyAgICAjIHJhbmdlIG1vZGVzCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIHJsMSIgInVieXRlIFxcKDA6MjU1XFwpIiBcCisJInByaW50IG1vZGUgb2YgcmFuZ2UgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgIndoYXRpcyBybDEiICJyMTEiIFwKKwkicHJpbnQgbW9kZSBuYW1lIG9mIHJhbmdlIGxvY2F0aW9uIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBybDEiICIzIiBcCisJInByaW50IHJhbmdlIGxvY2F0aW9uIgorCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIHJsMiIgInVieXRlIFxcKDA6MjU1XFwpIiBcCisJInByaW50IG1vZGUgb2YgcmFuZ2UgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgIndoYXRpcyBybDIiICJyMTEiIFwKKwkicHJpbnQgbW9kZSBuYW1lIG9mIHJhbmdlIGxvY2F0aW9uIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBybDIiICIwIiBcCisJInByaW50IHJhbmdlIGxvY2F0aW9uIgorCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIHJsMyIgInVieXRlIFxcKDA6MjU1XFwpIiBcCisJInByaW50IG1vZGUgb2YgcmFuZ2UgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgIndoYXRpcyBybDMiICJyMTEiIFwKKwkicHJpbnQgbW9kZSBuYW1lIG9mIHJhbmdlIGxvY2F0aW9uIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBybDMiICIyNTUiIFwKKwkicHJpbnQgcmFuZ2UgbG9jYXRpb24iCisKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcmw1IiAidWludCBcXCgwOjY1NTM1XFwpIiBcCisJInByaW50IG1vZGUgb2YgcmFuZ2UgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgIndoYXRpcyBybDUiICJyMTIiIFwKKwkicHJpbnQgbW9kZSBuYW1lIG9mIHJhbmdlIGxvY2F0aW9uIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBybDUiICI2NTUzMCIgXAorCSJwcmludCByYW5nZSBsb2NhdGlvbiIKKworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBybDYiICJ1aW50IFxcKDA6NjU1MzVcXCkiIFwKKwkicHJpbnQgbW9kZSBvZiByYW5nZSBsb2NhdGlvbiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAid2hhdGlzIHJsNiIgInIxMiIgXAorCSJwcmludCBtb2RlIG5hbWUgb2YgcmFuZ2UgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHJsNiIgIjAiIFwKKwkicHJpbnQgcmFuZ2UgbG9jYXRpb24iCisJCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIHJsNyIgInVpbnQgXFwoMDo2NTUzNVxcKSIgXAorCSJwcmludCBtb2RlIG9mIHJhbmdlIGxvY2F0aW9uIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJ3aGF0aXMgcmw3IiAicjEyIiBcCisJInByaW50IG1vZGUgbmFtZSBvZiByYW5nZSBsb2NhdGlvbiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgcmw3IiAiNjU1MzUiIFwKKwkicHJpbnQgcmFuZ2UgbG9jYXRpb24iCisJCisjICAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcmw5IiAidWxvbmcgXFwoMDo0Mjk0OTY3Mjk1XFwpIiBcCisjIAkicHJpbnQgbW9kZSBvZiByYW5nZSBsb2NhdGlvbiIKKyMgICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJ3aGF0aXMgcmw5IiAicjEzIiBcCisjIAkicHJpbnQgbW9kZSBuYW1lIG9mIHJhbmdlIGxvY2F0aW9uIgorIyAgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHJsOSIgIjEyOCIgXAorIyAJInByaW50IHJhbmdlIGxvY2F0aW9uIgorCQorIyAgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIHJsMTAiICJ1bG9uZyBcXCgwOjQyOTQ5NjcyOTVcXCkiIFwKKyMgCSJwcmludCBtb2RlIG9mIHJhbmdlIGxvY2F0aW9uIgorIyAgICAgdGVzdF9wcmludF9hY2NlcHQgIndoYXRpcyBybDEwIiAicjEzIiBcCisjIAkicHJpbnQgbW9kZSBuYW1lIG9mIHJhbmdlIGxvY2F0aW9uIgorIyAgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHJsMTAiICIwIiBcCisjIAkicHJpbnQgcmFuZ2UgbG9jYXRpb24iCisJCisjICAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcmwxMSIgInVsb25nIFxcKDA6NDI5NDk2NzI5NVxcKSIgXAorIyAJInByaW50IG1vZGUgb2YgcmFuZ2UgbG9jYXRpb24iCisjICAgICB0ZXN0X3ByaW50X2FjY2VwdCAid2hhdGlzIHJsMTEiICJyMTMiIFwKKyMgCSJwcmludCBtb2RlIG5hbWUgb2YgcmFuZ2UgbG9jYXRpb24iCisjICAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgcmwxMSIgIjQyOTQ5NjcyOTUiIFwKKyMgCSJwcmludCByYW5nZSBsb2NhdGlvbiIKKworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBybDEzIiAiYnl0ZSBcXCgtMTI4OjEyN1xcKSIgXAorCSJwcmludCBtb2RlIG9mIHJhbmdlIGxvY2F0aW9uIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJ3aGF0aXMgcmwxMyIgInIxNCIgXAorCSJwcmludCBtb2RlIG5hbWUgb2YgcmFuZ2UgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHJsMTMiICItMTIxIiBcCisJInByaW50IHJhbmdlIGxvY2F0aW9uIgorCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIHJsMTQiICJieXRlIFxcKC0xMjg6MTI3XFwpIiBcCisJInByaW50IG1vZGUgb2YgcmFuZ2UgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgIndoYXRpcyBybDE0IiAicjE0IiBcCisJInByaW50IG1vZGUgbmFtZSBvZiByYW5nZSBsb2NhdGlvbiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgcmwxNCIgIi0xMjgiIFwKKwkicHJpbnQgcmFuZ2UgbG9jYXRpb24iCisKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcmwxNSIgImJ5dGUgXFwoLTEyODoxMjdcXCkiIFwKKwkicHJpbnQgbW9kZSBvZiByYW5nZSBsb2NhdGlvbiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAid2hhdGlzIHJsMTUiICJyMTQiIFwKKwkicHJpbnQgbW9kZSBuYW1lIG9mIHJhbmdlIGxvY2F0aW9uIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBybDE1IiAiMTI3IiBcCisJInByaW50IHJhbmdlIGxvY2F0aW9uIgorCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIHJsMTciICJpbnQgXFwoLTMyNzY4OjMyNzY3XFwpIiBcCisJInByaW50IG1vZGUgb2YgcmFuZ2UgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgIndoYXRpcyBybDE3IiAicjE1IiBcCisJInByaW50IG1vZGUgbmFtZSBvZiByYW5nZSBsb2NhdGlvbiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgcmwxNyIgIi0zMjcyMCIgXAorCSJwcmludCByYW5nZSBsb2NhdGlvbiIKKworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBybDE4IiAiaW50IFxcKC0zMjc2ODozMjc2N1xcKSIgXAorCSJwcmludCBtb2RlIG9mIHJhbmdlIGxvY2F0aW9uIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJ3aGF0aXMgcmwxOCIgInIxNSIgXAorCSJwcmludCBtb2RlIG5hbWUgb2YgcmFuZ2UgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHJsMTgiICItMzI3NjgiIFwKKwkicHJpbnQgcmFuZ2UgbG9jYXRpb24iCisKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcmwxOSIgImludCBcXCgtMzI3Njg6MzI3NjdcXCkiIFwKKwkicHJpbnQgbW9kZSBvZiByYW5nZSBsb2NhdGlvbiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAid2hhdGlzIHJsMTkiICJyMTUiIFwKKwkicHJpbnQgbW9kZSBuYW1lIG9mIHJhbmdlIGxvY2F0aW9uIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBybDE5IiAiMzI3NjciIFwKKwkicHJpbnQgcmFuZ2UgbG9jYXRpb24iCisKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcmwyMSIgImxvbmcgXFwoLTIxNDc0ODM2NDg6MjE0NzQ4MzY0N1xcKSIgXAorCSJwcmludCBtb2RlIG9mIHJhbmdlIGxvY2F0aW9uIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJ3aGF0aXMgcmwyMSIgInIxNiIgXAorCSJwcmludCBtb2RlIG5hbWUgb2YgcmFuZ2UgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHJsMjEiICIyMTQ3NDgzNjQzIiBcCisJInByaW50IHJhbmdlIGxvY2F0aW9uIgorCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIHJsMjIiICJsb25nIFxcKC0yMTQ3NDgzNjQ4OjIxNDc0ODM2NDdcXCkiIFwKKwkicHJpbnQgbW9kZSBvZiByYW5nZSBsb2NhdGlvbiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAid2hhdGlzIHJsMjIiICJyMTYiIFwKKwkicHJpbnQgbW9kZSBuYW1lIG9mIHJhbmdlIGxvY2F0aW9uIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBybDIyIiAiLTIxNDc0ODM2NDgiIFwKKwkicHJpbnQgcmFuZ2UgbG9jYXRpb24iCisKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcmwyMyIgImxvbmcgXFwoLTIxNDc0ODM2NDg6MjE0NzQ4MzY0N1xcKSIgXAorCSJwcmludCBtb2RlIG9mIHJhbmdlIGxvY2F0aW9uIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJ3aGF0aXMgcmwyMyIgInIxNiIgXAorCSJwcmludCBtb2RlIG5hbWUgb2YgcmFuZ2UgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHJsMjMiICIyMTQ3NDgzNjQ3IiBcCisJInByaW50IHJhbmdlIGxvY2F0aW9uIgorICAgIAorICAgICMgcG93ZXJzZXQgbG9jYXRpb25zCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIHBsMSIgXAorCSJQT1dFUlNFVCBTRVQgXFwocDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBwOSwgcDEwXFwpIiBcCisJInByaW50IG1vZGUgb2YgcG93ZXJzZXQgbG9jYXRpb24gMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAid2hhdGlzIHBsMSIgInBtMSIgXAorCSJwcmludCBtb2RlIG1vZGUgbmFtZSBvZiBwb3dlcnNldCBsb2NhdGlvbiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgcGwxIiBcCisJIlxbXFtcXXAxOnAxMFxbXF1cXSIgXAorCSJwcmludCBwb3dlcnNldCBsb2NhdGlvbiAxIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBwbDIiIHtcW1xdfSBcCisJInByaW50IHBvd2Vyc2V0IGxvY2F0aW9uIDIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHBsMyIgIlxbXFtcXXAxLCBwMTBcW1xdXF0iIFwKKyAgICAJInByaW50IHBvd2Vyc2V0IGxvY2F0aW9uIDMiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHBsNCIge1xbcDE6cDIsIHA0OnA2LCBwODpwMTBcXX0gXAorCSJwcmludCBwb3dlcnNldCBsb2NhdGlvbiA0IgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBwbDUiIHtcW3AxOnA0LCBwNiwgcDg6cDEwXF19IFwKKwkicHJpbnQgcG93ZXJzZXQgbG9jYXRpb24gNSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgcGw2IiB7XFtwMSwgcDM6cDgsIHAxMFxdfSBcCisJInByaW50IHBvd2Vyc2V0IGxvY2F0aW9uIDYiCisgICAgCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIHBsNyIgXAorCSJQT1dFUlNFVCBieXRlIFxcKDE6OFxcKSIgXAorCSJwcmludCBtb2RlIG9mIGJ5dGUgcG93ZXJzZXQgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgIndoYXRpcyBwbDciICJwbTIiIFwKKwkicHJpbnQgbW9kZW5hbWUgb2YgYnl0ZSBwb3dlcnNldCBsb2NhdGlvbiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgcGw3IiB7XFsxOjhcXX0gXAorCSJwcmludCBwb3dlcnNldCBsb2NhdGlvbiA3IgorICAgIAorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBwbDgiIFwKKwkiUE9XRVJTRVQgaW50IFxcKC0zMjc2ODozMjc2N1xcKSIgXAorCSJwcmludCBtb2RlIG9mIGludCBwb3dlcnNldCBsb2NhdGlvbiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAid2hhdGlzIHBsOCIgInBtMyIgXAorCSJwcmludCBtb2RlbmFtZSBvZiBpbnQgcG93ZXJzZXQgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHBsOCIge1xbLTMyNzY4OjMyNzY3XF19IFwKKwkicHJpbnQgcG93ZXJzZXQgbG9jYXRpb24gOCIKKyAgICAKKyMgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIHBsOSIgXAorIwkiUE9XRVJTRVQgbG9uZyBcXCgtMjE0NzQ4MzY0ODoyMTQ3NDgzNjQ3XFwpIiBcCisjCSJwcmludCBtb2RlIG9mIGxvbmcgcG93ZXJzZXQgbG9jYXRpb24iCisjICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJ3aGF0aXMgcGw5IiAicG01IiBcCisjCSJwcmludCBtb2RlbmFtZSBvZiBsb25nIHBvd2Vyc2V0IGxvY2F0aW9uIgorIyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgcGw5IiB7XFstMjE0NzQ4MzY0ODoyMTQ3NDgzNjQ3XF19IFwKKyMJInByaW50IHBvd2Vyc2V0IGxvY2F0aW9uIDkiCisgICAgCisgICAgIyByZWZlcmVuY2UgbW9kZXMKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgcmVmM2wiICJQVFIiICJwcmludCBtb2RlIG9mIHJlZmVyZW5jZSBsb2NhdGlvbiIKKyAgICAjIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAid2hhdGlzIHJlZjNsIiAicmVmMyIgXAorCSJwcmludCBtb2RlbmFtZSBvZiByZWZlcmVuY2UgbG9jYXRpb24iCisgICAgIyBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHJlZjNsIiAicmVmM1xcKEgnLipcXCkiIFwKKwkicHJpbnQgcmVmZXJlbmNlIGxvY2F0aW9uIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSByZWY0bCIgIlBUUiIgInByaW50IG1vZGUgb2YgcmVmZXJlbmNlIGxvY2F0aW9uIgorICAgICMgc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJ3aGF0aXMgcmVmNGwiICJyZWY0IiBcCisJInByaW50IG1vZGVuYW1lIG9mIHJlZmVyZW5jZSBsb2NhdGlvbiIKKyAgICAjIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgcmVmNGwiICJyZWY0XFwoSCcuKlxcKSIgXAorCSJwcmludCByZWZlcmVuY2UgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIHJlZjVsIiAiUFRSIiAicHJpbnQgbW9kZSBvZiByZWZlcmVuY2UgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgIndoYXRpcyByZWY1bCIgIlBUUiIgXAorCSJwcmludCBtb2RlbmFtZSBvZiByZWZlcmVuY2UgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHJlZjVsIiAiUFRSXFwoSCcuKlxcKSIgXAorCSJwcmludCByZWZlcmVuY2UgbG9jYXRpb24iCisKKyAgICAjIGRlcmVmZXJlbmNlIGEgbGl0dGxlIGJpdC4uCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHJlZjZsLT5zeW5faW50IiAiNDIiIFwKKwkiZGVyZWZlcmVuY2UgcmVmZXJlbmNlIHRvIHN5bm1vZGUgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHJlZjdsLT5pbnQiICItNDIiIFwKKwkiZGVyZWZlcmVuY2UgcmVmZXJlbmNlIHRvIHByZWRlZmluZWQgbW9kZSBsb2NhdGlvbiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgcmVmOGwtPnBtMSIgXAorCSJcW1xbXF1wMTpwMTBcW1xdXF0iIFwKKwkiZGVyZWZlcmVuY2UgcmVmZXJlbmNlIHRvIG5ld21vZGUgbG9jYXRpb24iCisKKyAgICAjIHN5bmNocm9uaXphdGlvbiBtb2RlIGxvY2F0aW9ucworICAgICMgRklYTUU6IHN5bmNocm9uaXphdGlvbiBtb2RlcyBhcmUgbm90IHN1cHBvcnRlZCBzbyBmYXIuLi4KKyAgICB4ZmFpbCAibm8gc3luY2hyb25pemF0aW9uIG1vZGUgbG9jYXRpb24gc3VwcG9ydCwgbm90IGltcGxlbWVudGVkIHlldCIKKyAgICAKKyAgICAjIHRpbWluZyBtb2RlIGxvY2F0aW9ucworICAgICMgRklYTUU6IGNhbGxiYWNrcyB0byBhYnN0aW1lLCBpbnR0aW1lIG5vdCBpbXBsZW1lbnRlZAorICAgIHhmYWlsICJ0aW1pbmcgbW9kZXMgbm90IGltcGxlbWVudGVkIHByb3Blcmx5IHlldCIKKworICAgICMgY2hhciBzdHJpbmcgbG9jYXRpb25zCisgICAgIyBzb21lIHRlc3RzIGFyZSBkb24gaW4gY2hpbGx2YXJzLmV4cAorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBzdHJsMSIgXAorCSJDSEFSUyBcXCg3XFwpIFZBUllJTkciIFwKKwkicHJpbnQgdmFyeWluZyBzdHJpbmcgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgIndoYXRpcyBzdHJsMSIgInN0cm0yIiBcCisJInByaW50IHN0cmluZyBsb2NhdGlvbmEgbW9kZSBuYW1lIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzdHJsMSIgXAorCXtcImhhbnNpXF5cKDBcKVwifSBcCisJInByaW50IHN0cmluZyBsb2NhdGlvbiIKKyAgICAjIHN0cmluZyBlbGVtZW50cworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzdHJsMSgwKSIgIlwnaFwnIiBcCisJInByaW50IHN0cmluZyBlbGVtZW50IDEiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHN0cmwxKDUpIiB7J1xeWyhdMFspXSd9IFwKKwkicHJpbnQgc3RyaW5nIGVsZW1lbnQgMiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgc3RybDEoMykiICJcJ3NcJyIgXAorCSJwcmludCBzdHJpbmcgZWxlbWVudCAzIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBzdHJsMSgwKSIgImNoYXIiIFwKKwkicHJpbnQgbW9kZSBvZiBzdHJpbmcgZWxlbWVudCIKKyAgICAjIHNsaWNlcworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzdHJsMSgzOjQpIiAiXCJzaVwiIiBcCisJInByaW50IHN0cmluZyBzbGljZSAxIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzdHJsMSgwOjUpIiBcCisJe1wiaGFuc2lcXlwoMFwpXCJ9IFwKKwkicHJpbnQgc3RyaW5nIHNsaWNlIDIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHN0cmwxKDA6MCkiICJcImhcIiIgXAorCSJwcmludCBzdHJpbmcgc2xpY2UgMyIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgc3RybDEoMCB1cCA2KSIgXAorCXtcImhhbnNpXF5cKDBcKVwifSBcCisJInByaW50IHN0cmluZyBzbGljZSA0IgorICAgICMgRklYTUU6IGFkanVzdCBlcnJvciBtZXNzYWdlLCB3aGVuIGltcGxlbnRlZAorICAgIGdkYl90ZXN0ICJwcmludCBzdHJsMSg2IHVwIDEpIiBcCisJIi4qc2xpY2UuKm91dCBvZiByYW5nZS4qIiBcCisJInByaW50IGludmFsaWQgc3RyaW5nIHNsaWNlIGxlbmd0aCIKKyAgICBnZGJfdGVzdCAicHJpbnQgc3RybDEoLTEgdXAgNSkiIFwKKwkiLipzbGljZS4qb3V0IG9mIHJhbmdlLioiIFwKKwkicHJpbnQgaW52YWxpZCBzdHJpbmcgc2xpY2UgbGVuZ3RoIgorICAgIGdkYl90ZXN0ICJwcmludCBzdHJsMSgtMTo1KSIgXAorCSIuKnNsaWNlLipvdXQgb2YgcmFuZ2UuKiIgXAorCSJwcmludCBpbnZhbGlkIHN0cmluZyBzbGljZSIKKyAgICBnZGJfdGVzdCAicHJpbnQgc3RybDEoLTE6NykiIFwKKwkiLipzbGljZS4qb3V0IG9mIHJhbmdlLioiIFwKKwkicHJpbnQgaW52YWxpZCBzdHJpbmcgc2xpY2UiCisgICAgZ2RiX3Rlc3QgInByaW50IHN0cmwxKDAgdXAgLTEpIiBcCisJIi4qc2xpY2UuKm91dCBvZiByYW5nZS4qIiBcCisJInByaW50IGludmFsaWQgc3RyaW5nIHNsaWNlIGxlbmd0aCIKKyAgICBnZGJfdGVzdCAicHJpbnQgc3RybDEoMCB1cCAwKSIgeyIifQorICAgIAorICAgICMgYml0c3RyaW5nIGxvY2F0aW9ucworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBic3RyMSIgXAorCSJCT09MUyBcXCgyMFxcKSIgXAorCSJwcmludCBtb2RlIG9mIGJpdHN0cmluZyBsb2NhdGlvbiIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAid2hhdGlzIGJzdHJsMSIgImJzdHIxIiBcCisJInByaW50IG1vZGUgbmFtZSBvZiBiaXRzdHJpbmcgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGJzdHJsMSIgXAorCSJCJzEwMTAxMDEwMTAxMDEwMTAxMDEwJyIgXAorCSJwcmludCBiaXRzdHJpbmcgbG9jYXRpb24iCisgICAgCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIGJzdHJsMSgwKSIgImJvb2x8Qk9PTCIgXAorCSJwcmludCBtb2RlIG9mIGJpdHN0cmluZyBlbGVtZW50IgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBic3RybDEoMCkiICJUUlVFIiBcCisJInByaW50IGJpdHN0cmluZyBlbGVtZW50IDEiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGJzdHJsMSgxOSkiICJGQUxTRSIgXAorCSJwcmludCBiaXRzdHJpbmcgZWxlbWVudCAyIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBic3RybDEoMTApIiAiVFJVRSIgXAorCSJwcmludCBiaXRzdHJpbmcgZWxlbWVudCAzIgorICAgIAorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBic3RybDEoMDoxOSkiIFwKKwkiQicxMDEwMTAxMDEwMTAxMDEwMTAxMCciIFwKKwkicHJpbnQgYml0c3RyaW5nIGxvY2F0aW9uIHNsaWNlIDEiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGJzdHJsMSgwOjApIiBcCisJIkInMSciIFwKKwkicHJpbnQgYml0c3RyaW5nIGxvY2F0aW9uIHNsaWNlIDIiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGJzdHJsMSgzOjkpIiBcCisJIkInMDEwMTAxMCciIFwKKwkicHJpbnQgYml0c3RyaW5nIGxvY2F0aW9uIHNsaWNlIDMiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGJzdHJsMSgwIHVwIDIwKSIgXAorCSJCJzEwMTAxMDEwMTAxMDEwMTAxMDEwJyIgXAorCSJwcmludCBiaXRzdHJpbmcgbG9jYXRpb24gc2xpY2UgNCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgYnN0cmwxKDE5IHVwIDEpIiBcCisJIkInMCciIFwKKwkicHJpbnQgYml0c3RyaW5nIGxvY2F0aW9uIHNsaWNlIDUiCisgICAgZ2RiX3Rlc3QgInByaW50IGJzdHJsMSgyMCB1cCAxKSIgXAorCSIuKnNsaWNlIG91dCBvZiByYW5nZS4qIiBcCisJInByaW50IGludmFsaWQgYml0c3RyaW5nIHNsaWNlICgyMCB1cCAxKSIKKyAgICBnZGJfdGVzdCAicHJpbnQgYnN0cmwxKC00OjUpIiBcCisJIi4qc2xpY2Ugb3V0IG9mIHJhbmdlLioiIFwKKwkicHJpbnQgaW52YWxpZCBiaXRzdHJpbmcgc2xpY2UgKC00OjUpIgorICAgIGdkYl90ZXN0ICJwcmludCBic3RybDEoLTE6dXAgMSkiIFwKKwkiLippbnZhbGlkIGV4cHJlc3Npb24gc3ludGF4LioiIFwKKwkicHJpbnQgaW52YWxpZCBiaXRzdHJpbmcgc2xpY2UgKC0xOmlwIDEpIgorICAgIGdkYl90ZXN0ICJwcmludCBic3RybDEoLTE6MjApIiBcCisJIi4qc2xpY2Ugb3V0IG9mIHJhbmdlLioiIFwKKwkicHJpbnQgaW52YWxpZCBiaXRzdHJpbmcgc2xpY2UgKC0xOjIwKSIKKyAgICBnZGJfdGVzdCAicHJpbnQgYnN0cmwxKDAgdXAgLTEpIiBcCisJIi4qc2xpY2Ugb3V0IG9mIHJhbmdlLioiIFwKKwkicHJpbnQgaW52YWxpZCBiaXRzdHJpbmcgc2xpY2UgKDAgdXAgLTEpIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBic3RybDEoNCB1cCAwKSIgIkInJyIKKyAgICAKKyAgICAjIGFycmF5IG1vZGUgbG9jYXRpb25zCisgICAgZ2RiX3Rlc3RfZXhhY3QgInB0eXBlIGFycmwxIiBcCisJIkFSUkFZICgxOjEwMCkgc2V0MSIgXAorCSJwcmludCBtb2RlIG9mIGFycmF5IGxvY2F0aW9uIgorICAgIGdkYl90ZXN0ICJ3aGF0aXMgYXJybDEiICJhcnIxbSIgXAorCSJwcmludCBtb2RlIG5hbWUgb2YgYXJyYXkgbG9jYXRpb24iCisgICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IGFycmwxIiB7WygxOjEwMCk6IGFhYV19IFwKKwkicHJpbnQgYXJyYXkgbG9jYXRpb24iCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIGFycmwxKDEpIiBcCisJIlNFVCBcXChhYWEsIGJiYiwgY2NjXFwpIiBcCisJInByaW50IG1vZGUgb2YgYXJyYXkgZWxlbWVudCIKKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgYXJybDMiIFwKKwl7WygxOjUpOiBbKDE6Myk6IFsoMToyKTogLTIxNDc0ODM2NDhdXV19IFwKKwkicHJpbnQgYXJyYXkgbG9jYXRpb24gMiIKKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgYXJybDMoMSkiIFwKKwl7WygxOjMpOiBbKDE6Mik6IC0yMTQ3NDgzNjQ4XV19IFwKKwkicHJpbnQgYXJyYXkgbG9jYXRpb24gMyIKKyAgICBnZGJfdGVzdF9leGFjdCAicHR5cGUgYXJybDMoMSkiIFwKKwl7QVJSQVkgKDE6MykgQVJSQVkgKDE6MikgbG9uZ30gXAorCSJwcmludCBtb2RlIG9mIGFycmF5IGVsZW1lbnQiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGFycmwzKDUpIiBcCisJe1xbXCgxOjNcKTogXFtcKDE6MlwpOiAtMjE0NzQ4MzY0OFxdXF19IFwKKwkicHJpbnQgYXJyYXkgbG9jYXRpb24gNCIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgYXJybDMoMSwxKSIgXAorCXtcW1woMToyXCk6IC0yMTQ3NDgzNjQ4XF19IFwKKwkicHJpbnQgYXJyYXkgbG9jYXRpb24gNSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgYXJybDMoMSwxKSIgXAorCXtBUlJBWSBcKDE6MlwpIGxvbmd9IFwKKwkicHJpbnQgbW9kZSBvZiBhcnJheSBlbGVtZW50IgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBhcnJsMyg1LDMpIiBcCisJe1xbXCgxOjJcKTogLTIxNDc0ODM2NDhcXX0gXAorCSJwcmludCBhcnJheSBsb2NhdGlvbiA2IgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBhcnJsMygxLDEsMSkiIFwKKwkiLTIxNDc0ODM2NDgiIFwKKwkicHJpbnQgYXJyYXkgbG9jYXRpb24gNyIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgYXJybDMoNSwzLDIpIiBcCisJIi0yMTQ3NDgzNjQ4IiBcCisJInByaW50IGFycmF5IGxvY2F0aW9uIDgiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGFycmwzKDEpKDMpKDIpIiBcCisJIi0yMTQ3NDgzNjQ4IiBcCisJInByaW50IGFycmF5IGxvY2F0aW9uIDkiCisKKyAgICAjIHJlamVjdCB0aGUgZm9sbG93aW5nIHJhbmdlIGZhaWxzCisgICAgIyBGSVhNRTogYWRqdXN0IGVycm9yIG1lc3NhZ2VzCisgICAgZ2RiX3Rlc3QgInByaW50IGFycmwzKC0xKSIgXAorCSIuKm91dCBvZiByYW5nZS4qIiBcCisJImNoZWNrIGludmFsaWQgYXJyYXkgaW5kaWNlcyAxIgorICAgIGdkYl90ZXN0ICJwcmludCBhcnJsMyg2KSIgXAorCSIuKm91dCBvZiByYW5nZS4qIiBcCisJImNoZWNrIGludmFsaWQgYXJyYXkgaW5kaWNlcyAyIgorICAgIGdkYl90ZXN0ICJwcmludCBhcnJsMygwLDApIiBcCisJIi4qb3V0IG9mIHJhbmdlLioiIFwKKwkiY2hlY2sgaW52YWxpZCBhcnJheSBpbmRpY2VzIDMiCisgICAgZ2RiX3Rlc3QgInByaW50IGFycmwzKDEsMCkiIFwKKwkiLipvdXQgb2YgcmFuZ2UuKiIgXAorCSJjaGVjayBpbnZhbGlkIGFycmF5IGluZGljZXMgNCIKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJybDMoMSw0KSIgXAorCSIuKm91dCBvZiByYW5nZS4qIiBcCisJImNoZWNrIGludmFsaWQgYXJyYXkgaW5kaWNlcyA1IgorICAgIGdkYl90ZXN0ICJwcmludCBhcnJsMyg2LDQpIiBcCisJIi4qb3V0IG9mIHJhbmdlLioiIFwKKwkiY2hlY2sgaW52YWxpZCBhcnJheSBpbmRpY2VzIDYiCisgICAgZ2RiX3Rlc3QgInByaW50IGFycmwzKDEsMSwwKSIgXAorCSIuKm91dCBvZiByYW5nZS4qIiBcCisJImNoZWNrIGludmFsaWQgYXJyYXkgaW5kaWNlcyA3IgorICAgIGdkYl90ZXN0ICJwcmludCBhcnJsMyg2LDQsMCkiIFwKKwkiLipvdXQgb2YgcmFuZ2UuKiIgXAorCSJjaGVjayBpbnZhbGlkIGFycmF5IGluZGljZXMgOCIKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJybDMoMSwxLDMpIiBcCisJIi4qb3V0IG9mIHJhbmdlLioiIFwKKwkiY2hlY2sgaW52YWxpZCBhcnJheSBpbmRpY2VzIDkiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJybDMoMCkoMCkiIFwKKwkiLiogYXJyYXkgb3Igc3RyaW5nIGluZGV4IG91dCBvZiByYW5nZS4qIiBcCisJImNoZWNrIGludmFsaWQgYXJyYXkgaW5kaWNlcyAxMCIKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJybDMoMSkoMCkiIFwKKwkiLiogYXJyYXkgb3Igc3RyaW5nIGluZGV4IG91dCBvZiByYW5nZS4qIiBcCisJImNoZWNrIGludmFsaWQgYXJyYXkgaW5kaWNlcyAxMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJybDMoMSkoNCkiIFwKKwkiLiogYXJyYXkgb3Igc3RyaW5nIGluZGV4IG91dCBvZiByYW5nZS4qIiBcCisJImNoZWNrIGludmFsaWQgYXJyYXkgaW5kaWNlcyAxMiIKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJybDMoNikoNCkiIFwKKwkiLiogYXJyYXkgb3Igc3RyaW5nIGluZGV4IG91dCBvZiByYW5nZS4qIiBcCisJImNoZWNrIGludmFsaWQgYXJyYXkgaW5kaWNlcyAxMyIKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJybDMoMSkoMSkoMCkiIFwKKwkiLiogYXJyYXkgb3Igc3RyaW5nIGluZGV4IG91dCBvZiByYW5nZS4qIiBcCisJImNoZWNrIGludmFsaWQgYXJyYXkgaW5kaWNlcyAxNCIKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJybDMoNikoNCkoMCkiIFwKKwkiLiogYXJyYXkgb3Igc3RyaW5nIGluZGV4IG91dCBvZiByYW5nZS4qIiBcCisJImNoZWNrIGludmFsaWQgYXJyYXkgaW5kaWNlcyAxNSIKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJybDMoMSkoMSkoMykiIFwKKwkiLiogYXJyYXkgb3Igc3RyaW5nIGluZGV4IG91dCBvZiByYW5nZS4qIiBcCisJImNoZWNrIGludmFsaWQgYXJyYXkgaW5kaWNlcyAxNiIKKyAgICAKKyAgICAjIHNsaWNlcworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBhcnJsNCgxOjMpIiBcCisJe1xbXCgxOjJcKTogXFtcKDE6M1wpOiBcW1woMToyXCk6IC0yMTQ3NDgzNjQ4XF1cXSwgXCgzXCk6IFxbXCgxOjNcKTogXFtcKDE6MlwpOiAxMDBcXVxdXF19IFwKKwkicHJpbnQgYXJyYXkgc2xpY2UgMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHR5cGUgYXJybDQoMTozKSIgXAorCXtBUlJBWSBcKDE6M1wpIEFSUkFZIFwoMTozXCkgQVJSQVkgXCgxOjJcKSBsb25nfSBcCisJInByaW50IG1vZGUgb2YgYXJyYXkgc2xpY2UiCisjIFRoZSBuZXh0IG9uZSBpcyBib2d1czoKKyMgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGFycmw0KDUsIDI6MywgMSkiIFwKKyMJIyBGSVhNRTogbWF5YmUgdGhlICcoMSk6ICcgaW4gdGhlIGlubmVyIHR1cGVsIHNob3VsZCBiZSBvbWl0dGVkID8gXAorIwl7XFsoMik6IFxbXCgxXCk6IDEwMFxdLCBcKDNcKTpcW1woMVwpOiAxMDBcXVxdfSBcCisjCSJwcmludCBhcnJheSBzbGljZSAyIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBhcnJsNCgxIHVwIDQpIiBcCisJe1xbXCgxOjJcKTogXFtcKDE6M1wpOiBcW1woMToyXCk6IC0yMTQ3NDgzNjQ4XF1cXSwgXCgzXCk6IFxbXCgxOjNcKTogXFtcKDE6MlwpOiAxMDBcXVxdLCBcKDRcKTogXFtcKDE6M1wpOiBcW1woMToyXCk6IC0yMTQ3NDgzNjQ4XF1cXVxdfSBcCisJInByaW50IGFycmF5IHNsaWNlIDMiCisjIFRoZSBuZXh0IHR3byBhcmUgYm9ndXM6CisjICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBhcnJsNCgzLCAyIHVwIDEpIiBcCisjCXtcW1woMjozXCk6IFxbXCgxOjJcKTogMTAwXF1cXX0gXAorIwkicHJpbnQgYXJyYXkgc2xpY2UgNCIKKyMgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IGFycmw0KDE6MiwgMSB1cCAxLCAyKSIgXAorIwl7XFtcKDFcKTogXFtcKDFcKTogXFtcKDJcKTogLTIxNDc0ODM2NDhcXSwgXCgyXCk6IFxbXCgyXCk6IC0yMTQ3NDgzNjQ4XF1cXSwgXCgyXCk6IFxbXCgxXCk6IFxbXCgyXCk6IC0yMTQ3NDgzNjQ4XF0sIFwoMlwpOiBcW1woMlwpOiAtMjE0NzQ4MzY0OFxdXF1cXX0gXAorIwkicHJpbnQgYXJyYXkgc2xpY2UgNCIKKyAgICAjIHJlamVjdCBpbnZhbGlkIHNsaWNlcworICAgICMgRklYTUU6IGFkanVzdCBlcnJvciBtZXNzYWdlcworICAgIGdkYl90ZXN0ICJwcmludCBhcnJsNCg1OjYpIiBcCisJIi4qc2xpY2Ugb3V0IG9mIHJhbmdlLioiIFwKKwkiY2hlY2sgaW52YWxpZCByYW5nZSAxIgorICAgIGdkYl90ZXN0ICJwcmludCBhcnJsNCgwOjEpIiBcCisJIi4qc2xpY2Ugb3V0IG9mIHJhbmdlLioiIFwKKwkiY2hlY2sgaW52YWxpZCByYW5nZSAyIgorICAgIGdkYl90ZXN0ICJwcmludCBhcnJsNCgwOjYpIiBcCisJIi4qc2xpY2Ugb3V0IG9mIHJhbmdlLioiIFwKKwkiY2hlY2sgaW52YWxpZCByYW5nZSAzIgorICAgIGdkYl90ZXN0ICJwcmludCBhcnJsNCgzOjIpIiBcCisJIi4qc2xpY2Ugb3V0IG9mIHJhbmdlLioiIFwKKwkiY2hlY2sgaW52YWxpZCByYW5nZSA0IgorICAgIGdkYl90ZXN0ICJwcmludCBhcnJsNCgxLDM6NCkiIFwKKwkiLipzeW50YXggZXJyb3IuKiIgXAorCSJjaGVjayBpbnZhbGlkIHJhbmdlIDUiCisgICAgZ2RiX3Rlc3QgInByaW50IGFycmw0KDEsMDoxKSIgXAorCSIuKnN5bnRheCBlcnJvci4qIiBcCisJImNoZWNrIGludmFsaWQgcmFuZ2UgNiIKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJybDQoMSwwOjQpIiBcCisJIi4qc3ludGF4IGVycm9yLioiIFwKKwkiY2hlY2sgaW52YWxpZCByYW5nZSA3IgorICAgIGdkYl90ZXN0ICJwcmludCBhcnJsNCgxLDM6MikiIFwKKwkiLipzeW50YXggZXJyb3IuKiIgXAorCSJjaGVjayBpbnZhbGlkIHJhbmdlIDgiCisgICAgZ2RiX3Rlc3QgInByaW50IGFycmw0KDUgdXAgMikiIFwKKwkiLipzbGljZSBvdXQgb2YgcmFuZ2UuKiIgXAorCSJjaGVjayBpbnZhbGlkIHJhbmdlIDkiCisgICAgZ2RiX3Rlc3QgInByaW50IGFycmw0KC0xIHVwIDEpIiBcCisJIi4qc2xpY2Ugb3V0IG9mIHJhbmdlLioiIFwKKwkiY2hlY2sgaW52YWxpZCByYW5nZSAxMCIKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJybDQoLTEgdXAgNykiIFwKKwkiLipzbGljZSBvdXQgb2YgcmFuZ2UuKiIgXAorCSJjaGVjayBpbnZhbGlkIHJhbmdlIDExIgorICAgIGdkYl90ZXN0ICJwcmludCBhcnJsNCgxIHVwIDApIiBcCisJIi4qc2xpY2Ugb3V0IG9mIHJhbmdlLioiIFwKKwkiY2hlY2sgaW52YWxpZCByYW5nZSAxMiIKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJybDQoMSwzIHVwIDEpIiBcCisJIi4qc3ludGF4IGVycm9yLioiIFwKKwkiY2hlY2sgaW52YWxpZCByYW5nZSAxMyIKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJybDQoMSwtMSB1cCAxKSIgXAorCSIuKnN5bnRheCBlcnJvci4qIiBcCisJImNoZWNrIGludmFsaWQgcmFuZ2UgMTQiCisgICAgZ2RiX3Rlc3QgInByaW50IGFycmw0KDEsLTEgdXAgNSkiIFwKKwkiLipzeW50YXggZXJyb3IuKiIgXAorCSJjaGVjayBpbnZhbGlkIHJhbmdlIDE1IgorICAgIGdkYl90ZXN0ICJwcmludCBhcnJsNCgxLDIgdXAgMCkiIFwKKwkiLipzeW50YXggZXJyb3IuKiIgXAorCSJjaGVjayBpbnZhbGlkIHJhbmdlIDE2IgorCisgICAgIyBzdHJ1Y3R1cmUgbW9kZXMKKyAgICAjIHNvbWUgdGVzdHMgYXJlIGluIGNoaWxsdmFycy5leHAKKyAgICAjIEZJWE1FOiBubyB0YWcgcHJvY2Vzc2luZyBpbXBsZW1lbnRlZCBkbyBtYXliZSBhZGp1c3QgdGhlc2UgdGVzdHMKKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInB0eXBlIHN0cnUxbSIgXAorCSJTVFJVQ1QgXFwoLiphIGxvbmcsLipiIGxvbmcsLipDQVNFIGIgT0YuKlxcKDQyXFwpOi4qY2gxIENIQVJTXFwoMjBcXCksLipcXCg1MlxcKTouKmNoMiBDSEFSU1xcKDEwXFwpLipFTFNFLipjaDMgQ0hBUlNcXCgxXFwpLipFU0FDLipcXCkiIFwKKwkicHJpbnQgbW9kZSBvZiBzdHJ1Y3R1cmUgbG9jYXRpb24gMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAid2hhdGlzIHN0cnVsMSIgInN0cnUxbSIgXAorCSJwcmludCBtb2RlIG5hbWUgb2Ygc3RydWN0dXJlIGxvY2F0aW9uIDEiCisgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzdHJ1bDEiIFwKKwl7XFtcLmE6IC0yMTQ3NDgzNjQ4LCBcLmI6IDQyLCBcLlwoYlwpOiBce1woNDJcKSA9IFxbXC5jaDE6IFwiMTIzNDU2Nzg5MDA5ODc2NTQzMjFcIlxdLCBcKDUyXCkgPSBcW1wuY2gyOiBcIjEyMzQ1Njc4OTBcIlxdLCAoZWxzZSkgPSBcW1wuY2gzOiBcIjFcIlxdXH1cXX0gXAorCSJwcmludCBzdHJ1Y3R1cmUgbG9jYXRpb24gMSIKKyAgICB0ZXN0X3ByaW50X2FjY2VwdCAicHJpbnQgc3RydWwxLmEiIFwKKwkiLTIxNDc0ODM2NDgiIFwKKwkicHJpbnQgZmllbGQgb2Ygc3RydWN0dXJlIGxvY2F0aW9uIDEiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHN0cnVsMS5iIiAiNDIiIFwKKwkicHJpbnQgZmllbGQgb2Ygc3RydWN0dXJlIGxvY2F0aW9uIDEiCisgICAgdGVzdF9wcmludF9hY2NlcHQgInByaW50IHN0cnVsMS5jaDEiIFwKKwkiXCIxMjM0NTY3ODkwMDk4NzY1NDMyMVwiIiBcCisJInByaW50IGZpZWxkIG9mIHN0cnVjdHVyZSBsb2NhdGlvbiAxIgorICAgICMgc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzdHJ1bDEuY2gyIiBcCisJIlwiMTIzNDU2Nzg5MFwiIiBcCisJInByaW50IGZpZWxkIG9mIHN0cnVjdHVyZSBsb2NhdGlvbiAxIgorICAgICMgc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwcmludCBzdHJ1bDEuY2gzIiBcCisJIlwiMVwiIiBcCisJInByaW50IGZpZWxkIG9mIHN0cnVjdHVyZSBsb2NhdGlvbiAxIgorICAgIAorICAgIGlmICRwYXNzY291bnQgdGhlbiB7CisJcGFzcyAiJHBhc3Njb3VudCBjb3JyZWN0IGxvY2F0aW9ucyBwcmludGVkIgorICAgIH0KK30KKworIyBUaGlzIGlzIGNoaWxsLzk0MzQKKworcHJvYyB0ZXN0Xzk0MzQge30geworICAgIGdsb2JhbCBwYXNzY291bnQKKworICAgIHZlcmJvc2UgInRlc3RpbmcgcHItOTQzNCIKKworICAgIHRlc3RfcHJpbnRfYWNjZXB0ICJwdHlwZSBtX3h5em1vZGUiICJTVFJVQ1QgXFwoLipuZXh0IFJFRiBtX3h5em1vZGUsLippIGxvbmcuKlxcKSIKK30KKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKworZ2RiX3Rlc3QgInNldCBwcmludCBzZXZlbmJpdC1zdHJpbmdzIiAiLioiCisKK2lmIFtzZXRfbGFuZ19jaGlsbF0gdGhlbiB7CisgICAgdGVzdF9tb2RlcworICAgIHRlc3RfbG9jYXRpb25zCisgICAgdGVzdF85NDM0Cit9IGVsc2UgeworICAgIHdhcm5pbmcgIiR0ZXN0X25hbWUgdGVzdHMgc3VwcHJlc3NlZC4iCit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC90ZXN0czIuY2ggYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC90ZXN0czIuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU5NmYzYgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3Rlc3RzMi5jaApAQCAtMCwwICsxLDE5MyBAQAorLS0gQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCistLSBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLS0gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKy0tIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCistLSAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLS0gCistLSBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy0tIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCistLSBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCistLSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLS0gCistLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLS0gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKy0tIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KKworLS0gUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CistLSBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCistLQorLS0gdGVzdCBwcm9ncmFtIDIgKHJlZmVyIHRvIHRlc3RzMi5leHApCistLQorCit0ZXN0czI6IG1vZHVsZTsKKworLS0gdGVzdHBhdHRlcm4KK3N5biBwYXQxIHVsb25nID0gSCdhYWFhYWFhYTsKK3N5biBwYXQyIHVsb25nID0gSCc1NTU1NTU1NTsKKworLS0gZGlzY3JldGUgbW9kZXMKK25ld21vZGUgYnl0ZW0gPSBzdHJ1Y3QgKCAKKwlwMSB1bG9uZywKKwltIGJ5dGUsCisJcDIgdWxvbmcpOworbmV3bW9kZSB1Ynl0ZW0gPSBzdHJ1Y3QgKCAKKwlwMSB1bG9uZywKKwltIHVieXRlLAorCXAyIHVsb25nKTsKK25ld21vZGUgaW50bSA9IHN0cnVjdCAoIAorCXAxIHVsb25nLAorCW0gaW50LAorCXAyIHVsb25nKTsKK25ld21vZGUgdWludG0gPSBzdHJ1Y3QgKCAKKwlwMSB1bG9uZywKKwltIHVpbnQsCisJcDIgdWxvbmcpOworbmV3bW9kZSBsb25nbSA9IHN0cnVjdCAoIAorCXAxIHVsb25nLAorCW0gbG9uZywKKwlwMiB1bG9uZyk7CituZXdtb2RlIHVsb25nbSA9IHN0cnVjdCAoIAorCXAxIHVsb25nLAorCW0gdWxvbmcsCisJcDIgdWxvbmcpOworbmV3bW9kZSBib29sbSA9IHN0cnVjdCAoIAorCXAxIHVsb25nLAorCW0gYm9vbCwKKwlwMiB1bG9uZyk7CituZXdtb2RlIGNoYXJtMSA9IHN0cnVjdCAoIAorCXAxIHVsb25nLAorCW0gY2hhcig0KSwKKwlwMiB1bG9uZyk7CituZXdtb2RlIGNoYXJtMiA9IHN0cnVjdCAoIAorCXAxIHVsb25nLAorCW0gY2hhcig3KSwKKwlwMiB1bG9uZyk7CituZXdtb2RlIGNoYXJtMyA9IHN0cnVjdCAoIAorCXAxIHVsb25nLAorCW0gY2hhcig4KSB2YXJ5aW5nLAorCXAyIHVsb25nKTsKK25ld21vZGUgY2hhcm00ID0gc3RydWN0ICggCisJcDEgdWxvbmcsCisJbSBjaGFyLAorCXAyIHVsb25nKTsKK25ld21vZGUgYml0bTEgPSBzdHJ1Y3QgKCAKKwlwMSB1bG9uZywKKwltIGJpdCg4KSwKKwlwMiB1bG9uZyk7CituZXdtb2RlIGJpdG0yID0gc3RydWN0ICggCisJcDEgdWxvbmcsCisJbSBiaXQoMTApLAorCXAyIHVsb25nKTsKK25ld21vZGUgc2V0bTEgPSBzdHJ1Y3QgKCAKKwlwMSB1bG9uZywKKwltIHNldCAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCksCisJcDIgdWxvbmcpOworbmV3bW9kZSBuc2V0MSA9IHN0cnVjdCAoIAorCXAxIHVsb25nLAorCW0gc2V0IChuYSA9IDIxNDc0ODM2NDgsIG5iID0gMTAyNCwgbmMgPSA0Mjk0OTY3Mjk1KSwKKwlwMiB1bG9uZyk7CituZXdtb2RlIHJtMSA9IHN0cnVjdCAoIAorCXAxIHVsb25nLAorCW0gcmFuZ2UgKGxvd2VyKGJ5dGUpOnVwcGVyKGJ5dGUpKSwKKwlwMiB1bG9uZyk7CituZXdtb2RlIHJtMiA9IHN0cnVjdCAoIAorCXAxIHVsb25nLAorCW0gcmFuZ2UgKGxvd2VyKGludCk6dXBwZXIoaW50KSksCisJcDIgdWxvbmcpOworbmV3bW9kZSBybTMgPSBzdHJ1Y3QgKCAKKwlwMSB1bG9uZywKKwltIHJhbmdlIChsb3dlcihsb25nKTp1cHBlcihsb25nKSksCisJcDIgdWxvbmcpOworbmV3bW9kZSBwbTEgPSBzdHJ1Y3QgKCAKKwlwMSB1bG9uZywKKwltIHBvd2Vyc2V0IHNldCAocGEsIHBiLCBwYywgcGQsIHBlLCBwZiwgcGcsIHBoKSwKKwlwMiB1bG9uZyk7CituZXdtb2RlIHBtMiA9IHN0cnVjdCAoIAorCXAxIHVsb25nLAorCW0gcG93ZXJzZXQgaW50ICgxOjMyKSwKKwlwMiB1bG9uZyk7CistLSB0aGlzIHNob3VsZCBiZSByZWplY3RlZCBieSB0aGUgZ251Y2hpbGwgY29tcGlsZXIgISAKK25ld21vZGUgcG0zID0gc3RydWN0ICggCisJcDEgdWxvbmcsCistLQltIHBvd2Vyc2V0IGxvbmcgKGxvd2VyKGxvbmcpOiB1cHBlcihsb25nKSksCisJcDIgdWxvbmcpOworbmV3bW9kZSByZWZtMSA9IHN0cnVjdCAoIAorCXAxIHVsb25nLAorCW0gcHRyLAorCXAyIHVsb25nKTsKK25ld21vZGUgcmVmbTIgPSBzdHJ1Y3QgKCAKKwlwMSB1bG9uZywKKwltIHJlZiBieXRlbSwKKwlwMiB1bG9uZyk7CituZXdtb2RlIHBybTEgPSBzdHJ1Y3QgKCAKKwlwMSB1bG9uZywKKwltIHByb2MgKCksCisJcDIgdWxvbmcpOworbmV3bW9kZSB0aW0xID0gc3RydWN0ICggCisJcDEgdWxvbmcsCisJbSB0aW1lLAorCXAyIHVsb25nKTsKK25ld21vZGUgdGltMiA9IHN0cnVjdCAoIAorCXAxIHVsb25nLAorCW0gZHVyYXRpb24sCisJcDIgdWxvbmcpOworbmV3bW9kZSByZW0xID0gc3RydWN0ICggCisJcDEgdWxvbmcsCisJbSByZWFsLAorCXAyIHVsb25nKTsKK25ld21vZGUgcmVtMiA9IHN0cnVjdCAoIAorCXAxIHVsb25nLAorCW0gbG9uZ19yZWFsLAorCXAyIHVsb25nKTsKK25ld21vZGUgYXJybTEgPSBzdHJ1Y3QgKCAKKwlwMSB1bG9uZywKKwltIGFycmF5KDE6MywgMToyKSBpbnQsCisJcDIgdWxvbmcpOworbmV3bW9kZSBzdHJ1bTEgPSBzdHJ1Y3QgKCAKKwlwMSB1bG9uZywKKwltIHN0cnVjdCAoYSwgYiBpbnQsIGNoIGNoYXIoNCkpLAorCXAyIHVsb25nKTsKKworCistLSBkdW1teWZ1bmN0aW9uIGZvciBicmVha3BvaW50cworZHVtbXlmdW5jOiBwcm9jKCk7CitlbmQgZHVtbXlmdW5jOworCisKK2RjbCBiMSBieXRlbSBpbml0IDo9IFtwYXQxLCAtMTI4LCBwYXQyXTsKK2RjbCB1YjEgdWJ5dGVtIGluaXQgOj0gW3BhdDEsIDAsIHBhdDJdOworZGNsIGkxIGludG0gaW5pdCA6PSBbcGF0MSwgLTMyNzY4LCBwYXQyXTsKK2RjbCB1aTEgdWludG0gaW5pdCA6PSBbcGF0MSwgMCwgcGF0Ml07CitkY2wgbDEgbG9uZ20gaW5pdCA6PSBbcGF0MSwgLTIxNDc0ODM2NDgsIHBhdDJdOworZGNsIHVsMSB1bG9uZ20gaW5pdCA6PSBbcGF0MSwgMCwgcGF0Ml07CitkY2wgYm8xIGJvb2xtIGluaXQgOj0gW3BhdDEsIHRydWUsIHBhdDJdOworZGNsIGMxIGNoYXJtMSBpbml0IDo9IFtwYXQxLCAiMTIzNCIsIHBhdDJdOworZGNsIGMyIGNoYXJtMiBpbml0IDo9IFtwYXQxLCAiMTIzNDU2NyIsIHBhdDJdOworZGNsIGMzIGNoYXJtMyBpbml0IDo9IFtwYXQxLCAiMTIzNDU2NzgiLCBwYXQyXTsKK2RjbCBjNCBjaGFybTQgaW5pdCA6PSBbcGF0MSwgQycwMCcsIHBhdDJdOworZGNsIGJpMSBiaXRtMSBpbml0IDo9IFtwYXQxLCBCJzAxMDExMDEwJywgcGF0Ml07CitkY2wgYmkyIGJpdG0yIGluaXQgOj0gW3BhdDEsIEInMTAxMDExMDEwMScsIHBhdDJdOworZGNsIHNlMSBzZXRtMSBpbml0IDo9IFtwYXQxLCBhLCBwYXQyXTsKK2RjbCBuc2UxIG5zZXQxIGluaXQgOj0gW3BhdDEsIG5hLCBwYXQyXTsKK2RjbCByMSBybTEgaW5pdCA6PSBbcGF0MSwgLTEyOCwgcGF0Ml07CitkY2wgcjIgcm0yIGluaXQgOj0gW3BhdDEsIC0zMjc2OCwgcGF0Ml07CitkY2wgcjMgcm0zIGluaXQgOj0gW3BhdDEsIC0yMTQ3NDgzNjQ4LCBwYXQyXTsKK2RjbCBwMSBwbTEgaW5pdCA6PSBbcGF0MSwgW3BhXSwgcGF0Ml07CitkY2wgcDIgcG0yIGluaXQgOj0gW3BhdDEsIFsxXSwgcGF0Ml07CistLSBkY2wgcDMgcG0zIGluaXQgOj0gW3BhdDEsIFstMV0sIHBhdDJdOyAtLSBGSVhNRTogYnVnIGluIGdudWNoaWxsCitkY2wgcmVmMSByZWZtMSBpbml0IDo9IFtwYXQxLCBudWxsLCBwYXQyXTsKK2RjbCByZWYyIHJlZm0yIGluaXQgOj0gW3BhdDEsIG51bGwsIHBhdDJdOworZGNsIHByMSBwcm0xOyAKK2RjbCB0aTEgdGltMSBpbml0IDo9IFtwYXQxLCAwLCBwYXQyXTsKK2RjbCB0aTIgdGltMiBpbml0IDo9IFtwYXQxLCAwLCBwYXQyXTsKK2RjbCByZTEgcmVtMSBpbml0IDo9IFtwYXQxLCAwLjAsIHBhdDJdOworZGNsIHJlMiByZW0yIGluaXQgOj0gW3BhdDEsIDAuMCwgcGF0Ml07CitkY2wgYXJybDEgYXJybTEgaW5pdDo9W3BhdDEsIFsoMTozKTogWzAsMF1dLCBwYXQyXTsKK2RjbCBzdHJ1bDEgc3RydW0xIGluaXQgOj0gW3BhdDEsIFsuYTogMCwgLmI6IDAsIC5jaDogIjAwMDAiXSwgcGF0Ml07CisKK3ByMSA6PSBbcGF0MSwgZHVtbXlmdW5jLCBwYXQyXTsKK2R1bW15ZnVuYygpOworCitlbmQgdGVzdHMyOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvdGVzdHMyLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3Rlc3RzMi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZjNDgyMQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3Rlc3RzMi5leHAKQEAgLTAsMCArMSwyNzEgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK2lmIFtza2lwX2NoaWxsX3Rlc3RzXSB0aGVuIHsgY29udGludWUgfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworIyBTZXQgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgdG8gY2hpbGwuICBUaGlzIGNvdW50cyBhcyBhIHRlc3QuICBJZiBpdAorIyBmYWlscywgdGhlbiB3ZSBza2lwIHRoZSBvdGhlciB0ZXN0cy4KKworc2V0IHRlc3RmaWxlICJ0ZXN0czIiCitzZXQgc3JjZmlsZSAke3NyY2Rpcn0vJHN1YmRpci8ke3Rlc3RmaWxlfS5jaAorc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5leGUKK2lmICB7IFtjb21waWxlICIke3NyY2ZpbGV9IC1nIC13IC1vICR7YmluZmlsZX0gJHtDSElMTF9SVDB9ICR7Q0hJTExfTElCfSJdICE9ICIiIH0geworICAgIHBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3NyY2ZpbGV9IgorICAgIHJldHVybiAtMQorfQorCitnbG9iYWwgaW5maW5pdHkKK2lmIFtpc3RhcmdldCAiaSo4Ni0qLXN5c3Y0KiJdIHRoZW4geworICAgIHNldCBpbmZpbml0eSAiaW5mIgorfSBlbHNlIHsKKyAgICBzZXQgaW5maW5pdHkgIkluZmluaXR5IgorfQorCitwcm9jIHNldF9sYW5nX2NoaWxsIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBiaW5maWxlIG9iamRpciBzdWJkaXIKKworICAgIGlmICFbZmlsZSBleGlzdHMgJG9iamRpci8kc3ViZGlyLyRiaW5maWxlXSB0aGVuIHsKKwlyZXR1cm4gMAorICAgIH0KKyAgICB2ZXJib3NlICJsb2FkaW5nIGZpbGUgJyRvYmpkaXIvJHN1YmRpci8kYmluZmlsZSciCisgICAgZ2RiX2xvYWQgJG9iamRpci8kc3ViZGlyLyRiaW5maWxlCisKKyAgICBzZW5kX2dkYiAic2V0IGxhbmd1YWdlIGNoaWxsXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9CisJdGltZW91dCB7IGZhaWwgInNldCBsYW5ndWFnZSBjaGlsbCAodGltZW91dCkiIDsgcmV0dXJuIDAgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJzaG93IGxhbmd1YWdlXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiBzb3VyY2UgbGFuZ3VhZ2UgaXMgXCJjaGlsbFwiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInNldCBsYW5ndWFnZSB0byBcImNoaWxsXCIiCisJICAgIHNlbmRfZ2RiICJicmVhayBkdW1teWZ1bmNcbiIKKwkgICAgZ2RiX2V4cGVjdCB7CisJCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJCSAgICBzZW5kX2dkYiAicnVuXG4iCisJCSAgICBnZGJfZXhwZWN0IC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorCQkgICAgcmV0dXJuIDEKKwkJfQorCQl0aW1lb3V0IHsKKwkJICAgIGZhaWwgImNhbid0IHNldCBicmVha3BvaW50ICh0aW1lb3V0KSIKKwkJICAgIHJldHVybiAwCisJCX0KKwkgICAgfQorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJzZXR0aW5nIGxhbmd1YWdlIHRvIFwiY2hpbGxcIiIKKwkgICAgcmV0dXJuIDAKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgImNhbid0IHNob3cgbGFuZ3VhZ2UgKHRpbWVvdXQpIgorCSAgICByZXR1cm4gMAorCX0KKyAgICB9Cit9CisKKyMgY2hlY2tzIGlmIHN0cnVjdHVyZSB3YXMgYWNjZXNzZWQgY29ycmVjdGx5Citwcm9jIHRlc3Rfd3JpdGUgeyBhcmdzIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBpZiBbbGxlbmd0aCAkYXJnc109PTUgdGhlbiB7CisJc2V0IG1lc3NhZ2UgW2xpbmRleCAkYXJncyA0XQorCXNldCBleHRlbmRlZCBbbGluZGV4ICRhcmdzIDNdCisJc2V0IG1hdGNodmFsIFtsaW5kZXggJGFyZ3MgMl0KKyAgICB9IGVsc2VpZiBbbGxlbmd0aCAkYXJnc109PTQgdGhlbiB7CisJc2V0IG1lc3NhZ2UgW2xpbmRleCAkYXJncyAzXQorCXNldCBtYXRjaHZhbCBbbGluZGV4ICRhcmdzIDJdCisJc2V0IGV4dGVuZGVkICIiCisgICAgfSBlbHNlaWYgW2xsZW5ndGggJGFyZ3NdPT0zIHRoZW4geworCXNldCBtZXNzYWdlIFtsaW5kZXggJGFyZ3MgMl0KKwlzZXQgZXh0ZW5kZWQgIiIKKyAgICB9IGVsc2UgeworCXdhcm5pbmcgInRlc3QgKCRhcmdzKSB3cml0ZSBjYWxsZWQgd2l0aCB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIgorCXJldHVybiAKKyAgICB9CisKKyAgICBzZXQgbG9jYXRpb24gW2xpbmRleCAkYXJncyAwXQorICAgIHNldCB2YWx1ZSBbbGluZGV4ICRhcmdzIDFdCisgICAgaWYgIVtpbmZvIGV4aXN0cyBtYXRjaHZhbF0gdGhlbiB7CisJc2V0IG1hdGNodmFsICR2YWx1ZQorICAgIH0KKyAgICB2ZXJib3NlICJsb2M6ICRsb2NhdGlvbiwgdmFsOiAkdmFsdWUsIG1zZzogJG1lc3NhZ2UsIGV4dDogJGV4dGVuZGVkLCBtYXRjaDogJG1hdGNodmFsIgorCisgICAgdmVyYm9zZSAic2V0dGluZyB2YXIgJHZhbHVlLi4uIgorICAgIHNlbmRfZ2RiICJzZXQgdmFyICRsb2NhdGlvbi5tJGV4dGVuZGVkIDo9ICR2YWx1ZVxuIgorICAgIGdkYl9leHBlY3QgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHt9CisgICAgZ2RiX3Rlc3QgInByaW50ICRsb2NhdGlvbiIgXAorICAgICAgIi4qPSBcW1xbXF1cXC5wMTogMjg2MzMxMTUzMCwgXFwubTogJG1hdGNodmFsLCBcXC5wMjogMTQzMTY1NTc2NVxbXF1cXSJcCisgICAgICAiJG1lc3NhZ2UiCit9CisKKyMgdGVzdCB3cml0ZSBhY2Nlc3MgZnJvbSBnZGIgKHNldHZhciB4Oj15KSBmcm9tIGdkYgorcHJvYyB3cml0ZV9hY2Nlc3MgeyB9IHsKKyAgICBnbG9iYWwgaW5maW5pdHkKKworICAgIHZlcmJvc2UgInRlc3Rpbmcgd3JpdGUgYWNjZXNzIHRvIGxvY2F0aW9ucyIKKyAgICAKKyAgICAjIGRpc2NyZXRlIG1vZGVzCisgICAgdGVzdF93cml0ZSBiMSAxMjcgImJ5dGUgd3JpdGUgMSIKKyAgICB0ZXN0X3dyaXRlIGIxIC0xMjggImJ5dGUgd3JpdGUgMiIKKyAgICB0ZXN0X3dyaXRlIGIxIDAgImJ5dGUgd3JpdGUgMyIKKyAgICB0ZXN0X3dyaXRlIHViMSAyNTUgInVieXRlIHdyaXRlIDEiCisgICAgdGVzdF93cml0ZSB1YjEgMCAidWJ5dGUgd3JpdGUgMiIKKyAgICB0ZXN0X3dyaXRlIHViMSA0MiAidWJ5dGUgd3JpdGUgMyIKKyAgICB0ZXN0X3dyaXRlIGkxIDMyNzY3ICJpbnQgd3JpdGUgMSIKKyAgICB0ZXN0X3dyaXRlIGkxIC0zMjc2OCAiaW50IHdyaXRlIDIiCisgICAgdGVzdF93cml0ZSBpMSAwICJpbnQgd3JpdGUgMyIKKyAgICB0ZXN0X3dyaXRlIHVpMSA2NTUzNSAidWludCB3cml0ZSAxIgorICAgIHRlc3Rfd3JpdGUgdWkxIDAgInVpbnQgd3JpdGUgMiIKKyAgICB0ZXN0X3dyaXRlIHVpMSAxMjMgInVpbnQgd3JpdGUgMyIKKyAgICB0ZXN0X3dyaXRlIGwxIDIxNDc0ODM2NDcgImxvbmcgd3JpdGUgMSIKKyAgICB0ZXN0X3dyaXRlIGwxIC0yMTQ3NDgzNjQ4ICJsb25nIHdyaXRlIDIiCisgICAgdGVzdF93cml0ZSBsMSAwICJsb25nIHdyaXRlIDMiCisgICAgdGVzdF93cml0ZSB1bDEgNDI5NDk2NzI5NSAidWxvbmcgd3JpdGUgMSIKKyAgICB0ZXN0X3dyaXRlIHVsMSAwICJ1bG9uZyB3cml0ZSAyIgorICAgIHRlc3Rfd3JpdGUgdWwxIDEwMDAwMDAgInVsb25nIHdyaXRlIDMiCisgICAgdGVzdF93cml0ZSBibzEgRkFMU0UgImJvb2wgd3JpdGUgMSIKKyAgICB0ZXN0X3dyaXRlIGJvMSBUUlVFICJib29sIHdyaXRlIDIiCisgICAgdGVzdF93cml0ZSBjMSBcIjEyMzRcIiAiY2hhciB3cml0ZSAxIgorICAgIHRlc3Rfd3JpdGUgYzIgXCIxMjM0NTY3XCIgImNoYXIgd3JpdGUgMiIKKyAgICB0ZXN0X3dyaXRlIGMzIFwiNjU0MzIxXCIgImNoYXIgd3JpdGUgMyIKKyAgICB0ZXN0X3dyaXRlIGM0IEMnNjUnICdlJyAiY2hhciB3cml0ZSA0IgorICAgIHRlc3Rfd3JpdGUgYmkxIEInMTAxMDAxMDEnICJiaXRzdHJpbmcgd3JpdGUgMSIKKyAgICB0ZXN0X3dyaXRlIGJpMiBCJzAxMDEwMDEwMTAnICJiaXRzdHJpbmcgd3JpdGUgMiIKKyAgICB0ZXN0X3dyaXRlIHNlMSBhICJzZXQgd3JpdGUgMSIKKyAgICB0ZXN0X3dyaXRlIHNlMSBoICJzZXQgd3JpdGUgMiIKKyAgICAjIFRoZSBmb2xsb3dpbmcgdHdvIHVzZSBudW1iZXJlZCBzZXRzIHdpdGggdG9vLWxhcmdlIHZhbHVlcy4KKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgdGVzdF93cml0ZSBuc2UxIG5iICJudW1iZXJlZCBzZXQgd3JpdGUgMSIKKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgdGVzdF93cml0ZSBuc2UxIG5jICJudW1iZXJlZCBzZXQgd3JpdGUgMiIKKyAgICB0ZXN0X3dyaXRlIHIxIDEyNyAicmFuZ2Ugd3JpdGUgMSIKKyAgICB0ZXN0X3dyaXRlIHIyIDMyNzY3ICJyYW5nZSB3cml0ZSAyIgorICAgIHRlc3Rfd3JpdGUgcjMgMjE0NzQ4MzY0NyAicmFuZ2Ugd3JpdGUgMyIKKworICAgICMgcG93ZXJzZXQgbW9kZXMKKyAgICB0ZXN0X3dyaXRlIHAxIHtbcGE6cGhdfSB7XFtwYTpwaFxdfSAicG93ZXJzZXQgd3JpdGUgMSIKKyAgICB0ZXN0X3dyaXRlIHAxIHtbcGEsIHBjOnBmLCBwaF19IHtcW3BhLCBwYzpwZiwgcGhcXX0gInBvd2Vyc2V0IHdyaXRlIDIiCisgICAgdGVzdF93cml0ZSBwMSB7W3BhLCBwYywgcGUsIHBnXX0ge1xbcGEsIHBjLCBwZSwgcGdcXX0gInBvd2Vyc2V0IHdyaXRlIDMiCisgICAgdGVzdF93cml0ZSBwMSB7W119IHtcW1xdfSAicG93ZXJzZXQgd3JpdGUgNCIKKyAgICB0ZXN0X3dyaXRlIHAyIHtbMTozMl19IHtcWzE6MzJcXX0gInBvd2Vyc2V0IHdyaXRlIDUiCisgICAgdGVzdF93cml0ZSBwMiB7WzEsIDM6MzAsIDMyXX0ge1xbMSwgMzozMCwgMzJcXX0gInBvd2Vyc2V0IHdyaXRlIDYiCisgICAgdGVzdF93cml0ZSBwMiB7WzEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUsIDE3LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI5LCAzMV19IHtcWzEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUsIDE3LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI5LCAzMVxdfSBcCisJInBvd2Vyc2V0IHdyaXRlIDciCisgICAgdGVzdF93cml0ZSBwMiB7W119IHtcW1xdfSAicG93ZXJzZXQgd3JpdGUgOCIKKworIyBGaXhtZTogdGhpcyBzaG91bGQgYmUgcmVqZWN0ZWQgYnkgZ251Y2hpbGwKKyMgICAgdGVzdF93cml0ZSBwMyB7Wy0yMTQ3NDgzNjQ4OjIxNDc0ODM2NDddfSB7XFstMjE0NzQ4MzY0ODoyMTQ3NDgzNjQ3XF19IFwKKyMJInBvd2Vyc2V0IHdyaXRlIDkiCisjICAgIHRlc3Rfd3JpdGUgcDMge1stMjE0NzQ4MzY0OCwgLTEwMDAwMDA6MTAwMDAwMCwgMjE0NzQ4MzY0N119IFwKKyMJe1xbLTIxNDc0ODM2NDgsIC0xMDAwMDAwOjEwMDAwMDAsIDIxNDc0ODM2NDdcXX0gXAorIwkicG93ZXJzZXQgd3JpdGUgMTAiCisjICAgIHRlc3Rfd3JpdGUgcDMge1stOTksIC05NywgLTk1LCAxMDAxLCAxMDAzLCAxMDA1XX0gXAorIwl7XFstOTksIC05NywgLTk1LCAxMDAxLCAxMDAzLCAxMDA1XF19ICJwb3dlcnNldCB3cml0ZSAxMSIKKyMgICAgdGVzdF93cml0ZSBwMyB7W119IHtcW1xdfSAicG93ZXJzZXQgd3JpdGUgMTIiCisgICAgCisgICAgIyByZWZlcmVuY2UgbW9kZXMKKyAgICB0ZXN0X3dyaXRlIHJlZjEgLT5yZWYxIHtIJ1swLTlhLWZBLUZdK30gInJlZmVyZW5jZSB3cml0ZSAxIgorICAgIHRlc3Rfd3JpdGUgcmVmMiAtPmIxIHtIJ1swLTlhLWZBLUZdK30gInJlZmVyZW5jZSB3cml0ZSAyIgorICAgIHRlc3Rfd3JpdGUgcmVmMSBOVUxMICJyZWZlcmVuY2Ugd3JpdGUgMyIKKyAgICB0ZXN0X3dyaXRlIHJlZjIgTlVMTCAicmVmZXJlbmNlIHdyaXRlIDQiCisKKyAgICAjIHByb2NlZHVyZSBtb2RlcworICAgIHRlc3Rfd3JpdGUgcHIxIE5VTEwgInByb2NlZnVyZSB3cml0ZSAxIgorICAgICMgRklYTUU6IHJlbW92ZSB3aGVuIE5VTEwgaXMgdW5kZXJzdG9vZAorICAgIHRlc3Rfd3JpdGUgcHIxIDAgTlVMTCAicHJvY2VmdXJlIHdyaXRlIDIiCisgICAgdGVzdF93cml0ZSBwcjEgZHVtbXlmdW5jIHtIJ1swLTlhLWZBLUZdKyA8ZHVtbXlmdW5jPn0gInByb2NlZHVyZSB3cml0ZSAzIgorCisgICAgIyB0aW1pbmcgbW9kZXMsIEZJWE1FIHdoZW4gY2FsbGJhY2tzIHRvIHRpbWVmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkCisgICAgI3Rlc3Rfd3JpdGUgdGkxIGFic3RpbWUoMTk3MCwgMywgMTIsIDEwLCA0MywgMCkge30gInRpbWUgd3JpdGUgMSIKKyAgICAjdGVzdF93cml0ZSB0aTIgPHNldCBzb21laG93IGEgZHVyYXRpb24+CisgICAgeGZhaWwgInRpbWluZyBtb2RlcyBub3QgaW1wbGVtZW50ZWQgeWV0IgorICAgIAorICAgICMgcmVhbCBtb2RlcworICAgICMgVGhpcyBvbmVzIAorICAgIHRlc3Rfd3JpdGUgcmUxIDQyLjAzIHs0Mi4wWzAtOV0qfSAicmVhbCB3cml0ZSAxIgorICAgIHRlc3Rfd3JpdGUgcmUxIDAgInJlYWwgd3JpdGUgMiIKKyAgICB0ZXN0X3dyaXRlIHJlMSAiMWUrMzgiIHsxZVwrMzh8MVwuMFswLTldKmVcKzM4fDlcLjlbMC05XSplXCszN30gXAorCSJyZWFsIHdyaXRlIDMiCisgICAgc2V0dXBfeGZhaWwgImkqODYtcGMtbGludXgtZ251IiAibTY4Ki0qLWhwdXgqIgorICAgIHRlc3Rfd3JpdGUgcmUxICIxZSszOSIgJGluZmluaXR5ICJyZWFsIHdyaXRlIDQiCisgICAgdGVzdF93cml0ZSByZTIgNDIuMDMgezQyLjBbMC05XSp9ICJyZWFsIHdyaXRlIDUiCisgICAgdGVzdF93cml0ZSByZTIgMCAicmVhbCB3cml0ZSA2IgorICAgIHRlc3Rfd3JpdGUgcmUyICIxZSszMDgiIHsxZVwrMzA4fSAicmVhbCB3cml0ZSA3IgorICAgIHNldHVwX3hmYWlsICJpKjg2LXBjLWxpbnV4LWdudSIgIm02OCotKi1ocHV4KiIKKyAgICB0ZXN0X3dyaXRlIHJlMiAiMWUrMzA5IiAkaW5maW5pdHkgInJlYWwgd3JpdGUgOCIKKyAgICAjIGFycmF5IG1vZGVzCisgICAgdGVzdF93cml0ZSBhcnJsMSB7WygxOjMpOiBbKDE6Mik6IC0xMjhdXX0ge1xbXCgxOjNcKTogXFtcKDE6MlwpOiAtMTI4XF1cXX1cCisJImFycmF5IHdyaXRlIDEiCisgICAgdGVzdF93cml0ZSBhcnJsMSB7WygxOjMpOiBbKDE6Mik6IDBdXX0ge1xbXCgxOjNcKTogXFtcKDE6MlwpOiAwXF1cXX1cCisJImFycmF5IHdyaXRlIDIiCisgICAgdGVzdF93cml0ZSBhcnJsMSB7WygxKTogWygxOjIpOiAxMjddLCAoMik6IFsoMToyKTogLTEyOF0sICgzKTogWygxOjIpOiAxMjddXX0ge1xbXCgxXCk6IFxbXCgxOjJcKTogMTI3XF0sIFwoMlwpOiBcW1woMToyXCk6IC0xMjhcXSwgXCgzXCk6IFxbXCgxOjJcKTogMTI3XF1cXX1cCisJImFycmF5IHdyaXRlIDMiCisgICAgIHRlc3Rfd3JpdGUgYXJybDEge1soMTozKTogWygxOjIpOiAwXV19IHtcW1woMTozXCk6IFxbXCgxOjJcKTogMFxdXF19XAorIAkiYXJyYXkgd3JpdGUgNCIKKyAgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorICAgICAjIEJvZ3VzIHRlc3QgY2FzZSAtIHR5cGUgbWlzbWF0Y2g/CisgICAgIHRlc3Rfd3JpdGUgYXJybDEge1soMSk6IDEyNywgKDIpOiAtMTI4XX0gImFycmF5IHdyaXRlIDUiCisgICAgIHRlc3Rfd3JpdGUgYXJybDEge1soMTozKTogWygxOjIpOiAwXV19IHtcW1woMTozXCk6IFxbXCgxOjJcKTogMFxdXF19XAorIAkiYXJyYXkgd3JpdGUgNiIKKworICAgICMgc3RydWN0dXJlIG1vZGVzCisgICAgdGVzdF93cml0ZSBzdHJ1bDEge1suYTogLTMyNzY4LCAuYjogMzI3NjcsIC5jaDogIlpaWloiXX0gXAorCXtcW1wuYTogLTMyNzY4LCBcLmI6IDMyNzY3LCBcLmNoOiBcIlpaWlpcIlxdfSBcCisJInN0cnVjdHVyZSB3cml0ZSAxIgorICAgIHRlc3Rfd3JpdGUgc3RydWwxIHtbLmE6IDAsIC5iOiAwLCAuY2g6ICIwMDAwIl19IFwKKwl7XFtcLmE6IDAsIFwuYjogMCwgXC5jaDogXCIwMDAwXCJcXX0gXAorCSJzdHJ1Y3R1cmUgd3JpdGUgMiIKKyAgICB0ZXN0X3dyaXRlIHN0cnVsMSAtMzI3Njgge1xbXC5hOiAtMzI3NjgsIFwuYjogMCwgXC5jaDogXCIwMDAwXCJcXX0gXAorCXsuYX0gInN0cnVjdHVyZSB3cml0ZSAzIgorICAgIHRlc3Rfd3JpdGUgc3RydWwxIHtbLmE6IDAsIC5iOiAwLCAuY2g6ICIwMDAwIl19IFwKKwl7XFtcLmE6IDAsIFwuYjogMCwgXC5jaDogXCIwMDAwXCJcXX0gXAorCSJzdHJ1Y3R1cmUgd3JpdGUgNCIKKyAgICB0ZXN0X3dyaXRlIHN0cnVsMSAtMzI3Njgge1xbXC5hOiAwLCBcLmI6IC0zMjc2OCwgXC5jaDogXCIwMDAwXCJcXX0gXAorCXsuYn0gInN0cnVjdHVyZSB3cml0ZSA1IgorICAgIHRlc3Rfd3JpdGUgc3RydWwxIHtbLmE6IDAsIC5iOiAwLCAuY2g6ICIwMDAwIl19IFwKKwl7XFtcLmE6IDAsIFwuYjogMCwgXC5jaDogXCIwMDAwXCJcXX0gXAorCSJzdHJ1Y3R1cmUgd3JpdGUgNiIKKyAgICB0ZXN0X3dyaXRlIHN0cnVsMSBcIkhVR09cIiB7XFtcLmE6IDAsIFwuYjogMCwgXC5jaDogXCJIVUdPXCJcXX0gXAorCXsuY2h9ICJzdHJ1Y3R1cmUgd3JpdGUgNyIKK30KKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCitzZXQgYmluZmlsZSAidGVzdHMyLmV4ZSIKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisKK2dkYl90ZXN0ICJzZXQgcHJpbnQgc2V2ZW5iaXQtc3RyaW5ncyIgIi4qIgorCitpZiBbc2V0X2xhbmdfY2hpbGxdIHRoZW4geworICAgIHdyaXRlX2FjY2VzcworfSBlbHNlIHsKKyAgICB3YXJuaW5nICIkdGVzdF9uYW1lIHRlc3RzIHN1cHByZXNzZWQuIgorfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvdHVwbGVzLmNoIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvdHVwbGVzLmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NzA5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5jaGlsbC90dXBsZXMuY2gKQEAgLTAsMCArMSw4NiBAQAoreDogTU9EVUxFCisKK1NZTk1PREUgbV9hcnJpID0gQVJSQVkoMTo1KSBJTlQ7CitEQ0wgdl9hcnJpIG1fYXJyaSA6PSBbIC0xLCAtMiwgLTMsIC00LCAtNSBdOworCitTWU5NT0RFIG1fYXJydWkgPSBBUlJBWSgxOjUpIFVJTlQ7CitEQ0wgdl9hcnJ1aSBtX2FycnVpIDo9IFsgMSwgMiwgMywgNCwgNSBdOworCitTWU5NT0RFIHIxID0gUkFOR0UgKDE6NSk7CitTWU5NT0RFIG1fYXJyYiA9IEFSUkFZKHIxKSBCWVRFOworRENMIHZfYXJyYiBtX2FycmIgOj0gWyAtMywgLTQsIC01LCAtNiwgLTcgXTsKKworU1lOTU9ERSBtX2FycnViID0gQVJSQVkocjEpIFVCWVRFOworRENMIHZfYXJydWIgbV9hcnJ1YiA6PSBbIDMsIDQsIDUsIDYsIDcgXTsKKworU1lOTU9ERSBtX2FycmMgPSBBUlJBWSAoMTo1KSBDSEFSOworRENMIHZfYXJyYyBtX2FycmMgOj0gWyAnMScsICcyJywgJzMnLCAnNCcsICc1JyBdOworCitTWU5NT0RFIG1fcHMgPSBQT1dFUlNFVCByMTsKK0RDTCB2X3BzIG1fcHMgOj0gWyAxLCAzLCA1IF07CisKK0RDTCB2X2N2IENIQVJTKDIwKSBWQVJZSU5HIDo9ICJmb28iOworCitTWU5NT0RFIG1fYXJyYm9vbCA9IEFSUkFZKHIxKSBCT09MOworRENMIHZfYXJyYm9vbCBtX2FycmJvb2wgOj0gWyB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUgXTsKKworRENMIGogcjEgOj0gNDsKKworRENMIGkgSU5UOworCituZXdtb2RlIHZzdHJ1Y3QgPSBzdHJ1Y3QgKGEsIGIgbG9uZywgCisJCQkgIGNhc2UgYiBvZiAKKwkJCSAgICg0Mik6IGNoOCBjaGFycygyMCksCisJCQkgICAoNTIpOiBpIGxvbmcKKwkJCSAgIGVsc2UgIGNoMSBjaGFyCisgICAgICAgICAgICAgICAgICAgICAgICAgZXNhYyk7CisKK0RDTCB2c3RyIHZzdHJ1Y3QgOj0gWyAuYTogMTAsIC5iOiA1MiwgLmk6IDEwMCBdOworCitpIDo9IDA7CisKK0VORCB4OworCitzZXRtb2RlOiBNT0RVTEUgLyogVGhpcyBpcyBmcm9tIEN5Z251cyBQUiBjaGlsbC81MDI0LiAqLworCitORVdNT0RFIGRheSA9IFNFVCggbW9uZGF5LCB0dWVzZGF5LCB3ZWRuZXNkYXksIHRodXJzZGF5LCBmcmlkYXksIHNhdHVyZGF5LCBzdW5kYXkgKTsKK05FV01PREUgZG93ID0gUE9XRVJTRVQgZGF5OworCitEQ0wgZCBkYXk7CitEQ0wgdyBkb3c7CisKK3ByaW50ZG93OiBQUk9DKCB3IGRvdyApOworICBEQ0wgZCBkYXk7CisgIERPIEZPUiBkIGluIHc7CisgICAgV1JJVEVURVhUKCBzdGRvdXQsICIlQyAiLCBkICk7CisgIE9EOworRU5EOworCitkIDo9IG1vbmRheTsKK3cgOj0gZG93W21vbmRheSA6IGZyaWRheV07CitwcmludGRvdyggdyApOworCitwcmludGRvdyggZG93W0xPV0VSKGRvdykgOiBVUFBFUihkb3cpXSApOworCitFTkQgc2V0bW9kZTsKKworUFI4NjQzOiBNT0RVTEUKKworU1lOTU9ERSBtX3NldCA9IFNFVCAoYSwgYiwgYywgZCk7CitTWU5NT0RFIG1fcHMgPSBQT1dFUlNFVCBtX3NldDsKKworU1lOTU9ERSBtX3MxID0gU1RSVUNUIChzdHIgQ0hBUlMoNDApIFZBUllJTkcsIGkgSU5ULCBwcyBtX3BzKTsKK0RDTCB2czEgbV9zMTsKKworU1lOTU9ERSBtX3MyID0gU1RSVUNUIChpIExPTkcsIHMgbV9zMSk7CitEQ0wgdnMyIG1fczI7CisKK1NZTk1PREUgbV9hcnIgPSBBUlJBWSAoMTozKSBCWVRFOworU1lOTU9ERSBtX3MzID0gU1RSVUNUIChpIExPTkcsIGEgbV9hcnIpOworRENMIHZzMyBtX3MzOworCitEQ0wgaSBMT05HOworCitpIDo9IDI0OworCitFTkQgUFI4NjQzOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuY2hpbGwvdHVwbGVzLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3R1cGxlcy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmYTllZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmNoaWxsL3R1cGxlcy5leHAKQEAgLTAsMCArMSwxNjEgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBQZXIgQm90aG5lci4gKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK2lmIFtza2lwX2NoaWxsX3Rlc3RzXSB0aGVuIHsgY29udGludWUgfQorCitzZXQgdGVzdGZpbGUgInR1cGxlcyIKK3NldCBzcmNmaWxlICR7c3JjZGlyfS8kc3ViZGlyLyR7dGVzdGZpbGV9LmNoCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LmV4ZQoraWYgIHsgW2NvbXBpbGUgIiR7c3JjZmlsZX0gLWcgLW8gJHtiaW5maWxlfSAke0NISUxMX1JUMH0gJHtDSElMTF9MSUJ9Il0gIT0gIiIgfSB7CisgICAgcGVycm9yICJDb3VsZG4ndCBjb21waWxlICR7c3JjZmlsZX0iCisgICAgcmV0dXJuIC0xCit9CisKK3Byb2MgZG9fdGVzdHMge30geworICAgIGdsb2JhbCBwcm1zX2lkIGJ1Z19pZCBzdWJkaXIgb2JqZGlyIHNyY2RpciBiaW5maWxlIGdkYl9wcm9tcHQKKworICAgIHNldCBwcm1zX2lkIDAKKyAgICBzZXQgYnVnX2lkIDAKKworICAgICMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworICAgIGdkYl9leGl0CisgICAgZ2RiX3N0YXJ0CisgICAgZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisgICAgZ2RiX2xvYWQgJGJpbmZpbGUKKworICAgIGdkYl90ZXN0ICJzZXQgbGFuZ3VhZ2UgY2hpbGwiICIiCisKKyAgICBydW50byB0dXBsZXMuY2g6NDAKKworICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCB2X2FycmkiIHs9IFsoMSk6IC0xLCAoMik6IC0yLCAoMyk6IC0zLCAoNCk6IC00LCAoNSk6IC01XX0KKyAgICBnZGJfdGVzdF9leGFjdCAic2V0IHZfYXJyaSA6PSBcWyAzMywgNDQsIDU1LCA2NiwgNzcgXF0iIHt9CisgICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IHZfYXJyaSIgez0gWygxKTogMzMsICgyKTogNDQsICgzKTogNTUsICg0KTogNjYsICg1KTogNzddfSAiYWZ0ZXIgYXNzaWdubWVudCAxIHRvIHZfYXJyaSIKKyAgICBnZGJfdGVzdF9leGFjdCAic2V0IHZfYXJyaSA6PSBcWy0zMywgLTQ0LCAtNTUsIC02NiwgLTc3XF0iIHt9CisgICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IHZfYXJyaSIgez0gWygxKTogLTMzLCAoMik6IC00NCwgKDMpOiAtNTUsICg0KTogLTY2LCAoNSk6IC03N119IHthZnRlciBhc3NpZ25tZW50IDIgdG8gdl9hcnJpfQorCisgICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IHZfYXJydWkiIHs9IFsoMSk6IDEsICgyKTogMiwgKDMpOiAzLCAoNCk6IDQsICg1KTogNV19CisgICAgZ2RiX3Rlc3RfZXhhY3QgInNldCB2X2FycnVpIDo9IFxbIDExLCAxMSwgMTEsIDExLCAxMSBcXSIge30KKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgdl9hcnJ1aSIgez0gWygxOjUpOiAxMV19ICJhZnRlciBhc3NpZ25tZW50IHRvIHZfYXJydWkiCisKKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgdl9hcnJiIiB7PSBbKDEpOiAtMywgKDIpOiAtNCwgKDMpOiAtNSwgKDQpOiAtNiwgKDUpOiAtN119CisKKyAgICBnZGJfdGVzdF9leGFjdCAic2V0IHZfYXJyYiA6PSBcWyAtOSwgLTgsIC03LCAtNiwgLTUgXF0iIHt9CisgICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IHZfYXJyYiIgez0gWygxKTogLTksICgyKTogLTgsICgzKTogLTcsICg0KTogLTYsICg1KTogLTVdfSAiYWZ0ZXIgYXNzaWdubWVudCB0byB2X2FycmIiCisKKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgdl9hcnJ1YiIgez0gWygxKTogMywgKDIpOiA0LCAoMyk6IDUsICg0KTogNiwgKDUpOiA3XX0KKyAgICBnZGJfdGVzdF9leGFjdCAic2V0IHZfYXJydWIgOj0gXFsgNzcsIDc3LCA3NywgNzcsIDc3IFxdIiB7fQorICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCB2X2FycnViIiB7PSBbKDE6NSk6IDc3XX0gInZfYXJydWIgYWZ0ZXIgYXNzaWdubWVudCIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCBqIiB7PSA0fQorICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCBqIDo9IDMrNCIgez0gN30KKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgaiA6PSByMSgzKSIgez0gM30KKworICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCB2X2FycmMiIHs9IFsoMSk6ICcxJywgKDIpOiAnMicsICgzKTogJzMnLCAoNCk6ICc0JywgKDUpOiAnNSddfQorICAgIGdkYl90ZXN0X2V4YWN0ICJzZXQgdl9hcnJjIDo9IFxbICdhJywgJ2InLCAnYycsICdkJywgJ2UnIFxdIiB7fQorICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCB2X2FycmMiIHs9IFsoMSk6ICdhJywgKDIpOiAnYicsICgzKTogJ2MnLCAoNCk6ICdkJywgKDUpOiAnZSddfSAidl9hcnJjIGFmdGVyIGFzc2lnbm1lbnQiCisKKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgdl9wcyIgez0gWzEsIDMsIDVdfQorICAgIGdkYl90ZXN0X2V4YWN0ICJzZXQgdl9wcyA6PSBcWyAyLCA0IFxdIiB7fQorICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCB2X3BzIiB7PSBbMiwgNF19IHt2X3BzIGFmdGVyIGFzc2lnbm1lbnR9CisgICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IHZfcHMgOj0gIFxbXF0iIHs9IFtdfSB7YXNzaWduIFtdIHRvIHZfcHN9CisKKyAgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgbV9hcnJpXFsxLCAyLCAzLCA0LCA1XF0iIHs9IFsoMSk6IDEsICgyKTogMiwgKDMpOiAzLCAoNCk6IDQsICg1KTogNV19CisgICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IG1fYXJydWJcWzQ1LCA0NiwgNDcsIDQ4LCA0OVxdIiB7PSBbKDEpOiA0NSwgKDIpOiA0NiwgKDMpOiA0NywgKDQpOiA0OCwgKDUpOiA0OV19CisKKyAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCB2X2N2IiB7PSAiZm9vIn0KKyAgIGdkYl90ZXN0X2V4YWN0ICJzZXQgdl9jdiA6PSBcImZvby1iYXJcIiIge30KKyAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCB2X2N2IiB7PSAiZm9vLWJhciJ9ICJ2X2N2IGFmdGVyIGFzc2lnbm1lbnQiCisgICBnZGJfdGVzdF9leGFjdCAic2V0IHZfY3YoMykgOj0gJyAnIiB7fQorICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IHZfY3YiIHs9ICJmb28gYmFyIn0gInZfY3YgYWZ0ZXIgZWxlbWVudCBhc3NpZ25tZW50IgorCisgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgdl9hcnJib29sIiB7PSBbKDEpOiBUUlVFLCAoMik6IEZBTFNFLCAoMyk6IFRSVUUsICg0KTogRkFMU0UsICg1KTogVFJVRV19CisgICBnZGJfdGVzdF9leGFjdCAic2V0IHZfYXJyYm9vbCA6PSBcWyBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UgXF0iIHt9CisgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgdl9hcnJib29sIiB7PSBbKDE6NSk6IEZBTFNFXX0gInZfYXJyYm9vbCBhZnRlciBhc3NpZ25tZW50IDEiCisgICBnZGJfdGVzdF9leGFjdCAic2V0IHZfYXJyYm9vbCA6PSBcW3RydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWVcXSIge30KKyAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCB2X2FycmJvb2wiIHs9IFsoMTo1KTogVFJVRV19ICJ2X2FycmJvb2wgYWZ0ZXIgYXNzaWdubWVudCAyIgorICAgZ2RiX3Rlc3RfZXhhY3QgInNldCB2X2FycmJvb2woMykgOj0gZmFsc2UiIHt9CisgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgdl9hcnJib29sIiB7PSBbKDE6Mik6IFRSVUUsICgzKTogRkFMU0UsICg0OjUpOiBUUlVFXX0gInZfYXJyYm9vbCBhZnRlciBlbGVtZW50IGFzc2lnbm1lbnQiCisKKyAgIGdkYl90ZXN0X2V4YWN0ICJzZXQgdl9hcnJib29sKDEgdXAgMikgOj0gXFsgZmFsc2UsIHRydWUgXF0iIHt9CisgICBnZGJfdGVzdF9leGFjdCAicHJpbnQgdl9hcnJib29sIiB7PSBbKDEpOiBGQUxTRSwgKDIpOiBUUlVFLCAoMyk6IEZBTFNFLCAoNDo1KTogVFJVRV19ICJ2X2FycmJvb2wgYWZ0ZXIgc2xpY2UgYXNzaWdubWVudCAxIgorICAgZ2RiX3Rlc3RfZXhhY3QgInNldCB2X2FycmJvb2woMyA6IDUpIDo9IFxbIHRydWUsIHRydWUsIGZhbHNlIFxdIiB7fQorICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IHZfYXJyYm9vbCIgez0gWygxKTogRkFMU0UsICgyOjQpOiBUUlVFLCAoNSk6IEZBTFNFXX0gInZfYXJyYm9vbCBhZnRlciBzbGljZSBhc3NpZ25tZW50IDIiCisKKyAgIGdkYl90ZXN0X2V4YWN0ICJzZXQgdnN0ciA6PSBcWyAuYTogMiszLCAuYjogMTIsIC5jaDE6ICd4JyBcXSIge30KKyAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCB2c3RyLmEiIHs9IDV9ICJ2c3RyLmEgYWZ0ZXIgYXNzaWdubWVudCIKKyAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCB2c3RyLmNoMSIgez0gJ3gnfSAidnN0ci5jaDEgYWZ0ZXIgYXNzaWdubWVudCIKKworIyAgIFRoZXNlIHRlc3RzIGFyZSBmcm9tIEN5Z251cyBQUiBjaGlsbC81MDI0OgorICAgIGdkYl90ZXN0ICJicmVhayBwcmludGRvdyIgIiIKKyAgICBnZGJfdGVzdCAiY29udGludWUiICIiCisgICAgZ2RiX3Rlc3RfZXhhY3QgInNldCB2YXIgdzo9IGRvd1xbbW9uZGF5XF0iIHt9CisgICAgZ2RiX3Rlc3QgInByaW50IHciICIgPSBcXFxbbW9uZGF5XFxcXSIgXAorCSJwcmludCBiaXRzdHJpbmcgYWZ0ZXIgYXNzaWdubWVudCIKKyAgICBnZGJfdGVzdF9leGFjdCAic2V0IHZhciB3Oj1cW1xdIiB7fQorICAgIGdkYl90ZXN0ICJwcmludCB3IiAiID0gXFxcW1xcXF0iIFwKKwkicHJpbnQgYml0c3RyaW5nIGFmdGVyIGFzc2lnbm1lbnQgb2YgXFtcXSIKKworIyAgIFRoZXNlIHRlc3RzIGFyZSBmcm9tIEN5Z251cyBQUiBjaGlsbC84NjQzOgorICAgIHJ1bnRvIHR1cGxlcy5jaDo0MAorICAgIGdkYl90ZXN0X2V4YWN0ICJzZXQgdmFyIHZzMSA6PSBcWyBcImZvb1wiLCA0MSwgXFsgYiBcXSBcXSIgIHt9CisgICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IHZzMSIgeyA9IFsuc3RyOiAiZm9vIiwgLmk6IDQxLCAucHM6IFtiXV19IFwKKwkicHJpbnQgdnMxIGFmdGVyIHR1cGxlIGFzc2lnbiAxIgorICAgIHNldHVwX3hmYWlsICJpKjg2LXBjLWxpbnV4Ki1nbnUiICJzcGFyYy0qLXNvbGFyaXMqIiAic3BhcmMtKi1zdW5vcyoiCisgICAgZ2RiX3Rlc3RfZXhhY3QgInNldCB2YXIgdnMxIDo9IFxbIFwiYmFyXCIsIDQyLCBtX3BzXFsgYSBcXSBcXSIge30KKyAgICBzZXR1cF94ZmFpbCAiaSo4Ni1wYy1saW51eCotZ251IiAic3BhcmMtKi1zb2xhcmlzKiIgInNwYXJjLSotc3Vub3MqIgorICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCB2czEiIHsgPSBbLnN0cjogImJhciIsIC5pOiA0MiwgLnBzOiBbYV1dfSBcCisJInByaW50IHZzMSBhZnRlciB0dXBsZSBhc3NpZ24gMiIKKworICAgIGdkYl90ZXN0X2V4YWN0ICJzZXQgdmFyIFwkaSA6PSBtX3MxXFtcImZvb1wiLCA0MiwgXFthIFxdXF0iIHt9CisgICAgZ2RiX3Rlc3RfZXhhY3Qge3ByaW50ICRpfSB7ID0gWy5zdHI6ICJmb28iLCAuaTogNDIsIC5wczogW2FdXX0gXAorCSJwcmludCBcJGkgYWZ0ZXIgdHVwbGUgYXNzaWduIDEiCisgICAgc2V0dXBfeGZhaWwgImkqODYtcGMtbGludXgqLWdudSIgInNwYXJjLSotc29sYXJpcyoiICJzcGFyYy0qLXN1bm9zKiIKKyAgICBnZGJfdGVzdF9leGFjdCAic2V0IHZhciBcJGkgOj0gbV9zMVxbXCJmb29cIiwgNDQsIG1fcHNcW2EgXF1cXSIge30KKyAgICBzZXR1cF94ZmFpbCAiaSo4Ni1wYy1saW51eCotZ251IiAic3BhcmMtKi1zb2xhcmlzKiIgInNwYXJjLSotc3Vub3MqIgorICAgIGdkYl90ZXN0X2V4YWN0IHtwcmludCAkaX0geyA9IFsuc3RyOiAiZm9vIiwgLmk6IDQ0LCAucHM6IFthXV19IFwKKwkicHJpbnQgXCRpIGFmdGVyIHR1cGxlIGFzc2lnbiAyIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgInNldCB2YXIgdnMyIDo9IFxbIDEwLCBcWyBcImZvb1wiICwgNDIsIFxbIGIgXF0gXF0gXF0iIHt9CisgICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IHZzMiIgXAorCXsgPSBbLmk6IDEwLCAuczogWy5zdHI6ICJmb28iLCAuaTogNDIsIC5wczogW2JdXV19IFwKKwkicHJpbnQgdnMyIGFmdGVyIHR1cGxlIGFzc2lnbiAxIgorICAgIHNldHVwX3hmYWlsICJpKjg2LXBjLWxpbnV4Ki1nbnUiICJzcGFyYy0qLXNvbGFyaXMqIiAic3BhcmMtKi1zdW5vcyoiCisgICAgZ2RiX3Rlc3RfZXhhY3QgInNldCB2YXIgdnMyIDo9IFxbIDEwKzMsIG1fczFcWyBcImZvb1wiICwgNDIsIG1fcHNcWyBiIFxdIFxdIFxdIiB7fQorICAgIHNldHVwX3hmYWlsICJpKjg2LXBjLWxpbnV4Ki1nbnUiICJzcGFyYy0qLXNvbGFyaXMqIiAic3BhcmMtKi1zdW5vcyoiCisgICAgZ2RiX3Rlc3RfZXhhY3QgInByaW50IHZzMiIgXAorCXsgPSBbLmk6IDEzLCAuczogWy5zdHI6ICJmb28iLCAuaTogNDIsIC5wczogW2JdXV19IFwKKwkicHJpbnQgdnMyIGFmdGVyIHR1cGxlIGFzc2lnbiAyIgorCisgICAgZ2RiX3Rlc3RfZXhhY3QgInNldCB2YXIgdnMzIDo9IFxbIDMzLCBcWyAtMSwgLTIsIC0zIFxdIFxdIiB7fQorICAgIGdkYl90ZXN0X2V4YWN0ICJwcmludCB2czMiIHtbLmk6IDMzLCAuYTogWygxKTogLTEsICgyKTogLTIsICgzKTogLTNdXX0gXAorCSJwcmludCB2czMgYWZ0ZXIgdHVwbGUgYXNzaWduIgorICAgIGdkYl90ZXN0X2V4YWN0ICJzZXQgdmFyIFwkayA6PSBtX3MzXFsgMzMsIG1fYXJyXFsgNCwgMywgMiBcXSBcXSIge30KKyAgICBnZGJfdGVzdF9leGFjdCB7cHJpbnQgJGt9IHsgPSBbLmk6IDMzLCAuYTogWygxKTogNCwgKDIpOiAzLCAoMyk6IDJdXX0gXAorCSJwcmludCBcJGsgYWZ0ZXIgdHVwbGUgYXNzaWduIgorCit9CisKK2RvX3Rlc3RzCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5kaXNhc20vTWFrZWZpbGUuaW4gYi9nZGIvdGVzdHN1aXRlL2dkYi5kaXNhc20vTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyMjhkZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmRpc2FzbS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDIwIEBACisjIyMjIGhvc3QsIHRhcmdldCwgYW5kIHNpdGUgc3BlY2lmaWMgTWFrZWZpbGUgZnJhZ3MgY29tZSBpbiBoZXJlLgorCitWUEFUSCA9IEBzcmNkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorCisuUEhPTlk6IGFsbCBjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gcmVhbGNsZWFuCisKK2FsbDogCisJQGVjaG8gIk5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYWxsLi4uIgkKKworY2xlYW4gbW9zdGx5Y2xlYW46CisJLXJtIC1mICoubyAqLmRpZmYgKn4gKi5iYWQgY29yZSBzaDMgaHBwYSBtbjEwMjAwIG1uMTAzMDAKKworZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuOiBjbGVhbgorCS1ybSAtZiBNYWtlZmlsZSBjb25maWcuc3RhdHVzIGNvbmZpZy5sb2cKKworTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHNyY2RpcikvY29uZmlndXJlLmluCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjaworCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmRpc2FzbS9jb25maWd1cmUgYi9nZGIvdGVzdHN1aXRlL2dkYi5kaXNhc20vY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNmNiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5kaXNhc20vY29uZmlndXJlCkBAIC0wLDAgKzEsODk5IEBACisjISAvYmluL3NoCisKKyMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEgCisjIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworIyBEZWZhdWx0czoKK2FjX2hlbHA9CithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCisjIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46CisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCisgICAgZXhpdCAwIDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Li9jb25maWcubG9nCisKK2VjaG8gIlwKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorIiAxPiY1CisKKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCithY19jb25maWd1cmVfYXJncz0KK2ZvciBhY19hcmcKK2RvCisgIGNhc2UgIiRhY19hcmciIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBlc2FjCitkb25lCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKyMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCisjIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCitpZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID4gY29uZmRlZnMuaAorCisjIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0CisjIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorYWNfdW5pcXVlX2ZpbGU9c2gzLnMKKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitpZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KKyAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKyAgICBhY19uPSBhY19jPScKKycgYWNfdD0nCScKKyAgZWxzZQorICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKyAgZmkKK2Vsc2UKKyAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CitmaQorCisKKworQ0M9JHtDQy1jY30KKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworCisjIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KKyMgVGhlIGlucHV0cyBhcmU6CisjICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKKyMKKyMgVGhlIHJ1bGVzIGFyZToKKyMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCisjICAgIHNhbWUgdGltZS4KKyMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCisjIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKKyMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCisjIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCisjIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgorCisjIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCisjIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCitjYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KK05PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKKyopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KK2lmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKK2Vsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1NzM6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorCitob3N0X2FsaWFzPSRob3N0CitjYXNlICIkaG9zdF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKQorICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKKyAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaSA7OworICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKK2hvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTk0OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorCit0YXJnZXRfYWxpYXM9JHRhcmdldAorY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCit0YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCit0YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2MTI6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKworYnVpbGRfYWxpYXM9JGJ1aWxkCitjYXNlICIkYnVpbGRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2J1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCitidWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2J1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAorYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKKwordGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgorICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCisgICAgTk9ORU5PTkVzLHgseCwgJiYKKyAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQorCisKK3RyYXAgJycgMSAyIDE1CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxIHwgZ3JlcCBhY19zcGFjZWAgaW4KKyAgKmFjX3NwYWNlPVwgKikKKyAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgc2VkIC1uIFwKKyAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCisgICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCisgICAgOzsKKyAgKikKKyAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKyAgICA7OworICBlc2FjID4+IGNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCisjIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KKyMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJworZmkKKwordHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gREVGUy4KKyMgUHJvdGVjdCBhZ2FpbnN0IHNoZWxsIGV4cGFuc2lvbiB3aGlsZSBleGVjdXRpbmcgTWFrZWZpbGUgcnVsZXMuCisjIFByb3RlY3QgYWdhaW5zdCBNYWtlZmlsZSBtYWNybyBleHBhbnNpb24uCitjYXQgPiBjb25mdGVzdC5kZWZzIDw8XEVPRgorcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklLURcMT1cMiVnCitzJVsgCWB+IyReJiooKXt9XFx8OyciPD4/XSVcXCYlZworcyVcWyVcXCYlZworcyVcXSVcXCYlZworcyVcJCUkJCVnCitFT0YKK0RFRlM9YHNlZCAtZiBjb25mdGVzdC5kZWZzIGNvbmZkZWZzLmggfCB0ciAnXDAxMicgJyAnYAorcm0gLWYgY29uZnRlc3QuZGVmcworCisKKyMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgorOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorCitlY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCitybSAtZiAkQ09ORklHX1NUQVRVUworY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyMhIC9iaW4vc2gKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCisjIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIworIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKKyMKKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCithY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgorZm9yIGFjX29wdGlvbgorZG8KKyAgY2FzZSAiXCRhY19vcHRpb24iIGluCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKKyAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCisgICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorCit0cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQFNIRUxMQCUkU0hFTEwlZworcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBERUZTQCUkREVGUyVnCitzJUBMREZMQUdTQCUkTERGTEFHUyVnCitzJUBMSUJTQCUkTElCUyVnCitzJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKK3MlQHByZWZpeEAlJHByZWZpeCVnCitzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCitzJUBiaW5kaXJAJSRiaW5kaXIlZworcyVAc2JpbmRpckAlJHNiaW5kaXIlZworcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworcyVAZGF0YWRpckAlJGRhdGFkaXIlZworcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZworcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCitzJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCitzJUBsaWJkaXJAJSRsaWJkaXIlZworcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworcyVAaW5mb2RpckAlJGluZm9kaXIlZworcyVAbWFuZGlyQCUkbWFuZGlyJWcKK3MlQENDQCUkQ0MlZworcyVAaG9zdEAlJGhvc3QlZworcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZworcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCitzJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKK3MlQGhvc3Rfb3NAJSRob3N0X29zJWcKK3MlQHRhcmdldEAlJHRhcmdldCVnCitzJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZworcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZworcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZworcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKK3MlQGJ1aWxkQCUkYnVpbGQlZworcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCitzJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZworcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKK3MlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZworCitDRU9GCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCithY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KK2FjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfbW9yZV9saW5lcz06CithY19zZWRfY21kcz0iIgord2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZmkKKyAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGVsc2UKKyAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGZpCisgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCisgICAgYWNfYmVnPSRhY19lbmQKKyAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgIGFjX3NlZF9jbWRzPWNhdAorZmkKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUifQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KKworICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgIC4pICBzcmNkaXI9LgorICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgorICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7CisgIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgorICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgZXNhYworCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworZXhpdCAwCitFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCitybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwordGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmRpc2FzbS9jb25maWd1cmUuaW4gYi9nZGIvdGVzdHN1aXRlL2dkYi5kaXNhc20vY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwODYzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5kaXNhc20vY29uZmlndXJlLmluCkBAIC0wLDAgKzEsMTUgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitkbmwgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IGZyYWdtZW50IHRoYXQgc3VwcGxpZXMgdGhlIGluZm9ybWF0aW9uCitkbmwgbmVjZXNzYXJ5IHRvIHRhaWxvciBhIHRlbXBsYXRlIGNvbmZpZ3VyZSBzY3JpcHQgaW50byB0aGUgY29uZmlndXJlCitkbmwgc2NyaXB0IGFwcHJvcHJpYXRlIGZvciB0aGlzIGRpcmVjdG9yeS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBjaGVjaworZG5sIGFueSBleGlzdGluZyBjb25maWd1cmUgc2NyaXB0LgorCitBQ19QUkVSRVEoMi41KQorQUNfSU5JVChzaDMucykKKworQ0M9JHtDQy1jY30KK0FDX1NVQlNUKENDKQorQUNfQ09ORklHX0FVWF9ESVIoYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLikKK0FDX0NBTk9OSUNBTF9TWVNURU0KKworQUNfT1VUUFVUKE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuZGlzYXNtL2hwcGEuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuZGlzYXNtL2hwcGEuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNjc5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5kaXNhc20vaHBwYS5leHAKQEAgLTAsMCArMSwxNDAzIEBACisKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBKZWZmIExhdy4gKGxhd0Bjcy51dGFoLmVkdSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK2lmICFbaXN0YXJnZXQgImhwcGEqLSotKiJdIHsKKyAgICB2ZXJib3NlICJUZXN0cyBpZ25vcmVkIGZvciBhbGwgYnV0IGhwcGEgYmFzZWQgdGFyZ2V0cy4iCisgICAgcmV0dXJuCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgImhwcGEiCitzZXQgc3JjZmlsZSAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LnMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KK3NldCBjb21wX291dHB1dCBbZ2RiX2NvbXBpbGUgIiR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlICIiXTsKK2lmICB7ICRjb21wX291dHB1dCAhPSAiIiB9IHsKKyAgICBpZiBbIHJlZ2V4cCAiT3Bjb2RlIG5vdCBkZWZpbmVkIC0gRElBRyIgJGNvbXBfb3V0cHV0XSB7CisJd2FybmluZyAiSFAgYXNzZW1ibGVyIGluIHVzZS0tc2tpcHBpbmcgZGlzYXNtIHRlc3RzIgorCXJldHVybgorICAgIH0gZWxzZSB7CisJcGVycm9yICJDb3VsZG4ndCBjb21waWxlICR7c3JjZmlsZX0iCisJcmV0dXJuIC0xCisgICAgfQorfQorCitwcm9jIGFsbF9pbnRlZ2VyX21lbW9yeV90ZXN0cyB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICBzZW5kX2dkYiAieC84aSBpbnRlZ2VyX21lbW9yeV90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmxkdyAwXFwoc3IwLHI0XFwpLHIyNi4qCisuKmxkaCAwXFwoc3IwLHI0XFwpLHIyNi4qCisuKmxkYiAwXFwoc3IwLHI0XFwpLHIyNi4qCisuKnN0dyByMjYsMFxcKHNyMCxyNFxcKS4qCisuKnN0aCByMjYsMFxcKHNyMCxyNFxcKS4qCisuKnN0YiByMjYsMFxcKHNyMCxyNFxcKS4qCisuKmxkd20gMFxcKHNyMCxyNFxcKSxyMjYuKgorLipzdHdtIHIyNiwwXFwoc3IwLHI0XFwpLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJpbnRlZ2VyX21lbW9yeV90ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJpbnRlZ2VyX21lbW9yeV90ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgaW50ZWdlciBtZW1vcnlfdGVzdHMiIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAieC8yMGkgaW50ZWdlcl9pbmRleGluZ19sb2FkXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIKKy4qbGR3eCByNVxcKHNyMCxyNFxcKSxyMjYuKgorLipsZHd4LHMgcjVcXChzcjAscjRcXCkscjI2LioKKy4qbGR3eCxtIHI1XFwoc3IwLHI0XFwpLHIyNi4qCisuKmxkd3gsc20gcjVcXChzcjAscjRcXCkscjI2LioKKy4qbGRoeCByNVxcKHNyMCxyNFxcKSxyMjYuKgorLipsZGh4LHMgcjVcXChzcjAscjRcXCkscjI2LioKKy4qbGRoeCxtIHI1XFwoc3IwLHI0XFwpLHIyNi4qCisuKmxkaHgsc20gcjVcXChzcjAscjRcXCkscjI2LioKKy4qbGRieCByNVxcKHNyMCxyNFxcKSxyMjYuKgorLipsZGJ4LHMgcjVcXChzcjAscjRcXCkscjI2LioKKy4qbGRieCxtIHI1XFwoc3IwLHI0XFwpLHIyNi4qCisuKmxkYngsc20gcjVcXChzcjAscjRcXCkscjI2LioKKy4qbGR3YXggcjVcXChyNFxcKSxyMjYuKgorLipsZHdheCxzIHI1XFwocjRcXCkscjI2LioKKy4qbGR3YXgsbSByNVxcKHI0XFwpLHIyNi4qCisuKmxkd2F4LHNtIHI1XFwocjRcXCkscjI2LioKKy4qbGRjd3ggcjVcXChzcjAscjRcXCkscjI2LioKKy4qbGRjd3gscyByNVxcKHNyMCxyNFxcKSxyMjYuKgorLipsZGN3eCxtIHI1XFwoc3IwLHI0XFwpLHIyNi4qCisuKmxkY3d4LHNtIHI1XFwoc3IwLHI0XFwpLHIyNi4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiaW50ZWdlcl9pbmRleGluZ19sb2FkIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImludGVnZXJfaW5kZXhpbmdfbG9hZCIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgaW50ZWdlcl9pbmRleGluZyIgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJ4LzE1aSBpbnRlZ2VyX2xvYWRfc2hvcnRfbWVtb3J5XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIKKy4qbGR3cyAwXFwoc3IwLHI0XFwpLHIyNi4qCisuKmxkd3MsbWIgMFxcKHNyMCxyNFxcKSxyMjYuKgorLipsZHdzLG1hIDBcXChzcjAscjRcXCkscjI2LioKKy4qbGRocyAwXFwoc3IwLHI0XFwpLHIyNi4qCisuKmxkaHMsbWIgMFxcKHNyMCxyNFxcKSxyMjYuKgorLipsZGhzLG1hIDBcXChzcjAscjRcXCkscjI2LioKKy4qbGRicyAwXFwoc3IwLHI0XFwpLHIyNi4qCisuKmxkYnMsbWIgMFxcKHNyMCxyNFxcKSxyMjYuKgorLipsZGJzLG1hIDBcXChzcjAscjRcXCkscjI2LioKKy4qbGR3YXMgMFxcKHI0XFwpLHIyNi4qCisuKmxkd2FzLG1iIDBcXChyNFxcKSxyMjYuKgorLipsZHdhcyxtYSAwXFwocjRcXCkscjI2LioKKy4qbGRjd3MgMFxcKHNyMCxyNFxcKSxyMjYuKgorLipsZGN3cyxtYiAwXFwoc3IwLHI0XFwpLHIyNi4qCisuKmxkY3dzLG1hIDBcXChzcjAscjRcXCkscjI2LioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJpbnRlZ2VyX2xvYWRfc2hvcnRfbWVtb3J5IiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImludGVnZXJfbG9hZF9zaG9ydF9tZW1vcnkiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGludGVnZXJfbG9hZF9zaG9ydF9tZW1vcnkgIiB9CisgICAgfQorCisKKyAgICBzZW5kX2dkYiAieC8xN2kgaW50ZWdlcl9zdG9yZV9zaG9ydF9tZW1vcnlcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipzdHdzIHIyNiwwXFwoc3IwLHI0XFwpLioKKy4qc3R3cyxtYiByMjYsMFxcKHNyMCxyNFxcKS4qCisuKnN0d3MsbWEgcjI2LDBcXChzcjAscjRcXCkuKgorLipzdGhzIHIyNiwwXFwoc3IwLHI0XFwpLioKKy4qc3RocyxtYiByMjYsMFxcKHNyMCxyNFxcKS4qCisuKnN0aHMsbWEgcjI2LDBcXChzcjAscjRcXCkuKgorLipzdGJzIHIyNiwwXFwoc3IwLHI0XFwpLioKKy4qc3RicyxtYiByMjYsMFxcKHNyMCxyNFxcKS4qCisuKnN0YnMsbWEgcjI2LDBcXChzcjAscjRcXCkuKgorLipzdHdhcyByMjYsMFxcKHI0XFwpLioKKy4qc3R3YXMsbWIgcjI2LDBcXChyNFxcKS4qCisuKnN0d2FzLG1hIHIyNiwwXFwocjRcXCkuKgorLipzdGJ5cyByMjYsMFxcKHNyMCxyNFxcKS4qCisuKnN0YnlzIHIyNiwwXFwoc3IwLHI0XFwpLioKKy4qc3RieXMsZSByMjYsMFxcKHNyMCxyNFxcKS4qCisuKnN0YnlzLGIsbSByMjYsMFxcKHNyMCxyNFxcKS4qCisuKnN0YnlzLGUsbSByMjYsMFxcKHNyMCxyNFxcKS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiaW50ZWdlcl9zdG9yZV9zaG9ydF9tZW1vcnkiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiaW50ZWdlcl9zdG9yZV9zaG9ydF9tZW1vcnkiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGludGVnZXJfc2hvcnRfbWVtb3J5ICIgfQorICAgIH0KK30KKworcHJvYyBhbGxfaW1tZWRpYXRlX3Rlc3RzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzNpIGltbWVkaWF0ZV90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmxkbyA1XFwocjI2XFwpLHIyNi4qCisuKmxkaWwgLTIxNTI0ODAwLHIyNi4qCisuKmFkZGlsIC0yMTUyNDgwMCxyNS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiaW1tZWRhdGVfdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiaW1tZWRhdGVfdGVzdHMiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGltbWVkYXRlX3Rlc3RzICIgfQorICAgIH0KK30KKworcHJvYyBhbGxfYnJhbmNoX3Rlc3RzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzEwaSBicmFuY2hfdGVzdHNfMVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmJsLioscnAuKgorLipibCxuLioscnAuKgorLipiLioKKy4qYixuLioKKy4qZ2F0ZS4qLHJwLioKKy4qZ2F0ZSxuLioscnAuKgorLipibHIgcjQscnAuKgorLipibHIsbiByNCxycC4qCisuKmJsciByNCxyMC4qCisuKmJscixuIHI0LHIwLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJicmFuY2hfdGVzdHNfMSIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJicmFuY2hfdGVzdHNfMSIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgYnJhbmNoX3Rlc3RzXzEiIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAieC82aSBicmFuY2hfdGVzdHNfMlxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmJ2IHIwXFwocnBcXCkuKgorLipidixuIHIwXFwocnBcXCkuKgorLipiZSAxMjM0XFwoc3IxLHJwXFwpLioKKy4qYmUsbiAxMjM0XFwoc3IxLHJwXFwpLioKKy4qYmxlIDEyMzRcXChzcjEscnBcXCkuKgorLipibGUsbiAxMjM0XFwoc3IxLHJwXFwpLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJicmFuY2hfdGVzdHNfMiIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJicmFuY2hfdGVzdHNfMiIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgYnJhbmNoX3Rlc3RzXzIiIH0KKyAgICB9CisKKworICAgIHNlbmRfZ2RiICJ4LzhpIG1vdmJfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiptb3ZiIHI0LHIyNiwuKiA8bW92Yl90ZXN0cz4uKgorLiptb3ZiLD0gcjQscjI2LC4qIDxtb3ZiX3Rlc3RzPi4qCisuKm1vdmIsPCByNCxyMjYsLiogPG1vdmJfdGVzdHM+LioKKy4qbW92YixvZCByNCxyMjYsLiogPG1vdmJfdGVzdHM+LioKKy4qbW92Yix0ciByNCxyMjYsLiogPG1vdmJfdGVzdHM+LioKKy4qbW92Yiw8PiByNCxyMjYsLiogPG1vdmJfdGVzdHM+LioKKy4qbW92Yiw+PSByNCxyMjYsLiogPG1vdmJfdGVzdHM+LioKKy4qbW92YixldiByNCxyMjYsLiogPG1vdmJfdGVzdHM+LioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJtb3ZiX3Rlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgIm1vdmJfdGVzdHMiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIG1vdmJfdGVzdHMgIiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgIngvOGkgbW92Yl9udWxsaWZpZWRfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiptb3ZiLG4uKnI0LHIyNiwuKiA8bW92Yl90ZXN0cz4uKgorLiptb3ZiLD0sbi4qcjQscjI2LC4qIDxtb3ZiX3Rlc3RzPi4qCisuKm1vdmIsPCxuLipyNCxyMjYsLiogPG1vdmJfdGVzdHM+LioKKy4qbW92YixvZCxuLipyNCxyMjYsLiogPG1vdmJfdGVzdHM+LioKKy4qbW92Yix0cixuLipyNCxyMjYsLiogPG1vdmJfdGVzdHM+LioKKy4qbW92Yiw8PixuLipyNCxyMjYsLiogPG1vdmJfdGVzdHM+LioKKy4qbW92Yiw+PSxuLipyNCxyMjYsLiogPG1vdmJfdGVzdHM+LioKKy4qbW92YixldixuLipyNCxyMjYsLiogPG1vdmJfdGVzdHM+LioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJtb3ZiX251bGxpZmllZF90ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJtb3ZiX251bGxpZmllZF90ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgbW92Yl9udWxsaWZpZWRfdGVzdHMgIiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgIngvOGkgbW92aWJfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiptb3ZpYiA1LHIyNiwuKiA8bW92aWJfdGVzdHM+LioKKy4qbW92aWIsPSA1LHIyNiwuKiA8bW92aWJfdGVzdHM+LioKKy4qbW92aWIsPCA1LHIyNiwuKiA8bW92aWJfdGVzdHM+LioKKy4qbW92aWIsb2QgNSxyMjYsLiogPG1vdmliX3Rlc3RzPi4qCisuKm1vdmliLHRyIDUscjI2LC4qIDxtb3ZpYl90ZXN0cz4uKgorLiptb3ZpYiw8PiA1LHIyNiwuKiA8bW92aWJfdGVzdHM+LioKKy4qbW92aWIsPj0gNSxyMjYsLiogPG1vdmliX3Rlc3RzPi4qCisuKm1vdmliLGV2IDUscjI2LC4qIDxtb3ZpYl90ZXN0cz4uKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgIm1vdmliX3Rlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgIm1vdmliX3Rlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBtb3ZpYl90ZXN0cyAiIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAieC84aSBtb3ZpYl9udWxsaWZpZWRfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiptb3ZpYixuLio1LHIyNiwuKiA8bW92aWJfdGVzdHM+LioKKy4qbW92aWIsPSxuLio1LHIyNiwuKiA8bW92aWJfdGVzdHM+LioKKy4qbW92aWIsPCxuLio1LHIyNiwuKiA8bW92aWJfdGVzdHM+LioKKy4qbW92aWIsb2Qsbi4qNSxyMjYsLiogPG1vdmliX3Rlc3RzPi4qCisuKm1vdmliLHRyLG4uKjUscjI2LC4qIDxtb3ZpYl90ZXN0cz4uKgorLiptb3ZpYiw8PixuLio1LHIyNiwuKiA8bW92aWJfdGVzdHM+LioKKy4qbW92aWIsPj0sbi4qNSxyMjYsLiogPG1vdmliX3Rlc3RzPi4qCisuKm1vdmliLGV2LG4uKjUscjI2LC4qIDxtb3ZpYl90ZXN0cz4uKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgIm1vdmliX251bGxpZmllZF90ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJtb3ZpYl9udWxsaWZpZWRfdGVzdHMiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIG1vdmliX251bGxpZmllZF90ZXN0cyAiIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAieC84aSBjb21iX3Rlc3RzXzFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipjb21iIHIwLHI0LC4qIDxjb21iX3Rlc3RzXzE+LioKKy4qY29tYiw9IHIwLHI0LC4qIDxjb21iX3Rlc3RzXzE+LioKKy4qY29tYiw8IHIwLHI0LC4qIDxjb21iX3Rlc3RzXzE+LioKKy4qY29tYiw8PSByMCxyNCwuKiA8Y29tYl90ZXN0c18xPi4qCisuKmNvbWIsPDwgcjAscjQsLiogPGNvbWJfdGVzdHNfMT4uKgorLipjb21iLDw8PSByMCxyNCwuKiA8Y29tYl90ZXN0c18xPi4qCisuKmNvbWIsc3YgcjAscjQsLiogPGNvbWJfdGVzdHNfMT4uKgorLipjb21iLG9kIHIwLHI0LC4qIDxjb21iX3Rlc3RzXzE+LioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJjb21iX3Rlc3RzXzEiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29tYl90ZXN0c18xIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb21iX3Rlc3RzXzEiIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAieC84aSBjb21iX3Rlc3RzXzJcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipjb21iZiByMCxyNCwuKiA8Y29tYl90ZXN0c18yPi4qCisuKmNvbWJmLD0gcjAscjQsLiogPGNvbWJfdGVzdHNfMj4uKgorLipjb21iZiw8IHIwLHI0LC4qIDxjb21iX3Rlc3RzXzI+LioKKy4qY29tYmYsPD0gcjAscjQsLiogPGNvbWJfdGVzdHNfMj4uKgorLipjb21iZiw8PCByMCxyNCwuKiA8Y29tYl90ZXN0c18yPi4qCisuKmNvbWJmLDw8PSByMCxyNCwuKiA8Y29tYl90ZXN0c18yPi4qCisuKmNvbWJmLHN2IHIwLHI0LC4qIDxjb21iX3Rlc3RzXzI+LioKKy4qY29tYmYsb2QgcjAscjQsLiogPGNvbWJfdGVzdHNfMj4uKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImNvbWJfdGVzdHNfMiIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb21iX3Rlc3RzXzIiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGNvbWJfdGVzdHNfMiIgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJ4LzhpIGNvbWJfbnVsbGlmaWVkX3Rlc3RzXzFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipjb21iLG4gcjAscjQsLiogPGNvbWJfdGVzdHNfMT4uKgorLipjb21iLD0sbiByMCxyNCwuKiA8Y29tYl90ZXN0c18xPi4qCisuKmNvbWIsPCxuIHIwLHI0LC4qIDxjb21iX3Rlc3RzXzE+LioKKy4qY29tYiw8PSxuIHIwLHI0LC4qIDxjb21iX3Rlc3RzXzE+LioKKy4qY29tYiw8PCxuIHIwLHI0LC4qIDxjb21iX3Rlc3RzXzE+LioKKy4qY29tYiw8PD0sbiByMCxyNCwuKiA8Y29tYl90ZXN0c18xPi4qCisuKmNvbWIsc3YsbiByMCxyNCwuKiA8Y29tYl90ZXN0c18xPi4qCisuKmNvbWIsb2QsbiByMCxyNCwuKiA8Y29tYl90ZXN0c18xPi4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiY29tYl9udWxsaWZpZWRfdGVzdHNfMSIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb21iX251bGxpZmllZF90ZXN0c18xIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb21iX251bGxpZmllZF90ZXN0c18xIiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgIngvOGkgY29tYl9udWxsaWZpZWRfdGVzdHNfMlxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmNvbWJmLG4gcjAscjQsLiogPGNvbWJfdGVzdHNfMj4uKgorLipjb21iZiw9LG4gcjAscjQsLiogPGNvbWJfdGVzdHNfMj4uKgorLipjb21iZiw8LG4gcjAscjQsLiogPGNvbWJfdGVzdHNfMj4uKgorLipjb21iZiw8PSxuIHIwLHI0LC4qIDxjb21iX3Rlc3RzXzI+LioKKy4qY29tYmYsPDwsbiByMCxyNCwuKiA8Y29tYl90ZXN0c18yPi4qCisuKmNvbWJmLDw8PSxuIHIwLHI0LC4qIDxjb21iX3Rlc3RzXzI+LioKKy4qY29tYmYsc3YsbiByMCxyNCwuKiA8Y29tYl90ZXN0c18yPi4qCisuKmNvbWJmLG9kLG4gcjAscjQsLiogPGNvbWJfdGVzdHNfMj4uKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImNvbWJfbnVsbGlmaWVkX3Rlc3RzXzIiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29tYl9udWxsaWZpZWRfdGVzdHNfMiIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgY29tYl9udWxsaWZpZWRfdGVzdHNfMiIgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJ4LzhpIGNvbWliX3Rlc3RzXzFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipjb21pYiAwLHI0LC4qIDxjb21pYl90ZXN0c18xPi4qCisuKmNvbWliLD0gMCxyNCwuKiA8Y29taWJfdGVzdHNfMT4uKgorLipjb21pYiw8IDAscjQsLiogPGNvbWliX3Rlc3RzXzE+LioKKy4qY29taWIsPD0gMCxyNCwuKiA8Y29taWJfdGVzdHNfMT4uKgorLipjb21pYiw8PCAwLHI0LC4qIDxjb21pYl90ZXN0c18xPi4qCisuKmNvbWliLDw8PSAwLHI0LC4qIDxjb21pYl90ZXN0c18xPi4qCisuKmNvbWliLHN2IDAscjQsLiogPGNvbWliX3Rlc3RzXzE+LioKKy4qY29taWIsb2QgMCxyNCwuKiA8Y29taWJfdGVzdHNfMT4uKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImNvbWliX3Rlc3RzXzEiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29taWJfdGVzdHNfMSIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgY29taWJfdGVzdHNfMSIgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJ4LzhpIGNvbWliX3Rlc3RzXzJcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipjb21pYmYgMCxyNCwuKiA8Y29taWJfdGVzdHNfMj4uKgorLipjb21pYmYsPSAwLHI0LC4qIDxjb21pYl90ZXN0c18yPi4qCisuKmNvbWliZiw8IDAscjQsLiogPGNvbWliX3Rlc3RzXzI+LioKKy4qY29taWJmLDw9IDAscjQsLiogPGNvbWliX3Rlc3RzXzI+LioKKy4qY29taWJmLDw8IDAscjQsLiogPGNvbWliX3Rlc3RzXzI+LioKKy4qY29taWJmLDw8PSAwLHI0LC4qIDxjb21pYl90ZXN0c18yPi4qCisuKmNvbWliZixzdiAwLHI0LC4qIDxjb21pYl90ZXN0c18yPi4qCisuKmNvbWliZixvZCAwLHI0LC4qIDxjb21pYl90ZXN0c18yPi4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiY29taWJfdGVzdHNfMiIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb21pYl90ZXN0c18yIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb21pYl90ZXN0c18yIiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgIngvOGkgY29taWJfbnVsbGlmaWVkX3Rlc3RzXzFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipjb21pYixuIDAscjQsLiogPGNvbWliX3Rlc3RzXzE+LioKKy4qY29taWIsPSxuIDAscjQsLiogPGNvbWliX3Rlc3RzXzE+LioKKy4qY29taWIsPCxuIDAscjQsLiogPGNvbWliX3Rlc3RzXzE+LioKKy4qY29taWIsPD0sbiAwLHI0LC4qIDxjb21pYl90ZXN0c18xPi4qCisuKmNvbWliLDw8LG4gMCxyNCwuKiA8Y29taWJfdGVzdHNfMT4uKgorLipjb21pYiw8PD0sbiAwLHI0LC4qIDxjb21pYl90ZXN0c18xPi4qCisuKmNvbWliLHN2LG4gMCxyNCwuKiA8Y29taWJfdGVzdHNfMT4uKgorLipjb21pYixvZCxuIDAscjQsLiogPGNvbWliX3Rlc3RzXzE+LioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJjb21pYl9udWxsaWZpZWRfdGVzdHNfMSIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb21pYl9udWxsaWZpZWRfdGVzdHNfMSIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgY29taWJfbnVsbGlmaWVkX3Rlc3RzXzEiIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAieC84aSBjb21pYl9udWxsaWZpZWRfdGVzdHNfMlxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmNvbWliZixuIDAscjQsLiogPGNvbWliX3Rlc3RzXzI+LioKKy4qY29taWJmLD0sbiAwLHI0LC4qIDxjb21pYl90ZXN0c18yPi4qCisuKmNvbWliZiw8LG4gMCxyNCwuKiA8Y29taWJfdGVzdHNfMj4uKgorLipjb21pYmYsPD0sbiAwLHI0LC4qIDxjb21pYl90ZXN0c18yPi4qCisuKmNvbWliZiw8PCxuIDAscjQsLiogPGNvbWliX3Rlc3RzXzI+LioKKy4qY29taWJmLDw8PSxuIDAscjQsLiogPGNvbWliX3Rlc3RzXzI+LioKKy4qY29taWJmLHN2LG4gMCxyNCwuKiA8Y29taWJfdGVzdHNfMj4uKgorLipjb21pYmYsb2QsbiAwLHI0LC4qIDxjb21pYl90ZXN0c18yPi4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiY29taWJfbnVsbGlmaWVkX3Rlc3RzXzIiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29taWJfbnVsbGlmaWVkX3Rlc3RzXzIiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGNvbWliX251bGxpZmllZF90ZXN0c18yIiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgIngvOGkgYWRkYl90ZXN0c18xXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIKKy4qYWRkYiByMSxyNCwuKiA8YWRkYl90ZXN0c18xPi4qCisuKmFkZGIsPSByMSxyNCwuKiA8YWRkYl90ZXN0c18xPi4qCisuKmFkZGIsPCByMSxyNCwuKiA8YWRkYl90ZXN0c18xPi4qCisuKmFkZGIsPD0gcjEscjQsLiogPGFkZGJfdGVzdHNfMT4uKgorLiphZGRiLG51diByMSxyNCwuKiA8YWRkYl90ZXN0c18xPi4qCisuKmFkZGIsem52IHIxLHI0LC4qIDxhZGRiX3Rlc3RzXzE+LioKKy4qYWRkYixzdiByMSxyNCwuKiA8YWRkYl90ZXN0c18xPi4qCisuKmFkZGIsb2QgcjEscjQsLiogPGFkZGJfdGVzdHNfMT4uKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImFkZGJfdGVzdHNfMSIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJhZGRiX3Rlc3RzXzEiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGFkZGJfdGVzdHNfMSIgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJ4LzhpIGFkZGJfdGVzdHNfMlxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmFkZGJmIHIxLHI0LC4qIDxhZGRiX3Rlc3RzXzI+LioKKy4qYWRkYmYsPSByMSxyNCwuKiA8YWRkYl90ZXN0c18yPi4qCisuKmFkZGJmLDwgcjEscjQsLiogPGFkZGJfdGVzdHNfMj4uKgorLiphZGRiZiw8PSByMSxyNCwuKiA8YWRkYl90ZXN0c18yPi4qCisuKmFkZGJmLG51diByMSxyNCwuKiA8YWRkYl90ZXN0c18yPi4qCisuKmFkZGJmLHpudiByMSxyNCwuKiA8YWRkYl90ZXN0c18yPi4qCisuKmFkZGJmLHN2IHIxLHI0LC4qIDxhZGRiX3Rlc3RzXzI+LioKKy4qYWRkYmYsb2QgcjEscjQsLiogPGFkZGJfdGVzdHNfMj4uKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImFkZGJfdGVzdHNfMiIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJhZGRiX3Rlc3RzXzIiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGFkZGJfdGVzdHNfMiIgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJ4LzhpIGFkZGJfbnVsbGlmaWVkX3Rlc3RzXzFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiphZGRiLG4gcjEscjQsLiogPGFkZGJfdGVzdHNfMT4uKgorLiphZGRiLD0sbiByMSxyNCwuKiA8YWRkYl90ZXN0c18xPi4qCisuKmFkZGIsPCxuIHIxLHI0LC4qIDxhZGRiX3Rlc3RzXzE+LioKKy4qYWRkYiw8PSxuIHIxLHI0LC4qIDxhZGRiX3Rlc3RzXzE+LioKKy4qYWRkYixudXYsbiByMSxyNCwuKiA8YWRkYl90ZXN0c18xPi4qCisuKmFkZGIsem52LG4gcjEscjQsLiogPGFkZGJfdGVzdHNfMT4uKgorLiphZGRiLHN2LG4gcjEscjQsLiogPGFkZGJfdGVzdHNfMT4uKgorLiphZGRiLG9kLG4gcjEscjQsLiogPGFkZGJfdGVzdHNfMT4uKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImFkZGJfbnVsbGlmaWVkX3Rlc3RzXzEiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiYWRkYl9udWxsaWZpZWRfdGVzdHNfMSIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgYWRkYl9udWxsaWZpZWRfdGVzdHNfMSIgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJ4LzhpIGFkZGJfbnVsbGlmaWVkX3Rlc3RzXzJcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiphZGRiZixuIHIxLHI0LC4qIDxhZGRiX3Rlc3RzXzI+LioKKy4qYWRkYmYsPSxuIHIxLHI0LC4qIDxhZGRiX3Rlc3RzXzI+LioKKy4qYWRkYmYsPCxuIHIxLHI0LC4qIDxhZGRiX3Rlc3RzXzI+LioKKy4qYWRkYmYsPD0sbiByMSxyNCwuKiA8YWRkYl90ZXN0c18yPi4qCisuKmFkZGJmLG51dixuIHIxLHI0LC4qIDxhZGRiX3Rlc3RzXzI+LioKKy4qYWRkYmYsem52LG4gcjEscjQsLiogPGFkZGJfdGVzdHNfMj4uKgorLiphZGRiZixzdixuIHIxLHI0LC4qIDxhZGRiX3Rlc3RzXzI+LioKKy4qYWRkYmYsb2QsbiByMSxyNCwuKiA8YWRkYl90ZXN0c18yPi4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiYWRkYl9udWxsaWZpZWRfdGVzdHNfMiIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJhZGRiX251bGxpZmllZF90ZXN0c18yIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBhZGRiX251bGxpZmllZF90ZXN0c18yIiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgIngvOGkgYWRkaWJfdGVzdHNfMVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmFkZGliIC0xLHI0LC4qIDxhZGRpYl90ZXN0c18xPi4qCisuKmFkZGliLD0gLTEscjQsLiogPGFkZGliX3Rlc3RzXzE+LioKKy4qYWRkaWIsPCAtMSxyNCwuKiA8YWRkaWJfdGVzdHNfMT4uKgorLiphZGRpYiw8PSAtMSxyNCwuKiA8YWRkaWJfdGVzdHNfMT4uKgorLiphZGRpYixudXYgLTEscjQsLiogPGFkZGliX3Rlc3RzXzE+LioKKy4qYWRkaWIsem52IC0xLHI0LC4qIDxhZGRpYl90ZXN0c18xPi4qCisuKmFkZGliLHN2IC0xLHI0LC4qIDxhZGRpYl90ZXN0c18xPi4qCisuKmFkZGliLG9kIC0xLHI0LC4qIDxhZGRpYl90ZXN0c18xPi4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiYWRkaWJfdGVzdHNfMSIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJhZGRpYl90ZXN0c18xIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBhZGRpYl90ZXN0c18xIiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgIngvOGkgYWRkaWJfdGVzdHNfMlxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmFkZGliZiAtMSxyNCwuKiA8YWRkaWJfdGVzdHNfMj4uKgorLiphZGRpYmYsPSAtMSxyNCwuKiA8YWRkaWJfdGVzdHNfMj4uKgorLiphZGRpYmYsPCAtMSxyNCwuKiA8YWRkaWJfdGVzdHNfMj4uKgorLiphZGRpYmYsPD0gLTEscjQsLiogPGFkZGliX3Rlc3RzXzI+LioKKy4qYWRkaWJmLG51diAtMSxyNCwuKiA8YWRkaWJfdGVzdHNfMj4uKgorLiphZGRpYmYsem52IC0xLHI0LC4qIDxhZGRpYl90ZXN0c18yPi4qCisuKmFkZGliZixzdiAtMSxyNCwuKiA8YWRkaWJfdGVzdHNfMj4uKgorLiphZGRpYmYsb2QgLTEscjQsLiogPGFkZGliX3Rlc3RzXzI+LioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJhZGRpYl90ZXN0c18yIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImFkZGliX3Rlc3RzXzIiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGFkZGliX3Rlc3RzXzIiIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAieC84aSBhZGRpYl9udWxsaWZpZWRfdGVzdHNfMVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmFkZGliLG4gLTEscjQsLiogPGFkZGliX3Rlc3RzXzE+LioKKy4qYWRkaWIsPSxuIC0xLHI0LC4qIDxhZGRpYl90ZXN0c18xPi4qCisuKmFkZGliLDwsbiAtMSxyNCwuKiA8YWRkaWJfdGVzdHNfMT4uKgorLiphZGRpYiw8PSxuIC0xLHI0LC4qIDxhZGRpYl90ZXN0c18xPi4qCisuKmFkZGliLG51dixuIC0xLHI0LC4qIDxhZGRpYl90ZXN0c18xPi4qCisuKmFkZGliLHpudixuIC0xLHI0LC4qIDxhZGRpYl90ZXN0c18xPi4qCisuKmFkZGliLHN2LG4gLTEscjQsLiogPGFkZGliX3Rlc3RzXzE+LioKKy4qYWRkaWIsb2QsbiAtMSxyNCwuKiA8YWRkaWJfdGVzdHNfMT4uKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImFkZGJfbnVsbGlmaWVkX3Rlc3RzXzEiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiYWRkYl9udWxsaWZpZWRfdGVzdHNfMSIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgYWRkYl9udWxsaWZpZWRfdGVzdHNfMSIgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJ4LzhpIGFkZGliX251bGxpZmllZF90ZXN0c18yXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIKKy4qYWRkaWJmLG4gLTEscjQsLiogPGFkZGliX3Rlc3RzXzI+LioKKy4qYWRkaWJmLD0sbiAtMSxyNCwuKiA8YWRkaWJfdGVzdHNfMj4uKgorLiphZGRpYmYsPCxuIC0xLHI0LC4qIDxhZGRpYl90ZXN0c18yPi4qCisuKmFkZGliZiw8PSxuIC0xLHI0LC4qIDxhZGRpYl90ZXN0c18yPi4qCisuKmFkZGliZixudXYsbiAtMSxyNCwuKiA8YWRkaWJfdGVzdHNfMj4uKgorLiphZGRpYmYsem52LG4gLTEscjQsLiogPGFkZGliX3Rlc3RzXzI+LioKKy4qYWRkaWJmLHN2LG4gLTEscjQsLiogPGFkZGliX3Rlc3RzXzI+LioKKy4qYWRkaWJmLG9kLG4gLTEscjQsLiogPGFkZGliX3Rlc3RzXzI+LioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJhZGRiX251bGxpZmllZF90ZXN0c18yIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImFkZGJfbnVsbGlmaWVkX3Rlc3RzXzIiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGFkZGJfbnVsbGlmaWVkX3Rlc3RzXzIiIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAieC84aSBiYl90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmJ2Yiw8IHI0LC4qIDxiYl90ZXN0cz4uKgorLipidmIsPj0gcjQsLiogPGJiX3Rlc3RzPi4qCisuKmJ2Yiw8LG4gcjQsLiogPGJiX3Rlc3RzPi4qCisuKmJ2Yiw+PSxuIHI0LC4qIDxiYl90ZXN0cz4uKgorLipiYiw8IHI0LDUsLiogPGJiX3Rlc3RzPi4qCisuKmJiLD49IHI0LDUsLiogPGJiX3Rlc3RzPi4qCisuKmJiLDwsbiByNCw1LC4qIDxiYl90ZXN0cz4uKgorLipiYiw+PSxuIHI0LDUsLiogPGJiX3Rlc3RzPi4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiYmJfdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiYmJfdGVzdHMiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGJiX3Rlc3RzICIgfQorICAgIH0KK30KKworcHJvYyBhbGxfaW50ZWdlcl9jb21wdXRhdGlvbmFsX3Rlc3RzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNldCBhZGRfaW5zbnMgW2xpc3Qge2FkZH0ge2FkZGx9IHthZGRvfSB7YWRkY30ge2FkZGNvfSBcCisJCQl7c2gxYWRkfSB7c2gxYWRkbH0ge3NoMWFkZG99IFwKKwkJCXtzaDJhZGR9IHtzaDJhZGRsfSB7c2gyYWRkb30gXAorCQkJe3NoM2FkZH0ge3NoM2FkZGx9IHtzaDNhZGRvfSBdCisKKyAgICBmb3JlYWNoIGkgJGFkZF9pbnNucyB7CisJc2VuZF9nZGIgIngvMTZpICRpIjsgc2VuZF9nZGIgIl90ZXN0c1xuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIgorLiokaSByNCxyNSxyNi4qCisuKiRpLD0gcjQscjUscjYuKgorLiokaSw8IHI0LHI1LHI2LioKKy4qJGksPD0gcjQscjUscjYuKgorLiokaSxudXYgcjQscjUscjYuKgorLiokaSx6bnYgcjQscjUscjYuKgorLiokaSxzdiByNCxyNSxyNi4qCisuKiRpLG9kIHI0LHI1LHI2LioKKy4qJGksdHIgcjQscjUscjYuKgorLiokaSw8PiByNCxyNSxyNi4qCisuKiRpLD49IHI0LHI1LHI2LioKKy4qJGksPiByNCxyNSxyNi4qCisuKiRpLHV2IHI0LHI1LHI2LioKKy4qJGksdm56IHI0LHI1LHI2LioKKy4qJGksbnN2IHI0LHI1LHI2LioKKy4qJGksZXYgcjQscjUscjYuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgIiRpIHRlc3RzIiB9CisJICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICIkaSB0ZXN0cyIgfQorCSAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpICRpIHRlc3RzIiB9CisJfQorICAgIH0KKworICAgIHNldCBzdWJfaW5zbnMgW2xpc3Qge3N1Yn0ge3N1Ym99IHtzdWJifSB7c3ViYm99IHtzdWJ0fSB7c3VidG99IFwKKwkJCXtkc30ge2NvbWNscn0gXQorCisgICAgZm9yZWFjaCBpICRzdWJfaW5zbnMgeworCXNlbmRfZ2RiICJ4LzE2aSAkaSI7IHNlbmRfZ2RiICJfdGVzdHNcbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICIKKy4qJGkgcjQscjUscjYuKgorLiokaSw9IHI0LHI1LHI2LioKKy4qJGksPCByNCxyNSxyNi4qCisuKiRpLDw9IHI0LHI1LHI2LioKKy4qJGksPDwgcjQscjUscjYuKgorLiokaSw8PD0gcjQscjUscjYuKgorLiokaSxzdiByNCxyNSxyNi4qCisuKiRpLG9kIHI0LHI1LHI2LioKKy4qJGksdHIgcjQscjUscjYuKgorLiokaSw8PiByNCxyNSxyNi4qCisuKiRpLD49IHI0LHI1LHI2LioKKy4qJGksPiByNCxyNSxyNi4qCisuKiRpLD4+PSByNCxyNSxyNi4qCisuKiRpLD4+IHI0LHI1LHI2LioKKy4qJGksbnN2IHI0LHI1LHI2LioKKy4qJGksZXYgcjQscjUscjYuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgIiRpIHRlc3RzIiB9CisJICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICIkaSB0ZXN0cyIgfQorCSAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpICRpIHRlc3RzIiB9CisJfQorICAgIH0KKworICAgIHNldCBsb2dpY2FsX2luc25zIFtsaXN0IHtvcn0ge3hvcn0ge2FuZH0ge2FuZGNtfSBdCisKKyAgICBmb3JlYWNoIGkgJGxvZ2ljYWxfaW5zbnMgeworCXNlbmRfZ2RiICJ4LzEwaSAkaSI7IHNlbmRfZ2RiICJfdGVzdHNcbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICIKKy4qJGkgcjQscjUscjYuKgorLiokaSw9IHI0LHI1LHI2LioKKy4qJGksPCByNCxyNSxyNi4qCisuKiRpLDw9IHI0LHI1LHI2LioKKy4qJGksb2QgcjQscjUscjYuKgorLiokaSx0ciByNCxyNSxyNi4qCisuKiRpLDw+IHI0LHI1LHI2LioKKy4qJGksPj0gcjQscjUscjYuKgorLiokaSw+IHI0LHI1LHI2LioKKy4qJGksZXYgcjQscjUscjYuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgIiRpIHRlc3RzIiB9CisJICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICIkaSB0ZXN0cyIgfQorCSAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpICRpIHRlc3RzIiB9CisJfQorICAgIH0KKworICAgIHNldCB1bml0X2luc25zMSBbbGlzdCB7dXhvcn0ge3VhZGRjbX0ge3VhZGRjbXR9IF0KKworICAgIGZvcmVhY2ggaSAkdW5pdF9pbnNuczEgeworCXNlbmRfZ2RiICJ4LzEyaSAkaSI7IHNlbmRfZ2RiICJfdGVzdHNcbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICIKKy4qJGkgcjQscjUscjYuKgorLiokaSxzYnogcjQscjUscjYuKgorLiokaSxzaHogcjQscjUscjYuKgorLiokaSxzZGMgcjQscjUscjYuKgorLiokaSxzYmMgcjQscjUscjYuKgorLiokaSxzaGMgcjQscjUscjYuKgorLiokaSx0ciByNCxyNSxyNi4qCisuKiRpLG5ieiByNCxyNSxyNi4qCisuKiRpLG5oeiByNCxyNSxyNi4qCisuKiRpLG5kYyByNCxyNSxyNi4qCisuKiRpLG5iYyByNCxyNSxyNi4qCisuKiRpLG5oYyByNCxyNSxyNi4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiJGkgdGVzdHMiIH0KKwkgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgIiRpIHRlc3RzIiB9CisJICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgJGkgdGVzdHMiIH0KKwl9CisgICAgfQorCisgICAgc2V0IHVuaXRfaW5zbnMyIFtsaXN0IHtkY29yfSB7aWRjb3J9IF0KKworICAgIGZvcmVhY2ggaSAkdW5pdF9pbnNuczIgeworCXNlbmRfZ2RiICJ4LzEyaSAkaSI7IHNlbmRfZ2RiICJfdGVzdHNcbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICIKKy4qJGkgcjQscjUuKgorLiokaSxzYnogcjQscjUuKgorLiokaSxzaHogcjQscjUuKgorLiokaSxzZGMgcjQscjUuKgorLiokaSxzYmMgcjQscjUuKgorLiokaSxzaGMgcjQscjUuKgorLiokaSx0ciByNCxyNS4qCisuKiRpLG5ieiByNCxyNS4qCisuKiRpLG5oeiByNCxyNS4qCisuKiRpLG5kYyByNCxyNS4qCisuKiRpLG5iYyByNCxyNS4qCisuKiRpLG5oYyByNCxyNS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiJGkgdGVzdHMiIH0KKwkgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgIiRpIHRlc3RzIiB9CisJICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgJGkgdGVzdHMiIH0KKwl9CisgICAgfQorCisgICAgc2V0IGFkZGlfaW5zbnMgW2xpc3Qge2FkZGl9IHthZGRpb30ge2FkZGl0fSB7YWRkaXRvfSBdCisKKyAgICBmb3JlYWNoIGkgJGFkZGlfaW5zbnMgeworCXNlbmRfZ2RiICJ4LzE2aSAkaSI7IHNlbmRfZ2RiICJfdGVzdHNcbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICIKKy4qJGkgN2IscjUscjYuKgorLiokaSw9IDdiLHI1LHI2LioKKy4qJGksPCA3YixyNSxyNi4qCisuKiRpLDw9IDdiLHI1LHI2LioKKy4qJGksbnV2IDdiLHI1LHI2LioKKy4qJGksem52IDdiLHI1LHI2LioKKy4qJGksc3YgN2IscjUscjYuKgorLiokaSxvZCA3YixyNSxyNi4qCisuKiRpLHRyIDdiLHI1LHI2LioKKy4qJGksPD4gN2IscjUscjYuKgorLiokaSw+PSA3YixyNSxyNi4qCisuKiRpLD4gN2IscjUscjYuKgorLiokaSx1diA3YixyNSxyNi4qCisuKiRpLHZueiA3YixyNSxyNi4qCisuKiRpLG5zdiA3YixyNSxyNi4qCisuKiRpLGV2IDdiLHI1LHI2LioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICIkaSB0ZXN0cyIgfQorCSAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiJGkgdGVzdHMiIH0KKwkgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSAkaSB0ZXN0cyIgfQorCX0KKyAgICB9CisKKyAgICBzZXQgc3ViaV9pbnNucyBbbGlzdCB7c3ViaX0ge3N1YmlvfSB7Y29taWNscn0gXSAKKworICAgIGZvcmVhY2ggaSAkc3ViaV9pbnNucyB7CisJc2VuZF9nZGIgIngvMTZpICRpIjsgc2VuZF9nZGIgIl90ZXN0c1xuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIgorLiokaSA3YixyNSxyNi4qCisuKiRpLD0gN2IscjUscjYuKgorLiokaSw8IDdiLHI1LHI2LioKKy4qJGksPD0gN2IscjUscjYuKgorLiokaSw8PCA3YixyNSxyNi4qCisuKiRpLDw8PSA3YixyNSxyNi4qCisuKiRpLHN2IDdiLHI1LHI2LioKKy4qJGksb2QgN2IscjUscjYuKgorLiokaSx0ciA3YixyNSxyNi4qCisuKiRpLDw+IDdiLHI1LHI2LioKKy4qJGksPj0gN2IscjUscjYuKgorLiokaSw+IDdiLHI1LHI2LioKKy4qJGksPj49IDdiLHI1LHI2LioKKy4qJGksPj4gN2IscjUscjYuKgorLiokaSxuc3YgN2IscjUscjYuKgorLiokaSxldiA3YixyNSxyNi4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiJGkgdGVzdHMiIH0KKwkgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgIiRpIHRlc3RzIiB9CisJICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgJGkgdGVzdHMiIH0KKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgIngvOGkgdnNoZF90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKnZzaGQgcjQscjUscjYuKgorLip2c2hkLD0gcjQscjUscjYuKgorLip2c2hkLDwgcjQscjUscjYuKgorLip2c2hkLG9kIHI0LHI1LHI2LioKKy4qdnNoZCx0ciByNCxyNSxyNi4qCisuKnZzaGQsPD4gcjQscjUscjYuKgorLip2c2hkLD49IHI0LHI1LHI2LioKKy4qdnNoZCxldiByNCxyNSxyNi4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAidnNoZCB0ZXN0cyIgfQorCSAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAidnNoZCB0ZXN0cyIgfQorCSAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpICJ2c2hkIHRlc3RzIiB9CisJfQorCisgICAgc2VuZF9nZGIgIngvOGkgc2hkX3Rlc3RzXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIKKy4qc2hkIHI0LHI1LDUscjYuKgorLipzaGQsPSByNCxyNSw1LHI2LioKKy4qc2hkLDwgcjQscjUsNSxyNi4qCisuKnNoZCxvZCByNCxyNSw1LHI2LioKKy4qc2hkLHRyIHI0LHI1LDUscjYuKgorLipzaGQsPD4gcjQscjUsNSxyNi4qCisuKnNoZCw+PSByNCxyNSw1LHI2LioKKy4qc2hkLGV2IHI0LHI1LDUscjYuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInNoZCB0ZXN0cyIgfQorCSAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic2hkIHRlc3RzIiB9CisJICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgInNoZCB0ZXN0cyIgfQorCX0KKworICAgIHNldCBleHRyYWN0X2luc25zMSBbbGlzdCB7ZXh0cnV9IHtleHRyc30ge3pkZXB9IHtkZXB9IF0gCisKKyAgICBmb3JlYWNoIGkgJGV4dHJhY3RfaW5zbnMxIHsKKwlzZW5kX2dkYiAieC84aSAkaSI7IHNlbmRfZ2RiICJfdGVzdHNcbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICIKKy4qJGkgcjQsNSwxMCxyNi4qCisuKiRpLD0gcjQsNSwxMCxyNi4qCisuKiRpLDwgcjQsNSwxMCxyNi4qCisuKiRpLG9kIHI0LDUsMTAscjYuKgorLiokaSx0ciByNCw1LDEwLHI2LioKKy4qJGksPD4gcjQsNSwxMCxyNi4qCisuKiRpLD49IHI0LDUsMTAscjYuKgorLiokaSxldiByNCw1LDEwLHI2LioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICIkaSB0ZXN0cyIgfQorCSAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiJGkgdGVzdHMiIH0KKwkgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSAkaSB0ZXN0cyIgfQorCX0KKyAgICB9CisKKyAgICBzZXQgZXh0cmFjdF9pbnNuczIgW2xpc3Qge3ZleHRydX0ge3ZleHRyc30ge3p2ZGVwfSB7dmRlcH0gXSAKKworICAgIGZvcmVhY2ggaSAkZXh0cmFjdF9pbnNuczIgeworCXNlbmRfZ2RiICJ4LzhpICRpIjsgc2VuZF9nZGIgIl90ZXN0c1xuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIgorLiokaSByNCw1LHI2LioKKy4qJGksPSByNCw1LHI2LioKKy4qJGksPCByNCw1LHI2LioKKy4qJGksb2QgcjQsNSxyNi4qCisuKiRpLHRyIHI0LDUscjYuKgorLiokaSw8PiByNCw1LHI2LioKKy4qJGksPj0gcjQsNSxyNi4qCisuKiRpLGV2IHI0LDUscjYuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgIiRpIHRlc3RzIiB9CisJICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICIkaSB0ZXN0cyIgfQorCSAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpICRpIHRlc3RzIiB9CisJfQorICAgIH0KKworICAgIHNldCBleHRyYWN0X2luc25zMyBbbGlzdCB7dmRlcGl9IHt6dmRlcGl9IF0gCisKKyAgICBmb3JlYWNoIGkgJGV4dHJhY3RfaW5zbnMzIHsKKwlzZW5kX2dkYiAieC84aSAkaSI7IHNlbmRfZ2RiICJfdGVzdHNcbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICIKKy4qJGkgLTEsNSxyNi4qCisuKiRpLD0gLTEsNSxyNi4qCisuKiRpLDwgLTEsNSxyNi4qCisuKiRpLG9kIC0xLDUscjYuKgorLiokaSx0ciAtMSw1LHI2LioKKy4qJGksPD4gLTEsNSxyNi4qCisuKiRpLD49IC0xLDUscjYuKgorLiokaSxldiAtMSw1LHI2LioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICIkaSB0ZXN0cyIgfQorCSAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiJGkgdGVzdHMiIH0KKwkgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSAkaSB0ZXN0cyIgfQorCX0KKyAgICB9CisKKyAgICBzZXQgZXh0cmFjdF9pbnNuczQgW2xpc3Qge2RlcGl9IHt6ZGVwaX0gXSAKKworICAgIGZvcmVhY2ggaSAkZXh0cmFjdF9pbnNuczQgeworCXNlbmRfZ2RiICJ4LzhpICRpIjsgc2VuZF9nZGIgIl90ZXN0c1xuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIgorLiokaSAtMSw0LDEwLHI2LioKKy4qJGksPSAtMSw0LDEwLHI2LioKKy4qJGksPCAtMSw0LDEwLHI2LioKKy4qJGksb2QgLTEsNCwxMCxyNi4qCisuKiRpLHRyIC0xLDQsMTAscjYuKgorLiokaSw8PiAtMSw0LDEwLHI2LioKKy4qJGksPj0gLTEsNCwxMCxyNi4qCisuKiRpLGV2IC0xLDQsMTAscjYuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgIiRpIHRlc3RzIiB9CisJICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICIkaSB0ZXN0cyIgfQorCSAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpICRpIHRlc3RzIiB9CisJfQorICAgIH0KK30KKworcHJvYyBhbGxfc3lzdGVtX2NvbnRyb2xfdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvMTRpIHN5c3RlbV9jb250cm9sX3Rlc3RzXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIKKy4qYnJlYWsgNSxjLioKKy4qcmZpLioKKy4qcmZpci4qCisuKnNzbSA1LHI0LioKKy4qcnNtIDUscjQuKgorLiptdHNtIHI0LioKKy4qbGRzaWQgXFwoc3IwLHI1XFwpLHI0LioKKy4qbXRzcCByNCxzcjAuKgorLiptdGN0bCByNCxjY3IuKgorLiptZnNwIHNyMCxyNC4qCisuKm1mY3RsIGNjcixyNC4qCisuKnN5bmMuKgorLipzeW5jZG1hLioKKy4qZGlhZyA0ZDIuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInN5c3RlbV9jb25zdHJvbF90ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJzeXN0ZW1fY29udHJvbF90ZXN0cyIgfQorCXRpbWVvdXQgeyBmaWxlICIodGltZW91dCkgc3lzdGVtX2NvbnRyb2xfdGVzdHMiIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAieC80aSBwcm9iZV90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKnByb2JlciBcXChzcjAscjVcXCkscjYscjcuKgorLipwcm9iZXJpIFxcKHNyMCxyNVxcKSwxLHI3LioKKy4qcHJvYmV3IFxcKHNyMCxyNVxcKSxyNixyNy4qCisuKnByb2Jld2kgXFwoc3IwLHI1XFwpLDEscjcuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByb2JlX3Rlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByb2JlX3Rlc3RzIiB9CisJdGltZW91dCB7IGZpbGUgIih0aW1lb3V0KSBwcm9iZV90ZXN0cyIgfQorICAgIH0KKworICAgICMgbGNpIHVzZXMgdGhlIHNhbWUgYml0IHBhdHRlcm4gYXMgbGhhLCBzbyBhY2NlcHQgbGhhLgorICAgIHNlbmRfZ2RiICJ4LzVpIGxwYV90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmxwYSByNFxcKHNyMCxyNVxcKSxyNi4qCisuKmxwYSxtIHI0XFwoc3IwLHI1XFwpLHI2LioKKy4qbGhhIHI0XFwoc3IwLHI1XFwpLHI2LioKKy4qbGhhLG0gcjRcXChzcjAscjVcXCkscjYuKgorLipsaGEgcjRcXChzcjAscjVcXCkscjYuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImxwYV90ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJscGFfdGVzdHMiIH0KKwl0aW1lb3V0IHsgZmlsZSAiKHRpbWVvdXQpIGxwYV90ZXN0cyIgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJ4LzE4aSBwdXJnZV90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKnBkdGxiIHI0XFwoc3IwLHI1XFwpLioKKy4qcGR0bGIsbSByNFxcKHNyMCxyNVxcKS4qCisuKnBpdGxiIHI0XFwoc3IwLHI1XFwpLioKKy4qcGl0bGIsbSByNFxcKHNyMCxyNVxcKS4qCisuKnBkdGxiZSByNFxcKHNyMCxyNVxcKS4qCisuKnBkdGxiZSxtIHI0XFwoc3IwLHI1XFwpLioKKy4qcGl0bGJlIHI0XFwoc3IwLHI1XFwpLioKKy4qcGl0bGJlLG0gcjRcXChzcjAscjVcXCkuKgorLipwZGMgcjRcXChzcjAscjVcXCkuKgorLipwZGMsbSByNFxcKHNyMCxyNVxcKS4qCisuKmZkYyByNFxcKHNyMCxyNVxcKS4qCisuKmZkYyxtIHI0XFwoc3IwLHI1XFwpLioKKy4qZmljIHI0XFwoc3IwLHI1XFwpLioKKy4qZmljLG0gcjRcXChzcjAscjVcXCkuKgorLipmZGNlIHI0XFwoc3IwLHI1XFwpLioKKy4qZmRjZSxtIHI0XFwoc3IwLHI1XFwpLioKKy4qZmljZSByNFxcKHNyMCxyNVxcKS4qCisuKmZpY2UsbSByNFxcKHNyMCxyNVxcKS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHVyZ2VfdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHVyZ2VfdGVzdHMiIH0KKwl0aW1lb3V0IHsgZmlsZSAiKHRpbWVvdXQpIHB1cmdlX3Rlc3RzIiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgIngvNGkgaW5zZXJ0X3Rlc3RzXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIKKy4qaWR0bGJhIHI0LFxcKHNyMCxyNVxcKS4qCisuKmlpdGxiYSByNCxcXChzcjAscjVcXCkuKgorLippZHRsYnAgcjQsXFwoc3IwLHI1XFwpLioKKy4qaWl0bGJwIHI0LFxcKHNyMCxyNVxcKS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiaW5zZXJ0X3Rlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImluc2VydF90ZXN0cyIgfQorCXRpbWVvdXQgeyBmaWxlICIodGltZW91dCkgaW5zZXJ0X3Rlc3RzIiB9CisgICAgfQorCit9CisKK3Byb2MgYWxsX2ZwdV9tZW1vcnlfdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvMjBpIGZwdV9tZW1vcnlfaW5kZXhpbmdfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipmbGR3eCByNFxcKHNyMCxyNVxcKSxmcjYuKgorLipmbGR3eCxzIHI0XFwoc3IwLHI1XFwpLGZyNi4qCisuKmZsZHd4LG0gcjRcXChzcjAscjVcXCksZnI2LioKKy4qZmxkd3gsc20gcjRcXChzcjAscjVcXCksZnI2LioKKy4qZmxkZHggcjRcXChzcjAscjVcXCksZnI2LioKKy4qZmxkZHgscyByNFxcKHNyMCxyNVxcKSxmcjYuKgorLipmbGRkeCxtIHI0XFwoc3IwLHI1XFwpLGZyNi4qCisuKmZsZGR4LHNtIHI0XFwoc3IwLHI1XFwpLGZyNi4qCisuKmZzdHd4IGZyNixyNFxcKHNyMCxyNVxcKS4qCisuKmZzdHd4LHMgZnI2LHI0XFwoc3IwLHI1XFwpLioKKy4qZnN0d3gsbSBmcjYscjRcXChzcjAscjVcXCkuKgorLipmc3R3eCxzbSBmcjYscjRcXChzcjAscjVcXCkuKgorLipmc3RkeCBmcjYscjRcXChzcjAscjVcXCkuKgorLipmc3RkeCxzIGZyNixyNFxcKHNyMCxyNVxcKS4qCisuKmZzdGR4LG0gZnI2LHI0XFwoc3IwLHI1XFwpLioKKy4qZnN0ZHgsc20gZnI2LHI0XFwoc3IwLHI1XFwpLioKKy4qZnN0cXggZnI2LHI0XFwoc3IwLHI1XFwpLioKKy4qZnN0cXgscyBmcjYscjRcXChzcjAscjVcXCkuKgorLipmc3RxeCxtIGZyNixyNFxcKHNyMCxyNVxcKS4qCisuKmZzdHF4LHNtIGZyNixyNFxcKHNyMCxyNVxcKS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiZnB1X21lbW9yeV9pbmRleGluZ190ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJmcHVfbWVtb3J5X2luZGV4aW5nX3Rlc3RzIiB9CisJdGltZW91dCB7IGZpbGUgIih0aW1lb3V0KSBmcHVfbWVtb3J5X2luZGV4aW5nX3Rlc3RzIiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgIngvMTVpIGZwdV9zaG9ydF9tZW1vcnlfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipmbGR3cyAwXFwoc3IwLHI1XFwpLGZyNi4qCisuKmZsZHdzLG1iIDBcXChzcjAscjVcXCksZnI2LioKKy4qZmxkd3MsbWEgMFxcKHNyMCxyNVxcKSxmcjYuKgorLipmbGRkcyAwXFwoc3IwLHI1XFwpLGZyNi4qCisuKmZsZGRzLG1iIDBcXChzcjAscjVcXCksZnI2LioKKy4qZmxkZHMsbWEgMFxcKHNyMCxyNVxcKSxmcjYuKgorLipmc3R3cyBmcjYsMFxcKHNyMCxyNVxcKS4qCisuKmZzdHdzLG1iIGZyNiwwXFwoc3IwLHI1XFwpLioKKy4qZnN0d3MsbWEgZnI2LDBcXChzcjAscjVcXCkuKgorLipmc3RkcyBmcjYsMFxcKHNyMCxyNVxcKS4qCisuKmZzdGRzLG1iIGZyNiwwXFwoc3IwLHI1XFwpLioKKy4qZnN0ZHMsbWEgZnI2LDBcXChzcjAscjVcXCkuKgorLipmc3RxcyBmcjYsMFxcKHNyMCxyNVxcKS4qCisuKmZzdHFzLG1iIGZyNiwwXFwoc3IwLHI1XFwpLioKKy4qZnN0cXMsbWEgZnI2LDBcXChzcjAscjVcXCkuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImZwdV9zaG9ydF9tZW1vcnlfdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiZnB1X3Nob3J0X21lbW9yeV90ZXN0cyIgfQorCXRpbWVvdXQgeyBmaWxlICIodGltZW91dCkgZnB1X3Nob3J0X21lbW9yeV90ZXN0cyIgfQorICAgIH0KKworfQorCitwcm9jIGFsbF9mcHVfY29tcHV0YXRpb25hbF90ZXN0cyB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICBzZW5kX2dkYiAieC8xaSBmcHVfbWlzY190ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmZ0ZXN0LioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJmcHVfbWlzY190ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJmcHVfbWlzY190ZXN0cyIgfQorCXRpbWVvdXQgeyBmaWxlICIodGltZW91dCkgZnB1X21pc2NfdGVzdHMiIH0KKyAgICB9CisKKyAgICBzZXQgZnB1X3R3b19vcF9pbnNucyBbbGlzdCB7ZmNweX0ge2ZhYnN9IHtmc3FydH0ge2ZybmR9IF0KKworICAgIGZvcmVhY2ggaSAkZnB1X3R3b19vcF9pbnNucyB7CisJc2VuZF9nZGIgIngvNWkgJGkiOyBzZW5kX2dkYiAiX3Rlc3RzXG4iCisJZ2RiX2V4cGVjdCB7CisJICAgIC1yZSAiCisuKiRpLHNnbCBmcjUsZnIxMC4qCisuKiRpLGRibCBmcjUsZnIxMC4qCisuKiRpLHF1YWQgZnI1LGZyMTAuKgorLiokaSxzZ2wgZnIyMCxmcjI0LioKKy4qJGksZGJsIGZyMjAsZnIyNC4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiJGkgdGVzdHMiIH0KKwkgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgIiRpIHRlc3RzIiB9CisJICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgJGkgdGVzdHMiIH0KKwl9CisgICAgfQorCisgICAgc2V0IGZwdV9jb252ZXJzaW9ucyBbbGlzdCB7ZmNudmZmfSB7ZmNudnhmfSB7ZmNudmZ4fSB7ZmNudmZ4dH0gXQorCisgICAgZm9yZWFjaCBpICRmcHVfY29udmVyc2lvbnMgeworCXNlbmRfZ2RiICJ4LzE4aSAkaSI7IHNlbmRfZ2RiICJfdGVzdHNcbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICIKKy4qJGksc2dsLHNnbCBmcjUsZnIxMC4qCisuKiRpLHNnbCxkYmwgZnI1LGZyMTAuKgorLiokaSxzZ2wscXVhZCBmcjUsZnIxMC4qCisuKiRpLGRibCxzZ2wgZnI1LGZyMTAuKgorLiokaSxkYmwsZGJsIGZyNSxmcjEwLioKKy4qJGksZGJsLHF1YWQgZnI1LGZyMTAuKgorLiokaSxxdWFkLHNnbCBmcjUsZnIxMC4qCisuKiRpLHF1YWQsZGJsIGZyNSxmcjEwLioKKy4qJGkscXVhZCxxdWFkIGZyNSxmcjEwLioKKy4qJGksc2dsLHNnbCBmcjIwLGZyMjQuKgorLiokaSxzZ2wsZGJsIGZyMjAsZnIyNC4qCisuKiRpLHNnbCxxdWFkIGZyMjAsZnIyNC4qCisuKiRpLGRibCxzZ2wgZnIyMCxmcjI0LioKKy4qJGksZGJsLGRibCBmcjIwLGZyMjQuKgorLiokaSxkYmwscXVhZCBmcjIwLGZyMjQuKgorLiokaSxxdWFkLHNnbCBmcjIwLGZyMjQuKgorLiokaSxxdWFkLGRibCBmcjIwLGZyMjQuKgorLiokaSxxdWFkLHF1YWQgZnIyMCxmcjI0LioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICIkaSB0ZXN0cyIgfQorCSAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiJGkgdGVzdHMiIH0KKwkgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSAkaSB0ZXN0cyIgfQorCX0KKyAgICB9CisKKyAgICBzZXQgZnB1X3RocmVlX29wX2luc25zIFtsaXN0IHtmYWRkfSB7ZnN1Yn0ge2ZtcHl9IHtmZGl2fSB7ZnJlbX0gXQorCisgICAgZm9yZWFjaCBpICRmcHVfdGhyZWVfb3BfaW5zbnMgeworCXNlbmRfZ2RiICJ4LzZpICRpIjsgc2VuZF9nZGIgIl90ZXN0c1xuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIgorLiokaSxzZ2wgZnI0LGZyOCxmcjEyLioKKy4qJGksZGJsIGZyNCxmcjgsZnIxMi4qCisuKiRpLHF1YWQgZnI0LGZyOCxmcjEyLioKKy4qJGksc2dsIGZyMjAsZnIyNCxmcjI4LioKKy4qJGksZGJsIGZyMjAsZnIyNCxmcjI4LioKKy4qJGkscXVhZCBmcjIwLGZyMjQsZnIyOC4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiJGkgdGVzdHMiIH0KKwkgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgIiRpIHRlc3RzIiB9CisJICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgJGkgdGVzdHMiIH0KKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgIngvNGkgZm1weV9hZGRzdWJfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipmbXB5YWRkLHNnbCBmcjE2LGZyMTcsZnIxOCxmcjE5LGZyMjAuKgorLipmbXB5YWRkLGRibCBmcjE2LGZyMTcsZnIxOCxmcjE5LGZyMjAuKgorLipmbXB5c3ViLHNnbCBmcjE2LGZyMTcsZnIxOCxmcjE5LGZyMjAuKgorLipmbXB5c3ViLGRibCBmcjE2LGZyMTcsZnIxOCxmcjE5LGZyMjAuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImZtcHlfYWRkc3ViX3Rlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImZtcHlfYWRkc3ViX3Rlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBmbXB5X2FkZHN1Yl90ZXN0cyIgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJ4L2kgeG1weXVfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLip4bXB5dSBmcjQsZnI1LGZyNi4qCisuKiRnZGJfcHJvbXB0ICQiIHtwYXNzICJ4bXB5dV90ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgInhtcHl1X3Rlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSB4bXB5dV90ZXN0cyIgfQorICAgIH0KKworfQorCitwcm9jIGFsbF9mcHVfY29tcGFyaXNvbl90ZXN0cyB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICBzZXQgZnB1X2NvbXBhcmlzb25fZm9ybWF0cyBbbGlzdCB7c2dsfSB7ZGJsfSB7cXVhZH0gXQorCisgICAgZm9yZWFjaCBpICRmcHVfY29tcGFyaXNvbl9mb3JtYXRzIHsKKwlzZW5kX2dkYiAieC84aSBmY21wXyRpIjsgc2VuZF9nZGIgIl90ZXN0c18xXG4iCisJZ2RiX2V4cGVjdCB7CisJICAgIC1yZSAiCisuKmZjbXAsJGksZmFsc2VcXD8gZnI0LGZyNS4qCisuKmZjbXAsJGksZmFsc2UgZnI0LGZyNS4qCisuKmZjbXAsJGksXFw/IGZyNCxmcjUuKgorLipmY21wLCRpLCE8PT4gZnI0LGZyNS4qCisuKmZjbXAsJGksPSBmcjQsZnI1LioKKy4qZmNtcCwkaSw9dCBmcjQsZnI1LioKKy4qZmNtcCwkaSxcXD89IGZyNCxmcjUuKgorLipmY21wLCRpLCE8PiBmcjQsZnI1LioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICIkaSB0ZXN0cyAocGFydDEpICIgfQorCSAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiZmNtcF8kaSB0ZXN0cyAocGFydDEpICIgfQorCSAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGZjbXBfJGkgdGVzdHMgKHBhcnQxKSAiIH0KKwl9CisKKwlzZW5kX2dkYiAieC84aSBmY21wXyRpIjsgc2VuZF9nZGIgIl90ZXN0c18yXG4iCisJZ2RiX2V4cGVjdCB7CisJICAgIC1yZSAiCisuKmZjbXAsJGksIVxcPz49IGZyNCxmcjUuKgorLipmY21wLCRpLDwgZnI0LGZyNS4qCisuKmZjbXAsJGksXFw/PCBmcjQsZnI1LioKKy4qZmNtcCwkaSwhPj0gZnI0LGZyNS4qCisuKmZjbXAsJGksIVxcPz4gZnI0LGZyNS4qCisuKmZjbXAsJGksPD0gZnI0LGZyNS4qCisuKmZjbXAsJGksXFw/PD0gZnI0LGZyNS4qCisuKmZjbXAsJGksIT4gZnI0LGZyNS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiJGkgdGVzdHMgKHBhcnQyKSAiIH0KKwkgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImZjbXBfJGkgdGVzdHMgKHBhcnQyKSAiIH0KKwkgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBmY21wXyRpIHRlc3RzIChwYXJ0MikgIiB9CisJfQorCisJc2VuZF9nZGIgIngvOGkgZmNtcF8kaSI7IHNlbmRfZ2RiICJfdGVzdHNfM1xuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIgorLipmY21wLCRpLCFcXD88PSBmcjQsZnI1LioKKy4qZmNtcCwkaSw+IGZyNCxmcjUuKgorLipmY21wLCRpLFxcPz4gZnI0LGZyNS4qCisuKmZjbXAsJGksITw9IGZyNCxmcjUuKgorLipmY21wLCRpLCFcXD88IGZyNCxmcjUuKgorLipmY21wLCRpLD49IGZyNCxmcjUuKgorLipmY21wLCRpLFxcPz49IGZyNCxmcjUuKgorLipmY21wLCRpLCE8IGZyNCxmcjUuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgIiRpIHRlc3RzIChwYXJ0MykgIiB9CisJICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJmY21wXyRpIHRlc3RzIChwYXJ0MykgIiB9CisJICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgZmNtcF8kaSB0ZXN0cyAocGFydDMpICIgfQorCX0KKworCXNlbmRfZ2RiICJ4LzhpIGZjbXBfJGkiOyBzZW5kX2dkYiAiX3Rlc3RzXzRcbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICIKKy4qZmNtcCwkaSwhXFw/PSBmcjQsZnI1LioKKy4qZmNtcCwkaSw8PiBmcjQsZnI1LioKKy4qZmNtcCwkaSwhPSBmcjQsZnI1LioKKy4qZmNtcCwkaSwhPXQgZnI0LGZyNS4qCisuKmZjbXAsJGksIVxcPyBmcjQsZnI1LioKKy4qZmNtcCwkaSw8PT4gZnI0LGZyNS4qCisuKmZjbXAsJGksdHJ1ZVxcPyBmcjQsZnI1LioKKy4qZmNtcCwkaSx0cnVlIGZyNCxmcjUuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgIiRpIHRlc3RzIChwYXJ0NCkgIiB9CisJICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJmY21wXyRpIHRlc3RzIChwYXJ0NCkgIiB9CisJICAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgZmNtcF8kaSB0ZXN0cyAocGFydDQpICIgfQorCX0KKyAgICB9Cit9CisKK3Byb2MgYWxsX3NwZWNpYWxfdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvNGkgc3BlY2lhbF90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmdmdyByNFxcKHNyMCxyNVxcKS4qCisuKmdmdyxtIHI0XFwoc3IwLHI1XFwpLioKKy4qZ2ZyIHI0XFwoc3IwLHI1XFwpLioKKy4qZ2ZyLG0gcjRcXChzcjAscjVcXCkuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInNwZWNpYWwgdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic3BlY2lhbCB0ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgc3BlY2lhbCB0ZXN0cyAiIH0KKyAgICB9CisKK30KKworcHJvYyBhbGxfc2Z1X3Rlc3RzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzE2aSBzZnVfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipzcG9wMCw0LDUuKgorLipzcG9wMCw0LDczLioKKy4qc3BvcDAsNCw1LG4uKgorLipzcG9wMCw0LDczLG4uKgorLipzcG9wMSw0LDUgcjUuKgorLipzcG9wMSw0LDczIHI1LioKKy4qc3BvcDEsNCw1LG4gcjUuKgorLipzcG9wMSw0LDczLG4gcjUuKgorLipzcG9wMiw0LDUgcjUuKgorLipzcG9wMiw0LDczIHI1LioKKy4qc3BvcDIsNCw1LG4gcjUuKgorLipzcG9wMiw0LDczLG4gcjUuKgorLipzcG9wMyw0LDUgcjUscjYuKgorLipzcG9wMyw0LDczIHI1LHI2LioKKy4qc3BvcDMsNCw1LG4gcjUscjYuKgorLipzcG9wMyw0LDczLG4gcjUscjYuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInNmdSB0ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJzZnUgdGVzdHMiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHNmdSB0ZXN0cyAiIH0KKyAgICB9Cit9CisKK3Byb2MgYWxsX2NvcHJfdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvNGkgY29wcl90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmNvcHIsNCw1LioKKy4qY29wciw0LDczLioKKy4qY29wciw0LDUsbi4qCisuKmNvcHIsNCw3MyxuLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJjb3ByIHRlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvcHIgdGVzdHMiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGNvcHIgdGVzdHMgIiB9CisgICAgfQorfQorCitwcm9jIGFsbF9jb3ByX21lbV90ZXN0cyB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICBzZW5kX2dkYiAieC84aSBjb3ByX2luZGV4aW5nX2xvYWRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipjbGR3eCw0IHI1XFwoc3IwLHI0XFwpLHIyNi4qCisuKmNsZHd4LDQscyByNVxcKHNyMCxyNFxcKSxyMjYuKgorLipjbGR3eCw0LG0gcjVcXChzcjAscjRcXCkscjI2LioKKy4qY2xkd3gsNCxzbSByNVxcKHNyMCxyNFxcKSxyMjYuKgorLipjbGRkeCw0IHI1XFwoc3IwLHI0XFwpLHIyNi4qCisuKmNsZGR4LDQscyByNVxcKHNyMCxyNFxcKSxyMjYuKgorLipjbGRkeCw0LG0gcjVcXChzcjAscjRcXCkscjI2LioKKy4qY2xkZHgsNCxzbSByNVxcKHNyMCxyNFxcKSxyMjYuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImNvcHIgaW5kZXhlZCBsb2FkIHRlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvcHIgaW5kZXhlZCBsb2FkIHRlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb3ByIGluZGV4ZWQgbG9hZCB0ZXN0cyAiIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAieC84aSBjb3ByX2luZGV4aW5nX3N0b3JlXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIKKy4qY3N0d3gsNCByMjYscjVcXChzcjAscjRcXCkuKgorLipjc3R3eCw0LHMgcjI2LHI1XFwoc3IwLHI0XFwpLioKKy4qY3N0d3gsNCxtIHIyNixyNVxcKHNyMCxyNFxcKS4qCisuKmNzdHd4LDQsc20gcjI2LHI1XFwoc3IwLHI0XFwpLioKKy4qY3N0ZHgsNCByMjYscjVcXChzcjAscjRcXCkuKgorLipjc3RkeCw0LHMgcjI2LHI1XFwoc3IwLHI0XFwpLioKKy4qY3N0ZHgsNCxtIHIyNixyNVxcKHNyMCxyNFxcKS4qCisuKmNzdGR4LDQsc20gcjI2LHI1XFwoc3IwLHI0XFwpLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJjb3ByIGluZGV4ZWQgc3RvcmUgdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29wciBpbmRleGVkIHN0b3JlIHRlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb3ByIGluZGV4ZWQgbG9hZCB0ZXN0cyAiIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAieC8xMmkgY29wcl9zaG9ydF9tZW1vcnlcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipjbGR3cyw0IDBcXChzcjAscjRcXCkscjI2LioKKy4qY2xkd3MsNCxtYiAwXFwoc3IwLHI0XFwpLHIyNi4qCisuKmNsZHdzLDQsbWEgMFxcKHNyMCxyNFxcKSxyMjYuKgorLipjbGRkcyw0IDBcXChzcjAscjRcXCkscjI2LioKKy4qY2xkZHMsNCxtYiAwXFwoc3IwLHI0XFwpLHIyNi4qCisuKmNsZGRzLDQsbWEgMFxcKHNyMCxyNFxcKSxyMjYuKgorLipjc3R3cyw0IHIyNiwwXFwoc3IwLHI0XFwpLioKKy4qY3N0d3MsNCxtYiByMjYsMFxcKHNyMCxyNFxcKS4qCisuKmNzdHdzLDQsbWEgcjI2LDBcXChzcjAscjRcXCkuKgorLipjc3Rkcyw0IHIyNiwwXFwoc3IwLHI0XFwpLioKKy4qY3N0ZHMsNCxtYiByMjYsMFxcKHNyMCxyNFxcKS4qCisuKmNzdGRzLDQsbWEgcjI2LDBcXChzcjAscjRcXCkuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImNvcHIgc2hvcnQgbWVtb3J5IHRlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvcHIgc2hvcnQgbWVtb3J5IHRlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb3ByIHNob3J0IG1lbW9yeSB0ZXN0cyAiIH0KKyAgICB9Cit9CisKK3Byb2MgZm1lbUxSYnVnX3Rlc3RzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzEyaSBmbWVtTFJidWdfdGVzdHNfMVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmZzdHdzIGZyNlIsMFxcKHNyMCxyMjZcXCkuKgorLipmc3R3cyBmcjYsNFxcKHNyMCxyMjZcXCkuKgorLipmc3R3cyBmcjYsOFxcKHNyMCxyMjZcXCkuKgorLipmc3RkcyBmcjYsMFxcKHNyMCxyMjZcXCkuKgorLipmc3RkcyBmcjYsNFxcKHNyMCxyMjZcXCkuKgorLipmc3RkcyBmcjYsOFxcKHNyMCxyMjZcXCkuKgorLipmbGR3cyAwXFwoc3IwLHIyNlxcKSxmcjZSLioKKy4qZmxkd3MgNFxcKHNyMCxyMjZcXCksZnI2LioKKy4qZmxkd3MgOFxcKHNyMCxyMjZcXCksZnI2LioKKy4qZmxkZHMgMFxcKHNyMCxyMjZcXCksZnI2LioKKy4qZmxkZHMgNFxcKHNyMCxyMjZcXCksZnI2LioKKy4qZmxkZHMgOFxcKHNyMCxyMjZcXCksZnI2LioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJmbWVtIExSIHJlZ2lzdGVyIHNlbGVjdG9yIHRlc3RzIChwYXJ0MSkiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiZm1lbSBMUiByZWdpc3RlciBzZWxlY3RvciB0ZXN0cyAocGFydDEpIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBmbWVtIExSIHJlZ2lzdGVyIHNlbGVjdG9yIHRlc3RzICAocGFydDEpIiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgIngvMTJpIGZtZW1MUmJ1Z190ZXN0c18yXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIKKy4qZnN0d3MgZnI2UiwwXFwoc3IwLHIyNlxcKS4qCisuKmZzdHdzIGZyNiw0XFwoc3IwLHIyNlxcKS4qCisuKmZzdHdzIGZyNiw4XFwoc3IwLHIyNlxcKS4qCisuKmZzdGRzIGZyNiwwXFwoc3IwLHIyNlxcKS4qCisuKmZzdGRzIGZyNiw0XFwoc3IwLHIyNlxcKS4qCisuKmZzdGRzIGZyNiw4XFwoc3IwLHIyNlxcKS4qCisuKmZsZHdzIDBcXChzcjAscjI2XFwpLGZyNlIuKgorLipmbGR3cyA0XFwoc3IwLHIyNlxcKSxmcjYuKgorLipmbGR3cyA4XFwoc3IwLHIyNlxcKSxmcjYuKgorLipmbGRkcyAwXFwoc3IwLHIyNlxcKSxmcjYuKgorLipmbGRkcyA0XFwoc3IwLHIyNlxcKSxmcjYuKgorLipmbGRkcyA4XFwoc3IwLHIyNlxcKSxmcjYuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImZtZW0gTFIgcmVnaXN0ZXIgc2VsZWN0b3IgdGVzdHMgKHBhcnQyKSIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJmbWVtIExSIHJlZ2lzdGVyIHNlbGVjdG9yIHRlc3RzIChwYXJ0MikiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGZtZW0gTFIgcmVnaXN0ZXIgc2VsZWN0b3IgdGVzdHMgIChwYXJ0MikiIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAieC8xMmkgZm1lbUxSYnVnX3Rlc3RzXzNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipmc3R3eCBmcjZSLHIyNVxcKHNyMCxyMjZcXCkuKgorLipmc3R3eCBmcjYscjI1XFwoc3IwLHIyNlxcKS4qCisuKmZzdHd4IGZyNixyMjVcXChzcjAscjI2XFwpLioKKy4qZnN0ZHggZnI2LHIyNVxcKHNyMCxyMjZcXCkuKgorLipmc3RkeCBmcjYscjI1XFwoc3IwLHIyNlxcKS4qCisuKmZzdGR4IGZyNixyMjVcXChzcjAscjI2XFwpLioKKy4qZmxkd3ggcjI1XFwoc3IwLHIyNlxcKSxmcjZSLioKKy4qZmxkd3ggcjI1XFwoc3IwLHIyNlxcKSxmcjYuKgorLipmbGR3eCByMjVcXChzcjAscjI2XFwpLGZyNi4qCisuKmZsZGR4IHIyNVxcKHNyMCxyMjZcXCksZnI2LioKKy4qZmxkZHggcjI1XFwoc3IwLHIyNlxcKSxmcjYuKgorLipmbGRkeCByMjVcXChzcjAscjI2XFwpLGZyNi4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiZm1lbSBMUiByZWdpc3RlciBzZWxlY3RvciB0ZXN0cyAocGFydDMpIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImZtZW0gTFIgcmVnaXN0ZXIgc2VsZWN0b3IgdGVzdHMgKHBhcnQzKSIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgZm1lbSBMUiByZWdpc3RlciBzZWxlY3RvciB0ZXN0cyAgKHBhcnQzKSIgfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJ4LzEyaSBmbWVtTFJidWdfdGVzdHNfNFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmZzdHd4IGZyNlIscjI1XFwoc3IwLHIyNlxcKS4qCisuKmZzdHd4IGZyNixyMjVcXChzcjAscjI2XFwpLioKKy4qZnN0d3ggZnI2LHIyNVxcKHNyMCxyMjZcXCkuKgorLipmc3RkeCBmcjYscjI1XFwoc3IwLHIyNlxcKS4qCisuKmZzdGR4IGZyNixyMjVcXChzcjAscjI2XFwpLioKKy4qZnN0ZHggZnI2LHIyNVxcKHNyMCxyMjZcXCkuKgorLipmbGR3eCByMjVcXChzcjAscjI2XFwpLGZyNlIuKgorLipmbGR3eCByMjVcXChzcjAscjI2XFwpLGZyNi4qCisuKmZsZHd4IHIyNVxcKHNyMCxyMjZcXCksZnI2LioKKy4qZmxkZHggcjI1XFwoc3IwLHIyNlxcKSxmcjYuKgorLipmbGRkeCByMjVcXChzcjAscjI2XFwpLGZyNi4qCisuKmZsZGR4IHIyNVxcKHNyMCxyMjZcXCksZnI2LioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJmbWVtIExSIHJlZ2lzdGVyIHNlbGVjdG9yIHRlc3RzIChwYXJ0NCkiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiZm1lbSBMUiByZWdpc3RlciBzZWxlY3RvciB0ZXN0cyAocGFydDQpIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBmbWVtIExSIHJlZ2lzdGVyIHNlbGVjdG9yIHRlc3RzICAocGFydDQpIiB9CisgICAgfQorfQorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJGJpbmZpbGUKKworYWxsX2ludGVnZXJfbWVtb3J5X3Rlc3RzCithbGxfaW1tZWRpYXRlX3Rlc3RzCithbGxfYnJhbmNoX3Rlc3RzCithbGxfaW50ZWdlcl9jb21wdXRhdGlvbmFsX3Rlc3RzCithbGxfc3lzdGVtX2NvbnRyb2xfdGVzdHMKK2FsbF9mcHVfbWVtb3J5X3Rlc3RzCithbGxfZnB1X2NvbXB1dGF0aW9uYWxfdGVzdHMKK2FsbF9mcHVfY29tcGFyaXNvbl90ZXN0cworYWxsX3NwZWNpYWxfdGVzdHMKK2FsbF9zZnVfdGVzdHMKK2FsbF9jb3ByX3Rlc3RzCithbGxfY29wcl9tZW1fdGVzdHMKKworIyBSZWdyZXNzaW9uIHRlc3QgZm9yIGEgYnVnIFRlZ2UgZm91bmQuCitmbWVtTFJidWdfdGVzdHMKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmRpc2FzbS9ocHBhLnMgYi9nZGIvdGVzdHN1aXRlL2dkYi5kaXNhc20vaHBwYS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5M2Q4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5kaXNhc20vaHBwYS5zCkBAIC0wLDAgKzEsMTczOCBAQAorCS5TUEFDRSAkUFJJVkFURSQKKwkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKKwkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKKwkuU1BBQ0UgJFRFWFQkCisJLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKKwkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCisJLklNUE9SVCAkZ2xvYmFsJCxEQVRBCisJLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCis7IGdjY19jb21waWxlZC46CisJLlNQQUNFICRURVhUJAorCS5TVUJTUEEgJENPREUkCisKKwkuYWxpZ24gNAorCS5FWFBPUlQgaW50ZWdlcl9tZW1vcnlfdGVzdHMsQ09ERQorCS5FWFBPUlQgaW50ZWdlcl9pbmRleGluZ19sb2FkLENPREUKKwkuRVhQT1JUIGludGVnZXJfbG9hZF9zaG9ydF9tZW1vcnksQ09ERQorCS5FWFBPUlQgaW50ZWdlcl9zdG9yZV9zaG9ydF9tZW1vcnksQ09ERQorCS5FWFBPUlQgaW1tZWRpYXRlX3Rlc3RzLENPREUKKwkuRVhQT1JUIGJyYW5jaF90ZXN0c18xLENPREUKKwkuRVhQT1JUIGJyYW5jaF90ZXN0c18yLENPREUKKwkuRVhQT1JUIG1vdmJfdGVzdHMsQ09ERQorCS5FWFBPUlQgbW92Yl9udWxsaWZpZWRfdGVzdHMsQ09ERQorCS5FWFBPUlQgbW92aWJfdGVzdHMsQ09ERQorCS5FWFBPUlQgbW92aWJfbnVsbGlmaWVkX3Rlc3RzLENPREUKKwkuRVhQT1JUIGNvbWJfdGVzdHNfMSxDT0RFCisJLkVYUE9SVCBjb21iX3Rlc3RzXzIsQ09ERQorCS5FWFBPUlQgY29tYl9udWxsaWZpZWRfdGVzdHNfMSxDT0RFCisJLkVYUE9SVCBjb21iX251bGxpZmllZF90ZXN0c18yLENPREUKKwkuRVhQT1JUIGNvbWliX3Rlc3RzXzEsQ09ERQorCS5FWFBPUlQgY29taWJfdGVzdHNfMixDT0RFCisJLkVYUE9SVCBjb21pYl9udWxsaWZpZWRfdGVzdHNfMSxDT0RFCisJLkVYUE9SVCBjb21pYl9udWxsaWZpZWRfdGVzdHNfMixDT0RFCisJLkVYUE9SVCBhZGRiX3Rlc3RzXzEsQ09ERQorCS5FWFBPUlQgYWRkYl90ZXN0c18yLENPREUKKwkuRVhQT1JUIGFkZGJfbnVsbGlmaWVkX3Rlc3RzXzEsQ09ERQorCS5FWFBPUlQgYWRkYl9udWxsaWZpZWRfdGVzdHNfMixDT0RFCisJLkVYUE9SVCBhZGRpYl90ZXN0c18xLENPREUKKwkuRVhQT1JUIGFkZGliX3Rlc3RzXzIsQ09ERQorCS5FWFBPUlQgYWRkaWJfbnVsbGlmaWVkX3Rlc3RzXzEsQ09ERQorCS5FWFBPUlQgYWRkaWJfbnVsbGlmaWVkX3Rlc3RzXzIsQ09ERQorCS5FWFBPUlQgYmJfdGVzdHMsQ09ERQorCS5FWFBPUlQgYWRkX3Rlc3RzLENPREUKKwkuRVhQT1JUIGFkZGxfdGVzdHMsQ09ERQorCS5FWFBPUlQgYWRkb190ZXN0cyxDT0RFCisJLkVYUE9SVCBhZGRjX3Rlc3RzLENPREUKKwkuRVhQT1JUIGFkZGNvX3Rlc3RzLENPREUKKwkuRVhQT1JUIHNoMWFkZF90ZXN0cyxDT0RFCisJLkVYUE9SVCBzaDFhZGRsX3Rlc3RzLENPREUKKwkuRVhQT1JUIHNoMWFkZG9fdGVzdHMsQ09ERQorCS5FWFBPUlQgc2gyYWRkX3Rlc3RzLENPREUKKwkuRVhQT1JUIHNoMmFkZGxfdGVzdHMsQ09ERQorCS5FWFBPUlQgc2gyYWRkb190ZXN0cyxDT0RFCisJLkVYUE9SVCBzaDNhZGRfdGVzdHMsQ09ERQorCS5FWFBPUlQgc2gzYWRkbF90ZXN0cyxDT0RFCisJLkVYUE9SVCBzaDNhZGRvX3Rlc3RzLENPREUKKwkuRVhQT1JUIHN1Yl90ZXN0cyxDT0RFCisJLkVYUE9SVCBzdWJvX3Rlc3RzLENPREUKKwkuRVhQT1JUIHN1YmJfdGVzdHMsQ09ERQorCS5FWFBPUlQgc3ViYm9fdGVzdHMsQ09ERQorCS5FWFBPUlQgc3VidF90ZXN0cyxDT0RFCisJLkVYUE9SVCBzdWJ0b190ZXN0cyxDT0RFCisJLkVYUE9SVCBkc190ZXN0cyxDT0RFCisJLkVYUE9SVCBjb21jbHJfdGVzdHMsQ09ERQorCS5FWFBPUlQgb3JfdGVzdHMsQ09ERQorCS5FWFBPUlQgeG9yX3Rlc3RzLENPREUKKwkuRVhQT1JUIGFuZF90ZXN0cyxDT0RFCisJLkVYUE9SVCBhbmRjbV90ZXN0cyxDT0RFCisJLkVYUE9SVCB1eG9yX3Rlc3RzLENPREUKKwkuRVhQT1JUIHVhZGRjbV90ZXN0cyxDT0RFCisJLkVYUE9SVCB1YWRkY210X3Rlc3RzLENPREUKKwkuRVhQT1JUIGRjb3JfdGVzdHMsQ09ERQorCS5FWFBPUlQgaWRjb3JfdGVzdHMsQ09ERQorCS5FWFBPUlQgYWRkaV90ZXN0cyxDT0RFCisJLkVYUE9SVCBhZGRpb190ZXN0cyxDT0RFCisJLkVYUE9SVCBhZGRpdF90ZXN0cyxDT0RFCisJLkVYUE9SVCBhZGRpdG9fdGVzdHMsQ09ERQorCS5FWFBPUlQgc3ViaV90ZXN0cyxDT0RFCisJLkVYUE9SVCBzdWJpb190ZXN0cyxDT0RFCisJLkVYUE9SVCBjb21pY2xyX3Rlc3RzLENPREUKKwkuRVhQT1JUIHZzaGRfdGVzdHMsQ09ERQorCS5FWFBPUlQgc2hkX3Rlc3RzLENPREUKKwkuRVhQT1JUIGV4dHJ1X3Rlc3RzLENPREUKKwkuRVhQT1JUIGV4dHJzX3Rlc3RzLENPREUKKwkuRVhQT1JUIHpkZXBfdGVzdHMsQ09ERQorCS5FWFBPUlQgZGVwX3Rlc3RzLENPREUKKwkuRVhQT1JUIHZleHRydV90ZXN0cyxDT0RFCisJLkVYUE9SVCB2ZXh0cnNfdGVzdHMsQ09ERQorCS5FWFBPUlQgenZkZXBfdGVzdHMsQ09ERQorCS5FWFBPUlQgdmRlcF90ZXN0cyxDT0RFCisJLkVYUE9SVCB2ZGVwaV90ZXN0cyxDT0RFCisJLkVYUE9SVCB6dmRlcGlfdGVzdHMsQ09ERQorCS5FWFBPUlQgZGVwaV90ZXN0cyxDT0RFCisJLkVYUE9SVCB6ZGVwaV90ZXN0cyxDT0RFCisJLkVYUE9SVCBzeXN0ZW1fY29udHJvbF90ZXN0cyxDT0RFCisJLkVYUE9SVCBwcm9iZV90ZXN0cyxDT0RFCisJLkVYUE9SVCBscGFfdGVzdHMsQ09ERQorCS5FWFBPUlQgcHVyZ2VfdGVzdHMsQ09ERQorCS5FWFBPUlQgaW5zZXJ0X3Rlc3RzLENPREUKKwkuRVhQT1JUIGZwdV9taXNjX3Rlc3RzLENPREUKKwkuRVhQT1JUIGZwdV9tZW1vcnlfaW5kZXhpbmdfdGVzdHMsQ09ERQorCS5FWFBPUlQgZnB1X3Nob3J0X21lbW9yeV90ZXN0cyxDT0RFCisJLkVYUE9SVCBmY3B5X3Rlc3RzLENPREUKKwkuRVhQT1JUIGZhYnNfdGVzdHMsQ09ERQorCS5FWFBPUlQgZnNxcnRfdGVzdHMsQ09ERQorCS5FWFBPUlQgZnJuZF90ZXN0cyxDT0RFCisJLkVYUE9SVCBmY252ZmZfdGVzdHMsQ09ERQorCS5FWFBPUlQgZmNudnhmX3Rlc3RzLENPREUKKwkuRVhQT1JUIGZjbnZmeF90ZXN0cyxDT0RFCisJLkVYUE9SVCBmY252Znh0X3Rlc3RzLENPREUKKwkuRVhQT1JUIGZhZGRfdGVzdHMsQ09ERQorCS5FWFBPUlQgZnN1Yl90ZXN0cyxDT0RFCisJLkVYUE9SVCBmbXB5X3Rlc3RzLENPREUKKwkuRVhQT1JUIGZkaXZfdGVzdHMsQ09ERQorCS5FWFBPUlQgZnJlbV90ZXN0cyxDT0RFCisJLkVYUE9SVCBmY21wX3NnbF90ZXN0c18xLENPREUKKwkuRVhQT1JUIGZjbXBfc2dsX3Rlc3RzXzIsQ09ERQorCS5FWFBPUlQgZmNtcF9zZ2xfdGVzdHNfMyxDT0RFCisJLkVYUE9SVCBmY21wX3NnbF90ZXN0c180LENPREUKKwkuRVhQT1JUIGZjbXBfZGJsX3Rlc3RzXzEsQ09ERQorCS5FWFBPUlQgZmNtcF9kYmxfdGVzdHNfMixDT0RFCisJLkVYUE9SVCBmY21wX2RibF90ZXN0c18zLENPREUKKwkuRVhQT1JUIGZjbXBfZGJsX3Rlc3RzXzQsQ09ERQorCS5FWFBPUlQgZmNtcF9xdWFkX3Rlc3RzXzEsQ09ERQorCS5FWFBPUlQgZmNtcF9xdWFkX3Rlc3RzXzIsQ09ERQorCS5FWFBPUlQgZmNtcF9xdWFkX3Rlc3RzXzMsQ09ERQorCS5FWFBPUlQgZmNtcF9xdWFkX3Rlc3RzXzQsQ09ERQorCS5FWFBPUlQgZm1weV9hZGRzdWJfdGVzdHMsQ09ERQorCS5FWFBPUlQgeG1weXVfdGVzdHMsQ09ERQorCS5FWFBPUlQgc3BlY2lhbF90ZXN0cyxDT0RFCisJLkVYUE9SVCBzZnVfdGVzdHMsQ09ERQorCS5FWFBPUlQgY29wcl90ZXN0cyxDT0RFCisJLkVYUE9SVCBjb3ByX2luZGV4aW5nX2xvYWQsQ09ERQorCS5FWFBPUlQgY29wcl9pbmRleGluZ19zdG9yZSxDT0RFCisJLkVYUE9SVCBjb3ByX3Nob3J0X21lbW9yeSxDT0RFCisJLkVYUE9SVCBmbWVtTFJidWdfdGVzdHNfMSxDT0RFCisJLkVYUE9SVCBmbWVtTFJidWdfdGVzdHNfMixDT0RFCisJLkVYUE9SVCBmbWVtTFJidWdfdGVzdHNfMyxDT0RFCisJLkVYUE9SVCBmbWVtTFJidWdfdGVzdHNfNCxDT0RFCisJLkVYUE9SVCBtYWluLENPREUKKwkuRVhQT1JUIG1haW4sRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKK21haW4KKwkuUFJPQworCS5DQUxMSU5GTyBGUkFNRT02NCxOT19DQUxMUyxTQVZFX1NQCisJLkVOVFJZCisJY29weSAlcjQsJXIxCisJY29weSAlcjMwLCVyNAorCXN0d20gJXIxLDY0KDAsJXIzMCkKKzsgRmlyc3QgbWVtb3J5IHJlZmVyZW5jZSBpbnN0cnVjdGlvbnMuCis7IFNob3VsZCB0cnkgY29ybmVyIGNhc2VzIGZvciBlYWNoIGZpZWxkIGV4dHJhY3Rpb24uCis7IFNob3VsZCBkZWFsIHdpdGggcyA9PSAwIGNhc2Ugc29tZWhvdz8hPworaW50ZWdlcl9tZW1vcnlfdGVzdHMKKwlsZHcgMCgwLCVyNCksJXIyNgorCWxkaCAwKDAsJXI0KSwlcjI2CisJbGRiIDAoMCwlcjQpLCVyMjYKKwlzdHcgJXIyNiwwKDAsJXI0KQorCXN0aCAlcjI2LDAoMCwlcjQpCisJc3RiICVyMjYsMCgwLCVyNCkKKworOyBTaG91bGQgbWFrZSBzdXJlIHByZS9wb3N0IG1vZGVzIGFyZSByZWNvZ25pemVkIGNvcnJlY3RseS4KKwlsZHdtIDAoMCwlcjQpLCVyMjYKKwlzdHdtICVyMjYsMCgwLCVyNCkKKworaW50ZWdlcl9pbmRleGluZ19sb2FkCisJbGR3eCAlcjUoMCwlcjQpLCVyMjYKKwlsZHd4LHMgJXI1KDAsJXI0KSwlcjI2CisJbGR3eCxtICVyNSgwLCVyNCksJXIyNgorCWxkd3gsc20gJXI1KDAsJXI0KSwlcjI2CisJbGRoeCAlcjUoMCwlcjQpLCVyMjYKKwlsZGh4LHMgJXI1KDAsJXI0KSwlcjI2CisJbGRoeCxtICVyNSgwLCVyNCksJXIyNgorCWxkaHgsc20gJXI1KDAsJXI0KSwlcjI2CisJbGRieCAlcjUoMCwlcjQpLCVyMjYKKwlsZGJ4LHMgJXI1KDAsJXI0KSwlcjI2CisJbGRieCxtICVyNSgwLCVyNCksJXIyNgorCWxkYngsc20gJXI1KDAsJXI0KSwlcjI2CisJbGR3YXggJXI1KCVyNCksJXIyNgorCWxkd2F4LHMgJXI1KCVyNCksJXIyNgorCWxkd2F4LG0gJXI1KCVyNCksJXIyNgorCWxkd2F4LHNtICVyNSglcjQpLCVyMjYKKwlsZGN3eCAlcjUoMCwlcjQpLCVyMjYKKwlsZGN3eCxzICVyNSgwLCVyNCksJXIyNgorCWxkY3d4LG0gJXI1KDAsJXI0KSwlcjI2CisJbGRjd3gsc20gJXI1KDAsJXI0KSwlcjI2CisKK2ludGVnZXJfbG9hZF9zaG9ydF9tZW1vcnkKKwlsZHdzIDAoMCwlcjQpLCVyMjYKKwlsZHdzLG1iIDAoMCwlcjQpLCVyMjYKKwlsZHdzLG1hIDAoMCwlcjQpLCVyMjYKKwlsZGhzIDAoMCwlcjQpLCVyMjYKKwlsZGhzLG1iIDAoMCwlcjQpLCVyMjYKKwlsZGhzLG1hIDAoMCwlcjQpLCVyMjYKKwlsZGJzIDAoMCwlcjQpLCVyMjYKKwlsZGJzLG1iIDAoMCwlcjQpLCVyMjYKKwlsZGJzLG1hIDAoMCwlcjQpLCVyMjYKKwlsZHdhcyAwKCVyNCksJXIyNgorCWxkd2FzLG1iIDAoJXI0KSwlcjI2CisJbGR3YXMsbWEgMCglcjQpLCVyMjYKKwlsZGN3cyAwKDAsJXI0KSwlcjI2CisJbGRjd3MsbWIgMCgwLCVyNCksJXIyNgorCWxkY3dzLG1hIDAoMCwlcjQpLCVyMjYKKworaW50ZWdlcl9zdG9yZV9zaG9ydF9tZW1vcnkKKwlzdHdzICVyMjYsMCgwLCVyNCkKKwlzdHdzLG1iICVyMjYsMCgwLCVyNCkKKwlzdHdzLG1hICVyMjYsMCgwLCVyNCkKKwlzdGhzICVyMjYsMCgwLCVyNCkKKwlzdGhzLG1iICVyMjYsMCgwLCVyNCkKKwlzdGhzLG1hICVyMjYsMCgwLCVyNCkKKwlzdGJzICVyMjYsMCgwLCVyNCkKKwlzdGJzLG1iICVyMjYsMCgwLCVyNCkKKwlzdGJzLG1hICVyMjYsMCgwLCVyNCkKKwlzdHdhcyAlcjI2LDAoJXI0KQorCXN0d2FzLG1iICVyMjYsMCglcjQpCisJc3R3YXMsbWEgJXIyNiwwKCVyNCkKKwlzdGJ5cyAlcjI2LDAoMCwlcjQpCisJc3RieXMsYiAlcjI2LDAoMCwlcjQpCisJc3RieXMsZSAlcjI2LDAoMCwlcjQpCisJc3RieXMsYixtICVyMjYsMCgwLCVyNCkKKwlzdGJ5cyxlLG0gJXIyNiwwKDAsJXI0KQorCis7IEltbWVkaWF0ZSBpbnN0cnVjdGlvbnMuCitpbW1lZGlhdGVfdGVzdHMKKwlsZG8gNSglcjI2KSwlcjI2CisJbGRpbCBMJTB4ZGVhZGJlZWYsJXIyNgorCWFkZGlsIEwlMHhkZWFkYmVlZiwlcjUKKworOyBMb3RzIG9mIGJyYW5jaCBpbnN0cnVjdGlvbnMuCis7IGJsciB3aXRoICVyMCBhcyByZXR1cm4gcG9pbnRlciBzaG91bGQgcmVhbGx5IGJlIGp1c3QgYnIgPHRhcmdldD4sCis7IGJ1dCB0aGUgYXNzZW1ibGVycyBjYW4ndCBoYW5kbGUgaXQuCiticmFuY2hfdGVzdHNfMQorCWJsIG1haW4sJXIyCisJYmwsbiBtYWluLCVyMgorCWIgbWFpbgorCWIsbiBtYWluCisJZ2F0ZSBtYWluLCVyMgorCWdhdGUsbiBtYWluLCVyMgorCWJsciAlcjQsJXIyCisJYmxyLG4gJXI0LCVyMgorCWJsciAlcjQsJXIwCisJYmxyLG4gJXI0LCVyMAorYnJhbmNoX3Rlc3RzXzIKKwlidiAwKCVyMikKKwlidixuIDAoJXIyKQorCWJlIDB4MTIzNCglc3IxLCVyMikKKwliZSxuIDB4MTIzNCglc3IxLCVyMikKKwlibGUgMHgxMjM0KCVzcjEsJXIyKQorCWJsZSxuIDB4MTIzNCglc3IxLCVyMikKKworOyBHQVMgY2FuJ3QgYXNzZW1ibGUgbW92YixuIG9yIG1vdmliLG4uCittb3ZiX3Rlc3RzCisJbW92YiAlcjQsJXIyNixtb3ZiX3Rlc3RzCisJbW92Yiw9ICVyNCwlcjI2LG1vdmJfdGVzdHMKKwltb3ZiLDwgJXI0LCVyMjYsbW92Yl90ZXN0cworCW1vdmIsb2QgJXI0LCVyMjYsbW92Yl90ZXN0cworCW1vdmIsdHIgJXI0LCVyMjYsbW92Yl90ZXN0cworCW1vdmIsPD4gJXI0LCVyMjYsbW92Yl90ZXN0cworCW1vdmIsPj0gJXI0LCVyMjYsbW92Yl90ZXN0cworCW1vdmIsZXYgJXI0LCVyMjYsbW92Yl90ZXN0cworbW92Yl9udWxsaWZpZWRfdGVzdHMKKwltb3ZiLG4gJXI0LCVyMjYsbW92Yl90ZXN0cworCW1vdmIsPSxuICVyNCwlcjI2LG1vdmJfdGVzdHMKKwltb3ZiLDwsbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCisJbW92YixvZCxuICVyNCwlcjI2LG1vdmJfdGVzdHMKKwltb3ZiLHRyLG4gJXI0LCVyMjYsbW92Yl90ZXN0cworCW1vdmIsPD4sbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCisJbW92Yiw+PSxuICVyNCwlcjI2LG1vdmJfdGVzdHMKKwltb3ZiLGV2LG4gJXI0LCVyMjYsbW92Yl90ZXN0cworCittb3ZpYl90ZXN0cworCW1vdmliIDUsJXIyNixtb3ZpYl90ZXN0cworCW1vdmliLD0gNSwlcjI2LG1vdmliX3Rlc3RzCisJbW92aWIsPCA1LCVyMjYsbW92aWJfdGVzdHMKKwltb3ZpYixvZCA1LCVyMjYsbW92aWJfdGVzdHMKKwltb3ZpYix0ciA1LCVyMjYsbW92aWJfdGVzdHMKKwltb3ZpYiw8PiA1LCVyMjYsbW92aWJfdGVzdHMKKwltb3ZpYiw+PSA1LCVyMjYsbW92aWJfdGVzdHMKKwltb3ZpYixldiA1LCVyMjYsbW92aWJfdGVzdHMKK21vdmliX251bGxpZmllZF90ZXN0cworCW1vdmliLG4gNSwlcjI2LG1vdmliX3Rlc3RzCisJbW92aWIsPSxuIDUsJXIyNixtb3ZpYl90ZXN0cworCW1vdmliLDwsbiA1LCVyMjYsbW92aWJfdGVzdHMKKwltb3ZpYixvZCxuIDUsJXIyNixtb3ZpYl90ZXN0cworCW1vdmliLHRyLG4gNSwlcjI2LG1vdmliX3Rlc3RzCisJbW92aWIsPD4sbiA1LCVyMjYsbW92aWJfdGVzdHMKKwltb3ZpYiw+PSxuIDUsJXIyNixtb3ZpYl90ZXN0cworCW1vdmliLGV2LG4gNSwlcjI2LG1vdmliX3Rlc3RzCisKK2NvbWJfdGVzdHNfMQorCWNvbWIgJXIwLCVyNCxjb21iX3Rlc3RzXzEKKwljb21iLD0gJXIwLCVyNCxjb21iX3Rlc3RzXzEKKwljb21iLDwgJXIwLCVyNCxjb21iX3Rlc3RzXzEKKwljb21iLDw9ICVyMCwlcjQsY29tYl90ZXN0c18xCisJY29tYiw8PCAlcjAsJXI0LGNvbWJfdGVzdHNfMQorCWNvbWIsPDw9ICVyMCwlcjQsY29tYl90ZXN0c18xCisJY29tYixzdiAlcjAsJXI0LGNvbWJfdGVzdHNfMQorCWNvbWIsb2QgJXIwLCVyNCxjb21iX3Rlc3RzXzEKKworY29tYl90ZXN0c18yCisJY29tYix0ciAlcjAsJXI0LGNvbWJfdGVzdHNfMgorCWNvbWIsPD4gJXIwLCVyNCxjb21iX3Rlc3RzXzIKKwljb21iLD49ICVyMCwlcjQsY29tYl90ZXN0c18yCisJY29tYiw+ICVyMCwlcjQsY29tYl90ZXN0c18yCisJY29tYiw+Pj0gJXIwLCVyNCxjb21iX3Rlc3RzXzIKKwljb21iLD4+ICVyMCwlcjQsY29tYl90ZXN0c18yCisJY29tYixuc3YgJXIwLCVyNCxjb21iX3Rlc3RzXzIKKwljb21iLGV2ICVyMCwlcjQsY29tYl90ZXN0c18yCisKK2NvbWJfbnVsbGlmaWVkX3Rlc3RzXzEKKwljb21iLG4gJXIwLCVyNCxjb21iX3Rlc3RzXzEKKwljb21iLD0sbiAlcjAsJXI0LGNvbWJfdGVzdHNfMQorCWNvbWIsPCxuICVyMCwlcjQsY29tYl90ZXN0c18xCisJY29tYiw8PSxuICVyMCwlcjQsY29tYl90ZXN0c18xCisJY29tYiw8PCxuICVyMCwlcjQsY29tYl90ZXN0c18xCisJY29tYiw8PD0sbiAlcjAsJXI0LGNvbWJfdGVzdHNfMQorCWNvbWIsc3YsbiAlcjAsJXI0LGNvbWJfdGVzdHNfMQorCWNvbWIsb2QsbiAlcjAsJXI0LGNvbWJfdGVzdHNfMQorCitjb21iX251bGxpZmllZF90ZXN0c18yCisJY29tYix0cixuICVyMCwlcjQsY29tYl90ZXN0c18yCisJY29tYiw8PixuICVyMCwlcjQsY29tYl90ZXN0c18yCisJY29tYiw+PSxuICVyMCwlcjQsY29tYl90ZXN0c18yCisJY29tYiw+LG4gJXIwLCVyNCxjb21iX3Rlc3RzXzIKKwljb21iLD4+PSxuICVyMCwlcjQsY29tYl90ZXN0c18yCisJY29tYiw+PixuICVyMCwlcjQsY29tYl90ZXN0c18yCisJY29tYixuc3YsbiAlcjAsJXI0LGNvbWJfdGVzdHNfMgorCWNvbWIsZXYsbiAlcjAsJXI0LGNvbWJfdGVzdHNfMgorCitjb21pYl90ZXN0c18xCisJY29taWIgMCwlcjQsY29taWJfdGVzdHNfMQorCWNvbWliLD0gMCwlcjQsY29taWJfdGVzdHNfMQorCWNvbWliLDwgMCwlcjQsY29taWJfdGVzdHNfMQorCWNvbWliLDw9IDAsJXI0LGNvbWliX3Rlc3RzXzEKKwljb21pYiw8PCAwLCVyNCxjb21pYl90ZXN0c18xCisJY29taWIsPDw9IDAsJXI0LGNvbWliX3Rlc3RzXzEKKwljb21pYixzdiAwLCVyNCxjb21pYl90ZXN0c18xCisJY29taWIsb2QgMCwlcjQsY29taWJfdGVzdHNfMQorCitjb21pYl90ZXN0c18yCisJY29taWIsdHIgMCwlcjQsY29taWJfdGVzdHNfMgorCWNvbWliLDw+IDAsJXI0LGNvbWliX3Rlc3RzXzIKKwljb21pYiw+PSAwLCVyNCxjb21pYl90ZXN0c18yCisJY29taWIsPiAwLCVyNCxjb21pYl90ZXN0c18yCisJY29taWIsPj49IDAsJXI0LGNvbWliX3Rlc3RzXzIKKwljb21pYiw+PiAwLCVyNCxjb21pYl90ZXN0c18yCisJY29taWIsbnN2IDAsJXI0LGNvbWliX3Rlc3RzXzIKKwljb21pYixldiAwLCVyNCxjb21pYl90ZXN0c18yCisKK2NvbWliX251bGxpZmllZF90ZXN0c18xCisJY29taWIsbiAwLCVyNCxjb21pYl90ZXN0c18xCisJY29taWIsPSxuIDAsJXI0LGNvbWliX3Rlc3RzXzEKKwljb21pYiw8LG4gMCwlcjQsY29taWJfdGVzdHNfMQorCWNvbWliLDw9LG4gMCwlcjQsY29taWJfdGVzdHNfMQorCWNvbWliLDw8LG4gMCwlcjQsY29taWJfdGVzdHNfMQorCWNvbWliLDw8PSxuIDAsJXI0LGNvbWliX3Rlc3RzXzEKKwljb21pYixzdixuIDAsJXI0LGNvbWliX3Rlc3RzXzEKKwljb21pYixvZCxuIDAsJXI0LGNvbWliX3Rlc3RzXzEKKworY29taWJfbnVsbGlmaWVkX3Rlc3RzXzIKKwljb21pYix0cixuIDAsJXI0LGNvbWliX3Rlc3RzXzIKKwljb21pYiw8PixuIDAsJXI0LGNvbWliX3Rlc3RzXzIKKwljb21pYiw+PSxuIDAsJXI0LGNvbWliX3Rlc3RzXzIKKwljb21pYiw+LG4gMCwlcjQsY29taWJfdGVzdHNfMgorCWNvbWliLD4+PSxuIDAsJXI0LGNvbWliX3Rlc3RzXzIKKwljb21pYiw+PixuIDAsJXI0LGNvbWliX3Rlc3RzXzIKKwljb21pYixuc3YsbiAwLCVyNCxjb21pYl90ZXN0c18yCisJY29taWIsZXYsbiAwLCVyNCxjb21pYl90ZXN0c18yCisKK2FkZGJfdGVzdHNfMQorCWFkZGIgJXIxLCVyNCxhZGRiX3Rlc3RzXzEKKwlhZGRiLD0gJXIxLCVyNCxhZGRiX3Rlc3RzXzEKKwlhZGRiLDwgJXIxLCVyNCxhZGRiX3Rlc3RzXzEKKwlhZGRiLDw9ICVyMSwlcjQsYWRkYl90ZXN0c18xCisJYWRkYixudXYgJXIxLCVyNCxhZGRiX3Rlc3RzXzEKKwlhZGRiLHpudiAlcjEsJXI0LGFkZGJfdGVzdHNfMQorCWFkZGIsc3YgJXIxLCVyNCxhZGRiX3Rlc3RzXzEKKwlhZGRiLG9kICVyMSwlcjQsYWRkYl90ZXN0c18xCisKK2FkZGJfdGVzdHNfMgorCWFkZGIsdHIgJXIxLCVyNCxhZGRiX3Rlc3RzXzIKKwlhZGRiLDw+ICVyMSwlcjQsYWRkYl90ZXN0c18yCisJYWRkYiw+PSAlcjEsJXI0LGFkZGJfdGVzdHNfMgorCWFkZGIsPiAlcjEsJXI0LGFkZGJfdGVzdHNfMgorCWFkZGIsdXYgJXIxLCVyNCxhZGRiX3Rlc3RzXzIKKwlhZGRiLHZueiAlcjEsJXI0LGFkZGJfdGVzdHNfMgorCWFkZGIsbnN2ICVyMSwlcjQsYWRkYl90ZXN0c18yCisJYWRkYixldiAlcjEsJXI0LGFkZGJfdGVzdHNfMgorCithZGRiX251bGxpZmllZF90ZXN0c18xCisJYWRkYixuICVyMSwlcjQsYWRkYl90ZXN0c18xCisJYWRkYiw9LG4gJXIxLCVyNCxhZGRiX3Rlc3RzXzEKKwlhZGRiLDwsbiAlcjEsJXI0LGFkZGJfdGVzdHNfMQorCWFkZGIsPD0sbiAlcjEsJXI0LGFkZGJfdGVzdHNfMQorCWFkZGIsbnV2LG4gJXIxLCVyNCxhZGRiX3Rlc3RzXzEKKwlhZGRiLHpudixuICVyMSwlcjQsYWRkYl90ZXN0c18xCisJYWRkYixzdixuICVyMSwlcjQsYWRkYl90ZXN0c18xCisJYWRkYixvZCxuICVyMSwlcjQsYWRkYl90ZXN0c18xCisKK2FkZGJfbnVsbGlmaWVkX3Rlc3RzXzIKKwlhZGRiLHRyLG4gJXIxLCVyNCxhZGRiX3Rlc3RzXzIKKwlhZGRiLDw+LG4gJXIxLCVyNCxhZGRiX3Rlc3RzXzIKKwlhZGRiLD49LG4gJXIxLCVyNCxhZGRiX3Rlc3RzXzIKKwlhZGRiLD4sbiAlcjEsJXI0LGFkZGJfdGVzdHNfMgorCWFkZGIsdXYsbiAlcjEsJXI0LGFkZGJfdGVzdHNfMgorCWFkZGIsdm56LG4gJXIxLCVyNCxhZGRiX3Rlc3RzXzIKKwlhZGRiLG5zdixuICVyMSwlcjQsYWRkYl90ZXN0c18yCisJYWRkYixldixuICVyMSwlcjQsYWRkYl90ZXN0c18yCisKK2FkZGliX3Rlc3RzXzEKKwlhZGRpYiAtMSwlcjQsYWRkaWJfdGVzdHNfMQorCWFkZGliLD0gLTEsJXI0LGFkZGliX3Rlc3RzXzEKKwlhZGRpYiw8IC0xLCVyNCxhZGRpYl90ZXN0c18xCisJYWRkaWIsPD0gLTEsJXI0LGFkZGliX3Rlc3RzXzEKKwlhZGRpYixudXYgLTEsJXI0LGFkZGliX3Rlc3RzXzEKKwlhZGRpYix6bnYgLTEsJXI0LGFkZGliX3Rlc3RzXzEKKwlhZGRpYixzdiAtMSwlcjQsYWRkaWJfdGVzdHNfMQorCWFkZGliLG9kIC0xLCVyNCxhZGRpYl90ZXN0c18xCisKK2FkZGliX3Rlc3RzXzIKKwlhZGRpYix0ciAtMSwlcjQsYWRkaWJfdGVzdHNfMgorCWFkZGliLDw+IC0xLCVyNCxhZGRpYl90ZXN0c18yCisJYWRkaWIsPj0gLTEsJXI0LGFkZGliX3Rlc3RzXzIKKwlhZGRpYiw+IC0xLCVyNCxhZGRpYl90ZXN0c18yCisJYWRkaWIsdXYgLTEsJXI0LGFkZGliX3Rlc3RzXzIKKwlhZGRpYix2bnogLTEsJXI0LGFkZGliX3Rlc3RzXzIKKwlhZGRpYixuc3YgLTEsJXI0LGFkZGliX3Rlc3RzXzIKKwlhZGRpYixldiAtMSwlcjQsYWRkaWJfdGVzdHNfMgorCithZGRpYl9udWxsaWZpZWRfdGVzdHNfMQorCWFkZGliLG4gLTEsJXI0LGFkZGliX3Rlc3RzXzEKKwlhZGRpYiw9LG4gLTEsJXI0LGFkZGliX3Rlc3RzXzEKKwlhZGRpYiw8LG4gLTEsJXI0LGFkZGliX3Rlc3RzXzEKKwlhZGRpYiw8PSxuIC0xLCVyNCxhZGRpYl90ZXN0c18xCisJYWRkaWIsbnV2LG4gLTEsJXI0LGFkZGliX3Rlc3RzXzEKKwlhZGRpYix6bnYsbiAtMSwlcjQsYWRkaWJfdGVzdHNfMQorCWFkZGliLHN2LG4gLTEsJXI0LGFkZGliX3Rlc3RzXzEKKwlhZGRpYixvZCxuIC0xLCVyNCxhZGRpYl90ZXN0c18xCisKK2FkZGliX251bGxpZmllZF90ZXN0c18yCisJYWRkaWIsdHIsbiAtMSwlcjQsYWRkaWJfdGVzdHNfMgorCWFkZGliLDw+LG4gLTEsJXI0LGFkZGliX3Rlc3RzXzIKKwlhZGRpYiw+PSxuIC0xLCVyNCxhZGRpYl90ZXN0c18yCisJYWRkaWIsPixuIC0xLCVyNCxhZGRpYl90ZXN0c18yCisJYWRkaWIsdXYsbiAtMSwlcjQsYWRkaWJfdGVzdHNfMgorCWFkZGliLHZueixuIC0xLCVyNCxhZGRpYl90ZXN0c18yCisJYWRkaWIsbnN2LG4gLTEsJXI0LGFkZGliX3Rlc3RzXzIKKwlhZGRpYixldixuIC0xLCVyNCxhZGRpYl90ZXN0c18yCisKKworOyBOZWVkcyB0byBjaGVjayBsb3RzIG9mIHN0dWZmIChsaWtlIGNvcm5lciBiaXQgY2FzZXMpCitiYl90ZXN0cworCWJ2Yiw8ICVyNCxiYl90ZXN0cworCWJ2Yiw+PSAlcjQsYmJfdGVzdHMKKwlidmIsPCxuICVyNCxiYl90ZXN0cworCWJ2Yiw+PSxuICVyNCxiYl90ZXN0cworCWJiLDwgJXI0LDUsYmJfdGVzdHMKKwliYiw+PSAlcjQsNSxiYl90ZXN0cworCWJiLDwsbiAlcjQsNSxiYl90ZXN0cworCWJiLD49LG4gJXI0LDUsYmJfdGVzdHMKKwkKKzsgQ29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbnMKK2FkZF90ZXN0cworCWFkZCAgJXI0LCVyNSwlcjYKKwlhZGQsPSAgJXI0LCVyNSwlcjYKKwlhZGQsPCAgJXI0LCVyNSwlcjYKKwlhZGQsPD0gICVyNCwlcjUsJXI2CisJYWRkLG51diAgJXI0LCVyNSwlcjYKKwlhZGQsem52ICAlcjQsJXI1LCVyNgorCWFkZCxzdiAgJXI0LCVyNSwlcjYKKwlhZGQsb2QgICVyNCwlcjUsJXI2CisJYWRkLHRyICAlcjQsJXI1LCVyNgorCWFkZCw8PiAgJXI0LCVyNSwlcjYKKwlhZGQsPj0gICVyNCwlcjUsJXI2CisJYWRkLD4gICVyNCwlcjUsJXI2CisJYWRkLHV2ICAlcjQsJXI1LCVyNgorCWFkZCx2bnogICVyNCwlcjUsJXI2CisJYWRkLG5zdiAgJXI0LCVyNSwlcjYKKwlhZGQsZXYgICVyNCwlcjUsJXI2CisKK2FkZGxfdGVzdHMKKwlhZGRsICAlcjQsJXI1LCVyNgorCWFkZGwsPSAgJXI0LCVyNSwlcjYKKwlhZGRsLDwgICVyNCwlcjUsJXI2CisJYWRkbCw8PSAgJXI0LCVyNSwlcjYKKwlhZGRsLG51diAgJXI0LCVyNSwlcjYKKwlhZGRsLHpudiAgJXI0LCVyNSwlcjYKKwlhZGRsLHN2ICAlcjQsJXI1LCVyNgorCWFkZGwsb2QgICVyNCwlcjUsJXI2CisJYWRkbCx0ciAgJXI0LCVyNSwlcjYKKwlhZGRsLDw+ICAlcjQsJXI1LCVyNgorCWFkZGwsPj0gICVyNCwlcjUsJXI2CisJYWRkbCw+ICAlcjQsJXI1LCVyNgorCWFkZGwsdXYgICVyNCwlcjUsJXI2CisJYWRkbCx2bnogICVyNCwlcjUsJXI2CisJYWRkbCxuc3YgICVyNCwlcjUsJXI2CisJYWRkbCxldiAgJXI0LCVyNSwlcjYKKworYWRkb190ZXN0cworCWFkZG8gICVyNCwlcjUsJXI2CisJYWRkbyw9ICAlcjQsJXI1LCVyNgorCWFkZG8sPCAgJXI0LCVyNSwlcjYKKwlhZGRvLDw9ICAlcjQsJXI1LCVyNgorCWFkZG8sbnV2ICAlcjQsJXI1LCVyNgorCWFkZG8sem52ICAlcjQsJXI1LCVyNgorCWFkZG8sc3YgICVyNCwlcjUsJXI2CisJYWRkbyxvZCAgJXI0LCVyNSwlcjYKKwlhZGRvLHRyICAlcjQsJXI1LCVyNgorCWFkZG8sPD4gICVyNCwlcjUsJXI2CisJYWRkbyw+PSAgJXI0LCVyNSwlcjYKKwlhZGRvLD4gICVyNCwlcjUsJXI2CisJYWRkbyx1diAgJXI0LCVyNSwlcjYKKwlhZGRvLHZueiAgJXI0LCVyNSwlcjYKKwlhZGRvLG5zdiAgJXI0LCVyNSwlcjYKKwlhZGRvLGV2ICAlcjQsJXI1LCVyNgorCithZGRjX3Rlc3RzCisJYWRkYyAgJXI0LCVyNSwlcjYKKwlhZGRjLD0gICVyNCwlcjUsJXI2CisJYWRkYyw8ICAlcjQsJXI1LCVyNgorCWFkZGMsPD0gICVyNCwlcjUsJXI2CisJYWRkYyxudXYgICVyNCwlcjUsJXI2CisJYWRkYyx6bnYgICVyNCwlcjUsJXI2CisJYWRkYyxzdiAgJXI0LCVyNSwlcjYKKwlhZGRjLG9kICAlcjQsJXI1LCVyNgorCWFkZGMsdHIgICVyNCwlcjUsJXI2CisJYWRkYyw8PiAgJXI0LCVyNSwlcjYKKwlhZGRjLD49ICAlcjQsJXI1LCVyNgorCWFkZGMsPiAgJXI0LCVyNSwlcjYKKwlhZGRjLHV2ICAlcjQsJXI1LCVyNgorCWFkZGMsdm56ICAlcjQsJXI1LCVyNgorCWFkZGMsbnN2ICAlcjQsJXI1LCVyNgorCWFkZGMsZXYgICVyNCwlcjUsJXI2CisKK2FkZGNvX3Rlc3RzCisJYWRkY28gICVyNCwlcjUsJXI2CisJYWRkY28sPSAgJXI0LCVyNSwlcjYKKwlhZGRjbyw8ICAlcjQsJXI1LCVyNgorCWFkZGNvLDw9ICAlcjQsJXI1LCVyNgorCWFkZGNvLG51diAgJXI0LCVyNSwlcjYKKwlhZGRjbyx6bnYgICVyNCwlcjUsJXI2CisJYWRkY28sc3YgICVyNCwlcjUsJXI2CisJYWRkY28sb2QgICVyNCwlcjUsJXI2CisJYWRkY28sdHIgICVyNCwlcjUsJXI2CisJYWRkY28sPD4gICVyNCwlcjUsJXI2CisJYWRkY28sPj0gICVyNCwlcjUsJXI2CisJYWRkY28sPiAgJXI0LCVyNSwlcjYKKwlhZGRjbyx1diAgJXI0LCVyNSwlcjYKKwlhZGRjbyx2bnogICVyNCwlcjUsJXI2CisJYWRkY28sbnN2ICAlcjQsJXI1LCVyNgorCWFkZGNvLGV2ICAlcjQsJXI1LCVyNgorCitzaDFhZGRfdGVzdHMKKwlzaDFhZGQgICVyNCwlcjUsJXI2CisJc2gxYWRkLD0gICVyNCwlcjUsJXI2CisJc2gxYWRkLDwgICVyNCwlcjUsJXI2CisJc2gxYWRkLDw9ICAlcjQsJXI1LCVyNgorCXNoMWFkZCxudXYgICVyNCwlcjUsJXI2CisJc2gxYWRkLHpudiAgJXI0LCVyNSwlcjYKKwlzaDFhZGQsc3YgICVyNCwlcjUsJXI2CisJc2gxYWRkLG9kICAlcjQsJXI1LCVyNgorCXNoMWFkZCx0ciAgJXI0LCVyNSwlcjYKKwlzaDFhZGQsPD4gICVyNCwlcjUsJXI2CisJc2gxYWRkLD49ICAlcjQsJXI1LCVyNgorCXNoMWFkZCw+ICAlcjQsJXI1LCVyNgorCXNoMWFkZCx1diAgJXI0LCVyNSwlcjYKKwlzaDFhZGQsdm56ICAlcjQsJXI1LCVyNgorCXNoMWFkZCxuc3YgICVyNCwlcjUsJXI2CisJc2gxYWRkLGV2ICAlcjQsJXI1LCVyNgorCitzaDFhZGRsX3Rlc3RzCisJc2gxYWRkbCAgJXI0LCVyNSwlcjYKKwlzaDFhZGRsLD0gICVyNCwlcjUsJXI2CisJc2gxYWRkbCw8ICAlcjQsJXI1LCVyNgorCXNoMWFkZGwsPD0gICVyNCwlcjUsJXI2CisJc2gxYWRkbCxudXYgICVyNCwlcjUsJXI2CisJc2gxYWRkbCx6bnYgICVyNCwlcjUsJXI2CisJc2gxYWRkbCxzdiAgJXI0LCVyNSwlcjYKKwlzaDFhZGRsLG9kICAlcjQsJXI1LCVyNgorCXNoMWFkZGwsdHIgICVyNCwlcjUsJXI2CisJc2gxYWRkbCw8PiAgJXI0LCVyNSwlcjYKKwlzaDFhZGRsLD49ICAlcjQsJXI1LCVyNgorCXNoMWFkZGwsPiAgJXI0LCVyNSwlcjYKKwlzaDFhZGRsLHV2ICAlcjQsJXI1LCVyNgorCXNoMWFkZGwsdm56ICAlcjQsJXI1LCVyNgorCXNoMWFkZGwsbnN2ICAlcjQsJXI1LCVyNgorCXNoMWFkZGwsZXYgICVyNCwlcjUsJXI2CisKK3NoMWFkZG9fdGVzdHMKKwlzaDFhZGRvICAlcjQsJXI1LCVyNgorCXNoMWFkZG8sPSAgJXI0LCVyNSwlcjYKKwlzaDFhZGRvLDwgICVyNCwlcjUsJXI2CisJc2gxYWRkbyw8PSAgJXI0LCVyNSwlcjYKKwlzaDFhZGRvLG51diAgJXI0LCVyNSwlcjYKKwlzaDFhZGRvLHpudiAgJXI0LCVyNSwlcjYKKwlzaDFhZGRvLHN2ICAlcjQsJXI1LCVyNgorCXNoMWFkZG8sb2QgICVyNCwlcjUsJXI2CisJc2gxYWRkbyx0ciAgJXI0LCVyNSwlcjYKKwlzaDFhZGRvLDw+ICAlcjQsJXI1LCVyNgorCXNoMWFkZG8sPj0gICVyNCwlcjUsJXI2CisJc2gxYWRkbyw+ICAlcjQsJXI1LCVyNgorCXNoMWFkZG8sdXYgICVyNCwlcjUsJXI2CisJc2gxYWRkbyx2bnogICVyNCwlcjUsJXI2CisJc2gxYWRkbyxuc3YgICVyNCwlcjUsJXI2CisJc2gxYWRkbyxldiAgJXI0LCVyNSwlcjYKKworCitzaDJhZGRfdGVzdHMKKwlzaDJhZGQgICVyNCwlcjUsJXI2CisJc2gyYWRkLD0gICVyNCwlcjUsJXI2CisJc2gyYWRkLDwgICVyNCwlcjUsJXI2CisJc2gyYWRkLDw9ICAlcjQsJXI1LCVyNgorCXNoMmFkZCxudXYgICVyNCwlcjUsJXI2CisJc2gyYWRkLHpudiAgJXI0LCVyNSwlcjYKKwlzaDJhZGQsc3YgICVyNCwlcjUsJXI2CisJc2gyYWRkLG9kICAlcjQsJXI1LCVyNgorCXNoMmFkZCx0ciAgJXI0LCVyNSwlcjYKKwlzaDJhZGQsPD4gICVyNCwlcjUsJXI2CisJc2gyYWRkLD49ICAlcjQsJXI1LCVyNgorCXNoMmFkZCw+ICAlcjQsJXI1LCVyNgorCXNoMmFkZCx1diAgJXI0LCVyNSwlcjYKKwlzaDJhZGQsdm56ICAlcjQsJXI1LCVyNgorCXNoMmFkZCxuc3YgICVyNCwlcjUsJXI2CisJc2gyYWRkLGV2ICAlcjQsJXI1LCVyNgorCitzaDJhZGRsX3Rlc3RzCisJc2gyYWRkbCAgJXI0LCVyNSwlcjYKKwlzaDJhZGRsLD0gICVyNCwlcjUsJXI2CisJc2gyYWRkbCw8ICAlcjQsJXI1LCVyNgorCXNoMmFkZGwsPD0gICVyNCwlcjUsJXI2CisJc2gyYWRkbCxudXYgICVyNCwlcjUsJXI2CisJc2gyYWRkbCx6bnYgICVyNCwlcjUsJXI2CisJc2gyYWRkbCxzdiAgJXI0LCVyNSwlcjYKKwlzaDJhZGRsLG9kICAlcjQsJXI1LCVyNgorCXNoMmFkZGwsdHIgICVyNCwlcjUsJXI2CisJc2gyYWRkbCw8PiAgJXI0LCVyNSwlcjYKKwlzaDJhZGRsLD49ICAlcjQsJXI1LCVyNgorCXNoMmFkZGwsPiAgJXI0LCVyNSwlcjYKKwlzaDJhZGRsLHV2ICAlcjQsJXI1LCVyNgorCXNoMmFkZGwsdm56ICAlcjQsJXI1LCVyNgorCXNoMmFkZGwsbnN2ICAlcjQsJXI1LCVyNgorCXNoMmFkZGwsZXYgICVyNCwlcjUsJXI2CisKK3NoMmFkZG9fdGVzdHMKKwlzaDJhZGRvICAlcjQsJXI1LCVyNgorCXNoMmFkZG8sPSAgJXI0LCVyNSwlcjYKKwlzaDJhZGRvLDwgICVyNCwlcjUsJXI2CisJc2gyYWRkbyw8PSAgJXI0LCVyNSwlcjYKKwlzaDJhZGRvLG51diAgJXI0LCVyNSwlcjYKKwlzaDJhZGRvLHpudiAgJXI0LCVyNSwlcjYKKwlzaDJhZGRvLHN2ICAlcjQsJXI1LCVyNgorCXNoMmFkZG8sb2QgICVyNCwlcjUsJXI2CisJc2gyYWRkbyx0ciAgJXI0LCVyNSwlcjYKKwlzaDJhZGRvLDw+ICAlcjQsJXI1LCVyNgorCXNoMmFkZG8sPj0gICVyNCwlcjUsJXI2CisJc2gyYWRkbyw+ICAlcjQsJXI1LCVyNgorCXNoMmFkZG8sdXYgICVyNCwlcjUsJXI2CisJc2gyYWRkbyx2bnogICVyNCwlcjUsJXI2CisJc2gyYWRkbyxuc3YgICVyNCwlcjUsJXI2CisJc2gyYWRkbyxldiAgJXI0LCVyNSwlcjYKKworCitzaDNhZGRfdGVzdHMKKwlzaDNhZGQgICVyNCwlcjUsJXI2CisJc2gzYWRkLD0gICVyNCwlcjUsJXI2CisJc2gzYWRkLDwgICVyNCwlcjUsJXI2CisJc2gzYWRkLDw9ICAlcjQsJXI1LCVyNgorCXNoM2FkZCxudXYgICVyNCwlcjUsJXI2CisJc2gzYWRkLHpudiAgJXI0LCVyNSwlcjYKKwlzaDNhZGQsc3YgICVyNCwlcjUsJXI2CisJc2gzYWRkLG9kICAlcjQsJXI1LCVyNgorCXNoM2FkZCx0ciAgJXI0LCVyNSwlcjYKKwlzaDNhZGQsPD4gICVyNCwlcjUsJXI2CisJc2gzYWRkLD49ICAlcjQsJXI1LCVyNgorCXNoM2FkZCw+ICAlcjQsJXI1LCVyNgorCXNoM2FkZCx1diAgJXI0LCVyNSwlcjYKKwlzaDNhZGQsdm56ICAlcjQsJXI1LCVyNgorCXNoM2FkZCxuc3YgICVyNCwlcjUsJXI2CisJc2gzYWRkLGV2ICAlcjQsJXI1LCVyNgorCitzaDNhZGRsX3Rlc3RzCisJc2gzYWRkbCAgJXI0LCVyNSwlcjYKKwlzaDNhZGRsLD0gICVyNCwlcjUsJXI2CisJc2gzYWRkbCw8ICAlcjQsJXI1LCVyNgorCXNoM2FkZGwsPD0gICVyNCwlcjUsJXI2CisJc2gzYWRkbCxudXYgICVyNCwlcjUsJXI2CisJc2gzYWRkbCx6bnYgICVyNCwlcjUsJXI2CisJc2gzYWRkbCxzdiAgJXI0LCVyNSwlcjYKKwlzaDNhZGRsLG9kICAlcjQsJXI1LCVyNgorCXNoM2FkZGwsdHIgICVyNCwlcjUsJXI2CisJc2gzYWRkbCw8PiAgJXI0LCVyNSwlcjYKKwlzaDNhZGRsLD49ICAlcjQsJXI1LCVyNgorCXNoM2FkZGwsPiAgJXI0LCVyNSwlcjYKKwlzaDNhZGRsLHV2ICAlcjQsJXI1LCVyNgorCXNoM2FkZGwsdm56ICAlcjQsJXI1LCVyNgorCXNoM2FkZGwsbnN2ICAlcjQsJXI1LCVyNgorCXNoM2FkZGwsZXYgICVyNCwlcjUsJXI2CisKK3NoM2FkZG9fdGVzdHMKKwlzaDNhZGRvICAlcjQsJXI1LCVyNgorCXNoM2FkZG8sPSAgJXI0LCVyNSwlcjYKKwlzaDNhZGRvLDwgICVyNCwlcjUsJXI2CisJc2gzYWRkbyw8PSAgJXI0LCVyNSwlcjYKKwlzaDNhZGRvLG51diAgJXI0LCVyNSwlcjYKKwlzaDNhZGRvLHpudiAgJXI0LCVyNSwlcjYKKwlzaDNhZGRvLHN2ICAlcjQsJXI1LCVyNgorCXNoM2FkZG8sb2QgICVyNCwlcjUsJXI2CisJc2gzYWRkbyx0ciAgJXI0LCVyNSwlcjYKKwlzaDNhZGRvLDw+ICAlcjQsJXI1LCVyNgorCXNoM2FkZG8sPj0gICVyNCwlcjUsJXI2CisJc2gzYWRkbyw+ICAlcjQsJXI1LCVyNgorCXNoM2FkZG8sdXYgICVyNCwlcjUsJXI2CisJc2gzYWRkbyx2bnogICVyNCwlcjUsJXI2CisJc2gzYWRkbyxuc3YgICVyNCwlcjUsJXI2CisJc2gzYWRkbyxldiAgJXI0LCVyNSwlcjYKKworCitzdWJfdGVzdHMKKwlzdWIgJXI0LCVyNSwlcjYKKwlzdWIsPSAlcjQsJXI1LCVyNgorCXN1Yiw8ICVyNCwlcjUsJXI2CisJc3ViLDw9ICVyNCwlcjUsJXI2CisJc3ViLDw8ICVyNCwlcjUsJXI2CisJc3ViLDw8PSAlcjQsJXI1LCVyNgorCXN1YixzdiAlcjQsJXI1LCVyNgorCXN1YixvZCAlcjQsJXI1LCVyNgorCXN1Yix0ciAlcjQsJXI1LCVyNgorCXN1Yiw8PiAlcjQsJXI1LCVyNgorCXN1Yiw+PSAlcjQsJXI1LCVyNgorCXN1Yiw+ICVyNCwlcjUsJXI2CisJc3ViLD4+PSAlcjQsJXI1LCVyNgorCXN1Yiw+PiAlcjQsJXI1LCVyNgorCXN1Yixuc3YgJXI0LCVyNSwlcjYKKwlzdWIsZXYgJXI0LCVyNSwlcjYKKworc3Vib190ZXN0cworCXN1Ym8gJXI0LCVyNSwlcjYKKwlzdWJvLD0gJXI0LCVyNSwlcjYKKwlzdWJvLDwgJXI0LCVyNSwlcjYKKwlzdWJvLDw9ICVyNCwlcjUsJXI2CisJc3Vibyw8PCAlcjQsJXI1LCVyNgorCXN1Ym8sPDw9ICVyNCwlcjUsJXI2CisJc3VibyxzdiAlcjQsJXI1LCVyNgorCXN1Ym8sb2QgJXI0LCVyNSwlcjYKKwlzdWJvLHRyICVyNCwlcjUsJXI2CisJc3Vibyw8PiAlcjQsJXI1LCVyNgorCXN1Ym8sPj0gJXI0LCVyNSwlcjYKKwlzdWJvLD4gJXI0LCVyNSwlcjYKKwlzdWJvLD4+PSAlcjQsJXI1LCVyNgorCXN1Ym8sPj4gJXI0LCVyNSwlcjYKKwlzdWJvLG5zdiAlcjQsJXI1LCVyNgorCXN1Ym8sZXYgJXI0LCVyNSwlcjYKKworc3ViYl90ZXN0cworCXN1YmIgJXI0LCVyNSwlcjYKKwlzdWJiLD0gJXI0LCVyNSwlcjYKKwlzdWJiLDwgJXI0LCVyNSwlcjYKKwlzdWJiLDw9ICVyNCwlcjUsJXI2CisJc3ViYiw8PCAlcjQsJXI1LCVyNgorCXN1YmIsPDw9ICVyNCwlcjUsJXI2CisJc3ViYixzdiAlcjQsJXI1LCVyNgorCXN1YmIsb2QgJXI0LCVyNSwlcjYKKwlzdWJiLHRyICVyNCwlcjUsJXI2CisJc3ViYiw8PiAlcjQsJXI1LCVyNgorCXN1YmIsPj0gJXI0LCVyNSwlcjYKKwlzdWJiLD4gJXI0LCVyNSwlcjYKKwlzdWJiLD4+PSAlcjQsJXI1LCVyNgorCXN1YmIsPj4gJXI0LCVyNSwlcjYKKwlzdWJiLG5zdiAlcjQsJXI1LCVyNgorCXN1YmIsZXYgJXI0LCVyNSwlcjYKKworc3ViYm9fdGVzdHMKKwlzdWJibyAlcjQsJXI1LCVyNgorCXN1YmJvLD0gJXI0LCVyNSwlcjYKKwlzdWJibyw8ICVyNCwlcjUsJXI2CisJc3ViYm8sPD0gJXI0LCVyNSwlcjYKKwlzdWJibyw8PCAlcjQsJXI1LCVyNgorCXN1YmJvLDw8PSAlcjQsJXI1LCVyNgorCXN1YmJvLHN2ICVyNCwlcjUsJXI2CisJc3ViYm8sb2QgJXI0LCVyNSwlcjYKKwlzdWJibyx0ciAlcjQsJXI1LCVyNgorCXN1YmJvLDw+ICVyNCwlcjUsJXI2CisJc3ViYm8sPj0gJXI0LCVyNSwlcjYKKwlzdWJibyw+ICVyNCwlcjUsJXI2CisJc3ViYm8sPj49ICVyNCwlcjUsJXI2CisJc3ViYm8sPj4gJXI0LCVyNSwlcjYKKwlzdWJibyxuc3YgJXI0LCVyNSwlcjYKKwlzdWJibyxldiAlcjQsJXI1LCVyNgorCitzdWJ0X3Rlc3RzCisJc3VidCAlcjQsJXI1LCVyNgorCXN1YnQsPSAlcjQsJXI1LCVyNgorCXN1YnQsPCAlcjQsJXI1LCVyNgorCXN1YnQsPD0gJXI0LCVyNSwlcjYKKwlzdWJ0LDw8ICVyNCwlcjUsJXI2CisJc3VidCw8PD0gJXI0LCVyNSwlcjYKKwlzdWJ0LHN2ICVyNCwlcjUsJXI2CisJc3VidCxvZCAlcjQsJXI1LCVyNgorCXN1YnQsdHIgJXI0LCVyNSwlcjYKKwlzdWJ0LDw+ICVyNCwlcjUsJXI2CisJc3VidCw+PSAlcjQsJXI1LCVyNgorCXN1YnQsPiAlcjQsJXI1LCVyNgorCXN1YnQsPj49ICVyNCwlcjUsJXI2CisJc3VidCw+PiAlcjQsJXI1LCVyNgorCXN1YnQsbnN2ICVyNCwlcjUsJXI2CisJc3VidCxldiAlcjQsJXI1LCVyNgorCitzdWJ0b190ZXN0cworCXN1YnRvICVyNCwlcjUsJXI2CisJc3VidG8sPSAlcjQsJXI1LCVyNgorCXN1YnRvLDwgJXI0LCVyNSwlcjYKKwlzdWJ0byw8PSAlcjQsJXI1LCVyNgorCXN1YnRvLDw8ICVyNCwlcjUsJXI2CisJc3VidG8sPDw9ICVyNCwlcjUsJXI2CisJc3VidG8sc3YgJXI0LCVyNSwlcjYKKwlzdWJ0byxvZCAlcjQsJXI1LCVyNgorCXN1YnRvLHRyICVyNCwlcjUsJXI2CisJc3VidG8sPD4gJXI0LCVyNSwlcjYKKwlzdWJ0byw+PSAlcjQsJXI1LCVyNgorCXN1YnRvLD4gJXI0LCVyNSwlcjYKKwlzdWJ0byw+Pj0gJXI0LCVyNSwlcjYKKwlzdWJ0byw+PiAlcjQsJXI1LCVyNgorCXN1YnRvLG5zdiAlcjQsJXI1LCVyNgorCXN1YnRvLGV2ICVyNCwlcjUsJXI2CisKK2RzX3Rlc3RzCisJZHMgJXI0LCVyNSwlcjYKKwlkcyw9ICVyNCwlcjUsJXI2CisJZHMsPCAlcjQsJXI1LCVyNgorCWRzLDw9ICVyNCwlcjUsJXI2CisJZHMsPDwgJXI0LCVyNSwlcjYKKwlkcyw8PD0gJXI0LCVyNSwlcjYKKwlkcyxzdiAlcjQsJXI1LCVyNgorCWRzLG9kICVyNCwlcjUsJXI2CisJZHMsdHIgJXI0LCVyNSwlcjYKKwlkcyw8PiAlcjQsJXI1LCVyNgorCWRzLD49ICVyNCwlcjUsJXI2CisJZHMsPiAlcjQsJXI1LCVyNgorCWRzLD4+PSAlcjQsJXI1LCVyNgorCWRzLD4+ICVyNCwlcjUsJXI2CisJZHMsbnN2ICVyNCwlcjUsJXI2CisJZHMsZXYgJXI0LCVyNSwlcjYKKworY29tY2xyX3Rlc3RzCisJY29tY2xyICVyNCwlcjUsJXI2CisJY29tY2xyLD0gJXI0LCVyNSwlcjYKKwljb21jbHIsPCAlcjQsJXI1LCVyNgorCWNvbWNsciw8PSAlcjQsJXI1LCVyNgorCWNvbWNsciw8PCAlcjQsJXI1LCVyNgorCWNvbWNsciw8PD0gJXI0LCVyNSwlcjYKKwljb21jbHIsc3YgJXI0LCVyNSwlcjYKKwljb21jbHIsb2QgJXI0LCVyNSwlcjYKKwljb21jbHIsdHIgJXI0LCVyNSwlcjYKKwljb21jbHIsPD4gJXI0LCVyNSwlcjYKKwljb21jbHIsPj0gJXI0LCVyNSwlcjYKKwljb21jbHIsPiAlcjQsJXI1LCVyNgorCWNvbWNsciw+Pj0gJXI0LCVyNSwlcjYKKwljb21jbHIsPj4gJXI0LCVyNSwlcjYKKwljb21jbHIsbnN2ICVyNCwlcjUsJXI2CisJY29tY2xyLGV2ICVyNCwlcjUsJXI2CisKK29yX3Rlc3RzCisJb3IgJXI0LCVyNSwlcjYKKwlvciw9ICVyNCwlcjUsJXI2CisJb3IsPCAlcjQsJXI1LCVyNgorCW9yLDw9ICVyNCwlcjUsJXI2CisJb3Isb2QgJXI0LCVyNSwlcjYKKwlvcix0ciAlcjQsJXI1LCVyNgorCW9yLDw+ICVyNCwlcjUsJXI2CisJb3IsPj0gJXI0LCVyNSwlcjYKKwlvciw+ICVyNCwlcjUsJXI2CisJb3IsZXYgJXI0LCVyNSwlcjYKK3hvcl90ZXN0cworCXhvciAlcjQsJXI1LCVyNgorCXhvciw9ICVyNCwlcjUsJXI2CisJeG9yLDwgJXI0LCVyNSwlcjYKKwl4b3IsPD0gJXI0LCVyNSwlcjYKKwl4b3Isb2QgJXI0LCVyNSwlcjYKKwl4b3IsdHIgJXI0LCVyNSwlcjYKKwl4b3IsPD4gJXI0LCVyNSwlcjYKKwl4b3IsPj0gJXI0LCVyNSwlcjYKKwl4b3IsPiAlcjQsJXI1LCVyNgorCXhvcixldiAlcjQsJXI1LCVyNgorCithbmRfdGVzdHMKKwlhbmQgJXI0LCVyNSwlcjYKKwlhbmQsPSAlcjQsJXI1LCVyNgorCWFuZCw8ICVyNCwlcjUsJXI2CisJYW5kLDw9ICVyNCwlcjUsJXI2CisJYW5kLG9kICVyNCwlcjUsJXI2CisJYW5kLHRyICVyNCwlcjUsJXI2CisJYW5kLDw+ICVyNCwlcjUsJXI2CisJYW5kLD49ICVyNCwlcjUsJXI2CisJYW5kLD4gJXI0LCVyNSwlcjYKKwlhbmQsZXYgJXI0LCVyNSwlcjYKKworYW5kY21fdGVzdHMKKwlhbmRjbSAlcjQsJXI1LCVyNgorCWFuZGNtLD0gJXI0LCVyNSwlcjYKKwlhbmRjbSw8ICVyNCwlcjUsJXI2CisJYW5kY20sPD0gJXI0LCVyNSwlcjYKKwlhbmRjbSxvZCAlcjQsJXI1LCVyNgorCWFuZGNtLHRyICVyNCwlcjUsJXI2CisJYW5kY20sPD4gJXI0LCVyNSwlcjYKKwlhbmRjbSw+PSAlcjQsJXI1LCVyNgorCWFuZGNtLD4gJXI0LCVyNSwlcjYKKwlhbmRjbSxldiAlcjQsJXI1LCVyNgorCisKK3V4b3JfdGVzdHMKKwl1eG9yICVyNCwlcjUsJXI2CisJdXhvcixzYnogJXI0LCVyNSwlcjYKKwl1eG9yLHNoeiAlcjQsJXI1LCVyNgorCXV4b3Isc2RjICVyNCwlcjUsJXI2CisJdXhvcixzYmMgJXI0LCVyNSwlcjYKKwl1eG9yLHNoYyAlcjQsJXI1LCVyNgorCXV4b3IsdHIgJXI0LCVyNSwlcjYKKwl1eG9yLG5ieiAlcjQsJXI1LCVyNgorCXV4b3Isbmh6ICVyNCwlcjUsJXI2CisJdXhvcixuZGMgJXI0LCVyNSwlcjYKKwl1eG9yLG5iYyAlcjQsJXI1LCVyNgorCXV4b3IsbmhjICVyNCwlcjUsJXI2CisKK3VhZGRjbV90ZXN0cworCXVhZGRjbSAlcjQsJXI1LCVyNgorCXVhZGRjbSxzYnogJXI0LCVyNSwlcjYKKwl1YWRkY20sc2h6ICVyNCwlcjUsJXI2CisJdWFkZGNtLHNkYyAlcjQsJXI1LCVyNgorCXVhZGRjbSxzYmMgJXI0LCVyNSwlcjYKKwl1YWRkY20sc2hjICVyNCwlcjUsJXI2CisJdWFkZGNtLHRyICVyNCwlcjUsJXI2CisJdWFkZGNtLG5ieiAlcjQsJXI1LCVyNgorCXVhZGRjbSxuaHogJXI0LCVyNSwlcjYKKwl1YWRkY20sbmRjICVyNCwlcjUsJXI2CisJdWFkZGNtLG5iYyAlcjQsJXI1LCVyNgorCXVhZGRjbSxuaGMgJXI0LCVyNSwlcjYKKwordWFkZGNtdF90ZXN0cworCXVhZGRjbXQgJXI0LCVyNSwlcjYKKwl1YWRkY210LHNieiAlcjQsJXI1LCVyNgorCXVhZGRjbXQsc2h6ICVyNCwlcjUsJXI2CisJdWFkZGNtdCxzZGMgJXI0LCVyNSwlcjYKKwl1YWRkY210LHNiYyAlcjQsJXI1LCVyNgorCXVhZGRjbXQsc2hjICVyNCwlcjUsJXI2CisJdWFkZGNtdCx0ciAlcjQsJXI1LCVyNgorCXVhZGRjbXQsbmJ6ICVyNCwlcjUsJXI2CisJdWFkZGNtdCxuaHogJXI0LCVyNSwlcjYKKwl1YWRkY210LG5kYyAlcjQsJXI1LCVyNgorCXVhZGRjbXQsbmJjICVyNCwlcjUsJXI2CisJdWFkZGNtdCxuaGMgJXI0LCVyNSwlcjYKKworZGNvcl90ZXN0cworCWRjb3IgJXI0LCVyNQorCWRjb3Isc2J6ICVyNCwlcjUKKwlkY29yLHNoeiAlcjQsJXI1CisJZGNvcixzZGMgJXI0LCVyNQorCWRjb3Isc2JjICVyNCwlcjUKKwlkY29yLHNoYyAlcjQsJXI1CisJZGNvcix0ciAlcjQsJXI1CisJZGNvcixuYnogJXI0LCVyNQorCWRjb3Isbmh6ICVyNCwlcjUKKwlkY29yLG5kYyAlcjQsJXI1CisJZGNvcixuYmMgJXI0LCVyNQorCWRjb3IsbmhjICVyNCwlcjUKKworaWRjb3JfdGVzdHMKKwlpZGNvciAlcjQsJXI1CisJaWRjb3Isc2J6ICVyNCwlcjUKKwlpZGNvcixzaHogJXI0LCVyNQorCWlkY29yLHNkYyAlcjQsJXI1CisJaWRjb3Isc2JjICVyNCwlcjUKKwlpZGNvcixzaGMgJXI0LCVyNQorCWlkY29yLHRyICVyNCwlcjUKKwlpZGNvcixuYnogJXI0LCVyNQorCWlkY29yLG5oeiAlcjQsJXI1CisJaWRjb3IsbmRjICVyNCwlcjUKKwlpZGNvcixuYmMgJXI0LCVyNQorCWlkY29yLG5oYyAlcjQsJXI1CisKK2FkZGlfdGVzdHMKKwlhZGRpICAxMjMsJXI1LCVyNgorCWFkZGksPSAgMTIzLCVyNSwlcjYKKwlhZGRpLDwgIDEyMywlcjUsJXI2CisJYWRkaSw8PSAgMTIzLCVyNSwlcjYKKwlhZGRpLG51diAgMTIzLCVyNSwlcjYKKwlhZGRpLHpudiAgMTIzLCVyNSwlcjYKKwlhZGRpLHN2ICAxMjMsJXI1LCVyNgorCWFkZGksb2QgIDEyMywlcjUsJXI2CisJYWRkaSx0ciAgMTIzLCVyNSwlcjYKKwlhZGRpLDw+ICAxMjMsJXI1LCVyNgorCWFkZGksPj0gIDEyMywlcjUsJXI2CisJYWRkaSw+ICAxMjMsJXI1LCVyNgorCWFkZGksdXYgIDEyMywlcjUsJXI2CisJYWRkaSx2bnogIDEyMywlcjUsJXI2CisJYWRkaSxuc3YgIDEyMywlcjUsJXI2CisJYWRkaSxldiAgMTIzLCVyNSwlcjYKKworYWRkaW9fdGVzdHMKKwlhZGRpbyAgMTIzLCVyNSwlcjYKKwlhZGRpbyw9ICAxMjMsJXI1LCVyNgorCWFkZGlvLDwgIDEyMywlcjUsJXI2CisJYWRkaW8sPD0gIDEyMywlcjUsJXI2CisJYWRkaW8sbnV2ICAxMjMsJXI1LCVyNgorCWFkZGlvLHpudiAgMTIzLCVyNSwlcjYKKwlhZGRpbyxzdiAgMTIzLCVyNSwlcjYKKwlhZGRpbyxvZCAgMTIzLCVyNSwlcjYKKwlhZGRpbyx0ciAgMTIzLCVyNSwlcjYKKwlhZGRpbyw8PiAgMTIzLCVyNSwlcjYKKwlhZGRpbyw+PSAgMTIzLCVyNSwlcjYKKwlhZGRpbyw+ICAxMjMsJXI1LCVyNgorCWFkZGlvLHV2ICAxMjMsJXI1LCVyNgorCWFkZGlvLHZueiAgMTIzLCVyNSwlcjYKKwlhZGRpbyxuc3YgIDEyMywlcjUsJXI2CisJYWRkaW8sZXYgIDEyMywlcjUsJXI2CisKK2FkZGl0X3Rlc3RzCisJYWRkaXQgIDEyMywlcjUsJXI2CisJYWRkaXQsPSAgMTIzLCVyNSwlcjYKKwlhZGRpdCw8ICAxMjMsJXI1LCVyNgorCWFkZGl0LDw9ICAxMjMsJXI1LCVyNgorCWFkZGl0LG51diAgMTIzLCVyNSwlcjYKKwlhZGRpdCx6bnYgIDEyMywlcjUsJXI2CisJYWRkaXQsc3YgIDEyMywlcjUsJXI2CisJYWRkaXQsb2QgIDEyMywlcjUsJXI2CisJYWRkaXQsdHIgIDEyMywlcjUsJXI2CisJYWRkaXQsPD4gIDEyMywlcjUsJXI2CisJYWRkaXQsPj0gIDEyMywlcjUsJXI2CisJYWRkaXQsPiAgMTIzLCVyNSwlcjYKKwlhZGRpdCx1diAgMTIzLCVyNSwlcjYKKwlhZGRpdCx2bnogIDEyMywlcjUsJXI2CisJYWRkaXQsbnN2ICAxMjMsJXI1LCVyNgorCWFkZGl0LGV2ICAxMjMsJXI1LCVyNgorCithZGRpdG9fdGVzdHMKKwlhZGRpdG8gIDEyMywlcjUsJXI2CisJYWRkaXRvLD0gIDEyMywlcjUsJXI2CisJYWRkaXRvLDwgIDEyMywlcjUsJXI2CisJYWRkaXRvLDw9ICAxMjMsJXI1LCVyNgorCWFkZGl0byxudXYgIDEyMywlcjUsJXI2CisJYWRkaXRvLHpudiAgMTIzLCVyNSwlcjYKKwlhZGRpdG8sc3YgIDEyMywlcjUsJXI2CisJYWRkaXRvLG9kICAxMjMsJXI1LCVyNgorCWFkZGl0byx0ciAgMTIzLCVyNSwlcjYKKwlhZGRpdG8sPD4gIDEyMywlcjUsJXI2CisJYWRkaXRvLD49ICAxMjMsJXI1LCVyNgorCWFkZGl0byw+ICAxMjMsJXI1LCVyNgorCWFkZGl0byx1diAgMTIzLCVyNSwlcjYKKwlhZGRpdG8sdm56ICAxMjMsJXI1LCVyNgorCWFkZGl0byxuc3YgIDEyMywlcjUsJXI2CisJYWRkaXRvLGV2ICAxMjMsJXI1LCVyNgorCitzdWJpX3Rlc3RzCisJc3ViaSAxMjMsJXI1LCVyNgorCXN1YmksPSAxMjMsJXI1LCVyNgorCXN1YmksPCAxMjMsJXI1LCVyNgorCXN1YmksPD0gMTIzLCVyNSwlcjYKKwlzdWJpLDw8IDEyMywlcjUsJXI2CisJc3ViaSw8PD0gMTIzLCVyNSwlcjYKKwlzdWJpLHN2IDEyMywlcjUsJXI2CisJc3ViaSxvZCAxMjMsJXI1LCVyNgorCXN1YmksdHIgMTIzLCVyNSwlcjYKKwlzdWJpLDw+IDEyMywlcjUsJXI2CisJc3ViaSw+PSAxMjMsJXI1LCVyNgorCXN1YmksPiAxMjMsJXI1LCVyNgorCXN1YmksPj49IDEyMywlcjUsJXI2CisJc3ViaSw+PiAxMjMsJXI1LCVyNgorCXN1YmksbnN2IDEyMywlcjUsJXI2CisJc3ViaSxldiAxMjMsJXI1LCVyNgorCitzdWJpb190ZXN0cworCXN1YmlvIDEyMywlcjUsJXI2CisJc3ViaW8sPSAxMjMsJXI1LCVyNgorCXN1YmlvLDwgMTIzLCVyNSwlcjYKKwlzdWJpbyw8PSAxMjMsJXI1LCVyNgorCXN1YmlvLDw8IDEyMywlcjUsJXI2CisJc3ViaW8sPDw9IDEyMywlcjUsJXI2CisJc3ViaW8sc3YgMTIzLCVyNSwlcjYKKwlzdWJpbyxvZCAxMjMsJXI1LCVyNgorCXN1YmlvLHRyIDEyMywlcjUsJXI2CisJc3ViaW8sPD4gMTIzLCVyNSwlcjYKKwlzdWJpbyw+PSAxMjMsJXI1LCVyNgorCXN1YmlvLD4gMTIzLCVyNSwlcjYKKwlzdWJpbyw+Pj0gMTIzLCVyNSwlcjYKKwlzdWJpbyw+PiAxMjMsJXI1LCVyNgorCXN1YmlvLG5zdiAxMjMsJXI1LCVyNgorCXN1YmlvLGV2IDEyMywlcjUsJXI2CisKK2NvbWljbHJfdGVzdHMKKwljb21pY2xyIDEyMywlcjUsJXI2CisJY29taWNsciw9IDEyMywlcjUsJXI2CisJY29taWNsciw8IDEyMywlcjUsJXI2CisJY29taWNsciw8PSAxMjMsJXI1LCVyNgorCWNvbWljbHIsPDwgMTIzLCVyNSwlcjYKKwljb21pY2xyLDw8PSAxMjMsJXI1LCVyNgorCWNvbWljbHIsc3YgMTIzLCVyNSwlcjYKKwljb21pY2xyLG9kIDEyMywlcjUsJXI2CisJY29taWNscix0ciAxMjMsJXI1LCVyNgorCWNvbWljbHIsPD4gMTIzLCVyNSwlcjYKKwljb21pY2xyLD49IDEyMywlcjUsJXI2CisJY29taWNsciw+IDEyMywlcjUsJXI2CisJY29taWNsciw+Pj0gMTIzLCVyNSwlcjYKKwljb21pY2xyLD4+IDEyMywlcjUsJXI2CisJY29taWNscixuc3YgMTIzLCVyNSwlcjYKKwljb21pY2xyLGV2IDEyMywlcjUsJXI2CisKK3ZzaGRfdGVzdHMKKwl2c2hkICVyNCwlcjUsJXI2CisJdnNoZCw9ICVyNCwlcjUsJXI2CisJdnNoZCw8ICVyNCwlcjUsJXI2CisJdnNoZCxvZCAlcjQsJXI1LCVyNgorCXZzaGQsdHIgJXI0LCVyNSwlcjYKKwl2c2hkLDw+ICVyNCwlcjUsJXI2CisJdnNoZCw+PSAlcjQsJXI1LCVyNgorCXZzaGQsZXYgJXI0LCVyNSwlcjYKKworc2hkX3Rlc3RzCisJc2hkICVyNCwlcjUsNSwlcjYKKwlzaGQsPSAlcjQsJXI1LDUsJXI2CisJc2hkLDwgJXI0LCVyNSw1LCVyNgorCXNoZCxvZCAlcjQsJXI1LDUsJXI2CisJc2hkLHRyICVyNCwlcjUsNSwlcjYKKwlzaGQsPD4gJXI0LCVyNSw1LCVyNgorCXNoZCw+PSAlcjQsJXI1LDUsJXI2CisJc2hkLGV2ICVyNCwlcjUsNSwlcjYKKworZXh0cnVfdGVzdHMKKwlleHRydSAlcjQsNSwxMCwlcjYKKwlleHRydSw9ICVyNCw1LDEwLCVyNgorCWV4dHJ1LDwgJXI0LDUsMTAsJXI2CisJZXh0cnUsb2QgJXI0LDUsMTAsJXI2CisJZXh0cnUsdHIgJXI0LDUsMTAsJXI2CisJZXh0cnUsPD4gJXI0LDUsMTAsJXI2CisJZXh0cnUsPj0gJXI0LDUsMTAsJXI2CisJZXh0cnUsZXYgJXI0LDUsMTAsJXI2CisKK2V4dHJzX3Rlc3RzCisJZXh0cnMgJXI0LDUsMTAsJXI2CisJZXh0cnMsPSAlcjQsNSwxMCwlcjYKKwlleHRycyw8ICVyNCw1LDEwLCVyNgorCWV4dHJzLG9kICVyNCw1LDEwLCVyNgorCWV4dHJzLHRyICVyNCw1LDEwLCVyNgorCWV4dHJzLDw+ICVyNCw1LDEwLCVyNgorCWV4dHJzLD49ICVyNCw1LDEwLCVyNgorCWV4dHJzLGV2ICVyNCw1LDEwLCVyNgorCit6ZGVwX3Rlc3RzCisJemRlcCAlcjQsNSwxMCwlcjYKKwl6ZGVwLD0gJXI0LDUsMTAsJXI2CisJemRlcCw8ICVyNCw1LDEwLCVyNgorCXpkZXAsb2QgJXI0LDUsMTAsJXI2CisJemRlcCx0ciAlcjQsNSwxMCwlcjYKKwl6ZGVwLDw+ICVyNCw1LDEwLCVyNgorCXpkZXAsPj0gJXI0LDUsMTAsJXI2CisJemRlcCxldiAlcjQsNSwxMCwlcjYKKworZGVwX3Rlc3RzCisJZGVwICVyNCw1LDEwLCVyNgorCWRlcCw9ICVyNCw1LDEwLCVyNgorCWRlcCw8ICVyNCw1LDEwLCVyNgorCWRlcCxvZCAlcjQsNSwxMCwlcjYKKwlkZXAsdHIgJXI0LDUsMTAsJXI2CisJZGVwLDw+ICVyNCw1LDEwLCVyNgorCWRlcCw+PSAlcjQsNSwxMCwlcjYKKwlkZXAsZXYgJXI0LDUsMTAsJXI2CisKK3ZleHRydV90ZXN0cworCXZleHRydSAlcjQsNSwlcjYKKwl2ZXh0cnUsPSAlcjQsNSwlcjYKKwl2ZXh0cnUsPCAlcjQsNSwlcjYKKwl2ZXh0cnUsb2QgJXI0LDUsJXI2CisJdmV4dHJ1LHRyICVyNCw1LCVyNgorCXZleHRydSw8PiAlcjQsNSwlcjYKKwl2ZXh0cnUsPj0gJXI0LDUsJXI2CisJdmV4dHJ1LGV2ICVyNCw1LCVyNgorCit2ZXh0cnNfdGVzdHMKKwl2ZXh0cnMgJXI0LDUsJXI2CisJdmV4dHJzLD0gJXI0LDUsJXI2CisJdmV4dHJzLDwgJXI0LDUsJXI2CisJdmV4dHJzLG9kICVyNCw1LCVyNgorCXZleHRycyx0ciAlcjQsNSwlcjYKKwl2ZXh0cnMsPD4gJXI0LDUsJXI2CisJdmV4dHJzLD49ICVyNCw1LCVyNgorCXZleHRycyxldiAlcjQsNSwlcjYKKworenZkZXBfdGVzdHMKKwl6dmRlcCAlcjQsNSwlcjYKKwl6dmRlcCw9ICVyNCw1LCVyNgorCXp2ZGVwLDwgJXI0LDUsJXI2CisJenZkZXAsb2QgJXI0LDUsJXI2CisJenZkZXAsdHIgJXI0LDUsJXI2CisJenZkZXAsPD4gJXI0LDUsJXI2CisJenZkZXAsPj0gJXI0LDUsJXI2CisJenZkZXAsZXYgJXI0LDUsJXI2CisKKwordmRlcF90ZXN0cworCXZkZXAgJXI0LDUsJXI2CisJdmRlcCw9ICVyNCw1LCVyNgorCXZkZXAsPCAlcjQsNSwlcjYKKwl2ZGVwLG9kICVyNCw1LCVyNgorCXZkZXAsdHIgJXI0LDUsJXI2CisJdmRlcCw8PiAlcjQsNSwlcjYKKwl2ZGVwLD49ICVyNCw1LCVyNgorCXZkZXAsZXYgJXI0LDUsJXI2CisKK3ZkZXBpX3Rlc3RzCisJdmRlcGkgLTEsNSwlcjYKKwl2ZGVwaSw9IC0xLDUsJXI2CisJdmRlcGksPCAtMSw1LCVyNgorCXZkZXBpLG9kIC0xLDUsJXI2CisJdmRlcGksdHIgLTEsNSwlcjYKKwl2ZGVwaSw8PiAtMSw1LCVyNgorCXZkZXBpLD49IC0xLDUsJXI2CisJdmRlcGksZXYgLTEsNSwlcjYKKworenZkZXBpX3Rlc3RzCisJenZkZXBpIC0xLDUsJXI2CisJenZkZXBpLD0gLTEsNSwlcjYKKwl6dmRlcGksPCAtMSw1LCVyNgorCXp2ZGVwaSxvZCAtMSw1LCVyNgorCXp2ZGVwaSx0ciAtMSw1LCVyNgorCXp2ZGVwaSw8PiAtMSw1LCVyNgorCXp2ZGVwaSw+PSAtMSw1LCVyNgorCXp2ZGVwaSxldiAtMSw1LCVyNgorCitkZXBpX3Rlc3RzCisJZGVwaSAtMSw0LDEwLCVyNgorCWRlcGksPSAtMSw0LDEwLCVyNgorCWRlcGksPCAtMSw0LDEwLCVyNgorCWRlcGksb2QgLTEsNCwxMCwlcjYKKwlkZXBpLHRyIC0xLDQsMTAsJXI2CisJZGVwaSw8PiAtMSw0LDEwLCVyNgorCWRlcGksPj0gLTEsNCwxMCwlcjYKKwlkZXBpLGV2IC0xLDQsMTAsJXI2CisKK3pkZXBpX3Rlc3RzCisJemRlcGkgLTEsNCwxMCwlcjYKKwl6ZGVwaSw9IC0xLDQsMTAsJXI2CisJemRlcGksPCAtMSw0LDEwLCVyNgorCXpkZXBpLG9kIC0xLDQsMTAsJXI2CisJemRlcGksdHIgLTEsNCwxMCwlcjYKKwl6ZGVwaSw8PiAtMSw0LDEwLCVyNgorCXpkZXBpLD49IC0xLDQsMTAsJXI2CisJemRlcGksZXYgLTEsNCwxMCwlcjYKKworCitzeXN0ZW1fY29udHJvbF90ZXN0cworCWJyZWFrIDUsMTIKKwlyZmkKKwlyZmlyCisJc3NtIDUsJXI0CisJcnNtIDUsJXI0CisJbXRzbSAlcjQKKwlsZHNpZCAoJXNyMCwlcjUpLCVyNAorCW10c3AgJXI0LCVzcjAKKwltdGN0bCAlcjQsJWNyMTAKKwltZnNwICVzcjAsJXI0CisJbWZjdGwgJWNyMTAsJXI0CisJc3luYworCXN5bmNkbWEKKwlkaWFnIDEyMzQKKworcHJvYmVfdGVzdHMKKwlwcm9iZXIgKCVzcjAsJXI1KSwlcjYsJXI3CisJcHJvYmVyaSAoJXNyMCwlcjUpLDEsJXI3CisJcHJvYmV3ICglc3IwLCVyNSksJXI2LCVyNworCXByb2Jld2kgKCVzcjAsJXI1KSwxLCVyNworCQorbHBhX3Rlc3RzCisJbHBhICVyNCglc3IwLCVyNSksJXI2CisJbHBhLG0gJXI0KCVzcjAsJXI1KSwlcjYKKwlsaGEgJXI0KCVzcjAsJXI1KSwlcjYKKwlsaGEsbSAlcjQoJXNyMCwlcjUpLCVyNgorCWxjaSAlcjQoJXNyMCwlcjUpLCVyNgorCitwdXJnZV90ZXN0cworCXBkdGxiICVyNCglc3IwLCVyNSkKKwlwZHRsYixtICVyNCglc3IwLCVyNSkKKwlwaXRsYiAlcjQoJXNyMCwlcjUpCisJcGl0bGIsbSAlcjQoJXNyMCwlcjUpCisJcGR0bGJlICVyNCglc3IwLCVyNSkKKwlwZHRsYmUsbSAlcjQoJXNyMCwlcjUpCisJcGl0bGJlICVyNCglc3IwLCVyNSkKKwlwaXRsYmUsbSAlcjQoJXNyMCwlcjUpCisJcGRjICVyNCglc3IwLCVyNSkKKwlwZGMsbSAlcjQoJXNyMCwlcjUpCisJZmRjICVyNCglc3IwLCVyNSkKKwlmZGMsbSAlcjQoJXNyMCwlcjUpCisJZmljICVyNCglc3IwLCVyNSkKKwlmaWMsbSAlcjQoJXNyMCwlcjUpCisJZmRjZSAlcjQoJXNyMCwlcjUpCisJZmRjZSxtICVyNCglc3IwLCVyNSkKKwlmaWNlICVyNCglc3IwLCVyNSkKKwlmaWNlLG0gJXI0KCVzcjAsJXI1KQorCitpbnNlcnRfdGVzdHMKKwlpZHRsYmEgJXI0LCglc3IwLCVyNSkKKwlpaXRsYmEgJXI0LCglc3IwLCVyNSkKKwlpZHRsYnAgJXI0LCglc3IwLCVyNSkKKwlpaXRsYnAgJXI0LCglc3IwLCVyNSkKKworZnB1X21pc2NfdGVzdHMKKwlmdGVzdAorCitmcHVfbWVtb3J5X2luZGV4aW5nX3Rlc3RzCisJZmxkd3ggJXI0KCVzcjAsJXI1KSwlZnI2CisJZmxkd3gscyAlcjQoJXNyMCwlcjUpLCVmcjYKKwlmbGR3eCxtICVyNCglc3IwLCVyNSksJWZyNgorCWZsZHd4LHNtICVyNCglc3IwLCVyNSksJWZyNgorCWZsZGR4ICVyNCglc3IwLCVyNSksJWZyNgorCWZsZGR4LHMgJXI0KCVzcjAsJXI1KSwlZnI2CisJZmxkZHgsbSAlcjQoJXNyMCwlcjUpLCVmcjYKKwlmbGRkeCxzbSAlcjQoJXNyMCwlcjUpLCVmcjYKKwlmc3R3eCAlZnI2LCVyNCglc3IwLCVyNSkKKwlmc3R3eCxzICVmcjYsJXI0KCVzcjAsJXI1KQorCWZzdHd4LG0gJWZyNiwlcjQoJXNyMCwlcjUpCisJZnN0d3gsc20gJWZyNiwlcjQoJXNyMCwlcjUpCisJZnN0ZHggJWZyNiwlcjQoJXNyMCwlcjUpCisJZnN0ZHgscyAlZnI2LCVyNCglc3IwLCVyNSkKKwlmc3RkeCxtICVmcjYsJXI0KCVzcjAsJXI1KQorCWZzdGR4LHNtICVmcjYsJXI0KCVzcjAsJXI1KQorCWZzdHF4ICVmcjYsJXI0KCVzcjAsJXI1KQorCWZzdHF4LHMgJWZyNiwlcjQoJXNyMCwlcjUpCisJZnN0cXgsbSAlZnI2LCVyNCglc3IwLCVyNSkKKwlmc3RxeCxzbSAlZnI2LCVyNCglc3IwLCVyNSkKKworZnB1X3Nob3J0X21lbW9yeV90ZXN0cworCWZsZHdzIDAoJXNyMCwlcjUpLCVmcjYKKwlmbGR3cyxtYiAwKCVzcjAsJXI1KSwlZnI2CisJZmxkd3MsbWEgMCglc3IwLCVyNSksJWZyNgorCWZsZGRzIDAoJXNyMCwlcjUpLCVmcjYKKwlmbGRkcyxtYiAwKCVzcjAsJXI1KSwlZnI2CisJZmxkZHMsbWEgMCglc3IwLCVyNSksJWZyNgorCWZzdHdzICVmcjYsMCglc3IwLCVyNSkKKwlmc3R3cyxtYiAlZnI2LDAoJXNyMCwlcjUpCisJZnN0d3MsbWEgJWZyNiwwKCVzcjAsJXI1KQorCWZzdGRzICVmcjYsMCglc3IwLCVyNSkKKwlmc3RkcyxtYiAlZnI2LDAoJXNyMCwlcjUpCisJZnN0ZHMsbWEgJWZyNiwwKCVzcjAsJXI1KQorCWZzdHFzICVmcjYsMCglc3IwLCVyNSkKKwlmc3RxcyxtYiAlZnI2LDAoJXNyMCwlcjUpCisJZnN0cXMsbWEgJWZyNiwwKCVzcjAsJXI1KQorCisKK2ZjcHlfdGVzdHMKKwlmY3B5LHNnbCAlZnI1LCVmcjEwCisJZmNweSxkYmwgJWZyNSwlZnIxMAorCWZjcHkscXVhZCAlZnI1LCVmcjEwCisJZmNweSxzZ2wgJWZyMjAsJWZyMjQKKwlmY3B5LGRibCAlZnIyMCwlZnIyNAorCitmYWJzX3Rlc3RzCisJZmFicyxzZ2wgJWZyNSwlZnIxMAorCWZhYnMsZGJsICVmcjUsJWZyMTAKKwlmYWJzLHF1YWQgJWZyNSwlZnIxMAorCWZhYnMsc2dsICVmcjIwLCVmcjI0CisJZmFicyxkYmwgJWZyMjAsJWZyMjQKKworZnNxcnRfdGVzdHMKKwlmc3FydCxzZ2wgJWZyNSwlZnIxMAorCWZzcXJ0LGRibCAlZnI1LCVmcjEwCisJZnNxcnQscXVhZCAlZnI1LCVmcjEwCisJZnNxcnQsc2dsICVmcjIwLCVmcjI0CisJZnNxcnQsZGJsICVmcjIwLCVmcjI0CisKK2ZybmRfdGVzdHMKKwlmcm5kLHNnbCAlZnI1LCVmcjEwCisJZnJuZCxkYmwgJWZyNSwlZnIxMAorCWZybmQscXVhZCAlZnI1LCVmcjEwCisJZnJuZCxzZ2wgJWZyMjAsJWZyMjQKKwlmcm5kLGRibCAlZnIyMCwlZnIyNAorCQorZmNudmZmX3Rlc3RzCisJZmNudmZmLHNnbCxzZ2wgJWZyNSwlZnIxMAorCWZjbnZmZixzZ2wsZGJsICVmcjUsJWZyMTAKKwlmY252ZmYsc2dsLHF1YWQgJWZyNSwlZnIxMAorCWZjbnZmZixkYmwsc2dsICVmcjUsJWZyMTAKKwlmY252ZmYsZGJsLGRibCAlZnI1LCVmcjEwCisJZmNudmZmLGRibCxxdWFkICVmcjUsJWZyMTAKKwlmY252ZmYscXVhZCxzZ2wgJWZyNSwlZnIxMAorCWZjbnZmZixxdWFkLGRibCAlZnI1LCVmcjEwCisJZmNudmZmLHF1YWQscXVhZCAlZnI1LCVmcjEwCisJZmNudmZmLHNnbCxzZ2wgJWZyMjAsJWZyMjQKKwlmY252ZmYsc2dsLGRibCAlZnIyMCwlZnIyNAorCWZjbnZmZixzZ2wscXVhZCAlZnIyMCwlZnIyNAorCWZjbnZmZixkYmwsc2dsICVmcjIwLCVmcjI0CisJZmNudmZmLGRibCxkYmwgJWZyMjAsJWZyMjQKKwlmY252ZmYsZGJsLHF1YWQgJWZyMjAsJWZyMjQKKwlmY252ZmYscXVhZCxzZ2wgJWZyMjAsJWZyMjQKKwlmY252ZmYscXVhZCxkYmwgJWZyMjAsJWZyMjQKKwlmY252ZmYscXVhZCxxdWFkICVmcjIwLCVmcjI0CisKK2ZjbnZ4Zl90ZXN0cworCWZjbnZ4ZixzZ2wsc2dsICVmcjUsJWZyMTAKKwlmY252eGYsc2dsLGRibCAlZnI1LCVmcjEwCisJZmNudnhmLHNnbCxxdWFkICVmcjUsJWZyMTAKKwlmY252eGYsZGJsLHNnbCAlZnI1LCVmcjEwCisJZmNudnhmLGRibCxkYmwgJWZyNSwlZnIxMAorCWZjbnZ4ZixkYmwscXVhZCAlZnI1LCVmcjEwCisJZmNudnhmLHF1YWQsc2dsICVmcjUsJWZyMTAKKwlmY252eGYscXVhZCxkYmwgJWZyNSwlZnIxMAorCWZjbnZ4ZixxdWFkLHF1YWQgJWZyNSwlZnIxMAorCWZjbnZ4ZixzZ2wsc2dsICVmcjIwLCVmcjI0CisJZmNudnhmLHNnbCxkYmwgJWZyMjAsJWZyMjQKKwlmY252eGYsc2dsLHF1YWQgJWZyMjAsJWZyMjQKKwlmY252eGYsZGJsLHNnbCAlZnIyMCwlZnIyNAorCWZjbnZ4ZixkYmwsZGJsICVmcjIwLCVmcjI0CisJZmNudnhmLGRibCxxdWFkICVmcjIwLCVmcjI0CisJZmNudnhmLHF1YWQsc2dsICVmcjIwLCVmcjI0CisJZmNudnhmLHF1YWQsZGJsICVmcjIwLCVmcjI0CisJZmNudnhmLHF1YWQscXVhZCAlZnIyMCwlZnIyNAorCitmY252ZnhfdGVzdHMKKwlmY252Zngsc2dsLHNnbCAlZnI1LCVmcjEwCisJZmNudmZ4LHNnbCxkYmwgJWZyNSwlZnIxMAorCWZjbnZmeCxzZ2wscXVhZCAlZnI1LCVmcjEwCisJZmNudmZ4LGRibCxzZ2wgJWZyNSwlZnIxMAorCWZjbnZmeCxkYmwsZGJsICVmcjUsJWZyMTAKKwlmY252ZngsZGJsLHF1YWQgJWZyNSwlZnIxMAorCWZjbnZmeCxxdWFkLHNnbCAlZnI1LCVmcjEwCisJZmNudmZ4LHF1YWQsZGJsICVmcjUsJWZyMTAKKwlmY252ZngscXVhZCxxdWFkICVmcjUsJWZyMTAKKwlmY252Zngsc2dsLHNnbCAlZnIyMCwlZnIyNAorCWZjbnZmeCxzZ2wsZGJsICVmcjIwLCVmcjI0CisJZmNudmZ4LHNnbCxxdWFkICVmcjIwLCVmcjI0CisJZmNudmZ4LGRibCxzZ2wgJWZyMjAsJWZyMjQKKwlmY252ZngsZGJsLGRibCAlZnIyMCwlZnIyNAorCWZjbnZmeCxkYmwscXVhZCAlZnIyMCwlZnIyNAorCWZjbnZmeCxxdWFkLHNnbCAlZnIyMCwlZnIyNAorCWZjbnZmeCxxdWFkLGRibCAlZnIyMCwlZnIyNAorCWZjbnZmeCxxdWFkLHF1YWQgJWZyMjAsJWZyMjQKKworZmNudmZ4dF90ZXN0cworCWZjbnZmeHQsc2dsLHNnbCAlZnI1LCVmcjEwCisJZmNudmZ4dCxzZ2wsZGJsICVmcjUsJWZyMTAKKwlmY252Znh0LHNnbCxxdWFkICVmcjUsJWZyMTAKKwlmY252Znh0LGRibCxzZ2wgJWZyNSwlZnIxMAorCWZjbnZmeHQsZGJsLGRibCAlZnI1LCVmcjEwCisJZmNudmZ4dCxkYmwscXVhZCAlZnI1LCVmcjEwCisJZmNudmZ4dCxxdWFkLHNnbCAlZnI1LCVmcjEwCisJZmNudmZ4dCxxdWFkLGRibCAlZnI1LCVmcjEwCisJZmNudmZ4dCxxdWFkLHF1YWQgJWZyNSwlZnIxMAorCWZjbnZmeHQsc2dsLHNnbCAlZnIyMCwlZnIyNAorCWZjbnZmeHQsc2dsLGRibCAlZnIyMCwlZnIyNAorCWZjbnZmeHQsc2dsLHF1YWQgJWZyMjAsJWZyMjQKKwlmY252Znh0LGRibCxzZ2wgJWZyMjAsJWZyMjQKKwlmY252Znh0LGRibCxkYmwgJWZyMjAsJWZyMjQKKwlmY252Znh0LGRibCxxdWFkICVmcjIwLCVmcjI0CisJZmNudmZ4dCxxdWFkLHNnbCAlZnIyMCwlZnIyNAorCWZjbnZmeHQscXVhZCxkYmwgJWZyMjAsJWZyMjQKKwlmY252Znh0LHF1YWQscXVhZCAlZnIyMCwlZnIyNAorCitmYWRkX3Rlc3RzCisJZmFkZCxzZ2wgJWZyNCwlZnI4LCVmcjEyCisJZmFkZCxkYmwgJWZyNCwlZnI4LCVmcjEyCisJZmFkZCxxdWFkICVmcjQsJWZyOCwlZnIxMgorCWZhZGQsc2dsICVmcjIwLCVmcjI0LCVmcjI4CisJZmFkZCxkYmwgJWZyMjAsJWZyMjQsJWZyMjgKKwlmYWRkLHF1YWQgJWZyMjAsJWZyMjQsJWZyMjgKKworZnN1Yl90ZXN0cworCWZzdWIsc2dsICVmcjQsJWZyOCwlZnIxMgorCWZzdWIsZGJsICVmcjQsJWZyOCwlZnIxMgorCWZzdWIscXVhZCAlZnI0LCVmcjgsJWZyMTIKKwlmc3ViLHNnbCAlZnIyMCwlZnIyNCwlZnIyOAorCWZzdWIsZGJsICVmcjIwLCVmcjI0LCVmcjI4CisJZnN1YixxdWFkICVmcjIwLCVmcjI0LCVmcjI4CisKK2ZtcHlfdGVzdHMKKwlmbXB5LHNnbCAlZnI0LCVmcjgsJWZyMTIKKwlmbXB5LGRibCAlZnI0LCVmcjgsJWZyMTIKKwlmbXB5LHF1YWQgJWZyNCwlZnI4LCVmcjEyCisJZm1weSxzZ2wgJWZyMjAsJWZyMjQsJWZyMjgKKwlmbXB5LGRibCAlZnIyMCwlZnIyNCwlZnIyOAorCWZtcHkscXVhZCAlZnIyMCwlZnIyNCwlZnIyOAorCitmZGl2X3Rlc3RzCisJZmRpdixzZ2wgJWZyNCwlZnI4LCVmcjEyCisJZmRpdixkYmwgJWZyNCwlZnI4LCVmcjEyCisJZmRpdixxdWFkICVmcjQsJWZyOCwlZnIxMgorCWZkaXYsc2dsICVmcjIwLCVmcjI0LCVmcjI4CisJZmRpdixkYmwgJWZyMjAsJWZyMjQsJWZyMjgKKwlmZGl2LHF1YWQgJWZyMjAsJWZyMjQsJWZyMjgKKworZnJlbV90ZXN0cworCWZyZW0sc2dsICVmcjQsJWZyOCwlZnIxMgorCWZyZW0sZGJsICVmcjQsJWZyOCwlZnIxMgorCWZyZW0scXVhZCAlZnI0LCVmcjgsJWZyMTIKKwlmcmVtLHNnbCAlZnIyMCwlZnIyNCwlZnIyOAorCWZyZW0sZGJsICVmcjIwLCVmcjI0LCVmcjI4CisJZnJlbSxxdWFkICVmcjIwLCVmcjI0LCVmcjI4CisKK2ZjbXBfc2dsX3Rlc3RzXzEKKwlmY21wLHNnbCxmYWxzZT8gJWZyNCwlZnI1CisJZmNtcCxzZ2wsZmFsc2UgJWZyNCwlZnI1CisJZmNtcCxzZ2wsPyAlZnI0LCVmcjUKKwlmY21wLHNnbCwhPD0+ICVmcjQsJWZyNQorCWZjbXAsc2dsLD0gJWZyNCwlZnI1CisJZmNtcCxzZ2wsPVQgJWZyNCwlZnI1CisJZmNtcCxzZ2wsPz0gJWZyNCwlZnI1CisJZmNtcCxzZ2wsITw+ICVmcjQsJWZyNQorZmNtcF9zZ2xfdGVzdHNfMgorCWZjbXAsc2dsLCE/Pj0gJWZyNCwlZnI1CisJZmNtcCxzZ2wsPCAlZnI0LCVmcjUKKwlmY21wLHNnbCw/PCAlZnI0LCVmcjUKKwlmY21wLHNnbCwhPj0gJWZyNCwlZnI1CisJZmNtcCxzZ2wsIT8+ICVmcjQsJWZyNQorCWZjbXAsc2dsLDw9ICVmcjQsJWZyNQorCWZjbXAsc2dsLD88PSAlZnI0LCVmcjUKKwlmY21wLHNnbCwhPiAlZnI0LCVmcjUKK2ZjbXBfc2dsX3Rlc3RzXzMKKwlmY21wLHNnbCwhPzw9ICVmcjQsJWZyNQorCWZjbXAsc2dsLD4gJWZyNCwlZnI1CisJZmNtcCxzZ2wsPz4gJWZyNCwlZnI1CisJZmNtcCxzZ2wsITw9ICVmcjQsJWZyNQorCWZjbXAsc2dsLCE/PCAlZnI0LCVmcjUKKwlmY21wLHNnbCw+PSAlZnI0LCVmcjUKKwlmY21wLHNnbCw/Pj0gJWZyNCwlZnI1CisJZmNtcCxzZ2wsITwgJWZyNCwlZnI1CitmY21wX3NnbF90ZXN0c180CisJZmNtcCxzZ2wsIT89ICVmcjQsJWZyNQorCWZjbXAsc2dsLDw+ICVmcjQsJWZyNQorCWZjbXAsc2dsLCE9ICVmcjQsJWZyNQorCWZjbXAsc2dsLCE9VCAlZnI0LCVmcjUKKwlmY21wLHNnbCwhPyAlZnI0LCVmcjUKKwlmY21wLHNnbCw8PT4gJWZyNCwlZnI1CisJZmNtcCxzZ2wsdHJ1ZT8gJWZyNCwlZnI1CisJZmNtcCxzZ2wsdHJ1ZSAlZnI0LCVmcjUKKworZmNtcF9kYmxfdGVzdHNfMQorCWZjbXAsZGJsLGZhbHNlPyAlZnI0LCVmcjUKKwlmY21wLGRibCxmYWxzZSAlZnI0LCVmcjUKKwlmY21wLGRibCw/ICVmcjQsJWZyNQorCWZjbXAsZGJsLCE8PT4gJWZyNCwlZnI1CisJZmNtcCxkYmwsPSAlZnI0LCVmcjUKKwlmY21wLGRibCw9VCAlZnI0LCVmcjUKKwlmY21wLGRibCw/PSAlZnI0LCVmcjUKKwlmY21wLGRibCwhPD4gJWZyNCwlZnI1CitmY21wX2RibF90ZXN0c18yCisJZmNtcCxkYmwsIT8+PSAlZnI0LCVmcjUKKwlmY21wLGRibCw8ICVmcjQsJWZyNQorCWZjbXAsZGJsLD88ICVmcjQsJWZyNQorCWZjbXAsZGJsLCE+PSAlZnI0LCVmcjUKKwlmY21wLGRibCwhPz4gJWZyNCwlZnI1CisJZmNtcCxkYmwsPD0gJWZyNCwlZnI1CisJZmNtcCxkYmwsPzw9ICVmcjQsJWZyNQorCWZjbXAsZGJsLCE+ICVmcjQsJWZyNQorZmNtcF9kYmxfdGVzdHNfMworCWZjbXAsZGJsLCE/PD0gJWZyNCwlZnI1CisJZmNtcCxkYmwsPiAlZnI0LCVmcjUKKwlmY21wLGRibCw/PiAlZnI0LCVmcjUKKwlmY21wLGRibCwhPD0gJWZyNCwlZnI1CisJZmNtcCxkYmwsIT88ICVmcjQsJWZyNQorCWZjbXAsZGJsLD49ICVmcjQsJWZyNQorCWZjbXAsZGJsLD8+PSAlZnI0LCVmcjUKKwlmY21wLGRibCwhPCAlZnI0LCVmcjUKK2ZjbXBfZGJsX3Rlc3RzXzQKKwlmY21wLGRibCwhPz0gJWZyNCwlZnI1CisJZmNtcCxkYmwsPD4gJWZyNCwlZnI1CisJZmNtcCxkYmwsIT0gJWZyNCwlZnI1CisJZmNtcCxkYmwsIT1UICVmcjQsJWZyNQorCWZjbXAsZGJsLCE/ICVmcjQsJWZyNQorCWZjbXAsZGJsLDw9PiAlZnI0LCVmcjUKKwlmY21wLGRibCx0cnVlPyAlZnI0LCVmcjUKKwlmY21wLGRibCx0cnVlICVmcjQsJWZyNQorCitmY21wX3F1YWRfdGVzdHNfMQorCWZjbXAscXVhZCxmYWxzZT8gJWZyNCwlZnI1CisJZmNtcCxxdWFkLGZhbHNlICVmcjQsJWZyNQorCWZjbXAscXVhZCw/ICVmcjQsJWZyNQorCWZjbXAscXVhZCwhPD0+ICVmcjQsJWZyNQorCWZjbXAscXVhZCw9ICVmcjQsJWZyNQorCWZjbXAscXVhZCw9VCAlZnI0LCVmcjUKKwlmY21wLHF1YWQsPz0gJWZyNCwlZnI1CisJZmNtcCxxdWFkLCE8PiAlZnI0LCVmcjUKK2ZjbXBfcXVhZF90ZXN0c18yCisJZmNtcCxxdWFkLCE/Pj0gJWZyNCwlZnI1CisJZmNtcCxxdWFkLDwgJWZyNCwlZnI1CisJZmNtcCxxdWFkLD88ICVmcjQsJWZyNQorCWZjbXAscXVhZCwhPj0gJWZyNCwlZnI1CisJZmNtcCxxdWFkLCE/PiAlZnI0LCVmcjUKKwlmY21wLHF1YWQsPD0gJWZyNCwlZnI1CisJZmNtcCxxdWFkLD88PSAlZnI0LCVmcjUKKwlmY21wLHF1YWQsIT4gJWZyNCwlZnI1CitmY21wX3F1YWRfdGVzdHNfMworCWZjbXAscXVhZCwhPzw9ICVmcjQsJWZyNQorCWZjbXAscXVhZCw+ICVmcjQsJWZyNQorCWZjbXAscXVhZCw/PiAlZnI0LCVmcjUKKwlmY21wLHF1YWQsITw9ICVmcjQsJWZyNQorCWZjbXAscXVhZCwhPzwgJWZyNCwlZnI1CisJZmNtcCxxdWFkLD49ICVmcjQsJWZyNQorCWZjbXAscXVhZCw/Pj0gJWZyNCwlZnI1CisJZmNtcCxxdWFkLCE8ICVmcjQsJWZyNQorZmNtcF9xdWFkX3Rlc3RzXzQKKwlmY21wLHF1YWQsIT89ICVmcjQsJWZyNQorCWZjbXAscXVhZCw8PiAlZnI0LCVmcjUKKwlmY21wLHF1YWQsIT0gJWZyNCwlZnI1CisJZmNtcCxxdWFkLCE9VCAlZnI0LCVmcjUKKwlmY21wLHF1YWQsIT8gJWZyNCwlZnI1CisJZmNtcCxxdWFkLDw9PiAlZnI0LCVmcjUKKwlmY21wLHF1YWQsdHJ1ZT8gJWZyNCwlZnI1CisJZmNtcCxxdWFkLHRydWUgJWZyNCwlZnI1CisKK2ZtcHlfYWRkc3ViX3Rlc3RzCisJZm1weWFkZCxzZ2wgJWZyMTYsJWZyMTcsJWZyMTgsJWZyMTksJWZyMjAKKwlmbXB5YWRkLGRibCAlZnIxNiwlZnIxNywlZnIxOCwlZnIxOSwlZnIyMAorCWZtcHlzdWIsc2dsICVmcjE2LCVmcjE3LCVmcjE4LCVmcjE5LCVmcjIwCisJZm1weXN1YixkYmwgJWZyMTYsJWZyMTcsJWZyMTgsJWZyMTksJWZyMjAKKworeG1weXVfdGVzdHMKKwl4bXB5dSAlZnI0LCVmcjUsJWZyNgorCitzcGVjaWFsX3Rlc3RzCisJZ2Z3ICVyNCglc3IwLCVyNSkKKwlnZncsbSAlcjQoJXNyMCwlcjUpCisJZ2ZyICVyNCglc3IwLCVyNSkKKwlnZnIsbSAlcjQoJXNyMCwlcjUpCisKK3NmdV90ZXN0cworCXNwb3AwLDQsNQorCXNwb3AwLDQsMTE1CisJc3BvcDAsNCw1LG4KKwlzcG9wMCw0LDExNSxuCisJc3BvcDEsNCw1IDUKKwlzcG9wMSw0LDExNSA1CisJc3BvcDEsNCw1LG4gNQorCXNwb3AxLDQsMTE1LG4gNQorCXNwb3AyLDQsNSA1CisJc3BvcDIsNCwxMTUgNQorCXNwb3AyLDQsNSxuIDUKKwlzcG9wMiw0LDExNSxuIDUKKwlzcG9wMyw0LDUgNSw2CisJc3BvcDMsNCwxMTUgNSw2CisJc3BvcDMsNCw1LG4gNSw2CisJc3BvcDMsNCwxMTUsbiA1LDYKKworY29wcl90ZXN0cworCWNvcHIsNCw1CisJY29wciw0LDExNQorCWNvcHIsNCw1LG4KKwljb3ByLDQsMTE1LG4KKworY29wcl9pbmRleGluZ19sb2FkIAorCWNsZHd4LDQgNSgwLDQpLDI2CisJY2xkd3gsNCxzIDUoMCw0KSwyNgorCWNsZHd4LDQsbSA1KDAsNCksMjYKKwljbGR3eCw0LHNtIDUoMCw0KSwyNgorCWNsZGR4LDQgNSgwLDQpLDI2CisJY2xkZHgsNCxzIDUoMCw0KSwyNgorCWNsZGR4LDQsbSA1KDAsNCksMjYKKwljbGRkeCw0LHNtIDUoMCw0KSwyNgorCitjb3ByX2luZGV4aW5nX3N0b3JlIAorCWNzdHd4LDQgMjYsNSgwLDQpCisJY3N0d3gsNCxzIDI2LDUoMCw0KQorCWNzdHd4LDQsbSAyNiw1KDAsNCkKKwljc3R3eCw0LHNtIDI2LDUoMCw0KQorCWNzdGR4LDQgMjYsNSgwLDQpCisJY3N0ZHgsNCxzIDI2LDUoMCw0KQorCWNzdGR4LDQsbSAyNiw1KDAsNCkKKwljc3RkeCw0LHNtIDI2LDUoMCw0KQorCitjb3ByX3Nob3J0X21lbW9yeSAKKwljbGR3cyw0IDAoMCw0KSwyNgorCWNsZHdzLDQsbWIgMCgwLDQpLDI2CisJY2xkd3MsNCxtYSAwKDAsNCksMjYKKwljbGRkcyw0IDAoMCw0KSwyNgorCWNsZGRzLDQsbWIgMCgwLDQpLDI2CisJY2xkZHMsNCxtYSAwKDAsNCksMjYKKwljc3R3cyw0IDI2LDAoMCw0KQorCWNzdHdzLDQsbWIgMjYsMCgwLDQpCisJY3N0d3MsNCxtYSAyNiwwKDAsNCkKKwljc3Rkcyw0IDI2LDAoMCw0KQorCWNzdGRzLDQsbWIgMjYsMCgwLDQpCisJY3N0ZHMsNCxtYSAyNiwwKDAsNCkKKworZm1lbUxSYnVnX3Rlc3RzXzEKKwlmc3R3cwklZnI2UiwwKCVyMjYpCisJZnN0d3MJJWZyNkwsNCglcjI2KQorCWZzdHdzCSVmcjYsOCglcjI2KQorCWZzdGRzCSVmcjZSLDAoJXIyNikKKwlmc3RkcwklZnI2TCw0KCVyMjYpCisJZnN0ZHMJJWZyNiw4KCVyMjYpCisJZmxkd3MJMCglcjI2KSwlZnI2UgorCWZsZHdzCTQoJXIyNiksJWZyNkwKKwlmbGR3cwk4KCVyMjYpLCVmcjYKKwlmbGRkcwkwKCVyMjYpLCVmcjZSCisJZmxkZHMJNCglcjI2KSwlZnI2TAorCWZsZGRzCTgoJXIyNiksJWZyNgorCitmbWVtTFJidWdfdGVzdHNfMgorCWZzdHdzCSVmcjZSLDAoJXNyMCwlcjI2KQorCWZzdHdzCSVmcjZMLDQoJXNyMCwlcjI2KQorCWZzdHdzCSVmcjYsOCglc3IwLCVyMjYpCisJZnN0ZHMJJWZyNlIsMCglc3IwLCVyMjYpCisJZnN0ZHMJJWZyNkwsNCglc3IwLCVyMjYpCisJZnN0ZHMJJWZyNiw4KCVzcjAsJXIyNikKKwlmbGR3cwkwKCVzcjAsJXIyNiksJWZyNlIKKwlmbGR3cwk0KCVzcjAsJXIyNiksJWZyNkwKKwlmbGR3cwk4KCVzcjAsJXIyNiksJWZyNgorCWZsZGRzCTAoJXNyMCwlcjI2KSwlZnI2UgorCWZsZGRzCTQoJXNyMCwlcjI2KSwlZnI2TAorCWZsZGRzCTgoJXNyMCwlcjI2KSwlZnI2CisKK2ZtZW1MUmJ1Z190ZXN0c18zCisJZnN0d3gJJWZyNlIsJXIyNSglcjI2KQorCWZzdHd4CSVmcjZMLCVyMjUoJXIyNikKKwlmc3R3eAklZnI2LCVyMjUoJXIyNikKKwlmc3RkeAklZnI2UiwlcjI1KCVyMjYpCisJZnN0ZHgJJWZyNkwsJXIyNSglcjI2KQorCWZzdGR4CSVmcjYsJXIyNSglcjI2KQorCWZsZHd4CSVyMjUoJXIyNiksJWZyNlIKKwlmbGR3eAklcjI1KCVyMjYpLCVmcjZMCisJZmxkd3gJJXIyNSglcjI2KSwlZnI2CisJZmxkZHgJJXIyNSglcjI2KSwlZnI2UgorCWZsZGR4CSVyMjUoJXIyNiksJWZyNkwKKwlmbGRkeAklcjI1KCVyMjYpLCVmcjYKKworZm1lbUxSYnVnX3Rlc3RzXzQKKwlmc3R3eAklZnI2UiwlcjI1KCVzcjAsJXIyNikKKwlmc3R3eAklZnI2TCwlcjI1KCVzcjAsJXIyNikKKwlmc3R3eAklZnI2LCVyMjUoJXNyMCwlcjI2KQorCWZzdGR4CSVmcjZSLCVyMjUoJXNyMCwlcjI2KQorCWZzdGR4CSVmcjZMLCVyMjUoJXNyMCwlcjI2KQorCWZzdGR4CSVmcjYsJXIyNSglc3IwLCVyMjYpCisJZmxkd3gJJXIyNSglc3IwLCVyMjYpLCVmcjZSCisJZmxkd3gJJXIyNSglc3IwLCVyMjYpLCVmcjZMCisJZmxkd3gJJXIyNSglc3IwLCVyMjYpLCVmcjYKKwlmbGRkeAklcjI1KCVzcjAsJXIyNiksJWZyNlIKKwlmbGRkeAklcjI1KCVzcjAsJXIyNiksJWZyNkwKKwlmbGRkeAklcjI1KCVzcjAsJXIyNiksJWZyNgorCisJbGR3IDAoMCwlcjQpLCVyMjYKKwlsZHcgMCgwLCVyNCksJXIyNgorCWxkbyA2NCglcjQpLCVyMzAKKwlsZHdtIC02NCgwLCVyMzApLCVyNAorCWJ2LG4gMCglcjIpCisJLkVYSVQKKwkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuZGlzYXNtL21uMTAyMDAuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuZGlzYXNtL21uMTAyMDAuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZTcxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5kaXNhc20vbW4xMDIwMC5leHAKQEAgLTAsMCArMSw0NzggQEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEplZmYgTGF3LiAobGF3QGN5Z251cy5jb20pCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitpZiAhW2lzdGFyZ2V0ICJtbjEwMjAwKi0qLSoiXSB7CisgICAgdmVyYm9zZSAiVGVzdHMgaWdub3JlZCBmb3IgYWxsIGJ1dCBtbjEwMjAwIGJhc2VkIHRhcmdldHMuIgorICAgIHJldHVybgorfQorCitnbG9iYWwgZXhlY19vdXRwdXQKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgIm1uMTAyMDAiCitzZXQgc3JjZmlsZSAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LnMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUgIiJdICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworcHJvYyBhZGRfdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvMTJpIGFkZF90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmFkZAlkMSxkMi4qCisuKmFkZAlkMixhMy4qCisuKmFkZAlhMixkMS4qCisuKmFkZAlhMyxhMi4qCisuKmFkZAkxNixkMS4qCisuKmFkZAkyNTYsZDIuKgorLiphZGQJMTMxMDcxLGQzLioKKy4qYWRkCTE2LGExLioKKy4qYWRkCTI1NixhMi4qCisuKmFkZAkxMzEwNzEsYTMuKgorLiphZGRjCWQxLGQyLioKKy4qYWRkbmYJMTYsYTIuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImFkZCB0ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJhZGQgdGVzdHMiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGFkZCB0ZXN0cyIgfQorICAgIH0KK30KKworcHJvYyBiY2NfdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvMTVpIGJDQ190ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmJlcQkweFxbMC05YS1mXSsgPGJDQ190ZXN0cz4uKgorLipibmUJMHhcWzAtOWEtZl0rIDxiQ0NfdGVzdHM+LioKKy4qYmd0CTB4XFswLTlhLWZdKyA8YkNDX3Rlc3RzPi4qCisuKmJnZQkweFxbMC05YS1mXSsgPGJDQ190ZXN0cz4uKgorLipibGUJMHhcWzAtOWEtZl0rIDxiQ0NfdGVzdHM+LioKKy4qYmx0CTB4XFswLTlhLWZdKyA8YkNDX3Rlc3RzPi4qCisuKmJoaQkweFxbMC05YS1mXSsgPGJDQ190ZXN0cz4uKgorLipiY2MJMHhcWzAtOWEtZl0rIDxiQ0NfdGVzdHM+LioKKy4qYmxzCTB4XFswLTlhLWZdKyA8YkNDX3Rlc3RzPi4qCisuKmJjcwkweFxbMC05YS1mXSsgPGJDQ190ZXN0cz4uKgorLipidmMJMHhcWzAtOWEtZl0rIDxiQ0NfdGVzdHM+LioKKy4qYnZzCTB4XFswLTlhLWZdKyA8YkNDX3Rlc3RzPi4qCisuKmJuYwkweFxbMC05YS1mXSsgPGJDQ190ZXN0cz4uKgorLipibnMJMHhcWzAtOWEtZl0rIDxiQ0NfdGVzdHM+LioKKy4qYnJhCTB4XFswLTlhLWZdKyA8YkNDX3Rlc3RzPi4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiYkNDIHRlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImJDQyB0ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgYkNDIHRlc3RzIiB9CisgICAgfQorfQorCitwcm9jIGJjY3hfdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvMTRpIGJDQ3hfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipiZXF4CTB4XFswLTlhLWZdKyA8YkNDeF90ZXN0cz4uKgorLipibmV4CTB4XFswLTlhLWZdKyA8YkNDeF90ZXN0cz4uKgorLipiZ3R4CTB4XFswLTlhLWZdKyA8YkNDeF90ZXN0cz4uKgorLipiZ2V4CTB4XFswLTlhLWZdKyA8YkNDeF90ZXN0cz4uKgorLipibGV4CTB4XFswLTlhLWZdKyA8YkNDeF90ZXN0cz4uKgorLipibHR4CTB4XFswLTlhLWZdKyA8YkNDeF90ZXN0cz4uKgorLipiaGl4CTB4XFswLTlhLWZdKyA8YkNDeF90ZXN0cz4uKgorLipiY2N4CTB4XFswLTlhLWZdKyA8YkNDeF90ZXN0cz4uKgorLipibHN4CTB4XFswLTlhLWZdKyA8YkNDeF90ZXN0cz4uKgorLipiY3N4CTB4XFswLTlhLWZdKyA8YkNDeF90ZXN0cz4uKgorLipidmN4CTB4XFswLTlhLWZdKyA8YkNDeF90ZXN0cz4uKgorLipidnN4CTB4XFswLTlhLWZdKyA8YkNDeF90ZXN0cz4uKgorLipibmN4CTB4XFswLTlhLWZdKyA8YkNDeF90ZXN0cz4uKgorLipibnN4CTB4XFswLTlhLWZdKyA8YkNDeF90ZXN0cz4uKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImJDQ3ggdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiYkNDeCB0ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgYkNDeCB0ZXN0cyIgfQorICAgIH0KK30KKworcHJvYyBiaXRfdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvNCBiaXRfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipidHN0CTY0LGQxLioKKy4qYnRzdAk4MTkyLGQyLioKKy4qYnNldAlkMSxcXChhMlxcKS4qCisuKmJjbHIJZDEsXFwoYTJcXCkuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImJpdCB0ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJiaXQgdGVzdHMiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGJpdCB0ZXN0cyIgfQorICAgIH0KK30KKworcHJvYyBjbXBfdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvOWkgY21wX3Rlc3RzXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIKKy4qY21wCWQxLGQyLioKKy4qY21wCWQyLGEzLioKKy4qY21wCWEzLGQzLioKKy4qY21wCWEzLGEyLioKKy4qY21wCTE2LGQzLioKKy4qY21wCTI1NixkMi4qCisuKmNtcAkxMzEwNzEsZDEuKgorLipjbXAJMjU2LGEyLioKKy4qY21wCTEzMTA3MSxhMS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiY21wIHRlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNtcCB0ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgY21wIHRlc3RzIiB9CisgICAgfQorfQorCitwcm9jIGV4dGVuZF90ZXN0cyB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICBzZW5kX2dkYiAieC81aSBleHRlbmRfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipleHQJZDEuKgorLipleHR4CWQyLioKKy4qZXh0eHUJZDMuKgorLipleHR4YglkMi4qCisuKmV4dHhidQlkMS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiZXh0ZW5kIHRlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImV4dGVuZCB0ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgZXh0ZW5kIHRlc3RzIiB9CisgICAgfQorfQorCitwcm9jIGxvZ2ljYWxfdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvMTFpIGxvZ2ljYWxfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiphbmQJZDEsZDIuKgorLiphbmQJMTI3LGQyLioKKy4qYW5kCTMyNzY3LGQzLioKKy4qYW5kCTMyNzY3LHBzdy4qCisuKm9yCWQxLGQyLioKKy4qb3IJMTI3LGQyLioKKy4qb3IJMzI3NjcsZDMuKgorLipvcgkzMjc2Nyxwc3cuKgorLip4b3IJZDEsZDIuKgorLip4b3IJMzI3NjcsZDMuKgorLipub3QJZDMuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImxvZ2ljYWwgdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibG9naWNhbCB0ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgbG9naWNhbCB0ZXN0cyIgfQorICAgIH0KK30KKworcHJvYyBtb3ZfdGVzdHNfMSB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICBzZW5kX2dkYiAieC8xMmkgbW92X3Rlc3RzXzFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiptb3YJZDEsYTIuKgorLiptb3YJYTIsZDEuKgorLiptb3YJZDEsZDIuKgorLiptb3YJYTIsYTEuKgorLiptb3YJcHN3LGQzLioKKy4qbW92CWQyLHBzdy4qCisuKm1vdgltZHIsZDEuKgorLiptb3YJZDIsbWRyLioKKy4qbW92CVxcKGEyXFwpLGQxLioKKy4qbW92CVxcKDgsYTJcXCksZDEuKgorLiptb3YJXFwoMjU2LGEyXFwpLGQxLioKKy4qbW92CVxcKDEzMTA3MSxhMlxcKSxkMS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAibW92MSB0ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJtb3YxIHRlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBtb3YxIHRlc3RzIiB9CisgICAgfQorfQorCitwcm9jIG1vdl90ZXN0c18yIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzkgbW92X3Rlc3RzXzJcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiptb3YJXFwoZDEsYTFcXCksZDIuKgorLiptb3YJXFwoMHg4MDAwLipcXCksZDEuKgorLiptb3YJXFwoMHgxZmZmZi4qXFwpLGQxLioKKy4qbW92CVxcKDgsYTJcXCksYTEuKgorLiptb3YJXFwoMjU2LGEyXFwpLGExLioKKy4qbW92CVxcKDEzMTA3MSxhMlxcKSxhMS4qCisuKm1vdglcXChkMSxhMVxcKSxhMi4qCisuKm1vdglcXCgweDgwMDAuKlxcKSxhMS4qCisuKm1vdglcXCgweDFmZmZmLipcXCksYTEuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgIm1vdjIgdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibW92MiB0ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgbW92MiB0ZXN0cyIgfQorICAgIH0KK30KKworcHJvYyBtb3ZfdGVzdHNfMyB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICBzZW5kX2dkYiAieC8xMCBtb3ZfdGVzdHNfM1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKm1vdglkMSxcXChhMlxcKS4qCisuKm1vdglkMSxcXCgzMixhMlxcKS4qCisuKm1vdglkMSxcXCgyNTYsYTJcXCkuKgorLiptb3YJZDEsXFwoMTMxMDcxLGEyXFwpLioKKy4qbW92CWQxLFxcKGQyLGEyXFwpLioKKy4qbW92CWQxLFxcKDB4ODAuKlxcKS4qCisuKm1vdglkMSxcXCgweDFmZmZmLipcXCkuKgorLiptb3YJYTEsXFwoMzIsYTJcXCkuKgorLiptb3YJYTEsXFwoMjU2LGEyXFwpLioKKy4qbW92CWExLFxcKDEzMTA3MSxhMlxcKS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAibW92MyB0ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJtb3YzIHRlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBtb3YzIHRlc3RzIiB9CisgICAgfQorfQorCitwcm9jIG1vdl90ZXN0c180IHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzggbW92X3Rlc3RzXzRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiptb3YJYTEsXFwoZDIsYTJcXCkuKgorLiptb3YJYTEsXFwoMHg4MC4qXFwpLioKKy4qbW92CWExLFxcKDB4MWZmZmYuKlxcKS4qCisuKm1vdgk4LGQxLioKKy4qbW92CTI1NixkMS4qCisuKm1vdgkxMzEwNzEsZDEuKgorLiptb3YJMjU2LGExLioKKy4qbW92CTEzMTA3MSxhMS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAibW92NCB0ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJtb3Y0IHRlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBtb3Y0IHRlc3RzIiB9CisgICAgfQorfQorCitwcm9jIG1vdmJfdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvMTIgbW92Yl90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKm1vdmIJXFwoOCxhMlxcKSxkMS4qCisuKm1vdmIJXFwoMjU2LGEyXFwpLGQxLioKKy4qbW92YglcXCgxMzEwNzEsYTJcXCksZDEuKgorLiptb3ZiCVxcKGQyLGEyXFwpLGQzLioKKy4qbW92YglcXCgweDFmZmZmLipcXCksZDIuKgorLiptb3ZiCWQxLFxcKGEyXFwpLioKKy4qbW92YglkMSxcXCg4LGEyXFwpLioKKy4qbW92YglkMSxcXCgyNTYsYTJcXCkuKgorLiptb3ZiCWQxLFxcKDEzMTA3MSxhMlxcKS4qCisuKm1vdmIJZDEsXFwoZDIsYTJcXCkuKgorLiptb3ZiCWQxLFxcKDB4MTAwLipcXCkuKgorLiptb3ZiCWQxLFxcKDB4MWZmZmYuKlxcKS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAibW92YiB0ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJtb3ZiIHRlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBtb3ZiIHRlc3RzIiB9CisgICAgfQorfQorCitwcm9jIG1vdmJ1X3Rlc3RzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzcgbW92YnVfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiptb3ZidQlcXChhMlxcKSxkMS4qCisuKm1vdmJ1CVxcKDgsYTJcXCksZDEuKgorLiptb3ZidQlcXCgyNTYsYTJcXCksZDEuKgorLiptb3ZidQlcXCgxMzEwNzEsYTJcXCksZDEuKgorLiptb3ZidQlcXChkMSxhMVxcKSxkMi4qCisuKm1vdmJ1CVxcKDB4ODAwMC4qXFwpLGQxLioKKy4qbW92YnUJXFwoMHgxZmZmZi4qXFwpLGQxLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJtb3ZidSB0ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJtb3ZidSB0ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgbW92YnUgdGVzdHMiIH0KKyAgICB9Cit9CisKK3Byb2MgbW92eF90ZXN0cyB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICBzZW5kX2dkYiAieC82IG1vdnhfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiptb3Z4CVxcKDgsYTJcXCksZDEuKgorLiptb3Z4CVxcKDI1NixhMlxcKSxkMS4qCisuKm1vdngJXFwoMTMxMDcxLGEyXFwpLGQxLioKKy4qbW92eAlkMSxcXCg4LGEyXFwpLioKKy4qbW92eAlkMSxcXCgyNTYsYTJcXCkuKgorLiptb3Z4CWQxLFxcKDEzMTA3MSxhMlxcKS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAibW92eCB0ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJtb3Z4IHRlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBtb3Z4IHRlc3RzIiB9CisgICAgfQorfQorCitwcm9jIG11bGRpdl90ZXN0cyB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICBzZW5kX2dkYiAieC8zIG11bGRpdl90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKm11bAlkMSxkMi4qCisuKm11bHUJZDIsZDMuKgorLipkaXZ1CWQzLGQyLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJtdWxkaXYgdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibXVsZGl2IHRlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBtdWxkaXYgdGVzdHMiIH0KKyAgICB9Cit9CisKK3Byb2MgbWlzY190ZXN0cyB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICBzZW5kX2dkYiAieC85IG1pc2NfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipqbXAJMHhcWzAtOWEtZl0rIDxtYWluPi4qCisuKmptcAkweFxbMC05YS1mXSsgPHN0YXJ0Pi4qCisuKmptcAlcXChhMlxcKS4qCisuKmpzcgkweFxbMC05YS1mXSsgPG1haW4+LioKKy4qanNyCTB4XFswLTlhLWZdKyA8c3RhcnQ+LioKKy4qanNyCVxcKGEyXFwpLioKKy4qcnRzLioKKy4qcnRpLioKKy4qbm9wLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJtaXNjIHRlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgIm1pc2MgdGVzdHMiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIG1pc2MgdGVzdHMiIH0KKyAgICB9Cit9CisKK3Byb2Mgc2hpZnRfdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvNGkgc2hpZnRfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiphc3IJZDIuKgorLipsc3IJZDMuKgorLipyb3IJZDEuKgorLipyb2wJZDIuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInNoaWZ0IHRlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgInNoaWZ0IHRlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBzaGlmdCB0ZXN0cyIgfQorICAgIH0KK30KKworcHJvYyBzdWJfdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvOWkgc3ViX3Rlc3RzXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIKKy4qc3ViCWQxLGQyLioKKy4qc3ViCWQyLGEzLioKKy4qc3ViCWEzLGQzLioKKy4qc3ViCWEzLGEyLioKKy4qc3ViCTMyNzY3LGQyLioKKy4qc3ViCTEzMTA3MSxkMi4qCisuKnN1YgkzMjc2NyxhMi4qCisuKnN1YgkxMzEwNzEsYTIuKgorLipzdWJjCWQxLGQyLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJzdWIgdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic3ViIHRlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBzdWIgdGVzdHMiIH0KKyAgICB9Cit9CisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAkYmluZmlsZQorCithZGRfdGVzdHMKK2JjY190ZXN0cworYmNjeF90ZXN0cworYml0X3Rlc3RzCitjbXBfdGVzdHMKK2V4dGVuZF90ZXN0cworbG9naWNhbF90ZXN0cworbW92X3Rlc3RzXzEKK21vdl90ZXN0c18yCittb3ZfdGVzdHNfMworbW92X3Rlc3RzXzQKK21vdmJfdGVzdHMKK21vdmJ1X3Rlc3RzCittb3Z4X3Rlc3RzCittdWxkaXZfdGVzdHMKK21pc2NfdGVzdHMKK3NoaWZ0X3Rlc3RzCitzdWJfdGVzdHMKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmRpc2FzbS9tbjEwMjAwLnMgYi9nZGIvdGVzdHN1aXRlL2dkYi5kaXNhc20vbW4xMDIwMC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMzU3YjAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5kaXNhc20vbW4xMDIwMC5zCkBAIC0wLDAgKzEsMjE3IEBACisJLnRleHQKKwkuZ2xvYmFsIF9tYWluCisJLmdsb2JhbCBhZGRfdGVzdHMKKwkuZ2xvYmFsIGJDQ190ZXN0cworCS5nbG9iYWwgYkNDeF90ZXN0cworCS5nbG9iYWwgYml0X3Rlc3RzCisJLmdsb2JhbCBjbXBfdGVzdHMKKwkuZ2xvYmFsIGV4dGVuZF90ZXN0cworCS5nbG9iYWwgbG9naWNhbF90ZXN0cworCS5nbG9iYWwgbW92X3Rlc3RzXzEKKwkuZ2xvYmFsIG1vdl90ZXN0c18yCisJLmdsb2JhbCBtb3ZfdGVzdHNfMworCS5nbG9iYWwgbW92X3Rlc3RzXzQKKwkuZ2xvYmFsIG1vdmJfdGVzdHMKKwkuZ2xvYmFsIG1vdmJ1X3Rlc3RzCisJLmdsb2JhbCBtb3Z4X3Rlc3RzCisJLmdsb2JhbCBtaXNjX3Rlc3RzCisJLmdsb2JhbCBzaGlmdF90ZXN0cworCS5nbG9iYWwgc3ViX3Rlc3RzCisKK19tYWluOgorCW5vcAorCithZGRfdGVzdHM6CisJYWRkIGQxLGQyCisJYWRkIGQyLGEzCisJYWRkIGEyLGQxCisJYWRkIGEzLGEyCisJYWRkIDE2LGQxCisJYWRkIDI1NixkMgorCWFkZCAxMzEwNzEsZDMKKwlhZGQgMTYsYTEKKwlhZGQgMjU2LGEyCisJYWRkIDEzMTA3MSxhMworCWFkZGMgZDEsZDIKKwlhZGRuZiAxNixhMgorCitiQ0NfdGVzdHM6CisJYmVxIGJDQ190ZXN0cworCWJuZSBiQ0NfdGVzdHMKKwliZ3QgYkNDX3Rlc3RzCisJYmdlIGJDQ190ZXN0cworCWJsZSBiQ0NfdGVzdHMKKwlibHQgYkNDX3Rlc3RzCisJYmhpIGJDQ190ZXN0cworCWJjYyBiQ0NfdGVzdHMKKwlibHMgYkNDX3Rlc3RzCQorCWJjcyBiQ0NfdGVzdHMKKwlidmMgYkNDX3Rlc3RzCisJYnZzIGJDQ190ZXN0cworCWJuYyBiQ0NfdGVzdHMKKwlibnMgYkNDX3Rlc3RzCisJYnJhIGJDQ190ZXN0cworCitiQ0N4X3Rlc3RzOgorCWJlcXggYkNDeF90ZXN0cworCWJuZXggYkNDeF90ZXN0cworCWJndHggYkNDeF90ZXN0cworCWJnZXggYkNDeF90ZXN0cworCWJsZXggYkNDeF90ZXN0cworCWJsdHggYkNDeF90ZXN0cworCWJoaXggYkNDeF90ZXN0cworCWJjY3ggYkNDeF90ZXN0cworCWJsc3ggYkNDeF90ZXN0cwkKKwliY3N4IGJDQ3hfdGVzdHMKKwlidmN4IGJDQ3hfdGVzdHMKKwlidnN4IGJDQ3hfdGVzdHMKKwlibmN4IGJDQ3hfdGVzdHMKKwlibnN4IGJDQ3hfdGVzdHMKKworYml0X3Rlc3RzOgorCWJ0c3QgNjQsZDEKKwlidHN0IDgxOTIsZDIKKwlic2V0IGQxLChhMikKKwliY2xyIGQxLChhMikKKworY21wX3Rlc3RzOgorCWNtcCBkMSxkMgorCWNtcCBkMixhMworCWNtcCBhMyxkMworCWNtcCBhMyxhMgorCWNtcCAxNixkMworCWNtcCAyNTYsZDIKKwljbXAgMTMxMDcxLGQxCisJY21wIDI1NixhMgorCWNtcCAxMzEwNzEsYTEKKworZXh0ZW5kX3Rlc3RzOgorCWV4dCBkMQorCWV4dHggZDIKKwlleHR4dSBkMworCWV4dHhiIGQyCisJZXh0eGJ1IGQxCisJCitsb2dpY2FsX3Rlc3RzOgorCWFuZCBkMSxkMgorCWFuZCAxMjcsZDIKKwlhbmQgMzI3NjcsZDMKKwlhbmQgMzI3NjcscHN3CisJb3IgZDEsZDIKKwlvciAxMjcsZDIKKwlvciAzMjc2NyxkMworCW9yIDMyNzY3LHBzdworCXhvciBkMSxkMgorCXhvciAzMjc2NyxkMworCW5vdCBkMworCittb3ZfdGVzdHNfMToKKwltb3YgZDEsYTIKKwltb3YgYTIsZDEKKwltb3YgZDEsZDIKKwltb3YgYTIsYTEKKwltb3YgcHN3LGQzCisJbW92IGQyLHBzdworCW1vdiBtZHIsZDEKKwltb3YgZDIsbWRyCisJbW92IChhMiksZDEKKwltb3YgKDgsYTIpLGQxCisJbW92ICgyNTYsYTIpLGQxCisJbW92ICgxMzEwNzEsYTIpLGQxCisKK21vdl90ZXN0c18yOgorCW1vdiAoZDEsYTEpLGQyCisJbW92ICgzMjc2OCksZDEKKwltb3YgKDEzMTA3MSksZDEKKwltb3YgKDgsYTIpLGExCisJbW92ICgyNTYsYTIpLGExCisJbW92ICgxMzEwNzEsYTIpLGExCisJbW92IChkMSxhMSksYTIKKyAgICAgICAgbW92ICgzMjc2OCksYTEKKyAgICAgICAgbW92ICgxMzEwNzEpLGExCisKK21vdl90ZXN0c18zOgorICAgICAgICBtb3YgZDEsKGEyKQorICAgICAgICBtb3YgZDEsKDMyLGEyKQorCW1vdiBkMSwoMjU2LGEyKQorCW1vdiBkMSwoMTMxMDcxLGEyKQorCW1vdiBkMSwoZDIsYTIpCisJbW92IGQxLCgxMjgpCisJbW92IGQxLCgxMzEwNzEpCisJbW92IGExLCgzMixhMikKKwltb3YgYTEsKDI1NixhMikKKwltb3YgYTEsKDEzMTA3MSxhMikKKworbW92X3Rlc3RzXzQ6CisJbW92IGExLChkMixhMikKKwltb3YgYTEsKDEyOCkKKwltb3YgYTEsKDEzMTA3MSkKKwltb3YgOCxkMQorCW1vdiAyNTYsZDEKKwltb3YgMTMxMDcxLGQxCisJbW92IDI1NixhMQorCW1vdiAxMzEwNzEsYTEKKworbW92Yl90ZXN0czoKKwltb3ZiICg4LGEyKSxkMQorCW1vdmIgKDI1NixhMiksZDEKKwltb3ZiICgxMzEwNzEsYTIpLGQxCisJbW92YiAoZDIsYTIpLGQzCisJbW92YiAoMTMxMDcxKSxkMgorCW1vdmIgZDEsKGEyKQorCW1vdmIgZDEsKDgsYTIpCisJbW92YiBkMSwoMjU2LGEyKQorCW1vdmIgZDEsKDEzMTA3MSxhMikKKwltb3ZiIGQxLChkMixhMikKKwltb3ZiIGQxLCgyNTYpCisJbW92YiBkMSwoMTMxMDcxKQorCittb3ZidV90ZXN0czoKKwltb3ZidSAoYTIpLGQxCisJbW92YnUgKDgsYTIpLGQxCisJbW92YnUgKDI1NixhMiksZDEKKwltb3ZidSAoMTMxMDcxLGEyKSxkMQorCW1vdmJ1IChkMSxhMSksZDIKKwltb3ZidSAoMzI3NjgpLGQxCisJbW92YnUgKDEzMTA3MSksZDEKKworbW92eF90ZXN0czoKKwltb3Z4ICg4LGEyKSxkMQorCW1vdnggKDI1NixhMiksZDEKKwltb3Z4ICgxMzEwNzEsYTIpLGQxCisJbW92eCBkMSwoOCxhMikKKwltb3Z4IGQxLCgyNTYsYTIpCisJbW92eCBkMSwoMTMxMDcxLGEyKQorCittdWxkaXZfdGVzdHM6CisJbXVsIGQxLGQyCisJbXVsdSBkMixkMworCWRpdnUgZDMsZDIKKworbWlzY190ZXN0czoKKwlqbXAgX21haW4KKwlqbXAgX3N0YXJ0CisJam1wIChhMikKKwlqc3IgX21haW4KKwlqc3IgX3N0YXJ0CisJanNyIChhMikKKwlydHMKKwlydGkKKwlub3AKKworc2hpZnRfdGVzdHM6CisJYXNyIGQyCisJbHNyIGQzCisJcm9yIGQxCisJcm9sIGQyCisKK3N1Yl90ZXN0czoKKwlzdWIgZDEsZDIKKwlzdWIgZDIsYTMKKwlzdWIgYTMsZDMKKwlzdWIgYTMsYTIKKwlzdWIgMzI3NjcsZDIKKwlzdWIgMTMxMDcxLGQyCisJc3ViIDMyNzY3LGEyCisJc3ViIDEzMTA3MSxhMgorCXN1YmMgZDEsZDIKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmRpc2FzbS9tbjEwMzAwLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmRpc2FzbS9tbjEwMzAwLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjFhMmNiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuZGlzYXNtL21uMTAzMDAuZXhwCkBAIC0wLDAgKzEsNTY5IEBACisKKyMgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBKZWZmIExhdy4gKGxhd0BjeWdudXMuY29tKQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworaWYgIVtpc3RhcmdldCAibW4xMDMwMCotKi0qIl0geworICAgIHZlcmJvc2UgIlRlc3RzIGlnbm9yZWQgZm9yIGFsbCBidXQgbW4xMDMwMCBiYXNlZCB0YXJnZXRzLiIKKyAgICByZXR1cm4KK30KKworZ2xvYmFsIGV4ZWNfb3V0cHV0CitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJtbjEwMzAwIgorc2V0IHNyY2ZpbGUgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5zCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlICIiXSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKK3Byb2MgYWRkX3Rlc3RzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzE0aSBhZGRfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiphZGQJZDEsZDIuKgorLiphZGQJZDIsYTMuKgorLiphZGQJYTMsYTIuKgorLiphZGQJYTIsZDEuKgorLiphZGQJMTYsZDEuKgorLiphZGQJMjU2LGQyLioKKy4qYWRkCTEzMTA3MSxkMy4qCisuKmFkZAkxNixhMS4qCisuKmFkZAkyNTYsYTIuKgorLiphZGQJMTMxMDcxLGEzLioKKy4qYWRkCTE2LHNwLioKKy4qYWRkCTI1NixzcC4qCisuKmFkZAkxMzEwNzEsc3AuKgorLiphZGRjCWQxLGQyLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJhZGQgdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiYWRkIHRlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBhZGQgdGVzdHMiIH0KKyAgICB9Cit9CisKK3Byb2MgYmNjX3Rlc3RzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzE1aSBiQ0NfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipiZXEJMHhcWzAtOWEtZl0rIDxiQ0NfdGVzdHM+LioKKy4qYm5lCTB4XFswLTlhLWZdKyA8YkNDX3Rlc3RzPi4qCisuKmJndAkweFxbMC05YS1mXSsgPGJDQ190ZXN0cz4uKgorLipiZ2UJMHhcWzAtOWEtZl0rIDxiQ0NfdGVzdHM+LioKKy4qYmxlCTB4XFswLTlhLWZdKyA8YkNDX3Rlc3RzPi4qCisuKmJsdAkweFxbMC05YS1mXSsgPGJDQ190ZXN0cz4uKgorLipiaGkJMHhcWzAtOWEtZl0rIDxiQ0NfdGVzdHM+LioKKy4qYmNjCTB4XFswLTlhLWZdKyA8YkNDX3Rlc3RzPi4qCisuKmJscwkweFxbMC05YS1mXSsgPGJDQ190ZXN0cz4uKgorLipiY3MJMHhcWzAtOWEtZl0rIDxiQ0NfdGVzdHM+LioKKy4qYnZjCTB4XFswLTlhLWZdKyA8YkNDX3Rlc3RzPi4qCisuKmJ2cwkweFxbMC05YS1mXSsgPGJDQ190ZXN0cz4uKgorLipibmMJMHhcWzAtOWEtZl0rIDxiQ0NfdGVzdHM+LioKKy4qYm5zCTB4XFswLTlhLWZdKyA8YkNDX3Rlc3RzPi4qCisuKmJyYQkweFxbMC05YS1mXSsgPGJDQ190ZXN0cz4uKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImJDQyB0ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJiQ0MgdGVzdHMiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGJDQyB0ZXN0cyIgfQorICAgIH0KK30KKworcHJvYyBiaXRfdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvMTFpIGJpdF90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmJ0c3QJNjQsZDEuKgorLipidHN0CTgxOTIsZDIuKgorLipidHN0CTEzMTA3MSxkMy4qCisuKmJ0c3QJNjQsXFwoOCxhMVxcKS4qCisuKmJ0c3QJNjQsXFwoMHgxZmZmZlxcKS4qCisuKmJzZXQJZDEsXFwoYTJcXCkuKgorLipic2V0CTY0LFxcKDgsYTFcXCkuKgorLipic2V0CTY0LFxcKDB4MWZmZmZcXCkuKgorLipiY2xyCWQxLFxcKGEyXFwpLioKKy4qYmNscgk2NCxcXCg4LGExXFwpLioKKy4qYmNscgk2NCxcXCgweDFmZmZmXFwpLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJiaXQgdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiYml0IHRlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBiaXQgdGVzdHMiIH0KKyAgICB9Cit9CisKK3Byb2MgY21wX3Rlc3RzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzEwaSBjbXBfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLipjbXAJZDEsZDIuKgorLipjbXAJZDIsYTMuKgorLipjbXAJYTMsZDMuKgorLipjbXAJYTMsYTIuKgorLipjbXAJMTYsZDMuKgorLipjbXAJMjU2LGQyLioKKy4qY21wCTEzMTA3MSxkMS4qCisuKmNtcAkxNixhMy4qCisuKmNtcAkyNTYsYTIuKgorLipjbXAJMTMxMDcxLGExLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJjbXAgdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY21wIHRlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjbXAgdGVzdHMiIH0KKyAgICB9Cit9CisKK3Byb2MgZXh0ZW5kX3Rlc3RzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzVpIGV4dGVuZF90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmV4dAlkMS4qCisuKmV4dGIJZDIuKgorLipleHRidQlkMy4qCisuKmV4dGgJZDIuKgorLipleHRodQlkMS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiZXh0ZW5kIHRlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImV4dGVuZCB0ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgZXh0ZW5kIHRlc3RzIiB9CisgICAgfQorfQorCitwcm9jIGV4dGVuZGVkX3Rlc3RzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzEzaSBleHRlbmRlZF90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKnB1dHgJZDEuKgorLipnZXR4CWQyLioKKy4qbXVscQlkMSxkMi4qCisuKm11bHEJMTYsZDIuKgorLiptdWxxCTI1NixkMy4qCisuKm11bHEJMTMxMDcxLGQzLioKKy4qbXVscXUJZDEsZDIuKgorLiptdWxxdQkxNixkMi4qCisuKm11bHF1CTI1NixkMy4qCisuKm11bHF1CTEzMTA3MSxkMy4qCisuKnNhdDE2CWQyLGQzLioKKy4qc2F0MjQJZDMsZDIuKgorLipic2NoCWQxLGQyLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJleHRlbmRlZCB0ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJleHRlbmRlZCB0ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgZXh0ZW5kZWQgdGVzdHMiIH0KKyAgICB9Cit9CisKK3Byb2MgbG9naWNhbF90ZXN0cyB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICBzZW5kX2dkYiAieC8xNGkgbG9naWNhbF90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmFuZAlkMSxkMi4qCisuKmFuZAkxMjcsZDIuKgorLiphbmQJMzI3NjcsZDMuKgorLiphbmQJMTMxMDcxLGQzLioKKy4qYW5kCTMyNzY3LHBzdy4qCisuKm9yCWQxLGQyLioKKy4qb3IJMTI3LGQyLioKKy4qb3IJMzI3NjcsZDMuKgorLipvcgkxMzEwNzEsZDMuKgorLipvcgkzMjc2Nyxwc3cuKgorLip4b3IJZDEsZDIuKgorLip4b3IJMzI3NjcsZDMuKgorLip4b3IJMTMxMDcxLGQzLioKKy4qbm90CWQzLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJsb2dpY2FsIHRlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImxvZ2ljYWwgdGVzdHMiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGxvZ2ljYWwgdGVzdHMiIH0KKyAgICB9Cit9CisKK3Byb2MgbG9vcF90ZXN0cyB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICBzZW5kX2dkYiAieC8xMmkgbG9vcF90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmxlcS4qCisuKmxuZS4qCisuKmxndC4qCisuKmxnZS4qCisuKmxsZS4qCisuKmxsdC4qCisuKmxoaS4qCisuKmxjYy4qCisuKmxscy4qCisuKmxjcy4qCisuKmxyYS4qCisuKnNldGxiLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJsb29wIHRlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImxvb3AgdGVzdHMiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGxvb3AgdGVzdHMiIH0KKyAgICB9Cit9CisKK3Byb2MgbW92X3Rlc3RzXzEgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvMTZpIG1vdl90ZXN0c18xXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIKKy4qbW92CWQxLGQyLioKKy4qbW92CWQxLGEyLioKKy4qbW92CWEyLGQxLioKKy4qbW92CWEyLGExLioKKy4qbW92CXNwLGEyLioKKy4qbW92CWExLHNwLioKKy4qbW92CWQyLHBzdy4qCisuKm1vdgltZHIsZDEuKgorLiptb3YJZDIsbWRyLioKKy4qbW92CVxcKGEyXFwpLGQxLioKKy4qbW92CVxcKDgsYTJcXCksZDEuKgorLiptb3YJXFwoMjU2LGEyXFwpLGQxLioKKy4qbW92CVxcKDEzMTA3MSxhMlxcKSxkMS4qCisuKm1vdglcXCg4LHNwXFwpLGQxLioKKy4qbW92CVxcKDI1NixzcFxcKSxkMS4qCisuKm1vdglwc3csZDMuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgIm1vdjEgdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibW92MSB0ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgbW92MSB0ZXN0cyIgfQorICAgIH0KK30KKworcHJvYyBtb3ZfdGVzdHNfMiB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICBzZW5kX2dkYiAieC8xNWkgbW92X3Rlc3RzXzJcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiptb3YJXFwoMTMxMDcxLHNwXFwpLGQxLioKKy4qbW92CVxcKGQxLGExXFwpLGQyLioKKy4qbW92CVxcKDB4ODAwMC4qXFwpLGQxLioKKy4qbW92CVxcKDB4MWZmZmYuKlxcKSxkMS4qCisuKm1vdglcXChhMlxcKSxhMS4qCisuKm1vdglcXCg4LGEyXFwpLGExLioKKy4qbW92CVxcKDI1NixhMlxcKSxhMS4qCisuKm1vdglcXCgxMzEwNzEsYTJcXCksYTEuKgorLiptb3YJXFwoOCxzcFxcKSxhMS4qCisuKm1vdglcXCgyNTYsc3BcXCksYTEuKgorLiptb3YJXFwoMTMxMDcxLHNwXFwpLGExLioKKy4qbW92CVxcKGQxLGExXFwpLGEyLioKKy4qbW92CVxcKDB4ODAwMC4qXFwpLGExLioKKy4qbW92CVxcKDB4MWZmZmYuKlxcKSxhMS4qCisuKm1vdglcXCgzMixhMVxcKSxzcC4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAibW92MiB0ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJtb3YyIHRlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBtb3YyIHRlc3RzIiB9CisgICAgfQorfQorCitwcm9jIG1vdl90ZXN0c18zIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzE1aSBtb3ZfdGVzdHNfM1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKm1vdglkMSxcXChhMlxcKS4qCisuKm1vdglkMSxcXCgzMixhMlxcKS4qCisuKm1vdglkMSxcXCgyNTYsYTJcXCkuKgorLiptb3YJZDEsXFwoMTMxMDcxLGEyXFwpLioKKy4qbW92CWQxLFxcKDMyLHNwXFwpLioKKy4qbW92CWQxLFxcKDMyNzY4LHNwXFwpLioKKy4qbW92CWQxLFxcKDEzMTA3MSxzcFxcKS4qCisuKm1vdglkMSxcXChkMixhMlxcKS4qCisuKm1vdglkMSxcXCgweDgwLipcXCkuKgorLiptb3YJZDEsXFwoMHgxZmZmZi4qXFwpLioKKy4qbW92CWExLFxcKGEyXFwpLioKKy4qbW92CWExLFxcKDMyLGEyXFwpLioKKy4qbW92CWExLFxcKDI1NixhMlxcKS4qCisuKm1vdglhMSxcXCgxMzEwNzEsYTJcXCkuKgorLiptb3YJYTEsXFwoMzIsc3BcXCkuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgIm1vdjMgdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibW92MyB0ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgbW92MyB0ZXN0cyIgfQorICAgIH0KK30KKworcHJvYyBtb3ZfdGVzdHNfNCB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICBzZW5kX2dkYiAieC8xMmkgbW92X3Rlc3RzXzRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiptb3YJYTEsXFwoMzI3Njgsc3BcXCkuKgorLiptb3YJYTEsXFwoMTMxMDcxLHNwXFwpLioKKy4qbW92CWExLFxcKGQyLGEyXFwpLioKKy4qbW92CWExLFxcKDB4ODAuKlxcKS4qCisuKm1vdglhMSxcXCgweDFmZmZmLipcXCkuKgorLiptb3YJc3AsXFwoMzIsYTFcXCkuKgorLiptb3YJOCxkMS4qCisuKm1vdgkyNTYsZDEuKgorLiptb3YJMTMxMDcxLGQxLioKKy4qbW92CTgsYTEuKgorLiptb3YJMjU2LGExLioKKy4qbW92CTEzMTA3MSxhMS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAibW92NCB0ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJtb3Y0IHRlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBtb3Y0IHRlc3RzIiB9CisgICAgfQorfQorCitwcm9jIG1vdmJ1X3Rlc3RzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzIwaSBtb3ZidV90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKm1vdmJ1CVxcKGEyXFwpLGQxLioKKy4qbW92YnUJXFwoOCxhMlxcKSxkMS4qCisuKm1vdmJ1CVxcKDI1NixhMlxcKSxkMS4qCisuKm1vdmJ1CVxcKDEzMTA3MSxhMlxcKSxkMS4qCisuKm1vdmJ1CVxcKDgsc3BcXCksZDEuKgorLiptb3ZidQlcXCgyNTYsc3BcXCksZDEuKgorLiptb3ZidQlcXCgxMzEwNzEsc3BcXCksZDEuKgorLiptb3ZidQlcXChkMSxhMVxcKSxkMi4qCisuKm1vdmJ1CVxcKDB4ODAwMC4qXFwpLGQxLioKKy4qbW92YnUJXFwoMHgxZmZmZi4qXFwpLGQxLioKKy4qbW92YnUJZDEsXFwoYTJcXCkuKgorLiptb3ZidQlkMSxcXCgzMixhMlxcKS4qCisuKm1vdmJ1CWQxLFxcKDI1NixhMlxcKS4qCisuKm1vdmJ1CWQxLFxcKDEzMTA3MSxhMlxcKS4qCisuKm1vdmJ1CWQxLFxcKDMyLHNwXFwpLioKKy4qbW92YnUJZDEsXFwoMzI3Njgsc3BcXCkuKgorLiptb3ZidQlkMSxcXCgxMzEwNzEsc3BcXCkuKgorLiptb3ZidQlkMSxcXChkMixhMlxcKS4qCisuKm1vdmJ1CWQxLFxcKDB4ODAuKlxcKS4qCisuKm1vdmJ1CWQxLFxcKDB4MWZmZmYuKlxcKS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAibW92YnUgdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibW92YnUgdGVzdHMiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIG1vdmJ1IHRlc3RzIiB9CisgICAgfQorfQorCitwcm9jIG1vdmh1X3Rlc3RzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzIwaSBtb3ZodV90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKm1vdmh1CVxcKGEyXFwpLGQxLioKKy4qbW92aHUJXFwoOCxhMlxcKSxkMS4qCisuKm1vdmh1CVxcKDI1NixhMlxcKSxkMS4qCisuKm1vdmh1CVxcKDEzMTA3MSxhMlxcKSxkMS4qCisuKm1vdmh1CVxcKDgsc3BcXCksZDEuKgorLiptb3ZodQlcXCgyNTYsc3BcXCksZDEuKgorLiptb3ZodQlcXCgxMzEwNzEsc3BcXCksZDEuKgorLiptb3ZodQlcXChkMSxhMVxcKSxkMi4qCisuKm1vdmh1CVxcKDB4ODAwMC4qXFwpLGQxLioKKy4qbW92aHUJXFwoMHgxZmZmZi4qXFwpLGQxLioKKy4qbW92aHUJZDEsXFwoYTJcXCkuKgorLiptb3ZodQlkMSxcXCgzMixhMlxcKS4qCisuKm1vdmh1CWQxLFxcKDI1NixhMlxcKS4qCisuKm1vdmh1CWQxLFxcKDEzMTA3MSxhMlxcKS4qCisuKm1vdmh1CWQxLFxcKDMyLHNwXFwpLioKKy4qbW92aHUJZDEsXFwoMzI3Njgsc3BcXCkuKgorLiptb3ZodQlkMSxcXCgxMzEwNzEsc3BcXCkuKgorLiptb3ZodQlkMSxcXChkMixhMlxcKS4qCisuKm1vdmh1CWQxLFxcKDB4ODAuKlxcKS4qCisuKm1vdmh1CWQxLFxcKDB4MWZmZmYuKlxcKS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAibW92aHUgdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibW92aHUgdGVzdHMiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIG1vdmh1IHRlc3RzIiB9CisgICAgfQorfQorCitwcm9jIG1vdm1fdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvNGkgbW92bV90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKm1vdm0JXFwoc3BcXCksLmEyLGEzLi4qCisuKm1vdm0JXFwoc3BcXCksLmQyLGQzLGEyLGEzLG90aGVyLi4qCisuKm1vdm0JLmEyLGEzLixcXChzcFxcKS4qCisuKm1vdm0JLmQyLGQzLGEyLGEzLG90aGVyLixcXChzcFxcKS4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAibW92bSB0ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJtb3ZtIHRlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBtb3ZtIHRlc3RzIiB9CisgICAgfQorfQorCitwcm9jIG11bGRpdl90ZXN0cyB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICBzZW5kX2dkYiAieC80aSBtdWxkaXZfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiptdWwJZDEsZDIuKgorLiptdWx1CWQyLGQzLioKKy4qZGl2CWQzLGQzLioKKy4qZGl2dQlkMyxkMi4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAibXVsZGl2IHRlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgIm11bGRpdiB0ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgbXVsZGl2IHRlc3RzIiB9CisgICAgfQorfQorCitwcm9jIG90aGVyX3Rlc3RzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzE5aSBvdGhlcl90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmNscglkMi4qCisuKmluYwlkMS4qCisuKmluYwlhMi4qCisuKmluYzQJYTMuKgorLipqbXAJXFwoYTJcXCkuKgorLipqbXAJMHhcWzAtOWEtZl0rIDxtYWluPi4qCisuKmptcAkweFxbMC05YS1mXSsgPHN0YXJ0Pi4qCisuKmNhbGwJMHhcWzAtOWEtZl0rIDxtYWluPiwuYTIsYTMuLDkuKgorLipjYWxsCTB4XFswLTlhLWZdKyA8c3RhcnQ+LC5hMixhMy4sMzIuKgorLipjYWxscwlcXChhMlxcKS4qCisuKmNhbGxzCTB4XFswLTlhLWZdKyA8bWFpbj4uKgorLipjYWxscwkweFxbMC05YS1mXSsgPHN0YXJ0Pi4qCisuKnJldAkuYTIsYTMuLDcuKgorLipyZXRmCS5hMixhMy4sNS4qCisuKnJldHMuKgorLipydGkuKgorLip0cmFwLioKKy4qbm9wLioKKy4qcnRtLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJvdGhlciB0ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJvdGhlciB0ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgb3RoZXIgdGVzdHMiIH0KKyAgICB9Cit9CisKK3Byb2Mgc2hpZnRfdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvOWkgc2hpZnRfdGVzdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIgorLiphc3IJZDEsZDIuKgorLiphc3IJNCxkMi4qCisuKmxzcglkMixkMy4qCisuKmxzcgk0LGQzLioKKy4qYXNsCWQzLGQyLioKKy4qYXNsCTQsZDIuKgorLiphc2wyCWQyLioKKy4qcm9yCWQxLioKKy4qcm9sCWQyLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJzaGlmdCB0ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJzaGlmdCB0ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgc2hpZnQgdGVzdHMiIH0KKyAgICB9Cit9CisKK3Byb2Mgc3ViX3Rlc3RzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzdpIHN1Yl90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKnN1YglkMSxkMi4qCisuKnN1YglkMixhMy4qCisuKnN1YglhMyxkMy4qCisuKnN1YglhMyxhMi4qCisuKnN1YgkxMzEwNzEsZDIuKgorLipzdWIJMTMxMDcxLGExLioKKy4qc3ViYwlkMSxkMi4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAic3ViIHRlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgInN1YiB0ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgc3ViIHRlc3RzIiB9CisgICAgfQorfQorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJGJpbmZpbGUKKworYWRkX3Rlc3RzCitiY2NfdGVzdHMKK2JpdF90ZXN0cworY21wX3Rlc3RzCitleHRlbmRfdGVzdHMKK2V4dGVuZGVkX3Rlc3RzCitsb2dpY2FsX3Rlc3RzCitsb29wX3Rlc3RzCittb3ZfdGVzdHNfMQorbW92X3Rlc3RzXzIKK21vdl90ZXN0c18zCittb3ZfdGVzdHNfNAorbW92YnVfdGVzdHMKK21vdmh1X3Rlc3RzCittb3ZtX3Rlc3RzCittdWxkaXZfdGVzdHMKK290aGVyX3Rlc3RzCitzaGlmdF90ZXN0cworc3ViX3Rlc3RzCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5kaXNhc20vbW4xMDMwMC5zIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuZGlzYXNtL21uMTAzMDAucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQ2Yzk1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuZGlzYXNtL21uMTAzMDAucwpAQCAtMCwwICsxLDMwMCBAQAorCS50ZXh0CisJLmdsb2JhbCBfbWFpbgorCS5nbG9iYWwgYWRkX3Rlc3RzCisJLmdsb2JhbCBiQ0NfdGVzdHMKKwkuZ2xvYmFsIGJpdF90ZXN0cworCS5nbG9iYWwgY21wX3Rlc3RzCisJLmdsb2JhbCBleHRlbmRfdGVzdHMKKwkuZ2xvYmFsIGV4dGVuZGVkX3Rlc3RzCisJLmdsb2JhbCBsb2dpY2FsX3Rlc3RzCisJLmdsb2JhbCBsb29wX3Rlc3RzCisJLmdsb2JhbCBtb3ZfdGVzdHNfMQorCS5nbG9iYWwgbW92X3Rlc3RzXzIKKwkuZ2xvYmFsIG1vdl90ZXN0c18zCisJLmdsb2JhbCBtb3ZfdGVzdHNfNAorCS5nbG9iYWwgbW92YnVfdGVzdHMKKwkuZ2xvYmFsIG1vdmh1X3Rlc3RzCisJLmdsb2JhbCBtb3ZtX3Rlc3RzCisJLmdsb2JhbCBtdWxkaXZfdGVzdHMKKwkuZ2xvYmFsIG90aGVyX3Rlc3RzCisJLmdsb2JhbCBzaGlmdF90ZXN0cworCS5nbG9iYWwgc3ViX3Rlc3RzCisKK19tYWluOgorCW5vcAorCithZGRfdGVzdHM6CisJYWRkIGQxLGQyCisJYWRkIGQyLGEzCisJYWRkIGEzLGEyCisJYWRkIGEyLGQxCisJYWRkIDE2LGQxCisJYWRkIDI1NixkMgorCWFkZCAxMzEwNzEsZDMKKwlhZGQgMTYsYTEKKwlhZGQgMjU2LGEyCisJYWRkIDEzMTA3MSxhMworCWFkZCAxNixzcAorCWFkZCAyNTYsc3AKKwlhZGQgMTMxMDcxLHNwCisJYWRkYyBkMSxkMgorCitiQ0NfdGVzdHM6CisJYmVxIGJDQ190ZXN0cworCWJuZSBiQ0NfdGVzdHMKKwliZ3QgYkNDX3Rlc3RzCisJYmdlIGJDQ190ZXN0cworCWJsZSBiQ0NfdGVzdHMKKwlibHQgYkNDX3Rlc3RzCisJYmhpIGJDQ190ZXN0cworCWJjYyBiQ0NfdGVzdHMKKwlibHMgYkNDX3Rlc3RzCQorCWJjcyBiQ0NfdGVzdHMKKwlidmMgYkNDX3Rlc3RzCisJYnZzIGJDQ190ZXN0cworCWJuYyBiQ0NfdGVzdHMKKwlibnMgYkNDX3Rlc3RzCisJYnJhIGJDQ190ZXN0cworCitiaXRfdGVzdHM6CisJYnRzdCA2NCxkMQorCWJ0c3QgODE5MixkMgorCWJ0c3QgMTMxMDcxLGQzCisJYnRzdCA2NCwoOCxhMSkKKwlidHN0IDY0LCgweDFmZmZmKQorCWJzZXQgZDEsKGEyKQorCWJzZXQgNjQsKDgsYTEpCisJYnNldCA2NCwoMHgxZmZmZikKKwliY2xyIGQxLChhMikKKwliY2xyIDY0LCg4LGExKQorCWJjbHIgNjQsKDB4MWZmZmYpCisKK2NtcF90ZXN0czoKKwljbXAgZDEsZDIKKwljbXAgZDIsYTMKKwljbXAgYTMsZDMKKwljbXAgYTMsYTIKKwljbXAgMTYsZDMKKwljbXAgMjU2LGQyCisJY21wIDEzMTA3MSxkMQorCWNtcCAxNixhMworCWNtcCAyNTYsYTIKKwljbXAgMTMxMDcxLGExCisKKwkKK2V4dGVuZF90ZXN0czoKKwlleHQgZDEKKwlleHRiIGQyCisJZXh0YnUgZDMKKwlleHRoIGQyCisJZXh0aHUgZDEKKworZXh0ZW5kZWRfdGVzdHM6CisJcHV0eCBkMQorCWdldHggZDIKKwltdWxxIGQxLGQyCisJbXVscSAxNixkMgorCW11bHEgMjU2LGQzCisJbXVscSAxMzEwNzEsZDMKKwltdWxxdSBkMSxkMgorCW11bHF1IDE2LGQyCisJbXVscXUgMjU2LGQzCisJbXVscXUgMTMxMDcxLGQzCisJc2F0MTYgZDIsZDMKKwlzYXQyNCBkMyxkMgorCWJzY2ggZDEsZDIKKwkKK2xvZ2ljYWxfdGVzdHM6CisJYW5kIGQxLGQyCisJYW5kIDEyNyxkMgorCWFuZCAzMjc2NyxkMworCWFuZCAxMzEwNzEsZDMKKwlhbmQgMzI3NjcscHN3CisJb3IgZDEsZDIKKwlvciAxMjcsZDIKKwlvciAzMjc2NyxkMworCW9yIDEzMTA3MSxkMworCW9yIDMyNzY3LHBzdworCXhvciBkMSxkMgorCXhvciAzMjc2NyxkMworCXhvciAxMzEwNzEsZDMKKwlub3QgZDMKKworbG9vcF90ZXN0czoKKwlsZXEKKwlsbmUKKwlsZ3QKKwlsZ2UKKwlsbGUKKwlsbHQKKwlsaGkKKwlsY2MKKwlsbHMJCisJbGNzCisJbHJhCisJc2V0bGIKKworbW92X3Rlc3RzXzE6CisJbW92IGQxLGQyCisJbW92IGQxLGEyCisJbW92IGEyLGQxCisJbW92IGEyLGExCisJbW92IHNwLGEyCisJbW92IGExLHNwCisJbW92IGQyLHBzdworCW1vdiBtZHIsZDEKKwltb3YgZDIsbWRyCisJbW92IChhMiksZDEKKwltb3YgKDgsYTIpLGQxCisJbW92ICgyNTYsYTIpLGQxCisJbW92ICgxMzEwNzEsYTIpLGQxCisJbW92ICg4LHNwKSxkMQorCW1vdiAoMjU2LHNwKSxkMQorCW1vdiBwc3csZDMKKworbW92X3Rlc3RzXzI6CisgICAgICAgIG1vdiAoMTMxMDcxLHNwKSxkMQorCW1vdiAoZDEsYTEpLGQyCisJbW92ICgzMjc2OCksZDEKKwltb3YgKDEzMTA3MSksZDEKKwltb3YgKGEyKSxhMQorCW1vdiAoOCxhMiksYTEKKwltb3YgKDI1NixhMiksYTEKKwltb3YgKDEzMTA3MSxhMiksYTEKKwltb3YgKDgsc3ApLGExCisJbW92ICgyNTYsc3ApLGExCisJbW92ICgxMzEwNzEsc3ApLGExCisJbW92IChkMSxhMSksYTIKKyAgICAgICAgbW92ICgzMjc2OCksYTEKKyAgICAgICAgbW92ICgxMzEwNzEpLGExCisgICAgICAgIG1vdiAoMzIsYTEpLHNwCisKK21vdl90ZXN0c18zOgorICAgICAgICBtb3YgZDEsKGEyKQorICAgICAgICBtb3YgZDEsKDMyLGEyKQorCW1vdiBkMSwoMjU2LGEyKQorCW1vdiBkMSwoMTMxMDcxLGEyKQorCW1vdiBkMSwoMzIsc3ApCisJbW92IGQxLCgzMjc2OCxzcCkKKwltb3YgZDEsKDEzMTA3MSxzcCkKKwltb3YgZDEsKGQyLGEyKQorCW1vdiBkMSwoMTI4KQorCW1vdiBkMSwoMTMxMDcxKQorCW1vdiBhMSwoYTIpCisJbW92IGExLCgzMixhMikKKwltb3YgYTEsKDI1NixhMikKKwltb3YgYTEsKDEzMTA3MSxhMikKKwltb3YgYTEsKDMyLHNwKQorCittb3ZfdGVzdHNfNDoKKwltb3YgYTEsKDMyNzY4LHNwKQorCW1vdiBhMSwoMTMxMDcxLHNwKQorCW1vdiBhMSwoZDIsYTIpCisJbW92IGExLCgxMjgpCisJbW92IGExLCgxMzEwNzEpCisJbW92IHNwLCgzMixhMSkKKwltb3YgOCxkMQorCW1vdiAyNTYsZDEKKwltb3YgMTMxMDcxLGQxCisJbW92IDgsYTEKKwltb3YgMjU2LGExCisJbW92IDEzMTA3MSxhMQorCittb3ZidV90ZXN0czoKKwltb3ZidSAoYTIpLGQxCisJbW92YnUgKDgsYTIpLGQxCisJbW92YnUgKDI1NixhMiksZDEKKwltb3ZidSAoMTMxMDcxLGEyKSxkMQorCW1vdmJ1ICg4LHNwKSxkMQorCW1vdmJ1ICgyNTYsc3ApLGQxCisJbW92YnUgKDEzMTA3MSxzcCksZDEKKwltb3ZidSAoZDEsYTEpLGQyCisJbW92YnUgKDMyNzY4KSxkMQorCW1vdmJ1ICgxMzEwNzEpLGQxCisJbW92YnUgZDEsKGEyKQorCW1vdmJ1IGQxLCgzMixhMikKKwltb3ZidSBkMSwoMjU2LGEyKQorCW1vdmJ1IGQxLCgxMzEwNzEsYTIpCisJbW92YnUgZDEsKDMyLHNwKQorCW1vdmJ1IGQxLCgzMjc2OCxzcCkKKwltb3ZidSBkMSwoMTMxMDcxLHNwKQorCW1vdmJ1IGQxLChkMixhMikKKwltb3ZidSBkMSwoMTI4KQorCW1vdmJ1IGQxLCgxMzEwNzEpCisKK21vdmh1X3Rlc3RzOgorCW1vdmh1IChhMiksZDEKKwltb3ZodSAoOCxhMiksZDEKKwltb3ZodSAoMjU2LGEyKSxkMQorCW1vdmh1ICgxMzEwNzEsYTIpLGQxCisJbW92aHUgKDgsc3ApLGQxCisJbW92aHUgKDI1NixzcCksZDEKKwltb3ZodSAoMTMxMDcxLHNwKSxkMQorCW1vdmh1IChkMSxhMSksZDIKKwltb3ZodSAoMzI3NjgpLGQxCisJbW92aHUgKDEzMTA3MSksZDEKKwltb3ZodSBkMSwoYTIpCisJbW92aHUgZDEsKDMyLGEyKQorCW1vdmh1IGQxLCgyNTYsYTIpCisJbW92aHUgZDEsKDEzMTA3MSxhMikKKwltb3ZodSBkMSwoMzIsc3ApCisJbW92aHUgZDEsKDMyNzY4LHNwKQorCW1vdmh1IGQxLCgxMzEwNzEsc3ApCisJbW92aHUgZDEsKGQyLGEyKQorCW1vdmh1IGQxLCgxMjgpCisJbW92aHUgZDEsKDEzMTA3MSkKKworbW92bV90ZXN0czoKKwltb3ZtIChzcCksW2EyLGEzXQorCW1vdm0gKHNwKSxbZDIsZDMsYTIsYTMsb3RoZXJdCisJbW92bSBbYTIsYTNdLChzcCkKKwltb3ZtIFtkMixkMyxhMixhMyxvdGhlcl0sKHNwKQorCisKK211bGRpdl90ZXN0czoKKwltdWwgZDEsZDIKKwltdWx1IGQyLGQzCisJZGl2IGQzLGQzCisJZGl2dSBkMyxkMgorCitvdGhlcl90ZXN0czoKKwljbHIgZDIKKwlpbmMgZDEKKwlpbmMgYTIKKwlpbmM0IGEzCisJam1wIChhMikKKwlqbXAgX21haW4KKwlqbXAgX3N0YXJ0CisJY2FsbCBfbWFpbixbYTIsYTNdLDkKKwljYWxsIF9zdGFydCxbYTIsYTNdLDMyCisJY2FsbHMgKGEyKQorCWNhbGxzIF9tYWluCisJY2FsbHMgX3N0YXJ0CisJcmV0IFthMixhM10sNworCXJldGYgW2EyLGEzXSw1CisJcmV0cworCXJ0aQorCXRyYXAKKwlub3AKKwlydG0KKworc2hpZnRfdGVzdHM6CisJYXNyIGQxLGQyCisJYXNyIDQsZDIKKwlsc3IgZDIsZDMKKwlsc3IgNCxkMworCWFzbCBkMyxkMgorCWFzbCA0LGQyCisJYXNsMiBkMgorCXJvciBkMQorCXJvbCBkMgorCitzdWJfdGVzdHM6CisJc3ViIGQxLGQyCisJc3ViIGQyLGEzCisJc3ViIGEzLGQzCisJc3ViIGEzLGEyCisJc3ViIDEzMTA3MSxkMgorCXN1YiAxMzEwNzEsYTEKKwlzdWJjIGQxLGQyCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmRpc2FzbS9zaDMuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuZGlzYXNtL3NoMy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4MmY5MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmRpc2FzbS9zaDMuZXhwCkBAIC0wLDAgKzEsMTIzIEBACisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgSmVmZiBMYXcuIChsYXdAY3MudXRhaC5lZHUpCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitpZiAhW2lzdGFyZ2V0ICJzaDMqLSotKiJdIHsKKyAgICB2ZXJib3NlICJUZXN0cyBpZ25vcmVkIGZvciBhbGwgYnV0IHNoMyBiYXNlZCB0YXJnZXRzLiIKKyAgICByZXR1cm4KK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAic2gzIgorc2V0IHNyY2ZpbGUgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5zCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlICIiXSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKK3Byb2MgYWxsX2ZwX21vdmVfYW5kX2xvYWRfdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBoZXgKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgIngvOWkgZnBfbW92ZV9hbmRfbG9hZF90ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmZtb3Yuc1x0QHIwLGZyMC4qCisuKmZtb3Yuc1x0ZnIwLEByMC4qCisuKmZtb3Yuc1x0QHIwXFwrLGZyMC4qCisuKmZtb3Yuc1x0ZnIwLEAtcjAuKgorLipmbW92LnNcdEBcXChyMCxyMFxcKSxmcjAuKgorLipmbW92LnNcdGZyMCxAXFwocjAscjBcXCkuKgorLipmbW92XHRmcjAsZnIxLioKKy4qZmxkaTBcdGZyMC4qCisuKmZsZGkxXHRmcjAuKgorLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImZwX21vdmVfYW5kX2xvYWRfdGVzdHMiIH0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiZnBfbW92ZV9hbmRfbG9hZF90ZXN0cyIgfQorCXRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgZnBfbW92ZV9hbmRfbG9hZF90ZXN0cyIgfQorICAgIH0KK30KKworcHJvYyBhbGxfZnBfYXJpdGhtZXRpY190ZXN0cyB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICBzZW5kX2dkYiAieC8xM2kgZnBfYXJpdGhtZXRpY190ZXN0c1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiCisuKmZhZGRcdGZyMCxmcjEuKgorLipmc3ViXHRmcjAsZnIxLioKKy4qZm11bFx0ZnIwLGZyMS4qCisuKmZkaXZcdGZyMCxmcjEuKgorLipmbWFjXHRmcjAsZnIwLGZyMS4qCisuKmZjbXAvZXFcdGZyMCxmcjEuKgorLipmY21wL2d0XHRmcjAsZnIxLioKKy4qZnRzdC9uYW5cdGZyMC4qCisuKmZuZWdcdGZyMC4qCisuKmZhYnNcdGZyMC4qCisuKmZzcXJ0XHRmcjAuKgorLipmbG9hdFx0ZnB1bCxmcjAuKgorLipmdHJjXHRmcjAsZnB1bC4qCisuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiZnBfYXJpdGhtZXRpY190ZXN0cyIgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJmcF9hcml0aG1ldGljX3Rlc3RzIiB9CisJdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBmcF9hcml0aG1ldGljX3Rlc3RzIiB9CisgICAgfQorfQorCitwcm9jIGFsbF9mcF9taXNjX3Rlc3RzIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHNlbmRfZ2RiICJ4LzEwaSBmcF9taXNjX3Rlc3RzXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIKKy4qZnN0c1x0ZnB1bCxmcjAuKgorLipmbGRzXHRmcjAsZnB1bC4qCisuKmxkc1x0cjMsZnB1bC4qCisuKmxkc1xcLmxcdEByM1xcKyxmcHVsLioKKy4qbGRzXHRyMyxmcHNjci4qCisuKmxkc1xcLmxcdEByM1xcKyxmcHNjci4qCisuKnN0c1x0ZnB1bCxyMy4qCisuKnN0c1xcLmxcdGZwdWwsQC1yMy4qCisuKnN0c1x0ZnBzY3IscjMuKgorLipzdHNcXC5sXHRmcHNjcixALXIzLioKKy4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJmcF9taXNjX3Rlc3RzIiB9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImZwX21pc2NfdGVzdHMiIH0KKwl0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGZwX21pc2NfdGVzdHMiIH0KKyAgICB9Cit9CisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJGJpbmZpbGUKKworYWxsX2ZwX21vdmVfYW5kX2xvYWRfdGVzdHMKK2FsbF9mcF9hcml0aG1ldGljX3Rlc3RzCithbGxfZnBfbWlzY190ZXN0cworCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5kaXNhc20vc2gzLnMgYi9nZGIvdGVzdHN1aXRlL2dkYi5kaXNhc20vc2gzLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhYjI1NgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmRpc2FzbS9zaDMucwpAQCAtMCwwICsxLDU0IEBACisJLmZpbGUJInRlc3QuYyIKKwkuZGF0YQorCishIEhpdGFjaGkgU0ggY2MxIChjeWdudXMtMi43LjEtOTUwNzI4KSBhcmd1bWVudHM6IC1PIC1mcGVlcGhvbGUKKyEgLWZmdW5jdGlvbi1jc2UgLWZyZWctc3RydWN0LXJldHVybiAtZmRlbGF5ZWQtYnJhbmNoIC1mY29tbW9uIC1mZ251LWxpbmtlcgorCitnY2MyX2NvbXBpbGVkLjoKK19fX2dudV9jb21waWxlZF9jOgorCS50ZXh0CisJLmFsaWduIDIKKwkuZ2xvYmFsCV9mcF9tb3ZlX2FuZF9sb2FkX3Rlc3RzCisJLmdsb2JhbAlfZnBfYXJpdGhtZXRpY190ZXN0cworCS5nbG9iYWwgX2ZwX21pc2NfdGVzdHMKKwkuZ2xvYmFsIF9tYWluCisKK19tYWluOgorX2ZwX21vdmVfYW5kX2xvYWRfdGVzdHM6CisJZm1vdi5zCUByMCxmcjAKKwlmbW92LnMJZnIwLEByMAorCWZtb3YucwlAcjArLGZyMAorCWZtb3YucwlmcjAsQC1yMAorCWZtb3YucwlAKHIwLHIwKSxmcjAKKwlmbW92LnMJZnIwLEAocjAscjApCisJZm1vdglmcjAsZnIxCisJZmxkaTAJZnIwCisJZmxkaTEJZnIwCisKK19mcF9hcml0aG1ldGljX3Rlc3RzOgorCWZhZGQJZnIwLGZyMQorCWZzdWIJZnIwLGZyMQorCWZtdWwJZnIwLGZyMQorCWZkaXYJZnIwLGZyMQorCWZtYWMJZnIwLGZyMCxmcjEKKwlmY21wL2VxCWZyMCxmcjEKKwlmY21wL2d0CWZyMCxmcjEKKwlmdHN0L25hbglmcjAKKwlmbmVnCWZyMAorCWZhYnMJZnIwCisJZnNxcnQJZnIwCisJZmxvYXQJZnB1bCxmcjAKKwlmdHJjCWZyMCxmcHVsCisKK19mcF9taXNjX3Rlc3RzOgorCWZzdHMJZnB1bCxmcjAKKwlmbGRzCWZyMCxmcHVsCisJbGRzCXIzLGZwdWwKKwlsZHMubAlAcjMrLGZwdWwKKwlsZHMJcjMsZnBzY3IKKwlsZHMubAlAcjMrLGZwc2NyCisJc3RzCWZwdWwscjMKKwlzdHMubAlmcHVsLEAtcjMKKwlzdHMJZnBzY3IscjMKKwlzdHMubAlmcHNjcixALXIzCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmZvcnRyYW4vZXhwcnMuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuZm9ydHJhbi9leHBycy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NjYzgyYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmZvcnRyYW4vZXhwcnMuZXhwCkBAIC0wLDAgKzEsMjczIEBACisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIGFkYXB0ZWQgZnJvbSBDaGlsbCB0ZXN0cyBieSBTdGFuIFNoZWJzIChzaGVic0BjeWdudXMuY29tKS4KKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCisjIFNldCB0aGUgY3VycmVudCBsYW5ndWFnZSB0byBmb3J0cmFuLiAgVGhpcyBjb3VudHMgYXMgYSB0ZXN0LiAgSWYgaXQKKyMgZmFpbHMsIHRoZW4gd2Ugc2tpcCB0aGUgb3RoZXIgdGVzdHMuCisKK3Byb2Mgc2V0X2xhbmdfZm9ydHJhbiB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICAKKyAgICBpZiBbZ2RiX3Rlc3QgInNldCBsYW5ndWFnZSBmb3J0cmFuIiAiIl0geworCXJldHVybiAwOworICAgIH0KKworICAgIGlmICFbZ2RiX3Rlc3QgInNob3cgbGFuZ3VhZ2UiICIuKiBzb3VyY2UgbGFuZ3VhZ2UgaXMgXCJmb3J0cmFuXCIuKiJdIHsKKwlyZXR1cm4gMTsKKyAgICB9IGVsc2UgeworCXJldHVybiAwOworICAgIH0KK30KKworcHJvYyB0ZXN0X2ludGVnZXJfbGl0ZXJhbHNfYWNjZXB0ZWQge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICAjIFRlc3QgdmFyaW91cyBkZWNpbWFsIHZhbHVlcy4KKworICAgIGdkYl90ZXN0ICJwIDEyMyIgIiA9IDEyMyIKKyAgICBnZGJfdGVzdCAicCAtMTIzIiAiID0gLTEyMyIKK30KKworcHJvYyB0ZXN0X2NoYXJhY3Rlcl9saXRlcmFsc19hY2NlcHRlZCB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgICMgVGVzdCB2YXJpb3VzIGNoYXJhY3RlciB2YWx1ZXMuCisKKyAgICBnZGJfdGVzdCAicCAnYSciICIgPSAnYSciCit9CisKK3Byb2MgdGVzdF9pbnRlZ2VyX2xpdGVyYWxzX3JlamVjdGVkIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgdGVzdF9wcmludF9yZWplY3QgInAgXyIKK30KKworcHJvYyB0ZXN0X2xvZ2ljYWxfbGl0ZXJhbHNfYWNjZXB0ZWQge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICAjIFRlc3QgdGhlIG9ubHkgcG9zc2libGUgdmFsdWVzIGZvciBhIGxvZ2ljYWwsIFRSVUUgYW5kIEZBTFNFLgorCisgICAgZ2RiX3Rlc3QgInAgLlRSVUUuIiAiID0gLlRSVUUuIgorICAgIGdkYl90ZXN0ICJwIC5GQUxTRS4iICIgPSAuRkFMU0UuIgorfQorCitwcm9jIHRlc3RfZmxvYXRfbGl0ZXJhbHNfYWNjZXB0ZWQge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICAjIFRlc3QgdmFyaW91cyBmbG9hdGluZyBwb2ludCBmb3JtYXRzCisKKyAgICBnZGJfdGVzdCAicCAuNDQgLkxULiAuNDUiICIgPSAuVFJVRS4iCisgICAgZ2RiX3Rlc3QgInAgLjQ0IC5HVC4gLjQ1IiAiID0gLkZBTFNFLiIKKyAgICBnZGJfdGVzdCAicCAwLjQ0IC5MVC4gMC40NSIgIiA9IC5UUlVFLiIKKyAgICBnZGJfdGVzdCAicCAwLjQ0IC5HVC4gMC40NSIgIiA9IC5GQUxTRS4iCisgICAgZ2RiX3Rlc3QgInAgNDQuIC5MVC4gNDUuIiAiID0gLlRSVUUuIgorICAgIGdkYl90ZXN0ICJwIDQ0LiAuR1QuIDQ1LiIgIiA9IC5GQUxTRS4iCisgICAgZ2RiX3Rlc3QgInAgNDQuMCAuTFQuIDQ1LjAiICIgPSAuVFJVRS4iCisgICAgZ2RiX3Rlc3QgInAgNDQuMCAuR1QuIDQ1LjAiICIgPSAuRkFMU0UuIgorICAgIGdkYl90ZXN0ICJwIDEwRDIwIC5MVC4gMTBEMjEiICIgPSAuVFJVRS4iCisgICAgZ2RiX3Rlc3QgInAgMTBEMjAgLkdULiAxMEQyMSIgIiA9IC5GQUxTRS4iCisgICAgZ2RiX3Rlc3QgInAgMTBkMjAgLkxULiAxMGQyMSIgIiA9IC5UUlVFLiIKKyAgICBnZGJfdGVzdCAicCAxMGQyMCAuR1QuIDEwZDIxIiAiID0gLkZBTFNFLiIKKyAgICBnZGJfdGVzdCAicCAxMEUyMCAuTFQuIDEwRTIxIiAiID0gLlRSVUUuIgorICAgIGdkYl90ZXN0ICJwIDEwRTIwIC5HVC4gMTBFMjEiICIgPSAuRkFMU0UuIgorICAgIGdkYl90ZXN0ICJwIDEwZTIwIC5MVC4gMTBlMjEiICIgPSAuVFJVRS4iCisgICAgZ2RiX3Rlc3QgInAgMTBlMjAgLkdULiAxMGUyMSIgIiA9IC5GQUxTRS4iCisgICAgZ2RiX3Rlc3QgInAgMTAuRDIwIC5MVC4gMTAuRDIxIiAiID0gLlRSVUUuIgorICAgIGdkYl90ZXN0ICJwIDEwLkQyMCAuR1QuIDEwLkQyMSIgIiA9IC5GQUxTRS4iCisgICAgZ2RiX3Rlc3QgInAgMTAuZDIwIC5MVC4gMTAuZDIxIiAiID0gLlRSVUUuIgorICAgIGdkYl90ZXN0ICJwIDEwLmQyMCAuR1QuIDEwLmQyMSIgIiA9IC5GQUxTRS4iCisgICAgZ2RiX3Rlc3QgInAgMTAuRTIwIC5MVC4gMTAuRTIxIiAiID0gLlRSVUUuIgorICAgIGdkYl90ZXN0ICJwIDEwLkUyMCAuR1QuIDEwLkUyMSIgIiA9IC5GQUxTRS4iCisgICAgZ2RiX3Rlc3QgInAgMTAuZTIwIC5MVC4gMTAuZTIxIiAiID0gLlRSVUUuIgorICAgIGdkYl90ZXN0ICJwIDEwLmUyMCAuR1QuIDEwLmUyMSIgIiA9IC5GQUxTRS4iCisgICAgZ2RiX3Rlc3QgInAgMTAuMEQyMCAuTFQuIDEwLjBEMjEiICIgPSAuVFJVRS4iCisgICAgZ2RiX3Rlc3QgInAgMTAuMEQyMCAuR1QuIDEwLjBEMjEiICIgPSAuRkFMU0UuIgorICAgIGdkYl90ZXN0ICJwIDEwLjBkMjAgLkxULiAxMC4wZDIxIiAiID0gLlRSVUUuIgorICAgIGdkYl90ZXN0ICJwIDEwLjBkMjAgLkdULiAxMC4wZDIxIiAiID0gLkZBTFNFLiIKKyAgICBnZGJfdGVzdCAicCAxMC4wRTIwIC5MVC4gMTAuMEUyMSIgIiA9IC5UUlVFLiIKKyAgICBnZGJfdGVzdCAicCAxMC4wRTIwIC5HVC4gMTAuMEUyMSIgIiA9IC5GQUxTRS4iCisgICAgZ2RiX3Rlc3QgInAgMTAuMGUyMCAuTFQuIDEwLjBlMjEiICIgPSAuVFJVRS4iCisgICAgZ2RiX3Rlc3QgInAgMTAuMGUyMCAuR1QuIDEwLjBlMjEiICIgPSAuRkFMU0UuIgorICAgIGdkYl90ZXN0ICJwIDEwLjBEKzIwIC5MVC4gMTAuMEQrMjEiICIgPSAuVFJVRS4iCisgICAgZ2RiX3Rlc3QgInAgMTAuMEQrMjAgLkdULiAxMC4wRCsyMSIgIiA9IC5GQUxTRS4iCisgICAgZ2RiX3Rlc3QgInAgMTAuMGQrMjAgLkxULiAxMC4wZCsyMSIgIiA9IC5UUlVFLiIKKyAgICBnZGJfdGVzdCAicCAxMC4wZCsyMCAuR1QuIDEwLjBkKzIxIiAiID0gLkZBTFNFLiIKKyAgICBnZGJfdGVzdCAicCAxMC4wRSsyMCAuTFQuIDEwLjBFKzIxIiAiID0gLlRSVUUuIgorICAgIGdkYl90ZXN0ICJwIDEwLjBFKzIwIC5HVC4gMTAuMEUrMjEiICIgPSAuRkFMU0UuIgorICAgIGdkYl90ZXN0ICJwIDEwLjBlKzIwIC5MVC4gMTAuMGUrMjEiICIgPSAuVFJVRS4iCisgICAgZ2RiX3Rlc3QgInAgMTAuMGUrMjAgLkdULiAxMC4wZSsyMSIgIiA9IC5GQUxTRS4iCisgICAgZ2RiX3Rlc3QgInAgMTAuMEQtMTEgLkxULiAxMC4wRC0xMCIgIiA9IC5UUlVFLiIKKyAgICBnZGJfdGVzdCAicCAxMC4wRC0xMSAuR1QuIDEwLjBELTEwIiAiID0gLkZBTFNFLiIKKyAgICBnZGJfdGVzdCAicCAxMC4wZC0xMSAuTFQuIDEwLjBkLTEwIiAiID0gLlRSVUUuIgorICAgIGdkYl90ZXN0ICJwIDEwLjBkLTExIC5HVC4gMTAuMGQtMTAiICIgPSAuRkFMU0UuIgorICAgIGdkYl90ZXN0ICJwIDEwLjBFLTExIC5MVC4gMTAuMEUtMTAiICIgPSAuVFJVRS4iCisgICAgZ2RiX3Rlc3QgInAgMTAuMEUtMTEgLkdULiAxMC4wRS0xMCIgIiA9IC5GQUxTRS4iCisgICAgZ2RiX3Rlc3QgInAgMTAuMGUtMTEgLkxULiAxMC4wZS0xMCIgIiA9IC5UUlVFLiIKKyAgICBnZGJfdGVzdCAicCAxMC4wZS0xMSAuR1QuIDEwLjBlLTEwIiAiID0gLkZBTFNFLiIKK30KKworcHJvYyB0ZXN0X2NvbnZlbmllbmNlX3ZhcmlhYmxlcyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIGdkYl90ZXN0ICJzZXQgXCRmb28gPSAxMDEiCSIgPSAxMDFcW1xyXG5cXSoiIFwKKwkiU2V0IGEgbmV3IGNvbnZlbmllbmNlIHZhcmlhYmxlIgorCisgICAgZ2RiX3Rlc3QgInByaW50IFwkZm9vIgkJIiA9IDEwMSIgXAorCSJQcmludCBjb250ZW50cyBvZiBuZXcgY29udmVuaWVuY2UgdmFyaWFibGUiCisKKyAgICBnZGJfdGVzdCAic2V0IFwkZm9vID0gMzAxIgkiID0gMzAxXFtcclxuXF0qIiBcCisJIlNldCBjb252ZW5pZW5jZSB2YXJpYWJsZSB0byBhIG5ldyB2YWx1ZSIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJGZvbyIJCSIgPSAzMDEiIFwKKwkiUHJpbnQgbmV3IGNvbnRlbnRzIG9mIGNvbnZlbmllbmNlIHZhcmlhYmxlIgorCisgICAgZ2RiX3Rlc3QgInNldCBcJF8gPSAxMSIJCSIgPSAxMVxbXHJcblxdKiIgXAorCSJTZXQgY29udmVuaWVuY2UgdmFyaWFibGUgXCRfIgorCisgICAgZ2RiX3Rlc3QgInByaW50IFwkXyIJCSIgPSAxMSIgXAorCSJQcmludCBjb250ZW50cyBvZiBjb252ZW5pZW5jZSB2YXJpYWJsZSBcJF8iCisKKyAgICBnZGJfdGVzdCAicHJpbnQgXCRmb28gKyAxMCIJIiA9IDMxMSIgXAorCSJVc2UgY29udmVuaWVuY2UgdmFyaWFibGUgaW4gYXJpdGhtZXRpYyBleHByZXNzaW9uIgorCisgICAgZ2RiX3Rlc3QgInByaW50IChcJGZvbyA9IDMyKSArIDQiCSIgPSAzNiIgXAorCSJVc2UgY29udmVuaWVuY2UgdmFyaWFibGUgYXNzaWdubWVudCBpbiBhcml0aG1ldGljIGV4cHJlc3Npb24iCisKKyAgICBnZGJfdGVzdCAicHJpbnQgXCRiYXIiCQkiID0gVk9JRCIgXAorCSJQcmludCBjb250ZW50cyBvZiB1bmluaXRpYWxpemVkIGNvbnZlbmllbmNlIHZhcmlhYmxlIgorfQorCitwcm9jIHRlc3RfdmFsdWVfaGlzdG9yeSB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIGdkYl90ZXN0ICJwcmludCAxMDEiCSJcXFwkMSA9IDEwMSIgXAorCSJTZXQgdmFsdWUtaGlzdG9yeVxbMVxdIHVzaW5nIFwkMSIKKworICAgIGdkYl90ZXN0ICJwcmludCAxMDIiIAkiXFxcJDIgPSAxMDIiIFwKKwkiU2V0IHZhbHVlLWhpc3RvcnlcWzJcXSB1c2luZyBcJDIiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgMTAzIgkiXFxcJDMgPSAxMDMiIFwKKwkiU2V0IHZhbHVlLWhpc3RvcnlcWzNcXSB1c2luZyBcJDMiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgXCRcJCIJIlxcXCQ0ID0gMTAyIiBcCisJIlByaW50IHZhbHVlLWhpc3RvcnlcW01BWC0xXF0gdXNpbmcgaW5wbGljaXQgaW5kZXggXCRcJCIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJFwkIgkiXFxcJDUgPSAxMDMiIFwKKwkiUHJpbnQgdmFsdWUtaGlzdG9yeVxbTUFYLTFcXSBhZ2FpbiB1c2luZyBpbXBsaWNpdCBpbmRleCBcJFwkIgorCisgICAgZ2RiX3Rlc3QgInByaW50IFwkIgkiXFxcJDYgPSAxMDMiIFwKKwkiUHJpbnQgdmFsdWUtaGlzdG9yeVxbTUFYXF0gdXNpbmcgaW1wbGljaXQgaW5kZXggXCQiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgXCRcJDIiCSJcXFwkNyA9IDEwMiIgXAorCSJQcmludCB2YWx1ZS1oaXN0b3J5XFtNQVgtMlxdIHVzaW5nIGV4cGxpY2l0IGluZGV4IFwkXCQyIgorCisgICAgZ2RiX3Rlc3QgInByaW50IFwkMCIJIlxcXCQ4ID0gMTAyIiBcCisJIlByaW50IHZhbHVlLWhpc3RvcnlcW01BWFxdIHVzaW5nIGV4cGxpY2l0IGluZGV4IFwkMCIKKworICAgIGdkYl90ZXN0ICJwcmludCAxMDgiCSJcXFwkOSA9IDEwOCIgIiIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJFwkMCIJIlxcXCQxMCA9IDEwOCIgXAorCSJQcmludCB2YWx1ZS1oaXN0b3J5XFtNQVhcXSB1c2luZyBleHBsaWNpdCBpbmRleCBcJFwkMCIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJDEiCSJcXFwkMTEgPSAxMDEiIFwKKwkiUHJpbnQgdmFsdWUtaGlzdG9yeVxbMVxdIHVzaW5nIGV4cGxpY2l0IGluZGV4IFwkMSIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJDIiCSJcXFwkMTIgPSAxMDIiIFwKKwkiUHJpbnQgdmFsdWUtaGlzdG9yeVxbMlxdIHVzaW5nIGV4cGxpY2l0IGluZGV4IFwkMiIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJDMiCSJcXFwkMTMgPSAxMDMiIFwKKwkiUHJpbnQgdmFsdWUtaGlzdG9yeVxbM1xdIHVzaW5nIGV4cGxpY2l0IGluZGV4IFwkMyIKKworICAgIGdkYl90ZXN0ICJwcmludCBcJC0zIgkiXFxcJDE0ID0gMTAwIiBcCisJIlByaW50ICh2YWx1ZS1oaXN0b3J5XFtNQVhcXSAtIDMpIHVzaW5nIGltcGxpY2l0IGluZGV4IFwkIgorCisgICAgZ2RiX3Rlc3QgInByaW50IFwkMSArIDMiCSJcXFwkMTUgPSAxMDQiIFwKKwkiVXNlIHZhbHVlLWhpc3RvcnkgZWxlbWVudCBpbiBhcml0aG1ldGljIGV4cHJlc3Npb24iCit9CisKK3Byb2MgdGVzdF9hcml0aG1ldGljX2V4cHJlc3Npb25zIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgIyBUZXN0IHVuYXJ5IG1pbnVzIHdpdGggdmFyaW91cyBvcGVyYW5kcworCisjICAgIGdkYl90ZXN0ICJwIC0oVFJVRSkiCSIgPSAtMSIJInVuYXJ5IG1pbnVzIGFwcGxpZWQgdG8gYm9vbCIKKyMgICAgZ2RiX3Rlc3QgInAgLSgnYScpIgkiID0geHh4IgkidW5hcnkgbWludXMgYXBwbGllZCB0byBjaGFyIgorICAgIGdkYl90ZXN0ICJwIC0oMSkiCQkiID0gLTEiCSJ1bmFyeSBtaW51cyBhcHBsaWVkIHRvIGludCIKKyAgICBnZGJfdGVzdCAicCAtKDEuMCkiCSIgPSAtMSIJInVuYXJ5IG1pbnVzIGFwcGxpZWQgdG8gcmVhbCIKKworICAgICMgVGVzdCBhZGRpdGlvbiB3aXRoIHZhcmlvdXMgb3BlcmFuZHMKKworICAgIGdkYl90ZXN0ICJwIC5UUlVFLiArIDEiCSIgPSAyIgkiYm9vbCBwbHVzIGludCIKKyAgICBnZGJfdGVzdCAicCAxICsgMSIJCSIgPSAyIgkiaW50IHBsdXMgaW50IgorICAgIGdkYl90ZXN0ICJwIDEuMCArIDEiCSIgPSAyIgkicmVhbCBwbHVzIGludCIKKyAgICBnZGJfdGVzdCAicCAxLjAgKyAyLjAiCSIgPSAzIgkicmVhbCBwbHVzIHJlYWwiCisKKyAgICAjIFRlc3Qgc3VidHJhY3Rpb24gd2l0aCB2YXJpb3VzIG9wZXJhbmRzCisKKyAgICBnZGJfdGVzdCAicCAuVFJVRS4gLSAxIgkiID0gMCIJImJvb2wgbWludXMgaW50IgorICAgIGdkYl90ZXN0ICJwIDMgLSAxIgkJIiA9IDIiCSJpbnQgbWludXMgaW50IgorICAgIGdkYl90ZXN0ICJwIDMuMCAtIDEiCSIgPSAyIgkicmVhbCBtaW51cyBpbnQiCisgICAgZ2RiX3Rlc3QgInAgNS4wIC0gMi4wIgkiID0gMyIJInJlYWwgbWludXMgcmVhbCIKKworICAgICMgVGVzdCBtdWx0aXBsaWNhdGlvbiB3aXRoIHZhcmlvdXMgb3BlcmFuZHMKKworICAgIGdkYl90ZXN0ICJwIC5UUlVFLiAqIDEiCSIgPSAxIgkiYm9vbCB0aW1lcyBpbnQiCisgICAgZ2RiX3Rlc3QgInAgMiAqIDMiCQkiID0gNiIJImludCB0aW1lcyBpbnQiCisgICAgZ2RiX3Rlc3QgInAgMi4wICogMyIJIiA9IDYiCSJyZWFsIHRpbWVzIGludCIKKyAgICBnZGJfdGVzdCAicCAyLjAgKiAzLjAiCSIgPSA2IgkicmVhbCB0aW1lcyByZWFsIgorCisgICAgIyBUZXN0IGRpdmlzaW9uIHdpdGggdmFyaW91cyBvcGVyYW5kcworCisgICAgZ2RiX3Rlc3QgInAgLlRSVUUuIC8gMSIJIiA9IDEiCSJib29sIGRpdmlkZWQgYnkgaW50IgorICAgIGdkYl90ZXN0ICJwIDYgLyAzIgkJIiA9IDIiCSJpbnQgZGl2aWRlZCBieSBpbnQiCisgICAgZ2RiX3Rlc3QgInAgNi4wIC8gMyIJIiA9IDIiCSJyZWFsIGRpdmlkZWQgYnkgaW50IgorICAgIGdkYl90ZXN0ICJwIDYuMCAvIDMuMCIJIiA9IDIiCSJyZWFsIGRpdmlkZWQgYnkgcmVhbCIKKworICAgICMgVGVzdCBtb2R1bG8gd2l0aCB2YXJpb3VzIG9wZXJhbmRzCisKK30KKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKworZ2RiX3Rlc3QgInNldCBwcmludCBzZXZlbmJpdC1zdHJpbmdzIiAiIgorCitpZiBbc2V0X2xhbmdfZm9ydHJhbl0gdGhlbiB7CisgICAgdGVzdF92YWx1ZV9oaXN0b3J5CisgICAgdGVzdF9jb252ZW5pZW5jZV92YXJpYWJsZXMKKyAgICB0ZXN0X2ludGVnZXJfbGl0ZXJhbHNfYWNjZXB0ZWQKKyAgICB0ZXN0X2ludGVnZXJfbGl0ZXJhbHNfcmVqZWN0ZWQKKyAgICB0ZXN0X2xvZ2ljYWxfbGl0ZXJhbHNfYWNjZXB0ZWQKKyAgICB0ZXN0X2NoYXJhY3Rlcl9saXRlcmFsc19hY2NlcHRlZAorICAgIHRlc3RfZmxvYXRfbGl0ZXJhbHNfYWNjZXB0ZWQKKyAgICB0ZXN0X2FyaXRobWV0aWNfZXhwcmVzc2lvbnMKK30gZWxzZSB7CisgICAgd2FybmluZyAiJHRlc3RfbmFtZSB0ZXN0cyBzdXBwcmVzc2VkLiIgMAorfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuZm9ydHJhbi90eXBlcy5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5mb3J0cmFuL3R5cGVzLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjk5YTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuZm9ydHJhbi90eXBlcy5leHAKQEAgLTAsMCArMSwxMTQgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgYWRhcHRlZCBmcm9tIENoaWxsIHRlc3RzIGJ5IFN0YW4gU2hlYnMgKHNoZWJzQGN5Z251cy5jb20pLgorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKKyMgU2V0IHRoZSBjdXJyZW50IGxhbmd1YWdlIHRvIGZvcnRyYW4uICBUaGlzIGNvdW50cyBhcyBhIHRlc3QuICBJZiBpdAorIyBmYWlscywgdGhlbiB3ZSBza2lwIHRoZSBvdGhlciB0ZXN0cy4KKworcHJvYyBzZXRfbGFuZ19mb3J0cmFuIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIAorICAgIGlmIFtnZGJfdGVzdCAic2V0IGxhbmd1YWdlIGZvcnRyYW4iICIiXSB7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgIVtnZGJfdGVzdCAic2hvdyBsYW5ndWFnZSIgIi4qIHNvdXJjZSBsYW5ndWFnZSBpcyBcImZvcnRyYW5cIi4qIl0geworCXJldHVybiAxOworICAgIH0gZWxzZSB7CisJcmV0dXJuIDA7CisgICAgfQorfQorCitwcm9jIHRlc3RfaW50ZWdlcl9saXRlcmFsX3R5cGVzX2FjY2VwdGVkIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgIyBUZXN0IHZhcmlvdXMgZGVjaW1hbCB2YWx1ZXMuCisgICAgIyBTaG91bGQgYmUgaW50ZWdlcio0IHByb2JhYmx5LgorICAgIGdkYl90ZXN0ICJwdCAxMjMiICJ0eXBlID0gaW50IiAKK30KKworcHJvYyB0ZXN0X2NoYXJhY3Rlcl9saXRlcmFsX3R5cGVzX2FjY2VwdGVkIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgIyBUZXN0IHZhcmlvdXMgY2hhcmFjdGVyIHZhbHVlcy4KKworICAgIGdkYl90ZXN0ICJwdCAnYSciICJ0eXBlID0gY2hhcmFjdGVyXFwqMSIKK30KKworcHJvYyB0ZXN0X2ludGVnZXJfbGl0ZXJhbF90eXBlc19yZWplY3RlZCB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIHRlc3RfcHJpbnRfcmVqZWN0ICJwdCBfIgorfQorCitwcm9jIHRlc3RfbG9naWNhbF9saXRlcmFsX3R5cGVzX2FjY2VwdGVkIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgIyBUZXN0IHRoZSBvbmx5IHBvc3NpYmxlIHZhbHVlcyBmb3IgYSBsb2dpY2FsLCBUUlVFIGFuZCBGQUxTRS4KKworICAgIGdkYl90ZXN0ICJwdCAuVFJVRS4iICJ0eXBlID0gbG9naWNhbFxcKjIiCisgICAgZ2RiX3Rlc3QgInB0IC5GQUxTRS4iICJ0eXBlID0gbG9naWNhbFxcKjIiCit9CisKK3Byb2MgdGVzdF9mbG9hdF9saXRlcmFsX3R5cGVzX2FjY2VwdGVkIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgIyBUZXN0IHZhcmlvdXMgZmxvYXRpbmcgcG9pbnQgZm9ybWF0cworCisgICAgIyB0aGlzIHVzZWQgdG8gZ3Vlc3Mgd2hldGhlciB0byBsb29rIGZvciAicmVhbCo0IiBvcgorICAgICMgInJlYWwqOCIgYmFzZWQgb24gYSB0YXJnZXQgY29uZmlnIHZhcmlhYmxlLCBidXQgbm9vbmUKKyAgICAjIG1haW50YWluZWQgaXQgcHJvcGVybHkuCisKKyAgICBnZGJfdGVzdCAicHQgLjQ0IiAidHlwZSA9IHJlYWxcXCpcWzAtOVxdKyIKKyAgICBnZGJfdGVzdCAicHQgNDQuMCIgInR5cGUgPSByZWFsXFwqXFswLTlcXSsiCisgICAgZ2RiX3Rlc3QgInB0IDEwRDIwIiAidHlwZSA9IHJlYWxcXCpcWzAtOVxdKyIKKyAgICBnZGJfdGVzdCAicHQgMTBEMjAiICJ0eXBlID0gcmVhbFxcKlxbMC05XF0rIgorICAgIGdkYl90ZXN0ICJwdCAxMGQyMCIgInR5cGUgPSByZWFsXFwqXFswLTlcXSsiCisgICAgZ2RiX3Rlc3QgInB0IDEwZDIwIiAidHlwZSA9IHJlYWxcXCpcWzAtOVxdKyIKKyAgICBnZGJfdGVzdCAicHQgMTBFMjAiICJ0eXBlID0gcmVhbFxcKlxbMC05XF0rIgorICAgIGdkYl90ZXN0ICJwdCAxMEUyMCIgInR5cGUgPSByZWFsXFwqXFswLTlcXSsiCisgICAgZ2RiX3Rlc3QgInB0IDEwZTIwIiAidHlwZSA9IHJlYWxcXCpcWzAtOVxdKyIKKyAgICBnZGJfdGVzdCAicHQgMTBlMjAiICJ0eXBlID0gcmVhbFxcKlxbMC05XF0rIgorfQorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCitnZGJfdGVzdCAic2V0IHByaW50IHNldmVuYml0LXN0cmluZ3MiICIiCisKK2lmIFtzZXRfbGFuZ19mb3J0cmFuXSB0aGVuIHsKKyAgICB0ZXN0X2ludGVnZXJfbGl0ZXJhbF90eXBlc19hY2NlcHRlZAorICAgIHRlc3RfaW50ZWdlcl9saXRlcmFsX3R5cGVzX3JlamVjdGVkCisgICAgdGVzdF9sb2dpY2FsX2xpdGVyYWxfdHlwZXNfYWNjZXB0ZWQKKyAgICB0ZXN0X2NoYXJhY3Rlcl9saXRlcmFsX3R5cGVzX2FjY2VwdGVkCisgICAgdGVzdF9mbG9hdF9saXRlcmFsX3R5cGVzX2FjY2VwdGVkCit9IGVsc2UgeworICAgIHdhcm5pbmcgIiR0ZXN0X25hbWUgdGVzdHMgc3VwcHJlc3NlZC4iIDAKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL01ha2VmaWxlLmluIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1ZmM3NQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMjUgQEAKK1ZQQVRIID0gQHNyY2RpckAKK3NyY2RpciA9IEBzcmNkaXJACisKK1BST0dTID0gYW1iaWd1b3VzIGN0dGktYWRkIGV4Y2VwdGlvbiBnZW4tc28tdGhyZXNoIG5hbWVzcGFjZSBcCisJb3B0aW1pemUgcHhkYiBzby10aHJlc2ggdGVtcGwtaHAgd2F0Y2gtaHAgeGRiIAorCitNSVNDRUxMQU5FT1VTID0gXAorCWxpYjAwLXNvLXRocmVzaC5jIGxpYjAwLXNvLXRocmVzaC5zbCBcCisJbGliMDEtc28tdGhyZXNoLmMgbGliMDEtc28tdGhyZXNoLnNsIFwKKwlsaWIwMi1zby10aHJlc2guYyBsaWIwMi1zby10aHJlc2guc2wgXAorCXNvLXRocmVzaC5jIHNvLXRocmVzaC5saW5rb3B0cworCithbGw6IAorCUBlY2hvICJOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIGFsbC4uLiIKKworIyMjIyBob3N0LCB0YXJnZXQsIGFuZCBzaXRlIHNwZWNpZmljIE1ha2VmaWxlIGZyYWdzIGNvbWUgaW4gaGVyZS4KKworY2xlYW4gbW9zdGx5Y2xlYW46CisJLXJtIC1mICouY2kgKi5vICQoT0JKUykgJChQUk9HUykgJChNSVNDRUxMQU5FT1VTKSAqfiBjb3JlCisKK2Rpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogY2xlYW4KKwktcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cyBjb25maWcubG9nCisKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChzcmNkaXIpL2NvbmZpZ3VyZS5pbgorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2FtYmlndW91cy5jYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2FtYmlndW91cy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWU3YmMxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvYW1iaWd1b3VzLmNjCkBAIC0wLDAgKzEsMTEwIEBACisKK3ZvaWQgbWFya2VyMSgpCit7CisgIHJldHVybjsKK30KKworY2xhc3MgQTEgeworcHVibGljOgorICBpbnQgeDsKKyAgaW50IHk7Cit9OworCitjbGFzcyBBMiB7CitwdWJsaWM6CisgIGludCB4OworICBpbnQgeTsKK307CisKK2NsYXNzIEEzIHsKK3B1YmxpYzoKKyAgaW50IHg7CisgIGludCB5OworfTsKKworY2xhc3MgWCA6IHB1YmxpYyBBMSwgcHVibGljIEEyIHsKK3B1YmxpYzoKKyAgaW50IHo7Cit9OworCitjbGFzcyBMIDogcHVibGljIEExIHsKK3B1YmxpYzoKKyAgaW50IHo7Cit9OworCitjbGFzcyBMViA6IHB1YmxpYyB2aXJ0dWFsIEExIHsKK3B1YmxpYzoKKyAgaW50IHo7Cit9OworCitjbGFzcyBNIDogcHVibGljIEEyIHsKK3B1YmxpYzoKKyAgaW50IHc7Cit9OworCitjbGFzcyBOIDogcHVibGljIEwsIHB1YmxpYyBNIHsKK3B1YmxpYzoKKyAgaW50IHI7Cit9OworCitjbGFzcyBLIDogcHVibGljIEExIHsKK3B1YmxpYzoKKyAgaW50IGk7Cit9OworCitjbGFzcyBLViA6IHB1YmxpYyB2aXJ0dWFsIEExIHsKK3B1YmxpYzoKKyAgaW50IGk7Cit9OworCitjbGFzcyBKIDogcHVibGljIEssIHB1YmxpYyBMIHsKK3B1YmxpYzoKKyAgaW50IGo7Cit9OworCitjbGFzcyBKViA6IHB1YmxpYyBLViwgcHVibGljIExWIHsKK3B1YmxpYzoKKyAgaW50IGp2OworfTsKKworY2xhc3MgSlZBMSA6IHB1YmxpYyBLViwgcHVibGljIExWLCBwdWJsaWMgQTEgeworcHVibGljOgorICBpbnQganZhMTsKK307CisKK2NsYXNzIEpWQTIgOiBwdWJsaWMgS1YsIHB1YmxpYyBMViwgcHVibGljIEEyIHsKK3B1YmxpYzoKKyAgaW50IGp2YTI7Cit9OworCitjbGFzcyBKVkExViA6IHB1YmxpYyBLViwgcHVibGljIExWLCBwdWJsaWMgdmlydHVhbCBBMSB7CitwdWJsaWM6CisgIGludCBqdmExdjsKK307CisKK2ludCBtYWluKCkKK3sKKyAgQTEgYTE7CisgIEEyIGEyOworICBBMyBhMzsKKyAgWCB4OworICBMIGw7CisgIE0gbTsKKyAgTiBuOworICBLIGs7CisgIEogajsKKyAgSlYganY7CisgIEpWQTEganZhMTsKKyAgSlZBMiBqdmEyOworICBKVkExViBqdmExdjsKKyAgCisgIGludCBpOworCisgIGkgKz0gay5pICsgbS53ICsgYTEueCArIGEyLnggKyBhMy54ICsgeC56ICsgbC56ICsgbi5yICsgai5qOworCisgIG1hcmtlcjEoKTsKKyAgCit9CisKKworICAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2FtYmlndW91cy5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9hbWJpZ3VvdXMuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViODdhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9hbWJpZ3VvdXMuZXhwCkBAIC0wLDAgKzEsMjE2IEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZ2RiIHRlc3RzdWl0ZQorCisjIHRlc3RzIHJlbGF0aW5nIHRvIGFtYmlndW91cyBjbGFzcyBtZW1iZXJzCisjIFdyaXR0ZW4gYnkgU2F0aXNoIFBhaSA8cGFpQGFwb2xsby5ocC5jb20+IDE5OTctMDctMjgKKworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZ2RiIHRlc3RzdWl0ZQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCisgICAgICAgIH0KKworIworIyB0ZXN0IHJ1bm5pbmcgcHJvZ3JhbXMKKyMKKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAiYW1iaWd1b3VzIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uY2MKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworaWYgW2dldF9jb21waWxlcl9pbmZvICR7YmluZmlsZX0gImMrKyJdIHsKKyAgICByZXR1cm4gLTE7Cit9CisgCisgCitpZiB7W3NraXBfaHBfdGVzdHMgJGdjY19jb21waWxlZF19IHRoZW4geyBjb250aW51ZSB9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYysrfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisKKyMKKyMgc2V0IGl0IHVwIGF0IGEgYnJlYWtwb2ludCBzbyB3ZSBjYW4gcGxheSB3aXRoIHRoZSB2YXJpYWJsZSB2YWx1ZXMKKyMKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgcGVycm9yICJjb3VsZG4ndCBydW4gdG8gYnJlYWtwb2ludCIKKyAgICBjb250aW51ZQorfQorCitzZW5kX2dkYiAiYnJlYWsgbWFya2VyMVxuIiA7IGdkYl9leHBlY3QgLXJlICIuKiRnZGJfcHJvbXB0ICQiCisgICAgc2VuZF9nZGIgImNvbnRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJCcmVhay4qIG1hcmtlcjEgXFwoXFwpIGF0IC4qOiRkZWNpbWFsLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBzZW5kX2dkYiAidXBcbiIKKyAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInVwIGZyb20gbWFya2VyMSIgfQorICAgICAgICAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJ1cCBmcm9tIG1hcmtlcjEiIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY29udGludWUgdG8gbWFya2VyMSIgIH0KKyAgICAgICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjb250aW51ZSB0byBtYXJrZXIxIiAgfQorICAgIH0KKworIyBwcmludCBvdXQgdmFyaW91cyBjbGFzcyBvYmplY3RzJyBtZW1iZXJzLiAgVGhlIHZhbHVlcyBhcmVuJ3QKKyMgaW1wb3J0YW50LCBqdXN0IGNoZWNrIHRoYXQgdGhlIHdhcm5pbmcgaXMgZW1pdHRlZCBhdCB0aGUKKyMgcmlnaHQgdGltZXMuIAorCisjIFggaXMgZGVyaXZlZCBmcm9tIEExIGFuZCBBMjsgYm90aCBBMSBhbmQgQTIgaGF2ZSBhIG1lbWJlciAneCcKK3NlbmRfZ2RiICJwcmludCB4LnhcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJ3YXJuaW5nOiB4IGFtYmlndW91czsgdXNpbmcgWDo6QTE6OnguIFVzZSBhIGNhc3QgdG8gZGlzYW1iaWd1YXRlLlxyXG5cXCRcWzAtOVxdKiA9IDBcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgIHBhc3MgInByaW50IHgueCIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHgueCIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB4LngiIH0KK30KKworCisjIE4gaXMgZGVyaXZlZCBmcm9tIEExIGFuZCBBMiwgYnV0IG5vdCBpbW1lZGlhdGVseSAtLSB0d28gc3RlcHMKKyMgdXAgaW4gdGhlIGhpZXJhcmNoeS4gQm90aCBBMSBhbmQgQTIgaGF2ZSBhIG1lbWJlciAneCcuCitzZW5kX2dkYiAicHJpbnQgbi54XG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAid2FybmluZzogeCBhbWJpZ3VvdXM7IHVzaW5nIE46Okw6OkExOjp4LiBVc2UgYSBjYXN0IHRvIGRpc2FtYmlndWF0ZS5cclxuXFwkXFswLTlcXSogPSAwXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICBwYXNzICJwcmludCBuLngiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBuLngiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgbi54IiB9Cit9CisKKyMgSiBpcyBkZXJpdmVkIGZyb20gQTEgdHdpY2UuICBBMSBoYXMgYSBtZW1iZXIgeC4gCitzZW5kX2dkYiAicHJpbnQgai54XG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAid2FybmluZzogeCBhbWJpZ3VvdXM7IHVzaW5nIEo6Oks6OkExOjp4LiBVc2UgYSBjYXN0IHRvIGRpc2FtYmlndWF0ZS5cclxuXFwkXFswLTlcXSogPSAwXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICBwYXNzICJwcmludCBqLngiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBqLngiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgai54IiB9Cit9CisKKyMgSlYgaXMgZGVyaXZlZCBmcm9tIEExIGJ1dCBBMSBpcyBhIHZpcnR1YWwgYmFzZS4gU2hvdWxkIG5vdAorIyByZXBvcnQgYW4gYW1iaWd1aXR5IGluIHRoaXMgY2FzZS4gCitzZW5kX2dkYiAicHJpbnQganYueFxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIndhcm5pbmc6IHggYW1iaWd1b3VzLipVc2UgYSBjYXN0IHRvIGRpc2FtYmlndWF0ZS5cclxuXFwkXFswLTlcXSogPSAwXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICBmYWlsICJwcmludCBqdi54IChhbWJpZ3VpdHkgcmVwb3J0ZWQpIgorICAgfQorICAgLXJlICJcXCRcWzAtOVxdKiA9IDBcclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBqdi54IiB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBqdi54ICg/PykiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQganYueCIgfQorfQorCisjIEpWQTEgaXMgZGVyaXZlZCBmcm9tIEExOyBBMSBvY2N1cnMgYXMgYSB2aXJ0dWFsIGJhc2UgaW4gdHdvCisjIGFuY2VzdG9ycywgYW5kIGFzIGEgbm9uLXZpcnR1YWwgaW1tZWRpYXRlIGJhc2UuIEFtYmlndWl0eSBtdXN0CisjIGJlIHJlcG9ydGVkLiAKK3NlbmRfZ2RiICJwcmludCBqdmExLnhcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJ3YXJuaW5nOiB4IGFtYmlndW91czsgdXNpbmcgSlZBMTo6S1Y6OkExOjp4LiBVc2UgYSBjYXN0IHRvIGRpc2FtYmlndWF0ZS5cclxuXFwkXFswLTlcXSogPSAwXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICBwYXNzICJwcmludCBqdmExLngiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBqdmExLngiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQganZhMS54IiB9Cit9CisKKyMgSlZBMiBpcyBkZXJpdmVkIGZyb20gQTEgJiBBMjsgQTEgb2NjdXJzIGFzIGEgdmlydHVhbCBiYXNlIGluIHR3bworIyBhbmNlc3RvcnMsIGFuZCBBMiBpcyBhIG5vbi12aXJ0dWFsIGltbWVkaWF0ZSBiYXNlLiBBbWJpZ3VpdHkgbXVzdAorIyBiZSByZXBvcnRlZCBhcyBBMSBhbmQgQTIgYm90aCBoYXZlIGEgbWVtYmVyICd4Jy4KK3NlbmRfZ2RiICJwcmludCBqdmEyLnhcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJ3YXJuaW5nOiB4IGFtYmlndW91czsgdXNpbmcgSlZBMjo6S1Y6OkExOjp4LiBVc2UgYSBjYXN0IHRvIGRpc2FtYmlndWF0ZS5cclxuXFwkXFswLTlcXSogPSAwXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICBwYXNzICJwcmludCBqdmEyLngiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBqdmEyLngiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQganZhMi54IiB9Cit9CisKKyMgSlZBMVYgaXMgZGVyaXZlZCBmcm9tIEExOyBBMSBvY2N1cnMgYXMgYSB2aXJ0dWFsIGJhc2UgaW4gdHdvCisjIGFuY2VzdG9ycywgYW5kIGFsc28gYXMgYSB2aXJ0dWFsIGltbWVkaWF0ZSBiYXNlLiBBbWJpZ3VpdHkgbXVzdAorIyBub3QgYmUgcmVwb3J0ZWQuCitzZW5kX2dkYiAicHJpbnQganZhMXYueFxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIndhcm5pbmc6IHggYW1iaWd1b3VzLipVc2UgYSBjYXN0IHRvIGRpc2FtYmlndWF0ZS5cclxuXFwkXFswLTlcXSogPSAwXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICBmYWlsICJwcmludCBqdmExdi54IChhbWJpZ3VpdHkgcmVwb3J0ZWQpIgorICAgfQorICAgLXJlICJcXCRcWzAtOVxdKiA9IDBcclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBqdmExdi54IiB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBqdmExdi54ICg/PykiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQganZhMXYueCIgfQorfQorCisjIE5vdyBjaGVjayBmb3IgYW1iaWd1b3VzIGJhc2VzLgorCisjIEogaXMgZGVyaXZlZCBmcm9tIEExIHR3aWNlOyByZXBvcnQgYW1iaWd1aXR5IGlmIGEgSiBpcworIyBjYXN0IHRvIGFuIEExLgorc2VuZF9nZGIgInByaW50IChBMSlqXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAid2FybmluZzogQTEgYW1iaWd1b3VzOyB1c2luZyBKOjpLOjpBMS4gVXNlIGEgY2FzdCB0byBkaXNhbWJpZ3VhdGUuXHJcblxcJFxbMC05XF0qID0gXHt4ID0gMCwgeSA9IDBcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgcGFzcyAicHJpbnQgKEExKWoiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCAoQTEpaiIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBwcmludCAoQTEpaiIgfQorfQorCisjIEpWIGlzIGRlcml2ZWQgZnJvbSBBMSB0d2ljZSwgYnV0IEExIGlzIGEgdmlydHVhbCBiYXNlOyBzaG91bGQKKyMgbm90IHJlcG9ydCBhbWJpZ3VpdHkgd2hlbiBhIEpWIGlzIGNhc3QgdG8gYW4gQTEuCitzZW5kX2dkYiAicHJpbnQgKEExKWp2XG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAid2FybmluZzogQTEgYW1iaWd1b3VzLipVc2UgYSBjYXN0IHRvIGRpc2FtYmlndWF0ZS5cclxuXFwkXFswLTlcXSogPSBce3ggPSAwLCB5ID0gMFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICBmYWlsICJwcmludCAoQTEpanYgKGFtYmlndWl0eSByZXBvcnRlZCkiCisgICB9CisgICAtcmUgIlxcJFxbMC05XF0qID0gXHt4ID0gMCwgeSA9IDBcfVxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IChBMSlqdiIgfQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgKEExKWp2ICg/PykiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgcHJpbnQgKEExKWp2IiB9Cit9CisKKyMgSlZBMSBpcyBkZXJpdmVkIGZyb20gQTE7IEExIGlzIGEgdmlydHVhbCBiYXNlIGFuZCBhbHNvIGEKKyMgbm9uLXZpcnR1YWwgYmFzZS4gIE11c3QgcmVwb3J0IGFtYmlndWl0eSBpZiBhIEpWQTEgaXMgY2FzdCB0byBhbiBBMS4KK3NlbmRfZ2RiICJwcmludCAoQTEpanZhMVxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIndhcm5pbmc6IEExIGFtYmlndW91czsgdXNpbmcgSlZBMTo6S1Y6OkExLiBVc2UgYSBjYXN0IHRvIGRpc2FtYmlndWF0ZS5cclxuXFwkXFswLTlcXSogPSBce3ggPSAwLCB5ID0gMFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICBwYXNzICJwcmludCAoQTEpanZhMSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IChBMSlqdmExIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IChBMSlqdmExIiB9Cit9CisKKyMgSlZBMVYgaXMgZGVyaXZlZCBmcm9tIEExOyBBMSBpcyBhIHZpcnR1YWwgYmFzZSBpbmRpcmVjdGx5CisjIGFuZCBhbHNvIGRpcmVjdGx5OyBtdXN0IG5vdCByZXBvcnQgYW1iaWd1aXR5IHdoZW4gYSBKVkExViBpcyBjYXN0IHRvIGFuIEExLgorc2VuZF9nZGIgInByaW50IChBMSlqdmExdlxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIndhcm5pbmc6IEExIGFtYmlndW91cy4qVXNlIGEgY2FzdCB0byBkaXNhbWJpZ3VhdGUuXHJcblxcJFxbMC05XF0qID0gXHt4ID0gMCwgeSA9IDBcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgZmFpbCAicHJpbnQgKEExKWp2YTF2IChhbWJpZ3VpdHkgcmVwb3J0ZWQpIgorICAgfQorICAgLXJlICJcXCRcWzAtOVxdKiA9IFx7eCA9IDAsIHkgPSAwXH1cclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCAoQTEpanZhMXYiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCAoQTEpanZhMXYgKD8/KSIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBwcmludCAoQTEpanZhMXYiIH0KK30KKworCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC9hdHRhY2guYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2F0dGFjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYWQzYzEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9hdHRhY2guYwpAQCAtMCwwICsxLDE5IEBACisvKiBUaGlzIHByb2dyYW0gaXMgaW50ZW5kZWQgdG8gYmUgc3RhcnRlZCBvdXRzaWRlIG9mIGdkYiwgYW5kIHRoZW4KKyAgIGF0dGFjaGVkIHRvIGJ5IGdkYi4gIFRodXMsIGl0IHNpbXBseSBzcGlucyBpbiBhIGxvb3AuICBUaGUgbG9vcAorICAgaXMgZXhpdGVkIHdoZW4gJiBpZiB0aGUgdmFyaWFibGUgJ3Nob3VsZF9leGl0JyBpcyBub24temVyby4gIChJdAorICAgaXMgaW5pdGlhbGl6ZWQgdG8gemVybyBpbiB0aGlzIHByb2dyYW0sIHNvIHRoZSBsb29wIHdpbGwgbmV2ZXIKKyAgIGV4aXQgdW5sZXNzL3VudGlsIGdkYiBzZXRzIHRoZSB2YXJpYWJsZSB0byBub24temVyby4pCisgICAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCAgc2hvdWxkX2V4aXQgPSAwOworCittYWluICgpCit7CisgIGludCAgbG9jYWxfaSA9IDA7CisKKyAgd2hpbGUgKCEgc2hvdWxkX2V4aXQpCisgICAgeworICAgICAgbG9jYWxfaSsrOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2F0dGFjaC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9hdHRhY2guZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MmFjZDAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9hdHRhY2guZXhwCkBAIC0wLDAgKzEsNDE2IEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgT24gSFAtVVggMTEuMCwgdGhpcyB0ZXN0IGlzIGNhdXNpbmcgYSBwcm9jZXNzIHJ1bm5pbmcKKyMgdGhlIHByb2dyYW0gImF0dGFjaCIgdG8gYmUgbGVmdCBhcm91bmQgc3Bpbm5pbmcuCisjIFVudGlsIHdlIGZpZ3VyZSBvdXQgd2h5LCBJIGFtIGNvbW1lbnRpbmcgb3V0IHRoZSB0ZXN0CisjIHRvIGF2b2lkIHBvbGx1dGluZyB0aWFtYXQgKG91ciAxMS4wIG5pZ2h0bHkgdGVzdCBtYWNoaW5lKQorIyB3aXRoIHRoZXNlIHByb2Nlc3Nlcy4gUlQKKyMKKyMgU2V0dGluZyB0aGUgbWFnaWMgYml0IGluIHRoZSB0YXJnZXQgYXBwIHNob3VsZCB3b3JrLgorIyBJIGFkZGVkIGEgImtpbGwiLCBhbmQgYWxzbyBhIHRlc3QgZm9yIHRoZSBSMyByZWdpc3RlcgorIyAgd2FybmluZy4gICAgICAgICAgIEpCCisjIAoraWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCisJfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworCisjIGFyZSB3ZSBvbiBhIHRhcmdldCBib2FyZAoraWYgIVtpc25hdGl2ZV0gdGhlbiB7CisgICAgcmV0dXJuCit9CisKK2lmIHsgIVtpc3RhcmdldCAiaHBwYSotKi1ocHV4MTAuMzAiXSAmJiAhW2lzdGFyZ2V0ICJocHBhKi0qLWhwdXgxMS4qIl0gfSB7CisgICAgI3NldHVwX3hmYWlsICIqLSotKiIKKyAgICByZXR1cm4gMAorfQorCitzZXQgdGVzdGZpbGUgImF0dGFjaCIKK3NldCBzcmNmaWxlICAke3Rlc3RmaWxlfS5jCitzZXQgc3JjZmlsZTIgJHt0ZXN0ZmlsZX0yLmMKK3NldCBiaW5maWxlICAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CitzZXQgYmluZmlsZTIgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfTIKK3NldCBjbGVhbnVwZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LmF3aworCisjZXhlY3V0ZV9hbnl3aGVyZSAicm0gLWYgJHtiaW5maWxlfSAke2JpbmZpbGUyfSIKK3JlbW90ZV9leGVjIGJ1aWxkICJybSAtZiAke2JpbmZpbGV9ICR7YmluZmlsZTJ9IgorIyBGb3IgZGVidWdnaW5nIHRoaXMgdGVzdAorIworI2xvZ191c2VyIDEKKworIyBDbGVhbiBvdXQgYW55IG9sZCBmaWxlcyBmcm9tIHBhc3QgcnVucy4KKyMKK3JlbW90ZV9leGVjIGJ1aWxkICIke2NsZWFudXBmaWxlfSIKKworIyBidWlsZCB0aGUgZmlyc3QgdGVzdCBjYXNlCisjCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisjIEJ1aWxkIHRoZSBpbi1zeXN0ZW0tY2FsbCB0ZXN0CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGUyfSIgIiR7YmluZmlsZTJ9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworI2lmICB7IFtjb21waWxlICItRSAke3NyY2Rpcn0vJHtzdWJkaXJ9L2NvbXBpbGVyLmMgPj4gJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS50bXAiXSAhPSAiIiMgfSB7CisjICAgIHBlcnJvciAiQ291bGRuJ3QgbWFrZSAke3Rlc3RmaWxlfS50bXAiCisjICAgIHJldHVybiAtMQorI30KKworI2V4ZWN1dGVfYW55d2hlcmUgIm12ICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0udG1wICR7YmluZmlsZX0uY2kiCisKKyNzb3VyY2UgJHtiaW5maWxlfS5jaQorCitwcm9jIGRvX2F0dGFjaF90ZXN0cyB7fSB7CisgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgZ2xvYmFsIGJpbmZpbGUKKyAgIGdsb2JhbCBzcmNmaWxlCisgICBnbG9iYWwgdGVzdGZpbGUKKyAgIGdsb2JhbCBvYmpkaXIKKyAgIGdsb2JhbCBzdWJkaXIKKyAgIGdsb2JhbCB0aW1lb3V0CisKKyAgICMgU3RhcnQgdGhlIHByb2dyYW0gcnVubmluZyBhbmQgdGhlbiB3YWl0IGZvciBhIGJpdCwgdG8gYmUgc3VyZQorICAgIyB0aGF0IGl0IGNhbiBiZSBhdHRhY2hlZCB0by4KKyAgICMKKyAgIHNldCB0ZXN0cGlkIFtldmFsIGV4ZWMgJGJpbmZpbGUgJl0KKyAgIGV4ZWMgc2xlZXAgMgorCisgICAjIFZlcmlmeSB0aGF0IHdlIGNhbm5vdCBhdHRhY2ggdG8gbm9uc2Vuc2UuCisgICAjCisgICBzZW5kX2dkYiAiYXR0YWNoIGFiY1xuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIklsbGVnYWwgcHJvY2Vzcy1pZDogYWJjLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiYXR0YWNoIHRvIG5vbnNlbnNlIGlzIHByb2hpYml0ZWQifQorICAgICAgLXJlICJBdHRhY2hpbmcgdG8uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgIHtmYWlsICJhdHRhY2ggdG8gbm9uc2Vuc2UgaXMgcHJvaGliaXRlZCAoYm9ndXMgcGlkIGFsbG93ZWQpIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgImF0dGFjaCB0byBub25zZW5zZSBpcyBwcm9oaWJpdGVkIn0KKyAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGF0dGFjaCB0byBub25zZW5zZSBpcyBwcm9oaWJpdGVkIn0KKyAgIH0KKworICAgIyBWZXJpZnkgdGhhdCB3ZSBjYW5ub3QgYXR0YWNoIHRvIHdoYXQgYXBwZWFycyB0byBiZSBhIHZhbGlkCisgICAjIHByb2Nlc3MgSUQsIGJ1dCBpcyBhIHByb2Nlc3MgdGhhdCBkb2Vzbid0IGV4aXN0LiAgKEkgZG9uJ3QKKyAgICMgYmVsaWV2ZSBhbnkgcHJvY2VzcyBpcyBldmVyIGFzc2lnbmVkICMwLCBhdCBsZWFzdCBvbiBIUFVYLikKKyAgICMKKyAgIHNlbmRfZ2RiICJhdHRhY2ggMFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAjIFRoaXMgcmVwb25zZSBpcyBleHBlY3RlZCBvbiBIUC1VWCAxMC4yMCAoaS5lLiwgcHRyYWNlLWJhc2VkKS4KKyAgICAgIC1yZSAiQXR0YWNoaW5nIHRvLiosIHByb2Nlc3MgMC4qTm8gc3VjaCBwcm9jZXNzLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiYXR0YWNoIHRvIG5vbmV4aXN0ZW50IHByb2Nlc3MgaXMgcHJvaGliaXRlZCJ9CisgICAgICAjIFRoaXMgcmVzcG9uc2UgaXMgZXhwZWN0ZWQgb24gSFAtVVggMTAuMzAgJiAxMS4wIChpLmUuLCB0dHJhY2UtYmFzZWQpLgorICAgICAgLXJlICJBdHRhY2hpbmcgdG8uKiwgcHJvY2VzcyAwLipQZXJtaXNzaW9uIGRlbmllZC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAge3Bhc3MgImF0dGFjaCB0byBub25leGlzdGVudCBwcm9jZXNzIGlzIHByb2hpYml0ZWQifQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAiYXR0YWNoIHRvIG5vbmV4aXN0ZW50IHByb2Nlc3MgaXMgcHJvaGliaXRlZCJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBhdHRhY2ggdG8gbm9uZXhpc3RlbnQgcHJvY2VzcyBpcyBwcm9oaWJpdGVkIn0KKyAgIH0KKworICAgIyBWZXJpZnkgdGhhdCB3ZSBjYW4gYXR0YWNoIHRvIHRoZSBwcm9jZXNzIGJ5IGZpcnN0IGdpdmluZyBpdHMKKyAgICMgZXhlY3V0YWJsZSBuYW1lIHZpYSB0aGUgZmlsZSBjb21tYW5kLCBhbmQgdXNpbmcgYXR0YWNoIHdpdGgKKyAgICMgdGhlIHByb2Nlc3MgSUQuCisgICAjCisgICAjIChBY3R1YWxseSwgdGhlIHRlc3Qgc3lzdGVtIGFwcGVhcnMgdG8gZG8gdGhpcyBhdXRvbWF0aWNhbGx5CisgICAjIGZvciB1cy4gIFNvLCB3ZSBtdXN0IGFsc28gYmUgcHJlcGFyZWQgdG8gYmUgYXNrZWQgaWYgd2Ugd2FudAorICAgIyB0byBkaXNjYXJkIGFuIGV4aXN0aW5nIHNldCBvZiBzeW1ib2xzLikKKyAgICMKKyAgIHNlbmRfZ2RiICJmaWxlICRiaW5maWxlXG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiTG9hZCBuZXcgc3ltYm9sIHRhYmxlIGZyb20uKnkgb3Igbi4qJCIgeworICAgICAgICAgc2VuZF9nZGIgInlcbiIKKyAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICJSZWFkaW5nIHN5bWJvbHMgZnJvbSAkYmluZmlsZVwuXC5cLipkb25lLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiKHJlKXNldCBmaWxlLCBiZWZvcmUgYXR0YWNoMSJ9CisgICAgICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICIocmUpc2V0IGZpbGUsIGJlZm9yZSBhdHRhY2gxIn0KKyAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIChyZSlzZXQgZmlsZSwgYmVmb3JlIGF0dGFjaDEifQorICAgICAgICAgfQorICAgICAgfQorICAgICAgLXJlICJSZWFkaW5nIHN5bWJvbHMgZnJvbSAkYmluZmlsZVwuXC5cLipkb25lLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAic2V0IGZpbGUsIGJlZm9yZSBhdHRhY2gxIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgInNldCBmaWxlLCBiZWZvcmUgYXR0YWNoMSJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBzZXQgZmlsZSwgYmVmb3JlIGF0dGFjaDEifQorICAgfQorCisgICBzZW5kX2dkYiAiYXR0YWNoICR0ZXN0cGlkXG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiQXR0YWNoaW5nIHRvIHByb2dyYW0uKiRiaW5maWxlLCBwcm9jZXNzICR0ZXN0cGlkLiptYWluLiphdCAuKiRzcmNmaWxlOi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAge3Bhc3MgImF0dGFjaDEsIGFmdGVyIHNldHRpbmcgZmlsZSJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJhdHRhY2gxLCBhZnRlciBzZXR0aW5nIGZpbGUifQorICAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgYXR0YWNoMSwgYWZ0ZXIgc2V0dGluZyBmaWxlIn0KKyAgIH0KKworICAgIyBWZXJpZnkgdGhhdCB3ZSBjYW4gInNlZSIgdGhlIHZhcmlhYmxlICJzaG91bGRfZXhpdCIgaW4gdGhlCisgICAjIHByb2dyYW0sIGFuZCB0aGF0IGl0IGlzIHplcm8uCisgICAjCisgICBzZW5kX2dkYiAicHJpbnQgc2hvdWxkX2V4aXRcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICIuKiA9IDAuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJhZnRlciBhdHRhY2gxLCBwcmludCBzaG91bGRfZXhpdCJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJhZnRlciBhdHRhY2gxLCBwcmludCBzaG91bGRfZXhpdCJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBhZnRlciBhdHRhY2gxLCBwcmludCBzaG91bGRfZXhpdCJ9CisgICB9CisKKyAgICMgRGV0YWNoIHRoZSBwcm9jZXNzLgorICAgIworICAgc2VuZF9nZGIgImRldGFjaFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIkRldGFjaGluZyBmcm9tIHByb2dyYW06IC4qJGJpbmZpbGUuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJhdHRhY2gxIGRldGFjaCJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJhdHRhY2gxIGRldGFjaCJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBhdHRhY2gxIGRldGFjaCJ9CisgICB9CisKKyAgICMgV2FpdCBhIGJpdCBmb3IgZ2RiIHRvIGZpbmlzaCBkZXRhY2hpbmcKKyAgICMKKyAgIGV4ZWMgc2xlZXAgNQorCisgICAjIFB1cmdlIHRoZSBzeW1ib2xzIGZyb20gZ2RiJ3MgYnJhaW4uICAoV2Ugd2FudCB0byBiZSBjZXJ0YWluCisgICAjIHRoZSBuZXh0IGF0dGFjaCwgd2hpY2ggd29uJ3QgYmUgcHJlY2VkZWQgYnkgYSAiZmlsZSIgY29tbWFuZCwKKyAgICMgaXMgcmVhbGx5IGdldHRpbmcgdGhlIGV4ZWN1dGFibGUgZmlsZSB3aXRob3V0IG91ciBoZWxwLikKKyAgICMKKyAgIHNldCBvbGRfdGltZW91dCAkdGltZW91dAorICAgc2V0IHRpbWVvdXQgICAgIFtleHByICR0aW1lb3V0ICsgMjBdCisgICBzZW5kX2dkYiAiZmlsZVxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIi4qZ2RiIGludGVybmFsIGVycm9yLiokIiB7IAorICAgICAgICAgIGZhaWwgIkludGVybmFsIGVycm9yLCBwcm9iLiBNZW1vcnkgY29ycnVwdGlvbiIgCisgICAgICB9CisgICAgICAtcmUgIk5vIGV4ZWMgZmlsZSBub3cuKkRpc2NhcmQgc3ltYm9sIHRhYmxlLip5IG9yIG4uKiQiIHsKKyAgICAgICAgIHNlbmRfZ2RiICJ5XG4iCisgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgIC1yZSAiTm8gc3ltYm9sIGZpbGUgbm93LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiYXR0YWNoMSwgcHVyZ2luZyBzeW1ib2xzIGFmdGVyIGRldGFjaCJ9CisgICAgICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJhdHRhY2gxLCBwdXJnaW5nIHN5bWJvbHMgYWZ0ZXIgZGV0YWNoIn0KKyAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGF0dGFjaDEsIHB1cmdpbmcgc3ltYm9scyBhZnRlciBkZXRhY2gifQorICAgICAgICAgfQorICAgICAgfQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAiYXR0YWNoMSwgcHVyZ2luZyBmaWxlIGFmdGVyIGRldGFjaCJ9CisgICAgICB0aW1lb3V0ICAgICAgICAgeworICAgICAgICAgIGZhaWwgIih0aW1lb3V0KSBhdHRhY2gxLCBwdXJnaW5nIGZpbGUgYWZ0ZXIgZGV0YWNoIgorICAgICAgfQorICAgfQorICAgc2V0IHRpbWVvdXQgJG9sZF90aW1lb3V0CisKKyAgICMgVmVyaWZ5IHRoYXQgd2UgY2FuIGF0dGFjaCB0byB0aGUgcHJvY2VzcyBqdXN0IGJ5IGdpdmluZyB0aGUKKyAgICMgcHJvY2VzcyBJRC4KKyAgICMKKyAgIHNlbmRfZ2RiICJhdHRhY2ggJHRlc3RwaWRcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICJBdHRhY2hpbmcgdG8gcHJvY2VzcyAkdGVzdHBpZC4qUmVhZGluZyBzeW1ib2xzIGZyb20gJGJpbmZpbGUuKm1haW4uKmF0IC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAge3Bhc3MgImF0dGFjaDIifQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAiYXR0YWNoMiJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBhdHRhY2gyIn0KKyAgIH0KKworICAgIyBWZXJpZnkgdGhhdCB3ZSBjYW4gbW9kaWZ5IHRoZSB2YXJpYWJsZSAic2hvdWxkX2V4aXQiIGluIHRoZQorICAgIyBwcm9ncmFtLgorICAgIworICAgc2VuZF9nZGIgInNldCBzaG91bGRfZXhpdD0xXG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge3Bhc3MgImFmdGVyIGF0dGFjaDIsIHNldCBzaG91bGRfZXhpdCJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBhZnRlciBhdHRhY2gyLCBzZXQgc2hvdWxkX2V4aXQifQorICAgfQorCisgICAjIFZlcmlmeSB0aGF0IHRoZSBtb2RpZmljYXRpb24gcmVhbGx5IGhhcHBlbmVkLgorICAgIworICAgc2VuZF9nZGIgInRicmVhayAxOVxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIkJyZWFrcG9pbnQgLiphdC4qJHNyY2ZpbGUsIGxpbmUgMTkuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJhZnRlciBhdHRhY2gyLCBzZXQgdGJyZWFrIHBvc3Rsb29wIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgImFmdGVyIGF0dGFjaDIsIHNldCB0YnJlYWsgcG9zdGxvb3AifQorICAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgYWZ0ZXIgYXR0YWNoMiwgc2V0IHRicmVhayBwb3N0bG9vcCJ9CisgICB9CisgICBzZW5kX2dkYiAiY29udGludWVcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICJtYWluLiphdC4qJHNyY2ZpbGU6MTkuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJhZnRlciBhdHRhY2gyLCByZWFjaCB0YnJlYWsgcG9zdGxvb3AifQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAiYWZ0ZXIgYXR0YWNoMiwgcmVhY2ggdGJyZWFrIHBvc3Rsb29wIn0KKyAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGFmdGVyIGF0dGFjaDIsIHJlYWNoIHRicmVhayBwb3N0bG9vcCJ9CisgICB9CisKKyAgICMgQWxsb3cgdGhlIHRlc3QgcHJvY2VzcyB0byBleGl0LCB0byBjbGVhbnVwIGFmdGVyIG91cnNlbHZlcy4KKyAgICMKKyAgIHNlbmRfZ2RiICJjb250aW51ZVxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIlByb2dyYW0gZXhpdGVkIG5vcm1hbGx5LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiYWZ0ZXIgYXR0YWNoMiwgZXhpdCJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJhZnRlciBhdHRhY2gyLCBleGl0In0KKyAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGFmdGVyIGF0dGFjaDIsIGV4aXQifQorICAgfQorCisgICAjIE1ha2Ugc3VyZSB3ZSBkb24ndCBsZWF2ZSBhIHByb2Nlc3MgYXJvdW5kIHRvIGNvbmZ1c2UKKyAgICMgdGhlIG5leHQgdGVzdCBydW4gKGFuZCBwcmV2ZW50IHRoZSBjb21waWxlIGJ5IGtlZXBpbmcKKyAgICMgdGhlIHRleHQgZmlsZSBidXN5KSwgaW4gY2FzZSB0aGUgInNldCBzaG91bGRfZXhpdCIgZGlkbid0CisgICAjIHdvcmsuCisgICAjCisjICAgZXhlY3V0ZV9hbnl3aGVyZSAia2lsbCAtOSAke3Rlc3RwaWR9IgorcmVtb3RlX2V4ZWMgYnVpbGQgImtpbGwgLTkgJHt0ZXN0cGlkfSIKKyAgICMgU3RhcnQgdGhlIHByb2dyYW0gcnVubmluZyBhbmQgdGhlbiB3YWl0IGZvciBhIGJpdCwgdG8gYmUgc3VyZQorICAgIyB0aGF0IGl0IGNhbiBiZSBhdHRhY2hlZCB0by4KKyAgICMKKyAgIHNldCB0ZXN0cGlkIFtldmFsIGV4ZWMgJGJpbmZpbGUgJl0KKyAgIGV4ZWMgc2xlZXAgMgorCisgICAjIFZlcmlmeSB0aGF0IHdlIGNhbiBhdHRhY2ggdG8gdGhlIHByb2Nlc3MsIGFuZCBmaW5kIGl0cyBhLm91dAorICAgIyB3aGVuIHdlJ3JlIGNkJ2QgdG8gc29tZSBkaXJlY3RvcnkgdGhhdCBkb2Vzbid0IGNvbnRhaW4gdGhlCisgICAjIGEub3V0LiAgKFdlIHVzZSB0aGUgc291cmNlIHBhdGggc2V0IGJ5IHRoZSAiZGlyIiBjb21tYW5kLikKKyAgICMKKyAgIHNlbmRfZ2RiICJkaXIgJHtvYmpkaXJ9LyR7c3ViZGlyfVxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIi4qU291cmNlIGRpcmVjdG9yaWVzIHNlYXJjaGVkOiAuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJzZXQgc291cmNlIHBhdGgifQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAic2V0IHNvdXJjZSBwYXRoIn0KKyAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIHNldCBzb3VyY2UgcGF0aCJ9CisgICB9CisKKyAgIHNlbmRfZ2RiICJjZCAvdG1wXG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiLipXb3JraW5nIGRpcmVjdG9yeSAvdG1wLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiY2QgYXdheSBmcm9tIHByb2Nlc3MnIGEub3V0In0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgImNkIGF3YXkgZnJvbSBwcm9jZXNzJyBhLm91dCJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBjZCBhd2F5IGZyb20gcHJvY2VzcycgYS5vdXQifQorICAgfQorCisgICAjIEV4cGxpY2l0bHkgZmx1c2ggb3V0IGFueSBrbm93bGVkZ2Ugb2YgdGhlIHByZXZpb3VzIGF0dGFjaG1lbnQuCisgICBzZW5kX2dkYiAic3ltYm9sXG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiLipEaXNjYXJkIHN5bWJvbCB0YWJsZSBmcm9tLip5IG9yIG4uICQiXAorICAgICAgICAgICAgICAgICAgICAgIHtzZW5kX2dkYiAieVxuIgorICAgICAgICAgICAgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLXJlICIuKk5vIHN5bWJvbCBmaWxlIG5vdy4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiYmVmb3JlIGF0dGFjaDMsIGZsdXNoIHN5bWJvbHMifQorICAgICAgICAgICAgICAgICAgICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJiZWZvcmUgYXR0YWNoMywgZmx1c2ggc3ltYm9scyJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGJlZm9yZSBhdHRhY2gzLCBmbHVzaCBzeW1ib2xzIn0KKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgIC1yZSAiLipObyBzeW1ib2wgZmlsZSBub3cuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJiZWZvcmUgYXR0YWNoMywgZmx1c2ggc3ltYm9scyJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJiZWZvcmUgYXR0YWNoMywgZmx1c2ggc3ltYm9scyJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBiZWZvcmUgYXR0YWNoMywgZmx1c2ggc3ltYm9scyJ9CisgICB9CisgICBzZW5kX2dkYiAiZXhlY1xuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIi4qTm8gZXhlYyBmaWxlIG5vdy4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAge3Bhc3MgImJlZm9yZSBhdHRhY2gzLCBmbHVzaCBleGVjIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgImJlZm9yZSBhdHRhY2gzLCBmbHVzaCBleGVjIn0KKyAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGJlZm9yZSBhdHRhY2gzLCBmbHVzaCBleGVjIn0KKyAgIH0KKworICAgc2VuZF9nZGIgImF0dGFjaCAkdGVzdHBpZFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIkF0dGFjaGluZyB0byBwcm9jZXNzICR0ZXN0cGlkLipSZWFkaW5nIHN5bWJvbHMgZnJvbSAkYmluZmlsZS4qbWFpbi4qYXQgLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiYXR0YWNoIHdoZW4gcHJvY2VzcycgYS5vdXQgbm90IGluIGN3ZCJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJhdHRhY2ggd2hlbiBwcm9jZXNzJyBhLm91dCBub3QgaW4gY3dkIn0KKyAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGF0dGFjaCB3aGVuIHByb2Nlc3MnIGEub3V0IG5vdCBpbiBjd2QifQorICAgfQorCisgICBzZW5kX2dkYiAia2lsbFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIi4qS2lsbCB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZC4qeSBvciBuLiAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7c2VuZF9nZGIgInlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge3Bhc3MgImFmdGVyIGF0dGFjaDMsIGV4aXQifQorICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgYWZ0ZXIgYXR0YWNoMywgZXhpdCJ9CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJhZnRlciBhdHRhY2gzLCBleGl0In0KKyAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGFmdGVyIGF0dGFjaDMsIGV4aXQifQorICAgfQorfQorCitwcm9jIGRvX2NhbGxfYXR0YWNoX3Rlc3RzIHt9IHsKKyAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICBnbG9iYWwgYmluZmlsZTIKKworICAgIyBTdGFydCB0aGUgcHJvZ3JhbSBydW5uaW5nIGFuZCB0aGVuIHdhaXQgZm9yIGEgYml0LCB0byBiZSBzdXJlCisgICAjIHRoYXQgaXQgY2FuIGJlIGF0dGFjaGVkIHRvLgorICAgIworICAgc2V0IHRlc3RwaWQgW2V2YWwgZXhlYyAkYmluZmlsZTIgJl0KKyAgIGV4ZWMgc2xlZXAgMgorCisgICAjIEF0dGFjaAorICAgIworICAgc2VuZF9nZGIgImF0dGFjaCAkdGVzdHBpZFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIi4qd2FybmluZzogcmVhZGluZyByZWdpc3Rlci4qSS4qTyBlcnJvci4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgZmFpbCAiYXR0YWNoIGNhbGwsIHJlYWQgcmVnaXN0ZXIgMyBlcnJvciIKKyAgICAgfQorICAgICAtcmUgIkF0dGFjaGluZyB0by4qcHJvY2VzcyAkdGVzdHBpZC4qbGliYy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgcGFzcyAiYXR0YWNoIGNhbGwiCisgICAgIH0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgImF0dGFjaCBjYWxsIn0KKyAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGF0dGFjaCBjYWxsIn0KKyAgIH0KKworICAgIyBTZWUgaWYgb3RoZXIgcmVnaXN0ZXJzIGFyZSBwcm9ibGVtcworICAgIworICAgc2VuZF9nZGIgImkgciByM1xuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAgLXJlICIuKndhcm5pbmc6IHJlYWRpbmcgcmVnaXN0ZXIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgcGFzcyAiQ0hGdHMyMzQ5MDoga25vd24gYnVnIgorICAgICAgIH0KKyAgICAgICAtcmUgIi4qcjMuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgcGFzcyAiQnVnIGZpeGVkLCBZYXl5eSEiCisgICAgICAgfQorICAgICAgIHRpbWVvdXQgeyBmYWlsICJ0aW1lb3V0IG9uIGluZm8gcmVnIiB9CisgICB9CisKKyAgICMgR2V0IHJpZCBvZiB0aGUgcHJvY2VzcworICAgIworICAgZ2RiX3Rlc3QgInAgc2hvdWxkX2V4aXQgPSAxIiAiLioiICIiCisgICBnZGJfdGVzdCAiYyIgIi4qUHJvZ3JhbSBleGl0ZWQgbm9ybWFsbHkuKiIgIiIKKyAgIAorICAgIyBCZSBwYXJhbm9pZAorICAgIworIyAgIGV4ZWN1dGVfYW55d2hlcmUgImtpbGwgLTkgJHt0ZXN0cGlkfSIKK3JlbW90ZV9leGVjIGJ1aWxkICJraWxsIC05ICR7dGVzdHBpZH0iCisKK30KKworCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIKKyMKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisjIFRoaXMgaXMgYSB0ZXN0IG9mIGdkYidzIGFiaWxpdHkgdG8gYXR0YWNoIHRvIGEgcnVubmluZyBwcm9jZXNzLgorIworZG9fYXR0YWNoX3Rlc3RzCisKKyMgVGVzdCBhdHRhY2hpbmcgd2hlbiB0aGUgdGFyZ2V0IGlzIGluc2lkZSBhIHN5c3RlbSBjYWxsCisjCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2RvX2NhbGxfYXR0YWNoX3Rlc3RzCisKKyMgVW50aWwgInNldCBmb2xsb3ctZm9yay1tb2RlIiBhbmQgImNhdGNoIGZvcmsiIGFyZSBpbXBsZW1lbnRlZCBvbgorIyBvdGhlciB0YXJnZXRzLi4uCisjCitpZiAhW2lzdGFyZ2V0ICJocHBhKi1ocC1ocHV4KiJdIHRoZW4geworICAgc2V0dXBfeGZhaWwgIiotKi0qIgorfQorCityZXR1cm4gMApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvYXR0YWNoMi5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvYXR0YWNoMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYjdhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9hdHRhY2gyLmMKQEAgLTAsMCArMSwyMyBAQAorLyogVGhpcyBwcm9ncmFtIGlzIGludGVuZGVkIHRvIGJlIHN0YXJ0ZWQgb3V0c2lkZSBvZiBnZGIsIGFuZCB0aGVuCisgICBhdHRhY2hlZCB0byBieSBnZGIuICBUaHVzLCBpdCBzaW1wbHkgc3BpbnMgaW4gYSBsb29wLiAgVGhlIGxvb3AKKyAgIGlzIGV4aXRlZCB3aGVuICYgaWYgdGhlIHZhcmlhYmxlICdzaG91bGRfZXhpdCcgaXMgbm9uLXplcm8uICAoSXQKKyAgIGlzIGluaXRpYWxpemVkIHRvIHplcm8gaW4gdGhpcyBwcm9ncmFtLCBzbyB0aGUgbG9vcCB3aWxsIG5ldmVyCisgICBleGl0IHVubGVzcy91bnRpbCBnZGIgc2V0cyB0aGUgdmFyaWFibGUgdG8gbm9uLXplcm8uKQorICAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitpbnQgIHNob3VsZF9leGl0ID0gMDsKKworbWFpbiAoKQoreworICBpbnQgIGxvY2FsX2kgPSAwOworCisgIHNsZWVwKCAxMCApOyAvKiBTeXN0ZW0gY2FsbCBjYXVzZXMgcmVnaXN0ZXIgZmV0Y2ggdG8gZmFpbCAqLworICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhIGtub3duIEhQVVggImZlYXR1cmUiICAgICAgICAgICAgKi8KKyAgd2hpbGUgKCEgc2hvdWxkX2V4aXQpCisgICAgeworICAgICAgbG9jYWxfaSsrOworICAgIH0KKyAgcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2F0dGFjaDIuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvYXR0YWNoMi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI5OGVlOQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2F0dGFjaDIuZXhwCkBAIC0wLDAgKzEsMjYzIEBACisjIGF0dGFjaC5leHAgLS0gRXhwZWN0IHNjcmlwdCB0byB0ZXN0IGF0dGFjaGluZyB0byBhIHRocmVhZGVkIHBnbQorIyBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyB1c2UgdGhpcyB0byBkZWJ1ZzoKKyMKKyNsb2dfdXNlciAxCisKKyMgVGVtcG9yYXJpbHkgY29tbWVudCBvdXQgLSBoYW5naW5nCisjcmV0dXJuIDAKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKKyMgVGhyZWFkIHN0dWZmIGlzIF9zbG93XzsgcHJlcGFyZSBmb3IgbG9uZyB3YWl0cy4KKyMKKyMgRnVydGhlciwgdGhpcyB0ZXN0IGhhcyBzb21lICJudWxsIiBsaW5lcyBkZXNpZ25lZAorIyB0byBjb25zdW1lIG91dHB1dCBmcm9tIGdkYiB0aGF0IHdhcyB0b28gbGF0ZSB0byBiZQorIyBtYXRjaGVkIChzZXF1ZW5jZSBpcyAiZ2RiX3Rlc3QiIHNlbmRzOyB0aW1lb3V0IGFuZAorIyBvbiB0byBuZXh0IHNlbmQ7IHJlc3VsdCBmaW5hbGx5IGNvbWVzIGluOyBtaXNtYXRjaCkuCisjCisjIFRoZSBudWxsIGNvbW1hbmQgaXMgJ2dkYl90ZXN0ICJwIFwkcGMiICIuKiIgIiInCisjIE5PVEU6IHRoaXMgY29tbWFuZCB1bmRvZXMgYW55IHVwL2Rvd24gc3R1ZmYhCisjCitwcm9jIHByZV90aW1lb3V0IHsgaG93X2xvbmcgfSB7CisgICAgZ2xvYmFsIHRpbWVvdXQKKworICAgIHNldCB0aW1lb3V0IFtleHByICIkdGltZW91dCArICRob3dfbG9uZyJdCit9CisKK3Byb2MgcG9zdF90aW1lb3V0IHt9IHsKKyAgICBnbG9iYWwgdGltZW91dAorICAgIGdsb2JhbCBvbGR0aW1lb3V0CisKKyAgICBzZXQgdGltZW91dCAkb2xkdGltZW91dAorICAgIGdkYl90ZXN0ICJwIFwkcGMiICIuKiIgIiIKK30KKworaWYgeyAhW2lzdGFyZ2V0ICJocHBhKi0qLWhwdXgxMC4zMCJdICYmICFbaXN0YXJnZXQgImhwcGEqLSotaHB1eDExLioiXSB9IHsKKyAgICB2ZXJib3NlICJIUFVYIHRocmVhZCB0ZXN0IGlnbm9yZWQgZm9yIG5vbi1ocHBhIG9yIHByZS1IUC9VWC0xMC4zMCB0YXJnZXRzLiIKKyAgICByZXR1cm4gMAorfQorCisjIFdlIHVzZWQgdG8gd2FpdCA1IHNlY29uZHMgLCBidXQgdGlhbWF0IGlzIGZhc3RlciB0aGFuCisjIGh5ZHJhLi4ub3IgaXMgaXQgdGhhdCB0aGUgT1MgYWxsb2NhdGVzIHRpbWUgZGlmZmVyZW50bHkoPykuCisjCitzZXQgZGVsYXkgNQoraWYgeyAhW2lzdGFyZ2V0ICJocHBhKi0qLWhwdXgxMS4qIl0gfSB7CisgICAgc2V0IGRlbGF5IDQ1Cit9CisKK3NldCB0ZXN0ZmlsZSBxdWlja3NvcnQKK3NldCBzcmNmaWxlICR7c3JjZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0geworICAgIHJldHVybiAtMQorfQorCitzZXQgb2xkdGltZW91dCAkdGltZW91dAorI3NldCB0aW1lb3V0IFtleHByICIkdGltZW91dCArIDEwMCJdCitzZXQgb2xkdmVyYm9zZSAkdmVyYm9zZQorI3NldCB2ZXJib3NlIDQwCisKKyMgVG8gYnVpbGQgdGhlIGV4ZWN1dGFibGUgd2UgbmVlZCB0byBsaW5rIGFnYWluc3QgdGhlIHRocmVhZCBsaWJyYXJ5LgorIworIyAgICAgY2MgLUFlIC1nIC1vIHF1aWNrc29ydCAtbHB0aHJlYWQgcXVpY2tzb3J0LmMKKyMKKyNyZW1vdGVfZXhlYyBidWlsZCAiJHtzcmNmaWxlfSAtQWUgLWcgLWxwdGhyZWFkIC1vICR7YmluZmlsZX0iCisjZ2RiX2NvbXBpbGUgIiR7c3JjZmlsZX0gLUFlIC1nIC1scHRocmVhZCAtbyAke2JpbmZpbGV9IgorCitpZiB7JGdjY19jb21waWxlZCA9PSAwfSB7CisgICAgc2V0IGFkZGl0aW9uYWxfZmxhZ3MgImFkZGl0aW9uYWxfZmxhZ3M9LUFlIgorfSBlbHNlIHsKKyAgICBzZXQgYWRkaXRpb25hbF9mbGFncyAiIgorfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0uYyIgIiR7YmluZmlsZX0ubyIgb2JqZWN0IFtsaXN0IGRlYnVnICRhZGRpdGlvbmFsX2ZsYWdzXV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorcmVtb3RlX2V4ZWMgYnVpbGQgImxkIC91c3IvY2NzL2xpYi9jcnQwLm8gJHtiaW5maWxlfS5vIC1sY2wgLWxwdGhyZWFkICAtbGMgL29wdC9sYW5ndG9vbHMvbGliL2VuZC5vIC1vICR7YmluZmlsZX0iCisKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisKKyMgU3RhcnQgdGhlIGFwcGxpY2F0aW9uIHJ1bm5pbmcgYW5kIGdldCBpdHMgcGlkLgorIyBUaGVuIHdlIHdhaXQgZm9yIGl0IHRvIGdldCBzdGFydGVkIGFuZCBhdHRhY2guCisjIAorc2V0IHRlc3RwaWQgW2V2YWwgZXhlYyAkYmluZmlsZSAxICZdCitleGVjIHNsZWVwICRkZWxheQorCisjIE5vdyBhdHRhY2ggdG8gdGhlIGZpbGUuCisjCitwcmVfdGltZW91dCAxMDAKK2dkYl90ZXN0ICJhdHRhY2ggJHRlc3RwaWQiICIuKkF0dGFjaGluZyB0byBwcm9jZXNzLipSZWFkaW5nIHN5bWJvbHMgZnJvbS4qZG9uZS4qIiAiYXR0YWNoIHRvIHRhcmdldCIKK3Bvc3RfdGltZW91dAorCisjIFdhaXQgZm9yIHRoaW5ncyB0byBxdWllc2NlLgorIworZXhlYyBzbGVlcCAwCisKK3NlbmRfZ2RiICJidFxuIiAKKworc2V0IGRvX3JldHVybiAwCitzZXQgZG9fZ29fdG9fMTE4IDAKK3ByZV90aW1lb3V0IDQwMAorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKnNsZWVwLip3b3JrX2luaXQuKm1haW4uKiRnZGJfcHJvbXB0ICQiICAgeyAKKyAgICAgICAgcGFzcyAiYXQgZXhwZWN0ZWQgbG9jYXRpb24iIAorICAgIH0KKyAgICAtcmUgIi4qZHJhbmQ0OC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBzZXQgZG9fZ29fdG9fMTE4IDEKKyAgICB9CisgICAgLXJlICIuKnB0aHJlYWRfbXV0ZXhfbG9jay4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBzZXQgZG9fZ29fdG9fMTE4IDEKKyAgICB9CisgICAgLXJlICIuKnB0aHJlYWRfbXV0ZXhfdW5sb2NrLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHNldCBkb19nb190b18xMTggMQorICAgIH0KKyAgICAtcmUgIi4qbWFpbi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBzZXQgZG9fZ29fdG9fMTE4IDEKKyAgICB9CisgICAgLXJlICIuKk5vIHN0YWNrLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIGZhaWwgIkZhaWxlZCBhdHRhY2gsIGNoYW5nZSB3YWl0IGFtb3VudCBkb3duLCByZXN0IHdvdWxkIGZhaWwiCisgICAgICAgIHNldCBkb19yZXR1cm4gMQorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAjIFdobyBrbm93cz8KKyAgICAgICAgIworICAgICAgICBzZXQgZG9fZ29fdG9fMTE4IDEKKyAgICB9CisgICAgdGltZW91dCB7IAorICAgICAgICBzZXQgZG9fcmV0dXJuIDEKKyAgICAgICAgZmFpbCAidGltZW91dCBvbiBidCwgYXZvaWRpbmcgcmVzdCBvZiB0ZXN0IiAKKyAgICB9Cit9Citwb3N0X3RpbWVvdXQKKworIyBUb28gbGF0ZTsganVzdCBnaXZlIHVwLgorIworaWYgeyAkZG9fcmV0dXJuIH0geworICAgIHNldCB0aW1lb3V0ICRvbGR0aW1lb3V0CisgICAgc2V0IHZlcmJvc2UgJG9sZHZlcmJvc2UKKyAgICByZXR1cm4gMAorfQorCisjIE1heWJlIHRvbyBlYXJseS0tc2V0IGEgdGVtcCBicmVhayBhbmQgY29udGludWUuCisjIFdlIGhhdmUgdG8gc2V0IHRoaXMgb24gYm90aCBwYXRocywgc28gdGhhdCB3ZSBjYW4KKyMga25vdyB3aGF0IG51bWJlcnMgYnJlYWtwb2ludHMgd2lsbCBiZS4KKyMKK2dkYl90ZXN0ICJ0YiAxMTgiICIuKkJyZWFrcG9pbnQgMS4qMTE4LioiICIiCitpZiB7ICRkb19nb190b18xMTggfSB7CisgICAgcHJlX3RpbWVvdXQgMTAwCisgICAgc2VuZF9nZGIgImNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICIuKmF0LioxMTguKjExOC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgIyBPaywganVzdCBrZWVwIGdvaW5nCisgICAgICAgIH0KKyAgICAgICAgLXJlICIuKlByb2dyYW0gZXhpdGVkLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBmYWlsICJBdHRhY2hlZCB0b28gbGF0ZSwgc2V0IHdhaXQgYW1vdW50IGRvd253YXJkcyIKKyAgICAgICAgICAgIHNldCB0aW1lb3V0ICRvbGR0aW1lb3V0CisgICAgICAgICAgICBzZXQgdmVyYm9zZSAkb2xkdmVyYm9zZQorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgZmFpbCAiVW5leHBlY3RlZCByZXN1bHQgb24gYXR0YWNoIiAKKyAgICAgICAgICAgIHNldCB0aW1lb3V0ICRvbGR0aW1lb3V0CisgICAgICAgICAgICBzZXQgdmVyYm9zZSAkb2xkdmVyYm9zZQorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgfQorICAgICAgICB0aW1lb3V0IHsgCisgICAgICAgICAgICBmYWlsICJ0aW1lb3V0IG9uIGNvbnRpbnVlICIgCisgICAgICAgIH0KKyAgICB9CisgICAgcG9zdF90aW1lb3V0Cit9CisKKyMgTG9vayBhdCB0aGUgdGhyZWFkcy4KKyMKK3ByZV90aW1lb3V0IDEwMAorZ2RiX3Rlc3QgImluZm8gdGhyZWFkIiAiLio3Lio2Lio1Lio0LiozLioyLipcXFwqIDEuKnRocmVhZC4qIiAiZmlyc3QgaW5mbyB0aHJlYWQiCitwb3N0X3RpbWVvdXQKKworIyBXZSBleHBlY3QgdG8gYmUgaW5zaWRlIHRoZSAic2xlZXAiIGNhbGwsIHNvIGNoZWNrIHRoYXQuCisjCitpZiB7IFtleHByICIhJGRvX2dvX3RvXzExOCJdIH0geworICAgIGdkYl90ZXN0ICJ1cCIgIi4qXCMxLipuYW5vc2xlZXAuKiIgInVwIDEiIAorICAgIGdkYl90ZXN0ICJ1cCIgIi4qXCMyLipzbGVlcC4qIiAgICAgInVwIDIiIAorICAgIHByZV90aW1lb3V0IDEwMAorICAgIGdkYl90ZXN0ICJ1cCIgIi4qXCMzLip3b3JrX2luaXQuKiR0ZXN0ZmlsZS4qYzoxMTguKnNsZWVwLioiICJ1cCAzIiAKKyAgICBwb3N0X3RpbWVvdXQKK30gZWxzZSB7CisgICAgc2VuZF91c2VyICJTa2lwcGVkIHRocmVlIHRlc3RzXG4iCit9CisKKyMgR2V0IG91dCBvZiB0aGF0IGNhbGwuCisjCitnZGJfdGVzdCAiYiAxMjAiICIuKkJyZWFrcG9pbnQgMi4qMTIwLioiICJzZXQgYnAiCitwcmVfdGltZW91dCAxMDAKK2dkYl90ZXN0ICJjIiAgICAgIi4qQnJlYWtwb2ludCAyLiphdC4qMTIwLioiICJoaXQgYnAiCitwb3N0X3RpbWVvdXQKKworIyBMb29rIGF0IHRoZSB0aHJlYWRzLgorIworcHJlX3RpbWVvdXQgMTAwCitnZGJfdGVzdCAiaW5mbyB0aHJlYWQiICIuKjcuKjYuKjUuKjQuKjMuKjIuKjEuKnRocmVhZC4qJHRlc3RmaWxlLipjKjEyMC4qIiAiMm5kIGluZm8gdGhyZWFkIgorcG9zdF90aW1lb3V0CisKKyMgRG8gc29tZSBtb3JlIHN0dWZmLCB0byBtYWtlIHN1cmUgd2UgY2FuCisjCitnZGJfdGVzdCAidGhyZWFkIDMiICIuKlN3aXRjaGluZyB0by4qdGhyZWFkLiprc2xlZXAuKiIgInN3aXRjaCB0aHJlYWQiCisKK2dkYl90ZXN0ICJ1cCIgIi4qX2x3cF9jb25kX3RpbWVkd2FpdC4qIiAgICJ1cCA1IgorZ2RiX3Rlc3QgInVwIiAiLipwdGhyZWFkX2NvbmRfd2FpdC4qIiAgICAgInVwIDYiCitnZGJfdGVzdCAidXAiICIuKlwjMy4qd29ya2VyLioxNDQuKiIgICAgICAidXAgNyIKK2dkYl90ZXN0ICJ1cCIgIi4qX19wdGhyZWFkX2V4aXQuKiIgICAgICAgICJ1cCA4IgorZ2RiX3Rlc3QgInVwIiAiLipJbml0aWFsLipjYW5ub3QgZ28gdXAuKiIgImZvdW5kIHRocmVhZCBiYXNlIgorCitnZGJfdGVzdCAiYiAxNDUgdGhyIDMiICIuKkJyZWFrcG9pbnQgMy4qMTQ1LioiICAgICAgICAgICAgICJ0aHJlYWQtc3BlY2lmaWMgYnAiCitnZGJfdGVzdCAiaSBiIiAgICAgICAgICIuKjIuKmJyZWFrcG9pbnQuKmF0LioxMjAuKjMuKmJyZWFrcG9pbnQuKmF0LioxNDUgdGhyZWFkIDMuKiIgInNob3cgdGhyZWFkLXNwZWNpZmljIGJwIgorZ2RiX3Rlc3QgImRlbCAyIiAiLioiICIiCisKK2dkYl90ZXN0ICJjIiAiLipCcmVha3BvaW50IDMuKjE0NS4qIiAiaGl0IHRocmVhZC1zcGVjaWZpYyBicCIKK2dkYl90ZXN0ICJpIHRoIiAiLipcXFwqIDMuKjE0NS4qIiAiYXQgY29ycmVjdCB0aHJlYWQiCisKK3ByZV90aW1lb3V0IDEwMAorZ2RiX3Rlc3QgIm4iICIuKjE0Ni4qIiAibmV4dCBmcm9tIHRocmVhZC1zcGVjaWZpYyBicCIKK3Bvc3RfdGltZW91dAorCitnZGJfdGVzdCAiZCAzIiAiLioiICIiCitnZGJfdGVzdCAiYyIgICAiLipQcm9ncmFtIGV4aXRlZCBub3JtYWxseVwuLioiICJydW4gdG8gZmluaXNoIgorCisjIERvbmUhCisjCitnZGJfZXhpdAorCitzZXQgdGltZW91dCAkb2xkdGltZW91dAorc2V0IHZlcmJvc2UgJG9sZHZlcmJvc2UKKworIyBleGVjdXRlX2FueXdoZXJlICJybSAtZiAke2JpbmZpbGV9IgorIworcmV0dXJuIDAKKworCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC9hdmVyYWdlLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9hdmVyYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcwZWFlZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2F2ZXJhZ2UuYwpAQCAtMCwwICsxLDM5IEBACisvKiBUaGlzIGlzIGEgc2FtcGxlIHByb2dyYW0gZm9yIHRoZSBIUCBXREIgZGVidWdnZXIuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIG51bSAgIDEwCisKK3N0YXRpYyBpbnQgbXlfbGlzdFtudW1dID0gezMsNCwyLDAsMiwxLDgsMyw2LDd9OworCisjaWZkZWYgX19TVERDX18gCit2b2lkIHByaW50X2F2ZXJhZ2UoaW50IGxpc3RbXSwgaW50IGxvdywgaW50IGhpZ2gpIAorI2Vsc2UKK3ZvaWQgcHJpbnRfYXZlcmFnZShsaXN0LCBsb3csIGhpZ2gpCitpbnQgbGlzdFtdLCBsb3csIGhpZ2g7CisjZW5kaWYKKyAgICB7CisgICAgICAgIGludCB0b3RhbCwgbnVtX2VsZW1lbnRzLCBhdmVyYWdlOworICAgICAgICB0b3RhbCA9IHN1bShsaXN0LCBsb3csIGhpZ2gpOworICAgICAgICBudW1fZWxlbWVudHMgPSBoaWdoIC0gbG93OyAgLyogbm90ZSB0aGlzIGlzIGFuIG9mZi1ieS1vbmUgYnVnICovCisKKyAgICAgICAgYXZlcmFnZSA9IHRvdGFsIC8gbnVtX2VsZW1lbnRzOworICAgICAgICBwcmludGYoIiUxMC5kXG4iLCBhdmVyYWdlKTsKKyAgICB9CisKKyNpZmRlZiBfX1NURENfXworaW50IG1haW4odm9pZCkKKyNlbHNlCittYWluICgpCisjZW5kaWYKK3sKKyAgICBjaGFyIGM7CisgICAgaW50IGZpcnN0ID0gMDsKKyAgICBpbnQgbGFzdCA9IG51bS0xOworCisgICAgLyogVHJ5IHR3byB0ZXN0IGNhc2VzLiAqLworICAgIHByaW50X2F2ZXJhZ2UgKG15X2xpc3QsIGZpcnN0LCBsYXN0KTsKKyAgICBwcmludF9hdmVyYWdlIChteV9saXN0LCBmaXJzdCwgbGFzdCAtIDMpOworZm9vOgorICAgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC9jbGFzc2VzLWhwLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2NsYXNzZXMtaHAuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMjJjOTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9jbGFzc2VzLWhwLmV4cApAQCAtMCwwICsxLDg1OSBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEZyZWQgRmlzaC4gKGZuZkBjeWdudXMuY29tKQorCitzZXQgd3MgIlxbXHJcblx0IFxdKyIKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKKworIyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbiBleGVjdXRhYmxlIHRvIHRlc3QuICBJZiBub3QsIHRoZW4gZWl0aGVyIHdlCisjIGhhdmVuJ3QgdHJpZWQgdG8gY29tcGlsZSBvbmUsIG9yIHRoZSBjb21waWxhdGlvbiBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLgorIyBJbiBlaXRoZXIgY2FzZSwganVzdCBub3RpZnkgdGhlIHVzZXIgYW5kIHNraXAgdGhlIHRlc3RzIGluIHRoaXMgZmlsZS4KKworc2V0IHRlc3RmaWxlICJtaXNjLWhwIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uY2MKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworaWYgW2dldF9jb21waWxlcl9pbmZvICR7YmluZmlsZX0gImMrKyJdIHsKKyAgICByZXR1cm4gLTE7Cit9CisgCisgCitpZiB7W3NraXBfaHBfdGVzdHMgJGdjY19jb21waWxlZF19IHRoZW4geyBjb250aW51ZSB9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYysrfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisjCisjIFRlc3QgcHR5cGUgb2YgY2xhc3Mgb2JqZWN0cy4KKyMKKworcHJvYyB0ZXN0X3B0eXBlX2NsYXNzX29iamVjdHMge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIHdzCisKKyAgICAjIE5vdGUgdGhhdCBzdHJ1Y3QgbWVtYmVycyBhcmUgcHVibGljIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0IHByaW50CisgICAgIyAicHVibGljOiIgZm9yIHRoZSBwdWJsaWMgbWVtYmVycyBvZiBzdHJ1Y3RzLgorICAgICMgQWNjZXB0IGl0IGFzIGFuIGV4cGVjdGVkIGZhaWx1cmUgaWYgZ2RiIGp1c3QgZmFpbHMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgorICAgICMgY2xhc3MgYW5kIHN0cnVjdCwgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBpcyBPSy4KKworICAgIHNlbmRfZ2RiICJwdHlwZSBzdHJ1Y3QgZGVmYXVsdF9wdWJsaWNfc3RydWN0XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gc3RydWN0IGRlZmF1bHRfcHVibGljX3N0cnVjdCBceyR7d3N9aW50IGE7JHt3c31pbnQgYjtcclxuXH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBzdHJ1Y3QgZGVmYXVsdF9wdWJsaWNfc3RydWN0IgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBkZWZhdWx0X3B1YmxpY19zdHJ1Y3QgXHtcclxuLippbnQgYTske3dzfWludCBiO1xyXG4uKlx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwdHlwZSBzdHJ1Y3QgZGVmYXVsdF9wdWJsaWNfc3RydWN0IgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBzdHJ1Y3QgZGVmYXVsdF9wdWJsaWNfc3RydWN0IiB9CisJdGltZW91dCB7IGZhaWwgInB0eXBlIHN0cnVjdCBkZWZhdWx0X3B1YmxpY19zdHJ1Y3QgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgIyBOb3RlIHRoYXQgc3RydWN0IG1lbWJlcnMgYXJlIHB1YmxpYyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndCBwcmludAorICAgICMgInB1YmxpYzoiIGZvciB0aGUgcHVibGljIG1lbWJlcnMgb2Ygc3RydWN0cy4KKyAgICAjIEFjY2VwdCBpdCBhcyBhbiBleHBlY3RlZCBmYWlsdXJlIGlmIGdkYiBqdXN0IGZhaWxzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KKyAgICAjIGNsYXNzIGFuZCBzdHJ1Y3QsIGFuZCBldmVyeXRoaW5nIGVsc2UgaXMgT0suCisKKyAgICBzZW5kX2dkYiAicHR5cGUgc3RydWN0IGV4cGxpY2l0X3B1YmxpY19zdHJ1Y3RcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBzdHJ1Y3QgZXhwbGljaXRfcHVibGljX3N0cnVjdCBceyR7d3N9aW50IGE7JHt3c31pbnQgYjtcclxuLipcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHN0cnVjdCBleHBsaWNpdF9wdWJsaWNfc3RydWN0IgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBleHBsaWNpdF9wdWJsaWNfc3RydWN0IFx7XHJcbi4qaW50IGE7JHt3c31pbnQgYjtcclxuLipcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHR5cGUgc3RydWN0IGV4cGxpY2l0X3B1YmxpY19zdHJ1Y3QiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInB0eXBlIHN0cnVjdCBleHBsaWNpdF9wdWJsaWNfc3RydWN0IiB9CisJdGltZW91dCB7IGZhaWwgInB0eXBlIHN0cnVjdCBleHBsaWNpdF9wdWJsaWNfc3RydWN0ICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgICMgQWNjZXB0IGl0IGFzIGFuIGV4cGVjdGVkIGZhaWx1cmUgaWYgZ2RiIGp1c3QgZmFpbHMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgorICAgICMgY2xhc3MgYW5kIHN0cnVjdCwgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBpcyBPSy4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBzZW5kX2dkYiAicHR5cGUgc3RydWN0IHByb3RlY3RlZF9zdHJ1Y3RcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBzdHJ1Y3QgcHJvdGVjdGVkX3N0cnVjdCBceyR7d3N9cHJvdGVjdGVkOiR7d3N9aW50IGE7JHt3c31pbnQgYjtcclxuXH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBzdHJ1Y3QgcHJvdGVjdGVkX3N0cnVjdCAoRklYTUUpIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBwcm90ZWN0ZWRfc3RydWN0IFx7JHt3c31wcm90ZWN0ZWQ6JHt3c31pbnQgYTske3dzfWludCBiO1xyXG4uKlx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwdHlwZSBzdHJ1Y3QgcHJvdGVjdGVkX3N0cnVjdCAoRklYTUUpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBzdHJ1Y3QgcHJvdGVjdGVkX3N0cnVjdCIgfQorCXRpbWVvdXQgeyBmYWlsICJwdHlwZSBzdHJ1Y3QgcHJvdGVjdGVkX3N0cnVjdCAodGltZW91dCkiIDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICAjIEFjY2VwdCBpdCBhcyBhbiBleHBlY3RlZCBmYWlsdXJlIGlmIGdkYiBqdXN0IGZhaWxzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KKyAgICAjIGNsYXNzIGFuZCBzdHJ1Y3QsIGFuZCBldmVyeXRoaW5nIGVsc2UgaXMgT0suCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgc2VuZF9nZGIgInB0eXBlIHN0cnVjdCBwcml2YXRlX3N0cnVjdFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IHN0cnVjdCBwcml2YXRlX3N0cnVjdCBceyR7d3N9cHJpdmF0ZToke3dzfWludCBhOyR7d3N9aW50IGI7XHJcblx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgc3RydWN0IHByaXZhdGVfc3RydWN0IChGSVhNRSkiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIHByaXZhdGVfc3RydWN0IFx7JHt3c31wcml2YXRlOiR7d3N9aW50IGE7JHt3c31pbnQgYjtcclxuLipcfVxyXG4kZ2RiX3Byb21wdCAkIiB7IAorCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJICAgIGZhaWwgInB0eXBlIHN0cnVjdCBwcml2YXRlX3N0cnVjdCAoRklYTUUpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBzdHJ1Y3QgcHJpdmF0ZV9zdHJ1Y3QiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHR5cGUgc3RydWN0IHByaXZhdGVfc3RydWN0ICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgICMgQWNjZXB0IGl0IGFzIGFuIGV4cGVjdGVkIGZhaWx1cmUgaWYgZ2RiIGp1c3QgZmFpbHMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgorICAgICMgY2xhc3MgYW5kIHN0cnVjdCwgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBpcyBPSy4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBzZW5kX2dkYiAicHR5cGUgc3RydWN0IG1peGVkX3Byb3RlY3Rpb25fc3RydWN0XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gc3RydWN0IG1peGVkX3Byb3RlY3Rpb25fc3RydWN0IFx7JHt3c31pbnQgYTske3dzfWludCBiOyR7d3N9cHJpdmF0ZToke3dzfWludCBjOyR7d3N9aW50IGQ7JHt3c31wcm90ZWN0ZWQ6JHt3c31pbnQgZTske3dzfWludCBmOyR7d3N9cHVibGljOiR7d3N9aW50IGc7JHt3c31wcml2YXRlOiR7d3N9aW50IGg7JHt3c31wcm90ZWN0ZWQ6JHt3c31pbnQgaTtcW1xyXG5cXStcfVxbXHJcblxdKyRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgc3RydWN0IG1peGVkX3Byb3RlY3Rpb25fc3RydWN0IChGSVhNRSkiCisJfQorICAgICAgICAtcmUgInR5cGUgPSBzdHJ1Y3QgbWl4ZWRfcHJvdGVjdGlvbl9zdHJ1Y3QgXHtcclxuXFsgXF0qcHVibGljOlxyXG5cWyBcXSppbnQgYTtcclxuXFsgXF0qaW50IGI7XHJcblxbIFxdKnByaXZhdGU6XHJcblxbIFxdKmludCBjO1xyXG5cWyBcXSppbnQgZDtcclxuXFsgXF0qcHJvdGVjdGVkOlxyXG5cWyBcXSppbnQgZTtcclxuXFsgXF0qaW50IGY7XHJcblxbIFxdKnB1YmxpYzpcclxuXFsgXF0qaW50IGc7XHJcblxbIFxdKnByaXZhdGU6XHJcblxbIFxdKmludCBoO1xyXG5cWyBcXSpwcm90ZWN0ZWQ6XHJcblxbIFxdKmludCBpO1xyXG4uKlx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgc3RydWN0IG1peGVkX3Byb3RlY3Rpb25fc3RydWN0IChleHRyYSBwdWJsaWMpIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBtaXhlZF9wcm90ZWN0aW9uX3N0cnVjdCBceyR7d3N9cHVibGljOiR7d3N9aW50IGE7JHt3c31pbnQgYjske3dzfXByaXZhdGU6JHt3c31pbnQgYzske3dzfWludCBkOyR7d3N9cHJvdGVjdGVkOiR7d3N9aW50IGU7JHt3c31pbnQgZjske3dzfXB1YmxpYzoke3dzfWludCBnOyR7d3N9cHJpdmF0ZToke3dzfWludCBoOyR7d3N9cHJvdGVjdGVkOiR7d3N9aW50IGk7XHJcbi4qXH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJICAgIGZhaWwgInB0eXBlIHN0cnVjdCBtaXhlZF9wcm90ZWN0aW9uX3N0cnVjdCAoRklYTUUpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBzdHJ1Y3QgbWl4ZWRfcHJvdGVjdGlvbl9zdHJ1Y3QiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHR5cGUgc3RydWN0IG1peGVkX3Byb3RlY3Rpb25fc3RydWN0ICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgICMgQWNjZXB0IGl0IGFzIGFuIGV4cGVjdGVkIGZhaWx1cmUgaWYgZ2RiIGp1c3QgZmFpbHMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgorICAgICMgY2xhc3MgYW5kIHN0cnVjdCwgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBpcyBPSy4KKworICAgIHNlbmRfZ2RiICJwdHlwZSBjbGFzcyBwdWJsaWNfY2xhc3NcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBwdWJsaWNfY2xhc3MgXHske3dzfXB1YmxpYzoke3dzfWludCBhOyR7d3N9aW50IGI7XHJcbi4qXH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyBwdWJsaWNfY2xhc3MgKEZJWE1FKSIKKwl9CisJLXJlICJ0eXBlID0gc3RydWN0IHB1YmxpY19jbGFzcyBceyR7d3N9aW50IGE7JHt3c31pbnQgYjtcclxuXH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJICAgIGZhaWwgInB0eXBlIGNsYXNzIHB1YmxpY19jbGFzcyAoRklYTUUpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBjbGFzcyBwdWJsaWNfY2xhc3MiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHR5cGUgY2xhc3MgcHVibGljX2NsYXNzICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBjbGFzcyBwcm90ZWN0ZWRfY2xhc3NcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBwcm90ZWN0ZWRfY2xhc3MgXHske3dzfXByb3RlY3RlZDoke3dzfWludCBhOyR7d3N9aW50IGI7XHJcbi4qXH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyBwcm90ZWN0ZWRfY2xhc3MiCisJfQorCS1yZSAidHlwZSA9IHN0cnVjdCBwcm90ZWN0ZWRfY2xhc3MgXHske3dzfWludCBhOyR7d3N9aW50IGI7XHJcblx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwdHlwZSBjbGFzcyBwcm90ZWN0ZWRfY2xhc3MiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInB0eXBlIGNsYXNzIHByb3RlY3RlZF9jbGFzcyIgfQorCXRpbWVvdXQgeyBmYWlsICJwdHlwZSBjbGFzcyBwcm90ZWN0ZWRfY2xhc3MgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgIyBBY2NlcHQgaXQgYXMgYW4gZXhwZWN0ZWQgZmFpbHVyZSBpZiBnZGIganVzdCBlbWl0cyBhIHN1cGVyZmxvdXMgInByaXZhdGU6IgorICAgICMgYXR0cmlidXRlLCBzaW5jZSBjbGFzc2VzIGRlZmF1bHQgdG8gcHJpdmF0ZSBhbmQgZm9yIGNvbnNpc3RlbmN5IHdpdGgKKyAgICAjIHN0cnVjdHMgKHdoZXJlIHdlIGRvbid0IHByaW50IHRoZSAicHVibGljOiIgYXR0cmlidXRlKSB3ZSBkb24ndCBwcmludAorICAgICMgdGhlICJwcml2YXRlOiIgYXR0cmlidXRlLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIHNlbmRfZ2RiICJwdHlwZSBjbGFzcyBkZWZhdWx0X3ByaXZhdGVfY2xhc3NcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBkZWZhdWx0X3ByaXZhdGVfY2xhc3MgXHske3dzfWludCBhOyR7d3N9aW50IGI7XHJcbi4qXH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyBkZWZhdWx0X3ByaXZhdGVfY2xhc3MgKEZJWE1FKSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgZGVmYXVsdF9wcml2YXRlX2NsYXNzIFx7JHt3c31wcml2YXRlOiR7d3N9aW50IGE7JHt3c31pbnQgYjtcclxuLipcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgZGVmYXVsdF9wcml2YXRlX2NsYXNzIChGSVhNRSkiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInB0eXBlIGNsYXNzIGRlZmF1bHRfcHJpdmF0ZV9jbGFzcyIgfQorCXRpbWVvdXQgeyBmYWlsICJwdHlwZSBjbGFzcyBkZWZhdWx0X3ByaXZhdGVfY2xhc3MgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIGNsYXNzIGV4cGxpY2l0X3ByaXZhdGVfY2xhc3NcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBleHBsaWNpdF9wcml2YXRlX2NsYXNzIFx7JHt3c31wcml2YXRlOiR7d3N9aW50IGE7JHt3c31pbnQgYjtcclxuLipcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIGV4cGxpY2l0X3ByaXZhdGVfY2xhc3MiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIGV4cGxpY2l0X3ByaXZhdGVfY2xhc3MgXHtcclxuXFsgXF0qaW50IGE7XHJcblxbIFxdKmludCBiO1xyXG4uKlx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgY2xhc3MgZXhwbGljaXRfcHJpdmF0ZV9jbGFzcyAoT0sgZm9yIEhQIGFDQykiCisJfQorCS1yZSAidHlwZSA9IHN0cnVjdCBleHBsaWNpdF9wcml2YXRlX2NsYXNzIFx7JHt3c31pbnQgYTske3dzfWludCBiO1xyXG4uKlx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwdHlwZSBjbGFzcyBleHBsaWNpdF9wcml2YXRlX2NsYXNzIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBjbGFzcyBleHBsaWNpdF9wcml2YXRlX2NsYXNzIiB9CisJdGltZW91dCB7IGZhaWwgInB0eXBlIGNsYXNzIGV4cGxpY2l0X3ByaXZhdGVfY2xhc3MgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIGNsYXNzIG1peGVkX3Byb3RlY3Rpb25fY2xhc3NcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBtaXhlZF9wcm90ZWN0aW9uX2NsYXNzIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgYTske3dzfWludCBiOyR7d3N9cHJpdmF0ZToke3dzfWludCBjOyR7d3N9aW50IGQ7JHt3c31wcm90ZWN0ZWQ6JHt3c31pbnQgZTske3dzfWludCBmOyR7d3N9cHVibGljOiR7d3N9aW50IGc7JHt3c31wcml2YXRlOiR7d3N9aW50IGg7JHt3c31wcm90ZWN0ZWQ6JHt3c31pbnQgaTtcclxuLipcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIG1peGVkX3Byb3RlY3Rpb25fY2xhc3MiCisJfQorCS1yZSAidHlwZSA9IHN0cnVjdCBtaXhlZF9wcm90ZWN0aW9uX2NsYXNzIFx7JHt3c31pbnQgYTske3dzfWludCBiOyR7d3N9aW50IGM7JHt3c31pbnQgZDske3dzfWludCBlOyR7d3N9aW50IGY7JHt3c31pbnQgZzske3dzfWludCBoOyR7d3N9aW50IGk7XHJcbi4qXH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJICAgIGZhaWwgInB0eXBlIGNsYXNzIG1peGVkX3Byb3RlY3Rpb25fY2xhc3MiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInB0eXBlIGNsYXNzIG1peGVkX3Byb3RlY3Rpb25fY2xhc3MiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHR5cGUgY2xhc3MgbWl4ZWRfcHJvdGVjdGlvbl9jbGFzcyAodGltZW91dCkiIDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICAjIFRoaXMgY2xhc3MgZG9lcyBub3QgdXNlIGFueSBDKystc3BlY2lmaWMgZmVhdHVyZXMsIHNvIGl0J3MgZmluZSBmb3IKKyAgICAjIGl0IHRvIHByaW50IGFzICJzdHJ1Y3QiLgorICAgIHNlbmRfZ2RiICJwdHlwZSBjbGFzcyBBXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gKGNsYXNzfHN0cnVjdCkgQSBceygke3dzfXB1YmxpYzp8KSR7d3N9aW50IGE7JHt3c31pbnQgeDsoKCR7d3N9QSAmIG9wZXJhdG9yPVxcKEEgY29uc3QgJlxcKTspfCgke3dzfUFcXChBIGNvbnN0ICZcXCk7KXwoJHt3c31BXFwodm9pZFxcKTspKSoke3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgY2xhc3MgQSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgQSIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIGNsYXNzIEEgKHRpbWVvdXQpIgorCSAgICByZXR1cm4KKwl9CisgICAgfQorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIHNlbmRfZ2RiICJwdHlwZSBjbGFzcyBCXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgQiA6IHB1YmxpYyBBIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgYjske3dzfWludCB4OyR7d3N9QiAmIG9wZXJhdG9yPVxcKEIgY29uc3QgJlxcKTske3dzfUJcXChCIGNvbnN0ICZcXCk7JHt3c31CXFwodm9pZFxcKTske3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgY2xhc3MgQiIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgQiA6IHB1YmxpYyBBIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgYjske3dzfWludCB4OygoJHt3c31CICYgb3BlcmF0b3I9XFwoQiBjb25zdCAmXFwpOyl8KCR7d3N9QlxcKEIgY29uc3QgJlxcKTspfCgke3dzfUJcXCh2b2lkXFwpOykpKiR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyBCIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgQiIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIGNsYXNzIEIgKHRpbWVvdXQpIgorCSAgICByZXR1cm4KKwl9CisgICAgfQorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIHNlbmRfZ2RiICJwdHlwZSBjbGFzcyBDXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgQyA6IHB1YmxpYyBBIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgYzske3dzfWludCB4OyR7d3N9QyAmIG9wZXJhdG9yPVxcKEMgY29uc3QgJlxcKTske3dzfUNcXChDIGNvbnN0ICZcXCk7JHt3c31DXFwodm9pZFxcKTske3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgY2xhc3MgQyIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgQyA6IHB1YmxpYyBBIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgYzske3dzfWludCB4OygoJHt3c31DICYgb3BlcmF0b3I9XFwoQyBjb25zdCAmXFwpOyl8KCR7d3N9Q1xcKEMgY29uc3QgJlxcKTspfCgke3dzfUNcXCh2b2lkXFwpOykpKiR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyBDIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgQyIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIGNsYXNzIEMgKHRpbWVvdXQpIgorCSAgICByZXR1cm4KKwl9CisgICAgfQorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIHNlbmRfZ2RiICJwdHlwZSBjbGFzcyBEXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgRCA6IHB1YmxpYyBCLCBwdWJsaWMgQyBceyR7d3N9cHVibGljOiR7d3N9aW50IGQ7JHt3c31pbnQgeDske3dzfUQgJiBvcGVyYXRvcj1cXChEIGNvbnN0ICZcXCk7JHt3c31EXFwoRCBjb25zdCAmXFwpOyR7d3N9RFxcKHZvaWRcXCk7JHt3c31cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIEQiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIEQgOiBwdWJsaWMgQiwgcHVibGljIEMgXHske3dzfXB1YmxpYzoke3dzfWludCBkOyR7d3N9aW50IHg7KCgke3dzfUQgJiBvcGVyYXRvcj1cXChEIGNvbnN0ICZcXCk7KXwoJHt3c31EXFwoRCBjb25zdCAmXFwpOyl8KCR7d3N9RFxcKHZvaWRcXCk7KSkqJHt3c31cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIEQgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyBEIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgRCAodGltZW91dCkiCisJICAgIHJldHVybgorCX0KKyAgICB9CisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgc2VuZF9nZGIgInB0eXBlIGNsYXNzIEVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBFIDogcHVibGljIEQgXHske3dzfXB1YmxpYzoke3dzfWludCBlOyR7d3N9aW50IHg7JHt3c31FICYgb3BlcmF0b3I9XFwoRSBjb25zdCAmXFwpOyR7d3N9RVxcKEUgY29uc3QgJlxcKTske3dzfUVcXCh2b2lkXFwpOyR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyBFIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBFIDogcHVibGljIEQgXHske3dzfXB1YmxpYzoke3dzfWludCBlOyR7d3N9aW50IHg7KCgke3dzfUUgJiBvcGVyYXRvcj1cXChFIGNvbnN0ICZcXCk7KXwoJHt3c31FXFwoRSBjb25zdCAmXFwpOyl8KCR7d3N9RVxcKHZvaWRcXCk7KSkqJHt3c31cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIEUiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIGNsYXNzIEUiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyBFICh0aW1lb3V0KSIKKwkgICAgcmV0dXJuCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBjbGFzcyB2QVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IChjbGFzc3xzdHJ1Y3QpIHZBIFx7KCR7d3N9cHVibGljOnwpJHt3c31pbnQgdmE7JHt3c31pbnQgdng7JHt3c312QSAmIG9wZXJhdG9yPVxcKHZBIGNvbnN0ICZcXCk7JHt3c312QVxcKHZBIGNvbnN0ICZcXCk7JHt3c312QVxcKHZvaWRcXCk7JHt3c31cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIHZBIgorCX0KKwktcmUgInR5cGUgPSAoY2xhc3N8c3RydWN0KSB2QSBceygke3dzfXB1YmxpYzp8KSR7d3N9aW50IHZhOyR7d3N9aW50IHZ4OygoJHt3c312QSAmIG9wZXJhdG9yPVxcKHZBIGNvbnN0ICZcXCk7KXwoJHt3c312QVxcKHZBIGNvbnN0ICZcXCk7KXwoJHt3c312QVxcKHZvaWRcXCk7KSkqJHt3c31cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIHZBIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgdkEiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyB2QSAodGltZW91dCkiCisJICAgIHJldHVybgorCX0KKyAgICB9CisKKyAgICAjIEFjY2VwdCB0aGUgZm9ybSB3aXRoIGVtYmVkZGVkIEdOVSBzdHlsZSBtYW5nbGVkIHZpcnR1YWwgdGFibGUgY29uc3RydWN0cworICAgICMgZm9yIG5vdywgYnV0IHdpdGggYSBGSVhNRS4gIEF0IHNvbWUgZnV0dXJlIHBvaW50LCBnZGIgc2hvdWxkIHVzZSBhCisgICAgIyBwb3J0YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHZpcnR1YWwgdGFibGUgY29uc3RydWN0cy4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBzZW5kX2dkYiAicHR5cGUgY2xhc3MgdkJcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyB2QiA6IHB1YmxpYyB2aXJ0dWFsIHZBIFx7JHt3c31wcml2YXRlOiR7d3N9dkEgXFwqX3ZiLnZBOyR7d3N9cHVibGljOiR7d3N9aW50IHZiOyR7d3N9aW50IHZ4OyR7d3N9dkIgJiBvcGVyYXRvcj1cXCh2QiBjb25zdCAmXFwpOyR7d3N9dkJcXChpbnQsIHZCIGNvbnN0ICZcXCk7JHt3c312QlxcKGludFxcKTske3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwdHlwZSBjbGFzcyB2QiAoRklYTUU6IG5vbi1wb3J0YWJsZSB2aXJ0dWFsIHRhYmxlIGNvbnN0cnVjdHMpIgorCX0KKyAgICAgICAgLXJlICJ0eXBlID0gY2xhc3MgdkIgOiBwdWJsaWMgdmlydHVhbCB2QSBce1xyXG5cWyBcXSpwdWJsaWM6XHJcblxbIFxdKmludCB2YjtcclxuXFsgXF0qaW50IHZ4O1xbXHJcblx0IFxdK1x9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIHBhc3MgInB0eXBlIGNsYXNzIHZCIChhQ0MpIgorICAgICAgICB9CisJLXJlICJ0eXBlID0gY2xhc3MgdkIgOiBwdWJsaWMgdmlydHVhbCB2QSBceyR7d3N9cHJpdmF0ZToke3dzfXZBIFxcKl92Yi52QTske3dzfXB1YmxpYzoke3dzfWludCB2Yjske3dzfWludCB2eDsoKCR7d3N9dkIgJiBvcGVyYXRvcj1cXCh2QiBjb25zdCAmXFwpOyl8KCR7d3N9dkJcXChpbnQsIHZCIGNvbnN0ICZcXCk7KXwoJHt3c312QlxcKGludFxcKTspKSoke3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwdHlwZSBjbGFzcyB2QiAoRklYTUUpIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgdkIiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyB2QiAodGltZW91dCkiCisJICAgIHJldHVybgorCX0KKyAgICB9CisKKyAgICAjIEFjY2VwdCB0aGUgZm9ybSB3aXRoIGVtYmVkZGVkIEdOVSBzdHlsZSBtYW5nbGVkIHZpcnR1YWwgdGFibGUgY29uc3RydWN0cworICAgICMgZm9yIG5vdywgYnV0IHdpdGggYSBGSVhNRS4gIEF0IHNvbWUgZnV0dXJlIHBvaW50LCBnZGIgc2hvdWxkIHVzZSBhCisgICAgIyBwb3J0YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHZpcnR1YWwgdGFibGUgY29uc3RydWN0cy4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBzZW5kX2dkYiAicHR5cGUgY2xhc3MgdkNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyB2QyA6IHB1YmxpYyB2aXJ0dWFsIHZBIFx7JHt3c31wcml2YXRlOiR7d3N9dkEgXFwqX3ZiLnZBOyR7d3N9cHVibGljOiR7d3N9aW50IHZjOyR7d3N9aW50IHZ4OyR7d3N9dkMgJiBvcGVyYXRvcj1cXCh2QyBjb25zdCAmXFwpOyR7d3N9dkNcXChpbnQsIHZDIGNvbnN0ICZcXCk7JHt3c312Q1xcKGludFxcKTske3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwdHlwZSBjbGFzcyB2QyAoRklYTUU6IG5vbi1wb3J0YWJsZSB2aXJ0dWFsIHRhYmxlIGNvbnN0cnVjdHMpIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyB2QyA6IHB1YmxpYyB2aXJ0dWFsIHZBIFx7XHJcblxbIFxdKnB1YmxpYzpcclxuXFsgXF0qaW50IHZjO1xyXG5cWyBcXSppbnQgdng7XFtcclxuXHQgXF0rXH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyB2QyAoYUNDKSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgdkMgOiBwdWJsaWMgdmlydHVhbCB2QSBceyR7d3N9cHJpdmF0ZToke3dzfXZBIFxcKl92Yi52QTske3dzfXB1YmxpYzoke3dzfWludCB2Yzske3dzfWludCB2eDsoKCR7d3N9dkMgJiBvcGVyYXRvcj1cXCh2QyBjb25zdCAmXFwpOyl8KCR7d3N9dkNcXChpbnQsIHZDIGNvbnN0ICZcXCk7KXwoJHt3c312Q1xcKGludFxcKTspKSoke3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwdHlwZSBjbGFzcyB2QyAoRklYTUUpIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgdkMiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyB2QyAodGltZW91dCkiCisJICAgIHJldHVybgorCX0KKyAgICB9CisKKyAgICAjIEFjY2VwdCB0aGUgZm9ybSB3aXRoIGVtYmVkZGVkIEdOVSBzdHlsZSBtYW5nbGVkIHZpcnR1YWwgdGFibGUgY29uc3RydWN0cworICAgICMgZm9yIG5vdywgYnV0IHdpdGggYSBGSVhNRS4gIEF0IHNvbWUgZnV0dXJlIHBvaW50LCBnZGIgc2hvdWxkIHVzZSBhCisgICAgIyBwb3J0YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHZpcnR1YWwgdGFibGUgY29uc3RydWN0cy4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBzZW5kX2dkYiAicHR5cGUgY2xhc3MgdkRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyB2RCA6IHB1YmxpYyB2aXJ0dWFsIHZCLCBwdWJsaWMgdmlydHVhbCB2QyBceyR7d3N9cHJpdmF0ZToke3dzfXZDIFxcKl92Yi52Qzske3dzfXZCIFxcKl92Yi52Qjske3dzfXB1YmxpYzoke3dzfWludCB2ZDske3dzfWludCB2eDske3dzfXZEICYgb3BlcmF0b3I9XFwodkQgY29uc3QgJlxcKTske3dzfXZEXFwoaW50LCB2RCBjb25zdCAmXFwpOyR7d3N9dkRcXChpbnRcXCk7JHt3c31cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgdkQgKEZJWE1FOiBub24tcG9ydGFibGUgdmlydHVhbCB0YWJsZSBjb25zdHJ1Y3RzKSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgdkQgOiBwdWJsaWMgdmlydHVhbCB2QiwgcHVibGljIHZpcnR1YWwgdkMgXHtcclxuXFsgXF0qcHVibGljOlxyXG5cWyBcXSppbnQgdmQ7XHJcblxbIFxdKmludCB2eDtcW1xyXG5cdCBcXStcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIHZEIChhQ0MpIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyB2RCA6IHB1YmxpYyB2aXJ0dWFsIHZCLCBwdWJsaWMgdmlydHVhbCB2QyBceyR7d3N9cHJpdmF0ZToke3dzfXZDIFxcKl92Yi52Qzske3dzfXZCIFxcKl92Yi52Qjske3dzfXB1YmxpYzoke3dzfWludCB2ZDske3dzfWludCB2eDsoKCR7d3N9dkQgJiBvcGVyYXRvcj1cXCh2RCBjb25zdCAmXFwpOyl8KCR7d3N9dkRcXChpbnQsIHZEIGNvbnN0ICZcXCk7KXwoJHt3c312RFxcKGludFxcKTspKSoke3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwdHlwZSBjbGFzcyB2RCAoRklYTUUpIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgdkQiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyB2RCAodGltZW91dCkiCisJICAgIHJldHVybgorCX0KKyAgICB9CisKKyAgICAjIEFjY2VwdCB0aGUgZm9ybSB3aXRoIGVtYmVkZGVkIEdOVSBzdHlsZSBtYW5nbGVkIHZpcnR1YWwgdGFibGUgY29uc3RydWN0cworICAgICMgZm9yIG5vdywgYnV0IHdpdGggYSBGSVhNRS4gIEF0IHNvbWUgZnV0dXJlIHBvaW50LCBnZGIgc2hvdWxkIHVzZSBhCisgICAgIyBwb3J0YWJsZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHZpcnR1YWwgdGFibGUgY29uc3RydWN0cy4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBzZW5kX2dkYiAicHR5cGUgY2xhc3MgdkVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyB2RSA6IHB1YmxpYyB2aXJ0dWFsIHZEIFx7JHt3c31wcml2YXRlOiR7d3N9dkQgXFwqX3ZiLnZEOyR7d3N9cHVibGljOiR7d3N9aW50IHZlOyR7d3N9aW50IHZ4OyR7d3N9dkUgJiBvcGVyYXRvcj1cXCh2RSBjb25zdCAmXFwpOyR7d3N9dkVcXChpbnQsIHZFIGNvbnN0ICZcXCk7JHt3c312RVxcKGludFxcKTske3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwdHlwZSBjbGFzcyB2RSAoRklYTUU6IG5vbi1wb3J0YWJsZSB2aXJ0dWFsIHRhYmxlIGNvbnN0cnVjdHMpIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyB2RSA6IHB1YmxpYyB2aXJ0dWFsIHZEIFx7XHJcblxbIFxdKnB1YmxpYzpcclxuXFsgXF0qaW50IHZlO1xyXG5cWyBcXSppbnQgdng7XFtcclxuXHQgXF0rXH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyB2RSAoYUNDKSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgdkUgOiBwdWJsaWMgdmlydHVhbCB2RCBceyR7d3N9cHJpdmF0ZToke3dzfXZEIFxcKl92Yi52RDske3dzfXB1YmxpYzoke3dzfWludCB2ZTske3dzfWludCB2eDsoKCR7d3N9dkUgJiBvcGVyYXRvcj1cXCh2RSBjb25zdCAmXFwpOyl8KCR7d3N9dkVcXChpbnQsIHZFIGNvbnN0ICZcXCk7KXwoJHt3c312RVxcKGludFxcKTspKSoke3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwdHlwZSBjbGFzcyB2RSAoRklYTUUpIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgdkUiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBjbGFzcyB2RSAodGltZW91dCkiCisJICAgIHJldHVybgorCX0KKyAgICB9CisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgc2VuZF9nZGIgInB0eXBlIGNsYXNzIEJhc2UxXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgQmFzZTEgXHske3dzfXB1YmxpYzoke3dzfWludCB4OyR7d3N9QmFzZTEgJiBvcGVyYXRvcj1cXChCYXNlMSBjb25zdCAmXFwpOyR7d3N9QmFzZTFcXChCYXNlMSBjb25zdCAmXFwpOyR7d3N9QmFzZTFcXChpbnRcXCk7JHt3c31cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIEJhc2UxIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBCYXNlMSBceyR7d3N9cHVibGljOiR7d3N9aW50IHg7KCgke3dzfUJhc2UxICYgb3BlcmF0b3I9XFwoQmFzZTEgY29uc3QgJlxcKTspfCgke3dzfUJhc2UxXFwoQmFzZTEgY29uc3QgJlxcKTspfCgke3dzfUJhc2UxXFwoaW50XFwpOykpKiR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyBCYXNlMSAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIGNsYXNzIEJhc2UxIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgQmFzZTEgKHRpbWVvdXQpIgorCSAgICByZXR1cm4KKwl9CisgICAgfQorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIHNlbmRfZ2RiICJwdHlwZSBjbGFzcyBGb29cbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAJLXJlICJ0eXBlID0gY2xhc3MgRm9vIFx7XHJcblxbIFxdKnB1YmxpYzpcclxuXFsgXF0qaW50IHg7XHJcblxbIFxdKmludCB5O1xyXG5cWyBcXSpzdGF0aWMgaW50IHN0O1xyXG5cclxuXFsgXF0qRm9vXFwoaW50LCBpbnRcXCk7XHJcblxbIFxdKmludCBvcGVyYXRvciEudm9pZC47XHJcblxbIFxdKm9wZXJhdG9yIGludC52b2lkLjtcclxuXFsgXF0qaW50IHRpbWVzLmludC47XHJcblx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgY2xhc3MgRm9vKGFDQykiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIEZvbyBceyR7d3N9cHVibGljOiR7d3N9aW50IHg7JHt3c31pbnQgeTske3dzfXN0YXRpYyBpbnQgc3Q7JHt3c31Gb28gJiBvcGVyYXRvcj1cXChGb28gY29uc3QgJlxcKTske3dzfUZvb1xcKEZvbyBjb25zdCAmXFwpOyR7d3N9Rm9vXFwoaW50LCBpbnRcXCk7JHt3c31pbnQgb3BlcmF0b3IhXFwodm9pZFxcKTske3dzfWludCBvcGVyYXRvciBpbnRcXCh2b2lkXFwpOyR7d3N9aW50IHRpbWVzXFwoaW50XFwpOyR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBjbGFzcyBGb28iCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIEZvbyBceyR7d3N9cHVibGljOiR7d3N9aW50IHg7JHt3c31pbnQgeTske3dzfXN0YXRpYyBpbnQgc3Q7KCgke3dzfUZvbyAmIG9wZXJhdG9yPVxcKEZvbyBjb25zdCAmXFwpOyl8KCR7d3N9Rm9vXFwoRm9vIGNvbnN0ICZcXCk7KXwoJHt3c31Gb29cXChpbnQsIGludFxcKTspfCgke3dzfWludCBvcGVyYXRvciFcXCh2b2lkXFwpOyl8KCR7d3N9aW50IG9wZXJhdG9yIGludFxcKHZvaWRcXCk7KXwoJHt3c31pbnQgdGltZXNcXChpbnRcXCk7KSkqJHt3c31cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIEZvbyAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIGNsYXNzIEZvbyIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIGNsYXNzIEZvbyAodGltZW91dCkiCisJICAgIHJldHVybgorCX0KKyAgICB9CisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgc2VuZF9nZGIgInB0eXBlIGNsYXNzIEJhclxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIEJhciA6IHB1YmxpYyBCYXNlMSwgcHVibGljIEZvbyBceyR7d3N9cHVibGljOiR7d3N9aW50IHo7JHt3c31CYXIgJiBvcGVyYXRvcj1cXChCYXIgY29uc3QgJlxcKTske3dzfUJhclxcKEJhciBjb25zdCAmXFwpOyR7d3N9QmFyXFwoaW50LCBpbnQsIGludFxcKTske3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgY2xhc3MgQmFyIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBCYXIgOiBwdWJsaWMgQmFzZTEsIHB1YmxpYyBGb28gXHske3dzfXB1YmxpYzoke3dzfWludCB6OygoJHt3c31CYXIgJiBvcGVyYXRvcj1cXChCYXIgY29uc3QgJlxcKTspfCgke3dzfUJhclxcKEJhciBjb25zdCAmXFwpOyl8KCR7d3N9QmFyXFwoaW50LCBpbnQsIGludFxcKTspKSoke3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgY2xhc3MgQmFyIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgQmFyIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgY2xhc3MgQmFyICh0aW1lb3V0KSIKKwkgICAgcmV0dXJuCisJfQorICAgIH0KK30KKworIworIyBUZXN0IHNpbXBsZSBhY2Nlc3MgdG8gY2xhc3MgbWVtYmVycy4KKyMKKworcHJvYyB0ZXN0X25vbl9pbmhlcml0ZWRfbWVtYmVyX2FjY2VzcyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICAKKyAgICAjIFByaW50IG5vbi1pbmhlcml0ZWQgbWVtYmVycyBvZiBnX0EuCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19BLmEiICIuKiA9IDEiICJnX0EuYSBpbmNvcnJlY3QiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19BLngiICIuKiA9IDIiICJnX0EueCBpbmNvcnJlY3QiCisKKyAgICAjIFByaW50IG5vbi1pbmhlcml0ZWQgbWVtYmVycyBvZiBnX0IuCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19CLmIiICIuKiA9IDUiICJnX0IuYiBpbmNvcnJlY3QiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19CLngiICIuKiA9IDYiICJnX0IueCBpbmNvcnJlY3QiCisKKyAgICAjIFByaW50IG5vbi1pbmhlcml0ZWQgbWVtYmVycyBvZiBnX0MuCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19DLmMiICIuKiA9IDkiICJnX0MuYyBpbmNvcnJlY3QiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19DLngiICIuKiA9IDEwIiAiZ19DLnggaW5jb3JyZWN0IgorCisgICAgIyBQcmludCBub24taW5oZXJpdGVkIG1lbWJlcnMgb2YgZ19ELgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRC5kIiAiLiogPSAxOSIgImdfRC5kIGluY29ycmVjdCIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0QueCIgIi4qID0gMjAiICJnX0QueCBpbmNvcnJlY3QiCisKKyAgICAjIFByaW50IG5vbi1pbmhlcml0ZWQgbWVtYmVycyBvZiBnX0UuCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19FLmUiICIuKiA9IDMxIiAiZ19FLmUgaW5jb3JyZWN0IgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRS54IiAiLiogPSAzMiIgImdfRS54IGluY29ycmVjdCIKK30KKworIworIyBUcnkgYWNjZXNzIHRvIG5vbi1tZW1iZXJzIHRoYXQgYXJlIG1lbWJlcnMgb2YgYW5vdGhlciBjbGFzcy4KKyMgU2hvdWxkIGdpdmUgZXJyb3JzLgorIworCitwcm9jIHRlc3Rfd3JvbmdfY2xhc3NfbWVtYmVycyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0EuYiIgIlRoZXJlIGlzIG5vIG1lbWJlciggb3IgbWV0aG9kfCkgbmFtZWQgYi4iICJwcmludCBnX0EuYiBzaG91bGQgYmUgZXJyb3IiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19CLmMiICJUaGVyZSBpcyBubyBtZW1iZXIoIG9yIG1ldGhvZHwpIG5hbWVkIGMuIiAicHJpbnQgZ19CLmMgc2hvdWxkIGJlIGVycm9yIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQi5kIiAiVGhlcmUgaXMgbm8gbWVtYmVyKCBvciBtZXRob2R8KSBuYW1lZCBkLiIgInByaW50IGdfQi5kIHNob3VsZCBiZSBlcnJvciIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0MuYiIgIlRoZXJlIGlzIG5vIG1lbWJlciggb3IgbWV0aG9kfCkgbmFtZWQgYi4iICJwcmludCBnX0MuYiBzaG91bGQgYmUgZXJyb3IiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19DLmQiICJUaGVyZSBpcyBubyBtZW1iZXIoIG9yIG1ldGhvZHwpIG5hbWVkIGQuIiAicHJpbnQgZ19DLmQgc2hvdWxkIGJlIGVycm9yIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRC5lIiAiVGhlcmUgaXMgbm8gbWVtYmVyKCBvciBtZXRob2R8KSBuYW1lZCBlLiIgInByaW50IGdfRC5lIHNob3VsZCBiZSBlcnJvciIKK30KKworIworIyBUcnkgYWNjZXNzIHRvIG5vbi1tZW1iZXJzIHRoYXQgYXJlIG5vdCBtZW1iZXJzIG9mIGFueSBjbGFzcy4KKyMgU2hvdWxkIGdpdmUgZXJyb3JzLgorIworCitwcm9jIHRlc3Rfbm9uZXhpc3RhbnRfbWVtYmVycyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0EueSIgIlRoZXJlIGlzIG5vIG1lbWJlciggb3IgbWV0aG9kfCkgbmFtZWQgeS4iICJwcmludCBnX0EueSBzaG91bGQgYmUgZXJyb3IiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19CLnoiICJUaGVyZSBpcyBubyBtZW1iZXIoIG9yIG1ldGhvZHwpIG5hbWVkIHouIiAicHJpbnQgZ19CLnogc2hvdWxkIGJlIGVycm9yIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQy5xIiAiVGhlcmUgaXMgbm8gbWVtYmVyKCBvciBtZXRob2R8KSBuYW1lZCBxLiIgInByaW50IGdfQy5xIHNob3VsZCBiZSBlcnJvciIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0QucCIgIlRoZXJlIGlzIG5vIG1lbWJlciggb3IgbWV0aG9kfCkgbmFtZWQgcC4iICJwcmludCBnX0QucCBzaG91bGQgYmUgZXJyb3IiCit9CisKKyMKKyMgUG9pbnRlcnMgdG8gY2xhc3MgbWVtYmVycworIworCitwcm9jIHRlc3RfcG9pbnRlcnNfdG9fY2xhc3NfbWVtYmVycyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgZ2RiX3Rlc3QgInByaW50IEJhcjo6eiIgIi4qID0gLmludFxbIFxdKlxbKCBcXSpCYXI6OiZcWylcXStcWyBcXSpCYXI6OnoiICJwcmludCBCYXI6OnoiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgJkZvbzo6eCIgIi4qID0gLmludFxbIFxdKlxbKCBcXSpGb286OlxbKilcXStcWyBcXSomRm9vOjp4IiAicHJpbnQgJkZvbzo6eCIKKworICAgIGdkYl90ZXN0ICJwcmludCAoaW50KSZGb286OngiICIuKiA9IDAiICJwcmludCAoaW50KSZGb286OngiCisKKyAgICBzZW5kX2dkYiAicHJpbnQgKGludCkmQmFyOjp5ID09IDIqc2l6ZW9mKGludClcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qID0gdHJ1ZVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInByaW50IChpbnQpJkJhcjo6eSA9PSAyKnNpemVvZihpbnQpIgorCX0KKwktcmUgIlRoZXJlIGlzIG5vIGZpZWxkIG5hbWVkIHkuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwcmludCAoaW50KSZCYXI6OnkgPT0gMipzaXplb2YoaW50KSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgKGludCkmQmFyOjp5ID09IDIqc2l6ZW9mKGludCkiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHJpbnQgKGludCkmQmFyOjp5ID09IDIqc2l6ZW9mKGludCkgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgIm5leHRcbiIKKyAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIkZGVjaW1hbFxbIFx0XF0raW5oZXJpdGFuY2UzIFxbKShcXSs7XHJcbiRnZGJfcHJvbXB0ICQiIHt9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibmV4dCB0byBpbmhlcml0YW5jZTMiIDsgcmV0dXJuIH0KKyAgICB9CisgICAgY2xlYXJfeGZhaWwgIiotKi0qIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCAoaW50KXBtaSA9PSBzaXplb2YoaW50KSIgIi4qID0gZmFsc2UiICJwcmludCAoaW50KXBtaSA9PSBzaXplb2YoaW50KSIKK30KKworIworIyBUZXN0IHN0YXRpYyBtZW1iZXJzLgorIworCitwcm9jIHRlc3Rfc3RhdGljX21lbWJlcnMge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorCisgICAgc2VuZF9nZGIgInByaW50IEZvbzo6c3RcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qID0gMTAwXHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHJpbnQgRm9vOjpzdCIKKwl9CisJLXJlICJUaGVyZSBpcyBubyBmaWVsZCBuYW1lZCBzdC4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJICAgIGZhaWwgInByaW50IEZvbzo6c3QiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IEZvbzo6c3QiIH0KKyAgICAgICB0aW1lb3V0IHsgZmFpbCAicHJpbnQgRm9vOjpzdCAodGltZW91dCkiIDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAic2V0IGZvby5zdCA9IDIwMFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwcmludCBiYXIuc3RcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qID0gMjAwXHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHJpbnQgYmFyLnN0IgorCX0KKwktcmUgIlRoZXJlIGlzIG5vIG1lbWJlciggb3IgbWV0aG9kfCkgbmFtZWQgc3QuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwcmludCBiYXIuc3QiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGJhci5zdCIgfQorICAgICAgIHRpbWVvdXQgeyBmYWlsICJwcmludCBiYXIuc3QgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInByaW50ICZmb28uc3RcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qID0gLmludCBcWyopXF0rICRoZXhcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwcmludCAmZm9vLnN0IgorCX0KKwktcmUgIlRoZXJlIGlzIG5vIG1lbWJlciggb3IgbWV0aG9kfCkgbmFtZWQgc3QuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwcmludCAmZm9vLnN0IgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCAmZm9vLnN0IiB9CisgICAgICAgdGltZW91dCB7IGZhaWwgInByaW50ICZmb28uc3QgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgc2V0IGdvdF9iYXJfc3QgMAorICAgIHNlbmRfZ2RiICJwcmludCAmQmFyOjpzdFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSAuaW50IFxbKilcXSsgJGhleFxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInByaW50ICZCYXI6OnN0IgorCSAgICBzZXQgZ290X2Jhcl9zdCAxCisJfQorCS1yZSAiVGhlcmUgaXMgbm8gZmllbGQgbmFtZWQgc3QuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwcmludCAmQmFyOjpzdCIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgJkJhcjo6c3QiIH0KKyAgICAgICB0aW1lb3V0IHsgZmFpbCAicHJpbnQgJkJhcjo6c3QgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgaWYgJGdvdF9iYXJfc3QgdGhlbiB7CisJZ2RiX3Rlc3QgInByaW50ICpcJCIgIi4qID0gMjAwIiAicHJpbnQgKlwkIgorICAgIH0KKworICAgIGdkYl90ZXN0ICJzZXQgcHJpbnQgc3RhdGljLW1lbWJlcnMgb2ZmIiAiIgorICAgIGdkYl90ZXN0ICJwcmludCBjc2kiIFwKKwkie3ggPSAxMCwgeSA9IDIwfSIgXAorCSJwcmludCBjc2kgd2l0aG91dCBzdGF0aWMgbWVtYmVycyIKKyAgICBnZGJfdGVzdCAicHJpbnQgY25zaSIgXAorCSJ7eCA9IDMwLCB5ID0gNDB9IiBcCisJInByaW50IGNuc2kgd2l0aG91dCBzdGF0aWMgbWVtYmVycyIKKworICAgIGdkYl90ZXN0ICJzZXQgcHJpbnQgc3RhdGljLW1lbWJlcnMgb24iICIiCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBjc2kiIFwKKwkie3ggPSAxMCwgeSA9IDIwLCBzdGF0aWMgbnVsbCA9IHt4ID0gMCwgeSA9IDAsIHN0YXRpYyBudWxsID0gPHNhbWUgYXMgc3RhdGljIG1lbWJlciBvZiBhbiBhbHJlYWR5IHNlZW4gdHlwZT59fSIgXAorCSJwcmludCBjc2kgd2l0aCBzdGF0aWMgbWVtYmVycyIKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInByaW50IGNuc2kiIFwKKwkie3ggPSAzMCwgeSA9IDQwLCBzdGF0aWMgbnVsbCA9IHt4ID0gMCwgeSA9IDAsIHN0YXRpYyBudWxsID0gPHNhbWUgYXMgc3RhdGljIG1lbWJlciBvZiBhbiBhbHJlYWR5IHNlZW4gdHlwZT4sIHN0YXRpYyB5eSA9IHt6ID0gNSwgc3RhdGljIHh4ID0ge3ggPSAxLCB5ID0gMiwgc3RhdGljIG51bGwgPSA8c2FtZSBhcyBzdGF0aWMgbWVtYmVyIG9mIGFuIGFscmVhZHkgc2VlbiB0eXBlPiwgc3RhdGljIHl5ID0gPHNhbWUgYXMgc3RhdGljIG1lbWJlciBvZiBhbiBhbHJlYWR5IHNlZW4gdHlwZT59fX0sIHN0YXRpYyB5eSA9IDxzYW1lIGFzIHN0YXRpYyBtZW1iZXIgb2YgYW4gYWxyZWFkeSBzZWVuIHR5cGU+fSIgXAorCSJwcmludCBjbnNpIHdpdGggc3RhdGljIG1lbWJlcnMiCit9CisKK3Byb2MgZG9fdGVzdHMge30geworICAgIGdsb2JhbCBwcm1zX2lkCisgICAgZ2xvYmFsIGJ1Z19pZAorICAgIGdsb2JhbCBzdWJkaXIKKyAgICBnbG9iYWwgb2JqZGlyCisgICAgZ2xvYmFsIHNyY2RpcgorICAgIGdsb2JhbCBiaW5maWxlCisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIHNldCBwcm1zX2lkIDAKKyAgICBzZXQgYnVnX2lkIDAKKworICAgICMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworICAgIGdkYl9leGl0CisgICAgZ2RiX3N0YXJ0CisgICAgZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisgICAgZ2RiX2xvYWQgJGJpbmZpbGUKKworICAgIHNlbmRfZ2RiICJzZXQgbGFuZ3VhZ2UgYysrXG4iCisgICAgZ2RiX2V4cGVjdCAtcmUgIiRnZGJfcHJvbXB0ICQiCisgICAgc2VuZF9nZGIgInNldCB3aWR0aCAwXG4iCisgICAgZ2RiX2V4cGVjdCAtcmUgIiRnZGJfcHJvbXB0ICQiCisKKyAgICAjIEdldCB0aGUgZGVidWcgZm9ybWF0IGZvciB0aGUgY29tcGlsZWQgdGVzdCBjYXNlLgorCisgICAgaWYgWyBydW50b19tYWluIF0gdGhlbiB7CisJZ2V0X2RlYnVnX2Zvcm1hdAorICAgIH0KKworICAgIHRlc3RfcHR5cGVfY2xhc3Nfb2JqZWN0cworCisgICAgaWYgWyBydW50byAnaW5oZXJpdGFuY2UyKHZvaWQpJyBdIHRoZW4geworCXRlc3Rfbm9uX2luaGVyaXRlZF9tZW1iZXJfYWNjZXNzCisJdGVzdF93cm9uZ19jbGFzc19tZW1iZXJzCisJdGVzdF9ub25leGlzdGFudF9tZW1iZXJzCisgICAgfQorCisgICAgaWYgW2lzdGFyZ2V0ICJtaXBzLWlkdC0qIl0gdGhlbiB7CisJIyBSZXN0YXJ0IGJlY2F1c2UgSURUL1NJTSBydW5zIG91dCBvZiBmaWxlIGRlc2NyaXB0b3JzLgorCWdkYl9leGl0CisJZ2RiX3N0YXJ0CisJZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisJZ2RiX2xvYWQgJGJpbmZpbGUKKyAgICB9CisKKyAgICBpZiBbIHJ1bnRvX21haW4gXSB0aGVuIHsKKwl0ZXN0X3BvaW50ZXJzX3RvX2NsYXNzX21lbWJlcnMKKwl0ZXN0X3N0YXRpY19tZW1iZXJzCisgICAgfQorCisgICAgaWYgW2lzdGFyZ2V0ICJtaXBzLWlkdC0qIl0gdGhlbiB7CisJIyBSZXN0YXJ0IGJlY2F1c2UgSURUL1NJTSBydW5zIG91dCBvZiBmaWxlIGRlc2NyaXB0b3JzLgorCWdkYl9leGl0CisJZ2RiX3N0YXJ0CisJZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisJZ2RiX2xvYWQgJGJpbmZpbGUKKyAgICB9CisgCisgICAgaWYgWyBydW50byBtYXJrZXJfcmVnMSBdIHRoZW4geworCisJZ2RiX3Rlc3QgImZpbmlzaCIgIlJ1biB0aWxsIGV4aXQgZnJvbS4qIiAiZmluaXNoIGZyb20gbWFya2VyX3JlZzEiCisKKwlzZW5kX2dkYiAicHJpbnQgdi5tZXRob2QgKClcbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICI9IDgyLiokZ2RiX3Byb21wdCAkIiB7CisJCXBhc3MgImNhbGxpbmcgbWV0aG9kIGZvciBzbWFsbCBjbGFzcyIKKwkgICAgfQorCSAgICAtcmUgIkFkZHJlc3MgcmVxdWVzdGVkIGZvciBpZGVudGlmaWVyIC52LiB3aGljaCBpcyBpbiBhIHJlZ2lzdGVyLiokZ2RiX3Byb21wdCAkIiB7CisJCXNldHVwX3hmYWlsICIqLSotKiIgMjk3MgorCQlmYWlsICJjYWxsaW5nIG1ldGhvZCBmb3Igc21hbGwgY2xhc3MiCisJICAgIH0KKwkgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiY2FsbGluZyBtZXRob2QgZm9yIHNtYWxsIGNsYXNzIiB9CisJICAgIHRpbWVvdXQgeyBmYWlsICJjYWxsaW5nIG1ldGhvZCBmb3Igc21hbGwgY2xhc3MgKHRpbWVvdXQpIiB9CisJICAgIGVvZiB7IGZhaWwgImNhbGxpbmcgbWV0aG9kIGZvciBzbWFsbCBjbGFzcyAoZW9mKSIgfQorCX0KKyAgICB9CisKK30KKworZG9fdGVzdHMKKworCisjIFNvbWUgYWRkaXRpb25hbCB0ZXN0cyBmb3IgZW51bXMgaW5zaWRlIGNsYXNzZXMKKworCisjIHNldCBhIGJyZWFrcG9pbnQgYW5kIGdvIHRoZXJlCitzZW5kX2dkYiAiYnJlYWsgNDk4XG4iICAgCitnZGJfZXhwZWN0IHsgICAKKyAgIC1yZSAiQnJlYWtwb2ludCBcWzAtOVxdIGF0LiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInNldCBicmVhayA0OTgiIH0KKyAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgInNldCBicmVhayA0OTgiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHNldCBicmVhayA0OTgiIH0KK30KK3NlbmRfZ2RiICJjb250aW51ZVxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgIkNvbnRpbnVpbmdcXC5cclxuXHJcbkJyZWFrcG9pbnQgXFswLTlcXSosIG1haW4uLi4uYXQgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9OjQ5OFxyXG40OTguKlxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgImNvbnRpbnVlIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJjb250aW51ZSIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY29udGludWUiIH0KK30KKworIyBwcmludCB0aGUgb2JqZWN0CitzZW5kX2dkYiAicHJpbnQgb2JqX3dpdGhfZW51bVxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgIlxcJFxbMC05XF0qID0gXFx7cHJpdl9lbnVtID0gcmVkLCB4ID0gMFxcfS4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBvYmpfd2l0aF9lbnVtICgxKSIgfQorICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHJpbnQgb2JqX3dpdGhfZW51bSAoMSkiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IG9ial93aXRoX2VudW0gKDEpIiB9Cit9CisKK3NlbmRfZ2RiICJuZXh0XG4iICAgCitnZGJfZXhwZWN0IHsgICAKKyAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgIm5leHQiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIG5leHQiIH0KK30KKworIyBwcmludCB0aGUgb2JqZWN0IGFnYWluCitzZW5kX2dkYiAicHJpbnQgb2JqX3dpdGhfZW51bVxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgIlxcJFxbMC05XF0qID0gXFx7cHJpdl9lbnVtID0gZ3JlZW4sIHggPSAwXFx9LiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IG9ial93aXRoX2VudW0gKDIpIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwcmludCBvYmpfd2l0aF9lbnVtICgyKSIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgb2JqX3dpdGhfZW51bSAoMikiIH0KK30KKworIyBwcmludCBvdXQgdGhlIGVudW0gbWVtYmVyCitzZW5kX2dkYiAicHJpbnQgb2JqX3dpdGhfZW51bS5wcml2X2VudW1cbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJcXCRcWzAtOVxdKiA9IGdyZWVuLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IG9ial93aXRoX2VudW0ucHJpdl9lbnVtIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwcmludCBvYmpfd2l0aF9lbnVtLnByaXZfZW51bSIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgb2JqX3dpdGhfZW51bS5wcml2X2VudW0iIH0KK30KKworIyBwdHlwZSBvbiB0aGUgZW51bSBtZW1iZXIKK3NlbmRfZ2RiICJwdHlwZSBvYmpfd2l0aF9lbnVtLnByaXZfZW51bVxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgInR5cGUgPSBlbnVtIENsYXNzV2l0aEVudW06OlByaXZFbnVtIFxce3JlZCwgZ3JlZW4sIGJsdWUsIHllbGxvdyA9IDQyXFx9LiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIG9ial93aXRoX2VudW0ucHJpdl9lbnVtIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwdHlwZSBvYmpfd2l0aF9lbnVtLnByaXZfZW51bSIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgb2JqX3dpdGhfZW51bS5wcml2X2VudW0iIH0KK30KKworIyBwdHlwZSBvbiB0aGUgb2JqZWN0CitzZW5kX2dkYiAicHR5cGUgb2JqX3dpdGhfZW51bVxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgInR5cGUgPSBjbGFzcyBDbGFzc1dpdGhFbnVtIFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSplbnVtIENsYXNzV2l0aEVudW06OlByaXZFbnVtIHByaXZfZW51bTtcclxuXFsgXHRcXSppbnQgeDtcclxuXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgb2JqX3dpdGhfZW51bSIgfQorICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHR5cGUgb2JqX3dpdGhfZW51bSIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgb2JqX3dpdGhfZW51bSIgfQorfQorCitzZW5kX2dkYiAicHJpbnQgKENsYXNzV2l0aEVudW06OlByaXZFbnVtKSA0MlxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgIlxcJFxbMC05XF0qID0geWVsbG93LiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IChDbGFzc1dpdGhFbnVtOjpQcml2RW51bSkgNDIiIH0KKyAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgInByaW50IChDbGFzc1dpdGhFbnVtOjpQcml2RW51bSkgNDIiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IChDbGFzc1dpdGhFbnVtOjpQcml2RW51bSkgNDIiIH0KK30KKworCitzZW5kX2dkYiAibWFpbnQgZGVtYW5nbGUgaW5oZXJpdGFuY2UxX19GdlxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgImluaGVyaXRhbmNlMVxcKHZvaWRcXCkuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiZGVtYW5nbGUiIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiAgIHsgZmFpbCAiZGVtYW5nbGUiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGRlbWFuZ2xlIiB9Cit9CisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2NvbXBpbGVyLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9jb21waWxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYjBkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9jb21waWxlci5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qIE9mdGVuIHRoZSBiZWhhdmlvciBvZiBhbnkgcGFydGljdWxhciB0ZXN0IGRlcGVuZHMgdXBvbiB3aGF0IGNvbXBpbGVyIHdhcworICAgdXNlZCB0byBjb21waWxlIHRoZSB0ZXN0LiAgQXMgZWFjaCB0ZXN0IGlzIGNvbXBpbGVkLCB0aGlzIGZpbGUgaXMKKyAgIHByZXByb2Nlc3NlZCBieSB0aGUgc2FtZSBjb21waWxlciB1c2VkIHRvIGNvbXBpbGUgdGhhdCBzcGVjaWZpYyB0ZXN0CisgICAoZGlmZmVyZW50IHRlc3RzIG1pZ2h0IGJlIGNvbXBpbGVkIGJ5IGRpZmZlcmVudCBjb21waWxlcnMsIHBhcnRpY3VsYXJseQorICAgaWYgY29tcGlsZWQgYXQgZGlmZmVyZW50IHRpbWVzKSwgYW5kIHVzZWQgdG8gZ2VuZXJhdGUgYSAqLmNpIChjb21waWxlcgorICAgaW5mbykgZmlsZSBmb3IgdGhhdCB0ZXN0LgorCisgICBJLkUuLCB3aGVuIGNhbGxmdW5jcyBpcyBjb21waWxlZCwgYSBjYWxsZnVuY3MuY2kgZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCwKKyAgIHdoaWNoIGNhbiB0aGVuIGJlIHNvdXJjZWQgYnkgY2FsbGZ1bmNzLmV4cCB0byBnaXZlIGNhbGxmdW5jcy5leHAgYWNjZXNzCisgICB0byBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQuCisKKyAgIFRPRE86ICBJdCBtaWdodCBiZSBhIGdvb2QgaWRlYSB0byBhZGQgZXhwZWN0IGNvZGUgdGhhdCB0ZXN0cyBlYWNoCisgICBkZWZpbml0aW9uIG1hZGUgd2l0aCAnc2V0IiB0byBzZWUgaWYgb25lIGFscmVhZHkgZXhpc3RzLCBhbmQgaWYgc28KKyAgIHdhcm4gYWJvdXQgY29uZmxpY3RzIGlmIGl0IGlzIGJlaW5nIHNldCB0byBzb21ldGhpbmcgZWxzZS4gICovCisKKy8qIFRoaXMgbmVlZHMgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggd2hhdGlzLmMgYW5kIGdkYi5leHAoZ2V0X2NvbXBpbGVyX2luZm8pLgorICAgSWYgdGhpcyBlbmRzIHVwIGJlaW5nIGhhaXJ5LCB3ZSBjb3VsZCB1c2UgYSBjb21tb24gaGVhZGVyIGZpbGUuICAqLworCisjaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9BSVgpCitzZXQgc2lnbmVkX2tleXdvcmRfbm90X3VzZWQgMAorI2Vsc2UKK3NldCBzaWduZWRfa2V5d29yZF9ub3RfdXNlZCAxCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR05VQ19fKQorc2V0IGdjY19jb21waWxlZCBfX0dOVUNfXworI2Vsc2UKK3NldCBnY2NfY29tcGlsZWQgMAorI2VuZGlmCisKK3JldHVybiAwCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC9jb21waWxlci5jYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2NvbXBpbGVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMzVjNzUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9jb21waWxlci5jYwpAQCAtMCwwICsxLDM0IEBACisvKiBPZnRlbiB0aGUgYmVoYXZpb3Igb2YgYW55IHBhcnRpY3VsYXIgdGVzdCBkZXBlbmRzIHVwb24gd2hhdCBjb21waWxlciB3YXMKKyAgIHVzZWQgdG8gY29tcGlsZSB0aGUgdGVzdC4gIEFzIGVhY2ggdGVzdCBpcyBjb21waWxlZCwgdGhpcyBmaWxlIGlzCisgICBwcmVwcm9jZXNzZWQgYnkgdGhlIHNhbWUgY29tcGlsZXIgdXNlZCB0byBjb21waWxlIHRoYXQgc3BlY2lmaWMgdGVzdAorICAgKGRpZmZlcmVudCB0ZXN0cyBtaWdodCBiZSBjb21waWxlZCBieSBkaWZmZXJlbnQgY29tcGlsZXJzLCBwYXJ0aWN1bGFybHkKKyAgIGlmIGNvbXBpbGVkIGF0IGRpZmZlcmVudCB0aW1lcyksIGFuZCB1c2VkIHRvIGdlbmVyYXRlIGEgKi5jaSAoY29tcGlsZXIKKyAgIGluZm8pIGZpbGUgZm9yIHRoYXQgdGVzdC4KKworICAgSS5FLiwgd2hlbiBjYWxsZnVuY3MgaXMgY29tcGlsZWQsIGEgY2FsbGZ1bmNzLmNpIGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQsCisgICB3aGljaCBjYW4gdGhlbiBiZSBzb3VyY2VkIGJ5IGNhbGxmdW5jcy5leHAgdG8gZ2l2ZSBjYWxsZnVuY3MuZXhwIGFjY2VzcworICAgdG8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50LgorCisgICBUT0RPOiAgSXQgbWlnaHQgYmUgYSBnb29kIGlkZWEgdG8gYWRkIGV4cGVjdCBjb2RlIHRoYXQgdGVzdHMgZWFjaAorICAgZGVmaW5pdGlvbiBtYWRlIHdpdGggJ3NldCIgdG8gc2VlIGlmIG9uZSBhbHJlYWR5IGV4aXN0cywgYW5kIGlmIHNvCisgICB3YXJuIGFib3V0IGNvbmZsaWN0cyBpZiBpdCBpcyBiZWluZyBzZXQgdG8gc29tZXRoaW5nIGVsc2UuICAqLworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA2CitzZXQgc3VwcG9ydHNfdGVtcGxhdGVfZGVidWdnaW5nIDEKKyNlbHNlCitzZXQgc3VwcG9ydHNfdGVtcGxhdGVfZGVidWdnaW5nIDAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgCitzZXQgc3VwcG9ydHNfdGVtcGxhdGVfZGVidWdnaW5nIDEKKyNlbHNlCitzZXQgc3VwcG9ydHNfdGVtcGxhdGVfZGVidWdnaW5nIDAKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTlVDX18pCitzZXQgZ2NjX2NvbXBpbGVkIF9fR05VQ19fCisjZWxzZQorc2V0IGdjY19jb21waWxlZCAwCisjZW5kaWYKKworcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2N0dGktYWRkLmNjIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvY3R0aS1hZGQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1MGZhZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2N0dGktYWRkLmNjCkBAIC0wLDAgKzEsMjkgQEAKK3RlbXBsYXRlPGNsYXNzIFQ+IFQgYWRkKFQgdjEsIFQgdjIpCit7CisgICBUIHYzOworICAgdjMgPSB2MTsKKyAgIHYzICs9IHYyOworICAgcmV0dXJuIHYzOworIH0KKworaW50IG1haW4oKQoreworICBjaGFyIGM7CisgIGludCBpOworICBmbG9hdCBmOworICBleHRlcm4gdm9pZCBhZGQxKCk7CisgIGV4dGVybiB2b2lkIHN1YnIyKCk7CisgIGV4dGVybiB2b2lkIHN1YnIzKCk7CisgIAorICBjID0gJ2EnOworICBpID0gMjsKKyAgZiA9IDQuNTsKKworICBjID0gYWRkKGMsIGMpOworICBpID0gYWRkKGksIGkpOworICBmID0gYWRkKGYsIGYpOworCisgIGFkZDEoKTsKKyAgc3VicjIoKTsKKyAgc3VicjMoKTsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2N0dGktYWRkMS5jYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2N0dGktYWRkMS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTEzZWNlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvY3R0aS1hZGQxLmNjCkBAIC0wLDAgKzEsMTYgQEAKK3RlbXBsYXRlPGNsYXNzIFQ+IFQgYWRkKFQgdjEsIFQgdjIpOworCit2b2lkIGFkZDEoKQoreworICBjaGFyIGM7CisgIGludCBpOworICBmbG9hdCBmOworICAKKyAgYyA9ICdiJzsKKyAgaSA9IDM7CisgIGYgPSA2LjU7CisKKyAgYyA9IGFkZChjLCBjKTsKKyAgaSA9IGFkZChpLCBpKTsKKyAgZiA9IGFkZChmLCBmKTsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2N0dGktYWRkMi5jYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2N0dGktYWRkMi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGQ5ODkxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvY3R0aS1hZGQyLmNjCkBAIC0wLDAgKzEsMjIgQEAKK3RlbXBsYXRlPGNsYXNzIFQ+IFQgYWRkMihUIHYxLCBUIHYyKQoreworICAgVCB2MzsKKyAgIHYzID0gdjE7CisgICB2MyArPSB2MjsKKyAgIHJldHVybiB2MzsKK30KKwordm9pZCBzdWJyMigpCit7CisgIGNoYXIgYzsKKyAgaW50IGk7CisgIGZsb2F0IGY7CisgIAorICBjID0gJ2InOworICBpID0gMzsKKyAgZiA9IDYuNTsKKworICBjID0gYWRkMihjLCBjKTsKKyAgaSA9IGFkZDIoaSwgaSk7CisgIGYgPSBhZGQyKGYsIGYpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvY3R0aS1hZGQzLmNjIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvY3R0aS1hZGQzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYTFiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9jdHRpLWFkZDMuY2MKQEAgLTAsMCArMSwzMyBAQAordGVtcGxhdGU8Y2xhc3MgVD4gVCBhZGQzKFQgdjEsIFQgdjIpCit7CisgICBUIHYzOworICAgdjMgPSB2MTsKKyAgIHYzICs9IHYyOworICAgcmV0dXJuIHYzOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPiBUIGFkZDQoVCB2MSwgVCB2MikKK3sKKyAgIFQgdjM7CisgICB2MyA9IHYxOworICAgdjMgKz0gdjI7CisgICByZXR1cm4gdjM7Cit9CisKK3ZvaWQgc3VicjMoKQoreworICBjaGFyIGM7CisgIGludCBpOworICBmbG9hdCBmOworICAKKyAgYyA9ICdiJzsKKyAgaSA9IDM7CisgIGYgPSA2LjU7CisKKyAgYyA9IGFkZDMoYywgYyk7CisgIGkgPSBhZGQzKGksIGkpOworICBmID0gYWRkMyhmLCBmKTsKKyAgYyA9IGFkZDQoYywgYyk7CisgIGkgPSBhZGQ0KGksIGkpOworICBmID0gYWRkNChmLCBmKTsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2N0dGkuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvY3R0aS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzMjEwZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2N0dGkuZXhwCkBAIC0wLDAgKzEsMjY5IEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBnZGIgdGVzdHN1aXRlCisjIGZpbGUgd3JpdHRlbiBieSBFbGVuYSBaYW5ub25pIChlemFubm9uaUBjeWdudXMuY29tKQorIworIyBzb3VyY2UgZmlsZXMgY3R0aS1hZGQuY2MsIGN0dGktYWRkMS5jYywgY3R0aS1hZGQyLmNjLCBjdHRpLWFkZDMuY2MKKyMKKworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKKworIyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbiBleGVjdXRhYmxlIHRvIHRlc3QuICBJZiBub3QsIHRoZW4gZWl0aGVyIHdlCisjIGhhdmVuJ3QgdHJpZWQgdG8gY29tcGlsZSBvbmUsIG9yIHRoZSBjb21waWxhdGlvbiBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLgorIyBJbiBlaXRoZXIgY2FzZSwganVzdCBub3RpZnkgdGhlIHVzZXIgYW5kIHNraXAgdGhlIHRlc3RzIGluIHRoaXMgZmlsZS4KKworc2V0IHRlc3RmaWxlICJjdHRpLWFkZCIKK3NldCBzcmNmaWxlICAke3Rlc3RmaWxlfS5jYworc2V0IHNyY2ZpbGUxICR7dGVzdGZpbGV9MS5jYworc2V0IHNyY2ZpbGUyICR7dGVzdGZpbGV9Mi5jYworc2V0IHNyY2ZpbGUzICR7dGVzdGZpbGV9My5jYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfSAiYysrIl0geworICAgIHJldHVybiAtMTsKK30KKyAKKyAKK2lmIHtbc2tpcF9ocF90ZXN0cyAkZ2NjX2NvbXBpbGVkXX0gdGhlbiB7IGNvbnRpbnVlIH0KKworI2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9ICR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlMX0gJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGUyfSAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZTN9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYysrfV0gIT0gIiIgfSB7CisjICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKKyN9CisKK3NldCBjbWRsaW5lICIkQ1hYICR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZTF9ICR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlMn0gJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGUzfSAtZyAtbyAke2JpbmZpbGV9IgorCityZW1vdGVfZXhlYyBidWlsZCAkY21kbGluZQorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworCisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgcGVycm9yICJjb3VsZG4ndCBydW4gdG8gYnJlYWtwb2ludCIKKyAgICBjb250aW51ZQorfQorCisKK3NlbmRfZ2RiICJuXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIiRkZWNpbWFsLippID0gMjsuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAibmV4dCAiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibmV4dCAiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIm5leHQgIiB9CisgIH0KKworCitzZW5kX2dkYiAiblxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIkZGVjaW1hbC4qZiA9IDQuNTsuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAibmV4dCAiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibmV4dCAiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIm5leHQgIiB9CisgIH0KKworc2VuZF9nZGIgIm5cbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiJGRlY2ltYWwuKmMgPSBhZGRcXChjLCBjXFwpOy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJuZXh0ICIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJuZXh0ICIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAibmV4dCAiIH0KKyAgfQorCitzZW5kX2dkYiAiblxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIkZGVjaW1hbC4qaSA9IGFkZFxcKGksIGlcXCk7LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgIm5leHQgIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgIm5leHQgIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICJuZXh0ICIgfQorICB9CisKK3NlbmRfZ2RiICJuXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIiRkZWNpbWFsLipmID0gYWRkXFwoZiwgZlxcKTsuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAibmV4dCAiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibmV4dCAiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIm5leHQgIiB9CisgIH0KKworc2VuZF9nZGIgIm5cbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiJGRlY2ltYWwuKmFkZDFcXChcXCk7LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgIm5leHQgIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgIm5leHQgIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICJuZXh0ICIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBjXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IC02Mi4qXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgYyIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiBjIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgYyIgfQorICB9CisKKworc2VuZF9nZGIgInByaW50IGZcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gOVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIGYiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgZiIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIGYiIH0KKyAgfQorCisKK3NlbmRfZ2RiICJwcmludCBpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IDRcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIGkiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBpIiB9CisgIH0KKworCisKK3NlbmRfZ2RiICJwcmludCBhZGQ8aW50PigyLDIpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IDRcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBhZGQ8aW50PigyLDIpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIGFkZDxpbnQ+KDIsMikiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBhZGQ8aW50PigyLDIpIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IGFkZDxmbG9hdD4oMi4zLDIuMylcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gNFxcLjVcWzAtOVxdK1xyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIGFkZDxmbG9hdD4oMi4zLDIuMykiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgYWRkPGZsb2F0PigyLjMsMi4zKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIGFkZDxmbG9hdD4oMi4zLDIuMykiIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgYWRkPGNoYXI+KCdBJywnQScpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IC0xMjYuKjIwMi5cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBhZGQ8Y2hhcj4oJ0EnLCdBJykiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgYWRkPGNoYXI+KCdBJywnQScpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgYWRkPGNoYXI+KCdBJywnQScpIiB9CisgIH0KKworCitzZW5kX2dkYiAicHJpbnQgYWRkMjxpbnQ+KDIsMilcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gNFxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIGFkZDI8aW50PigyLDIpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIGFkZDI8aW50PigyLDIpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgYWRkMjxpbnQ+KDIsMikiIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgYWRkMjxmbG9hdD4oMi4zLDIuMylcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gNFxcLjVcWzAtOVxdK1xyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIGFkZDI8ZmxvYXQ+KDIuMywyLjMpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIGFkZDI8ZmxvYXQ+KDIuMywyLjMpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgYWRkMjxmbG9hdD4oMi4zLDIuMykiIH0KKyAgfQorCitzZW5kX2dkYiAicHJpbnQgYWRkMjxjaGFyPignQScsJ0EnKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuJGRlY2ltYWwgPSAtMTI2LioyMDIuXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgYWRkMjxjaGFyPignQScsJ0EnKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiBhZGQyPGNoYXI+KCdBJywnQScpIiB9CisgICAgdGltZW91dCAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgdmFsdWUgb2YgYWRkMjxjaGFyPignQScsJ0EnKSIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBhZGQzPGludD4oMiwyKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuJGRlY2ltYWwgPSA0XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgYWRkMzxpbnQ+KDIsMikiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgYWRkMzxpbnQ+KDIsMikiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBhZGQzPGludD4oMiwyKSIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBhZGQzPGZsb2F0PigyLjMsMi4zKVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuJGRlY2ltYWwgPSA0XFwuNVxbMC05XF0rXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAicHJpbnQgdmFsdWUgb2YgYWRkMzxmbG9hdD4oMi4zLDIuMykiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgYWRkMzxmbG9hdD4oMi4zLDIuMykiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBhZGQzPGZsb2F0PigyLjMsMi4zKSIgfQorICB9CisKK3NlbmRfZ2RiICJwcmludCBhZGQzPGNoYXI+KCdBJywnQScpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IC0xMjYuKjIwMi5cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBhZGQzPGNoYXI+KCdBJywnQScpIgorICAgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHZhbHVlIG9mIGFkZDM8Y2hhcj4oJ0EnLCdBJykiIH0KKyAgICB0aW1lb3V0ICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB2YWx1ZSBvZiBhZGQzPGNoYXI+KCdBJywnQScpIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IGFkZDQ8aW50PigyLDIpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IDRcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBhZGQ0PGludD4oMiwyKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiBhZGQ0PGludD4oMiwyKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIGFkZDQ8aW50PigyLDIpIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IGFkZDQ8ZmxvYXQ+KDIuMywyLjMpXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4kZGVjaW1hbCA9IDRcXC41XFswLTlcXStcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJwcmludCB2YWx1ZSBvZiBhZGQ0PGZsb2F0PigyLjMsMi4zKSIKKyAgICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCB2YWx1ZSBvZiBhZGQ0PGZsb2F0PigyLjMsMi4zKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIGFkZDQ8ZmxvYXQ+KDIuMywyLjMpIiB9CisgIH0KKworc2VuZF9nZGIgInByaW50IGFkZDQ8Y2hhcj4oJ0EnLCdBJylcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiRkZWNpbWFsID0gLTEyNi4qMjAyLlxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInByaW50IHZhbHVlIG9mIGFkZDQ8Y2hhcj4oJ0EnLCdBJykiCisgICAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdmFsdWUgb2YgYWRkNDxjaGFyPignQScsJ0EnKSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IHZhbHVlIG9mIGFkZDQ8Y2hhcj4oJ0EnLCdBJykiIH0KKyAgfQorCisKK2dkYl9leGl0CityZXR1cm4gMApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvZGJ4LmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2RieC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmMjRlOQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2RieC5leHAKQEAgLTAsMCArMSwyMjIgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgICAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworCitzZXQgdGVzdGZpbGUxICJhdmVyYWdlIgorc2V0IHRlc3RmaWxlMiAic3VtIgorc2V0IHRlc3RmaWxlICJkYngtdGVzdCIKK3NldCBiaW5maWxlMSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGUxfQorc2V0IGJpbmZpbGUyICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZTJ9CitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKKworCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vYXZlcmFnZS5jIiAiJHtiaW5maWxlMX0ubyIgb2JqZWN0IHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9L3N1bS5jIiAiJHtiaW5maWxlMn0ubyIgb2JqZWN0IHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworaWYgIHsgW2dkYl9jb21waWxlICIke2JpbmZpbGUxfS5vICR7YmluZmlsZTJ9Lm8iICR7YmluZmlsZX0gZXhlY3V0YWJsZSB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9XSB7CisgICAgcmV0dXJuIC0xOworfQoraWYge1tza2lwX2hwX3Rlc3RzICRnY2NfY29tcGlsZWRdfSB0aGVuIHsgY29udGludWUgfQorCitwcm9jIGRieF9yZWluaXRpYWxpemVfZGlyIHsgc3ViZGlyIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgIHNlbmRfZ2RiICJ1c2VcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJSZWluaXRpYWxpemUgc291cmNlIHBhdGggdG8gZW1wdHkuKnkgb3Igbi4gIiB7CisgICAgICAgICAgICBzZW5kX2dkYiAieVxuIgorICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgLXJlICJTb3VyY2UgZGlyZWN0b3JpZXMgc2VhcmNoZWQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZF9nZGIgInVzZSAkc3ViZGlyXG4iCisgICAgICAgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgICAgLXJlICJTb3VyY2UgZGlyZWN0b3JpZXMgc2VhcmNoZWQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlICJEaXIgc2V0IHRvICRzdWJkaXIiCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnJvciAiRGlyIFwiJHN1YmRpclwiIGZhaWxlZC4iCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgcGVycm9yICJEaXIgXCIkc3ViZGlyXCIgZmFpbGVkLiIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIHBlcnJvciAiRGlyIFwiJHN1YmRpclwiIGZhaWxlZC4iCisgICAgICAgIH0KKyAgICB9Cit9CisKKyMgSW4gInRlc3RzdWl0ZS9jb25maWcvdW5peC1nZGIuZXhwIiwgdGhlIHJvdXRpbmUgImdkYl9sb2FkIgorIyBpcyBkZWZpbmVkIGFzICJnZGJfZmlsZV9jbWQiLiAgVGhlIGJpbmRpbmcgb2YgImdkYl9maWxlX2NtZCIKKyMgaXMgZG9uZSBhdCBpbnZvY2F0aW9uIHRpbWUuICBCZWZvcmUgdGhpcyBmaWxlIGlzIHByb2Nlc3NlZCwKKyMgaXQgYmluZHMgdG8gdGhlIGRlZmluaXRpb24gaW4gInRlc3RzdWl0ZS9saWIvZ2RiLmV4cCI7IGFmdGVyCisjIHRoaXMgZmlsZSBpcyBwcm9jZXNzZWQsIGl0IGJpbmRzIHRvIHRoaXMgZGVmaW5pdGlvbi4KKyMgVENMIGxldHMgdXMgb3ZlcnJpZGVzIGEgcHJldmlvdXMgcm91dGluZSBkZWZpbml0aW9uIHdpdGhvdXQgYQorIyB3YXJuaW5nIChpc24ndCB0aGF0IHNwZWNpYWw/KS4KKyMKKyMgVGhpcyBtZWFucyB0aGF0IHRlc3RzIGJlZm9yZSB1c2UgImZpbGUiIHRvIGxvYWQgYSB0YXJnZXQsIGFuZAorIyB0ZXN0cyBhZnRlcndhcmRzIHVzZSB0aGUgcGFpciAic3ltYm9sLWZpbGUiICJleGVjLWZpbGUiLgorIworIyBJJ20gbGVhdmluZyBpdCBhcyBpdCBpcyBmb3Igbm93IGJlY2F1c2UgYXQgdGhlIG1vbWVudCBpdAorIyBpcyB0aGUgb25seSB0ZXN0IHdlIGhhdmUgb2YgdGhlIHVzZSBvZiB0aGUgY29tYmluYXRpb24gb2YKKyMgInN5bWJvbC1maWxlIiBhbmQgImV4ZWMtZmlsZSIgdG8gbG9hZCBhIGRlYnVnZ2luZyB0YXJnZXQgKHRoZQorIyBvdGhlciBkZWZpbml0aW9uIHVzZXMgImZpbGUiLiAKKyMKKyMgU3ltYm9sLWZpbGUgYW5kIGV4ZWMtZmlsZSBzaG91bGQgYmUgdGVzdGVkIGV4cGxpY2l0bHksIG5vdAorIyBhcyBhIHNpZGUgZWZmZWN0IG9mIHJ1bm5pbmcgYSBwYXJ0aWN1bGFyIHRlc3QgKGluIHRoaXMgY2FzZSwKKyMgInRlc3RzdWl0ZS9nZGIuY29tcGF0L2RieC5leHAiKS4KKyMKKyMKK3Byb2MgZ2RiX2ZpbGVfY21kIHthcmcgfSB7CisgICAgZ2xvYmFsIHZlcmJvc2UKKyAgICBnbG9iYWwgbG9hZHBhdGgKKyAgICBnbG9iYWwgbG9hZGZpbGUKKyAgICBnbG9iYWwgR0RCCisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgc3Bhd25faWQKKyAgICB1cHZhciB0aW1lb3V0IHRpbWVvdXQKKworICAgIHNlbmRfZ2RiICJzeW1ib2wtZmlsZSAkYXJnXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAiUmVhZGluZyBzeW1ib2xzIGZyb20uKmRvbmUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIHZlcmJvc2UgIlx0XHRMb2FkZWQgJGFyZyBpbnRvIHRoZSAkR0RCIgorICAgICAgICAgICAgc2VuZF9nZGIgImV4ZWMtZmlsZSAkYXJnXG4iIAorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgfQorICAgICAgICAtcmUgImhhcyBubyBzeW1ib2wtdGFibGUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIHBlcnJvciAiJGFyZyB3YXNuJ3QgY29tcGlsZWQgd2l0aCBcIi1nXCIiCisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgfQorICAgICAgICAtcmUgIkEgcHJvZ3JhbSBpcyBiZWluZyBkZWJ1Z2dlZCBhbHJlYWR5LipLaWxsIGl0Lip5IG9yIG4uICQiIHsKKyAgICAgICAgICAgIHNlbmRfZ2RiICJ5XG4iCisgICAgICAgICAgICAgICAgdmVyYm9zZSAiXHRcdEtpbGxpbmcgcHJldmlvdXMgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZCIKKyAgICAgICAgICAgIGV4cF9jb250aW51ZQorICAgICAgICB9CisgICAgICAgIC1yZSAiTG9hZCBuZXcgc3ltYm9sIHRhYmxlIGZyb20gXCIuKlwiLip5IG9yIG4uICQiIHsKKyAgICAgICAgICAgIHNlbmRfZ2RiICJ5XG4iCisgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAtcmUgIlJlYWRpbmcgc3ltYm9scyBmcm9tLipkb25lLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgIlx0XHRMb2FkZWQgJGFyZyB3aXRoIG5ldyBzeW1ib2wgdGFibGUgaW50byAkR0RCIgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aW1lb3V0IHsKKyAgICAgICAgICAgICAgICAgICAgcGVycm9yICIodGltZW91dCkgQ291bGRuJ3QgbG9hZCAkYXJnLCBvdGhlciBwcm9ncmFtIGFscmVhZHkgbG9hZGVkLiIKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC1yZSAiLipObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBwZXJyb3IgIigkYXJnKSBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XG4iCisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgfQorICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIHBlcnJvciAiY291bGRuJ3QgbG9hZCAkYXJnIGludG8gJEdEQi4iCisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIH0KKyAgICAgICAgdGltZW91dCB7CisgICAgICAgICAgICBwZXJyb3IgImNvdWxkbid0IGxvYWQgJGFyZyBpbnRvICRHREIgKHRpbWVkIG91dCkuIgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIH0KKyAgICAgICAgZW9mIHsKKyAgICAgICAgICAgICMgVGhpcyBpcyBhbiBhdHRlbXB0IHRvIGRldGVjdCBhIGNvcmUgZHVtcCwgYnV0IHNlZW1zIG5vdCB0bworICAgICAgICAgICAgIyB3b3JrLiAgUGVyaGFwcyB3ZSBuZWVkIHRvIG1hdGNoIC4qIGZvbGxvd2VkIGJ5IGVvZiwgaW4gd2hpY2gKKyAgICAgICAgICAgICMgZXhwZWN0IGRvZXMgbm90IHNlZW0gdG8gaGF2ZSBhIHdheSB0byBkbyB0aGF0LgorICAgICAgICAgICAgcGVycm9yICJjb3VsZG4ndCBsb2FkICRhcmcgaW50byAkR0RCIChlbmQgb2YgZmlsZSkuIgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIH0KKyAgICB9Cit9CisKKyMKKyN0ZXN0X2JyZWFrcG9pbnRzCisjCitwcm9jIHRlc3RfYnJlYWtwb2ludHMgeyB9IHsKKyAgICBnZGJfdGVzdCAic3RvcCBpbiBtYWluIiAiQnJlYWtwb2ludC4qYXQuKjogZmlsZS4qYXZlcmFnZVwuYywgbGluZSAzMVwuIgorICAgIGdkYl90ZXN0ICJzdGF0dXMiICJOdW0uKlR5cGUuKkRpc3AuKkVuYi4qQWRkcmVzcy4qV2hhdFxyXG4xXFsgXHJcXSticmVha3BvaW50XFsgXHJcXStrZWVwIHkuKmluIG1haW4gYXQuKmF2ZXJhZ2VcLmM6MzEuKiIKKyAgICBnZGJfdGVzdCAic3RvcCBhdCAzNiIgIkJyZWFrcG9pbnQuKmF0Lio6IGZpbGUuKmF2ZXJhZ2VcLmMsIGxpbmUgMzYuKiIKKyAgICBnZGJfdGVzdCAic3RvcCBpbiAzNiIgIlVzYWdlOiBzdG9wIGluIDxmdW5jdGlvbiAuIGFkZHJlc3M+IgorICAgIGdkYl90ZXN0ICJzdG9wIGF0IG1haW4iICJVc2FnZTogc3RvcCBhdCA8bGluZT4iCit9CisKKyMKKyN0ZXN0X2Fzc2lnbgorIworcHJvYyB0ZXN0X2Fzc2lnbiB7IH0geworICAgIGdkYl90ZXN0ICJydW4iICIiCisgICAgZ2RiX3Rlc3QgImFzc2lnbiBmaXJzdD0xIiAiIgorICAgIGdkYl90ZXN0ICJwcmludCBmaXJzdCIgIi4xID0gMSIKK30KKworIworI3Rlc3Rfd2hlcmVpcworIworcHJvYyB0ZXN0X3doZXJlaXMgeyB9IHsKKyAgICBnZGJfdGVzdCAid2hlcmVpcyBteV9saXN0IiAiQWxsIHZhcmlhYmxlcyBtYXRjaGluZyByZWd1bGFyIGV4cHJlc3Npb24gXCJteV9saXN0XCI6XHJcblxyXG5GaWxlLiphdmVyYWdlXC5jOlxyXG5zdGF0aWMgaW50IG15X2xpc3RcXFxbMTBcXFxdOyIKK30KKworIworI3Rlc3RfZnVuYworIworcHJvYyB0ZXN0X2Z1bmMgeyB9IHsKKyAgICBnZGJfdGVzdCAiY29udCIgIiIKKyAgICBnZGJfdGVzdCAic3RlcCIgIiIKKyAgICBnZGJfdGVzdCAiZnVuYyBzdW0iICInc3VtJyBub3Qgd2l0aGluIGN1cnJlbnQgc3RhY2sgZnJhbWVcLiIKKyAgICBnZGJfdGVzdCAic3RvcCBpbiBzdW0iICJCcmVha3BvaW50LiphdC4qOiBmaWxlLipzdW1cLmMsIGxpbmUgMTFcLiIKKyAgICBnZGJfdGVzdCAiY29udCIKKyAgICBnZGJfdGVzdCAiZnVuYyBwcmludF9hdmVyYWdlIiAiLippbiBwcmludF9hdmVyYWdlLipcXChsaXN0PS4qLCBsb3c9MCwgaGlnaD02XFwpLiphdC4qYXZlcmFnZVwuYzoxN1xyXG4xN1xbIFx0XF0rdG90YWwgPSBzdW1cXChsaXN0LCBsb3csIGhpZ2hcXCk7IgorfQorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKK2dkYl9leGl0CitnbG9iYWwgR0RCRkxBR1MKK3NldCBzYXZlZF9nZGJmbGFncyAkR0RCRkxBR1MKKworc2V0IEdEQkZMQUdTICIkR0RCRkxBR1MgLS1kYngiCitnZGJfc3RhcnQKK2RieF9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorc2VuZF9nZGIgInNldCB3aWR0aCAwXG4iCitnZGJfZXhwZWN0IC1yZSAiJGdkYl9wcm9tcHQgJCIKK3Rlc3RfYnJlYWtwb2ludHMKK3Rlc3RfYXNzaWduCit0ZXN0X3doZXJlaXMKK2dkYl90ZXN0ICJmaWxlIGF2ZXJhZ2UuYzoxIiAiMVxbIFx0XF0rLy4gVGhpcyBpcyBhIHNhbXBsZSBwcm9ncmFtLioiCit0ZXN0X2Z1bmMKKworZ2RiX2V4aXQKK3NldCBHREJGTEFHUyAkc2F2ZWRfZ2RiZmxhZ3MKK3JldHVybiAwCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC9leGNlcHRpb24uY2MgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9leGNlcHRpb24uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0NTkzMgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2V4Y2VwdGlvbi5jYwpAQCAtMCwwICsxLDQ4IEBACisvLyBUZXN0IGZpbGUgZm9yIGV4Y2VwdGlvbiBoYW5kbGluZyBzdXBwb3J0LgorCisjaW5jbHVkZSA8aW9zdHJlYW0uaD4KKworaW50IGZvbyAoaW50IGkpCit7CisgIGlmIChpIDwgMzIpCisgICAgdGhyb3cgKGludCkgMTM7CisgIGVsc2UKKyAgICByZXR1cm4gaSAqIDI7Cit9CisKK2V4dGVybiAiQyIgaW50IGJhciAoaW50IGssIHVuc2lnbmVkIGxvbmcgZWhhcmcsIGludCBmbGFnKTsKKyAgICAKK2ludCBiYXIgKGludCBrLCB1bnNpZ25lZCBsb25nIGVoYXJnLCBpbnQgZmxhZykKK3sKKyAgY291dCA8PCAiayBpcyAiIDw8IGsgPDwgIiBlaGFyZyBpcyAiIDw8IGVoYXJnIDw8ICIgZmxhZyBpcyAiIDw8IGZsYWcgPDwgZW5kbDsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGo7CisKKyAgdHJ5IHsKKyAgICBqID0gZm9vICgyMCk7CisgIH0KKyAgY2F0Y2ggKGludCB4KSB7CisgICAgY291dCA8PCAiR290IGFuIGV4Y2VwdCAiIDw8IHggPDwgZW5kbDsKKyAgfQorICAKKyAgdHJ5IHsKKyAgICB0cnkgeworICAgICAgaiA9IGZvbyAoMjApOworICAgIH0KKyAgICBjYXRjaCAoaW50IHgpIHsKKyAgICAgIGNvdXQgPDwgIkdvdCBhbiBleGNlcHQgIiA8PCB4IDw8IGVuZGw7CisgICAgICB0aHJvdzsKKyAgICB9CisgIH0KKyAgY2F0Y2ggKGludCB5KSB7CisgICAgY291dCA8PCAiR290IGFuIGV4Y2VwdCAocmV0aHJvd24pICIgPDwgeSA8PCBlbmRsOworICB9CisKKyAgLy8gTm90IGNhdWdodCAKKyAgZm9vICgyMCk7CisgIAorfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvZXhjZXB0aW9uLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2V4Y2VwdGlvbi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhZmJkYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2V4Y2VwdGlvbi5leHAKQEAgLTAsMCArMSw0MDggQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjCisjIHRlc3RzIGZvciBleGNlcHRpb24taGFuZGxpbmcgc3VwcG9ydAorIyBXcml0dGVuIGJ5IFNhdGlzaCBQYWkgPHBhaUBhcG9sbG8uaHAuY29tPiAxOTk3LTA3LTIzCisKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGdkYiB0ZXN0c3VpdGUKKworIyBOb3RlOiBUaGVzZSB0ZXN0cyBhcmUgZ2VhcmVkIHRvIHRoZSBIUCBhQ0MgY29tcGlsZXIsCisjIHdoaWNoIGhhcyBhbiBpZGlvc3luY3JhdGljIHdheSBvZiBlbWl0dGluZyBkZWJ1ZyBpbmZvCisjIGZvciBleGNlcHRpb25zIC0tIGl0IHVzZXMgYSBjYWxsYmFjayBtZWNoYW5pc20sIHdoaWNoCisjIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB3YXkgZysrIHJlY29yZHMgZXhjZXB0aW9uIGluZm8KKyMgZm9yIGRlYnVnZ2luZworCisjIFRoZSB0ZXN0cyBhcmUgaW4gdHdvIHBhcnRzOyB0aGUgZmlyc3QgcGFydCBkZWFscyB3aXRoCisjIHN0YXRpY2FsbHkgbGlua2VkIChhcmNoaXZlLWJvdW5kKSBleGVjdXRhYmxlcywgYW5kIHRoZQorIyBzZWNvbmQgcGFydCByZXBlYXRzIHRob3NlIHRlc3RzIHdpdGggZHluYW1pY2FsbHkgbGlua2VkCisjIChzaGFyZWQgYm91bmQpIGV4ZWN1dGFibGVzLiAgKEluIHRoZSBsYXR0ZXIgY2FzZSB3ZSB1c2UKKyMgYSBkaWZmZXJlbnQgbWVjaGFuaXNtIHRvIGdldCB0aGUgYWRkcmVzcyBvZiB0aGUgbm90aWZpY2F0aW9uCisjIGhvb2sgaW4gdGhlIEMrKyBzdXBwb3J0IGxpYnJhcnkuKSBUaGUgdGVzdHMgdGhlbXNlbHZlcyBhcmUKKyMgdGhlIHNhbWUgaW4gYm90aCBwYXJ0cy4KKyMgCisjIElNUE9SVEFOVDoKKyMgLS0tLS0tLS0tCisjIElGIFlPVSBDSEFOR0UgQSBURVNUIElOIE9ORSBQQVJUIE1BS0UgU1VSRSBZT1UgQ0hBTkdFIElUCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIElOIFRIRSBPVEhFUiBQQVJUIFRPTyEKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisgICAgICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorICAgICAgICB9CisKKworIworIyB0ZXN0IHJ1bm5pbmcgcHJvZ3JhbXMKKyMKKworIyBQYXJ0IEkgOiBBcmNoaXZlLWJvdW5kIGV4ZWN1dGFibGVzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc2V0IHRlc3RmaWxlICJleGNlcHRpb24iCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorIAoraWYgW2dldF9jb21waWxlcl9pbmZvICR7YmluZmlsZX0gImMrKyJdIHsKKyAgICByZXR1cm4gLTE7Cit9CisgCisgCitpZiB7W3NraXBfaHBfdGVzdHMgJGdjY19jb21waWxlZF19IHRoZW4geyBjb250aW51ZSB9CisKK3NldCBjbWRsaW5lICIkQ1hYICR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSArQSAtV2wsLWEsYXJjaGl2ZSAtZyAtbyAke2JpbmZpbGV9IgorCityZW1vdGVfZXhlYyBidWlsZCAkY21kbGluZQorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIKKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCitpZiAhW3J1bnRvX21haW5dIHRoZW4geworICAgIHBlcnJvciAiY291bGRuJ3QgcnVuIHRvIGJyZWFrcG9pbnQiCisgICAgY29udGludWUKK30KKworIyBTZXQgYSBjYXRjaCBjYXRjaHBvaW50CisKK3NlbmRfZ2RiICJjYXRjaCBjYXRjaFxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIkNhdGNocG9pbnQgXFswLTlcXSogXFwoY2F0Y2hcXClcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgIHBhc3MgImNhdGNoIGNhdGNoIChzdGF0aWMgZXhlY3V0YWJsZSkiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjYXRjaCBjYXRjaCAgKHN0YXRpYyBleGVjdXRhYmxlKSIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBjYXRjaCBjYXRjaCAgKHN0YXRpYyBleGVjdXRhYmxlKSIgfQorfQorCisjIFNldCBhIHRocm93IGNhdGNocG9pbnQKKworc2VuZF9nZGIgImNhdGNoIHRocm93XG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiQ2F0Y2hwb2ludCBcWzAtOVxdKiBcXCh0aHJvd1xcKVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgcGFzcyAiY2F0Y2ggdGhyb3cgKHN0YXRpYyBleGVjdXRhYmxlKSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNhdGNoIHRocm93IChzdGF0aWMgZXhlY3V0YWJsZSkiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgY2F0Y2ggdGhyb3cgKHN0YXRpYyBleGVjdXRhYmxlKSIgfQorfQorCisjIFRoZSBjYXRjaHBvaW50cyBzaG91bGQgYmUgbGlzdGVkIGluIHRoZSBsaXN0IG9mIGJyZWFrcG9pbnRzLgorCitzZW5kX2dkYiAiaW5mbyBicmVha1xuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIi4qXFswLTlcXSpcWyBcXSpjYXRjaCBjYXRjaFxbIFxdKmtlZXAgeVxbIFxdKmV4Y2VwdGlvbiBjYXRjaFxbIFxdKlxyXG5cWzAtOVxdKlxbIFxdKmNhdGNoIHRocm93XFsgXF0qa2VlcCB5XFsgXF0qZXhjZXB0aW9uIHRocm93XFsgXF0qXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICBwYXNzICJpbmZvIGJyZWFrIHdpdGggY2F0Y2hwb2ludHMgKHN0YXRpYyBleGVjdXRhYmxlKSIKKyAgIH0gICAgCisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJpbmZvIGJyZWFrIChzdGF0aWMgZXhlY3V0YWJsZSkiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgaW5mbyBicmVhayAoc3RhdGljIGV4ZWN1dGFibGUpIiB9Cit9CisKKyMgSW5mbyBjYXRjaCBjdXJyZW50bHkgZG9lcyBub3Qgd29yayB3aXRoIEhQIGFDQy4gTm8gZWFzeSB3YXkgdG8KKyMgbGlzdCB0aGUgYWN0aXZlIGhhbmRsZXJzIG9uIHRoZSBzdGFjay4KKworc2VuZF9nZGIgImluZm8gY2F0Y2hcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJJbmZvIGNhdGNoIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGlzIHRhcmdldC9jb21waWxlciBjb21iaW5hdGlvbi5cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgIHBhc3MgImluZm8gY2F0Y2ggKHN0YXRpYyBleGVjdXRhYmxlKSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImluZm8gY2F0Y2ggKHN0YXRpYyBleGVjdXRhYmxlKSIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBpbmZvIGNhdGNoIChzdGF0aWMgZXhlY3V0YWJsZSkiIH0KK30KKworIyBHZXQgdGhlIGZpcnN0IGV4Y2VwdGlvbiB0aHJvd24KKyAgICAgICAKK3NlbmRfZ2RiICJjb250aW51ZVxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIkNvbnRpbnVpbmcuKkNhdGNocG9pbnQgXFswLTlcXSogXFwoZXhjZXB0aW9uIHRocm93blxcKSwgdGhyb3cgbG9jYXRpb24uKmV4Y2VwdGlvblxcLmNjOjgsIGNhdGNoIGxvY2F0aW9uIC4qZXhjZXB0aW9uXFwuY2M6MjhcclxuLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJjYXVnaHQgYSB0aHJvdyAoc3RhdGljIGV4ZWN1dGFibGUpIgorICAgfQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiZGlkbid0IGNhdGNoIGEgdGhyb3cgKHN0YXRpYyBleGVjdXRhYmxlKSIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBhZnRlciBjb250aW51ZSAtLSBkaWRuJ3QgY2F0Y2ggYSB0aHJvdz8gKHN0YXRpYyBleGVjdXRhYmxlKSIgfQorfQorCitzZW5kX2dkYiAiYmFja3RyYWNlXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiIzBcWyBcXSpfX2RfZWhfYnJlYWsuKlxyXG4jMVxbIFxdKiRoZXggaW4gX19kX2VoX25vdGlmeV9jYWxsYmFjayBcXChlaF90eXBlPV9fRUhfTk9USUZZX1RIUk9XLipcclxuIzJcWyBcXSokaGV4IGluIF9fZWhfbm90aWZ5X3Rocm93LipcclxuIzNcWyBcXSokaGV4IGluIGZvbyBcXChpPTIwXFwpIGF0IC4qZXhjZXB0aW9uXFwuY2M6OFxyXG4jNFxbIFxdKiRoZXggaW4gbWFpbi4qIGF0IC4qZXhjZXB0aW9uXFwuY2M6MjZcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAiYmFja3RyYWNlIGFmdGVyIHRocm93IChzdGF0aWMgZXhlY3V0YWJsZSkiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJiYWNrdHJhY2UgYWZ0ZXIgdGhyb3cgKHN0YXRpYyBleGVjdXRhYmxlKSIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBiYWNrdHJhY2UgYWZ0ZXIgdGhyb3cgKHN0YXRpYyBleGVjdXRhYmxlKSIgfQorfQorCisjIE5vdyBpbnRlcmNlcHQgaXQgd2hlbiBpdCBpcyBjYXVnaHQuCisKK3NlbmRfZ2RiICJjb250aW51ZVxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIkNvbnRpbnVpbmcuKkNhdGNocG9pbnQgXFswLTlcXSogXFwoZXhjZXB0aW9uIGNhdWdodFxcKSwgdGhyb3cgbG9jYXRpb24uKmV4Y2VwdGlvblxcLmNjOjgsIGNhdGNoIGxvY2F0aW9uIC4qZXhjZXB0aW9uXFwuY2M6MjhcclxuLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJjYXVnaHQgYSBjYXRjaCAoc3RhdGljIGV4ZWN1dGFibGUpIgorICAgfQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiZGlkbid0IGNhdGNoIGEgY2F0Y2ggKHN0YXRpYyBleGVjdXRhYmxlKSIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBhZnRlciBjb250aW51ZSAtLSBkaWRuJ3QgY2F0Y2ggYSBjYXRjaD8gKHN0YXRpYyBleGVjdXRhYmxlKSIgfQorfQorCitzZW5kX2dkYiAiYmFja3RyYWNlXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiIzBcWyBcXSpfX2RfZWhfYnJlYWsuKlxyXG4jMVxbIFxdKiRoZXggaW4gX19kX2VoX25vdGlmeV9jYWxsYmFjayBcXChlaF90eXBlPV9fRUhfTk9USUZZX0NBVENILipcclxuLipcclxuIzNcWyBcXSokaGV4IGluIF9fdGhyb3dfXy4qXHJcbiM0XFsgXF0qJGhleCBpbiBmb28gXFwoaT0yMFxcKSBhdCAuKmV4Y2VwdGlvbi5jYzo4XHJcbiM1XFsgXF0qJGhleCBpbiBtYWluLiogYXQgLipleGNlcHRpb24uY2M6MjZcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAiYmFja3RyYWNlIGFmdGVyIGNhdGNoIChzdGF0aWMgZXhlY3V0YWJsZSkiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJiYWNrdHJhY2UgYWZ0ZXIgY2F0Y2ggKHN0YXRpYyBleGVjdXRhYmxlKSIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBiYWNrdHJhY2UgYWZ0ZXIgY2F0Y2ggKHN0YXRpYyBleGVjdXRhYmxlKSIgfQorfQorICAgICAgCitzZW5kX2dkYiAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJDb250aW51aW5nXFwuXHJcbkdvdC4qXHJcbkNhdGNocG9pbnQgXFswLTlcXSogXFwoZXhjZXB0aW9uIHRocm93blxcKSwgdGhyb3cgbG9jYXRpb24uKmV4Y2VwdGlvblxcLmNjOjgsIGNhdGNoIGxvY2F0aW9uIC4qZXhjZXB0aW9uXFwuY2M6MzZcclxuLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJjYXVnaHQgYSB0aHJvdyAoMikgKHN0YXRpYyBleGVjdXRhYmxlKSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImRpZG4ndCBjYXRjaCBhIHRocm93ICgyKSAoc3RhdGljIGV4ZWN1dGFibGUpIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGFmdGVyIGNvbnRpbnVlIC0tIGRpZG4ndCBjYXRjaCBhIHRocm93ICgyKT8gKHN0YXRpYyBleGVjdXRhYmxlKSIgfQorfQorCitzZW5kX2dkYiAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJDb250aW51aW5nLipDYXRjaHBvaW50IFxbMC05XF0qIFxcKGV4Y2VwdGlvbiBjYXVnaHRcXCksIHRocm93IGxvY2F0aW9uLipleGNlcHRpb25cXC5jYzo4LCBjYXRjaCBsb2NhdGlvbiAuKmV4Y2VwdGlvblxcLmNjOjM2XHJcbi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAiY2F1Z2h0IGEgY2F0Y2ggKDIpIChzdGF0aWMgZXhlY3V0YWJsZSkiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJkaWRuJ3QgY2F0Y2ggYSBjYXRjaCAoMikgKHN0YXRpYyBleGVjdXRhYmxlKSIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBhZnRlciBjb250aW51ZSAtLSBkaWRuJ3QgY2F0Y2ggYSBjYXRjaCAoMik/IChzdGF0aWMgZXhlY3V0YWJsZSkiIH0KK30KKworIyBOb3cgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHJldGhyb3duLgorCitzZW5kX2dkYiAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJDb250aW51aW5nXFwuXHJcbkdvdC4qXHJcbkNhdGNocG9pbnQgXFswLTlcXSogXFwoZXhjZXB0aW9uIHRocm93blxcKSwgdGhyb3cgbG9jYXRpb24uKmV4Y2VwdGlvblxcLmNjOjM4LCBjYXRjaCBsb2NhdGlvbiAuKmV4Y2VwdGlvblxcLmNjOjQxXHJcbi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAiY2F1Z2h0IGEgcmV0aHJvdyAoc3RhdGljIGV4ZWN1dGFibGUpIgorICAgfQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiZGlkbid0IGNhdGNoIGEgcmV0aHJvdyAoc3RhdGljIGV4ZWN1dGFibGUpIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGFmdGVyIGNvbnRpbnVlIC0tIGRpZG4ndCBjYXRjaCBhIHJldGhyb3c/IChzdGF0aWMgZXhlY3V0YWJsZSkiIH0KK30KKworc2VuZF9nZGIgImNvbnRpbnVlXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiQ29udGludWluZy4qQ2F0Y2hwb2ludCBcWzAtOVxdKiBcXChleGNlcHRpb24gY2F1Z2h0XFwpLCB0aHJvdyBsb2NhdGlvbi4qZXhjZXB0aW9uXFwuY2M6MzgsIGNhdGNoIGxvY2F0aW9uIC4qZXhjZXB0aW9uXFwuY2M6NDFcclxuLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJjYXVnaHQgYSBjYXRjaCAoMykgKHN0YXRpYyBleGVjdXRhYmxlKSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImRpZG4ndCBjYXRjaCBhIGNhdGNoICgzKSAoc3RhdGljIGV4ZWN1dGFibGUpIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGFmdGVyIGNvbnRpbnVlIC0tIGRpZG4ndCBjYXRjaCBhIGNhdGNoICgzKT8gKHN0YXRpYyBleGVjdXRhYmxlKSIgfQorfQorCitzZW5kX2dkYiAiYmFja3RyYWNlXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiIzBcWyBcXSpfX2RfZWhfYnJlYWsuKlxyXG4jMVxbIFxdKiRoZXggaW4gX19kX2VoX25vdGlmeV9jYWxsYmFjayBcXChlaF90eXBlPV9fRUhfTk9USUZZX0NBVENILipcclxuLipcclxuIzNcWyBcXSokaGV4IGluIF9fcmV0aHJvdy4qXHJcbiM0XFsgXF0qJGhleCBpbiBtYWluLiogYXQgLipleGNlcHRpb25cXC5jYzozOFxyXG4jNVxbIFxdKiRoZXggaW4gZm9vIFxcKGk9MjBcXCkgYXQgLipleGNlcHRpb24uY2M6OFxyXG4jNlxbIFxdKiRoZXggaW4gbWFpbi4qIGF0IC4qZXhjZXB0aW9uLmNjOjM0XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgImJhY2t0cmFjZSBhZnRlciBjYXRjaCAoMykgKHN0YXRpYyBleGVjdXRhYmxlKSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImJhY2t0cmFjZSBhZnRlciBjYXRjaCAoMykgKHN0YXRpYyBleGVjdXRhYmxlKSIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBiYWNrdHJhY2UgYWZ0ZXIgY2F0Y2ggKDMpIChzdGF0aWMgZXhlY3V0YWJsZSkiIH0KK30KKworIyBOb3cgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biwgYnV0IG5vdCBjYXRjaC1hYmxlIGFueXdoZXJlLgorCitzZW5kX2dkYiAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJDb250aW51aW5nXFwuXHJcbkdvdC4qXHJcbkNhdGNocG9pbnQgXFswLTlcXSogXFwoZXhjZXB0aW9uIHRocm93blxcKSwgdGhyb3cgbG9jYXRpb24uKmV4Y2VwdGlvblxcLmNjOjgsIGNhdGNoIGxvY2F0aW9uIHVua25vd25cclxuLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJjYXVnaHQgYW4gdW5jYXRjaGFibGUgdGhyb3cgKHN0YXRpYyBleGVjdXRhYmxlKSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImRpZG4ndCBjYXRjaCBhbiB1bmNhdGNoYWJsZSB0aHJvdyAoc3RhdGljIGV4ZWN1dGFibGUpIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGFmdGVyIGNvbnRpbnVlIC0tIGRpZG4ndCBjYXRjaCBhbiB1bmNhdGNoYWJsZSB0aHJvdz8gKHN0YXRpYyBleGVjdXRhYmxlKSIgfQorfQorCisjIFBhcnQgSUkgOiBTaGFyZWQtYm91bmQgZXhlY3V0YWJsZXMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJleGNlcHRpb24iCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIGMrK31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYQordXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgcGVycm9yICJjb3VsZG4ndCBydW4gdG8gYnJlYWtwb2ludCIKKyAgICBjb250aW51ZQorfQorCisjIFNldCBhIGNhdGNoIGNhdGNocG9pbnQKKworc2VuZF9nZGIgImNhdGNoIGNhdGNoXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiQ2F0Y2hwb2ludCBcWzAtOVxdKiBcXChjYXRjaFxcKVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgcGFzcyAiY2F0Y2ggY2F0Y2ggKGR5bmFtaWMgZXhlY3V0YWJsZSkiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjYXRjaCBjYXRjaCAgKGR5bmFtaWMgZXhlY3V0YWJsZSkiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgY2F0Y2ggY2F0Y2ggIChkeW5hbWljIGV4ZWN1dGFibGUpIiB9Cit9CisKKyMgU2V0IGEgdGhyb3cgY2F0Y2hwb2ludAorCitzZW5kX2dkYiAiY2F0Y2ggdGhyb3dcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJDYXRjaHBvaW50IFxbMC05XF0qIFxcKHRocm93XFwpXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICBwYXNzICJjYXRjaCB0aHJvdyAoZHluYW1pYyBleGVjdXRhYmxlKSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNhdGNoIHRocm93IChkeW5hbWljIGV4ZWN1dGFibGUpIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGNhdGNoIHRocm93IChkeW5hbWljIGV4ZWN1dGFibGUpIiB9Cit9CisKKyMgVGhlIGNhdGNocG9pbnRzIHNob3VsZCBiZSBsaXN0ZWQgaW4gdGhlIGxpc3Qgb2YgYnJlYWtwb2ludHMuCisKK3NlbmRfZ2RiICJpbmZvIGJyZWFrXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiLipcWzAtOVxdKlxbIFxdKmNhdGNoIGNhdGNoXFsgXF0qa2VlcCB5XFsgXF0qZXhjZXB0aW9uIGNhdGNoXFsgXF0qXHJcblxbMC05XF0qXFsgXF0qY2F0Y2ggdGhyb3dcWyBcXSprZWVwIHlcWyBcXSpleGNlcHRpb24gdGhyb3dcWyBcXSpcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgIHBhc3MgImluZm8gYnJlYWsgd2l0aCBjYXRjaHBvaW50cyAoZHluYW1pYyBleGVjdXRhYmxlKSIKKyAgIH0gICAgCisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJpbmZvIGJyZWFrIChkeW5hbWljIGV4ZWN1dGFibGUpIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGluZm8gYnJlYWsgKGR5bmFtaWMgZXhlY3V0YWJsZSkiIH0KK30KKworIyBJbmZvIGNhdGNoIGN1cnJlbnRseSBkb2VzIG5vdCB3b3JrIHdpdGggSFAgYUNDLiBObyBlYXN5IHdheSB0bworIyBsaXN0IHRoZSBhY3RpdmUgaGFuZGxlcnMgb24gdGhlIHN0YWNrLgorCitzZW5kX2dkYiAiaW5mbyBjYXRjaFxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIkluZm8gY2F0Y2ggbm90IHN1cHBvcnRlZCB3aXRoIHRoaXMgdGFyZ2V0L2NvbXBpbGVyIGNvbWJpbmF0aW9uLlxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgcGFzcyAiaW5mbyBjYXRjaCAoZHluYW1pYyBleGVjdXRhYmxlKSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImluZm8gY2F0Y2ggKGR5bmFtaWMgZXhlY3V0YWJsZSkiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgaW5mbyBjYXRjaCAoZHluYW1pYyBleGVjdXRhYmxlKSIgfQorfQorCisjIEdldCB0aGUgZmlyc3QgZXhjZXB0aW9uIHRocm93bgorICAgICAgIAorc2VuZF9nZGIgImNvbnRpbnVlXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiQ29udGludWluZy4qQ2F0Y2hwb2ludCBcWzAtOVxdKiBcXChleGNlcHRpb24gdGhyb3duXFwpLCB0aHJvdyBsb2NhdGlvbi4qZXhjZXB0aW9uXFwuY2M6OCwgY2F0Y2ggbG9jYXRpb24gLipleGNlcHRpb25cXC5jYzoyOFxyXG4uKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgImNhdWdodCBhIHRocm93IChkeW5hbWljIGV4ZWN1dGFibGUpIgorICAgfQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiZGlkbid0IGNhdGNoIGEgdGhyb3cgKGR5bmFtaWMgZXhlY3V0YWJsZSkiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgYWZ0ZXIgY29udGludWUgLS0gZGlkbid0IGNhdGNoIGEgdGhyb3c/IChkeW5hbWljIGV4ZWN1dGFibGUpIiB9Cit9CisKK3NlbmRfZ2RiICJiYWNrdHJhY2VcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICIjMFxbIFxdKl9fZF9laF9icmVhay4qXHJcbiMxXFsgXF0qJGhleCBpbiBfX2RfZWhfbm90aWZ5X2NhbGxiYWNrIFxcKGVoX3R5cGU9X19FSF9OT1RJRllfVEhST1cuKlxyXG4jMlxbIFxdKiRoZXggaW4gX19laF9ub3RpZnlfdGhyb3cuKlxyXG4jM1xbIFxdKiRoZXggaW4gZm9vIFxcKGk9MjBcXCkgYXQgLipleGNlcHRpb25cXC5jYzo4XHJcbiM0XFsgXF0qJGhleCBpbiBtYWluLiogYXQgLipleGNlcHRpb25cXC5jYzoyNlxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJiYWNrdHJhY2UgYWZ0ZXIgdGhyb3cgKGR5bmFtaWMgZXhlY3V0YWJsZSkiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJiYWNrdHJhY2UgYWZ0ZXIgdGhyb3cgKGR5bmFtaWMgZXhlY3V0YWJsZSkiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgYmFja3RyYWNlIGFmdGVyIHRocm93IChkeW5hbWljIGV4ZWN1dGFibGUpIiB9Cit9CisKKyMgTm93IGludGVyY2VwdCBpdCB3aGVuIGl0IGlzIGNhdWdodC4KKworc2VuZF9nZGIgImNvbnRpbnVlXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiQ29udGludWluZy4qQ2F0Y2hwb2ludCBcWzAtOVxdKiBcXChleGNlcHRpb24gY2F1Z2h0XFwpLCB0aHJvdyBsb2NhdGlvbi4qZXhjZXB0aW9uXFwuY2M6OCwgY2F0Y2ggbG9jYXRpb24gLipleGNlcHRpb25cXC5jYzoyOFxyXG4uKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgImNhdWdodCBhIGNhdGNoIChkeW5hbWljIGV4ZWN1dGFibGUpIgorICAgfQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiZGlkbid0IGNhdGNoIGEgY2F0Y2ggKGR5bmFtaWMgZXhlY3V0YWJsZSkiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgYWZ0ZXIgY29udGludWUgLS0gZGlkbid0IGNhdGNoIGEgY2F0Y2g/IChkeW5hbWljIGV4ZWN1dGFibGUpIiB9Cit9CisKK3NlbmRfZ2RiICJiYWNrdHJhY2VcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICIjMFxbIFxdKl9fZF9laF9icmVhay4qXHJcbiMxXFsgXF0qJGhleCBpbiBfX2RfZWhfbm90aWZ5X2NhbGxiYWNrIFxcKGVoX3R5cGU9X19FSF9OT1RJRllfQ0FUQ0guKlxyXG4uKlxyXG4jM1xbIFxdKiRoZXggaW4gX190aHJvd19fLipcclxuIzRcWyBcXSokaGV4IGluIGZvbyBcXChpPTIwXFwpIGF0IC4qZXhjZXB0aW9uLmNjOjhcclxuIzVcWyBcXSokaGV4IGluIG1haW4uKiBhdCAuKmV4Y2VwdGlvbi5jYzoyNlxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJiYWNrdHJhY2UgYWZ0ZXIgY2F0Y2ggKGR5bmFtaWMgZXhlY3V0YWJsZSkiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJiYWNrdHJhY2UgYWZ0ZXIgY2F0Y2ggKGR5bmFtaWMgZXhlY3V0YWJsZSkiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgYmFja3RyYWNlIGFmdGVyIGNhdGNoIChkeW5hbWljIGV4ZWN1dGFibGUpIiB9Cit9CisgICAgICAKK3NlbmRfZ2RiICJjb250aW51ZVxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIkNvbnRpbnVpbmdcXC5cclxuR290LipcclxuQ2F0Y2hwb2ludCBcWzAtOVxdKiBcXChleGNlcHRpb24gdGhyb3duXFwpLCB0aHJvdyBsb2NhdGlvbi4qZXhjZXB0aW9uXFwuY2M6OCwgY2F0Y2ggbG9jYXRpb24gLipleGNlcHRpb25cXC5jYzozNlxyXG4uKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgImNhdWdodCBhIHRocm93ICgyKSAoZHluYW1pYyBleGVjdXRhYmxlKSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImRpZG4ndCBjYXRjaCBhIHRocm93ICgyKSAoZHluYW1pYyBleGVjdXRhYmxlKSIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBhZnRlciBjb250aW51ZSAtLSBkaWRuJ3QgY2F0Y2ggYSB0aHJvdyAoMik/IChkeW5hbWljIGV4ZWN1dGFibGUpIiB9Cit9CisKK3NlbmRfZ2RiICJjb250aW51ZVxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIkNvbnRpbnVpbmcuKkNhdGNocG9pbnQgXFswLTlcXSogXFwoZXhjZXB0aW9uIGNhdWdodFxcKSwgdGhyb3cgbG9jYXRpb24uKmV4Y2VwdGlvblxcLmNjOjgsIGNhdGNoIGxvY2F0aW9uIC4qZXhjZXB0aW9uXFwuY2M6MzZcclxuLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJjYXVnaHQgYSBjYXRjaCAoMikgKGR5bmFtaWMgZXhlY3V0YWJsZSkiCisgICB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJkaWRuJ3QgY2F0Y2ggYSBjYXRjaCAoMikgKGR5bmFtaWMgZXhlY3V0YWJsZSkiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgYWZ0ZXIgY29udGludWUgLS0gZGlkbid0IGNhdGNoIGEgY2F0Y2ggKDIpPyAoZHluYW1pYyBleGVjdXRhYmxlKSIgfQorfQorCisjIE5vdyB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgcmV0aHJvd24uCisKK3NlbmRfZ2RiICJjb250aW51ZVxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIkNvbnRpbnVpbmdcXC5cclxuR290LipcclxuQ2F0Y2hwb2ludCBcWzAtOVxdKiBcXChleGNlcHRpb24gdGhyb3duXFwpLCB0aHJvdyBsb2NhdGlvbi4qZXhjZXB0aW9uXFwuY2M6MzgsIGNhdGNoIGxvY2F0aW9uIC4qZXhjZXB0aW9uXFwuY2M6NDFcclxuLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICBwYXNzICJjYXVnaHQgYSByZXRocm93IChkeW5hbWljIGV4ZWN1dGFibGUpIgorICAgfQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiZGlkbid0IGNhdGNoIGEgcmV0aHJvdyAoZHluYW1pYyBleGVjdXRhYmxlKSIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBhZnRlciBjb250aW51ZSAtLSBkaWRuJ3QgY2F0Y2ggYSByZXRocm93PyAoZHluYW1pYyBleGVjdXRhYmxlKSIgfQorfQorCitzZW5kX2dkYiAiY29udGludWVcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJDb250aW51aW5nLipDYXRjaHBvaW50IFxbMC05XF0qIFxcKGV4Y2VwdGlvbiBjYXVnaHRcXCksIHRocm93IGxvY2F0aW9uLipleGNlcHRpb25cXC5jYzozOCwgY2F0Y2ggbG9jYXRpb24gLipleGNlcHRpb25cXC5jYzo0MVxyXG4uKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgImNhdWdodCBhIGNhdGNoICgzKSAoZHluYW1pYyBleGVjdXRhYmxlKSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImRpZG4ndCBjYXRjaCBhIGNhdGNoICgzKSAoZHluYW1pYyBleGVjdXRhYmxlKSIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBhZnRlciBjb250aW51ZSAtLSBkaWRuJ3QgY2F0Y2ggYSBjYXRjaCAoMyk/IChkeW5hbWljIGV4ZWN1dGFibGUpIiB9Cit9CisKK3NlbmRfZ2RiICJiYWNrdHJhY2VcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICIjMFxbIFxdKl9fZF9laF9icmVhay4qXHJcbiMxXFsgXF0qJGhleCBpbiBfX2RfZWhfbm90aWZ5X2NhbGxiYWNrIFxcKGVoX3R5cGU9X19FSF9OT1RJRllfQ0FUQ0guKlxyXG4uKlxyXG4jM1xbIFxdKiRoZXggaW4gX19yZXRocm93LipcclxuIzRcWyBcXSokaGV4IGluIG1haW4uKiBhdCAuKmV4Y2VwdGlvblxcLmNjOjM4XHJcbiM1XFsgXF0qJGhleCBpbiBmb28gXFwoaT0yMFxcKSBhdCAuKmV4Y2VwdGlvbi5jYzo4XHJcbiM2XFsgXF0qJGhleCBpbiBtYWluLiogYXQgLipleGNlcHRpb24uY2M6MzRcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAiYmFja3RyYWNlIGFmdGVyIGNhdGNoICgzKSAoZHluYW1pYyBleGVjdXRhYmxlKSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImJhY2t0cmFjZSBhZnRlciBjYXRjaCAoMykgKGR5bmFtaWMgZXhlY3V0YWJsZSkiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgYmFja3RyYWNlIGFmdGVyIGNhdGNoICgzKSAoZHluYW1pYyBleGVjdXRhYmxlKSIgfQorfQorCisjIE5vdyB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLCBidXQgbm90IGNhdGNoLWFibGUgYW55d2hlcmUuCisKK3NlbmRfZ2RiICJjb250aW51ZVxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIkNvbnRpbnVpbmdcXC5cclxuR290LipcclxuQ2F0Y2hwb2ludCBcWzAtOVxdKiBcXChleGNlcHRpb24gdGhyb3duXFwpLCB0aHJvdyBsb2NhdGlvbi4qZXhjZXB0aW9uXFwuY2M6OCwgY2F0Y2ggbG9jYXRpb24gdW5rbm93blxyXG4uKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgImNhdWdodCBhbiB1bmNhdGNoYWJsZSB0aHJvdyAoZHluYW1pYyBleGVjdXRhYmxlKSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImRpZG4ndCBjYXRjaCBhbiB1bmNhdGNoYWJsZSB0aHJvdyAoZHluYW1pYyBleGVjdXRhYmxlKSIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBhZnRlciBjb250aW51ZSAtLSBkaWRuJ3QgY2F0Y2ggYW4gdW5jYXRjaGFibGUgdGhyb3c/IChkeW5hbWljIGV4ZWN1dGFibGUpIiB9Cit9CisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2V4ZWNkLXByb2dyYW0uYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2V4ZWNkLXByb2dyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzIwOTkxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvZXhlY2QtcHJvZ3JhbS5jCkBAIC0wLDAgKzEsMjggQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiBUaGVyZSBpcyBhIGdsb2JhbF9pIGluIGZvbGxvd19leGVjLCB3aGljaCBleGVjJ3MgdXMuICBXZQorICAgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHNlZSB0aGF0IG90aGVyIGRlZmluaXRpb24gb2YgZ2xvYmFsX2kKKyAgIGFmdGVyIHdlIGFyZSBleGVjJ2QuCisgICAqLworaW50ICBnbG9iYWxfaSA9IDA7CisKK21haW4gKGFyZ2MsIGFyZ3YpCisgIGludCAgYXJnYzsKKyAgY2hhciAqICBhcmd2W107Cit7CisgIC8qIFRoZXJlIGlzIGEgbG9jYWxfaiBpbiBmb2xsb3dfZXhlYywgd2hpY2ggZXhlYydzIHVzLiAgV2UKKyAgICAgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHNlZSB0aGF0IG90aGVyIGRlZmluaXRpb24gb2YgbG9jYWxfagorICAgICBhZnRlciB3ZSBhcmUgZXhlYydkLgorICAgICAqLworICBpbnQgIGxvY2FsX2ogPSBhcmdjOworICBjaGFyICogIHM7CisKKyAgcHJpbnRmICgiSGVsbG8gZnJvbSBleGVjZF9wcm9ncmFtLi4uXG4iKTsKKyAgaWYgKGFyZ2MgIT0gMikKKyAgICB7CisgICAgICBwcmludGYgKCJleHBlY3RlZCBvbmUgc3RyaW5nIGFyZ3VtZW50XG4iKTsKKyAgICAgIGV4aXQgKC0xKTsKKyAgICB9CisgIHMgPSBhcmd2WzFdOworICBwcmludGYgKCJhcmd1bWVudCByZWNlaXZlZDogJXNcbiIsIHMpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvZm9sbC1leGVjLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9mb2xsLWV4ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTFmYTUyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvZm9sbC1leGVjLmMKQEAgLTAsMCArMSwzNSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCAgZ2xvYmFsX2kgPSAxMDA7CisKK21haW4gKCkKK3sKKyAgaW50ICBsb2NhbF9qID0gZ2xvYmFsX2krMTsKKyAgaW50ICBsb2NhbF9rID0gbG9jYWxfaisxOworCisgIHByaW50ZiAoImZvbGxvdy1leGVjIGlzIGFib3V0IHRvIGV4ZWNscChleGVjZC1wcm9ncmFtKS4uLlxuIik7CisKKyAgZXhlY2xwICgiZ2RiLmhwL2V4ZWNkLXByb2dyYW0iLAorICAgICAgICAgICJnZGIuaHAvZXhlY2QtcHJvZ3JhbSIsCisgICAgICAgICAgImV4ZWNscCBhcmcxIGZyb20gZm9sbG93LWV4ZWMiLAorICAgICAgICAgIChjaGFyICopMCk7CisKKyAgcHJpbnRmICgiZm9sbG93LWV4ZWMgaXMgYWJvdXQgdG8gZXhlY2woZXhlY2QtcHJvZ3JhbSkuLi5cbiIpOworCisgIGV4ZWNsICgiZ2RiLmhwL2V4ZWNkLXByb2dyYW0iLAorICAgICAgICAgImdkYi5ocC9leGVjZC1wcm9ncmFtIiwKKyAgICAgICAgICJleGVjbCBhcmcxIGZyb20gZm9sbG93LWV4ZWMiLAorICAgICAgICAgImV4ZWNsIGFyZzIgZnJvbSBmb2xsb3ctZXhlYyIsCisgICAgICAgICAoY2hhciAqKTApOworCisgIHsKKyAgICBzdGF0aWMgY2hhciAqIGFyZ3ZbXSA9IHsKKyAgICAgICJnZGIuaHAvZXhlY2QtcHJvZ3JhbSIsCisgICAgICAiZXhlY3YgYXJnMSBmcm9tIGZvbGxvdy1leGVjIiwKKyAgICAgIDB9OworCisgICAgcHJpbnRmICgiZm9sbG93LWV4ZWMgaXMgYWJvdXQgdG8gZXhlY3YoZXhlY2QtcHJvZ3JhbSkuLi5cbiIpOworCisgICAgZXhlY3YgKCJnZGIuaHAvZXhlY2QtcHJvZ3JhbSIsIGFyZ3YpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC9mb2xsLWV4ZWMuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvZm9sbC1leGVjLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2Q2MDg5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvZm9sbC1leGVjLmV4cApAQCAtMCwwICsxLDQxMiBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKKwl9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCisjIGFyZSB3ZSBvbiBhIHRhcmdldCBib2FyZAoraWYgIVtpc25hdGl2ZV0gdGhlbiB7CisgICAgcmV0dXJuCit9CisKK2lmIHshW2lzdGFyZ2V0ICJocHBhKi0qLWhwdXgxMC4zMCJdICYmICFbaXN0YXJnZXQgImhwcGEqLSotaHB1eDExLioiXX0geworICAgICNzZXR1cF94ZmFpbCAiKi0qLioiCisgICAgcmV0dXJuIDAKK30KKworc2V0IHRlc3RmaWxlICJmb2xsLWV4ZWMiCitzZXQgdGVzdGZpbGUyICJleGVjZC1wcm9ncmFtIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IHNyY2ZpbGUyICR7dGVzdGZpbGUyfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CitzZXQgYmluZmlsZTIgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlMn0KKworIyBidWlsZCB0aGUgZmlyc3QgdGVzdCBjYXNlCisjaWYgIHsgW2NvbXBpbGUgIi1nIC1ETk9fUFJPVE9UWVBFUyAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZTJ9IC1vICR7YmluZmlsZTJ9ICJdICE9ICIiIH0geworIyAgcGVycm9yICJDb3VsZG4ndCBjb21waWxlICR7c3JjZmlsZTJ9IgorIyAgcmV0dXJuIC0xCisjfQoraWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZTJ9IiAiJHtiaW5maWxlMn0iIGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisjaWYgIHsgW2NvbXBpbGUgIi1nICR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSAtbyAke2JpbmZpbGV9ICJdICE9ICIiIH0geworIyAgICBleGVjdXRlX2FueXdoZXJlICJybSAtZiAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LnRtcCIKKyAgICAjIGJ1aWx0IHRoZSBzZWNvbmQgdGVzdCBjYXNlIHNpbmNlIHdlIGNhbid0IHVzZSBwcm90b3R5cGVzCisjICAgIHdhcm5pbmcgIlByb3RvdHlwZXMgbm90IHN1cHBvcnRlZCwgcmVidWlsZGluZyB3aXRoIC1ETk9fUFJPVE9UWVBFUyIKKyMgICAgZXhlY3V0ZV9hbnl3aGVyZSAiZWNobyBzZXQgcHJvdG90eXBlcyAwID4gJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS50bXAiCisjICAgIGlmICB7IFtjb21waWxlICItZyAtRE5PX1BST1RPVFlQRVMgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IC1vICR7YmluZmlsZX0gIl0gIT0gIiIgfSB7CisjCXBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3Rlc3RmaWxlfS5jIgorIwlyZXR1cm4gLTEKKyMgICAgfQorI30KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworCisjIFVudGlsICJjYXRjaCBleGVjIiBpcyBpbXBsZW1lbnRlZCBvbiBvdGhlciB0YXJnZXRzLi4uCisjCitpZiAhW2lzdGFyZ2V0ICJocHBhKi1ocC1ocHV4KiJdIHRoZW4geworICAgc2V0dXBfeGZhaWwgIiotKi0qIgorfQorCitwcm9jIHphcF9zZXNzaW9uIHt9IHsKKyAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICBnbG9iYWwgYmluZmlsZQorCisgICBzZW5kX2dkYiAia2lsbFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgIC1yZSAiLipLaWxsIHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkLip5IG9yIG4uICQiIHsKKyAgICAgICBzZW5kX2dkYiAieVxuIgorICAgICAgIHNlbmRfZ2RiICJmaWxlICRiaW5maWxlXG4iCisgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAtcmUgIi4qTG9hZCBuZXcgc3ltYm9sIHRhYmxlIGZyb20uKnkgb3Igbi4gJCIgeworICAgICAgICAgICBzZW5kX2dkYiAieVxuIgorICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAtcmUgIlJlYWRpbmcgc3ltYm9scyBmcm9tLiokZ2RiX3Byb21wdCAkIiB7fQorICAgICAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJsb2FkaW5nIHN5bWJvbHMgKHRpbWVvdXQpIjsgcmV0dXJuIH0KKyAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgLXJlICIuKmdkYl9wcm9tcHQgJCIge30KKyAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJsb2FkaW5nIHN5bWJvbHMgKHRpbWVvdXQpIjsgcmV0dXJuIH0KKyAgICAgICB9CisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorICAgIHRpbWVvdXQgeyBmYWlsICJraWxsaW5nIGluZmVyaW9yICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgfQorfQorCitwcm9jIGRvX2V4ZWNfdGVzdHMge30geworICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgIGdsb2JhbCBiaW5maWxlCisgICBnbG9iYWwgc3JjZmlsZQorICAgZ2xvYmFsIHNyY2ZpbGUyCisgICBnbG9iYWwgdGVzdGZpbGUKKyAgIGdsb2JhbCB0ZXN0ZmlsZTIKKworICAgIyBTdGFydCB0aGUgcHJvZ3JhbSBydW5uaW5nLCBhbmQgc3RvcCBhdCBtYWluLgorICAgIworICAgaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgICAgcGVycm9yICJDb3VsZG4ndCBydW4gJHt0ZXN0ZmlsZX0iCisgICAgIHJldHVybgorICAgfQorCisgICAjIFZlcmlmeSB0aGF0IHdlIGNhbiBzZWUgdmFyaW91cyBnbG9iYWwgYW5kIGxvY2FsIHZhcmlhYmxlcworICAgIyBpbiB0aGlzIHByb2dyYW0sIGFuZCB0aGF0IHRoZXkgaGF2ZSBleHBlY3RlZCB2YWx1ZXMuICBTb21lCisgICAjIG9mIHRoZXNlIHZhcmlhYmxlcyBhcmUgYWxzbyBkZWNsYXJlZCBpbiB0aGUgcHJvZ3JhbSB3ZSdsbAorICAgIyBleGVjIGluIGEgbW9tZW50LgorICAgIworICAgc2VuZF9nZGIgIm5leHQgM1xuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgIC1yZSAiMTIuKmV4ZWNscC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICB7cGFzcyAic3RlcCB0byBleGVjIGNhbGwifQorICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJzdGVwIHRvIGV4ZWMgY2FsbCJ9CisgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIHN0ZXAgdG8gZXhlYyBjYWxsIn0KKyAgIH0KKyAgIHNlbmRfZ2RiICJwcmludCBnbG9iYWxfaVxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgIC1yZSAiLiogPSAxMDAuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge3Bhc3MgInByaW50IGZvbGxvdy1leGVjL2dsb2JhbF9pIn0KKyAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAicHJpbnQgZm9sbG93LWV4ZWMvZ2xvYmFsX2kifQorICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBwcmludCBmb2xsb3ctZXhlYy9nbG9iYWxfaSJ9CisgICB9CisgICBzZW5kX2dkYiAicHJpbnQgbG9jYWxfalxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgIC1yZSAiLiogPSAxMDEuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge3Bhc3MgInByaW50IGZvbGxvdy1leGVjL2xvY2FsX2oifQorICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJwcmludCBmb2xsb3ctZXhlYy9sb2NhbF9qIn0KKyAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgcHJpbnQgZm9sbG93LWV4ZWMvbG9jYWxfaiJ9CisgICB9CisgICBzZW5kX2dkYiAicHJpbnQgbG9jYWxfa1xuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgIC1yZSAiLiogPSAxMDIuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge3Bhc3MgInByaW50IGZvbGxvdy1leGVjL2xvY2FsX2sifQorICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJwcmludCBmb2xsb3ctZXhlYy9sb2NhbF9rIn0KKyAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgcHJpbnQgZm9sbG93LWV4ZWMvbG9jYWxfayJ9CisgICB9CisKKyAgICMgVHJ5IHN0ZXBwaW5nIHRocm91Z2ggYW4gZXhlY2xwIGNhbGwsIHdpdGhvdXQgY2F0Y2hpbmcgaXQuCisgICAjIFdlIHNob3VsZCBzdG9wIGluIGV4ZWNkLXByb2dyYW0sIGF0IGl0cyBmaXJzdCBzdGF0ZW1lbnQuCisgICAjCisgICBzZW5kX2dkYiAibmV4dFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgIC1yZSAiRXhlY3V0aW5nIG5ldyBwcm9ncmFtOiAuKiR7dGVzdGZpbGUyfS4qJHtzcmNmaWxlMn06MTcuKmludCAgbG9jYWxfaiA9IGFyZ2M7LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJzdGVwIHRocm91Z2ggZXhlY2xwIGNhbGwifQorICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJzdGVwIHRocm91Z2ggZXhlY2xwIGNhbGwifQorICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBzdGVwIHRocm91Z2ggZXhlY2xwIGNhbGwifQorICAgfQorCisgICAjIFZlcmlmeSB0aGF0IHdlIGNhbiBzZWUgdGhlIHZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBuZXdseS1leGVjJ2QKKyAgICMgcHJvZ3JhbSwgYW5kIENBTk5PVCBzZWUgdGhvc2UgZGVmaW5lZCBpbiB0aGUgZXhlYydpbmcgcHJvZ3JhbS4KKyAgICMKKyAgIHNlbmRfZ2RiICJuZXh0XG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgLXJlICIyMC4qcHJpbnRmLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJzdGVwIGFmdGVyIGV4ZWNscCBjYWxsIn0KKyAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAic3RlcCBhZnRlciBleGVjbHAgY2FsbCJ9CisgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIHN0ZXAgYWZ0ZXIgZXhlY2xwIGNhbGwifQorICAgfQorICAgc2VuZF9nZGIgInByaW50IGdsb2JhbF9pXG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgLXJlICIuKiA9IDAuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge3Bhc3MgInByaW50IGV4ZWNkLXByb2dyYW0vZ2xvYmFsX2kgKGFmdGVyIGV4ZWNscCkifQorICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJwcmludCBleGVjZC1wcm9ncmFtL2dsb2JhbF9pIChhZnRlciBleGVjbHApIn0KKyAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgcHJpbnQgZXhlY2QtcHJvZ3JhbS9nbG9iYWxfaSAoYWZ0ZXIgZXhlY2xwKSJ9CisgICB9CisgICBzZW5kX2dkYiAicHJpbnQgbG9jYWxfalxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgIC1yZSAiLiogPSAyLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJwcmludCBleGVjZC1wcm9ncmFtL2xvY2FsX2ogKGFmdGVyIGV4ZWNscCkifQorICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJwcmludCBleGVjZC1wcm9ncmFtL2xvY2FsX2ogKGFmdGVyIGV4ZWNscCkifQorICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBwcmludCBleGVjZC1wcm9ncmFtL2xvY2FsX2ogKGFmdGVyIGV4ZWNscCkifQorICAgfQorICAgc2VuZF9nZGIgInByaW50IGxvY2FsX2tcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAtcmUgIk5vIHN5bWJvbCBcImxvY2FsX2tcIiBpbiBjdXJyZW50IGNvbnRleHQuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge3Bhc3MgInByaW50IGZvbGxvdy1leGVjL2xvY2FsX2sgKGFmdGVyIGV4ZWNscCkifQorICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJwcmludCBmb2xsb3ctZXhlYy9sb2NhbF9rIChhZnRlciBleGVjbHApIn0KKyAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgcHJpbnQgZm9sbG93LWV4ZWMvbG9jYWxfayAoYWZ0ZXIgZXhlY2xwKSJ9CisgICB9CisKKyAgICMgRXhwbGljaXRseSBraWxsIHRoaXMgcHJvZ3JhbSwgb3IgYSBzdWJzZXF1ZW50IHJlcnVuIGFjdHVhbGx5IHJ1bnMKKyAgICMgdGhlIGV4ZWMnZCBwcm9ncmFtLCBub3QgdGhlIG9yaWdpbmFsIHByb2dyYW0uLi4KKyAgIHphcF9zZXNzaW9uCisKKyAgICMgU3RhcnQgdGhlIHByb2dyYW0gcnVubmluZywgYW5kIHN0b3AgYXQgbWFpbi4KKyAgICMKKyAgIGlmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgIHBlcnJvciAiQ291bGRuJ3QgcnVuICR7dGVzdGZpbGV9ICgybmQgdHJ5KSIKKyAgICAgcmV0dXJuCisgICB9CisKKyAgICMgVmVyaWZ5IHRoYXQgd2UgY2FuIGNhdGNoIGFuIGV4ZWMgZXZlbnQsIGFuZCB0aGVuIGNvbnRpbnVlCisgICAjIHRvIGZvbGxvdyB0aHJvdWdoIHRoZSBleGVjLiAgKFNpbmNlIHRoZXJlJ3MgYSBicmVha3BvaW50IG9uCisgICAjICJtYWluIiwgaXQnbGwgYWxzbyBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgZXhlYydkIHByb2dyYW0sCisgICAjIGFuZCB3ZSBleHBlY3QgdG8gc3RvcCB0aGVyZS4pCisgICAjCisgICBzZW5kX2dkYiAiY2F0Y2ggZXhlY1xuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgIC1yZSAiQ2F0Y2hwb2ludCAuKihleGVjKS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICB7cGFzcyAic2V0IGNhdGNoIGV4ZWMifQorICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJzZXQgY2F0Y2ggZXhlYyJ9CisgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIHNldCBjYXRjaCBleGVjIn0KKyAgIH0KKworICAgIyBWZXJpZnkgdGhhdCB0aGUgY2F0Y2hwb2ludCBpcyBtZW50aW9uZWQgaW4gYW4gImluZm8gYnJlYWtwb2ludHMiLAorICAgIyBhbmQgZnVydGhlciB0aGF0IHRoZSBjYXRjaHBvaW50IG1lbnRpb25zIG5vIHByb2dyYW0gbmFtZS4KKyAgICMKKyAgIHNlbmRfZ2RiICJpbmZvIGJyZWFrcG9pbnRzXG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgLXJlICIuKmNhdGNoIGV4ZWMuKmtlZXAgeS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiaW5mbyBzaG93cyBjYXRjaHBvaW50IHdpdGhvdXQgZXhlYyBwYXRobmFtZSJ9CisgICAgIC1yZSAiLipjYXRjaCBleGVjLipwcm9ncmFtIFwiXCIuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge2ZhaWwgImluZm8gc2hvd3MgY2F0Y2hwb2ludCB3aXRob3V0IGV4ZWMgcGF0aG5hbWUifQorICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJpbmZvIHNob3dzIGNhdGNocG9pbnQgd2l0aG91dCBleGVjIHBhdGhuYW1lIn0KKyAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgaW5mbyBzaG93cyBjYXRjaHBvaW50IHdpdGhvdXQgZXhlYyBwYXRobmFtZSJ9CisgICB9CisKKyAgIHNlbmRfZ2RiICJjb250aW51ZVxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgIC1yZSAiLipFeGVjdXRpbmcgbmV3IHByb2dyYW06Lioke3Rlc3RmaWxlMn0uKkNhdGNocG9pbnQgLiooZXhlY1wnZCAuKiR7dGVzdGZpbGUyfSkuKmluIC5TVEFSVC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge3Bhc3MgImhpdCBjYXRjaCBleGVjIn0KKyAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAiaGl0IGNhdGNoIGV4ZWMifQorICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBoaXQgY2F0Y2ggZXhlYyJ9CisgICB9CisKKyAgICMgVmVyaWZ5IHRoYXQgdGhlIGNhdGNocG9pbnQgaXMgbWVudGlvbmVkIGluIGFuICJpbmZvIGJyZWFrcG9pbnRzIiwKKyAgICMgYW5kIGZ1cnRoZXIgdGhhdCB0aGUgY2F0Y2hwb2ludCBtYW5hZ2VkIHRvIGNhcHR1cmUgdGhlIGV4ZWMnZAorICAgIyBwcm9ncmFtJ3MgbmFtZS4KKyAgICMKKyAgIHNlbmRfZ2RiICJpbmZvIGJyZWFrcG9pbnRzXG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgLXJlICIuKmNhdGNoIGV4ZWMgLipwcm9ncmFtIFwiLioke3Rlc3RmaWxlMn1cIi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiaW5mbyBzaG93cyBjYXRjaHBvaW50IGV4ZWMgcGF0aG5hbWUifQorICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJpbmZvIHNob3dzIGNhdGNocG9pbnQgZXhlYyBwYXRobmFtZSJ9CisgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGluZm8gc2hvd3MgY2F0Y2hwb2ludCBleGVjIHBhdGhuYW1lIn0KKyAgIH0KKworICAgIyBWZXJpZnkgdGhhdCB3ZSBjYW4gY29udGludWUgZnJvbSB0aGUgY2F0Y2hwb2ludCwgYW5kIGxhbmQgaW4gdGhlCisgICAjIG1haW4gb2YgdGhlIG5ld2x5LWV4ZWMnZCBwcm9ncmFtLgorICAgIworICAgc2VuZF9nZGIgImNvbnRpbnVlXG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgLXJlICIuKiR7c3JjZmlsZTJ9OjE3LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJjb250aW51ZSBhZnRlciBoaXQgY2F0Y2ggZXhlYyJ9CisgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgImNvbnRpbnVlIGFmdGVyIGhpdCBjYXRjaCBleGVjIn0KKyAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgY29udGludWUgYWZ0ZXIgaGl0IGNhdGNoIGV4ZWMifQorICAgfQorCisgICAjIEV4cGxpY2l0bHkga2lsbCB0aGlzIHByb2dyYW0sIG9yIGEgc3Vic2VxdWVudCByZXJ1biBhY3R1YWxseSBydW5zCisgICAjIHRoZSBleGVjJ2QgcHJvZ3JhbSwgbm90IHRoZSBvcmlnaW5hbCBwcm9ncmFtLi4uCisgICB6YXBfc2Vzc2lvbgorCisgICAjIFN0YXJ0IHRoZSBwcm9ncmFtIHJ1bm5pbmcsIGFuZCBzdG9wIGF0IG1haW4uCisgICAjCisgICBpZiAhW3J1bnRvX21haW5dIHRoZW4geworICAgICBwZXJyb3IgIkNvdWxkbid0IHJ1biAke3Rlc3RmaWxlfSAoM3JkIHRyeSkiCisgICAgIHJldHVybgorICAgfQorCisgICAjIFZlcmlmeSB0aGF0IHdlIGNhbiBmb2xsb3cgdGhyb3VnaCBmb2xsb3cgYW4gZXhlY2woKQorICAgIyBjYWxsLiAgKFdlIG11c3QganVtcCBhcm91bmQgZWFybGllciBleGVjKiBjYWxscy4pCisgICAjCisgICBzZW5kX2dkYiAidGJyZWFrIDE5XG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgLXJlICJCcmVha3BvaW50IC4qZmlsZSAuKiR7c3JjZmlsZX0sIGxpbmUgMTkuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge3Bhc3MgInByZXBhcmUgdG8ganVtcCB0byBleGVjbCBjYWxsIn0KKyAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAicHJlcGFyZSB0byBqdW1wIHRvIGV4ZWNsIGNhbGwifQorICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBwcmVwYXJlIHRvIGp1bXAgdG8gZXhlY2wgY2FsbCJ9CisgICB9CisgICBzZW5kX2dkYiAianVtcCAxOVxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgIC1yZSAibWFpbi4qIGF0IC4qJHtzcmNmaWxlfToxOS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICB7cGFzcyAianVtcCB0byBleGVjbCBjYWxsIn0KKyAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAianVtcCB0byBleGVjbCBjYWxsIn0KKyAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkganVtcCB0byBleGVjbCBjYWxsIn0KKyAgIH0KKyAgICMgTm90ZSB0aGF0IHN0ZXBwaW5nIHRocm91Z2ggYW4gZXhlYyBjYWxsIGNhdXNlcyB0aGUgc3RlcC1jb3VudAorICAgIyB0byBiZSByZXNldCB0byB6ZXJvLiAgSS5lLjogeW91IG1heSBzcGVjaWZ5ICJuZXh0IDIiIGF0IHRoZQorICAgIyBjYWxsLCBidXQgeW91J2xsIGFjdHVhbGx5IHN0b3AgYXQgdGhlIGZpcnN0IGJyZWFrcG9pbnQgc2V0IGluCisgICAjIHRoZSBuZXdseS1leGVjJ2QgcHJvZ3JhbSwgbm90IGFmdGVyIHRoZSByZW1haW5pbmcgc3RlcC1jb3VudAorICAgIyByZWFjaGVzIHplcm8uCisgICAjCisgICBzZW5kX2dkYiAibmV4dCAyXG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgLXJlICJFeGVjdXRpbmcgbmV3IHByb2dyYW06IC4qJHt0ZXN0ZmlsZTJ9Lioke3NyY2ZpbGUyfToxNy4qaW50ICBsb2NhbF9qID0gYXJnYzsuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge3Bhc3MgInN0ZXAgdGhyb3VnaCBleGVjbCBjYWxsIn0KKyAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAic3RlcCB0aHJvdWdoIGV4ZWNsIGNhbGwifQorICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBzdGVwIHRocm91Z2ggZXhlY2wgY2FsbCJ9CisgICB9CisgICBzZW5kX2dkYiAibmV4dFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgIC1yZSAiMjAuKnByaW50Zi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICB7cGFzcyAic3RlcCBhZnRlciBleGVjbCBjYWxsIn0KKyAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAic3RlcCBhZnRlciBleGVjbCBjYWxsIn0KKyAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgc3RlcCBhZnRlciBleGVjbCBjYWxsIn0KKyAgIH0KKworICAgIyBWZXJpZnkgdGhhdCB3ZSBjYW4gcHJpbnQgYSBsb2NhbCB2YXJpYWJsZSAod2hpY2ggaGFwcGVucyB0byBiZQorICAgIyBhc3NpZ25lZCB0aGUgdmFsdWUgb2YgbWFpbidzIGFyZ2MpLgorICAgIworICAgc2VuZF9nZGIgInByaW50IGxvY2FsX2pcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAtcmUgIi4qID0gMy4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICB7cGFzcyAicHJpbnQgZXhlY2QtcHJvZ3JhbS9sb2NhbF9qIChhZnRlciBleGVjbCkifQorICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJwcmludCBleGVjZC1wcm9ncmFtL2xvY2FsX2ogKGFmdGVyIGV4ZWNsKSJ9CisgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIHByaW50IGV4ZWNkLXByb2dyYW0vbG9jYWxfaiAoYWZ0ZXIgZXhlY2wpIn0KKyAgIH0KKworICAgIyBFeHBsaWNpdGx5IGtpbGwgdGhpcyBwcm9ncmFtLCBvciBhIHN1YnNlcXVlbnQgcmVydW4gYWN0dWFsbHkgcnVucworICAgIyB0aGUgZXhlYydkIHByb2dyYW0sIG5vdCB0aGUgb3JpZ2luYWwgcHJvZ3JhbS4uLgorICAgemFwX3Nlc3Npb24KKworICAgIyBTdGFydCB0aGUgcHJvZ3JhbSBydW5uaW5nLCBhbmQgc3RvcCBhdCBtYWluLgorICAgIworICAgaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgICAgcGVycm9yICJDb3VsZG4ndCBydW4gJHt0ZXN0ZmlsZX0gKDR0aCB0cnkpIgorICAgICByZXR1cm4KKyAgIH0KKworICAgIyBWZXJpZnkgdGhhdCB3ZSBjYW4gZm9sbG93IHRocm91Z2ggZm9sbG93IGFuIGV4ZWN2KCkKKyAgICMgY2FsbC4gIChXZSBtdXN0IGp1bXAgYXJvdW5kIGVhcmxpZXIgZXhlYyogY2FsbHMuKQorICAgIworICAgc2VuZF9nZGIgInRicmVhayAzM1xuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgIC1yZSAiQnJlYWtwb2ludCAuKmZpbGUgLioke3NyY2ZpbGV9LCBsaW5lIDMzLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJwcmVwYXJlIHRvIGp1bXAgdG8gZXhlY3YgY2FsbCJ9CisgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgInByZXBhcmUgdG8ganVtcCB0byBleGVjdiBjYWxsIn0KKyAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgcHJlcGFyZSB0byBqdW1wIHRvIGV4ZWN2IGNhbGwifQorICAgfQorICAgc2VuZF9nZGIgImp1bXAgMzNcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAtcmUgIm1haW4uKiBhdCAuKiR7c3JjZmlsZX06MzMuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge3Bhc3MgImp1bXAgdG8gZXhlY3YgY2FsbCJ9CisgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgImp1bXAgdG8gZXhlY3YgY2FsbCJ9CisgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGp1bXAgdG8gZXhlY3YgY2FsbCJ9CisgICB9CisgICBzZW5kX2dkYiAibmV4dFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgIC1yZSAiRXhlY3V0aW5nIG5ldyBwcm9ncmFtOiAuKiR7dGVzdGZpbGUyfS4qJHtzcmNmaWxlMn06MTcuKmludCAgbG9jYWxfaiA9IGFyZ2M7LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJzdGVwIHRocm91Z2ggZXhlY3YgY2FsbCJ9CisgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgInN0ZXAgdGhyb3VnaCBleGVjdiBjYWxsIn0KKyAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgc3RlcCB0aHJvdWdoIGV4ZWN2IGNhbGwifQorICAgfQorICAgc2VuZF9nZGIgIm5leHRcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAtcmUgIjIwLipwcmludGYuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge3Bhc3MgInN0ZXAgYWZ0ZXIgZXhlY3YgY2FsbCJ9CisgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgInN0ZXAgYWZ0ZXIgZXhlY3YgY2FsbCJ9CisgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIHN0ZXAgYWZ0ZXIgZXhlY3YgY2FsbCJ9CisgICB9CisKKyAgICMgVmVyaWZ5IHRoYXQgd2UgY2FuIHByaW50IGEgbG9jYWwgdmFyaWFibGUgKHdoaWNoIGhhcHBlbnMgdG8gYmUKKyAgICMgYXNzaWduZWQgdGhlIHZhbHVlIG9mIG1haW4ncyBhcmdjKS4KKyAgICMKKyAgIHNlbmRfZ2RiICJwcmludCBsb2NhbF9qXG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgLXJlICIuKiA9IDIuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge3Bhc3MgInByaW50IGV4ZWNkLXByb2dyYW0vbG9jYWxfaiAoYWZ0ZXIgZXhlY3YpIn0KKyAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAicHJpbnQgZXhlY2QtcHJvZ3JhbS9sb2NhbF9qIChhZnRlciBleGVjdikifQorICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBwcmludCBleGVjZC1wcm9ncmFtL2xvY2FsX2ogKGFmdGVyIGV4ZWN2KSJ9CisgICB9CisKKyAgICMgRXhwbGljaXRseSBraWxsIHRoaXMgcHJvZ3JhbSwgb3IgYSBzdWJzZXF1ZW50IHJlcnVuIGFjdHVhbGx5IHJ1bnMKKyAgICMgdGhlIGV4ZWMnZCBwcm9ncmFtLCBub3QgdGhlIG9yaWdpbmFsIHByb2dyYW0uLi4KKyAgIHphcF9zZXNzaW9uCisKKyAgICMgU3RhcnQgdGhlIHByb2dyYW0gcnVubmluZywgYW5kIHN0b3AgYXQgbWFpbi4KKyAgICMKKyAgIGlmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgIHBlcnJvciAiQ291bGRuJ3QgcnVuICR7dGVzdGZpbGV9ICg0dGggdHJ5KSIKKyAgICAgcmV0dXJuCisgICB9CisKKyAgICMgVmVyaWZ5IHRoYXQgd2UgY2FuIGp1c3QgY29udGludWUgYW5kIHRoZXJlYnkgZm9sbG93IHRocm91Z2ggYW4KKyAgICMgZXhlYyBjYWxsLiAgKFNpbmNlIHRoZSBicmVha3BvaW50IG9uICJtYWluIiBpcyByZXNldCwgd2Ugc2hvdWxkCisgICAjIGp1c3Qgc3RvcCBpbiBtYWluIG9mIHRoZSBuZXdseS1leGVjJ2QgcHJvZ3JhbS4pCisgICAjCisgICBzZW5kX2dkYiAiY29udGludWVcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAtcmUgIkV4ZWN1dGluZyBuZXcgcHJvZ3JhbTogLioke3Rlc3RmaWxlMn0uKiR7c3JjZmlsZTJ9OjE3LippbnQgIGxvY2FsX2ogPSBhcmdjOy4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiY29udGludWUgdGhyb3VnaCBleGVjIn0KKyAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAiY29udGludWUgdGhyb3VnaCBleGVjIn0KKyAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgY29udGludWUgdGhyb3VnaCBleGVjIn0KKyAgIH0KK30KKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisKKyMgVGhpcyBpcyBhIHRlc3Qgb2YgZ2RiJ3MgYWJpbGl0eSB0byBmb2xsb3cgYSBwcm9jZXNzIHRocm91Z2ggYQorIyBVbml4IGV4ZWMoKSBzeXN0ZW0gY2FsbC4KKyMKK2RvX2V4ZWNfdGVzdHMKKworcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2ZvbGwtZm9yay5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvZm9sbC1mb3JrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmOTJhZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2ZvbGwtZm9yay5jCkBAIC0wLDAgKzEsMjUgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorCit2b2lkIGNhbGxlZSAoaSkKKyAgaW50ICBpOworeworICBwcmludGYoImNhbGxlZTogJWRcbiIsIGkpOworfQorCittYWluICgpCit7CisgIGludCAgcGlkOworICBpbnQgIHYgPSA1OworCisgIHBpZCA9IGZvcmsgKCk7CisgIGlmIChwaWQgPT0gMCkKKyAgICB7CisgICAgICB2Kys7CisgICAgICAvKiBwcmludGYgKCJJJ20gdGhlIGNoaWxkIVxuIik7ICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdi0tOworICAgICAgLyogcHJpbnRmICgiSSdtIHRoZSBwcm91ZCBwYXJlbnQgb2YgY2hpbGQgIyVkIVxuIiwgcGlkKTsgKi8KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC9mb2xsLWZvcmsuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvZm9sbC1mb3JrLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjMxNzY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvZm9sbC1mb3JrLmV4cApAQCAtMCwwICsxLDM4NSBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKKwl9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCisjIGFyZSB3ZSBvbiBhIHRhcmdldCBib2FyZAoraWYgIVtpc25hdGl2ZV0gdGhlbiB7CisgICAgcmV0dXJuCit9CisKK2lmIHshW2lzdGFyZ2V0ICJocHBhKi0qLWhwdXgxMC4zMCJdICYmICFbaXN0YXJnZXQgImhwcGEqLSotaHB1eDExLioiXX0geworICAgICNzZXR1cF94ZmFpbCAiKi0qLioiCisgICAgcmV0dXJuIDAKK30KKworc2V0IHRlc3RmaWxlICJmb2xsLWZvcmsiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKKyMgYnVpbGQgdGhlIGZpcnN0IHRlc3QgY2FzZQorI2lmICB7IFtjb21waWxlICItZyAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0gLW8gJHtiaW5maWxlfSAiXSAhPSAiIiB9IHsKKyMgICAgZXhlY3V0ZV9hbnl3aGVyZSAicm0gLWYgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS50bXAiCisgICAgIyBidWlsdCB0aGUgc2Vjb25kIHRlc3QgY2FzZSBzaW5jZSB3ZSBjYW4ndCB1c2UgcHJvdG90eXBlcworIyAgICB3YXJuaW5nICJQcm90b3R5cGVzIG5vdCBzdXBwb3J0ZWQsIHJlYnVpbGRpbmcgd2l0aCAtRE5PX1BST1RPVFlQRVMiCisjICAgIGV4ZWN1dGVfYW55d2hlcmUgImVjaG8gc2V0IHByb3RvdHlwZXMgMCA+ICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0udG1wIgorIyAgICBpZiAgeyBbY29tcGlsZSAiLWcgLUROT19QUk9UT1RZUEVTICR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSAtbyAke2JpbmZpbGV9ICJdICE9ICIiIH0geworIwlwZXJyb3IgIkNvdWxkbid0IGNvbXBpbGUgJHt0ZXN0ZmlsZX0uYyIKKyMJcmV0dXJuIC0xCisjICAgIH0KKyN9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKKworCisjIFVudGlsICJzZXQgZm9sbG93LWZvcmstbW9kZSIgYW5kICJjYXRjaCBmb3JrIiBhcmUgaW1wbGVtZW50ZWQgb24KKyMgb3RoZXIgdGFyZ2V0cy4uLgorIworaWYgIVtpc3RhcmdldCAiaHBwYSotaHAtaHB1eCoiXSB0aGVuIHsKKyAgIHNldHVwX3hmYWlsICIqLSotKiIKK30KKworcHJvYyBkZWZhdWx0X2ZvcmtfcGFyZW50X2ZvbGxvdyB7fSB7CisgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICBzZW5kX2dkYiAic2hvdyBmb2xsb3dcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICJEZWJ1Z2dlciByZXNwb25zZSB0byBhIHByb2dyYW0gY2FsbCBvZiBmb3JrIG9yIHZmb3JrIGlzIFwicGFyZW50XCIuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiZGVmYXVsdCBzaG93IHBhcmVudCBmb2xsb3csIG5vIGNhdGNocG9pbnRzIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgImRlZmF1bHQgc2hvdyBwYXJlbnQgZm9sbG93LCBubyBjYXRjaHBvaW50cyJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBkZWZhdWx0IHNob3cgcGFyZW50IGZvbGxvdywgbm8gY2F0Y2hwb2ludHMifQorICAgfQorICAgc2VuZF9nZGIgIm5leHQgMlxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIkRldGFjaGluZyBhZnRlciBmb3JrIGZyb20uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJkZWZhdWx0IHBhcmVudCBmb2xsb3csIG5vIGNhdGNocG9pbnRzIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgImRlZmF1bHQgcGFyZW50IGZvbGxvdywgbm8gY2F0Y2hwb2ludHMifQorICAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgZGVmYXVsdCBwYXJlbnQgZm9sbG93LCBubyBjYXRjaHBvaW50cyIgfQorICAgfQorICAgIyBUaGUgY2hpbGQgaGFzIGJlZW4gZGV0YWNoZWQ7IGFsbG93IHRpbWUgZm9yIGFueSBvdXRwdXQgaXQgbWlnaHQKKyAgICMgZ2VuZXJhdGUgdG8gYXJyaXZlLCBzbyB0aGF0IG91dHB1dCBkb2Vzbid0IGdldCBjb25mdXNlZCB3aXRoCisgICAjIGFueSBleHBlY3RlZCBkZWJ1Z2dlciBvdXRwdXQgZnJvbSBhIHN1YnNlcXVlbnQgdGVzdHBvaW50LgorICAgIworICAgZXhlYyBzbGVlcCAxCit9CisKK3Byb2MgZXhwbGljaXRfZm9ya19wYXJlbnRfZm9sbG93IHt9IHsKKyAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgIHNlbmRfZ2RiICJzZXQgZm9sbG93IHBhcmVudFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtwYXNzICJzZXQgZm9sbG93IHBhcmVudCJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBzZXQgZm9sbG93IHBhcmVudCJ9CisgICB9CisgICBzZW5kX2dkYiAic2hvdyBmb2xsb3dcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICJEZWJ1Z2dlciByZXNwb25zZSB0byBhIHByb2dyYW0gY2FsbCBvZiBmb3JrIG9yIHZmb3JrIGlzIFwicGFyZW50XCIuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiZXhwbGljaXQgc2hvdyBwYXJlbnQgZm9sbG93LCBubyBjYXRjaHBvaW50cyJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJleHBsaWNpdCBzaG93IHBhcmVudCBmb2xsb3csIG5vIGNhdGNocG9pbnRzIn0KKyAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGV4cGxpY2l0IHNob3cgcGFyZW50IGZvbGxvdywgbm8gY2F0Y2hwb2ludHMifQorICAgfQorICAgc2VuZF9nZGIgIm5leHQgMlxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIkRldGFjaGluZyBhZnRlciBmb3JrIGZyb20uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJleHBsaWNpdCBwYXJlbnQgZm9sbG93LCBubyBjYXRjaHBvaW50cyJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJleHBsaWNpdCBwYXJlbnQgZm9sbG93LCBubyBjYXRjaHBvaW50cyJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBleHBsaWNpdCBwYXJlbnQgZm9sbG93LCBubyBjYXRjaHBvaW50cyJ9CisgICB9CisgICAjIFRoZSBjaGlsZCBoYXMgYmVlbiBkZXRhY2hlZDsgYWxsb3cgdGltZSBmb3IgYW55IG91dHB1dCBpdCBtaWdodAorICAgIyBnZW5lcmF0ZSB0byBhcnJpdmUsIHNvIHRoYXQgb3V0cHV0IGRvZXNuJ3QgZ2V0IGNvbmZ1c2VkIHdpdGgKKyAgICMgYW55IGV4cGVjdGVkIGRlYnVnZ2VyIG91dHB1dCBmcm9tIGEgc3Vic2VxdWVudCB0ZXN0cG9pbnQuCisgICAjCisgICBleGVjIHNsZWVwIDEKK30KKworcHJvYyBleHBsaWNpdF9mb3JrX2NoaWxkX2ZvbGxvdyB7fSB7CisgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICBzZW5kX2dkYiAic2V0IGZvbGxvdyBjaGlsZFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtwYXNzICJzZXQgZm9sbG93IGNoaWxkIn0KKyAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIHNldCBmb2xsb3cgY2hpbGQifQorICAgfQorICAgc2VuZF9nZGIgInNob3cgZm9sbG93XG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiRGVidWdnZXIgcmVzcG9uc2UgdG8gYSBwcm9ncmFtIGNhbGwgb2YgZm9yayBvciB2Zm9yayBpcyBcImNoaWxkXCIuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiZXhwbGljaXQgc2hvdyBjaGlsZCBmb2xsb3csIG5vIGNhdGNocG9pbnRzIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgImV4cGxpY2l0IHNob3cgY2hpbGQgZm9sbG93LCBubyBjYXRjaHBvaW50cyJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBleHBsaWNpdCBzaG93IGNoaWxkIGZvbGxvdywgbm8gY2F0Y2hwb2ludHMifQorICAgfQorICAgc2VuZF9nZGIgIm5leHQgMlxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIkRldGFjaGluZyBmcm9tIHByb2dyYW06LipBdHRhY2hpbmcgYWZ0ZXIgZm9yayB0by4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAge3Bhc3MgImV4cGxpY2l0IGNoaWxkIGZvbGxvdywgbm8gY2F0Y2hwb2ludHMifQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAiZXhwbGljaXQgY2hpbGQgZm9sbG93LCBubyBjYXRjaHBvaW50cyJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBleHBsaWNpdCBjaGlsZCBmb2xsb3csIG5vIGNhdGNocG9pbnRzIn0KKyAgIH0KKyAgICMgVGhlIGNoaWxkIGhhcyBiZWVuIGRldGFjaGVkOyBhbGxvdyB0aW1lIGZvciBhbnkgb3V0cHV0IGl0IG1pZ2h0CisgICAjIGdlbmVyYXRlIHRvIGFycml2ZSwgc28gdGhhdCBvdXRwdXQgZG9lc24ndCBnZXQgY29uZnVzZWQgd2l0aAorICAgIyBhbnkgZ2RiX2V4cGVjdGVkIGRlYnVnZ2VyIG91dHB1dCBmcm9tIGEgc3Vic2VxdWVudCB0ZXN0cG9pbnQuCisgICAjCisgICBleGVjIHNsZWVwIDEKK30KKworcHJvYyBjYXRjaF9mb3JrX2NoaWxkX2ZvbGxvdyB7fSB7CisgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICBzZW5kX2dkYiAiY2F0Y2ggZm9ya1xuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIkNhdGNocG9pbnQgLiooZm9yaykuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJleHBsaWNpdCBjaGlsZCBmb2xsb3csIHNldCBjYXRjaCBmb3JrIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgImV4cGxpY2l0IGNoaWxkIGZvbGxvdywgc2V0IGNhdGNoIGZvcmsifQorICAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgZXhwbGljaXQgY2hpbGQgZm9sbG93LCBzZXQgY2F0Y2ggZm9yayJ9CisgICB9CisKKyAgICMgVmVyaWZ5IHRoYXQgdGhlIGNhdGNocG9pbnQgaXMgbWVudGlvbmVkIGluIGFuICJpbmZvIGJyZWFrcG9pbnRzIiwKKyAgICMgYW5kIGZ1cnRoZXIgdGhhdCB0aGUgY2F0Y2hwb2ludCBtZW50aW9ucyBubyBwcm9jZXNzIGlkLgorICAgIworICAgc2VuZF9nZGIgImluZm8gYnJlYWtwb2ludHNcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAtcmUgIi4qY2F0Y2ggZm9yay4qa2VlcCB5LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJpbmZvIHNob3dzIGNhdGNocG9pbnQgd2l0aG91dCBwaWQifQorICAgICAtcmUgIi4qY2F0Y2ggZm9yay4qcHJvY2VzcyAuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge2ZhaWwgImluZm8gc2hvd3MgY2F0Y2hwb2ludCB3aXRob3V0IHBpZCJ9CisgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgImluZm8gc2hvd3MgY2F0Y2hwb2ludCB3aXRob3V0IHBpZCJ9CisgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIGluZm8gc2hvd3MgY2F0Y2hwb2ludCB3aXRob3V0IHBpZCJ9CisgICB9CisKKyAgIHNlbmRfZ2RiICJjb250aW51ZVxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIkNhdGNocG9pbnQuKihmb3JrZWQgcHJvY2Vzcy4qKSwuKmluIF9mb3JrX3N5cy4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAge3Bhc3MgImV4cGxpY2l0IGNoaWxkIGZvbGxvdywgY2F0Y2ggZm9yayJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJleHBsaWNpdCBjaGlsZCBmb2xsb3csIGNhdGNoIGZvcmsifQorICAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgZXhwbGljaXQgY2hpbGQgZm9sbG93LCBjYXRjaCBmb3JrIn0KKyAgIH0KKworICAgIyBWZXJpZnkgdGhhdCB0aGUgY2F0Y2hwb2ludCBpcyBtZW50aW9uZWQgaW4gYW4gImluZm8gYnJlYWtwb2ludHMiLAorICAgIyBhbmQgZnVydGhlciB0aGF0IHRoZSBjYXRjaHBvaW50IG1hbmFnZWQgdG8gY2FwdHVyZSBhIHByb2Nlc3MgaWQuCisgICAjCisgICBzZW5kX2dkYiAiaW5mbyBicmVha3BvaW50c1xuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgIC1yZSAiLipjYXRjaCBmb3JrIC4qcHJvY2VzcyBcWzAtOVxdKy4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiaW5mbyBzaG93cyBjYXRjaHBvaW50IHBpZCJ9CisgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgImluZm8gc2hvd3MgY2F0Y2hwb2ludCBwaWQifQorICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBpbmZvIHNob3dzIGNhdGNocG9pbnQgcGlkIn0KKyAgIH0KKworICAgc2VuZF9nZGIgInNldCBmb2xsb3cgY2hpbGRcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7cGFzcyAic2V0IGZvbGxvdyBjaGlsZCJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBzZXQgZm9sbG93IGNoaWxkIn0KKyAgIH0KKyAgIHNlbmRfZ2RiICJ0YnJlYWsgMTVcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICJCcmVha3BvaW50LiosIGxpbmUgMTUuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJzZXQgZm9sbG93IGNoaWxkLCB0YnJlYWsifQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAic2V0IGZvbGxvdyBjaGlsZCwgdGJyZWFrIn0KKyAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIHNldCBmb2xsb3cgY2hpbGQsIHRicmVhayJ9CisgICB9CisgICBzZW5kX2dkYiAiY29udGludWVcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICIuKkRldGFjaGluZyBmcm9tIHByb2dyYW06LipBdHRhY2hpbmcgYWZ0ZXIgZm9yayB0by4qIGF0IC4qMTUuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJzZXQgZm9sbG93IGNoaWxkLCBoaXQgdGJyZWFrIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgInNldCBmb2xsb3cgY2hpbGQsIGhpdCB0YnJlYWsifQorICAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgc2V0IGZvbGxvdyBjaGlsZCwgaGl0IHRicmVhayJ9CisgICB9CisgICAjIFRoZSBjaGlsZCBoYXMgYmVlbiBkZXRhY2hlZDsgYWxsb3cgdGltZSBmb3IgYW55IG91dHB1dCBpdCBtaWdodAorICAgIyBnZW5lcmF0ZSB0byBhcnJpdmUsIHNvIHRoYXQgb3V0cHV0IGRvZXNuJ3QgZ2V0IGNvbmZ1c2VkIHdpdGgKKyAgICMgYW55IGV4cGVjdGVkIGRlYnVnZ2VyIG91dHB1dCBmcm9tIGEgc3Vic2VxdWVudCB0ZXN0cG9pbnQuCisgICAjCisgICBleGVjIHNsZWVwIDEKKyAgIHNlbmRfZ2RiICJkZWxldGUgYnJlYWtwb2ludHNcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICJEZWxldGUgYWxsIGJyZWFrcG9pbnRzLiokIiB7CisgICAgICAgICBzZW5kX2dkYiAieVxuIgorICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICB7cGFzcyAic2V0IGZvbGxvdyBjaGlsZCwgY2xlYW51cCJ9CisgICAgICAgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc2V0IGZvbGxvdyBjaGlsZCwgY2xlYW51cCJ9CisgICAgICAgICB9CisgICAgICB9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJzZXQgZm9sbG93IGNoaWxkLCBjbGVhbnVwIn0KKyAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIHNldCBmb2xsb3cgY2hpbGQsIGNsZWFudXAifQorICAgfQorfQorCitwcm9jIHRjYXRjaF9mb3JrX3BhcmVudF9mb2xsb3cge30geworICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgc2VuZF9nZGIgImNhdGNoIGZvcmtcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICJDYXRjaHBvaW50IC4qKGZvcmspLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAiZXhwbGljaXQgcGFyZW50IGZvbGxvdywgc2V0IHRjYXRjaCBmb3JrIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgImV4cGxpY2l0IHBhcmVudCBmb2xsb3csIHNldCB0Y2F0Y2ggZm9yayJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBleHBsaWNpdCBwYXJlbnQgZm9sbG93LCBzZXQgdGNhdGNoIGZvcmsifQorICAgfQorIyA/P3JlaHJhdWVyOiBJIGRvbid0IHlldCBrbm93IGhvdyB0byBnZXQgdGhlIGlkIG9mIHRoZSB0Y2F0Y2gKKyMgdmlhIHRoaXMgc2NyaXB0LCBzbyB0aGF0IEkgY2FuIGFkZCBhIC1kbyBsaXN0IHRvIGl0LiAgRm9yIG5vdywKKyMgZG8gdGhlIGZvbGxvdyBzdHVmZiBhZnRlciB0aGUgY2F0Y2ggaGFwcGVucy4KKworICAgc2VuZF9nZGIgImNvbnRpbnVlXG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiLippbiBfZm9ya19zeXMuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJleHBsaWNpdCBwYXJlbnQgZm9sbG93LCB0Y2F0Y2ggZm9yayJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJleHBsaWNpdCBwYXJlbnQgZm9sbG93LCB0Y2F0Y2ggZm9yayJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBleHBsaWNpdCBwYXJlbnQgZm9sbG93LCB0Y2F0Y2ggZm9yayJ9CisgICB9CisgICBzZW5kX2dkYiAic2V0IGZvbGxvdyBwYXJlbnRcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7cGFzcyAic2V0IGZvbGxvdyBwYXJlbnQifQorICAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgc2V0IGZvbGxvdyBwYXJlbnQifQorICAgfQorICAgc2VuZF9nZGIgInRicmVhayAxNVxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIkJyZWFrcG9pbnQuKiwgbGluZSAxNS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAge3Bhc3MgInNldCBmb2xsb3cgcGFyZW50LCB0YnJlYWsifQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAic2V0IGZvbGxvdyBwYXJlbnQsIHRicmVhayJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSBzZXQgZm9sbG93IGNoaWxkLCB0YnJlYWsifQorICAgfQorICAgc2VuZF9nZGIgImNvbnRpbnVlXG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiLipEZXRhY2hpbmcgYWZ0ZXIgZm9yayBmcm9tLiogYXQgLioxNS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAge3Bhc3MgInNldCBmb2xsb3cgcGFyZW50LCBoaXQgdGJyZWFrIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgInNldCBmb2xsb3cgcGFyZW50LCBoaXQgdGJyZWFrIn0KKyAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIHNldCBmb2xsb3cgcGFyZW50LCBoaXQgdGJyZWFrIn0KKyAgIH0KKyAgICMgVGhlIGNoaWxkIGhhcyBiZWVuIGRldGFjaGVkOyBhbGxvdyB0aW1lIGZvciBhbnkgb3V0cHV0IGl0IG1pZ2h0CisgICAjIGdlbmVyYXRlIHRvIGFycml2ZSwgc28gdGhhdCBvdXRwdXQgZG9lc24ndCBnZXQgY29uZnVzZWQgd2l0aAorICAgIyBhbnkgZXhwZWN0ZWQgZGVidWdnZXIgb3V0cHV0IGZyb20gYSBzdWJzZXF1ZW50IHRlc3Rwb2ludC4KKyAgICMKKyAgIGV4ZWMgc2xlZXAgMQorICAgc2VuZF9nZGIgImRlbGV0ZSBicmVha3BvaW50c1xuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIkRlbGV0ZSBhbGwgYnJlYWtwb2ludHMuKiQiIHsKKyAgICAgICAgIHNlbmRfZ2RiICJ5XG4iCisgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgIHtwYXNzICJzZXQgZm9sbG93IHBhcmVudCwgY2xlYW51cCJ9CisgICAgICAgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc2V0IGZvbGxvdyBwYXJlbnQsIGNsZWFudXAifQorICAgICAgICAgfQorICAgICAgfQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAic2V0IGZvbGxvdyBwYXJlbnQsIGNsZWFudXAifQorICAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgc2V0IGZvbGxvdyBwYXJlbnQsIGNsZWFudXAifQorICAgfQorfQorCitwcm9jIGRvX2ZvcmtfdGVzdHMge30geworICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIyBWZXJpZnkgdGhhdCBoZWxwIGlzIGF2YWlsYWJsZSBmb3IgInNldCBmb2xsb3ctZm9yay1tb2RlIi4KKyAgICMKKyAgIHNlbmRfZ2RiICJoZWxwIHNldCBmb2xsb3ctZm9yay1tb2RlXG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiU2V0IGRlYnVnZ2VyIHJlc3BvbnNlIHRvIGEgcHJvZ3JhbSBjYWxsIG9mIGZvcmsgb3IgdmZvcmsuLioKK0EgZm9yayBvciB2Zm9yayBjcmVhdGVzIGEgbmV3IHByb2Nlc3MuICBmb2xsb3ctZm9yay1tb2RlIGNhbiBiZTouKgorLipwYXJlbnQgIC0gdGhlIG9yaWdpbmFsIHByb2Nlc3MgaXMgZGVidWdnZWQgYWZ0ZXIgYSBmb3JrLioKKy4qY2hpbGQgICAtIHRoZSBuZXcgcHJvY2VzcyBpcyBkZWJ1Z2dlZCBhZnRlciBhIGZvcmsuKgorLiphc2sgICAgIC0gdGhlIGRlYnVnZ2VyIHdpbGwgYXNrIGZvciBvbmUgb2YgdGhlIGFib3ZlIGNob2ljZXMuKgorRm9yIFwicGFyZW50XCIgb3IgXCJjaGlsZFwiLCB0aGUgdW5mb2xsb3dlZCBwcm9jZXNzIHdpbGwgcnVuIGZyZWUuLioKK0J5IGRlZmF1bHQsIHRoZSBkZWJ1Z2dlciB3aWxsIGZvbGxvdyB0aGUgcGFyZW50IHByb2Nlc3MuLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgImhlbHAgc2V0IGZvbGxvdyIgfQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImhlbHAgc2V0IGZvbGxvdyIgfQorICAgICAgdGltZW91dCAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIGhlbHAgc2V0IGZvbGxvdyIgfQorICAgfQorCisgICAjIFZlcmlmeSB0aGF0IHdlIGNhbiBzZXQgZm9sbG93LWZvcmstbW9kZSwgdXNpbmcgYW4gYWJicmV2aWF0aW9uCisgICAjIGZvciBib3RoIHRoZSBmbGFnIGFuZCBpdHMgdmFsdWUuCisgICAjCisgICBzZW5kX2dkYiAic2V0IGZvbGxvdyBjaFxuIgorICAgc2VuZF9nZGIgInNob3cgZm9sXG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgLXJlICJEZWJ1Z2dlciByZXNwb25zZSB0byBhIHByb2dyYW0gY2FsbCBvZiBmb3JrIG9yIHZmb3JrIGlzIFwiY2hpbGRcIi4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAge3Bhc3MgInNldCBmb2xsb3csIHVzaW5nIGFiYnJldmlhdGlvbnMifQorICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc2V0IGZvbGxvdywgdXNpbmcgYWJicmV2aWF0aW9ucyJ9CisgICB9CisKKyAgICMgVmVyaWZ5IHRoYXQgd2UgY2Fubm90IHNldCBmb2xsb3ctZm9yay1tb2RlIHRvIG5vbnNlbnNlLgorICAgIworICAgc2VuZF9nZGIgInNldCBmb2xsb3cgY2hvcmtcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAtcmUgIlVuZGVmaW5lZCBpdGVtOiBcImNob3JrXCIuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAge3Bhc3MgInNldCBmb2xsb3cgdG8gbm9uc2Vuc2UgaXMgcHJvaGliaXRlZCJ9CisgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgInNldCBmb2xsb3cgdG8gbm9uc2Vuc2UgaXMgcHJvaGliaXRlZCJ9CisgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIHNldCBmb2xsb3cgdG8gbm9uc2Vuc2UgaXMgcHJvaGliaXRlZCJ9CisgICB9CisgICBzZW5kX2dkYiAic2V0IGZvbGxvdyBwYXJlbnRcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtwYXNzICJzZXQgZm9sbG93IHRvIG5vbnNlbnNlIGlzIHByb2hpYml0ZWQgKHJlc2V0IHBhcmVudCkifQorICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgInNldCBmb2xsb3cgdG8gbm9uc2Vuc2UgaXMgcHJvaGliaXRlZCAocmVzZXQgcGFyZW50KSJ9CisgICB9CisKKyAgICMgVGVzdCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIsIHdoaWNoIGlzIHRvIGZvbGxvdyB0aGUgcGFyZW50IG9mIGEKKyAgICMgZm9yaywgYW5kIGRldGFjaCBmcm9tIHRoZSBjaGlsZC4gIERvIHRoaXMgd2l0aG91dCBjYXRjaHBvaW50cy4KKyAgICMKKyAgIGlmIFtydW50b19tYWluXSB0aGVuIHsgZGVmYXVsdF9mb3JrX3BhcmVudF9mb2xsb3cgfQorCisgICAjIFRlc3QgdGhlIGFiaWxpdHkgdG8gZXhwbGljaXRseSBmb2xsb3cgdGhlIHBhcmVudCBvZiBhIGZvcmssIGFuZAorICAgIyBkZXRhY2ggZnJvbSB0aGUgY2hpbGQuICBEbyB0aGlzIHdpdGhvdXQgY2F0Y2hwb2ludHMuCisgICAjCisgICBpZiBbcnVudG9fbWFpbl0gdGhlbiB7IGV4cGxpY2l0X2ZvcmtfcGFyZW50X2ZvbGxvdyB9CisKKyAgICMgVGVzdCB0aGUgYWJpbGl0eSB0byBmb2xsb3cgdGhlIGNoaWxkIG9mIGEgZm9yaywgYW5kIGRldGFjaCBmcm9tCisgICAjIHRoZSBwYXJlbnQuICBEbyB0aGlzIHdpdGhvdXQgY2F0Y2hwb2ludHMuCisgICAjCisgICBpZiBbcnVudG9fbWFpbl0gdGhlbiB7IGV4cGxpY2l0X2ZvcmtfY2hpbGRfZm9sbG93IH0KKworICAgIyBUZXN0IHRoZSBhYmlsaXR5IHRvIGZvbGxvdyBib3RoIGNoaWxkIGFuZCBwYXJlbnQgb2YgYSBmb3JrLiAgRG8KKyAgICMgdGhpcyB3aXRob3V0IGNhdGNocG9pbnRzLgorICAgIyA/P3JlaHJhdWVyOiBOWUkuICBXaWxsIGFkZCB0ZXN0cG9pbnRzIGhlcmUgd2hlbiBpbXBsZW1lbnRlZC4KKyAgICMKKworICAgIyBUZXN0IHRoZSBhYmlsaXR5IHRvIGhhdmUgdGhlIGRlYnVnZ2VyIGFzayB0aGUgdXNlciBhdCBmb3JrLXRpbWUKKyAgICMgd2hldGhlciB0byBmb2xsb3cgdGhlIHBhcmVudCwgY2hpbGQgb3IgYm90aC4gIERvIHRoaXMgd2l0aG91dAorICAgIyBjYXRjaHBvaW50cy4KKyAgICMgPz9yZWhyYXVlcjogTllJLiAgV2lsbCBhZGQgdGVzdHBvaW50cyBoZXJlIHdoZW4gaW1wbGVtZW50ZWQuCisgICAjCisKKyAgICMgVGVzdCB0aGUgYWJpbGl0eSB0byBjYXRjaCBhIGZvcmssIHNwZWNpZnkgdGhhdCB0aGUgY2hpbGQgYmUKKyAgICMgZm9sbG93ZWQsIGFuZCBjb250aW51ZS4gIE1ha2UgdGhlIGNhdGNocG9pbnQgcGVybWFuZW50LgorICAgIworICAgaWYgW3J1bnRvX21haW5dIHRoZW4geyBjYXRjaF9mb3JrX2NoaWxkX2ZvbGxvdyB9CisKKyAgICMgVGVzdCB0aGUgYWJpbGl0eSB0byBjYXRjaCBhIGZvcmssIHNwZWNpZnkgdmlhIGEgLWRvIGNsYXVzZSB0aGF0CisgICAjIHRoZSBwYXJlbnQgYmUgZm9sbG93ZWQsIGFuZCBjb250aW51ZS4gIE1ha2UgdGhlIGNhdGNocG9pbnQgdGVtcG9yYXJ5LgorICAgIworICAgaWYgW3J1bnRvX21haW5dIHRoZW4geyB0Y2F0Y2hfZm9ya19wYXJlbnRfZm9sbG93IH0KK30KKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisKKyMgVGhpcyBpcyBhIHRlc3Qgb2YgZ2RiJ3MgYWJpbGl0eSB0byBmb2xsb3cgdGhlIHBhcmVudCwgY2hpbGQgb3IgYm90aAorIyBwYXJlbnQgYW5kIGNoaWxkIG9mIGEgVW5peCBmb3JrKCkgc3lzdGVtIGNhbGwuCisjCitkb19mb3JrX3Rlc3RzCisKK3JldHVybiAwCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC9mb2xsLXZmb3JrLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9mb2xsLXZmb3JrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlNmNkMwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2ZvbGwtdmZvcmsuYwpAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKworbWFpbiAoKQoreworICBpbnQgIHBpZDsKKworICBwaWQgPSB2Zm9yayAoKTsKKyAgaWYgKHBpZCA9PSAwKSB7CisgICAgcHJpbnRmICgiSSdtIHRoZSBjaGlsZCFcbiIpOworICAgIGV4ZWNscCAoImdkYi5ocC92Zm9ya2VkLXByb2dyYW0iLCAiZ2RiLmhwL3Zmb3JrZWQtcHJvZ3JhbSIsIChjaGFyICopMCk7CisgIH0KKyAgZWxzZSB7CisgICAgcHJpbnRmICgiSSdtIHRoZSBwcm91ZCBwYXJlbnQgb2YgY2hpbGQgIyVkIVxuIiwgcGlkKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvZm9sbC12Zm9yay5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9mb2xsLXZmb3JrLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmM2OTgxCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvZm9sbC12Zm9yay5leHAKQEAgLTAsMCArMSwzODEgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCisJfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworIyBhcmUgd2Ugb24gYSB0YXJnZXQgYm9hcmQKK2lmICFbaXNuYXRpdmVdIHRoZW4geworICAgIHJldHVybgorfQorCitpZiB7IVtpc3RhcmdldCAiaHBwYSotKi1ocHV4MTAuMzAiXSAmJiAhW2lzdGFyZ2V0ICJocHBhKi0qLWhwdXgxMS4qIl19IHsKKyAgICAjc2V0dXBfeGZhaWwgIiotKi4qIgorICAgIHJldHVybiAwCit9CisKK3NldCB0ZXN0ZmlsZSAiZm9sbC12Zm9yayIKK3NldCB0ZXN0ZmlsZTIgInZmb3JrZWQtcHJvZ3JhbSIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBzcmNmaWxlMiAke3Rlc3RmaWxlMn0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorc2V0IGJpbmZpbGUyICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZTJ9CisKKyMgYnVpbGQgdGhlIGZpcnN0IHRlc3QgY2FzZQorI2V4ZWN1dGVfYW55d2hlcmUgImVjaG8gc2V0IHByb3RvdHlwZXMgMSA+ICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0udG1wIgorI2lmICB7IFtjb21waWxlICItZyAtRE5PX1BST1RPVFlQRVMgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGUyfSAtbyAke2JpbmZpbGUyfSAiXSAhPSAiIiB9IHsKKyMgIHBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3NyY2ZpbGUyfSIKKyMgIHJldHVybiAtMQorI30KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworI2lmICB7IFtjb21waWxlICItZyAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0gLW8gJHtiaW5maWxlfSAiXSAhPSAiIiB9IHsKKyMgICAgZXhlY3V0ZV9hbnl3aGVyZSAicm0gLWYgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS50bXAiCisgICAgIyBidWlsdCB0aGUgc2Vjb25kIHRlc3QgY2FzZSBzaW5jZSB3ZSBjYW4ndCB1c2UgcHJvdG90eXBlcworIyAgICB3YXJuaW5nICJQcm90b3R5cGVzIG5vdCBzdXBwb3J0ZWQsIHJlYnVpbGRpbmcgd2l0aCAtRE5PX1BST1RPVFlQRVMiCisjICAgIGV4ZWN1dGVfYW55d2hlcmUgImVjaG8gc2V0IHByb3RvdHlwZXMgMCA+ICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0udG1wIgorIyAgICBpZiAgeyBbY29tcGlsZSAiLWcgLUROT19QUk9UT1RZUEVTICR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSAtbyAke2JpbmZpbGV9ICJdICE9ICIiIH0geworIwlwZXJyb3IgIkNvdWxkbid0IGNvbXBpbGUgJHt0ZXN0ZmlsZX0uYyIKKyMJcmV0dXJuIC0xCisjICAgIH0KKyN9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGUyfSIgIiR7YmluZmlsZTJ9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworCisjIFVudGlsICJzZXQgZm9sbG93LWZvcmstbW9kZSIgYW5kICJjYXRjaCB2Zm9yayIgYXJlIGltcGxlbWVudGVkIG9uCisjIG90aGVyIHRhcmdldHMuLi4KKyMKK2lmICFbaXN0YXJnZXQgImhwcGEqLWhwLWhwdXgqIl0gdGhlbiB7CisgICBzZXR1cF94ZmFpbCAiKi0qLSoiCit9CisKKworIyBBIGZldyBvZiB0aGVzZSB0ZXN0cyByZXF1aXJlIGEgbGl0dGxlIG1vcmUgdGltZSB0aGFuIHRoZSBzdGFuZGFyZAorIyB0aW1lb3V0IGFsbG93cy4KK3NldCBvbGR0aW1lb3V0ICR0aW1lb3V0CitzZXQgdGltZW91dCBbZXhwciAiJHRpbWVvdXQgKyAxMCJdCisKK3Byb2MgdmZvcmtfcGFyZW50X2ZvbGxvd190aHJvdWdoX3N0ZXAge30geworICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgc2VuZF9nZGIgInNldCBmb2xsb3cgcGFyZW50XG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge3Bhc3MgInNldCBmb2xsb3cgcGFyZW50LCB2Zm9yayB0aHJvdWdoIHN0ZXAifQorICAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICJzZXQgZm9sbG93IHBhcmVudCwgdmZvcmsgdGhyb3VnaCBzdGVwIn0KKyAgIH0KKyAgIHNlbmRfZ2RiICJuZXh0XG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiRGV0YWNoaW5nIGFmdGVyIGZvcmsgZnJvbS4qOC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAge3Bhc3MgInZmb3JrIHBhcmVudCBmb2xsb3csIHRocm91Z2ggc3RlcCJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtmYWlsICJ2Zm9yayBwYXJlbnQgZm9sbG93LCB0aHJvdWdoIHN0ZXAifQorICAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgdmZvcmsgcGFyZW50IGZvbGxvdywgdGhyb3VnaCBzdGVwIiB9CisgICB9CisgICAjIFRoZSBjaGlsZCBoYXMgYmVlbiBkZXRhY2hlZDsgYWxsb3cgdGltZSBmb3IgYW55IG91dHB1dCBpdCBtaWdodAorICAgIyBnZW5lcmF0ZSB0byBhcnJpdmUsIHNvIHRoYXQgb3V0cHV0IGRvZXNuJ3QgZ2V0IGNvbmZ1c2VkIHdpdGgKKyAgICMgYW55IGdkYl9leHBlY3RlZCBkZWJ1Z2dlciBvdXRwdXQgZnJvbSBhIHN1YnNlcXVlbnQgdGVzdHBvaW50LgorICAgIworICAgZXhlYyBzbGVlcCAxCit9CisKK3Byb2MgdmZvcmtfcGFyZW50X2ZvbGxvd190b19icCB7fSB7CisgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICBzZW5kX2dkYiAic2V0IGZvbGxvdyBwYXJlbnRcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7cGFzcyAic2V0IGZvbGxvdyBwYXJlbnQsIHZmb3JrIHRvIGJwIn0KKyAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAic2V0IGZvbGxvdyBwYXJlbnQsIHZmb3JrIHRvIGJwIn0KKyAgIH0KKyAgIHNlbmRfZ2RiICJicmVhayAxM1xuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtwYXNzICJicmVhaywgdmZvcmsgdG8gYnAifQorICAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICJicmVhaywgdmZvcmsgdG8gYnAifQorICAgfQorICAgc2VuZF9nZGIgImNvbnRpbnVlXG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiLipEZXRhY2hpbmcgYWZ0ZXIgZm9yayBmcm9tIHByb2Nlc3MuKkJyZWFrcG9pbnQuKjEzLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAidmZvcmsgcGFyZW50IGZvbGxvdywgdG8gYnAifQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAidmZvcmsgcGFyZW50IGZvbGxvdywgdG8gYnAifQorICAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgdmZvcmsgcGFyZW50IGZvbGxvdywgdG8gYnAiIH0KKyAgIH0KKyAgICMgVGhlIGNoaWxkIGhhcyBiZWVuIGRldGFjaGVkOyBhbGxvdyB0aW1lIGZvciBhbnkgb3V0cHV0IGl0IG1pZ2h0CisgICAjIGdlbmVyYXRlIHRvIGFycml2ZSwgc28gdGhhdCBvdXRwdXQgZG9lc24ndCBnZXQgY29uZnVzZWQgd2l0aAorICAgIyBhbnkgZXhwZWN0ZWQgZGVidWdnZXIgb3V0cHV0IGZyb20gYSBzdWJzZXF1ZW50IHRlc3Rwb2ludC4KKyAgICMKKyAgIGV4ZWMgc2xlZXAgMQorfQorCitwcm9jIHZmb3JrX2FuZF9leGVjX2NoaWxkX2ZvbGxvd190b19tYWluX2JwIHt9IHsKKyAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICBnbG9iYWwgYmluZmlsZQorCisgICBzZW5kX2dkYiAic2V0IGZvbGxvdyBjaGlsZFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtwYXNzICJzZXQgZm9sbG93IGNoaWxkLCB2Zm9yayBhbmQgZXhlYyB0byBtYWluIGJwIn0KKyAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAic2V0IGZvbGxvdyBjaGlsZCwgdmZvcmsgYW5kIGV4ZWMgdG8gbWFpbiBicCJ9CisgICB9CisgICBzZW5kX2dkYiAiY29udGludWVcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICJEZXRhY2hpbmcgZnJvbSBwcm9ncmFtLipBdHRhY2hpbmcgYWZ0ZXIgZm9yayB0by4qRXhlY3V0aW5nIG5ldyBwcm9ncmFtLipCcmVha3BvaW50Lip2Zm9ya2VkLXByb2dyYW0uYzo1LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAidmZvcmsgYW5kIGV4ZWMgY2hpbGQgZm9sbG93LCB0byBtYWluIGJwIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgInZmb3JrIGFuZCBleGVjIGNoaWxkIGZvbGxvdywgdG8gbWFpbiBicCJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSB2Zm9yayBhbmQgZXhlYyBjaGlsZCBmb2xsb3csIHRvIG1haW4gYnAiIH0KKyAgIH0KKyAgICMgVGhlIHBhcmVudCBoYXMgYmVlbiBkZXRhY2hlZDsgYWxsb3cgdGltZSBmb3IgYW55IG91dHB1dCBpdCBtaWdodAorICAgIyBnZW5lcmF0ZSB0byBhcnJpdmUsIHNvIHRoYXQgb3V0cHV0IGRvZXNuJ3QgZ2V0IGNvbmZ1c2VkIHdpdGgKKyAgICMgYW55IGdkYl9leHBlY3RlZCBkZWJ1Z2dlciBvdXRwdXQgZnJvbSBhIHN1YnNlcXVlbnQgdGVzdHBvaW50LgorICAgIworICAgZXhlYyBzbGVlcCAxCisKKyAgICMgRXhwbGljaXRseSBraWxsIHRoaXMgY2hpbGQsIG9yIGEgc3Vic2VxdWVudCByZXJ1biBhY3R1YWxseSBydW5zCisgICAjIHRoZSBleGVjJ2QgY2hpbGQsIG5vdCB0aGUgb3JpZ2luYWwgcHJvZ3JhbS4uLgorICAgc2VuZF9nZGIgImtpbGxcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICIuKktpbGwgdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQuKnkgb3Igbi4gJCIgeworICAgICAgICAgc2VuZF9nZGIgInlcbiIKKyAgICAgICAgIHNlbmRfZ2RiICJmaWxlICRiaW5maWxlXG4iCisgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgIC1yZSAiLipMb2FkIG5ldyBzeW1ib2wgdGFibGUgZnJvbS4qeSBvciBuLiAkIiB7CisgICAgICAgICAgICAgICBzZW5kX2dkYiAieVxuIgorICAgICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgICAtcmUgIlJlYWRpbmcgc3ltYm9scyBmcm9tLiokZ2RiX3Byb21wdCAkIiB7fQorICAgICAgICAgICAgICAgICAgdGltZW91dCB7IGZhaWwgImxvYWRpbmcgc3ltYm9scyAodGltZW91dCkiOyByZXR1cm4gfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLXJlICIuKmdkYl9wcm9tcHQgJCIge30KKyAgICAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJsb2FkaW5nIHN5bWJvbHMgKHRpbWVvdXQpIjsgcmV0dXJuIH0KKyAgICAgICAgICB9CisgICAgICB9CisgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIge30KKyAgICAgIHRpbWVvdXQgeyBmYWlsICJraWxsaW5nIGluZmVyaW9yICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KK30KKworcHJvYyB2Zm9ya19hbmRfZXhlY19jaGlsZF9mb2xsb3dfdGhyb3VnaF9zdGVwIHt9IHsKKyAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICBnbG9iYWwgYmluZmlsZQorCisjIFRoaXMgdGVzdCBjYW5ub3QgYmUgcGVyZm9ybWVkIHByaW9yIHRvIEhQLVVYIDEwLjMwLCBiZWNhdXNlIHB0cmFjZS1iYXNlZAorIyBkZWJ1Z2dpbmcgb2YgYSB2Zm9ya2luZyBwcm9ncmFtIGJhc2ljYWxseSBkb2Vzbid0IGFsbG93IHRoZSBjaGlsZCB0byBkbworIyB0aGluZ3MgbGlrZSBoaXQgYSBicmVha3BvaW50IGJldHdlZW4gYSB2Zm9yayBhbmQgZXhlYy4gIFRoaXMgbWVhbnMgdGhhdAorIyBzYXlpbmcgInNldCBmb2xsb3cgY2hpbGQ7IG5leHQiIGF0IGEgdmZvcmsoKSBjYWxsIHdvbid0IHdvcmssIGJlY2F1c2UKKyMgdGhlIGltcGxlbWVudGF0aW9uIG9mICJuZXh0IiBzZXRzIGEgInN0ZXAgcmVzdW1lIiBicmVha3BvaW50IGF0IHRoZQorIyByZXR1cm4gZnJvbSB0aGUgdmZvcmsoKSwgd2hpY2ggdGhlIGNoaWxkIHdpbGwgaGl0IG9uIGl0cyB3YXkgdG8gZXhlYydpbmcuCisjCisgICBpZiB7ICFbaXN0YXJnZXQgImhwcGEqLSotaHB1eDEwLjMwIl0gJiYgIVtpc3RhcmdldCAiaHBwYSotKi1ocHV4MTEuKiJdIH0geworICAgICAgdmVyYm9zZSAidmZvcmsgY2hpbGQtZm9sbG93aW5nIG5leHQgdGVzdCBpZ25vcmVkIGZvciBub24taHBwYSBvciBwcmUtSFAvVVgtMTAuMzAgdGFyZ2V0cy4iCisgICAgICByZXR1cm4gMAorICAgfQorCisgICBzZW5kX2dkYiAic2V0IGZvbGxvdyBjaGlsZFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtwYXNzICJzZXQgZm9sbG93IGNoaWxkLCB2Zm9yayBhbmQgZXhlYyB0aHJvdWdoIHN0ZXAifQorICAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICJzZXQgZm9sbG93IGNoaWxkLCB2Zm9yayBhbmQgZXhlYyB0aHJvdWdoIHN0ZXAifQorICAgfQorICAgc2VuZF9nZGIgIm5leHRcbiIKKyAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICJEZXRhY2hpbmcgZnJvbSBwcm9ncmFtLipBdHRhY2hpbmcgYWZ0ZXIgZm9yayB0by4qRXhlY3V0aW5nIG5ldyBwcm9ncmFtLipCcmVha3BvaW50Lip2Zm9ya2VkX3Byb2dyYW0uYzo1LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAidmZvcmsgYW5kIGV4ZWMgY2hpbGQgZm9sbG93LCB0aHJvdWdoIHN0ZXAifQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAidmZvcmsgYW5kIGV4ZWMgY2hpbGQgZm9sbG93LCB0aHJvdWdoIHN0ZXAifQorICAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgdmZvcmsgYW5kIGV4ZWMgY2hpbGQgZm9sbG93LCB0aHJvdWdoIHN0ZXAiIH0KKyAgIH0KKyAgICMgVGhlIHBhcmVudCBoYXMgYmVlbiBkZXRhY2hlZDsgYWxsb3cgdGltZSBmb3IgYW55IG91dHB1dCBpdCBtaWdodAorICAgIyBnZW5lcmF0ZSB0byBhcnJpdmUsIHNvIHRoYXQgb3V0cHV0IGRvZXNuJ3QgZ2V0IGNvbmZ1c2VkIHdpdGgKKyAgICMgYW55IGV4cGVjdGVkIGRlYnVnZ2VyIG91dHB1dCBmcm9tIGEgc3Vic2VxdWVudCB0ZXN0cG9pbnQuCisgICAjCisgICBleGVjIHNsZWVwIDEKKworICAgIyBFeHBsaWNpdGx5IGtpbGwgdGhpcyBjaGlsZCwgb3IgYSBzdWJzZXF1ZW50IHJlcnVuIGFjdHVhbGx5IHJ1bnMKKyAgICMgdGhlIGV4ZWMnZCBjaGlsZCwgbm90IHRoZSBvcmlnaW5hbCBwcm9ncmFtLi4uCisgICBzZW5kX2dkYiAia2lsbFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIi4qS2lsbCB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZC4qeSBvciBuLiAkIiB7CisgICAgICAgICBzZW5kX2dkYiAieVxuIgorICAgICAgICAgc2VuZF9nZGIgImZpbGUgJGJpbmZpbGVcbiIKKyAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICIuKkxvYWQgbmV3IHN5bWJvbCB0YWJsZSBmcm9tLip5IG9yIG4uICQiIHsKKyAgICAgICAgICAgICAgIHNlbmRfZ2RiICJ5XG4iCisgICAgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAgIC1yZSAiUmVhZGluZyBzeW1ib2xzIGZyb20uKiRnZGJfcHJvbXB0ICQiIHt9CisgICAgICAgICAgICAgICAgICB0aW1lb3V0IHsgZmFpbCAibG9hZGluZyBzeW1ib2xzICh0aW1lb3V0KSI7IHJldHVybiB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAtcmUgIi4qZ2RiX3Byb21wdCAkIiB7fQorICAgICAgICAgICAgdGltZW91dCB7IGZhaWwgImxvYWRpbmcgc3ltYm9scyAodGltZW91dCkiOyByZXR1cm4gfQorICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7fQorICAgICAgdGltZW91dCB7IGZhaWwgImtpbGxpbmcgaW5mZXJpb3IgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorfQorCitwcm9jIHRjYXRjaF92Zm9ya190aGVuX3BhcmVudF9mb2xsb3cge30geworICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgIGdsb2JhbCBzcmNmaWxlCisKKyAgIHNlbmRfZ2RiICJzZXQgZm9sbG93IHBhcmVudFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtwYXNzICJzZXQgZm9sbG93IHBhcmVudCwgdGNhdGNoIHZmb3JrIn0KKyAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAic2V0IGZvbGxvdyBwYXJlbnQsIHRjYXRjaCB2Zm9yayJ9CisgICB9CisgICBzZW5kX2dkYiAidGNhdGNoIHZmb3JrXG4iCisgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiQ2F0Y2hwb2ludCAuKih2Zm9yaykuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJ2Zm9yayBwYXJlbnQgZm9sbG93LCBzZXQgdGNhdGNoIHZmb3JrIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgInZmb3JrIHBhcmVudCBmb2xsb3csIHNldCB0Y2F0Y2ggdmZvcmsifQorICAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgdmZvcmsgcGFyZW50IGZvbGxvdywgc2V0IHRjYXRjaCB2Zm9yayJ9CisgICB9CisgICBzZW5kX2dkYiAiY29udGludWVcbiIKKyMgSFAtVVggMTAuMjAgc2VlbXMgdG8gc3RvcCB5b3UgaW4gInZmb3JrIiwgd2hpbGUgbW9yZSByZWNlbnQgSFAtVVhzCisjIHN0b3AgeW91IGluICJfdmZvcmsiLgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIjB4XFswLTlhLWZBLUZcXSouKnZmb3JrLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAidmZvcmsgcGFyZW50IGZvbGxvdywgdGNhdGNoIHZmb3JrIn0KKyAgICAgIC1yZSAiMHhcWzAtOWEtZkEtRlxdKi4qX3Zmb3JrLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAidmZvcmsgcGFyZW50IGZvbGxvdywgdGNhdGNoIHZmb3JrIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgInZmb3JrIHBhcmVudCBmb2xsb3csIHRjYXRjaCB2Zm9yayJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSB2Zm9yayBwYXJlbnQgZm9sbG93LCB0Y2F0Y2ggdmZvcmsifQorICAgfQorICAgc2VuZF9nZGIgImZpbmlzaFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIlJ1biB0aWxsIGV4aXQgZnJvbS4qdmZvcmsuKjB4XFswLTlhLWZBLUZcXSogaW4gbWFpbiAuKiBhdCAuKiR7c3JjZmlsZX06Ny4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAge3Bhc3MgInZmb3JrIHBhcmVudCBmb2xsb3csIGZpbmlzaCBhZnRlciB0Y2F0Y2ggdmZvcmsifQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAidmZvcmsgcGFyZW50IGZvbGxvdywgZmluaXNoIGFmdGVyIHRjYXRjaCB2Zm9yayJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSB2Zm9yayBwYXJlbnQgZm9sbG93LCBmaW5pc2ggYWZ0ZXIgdGNhdGNoIHZmb3JrIiB9CisgICB9CisgICAjIFRoZSBjaGlsZCBoYXMgYmVlbiBkZXRhY2hlZDsgYWxsb3cgdGltZSBmb3IgYW55IG91dHB1dCBpdCBtaWdodAorICAgIyBnZW5lcmF0ZSB0byBhcnJpdmUsIHNvIHRoYXQgb3V0cHV0IGRvZXNuJ3QgZ2V0IGNvbmZ1c2VkIHdpdGgKKyAgICMgYW55IGV4cGVjdGVkIGRlYnVnZ2VyIG91dHB1dCBmcm9tIGEgc3Vic2VxdWVudCB0ZXN0cG9pbnQuCisgICAjCisgICBleGVjIHNsZWVwIDEKK30KKworcHJvYyB0Y2F0Y2hfdmZvcmtfdGhlbl9jaGlsZF9mb2xsb3cge30geworICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgIGdsb2JhbCBzcmNmaWxlMgorCisgICBzZW5kX2dkYiAic2V0IGZvbGxvdyBjaGlsZFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHtwYXNzICJzZXQgZm9sbG93IGNoaWxkLCB0Y2F0Y2ggdmZvcmsifQorICAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICJzZXQgZm9sbG93IGNoaWxkLCB0Y2F0Y2ggdmZvcmsifQorICAgfQorICAgc2VuZF9nZGIgInRjYXRjaCB2Zm9ya1xuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIkNhdGNocG9pbnQgLioodmZvcmspLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAidmZvcmsgY2hpbGQgZm9sbG93LCBzZXQgdGNhdGNoIHZmb3JrIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge2ZhaWwgInZmb3JrIGNoaWxkIGZvbGxvdywgc2V0IHRjYXRjaCB2Zm9yayJ9CisgICAgICB0aW1lb3V0ICAgICAgICAge2ZhaWwgIih0aW1lb3V0KSB2Zm9yayBjaGlsZCBmb2xsb3csIHNldCB0Y2F0Y2ggdmZvcmsifQorICAgfQorICAgc2VuZF9nZGIgImNvbnRpbnVlXG4iCisjIEhQLVVYIDEwLjIwIHNlZW1zIHRvIHN0b3AgeW91IGluICJ2Zm9yayIsIHdoaWxlIG1vcmUgcmVjZW50IEhQLVVYcworIyBzdG9wIHlvdSBpbiAiX3Zmb3JrIi4KKyAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICIweFxbMC05YS1mQS1GXF0qLip2Zm9yay4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAge3Bhc3MgInZmb3JrIGNoaWxkIGZvbGxvdywgdGNhdGNoIHZmb3JrIn0KKyAgICAgIC1yZSAiMHhcWzAtOWEtZkEtRlxdKi4qX3Zmb3JrLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFzcyAidmZvcmsgY2hpbGQgZm9sbG93LCB0Y2F0Y2ggdmZvcmsifQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAidmZvcmsgY2hpbGQgZm9sbG93LCB0Y2F0Y2ggdmZvcmsifQorICAgICAgdGltZW91dCAgICAgICAgIHtmYWlsICIodGltZW91dCkgdmZvcmsgY2hpbGQgZm9sbG93LCB0Y2F0Y2ggdmZvcmsifQorICAgfQorICAgc2VuZF9nZGIgImZpbmlzaFxuIgorICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIlJ1biB0aWxsIGV4aXQgZnJvbS4qdmZvcmsuKiR7c3JjZmlsZTJ9OjUuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgIHtwYXNzICJ2Zm9yayBjaGlsZCBmb2xsb3csIGZpbmlzaCBhZnRlciB0Y2F0Y2ggdmZvcmsifQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ZmFpbCAidmZvcmsgY2hpbGQgZm9sbG93LCBmaW5pc2ggYWZ0ZXIgdGNhdGNoIHZmb3JrIn0KKyAgICAgIHRpbWVvdXQgICAgICAgICB7ZmFpbCAiKHRpbWVvdXQpIHZmb3JrIGNoaWxkIGZvbGxvdywgZmluaXNoIGFmdGVyIHRjYXRjaCB2Zm9yayIgfQorICAgfQorICAgIyBUaGUgcGFyZW50IGhhcyBiZWVuIGRldGFjaGVkOyBhbGxvdyB0aW1lIGZvciBhbnkgb3V0cHV0IGl0IG1pZ2h0CisgICAjIGdlbmVyYXRlIHRvIGFycml2ZSwgc28gdGhhdCBvdXRwdXQgZG9lc24ndCBnZXQgY29uZnVzZWQgd2l0aAorICAgIyBhbnkgZXhwZWN0ZWQgZGVidWdnZXIgb3V0cHV0IGZyb20gYSBzdWJzZXF1ZW50IHRlc3Rwb2ludC4KKyAgICMKKyAgIGV4ZWMgc2xlZXAgMQorfQorCitwcm9jIGRvX3Zmb3JrX2FuZF9leGVjX3Rlc3RzIHt9IHsKKyAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICMgVHJ5IGZvbGxvd2luZyB0aGUgcGFyZW50IHByb2Nlc3MgYnkgc3RlcHBpbmcgdGhyb3VnaCBhIGNhbGwgdG8KKyAgICMgdmZvcmsuICBEbyB0aGlzIHdpdGhvdXQgY2F0Y2hwb2ludHMuCisgICBpZiBbcnVudG9fbWFpbl0gdGhlbiB7IHZmb3JrX3BhcmVudF9mb2xsb3dfdGhyb3VnaF9zdGVwIH0KKworICAgIyBUcnkgZm9sbG93aW5nIHRoZSBwYXJlbnQgcHJvY2VzcyBieSBzZXR0aW5nIGEgYnJlYWtwb2ludCBvbiB0aGUKKyAgICMgb3RoZXIgc2lkZSBvZiBhIHZmb3JrLCBhbmQgcnVubmluZyB0byB0aGF0IHBvaW50LiAgRG8gdGhpcworICAgIyB3aXRob3V0IGNhdGNocG9pbnRzLgorICAgaWYgW3J1bnRvX21haW5dIHRoZW4geyB2Zm9ya19wYXJlbnRfZm9sbG93X3RvX2JwIH0KKworICAgIyBUcnkgZm9sbG93aW5nIHRoZSBjaGlsZCBwcm9jZXNzIGJ5IGp1c3QgY29udGludWluZyB0aHJvdWdoIHRoZQorICAgIyB2Zm9yaywgYW5kIGxldHRpbmcgdGhlIHBhcmVudCdzIGJyZWFrcG9pbnQgb24gIm1haW4iIGJlIGF1dG8tCisgICAjIG1hZ2ljYWxseSByZXNldCBpbiB0aGUgY2hpbGQuCisgICAjCisgICBpZiBbcnVudG9fbWFpbl0gdGhlbiB7IHZmb3JrX2FuZF9leGVjX2NoaWxkX2ZvbGxvd190b19tYWluX2JwIH0KKworICAgIyBUcnkgZm9sbG93aW5nIHRoZSBjaGlsZCBwcm9jZXNzIGJ5IHN0ZXBwaW5nIHRocm91Z2ggYSBjYWxsIHRvCisgICAjIHZmb3JrLiAgVGhlIGNoaWxkIGFsc28gZXhlY3V0ZXMgYW4gZXhlYy4gIFNpbmNlIHRoZSBjaGlsZCBjYW5ub3QKKyAgICMgYmUgZGVidWdnZWQgdW50aWwgYWZ0ZXIgaXQgaGFzIGV4ZWMnZCwgYW5kIHNpbmNlIHRoZXJlJ3MgYSBicCBvbgorICAgIyAibWFpbiIgaW4gdGhlIHBhcmVudCwgYW5kIHNpbmNlIHRoZSBicCdzIGZvciB0aGUgcGFyZW50IGFyZQorICAgIyByZWNvbXB1dGVkIGluIHRoZSBleGVjJ2QgY2hpbGQsIHRoZSBzdGVwIHRocm91Z2ggYSB2Zm9yayBzaG91bGQKKyAgICMgbGFuZCB1cyBpbiB0aGUgIm1haW4iIGZvciB0aGUgZXhlYydkIGNoaWxkLCB0b28uCisgICAjCisgICBpZiBbcnVudG9fbWFpbl0gdGhlbiB7IHZmb3JrX2FuZF9leGVjX2NoaWxkX2ZvbGxvd190aHJvdWdoX3N0ZXAgfQorCisgICAjIFRyeSBjYXRjaGluZyBhIHZmb3JrLCBhbmQgc3RlcHBpbmcgb3V0IHRvIHRoZSBwYXJlbnQuCisgICAjCisgICBpZiBbcnVudG9fbWFpbl0gdGhlbiB7IHRjYXRjaF92Zm9ya190aGVuX3BhcmVudF9mb2xsb3cgfQorCisgICAjIFRyeSBjYXRjaGluZyBhIHZmb3JrLCBhbmQgc3RlcHBpbmcgb3V0IHRvIHRoZSBjaGlsZC4KKyAgICMKKyAgIGlmIFtydW50b19tYWluXSB0aGVuIHsgdGNhdGNoX3Zmb3JrX3RoZW5fY2hpbGRfZm9sbG93IH0KKworICAgIyBUZXN0IHRoZSBhYmlsaXR5IHRvIGZvbGxvdyBib3RoIGNoaWxkIGFuZCBwYXJlbnQgb2YgYSB2Zm9yay4gIERvCisgICAjIHRoaXMgd2l0aG91dCBjYXRjaHBvaW50cy4KKyAgICMgPz9yZWhyYXVlcjogTllJLiAgV2lsbCBhZGQgdGVzdHBvaW50cyBoZXJlIHdoZW4gaW1wbGVtZW50ZWQuCisgICAjCisKKyAgICMgVGVzdCB0aGUgYWJpbGl0eSB0byBoYXZlIHRoZSBkZWJ1Z2dlciBhc2sgdGhlIHVzZXIgYXQgdmZvcmstdGltZQorICAgIyB3aGV0aGVyIHRvIGZvbGxvdyB0aGUgcGFyZW50LCBjaGlsZCBvciBib3RoLiAgRG8gdGhpcyB3aXRob3V0CisgICAjIGNhdGNocG9pbnRzLgorICAgIyA/P3JlaHJhdWVyOiBOWUkuICBXaWxsIGFkZCB0ZXN0cG9pbnRzIGhlcmUgd2hlbiBpbXBsZW1lbnRlZC4KKyAgICMKK30KKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisKKyMgVGhpcyBpcyBhIHRlc3Qgb2YgZ2RiJ3MgYWJpbGl0eSB0byBmb2xsb3cgdGhlIHBhcmVudCBvciBjaGlsZAorIyBvZiBhIFVuaXggdmZvcmsoKSBzeXN0ZW0gY2FsbC4gIChUaGUgY2hpbGQgd2lsbCBzdWJzZXF1ZW50bHkKKyMgY2FsbCBhIHZhcmlhbnQgb2YgYSBVbml4IGV4ZWMoKSBzeXN0ZW0gY2FsbC4pCisjCitkb192Zm9ya19hbmRfZXhlY190ZXN0cworCitzZXQgdGltZW91dCAkb2xkdGltZW91dAorcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2dlbi1zby10aHJlc2guYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2dlbi1zby10aHJlc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWEzZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvZ2VuLXNvLXRocmVzaC5jCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogUHJvZ3JhbSB0byBnZW5lcmF0ZSB0aGUgc28tdGhyZXNoIHRlc3RjYXNlLAorICogaW5jbHVkaW5nIGFzc29jaWF0ZWQgbGlua2VkLWFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcy4KKyAqIEJ1aWxkIGFzOgorICoKKyAqICAgICAgICBjYyAtZyAtbyBnZW4tc28tdGhyZXNoIGdlbi1zby10aHJlc2guYworICoKKyAqIEludm9rZSBhczoKKyAqCisgKiAgICAgICAgZ2VuLXNvLXRocmVzaAorICoKKyAqIEl0IHdpbGwgcHV0IGFsbCB0aGUgY29kZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgKCIuIikuCisgKgorICogQSBtYWtlZmlsZSBjYW4gYWxzbyBiZSBnZW5lcmF0ZWQgaWYgdGhlIC1tYWtlbWFrZSBvcHRpb24gaXMgdXNlZC4KKyAqIFRvIHVzZSB0aGUgbWFrZWZpbGU6CisgKgorICogICAgICAgIG1ha2UgLWYgc28tdGhyZXNoLm1rIGFsbAorICoKKyAqIFRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBpcworICoKKyAqICAgICAgICBzby10aHJlc2gKKyAqCisgKiAoUmV2aXNlZCBmcm9tIGEgcHJvZ3JhbSBieSBKb2huIEJpc2hvcC4gIC0tcmVocmF1ZXIpCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKworaW50IG1haW4gKGFyZ2MsIGFyZ3YpCitpbnQgICAgYXJnYzsKK2NoYXIgKiphcmd2OworeworI2RlZmluZSBOVU1CRVJfT0ZfSU5UX1ZBUlMgMTUwMAorI2RlZmluZSBOVU1CRVJfT0ZfTElCUyAzCisgICAgaW50ICAgICBsaWJfbnVtID0gTlVNQkVSX09GX0xJQlM7CisgICAgaW50ICAgICBpOworICAgIGludCAgICAgaTI7CisgICAgRklMRSAgICptYWluX2ZpbGU7CisgICAgRklMRSAgICpsaWJfZmlsZTsKKyAgICBGSUxFICAgKm1ha2VfZmlsZTsKKyAgICBGSUxFICAgKmxpbmtfZmlsZTsKKworICAgIGNoYXIgIHRlc3RjYXNlX25hbWUgWzEwMDBdOworICAgIGNoYXIgIGxpbmtmaWxlX25hbWUgWzEwMDBdOworICAgIGNoYXIgIG1ha2VmaWxlX25hbWUgWzEwMDBdOworICAgIGNoYXIgIG1haW5maWxlX25hbWUgWzEwMDBdOworCisgICAgY2hhciAgICBmaWxlX25hbWVbMTAwXTsKKyAgICAvKgorICAgICAqICAgICAgICAwMTIzNDU2Nzg5ICAgICAgIDwtLSBsZW5ndGggb2YgZmllbGQKKyAgICAgKiAgIi4vZmlsMDAwMDAwMDAwMi5jIjsgICA8LS0gdHlwaWNhbCBmaWxlbmFtZQorICAgICAqICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAgIDwtLSBsZW5ndGggb2Ygc3RyaW5nCisgICAgICogICAgICAgICAgIDEwICAgICAgICAyMAorICAgICAqICAgICAgICAgICAgICAgICAgICAgXndoZXJlIG51bGwgZ29lcworICAgICAqLworICAgIGNoYXIgICAgZmlsZV9uYW1lX2NvcmVbMTAwXTsKKworICAgIC8qIFZlcmlmeSBpbnB1dC4KKyAgICAqLworICAgIGlmICgoYXJnYyA8IDEpIHx8IChhcmdjID4gMikgfHwgKGFyZ3YgPT0gTlVMTCkgfHwKKyAgICAgICAgKChhcmdjID09IDIpICYmIChzdHJjbXAgKGFyZ3ZbMV0sICItbWFrZW1ha2UiKSAhPSAwKSkpCisgICAgICB7CisgICAgICAgIHByaW50ZiAoIioqIFN5bnRheDogJXMgWy1tYWtlbWFrZV1cbiIsIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICBpZiAoc3RybmNtcCAoYXJndlswXSwgImdlbi0iLCA0KSAhPSAwKQorICAgICAgeworICAgICAgICBwcmludGYgKCIqKiBUaGlzIHRvb2wgZXhwZWN0ZWQgdG8gYmUgbmFtZWQgXCJnZW4tc29tZXRoaW5nXCJcbiIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgc3RyY3B5ICh0ZXN0Y2FzZV9uYW1lLCBhcmd2WzBdKzQpOworCisgICAgc3RyY3B5IChsaW5rZmlsZV9uYW1lLCB0ZXN0Y2FzZV9uYW1lKTsKKyAgICBzdHJjYXQgKGxpbmtmaWxlX25hbWUsICIubGlua29wdHMiKTsKKyAgICBsaW5rX2ZpbGUgPSBmb3BlbiAobGlua2ZpbGVfbmFtZSwgInciKTsKKyAgICBmcHJpbnRmIChsaW5rX2ZpbGUsICIjIExpbmtlciBvcHRpb25zIGZvciAlcyB0ZXN0XG4iLCB0ZXN0Y2FzZV9uYW1lKTsKKyAgICAKKyAgICAvKiBHZW5lcmF0ZSB0aGUgbWFrZWZpbGUsIGlmIHJlcXVlc3RlZC4KKyAgICAgICAqLworICAgIGlmIChhcmdjID09IDIpCisgICAgICB7CisgICAgICAgIHN0cmNweSAobWFrZWZpbGVfbmFtZSwgdGVzdGNhc2VfbmFtZSk7CisgICAgICAgIHN0cmNhdCAobWFrZWZpbGVfbmFtZSwgIi5tay5uZXciKTsKKyAgICAgICAgbWFrZV9maWxlID0gZm9wZW4gKG1ha2VmaWxlX25hbWUsICJ3Iik7CisgICAgICAgIHByaW50ZiAoIiAgTm90ZTogTmV3IG1ha2VmaWxlICglcykgZ2VuZXJhdGVkLlxuIiwgbWFrZWZpbGVfbmFtZSk7CisgICAgICAgIHByaW50ZiAoIiAgTWF5IHdhbnQgdG8gdXBkYXRlIGV4aXN0aW5nIG1ha2VmaWxlLCBpZiBhbnkuXG4iKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAlc1xuIiwgYXJndlswXSk7CisgICAgICAgIGZwcmludGYgKG1ha2VfZmlsZSwgIiMgTWFrZSBmaWxlIGZvciAlcyB0ZXN0XG4iLCB0ZXN0Y2FzZV9uYW1lKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiXG4iKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiQ0ZMQUdTID0gK0RBMS4xIC1nXG4iKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiXG4iKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiIyBUaGlzIGlzIGhvdyB0byBidWlsZCB0aGlzIGdlbmVyYXRvci5cbiIpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICIlcy5vOiAlcy5jXG4iLCBhcmd2WzBdLCBhcmd2WzBdKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiXHQkKENDKSAkKENGTEFHUykgLW8gJXMubyAtYyAlcy5jXG4iLCBhcmd2WzBdLCBhcmd2WzBdKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiJXM6ICVzLm9cbiIsIGFyZ3ZbMF0sIGFyZ3ZbMF0pOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJcdCQoQ0MpICQoQ0ZMQUdTKSAtbyAlcyAlcy5vXG4iLCBhcmd2WzBdLCBhcmd2WzBdKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiXG4iKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiIyBUaGlzIGlzIGhvdyB0byBydW4gdGhpcyBnZW5lcmF0b3IuXG4iKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiIyBUaGlzIHRhcmdldCBzaG91bGQgYmUgbWFkZSBiZWZvcmUgdGhlICdhbGwnIHRhcmdldCxcbiIpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICIjIHRvIGVuc3VyZSB0aGF0IHRoZSBzaGxpYiBzb3VyY2VzIGFyZSBhbGwgYXZhaWxhYmxlLlxuIik7CisgICAgICAgIGZwcmludGYgKG1ha2VfZmlsZSwgInJlcXVpcmVfc2hsaWJzOiAlc1xuIiwgYXJndlswXSk7CisgICAgICAgIGZvciAoaT0wOyBpIDwgbGliX251bTsgaSsrKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYgKG1ha2VfZmlsZSwgIlx0aWYgISBbIC1hIGxpYiUyLjJkXyVzLmMgXSA7IHRoZW4gXFxcbiIsIGksIHRlc3RjYXNlX25hbWUpOworICAgICAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiXHQgICVzIDsgXFxcbiIsIGFyZ3ZbMF0pOworICAgICAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiXHRmaVxuIik7CisgICAgICAgICAgfQorICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJcbiIpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICIjIFRoaXMgaXMgaG93IHRvIGJ1aWxkIGFsbCB0aGUgc2hsaWJzLlxuIik7CisgICAgICAgIGZwcmludGYgKG1ha2VfZmlsZSwgIiMgQmUgc3VyZSB0byBmaXJzdCBtYWtlIHRoZSByZXF1aXJlX3NobGlicyB0YXJnZXQhXG4iKTsKKyAgICAgICAgZm9yIChpPTA7IGkgPCBsaWJfbnVtOyBpKyspCisgICAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAibGliJTIuMmRfJXMubzogbGliJTIuMmRfJXMuY1xuIiwgaSwgdGVzdGNhc2VfbmFtZSwgaSwgdGVzdGNhc2VfbmFtZSk7CisgICAgICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJcdCQoQ0MpICQoQ0ZMQUdTKSArWiAtbyBsaWIlMi4yZF8lcy5vIC1jIGxpYiUyLjJkXyVzLmNcbiIsIGksIHRlc3RjYXNlX25hbWUsIGksIHRlc3RjYXNlX25hbWUpOworICAgICAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAibGliJTIuMmQtJXMuc2w6IGxpYiUyLjJkLSVzLm9cbiIsIGksIHRlc3RjYXNlX25hbWUsIGksIHRlc3RjYXNlX25hbWUpOworICAgICAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiXHQkKExEKSAkKExERkxBR1MpIC1iIC1vIGxpYiUyLjJkLSVzLnNsIGxpYiUyLjJkLSVzLm9cbiIsIGksIHRlc3RjYXNlX25hbWUsIGksIHRlc3RjYXNlX25hbWUpOworICAgICAgICAgIH0KKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiXG4iKTsKK2ZwcmludGYgKG1ha2VfZmlsZSwgIiMgRm9yIGNvbnZlbmllbmNlLCBoZXJlJ3MgbmFtZXMgZm9yIGFsbCBwaWVjZXMgb2YgYWxsIHNobGlicy5cbiIpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJTSExJQl9TT1VSQ0VTID0gXFxcbiIpOworICAgICAgICBmb3IgKGk9MDsgaSA8IGxpYl9udW0tMTsgaSsrKQorICAgICAgICAgIGZwcmludGYgKG1ha2VfZmlsZSwgIlx0bGliJTIuMmQtJXMuYyBcXFxuIiwgaSwgdGVzdGNhc2VfbmFtZSk7CisgICAgICAgIGZwcmludGYgKG1ha2VfZmlsZSwgIlx0bGliJTIuMmQtJXMuY1xuIiwgbGliX251bS0xLCB0ZXN0Y2FzZV9uYW1lKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiU0hMSUJfT0JKRUNUUyA9ICQoU0hMSUJfU09VUkNFUzouYz0ubylcbiIpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJTSExJQlMgPSAkKFNITElCX1NPVVJDRVM6LmM9LnNsKVxuIik7CisgICAgICAgIGZwcmludGYgKG1ha2VfZmlsZSwgIlNITElCX05BTUVTID0gJChTSExJQl9TT1VSQ0VTOi5jPSlcbiIpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJFWEVDVVRBQkxFUyA9ICQoU0hMSUJTKSAlcyAlc1xuIiwgYXJndlswXSwgdGVzdGNhc2VfbmFtZSk7CisgICAgICAgIGZwcmludGYgKG1ha2VfZmlsZSwgIk9CSkVDVF9GSUxFUyA9ICQoU0hMSUJfT0JKRUNUUykgJXMubyAlcy5vXG4iLCBhcmd2WzBdLCB0ZXN0Y2FzZV9uYW1lKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiXG4iKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAic2hsaWJfb2JqZWN0czogJChTSExJQl9PQkpFQ1RTKVxuIik7CisgICAgICAgIGZwcmludGYgKG1ha2VfZmlsZSwgInNobGliczogJChTSExJQlMpXG4iKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiXG4iKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiIyBUaGlzIGlzIGhvdyB0byBidWlsZCB0aGUgZGVidWdnYWJsZSB0ZXN0Y2FzZSB0aGF0IHVzZXMgdGhlIHNobGlicy5cbiIpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICIlcy5vOiAlcy5jXG4iLCB0ZXN0Y2FzZV9uYW1lLCB0ZXN0Y2FzZV9uYW1lKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiXHQkKENDKSAkKENGTEFHUykgLW8gJXMubyAtYyAlcy5jXG4iLCB0ZXN0Y2FzZV9uYW1lLCB0ZXN0Y2FzZV9uYW1lKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiJXM6IHNobGlicyAlcy5vXG4iLCB0ZXN0Y2FzZV9uYW1lLCB0ZXN0Y2FzZV9uYW1lKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiXHQkKExEKSAkKExERkxBR1MpIC1vICVzIC1sYyAtTC4gIiwgdGVzdGNhc2VfbmFtZSk7CisgICAgICAgIGZwcmludGYgKG1ha2VfZmlsZSwgIi1jICVzIC9vcHQvbGFuZ3Rvb2xzL2xpYi9lbmQubyAvbGliL2NydDAubyAlcy5vXG4iLCBsaW5rZmlsZV9uYW1lLCB0ZXN0Y2FzZV9uYW1lKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiXG4iKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiIyBZZWFoLCBidXQgeW91IHNob3VsZCBmaXJzdCBtYWtlIHRoZSByZXF1aXJlX3NobGlicyB0YXJnZXQhXG4iKTsKKyAgICAgICAgZnByaW50ZiAobWFrZV9maWxlLCAiYWxsOiAlcyAlc1xuIiwgdGVzdGNhc2VfbmFtZSwgYXJndlswXSk7CisgICAgICAgIGZwcmludGYgKG1ha2VfZmlsZSwgIlxuIik7CisgICAgICAgIGZwcmludGYgKG1ha2VfZmlsZSwgIiMgVG8gcmVtb3ZlIGV2ZXJ5dGhpbmcgYnVpbHQgdmlhIHRoaXMgbWFrZWZpbGUuLi5cbiIpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJjbGVhbjpcbiIpOworICAgICAgICAvKiBEbyB0aGlzIGNhcmVmdWxseSwgdG8gYXZvaWQgaGl0dGluZyBzaWxseSBIUC1VWCBBUkdfTUFYIGxpbWl0cy4uLiAqLworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJcdHJtIC1mIGxpYjAqLSVzLipcbiIsIHRlc3RjYXNlX25hbWUpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJcdHJtIC1mIGxpYjEqLSVzLipcbiIsIHRlc3RjYXNlX25hbWUpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJcdHJtIC1mIGxpYjIqLSVzLipcbiIsIHRlc3RjYXNlX25hbWUpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJcdHJtIC1mIGxpYjMqLSVzLipcbiIsIHRlc3RjYXNlX25hbWUpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJcdHJtIC1mIGxpYjQqLSVzLipcbiIsIHRlc3RjYXNlX25hbWUpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJcdHJtIC1mIGxpYjUqLSVzLipcbiIsIHRlc3RjYXNlX25hbWUpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJcdHJtIC1mIGxpYjYqLSVzLipcbiIsIHRlc3RjYXNlX25hbWUpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJcdHJtIC1mIGxpYjcqLSVzLipcbiIsIHRlc3RjYXNlX25hbWUpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJcdHJtIC1mIGxpYjgqLSVzLipcbiIsIHRlc3RjYXNlX25hbWUpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJcdHJtIC1mIGxpYjkqLSVzLipcbiIsIHRlc3RjYXNlX25hbWUpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJcdHJtIC1mICVzICVzICVzICVzLmNcbiIsIGFyZ3ZbMF0sIHRlc3RjYXNlX25hbWUsIGxpbmtmaWxlX25hbWUsIHRlc3RjYXNlX25hbWUpOworICAgICAgICBmcHJpbnRmIChtYWtlX2ZpbGUsICJcbiIpOworICAgICAgICBmY2xvc2UgKG1ha2VfZmlsZSk7CisgICAgICB9CisKKyAgICAvKiBHZW5lcmF0ZSB0aGUgY29kZSBmb3IgdGhlIGxpYnJhcmllcy4KKyAgICAgICAqLworICAgIGZvciAoaT0wOyBpIDwgbGliX251bTsgaSsrKSB7CisKKyAgICAgICAgLyogR2VuZXJhdGUgdGhlIG5hbWVzIGZvciB0aGUgbGlicmFyeS4KKyAgICAgICAgICovCisgICAgICAgIHNwcmludGYgKGZpbGVfbmFtZSwgImxpYiUyLjJkLSVzLmMiLCBpLCB0ZXN0Y2FzZV9uYW1lKTsKKyAgICAgICAgc3ByaW50ZiAoZmlsZV9uYW1lX2NvcmUsICJsaWIlMi4yZC0lcyIsIGksIHRlc3RjYXNlX25hbWUpOworCisgICAgICAgIC8qIEdlbmVyYXRlIHRoZSBzb3VyY2UgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIGxpYl9maWxlID0gZm9wZW4gKGZpbGVfbmFtZSwgInciKTsKKyAgICAgICAgZnByaW50ZiAobGliX2ZpbGUsICIvKiBTaGFyZWQgbGlicmFyeSBmaWxlIG51bWJlciAlZCAqL1xuIiwgaSk7CisgICAgICAgIGZwcmludGYgKGxpYl9maWxlLCAiI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiIpOworICAgICAgICBmcHJpbnRmIChsaWJfZmlsZSwgIi8qIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGxhcmdlbHkgZXhpc3QgdG8gYmxvYXQgdGhpcyBsaWJyYXJ5J3MgZGVidWcgaW5mby4gKi9cbiIpOworICAgICAgICBmcHJpbnRmIChsaWJfZmlsZSwgInN0YXRpYyBjaGFyIGNfc3RhdGljX2J1Zl8lZCBbMTAwXTtcbiIsIGkpOworICAgICAgICBmb3IgKGkyPTA7IGkyPE5VTUJFUl9PRl9JTlRfVkFSUzsgaTIrKykKKyAgICAgICAgICBmcHJpbnRmIChsaWJfZmlsZSwgImludCBpXyVkXyVkO1xuIiwgaSwgaTIpOworICAgICAgICBmcHJpbnRmIChsaWJfZmlsZSwgIlxuaW50IHJfJWQgKClcbiIsIGkpOworICAgICAgICBmcHJpbnRmIChsaWJfZmlsZSwgIntcbiIpOworICAgICAgICBmb3IgKGkyPTA7IGkyPE5VTUJFUl9PRl9JTlRfVkFSUzsgaTIrKykKKyAgICAgICAgICBmcHJpbnRmIChsaWJfZmlsZSwgIiAgICBpXyVkXyVkID0gJWQqJWQ7XG4iLCBpLCBpMiwgaTIsIGkyKTsKKyAgICAgICAgZnByaW50ZiAobGliX2ZpbGUsICIgICAgcmV0dXJuIDE7XG4iKTsKKyAgICAgICAgZnByaW50ZiAobGliX2ZpbGUsICJ9XG5cbiIpOworICAgICAgICBmcHJpbnRmIChsaWJfZmlsZSwgIi8qIGVuZCBvZiBnZW5lcmF0ZWQgZmlsZSAqL1xuIik7CisgICAgICAgIGZjbG9zZSAobGliX2ZpbGUpOworCisgICAgICAgIC8qIEFkZCBhIGxpbmtlciBvcHRpb25zIGxpbmUKKyAgICAgICAgICAgKi8KKyAgICAgICAgZnByaW50ZiAobGlua19maWxlLCAiLWwlMi4yZC0lc1xuIiwgaSwgdGVzdGNhc2VfbmFtZSk7CisgICAgfQorCisgICAgLyogR2VuZXJhdGUgdGhlICJtYWluIiBmaWxlLgorICAgICAqLworICAgIHN0cmNweSAobWFpbmZpbGVfbmFtZSwgdGVzdGNhc2VfbmFtZSk7CisgICAgc3RyY2F0IChtYWluZmlsZV9uYW1lLCAiLmMiKTsKKyAgICBtYWluX2ZpbGUgPSBmb3BlbiAobWFpbmZpbGVfbmFtZSwgInciKTsKKyAgICBmcHJpbnRmIChtYWluX2ZpbGUsICIvKiBHZW5lcmF0ZWQgdGVzdCBwcm9nYW0gd2l0aCAlZCBzaGFyZWQgbGlicmFyaWVzLiAqL1xuXG4iLAorICAgICAgICAgICAgIGxpYl9udW0pOworICAgIGZwcmludGYgKG1haW5fZmlsZSwgIiNpbmNsdWRlIDxzdGRpby5oPlxuXG4iKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsaWJfbnVtOyBpKyspIHsKKyAgICAgIGZwcmludGYgKG1haW5fZmlsZSwgImV4dGVybiBpbnQgcl8lZCgpO1xuIiwgaSk7CisgICAgfQorCisgICAgZnByaW50ZiAobWFpbl9maWxlLCAiXG4iKTsKKyAgICBmcHJpbnRmIChtYWluX2ZpbGUsICJpbnQgbWFpbigpXG4iKTsKKyAgICBmcHJpbnRmIChtYWluX2ZpbGUsICJ7XG4iKTsKKyAgICBmcHJpbnRmIChtYWluX2ZpbGUsICIgICAgaW50IGFjY3VtO1xuIik7CisgICAgZnByaW50ZiAobWFpbl9maWxlLCAiICAgIGludCBsaWJfbnVtID0gJWQ7XG4iLCBsaWJfbnVtKTsKKyAgCisgICAgZm9yIChpID0gMDsgaSA8IGxpYl9udW07IGkrKykgeworICAgICAgZnByaW50ZiAobWFpbl9maWxlLCAiICAgIGFjY3VtICs9IHJfJWQoKTtcbiIsIGkpOworICAgIH0KKworICAgIGZwcmludGYgKG1haW5fZmlsZSwgIiAgICBwcmludGYoIFwiRmluYWwgdmFsdWU6ICUlZCwgc2hvdWxkIGJlICUlZFxcblwiLCBhY2N1bSwgbGliX251bSApO1xuXG4iKTsKKyAgICBmcHJpbnRmIChtYWluX2ZpbGUsICIgICAgcmV0dXJuIDA7XG4iKTsKKyAgICBmcHJpbnRmIChtYWluX2ZpbGUsICJ9XG5cbiIpOworICAgIGZwcmludGYgKG1haW5fZmlsZSwgIi8qIGVuZCBvZiBnZW5lcmF0ZWQgZmlsZSAqL1xuIik7CisgICAgZmNsb3NlIChtYWluX2ZpbGUpOworCisgICAgLyogRmluaXNoIHVwIHRoZSBsaW5rIGZpbGUgYW5kIHRoZSBidWlsZCBmaWxlCisgICAgICovCisgICAgZmNsb3NlIChsaW5rX2ZpbGUpOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvaHd3YXRjaGJ1cy5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvaHd3YXRjaGJ1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMDJjOWIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9od3dhdGNoYnVzLmMKQEAgLTAsMCArMSw5IEBACisvKiBUaGlzIHByb2dyYW0gcmFpc2VzIGEgU0lHQlVTIHNpZ25hbCBvbiBIUC1VWCB3aGVuIHRoZQorICAgcG9pbnRlciAiYm9ndXNfcCIgaXMgZGVyZWZlcmVuY2VkLgorICAgKi8KK2ludCAqICBib2d1c19wID0gKGludCAqKTM7CisKK21haW4oKQoreworICAqYm9ndXNfcCA9IDB4ZGVhZGJlZWY7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC9od3dhdGNoYnVzLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2h3d2F0Y2hidXMuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ODk5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9od3dhdGNoYnVzLmV4cApAQCAtMCwwICsxLDg0IEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorCX0KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKKyMgYXJlIHdlIG9uIGEgdGFyZ2V0IGJvYXJkCitpZiAhW2lzbmF0aXZlXSB0aGVuIHsKKyAgICByZXR1cm4KK30KKworaWYgeyAhW2lzdGFyZ2V0ICJocHBhKi0qLWhwdXgxMC4zMCJdICYmICFbaXN0YXJnZXQgImhwcGEqLSotaHB1eDExLioiXSB9IHsKKyAgICB2ZXJib3NlICJIUFVYIGgvdyB3YXRjaCB0ZXN0IGlnbm9yZWQgZm9yIG5vbi1ocHBhIG9yIHByZS1IUC9VWC0xMC4zMCB0YXJnZXRzLiIKKyAgICByZXR1cm4gMAorfQorCitzZXQgdGVzdGZpbGUgImh3d2F0Y2hidXMiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKKyMgYnVpbGQgdGhlIGZpcnN0IHRlc3QgY2FzZQoraWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworaWYgW2dldF9jb21waWxlcl9pbmZvICR7YmluZmlsZX1dIHsKKyAgICByZXR1cm4gLTEKK30KKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisKKyMgV2Ugb3VnaHQgdG8gYmUgYWJsZSB0byBzZXQgYSBoYXJkd2FyZSB3YXRjaHBvaW50LCBzdGVwLCBhbmQKKyMgZ2V0IGEgU0lHQlVTIHNpZ25hbCByZXBvcnRlZC4KKyMKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgIGZhaWwgImNhbid0IHJ1biB0byBtYWluIgorICByZXR1cm4gMAorfQorCitzZW5kX2dkYiAid2F0Y2ggYm9ndXNfcFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiSGFyZHdhcmUgd2F0Y2hwb2ludCBcWzAtOVxdKjogYm9ndXNfcC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInNldCBoL3cgd2F0Y2hwb2ludCJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgInNldCBoL3cgd2F0Y2hwb2ludCJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZXQgaC93IHdhdGNocG9pbnQifQorfQorCitzZW5kX2dkYiAic3RlcFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiUHJvZ3JhbSByZWNlaXZlZCBzaWduYWwgU0lHQlVTLCBCdXMgZXJyb3IuKiBpbiBtYWluIC4qJHtzcmNmaWxlfTo4LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAic2VlIHJlYWwgU0lHQlVTIHdoZW4gaC93IHdhdGNocG9pbnQgc2V0In0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAic2VlIHJlYWwgU0lHQlVTIHdoZW4gaC93IHdhdGNocG9pbnQgc2V0In0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHNlZSByZWFsIFNJR0JVUyB3aGVuIGgvdyB3YXRjaHBvaW50IHNldCJ9Cit9CisKK3JldHVybiAwCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC9pbmhlcml0LWhwLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL2luaGVyaXQtaHAuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NTM1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9pbmhlcml0LWhwLmV4cApAQCAtMCwwICsxLDg0OSBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEZyZWQgRmlzaC4gKGZuZkBjeWdudXMuY29tKQorCitzZXQgd3MgIlxbXHJcblx0IFxdKyIKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW4gZXhlY3V0YWJsZSB0byB0ZXN0LiAgSWYgbm90LCB0aGVuIGVpdGhlciB3ZQorIyBoYXZlbid0IHRyaWVkIHRvIGNvbXBpbGUgb25lLCBvciB0aGUgY29tcGlsYXRpb24gZmFpbGVkIGZvciBzb21lIHJlYXNvbi4KKyMgSW4gZWl0aGVyIGNhc2UsIGp1c3Qgbm90aWZ5IHRoZSB1c2VyIGFuZCBza2lwIHRoZSB0ZXN0cyBpbiB0aGlzIGZpbGUuCisjIE5vdGUgLSBjcmVhdGUgc2VwYXJhdGUgImluaGVyaXQiIGV4ZWN1dGFibGUgZnJvbSBtaXNjLmNjCisKK3NldCB0ZXN0ZmlsZSAiaW5oZXJpdC1ocCIKK3NldCBzcmNmaWxlIG1pc2MtaHAuY2MKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworaWYgW2dldF9jb21waWxlcl9pbmZvICR7YmluZmlsZX0gImMrKyJdIHsKKyAgICByZXR1cm4gLTE7Cit9CisgCisgCitpZiB7W3NraXBfaHBfdGVzdHMgJGdjY19jb21waWxlZF19IHRoZW4geyBjb250aW51ZSB9CisKKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1ZyBjKyt9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKKyMKKyMgU2luZ2xlIGluaGVyaXRhbmNlLCBwcmludCBpbmRpdmlkdWFsIG1lbWJlcnMuCisjCisKK3Byb2MgdGVzdF9wcmludF9zaV9tZW1iZXJzIHt9IHsKKyAgICAjIFByaW50IGFsbCBtZW1iZXJzIG9mIGdfQSB1c2luZyBmdWxseSBxdWFsaWZpZWQgZm9ybS4KKworICAgIGdkYl90ZXN0ICJwcmludCBnX0EuQTo6YSIgIi4qID0gMSIgInByaW50IGdfQS5BOjphIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQS5BOjp4IiAiLiogPSAyIiAicHJpbnQgZ19BLkE6OngiCisKKyAgICAjIFByaW50IG1lbWJlcnMgb2YgZ19BIHVzaW5nIG5vbmFtYmlndW91cyBjb21wYWN0IGZvcm0uCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19BLmEiICIuKiA9IDEiICJwcmludCBnX0EuYSIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0EueCIgIi4qID0gMiIgInByaW50IGdfQS54IgorCisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX0IgdXNpbmcgZnVsbHkgcXVhbGlmaWVkIGZvcm0uCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19CLkE6OmEiICIuKiA9IDMiICJwcmludCBnX0IuQTo6YSIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0IuQTo6eCIgIi4qID0gNCIgInByaW50IGdfQi5BOjp4IgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQi5COjpiIiAiLiogPSA1IiAicHJpbnQgZ19CLkI6OmIiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19CLkI6OngiICIuKiA9IDYiICJwcmludCBnX0IuQjo6eCIKKworICAgICMgUHJpbnQgbWVtYmVycyBvZiBnX0IgdXNpbmcgbm9uYW1iaWd1b3VzIGNvbXBhY3QgZm9ybS4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19CLmEiICIuKiA9IDMiICJwcmludCBnX0IuYSIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0IuYiIgIi4qID0gNSIgInByaW50IGdfQi5iIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQi54IiAiLiogPSA2IiAicHJpbnQgZ19CLngiCisKKyAgICAjIFByaW50IGFsbCBtZW1iZXJzIG9mIGdfQyB1c2luZyBmdWxseSBxdWFsaWZpZWQgZm9ybS4KKworICAgIGdkYl90ZXN0ICJwcmludCBnX0MuQTo6YSIgIi4qID0gNyIgInByaW50IGdfQy5BOjphIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQy5BOjp4IiAiLiogPSA4IiAicHJpbnQgZ19DLkE6OngiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19DLkM6OmMiICIuKiA9IDkiICJwcmludCBnX0MuQzo6YyIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0MuQzo6eCIgIi4qID0gMTAiICJwcmludCBnX0MuQzo6eCIKKworICAgICMgUHJpbnQgbWVtYmVycyBvZiBnX0MgdXNpbmcgbm9uYW1iaWd1b3VzIGNvbXBhY3QgZm9ybS4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19DLmEiICIuKiA9IDciICJwcmludCBnX0MuYSIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0MuYyIgIi4qID0gOSIgInByaW50IGdfQy5jIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQy54IiAiLiogPSAxMCIgInByaW50IGdfQy54IgorfQorCisjCisjIFNpbmdsZSBpbmhlcml0YW5jZSwgcHJpbnQgdHlwZSBkZWZpbml0aW9ucy4KKyMKKworcHJvYyB0ZXN0X3B0eXBlX3NpIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCB3cworCisgICAgIyBQcmludCBjbGFzcyBBIGFzIGEgdHlwZS4KKworICAgIHNlbmRfZ2RiICJwdHlwZSBBXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgQSBce1xyXG4uKlxbIFxdKmludCBhO1xyXG5cWyBcXSppbnQgeDtcclxuLipcWyBcXSpcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIEEgKEZJWE1FKSIKKwl9CisJLXJlICJ0eXBlID0gc3RydWN0IEEgXHtcclxuXFsgXF0qaW50IGE7XHJcblxbIFxdKmludCB4O1xyXG5cWyBcXSpcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICIqLSotKiIKKwkgICAgZmFpbCAicHR5cGUgQSAoRklYTUUpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBBIiB9CisJdGltZW91dCB7IGZhaWwgInB0eXBlIEEgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgIyBQcmludCBjbGFzcyBBIGFzIGFuIGV4cGxpY2l0IGNsYXNzLgorCisgICAgc2VuZF9nZGIgInB0eXBlIGNsYXNzIEFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBBIFx7XHJcbi4qXFsgXF0qaW50IGE7XHJcblxbIFxdKmludCB4O1xyXG4uKlxbIFxdKlx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgY2xhc3MgQSAoRklYTUUpIgorCX0KKwktcmUgInR5cGUgPSBzdHJ1Y3QgQSBce1xyXG5cWyBcXSppbnQgYTtcclxuXFsgXF0qaW50IHg7XHJcblxbIFxdKlx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0dXBfeGZhaWwgIiotKi0qIgorCSAgICBmYWlsICJwdHlwZSBjbGFzcyBBIChGSVhNRSkiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInB0eXBlIGNsYXNzIEEiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHR5cGUgY2xhc3MgQSAodGltZW91dCkiIDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICAjIFByaW50IHR5cGUgb2YgYW4gb2JqZWN0IG9mIHR5cGUgQS4KKworICAgIHNlbmRfZ2RiICJwdHlwZSBnX0FcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBBIFx7XHJcbi4qXFsgXF0qaW50IGE7XHJcblxbIFxdKmludCB4O1xyXG4uKlxbIFxdKlx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgZ19BIChGSVhNRSkiCisJfQorCS1yZSAidHlwZSA9IHN0cnVjdCBBIFx7XHJcblxbIFxdKmludCBhO1xyXG5cWyBcXSppbnQgeDtcclxuXFsgXF0qXH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJICAgIGZhaWwgInB0eXBlIGdfQSAoRklYTUUpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBnX0EiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHR5cGUgZ19BICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgICMgUHJpbnQgY2xhc3MgQiBhcyBhIHR5cGUuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIEIiICJ0eXBlID0gY2xhc3MgQiA6IHB1YmxpYyBBIFx7XHJcblxbIFxdKnB1YmxpYzpcclxuXFsgXF0qaW50IGI7XHJcblxbIFxdKmludCB4O1xyXG4uKlx9IiAicHR5cGUgQiIKKworICAgICMgUHJpbnQgY2xhc3MgQiBhcyBhbiBleHBsaWNpdCBjbGFzcy4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHR5cGUgY2xhc3MgQiIgInR5cGUgPSBjbGFzcyBCIDogcHVibGljIEEgXHtcclxuXFsgXF0qcHVibGljOlxyXG5cWyBcXSppbnQgYjtcclxuXFsgXF0qaW50IHg7XHJcbi4qXH0iICJwdHlwZSBjbGFzcyBCIgorCisgICAgIyBQcmludCB0eXBlIG9mIGFuIG9iamVjdCBvZiB0eXBlIEIuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIGdfQiIgInR5cGUgPSBjbGFzcyBCIDogcHVibGljIEEgXHtcclxuXFsgXF0qcHVibGljOlxyXG5cWyBcXSppbnQgYjtcclxuXFsgXF0qaW50IHg7XHJcbi4qXH0iICJwdHlwZSBnX0IiCisKKyAgICAjIFByaW50IGNsYXNzIEMgYXMgYSB0eXBlLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwdHlwZSBDIiAidHlwZSA9IGNsYXNzIEMgOiBwdWJsaWMgQSBce1xyXG5cWyBcXSpwdWJsaWM6XHJcblxbIFxdKmludCBjO1xyXG5cWyBcXSppbnQgeDtcclxuLipcfSIgInB0eXBlIEMiCisKKyAgICAjIFByaW50IGNsYXNzIEMgYXMgYW4gZXhwbGljaXQgY2xhc3MuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIGNsYXNzIEMiICJ0eXBlID0gY2xhc3MgQyA6IHB1YmxpYyBBIFx7XHJcblxbIFxdKnB1YmxpYzpcclxuXFsgXF0qaW50IGM7XHJcblxbIFxdKmludCB4O1xyXG4uKlx9IiAicHR5cGUgY2xhc3MgQyIKKworICAgICMgUHJpbnQgdHlwZSBvZiBhbiBvYmplY3Qgb2YgdHlwZSBnX0MuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIGdfQyIgInR5cGUgPSBjbGFzcyBDIDogcHVibGljIEEgXHtcclxuXFsgXF0qcHVibGljOlxyXG5cWyBcXSppbnQgYztcclxuXFsgXF0qaW50IHg7XHJcbi4qXH0iICJwdHlwZSBnX0MiCisKKyAgICAjIGdjYyBjeWdudXMtMi4zLjMgKFExKSBoYXMgdGhpcyBidWcsIGJ1dCBpdCB3YXMgZml4ZWQgYXMgb2YKKyAgICAjIGN5Z251cy0yLjMuMy05MzA0MTcuICBQUiAyODE5LgorICAgIHNlbmRfZ2RiICJwdHlwZSB0YWdsZXNzX3N0cnVjdFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgb25lOyR7d3N9aW50IHR3bzske3dzfXRhZ2xlc3Nfc3RydWN0ICYgb3BlcmF0b3I9XFwodGFnbGVzc19zdHJ1Y3QgJlxcKTske3dzfVxcXCRfMSBcXCh0YWdsZXNzX3N0cnVjdCAmXFwpOyR7d3N9XFxcJF8xIFxcKFxcKTske3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgdGFnbGVzcyBzdHJ1Y3QiCisJfQorCS1yZSAidHlwZSA9IChzdHJ1Y3R8Y2xhc3MpLipcey4qaW50IG9uZTsuKmludCB0d287LipcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHRhZ2xlc3Mgc3RydWN0IChvYnNvbGV0ZSBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgdGFnbGVzcyBzdHJ1Y3QiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSB0YWdsZXNzIHN0cnVjdCAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSB2X3RhZ2xlc3NcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBceyR7d3N9cHVibGljOiR7d3N9aW50IG9uZTske3dzfWludCB0d287JHt3c310YWdsZXNzX3N0cnVjdCAmIG9wZXJhdG9yPVxcKHRhZ2xlc3Nfc3RydWN0ICZcXCk7JHt3c31cXFwkXzEgXFwodGFnbGVzc19zdHJ1Y3QgJlxcKTske3dzfVxcXCRfMSBcXChcXCk7JHt3c31cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHZhcmlhYmxlIG9mIHR5cGUgdGFnbGVzcyBzdHJ1Y3QiCisJfQorCS1yZSAidHlwZSA9IChzdHJ1Y3R8Y2xhc3MpLipcey4qaW50IG9uZTsuKmludCB0d287LipcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHZhcmlhYmxlIG9mIHR5cGUgdGFnbGVzcyBzdHJ1Y3QgKG9ic29sZXRlIGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSB2YXJpYWJsZSBvZiB0eXBlIHRhZ2xlc3Mgc3RydWN0IgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgdmFyaWFibGUgb2YgdHlwZSB0YWdsZXNzIHN0cnVjdCAodGltZW91dCkiCisJfQorICAgIH0KK30KKworIworIyBTaW5nbGUgaW5oZXJpdGFuY2UsIHByaW50IGNvbXBsZXRlIGNsYXNzZXMuCisjCisKK3Byb2MgdGVzdF9wcmludF9zaV9jbGFzc2VzIHt9IHsKKyAgICAjIFByaW50IGFsbCBtZW1iZXJzIG9mIGdfQS4KKworICAgIGdkYl90ZXN0ICJwcmludCBnX0EiICIuKiA9IFx7YSA9IDEsIHggPSAyXH0iICJwcmludCBnX0EiCisKKyAgICAjIFByaW50IGFsbCBtZW1iZXJzIG9mIGdfQi4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19CIiAiLiogPSBce1w8Y2xhc3MgQVw+ID0gXHthID0gMywgeCA9IDRcfSwgYiA9IDUsIHggPSA2XH0iICJwcmludCBnX0IiCisKKyAgICAjIFByaW50IGFsbCBtZW1iZXJzIG9mIGdfQy4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19DIiAiLiogPSBce1w8Y2xhc3MgQVw+ID0gXHthID0gNywgeCA9IDhcfSwgYyA9IDksIHggPSAxMFx9IiAicHJpbnQgZ19DIgorfQorCisjCisjIFNpbmdsZSBpbmhlcml0YW5jZSwgcHJpbnQgYW5vbnltb3VzIHVuaW9ucy4KKyMgR0RCIHZlcnNpb25zIHByaW9yIHRvIDQuMTQgZW50ZXJlZCBhbiBpbmZpbml0ZSBsb29wIHdoZW4gcHJpbnRpbmcKKyMgdGhlIHR5cGUgb2YgYSBjbGFzcyBjb250YWluaW5nIGFuIGFub255bW91cyB1bmlvbiwgYW5kIHRoZXkgd2VyZSBhbHNvCisjIGluY2FwYWJsZSBvZiBwcmludGluZyB0aGUgbWVtYmVyIG9mIGFuIGFub255bW91cyB1bmlvbi4KKyMgV2UgdGVzdCB0aGUgcHJpbnRpbmcgb2YgdGhlIG1lbWJlciBmaXJzdCwgYW5kIHBlcmZvcm0gdGhlIG90aGVyIHRlc3RzCisjIG9ubHkgaWYgdGhlIHRlc3Qgc3VjY2VlZHMsIHRvIGF2b2lkIHRoZSBpbmZpbml0ZSBsb29wLgorIworCitwcm9jIHRlc3RfcHJpbnRfYW5vbl91bmlvbiB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgd3MKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19hbm9uX3VuaW9uLmEiICIuKiA9IDIiICJwcmludCBhbm9ueW1vdXMgdW5pb24gbWVtYmVyIgorICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBzZW5kX2dkYiAicHJpbnQgZ19hbm9uX3VuaW9uXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IFx7b25lID0gMSwgXHthID0gMiwgYiA9IDJcfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHJpbnQgdmFyaWFibGUgb2YgdHlwZSBhbm9ueW1vdXMgdW5pb24iCisJfQorCS1yZSAiLiogPSAuKlx7b25lID0gMSwgID0gXHthID0gMiwgYiA9IC4qXH1cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInByaW50IHZhcmlhYmxlIG9mIHR5cGUgYW5vbnltb3VzIHVuaW9uIChvYnNvbGV0ZSBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKlxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInByaW50IHZhcmlhYmxlIG9mIHR5cGUgYW5vbnltb3VzIHVuaW9uIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHJpbnQgdmFyaWFibGVvZiB0eXBlIGFub255bW91cyB1bmlvbiAodGltZW91dCkiCisJfQorICAgIH0KKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgc2VuZF9nZGIgInB0eXBlIGdfYW5vbl91bmlvblxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIGNsYXNzX3dpdGhfYW5vbl91bmlvbiBceyR7d3N9cHVibGljOiR7d3N9aW50IG9uZTske3dzfXVuaW9uIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgYTske3dzfWxvbmcgaW50IGI7JHt3c311bmlvbiBce1wuXC5cLlx9ICYgb3BlcmF0b3I9XFwodW5pb24gXHtcLlwuXC5cfSAmXFwpOyR7d3N9XFxcJF8wIFxcKHVuaW9uIFx7XC5cLlwuXH0gJlxcKTske3dzfVxcXCRfMCBcXChcXCk7JHt3c31cfTske3dzfWNsYXNzX3dpdGhfYW5vbl91bmlvbiAmIG9wZXJhdG9yPVxcKGNsYXNzX3dpdGhfYW5vbl91bmlvbiBjb25zdCAmXFwpOyR7d3N9Y2xhc3Nfd2l0aF9hbm9uX3VuaW9uXFwoY2xhc3Nfd2l0aF9hbm9uX3VuaW9uIGNvbnN0ICZcXCk7JHt3c31jbGFzc193aXRoX2Fub25fdW5pb25cXCh2b2lkXFwpOyR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwcmludCB0eXBlIG9mIGFub255bW91cyB1bmlvbiIKKwl9CisJLXJlICJ0eXBlID0gKHN0cnVjdHxjbGFzcykuKlx7LippbnQgb25lOy4qdW5pb24gXHsuKmludCBhOy4qKGxvbmd8bG9uZyBpbnR8aW50KSBiOy4qXH07LipcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInByaW50IHR5cGUgb2YgYW5vbnltb3VzIHVuaW9uIChvYnNvbGV0ZSBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKlxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInByaW50IHR5cGUgb2YgYW5vbnltb3VzIHVuaW9uIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHJpbnQgdHlwZSBvZiBhbm9ueW1vdXMgdW5pb24gKHRpbWVvdXQpIgorCX0KKyAgICB9Cit9CisKKyMKKyMgTXVsdGlwbGUgaW5oZXJpdGFuY2UsIHByaW50IGluZGl2aWR1YWwgbWVtYmVycy4KKyMKKworcHJvYyB0ZXN0X3ByaW50X21pX21lbWJlcnMge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICAjIFByaW50IGFsbCBtZW1iZXJzIG9mIGdfQS4KKworICAgIGdkYl90ZXN0ICJwcmludCBnX0EuQTo6YSIgIi4qID0gMSIgInByaW50IGdfQS5BOjphIgorICAgIAorICAgIGdkYl90ZXN0ICJwcmludCBnX0EuQTo6eCIgIi4qID0gMiIgInByaW50IGdfQS5BOjp4IgorCisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX0IuCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19CLkE6OmEiICIuKiA9IDMiICJwcmludCBnX0IuQTo6YSIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0IuQTo6eCIgIi4qID0gNCIgInByaW50IGdfQi5BOjp4IgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQi5COjpiIiAiLiogPSA1IiAicHJpbnQgZ19CLkI6OmIiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19CLkI6OngiICIuKiA9IDYiICJwcmludCBnX0IuQjo6eCIKKworICAgICMgUHJpbnQgYWxsIG1lbWJlcnMgb2YgZ19DLgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQy5BOjphIiAiLiogPSA3IiAicHJpbnQgZ19DLkE6OmEiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19DLkE6OngiICIuKiA9IDgiICJwcmludCBnX0MuQTo6eCIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0MuQzo6YyIgIi4qID0gOSIgInByaW50IGdfQy5DOjpjIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfQy5DOjp4IiAiLiogPSAxMCIgInByaW50IGdfQy5DOjp4IgorCisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX0QuCisKKyAgICAjIFRoZSBmb2xsb3dpbmcgaXMgYW1iaWd1b3VzLCBhbmQgZ2RiIHNob3VsZCBkZXRlY3QgdGhpcy4KKyAgICAjIEZvciBub3csIGFjY2VwdCBnZGIncyBiZWhhdmlvciBhcyBhbiBleHBlY3RlZCBmYWlsdXJlIGlmIGl0CisgICAgIyBzaW1wbHkgcHJpbnRzIGVpdGhlciBtZW1iZXIgY29ycmVjdGx5LgorCisgICAjIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICBzZW5kX2dkYiAicHJpbnQgZ19ELkE6OmFcbiIKKyAgICBnZGJfZXhwZWN0IHsJCisJLXJlICJ3YXJuaW5nOiBBIGFtYmlndW91czsgdXNpbmcgRDo6Qjo6QS4gVXNlIGEgY2FzdCB0byBkaXNhbWJpZ3VhdGUuXHJcblxcJFxbMC05XF0qID0gMTFcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwcmludCBnX0QuQTo6YSIKKwl9CisJLXJlICIuKiA9IDE1XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHJpbnQgZ19ELkE6OmEgKGRpZCBHREIncyBhbGdvcml0aG0gY2hhbmdlPykiCisJfQorCS1yZSAiLiogPSAxMVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInByaW50IGdfRC5BOjphIChhbWJpZ3VpdHkgbm90IHJlcG9ydGVkKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZ19ELkE6OmEiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHJpbnQgZ19ELkE6OmEgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgIyBUaGUgZm9sbG93aW5nIGlzIGFtYmlndW91cywgYW5kIGdkYiBzaG91bGQgZGV0ZWN0IHRoaXMuCisgICAgIyBGb3Igbm93LCBhY2NlcHQgZ2RiJ3MgYmVoYXZpb3IgYXMgYW4gZXhwZWN0ZWQgZmFpbHVyZSBpZiBpdAorICAgICMgc2ltcGx5IHByaW50cyBlaXRoZXIgbWVtYmVyIGNvcnJlY3RseS4KKworICAgIyBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgc2VuZF9nZGIgInByaW50IGdfRC5BOjp4XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ3YXJuaW5nOiBBIGFtYmlndW91czsgdXNpbmcgRDo6Qjo6QS4gVXNlIGEgY2FzdCB0byBkaXNhbWJpZ3VhdGUuXHJcblxcJFxbMC05XF0qID0gMTJcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwcmludCBnX0QuQTo6eCIKKwl9CisJLXJlICIuKiA9IDE2XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHJpbnQgZ19ELkE6OnggKGRpZCBHREIncyBhbGdvcml0aG0gY2hhbmdlPykiCisJfQorCS1yZSAiLiogPSAxMlxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInByaW50IGdfRC5BOjp4IChhbWJpZ3VpdHkgbm90IHJlcG9ydGVkKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZ19ELkE6OngiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHJpbnQgZ19ELkE6OnggKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRC5COjpiIiAiLiogPSAxMyIgInByaW50IGdfRC5COjpiIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRC5COjp4IiAiLiogPSAxNCIgInByaW50IGdfRC5COjp4IgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX0QuQzo6YyIgIi4qID0gMTciICJwcmludCBnX0QuQzo6YyIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19ELkM6OngiICIuKiA9IDE4IiAicHJpbnQgZ19ELkM6OngiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19ELkQ6OmQiICIuKiA9IDE5IiAicHJpbnQgZ19ELkQ6OmQiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19ELkQ6OngiICIuKiA9IDIwIiAicHJpbnQgZ19ELkQ6OngiCisKKyAgICAjIFByaW50IGFsbCBtZW1iZXJzIG9mIGdfRS4KKworICAgICMgVGhlIGZvbGxvd2luZyBpcyBhbWJpZ3VvdXMsIGFuZCBnZGIgc2hvdWxkIGRldGVjdCB0aGlzLgorICAgICMgRm9yIG5vdywgYWNjZXB0IGdkYidzIGJlaGF2aW9yIGFzIGFuIGV4cGVjdGVkIGZhaWx1cmUgaWYgaXQKKyAgICAjIHNpbXBseSBwcmludHMgZWl0aGVyIG1lbWJlciBjb3JyZWN0bHkuCisKKyAgICAjc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIHNlbmRfZ2RiICJwcmludCBnX0UuQTo6YVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAid2FybmluZzogQSBhbWJpZ3VvdXM7IHVzaW5nIEU6OkQ6OkI6OkEuIFVzZSBhIGNhc3QgdG8gZGlzYW1iaWd1YXRlLlxyXG5cXCRcWzAtOVxdKiA9IDIxXHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHJpbnQgZ19FLkE6OmEiCisJfQorCS1yZSAiLiogPSAyNVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInByaW50IGdfRS5BOjphIChkaWQgR0RCJ3MgYWxnb3JpdGhtIGNoYW5nZT8pIgorCX0KKwktcmUgIi4qID0gMjFcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwcmludCBnX0UuQTo6YSAoYW1iaWd1aXR5IG5vdCByZXBvcnRlZCkiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGdfRS5BOjphIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IGdfRS5BOjphICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgICMgVGhlIGZvbGxvd2luZyBpcyBhbWJpZ3VvdXMsIGFuZCBnZGIgc2hvdWxkIGRldGVjdCB0aGlzLgorICAgICMgRm9yIG5vdywgYWNjZXB0IGdkYidzIGJlaGF2aW9yIGFzIGFuIGV4cGVjdGVkIGZhaWx1cmUgaWYgaXQKKyAgICAjIHNpbXBseSBwcmludHMgZWl0aGVyIG1lbWJlciBjb3JyZWN0bHkuCisKKyAgICMgc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIHNlbmRfZ2RiICJwcmludCBnX0UuQTo6eFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAid2FybmluZzogQSBhbWJpZ3VvdXM7IHVzaW5nIEU6OkQ6OkI6OkEuIFVzZSBhIGNhc3QgdG8gZGlzYW1iaWd1YXRlLlxyXG5cXCRcWzAtOVxdKiA9IDIyXHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHJpbnQgZ19FLkE6OngiCisJfQorCS1yZSAiLiogPSAyNlxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInByaW50IGdfRS5BOjp4IChkaWQgR0RCJ3MgYWxnb3JpdGhtIGNoYW5nZT8pIgorCX0KKwktcmUgIi4qID0gMjJcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwcmludCBnX0UuQTo6eCAoYW1iaWd1aXR5IG5vdCByZXBvcnRlZCkiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGdfRS5BOjp4IiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IGdfRS5BOjp4ICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgIGdkYl90ZXN0ICJwcmludCBnX0UuQjo6YiIgIi4qID0gMjMiICJwcmludCBnX0UuQjo6YiIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX0UuQjo6eCIgIi4qID0gMjQiICJwcmludCBnX0UuQjo6eCIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ19FLkM6OmMiICIuKiA9IDI3IiAicHJpbnQgZ19FLkM6OmMiCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRS5DOjp4IiAiLiogPSAyOCIgInByaW50IGdfRS5DOjp4IgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRS5EOjpkIiAiLiogPSAyOSIgInByaW50IGdfRS5EOjpkIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRS5EOjp4IiAiLiogPSAzMCIgInByaW50IGdfRS5EOjp4IgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRS5FOjplIiAiLiogPSAzMSIgInByaW50IGdfRS5FOjplIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRS5FOjp4IiAiLiogPSAzMiIgInByaW50IGdfRS5FOjp4IgorfQorCisjCisjIE11bHRpcGxlIGluaGVyaXRhbmNlLCBwcmludCB0eXBlIGRlZmluaXRpb25zLgorIworCitwcm9jIHRlc3RfcHR5cGVfbWkge30geworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHR5cGUgRCIgInR5cGUgPSBjbGFzcyBEIDogcHVibGljIEIsIHB1YmxpYyBDIFx7XHJcblxbIFxdKnB1YmxpYzpcclxuXFsgXF0qaW50IGQ7XHJcblxbIFxdKmludCB4O1xyXG4uKlx9IiAicHR5cGUgRCIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHR5cGUgY2xhc3MgRCIgInR5cGUgPSBjbGFzcyBEIDogcHVibGljIEIsIHB1YmxpYyBDIFx7XHJcblxbIFxdKnB1YmxpYzpcclxuXFsgXF0qaW50IGQ7XHJcblxbIFxdKmludCB4O1xyXG4uKlx9IiAicHR5cGUgY2xhc3MgRCIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHR5cGUgZ19EIiAidHlwZSA9IGNsYXNzIEQgOiBwdWJsaWMgQiwgcHVibGljIEMgXHtcclxuXFsgXF0qcHVibGljOlxyXG5cWyBcXSppbnQgZDtcclxuXFsgXF0qaW50IHg7XHJcbi4qXH0iICJwdHlwZSBnX0QiCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIEUiICJ0eXBlID0gY2xhc3MgRSA6IHB1YmxpYyBEIFx7XHJcblxbIFxdKnB1YmxpYzpcclxuXFsgXF0qaW50IGU7XHJcblxbIFxdKmludCB4O1xyXG4uKlx9IiAicHR5cGUgRSIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHR5cGUgY2xhc3MgRSIgInR5cGUgPSBjbGFzcyBFIDogcHVibGljIEQgXHtcclxuXFsgXF0qcHVibGljOlxyXG5cWyBcXSppbnQgZTtcclxuXFsgXF0qaW50IHg7XHJcbi4qXH0iICJwdHlwZSBjbGFzcyBFIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwdHlwZSBnX0UiICJ0eXBlID0gY2xhc3MgRSA6IHB1YmxpYyBEIFx7XHJcblxbIFxdKnB1YmxpYzpcclxuXFsgXF0qaW50IGU7XHJcblxbIFxdKmludCB4O1xyXG4uKlx9IiAicHR5cGUgZ19FIgorfQorCisjCisjIE11bHRpcGxlIGluaGVyaXRhbmNlLCBwcmludCBjb21wbGV0ZSBjbGFzc2VzLgorIworCitwcm9jIHRlc3RfcHJpbnRfbWlfY2xhc3NlcyB7fSB7CisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX0QuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInByaW50IGdfRCIgIi4qID0gXHtcPGNsYXNzIEJcPiA9IFx7XDxjbGFzcyBBXD4gPSBce2EgPSAxMSwgeCA9IDEyXH0sIGIgPSAxMywgeCA9IDE0XH0sIFw8Y2xhc3MgQ1w+ID0gXHtcPGNsYXNzIEFcPiA9IFx7YSA9IDE1LCB4ID0gMTZcfSwgYyA9IDE3LCB4ID0gMThcfSwgZCA9IDE5LCB4ID0gMjBcfSIgInByaW50IGdfRCIKKworICAgICMgUHJpbnQgYWxsIG1lbWJlcnMgb2YgZ19FLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX0UiICIuKiA9IFx7XDxjbGFzcyBEXD4gPSBce1w8Y2xhc3MgQlw+ID0gXHtcPGNsYXNzIEFcPiA9IFx7YSA9IDIxLCB4ID0gMjJcfSwgYiA9IDIzLCB4ID0gMjRcfSwgXDxjbGFzcyBDXD4gPSBce1w8Y2xhc3MgQVw+ID0gXHthID0gMjUsIHggPSAyNlx9LCBjID0gMjcsIHggPSAyOFx9LCBkID0gMjksIHggPSAzMFx9LCBlID0gMzEsIHggPSAzMlx9IiAicHJpbnQgZ19FIgorfQorCisjCisjIFNpbmdsZSB2aXJ0dWFsIGluaGVyaXRhbmNlLCBwcmludCBpbmRpdmlkdWFsIG1lbWJlcnMuCisjCisKK3Byb2MgdGVzdF9wcmludF9zdmlfbWVtYmVycyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX3ZBLgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkEudkE6OnZhIiAiLiogPSAxIiAicHJpbnQgZ192QS52QTo6dmEiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192QS52QTo6dngiICIuKiA9IDIiICJwcmludCBnX3ZBLnZBOjp2eCIKKworICAgICMgUHJpbnQgbWVtYmVycyBvZiBnX3ZBIHVzaW5nIGNvbXBhY3QgZm9ybS4KKworICAgIGdkYl90ZXN0ICJwcmludCBnX3ZBLnZhIiAiLiogPSAxIiAicHJpbnQgZ192QS52YSIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX3ZBLnZ4IiAiLiogPSAyIiAicHJpbnQgZ192QS52eCIKKworICAgICMgUHJpbnQgYWxsIG1lbWJlcnMgb2YgZ192Qi4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBzZW5kX2dkYiAicHJpbnQgZ192Qi52QTo6dmFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qID0gM1xyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IGdfdkIudkE6OnZhIiB9CisJLXJlICIuKnZpcnR1YWwgYmFzZWNsYXNzIGJvdGNoLiokZ2RiX3Byb21wdCAkIiB7CisJICAgICMgRG9lcyBub3QgaGFwcGVuIHdpdGggZ2NjIGN5Z251cy0yLjQuNS05MzA4MjgKKwkgICAgZmFpbCAicHJpbnQgZ192Qi52QTo6dmEgKGtub3duIGJ1ZyB3aXRoIGdjYyBjeWdudXMtMi40LjUtOTMwNDE3KSIKKwkgICAgIyBNYW55IG9mIHRoZSByZXN0IG9mIHRoZXNlIHRlc3RzIGhhdmUgdGhlIHNhbWUgcHJvYmxlbS4KKwkgICAgcmV0dXJuIDAKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZ192Qi52QTo6dmEiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHJpbnQgZ192Qi52QTo6dmEgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX3ZCLnZBOjp2eCIgIi4qID0gNCIgInByaW50IGdfdkIudkE6OnZ4IgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkIudkI6OnZiIiAiLiogPSA1IiAicHJpbnQgZ192Qi52Qjo6dmIiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192Qi52Qjo6dngiICIuKiA9IDYiICJwcmludCBnX3ZCLnZCOjp2eCIKKworICAgICMgUHJpbnQgbWVtYmVycyBvZiBnX3ZCIHVzaW5nIGNvbXBhY3QgZm9ybS4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192Qi52YSIgIi4qID0gMyIgInByaW50IGdfdkIudmEiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192Qi52YiIgIi4qID0gNSIgInByaW50IGdfdkIudmIiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192Qi52eCIgIi4qID0gNiIgInByaW50IGdfdkIudngiCisKKyAgICAjIFByaW50IGFsbCBtZW1iZXJzIG9mIGdfdkMuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkMudkE6OnZhIiAiLiogPSA3IiAicHJpbnQgZ192Qy52QTo6dmEiCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkMudkE6OnZ4IiAiLiogPSA4IiAicHJpbnQgZ192Qy52QTo6dngiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192Qy52Qzo6dmMiICIuKiA9IDkiICJwcmludCBnX3ZDLnZDOjp2YyIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX3ZDLnZDOjp2eCIgIi4qID0gMTAiICJwcmludCBnX3ZDLnZDOjp2eCIKKworICAgICMgUHJpbnQgbWVtYmVycyBvZiBnX3ZDIHVzaW5nIGNvbXBhY3QgZm9ybS4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192Qy52YSIgIi4qID0gNyIgInByaW50IGdfdkMudmEiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192Qy52YyIgIi4qID0gOSIgInByaW50IGdfdkMudmMiCisKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192Qy52eCIgIi4qID0gMTAiICJwcmludCBnX3ZDLnZ4IgorfQorCisjCisjIFNpbmdsZSB2aXJ0dWFsIGluaGVyaXRhbmNlLCBwcmludCB0eXBlIGRlZmluaXRpb25zLgorIworCitwcm9jIHRlc3RfcHR5cGVfdmkge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICAjIFRoaXMgY2xhc3MgZG9lcyBub3QgdXNlIGFueSBDKystc3BlY2lmaWMgZmVhdHVyZXMsIHNvIGl0J3MgZmluZSBmb3IKKyAgICAjIGl0IHRvIHByaW50IGFzICJzdHJ1Y3QiLgorICAgIHNlbmRfZ2RiICJwdHlwZSB2QVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIHZBIFx7XFtcclxuXF0rXFsgXF0qcHVibGljOlxbXHJcblxdK1xbIFxdKmludCB2YTtcW1xyXG5cXStcWyBcXSppbnQgdng7XFtcclxuXF0rLipcfVxbXHJcblxdKyRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgdkEiCisJfQorCS1yZSAidHlwZSA9IHN0cnVjdCB2QSBce1xbXHJcblxdK1xbIFxdKmludCB2YTtcW1xyXG5cXStcWyBcXSppbnQgdng7XFtcclxuXF0rXH1cW1xyXG5cXSskZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHZBIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSB2QSIgfQorCXRpbWVvdXQgeyBmYWlsICJwdHlwZSB2QSAodGltZW91dCkiIDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICAjIFRoaXMgY2xhc3MgZG9lcyBub3QgdXNlIGFueSBDKystc3BlY2lmaWMgZmVhdHVyZXMsIHNvIGl0J3MgZmluZSBmb3IKKyAgICAjIGl0IHRvIHByaW50IGFzICJzdHJ1Y3QiLgorICAgIHNlbmRfZ2RiICJwdHlwZSBjbGFzcyB2QVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIHZBIFx7XFtcclxuXF0rXFsgXF0qcHVibGljOlxbXHJcblxdK1xbIFxdKmludCB2YTtcW1xyXG5cXStcWyBcXSppbnQgdng7XFtcclxuXF0rLipcfVxbXHJcblxdKyRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgY2xhc3MgdkEiCisJfQorCS1yZSAidHlwZSA9IHN0cnVjdCB2QSBce1xbXHJcblxdK1xbIFxdKmludCB2YTtcW1xyXG5cXStcWyBcXSppbnQgdng7XFtcclxuXF0rXH1cW1xyXG5cXSskZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGNsYXNzIHZBIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBjbGFzcyB2QSIgfQorCXRpbWVvdXQgeyBmYWlsICJwdHlwZSBjbGFzcyB2QSAodGltZW91dCkiIDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICAjIFRoaXMgY2xhc3MgZG9lcyBub3QgdXNlIGFueSBDKystc3BlY2lmaWMgZmVhdHVyZXMsIHNvIGl0J3MgZmluZSBmb3IKKyAgICAjIGl0IHRvIHByaW50IGFzICJzdHJ1Y3QiLgorICAgIHNlbmRfZ2RiICJwdHlwZSBnX3ZBXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgdkEgXHtcW1xyXG5cXStcWyBcXSpwdWJsaWM6XFtcclxuXF0rXFsgXF0qaW50IHZhO1xbXHJcblxdK1xbIFxdKmludCB2eDtcW1xyXG5cXSsuKlx9XFtcclxuXF0rJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBnX3ZBIgorCX0KKwktcmUgInR5cGUgPSBzdHJ1Y3QgdkEgXHtcW1xyXG5cXStcWyBcXSppbnQgdmE7XFtcclxuXF0rXFsgXF0qaW50IHZ4O1xbXHJcblxdK1x9XFtcclxuXF0rJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBnX3ZBIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBnX3ZBIiB9CisJdGltZW91dCB7IGZhaWwgInB0eXBlIGdfdkEgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwdHlwZSB2QiIgInB0eXBlIHZCXFtcclxuXF0rdHlwZSA9IGNsYXNzIHZCIDogcHVibGljIHZpcnR1YWwgdkEgXHtcW1xyXG5cXSsgIHB1YmxpYzpcclxuXFsgXF0raW50IHZiO1xyXG5cWyBcXStpbnQgdng7XHJcbi4qXH0iICJwdHlwZSB2QiAoYUNDKSIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHR5cGUgY2xhc3MgdkIiICJ0eXBlID0gY2xhc3MgdkIgOiBwdWJsaWMgdmlydHVhbCB2QSBce1xyXG5cWyBcXSpwdWJsaWM6XHJcblxbIFxdKmludCB2YjtcclxuXFsgXF0qaW50IHZ4O1xyXG4uKlx9IiAicHR5cGUgY2xhc3MgdkIgKGFDQykiCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIGdfdkIiICJ0eXBlID0gY2xhc3MgdkIgOiBwdWJsaWMgdmlydHVhbCB2QSBce1xyXG5cWyBcXSpwdWJsaWM6XHJcblxbIFxdKmludCB2YjtcclxuXFsgXF0qaW50IHZ4O1xyXG4uKlx9IiAicHR5cGUgZ192QiAoYUNDKSIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHR5cGUgdkMiICJ0eXBlID0gY2xhc3MgdkMgOiBwdWJsaWMgdmlydHVhbCB2QSBce1xyXG5cWyBcXSpwdWJsaWM6XHJcblxbIFxdKmludCB2YztcclxuXFsgXF0qaW50IHZ4O1xyXG4uKlx9IiAicHR5cGUgdkMgKGFDQykiCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIGNsYXNzIHZDIiAidHlwZSA9IGNsYXNzIHZDIDogcHVibGljIHZpcnR1YWwgdkEgXHtcclxuXFsgXF0qcHVibGljOlxyXG5cWyBcXSppbnQgdmM7XHJcblxbIFxdKmludCB2eDtcclxuLipcfSIgInB0eXBlIGNsYXNzIHZDIChhQ0MpIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwdHlwZSBnX3ZDIiAidHlwZSA9IGNsYXNzIHZDIDogcHVibGljIHZpcnR1YWwgdkEgXHtcclxuXFsgXF0qcHVibGljOlxyXG5cWyBcXSppbnQgdmM7XHJcblxbIFxdKmludCB2eDtcclxuLipcfSIgInB0eXBlIGdfdkMgKGFDQykiCit9CisKKyMKKyMgU2luZ2xlIHZpcnR1YWwgaW5oZXJpdGFuY2UsIHByaW50IGNvbXBsZXRlIGNsYXNzZXMuCisjCisKK3Byb2MgdGVzdF9wcmludF9zdmlfY2xhc3NlcyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgICMgUHJpbnQgYWxsIG1lbWJlcnMgb2YgZ192QS4KKworICAgIGdkYl90ZXN0ICJwcmludCBnX3ZBIiAiLiogPSBce3ZhID0gMSwgdnggPSAyXH0iICJwcmludCBnX3ZBIgorCisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX3ZCLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIHNlbmRfZ2RiICJwcmludCBnX3ZCXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IFx7XDxjbGFzcyB2QVw+ID0gXHt2YSA9IDMsIHZ4ID0gNFx9LCB2YiA9IDUsIHZ4ID0gNiwgVmlydHVhbCB0YWJsZSBhdCAkaGV4XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwcmludCBnX3ZCIgorCX0KKwktcmUgIi4qaW52YWxpZCBhZGRyZXNzIDB4MC4qJGdkYl9wcm9tcHQgJCIgeworCSAgICAjIERvZXMgbm90IGhhcHBlbiB3aXRoIGdjYyBjeWdudXMtMi40LjUtOTMwODI4CisJICAgIGZhaWwgInByaW50IGdfdkIgKGtub3duIGJ1ZyB3aXRoIGdjYyBjeWdudXMtMi40LjUtOTMwNDE3KSIKKwkgICAgIyBNYW55IG9mIHRoZSByZXN0IG9mIHRoZXNlIHRlc3RzIGhhdmUgdGhlIHNhbWUgcHJvYmxlbS4KKwkgICAgcmV0dXJuIDAKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgZ192QiIgfQorCXRpbWVvdXQgeyBmYWlsICJwcmludCBnX3ZCICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KKworICAgICMgUHJpbnQgYWxsIG1lbWJlcnMgb2YgZ192Qy4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192QyIgIi4qID0gXHtcPGNsYXNzIHZBXD4gPSBce3ZhID0gNywgdnggPSA4XH0sIHZjID0gOSwgdnggPSAxMCwgVmlydHVhbCB0YWJsZSBhdCAkaGV4XH0iICJwcmludCBnX3ZDIgorfQorCisjCisjIE11bHRpcGxlIHZpcnR1YWwgaW5oZXJpdGFuY2UsIHByaW50IGluZGl2aWR1YWwgbWVtYmVycy4KKyMKKworcHJvYyB0ZXN0X3ByaW50X212aV9tZW1iZXJzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICAjIFByaW50IGFsbCBtZW1iZXJzIG9mIGdfdkQuCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgc2VuZF9nZGIgInByaW50IGdfdkQudkE6OnZhXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IDE5XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgZ192RC52QTo6dmEiIH0KKwktcmUgIi4qdmlydHVhbCBiYXNlY2xhc3MgYm90Y2guKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgIyBEb2VzIG5vdCBoYXBwZW4gd2l0aCBnY2MgY3lnbnVzLTIuNC41LTkzMDgyOAorCSAgICBmYWlsICJwcmludCBnX3ZELnZBOjp2YSAoa25vd24gYnVnIHdpdGggZ2NjIGN5Z251cy0yLjQuNS05MzA0MTcpIgorCSAgICAjIE1hbnkgb2YgdGhlIHJlc3Qgb2YgdGhlc2UgdGVzdHMgaGF2ZSB0aGUgc2FtZSBwcm9ibGVtLgorCSAgICByZXR1cm4gMAorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBnX3ZELnZBOjp2YSIgfQorCXRpbWVvdXQgeyBmYWlsICJwcmludCBnX3ZELnZBOjp2YSAodGltZW91dCkiIDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkQudkE6OnZ4IiAiLiogPSAyMCIgInByaW50IGdfdkQudkE6OnZ4IgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX3ZELnZCOjp2YiIgIi4qID0gMjEiICJwcmludCBnX3ZELnZCOjp2YiIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192RC52Qjo6dngiICIuKiA9IDIyIiAicHJpbnQgZ192RC52Qjo6dngiCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkQudkM6OnZjIiAiLiogPSAyMyIgInByaW50IGdfdkQudkM6OnZjIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX3ZELnZDOjp2eCIgIi4qID0gMjQiICJwcmludCBnX3ZELnZDOjp2eCIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX3ZELnZEOjp2ZCIgIi4qID0gMjUiICJwcmludCBnX3ZELnZEOjp2ZCIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX3ZELnZEOjp2eCIgIi4qID0gMjYiICJwcmludCBnX3ZELnZEOjp2eCIKKworICAgICMgUHJpbnQgYWxsIG1lbWJlcnMgb2YgZ192RS4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192RS52QTo6dmEiICIuKiA9IDAiICJwcmludCBnX3ZFLnZBOjp2YSIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192RS52QTo6dngiICIuKiA9IDAiICJwcmludCBnX3ZFLnZBOjp2eCIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192RS52Qjo6dmIiICIuKiA9IDAiICJwcmludCBnX3ZFLnZCOjp2YiIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192RS52Qjo6dngiICIuKiA9IDAiICJwcmludCBnX3ZFLnZCOjp2eCIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192RS52Qzo6dmMiICIuKiA9IDAiICJwcmludCBnX3ZFLnZDOjp2YyIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192RS52Qzo6dngiICIuKiA9IDAiICJwcmludCBnX3ZFLnZDOjp2eCIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ192RS52RDo6dmQiICIuKiA9IDAiICJwcmludCBnX3ZFLnZEOjp2ZCIKKworICAgIGdkYl90ZXN0ICJwcmludCBnX3ZFLnZEOjp2eCIgIi4qID0gMCIgInByaW50IGdfdkUudkQ6OnZ4IgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkUudkU6OnZlIiAiLiogPSAyNyIgInByaW50IGdfdkUudkU6OnZlIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdfdkUudkU6OnZ4IiAiLiogPSAyOCIgInByaW50IGdfdkUudkU6OnZ4IgorfQorCisjCisjIE11bHRpcGxlIHZpcnR1YWwgaW5oZXJpdGFuY2UsIHByaW50IHR5cGUgZGVmaW5pdGlvbnMuCisjCisKK3Byb2MgdGVzdF9wdHlwZV9tdmkge30geworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHR5cGUgdkQiICJ0eXBlID0gY2xhc3MgdkQgOiBwdWJsaWMgdmlydHVhbCB2QiwgcHVibGljIHZpcnR1YWwgdkMgXHtcclxuXFsgXF0qcHVibGljOlxyXG5cWyBcXSppbnQgdmQ7XHJcblxbIFxdKmludCB2eDtcclxuLipcfSIgInB0eXBlIHZEIChhQ0MpIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwdHlwZSBjbGFzcyB2RCIgInR5cGUgPSBjbGFzcyB2RCA6IHB1YmxpYyB2aXJ0dWFsIHZCLCBwdWJsaWMgdmlydHVhbCB2QyBce1xyXG5cWyBcXSpwdWJsaWM6XHJcblxbIFxdKmludCB2ZDtcclxuXFsgXF0qaW50IHZ4O1xyXG4uKlx9IiAicHR5cGUgY2xhc3MgdkQgKGFDQykiCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIGdfdkQiICJ0eXBlID0gY2xhc3MgdkQgOiBwdWJsaWMgdmlydHVhbCB2QiwgcHVibGljIHZpcnR1YWwgdkMgXHtcclxuXFsgXF0qcHVibGljOlxyXG5cWyBcXSppbnQgdmQ7XHJcblxbIFxdKmludCB2eDtcclxuLipcfSIgInB0eXBlIGdfdkQgKGFDQykiCisKKyAgICBzZXR1cF94ZmFpbF9mb3JtYXQgIkRXQVJGIDEiCisgICAgZ2RiX3Rlc3QgInB0eXBlIHZFIiAidHlwZSA9IGNsYXNzIHZFIDogcHVibGljIHZpcnR1YWwgdkQgXHtcclxuXFsgXF0qcHVibGljOlxyXG5cWyBcXSppbnQgdmU7XHJcblxbIFxdKmludCB2eDtcclxuLipcfSIgInB0eXBlIHZFIChhQ0MpIgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwdHlwZSBjbGFzcyB2RSIgInR5cGUgPSBjbGFzcyB2RSA6IHB1YmxpYyB2aXJ0dWFsIHZEIFx7XHJcblxbIFxdKnB1YmxpYzpcclxuXFsgXF0qaW50IHZlO1xyXG5cWyBcXSppbnQgdng7XHJcbi4qXH0iICJwdHlwZSBjbGFzcyB2RSAoYUNDKSIKKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBnZGJfdGVzdCAicHR5cGUgZ192RSIgInR5cGUgPSBjbGFzcyB2RSA6IHB1YmxpYyB2aXJ0dWFsIHZEIFx7XHJcblxbIFxdKnB1YmxpYzpcclxuXFsgXF0qaW50IHZlO1xyXG5cWyBcXSppbnQgdng7XHJcbi4qXH0iICJwdHlwZSBnX3ZFIChhQ0MpIgorfQorCisjCisjIE11bHRpcGxlIHZpcnR1YWwgaW5oZXJpdGFuY2UsIHByaW50IGNvbXBsZXRlIGNsYXNzZXMuCisjCisKK3Byb2MgdGVzdF9wcmludF9tdmlfY2xhc3NlcyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgICMgUHJpbnQgYWxsIG1lbWJlcnMgb2YgZ192RC4KKworICAgIHNldHVwX3hmYWlsX2Zvcm1hdCAiRFdBUkYgMSIKKyAgICBzZW5kX2dkYiAicHJpbnQgZ192RFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSBce1w8Y2xhc3MgdkJcPiA9IFx7XDxjbGFzcyB2QVw+ID0gXHt2YSA9IDE5LCB2eCA9IDIwXH0sIHZiID0gMjEsIHZ4ID0gMjIsIFZpcnR1YWwgdGFibGUgYXQgJGhleFx9LCBcPGNsYXNzIHZDXD4gPSBce3ZjID0gMjMsIHZ4ID0gMjQsIFZpcnR1YWwgdGFibGUgYXQgJGhleFx9LCB2ZCA9IDI1LCB2eCA9IDI2LCBWaXJ0dWFsIHRhYmxlIGF0ICRoZXhcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInByaW50IGdfdkQiCisJfQorCS1yZSAiLippbnZhbGlkIGFkZHJlc3MgMHgwLiokZ2RiX3Byb21wdCAkIiB7CisJICAgICMgRG9lcyBub3QgaGFwcGVuIHdpdGggZ2NjIGN5Z251cy0yLjQuNS05MzA4MjgKKwkgICAgZmFpbCAicHJpbnQgZ192RCAoa25vd24gYnVnIHdpdGggZ2NjIGN5Z251cy0yLjQuNS05MzA0MTcpIgorCSAgICAjIE1hbnkgb2YgdGhlIHJlc3Qgb2YgdGhlc2UgdGVzdHMgaGF2ZSB0aGUgc2FtZSBwcm9ibGVtLgorCSAgICByZXR1cm4gMAorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBnX3ZEIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IGdfdkQgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgIyBQcmludCBhbGwgbWVtYmVycyBvZiBnX3ZFLgorCisgICAgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIgorICAgIGdkYl90ZXN0ICJwcmludCBnX3ZFIiAiLiogPSBce1w8Y2xhc3MgdkRcPiA9IFx7XDxjbGFzcyB2Qlw+ID0gXHtcPGNsYXNzIHZBXD4gPSBce3ZhID0gMCwgdnggPSAwXH0sIHZiID0gMCwgdnggPSAwLCBWaXJ0dWFsIHRhYmxlIGF0ICRoZXhcfSwgXDxjbGFzcyB2Q1w+ID0gXHt2YyA9IDAsIHZ4ID0gMCwgVmlydHVhbCB0YWJsZSBhdCAkaGV4XH0sIHZkID0gMCwgdnggPSAwLCBWaXJ0dWFsIHRhYmxlIGF0ICRoZXhcfSwgdmUgPSAyNywgdnggPSAyOCwgVmlydHVhbCB0YWJsZSBhdCAkaGV4XH0iICJwcmludCBnX3ZFIgorfQorCitwcm9jIGRvX3Rlc3RzIHt9IHsKKyAgICBnbG9iYWwgcHJtc19pZAorICAgIGdsb2JhbCBidWdfaWQKKyAgICBnbG9iYWwgc3ViZGlyCisgICAgZ2xvYmFsIG9iamRpcgorICAgIGdsb2JhbCBzcmNkaXIKKyAgICBnbG9iYWwgYmluZmlsZQorCisgICAgc2V0IHBybXNfaWQgMAorICAgIHNldCBidWdfaWQgMAorCisgICAgIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKyAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKyAgICBnZGJfbG9hZCAkYmluZmlsZQorCisgICAgZ2RiX3Rlc3QgInNldCBsYW5ndWFnZSBjKysiICIiCisgICAgZ2RiX3Rlc3QgInNldCB3aWR0aCAwIiAiIgorCisgICAgIyBHZXQgdGhlIGRlYnVnIGZvcm1hdCBmb3IgdGhlIGNvbXBpbGVkIHRlc3QgY2FzZS4KKworICAgIGlmIHsgIVsgcnVudG9fbWFpbl0gfSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzOworICAgIH0gZWxzZSB7CisJZ2V0X2RlYnVnX2Zvcm1hdAorICAgIH0KKworICAgIHRlc3RfcHR5cGVfc2kKKyAgICB0ZXN0X3B0eXBlX21pCisgICAgdGVzdF9wdHlwZV92aQorICAgIHRlc3RfcHR5cGVfbXZpCisKKyAgICBnZGJfc3RvcF9zdXBwcmVzc2luZ190ZXN0czsKKyAgICAKKyAgICBpZiB7ICFbIHJ1bnRvICdpbmhlcml0YW5jZTIodm9pZCknIF0gfSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzOworICAgIH0KKworICAgIHRlc3RfcHJpbnRfc2lfbWVtYmVycworICAgIHRlc3RfcHJpbnRfc2lfY2xhc3NlcworICAgIHRlc3RfcHJpbnRfbWlfbWVtYmVycworICAgIHRlc3RfcHJpbnRfbWlfY2xhc3NlcworICAgIHRlc3RfcHJpbnRfYW5vbl91bmlvbgorCisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7CisKKyAgICBpZiB7ICFbIHJ1bnRvICdpbmhlcml0YW5jZTQodm9pZCknIF0gfSB7CisJZ2RiX3N1cHByZXNzX3Rlc3RzOworICAgIH0KKworICAgIHRlc3RfcHJpbnRfc3ZpX21lbWJlcnMKKyAgICB0ZXN0X3ByaW50X3N2aV9jbGFzc2VzCisgICAgdGVzdF9wcmludF9tdmlfbWVtYmVycworICAgIHRlc3RfcHJpbnRfbXZpX2NsYXNzZXMKK30KKworZG9fdGVzdHMKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL21pc2MtaHAuY2MgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9taXNjLWhwLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNDY4MzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9taXNjLWhwLmNjCkBAIC0wLDAgKzEsNTE0IEBACisvLyBUZXN0IHZhcmlvdXMgLSotIEMrKyAtKi0gdGhpbmdzLgorCit0eXBlZGVmIHN0cnVjdCBmbGVlcCBmbGVlcDsKK3N0cnVjdCBmbGVlcCB7IGludCBhOyB9IHM7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT0gc2ltcGxlIGNsYXNzIHN0cnVjdHVyZXMgID09PT09PT09PT09PT09PT09PT09PT09CisKK3N0cnVjdCBkZWZhdWx0X3B1YmxpY19zdHJ1Y3QgeworIC8vIGRlZmF1bHRzIHRvIHB1YmxpYzoKKyAgaW50IGE7CisgIGludCBiOworfTsKKworc3RydWN0IGV4cGxpY2l0X3B1YmxpY19zdHJ1Y3QgeworIHB1YmxpYzoKKyAgaW50IGE7CisgIGludCBiOworfTsKKworc3RydWN0IHByb3RlY3RlZF9zdHJ1Y3QgeworIHByb3RlY3RlZDoKKyAgaW50IGE7CisgIGludCBiOworfTsKKworc3RydWN0IHByaXZhdGVfc3RydWN0IHsKKyBwcml2YXRlOgorICBpbnQgYTsKKyAgaW50IGI7Cit9OworCitzdHJ1Y3QgbWl4ZWRfcHJvdGVjdGlvbl9zdHJ1Y3QgeworIHB1YmxpYzoKKyAgaW50IGE7CisgIGludCBiOworIHByaXZhdGU6CisgIGludCBjOworICBpbnQgZDsKKyBwcm90ZWN0ZWQ6CisgIGludCBlOworICBpbnQgZjsKKyBwdWJsaWM6CisgIGludCBnOworIHByaXZhdGU6CisgIGludCBoOworIHByb3RlY3RlZDoKKyAgaW50IGk7Cit9OworCitjbGFzcyBwdWJsaWNfY2xhc3MgeworIHB1YmxpYzoKKyAgaW50IGE7CisgIGludCBiOworfTsKKworY2xhc3MgcHJvdGVjdGVkX2NsYXNzIHsKKyBwcm90ZWN0ZWQ6CisgIGludCBhOworICBpbnQgYjsKK307CisKK2NsYXNzIGRlZmF1bHRfcHJpdmF0ZV9jbGFzcyB7CisgLy8gZGVmYXVsdHMgdG8gcHJpdmF0ZToKKyAgaW50IGE7CisgIGludCBiOworfTsKKworY2xhc3MgZXhwbGljaXRfcHJpdmF0ZV9jbGFzcyB7CisgcHJpdmF0ZToKKyAgaW50IGE7CisgIGludCBiOworfTsKKworY2xhc3MgbWl4ZWRfcHJvdGVjdGlvbl9jbGFzcyB7CisgcHVibGljOgorICBpbnQgYTsKKyAgaW50IGI7CisgcHJpdmF0ZToKKyAgaW50IGM7CisgIGludCBkOworIHByb3RlY3RlZDoKKyAgaW50IGU7CisgIGludCBmOworIHB1YmxpYzoKKyAgaW50IGc7CisgcHJpdmF0ZToKKyAgaW50IGg7CisgcHJvdGVjdGVkOgorICBpbnQgaTsKK307CisKK2NsYXNzIGNvbnN0X3ZvbF9tZXRob2RfY2xhc3MgeworcHVibGljOgorICBpbnQgYTsKKyAgaW50IGI7CisgIGludCBmb28gKGludCAmKSBjb25zdDsKKyAgaW50IGJhciAoaW50ICYpIHZvbGF0aWxlOworICBpbnQgYmF6IChpbnQgJikgY29uc3Qgdm9sYXRpbGU7Cit9OworCitpbnQgY29uc3Rfdm9sX21ldGhvZF9jbGFzczo6Zm9vIChpbnQgJiBpcikgY29uc3QKK3sKKyAgcmV0dXJuIGlyICsgMzsKK30KK2ludCBjb25zdF92b2xfbWV0aG9kX2NsYXNzOjpiYXIgKGludCAmIGlyKSB2b2xhdGlsZQoreworICByZXR1cm4gaXIgKyA0OworfQoraW50IGNvbnN0X3ZvbF9tZXRob2RfY2xhc3M6OmJheiAoaW50ICYgaXIpIGNvbnN0IHZvbGF0aWxlCit7CisgIHJldHVybiBpciArIDU7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT0gc2ltcGxlIGluaGVyaXRhbmNlID09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIEEgeworIHB1YmxpYzoKKyAgaW50IGE7CisgIGludCB4OworfTsKKworQSBnX0E7CisKK2NsYXNzIEIgOiBwdWJsaWMgQSB7CisgcHVibGljOgorICBpbnQgYjsKKyAgaW50IHg7Cit9OworCitCIGdfQjsKKworY2xhc3MgQyA6IHB1YmxpYyBBIHsKKyBwdWJsaWM6CisgIGludCBjOworICBpbnQgeDsKK307CisKK0MgZ19DOworCitjbGFzcyBEIDogcHVibGljIEIsIHB1YmxpYyBDIHsKKyBwdWJsaWM6CisgIGludCBkOworICBpbnQgeDsKK307CisKK0QgZ19EOworCitjbGFzcyBFIDogcHVibGljIEQgeworIHB1YmxpYzoKKyAgaW50IGU7CisgIGludCB4OworfTsKKworRSBnX0U7CisKK2NsYXNzIGNsYXNzX3dpdGhfYW5vbl91bmlvbgoreworIHB1YmxpYzoKKyAgaW50IG9uZTsKKyAgdW5pb24KKyAgeworICAgIGludCBhOworICAgIGxvbmcgYjsKKyAgfTsKK307CisKK2NsYXNzX3dpdGhfYW5vbl91bmlvbiBnX2Fub25fdW5pb247CisKK3ZvaWQgaW5oZXJpdGFuY2UyICh2b2lkKQoreworfQorCit2b2lkIGluaGVyaXRhbmNlMSAodm9pZCkKK3sKKyAgaW50IGl2YWw7CisgIGludCAqaW50cDsKKworICAvLyB7QTo6YSwgQTo6eH0KKworICBnX0EuQTo6YSA9IDE7CisgIGdfQS5BOjp4ID0gMjsKKworICAvLyB7e0E6OmEsQTo6eH0sQjo6YixCOjp4fQorCisgIGdfQi5BOjphID0gMzsKKyAgZ19CLkE6OnggPSA0OworICBnX0IuQjo6YiA9IDU7CisgIGdfQi5COjp4ID0gNjsKKworICAvLyB7e0E6OmEsQTo6eH0sQzo6YyxDOjp4fQorCisgIGdfQy5BOjphID0gNzsKKyAgZ19DLkE6OnggPSA4OworICBnX0MuQzo6YyA9IDk7CisgIGdfQy5DOjp4ID0gMTA7CisKKyAgLy8ge3t7QTo6YSxBOjp4fSxCOjpiLEI6Onh9LHt7QTo6YSxBOjp4fSxDOjpjLEM6Onh9LEQ6OmQsRDo6eH0KKworICAvLyBUaGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uIGNvZGUgaXMgbm9uLXBvcnRhYmxlLCBidXQgYWxsb3dzIHVzCisgIC8vIHRvIGluaXRpYWxpemUgYWxsIG1lbWJlcnMgb2YgZ19EIHVudGlsIHdlIGNhbiBmaWxsIGluIHRoZSBtaXNzaW5nCisgIC8vIGluaXRpYWxpemF0aW9uIGNvZGUgd2l0aCBsZWdhbCBDKysgY29kZS4KKworICBmb3IgKGludHAgPSAoaW50ICopICZnX0QsIGl2YWwgPSAxMTsKKyAgICAgICBpbnRwIDwgKChpbnQgKikgJmdfRCArIHNpemVvZiAoZ19EKSAvIHNpemVvZiAoaW50KSk7CisgICAgICAgaW50cCsrLCBpdmFsKyspCisgICAgeworICAgICAgKmludHAgPSBpdmFsOworICAgIH0KKworICAvLyBPdmVybGF5IHRoZSBub25wb3J0YWJsZSBpbml0aWFsaXphdGlvbiB3aXRoIGxlZ2FsIGluaXRpYWxpemF0aW9uLgorCisgIC8vID8/Pz8/ID0gMTE7ICAoZ19ELkE6OmEgPSAxMTsgaXMgYW1iaWd1b3VzKQorICAvLyA/Pz8/PyA9IDEyOyAgKGdfRC5BOjp4ID0gMTI7IGlzIGFtYmlndW91cykKKyAgZ19ELkI6OmIgPSAxMzsKKyAgZ19ELkI6OnggPSAxNDsKKyAgLy8gPz8/Pz8gPSAxNTsKKyAgLy8gPz8/Pz8gPSAxNjsKKyAgZ19ELkM6OmMgPSAxNzsKKyAgZ19ELkM6OnggPSAxODsKKyAgZ19ELkQ6OmQgPSAxOTsKKyAgZ19ELkQ6OnggPSAyMDsKKworCisgIC8vIHt7e3tBOjphLEE6Onh9LEI6OmIsQjo6eH0se3tBOjphLEE6Onh9LEM6OmMsQzo6eH0sRDo6ZCxEOjp4fX0sRTo6ZSxFOjp4fQorCisgIC8vIFRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gY29kZSBpcyBub24tcG9ydGFibGUsIGJ1dCBhbGxvd3MgdXMKKyAgLy8gdG8gaW5pdGlhbGl6ZSBhbGwgbWVtYmVycyBvZiBnX0QgdW50aWwgd2UgY2FuIGZpbGwgaW4gdGhlIG1pc3NpbmcKKyAgLy8gaW5pdGlhbGl6YXRpb24gY29kZSB3aXRoIGxlZ2FsIEMrKyBjb2RlLgorCisgIGZvciAoaW50cCA9IChpbnQgKikgJmdfRSwgaXZhbCA9IDIxOworICAgICAgIGludHAgPCAoKGludCAqKSAmZ19FICsgc2l6ZW9mIChnX0UpIC8gc2l6ZW9mIChpbnQpKTsKKyAgICAgICBpbnRwKyssIGl2YWwrKykKKyAgeworICAgICppbnRwID0gaXZhbDsKKyAgfQorCisgIC8vIE92ZXJsYXkgdGhlIG5vbnBvcnRhYmxlIGluaXRpYWxpemF0aW9uIHdpdGggbGVnYWwgaW5pdGlhbGl6YXRpb24uCisKKyAgLy8gPz8/Pz8gPSAyMTsgIChnX0UuQTo6YSA9IDIxOyBpcyBhbWJpZ3VvdXMpCisgIC8vID8/Pz8/ID0gMjI7ICAoZ19FLkE6OnggPSAyMjsgaXMgYW1iaWd1b3VzKQorICBnX0UuQjo6YiA9IDIzOworICBnX0UuQjo6eCA9IDI0OworICAvLyA/Pz8/PyA9IDI1OworICAvLyA/Pz8/PyA9IDI2OworICBnX0UuQzo6YyA9IDI3OworICBnX0UuQzo6eCA9IDI4OworICBnX0UuRDo6ZCA9IDI5OworICBnX0UuRDo6eCA9IDMwOworICBnX0UuRTo6ZSA9IDMxOworICBnX0UuRTo6eCA9IDMyOworCisgIGdfYW5vbl91bmlvbi5vbmUgPSAxOworICBnX2Fub25fdW5pb24uYSA9IDI7CisKKyAgaW5oZXJpdGFuY2UyICgpOwkKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09IHZpcnR1YWwgYmFzZSBjbGFzc2VzPT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyB2QSB7CisgcHVibGljOgorICBpbnQgdmE7CisgIGludCB2eDsKK307CisKK3ZBIGdfdkE7CisKK2NsYXNzIHZCIDogcHVibGljIHZpcnR1YWwgdkEgeworIHB1YmxpYzoKKyAgaW50IHZiOworICBpbnQgdng7Cit9OworCit2QiBnX3ZCOworCitjbGFzcyB2QyA6IHB1YmxpYyB2aXJ0dWFsIHZBIHsKKyBwdWJsaWM6CisgIGludCB2YzsKKyAgaW50IHZ4OworfTsKKwordkMgZ192QzsKKworY2xhc3MgdkQgOiBwdWJsaWMgdmlydHVhbCB2QiwgcHVibGljIHZpcnR1YWwgdkMgeworIHB1YmxpYzoKKyAgaW50IHZkOworICBpbnQgdng7Cit9OworCit2RCBnX3ZEOworCitjbGFzcyB2RSA6IHB1YmxpYyB2aXJ0dWFsIHZEIHsKKyBwdWJsaWM6CisgIGludCB2ZTsKKyAgaW50IHZ4OworfTsKKwordkUgZ192RTsKKwordm9pZCBpbmhlcml0YW5jZTQgKHZvaWQpCit7Cit9CisKK3ZvaWQgaW5oZXJpdGFuY2UzICh2b2lkKQoreworICBpbnQgaXZhbDsKKyAgaW50ICppbnRwOworCisgIC8vIHt2QTo6dmEsIHZBOjp2eH0KKworICBnX3ZBLnZBOjp2YSA9IDE7CisgIGdfdkEudkE6OnZ4ID0gMjsKKworICAvLyB7e3ZBOjp2YSwgdkE6OnZ4fSwgdkI6OnZiLCB2Qjo6dnh9CisKKyAgZ192Qi52QTo6dmEgPSAzOworICBnX3ZCLnZBOjp2eCA9IDQ7CisgIGdfdkIudkI6OnZiID0gNTsKKyAgZ192Qi52Qjo6dnggPSA2OworCisgIC8vIHt7dkE6OnZhLCB2QTo6dnh9LCB2Qzo6dmMsIHZDOjp2eH0KKworICBnX3ZDLnZBOjp2YSA9IDc7CisgIGdfdkMudkE6OnZ4ID0gODsKKyAgZ192Qy52Qzo6dmMgPSA5OworICBnX3ZDLnZDOjp2eCA9IDEwOworCisgIC8vIHt7e3t2QTo6dmEsIHZBOjp2eH0sIHZCOjp2YiwgdkI6OnZ4fSwgdkM6OnZjLCB2Qzo6dnh9LCB2RDo6dmQsdkQ6OnZ4fQorCisgIGdfdkQudkE6OnZhID0gMTE7CisgIGdfdkQudkE6OnZ4ID0gMTI7CisgIGdfdkQudkI6OnZiID0gMTM7CisgIGdfdkQudkI6OnZ4ID0gMTQ7CisgIGdfdkQudkM6OnZjID0gMTU7CisgIGdfdkQudkM6OnZ4ID0gMTY7CisgIGdfdkQudkQ6OnZkID0gMTc7CisgIGdfdkQudkQ6OnZ4ID0gMTg7CisKKworICAvLyB7e3t7e3ZBOjp2YSx2QTo6dnh9LHZCOjp2Yix2Qjo6dnh9LHZDOjp2Yyx2Qzo6dnh9LHZEOjp2ZCx2RDo6dnh9LHZFOjp2ZSx2RTo6dnh9CisKKyAgZ192RC52QTo6dmEgPSAxOTsKKyAgZ192RC52QTo6dnggPSAyMDsKKyAgZ192RC52Qjo6dmIgPSAyMTsKKyAgZ192RC52Qjo6dnggPSAyMjsKKyAgZ192RC52Qzo6dmMgPSAyMzsKKyAgZ192RC52Qzo6dnggPSAyNDsKKyAgZ192RC52RDo6dmQgPSAyNTsKKyAgZ192RC52RDo6dnggPSAyNjsKKyAgZ192RS52RTo6dmUgPSAyNzsKKyAgZ192RS52RTo6dnggPSAyODsKKworICBpbmhlcml0YW5jZTQgKCk7CQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIEJhc2UxIHsKKyBwdWJsaWM6CisgIGludCB4OworICBCYXNlMShpbnQgaSkgeyB4ID0gaTsgfQorfTsKKworY2xhc3MgRm9vCit7CisgcHVibGljOgorICBpbnQgeDsKKyAgaW50IHk7CisgIHN0YXRpYyBpbnQgc3Q7CisgIEZvbyAoaW50IGksIGludCBqKSB7IHggPSBpOyB5ID0gajsgfQorICBpbnQgb3BlcmF0b3IhICgpOworICBvcGVyYXRvciBpbnQgKCk7CisgIGludCB0aW1lcyAoaW50IHkpOworfTsKKworY2xhc3MgQmFyIDogcHVibGljIEJhc2UxLCBwdWJsaWMgRm9vIHsKKyBwdWJsaWM6CisgIGludCB6OworICBCYXIgKGludCBpLCBpbnQgaiwgaW50IGspIDogQmFzZTEgKDEwKmspLCBGb28gKGksIGopIHsgeiA9IGs7IH0KK307CisKK2NsYXNzIENsYXNzV2l0aEVudW0geworcHVibGljOgorICBlbnVtIFByaXZFbnVtIHsgcmVkLCBncmVlbiwgYmx1ZSwgeWVsbG93ID0gNDIgfTsKKyAgUHJpdkVudW0gcHJpdl9lbnVtOworICBpbnQgeDsKK307CisKK2ludCBGb286Om9wZXJhdG9yISAoKSB7IHJldHVybiAheDsgfQorCitpbnQgRm9vOjp0aW1lcyAoaW50IHkpIHsgcmV0dXJuIHggKiB5OyB9CisKK2ludCBGb286OnN0ID0gMTAwOworCitGb286Om9wZXJhdG9yIGludCgpIHsgcmV0dXJuIHg7IH0KKworRm9vIGZvbygxMCwgMTEpOworQmFyIGJhcigyMCwgMjEsIDIyKTsKKworY2xhc3MgQ29udGFpbnNfc3RhdGljX2luc3RhbmNlCit7CisgcHVibGljOgorICBpbnQgeDsKKyAgaW50IHk7CisgIENvbnRhaW5zX3N0YXRpY19pbnN0YW5jZSAoaW50IGksIGludCBqKSB7IHggPSBpOyB5ID0gajsgfQorICBzdGF0aWMgQ29udGFpbnNfc3RhdGljX2luc3RhbmNlIG51bGw7Cit9OworCitDb250YWluc19zdGF0aWNfaW5zdGFuY2UgQ29udGFpbnNfc3RhdGljX2luc3RhbmNlOjpudWxsKDAsMCk7CitDb250YWluc19zdGF0aWNfaW5zdGFuY2UgY3NpKDEwLDIwKTsKKworY2xhc3MgQ29udGFpbnNfbmVzdGVkX3N0YXRpY19pbnN0YW5jZQoreworIHB1YmxpYzoKKyAgY2xhc3MgTmVzdGVkCisgIHsKKyAgIHB1YmxpYzoKKyAgICBOZXN0ZWQoaW50IGkpIDogeihpKSB7fQorICAgIGludCB6OworICAgIHN0YXRpYyBDb250YWluc19uZXN0ZWRfc3RhdGljX2luc3RhbmNlIHh4OworICB9OworCisgIENvbnRhaW5zX25lc3RlZF9zdGF0aWNfaW5zdGFuY2UoaW50IGksIGludCBqKSA6IHgoaSksIHkoaikge30KKworICBpbnQgeDsKKyAgaW50IHk7CisKKyAgc3RhdGljIENvbnRhaW5zX25lc3RlZF9zdGF0aWNfaW5zdGFuY2UgbnVsbDsKKyAgc3RhdGljIE5lc3RlZCB5eTsKK307CisKK0NvbnRhaW5zX25lc3RlZF9zdGF0aWNfaW5zdGFuY2UgQ29udGFpbnNfbmVzdGVkX3N0YXRpY19pbnN0YW5jZTo6bnVsbCgwLCAwKTsKK0NvbnRhaW5zX25lc3RlZF9zdGF0aWNfaW5zdGFuY2U6Ok5lc3RlZCBDb250YWluc19uZXN0ZWRfc3RhdGljX2luc3RhbmNlOjp5eSg1KTsKK0NvbnRhaW5zX25lc3RlZF9zdGF0aWNfaW5zdGFuY2UKKyAgQ29udGFpbnNfbmVzdGVkX3N0YXRpY19pbnN0YW5jZTo6TmVzdGVkOjp4eCgxLDIpOworQ29udGFpbnNfbmVzdGVkX3N0YXRpY19pbnN0YW5jZSBjbnNpKDMwLDQwKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgb25lOworICBpbnQgdHdvOworfSB0YWdsZXNzX3N0cnVjdDsKK3RhZ2xlc3Nfc3RydWN0IHZfdGFnbGVzczsKKworLyogVHJ5IHRvIGdldCB0aGUgY29tcGlsZXIgdG8gYWxsb2NhdGUgYSBjbGFzcyBpbiBhIHJlZ2lzdGVyLiAgKi8KK2NsYXNzIHNtYWxsIHsKKyBwdWJsaWM6CisgIGludCB4OworICBpbnQgbWV0aG9kICgpOworfTsKK2ludCBzbWFsbDo6bWV0aG9kICgpCit7CisgIHJldHVybiB4ICsgNTsKK30KK3ZvaWQgbWFya2VyX3JlZzEgKCkge30KKworaW50CityZWdpc3Rlcl9jbGFzcyAoKQoreworICAvKiBXZSBkb24ndCBjYWxsIGFueSBtZXRob2RzIGZvciB2LCBzbyBnY2MgdmVyc2lvbiBjeWdudXMtMi4zLjMtOTMwMjIwCisgICAgIG1pZ2h0IHB1dCB0aGlzIHZhcmlhYmxlIGluIGEgcmVnaXN0ZXIuICBUaGlzIGlzIGEgbG9zZSwgdGhvdWdoLCBiZWNhdXNlCisgICAgIGl0IG1lYW5zIHRoYXQgR0RCIGNhbid0IGNhbGwgYW55IG1ldGhvZHMgZm9yIHRoYXQgdmFyaWFibGUuICAqLworICByZWdpc3RlciBzbWFsbCB2OworCisgIGludCBpOworCisgIC8qIFBlcmZvcm0gYSBjb21wdXRhdGlvbiBzdWZmaWNpZW50bHkgY29tcGxpY2F0ZWQgdGhhdCBvcHRpbWl6aW5nIGNvbXBpbGVycworICAgICB3b24ndCBvcHRpbWl6ZWQgb3V0IHRoZSB2YXJpYWJsZS4gIElmIHNvbWUgY29tcGlsZXIgY29uc3RhbnQtZm9sZHMgdGhpcworICAgICB3aG9sZSBsb29wLCBtYXliZSB1c2luZyBhIHBhcmFtZXRlciB0byB0aGlzIGZ1bmN0aW9uIGhlcmUgd291bGQgaGVscC4gICovCisgIHYueCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAxMzsgKytpKQorICAgIHYueCArPSBpOworICAtLXYueDsgLyogdi54IGlzIG5vdyA3NyAqLworICBtYXJrZXJfcmVnMSAoKTsKKyAgcmV0dXJuIHYueCArIDU7Cit9CisKK2ludAorbWFpbigpCit7CisjaWZkZWYgdXNlc3R1YnMKKyAgc2V0X2RlYnVnX3RyYXBzKCk7CisgIGJyZWFrcG9pbnQoKTsKKyNlbmRpZgorICBpbmhlcml0YW5jZTEgKCk7CisgIGluaGVyaXRhbmNlMyAoKTsKKyAgcmVnaXN0ZXJfY2xhc3MgKCk7CisKKyAgLyogRklYTUU6IHBtaSBnZXRzIG9wdGltaXplZCBvdXQuICBOZWVkIHRvIGRvIHNvbWUgbW9yZSBjb21wdXRhdGlvbiB3aXRoCisgICAgIGl0IG9yIHNvbWV0aGluZy4gIChObyBvbmUgbm90aWNlcywgYmVjYXVzZSB0aGUgdGVzdCBpcyB4ZmFpbCdkIGFueXdheSwKKyAgICAgYnV0IHRoYXQgcHJvYmFibHkgd29uJ3QgYWx3YXlzIGJlIHRydWUuLi4pLiAgKi8KKyAgaW50IEZvbzo6KiBwbWkgPSAmRm9vOjp5OworCisgIC8qIE1ha2Ugc3VyZSB0aGUgQUlYIGxpbmtlciBkb2Vzbid0IHJlbW92ZSB0aGUgdmFyaWFibGUuICAqLworICB2X3RhZ2xlc3Mub25lID0gNTsKKworICAvKiBDbGFzcyB3aXRoIGVudW1lcmF0aW9uIGluc2lkZSBpdCAqLyAKKyAgQ2xhc3NXaXRoRW51bSBvYmpfd2l0aF9lbnVtOworICBvYmpfd2l0aF9lbnVtLnByaXZfZW51bSA9IENsYXNzV2l0aEVudW06OmdyZWVuOworCisgIHJldHVybiBmb28uKnBtaTsKK30KKworLyogQ3JlYXRlIGFuIGluc3RhbmNlIGZvciBzb21lIGNsYXNzZXMsIG90aGVyd2lzZSB0aGV5IGdldCBvcHRpbWl6ZWQgYXdheS4gICovCisKK2RlZmF1bHRfcHVibGljX3N0cnVjdCBkZWZhdWx0X3B1YmxpY19zOworZXhwbGljaXRfcHVibGljX3N0cnVjdCBleHBsaWNpdF9wdWJsaWNfczsKK3Byb3RlY3RlZF9zdHJ1Y3QgcHJvdGVjdGVkX3M7Citwcml2YXRlX3N0cnVjdCBwcml2YXRlX3M7CittaXhlZF9wcm90ZWN0aW9uX3N0cnVjdCBtaXhlZF9wcm90ZWN0aW9uX3M7CitwdWJsaWNfY2xhc3MgcHVibGljX2M7Citwcm90ZWN0ZWRfY2xhc3MgcHJvdGVjdGVkX2M7CitkZWZhdWx0X3ByaXZhdGVfY2xhc3MgZGVmYXVsdF9wcml2YXRlX2M7CitleHBsaWNpdF9wcml2YXRlX2NsYXNzIGV4cGxpY2l0X3ByaXZhdGVfYzsKK21peGVkX3Byb3RlY3Rpb25fY2xhc3MgbWl4ZWRfcHJvdGVjdGlvbl9jOwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvbW9yZS1zdGVwcy5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvbW9yZS1zdGVwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YmExZTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9tb3JlLXN0ZXBzLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qIEJlZ2luU291cmNlRmlsZSBtb3JlX3N0ZXBzLmMKKworICBUaGlzIGZpbGUgY3JlYXRlcyBhIGxvdCBvZiB0aHJlYWRzIHdoaWNoIHRoZW4gZXhlY3V0ZQorICBpbiBwYXJhbGxlbCwgc28gdGhhdCB3ZGIgY2FuIGJlIHRlc3RlZCBvbiBoYW5kbGluZworICBzaW11bHRhbmVvdXMgdGhyZWFkIGV2ZW50cy4KKworICBUbyBjb21waWxlOgorCisgICAgICBjYyAtQWUgK0RBMS4wIC1nIC1vIG1vcmVfc3RlcHMgLWxwdGhyZWFkIG1vcmVfc3RlcHMuYworCisgIFRvIHJ1bjoKKyAgCisgICAgIG1vcmVfdGhyZWFkcworKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCisjZGVmaW5lIE5fVEhSRUFEUyAzCisjZGVmaW5lIFBIQVNFUyAzCisKK3R5cGVkZWYgZW51bSB7CisgIFpFUk8sCisgIE9ORSwKKyAgVFdPLAorICBUSFJFRQorfSBwaGFzZV90OworCisvKiBVbmNvbW1lbnQgdG8gdHVybiBvbiBkZWJ1Z2dpbmcgb3V0cHV0ICovCisvKiAjZGVmaW5lIERFQlVHICAqLworCisvKiBMb2Nrcy4KKyAqLworaW50IGxvY2tfb25lOyAvKiBNYWluIFcsIG90aGVycyBSICovCitpbnQgbG9ja190d287IC8qIGRpdHRvICovCitpbnQgbG9ja19lbmRbIE5fVEhSRUFEUyBdOyAvKiBNYWluIFIsIG90aGVycyBSW2ldICovCitpbnQgcGhhc2VbIE5fVEhSRUFEUyBdOworCisvKiBSb3V0aW5lIGZvciBlYWNoIHRocmVhZCB0byBydW4uCisgKi8KK3ZvaWQgKnNwaW4oIHZwICkKKyAgICB2b2lkICogdnA7Cit7CisgICAgaW50IG1lID0gKGludCkgdnA7CisgICAgaW50IGk7CisKKyAgICBsb2NrX2VuZFsgbWUgXSA9IFRSVUU7CisKKyAgICBwaGFzZVsgbWUgXSA9IE9ORTsKKworICAgIHdoaWxlKCBsb2NrX29uZSApOworCisgICAgcGhhc2VbIG1lIF0gPSBUV087CisKKyAgICB3aGlsZSggbG9ja190d28gKTsKKworICAgIHBoYXNlWyBtZSBdID0gVEhSRUU7CisKKyAgICBsb2NrX2VuZFsgbWUgXSA9IEZBTFNFOworfQorCit2b2lkCitkb19wYXNzKCkKK3sKKyAgICBpbnQgaTsKKyAgICBwdGhyZWFkX3QgdFsgTl9USFJFQURTIF07CisgICAgaW50IGVycjsKKyAgICBpbnQgZG9uZTsKKworICAgIC8qIFN0YXJ0IE5fVEhSRUFEUyB0aHJlYWRzLCB0aGVuIGpvaW4gdGhlbSBzbworICAgICAqIHRoYXQgdGhleSBhcmUgdGVybWluYXRlZC4KKyAgICAgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgTl9USFJFQURTOyBpKysgKSB7CisgICAgICAgIGVyciA9IHB0aHJlYWRfY3JlYXRlKCAmdFtpXSwgTlVMTCwgc3BpbiwgKHZvaWQgKilpICk7CisgICAgICAgIGlmKCBlcnIgIT0gMCApIHsKKyAgICAgICAgICAgIHByaW50ZiggIj09IFN0YXJ0L3N0b3AsIGVycm9yIGluIHRocmVhZCAlZCBjcmVhdGVcbiIsIGkgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIERvIHBoYXNlIDEuCisgICAgICovCisgICAgbG9ja19vbmUgPSBGQUxTRTsKKworICAgIC8qIERvIHBoYXNlIDIuCisgICAgICovCisgICAgbG9ja190d28gPSBGQUxTRTsKKyAgICAKKyAgICAvKiBCZSBkb25lLgorICAgICAqLworICAgIGRvbmUgPSAwOworICAgIHdoaWxlKCAhZG9uZSApIHsKKworICAgICAgIC8qIEJlIG9wdGltaXN0aWMuCisgICAgICAgICovCisgICAgICAgZG9uZSA9IDE7CisgICAgICAgZm9yKCBpID0gMDsgaSA8IE5fVEhSRUFEUzsgaSsrICkgeworICAgICAgICAgICBpZiggbG9ja19lbmRbaV0gKSB7CisgICAgICAgICAgICAgICAvKiBUaHJlYWQgImkiIGlzIG5vdCByZWFkeSB5ZXQuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgIGRvbmUgPSAwOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIEZpbmlzaCB1cAorICAgICAqLworICAgIGZvciggaSA9IDA7IGkgPCBOX1RIUkVBRFM7IGkrKyApIHsKKyAgICAgICAgZXJyID0gcHRocmVhZF9qb2luKHRbaV0sIE5VTEwgKTsgICAgLyogTGluZSAxMDUgKi8KKyAgICAgICAgaWYoIGVyciAhPSAwICkgeyAgICAgICAgICAgICAgICAgICAgLyogTGluZSAxMDYgKi8KKyAgICAgICAgICAgIHByaW50ZiggIj09IFN0YXJ0L3N0b3AsIGVycm9yIGluIHRocmVhZCAlZCBqb2luXG4iLCBpICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpID0gMTA7ICAvKiBMaW5lIDEwOS4gIE51bGwgbGluZSBmb3Igc2V0dGluZyBicHRzIG9uLiAqLworfQorCittYWluKCBhcmdjLCBhcmd2ICkKK2ludCAgICBhcmdjOworY2hhciAqKmFyZ3Y7Cit7CisgICAgaW50IGk7CisgICAgCisgICAgLyogSW5pdAorICAgICAqLworICAgIGxvY2tfb25lID0gVFJVRTsKKyAgICBsb2NrX3R3byA9IFRSVUU7CisgICAgZm9yKCBpID0gMDsgaSA8IE5fVEhSRUFEUzsgaSsrICkgeworICAgICAgICBsb2NrX2VuZFtpXSA9IFRSVUU7CisgICAgICAgIHBoYXNlW2ldICAgID0gWkVSTzsKKyAgICB9CisgICAgCisgICAgZG9fcGFzcygpOworICAgIHJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL21vcmUtc3RlcHMuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvbW9yZS1zdGVwcy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwYTBkNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL21vcmUtc3RlcHMuZXhwCkBAIC0wLDAgKzEsMTUyIEBACisjIG1vcmUtc3RlcHMuZXhwIC0tIEV4cGVjdCBzY3JpcHQgdG8gdGVzdCBnZGIncyBhYmlsaXR5IHRvIHN0ZXAgdGhyZWFkZWQgcGdtcworIyBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyB1c2UgdGhpcyB0byBkZWJ1ZzoKKyMKKyNsb2dfdXNlciAxCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCisjaWYgeyAhW2lzdGFyZ2V0ICJocHBhKi0qLWhwdXgxMC4zMCJdICYmICFbaXN0YXJnZXQgImhwcGEqLSotaHB1eDExLioiXSB9IHsKKyMgICAgdmVyYm9zZSAiSFBVWCB0aHJlYWQgdGVzdCBpZ25vcmVkIGZvciBub24taHBwYSBvciBwcmUtSFAvVVgtMTAuMzAgdGFyZ2V0cy4iCisjICAgIHJldHVybiAwCisjfQorCitzZXQgdGVzdGZpbGUgbW9yZS1zdGVwcworc2V0IHNyY2ZpbGUgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9XSB7CisgICAgcmV0dXJuIC0xCit9CisKKyMgVG8gYnVpbGQgdGhlIGV4ZWN1dGFibGUgd2UgbmVlZCB0byBsaW5rIGFnYWluc3QgdGhlIHRocmVhZCBsaWJyYXJ5LgorIworIyAgICAgY2MgLUFlIC1nIC1vIG1vcmUtc3RlcHMgLWxwdGhyZWFkIG1vcmUtc3RlcHMuYworIworI2NvbXBpbGUgIiR7c3JjZmlsZX0gLUFlIC1nIC1scHRocmVhZCAtbyAke2JpbmZpbGV9IgorCitpZiB7JGdjY19jb21waWxlZCA9PSAwfSB7CisgICAgc2V0IGFkZGl0aW9uYWxfZmxhZ3MgImFkZGl0aW9uYWxfZmxhZ3M9LUFlIgorfSBlbHNlIHsKKyAgICBzZXQgYWRkaXRpb25hbF9mbGFncyAiIgorfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0uYyIgIiR7YmluZmlsZX0ubyIgb2JqZWN0IFtsaXN0IGRlYnVnICRhZGRpdGlvbmFsX2ZsYWdzXV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCitpZiB7ICFbaXN0YXJnZXQgImhwcGEqLSotaHB1eDEwLjMwIl0gJiYgIVtpc3RhcmdldCAiaHBwYSotKi1ocHV4MTEuKiJdIH0geworICAgIGlmIHsgW2dkYl9jb21waWxlICIke2JpbmZpbGV9Lm8iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlICB7ZGVidWcgImFkZGl0aW9uYWxfZmxhZ3M9LWxwdGhyZWFkIn1dICE9ICIifSB7CisJZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBsaW5rIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCisgICAgfQorfSBlbHNlIHsKKyAgICByZW1vdGVfZXhlYyBidWlsZCAibGQgL3Vzci9jY3MvbGliL2NydDAubyAke2JpbmZpbGV9Lm8gLWxjbCAtbHB0aHJlYWQgIC1sYyAvb3B0L2xhbmd0b29scy9saWIvZW5kLm8gLW8gJHtiaW5maWxlfSIKK30KKyNyZW1vdGVfZXhlYyBidWlsZCAibGQgL3Vzci9jY3MvbGliL2NydDAubyAke2JpbmZpbGV9Lm8gLWxjbCAtbHB0aHJlYWQgIC1sYyAvb3B0L2xhbmd0b29scy9saWIvZW5kLm8gLW8gJHtiaW5maWxlfSIKKworCisKKyMgVGhyZWFkIHN0dWZmIGlzIF9zbG93XzsgcHJlcGFyZSBmb3IgbG9uZyB3YWl0cy4KKyMKK3NldCBvbGR0aW1lb3V0ICR0aW1lb3V0CitzZXQgdGltZW91dCBbZXhwciAiJHRpbWVvdXQgKyAzMDAiXQorc2V0IG9sZHZlcmJvc2UgJHZlcmJvc2UKKyNzZXQgdmVyYm9zZSA0MAorCisjIEZ1cnRoZXIsIHRoaXMgdGVzdCBoYXMgc29tZSAibnVsbCIgbGluZXMgZGVzaWduZWQKKyMgdG8gY29uc3VtZSBvdXRwdXQgZnJvbSBnZGIgdGhhdCB3YXMgdG9vIGxhdGUgdG8gYmUKKyMgbWF0Y2hlZCAoc2VxdWVuY2UgaXMgImdkYl90ZXN0IiBzZW5kczsgdGltZW91dCBhbmQKKyMgb24gdG8gbmV4dCBzZW5kOyByZXN1bHQgZmluYWxseSBjb21lcyBpbjsgbWlzbWF0Y2gpLgorIworIyBUaGUgbnVsbCBjb21tYW5kIGlzICdnZGJfdGVzdCAicCBcJHBjIiAiLioiICIiJworIworIyBOT1RFOiB0byBwYXNzIGEgbGl0ZXJhbCAiJCIsICIvIiBvciAiKiIgKGV0Yy4pIHRvIGdkYl90ZXN0LCAKKyMgICAgICAgcmVtZW1iZXIgdGhhdCB0aGUgcGF0dGVybiB3aWxsIGJlIGVzY2FwZWQgb25jZSBhbmQgCisjICAgICAgICQtZXZhbHVhdGVkIHR3aWNlOgorIworIyAgICAgICAgICAiXFxcKiIgbWF0Y2hlcyAiXCoiCisjICAgICAgICAgICJcJCIgIG1hdGNoZXMgIiQiCisjCitwcm9jIGZpeF90aW1lb3V0IHt9IHsKKyAgICBnZGJfdGVzdCAicCBcJHBjIiAiLioiICIiCit9CisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNpbXBsZSBzYW5pdHkgdGVzdCBmaXJzdC4KKyMKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisjIEZpcnN0LCBzdGVwIGluIHRoZSBtYWluIHRocmVhZC4KKyMKK2dkYl90ZXN0ICJiIGRvX3Bhc3MiICIuKkJyZWFrcG9pbnQgMS4qIiAiIgorZ2RiX3Rlc3QgInIiICIuKkJyZWFrcG9pbnQgMS4qZG9fcGFzcy4qIiAiIgorCisjIEJyZWFrcyBhcyB3ZWxsIGFzIG5leHRzIHRvIG1ha2UKKyMgc3VyZSB3ZSBjYW4gaGFuZGxlIHNpbXVsdGFuZW91cyBoaXQKKyMgb2YgYnB0IGFuZCBzdGVwLCBhcyB3ZWxsIGFzIHN0ZXBwaW5nCisjIHBhc3QgYnB0cy4KKyMKK2dkYl90ZXN0ICJ0YiA4NyIgIi4qQnJlYWtwb2ludCAyLioiICIiCitnZGJfdGVzdCAidGIgOTEiICIuKkJyZWFrcG9pbnQgMy4qIiAiIgorZ2RiX3Rlc3QgInRiIDk2IiAiLipCcmVha3BvaW50IDQuKiIgIiIKK2dkYl90ZXN0ICJ0YiAxMTMiICIuKkJyZWFrcG9pbnQgNS4qIiAiIgorZ2RiX3Rlc3QgImMiICIuKmRvX3Bhc3MuKjg3LioiICI4NyIKK2dkYl90ZXN0ICJuIiAiLipkb19wYXNzLio5MS4qIiAibiIKKworIyBUaGlzIG9ubHkgZ2V0cyBhIG51bWJlciwgYXMgaXQgZG9lc24ndAorIyBoaXQgYSBicHQuCisjCitnZGJfdGVzdCAibiIgIi4qOTUuKiIgIm4iCisKK2dkYl90ZXN0ICJuIiAiLipkb19wYXNzLio5Ni4qIiAibiIKK2dkYl90ZXN0ICJjIiAiLipkb19wYXNzLioxMTMuKiIgImMiCitnZGJfdGVzdCAiYyIgIi4qUHJvZ3JhbSBleGl0ZWQgbm9ybWFsbHkuKiIgImMiCisKKyMgTm93IHN0ZXAgaW4gYSB0aHJlYWQKKyMKK2dkYl90ZXN0ICJyIiAiLipCcmVha3BvaW50Lipkb19wYXNzLioiICJkb19wYXNzIgorZ2RiX3Rlc3QgInVudGlsIDg3IiAiLipkb19wYXNzLio4Ny4qIiAidW50aWwiCitnZGJfdGVzdCAidGhyIDQiICIuKlN3aXRjaGluZyB0byB0aHJlYWQgNC4qc3Bpbi4qNTYuKiIgInN3aXRjaCIKK2dkYl90ZXN0ICJ0YiA2MCB0aHIgNCIgIi4qQnJlYWtwb2ludC4qIiAiIgorCisjIElmIHdlIGRvICJuZXh0IiBub3csIGFsbCB0aGUgb3RoZXIgdGhyZWFkcyAKKyMgY2FuIGZpbmlzaCEKKyMKK2dkYl90ZXN0ICJuIiAgICAiLipzcGluLio2MC4qIiAiIgorZ2RiX3Rlc3QgImkgdGgiICIuKlxcXCogNCBzeXMuKnNwaW4uKjEgc3lzLipkb19wYXNzLioiICJzdGlsbCBpbiA0IgorCisjIERvbmUhCisjCitnZGJfZXhpdAorCitzZXQgdGltZW91dCAkb2xkdGltZW91dAorc2V0IHZlcmJvc2UgJG9sZHZlcmJvc2UKKworIyBleGVjdXRlX2FueXdoZXJlICJybSAtZiAke2JpbmZpbGV9IgorIworcmV0dXJuIDAKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvbmFtZXNwYWNlLmNjIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvbmFtZXNwYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZDViZDYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9uYW1lc3BhY2UuY2MKQEAgLTAsMCArMSwxMDMgQEAKK25hbWVzcGFjZSBBQUEgeworICBjaGFyIGM7CisgIGludCBpOworICBpbnQgQV9mb28gKGludCk7CisgIGNoYXIgZm9vIChjaGFyKTsKKyAgY2xhc3MgaW5BIHsKKyAgcHVibGljOgorICAgIGludCB4eDsKKyAgICBpbnQgZnVtIChpbnQpOworICB9OworfTsKKworaW50IEFBQTo6aW5BOjpmdW0gKGludCBpKQoreworICByZXR1cm4gMTAgKyBpOworfQorCituYW1lc3BhY2UgQkJCIHsKKyAgY2hhciBjOworICBpbnQgaTsKKyAgaW50IEJfZm9vIChpbnQpOworICBjaGFyIGZvbyAoY2hhcik7CisKKyAgbmFtZXNwYWNlIENDQyB7CisgICAgY2hhciBmb28gKGNoYXIpOworICB9OworCisgIGNsYXNzIENsYXNzIHsKKyAgcHVibGljOgorICAgIGNoYXIgZm9vIChjaGFyKTsKKyAgICBpbnQgZHVtbXk7CisgIH07Cit9OworCitpbnQgQUFBOjpBX2ZvbyAoaW50IHgpCit7CisgIHJldHVybiAyICogeDsKK30KKworY2hhciBBQUE6OmZvbyAoY2hhciBjKQoreworICByZXR1cm4gJ2EnOworfQorCisKK2ludCBCQkI6OkJfZm9vIChpbnQgeCkKK3sKKyAgcmV0dXJuIDMgKiB4OworfQorCitjaGFyIEJCQjo6Zm9vIChjaGFyIGMpCit7CisgIHJldHVybiAnYic7Cit9CisKK2NoYXIgQkJCOjpDQ0M6OmZvbyAoY2hhciBjKQoreworICByZXR1cm4gJ3onOworfQorCitjaGFyIEJCQjo6Q2xhc3M6OmZvbyAoY2hhciBjKQoreworICByZXR1cm4gJ28nOworfQorCit2b2lkIG1hcmtlcjEodm9pZCkKK3sKKyAgcmV0dXJuOworfQorCisKK2ludCBtYWluICgpCit7CisgIHVzaW5nIEFBQTo6aW5BOworICBjaGFyIGMxOworCisgIHVzaW5nIG5hbWVzcGFjZSBCQkI7CisgIAorICBjMSA9IGZvbyAoJ3gnKTsKKyAgYzEgPSBBQUE6OmZvbyAoJ3gnKTsKKyAgYzEgPSBCQkI6OkNDQzo6Zm9vICgnbScpOworICAKKyAgaW5BIGluYTsKKworICBpbmEueHggPSAzMzsKKworICBpbnQgeTsKKworICB5ID0gQUFBOjpBX2ZvbyAoMzMpOworICB5ICs9IEJfZm9vICg0NCk7CisKKyAgQkJCOjpDbGFzcyBjbDsKKworICBjMSA9IGNsLmZvbygnZScpOworCisgIG1hcmtlcjEoKTsKKyAgCit9CisKKyAgCisKKworCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC9uYW1lc3BhY2UuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvbmFtZXNwYWNlLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzA4ZGI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvbmFtZXNwYWNlLmV4cApAQCAtMCwwICsxLDE5NSBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgdGVzdHMgZm9yIG5hbWVzcGFjZXMKKyMgV3JpdHRlbiBieSBTYXRpc2ggUGFpIDxwYWlAYXBvbGxvLmhwLmNvbT4gMTk5Ny0wNy0yMworCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBnZGIgdGVzdHN1aXRlCisKKyMgTm90ZTogVGhlc2UgdGVzdHMgYXJlIGdlYXJlZCB0byB0aGUgSFAgYUNDIGNvbXBpbGVyLAorIyB3aGljaCBoYXMgYW4gaWRpb3N5bmNyYXRpYyB3YXkgb2YgZW1pdHRpbmcgZGVidWcgaW5mbworIyBmb3IgbmFtZXNwYWNlcy4KKworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCisgICAgICAgIH0KKworCisjCisjIHRlc3QgcnVubmluZyBwcm9ncmFtcworIworCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJuYW1lc3BhY2UiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0geworICAgIHJldHVybiAtMTsKK30KKyAKKyAKK2lmIHtbc2tpcF9ocF90ZXN0cyAkZ2NjX2NvbXBpbGVkXX0gdGhlbiB7IGNvbnRpbnVlIH0KKworCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIGMrK31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYQordXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKKworIworIyBzZXQgaXQgdXAgYXQgYSBicmVha3BvaW50IHNvIHdlIGNhbiBwbGF5IHdpdGggdGhlIHZhcmlhYmxlIHZhbHVlcworIworaWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgICBwZXJyb3IgImNvdWxkbid0IHJ1biB0byBicmVha3BvaW50IgorICAgIGNvbnRpbnVlCit9CisKK3NlbmRfZ2RiICJicmVhayBtYXJrZXIxXG4iIDsgZ2RiX2V4cGVjdCAtcmUgIi4qJGdkYl9wcm9tcHQgJCIKKyAgICBzZW5kX2dkYiAiY29udFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIkJyZWFrLiogbWFya2VyMSBcXChcXCkgYXQgLio6JGRlY2ltYWwuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIHNlbmRfZ2RiICJ1cFxuIgorICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAidXAgZnJvbSBtYXJrZXIxIiB9CisgICAgICAgICAgICAgICAgdGltZW91dCB7IGZhaWwgInVwIGZyb20gbWFya2VyMSIgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJjb250aW51ZSB0byBtYXJrZXIxIiAgfQorICAgICAgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGNvbnRpbnVlIHRvIG1hcmtlcjEiICB9CisgICAgfQorCisjIEFjY2VzcyBhIGRhdGEgaXRlbSBpbnNpZGUgYSBuYW1lc3BhY2UgdXNpbmcgY29sb25zIGFuZAorIyBzaW5nbGUgcXVvdGVzIDotKAorCitzZW5kX2dkYiAicHJpbnQgJ0FBQTo6YydcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcXCRcWzAtOVxdKiA9IDAgJ1xcXFwwMDAnXHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgJ0FBQTo6YyciIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50ICdBQUE6OmMnIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50ICdBQUE6OmMnIiB9Cit9CisKKyMgQW4gb2JqZWN0IGRlY2xhcmVkIHVzaW5nICJ1c2luZyIuCisKK3NlbmRfZ2RiICJwcmludCBpbmFcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcXCRcWzAtOVxdKyA9IHt4eCA9IDMzfS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgcGFzcyAicHJpbnQgaW5hIgorICAgfQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgaW5hIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50IGluYSIgfQorfQorCitzZW5kX2dkYiAicHR5cGUgaW5hXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAidHlwZSA9IGNsYXNzIEFBQTo6aW5BIFx7XHJcblxbIFxdKnB1YmxpYzpcclxuXFsgXF0qaW50IHh4O1xyXG5cWyBcXSpcclxuXFsgXF0qaW50IGZ1bVxcKGludFxcKTtcclxuXH1cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgIHBhc3MgInB0eXBlIGluYSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInB0eXBlIGluYSIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBpbmEiIH0KK30KKworIyBDaGVjayBhbGwgZnVuY3Rpb25zIGFyZSBrbm93biB0byBHREIKKworc2VuZF9nZGIgImluZm8gZnVuYyBmb29cbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJBbGwgZnVuY3Rpb25zLipGaWxlLipuYW1lc3BhY2UuY2M6XHJcbmludCBBQUE6OkFfZm9vXFwoaW50XFwpO1xyXG5pbnQgQkJCOjpCX2Zvb1xcKGludFxcKTtcclxuY2hhciBBQUE6OmZvb1xcKGNoYXJcXCk7XHJcbmNoYXIgQkJCOjpmb29cXChjaGFyXFwpO1xyXG5jaGFyIEJCQjo6Q0NDOjpmb29cXChjaGFyXFwpO1xyXG5jaGFyIEJCQjo6Q2xhc3M6OmZvb1xcKGNoYXJcXCk7XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICBwYXNzICJpbmZvIGZ1bmMgZm9vIgorICAgfSAgICAKKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImluZm8gZnVuYyBmb28iIH0KKyAgIHRpbWVvdXQgeyBmYWlsICIodGltZW91dCkgaW5mbyBmdW5jIGZvbyIgfQorfQorCisjIENhbGwgYSBmdW5jdGlvbiBpbiBhIG5hbWVzcGFjZQorCitzZW5kX2dkYiAicHJpbnQgJ0FBQTo6Zm9vJygneCcpXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiXFwkXFswLTlcXSogPSA5NyAnYSdcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgIHBhc3MgInByaW50ICdBQUE6OmZvbycoJ3gnKSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50ICdBQUE6OmZvbycoJ3gnKSIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBwcmludCAnQUFBOjpmb28nKCd4JykiIH0KK30KKyAgICAgICAKKyMgQnJlYWsgb24gYSBmdW5jdGlvbiBpbiBhIG5hbWVzcGFjZQorCitzZW5kX2dkYiAiYnJlYWsgQUFBOjpmb29cbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiQnJlYWtwb2ludC4qYXQgJGhleDogZmlsZS4qbmFtZXNwYWNlLmNjLCBsaW5lIDQyXFwuXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgIHBhc3MgImJyZWFrIEFBQTo6Zm9vIgorICAgIH0gICAgCisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJicmVhayBBQUE6OmZvbyIgfQorICAgdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSBicmVhayBBQUE6OmZvbyIgfQorfQorCisjIENhbGwgYSBmdW5jdGlvbiBpbiBhIG5lc3RlZCBuYW1lc3BhY2UKKworc2VuZF9nZGIgInByaW50ICdCQkI6OkNDQzo6Zm9vJygneCcpXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiXFwkXFswLTlcXSogPSAxMjIgJ3onXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICBwYXNzICJwcmludCAnQkJCOjpDQ0M6OmZvbycoJ3gnKSIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50ICdCQkI6OkNDQzo6Zm9vJygneCcpIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50ICdCQkI6OkNDQzo6Zm9vJygneCcpIiB9Cit9CisgICAgICAgCisjIEJyZWFrIG9uIGEgZnVuY3Rpb24gaW4gYSBuZXN0ZWQgbmFtZXNwYWNlCisKK3NlbmRfZ2RiICJicmVhayBCQkI6OkNDQzo6Zm9vXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIkJyZWFrcG9pbnQuKmF0ICRoZXg6IGZpbGUuKm5hbWVzcGFjZS5jYywgbGluZSA1OFxcLlxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICBwYXNzICJicmVhayBCQkI6OkNDQzo6Zm9vIgorICAgIH0gICAgCisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJicmVhayBCQkI6OkNDQzo6Zm9vIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGJyZWFrIEJCQjo6Q0NDOjpmb28iIH0KK30KKworIyBQcmludCBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gaW4gYSBjbGFzcyBpbiBhIG5hbWVzcGFjZQorCitzZW5kX2dkYiAicHJpbnQgJ0JCQjo6Q2xhc3MnOjpmb29cbiIKK2dkYl9leHBlY3QgeworICAgLXJlICJcXCRcWzAtOVxdKiA9IFx7Y2hhciBcXChCQkI6OkNsYXNzIFxcKiwgY2hhclxcKVx9ICRoZXggPEJCQjo6Q2xhc3M6OmZvb1xcKGNoYXJcXCk+XHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICBwYXNzICJwcmludCAnQkJCOjpDbGFzcyc6OmZvbyIKKyAgIH0KKyAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50ICdCQkI6OkNsYXNzJzo6Zm9vIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIHByaW50ICdCQkI6OkNsYXNzJzo6Zm9vIiB9Cit9CisKKyMgQnJlYWsgb24gYSBmdW5jdGlvbiBpbiBhIGNsYXNzIGluIGEgbmFtZXNwYWNlCisKK3NlbmRfZ2RiICJicmVhayBCQkI6OkNsYXNzOjpmb29cbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiQnJlYWtwb2ludC4qYXQgJGhleDogZmlsZS4qbmFtZXNwYWNlLmNjLCBsaW5lIDYzXFwuXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgIHBhc3MgImJyZWFrIEJCQjo6Q2xhc3M6OmZvbyIKKyAgICB9ICAgIAorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiYnJlYWsgQkJCOjpDbGFzczo6Zm9vIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIGJyZWFrIEJCQjo6Q2xhc3M6OmZvbyIgfQorfQorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC9vcHRpbWl6ZS5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvb3B0aW1pemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYThkYWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvb3B0aW1pemUuYwpAQCAtMCwwICsxLDc2IEBACisvKiBTb3VyY2UgZm9yIGRlYnVnZ2luZyBvcHRpbWltemVkIGNvZGUgdGVzdC4KKworICAgIGNjIC1nIC1PIC1vIG9wdGltaXplIG9wdGltaXplLmMKKyovCitpbnQgY2FsbGVlKCk7CitpbnQgdGVzdF9vcHQ7CisKK2ludCBtYWluKCkKK3sKKyAgIGludCBhLGIsYyxkLGUsZixnLGg7CisKKyAgIGEgPSAxMDs7CisKKyAgIC8qIFZhbHVlIHByb3BhZ2F0ZQorICAgICovCisgICBiID0gMiAqIGEgKyAxOworICAgYyA9IDMgKiBiICsgMjsKKworICAgLyogUmUtdXNlIGV4cHJlc3Npb25zCisgICAgKi8KKyAgIGQgPSAoMiAqIGEgKyAxKSAqICgzICogYiArIDIpOworICAgZSA9ICgyICogYSArIDEpICogKDMgKiBiICsgMik7CisKKyAgIC8qIENyZWF0ZSBkZWFkIHN0b3Jlcy0tZG8gbGluZXMgc3RpbGwgZXhpc3Q/CisgICAgKi8KKyAgIGQgPSAoMiAqIGEgKyAxKSAqICgzICogYiArIDIpOworICAgZSA9ICgyICogYSArIDEpICogKDMgKiBiICsgMik7CisgICBkID0gKDIgKiBhICsgMSkgKiAoMyAqIGIgKyAyKTsKKyAgIGUgPSAoMiAqIGEgKyAxKSAqICgzICogYiArIDIpOworCisgICAvKiBBbHBoYSBhbmQgcHNpIG1vdGlvbgorICAgICovCisgICBpZiggdGVzdF9vcHQgKSB7CisgICAgICAgZiA9IGUgLSBkOworICAgICAgIGYgPSBmLS07CisgICB9CisgICBlbHNlIHsKKyAgICAgICBmID0gZSAtIGQ7CisgICAgICAgZiA9IGYgKyBkICogZTsKKyAgIH0KKworICAgLyogQ2hpIGFuZCBSaG8gbW90aW9uCisgICAgKi8KKyAgIGggPSAwOworICAgZG8geworICAgICAgIGgrKzsKKyAgICAgICBhID0gYiAqIGMgKyBkICogZTsgIC8qIENoaSAqLworICAgICAgIGYgPSBmICsgZCAqIGU7CisgICAgICAgZyA9IGYgKyBkICogZTsgICAgICAvKiBSaG8gKi8KKyAgICAgICBjYWxsZWUoIGcrMSApOworICAgICAgIHRlc3Rfb3B0ID0gKHRlc3Rfb3B0ICE9IDEpOyAgLyogQ3ljbGVzICovCisgICB9IHdoaWxlKCBnICYmIGggPCAxMCk7CisKKyAgIC8qIE9wcHMgZm9yIHRhaWwgcmVjdXJzaW9uLCB1bnJvbGxpbmcsCisgICAgKiBmb2xkaW5nLCBldmFwb3JhdGluZworICAgICovCisgICBmb3IoIGEgPSAwOyBhIDwgMTAwOyBhKysgKSB7CisgICAgICAgY2FsbGVlKCBjYWxsZWUgKCBjYWxsZWUoIGEgKSkpOworICAgICAgIGNhbGxlZSggY2FsbGVlICggY2FsbGVlKCBhICkpKTsKKyAgICAgICBjYWxsZWUoIGNhbGxlZSAoIGNhbGxlZSggYSApKSk7CisgICB9CisKKyAgIHJldHVybiBjYWxsZWUoIHRlc3Rfb3B0ICk7Cit9CisKKy8qIGRlZmluZWQgbGF0ZSB0byBrZWVwIGxpbmUgbnVtYmVycyB0aGUgc2FtZQorKi8KK2ludCBjYWxsZWUoIHggKQorICAgIGludCB4OyAgICAgIC8qIG5vdCB1c2VkISAqLworeworICAgIHRlc3Rfb3B0Kys7IC8qIHNpZGUgZWZmZWN0ICovCisKKyAgICByZXR1cm4gdGVzdF9vcHQ7Cit9CisKKy8qIGVuZCAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL29wdGltaXplLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL29wdGltaXplLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDYwNmViCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvb3B0aW1pemUuZXhwCkBAIC0wLDAgKzEsMTQ0IEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIG9wdGltaXplLmV4cCAtLSBFeHBlY3Qgc2NyaXB0IGZvciB0ZXN0aW5nIGFwcHMgY29tcGlsZWQgd2l0aCAtTworCitnbG9iYWwgdGltZW91dAorCisjIHVzZSB0aGlzIHRvIGRlYnVnOgorIworI2xvZ191c2VyIDEKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCB0ZXN0ZmlsZSBvcHRpbWl6ZQorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0geworICAgIHJldHVybiAtMTsKK30KKworIAoraWYge1tza2lwX2hwX3Rlc3RzICRnY2NfY29tcGlsZWRdfSB0aGVuIHsgY29udGludWUgfQorCisKKyMgVmFuaWxsYSAtTywgd2hpY2ggaXMgdGhlIHNhbWUgYXMgK08yCisjCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIG9wdGltaXplPStPMn1dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKworc2VuZF9nZGIgImZpbGUgJGJpbmZpbGVcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipubyBkZWJ1Z2dpbmcgc3ltYm9scyBmb3VuZC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBmYWlsICJEaWRuJ3QgZmluZCBkZWJ1ZyBzeW1ib2xzOyBDSEZ0czIzNDg4IiAKKyAgICB9CisgICAgLXJlICIuKk5vIGhlYWRlciBzZWN0aW9uIChQWERCIGRhdGEpLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIGZhaWwgInBvaW50bGVzcyB3YXJuaW5nIgorICAgIH0KKyAgICAtcmUgIi4qZG9uZS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJsb2FkIGRlYnVnIHN5bWJvbHMiCisgICAgfQorICAgIHRpbWVvdXQgeyBmYWlsICJ0aW1lb3V0IG9uIGZpbGUiIH0KK30KKworIyBUd28gbGluZXMgYXQgdGhlIHNhbWUgcGxhY2UgYWZ0ZXIgb3B0LgorIworZ2RiX3Rlc3QgImIgMjgiICAgIi4qIiAiIgorZ2RiX3Rlc3QgImIgMjYiICAgIi4qYWxzbyBzZXQgYXQuKiIgInNhbWUgbGluZSIKKworZ2RiX3Rlc3QgImIgNDciICAgIi4qIiAiIgorZ2RiX3Rlc3QgImIgNDgiICAgIi4qYWxzbyBzZXQgYXQuKiIgInNhbWUgbGluZSIKKworZ2RiX3Rlc3QgInRiIG1haW4iICIuKiIgIiIKKworc2V0IG9sZF90aW1lb3V0ICR0aW1lb3V0CitzZXQgdGltZW91dCBbZXhwciAiJHRpbWVvdXQgKyAyMDAiXQorc2VuZF9nZGIgInJcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipObyBoZWFkZXIgc2VjdGlvbiAoUFhEQiBkYXRhKS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBmYWlsICJwb2ludGxlc3Mgd2FybmluZyIKKyAgICB9CisgICAgLXJlICIuKm1haW4uKjJcWzEyXS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAjIEFsbCB0aGUgbGluZXMgYmVmb3JlIGxpbmUgMjEgb3IgMjIgYXJlIAorICAgICAgICAjIGV2YXBvcmF0ZWQgYnkgdGhlIGNvbXBpbGVyLgorICAgICAgICAjIAorICAgICAgICBwYXNzICJoaXQgbWFpbiIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAiZGlkbid0IGhpdCBtYWluIgorICAgIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAidGltZW91dCBvbiBydW4iIH0KK30KK3NldCB0aW1lb3V0ICRvbGRfdGltZW91dAorCitnZGJfdGVzdCAiYyIgIi4qQnJlYWtwb2ludCAxLiozMy4qIiAiIgorZ2RiX3Rlc3QgImMiICIuKjUxLioiICAgICAgICAgICAgICAgIiIKK2dkYl90ZXN0ICJjbGUiICIuKkRlbGV0ZWQgYnJlYWtwb2ludHMuKiIgInNldCAyLCBzbyBkZWwgMiIKKworZ2RiX3Rlc3QgImIgY2FsbGVlIiAiLioiICAiIgorZ2RiX3Rlc3QgImMiICIuKmNhbGxlZS4qIiAiaGl0IGNhbGxlZCBydG4iCisKK2dkYl9leGl0CisKKyMgK080LCBkb24ndCB1c2UgLWcKKyMKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7b3B0aW1pemU9K080fV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCitzZW5kX2dkYiAiZmlsZSAkYmluZmlsZVxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKm5vIGRlYnVnZ2luZyBzeW1ib2xzIGZvdW5kLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgIkRpZG4ndCBmaW5kIGRlYnVnIHN5bWJvbHMsIGFzIGV4cGVjdGVkIgorICAgIH0KKyAgICAtcmUgIi4qTm8gaGVhZGVyIHNlY3Rpb24gKFBYREIgZGF0YSkuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAicG9pbnRsZXNzIHdhcm5pbmciCisgICAgfQorICAgIC1yZSAiLipkb25lLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIGZhaWwgIlNvbWVob3cgZm91bmQgZGVidWcgc3ltYm9scy0tbWFrZSB0aGlzIGEgcGFzcz8iCisgICAgfQorICAgIHRpbWVvdXQgeyBmYWlsICJ0aW1lb3V0IG9uIGZpbGUiIH0KK30KKworZ2RiX3Rlc3QgImIgbWFpbiIgICAiLioiICIiCitnZGJfdGVzdCAiYiBjYWxsZWUiICIuKiIgIiIKK2dkYl90ZXN0ICJyIiAgICAgICAgIi4qQnJlYWtwb2ludCAxLiptYWluLioiICIiCitnZGJfdGVzdCAic2kgMyIgICAgICIuKm1haW4uKiIgInN0ZXBzIgorZ2RiX3Rlc3QgIngvNGkgXCRwYyIgIi4qbWFpbi4qbWFpbis0LiptYWluKzguKiIgIiIKK2dkYl90ZXN0ICJjIiAgICAgICAgIi4qY2FsbGVlLioiICJoaXQgYnAiCitnZGJfdGVzdCAiZGlzYXMiICAgICIuKmNhbGxlZS4qY2FsbGVlKzQuKmNhbGxlZSsxMi4qIiAiIgorZ2RiX3Rlc3QgInNpIiAgICAgICAiLipjYWxsZWUuKiIgIiIKK2dkYl90ZXN0ICJmaW4iICAgICAgIi4qUnVuIHRpbGwgZXhpdC4qbWFpbi4qIiAiZmluaXNoIgorZ2RiX3Rlc3QgIngvaSBcJHBjIiAiLiptYWluKy4qIiAiYmFjayBpbiBtYWluIgorZ2RiX2V4aXQKKworI3JlbW90ZV9leGVjIGJ1aWxkICJybSAtZiAke2JpbmZpbGV9IgorcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3B4ZGIuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3B4ZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2UzZmMyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvcHhkYi5jCkBAIC0wLDAgKzEsMjAgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgY2FsbGVlKCB4ICkKK2ludCB4OworeworICAgIGludCB5ID0geCAqIHg7CisgICAgcmV0dXJuICh5IC0gMik7Cit9CisKK21haW4oKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDE7IGkgPCAxMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoICIlZCAiLCBjYWxsZWUoIGkgKSk7CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIHByaW50ZiggIiBHb29kYnllIVxuIiApOworICAgIAorfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvcHhkYi5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9weGRiLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGIzYWNlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvcHhkYi5leHAKQEAgLTAsMCArMSwxMTQgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGdkYiB0ZXN0c3VpdGUKKworCisjIHB4ZGIuZXhwICAgVGVzdCB0aGF0IGdkYiBjYWxscyBweGRiIG9uIGFuIGFwcGxpY2F0aW9uCisjICAgICAgICAgICAgYnVpbHQgd2l0aG91dCBpdC4KKyMKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlIHB4ZGIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBvYmpmaWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0ubworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfSAiYysrIl0geworICAgIHJldHVybiAtMTsKK30KKyAKKyAKK2lmIHtbc2tpcF9ocF90ZXN0cyAkZ2NjX2NvbXBpbGVkXX0gdGhlbiB7IGNvbnRpbnVlIH0KKworIyBUbyBidWlsZCBhIG5vbi1weGRiLWVkIGZpbGUsIHVzZQorIworIyAgICAgPGNvbXBpbGUgdG8gLm8gZmlsZT4KKyMgICAgIGV4cG9ydCBMRF9QWERCIC9kZXYvbnVsbAorIyAgICAgbGQgLW8gaGVsbG9fbm9fcHhkYiBoZWxsby5vIC9vcHQvbGFuZ3Rvb2xzL2xpYi9lbmQubyAvdXNyL2Njcy9saWIvY3J0MC5vIC1sYworIworCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7b2JqZmlsZX0iIG9iamVjdCB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworIworIyB1c2UgdGhpcyB0byBkZWJ1ZzoKKyNsb2dfdXNlciAxCisKKworIyBGb2xsb3dpbmcgc2hvdWxkIGdldCB0aGUgZXJyb3IgbWVzc2FnZToKKyMKKyMgICAgICBsZDogKFdhcm5pbmcpIENhbid0IGV4ZWMgcHhkYiB1c2luZyBwYXRoOiAvZGV2L251bGwKKyMKKworc2V0IGNtZGxpbmUgICJrc2ggLWMgXCJMRF9QWERCPS9kZXYvbnVsbCBsZCAtbyAke2JpbmZpbGV9ICR7b2JqZmlsZX0gL3Vzci9jY3MvbGliL2NydDAubyAvb3B0L2xhbmd0b29scy9saWIvZW5kLm8gLWxjXCIiCisKK3JlbW90ZV9leGVjIGJ1aWxkICJybSAke2JpbmZpbGV9IgorcmVtb3RlX2V4ZWMgYnVpbGQgJGNtZGxpbmUKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisKKyMgV2UgZXhwZWN0IHRvIHNlZSB0aGlzOgorIworIyAgIndhcm5pbmc6IEZpbGUgbm90IHByb2Nlc3NlZCBieSBweGRiLS1hYm91dCB0byBwcm9jZXNzIG5vdy4KKyMgICIKKyMgICIuCisjICAiUHJvY2VkdXJlczogNworIyAgIkZpbGVzOiAyCisjICAiUmVhZGluZyBzeW1ib2xzIGZyb20gfi9jX2NvZGUuZGlyL2hlbGxvX25vX3B4ZGIuLi5kb25lLgorIyAgIihnZGIpCisjCitzZW5kX2dkYiAiZmlsZSAke2JpbmZpbGV9XG4iCitnZGJfZXhwZWN0IHsKKworICAgIC1yZSAiLip3YXJuaW5nOiBGaWxlIG5vdCBwcm9jZXNzZWQgYnkgcHhkYi4qUHJvY2VkdXJlczogXFswLTlcXSsuKmRvbmUuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGFzcyAiUFhEQiBjYWxsIiAgICAgICAgfQorCisgICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgIHsgZmFpbCAiRGlkbid0IGNhbGwgcHhkYiIgfQorCisgICAgdGltZW91dCAgICAgICAgICAgICAgICAgeyBmYWlsICJjYWxsIHB4ZGIgKHRpbWVvdXQpIiB9Cit9CisKKyMgTWFrZSBzdXJlIHRoZSBuZXcgZGF0YSBtYWtlcyBzZW5zZQorIworaWYgeyAhW3J1bnRvIGNhbGxlZV0gfSB0aGVuIHsgcmV0dXJuIH0KKworc2VuZF9nZGIgInByaW50IHhcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICIuKj0gMS4qJGdkYl9wcm9tcHQgJCIgICAgeyBwYXNzICJHb29kIGRhdGEgYWZ0ZXIgcHhkYiBjYWxsIiB9CisgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgICB7IGZhaWwgIk5vIGRhdGEgYWZ0ZXIgcHhkYiBjYWxsIiB9CisgICB0aW1lb3V0IHsgZmFpbCAiKHRpbWVvdXQpIiB9Cit9CisKK2dkYl9leGl0CityZXR1cm4gMAorCisKKworCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3F1aWNrc29ydC5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvcXVpY2tzb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0YjgyOAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3F1aWNrc29ydC5jCkBAIC0wLDAgKzEsMjg0IEBACisvKiBCZWdpblNvdXJjZUZpbGUgcXVpY2tzb3J0LmMKKworICBUaGlzIGZpbGUgaXMgdGFrZSBmcm9tIHRoZSBEREUgdGVzdCBzeXN0ZW0uICBJdCBzcGF3bnMgc2l4CisgIHRocmVhZHMgdG8gZG8gYSBzb3J0IG9mIGFuIGFycmF5IG9mIHJhbmRvbSBudW1iZXJzLgorCisgIFRoZSBsb2NhdGlvbnMgbWFya2VkICJxdWljayBOIiBhcmUgdXNlZCBpbiB0aGUgdGVzdCAicXVpY2tzb3J0LmV4cCIuCisKKyAgVGhlIGxvY2F0aW9ucyBtYXJrZWQgImF0dCBOIiBhcmUgdXNlZCBpbiB0aGUgdGVzdCAiYXR0YWNoLmV4cCIuCisKKyAgVG8gY29tcGlsZToKKworICAgICAgY2MgLUFlICtEQTEuMCAtZyAtbyBxdWlja3NvcnQgLWxwdGhyZWFkIHF1aWNrc29ydC5jCisKKyAgVG8gcnVuOgorICAKKyAgICAgcXVpY2tzb3J0ICAgICAtLW5vcm1hbCBydW4KKyAgICAgcXVpY2tzb3J0IDEgICAtLXdhaXRzIGJlZm9yZSBzdGFydGluZyB0byBhbGxvdyBhdHRhY2gKKyovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorI2RlZmluZSBTT1JUU0VUIDEwMDAwMAorCisvKiBVbmNvbW1lbnQgdG8gdHVybiBvbiBkZWJ1Z2dpbmcgb3V0cHV0ICovCisvKiAjZGVmaW5lIFFVSUNLX0RFQlVHICAqLworCisvKiBVbmNvbW1lbnQgdG8gdHVybiBvbiB3YWl0IG9uIGVhY2ggdGhyZWFkIGNyZWF0ZSAqLworLyogI2RlZmluZSBUSFJFQURfV0FJVCAqLworCisvKiBGZXdlciB0aGFuIFNPUlRfRElSRUNUIGl0ZW1zIGFyZSBzb3J0ZWQgd2l0aCBhbiBpbnNlcnRpb24gc29ydC4gKi8KKyNkZWZpbmUgU09SVF9ESVJFQ1QgMjAKKworLyogV29yayBhdCB0aGlzIGRlcHRoIG9yIGxlc3MgZ2VuZXJhdGVzIGEgc2VwYXJhdGUgd29yayBpdGVtLiAqLworI2RlZmluZSBERUZFUl9ERVBUSCA2CisKKy8qIFdvcmtwaWxlIGNvbnRyb2xsZXIgKi8KK3R5cGVkZWYgdm9pZCAoKndvcmtfcHJvY190KSh2b2lkICopOworCit0eXBlZGVmIHN0cnVjdCB3b3JrcGlsZV9zdHJ1Y3QgeworCXB0aHJlYWRfbXV0ZXhfdCBsb2NrOwkgICAgICAgLyogbXV0ZXggZm9yIHRoaXMgc3RydWN0dXJlICovCisJcHRocmVhZF9jb25kX3Qgd29ya193YWl0OyAgICAgIC8qIHdvcmtlcnMgd2FpdGluZyBmb3Igd29yayAqLworCXB0aHJlYWRfY29uZF90IGZpbmlzaF93YWl0OyAgICAvKiB0byB3YWl0IGZvciB3b3JrZXJzIHRvIGZpbmlzaCAqLworCWludCBtYXhfcGlsZTsJCSAgICAgICAvKiBsZW5ndGggb2Ygd29ya3BpbGUgYXJyYXkgKi8KKwl3b3JrX3Byb2NfdCB3b3JrZXJfcHJvYzsgICAgICAgLyogd29yayBwcm9jZWR1cmUgKi8KKwlpbnQgbl93b3JraW5nOwkJICAgICAgIC8qIG51bWJlciBvZiB3b3JrZXJzIHdvcmtpbmcgKi8KKwlpbnQgbl93YWl0aW5nOwkJICAgICAgIC8qIG51bWJlciBvZiB3b3JrZXJzIHdhaXRpbmcgZm9yIHdvcmsgKi8KKwlpbnQgbl9waWxlOwkJICAgICAgIC8qIG51bWJlciBvZiBwb2ludGVycyBpbiB0aGUgd29ya3BpbGUgKi8KKwlpbnQgaW5wOwkJICAgICAgIC8qIEZJRk8gaW5wdXQgcG9pbnRlciAqLworCWludCBvdXRwOwkJICAgICAgIC8qIEZJRk8gb3V0cHV0IHBvaW50ZXIgKi8KKwl2b2lkICpwaWxlWzFdOwkJICAgICAgIC8qIGFycmF5IG9mIHBvaW50ZXJzIC0gdGhlIHdvcmtwaWxlICovCit9ICp3b3JrcGlsZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJZmxvYXQgKmRhdGE7CQkgICAvKiBBcnJheSB0byBzb3J0ICovCisJaW50IG47CQkJICAgLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheSAqLworCWludCBkZXB0aDsJCSAgIC8qIERlcHRoIG9mIHJlY3Vyc2lvbiAqLworCXdvcmtwaWxlX3Qgd3A7CQkgICAvKiBXb3JrcGlsZSB0byB1c2UgKi8KK30gcXVpY2tfc29ydF9hcmdzOworCisvKiBUcnVlIGlmIHdhaXRpbmcgZm9yIGF0dGFjaC4KKyAqLworaW50IHdhaXRfaGVyZSA9IEZBTFNFOworCitzdGF0aWMgd29ya3BpbGVfdCBxdWlja19zb3J0X3dvcmtwaWxlID0gTlVMTDsKKwordm9pZCAqd29ya2VyKHZvaWQgKiB3cHRyKTsKKworLyogQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhIHdvcmtwaWxlIHRoYXQgaG9sZHMgbWF4X3BpbGUgZW50cmllcy4KKyAqIHdvcmtlcl9wcm9jIGlzIGNhbGxlZCB0byBwcm9jZXNzIGVhY2ggd29yayBpdGVtIG9uIHRoZSBxdWV1ZS4KKyAqLword29ya3BpbGVfdAord29ya19pbml0KGludCBtYXhfcGlsZSwgd29ya19wcm9jX3Qgd29ya2VyX3Byb2MsIGludCBuX3RocmVhZHMpCit7CisJaW50IGVycjsKKwlwdGhyZWFkX3QgdDsKKwl3b3JrcGlsZV90IHdwID0gKHdvcmtwaWxlX3QpCisJCW1hbGxvYyhzaXplb2YgKHN0cnVjdCB3b3JrcGlsZV9zdHJ1Y3QpICsKKwkJCShtYXhfcGlsZSAqIHNpemVvZiAodm9pZCAqKSkpOworCisJaWYgKHdwICE9IE5VTEwpIHsKKwkJcHRocmVhZF9tdXRleF9pbml0KCZ3cC0+bG9jaywgTlVMTCk7CisJCXB0aHJlYWRfY29uZF9pbml0KCZ3cC0+d29ya193YWl0LCBOVUxMKTsKKwkJcHRocmVhZF9jb25kX2luaXQoJndwLT5maW5pc2hfd2FpdCwgTlVMTCk7CisJCXdwLT5tYXhfcGlsZSA9IG1heF9waWxlOworCQl3cC0+d29ya2VyX3Byb2MgPSB3b3JrZXJfcHJvYzsKKwkJd3AtPm5fd29ya2luZyA9IHdwLT5uX3dhaXRpbmcgPSB3cC0+bl9waWxlID0gMDsKKwkJd3AtPmlucCA9IHdwLT5vdXRwID0gMDsKKwkJd2hpbGUgKG5fdGhyZWFkcy0tKSB7CisJCQllcnIgPSBwdGhyZWFkX2NyZWF0ZSgmdCwgTlVMTCwKKwkJCSAgICAgIHdvcmtlciwgKHZvaWQgKikmd3ApOworI2lmZGVmIFFVSUNLX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoICI9PSBRdWlja3NvcnQ6IGNyZWF0ZWQgbmV3IHRocmVhZFxuIiApOworI2lmZGVmIFRIUkVBRF9XQUlUCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbl90aHJlYWRzID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiggIj09IFF1aWNrc29ydDogd2FpdGluZyBvbiB1c2VyIGlucHV0IG9mIGFuIGludGVnZXJcbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZiggIiVkIiwgJmkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoICI9PSBRdWlja3NvcnQ6IGNvbnRpbnVpbmcgd2l0aCBxdWlja3NvcnRcbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorI2VuZGlmCisKKwkJCWFzc2VydChlcnIgPT0gMCk7ICAgIC8qIHF1aWNrIDEgKi8KKwkJfQorICAgICAgICAgICAgICAgIC8qIEFsbCB0aGUgdGhyZWFkcyBoYXZlIG5vdyBiZWVuIGNyZWF0ZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KCBuX3RocmVhZHMgPT0gLTEgKTsgICAgICAgICAvKiBhdHQgMSAqLworICAgICAgICAgICAgICAgIGlmKCB3YWl0X2hlcmUgKSB7CisjaWZkZWYgUVVJQ0tfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiPT0gUXVpY2tzb3J0OiB3YWl0aW5nIGZvciBhdHRhY2hcbiIgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBzbGVlcCggMjUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2FpdF9oZXJlID0gOTk7ICAgICAgICAgICAgICAvKiBhdHQgMiwgb3RoZXJ3aXNlIHVzZWxlc3MgKi8KKwl9CisJcmV0dXJuICh3cCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHF1aWNrIDIgKi8KK30KKworLyoKKyAqIFdvcmtlciB0aHJlYWQgcm91dGluZS4gQ29udGludW91c2x5IGxvb2tzIGZvciB3b3JrLCBjYWxscyB0aGUKKyAqIHdvcmtlcl9wcm9jIGFzc29jaWF0ZWQgd2l0aCB0aGUgd29ya3BpbGUgdG8gZG8gd29yay4KKyAqLwordm9pZCAqCit3b3JrZXIodm9pZCAqIHdwdHIpCit7CisgICAgICAgIHdvcmtwaWxlX3Qgd3A7CisJdm9pZCAqcHRyOworCisgICAgICAgIHdwID0gKiAod29ya3BpbGVfdCAqKSB3cHRyOworCisJcHRocmVhZF9tdXRleF9sb2NrKCZ3cC0+bG9jayk7CisJd3AtPm5fd29ya2luZysrOworCWZvciAoOzspIHsKKwkJd2hpbGUgKHdwLT5uX3BpbGUgPT0gMCkgewkJCQkJCQkJLyogd2FpdCBmb3IgbmV3IHdvcmsgKi8KKwkJCWlmICgtLXdwLT5uX3dvcmtpbmcgPT0gMCkKKwkJCQlwdGhyZWFkX2NvbmRfc2lnbmFsKCZ3cC0+ZmluaXNoX3dhaXQpOworCQkJd3AtPm5fd2FpdGluZysrOworCQkJcHRocmVhZF9jb25kX3dhaXQoJndwLT53b3JrX3dhaXQsICZ3cC0+bG9jayk7CisJCQl3cC0+bl93YWl0aW5nLS07ICAgICAgIC8qIHF1aWNrIDMgKi8KKwkJCXdwLT5uX3dvcmtpbmcrKzsKKwkJfQorCQl3cC0+bl9waWxlLS07CisJCXB0ciA9IHdwLT5waWxlW3dwLT5vdXRwXTsKKwkJd3AtPm91dHAgPSAod3AtPm91dHAgKyAxKSAlIHdwLT5tYXhfcGlsZTsKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJndwLT5sb2NrKTsKKwkJLyogQ2FsbCBhcHBsaWNhdGlvbiB3b3JrZXIgcm91dGluZS4gKi8KKwkJKCp3cC0+d29ya2VyX3Byb2MpKHB0cik7CisJCXB0aHJlYWRfbXV0ZXhfbG9jaygmd3AtPmxvY2spOyAgLyogcXVpY2sgNCAqLworCX0KKwkvKiBOT1RSRUFDSEVEICovCit9CisKKy8qIFB1dHMgcHRyIGluIHdvcmtwaWxlLiBDYWxsZWQgYXQgdGhlIG91dHNldCwgb3Igd2l0aGluIGEgd29ya2VyLiAqLwordm9pZAord29ya19wdXQod29ya3BpbGVfdCB3cCwgdm9pZCAqcHRyKQoreworCXB0aHJlYWRfbXV0ZXhfbG9jaygmd3AtPmxvY2spOworCWlmICh3cC0+bl93YWl0aW5nKSB7CisJCS8qIGlkbGUgd29ya2VycyB0byBiZSBhd2FrZW5lZCAqLworCQlwdGhyZWFkX2NvbmRfc2lnbmFsKCZ3cC0+d29ya193YWl0KTsKKwl9CisJYXNzZXJ0KHdwLT5uX3BpbGUgIT0gd3AtPm1heF9waWxlKTsJCQkJCQkJCQkvKiBjaGVjayBmb3Igcm9vbSAqLworCXdwLT5uX3BpbGUrKzsKKwl3cC0+cGlsZVt3cC0+aW5wXSA9IHB0cjsKKwl3cC0+aW5wID0gKHdwLT5pbnAgKyAxKSAlIHdwLT5tYXhfcGlsZTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmd3AtPmxvY2spOworfQorCisKKy8qIFdhaXQgdW50aWwgYWxsIHdvcmsgaXMgZG9uZSBhbmQgd29ya2VycyBxdWllc2NlLiAqLwordm9pZAord29ya193YWl0KHdvcmtwaWxlX3Qgd3ApCit7CisJcHRocmVhZF9tdXRleF9sb2NrKCZ3cC0+bG9jayk7CisJd2hpbGUod3AtPm5fcGlsZSAhPTAgfHwgd3AtPm5fd29ya2luZyAhPSAwKQorCQlwdGhyZWFkX2NvbmRfd2FpdCgmd3AtPmZpbmlzaF93YWl0LCAmd3AtPmxvY2spOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3cC0+bG9jayk7Cit9CisKK3ZvaWQKK3F1aWNrX3NvcnRfYXV4KGZsb2F0ICpkYXRhLCBpbnQgbiwgaW50IGRlcHRoLCB3b3JrcGlsZV90IHdwLCBpbnQgZGVmZXJyYWJsZSkKK3sKKwlpbnQgaSxqOworCisJLyogSWYgYXJyYXkgc21hbGwsIHVzZSBpbnNlcnRpb24gc29ydCAqLworCWlmIChuIDw9IFNPUlRfRElSRUNUKSB7CisJCWZvciAoaiA9IDE7IGogPCBuOyBqKyspIHsKKwkJCS8qIGRhdGFbMC4uai0xXSBpbiBzb3J0OyBmaW5kIGEgc3BvdCBmb3IgZGF0YVtqXSAqLworCQkJZmxvYXQga2V5ID0gZGF0YVtqXTsKKwkJCWZvciAoaSA9IGogLSAxOyBpID49IDAgJiYga2V5IDwgZGF0YVtpXTsgaS0tKQorCQkJCWRhdGFbaSsxXSA9IGRhdGFbaV07CisJCQlkYXRhW2krMV0gPSBrZXk7CisJCX0KKwkJcmV0dXJuOworCX0KKwkvKiBEZWZlciB0aGlzIHdvcmsgdG8gd29yayBxdWV1ZSBpZiBwb2xpY3kgc2F5cyBzbyAqLworCWlmIChkZWZlcnJhYmxlICYmIGRlcHRoIDw9IERFRkVSX0RFUFRIKSB7CisJCXF1aWNrX3NvcnRfYXJncyAqcSA9IChxdWlja19zb3J0X2FyZ3MgKikKKwkJCQkJCQkJbWFsbG9jKHNpemVvZiAocXVpY2tfc29ydF9hcmdzKSk7CisJCWFzc2VydChxICE9IE5VTEwpOworCQlxLT5kYXRhID0gZGF0YTsgcS0+biA9IG47IHEtPmRlcHRoID0gZGVwdGg7IHEtPndwID0gd3A7CisJCXdvcmtfcHV0KHdwLCAodm9pZCAqKXEpOworCQlyZXR1cm47CisJfQorCS8qIE90aGVyd2lzZSwgcGFydGl0aW9uIGRhdGEgYmFzZWQgb24gYSBtZWRpYW4gZXN0aW1hdGUgKi8KKyNkZWZpbmUgc3dhcChpLGopIHtmbG9hdCB0ID0gZGF0YVtpXTsgZGF0YVtpXSA9IGRhdGFbal07IGRhdGFbal0gPSB0O30KKwlpID0gMDsKKwlqID0gbiAtIDE7CisJZm9yICg7OykgeworCQl3aGlsZSAoZGF0YVtpXSA8IGRhdGFbal0pIGotLTsKKwkJaWYgKGkgPj0gaikgYnJlYWs7CisJCXN3YXAoaSwgaik7IGkrKzsKKwkJd2hpbGUgKGRhdGFbaV0gPCBkYXRhW2pdKSBpKys7CisJCWlmIChpID49IGopIHsgaSA9IGo7IGJyZWFrOyB9CisJCXN3YXAoaSwgaik7IGotLTsKKwl9CisJLyogTWVkaWFuIHZhbHVlIGlzIG5vdyBhdCBkYXRhW2ldICovCisJLyogUGFydGl0aW9uZWQgc28gdGhhdCBkYXRhWzAuLmktMV0gPD0gbWVkaWFuIDw9IGRhdGFbaSsxLi5uLTFdICovCisJcXVpY2tfc29ydF9hdXgoZGF0YSwgICAgICAgaSwgICAgIGRlcHRoKzEsIHdwLCBUUlVFKTsKKwlxdWlja19zb3J0X2F1eCgmZGF0YVtpKzFdLCBuLWktMSwgZGVwdGgrMSwgd3AsIFRSVUUpOworfQorLyogQ2FsbGVkIGZyb20gd29ya3BpbGUgY29udHJvbGxlciB3aXRoIGFyZ3VtZW50IHBvaW50aW5nIHRvIHdvcmsuICovCit2b2lkCitxdWlja19zb3J0X3dvcmtlcih2b2lkICphKQoreworCXF1aWNrX3NvcnRfYXJncyAqcSA9IChxdWlja19zb3J0X2FyZ3MgKilhOworCXF1aWNrX3NvcnRfYXV4KHEtPmRhdGEsIHEtPm4sIHEtPmRlcHRoLCBxLT53cCwgRkFMU0UpOworCWZyZWUocSk7Cit9CisvKiBNYWluIHJvdXRpbmUsIGNhbGxlZCBieSBjbGllbnQgdG8gZG8gYSBzb3J0LiAqLwordm9pZAorcXVpY2tfc29ydChmbG9hdCAqZGF0YSwgaW50IG4pCit7CisJaWYgKHF1aWNrX3NvcnRfd29ya3BpbGUgPT0gTlVMTCkgeworCQlpbnQgbl90aHJlYWRzID0gNjsKKwkJcXVpY2tfc29ydF93b3JrcGlsZSA9IHdvcmtfaW5pdCgyIDw8IERFRkVSX0RFUFRILAorCQkJcXVpY2tfc29ydF93b3JrZXIsIG5fdGhyZWFkcyk7CisJCWFzc2VydChxdWlja19zb3J0X3dvcmtwaWxlICE9IE5VTEwpOworCX0KKyAgICAgICAgCisJcXVpY2tfc29ydF9hdXgoZGF0YSwgbiwgMCwgcXVpY2tfc29ydF93b3JrcGlsZSwgRkFMU0UpOworICAgICAgICAKKwkvKiBXYWl0IGZvciBhbGwgd29yayB0byBmaW5pc2ggKi8KKwl3b3JrX3dhaXQocXVpY2tfc29ydF93b3JrcGlsZSk7CisgICAgICAgIAorI2lmZGVmIFFVSUNLX0RFQlVHCisgICAgICAgIHByaW50ZiggIj09IFF1aWNrc29ydDogZG9uZSBzb3J0aW5nXG4iICk7CisjZW5kaWYKK30KKworCittYWluKCBhcmdjLCBhcmd2ICkKK2ludCAgICBhcmdjOworY2hhciAqKmFyZ3Y7Cit7CisJZmxvYXQgZGF0YVtTT1JUU0VUXTsKKwlpbnQgaTsgaW50IGRlYnVnZ2luZyA9IDA7CisKKyAgICAgICAgaWYoKGFyZ2MgPiAxKSAmJiAoMCAhPSBhcmd2ICkpIHsKKyAgICAgICAgICAgIGlmKCAxID09IGF0b2koIGFyZ3ZbMV0gKSApCisgICAgICAgICAgICAgICB3YWl0X2hlcmUgPSBUUlVFOworICAgICAgICB9CisKKwlmb3IoaSA9IDA7IGkgPCBTT1JUU0VUOyBpKyspCisJCWRhdGFbU09SVFNFVCAtMSAtaV0gPSBkcmFuZDQ4KCk7CisgICAgICAgICAgICAgICAgCisJZm9yKGkgPSAwOyBpIDwgU09SVFNFVDsgaSsrKQorCQlpZiAoZGVidWdnaW5nKQorICAgICAgICAgICAgICAgICAgIHByaW50ZigiZGF0YVslZF0gPSAlZlxuIiwgaSwgZGF0YVtpXSk7CisKKwlxdWlja19zb3J0KGRhdGEsIFNPUlRTRVQpOworCWZvcihpID0gMDsgaSA8IFNPUlRTRVQ7IGkrKykKKwkJaWYgKGRlYnVnZ2luZykKKwkJcHJpbnRmKCJkYXRhWyVkXSA9ICVmXG4iLCBpLCBkYXRhW2ldKTsKKworCXJldHVybigwKTsKK30KKy8qIEVuZFNvdXJjZUZpbGUgKi8KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3F1aWNrc29ydC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9xdWlja3NvcnQuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOWJmZGYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9xdWlja3NvcnQuZXhwCkBAIC0wLDAgKzEsODA5IEBACisjIHF1aWNrc29ydC5leHAgLS0gRXhwZWN0IHNjcmlwdCB0byB0ZXN0IGdkYiB3aXRoIHF1aWNrc29ydC5jCisjIENvcHlyaWdodCAoQykgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIHVzZSB0aGlzIHRvIGRlYnVnOgorIworI2xvZ191c2VyIDEKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKK2lmIHsgIVtpc3RhcmdldCAiaHBwYSotKi1ocHV4MTAuMzAiXSAmJiAhW2lzdGFyZ2V0ICJocHBhKi0qLWhwdXgxMS4qIl0gfSB7CisgICAgdmVyYm9zZSAiSFBVWCB0aHJlYWQgdGVzdCBpZ25vcmVkIGZvciBub24taHBwYSBvciBwcmUtSFAvVVgtMTAuMzAgdGFyZ2V0cy4iCisgICAgcmV0dXJuIDAKK30KKworc2V0IHRlc3RmaWxlIHF1aWNrc29ydAorc2V0IHNyY2ZpbGUgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9XSB7CisgICAgcmV0dXJuIC0xCit9CisKKyMgVG8gYnVpbGQgdGhlIGV4ZWN1dGFibGUgd2UgbmVlZCB0byBsaW5rIGFnYWluc3QgdGhlIHRocmVhZCBsaWJyYXJ5LgorIworIyAgICAgY2MgLUFlIC1nIC1vIHF1aWNrc29ydCAtbHB0aHJlYWQgcXVpY2tzb3J0LmMKKyMKKyNjb21waWxlICIke3NyY2ZpbGV9IC1BZSAtZyAtbHB0aHJlYWQgLW8gJHtiaW5maWxlfSIKKworaWYgeyRnY2NfY29tcGlsZWQgPT0gMH0geworICAgIHNldCBhZGRpdGlvbmFsX2ZsYWdzICJhZGRpdGlvbmFsX2ZsYWdzPS1BZSIKK30gZWxzZSB7CisgICAgc2V0IGFkZGl0aW9uYWxfZmxhZ3MgIiIKK30KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LmMiICIke2JpbmZpbGV9Lm8iIG9iamVjdCBbbGlzdCBkZWJ1ZyAkYWRkaXRpb25hbF9mbGFnc11dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KK3JlbW90ZV9leGVjIGJ1aWxkICJsZCAvdXNyL2Njcy9saWIvY3J0MC5vICR7YmluZmlsZX0ubyAtbGNsIC1scHRocmVhZCAgLWxjIC9vcHQvbGFuZ3Rvb2xzL2xpYi9lbmQubyAtbyAke2JpbmZpbGV9IgorCisKKyMgVGhyZWFkIHN0dWZmIGlzIF9zbG93XzsgcHJlcGFyZSBmb3IgbG9uZyB3YWl0cy4KKyMKK3NldCBvbGR0aW1lb3V0ICR0aW1lb3V0CitzZXQgdGltZW91dCBbZXhwciAiJHRpbWVvdXQgKyAzMDAiXQorc2V0IG9sZHZlcmJvc2UgJHZlcmJvc2UKKyNzZXQgdmVyYm9zZSA0MAorCisjIEZ1cnRoZXIsIHRoaXMgdGVzdCBoYXMgc29tZSAibnVsbCIgbGluZXMgZGVzaWduZWQKKyMgdG8gY29uc3VtZSBvdXRwdXQgZnJvbSBnZGIgdGhhdCB3YXMgdG9vIGxhdGUgdG8gYmUKKyMgbWF0Y2hlZCAoc2VxdWVuY2UgaXMgImdkYl90ZXN0IiBzZW5kczsgdGltZW91dCBhbmQKKyMgb24gdG8gbmV4dCBzZW5kOyByZXN1bHQgZmluYWxseSBjb21lcyBpbjsgbWlzbWF0Y2gpLgorIworIyBUaGUgbnVsbCBjb21tYW5kIGlzICdnZGJfdGVzdCAicCBcJHBjIiAiLioiICIiJworIworIyBOT1RFOiB0byBwYXNzIGEgbGl0ZXJhbCAiJCIsICIvIiBvciAiKiIgKGV0Yy4pIHRvIGdkYl90ZXN0LCAKKyMgICAgICAgcmVtZW1iZXIgdGhhdCB0aGUgcGF0dGVybiB3aWxsIGJlIGVzY2FwZWQgb25jZSBhbmQgCisjICAgICAgICQtZXZhbHVhdGVkIHR3aWNlOgorIworIyAgICAgICAgICAiXFxcKiIgbWF0Y2hlcyAiXCoiCisjICAgICAgICAgICJcJCIgIG1hdGNoZXMgIiQiCisjCitwcm9jIGZpeF90aW1lb3V0IHt9IHsKKyAgICBnZGJfdGVzdCAicCBcJHBjIiAiLioiICIiCit9CisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNpbXBsZSBzYW5pdHkgdGVzdCBmaXJzdC4KKyMKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCitnZGJfdGVzdCAidGIgMTIyIiAiLipCcmVha3BvaW50LioiICIiCitnZGJfdGVzdCAiciIgIi4qMTIyLioiICIiCitnZGJfdGVzdCAidGhyIDk5IiAiLipUaHJlYWQgSUQgOTkgbm90IGtub3duLioiICJDaGVjayB0b28tYmlnIHRocmVhZCBudW1iZXIiCitnZGJfdGVzdCAidGIgMTQ1IHRociAzIiAiLipCcmVha3BvaW50LioiICJzZXQgdGhyZWFkLXNwZWNpZmljIGJwIDE0NSIKK2dkYl90ZXN0ICJ0YiAxNDYgdGhyIDQiICIuKkJyZWFrcG9pbnQuKiIgInNldCB0aHJlYWQtc3BlY2lmaWMgYnAgMTQ2IgorZ2RiX3Rlc3QgImMiICIuKlN3aXRjaGVkIHRvIHRocmVhZC4qMTQ1LioiICJhdXRvIHN3aXRjaCIKK2dkYl90ZXN0ICJjIiAiLipTd2l0Y2hlZCB0byB0aHJlYWQuKjE0Ni4qIiAiYXV0byBzd2l0Y2ggMiIKK2dkYl90ZXN0ICJjIiAiLipQcm9ncmFtIGV4aXRlZCBub3JtYWxseS4qIiAiIgorCisjPT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBUZXN0IHRoYXQgeW91IGNhbid0IGRvIGEgdGhyZWFkIHNlbGVjdCBhZnRlciBhIHByb2dyYW0gcnVucy4KKyMKK2dkYl90ZXN0ICJ0aHJlYWQiICIuKk5vIHN0YWNrLioiICJObyBsaXZlIHRocmVhZCBhZnRlciBydW4iCitnZGJfdGVzdCAidGhyIDIiICAiLipObyBzdGFjay4qIiAiQ2FuJ3Qgc2V0IHRocmVhZCBhZnRlciBydW4iCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFRlc3QgdGhyZWFkIGNvbW1hbmQgY2hhbmdlcywgbG9vayBmb3IgZnJhbWUgbGV2ZWwgcmVzZXQgYnVnLgorIworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CitnZGJfdGVzdCAiYiAxMjIiICIuKiIgIiIKK2dkYl90ZXN0ICJyIiAiLioxMjIuKiIgIiIKKworIyBQcmVwIGZvciBmcmFtZSBsZXZlbCB0ZXN0LS1nbyB1cC9pbmZvIHRocmVhZC9jaGVjayBmcmFtZQorIworZ2RiX3Rlc3QgInVwIiAiLipxdWlja19zb3J0LioiICIiCitnZGJfdGVzdCAidXAiICIuKm1haW4uKiIgICAgICAgIiIKKworc2VuZF9nZGIgImkgdGhcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIi4qNyB0aHJlYWQuKiBpbiAuKiBmcm9tIC4qIGluIC4qIGZyb20gLiogNiB0aHJlYWQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIGZhaWwgIm9sZCB0aHJlYWQgY29tbWFuZCwgc2F5cyB0aGluZ3MgdHdpY2UiCisgIH0KKyAgLXJlICIuKjcgc3lzdGVtIHRocmVhZC4qNiBzeXN0ZW0gdGguKjUgc3lzLio0LiozLioyLioxLip3b3JrX2luaXQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgIHBhc3MgImluZm8gdGhyZWFkcyIKKyAgfQorICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgIHsgZmFpbCAibm8gaW5mbyB0aHJlYWQgY29tbWFuZCIgfQorICB0aW1lb3V0IHsgZmFpbCAidGltZW91dCIgfQorfQorCisjIFdlIHNob3VsZCBoYXZlIGJlZW4gcmVzdG9yZWQgdHdvIGZyYW1lcyB1cC0tY2hlY2suCisjCitzZW5kX2dkYiAidXBcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipJbml0aWFsIGZyYW1lIHNlbGVjdGVkLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgIkZyYW1lIGNvcnJlY3RseSByZXNldCBhZnRlciAnaW5mbyB0aHJlYWRzJyIKKyAgICB9CisgICAgLXJlICIuKnF1aWNrX3NvcnQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAiT2xkIGdkYiBidWc7IHNob3VsZCBiZSBmaXhlZCBzb21lZGF5IgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBmYWlsICJyZWFsIGJ1Zy0tRklYISIKKyAgICB9CisgICAgdGltZW91dCB7IGZhaWwgInRpbWVvdXQiIH0KK30KKworIyBEbyBpdCBhZ2Fpbiwgb25seSBqdXN0IGdvIHRvIGEgbWlkZGxlIGZyYW1lLCBhbmQgdXNlIGFub3RoZXIgdGhyZWFkLgorIworZ2RiX3Rlc3QgInRociA1IiAiLioiICIiCitnZGJfdGVzdCAiYnQiICIuKiBfX19rc2xlZXAuKl9sd3BfY29uZF90aW1lZHdhaXQuKnB0aHJlYWRfY29uZF93YWl0Lip3b3JrZXIuKl9fcHRocmVhZF9jcmVhdGVfc3lzdGVtLioiICIiCitnZGJfdGVzdCAidXAiICIuKjEuKl9sd3BfY29uZF90aW1lZHdhaXQuKiIgIiIKK2dkYl90ZXN0ICJ1cCIgIi4qMi4qcHRocmVhZF9jb25kX3dhaXQuKiIgICAiIgorZ2RiX3Rlc3QgInVwIiAiLiozLip3b3JrZXIuKiIgICAgICAgICAgICAgICIiCitnZGJfdGVzdCAiaSB0aCIgIi4qNy4qNi4qd29ya19pbml0LioiICAgICAgIiIKK2dkYl90ZXN0ICJmIiAgIi4qMy4qd29ya2VyLioiICAgICAgICAgICAgICAiRnJhbWUgcmVzdG9yZWQiCitnZGJfdGVzdCAicCB3cC0+bWF4X3BpbGUiICIuKj0gMTI4LioiICAgICAgImNhbiBzZWUgdmFycyBpbiBmcmFtZSIKKworIyBUaHJlYWQgY29tbWFuZCBjaGFuZ2VzCisjCitnZGJfdGVzdCAidGhyIiAgICAiLipDdXJyZW50IHRocmVhZCBpcyA1LioiICAgInRocmVhZHMtbm8tbnVtIgorZ2RiX3Rlc3QgInRociA2IiAgIi4qU3dpdGNoaW5nIHRvIHRocmVhZCA2LioiICJuZXcgc3dpdGNoIgorZ2RiX3Rlc3QgInRociIgICAgIi4qQ3VycmVudCB0aHJlYWQgaXMgNi4qIiAgICJjaGVjayBzd2l0Y2giCisjZ2RiX3Rlc3QgInRociA2IiAgIi4qQ3VycmVudCB0aHJlYWQgaXMgYWxyZWFkeSA2LioiICJkdXAsIG5vIHN3aXRjaCIKK2dkYl90ZXN0ICJ0aHIgYXBwIGFsbCBwIHgiICIuKk5vIHN5bWJvbC4qIiAgICAiIgorZ2RiX3Rlc3QgInRociIgICAgIi4qQ3VycmVudCB0aHJlYWQgaXMgNi4qIiAgICJyZXN0b3JlIGN1cnJlbnQgdGhyZWFkIgorCisjPT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBUZXN0IG5ldyBzdGVwcGluZworIworCitwcm9jIGdldF9oaXQgeyB9IHsKKyAgICBnbG9iYWwgaGl0MgorICAgIGdsb2JhbCBoaXQzCisgICAgZ2xvYmFsIGhpdDQKKyAgICBnbG9iYWwgaGl0NQorICAgIGdsb2JhbCBoaXQ2CisgICAgZ2xvYmFsIGhpdDcKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgc2VuZF9nZGIgImNvbnRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICIuKkJyZWFrcG9pbnQuKjE0NS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgc2VuZF9nZGIgInRoclxuIgorICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgLXJlICIuKmlzIDcuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0IGhpdDcgW2V4cHIgIiRoaXQ3ICsgMSJdCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC1yZSAiLippcyA2LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgIHNldCBoaXQ2IFtleHByICIkaGl0NiArIDEiXQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAtcmUgIi4qaXMgNS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICBzZXQgaGl0NSBbZXhwciAiJGhpdDUgKyAxIl0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLXJlICIuKmlzIDQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0IGhpdDQgW2V4cHIgIiRoaXQ0ICsgMSJdCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC1yZSAiLippcyAzLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgIHNldCBoaXQzIFtleHByICIkaGl0MyArIDEiXQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAtcmUgIi4qaXMgMi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICBzZXQgaGl0MiBbZXhwciAiJGhpdDIgKyAxIl0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCAiY2FuJ3Qgc2VlIHdoaWNoIHRocmVhZCIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGltZW91dCB7IGZhaWwgInRpbWVvdXQiIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgZmFpbCAidGhyZWFkIGNvbW1hbmQiCisgICAgICAgIH0KKyAgICAgICAgdGltZW91dCB7IGZhaWwgInRpbWVvdXQiIH0KKyAgICB9Cit9CisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorZ2RiX3Rlc3QgImJyZWFrIDEyMiIgIi4qIiAiIgorZ2RiX3Rlc3QgInJ1biIgICAgICAiLioxMjIuKiIgIiIKKworIyBNYWtlIHN1cmUgd2UgaGl0IGEgYnAgb24gZXZlcnkgdGhyZWFkLgorIworIyBUcnkgb25lLCB2aWEgdGhyZWFkLXNwZWNpZmljIGJwcworIworZ2RiX3Rlc3QgImJyZWFrIDE0NSB0aHIgMiIgIi4qIiAic2V0IHRocmVhZC1zcGVjaWZpYyBicCB0aHIgMiIKK2dkYl90ZXN0ICJicmVhayAxNDUgdGhyIDMiICIuKiIgInNldCB0aHJlYWQtc3BlY2lmaWMgYnAgdGhyIDMiCitnZGJfdGVzdCAiYnJlYWsgMTQ1IHRociA0IiAiLioiICJzZXQgdGhyZWFkLXNwZWNpZmljIGJwIHRociA0IgorZ2RiX3Rlc3QgImJyZWFrIDE0NSB0aHIgNSIgIi4qIiAic2V0IHRocmVhZC1zcGVjaWZpYyBicCB0aHIgNSIKK2dkYl90ZXN0ICJicmVhayAxNDUgdGhyIDYiICIuKiIgInNldCB0aHJlYWQtc3BlY2lmaWMgYnAgdGhyIDYiCitnZGJfdGVzdCAiYnJlYWsgMTQ1IHRociA3IiAiLioiICJzZXQgdGhyZWFkLXNwZWNpZmljIGJwIHRociA3IgorCitzZXQgaGl0MiAwCitzZXQgaGl0MyAwCitzZXQgaGl0NCAwCitzZXQgaGl0NSAwCitzZXQgaGl0NiAwCitzZXQgaGl0NyAwCisKK2dldF9oaXQKK2dldF9oaXQKK2dldF9oaXQKK2dldF9oaXQKK2dldF9oaXQKK2dldF9oaXQKKworaWYgeyBbZXhwciAiJGhpdDIgPT0gMSJdIAorICAmJiBbZXhwciAiJGhpdDMgPT0gMSJdCisgICYmIFtleHByICIkaGl0NCA9PSAxIl0KKyAgJiYgW2V4cHIgIiRoaXQ1ID09IDEiXQorICAmJiBbZXhwciAiJGhpdDYgPT0gMSJdCisgICYmIFtleHByICIkaGl0NyA9PSAxIl0gfSB7CisgICAgcGFzcyAidGhyZWFkLXNwZWNpZmljIGJwcyAxIgorfSBlbHNlIHsKKyAgICBmYWlsICJ0aHJlYWQtc3BlY2lmaWMgYnBzIDEiCit9CisKKyM9PT09PT09PT09PT09PT09PT09PQorIworIyBOb3cgdXNlIGdlbmVyaWMgYnBzCisjCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KK2dkYl90ZXN0ICJiIDEyMiIgIi4qIiAiIgorZ2RiX3Rlc3QgInIiICIuKjEyMi4qIiAiIgorCisjIE1ha2Ugc3VyZSB3ZSBoaXQgYSBicCBvbiBldmVyeSB0aHJlYWQuCisjCisjIFRyeSB0d28sIHZpYSBub24tdGhyZWFkLXNwZWNpZmljIGJwCisjCitnZGJfdGVzdCAiYiAxNDUiICIuKiIgImIgMTQ1IgorCitzZXQgaGl0MiAwCitzZXQgaGl0MyAwCitzZXQgaGl0NCAwCitzZXQgaGl0NSAwCitzZXQgaGl0NiAwCitzZXQgaGl0NyAwCisKK2dldF9oaXQKK2dldF9oaXQKK2dldF9oaXQKK2dldF9oaXQKK2dldF9oaXQKK2dldF9oaXQKKworaWYgeyBbZXhwciAiJGhpdDIgPT0gMSJdIAorICAmJiBbZXhwciAiJGhpdDMgPT0gMSJdCisgICYmIFtleHByICIkaGl0NCA9PSAxIl0KKyAgJiYgW2V4cHIgIiRoaXQ1ID09IDEiXQorICAmJiBbZXhwciAiJGhpdDYgPT0gMSJdCisgICYmIFtleHByICIkaGl0NyA9PSAxIl0gfSB7CisgICAgcGFzcyAidGhyZWFkLXNwZWNpZmljIGJwcyAyIgorfSBlbHNlIHsKKyAgICBmYWlsICJ0aHJlYWQtc3BlY2lmaWMgYnBzIDIiCit9CisKKyM9PT09PT09PT09PT09PT09PT09PQorIworIyBDb21wbGljYXRlZCAob3JpZ2luYWwpIHRlc3QgbmV4dC4KKyMKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCitpZiAhW3J1bnRvX21haW5dIHRoZW4geworICAgZmFpbCAiQ2FuJ3QgcnVuIHRvIG1haW4iCisgICByZXR1cm4gMAorfQorCisjIE9LLCB3ZSdyZSBhdCAibWFpbiIsIHRoZXJlIHNob3VsZCBiZSBvbmUgdGhyZWFkLgorIworZ2RiX3Rlc3QgImluZm8gdGhyZWFkIiAiLipcXFwqIDEgc3lzdGVtIHRocmVhZCAuKm1haW4uKiIgImluaXRpYWwgdGhyZWFkIgorIAorIyBUcnkgdG8gc2VlIHRoZSB0aHJlYWRzIGJlaW5nIGNyZWF0ZWQ6IHNldCBhIGJyZWFrcG9pbnQgCisjIGFmdGVyIHRoZSBjcmVhdGlvbiBhbmQgZ28gYXJvdW5kIHRoZSBsb29wIGEgZmV3IHRpbWVzLgorIworZ2RiX3Rlc3QgImJyZWFrIDEwOSIgIkJyZWFrcG9pbnQuKjEwOS4qIiAic2V0IGJwdCIKKworZ2RiX3Rlc3QgImMiICIuKk5ldyB0aHJlYWQuKkJyZWFrcG9pbnQuKjEwOS4qIiAiZmlyc3QgY29udGludWUiCitmaXhfdGltZW91dAorCisjIE1ha2Ugc3VyZSB3ZSBkb24ndCB3YWl0ICh3YWl0aW5nIGlzIGZvciBhdHRhY2ggdGVzdCkKKyMKK2dkYl90ZXN0ICJzZXQgd2FpdF9oZXJlID0gMCIgIi4qIiAiIgorCitzZW5kX2dkYiAiaW5mbyB0aHJcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLioyIHN5c3RlbSB0aC4qMSBzeS4qMTA5LiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInNhdyB0aHJlYWQgY3JlYXRlIiB9CisgICAgLXJlICIuKjEgc3lzdGVtIHRocmVhZC4qODcuKiRnZGJfcHJvbXB0ICQiICAgIHsgZmFpbCAiZGlkbid0IHNlZSB0aHJlYWQgY3JlYXRlIiB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAibm8gaW5mbyB0aHJlYWQgY29tbWFuZCIgfQorICAgIHRpbWVvdXQgeyBmYWlsICJ0aW1lb3V0IiB9Cit9CisKK2dkYl90ZXN0ICJjIiAgICAgICIuKk5ldyB0aHJlYWQuKkJyZWFrcG9pbnQuKjEwOS4qIiAiY29udGludWUiCitmaXhfdGltZW91dAorCitzZW5kX2dkYiAiaW5mbyB0aHJcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiozIHN5c3RlbSB0aHJlYWQuKjIgc3lzLipcXFwqIDEgc3lzdGVtIHRocmVhZC4qMTA5LiokZ2RiX3Byb21wdCAkIiB7IAorICAgICAgICBwYXNzICJzYXcgdGhyZWFkIGNyZWF0ZSIgfQorICAgIC1yZSAiLioyIHN5c3RlbSB0aHJlYWQuKjEgc3lzLioxMDkuKiRnZGJfcHJvbXB0ICQiIHsgCisgICAgICAgIGZhaWwgImRpZG4ndCBzZWUgdGhyZWFkIGNyZWF0ZSIgCisgICAgfQorICAgIC1yZSAiLioxIHN5c3RlbSB0aHJlYWQuKjEwOS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBmYWlsICJkaWRuJ3Qgc2VlIHRocmVhZCBjcmVhdGUiIAorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBmYWlsICJubyBpbmZvIHRocmVhZCBjb21tYW5kIiAKKyAgICB9CisgICAgdGltZW91dCB7IGZhaWwgInRpbWVvdXQiIH0KK30KKworZml4X3RpbWVvdXQKK2dkYl90ZXN0ICJjbGVhciIgIi4qRGVsZXRlZCBicmVha3BvaW50LioiICIiCisKKyMgTm93IGdvIG9uIHRvIHRoZSBlbmQgb2YgdGhyZWFkIGNyZWF0aW9uLgorIworZ2RiX3Rlc3QgImIgMTIyIiAgIi4qIiAgICAgInNldCBicHQgMTIyIgorZ2RiX3Rlc3QgImMiICAgICAiLipOZXcgdGhyZWFkLipOZXcgdGhyZWFkLipOZXcgdGhyZWFkLioxMjIuKiIgIiIKK2dkYl90ZXN0ICJwIFwkcGMiICIuKiIgIiIKK2dkYl90ZXN0ICJjbGVhciIgIi4qRGVsZXRlZCBicmVha3BvaW50LioiICIiCisKK3NlbmRfZ2RiICJpbmZvIHRoclxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjcgc3lzdGVtIHRocmVhZC4qNiBzeXMuKjUuKjEgc3lzdGVtIHRocmVhZC4qMTIyLiokZ2RiX3Byb21wdCAkIiAKKyAgICAgICAgeyBwYXNzICJzYXcgdGhyZWFkIGNyZWF0ZXMiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgeyBmYWlsICJubyBpbmZvIHRocmVhZCBjb21tYW5kIiB9CisgICAgdGltZW91dCB7IGZhaWwgInRpbWVvdXQiIH0KK30KKworIyBUcnkgYSB0aHJlYWQtc3BlY2lmaWMgYnJlYWtwb2ludDsgd2UgZXhwZWN0IHRoZSBvdGhlciB0aHJlYWRzIHRvCisjIGJlIHdhaXRpbmcgYXQgdGhpcyBwb2ludC4KKyMKK2dkYl90ZXN0ICJ0aHIgMyIgICIuKlN3aXRjaGluZyB0byB0aHJlYWQuKmtzbGVlcC4qIiAidGhyZWFkIHN3aXRjaCIKK2dkYl90ZXN0ICJpIHRoIiAgICIuKlxcXCogMyBzeXN0ZW0gdGhyZWFkLioiICAgICAgICAic2hvdyBuZXcgY3VycmVudCB0aHJlYWQiCisKK2dkYl90ZXN0ICJ1cCIgICAgICIuKmx3cF9jb25kX3RpbWVkd2FpdC4qIiAiIgorZ2RiX3Rlc3QgInVwIiAgICAgIi4qcHRocmVhZF9jb25kX3dhaXQuKiIgICIiCitnZGJfdGVzdCAidXAiICAgICAiLip3b3JrZXIuKjE0NC4qIiAgICAgICAgIiIKKworZ2RiX3Rlc3QgImIgMTQ1IHRoIDMiICIuKkJyZWFrcG9pbnQuKjE0NS4qIiAic2V0IHRocmVhZC1zcGVjaWZpYyBicCIKK2dkYl90ZXN0ICJpIGIiICAgICIuKmJyZWFrcG9pbnQuKmJyZWFrcG9pbnQuKjE0NSB0aHJlYWQgMy4qIiAic2hvdyB0aHJlYWQtc3BlY2lmaWMgYnAiCisKK2dkYl90ZXN0ICJjIiAgICAgICIuKkJyZWFrcG9pbnQuKjE0NS4qMTQ1LioiICJoaXQgdGhyZWFkLXNwZWNpZmljIGJwIgorZ2RiX3Rlc3QgInAgXCRwYyIgIi4qIiAiIgorCisjIFRlc3QgdGhyZWFkIGFwcGx5IGNvbW1hbmQgb24gdGhyZWFkIHNwZWNpZmljIGRhdGEuCisjCitnZGJfdGVzdCAidGhyZSBhcHAgYWxsIHAgXCRwYyIgIi4qVGhyZWFkIDcuKlRocmVhZCA2LipUaHJlYWQgNS4qVGhyZWFkIDQuKlRocmVhZCAzLipUaHJlYWQgMi4qVGhyZWFkIDEuKiIgInRocmVhZCBhcHBseSBhbGwiCitnZGJfdGVzdCAidGhyIGFwIDEgMyA1IHAgXCRwYyIgIi4qVGhyZWFkIDEuKlRocmVhZCAzLipUaHJlYWQgNS4qIiAidGhyIGFwcCAxIDMgNSIKKworIyBTd2l0Y2ggYWdhaW4sIGFuZCB0ZXN0IHRoYXQgb3RoZXJzIGNvbnRpbnVlIG9uIGEgIm5leHQiCisjIFRoaXMgdGVzdCBfY291bGRfIGZhaWwgZHVlIHRvIHRpbWluZyBpc3N1ZXMsIGJ1dCB0aGF0J3MKKyMgdW5saWtlbHkuCisjCitnZGJfdGVzdCAidGhyIDciICIuKlN3aXRjaGluZyB0byB0aHJlYWQuKiIgIiIKKworIyBNYWtlIHN1cmUgdGhhdCAidXAiIHN0b3BzIGF0IF9fcHRocmVhZF9leGl0LCBvcgorIyBfX3B0aHJlYWRfY3JlYXRlLCB0aGUgcHNldWRvLXJvb3RzLCBhbmQgdGhhdCB3ZSAKKyMgb25seSBzZWUgdGhhdCBwc2V1ZG8tcm9vdCBvbmNlLgorIworc2VuZF9nZGIgImJ0XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qRXJyb3IgYWNjZXNzaW5nIG1lbW9yeSBhZGRyZXNzLioiIHsgZmFpbCAiYnQiIH0KKyAgICAtcmUgIi4qcHRocmVhZF9jcmVhdGUuKnB0aHJlYWRfY3JlYXRlLioiIHsgZmFpbCAiYnQiIH0KKyAgICAtcmUgIi4qd29ya2VyLipwdGhyZWFkX2NyZWF0ZS4qIiAgICAgICAgIHsgcGFzcyAiYnQiIH0KKyAgICAtcmUgIi4qcHRocmVhZF9leGl0LioiICAgICAgICAgICAgICAgICAgIHsgcGFzcyAiYnQiIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAidGltZW91dCBvbiBidCIgfQorfQorCitnZGJfdGVzdCAidXAiICIuKiIgICAgICAgICAgICIiCitnZGJfdGVzdCAidXAiICIuKiIgICAgICAgICAgICIiCitnZGJfdGVzdCAidXAiICIuKjE0NC4qIiAgICAgICJVcCAzIgorZ2RiX3Rlc3QgInVwIiAiLipwdGhyZWFkXy4qIiAiVXAgNCIKK2dkYl90ZXN0ICJ1cCIgIi4qSW5pdGlhbCBmcmFtZSBzZWxlY3RlZDsgeW91IGNhbm5vdCBnbyB1cC4qIiAiY2F0Y2ggZW5kIG9mIHRocmVhZCBzdGFjayIKKworIz09PT09PT09PT09PT09PT09PT09PQorIworIyBUaGluZ3MgZ2V0IGlmZnkgaGVyZTsgd2hlbiB3ZSBzdGVwLCBzb21ldGltZXMgdGhlIHN0ZXAKKyMgY29tcGxldGVzLCBzb21ldGltZXMgaXQgZG9lc24ndC4gIFdoZW4gaXQgZG9lc24ndCwgd2UKKyMgaGl0IGEgYnAgc29tZXdoZXJlIGVsc2UgYW5kIHRoZSBzdGVwIG5ldmVyIGNvbXBsZXRlcworIyAod2FpdF9mb3JfaW5mZXJpb3IganVzdCBldmFwb3JhdGVzIGl0KS4gCisjCisjIEkgdGhpbmsgdGhlIHJpZ2h0IGFuc3dlciBpcyB0aGF0IGFueSBmYWlsdXJlcyBoZXJlCisjIHNob3VsZCBzdGljayBhcm91bmQgdG8gdHJpZ2dlciBsYXRlciBmaXhpbmcuCisjCisjICBIZXJlJ3MgdGhlIHBsYW46IAorIworIyAgQnBzIGF0IDE0OCAoNSkgYW5kIDE1NCAoNikgb24gdGhyZWFkIDcgKHR3byBicHMgc28gd2UgCisjICAgICBzZWUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBnb2luZyBhcm91bmQgdGhlIGxvb3AgYW5kCisjICAgICByZXBvcnRpbmcgdGhlIHNhbWUgYnAgaGl0IHR3aWNlKS4KKyMKKyMgIEJwIGF0IDE0NCBvbiB0aHJlYWQgMy4KKyMKKyMgIFN0ZXAgb3V0IG9mIGEgbGlicmFyeSByb3V0aW5lLgorIworIyBFaXRoZXIgdGhlIHN0ZXAgd2lsbCBmaW5pc2ggb3IgYSBicCB3aWxsIGhpdC4gIFRyeSB0bworIyBoYW5kbGUgYWxsIHRoZSBjYXNlcy4KKyMKK2dkYl90ZXN0ICJiIDE0OCB0aHIgNyIgIi4qQnJlYWtwb2ludC4qMTQ4LioiICIiCitnZGJfdGVzdCAiYiAxNTQgdGhyIDciICIuKkJyZWFrcG9pbnQuKjE1NC4qIiAic2V0IGJwdCAyIgorCitzZXQgaGl0XzE1NF9icCAwCitzZXQgaGl0XzE0OF9icCAwCitzZXQgaGl0XzE0NV9icCAwCitzZXQgc3RlcF9jb21wbGV0ZWQgMAorCisjIEV4cGVjdCB6ZXJvIGhpdHMKKyMKK2dkYl90ZXN0ICJpIGIiICIuKiIgIiIKKworc2VuZF9nZGIgIm5cbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipTaW5nbGUgc3RlcHBpbmcuKl9sd3BfY29uZF90aW1lZHdhaXQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgc2VuZF9nZGIgInRoclxuIgorICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgIC1yZSAiLippcyA3LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgc2V0IHN0ZXBfY29tcGxldGVkIDEKKyAgICAgICAgICAgICAgICBwYXNzICJjb21wbGV0ZWQgc3RlcCBpbiBsaWJyYXJ5IGNvZGUiCisgICAgICAgICAgICB9CisgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgIGZhaWwgImNvbXBsZXRlZCBzdGVwIGluIGxpYnJhcnkgY29kZSwgYnV0IGluIHdyb25nIHRocmVhZCIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJ0aW1lb3V0IiB9CisgICAgICAgIH0KKyAgICB9CisgICAgLXJlICIuKlNpbmdsZSBzdGVwcGluZy4qU3dpdGNoZWQgdG8gdGhyZWFkIDMuKkJyZWFrcG9pbnQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAic3RlcCBjYW5jZWxsZWQ7IGhpdCBicCBkdWUgdG8gdGhyZWFkIHBhcmFsbGVsaXNtIgorICAgICAgICBzZXQgaGl0XzE0NV9icCAxCisgICAgfQorICAgIC1yZSAiLipTaW5nbGUgc3RlcHBpbmcuKlN3aXRjaGVkIHRvIHRocmVhZCA3LipCcmVha3BvaW50LioxNDguKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAic3RlcCBjYW5jZWxsZWQ7IGhpdCBicCBkdWUgdG8gdGhyZWFkIHBhcmFsbGVsaXNtIgorICAgICAgICBzZXQgaGl0XzE0OF9icCAxCisgICAgfQorICAgIC1yZSAiLipTaW5nbGUgc3RlcHBpbmcuKlN3aXRjaGVkIHRvIHRocmVhZCA3LipCcmVha3BvaW50LioxNTQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAic3RlcCBjYW5jZWxsZWQ7IGhpdCBicCBkdWUgdG8gdGhyZWFkIHBhcmFsbGVsaXNtIgorICAgICAgICBzZXQgaGl0XzE1NF9icCAxCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHNlbmRfZ2RiICJ0aHJcbiIKKyAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAtcmUgIi4qaXMgNy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgIGZhaWwgIk5vIGV2ZW50PyIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgZmFpbCAiTm8gZXZlbnQiCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aW1lb3V0IHsgZmFpbCAidGltZW91dCIgfQorICAgICAgICB9CisgICAgfQorICAgIHRpbWVvdXQgeyBmYWlsICJ0aW1lb3V0IiB9Cit9CisKKyMgU29tZXRpbWVzIHVzZWQgdG8gZ2V0IFNJR1RSQVAgaGVyZTsgdGhhdCBzaG91bGQgYmUgZml4ZWQKKyMKKworIyBFeHBlY3QgYXBwcm9wcmlhdGUgaGl0cyBvZiBicHQ7IHRvbyBtdWNoIHdvcmsgdG8gcGFyc2UKKyMgcmVzdWx0IGFuZCBjaGVjay4uLgorIworZ2RiX3Rlc3QgImkgYiIgIi4qIiAiIgorCitzZW5kX2dkYiAiY1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKlNJR1RSQVAuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAiZ290IFNJR1RSQVAiCisgICAgfQorICAgIC1yZSAiLipTd2l0Y2hlZCB0byB0aHJlYWQgNy4qQnJlYWtwb2ludC4qMTU0LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIGlmIHsgJGhpdF8xNTRfYnAgPT0gMSB9IHsKKyAgICAgICAgICAgIGZhaWwgInJlLWhpdCBvbGQgYnAiCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXNzICJjb250aW51ZTsgaGl0IHBhcmFsbGVsIGV2ZW50IGFmdGVyIGNvbnRpbnVlIgorICAgICAgICB9CisgICAgICAgIHNldCBoaXRfMTU0X2JwIDEKKyAgICB9CisgICAgLXJlICIuKlN3aXRjaGVkIHRvIHRocmVhZCA3LipCcmVha3BvaW50LioxNDguKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgaWYgeyAkaGl0XzE0OF9icCA9PSAxIH0geworICAgICAgICAgICAgZmFpbCAicmUtaGl0IG9sZCBicCIKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhc3MgImNvbnRpbnVlOyBoaXQgcGFyYWxsZWwgZXZlbnQgYWZ0ZXIgY29udGludWUiCisgICAgICAgIH0KKyAgICAgICAgc2V0IGhpdF8xNDhfYnAgMQorICAgIH0KKyAgICAtcmUgIi4qQnJlYWtwb2ludC4qMTU0LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIGlmIHsgJGhpdF8xNTRfYnAgPT0gMSB9IHsKKyAgICAgICAgICAgIGZhaWwgInJlLWhpdCBvbGQgYnAiCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZW5kX2dkYiAidGhyXG4iCisgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAtcmUgIi4qaXMgNy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICBwYXNzICJjb250aW51ZTsgaGl0IHBhcmFsbGVsIGV2ZW50IGFmdGVyIGNvbnRpbnVlIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICBmYWlsICJoaXQgYnAgaW4gd3JvbmcgdGhyZWFkIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aW1lb3V0IHsgZmFpbCAidGltZW91dCIgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNldCBoaXRfMTU0X2JwIDEKKyAgICB9CisgICAgLXJlICIuKkJyZWFrcG9pbnQuKjE0OC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBpZiB7ICRoaXRfMTQ4X2JwID09IDEgfSB7CisgICAgICAgICAgICBmYWlsICJyZS1oaXQgb2xkIGJwIgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VuZF9nZGIgInRoclxuIgorICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgLXJlICIuKmlzIDcuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzcyAiY29udGludWU7IGhpdCBwYXJhbGxlbCBldmVudCBhZnRlciBjb250aW51ZSIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCAiaGl0IGJwIGluIHdyb25nIHRocmVhZCIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGltZW91dCB7IGZhaWwgInRpbWVvdXQiIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzZXQgaGl0XzE0OF9icCAxCisgICAgfQorICAgIC1yZSAiLipCcmVha3BvaW50LioxNDUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgaWYgeyAkaGl0XzE0NV9icCA9PSAxIH0geworICAgICAgICAgICAgZmFpbCAicmUtaGl0IG9sZCBicCIKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbmRfZ2RiICJ0aHJcbiIKKyAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgIC1yZSAiLippcyAzLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgIHBhc3MgImNvbnRpbnVlOyBoaXQgcGFyYWxsZWwgZXZlbnQgYWZ0ZXIgY29udGludWUiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwgImhpdCBicCBpbiB3cm9uZyB0aHJlYWQiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJ0aW1lb3V0IiB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0IGhpdF8xNDVfYnAgMQorICAgIH0KKyAgICAtcmUgIi4qX2x3cF9jb25kX3RpbWVkd2FpdC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJjb250aW51ZTsgaGl0IHN0ZXAgY29tcGxldGlvbiBhZnRlciBjb250aW51ZSIKKyAgICB9CisgICAgLXJlICIuKlByb2dyYW0gZXhpdGVkIG5vcm1hbGx5LioiIHsKKyAgICAgICAgZmFpbCAiUHJvZ3JhbSBlbmRlZD8gSE9XPyIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAiVW5leHBlY3RlZCBldmVudCIKKyAgICB9CisgICAgdGltZW91dCB7IGZhaWwgInRpbWVvdXQiIH0KK30KKworIyBUaGVyZSBhcmUgYSBudW1iZXIgb2YgcGxhY2VzIHdlIF9jb3VsZF8gYmUgbm93OworIyB0aGlzIGlzIHRoZSBwcmljZSBvZiByZWFsbHkgcnVubmluZyBpbiBwYXJhbGxlbC4KKyMKK3NlbmRfZ2RiICJuXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qU3dpdGNoZWQgdG8gdGhyZWFkIDcuKnB0aHJlYWRfY29uZF93YWl0LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIGlmIHsgJHN0ZXBfY29tcGxldGVkIH0geworICAgICAgICAgICAgZmFpbCAic3RlcCBhbHJlYWR5IGNvbXBsZXRlZCIKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhc3MgImZpbmlzaCBzdGVwIgorICAgICAgICB9CisgICAgfQorICAgIC1yZSAiLipwdGhyZWFkX2NvbmRfd2FpdC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAjCisgICAgICAgICMgVW5saWtlbHksIGJ1dCB3ZSBtaWdodCBmaW5pc2ggdGhlIHJhbmdlIHN0ZXAgZnJvbSBpbnNpZGUKKyAgICAgICAgIyBrc2xlZXAsIGJlZm9yZSBhbnl0aGluZyBlbHNlLgorICAgICAgICAjCisgICAgICAgIGlmIHsgJHN0ZXBfY29tcGxldGVkIH0geworICAgICAgICAgICAgZmFpbCAic3RlcCBhbHJlYWR5IGNvbXBsZXRlZCIKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbmRfZ2RiICJ0aHJcbiIKKyAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgIC1yZSAiLippcyA3LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgIHBhc3MgImZpbmlzaCBzdGVwIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICBmYWlsICJzdGVwIGluIHdyb25nIHRocmVhZCIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGltZW91dCB7IGZhaWwgInRpbWVvdXQiIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAtcmUgIi4qU3dpdGNoZWQgdG8gdGhyZWFkLipCcmVha3BvaW50LioxNDUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAiYXV0by1zd2l0Y2ggdGhyZWFkIiAKKyAgICB9CisgICAgLXJlICIuKkJyZWFrcG9pbnQuKjE0NS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJhdXRvLXN3aXRjaCBub3QgbmVlZGVkLCBvayIgCisgICAgfQorICAgIC1yZSAiLioxNDAuKndoaWxlLipuX3BpbGUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgIworICAgICAgICAjIFRoaXMgaXMganVzdCBnb2luZyBhcm91bmQgdGhlIGxvb3AgZnJvbSB0aGUgMTU0IGJwLgorICAgICAgICAjCisgICAgICAgIHNlbmRfZ2RiICJ0aHJcbiIKKyAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAtcmUgIi4qaXMgNy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgIHBhc3MgImZpbmlzaCBzdGVwIgorICAgICAgICAgICAgfQorICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICBmYWlsICJzdGVwIGluIHdyb25nIHRocmVhZCIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJ0aW1lb3V0IiB9CisgICAgICAgIH0KKyAgICB9CisgICAgLXJlICIuKjE0OS4qcHRyID0gd3AuKnBpbGUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgIworICAgICAgICAjIFRoaXMgaXMganVzdCBnb2luZyBhcm91bmQgdGhlIGxvb3AgZnJvbSB0aGUgMTQ4IGJwLgorICAgICAgICAjCisgICAgICAgIGlmIHsgJGhpdF8xNTRfYnAgfSB7CisgICAgICAgICAgICBzZW5kX2dkYiAidGhyXG4iCisgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAtcmUgIi4qaXMgNy4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgICAgICAgICBwYXNzICJmaW5pc2ggc3RlcCIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCAic3RlcCBpbiB3cm9uZyB0aHJlYWQiCisgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICB0aW1lb3V0IHsgZmFpbCAidGltZW91dCIgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFzcyAic3RlcCBmcm9tIDE0OSBidXQgZGlkbid0IGhpdCBpdCBmaXJzdCIKKyAgICAgICAgfQorICAgIH0KKyAgICAtcmUgIi4qQnJlYWtwb2ludCA1LioxNTQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZ2RiX3Rlc3QgImkgYiIgIi4qIiAiIgorICAgICAgICBpZiB7ICRoaXRfMTU0X2JwIH0geworICAgICAgICAgICAgZmFpbCAiaGl0IGJwIGFnYWluPyIKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhc3MgImhpdCBicCIKKyAgICAgICAgfQorICAgIH0KKyAgICAtcmUgIi4qQnJlYWtwb2ludCA1LioxNDguKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZ2RiX3Rlc3QgImkgYiIgIi4qIiAiIgorICAgICAgICBpZiB7ICRoaXRfMTQ4X2JwIH0geworICAgICAgICAgICAgZmFpbCAiaGl0IGJwIGFnYWluPyIKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhc3MgImhpdCBicCIKKyAgICAgICAgfQorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBmYWlsICJubyBzdGVwIGZpbmlzaGVkIgorICAgIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAidGltZW91dCBvbiAnbmV4dCciIH0KK30KKworIyBMZXQncyBnZXQgaW50byBzb21lIGtpbmQgb2Yga25vd24gc3RhdGUgYWdhaW4uCisjCitnZGJfdGVzdCAidGhyIDciICIuKiIgIiIKK2dkYl90ZXN0ICJpbmZvIHRocmVhZCIgIi4qIiAiIgorI2dkYl90ZXN0ICJpIGIiICIuKiIgIiIKKworIyBMZWF2ZSBicmVha3BvaW50ICIxNTQgdGhyIDciIGFzIG9ubHkgbGl2ZSBicC4KKyMgCitnZGJfdGVzdCAiZCAxIiAgICIuKiIgImRlbCBtYWluIGJwIgorZ2RiX3Rlc3QgImQgNCIgICAiLioiICJ0aHJlYWQtc3BlY2lmaWMgYnB0IGRlbGV0ZSIKK2dkYl90ZXN0ICJkIDUiICAgIi4qIiAib3RoZXIgYnAgZGVsZXRlIgorc2VuZF9nZGIgImkgYlxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKmJyZWFrcG9pbnQuKmJyZWFrcG9pbnQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAibW9yZSB0aGFuIG9uZSBicCBsZWZ0IgorICAgIH0KKyAgICAtcmUgIi4qYnJlYWtwb2ludC4qMTU0Lip0aHJlYWQuKjcuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAiT25seSBvbmUgYnAgbGVmdCIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAiV3Jvbmcgb3Igbm8gYnAgbGVmdCIKKyAgICB9CisgICAgdGltZW91dCB7IGZhaWwgInRpbWVvdXQgb24gaW5mbyBiIiB9Cit9CisKK3NlbmRfZ2RiICJjXG4iIAorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKlNJR1RSQVAuKlN3aXRjaGVkIHRvIHRocmVhZC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBmYWlsICJTSUdUUkFQIGVycm9yOyBsb3N0IHRocmVhZC1zcGVjaWZpYyBicHQiCisgICAgfQorICAgIC1yZSAiLipTSUdUUkFQLipTd2l0Y2hlZCB0byB0aHJlYWQuKjE1NC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBmYWlsICJTSUdUUkFQLCBidXQgaGl0IHJpZ2h0IHRocmVhZC1zcGVjaWZpYyBicHQiCisgICAgfQorICAgIC1yZSAiLipTd2l0Y2hlZCB0byB0aHJlYWQuKkJyZWFrcG9pbnQuKjE1NC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJhdXRvLXN3aXRjaCBiYWNrIgorICAgIH0KKyAgICAtcmUgIi4qQnJlYWtwb2ludC4qMTU0LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInN0ZXAgdG8gYnAiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIGZhaWwgImF1dG8tc3dpdGNoIGJhY2siIAorICAgIH0KKyAgICAtcmUgIi4qUHJvZ3JhbSBleGl0ZWQgbm9ybWFsbHkuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAic3RlcCBsb3N0IgorICAgIH0KKyAgICB0aW1lb3V0IHsKKyAgICAgICAgZmFpbCAidGltZW91dCIKKyAgICB9Cit9CitmaXhfdGltZW91dAorCitnZGJfdGVzdCAiY2xlIiAgICIuKkRlbGV0ZWQgYnJlYWtwb2ludC4qIiAiZGVsZXRlIGxhc3QgYnJlYWtwb2ludCIKKworIyBTb21ldGltZXMgZ2V0IFNJR1RSQVAgaGVyZS4gIENvbnRpbnVlIHNvbWV0aW1lcyBnZXRzIGFub3RoZXIuLi4KKyMKK3NlbmRfZ2RiICJjXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qU0lHVFJBUC4qMTU0LioxNTQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAiU0lHVFJBUCBvbiBkZWxldGVkIGJwIDE1NCAiCisgICAgICAgIHNlbmRfZ2RiICJjXG4iIAorICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImZpeHVwIn0KKyAgICAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJmaXh1cCIgfQorICAgICAgICB9CisgICB9CisgICAgLXJlICIuKlNJR1RSQVAuKjE0NC4qMTQ1LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIGZhaWwgIlNJR1RSQVAgb24gZGVsZXRlZCBicCAxNDUgIgorICAgICAgICBzZW5kX2dkYiAiY1xuIgorICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgImZpeHVwIn0KKyAgICAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJmaXh1cCIgfQorICAgICAgICB9CisgICAgfQorICAgIC1yZSAiLipTSUdUUkFQLioxNDguKjE0OC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBmYWlsICJTSUdUUkFQIG9uIGRlbGV0ZWQgYnAgMTQ4ICIKKyAgICAgICAgc2VuZF9nZGIgImNcbiIKKyAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJmaXh1cCJ9CisgICAgICAgICAgICB0aW1lb3V0IHsgZmFpbCAiZml4dXAiIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAtcmUgIi4qU0lHVFJBUC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBmYWlsICJ1bmtub3duIFNJR1RSQVAiCisgICAgICAgIHNlbmRfZ2RiICJjXG4iCisgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiZml4dXAifQorICAgICAgICAgICAgdGltZW91dCB7IGZhaWwgImZpeHVwIiB9CisgICAgICAgIH0KKyAgICB9CisgICAgLXJlICIuKlByb2dyYW0gZXhpdGVkLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgInJ1biB0byBlbmQiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIGZhaWwgInJ1biB0byBlbmQiCisgICAgICAgIHNlbmRfZ2RiICJjXG4iCisgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiZml4dXAifQorICAgICAgICAgICAgdGltZW91dCB7IGZhaWwgImZpeHVwIiB9CisgICAgICAgIH0KKyAgICB9CisgICAgdGltZW91dCB7IGZhaWwgInRpbWVvdXQiIH0KK30KKworZ2RiX3Rlc3QgInAgXCRwYyIgIi4qTm8gcmVnaXN0ZXJzLioiICJwcm9ncmFtIGRvbmUiCisKKyMgRG9uZSEKKyMKK2dkYl9leGl0CisKK3NldCB0aW1lb3V0ICRvbGR0aW1lb3V0CitzZXQgdmVyYm9zZSAkb2xkdmVyYm9zZQorCisjIGV4ZWN1dGVfYW55d2hlcmUgInJtIC1mICR7YmluZmlsZX0iCisjCityZXR1cm4gMAorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC9yZWctdGVzdC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9yZWctdGVzdC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkYzMwNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3JlZy10ZXN0LmV4cApAQCAtMCwwICsxLDE5MCBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUZXN0cyBvZiB3aWRlIHJlZ2lzdGVyIGRpc3BsYXlzIGZvciBHREIgb24gSFBQQSAyLjAgbWFjaGluZXMKKworIyB1c2UgdGhpcyB0byBkZWJ1ZzoKKyNsb2dfdXNlciAxCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorCX0KKworaWYgIVtpc3RhcmdldCAiaHBwYSotKi0qIl0geworICAgIHZlcmJvc2UgIldpZGUgcmVnaXN0ZXIgdGVzdCBpZ25vcmVkIGZvciBub24taHBwYSB0YXJnZXRzLiIKKyAgICByZXR1cm4KK30KKworc2V0IHRlc3RmaWxlICJyZWdfdGVzdCIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LnMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworIyBUbyBidWlsZCBhIHBhIDIuMCBleGVjdXRhYmxlCisjCisjICAgICBhcyAtbyByZWdfdGVzdCByZWdfdGVzdC5zCisjIG9yIAorIyAgICAgY2MgLWcgLW8gcmVnX3Rlc3QgcmVnX3Rlc3QucworIworIyBUaGUgK0RBMi4wTiBmbGFnIGRvZXNuJ3Qgc2VlbSB0byBiZSBuZWVkZWQuCisjCisjIERvbid0IHJlamVjdCBpZiB0aGVyZSBhcmUgd2FybmluZ3MsIGFzIHdlIGV4cGVjdCB0aGlzIHdhcm5pbmc6CisjCisjICAgIChXYXJuaW5nKSBBdCBsZWFzdCBvbmUgUEEgMi4wIG9iamVjdCBmaWxlIChwYTIuMF90ZXN0Mi5vKSB3YXMgZGV0ZWN0ZWQuCisjICAgIFRoZSBsaW5rZWQgb3V0cHV0IG1heSBub3QgcnVuIG9uIGEgUEEgMS54IHN5c3RlbS4KKyMKKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKKyMgdGVzdCBtYWNoaW5lLS10aGVyZSdzIG5vIDIuMG4gYXJjaGl0ZWN0dXJlLCBzbyB3ZSBoYXZlCisjIHRvIHRyeSB0byBydW4gdGhlIGFwcC4KKyMKK3NlbmRfZ2RiICJicmVhayBtYWluXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAiQnJlYWtwb2ludC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgcGFzcyAiaW5pdGlhbCBzZXQtdXAiCisgICAgICAgIH0KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIGZhaWwgImluaXRpYWwgc2V0LXVwIgorICAgICAgICB9CisgICAgICAgIHRpbWVvdXQgeworICAgICAgICAgICAgZmFpbCAiaW5pdGlhbCBzZXQtdXAgKHRpbWVvdXQpIgorICAgICAgICB9CisgICAgfQorCitzZW5kX2dkYiAicnVuXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAiLipFeGVjdXRhYmxlIGZpbGUgaW5jb21wYXRpYmxlIHdpdGggaGFyZHdhcmUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICMgTm90IGhwcGEyLjAgbWFjaGluZQorICAgICAgICAgICAgIworICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgfQorICAgICAgICAtcmUgIkNhbm5vdCBleGVjLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAjIE5vdCBocHBhMi4wIG1hY2hpbmUKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIH0KKyAgICAgICAgLXJlICIuKlN0YXJ0aW5nIHByb2dyYW06LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBwYXNzICJSZWFkeSB0byBzdGFydCB0ZXN0IgorICAgICAgICB9CisgICAgICAgIHRpbWVvdXQgeworICAgICAgICAgICAgZmFpbCAiaW5pdGlhbCBzZXQtdXAsIHBhcnQgMiAodGltZW91dCkiCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICB9CisgICAgfQorCisjIExldCB0aGUgcHJvZ3JhbSBzZXQga25vd24gdmFsdWVzLiAgVGhpcyBzZWNyZXRseSBkZWxldGVzCisjIHRoZSBicmVha3BvaW50IGF0IG1haW4gYW5kIHJlLXJ1bnMgdG8gbWFpbmVuZC4KKyMKK3J1bnRvIG1haW5lbmQKKworIyBMb29rIGZvciBrbm93biB2YWx1ZXMKKyMKK2dkYl90ZXN0ICJpbmZvIHJlZyByMSIgICJyMSAxIgorZ2RiX3Rlc3QgImluZm8gcmVnIHI0IiAgInI0IDIiCitnZGJfdGVzdCAiaW5mbyByZWcgcjUiICAicjUgNCIKK2dkYl90ZXN0ICJpbmZvIHJlZyByNiIgICJyNiA4IgorZ2RiX3Rlc3QgImluZm8gcmVnIHI3IiAgInI3IDEwIgorZ2RiX3Rlc3QgImluZm8gcmVnIHI4IiAgInI4IDIwIgorZ2RiX3Rlc3QgImluZm8gcmVnIHI5IiAgInI5IDQwIgorZ2RiX3Rlc3QgImluZm8gcmVnIHIxMCIgInIxMCA4MCIKK2dkYl90ZXN0ICJpbmZvIHJlZyByMTEiICJyMTEgMTAwIgorZ2RiX3Rlc3QgImluZm8gcmVnIHIxMiIgInIxMiAyMDAiCitnZGJfdGVzdCAiaW5mbyByZWcgcjEzIiAicjEzIDQwMCIKK2dkYl90ZXN0ICJpbmZvIHJlZyByMTQiICJyMTQgODAwIgorZ2RiX3Rlc3QgImluZm8gcmVnIHIxNSIgInIxNSAxMDAwIgorZ2RiX3Rlc3QgImluZm8gcmVnIHIxNiIgInIxNiAyMDAwIgorCisjIFR3byBvZGQgdmFyaWFudHMgdGhhdCBHREIgc3VwcG9ydHMgYXJlOgorIyAgICIxIiBtZWFucyAicjEiLCBhbmQKKyMgICAiJDEiIG1lYW5zICJyMSIKKyMKK2dkYl90ZXN0ICJpbmZvIHJlZyAxIDQiICJyMSAxLipyNCAyIgorZ2RiX3Rlc3QgImluZm8gcmVnIFwkMSIgInIxIDEiCisKKyMgVmVyaWZ5IHRoYXQgR0RCIHJlc3BvbmRzIGdyYWNlZnVsbHkgdG8gYSByZWdpc3RlciBJRCBudW1iZXIgdGhhdAorIyBpcyBvdXQgb2YgcmFuZ2UuCisjCitnZGJfdGVzdCAiaW5mbyByZWcgOTk5IiAiOTk5OiBpbnZhbGlkIHJlZ2lzdGVyIgorCisjIE1ha2Ugc3VyZSB0aGUgZmxvYXRpbmcgcG9pbnQgc3RhdHVzIGFuZCBlcnJvciByZWdpc3RlcnMKKyMgZG9uJ3Qgc2hvdyB1cCBhcyBmbG9hdGluZyBwb2ludCBudW1iZXJzIQorIworZ2RiX3Rlc3QgImluZm8gcmVnIGZwc3IiICIuKmZwc3IgMC4qIiAiZnBzciIKK2dkYl90ZXN0ICJpbmZvIHJlZyBmcGUxIiAiLipmcGUxIDAuKiIgImZwZTEiCitnZGJfdGVzdCAiaW5mbyByZWcgZnBlMiIgIi4qZnBlMiAwLioiICJmcGUyIgorZ2RiX3Rlc3QgImluZm8gcmVnIGZwZTMiICIuKmZwZTMgMC4qIiAiZnBlMyIKK2dkYl90ZXN0ICJpbmZvIHJlZyBmcGU0IiAiLipmcGU0IDAuKiIgImZwZTQiCitnZGJfdGVzdCAiaW5mbyByZWcgZnBlNSIgIi4qZnBlNSAwLioiICJmcGU1IgorZ2RiX3Rlc3QgImluZm8gcmVnIGZwZTYiICIuKmZwZTYgMC4qIiAiZnBlNiIKK2dkYl90ZXN0ICJpbmZvIHJlZyBmcGU3IiAiLipmcGU3IDAuKiIgImZwZTciCisKK2dkYl90ZXN0ICJpbmZvIHJlZyBmcjQiICAiLipmcjQuKihkb3VibGUgcHJlY2lzaW9uKS4qIDEiCitnZGJfdGVzdCAiaW5mbyByZWcgZnI1IiAgIi4qZnI1LiooZG91YmxlIHByZWNpc2lvbikuKiAyIgorZ2RiX3Rlc3QgImluZm8gcmVnIGZyNiIgICIuKmZyNi4qKGRvdWJsZSBwcmVjaXNpb24pLiogMiIKK2dkYl90ZXN0ICJpbmZvIHJlZyBmcjciICAiLipmcjcuKihkb3VibGUgcHJlY2lzaW9uKS4qIDQiCitnZGJfdGVzdCAiaW5mbyByZWcgZnI4IiAgIi4qZnI4LiooZG91YmxlIHByZWNpc2lvbikuKiA4IgorZ2RiX3Rlc3QgImluZm8gcmVnIGZyOSIgICIuKmZyOS4qKGRvdWJsZSBwcmVjaXNpb24pLiogMzIiCitnZGJfdGVzdCAiaW5mbyByZWcgZnIxMCIgIi4qZnIxMC4qKGRvdWJsZSBwcmVjaXNpb24pLiogMjU2IgorCitnZGJfdGVzdCAiaW5mbyByZWcgcjE5IiAicjE5IGRlYWRiZWVmYmFkY2FkZWUiCisKKyMgTmVlZCB0byBhZGQgdGVzdCBvZiB1c2Ugb2YgJDxyZWdpc3Rlci1uYW1lPgorIworIyBROiBIb3cgZG8geW91IHNheSBhIGxpdGVyYWwgIiQiIGluIGV4cGVjdD8KKyMgQTogWW91IHNheSAiXCQiLiAgIEEgbGl0ZXJhbCAiXCIgaXMgIlxcIi4KKyMKKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGFzIGxvbmcgYXMgd2UgYXJlIHJ1bm5pbmcKKyMgaW4gMzItYml0IG1vZGU6IGl0IHdpbGwgcHJvZHVjZSAiJDEgPSAweGJhZGNhZGVlIi4gIFRvIGZpeCBpdAorIyB3b3VsZCByZXF1aXJlIGJ1aWxkaW5nIGEgcmVhbCA2NC1iaXQgZ2RiIChleHByZXNzaW9uIGV2YWx1YXRpb24sIAorIyBpbiBwYXJ0aWN1bGFyKS4KKyMKK3NlbmRfZ2RiICJwL3ggXCRyMTlcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICIuKj0gMHhkZWFkYmVlZmJhZGNhZGVlLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBwYXNzICI2NC1iaXQgd29ya3MiCisgICAgICAgIH0KKyAgICAgICAgLXJlICIuKj0gMHhiYWRjYWRlZS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgcGFzcyAiMzItYml0IGV4dHJhY3Qgd2hlbiB1c2luZyBQUklOVDsgZXhwZWN0ZWQgYnV0IG5vdCBnb29kIgorICAgICAgICB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBmYWlsICJkaWRuJ3QgcHJpbnQgYW55IHBhcnQgb2YgcmlnaHQgdmFsdWUiCisgICAgICAgIH0KKyAgICAgICAgdGltZW91dCB7CisgICAgICAgICAgICBmYWlsICJ0aW1lb3V0IG9uIHByaW50IgorICAgICAgICB9CisgICAgfQorCisjIE5lZWQgdG8gYWRkIHRlc3RzIG9mIHNldHRpbmcgd2lkZSByZWdzIHRvby4gIEUuZy4KKyMKKyMgc2V0ICRyNCA9IDB4MTIzNDU2Nzg5MDEyMzQ1NgorIyBwL3ggJHI0CisjCisKKyMgZG9uZQorIworZ2RiX2V4aXQKK3JlbW90ZV9leGVjIGJ1aWxkICJybSAtZiAke2JpbmZpbGV9IgorcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3JlZy10ZXN0LnMgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9yZWctdGVzdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YmI1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9yZWctdGVzdC5zCkBAIC0wLDAgKzEsOTYgQEAKKzsgIGFzc2VtYmxlIGFzICJhcyAtbyByZWdfdGVzdC5leGUgcmVnX3Rlc3QucyIKKzsgb3IKKzsgIGNjIC1nIC1vICtEQTIuME4KKzsKKzsgUEEtUklTQyAyLjAgcmVnaXN0ZXIgY29udGVudHMgdGVzdC4KKzsKKyAgICAgICAgLmxldmVsIDIuMAorCisgICAgICAgIC5jb2RlCisgICAgICAgIC5leHBvcnQgbWFpbixFTlRSWQorICAgICAgICAuZXhwb3J0IG1haW5lbmQsQ09ERQorICAgICAgICAuZXhwb3J0IGxhYjEsQ09ERQorICAgICAgICAuc3BhY2UgJFRFWFQkCisgICAgICAgIC5zdWJzcGEgJENPREUkCisKK21haW4KKyAgICAgICAgLnByb2MKKyAgICAgICAgLmNhbGxpbmZvIE5PX0NBTExTLEZSQU1FPTAKKyAgICAgICAgLmVudHJ5CisKKyAgICAgICAgOzsgVGVzdCB3ZSBoYXZlIHJpZ2h0IHJlZ2lzdGVyIG51bWJlcnMKKyAgICAgICAgOzsKKyAgICAgICAgQUREICAgICAgICAgICAgICVyMCwlcjAsJXIxICAgICAgICAgICAgIDsgICAgMCAKKyAgICAgICAgTERJICAgICAgICAgICAgIDEsJXIxICAgICAgICAgICAgICAgICAgIDsgICAgMQorICAgICAgICA7OworICAgICAgICA7OyBEb24ndCBwdXQgYW55dGhpbmcgaW50byByMiBvciByMy0tdGhleSBhcmUgc3BlY2lhbCByZWdpc3RlcnMuCisgICAgICAgIDs7CisgICAgICAgIEFERCAgICAgICAgICAgICAlcjEsJXIxLCVyNCAgICAgICAgICAgICA7ICAgIDIKKyAgICAgICAgQUREICAgICAgICAgICAgICVyNCwlcjQsJXI1ICAgICAgICAgICAgIDsgICAgNAorICAgICAgICBBREQgICAgICAgICAgICAgJXI1LCVyNSwlcjYgICAgICAgICAgICAgOyAgICA4CisgICAgICAgIEFERCAgICAgICAgICAgICAlcjYsJXI2LCVyNyAgICAgICAgICAgICA7ICAgMTYKKyAgICAgICAgQUREICAgICAgICAgICAgICVyNywlcjcsJXI4ICAgICAgICAgICAgIDsgICAzMgorICAgICAgICBBREQgICAgICAgICAgICAgJXI4LCVyOCwlcjkgICAgICAgICAgICAgOyAgIDY0CisgICAgICAgIEFERCAgICAgICAgICAgICAlcjksJXI5LCVyMTAgICAgICAgICAgICA7ICAxMjgKKyAgICAgICAgQUREICAgICAgICAgICAgICVyMTAsJXIxMCwlcjExICAgICAgICAgIDsgIDI1NgorICAgICAgICBBREQgICAgICAgICAgICAgJXIxMSwlcjExLCVyMTIgICAgICAgICAgOyAgNTEyCisgICAgICAgIEFERCAgICAgICAgICAgICAlcjEyLCVyMTIsJXIxMyAgICAgICAgICA7IDEwMjQKKyAgICAgICAgQUREICAgICAgICAgICAgICVyMTMsJXIxMywlcjE0ICAgICAgICAgIDsgMjA0OAorICAgICAgICBBREQgICAgICAgICAgICAgJXIxNCwlcjE0LCVyMTUgICAgICAgICAgOyA0MDk2CisgICAgICAgIEFERCAgICAgICAgICAgICAlcjE1LCVyMTUsJXIxNiAgICAgICAgICA7IDkxOTIKKworICAgICAgICA7OyBUZXN0IGhpZ2ggYml0cywgdG8gYmUgc3VyZSB3ZSBzaG93IHRoZW0uCisgICAgICAgIDs7CisgICAgICAgIExESSAgICAgICAgICAgICAweGRlLCVyMTkgICAgICAgICAgICAgICA7ICJkZSIKKyAgICAgICAgREVQRCxaICAgICAgICAgICVyMTksNTUsNTYsJXIxOSAgICAgICAgIDsgImRlMDAiCisgICAgICAgIExESSAgICAgICAgICAgICAweGFkLCVyMTggICAgICAgICAgICAgICA7ICJhZCIKKyAgICAgICAgQUREICAgICAgICAgICAgICVyMTgsJXIxOSwlcjE5ICAgICAgICAgIDsgImRlYWQiCisgICAgICAgIERFUEQsWiAgICAgICAgICAlcjE5LDU1LDU2LCVyMTkgICAgICAgICA7ICJkZWFkMDAiCisgICAgICAgIExESSAgICAgICAgICAgICAweGJlLCVyMTggICAgICAgICAgICAgICA7ICJiZSIKKyAgICAgICAgQUREICAgICAgICAgICAgICVyMTgsJXIxOSwlcjE5ICAgICAgICAgIDsgImRlYWRiZSIKKyAgICAgICAgREVQRCxaICAgICAgICAgICVyMTksNTUsNTYsJXIxOSAgICAgICAgIDsgImRlYWRiZTAwIgorICAgICAgICBMREkgICAgICAgICAgICAgMHhlZiwlcjE4ICAgICAgICAgICAgICAgOyAiZWYiCisgICAgICAgIEFERCAgICAgICAgICAgICAlcjE4LCVyMTksJXIxOSAgICAgICAgICA7ICJkZWFkYmVlZiIKKyAgICAgICAgOworICAgICAgICBERVBELFogICAgICAgICAgJXIxOSw1NSw1NiwlcjE5ICAgICAgICAgOyAiZGVhZGJlZWYwMCIKKyAgICAgICAgTERJICAgICAgICAgICAgIDB4YmEsJXIxOCAgICAgICAgICAgICAgIDsgImJhIgorICAgICAgICBBREQgICAgICAgICAgICAgJXIxOCwlcjE5LCVyMTkgICAgICAgICAgOyAiZGVhZGJlZWZiYSIKKyAgICAgICAgREVQRCxaICAgICAgICAgICVyMTksNTUsNTYsJXIxOSAgICAgICAgIDsgImRlYWRiZWVmYmEwMCIKKyAgICAgICAgTERJICAgICAgICAgICAgIDB4ZGMsJXIxOCAgICAgICAgICAgICAgIDsgImRjIgorICAgICAgICBBREQgICAgICAgICAgICAgJXIxOCwlcjE5LCVyMTkgICAgICAgICAgOyAiZGVhZGJlZWZiYWRjIgorICAgICAgICBERVBELFogICAgICAgICAgJXIxOSw1NSw1NiwlcjE5ICAgICAgICAgOyAiZGVhZGJlZWZiYWRjMDAiCisgICAgICAgIExESSAgICAgICAgICAgICAweGFkLCVyMTggICAgICAgICAgICAgICA7ICJhZCIKKyAgICAgICAgQUREICAgICAgICAgICAgICVyMTgsJXIxOSwlcjE5ICAgICAgICAgIDsgImRlYWRiZWVmYmFkY2FkIgorICAgICAgICBERVBELFogICAgICAgICAgJXIxOSw1NSw1NiwlcjE5ICAgICAgICAgOyAiZGVhZGJlZWZiYWRjYWQwMCIKKyAgICAgICAgTERJICAgICAgICAgICAgIDB4ZWUsJXIxOCAgICAgICAgICAgICAgIDsgImVlIgorICAgICAgICBBREQgICAgICAgICAgICAgJXIxOCwlcjE5LCVyMTkgICAgICAgICAgOyAiZGVhZGJlZWZiYWRjYWRlZSIKKyAgICAgICAgCitsYWIxICAgIDs7IFRlc3QgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzCisgICAgICAgIDs7CisgICAgICAgIExESUwgICAgICAgICAgICBMUidvbmUsJXIyMiAgICAgICAgICAgICA7CisgICAgICAgIEZMREQgICAgICAgICAgICBSUidvbmUoJXIyMiksJWZyNCAgICAgICA7ICAgMS4wCisgICAgICAgIEZMREQgICAgICAgICAgICBSUidvbmUrOCglcjIyKSwlZnI1ICAgICA7ICAgMi4wCisgICAgICAgIEZMREQgICAgICAgICAgICBSUidvbmUrOCglcjIyKSwlZnI2ICAgICA7ICAgMi4wCisgICAgICAgIEZNUFksREJMICAgICAgICAlZnI1LCVmcjYsJWZyNyAgICAgICAgICA7ICAgNC4wCisgICAgICAgIEZNUFksREJMICAgICAgICAlZnI2LCVmcjcsJWZyOCAgICAgICAgICA7ICAgOC4wCisgICAgICAgIEZNUFksREJMICAgICAgICAlZnI3LCVmcjgsJWZyOSAgICAgICAgICA7ICAzMi4wCisgICAgICAgIEZNUFksREJMICAgICAgICAlZnI4LCVmcjksJWZyMTAgICAgICAgICA7IDI1Ni4wCisgICAgICAgIAorICAgICAgICA7OyBUaGUgTk9QIHByZXZlbnRzIGFueXRoaW5nIGZyb20gZW5kLm8gb3IgY3J0MC5vIGZyb20KKyAgICAgICAgOzsgYmVpbmcgYXBwZW5kZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgIm1haW5lbmQiLiAgSWYgdGhhdAorICAgICAgICA7OyBoYXBwZW5zLCB0aGVuIHdlIG1heSBoYXZlIG90aGVyIGxhYmVscyB0aGF0IGhhdmUgdGhlCisgICAgICAgIDs7IHNhbWUgYWRkcmVzcyBhcyAibWFpbmVuZCIsIGFuZCB0aHVzIHRoZSBkZWJ1Z2dlcgorICAgICAgICA7OyBtYXkgc3ltYm9saXplIHRoaXMgUEMgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gIm1haW5lbmQiLgorbWFpbmVuZCAgICAgICAgICAgICAgICAKKyAgICAgICAgTk9QCisgICAgICAgIC5leGl0CisgICAgICAgIC5wcm9jZW5kCisKKyAgICAgICAgLnNwYWNlICRURVhUJAorICAgICAgICAuc3Vic3BhICRDT0RFJAorICAgICAgICAuc3Vic3BhICRMSVQkICAgICAgICA7OyA8ZG9uJ3QgdXNlPiAsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTB4MmMsU09SVD0xNgorb25lCisgICAgICAgIC5hbGlnbiA4CisgICAgICAgIC5zdHJpbmd6ICAgICAgICAiP1x4RjBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBAXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorICAgICAgICAuZW5kCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3J1bi1ocC5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvcnVuLWhwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkYTFlMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3J1bi1ocC5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKglUaGlzIHNpbXBsZSBjbGFzc2ljYWwgZXhhbXBsZSBvZiByZWN1cnNpb24gaXMgdXNlZnVsIGZvcgorICoJdGVzdGluZyBzdGFjayBiYWNrdHJhY2VzIGFuZCBzdWNoLgorICovCisKKyNpZmRlZiB2eHdvcmtzCisKKyMgIGluY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIFZ4V29ya3MgZG9lcyBub3Qgc3VwcGx5IGF0b2kuICAqLworc3RhdGljIGludAorYXRvaSAoeikKKyAgICAgY2hhciAqejsKK3sKKyAgaW50IGkgPSAwOworCisgIHdoaWxlICgqeiA+PSAnMCcgJiYgKnogPD0gJzknKQorICAgIGkgPSBpICogMTAgKyAoKnorKyAtICcwJyk7CisgIHJldHVybiBpOworfQorCisvKiBJIGRvbid0IGtub3cgb2YgYW55IHdheSB0byBwYXNzIGFuIGFycmF5IHRvIFZ4V29ya3MuICBUaGlzIGZ1bmN0aW9uCisgICBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGZyb20gZ2RiLiAgKi8KKwordnhtYWluIChhcmcpCitjaGFyICphcmc7Cit7CisgIGNoYXIgKmFyZ3ZbMl07CisKKyAgYXJndlswXSA9ICIiOworICBhcmd2WzFdID0gYXJnOworICBtYWluICgyLCBhcmd2LCAoY2hhciAqKikgMCk7Cit9CisKKyNlbHNlIC8qICEgdnh3b3JrcyAqLworIyAgaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZiAvKiAhIHZ4d29ya3MgKi8KKworbWFpbiAoYXJnYywgYXJndiwgZW52cCkKK2ludCBhcmdjOworY2hhciAqYXJndltdLCAqKmVudnA7Cit7CisjaWZkZWYgdXNlc3R1YnMKKyAgICBzZXRfZGVidWdfdHJhcHMoKTsKKyAgICBicmVha3BvaW50KCk7CisjZW5kaWYKKyNpZmRlZiBGQUtFQVJHVgorICAgIHByaW50ZiAoIiVkXG4iLCBmYWN0b3JpYWwgKDEpKTsKKyNlbHNlICAgIAorICAgIGlmIChhcmdjICE9IDIpIHsKKwlwcmludGYgKCJ1c2FnZTogIGZhY3RvcmlhbCA8bnVtYmVyPlxuIik7CisJcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKwlwcmludGYgKCIlZFxuIiwgZmFjdG9yaWFsIChhdG9pIChhcmd2WzFdKSkpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitpbnQgZmFjdG9yaWFsICh2YWx1ZSkKK2ludCB2YWx1ZTsKK3sKKyAgICBpbnQgIGxvY2FsX3ZhcjsKKworICAgIGlmICh2YWx1ZSA+IDEpIHsKKwl2YWx1ZSAqPSBmYWN0b3JpYWwgKHZhbHVlIC0gMSk7CisgICAgfQorICAgIGxvY2FsX3ZhciA9IHZhbHVlOworICAgIHJldHVybiAodmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvc2l6ZWQtZW51bS5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvc2l6ZWQtZW51bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZDU3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9zaXplZC1lbnVtLmMKQEAgLTAsMCArMSw0MyBAQAorCitlbnVtIE5vcm1hbCB7CisgIHJlZCwKKyAgYmx1ZSwKKyAgZ3JlZW4KK307CisKK3Nob3J0IGVudW0gU21hbGwgeworICBwaW5rLAorICBjeWFuLAorICBncmV5Cit9OworCitjaGFyIGVudW0gVGlueSB7CisgIG9yYW5nZSwKKyAgeWVsbG93LAorICBicm93bgorfTsKKworCittYWluKCkKK3sKKyAgZW51bSBOb3JtYWwgbm9ybWFsWzNdOworICBzaG9ydCBlbnVtIFNtYWxsIHNtYWxsWzNdOworICBjaGFyIGVudW0gVGlueSB0aW55WzNdOworICBpbnQgaTsKKworICBmb3IgKGk9MDsgaSA8IDM7IGkrKykKKyAgICB7CisgICAgICBub3JtYWxbaV0gPSAoZW51bSBOb3JtYWwpIGk7CisgICAgICBzbWFsbFtpXSA9IChzaG9ydCBlbnVtIFNtYWxsKSBpOworICAgICAgdGlueVtpXSA9IChjaGFyIGVudW0gVGlueSkgaTsKKyAgICB9CisgIG5vcm1hbFswXSA9IDA7IC8qIHBsYWNlIHRvIGhhbmcgYSBicmVha3BvaW50ICovIAorfQorCisgICAgCisgIAorCisgIAorCisKKyAgCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC9zaXplZC1lbnVtLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3NpemVkLWVudW0uZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MTA1MGEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9zaXplZC1lbnVtLmV4cApAQCAtMCwwICsxLDE2MiBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBHREIgdGVzdHMgZm9yIHNpemVkIGVudW1lcmF0aW9ucworCisjIFRoaXMgaXMgYWltZWQgYXQgSFAtVVggc3lzdGVtcy4gIFRoZSBIUCBDIGNvbXBpbGVyCisjIGFsbG93cyBzcGVjaWZ5aW5nICJjaGFyIiBvciAic2hvcnQiIGZvciBhbiBlbnVtLCB0bworIyBpbmRpY2F0ZSB0aGF0IGl0IGlzIDEgb3IgMiBieXRlcyBsb25nLgorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBTYXRpc2ggUGFpIDxwYWlAYXBvbGxvLmhwLmNvbT4KKyMgMTk5Ny0wOS0yNAorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKKwl9CisKKyMKKyMgdGVzdCBydW5uaW5nIHByb2dyYW1zCisjCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJzaXplZC1lbnVtIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0geworICAgIHJldHVybiAtMQorfQorCitpZiB7W3NraXBfaHBfdGVzdHMgJGdjY19jb21waWxlZF19IHRoZW4geyBjb250aW51ZSB9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisjCisjIHNldCBpdCB1cCBhdCBhIGJyZWFrcG9pbnQgc28gd2UgY2FuIHBsYXkgd2l0aCB0aGUgdmFyaWFibGUgdmFsdWVzCisjCisKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgcGVycm9yICJjb3VsZG4ndCBydW4gdG8gYnJlYWtwb2ludCIKKyAgICBjb250aW51ZQorfQorCisjIHNldCBhIGJyZWFrcG9pbnQgYW5kIGdvIHRoZXJlCitzZW5kX2dkYiAiYnJlYWsgMzRcbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJCcmVha3BvaW50IFxbMC05XF0gYXQuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAic2V0IGJyZWFrIDM0IiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJzZXQgYnJlYWsgMzQiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHNldCBicmVhayAzNCIgfQorfQorc2VuZF9nZGIgImNvbnRpbnVlXG4iICAgCitnZGJfZXhwZWN0IHsgICAKKyAgIC1yZSAiQ29udGludWluZ1xcLlxyXG5cclxuQnJlYWtwb2ludCBcWzAtOVxdKiwgbWFpbi4uLi5hdC4qc2l6ZWQtZW51bVxcLmM6MzRcclxuMzQuKlxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgImNvbnRpbnVlIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJjb250aW51ZSIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgY29udGludWUiIH0KK30KKworIyBwcmludCBzdHVmZgorc2VuZF9nZGIgInByaW50IG5vcm1hbFxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgIlxcJFxbMC05XF0qID0gXFx7cmVkLCBibHVlLCBncmVlblxcfS4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBub3JtYWwiIH0KKyAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgInByaW50IG5vcm1hbCIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgbm9ybWFsIiB9Cit9CitzZW5kX2dkYiAicHJpbnQgc21hbGxcbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJcXCRcWzAtOVxdKiA9IFxce3BpbmssIGN5YW4sIGdyZXlcXH0uKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgc21hbGwiIH0KKyAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgInByaW50IHNtYWxsIiB9CisgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBzbWFsbCIgfQorfQorc2VuZF9nZGIgInByaW50IHRpbnlcbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJcXCRcWzAtOVxdKiA9IFxce29yYW5nZSwgeWVsbG93LCBicm93blxcfS4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCB0aW55IiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwcmludCB0aW55IiB9CisgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCB0aW55IiB9Cit9CisKKyMgcHJpbnQgdHlwZSBzaXplcworc2VuZF9nZGIgInByaW50IHNpemVvZiAoTm9ybWFsKVxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgIlxcJFxbMC05XF0qID0gNC4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBzaXplb2YgKE5vcm1hbCkiIH0KKyAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgInByaW50IHNpemVvZiAoTm9ybWFsKSIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgc2l6ZW9mIChOb3JtYWwpIiB9Cit9CitzZW5kX2dkYiAicHJpbnQgc2l6ZW9mIChTbWFsbClcbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJcXCRcWzAtOVxdKiA9IDIuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgc2l6ZW9mIChTbWFsbCkiIH0KKyAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgInByaW50IHNpemVvZiAoU21hbGwpIiB9CisgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBzaXplb2YgKFNtYWxsKSIgfQorfQorc2VuZF9nZGIgInByaW50IHNpemVvZiAoVGlueSlcbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJcXCRcWzAtOVxdKiA9IDEuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgc2l6ZW9mIChUaW55KSIgfQorICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHJpbnQgc2l6ZW9mIChUaW55KSIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgc2l6ZW9mIChUaW55KSIgfQorfQorCisjIHByaW50IHR5cGVzCitzZW5kX2dkYiAicHR5cGUgbm9ybWFsXG4iICAgCitnZGJfZXhwZWN0IHsgICAKKyAgIC1yZSAidHlwZSA9IGVudW0gTm9ybWFsIFxce3JlZCwgYmx1ZSwgZ3JlZW5cXH0gXFxcWzNcXFxdLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIG5vcm1hbCIgfQorICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHR5cGUgbm9ybWFsIiB9CisgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBub3JtYWwiIH0KK30KK3NlbmRfZ2RiICJwdHlwZSBzbWFsbFxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgInR5cGUgPSBzaG9ydCBlbnVtIFNtYWxsIFxce3BpbmssIGN5YW4sIGdyZXlcXH0gXFxcWzNcXFxdLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIHNtYWxsIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwdHlwZSBzbWFsbCIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgc21hbGwiIH0KK30KK3NlbmRfZ2RiICJwdHlwZSB0aW55XG4iICAgCitnZGJfZXhwZWN0IHsgICAKKyAgIC1yZSAidHlwZSA9IGNoYXIgZW51bSBUaW55IFxce29yYW5nZSwgeWVsbG93LCBicm93blxcfSBcXFxbM1xcXF0uKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgdGlueSIgfQorICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHR5cGUgdGlueSIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgdGlueSIgfQorfQorCisjIGNvbnZlcnQgdG8gaW50CitzZW5kX2dkYiAicHJpbnQgKGludCkgYmx1ZVxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgIlxcJFxbMC05XF0qID0gMS4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCAoaW50KSBibHVlIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwcmludCAoaW50KSBibHVlIiB9CisgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCAoaW50KSBibHVlIiB9Cit9CitzZW5kX2dkYiAicHJpbnQgKGludCkgY3lhblxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgIlxcJFxbMC05XF0qID0gMS4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCAoaW50KSBjeWFuIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwcmludCAoaW50KSBjeWFuIiB9CisgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCAoaW50KSBjeWFuIiB9Cit9CitzZW5kX2dkYiAicHJpbnQgKGludCkgeWVsbG93XG4iICAgCitnZGJfZXhwZWN0IHsgICAKKyAgIC1yZSAiXFwkXFswLTlcXSogPSAxLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IChpbnQpIHllbGxvdyIgfQorICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHJpbnQgKGludCkgeWVsbG93IiB9CisgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCAoaW50KSB5ZWxsb3ciIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3NvLXRocmVzaC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9zby10aHJlc2guZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NzdlOTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9zby10aHJlc2guZXhwCkBAIC0wLDAgKzEsMzYyIEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorCX0KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKKyMgYXJlIHdlIG9uIGEgdGFyZ2V0IGJvYXJkCitpZiAhW2lzbmF0aXZlXSB0aGVuIHsKKyAgICByZXR1cm4KK30KKworc2V0IHRlc3RmaWxlICJzby10aHJlc2giCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9XSB7CisgICAgcmV0dXJuIC0xCit9CisKKyMgVGhpcyB0ZXN0Y2FzZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCwgdmlhIHRoZQorIyBnZW4tc28tdGhyZXNoIHByb2dyYW0sIHdoaWNoIGFsc28gc2hvdWxkCisjIGxpdmUgaW4gdGhpcyBzYW1lIGRpcmVjdG9yeS4KKyMKKyMgVGhlIGdlbmVyYXRvciBwcm9kdWNlczoKKyMgICAtIHNvLXRocmVzaC5jCisjICAgLSAzIC5jIGZpbGVzIG5hbWVkIGxpYlhYLXNvLXRocmVzaC5jCisjICAgLSBhIG1ha2VmaWxlIG5hbWVkIHNvLXRocmVzaC5tayB3aXRoIGEKKyMgICAgIHRhcmdldCBuYW1lZCAic28tdGhyZXNoIiB0aGF0IHdpbGwgY29tcGlsZQorIyAgICAgYW5kIGxpbmsgdGhlIHRlc3RjYXNlCisjCisjIE1ha2luZyB3aXRoIHNvLXRocmVzaC5tayBwcm9kdWNlczoKKyMgICAtIHNvLXRocmVzaAorIyAgIC0gMyBzaGFyZWQgbGlicmFyaWVzIHRoYXQgYXJlIGxpbmtlZCBhZ2FpbnN0LCBuYW1lZAorIyAgICAgbGliWFgtc28tdGhyZXNoLnNsCisjCisjIFdlIGJ1aWxkIGdlbi1zby10aHJlc2gsIHJ1biBpdCwgYW5kIHRoZW4gbWFrZSB3aXRoCisjIHRoZSBtYWtlZmlsZSBpdCBwcm9kdWNlcy4KKyMKK3NldCBnZW5maWxlIGdlbl8ke3Rlc3RmaWxlfQorc2V0IGdlbl9zcmNmaWxlICR7Z2VuZmlsZX0uYworc2V0IGdlbl9iaW5maWxlICR7Z2VuZmlsZX0KK3NldCBnZW5fbWFrZWZpbGUgJHt0ZXN0ZmlsZX0ubWsKKworIyBUaGlzIHRlc3RjYXNlIGlzIHJlbGF0aXZlbHkgbGFyZ2UsIGFuZCB0aGVyZWZvcmUgY2FuIHRha2UgYXdoaWxlIHRvCisjIGxvYWQuICBXZSdkIGJlc3Qgc2V0IHRoZSB0aW1lb3V0IHRvIHNvbWV0aGluZyBzdWl0YWJsZSwgb3Igd2UgbWF5CisjIHNlZW0gdG8gZmFpbC4uLgorIworc2V0IHRpbWVvdXQgNjAKKworIyBJdCdzIGVhc2llc3QgdG8gYnVpbGQgYW5kIHJ1biB0aGUgdGVzdGNhc2UgaW4gdGhpcyBkaXJlY3RvcnkuICAoTGlua2luZworIyBhZ2FpbnN0IHNobGlicyBwdXRzIHJlbGF0aXZlIHBhdGhzIHRvIHRoZW0gaW4gdGhlIGEub3V0LCBzbyBpdCdzIGJlc3QKKyMgaWYgd2UgcmVtYWluIGluIHRoaXMgZGlyZWN0b3J5IGZvciB0aGUgZW50aXJlIHRlc3QgcnVuLikKKyMKKyNjZCBnZGIuYmFzZQorCisjIEVuc3VyZSB0aGF0IHRoZSB0ZXN0Y2FzZSBpcyBidWlsdC4gIFRoaXMgbWF5IGNhdXNlIHRoZSBnZW5lcmF0b3IgdG8KKyMgYmUgYnVpbHQgJiBydW4uCisjCisjIFdhcm5pbmchICBUaGUgZmluYWwgbGluayBvZiB0aGlzIHRlc3RjYXNlIGlzIG5vdCBmb3IgdGhlCisjIGZhaW50LWhlYXJ0ZWQgbm9yIHVuZGVyLWRpc2tlZCBtYWNoaW5lIQorIworIyA/P3JlaHJhdWVyOiBJIHRyaWVkIGZvciBhIHZlcnkgbG9uZyB0aW1lIHRvIGdldCBtYWtlIGludm9rZWQKKyMgZGlyZWN0bHkgaGVyZSwgcmF0aGVyIHRoYW4gaW52b2tpbmcgYSBzY3JpcHQgdG8gZG8gaXQuICBJCisjIGZpbmFsbHkgZ2F2ZSB1cCBpbiBmcnVzdHJhdGlvbjsgSSdtIG5vdCBzdXJlIHdoeSBpdCB3b3VsZG4ndAorIyB3b3JrIHRoYXQgd2F5LCBidXQgdGhpcyBtZXRob2QgRE9FUyB3b3JrLCBhbGJlaXQgY2x1bXNpbHkuCisjCisKK3NlbmRfdXNlciAiTWFraW5nIHdpdGggJHt0ZXN0ZmlsZX0ubWsgLi4uXG4iCisjIHJlbW90ZV9leGVjIGJ1aWxkICJzaCAtYyBcXFwiY2QgJHtvYmpkaXJ9LyR7c3ViZGlyfVxcOyBtYWtlIC12IC1mICR7c3JjZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0ubWsgY2xlYW4gcmVxdWlyZV9zaGxpYnMgYWxsIFNSQ0RJUj0ke3NyY2Rpcn0vJHtzdWJkaXJ9IE9CSkRJUj0ke29iamRpcn0vJHtzdWJkaXJ9XFxcIiIKK3JlbW90ZV9leGVjIGJ1aWxkICJzaCAtYyBcXFwiY2QgJHtvYmpkaXJ9LyR7c3ViZGlyfVxcOyBtYWtlIC12IC1mICR7c3JjZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0ubWsgY2xlYW4gcmVxdWlyZV9zaGxpYnMgYWxsIFNSQ0RJUj0ke3NyY2Rpcn0vJHtzdWJkaXJ9IE9CSkRJUj0ke29iamRpcn0vJHtzdWJkaXJ9XFxcIiIKKworIyBPbmx5IEhQLVVYIChhbmQgYW55IG90aGVyIHBsYXRmb3JtcyB1c2luZyBTT00gc2hhcmVkIGxpYnJhcmllcywgSQorIyBndWVzcykgaW50ZXJwcmV0cyB0aGUgYXV0by1zb2xpYi1hZGQgdmFyaWFibGUgYXMgYSB0aHJlc2hob2xkLAorIyByYXRoZXIgdGhhbiBhIGJvb2xlYW4gdGhhdCBzdHJpY3RseSBlbmFibGVzIG9yIGRpc2FibGVzIGF1dG9tYXRpYworIyBsb2FkaW5nIG9mIHNobGliIHN5bWJvbCB0YWJsZXMuCisjCisjIE9uIEhQLVVYLCBpdCBpcyB0aGUgc2l6ZSB0aHJlc2hob2xkIChpbiBtZWdhYnl0ZXMpIGF0IHdoaWNoIHRvCisjIHN0b3AgYXV0byBsb2FkaW5nIG9mIHN5bWJvbCB0YWJsZXMuCisjCitpZiAhW2lzdGFyZ2V0ICJocHBhKi1ocC1ocHV4KiJdIHRoZW4geworICAgc2V0dXBfeGZhaWwgIiotKi0qIgorfQorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIKKyMKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisjIFRoaXMgaXMgYSB0ZXN0IG9mIGdkYidzIGFiaWxpdHkgb24gSFAtVVggdG8gc3RvcCBhdXRvbWF0aWNhbGx5CisjIGxvYWRpbmcgc3ltYm9scyBvZiBzaGFyZWQgbGlicmFyaWVzLCB3aGVuIHRoZSB0b3RhbCBzaXplIG9mIHRoZQorIyBkZWJ1Z2dlcidzIHN5bWJvbCB0YWJsZSByZWFjaGVzIGEgc3BlY2lmaWVkIHRocmVzaGhvbGQuCisjCisKKyMgT24gSFAtVVgsIHRoZSBoZWxwIHRleHQgZm9yIGF1dG8tc29saWItYWRkIG1lbnRpb25zIHRoYXQgaXQKKyMgc2VydmVzIGFzIGEgdGhyZXNoaG9sZC4KKyMKK3NlbmRfZ2RiICJoZWxwIHNldCBhdXRvLXNvbGliLWFkZFxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiU2V0IGF1dG9sb2FkaW5nIHNpemUgdGhyZXNob2xkIC5pbiBtZWdhYnl0ZXMuIG9mIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbHMuKgorSWYgbm9uemVybywgc3ltYm9scyBmcm9tIGFsbCBzaGFyZWQgb2JqZWN0IGxpYnJhcmllcyB3aWxsIGJlIGxvYWRlZC4qCithdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGluZmVyaW9yIGJlZ2lucyBleGVjdXRpb24gb3Igd2hlbiB0aGUgZHluYW1pYyBsaW5rZXIuKgoraW5mb3JtcyBnZGIgdGhhdCBhIG5ldyBsaWJyYXJ5IGhhcyBiZWVuIGxvYWRlZCwgdW50aWwgdGhlIHN5bWJvbCB0YWJsZS4qCitvZiB0aGUgcHJvZ3JhbSBhbmQgbGlicmFyaWVzIGV4Y2VlZHMgdGhpcyB0aHJlc2hvbGQuKgorT3RoZXJ3aXNlLCBzeW1ib2xzIG11c3QgYmUgbG9hZGVkIG1hbnVhbGx5LCB1c2luZyBgc2hhcmVkbGlicmFyeScuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJoZWxwIHNldCBhdXRvLXNvbGliLWFkZCJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImhlbHAgc2V0IGF1dG8tc29saWItYWRkIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGhlbHAgc2V0IGF1dG8tc29saWItYWRkIn0KK30KKworIyBPbiBIUC1VWCwgdGhlIHRocmVzaGhvbGQgaXMgYnkgZGVmYXVsdCBzZXQgdG8gNTAsIHdoaWNoIG1lYW5zCisjIDUwIG1lZ2FieXRlcy4KKyMKK3NlbmRfZ2RiICJzaG93IGF1dG8tc29saWItYWRkXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJBdXRvbG9hZGluZyBzaXplIHRocmVzaG9sZCAuaW4gbWVnYWJ5dGVzLiBvZiBzaGFyZWQgbGlicmFyeSBzeW1ib2xzIGlzIDEwMC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInNob3cgYXV0by1zb2xpYi1hZGQgKGRlZmF1bHQgaXMgMTAwKSJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgInNob3cgYXV0by1zb2xpYi1hZGQgKGRlZmF1bHQgaXMgMTAwKSJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzaG93IGF1dG8tc29saWItYWRkIChkZWZhdWx0IGlzIDEwMCkifQorfQorCitzZW5kX2dkYiAic2V0IGF1dG8tc29saWItYWRkIDFcbiIKK2dkYl9leHBlY3QgeworICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCisgICAgICAgICAgICB7cGFzcyAic2V0IGF1dG8tc29saWItYWRkIHRvIDEifQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiCisgICAgICAgICAgICB7ZmFpbCAic2V0IGF1dG8tc29saWItYWRkIHRvIDEifQorICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHNldCBhdXRvLXNvbGliLWFkZCB0byAxIn0KK30KKworCisjIFdlIGhhdmUgbWFudWFsbHkgdmVyaWZpZWQgdGhhdCBvdXIgdGVzdGNhc2UgZXhjZWVkcyAxIE1ieXRlcworIyBvZiBoZWFwIHNwYWNlIGluIEdEQiB0byBob2xkIHRoZSBzeW1ib2xzIGZvciB0aGUgbWFpbiBwcm9ncmFtCisjIGFuZCBhbGwgYXNzb2NpYXRlZCBsaW5rZWQtYWdhaW5zdCBsaWJyYXJpZXMuICBUaHVzLCB3aGVuIHdlCisjIHJ1biB0byB0aGUgcHJvZ3JhbSdzIG1haW4sIGFuZCB0aGVyZWZvcmUgbm90aWNlIGFsbCB0aGUgbGlua2VkLQorIyBhZ2FpbnN0IHNobGlicywgd2UgZXhwZWN0IHRvIGhpdCB0aGUgdGhyZXNoaG9sZC4KKyMKKyMgKE5vdGUgdGhhdCB3ZSdyZSBub3QgdXNpbmcgdGhlIGV4cGVjdCBbcnVudG8gbWFpbl0gZnVuY3Rpb24gaGVyZSwKKyMgJ2NhdXNlIHdlIHdhbnQgdG8gbWF0Y2ggb24gb3V0cHV0IGZyb20gdGhlIHJ1biBjb21tYW5kLgorIworc2VuZF9nZGIgImJyZWFrIG1haW5cbiIKK2dkYl9leHBlY3QgeworICAtcmUgIkJyZWFrcG9pbnQgXFswLTlcXSogYXQuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzZXQgYnJlYWsgYXQgbWFpbiJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgInNldCBicmVhayBhdCBtYWluIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHNldCBicmVhayBhdCBtYWluIn0KK30KKworc2VuZF9nZGIgInJ1blxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiLip3YXJuaW5nLiBTeW1ib2xzIGZvciBzb21lIGxpYnJhcmllcyBoYXZlIG5vdCBiZWVuIGxvYWRlZCwgYmVjYXVzZS4qCitkb2luZyBzbyB3b3VsZCBleGNlZWQgdGhlIHNpemUgdGhyZXNob2xkIHNwZWNpZmllZCBieSBhdXRvLXNvbGliLWFkZC4qCitUbyBtYW51YWxseSBsb2FkIHN5bWJvbHMsIHVzZSB0aGUgJ3NoYXJlZGxpYnJhcnknIGNvbW1hbmQuKgorVG8gcmFpc2UgdGhlIHRocmVzaG9sZCwgc2V0IGF1dG8tc29saWItYWRkIHRvIGEgbGFyZ2VyIHZhbHVlIGFuZCByZXJ1bi4qCit0aGUgcHJvZ3JhbS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInJ1biB0byBtYWluIGhpdCBhdXRvLXNvbGliLWFkZCB0aHJlc2hvbGQifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJydW4gdG8gbWFpbiBoaXQgYXV0by1zb2xpYi1hZGQgdGhyZXNob2xkIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHJ1biB0byBtYWluIGhpdCBhdXRvLXNvbGliLWFkZCB0aHJlc2hvbGQifQorfQorCisjIFZlcmlmeSB0aGF0ICJpbmZvIHNoYXJlIiBtZW50aW9ucyBzb21ldGhpbmcgYWJvdXQgbGlicmFyaWVzIHdob3NlCisjIHN5bWJvbHMgd2VyZW4ndCBsb2FkZWQuCisjCisjIFdlJ2xsIGFzc3VtZSB0aGF0IGF0IGxlYXN0IHRoZSBsYXN0IHR3byBzaGxpYidzIHN5bWJvbHMgd2VyZW4ndAorIyBsb2FkZWQuICBBcyBhIHNpZGUtZWZmZWN0IG9mIG1hdGNoaW5nIHRoaXMgcGF0dGVybiwgdGhlIHRleHQgc3RhcnQKKyMgYWRkcmVzcyBvZiB0aGUgbGFzdCBvbmUgaXMgY2FwdHVyZWQgaW4gZXhwZWN0X291dCgxLHN0cmluZykuCisjICh3ZSdsbCBuZWVkIGl0IGZvciB0aGUgJ2FkZC1zeW1ib2wtZmlsZScgY29tbWFuZCBpbiBhIG5vbmNlLi4uKQorIworc2VuZF9nZGIgImluZm8gc2hhcmVkbGlicmFyeVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiLipsaWIwMV8kdGVzdGZpbGUuc2wgLipzeW1ib2xzIG5vdCBsb2FkZWQuKjB4XFswLTlcXSogICgweFxbMC05YS1mQS1GXF0qKS4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgeyBzZW5kX2dkYiAiYWRkLXN5bWJvbC1maWxlIGxpYjAyXyR0ZXN0ZmlsZS5zbCAkZXhwZWN0X291dCgxLHN0cmluZylcbiIKKyAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAtcmUgImFkZCBzeW1ib2wgdGFibGUuKnkgb3Igbi4qJCJcCisgICAgICAgICAgICAgICAgICAgICAge3NlbmRfZ2RiICJ5XG4iCisgICAgICAgICAgICAgICAgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgICAgICAgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIge3Bhc3MgImFkZC1zeW1ib2wtZmlsZSBhbmQgaW5mbyBzaGFyZWRsaWIifQorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBhZGQtc3ltYm9sLWZpbGUgYW5kIGluZm8gc2hhcmVkbGliIn0KKyAgICAgICAgICAgICAgICAgICAgICAgfX0KKyAgICAgICAgICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICAgICAgICB7ZmFpbCAiYWRkLXN5bWJvbC1maWxlIGFuZCBpbmZvIHNoYXJlZGxpYiJ9CisgICAgICAgICAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBhZGQtc3ltYm9sLWZpbGUgYW5kIGluZm8gc2hhcmVkbGliIn0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge2ZhaWwgImluZm8gc2hhcmVkbGlicmFyeSBzaG93cyBzaGxpYnMgd2l0aCB1bmxvYWRlZCBzeW1ib2xzIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGluZm8gc2hhcmVkbGlicmFyeSBzaG93cyBzaGxpYnMgd2l0aCB1bmxvYWRlZCBzeW1ib2xzIn0KK30KKworIyBWZXJpZnkgdGhhdCB3ZSBjYW4gbWFudWFsbHkgbG9hZCB0aGUgc3ltYm9sIHRhYmxlIG9mIGEgbGlicmFyeQorIyB3aG9zZSBzeW1ib2xzIHdlcmVuJ3QgbG9hZGVkLiAgKFdlJ2xsIHBpY2sgdGhlIGxhc3Qgb25lLikKKyMKKworIyBJIG1vdmVkIHRoaXMgdGVzdCBpbnNpZGUgdGhlIG9uZSBhYm92ZSwgYmVjYXVzZSB0aGUgZXhwZWN0X291dCBhcnJheSBpcyBub3Qgb2sgaWYgdGhlCisjIHByZXZpb3VzIHRlc3QgaGFzIGZhaWxlZCwgYW5kIGV4cGVjdCB3b3VsZCBlcnJvciBvdXQgKGVseikKKyMKKyNzZW5kX2dkYiAiYWRkLXN5bWJvbC1maWxlIGxpYjAyXyR0ZXN0ZmlsZS5zbCAkZXhwZWN0X291dCgxLHN0cmluZylcbiIKKyNnZGJfZXhwZWN0IHsKKyMgIC1yZSAiYWRkIHN5bWJvbCB0YWJsZS4qeSBvciBuLiokIlwKKyMgICAgICAgICAge3NlbmRfZ2RiICJ5XG4iCisjICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyMgICAgICAgICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7cGFzcyAiYWRkLXN5bWJvbC1maWxlIn0KKyMgICAgICAgICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGFkZC1zeW1ib2wtZmlsZSJ9CisjICAgICAgICAgICB9fQorIyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyMgICAgICAgICAge2ZhaWwgImFkZC1zeW1ib2wtZmlsZSJ9CisjICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgYWRkLXN5bWJvbC1maWxlIn0KKyN9CisKKyMgVmVyaWZ5IHRoYXQgd2UgY2FuIG1hbnVhbGx5IGxvYWQgdGhlIHN5bWJvbHMgZm9yIGFsbCBsaWJyYXJpZXMKKyMgd2hpY2ggd2VyZW4ndCBhbHJlYWR5IGxvYWRlZC4KKyMKKyMgV2FybmluZyEgIE9uIGEgbWFjaGluZSB3aXRoIGxpdHRsZSBmcmVlIHN3YXAgc3BhY2UsIHRoaXMgbWF5CisjIGZhaWwhCisjCitzZW5kX2dkYiAic2hhcmVkbGlicmFyeVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiUmVhZGluZyBzeW1ib2xzIGZyb20uKmRvbmUuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzaGFyZWRsaWJyYXJ5In0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAic2hhcmVkbGlicmFyeSJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzaGFyZWRsaWJyYXJ5In0KK30KKworIyBSZXJ1biB0aGUgcHJvZ3JhbSwgdGhpcyB0aW1lIHZlcmlmeWluZyB0aGF0IHdlIGNhbiBzZXQgdGhlCisjIHRocmVzaGhvbGQgaGlnaCBlbm91Z2ggdG8gYXZvaWQgaGl0dGluZyBpdC4KKyMKKyMgSXQgYXBwZWFycyB0aGF0IGdkYiBpc24ndCBmcmVlaW5nIG1lbW9yeSB3aGVuIHJlcnVubmluZywgYXMgb25lCisjIHdvdWxkIGV4cGVjdC4gIFRvIGF2b2lkIHBvdGVudGlhbGx5IGhpdHRpbmcgYSB2aXJ0dWFsIG1lbW9yeQorIyBjZWlsaW5nLCBzdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorIworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKK3NlbmRfZ2RiICJicmVhayBtYWluXG4iCitnZGJfZXhwZWN0IHsKKyAgLXJlICJCcmVha3BvaW50IFxbMC05XF0qIGF0LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7cGFzcyAic2V0IGJyZWFrIGF0IG1haW4ifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJzZXQgYnJlYWsgYXQgbWFpbiJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZXQgYnJlYWsgYXQgbWFpbiJ9Cit9CisKK3NlbmRfZ2RiICJzZXQgYXV0by1zb2xpYi1hZGQgOTk5OVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInNldCBhdXRvLXNvbGliLWFkZCB0aHJlc2hvbGQgdG8gcHJhY3RpY2FsIGluZmluaXR5In0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHNldCBhdXRvLXNvbGliLWFkZCB0aHJlc2hvbGQgdG8gcHJhY3RpY2FsIGluZmluaXR5In0KK30KK3NlbmRfZ2RiICJydW5cbiIKK2dkYl9leHBlY3QgeworICAtcmUgIi4qd2FybmluZy4gU3ltYm9scyBmb3Igc29tZSBsaWJyYXJpZXMgaGF2ZSBub3QgYmVlbiBsb2FkZWQsIGJlY2F1c2UuKgorZG9pbmcgc28gd291bGQgZXhjZWVkIHRoZSBzaXplIHRocmVzaG9sZCBzcGVjaWZpZWQgYnkgYXV0by1zb2xpYi1hZGQuKgorVG8gbWFudWFsbHkgbG9hZCBzeW1ib2xzLCB1c2UgdGhlICdzaGFyZWRsaWJyYXJ5JyBjb21tYW5kLioKK1RvIHJhaXNlIHRoZSB0aHJlc2hvbGQsIHNldCBhdXRvLXNvbGliLWFkZCB0byBhIGxhcmdlciB2YWx1ZSBhbmQgcmVydW4uKgordGhlIHByb2dyYW0uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJyZXJ1biB0aHJlc2hvbGQgYXQgcHJhY3RpY2FsIGluZmluaXR5IChzdGlsbCBoaXQgdGhyZXNob2xkKSJ9CisgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInJlcnVuIHdpdGggdGhyZXNob2xkIGF0IHByYWN0aWNhbCBpbmZpbml0eSJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSByZXJ1biB3aXRoIHRocmVzaG9sZCBhdCBwcmFjdGljYWwgaW5maW5pdHkifQorfQorCisjIFJlcnVuIHRoZSBwcm9ncmFtLCB0aGlzIHRpbWUgYWx0b2dldGhlciBkaXNhYmxpbmcgdGhlIGF1dG8gbG9hZGluZworIyBmZWF0dXJlLiAgVGhlcmUgc2hvdWxkIGJlIG5vIGluZm9ybWF0aW9uIGF0IGFsbCBhYm91dCBzaGFyZWQKKyMgbGlicmFyaWVzIG5vdy4KKyMKKyMgPz9yZWhyYXVlcjogUGVyc29uYWxseSwgSSdkIGNhbGwgdGhhdCBhIGJ1Zywgc2luY2UgaXQgZG9lc24ndCBnaXZlCisjIHlvdSB0aGUgYWJpbGl0eSB0byBtYW51YWxseSBsb2FkIHNpbmdsZSBzaGxpYnMgKHlvdSBuZWVkIHRoZSB0ZXh0CisjIHN0YXJ0IGFkZHJlc3MgdGhhdCAnaW5mbyBzaGFyZScgbm9ybWFsbCBnaXZlcyB5b3UpLiAgT24gdGhlIG90aGVyCisjIGhhbmQsIG9uZSBjYW4gZWFzaWx5IGNob29zZSB0byBsb2FkIHRoZW0gYWxsLi4uCisjCisjIEl0IGFwcGVhcnMgdGhhdCBnZGIgaXNuJ3QgZnJlZWluZyBtZW1vcnkgd2hlbiByZXJ1bm5pbmcsIGFzIG9uZQorIyB3b3VsZCBleHBlY3QuICBUbyBhdm9pZCBwb3RlbnRpYWxseSBoaXR0aW5nIGEgdmlydHVhbCBtZW1vcnkKKyMgY2VpbGluZywgc3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKyMKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCitzZW5kX2dkYiAiYnJlYWsgbWFpblxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiQnJlYWtwb2ludCBcWzAtOVxdKiBhdC4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAge3Bhc3MgInNldCBicmVhayBhdCBtYWluIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAic2V0IGJyZWFrIGF0IG1haW4ifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc2V0IGJyZWFrIGF0IG1haW4ifQorfQorCitzZW5kX2dkYiAic2V0IGF1dG8tc29saWItYWRkIDBcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzZXQgYXV0by1zb2xpYi1hZGQgdGhyZXNob2xkIHRvIDAifQorICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc2V0IGF1dG8tc29saWItYWRkIHRocmVzaG9sZCB0byAwIn0KK30KK3NlbmRfZ2RiICJydW5cbiIKK2dkYl9leHBlY3QgeworICAtcmUgIi4qd2FybmluZy4gU3ltYm9scyBmb3Igc29tZSBsaWJyYXJpZXMgaGF2ZSBub3QgYmVlbiBsb2FkZWQsIGJlY2F1c2UuKgorZG9pbmcgc28gd291bGQgZXhjZWVkIHRoZSBzaXplIHRocmVzaG9sZCBzcGVjaWZpZWQgYnkgYXV0by1zb2xpYi1hZGQuKgorVG8gbWFudWFsbHkgbG9hZCBzeW1ib2xzLCB1c2UgdGhlICdzaGFyZWRsaWJyYXJ5JyBjb21tYW5kLioKK1RvIHJhaXNlIHRoZSB0aHJlc2hvbGQsIHNldCBhdXRvLXNvbGliLWFkZCB0byBhIGxhcmdlciB2YWx1ZSBhbmQgcmVydW4uKgordGhlIHByb2dyYW0uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtmYWlsICJyZXJ1biB0aHJlc2hvbGQgYXQgMCAoc3RpbGwgaGl0IHRocmVzaG9sZCkifQorICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJyZXJ1biB3aXRoIHRocmVzaG9sZCBhdCAwIn0KKyAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHJlcnVuIHdpdGggdGhyZXNob2xkIGF0IDAifQorfQorCisjIFZlcmlmeSB0aGF0IHdlIGNhbiBzdGlsbCBtYW51YWxseSBsb2FkIHN5bWJvbHMgZm9yIGFsbCBsaWJyYXJpZXMuCisjIChXZSdsbCBhc3N1bWUgdGhhdCBpZiB0aGUgbGFzdCBzaGxpYidzIHN5bWJvbHMgYXJlIGxvYWRlZCwgdGhhdAorIyBhbGwgb2YgdGhlbSB3ZXJlLikKKyMKKyMgTm90ZSB0aGF0IHdlIHNldCB0aGUgR0RCICJoZWlnaHQiIHZhcmlhYmxlIHRvIHByZXZlbnQgR0RCIGZyb20KKyMgcHJvbXB0aW5nIAorIworIyBXYXJuaW5nISAgT24gYSBtYWNoaW5lIHdpdGggbGl0dGxlIGZyZWUgc3dhcCBzcGFjZSwgdGhpcyBtYXkKKyMgZmFpbCEKKyMKK3NlbmRfZ2RiICJzZXQgaGVpZ2h0IDk5OTlcbiIKK2dkYl9leHBlY3QgeworICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJzZXQgc2NyZWVuIHBhZ2UgaGVpZ2h0IHRvIHByYWN0aWNhbCBpbmZpbml0eSJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBzZXQgc2NyZWVuIHBhZ2UgaGVpZ2h0IHRvIHByYWN0aWNhbCBpbmZpbml0eSJ9Cit9CitzZW5kX2dkYiAic2hhcmVkbGlicmFyeVxuIgorZ2RiX2V4cGVjdCB7CisgIC1yZSAiLipSZWFkaW5nIHN5bWJvbHMgZnJvbSAuKi9saWIwMi1zby10aHJlc2hcXC5zbFxcLlxcLlxcLmRvbmVcXC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgIHtwYXNzICJtYW51YWxseSBsb2FkIGFsbCBzeW1ib2xzIn0KKyAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICB7ZmFpbCAibWFudWFsbHkgbG9hZCBhbGwgc3ltYm9scyJ9CisgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBtYW51YWxseSBsb2FkIGFsbCBzeW1ib2xzIn0KK30KKworI2NkIC4uCityZXR1cm4gMApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvc28tdGhyZXNoLmxpbmtvcHRzIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvc28tdGhyZXNoLmxpbmtvcHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0N2I0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9zby10aHJlc2gubGlua29wdHMKQEAgLTAsMCArMSw1IEBACisjIExpbmtlciBvcHRpb25zIGZvciBzby10aHJlc2ggdGVzdAorLWwwMC1zby10aHJlc2gKKy1sMDEtc28tdGhyZXNoCistbDAyLXNvLXRocmVzaAorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC9zby10aHJlc2gubWsgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9zby10aHJlc2gubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzMTg1YwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3NvLXRocmVzaC5tawpAQCAtMCwwICsxLDczIEBACisjIE1ha2UgZmlsZSBmb3Igc28tdGhyZXNoIHRlc3QKKworT0JKRElSPS4KK1NSQ0RJUj0uCitDRkxBR1MgPSArREExLjEgLWcKKworIyBUaGlzIGlzIGhvdyB0byBidWlsZCB0aGlzIGdlbmVyYXRvci4KK2dlbi1zby10aHJlc2gubzogJHtTUkNESVJ9L2dlbi1zby10aHJlc2guYworCSQoQ0MpICQoQ0ZMQUdTKSAtbyBnZW4tc28tdGhyZXNoLm8gLWMgJHtTUkNESVJ9L2dlbi1zby10aHJlc2guYworZ2VuLXNvLXRocmVzaDogZ2VuLXNvLXRocmVzaC5vCisJJChDQykgJChDRkxBR1MpIC1vIGdlbi1zby10aHJlc2ggZ2VuLXNvLXRocmVzaC5vCisKKyMgVGhpcyBpcyBob3cgdG8gcnVuIHRoaXMgZ2VuZXJhdG9yLgorIyBUaGlzIHRhcmdldCBzaG91bGQgYmUgbWFkZSBiZWZvcmUgdGhlICdhbGwnIHRhcmdldCwKKyMgdG8gZW5zdXJlIHRoYXQgdGhlIHNobGliIHNvdXJjZXMgYXJlIGFsbCBhdmFpbGFibGUuCityZXF1aXJlX3NobGliczogZ2VuLXNvLXRocmVzaAorCWlmICEgWyAtYSBsaWIwMC1zby10aHJlc2guYyBdIDsgdGhlbiBcCisJICBnZW4tc28tdGhyZXNoIDsgXAorCWZpCisJaWYgISBbIC1hIGxpYjAxLXNvLXRocmVzaC5jIF0gOyB0aGVuIFwKKwkgIGdlbi1zby10aHJlc2ggOyBcCisJZmkKKwlpZiAhIFsgLWEgbGliMDItc28tdGhyZXNoLmMgXSA7IHRoZW4gXAorCSAgZ2VuLXNvLXRocmVzaCA7IFwKKwlmaQorCisjIFRoaXMgaXMgaG93IHRvIGJ1aWxkIGFsbCB0aGUgc2hsaWJzLgorIyBCZSBzdXJlIHRvIGZpcnN0IG1ha2UgdGhlIHJlcXVpcmVfc2hsaWJzIHRhcmdldCEKK2xpYjAwLXNvLXRocmVzaC5vOiBsaWIwMC1zby10aHJlc2guYworCSQoQ0MpICQoQ0ZMQUdTKSArWiAtbyBsaWIwMC1zby10aHJlc2gubyAtYyBsaWIwMC1zby10aHJlc2guYworbGliMDAtc28tdGhyZXNoLnNsOiBsaWIwMC1zby10aHJlc2gubworCSQoTEQpICQoTERGTEFHUykgLWIgLW8gbGliMDAtc28tdGhyZXNoLnNsIGxpYjAwLXNvLXRocmVzaC5vCitsaWIwMS1zby10aHJlc2gubzogbGliMDEtc28tdGhyZXNoLmMKKwkkKENDKSAkKENGTEFHUykgK1ogLW8gbGliMDEtc28tdGhyZXNoLm8gLWMgbGliMDEtc28tdGhyZXNoLmMKK2xpYjAxLXNvLXRocmVzaC5zbDogbGliMDEtc28tdGhyZXNoLm8KKwkkKExEKSAkKExERkxBR1MpIC1iIC1vIGxpYjAxLXNvLXRocmVzaC5zbCBsaWIwMS1zby10aHJlc2gubworbGliMDItc28tdGhyZXNoLm86IGxpYjAyLXNvLXRocmVzaC5jCisJJChDQykgJChDRkxBR1MpICtaIC1vIGxpYjAyLXNvLXRocmVzaC5vIC1jIGxpYjAyLXNvLXRocmVzaC5jCitsaWIwMi1zby10aHJlc2guc2w6IGxpYjAyLXNvLXRocmVzaC5vCisJJChMRCkgJChMREZMQUdTKSAtYiAtbyBsaWIwMi1zby10aHJlc2guc2wgbGliMDItc28tdGhyZXNoLm8KKworCisKKworIyBGb3IgY29udmVuaWVuY2UsIGhlcmUncyBuYW1lcyBmb3IgYWxsIHBpZWNlcyBvZiBhbGwgc2hsaWJzLgorU0hMSUJfU09VUkNFUyA9IFwKKwlsaWIwMC1zby10aHJlc2guYyBcCisJbGliMDEtc28tdGhyZXNoLmMgXAorCWxpYjAyLXNvLXRocmVzaC5jIAorCitTSExJQl9PQkpFQ1RTID0gJChTSExJQl9TT1VSQ0VTOi5jPS5vKQorU0hMSUJTID0gJChTSExJQl9TT1VSQ0VTOi5jPS5zbCkKK1NITElCX05BTUVTID0gJChTSExJQl9TT1VSQ0VTOi5jPSkKK0VYRUNVVEFCTEVTID0gJChTSExJQlMpIGdlbi1zby10aHJlc2ggc28tdGhyZXNoCitPQkpFQ1RfRklMRVMgPSAkKFNITElCX09CSkVDVFMpIGdlbi1zby10aHJlc2gubyBzby10aHJlc2gubworCitzaGxpYl9vYmplY3RzOiAkKFNITElCX09CSkVDVFMpCitzaGxpYnM6ICQoU0hMSUJTKQorCisjIFRoaXMgaXMgaG93IHRvIGJ1aWxkIHRoZSBkZWJ1Z2dhYmxlIHRlc3RjYXNlIHRoYXQgdXNlcyB0aGUgc2hsaWJzLgorc28tdGhyZXNoLm86IHNvLXRocmVzaC5jCisJJChDQykgJChDRkxBR1MpIC1vIHNvLXRocmVzaC5vIC1jIHNvLXRocmVzaC5jCitzby10aHJlc2g6IHNobGlicyBzby10aHJlc2gubworCSQoTEQpICQoTERGTEFHUykgLW8gc28tdGhyZXNoIC1sYyAtTCR7T0JKRElSfSAtYyBzby10aHJlc2gubGlua29wdHMgL29wdC9sYW5ndG9vbHMvbGliL2VuZC5vIC9saWIvY3J0MC5vIHNvLXRocmVzaC5vCisKKyMgWWVhaCwgYnV0IHlvdSBzaG91bGQgZmlyc3QgbWFrZSB0aGUgcmVxdWlyZV9zaGxpYnMgdGFyZ2V0IQorYWxsOiBzby10aHJlc2ggZ2VuLXNvLXRocmVzaAorCisjIFRvIHJlbW92ZSBldmVyeXRoaW5nIGJ1aWx0IHZpYSB0aGlzIG1ha2VmaWxlLi4uCitjbGVhbjoKKwlybSAtZiBsaWIwKi1zby10aHJlc2guKgorCXJtIC1mICoubyBnZW4tc28tdGhyZXNoIHNvLXRocmVzaC5saW5rb3B0cyBzby10aHJlc2guYworCXJtIC1mIHNvLXRocmVzaApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvc28tdGhyZXNoLnNoIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvc28tdGhyZXNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRjOTAyNzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9zby10aHJlc2guc2gKQEAgLTAsMCArMSwxMiBAQAorIyEvYmluL2tzaAorIworIyBUaGlzIHNjcmlwdCBpcyBhICJ3cmFwcGVyIiB0byB1c2UgdGhlIHNvLXRocmVzaC5taworIyBNYWtlZmlsZS4gIFNlZSB0aGUgY29tbWVudHMgaW4gc28tdGhyZXNoLmV4cAorIyByZWdhcmRpbmcgd2h5IHRoaXMgc2NyaXB0IGV4aXN0cy4KKyMKKworI3NldCAtbyB4dHJhY2UKKyNzZXQgLW8gdmVyYm9zZQorCitNQUtFRkxBR1M9CittYWtlIC12IC1mIHNvLXRocmVzaC5tayByZXF1aXJlX3NobGlicyBhbGwKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3N0YXJ0LXN0b3AuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3N0YXJ0LXN0b3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2YyYzdlCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvc3RhcnQtc3RvcC5jCkBAIC0wLDAgKzEsMTYxIEBACisvKiBCZWdpblNvdXJjZUZpbGUgc3RhcnRfc3RvcC5jCisKKyAgVGhpcyBmaWxlIGNyZWF0ZXMgYW5kIGRlbGV0ZXMgdGhyZWFkcywgc28gdGhhdCB3ZGIKKyAgY2FuIGJlIHRlc3RlZCBvbiB0aHJlYWQgZGVsZXRlLgorCisgIFRvIGNvbXBpbGU6CisKKyAgICAgIGNjIC1BZSArREExLjAgLWcgLW8gc3RhcnRfc3RvcCAtbHB0aHJlYWQgc3RhcnRfc3RvcC5jCisKKyAgVG8gcnVuOgorICAKKyAgICAgc3RhcnRfc3RvcCAgICAgLS1ub3JtYWwgcnVuCisgICAgIHN0YXJ0X3N0b3AgMSAgIC0td2FpdHMgaW4gZWFjaCB0aHJlYWQgdG8ga2VlcCBpdCBhbGl2ZS4KKyovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorI2RlZmluZSBPVVRFUl9MT09QX0NPVU5UIDMKKyNkZWZpbmUgTl9USFJFQURTIDMKKyNkZWZpbmUgTUFYX0xPQ0FMX1ZBTCA0MAorCisvKiBVbmNvbW1lbnQgdG8gdHVybiBvbiBkZWJ1Z2dpbmcgb3V0cHV0ICovCisvKiAjZGVmaW5lIFNUQVJUX0RFQlVHICAqLworCisvKiBUcnVlIGlmIHdhaXRpbmcgZm9yIGF0dGFjaC4KKyAqLworaW50IHdhaXRfaGVyZTsKKworLyogVGhpbmcgdG8gY2hlY2sgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyovCitpbnQgYV9nbG9iYWwgPSAwOworCisvKiBUaHJlYWQtbG9jYWwgc3RvcmFnZS4KKyAqLworX190aHJlYWQgaW50IGFfdGhyZWFkX2xvY2FsOworCisvKiBDaGVjayB0aGUgcmVzdWx0cyBvZiB0aHJlYWQtbG9jYWwgc3RvcmFnZS4KKyAqLworaW50IHRocmVhZF9sb2NhbF92YWxbIE5fVEhSRUFEUyBdOworaW50IHZhbF9kZWJ1Z2dlcl9zYXdbIE5fVEhSRUFEUyBdOworCisvKiBSb3V0aW5lIGZvciBlYWNoIHRocmVhZCB0byBydW4sIGRvZXMgbm90aGluZy4KKyAqLwordm9pZCAqc3BpbiggdnAgKQorICAgIHZvaWQgKiB2cDsKK3sKKyAgICBpbnQgbWUgPSAoaW50KSB2cDsKKyAgICBpbnQgaTsKKyAgICAKKyNpZmRlZiBTVEFSVF9ERUJVRworICAgIHByaW50ZiggIj09IEluIHRocmVhZCAlZFxuIiwgbWUgKTsKKyNlbmRpZgorCisgICAgYV9nbG9iYWwrKzsKKworICAgIGFfdGhyZWFkX2xvY2FsID0gMDsKKyAgICBmb3IoIGkgPSAwOyBpIDwgYV9nbG9iYWw7IGkrKyApIHsKKyAgICAgICAgYV90aHJlYWRfbG9jYWwgKz0gaTsKKyAgICB9CisKKyAgICB0aHJlYWRfbG9jYWxfdmFsWyBtZSBdID0gYV90aHJlYWRfbG9jYWw7IC8qIExpbmUgNjcgKi8KKworICAgIHByaW50ZiggIj09IFRocmVhZCAlZCwgYV90aHJlYWRfbG9jYWwgaXMgJWRcbiIsCisgICAgICAgICAgICAoaW50KSB2cCwgYV90aHJlYWRfbG9jYWwgKTsKKworICAgaWYoIHdhaXRfaGVyZSApIHsKKyAgICAgICAvKiBFeHRlbmQgbGlmZSBvZiB0aHJlYWQgdG8gZXh0ZW5kIGxpZmUgb2YgdGhyZWFkLWxvY2FsIHZhci4KKyAgICAgICAgKiBUaGlzIG1ha2VzIGxpZmUgZWFzaWVyIGZvciBodW1hbiBkZWJ1Z2dpbmcgKHRob3VnaCB5b3UnZAorICAgICAgICAqIHByb2JhYmx5IHdhbnQgdG8gbWFrZSB0aGUgZGVsYXkgbG9uZ2VyKS4KKyAgICAgICAgKi8KKyAgICAgICBzbGVlcCggNSApOworICAgfQorfQorCit2b2lkCitkb19wYXNzKCBwYXNzICkKKyAgICBpbnQgcGFzczsKK3sKKyAgICBpbnQgaTsKKyAgICBwdGhyZWFkX3QgdFsgTl9USFJFQURTIF07CisgICAgaW50IGVycjsKKworICAgIGZvciggaSA9IDA7IGkgPCBOX1RIUkVBRFM7IGkrKykgeworICAgICAgICB0aHJlYWRfbG9jYWxfdmFsW2ldID0gMDsKKyAgICAgICAgdmFsX2RlYnVnZ2VyX3Nhd1tpXSA9IDA7CisgICAgfQorICAgCisgICAgLyogU3RhcnQgTl9USFJFQURTIHRocmVhZHMsIHRoZW4gam9pbiB0aGVtIHNvCisgICAgICogdGhhdCB0aGV5IGFyZSB0ZXJtaW5hdGVkLgorICAgICAqLworICAgIGZvciggaSA9IDA7IGkgPCBOX1RIUkVBRFM7IGkrKyApIHsKKyAgICAgICAgZXJyID0gcHRocmVhZF9jcmVhdGUoICZ0W2ldLCBOVUxMLCBzcGluLCAodm9pZCAqKWkgKTsKKyAgICAgICAgaWYoIGVyciAhPSAwICkgeworICAgICAgICAgICAgcHJpbnRmKCAiPT0gU3RhcnQvc3RvcCwgZXJyb3IgaW4gdGhyZWFkICVkIGNyZWF0ZVxuIiwgaSApOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKCBpID0gMDsgaSA8IE5fVEhSRUFEUzsgaSsrICkgeworICAgICAgICBlcnIgPSBwdGhyZWFkX2pvaW4odFtpXSwgTlVMTCApOyAgICAvKiBMaW5lIDEwNSAqLworICAgICAgICBpZiggZXJyICE9IDAgKSB7ICAgICAgICAgICAgICAgICAgICAvKiBMaW5lIDEwNiAqLworICAgICAgICAgICAgcHJpbnRmKCAiPT0gU3RhcnQvc3RvcCwgZXJyb3IgaW4gdGhyZWFkICVkIGpvaW5cbiIsIGkgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGkgPSAxMDsgIC8qIExpbmUgMTA5LiAgTnVsbCBsaW5lIGZvciBzZXR0aW5nIGJwdHMgb24uICovCisKKy8qI2lmZGVmIFNUQVJUX0RFQlVHKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgTl9USFJFQURTOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCAiICAgTG9jYWwgaW4gdGhyZWFkICVkIHdhcyAlZCwgZGVidWdnZXIgc2F3ICVkXG4iLAorICAgICAgICAgICAgICAgICBpLCB0aHJlYWRfbG9jYWxfdmFsW2ldLCB2YWxfZGVidWdnZXJfc2F3W2ldICk7CisgICAgfQorICAgIHByaW50ZiggIj09IFBhc3MgJWQgZG9uZVxuIiwgcGFzcyApOworLyojZW5kaWYqLworICAgCit9CisKK3ZvaWQKK2RvX2l0KCkKK3sKKyAgICAvKiBXZSB3YW50IHRvIHN0YXJ0IHNvbWUgdGhyZWFkcyBhbmQgdGhlbgorICAgICAqIGVuZCB0aGVtLCBhbmQgdGhlbiBkbyBpdCBhZ2FpbiBhbmQgYWdhaW4KKyAgICAgKi8KKyAgICBpbnQgaTsKKyAgICBpbnQgZHVtbXk7CisgICAgCisgICAgZm9yKCBpID0gMDsgaSA8IE9VVEVSX0xPT1BfQ09VTlQ7IGkrKyApIHsKKyAgICAgICAgZG9fcGFzcyggaSApOworICAgICAgICBkdW1teSA9IGk7ICAgICAgLyogTGluZSAxMzQsIG51bGwgbGluZSBmb3Igc2V0dGluZyBicHMgb24gKi8KKyAgICB9Cit9CisKK21haW4oIGFyZ2MsIGFyZ3YgKQoraW50ICAgIGFyZ2M7CitjaGFyICoqYXJndjsKK3sKKyAgIHdhaXRfaGVyZSA9IEZBTFNFOworICAgaWYoKGFyZ2MgPiAxKSAmJiAoMCAhPSBhcmd2ICkpIHsKKyAgICAgICBpZiggMSA9PSBhdG9pKCBhcmd2WzFdICkgKQorICAgICAgICAgICB3YWl0X2hlcmUgPSBUUlVFOworICAgIH0KKworI2lmZGVmIFNUQVJUX0RFQlVHIAorICAgIHByaW50ZiggIj09IFRlc3Qgc3RhcnRpbmdcbiIgKTsKKyNlbmRpZgorCisgICAgZG9faXQoKTsKKyAgICAKKyNpZmRlZiBTVEFSVF9ERUJVRworICAgIHByaW50ZiggIj09IFRlc3QgZG9uZVxuIiApOworI2VuZGlmCisKKyAgICByZXR1cm4oMCk7Cit9CisKKy8qIEVuZFNvdXJjZUZpbGUgKi8KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3N0YXJ0LXN0b3AuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvc3RhcnQtc3RvcC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3MGY1MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3N0YXJ0LXN0b3AuZXhwCkBAIC0wLDAgKzEsMzYwIEBACisjIHN0YXJ0X3N0b3AuZXhwIC0tIEV4cGVjdCBzY3JpcHQgdG8gdGVzdCBhIHRocmVhZGVkIHBnbSB3aGljaCBoYXMgdGVybWluYXRpbmcgdGhyZWFkcworIyBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBDb21tZW50IG91dCBmb3Igbm93LCBzaW5jZSB0aGlzIHRlc3QgaXMgKHNvbWV0aW1lcz8pIGhhbmdpbmcgb24gMTEuMAorIworIyByZXR1cm4gMAorCisjIHVzZSB0aGlzIHRvIGRlYnVnOgorIworI2xvZ191c2VyIDEKKworIyBUaHJlYWQgc3R1ZmYgaXMgX3Nsb3dfOyBwcmVwYXJlIGZvciBsb25nIHdhaXRzLgorIworIyBGdXJ0aGVyLCB0aGlzIHRlc3QgaGFzIHNvbWUgIm51bGwiIGxpbmVzIGRlc2lnbmVkCisjIHRvIGNvbnN1bWUgb3V0cHV0IGZyb20gZ2RiIHRoYXQgd2FzIHRvbyBsYXRlIHRvIGJlCisjIG1hdGNoZWQgKHNlcXVlbmNlIGlzICJnZGJfdGVzdCIgc2VuZHM7IHRpbWVvdXQgYW5kCisjIG9uIHRvIG5leHQgc2VuZDsgcmVzdWx0IGZpbmFsbHkgY29tZXMgaW47IG1pc21hdGNoKS4KKyMKKyMgVGhlIG51bGwgY29tbWFuZCBpcyAnZ2RiX3Rlc3QgInAgXCRwYyIgIi4qIiAiIicKKyMgTk9URTogdGhpcyBjb21tYW5kIHVuZG9lcyBhbnkgdXAvZG93biBzdHVmZiEKKyMKK3Byb2MgcHJlX3RpbWVvdXQge30geworICAgIGdsb2JhbCB0aW1lb3V0CisKKyAgICBzZXQgdGltZW91dCBbZXhwciAiJHRpbWVvdXQgKyAxMDAiXQorfQorCitwcm9jIHBvc3RfdGltZW91dCB7fSB7CisgICAgZ2xvYmFsIHRpbWVvdXQKKyAgICBnbG9iYWwgb2xkdGltZW91dAorCisgICAgc2V0IHRpbWVvdXQgJG9sZHRpbWVvdXQKKyAgICBnZGJfdGVzdCAicCBcJHBjIiAiLioiICIiCit9CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitpZiB7ICFbaXN0YXJnZXQgImhwcGEqLSotaHB1eDEwLjMwIl0gJiYgIVtpc3RhcmdldCAiaHBwYSotKi1ocHV4MTEuKiJdIH0geworICAgIHZlcmJvc2UgIkhQVVggdGhyZWFkIHRlc3QgaWdub3JlZCBmb3Igbm9uLWhwcGEgb3IgcHJlLUhQL1VYLTEwLjMwIHRhcmdldHMuIgorICAgIHJldHVybiAwCit9CisKK3NldCB0ZXN0ZmlsZSBzdGFydC1zdG9wCitzZXQgc3JjZmlsZSAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworaWYgW2dldF9jb21waWxlcl9pbmZvICR7YmluZmlsZX1dIHsKKyAgICByZXR1cm4gLTEKK30KKworIyBUbyBidWlsZCB0aGUgZXhlY3V0YWJsZSB3ZSBuZWVkIHRvIGxpbmsgYWdhaW5zdCB0aGUgdGhyZWFkIGxpYnJhcnkuCisjCisjICAgICBjYyAtQWUgLWcgLW8gc3RhcnQtc3RvcCAtbHB0aHJlYWQgc3RhcnQtc3RvcC5jCisjCisjY29tcGlsZSAiJHtzcmNmaWxlfSAtQWUgLWcgLWxwdGhyZWFkIC1vICR7YmluZmlsZX0iCisKK2lmIHskZ2NjX2NvbXBpbGVkID09IDB9IHsKKyAgICBzZXQgYWRkaXRpb25hbF9mbGFncyAiYWRkaXRpb25hbF9mbGFncz0tQWUiCit9IGVsc2UgeworICAgIHNldCBhZGRpdGlvbmFsX2ZsYWdzICIiCit9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5jIiAiJHtiaW5maWxlfS5vIiBvYmplY3QgW2xpc3QgZGVidWcgJGFkZGl0aW9uYWxfZmxhZ3NdXSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CityZW1vdGVfZXhlYyBidWlsZCAibGQgL3Vzci9jY3MvbGliL2NydDAubyAke2JpbmZpbGV9Lm8gLWxjbCAtbHB0aHJlYWQgIC1sYyAvb3B0L2xhbmd0b29scy9saWIvZW5kLm8gLW8gJHtiaW5maWxlfSIKKworCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKworZ2RiX2xvYWQgJHtiaW5maWxlfQoraWYgIVtydW50b19tYWluXSB0aGVuIHsKKyAgIGZhaWwgIkNhbid0IHJ1biB0byBtYWluIgorICAgcmV0dXJuIDAKK30KKworc2V0IG9sZHRpbWVvdXQgJHRpbWVvdXQKKyNzZXQgdGltZW91dCBbZXhwciAiJHRpbWVvdXQgKyAyMDAiXQorc2V0IG9sZHZlcmJvc2UgJHZlcmJvc2UKKyNzZXQgdmVyYm9zZSA0MAorCitnZGJfdGVzdCAiYiBkb19wYXNzIiAiLioiICJzZXQgZG9fcGFzcyBicCIKK2dkYl90ZXN0ICJjIiAiLipCcmVha3BvaW50Lipkb19wYXNzLioiICJydW4gdG8gZG9fcGFzcyIKKworIyBTaG91bGQgYmUgb25seSBvbmUgdGhyZWFkLgorIworcHJlX3RpbWVvdXQKK3NlbmRfZ2RiICJpbmZvIHRocmVhZFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjIgcHJvY2Vzcy4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJPbGQgY29kZSBmb3IgJ3RocmVhZC5jJyIgfQorICAgIC1yZSAiLioyIHN5c3RlbSB0aHJlYWQuKjEgc3lzLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgIlRvbyBtYW55IHRocmVhZHMiIH0KKyAgICAtcmUgIi4qMSBzeXN0ZW0gdGhyZWFkLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgIkp1c3Qgb25lIHRocmVhZCIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgIm5vIHRocmVhZCBpbmZvIiB9CisgICAgdGltZW91dCB7IGZhaWwgInRpbWVvdXQgb24gaW5mbyB0aHJlYWQgMSIgfQorfQorcG9zdF90aW1lb3V0CisKKyMgUnVuIHRvIGEgcG9pbnQgYWZ0ZXIgdGhlIHRocmVhZCBjcmVhdGVzICgxMDUgaXMganVzdAorIyBiZWZvcmUgdGhlIGZpcnN0IGpvaW4pLgorIworIyBUaGUgIj09IFRocmVhZCIgc3R1ZmYgaXMgb3V0cHV0IGZyb20gdGhlIGNvbXB1dGluZyB0aHJlYWRzLgorIworZ2RiX3Rlc3QgImIgMTA1IiAiLipCcmVha3BvaW50LioiICJzZXQgMTA1IGJwIgorCitwcmVfdGltZW91dAorc2VuZF9nZGIgImNcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLio9PSBUaHJlYWQuKj09IFRocmVhZC4qPT0gVGhyZWFkLioxMDUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAibmV3IHRocmVhZHMgY3JlYXRlZCBhbmQgZW5kZWQiCisgICAgICAgIHNldCB0aHJlYWRzX2V4aXN0IDAKKyAgICB9CisgICAgLXJlICIuKj09IFRocmVhZC4qPT0gVGhyZWFkLioxMDUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAibmV3IHRocmVhZHMgY3JlYXRlZCBhbmQgZW5kZWQiCisgICAgICAgIHNldCB0aHJlYWRzX2V4aXN0IDEKKyAgICB9CisgICAgLXJlICIuKj09IFRocmVhZC4qLioxMDUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAibmV3IHRocmVhZHMgY3JlYXRlZCBhbmQgZW5kZWQiCisgICAgICAgIHNldCB0aHJlYWRzX2V4aXN0IDIKKyAgICB9CisgICAgLXJlICIuKk5ldyB0aHJlYWQuKk5ldyB0aC4qTmV3IHRoLioxMDUuKiRnZGJfcHJvbXB0ICQiIHsgCisgICAgICAgIHBhc3MgIm5ldyB0aHJlYWRzIGNyZWF0ZWQiIAorICAgICAgICBzZXQgdGhyZWFkc19leGlzdCAzCisgICAgfQorICAgIC1yZSAiLipCcmVha3BvaW50LioxMDUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgc2V0IHRocmVhZHNfZXhpc3QgMAorICAgICAgICBmYWlsICJkaWRuJ3Qgc2VlIGFueSB0aHJlYWRzIiAKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgc2V0IHRocmVhZHNfZXhpc3QgMAorICAgICAgICBmYWlsICJkaWRuJ3QgZXZlbiBoaXQgYnAiCisgICAgfQorICAgIHRpbWVvdXQgeyAKKyAgICAgICAgc2V0IHRocmVhZHNfZXhpc3QgLTEgCisgICAgICAgIGZhaWwgInRpbWVvdXQgb24gY29udGludWUiIAorICAgIH0KK30KKworIyBMb29rIGF0IHRoZSB0aHJlYWRzIGFnYWluLiAgV2UgZXhwZWN0IHRoYXQgc29tZSBvZgorIyB0aGUgdGhyZWFkcyBtYXkgaGF2ZSBhbHJlYWR5IGZpbmlzaGVkIGV4ZWN1dGlvbi4KKyMKK3NlbmRfZ2RiICJpbmZvIHRocmVhZFxuIiAKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLio0LiozLioyLiogMS4qdGhyZWFkLiokZ2RiX3Byb21wdCAkIiB7IHNldCBzZWVuX3RocmVhZHMgMyB9CisgICAgLXJlICIuKjMuKjIuKiAxLip0aHJlYWQuKiRnZGJfcHJvbXB0ICQiICAgIHsgc2V0IHNlZW5fdGhyZWFkcyAyIH0KKyAgICAtcmUgIi4qMi4qIDEuKnRocmVhZC4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBzZXQgc2Vlbl90aHJlYWRzIDEgfQorICAgIC1yZSAiLiogMS4qdGhyZWFkLiokZ2RiX3Byb21wdCAkIiAgICAgICAgICB7IHNldCBzZWVuX3RocmVhZHMgMCB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgIHsgc2V0IHNlZW5fdGhyZWFkcyAwIH0KKyAgICB0aW1lb3V0ICAgICAgICAgIHsgCisgICAgICAgIHNldCBzZWVuX3RocmVhZHMgLTEwCisgICAgICAgIGZhaWwgInRpbWVvdXQgb24gc2Vjb25kIGluZm8gdGhyZWFkIiAKKyAgICB9Cit9Citwb3N0X3RpbWVvdXQKKworaWYgeyAkc2Vlbl90aHJlYWRzID09ICR0aHJlYWRzX2V4aXN0IH0geworICAgIHBhc3MgInNhdyBhbGwgdGhyZWFkcyB0aGF0IGV4aXN0ZWQiCit9IGVsc2UgeworICAgIGlmIHsgJHNlZW5fdGhyZWFkcyA+ICR0aHJlYWRzX2V4aXN0IH0geworICAgICAgICBmYWlsICJtYXkgaGF2ZSBzZWVuIHRocmVhZHMgdGhhdCBkaWRuJ3QgZmluaXNoIGV4aXRpbmcgeWV0IgorICAgIH0gZWxzZSB7CisgICAgICAgIGZhaWwgImRpZG4ndCBzZWUgbGl2ZSB0aHJlYWRzIgorICAgIH0KK30KKworZ2RiX3Rlc3QgImNsZSIgICIuKkRlbGV0ZWQuKiIgImRlbCBicCBhdCAxMDUiCisKKyMgQ2hlY2sgdGhhdCB0aHJlYWRzIGFyZSBiZWluZyBjb25zdW1lZCBhdCB0aGUgam9pbiBjYWxsLgorIyBXZSBleHBlY3QgdG8gam9pbiB0aHJlZSB0aW1lcy4gIElmIHdlIGV2ZXIgc2VlIHRoZSBicCBhdAorIyAxMTEsIHdlJ3ZlIGdvbmUgdG9vIGZhci4KKyMKK2dkYl90ZXN0ICJiIDEwNiIgIi4qQnJlYWtwb2ludC4qMTA2LioiICJzZXQgYnAgYXQgMTA2IgorZ2RiX3Rlc3QgImIgMTExIiAiLipCcmVha3BvaW50LioxMTEuKiIgInNldCBicCBhdCAxMTEiCisKKyMgVGhpcyBvbmUgaXMgc3VyZTogd2UncmUgYWxyZWFkeSBpbiB0aGUgbG9vcC4KKyMKK2dkYl90ZXN0ICJjIiAgICAiLipCcmVha3BvaW50LioxMDYuKiIgImhpdCBicCBhdCAxMDYgMXN0IHRpbWUsIDIgbGVmdCIKKworIyBEaWQgd2UgZ28gYXJvdW5kIHRoZSBsb29wIGFnYWluPworIworc2VuZF9nZGIgImNcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipCcmVha3BvaW50LioxMTEuKiIgeyAKKyAgICAgICAgZmFpbCAiZGlkbid0IGpvaW4gcmlnaHQgMSIgCisgICAgICAgIGdkYl90ZXN0ICJjbGUiICIuKiIgIiIKKyAgICB9CisgICAgLXJlICIuKkJyZWFrcG9pbnQuKjEwNi4qIiB7IAorICAgICAgICBwYXNzICJoaXQgYnAgYXQgMTA2IDJuZCB0aW1lLCAxIGxlZnQiIAorICAgICAgICBzZW5kX2dkYiAiY1xuIiAKKyAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAtcmUgIi4qQnJlYWtwb2ludC4qMTExLioiIHsgCisgICAgICAgICAgICAgICAgIGZhaWwgImRpZG4ndCBqb2luIHJpZ2h0IDIiIAorICAgICAgICAgICAgICAgICBnZGJfdGVzdCAiY2xlIiAiLioiICIiCisgICAgICAgICAgICB9CisgICAgICAgICAgICAtcmUgIi4qQnJlYWtwb2ludC4qMTA2LioiIHsgCisgICAgICAgICAgICAgICAgIHBhc3MgImhpdCBicCBhdCAxMDYgM3JkIHRpbWUsIDAgbGVmdCIKKyAgICAgICAgICAgICAgICAgZ2RiX3Rlc3QgImNsZSIgIi4qIiAiIgorICAgICAgICAgICAgICAgICBnZGJfdGVzdCAiYyIgIi4qQnJlYWtwb2ludC4qMTExLioiICIiCisgICAgICAgICAgICAgICAgIGdkYl90ZXN0ICJjbGUiICIuKiIgIiIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVvdXQgeyBmYWlsICJ0aW1lb3V0IGdvaW5nIGFyb3VuZCB0aGUgbG9vcCJ9CisgICAgICAgIH0KKyAgICB9CisgICAgdGltZW91dCB7IGZhaWwgInRpbWVvdXQgZ2V0dGluZyB0byAxMDYifQorfQorCisjIFNob3VsZCBvbmx5IGJlIG9uZSB0aHJlYWQgbm93LgorIworcHJlX3RpbWVvdXQKK3NlbmRfZ2RiICJpbmZvIHRocmVhZFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjIgc3lzdGVtIHRocmVhZC4qMSBzeXMuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiVG9vIG1hbnkgdGhyZWFkcyIgfQorICAgIC1yZSAiLioxIHN5c3RlbSB0aC4qJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICB7IHBhc3MgIkp1c3Qgb25lIHRocmVhZCIgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgIHsgcGFzcyAiT25lIHRocmVhZCBzaG93biBhcyBubyB0aHJlYWRzLCBvayIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgICB7IGZhaWwgInRpbWVvdXQgdGhpcmQgaW5mbyB0aHJlYWQiIH0KK30KK3Bvc3RfdGltZW91dAorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQmVnaW4gcGFzcyAyID09PT09PT09PT09CisjCisjIE9rLCBnbyBhcm91bmQgYWdhaW4KKyMKK2dkYl90ZXN0ICJjIiAiLipCcmVha3BvaW50Lipkb19wYXNzLioiICJoaXQgZG9fcGFzcyBicCBhZ2FpbiAyIgorZ2RiX3Rlc3QgImIgMTA1IiAiLipCcmVha3BvaW50LioiICJzZXQgMTA1IGJwIDIiCisKK3ByZV90aW1lb3V0CitzZW5kX2dkYiAiY1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKj09IFRocmVhZC4qPT0gVGhyZWFkLio9PSBUaHJlYWQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAibmV3IHRocmVhZHMgY3JlYXRlZCBhbmQgZW5kZWQgMiIKKyAgICAgICAgc2V0IHRocmVhZHNfZXhpc3QgMAorICAgIH0KKyAgICAtcmUgIi4qPT0gVGhyZWFkLio9PSBUaHJlYWQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAibmV3IHRocmVhZHMgY3JlYXRlZCBhbmQgZW5kZWQgMiIKKyAgICAgICAgc2V0IHRocmVhZHNfZXhpc3QgMQorICAgIH0KKyAgICAtcmUgIi4qPT0gVGhyZWFkLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgIm5ldyB0aHJlYWRzIGNyZWF0ZWQgYW5kIGVuZGVkIDIiCisgICAgICAgIHNldCB0aHJlYWRzX2V4aXN0IDIKKyAgICB9CisgICAgLXJlICIuKk5ldyBzeXN0ZW0gdGhyZWFkLipOZXcgc3lzLipOZXcuKjEwNS4qJGdkYl9wcm9tcHQgJCIgeyAKKyAgICAgICAgcGFzcyAibmV3IHRocmVhZHMgY3JlYXRlZCAyIiAKKyAgICAgICAgc2V0IHRocmVhZHNfZXhpc3QgMworICAgIH0KKyAgICB0aW1lb3V0IHsgCisgICAgICAgIHNldCB0aHJlYWRzX2V4aXN0IC0xIAorICAgICAgICBmYWlsICJ0aW1lb3V0IG9uIGNvbnRpbnVlIDIiIAorICAgIH0KK30KKworIyBMb29rIGF0IHRoZSB0aHJlYWRzIGFnYWluLiAgV2UgZXhwZWN0IHRoYXQgc29tZSBvZgorIyB0aGUgdGhyZWFkcyBtYXkgaGF2ZSBhbHJlYWR5IGZpbmlzaGVkIGV4ZWN1dGlvbi4KKyMKK3NlbmRfZ2RiICJpbmZvIHRocmVhZFxuIiAKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLio0LiozLioyLiogMS4qdGhyZWFkLiokZ2RiX3Byb21wdCAkIiB7IHNldCBzZWVuX3RocmVhZHMgMyB9CisgICAgLXJlICIuKjMuKjIuKiAxLip0aHJlYWQuKiRnZGJfcHJvbXB0ICQiICAgIHsgc2V0IHNlZW5fdGhyZWFkcyAyIH0KKyAgICAtcmUgIi4qMi4qIDEuKnRocmVhZC4qJGdkYl9wcm9tcHQgJCIgICAgICAgeyBzZXQgc2Vlbl90aHJlYWRzIDEgfQorICAgIC1yZSAiLiogMS4qdGhyZWFkLiokZ2RiX3Byb21wdCAkIiAgICAgICAgICB7IHNldCBzZWVuX3RocmVhZHMgMCB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgIHsgc2V0IHNlZW5fdGhyZWFkcyAwIH0KKyAgICB0aW1lb3V0ICAgICAgICAgIHsgCisgICAgICAgIHNldCBzZWVuX3RocmVhZHMgLTEwCisgICAgICAgIGZhaWwgInRpbWVvdXQgb24gc2Vjb25kIGluZm8gdGhyZWFkIDIiIAorICAgIH0KK30KK3Bvc3RfdGltZW91dAorCitpZiB7ICRzZWVuX3RocmVhZHMgPT0gJHRocmVhZHNfZXhpc3QgfSB7CisgICAgcGFzcyAic2F3IGFsbCB0aHJlYWRzIHRoYXQgZXhpc3RlZCIKK30gZWxzZSB7CisgICAgaWYgeyAkc2Vlbl90aHJlYWRzID4gJHRocmVhZHNfZXhpc3QgfSB7CisgICAgICAgIGZhaWwgIm1heSBoYXZlIHNlZW4gdGhyZWFkcyB0aGF0IGRpZG4ndCBmaW5pc2ggZXhpdGluZyB5ZXQgMiIKKyAgICB9IGVsc2UgeworICAgICAgICBmYWlsICJkaWRuJ3Qgc2VlIGxpdmUgdGhyZWFkcyAyIgorICAgIH0KK30KKworZ2RiX3Rlc3QgImNsZSIgICIuKkRlbGV0ZWQuKiIgImRlbCBicCBhdCAxMDUgMiIKKworIyBDaGVjayB0aGF0IHRocmVhZHMgYXJlIGJlaW5nIGNvbnN1bWVkIGF0IHRoZSBqb2luIGNhbGwuCisjIFdlIGV4cGVjdCB0byBqb2luIHRocmVlIHRpbWVzLiAgSWYgd2UgZXZlciBzZWUgdGhlIGJwIGF0CisjIDExMSwgd2UndmUgZ29uZSB0b28gZmFyLgorIworZ2RiX3Rlc3QgImIgMTA2IiAiLipCcmVha3BvaW50LioxMDYuKiIgInNldCBicCBhdCAxMDYgMiIKK2dkYl90ZXN0ICJiIDExMSIgIi4qQnJlYWtwb2ludC4qMTExLioiICJzZXQgYnAgYXQgMTExIDIiCisKKyMgVGhpcyBvbmUgaXMgc3VyZTogd2UncmUgYWxyZWFkeSBpbiB0aGUgbG9vcC4KKyMKK2dkYl90ZXN0ICJjIiAgIi4qQnJlYWtwb2ludC4qMTA2LioiICJoaXQgYnAgYXQgMTA2IDFzdCB0aW1lLCAyIGxlZnQgMiIKKworIyBEaWQgd2UgZ28gYXJvdW5kIHRoZSBsb29wIGFnYWluPworIworc2VuZF9nZGIgImNcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipCcmVha3BvaW50LioxMTEuKiIgeyAKKyAgICAgICAgZmFpbCAiZGlkbid0IGpvaW4gcmlnaHQgMSwgcGFzcyAyIiAKKyAgICAgICAgZ2RiX3Rlc3QgImNsZSIgIi4qIiAiIgorICAgIH0KKyAgICAtcmUgIi4qQnJlYWtwb2ludC4qMTA2LioiIHsgCisgICAgICAgIHBhc3MgImhpdCBicCBhdCAxMDYgMm5kIHRpbWUsIDEgbGVmdCwgcGFzcyAyIiAKKyAgICAgICAgc2VuZF9nZGIgImNcbiIgCisgICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAgLXJlICIuKkJyZWFrcG9pbnQuKjExMS4qIiB7IAorICAgICAgICAgICAgICAgICBmYWlsICJkaWRuJ3Qgam9pbiByaWdodCAyLCBwYXNzIDIiIAorICAgICAgICAgICAgICAgICBnZGJfdGVzdCAiY2xlIiAiLioiICIiCisgICAgICAgICAgICB9CisgICAgICAgICAgICAtcmUgIi4qQnJlYWtwb2ludC4qMTA2LioiIHsgCisgICAgICAgICAgICAgICAgIHBhc3MgImhpdCBicCBhdCAxMDYgM3JkIHRpbWUsIDAgbGVmdCwgcGFzcyAyIgorICAgICAgICAgICAgICAgICBnZGJfdGVzdCAiY2xlIiAiLioiICIiCisgICAgICAgICAgICAgICAgIGdkYl90ZXN0ICJjIiAiLipCcmVha3BvaW50LioxMTEuKiIgIiIKKyAgICAgICAgICAgICAgICAgZ2RiX3Rlc3QgImNsZSIgIi4qIiAiIgorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGltZW91dCB7IGZhaWwgInRpbWVvdXQgZ29pbmcgYXJvdW5kIGxvb3AsIHBhc3MgMiJ9CisgICAgICAgIH0KKyAgICB9CisgICAgdGltZW91dCB7IGZhaWwgInRpbWVvdXQgY29udGludWUgdG8gMTA2LCBwYXNzIDIifQorfQorCisjIFNob3VsZCBvbmx5IGJlIG9uZSB0aHJlYWQgbm93LgorIworcHJlX3RpbWVvdXQKK3NlbmRfZ2RiICJpbmZvIHRocmVhZFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKjIgc3lzdGVtIHRocmVhZC4qMSBzeXMuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiVG9vIG1hbnkgdGhyZWFkcywgcGFzcyAyIiB9CisgICAgLXJlICIuKjEgc3lzdGVtIHRocmVhZC4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJKdXN0IG9uZSB0aHJlYWQsIHBhc3MgMiIgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgIk9uZSB0aHJlYWQgc2hvd24gYXMgbm8gdGhyZWFkcywgb2ssIHBhc3MgMiIgfQorICAgIHRpbWVvdXQgeyBmYWlsICJ0aW1lb3V0IGxhc3QgaW5mbyB0aHJlYWQsIHBhc3MgMiIgfQorfQorcG9zdF90aW1lb3V0CisKKyMgRG9uZSEKKyMKK2dkYl9leGl0CisKK3NldCB0aW1lb3V0ICRvbGR0aW1lb3V0CitzZXQgdmVyYm9zZSAkb2xkdmVyYm9zZQorCisjIGV4ZWN1dGVfYW55d2hlcmUgInJtIC1mICR7YmluZmlsZX0iCisjCityZXR1cm4gMApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvc3VtLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC9zdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjhhZmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvc3VtLmMKQEAgLTAsMCArMSwxNSBAQAorLyogVGhpcyBpcyBhIHNhbXBsZSBwcm9ncmFtIGZvciB0aGUgSFAvRERFIGRlYnVnZ2VyLiAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBfX1NURENfXyAKK2ludCBzdW0oaW50IGxpc3RbXSwgaW50IGxvdywgaW50IGhpZ2gpCisjZWxzZQoraW50IHN1bShsaXN0LCBsb3csIGhpZ2gpCitpbnQgbGlzdFtdLCBsb3csIGhpZ2g7CisjZW5kaWYKKyAgICB7CisgICAgICAgIGludCBpLCBzID0gMDsKKyAgICAgICAgZm9yIChpID0gbG93OyBpIDw9IGhpZ2g7IGkrKykKKyAgICAgICAgICAgIHMgKz0gbGlzdFtpXTsKKyAgICAgICAgcmV0dXJuKHMpOworICAgIH0KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3RlbXBsLWhwLmNjIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvdGVtcGwtaHAuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyNDFkYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3RlbXBsLWhwLmNjCkBAIC0wLDAgKzEsNzg1IEBACisvKiBUaGlzIHRlc3QgY29kZSBpcyBmcm9tIFdlbmRlbGwgQmFrZXIgKHdiYWtlckBjb21ldC5iZXJrZWxleS5lZHUpICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworaW50IGFfaTsKK2NoYXIgYV9jOworZG91YmxlIGFfZDsKKwordHlwZWRlZiB2b2lkICpQaXg7CisKK2ludAorZihpbnQgaSkKK3sgcmV0dXJuIDA7IH0KKworaW50CitmKGludCBpLCBjaGFyIGMpCit7IHJldHVybiAwOyB9CisKK2ludAorZihpbnQgaSwgY2hhciBjLCBkb3VibGUgZCkKK3sgcmV0dXJuIDA7IH0KKworaW50CitmKGludCBpLCBjaGFyIGMsIGRvdWJsZSBkLCBjaGFyICpjcykKK3sgcmV0dXJuIDA7IH0KKworaW50CitmKGludCBpLCBjaGFyIGMsIGRvdWJsZSBkLCBjaGFyICpjcywgdm9pZCAoKmZpZykoaW50LCBjaGFyKSkKK3sgcmV0dXJuIDA7IH0KKworaW50CitmKGludCBpLCBjaGFyIGMsIGRvdWJsZSBkLCBjaGFyICpjcywgdm9pZCAoKmZpZykoY2hhciwgaW50KSkKK3sgcmV0dXJuIDA7IH0KKworY2xhc3MgUiB7CitwdWJsaWM6CisgICAgaW50IGk7Cit9OworY2xhc3MgUyB7CitwdWJsaWM6CisgICAgaW50IGk7Cit9OworY2xhc3MgVCB7CitwdWJsaWM6CisgICAgaW50IGk7Cit9OworCitjaGFyIGcoY2hhciwgY29uc3QgY2hhciwgdm9sYXRpbGUgY2hhcikKK3sgcmV0dXJuICdjJzsgfQorY2hhciBnKFIsIGNoYXImLCBjb25zdCBjaGFyJiwgdm9sYXRpbGUgY2hhciYpCit7IHJldHVybiAnYyc7IH0KK2NoYXIgZyhjaGFyKiwgY29uc3QgY2hhciosIHZvbGF0aWxlIGNoYXIqKQoreyByZXR1cm4gJ2MnOyB9CitjaGFyIGcoUywgY2hhciomLCBjb25zdCBjaGFyKiYsIHZvbGF0aWxlIGNoYXIqJikKK3sgcmV0dXJuICdjJzsgfQorCitzaWduZWQgY2hhciBnKFQsc2lnbmVkIGNoYXIsIGNvbnN0IHNpZ25lZCBjaGFyLCB2b2xhdGlsZSBzaWduZWQgY2hhcikKK3sgcmV0dXJuICdjJzsgfQorc2lnbmVkIGNoYXIgZyhULCBSLCBzaWduZWQgY2hhciYsIGNvbnN0IHNpZ25lZCBjaGFyJiwgdm9sYXRpbGUgc2lnbmVkIGNoYXImKQoreyByZXR1cm4gJ2MnOyB9CitzaWduZWQgY2hhciBnKFQsIHNpZ25lZCBjaGFyKiwgY29uc3Qgc2lnbmVkIGNoYXIqLCB2b2xhdGlsZSBzaWduZWQgY2hhciopCit7IHJldHVybiAnYyc7IH0KK3NpZ25lZCBjaGFyIGcoVCwgUywgc2lnbmVkIGNoYXIqJiwgY29uc3Qgc2lnbmVkIGNoYXIqJiwgdm9sYXRpbGUgc2lnbmVkIGNoYXIqJikKK3sgcmV0dXJuICdjJzsgfQorCit1bnNpZ25lZCBjaGFyIGcodW5zaWduZWQgY2hhciwgY29uc3QgdW5zaWduZWQgY2hhciwgdm9sYXRpbGUgdW5zaWduZWQgY2hhcikKK3sgcmV0dXJuICdjJzsgfQordW5zaWduZWQgY2hhciBnKFIsIHVuc2lnbmVkIGNoYXImLCBjb25zdCB1bnNpZ25lZCBjaGFyJiwgdm9sYXRpbGUgdW5zaWduZWQgY2hhciYpCit7IHJldHVybiAnYyc7IH0KK3Vuc2lnbmVkIGNoYXIgZyh1bnNpZ25lZCBjaGFyKiwgY29uc3QgdW5zaWduZWQgY2hhciosIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKQoreyByZXR1cm4gJ2MnOyB9Cit1bnNpZ25lZCBjaGFyIGcoUywgdW5zaWduZWQgY2hhciomLCBjb25zdCB1bnNpZ25lZCBjaGFyKiYsIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqJikKK3sgcmV0dXJuICdjJzsgfQorCitzaG9ydCBnKHNob3J0LCBjb25zdCBzaG9ydCwgdm9sYXRpbGUgc2hvcnQpCit7IHJldHVybiAwOyB9CitzaG9ydCBnKFIsIHNob3J0JiwgY29uc3Qgc2hvcnQmLCB2b2xhdGlsZSBzaG9ydCYpCit7IHJldHVybiAwOyB9CitzaG9ydCBnKHNob3J0KiwgY29uc3Qgc2hvcnQqLCB2b2xhdGlsZSBzaG9ydCopCit7IHJldHVybiAwOyB9CitzaG9ydCBnKFMsIHNob3J0KiYsIGNvbnN0IHNob3J0KiYsIHZvbGF0aWxlIHNob3J0KiYpCit7IHJldHVybiAwOyB9CisKK3NpZ25lZCBzaG9ydCBnKFQsIHNpZ25lZCBzaG9ydCwgY29uc3Qgc2lnbmVkIHNob3J0LCB2b2xhdGlsZSBzaWduZWQgc2hvcnQpCit7IHJldHVybiAwOyB9CitzaWduZWQgc2hvcnQgZyhULCBSLCBzaWduZWQgc2hvcnQmLCBjb25zdCBzaWduZWQgc2hvcnQmLCB2b2xhdGlsZSBzaWduZWQgc2hvcnQmKQoreyByZXR1cm4gMDsgfQorc2lnbmVkIHNob3J0IGcoVCwgc2lnbmVkIHNob3J0KiwgY29uc3Qgc2lnbmVkIHNob3J0Kiwgdm9sYXRpbGUgc2lnbmVkIHNob3J0KikKK3sgcmV0dXJuIDA7IH0KK3NpZ25lZCBzaG9ydCBnKFQsIFMsIGRvdWJsZSwgc2lnbmVkIHNob3J0KiYsIGNvbnN0IHNpZ25lZCBzaG9ydComLCB2b2xhdGlsZSBzaWduZWQgc2hvcnQqJikKK3sgcmV0dXJuIDA7IH0KKwordW5zaWduZWQgc2hvcnQgZyh1bnNpZ25lZCBzaG9ydCwgY29uc3QgdW5zaWduZWQgc2hvcnQsIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0KQoreyByZXR1cm4gMDsgfQordW5zaWduZWQgc2hvcnQgZyhSLCB1bnNpZ25lZCBzaG9ydCYsIGNvbnN0IHVuc2lnbmVkIHNob3J0Jiwgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQmKQoreyByZXR1cm4gMDsgfQordW5zaWduZWQgc2hvcnQgZyh1bnNpZ25lZCBzaG9ydCosIGNvbnN0IHVuc2lnbmVkIHNob3J0Kiwgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQqKQoreyByZXR1cm4gMDsgfQordW5zaWduZWQgc2hvcnQgZyhTLCB1bnNpZ25lZCBzaG9ydComLCBjb25zdCB1bnNpZ25lZCBzaG9ydComLCB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydComKQoreyByZXR1cm4gMDsgfQorCitpbnQgZyhpbnQsIGNvbnN0IGludCwgdm9sYXRpbGUgaW50KQoreyByZXR1cm4gMDsgfQoraW50IGcoUiwgaW50JiwgY29uc3QgaW50Jiwgdm9sYXRpbGUgaW50JikKK3sgcmV0dXJuIDA7IH0KK2ludCBnKGludCosIGNvbnN0IGludCosIHZvbGF0aWxlIGludCopCit7IHJldHVybiAwOyB9CitpbnQgZyhTLCBpbnQqJiwgY29uc3QgaW50KiYsIHZvbGF0aWxlIGludComKQoreyByZXR1cm4gMDsgfQorCitzaWduZWQgaW50IGcoVCwgc2lnbmVkIGludCwgY29uc3Qgc2lnbmVkIGludCwgdm9sYXRpbGUgc2lnbmVkIGludCkKK3sgcmV0dXJuIDA7IH0KK3NpZ25lZCBpbnQgZyhULCBSLCBzaWduZWQgaW50JiwgY29uc3Qgc2lnbmVkIGludCYsIHZvbGF0aWxlIHNpZ25lZCBpbnQmKQoreyByZXR1cm4gMDsgfQorc2lnbmVkIGludCBnKFQsIHNpZ25lZCBpbnQqLCBjb25zdCBzaWduZWQgaW50Kiwgdm9sYXRpbGUgc2lnbmVkIGludCopCit7IHJldHVybiAwOyB9CitzaWduZWQgaW50IGcoVCwgUywgc2lnbmVkIGludComLCBjb25zdCBzaWduZWQgaW50KiYsIHZvbGF0aWxlIHNpZ25lZCBpbnQqJikKK3sgcmV0dXJuIDA7IH0KKwordW5zaWduZWQgaW50IGcodW5zaWduZWQgaW50LCBjb25zdCB1bnNpZ25lZCBpbnQsIHZvbGF0aWxlIHVuc2lnbmVkIGludCkKK3sgcmV0dXJuIDA7IH0KK3Vuc2lnbmVkIGludCBnKFIsIHVuc2lnbmVkIGludCYsIGNvbnN0IHVuc2lnbmVkIGludCYsIHZvbGF0aWxlIHVuc2lnbmVkIGludCYpCit7IHJldHVybiAwOyB9Cit1bnNpZ25lZCBpbnQgZyh1bnNpZ25lZCBpbnQqLCBjb25zdCB1bnNpZ25lZCBpbnQqLCB2b2xhdGlsZSB1bnNpZ25lZCBpbnQqKQoreyByZXR1cm4gMDsgfQordW5zaWduZWQgaW50IGcoUywgdW5zaWduZWQgaW50KiYsIGNvbnN0IHVuc2lnbmVkIGludComLCB2b2xhdGlsZSB1bnNpZ25lZCBpbnQqJikKK3sgcmV0dXJuIDA7IH0KKworbG9uZyBnKGxvbmcsIGNvbnN0IGxvbmcsIHZvbGF0aWxlIGxvbmcpCit7IHJldHVybiAwOyB9Citsb25nIGcoUiwgbG9uZyYsIGNvbnN0IGxvbmcmLCB2b2xhdGlsZSBsb25nJikKK3sgcmV0dXJuIDA7IH0KK2xvbmcgZyhsb25nKiwgY29uc3QgbG9uZyosIHZvbGF0aWxlIGxvbmcqKQoreyByZXR1cm4gMDsgfQorbG9uZyBnKFMsIGxvbmcqJiwgY29uc3QgbG9uZyomLCB2b2xhdGlsZSBsb25nKiYpCit7IHJldHVybiAwOyB9CisKK3NpZ25lZCBsb25nIGcoVCwgc2lnbmVkIGxvbmcsIGNvbnN0IHNpZ25lZCBsb25nLCB2b2xhdGlsZSBzaWduZWQgbG9uZykKK3sgcmV0dXJuIDA7IH0KK3NpZ25lZCBsb25nIGcoVCwgUiwgc2lnbmVkIGxvbmcmLCBjb25zdCBzaWduZWQgbG9uZyYsIHZvbGF0aWxlIHNpZ25lZCBsb25nJikKK3sgcmV0dXJuIDA7IH0KK3NpZ25lZCBsb25nIGcoVCwgc2lnbmVkIGxvbmcqLCBjb25zdCBzaWduZWQgbG9uZyosIHZvbGF0aWxlIHNpZ25lZCBsb25nKikKK3sgcmV0dXJuIDA7IH0KK3NpZ25lZCBsb25nIGcoVCwgUywgc2lnbmVkIGxvbmcqJiwgY29uc3Qgc2lnbmVkIGxvbmcqJiwgdm9sYXRpbGUgc2lnbmVkIGxvbmcqJikKK3sgcmV0dXJuIDA7IH0KKwordW5zaWduZWQgbG9uZyBnKHVuc2lnbmVkIGxvbmcsIGNvbnN0IHVuc2lnbmVkIGxvbmcsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcpCit7IHJldHVybiAwOyB9Cit1bnNpZ25lZCBsb25nIGcoUywgdW5zaWduZWQgbG9uZyYsIGNvbnN0IHVuc2lnbmVkIGxvbmcmLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nJikKK3sgcmV0dXJuIDA7IH0KK3Vuc2lnbmVkIGxvbmcgZyh1bnNpZ25lZCBsb25nKiwgY29uc3QgdW5zaWduZWQgbG9uZyosIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcqKQoreyByZXR1cm4gMDsgfQordW5zaWduZWQgbG9uZyBnKFMsIHVuc2lnbmVkIGxvbmcqJiwgY29uc3QgdW5zaWduZWQgbG9uZyomLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nKiYpCit7IHJldHVybiAwOyB9CisKKyNpZmRlZiBfX0dOVUNfXworbG9uZyBsb25nIGcobG9uZyBsb25nLCBjb25zdCBsb25nIGxvbmcsIHZvbGF0aWxlIGxvbmcgbG9uZykKK3sgcmV0dXJuIDA7IH0KK2xvbmcgbG9uZyBnKFMsIGxvbmcgbG9uZyYsIGNvbnN0IGxvbmcgbG9uZyYsIHZvbGF0aWxlIGxvbmcgbG9uZyYpCit7IHJldHVybiAwOyB9Citsb25nIGxvbmcgZyhsb25nIGxvbmcqLCBjb25zdCBsb25nIGxvbmcqLCB2b2xhdGlsZSBsb25nIGxvbmcqKQoreyByZXR1cm4gMDsgfQorbG9uZyBsb25nIGcoUiwgbG9uZyBsb25nKiYsIGNvbnN0IGxvbmcgbG9uZyomLCB2b2xhdGlsZSBsb25nIGxvbmcqJikKK3sgcmV0dXJuIDA7IH0KKworc2lnbmVkIGxvbmcgbG9uZyBnKFQsIHNpZ25lZCBsb25nIGxvbmcsIGNvbnN0IHNpZ25lZCBsb25nIGxvbmcsIHZvbGF0aWxlIHNpZ25lZCBsb25nIGxvbmcpCit7IHJldHVybiAwOyB9CitzaWduZWQgbG9uZyBsb25nIGcoVCwgUiwgc2lnbmVkIGxvbmcgbG9uZyYsIGNvbnN0IHNpZ25lZCBsb25nIGxvbmcmLCB2b2xhdGlsZSBzaWduZWQgbG9uZyBsb25nJikKK3sgcmV0dXJuIDA7IH0KK3NpZ25lZCBsb25nIGxvbmcgZyhULCBzaWduZWQgbG9uZyBsb25nKiwgY29uc3Qgc2lnbmVkIGxvbmcgbG9uZyosIHZvbGF0aWxlIHNpZ25lZCBsb25nIGxvbmcqKQoreyByZXR1cm4gMDsgfQorc2lnbmVkIGxvbmcgbG9uZyBnKFQsIFMsIHNpZ25lZCBsb25nIGxvbmcqJiwgY29uc3Qgc2lnbmVkIGxvbmcgbG9uZyomLCB2b2xhdGlsZSBzaWduZWQgbG9uZyBsb25nKiYpCit7IHJldHVybiAwOyB9CisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBnKHVuc2lnbmVkIGxvbmcgbG9uZywgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvbmcpCit7IHJldHVybiAwOyB9Cit1bnNpZ25lZCBsb25nIGxvbmcgZyhSLCB1bnNpZ25lZCBsb25nIGxvbmcqLCBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcqLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvbmcqKQoreyByZXR1cm4gMDsgfQordW5zaWduZWQgbG9uZyBsb25nIGcodW5zaWduZWQgbG9uZyBsb25nJiwgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nJiwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsb25nJikKK3sgcmV0dXJuIDA7IH0KK3Vuc2lnbmVkIGxvbmcgbG9uZyBnKFMsIHVuc2lnbmVkIGxvbmcgbG9uZyomLCBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcqJiwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsb25nKiYpCit7IHJldHVybiAwOyB9CisjZW5kaWYKKworZmxvYXQgZyhmbG9hdCwgY29uc3QgZmxvYXQsIHZvbGF0aWxlIGZsb2F0KQoreyByZXR1cm4gMDsgfQorZmxvYXQgZyhjaGFyLCBmbG9hdCYsIGNvbnN0IGZsb2F0Jiwgdm9sYXRpbGUgZmxvYXQmKQoreyByZXR1cm4gMDsgfQorZmxvYXQgZyhmbG9hdCosIGNvbnN0IGZsb2F0Kiwgdm9sYXRpbGUgZmxvYXQqKQoreyByZXR1cm4gMDsgfQorZmxvYXQgZyhjaGFyLCBmbG9hdComLCBjb25zdCBmbG9hdComLCB2b2xhdGlsZSBmbG9hdComKQoreyByZXR1cm4gMDsgfQorCitkb3VibGUgZyhkb3VibGUsIGNvbnN0IGRvdWJsZSwgdm9sYXRpbGUgZG91YmxlKQoreyByZXR1cm4gMDsgfQorZG91YmxlIGcoY2hhciwgZG91YmxlJiwgY29uc3QgZG91YmxlJiwgdm9sYXRpbGUgZG91YmxlJikKK3sgcmV0dXJuIDA7IH0KK2RvdWJsZSBnKGRvdWJsZSosIGNvbnN0IGRvdWJsZSosIHZvbGF0aWxlIGRvdWJsZSopCit7IHJldHVybiAwOyB9Citkb3VibGUgZyhjaGFyLCBkb3VibGUqJiwgY29uc3QgZG91YmxlKiYsIHZvbGF0aWxlIGRvdWJsZSomKQoreyByZXR1cm4gMDsgfQorCisjaWZkZWYgX19HTlVDX18KK2xvbmcgZG91YmxlIGcobG9uZyBkb3VibGUsIGNvbnN0IGxvbmcgZG91YmxlLCB2b2xhdGlsZSBsb25nIGRvdWJsZSkKK3sgcmV0dXJuIDA7IH0KK2xvbmcgZG91YmxlIGcoY2hhciwgbG9uZyBkb3VibGUmLCBjb25zdCBsb25nIGRvdWJsZSYsIHZvbGF0aWxlIGxvbmcgZG91YmxlJikKK3sgcmV0dXJuIDA7IH0KK2xvbmcgZG91YmxlIGcobG9uZyBkb3VibGUqLCBjb25zdCBsb25nIGRvdWJsZSosIHZvbGF0aWxlIGxvbmcgZG91YmxlKikKK3sgcmV0dXJuIDA7IH0KK2xvbmcgZG91YmxlIGcoY2hhciwgbG9uZyBkb3VibGUqJiwgY29uc3QgbG9uZyBkb3VibGUqJiwgdm9sYXRpbGUgbG9uZyBkb3VibGUqJikKK3sgcmV0dXJuIDA7IH0KKyNlbmRpZgorCitjbGFzcyBjIHsKK3B1YmxpYzoKKyAgICBjKGludCkge307CisgICAgaW50IGk7Cit9OworCitjbGFzcyBjIGcoYywgY29uc3QgYywgdm9sYXRpbGUgYykKK3sgcmV0dXJuIDA7IH0KK2MgZyhjaGFyLCBjJiwgY29uc3QgYyYsIHZvbGF0aWxlIGMmKQoreyByZXR1cm4gMDsgfQorYyBnKGMqLCBjb25zdCBjKiwgdm9sYXRpbGUgYyopCit7IHJldHVybiAwOyB9CitjIGcoY2hhciwgYyomLCBjb25zdCBjKiYsIHZvbGF0aWxlIGMqJikKK3sgcmV0dXJuIDA7IH0KKworLyoKK3ZvaWQgaChjaGFyID0gJ2EnKQoreyB9Cit2b2lkIGgoY2hhciwgc2lnbmVkIGNoYXIgPSAnYScpCit7IH0KK3ZvaWQgaCh1bnNpZ25lZCBjaGFyID0gJ2EnKQoreyB9CisqLworLyoKK3ZvaWQgaChjaGFyID0gKGNoYXIpJ2EnKQoreyB9Cit2b2lkIGgoY2hhciwgc2lnbmVkIGNoYXIgPSAoc2lnbmVkIGNoYXIpJ2EnKQoreyB9Cit2b2lkIGgodW5zaWduZWQgY2hhciA9ICh1bnNpZ25lZCBjaGFyKSdhJykKK3sgfQorCisKK3ZvaWQgaChzaG9ydCA9IChzaG9ydCk0MykKK3sgfQordm9pZCBoKGNoYXIsIHNpZ25lZCBzaG9ydCA9IChzaWduZWQgc2hvcnQpNDMpCit7IH0KK3ZvaWQgaCh1bnNpZ25lZCBzaG9ydCA9ICh1bnNpZ25lZCBzaG9ydCk0MykKK3sgfQorCit2b2lkIGgoaW50ID0gKGludCk0MykKK3sgfQordm9pZCBoKGNoYXIsIHNpZ25lZCBpbnQgPSAoc2lnbmVkIGludCk0MykKK3sgfQordm9pZCBoKHVuc2lnbmVkIGludCA9ICh1bnNpZ25lZCBpbnQpNDMpCit7IH0KKworCit2b2lkIGgobG9uZyA9IChsb25nKTQzKQoreyB9Cit2b2lkIGgoY2hhciwgc2lnbmVkIGxvbmcgPSAoc2lnbmVkIGxvbmcpNDMpCit7IH0KK3ZvaWQgaCh1bnNpZ25lZCBsb25nID0gKHVuc2lnbmVkIGxvbmcpNDMpCit7IH0KKworI2lmZGVmIF9fR05VQ19fCit2b2lkIGgobG9uZyBsb25nID0gNDMpCit7IH0KK3ZvaWQgaChjaGFyLCBzaWduZWQgbG9uZyBsb25nID0gNDMpCit7IH0KK3ZvaWQgaCh1bnNpZ25lZCBsb25nIGxvbmcgPSA0MykKK3sgfQorI2VuZGlmCisKK3ZvaWQgaChmbG9hdCA9IDQuM2UtMTApCit7IH0KK3ZvaWQgaChkb3VibGUgPSA0LjMpCit7IH0KKyNpZmRlZiBfX0dOVUNfXwordm9pZCBoKGxvbmcgZG91YmxlID0gNC4zM2UzMykKK3sgfQorI2VuZGlmCisqLwordm9pZCBwcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4gKQoreworICAgIC8vIGVsaXBzaXMKK30KKworY2xhc3MgVDEgeworcHVibGljOgorICAgIHN0YXRpYyB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90KTsKKyAgICBzdGF0aWMgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqcG9pbnRlcik7CisKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBUMSYpOworICAgIFQxJiBvcGVyYXRvcj0oaW50KTsKKworICAgIGludCBvcGVyYXRvcj09KGludCkgY29uc3Q7CisgICAgaW50IG9wZXJhdG9yPT0oY29uc3QgVDEmKSBjb25zdDsKKyAgICBpbnQgb3BlcmF0b3IhPShpbnQpIGNvbnN0OworICAgIGludCBvcGVyYXRvciE9KGNvbnN0IFQxJikgY29uc3Q7CisKKyAgICBpbnQgb3BlcmF0b3I8PShpbnQpIGNvbnN0OworICAgIGludCBvcGVyYXRvcjw9KGNvbnN0IFQxJikgY29uc3Q7CisgICAgaW50IG9wZXJhdG9yPChpbnQpIGNvbnN0OworICAgIGludCBvcGVyYXRvcjwoY29uc3QgVDEmKSBjb25zdDsKKyAgICBpbnQgb3BlcmF0b3I+PShpbnQpIGNvbnN0OworICAgIGludCBvcGVyYXRvcj49KGNvbnN0IFQxJikgY29uc3Q7CisgICAgaW50IG9wZXJhdG9yPihpbnQpIGNvbnN0OworICAgIGludCBvcGVyYXRvcj4oY29uc3QgVDEmKSBjb25zdDsKKworICAgIHZvaWQgb3BlcmF0b3IrKGludCkgY29uc3Q7CisgICAgVDEmIG9wZXJhdG9yKyhjb25zdCBUMSYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3IrPShpbnQpIGNvbnN0OworICAgIFQxJiBvcGVyYXRvcis9KGNvbnN0IFQxJikgY29uc3Q7CisKKyAgICBUMSYgb3BlcmF0b3IrKygpIGNvbnN0OworCisgICAgdm9pZCBvcGVyYXRvci0oaW50KSBjb25zdDsKKyAgICBUMSYgb3BlcmF0b3ItKGNvbnN0IFQxJikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvci09KGludCkgY29uc3Q7CisgICAgVDEmIG9wZXJhdG9yLT0oY29uc3QgVDEmKSBjb25zdDsKKworICAgIFQxJiBvcGVyYXRvci0tKCkgY29uc3Q7CisKKyAgICB2b2lkIG9wZXJhdG9yKihpbnQpIGNvbnN0OworICAgIFQxJiBvcGVyYXRvciooY29uc3QgVDEmKSBjb25zdDsKKyAgICB2b2lkIG9wZXJhdG9yKj0oaW50KSBjb25zdDsKKyAgICBUMSYgb3BlcmF0b3IqPShjb25zdCBUMSYpIGNvbnN0OworCisgICAgdm9pZCBvcGVyYXRvci8oaW50KSBjb25zdDsKKyAgICBUMSYgb3BlcmF0b3IvKGNvbnN0IFQxJikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvci89KGludCkgY29uc3Q7CisgICAgVDEmIG9wZXJhdG9yLz0oY29uc3QgVDEmKSBjb25zdDsKKworICAgIHZvaWQgb3BlcmF0b3IlKGludCkgY29uc3Q7CisgICAgVDEmIG9wZXJhdG9yJShjb25zdCBUMSYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3IlPShpbnQpIGNvbnN0OworICAgIFQxJiBvcGVyYXRvciU9KGNvbnN0IFQxJikgY29uc3Q7CisKKyAgICB2b2lkIG9wZXJhdG9yJiYoaW50KSBjb25zdDsKKyAgICBUMSYgb3BlcmF0b3ImJihjb25zdCBUMSYpIGNvbnN0OworCisgICAgdm9pZCBvcGVyYXRvcnx8KGludCkgY29uc3Q7CisgICAgVDEmIG9wZXJhdG9yfHwoY29uc3QgVDEmKSBjb25zdDsKKworICAgIHZvaWQgb3BlcmF0b3ImKGludCkgY29uc3Q7CisgICAgVDEmIG9wZXJhdG9yJihjb25zdCBUMSYpIGNvbnN0OworICAgIHZvaWQgb3BlcmF0b3ImPShpbnQpIGNvbnN0OworICAgIFQxJiBvcGVyYXRvciY9KGNvbnN0IFQxJikgY29uc3Q7CisKKyAgICB2b2lkIG9wZXJhdG9yfChpbnQpIGNvbnN0OworICAgIFQxJiBvcGVyYXRvcnwoY29uc3QgVDEmKSBjb25zdDsKKyAgICB2b2lkIG9wZXJhdG9yfD0oaW50KSBjb25zdDsKKyAgICBUMSYgb3BlcmF0b3J8PShjb25zdCBUMSYpIGNvbnN0OworCisgICAgdm9pZCBvcGVyYXRvcl4oaW50KSBjb25zdDsKKyAgICBUMSYgb3BlcmF0b3JeKGNvbnN0IFQxJikgY29uc3Q7CisgICAgdm9pZCBvcGVyYXRvcl49KGludCkgY29uc3Q7CisgICAgVDEmIG9wZXJhdG9yXj0oY29uc3QgVDEmKSBjb25zdDsKKworICAgIFQxJiBvcGVyYXRvciEoKSBjb25zdDsKKyAgICBUMSYgb3BlcmF0b3J+KCkgY29uc3Q7Cit9OworCit2b2lkKiAKK1QxOjpvcGVyYXRvciBuZXcoc2l6ZV90KQoreyByZXR1cm4gMDsgfQorCit2b2lkCitUMTo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKnBvaW50ZXIpCit7IH0KKworY2xhc3MgVDIgeworcHVibGljOgorICAgIFQyKGludCBpKTogaW50ZWdlcihpKQorCXsgfQorICAgIGludCBpbnRlZ2VyOworfTsKKworaW50IG9wZXJhdG9yPT0oY29uc3QgVDImLCBjb25zdCBUMiYpCit7IHJldHVybiAwOyB9CitpbnQgb3BlcmF0b3I9PShjb25zdCBUMiYsIGNoYXIpCit7IHJldHVybiAwOyB9CitpbnQgb3BlcmF0b3IhPShjb25zdCBUMiYsIGNvbnN0IFQyJikKK3sgcmV0dXJuIDA7IH0KK2ludCBvcGVyYXRvciE9KGNvbnN0IFQyJiwgY2hhcikKK3sgcmV0dXJuIDA7IH0KKworaW50IG9wZXJhdG9yPD0oY29uc3QgVDImLCBjb25zdCBUMiYpCit7IHJldHVybiAwOyB9CitpbnQgb3BlcmF0b3I8PShjb25zdCBUMiYsIGNoYXIpCit7IHJldHVybiAwOyB9CitpbnQgb3BlcmF0b3I8KGNvbnN0IFQyJiwgY29uc3QgVDImKQoreyByZXR1cm4gMDsgfQoraW50IG9wZXJhdG9yPChjb25zdCBUMiYsIGNoYXIpCit7IHJldHVybiAwOyB9CitpbnQgb3BlcmF0b3I+PShjb25zdCBUMiYsIGNvbnN0IFQyJikKK3sgcmV0dXJuIDA7IH0KK2ludCBvcGVyYXRvcj49KGNvbnN0IFQyJiwgY2hhcikKK3sgcmV0dXJuIDA7IH0KK2ludCBvcGVyYXRvcj4oY29uc3QgVDImLCBjb25zdCBUMiYpCit7IHJldHVybiAwOyB9CitpbnQgb3BlcmF0b3I+KGNvbnN0IFQyJiwgY2hhcikKK3sgcmV0dXJuIDA7IH0KKworVDIgb3BlcmF0b3IrKGNvbnN0IFQyIHQsIGludCBpKQoreyByZXR1cm4gdC5pbnRlZ2VyICsgaTsgfQorVDIgb3BlcmF0b3IrKGNvbnN0IFQyIGEsIGNvbnN0IFQyJiBiKQoreyByZXR1cm4gYS5pbnRlZ2VyICsgYi5pbnRlZ2VyOyB9CitUMiYgb3BlcmF0b3IrPShUMiYgdCwgaW50IGkpCit7IHQuaW50ZWdlciArPSBpOyByZXR1cm4gdDsgfQorVDImIG9wZXJhdG9yKz0oVDImIGEsIGNvbnN0IFQyJiBiKQoreyBhLmludGVnZXIgKz0gYi5pbnRlZ2VyOyByZXR1cm4gYTsgfQorCitUMiBvcGVyYXRvci0oY29uc3QgVDIgdCwgaW50IGkpCit7IHJldHVybiB0LmludGVnZXIgLSBpOyB9CitUMiBvcGVyYXRvci0oY29uc3QgVDIgYSwgY29uc3QgVDImIGIpCit7IHJldHVybiBhLmludGVnZXIgLSBiLmludGVnZXI7IH0KK1QyJiBvcGVyYXRvci09KFQyJiB0LCBpbnQgaSkKK3sgdC5pbnRlZ2VyIC09IGk7IHJldHVybiB0OyB9CitUMiYgb3BlcmF0b3ItPShUMiYgYSwgY29uc3QgVDImIGIpCit7IGEuaW50ZWdlciAtPSBiLmludGVnZXI7IHJldHVybiBhOyB9CisKK1QyIG9wZXJhdG9yKihjb25zdCBUMiB0LCBpbnQgaSkKK3sgcmV0dXJuIHQuaW50ZWdlciAqIGk7IH0KK1QyIG9wZXJhdG9yKihjb25zdCBUMiBhLCBjb25zdCBUMiYgYikKK3sgcmV0dXJuIGEuaW50ZWdlciAqIGIuaW50ZWdlcjsgfQorVDImIG9wZXJhdG9yKj0oVDImIHQsIGludCBpKQoreyB0LmludGVnZXIgKj0gaTsgcmV0dXJuIHQ7IH0KK1QyJiBvcGVyYXRvcio9KFQyJiBhLCBjb25zdCBUMiYgYikKK3sgYS5pbnRlZ2VyICo9IGIuaW50ZWdlcjsgcmV0dXJuIGE7IH0KKworVDIgb3BlcmF0b3IvKGNvbnN0IFQyIHQsIGludCBpKQoreyByZXR1cm4gdC5pbnRlZ2VyIC8gaTsgfQorVDIgb3BlcmF0b3IvKGNvbnN0IFQyIGEsIGNvbnN0IFQyJiBiKQoreyByZXR1cm4gYS5pbnRlZ2VyIC8gYi5pbnRlZ2VyOyB9CitUMiYgb3BlcmF0b3IvPShUMiYgdCwgaW50IGkpCit7IHQuaW50ZWdlciAvPSBpOyByZXR1cm4gdDsgfQorVDImIG9wZXJhdG9yLz0oVDImIGEsIGNvbnN0IFQyJiBiKQoreyBhLmludGVnZXIgLz0gYi5pbnRlZ2VyOyByZXR1cm4gYTsgfQorCitUMiBvcGVyYXRvciUoY29uc3QgVDIgdCwgaW50IGkpCit7IHJldHVybiB0LmludGVnZXIgJSBpOyB9CitUMiBvcGVyYXRvciUoY29uc3QgVDIgYSwgY29uc3QgVDImIGIpCit7IHJldHVybiBhLmludGVnZXIgJSBiLmludGVnZXI7IH0KK1QyJiBvcGVyYXRvciU9KFQyJiB0LCBpbnQgaSkKK3sgdC5pbnRlZ2VyICU9IGk7IHJldHVybiB0OyB9CitUMiYgb3BlcmF0b3IlPShUMiYgYSwgY29uc3QgVDImIGIpCit7IGEuaW50ZWdlciAlPSBiLmludGVnZXI7IHJldHVybiBhOyB9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjbGFzcyBUNSB7CitwdWJsaWM6CisgICAgVDUoaW50KTsKKyAgICBUNShjb25zdCBUNTxUPiYpOworICAgIH5UNSgpOworICAgIHN0YXRpYyB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90KTsKKyAgICBzdGF0aWMgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqcG9pbnRlcik7CisgICAgaW50IHZhbHVlKCk7CisgICAgCisgICAgc3RhdGljIFQgWDsKKyAgICBUIHg7CisgICAgaW50IHZhbDsKK307CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitUNTxUPjo6VDUoaW50IHYpCit7IHZhbCA9IHY7IH0KKwordGVtcGxhdGU8Y2xhc3MgVD4KK1Q1PFQ+OjpUNShjb25zdCBUNTxUPiYpCit7fQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorVDU8VD46On5UNSgpCit7fQorCit0ZW1wbGF0ZTxjbGFzcyBUPgordm9pZCoKK1Q1PFQ+OjpvcGVyYXRvciBuZXcoc2l6ZV90KQoreyByZXR1cm4gMDsgfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgordm9pZAorVDU8VD46Om9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwb2ludGVyKQoreyB9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitpbnQKK1Q1PFQ+Ojp2YWx1ZSgpCit7IHJldHVybiB2YWw7IH0KKworCisjaWYgISBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKEdDQ19CVUcpCit0ZW1wbGF0ZTxjbGFzcyBUPgorVCBUNTxUPjo6WDsKKyNlbmRpZgorCisKKworCitUNTxjaGFyPiB0NWMoMSk7CitUNTxpbnQ+IHQ1aSgyKTsKK1Q1PGludCAoKikoY2hhciwgdm9pZCAqKT4gdDVmaTEoMyk7CitUNTxpbnQgKCopKGludCwgZG91YmxlICoqLCB2b2lkICopPiB0NWZpMig0KTsKKworIAorCisKKworCitjbGFzcyB4IHsKK3B1YmxpYzoKKyAgICBpbnQgKCptYW5hZ2VbNV0pKGRvdWJsZSwKKwkJICAgICB2b2lkICooKm1hbGxvYykodW5zaWduZWQgc2l6ZSksCisJCSAgICAgdm9pZCAoKmZyZWUpKHZvaWQgKnBvaW50ZXIpKTsKKyAgICBpbnQgKCpkZXZpY2VbNV0pKGludCBvcGVuKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbW9kZSwgdW5zaWduZWQgcGVybXMsIGludCBleHRyYSA9IDApLCAKKwkJICAgICBpbnQgKigqcmVhZCkoaW50IGZkLCB2b2lkICpwbGFjZSwgdW5zaWduZWQgc2l6ZSksCisJCSAgICAgaW50ICooKndyaXRlKShpbnQgZmQsIHZvaWQgKnBsYWNlLCB1bnNpZ25lZCBzaXplKSwKKwkJICAgICB2b2lkICgqY2xvc2UpKGludCBmZCkpOworfTsKK1Q1PHg+IHQ1eCg1KTsKKworI2lmICFkZWZpbmVkKF9fR05VQ19fKSB8fCAoX19HTlVDX18gPj0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA2KQordGVtcGxhdGUgY2xhc3MgVDU8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBUNTxpbnQ+OwordGVtcGxhdGUgY2xhc3MgVDU8aW50ICgqKShjaGFyLCB2b2lkICopPjsKK3RlbXBsYXRlIGNsYXNzIFQ1PGludCAoKikoaW50LCBkb3VibGUgKiosIHZvaWQgKik+OwordGVtcGxhdGUgY2xhc3MgVDU8eD47CisjZW5kaWYKKworY2xhc3MgVDcgeworcHVibGljOgorICAgIHN0YXRpYyBpbnQgZ2V0KCk7CisgICAgc3RhdGljIHZvaWQgcHV0KGludCk7Cit9OworCitpbnQKK1Q3OjpnZXQoKQoreyByZXR1cm4gMTsgfQorCit2b2lkCitUNzo6cHV0KGludCBpKQoreworICAgIC8vIG5vdGhpbmcKK30KKworLy8gTW9yZSB0ZW1wbGF0ZSBraW5kcy4gIEdEQiA0LjE2IGRpZG4ndCBoYW5kbGUgdGhlc2UsIGJ1dAorLy8gV2lsZGViZWVzdCBkb2VzLiAgTm90ZTogQXNzdW1pbmcgSFAgYUNDIGlzIHVzZWQgdG8gY29tcGlsZQorLy8gdGhpcyBmaWxlOyB3aXRoIGcrKyBvciBIUCBjZnJvbnQgb3Igb3RoZXIgY29tcGlsZXJzIHRoZQorLy8gZGVtYW5nbGluZyBtYXkgbm90IGdldCBkb25lIGNvcnJlY3RseS4KKworLy8gT3JkaW5hcnkgdGVtcGxhdGUsIHRvIGJlIGluc3RhbnRpYXRlZCB3aXRoIGRpZmZlcmVudCB0eXBlcwordGVtcGxhdGU8Y2xhc3MgVD4KK2NsYXNzIEZvbyB7CitwdWJsaWM6CisgIGludCB4OworICBUIHQ7CisgIFQgZm9vIChpbnQsIFQpOworfTsKKworCit0ZW1wbGF0ZTxjbGFzcyBUPiBUIEZvbzxUPjo6Zm9vIChpbnQgaSwgVCB0dCkKK3sKKyAgcmV0dXJuIHR0OworfQorCisvLyBUZW1wbGF0ZSB3aXRoIGludCBwYXJhbWV0ZXIKKwordGVtcGxhdGU8Y2xhc3MgVCwgaW50IHN6PgorY2xhc3MgQmFyIHsKK3B1YmxpYzoKKyAgaW50IHg7CisgIFQgdDsKKyAgVCBiYXIgKGludCwgVCk7Cit9OworCisKK3RlbXBsYXRlPGNsYXNzIFQsIGludCBzej4gVCBCYXI8VCwgc3o+OjpiYXIgKGludCBpLCBUIHR0KQoreworICBpZiAoaSA8IHN6KQorICAgIHJldHVybiB0dDsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvLyBmdW5jdGlvbiB0ZW1wbGF0ZSB3aXRoIGludCBwYXJhbWV0ZXIKK3RlbXBsYXRlPGNsYXNzIFQ+IGludCBkdW1teSAoVCB0dCwgaW50IGkpCit7CisgIHJldHVybiB0dDsKK30KKworLy8gVGVtcGxhdGUgd2l0aCBwYXJ0aWFsIHNwZWNpYWxpemF0aW9ucwordGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyPgorY2xhc3MgU3BlYyB7CitwdWJsaWM6CisgIGludCB4OworICBUMSBzcGVjIChUMik7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDI+CitUMSBTcGVjPFQxLCBUMj46OnNwZWMgKFQyIHQyKQoreworICByZXR1cm4gMDsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NsYXNzIFNwZWM8VCwgVCo+IHsKK3B1YmxpYzoKKyAgaW50IHg7CisgIFQgc3BlYyAoVCopOworfTsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK1QgU3BlYzxULCBUKj46OnNwZWMgKFQgKiB0cCkKK3sKKyAgcmV0dXJuICp0cDsKK30KKworLy8gVGVtcGxhdGUgd2l0aCBjaGFyIHBhcmFtZXRlcgordGVtcGxhdGU8Y2xhc3MgVCwgY2hhciBzej4KK2NsYXNzIEJheiB7CitwdWJsaWM6CisgIGludCB4OworICBUIHQ7CisgIFQgYmF6IChpbnQsIFQpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgVCwgY2hhciBzej4gVCBCYXo8VCwgc3o+OjpiYXogKGludCBpLCBUIHR0KQoreworICBpZiAoaSA8IHN6KQorICAgIHJldHVybiB0dDsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvLyBUZW1wbGF0ZSB3aXRoIGNoYXIgKiBwYXJhbWV0ZXIKK3RlbXBsYXRlPGNsYXNzIFQsIGNoYXIgKiBzej4KK2NsYXNzIFF1eCB7CitwdWJsaWM6CisgIGludCB4OworICBUIHQ7CisgIFQgcXV4IChpbnQsIFQpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgVCwgY2hhciAqIHN6PiBUIFF1eDxULCBzej46OnF1eCAoaW50IGksIFQgdHQpCit7CisgIGlmIChzelswXSA9PSAncScpCisgICAgcmV0dXJuIHR0OworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIFRlbXBsYXRlIHdpdGggYSBmdW5jdGlvbiBwb2ludGVyIHBhcmFtZXRlcgordGVtcGxhdGU8Y2xhc3MgVCwgaW50ICgqZikoaW50KSA+CitjbGFzcyBRdXgxIHsKK3B1YmxpYzoKKyAgaW50IHg7CisgIFQgdDsKKyAgVCBxdXggKGludCwgVCk7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBULCBpbnQgKCpmKShpbnQpPiBUIFF1eDE8VCwgZj46OnF1eCAoaW50IGksIFQgdHQpCit7CisgIGlmIChmICE9IDApCisgICAgcmV0dXJuIHR0OworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIFNvbWUgZnVuY3Rpb25zIHRvIHByb3ZpZGUgYXMgYXJndW1lbnRzIHRvIHRlbXBsYXRlCitpbnQgZ2YxIChpbnQgYSkgeworICByZXR1cm4gYSAqIDIgKyAxMzsKK30KK2ludCBnZjIgKGludCBhKSB7CisgIHJldHVybiBhICogMiArIDI2OworfQorCitjaGFyIHN0cmluZ1szXTsKKworCisvLyBUZW1wbGF0ZSBmb3IgbmVzdGVkIGluc3RhbnRpYXRpb25zCisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjbGFzcyBHYXJwbHkgeworcHVibGljOgorICBpbnQgeDsKKyAgVCB0OworICBUIGdhcnBseSAoaW50LCBUKTsKK307CisKK3RlbXBsYXRlPGNsYXNzIFQ+IFQgR2FycGx5PFQ+OjpnYXJwbHkgKGludCBpLCBUIHR0KQoreworICBpZiAoaSA+IHgpCisgICAgcmV0dXJuIHR0OworICBlbHNlCisgICAgeworICAgICAgeCArPSBpOworICAgICAgcmV0dXJuIHR0OworICAgIH0KK30KKworCitpbnQgbWFpbigpCit7CisgICAgaW50IGk7CisjaWZkZWYgdXNlc3R1YnMKKyAgICBzZXRfZGVidWdfdHJhcHMoKTsKKyAgICBicmVha3BvaW50KCk7CisjZW5kaWYKKyAgICBpID0gaSArIDE7CisKKyAgICAvLyBOZXcgdGVzdHMgYWRkZWQgaGVyZQorCisgIEZvbzxpbnQ+IGZpbnQ7CisgIEZvbzxjaGFyPiBmY2hhcjsKKyAgRm9vPHZvbGF0aWxlIGNoYXIgKj4gZnZwY2hhcjsKKworICBCYXI8aW50LCAzMz4gYmludDsKKyAgQmFyPGludCwgKDQgPiAzKT4gYmludDI7CisKKyAgQmF6PGludCwgJ3MnPiBiYXppbnQ7CisgIEJhejxjaGFyLCAnYSc+IGJhemludDI7CisKKyAgUXV4PGNoYXIsIHN0cmluZz4gcXV4aW50MjsKKyAgUXV4PGludCwgc3RyaW5nPiBxdXhpbnQ7CisKKyAgUXV4MTxpbnQsIGdmMT4gcXV4MTE7CisKKyAgaW50IHggPSBmaW50LmZvbygzMywgNDcpOworICBjaGFyIGMgPSBmY2hhci5mb28oMzMsICd4Jyk7CisgIHZvbGF0aWxlIGNoYXIgKiBjcCA9IGZ2cGNoYXIuZm9vKDMzLCAwKTsKKyAgCisgIGludCB5ID0gZHVtbXk8aW50PiAoNDAwLCA2MDApOworCisgIGludCB6ID0gYmludC5iYXIoNTUsIDY2KTsKKyAgeiArPSBiaW50Mi5iYXIoNTUsIDY2KTsKKworICBjID0gYmF6aW50Mi5iYXooNCwgJ3knKTsKKyAgYyA9IHF1eGludDIucXV4KDQsICd6Jyk7CisgIAorICB5ID0gYmF6aW50LmJheig0LDMpOworICB5ID0gcXV4aW50LnF1eCg0LCAyMik7CisgIHkgKz0gcXV4MTEucXV4KDQsIDIyKTsKKworICB5ICo9IGdmMSh5KSAtIGdmMih5KTsKKyAgCisgIFNwZWM8aW50LCBjaGFyPiBzaWM7CisgIFNwZWM8aW50LCBpbnQgKj4gc2lpcDsKKworICBzaWMuc3BlYyAoJ2MnKTsKKyAgc2lpcC5zcGVjICgmeCk7CisKKyAgR2FycGx5PGludD4gZjsKKyAgR2FycGx5PGNoYXI+IGZjOworICBmLnggPSAxMzsKKworICBHYXJwbHk8R2FycGx5PGNoYXI+ID4gbmY7CisgIG5mLnggPSAzMTsKKyAgCisgIHggPSBmLmdhcnBseSAoMywgNCk7CisgIAorICBmYyA9IG5mLmdhcnBseSAoMywgZmMpOworCisgIHkgPSB4ICsgZmMueDsKKyAgCisKKyAgcmV0dXJuIDA7CisgICAgCit9CisKKworCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3RlbXBsLWhwLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3RlbXBsLWhwLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGNhNTNkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvdGVtcGwtaHAuZXhwCkBAIC0wLDAgKzEsMzgxIEBACisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworCisKKyMgTW9yZSB0ZXN0cyBmb3IgZGlmZmVyZW50IGtpbmRzIG9mIHRlbXBsYXRlIHBhcmFtZXRlcnMsCisjIHRlbXBsYXRlcyB3aXRoIHBhcnRpYWwgc3BlY2lhbGl6YXRpb25zLCBuZXN0ZWQgdGVtcGxhdGVzLCBldGMuCisjIFRoZXNlIGhhdmUgYmVlbiB0ZXN0ZWQgb25seSB3aXRoIEhQIGFDQy4gIFRoZXkgcHJvYmFibHkgd29uJ3QKKyMgd29yayB3aXRoIG90aGVyIGNvbXBpbGVycyBiZWNhdXNlIG9mIGRpZmZlcmVuY2VzIGluIG1hbmdsaW5nCisjIHNjaGVtZXMuIAorIyBBZGRlZCBieSBTYXRpc2ggUGFpIDxwYWlAYXBvbGxvLmhwLmNvbT4gMTk5Ny0wOS0yNSAKKworCitzZXQgd3MgIlxbXHJcblx0IFxdKyIKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCB0ZXN0ZmlsZSAidGVtcGwtaHAiCitzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCisgCisKKyMgQ3JlYXRlIGFuZCBzb3VyY2UgdGhlIGZpbGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIKKyMgdXNlZCB0byBjb21waWxlIHRoZSB0ZXN0IGNhc2UuCisKK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9ICJjKysiXSB7CisgICAgcmV0dXJuIC0xOworfQorCitpZiB7W3NraXBfaHBfdGVzdHMgJGdjY19jb21waWxlZF19IHRoZW4geyBjb250aW51ZSB9CisKKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1ZyBjKyt9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCisKK30KKworIworIyAgVGVzdCBwcmludGluZyBvZiB0aGUgdHlwZXMgb2YgdGVtcGxhdGVzLgorIworCitwcm9jIHRlc3RfcHR5cGVfb2ZfdGVtcGxhdGVzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgc2VuZF9nZGIgInB0eXBlIFQ1PGludD5cbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBUNTxpbnQ+IFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSpzdGF0aWMgaW50IFg7XHJcblxbIFx0XF0qaW50IHg7XHJcblxbIFx0XF0qaW50IHZhbDtcclxuXHJcblxbIFx0XF0qVDVcXChpbnRcXCk7XHJcblxbIFx0XF0qVDVcXChjbGFzcyBUNTxpbnQ+IGNvbnN0ICZcXCk7XHJcblxbIFx0XF0qdm9pZCB+VDVcXChpbnRcXCk7XHJcblxbIFx0XF0qc3RhdGljIHZvaWQgXFwqIG5ld1xcKHVuc2lnbmVkIGludFxcKTtcclxuXFsgXHRcXSpzdGF0aWMgdm9pZCBkZWxldGVcXCh2b2lkIFxcKlxcKTtcclxuXFsgXHRcXSppbnQgdmFsdWVcXCh2b2lkXFwpO1xyXG5cWyBcdFxdKlxcfVxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIFQ1PGludD4iIH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwdHlwZSBUNTxpbnQ+IiB9CisJdGltZW91dCB7IGZhaWwgInB0eXBlIFQ1PGludD4gKHRpbWVvdXQpIiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIHQ1aVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIFQ1PGludD4gXFx7XHJcblxbIFx0XF0qcHVibGljOlxyXG5cWyBcdFxdKnN0YXRpYyBpbnQgWDtcclxuXFsgXHRcXSppbnQgeDtcclxuXFsgXHRcXSppbnQgdmFsO1xyXG5cclxuXFsgXHRcXSpUNVxcKGludFxcKTtcclxuXFsgXHRcXSpUNVxcKGNsYXNzIFQ1PGludD4gY29uc3QgJlxcKTtcclxuXFsgXHRcXSp2b2lkIH5UNVxcKGludFxcKTtcclxuXFsgXHRcXSpzdGF0aWMgdm9pZCBcXCogbmV3XFwodW5zaWduZWQgaW50XFwpO1xyXG5cWyBcdFxdKnN0YXRpYyB2b2lkIGRlbGV0ZVxcKHZvaWQgXFwqXFwpO1xyXG5cWyBcdFxdKmludCB2YWx1ZVxcKHZvaWRcXCk7XHJcblxbIFx0XF0qXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgdDVpPGludD4gMSIgfQorCS1yZSAidHlwZSA9IGNsYXNzIFQ1PGludD4gXHsuKnB1YmxpYzouKnN0YXRpYyBpbnQgWDsuKmludCB4Oy4qaW50IHZhbDsuKi4qVDUgXFwoaW50XFwpOy4qLip2b2lkIH5UNSBcXChpbnRcXCkuKi4qLippbnQgdmFsdWUgXFwodm9pZFxcKTsuKlx9LiokZ2RiX3Byb21wdCAkIiB7IAorCSAgICBwYXNzICJwdHlwZSB0NWkiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInB0eXBlIHQ1aSIgfQorCXRpbWVvdXQgeyBmYWlsICJwdHlwZSB0NWkgKHRpbWVvdXQpIiB9CisgICAgfQorfQorCisjCisjICBUZXN0IGJyZWFrcG9pbnQgc2V0dGluZyBvbiB0ZW1wbGF0ZSBtZXRob2RzLgorIworCitwcm9jIHRlc3RfdGVtcGxhdGVfYnJlYWtwb2ludHMge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIHRlc3RmaWxlCisgICAgZ2xvYmFsIHNyY2RpcgorCisgICAgc2VuZF9nZGIgImJyZWFrIFQ1PGludD46OlQ1XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIwLiBjYW5jZWwuKlxyXG4uMS4gYWxsLipcclxuLjIuICouKlxyXG4uMy4gKi4qXHJcbj4gJCIgeworCSAgICBnZGJfdGVzdCAiMCIgXAorCQkiY2FuY2VsbGVkIiBcCisJCSJjb25zdHJ1Y3RvciBicmVha3BvaW50IgorCX0KKwktcmUgIi4wLiBjYW5jZWxcclxuLjEuIGFsbFxyXG4uMi4gVDU8aW50Pjo6VDVcXChUNTxpbnQ+IGNvbnN0ICZcXCkgYXQgLiovdGVtcGxhdGVzLmNjOi4qXHJcbi4zLiBUNTxpbnQ+OjpUNVxcKGludFxcKSBhdCAuKi90ZW1wbGF0ZXMtaHAuY2M6LipcclxuPiAkIiB7CisJICAgIGdkYl90ZXN0ICIwIiBcCisJCSJjYW5jZWxsZWQiIFwKKwkJImNvbnN0cnVjdG9yIGJyZWFrcG9pbnQiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbnN0cnVjdG9yIGJyZWFrcG9pbnQiIH0KKwlkZWZhdWx0IHsgZmFpbCAiY29uc3RydWN0b3IgYnJlYWtwb2ludCAodGltZW91dCkiIH0KKyAgICB9CisgICAgCisgICAgZ2RiX3Rlc3QgImJyZWFrIFQ1PGludD46On5UNSIgXAorCSJCcmVha3BvaW50LiphdC4qIGZpbGUgLioke3Rlc3RmaWxlfS5jYywgbGluZS4qIiBcCisJImRlc3RydWN0b3IgYnJlYWtwb2ludCIgICAgCisgICAgCisgICAgZ2RiX3Rlc3QgImJyZWFrIFQ1PGludD46OnZhbHVlIiBcCisJIkJyZWFrcG9pbnQuKmF0LiogZmlsZSAuKiR7dGVzdGZpbGV9LmNjLCBsaW5lLioiIFwKKwkidmFsdWUgbWV0aG9kIGJyZWFrcG9pbnQiCisKKyAgICBkZWxldGVfYnJlYWtwb2ludHMKK30KKworIworIyAgVGVzdCBjYWxsaW5nIG9mIHRlbXBsYXRlIG1ldGhvZHMuCisjCisKK3Byb2MgdGVzdF90ZW1wbGF0ZV9jYWxscyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIHNlbmRfZ2RiICJwcmludCB0NWkudmFsdWUoKVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSAyXHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgdDVpLnZhbHVlKCkiIH0KKwktcmUgIkNhbm5vdCBpbnZva2UgZnVuY3Rpb25zIG9uIHRoaXMgbWFjaGluZS4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwcmludCB0NWkudmFsdWUoKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgdDVpLnZhbHVlKCkiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHJpbnQgdDVpLnZhbHVlKCkgKHRpbWVvdXQpIiB9CisgICAgfQorfQorCisKK3Byb2MgZG9fdGVzdHMge30geworICAgIGdsb2JhbCBwcm1zX2lkCisgICAgZ2xvYmFsIGJ1Z19pZAorICAgIGdsb2JhbCBzdWJkaXIKKyAgICBnbG9iYWwgb2JqZGlyCisgICAgZ2xvYmFsIHNyY2RpcgorICAgIGdsb2JhbCBiaW5maWxlCisgICAgZ2xvYmFsIHByb21wdAorICAgIGdsb2JhbCBzdXBwb3J0c190ZW1wbGF0ZV9kZWJ1Z2dpbmcKKworICAgIHNldCBwcm1zX2lkIDAKKyAgICBzZXQgYnVnX2lkIDAKKworICAgICMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworICAgIGdkYl9leGl0CisgICAgZ2RiX3N0YXJ0CisgICAgZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisgICAgZ2RiX2xvYWQgJGJpbmZpbGUKKworICAgIHNvdXJjZSAke2JpbmZpbGV9LmNpCisKKyAgICBpZiB7ICEkc3VwcG9ydHNfdGVtcGxhdGVfZGVidWdnaW5nIH0geworCXdhcm5pbmcgImNvbXBpbGVyIGxhY2tzIGRlYnVnZ2luZyBpbmZvIGZvciB0ZW1wbGF0ZXM7IHRlc3RzIHN1cHByZXNzZWQuIiAwCisJcmV0dXJuCisgICAgfQorCisgICAgdGVzdF9wdHlwZV9vZl90ZW1wbGF0ZXMKKyAgICB0ZXN0X3RlbXBsYXRlX2JyZWFrcG9pbnRzCisKKyAgICBpZiBbIHJ1bnRvX21haW4gXSB7CisJdGVzdF90ZW1wbGF0ZV9jYWxscworICAgIH0KK30KKworZG9fdGVzdHMKKworCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICRiaW5maWxlCisKKyMgc2V0IGl0IHVwIGF0IGEgYnJlYWtwb2ludCBzbyB3ZSBjYW4gcGxheSB3aXRoIHRoZSB2YXJpYWJsZSB2YWx1ZXMKKyMKK2lmICFbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgcGVycm9yICJjb3VsZG4ndCBydW4gdG8gYnJlYWtwb2ludCIKKyAgICBjb250aW51ZQorfQorCitzZW5kX2dkYiAicHJpbnQgZmludFxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgIlxcJFxbMC05XF0qID0gXFx7eCA9IDAsIHQgPSAwXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgZmludCIgfQorICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHJpbnQgZmludCIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHJpbnQgZmludCIgfQorfQorCitzZW5kX2dkYiAicHJpbnQgZnZwY2hhclxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgIlxcJFxbMC05XF0qID0gXFx7eCA9IDAsIHQgPSAweDBcXH1cclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBmdnBjaGFyIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwcmludCBmdnBjaGFyIiB9CisgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBmdnBjaGFyIiB9Cit9CisKKyMgVGVtcGxhdGUgRm9vPFQ+CisKK3NlbmRfZ2RiICJwdHlwZSBGb29cbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJ0eXBlID0gdGVtcGxhdGUgPChjbGFzcyB8KVQ+IChjbGFzcyB8KUZvbyBcXHtcclxuXFsgXHRcXSpwdWJsaWM6XHJcblxbIFx0XF0qaW50IHg7XHJcblxbIFx0XF0qVCB0O1xyXG5cXH1cclxudGVtcGxhdGUgaW5zdGFudGlhdGlvbnM6XHJcblxbIFx0XF0qKGNsYXNzIHwpRm9vPHZvbGF0aWxlIGNoYXIgXFwqPlxyXG5cWyBcdFxdKihjbGFzcyB8KUZvbzxjaGFyPlxyXG5cWyBcdFxdKihjbGFzcyB8KUZvbzxpbnQ+XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgRm9vIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwdHlwZSBGb28iIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIEZvbyIgfQorfQorCisjIHB0eXBlIEZvbzxpbnQ+CisKK3NlbmRfZ2RiICJwdHlwZSBmaW50XG4iICAgCitnZGJfZXhwZWN0IHsgICAKKyAgIC1yZSAidHlwZSA9IChjbGFzcyB8KUZvbzxpbnQ+IFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSppbnQgeDtcclxuXFsgXHRcXSppbnQgdDtcclxuXHJcblxbIFx0XF0qaW50IGZvb1xcKGludCwgaW50XFwpO1xyXG5cXH1cclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwdHlwZSBmaW50IiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwdHlwZSBmaW50IiB9CisgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBmaW50IiB9Cit9CisKKyMgcHR5cGUgRm9vPGNoYXI+CisKK3NlbmRfZ2RiICJwdHlwZSBmY2hhclxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgInR5cGUgPSAoY2xhc3MgfClGb288Y2hhcj4gXFx7XHJcblxbIFx0XF0qcHVibGljOlxyXG5cWyBcdFxdKmludCB4O1xyXG5cWyBcdFxdKmNoYXIgdDtcclxuXHJcblxbIFx0XF0qY2hhciBmb29cXChpbnQsIGNoYXJcXCk7XHJcblxcfVxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIGZjaGFyIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwdHlwZSBmY2hhciIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgZmNoYXIiIH0KK30KKworIyBwdHlwZSBGb288dm9sYXRpbGUgY2hhciAqPgorCitzZW5kX2dkYiAicHR5cGUgZnZwY2hhclxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgInR5cGUgPSAoY2xhc3MgfClGb288dm9sYXRpbGUgY2hhciBcXCo+IFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSppbnQgeDtcclxuXFsgXHRcXSp2b2xhdGlsZSBjaGFyIFxcKnQ7XHJcblxyXG5cWyBcdFxdKnZvbGF0aWxlIGNoYXIgXFwqIGZvb1xcKGludCwgdm9sYXRpbGUgY2hhciBcXCpcXCk7XHJcblxcfVxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIGZ2cGNoYXIiIH0KKyAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgInB0eXBlIGZ2cGNoYXIiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIGZ2cGNoYXIiIH0KK30KKworIyBwcmludCBhIGZ1bmN0aW9uIGZyb20gRm9vPHZvbGF0aWxlIGNoYXIgKj4KKworc2VuZF9nZGIgInByaW50IEZvbzx2b2xhdGlsZSBjaGFyICo+Ojpmb29cbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJcXCRcWzAtOVxdKiA9IFxce3ZvbGF0aWxlIGNoYXIgXFwqXFwoKGNsYXNzIHwpRm9vPHZvbGF0aWxlIGNoYXIgXFwqPiBcXCosIGludCwgdm9sYXRpbGUgY2hhciBcXCpcXClcXH0gJGhleCA8Rm9vPHZvbGF0aWxlIGNoYXIgXFwqPjo6Zm9vXFwoaW50LCB2b2xhdGlsZSBjaGFyIFxcKlxcKT5cclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBGb288dm9sYXRpbGUgY2hhciAqPjo6Zm9vIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwcmludCBGb288dm9sYXRpbGUgY2hhciAqPjo6Zm9vIiB9CisgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwcmludCBGb288dm9sYXRpbGUgY2hhciAqPjo6Zm9vIiB9Cit9CisKKyMgVGVtcGxhdGUgQmFyPFQsIGludD4KKworc2VuZF9nZGIgInB0eXBlIEJhclxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgInR5cGUgPSB0ZW1wbGF0ZSA8KGNsYXNzIHwpVCwgKGNsYXNzIHwpc3o+IChjbGFzcyB8KUJhciBcXHtcclxuXFsgXHRcXSpwdWJsaWM6XHJcblxbIFx0XF0qaW50IHg7XHJcblxbIFx0XF0qVCB0O1xyXG5cXH1cclxudGVtcGxhdGUgaW5zdGFudGlhdGlvbnM6XHJcblxbIFx0XF0qKGNsYXNzIHwpQmFyPGludCwxPlxyXG5cWyBcdFxdKihjbGFzcyB8KUJhcjxpbnQsMzM+XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgQmFyIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwdHlwZSBCYXIiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIEJhciIgfQorfQorCisKKyMgcHR5cGUgQmFyPGludCwzMz4KKworc2VuZF9nZGIgInB0eXBlIGJpbnRcbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJ0eXBlID0gKGNsYXNzIHwpQmFyPGludCwzMz4gXFx7XHJcblxbIFx0XF0qcHVibGljOlxyXG5cWyBcdFxdKmludCB4O1xyXG5cWyBcdFxdKmludCB0O1xyXG5cclxuXFsgXHRcXSppbnQgYmFyXFwoaW50LCBpbnRcXCk7XHJcblxcfVxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIGJpbnQiIH0KKyAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgInB0eXBlIGJpbnQiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIGJpbnQiIH0KK30KKworIyBwdHlwZSBCYXI8aW50LCAoND4zKT4KKworc2VuZF9nZGIgInB0eXBlIGJpbnQyXG4iICAgCitnZGJfZXhwZWN0IHsgICAKKyAgIC1yZSAidHlwZSA9IChjbGFzcyB8KUJhcjxpbnQsMT4gXFx7XHJcblxbIFx0XF0qcHVibGljOlxyXG5cWyBcdFxdKmludCB4O1xyXG5cWyBcdFxdKmludCB0O1xyXG5cclxuXFsgXHRcXSppbnQgYmFyXFwoaW50LCBpbnRcXCk7XHJcblxcfVxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIGJpbnQyIiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwdHlwZSBiaW50MiIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgYmludDIiIH0KK30KKworIyBUZW1wbGF0ZSBCYXo8VCwgY2hhcj4KKworc2VuZF9nZGIgInB0eXBlIEJhelxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgInR5cGUgPSB0ZW1wbGF0ZSA8KGNsYXNzIHwpVCwgKGNsYXNzIHwpc3o+IChjbGFzcyB8KUJheiBcXHtcclxuXFsgXHRcXSpwdWJsaWM6XHJcblxbIFx0XF0qaW50IHg7XHJcblxbIFx0XF0qVCB0O1xyXG5cXH1cclxudGVtcGxhdGUgaW5zdGFudGlhdGlvbnM6XHJcblxbIFx0XF0qKGNsYXNzIHwpQmF6PGNoYXIsOTc+XHJcblxbIFx0XF0qKGNsYXNzIHwpQmF6PGludCwxMTU+XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgQmF6IiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwdHlwZSBCYXoiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIEJheiIgfQorfQorCisKKyMgcHR5cGUgQmF6PGludCwgJ3MnPgorCitzZW5kX2dkYiAicHR5cGUgYmF6aW50XG4iICAgCitnZGJfZXhwZWN0IHsgICAKKyAgIC1yZSAidHlwZSA9IChjbGFzcyB8KUJhejxpbnQsMTE1PiBcXHtcclxuXFsgXHRcXSpwdWJsaWM6XHJcblxbIFx0XF0qaW50IHg7XHJcblxbIFx0XF0qaW50IHQ7XHJcblxyXG5cWyBcdFxdKmludCBiYXpcXChpbnQsIGludFxcKTtcclxuXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgYmF6aW50IiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwdHlwZSBiYXppbnQiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIGJhemludCIgfQorfQorCisjIHB0eXBlIEJhejxjaGFyLCAnYSc+CisKK3NlbmRfZ2RiICJwdHlwZSBiYXppbnQyXG4iICAgCitnZGJfZXhwZWN0IHsgICAKKyAgIC1yZSAidHlwZSA9IChjbGFzcyB8KUJhejxjaGFyLDk3PiBcXHtcclxuXFsgXHRcXSpwdWJsaWM6XHJcblxbIFx0XF0qaW50IHg7XHJcblxbIFx0XF0qY2hhciB0O1xyXG5cclxuXFsgXHRcXSpjaGFyIGJhelxcKGludCwgY2hhclxcKTtcclxuXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgYmF6aW50MiIgfQorICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHR5cGUgYmF6aW50MiIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgYmF6aW50MiIgfQorfQorCisjIFRlbXBsYXRlIFF1eDxULCBpbnQgKCpmKShpbnQpID4KKworc2VuZF9nZGIgInB0eXBlIFF1eFxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgInR5cGUgPSB0ZW1wbGF0ZSA8KGNsYXNzIHwpVCwgKGNsYXNzIHwpc3o+IChjbGFzcyB8KVF1eCBcXHtcclxuXFsgXHRcXSpwdWJsaWM6XHJcblxbIFx0XF0qaW50IHg7XHJcblxbIFx0XF0qVCB0O1xyXG5cXH1cclxudGVtcGxhdGUgaW5zdGFudGlhdGlvbnM6XHJcblxbIFx0XF0qKGNsYXNzIHwpUXV4PGludCwmc3RyaW5nPlxyXG5cWyBcdFxdKihjbGFzcyB8KVF1eDxjaGFyLCZzdHJpbmc+XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgUXV4IiB9CisgICAtcmUgIiRnZGJfcHJvbXB0ICQiICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICJwdHlwZSBRdXgiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIFF1eCIgfQorfQorCisjIHB0IFF1eDxpbnQsJnN0cmluZz4KKworc2VuZF9nZGIgInB0eXBlIHF1eGludFxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgInR5cGUgPSBjbGFzcyBRdXg8aW50LCZzdHJpbmc+IFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSppbnQgeDtcclxuXFsgXHRcXSppbnQgdDtcclxuXHJcblxbIFx0XF0qaW50IHF1eFxcKGludCwgaW50XFwpO1xyXG5cXH1cclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwdHlwZSBxdXhpbnQiIH0KKyAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgInB0eXBlIHF1eGludCIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgcXV4aW50IiB9Cit9CisKKyMgcHQgUXV4PGNoYXIsMD4KKworc2VuZF9nZGIgInB0eXBlIHF1eGludDJcbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJ0eXBlID0gY2xhc3MgUXV4PGNoYXIsJnN0cmluZz4gXFx7XHJcblxbIFx0XF0qcHVibGljOlxyXG5cWyBcdFxdKmludCB4O1xyXG5cWyBcdFxdKmNoYXIgdDtcclxuXHJcblxbIFx0XF0qY2hhciBxdXhcXChpbnQsIGNoYXJcXCk7XHJcblxcfVxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInB0eXBlIHF1eGludDIiIH0KKyAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgInB0eXBlIHF1eGludDIiIH0KKyAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiKHRpbWVvdXQpIHB0eXBlIHF1eGludDIiIH0KK30KKworIyBUZW1wbGF0ZSBTcGVjPFQxLCBUMj4KKworc2VuZF9nZGIgInB0eXBlIFNwZWNcbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJ0eXBlID0gdGVtcGxhdGUgPChjbGFzcyB8KVQxLCAoY2xhc3MgfClUMj4gKGNsYXNzIHwpU3BlYyBcXHtcclxuXFsgXHRcXSpwdWJsaWM6XHJcblxbIFx0XF0qaW50IHg7XHJcblxcfVxyXG50ZW1wbGF0ZSBpbnN0YW50aWF0aW9uczpcclxuXFsgXHRcXSooY2xhc3MgfClTcGVjPGludCxpbnQgXFwqPlxyXG5cWyBcdFxdKihjbGFzcyB8KVNwZWM8aW50LGNoYXI+XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgU3BlYyIgfQorICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHR5cGUgU3BlYyIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgU3BlYyIgfQorfQorCisjIHB0IFNwZWM8Y2hhciwwPgorCitzZW5kX2dkYiAicHR5cGUgc2lpcFxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgInR5cGUgPSBjbGFzcyBTcGVjPGludCxpbnQgXFwqPiBcXHtcclxuXFsgXHRcXSpwdWJsaWM6XHJcblxbIFx0XF0qaW50IHg7XHJcblxyXG5cWyBcdFxdKmludCBzcGVjXFwoaW50IFxcKlxcKTtcclxuXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgc2lpcCIgfQorICAgLXJlICIkZ2RiX3Byb21wdCAkIiAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAicHR5cGUgc2lpcCIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgc2lpcCIgfQorfQorCisjIHB0IEdhcnBseTxpbnQ+CisKK3NlbmRfZ2RiICJwdHlwZSBHYXJwbHk8aW50PlxuIiAgIAorZ2RiX2V4cGVjdCB7ICAgCisgICAtcmUgInR5cGUgPSBjbGFzcyBHYXJwbHk8aW50PiBcXHtcclxuXFsgXHRcXSpwdWJsaWM6XHJcblxbIFx0XF0qaW50IHg7XHJcblxbIFx0XF0qaW50IHQ7XHJcblxyXG5cWyBcdFxdKmludCBnYXJwbHlcXChpbnQsIGludFxcKTtcclxuXFx9XHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHR5cGUgR2FycGx5PGludD4iIH0KKyAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgInB0eXBlIEdhcnBseTxpbnQ+IiB9CisgICB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgIih0aW1lb3V0KSBwdHlwZSBHYXJwbHk8aW50PiIgfQorfQorCisjIHB0eXBlIG9mIG5lc3RlZCB0ZW1wbGF0ZSBuYW1lCisKK3NlbmRfZ2RiICJwdHlwZSBHYXJwbHk8R2FycGx5PGNoYXI+ID5cbiIgICAKK2dkYl9leHBlY3QgeyAgIAorICAgLXJlICJ0eXBlID0gKGNsYXNzIHwpR2FycGx5PEdhcnBseTxjaGFyPiA+IFxce1xyXG5cWyBcdFxdKnB1YmxpYzpcclxuXFsgXHRcXSppbnQgeDtcclxuXFsgXHRcXSooY2xhc3MgfClHYXJwbHk8Y2hhcj4gdDtcclxuXHJcblxbIFx0XF0qKGNsYXNzIHwpR2FycGx5PGNoYXI+IGdhcnBseVxcKGludCwgKGNsYXNzIHwpR2FycGx5PGNoYXI+XFwpO1xyXG5cXH1cclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwdHlwZSBHYXJwbHk8R2FycGx5PGNoYXI+ID4iIH0KKyAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgICB7IGZhaWwgInB0eXBlIEdhcnBseTxHYXJwbHk8Y2hhcj4gPiIgfQorICAgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmYWlsICIodGltZW91dCkgcHR5cGUgR2FycGx5PEdhcnBseTxjaGFyPiA+IiB9Cit9CisKKyMgcHJpbnQgb3V0IGEgZnVuY3Rpb24gZnJvbSBhIG5lc3RlZCB0ZW1wbGF0ZSBuYW1lCisKK3NlbmRfZ2RiICJwcmludCBHYXJwbHk8R2FycGx5PGNoYXI+ID46OmdhcnBseVxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIlxcJFxbMC05XF0qID0gXFx7KGNsYXNzIHwpR2FycGx5PGNoYXI+IFxcKChjbGFzcyB8KUdhcnBseTxHYXJwbHk8Y2hhcj4gPiBcXCosIGludCwgKGNsYXNzIHwpR2FycGx5PGNoYXI+XFwpXFx9ICRoZXggPEdhcnBseTxHYXJwbHk8Y2hhcj4+OjpnYXJwbHlcXChpbnQsIChjbGFzcyB8KUdhcnBseTxjaGFyPlxcKT5cclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBHYXJwbHk8R2FycGx5PGNoYXI+ID46OmdhcnBseSIgfQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgR2FycGx5PEdhcnBseTxjaGFyPiA+OjpnYXJwbHkiIH0KKyAgIHRpbWVvdXQgeyBmYWlsICJwcmludCBHYXJwbHk8R2FycGx5PGNoYXI+ID46OmdhcnBseSAodGltZW91dCkiIH0KK30KKworIyBVTkZPUlRVTkFURUxZLCAiYnJlYWsgR2FycGx5PEdhcnBseTxjaGFyPiA+OjpnYXJwbHkiIGRvZXNuJ3QgeWV0IHdvcmsuCisKKyNzZW5kX2dkYiAiYnJlYWsgR2FycGx5PEdhcnBseTxjaGFyPiA+OjpnYXJwbHkKKyNnZGJfZXhwZWN0IHsKKyMgICAtcmUgIkJyZWFrcG9pbnQgXFswLTlcXSogYXQgJGhleDogZmlsZSAuKnRlbXBsYXRlcy5jYywgbGluZS4qXHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAiYnJlYWsgR2FycGx5PEdhcnBseTxjaGFyPiA+OjpnYXJwbHkiIH0KKyMgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJicmVhayBHYXJwbHk8R2FycGx5PGNoYXI+ID46OmdhcnBseSIgfQorIyAgIHRpbWVvdXQgeyBmYWlsICJicmVhayBHYXJwbHk8R2FycGx5PGNoYXI+ID46OmdhcnBseSAodGltZW91dCkiIH0KKyN9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC90aHItbGliLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC90aHItbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVjZDE2OAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3Roci1saWIuYwpAQCAtMCwwICsxLDc5IEBACisvKiBUaHJlYWQgbG9jYWwgaW4gYSBsaWJyYXJ5LgorKi8KKyNpbmNsdWRlICJ0aHItbGliLmgiCisvKgorICogICAgICNkZWZpbmUgTlRIUkVBRFMgICAgNAorICogICAgICNkZWZpbmUgTlVNX0VMRU1TICAxMgorICovCisKK2V4dGVybiB2b2lkKiBhZGRlciggdm9pZCAqICk7CisKK3B0aHJlYWRfbXV0ZXhfdCBtdXRleDsgLyogbXV0ZXggZm9yIHByb3RlY3RpbmcgZ2xvYmFsIGRhdGEgdG90YWwgKi8KKworaW50IG51bWJlcnNbTlVNX0VMRU1TXSA9IHs1LCA0LCAzLCAyLCAxLCA2LCA3LCA4LCA5LCAxMCwgMTIsIDExfTsKK2ludCB0b3RhbCA9IDA7CisKK2ludCBkZWJ1Z2dlcl9zYXdbTlRIUkVBRFNdW0VMRU1TX1BFUl9USFJFQURdOyAvKiBbNF1bM10gKi8KK2ludCB0aGVfY29kZV9zYXdbTlRIUkVBRFNdW0VMRU1TX1BFUl9USFJFQURdOworCitpbnQgZ2V0X251bWJlcihpKQoraW50IGk7Cit7CisgICAvKiBzbGVlcCB0byBmb3JjZSBjb250ZXh0IHN3aXRjaCB0byBhbm90aGVyIHRocmVhZCBpbiBub24tTVAgc3lzdGVtIAorICAgICogc28gdGhhdCBUTFMgc3ltYm9scyBhcmUgdXNlZCBieSBtdWx0aXBsZSB0aHJlYWRzIGNvbmN1cnJlbnRseQorICAgICogaW4gc29tZSB3YXkuIAorICAgICovCisgICBzbGVlcCgxKTsgCisgICByZXR1cm4gbnVtYmVyc1tpXTsKK30KKworbWFpbigpCit7CisgICBwdGhyZWFkX3QJdGhyZWFkW05USFJFQURTXTsKKyAgIHZvaWQgCSpzdGF0dXM7CisgICBpbnQgCQlpLCBqLCByZXQ7CisKKyAgIHByaW50ZigiPT0gVGhyZWFkOiBUZXN0IHN0YXJ0ZWRcbiIpOworCisgICBmb3IoIGkgPSAwOyBpIDwgTlRIUkVBRFM7IGkrKyApIHsKKyAgICAgICBmb3IoIGogPSAwOyBqIDwgRUxFTVNfUEVSX1RIUkVBRDsgaisrICkgeworICAgICAgICAgICBkZWJ1Z2dlcl9zYXdbaV1bal0gPSAwOworICAgICAgICAgICB0aGVfY29kZV9zYXdbaV1bal0gPSAwOworICAgICAgIH0KKyAgIH0KKyAgIAorICAgcmV0ID0gcHRocmVhZF9tdXRleF9pbml0KCZtdXRleCwgTlVMTCk7CisgICBpZiAocmV0ICE9IDApIHsKKyAgICAgIHByaW50ZigiPT0gVGhyZWFkOiBwdGhyZWFkX211dGV4X2luaXQoKSBlcnJvcjogJWRcbiIsIHJldCk7CisgICAgICBleGl0KDEpOworICAgfQorCisgICBmb3IgKGk9MDsgaSA8IE5USFJFQURTOyBpKyspIHsKKyAgICAgIHJldCA9IHB0aHJlYWRfY3JlYXRlKCAmdGhyZWFkW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgaSk7CisgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgIHByaW50ZigiPT0gVGhyZWFkOiBwdGhyZWFkX2NyZWF0ZSgpIGVycm9yOiAlZFxuIiwgcmV0KTsKKyAgICAgICAgIGV4aXQoMSk7CisgICAgICB9CisgICAgICBwcmludGYoIj09IFRocmVhZDogdGhyZWFkICVkIGNyZWF0ZWRcbiIsIGkpOworICAgfQorICAgCisgICBmb3IgKGk9MDsgaSA8IE5USFJFQURTOyBpKyspIHsKKyAgICAgIHB0aHJlYWRfam9pbiggdGhyZWFkW2ldLCAmc3RhdHVzKTsKKyAgIH0KKworICAgcHJpbnRmKCI9PSBUaHJlYWQ6IHRvdGFsID0gJWRcbiIsIHRvdGFsKTsgLyogRXhwZWN0ICI3OCIgKi8KKworICAgZm9yKCBpID0gMDsgaSA8IE5USFJFQURTOyBpKysgKSB7CisgICAgICAgZm9yKCBqID0gMDsgaiA8IEVMRU1TX1BFUl9USFJFQUQ7IGorKyApIHsKKyAgICAgICAgICAgcHJpbnRmKCAiPT0gVGhyZWFkOiB0aGUgZGVidWdnZXIgc2F3ICVkLCB0aGUgcHJvZ3JhbSBzYXcgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgZGVidWdnZXJfc2F3W2ldW2pdLAorICAgICAgICAgICAgICAgICAgIHRoZV9jb2RlX3Nhd1tpXVtqXSApOworICAgICAgIH0KKyAgIH0KKworICAgcHJpbnRmKCI9PSBUaHJlYWQ6IFRlc3QgZW5kZWRcbiIpOworICAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3Roci1saWIuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvdGhyLWxpYi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiZjQ2NgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3Roci1saWIuZXhwCkBAIC0wLDAgKzEsMjM0IEBACisjIHRoci1saWIuZXhwIC0tIEV4cGVjdCBzY3JpcHQgdG8gdGVzdCB0aHJlYWQtbG9jYWwgc3RvcmFnZSBpbiBsaWIKKyMgQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgdXNlIHRoaXMgdG8gZGVidWc6CisjCisjbG9nX3VzZXIgMQorCisjIFRocmVhZCBzdHVmZiBpcyBfc2xvd187IHByZXBhcmUgZm9yIGxvbmcgd2FpdHMuCisjCisjIEZ1cnRoZXIsIHRoaXMgdGVzdCBoYXMgc29tZSAibnVsbCIgbGluZXMgZGVzaWduZWQKKyMgdG8gY29uc3VtZSBvdXRwdXQgZnJvbSBnZGIgdGhhdCB3YXMgdG9vIGxhdGUgdG8gYmUKKyMgbWF0Y2hlZCAoc2VxdWVuY2UgaXMgImdkYl90ZXN0IiBzZW5kczsgdGltZW91dCBhbmQKKyMgb24gdG8gbmV4dCBzZW5kOyByZXN1bHQgZmluYWxseSBjb21lcyBpbjsgbWlzbWF0Y2gpLgorIworIyBUaGUgbnVsbCBjb21tYW5kIGlzICdnZGJfdGVzdCAicCBcJHBjIiAiLioiICIiJworIyBOT1RFOiB0aGlzIGNvbW1hbmQgdW5kb2VzIGFueSB1cC9kb3duIHN0dWZmIQorIworcHJvYyBwcmVfdGltZW91dCB7fSB7CisgICAgZ2xvYmFsIHRpbWVvdXQKKworICAgIHNldCB0aW1lb3V0IFtleHByICIkdGltZW91dCArIDEwMCJdCit9CisKK3Byb2MgcG9zdF90aW1lb3V0IHt9IHsKKyAgICBnbG9iYWwgdGltZW91dAorICAgIGdsb2JhbCBvbGR0aW1lb3V0CisKKyAgICBzZXQgdGltZW91dCAkb2xkdGltZW91dAorICAgIGdkYl90ZXN0ICJwIFwkcGMiICIuKiIgIiIKK30KKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKK2lmIHsgIVtpc3RhcmdldCAiaHBwYSotKi1ocHV4MTAuMzAiXSAmJiAhW2lzdGFyZ2V0ICJocHBhKi0qLWhwdXgxMS4qIl0gfSB7CisgICAgdmVyYm9zZSAiSFBVWCB0aHJlYWQgdGVzdCBpZ25vcmVkIGZvciBub24taHBwYSBvciBwcmUtSFAvVVgtMTAuMzAgdGFyZ2V0cy4iCisgICAgcmV0dXJuIDAKK30KKworc2V0IHRlc3RmaWxlIHRoci1saWIKK3NldCBzcmNmaWxlICR7c3JjZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0uYworc2V0IGxpYnNyYyAgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfWxpYi5jCitzZXQgbWFpbm9iaiAke29iamRpcn0vJHt0ZXN0ZmlsZX0ubworc2V0IGxpYm9iaiAgJHtvYmpkaXJ9LyR7dGVzdGZpbGV9bGliLm8KK3NldCBsaWJzbCAgICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX1saWIuc2wKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworIyBUbyBidWlsZCB0aGUgZXhlY3V0YWJsZSB3ZSBuZWVkIHRvIGRvIHRoaXM6CisjCisjICAgY2MgLWMgLUFhIC1nIC1EX0hQVVhfU09VUkNFIC1EX1JFRU5UUkFOVCArREExLjAgLi9nZGIuaHAvdGhyLWxpYi5jCisjICAgY2MgLWMgLUFhIC1nIC1EX0hQVVhfU09VUkNFIC1EX1JFRU5UUkFOVCArREExLjAgK3ogLi9nZGIuaHAvdGhyLWxpYmxpYi5jCisjICAgbGQgLW8gdGhyZWFkX2xvY2FsX2luX2xpYi5saWIuc2wgLWIgLi9nZGIuaHAvdGhyLWxpYmxpYi5vCisjICAgbGQgLWEgYXJjaGl2ZSAvb3B0L2xhbmd0b29scy9saWIvY3J0MC5vIC9vcHQvbGFuZ3Rvb2xzL2xpYi9lbmQubyBcCisjICAgPiB0aHItbGliLm8gLi9nZGIuaHAvdGhyLWxpYmxpYi5zbCBcCisjICAgPiAtbyB0aHItbGliIC1scHRocmVhZCAtbGMKKyMKK3JlbW90ZV9leGVjIGJ1aWxkICAiJENDICR7c3JjZmlsZX0gLWMgLUFhIC1nIC1EX0hQVVhfU09VUkNFIC1EX1JFRU5UUkFOVCArREExLjAiCityZW1vdGVfZXhlYyBidWlsZCAgIiRDQyAke2xpYnNyY30gIC1jIC1BYSAtZyAtRF9IUFVYX1NPVVJDRSAtRF9SRUVOVFJBTlQgK0RBMS4wICt6IgorcmVtb3RlX2V4ZWMgYnVpbGQgImxkIC1vICR7bGlic2x9IC1iICR7bGlib2JqfSIKK3JlbW90ZV9leGVjIGJ1aWxkICJsZCAtYSBhcmNoaXZlIC9vcHQvbGFuZ3Rvb2xzL2xpYi9jcnQwLm8gL29wdC9sYW5ndG9vbHMvbGliL2VuZC5vICR7bWFpbm9ian0gJHtsaWJzbH0gLWxwdGhyZWFkIC1sYyAtbyAke2JpbmZpbGV9IgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKworc2V0IG9sZHRpbWVvdXQgJHRpbWVvdXQKKyNzZXQgdGltZW91dCBbZXhwciAiJHRpbWVvdXQgKyAyMDAiXQorc2V0IG9sZHZlcmJvc2UgJHZlcmJvc2UKKworZ2RiX2xvYWQgJHtiaW5maWxlfQorCisjIEhlcmUgd2UgZ286IHRlc3QgdmFyaW91cyB0aGluZ3MuCisjCitnZGJfdGVzdCAiYiBhZGRlciIgIi4qQ2Fubm90IGJyZWFrIG9uIGFkZGVyIHdpdGhvdXQgYSBydW5uaW5nIHByb2dyYW0uKiIgInNoYXJlZCBsb2MsIG5lZWRzIHRvIHJ1biIKK2dkYl90ZXN0ICJiIG1haW4iICIuKiIgIiIKK2dkYl90ZXN0ICJydW4iICAgICIuKkJyZWFrcG9pbnQgMSwgbWFpbi4qIiAiIgorCisjIFNldCBhIGJwIHRvIGluc3BlY3QgdGhlIHJlc3VsdHMKKyMKK2dkYl90ZXN0ICJiIDY3IiAiLipCcmVha3BvaW50IDIuKiIgIiIKKworIyBnZXQgdG8gYSBwb2ludCB3aGVyZSB3ZSBjYW4gc2V0IHRoZSBjb2xsZWN0aW9uIGJyZWFrcG9pbnQuCisjCitnZGJfdGVzdCAidGIgYWRkZXIiICIuKkJyZWFrcG9pbnQgMy4qbGluZSA0Ny4qIiAgInNldCBicCBpbiBzaGFyZWQgbGliIgorZ2RiX3Rlc3QgImMiICAgICAgICIuKlN3aXRjaGVkIHRvLiphZGRlci4qIiAgICAgInJ1biB0byBzaGFyZWQgbGliIHJ0biIKKworIyBDaGVjayBsb2NhdGlvbnMgb2YgdGhpbmdzCisjCitnZGJfdGVzdCAiaSBhZCBzdW0iICIuKlN5bWJvbCBcInN1bVwiIGlzIGEgdGhyZWFkLWxvY2FsIHZhcmlhYmxlLipvZmZzZXQuKmZyb20gdGhlIHRocmVhZCBiYXNlIHJlZ2lzdGVyIG1wc2Z1X2hpZ2guKiIgImZpbmQgc3VtIgorZ2RiX3Rlc3QgImkgYWRkIHgiICAgICAgIi4qU3ltYm9sIFwieFwiIGlzIGEgdGhyZWFkLWxvY2FsIHZhcmlhYmxlLioiICAiZmluZCB4IgorCisjIFNldCBhIGJyZWFrcG9pbnQgbGF0ZXIgb24gaW4gImFkZGVyIiBhbmQKKyMgY29sbGVjdCB0aGUgdGhyZWFkIGxvY2FsJ3MgdmFsdWUuICAKKyMKK2dkYl90ZXN0ICJiIDYxIiAiLipCcmVha3BvaW50IDQuKjYxLioiICAgIlNldCBjb2xsZWN0aW9uIGJwIgorCisjIGV4dHJhIGNoZWNrIGZvciBncmlucywgZXhwZWN0IHRvIGhpdCAiYWRkZXIiIGluIHRocmVhZCAyIGZpcnN0CisjIGJ1dCBjb3VsZCBiZSB3cm9uZy4uLgorIworZ2RiX3Rlc3QgImluZm8gdGhyZWFkIiAiLipcXFwqIDIuKnRocmVhZC4qdGhyZWFkLioiICJ0d28gdGhyZWFkcyIKKworIyBDYW4ndCB1c2UgImdkYl90ZXN0IiwgYXMgaXQgdXNlcyAiJGdkYl9wcm9tcHQgJCIgaW4KKyMgdGVzdGluZyB0aGUgcmVzdWx0LiAgT3VyIG5ldyBwcm9tcHQgaXMgIj4iLCB3aXRoCisjIG5vIHRyYWlsaW5nIHNwYWNlLCBzbyB3ZSBjYW4ndCBkbyB0aGlzIGp1c3QgYnkKKyMgY2hhbmdpbmcgInByb21wdCIuIAorIworIyBBbnl3YXksIEkgY291bGRuJ3QgZ2V0IGV4cGVjdCB0byBzZWUgdGhlICI+IiBwcm9tcHQsCisjIGR1cmluZyB0aGUgY29tbWFuZCBhZGRpdGlvbiwgc28gSSBqdXN0IHB1bnRlZC4KKyMgX1lvdV8gYXJlIHdlbGNvbWUgdG8gdHJ5LCBpZiB5b3Ugd2FudCEKKyMKK3NlbmRfZ2RiICJjb21tYW5kcyA0XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIiguKlR5cGUgY29tbWFuZHMuKlwiZW5kXCJcLlxyXG5cPikiIHsKKyAgICAgICAgcGFzcyAic3RhcnQgY29tbWFuZHMiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIGZhaWwgInN0YXJ0IGNvbW1hbmRzIgorICAgIH0KK30KKworIyBBc3N1bWUgd2UncmUgaW4gY29tbWFuZHMtaW5wdXQgbW9kZS4gIChTZWxmLWRlYnVnIHN0dWZmIHR1cm5lZCBvZmYpCisjCitzZW5kX2dkYiAic2lsZW50XG4iCisjc2VuZF9nZGIgInAgaWRcbiIKKyNzZW5kX2dkYiAicCBqXG4iCisjc2VuZF9nZGIgInAgeFxbalxdXG4iCitzZW5kX2dkYiAic2V0IGRlYnVnZ2VyX3Nhd1xbaWRcXVxbalxdID0geFxbalxdXG4iCitzZW5kX2dkYiAiY29udGludWVcbiIKK3NlbmRfZ2RiICJlbmRcbiIKKworZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKnNldC4qY29udC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJhZGQgY29tbWFuZHMiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIGZhaWwgImFkZCBjb21tYW5kcyIKKyAgICB9Cit9CisKKyMgQ2hlY2sgb3V0IG9mIHBhcmFub2lhLgorIworc2VuZF9nZGIgImluZm8gYnJlYWsgNFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKmJyZWFrcG9pbnQuKnNldCBkZWJ1Z2dlcl9zYXcuKmNvbnRpbnVlLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgIkNvbW1hbmRzIGFkZGVkIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBmYWlsICJDb21tYW5kcyBub3QgYWRkZWQuIgorICAgIH0KK30KKworIyBXZSBub3cgZXhwZWN0IHRvIHJ1biB0aHJvdWdoIHRoZSB3aG9sZSBhcHBsaWNhdGlvbgorIyBTaW5jZSB0aGlzJ2xsIHJ1biBmb3Igd2hpbGUsIHNldCBhIGdlbmVyb3VzIHRpbWVvdXQuCisjCitzZXQgdGltZW91dCBbZXhwciAiJHRpbWVvdXQgKyAzMCJdCitzZW5kX2dkYiAiY1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKlByb2dyYW0gZXhpdGVkIG5vcm1hbGx5LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIGZhaWwgInByb2dyYW0gcnVuYXdheSIKKyAgICB9CisgICAgLXJlICIuKkJyZWFrcG9pbnQgMi4qNjcuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAiZ2V0IHRvIGVuZCIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAiTm8gcHJvZ3Jlc3M/IgorICAgIH0KKyAgICB0aW1lb3V0IHsgZmFpbCAidGltZW91dCIgfQorfQorc2V0IHRpbWVvdXQgJG9sZHRpbWVvdXQKKworZ2RiX3Rlc3QgInAgZGVidWdnZXJfc2F3IiAiLio1LCAxLCA5Lio0LCA2LCAxMC4qMywgNywgMTIuKjIsIDgsIDExLioiICJjaGVjayByZXN1bHRzIgorCisjIE9mdGVuIG9ubHkgb25lIG1pc3NlczsgbGV0J3MgZ2V0IGRldGFpbGVkIQorIworZ2RiX3Rlc3QgInAgZGVidWdnZXJfc2F3XFswXF1cWzBcXSIgIi4qPSA1LioiICIxIgorZ2RiX3Rlc3QgInAgZGVidWdnZXJfc2F3XFswXF1cWzFcXSIgIi4qPSAxLioiICIyIgorZ2RiX3Rlc3QgInAgZGVidWdnZXJfc2F3XFswXF1cWzJcXSIgIi4qPSA5LioiICIzIgorZ2RiX3Rlc3QgInAgZGVidWdnZXJfc2F3XFsxXF1cWzBcXSIgIi4qPSA0LioiICI0IgorZ2RiX3Rlc3QgInAgZGVidWdnZXJfc2F3XFsxXF1cWzFcXSIgIi4qPSA2LioiICI1IgorZ2RiX3Rlc3QgInAgZGVidWdnZXJfc2F3XFsxXF1cWzJcXSIgIi4qPSAxMC4qIiAiNiIKK2dkYl90ZXN0ICJwIGRlYnVnZ2VyX3Nhd1xbMlxdXFswXF0iICIuKj0gMy4qIiAiNyIKK2dkYl90ZXN0ICJwIGRlYnVnZ2VyX3Nhd1xbMlxdXFsxXF0iICIuKj0gNy4qIiAiOCIKK2dkYl90ZXN0ICJwIGRlYnVnZ2VyX3Nhd1xbMlxdXFsyXF0iICIuKj0gMTIuKiIgIjkiCitnZGJfdGVzdCAicCBkZWJ1Z2dlcl9zYXdcWzNcXVxbMFxdIiAiLio9IDIuKiIgIjEwIgorZ2RiX3Rlc3QgInAgZGVidWdnZXJfc2F3XFszXF1cWzFcXSIgIi4qPSA4LioiICIxMSIKK2dkYl90ZXN0ICJwIGRlYnVnZ2VyX3Nhd1xbM1xdXFsyXF0iICIuKj0gMTEuKiIgIjEyIgorCitzZW5kX2dkYiAiaSB0aFxuIiAKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLiogMS4qc3lzdGVtIHRocmVhZC4qIDIuKnN5c3RlbSB0aHJlYWQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAiVG9vIG1hbnkgdGhyZWFkcyBsZWZ0IgorICAgIH0KKyAgICAtcmUgIi4qXFxcKiAxLipzeXN0ZW0gdGhyZWFkLiptYWluLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgIkV4cGVjdCBvbmx5IGJhc2UgdGhyZWFkIgorICAgIH0KKyAgICAtcmUgIi4qTm8gc3RhY2suKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAicnVuYXdheSIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAiSHVuaD8iCisgICAgfQorICAgIHRpbWVvdXQgeyBmYWlsICJ0aW1lb3V0IiB9Cit9CisKK2dkYl90ZXN0ICJjIiAiLipleGl0ZWQgbm9ybWFsbHkuKiIgInJ1biB0byBjb21wbGV0aW9uIgorCisjIERvbmUhCisjCitnZGJfZXhpdAorCitzZXQgdGltZW91dCAkb2xkdGltZW91dAorc2V0IHZlcmJvc2UgJG9sZHZlcmJvc2UKKworIyBleGVjdXRlX2FueXdoZXJlICJybSAtZiAke2JpbmZpbGV9IgorIworcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3Roci1saWIuaCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3Roci1saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTM5NWRmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvdGhyLWxpYi5oCkBAIC0wLDAgKzEsNyBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjZGVmaW5lIE5USFJFQURTIAkgNAorI2RlZmluZSBOVU1fRUxFTVMJMTIKKworI2RlZmluZSBFTEVNU19QRVJfVEhSRUFEIChOVU1fRUxFTVMvTlRIUkVBRFMpCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC90aHItbGlibGliLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC90aHItbGlibGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlZmZjYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3Roci1saWJsaWIuYwpAQCAtMCwwICsxLDkyIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyogTGlicmFyeSBjb2RlIGZvciB0aHJlYWQgbG9jYWwgaW4gbGliIHRlc3QuCisqLworI2luY2x1ZGUgInRoci1saWIuaCIKKworZXh0ZXJuIHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsKK2V4dGVybiBpbnQgZ2V0X251bWJlcigpOworZXh0ZXJuIGludCB0b3RhbDsKK2V4dGVybiBpbnQgdGhlX2NvZGVfc2F3W05USFJFQURTXVtFTEVNU19QRVJfVEhSRUFEXTsKKworLyogVGhlIGRlYnVnZ2VyIHNob3VsZCBzZWUgdGhpcyB3aXRob3V0IGEgZGVjbGFyYXRpb24uCisgKgorICogZXh0ZXJuIGludCBkZWJ1Z2dlcl9zYXdbTlRIUkVBRFNdW0VMRU1TX1BFUl9USFJFQURdOyAKKyAqLworCisvKiBUaGUgYWN0dWFsIHRocmVhZCBsb2NhbHMuCisgKi8KK19fdGhyZWFkIGludCBzdW07CitfX3RocmVhZCBpbnQgeFsgRUxFTVNfUEVSX1RIUkVBRCBdOyAvKiBbM10gKi8KKwordm9pZCBzdW11cCgpCit7CisgICBpbnQgajsKKworICAgc3VtID0gMDsKKyAgIGZvciAoaiA9IDA7IGogPCBFTEVNU19QRVJfVEhSRUFEOyBqKyspIHsKKyAgICAgIHN1bSArPSB4W2pdOworICAgfQorCisgICBpZiggc3VtID09IHhbMF0gKQorICAgICAgIC8qIEl0IHdvbid0IGJlICI9PSIsIGJ1dCB0aGlzIGxldHMgdXMgc2V0IGEgYnJlYWtwb2ludAorICAgICAgICAqIGFuZCBsb29rIGF0IHRoZSB0aHJlYWQtbG9jYWwgc3RvcmFnZS4KKyAgICAgICAgKi8KKyAgICAgICBzdW0rKzsKKworICAgeFswXSA9IHhbMl07ICAvKiBBbm90aGVyIG5vLW9wIGZvciBkZWJ1Z2dlciB1c2UgKi8KK30KKwordm9pZCAqYWRkZXIoIHZpZCApCisgICB2b2lkICogdmlkOworeworICAgaW50IGlkOworICAgaW50IGksIGo7CisgICBpbnQgcmV0OworCisgICBpZCA9IChpbnQpIHZpZDsKKyAgIAorICAgLyogcHJpbnRmKCAiPT0gVGhyZWFkOiBXZWxjb21lIHRvIGFkZGVyICVkXG4iLCBpZCApOyAqLworCisgICBmb3IgKGogPSAwOyBqIDwgRUxFTVNfUEVSX1RIUkVBRDsgaisrKSB7CisgICAgICB4W2pdID0gMDsKKyAgIH0KKworICAgZm9yIChpID0gaWQsIGogPSAwOyBpIDwgTlVNX0VMRU1TOyBpICs9IE5USFJFQURTLCBqKysgKSB7CisKKyAgIC8qICAgcHJpbnRmKCAiPT0gVGhyZWFkOiBpZCAlZCwgaSAlZCwgaiAlZFxuIiwgaWQsIGksIGogKTsKKyAgICAgIGZmbHVzaCggc3Rkb3V0ICk7ICovCisgICAgCisgICAgICB4W2pdID0gZ2V0X251bWJlcihpKTsgLyogezAsMSwyLDN9ICswLCArNCwgKzggKi8KKworICAgICAgLyogUmVjb3JkIGZvciBwb3N0ZXJpdHk7IHRoZSBkZWJ1Z2dlciB3aWxsIGdhdGhlcgorICAgICAgICogdGhlIHNhbWUgZGF0YSBoZXJlLCB1c2luZyAieFtqXSIuCisgICAgICAgKi8KKyAgICAgIHRoZV9jb2RlX3Nhd1sgaWQgXVsgaiBdID0geFtqXTsgICAKKworICAgLyogICBwcmludGYoICI9PSBUaHJlYWQgJWQsIHNhbXBsZSAlZCwgdmFsICVkLCBpICVkXG4iLCBpZCwgaiwgeFtqXSxpICk7CisgICAgICBmZmx1c2goIHN0ZG91dCApOyAqLworICAgfQorCisgICBzdW11cCgpOworICAgLyogcHJpbnRmKCI9PSBUaHJlYWQ6IGFkZGVyICVkIGNvbnRyaWJ1dGVzIHRvdGFsICVkXG4iLCBpZCwgc3VtKTsgKi8KKworICAgLyogcHJvdGVjdCBnbG9iYWwgZGF0YSAqLworICAgcmV0ID0gcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CisgICBpZiAocmV0ICE9IDApIHsKKyAgICAgIHByaW50ZigiPT0gVGhyZWFkOiBwdGhyZWFkX211dGV4X2xvY2soKSBlcnJvcjogJWRcbiIsIHJldCk7CisgICAgICBleGl0KDEpOworICAgfQorCisgICB0b3RhbCArPSBzdW07CisKKyAgIHJldCA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7CisgICBpZiAocmV0ICE9IDApIHsKKyAgICAgIHByaW50ZigiPT0gVGhyZWFkOiBwdGhyZWFkX211dGV4X3VubG9jaygpIGVycm9yOiAlZFxuIiwgcmV0KTsKKyAgICAgIGV4aXQoMSk7CisgICB9CisKKyAgIGlmKCBOVEhSRUFEUyAhPSA0IHx8IEVMRU1TX1BFUl9USFJFQUQgIT0gMyB8fCBOVU1fRUxFTVMgIT0gMTIgKSB7CisgICAgICBwcmludGYoICIqKiBFUlJPUiBpbiB0ZXN0IGNvZGUgKipcbiIgKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3Roci1zdGcuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvdGhyLXN0Zy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkNjllZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3Roci1zdGcuZXhwCkBAIC0wLDAgKzEsMjU1IEBACisjIHRocmVhZF9sb2NhbF9zdGcuZXhwIC0tIEV4cGVjdCBzY3JpcHQgdG8gdGVzdCB0aHJlYWQtbG9jYWwgc3RvcmFnZQorIyBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyB1c2UgdGhpcyB0byBkZWJ1ZzoKKyMKKyNsb2dfdXNlciAxCisKKyMgVGhyZWFkIHN0dWZmIGlzIF9zbG93XzsgcHJlcGFyZSBmb3IgbG9uZyB3YWl0cy4KKyMKKyMgRnVydGhlciwgdGhpcyB0ZXN0IGhhcyBzb21lICJudWxsIiBsaW5lcyBkZXNpZ25lZAorIyB0byBjb25zdW1lIG91dHB1dCBmcm9tIGdkYiB0aGF0IHdhcyB0b28gbGF0ZSB0byBiZQorIyBtYXRjaGVkIChzZXF1ZW5jZSBpcyAiZ2RiX3Rlc3QiIHNlbmRzOyB0aW1lb3V0IGFuZAorIyBvbiB0byBuZXh0IHNlbmQ7IHJlc3VsdCBmaW5hbGx5IGNvbWVzIGluOyBtaXNtYXRjaCkuCisjCisjIFRoZSBudWxsIGNvbW1hbmQgaXMgJ2dkYl90ZXN0ICJwIFwkcGMiICIuKiIgIiInCisjIE5PVEU6IHRoaXMgY29tbWFuZCB1bmRvZXMgYW55IHVwL2Rvd24gc3R1ZmYhCisjCitwcm9jIHByZV90aW1lb3V0IHt9IHsKKyAgICBnbG9iYWwgdGltZW91dAorCisgICAgc2V0IHRpbWVvdXQgW2V4cHIgIiR0aW1lb3V0ICsgMTAwIl0KK30KKworcHJvYyBwb3N0X3RpbWVvdXQge30geworICAgIGdsb2JhbCB0aW1lb3V0CisgICAgZ2xvYmFsIG9sZHRpbWVvdXQKKworICAgIHNldCB0aW1lb3V0ICRvbGR0aW1lb3V0CisgICAgZ2RiX3Rlc3QgInAgXCRwYyIgIi4qIiAiIgorfQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworaWYgeyAhW2lzdGFyZ2V0ICJocHBhKi0qLWhwdXgxMC4zMCJdICYmICFbaXN0YXJnZXQgImhwcGEqLSotaHB1eDExLioiXSB9IHsKKyAgICB2ZXJib3NlICJIUFVYIHRocmVhZCB0ZXN0IGlnbm9yZWQgZm9yIG5vbi1ocHBhIG9yIHByZS1IUC9VWC0xMC4zMCB0YXJnZXRzLiIKKyAgICByZXR1cm4gMAorfQorCitzZXQgdGVzdGZpbGUgc3RhcnQtc3RvcAorc2V0IHNyY2ZpbGUgJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfS5jCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9XSB7CisgICAgcmV0dXJuIC0xCit9CisKKyMgVG8gYnVpbGQgdGhlIGV4ZWN1dGFibGUgd2UgbmVlZCB0byBsaW5rIGFnYWluc3QgdGhlIHRocmVhZCBsaWJyYXJ5LgorIworIyAgICAgY2MgLUFlIC1nIC1vIHN0YXJ0X3N0b3AgLWxwdGhyZWFkIHN0YXJ0X3N0b3AuYworIworI2NvbXBpbGUgIiR7c3JjZmlsZX0gLUFlIC1nIC1scHRocmVhZCAtbyAke2JpbmZpbGV9IgorCitpZiB7JGdjY19jb21waWxlZCA9PSAwfSB7CisgICAgc2V0IGFkZGl0aW9uYWxfZmxhZ3MgImFkZGl0aW9uYWxfZmxhZ3M9LUFlIgorfSBlbHNlIHsKKyAgICBzZXQgYWRkaXRpb25hbF9mbGFncyAiIgorfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0uYyIgIiR7YmluZmlsZX0ubyIgb2JqZWN0IFtsaXN0IGRlYnVnICRhZGRpdGlvbmFsX2ZsYWdzXV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorcmVtb3RlX2V4ZWMgYnVpbGQgImxkIC91c3IvY2NzL2xpYi9jcnQwLm8gJHtiaW5maWxlfS5vIC1sY2wgLWxwdGhyZWFkICAtbGMgL29wdC9sYW5ndG9vbHMvbGliL2VuZC5vIC1vICR7YmluZmlsZX0iCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCitnZGJfbG9hZCAke2JpbmZpbGV9CitpZiAhW3J1bnRvX21haW5dIHRoZW4geworICAgZmFpbCAiQ2FuJ3QgcnVuIHRvIG1haW4iCisgICByZXR1cm4gMAorfQorCitzZXQgb2xkdGltZW91dCAkdGltZW91dAorI3NldCB0aW1lb3V0IFtleHByICIkdGltZW91dCArIDIwMCJdCitzZXQgb2xkdmVyYm9zZSAkdmVyYm9zZQorI3NldCB2ZXJib3NlIDQwCisKK2dkYl90ZXN0ICJiIGRvX3Bhc3MiICIuKiIgICJzZXQgZG9fcGFzcyBicCIKK2dkYl90ZXN0ICJjIiAiLipkb19wYXNzLioiICJydW4gdG8gZG9fcGFzcyIKK2dkYl90ZXN0ICJjbGUiICIuKiIgIiIKKworIyBTZXQgYSBicmVha3BvaW50IGF0IHRoZSAic3BpbiIgcm91dGluZSBhbmQKKyMgY29sbGVjdCB0aGUgdGhyZWFkIGxvY2FsJ3MgdmFsdWUuICAKKyMKK2dkYl90ZXN0ICJiIDY3IiAiLipCcmVha3BvaW50IDMuKjY3LioiICAgIlNldCBicCIKKworIyBDYW4ndCB1c2UgImdkYl90ZXN0IiwgYXMgaXQgdXNlcyAiJGdkYl9wcm9tcHQgJCIgaW4KKyMgdGVzdGluZyB0aGUgcmVzdWx0LiAgT3VyIG5ldyBwcm9tcHQgaXMgIj4iLCB3aXRoCisjIG5vIHRyYWlsaW5nIHNwYWNlLCBzbyB3ZSBjYW4ndCBkbyB0aGlzIGp1c3QgYnkKKyMgY2hhbmdpbmcgInByb21wdCIuIAorIworIyBBbnl3YXksIEkgY291bGRuJ3QgZ2V0IGV4cGVjdCB0byBzZWUgdGhlICI+IiBwcm9tcHQsCisjIGR1cmluZyB0aGUgY29tbWFuZCBhZGRpdGlvbiwgc28gSSBqdXN0IHB1bnRlZC4KKyMgX1lvdV8gYXJlIHdlbGNvbWUgdG8gdHJ5LCBpZiB5b3Ugd2FudCEKKyMKK3NlbmRfZ2RiICJjb21tYW5kcyAzXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIiguKlR5cGUgY29tbWFuZHMuKlwiZW5kXCJcLlxyXG5cPikiIHsKKyAgICAgICAgcGFzcyAic3RhcnQgY29tbWFuZHMiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIGZhaWwgInN0YXJ0IGNvbW1hbmRzIgorICAgIH0KK30KKworIyBBc3N1bWUgd2UncmUgaW4gY29tbWFuZHMtaW5wdXQgbW9kZS4KKyMKK3NlbmRfZ2RiICJzaWxlbnRcbiIKK3NlbmRfZ2RiICJzZXQgdmFsX2RlYnVnZ2VyX3Nhd1xbbWVcXSA9IGFfdGhyZWFkX2xvY2FsXG4iCitzZW5kX2dkYiAiY29udGludWVcbiIKK3NlbmRfZ2RiICJlbmRcbiIKKworZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKnNldC4qY29udC4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBwYXNzICJhZGQgY29tbWFuZHMiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIGZhaWwgImFkZCBjb21tYW5kcyIKKyAgICB9Cit9CisKKyMgQ2hlY2sgb3V0IG9mIHBhcmFub2lhLgorIworc2VuZF9nZGIgImluZm8gYnJlYWsgM1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIuKmJyZWFrcG9pbnQuKnNldCB2YWxfZGVidWdnZXIuKmNvbnRpbnVlLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgIkNvbW1hbmRzIGFkZGVkIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBmYWlsICJDb21tYW5kcyBub3QgYWRkZWQuIgorICAgIH0KK30KKworIyBTZXQgYSBicCB0byBpbnNwZWN0IHRoZSByZXN1bHRzCisjCitnZGJfdGVzdCAiYiAxMzQiICIuKkJyZWFrcG9pbnQgNC4qIiAiIgorCisjIFdlIG5vdyBleHBlY3QgdG8gcnVuIHRocm91Z2ggYSB3aG9sZSBwYXNzLCBzZWVpbmcgCisjIHNwZWNpZmljIHJlc3VsdHMgYXMgbm90ZWQgYmVsb3cgKGFjdHVhbCBnb3R0ZW4gYnkKKyMgcnVubmluZyBhcHBsaWNhdGlvbiB3aXRoIGRlYnVnZ2luZyBwcmludCBzdGF0ZW1lbnRzCisjIHR1cm5lZCBvbi4KKyMKKyMgU2luY2UgdGhpcydsbCBydW4gZm9yIHdoaWxlLCBzZXQgYSBnZW5lcm91cyB0aW1lb3V0LgorIworc2V0IHRpbWVvdXQgW2V4cHIgIiR0aW1lb3V0ICsgMzAiXQorc2VuZF9nZGIgImNcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiLipQcm9ncmFtIGV4aXRlZCBub3JtYWxseS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBmYWlsICJwcm9ncmFtIHJ1bmF3YXkiCisgICAgfQorICAgIC1yZSAiLipQYXNzIDAgZG9uZS4qUGFzcyAxIGRvbmUuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAicHJvZ3JhbSBydW5hd2F5IDIiCisgICAgfQorICAgIC1yZSAiLipQYXNzIDAgZG9uZS4qQnJlYWtwb2ludCA0LioxMzQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgcGFzcyAiZ2V0IHRvIGVuZCBvZiBmaXJzdCBwYXNzIgorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICBmYWlsICJObyBwcm9ncmVzcz8iCisgICAgfQorICAgIHRpbWVvdXQgeyBmYWlsICJ0aW1lb3V0IiB9Cit9CisKK2dkYl90ZXN0ICJwIHZhbF9kZWJ1Z2dlcl9zYXciICIuKjAsIDEsIDMuKiIgICAiZmlyc3QgcGFzcyIKKworc2VuZF9nZGIgImkgdGhcbiIgCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIi4qIDEuKnN5c3RlbSB0aHJlYWQuKiAyLipzeXN0ZW0gdGhyZWFkLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIGZhaWwgIlRvbyBtYW55IHRocmVhZHMgbGVmdCIKKyAgICB9CisgICAgLXJlICIuKlxcXCogMSBzeXN0ZW0gdGhyZWFkLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgIkV4cGVjdCBvbmx5IGJhc2UgdGhyZWFkIgorICAgIH0KKyAgICAtcmUgIi4qTm8gc3RhY2suKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAicnVuYXdheSIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgZmFpbCAiSHVuaD8iCisgICAgfQorICAgIHRpbWVvdXQgeyBmYWlsICJ0aW1lb3V0IiB9Cit9CisKK2dkYl90ZXN0ICJpIGIiICAiLio0LipicmVha3BvaW50LioxMzQuKmhpdC4qMSB0aW1lLioiICJFeHBlY3QgMTM0IGJwIHRvIGV4aXN0IgorCitnZGJfdGVzdCAiYyIgIi4qQnJlYWtwb2ludCA0LioxMzQuKiIgImdldCB0byBlbmQgb2Ygc2Vjb25kIHBhc3MiCitnZGJfdGVzdCAicCB2YWxfZGVidWdnZXJfc2F3IiAiLio2LCAxMCwgMTUuKiIgInNlY29uZCBwYXNzIgorCitnZGJfdGVzdCAiYyIgIi4qQnJlYWtwb2ludCA0LioxMzQuKiIgImdldCB0byBlbmQgb2YgdGhpcmQgcGFzcyIKK2dkYl90ZXN0ICJwIHZhbF9kZWJ1Z2dlcl9zYXciICIuKjIxLCAyOCwgMzYuKiIgInRoaXJkIHBhc3MiCisKK2dkYl90ZXN0ICJpbmZvIGJyZSAzIiAiLiphbHJlYWR5IGhpdCA5IHRpbWVzLioiICJjb3VudCBvZiBzaWxlbnQgYnAgaGl0cyIKKworIyBTdGFydCBvdmVyIGFuZCBkbyBzb21lICJpbmZvIGFkZHJlc3MiIHN0dWZmCisjCitzZW5kX2dkYiAiZFxuIgorZ2RiX2V4cGVjdCB7CisgICAtcmUgIi4qRGVsZXRlIGFsbCBicmVha3BvaW50cy4qJCIgeworICAgICAgIHNlbmRfZ2RiICJ5XG4iCisgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICBwYXNzICJkZWwgYnBzIgorICAgICAgICAgICB9CisgICAgICAgfQorICAgfQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAibm8gcXVlc3Rpb24iIH0KK30KKworZ2RiX3Rlc3QgImIgc3BpbiIgIi4qQnJlYWtwb2ludCA1LioiICIiCisKK3NlbmRfZ2RiICJyXG4iCitnZGJfZXhwZWN0IHsKKyAgIC1yZSAiLipTdGFydCBpdCBmcm9tIHRoZSBiZWdpbm5pbmcuKiQiIHsKKyAgICAgICBzZW5kX2dkYiAieVxuIgorICAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJyZXN0YXJ0IiB9CisgICAgICAgfQorICAgfQorICAgLXJlICIuKlN0YXJ0aW5nIHByb2dyYW0uKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICBwYXNzICJyZXN0YXJ0IGFmdGVyIHByZXZpb3VzIGZhaWxzIgorICAgfQorICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAiQ2FuJ3QgcmVzdGFydCIgfQorfQorZ2RiX3Rlc3QgImkgYWQgYV9nbG9iYWwiICIuKmFfZ2xvYmFsLipzdGF0aWMgc3RvcmFnZSBhdCBhZGRyZXNzLioiICJpIGFkIGFfZ2xvYmFsIgorZ2RiX3Rlc3QgImkgYWRkIG1lIiAgICAgICIuKm1lLipsb2NhbCB2YXJpYWJsZSBhdCBmcmFtZSBvZmZzZXQuKiIgICJpIGFkIG1lIgorZ2RiX3Rlc3QgImkgYWQgYV90aHJlYWRfbG9jYWwiICIuKmFfdGhyZWFkX2xvY2FsLiphIHRocmVhZC1sb2NhbCB2YXJpYWJsZSBhdCBvZmZzZXQuKiIgImkgYWQgYV90aHJlYWRfbG9jYWwiCisKKyMgRG9uZSEKKyMKK2dkYl9leGl0CisKK3NldCB0aW1lb3V0ICRvbGR0aW1lb3V0CitzZXQgdmVyYm9zZSAkb2xkdmVyYm9zZQorCisjIGV4ZWN1dGVfYW55d2hlcmUgInJtIC1mICR7YmluZmlsZX0iCisjCityZXR1cm4gMApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvdmZvcmtlZC1wcm9ncmFtLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC92Zm9ya2VkLXByb2dyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmM2Y2QyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvdmZvcmtlZC1wcm9ncmFtLmMKQEAgLTAsMCArMSw2IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKworbWFpbigpCit7CisgIHByaW50ZigiSGVsbG8gZnJvbSB2Zm9ya2VkX3Byb2dyYW0uLi5cbiIpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvdmlydGZ1bi1ocC5jYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3ZpcnRmdW4taHAuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1MmE2MgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3ZpcnRmdW4taHAuY2MKQEAgLTAsMCArMSwxOTIgQEAKKy8vIFBscyB0cnkgdGhlIGZvbGxvd2luZyBwcm9ncmFtIG9uIHZpcnR1YWwgZnVuY3Rpb25zIGFuZCB0cnkgdG8gZG8gcHJpbnQgb24KKy8vICBtb3N0IG9mIHRoZSBjb2RlIGluIG1haW4oKS4gIEFsbW9zdCBub25lIG9mIHRoZW0gd29ya3MgIQorCisvLworLy8gVGhlIGluaGVyaXRhbmNlIHN0cnVjdHVyZSBpczoKKy8vCisvLyBWIDogVkEgVkIKKy8vIEEgOiAoVikKKy8vIEIgOiBBCisvLyBEIDogQUQgKFYpCisvLyBDIDogKFYpCisvLyBFIDogQiAoVikgRCBDCisvLworCitjbGFzcyBWQSAKK3sKK3B1YmxpYzoKKyAgICBpbnQgdmE7Cit9OworCitjbGFzcyBWQgoreworcHVibGljOgorICAgIGludCB2YjsKKyAgICBpbnQgZnZiKCk7CisgICAgdmlydHVhbCB2dmIoKTsKK307CisKK2NsYXNzIFYgOiBwdWJsaWMgVkEsIHB1YmxpYyBWQgoreworcHVibGljOgorICAgIGludCBmKCk7CisgICAgdmlydHVhbCB2digpOworICAgIGludCB3OworfTsKKworY2xhc3MgQSA6IHZpcnR1YWwgcHVibGljIFYKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGludCBmKCk7Citwcml2YXRlOgorICAgIGludCBhOworfTsKKworY2xhc3MgQiA6IHB1YmxpYyBBCit7CitwdWJsaWM6CisgICAgaW50IGYoKTsKK3ByaXZhdGU6CisgICAgaW50IGI7Cit9OworCitjbGFzcyBDIDogcHVibGljIHZpcnR1YWwgVgoreworcHVibGljOgorICAgIGludCBjOworfTsKKworY2xhc3MgQUQKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGludCB2ZygpID0gMDsKK307CisKK2NsYXNzIEQgOiBwdWJsaWMgQUQsIHZpcnR1YWwgcHVibGljIFYKK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgdm9pZCBzKCk7CisgICAgdmlydHVhbCBpbnQgdmcoKTsKKyAgICB2aXJ0dWFsIGludCB2ZCgpOworICAgIGludCBmZCgpOworICAgIGludCBkOworfTsKKworY2xhc3MgRSA6IHB1YmxpYyBCLCB2aXJ0dWFsIHB1YmxpYyBWLCBwdWJsaWMgRCwgcHVibGljIEMKK3sKK3B1YmxpYzoKKyAgICBpbnQgZigpOworICAgIGludCB2ZygpOworICAgIGludCB2digpOworICAgIGludCBlOworfTsKKworRCAgIGRkOworRCogIHBwZCA9ICZkZDsKK0FEKiBwQWQgPSAmZGQ7CisKK0EgICBhOworQiAgIGI7CitDICAgYzsKK0QgICBkOworRSAgIGU7CitWICAgdjsKK1ZCICB2YjsKKworCitBKiAJcEFhCT0gCSZhOworQSoJcEFlCT0JJmU7CisKK0IqCXBCZQk9CSZlOworCitEKglwRGQJPQkmZDsKK0QqCXBEZQk9CSZlOworCitWKglwVmEJPQkmYTsKK1YqCXBWdgk9CSZ2OworVioJcFZlCT0JJmU7CitWKiAgICAgcFZkCT0JJmQ7CisKK0FEKglwQURlCT0JJmU7CisKK0UqCXBFZQk9CSZlOworCitWQiogICAgIHBWQgk9CSZ2YjsKKwordm9pZCBpbml0KCkKK3sKKwlhLnZiID0gMTsKKwliLnZiID0gMjsKKwljLnZiID0gMzsKKwlkLnZiID0gNDsKKwllLnZiID0gNTsKKwl2LnZiID0gNjsKKwl2Yi52YiA9IDc7CisKKwlkLmQJPSAxOworCWUuZAk9ICAyOworfQorCitleHRlcm4gIkMiIHByaW50Zihjb25zdCBjaGFyICosIC4uLik7CisKK2ludCBhbGxfY291bnQgPSAwOworaW50IGZhaWxlZF9jb3VudCA9IDA7CisKKyNkZWZpbmUgVEVTVChFWFBSLCBFWFBFQ1RFRCkgXAorICAgcmV0ID0gRVhQUjsgXAorICAgaWYgKHJldCAhPSBFWFBFQ1RFRCkge1wKKyAgICAgIHByaW50ZigiRmFpbGVkICVzIGlzICVkLCBzaG91bGQgYmUgJWQhXG4iLCAjRVhQUiwgcmV0LCBFWFBFQ1RFRCk7IFwKKyAgICAgIGZhaWxlZF9jb3VudCsrOyB9IFwKKyAgIGFsbF9jb3VudCsrOworCitpbnQgcmV0OworCit2b2lkIHRlc3RfY2FsbHMoKQoreworCVRFU1QocEFlLT5mKCksIDIwKTsKKwlURVNUKHBBYS0+ZigpLCAxKTsKKworCVRFU1QocERlLT52ZygpLCAyMDIpOworCVRFU1QocEFEZS0+dmcoKSwgMjAyKTsKKwlURVNUKHBEZC0+dmcoKSwgMTAxKTsKKworCVRFU1QocEVlLT52dmIoKSwgNDExKTsKKworCVRFU1QocFZCLT52dmIoKSwgNDA3KTsKKworCVRFU1QocEJlLT52dmIoKSwgNDExKTsKKwlURVNUKHBEZS0+dnZiKCksIDQxMSk7CisKKyAgICAgICAgVEVTVChwRWUtPnZkKCksIDI4Mik7CisgICAgICAgIFRFU1QocEVlLT5mdmIoKSwgMzExKTsKKyAgICAKKyAgICAgICAgVEVTVChwRWUtPkQ6OnZnKCksIDEwMik7CisJcHJpbnRmKCJEaWQgJWQgdGVzdHMsIG9mIHdoaWNoICVkIGZhaWxlZC5cbiIsIGFsbF9jb3VudCwgZmFpbGVkX2NvdW50KTsKK30KKworaW50IG1haW4oKQoreworCisgICAgaW5pdCgpOworCisgICAgZS53ID0gNzsKKyAgICBlLnZiID0gMTE7CisKKyAgICB0ZXN0X2NhbGxzKCk7CisgICAgcmV0dXJuIDA7CisgICAgCit9CisKK2ludCBBOjpmKCkge3JldHVybiAxO30KK2ludCBCOjpmKCkge3JldHVybiAyO30KK3ZvaWQgRDo6cygpIHt9CitpbnQgRTo6ZigpIHtyZXR1cm4gMjA7fQoraW50IEQ6OnZnKCkge3JldHVybiAxMDArZDt9CitpbnQgRTo6dmcoKSB7cmV0dXJuIDIwMCtkO30KK2ludCBWOjpmKCkge3JldHVybiA2MDArdzt9CitpbnQgVjo6dnYoKSB7cmV0dXJuIDQwMCt3O30KK2ludCBFOjp2digpIHtyZXR1cm4gNDUwK3c7fQoraW50IEQ6OmZkKCkge3JldHVybiAyNTArZDt9CitpbnQgRDo6dmQoKSB7cmV0dXJuIDI4MCtkO30KK2ludCBWQjo6ZnZiKCkge3JldHVybiAzMDArdmI7fQoraW50IFZCOjp2dmIoKSB7cmV0dXJuIDQwMCt2Yjt9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC92aXJ0ZnVuLWhwLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3ZpcnRmdW4taHAuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YjM2MzcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC92aXJ0ZnVuLWhwLmV4cApAQCAtMCwwICsxLDc3MyBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEZyZWQgRmlzaC4gKGZuZkBjeWdudXMuY29tKQorCitzZXQgd3MgIlxbXHJcblx0IFxdKyIKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCB0ZXN0ZmlsZSAidmlydGZ1bi1ocCIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmNjCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisKK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9ICJjKysiXSB7CisgICAgcmV0dXJuIC0xOworfQorIAorIAoraWYge1tza2lwX2hwX3Rlc3RzICRnY2NfY29tcGlsZWRdfSB0aGVuIHsgY29udGludWUgfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIGV4ZWN1dGFibGUge2RlYnVnIGMrK31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworCitwcm9jIGdkYl92aXJ0ZnVuY19pbml0IHt9IHsKKyAgICBnbG9iYWwgc3JjZGlyIHN1YmRpciBiaW5maWxlCisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIGdkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorICAgIGdkYl9sb2FkICRiaW5maWxlCisKKyAgICBzZW5kX2dkYiAic2V0IGxhbmd1YWdlIGMrK1xuIgorICAgIGdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIgorICAgIHNlbmRfZ2RiICJzZXQgd2lkdGggMFxuIgorICAgIGdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIgorfQorCitwcm9jIGdkYl92aXJ0ZnVuY19yZXN0YXJ0IHt9IHsKKyAgICBnZGJfZXhpdDsKKyAgICBnZGJfc3RhcnQ7CisgICAgZ2RiX3ZpcnRmdW5jX2luaXQ7CisgICAgcnVudG8gJ3Rlc3RfY2FsbHModm9pZCknOworfQorCisjCisjICBUZXN0IHByaW50aW5nIG9mIHRoZSB0eXBlcyBvZiB2YXJpb3VzIGNsYXNzZXMuCisjCisKK3Byb2MgdGVzdF9wdHlwZV9vZl9jbGFzc2VzIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCB3cworCisgICAgIyBUaGlzIHVzZWQgdG8gYmUgYSBmYWlsIGlmIGl0IHByaW50ZWQgInN0cnVjdCIgbm90ICJjbGFzcyIuICBCdXQKKyAgICAjIHNpbmNlIHRoaXMgc3RydWN0IGRvZXNuJ3QgdXNlIGFueSBzcGVjaWFsIEMrKyBmZWF0dXJlcywgaXQgaXMKKyAgICAjIGNvbnNpZGVyZWQgcmlnaHQgZm9yIEdEQiB0byBwcmludCBpdCBhcyAic3RydWN0Ii4KKyAgICBzZW5kX2dkYiAicHR5cGUgVkFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSAoc3RydWN0fGNsYXNzKSBWQSBceygke3dzfXB1YmxpYzp8KSR7d3N9aW50IHZhOyR7d3N9VkEgJiBvcGVyYXRvcj1cXChWQSBjb25zdCAmXFwpOyR7d3N9VkFcXChWQSBjb25zdCAmXFwpOyR7d3N9VkFcXCh2b2lkXFwpOyR7d3N9XH0uKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgVkEiCisJfQorCS1yZSAidHlwZSA9IChzdHJ1Y3R8Y2xhc3MpIFZBIFx7KCR7d3N9cHVibGljOnwpJHt3c31pbnQgdmE7KCgke3dzfVZBICYgb3BlcmF0b3I9XFwoVkEgY29uc3QgJlxcKTspfCgke3dzfVZBXFwoVkEgY29uc3QgJlxcKTspfCgke3dzfVZBXFwodm9pZFxcKTspKSoke3dzfVx9LiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIFZBIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgVkEiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBWQSAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBWQlxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIFZCIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgdmI7JHt3c31WQiAmIG9wZXJhdG9yPVxcKFZCIGNvbnN0ICZcXCk7JHt3c31WQlxcKFZCIGNvbnN0ICZcXCk7JHt3c31WQlxcKHZvaWRcXCk7JHt3c31pbnQgZnZiXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZ2YlxcKHZvaWRcXCk7JHt3c31cfS4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBWQiIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgVkIgXHske3dzfXB1YmxpYzoke3dzfWludCB2YjsoKCR7d3N9VkIgJiBvcGVyYXRvcj1cXChWQiBjb25zdCAmXFwpOyl8KCR7d3N9VkJcXChWQiBjb25zdCAmXFwpOyl8KCR7d3N9VkJcXCh2b2lkXFwpOyl8KCR7d3N9aW50IGZ2YlxcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2dmJcXCh2b2lkXFwpOykpKiR7d3N9XH0uKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgVkIgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBWQiIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIFZCICh0aW1lb3V0KSIKKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIFZcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBWIDogcHVibGljIFZBLCBwdWJsaWMgVkIgXHske3dzfXB1YmxpYzoke3dzfWludCB3OyR7d3N9ViAmIG9wZXJhdG9yPVxcKFYgY29uc3QgJlxcKTske3dzfVZcXChWIGNvbnN0ICZcXCk7JHt3c31WXFwodm9pZFxcKTske3dzfWludCBmXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZ2XFwodm9pZFxcKTske3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgViIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgViA6IHB1YmxpYyBWQSwgcHVibGljIFZCIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgdzsoKCR7d3N9ViAmIG9wZXJhdG9yPVxcKFYgY29uc3QgJlxcKTspfCgke3dzfVZcXChWIGNvbnN0ICZcXCk7KXwoJHt3c31WXFwodm9pZFxcKTspfCgke3dzfWludCBmXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZ2XFwodm9pZFxcKTspKSoke3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgViAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIFYiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBWICh0aW1lb3V0KSIKKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIEFcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJ0eXBlID0gY2xhc3MgQSA6IHB1YmxpYyB2aXJ0dWFsIFYgXHtcW1xyXG5cdCBcXStwcml2YXRlOlxbXHJcblx0IFxdK2ludCBhO1xbXHJcblx0IFxdK3B1YmxpYzpcW1xyXG5cdCBcXSt2aXJ0dWFsIGludCBmXFwodm9pZFxcKTtcW1xyXG5cdCBcXStcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBwYXNzICJwdHlwZSBBIChhQ0MpIgorICAgICAgICB9CisJLXJlICJ0eXBlID0gY2xhc3MgQSA6IHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192YlxbXFxcJFwuXF0rVjske3dzfWludCBhOyR7d3N9cHVibGljOiR7d3N9QSAmIG9wZXJhdG9yPVxcKEEgY29uc3QgJlxcKTske3dzfUFcXChpbnQsIEEgY29uc3QgJlxcKTske3dzfUFcXChpbnRcXCk7JHt3c312aXJ0dWFsIGludCBmXFwodm9pZFxcKTske3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgQSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgQSA6IHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192YlxbXFxcJFwuXF0rVjske3dzfWludCBhOyR7d3N9cHVibGljOigoJHt3c31BICYgb3BlcmF0b3I9XFwoQSBjb25zdCAmXFwpOyl8KCR7d3N9QVxcKGludCwgQSBjb25zdCAmXFwpOyl8KCR7d3N9QVxcKGludFxcKTspfCgke3dzfXZpcnR1YWwgaW50IGZcXCh2b2lkXFwpOykpKiR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBBIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgQSA6IHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5GT087JHt3c31pbnQgYTske3dzfXB1YmxpYzoke3dzfXZpcnR1YWwgaW50IGYudm9pZC47JHt3c31cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgICMgVGhpcyBoYXBwZW5zIGJlY2F1c2UgdGhlIHR5cGUgaXMgZGVmaW5lZCBvbmx5IGFmdGVyIGl0IGlzCisJICAgICMgdG9vIGxhdGUuCisJICAgIGZhaWwgInB0eXBlIEEgKGtub3duIGZhaWx1cmUgd2l0aCBnY2MgY3lnbnVzLTIuNC41LTkzMDQxNykiCisJICAgICMgTWFueSBvZiB0aGUgcmVzdCBvZiB0aGVzZSB0ZXN0cyBoYXZlIHRoZSBzYW1lIHByb2JsZW0uCisJICAgIHJldHVybiAwCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIEEiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBBICh0aW1lb3V0KSIKKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIEJcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBCIDogcHVibGljIEEgXHske3dzfXByaXZhdGU6JHt3c31pbnQgYjske3dzfXB1YmxpYzoke3dzfUIgJiBvcGVyYXRvcj1cXChCIGNvbnN0ICZcXCk7JHt3c31CXFwoaW50LCBCIGNvbnN0ICZcXCk7JHt3c31CXFwoaW50XFwpOyR7d3N9dmlydHVhbCBpbnQgZlxcKHZvaWRcXCk7JHt3c31cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIEIiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIEIgOiBwdWJsaWMgQSBceyR7d3N9cHJpdmF0ZToke3dzfWludCBiOyR7d3N9cHVibGljOigoJHt3c31CICYgb3BlcmF0b3I9XFwoQiBjb25zdCAmXFwpOyl8KCR7d3N9QlxcKGludCwgQiBjb25zdCAmXFwpOyl8KCR7d3N9QlxcKGludFxcKTspfCgke3dzfXZpcnR1YWwgaW50IGZcXCh2b2lkXFwpOykpKiR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBCIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgQiIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIEIgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgQ1xuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgInR5cGUgPSBjbGFzcyBDIDogcHVibGljIHZpcnR1YWwgViBce1xbXHJcblx0IFxdK3B1YmxpYzpcW1xyXG5cdCBcXStpbnQgYztcW1xyXG5cdCBcXStcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBwYXNzICJwdHlwZSBDIChhQ0MpIgorICAgICAgICB9CisJLXJlICJ0eXBlID0gY2xhc3MgQyA6IHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5WOyR7d3N9cHVibGljOiR7d3N9aW50IGM7JHt3c31DICYgb3BlcmF0b3I9XFwoQyBjb25zdCAmXFwpOyR7d3N9Q1xcKGludCwgQyBjb25zdCAmXFwpOyR7d3N9Q1xcKGludFxcKTske3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgQyIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgQyA6IHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5WOyR7d3N9cHVibGljOiR7d3N9aW50IGM7KCgke3dzfUMgJiBvcGVyYXRvcj1cXChDIGNvbnN0ICZcXCk7KXwoJHt3c31DXFwoaW50LCBDIGNvbnN0ICZcXCk7KXwoJHt3c31DXFwoaW50XFwpOykpKiR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBDIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgQyIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIEMgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgQURcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBBRCBceyR7d3N9cHVibGljOiR7d3N9QUQgJiBvcGVyYXRvcj1cXChBRCBjb25zdCAmXFwpOyR7d3N9QURcXChBRCBjb25zdCAmXFwpOyR7d3N9QURcXCh2b2lkXFwpOyR7d3N9dmlydHVhbCBpbnQgdmdcXCh2b2lkXFwpOyR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBBRCIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgQUQgXHske3dzfXB1YmxpYzooKCR7d3N9QUQgJiBvcGVyYXRvcj1cXChBRCBjb25zdCAmXFwpOyl8KCR7d3N9QURcXChBRCBjb25zdCAmXFwpOyl8KCR7d3N9QURcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdmdcXCh2b2lkXFwpOykpKiR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBBRCAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIEFEIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgQUQgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgRFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgInR5cGUgPSBjbGFzcyBEIDogcHVibGljIEFELCBwdWJsaWMgdmlydHVhbCBWIFx7XFtcclxuXHQgXF0rcHVibGljOlxbXHJcblx0IFxdK2ludCBkO1xbXHJcblx0IFxdK3N0YXRpYyB2b2lkIHNcXCh2b2lkXFwpO1xbXHJcblx0IFxdK3ZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTtcW1xyXG5cdCBcXSt2aXJ0dWFsIGludCB2ZFxcKHZvaWRcXCk7XFtcclxuXHQgXF0raW50IGZkXFwodm9pZFxcKTtcW1xyXG5cdCBcXStcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBwYXNzICJwdHlwZSBEIChhQ0MpIgorICAgICAgICB9CisJLXJlICJ0eXBlID0gY2xhc3MgRCA6IHB1YmxpYyBBRCwgcHVibGljIHZpcnR1YWwgViBceyR7d3N9cHJpdmF0ZToke3dzfVYgXFsqXF0rX3ZiLlY7JHt3c31wdWJsaWM6JHt3c31pbnQgZDske3dzfUQgJiBvcGVyYXRvcj1cXChEIGNvbnN0ICZcXCk7JHt3c31EXFwoaW50LCBEIGNvbnN0ICZcXCk7JHt3c31EXFwoaW50XFwpOyR7d3N9c3RhdGljIHZvaWQgc1xcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2ZFxcKHZvaWRcXCk7JHt3c31pbnQgZmRcXCh2b2lkXFwpOyR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBEIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBEIDogcHVibGljIEFELCBwdWJsaWMgdmlydHVhbCBWIFx7JHt3c31wcml2YXRlOiR7d3N9ViBcWypcXStfdmIuVjske3dzfXB1YmxpYzoke3dzfWludCBkOygoJHt3c31EICYgb3BlcmF0b3I9XFwoRCBjb25zdCAmXFwpOyl8KCR7d3N9RFxcKGludCwgRCBjb25zdCAmXFwpOyl8KCR7d3N9RFxcKGludFxcKTspfCgke3dzfXN0YXRpYyB2b2lkIHNcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdmdcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdmRcXCh2b2lkXFwpOyl8KCR7d3N9aW50IGZkXFwodm9pZFxcKTspKSoke3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgRCAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIEQiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBEICh0aW1lb3V0KSIKKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIEVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBFIDogcHVibGljIEIsIHB1YmxpYyB2aXJ0dWFsIFYsIHB1YmxpYyBELCBwdWJsaWMgQyBceyR7d3N9cHVibGljOiR7d3N9aW50IGU7JHt3c31FICYgb3BlcmF0b3I9XFwoRSBjb25zdCAmXFwpOyR7d3N9RVxcKGludCwgRSBjb25zdCAmXFwpOyR7d3N9RVxcKGludFxcKTske3dzfXZpcnR1YWwgaW50IGZcXCh2b2lkXFwpOyR7d3N9dmlydHVhbCBpbnQgdmdcXCh2b2lkXFwpOyR7d3N9dmlydHVhbCBpbnQgdnZcXCh2b2lkXFwpOyR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBFIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBFIDogcHVibGljIEIsIHB1YmxpYyB2aXJ0dWFsIFYsIHB1YmxpYyBELCBwdWJsaWMgQyBceyR7d3N9cHVibGljOiR7d3N9aW50IGU7KCgke3dzfUUgJiBvcGVyYXRvcj1cXChFIGNvbnN0ICZcXCk7KXwoJHt3c31FXFwoaW50LCBFIGNvbnN0ICZcXCk7KXwoJHt3c31FXFwoaW50XFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgZlxcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2dlxcKHZvaWRcXCk7KSkqJHt3c31cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIEUgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBFIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgRSAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBkZFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgInR5cGUgPSBjbGFzcyBEIDogcHVibGljIEFELCBwdWJsaWMgdmlydHVhbCBWIFx7XFtcclxuXHQgXF0rcHVibGljOlxbXHJcblx0IFxdK2ludCBkO1xbXHJcblx0IFxdK3N0YXRpYyB2b2lkIHNcXCh2b2lkXFwpO1xbXHJcblx0IFxdK3ZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTtcW1xyXG5cdCBcXSt2aXJ0dWFsIGludCB2ZFxcKHZvaWRcXCk7XFtcclxuXHQgXF0raW50IGZkXFwodm9pZFxcKTtcW1xyXG5cdCBcXStcfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBwYXNzICJwdHlwZSBkZCAoYUNDKSIKKyAgICAgICAgfQorCS1yZSAidHlwZSA9IGNsYXNzIEQgOiBwdWJsaWMgQUQsIHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5WOyR7d3N9cHVibGljOiR7d3N9aW50IGQ7JHt3c31EICYgb3BlcmF0b3I9XFwoRCBjb25zdCAmXFwpOyR7d3N9RFxcKGludCwgRCBjb25zdCAmXFwpOyR7d3N9RFxcKGludFxcKTske3dzfXN0YXRpYyB2b2lkIHNcXCh2b2lkXFwpOyR7d3N9dmlydHVhbCBpbnQgdmdcXCh2b2lkXFwpOyR7d3N9dmlydHVhbCBpbnQgdmRcXCh2b2lkXFwpOyR7d3N9aW50IGZkXFwodm9pZFxcKTske3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgZGQiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIEQgOiBwdWJsaWMgQUQsIHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5WOyR7d3N9cHVibGljOiR7d3N9aW50IGQ7KCgke3dzfUQgJiBvcGVyYXRvcj1cXChEIGNvbnN0ICZcXCk7KXwoJHt3c31EXFwoaW50LCBEIGNvbnN0ICZcXCk7KXwoJHt3c31EXFwoaW50XFwpOyl8KCR7d3N9c3RhdGljIHZvaWQgc1xcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2ZFxcKHZvaWRcXCk7KXwoJHt3c31pbnQgZmRcXCh2b2lkXFwpOykpKiR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBkZCAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIGRkIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgZGQgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgcHBkXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAidHlwZSA9IGNsYXNzIEQgOiBwdWJsaWMgQUQsIHB1YmxpYyB2aXJ0dWFsIFYgXHtcW1xyXG5cdCBcXStwdWJsaWM6XFtcclxuXHQgXF0raW50IGQ7XFtcclxuXHQgXF0rc3RhdGljIHZvaWQgc1xcKHZvaWRcXCk7XFtcclxuXHQgXF0rdmlydHVhbCBpbnQgdmdcXCh2b2lkXFwpO1xbXHJcblx0IFxdK3ZpcnR1YWwgaW50IHZkXFwodm9pZFxcKTtcW1xyXG5cdCBcXStpbnQgZmRcXCh2b2lkXFwpO1xbXHJcblx0IFxdK1x9IFxbKlxdK1xyXG4kZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBwYXNzICJwdHlwZSBwcGQgKGFDQykiCisgICAgICAgIH0KKwktcmUgInR5cGUgPSBjbGFzcyBEIDogcHVibGljIEFELCBwdWJsaWMgdmlydHVhbCBWIFx7JHt3c31wcml2YXRlOiR7d3N9ViBcWypcXStfdmIuVjske3dzfXB1YmxpYzoke3dzfWludCBkOyR7d3N9RCAmIG9wZXJhdG9yPVxcKEQgY29uc3QgJlxcKTske3dzfURcXChpbnQsIEQgY29uc3QgJlxcKTske3dzfURcXChpbnRcXCk7JHt3c31zdGF0aWMgdm9pZCBzXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZkXFwodm9pZFxcKTske3dzfWludCBmZFxcKHZvaWRcXCk7JHt3c31cfSBcWypcXStcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwcGQiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIEQgOiBwdWJsaWMgQUQsIHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5WOyR7d3N9cHVibGljOiR7d3N9aW50IGQ7KCgke3dzfUQgJiBvcGVyYXRvcj1cXChEIGNvbnN0ICZcXCk7KXwoJHt3c31EXFwoaW50LCBEIGNvbnN0ICZcXCk7KXwoJHt3c31EXFwoaW50XFwpOyl8KCR7d3N9c3RhdGljIHZvaWQgc1xcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2ZFxcKHZvaWRcXCk7KXwoJHt3c31pbnQgZmRcXCh2b2lkXFwpOykpKiR7d3N9XH0gXFsqXF0rXHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgcHBkIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgcHBkIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgcHBkICh0aW1lb3V0KSIKKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIHBBZFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIEFEIFx7JHt3c31wdWJsaWM6JHt3c31BRCAmIG9wZXJhdG9yPVxcKEFEIGNvbnN0ICZcXCk7JHt3c31BRFxcKEFEIGNvbnN0ICZcXCk7JHt3c31BRFxcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7JHt3c31cfSBcWypcXStcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwQWQiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIEFEIFx7JHt3c31wdWJsaWM6KCgke3dzfUFEICYgb3BlcmF0b3I9XFwoQUQgY29uc3QgJlxcKTspfCgke3dzfUFEXFwoQUQgY29uc3QgJlxcKTspfCgke3dzfUFEXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTspKSoke3dzfVx9IFxbKlxdK1xyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBBZCAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIHBBZCIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIHBBZCAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBhXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAidHlwZSA9IGNsYXNzIEEgOiBwdWJsaWMgdmlydHVhbCBWIFx7XFtcclxuXHQgXF0rcHJpdmF0ZTpcW1xyXG5cdCBcXStpbnQgYTtcW1xyXG5cdCBcXStwdWJsaWM6XFtcclxuXHQgXF0rdmlydHVhbCBpbnQgZlxcKHZvaWRcXCk7XFtcclxuXHQgXF0rXH1cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgcGFzcyAicHR5cGUgYSAoYUNDKSIKKyAgICAgICAgfQorCS1yZSAidHlwZSA9IGNsYXNzIEEgOiBwdWJsaWMgdmlydHVhbCBWIFx7JHt3c31wcml2YXRlOiR7d3N9ViBcWypcXStfdmIuVjske3dzfWludCBhOyR7d3N9cHVibGljOiR7d3N9QSAmIG9wZXJhdG9yPVxcKEEgY29uc3QgJlxcKTske3dzfUFcXChpbnQsIEEgY29uc3QgJlxcKTske3dzfUFcXChpbnRcXCk7JHt3c312aXJ0dWFsIGludCBmXFwodm9pZFxcKTske3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgYSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgQSA6IHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5WOyR7d3N9aW50IGE7JHt3c31wdWJsaWM6KCgke3dzfUEgJiBvcGVyYXRvcj1cXChBIGNvbnN0ICZcXCk7KXwoJHt3c31BXFwoaW50LCBBIGNvbnN0ICZcXCk7KXwoJHt3c31BXFwoaW50XFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgZlxcKHZvaWRcXCk7KSkqJHt3c31cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGEgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBhIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgYSAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBiXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgQiA6IHB1YmxpYyBBIFx7JHt3c31wcml2YXRlOiR7d3N9aW50IGI7JHt3c31wdWJsaWM6JHt3c31CICYgb3BlcmF0b3I9XFwoQiBjb25zdCAmXFwpOyR7d3N9QlxcKGludCwgQiBjb25zdCAmXFwpOyR7d3N9QlxcKGludFxcKTske3dzfXZpcnR1YWwgaW50IGZcXCh2b2lkXFwpOyR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBiIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBCIDogcHVibGljIEEgXHske3dzfXByaXZhdGU6JHt3c31pbnQgYjske3dzfXB1YmxpYzooKCR7d3N9QiAmIG9wZXJhdG9yPVxcKEIgY29uc3QgJlxcKTspfCgke3dzfUJcXChpbnQsIEIgY29uc3QgJlxcKTspfCgke3dzfUJcXChpbnRcXCk7KXwoJHt3c312aXJ0dWFsIGludCBmXFwodm9pZFxcKTspKSoke3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgYiAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIGIiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBiICh0aW1lb3V0KSIKKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIGNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJ0eXBlID0gY2xhc3MgQyA6IHB1YmxpYyB2aXJ0dWFsIFYgXHtcW1xyXG5cdCBcXStwdWJsaWM6XFtcclxuXHQgXF0raW50IGM7XFtcclxuXHQgXF0rXH1cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgcGFzcyAicHR5cGUgYyAoYUNDKSIKKyAgICAgICAgfQorCS1yZSAidHlwZSA9IGNsYXNzIEMgOiBwdWJsaWMgdmlydHVhbCBWIFx7JHt3c31wcml2YXRlOiR7d3N9ViBcWypcXStfdmIuVjske3dzfXB1YmxpYzoke3dzfWludCBjOyR7d3N9QyAmIG9wZXJhdG9yPVxcKEMgY29uc3QgJlxcKTske3dzfUNcXChpbnQsIEMgY29uc3QgJlxcKTske3dzfUNcXChpbnRcXCk7JHt3c31cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGMiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIEMgOiBwdWJsaWMgdmlydHVhbCBWIFx7JHt3c31wcml2YXRlOiR7d3N9ViBcWypcXStfdmIuVjske3dzfXB1YmxpYzoke3dzfWludCBjOygoJHt3c31DICYgb3BlcmF0b3I9XFwoQyBjb25zdCAmXFwpOyl8KCR7d3N9Q1xcKGludCwgQyBjb25zdCAmXFwpOyl8KCR7d3N9Q1xcKGludFxcKTspKSoke3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgYyAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIGMiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBjICh0aW1lb3V0KSIKKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIGRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJ0eXBlID0gY2xhc3MgRCA6IHB1YmxpYyBBRCwgcHVibGljIHZpcnR1YWwgViBce1xbXHJcblx0IFxdK3B1YmxpYzpcW1xyXG5cdCBcXStpbnQgZDtcW1xyXG5cdCBcXStzdGF0aWMgdm9pZCBzXFwodm9pZFxcKTtcW1xyXG5cdCBcXSt2aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7XFtcclxuXHQgXF0rdmlydHVhbCBpbnQgdmRcXCh2b2lkXFwpO1xbXHJcblx0IFxdK2ludCBmZFxcKHZvaWRcXCk7XFtcclxuXHQgXF0rXH1cclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgcGFzcyAicHR5cGUgZCAoYUNDKSIKKyAgICAgICAgfQorCS1yZSAidHlwZSA9IGNsYXNzIEQgOiBwdWJsaWMgQUQsIHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5WOyR7d3N9cHVibGljOiR7d3N9aW50IGQ7JHt3c31EICYgb3BlcmF0b3I9XFwoRCBjb25zdCAmXFwpOyR7d3N9RFxcKGludCwgRCBjb25zdCAmXFwpOyR7d3N9RFxcKGludFxcKTske3dzfXN0YXRpYyB2b2lkIHNcXCh2b2lkXFwpOyR7d3N9dmlydHVhbCBpbnQgdmdcXCh2b2lkXFwpOyR7d3N9dmlydHVhbCBpbnQgdmRcXCh2b2lkXFwpOyR7d3N9aW50IGZkXFwodm9pZFxcKTske3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgZCIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgRCA6IHB1YmxpYyBBRCwgcHVibGljIHZpcnR1YWwgViBceyR7d3N9cHJpdmF0ZToke3dzfVYgXFsqXF0rX3ZiLlY7JHt3c31wdWJsaWM6JHt3c31pbnQgZDsoKCR7d3N9RCAmIG9wZXJhdG9yPVxcKEQgY29uc3QgJlxcKTspfCgke3dzfURcXChpbnQsIEQgY29uc3QgJlxcKTspfCgke3dzfURcXChpbnRcXCk7KXwoJHt3c31zdGF0aWMgdm9pZCBzXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZkXFwodm9pZFxcKTspfCgke3dzfWludCBmZFxcKHZvaWRcXCk7KSkqJHt3c31cfVxyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIGQgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBkIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgZCAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBlXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgRSA6IHB1YmxpYyBCLCBwdWJsaWMgdmlydHVhbCBWLCBwdWJsaWMgRCwgcHVibGljIEMgXHske3dzfXB1YmxpYzoke3dzfWludCBlOyR7d3N9RSAmIG9wZXJhdG9yPVxcKEUgY29uc3QgJlxcKTske3dzfUVcXChpbnQsIEUgY29uc3QgJlxcKTske3dzfUVcXChpbnRcXCk7JHt3c312aXJ0dWFsIGludCBmXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZ2XFwodm9pZFxcKTske3dzfVx9XHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgZSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgRSA6IHB1YmxpYyBCLCBwdWJsaWMgdmlydHVhbCBWLCBwdWJsaWMgRCwgcHVibGljIEMgXHske3dzfXB1YmxpYzoke3dzfWludCBlOygoJHt3c31FICYgb3BlcmF0b3I9XFwoRSBjb25zdCAmXFwpOyl8KCR7d3N9RVxcKGludCwgRSBjb25zdCAmXFwpOyl8KCR7d3N9RVxcKGludFxcKTspfCgke3dzfXZpcnR1YWwgaW50IGZcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdmdcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdnZcXCh2b2lkXFwpOykpKiR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBlIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgZSIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIGUgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgdlxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIFYgOiBwdWJsaWMgVkEsIHB1YmxpYyBWQiBceyR7d3N9cHVibGljOiR7d3N9aW50IHc7JHt3c31WICYgb3BlcmF0b3I9XFwoViBjb25zdCAmXFwpOyR7d3N9VlxcKFYgY29uc3QgJlxcKTske3dzfVZcXCh2b2lkXFwpOyR7d3N9aW50IGZcXCh2b2lkXFwpOyR7d3N9dmlydHVhbCBpbnQgdnZcXCh2b2lkXFwpOyR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSB2IgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBWIDogcHVibGljIFZBLCBwdWJsaWMgVkIgXHske3dzfXB1YmxpYzoke3dzfWludCB3OygoJHt3c31WICYgb3BlcmF0b3I9XFwoViBjb25zdCAmXFwpOyl8KCR7d3N9VlxcKFYgY29uc3QgJlxcKTspfCgke3dzfVZcXCh2b2lkXFwpOyl8KCR7d3N9aW50IGZcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdnZcXCh2b2lkXFwpOykpKiR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSB2IChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgdiIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIHYgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgdmJcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBWQiBceyR7d3N9cHVibGljOiR7d3N9aW50IHZiOyR7d3N9VkIgJiBvcGVyYXRvcj1cXChWQiBjb25zdCAmXFwpOyR7d3N9VkJcXChWQiBjb25zdCAmXFwpOyR7d3N9VkJcXCh2b2lkXFwpOyR7d3N9aW50IGZ2YlxcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2dmJcXCh2b2lkXFwpOyR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSB2YiIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgVkIgXHske3dzfXB1YmxpYzoke3dzfWludCB2YjsoKCR7d3N9VkIgJiBvcGVyYXRvcj1cXChWQiBjb25zdCAmXFwpOyl8KCR7d3N9VkJcXChWQiBjb25zdCAmXFwpOyl8KCR7d3N9VkJcXCh2b2lkXFwpOyl8KCR7d3N9aW50IGZ2YlxcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2dmJcXCh2b2lkXFwpOykpKiR7d3N9XH1cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSB2YiAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIHZiIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgdmIgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgcEFhXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAidHlwZSA9IGNsYXNzIEEgOiBwdWJsaWMgdmlydHVhbCBWIFx7XFtcclxuXHQgXF0rcHJpdmF0ZTpcW1xyXG5cdCBcXStpbnQgYTtcW1xyXG5cdCBcXStwdWJsaWM6XFtcclxuXHQgXF0rdmlydHVhbCBpbnQgZlxcKHZvaWRcXCk7XFtcclxuXHQgXF0rXH0gXFsqXF0rXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIHBhc3MgInB0eXBlIHBBYSAoYUNDKSIKKyAgICAgICAgfQorCS1yZSAidHlwZSA9IGNsYXNzIEEgOiBwdWJsaWMgdmlydHVhbCBWIFx7JHt3c31wcml2YXRlOiR7d3N9ViBcWypcXStfdmIuVjske3dzfWludCBhOyR7d3N9cHVibGljOiR7d3N9QSAmIG9wZXJhdG9yPVxcKEEgY29uc3QgJlxcKTske3dzfUFcXChpbnQsIEEgY29uc3QgJlxcKTske3dzfUFcXChpbnRcXCk7JHt3c312aXJ0dWFsIGludCBmXFwodm9pZFxcKTske3dzfVx9IFxbKlxdK1xyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBBYSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgQSA6IHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5WOyR7d3N9aW50IGE7JHt3c31wdWJsaWM6KCgke3dzfUEgJiBvcGVyYXRvcj1cXChBIGNvbnN0ICZcXCk7KXwoJHt3c31BXFwoaW50LCBBIGNvbnN0ICZcXCk7KXwoJHt3c31BXFwoaW50XFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgZlxcKHZvaWRcXCk7KSkqJHt3c31cfSBcWypcXStcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwQWEgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBwQWEiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBwQWEgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgcEFlXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAidHlwZSA9IGNsYXNzIEEgOiBwdWJsaWMgdmlydHVhbCBWIFx7XFtcclxuXHQgXF0rcHJpdmF0ZTpcW1xyXG5cdCBcXStpbnQgYTtcW1xyXG5cdCBcXStwdWJsaWM6XFtcclxuXHQgXF0rdmlydHVhbCBpbnQgZlxcKHZvaWRcXCk7XFtcclxuXHQgXF0rXH0gXFsqXF0rXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIHBhc3MgInB0eXBlIHBBZSAoYUNDKSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgQSA6IHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5WOyR7d3N9aW50IGE7JHt3c31wdWJsaWM6JHt3c31BICYgb3BlcmF0b3I9XFwoQSBjb25zdCAmXFwpOyR7d3N9QVxcKGludCwgQSBjb25zdCAmXFwpOyR7d3N9QVxcKGludFxcKTske3dzfXZpcnR1YWwgaW50IGZcXCh2b2lkXFwpOyR7d3N9XH0gXFsqXF0rXHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgcEFlIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBBIDogcHVibGljIHZpcnR1YWwgViBceyR7d3N9cHJpdmF0ZToke3dzfVYgXFsqXF0rX3ZiLlY7JHt3c31pbnQgYTske3dzfXB1YmxpYzooKCR7d3N9QSAmIG9wZXJhdG9yPVxcKEEgY29uc3QgJlxcKTspfCgke3dzfUFcXChpbnQsIEEgY29uc3QgJlxcKTspfCgke3dzfUFcXChpbnRcXCk7KXwoJHt3c312aXJ0dWFsIGludCBmXFwodm9pZFxcKTspKSoke3dzfVx9IFxbKlxdK1xyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBBZSAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIHBBZSIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIHBBZSAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBwQmVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInR5cGUgPSBjbGFzcyBCIDogcHVibGljIEEgXHske3dzfXByaXZhdGU6JHt3c31pbnQgYjske3dzfXB1YmxpYzoke3dzfUIgJiBvcGVyYXRvcj1cXChCIGNvbnN0ICZcXCk7JHt3c31CXFwoaW50LCBCIGNvbnN0ICZcXCk7JHt3c31CXFwoaW50XFwpOyR7d3N9dmlydHVhbCBpbnQgZlxcKHZvaWRcXCk7JHt3c31cfSBcWypcXStcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwQmUiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIEIgOiBwdWJsaWMgQSBceyR7d3N9cHJpdmF0ZToke3dzfWludCBiOyR7d3N9cHVibGljOigoJHt3c31CICYgb3BlcmF0b3I9XFwoQiBjb25zdCAmXFwpOyl8KCR7d3N9QlxcKGludCwgQiBjb25zdCAmXFwpOyl8KCR7d3N9QlxcKGludFxcKTspfCgke3dzfXZpcnR1YWwgaW50IGZcXCh2b2lkXFwpOykpKiR7d3N9XH0gXFsqXF0rXHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgcEJlIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgcEJlIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgcEJlICh0aW1lb3V0KSIKKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIHBEZFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgInR5cGUgPSBjbGFzcyBEIDogcHVibGljIEFELCBwdWJsaWMgdmlydHVhbCBWIFx7XFtcclxuXHQgXF0rcHVibGljOlxbXHJcblx0IFxdK2ludCBkO1xbXHJcblx0IFxdK3N0YXRpYyB2b2lkIHNcXCh2b2lkXFwpO1xbXHJcblx0IFxdK3ZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTtcW1xyXG5cdCBcXSt2aXJ0dWFsIGludCB2ZFxcKHZvaWRcXCk7XFtcclxuXHQgXF0raW50IGZkXFwodm9pZFxcKTtcW1xyXG5cdCBcXStcfSBcWypcXStcclxuJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgcGFzcyAicHR5cGUgcERkIChhQ0MpIgorICAgICAgICB9CisJLXJlICJ0eXBlID0gY2xhc3MgRCA6IHB1YmxpYyBBRCwgcHVibGljIHZpcnR1YWwgViBceyR7d3N9cHJpdmF0ZToke3dzfVYgXFsqXF0rX3ZiLlY7JHt3c31wdWJsaWM6JHt3c31pbnQgZDske3dzfUQgJiBvcGVyYXRvcj1cXChEIGNvbnN0ICZcXCk7JHt3c31EXFwoaW50LCBEIGNvbnN0ICZcXCk7JHt3c31EXFwoaW50XFwpOyR7d3N9c3RhdGljIHZvaWQgc1xcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2ZFxcKHZvaWRcXCk7JHt3c31pbnQgZmRcXCh2b2lkXFwpOyR7d3N9XH0gXFsqXF0rXHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgcERkIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBEIDogcHVibGljIEFELCBwdWJsaWMgdmlydHVhbCBWIFx7JHt3c31wcml2YXRlOiR7d3N9ViBcWypcXStfdmIuVjske3dzfXB1YmxpYzoke3dzfWludCBkOygoJHt3c31EICYgb3BlcmF0b3I9XFwoRCBjb25zdCAmXFwpOyl8KCR7d3N9RFxcKGludCwgRCBjb25zdCAmXFwpOyl8KCR7d3N9RFxcKGludFxcKTspfCgke3dzfXN0YXRpYyB2b2lkIHNcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdmdcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdmRcXCh2b2lkXFwpOyl8KCR7d3N9aW50IGZkXFwodm9pZFxcKTspKSoke3dzfVx9IFxbKlxdK1xyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBEZCAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIHBEZCIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIHBEZCAodGltZW91dCkiCisJfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwdHlwZSBwRGVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJ0eXBlID0gY2xhc3MgRCA6IHB1YmxpYyBBRCwgcHVibGljIHZpcnR1YWwgViBce1xbXHJcblx0IFxdK3B1YmxpYzpcW1xyXG5cdCBcXStpbnQgZDtcW1xyXG5cdCBcXStzdGF0aWMgdm9pZCBzXFwodm9pZFxcKTtcW1xyXG5cdCBcXSt2aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7XFtcclxuXHQgXF0rdmlydHVhbCBpbnQgdmRcXCh2b2lkXFwpO1xbXHJcblx0IFxdK2ludCBmZFxcKHZvaWRcXCk7XFtcclxuXHQgXF0rXH0gXFsqXF0rXHJcbiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIHBhc3MgInB0eXBlIHBEZSAoYUNDKSIKKyAgICAgICAgfQorCS1yZSAidHlwZSA9IGNsYXNzIEQgOiBwdWJsaWMgQUQsIHB1YmxpYyB2aXJ0dWFsIFYgXHske3dzfXByaXZhdGU6JHt3c31WIFxbKlxdK192Yi5WOyR7d3N9cHVibGljOiR7d3N9aW50IGQ7JHt3c31EICYgb3BlcmF0b3I9XFwoRCBjb25zdCAmXFwpOyR7d3N9RFxcKGludCwgRCBjb25zdCAmXFwpOyR7d3N9RFxcKGludFxcKTske3dzfXN0YXRpYyB2b2lkIHNcXCh2b2lkXFwpOyR7d3N9dmlydHVhbCBpbnQgdmdcXCh2b2lkXFwpOyR7d3N9dmlydHVhbCBpbnQgdmRcXCh2b2lkXFwpOyR7d3N9aW50IGZkXFwodm9pZFxcKTske3dzfVx9IFxbKlxdK1xyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBEZSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgRCA6IHB1YmxpYyBBRCwgcHVibGljIHZpcnR1YWwgViBceyR7d3N9cHJpdmF0ZToke3dzfVYgXFsqXF0rX3ZiLlY7JHt3c31wdWJsaWM6JHt3c31pbnQgZDsoKCR7d3N9RCAmIG9wZXJhdG9yPVxcKEQgY29uc3QgJlxcKTspfCgke3dzfURcXChpbnQsIEQgY29uc3QgJlxcKTspfCgke3dzfURcXChpbnRcXCk7KXwoJHt3c31zdGF0aWMgdm9pZCBzXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTspfCgke3dzfXZpcnR1YWwgaW50IHZkXFwodm9pZFxcKTspfCgke3dzfWludCBmZFxcKHZvaWRcXCk7KSkqJHt3c31cfSBcWypcXStcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwRGUgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBwRGUiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBwRGUgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgcFZhXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgViA6IHB1YmxpYyBWQSwgcHVibGljIFZCIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgdzske3dzfVYgJiBvcGVyYXRvcj1cXChWIGNvbnN0ICZcXCk7JHt3c31WXFwoViBjb25zdCAmXFwpOyR7d3N9VlxcKHZvaWRcXCk7JHt3c31pbnQgZlxcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2dlxcKHZvaWRcXCk7JHt3c31cfSBcWypcXStcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwVmEiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIFYgOiBwdWJsaWMgVkEsIHB1YmxpYyBWQiBceyR7d3N9cHVibGljOiR7d3N9aW50IHc7KCgke3dzfVYgJiBvcGVyYXRvcj1cXChWIGNvbnN0ICZcXCk7KXwoJHt3c31WXFwoViBjb25zdCAmXFwpOyl8KCR7d3N9VlxcKHZvaWRcXCk7KXwoJHt3c31pbnQgZlxcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2dlxcKHZvaWRcXCk7KSkqJHt3c31cfSBcWypcXStcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwVmEgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBwVmEiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBwVmEgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgcFZ2XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgViA6IHB1YmxpYyBWQSwgcHVibGljIFZCIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgdzske3dzfVYgJiBvcGVyYXRvcj1cXChWIGNvbnN0ICZcXCk7JHt3c31WXFwoViBjb25zdCAmXFwpOyR7d3N9VlxcKHZvaWRcXCk7JHt3c31pbnQgZlxcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2dlxcKHZvaWRcXCk7JHt3c31cfSBcWypcXStcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwVnYiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIFYgOiBwdWJsaWMgVkEsIHB1YmxpYyBWQiBceyR7d3N9cHVibGljOiR7d3N9aW50IHc7KCgke3dzfVYgJiBvcGVyYXRvcj1cXChWIGNvbnN0ICZcXCk7KXwoJHt3c31WXFwoViBjb25zdCAmXFwpOyl8KCR7d3N9VlxcKHZvaWRcXCk7KXwoJHt3c31pbnQgZlxcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2dlxcKHZvaWRcXCk7KSkqJHt3c31cfSBcWypcXStcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwVnYgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBwVnYiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBwVnYgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgcFZlXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgViA6IHB1YmxpYyBWQSwgcHVibGljIFZCIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgdzske3dzfVYgJiBvcGVyYXRvcj1cXChWIGNvbnN0ICZcXCk7JHt3c31WXFwoViBjb25zdCAmXFwpOyR7d3N9VlxcKHZvaWRcXCk7JHt3c31pbnQgZlxcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2dlxcKHZvaWRcXCk7JHt3c31cfSBcWypcXStcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwVmUiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIFYgOiBwdWJsaWMgVkEsIHB1YmxpYyBWQiBceyR7d3N9cHVibGljOiR7d3N9aW50IHc7KCgke3dzfVYgJiBvcGVyYXRvcj1cXChWIGNvbnN0ICZcXCk7KXwoJHt3c31WXFwoViBjb25zdCAmXFwpOyl8KCR7d3N9VlxcKHZvaWRcXCk7KXwoJHt3c31pbnQgZlxcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2dlxcKHZvaWRcXCk7KSkqJHt3c31cfSBcWypcXStcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwVmUgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBwVmUiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBwVmUgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgcFZkXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgViA6IHB1YmxpYyBWQSwgcHVibGljIFZCIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgdzske3dzfVYgJiBvcGVyYXRvcj1cXChWIGNvbnN0ICZcXCk7JHt3c31WXFwoViBjb25zdCAmXFwpOyR7d3N9VlxcKHZvaWRcXCk7JHt3c31pbnQgZlxcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2dlxcKHZvaWRcXCk7JHt3c31cfSBcWypcXStcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwVmQiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIFYgOiBwdWJsaWMgVkEsIHB1YmxpYyBWQiBceyR7d3N9cHVibGljOiR7d3N9aW50IHc7KCgke3dzfVYgJiBvcGVyYXRvcj1cXChWIGNvbnN0ICZcXCk7KXwoJHt3c31WXFwoViBjb25zdCAmXFwpOyl8KCR7d3N9VlxcKHZvaWRcXCk7KXwoJHt3c31pbnQgZlxcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2dlxcKHZvaWRcXCk7KSkqJHt3c31cfSBcWypcXStcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwVmQgKG9ic29sZXNjZW50IGdjYyBvciBnZGIpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwdHlwZSBwVmQiCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJwdHlwZSBwVmQgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgcEFEZVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIEFEIFx7JHt3c31wdWJsaWM6JHt3c31BRCAmIG9wZXJhdG9yPVxcKEFEIGNvbnN0ICZcXCk7JHt3c31BRFxcKEFEIGNvbnN0ICZcXCk7JHt3c31BRFxcKHZvaWRcXCk7JHt3c312aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7JHt3c31cfSBcWypcXStcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwQURlIgorCX0KKwktcmUgInR5cGUgPSBjbGFzcyBBRCBceyR7d3N9cHVibGljOigoJHt3c31BRCAmIG9wZXJhdG9yPVxcKEFEIGNvbnN0ICZcXCk7KXwoJHt3c31BRFxcKEFEIGNvbnN0ICZcXCk7KXwoJHt3c31BRFxcKHZvaWRcXCk7KXwoJHt3c312aXJ0dWFsIGludCB2Z1xcKHZvaWRcXCk7KSkqJHt3c31cfSBcWypcXStcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwQURlIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgcEFEZSIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIHBBRGUgKHRpbWVvdXQpIgorCX0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHR5cGUgcEVlXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJ0eXBlID0gY2xhc3MgRSA6IHB1YmxpYyBCLCBwdWJsaWMgdmlydHVhbCBWLCBwdWJsaWMgRCwgcHVibGljIEMgXHske3dzfXB1YmxpYzoke3dzfWludCBlOyR7d3N9RSAmIG9wZXJhdG9yPVxcKEUgY29uc3QgJlxcKTske3dzfUVcXChpbnQsIEUgY29uc3QgJlxcKTske3dzfUVcXChpbnRcXCk7JHt3c312aXJ0dWFsIGludCBmXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZnXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZ2XFwodm9pZFxcKTske3dzfVx9IFxbKlxdK1xyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBFZSIKKwl9CisJLXJlICJ0eXBlID0gY2xhc3MgRSA6IHB1YmxpYyBCLCBwdWJsaWMgdmlydHVhbCBWLCBwdWJsaWMgRCwgcHVibGljIEMgXHske3dzfXB1YmxpYzoke3dzfWludCBlOygoJHt3c31FICYgb3BlcmF0b3I9XFwoRSBjb25zdCAmXFwpOyl8KCR7d3N9RVxcKGludCwgRSBjb25zdCAmXFwpOyl8KCR7d3N9RVxcKGludFxcKTspfCgke3dzfXZpcnR1YWwgaW50IGZcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdmdcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdnZcXCh2b2lkXFwpOykpKiR7d3N9XH0gXFsqXF0rXHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicHR5cGUgcEVlIChvYnNvbGVzY2VudCBnY2Mgb3IgZ2RiKSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHR5cGUgcEVlIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicHR5cGUgcEVlICh0aW1lb3V0KSIKKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgInB0eXBlIHBWQlxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAidHlwZSA9IGNsYXNzIFZCIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgdmI7JHt3c31WQiAmIG9wZXJhdG9yPVxcKFZCIGNvbnN0ICZcXCk7JHt3c31WQlxcKFZCIGNvbnN0ICZcXCk7JHt3c31WQlxcKHZvaWRcXCk7JHt3c31pbnQgZnZiXFwodm9pZFxcKTske3dzfXZpcnR1YWwgaW50IHZ2YlxcKHZvaWRcXCk7JHt3c31cfSBcWypcXStcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJwdHlwZSBwVkIiCisJfQorCS1yZSAidHlwZSA9IGNsYXNzIFZCIFx7JHt3c31wdWJsaWM6JHt3c31pbnQgdmI7KCgke3dzfVZCICYgb3BlcmF0b3I9XFwoVkIgY29uc3QgJlxcKTspfCgke3dzfVZCXFwoVkIgY29uc3QgJlxcKTspfCgke3dzfVZCXFwodm9pZFxcKTspfCgke3dzfWludCBmdmJcXCh2b2lkXFwpOyl8KCR7d3N9dmlydHVhbCBpbnQgdnZiXFwodm9pZFxcKTspKSoke3dzfVx9IFxbKlxdK1xyXG4kZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInB0eXBlIHBWQiAob2Jzb2xlc2NlbnQgZ2NjIG9yIGdkYikiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInB0eXBlIHBWQiIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInB0eXBlIHBWQiAodGltZW91dCkiCisJfQorICAgIH0KK30KKworIworIyAgVGVzdCBjYWxsaW5nIG9mIHZpcnR1YWwgZnVuY3Rpb25zLgorIworCitwcm9jIHRlc3RfdmlydHVhbF9jYWxscyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgR0RCCisKKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYixjYW5ub3RfY2FsbF9mdW5jdGlvbnNdIHsKKwlzZXR1cF94ZmFpbCAiKi0qLSoiIDI0MTYKKwlmYWlsICJUaGlzIHRhcmdldCBjYW4gbm90IGNhbGwgZnVuY3Rpb25zIgorCXJldHVybiAwCisgICAgfQorCisgICAgc2VuZF9nZGIgInByaW50IHBBZS0+ZigpXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IDIwXHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgcEFlLT5mKCkiIH0KKwktcmUgIkNhbm5vdCBpbnZva2UgZnVuY3Rpb25zIG9uIHRoaXMgbWFjaGluZS4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJwcmludCBwQWUtPmYoKSAoY2Fubm90IGludm9rZSBmdW5jdGlvbnMsIHNraXBwaW5nIHZpcnR1YWwgY2FsbHMpIgorCSAgICByZXR1cm4gMAorCX0KKwktcmUgIi4qQ2Fubm90IGFjY2VzcyBtZW1vcnkgYXQgYWRkcmVzcyAweDguKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicHJpbnQgcEFlLT5mKCkgXAorKGtub3duIGZhaWx1cmUgd2l0aCBnY2MgY3lnbnVzLTIuNC41LTkzMDQxNywgc2tpcHBpbmcgdmlydHVhbCBjYWxscykiCisJICAgIHJldHVybiAwCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHBBZS0+ZigpIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IHBBZS0+ZigpICh0aW1lb3V0KSIgfQorCWVvZiB7IGZhaWwgInByaW50IHBBZS0+ZigpICgkR0RCIGR1bXBlZCBjb3JlKSAoRklYTUUpIiA7IGdkYl92aXJ0ZnVuY19yZXN0YXJ0OyByZXR1cm4gfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwcmludCBwQWEtPmYoKVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSAxXHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgcEFhLT5mKCkiIH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwQWEtPmYoKSIgfQorCXRpbWVvdXQgeyBmYWlsICJwcmludCBwQWEtPmYoKSAodGltZW91dCkiIH0KKwllb2YgeyBmYWlsICJwcmludCBwQWEtPmYoKSAoJEdEQiBkdW1wZWQgY29yZSkgKEZJWE1FKSIgOyBnZGJfdmlydGZ1bmNfcmVzdGFydDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHJpbnQgcERlLT52ZygpXG4iCisjICAgc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSAyMDJcclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBwRGUtPnZnKCkiIH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwRGUtPnZnKCkiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHJpbnQgcERlLT52ZygpICh0aW1lb3V0KSIgfQorCWVvZiB7IGZhaWwgInByaW50IHBEZS0+dmcoKSAoJEdEQiBkdW1wZWQgY29yZSkgKEZJWE1FKSIgOyBnZGJfdmlydGZ1bmNfcmVzdGFydDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHJpbnQgcEFEZS0+dmcoKVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSAyMDJcclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBwQURlLT52ZygpIiB9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgcEFEZS0+dmcoKSIgfQorCXRpbWVvdXQgeyBmYWlsICJwcmludCBwQURlLT52ZygpICh0aW1lb3V0KSIgfQorCWVvZiB7IGZhaWwgInByaW50IHBBRGUtPnZnKCkgKCRHREIgZHVtcGVkIGNvcmUpIChGSVhNRSkiIDsgZ2RiX3ZpcnRmdW5jX3Jlc3RhcnQ7IHJldHVybiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInByaW50IHBEZC0+dmcoKVxuIgorIyAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qID0gMTAxXHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgcERkLT52ZygpIiB9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgcERkLT52ZygpIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IHBEZC0+dmcoKSAodGltZW91dCkiIH0KKwllb2YgeyBmYWlsICJwcmludCBwRGQtPnZnKCkgKCRHREIgZHVtcGVkIGNvcmUpIChGSVhNRSkiIDsgZ2RiX3ZpcnRmdW5jX3Jlc3RhcnQ7IHJldHVybiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInByaW50IHBFZS0+dnZiKClcbiIKKyMgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IDQxMVxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IHBFZS0+dnZiKCkiIH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwRWUtPnZ2YigpIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IHBFZS0+dnZiKCkgKHRpbWVvdXQpIiB9CisJZW9mIHsgZmFpbCAicHJpbnQgcEVlLT52dmIoKSAoJEdEQiBkdW1wZWQgY29yZSkgKEZJWE1FKSIgOyBnZGJfdmlydGZ1bmNfcmVzdGFydDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHJpbnQgcFZCLT52dmIoKVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSA0MDdcclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBwVkItPnZ2YigpIiB9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgcFZCLT52dmIoKSIgfQorCXRpbWVvdXQgeyBmYWlsICJwcmludCBwVkItPnZ2YigpICh0aW1lb3V0KSIgfQorCWVvZiB7IGZhaWwgInByaW50IHBWQi0+dnZiKCkgKCRHREIgZHVtcGVkIGNvcmUpIChGSVhNRSkiIDsgZ2RiX3ZpcnRmdW5jX3Jlc3RhcnQ7IHJldHVybiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInByaW50IHBCZS0+dnZiKClcbiIKKyMgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IDQxMVxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IHBCZS0+dnZiKCkiIH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBwQmUtPnZ2YigpIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IHBCZS0+dnZiKCkgKHRpbWVvdXQpIiB9CisJZW9mIHsgZmFpbCAicHJpbnQgcEJlLT52dmIoKSAoJEdEQiBkdW1wZWQgY29yZSkgKEZJWE1FKSIgOyBnZGJfdmlydGZ1bmNfcmVzdGFydDsgcmV0dXJuIH0KKyAgICB9CisKKyAgICBzZW5kX2dkYiAicHJpbnQgcERlLT52dmIoKVxuIgorIyAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qID0gNDExXHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgcERlLT52dmIoKSIgfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHBEZS0+dnZiKCkiIH0KKwl0aW1lb3V0IHsgZmFpbCAicHJpbnQgcERlLT52dmIoKSAodGltZW91dCkiIH0KKwllb2YgeyBmYWlsICJwcmludCBwRGUtPnZ2YigpICgkR0RCIGR1bXBlZCBjb3JlKSAoRklYTUUpIiA7IGdkYl92aXJ0ZnVuY19yZXN0YXJ0OyByZXR1cm4gfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwcmludCBwRWUtPnZkKClcbiIKKyMgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKiA9IDI4MlxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IHBFZS0+dmQoKSIgfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IHBFZS0+dmQoKSIgfQorCXRpbWVvdXQgeyBmYWlsICJwcmludCBwRWUtPnZkKCkgKHRpbWVvdXQpIiB9CisJZW9mIHsgZmFpbCAicHJpbnQgcEVlLT52ZCgpICgkR0RCIGR1bXBlZCBjb3JlKSAoRklYTUUpIiA7IGdkYl92aXJ0ZnVuY19yZXN0YXJ0OyByZXR1cm4gfQorICAgIH0KKworICAgIHNlbmRfZ2RiICJwcmludCBwRWUtPmZ2YigpXG4iCisjICAgc2V0dXBfeGZhaWwgIiotKi0qIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLiogPSAzMTFcclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBwRWUtPmZ2YigpIiB9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgcEVlLT5mdmIoKSIgfQorCXRpbWVvdXQgeyBmYWlsICJwcmludCBwRWUtPmZ2YigpICh0aW1lb3V0KSIgfQorCWVvZiB7IGZhaWwgInByaW50IHBFZS0+ZnZiKCkgKCRHREIgZHVtcGVkIGNvcmUpIChGSVhNRSkiIDsgZ2RiX3ZpcnRmdW5jX3Jlc3RhcnQ7IHJldHVybiB9CisgICAgfQorCisgICAgc2VuZF9nZGIgInByaW50IHBFZS0+RDo6dmcoKVxuIgorICAgIHNldHVwX3hmYWlsICIqLSotKiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qID0gMTAyXHJcbiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgcEVlLT5EOjp2ZygpIiB9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgcEVlLT5EOjp2ZygpIiB9CisJdGltZW91dCB7IGZhaWwgInByaW50IHBFZS0+RDo6dmcoKSAodGltZW91dCkiIH0KKwllb2YgeyBmYWlsICJwcmludCBwRWUtPkQ6OnZnKCkgKCRHREIgZHVtcGVkIGNvcmUpIChGSVhNRSkiIDsgZ2RiX3ZpcnRmdW5jX3Jlc3RhcnQ7IHJldHVybiB9CisgICAgfQorfQorCitwcm9jIGRvX3Rlc3RzIHt9IHsKKyAgICBnbG9iYWwgcHJtc19pZAorICAgIGdsb2JhbCBidWdfaWQKKworICAgIHNldCBwcm1zX2lkIDAKKyAgICBzZXQgYnVnX2lkIDAKKworICAgIGdkYl9zdGFydDsKKyAgICBnZGJfdmlydGZ1bmNfaW5pdDsKKworICAgICMgR2V0IHRoZSBkZWJ1ZyBmb3JtYXQgZm9yIHRoZSBjb21waWxlZCB0ZXN0IGNhc2UuICBJZiB0aGF0CisgICAgIyBmb3JtYXQgaXMgRFdBUkYgMSB0aGVuIGp1c3Qgc2tpcCBhbGwgdGhlIHRlc3RzIHNpbmNlIG5vbmUgb2YKKyAgICAjIHRoZW0gd2lsbCBwYXNzLgorCisgICAgaWYgWyBydW50b19tYWluIF0gdGhlbiB7CisJZ2V0X2RlYnVnX2Zvcm1hdAorCWlmIFsgc2V0dXBfeGZhaWxfZm9ybWF0ICJEV0FSRiAxIiBdIHRoZW4geworCSAgICBmYWlsICJDKysgdGVzdHMgc2tpcHBlZCBkdWUgdG8gbGltaXRlZCBDKysgc3VwcG9ydCBpbiBEV0FSRiAxIGRlYnVnIGZvcm1hdCIKKwkgICAgcmV0dXJuCisJfQorCWNsZWFyX3hmYWlsICIqLSotKiIKKyAgICB9CisKKyAgICB0ZXN0X3B0eXBlX29mX2NsYXNzZXMKKworICAgIGlmIFsgcnVudG8gJ3Rlc3RfY2FsbHModm9pZCknIF0gdGhlbiB7CisJdGVzdF92aXJ0dWFsX2NhbGxzCisgICAgfQorfQorCitkb190ZXN0cwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvd2F0Y2gtY21kLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3dhdGNoLWNtZC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlM2I1YwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3dhdGNoLWNtZC5leHAKQEAgLTAsMCArMSwxNjUgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworIworIyB0ZXN0IHNwZWNpYWwgY29tbWFuZHMKKyMKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgInJ1bi1ocCIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSB7ZGVidWcgYWRkaXRpb25hbF9mbGFncz0tREZBS0VBUkdWfV0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorCit9CisKKyMgYXJlIHdlIG9uIGEgdGFyZ2V0IGJvYXJkCitpZiAhW2lzbmF0aXZlXSB0aGVuIHsKKyAgICByZXR1cm4KK30KKworaWYgeyFbaXN0YXJnZXQgImhwcGEqLSotaHB1eDEwLjMwIl0gJiYgIVtpc3RhcmdldCAiaHBwYSotKi1ocHV4MTEuKiJdfSB7CisgICAgI3NldHVwX3hmYWlsICIqLSouKiIKKyAgICByZXR1cm4gMAorfQorCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0geworICAgIHJldHVybiAtMTsKK30KK2lmIHtbc2tpcF9ocF90ZXN0cyAkZ2NjX2NvbXBpbGVkXX0gdGhlbiB7IGNvbnRpbnVlIH0KKworCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitkZWxldGVfYnJlYWtwb2ludHMKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCisKKworcHJvYyB3YXRjaHBvaW50X2NvbW1hbmRfdGVzdCB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIGlmIFt0YXJnZXRfaW5mbyBleGlzdHMgbm9hcmdzXSB7IAorICAgICAgICB2ZXJib3NlICJTa2lwcGluZyB3YXRjaHBvaW50X2NvbW1hbmRfdGVzdCBiZWNhdXNlIG9mIG5vYXJncy4iCisgICAgICAgIHJldHVybgorICAgIH0KKworICAgIGlmIHsgIVtydW50byBmYWN0b3JpYWxdIH0gdGhlbiB7IGdkYl9zdXBwcmVzc190ZXN0cyB9CisgICAgIyBEb24ndCBkZXBlbmQgdXBvbiBhcmd1bWVudCBwYXNzaW5nLCBzaW5jZSBtb3N0IHNpbXVsYXRvcnMgZG9uJ3QgY3VycmVudGx5CisgICAgIyBzdXBwb3J0IGl0LiAgQmFzaCB2YWx1ZSB2YXJpYWJsZSB0byBiZSB3aGF0IHdlIHdhbnQuCisgICAgZ2RiX3Rlc3QgInAgdmFsdWU9NiIgIiIgInNldCB2YWx1ZSB0byA2IGluIHdhdGNocG9pbnRfY29tbWFuZF90ZXN0IgorICAgIGRlbGV0ZV9icmVha3BvaW50cworCisgICAgIyBWZXJpZnkgdGhhdCB3ZSBjYW4gY3JlYXRlIGEgd2F0Y2hwb2ludCwgYW5kIGdpdmUgaXQgYSBjb21tYW5kcworICAgICMgbGlzdCB0aGF0IGNvbnRpbnVlcyB0aGUgaW5mZXJpb3IuICBXZSBzZXQgdGhlIHdhdGNocG9pbnQgb24gYQorICAgICMgbG9jYWwgdmFyaWFibGUsIHRvbywgc28gdGhhdCBpdCBzZWxmLWRlbGV0ZXMgd2hlbiB0aGUgd2F0Y2hlZAorICAgICMgZGF0YSBnb2VzIG91dCBvZiBzY29wZS4KKyAgICAjCisgICAgIyBXaGF0IHNob3VsZCBoYXBwZW4gaXM6IEVhY2ggdGltZSB0aGUgd2F0Y2hwb2ludCB0cmlnZ2VycywgaXQKKyAgICAjIGNvbnRpbnVlcyB0aGUgaW5mZXJpb3IuICBFdmVudHVhbGx5LCB0aGUgd2F0Y2hwb2ludCB3aWxsIHNlbGYtCisgICAgIyBkZWxldGUsIHdoZW4gdGhlIHdhdGNoZWQgdmFyaWFibGUgaXMgb3V0IG9mIHNjb3BlLiAgQnV0IGJ5IHRoYXQKKyAgICAjIHRpbWUsIHRoZSBpbmZlcmlvciBzaG91bGQgaGF2ZSBleGl0ZWQuICBHREIgc2hvdWxkbid0IGNyYXNoIG9yCisgICAgIyBhbnl0aGluZyB1bnRvd2FyZCBhcyBhIHJlc3VsdCBvZiB0aGlzLgorICAgICMKKyAgICBzZW5kX2dkYiAid2F0Y2ggbG9jYWxfdmFyXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIi4qXFtXd1xdYXRjaHBvaW50IChcWzAtOVxdKik6IGxvY2FsX3Zhci4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgIHsgcGFzcyAid2F0Y2ggbG9jYWxfdmFyIgorICAgICAgICAgICAgICAgIHNldCB3cF9pZCAkZXhwZWN0X291dCgxLHN0cmluZykKKyAgICAgICAgICAgICAgICBzZW5kX2dkYiAiY29tbWFuZHMgJHdwX2lkXG4iCisgICAgICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgICAtcmUgIlR5cGUgY29tbWFuZHMgZm9yIHdoZW4gYnJlYWtwb2ludCAkd3BfaWQgaXMgaGl0LCBvbmUgcGVyIGxpbmUuKj4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBhc3MgImJlZ2luIGNvbW1hbmRzIG9uIHdhdGNoIn0KKyAgICAgICAgICAgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHtmYWlsICJiZWdpbiBjb21tYW5kcyBvbiB3YXRjaCJ9CisgICAgICAgICAgICAgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgYmVnaW4gY29tbWFuZHMgb24gd2F0Y2gifQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgIHtmYWlsICJ3YXRjaCBsb2NhbF92YXIifQorICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHdhdGNoIGxvY2FsX3ZhciJ9CisgICAgfQorIyAgICBzZXQgd3BfaWQgJGV4cGVjdF9vdXQoMSxzdHJpbmcpCisjICAgIHNlbmRfZ2RiICJjb21tYW5kcyAkd3BfaWRcbiIKKyMgICAgZ2RiX2V4cGVjdCB7CisjICAgICAgLXJlICJUeXBlIGNvbW1hbmRzIGZvciB3aGVuIGJyZWFrcG9pbnQgJHdwX2lkIGlzIGhpdCwgb25lIHBlciBsaW5lLio+IlwKKyMgICAgICAgICAgICAgIHtwYXNzICJiZWdpbiBjb21tYW5kcyBvbiB3YXRjaCJ9CisjICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyMgICAgICAgICAgICAgIHtmYWlsICJiZWdpbiBjb21tYW5kcyBvbiB3YXRjaCJ9CisjICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGJlZ2luIGNvbW1hbmRzIG9uIHdhdGNoIn0KKyMgICAgfQorICAgIHNlbmRfZ2RiICJwcmludCB2YWx1ZVxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICI+IlwKKyAgICAgICAgICAgICAge3Bhc3MgImFkZCBwcmludCBjb21tYW5kIHRvIHdhdGNoIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgIHtmYWlsICJhZGQgcHJpbnQgY29tbWFuZCB0byB3YXRjaCJ9CisgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgYWRkIHByaW50IGNvbW1hbmQgdG8gd2F0Y2gifQorICAgIH0KKyAgICBzZW5kX2dkYiAiY29udGludWVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiPiJcCisgICAgICAgICAgICAgIHtwYXNzICJhZGQgY29udGludWUgY29tbWFuZCB0byB3YXRjaCJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICB7ZmFpbCAiYWRkIGNvbnRpbnVlIGNvbW1hbmQgdG8gd2F0Y2gifQorICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGFkZCBjb250aW51ZSBjb21tYW5kIHRvIHdhdGNoIn0KKyAgICB9CisgICAgc2VuZF9nZGIgImVuZFxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAge3Bhc3MgImJlZ2luIGNvbW1hbmRzIG9uIHdhdGNoIn0KKyAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBiZWdpbiBjb21tYW5kcyBvbiB3YXRjaCJ9CisgICAgfQorICAgIHNlbmRfZ2RiICJjb250aW51ZVxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICJDb250aW51aW5nLipcW1d3XF1hdGNocG9pbnQgJHdwX2lkIGRlbGV0ZWQgYmVjYXVzZSB0aGUgcHJvZ3JhbSBoYXMgbGVmdCB0aGUgYmxvY2sgaW4uKndoaWNoIGl0cyBleHByZXNzaW9uIGlzIHZhbGlkLippbiBtYWluLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAge3Bhc3MgImNvbnRpbnVlIHdpdGggd2F0Y2gifQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAge2ZhaWwgImNvbnRpbnVlIHdpdGggd2F0Y2gifQorICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGNvbnRpbnVlIHdpdGggd2F0Y2gifQorICAgIH0KKyAgICBzZW5kX2dkYiAiY29udGludWVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiQ29udGludWluZy4qJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgIHtwYXNzICJjb250aW51ZSB1bnRpbCBleGl0In0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgIHtmYWlsICJjb250aW51ZSB1bnRpbCBleGl0In0KKyAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBjb250aW51ZSB1bnRpbCBleGl0In0KKyAgICB9Cit9CisKK3dhdGNocG9pbnRfY29tbWFuZF90ZXN0CisKKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvd2F0Y2gtaHAuYyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3dhdGNoLWhwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzNmZlMgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3dhdGNoLWhwLmMKQEAgLTAsMCArMSwxNjYgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorLyoKKyAqCVNpbmNlIHVzaW5nIHdhdGNocG9pbnRzIGNhbiBiZSB2ZXJ5IHNsb3csIHdlIGhhdmUgdG8gdGFrZSBzb21lIHBhaW5zIHRvCisgKgllbnN1cmUgdGhhdCB3ZSBkb24ndCBydW4gdG9vIGxvbmcgd2l0aCB0aGVtIGVuYWJsZWQgb3Igd2UgcnVuIHRoZSByaXNrCisgKglvZiBoYXZpbmcgdGhlIHRlc3QgdGltZW91dC4gIFRvIGhlbHAgYXZvaWQgdGhpcywgd2UgaW5zZXJ0IHNvbWUgbWFya2VyCisgKglmdW5jdGlvbnMgaW4gdGhlIGV4ZWN1dGlvbiBzdHJlYW0gc28gd2UgY2FuIHNldCBicmVha3BvaW50cyBhdCBrbm93bgorICoJbG9jYXRpb25zLCB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGludmFsaWRhdGluZyBsaW5lIG51bWJlcnMgYnkgY2hhbmdpbmcKKyAqCXRoaXMgZmlsZS4gIFdlIHVzZSBudWxsIGJvZGllZCBmdW5jdGlvbnMgYXJlIG1hcmtlcnMgc2luY2UgZ2RiIGRvZXMKKyAqCW5vdCBzdXBwb3J0IGJyZWFrcG9pbnRzIGF0IGxhYmVsZWQgdGV4dCBwb2ludHMgYXQgdGhpcyB0aW1lLgorICoKKyAqCU9uZSBwbGFjZSB3ZSBuZWVkIGlzIGEgbWFya2VyIGZvciB3aGVuIHdlIHN0YXJ0IGV4ZWN1dGluZyBvdXIgdGVzdHMKKyAqCWluc3RydWN0aW9ucyByYXRoZXIgdGhhbiBhbnkgcHJvY2VzcyBzdGFydHVwIGNvZGUsIHNvIHdlIGluc2VydCBvbmUKKyAqCXJpZ2h0IGFmdGVyIGVudGVyaW5nIG1haW4oKS4gIEFub3RoZXIgaXMgcmlnaHQgYmVmb3JlIHdlIGZpbmlzaCwgYmVmb3JlCisgKgl3ZSBzdGFydCBleGVjdXRpbmcgYW55IHByb2Nlc3MgdGVybWluYXRpb24gY29kZS4KKyAqCisgKglBbm90aGVyIHByb2JsZW0gd2UgaGF2ZSB0byBndWFyZCBhZ2FpbnN0LCBhdCBsZWFzdCBmb3IgdGhlIHRlc3QKKyAqCXN1aXRlLCBpcyB0aGF0IHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGxpbmUgdGhhdCBjYXVzZXMgdGhlCisgKgl3YXRjaHBvaW50IHRvIGJlIGhpdCBpcyBzdGlsbCB0aGUgY3VycmVudCBsaW5lIHdoZW4gZ2RiIG5vdGljZXMKKyAqCXRoZSBoaXQuICBEZXBlbmRpbmcgdXBvbiB0aGUgc3BlY2lmaWMgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyLAorICoJdGhlIGluc3RydWN0aW9uIGFmdGVyIHRoZSBvbmUgdGhhdCB0cmlnZ2VycyB0aGUgaGl0IG1heSBiZSBwYXJ0IG9mCisgKgl0aGUgc2FtZSBsaW5lIG9yIHBhcnQgb2YgdGhlIG5leHQgbGluZS4gIFRodXMgd2UgZW5zdXJlIHRoYXQgdGhlcmUKKyAqCWFyZSBhbHdheXMgc29tZSBpbnN0cnVjdGlvbnMgdG8gZXhlY3V0ZSBvbiB0aGUgc2FtZSBsaW5lIGFmdGVyIHRoZQorICoJY29kZSB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBoaXQuCisgKi8KKworaW50IGNvdW50ID0gLTE7CitpbnQgaXZhbDEgPSAtMTsKK2ludCBpdmFsMiA9IC0xOworaW50IGl2YWwzID0gLTE7CitpbnQgaXZhbDQgPSAtMTsKK2ludCBpdmFsNSA9IC0xOworY2hhciBidWZbMTBdOworc3RydWN0IGZvbworeworICBpbnQgdmFsOworfTsKK3N0cnVjdCBmb28gc3RydWN0MSwgc3RydWN0MiwgKnB0cjEsICpwdHIyOworCitpbnQgZG9yZWFkID0gMDsKKwordm9pZCBtYXJrZXIxICgpCit7Cit9CisKK3ZvaWQgbWFya2VyMiAoKQoreworfQorCit2b2lkIG1hcmtlcjQgKCkKK3sKK30KKwordm9pZCBtYXJrZXI1ICgpCit7Cit9CisKK3ZvaWQgbWFya2VyNiAoKQoreworfQorCit2b2lkIHJlY3Vyc2VyICh4KQorICBpbnQgIHg7Cit7CisgIGludCAgbG9jYWxfeDsKKworICBpZiAoeCA+IDApCisgICAgcmVjdXJzZXIgKHgtMSk7CisgIGxvY2FsX3ggPSB4OworfQorCit2b2lkCitmdW5jMiAoKQoreworICBpbnQgIGxvY2FsX2E7CisgIHN0YXRpYyBpbnQgIHN0YXRpY19iOworCisgIGl2YWw1Kys7CisgIGxvY2FsX2EgPSBpdmFsNTsKKyAgc3RhdGljX2IgPSBsb2NhbF9hOworfQorCitpbnQKK2Z1bmMxICgpCit7CisgIC8qIFRoZSBwb2ludCBvZiB0aGlzIGlzIHRoYXQgd2Ugd2lsbCBzZXQgYSBicmVha3BvaW50IGF0IHRoaXMgY2FsbC4KKworICAgICBUaGVuLCBpZiBERUNSX1BDX0FGVEVSX0JSRUFLIGVxdWFscyB0aGUgc2l6ZSBvZiBhIGZ1bmN0aW9uIGNhbGwKKyAgICAgaW5zdHJ1Y3Rpb24gKHRydWUgb24gYSBzdW4zIGlmIHRoaXMgaXMgZ2NjLWNvbXBpbGVkLS1GSVhNRSB3ZQorICAgICBzaG91bGQgdXNlIGFzbSgpIHRvIG1ha2UgaXQgd29yayBmb3IgYW55IGNvbXBpbGVyLCBwcmVzZW50IG9yCisgICAgIGZ1dHVyZSksIHRoZW4gd2Ugd2lsbCBlbmQgdXAgYnJhbmNoaW5nIHRvIHRoZSBsb2NhdGlvbiBqdXN0IGFmdGVyCisgICAgIHRoZSBicmVha3BvaW50LiAgQW5kIHdlIGJldHRlciBub3QgY29uZnVzZSB0aGF0IHdpdGggaGl0dGluZyB0aGUKKyAgICAgYnJlYWtwb2ludC4gICovCisgIGZ1bmMyICgpOworICByZXR1cm4gNzM7Cit9CisKK2ludCBtYWluICgpCit7CisgIHN0cnVjdDEudmFsID0gMTsKKyAgc3RydWN0Mi52YWwgPSAyOworICBwdHIxID0gJnN0cnVjdDE7CisgIHB0cjIgPSAmc3RydWN0MjsKKyAgbWFya2VyMSAoKTsKKyAgZnVuYzEgKCk7CisgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IDQ7IGNvdW50KyspIHsKKyAgICBpdmFsMSA9IGNvdW50OworICAgIGl2YWwzID0gY291bnQ7IGl2YWw0ID0gY291bnQ7CisgIH0KKyAgaXZhbDEgPSBjb3VudDsgLyogT3V0c2lkZSBsb29wICovCisgIGl2YWwyID0gY291bnQ7CisgIGl2YWwzID0gY291bnQ7IGl2YWw0ID0gY291bnQ7CisgIG1hcmtlcjIgKCk7CisgIGlmIChkb3JlYWQpCisgICAgeworICAgICAgc3RhdGljIGNoYXIgbXNnW10gPSAidHlwZSBzdHVmZiBmb3IgYnVmIG5vdzoiOworICAgICAgd3JpdGUgKDEsIG1zZywgc2l6ZW9mIChtc2cpIC0gMSk7CisgICAgICByZWFkICgwLCAmYnVmWzBdLCA1KTsKKyAgICB9CisgIG1hcmtlcjQgKCk7CisKKyAgLyogV2UgaGF2ZSBhIHdhdGNocG9pbnQgb24gcHRyMS0+dmFsLiAgSXQgc2hvdWxkIGJlIHRyaWdnZXJlZCBpZgorICAgICBwdHIxJ3MgdmFsdWUgY2hhbmdlcy4gICovCisgIHB0cjEgPSBwdHIyOworCisgIC8qIFRoaXMgc2hvdWxkIG5vdCB0cmlnZ2VyIHRoZSB3YXRjaHBvaW50LiAgSWYgaXQgZG9lcywgdGhlbiB3ZQorICAgICB1c2VkIHRoZSB3cm9uZyB2YWx1ZSBjaGFpbiB0byByZS1pbnNlcnQgdGhlIHdhdGNocG9pbnRzIG9yIHdlCisgICAgIGFyZSBub3QgZXZhbHVhdGluZyB0aGUgd2F0Y2hwb2ludCBleHByZXNzaW9uIGNvcnJlY3RseS4gICovCisgIHN0cnVjdDEudmFsID0gNTsKKyAgbWFya2VyNSAoKTsKKworICAvKiBXZSBoYXZlIGEgd2F0Y2hwb2ludCBvbiBwdHIxLT52YWwuICBJdCBzaG91bGQgYmUgdHJpZ2dlcmVkIGlmCisgICAgIHB0cjEncyB2YWx1ZSBjaGFuZ2VzLiAgKi8KKyAgcHRyMSA9IHB0cjI7CisKKyAgLyogVGhpcyBzaG91bGQgbm90IHRyaWdnZXIgdGhlIHdhdGNocG9pbnQuICBJZiBpdCBkb2VzLCB0aGVuIHdlCisgICAgIHVzZWQgdGhlIHdyb25nIHZhbHVlIGNoYWluIHRvIHJlLWluc2VydCB0aGUgd2F0Y2hwb2ludHMgb3Igd2UKKyAgICAgYXJlIG5vdCBldmFsdWF0aW5nIHRoZSB3YXRjaHBvaW50IGV4cHJlc3Npb24gY29ycmVjdGx5LiAgKi8KKyAgc3RydWN0MS52YWwgPSA1OworICBtYXJrZXI1ICgpOworCisgIC8qIFdlJ3JlIGdvaW5nIHRvIHdhdGNoIGxvY2FscyBvZiBmdW5jMiwgdG8gc2VlIHRoYXQgb3V0LW9mLXNjb3BlCisgICAgIHdhdGNocG9pbnRzIGFyZSBkZXRlY3RlZCBhbmQgcHJvcGVybHkgZGVsZXRlZC4KKyAgICAgKi8KKyAgbWFya2VyNiAoKTsKKworICAvKiBUaGlzIGludm9jYXRpb24gaXMgdXNlZCBmb3Igd2F0Y2hlcyBvZiBhIHNpbmdsZQorICAgICBsb2NhbCB2YXJpYWJsZS4gKi8KKyAgZnVuYzIgKCk7CisKKyAgLyogVGhpcyBpbnZvY2F0aW9uIGlzIHVzZWQgZm9yIHdhdGNoZXMgb2YgYW4gZXhwcmVzc2lvbgorICAgICBpbnZvbHZpbmcgYSBsb2NhbCB2YXJpYWJsZS4gKi8KKyAgZnVuYzIgKCk7CisKKyAgLyogVGhpcyBpbnZvY2F0aW9uIGlzIHVzZWQgZm9yIHdhdGNoZXMgb2YgYSBzdGF0aWMKKyAgICAgKG5vbi1zdGFjay1iYXNlZCkgbG9jYWwgdmFyaWFibGUuICovCisgIGZ1bmMyICgpOworCisgIC8qIFRoaXMgaW52b2NhdGlvbiBpcyB1c2VkIGZvciB3YXRjaGVzIG9mIGEgbG9jYWwgdmFyaWFibGUKKyAgICAgd2hlbiByZWN1cnNpb24gaGFwcGVucy4KKyAgICAgKi8KKyAgbWFya2VyNiAoKTsKKyAgcmVjdXJzZXIgKDIpOworCisgIG1hcmtlcjYgKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvd2F0Y2gtaHAuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAvd2F0Y2gtaHAuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYzNmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC93YXRjaC1ocC5leHAKQEAgLTAsMCArMSw3ODQgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBGcmVkIEZpc2guIChmbmZAY3lnbnVzLmNvbSkKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgIndhdGNoLWhwIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQoraWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworaWYgW2dldF9jb21waWxlcl9pbmZvICR7YmluZmlsZX1dIHsKKyAgICByZXR1cm4gLTE7Cit9CitpZiB7W3NraXBfaHBfdGVzdHMgJGdjY19jb21waWxlZF19IHRoZW4geyBjb250aW51ZSB9CisKKyMgUHJlcGFyZSBmb3Igd2F0Y2hwb2ludCB0ZXN0cyBieSBzZXR0aW5nIHVwIHR3byBicmVha3BvaW50cyBhbmQgb25lCisjIHdhdGNocG9pbnQuCisjCisjIFdlIHVzZSBicmVha3BvaW50cyBhdCBtYXJrZXIgZnVuY3Rpb25zIHRvIGdldCBwYXN0IGFsbCB0aGUgc3RhcnR1cCBjb2RlLAorIyBzbyB3ZSBjYW4gZ2V0IHRvIHRoZSB3YXRjaHBvaW50cyBpbiBhIHJlYXNvbmFibGUgYW1vdW50IG9mIHRpbWUgZnJvbSBhCisjIGtub3duIHN0YXJ0aW5nIHBvaW50LgorIworIyBGb3Igc2ltcGxpY2l0eSwgc28gd2UgYWx3YXlzIGtub3cgaG93IHRvIHJlZmVyZW5jZSBzcGVjaWZpYyBicmVha3BvaW50cyBvcgorIyB3YXRjaHBvaW50cyBieSBudW1iZXIsIHdlIGV4cGVjdCBhIHBhcnRpY3VsYXIgb3JkZXJpbmcgYW5kIG51bWJlcmluZyBvZgorIyBlYWNoIGluIHRoZSBjb21iaW5lZCBicmVha3BvaW50L3dhdGNocG9pbnQgdGFibGUsIGFzIGZvbGxvd3M6CisjCisjCU51bWJlcgkJV2hhdAkJV2hlcmUKKyMJMQkJQnJlYWtwb2ludAltYXJrZXIxKCkKKyMJMgkJQnJlYWtwb2ludAltYXJrZXIyKCkKKyMJMwkJV2F0Y2hwb2ludAlpdmFsMworCitwcm9jIGluaXRpYWxpemUge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisgICAgZ2xvYmFsIHNyY2ZpbGUKKworICAgIGlmIFtnZGJfdGVzdCAiYnJlYWsgbWFya2VyMSIgIkJyZWFrcG9pbnQgMSBhdCAkaGV4OiBmaWxlIC4qJHNyY2ZpbGUsIGxpbmUgJGRlY2ltYWwuKiIgInNldCBicmVha3BvaW50IGF0IG1hcmtlcjEiIF0geyAKKyAgICAgIHJldHVybiAwOyAKKyAgICB9CisKKworICAgIGlmIFtnZGJfdGVzdCAiYnJlYWsgbWFya2VyMiIgIkJyZWFrcG9pbnQgMiBhdCAkaGV4OiBmaWxlIC4qJHNyY2ZpbGUsIGxpbmUgJGRlY2ltYWwuKiIgInNldCBicmVha3BvaW50IGF0IG1hcmtlcjIiIF0geyAKKyAgICAgIHJldHVybiAwOyAKKyAgICB9CisKKworICAgIGlmIFtnZGJfdGVzdCAiaW5mbyBicmVhayIgIjFcWyBcXSpicmVha3BvaW50LiptYXJrZXIxLipcclxuMlxbIFxdKmJyZWFrcG9pbnQuKm1hcmtlcjIuKiIgImluZm8gYnJlYWsgaW4gd2F0Y2hwb2ludC5leHAiIF0geyAKKyAgICAgIHJldHVybiAwOyAKKyAgICB9CisKKyMgPz9yZWhyYXVlcjogVG8gZml4IERUUyAjQ0hGdHMyMzAxNCwgaW4gd2hpY2ggc2V0dGluZyBhIHdhdGNocG9pbnQKKyMgYmVmb3JlIHJ1bm5pbmcgY2FuIGNhdXNlIHRoZSBpbmZlcmlvciB0byBjcm9hayBvbiBIUC1VWCAxMC4zMCBhbmQKKyMgMTEuMCBmb3IgcmVhc29ucyBhcyB5ZXQgdW5rbm93biwgd2UndmUgZGlzYWJsZWQgdGhlIGFiaWxpdHkgdG8gc2V0CisjIHdhdGNoZXMgd2l0aG91dCBhIHJ1bm5pbmcgaW5mZXJpb3IuICBWZXJpZnkgdGhlIHJlc3RyaWN0aW9uLgorIworICAgIHNlbmRfZ2RiICJ3YXRjaCBpdmFsM1xuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIi4qY2FuJ3QgZG8gdGhhdCB3aXRob3V0IGEgcnVubmluZyBwcm9ncmFtOyB0cnkgXCJicmVhayBtYWluXCIsIFwicnVuXCIgZmlyc3QuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAic2V0IHdhdGNocG9pbnQgb24gaXZhbDMiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInNldCB3YXRjaHBvaW50IG9uIGl2YWwzIiAgfQorCXRpbWVvdXQgeyBmYWlsICJzZXQgd2F0Y2hwb2ludCBvbiBpdmFsMyAodGltZW91dCkiICB9CisgICAgfQorCisKKyMgICAgaWYgW2dkYl90ZXN0ICJ3YXRjaCBpdmFsMyIgIi4qXFtXd1xdYXRjaHBvaW50IDM6IGl2YWwzIiAic2V0IHdhdGNocG9pbnQgb24gaXZhbDMiIF0geyAKKyMgICAgICByZXR1cm4gMDsgCisjICAgIH0KKworCisgICAgIyAiaW5mbyB3YXRjaCIgaXMgdGhlIHNhbWUgYXMgImluZm8gYnJlYWsiCisKKyMgICAgaWYgW2dkYl90ZXN0ICJpbmZvIHdhdGNoIiAiMVxbIFxdKmJyZWFrcG9pbnQuKm1hcmtlcjEuKlxyXG4yXFsgXF0qYnJlYWtwb2ludC4qbWFya2VyMi4qXHJcbjNcWyBcXSouKndhdGNocG9pbnQuKml2YWwzIiAid2F0Y2hwb2ludCBmb3VuZCBpbiB3YXRjaHBvaW50L2JyZWFrcG9pbnQgdGFibGUiIF0geyAKKyMgICAgICByZXR1cm4gMDsgCisjICAgIH0KKworCisgICAgIyBBZnRlciBpbnN0YWxsaW5nIHRoZSB3YXRjaHBvaW50LCB3ZSBkaXNhYmxlIGl0IHVudGlsIHdlIGFyZSByZWFkeQorICAgICMgdG8gdXNlIGl0LiAgVGhpcyBhbGxvd3MgdGhlIHRlc3QgcHJvZ3JhbSB0byBydW4gYXQgZnVsbCBzcGVlZCB1bnRpbAorICAgICMgd2UgZ2V0IHRvIHRoZSBmaXJzdCBtYXJrZXIgZnVuY3Rpb24uCisKKyMgICAgaWYgW2dkYl90ZXN0ICJkaXNhYmxlIDMiICJkaXNhYmxlIDNcW1xyXG5cXSsiICJkaXNhYmxlIHdhdGNocG9pbnQiIF0geyAKKyMgICAgICByZXR1cm4gMDsgCisjICAgIH0KKworCisgICAgcmV0dXJuIDEKK30KKworIworIyBUZXN0IHNpbXBsZSB3YXRjaHBvaW50LgorIworCitwcm9jIHRlc3Rfc2ltcGxlX3dhdGNocG9pbnQge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGhleAorICAgIGdsb2JhbCBkZWNpbWFsCisKKyAgICAjIEVuc3VyZSB0aGF0IHRoZSB3YXRjaHBvaW50IGlzIGRpc2FibGVkIHdoZW4gd2Ugc3RhcnR1cC4KKworIyAgICBpZiBbZ2RiX3Rlc3QgImRpc2FibGUgMyIgIl5kaXNhYmxlIDNcW1xyXG5cXSsiICJkaXNhYmxlIHdhdGNocG9pbnQgaW4gdGVzdF9zaW1wbGVfd2F0Y2hwb2ludCIgXSB7IAorIyAgICAgIHJldHVybiAwOyAKKyMgICAgfQorCisKKyAgICAjIFJ1biB1bnRpbCB3ZSBnZXQgdG8gdGhlIGZpcnN0IG1hcmtlciBmdW5jdGlvbi4KKworICAgIGdkYl9ydW5fY21kCisgICAgc2V0IHRpbWVvdXQgNjAwCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJCcmVha3BvaW50IDEsIG1hcmtlcjEgLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInJ1biB0byBtYXJrZXIxIGluIHRlc3Rfc2ltcGxlX3dhdGNocG9pbnQiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInJ1biB0byBtYXJrZXIxIGluIHRlc3Rfc2ltcGxlX3dhdGNocG9pbnQiCisJICAgIHJldHVybgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAicnVuIHRvIG1hcmtlcjEgaW4gdGVzdF9zaW1wbGVfd2F0Y2hwb2ludCAodGltZW91dCkiCisJICAgIHJldHVybgorCX0KKyAgICB9CisjKioqKioqKioqKioqKioqKioqKioqKioqCisKKyMgPz9yZWhyYXVlcjogVG8gZml4IERUUyAjQ0hGdHMyMzAxNCwgaW4gd2hpY2ggc2V0dGluZyBhIHdhdGNocG9pbnQKKyMgYmVmb3JlIHJ1bm5pbmcgY2FuIGNhdXNlIHRoZSBpbmZlcmlvciB0byBjcm9hayBvbiBIUC1VWCAxMC4zMCBhbmQKKyMgMTEuMCBmb3IgcmVhc29ucyBhcyB5ZXQgdW5rbm93biwgd2UndmUgZGlzYWJsZWQgdGhlIGFiaWxpdHkgdG8gc2V0CisjIHdhdGNoZXMgd2l0aG91dCBhIHJ1bm5pbmcgaW5mZXJpb3IuICBUaGUgZm9sbG93aW5nIHRlc3Rwb2ludHMgdXNlZAorIyB0byBiZSBpbiBbaW5pdGlhbGl6ZV0uCisjCisgICAgc2VuZF9nZGIgIndhdGNoIGl2YWwzXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKlxbV3dcXWF0Y2hwb2ludCAzOiBpdmFsM1xyXG4kZ2RiX3Byb21wdCAkIiB7IAorCSAgICBwYXNzICJzZXQgd2F0Y2hwb2ludCBvbiBpdmFsMyIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAic2V0IHdhdGNocG9pbnQgb24gaXZhbDMiICB9CisJdGltZW91dCB7IGZhaWwgInNldCB3YXRjaHBvaW50IG9uIGl2YWwzICh0aW1lb3V0KSIgIH0KKyAgICB9CisKKyAgICAjICJpbmZvIHdhdGNoIiBpcyB0aGUgc2FtZSBhcyAiaW5mbyBicmVhayIKKworICAgIHNlbmRfZ2RiICJpbmZvIHdhdGNoXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIxXFsgXF0qYnJlYWtwb2ludC4qbWFya2VyMS4qXHJcbjJcWyBcXSpicmVha3BvaW50LiptYXJrZXIyLipcclxuM1xbIFxdKi4qd2F0Y2hwb2ludC4qaXZhbDNcclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJ3YXRjaHBvaW50IGZvdW5kIGluIHdhdGNocG9pbnQvYnJlYWtwb2ludCB0YWJsZSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAid2F0Y2hwb2ludCBmb3VuZCBpbiB3YXRjaHBvaW50L2JyZWFrcG9pbnQgdGFibGUiIAorCX0KKwl0aW1lb3V0IHsKKwkgICBmYWlsICJ3YXRjaHBvaW50IGZvdW5kIGluIHdhdGNocG9pbnQvYnJlYWtwb2ludCB0YWJsZSIgCisJfQorICAgIH0KKworICAgICMgQWZ0ZXIgaW5zdGFsbGluZyB0aGUgd2F0Y2hwb2ludCwgd2UgZGlzYWJsZSBpdCB1bnRpbCB3ZSBhcmUgcmVhZHkKKyAgICAjIHRvIHVzZSBpdC4gIFRoaXMgYWxsb3dzIHRoZSB0ZXN0IHByb2dyYW0gdG8gcnVuIGF0IGZ1bGwgc3BlZWQgdW50aWwKKyAgICAjIHdlIGdldCB0byB0aGUgZmlyc3QgbWFya2VyIGZ1bmN0aW9uLgorCisgICAgc2VuZF9nZGIgImRpc2FibGUgM1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiZGlzYWJsZSAzXFtcclxuXF0rJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJkaXNhYmxlIHdhdGNocG9pbnQiIH0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJkaXNhYmxlIHdhdGNocG9pbnQiICB9CisJdGltZW91dCB7IGZhaWwgImRpc2FibGUgd2F0Y2hwb2ludCAodGltZW91dCkiICB9CisgICAgfQorIyoqKioqKgorICAgICMgQWZ0ZXIgcmVhY2hpbmcgdGhlIG1hcmtlciBmdW5jdGlvbiwgZW5hYmxlIHRoZSB3YXRjaHBvaW50LgorCisgICAgaWYgW2dkYl90ZXN0ICJlbmFibGUgMyIgIl5lbmFibGUgM1xbXHJcblxdKyIgImVuYWJsZSB3YXRjaHBvaW50IiBdIHsgCisgICAgICByZXR1cm4gOyAKKyAgICB9CisKKworICAgIGdkYl90ZXN0ICJicmVhayBmdW5jMSIgIkJyZWFrcG9pbnQuKmF0LioiCisgICAgZ2RiX3Rlc3QgInNldCBcJGZ1bmMxX2JyZWFrcG9pbnRfbnVtYmVyID0gXCRicG51bSIgIiIKKworICAgIGdkYl90ZXN0ICJjb250aW51ZSIgIkNvbnRpbnVpbmcuKkJyZWFrcG9pbnQgXFswLTlcXSosIGZ1bmMxLioiIFwKKwkiY29udGludWUgdG8gYnJlYWtwb2ludCBhdCBmdW5jMSIKKworICAgICMgQ29udGludWUgdW50aWwgdGhlIGZpcnN0IGNoYW5nZSwgZnJvbSAtMSB0byAwCisKKyAgICBzZW5kX2dkYiAiY29udFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiQ29udGludWluZy4qXFtXd1xdYXRjaHBvaW50LippdmFsMy4qT2xkIHZhbHVlID0gLTEuKk5ldyB2YWx1ZSA9IDAuKml2YWwzID0gY291bnQ7IGl2YWw0ID0gY291bnQ7LiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgIndhdGNocG9pbnQgaGl0LCBmaXJzdCB0aW1lIgorCX0KKwktcmUgIkNvbnRpbnVpbmcuKkJyZWFrcG9pbnQuKmZ1bmMxLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldHVwX3hmYWlsICJtNjgqLSotKiIgMjU5NworCSAgICBmYWlsICJ0aG91Z2h0IGl0IGhpdCBicmVha3BvaW50IGF0IGZ1bmMxIHR3aWNlIgorCSAgICBnZGJfdGVzdCAiZGVsZXRlIFwkZnVuYzFfYnJlYWtwb2ludF9udW1iZXIiICIiCisJICAgIGdkYl90ZXN0ICJjb250aW51ZSIgIlwKK0NvbnRpbnVpbmcuKlxbV3dcXWF0Y2hwb2ludC4qaXZhbDMuKk9sZCB2YWx1ZSA9IC0xLipOZXcgdmFsdWUgPSAwLippdmFsMyA9IGNvdW50OyIgXAorCQkid2F0Y2hwb2ludCBoaXQsIGZpcnN0IHRpbWUiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgIndhdGNocG9pbnQgaGl0LCBmaXJzdCB0aW1lIiA7IHJldHVybiB9CisJdGltZW91dCB7IGZhaWwgIndhdGNocG9pbnQgaGl0LCBmaXJzdCB0aW1lICh0aW1lb3V0KSIgOyByZXR1cm4gfQorCWVvZiB7IGZhaWwgIndhdGNocG9pbnQgaGl0LCBmaXJzdCB0aW1lIChlb2YpIiA7IHJldHVybiB9CisgICAgfQorCisgICAgZ2RiX3Rlc3QgImRlbGV0ZSBcJGZ1bmMxX2JyZWFrcG9pbnRfbnVtYmVyIiAiIgorCisgICAgIyBDb250aW51ZSB1bnRpbCB0aGUgbmV4dCBjaGFuZ2UsIGZyb20gMCB0byAxLgorICAgIGdkYl90ZXN0ICJjb250IiAiQ29udGludWluZy4qXFtXd1xdYXRjaHBvaW50LippdmFsMy4qT2xkIHZhbHVlID0gMC4qTmV3IHZhbHVlID0gMS4qaXZhbDMgPSBjb3VudDsgaXZhbDQgPSBjb3VudDsuKiIgIndhdGNocG9pbnQgaGl0LCBzZWNvbmQgdGltZSIKKworICAgICMgQ29udGludWUgdW50aWwgdGhlIG5leHQgY2hhbmdlLCBmcm9tIDEgdG8gMi4KKyAgICBnZGJfdGVzdCAiY29udCIgIkNvbnRpbnVpbmcuKlxbV3dcXWF0Y2hwb2ludC4qaXZhbDMuKk9sZCB2YWx1ZSA9IDEuKk5ldyB2YWx1ZSA9IDIuKml2YWwzID0gY291bnQ7IGl2YWw0ID0gY291bnQ7LioiICJ3YXRjaHBvaW50IGhpdCwgdGhpcmQgdGltZSIKKyAgICAKKyAgICAjIENvbnRpbnVlIHVudGlsIHRoZSBuZXh0IGNoYW5nZSwgZnJvbSAyIHRvIDMuCisgICAgZ2RiX3Rlc3QgImNvbnQiICJDb250aW51aW5nLipcW1d3XF1hdGNocG9pbnQuKml2YWwzLipPbGQgdmFsdWUgPSAyLipOZXcgdmFsdWUgPSAzLippdmFsMyA9IGNvdW50OyBpdmFsNCA9IGNvdW50Oy4qIiAid2F0Y2hwb2ludCBoaXQsIGZvdXJ0aCB0aW1lIgorCisgICAgIyBDb250aW51ZSB1bnRpbCB0aGUgbmV4dCBjaGFuZ2UsIGZyb20gMyB0byA0LgorICAgICMgTm90ZSB0aGF0IHRoaXMgb25lIGlzIG91dHNpZGUgdGhlIGxvb3AuCisKKyAgICBnZGJfdGVzdCAiY29udCIgIkNvbnRpbnVpbmcuKlxbV3dcXWF0Y2hwb2ludC4qaXZhbDMuKk9sZCB2YWx1ZSA9IDMuKk5ldyB2YWx1ZSA9IDQuKml2YWwzID0gY291bnQ7IGl2YWw0ID0gY291bnQ7LioiICJ3YXRjaHBvaW50IGhpdCwgZmlmdGggdGltZSIKKworICAgICMgQ29udGludWUgdW50aWwgd2UgaGl0IHRoZSBmaW5pc2hpbmcgbWFya2VyIGZ1bmN0aW9uLgorICAgICMgTWFrZSBzdXJlIHdlIGhpdCBubyBtb3JlIHdhdGNocG9pbnRzLgorCisgICAgZ2RiX3Rlc3QgImNvbnQiICJDb250aW51aW5nLipCcmVha3BvaW50LiptYXJrZXIyIFwoXCkuKiIgXAorCSJjb250aW51ZSB0byBtYXJrZXIyIgorCisgICAgIyBEaXNhYmxlIHRoZSB3YXRjaHBvaW50IHNvIHdlIHJ1biBhdCBmdWxsIHNwZWVkIHVudGlsIHdlIGV4aXQuCisKKyAgICBpZiBbZ2RiX3Rlc3QgImRpc2FibGUgMyIgIl5kaXNhYmxlIDNcW1xyXG5cXSsiICJ3YXRjaHBvaW50IGRpc2FibGVkIiBdIHsgCisgICAgICByZXR1cm4gOyAKKyAgICB9CisKKworICAgICMgUnVuIHVudGlsIHByb2Nlc3MgZXhpdHMuCisKKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYixub3Jlc3VsdHNdIHsgcmV0dXJuIH0KKworICAgIGdkYl90ZXN0ICJjb250IiAiQ29udGludWluZy4qUHJvZ3JhbSBleGl0ZWQgbm9ybWFsbHkuKiIgXAorCSJjb250aW51ZSB0byBleGl0IGluIHRlc3Rfc2ltcGxlX3dhdGNocG9pbnQiCit9CisKKyMgVGVzdCBkaXNhYmxpbmcgd2F0Y2hwb2ludHMuCisKK3Byb2MgdGVzdF9kaXNhYmxpbmdfd2F0Y2hwb2ludHMge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGJpbmZpbGUKKyAgICBnbG9iYWwgc3JjZmlsZQorICAgIGdsb2JhbCBkZWNpbWFsCisgICAgZ2xvYmFsIGhleAorCisgICAgIyBFbnN1cmUgdGhhdCB0aGUgd2F0Y2hwb2ludCBpcyBkaXNhYmxlZCB3aGVuIHdlIHN0YXJ0dXAuCisKKyAgICBpZiBbZ2RiX3Rlc3QgImRpc2FibGUgMyIgIl5kaXNhYmxlIDNcW1xyXG5cXSsiICJkaXNhYmxlIHdhdGNocG9pbnQgaW4gdGVzdF9kaXNhYmxpbmdfd2F0Y2hwb2ludHMiIF0geyAKKyAgICAgIHJldHVybiAwOyAKKyAgICB9CisKKworICAgICMgUnVuIHVudGlsIHdlIGdldCB0byB0aGUgZmlyc3QgbWFya2VyIGZ1bmN0aW9uLgorCisgICAgZ2RiX3J1bl9jbWQKKyAgICBzZXQgdGltZW91dCA2MDAKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIkJyZWFrcG9pbnQgMSwgbWFya2VyMSAuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicnVuIHRvIG1hcmtlcjEgaW4gdGVzdF9kaXNhYmxpbmdfd2F0Y2hwb2ludHMiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgInJ1biB0byBtYXJrZXIxIGluIHRlc3RfZGlzYWJsaW5nX3dhdGNocG9pbnRzIgorCSAgICByZXR1cm4KKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInJ1biB0byBtYXJrZXIxIGluIHRlc3RfZGlzYWJsaW5nX3dhdGNocG9pbnRzICh0aW1lb3V0KSIKKwkgICAgcmV0dXJuCisJfQorICAgIH0KKworICAgICMgQWZ0ZXIgcmVhY2hpbmcgdGhlIG1hcmtlciBmdW5jdGlvbiwgZW5hYmxlIHRoZSB3YXRjaHBvaW50LgorCisgICAgaWYgW2dkYl90ZXN0ICJlbmFibGUgMyIgIl5lbmFibGUgM1xbXHJcblxdKyIgIndhdGNocG9pbnQgZW5hYmxlZCIgXSB7IAorICAgICAgcmV0dXJuIDsgCisgICAgfQorCisKKyAgICAjIENvbnRpbnVlIHVudGlsIHRoZSBmaXJzdCBjaGFuZ2UsIGZyb20gLTEgdG8gMAorICAgICMgRG9uJ3QgY2hlY2sgdGhlIG9sZCB2YWx1ZSwgYmVjYXVzZSBvbiBWeFdvcmtzIHRoZSB2YXJpYWJsZSB2YWx1ZQorICAgICMgd2lsbCBub3QgaGF2ZSBiZWVuIHJlaW5pdGlhbGl6ZWQuCisgICAgZ2RiX3Rlc3QgImNvbnQiICJDb250aW51aW5nLipcW1d3XF1hdGNocG9pbnQuKml2YWwzLipPbGQgdmFsdWUgPSAuKk5ldyB2YWx1ZSA9IDAuKml2YWwzID0gY291bnQ7IGl2YWw0ID0gY291bnQ7LioiICJ3YXRjaHBvaW50IGhpdCBpbiB0ZXN0X2Rpc2FibGluZ193YXRjaHBvaW50cywgZmlyc3QgdGltZSIKKyAgICAKKyAgICAjIENvbnRpbnVlIHVudGlsIHRoZSBuZXh0IGNoYW5nZSwgZnJvbSAwIHRvIDEuCisgICAgZ2RiX3Rlc3QgImNvbnQiICJDb250aW51aW5nLipcW1d3XF1hdGNocG9pbnQuKml2YWwzLipPbGQgdmFsdWUgPSAwLipOZXcgdmFsdWUgPSAxLippdmFsMyA9IGNvdW50OyBpdmFsNCA9IGNvdW50Oy4qIiAid2F0Y2hwb2ludCBoaXQgaW4gdGVzdF9kaXNhYmxpbmdfd2F0Y2hwb2ludHMsIHNlY29uZCB0aW1lIgorICAgIAorICAgICMgRGlzYWJsZSB0aGUgd2F0Y2hwb2ludCBidXQgbGVhdmUgYnJlYWtwb2ludHMKKworICAgIGlmIFtnZGJfdGVzdCAiZGlzYWJsZSAzIiAiXmRpc2FibGUgM1xbXHJcblxdKyIgImRpc2FibGUgd2F0Y2hwb2ludCAjMiBpbiB0ZXN0X2Rpc2FibGluZ193YXRjaHBvaW50cyIgXSB7IAorICAgICAgcmV0dXJuIDA7IAorICAgIH0KKworCisgICAgIyBDaGVjayB3YXRjaHBvaW50IGxpc3QsIGxvb2tpbmcgZm9yIHRoZSBlbnRyeSB0aGF0IGNvbmZpcm1zIHRoZQorICAgICMgd2F0Y2hwb2ludCBpcyBkaXNhYmxlZC4KKyAgICBnZGJfdGVzdCAiaW5mbyB3YXRjaHBvaW50cyIgIjNcWyBcXSouKndhdGNocG9pbnRcWyBcXSprZWVwXFsgXF0qblxbIFxdKml2YWwzXHJcbi4qIiAid2F0Y2hwb2ludCBkaXNhYmxlZCBpbiB0YWJsZSIKKworICAgICMgQ29udGludWUgdW50aWwgd2UgaGl0IHRoZSBmaW5pc2hpbmcgbWFya2VyIGZ1bmN0aW9uLgorICAgICMgTWFrZSBzdXJlIHdlIGhpdCBubyBtb3JlIHdhdGNocG9pbnRzLgorICAgIGdkYl90ZXN0ICJjb250IiAiQ29udGludWluZy4qQnJlYWtwb2ludC4qbWFya2VyMiBcXChcXCkuKiIgXAorCSJkaXNhYmxlZCB3YXRjaHBvaW50IHNraXBwZWQiCisgICAgCisgICAgaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGIsbm9yZXN1bHRzXSB7IHJldHVybiB9CisKKyAgICBnZGJfdGVzdCAiY29udCIgIkNvbnRpbnVpbmcuKlByb2dyYW0gZXhpdGVkIG5vcm1hbGx5LioiIFwKKwkiY29udGludWUgdG8gZXhpdCBpbiB0ZXN0X2Rpc2FibGluZ193YXRjaHBvaW50cyIKK30KKworIyBUZXN0IHN0ZXBwaW5nIGFuZCBvdGhlciBtdW5kYW5lIG9wZXJhdGlvbnMgd2l0aCB3YXRjaHBvaW50cyBlbmFibGVkCitwcm9jIHRlc3Rfc3RlcHBpbmcge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBpZiBbcnVudG8gbWFya2VyMV0gdGhlbiB7CisJZ2RiX3Rlc3QgIndhdGNoIGl2YWwyIiAiLipcW1d3XF1hdGNocG9pbnQgXFswLTlcXSo6IGl2YWwyIgorCisJIyBXZWxsLCBsZXQncyBub3QgYmUgdG9vIG11bmRhbmUuICBJdCBzaG91bGQgYmUgYSAqYml0KiBvZiBhIGNoYWxsZW5nZQorCWdkYl90ZXN0ICJicmVhayBmdW5jMiBpZiAwIiAiQnJlYWtwb2ludC4qYXQuKiIKKwlnZGJfdGVzdCAicCBcJGZ1bmMyX2JyZWFrcG9pbnRfbnVtYmVyID0gXCRicG51bSIgIiA9IC4qIgorCisJIyBUaGUgSFBQQSBoYXMgYSBwcm9ibGVtIGhlcmUgaWYgaXQncyBub3QgdXNpbmcgaGFyZHdhcmUgd2F0Y2hwb2ludHMKKwlpZiB7WyBpc3RhcmdldCAiaHBwYSotKi0qIiBdICYmICFbIGlzdGFyZ2V0ICJocHBhKi0qLSpic2QqIiBdfSB0aGVuIHsKKwkgICAgIyBEb24ndCBhY3R1YWxseSB0cnkgZG9pbmcgdGhlIGNhbGwsIGlmIHdlIGRvIHdlIGNhbid0IGNvbnRpbnVlLgorCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJICAgIGZhaWwgImNhbGxpbmcgZnVuY3Rpb24gd2l0aCB3YXRjaHBvaW50IGVuYWJsZWQiCisJfSBlbHNlIHsKKwkgICAgIyBUaGUgcHJvYmxlbSBpcyB0aGF0IEdEQiBjb25mdXNlcyBzdGVwcGluZyB0aHJvdWdoIHRoZSBjYWxsCisJICAgICMgZHVtbXkgd2l0aCBoaXR0aW5nIHRoZSBicmVha3BvaW50IGF0IHRoZSBlbmQgb2YgdGhlIGNhbGwgZHVtbXkuCisJICAgICMgV2lsbCBiZSBmaXhlZCBvbmNlIGFsbCBhcmNoaXRlY3R1cmVzIGRlZmluZSAKKwkgICAgIyBDQUxMX0RVTU1ZX0JSRUFLUE9JTlRfT0ZGU0VULgorCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJICAgICMgVGhpcyBkb2Vzbid0IG9jY3VyIGlmIHRoZSBjYWxsIGR1bW15IHN0YXJ0cyB3aXRoIGEgY2FsbCwKKwkgICAgIyBiZWNhdXNlIHdlIGFyZSBvdXQgb2YgdGhlIGR1bW15IGJ5IHRoZSBmaXJzdCB0aW1lIHRoZSBpbmZlcmlvcgorCSAgICAjIHN0b3BzLgorCSAgICBjbGVhcl94ZmFpbCAiZDEwdiotKi0qIgorCSAgICBjbGVhcl94ZmFpbCAibTY4Ki0qLSoiCisJICAgIGNsZWFyX3hmYWlsICJpKjg2Ki0qLSoiCisJICAgIGNsZWFyX3hmYWlsICJ2YXgtKi0qIgorCSAgICAjIFRoZSBmb2xsb3dpbmcgYXJjaGl0ZWN0dXJlcyBkZWZpbmUgQ0FMTF9EVU1NWV9CUkVBS1BPSU5UX09GRlNFVC4KKwkgICAgY2xlYXJfeGZhaWwgImFscGhhLSotKiIKKwkgICAgY2xlYXJfeGZhaWwgIm1pcHMqLSotKiIKKwkgICAgY2xlYXJfeGZhaWwgInNwYXJjLSotKiIKKwkgICAgY2xlYXJfeGZhaWwgImhwcGEqLSotKmJzZCoiCisJICAgICMgSXQgd29ya3Mgd2l0aCB0aGUgZ2VuZXJpYyBpbmZlcmlvciBmdW5jdGlvbiBjYWxsaW5nIGNvZGUgdG9vLgorCSAgICBjbGVhcl94ZmFpbCAibW4xMDIwMCotKi0qIgorCSAgICBjbGVhcl94ZmFpbCAibW4xMDMwMCotKi0qIgorCSAgICBnZGJfdGVzdCAicCBmdW5jMSAoKSIgIj0gNzMiIFwKKwkJImNhbGxpbmcgZnVuY3Rpb24gd2l0aCB3YXRjaHBvaW50IGVuYWJsZWQiCisJfQorCisJIyAKKwkjICJmaW5pc2giIGJyaW5ncyB1cyBiYWNrIHRvIG1haW4uCisJIyBPbiBzb21lIHRhcmdldHMgKGUuZy4gYWxwaGEpIGdkYiB3aWxsIHN0b3AgZnJvbSB0aGUgZmluaXNoIGluIG1pZGxpbmUKKwkjIG9mIHRoZSBtYXJrZXIxIGNhbGwuIFRoaXMgaXMgZHVlIHRvIHJlZ2lzdGVyIHJlc3RvcmluZyBjb2RlIG9uCisJIyB0aGUgYWxwaGEgYW5kIG1pZ2h0IGJlIGNhdXNlZCBieSBzdGFjayBhZGp1c3RtZW50IGluc3RydWN0aW9ucworCSMgb24gb3RoZXIgdGFyZ2V0cy4gSW4gdGhpcyBjYXNlIHdlIHdpbGwgc3RlcCBvbmNlIG1vcmUuCisJIworCisJc2VuZF9nZGIgImZpbmlzaFxuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIlJ1bi4qZXhpdCBmcm9tLiptYXJrZXIxLiogYXQiIHsgfQorCSAgICBkZWZhdWx0IHsgZmFpbCAiZmluaXNoIGZyb20gbWFya2VyMSIgOyByZXR1cm4gfQorCX0KKworCWdkYl9leHBlY3QgeworCSAgICAtcmUgIm1hcmtlcjEgXFwoXFwpOy4qJGdkYl9wcm9tcHQgJCIgeworCQlzZW5kX2dkYiAic3RlcFxuIgorCQlleHBfY29udGludWUKKwkgICAgfQorCSAgICAtcmUgImZ1bmMxIFxcKFxcKTsuKiRnZGJfcHJvbXB0ICQiIHsKKwkJcGFzcyAiZmluaXNoIGZyb20gbWFya2VyMSIKKwkgICAgfQorCSAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCQlmYWlsICJmaW5pc2ggZnJvbSBtYXJrZXIxIgorCSAgICB9CisJICAgIGRlZmF1bHQgeyBmYWlsICJmaW5pc2ggZnJvbSBtYXJrZXIxIiA7IHJldHVybiB9CisJfQorCisJZ2RiX3Rlc3QgIm5leHQiICJmb3IgXFwoY291bnQgPSAwLioiICJuZXh0IHRvIGBmb3InIGluIHdhdGNocG9pbnQuZXhwIgorCisJIyBOb3cgdGVzdCB0aGF0ICJ1bnRpbCIgd29ya3MuICBJdCdzIGEgYml0IHRyaWNreSB0byB0ZXN0CisJIyAidW50aWwiLCBiZWNhdXNlIGNvbXBpbGVycyBkb24ndCBhbHdheXMgYXJyYW5nZSB0aGUgY29kZQorCSMgZXhhY3RseSB0aGUgc2FtZSB3YXksIGFuZCB3ZSBtaWdodCBnZXQgc2xpZ2h0bHkgZGlmZmVyZW50CisJIyBzZXF1ZW5jZXMgb2Ygc3RhdGVtZW50cy4gIEJ1dCB0aGUgZm9sbG93aW5nIHNob3VsZCBiZSB0cnVlCisJIyAoaWYgbm90IGl0IGlzIGEgY29tcGlsZXIgb3IgYSBkZWJ1Z2dlciBidWcpOiBUaGUgdXNlciB3aG8KKwkjIGRvZXMgInVudGlsIiBhdCBldmVyeSBzdGF0ZW1lbnQgb2YgYSBsb29wIHNob3VsZCBlbmQgdXAKKwkjIHN0ZXBwaW5nIHRocm91Z2ggdGhlIGxvb3Agb25jZSwgYW5kIHRoZSBkZWJ1Z2dlciBzaG91bGQgbm90CisJIyBzdG9wIGZvciBhbnkgb2YgdGhlIHJlbWFpbmluZyBpdGVyYXRpb25zLgorCisJZ2RiX3Rlc3QgInVudGlsIiAiaXZhbDEgPSBjb3VudC4qIiAidW50aWwgdG8gaXZhbDEgYXNzaWdubWVudCIKKwlnZGJfdGVzdCAidW50aWwiICJpdmFsMyA9IGNvdW50LioiICJ1bnRpbCB0byBpdmFsMyBhc3NpZ25tZW50IgorCXNlbmRfZ2RiICJ1bnRpbFxuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIihmb3IgXFwoY291bnQgPSAwfFx9KS4qJGdkYl9wcm9tcHQgJCIgeworCQlnZGJfdGVzdCAidW50aWwiICJpdmFsMSA9IGNvdW50OyAvLiBPdXRzaWRlIGxvb3AgLi8iIFwKKwkJICAgICJ1bnRpbCBvdXQgb2YgbG9vcCIKKwkgICAgfQorCSAgICAtcmUgIml2YWwxID0gY291bnQ7IC8uIE91dHNpZGUgbG9vcCAuLy4qJGdkYl9wcm9tcHQgJCIgeworCQlwYXNzICJ1bnRpbCBvdXQgb2YgbG9vcCIKKwkgICAgfQorCSAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCQlmYWlsICJ1bnRpbCBvdXQgb2YgbG9vcCIKKwkgICAgfQorCSAgICBkZWZhdWx0IHsgZmFpbCAidW50aWwgb3V0IG9mIGxvb3AiIDsgcmV0dXJuIH0KKwl9CisKKwlnZGJfdGVzdCAic3RlcCIgIml2YWwyID0gY291bnQuKiIgInN0ZXAgdG8gaXZhbDIgYXNzaWdubWVudCIKKyAgICB9Cit9CisKKyMgVGVzdCBzdGVwcGluZyBhbmQgb3RoZXIgbXVuZGFuZSBvcGVyYXRpb25zIHdpdGggd2F0Y2hwb2ludHMgZW5hYmxlZAorcHJvYyB0ZXN0X3dhdGNocG9pbnRfdHJpZ2dlcmVkX2luX3N5c2NhbGwge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYixub2luZmVyaW9yaW9dIHsKKwl2ZXJib3NlICJTa2lwcGluZyB0ZXN0X3dhdGNocG9pbnRfdHJpZ2dlcmVkX2luX3N5c2NhbGwgZHVlIHRvIG5vaW5mZXJpb3JpbyIKKwlyZXR1cm4KKyAgICB9CisgICAgIyBSdW4gdW50aWwgd2UgZ2V0IHRvIHRoZSBmaXJzdCBtYXJrZXIgZnVuY3Rpb24uCisgICAgc2V0IHggMAorICAgIHNldCB5IDAKKyAgICBzZXQgdGVzdG5hbWUgIldhdGNoIGJ1ZmZlciBwYXNzZWQgdG8gcmVhZCBzeXNjYWxsIgorICAgIGlmIFtydW50byBtYXJrZXIyXSB0aGVuIHsKKwlnZGJfdGVzdCAid2F0Y2ggYnVmXFswXF0iICIuKlxbV3dcXWF0Y2hwb2ludCBcWzAtOVxdKjogYnVmXFxcWzBcXFxdIgorCWdkYl90ZXN0ICJ3YXRjaCBidWZcWzFcXSIgIi4qXFtXd1xdYXRjaHBvaW50IFxbMC05XF0qOiBidWZcXFxbMVxcXF0iCisJZ2RiX3Rlc3QgIndhdGNoIGJ1ZlxbMlxdIiAiLipcW1d3XF1hdGNocG9pbnQgXFswLTlcXSo6IGJ1ZlxcXFsyXFxcXSIKKwlnZGJfdGVzdCAid2F0Y2ggYnVmXFszXF0iICIuKlxbV3dcXWF0Y2hwb2ludCBcWzAtOVxdKjogYnVmXFxcWzNcXFxdIgorCWdkYl90ZXN0ICJ3YXRjaCBidWZcWzRcXSIgIi4qXFtXd1xdYXRjaHBvaW50IFxbMC05XF0qOiBidWZcXFxbNFxcXF0iCisJZ2RiX3Rlc3QgImJyZWFrIG1hcmtlcjQiICIuKkJyZWFrcG9pbnQuKiIKKworCWdkYl90ZXN0ICJzZXQgZG9yZWFkID0gMSIgIiIKKworCSMgSWYgd2Ugc2VuZF9nZGIgIjEyM1xuIiBiZWZvcmUgZ2RiIGhhcyBzd2l0Y2hlZCB0aGUgdHR5LCB0aGVuIGl0IGdvZXMKKwkjIHRvIGdkYiwgbm90IHRoZSBpbmZlcmlvciwgYW5kIHdlIGxvc2UuICBTbyB0aGF0IGlzIHdoeSB3ZSBoYXZlCisJIyB3YXRjaHBvaW50LmMgcHJvbXB0IHVzLCBzbyB3ZSBjYW4gd2FpdCBmb3IgdGhhdCBwcm9tcHQuCisJc2VuZF9nZGIgImNvbnRpbnVlXG4iOworCWdkYl9leHBlY3QgeworCSAgICAtcmUgIkNvbnRpbnVpbmdcXC5cclxudHlwZSBzdHVmZiBmb3IgYnVmIG5vdzoiIHsKKwkJcGFzcyAiY29udGludWUgdG8gcmVhZCIKKwkgICAgfQorCSAgICBkZWZhdWx0IHsKKwkJZmFpbCAiY29udGludWUgdG8gcmVhZCI7CisJCXJldHVybiA7CisJICAgIH0KKwl9CisKKwlzZW5kX2dkYiAiMTIzXG4iCisJZ2RiX2V4cGVjdCB7CisJICAgIC1yZSAiLipcW1d3XF1hdGNocG9pbnQuKmJ1ZlxcXFswXFxcXS4qT2xkIHZhbHVlID0gMC4qTmV3IHZhbHVlID0gNDlcW15cblxdKlxuIiB7IHNldCB4IFtleHByICR4KzFdIDsgZXhwX2NvbnRpbnVlIH0KKwkgICAgLXJlICIuKlxbV3dcXWF0Y2hwb2ludC4qYnVmXFxcWzFcXFxdLipPbGQgdmFsdWUgPSAwLipOZXcgdmFsdWUgPSA1MFxbXlxuXF0qXG4iIHsgc2V0IHggW2V4cHIgJHgrMV0gOyBleHBfY29udGludWUgfQorCSAgICAtcmUgIi4qXFtXd1xdYXRjaHBvaW50LipidWZcXFxbMlxcXF0uKk9sZCB2YWx1ZSA9IDAuKk5ldyB2YWx1ZSA9IDUxXFteXG5cXSpcbiIgeyBzZXQgeCBbZXhwciAkeCsxXSA7IGV4cF9jb250aW51ZSB9CisJICAgIC1yZSAiLipcW1d3XF1hdGNocG9pbnQuKmJ1ZlxcXFszXFxcXS4qT2xkIHZhbHVlID0gMC4qTmV3IHZhbHVlID0gMTBcW15cblxdKlxuIiB7IHNldCB4IFtleHByICR4KzFdIDsgZXhwX2NvbnRpbnVlIH0KKwkgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAic2VudCAxMjMiIH0KKwkgICAgdGltZW91dCB7IGZhaWwgInNlbnQgMTIzICh0aW1lb3V0KSIgfQorCX0KKworCSMgRXhhbWluZSB0aGUgdmFsdWVzIGluIGJ1ZiB0byBzZWUgaG93IG1hbnkgd2F0Y2hwb2ludHMgd2UKKwkjIHNob3VsZCBoYXZlIHByaW50ZWQuCisJc2VuZF9nZGIgInByaW50IGJ1ZlxbMFxdXG4iCisJZ2RiX2V4cGVjdCB7CisJICAgIC1yZSAiLio9IDQ5LiokZ2RiX3Byb21wdCAkIiB7IHNldCB5IFtleHByICR5KzFdOyBwYXNzICJwcmludCBidWZcWzBcXSJ9CisJICAgIC1yZSAiLio9IDAuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgYnVmXFswXF0ifQorCSAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBidWZcWzBcXSJ9CisJICAgIGRlZmF1bHQgeyBmYWlsICJwcmludCBidWZcWzBcXSJ9CisJfQorCXNlbmRfZ2RiICJwcmludCBidWZcWzFcXVxuIgorCWdkYl9leHBlY3QgeworCSAgICAtcmUgIi4qPSA1MC4qJGdkYl9wcm9tcHQgJCIgeyBzZXQgeSBbZXhwciAkeSsxXTsgcGFzcyAicHJpbnQgYnVmXFsxXF0ifQorCSAgICAtcmUgIi4qPSAwLiokZ2RiX3Byb21wdCAkIiB7IHBhc3MgInByaW50IGJ1ZlxbMVxdIn0KKwkgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgZmFpbCAicHJpbnQgYnVmXFsxXF0ifQorCSAgICBkZWZhdWx0IHsgZmFpbCAicHJpbnQgYnVmXFsxXF0ifQorCX0KKwlzZW5kX2dkYiAicHJpbnQgYnVmXFsyXF1cbiIKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICIuKj0gNTEuKiRnZGJfcHJvbXB0ICQiIHsgc2V0IHkgW2V4cHIgJHkrMV07IHBhc3MgInByaW50IGJ1ZlxbMlxdIn0KKwkgICAgLXJlICIuKj0gMC4qJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJwcmludCBidWZcWzJcXSJ9CisJICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IGZhaWwgInByaW50IGJ1ZlxbMlxdIn0KKwkgICAgZGVmYXVsdCB7IGZhaWwgInByaW50IGJ1ZlxbMlxdIn0KKwl9CisJc2VuZF9nZGIgInByaW50IGJ1ZlxbM1xdXG4iCisJZ2RiX2V4cGVjdCB7CisJICAgIC1yZSAiLio9IDEwLiokZ2RiX3Byb21wdCAkIiB7IHNldCB5IFtleHByICR5KzFdOyBwYXNzICJwcmludCBidWZcWzNcXSJ9CisJICAgIC1yZSAiLio9IDAuKiRnZGJfcHJvbXB0ICQiIHsgcGFzcyAicHJpbnQgYnVmXFszXF0ifQorCSAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJwcmludCBidWZcWzNcXSIgfQorCSAgICBkZWZhdWx0IHsgZmFpbCAicHJpbnQgYnVmXFszXF0iIH0KKwl9CisKKwkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCisJaWYgW2V4cHIgJHg9PSR5XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAiJHRlc3RuYW1lIChvbmx5IHRyaWdnZXJlZCAkeCB3YXRjaHBvaW50cywgZXhwZWN0ZWQgJHkpIn0KKworCSMgQ29udGludWUgdW50aWwgd2UgaGl0IHRoZSBmaW5pc2hpbmcgbWFya2VyIGZ1bmN0aW9uLgorCSMgTWFrZSBzdXJlIHdlIGhpdCBubyBtb3JlIHdhdGNocG9pbnRzLgorCWdkYl90ZXN0ICJjb250IiAiQ29udGludWluZy4qQnJlYWtwb2ludC4qbWFya2VyNCBcXChcXCkuKiIgXAorCSAgICAiY29udGludWUgdG8gbWFya2VyNCIKKworCSMgRGlzYWJsZSBldmVyeXRoaW5nIHNvIHdlIGNhbiBmaW5pc2ggdGhlIHByb2dyYW0gYXQgZnVsbCBzcGVlZAorCWdkYl90ZXN0ICJkaXNhYmxlIiAiIiAiZGlzYWJsZSBpbiB0ZXN0X3dhdGNocG9pbnRfdHJpZ2dlcmVkX2luX3N5c2NhbGwiCisKKwlpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYixub3Jlc3VsdHNdIHsgcmV0dXJuIH0KKworCWdkYl90ZXN0ICJjb250IiAiQ29udGludWluZy4qUHJvZ3JhbSBleGl0ZWQgbm9ybWFsbHkuKiIgXAorCSAgICAiY29udGludWUgdG8gZXhpdCBpbiB0ZXN0X3dhdGNocG9pbnRfdHJpZ2dlcmVkX2luX3N5c2NhbGwiCisgICAgfQorfQorCisjIERvIGEgc2ltcGxlIHRlc3Qgb2Ygb2Ygd2F0Y2hpbmcgdGhyb3VnaCBhIHBvaW50ZXIgd2hlbiB0aGUgcG9pbnRlcgorIyBpdHNlbGYgY2hhbmdlcy4gIFNob3VsZCBhZGQgc29tZSBtb3JlIGNvbXBsaWNhdGVkIHN0dWZmIGhlcmUuCisKK3Byb2MgdGVzdF9jb21wbGV4X3dhdGNocG9pbnQge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBpZiBbcnVudG8gbWFya2VyNF0gdGhlbiB7CisJZ2RiX3Rlc3QgIndhdGNoIHB0cjEtPnZhbCIgIi4qXFtXd1xdYXRjaHBvaW50IFxbMC05XF0qOiBwdHIxLT52YWwiCisJZ2RiX3Rlc3QgImJyZWFrIG1hcmtlcjUiICIuKkJyZWFrcG9pbnQuKiIKKworCWdkYl90ZXN0ICJjb250IiAiQ29udGludWluZy4qXFtXd1xdYXRjaHBvaW50LipwdHIxLT52YWwuKk9sZCB2YWx1ZSA9IDEuKk5ldyB2YWx1ZSA9IDIuKiIgIlRlc3QgY29tcGxleCB3YXRjaHBvaW50IgorCisJIyBDb250aW51ZSB1bnRpbCB3ZSBoaXQgdGhlIG1hcmtlcjUgZnVuY3Rpb24uCisJIyBNYWtlIHN1cmUgd2UgaGl0IG5vIG1vcmUgd2F0Y2hwb2ludHMuCisKKwlnZGJfdGVzdCAiY29udCIgIkNvbnRpbnVpbmcuKkJyZWFrcG9pbnQuKm1hcmtlcjUgXFwoXFwpLioiIFwKKwkgICAgImRpZCBub3QgdHJpZ2dlciB3cm9uZyB3YXRjaHBvaW50IgorIyoqKioqKioqKioqKioqKioqKioqCisgICAgICAgICMgVGVzdCB3YXRjaGVzIG9mIHRoaW5ncyBkZWNsYXJlZCBsb2NhbGx5IGluIGEgZnVuY3Rpb24uCisgICAgICAgICMgSW4gcGFydGljdWxhciwgdGVzdCB0aGF0IGEgd2F0Y2ggb2Ygc3RhY2stYmFzZWQgdGhpbmdzCisgICAgICAgICMgaXMgZGVsZXRlZCB3aGVuIHRoZSBzdGFjay1iYXNlZCB0aGluZ3MgZ28gb3V0IG9mIHNjb3BlLgorICAgICAgICAjCisJZ2RiX3Rlc3QgImRpc2FibGUiICIiICJkaXNhYmxlIGluIHRlc3RfY29tcGxleF93YXRjaHBvaW50IgorICAgICAgICBnZGJfdGVzdCAiYnJlYWsgbWFya2VyNiIgIi4qQnJlYWtwb2ludC4qIgorICAgICAgICBnZGJfdGVzdCAiY29udCIgIkNvbnRpbnVpbmcuKkJyZWFrcG9pbnQuKm1hcmtlcjYgXFwoXFwpLioiIFwKKyAgICAgICAgICAgICJjb250aW51ZSB0byBtYXJrZXI2IgorICAgICAgICBnZGJfdGVzdCAiYnJlYWsgZnVuYzIiICIuKkJyZWFrcG9pbnQuKiIKKyAgICAgICAgZ2RiX3Rlc3QgImNvbnQiICJDb250aW51aW5nLipmdW5jMi4qIgorCisgICAgICAgICMgVGVzdCBhIHdhdGNoIG9mIGEgc2luZ2xlIHN0YWNrLWJhc2VkIHZhcmlhYmxlLCB3aG9zZSBzY29wZQorICAgICAgICAjIGlzIHRoZSBmdW5jdGlvbiB3ZSdyZSBub3cgaW4uICBUaGlzIHNob3VsZCBhdXRvLWRlbGV0ZSB3aGVuCisgICAgICAgICMgZXhlY3V0aW9uIGV4aXRzIHRoZSBzY29wZSBvZiB0aGUgd2F0Y2hwb2ludC4KKyAgICAgICAgIworICAgICAgICBnZGJfdGVzdCAid2F0Y2ggbG9jYWxfYSIgIi4qXFtXd1xdYXRjaHBvaW50IFxbMC05XF0qOiBsb2NhbF9hIiAic2V0IGxvY2FsIHdhdGNoIgorICAgICAgICBnZGJfdGVzdCAiY29udCIgIlxbV3dcXWF0Y2hwb2ludC4qbG9jYWxfYS4qIiAidHJpZ2dlciBsb2NhbCB3YXRjaCIKKyAgICAgICAgZ2RiX3Rlc3QgImNvbnQiICJDb250aW51aW5nLipXYXRjaHBvaW50IC4qIGRlbGV0ZWQgYmVjYXVzZSB0aGUgcHJvZ3JhbSBoYXMgbGVmdCB0aGUgYmxvY2sgaW4uKndoaWNoIGl0cyBleHByZXNzaW9uIGlzIHZhbGlkLioiICJzZWxmLWRlbGV0ZSBsb2NhbCB3YXRjaCIKKworCSMgYWZ0ZXIgZnVuYzIgcmV0dXJuZWQsIGdkYiBzdG9wcGVkIGFuZCBkZWxldGVkIHRoZSB3YXRjaHBvaW50CisJIyB3ZSdyZSBub3cgaW4gbWFpbiwgbGV0J3MgZ2V0IHRvIGZ1bmMyCisJZ2RiX3Rlc3QgImNvbnQiICJDb250aW51aW5nLipmdW5jMi4qIgorCisgICAgICAgICMgV2Ugc2hvdWxkIGJlIGluICJmdW5jMiIgYWdhaW4gbm93LiAgVGVzdCBhIHdhdGNoIG9mIGFuCisgICAgICAgICMgZXhwcmVzc2lvbiB3aGljaCBpbmNsdWRlcyBib3RoIGEgc3RhY2stYmFzZWQgbG9jYWwgYW5kCisgICAgICAgICMgc29tZXRoaW5nIHdob3NlIHNjb3BlIGlzIGxhcmdlciB0aGFuIHRoaXMgaW52b2NhdGlvbgorICAgICAgICAjIG9mICJmdW5jMiIuICBUaGlzIHNob3VsZCBhbHNvIGF1dG8tZGVsZXRlLgorICAgICAgICAjCisgICAgICAgIGdkYl90ZXN0ICJ3YXRjaCBsb2NhbF9hICsgaXZhbDUiICIuKlxbV3dcXWF0Y2hwb2ludCBcWzAtOVxdKjogbG9jYWxfYSAuIGl2YWw1IiBcCisgICAgICAgICAgICAgICAgICJzZXQgcGFydGlhbGx5IGxvY2FsIHdhdGNoIgorICAgICAgICBnZGJfdGVzdCAiY29udCIgIkNvbnRpbnVpbmcuKlxbV3dcXWF0Y2hwb2ludCAuKjogbG9jYWxfYSAuIGl2YWw1LioiIFwKKyAgICAgICAgICAgICAgICAgInRyaWdnZXIxIHBhcnRpYWxseSBsb2NhbCB3YXRjaCIKKyAgICAgICAgZ2RiX3Rlc3QgImNvbnQiICJDb250aW51aW5nLipcW1d3XF1hdGNocG9pbnQgLio6IGxvY2FsX2EgLiBpdmFsNS4qIiBcCisgICAgICAgICAgICAgICAgICJ0cmlnZ2VyMiBwYXJ0aWFsbHkgbG9jYWwgd2F0Y2giCisgICAgICAgIGdkYl90ZXN0ICJjb250IiAiQ29udGludWluZy4qXFtXd1xdYXRjaHBvaW50IC4qIGRlbGV0ZWQgYmVjYXVzZSB0aGUgcHJvZ3JhbSBoYXMgbGVmdCB0aGUgYmxvY2sgaW4uKndoaWNoIGl0cyBleHByZXNzaW9uIGlzIHZhbGlkLioiIFwKKyAgICAgICAgICAgICAgICAgInNlbGYtZGVsZXRlIHBhcnRpYWxseSBsb2NhbCB3YXRjaCIKKworCSMgYWZ0ZXIgZnVuYzIgcmV0dXJuZWQsIGdkYiBzdG9wcGVkIGFuZCBkZWxldGVkIHRoZSB3YXRjaHBvaW50CisJIyB3ZSdyZSBub3cgaW4gbWFpbiwgbGV0J3MgZ2V0IHRvIGZ1bmMyCisJZ2RiX3Rlc3QgImNvbnQiICJDb250aW51aW5nLipmdW5jMi4qIgorCisgICAgICAgICMgV2Ugc2hvdWxkIGJlIGluICJmdW5jMiIgYWdhaW4gbm93LiAgVGVzdCBhIHdhdGNoIG9mIGEKKyAgICAgICAgIyBzdGF0aWMgKG5vbi1zdGFjay1iYXNlZCkgbG9jYWwuICBTaW5jZSB0aGlzIGhhcyBzY29wZQorICAgICAgICAjIGFjcm9zcyBhbnkgaW52b2NhdGlvbnMgb2YgImZ1bmMyIiwgaXQgc2hvdWxkIG5vdCBhdXRvLQorICAgICAgICAjIGRlbGV0ZS4KKyAgICAgICAgIworICAgICAgICBnZGJfdGVzdCAid2F0Y2ggc3RhdGljX2IiICIuKlxbV3dcXWF0Y2hwb2ludCBcWzAtOVxdKjogc3RhdGljX2IiIFwKKyAgICAgICAgICAgICAgICAgInNldCBzdGF0aWMgbG9jYWwgd2F0Y2giCisgICAgICAgIGdkYl90ZXN0ICJjb250IiAiQ29udGludWluZy4qXFtXd1xdYXRjaHBvaW50IC4qOiBzdGF0aWNfYi4qIiBcCisgICAgICAgICAgICAgICAgICJ0cmlnZ2VyIHN0YXRpYyBsb2NhbCB3YXRjaCIKKyAgICAgICAgZ2RiX3Rlc3QgImNvbnQiICJDb250aW51aW5nLiptYXJrZXI2IFxcKFxcKS4qIiBcCisgICAgICAgICAgICAgICAgICJjb250aW51ZSBhZnRlciB0cmlnZ2VyIHN0YXRpYyBsb2NhbCB3YXRjaCIKKyAgICAgICAgZ2RiX3Rlc3QgImluZm8gYnJlYWsiICIuKndhdGNocG9pbnQuKnN0YXRpY19iLioiIFwKKyAgICAgICAgICAgICAgICAgInN0YXRpYyBsb2NhbCB3YXRjaCBkaWQgbm90IHNlbGYtZGVsZXRlIgorCisgICAgICAgICMgV2Ugc2hvdWxkIGJlIGluICJyZWN1cnNlciIgbm93LiAgVGVzdCBhIHdhdGNoIG9mIGEgc3RhY2stCisgICAgICAgICMgYmFzZWQgbG9jYWwuICBTeW1ib2xzIG1lbnRpb25lZCBpbiBhIHdhdGNocG9pbnQgYXJlIGJvdW5kCisgICAgICAgICMgYXQgd2F0Y2hwb2ludC1jcmVhdGlvbi4gIFRodXMsIGEgd2F0Y2ggb2YgYSBzdGFjay1iYXNlZAorICAgICAgICAjIGxvY2FsIHRvIGEgcmVjdXJzaW5nIGZ1bmN0aW9uIHNob3VsZCBiZSBib3VuZCBvbmx5IHRvIHRoYXQKKyAgICAgICAgIyBvbmUgaW52b2NhdGlvbiwgYW5kIHNob3VsZCBub3QgdHJpZ2dlciBmb3Igb3RoZXIgaW52b2NhdGlvbnMuCisgICAgICAgICMKKyAgICAgICAgZ2RiX3Rlc3QgInRicmVhayByZWN1cnNlciIgIi4qQnJlYWtwb2ludC4qIgorICAgICAgICBnZGJfdGVzdCAiY29udCIgIkNvbnRpbnVpbmcuKnJlY3Vyc2VyLioiCisgICAgICAgIGdkYl90ZXN0ICJ3YXRjaCBsb2NhbF94IiAiLipcW1d3XF1hdGNocG9pbnQgXFswLTlcXSo6IGxvY2FsX3giIFwKKyAgICAgICAgICAgICAgICAgInNldCBsb2NhbCB3YXRjaCBpbiByZWN1cnNpdmUgY2FsbCIKKyAgICAgICAgZ2RiX3Rlc3QgImNvbnQiICJDb250aW51aW5nLipcW1d3XF1hdGNocG9pbnQgLio6IGxvY2FsX3guKk5ldyB2YWx1ZSA9IDIuKiIgXAorICAgICAgICAgICAgICAgICAidHJpZ2dlciBsb2NhbCB3YXRjaCBpbiByZWN1cnNpdmUgY2FsbCIKKyAgICAgICAgZ2RiX3Rlc3QgImNvbnQiICJDb250aW51aW5nLipcW1d3XF1hdGNocG9pbnQgLiogZGVsZXRlZCBiZWNhdXNlIHRoZSBwcm9ncmFtIGhhcyBsZWZ0IHRoZSBibG9jayBpbi4qd2hpY2ggaXRzIGV4cHJlc3Npb24gaXMgdmFsaWQuKiIgXAorICAgICAgICAgICAgICAgICAic2VsZi1kZWxldGUgbG9jYWwgd2F0Y2ggaW4gcmVjdXJzaXZlIGNhbGwiCisKKworCisKKyMqKioqKioqKioqKioqKioqKioKKwkjIERpc2FibGUgZXZlcnl0aGluZyBzbyB3ZSBjYW4gZmluaXNoIHRoZSBwcm9ncmFtIGF0IGZ1bGwgc3BlZWQKKwlnZGJfdGVzdCAiZGlzYWJsZSIgIiIgImRpc2FibGUgaW4gdGVzdF9jb21wbGV4X3dhdGNocG9pbnQiCisKKwlpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYixub3Jlc3VsdHNdIHsgcmV0dXJuIH0KKworCisJZ2RiX3Rlc3QgImNvbnQiICJDb250aW51aW5nLipQcm9ncmFtIGV4aXRlZCBub3JtYWxseS4qIiBcCisJICAgICJjb250aW51ZSB0byBleGl0IGluIHRlc3RfY29tcGxleF93YXRjaHBvaW50IgorICAgIH0KK30KKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJGJpbmZpbGUKK3NldCB0aW1lb3V0IDYwMAkKK3ZlcmJvc2UgIlRpbWVvdXQgbm93IDYwMCBzZWMuXG4iCisKK2lmIFtpbml0aWFsaXplXSB0aGVuIHsKKworICAgIHRlc3Rfc2ltcGxlX3dhdGNocG9pbnQKKworICAgICMgVGhlIElEVC9zaW0gbW9uaXRvciBvbmx5IGhhcyA4ICghKSBvcGVuIGZpbGVzLCBvZiB3aGljaCBpdCB1c2VzCisgICAgIyA0ICghKS4gIFNvIHdlIGhhdmUgdG8gbWFrZSBzdXJlIG9uZSBwcm9ncmFtIGV4aXRzIGJlZm9yZQorICAgICMgc3RhcnRpbmcgYW5vdGhlciBvbmUuCisgICAgaWYgW2lzdGFyZ2V0ICJtaXBzLWlkdC0qIl0gdGhlbiB7CisJZ2RiX2V4aXQKKwlnZGJfc3RhcnQKKwlnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKwlnZGJfbG9hZCAkYmluZmlsZQorCWluaXRpYWxpemUKKyAgICB9CisKKyAgICB0ZXN0X2Rpc2FibGluZ193YXRjaHBvaW50cworCisgICAgIyBTZWUgYWJvdmUuCisgICAgaWYgW2lzdGFyZ2V0ICJtaXBzLWlkdC0qIl0gdGhlbiB7CisJZ2RiX2V4aXQKKwlnZGJfc3RhcnQKKwlnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKwlnZGJfbG9hZCAkYmluZmlsZQorCWluaXRpYWxpemUKKyAgICB9CisKKyAgICBpZiAhW3RhcmdldF9pbmZvIGV4aXN0cyBnZGIsY2Fubm90X2NhbGxfZnVuY3Rpb25zXSB7CisJdGVzdF9zdGVwcGluZworCisJIyBTZWUgYWJvdmUuCisJaWYgW2lzdGFyZ2V0ICJtaXBzLWlkdC0qIl0gdGhlbiB7CisJICAgIGdkYl9leGl0CisJICAgIGdkYl9zdGFydAorCSAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKwkgICAgZ2RiX2xvYWQgJGJpbmZpbGUKKwkgICAgaW5pdGlhbGl6ZQorCX0KKyAgICB9CisKKyAgICAjIE9ubHkgZW5hYmxlZCBmb3Igc29tZSB0YXJnZXRzIG1lcmVseSBiZWNhdXNlIGl0IGhhcyBub3QgYmVlbiB0ZXN0ZWQgCisgICAgIyBlbHNld2hlcmUuCisgICAgIyBPbiBzcGFyYy1zdW4tc3Vub3M0LjEuMywgR0RCIHdhcyBydW5uaW5nIGFsbCB0aGUgd2F5IHRvIHRoZSBtYXJrZXI0IAorICAgICMgYnJlYWtwb2ludCBiZWZvcmUgc3RvcHBpbmcgZm9yIHRoZSB3YXRjaHBvaW50LiAgSSBkb24ndCBrbm93IHdoeS4KKyAgICBpZiB7W2lzdGFyZ2V0ICJocHBhKi0qLSoiXX0gdGhlbiB7CisJdGVzdF93YXRjaHBvaW50X3RyaWdnZXJlZF9pbl9zeXNjYWxsCisgICAgfQorCisgICAgIyBTZWUgYWJvdmUuCisgICAgaWYgW2lzdGFyZ2V0ICJtaXBzLWlkdC0qIl0gdGhlbiB7CisJZ2RiX2V4aXQKKwlnZGJfc3RhcnQKKwlnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKwlnZGJfbG9hZCAkYmluZmlsZQorCWluaXRpYWxpemUKKyAgICB9CisKKyAgICAjIE9ubHkgZW5hYmxlZCBmb3Igc29tZSB0YXJnZXRzIG1lcmVseSBiZWNhdXNlIGl0IGhhcyBub3QgYmVlbiB0ZXN0ZWQgCisgICAgIyBlbHNld2hlcmUuCisgICAgaWYge1tpc3RhcmdldCAiaHBwYSotKi0qIl0gfHwgXAorCSAgICBbaXN0YXJnZXQgInNwYXJjKi0qLXN1bm9zKiJdIHx8IFwKKwkgICAgW2lzdGFyZ2V0ICJtMzJyLSotKiJdfSB0aGVuIHsKKwl0ZXN0X2NvbXBsZXhfd2F0Y2hwb2ludAorIyoqKioqKioqKioqKioqKgorICAgIH0KKworICAgICMgVmVyaWZ5IHRoYXQgYSB1c2VyIGNhbiBmb3JjZSBHREIgdG8gdXNlICJzbG93IiB3YXRjaHBvaW50cy4KKyAgICAjIChUaGlzIHByb3ZlcyByYXRoZXIgbGl0dGxlIG9uIGtlcm5lbHMgdGhhdCBkb24ndCBzdXBwb3J0CisgICAgIyBmYXN0IHdhdGNocG9pbnRzLCBidXQgc3RpbGwuLi4pCisgICAgIworICAgIGlmICFbcnVudG9fbWFpbl0gdGhlbiB7IGZhaWwgIndhdGNoIHRlc3RzIHN1cHByZXNzZWQiIH0KKworICAgIHNlbmRfZ2RiICJzZXQgY2FuLXVzZS1ody13YXRjaHBvaW50cyAwXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICB7cGFzcyAiZGlzYWJsZSBmYXN0IHdhdGNoZXMifQorICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIGRpc2FibGUgZmFzdCB3YXRjaGVzIn0KKyAgICB9CisgICAgc2VuZF9nZGIgInNob3cgY2FuLXVzZS1ody13YXRjaHBvaW50c1xuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgLXJlICJEZWJ1Z2dlcidzIHdpbGxpbmduZXNzIHRvIHVzZSB3YXRjaHBvaW50IGhhcmR3YXJlIGlzIDAuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICB7cGFzcyAic2hvdyBkaXNhYmxlIGZhc3Qgd2F0Y2hlcyJ9CisgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICB7ZmFpbCAic2hvdyBkaXNhYmxlIGZhc3Qgd2F0Y2hlcyJ9CisgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc2hvdyBkaXNhYmxlIGZhc3Qgd2F0Y2hlcyJ9CisgICAgfQorICAgIHNlbmRfZ2RiICJ3YXRjaCBpdmFsMyBpZiAgY291bnQgPiAxXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIldhdGNocG9pbnQgXFswLTlcXSo6IGl2YWwzLiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAge3Bhc3MgInNldCBzbG93IGNvbmRpdGlvbmFsIHdhdGNoIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgIHtmYWlsICJzZXQgc2xvdyBjb25kaXRpb25hbCB3YXRjaCJ9CisgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgc2V0IHNsb3cgY29uZGl0aW9uYWwgd2F0Y2gifQorICAgIH0KKyAgICBzZW5kX2dkYiAiY29udGludWVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgIC1yZSAiV2F0Y2hwb2ludCBcWzAtOVxdKjogaXZhbDMuKk9sZCB2YWx1ZSA9IDEuKk5ldyB2YWx1ZSA9IDIuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICB7cGFzcyAidHJpZ2dlciBzbG93IGNvbmRpdGlvbmFsIHdhdGNoIn0KKyAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgIHtmYWlsICJ0cmlnZ2VyIHNsb3cgY29uZGl0aW9uYWwgd2F0Y2gifQorICAgICAgdGltZW91dCB7ZmFpbCAiKHRpbWVvdXQpIHRyaWdnZXIgc2xvdyBjb25kaXRpb25hbCB3YXRjaCJ9CisgICAgfQorCisgICAgIyBXZSd2ZSBleHBsaWNpdGx5IGRpc2FibGVkIGhhcmR3YXJlIHdhdGNoZXMuICBWZXJpZnkgdGhhdCBHREIKKyAgICAjIAorICAgICMKKyAgICBzZW5kX2dkYiAicndhdGNoIGl2YWwzXG4iCisgICAgZ2RiX2V4cGVjdCB7CisgICAgICAtcmUgIkV4cHJlc3Npb24gY2Fubm90IGJlIGltcGxlbWVudGVkIHdpdGggcmVhZC9hY2Nlc3Mgd2F0Y2hwb2ludC4uKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICB7cGFzcyAicndhdGNoIGRpc2FsbG93ZWQgd2hlbiBjYW4tc2V0LWh3LXdhdGNocG9pbnRzIGNsZWFyZWQifQorICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAge2ZhaWwgInJ3YXRjaCBkaXNhbGxvd2VkIHdoZW4gY2FuLXNldC1ody13YXRjaHBvaW50cyBjbGVhcmVkIn0KKyAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSByd2F0Y2ggZGlzYWxsb3dlZCB3aGVuIGNhbi11c2UtaHctd2F0Y2hwb2ludHMgY2xlYXJlZCJ9CisgICAgfQorCisgICAgIyBSZWFkLSBhbmQgYWNjZXNzIHdhdGNocG9pbnRzIGFyZSB1bnN1cHBvcnRlZCBvbiBIUC1VWC4gIFZlcmlmeQorICAgICMgdGhhdCBHREIgZ3JhY2VmdWxseSByZXNwb25kcyB0byByZXF1ZXN0cyB0byBjcmVhdGUgdGhlbS4KKyAgICAjCisgICAgaWYgW2lzdGFyZ2V0ICJocHBhKi0qLWhwdXgqIl0gdGhlbiB7CisgICAgICBzZW5kX2dkYiAic2V0IGNhbi11c2UtaHctd2F0Y2hwb2ludHMgMVxuIgorICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgIC1yZSAiJGdkYl9wcm9tcHQgJCJcCisgICAgICAgICAgICAgICAge3Bhc3MgImVuYWJsZSBmYXN0IHdhdGNoZXMifQorICAgICAgICB0aW1lb3V0IHtmYWlsICIodGltZW91dCkgZW5hYmxlIGZhc3Qgd2F0Y2hlcyJ9CisgICAgICB9CisgICAgICBzZW5kX2dkYiAicndhdGNoIGl2YWwzXG4iCisgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJUYXJnZXQgZG9lcyBub3QgaGF2ZSB0aGlzIHR5cGUgb2YgaGFyZHdhcmUgd2F0Y2hwb2ludCBzdXBwb3J0LiokZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICB7cGFzcyAicmVhZCB3YXRjaGVzIGRpc2FsbG93ZWQifQorICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgIHtmYWlsICJyZWFkIHdhdGNoZXMgZGlzYWxsb3dlZCJ9CisgICAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSByZWFkIHdhdGNoZXMgZGlzYWxsb3dlZCJ9CisgICAgICB9CisKKyAgICAgIHNlbmRfZ2RiICJhd2F0Y2ggaXZhbDNcbiIKKyAgICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIlRhcmdldCBkb2VzIG5vdCBoYXZlIHRoaXMgdHlwZSBvZiBoYXJkd2FyZSB3YXRjaHBvaW50IHN1cHBvcnQuKiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgIHtwYXNzICJhY2Nlc3Mgd2F0Y2hlcyBkaXNhbGxvd2VkIn0KKyAgICAgICAgLXJlICIkZ2RiX3Byb21wdCAkIlwKKyAgICAgICAgICAgICAgICB7ZmFpbCAiYWNjZXNzIHdhdGNoZXMgZGlzYWxsb3dlZCJ9CisgICAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBhY2Nlc3Mgd2F0Y2hlcyBkaXNhbGxvd2VkIn0KKyAgICAgIH0KKworIyoqKioqKioqKioqKioqKgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3hkYi5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAveGRiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNlM2ZjMgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3hkYi5jCkBAIC0wLDAgKzEsMjAgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgY2FsbGVlKCB4ICkKK2ludCB4OworeworICAgIGludCB5ID0geCAqIHg7CisgICAgcmV0dXJuICh5IC0gMik7Cit9CisKK21haW4oKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDE7IGkgPCAxMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoICIlZCAiLCBjYWxsZWUoIGkgKSk7CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIHByaW50ZiggIiBHb29kYnllIVxuIiApOworICAgIAorfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAveGRiMC5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAveGRiMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNWM3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC94ZGIwLmMKQEAgLTAsMCArMSw0MiBAQAorI2luY2x1ZGUgInhkYjAuaCIKKworbWFpbiAoKQoreworICAgIGludCB4OworI2lmZGVmIHVzZXN0dWJzCisgICAgc2V0X2RlYnVnX3RyYXBzKCk7CisgICAgYnJlYWtwb2ludCgpOworI2VuZGlmCisgICAgeCA9IDA7CisgICAgZm9vICh4KyspOworICAgIGZvbyAoeCsrKTsKKyAgICBmb28gKHgrKyk7CisgICAgZm9vICh4KyspOworICAgIGZvbyAoeCsrKTsKKyAgICBmb28gKHgrKyk7CisgICAgZm9vICh4KyspOworICAgIGZvbyAoeCsrKTsKKyAgICBmb28gKHgrKyk7CisgICAgZm9vICh4KyspOworICAgIGZvbyAoeCsrKTsKKyAgICBmb28gKHgrKyk7CisgICAgZm9vICh4KyspOworICAgIGZvbyAoeCsrKTsKKyAgICBmb28gKHgrKyk7CisgICAgZm9vICh4KyspOworICAgIGZvbyAoeCsrKTsKKyAgICBmb28gKHgrKyk7CisgICAgZm9vICh4KyspOworICAgIGZvbyAoeCsrKTsKKyAgICBmb28gKHgrKyk7CisgICAgZm9vICh4KyspOworICAgIGZvbyAoeCsrKTsKKyAgICBmb28gKHgrKyk7CisgICAgZm9vICh4KyspOworfQorCitzdGF0aWMgdm9pZAordW51c2VkICgpCit7CisgICAgLyogTm90IHVzZWQgZm9yIGFueXRoaW5nICovCit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC94ZGIwLmggYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC94ZGIwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRkMzM3YwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3hkYjAuaApAQCAtMCwwICsxLDM2IEBACisvKiBBbiBpbmNsdWRlIGZpbGUgdGhhdCBhY3R1YWxseSBjYXVzZXMgY29kZSB0byBiZSBnZW5lcmF0ZWQgaW4gdGhlCisgICBpbmNsdWRpbmcgZmlsZS4gIFRoaXMgaXMga25vd24gdG8gY2F1c2UgcHJvYmxlbXMgb24gc29tZSBzeXN0ZW1zLiAqLworCitzdGF0aWMgdm9pZAorZm9vICh4KQoraW50IHg7Cit7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworICAgIGJhciAoeCsrKTsKKyAgICBiYXIgKHgrKyk7CisgICAgYmFyICh4KyspOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAveGRiMS5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAveGRiMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNjMyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC94ZGIxLmMKQEAgLTAsMCArMSwzMyBAQAordm9pZAorYmFyICh4KQoraW50IHg7Cit7CisgICAgcHJpbnRmICgiJWRcbiIsIHgpOworCisgICAgbG9uZ19saW5lICgpOworfQorCitzdGF0aWMgdm9pZAordW51c2VkICgpCit7CisgICAgLyogTm90IHVzZWQgZm9yIGFueXRoaW5nICovCit9CisKKworLyogVGhpcyByb3V0aW5lIGhhcyBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgd2lsbCBicmVhayBzZWFyY2hpbmcgaW4gb2xkZXIKKyAgIHZlcnNpb25zIG9mIEdEQi4gICovCisKK2xvbmdfbGluZSAoKQoreworICBvb2YgKDY3KTsKKworICBvb2YgKDY3ODkpOworCisgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICA1ICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogMTAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAxNSAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qIDIwICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogMjUgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAzMCAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qIDM1ICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogNDAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiA0NSAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qIDUwICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogNTUgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiA2MCAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qIDY1ICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgLyogICAgKi8gICAgICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7IC8qICAgICovICAgICAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAvKiAgICAqLyAgICAgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyKTsgIG9vZiAoMTIpOyAgb29mICgxMik7ICBvb2YgKDEyMzQpOyAvKiA3MCAqLworfQorCitvb2YgKG4pCisgICAgIGludCBuOworeworICByZXR1cm4gbiArIDE7Cit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC94ZGIxLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3hkYjEuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YWIyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC94ZGIxLmV4cApAQCAtMCwwICsxLDc3IEBACisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgRnJlZCBGaXNoLiAoZm5mQGN5Z251cy5jb20pCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgICAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKKyAgICAgICAgfQorCisKK2dsb2JhbCB1c2VzdHVicworCisjCisjIHRlc3QgcnVubmluZyBwcm9ncmFtcworIworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAieGRiIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQoraWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7c3JjZmlsZX0iICIke2JpbmZpbGV9IiBleGVjdXRhYmxlIHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworaWYgW2dldF9jb21waWxlcl9pbmZvICR7YmluZmlsZX1dIHsKKyAgICByZXR1cm4gLTE7Cit9CitpZiB7W3NraXBfaHBfdGVzdHMgJGdjY19jb21waWxlZF19IHRoZW4geyBjb250aW51ZSB9CisKK2dsb2JhbCBHREJGTEFHUworc2V0IHNhdmVkX2dkYmZsYWdzICRHREJGTEFHUworCitzZXQgR0RCRkxBR1MgIiRHREJGTEFHUyAtLXhkYiIKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAke2JpbmZpbGV9CisKK2dkYl90ZXN0ICJzZXQgcGFnaW5hdGlvbiBvZmYiICIiCitnZGJfdGVzdCAic2hvdyBwYWdpbmF0aW9uIiAiU3RhdGUgb2YgcGFnaW5hdGlvbiBpcyBvZmYuIgorZ2RiX3Rlc3QgInNldCBwYWdpbmF0aW9uIG9uIiAiIgorZ2RiX3Rlc3QgInNob3cgcGFnaW5hdGlvbiIgIlN0YXRlIG9mIHBhZ2luYXRpb24gaXMgb24uIgorCitnZGJfdGVzdCAidHhicmVhayBjYWxsZWUiICJCcmVha3BvaW50LiphdC4qIgorZ2RiX3Rlc3QgImluZm8gYnJlYWsiICJOdW0uKlR5cGUuKkRpc3AuKkVuYi4qQWRkcmVzcy4qV2hhdFxyXG4uKmJyZWFrcG9pbnQuKmRlbC4qeS4qIgorCitnZGJfdGVzdCAieGJyZWFrIGNhbGxlZSIgIkJyZWFrcG9pbnQuKmF0LiouKiIKK2dkYl90ZXN0ICJpbmZvIGJyZWFrIiAiTnVtLipUeXBlLipEaXNwLipFbmIuKkFkZHJlc3MuKldoYXRcclxuLipicmVha3BvaW50LiprZWVwLip5LioiCisKK2dkYl9leGl0CitzZXQgR0RCRkxBR1MgJHNhdmVkX2dkYmZsYWdzCityZXR1cm4gMAorCisKKworCisKKworCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5ocC94ZGIyLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3hkYjIuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYzdiMzQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5ocC94ZGIyLmV4cApAQCAtMCwwICsxLDEwNCBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEZyZWQgRmlzaC4gKGZuZkBjeWdudXMuY29tKQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCisgICAgICAgIH0KKworZ2xvYmFsIG1lc3NhZ2UKKworIworIyB0ZXN0IHJ1bm5pbmcgcHJvZ3JhbXMKKyMKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgInhkYiIKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9L3hkYjAuYyIgIiR7YmluZmlsZX0wLm8iIG9iamVjdCB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICBwZXJyb3IgIkNvdWxkbid0IGNvbXBpbGUgJHt0ZXN0ZmlsZX0wLmMgdG8gb2JqZWN0IgorICAgIHJldHVybiAtMQorfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0veGRiMS5jIiAiJHtiaW5maWxlfTEubyIgb2JqZWN0IHtkZWJ1Z31dICE9ICIiIH0geworICAgIHBlcnJvciAiQ291bGRuJ3QgY29tcGlsZSAke3Rlc3RmaWxlfTEuYyB0byBvYmplY3QiCisgICAgcmV0dXJuIC0xCit9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtiaW5maWxlfTAubyAke2JpbmZpbGV9MS5vIiAke2JpbmZpbGV9IGV4ZWN1dGFibGUge2RlYnVnfV0gIT0gIiIgfSB7CisgICAgcGVycm9yICJDb3VsZG4ndCBsaW5rICR7dGVzdGZpbGV9LiIKKyAgICByZXR1cm4gLTEKK30KKworCitpZiBbZ2V0X2NvbXBpbGVyX2luZm8gJHtiaW5maWxlfV0geworICAgIHJldHVybiAtMTsKK30KK2lmIHtbc2tpcF9ocF90ZXN0cyAkZ2NjX2NvbXBpbGVkXX0gdGhlbiB7IGNvbnRpbnVlIH0KKworCitnbG9iYWwgR0RCRkxBR1MKK3NldCBzYXZlZF9nZGJmbGFncyAkR0RCRkxBR1MKK3NldCBHREJGTEFHUyAiJEdEQkZMQUdTIC0teGRiIgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KK2dkYl90ZXN0ICJicmVhayBtYWluIiAiIgorZ2RiX3Rlc3QgInJ1biIgIiIKK2dkYl90ZXN0ICJnbyArMiIgIkJyZWFrcG9pbnQuKmF0LipmaWxlLip4ZGIwXC5jLCBsaW5lIDEyXC5cclxuQ29udGludWluZyBhdC4qXHJcbm1haW4gXFwoXFwpIGF0Lip4ZGIwXC5jOjEyXHJcbjEyXFsgXHRcXStmb28gXFwoeFxcK1xcK1xcKTsiCitnZGJfdGVzdCAiZ28gLTIiICJOb3RlOiBicmVha3BvaW50LiphbHNvIHNldCBhdCBwYy4qXC5cclxuQnJlYWtwb2ludC4qYXQuKmZpbGUuKnhkYjBcLmMsIGxpbmUgMTBcLlxyXG5Db250aW51aW5nIGF0LipcLlxyXG5cclxuQnJlYWtwb2ludC4qLCBtYWluIFxcKFxcKSBhdC4qeGRiMFwuYzoxMC4qIgorZ2RiX3Rlc3QgImdvIDE2IiAiQnJlYWtwb2ludC4qYXQuKmZpbGUuKnhkYjBcLmMsIGxpbmUgMTZcLlxyXG5Db250aW51aW5nIGF0LipcLlxyXG5tYWluIFxcKFxcKSBhdC4qeGRiMFwuYzoxNlxyXG4xNlxbIFx0XF0rZm9vIFxcKHhcXCtcXCtcXCk7IgorCitzZW5kX2dkYiAiZ28gYmFyXG4iCisgIGdkYl9leHBlY3QgeworICAgICAgLXJlICIuKkxpbmUgNSBpcyBub3QgaW4gLm1haW4uLiAgSnVtcCBhbnl3YXkuKnkgb3Igbi4gJCIgeworICAgICAgICAgIHNlbmRfZ2RiICJ5XG4iCisgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiXAorICAgICAgICAgICAgICAgICAgICB7cGFzcyAiZ28gYmFyIn0KKyAgICAgICAgICAgIHRpbWVvdXQge2ZhaWwgIih0aW1lb3V0KSBnbyBiYXIifQorICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC1yZSAiQ29udGludWluZyBhdC4qXC5cclxuYmFyIFxcKHg9MFxcKSBhdC4qeGRiMVwuYzo1IiB7fQorICAgICAgdGltZW91dCB7IHBlcnJvciAiKHRpbWVvdXQpIGdvIGJhciIgOyByZXR1cm4gfQorICB9CisKKyMgVmVyaWZ5IHRoYXQgR0RCIHJlc3BvbmRzIGdyYWNlZnVsbHkgdG8gYSAiZ28iIGNvbW1hbmQgd2l0aG91dAorIyBhbiBhcmd1bWVudC4KKyMKK2dkYl90ZXN0ICJnbyIgIlVzYWdlOiBnbyA8bG9jYXRpb24+IgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICR7YmluZmlsZX0KKworZ2RiX3Rlc3QgImJyZWFrIGJhciIgIiIKK2dkYl90ZXN0ICJydW4iICIiCitnZGJfdGVzdCAiYmFja3RyYWNlIGZ1bGwiICIuKmJhciBcXCh4PTBcXCkgYXQuKnhkYjFcLmM6NVxyXG5ObyBsb2NhbHNcLlxyXG4uMS4qIGluIGZvbyBcXCh4PTFcXCkgYXQuKnhkYjBcLmg6OFxyXG5ObyBsb2NhbHNcLlxyXG4uMi4qIGluIG1haW4gXFwoXFwpIGF0Lip4ZGIwXC5jOjExXHJcbi4qeCA9IDEiCitnZGJfdGVzdCAiYnQgMSBmdWxsIiAiLipiYXIgXFwoeD0wXFwpIGF0Lip4ZGIxXC5jOjVcclxuTm8gbG9jYWxzXC5cclxuXFwoTW9yZSBzdGFjayBmcmFtZXMgZm9sbG93XC5cLlwuXFwpIgorZ2RiX3Rlc3QgImJ0IGZ1bGwgMiIgIi4qYmFyIFxcKHg9MFxcKSBhdC4qeGRiMVwuYzo1XHJcbk5vIGxvY2Fsc1wuXHJcbi4xLiogaW4gZm9vIFxcKHg9MVxcKSBhdC4qeGRiMFwuaDo4XHJcbk5vIGxvY2Fsc1wuXHJcblxcKE1vcmUgc3RhY2sgZnJhbWVzIGZvbGxvd1wuXC5cLlxcKSIKKworc2V0IEdEQkZMQUdTICRzYXZlZF9nZGJmbGFncworcmV0dXJuIDAKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3hkYjMuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuaHAveGRiMy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1NjllOQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmhwL3hkYjMuZXhwCkBAIC0wLDAgKzEsMzA3IEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICAgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKKworc2V0IHRlc3RmaWxlMSAiYXZlcmFnZSIKK3NldCB0ZXN0ZmlsZTIgInN1bSIKK3NldCB0ZXN0ZmlsZSAieGRiLXRlc3QiCitzZXQgYmluZmlsZTEgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlMX0KK3NldCBiaW5maWxlMiAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGUyfQorc2V0IGJpbmZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS8ke3Rlc3RmaWxlfQorCitpZiAgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vYXZlcmFnZS5jIiAiJHtiaW5maWxlMX0ubyIgb2JqZWN0IHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworaWYgIHsgW2dkYl9jb21waWxlICIke3NyY2Rpcn0vJHtzdWJkaXJ9L3N1bS5jIiAiJHtiaW5maWxlMn0ubyIgb2JqZWN0IHtkZWJ1Z31dICE9ICIiIH0geworICAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworaWYgIHsgW2dkYl9jb21waWxlICIke2JpbmZpbGUxfS5vICR7YmluZmlsZTJ9Lm8iICR7YmluZmlsZX0gZXhlY3V0YWJsZSB7ZGVidWd9XSAhPSAiIiB9IHsKKyAgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCit9CisKK2lmIFtnZXRfY29tcGlsZXJfaW5mbyAke2JpbmZpbGV9XSB7CisgICAgcmV0dXJuIC0xOworfQoraWYge1tza2lwX2hwX3Rlc3RzICRnY2NfY29tcGlsZWRdfSB0aGVuIHsgY29udGludWUgfQorCisKK3Byb2MgeGRiX3JlaW5pdGlhbGl6ZV9kaXIgeyBzdWJkaXIgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgc2VuZF9nZGIgIkRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgLXJlICJSZWluaXRpYWxpemUgc291cmNlIHBhdGggdG8gZW1wdHkuKnkgb3Igbi4gIiB7CisgICAgICAgICAgICBzZW5kX2dkYiAieVxuIgorICAgICAgICAgICAgZ2RiX2V4cGVjdCB7CisgICAgICAgICAgICAgICAgLXJlICJTb3VyY2UgZGlyZWN0b3JpZXMgc2VhcmNoZWQuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZF9nZGIgIkQgJHN1YmRpclxuIgorICAgICAgICAgICAgICAgICAgICBnZGJfZXhwZWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC1yZSAiU291cmNlIGRpcmVjdG9yaWVzIHNlYXJjaGVkLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSAiRGlyIHNldCB0byAkc3ViZGlyIgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJyb3IgIkRpciBcIiRzdWJkaXJcIiBmYWlsZWQuIgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgIHBlcnJvciAiRGlyIFwiJHN1YmRpclwiIGZhaWxlZC4iCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBwZXJyb3IgIkRpciBcIiRzdWJkaXJcIiBmYWlsZWQuIgorICAgICAgICB9CisgICAgfQorfQorCisjCisjdGVzdF9zZWFyY2gKKyMKK3Byb2MgdGVzdF9zZWFyY2ggeyB9IHsKKyAgICBnZGJfdGVzdCAic2V0IGxpc3RzaXplIDQiICIiCisgICAgZ2RiX3Rlc3QgImxpc3QgYXZlcmFnZS5jOjEiICIxXFsgXHRcXSsvLiBUaGlzIGlzIGEgc2FtcGxlIC4qIgorICAgIGdkYl90ZXN0ICIvIHByaW50X2F2ZXJhZ2UiICIxMFxbIFx0XF0rdm9pZCBwcmludF9hdmVyYWdlXFwoaW50IGxpc3QuKiIKKyAgICBnZGJfdGVzdCAiLyBwcmludF9hdmVyYWdlIiAiMTJcWyBcdFxdK3ZvaWQgcHJpbnRfYXZlcmFnZVxcKGxpc3QsIGxvdywgaGlnaFxcKSIKKyAgICBnZGJfdGVzdCAiLyBwcmludF9hdmVyYWdlIiAiMzVcWyBcdFxdK3ByaW50X2F2ZXJhZ2UgXFwobXlfbGlzdCwgZmlyc3QsIGxhc3RcXCk7IgorICAgIGdkYl90ZXN0ICI/IHByaW50X2F2ZXJhZ2UiICIxMlxbIFx0XF0rdm9pZCBwcmludF9hdmVyYWdlXFwobGlzdCwgbG93LCBoaWdoXFwpIgorICAgIGdkYl90ZXN0ICI/IHN1bSIgIkV4cHJlc3Npb24gbm90IGZvdW5kIgorfQorCisjCisjdGVzdF92aWV3aW5nX2xvYworIworcHJvYyB0ZXN0X3ZpZXdpbmdfbG9jIHsgfSB7CisgICAgZ2RiX3Rlc3QgIkwiICJObyBzdGFjay4iCisgICAgZ2RiX3Rlc3QgImJyZWFrIG1haW4iICIiCisgICAgZ2RiX3Rlc3QgIlIiICIiCisgICAgZ2RiX3Rlc3QgIkwiICIjMFxbIFx0XF0rbWFpbiBcXChcXCkgYXQuKmF2ZXJhZ2UuYzozMVxyXG4zMVxbIFx0XF0raW50IGZpcnN0ID0gMDsiCit9CisKKyMKKyN0ZXN0X2Rpcl9saXN0CisjCitwcm9jIHRlc3RfZGlyX2xpc3QgeyB9IHsKKyAgICBnZGJfdGVzdCAibGQiICJTb3VyY2UgZGlyZWN0b3JpZXMgc2VhcmNoZWQ6IC4qIgorfQorCisjCisjdGVzdF9saXN0X3NvdXJjZXMKKyMKK3Byb2MgdGVzdF9saXN0X3NvdXJjZXMgeyB9IHsKKyAgICBnZGJfdGVzdCAibGYiICJTb3VyY2UgZmlsZXMgZm9yIHdoaWNoIHN5bWJvbHMgaGF2ZSBiZWVuIHJlYWQgaW46LiphdmVyYWdlXFwuYywuKlNvdXJjZSBmaWxlcyBmb3Igd2hpY2ggc3ltYm9scyB3aWxsIGJlIHJlYWQgaW4gb24gZGVtYW5kOi4qc3VtXFwuYyIKK30KKworIworI3Rlc3Rfdmxpc3QKKyMKK3Byb2MgdGVzdF92bGlzdCB7IH0geworICAgIGdkYl90ZXN0ICJ2IG1haW4iICIyN1xbIFx0XF0rbWFpbiBcXChcXClcclxuMjhcWyBcdFxdKyNlbmRpZlxyXG4yOVxbIFx0XF0rLlxyXG4zMFxbIFx0XF0rY2hhciBjOyIKK30KKworIworI3Rlc3RfdmEKKyMKK3Byb2MgdGVzdF92YSB7IH0geworICAgIGdkYl90ZXN0ICJ2YSBtYWluIiAiRHVtcCBvZiBhc3NlbWJsZXIgY29kZSBmb3IgZnVuY3Rpb24gbWFpbjouKkVuZCBvZiBhc3NlbWJsZXIgZHVtcFwuIgorfQorCisjCisjdGVzdF9saXN0X2dsb2JhbHMKKyMKK3Byb2MgdGVzdF9saXN0X2dsb2JhbHMgeyB9IHsKKyAgICBnZGJfdGVzdCAibGciICJBbGwgZGVmaW5lZCB2YXJpYWJsZXM6XHJcblxyXG5GaWxlIGdsb2JhbHM6LioiCisjICAgIGdkYl90ZXN0ICJsZyIgIkFsbCBkZWZpbmVkIHZhcmlhYmxlczpcclxuXHJcbkZpbGUgZ2xvYmFsczpcclxuY2hhciBfX2J1ZmZlci41MTIuO1xyXG5pbnQgX19kX2VoX2NhdGNoX2NhdGNoO1xyXG5pbnQgX19kX2VoX2NhdGNoX3Rocm93Oy4qIgorfQorCisjCisjdGVzdF9saXN0X3JlZ2lzdGVycworIworcHJvYyB0ZXN0X2xpc3RfcmVnaXN0ZXJzIHsgfSB7CisgICAgZ2RiX3Rlc3QgImxyIiAiXFsgXHRcXStmbGFnczouKnIxODouKnBjc3F0Oi4qY2NyOi4qXHJcblxbIFx0XF0rcjE6LipyMTk6LiplaWVtOi4qY3IxMjouKiIKKyAgICBnZGJfdGVzdCAibHIgcjEiICJyMSAuKiIKK30KKworIworI3Rlc3RfYmFja3RyYWNlCisjCitwcm9jIHRlc3RfYmFja3RyYWNlIHsgfSB7CisgICAgZ2RiX3Rlc3QgInQiICIjMCAgbWFpbiBcXChcXCkgYXQuKmF2ZXJhZ2UuYzozMSIKKyAgICBnZGJfdGVzdCAiVCIgIiMwICBtYWluIFxcKFxcKSBhdC4qYXZlcmFnZS5jOjMxXHJcblxbIFx0XF0rYyA9IDAuKlxyXG5cWyBcdFxdK2ZpcnN0ID0gMFxyXG5cWyBcdFxdK2xhc3QgPSAwIgorCisgICAgZ2RiX3Rlc3QgImJyZWFrIHN1bSIgIiIKKyAgICBnZGJfdGVzdCAiY29udCIgIiIKKworICAgIGdkYl90ZXN0ICJ0IiAiIzAgIHN1bSBcXChsaXN0PTB4LiosIGxvdz0wLCBoaWdoPTlcXCkgYXQuKnN1bVwuYzoxMVxyXG4jMSAgMHguKiBpbiBwcmludF9hdmVyYWdlIFxcKGxpc3Q9MHguKiwgbG93PTAsIGhpZ2g9OVxcKSBhdC4qYXZlcmFnZVwuYzoxN1xyXG4jMiAgMHguKiBpbiBtYWluIFxcKFxcKSBhdC4qYXZlcmFnZVwuYzozNSIKKyAgICBnZGJfdGVzdCAidCAxIiAiIzAgIHN1bSBcXChsaXN0PTB4LiosIGxvdz0wLCBoaWdoPTlcXCkgYXQuKnN1bVwuYzoxMVxyXG5cXChNb3JlIHN0YWNrIGZyYW1lcyBmb2xsb3dcLlwuXC5cXCkiCisgICAgZ2RiX3Rlc3QgIlQiICIjMCAgc3VtIFxcKGxpc3Q9MHguKiwgbG93PTAsIGhpZ2g9OVxcKSBhdC4qc3VtXC5jOjExXHJcblxbIFx0XF0raSA9IDBcclxuXFsgXHRcXStzID0gMFxyXG4jMSAgMHguKiBpbiBwcmludF9hdmVyYWdlIFxcKGxpc3Q9MHguKiwgbG93PTAsIGhpZ2g9OVxcKSBhdC4qYXZlcmFnZVwuYzoxN1xyXG5cWyBcdFxdK3RvdGFsID0gMFxyXG5cWyBcdFxdK251bV9lbGVtZW50cyA9IDBcclxuXFsgXHRcXSthdmVyYWdlID0gMFxyXG4jMiAgMHguKiBpbiBtYWluIFxcKFxcKSBhdC4qYXZlcmFnZVwuYzozNVxyXG5cWyBcdFxdK2MgPSAwICcuMDAwJ1xyXG5cWyBcdFxdK2ZpcnN0ID0gMFxyXG5cWyBcdFxdK2xhc3QgPSA5IgorICAgIGdkYl90ZXN0ICJUIDEiICIjMCAgc3VtIFxcKGxpc3Q9MHguKiwgbG93PTAsIGhpZ2g9OVxcKSBhdC4qc3VtXC5jOjExXHJcblxbIFx0XF0raSA9IDBcclxuXFsgXHRcXStzID0gMFxyXG5cXChNb3JlIHN0YWNrIGZyYW1lcyBmb2xsb3dcLlwuXC5cXCkiCisKKyAgICBnZGJfdGVzdCAiViIgIiMwICBzdW0gXFwobGlzdD0weC4qLCBsb3c9MCwgaGlnaD05XFwpIGF0LipzdW1cLmM6MTFcclxuXFwxMVxbIFx0XF0raW50IGksIHMgPSAwOyIKKyAgICBnZGJfdGVzdCAiViAxIiAiIzEgIDB4LiogaW4gcHJpbnRfYXZlcmFnZSBcXChsaXN0PTB4LiosIGxvdz0wLCBoaWdoPTlcXCkgYXQuKmF2ZXJhZ2VcLmM6MTdcclxuMTdcWyBcdFxdK3RvdGFsID0gc3VtXFwobGlzdCwgbG93LCBoaWdoXFwpOyIKK30KKworIworIyB0ZXN0X2dvCisjCitwcm9jIHRlc3RfZ28geyB9ICB7CisgICAgZ2RiX3Rlc3QgImJyZWFrIG1haW4iICIiCisgICAgZ2RiX3Rlc3QgIlIiICIiCisKKyAgICBnZGJfdGVzdCAiZyArMSIgIkJyZWFrcG9pbnQuKmF0IDB4Lio6IGZpbGUuKmF2ZXJhZ2VcLmMsIGxpbmUgMzJcLlxyXG5Db250aW51aW5nIGF0IDB4LipcLlxyXG5tYWluIFxcKFxcKSBhdC4qYXZlcmFnZVwuYzozMlxyXG4zMlxbIFx0XF0raW50IGxhc3QgPSBudW0tMTsiCisgICAgZ2RiX3Rlc3QgImcgMzUiICJCcmVha3BvaW50LiphdCAweC4qOiBmaWxlLiphdmVyYWdlXC5jLCBsaW5lIDM1XC5cclxuQ29udGludWluZyBhdCAweC4qXC5cclxubWFpbiBcXChcXCkgYXQuKmF2ZXJhZ2VcLmM6MzVcclxuMzVcWyBcdFxdK3ByaW50X2F2ZXJhZ2UgXFwobXlfbGlzdCwgZmlyc3QsIGxhc3RcXCk7IgorCit9CisKKyMKKyN0ZXN0X2JyZWFrcG9pbnRzCisjCitwcm9jIHRlc3RfYnJlYWtwb2ludHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgZ2RiX3Rlc3QgInNiIiAiIgorICAgIGdkYl90ZXN0ICJsYiIgIk51bS4qVHlwZS4qRGlzcC4qRW5iLipBZGRyZXNzLipXaGF0XHJcbjFcWyBcclxdK2JyZWFrcG9pbnRcWyBcclxdK2tlZXAgbi4qaW4gbWFpbiBhdC4qYXZlcmFnZVwuYzozMS4qIgorICAgIGdkYl90ZXN0ICJhYiIgIiIKKyAgICBnZGJfdGVzdCAibGIiICJOdW0uKlR5cGUuKkRpc3AuKkVuYi4qQWRkcmVzcy4qV2hhdFxyXG4xXFsgXHJcXSticmVha3BvaW50XFsgXHJcXStrZWVwIHkuKmluIG1haW4gYXQuKmF2ZXJhZ2VcLmM6MzEuKiIKKyAgICBnZGJfdGVzdCAiYmEgc3VtIiAiQnJlYWtwb2ludC4qYXQuKjogZmlsZS4qc3VtXC5jLCBsaW5lIDExXC4iCisgICAgZ2RiX3Rlc3QgImNvbnQiICIiCisgICAgZ2RiX3Rlc3QgImJ4IiAiQnJlYWtwb2ludC4qYXQuKjogZmlsZS4qc3VtLmMsIGxpbmUgMTVcLiIKKyAgICBnZGJfdGVzdCAiYnggaWYgKDEpIiAiQnJlYWtwb2ludC4qYXQuKjogZmlsZS4qc3VtLmMsIGxpbmUgMTVcLiIKKyAgICBnZGJfdGVzdCAiYnggMSIgIkJyZWFrcG9pbnQuKmF0Lio6IGZpbGUuKmF2ZXJhZ2UuYywgbGluZSAyMlwuIgorICAgIGdkYl90ZXN0ICJieCAxIGlmICgxKSIgIkJyZWFrcG9pbnQuKmF0Lio6IGZpbGUuKmF2ZXJhZ2UuYywgbGluZSAyMlwuIgorICAgIGdkYl90ZXN0ICJiYyAxIDIiICJXaWxsIGlnbm9yZSBuZXh0IDIgY3Jvc3NpbmdzIG9mIGJyZWFrcG9pbnQgMVwuIgorICAgIGdkYl90ZXN0ICJsYiAxIiAiTnVtLipUeXBlLipEaXNwLipFbmIuKkFkZHJlc3MuKldoYXRcclxuMVxbIFxyXF0rYnJlYWtwb2ludFxbIFxyXF0ra2VlcCB5LippbiBtYWluIGF0LiphdmVyYWdlXC5jOjMxXHJcbi4qYnJlYWtwb2ludCBhbHJlYWR5IGhpdCAxIHRpbWVcclxuLippZ25vcmUgbmV4dCAyIGhpdHMuKiIKKworICAgIHNlbmRfZ2RiICJkYlxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIkRlbGV0ZSBhbGwgYnJlYWtwb2ludHMuKnkgb3Igbi4gJCIgeworICAgICAgICAgICAgc2VuZF9nZGIgInlcbiIKKyAgICAgICAgICAgIGV4cF9jb250aW51ZQorICAgICAgICB9CisgICAgICAgIC1yZSAieVxyXG4kZ2RiX3Byb21wdCAkIiB7fQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyAjIFRoaXMgaGFwcGVucyBpZiB0aGVyZSB3ZXJlIG5vIGJyZWFrcG9pbnRzCisgICAgICAgICAgICB9CisgICAgICAgIHRpbWVvdXQgeyBwZXJyb3IgIkRlbGV0ZSBhbGwgYnJlYWtwb2ludHMgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorICAgIHNlbmRfZ2RiICJsYlxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIk5vIGJyZWFrcG9pbnRzIG9yIHdhdGNocG9pbnRzLi4qJGdkYl9wcm9tcHQgJCIge30KKyAgICAgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsgcGVycm9yICJicmVha3BvaW50cyBub3QgZGVsZXRlZCIgOyByZXR1cm4gfQorICAgICAgICB0aW1lb3V0IHsgcGVycm9yICJpbmZvIGJyZWFrcG9pbnRzICh0aW1lb3V0KSIgOyByZXR1cm4gfQorICAgIH0KK2dkYl90ZXN0ICJ4YnJlYWsiICJCcmVha3BvaW50LiphdC4qZmlsZS4qc3VtLmMsIGxpbmUgMTUuIgorZ2RiX3Rlc3QgInhicmVhayBwcmludF9hdmVyYWdlIiAiQnJlYWtwb2ludC4qYXQuKmZpbGUuKmF2ZXJhZ2UuYywgbGluZSAyMi4iCitnZGJfdGVzdCAieGJyZWFrIGlmICgxKSIgIk5vdGU6IGJyZWFrcG9pbnQuKmFsc28gc2V0IGF0IHBjLipCcmVha3BvaW50LiphdC4qZmlsZS4qc3VtLmMsIGxpbmUgMTUuIgorZ2RiX3Rlc3QgInhicmVhayBwcmludF9hdmVyYWdlIGlmICgxKSIgIk5vdGU6IGJyZWFrcG9pbnQuKmFsc28gc2V0IGF0IHBjLipCcmVha3BvaW50LiphdC4qZmlsZS4qYXZlcmFnZS5jLCBsaW5lIDIyLiIKKworICAgIHNlbmRfZ2RiICJsYlxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIk51bSBUeXBlICAgICAgICAgICBEaXNwIEVuYiBBZGRyZXNzICAgIFdoYXQuKmJyZWFrcG9pbnQgICAgIGtlZXAgeS4qaW4gc3VtIGF0LipzdW0uYzoxNS4qYnJlYWtwb2ludCAgICAga2VlcCB5LippbiBwcmludF9hdmVyYWdlIGF0LiphdmVyYWdlLmM6MjIuKmJyZWFrcG9pbnQgICAgIGtlZXAgeS4qaW4gc3VtIGF0LipzdW0uYzoxNS4qc3RvcCBvbmx5IGlmIDEuKmJyZWFrcG9pbnQgICAgIGtlZXAgeS4qaW4gcHJpbnRfYXZlcmFnZSBhdC4qYXZlcmFnZS5jOjIyLipzdG9wIG9ubHkgaWYgMS4qJGdkYl9wcm9tcHQgJCIge3Bhc3MgImxiIG9uIHhicmVha3MifQorICAgICAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJicmVha3BvaW50cyBub3QgZGVsZXRlZCJ9CisgICAgICAgIHRpbWVvdXQgeyBmYWlsICJpbmZvIGJyZWFrcG9pbnRzICh0aW1lb3V0KSIgfQorICAgIH0KKworfQorCisjCisjIHRlc3Rfc2lnbmFscyAKKyMKK3Byb2MgdGVzdF9zaWduYWxzIHsgfSB7CisgICAgZ2RiX3Rlc3QgImhhbmRsZSBTSUdURVJNIG5vc3RvcCBub3ByaW50IiAiIgorICAgIGdkYl90ZXN0ICJ6IFNJR1RFUk0gcyIgIlNpZ25hbC4qU3RvcC4qUHJpbnQuKlBhc3MgdG8gcHJvZ3JhbS4qRGVzY3JpcHRpb25cclxuU0lHVEVSTS4qWWVzLipZZXMuKlllcy4qVGVybWluYXRlZCIKKyAgICBnZGJfdGVzdCAieiBTSUdURVJNIHIiICJTaWduYWwuKlN0b3AuKlByaW50LipQYXNzIHRvIHByb2dyYW0uKkRlc2NyaXB0aW9uXHJcblNJR1RFUk0uKk5vLipOby4qWWVzLipUZXJtaW5hdGVkIgorICAgIGdkYl90ZXN0ICJ6IFNJR1RFUk0gaSIgIlNpZ25hbC4qU3RvcC4qUHJpbnQuKlBhc3MgdG8gcHJvZ3JhbS4qRGVzY3JpcHRpb25cclxuU0lHVEVSTS4qTm8uKk5vLipOby4qVGVybWluYXRlZCIKKyAgICBnZGJfdGVzdCAieiBTSUdURVJNIHIiICJTaWduYWwuKlN0b3AuKlByaW50LipQYXNzIHRvIHByb2dyYW0uKkRlc2NyaXB0aW9uXHJcblNJR1RFUk0uKk5vLipZZXMuKk5vLipUZXJtaW5hdGVkIgorICAgIGdkYl90ZXN0ICJ6IFNJR1RFUk0gUSIgIlNpZ25hbC4qU3RvcC4qUHJpbnQuKlBhc3MgdG8gcHJvZ3JhbS4qRGVzY3JpcHRpb25cclxuU0lHVEVSTS4qTm8uKk5vLipOby4qVGVybWluYXRlZCIKKyAgICBnZGJfdGVzdCAibHoiICJTaWduYWwuKlN0b3AuKlByaW50LipQYXNzIHRvIHByb2dyYW0uKkRlc2NyaXB0aW9uXHJcblxyXG5TSUdIVVAuKlllcy4qIgorfQorCisKKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorZ2xvYmFsIEdEQkZMQUdTCitzZXQgc2F2ZWRfZ2RiZmxhZ3MgJEdEQkZMQUdTCisKK3NldCBHREJGTEFHUyAiJEdEQkZMQUdTIC0teGRiIgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CisKK3hkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCitnZGJfbG9hZCAke2JpbmZpbGV9CitzZW5kX2dkYiAic2V0IHdpZHRoIDBcbiIKK2dkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIgordGVzdF9zZWFyY2gKK3Rlc3Rfdmlld2luZ19sb2MKK3Rlc3RfZGlyX2xpc3QKK3Rlc3RfbGlzdF9zb3VyY2VzCit0ZXN0X3ZsaXN0Cit0ZXN0X3ZhCitnZGJfdGVzdCAibCIgIk5vIGFyZ3VtZW50cy5cclxuYyA9IDAuKlxyXG5maXJzdCA9IDBcclxubGFzdCA9IDAiCisjdGVzdF9saXN0X2dsb2JhbHMKK3Rlc3RfbGlzdF9yZWdpc3RlcnMKK3Rlc3RfYmFja3RyYWNlCisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworZ2RiX2V4aXQKK2dkYl9zdGFydAoreGRiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisKK2dkYl9sb2FkICR7YmluZmlsZX0KK3NlbmRfZ2RiICJzZXQgd2lkdGggMFxuIgorZ2RiX2V4cGVjdCAtcmUgIiRnZGJfcHJvbXB0ICQiCit0ZXN0X2dvCisKKworZ2RiX2V4aXQKK2dkYl9zdGFydAoreGRiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisKK2dkYl9sb2FkICR7YmluZmlsZX0KK3NlbmRfZ2RiICJzZXQgd2lkdGggMFxuIgorZ2RiX2V4cGVjdCAtcmUgIiRnZGJfcHJvbXB0ICQiCitnZGJfdGVzdCAiYnJlYWsgbWFpbiIgIiIKK2dkYl90ZXN0ICJSIiAiIgorZ2RiX3Rlc3QgIlMiICIzMlxbIFx0XF0raW50IGxhc3QgPSBudW0tMTsiCit0ZXN0X2JyZWFrcG9pbnRzCit0ZXN0X3NpZ25hbHMKK2dkYl90ZXN0ICJzbSIgIiIKK2dkYl90ZXN0ICJpbmZvIHNldCIgIi4qcGFnaW5hdGlvbjogIFN0YXRlIG9mIHBhZ2luYXRpb24gaXMgb2ZmLioiCitnZGJfdGVzdCAiYW0iICIiCitnZGJfdGVzdCAiaW5mbyBzZXQiICIuKnBhZ2luYXRpb246ICBTdGF0ZSBvZiBwYWdpbmF0aW9uIGlzIG9uLioiCitnZGJfZXhpdAorCitzZXQgR0RCRkxBR1MgJHNhdmVkX2dkYmZsYWdzCisKK3JldHVybiAwCisKKworCisKKworCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5zdGFicy9NYWtlZmlsZS5pbiBiL2dkYi90ZXN0c3VpdGUvZ2RiLnN0YWJzL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZjM1ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5zdGFicy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDE2IEBACitWUEFUSCA9IEBzcmNkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorCithbGw6IAorCUBlY2hvICJOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIGFsbC4uLiIKKworIyMjIyBob3N0LCB0YXJnZXQsIGFuZCBzaXRlIHNwZWNpZmljIE1ha2VmaWxlIGZyYWdzIGNvbWUgaW4gaGVyZS4KKworY2xlYW4gbW9zdGx5Y2xlYW46CisJLXJtIC1mICoubyAqfiBjb3JlIHRtcC5jIHRtcC5zIHdlaXJkLnMgZXJycworCitkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW46IGNsZWFuCisJLXJtIC1mIE1ha2VmaWxlIGNvbmZpZy5zdGF0dXMgY29uZmlnLmxvZworCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQoc3JjZGlyKS9jb25maWd1cmUuaW4KKwkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5zdGFicy9hb3V0LnNlZCBiL2dkYi90ZXN0c3VpdGUvZ2RiLnN0YWJzL2FvdXQuc2VkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTM4YmMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5zdGFicy9hb3V0LnNlZApAQCAtMCwwICsxLDE2IEBACitzLyMgSXJpeDQgc2VkIGJsb3dzIHVwIGlmIHlvdSBoYXZlIGEgc2VkIGNvbW1hbmQgc3RhcnRpbmcgd2l0aCAiIyIvLworcy8jIEF2b2lkIGl0IGJ5IHB1dHRpbmcgdGhlIGNvbW1lbnRzIHdpdGhpbiByZWFsIHNlZCBjb21tYW5kcy4vLworcy8jIEdEQiBsZWdpdGltYXRlbHkgZXhwZWN0cyBhIGZpbGUgbmFtZS4vLworcy8jIFRoZSBzdW4zIGFzc2VtYmxlciBib2d1c2x5IHJlcXVpcmVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoaXMgc3RhYiBiZSBhLy8KK3MvIyBsYWJlbC4gIFBsYWNhdGUgaXQuLy8KKzFpXAorCS5zdGFicyAid2VpcmQuYyIsMHg2NCwwLDAsTGFiZWwwXAorTGFiZWwwOgorcy9OX0xTWU0vMHg4MC8KK3MvTl9HU1lNLzB4MjAvCitzLyMgUmVwbGFjZSBhIHNpbmdsZSBiYWNrc2xhc2ggd2l0aCBhIGRvdWJsZWQgYmFja3NsYXNoLy8KKy9cLnN0YWJzL3MvXFwvXFxcXC8KK3MvXC5iZWdpbl9jb21tb25cKC4qXCkvLnN0YWJzIFwxLDB4ZTIsMCwwLDAvCitzL1wuZW5kX2NvbW1vblwoLipcKS8uc3RhYnMgXDEsMHhlNCwwLDAsMC8KK3MvXC5hbGlnbl9pdC8uYWxpZ24gMi8KKy9eIy9kCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5zdGFicy9jb25maWd1cmUgYi9nZGIvdGVzdHN1aXRlL2dkYi5zdGFicy9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjk4MjMzZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnN0YWJzL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDg5OSBAQAorIyEgL2Jpbi9zaAorCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorYWNfbWF4X2hlcmVfbGluZXM9MTIKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPXdlaXJkLmV4cAorCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCitDQz0ke0NDLWNjfQorCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCithY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKK2FjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisKKyMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgorIyBUaGUgaW5wdXRzIGFyZToKKyMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAorIworIyBUaGUgcnVsZXMgYXJlOgorIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKKyMgICAgc2FtZSB0aW1lLgorIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KKyMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAorIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KKyMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KKyMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCisKKyMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KKyMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KK2Nhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgorTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OworKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCisKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgoraWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU3MzogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisKK2hvc3RfYWxpYXM9JGhvc3QKK2Nhc2UgIiRob3N0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpCisgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpIDs7CisgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2hvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAoraG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1OTQ6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1CisKK3RhcmdldF9hbGlhcz0kdGFyZ2V0CitjYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK3RhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKK3RhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCit0YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAordGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjYxMjogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorCitidWlsZF9hbGlhcz0kYnVpbGQKK2Nhc2UgIiRidWlsZF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKK2J1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitidWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgorCit0ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCisgIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKKyAgICBOT05FTk9ORXMseCx4LCAmJgorICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCisKKwordHJhcCAnJyAxIDIgMTUKK2NhdCA+IGNvbmZjYWNoZSA8PFxFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgorIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAorIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCisjIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgorIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCisjIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgorIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCisjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworRU9GCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKyhzZXQpIDI+JjEgfAorICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjEgfCBncmVwIGFjX3NwYWNlYCBpbgorICAqYWNfc3BhY2U9XCAqKQorICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCisgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICBzZWQgLW4gXAorICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKKyAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKyAgICA7OworICAqKQorICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJworICAgIDs7CisgIGVzYWMgPj4gY29uZmNhY2hlCitpZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKyMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCitmaQorCit0cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBERUZTLgorIyBQcm90ZWN0IGFnYWluc3Qgc2hlbGwgZXhwYW5zaW9uIHdoaWxlIGV4ZWN1dGluZyBNYWtlZmlsZSBydWxlcy4KKyMgUHJvdGVjdCBhZ2FpbnN0IE1ha2VmaWxlIG1hY3JvIGV4cGFuc2lvbi4KK2NhdCA+IGNvbmZ0ZXN0LmRlZnMgPDxcRU9GCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUtRFwxPVwyJWcKK3MlWyAJYH4jJF4mKigpe31cXHw7JyI8Pj9dJVxcJiVnCitzJVxbJVxcJiVnCitzJVxdJVxcJiVnCitzJVwkJSQkJWcKK0VPRgorREVGUz1gc2VkIC1mIGNvbmZ0ZXN0LmRlZnMgY29uZmRlZnMuaCB8IHRyICdcMDEyJyAnICdgCitybSAtZiBjb25mdGVzdC5kZWZzCisKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUiIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAU0hFTExAJSRTSEVMTCVnCitzJUBDRkxBR1NAJSRDRkxBR1MlZworcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCitzJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKK3MlQERFRlNAJSRERUZTJWcKK3MlQExERkxBR1NAJSRMREZMQUdTJWcKK3MlQExJQlNAJSRMSUJTJWcKK3MlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworcyVAcHJlZml4QCUkcHJlZml4JWcKK3MlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKK3MlQGJpbmRpckAlJGJpbmRpciVnCitzJUBzYmluZGlyQCUkc2JpbmRpciVnCitzJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCitzJUBkYXRhZGlyQCUkZGF0YWRpciVnCitzJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCitzJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKK3MlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKK3MlQGxpYmRpckAlJGxpYmRpciVnCitzJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCitzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCitzJUBpbmZvZGlyQCUkaW5mb2RpciVnCitzJUBtYW5kaXJAJSRtYW5kaXIlZworcyVAQ0NAJSRDQyVnCitzJUBob3N0QCUkaG9zdCVnCitzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCitzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKK3MlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZworcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKK3MlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCitzJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCitzJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCitzJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZworcyVAYnVpbGRAJSRidWlsZCVnCitzJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKK3MlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCitzJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZworcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCisKK0NFT0YKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KK2FjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCithY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19tb3JlX2xpbmVzPToKK2FjX3NlZF9jbWRzPSIiCit3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBmaQorICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCisgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZWxzZQorICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZmkKKyAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKyAgICBhY19iZWc9JGFjX2VuZAorICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgYWNfc2VkX2NtZHM9Y2F0CitmaQorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitDT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKworICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKKyAgcm0gLWYgIiRhY19maWxlIgorICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorIyAkY29uZmlndXJlX2lucHV0IiA7OworICAqKSBhY19jb21zdWI9IDs7CisgIGVzYWMKKworICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBzZWQgLWUgIiRhY19jb21zdWIKK3MlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCitzJUBzcmNkaXJAJSRzcmNkaXIlZworcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQorZmk7IGRvbmUKK3JtIC1mIGNvbmZ0ZXN0LnMqCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuc3RhYnMvY29uZmlndXJlLmluIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuc3RhYnMvY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNDk0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5zdGFicy9jb25maWd1cmUuaW4KQEAgLTAsMCArMSwxNSBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK2RubCBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgZnJhZ21lbnQgdGhhdCBzdXBwbGllcyB0aGUgaW5mb3JtYXRpb24KK2RubCBuZWNlc3NhcnkgdG8gdGFpbG9yIGEgdGVtcGxhdGUgY29uZmlndXJlIHNjcmlwdCBpbnRvIHRoZSBjb25maWd1cmUKK2RubCBzY3JpcHQgYXBwcm9wcmlhdGUgZm9yIHRoaXMgZGlyZWN0b3J5LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIGNoZWNrCitkbmwgYW55IGV4aXN0aW5nIGNvbmZpZ3VyZSBzY3JpcHQuCisKK0FDX1BSRVJFUSgyLjUpCitBQ19JTklUKHdlaXJkLmV4cCkKKworQ0M9JHtDQy1jY30KK0FDX1NVQlNUKENDKQorQUNfQ09ORklHX0FVWF9ESVIoYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLikKK0FDX0NBTk9OSUNBTF9TWVNURU0KKworQUNfT1VUUFVUKE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuc3RhYnMvZWNvZmYuc2VkIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuc3RhYnMvZWNvZmYuc2VkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MTFjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5zdGFicy9lY29mZi5zZWQKQEAgLTAsMCArMSwxNyBAQAorIyBHREIgbGVnaXRpbWF0ZWx5IGV4cGVjdHMgYSBmaWxlIG5hbWUuCisxaVwKKyAuZmlsZQkxICJ3ZWlyZC5jIlwKK1wgI0BzdGFic1wKK1wgIy5zdGFicyAid2VpcmQuYyIsMHg2NCwwLDAsMAorL14jL2QKK3MvIiAqLCAqLyIsL2cKK3MvXChbMC05XVwpICosICovXDEsL2cKK3MvICAqJC8vCitzL05fTFNZTS8weDgwLworcy9OX0dTWU0vMHgyMC8KK3MvXC5iZWdpbl9jb21tb25cKC4qXCkvLnN0YWJzIFwxLDB4ZTIsMCwwLDAvCitzL1wuZW5kX2NvbW1vblwoLipcKS8uc3RhYnMgXDEsMHhlNCwwLDAsMC8KK3MvXC5hbGlnbl9pdC8uYWxpZ24gMi8KKy8uaWYvZAorLy5lbmRpZi9kCitzL1wuc3RhYnMvICMuc3RhYnMvCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5zdGFicy9ocHBhLnNlZCBiL2dkYi90ZXN0c3VpdGUvZ2RiLnN0YWJzL2hwcGEuc2VkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYTFhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5zdGFicy9ocHBhLnNlZApAQCAtMCwwICsxLDIwIEBACitzLyMgT2xkIE9TRiBzZWQgYmxvd3MgdXAgaWYgeW91IGhhdmUgYSBzZWQgY29tbWFuZCBzdGFydGluZyB3aXRoICIjIi8vCitzLyMgQXZvaWQgaXQgYnkgcHV0dGluZyB0aGUgY29tbWVudHMgd2l0aGluIHJlYWwgc2VkIGNvbW1hbmRzLi8vCitzLyMgR0RCIGxlZ2l0aW1hdGVseSBleHBlY3RzIGEgZmlsZSBuYW1lLi8vCitzLyMgVGhlIHN1bjMgYXNzZW1ibGVyIGJvZ3VzbHkgcmVxdWlyZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhpcyBzdGFiIGJlIGEvLworcy8jIGxhYmVsLiAgUGxhY2F0ZSBpdC4vLworMWlcCitcCS5zdGFicyAid2VpcmQuYyIsMHg2NCwwLDAsTGFiZWwwXAorTGFiZWwwOgorcy9OX0xTWU0vMHg4MC8KK3MvTl9HU1lNLzB4MjAvCitzLyMgUmVwbGFjZSBhIHNpbmdsZSBiYWNrc2xhc2ggd2l0aCBhIGRvdWJsZWQgYmFja3NsYXNoLy8KKy9cLnN0YWJzL3MvXFwvXFxcXC8KK3MvIyBPbmx5IGxhYmVscyBzaG91bGQgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUsIGFzc2VtYmxlciBkaXJlY3RpdmVzLy8KK3MvIyBhbmQgaW5zdHJ1Y3Rpb25zIHNob3VsZCBzdGFydCBzb21ld2hlcmUgYWZ0ZXIgY29sdW1uIHplcm8uLy8KKy9eXC4vcy9eXC4vCS4vCitzL1wuYmVnaW5fY29tbW9uXCguKlwpLy5zdGFicyBcMSwweGUyLDAsMCwwLworcy9cLmVuZF9jb21tb25cKC4qXCkvLnN0YWJzIFwxLDB4ZTQsMCwwLDAvCitzL1wuYWxpZ25faXQvLmFsaWduIDQvCitzL1wuZ2xvYmwvLmV4cG9ydC8KKy9eIy9kCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5zdGFicy93ZWlyZC5kZWYgYi9nZGIvdGVzdHN1aXRlL2dkYi5zdGFicy93ZWlyZC5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0ZTM3MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnN0YWJzL3dlaXJkLmRlZgpAQCAtMCwwICsxLDkzOSBAQAorIyBXZSdsbCBuZWVkIGFuIGludGVnZXIgdHlwZS4KKy5zdGFicyAiaW50dHlwZTp0MT1idTQ7MDszMjsiLE5fTFNZTSwwLDAsMAorCisjIFRoZXJlIGFyZSBzZXZlcmFsIGtpbmRzIG9mIHRlc3RzIGluIGhlcmUuICBXZSBtaXggdXAgdGhlIG9yZGVyIHRvIHNlZQorIyBpZiB3ZSBjYW4gdGVzdCBmb3IgcG9vciBoYW5kbGluZyBvZiBhIHN0YWIgYWZmZWN0aW5nIHRoZSBuZXh0IG9yIHByZXZpb3VzCisjIHN0YWIuCisKKyMgVHJ5IGFsbCBwb3NzaWJsZSBzeW1ib2wgZGVzY3JpcHRvcnMuICBOb3RlIHRoYXQgR0RCIHNob3VsZCBtZXJlbHkKKyMgY29tcGxhaW4oKSBldmVuIHRob3VnaCB0aGVzZSBzdHJpbmdzIGFyZSB0b3RhbGx5IGJvZ3VzLiAgVGhpcyBhbGxvd3MKKyMgZnV0dXJlIGNvbXBpbGVycyB0byBkZWZpbmUgbmV3IHN5bnRheGVzLgorLnN0YWJzICJzeW0zMjogICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKworIyBUeXBlIGRlc2NyaXB0b3JzLgorLnN0YWJzICJ0eXBlMzI6dDMyPSAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorCisjIE5vdGUgdGhhdCBhICdHJywgTl9HU1lNIHN5bWJvbCBuZWVkcyBubyB2YWx1ZS4gIFRoZSBuYW1lIG9mIHRoZSBzdGFiCisjIGlzIHVzZWQgdG8gbG9vayB1cCBhIG5vbi1zdGFiIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUuICBPbiBzb21lCisjIG1hY2hpbmVzLCB0aGUgbm9uLXN0YWIgc3ltYm9scyB3aWxsIG5vcm1hbGx5IGhhdmUgdW5kZXJzY29yZXMsIGJ1dAorIyBpZiB0aGV5IGxhY2sgdGhlIHVuZGVyc2NvcmVzLCB0aGVuIEdEQiB3aWxsIHNpbXBseSBwdXQgdGhlIHN5bWJvbCBpbgorIyB0aGUgbWluaW1hbCBzeW1ib2wgdGFibGUgYWxsIHRoZSBzYW1lLiAgU28gd2UgY2FuIHVzZSB0aGVtIHdpdGhvdXQKKyMgdW5kZXJzY29yZXMgYW5kIHRoYXQgd2F5IHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgd2hpY2ggbWFjaGluZXMKKyMgbmVlZCB1bmRlcnNjb3Jlcy4KKworIyBUeXBlIGF0dHJpYnV0ZXMuCisuc3RhYnMgImF0dHIxMDQ6RzQwND1AaCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjEwNTpHNDA1PUBpICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorCisjIEEgZmV3IHJlYWwgdHlwZSBhdHRyaWJ1dGVzLgorIyBBbGlnbm1lbnQuCisuc3RhYnMgInZhcjA6RzMwMD1AYTg7MSIsTl9HU1lNLDAsMCwgMAorLmdsb2JsIHZhcjAKKy5kYXRhCisuYWxpZ25faXQKK3ZhcjA6CisubG9uZyA0MgorCisuc3RhYnMgInN5bTMzOiEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW0zNTojICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltMzY6JCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTM3OiUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW0zODomICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltMzk6JyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTQwOiggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW00MTopICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltNDI6KiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTQzOisgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW00NDosICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltNDU6LSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisKKy5nbG9ibCBhdHRyMTIyCisuZGF0YQorLmFsaWduX2l0CithdHRyMTIyOgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyMTIzCisuZGF0YQorLmFsaWduX2l0CithdHRyMTIzOgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyMTI0CisuZGF0YQorLmFsaWduX2l0CithdHRyMTI0OgorLmxvbmcgNDIKKworLnN0YWJzICJzeW00NjouICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltNDc6LyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTQ4OjAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW00OToxICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltNTA6MiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisKKy5zdGFicyAiYXR0cjk2OkczOTY9QGAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHI5NzpHMzk3PUBhICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyOTg6RzM5OD1AYiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjk5OkczOTk9QGMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisKKy5zdGFicyAic3ltNTE6MyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTUyOjQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW01Mzo1ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltNTQ6NiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTU1OjcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW01Njo4ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltNTc6OSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTU4OjogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW01OTo7ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltNjA6PCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTYxOj0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW02Mjo+ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltNjM6PyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTY0OkAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW02NTpBICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltNjY6QiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTY3OkMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW02ODpEICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltNjk6RSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTcwOkYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW03MTpHICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltNzI6SCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTczOkkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW03NDpKICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltNzU6SyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTc2OkwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW03NzpNICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltNzg6TiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTc5Ok8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW04MDpQICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltODE6USAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTgyOlIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW04MzpTICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltODQ6VCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTg1OlUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW04NjpWICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltODc6VyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTg4OlggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW04OTpZICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltOTA6WiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTkxOlsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorCisuc3RhYnMgInN5bTkzOl0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW05NDpeICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltOTU6XyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTk2OmAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW05NzphICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltOTg6YiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTk5OmMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW0xMDA6ZCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTEwMTplICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltMTAyOmYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW0xMDM6ZyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTEwNDpoICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltMTA1OmkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW0xMDY6aiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTEwNzprICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltMTA4OmwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW0xMDk6bSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTExMDpuICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltMTExOm8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW0xMTI6cCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTExMzpxICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltMTE0OnIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW0xMTU6cyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTExNjp0ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltMTE3OnUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW0xMTg6diAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTExOTp3ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltMTIwOnggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW0xMjE6eSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTEyMjp6ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltMTIzOnsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJzeW0xMjQ6fCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInN5bTEyNTp9ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAic3ltMTI2On4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorCisuc3RhYnMgInR5cGUzMzp0MzM9ISAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGUzNTp0MzU9IyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGUzNjp0MzY9JCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGUzNzp0Mzc9JSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGUzODp0Mzg9JiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGUzOTp0Mzk9JyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU0MDp0NDA9KCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU0MTp0NDE9KSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU0Mjp0NDI9KiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU0Mzp0NDM9KyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU0NDp0NDQ9LCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU0NTp0NDU9LSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU0Njp0NDY9LiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU0Nzp0NDc9LyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU0ODp0NDg9MCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU0OTp0NDk9MSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU1MDp0NTA9MiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU1MTp0NTE9MyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU1Mjp0NTI9NCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU1Mzp0NTM9NSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU1NDp0NTQ9NiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU1NTp0NTU9NyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU1Njp0NTY9OCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU1Nzp0NTc9OSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU1ODp0NTg9OiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU1OTp0NTk9OyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU2MDp0NjA9PCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU2MTp0NjE9PSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU2Mjp0NjI9PiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU2Mzp0NjM9PyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU2NDp0NjQ9QCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU2NTp0NjU9QSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU2Njp0NjY9QiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU2Nzp0Njc9QyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisKKy5nbG9ibCBhdHRyNjYKKy5kYXRhCisuYWxpZ25faXQKK2F0dHI2NjoKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjY3CisuZGF0YQorLmFsaWduX2l0CithdHRyNjc6CisubG9uZyA0MgorLmdsb2JsIGF0dHI2OAorLmRhdGEKKy5hbGlnbl9pdAorYXR0cjY4OgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyNjkKKy5kYXRhCisuYWxpZ25faXQKK2F0dHI2OToKKy5sb25nIDQyCisKKy5zdGFicyAidHlwZTY4OnQ2OD1EICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTY5OnQ2OT1FICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTcwOnQ3MD1GICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTcxOnQ3MT1HICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTcyOnQ3Mj1IICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTczOnQ3Mz1JICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTc0OnQ3ND1KICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTc1OnQ3NT1LICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTc2OnQ3Nj1MICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTc3OnQ3Nz1NICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTc4OnQ3OD1OICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTc5OnQ3OT1PICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTgwOnQ4MD1QICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTgxOnQ4MT1RICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTgyOnQ4Mj1SICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTgzOnQ4Mz1TICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTg0OnQ4ND1UICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTg1OnQ4NT1VICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTg2OnQ4Nj1WICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTg3OnQ4Nz1XICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKworLnN0YWJzICJhdHRyNjk6RzM2OT1ARSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjcwOkczNzA9QEYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHI3MTpHMzcxPUBHICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorCisuc3RhYnMgInR5cGU4ODp0ODg9WCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU4OTp0ODk9WSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU5MDp0OTA9WiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU5MTp0OTE9WyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisKKy5zdGFicyAidHlwZTkzOnQ5Mz1dICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTk0OnQ5ND1eICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTk1OnQ5NT1fICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTk2OnQ5Nj1gICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTk3OnQ5Nz1hICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTk4OnQ5OD1iICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTk5OnQ5OT1jICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTEwMDp0MTAwPWQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJ0eXBlMTAxOnQxMDE9ZSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGUxMDI6dDEwMj1mICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTEwMzp0MTAzPWcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJ0eXBlMTA0OnQxMDQ9aCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGUxMDU6dDEwNT1pICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTEwNjp0MTA2PWogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJ0eXBlMTA3OnQxMDc9ayAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGUxMDg6dDEwOD1sICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTEwOTp0MTA5PW0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJ0eXBlMTEwOnQxMTA9biAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGUxMTE6dDExMT1vICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTExMjp0MTEyPXAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJ0eXBlMTEzOnQxMTM9cSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGUxMTQ6dDExND1yICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTExNTp0MTE1PXMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJ0eXBlMTE2OnQxMTY9dCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGUxMTc6dDExNz11ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTExODp0MTE4PXYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJ0eXBlMTE5OnQxMTk9dyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGUxMjA6dDEyMD14ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTEyMTp0MTIxPXkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJ0eXBlMTIyOnQxMjI9eiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGUxMjM6dDEyMz17ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKy5zdGFicyAidHlwZTEyNDp0MTI0PXwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLE5fTFNZTSwwLDAsMAorLnN0YWJzICJ0eXBlMTI1OnQxMjU9fSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGUxMjY6dDEyNj1+ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IixOX0xTWU0sMCwwLDAKKworLnN0YWJzICJhdHRyMzI6RzMzMj1AICAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjMzOkczMzM9QCEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHIzNTpHMzM0PUAjICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorCisuc3RhYnMgImF0dHIzNjpHMzM1PUAkICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorCisuc3RhYnMgImF0dHIzNzpHMzM3PUAlICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorCisjIFRlc3QgJ2UnIGNvbnN0YW50IG9uIG5vbi1lbnVtIHR5cGUuICAKKy5zdGFicyAiY29uc3Q2OTpjPWUxLDY5IiwgTl9MU1lNLDAsMCwgMAorCisjIFRlc3QgY29uc3RhbnQgd2l0aCB0aGUgdHlwZSBlbWJlZGRlZC4gIAorLnN0YWJzICJjb25zdDcwOmM9ZTE5MD1iczI7MDsxNjssNzAiLCBOX0xTWU0sMCwwLCAwCisKKy5zdGFicyAiYXR0cjM4OkczMzg9QCYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisKKyMgVW5yZWNvZ25pemVkIG5lZ2F0aXZlIHR5cGUgbnVtYmVyLiAgCisuc3RhYnMgImJhZF9uZWcwdHlwZTp0MjAxPXMxNmZpZWxkMDoxLDAsMzI7ZmllbGQyOi01MzQsMzIsNjQ7ZmllbGQzOi0xLDk2LDMyOzsiLCBOX0xTWU0sMCwwLCAwCisKKy5zdGFicyAiYmFkX25lZzA6RzIwMSIsIE5fR1NZTSwwLDAsIDAKKworLmdsb2JsIGJhZF9uZWcwCisuZGF0YQorLmFsaWduX2l0CitiYWRfbmVnMDoKKy5sb25nIDQyCisgICAgIC5sb25nIDQzLCA0NCwgNDUKKworLnN0YWJzICJhdHRyMzk6RzMzOT1AJyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjQxOkczNDE9QCkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHI0MjpHMzQyPUAqICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyNDM6RzM0Mz1AKyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjQ0OkczNDQ9QCwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHI0NjpHMzQ2PUAuICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyNDc6RzM0Nz1ALyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjU4OkczNTg9QDogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisKKyMgVGVzdCB0d28gdHlwZSBhdHRyaWJ1dGVzIGZvciBvbmUgdHlwZS4gIAorLnN0YWJzICJhdHRyNTk6RzM1OT1AO0AgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisKKy5zdGFicyAiYXR0cjYwOkczNjA9QDwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHI2MTpHMzYxPUA9ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyNjI6RzM2Mj1APiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjYzOkczNjM9QD8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHI2NDpHMzY0PUBAICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyNjU6RzM2NT1AQSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjY2OkczNjY9QEIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHI2NzpHMzY3PUBDICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyNjg6RzM2OD1ARCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjcyOkczNzI9QEggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHI3MzpHMzczPUBJICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyNzQ6RzM3ND1ASiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjc1OkczNzU9QEsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHI3NjpHMzc2PUBMICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyNzc6RzM3Nz1ATSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjc4OkczNzg9QE4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHI3OTpHMzc5PUBPICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyODA6RzM4MD1AUCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjgxOkczODE9QFEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHI4MjpHMzgyPUBSICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyODM6RzM4Mz1AUyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjg0OkczODQ9QFQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHI4NTpHMzg1PUBVICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyODY6RzM4Nj1AViAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjg3OkczODc9QFcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHI4ODpHMzg4PUBYICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyODk6RzM4OT1AWSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjkwOkczOTA9QFogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHI5MTpHMzkxPUBbICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorCisuc3RhYnMgImF0dHI5MzpHMzkzPUBdICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorCisjIERvIHdpdGggYW5kIHdpdGhvdXQgdW5kZXJzY29yZSwgc28gdGhpcyB3aW5zIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgorIyBuYW1lcyBoYXZlIHVuZGVyc2NvcmVzLgorCisuZ2xvYmwgX2NvbW1vbjAKKy5kYXRhCisuYWxpZ25faXQKK19jb21tb24wOgorLmxvbmcgNDIKKyAgICAgLmxvbmcgMjQKKyAgICAgLmxvbmcgMjIKKy5nbG9ibCBjb21tb24wCisuZGF0YQorLmFsaWduX2l0Citjb21tb24wOgorLmxvbmcgNDIKKyAgICAgLmxvbmcgMjQKKyAgICAgLmxvbmcgMjIKKy5iZWdpbl9jb21tb24gImNvbW1vbjAiCisuc3RhYnMgImNvbW1vbjB2YXIwOlMxIiwgTl9HU1lNLDAsMCwgMAorLnN0YWJzICJjb21tb24wdmFyMTpTMSIsIE5fR1NZTSwwLDAsIDQKKy5zdGFicyAiY29tbW9uMHZhcjI6UzEiLCBOX0dTWU0sMCwwLCA4CisuZW5kX2NvbW1vbiAiY29tbW9uMCIKKworLnN0YWJzICJhdHRyOTQ6RzM5ND1AXiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjk1OkczOTU9QF8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHIxMDA6RzQwMD1AZCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjEwMTpHNDAxPUBlICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyMTAyOkc0MDI9QGYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHIxMDM6RzQwMz1AZyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjEwNjpHNDA2PUBqICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyMTA3Okc0MDc9QGsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHIxMDg6RzQwOD1AbCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjEwOTpHNDA5PUBtICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyMTEwOkc0MTA9QG4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHIxMTE6RzQxMT1AbyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjExMjpHNDEyPUBwICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyMTEzOkc0MTM9QHEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHIxMTQ6RzQxND1AciAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjExNTpHNDE1PUBzICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyMTE2Okc0MTY9QHQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHIxMTc6RzQxNz1AdSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjExODpHNDE4PUB2ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyMTE5Okc0MTk9QHcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHIxMjA6RzQyMD1AeCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjEyMTpHNDIxPUB5ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyMTIyOkc0MjI9QHogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHIxMjM6RzQyMz1AeyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKy5zdGFicyAiYXR0cjEyNDpHNDI0PUB8ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMAorLnN0YWJzICJhdHRyMTI1Okc0MjU9QH0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIixOX0dTWU0sMCwwLCAwCisuc3RhYnMgImF0dHIxMjY6RzQyNj1AfiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLE5fR1NZTSwwLDAsIDAKKworIyBEZWZpbmUgYSB2YXJpYWJsZSBmb3IgYWxsIHRoZSBhYm92ZSBzdGFicy4gIAorLmdsb2JsIGF0dHIzMgorLmRhdGEKKy5hbGlnbl9pdAorYXR0cjMyOgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyMzMKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIzMzoKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjM1CisuZGF0YQorLmFsaWduX2l0CithdHRyMzU6CisubG9uZyA0MgorLmdsb2JsIGF0dHIzNgorLmRhdGEKKy5hbGlnbl9pdAorYXR0cjM2OgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyMzcKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIzNzoKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjM4CisuZGF0YQorLmFsaWduX2l0CithdHRyMzg6CisubG9uZyA0MgorLmdsb2JsIGF0dHIzOQorLmRhdGEKKy5hbGlnbl9pdAorYXR0cjM5OgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyNDEKKy5kYXRhCisuYWxpZ25faXQKK2F0dHI0MToKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjQyCisuZGF0YQorLmFsaWduX2l0CithdHRyNDI6CisubG9uZyA0MgorLmdsb2JsIGF0dHI0MworLmRhdGEKKy5hbGlnbl9pdAorYXR0cjQzOgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyNDQKKy5kYXRhCisuYWxpZ25faXQKK2F0dHI0NDoKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjQ2CisuZGF0YQorLmFsaWduX2l0CithdHRyNDY6CisubG9uZyA0MgorLmdsb2JsIGF0dHI0NworLmRhdGEKKy5hbGlnbl9pdAorYXR0cjQ3OgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyNTgKKy5kYXRhCisuYWxpZ25faXQKK2F0dHI1ODoKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjU5CisuZGF0YQorLmFsaWduX2l0CithdHRyNTk6CisubG9uZyA0MgorLmdsb2JsIGF0dHI2MAorLmRhdGEKKy5hbGlnbl9pdAorYXR0cjYwOgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyNjEKKy5kYXRhCisuYWxpZ25faXQKK2F0dHI2MToKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjYyCisuZGF0YQorLmFsaWduX2l0CithdHRyNjI6CisubG9uZyA0MgorLmdsb2JsIGF0dHI2MworLmRhdGEKKy5hbGlnbl9pdAorYXR0cjYzOgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyNjQKKy5kYXRhCisuYWxpZ25faXQKK2F0dHI2NDoKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjY1CisuZGF0YQorLmFsaWduX2l0CithdHRyNjU6CisubG9uZyA0MgorLmdsb2JsIGF0dHI3MAorLmRhdGEKKy5hbGlnbl9pdAorYXR0cjcwOgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyNzEKKy5kYXRhCisuYWxpZ25faXQKK2F0dHI3MToKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjcyCisuZGF0YQorLmFsaWduX2l0CithdHRyNzI6CisubG9uZyA0MgorLmdsb2JsIGF0dHI3MworLmRhdGEKKy5hbGlnbl9pdAorYXR0cjczOgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyNzQKKy5kYXRhCisuYWxpZ25faXQKK2F0dHI3NDoKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjc1CisuZGF0YQorLmFsaWduX2l0CithdHRyNzU6CisubG9uZyA0MgorLmdsb2JsIGF0dHI3NgorLmRhdGEKKy5hbGlnbl9pdAorYXR0cjc2OgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyNzcKKy5kYXRhCisuYWxpZ25faXQKK2F0dHI3NzoKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjc4CisuZGF0YQorLmFsaWduX2l0CithdHRyNzg6CisubG9uZyA0MgorLmdsb2JsIGF0dHI3OQorLmRhdGEKKy5hbGlnbl9pdAorYXR0cjc5OgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyODAKKy5kYXRhCisuYWxpZ25faXQKK2F0dHI4MDoKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjgxCisuZGF0YQorLmFsaWduX2l0CithdHRyODE6CisubG9uZyA0MgorLmdsb2JsIGF0dHI4MgorLmRhdGEKKy5hbGlnbl9pdAorYXR0cjgyOgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyODMKKy5kYXRhCisuYWxpZ25faXQKK2F0dHI4MzoKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjg0CisuZGF0YQorLmFsaWduX2l0CithdHRyODQ6CisubG9uZyA0MgorCisjIFVucmVjb2duaXplZCBmbG9hdGluZyBwb2ludCBjb2RlLiAgCisuc3RhYnMgImZsb2F0NzJ0eXBlOnQyMDI9Ujg3Ozk7IiwgTl9MU1lNLDAsMCwgMAorCisjIDI1Ni1iaXQgaW50ZWdlci4gIFRoZSBwb2ludCBpcyBvYnZpb3VzbHkgbm90IHRoYXQgR0RCIHNob3VsZCBoYXZlIGEKKyMgc3BlY2lhbCBjYXNlIGZvciB0aGlzIHNpemUsIGJ1dCB0aGF0IGFuIGludGVnZXIgb2YgYW55IHNpemUgc2hvdWxkCisjIHdvcmsgKGF0IGxlYXN0IGZvciBwcmludGluZyBpbiBoZXgsIG5vdCBuZWNlc3NhcmlseSBmb3IgYXJpdGhtZXRpYy4gIAorLnN0YWJzICJpbnQyNTZ2YXI6RzIwMz1idTMyOzA7MjU2OyIsIE5fR1NZTSwwLDAsIDAKKyMgVGhlIHZhbHVlIGlzIHBhbGluZHJvbWljLCBzbyBpdCB3b3JrcyB3aGV0aGVyIHdvcmRzIGFyZSBiaWcgb3IgbGl0dGxlCisjIGVuZGlhbi4gIAorLmdsb2JsIGludDI1NnZhcgorLmRhdGEKKy5hbGlnbl9pdAorICAgICBpbnQyNTZ2YXI6CisubG9uZyA0MgorICAgICAubG9uZyAweDJiLCAweDJjLCAweDJkLCAweDJkLCAweDJjLCAweDJiLCAweDJhCisKKyMgSHVnZSB2YWx1ZSBpbiBjb25zdGFudCBzaG91bGQgYXQgbGVhc3QgZ2V0IHRoZSB0eXBlIHJpZ2h0LiAgCisKKyMgVGhpcyB2YWx1ZSBpcyBqdXN0IGJpZyBlbm91Z2ggbm90IHRvIGZpdCBpbiAzMiBiaXRzLiAgCisuc3RhYnMgImNvbnN0aDpjPWUxLDQyOTQ5NjcyOTYiLCBOX0xTWU0sMCwwLCAwCisKKy5zdGFicyAiY29uc3RoMjpjPWUxLC03MzQ3MjM5ODU3MzI2NDI3NTg5Mjg0NzU2Nzg5ODcyMzQ1NjMyODQ5Mzc0NTYiLCBOX0xTWU0sMCwwLCAwCisKKyMgVGVzdCBhIHN0cnVjdCBjb25zdGFudCB1c2luZyBTLiAgCisuc3RhYnMgImJhZF9uZWcwY29uc3Q6Yz1TMjAxLDEyOCwxMjgsMTEyMjIyMTEzNDM0MzQzNDU2NTY1NjU2Nzc4ODg4NzciLCBOX0xTWU0sMCwwLCAwCisKKyMgQmFkIGZpbGVudW1iZXJzLiAgCisjIFRoaXMgb25lIGlzIHRvdGFsbHkgYm9ndXMuICAKKy5zdGFicyAiYmFkX3R5cGUwOnQoLTMsNykiLCBOX0xTWU0sMCwwLCAwCisjIFRoaXMgb25lIHByb2JhYmx5IGdldHMgaW50ZXJwcmV0ZWQgYXMgYSBmb3J3YXJkIHJlZmVyZW5jZS4gIAorLnN0YWJzICJiYWRfdHlwZTE6dCg0Miw2KSIsIE5fTFNZTSwwLDAsIDAKKworIyBBcnJheXMgaW5kZXhlZCBieSB3ZWlyZCB0aGluZ3MuICAKKy5zdGFicyAiYXJyYXlfaW5kZXgwOnQyMDU9cjE7MDs1OyIsIE5fTFNZTSwwLDAsIDAKKy5zdGFicyAiYXJyYXkwOkcyMDY9YTIwNTsxIiwgTl9HU1lNLDAsMCwgMAorLmdsb2JsIGFycmF5MAorLmRhdGEKKy5hbGlnbl9pdAorICAgICBhcnJheTA6CisubG9uZyA0MgorICAgICAubG9uZyA0MywgNDQsIDQ1LCA0NiwgNDcKKworLnN0YWJzICJhcnJheV9pbmRleDE6dDIwNz0iLCBOX0xTWU0sMCwwLCAwCisuc3RhYnMgImFycmF5MTpHMjA4PWFlYWkxX3JlZDowLGFpMV9ncmVlbjoxLGFpMV9ibHVlOjIsOzsxIiwgTl9HU1lNLDAsMCwgMAorLmdsb2JsIGFycmF5MQorLmRhdGEKKy5hbGlnbl9pdAorICAgICBhcnJheTE6CisubG9uZyA0MgorICAgICAubG9uZyA0MywgNDQKKworIyBTZWUgaWYgR0RCIGNhbiBkZWFsIHdpdGggaXQgaWYgdGhlIGNvbXBpbGVyIGdldHMgc21hcnRlciBhYm91dCBzYXlpbmcKKyMgd2hpY2ggdmFyaWFibGVzIHdlcmUgZGVmaW5lZCB3aXRoIHdoaWNoIHR5cGVzLiAgCisuc3RhYnMgImludHR5cGVfb25lOnQyMDk9MSIsIE5fTFNZTSwwLDAsIDAKKy5zdGFicyAiaW50dHlwZV90d286dDIxMD0xIiwgTl9MU1lNLDAsMCwgMAorLnN0YWJzICJvbmVfdmFyOkcyMDkiLCBOX0dTWU0sMCwwLCAwCisuZ2xvYmwgb25lX3ZhcgorLmRhdGEKKy5hbGlnbl9pdAorb25lX3ZhcjoKKy5sb25nIDQyCisuc3RhYnMgInR3b192YXI6RzIxMCIsIE5fR1NZTSwwLDAsIDAKKy5nbG9ibCB0d29fdmFyCisuZGF0YQorLmFsaWduX2l0Cit0d29fdmFyOgorLmxvbmcgNDIKKworIyBBbmQgc2VlIGlmIHRoZSBjYWRkcl90IGhhY2sgY2FuIGRlYWwgd2l0aCB0aGUgc2FtZSB0aGluZy4KKy5zdGFicyAiaW50cDp0MjExPSoxIiwgTl9MU1lNLDAsMCwgMAorIyBJZiBpdCB3ZXJlbid0IGZvciB0aGlzIHZhcmlhYmxlLCB3ZSdkIG5lZWQgdG8gaWdub3JlIHRoZSBpbnRwIG5hbWUuICAKKy5zdGFicyAicG9pbnRlcl90b19pbnRfdmFyOkcyMTI9KjEiLCBOX0xTWU0sMCwwLCAwCisuc3RhYnMgImludHBfdmFyOkcyMTEiLCBOX0dTWU0sMCwwLCAwCisuZ2xvYmwgaW50cF92YXIKKy5kYXRhCisuYWxpZ25faXQKK2ludHBfdmFyOgorLmxvbmcgNDIKKworIyBVbnJlY29nbml6ZWQgY29uc3RhbnQgY29kZS4gIAorLnN0YWJzICJ1bnJlY29nX2NvbnN0OmM9eGprc2RmbHNrZDMzLDQ7NDczOyIsIE5fTFNZTSwwLDAsIDAKKworLmdsb2JsIGF0dHI4NQorLmRhdGEKKy5hbGlnbl9pdAorYXR0cjg1OgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyODYKKy5kYXRhCisuYWxpZ25faXQKK2F0dHI4NjoKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjg3CisuZGF0YQorLmFsaWduX2l0CithdHRyODc6CisubG9uZyA0MgorLmdsb2JsIGF0dHI4OAorLmRhdGEKKy5hbGlnbl9pdAorYXR0cjg4OgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyODkKKy5kYXRhCisuYWxpZ25faXQKK2F0dHI4OToKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjkwCisuZGF0YQorLmFsaWduX2l0CithdHRyOTA6CisubG9uZyA0MgorLmdsb2JsIGF0dHI5MQorLmRhdGEKKy5hbGlnbl9pdAorYXR0cjkxOgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyOTIKKy5kYXRhCisuYWxpZ25faXQKK2F0dHI5MjoKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjkzCisuZGF0YQorLmFsaWduX2l0CithdHRyOTM6CisubG9uZyA0MgorLmdsb2JsIGF0dHI5NAorLmRhdGEKKy5hbGlnbl9pdAorYXR0cjk0OgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyOTUKKy5kYXRhCisuYWxpZ25faXQKK2F0dHI5NToKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjk2CisuZGF0YQorLmFsaWduX2l0CithdHRyOTY6CisubG9uZyA0MgorLmdsb2JsIGF0dHI5NworLmRhdGEKKy5hbGlnbl9pdAorYXR0cjk3OgorLmxvbmcgNDIKKy5nbG9ibCBhdHRyOTgKKy5kYXRhCisuYWxpZ25faXQKK2F0dHI5ODoKKy5sb25nIDQyCisuZ2xvYmwgYXR0cjk5CisuZGF0YQorLmFsaWduX2l0CithdHRyOTk6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMDAKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMDA6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMDEKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMDE6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMDIKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMDI6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMDMKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMDM6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMDQKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMDQ6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMDUKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMDU6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMDYKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMDY6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMDcKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMDc6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMDgKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMDg6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMDkKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMDk6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMTAKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMTA6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMTEKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMTE6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMTIKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMTI6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMTMKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMTM6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMTQKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMTQ6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMTUKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMTU6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMTYKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMTY6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMTcKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMTc6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMTgKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMTg6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMTkKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMTk6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMjAKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMjA6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMjEKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMjE6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMjUKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMjU6CisubG9uZyA0MgorLmdsb2JsIGF0dHIxMjYKKy5kYXRhCisuYWxpZ25faXQKK2F0dHIxMjY6CisubG9uZyA0MgorCisjIFNpemUuICAKKy5zdGFicyAidmFyMTpHMzAxPUBzMzI7MSIsTl9HU1lNLDAsMCwgMAorLmdsb2JsIHZhcjEKKy5kYXRhCisuYWxpZ25faXQKK3ZhcjE6CisubG9uZyA0MgorIyBQb2ludGVyIGNsYXNzLiAgCisuc3RhYnMgInZhcjI6RzMwMj1AcDQyOzEiLE5fR1NZTSwwLDAsIDAKKy5nbG9ibCB2YXIyCisuZGF0YQorLmFsaWduX2l0Cit2YXIyOgorLmxvbmcgNDIKKyMgUGFja2VkIHR5cGUuICAKKy5zdGFicyAidmFyMzpHMzAzPUBQOzEiLE5fR1NZTSwwLDAsIDAKKy5nbG9ibCB2YXIzCisuZGF0YQorLmFsaWduX2l0Cit2YXIzOgorLmxvbmcgNDIKKworIyBNYW51YWxseSBoYWNrZWQgdmVyc2lvbiBvZiB0aGUgZm9sbG93aW5nLiAgVGhlIG1hbnVhbCBoYWNraW5nIGlzIHRvCisjIHJlbW92ZSB0aGUgZXh0cmEgbmFtZXMgKHdoaWNoIEdEQiA0LjkgYm9ndXNseSByZWxpZXMgb24pLgorCisjIFZpcnR1YWwgYmFzZSBjbGFzc2VzIGluIHdoaWNoIHRoZXJlIGFyZSBubyB2YXJpYWJsZXMgb2YgdGhlIGJhc2UKKyMgY2xhc3MgdHlwZXMuCisKKyMgY2xhc3Mgb25seV9vbmVfaW5zdGFuY2UgeworIyAgcHVibGljOgorIyAgIGludCB4OworIyB9OworCisjIGNsYXNzIGluaGVyaXRfcGF0aF9hIDogcHVibGljIHZpcnR1YWwgb25seV9vbmVfaW5zdGFuY2UgeworIyAgIGludCBhOworIyB9OworCisjIGNsYXNzIGluaGVyaXRfcGF0aF9iIDogcHVibGljIHZpcnR1YWwgb25seV9vbmVfaW5zdGFuY2UgeworIyAgIGludCBiOworIyB9OworCisjIGNsYXNzIGNvbWJpbmVfcGF0aHMgOiBwdWJsaWMgaW5oZXJpdF9wYXRoX2EsIHB1YmxpYyBpbmhlcml0X3BhdGhfYiB7CisjICAgaW50IGNvbWI7CisjIH07CisKKyMgY29tYmluZV9wYXRocyB2X2NvbWI7CisKKyMgVGhlc2UgYXJlIHRoZSB1bmhhY2tlZCBzdGFicyBJIHN0YXJ0ZWQgd2l0aCAob25seSBjaGFuZ2UgaGFzIGJlZW4gdG8KKyMgY29udmVydCB0aGVtIHRvIHdlaXJkLmRlZiBmb3JtYXQsIGFuZCBjaGFuZ2UgdGhlIG51bWJlcnMgdG8gdGhlIDQwMAorIyByYW5nZS4gIAorCisjIC5zdGFicyAib25seV9vbmVfaW5zdGFuY2U6VHQ0NDQ9czR4OjEsMCwzMjs7IiwgTl9MU1lNLDAsMCwgMAorIyAuc3RhYnMgImluaGVyaXRfcGF0aF9hOlR0NDQ1PXMxMiExLDEyMCw0NDQ7JHZiNDQ0OjQ0Nj0qNDQ0LDA7YTovMDEsMzIsMzI7OyIsCisjICAgICAgIE5fTFNZTSwwLDAsIDAKKyMgLnN0YWJzICJpbmhlcml0X3BhdGhfYjpUdDQ0Nz1zMTIhMSwxMjAsNDQ0OyR2YjQ0NDo0NDYsMDtiOi8wMSwzMiwzMjs7IiwgTl9MU1lNLDAsMCwgMAorIyAuc3RhYnMgImNvbWJpbmVfcGF0aHM6VHQ0NDg9czI0ITIsMDIwLDQ0NTswMjY0LDQ0Nztjb21iOi8wMSwxMjgsMzI7OyIsIE5fTFNZTSwwLDAsIDAKKyMgLnN0YWJzICJ2X2NvbWI6RzQ0OCIsIE5fR1NZTSwwLDAsIDAKKworIyBIYWNrZWQgdmVyc2lvbiwgd2l0aG91dCBjbGFzcyBuYW1lcy4KKworLnN0YWJzICJ2X2NvbWI6RzQ0OD1zMjQhMiwwMjAsNDQ1PXMxMiExLDEyMCw0NDQ9czR4OjEsMCwzMjs7OyR2YjQ0NDo0NDY9QHMzMjsqNDQ0LDA7YTovMDEsMzIsMzI7OzswMjY0LDQ0Nz1zMTIhMSwxMjAsNDQ0OyR2YjQ0NDo0NDYsMDtiOi8wMSwzMiwzMjs7O2NvbWI6LzAxLDEyOCwzMjs7IiwgTl9HU1lNLDAsMCwgMAorCisJLmdsb2JsIHZfY29tYgorCS5hbGlnbiAxCit2X2NvbWI6CisjIHZpcnR1YWwgYmFzZSBjbGFzcyBwb2ludGVyIGZvciBpbmhlcml0X3BhdGhfYSAKKwkubG9uZyB2X2NvbWJfc2hhcmVkIAorIyBhIAorCS5sb25nIDQzIAorIyB2aXJ0dWFsIGJhc2UgY2xhc3MgcG9pbnRlciBmb3IgaW5oZXJpdF9wYXRoX2IgCisJLmxvbmcgdl9jb21iX3NoYXJlZCAKKyMgYiAKKwkubG9uZyA0NCAKKyMgY29tYiAKKwkubG9uZyA0NSAKK3ZfY29tYl9zaGFyZWQ6CisjIHggCisJLmxvbmcgNDIgCisKKy5zdGFicyAic3ltOTI6XCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgInR5cGU5Mjp0OTI9XCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsTl9MU1lNLDAsMCwwCisuc3RhYnMgImF0dHI5MjpHMzkyPUBcICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsTl9HU1lNLDAsMCwgMApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuc3RhYnMvd2VpcmQuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuc3RhYnMvd2VpcmQuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YWM3YTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5zdGFicy93ZWlyZC5leHAKQEAgLTAsMCArMSwzMjUgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGVzdCB0aGF0IEdEQiBwcm9wZXJseSBpZ25vcmVzIGludmFsaWQgc3RhYnMuCisjIEFsc28gdGVzdCB0aGF0IEdEQiBjYW4gZGVidWcgYSAubyBmaWxlLCBhbmQgdGhhdCBpdCBkb2Vzbid0IG1pbmQKKyMgYSBmaWxlIHRoYXQncyBtb3JlIG1pbmltYWwgdGhhbiB3aGF0IGEgY29tcGlsZXIgbm9ybWFsbHkgcHV0cyBvdXQuCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworIyBJZiB0aGUgdGVzdCBkaXJlY3Rvcnkgd2FzIG5vdCBjcmVhdGVkIGJ5IGNvbmZpZ3VyZSB0aGVuIHNraXAKKyMgdGhpcyB0ZXN0LgoraWYgIVtmaWxlIGlzZGlyZWN0b3J5ICR7b2JqZGlyfS8ke3N1YmRpcn1dIHRoZW4geworICAgIHJldHVybiAwCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitwcm9jIGRvX3Rlc3RzIHt9IHsKKwlnbG9iYWwgYmluZmlsZQorCWdsb2JhbCBnZGJfcHJvbXB0CisKKwkjIE1pcHMvYWxwaGEgdGFyZ2V0cyB0aGF0IHVzZSBnY2Mgd2l0aCBtaXBzLXRmaWxlIHB1dCBvdXQgdGhlIHN0YWJzCisJIyBhc3NlbWJsZXIgZGlyZWN0aXZlcyBlbWJlZGRlZCBpbiBjb21tZW50cy4gSWYgdGhlIGFzc2VtYmxlcgorCSMgZmlsZSBpcyB0aGVuIHByb2Nlc3NlZCB3aXRoIG5hdGl2ZSBjYywgYWxsIHN0YWJzIGRpcmVjdGl2ZXMKKwkjIHdpbGwgYmUgbG9zdC4KKwkjIFNraXAgdGhlIHJlc3Qgb2YgdGhlIHN0YWJzIHRlc3RzIGZvciB0aGlzIGNhc2UuCisJc2VuZF9nZGIgInB0eXBlIGludHR5cGVcbiIKKwlnZGJfZXhwZWN0IHsKKwkJLXJlICJecHR5cGUgaW50dHlwZVxyKlxudHlwZSA9IGludHR5cGUuKiRnZGJfcHJvbXB0ICQiIHsKKwkJCXBhc3MgInN0YWJzIGZvdW5kIgorCQl9CisJCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJCQlzZXR1cF94ZmFpbCAibWlwcy0qLSoiCisJCQlzZXR1cF94ZmFpbCAiYWxwaGEtKi0qIgorCQkJZmFpbCAic3RhYnMgbm90IGZvdW5kIgorCQkJcmV0dXJuCisJCX0KKwkJZGVmYXVsdCB7IGZhaWwgImNoZWNraW5nIGZvciBzdGFicyIgfQorCX0KKworCXByaW50X3dlaXJkX3ZhciB2YXIwCisJcHJpbnRfd2VpcmRfdmFyIHZhcjEKKwlwcmludF93ZWlyZF92YXIgdmFyMgorCXByaW50X3dlaXJkX3ZhciB2YXIzCisKKwlwcmludF93ZWlyZF92YXIgYXR0cjMyCisJcHJpbnRfd2VpcmRfdmFyIGF0dHIzMworCXByaW50X3dlaXJkX3ZhciBhdHRyMzUKKwlwcmludF93ZWlyZF92YXIgYXR0cjM2CisJcHJpbnRfd2VpcmRfdmFyIGF0dHIzNworCXByaW50X3dlaXJkX3ZhciBhdHRyMzgKKwlwcmludF93ZWlyZF92YXIgYXR0cjM5CisJcHJpbnRfd2VpcmRfdmFyIGF0dHI0MQorCXByaW50X3dlaXJkX3ZhciBhdHRyNDIKKwlwcmludF93ZWlyZF92YXIgYXR0cjQzCisJcHJpbnRfd2VpcmRfdmFyIGF0dHI0NAorCXByaW50X3dlaXJkX3ZhciBhdHRyNDYKKwlwcmludF93ZWlyZF92YXIgYXR0cjQ3CisJcHJpbnRfd2VpcmRfdmFyIGF0dHI1OAorCXByaW50X3dlaXJkX3ZhciBhdHRyNTkKKwlwcmludF93ZWlyZF92YXIgYXR0cjYwCisJcHJpbnRfd2VpcmRfdmFyIGF0dHI2MQorCXByaW50X3dlaXJkX3ZhciBhdHRyNjIKKwlwcmludF93ZWlyZF92YXIgYXR0cjYzCisJcHJpbnRfd2VpcmRfdmFyIGF0dHI2NAorCXByaW50X3dlaXJkX3ZhciBhdHRyNjUKKwlwcmludF93ZWlyZF92YXIgYXR0cjY2CisJcHJpbnRfd2VpcmRfdmFyIGF0dHI2NworCXByaW50X3dlaXJkX3ZhciBhdHRyNjgKKwlwcmludF93ZWlyZF92YXIgYXR0cjY5CisJcHJpbnRfd2VpcmRfdmFyIGF0dHI3MAorCXByaW50X3dlaXJkX3ZhciBhdHRyNzEKKwlwcmludF93ZWlyZF92YXIgYXR0cjcyCisJcHJpbnRfd2VpcmRfdmFyIGF0dHI3MworCXByaW50X3dlaXJkX3ZhciBhdHRyNzQKKwlwcmludF93ZWlyZF92YXIgYXR0cjc1CisJcHJpbnRfd2VpcmRfdmFyIGF0dHI3NgorCXByaW50X3dlaXJkX3ZhciBhdHRyNzcKKwlwcmludF93ZWlyZF92YXIgYXR0cjc4CisJcHJpbnRfd2VpcmRfdmFyIGF0dHI3OQorCXByaW50X3dlaXJkX3ZhciBhdHRyODAKKwlwcmludF93ZWlyZF92YXIgYXR0cjgxCisJcHJpbnRfd2VpcmRfdmFyIGF0dHI4MgorCXByaW50X3dlaXJkX3ZhciBhdHRyODMKKwlwcmludF93ZWlyZF92YXIgYXR0cjg0CisJcHJpbnRfd2VpcmRfdmFyIGF0dHI4NQorCXByaW50X3dlaXJkX3ZhciBhdHRyODYKKwlwcmludF93ZWlyZF92YXIgYXR0cjg3CisJcHJpbnRfd2VpcmRfdmFyIGF0dHI4OAorCXByaW50X3dlaXJkX3ZhciBhdHRyODkKKwlwcmludF93ZWlyZF92YXIgYXR0cjkwCisJcHJpbnRfd2VpcmRfdmFyIGF0dHI5MQorCXByaW50X3dlaXJkX3ZhciBhdHRyOTIKKwlwcmludF93ZWlyZF92YXIgYXR0cjkzCisJcHJpbnRfd2VpcmRfdmFyIGF0dHI5NAorCXByaW50X3dlaXJkX3ZhciBhdHRyOTUKKwlwcmludF93ZWlyZF92YXIgYXR0cjk2CisJcHJpbnRfd2VpcmRfdmFyIGF0dHI5NworCXByaW50X3dlaXJkX3ZhciBhdHRyOTgKKwlwcmludF93ZWlyZF92YXIgYXR0cjk5CisJcHJpbnRfd2VpcmRfdmFyIGF0dHIxMDAKKwlwcmludF93ZWlyZF92YXIgYXR0cjEwMQorCXByaW50X3dlaXJkX3ZhciBhdHRyMTAyCisJcHJpbnRfd2VpcmRfdmFyIGF0dHIxMDMKKwlwcmludF93ZWlyZF92YXIgYXR0cjEwNAorCXByaW50X3dlaXJkX3ZhciBhdHRyMTA1CisJcHJpbnRfd2VpcmRfdmFyIGF0dHIxMDYKKwlwcmludF93ZWlyZF92YXIgYXR0cjEwNworCXByaW50X3dlaXJkX3ZhciBhdHRyMTA4CisJcHJpbnRfd2VpcmRfdmFyIGF0dHIxMDkKKwlwcmludF93ZWlyZF92YXIgYXR0cjExMAorCXByaW50X3dlaXJkX3ZhciBhdHRyMTExCisJcHJpbnRfd2VpcmRfdmFyIGF0dHIxMTIKKwlwcmludF93ZWlyZF92YXIgYXR0cjExMworCXByaW50X3dlaXJkX3ZhciBhdHRyMTE0CisJcHJpbnRfd2VpcmRfdmFyIGF0dHIxMTUKKwlwcmludF93ZWlyZF92YXIgYXR0cjExNgorCXByaW50X3dlaXJkX3ZhciBhdHRyMTE3CisJcHJpbnRfd2VpcmRfdmFyIGF0dHIxMTgKKwlwcmludF93ZWlyZF92YXIgYXR0cjExOQorCXByaW50X3dlaXJkX3ZhciBhdHRyMTIwCisJcHJpbnRfd2VpcmRfdmFyIGF0dHIxMjEKKwlwcmludF93ZWlyZF92YXIgYXR0cjEyMgorCXByaW50X3dlaXJkX3ZhciBhdHRyMTIzCisJcHJpbnRfd2VpcmRfdmFyIGF0dHIxMjQKKwlwcmludF93ZWlyZF92YXIgYXR0cjEyNQorCXByaW50X3dlaXJkX3ZhciBhdHRyMTI2CisKKwlnZGJfdGVzdCAicCBjb25zdDY5IiAiID0gNjkiICInZScgY29uc3RhbnQgb24gbm9uLWVudW0gdHlwZSIKKwlnZGJfdGVzdCAid2hhdGlzIGNvbnN0NjkiICJ0eXBlID0gKHVuc2lnbmVkIGludHxpbnR0eXBlKSIgIndoYXRpcyBjb25zdDY5IgorCisJZ2RiX3Rlc3QgInAgc2l6ZW9mIChjb25zdDcwKSIgIiA9IDIiICInZScgY29uc3RhbnQgd2l0aCBlbWJlZGRlZCB0eXBlIgorCisJZ2RiX3Rlc3QgInAgYmFkX25lZzAiICIgPSBce2ZpZWxkMCA9IDQyLCBmaWVsZDIgPS4qZmllbGQzID0gNDVcfSIgInAgYmFkX25lZzAiCisKKwlnZGJfdGVzdCAicHR5cGUgaW50dHlwZSIgInR5cGUgPSAodW5zaWduZWQgaW50fGludHR5cGUpIiAicHR5cGUgb24gaW50dHlwZSIKKwlnZGJfdGVzdCAicCBzaXplb2YgKGZsb2F0NzJ0eXBlKSIgIiA9IDkiICJ1bnJlY29nbml6ZWQgZmxvYXRpbmcgcG9pbnQgdHlwZSIKKworCSMgVGhpcyBiaWcgbnVtYmVyIG5lZWRzIHRvIGJlIGtlcHQgYXMgb25lIHBpZWNlCisJZ2RiX3Rlc3QgInAveCBpbnQyNTZ2YXIiICIgPSAweDAqMmEwMDAwMDAyYjAwMDAwMDJjMDAwMDAwMmQwMDAwMDAyZDAwMDAwMDJjMDAwMDAwMmIwMDAwMDAyYSIgInByaW50IHZlcnkgYmlnIGludGVnZXIiCisKKwlnZGJfdGVzdCAid2hhdGlzIGNvbnN0aCIgInR5cGUgPSBpbnR0eXBlIiAid2hhdGlzIGNvbnN0aCIKKwlnZGJfdGVzdCAid2hhdGlzIGNvbnN0aDIiICJ0eXBlID0gaW50dHlwZSIgIndoYXRpcyBjb25zdGgyIgorCisJIyBHREIgZG9lcyBub3QgeWV0IHVuZGVyc3RhbmQgUyBjb25zdGFudHMKKwlzZXR1cF94ZmFpbCAiKi0qLSoiCisJZ2RiX3Rlc3QgInAveCBiYWRfbmVnMGNvbnN0IiAiID0gXHtmaWVsZDAgPSAweDExMjIyMjExLCBmaWVsZDIgPS4qXAorZmllbGQzID0gMHg3Nzg4ODg3N1x9IiAicHJpbnQgc3RydWN0IGNvbnN0YW50IgorCisJZ2RiX3Rlc3QgInB0eXBlIGJhZF90eXBlMCIgInR5cGUgPSAuKiIgInByaW50IGJhZF90eXBlMCIKKwlnZGJfdGVzdCAicHR5cGUgYmFkX3R5cGUxIiAidHlwZSA9IC4qIiAicHJpbnQgYmFkX3R5cGUxIgorCisJIyBHREIgZG9lcyBub3QgeWV0IHN1cHBvcnQgYXJyYXlzIGluZGV4ZWQgYnkgYW55dGhpbmcgYXQgYWxsIHVudXN1YWwKKwlzZXR1cF94ZmFpbCAiKi0qLSoiCisJZ2RiX3Rlc3QgInAgYXJyYXkwIiAiID0gXHs0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3XH0iICJhcnJheTAgd2l0aCBzdHJhbmdlIGluZGV4IgorCXNldHVwX3hmYWlsICIqLSotKiIKKwlnZGJfdGVzdCAicCBhcnJheTEiICIgPSBcezQyLCA0MywgNDRcfSIgImFycmF5MSB3aXRoIHN0cmFuZ2UgaW5kZXgiCisKKwkjIEdEQiBkb2VzIG5vdCB5ZXQgc3VwcG9ydCB0aGlzIGZlYXR1cmUKKwlnZGJfdGVzdCAid2hhdGlzIG9uZV92YXIiICJ0eXBlID0gaW50dHlwZV9vbmUiIFwKKwkgICAgIndoYXRpcyBvbmVfdmFyIChrbm93biBmYWlsdXJlIGluIGdkYiA0LjEwKSIKKwkjIEJ1dCBkbyBtYWtlIHN1cmUgdGhhdCBpdCBwcmludHMgYXMgc29tZXRoaW5nIHJlYXNvbmFibGUKKwlnZGJfdGVzdCAid2hhdGlzIG9uZV92YXIiICJ0eXBlID0gaW50dHlwZSh8X29uZSkiIFwKKwkgICAgIndoYXRpcyBvbmVfdmFyIHRlc3QgMiIKKworCWdkYl90ZXN0ICJ3aGF0aXMgdHdvX3ZhciIgInR5cGUgPSBpbnR0eXBlX3R3byIgXAorCSAgICAid2hhdGlzIHR3b192YXIgKGtub3duIGZhaWx1cmUgaW4gZ2RiIDQuMTApIgorCSMgQnV0IGRvIG1ha2Ugc3VyZSB0aGF0IGl0IHByaW50cyBhcyBzb21ldGhpbmcgcmVhc29uYWJsZQorCWdkYl90ZXN0ICJ3aGF0aXMgdHdvX3ZhciIgInR5cGUgPSBpbnR0eXBlKHxfdHdvKSIgXAorCSAgICAid2hhdGlzIHR3b192YXIgdGVzdCAyIgorCisJc2V0dXBfeGZhaWwgIiotKi0qIgorCWdkYl90ZXN0ICJ3aGF0aXMgcG9pbnRlcl90b19pbnRfdmFyIiAidHlwZSA9IGludCBcWypcXSIKKwlzZXR1cF94ZmFpbCAiKi0qLSoiCisJZ2RiX3Rlc3QgIndoYXRpcyBpbnRwX3ZhciIgInR5cGUgPSBpbnRwIgorCisJZ2RiX3Rlc3QgInAgY29tbW9uMHZhcjAiICI9IDQyIgorCSMgR0RCIHNlZW1zIHRvIG9ubHkgdW5kZXJzdGFuZCBjb21tb24gYmxvY2tzIGxvY2FsIHRvIGEgZnVuY3Rpb24uCisJIyBUaGVzZSB2YXJpYWJsZXMgbmV2ZXIgZ2V0IHJlbG9jYXRlZCB0byBiZSByZWxhdGl2ZSB0byB0aGUgY29tbW9uIAorCSMgYmxvY2suCisJIyBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBpcyB2YWxpZCB0byBoYXZlIGEgY29tbW9uIGJsb2NrIHdoaWNoCisJIyBpcyBub3QgbG9jYWwgdG8gYSBmdW5jdGlvbi4KKwlzZXR1cF94ZmFpbCAiKi0qLSoiCisJZ2RiX3Rlc3QgInAgY29tbW9uMHZhcjEiICI9IDI0IgorCXNldHVwX3hmYWlsICIqLSotKiIKKwlnZGJfdGVzdCAicCBjb21tb24wdmFyMiIgIj0gMjIiCisKKwkjIHRoaXMgbG9uZyBsaW5lIG11c3QgYmUgY29udGlub3VzLCBub3Qgd2l0aCAiLyIgZXNjYXBpbmcgdGhlIG5ld2xpbmUKKwlnZGJfdGVzdCAicCB2X2NvbWIiICJ7PD4gPSB7PD4gPSB7eCA9IDQyfSwgXFtfYS16QS1aJC5cXSogPSBcWzAtOXhhLWZBLUZcXSosIGEgPSA0M30sIDw+ID0ge1xbX2EtekEtWiQuXF0qID0gXFswLTl4YS1mQS1GXF0qLCBiID0gNDR9LCBjb21iID0gNDV9IgorfQorCitwcm9jIHByaW50X3dlaXJkX3ZhciB7IHZhciB9IHsKKwlnbG9iYWwgZ2RiX3Byb21wdAorCisJIyBNYWtlIHN1cmUgdGhhdCB0aGUgdmFyaWFibGUgZ2V0cyBwcmludGVkIG91dCBjb3JyZWN0bHksIHdpdGhvdXQKKwkjIGFueSBzb3J0IG9mIHdhcm5pbmcgbWVzc2FnZS4KKwlzZW5kX2dkYiAicHJpbnQgJHZhclxuIgorCWdkYl9leHBlY3QgeworCQktcmUgIl5wcmludCAkdmFyXHIqXG4uXFswLTlcXSogPSA0Mi4qJGdkYl9wcm9tcHQgJCIgeworCQkJcGFzcyAidmFyaWFibGUgJHZhciBwcmludGVkIHByb3Blcmx5IgorCQl9CisJCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJCQlmYWlsICJ2YXJpYWJsZSAkdmFyIG5vdCBwcmludGVkIHByb3Blcmx5IgorCQl9CisJCXRpbWVvdXQgeyBmYWlsICJ2YXJpYWJsZSAkdmFyIG5vdCBwcmludGVkICh0aW1lb3V0KSIgfQorCQllb2YgeyBmYWlsICIoZW9mKSB2YXJpYWJsZSAkdmFyIG5vdCBwcmludGVkIiB9CisJfQorCisJIyBNYWtlIHN1cmUgdGhhdCB0aGUgc3RhYnMgZGlkIGdldCBsb2FkZWQgaW4gYSBzZW5zaWJsZSB3YXkuCisJIyBJZiBzb21laG93IHRoZSBzdGFicyBnb3Qgc2tpcHBlZCwgdGhlbiB0aGUgYWJvdmUgdGVzdCBjYW4KKwkjIHBhc3MgYmVjYXVzZSBHREIgYXNzdW1lcyBpbnQgZm9yIHZhcmlhYmxlcyB3aXRob3V0IGEgc3RhYi4KKworCSMgVGhpcyBkb2Vzbid0IHdvcmsgYmVjYXVzZSAzMj00NSBkb2Vzbid0IHByZXNlcnZlIHRoZSBuYW1lIGluCisJIyBnZGIgKGFzIG9mIDE0IFNlcCA5MyBhbnl3YXkpLgorCSNnZGJfdGVzdCAid2hhdGlzICR2YXIiICJ0eXBlID0gKHVuc2lnbmVkIGludHxpbnR0eXBlKSIKKworCSMgQnV0IHRoZSBzaXplIHNob3VsZCBiZSByaWdodC4KKwlnZGJfdGVzdCAicHJpbnQgc2l6ZW9mICgkdmFyKSIgIj0gNCIKK30KKworCisjIERvbid0IHVzZSBnZGJfbG9hZDsgaXQgZG9lc24ndCBiaXRjaCBpZiB0aGUgbG9hZGluZyBwcm9kdWNlZCBzb21lCisjIGVycm9yIG1lc3NhZ2VzIGR1cmluZyBzeW1ib2wgcmVhZGluZy4KK3NldCB0ZXN0ZmlsZSB3ZWlyZAorc2V0IHNyY2ZpbGUgJHtvYmpkaXJ9LyR7c3ViZGlyfS93ZWlyZC5zCitzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9L3dlaXJkeC5vCisKK2dsb2JhbCB0YXJnZXRfb3MKK3NldCBzZWRzY3JpcHQgJHtzcmNkaXJ9LyR7c3ViZGlyfS9hb3V0LnNlZAorc3dpdGNoIC1nbG9iICR7dGFyZ2V0X3RyaXBsZXR9IHsKKyAgICAiaHBwYSotKi0qIiB7CisJc2V0IHNlZHNjcmlwdCAke3NyY2Rpcn0vJHtzdWJkaXJ9L2hwcGEuc2VkCisgICAgfQorICAgICJtaXBzLSotZWNvZmYiIHsKKwlzZXQgc2Vkc2NyaXB0ICR7c3JjZGlyfS8ke3N1YmRpcn0vZWNvZmYuc2VkCisgICAgfQorICAgICJwb3dlcnBjLSotYWl4KiIgeworCXNldCBzZWRzY3JpcHQgJHtzcmNkaXJ9LyR7c3ViZGlyfS94Y29mZi5zZWQKKyAgICB9CisgICAgInJzNjAwMC0qLWFpeCoiIHsKKwlzZXQgc2Vkc2NyaXB0ICR7c3JjZGlyfS8ke3N1YmRpcn0veGNvZmYuc2VkCisgICAgfQorICAgICIqLSotYW91dCIgeworCXNldCBzZWRzY3JpcHQgJHtzcmNkaXJ9LyR7c3ViZGlyfS9hb3V0LnNlZAorICAgIH0KKyAgICAiKi0qLXhjb2ZmIiB7CisJc2V0IHNlZHNjcmlwdCAke3NyY2Rpcn0vJHtzdWJkaXJ9L3hjb2ZmLnNlZAorICAgIH0KKyAgICAiYWxwaGEtKi0qIiB7CisJc2V0IHNlZHNjcmlwdCAke3NyY2Rpcn0vJHtzdWJkaXJ9L2Vjb2ZmLnNlZAorICAgIH0KK30KKworCisjIEhvcGUgdGhpcyBpcyBhIFVuaXggYm94Lgorc2V0IGV4ZWNfb3V0cHV0IFtyZW1vdGVfZXhlYyBidWlsZCAic2VkIiAiLWYgJHtzZWRzY3JpcHR9IiAiJHtzcmNkaXJ9LyR7c3ViZGlyfS93ZWlyZC5kZWYiICIke3NyY2ZpbGV9Il0KK2lmIHsgW2xpbmRleCAkZXhlY19vdXRwdXQgMF0gIT0gMCB9IHsKKyAgICBwZXJyb3IgIkNvdWxkbid0IG1ha2UgdGVzdCBjYXNlLiAkZXhlY19vdXRwdXQiCisgICAgcmV0dXJuIC0xCit9CisKK2lmICB7IFtnZGJfY29tcGlsZSAiJHtzcmNmaWxlfSIgIiR7YmluZmlsZX0iIG9iamVjdCAiIl0gIT0gIiIgfSB7CisgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCityZW1vdGVfZmlsZSBidWlsZCBkZWxldGUgJHtzcmNmaWxlfQorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCitzZXQgYmluZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgJHtiaW5maWxlfSBvYmplY3Qub10KK3NlbmRfZ2RiICJmaWxlICRiaW5maWxlXG4iCisjIElmICRiaW5maWxlIGlzIHZlcnkgbG9uZywgYSBcciAoYnV0IG5vdCBhIFxuKSB3aWxsIGVjaG8gaW4gdGhlCisjIG1pZGRsZSBvZiB0aGUgZWNobyBvZiB0aGUgY29tbWFuZC4gIFNvIHRvIG1hdGNoIHRoZSBlY2hvLCB3ZQorIyB3b3VsZCBsaWtlIHRvIG1hdGNoIGFueXRoaW5nIG5vdCBjb250YWluaW5nIFxuCisjICh3ZSB3b3VsZCBwcmVmZXIgdG8gYmUgc3VyZSBub3QgdG8gbWF0Y2ggYW55IHdhcm5pbmcgbWVzc2FnZSkuCisjIEJ1dCBcW15cblxdKiBkb2Vzbid0IHNlZW0gdG8gd29yaywgc28gaW5zdGVhZCB1c2UgdGhlIGhldXJpc3RpYworIyB0aGF0IGEgZmlsZW5hbWUgd29uJ3QgY29udGFpbiBhIHNwYWNlIGFuZCBhIHdhcm5pbmcgbWVzc2FnZSB3aWxsLgorIyBCdXQgc3BhY2VzIGZvbGxvd2luZyBieSBiYWNrc3BhY2VzIGFyZW4ndCByZWFsbHkgc3BhY2VzLgorZ2RiX2V4cGVjdCA2MCB7CisgICAgLXJlICJeZmlsZSAoXFteIFxdfCArXDAwOCkqXHIqXG4iIHsKKwlleHBfY29udGludWUKKyAgICB9CisgICAgLXJlICJBIHByb2dyYW0gaXMgYmVpbmcgZGVidWdnZWQgYWxyZWFkeS4gIEtpbGwgaXRcXD8gXFwoeSBvciBuXFwpIiB7CisJc2VuZF9nZGIgInlcbiIKKwlleHBfY29udGludWUKKyAgICB9CisgICAgLXJlICJeUmVhZGluZyBzeW1ib2xzIGZyb20gJGJpbmZpbGVcXC5cXC5cXC5kb25lXC5ccipcbiRnZGJfcHJvbXB0ICQiIHsKKwlwYXNzICJ3ZWlyZHgubyByZWFkIHdpdGhvdXQgZXJyb3IiCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJZmFpbCAiRXJyb3JzIHJlYWRpbmcgd2VpcmR4Lm8iCisgICAgfQorICAgIHRpbWVvdXQgeworCXBlcnJvciAiY291bGRuJ3QgbG9hZCAkYmluZmlsZSBpbnRvICRHREIgKHRpbWVkIG91dCkuIgorCXJldHVybiAtMQorICAgIH0KKyAgICBlb2YgeyBmYWlsICIoZW9mKSBjYW5ub3QgcmVhZCB3ZWlyZHgubyIgfQorfQorCitkb190ZXN0cworCityZW1vdGVfZmlsZSBob3N0IGRlbGV0ZSAke2JpbmZpbGV9CisKK3JldHVybiAwCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5zdGFicy94Y29mZi5zZWQgYi9nZGIvdGVzdHN1aXRlL2dkYi5zdGFicy94Y29mZi5zZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2YjRlZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnN0YWJzL3hjb2ZmLnNlZApAQCAtMCwwICsxLDE3IEBACisjIFB1dCBldmVyeXRoaW5nIGluIHRoaXMgY3NlY3QsIHdoaWNoIHNlZW1zIHRvIG1ha2UgdGhpbmdzIHdvcmsuCisjIFRoZSBjb21waWxlciBhY3R1YWxseSBwdXRzIHRoZSBzdGFicyBpbiAuY3NlY3QgW1BSXSwgYnV0IHRoYXQgZGlkbid0CisjIHdvcmsgaGVyZSAoSSBndWVzcyBiZWNhdXNlIHRoZXJlIGlzIG5vIHRleHQgc2VjdGlvbikuCisxaVwKKwkuY3NlY3QgLmRhdGFbUlddCisjIC5zdGFicyBzdHJpbmcsdHlwZSwwLDAsdmFsdWUgIC0+ICAuc3RhYnggc3RyaW5nLHZhbHVlLHR5cGUsMAorcy9eWyAJXSpcLnN0YWJzWyAJXSpcKCJbXiJdKiJcKSxbIAldKlwoW14sXSpcKSxbIAldKjAsMCxbIAldKlwoLipcKSQvLnN0YWJ4IFwxLFwzLFwyLDAvCitzL05fR1NZTS8xMjgvCisjIFRoaXMgbmVlZHMgdG8gYmUgQ19ERUNMLCB3aGljaCBpcyB1c2VkIGZvciB0eXBlcywgbm90IENfTFNZTSwgd2hpY2ggaXMKKyMgaWdub3JlZCBvbiB0aGUgaW5pdGlhbCBzY2FuLgorcy9OX0xTWU0vMTQwLworcy9cLmJlZ2luX2NvbW1vbi8uYmMvCisjIFRoZSBBSVggYXNzZW1ibGVyIGRvZXNuJ3Qgd2FudCB0aGUgbmFtZSBpbiBhIC5lYyBkaXJlY3RpdmUKK3MvXC5lbmRfY29tbW9uLiovLmVjLworcy9cLmFsaWduX2l0Ly5hbGlnbiAxLworL1wuZGF0YS9kCisvXiMvZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIudGhyZWFkcy9NYWtlZmlsZS5pbiBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRocmVhZHMvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmMjJiNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRocmVhZHMvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwzMSBAQAorVlBBVEggPSBAc3JjZGlyQAorc3JjZGlyID0gQHNyY2RpckAKKworRVhFQ1VUQUJMRVMgPSBwdGhyZWFkcworCithbGw6CisJQGVjaG8gIk5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYWxsLi4uIgorCitpbmZvOgoraW5zdGFsbC1pbmZvOgorZHZpOgoraW5zdGFsbDoKK3VuaW5zdGFsbDogZm9yY2UKK2luc3RhbGxjaGVjazoKK2NoZWNrOgorCitjbGVhbiBtb3N0bHljbGVhbjoKKwktcm0gLWYgKn4gKi5vIGEub3V0IHhnZGIgKi54ICouY2kgKi50bXAgY29yZSogJChFWEVDVVRBQkxFUykKKworZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuOiBjbGVhbgorCS1ybSAtZiBNYWtlZmlsZSBjb25maWcuc3RhdHVzIGNvbmZpZy5sb2cgY29uZmlnLmgKKworTWFrZWZpbGUgOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChzcmNkaXIpL2NvbmZpZ3VyZS5pbgorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKKworY29uZmlnLmg6IHN0YW1wLWggOyBAdHJ1ZQorc3RhbXAtaDogY29uZmlnLmluIGNvbmZpZy5zdGF0dXMKKwlDT05GSUdfSEVBREVSUz1jb25maWcuaDpjb25maWcuaW4gJChTSEVMTCkgY29uZmlnLnN0YXR1cworCitjb25maWcuc3RhdHVzOiBjb25maWd1cmUKKwkkKFNIRUxMKSBjb25maWcuc3RhdHVzIC0tcmVjaGVjawpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIudGhyZWFkcy9jb25maWcuaW4gYi9nZGIvdGVzdHN1aXRlL2dkYi50aHJlYWRzL2NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2JmYzJiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudGhyZWFkcy9jb25maWcuaW4KQEAgLTAsMCArMSw0IEBACisvKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8cHRocmVhZC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9QVEhSRUFEX0gKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLnRocmVhZHMvY29uZmlndXJlIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudGhyZWFkcy9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjY0OTA5OAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRocmVhZHMvY29uZmlndXJlCkBAIC0wLDAgKzEsMTA5OCBAQAorIyEgL2Jpbi9zaAorCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorYWNfbWF4X2hlcmVfbGluZXM9MTIKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPXB0aHJlYWRzLmV4cAorCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCisKK0NDPSR7Q0MtY2N9CisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTc0OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKKworaG9zdF9hbGlhcz0kaG9zdAorY2FzZSAiJGhvc3RfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkKKyAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6CisgICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkgOzsKKyAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCitob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkaG9zdCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU5NTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKwordGFyZ2V0X2FsaWFzPSR0YXJnZXQKK2Nhc2UgIiR0YXJnZXRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKwordGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAordGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK3RhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCit0YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjEzOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworCitlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjM3OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0CisgICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCisgIENQUD0iJHtDQy1jY30gLUUiCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDY1MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NjU4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDY2OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Njc1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9L2xpYi9jcHAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKKworZm9yIGFjX2hkciBpbiBwdGhyZWFkLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3MDE6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3MDYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjcxMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUgY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQFNIRUxMQCUkU0hFTEwlZworcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBERUZTQCUkREVGUyVnCitzJUBMREZMQUdTQCUkTERGTEFHUyVnCitzJUBMSUJTQCUkTElCUyVnCitzJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKK3MlQHByZWZpeEAlJHByZWZpeCVnCitzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCitzJUBiaW5kaXJAJSRiaW5kaXIlZworcyVAc2JpbmRpckAlJHNiaW5kaXIlZworcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworcyVAZGF0YWRpckAlJGRhdGFkaXIlZworcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZworcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCitzJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCitzJUBsaWJkaXJAJSRsaWJkaXIlZworcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworcyVAaW5mb2RpckAlJGluZm9kaXIlZworcyVAbWFuZGlyQCUkbWFuZGlyJWcKK3MlQENDQCUkQ0MlZworcyVAaG9zdEAlJGhvc3QlZworcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZworcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCitzJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKK3MlQGhvc3Rfb3NAJSRob3N0X29zJWcKK3MlQHRhcmdldEAlJHRhcmdldCVnCitzJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZworcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZworcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZworcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKK3MlQGJ1aWxkQCUkYnVpbGQlZworcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCitzJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZworcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKK3MlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZworcyVAQ1BQQCUkQ1BQJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKKyMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyMKKyMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KK2FjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJworYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCithY19kQz0nXDMnCithY19kRD0nJWcnCisjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKK2FjX3VDPScgJworYWNfdUQ9J1w0JWcnCisjIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY19lQj0nJCVcMSNcMmRlZmluZVwzJworYWNfZUM9JyAnCithY19lRD0nJWcnCisKK2lmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmaQorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQorCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0CisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgorCitFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKKyMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKK2NhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKK3MvW1xcJiVdL1xcJi9nCitzJVtcXCRgXSVcXCYlZworcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKK3MlYWNfZCVhY191JWdwCitzJWFjX3UlYWNfZSVncAorRU9GCitzZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCitybSAtZiBjb25mdGVzdC5oZHIKKworIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgorIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCitjYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKK3MlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCitFT0YKKworIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCisjIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgorCitybSAtZiBjb25mdGVzdC50YWlsCit3aGlsZSA6CitkbworICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCisgICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KKyAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQorICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KKyAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCisnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAorICBybSAtZiBjb25mdGVzdC52YWxzCisgIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscworZG9uZQorcm0gLWYgY29uZnRlc3QudmFscworCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAorICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKKyAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCisgICAgcm0gLWYgY29uZnRlc3QuaAorICBlbHNlCisgICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBmaQorICAgIHJtIC1mICRhY19maWxlCisgICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQorICBmaQorZmk7IGRvbmUKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi50aHJlYWRzL2NvbmZpZ3VyZS5pbiBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRocmVhZHMvY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZmU5MWEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi50aHJlYWRzL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDE4IEBACitkbmwgUHJvY2VzcyB0aGlzIGZpbGUgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorZG5sIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCBmcmFnbWVudCB0aGF0IHN1cHBsaWVzIHRoZSBpbmZvcm1hdGlvbgorZG5sIG5lY2Vzc2FyeSB0byB0YWlsb3IgYSB0ZW1wbGF0ZSBjb25maWd1cmUgc2NyaXB0IGludG8gdGhlIGNvbmZpZ3VyZQorZG5sIHNjcmlwdCBhcHByb3ByaWF0ZSBmb3IgdGhpcyBkaXJlY3RvcnkuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sKK2RubCBhbnkgZXhpc3RpbmcgY29uZmlndXJlIHNjcmlwdC4KKworQUNfUFJFUkVRKDIuNSkKK0FDX0lOSVQocHRocmVhZHMuZXhwKQorQUNfQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCisKK0NDPSR7Q0MtY2N9CitBQ19TVUJTVChDQykKK0FDX0NPTkZJR19BVVhfRElSKGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4pCitBQ19DQU5PTklDQUxfU1lTVEVNCisKK0FDX0NIRUNLX0hFQURFUlMocHRocmVhZC5oKQorCitBQ19PVVRQVVQoTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi50aHJlYWRzL3B0aHJlYWRzLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi50aHJlYWRzL3B0aHJlYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZlMWFlOQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRocmVhZHMvcHRocmVhZHMuYwpAQCAtMCwwICsxLDE2OCBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmbmRlZiBIQVZFX1BUSFJFQURfSAorCisvKiBEb24ndCBldmVuIHRyeSB0byBjb21waWxlLiAgSW4gZmFjdCwgY2F1c2UgYSBzeW50YXggZXJyb3IgdGhhdCB3ZSBjYW4KKyAgIGxvb2sgZm9yIGFzIGEgY29tcGlsZXIgZXJyb3IgbWVzc2FnZSBhbmQga25vdyB0aGF0IHdlIGhhdmUgbm8gcHRocmVhZAorICAgc3VwcG9ydC4gIEluIHRoYXQgY2FzZSB3ZSBjYW4ganVzdCBzdXBwcmVzcyB0aGUgdGVzdCBjb21wbGV0ZWx5LiAqLworCisjZXJyb3IgIm5vIHBvc2l4IHRocmVhZHMgc3VwcG9ydCIKKworI2Vsc2UKKworLyogT0suICBXZSBoYXZlIHRoZSByaWdodCBoZWFkZXIuICBJZiB3ZSB0cnkgdG8gY29tcGlsZSB0aGlzIGFuZCBmYWlsLCB0aGVuCisgICB0aGVyZSBpcyBzb21ldGhpbmcgd3JvbmcgYW5kIHRoZSB1c2VyIHNob3VsZCBrbm93IGFib3V0IGl0IHNvIHRoZSB0ZXN0c3VpdGUKKyAgIHNob3VsZCBpc3N1ZSBhbiBFUlJPUiByZXN1bHQuLiAqLworCisjaWZkZWYgX19saW51eF9fCisjZGVmaW5lICBfTUlUX1BPU0lYX1RIUkVBRFMgMQkvKiBMaW51eCAob3IgYXQgbGVhc3QgUmVkSGF0IDQuMCkgbmVlZHMgdGhpcyAqLworI2VuZGlmCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKy8qIFVuZGVyIE9TRiAyLjAgJiAzLjAgYW5kIEhQVVggMTAsIHRoZSBzZWNvbmQgYXJnIG9mIHB0aHJlYWRfY3JlYXRlCisgICBpcyBwcm90b3R5cGVkIHRvIGJlIGp1c3QgYSAicHRocmVhZF9hdHRyX3QiLCB3aGlsZSB1bmRlciBTb2xhcmlzIGl0CisgICBpcyBhICJwdGhyZWFkX2F0dHJfdCAqIi4gIEFyZyEgKi8KKworI2lmIGRlZmluZWQgKF9fb3NmX18pIHx8IGRlZmluZWQgKF9faHB1eF9fKQorI2RlZmluZSBQVEhSRUFEX0NSRUFURV9BUkcyKGFyZykgYXJnCisjZGVmaW5lIFBUSFJFQURfQ1JFQVRFX05VTExfQVJHMiBudWxsX2F0dHIKK3N0YXRpYyBwdGhyZWFkX2F0dHJfdCBudWxsX2F0dHI7CisjZWxzZQorI2RlZmluZSBQVEhSRUFEX0NSRUFURV9BUkcyKGFyZykgJmFyZworI2RlZmluZSBQVEhSRUFEX0NSRUFURV9OVUxMX0FSRzIgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgdmVyYm9zZSA9IDA7CisKK3N0YXRpYyB2b2lkCitjb21tb25fcm91dGluZSAoYXJnKQorICAgICBpbnQgYXJnOworeworICBzdGF0aWMgaW50IGZyb21fdGhyZWFkMTsKKyAgc3RhdGljIGludCBmcm9tX3RocmVhZDI7CisgIHN0YXRpYyBpbnQgZnJvbV9tYWluOworICBzdGF0aWMgaW50IGhpdHM7CisgIHN0YXRpYyBpbnQgZnVsbF9jb3ZlcmFnZTsKKworICBpZiAodmVyYm9zZSkgcHJpbnRmKCJjb21tb25fcm91dGluZSAoJWQpXG4iLCBhcmcpOworICBoaXRzKys7CisgIHN3aXRjaCAoYXJnKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBmcm9tX21haW4rKzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIGZyb21fdGhyZWFkMSsrOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgZnJvbV90aHJlYWQyKys7CisgICAgICBicmVhazsKKyAgICB9CisgIGlmIChmcm9tX21haW4gJiYgZnJvbV90aHJlYWQxICYmIGZyb21fdGhyZWFkMikKKyAgICBmdWxsX2NvdmVyYWdlID0gMTsKK30KKworc3RhdGljIHZvaWQgKgordGhyZWFkMSAodm9pZCAqYXJnKQoreworICBpbnQgaTsKKyAgaW50IHogPSAwOworCisgIGlmICh2ZXJib3NlKSBwcmludGYgKCJ0aHJlYWQxICglMHgpIDsgcGlkID0gJWRcbiIsIGFyZywgZ2V0cGlkICgpKTsKKyAgZm9yIChpPTE7IGkgPD0gMTAwMDAwMDA7IGkrKykKKyAgICB7CisgICAgICBpZiAodmVyYm9zZSkgcHJpbnRmKCJ0aHJlYWQxICVkXG4iLCBwdGhyZWFkX3NlbGYgKCkpOworICAgICAgeiArPSBpOworICAgICAgY29tbW9uX3JvdXRpbmUgKDEpOworICAgICAgc2xlZXAoMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCAqCit0aHJlYWQyICh2b2lkICogYXJnKQoreworICBpbnQgaTsKKyAgaW50IGsgPSAwOworCisgIGlmICh2ZXJib3NlKSBwcmludGYgKCJ0aHJlYWQyICglMHgpIDsgcGlkID0gJWRcbiIsIGFyZywgZ2V0cGlkICgpKTsKKyAgZm9yIChpPTE7IGkgPD0gMTAwMDAwMDA7IGkrKykKKyAgICB7CisgICAgICBpZiAodmVyYm9zZSkgcHJpbnRmKCJ0aHJlYWQyICVkXG4iLCBwdGhyZWFkX3NlbGYgKCkpOworICAgICAgayArPSBpOworICAgICAgY29tbW9uX3JvdXRpbmUgKDIpOworICAgICAgc2xlZXAoMSk7CisgICAgfQorICBzbGVlcCgxMDApOworfQorCitpbnQKK2ZvbyAoYSwgYiwgYykKKyAgICAgaW50IGEsIGIsIGM7Cit7CisgIGludCBkLCBlLCBmOworCisgIGlmICh2ZXJib3NlKSBwcmludGYoImE9JWRcbiIsIGEpOworfQorCittYWluKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICoqYXJndjsKK3sKKyAgcHRocmVhZF90IHRpZDEsIHRpZDI7CisgIGludCBqOworICBpbnQgdCA9IDA7CisgIHZvaWQgKCp4eHgpICgpOworICBwdGhyZWFkX2F0dHJfdCBhdHRyOworCisgIGlmICh2ZXJib3NlKSBwcmludGYgKCJwaWQgPSAlZFxuIiwgZ2V0cGlkKCkpOworCisgIGZvbyAoMSwgMiwgMyk7CisKKyNpZm5kZWYgX19vc2ZfXworICBpZiAocHRocmVhZF9hdHRyX2luaXQgKCZhdHRyKSkKKyAgICB7CisgICAgICBwZXJyb3IgKCJwdGhyZWFkX2F0dHJfaW5pdCAxIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIFBUSFJFQURfU0NPUEVfU1lTVEVNCisgIGlmIChwdGhyZWFkX2F0dHJfc2V0c2NvcGUgKCZhdHRyLCBQVEhSRUFEX1NDT1BFX1NZU1RFTSkpCisgICAgeworICAgICAgcGVycm9yICgicHRocmVhZF9hdHRyX3NldHNjb3BlIDEiKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyNlbmRpZgorCisgIGlmIChwdGhyZWFkX2NyZWF0ZSAoJnRpZDEsIFBUSFJFQURfQ1JFQVRFX0FSRzIoYXR0ciksIHRocmVhZDEsICh2b2lkICopIDB4ZmVlZGZhY2UpKQorICAgIHsKKyAgICAgIHBlcnJvciAoInB0aHJlYWRfY3JlYXRlIDEiKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgaWYgKHZlcmJvc2UpIHByaW50ZiAoIk1hZGUgdGhyZWFkICVkXG4iLCB0aWQxKTsKKyAgc2xlZXAgKDEpOworCisgIGlmIChwdGhyZWFkX2NyZWF0ZSAoJnRpZDIsIFBUSFJFQURfQ1JFQVRFX05VTExfQVJHMiwgdGhyZWFkMiwgKHZvaWQgKikgMHhkZWFkYmVlZikpCisgICAgeworICAgICAgcGVycm9yICgicHRocmVhZF9jcmVhdGUgMiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBpZiAodmVyYm9zZSkgcHJpbnRmKCJNYWRlIHRocmVhZCAlZFxuIiwgdGlkMik7CisKKyAgc2xlZXAgKDEpOworCisgIGZvciAoaiA9IDE7IGogPD0gMTAwMDAwMDA7IGorKykKKyAgICB7CisgICAgICBpZiAodmVyYm9zZSkgcHJpbnRmKCJ0b3AgJWRcbiIsIHB0aHJlYWRfc2VsZiAoKSk7CisgICAgICBjb21tb25fcm91dGluZSAoMCk7CisgICAgICBzbGVlcCgxKTsKKyAgICAgIHQgKz0gajsKKyAgICB9CisgIAorICBleGl0KDApOworfQorCisjZW5kaWYJLyogaWZuZGVmIEhBVkVfUFRIUkVBRF9IICovCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi50aHJlYWRzL3B0aHJlYWRzLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRocmVhZHMvcHRocmVhZHMuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTRhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi50aHJlYWRzL3B0aHJlYWRzLmV4cApAQCAtMCwwICsxLDMyOCBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEZyZWQgRmlzaC4gKGZuZkBjeWdudXMuY29tKQorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKKyMgVGhpcyBvbmx5IHdvcmtzIHdpdGggbmF0aXZlIGNvbmZpZ3VyYXRpb25zCitpZiAhW2lzbmF0aXZlXSB0aGVuIHsKKyAgICByZXR1cm4KK30KKworc2V0IHRlc3RmaWxlICJwdGhyZWFkcyIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICR7b2JqZGlyfS8ke3N1YmRpcn0vJHt0ZXN0ZmlsZX0KKworIyByZWdleHAgZm9yICJob3Jpem9udGFsIiB0ZXh0IChpLmUuIGRvZXNuJ3QgaW5jbHVkZSBuZXdsaW5lIG9yCisjIGNhcnJpYWdlIHJldHVybikKK3NldCBob3JpeiAiXFteXG5cclxdKiIKKworc2V0IGJ1aWx0X2JpbmZpbGUgMAoraWYgW2lzdGFyZ2V0ICIqLSotbGludXgiXSB0aGVuIHsKKyAgICBzZXQgdGFyZ2V0X2NmbGFncyAiLURfTUlUX1BPU0lYX1RIUkVBRFMiCit9IGVsc2UgeworICAgIHNldCB0YXJnZXRfY2ZsYWdzICIiCit9CitzZXQgd2h5X21zZyAidW5yZWNvZ25pemVkIGVycm9yIgorZm9yZWFjaCBsaWIgey1scHRocmVhZHMgLWxwdGhyZWFkfSB7CisgICAgc2V0IG9wdGlvbnMgImRlYnVnIgorICAgIGxhcHBlbmQgb3B0aW9ucyAiaW5jZGlyPSR7b2JqZGlyfS8ke3N1YmRpcn0iCisgICAgbGFwcGVuZCBvcHRpb25zICJsaWJzPSRsaWIiCisgICAgc2V0IGNjb3V0IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS8ke3NyY2ZpbGV9IiAiJHtiaW5maWxlfSIgZXhlY3V0YWJsZSAkb3B0aW9uc10KKyAgICBzd2l0Y2ggLXJlZ2V4cCAtLSAkY2NvdXQgeworCSIuKm5vIHBvc2l4IHRocmVhZHMgc3VwcG9ydC4qIiB7CisJICAgIHNldCB3aHlfbXNnICJtaXNzaW5nIHRocmVhZHMgaW5jbHVkZSBmaWxlIgorCSAgICBicmVhaworCX0KKwkiLipjYW5ub3Qgb3BlbiAtbHB0aHJlYWQuKiIgeworCSAgICBzZXQgd2h5X21zZyAibWlzc2luZyBydW50aW1lIHRocmVhZHMgbGlicmFyeSIKKwl9CisJIi4qQ2FuJ3QgZmluZCBsaWJyYXJ5IGZvciAtbHB0aHJlYWQuKiIgeworCSAgICBzZXQgd2h5X21zZyAibWlzc2luZyBydW50aW1lIHRocmVhZHMgbGlicmFyeSIKKwl9CisJe14kfSB7CisJICAgIHBhc3MgInN1Y2Nlc3NmdWxseSBjb21waWxlZCBwb3NpeCB0aHJlYWRzIHRlc3QgY2FzZSIKKwkgICAgc2V0IGJ1aWx0X2JpbmZpbGUgMQorCSAgICBicmVhaworCX0KKyAgICB9Cit9CitpZiB7JGJ1aWx0X2JpbmZpbGUgPT0gIjAifSB7CisgICAgdW5zdXBwb3J0ZWQgIkNvdWxkbid0IGNvbXBpbGUgJHtzcmNmaWxlfSwgJHt3aHlfbXNnfSIKKyAgICByZXR1cm4gLTEKK30KKworIyBOb3cgd2UgY2FuIHByb2NlZWQgd2l0aCB0aGUgcmVhbCB0ZXN0aW5nLgorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorZ2RiX2xvYWQgJHtiaW5maWxlfQorCitnZGJfdGVzdCAic2V0IHByaW50IHNldmVuYml0LXN0cmluZ3MiICIiCisjZ2RiX3Rlc3QgInNldCBwcmludCBhZGRyZXNzIG9mZiIgIiIKK2dkYl90ZXN0ICJzZXQgd2lkdGggMCIgIiIKKworIyBXZSdsbCBuZWVkIHRoaXMgd2hlbiB3ZSBzZW5kX2dkYiBhIF5DIHRvIEdEQi4gIE5lZWQgdG8gZG8gaXQgYmVmb3JlIHdlCisjIHJ1biB0aGUgcHJvZ3JhbSBhbmQgZ2RiIHN0YXJ0cyBzYXZpbmcgYW5kIHJlc3RvcmluZyB0dHkgc3RhdGVzLgorIyBPbiBVbHRyaXgsIHdlIGRvbid0IG5lZWQgaXQgYW5kIGl0IGlzIHJlYWxseSBzbG93IChiZWNhdXNlIHNoZWxsX2VzY2FwZQorIyBkb2Vzbid0IHVzZSB2Zm9yaykuCitpZiAhW2lzdGFyZ2V0ICIqLSotdWx0cml4KiJdIHRoZW4geworICAgIGdkYl90ZXN0ICJzaGVsbCBzdHR5IGludHIgJ15DJyIgIiIKK30KKworcHJvYyBhbGxfdGhyZWFkc19ydW5uaW5nIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBzcmNmaWxlCisKKyAgICAjIFJlc2V0IGFsbCB0aGUgY291bnRlcnMgdG8gemVyby4KKyAgICBnZGJfdGVzdCAic2V0IHZhciBjb21tb25fcm91dGluZTo6aGl0cz0wIiAiIgorICAgIGdkYl90ZXN0ICJzZXQgdmFyIGNvbW1vbl9yb3V0aW5lOjpmcm9tX3RocmVhZDE9MCIgIiIKKyAgICBnZGJfdGVzdCAic2V0IHZhciBjb21tb25fcm91dGluZTo6ZnJvbV90aHJlYWQyPTAiICIiCisgICAgZ2RiX3Rlc3QgInNldCB2YXIgY29tbW9uX3JvdXRpbmU6OmZyb21fbWFpbj0wIiAiIgorICAgIGdkYl90ZXN0ICJzZXQgdmFyIGNvbW1vbl9yb3V0aW5lOjpmdWxsX2NvdmVyYWdlPTAiICIiCisKKyAgICAjIERpc2FibGUgYWxsIGJyZWFrcG9pbnRzLgorICAgIGdkYl90ZXN0ICJkaXNhYmxlIiAiIgorCisgICAgIyBTZXQgdXAgYSBicmVha3BvaW50IHRoYXQgd2lsbCBjYXVzZSB1cyB0byBzdG9wIHdoZW4gd2UgaGF2ZQorICAgICMgYmVlbiBjYWxsZWQgMTUgdGltZXMuICBUaGlzIHNob3VsZCBiZSBwbGVudHkgb2YgdGltZSB0byBhbGxvdworICAgICMgZXZlcnkgdGhyZWFkIHRvIHJ1biBhdCBsZWFzdCBvbmNlLCBzaW5jZSBlYWNoIHRocmVhZCBzbGVlcHMgZm9yCisgICAgIyBvbmUgc2Vjb25kIGJldHdlZW4gY2FsbHMgdG8gY29tbW9uX3JvdXRpbmUuCisgICAgZ2RiX3Rlc3QgInRicmVhayBjb21tb25fcm91dGluZSBpZiBoaXRzID09IDE1IiAiIgorCisgICAgIyBTdGFydCBhbGwgdGhlIHRocmVhZHMgcnVubmluZyBhZ2FpbiBhbmQgd2FpdCBmb3IgdGhlIGluZmVyaW9yCisgICAgIyB0byBzdG9wLiAgU2luY2Ugbm8gb3RoZXIgYnJlYWtwb2ludHMgYXJlIHNldCBhdCB0aGlzIHRpbWUKKyAgICAjIHdlIHNob3VsZCBzdG9wIG9ubHkgd2hlbiB3ZSBoYXZlIGJlZW4gcHJldmlvdXNseSBjYWxsZWQgMTUgdGltZXMuCisKKyAgICBzZW5kX2dkYiAiY29udGludWVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIkNvbnRpbnVpbmcuKmNvbW1vbl9yb3V0aW5lLiphdC4qJHNyY2ZpbGUuKiRnZGJfcHJvbXB0ICQiIHt9CisJZGVmYXVsdCB7CisJICAgIGZhaWwgImNvbnRpbnVlIHVudGlsIGNvbW1vbiByb3V0aW5lIHJ1biAxNSB0aW1lcyIKKwkgICAgcmV0dXJuIDAKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgImNvbnRpbnVlIHVudGlsIGNvbW1vbiByb3V0aW5lIHJ1biAxNSB0aW1lcyAodGltZW91dCkiCisJICAgIHJldHVybiAwCisJfQorICAgIH0KKworICAgICMgQ2hlY2sgdGhhdCB3ZSBzdG9wcGVkIHdoZW4gd2UgYWN0dWFsbHkgZXhwZWN0ZWQgdG8gc3RvcCwgYnkKKyAgICAjIHZlcmlmeWluZyB0aGF0IHRoZXJlIGhhdmUgYmVlbiAxNSBwcmV2aW91cyBoaXRzLgorCisgICAgc2VuZF9nZGIgInAgY29tbW9uX3JvdXRpbmU6OmhpdHNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIi4qPSAxNVxyXG4kZ2RiX3Byb21wdCAkIiB7fQorCWRlZmF1bHQgeworCSAgICBmYWlsICJzdG9wcGVkIGJlZm9yZSBjYWxsaW5nIGNvbW1vbl9yb3V0aW5lIDE1IHRpbWVzIgorCSAgICByZXR1cm4gMAorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICJzdG9wcGVkIGJlZm9yZSBjYWxsaW5nIGNvbW1vbl9yb3V0aW5lIDE1IHRpbWVzIgorCSAgICByZXR1cm4gMAorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAic3RvcHBlZCBiZWZvcmUgY2FsbGluZyBjb21tb25fcm91dGluZSAxNSB0aW1lcyAodGltZW91dCkiCisJICAgIHJldHVybiAwCisJfQorICAgIH0KKworICAgICMgQWxzbyBjaGVjayB0aGF0IGFsbCBvZiB0aGUgdGhyZWFkcyBoYXZlIHJ1biwgd2hpY2ggd2lsbCBvbmx5IGJlIHRydWUKKyAgICAjIGlmIHRoZSBmdWxsX2NvdmVyYWdlIHZhcmlhYmxlIGlzIHNldC4KKworICAgIHNlbmRfZ2RiICJwIGNvbW1vbl9yb3V0aW5lOjpmdWxsX2NvdmVyYWdlXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIuKj0gMVxyXG4kZ2RiX3Byb21wdCAkIiB7fQorCWRlZmF1bHQgeworCSAgICBmYWlsICJzb21lIHRocmVhZHMgZGlkbid0IHJ1biIKKwkgICAgcmV0dXJuIDAKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgInNvbWUgdGhyZWFkcyBkaWRuJ3QgcnVuICh0aW1lb3V0KSIKKwkgICAgcmV0dXJuIDAKKwl9CisgICAgfQorCisgICAgIyBMb29rcyBmaW5lLCByZXR1cm4gc3VjY2Vzcy4KKyAgICByZXR1cm4gMQorfQorCitwcm9jIHRlc3Rfc3RhcnR1cCB7fSB7CisgICAgZ2xvYmFsIHNyY2RpciBzcmNmaWxlIGdkYl9wcm9tcHQgZXhwZWN0X291dAorICAgIGdsb2JhbCBob3JpegorICAgIGdsb2JhbCBtYWluX2lkIHRocmVhZDFfaWQgdGhyZWFkMl9pZAorCisgICAgIyBXZSBzaG91bGQgYmUgYWJsZSB0byBkbyBhbiBpbmZvIHRocmVhZHMgYmVmb3JlIHN0YXJ0aW5nIGFueSBvdGhlcnMuCisgICAgc2VuZF9nZGIgImluZm8gdGhyZWFkc1xuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiLipUaHJlYWQuKkxXUC4qbWFpbi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJpbmZvIHRocmVhZHMiCisJfQorCS1yZSAiXHJcbiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAiaW5mbyB0aHJlYWRzIgorCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCisJICAgIGZhaWwgImdkYiBkb2VzIG5vdCBzdXBwb3J0IHB0aHJlYWRzIGZvciB0aGlzIG1hY2hpbmUiCisJICAgIHJldHVybiAwCisJfQorICAgIH0KKworICAgICMgRXh0cmFjdCB0aGUgdGhyZWFkIGlkIG51bWJlciBvZiBtYWluIHRocmVhZCBmcm9tICJpbmZvIHRocmVhZHMiIG91dHB1dC4KKyAgICBzZW5kX2dkYiAiaW5mbyB0aHJlYWRzXG4iCisgICAgZ2RiX2V4cGVjdCAtcmUgIihcWzAtOVxdKykoJHtob3Jpen1UaHJlYWQke2hvcml6fW1haW4uKikoJGdkYl9wcm9tcHQgJCkiCisgICAgc2V0IG1haW5faWQgJGV4cGVjdF9vdXQoMSxzdHJpbmcpCisKKyAgICAjIENoZWNrIHRoYXQgd2UgY2FuIGNvbnRpbnVlIGFuZCBjcmVhdGUgdGhlIGZpcnN0IHRocmVhZC4KKyAgICBnZGJfdGVzdCAiYnJlYWsgdGhyZWFkMSIgIkJyZWFrcG9pbnQgLiogZmlsZSAuKiRzcmNkaXIuKiIKKyAgICBnZGJfdGVzdCAiY29udGludWUiIFwKKwkgICAgIkNvbnRpbnVpbmcuKkJyZWFrcG9pbnQgLiosIHRocmVhZDEgXFwoYXJnPTB4ZmVlZGZhY2VcXCkuKmF0Liokc3JjZmlsZS4qIiBcCisJICAgICJDb250aW51ZSB0byBjcmVhdGlvbiBvZiBmaXJzdCB0aHJlYWQiCisgICAgZ2RiX3Rlc3QgImRpc2FibGUiICIiCisKKyAgICAjIEV4dHJhY3QgdGhlIHRocmVhZCBpZCBudW1iZXIgb2YgdGhyZWFkIDEgZnJvbSAiaW5mbyB0aHJlYWRzIiBvdXRwdXQuCisgICAgc2VuZF9nZGIgImluZm8gdGhyZWFkc1xuIgorICAgIGdkYl9leHBlY3QgLXJlICIoXFswLTlcXSspKCR7aG9yaXp9VGhyZWFkJHtob3Jpen10aHJlYWQxLiopKCRnZGJfcHJvbXB0ICQpIgorICAgIHNldCB0aHJlYWQxX2lkICRleHBlY3Rfb3V0KDEsc3RyaW5nKQorCisgICAgIyBDaGVjayB0aGF0IHdlIGNhbiBjb250aW51ZSBhbmQgY3JlYXRlIHRoZSBzZWNvbmQgdGhyZWFkLAorICAgICMgaWdub3JpbmcgdGhlIGZpcnN0IHRocmVhZCBmb3IgdGhlIG1vbWVudC4KKyAgICBnZGJfdGVzdCAiYnJlYWsgdGhyZWFkMiIgIkJyZWFrcG9pbnQgLiogZmlsZSAuKiRzcmNkaXIuKiIKKyAgICBnZGJfdGVzdCAiY29udGludWUiIFwKKwkgICAgIkNvbnRpbnVpbmcuKkJyZWFrcG9pbnQgLiosIHRocmVhZDIgXFwoYXJnPTB4ZGVhZGJlZWZcXCkuKmF0Liokc3JjZmlsZS4qIiBcCisJICAgICJDb250aW51ZSB0byBjcmVhdGlvbiBvZiBzZWNvbmQgdGhyZWFkIgorCisgICAgIyBFeHRyYWN0IHRoZSB0aHJlYWQgaWQgbnVtYmVyIG9mIHRocmVhZCAyIGZyb20gImluZm8gdGhyZWFkcyIgb3V0cHV0LgorICAgIHNlbmRfZ2RiICJpbmZvIHRocmVhZHNcbiIKKyAgICBnZGJfZXhwZWN0IC1yZSAiKFxbMC05XF0rKSgke2hvcml6fVRocmVhZCR7aG9yaXp9dGhyZWFkMi4qKSgkZ2RiX3Byb21wdCAkKSIKKyAgICBzZXQgdGhyZWFkMl9pZCAkZXhwZWN0X291dCgxLHN0cmluZykKKworICAgIHJldHVybiAxCit9CisKK3Byb2MgY2hlY2tfY29udHJvbF9jIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgIyBWZXJpZnkgdGhhdCBhbGwgdGhyZWFkcyBhcmUgcnVubmluZy4KKyAgICBpZiBbYWxsX3RocmVhZHNfcnVubmluZ10gdGhlbiB7CisJcGFzcyAiQWxsIHRocmVhZHMgcnVubmluZyBhZnRlciBzdGFydHVwIgorICAgIH0KKworICAgICMgU2VuZCBhIGNvbnRpbnVlIGZvbGxvd2VkIGJ5IF5DIHRvIHRoZSBwcm9jZXNzIHRvIHN0b3AgaXQuCisgICAgc2VuZF9nZGIgImNvbnRpbnVlXG4iCisgICAgc2V0IGRlc2NyaXB0aW9uICJTdG9wcGVkIHdpdGggYSBeQyIKKyAgICBhZnRlciAxMDAwIFtzZW5kX2dkYiAiXDAwMyJdCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJQcm9ncmFtIHJlY2VpdmVkIHNpZ25hbCBTSUdJTlQuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAkZGVzY3JpcHRpb24KKwl9CisJLXJlICJRdWl0LiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgJGRlc2NyaXB0aW9uCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICIkZGVzY3JpcHRpb24gKHRpbWVvdXQpIgorCX0KKyAgICB9CisgICAgZ2RiX3Rlc3QgImJ0IiAiIgorCisgICAgIyBWZXJpZnkgdGhhdCBhbGwgdGhyZWFkcyBjYW4gYmUgcnVuIGFnYWluIGFmdGVyIGEgXkMgc3RvcC4KKyAgICBpZiBbYWxsX3RocmVhZHNfcnVubmluZ10gdGhlbiB7CisJcGFzcyAiQWxsIHRocmVhZHMgcnVubmluZyBhZnRlciBjb250aW51aW5nIGZyb20gXkMgc3RvcCIKKyAgICB9Cit9CisKK3Byb2MgY2hlY2tfYmFja3RyYWNlcyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQgbWFpbl9pZCB0aHJlYWQxX2lkIHRocmVhZDJfaWQKKworICAgICMgQ2hlY2sgdGhhdCB0aGUgInRocmVhZCBhcHBseSBOIGJhY2t0cmFjZSIgY29tbWFuZCB3b3JrcworCisgICAgZ2RiX3Rlc3QgInRocmVhZCBhcHBseSAkbWFpbl9pZCBiYWNrdHJhY2UiIFwKKwkgICAgIi4qIGluIG1haW4gXFwoYXJnYz0uKiwgYXJndj0uKlxcKS4qIiBcCisJICAgICJjaGVjayBiYWNrdHJhY2UgZnJvbSBtYWluIHRocmVhZCIKKyAgICBnZGJfdGVzdCAidGhyZWFkIGFwcGx5ICR0aHJlYWQxX2lkIGJhY2t0cmFjZSIgXAorCSAgICAiLiogaW4gdGhyZWFkMSBcXChhcmc9MHhmZWVkZmFjZVxcKS4qIiBcCisJICAgICJjaGVjayBiYWNrdHJhY2UgZnJvbSB0aHJlYWQgMSIKKyAgICBnZGJfdGVzdCAidGhyZWFkIGFwcGx5ICR0aHJlYWQyX2lkIGJhY2t0cmFjZSIgXAorCSAgICAiLiogaW4gdGhyZWFkMiBcXChhcmc9MHhkZWFkYmVlZlxcKS4qIiBcCisJICAgICJjaGVjayBiYWNrdHJhY2UgZnJvbSB0aHJlYWQgMiIKKworICAgICMgQ2hlY2sgdGhhdCB3ZSBjYW4gYXBwbHkgdGhlIGJhY2t0cmFjZSBjb21tYW5kIHRvIGFsbAorICAgICMgdGhyZWUgdGhyZWFkcyB3aXRoIGEgc2luZ2xlIGdkYiBjb21tYW5kCisKKyAgICBnZGJfdGVzdCAidGhyZWFkIGFwcGx5ICRtYWluX2lkICR0aHJlYWQxX2lkICR0aHJlYWQyX2lkIGJ0IiBcCisJICAgICIuKiBpbiBtYWluIC4qIGluIHRocmVhZDEgLiogaW4gdGhyZWFkMi4qIiBcCisJICAgICJhcHBseSBiYWNrdHJhY2UgY29tbWFuZCB0byBhbGwgdGhyZWUgdGhyZWFkcyIKKworICAgICMgQ2hlY2sgdGhhdCB3ZSBjYW4gZG8gdGhyZWFkIHNwZWNpZmljIGJhY2t0cmFjZXMKKyAgICAjIFRoaXMgYWxzbyB0ZXN0cyB0aGF0IHdlIGNhbiBkbyB0aHJlYWQgc3BlY2lmaWMgYnJlYWtwb2ludHMuCisKKyAgICBnZGJfdGVzdCAiYnJlYWsgY29tbW9uX3JvdXRpbmUgdGhyZWFkICR0aHJlYWQyX2lkIiBcCisJICAgICJCcmVha3BvaW50IC4qIGF0IDB4LiogZmlsZSAuKiBsaW5lIC4qIiBcCisJICAgICJzZXQgYnJlYWsgYXQgY29tbW9uX3JvdXRpbmUgaW4gdGhyZWFkIDIiCisKKyAgICBzZW5kX2dkYiAiY29udGludWVcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIkJyZWFrcG9pbnQgLiogY29tbW9uX3JvdXRpbmUgXFwoYXJnPTJcXCkuKiIgeworCSAgICBzZW5kX2dkYiAiYmFja3RyYWNlXG4iCisJICAgIGdkYl9leHBlY3QgeworCQktcmUgIiMwLipjb21tb25fcm91dGluZSBcXChhcmc9MlxcKS4qIzEuKnRocmVhZDIuKiIgeworCQkgICAgcGFzcyAiYmFja3RyYWNlIGZyb20gdGhyZWFkIDIgYmtwdCBpbiBjb21tb25fcm91dGluZSIKKwkJfQorCQlkZWZhdWx0IHsKKwkJICAgIGZhaWwgImJhY2t0cmFjZSBmcm9tIHRocmVhZCAyIGJrcHQgaW4gY29tbW9uX3JvdXRpbmUiCisJCX0KKwkJdGltZW91dCB7CisJCSAgICBmYWlsICJiYWNrdHJhY2UgZnJvbSB0aHJlYWQgMiBia3B0IGluIGNvbW1vbl9yb3V0aW5lICh0aW1lb3V0KSIKKwkJfQorCSAgICB9CisJfQorCS1yZSAiQnJlYWtwb2ludCAuKiBjb21tb25fcm91dGluZSBcXChhcmc9MFxcKS4qIiB7CisJICAgIGZhaWwgInN0b3BwZWQgaW4gbWFpbiB0aHJlYWQgYXQgYnJlYWtwb2ludCBmb3IgdGhyZWFkIDIiCisJfQorCS1yZSAiQnJlYWtwb2ludCAuKiBjb21tb25fcm91dGluZSBcXChhcmc9MVxcKS4qIiB7CisJICAgIGZhaWwgInN0b3BwZWQgaW4gbWFpbiB0aHJlYWQgYXQgYnJlYWtwb2ludCBmb3IgdGhyZWFkIDEiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCIgeworCSAgICBmYWlsICJjb250aW51ZSB0byBia3B0IGF0IGNvbW1vbl9yb3V0aW5lIGluIHRocmVhZCAyIgorCX0KKwlkZWZhdWx0IHsKKwkgICAgZmFpbCAiY29udGludWUgdG8gYmtwdCBhdCBjb21tb25fcm91dGluZSBpbiB0aHJlYWQgMiIKKwl9CisJdGltZW91dCB7CisJICAgIGZhaWwgImNvbnRpbnVlIHRvIGJrcHQgYXQgY29tbW9uX3JvdXRpbmUgaW4gdGhyZWFkIDIgKHRpbWVvdXQpIgorCX0KKyAgICB9Cit9CisKK3NldHVwX3hmYWlsICJhbHBoYS0qLW9zZioiCitpZiBbcnVudG9fbWFpbl0gdGhlbiB7CisgICAgY2xlYXJfeGZhaWwgImFscGhhLSotb3NmKiIKKyAgICBpZiBbdGVzdF9zdGFydHVwXSB0aGVuIHsKKwljaGVja19jb250cm9sX2MKKwljaGVja19iYWNrdHJhY2VzCisgICAgfQorfQorY2xlYXJfeGZhaWwgImFscGhhLSotb3NmKiIKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLnRocmVhZHMvc3RlcC5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudGhyZWFkcy9zdGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxOGE0YgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRocmVhZHMvc3RlcC5jCkBAIC0wLDAgKzEsMjIxIEBACisvKiAgICBzdGVwLmMgZm9yIHN0ZXAuZXhwICAgICovCisjaW5jbHVkZSA8aXBjLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKwordm9pZCBhbGFybV9oYW5kbGVyICgpOwordm9pZCBhbGFybV9oYW5kbGVyMSAoKTsKK3ZvaWQgYWxhcm1faGFuZGxlcjIgKCk7Cit2b2lkIHRocmVhZDEgKCk7Cit2b2lkIHRocmVhZDIgKCk7CisKKyNkZWZpbmUgVElNRV9MSU1JVCAzMAorCisKK2ludCBjb3VudDEgPSAwOworaW50IGNvdW50MiA9IDA7CisKK3B0aHJlYWRfdCB0aWQxLCB0aWQyOworcHRocmVhZF9hdHRyX3QgYXR0cjEsIGF0dHIyOworCitwdGhyZWFkX211dGV4X3QgbXV0OworcHRocmVhZF9tdXRleGF0dHJfdCBtdXRfYXR0cjsKKworcHRocmVhZF9jb25kYXR0cl90IGN2X2F0dHJfYSwgY3ZfYXR0cl9iOworcHRocmVhZF9jb25kX3QgY3ZfYSwgY3ZfYjsKKworc3RydWN0IGN2X3N0cnVjdAorICB7CisgICAgY2hhciBhOworICAgIGNoYXIgYjsKKyAgfQordGVzdF9zdHJ1Y3Q7CisKK21haW4gKCkKK3sKKyAgLyppbml0IGxhIHN0cnVjdCAqLworICB0ZXN0X3N0cnVjdC5hID0gMDsKKyAgdGVzdF9zdHJ1Y3QuYiA9IDE7CisKKyAgLyogY3JlYXRlIGxlIG11dGV4ICovCisgIGlmIChwdGhyZWFkX211dGV4YXR0cl9jcmVhdGUgKCZtdXRfYXR0cikgPT0gLTEpCisgICAgeworICAgICAgcGVycm9yICgibXV0ZXhhdHRyX2NyZWF0ZSIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisKKyAgaWYgKHB0aHJlYWRfbXV0ZXhfaW5pdCAoJm11dCwgbXV0X2F0dHIpID09IC0xKQorICAgIHsKKyAgICAgIHBlcnJvciAoIm11dGV4X2luaXQiKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBjcmVhdGUgMiBjdiAqLworICBpZiAocHRocmVhZF9jb25kYXR0cl9jcmVhdGUgKCZjdl9hdHRyX2EpID09IC0xKQorICAgIHsKKyAgICAgIHBlcnJvciAoImNvbmRhdHRyX2NyZWF0ZSgxKSIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIGlmIChwdGhyZWFkX2NvbmRfaW5pdCAoJmN2X2EsIGN2X2F0dHJfYSkgPT0gLTEpCisgICAgeworICAgICAgcGVycm9yICgiY29uZF9pbml0KDEpIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKHB0aHJlYWRfY29uZGF0dHJfY3JlYXRlICgmY3ZfYXR0cl9iKSA9PSAtMSkKKyAgICB7CisgICAgICBwZXJyb3IgKCJjb25kYXR0cl9jcmVhdGUoMikiKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAocHRocmVhZF9jb25kX2luaXQgKCZjdl9iLCBjdl9hdHRyX2IpID09IC0xKQorICAgIHsKKyAgICAgIHBlcnJvciAoImNvbmRfaW5pdCgyKSIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgIC8qIGNyZWF0ZSAyIHRocmVhZHMgb2YgZXhlY3V0aW9uICovCisgIGlmIChwdGhyZWFkX2F0dHJfY3JlYXRlICgmYXR0cjEpID09IC0xKQorICAgIHsKKyAgICAgIHBlcnJvciAoImF0dHJfY3JlYXRlKDEpIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKHB0aHJlYWRfY3JlYXRlICgmdGlkMSwgYXR0cjEsIHRocmVhZDEsICZjb3VudDEpID09IC0xKQorICAgIHsKKyAgICAgIHBlcnJvciAoInB0aHJlYWRfY3JlYXRlKDEpIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKHB0aHJlYWRfYXR0cl9jcmVhdGUgKCZhdHRyMikgPT0gLTEpCisgICAgeworICAgICAgcGVycm9yICgiYXR0cl9jcmVhdGUoMikiKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICBpZiAocHRocmVhZF9jcmVhdGUgKCZ0aWQyLCBhdHRyMiwgdGhyZWFkMiwgJmNvdW50MikgPT0gLTEpCisgICAgeworICAgICAgcGVycm9yICgicHRocmVhZF9jcmVhdGUoMikiKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAvKiBzZXQgYWxhcm0gdG8gcHJpbnQgb3V0IGRhdGEgYW5kIGV4aXQgKi8KKyAgc2lnbmFsIChTSUdBTFJNLCBhbGFybV9oYW5kbGVyKTsKKyAgYWxhcm0gKFRJTUVfTElNSVQpOworCisgIGZvciAoOzspCisgICAgcGF1c2UgKCk7Cit9CisKK3ZvaWQgCit0aHJlYWQxIChjb3VudCkKKyAgICAgaW50ICpjb3VudDsKK3sKKyAgdGlkX3QgdGlkOworCisgIHRpZCA9IGdldHN0aWQgKCk7CisgIHByaW50ZiAoIlRocmVhZDEgdGlkIDB4JXggICglZCkgXG4iLCB0aWQsIHRpZCk7CisgIHByaW50ZiAoIlRocmVhZDEgQHRpZD0weCV4IFxuIiwgJnRpZCk7CisgIHNpZ25hbCAoU0lHQUxSTSwgYWxhcm1faGFuZGxlcjEpOworCisgIGZvciAoOzspCisgICAgeworICAgICAgaWYgKHB0aHJlYWRfbXV0ZXhfbG9jayAoJm11dCkgPT0gLTEpCisJeworCSAgcGVycm9yICgicHRocmVhZF9tdXRleF9sb2NrKDEpIik7CisJICBwdGhyZWFkX2V4aXQgKCh2b2lkICopIDApOworCX0KKworICAgICAgd2hpbGUgKHRlc3Rfc3RydWN0LmEgPT0gMCkKKwl7CisJICBpZiAocHRocmVhZF9jb25kX3dhaXQgKCZjdl9hLCAmbXV0KSA9PSAtMSkKKwkgICAgeworCSAgICAgIHBlcnJvciAoInB0aHJlYWRfY29uZF93YWl0KDEpIik7CisJICAgICAgcHRocmVhZF9leGl0ICgodm9pZCAqKSAtMSk7CisJICAgIH0KKwl9CisKKyAgICAgICgqY291bnQpKys7CisgICAgICBwcmludGYgKCIqKioqKioqdGhyZWFkMSBjb3VudCAlZFxuIiwgKmNvdW50KTsKKworICAgICAgdGVzdF9zdHJ1Y3QuYSA9IDA7CisKKyAgICAgIHRlc3Rfc3RydWN0LmIgPSAxOworICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCAoJmN2X2IpOworCisgICAgICBpZiAocHRocmVhZF9tdXRleF91bmxvY2sgKCZtdXQpID09IC0xKQorCXsKKwkgIHBlcnJvciAoInB0aHJlYWRfbXV0ZXhfdW5sb2NrKDEpIik7CisJICBwdGhyZWFkX2V4aXQgKCh2b2lkICopIC0xKTsKKwl9CisgICAgfQorfQorCit2b2lkIAordGhyZWFkMiAoY291bnQpCisgICAgIGludCAqY291bnQ7Cit7CisgIHRpZF90IHRpZDsKKworICB0aWQgPSBnZXRzdGlkICgpOworICBwcmludGYgKCJUaHJlYWQyIHRpZCAweCV4ICAoJWQpIFxuIiwgdGlkLCB0aWQpOworICBwcmludGYgKCJUaHJlYWQxIEB0aWQ9MHgleCBcbiIsICZ0aWQpOworICBzaWduYWwgKFNJR0FMUk0sIGFsYXJtX2hhbmRsZXIyKTsKKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIGlmIChwdGhyZWFkX211dGV4X2xvY2sgKCZtdXQpID09IC0xKQorCXsKKwkgIHBlcnJvciAoInB0aHJlYWRfbXV0ZXhfbG9jaygyKSIpOworCSAgcHRocmVhZF9leGl0ICgodm9pZCAqKSAwKTsKKwl9CisKKyAgICAgIHdoaWxlICh0ZXN0X3N0cnVjdC5iID09IDApCisJeworCSAgaWYgKHB0aHJlYWRfY29uZF93YWl0ICgmY3ZfYiwgJm11dCkgPT0gLTEpCisJICAgIHsKKwkgICAgICBwZXJyb3IgKCJwdGhyZWFkX2NvbmRfd2FpdCgyKSIpOworCSAgICAgIHB0aHJlYWRfZXhpdCAoKHZvaWQgKikgLTEpOworCSAgICB9CisJfQorCisgICAgICAoKmNvdW50KSsrOworICAgICAgcHJpbnRmICgiKioqKioqKnRocmVhZDIgY291bnQgJWRcbiIsICpjb3VudCk7CisKKyAgICAgIHRlc3Rfc3RydWN0LmIgPSAwOworCisgICAgICB0ZXN0X3N0cnVjdC5hID0gMTsKKyAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwgKCZjdl9hKTsKKworICAgICAgaWYgKHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmbXV0KSA9PSAtMSkKKwl7CisJICBwZXJyb3IgKCJwdGhyZWFkX211dGV4X3VubG9jaygyKSIpOworCSAgcHRocmVhZF9leGl0ICgodm9pZCAqKSAtMSk7CisJfQorICAgIH0KK30KKworCit2b2lkIAorYWxhcm1faGFuZGxlciAoKQoreworICBwcmludGYgKCJcdGNvdW50MSAoJWQpIFxuXHRjb3VudDIgKCVkKVxuIiwgY291bnQxLCBjb3VudDIpOworICBleGl0ICgwKTsKK30KKwordm9pZCAKK2FsYXJtX2hhbmRsZXIxICgpCit7CisgIHByaW50ZiAoIkFMQVJNIHRocmVhZCAxXG4iKTsKK30KKwordm9pZCAKK2FsYXJtX2hhbmRsZXIyICgpCit7CisgIHByaW50ZiAoIkFMQVJNIHRocmVhZCAyXG4iKTsKKyAgcHRocmVhZF9leGl0ICgodm9pZCAqKSAwKTsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLnRocmVhZHMvc3RlcC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi50aHJlYWRzL3N0ZXAuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNTYzOTMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi50aHJlYWRzL3N0ZXAuZXhwCkBAIC0wLDAgKzEsMjAwIEBACisjIHN0ZXAuZXhwIC0tIEV4cGVjdCBzY3JpcHQgdG8gdGVzdCBnZGIgd2l0aCBzdGVwLmMKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBIaXJvIFN1Z2F3YXJhLiAoaGlyb0BseW54LmNvbSkKKyMKKyMgVGhpcyB0ZXN0IHJlYWxseSBuZWVkcyBzb21lIG1ham9yIHN1cmdlcnkgdG8gYmUgYWNjZXB0YWJsZSwgYnV0CisjIEknbSBqdXN0IGFib3V0IGJ1cm50IG91dCBvbiBseW54IHdvcmssIHNvIEknbSBub3QgZG9pbmcgaXQgbm93LgorIworIwkqIFRoZSB0ZXN0IGhhcyBhbiBpbmRldGVybWluYXRlIG51bWJlciBvZiBwYXNzL2ZhaWxzCisjCWZvciBlYWNoIHJ1biAoaXQgcnVucyBhIHNtYWxsIGdyb3VwIG9mIHRlc3RzIHVudGlsCisjCWl0J3MgdGltZXIga2lja3Mgb2ZmKS4gIFRoaXMgaXMgdmVyeSBiYWQgZm9yIG5pZ2h0bHkKKyMJYXV0b21hdGVkIHJlZ3Jlc3Npb24gdGVzdGluZy4KKyMKKyMJKiBJdCB0cmllcyB0byAic3RlcCIgZnJvbSB3aXRoaW50IGhlIHByb2xvZ3VlIG9mIGEKKyMgCWZ1bmN0aW9uLiAgVGhpcyBpc24ndCBzdXBwb3J0IGluIGdkYiAoaXQncyBnb2luZworIwl0byBhY3QgbGlrZSBhIGNvbnRpbnVlKS4KKyMKKyMJKiBUaGlzIHRlc3QgcmFyZWx5IGNoZWNrIHRoYXQgaXQgc3RvcHBlZCBpbiBzZW5zaWJsZQorIwlwbGFjZXMuICAoc2VlIHByZXZpb3VzIGJ1bGxldCAtLSB0aGlzIHRlc3QgZG9lc24ndAorIwljYXRjaCB0aGUgZmFjdCBpdCBjb250aW51ZWQgcmF0aGVyIHRoYW4gc3RlcHBlZCkKKworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHByb2dyYW1fZXhpdGVkIDAKKworcHJvYyBzZXRfYnAgeyB3aGVyZSB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgc2VuZF9nZGIgImJyZWFrICR3aGVyZVxuIgorICAgICMgVGhlIGZpcnN0IHJlZ2V4cCBpcyB3aGF0IHdlIGdldCB3aXRoIC1nLCB0aGUgc2Vjb25kIHdpdGhvdXQgLWcuCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJCcmVhay4qIGF0IC4qOiBmaWxlIC4qLCBsaW5lIFxbMC05XF0qLiokZ2RiX3Byb21wdCAkIiB7fQorCS1yZSAiQnJlYWtwb2ludCBcWzAtOVxdKiBhdCAweFxbMC05YS1mXF0qLiokZ2RiX3Byb21wdCAkIiB7fQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyBmYWlsICJzZXR0aW5nIGJyZWFrcG9pbnQgYXQgJHdoZXJlIiA7IHJldHVybiAwIH0KKwl0aW1lb3V0IHsgZmFpbCAic2V0dGluZyBicmVha3BvaW50IGF0ICR3aGVyZSAodGltZW91dCkiIDsgcmV0dXJuIDAgfQorICAgIH0KKyAgICBwYXNzICJzZXRfYnAiCit9CisKK3Byb2Mgc3RlcF9pdCB7IGNtZCB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBwcm9ncmFtX2V4aXRlZAorCisgICAgc2VuZF9nZGIgIiRjbWRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIjB4XFswLTlBLUZhLWZcXSogKmluLipcclxuJGdkYl9wcm9tcHQgJCIgeyBwYXNzICJzdGVwX2l0IjsgcmV0dXJuIDAgfQorCS1yZSAiMHhcWzAtOUEtRmEtZlxdKiAqXFswLTlcXSouKlxyXG4kZ2RiX3Byb21wdCAkIiB7IHBhc3MgInN0ZXBfaXQiOyByZXR1cm4gMSB9CisJLXJlICJQcm9ncmFtIGV4aXRlZCAuKlxuJGdkYl9wcm9tcHQgJCIgeworCQlzZXQgcHJvZ3JhbV9leGl0ZWQgMQorCQlyZXR1cm4gLTEKKwkgICAgfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIJeyBmYWlsICJzaW5nbGUtc3RlcHBpbmcgKCRjbWQpLlxuIiA7IHJldHVybiAtMSB9CisJdGltZW91dAl7IGZhaWwgInNpbmdsZS1zdGVwcGluZyAoJGNtZCkgdGltb3V0LlxuIiA7IHJldHVybiAtMSB9CisgICAgfQorfQorCitwcm9jIHN0ZXBfaW5zdCB7fSB7CisgICAgc3RlcF9pdCAic3RlcGkiCit9CisKK3Byb2Mgc3RlcF9zb3VyY2Uge30geworICAgIHN0ZXBfaXQgInN0ZXAiCit9CisKK3Byb2MgY29udGludWVfYWxsIHt9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgc2VuZF9nZGIgImNvbnRpbnVlXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJCcmVha3BvaW50IFxbMC05XF0qLCB0aHJlYWRcWzAtOVxdKiAuKiRnZGJfcHJvbXB0ICQiIHsgCisJICAgIHBhc3MgImNvbnRpbnVlX2FsbCIKKwkgICAgcmV0dXJuIDAKKwl9CisJLXJlICJQcm9ncmFtIGV4aXRlZCAuKlxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBzZXQgcHJvZ3JhbV9leGl0ZWQgMQorCSAgICByZXR1cm4gMTsKKwl9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgImNvbnRpbnVlIiA7IHJldHVybiAtMSB9CisJdGltZW91dCB7IGZhaWwgImNvbnRpbnVlICh0aW1lb3V0KSIgOyByZXR1cm4gLTEgfQorICAgIH0KK30KKworcHJvYyBjaGVja190aHJlYWRzIHsgbnVtX3RocmVhZHMgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIHNldCBjdXJyX3RocmVhZCAwCisgICAgc2VuZF9nZGIgImluZm8gdGhyZWFkc1xuIgorICAgIHdoaWxlIHsgJG51bV90aHJlYWRzID4gMCB9IHsKKwlnZGJfZXhwZWN0IHsKKwkgICAgLXJlICJcXCogKlxbMC05XF0qIHByb2Nlc3MgXFswLTlcXSogdGhyZWFkIFxbMC05XF0qIC4qXG4iIHsKKwkJaW5jciBjdXJyX3RocmVhZAorCQlzZXQgbnVtX3RocmVhZHMgW2V4cHIgJG51bV90aHJlYWRzIC0gMV0KKwkgICAgfQorCSAgICAtcmUgIiAqXFswLTlcXSogcHJvY2VzcyBcWzAtOVxdKiB0aHJlYWQgXFswLTlcXSogLipcbiIgeworCQlzZXQgbnVtX3RocmVhZHMgW2V4cHIgJG51bV90aHJlYWRzIC0gMV0KKwkgICAgfQorCSAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsKKwkJaWYgeyAkbnVtX3RocmVhZHMgPCAwIH0geworCQkgICAgZmFpbCAiY2hlY2tfdGhyZWFkcyAodG9vIG1hbnkpIiA7IHJldHVybiAtMQorCQl9CisJCWJyZWFrCisJICAgIH0KKwkgICAgdGltZW91dCB7IGZhaWwgImNoZWNrX3RocmVhZHMgKHRpbWVvdXQpIiA7IHJldHVybiAtMSB9CisJfQorICAgIH0KKworICAgIGlmIHsgJGN1cnJfdGhyZWFkID09IDAgfSB7CisJZmFpbCAiY2hlY2tfdGhyZWFkcyAobm8gY3VycmVudCB0aHJlYWQpXG4iCisJcmV0dXJuIC0xCisgICAgfQorICAgIGlmIHsgJGN1cnJfdGhyZWFkID4gMSB9IHsKKwlmYWlsICJjaGVja190aHJlYWRzIChtb3JlIHRoYW4gb25lIGN1cnJlbnQgdGhyZWFkKVxuIgorCXJldHVybiAtMQorICAgIH0KKyAgICByZXR1cm4gMAorfQorCitwcm9jIHRlc3RfY29uZF93YWl0IHt9IHsKKyAgICBnbG9iYWwgcHJvZ3JhbV9leGl0ZWQKKworICAgIHNldF9icAkxMzUKKyAgICBydW50bwkxNzkKKyAgICB3aGlsZSB7IDEgfSB7CisJc2V0IHN0ZXBpX2NvdW50ZXIgMAorCXdoaWxlIHsgW3N0ZXBfaW5zdF0gfSB7CisJCWlmIHsgJHByb2dyYW1fZXhpdGVkIH0geyBicmVhayB9CisJCWluY3Igc3RlcGlfY291bnRlcgorCQlpZiB7ICRzdGVwaV9jb3VudGVyID4gMzAgfSB7CisJCQlmYWlsICJ0b28gbWFueSBzdGVwaSdzIHBlciBsaW5lXG4iCisJCQlyZXR1cm4gLTEKKwkJfQorCX0KKwlpZiB7ICRwcm9ncmFtX2V4aXRlZCB9IHsgYnJlYWsgfQorCXN0ZXBfc291cmNlCisJaWYgeyAkcHJvZ3JhbV9leGl0ZWQgfSB7IGJyZWFrIH0KKwljb250aW51ZV9hbGwKKwlpZiB7ICRwcm9ncmFtX2V4aXRlZCB9IHsgYnJlYWsgfQorCWNoZWNrX3RocmVhZHMgMworICAgIH0KK30KKworcHJvYyBkb190ZXN0cyB7fSB7CisgICAgZ2xvYmFsIHBybXNfaWQKKyAgICBnbG9iYWwgYnVnX2lkCisgICAgZ2xvYmFsIHN1YmRpcgorICAgIGdsb2JhbCBvYmpkaXIKKyAgICBnbG9iYWwgc3JjZGlyCisgICAgZ2xvYmFsIGJpbmZpbGUKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgc2V0IHBybXNfaWQgMAorICAgIHNldCBidWdfaWQgMAorCisgICAgIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCisgICAgZ2RiX2V4aXQKKyAgICBnZGJfc3RhcnQKKyAgICBnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKyAgICBnZGJfbG9hZCAkb2JqZGlyLyRzdWJkaXIvJGJpbmZpbGUKKworICAgIHNlbmRfZ2RiICJzZXQgd2lkdGggMFxuIgorICAgIGdkYl9leHBlY3QgLXJlICIkZ2RiX3Byb21wdCAkIgorCisgICAgdGVzdF9jb25kX3dhaXQKK30KKworIyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbiBleGVjdXRhYmxlIHRvIHRlc3QuICBJZiBub3QsIHRoZW4gZWl0aGVyIHdlCisjIGhhdmVuJ3QgdHJpZWQgdG8gY29tcGlsZSBvbmUsIG9yIHRoZSBjb21waWxhdGlvbiBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLgorIyBJbiBlaXRoZXIgY2FzZSwganVzdCBub3RpZnkgdGhlIHVzZXIgYW5kIHNraXAgdGhlIHRlc3RzIGluIHRoaXMgZmlsZS4KKworc2V0IGJpbmZpbGUgInN0ZXAiCitzZXQgc3JjZmlsZSAic3RlcC5jIgorCitpZiAhW2ZpbGUgZXhpc3RzICRvYmpkaXIvJHN1YmRpci8kYmluZmlsZV0gdGhlbiB7CisgICAgaWYgJGFsbF9mbGFnIHRoZW4geworCXdhcm5pbmcgIiRiaW5maWxlIGRvZXMgbm90IGV4aXN0OyB0ZXN0cyBzdXBwcmVzc2VkLiIKKyAgICB9Cit9IGVsc2UgeworICAgIGRvX3Rlc3RzCit9CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi50aHJlYWRzL3N0ZXAyLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRocmVhZHMvc3RlcDIuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NDJlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi50aHJlYWRzL3N0ZXAyLmV4cApAQCAtMCwwICsxLDE1MCBAQAorIyBzdGVwMi5leHAgLS0gRXhwZWN0IHNjcmlwdCB0byB0ZXN0IGdkYiBzdGVwLmMKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBKZWZmIExhdy4gKGxhd0BjeWdudXMuY29tKQorIworCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJvZ3JhbV9leGl0ZWQgMAorCisjIEEgc2ltcGxlIGFuZCBjcnVkZSB0ZXN0IHRvIHNlZSB0aGF0IHdlIGNhbiBzdGVwIHR3byB0aHJlYWRzIGluZGVwZW5kZW50bHkKK3Byb2MgdGVzdF9tdWx0aV90aHJlYWRlZF9zdGVwcGluZyB7fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgaGV4CisgICAgZ2xvYmFsIHNyY2ZpbGUKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgIyBTZXQgYnJlYWtwb2ludHMgaW4gY29kZSB0aGF0IHdlIGtub3cgaXMgZXhlY3V0ZWQgaW4gb25seQorICAgICMgdGhyZWFkIG9mIGNvbnRyb2wuCisgICAgZ2RiX3Rlc3QgImJyZWFrIHRocmVhZDEiIFwKKwkgICAgICJCcmVhay4qIGF0ICRoZXg6IGZpbGUgLiokc3JjZmlsZSwgbGluZSAkZGVjaW1hbFxcLiIKKyAgICBnZGJfdGVzdCAiYnJlYWsgdGhyZWFkMiIgXAorCSAgICAgIkJyZWFrLiogYXQgJGhleDogZmlsZSAuKiRzcmNmaWxlLCBsaW5lICRkZWNpbWFsXFwuIgorCisgICAgIyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhpbmdzIGhhcHBlbiBpcyBpbmRldGVybWluYXRlLiAgU28gd2UgYmFzaWNhbGx5CisgICAgIyBsb29rIGZvciBhIHNldCBvZiBldmVudHMgYW5kIG5vdGUgdGhhdCBlYWNoIG9uZSBoYXBwZW5zIGFuZCB0aGF0CisgICAgIyBhbGwgb2YgdGhlIHJlcXVpcmVkIGV2ZW50cyBoYXZlIGhhcHBlbmVkIHdoZW4gd2UncmUgZG9uZS4KKyAgICAjCisgICAgIyBSaWdodCBub3cgd2Ugb25seSB2ZXJpZnkgdGhhdCBib3RoIHRocmVhZHMgc3RhcnQgYW5kIHRoYXQgdGhleQorICAgICMgYm90aCBjYWxsIHB0aHJlYWRfY29uZF93YWl0IHR3aWNlLgorICAgIHNldCB0aHJlYWQxc3RhcnRlZCAwCisgICAgc2V0IHRocmVhZDFjb25kd2FpdCAwCisgICAgc2V0IHRocmVhZDJzdGFydGVkIDAKKyAgICBzZXQgdGhyZWFkMmNvbmR3YWl0IDAKKyAgICAKKyAgICBzZW5kX2dkYiAicnVuXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJUaGUgcHJvZ3JhbSAuKiBoYXMgYmVlbiBzdGFydGVkIGFscmVhZHkuKnkgb3Igbi4gJCIgeworCSAgICBzZW5kX2dkYiAieVxuIgorCSAgICBleHBfY29udGludWUKKwl9CisJLXJlICIuKkJyZWFrcG9pbnQgXFswLTlcXSssLip0aHJlYWQxLiogYXQgLiokc3JjZmlsZTouKlxbXHQgXF0uKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgaWYgeyAkdGhyZWFkMXN0YXJ0ZWQgIT0gMCB9IHRoZW4geworCQlmYWlsICJ0aHJlYWQxIHN0YXJ0ZWQiCisJCXJldHVybgorCSAgICB9IGVsc2UgeworCQlzZXQgdGhyZWFkMXN0YXJ0ZWQgMQorCQlwYXNzICJ0aHJlYWQxIHN0YXJ0ZWQiCisJICAgIH0KKwkgICAgc2VuZF9nZGIgInN0ZXBcbiIKKwkgICAgZXhwX2NvbnRpbnVlCisJfQorCS1yZSAiLipCcmVha3BvaW50IFxbMC05XF0rLC4qdGhyZWFkMi4qIGF0IC4qJHNyY2ZpbGU6LipcW1x0IFxdLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGlmIHsgJHRocmVhZDJzdGFydGVkICE9IDAgfSB0aGVuIHsKKwkJZmFpbCAidGhyZWFkMiBzdGFydGVkIgorCQlyZXR1cm4KKwkgICAgfSBlbHNlIHsKKwkJc2V0IHRocmVhZDJzdGFydGVkIDEKKwkJcGFzcyAidGhyZWFkMiBzdGFydGVkIgorCSAgICB9CisJICAgIHNlbmRfZ2RiICJzdGVwXG4iCisJICAgIGV4cF9jb250aW51ZQorCX0KKwktcmUgIi4qcHRocmVhZF9jb25kX3dhaXQuKmN2X2EuKiRnZGJfcHJvbXB0IiB7CisJICAgIGlmIHsgJHRocmVhZDFzdGFydGVkID09IDAgfSB0aGVuIHsKKwkJZmFpbCAidGhyZWFkMSBjb25kd2FpdCIKKwkJcmV0dXJuCisJICAgIH0KKwkgICAgaWYgeyAkdGhyZWFkMWNvbmR3YWl0IDwgMiB9IHRoZW4geworCQlwYXNzICJ0aHJlYWQxIGNvbmR3YWl0IgorCQlpbmNyIHRocmVhZDFjb25kd2FpdAorCSAgICB9CisJICAgIGlmIHsgJHRocmVhZDJjb25kd2FpdCA9PSAyIH0gdGhlbiB7CisJCXBhc3MgIm11bHRpIHRocmVhZGVkIHN0ZXBwaW5nIgorCQlyZXR1cm4KKwkgICAgfQorCSAgICBzZW5kX2dkYiAic3RlcFxuIgorCSAgICBleHBfY29udGludWUKKwl9CisJCSAgICAKKwktcmUgIi4qcHRocmVhZF9jb25kX3dhaXQuKmN2X2IuKiRnZGJfcHJvbXB0IiB7CisJICAgIGlmIHsgJHRocmVhZDJzdGFydGVkID09IDAgfSB0aGVuIHsKKwkJZmFpbCAidGhyZWFkMiBjb25kd2FpdCIKKwkJcmV0dXJuCisJICAgIH0KKwkgICAgaWYgeyAkdGhyZWFkMmNvbmR3YWl0IDwgMiB9IHRoZW4geworCQlwYXNzICJ0aHJlYWQyIGNvbmR3YWl0IgorCQlpbmNyIHRocmVhZDJjb25kd2FpdAorCSAgICB9CisJICAgIGlmIHsgJHRocmVhZDFjb25kd2FpdCA9PSAyIH0gdGhlbiB7CisJCXBhc3MgIm11bHRpIHRocmVhZGVkIHN0ZXBwaW5nIgorCQlyZXR1cm4KKwkgICAgfQorCSAgICBzZW5kX2dkYiAic3RlcFxuIgorCSAgICBleHBfY29udGludWUKKwl9CisJCSAgICAKKwktcmUgIiRnZGJfcHJvbXB0IiB7CisJICAgIHNlbmRfZ2RiICJzdGVwXG4iCisJICAgIGV4cF9jb250aW51ZQorCX0KKwlkZWZhdWx0IHsgZmFpbCAibXVsdGkgdGhyZWFkZWQgc3RlcHBpbmciIH0KKyAgICB9Cit9CisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW4gZXhlY3V0YWJsZSB0byB0ZXN0LiAgSWYgbm90LCB0aGVuIGVpdGhlciB3ZQorIyBoYXZlbid0IHRyaWVkIHRvIGNvbXBpbGUgb25lLCBvciB0aGUgY29tcGlsYXRpb24gZmFpbGVkIGZvciBzb21lIHJlYXNvbi4KKyMgSW4gZWl0aGVyIGNhc2UsIGp1c3Qgbm90aWZ5IHRoZSB1c2VyIGFuZCBza2lwIHRoZSB0ZXN0cyBpbiB0aGlzIGZpbGUuCisKK3NldCBiaW5maWxlICJzdGVwIgorc2V0IHNyY2ZpbGUgInN0ZXAuYyIKKworaWYgIVtmaWxlIGV4aXN0cyAkb2JqZGlyLyRzdWJkaXIvJGJpbmZpbGVdIHRoZW4geworICAgIGlmICRhbGxfZmxhZyB0aGVuIHsKKwl3YXJuaW5nICIkYmluZmlsZSBkb2VzIG5vdCBleGlzdDsgdGVzdHMgc3VwcHJlc3NlZC4iCisgICAgfQorICAgIHJldHVybgorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworIyBTdGFydCB3aXRoIGEgZnJlc2ggZ2RiLgorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICRvYmpkaXIvJHN1YmRpci8kYmluZmlsZQorCit0ZXN0X211bHRpX3RocmVhZGVkX3N0ZXBwaW5nCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9NYWtlZmlsZS5pbiBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMWM5ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDIxIEBACisjIyMjIGhvc3QsIHRhcmdldCwgYW5kIHNpdGUgc3BlY2lmaWMgTWFrZWZpbGUgZnJhZ3MgY29tZSBpbiBoZXJlLgorCitWUEFUSCA9IEBzcmNkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorCisuUEhPTlk6IGFsbCBjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gcmVhbGNsZWFuCisKK2FsbDogCisJQGVjaG8gIk5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYWxsLi4uIgkKKworY2xlYW4gbW9zdGx5Y2xlYW46CisJLXJtIC1mIGFjdGlvbnMgY2lyYyBjb2xsZWN0aW9uIGxpbWl0cworCS1ybSAtZiAqLm8gKi5kaWZmICp+ICouYmFkIGNvcmUgc2gzIGhwcGEgbW4xMDIwMCBtbjEwMzAwCisKK2Rpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogY2xlYW4KKwktcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cyBjb25maWcubG9nCisKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChzcmNkaXIpL2NvbmZpZ3VyZS5pbgorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKKworCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9hY3Rpb25zLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9hY3Rpb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkZjYxNAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL2FjdGlvbnMuYwpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIFRlc3QgcHJvZ3JhbSBmb3IgdHJhY2UgYWN0aW9uIGNvbW1hbmRzCisgKi8KKworc3RhdGljIGNoYXIgICBnZGJfY2hhcl90ZXN0Oworc3RhdGljIHNob3J0ICBnZGJfc2hvcnRfdGVzdDsKK3N0YXRpYyBsb25nICAgZ2RiX2xvbmdfdGVzdDsKK3N0YXRpYyBjaGFyICAgZ2RiX2Fycl90ZXN0WzI1XTsKK3N0YXRpYyBzdHJ1Y3QgR0RCX1NUUlVDVF9URVNUCit7CisgIGNoYXIgICBjOworICBzaG9ydCAgczsKKyAgbG9uZyAgIGw7CisgIGludCAgICBiZmllbGQgOiAxMTsJLyogY29sbGVjdCBiaXRmaWVsZCAqLworICBjaGFyICAgYXJyWzI1XTsKKyAgc3RydWN0IEdEQl9TVFJVQ1RfVEVTVCAqbmV4dDsKK30gZ2RiX3N0cnVjdDFfdGVzdCwgZ2RiX3N0cnVjdDJfdGVzdCwgKmdkYl9zdHJ1Y3RwX3Rlc3QsICoqZ2RiX3N0cnVjdHBwX3Rlc3Q7CisKK3N0YXRpYyB1bmlvbiBHREJfVU5JT05fVEVTVAoreworICBjaGFyICAgYzsKKyAgc2hvcnQgIHM7CisgIGxvbmcgICBsOworICBpbnQgICAgYmZpZWxkIDogMTE7CS8qIGNvbGxlY3QgYml0ZmllbGQgKi8KKyAgY2hhciAgIGFycls0XTsKKyAgdW5pb24gR0RCX1VOSU9OX1RFU1QgKm5leHQ7Cit9IGdkYl91bmlvbjFfdGVzdDsKKwordm9pZCBnZGJfcmVjdXJzaW9uX3Rlc3QgKGludCwgaW50LCBpbnQsIGludCwgIGludCwgIGludCwgIGludCk7CisKK3ZvaWQgZ2RiX3JlY3Vyc2lvbl90ZXN0IChpbnQgZGVwdGgsIAorCQkJIGludCBxMSwgCisJCQkgaW50IHEyLCAKKwkJCSBpbnQgcTMsIAorCQkJIGludCBxNCwgCisJCQkgaW50IHE1LCAKKwkJCSBpbnQgcTYpCit7CS8qIGdkYl9yZWN1cnNpb25fdGVzdCBsaW5lIDAgKi8KKyAgaW50IHEgPSBxMTsJCQkJCQkvKiBnZGJ0ZXN0bGluZSAxICovCisKKyAgcTEgPSBxMjsJCQkJCQkvKiBnZGJ0ZXN0bGluZSAyICovCisgIHEyID0gcTM7CQkJCQkJLyogZ2RidGVzdGxpbmUgMyAqLworICBxMyA9IHE0OwkJCQkJCS8qIGdkYnRlc3RsaW5lIDQgKi8KKyAgcTQgPSBxNTsJCQkJCQkvKiBnZGJ0ZXN0bGluZSA1ICovCisgIHE1ID0gcTY7CQkJCQkJLyogZ2RidGVzdGxpbmUgNiAqLworICBxNiA9IHE7CQkJCQkJLyogZ2RidGVzdGxpbmUgNyAqLworICBpZiAoZGVwdGgtLSkJCQkJCQkvKiBnZGJ0ZXN0bGluZSA4ICovCisgICAgZ2RiX3JlY3Vyc2lvbl90ZXN0IChkZXB0aCwgcTEsIHEyLCBxMywgcTQsIHE1LCBxNik7CS8qIGdkYnRlc3RsaW5lIDkgKi8KK30KKworCit1bnNpZ25lZCBsb25nICAgZ2RiX2NfdGVzdCggdW5zaWduZWQgbG9uZyAqcGFybSApCisKK3sKKyAgIGNoYXIgKnAgPSAiZ2RiX2NfdGVzdCI7CisgICBjaGFyICpyZWRpY3Vsb3VzbHlfbG9uZ192YXJpYWJsZV9uYW1lX3dpdGhfZXF1YWxseV9sb25nX3N0cmluZ19hc3NpZ25tZW50OworICAgcmVnaXN0ZXIgbG9uZyBsb2NhbF9yZWcgPSA3OworICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9jYWxfc3RhdGljLCBsb2NhbF9zdGF0aWNfc2l6ZW9mOworICAgbG9uZyBsb2NhbF9sb25nOworICAgdW5zaWduZWQgbG9uZyAqc3RhY2tfcHRyOworICAgdW5zaWduZWQgbG9uZyBlbmRfb2Zfc3RhY2s7CisKKyAgIHJlZGljdWxvdXNseV9sb25nX3ZhcmlhYmxlX25hbWVfd2l0aF9lcXVhbGx5X2xvbmdfc3RyaW5nX2Fzc2lnbm1lbnQgPSAKKyAgICAgInJlZGljdWxvdXNseSBsb25nIHZhcmlhYmxlIG5hbWUgd2l0aCBlcXVhbGx5IGxvbmcgc3RyaW5nIGFzc2lnbm1lbnQiOworICAgbG9jYWxfc3RhdGljID0gOTsKKyAgIGxvY2FsX3N0YXRpY19zaXplb2YgPSBzaXplb2YgKHN0cnVjdCBHREJfU1RSVUNUX1RFU1QpOworICAgbG9jYWxfbG9uZyA9IGxvY2FsX3JlZyArIDE7CisgICBzdGFja19wdHIgID0gKHVuc2lnbmVkIGxvbmcgKikgJmxvY2FsX2xvbmc7CisgICBlbmRfb2Zfc3RhY2sgPSAKKyAgICAgKHVuc2lnbmVkIGxvbmcpICZzdGFja19wdHIgKyBzaXplb2Yoc3RhY2tfcHRyKSArIHNpemVvZihlbmRfb2Zfc3RhY2spIC0gMTsKKworICAgZ2RiX2NoYXJfdGVzdCAgID0gZ2RiX3N0cnVjdDFfdGVzdC5jID0gKGNoYXIpICAgKChsb25nKSBwYXJtWzFdICYgMHhmZik7CisgICBnZGJfc2hvcnRfdGVzdCAgPSBnZGJfc3RydWN0MV90ZXN0LnMgPSAoc2hvcnQpICAoKGxvbmcpIHBhcm1bMl0gJiAweGZmZmYpOworICAgZ2RiX2xvbmdfdGVzdCAgID0gZ2RiX3N0cnVjdDFfdGVzdC5sID0gKGxvbmcpICAgKChsb25nKSBwYXJtWzNdICYgMHhmZmZmZmZmZik7CisgICBnZGJfdW5pb24xX3Rlc3QubCA9IChsb25nKSBwYXJtWzRdOworICAgZ2RiX2Fycl90ZXN0WzBdID0gZ2RiX3N0cnVjdDFfdGVzdC5hcnJbMF0gPSAoY2hhcikgKChsb25nKSBwYXJtWzFdICYgMHhmZik7CisgICBnZGJfYXJyX3Rlc3RbMV0gPSBnZGJfc3RydWN0MV90ZXN0LmFyclsxXSA9IChjaGFyKSAoKGxvbmcpIHBhcm1bMl0gJiAweGZmKTsKKyAgIGdkYl9hcnJfdGVzdFsyXSA9IGdkYl9zdHJ1Y3QxX3Rlc3QuYXJyWzJdID0gKGNoYXIpICgobG9uZykgcGFybVszXSAmIDB4ZmYpOworICAgZ2RiX2Fycl90ZXN0WzNdID0gZ2RiX3N0cnVjdDFfdGVzdC5hcnJbM10gPSAoY2hhcikgKChsb25nKSBwYXJtWzRdICYgMHhmZik7CisgICBnZGJfYXJyX3Rlc3RbNF0gPSBnZGJfc3RydWN0MV90ZXN0LmFycls0XSA9IChjaGFyKSAoKGxvbmcpIHBhcm1bNV0gJiAweGZmKTsKKyAgIGdkYl9hcnJfdGVzdFs1XSA9IGdkYl9zdHJ1Y3QxX3Rlc3QuYXJyWzVdID0gKGNoYXIpICgobG9uZykgcGFybVs2XSAmIDB4ZmYpOworICAgZ2RiX3N0cnVjdDFfdGVzdC5iZmllbGQgPSAxNDQ7CisgICBnZGJfc3RydWN0MV90ZXN0Lm5leHQgPSAmZ2RiX3N0cnVjdDJfdGVzdDsKKyAgIGdkYl9zdHJ1Y3RwX3Rlc3QgICAgICA9ICZnZGJfc3RydWN0MV90ZXN0OworICAgZ2RiX3N0cnVjdHBwX3Rlc3QgICAgID0gJmdkYl9zdHJ1Y3RwX3Rlc3Q7CisKKyAgIGdkYl9yZWN1cnNpb25fdGVzdCAoMywgKGxvbmcpIHBhcm1bMV0sIChsb25nKSBwYXJtWzJdLCAobG9uZykgcGFybVszXSwKKwkJICAgICAgIChsb25nKSBwYXJtWzRdLCAobG9uZykgcGFybVs1XSwgKGxvbmcpIHBhcm1bNl0pOworCisgICBnZGJfY2hhcl90ZXN0ID0gZ2RiX3Nob3J0X3Rlc3QgPSBnZGJfbG9uZ190ZXN0ID0gMDsKKyAgIGdkYl9zdHJ1Y3RwX3Rlc3QgID0gKHZvaWQgKikgMDsKKyAgIGdkYl9zdHJ1Y3RwcF90ZXN0ID0gKHZvaWQgKikgMDsKKyAgIG1lbXNldCAoKGNoYXIgKikgJmdkYl9zdHJ1Y3QxX3Rlc3QsIDAsIHNpemVvZiAoZ2RiX3N0cnVjdDFfdGVzdCkpOworICAgbWVtc2V0ICgoY2hhciAqKSAmZ2RiX3N0cnVjdDJfdGVzdCwgMCwgc2l6ZW9mIChnZGJfc3RydWN0Ml90ZXN0KSk7CisgICBsb2NhbF9zdGF0aWNfc2l6ZW9mID0gMDsKKyAgIGxvY2FsX3N0YXRpYyA9IDA7CisgICByZXR1cm4gKCAodW5zaWduZWQgbG9uZykgMCApOworfQorCitzdGF0aWMgdm9pZCBnZGJfYXNtX3Rlc3QgKHZvaWQpCit7Cit9CisKK3N0YXRpYyB2b2lkIGJlZ2luICgpCS8qIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSAqLworeworfQorCitzdGF0aWMgdm9pZCBlbmQgKCkJLyogY2FsbGVkIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZSAqLworeworfQorCitpbnQKK21haW4gKGFyZ2MsIGFyZ3YsIGVudnApCisgICAgIGludCBhcmdjOworICAgICBjaGFyICphcmd2W10sICoqZW52cDsKK3sKKyAgaW50IGk7CisgIHVuc2lnbmVkIGxvbmcgbXlwYXJtc1sxMF07CisKKyNpZmRlZiB1c2VzdHVicworICBzZXRfZGVidWdfdHJhcHMgKCk7CisgIGJyZWFrcG9pbnQgKCk7CisjZW5kaWYKKworICBiZWdpbiAoKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAobXlwYXJtcykgLyBzaXplb2YgKG15cGFybXNbMF0pOyBpKyspCisgICAgbXlwYXJtc1tpXSA9IGk7CisKKyAgZ2RiX2NfdGVzdCAoJm15cGFybXNbMF0pOworCisgIGVuZCAoKTsKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL2FjdGlvbnMuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvYWN0aW9ucy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhYzdhNAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL2FjdGlvbnMuZXhwCkBAIC0wLDAgKzEsMjA3IEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgTWljaGFlbCBTbnlkZXIgKG1zbnlkZXJAY3lnbnVzLmNvbSkKKworbG9hZF9saWIgInRyYWNlLXN1cHBvcnQuZXhwIjsKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CisKK2lmIFtpc3RhcmdldCAibTY4ay0qLWVsZiJdIHRoZW4geworICAgIHNldCBiaW5maWxlIFtib2FyZF9pbmZvIHRhcmdldCBkNDkwX2JpbmZpbGVdOworICAgIHNldCBzcmNmaWxlIGdkYl9jX3Rlc3QuYworfSBlbHNlIHsKKyAgICBzZXQgdGVzdGZpbGUgImFjdGlvbnMiCisgICAgc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworICAgIHNldCBiaW5maWxlICRvYmpkaXIvJHN1YmRpci8kdGVzdGZpbGUKKyAgICBpZiB7IFtnZGJfY29tcGlsZSAiJHNyY2Rpci8kc3ViZGlyLyRzcmNmaWxlIiAkYmluZmlsZSBcCisJICAgIGV4ZWN1dGFibGUge2RlYnVnIGFkZGl0aW9uYWxfZmxhZ3M9LXd9XSAhPSAiIiB9IHsKKwlnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKKyAgICB9Cit9CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKworIyBJZiB0ZXN0aW5nIG9uIGEgcmVtb3RlIGhvc3QsIGRvd25sb2FkIHRoZSBzb3VyY2UgZmlsZS4KKyMgcmVtb3RlX2Rvd25sb2FkIGhvc3QgJHNyY2Rpci8kc3ViZGlyLyRzcmNmaWxlCisKK2dkYl9maWxlX2NtZCAkYmluZmlsZQorCisjIGRlZmluZSByZWxhdGl2ZSBzb3VyY2UgbGluZSBudW1iZXJzOgorIyBhbGwgc3Vic2VxdWVudCBsaW5lIG51bWJlcnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgZmlyc3Qgb25lIChiYXNlbGluZSkKKworc2V0IGJhc2VsaW5lICBbZ2RiX2ZpbmRfcmVjdXJzaW9uX3Rlc3RfYmFzZWxpbmUgJHNyY2ZpbGVdOworaWYgeyAkYmFzZWxpbmUgPT0gLTEgfSB0aGVuIHsKKyAgICBmYWlsICJDb3VsZCBub3QgZmluZCBnZGJfcmVjdXJzaW9uX3Rlc3QgZnVuY3Rpb24iCisgICAgcmV0dXJuOworfQorCitzZXQgdGVzdGxpbmUxIFtleHByICRiYXNlbGluZSArIDddCisKKyMKKyMgdGVzdCBhY3Rpb25zIGNvbW1hbmQKKyMKKworZ2RiX2RlbGV0ZV90cmFjZXBvaW50cworc2V0IHRyY3B0MSBbZ2RiX2dldHRwbnVtIGdkYl9jX3Rlc3RdOworc2V0IHRyY3B0MiBbZ2RiX2dldHRwbnVtIGdkYl9hc21fdGVzdF07CitzZXQgdHJjcHQzIFtnZGJfZ2V0dHBudW0gJHRlc3RsaW5lMV07CitpZiB7ICR0cmNwdDEgPD0gMCB8fCAkdHJjcHQyIDw9IDAgfHwgJHRyY3B0MyA8PSAwIH0gdGhlbiB7CisgICAgZmFpbCAic2V0dGluZyB0cmFjZXBvaW50cyIKKyAgICByZXR1cm47Cit9CisKKyMgNS4xIGFjdGlvbnMgb2Ygc3BlY2lmaWVkIHRyYWNlcG9pbnQKKworc2VuZF9nZGIgImluZm8gdHJhY2Vwb2ludHNcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiQWN0aW9ucyBmb3IgdHJhY2Vwb2ludCBcWzAtOVxdKzouKiRnZGJfcHJvbXB0ICQiIHsKKwlmYWlsICI1LjFhOiB0ZXN0c3VpdGUgZmFpbHVyZSAodHJhY2Vwb2ludCBhbHJlYWR5IGhhcyBhY3Rpb24pISIKKyAgICB9CisgICAgLXJlICJObyB0cmFjZXBvaW50cy4qJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgIjUuMWE6IHNldCB0aHJlZSB0cmFjZXBvaW50cywgbm8gYWN0aW9ucyAoTm8gdHJhY2Vwb2ludHMhKSIKKyAgICB9CisgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7CisJcGFzcyAiNS4xYTogc2V0IHRocmVlIHRyYWNlcG9pbnRzLCBubyBhY3Rpb25zIgorICAgIH0KK30KKworZ2RiX3RyYWNlX3NldGFjdGlvbnMgIjUuMWI6IHNldCBhY3Rpb25zIGZvciBmaXJzdCB0cmFjZXBvaW50IiBcCisJIiR0cmNwdDEiIFwKKwkiY29sbGVjdCBnZGJfY2hhcl90ZXN0IiAiXiQiCisKK3NlbmRfZ2RiICJpbmZvIHRyYWNlcG9pbnRzXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIkFjdGlvbnMgZm9yLiogJHRyY3B0MTouKmNvbGxlY3QgZ2RiX2NoYXJfdGVzdC4qJGdkYl9wcm9tcHQgJCIgeworCXBhc3MgIjUuMWM6IHZlcmlmeSBhY3Rpb25zIHNldCBmb3IgZmlyc3QgdHJhY2Vwb2ludCIKKyAgICB9CisgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7CisJZmFpbCAiNS4xYzogdmVyaWZ5IGFjdGlvbnMgc2V0IGZvciBmaXJzdCB0cmFjZXBvaW50IgorICAgIH0KK30KKworZ2RiX3RyYWNlX3NldGFjdGlvbnMgIjUuMWQ6IHNldCBhY3Rpb25zIGZvciBzZWNvbmQgdHJhY2Vwb2ludCIgXAorCSIkdHJjcHQyIiBcCisJImNvbGxlY3QgZ2RiX3Nob3J0X3Rlc3QiICJeJCIKKworc2VuZF9nZGIgImluZm8gdHJhY2Vwb2ludHNcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiQWN0aW9ucyBmb3IuKiAkdHJjcHQyOi4qY29sbGVjdCBnZGJfc2hvcnRfdGVzdC4qJGdkYl9wcm9tcHQgJCIgeworCXBhc3MgIjUuMWU6IHZlcmlmeSBhY3Rpb25zIHNldCBmb3Igc2Vjb25kIHRyYWNlcG9pbnQiCisgICAgfQorICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgIjUuMWU6IHZlcmlmeSBhY3Rpb25zIHNldCBmb3Igc2Vjb25kIHRyYWNlcG9pbnQiCisgICAgfQorfQorCitnZGJfdHJhY2Vfc2V0YWN0aW9ucyAiNS4yYTogc2V0IGFjdGlvbnMgZm9yIGxhc3QgKGRlZmF1bHQpIHRyYWNlcG9pbnQiIFwKKwkiIiBcCisJImNvbGxlY3QgZ2RiX2xvbmdfdGVzdCIgIl4kIgorCitzZW5kX2dkYiAiaW5mbyB0cmFjZXBvaW50c1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJBY3Rpb25zIGZvci4qICR0cmNwdDM6Lipjb2xsZWN0IGdkYl9sb25nX3Rlc3QuKiRnZGJfcHJvbXB0ICQiIHsKKwlwYXNzICI1LjJiOiB2ZXJpZnkgYWN0aW9ucyBzZXQgZm9yIGxhc3QgKGRlZmF1bHQpIHRyYWNlcG9pbnQiCisgICAgfQorICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgIjUuMmI6IHZlcmlmeSBhY3Rpb25zIHNldCBmb3IgbGFzdCAoZGVmYXVsdCkgdHJhY2Vwb2ludCIKKyAgICB9Cit9CisKKyMgNS4zIHJlcGxhY2UgYWN0aW9ucyBzZXQgZWFybGllcgorCitnZGJfdHJhY2Vfc2V0YWN0aW9ucyAiNS4zYTogcmVzZXQgYWN0aW9ucyBmb3IgZmlyc3QgdHJhY2Vwb2ludCIgXAorCSIkdHJjcHQxIiBcCisJImNvbGxlY3QgZ2RiX3N0cnVjdDFfdGVzdCIgIl4kIgorCitzZW5kX2dkYiAiaW5mbyB0cmFjZXBvaW50c1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJBY3Rpb25zIGZvci4qICR0cmNwdDE6Lipjb2xsZWN0IGdkYl9zdHJ1Y3QxX3Rlc3QuKiRnZGJfcHJvbXB0ICQiIHsKKwlwYXNzICI1LjNiOiB2ZXJpZnkgYWN0aW9ucyBzZXQgZm9yIGZpcnN0IHRyYWNlcG9pbnQiCisgICAgfQorICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgIjUuM2I6IHZlcmlmeSBhY3Rpb25zIHNldCBmb3IgZmlyc3QgdHJhY2Vwb2ludCIKKyAgICB9Cit9CisKKyMKKyMgdGVzdCBlbmQgY29tbWFuZCAoYWxsIGJ5IGl0c2VsZikKKyMKKworIyA1LjQgZW5kIG91dHNpZGUgb2YgY29udGV4dAorCitnZGJfdGVzdCAiZW5kIiAiVGhpcyBjb21tYW5kIGNhbm5vdCBiZSB1c2VkIGF0IHRoZSB0b3AgbGV2ZWwuIiBcCisJCQkiNS40OiAnZW5kJyBjb21tYW5kIG91dCBvZiBjb250ZXh0IgorCisjIDUuNSBlbXB0eSBhY3Rpb25zIChqdXN0IGFuIGVuZCB3aXRoIG5vIG90aGVyIGFjdGlvbnMpCisKK2dkYl90cmFjZV9zZXRhY3Rpb25zICI1LjVhOiBzZXQgZW1wdHkgYWN0aW9ucyBmb3IgZmlyc3QgdHJhY2Vwb2ludCIgXAorCSIkdHJjcHQxIgorCitzZW5kX2dkYiAiaW5mbyB0cmFjZXBvaW50c1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJObyB0cmFjZXBvaW50cy4qJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgIjUuNWM6IHZlcmlmeSBOTyBhY3Rpb25zIGZvciBmaXJzdCB0cmFjZXBvaW50IgorICAgIH0KKyAgICAtcmUgIkFjdGlvbnMgZm9yLiogJHRyY3B0MTouKiRnZGJfcHJvbXB0ICQiIHsKKwlmYWlsICI1LjVjOiB2ZXJpZnkgTk8gYWN0aW9ucyBmb3IgZmlyc3QgdHJhY2Vwb2ludCIKKyAgICB9CisgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7CisJcGFzcyAiNS41YzogdmVyaWZ5IE5PIGFjdGlvbnMgZm9yIGZpcnN0IHRyYWNlcG9pbnQiCisgICAgfQorfQorCisjIDUuNiBhY3Rpb25zIGZvciBpbnZhbGlkIHRyYWNlcG9pbnQgbnVtYmVyCisKK2dkYl90ZXN0ICJhY3Rpb25zIFtleHByICR0cmNwdDIgKyAkdHJjcHQzXSIgXAorICAgICJObyB0cmFjZXBvaW50IG51bWJlciBbZXhwciAkdHJjcHQyICsgJHRyY3B0M10uIiBcCisJCQkiNS42OiBhY3Rpb25zIGZvciBpbnZhbGlkIHRyYWNlcG9pbnQgbnVtYmVyIgorCisjIDUuNyBpbnZhbGlkIGFjdGlvbiAob3RoZXIgdGhhbiAnY29sbGVjdCcsICd3aGlsZS1zdGVwcGluZycgb3IgJ2VuZCcpCisjCSAgICAid2FybmluZzogLnByaW50IGdkYl9jX3Rlc3QuIGlzIG5vdCBhIHN1cHBvcnRlZCB0cmFjZS4qPiAkIiBcCisKK2dkYl90cmFjZV9zZXRhY3Rpb25zICI1Ljc6IGludmFsaWQgYWN0aW9uIiBcCisJIiR0cmNwdDEiIFwKKwkicHJpbnQgZ2RiX2NfdGVzdCIgXAorCSJ3YXJuaW5nOiAucHJpbnQgZ2RiX2NfdGVzdC4gaXMgbm90IGEgc3VwcG9ydGVkIHRyYWNlIgorCisjIDUuOCBoZWxwIGFjdGlvbnMgKGNvbGxlY3QsIHdoaWxlLXN0ZXBwaW5nLCBlbmQpCisKK2dkYl90ZXN0ICJoZWxwIGFjdGlvbnMiIFwKKyAgICAiU3BlY2lmeSB0aGUgYWN0aW9ucyB0byBiZSB0YWtlbiBhdCBhIHRyYWNlcG9pbnQuKiIgXAorCQkJIjUuOGE6IGhlbHAgYWN0aW9ucyIKKworZ2RiX3Rlc3QgImhlbHAgY29sbGVjdCIgXAorICAgICJTcGVjaWZ5IG9uZSBvciBtb3JlIGRhdGEgaXRlbXMgdG8gYmUgY29sbGVjdGVkIGF0IGEgdHJhY2Vwb2ludC4qIiBcCisJCQkiNS44YjogaGVscCBjb2xsZWN0IgorCitnZGJfdGVzdCAiaGVscCB3aGlsZS1zdGVwcGluZyIgXAorICAgICJTcGVjaWZ5IHNpbmdsZS1zdGVwcGluZyBiZWhhdmlvciBhdCBhIHRyYWNlcG9pbnQuKiIgXAorCQkJIjUuOGM6IGhlbHAgd2hpbGUtc3RlcHBpbmciCisKK2dkYl90ZXN0ICJoZWxwIGVuZCIgIkVuZHMgYSBsaXN0IG9mIGNvbW1hbmRzIG9yIGFjdGlvbnMuKiIgXAorCQkJIjUuOGQ6IGhlbHAgZW5kIgorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9iYWNrdHJhY2UuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvYmFja3RyYWNlLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDQ0ZWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvYmFja3RyYWNlLmV4cApAQCAtMCwwICsxLDM3NiBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IE1pY2hhZWwgU255ZGVyIChtc255ZGVyQGN5Z251cy5jb20pCisKK2xvYWRfbGliICJ0cmFjZS1zdXBwb3J0LmV4cCI7CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorCitpZiBbaXN0YXJnZXQgIm02OGstKi1lbGYiXSB0aGVuIHsKKyAgICBsb2FkX2xpYiAiZW1jLXN1cHBvcnQuZXhwIjsKKyAgICBzZXQgc3JjZmlsZSBnZGJfY190ZXN0LmMKKyAgICBzZXQgYmluZmlsZSBbYm9hcmRfaW5mbyB0YXJnZXQgZDQ5MF9iaW5maWxlXTsKKyAgICBnZGJfdGVzdCAic2V0IHJlbW90ZXRpbWVvdXQgNiIgIiIgIiIKKyAgICBzZXQgdGltZW91dCA1MDAKKyAgICBnZGJfdGFyZ2V0X21vbml0b3IgIiRiaW5maWxlIgorICAgICMgR2l2ZSBhIFRTVE9QIGFuZCBpZ25vcmUgZXJyb3JzLCB0byBtYWtlIHN1cmUgYW55IHByZXZpb3VzIHRyYWNlIGlzIG9mZgorICAgIGdkYl90ZXN0ICJ0c3RvcCIgIiIgIiIKKyAgICBnZGJfdGVzdCAidGZpbmQgbm9uZSIgICIiICIiCisgICAgc2VuZF9nZGIgImNvbXBhcmUtc2VjdGlvbnMgQ1NcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIk1JUy1NQVRDSEVELiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiU3ltYm9sIGZpbGUgZG9lcyBub3QgbWF0Y2ggdGFyZ2V0IQorCSAgICBhbGwgdGVzdHMgaW4gdGhpcyBtb2R1bGUgd2lsbCBmYWlsLiI7CisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IH0KKyAgICB9Cit9IGVsc2UgeworICAgIHNldCB0ZXN0ZmlsZSAiYWN0aW9ucyIKKyAgICBzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCisgICAgc2V0IGJpbmZpbGUgJG9iamRpci8kc3ViZGlyLyR0ZXN0ZmlsZQorICAgIGlmIHsgW2dkYl9jb21waWxlICIkc3JjZGlyLyRzdWJkaXIvJHNyY2ZpbGUiICRiaW5maWxlIFwKKwkgICAgZXhlY3V0YWJsZSB7ZGVidWcgYWRkaXRpb25hbF9mbGFncz0td31dICE9ICIiIH0geworCWdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorICAgIH0KKyAgICBnZGJfbG9hZCAkYmluZmlsZQorICAgIGdkYl90ZXN0ICJ0c3RvcCIgICAgICAgIiIgIiIKKyAgICBnZGJfdGVzdCAidGZpbmQgbm9uZSIgICIiICIiCisgICAgcnVudG9fbWFpbgorfQorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisKKyMgV2UgZ2VuZXJvdXNseSBnaXZlIG91cnNlbHZlcyBvbmUgInBhc3MiIGlmIHdlIHN1Y2Nlc3NmdWxseSAKKyMgZGV0ZWN0IHRoYXQgdGhpcyB0ZXN0IGNhbm5vdCBiZSBydW4gb24gdGhpcyB0YXJnZXQhCitpZiB7ICFbZ2RiX3RhcmdldF9zdXBwb3J0c190cmFjZV0gfSB0aGVuIHsKKyAgICBwYXNzICJDdXJyZW50IHRhcmdldCBkb2VzIG5vdCBzdXBwb3JzdCB0cmFjZSIKKyAgICByZXR1cm4gMTsKKworfQorCisjCisjIHRlc3QgYmFja3RyYWNlcyBpbiB0cmFjZSBmcmFtZXMKKyMKKworc2V0IHRlc3RsaW5lMSAwCitzZXQgdGVzdGxpbmUyIDAKK3NldCB0ZXN0bGluZTMgMAorc2V0IHRlc3RsaW5lNCAwCitzZXQgdGVzdGxpbmU1IDAKK3NldCB0ZXN0bGluZTYgMAorCitzZXQgYXJnMSAxCitzZXQgYXJnMiAyCitzZXQgYXJnMyAzCitzZXQgYXJnNCA0CitzZXQgYXJnNSA1CitzZXQgYXJnNiA2CisKK3NldCBiYXNlbGluZSBbZ2RiX2ZpbmRfcmVjdXJzaW9uX3Rlc3RfYmFzZWxpbmUgJHNyY2ZpbGVdOworaWYgeyAkYmFzZWxpbmUgPT0gLTEgfSB7CisgICAgZmFpbCAiQ291bGQgbm90IGZpbmQgZ2RiX3JlY3Vyc2lvbl90ZXN0IGZ1bmN0aW9uIgorICAgIHJldHVybjsKK30KKworc2VuZF9nZGIgImxpc3QgJGJhc2VsaW5lLCArMTJcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiXFtcclxuXF0oXFswLTlcXSspLipnZGJ0ZXN0bGluZSAxICIgeworCXNldCB0ZXN0bGluZTEgJGV4cGVjdF9vdXQoMSxzdHJpbmcpCisJZXhwX2NvbnRpbnVlCisgICAgfQorICAgIC1yZSAiXFtcclxuXF0oXFswLTlcXSspLipnZGJ0ZXN0bGluZSAyICIgeworCXNldCB0ZXN0bGluZTIgJGV4cGVjdF9vdXQoMSxzdHJpbmcpCisJZXhwX2NvbnRpbnVlCisgICAgfQorICAgIC1yZSAiXFtcclxuXF0oXFswLTlcXSspLipnZGJ0ZXN0bGluZSAzICIgeworCXNldCB0ZXN0bGluZTMgJGV4cGVjdF9vdXQoMSxzdHJpbmcpCisJZXhwX2NvbnRpbnVlCisgICAgfQorICAgIC1yZSAiXFtcclxuXF0oXFswLTlcXSspLipnZGJ0ZXN0bGluZSA0ICIgeworCXNldCB0ZXN0bGluZTQgJGV4cGVjdF9vdXQoMSxzdHJpbmcpCisJZXhwX2NvbnRpbnVlCisgICAgfQorICAgIC1yZSAiXFtcclxuXF0oXFswLTlcXSspLipnZGJ0ZXN0bGluZSA1ICIgeworCXNldCB0ZXN0bGluZTUgJGV4cGVjdF9vdXQoMSxzdHJpbmcpCisJZXhwX2NvbnRpbnVlCisgICAgfQorICAgIC1yZSAiXFtcclxuXF0oXFswLTlcXSspLipnZGJ0ZXN0bGluZSA2ICIgeworCXNldCB0ZXN0bGluZTYgJGV4cGVjdF9vdXQoMSxzdHJpbmcpCisJZXhwX2NvbnRpbnVlCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJaWYgeyAoJHRlc3RsaW5lMSA9PSAwKSB8fCAoJHRlc3RsaW5lMiA9PSAwKSB8fCAoJHRlc3RsaW5lMyA9PSAwKSB8fCAoJHRlc3RsaW5lNCA9PSAwKSB8fCAoJHRlc3RsaW5lNSA9PSAwKSB8fCAoJHRlc3RsaW5lNiA9PSAwKSB9IHsKKwkgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJmYWlsZWQgdG8gbG9jYXRlIHRlc3Qgc291cmNlIGxpbmVzOgorYWxsIHRlc3RzIGluIHRoaXMgbW9kdWxlIHdpbGwgZmFpbC4iCisJfQorICAgIH0KKyAgICBkZWZhdWx0IHsKKwkgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJmYWlsZWQgdG8gbG9jYXRlIHRlc3Qgc291cmNlIGxpbmVzIChkZWYpOgorYWxsIHRlc3RzIGluIHRoaXMgbW9kdWxlIHdpbGwgZmFpbC4iCisgICAgfSAKK30KKworIworIyBTZXR1cCBiYWNrdHJhY2UgZXhwZXJpbWVudC4gIFRoaXMgd2lsbCBpbnZvbHZlOgorIyAgIDEpIGEgdHJhY2Vwb2ludCB3aGVyZSBub3RoaW5nIGlzIGNvbGxlY3RlZAorIyAgIDIpIGEgdHJhY2Vwb2ludCB3aGVyZSBvbmx5IHJlZ3MgYXJlIGNvbGxlY3RlZAorIyAgIDMpIGEgdHJhY2Vwb2ludCB3aGVyZSByZWdzLCBsb2NhbHMgYW5kIGFyZ3MgYXJlIGNvbGxlY3RlZAorIyAgIDQpIGEgdHJhY2Vwb2ludCB3aGVyZSByZWdzIHBsdXMgc29tZSBhbW91bnQgb2Ygc3RhY2sgYXJlIGNvbGxlY3RlZC4KKyMKKworZ2RiX2RlbGV0ZV90cmFjZXBvaW50cworc2V0IHRkcDIgW2dkYl9nZXR0cG51bSAkdGVzdGxpbmUyXQorc2V0IHRkcDMgW2dkYl9nZXR0cG51bSAkdGVzdGxpbmUzXQorc2V0IHRkcDQgW2dkYl9nZXR0cG51bSAkdGVzdGxpbmU0XQorc2V0IHRkcDUgW2dkYl9nZXR0cG51bSAkdGVzdGxpbmU1XQorc2V0IHRkcDYgW2dkYl9nZXR0cG51bSAkdGVzdGxpbmU2XQoraWYgeyAgICAkdGRwMiA8PSAwIHx8ICR0ZHAzIDw9IDAgfHwgXAorCSR0ZHA0IDw9IDAgfHwgJHRkcDUgPD0gMCB8fCAkdGRwNiA8PSAwIH0gdGhlbiB7CisgICAgZmFpbCAic2V0dGluZyB0cmFjZXBvaW50cyBmYWlsZWQiCisgICAgcmV0dXJuOworfQorCisjZ2RiX3RyYWNlX3NldGFjdGlvbnMgInNldHVwIFRQIHRvIGNvbGxlY3QgRlAiIFwKKyMJIiR0ZHAyIiBcCisjCSJjb2xsZWN0IFwkZnAiICIiCisjCisKK2dkYl90cmFjZV9zZXRhY3Rpb25zICI4LjY6IHNldHVwIFRQIHRvIGNvbGxlY3QgcmVncyIgXAorCSIkdGRwMyIgXAorCSJjb2xsZWN0IFwkcmVncyIgIl4kIgorCitnZGJfdHJhY2Vfc2V0YWN0aW9ucyAiOC42OiBzZXR1cCBUUCB0byBjb2xsZWN0IHJlZ3MsIGFyZ3MsIGFuZCBsb2NhbHMiIFwKKwkiJHRkcDQiIFwKKwkiY29sbGVjdCBcJHJlZ3MsIFwkYXJncywgXCRsb2NzIiAiXiQiCisKK2dkYl90cmFjZV9zZXRhY3Rpb25zICI4LjY6IHNldHVwIFRQIHRvIGNvbGxlY3Qgc3RhY2sgbWVtIGNhc3QgZXhwciIgXAorCSIkdGRwNiIgXAorCSJjb2xsZWN0IFwkZnAsIFwoXCpcKHZvaWQgXCpcKlwpIFwoXCRzcFwpXCkgQCA2NCIgIl4kIgorCitnZGJfdGVzdCAidHN0YXJ0IiAiIiAiIgorCitpZiBbaXN0YXJnZXQgIm02OGstKi1lbGYiXSB0aGVuIHsKKyAgICBnZGJfZW1jbGFwdG9wX2NvbW1hbmQgIjg1LCRhcmcxLCRhcmcyLCRhcmczLCRhcmc0LCRhcmc1LCRhcmc2IgorICAgIHNsZWVwIDUKK30gZWxzZSB7CisgICAgZ2RiX3Rlc3QgImJyZWFrIGVuZCIgIiIgIiIKKyAgICBnZGJfdGVzdCAiY29udGludWUiIFwKKwkgICAgIkNvbnRpbnVpbmcuKkJyZWFrcG9pbnQgJGRlY2ltYWwsIGVuZC4qIiBcCisJICAgICJydW4gdHJhY2UgZXhwZXJpbWVudCIKK30KKworZ2RiX3Rlc3QgInRzdG9wIiAiIiAiIgorCitwcm9jIGdkYl9iYWNrdHJhY2VfdGRwXzEgeyBtc2cgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICAKKyAgICAjIFdlIGFyZSBpbiBhIHRyYWNlIGZyYW1lIGF0IHdoaWNoIHdlIGRpZG4ndCBjb2xsZWN0IGFueXRoaW5nCisgICAgIyBleGNlcHQgJFBDLiAgVGhlcmVmb3JlIHdlIGV4cGVjdCB0byBiZSBhYmxlIHRvIGlkZW50aWZ5IHN0YWNrCisgICAgIyBmcmFtZSAjMCwgYnV0IHRoYXQncyBhYm91dCBhbGwuICBJbiBwYXJ0aWN1bGFyIHdlIGRvIG5vdCBleHBlY3QKKyAgICAjIHRvIGJlIGFibGUgdG8gZGlzcGxheSB0aGUgZnVuY3Rpb24ncyBhcmd1bWVudHMgb3IgbG9jYWxzLCBhbmQgd2UKKyAgICAjIGRvIG5vdCBleHBlY3QgdG8gYmUgYWJsZSB0byBpZGVudGlmeSB0aGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24uCisgICAgCisgICAgc2VuZF9nZGIgImJhY2t0cmFjZVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiIzBcW1x0IFxdK2dkYl9yZWN1cnNpb25fdGVzdC4qZGVwdGg9LiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgIiRtc2ciCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgIiRtc2ciCisJfQorCXRpbWVvdXQgeyBmYWlsICIkbXNnICh0aW1lb3V0KSIgfQorICAgIH0KK30KKworcHJvYyBnZGJfYmFja3RyYWNlX3RkcF8yIHsgbXNnIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICAjIFdlIGFyZSBpbiBhIHRyYWNlIGZyYW1lIGF0IHdoaWNoIHdlIGNvbGxlY3RlZCBvbmx5IHRoZSByZWdpc3RlcnMKKyAgICAjIFRoZXJlZm9yZSB3ZSBleHBlY3QgdG8gYmUgYWJsZSB0byBpZGVudGlmeSBzdGFjayBmcmFtZSAjMCwgYnV0CisgICAgIyB3ZSBkb24ndCBleHBlY3QgdG8gYmUgYWJsZSB0byBkaXNwbGF5IGl0cyBhcmdzIHVubGVzIHRoZXkgYXJlCisgICAgIyBwYXNzZWQgaW4gcmVnaXN0ZXJzICh3aGljaCBpc24ndCB0aGUgY2FzZSBmb3IgbTY4ayksIGFuZCB3ZQorICAgICMgZG9uJ3QgZXhwZWN0IHRvIGJlIGFibGUgdG8gaWRlbnRpZnkgdGhlIGNhbGxlcidzIHN0YWNrIGZyYW1lLgorCisgICAgc2VuZF9nZGIgImJhY2t0cmFjZVxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiIzBcW1x0IFxdK2dkYl9yZWN1cnNpb25fdGVzdC4qZGVwdGg9LiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgIiRtc2ciCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgIiRtc2ciCisJfQorCXRpbWVvdXQgeyBmYWlsICIkbXNnICh0aW1lb3V0KSIgfQorICAgIH0KK30KKworcHJvYyBnZGJfYmFja3RyYWNlX3RkcF8zIHsgbXNnIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICAjIFdlIGFyZSBpbiBhIHRyYWNlIGZyYW1lIGF0IHdoaWNoIHdlIGNvbGxlY3RlZCBhbGwgcmVnaXN0ZXJzLCBhbGwKKyAgICAjIGFyZ3VtZW50cyBhbmQgYWxsIGxvY2Fscy4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgZGlzcGxheSBvZgorICAgICMgc3RhY2sgZnJhbWUgIzAgc2hvdWxkIGJlIGNvbXBsZXRlIChpbmNsdWRpbmcgYXJndW1lbnQgdmFsdWVzKS4KKworICAgIHNlbmRfZ2RiICJiYWNrdHJhY2VcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIiMwXFtcdCBcXStnZGJfcmVjdXJzaW9uX3Rlc3QuKmRlcHRoPVxbMC05XF0rLipxMT1cWzAtOVxdKy4qcTI9XFswLTlcXSsuKnEzPVxbMC05XF0rLipxND1cWzAtOVxdKy4qcTU9XFswLTlcXSsuKnE2PVxbMC05XF0rLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgIiRtc2ciCisJfQorCS1yZSAiIzBcW1x0IFxdK2dkYl9yZWN1cnNpb25fdGVzdC4qZGVwdGg9Q2Fubm90IGFjY2Vzcy4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICIkbXNnIChmYWlsZWQgdG8gY29sbGVjdCBhcmd1bWVudHMpIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBmYWlsICIkbXNnIgorCX0KKwl0aW1lb3V0IHsgZmFpbCAiJG1zZyAodGltZW91dCkiIH0KKyAgICB9Cit9CisKK3Byb2MgZ2RiX2JhY2t0cmFjZV90ZHBfNCB7IG1zZyBkZXB0aCB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgIyBXZSBhcmUgaW4gYSB0cmFjZSBmcmFtZSBhdCB3aGljaCB3ZSBjb2xsZWN0ZWQgYWxsIHJlZ2lzdGVycywKKyAgICAjIHBsdXMgYSBzaXplYWJsZSBodW5rIG9mIHN0YWNrIG1lbW9yeS4gIFRoaXMgc2hvdWxkIGVuYWJsZSB1cyB0bworICAgICMgZGlzcGxheSBhdCBsZWFzdCBzZXZlcmFsIHN0YWNrIGZyYW1lcyB3b3J0aCBvZiBiYWNrdHJhY2UuICBXZSdsbAorICAgICMgYXNzdW1lIHRoYXQgaWYgd2UgY2FuJ3QgZGlzcGxheSBhdCBsZWFzdCAiZGVwdGgiIGxldmVscyAod2l0aAorICAgICMgYXJncyksIGl0IGNvdW50cyBhcyBhbiBlcnJvci4KKworICAgIHNlbmRfZ2RiICJiYWNrdHJhY2VcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIiMkZGVwdGhcW1x0IFxdLipnZGJfcmVjdXJzaW9uX3Rlc3QuKmRlcHRoPVxbMC05XF0rLipxMT1cWzAtOVxdKy4qcTI9XFswLTlcXSsuKnEzPVxbMC05XF0rLipxND1cWzAtOVxdKy4qcTU9XFswLTlcXSsuKnE2PVxbMC05XF0rLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgIiRtc2ciCisJfQorCS1yZSAiIyRkZXB0aFxbXHQgXF0uKmdkYl9yZWN1cnNpb25fdGVzdC4qZGVwdGg9LiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgIiRtc2cgKGFyZ3MgbWlzc2luZyBmcm9tICMkZGVwdGggc3RhY2sgZnJhbWUpIgorCX0KKwktcmUgIiNcWzAtOVxdK1xbXHQgXF0uKmdkYl9yZWN1cnNpb25fdGVzdC4qZGVwdGg9LiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgIiRtc2cgKGZld2VyIHRoYW4gJGRlcHRoIHN0YWNrIGZyYW1lcyBmb3VuZCkiCisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgIiRtc2ciCisJfQorCXRpbWVvdXQgeyBmYWlsICIkbXNnICh0aW1lb3V0KSIgfQorICAgIH0KK30KKworIworIyBiZWdpbiBiYWNrdHJhY2UgdGVzdAorIworCitzZXQgdGltZW91dCA2MAorCitnZGJfdGZpbmRfdGVzdCAiaW5pdDogbWFrZSBzdXJlIG5vdCBkZWJ1Z2dpbmcgYW55IHRyYWNlIGZyYW1lIiAibm9uZSIgIi0xIgorCitnZGJfdGZpbmRfdGVzdCAiOC42OiBmaW5kIHN0YXJ0IGZyYW1lIiAic3RhcnQiICIwIgorZ2RiX3Rlc3QgInByaW50ZiBcIlREUCBcJWQ6XFxuXCIsIFwkdHJhY2Vwb2ludCIgXAorCSJURFAgJHRkcDI6IiAiIgorZ2RiX2JhY2t0cmFjZV90ZHBfMSAiOC42OiBCYWNrdHJhY2UsIGRlcHRoID09IDEsIGNvbGxlY3Qgbm90aGluZyIKKworZ2RiX3RmaW5kX3Rlc3QgIjguNjogZmluZCBmcmFtZSAxIiAgICAgIjEiICIxIgorZ2RiX3Rlc3QgInByaW50ZiBcIlREUCBcJWQ6XFxuXCIsIFwkdHJhY2Vwb2ludCIgXAorCSJURFAgJHRkcDM6IiAiIgorZ2RiX2JhY2t0cmFjZV90ZHBfMiAiOC42OiBCYWNrdHJhY2UsIGRlcHRoID09IDEsIGNvbGxlY3QgcmVncyIKKworZ2RiX3RmaW5kX3Rlc3QgIjguNjogZmluZCBmcmFtZSAyIiAgICAgIjIiICIyIgorZ2RiX3Rlc3QgInByaW50ZiBcIlREUCBcJWQ6XFxuXCIsIFwkdHJhY2Vwb2ludCIgXAorCSJURFAgJHRkcDQ6IiAiIgorZ2RiX2JhY2t0cmFjZV90ZHBfMyAiOC42OiBCYWNrdHJhY2UsIGRlcHRoID09IDEsIGNvbGxlY3QgYXJncyBhbmQgbG9jYWxzIgorCisKK2dkYl90ZmluZF90ZXN0ICI4LjY6IGZpbmQgZnJhbWUgNCIgICAgICI0IiAiNCIKK2dkYl90ZXN0ICJwcmludGYgXCJURFAgXCVkOlxcblwiLCBcJHRyYWNlcG9pbnQiIFwKKwkiVERQICR0ZHA2OiIgIiIKK2dkYl9iYWNrdHJhY2VfdGRwXzQgIjguNjogQmFja3RyYWNlLCBkZXB0aCA9PSAxLCBjb2xsZWN0IHN0YWNrIG1lbSBleHByIiAiMCIKKworZ2RiX3RmaW5kX3Rlc3QgIjguNjogZmluZCBmcmFtZSA1IiAgICAgIjUiICI1IgorZ2RiX3Rlc3QgInByaW50ZiBcIlREUCBcJWQ6XFxuXCIsIFwkdHJhY2Vwb2ludCIgXAorCSJURFAgJHRkcDI6IiAiIgorZ2RiX2JhY2t0cmFjZV90ZHBfMSAiOC42OiBCYWNrdHJhY2UsIGRlcHRoID09IDIsIGNvbGxlY3Qgbm90aGluZyIKKworZ2RiX3RmaW5kX3Rlc3QgIjguNjogZmluZCBmcmFtZSA2IiAgICAgIjYiICI2IgorZ2RiX3Rlc3QgInByaW50ZiBcIlREUCBcJWQ6XFxuXCIsIFwkdHJhY2Vwb2ludCIgXAorCSJURFAgJHRkcDM6IiAiIgorZ2RiX2JhY2t0cmFjZV90ZHBfMiAiOC42OiBCYWNrdHJhY2UsIGRlcHRoID09IDIsIGNvbGxlY3QgcmVncyIKKworZ2RiX3RmaW5kX3Rlc3QgIjguNjogZmluZCBmcmFtZSA3IiAgICAgIjciICI3IgorZ2RiX3Rlc3QgInByaW50ZiBcIlREUCBcJWQ6XFxuXCIsIFwkdHJhY2Vwb2ludCIgXAorCSJURFAgJHRkcDQ6IiAiIgorZ2RiX2JhY2t0cmFjZV90ZHBfMyAiOC42OiBCYWNrdHJhY2UsIGRlcHRoID09IDIsIGNvbGxlY3QgYXJncyBhbmQgbG9jYWxzIgorCisKK2dkYl90ZmluZF90ZXN0ICI4LjY6IGZpbmQgZnJhbWUgOSIgICAgICI5IiAiOSIKK2dkYl90ZXN0ICJwcmludGYgXCJURFAgXCVkOlxcblwiLCBcJHRyYWNlcG9pbnQiIFwKKwkiVERQICR0ZHA2OiIgIiIKK2dkYl9iYWNrdHJhY2VfdGRwXzQgIjguNjogQmFja3RyYWNlLCBkZXB0aCA9PSAxLCBjb2xsZWN0IHN0YWNrIG1lbSBleHByIiAiMCIKKworZ2RiX3RmaW5kX3Rlc3QgIjguNjogZmluZCBmcmFtZSAxMCIgICAgIjEwIiAiMTAiCitnZGJfdGVzdCAicHJpbnRmIFwiVERQIFwlZDpcXG5cIiwgXCR0cmFjZXBvaW50IiBcCisJIlREUCAkdGRwMjoiICIiCitnZGJfYmFja3RyYWNlX3RkcF8xICI4LjY6IEJhY2t0cmFjZSwgZGVwdGggPT0gMywgY29sbGVjdCBub3RoaW5nIgorCitnZGJfdGZpbmRfdGVzdCAiOC42OiBmaW5kIGZyYW1lIDExIiAgICAiMTEiICIxMSIKK2dkYl90ZXN0ICJwcmludGYgXCJURFAgXCVkOlxcblwiLCBcJHRyYWNlcG9pbnQiIFwKKwkiVERQICR0ZHAzOiIgIiIKK2dkYl9iYWNrdHJhY2VfdGRwXzIgIjguNjogQmFja3RyYWNlLCBkZXB0aCA9PSAzLCBjb2xsZWN0IHJlZ3MiCisKK2dkYl90ZmluZF90ZXN0ICI4LjY6IGZpbmQgZnJhbWUgMTIiICAgICIxMiIgIjEyIgorZ2RiX3Rlc3QgInByaW50ZiBcIlREUCBcJWQ6XFxuXCIsIFwkdHJhY2Vwb2ludCIgXAorCSJURFAgJHRkcDQ6IiAiIgorZ2RiX2JhY2t0cmFjZV90ZHBfMyAiOC42OiBCYWNrdHJhY2UsIGRlcHRoID09IDMsIGNvbGxlY3QgYXJncyBhbmQgbG9jYWxzIgorCisKK2dkYl90ZmluZF90ZXN0ICI4LjY6IGZpbmQgZnJhbWUgMTQiICAgICIxNCIgIjE0IgorZ2RiX3Rlc3QgInByaW50ZiBcIlREUCBcJWQ6XFxuXCIsIFwkdHJhY2Vwb2ludCIgXAorCSJURFAgJHRkcDY6IiAiIgorZ2RiX2JhY2t0cmFjZV90ZHBfNCAiOC42OiBCYWNrdHJhY2UsIGRlcHRoID09IDEsIGNvbGxlY3Qgc3RhY2sgbWVtIGV4cHIiICIwIgorCitnZGJfdGZpbmRfdGVzdCAiOC42OiBmaW5kIGZyYW1lIDE1IiAgICAiMTUiICIxNSIKK2dkYl90ZXN0ICJwcmludGYgXCJURFAgXCVkOlxcblwiLCBcJHRyYWNlcG9pbnQiIFwKKwkiVERQICR0ZHAyOiIgIiIKK2dkYl9iYWNrdHJhY2VfdGRwXzEgIjguNjogQmFja3RyYWNlLCBkZXB0aCA9PSA0LCBjb2xsZWN0IG5vdGhpbmciCisKK2dkYl90ZmluZF90ZXN0ICI4LjY6IGZpbmQgZnJhbWUgMTYiICAgICIxNiIgIjE2IgorZ2RiX3Rlc3QgInByaW50ZiBcIlREUCBcJWQ6XFxuXCIsIFwkdHJhY2Vwb2ludCIgXAorCSJURFAgJHRkcDM6IiAiIgorZ2RiX2JhY2t0cmFjZV90ZHBfMiAiOC42OiBCYWNrdHJhY2UsIGRlcHRoID09IDQsIGNvbGxlY3QgcmVncyIKKworZ2RiX3RmaW5kX3Rlc3QgIjguNjogZmluZCBmcmFtZSAxNyIgICAgIjE3IiAiMTciCitnZGJfdGVzdCAicHJpbnRmIFwiVERQIFwlZDpcXG5cIiwgXCR0cmFjZXBvaW50IiBcCisJIlREUCAkdGRwNDoiICIiCitnZGJfYmFja3RyYWNlX3RkcF8zICI4LjY6IEJhY2t0cmFjZSwgZGVwdGggPT0gNCwgY29sbGVjdCBhcmdzIGFuZCBsb2NhbHMiCisKKworZ2RiX3RmaW5kX3Rlc3QgIjguNjogZmluZCBmcmFtZSAxOSIgICAgIjE5IiAiMTkiCitnZGJfdGVzdCAicHJpbnRmIFwiVERQIFwlZDpcXG5cIiwgXCR0cmFjZXBvaW50IiBcCisJIlREUCAkdGRwNjoiICIiCitnZGJfYmFja3RyYWNlX3RkcF80ICI4LjY6IEJhY2t0cmFjZSwgZGVwdGggPT0gMSwgY29sbGVjdCBzdGFjayBtZW0gZXhwciIgIjAiCisKK2dkYl90ZXN0ICJwcmludGYgXCJ4IFwlZCB4XFxuXCIsIGRlcHRoID09IDMiIFwKKwkieCAwIHgiIFwKKwkiMS4xMzogdHJhY2UgaW4gcmVjdXJzaW9uOiBkZXB0aCBub3QgZXF1YWwgdG8gMyIKKworIyBGaW5pc2hlZCEKK2dkYl90ZXN0ICJ0ZmluZCBub25lIiAiIiAiIgpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvY2lyYy5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvY2lyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YTJjZTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9jaXJjLmMKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIFRlc3QgcHJvZ3JhbSBmb3IgdHJhY2luZzsgY2lyY3VsYXIgYnVmZmVyCisgKi8KKworaW50IG4gPSA2OworCitpbnQgdGVzdGxvYWRbMTNdOworCitzdGF0aWMgdm9pZCBmdW5jMCh2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBmdW5jMSh2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBmdW5jMih2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBmdW5jMyh2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBmdW5jNCh2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBmdW5jNSh2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBmdW5jNih2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBmdW5jNyh2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBmdW5jOCh2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBmdW5jOSh2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBiZWdpbiAoKQkvKiBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UgKi8KK3sKK30KKworc3RhdGljIHZvaWQgZW5kICgpCS8qIGNhbGxlZCBhZnRlciBldmVyeXRoaW5nIGVsc2UgKi8KK3sKK30KKworaW50CittYWluIChhcmdjLCBhcmd2LCBlbnZwKQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqYXJndltdLCAqKmVudnA7Cit7CisgIGludCBpOworCisjaWZkZWYgdXNlc3R1YnMKKyAgc2V0X2RlYnVnX3RyYXBzICgpOworICBicmVha3BvaW50ICgpOworI2VuZGlmCisKKyAgYmVnaW4gKCk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YodGVzdGxvYWQpIC8gc2l6ZW9mKHRlc3Rsb2FkWzBdKTsgaSsrKQorICAgIHRlc3Rsb2FkW2ldID0gaSArIDE7CisKKyAgZnVuYzAgKCk7CisgIGZ1bmMxICgpOworICBmdW5jMiAoKTsKKyAgZnVuYzMgKCk7CisgIGZ1bmM0ICgpOworICBmdW5jNSgpOworICBmdW5jNiAoKTsKKyAgZnVuYzcgKCk7CisgIGZ1bmM4ICgpOworICBmdW5jOSAoKTsKKworICBlbmQgKCk7CisKKyNpZmRlZiB1c2VzdHVicworICBicmVha3BvaW50ICgpOworI2VuZGlmCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvY2lyYy5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9jaXJjLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjE3MjRmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvY2lyYy5leHAKQEAgLTAsMCArMSwyMTUgQEAKKyMgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCitpZiBbaXN0YXJnZXQgIm02OGstKi1lbGYiXSB0aGVuIHsKKyAgICBwYXNzICJUZXN0IG5vdCBzdXBwb3J0ZWQgb24gdGhpcyB0YXJnZXQiCisgICAgcmV0dXJuOworfQorCitsb2FkX2xpYiAidHJhY2Utc3VwcG9ydC5leHAiCisKK2lmICR0cmFjZWxldmVsIHRoZW4geworCXN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworc2V0IHRlc3RmaWxlICJjaXJjIgorc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworc2V0IGJpbmZpbGUgJG9iamRpci8kc3ViZGlyLyR0ZXN0ZmlsZQorCitpZiB7IFtnZGJfY29tcGlsZSAiJHNyY2Rpci8kc3ViZGlyLyRzcmNmaWxlIiAkYmluZmlsZSBcCisJZXhlY3V0YWJsZSB7ZGVidWcgYWRkaXRpb25hbF9mbGFncz0td31dICE9ICIiIH0geworICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorfQorCisjIFRlc3RzOgorIyAxKSBTZXQgdXAgYSB0cmFjZSBleHBlcmltZW50IHRoYXQgd2lsbCBjb2xsZWN0IGFwcHJveGltYXRlbHkgMTAgZnJhbWVzLAorIyAgICByZXF1aXJpbmcgbW9yZSB0aGFuIDUxMiBidXQgbGVzcyB0aGFuIDEwMjQgYnl0ZXMgb2YgY2FjaGUgYnVmZmVyLgorIyAgICAobW9zdCB0YXJnZXRzIHNob3VsZCBoYXZlIGF0IGxlYXN0IDEwMjQgYnl0ZXMgb2YgY2FjaGUgYnVmZmVyISkKKyMgICAgUnVuIGFuZCBjb25maXJtIHRoYXQgaXQgY29sbGVjdHMgYWxsIDEwIGZyYW1lcy4KKyMgMikgQXJ0aWZpY2lhbGx5IGxpbWl0IHRoZSB0cmFjZSBidWZmZXIgdG8gNTEyIGJ5dGVzLCBhbmQgcmVydW4gdGhlCisjICAgIGV4cGVyaW1lbnQuICBDb25maXJtIHRoYXQgdGhlIGZpcnN0IHNldmVyYWwgZnJhbWVzIGFyZSBjb2xsZWN0ZWQsCisjICAgIGJ1dCB0aGF0IHRoZSBsYXN0IHNldmVyYWwgYXJlIG5vdC4KKyMgMykgU2V0IHRyYWNlIGJ1ZmZlciB0byBjaXJjdWxhciBtb2RlLCBzdGlsbCB3aXRoIHRoZSBhcnRpZmljaWFsIGxpbWl0CisjICAgIG9mIDUxMiBieXRlcywgYW5kIHJlcnVuIHRoZSBleHBlcmltZW50LiAgQ29uZmlybSB0aGF0IHRoZSBsYXN0IAorIyAgICBzZXZlcmFsIGZyYW1lcyBhcmUgY29sbGVjdGVkLCBidXQgdGhlIGZpcnN0IHNldmVyYWwgYXJlIG5vdC4KKyMKKworIyByZXR1cm4gMCBmb3Igc3VjY2VzcywgMSBmb3IgZmFpbHVyZQorcHJvYyBydW5fdHJhY2VfZXhwZXJpbWVudCB7IHBhc3MgfSB7CisgICAgZ2RiX3J1bl9jbWQgCisKKyAgICBpZiBbZ2RiX3Rlc3QgInRzdGFydCIgXAorCSAgICAiXFtcclxuXF0qIiBcCisJICAgICJzdGFydCB0cmFjZSBleHBlcmltZW50LCBwYXNzICRwYXNzIl0gdGhlbiB7IHJldHVybiAxOyB9CisgICAgaWYgW2dkYl90ZXN0ICJjb250aW51ZSIgXAorCSAgICAiQ29udGludWluZy4qQnJlYWtwb2ludCBcWzAtOVxdKywgZW5kLioiIFwKKwkgICAgInJ1biB0byBlbmQsIHBhc3MgJHBhc3MiXSB0aGVuIHsgcmV0dXJuIDE7IH0KKyAgICBpZiBbZ2RiX3Rlc3QgInRzdG9wIiBcCisJICAgICJcW1xyXG5cXSoiIFwKKwkgICAgInN0b3AgdHJhY2UgZXhwZXJpbWVudCwgcGFzcyAkcGFzcyJdIHRoZW4geyByZXR1cm4gMTsgfQorICAgIHJldHVybiAwOworfQorCisjIHJldHVybiAwIGZvciBzdWNjZXNzLCAxIGZvciBmYWlsdXJlCitwcm9jIHNldF9hX3RyYWNlcG9pbnQgeyBmdW5jIH0geworICAgIGlmIFtnZGJfdGVzdCAidHJhY2UgJGZ1bmMiIFwKKwkgICAgIlRyYWNlcG9pbnQgXFswLTlcXSsgYXQgLioiIFwKKwkgICAgInNldCB0cmFjZXBvaW50IGF0ICRmdW5jIl0gdGhlbiB7CisJcmV0dXJuIDE7CisgICAgfQorICAgIGlmIFtnZGJfdHJhY2Vfc2V0YWN0aW9ucyAic2V0IGFjdGlvbnMgZm9yICRmdW5jIiBcCisJICAgICIiIFwKKwkgICAgImNvbGxlY3QgdGVzdGxvYWQiICJeJCJdIHRoZW4geworCXJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworIyByZXR1cm4gMCBmb3Igc3VjY2VzcywgMSBmb3IgZmFpbHVyZQorcHJvYyBzZXR1cF90cmFjZXBvaW50cyB7IH0geworICAgIGdkYl9kZWxldGVfdHJhY2Vwb2ludHMKKyAgICBpZiBbc2V0X2FfdHJhY2Vwb2ludCBmdW5jMF0gdGhlbiB7IHJldHVybiAxOyB9CisgICAgaWYgW3NldF9hX3RyYWNlcG9pbnQgZnVuYzFdIHRoZW4geyByZXR1cm4gMTsgfQorICAgIGlmIFtzZXRfYV90cmFjZXBvaW50IGZ1bmMyXSB0aGVuIHsgcmV0dXJuIDE7IH0KKyAgICBpZiBbc2V0X2FfdHJhY2Vwb2ludCBmdW5jM10gdGhlbiB7IHJldHVybiAxOyB9CisgICAgaWYgW3NldF9hX3RyYWNlcG9pbnQgZnVuYzRdIHRoZW4geyByZXR1cm4gMTsgfQorICAgIGlmIFtzZXRfYV90cmFjZXBvaW50IGZ1bmM1XSB0aGVuIHsgcmV0dXJuIDE7IH0KKyAgICBpZiBbc2V0X2FfdHJhY2Vwb2ludCBmdW5jNl0gdGhlbiB7IHJldHVybiAxOyB9CisgICAgaWYgW3NldF9hX3RyYWNlcG9pbnQgZnVuYzddIHRoZW4geyByZXR1cm4gMTsgfQorICAgIGlmIFtzZXRfYV90cmFjZXBvaW50IGZ1bmM4XSB0aGVuIHsgcmV0dXJuIDE7IH0KKyAgICBpZiBbc2V0X2FfdHJhY2Vwb2ludCBmdW5jOV0gdGhlbiB7IHJldHVybiAxOyB9CisgICAgcmV0dXJuIDA7Cit9CisKKyMgcmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIDEgZm9yIGZhaWx1cmUKK3Byb2MgdHJhY2VfYnVmZmVyX25vcm1hbCB7IH0geworICAgIGlmIFtnZGJfdGVzdCAibWFpbnQgcGFja2V0IFFUQnVmZmVyOnNpemU6ZmZmZmZmZmYiIFwKKwkgICAgInJlY2VpdmVkOiAuT0suIiAiIl0gdGhlbiB7IAorCXBhc3MgIlRoaXMgdGVzdCBjYW5ub3QgYmUgcnVuIG9uIHRoaXMgdGFyZ2V0IgorCXJldHVybiAxOworICAgIH0KKyAgICBpZiBbZ2RiX3Rlc3QgIm1haW50IHBhY2tldCBRVEJ1ZmZlcjpjaXJjdWxhcjowIiBcCisJICAgICJyZWNlaXZlZDogLk9LLiIgIiJdIHRoZW4geyAKKwlwYXNzICJUaGlzIHRlc3QgY2Fubm90IGJlIHJ1biBvbiB0aGlzIHRhcmdldCIKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyMgcmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIDEgZm9yIGZhaWx1cmUKK3Byb2MgZ2RiX3RyYWNlX2NpcmN1bGFyX3Rlc3RzIHsgfSB7CisKKyAgICAjIFdlIGdlbmVyb3VzbHkgZ2l2ZSBvdXJzZWx2ZXMgb25lICJwYXNzIiBpZiB3ZSBzdWNjZXNzZnVsbHkgCisgICAgIyBkZXRlY3QgdGhhdCB0aGlzIHRlc3QgY2Fubm90IGJlIHJ1biBvbiB0aGlzIHRhcmdldCEKKyAgICBpZiB7ICFbZ2RiX3RhcmdldF9zdXBwb3J0c190cmFjZV0gfSB0aGVuIHsgCisJcGFzcyAiQ3VycmVudCB0YXJnZXQgZG9lcyBub3Qgc3VwcG9yc3QgdHJhY2UiCisJcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgW3RyYWNlX2J1ZmZlcl9ub3JtYWxdIHRoZW4geyByZXR1cm4gMTsgfQorCisgICAgZ2RiX3Rlc3QgImJyZWFrIGJlZ2luIiAiIiAiIgorICAgIGdkYl90ZXN0ICJicmVhayBlbmQiICAgIiIgIiIKKyAgICBnZGJfdGVzdCAidHN0b3AiICAgICAgICIiICIiCisgICAgZ2RiX3Rlc3QgInRmaW5kIG5vbmUiICAiIiAiIgorCisgICAgaWYgW3NldHVwX3RyYWNlcG9pbnRzXSB0aGVuIHsgcmV0dXJuIDE7IH0KKworICAgICMgRmlyc3QsIHJ1biB0aGUgdHJhY2UgZXhwZXJpbWVudCB3aXRoIGRlZmF1bHQgYXR0cmlidXRlczoKKyAgICAjIE1ha2Ugc3VyZSBpdCBiZWhhdmVzIGFzIGV4cGVjdGVkLgorICAgIGlmIFtydW5fdHJhY2VfZXhwZXJpbWVudCAxXSB0aGVuIHsgcmV0dXJuIDE7IH0KKyAgICBpZiBbZ2RiX3Rlc3QgInRmaW5kIHN0YXJ0IiBcCisJICAgICIjMCAgZnVuYzAgLioiIFwKKwkgICAgImZpbmQgZnJhbWUgemVybywgcGFzcyAxIl0gdGhlbiB7IHJldHVybiAxOyB9CisKKyAgICBpZiBbZ2RiX3Rlc3QgInRmaW5kIDkiIFwKKwkgICAgIiMwICBmdW5jOSAuKiIgXAorCSAgICAiZmluZCBmcmFtZSBuaW5lLCBwYXNzIDEiXSB0aGVuIHsgcmV0dXJuIDE7IH0KKworICAgIGlmIFtnZGJfdGVzdCAidGZpbmQgbm9uZSIgXAorCSAgICAiIzAgIGVuZCAuKiIgXAorCSAgICAicXVpdCB0cmFjZSBkZWJ1Z2dpbmcsIHBhc3MgMSJdIHRoZW4geyByZXR1cm4gMTsgfQorCisgICAgIyBUaGVuLCBzaHJpbmsgdGhlIHRyYWNlIGJ1ZmZlciBzbyB0aGF0IGl0IHdpbGwgbm90IGhvbGQKKyAgICAjIGFsbCB0ZW4gdHJhY2UgZnJhbWVzLiAgVmVyaWZ5IHRoYXQgZnJhbWUgemVybyBpcyBzdGlsbAorICAgICMgY29sbGVjdGVkLCBidXQgZnJhbWUgbmluZSBpcyBub3QuCisgICAgaWYgW2dkYl90ZXN0ICJtYWludCBwYWNrZXQgUVRCdWZmZXI6c2l6ZToyMDAiIFwKKwkgICAgInJlY2VpdmVkOiAuT0suIiAic2hyaW5rIHRoZSB0YXJnZXQgdHJhY2UgYnVmZmVyIl0gdGhlbiB7IAorCXJldHVybiAxOworICAgIH0KKyAgICBpZiBbcnVuX3RyYWNlX2V4cGVyaW1lbnQgMl0gdGhlbiB7IHJldHVybiAxOyB9CisgICAgaWYgW2dkYl90ZXN0ICJ0ZmluZCBzdGFydCIgXAorCSAgICAiIzAgIGZ1bmMwIC4qIiBcCisJICAgICJmaW5kIGZyYW1lIHplcm8sIHBhc3MgMiJdIHRoZW4geyByZXR1cm4gMTsgfQorCisgICAgaWYgW2dkYl90ZXN0ICJ0ZmluZCA5IiBcCisJICAgICIuKiBmYWlsZWQgdG8gZmluZCAuKiIgXAorCSAgICAiZmFpbCB0byBmaW5kIGZyYW1lIG5pbmUsIHBhc3MgMiJdIHRoZW4geyByZXR1cm4gMTsgfQorCisgICAgaWYgW2dkYl90ZXN0ICJ0ZmluZCBub25lIiBcCisJICAgICIjMCAgZW5kIC4qIiBcCisJICAgICJxdWl0IHRyYWNlIGRlYnVnZ2luZywgcGFzcyAyIl0gdGhlbiB7IHJldHVybiAxOyB9CisKKyAgICAjIEZpbmFsbHksIG1ha2UgdGhlIGJ1ZmZlciBjaXJjdWxhci4gIE5vdyB3aGVuIGl0IHJ1bnMgb3V0IG9mCisgICAgIyBzcGFjZSwgaXQgc2hvdWxkIHdyYXAgYXJvdW5kIGFuZCBvdmVyd3JpdGUgdGhlIGVhcmxpZXN0IGZyYW1lcy4KKyAgICAjIFRoaXMgbWVhbnMgdGhhdDoKKyAgICAjICAgMSkgZnJhbWUgemVybyB3aWxsIGJlIG92ZXJ3cml0dGVuIGFuZCB0aGVyZWZvcmUgdW5hdmFpbGFibGUKKyAgICAjICAgMikgdGhlIGVhcmxpZXN0IGZyYW1lIGluIHRoZSBidWZmZXIgd2lsbCBiZSBvdGhlci10aGFuLXplcm8KKyAgICAjICAgMykgZnJhbWUgbmluZSB3aWxsIGJlIGF2YWlsYWJsZSAodW5saWtlIG9uIHBhc3MgMikuCisgICAgaWYgW2dkYl90ZXN0ICJtYWludCBwYWNrZXQgUVRCdWZmZXI6Y2lyY3VsYXI6MSIgXAorCSAgICAicmVjZWl2ZWQ6IC5PSy4iICJtYWtlIHRoZSB0YXJnZXQgdHJhY2UgYnVmZmVyIGNpcmN1bGFyIl0gdGhlbiB7IAorCXJldHVybiAxOworICAgIH0KKyAgICBpZiBbcnVuX3RyYWNlX2V4cGVyaW1lbnQgM10gdGhlbiB7IHJldHVybiAxOyB9CisgICAgaWYgW2dkYl90ZXN0ICJ0ZmluZCBzdGFydCIgXAorCSAgICAiIzAgIGZ1bmNcWzEtOVxdIC4qIiBcCisJICAgICJmaXJzdCBmcmFtZSBpcyBOT1QgZnJhbWUgemVybywgcGFzcyAzIl0gdGhlbiB7IHJldHVybiAxOyB9CisKKyAgICBpZiBbZ2RiX3Rlc3QgInRmaW5kIDkiIFwKKwkgICAgIiMwICBmdW5jOSAuKiIgXAorCSAgICAiZmluZCBmcmFtZSBuaW5lLCBwYXNzIDMiXSB0aGVuIHsgcmV0dXJuIDE7IH0KKworICAgIGlmIFtnZGJfdGVzdCAidGZpbmQgbm9uZSIgXAorCSAgICAiIzAgIGVuZCAuKiIgXAorCSAgICAicXVpdCB0cmFjZSBkZWJ1Z2dpbmcsIHBhc3MgMyJdIHRoZW4geyByZXR1cm4gMTsgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAkYmluZmlsZQorIAoraWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGJfc3R1Yl0geworICAgIGdkYl9zdGVwX2Zvcl9zdHViOworfQorIyBCb2R5IG9mIHRlc3QgZW5jYXNlZCBpbiBhIHByb2Mgc28gd2UgY2FuIHJldHVybiBwcmVtYXR1cmVseS4KK2lmIHsgIVtnZGJfdHJhY2VfY2lyY3VsYXJfdGVzdHNdIH0gdGhlbiB7CisgICAgIyBTZXQgdHJhY2UgYnVmZmVyIGF0dHJpYnV0ZXMgYmFjayB0byBub3JtYWwKKyAgICB0cmFjZV9idWZmZXJfbm9ybWFsOworfQorCisjIEZpbmlzaGVkIQorZ2RiX3Rlc3QgInRmaW5kIG5vbmUiICIiICIiCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9jb2xsZWN0aW9uLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9jb2xsZWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk4NjMzMgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL2NvbGxlY3Rpb24uYwpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIFRlc3QgcHJvZ3JhbSBmb3IgdHJhY2UgY29sbGVjdGlvbgorICovCisKKy8qCisgKiBUeXBlZGVmcworICovCisKK3R5cGVkZWYgc3RydWN0IFRFU1RfU1RSVUNUIHsKKyAgY2hhciAgIG1lbWJlcmM7CisgIGludCAgICBtZW1iZXJpOworICBmbG9hdCAgbWVtYmVyZjsKKyAgZG91YmxlIG1lbWJlcmQ7Cit9IHRlc3Rfc3RydWN0OworCit0eXBlZGVmIGludCB0ZXN0X2FycmF5IFs0XTsKKworLyogCisgKiBHbG9iYWwgdmFyaWFibGVzIHRvIGJlIGNvbGxlY3RlZAorICovCisKK2NoYXIgICAgICAgICBnbG9iYWxjOworaW50ICAgICAgICAgIGdsb2JhbGk7CitmbG9hdCAgICAgICAgZ2xvYmFsZjsKK2RvdWJsZSAgICAgICBnbG9iYWxkOwordGVzdF9zdHJ1Y3QgIGdsb2JhbHN0cnVjdDsKK3Rlc3Rfc3RydWN0ICpnbG9iYWxwOworaW50ICAgICAgICAgIGdsb2JhbGFyclsxNl07CisKKy8qCisgKiBBZGRpdGlvbmFsIGdsb2JhbHMgdXNlZCBpbiBhcml0aG1ldGljIHRlc3RzCisgKi8KKworc2lnbmVkIGNoYXIgIGMwLCAgYzEsICBjMiwgIGMzLCAgYzQsICBjNSwgIGM2LCAgYzcsIAorICAgICAgICAgICAgIGM4LCAgYzksICBjMTAsIGMxMSwgYzEyLCBjMTMsIGMxNCwgYzE1LCBjbWludXM7CitzaWduZWQgc2hvcnQgczAsICBzMSwgIHMyLCAgczMsICBzNCwgIHM1LCAgczYsICBzNywKKyAgICAgICAgICAgICBzOCwgIHM5LCAgczEwLCBzMTEsIHMxMiwgczEzLCBzMTQsIHMxNSwgc21pbnVzOworc2lnbmVkIGxvbmcgIGwwLCAgbDEsICBsMiwgIGwzLCAgbDQsICBsNSwgIGw2LCAgbDcsCisgICAgICAgICAgICAgbDgsICBsOSwgIGwxMCwgbDExLCBsMTIsIGwxMywgbDE0LCBsMTUsIGxtaW51czsKKworCisvKgorICogVGVzdCBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCBiZWdpbiAoKQkvKiBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UgKi8KK3sKK30KKworc3RhdGljIHZvaWQgZW5kICgpCS8qIGNhbGxlZCBhZnRlciBldmVyeXRoaW5nIGVsc2UgKi8KK3sKK30KKworLyogVGVzdCBjb2xsZWN0aW5nIGFyZ3MuICovCitpbnQgYXJnc190ZXN0X2Z1bmMgKGFyZ2MsIGFyZ2ksIGFyZ2YsIGFyZ2QsIGFyZ3N0cnVjdCwgYXJnYXJyYXkpCisgICAgIGNoYXIgICBhcmdjOworICAgICBpbnQgICAgYXJnaTsKKyAgICAgZmxvYXQgIGFyZ2Y7CisgICAgIGRvdWJsZSBhcmdkOworICAgICB0ZXN0X3N0cnVjdCBhcmdzdHJ1Y3Q7CisgICAgIGludCBhcmdhcnJheVs0XTsKK3sKKyAgaW50IGk7CisKKyAgaSA9ICAoaW50KSBhcmdjICsgYXJnaSArIGFyZ2YgKyBhcmdkICsgYXJnc3RydWN0Lm1lbWJlcmkgKyBhcmdhcnJheVsxXTsKKworICByZXR1cm4gaTsKK30KKworLyogVGVzdCBjb2xsZWN0aW5nIHN0cnVjdCBhcmdzLiAqLworaW50IGFyZ3N0cnVjdF90ZXN0X2Z1bmMgKGFyZ3N0cnVjdCkKKyAgICAgdGVzdF9zdHJ1Y3QgYXJnc3RydWN0OworeworICByZXR1cm4gKGludCkgYXJnc3RydWN0Lm1lbWJlcmMgKyBhcmdzdHJ1Y3QubWVtYmVyaSArIAorICAgICAgICAgICAgICAgICBhcmdzdHJ1Y3QubWVtYmVyZiArIGFyZ3N0cnVjdC5tZW1iZXJkOworfQorCisvKiBUZXN0IGNvbGxlY3RpbmcgYXJyYXkgYXJncy4gKi8KK2ludCBhcmdhcnJheV90ZXN0X2Z1bmMgKGFyZ2FycmF5KQorICAgICBpbnQgYXJnYXJyYXlbNF07Cit7CisgIHJldHVybiAoaW50KSBhcmdhcnJheVswXSArIGFyZ2FycmF5WzFdICsgYXJnYXJyYXlbMl0gKyBhcmdhcnJheVszXTsKK30KKworCisKK2ludCBsb2NhbF90ZXN0X2Z1bmMgKCkJCQkvKiB0ZXN0IGNvbGxlY3RpbmcgbG9jYWxzICovCit7CisgIGNoYXIgICAgICAgIGxvY2MgID0gMTE7CisgIGludCAgICAgICAgIGxvY2kgID0gMTI7CisgIGZsb2F0ICAgICAgIGxvY2YgID0gMTMuMzsKKyAgZG91YmxlICAgICAgbG9jZCAgPSAxNC40OworICB0ZXN0X3N0cnVjdCBsb2NzdDsKKyAgaW50ICAgICAgICAgbG9jYXJbNF07CisgIGludCAgICAgICAgIGk7CisKKyAgbG9jc3QubWVtYmVyYyAgPSAxNTsKKyAgbG9jc3QubWVtYmVyaSAgPSAxNjsKKyAgbG9jc3QubWVtYmVyZiAgPSAxNy43OworICBsb2NzdC5tZW1iZXJkICA9IDE4Ljg7CisgIGxvY2FyWzBdID0gMTIxOworICBsb2NhclsxXSA9IDEyMjsKKyAgbG9jYXJbMl0gPSAxMjM7CisgIGxvY2FyWzNdID0gMTI0OworCisgIGkgPSAvKiBTZXRfVHJhY2Vwb2ludF9IZXJlICovCisgICAgKGludCkgbG9jYyArIGxvY2kgKyBsb2NmICsgbG9jZCArIGxvY3N0Lm1lbWJlcmkgKyBsb2NhclsxXTsKKworICByZXR1cm4gaTsKK30KKworaW50IHJlZ2xvY2FsX3Rlc3RfZnVuYyAoKQkJLyogdGVzdCBjb2xsZWN0aW5nIHJlZ2lzdGVyIGxvY2FscyAqLworeworICByZWdpc3RlciBjaGFyICAgICAgICBsb2NjID0gMTE7CisgIHJlZ2lzdGVyIGludCAgICAgICAgIGxvY2kgPSAxMjsKKyAgcmVnaXN0ZXIgZmxvYXQgICAgICAgbG9jZiA9IDEzLjM7CisgIHJlZ2lzdGVyIGRvdWJsZSAgICAgIGxvY2QgPSAxNC40OworICByZWdpc3RlciB0ZXN0X3N0cnVjdCBsb2NzdDsKKyAgcmVnaXN0ZXIgaW50ICAgICAgICAgbG9jYXJbNF07CisgIGludCAgICAgICAgICAgICAgICAgIGk7CisKKyAgbG9jc3QubWVtYmVyYyAgPSAxNTsKKyAgbG9jc3QubWVtYmVyaSAgPSAxNjsKKyAgbG9jc3QubWVtYmVyZiAgPSAxNy43OworICBsb2NzdC5tZW1iZXJkICA9IDE4Ljg7CisgIGxvY2FyWzBdID0gMTIxOworICBsb2NhclsxXSA9IDEyMjsKKyAgbG9jYXJbMl0gPSAxMjM7CisgIGxvY2FyWzNdID0gMTI0OworCisgIGkgPSAvKiBTZXRfVHJhY2Vwb2ludF9IZXJlICovCisgICAgKGludCkgbG9jYyArIGxvY2kgKyBsb2NmICsgbG9jZCArIGxvY3N0Lm1lbWJlcmkgKyBsb2NhclsxXTsKKworICByZXR1cm4gaTsKK30KKworaW50IHN0YXRsb2NhbF90ZXN0X2Z1bmMgKCkJCS8qIHRlc3QgY29sbGVjdGluZyBzdGF0aWMgbG9jYWxzICovCit7CisgIHN0YXRpYyAgIGNoYXIgICAgICAgIGxvY2M7CisgIHN0YXRpYyAgIGludCAgICAgICAgIGxvY2k7CisgIHN0YXRpYyAgIGZsb2F0ICAgICAgIGxvY2Y7CisgIHN0YXRpYyAgIGRvdWJsZSAgICAgIGxvY2Q7CisgIHN0YXRpYyAgIHRlc3Rfc3RydWN0IGxvY3N0OworICBzdGF0aWMgICBpbnQgICAgICAgICBsb2Nhcls0XTsKKyAgaW50ICAgICAgICAgICAgICAgICAgaTsKKworICBsb2NjID0gMTE7CisgIGxvY2kgPSAxMjsKKyAgbG9jZiA9IDEzLjM7CisgIGxvY2QgPSAxNC40OworICBsb2NzdC5tZW1iZXJjID0gMTU7CisgIGxvY3N0Lm1lbWJlcmkgPSAxNjsKKyAgbG9jc3QubWVtYmVyZiA9IDE3Ljc7CisgIGxvY3N0Lm1lbWJlcmQgPSAxOC44OworICBsb2NhclswXSA9IDEyMTsKKyAgbG9jYXJbMV0gPSAxMjI7CisgIGxvY2FyWzJdID0gMTIzOworICBsb2NhclszXSA9IDEyNDsKKworICBpID0gLyogU2V0X1RyYWNlcG9pbnRfSGVyZSAqLworICAgIChpbnQpIGxvY2MgKyBsb2NpICsgbG9jZiArIGxvY2QgKyBsb2NzdC5tZW1iZXJpICsgbG9jYXJbMV07CisKKyAgLyogU2V0IHN0YXRpYyBsb2NhbHMgYmFjayB0byB6ZXJvIHNvIGNvbGxlY3RlZCB2YWx1ZXMgYXJlIGNsZWFybHkgc3BlY2lhbC4gKi8KKyAgbG9jYyA9IDA7CisgIGxvY2kgPSAwOworICBsb2NmID0gMDsKKyAgbG9jZCA9IDA7CisgIGxvY3N0Lm1lbWJlcmMgPSAwOworICBsb2NzdC5tZW1iZXJpID0gMDsKKyAgbG9jc3QubWVtYmVyZiA9IDA7CisgIGxvY3N0Lm1lbWJlcmQgPSAwOworICBsb2NhclswXSA9IDA7CisgIGxvY2FyWzFdID0gMDsKKyAgbG9jYXJbMl0gPSAwOworICBsb2NhclszXSA9IDA7CisKKyAgcmV0dXJuIGk7Cit9CisKKworaW50IGdsb2JhbHNfdGVzdF9mdW5jICgpCit7CisgIGludCBpID0gMDsKKworICBpICs9IGdsb2JhbGMgKyBnbG9iYWxpICsgZ2xvYmFsZiArIGdsb2JhbGQ7CisgIGkgKz0gZ2xvYmFsc3RydWN0Lm1lbWJlcmMgKyBnbG9iYWxzdHJ1Y3QubWVtYmVyaTsKKyAgaSArPSBnbG9iYWxzdHJ1Y3QubWVtYmVyZiArIGdsb2JhbHN0cnVjdC5tZW1iZXJkOworICBpICs9IGdsb2JhbGFyclsxXTsKKworICByZXR1cm4gaTsJLyogU2V0X1RyYWNlcG9pbnRfSGVyZSAqLworfQorCitpbnQKK21haW4gKGFyZ2MsIGFyZ3YsIGVudnApCisgICAgIGludCBhcmdjOworICAgICBjaGFyICphcmd2W10sICoqZW52cDsKK3sKKyAgaW50ICAgICAgICAgaSA9IDA7CisgIHRlc3Rfc3RydWN0IG15c3RydWN0OworICBpbnQgICAgICAgICBteWFycmF5WzRdOworCisjaWZkZWYgdXNlc3R1YnMKKyAgc2V0X2RlYnVnX3RyYXBzICgpOworICBicmVha3BvaW50ICgpOworI2VuZGlmCisKKyAgYmVnaW4gKCk7CisgIC8qIEFzc2lnbiBjb2xsZWN0YWJsZSB2YWx1ZXMgdG8gZ2xvYmFsIHZhcmlhYmxlcy4gKi8KKyAgbDAgID0gczAgID0gYzAgID0gMDsgICAgIGwxICA9IHMxICA9IGMxICA9IDE7CisgIGwyICA9IHMyICA9IGMyICA9IDI7ICAgICBsMyAgPSBzMyAgPSBjMyAgPSAzOworICBsNCAgPSBzNCAgPSBjNCAgPSA0OyAgICAgbDUgID0gczUgID0gYzUgID0gNTsKKyAgbDYgID0gczYgID0gYzYgID0gNjsgICAgIGw3ICA9IHM3ICA9IGM3ICA9IDc7CisgIGw4ICA9IHM4ICA9IGM4ICA9IDg7ICAgICBsOSAgPSBzOSAgPSBjOSAgPSA5OworICBsMTAgPSBzMTAgPSBjMTAgPSAxMDsgICAgbDExID0gczExID0gYzExID0gMTE7CisgIGwxMiA9IHMxMiA9IGMxMiA9IDEyOyAgICBsMTMgPSBzMTMgPSBjMTMgPSAxMzsKKyAgbDE0ID0gczE0ID0gYzE0ID0gMTQ7ICAgIGwxNSA9IHMxNSA9IGMxNSA9IDE1OworICBsbWludXMgPSBzbWludXMgPSBjbWludXMgPSAtMjsKKyAgZ2xvYmFsYyA9IDcxOworICBnbG9iYWxpID0gNzI7CisgIGdsb2JhbGYgPSA3My4zOworICBnbG9iYWxkID0gNzQuNDsKKyAgZ2xvYmFsc3RydWN0Lm1lbWJlcmMgPSA4MTsKKyAgZ2xvYmFsc3RydWN0Lm1lbWJlcmkgPSA4MjsKKyAgZ2xvYmFsc3RydWN0Lm1lbWJlcmYgPSA4My4zOworICBnbG9iYWxzdHJ1Y3QubWVtYmVyZCA9IDg0LjQ7CisgIGdsb2JhbHAgPSAmZ2xvYmFsc3RydWN0OworCisgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQorICAgIGdsb2JhbGFycltpXSA9IGk7CisKKyAgbXlzdHJ1Y3QubWVtYmVyYyA9IDEwMTsKKyAgbXlzdHJ1Y3QubWVtYmVyaSA9IDEwMjsKKyAgbXlzdHJ1Y3QubWVtYmVyZiA9IDEwMy4zOworICBteXN0cnVjdC5tZW1iZXJkID0gMTA0LjQ7CisgIG15YXJyYXlbMF0gPSAxMTE7CisgIG15YXJyYXlbMV0gPSAxMTI7CisgIG15YXJyYXlbMl0gPSAxMTM7CisgIG15YXJyYXlbM10gPSAxMTQ7CisKKyAgLyogQ2FsbCB0ZXN0IGZ1bmN0aW9ucywgc28gdGhleSBjYW4gYmUgdHJhY2VkIGFuZCBkYXRhIGNvbGxlY3RlZC4gICovCisgIGkgPSAwOworICBpICs9IGFyZ3NfdGVzdF9mdW5jICgxLCAyLCAzLjMsIDQuNCwgbXlzdHJ1Y3QsIG15YXJyYXkpOworICBpICs9IGFyZ3N0cnVjdF90ZXN0X2Z1bmMgKG15c3RydWN0KTsKKyAgaSArPSBhcmdhcnJheV90ZXN0X2Z1bmMgKG15YXJyYXkpOworICBpICs9IGxvY2FsX3Rlc3RfZnVuYyAoKTsKKyAgaSArPSByZWdsb2NhbF90ZXN0X2Z1bmMgKCk7CisgIGkgKz0gc3RhdGxvY2FsX3Rlc3RfZnVuYyAoKTsKKyAgaSArPSBnbG9iYWxzX3Rlc3RfZnVuYyAoKTsKKworICAvKiBWYWx1ZXMgb2YgZ2xvYmFscyBhdCBlbmQgb2YgdGVzdCBzaG91bGQgYmUgZGlmZmVyZW50IGZyb20KKyAgICAgdmFsdWVzIHRoYXQgdGhleSBoYWQgd2hlbiB0cmFjZSBkYXRhIHdhcyBjYXB0dXJlZC4gICovCisKKyAgbDAgID0gczAgID0gYzAgID0gMDsgICAgIGwxICA9IHMxICA9IGMxICA9IDA7CisgIGwyICA9IHMyICA9IGMyICA9IDA7ICAgICBsMyAgPSBzMyAgPSBjMyAgPSAwOworICBsNCAgPSBzNCAgPSBjNCAgPSAwOyAgICAgbDUgID0gczUgID0gYzUgID0gMDsKKyAgbDYgID0gczYgID0gYzYgID0gMDsgICAgIGw3ICA9IHM3ICA9IGM3ICA9IDA7CisgIGw4ICA9IHM4ICA9IGM4ICA9IDA7ICAgICBsOSAgPSBzOSAgPSBjOSAgPSAwOworICBsMTAgPSBzMTAgPSBjMTAgPSAwOyAgICAgbDExID0gczExID0gYzExID0gMDsKKyAgbDEyID0gczEyID0gYzEyID0gMDsgICAgIGwxMyA9IHMxMyA9IGMxMyA9IDA7CisgIGwxNCA9IHMxNCA9IGMxNCA9IDA7ICAgICBsMTUgPSBzMTUgPSBjMTUgPSAwOworICBsbWludXMgPSBzbWludXMgPSBjbWludXMgPSAwOworCisgIC8qIFNldCAnZW0gYmFjayB0byB6ZXJvLCBzbyB0aGF0IHRoZSBjb2xsZWN0ZWQgdmFsdWVzIHdpbGwgYmUKKyAgICAgZGlzdGluY3RseSBkaWZmZXJlbnQgZnJvbSB0aGUgInJlYWx0aW1lIiAoZW5kIG9mIHRlc3QpIHZhbHVlcy4gICovCisKKyAgZ2xvYmFsYyA9IDA7CisgIGdsb2JhbGkgPSAwOworICBnbG9iYWxmID0gMDsKKyAgZ2xvYmFsZCA9IDA7CisgIGdsb2JhbHN0cnVjdC5tZW1iZXJjID0gMDsKKyAgZ2xvYmFsc3RydWN0Lm1lbWJlcmkgPSAwOworICBnbG9iYWxzdHJ1Y3QubWVtYmVyZiA9IDA7CisgIGdsb2JhbHN0cnVjdC5tZW1iZXJkID0gMDsKKyAgZ2xvYmFscCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQorICAgIGdsb2JhbGFycltpXSA9IDA7CisKKyAgZW5kICgpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL2NvbGxlY3Rpb24uZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvY29sbGVjdGlvbi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkNzU3NwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL2NvbGxlY3Rpb24uZXhwCkBAIC0wLDAgKzEsNjIzIEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworaWYgW2lzdGFyZ2V0ICJtNjhrLSotZWxmIl0gdGhlbiB7CisgICAgcGFzcyAiVGVzdCBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgdGFyZ2V0IgorICAgIHJldHVybjsKK30KKworbG9hZF9saWIgInRyYWNlLXN1cHBvcnQuZXhwIgorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKwlzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK3NldCB0ZXN0ZmlsZSAiY29sbGVjdGlvbiIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICRvYmpkaXIvJHN1YmRpci8kdGVzdGZpbGUKKworaWYgeyBbZ2RiX2NvbXBpbGUgIiRzcmNkaXIvJHN1YmRpci8kc3JjZmlsZSIgJGJpbmZpbGUgXAorCWV4ZWN1dGFibGUge2RlYnVnIGFkZGl0aW9uYWxfZmxhZ3M9LXd9XSAhPSAiIiB9IHsKKyAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworIyBUZXN0czogCisjIDEpICRhcmdzCisjIDIpIGZ1bmN0aW9uIGFyZ3MgYnkgbmFtZQorIyAzKSAkbG9jcworIyA0KSBmdW5jdGlvbiBsb2NhbHMgYnkgbmFtZQorIyA1KSAkcmVncworIyA2KSByZWdpc3RlcnMgYnkgbmFtZSAoJHNwLCAkZnA/KQorIyA3KSBnbG9iYWxzIGJ5IG5hbWUKKyMgOCkgZXhwcmVzc2lvbnMgKGxvdHMgb2YgZGlmZmVyZW50IGtpbmRzOiBsb2NhbCBhbmQgZ2xvYmFsKQorCitzZXQgd3MgIlxbXHJcblx0IFxdKyIKK3NldCBjciAiXFtcclxuXF0rIgorCisjCisjIFV0aWxpdHkgcHJvY3MKKyMKKworcHJvYyB0ZXN0X3JlZ2lzdGVyIHsgcmVnIHRlc3RfaWQgfSB7CisgICAgZ2xvYmFsIGNyCisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIHNlbmRfZ2RiICJwcmludCAkcmVnXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJcXCRcWzAtOVxdKyA9IFxbeDBcXSskY3IkZ2RiX3Byb21wdCAiIHsKKwkgICAgZmFpbCAiY29sbGVjdCAkdGVzdF9pZDogY29sbGVjdGVkICRyZWcgKHplcm8pIgorCX0KKwktcmUgIlxcJFxbMC05XF0rID0gXFt4MC05YS1mQS1GXF0rJGNyJGdkYl9wcm9tcHQgIiB7CisJICAgIHBhc3MgImNvbGxlY3QgJHRlc3RfaWQ6IGNvbGxlY3RlZCAkcmVnIgorCX0KKwktcmUgIlxbRWVcXXJyb3IuKiRnZGJfcHJvbXB0ICIgeworCSAgICBmYWlsICJjb2xsZWN0ICR0ZXN0X2lkOiBjb2xsZWN0ZWQgJHJlZyAoZXJyb3IpIgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAiY29sbGVjdCAkdGVzdF9pZDogY29sbGVjdGVkICRyZWcgKHRpbWVvdXQpIgorCX0KKyAgICB9Cit9CisKK3Byb2MgcnVuX3RyYWNlX2V4cGVyaW1lbnQgeyBtc2cgdGVzdF9mdW5jIH0geworICAgIGdkYl9ydW5fY21kIAorICAgIGdkYl90ZXN0ICJ0c3RhcnQiIFwKKwkgICAgIlxbXHJcblxdKyIgXAorCSAgICAiY29sbGVjdCAkbXNnOiBzdGFydCB0cmFjZSBleHBlcmltZW50IgorICAgIGdkYl90ZXN0ICJjb250aW51ZSIgXAorCSAgICAiQ29udGludWluZy4qQnJlYWtwb2ludCBcWzAtOVxdKywgZW5kLioiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogcnVuIHRyYWNlIGV4cGVyaW1lbnQiCisgICAgZ2RiX3Rlc3QgInRzdG9wIiBcCisJICAgICJcW1xyXG5cXSsiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogc3RvcCB0cmFjZSBleHBlcmltZW50IgorICAgIGdkYl90ZXN0ICJ0ZmluZCBzdGFydCIgXAorCSAgICAiIzAgICR0ZXN0X2Z1bmMgLioiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogdGZpbmQgdGVzdCBmcmFtZSIKK30KKworCisjCisjIFRlc3QgcHJvY3MKKyMKKworcHJvYyBnZGJfY29sbGVjdF9hcmdzX3Rlc3QgeyBteWFyZ3MgbXNnIH0geworICAgIGdsb2JhbCBjcgorICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICAjIE1ha2Ugc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhcnRpbmcgc3RhdGUuCisgICAgZ2RiX3Rlc3QgInRzdG9wIiAiIiAiIgorICAgIGdkYl90ZXN0ICJ0ZmluZCBub25lIiAiIiAiIgorICAgIGdkYl9kZWxldGVfdHJhY2Vwb2ludHMKKworICAgIGdkYl90ZXN0ICJ0cmFjZSBhcmdzX3Rlc3RfZnVuYyIgXAorCSAgICAiVHJhY2Vwb2ludCBcWzAtOVxdKyBhdCAuKiIgXAorCSAgICAiY29sbGVjdCAkbXNnOiBzZXQgdHJhY2Vwb2ludCIKKyAgICBnZGJfdHJhY2Vfc2V0YWN0aW9ucyAiY29sbGVjdCAkbXNnOiBkZWZpbmUgYWN0aW9ucyIgXAorCSAgICAiIiBcCisJICAgICJjb2xsZWN0ICRteWFyZ3MiICJeJCIKKworICAgICMgQmVnaW4gdGhlIHRlc3QuCisgICAgcnVuX3RyYWNlX2V4cGVyaW1lbnQgJG1zZyBhcmdzX3Rlc3RfZnVuYworCisgICAgZ2RiX3Rlc3QgInByaW50IGFyZ2MiIFwKKwkgICAgIlxcJFxbMC05XF0rID0gMSAnLjAwMSckY3IiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogY29sbGVjdGVkIGFyZyBjaGFyIgorICAgIGdkYl90ZXN0ICJwcmludCBhcmdpIiBcCisJICAgICJcXCRcWzAtOVxdKyA9IDIkY3IiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogY29sbGVjdGVkIGFyZyBpbnQiCisgICAgZ2RiX3Rlc3QgInByaW50IGFyZ2YiIFwKKwkgICAgIlxcJFxbMC05XF0rID0gMy5cWzIzXF1cWzAtOVxdKiRjciIgXAorCSAgICAiY29sbGVjdCAkbXNnOiBjb2xsZWN0ZWQgYXJnIGZsb2F0IgorICAgIGdkYl90ZXN0ICJwcmludCBhcmdkIiBcCisJICAgICJcXCRcWzAtOVxdKyA9IDQuXFszNFxdXFswLTlcXSokY3IiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogY29sbGVjdGVkIGFyZyBkb3VibGUiCisKKyAgICAjIHN0cnVjdCBhcmcgYXMgb25lIG9mIHNldmVyYWwgYXJncyAobmVhciBlbmQgb2YgbGlzdCkKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJnc3RydWN0Lm1lbWJlcmMiIFwKKwkgICAgIlxcJFxbMC05XF0rID0gMTAxICdlJyRjciIgXAorCSAgICAiY29sbGVjdCAkbXNnOiBjb2xsZWN0ZWQgYXJnIHN0cnVjdCBtZW1iZXIgY2hhciIKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJnc3RydWN0Lm1lbWJlcmkiIFwKKwkgICAgIlxcJFxbMC05XF0rID0gMTAyJGNyIiBcCisJICAgICJjb2xsZWN0ICRtc2c6IGNvbGxlY3RlZCBhcmcgc3RydWN0IG1lbWJlciBpbnQiCisgICAgZ2RiX3Rlc3QgInByaW50IGFyZ3N0cnVjdC5tZW1iZXJmIiBcCisJICAgICJcXCRcWzAtOVxdKyA9IDEwMy5cWzIzXF1cWzAtOVxdKiRjciIgXAorCSAgICAiY29sbGVjdCAkbXNnOiBjb2xsZWN0ZWQgYXJnIHN0cnVjdCBtZW1iZXIgZmxvYXQiCisgICAgZ2RiX3Rlc3QgInByaW50IGFyZ3N0cnVjdC5tZW1iZXJkIiBcCisJICAgICJcXCRcWzAtOVxdKyA9IDEwNC5cWzM0XF1cWzAtOVxdKiRjciIgXAorCSAgICAiY29sbGVjdCAkbXNnOiBjb2xsZWN0ZWQgYXJnIHN0cnVjdCBtZW1iZXIgZG91YmxlIgorCisgICAgIyBhcnJheSBhcmcgYXMgb25lIG9mIHNldmVyYWwgYXJncyAobmVhciBlbmQgb2YgbGlzdCkKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJnYXJyYXlcWzBcXSIgXAorCSAgICAiXFwkXFswLTlcXSsgPSAxMTEkY3IiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogY29sbGVjdGVkIGFyZ2FycmF5ICMwIgorICAgIGdkYl90ZXN0ICJwcmludCBhcmdhcnJheVxbMVxdIiBcCisJICAgICJcXCRcWzAtOVxdKyA9IDExMiRjciIgXAorCSAgICAiY29sbGVjdCAkbXNnOiBjb2xsZWN0ZWQgYXJnYXJyYXkgIzEiCisgICAgZ2RiX3Rlc3QgInByaW50IGFyZ2FycmF5XFsyXF0iIFwKKwkgICAgIlxcJFxbMC05XF0rID0gMTEzJGNyIiBcCisJICAgICJjb2xsZWN0ICRtc2c6IGNvbGxlY3RlZCBhcmdhcnJheSAjMiIKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJnYXJyYXlcWzNcXSIgXAorCSAgICAiXFwkXFswLTlcXSsgPSAxMTQkY3IiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogY29sbGVjdGVkIGFyZ2FycmF5ICMzIgorCisgICAgZ2RiX3Rlc3QgInRmaW5kIG5vbmUiIFwKKwkgICAgIiMwICBlbmQgLioiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogY2Vhc2UgdHJhY2UgZGVidWdnaW5nIgorfQorCitwcm9jIGdkYl9jb2xsZWN0X2FyZ3N0cnVjdF90ZXN0IHsgbXlhcmdzIG1zZyB9IHsKKyAgICBnbG9iYWwgY3IKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgIyBNYWtlIHN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXJ0aW5nIHN0YXRlLgorICAgIGdkYl90ZXN0ICJ0c3RvcCIgIiIgIiIKKyAgICBnZGJfdGVzdCAidGZpbmQgbm9uZSIgIiIgIiIKKyAgICBnZGJfZGVsZXRlX3RyYWNlcG9pbnRzCisKKyAgICBnZGJfdGVzdCAidHJhY2UgYXJnc3RydWN0X3Rlc3RfZnVuYyIgXAorCSAgICAiVHJhY2Vwb2ludCBcWzAtOVxdKyBhdCAuKiIgXAorCSAgICAiY29sbGVjdCAkbXNnOiBzZXQgdHJhY2Vwb2ludCIKKyAgICBnZGJfdHJhY2Vfc2V0YWN0aW9ucyAiY29sbGVjdCAkbXNnOiBkZWZpbmUgYWN0aW9ucyIgXAorCSAgICAiIiBcCisJICAgICJjb2xsZWN0ICRteWFyZ3MiICJeJCIKKworICAgICMgQmVnaW4gdGhlIHRlc3QuCisgICAgcnVuX3RyYWNlX2V4cGVyaW1lbnQgJG1zZyBhcmdzdHJ1Y3RfdGVzdF9mdW5jCisKKyAgICAjIHN0cnVjdCBhcmd1bWVudCBhcyBvbmx5IGFyZ3VtZW50CisgICAgZ2RiX3Rlc3QgInByaW50IGFyZ3N0cnVjdC5tZW1iZXJjIiBcCisJICAgICJcXCRcWzAtOVxdKyA9IDEwMSAnZSckY3IiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogY29sbGVjdGVkIGFyZyBzdHJ1Y3QgbWVtYmVyIGNoYXIiCisgICAgZ2RiX3Rlc3QgInByaW50IGFyZ3N0cnVjdC5tZW1iZXJpIiBcCisJICAgICJcXCRcWzAtOVxdKyA9IDEwMiRjciIgXAorCSAgICAiY29sbGVjdCAkbXNnOiBjb2xsZWN0ZWQgYXJnIHN0cnVjdCBtZW1iZXIgaW50IgorICAgIGdkYl90ZXN0ICJwcmludCBhcmdzdHJ1Y3QubWVtYmVyZiIgXAorCSAgICAiXFwkXFswLTlcXSsgPSAxMDMuXFsyM1xdXFswLTlcXSokY3IiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogY29sbGVjdGVkIGFyZyBzdHJ1Y3QgbWVtYmVyIGZsb2F0IgorICAgIGdkYl90ZXN0ICJwcmludCBhcmdzdHJ1Y3QubWVtYmVyZCIgXAorCSAgICAiXFwkXFswLTlcXSsgPSAxMDQuXFszNFxdXFswLTlcXSokY3IiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogY29sbGVjdGVkIGFyZyBzdHJ1Y3QgbWVtYmVyIGRvdWJsZSIKKworICAgIGdkYl90ZXN0ICJ0ZmluZCBub25lIiBcCisJICAgICIjMCAgZW5kIC4qIiBcCisJICAgICJjb2xsZWN0ICRtc2c6IGNlYXNlIHRyYWNlIGRlYnVnZ2luZyIKK30KKworCitwcm9jIGdkYl9jb2xsZWN0X2FyZ2FycmF5X3Rlc3QgeyBteWFyZ3MgbXNnIH0geworICAgIGdsb2JhbCBjcgorICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICAjIE1ha2Ugc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhcnRpbmcgc3RhdGUuCisgICAgZ2RiX3Rlc3QgInRzdG9wIiAiIiAiIgorICAgIGdkYl90ZXN0ICJ0ZmluZCBub25lIiAiIiAiIgorICAgIGdkYl9kZWxldGVfdHJhY2Vwb2ludHMKKworICAgIGdkYl90ZXN0ICJ0cmFjZSBhcmdhcnJheV90ZXN0X2Z1bmMiIFwKKwkgICAgIlRyYWNlcG9pbnQgXFswLTlcXSsgYXQgLioiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogc2V0IHRyYWNlcG9pbnQiCisgICAgZ2RiX3RyYWNlX3NldGFjdGlvbnMgImNvbGxlY3QgJG1zZzogZGVmaW5lIGFjdGlvbnMiIFwKKwkgICAgIiIgXAorCSAgICAiY29sbGVjdCAkbXlhcmdzIiAiXiQiCisKKyAgICAjIEJlZ2luIHRoZSB0ZXN0LgorICAgIHJ1bl90cmFjZV9leHBlcmltZW50ICRtc2cgYXJnYXJyYXlfdGVzdF9mdW5jCisKKyAgICAjIGFycmF5IGFyZyBhcyBvbmx5IGFyZ3VtZW50CisgICAgZ2RiX3Rlc3QgInByaW50IGFyZ2FycmF5XFswXF0iIFwKKwkgICAgIlxcJFxbMC05XF0rID0gMTExJGNyIiBcCisJICAgICJjb2xsZWN0ICRtc2c6IGNvbGxlY3RlZCBhcmdhcnJheSAjMCIKKyAgICBnZGJfdGVzdCAicHJpbnQgYXJnYXJyYXlcWzFcXSIgXAorCSAgICAiXFwkXFswLTlcXSsgPSAxMTIkY3IiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogY29sbGVjdGVkIGFyZ2FycmF5ICMxIgorICAgIGdkYl90ZXN0ICJwcmludCBhcmdhcnJheVxbMlxdIiBcCisJICAgICJcXCRcWzAtOVxdKyA9IDExMyRjciIgXAorCSAgICAiY29sbGVjdCAkbXNnOiBjb2xsZWN0ZWQgYXJnYXJyYXkgIzIiCisgICAgZ2RiX3Rlc3QgInByaW50IGFyZ2FycmF5XFszXF0iIFwKKwkgICAgIlxcJFxbMC05XF0rID0gMTE0JGNyIiBcCisJICAgICJjb2xsZWN0ICRtc2c6IGNvbGxlY3RlZCBhcmdhcnJheSAjMyIKKworICAgIGdkYl90ZXN0ICJ0ZmluZCBub25lIiBcCisJICAgICIjMCAgZW5kIC4qIiBcCisJICAgICJjb2xsZWN0ICRtc2c6IGNlYXNlIHRyYWNlIGRlYnVnZ2luZyIKK30KKworCitwcm9jIGdkYl9jb2xsZWN0X2xvY2Fsc190ZXN0IHsgZnVuYyBteWxvY3MgbXNnIH0geworICAgIGdsb2JhbCBjcgorICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICAjIE1ha2Ugc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhcnRpbmcgc3RhdGUuCisgICAgZ2RiX3Rlc3QgInRzdG9wIiAiIiAiIgorICAgIGdkYl90ZXN0ICJ0ZmluZCBub25lIiAiIiAiIgorICAgIGdkYl9kZWxldGVfdHJhY2Vwb2ludHMKKworICAgICMgRmluZCB0aGUgY29tbWVudC1pZGVudGlmaWVkIGxpbmUgZm9yIHNldHRpbmcgdGhpcyB0cmFjZXBvaW50LgorICAgIHNldCB0ZXN0bGluZSAwCisgICAgc2VuZF9nZGIgImxpc3QgJGZ1bmMsICszMFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiXFtcclxuXF0oXFswLTlcXSspXFteXHJcblxdKyBTZXRfVHJhY2Vwb2ludF9IZXJlIC4qJGdkYl9wcm9tcHQiIHsKKwkgICAgc2V0IHRlc3RsaW5lICRleHBlY3Rfb3V0KDEsc3RyaW5nKQorCSAgICBwYXNzICJjb2xsZWN0ICRtc2c6IGZpbmQgdHJhY2Vwb2ludCBsaW5lIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgIiB7CisJICAgIGZhaWwgImNvbGxlY3QgJG1zZzogZmluZCB0cmFjZXBvaW50IGxpbmUgKHNraXBwaW5nIGxvY2FscyB0ZXN0KSIKKwkgICAgcmV0dXJuCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJjb2xsZWN0ICRtc2c6IGZpbmQgdHJhY2Vwb2ludCBsaW5lIChza2lwcGluZyBsb2NhbHMgdGVzdCkiCisJICAgIHJldHVybgorCX0KKyAgICB9CisKKyAgICBnZGJfdGVzdCAidHJhY2UgJHRlc3RsaW5lIiBcCisJICAgICJUcmFjZXBvaW50IFxbMC05XF0rIGF0IC4qIiBcCisJICAgICJjb2xsZWN0ICRtc2c6IHNldCB0cmFjZXBvaW50IgorICAgIGdkYl90cmFjZV9zZXRhY3Rpb25zICJjb2xsZWN0ICRtc2c6IGRlZmluZSBhY3Rpb25zIiBcCisJICAgICIiIFwKKwkgICAgImNvbGxlY3QgJG15bG9jcyIgIl4kIgorCisgICAgIyBCZWdpbiB0aGUgdGVzdC4KKyAgICBydW5fdHJhY2VfZXhwZXJpbWVudCAkbXNnICRmdW5jCisKKyAgICBnZGJfdGVzdCAicHJpbnQgbG9jYyIgXAorCSAgICAiXFwkXFswLTlcXSsgPSAxMSAnLjAxMyckY3IiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogY29sbGVjdGVkIGxvY2FsIGNoYXIiCisgICAgZ2RiX3Rlc3QgInByaW50IGxvY2kiIFwKKwkgICAgIlxcJFxbMC05XF0rID0gMTIkY3IiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogY29sbGVjdGVkIGxvY2FsIGludCIKKyAgICBnZGJfdGVzdCAicHJpbnQgbG9jZiIgXAorCSAgICAiXFwkXFswLTlcXSsgPSAxMy5cWzIzXF1cWzAtOVxdKiRjciIgXAorCSAgICAiY29sbGVjdCAkbXNnOiBjb2xsZWN0ZWQgbG9jYWwgZmxvYXQiCisgICAgZ2RiX3Rlc3QgInByaW50IGxvY2QiIFwKKwkgICAgIlxcJFxbMC05XF0rID0gMTQuXFszNFxdXFswLTlcXSokY3IiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogY29sbGVjdGVkIGxvY2FsIGRvdWJsZSIKKworICAgIGdkYl90ZXN0ICJwcmludCBsb2NzdC5tZW1iZXJjIiBcCisJICAgICJcXCRcWzAtOVxdKyA9IDE1ICcuMDE3JyRjciIgXAorCSAgICAiY29sbGVjdCAkbXNnOiBjb2xsZWN0ZWQgbG9jYWwgbWVtYmVyIGNoYXIiCisgICAgZ2RiX3Rlc3QgInByaW50IGxvY3N0Lm1lbWJlcmkiIFwKKwkgICAgIlxcJFxbMC05XF0rID0gMTYkY3IiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogY29sbGVjdGVkIGxvY2FsIG1lbWJlciBpbnQiCisgICAgZ2RiX3Rlc3QgInByaW50IGxvY3N0Lm1lbWJlcmYiIFwKKwkgICAgIlxcJFxbMC05XF0rID0gMTcuXFs2N1xdXFswLTlcXSokY3IiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogY29sbGVjdGVkIGxvY2FsIG1lbWJlciBmbG9hdCIKKyAgICBnZGJfdGVzdCAicHJpbnQgbG9jc3QubWVtYmVyZCIgXAorCSAgICAiXFwkXFswLTlcXSsgPSAxOC5cWzc4XF1cWzAtOVxdKiRjciIgXAorCSAgICAiY29sbGVjdCAkbXNnOiBjb2xsZWN0ZWQgbG9jYWwgbWVtYmVyIGRvdWJsZSIKKworICAgIGdkYl90ZXN0ICJwcmludCBsb2NhclxbMFxdIiBcCisJICAgICJcXCRcWzAtOVxdKyA9IDEyMSRjciIgXAorCSAgICAiY29sbGVjdCAkbXNnOiBjb2xsZWN0ZWQgbG9jYXJyYXkgIzAiCisgICAgZ2RiX3Rlc3QgInByaW50IGxvY2FyXFsxXF0iIFwKKwkgICAgIlxcJFxbMC05XF0rID0gMTIyJGNyIiBcCisJICAgICJjb2xsZWN0ICRtc2c6IGNvbGxlY3RlZCBsb2NhcnJheSAjMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgbG9jYXJcWzJcXSIgXAorCSAgICAiXFwkXFswLTlcXSsgPSAxMjMkY3IiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogY29sbGVjdGVkIGxvY2FycmF5ICMyIgorICAgIGdkYl90ZXN0ICJwcmludCBsb2NhclxbM1xdIiBcCisJICAgICJcXCRcWzAtOVxdKyA9IDEyNCRjciIgXAorCSAgICAiY29sbGVjdCAkbXNnOiBjb2xsZWN0ZWQgbG9jYXJyYXkgIzMiCisJICAgIAorCisgICAgZ2RiX3Rlc3QgInRmaW5kIG5vbmUiIFwKKwkgICAgIiMwICBlbmQgLioiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogY2Vhc2UgdHJhY2UgZGVidWdnaW5nIgorfQorCitwcm9jIGdkYl9jb2xsZWN0X3JlZ2lzdGVyc190ZXN0IHsgbXlyZWdzIH0geworICAgIGdsb2JhbCBjcgorICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICAjIE1ha2Ugc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhcnRpbmcgc3RhdGUuCisgICAgZ2RiX3Rlc3QgInRzdG9wIiAiIiAiIgorICAgIGdkYl90ZXN0ICJ0ZmluZCBub25lIiAiIiAiIgorICAgIGdkYl9kZWxldGVfdHJhY2Vwb2ludHMKKworICAgICMgV2UnbGwgc2ltcGx5IHJlLXVzZSB0aGUgYXJnc190ZXN0X2Z1bmN0aW9uIGZvciB0aGlzIHRlc3QKKyAgICBnZGJfdGVzdCAidHJhY2UgYXJnc190ZXN0X2Z1bmMiIFwKKwkgICAgIlRyYWNlcG9pbnQgXFswLTlcXSsgYXQgLioiIFwKKwkgICAgImNvbGxlY3QgJG15cmVnczogc2V0IHRyYWNlcG9pbnQiCisgICAgZ2RiX3RyYWNlX3NldGFjdGlvbnMgImNvbGxlY3QgJG15cmVnczogZGVmaW5lIGFjdGlvbnMiIFwKKwkgICAgIiIgXAorCSAgICAiY29sbGVjdCAkbXlyZWdzIiAiXiQiCisKKyAgICAjIEJlZ2luIHRoZSB0ZXN0LgorICAgIHJ1bl90cmFjZV9leHBlcmltZW50ICRteXJlZ3MgYXJnc190ZXN0X2Z1bmMKKworICAgIHRlc3RfcmVnaXN0ZXIgIlwkZnAiICRteXJlZ3MKKyAgICB0ZXN0X3JlZ2lzdGVyICJcJHNwIiAkbXlyZWdzCisgICAgdGVzdF9yZWdpc3RlciAiXCRwYyIgJG15cmVncworCisgICAgZ2RiX3Rlc3QgInRmaW5kIG5vbmUiIFwKKwkgICAgIiMwICBlbmQgLioiIFwKKwkgICAgImNvbGxlY3QgJG15cmVnczogY2Vhc2UgdHJhY2UgZGVidWdnaW5nIgorfQorCitwcm9jIGdkYl9jb2xsZWN0X2V4cHJlc3Npb25fdGVzdCB7IGZ1bmMgZXhwciB2YWwgbXNnIH0geworICAgIGdsb2JhbCBjcgorICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICAjIE1ha2Ugc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhcnRpbmcgc3RhdGUuCisgICAgZ2RiX3Rlc3QgInRzdG9wIiAiIiAiIgorICAgIGdkYl90ZXN0ICJ0ZmluZCBub25lIiAiIiAiIgorICAgIGdkYl9kZWxldGVfdHJhY2Vwb2ludHMKKworICAgICMgRmluZCB0aGUgY29tbWVudC1pZGVudGlmaWVkIGxpbmUgZm9yIHNldHRpbmcgdGhpcyB0cmFjZXBvaW50LgorICAgIHNldCB0ZXN0bGluZSAwCisgICAgc2VuZF9nZGIgImxpc3QgJGZ1bmMsICszMFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiXFtcclxuXF0oXFswLTlcXSspXFteXHJcblxdKyBTZXRfVHJhY2Vwb2ludF9IZXJlIC4qJGdkYl9wcm9tcHQiIHsKKwkgICAgc2V0IHRlc3RsaW5lICRleHBlY3Rfb3V0KDEsc3RyaW5nKQorCSAgICBwYXNzICJjb2xsZWN0ICRtc2c6IGZpbmQgdHJhY2Vwb2ludCBsaW5lIgorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgIiB7CisJICAgIGZhaWwgImNvbGxlY3QgJG1zZzogZmluZCB0cmFjZXBvaW50IGxpbmUgKHNraXBwaW5nIGxvY2FscyB0ZXN0KSIKKwkgICAgcmV0dXJuCisJfQorCXRpbWVvdXQgeworCSAgICBmYWlsICJjb2xsZWN0ICRtc2c6IGZpbmQgdHJhY2Vwb2ludCBsaW5lIChza2lwcGluZyBsb2NhbHMgdGVzdCkiCisJICAgIHJldHVybgorCX0KKyAgICB9CisKKyAgICBnZGJfdGVzdCAidHJhY2UgJHRlc3RsaW5lIiBcCisJICAgICJUcmFjZXBvaW50IFxbMC05XF0rIGF0IC4qIiBcCisJICAgICJjb2xsZWN0ICRtc2c6IHNldCB0cmFjZXBvaW50IgorICAgIGdkYl90cmFjZV9zZXRhY3Rpb25zICJjb2xsZWN0ICRtc2c6IGRlZmluZSBhY3Rpb25zIiBcCisJICAgICIiIFwKKwkgICAgImNvbGxlY3QgJGV4cHIiICJeJCIKKworICAgICMgQmVnaW4gdGhlIHRlc3QuCisgICAgcnVuX3RyYWNlX2V4cGVyaW1lbnQgJG1zZyAkZnVuYworCisgICAgZ2RiX3Rlc3QgInByaW50ICRleHByIiBcCisJICAgICJcXCRcWzAtOVxdKyA9ICR2YWwkY3IiIFwKKwkgICAgImNvbGxlY3QgJG1zZzogZ290IGV4cGVjdGVkIHZhbHVlICckdmFsJyIKKworICAgIGdkYl90ZXN0ICJ0ZmluZCBub25lIiBcCisJICAgICIjMCAgZW5kIC4qIiBcCisJICAgICJjb2xsZWN0ICRtc2c6IGNlYXNlIHRyYWNlIGRlYnVnZ2luZyIKK30KKworcHJvYyBnZGJfY29sbGVjdF9nbG9iYWxzX3Rlc3QgeyB9IHsKKyAgICBnbG9iYWwgY3IKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgIyBNYWtlIHN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXJ0aW5nIHN0YXRlLgorICAgIGdkYl90ZXN0ICJ0c3RvcCIgIiIgIiIKKyAgICBnZGJfdGVzdCAidGZpbmQgbm9uZSIgIiIgIiIKKyAgICBnZGJfZGVsZXRlX3RyYWNlcG9pbnRzCisKKyAgICAjIEZpbmQgdGhlIGNvbW1lbnQtaWRlbnRpZmllZCBsaW5lIGZvciBzZXR0aW5nIHRoaXMgdHJhY2Vwb2ludC4KKyAgICBzZXQgdGVzdGxpbmUgMAorICAgIHNlbmRfZ2RiICJsaXN0IGdsb2JhbHNfdGVzdF9mdW5jLCArMzBcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIlxbXHJcblxdKFxbMC05XF0rKVxbXlxyXG5cXSsgU2V0X1RyYWNlcG9pbnRfSGVyZSAuKiRnZGJfcHJvbXB0IiB7CisJICAgIHNldCB0ZXN0bGluZSAkZXhwZWN0X291dCgxLHN0cmluZykKKwkgICAgcGFzcyAiY29sbGVjdCBnbG9iYWxzOiBmaW5kIHRyYWNlcG9pbnQgbGluZSIKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICIgeworCSAgICBmYWlsICJjb2xsZWN0IGdsb2JhbHM6IGZpbmQgdHJhY2Vwb2ludCBsaW5lIChza2lwcGluZyBnbG9iYWwgdGVzdCkiCisJICAgIHJldHVybgorCX0KKwl0aW1lb3V0IHsKKwkgICAgZmFpbCAiY29sbGVjdCBnbG9iYWxzOiBmaW5kIHRyYWNlcG9pbnQgbGluZSAoc2tpcHBpbmcgZ2xvYmFsIHRlc3QpIgorCSAgICByZXR1cm4KKwl9CisgICAgfQorCisgICAgZ2RiX3Rlc3QgInRyYWNlICR0ZXN0bGluZSIgXAorCSAgICAiVHJhY2Vwb2ludCBcWzAtOVxdKyBhdCAuKiIgXAorCSAgICAiY29sbGVjdCBnbG9iYWxzOiBzZXQgdHJhY2Vwb2ludCIKKyAgICBnZGJfdHJhY2Vfc2V0YWN0aW9ucyAiY29sbGVjdCBnbG9iYWxzOiBkZWZpbmUgYWN0aW9ucyIgXAorCSAgICAiIiBcCisJICAgICJjb2xsZWN0IGdsb2JhbGMsIGdsb2JhbGksIGdsb2JhbGYsIGdsb2JhbGQiICJeJCIgXAorCSAgICAiY29sbGVjdCBnbG9iYWxzdHJ1Y3QsIGdsb2JhbHAsIGdsb2JhbGFyciIgIl4kIgorCisgICAgIyBCZWdpbiB0aGUgdGVzdC4KKyAgICBydW5fdHJhY2VfZXhwZXJpbWVudCAiZ2xvYmFscyIgZ2xvYmFsc190ZXN0X2Z1bmMKKworICAgIGdkYl90ZXN0ICJwcmludCBnbG9iYWxjIiBcCisJICAgICJcXCRcWzAtOVxdKyA9IDcxICdHJyRjciIgXAorCSAgICAiY29sbGVjdCBnbG9iYWxzOiBjb2xsZWN0ZWQgZ2xvYmFsIGNoYXIiCisgICAgZ2RiX3Rlc3QgInByaW50IGdsb2JhbGkiIFwKKwkgICAgIlxcJFxbMC05XF0rID0gNzIkY3IiIFwKKwkgICAgImNvbGxlY3QgZ2xvYmFsczogY29sbGVjdGVkIGdsb2JhbCBpbnQiCisgICAgZ2RiX3Rlc3QgInByaW50IGdsb2JhbGYiIFwKKwkgICAgIlxcJFxbMC05XF0rID0gNzMuXFsyM1xdXFswLTlcXSokY3IiIFwKKwkgICAgImNvbGxlY3QgZ2xvYmFsczogY29sbGVjdGVkIGdsb2JhbCBmbG9hdCIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ2xvYmFsZCIgXAorCSAgICAiXFwkXFswLTlcXSsgPSA3NC5cWzM0XF1cWzAtOVxdKiRjciIgXAorCSAgICAiY29sbGVjdCBnbG9iYWxzOiBjb2xsZWN0ZWQgZ2xvYmFsIGRvdWJsZSIKKworICAgIGdkYl90ZXN0ICJwcmludCBnbG9iYWxzdHJ1Y3QubWVtYmVyYyIgXAorCSAgICAiXFwkXFswLTlcXSsgPSA4MSAnUSckY3IiIFwKKwkgICAgImNvbGxlY3QgZ2xvYmFsczogY29sbGVjdGVkIHN0cnVjdCBjaGFyIG1lbWJlciIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ2xvYmFsc3RydWN0Lm1lbWJlcmkiIFwKKwkgICAgIlxcJFxbMC05XF0rID0gODIkY3IiIFwKKwkgICAgImNvbGxlY3QgZ2xvYmFsczogY29sbGVjdGVkIHN0cnVjdCBtZW1iZXIgaW50IgorICAgIGdkYl90ZXN0ICJwcmludCBnbG9iYWxzdHJ1Y3QubWVtYmVyZiIgXAorCSAgICAiXFwkXFswLTlcXSsgPSA4My5cWzIzXF1cWzAtOVxdKiRjciIgXAorCSAgICAiY29sbGVjdCBnbG9iYWxzOiBjb2xsZWN0ZWQgc3RydWN0IG1lbWJlciBmbG9hdCIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ2xvYmFsc3RydWN0Lm1lbWJlcmQiIFwKKwkgICAgIlxcJFxbMC05XF0rID0gODQuXFszNFxdXFswLTlcXSokY3IiIFwKKwkgICAgImNvbGxlY3QgZ2xvYmFsczogY29sbGVjdGVkIHN0cnVjdCBtZW1iZXIgZG91YmxlIgorCisgICAgZ2RiX3Rlc3QgInByaW50IGdsb2JhbHAgPT0gJmdsb2JhbHN0cnVjdCIgXAorCSAgICAiXFwkXFswLTlcXSsgPSAxJGNyIiBcCisJICAgICJjb2xsZWN0IGdsb2JhbHM6IGNvbGxlY3RlZCBnbG9iYWwgcG9pbnRlciIKKworICAgIGdkYl90ZXN0ICJwcmludCBnbG9iYWxhcnJcWzFcXSIgXAorCSAgICAiXFwkXFswLTlcXSsgPSAxJGNyIiBcCisJICAgICJjb2xsZWN0IGdsb2JhbHM6IGNvbGxlY3RlZCBnbG9iYWwgYXJyYXkgZWxlbWVudCAjMSIKKyAgICBnZGJfdGVzdCAicHJpbnQgZ2xvYmFsYXJyXFsyXF0iIFwKKwkgICAgIlxcJFxbMC05XF0rID0gMiRjciIgXAorCSAgICAiY29sbGVjdCBnbG9iYWxzOiBjb2xsZWN0ZWQgZ2xvYmFsIGFycmF5IGVsZW1lbnQgIzIiCisgICAgZ2RiX3Rlc3QgInByaW50IGdsb2JhbGFyclxbM1xdIiBcCisJICAgICJcXCRcWzAtOVxdKyA9IDMkY3IiIFwKKwkgICAgImNvbGxlY3QgZ2xvYmFsczogY29sbGVjdGVkIGdsb2JhbCBhcnJheSBlbGVtZW50ICMzIgorCisgICAgZ2RiX3Rlc3QgInRmaW5kIG5vbmUiIFwKKwkgICAgIiMwICBlbmQgLioiIFwKKwkgICAgImNvbGxlY3QgZ2xvYmFsczogY2Vhc2UgdHJhY2UgZGVidWdnaW5nIgorfQorCitwcm9jIGdkYl90cmFjZV9jb2xsZWN0aW9uX3Rlc3QgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdDsKKworICAgIGdkYl90ZXN0ICJzZXQgd2lkdGggMCIgIiIgIiIKKyAgICBkZWxldGVfYnJlYWtwb2ludHMKKworICAgICMgV2UgZ2VuZXJvdXNseSBnaXZlIG91cnNlbHZlcyBvbmUgInBhc3MiIGlmIHdlIHN1Y2Nlc3NmdWxseSAKKyAgICAjIGRldGVjdCB0aGF0IHRoaXMgdGVzdCBjYW5ub3QgYmUgcnVuIG9uIHRoaXMgdGFyZ2V0IQorICAgIGlmIHsgIVtnZGJfdGFyZ2V0X3N1cHBvcnRzX3RyYWNlXSB9IHRoZW4geyAKKwlwYXNzICJDdXJyZW50IHRhcmdldCBkb2VzIG5vdCBzdXBwb3JzdCB0cmFjZSIKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBnZGJfdGVzdCAiYnJlYWsgYmVnaW4iICIiICIiCisgICAgZ2RiX3Rlc3QgImJyZWFrIGVuZCIgICAiIiAiIgorICAgIGdkYl9jb2xsZWN0X2FyZ3NfdGVzdCAiXCRhcmdzIiBcCisJICAgICJhcmdzIGNvbGxlY3RpdmVseSIKKyAgICBnZGJfY29sbGVjdF9hcmdzX3Rlc3QgImFyZ2MsIGFyZ2ksIGFyZ2YsIGFyZ2QsIGFyZ3N0cnVjdCwgYXJnYXJyYXkiIFwKKwkgICAgImFyZ3MgaW5kaXZpZHVhbGx5IgorICAgIGdkYl9jb2xsZWN0X2FyZ3N0cnVjdF90ZXN0ICJcJGFyZ3MiIFwKKwkgICAgImFyZ3N0cnVjdCBjb2xsZWN0aXZlbHkiCisgICAgZ2RiX2NvbGxlY3RfYXJnc3RydWN0X3Rlc3QgImFyZ3N0cnVjdCIgXAorCSAgICAiYXJnc3RydWN0IGluZGl2aWR1YWxseSIKKyAgICBnZGJfY29sbGVjdF9hcmdhcnJheV90ZXN0ICJcJGFyZ3MiIFwKKwkgICAgImFyZ2FycmF5IGNvbGxlY3RpdmVseSIKKyAgICBnZGJfY29sbGVjdF9hcmdhcnJheV90ZXN0ICJhcmdhcnJheSIgXAorCSAgICAiYXJnYXJyYXkgaW5kaXZpZHVhbGx5IgorICAgIGdkYl9jb2xsZWN0X2xvY2Fsc190ZXN0IGxvY2FsX3Rlc3RfZnVuYyAiXCRsb2NhbHMiIFwKKwkgICAgImF1dG8gbG9jYWxzIGNvbGxlY3RpdmVseSIKKyAgICBnZGJfY29sbGVjdF9sb2NhbHNfdGVzdCBsb2NhbF90ZXN0X2Z1bmMgXAorCSAgICAibG9jYywgbG9jaSwgbG9jZiwgbG9jZCwgbG9jc3QsIGxvY2FyIiBcCisJICAgICJhdXRvIGxvY2FscyBpbmRpdmlkdWFsbHkiCisgICAgZ2RiX2NvbGxlY3RfbG9jYWxzX3Rlc3QgcmVnbG9jYWxfdGVzdF9mdW5jICJcJGxvY2FscyIgXAorCSAgICAicmVnaXN0ZXIgbG9jYWxzIGNvbGxlY3RpdmVseSIKKyAgICBnZGJfY29sbGVjdF9sb2NhbHNfdGVzdCByZWdsb2NhbF90ZXN0X2Z1bmMgXAorCSAgICAibG9jYywgbG9jaSwgbG9jZiwgbG9jZCwgbG9jc3QsIGxvY2FyIiBcCisJICAgICJyZWdpc3RlciBsb2NhbHMgaW5kaXZpZHVhbGx5IgorICAgIGdkYl9jb2xsZWN0X2xvY2Fsc190ZXN0IHN0YXRsb2NhbF90ZXN0X2Z1bmMgIlwkbG9jYWxzIiBcCisJICAgICJzdGF0aWMgbG9jYWxzIGNvbGxlY3RpdmVseSIKKyAgICBnZGJfY29sbGVjdF9sb2NhbHNfdGVzdCBzdGF0bG9jYWxfdGVzdF9mdW5jIFwKKwkgICAgImxvY2MsIGxvY2ksIGxvY2YsIGxvY2QsIGxvY3N0LCBsb2NhciIgXAorCSAgICAic3RhdGljIGxvY2FscyBpbmRpdmlkdWFsbHkiCisgICAgCisgICAgZ2RiX2NvbGxlY3RfcmVnaXN0ZXJzX3Rlc3QgIlwkcmVncyIKKyAgICBnZGJfY29sbGVjdF9yZWdpc3RlcnNfdGVzdCAiXCRmcCwgXCRzcCwgXCRwYyIKKyAgICBnZGJfY29sbGVjdF9nbG9iYWxzX3Rlc3QKKyAgICAKKyAgICAjCisgICAgIyBFeHByZXNzaW9uIHRlc3RzOgorICAgICMKKyAgICAjICp4CSgqKngsIC4uLikKKyAgICAjIHgueQkoeC55LnosIC4uLikKKyAgICAjIHgtPnkJKHgtPnktPnosIC4uLikKKyAgICAjIHhbMl0JKHhbMl1bM10sIC4uLikgKGNvbnN0IGluZGV4KQorICAgICMgeFt5XQkoeFt5XVt6XSwgLi4uKSAoaW5kZXggdG8gYmUgY2hhciwgc2hvcnQsIGxvbmcsIGZsb2F0LCBkb3VibGUpCisgICAgIyAgTk9URToKKyAgICAjICBXZSB0ZXN0IHRoZSBmb2xsb3dpbmcgb3BlcmF0b3JzIGJ5IHVzaW5nIHRoZW0gaW4gYW4gYXJyYXkgaW5kZXgKKyAgICAjICBleHByZXNzaW9uIC0tIGJlY2F1c2UgdGhlIG5ha2VkIHJlc3VsdCBvZiBhbiBvcGVyYXRvciBpcyBub3QgcmVhbGx5CisgICAgIyAgY29sbGVjdGVkLiAgVG8gYmUgc3VyZSB0aGUgb3BlcmF0b3Igd2FzIGV2YWx1YXRlZCBjb3JyZWN0bHkgb24gdGhlCisgICAgIyAgdGFyZ2V0LCB3ZSBoYXZlIHRvIGFjdHVhbGx5IHVzZSB0aGUgcmVzdWx0IGVnLiBpbiBhbiBhcnJheSBvZmZzZXQKKyAgICAjICBjYWxjdWxhdGlvbi4KKyAgICAjIHhbeSArICB6XSAodGVzdHMgYWRkaXRpb246IHkgYW5kIHogdmFyaW91cyBjb21ib3Mgb2YgdHlwZXMsIHNjbGFzc2VzKQorICAgICMgeFt5IC0gIHpdICh0ZXN0cyBzdWJ0cmFjdGlvbikgKGRpdHRvKQorICAgICMgeFt5ICogIHpdICh0ZXN0cyBtdWx0aXBsaWNhdGlvbikgKGRpdHRvKQorICAgICMgeFt5IC8gIHpdICh0ZXN0cyBkaXZpc2lvbikgKGRpdHRvKQorICAgICMgeFt5ICUgIHpdICh0ZXN0cyBtb2R1bG8gZGl2aXNpb24pIChkaXR0bykKKyAgICAjIHhbeSA9PSB6XSAodGVzdHMgZXF1YWxpdHkgcmVsYXRpb24pIChkaXR0bykgICAgICAgICAgICAgIFVOU1VQUE9SVEVECisgICAgIyB4W3kgIT0gel0gKHRlc3RzIGluZXF1YWxpdHkgcmVsYXRpb24pIChkaXR0bykgICAgICAgICAgICBVTlNVUFBPUlRFRAorICAgICMgeFt5ID4gIHpdICh0ZXN0cyBncmVhdGVyLXRoYW4gcmVsYXRpb24pIChkaXR0bykgICAgICAgICAgVU5TVVBQT1JURUQKKyAgICAjIHhbeSA8ICB6XSAodGVzdHMgbGVzcy10aGFuIHJlbGF0aW9uKSAoZGl0dG8pICAgICAgICAgICAgIFVOU1VQUE9SVEVECisgICAgIyB4W3kgPj0gel0gKHRlc3RzIGdyZWF0ZXItdGhhbi1vci1lcXVhbCByZWxhdGlvbikgKGRpdHRvKSBVTlNVUFBPUlRFRAorICAgICMgeFt5IDw9IHpdICh0ZXN0cyBsZXNzLXRoYW4tb3ItZXF1YWwgcmVsYXRpb24pIChkaXR0bykgICAgVU5TVVBQT1JURUQKKyAgICAjIHhbeSAmJiB6XSAodGVzdHMgbG9naWNhbCBhbmQpIChkaXR0bykgICAgICAgICAgICAgICAgICAgIFVOU1VQUE9SVEVECisgICAgIyB4W3kgfHwgel0gKHRlc3RzIGxvZ2ljYWwgb3IpIChkaXR0bykgICAgICAgICAgICAgICAgICAgICBVTlNVUFBPUlRFRAorICAgICMgeFt5ICYgIHpdICh0ZXN0cyBiaW5hcnkgYW5kKSAoZGl0dG8pICAgICAgICAgICAgICAgICAgICAgVU5TVVBQT1JURUQKKyAgICAjIHhbeSB8ICB6XSAodGVzdHMgYmluYXJ5IG9yKSAoZGl0dG8pICAgICAgICAgICAgICAgICAgICAgIFVOU1VQUE9SVEVECisgICAgIyB4W3kgXiAgel0gKHRlc3RzIGJpbmFyeSB4b3IpIChkaXR0bykgICAgICAgICAgICAgICAgICAgICBVTlNVUFBPUlRFRAorICAgICMgeFt5ID8gejEgOiB6Ml0gKHRlc3RzIHRlcm5hcnkgb3BlcmF0b3IpIChkaXR0bykgICAgICAgICAgVU5TVVBQT1JURUQKKyAgICAjIHhbeSA8PCB6XSAodGVzdHMgc2hpZnQtbGVmdCkgKGRpdHRvKSAgICAgICAgICAgICAgICAgICAgIFVOU1VQUE9SVEVECisgICAgIyB4W3kgPj4gel0gKHRlc3RzIHNoaWZ0LXJpZ2h0KSAoZGl0dG8pICAgICAgICAgICAgICAgICAgICBVTlNVUFBPUlRFRAorICAgICMgeFt5ID0gIHpdICh0ZXN0cyBhc3NpZ25tZW50IG9wZXJhdG9yKSAoZGl0dG8pICAgICAgICAgICAgVU5TVVBQT1JURUQKKyAgICAjIHhbKyt5XSAgICAodGVzdHMgcHJlLWluY3JlbWVudCBvcGVyYXRvcikgKGRpdHRvKSAgICAgICAgIFVOU1VQUE9SVEVECisgICAgIyB4Wy0teV0gICAgKHRlc3RzIHByZS1kZWNyZW1lbnQgb3BlcmF0b3IpIChkaXR0bykgICAgICAgICBVTlNVUFBPUlRFRAorICAgICMgeFt5KytdICAgICh0ZXN0cyBwb3N0LWluY3JlbWVudCBvcGVyYXRvcikgKGRpdHRvKSAgICAgICAgVU5TVVBQT1JURUQKKyAgICAjIHhbeS0tXSAgICAodGVzdHMgcG9zdC1kZWNyZW1lbnQgb3BlcmF0b3IpIChkaXR0bykgICAgICAgIFVOU1VQUE9SVEVECisgICAgIyB4Wyt5XSAgICAgKHRlc3RzIHVuYXJ5IHBsdXMpIChkaXR0bykKKyAgICAjIHhbLXldICAgICAodGVzdHMgdW5hcnkgbWludXMpIChkaXR0bykKKyAgICAjIHhbIXldICAgICAodGVzdHMgbG9naWNhbCBub3QpIChkaXR0bykgICAgICAgICAgICAgICAgICAgIFVOU1VQUE9SVEVECisgICAgIyB4W355XSAgICAgKHRlc3RzIGJpbmFyeSBub3QpIChkaXR0bykgICAgICAgICAgICAgICAgICAgICBVTlNVUFBPUlRFRAorICAgICMgeFsoeSwgeildICh0ZXN0cyBjb21tYSBleHByZXNzaW9uKSAoZGl0dG8pCisgICAgIyBjYXN0IGV4cHIKKyAgICAjIHN0YWNrIGRhdGEKKyAgICAKKyAgICBnZGJfY29sbGVjdF9leHByZXNzaW9uX3Rlc3QgZ2xvYmFsc190ZXN0X2Z1bmMgXAorCSAgICAiZ2xvYmFsc3RydWN0Lm1lbWJlcmkiICAiODIiICAgICAiYS5iIgorICAgIGdkYl9jb2xsZWN0X2V4cHJlc3Npb25fdGVzdCBnbG9iYWxzX3Rlc3RfZnVuYyBcCisJICAgICJnbG9iYWxwLT5tZW1iZXJjIiAgICAgICI4MSAnUSciICJhLT5iIgorICAgIGdkYl9jb2xsZWN0X2V4cHJlc3Npb25fdGVzdCBnbG9iYWxzX3Rlc3RfZnVuYyBcCisJICAgICJnbG9iYWxhcnJcWzJcXSIgICAgICAgICIyIiAgICAgICJhXFsyXF0iCisgICAgZ2RiX2NvbGxlY3RfZXhwcmVzc2lvbl90ZXN0IGdsb2JhbHNfdGVzdF9mdW5jIFwKKwkgICAgImdsb2JhbGFyclxbbDNcXSIgICAgICAgIjMiICAgICAgImFcW2JcXSIKKyAgICBnZGJfY29sbGVjdF9leHByZXNzaW9uX3Rlc3QgZ2xvYmFsc190ZXN0X2Z1bmMgXAorCSAgICAiZ2xvYmFsYXJyXFtsMyArIGwyXF0iICAiNSIgICAgICAiYVxbYiArIGNcXSIKKyAgICBnZGJfY29sbGVjdF9leHByZXNzaW9uX3Rlc3QgZ2xvYmFsc190ZXN0X2Z1bmMgXAorCSAgICAiZ2xvYmFsYXJyXFtsMyAtIGwyXF0iICAiMSIgICAgICAiYVxbYiAtIGNcXSIKKyAgICBnZGJfY29sbGVjdF9leHByZXNzaW9uX3Rlc3QgZ2xvYmFsc190ZXN0X2Z1bmMgXAorCSAgICAiZ2xvYmFsYXJyXFtsMyAqIGwyXF0iICAiNiIgICAgICAiYVxbYiAqIGNcXSIKKyAgICBnZGJfY29sbGVjdF9leHByZXNzaW9uX3Rlc3QgZ2xvYmFsc190ZXN0X2Z1bmMgXAorCSAgICAiZ2xvYmFsYXJyXFtsNiAvIGwzXF0iICAiMiIgICAgICAiYVxbYiAvIGNcXSIKKyAgICBnZGJfY29sbGVjdF9leHByZXNzaW9uX3Rlc3QgZ2xvYmFsc190ZXN0X2Z1bmMgXAorCSAgICAiZ2xvYmFsYXJyXFtsNyAlIGwzXF0iICAiMSIgICAgICAiYVxbYiAlIGNcXSIKKyAgICBnZGJfY29sbGVjdF9leHByZXNzaW9uX3Rlc3QgZ2xvYmFsc190ZXN0X2Z1bmMgXAorCSAgICAiZ2xvYmFsYXJyXFsrbDFcXSIgICAgICAiMSIgICAgICAiYVxbK2JcXSIKKyAgICBnZGJfY29sbGVjdF9leHByZXNzaW9uX3Rlc3QgZ2xvYmFsc190ZXN0X2Z1bmMgXAorCSAgICAiZ2xvYmFsYXJyXFstbG1pbnVzXF0iICAiMiIgICAgICAiYVxbLWJcXSIKKyAgICBnZGJfY29sbGVjdF9leHByZXNzaW9uX3Rlc3QgZ2xvYmFsc190ZXN0X2Z1bmMgXAorCSAgICAiZ2xvYmFsYXJyXFtcKGw2LCBsN1wpXF0iICI3IiAgICAiYVxbXChiLCBjXClcXSIKKworfQorCisjIFN0YXJ0IHdpdGggYSBmcmVzaCBnZGIuCisgCitnZGJfZXhpdAorZ2RiX3N0YXJ0CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKK2dkYl9sb2FkICRiaW5maWxlCisgCitpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYl9zdHViXSB7CisgICAgZ2RiX3N0ZXBfZm9yX3N0dWI7Cit9CisgCisjIEJvZHkgb2YgdGVzdCBlbmNhc2VkIGluIGEgcHJvYyBzbyB3ZSBjYW4gcmV0dXJuIHByZW1hdHVyZWx5LgorZ2RiX3RyYWNlX2NvbGxlY3Rpb25fdGVzdAorCisjIEZpbmlzaGVkIQorZ2RiX3Rlc3QgInRmaW5kIG5vbmUiICIiICIiCisKKworCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9jb25maWd1cmUgYi9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDE3NjIwNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDg5OSBAQAorIyEgL2Jpbi9zaAorCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorYWNfbWF4X2hlcmVfbGluZXM9MTIKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPWNvbGxlY3Rpb24uYworCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCitDQz0ke0NDLWNjfQorCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCithY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKK2FjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisKKyMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgorIyBUaGUgaW5wdXRzIGFyZToKKyMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAorIworIyBUaGUgcnVsZXMgYXJlOgorIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKKyMgICAgc2FtZSB0aW1lLgorIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KKyMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAorIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KKyMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KKyMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCisKKyMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KKyMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KK2Nhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgorTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OworKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCisKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgoraWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU3MzogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisKK2hvc3RfYWxpYXM9JGhvc3QKK2Nhc2UgIiRob3N0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpCisgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpIDs7CisgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2hvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAoraG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1OTQ6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1CisKK3RhcmdldF9hbGlhcz0kdGFyZ2V0CitjYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK3RhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKK3RhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCit0YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAordGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjYxMjogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorCitidWlsZF9hbGlhcz0kYnVpbGQKK2Nhc2UgIiRidWlsZF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKK2J1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitidWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgorCit0ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCisgIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKKyAgICBOT05FTk9ORXMseCx4LCAmJgorICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCisKKwordHJhcCAnJyAxIDIgMTUKK2NhdCA+IGNvbmZjYWNoZSA8PFxFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgorIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAorIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCisjIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgorIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCisjIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgorIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCisjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworRU9GCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKyhzZXQpIDI+JjEgfAorICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjFgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIERFRlMuCisjIFByb3RlY3QgYWdhaW5zdCBzaGVsbCBleHBhbnNpb24gd2hpbGUgZXhlY3V0aW5nIE1ha2VmaWxlIHJ1bGVzLgorIyBQcm90ZWN0IGFnYWluc3QgTWFrZWZpbGUgbWFjcm8gZXhwYW5zaW9uLgorY2F0ID4gY29uZnRlc3QuZGVmcyA8PFxFT0YKK3MlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJS1EXDE9XDIlZworcyVbIAlgfiMkXiYqKCl7fVxcfDsnIjw+P10lXFwmJWcKK3MlXFslXFwmJWcKK3MlXF0lXFwmJWcKK3MlXCQlJCQlZworRU9GCitERUZTPWBzZWQgLWYgY29uZnRlc3QuZGVmcyBjb25mZGVmcy5oIHwgdHIgJ1wwMTInICcgJ2AKK3JtIC1mIGNvbmZ0ZXN0LmRlZnMKKworCisjIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKworZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUworcm0gLWYgJENPTkZJR19TVEFUVVMKK2NhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisjISAvYmluL3NoCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAorIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMKKyMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCisjCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKK2ZvciBhY19vcHRpb24KK2RvCisgIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCisgICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQorICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSIKKyAgICBleGl0IDAgOzsKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCisgICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7CisgIGVzYWMKK2RvbmUKKworYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KK3NlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Cisgcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKKyRhY192cHN1YgorJGV4dHJhc3ViCitzJUBTSEVMTEAlJFNIRUxMJWcKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBDQ0AlJENDJWcKK3MlQGhvc3RAJSRob3N0JWcKK3MlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKK3MlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCitzJUBob3N0X29zQCUkaG9zdF9vcyVnCitzJUB0YXJnZXRAJSR0YXJnZXQlZworcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKK3MlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKK3MlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKK3MlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCitzJUBidWlsZEAlJGJ1aWxkJWcKK3MlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZworcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKK3MlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCitzJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9jb25maWd1cmUuaW4gYi9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQwZWFlMgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDE1IEBACitkbmwgUHJvY2VzcyB0aGlzIGZpbGUgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorZG5sIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCBmcmFnbWVudCB0aGF0IHN1cHBsaWVzIHRoZSBpbmZvcm1hdGlvbgorZG5sIG5lY2Vzc2FyeSB0byB0YWlsb3IgYSB0ZW1wbGF0ZSBjb25maWd1cmUgc2NyaXB0IGludG8gdGhlIGNvbmZpZ3VyZQorZG5sIHNjcmlwdCBhcHByb3ByaWF0ZSBmb3IgdGhpcyBkaXJlY3RvcnkuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sKK2RubCBhbnkgZXhpc3RpbmcgY29uZmlndXJlIHNjcmlwdC4KKworQUNfUFJFUkVRKDIuNSkKK0FDX0lOSVQoY29sbGVjdGlvbi5jKQorCitDQz0ke0NDLWNjfQorQUNfU1VCU1QoQ0MpCitBQ19DT05GSUdfQVVYX0RJUihgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uKQorQUNfQ0FOT05JQ0FMX1NZU1RFTQorCitBQ19PVVRQVVQoTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9kZWx0cmFjZS5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9kZWx0cmFjZS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMxOThhZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL2RlbHRyYWNlLmV4cApAQCAtMCwwICsxLDI2OSBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IE1pY2hhZWwgU255ZGVyIChtc255ZGVyQGN5Z251cy5jb20pCisKK2xvYWRfbGliICJ0cmFjZS1zdXBwb3J0LmV4cCI7CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorCitpZiBbaXN0YXJnZXQgIm02OGstKi1lbGYiXSB0aGVuIHsKKyAgICBzZXQgc3JjZmlsZSBnZGJfY190ZXN0LmMKKyAgICBzZXQgYmluZmlsZSBbYm9hcmRfaW5mbyB0YXJnZXQgZDQ5MF9iaW5maWxlXTsKK30gZWxzZSB7CisgICAgc2V0IHRlc3RmaWxlICJhY3Rpb25zIgorICAgIHNldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKKyAgICBzZXQgYmluZmlsZSAkb2JqZGlyLyRzdWJkaXIvJHRlc3RmaWxlCisgICAgaWYgeyBbZ2RiX2NvbXBpbGUgIiRzcmNkaXIvJHN1YmRpci8kc3JjZmlsZSIgJGJpbmZpbGUgXAorCSAgICBleGVjdXRhYmxlIHtkZWJ1ZyBhZGRpdGlvbmFsX2ZsYWdzPS13fV0gIT0gIiIgfSB7CisJZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCisgICAgfQorfQorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisKKyMgSWYgdGVzdGluZyBvbiBhIHJlbW90ZSBob3N0LCBkb3dubG9hZCB0aGUgc291cmNlIGZpbGUuCisjIHJlbW90ZV9kb3dubG9hZCBob3N0ICRzcmNkaXIvJHN1YmRpci8kc3JjZmlsZQorCitnZGJfZmlsZV9jbWQgJGJpbmZpbGUKKworIyBkZWZpbmUgcmVsYXRpdmUgc291cmNlIGxpbmUgbnVtYmVyczoKKyMgYWxsIHN1YnNlcXVlbnQgbGluZSBudW1iZXJzIGFyZSByZWxhdGl2ZSB0byB0aGlzIGZpcnN0IG9uZSAoYmFzZWxpbmUpCitzZXQgYmFzZWxpbmUgW2dkYl9maW5kX3JlY3Vyc2lvbl90ZXN0X2Jhc2VsaW5lICRzcmNmaWxlXTsKK2lmIHsgJGJhc2VsaW5lID09IC0xIH0gdGhlbiB7CisgICAgZmFpbCAiQ291bGQgbm90IGZpbmQgZ2RiX3JlY3Vyc2lvbl90ZXN0IGZ1bmN0aW9uIgorICAgIHJldHVybjsKK30KK3NldCB0ZXN0bGluZTEgW2V4cHIgJGJhc2VsaW5lICsgNF0KKworIworIyB0ZXN0ICJkZWxldGUgdHJhY2Vwb2ludHMiIGNvbW1hbmQKKyMKKworIyAzLjEgZGVsZXRlIHRyYWNlcG9pbnRzIChhbGwpCitnZGJfZGVsZXRlX3RyYWNlcG9pbnRzCitnZGJfdGVzdCAidHJhY2UgZ2RiX2NfdGVzdCIgICAiVHJhY2Vwb2ludCBcWzAtOVxdKyBhdCAuKiIgInNldCB0cmFjZXBvaW50IDEiCitnZGJfdGVzdCAidHJhY2UgZ2RiX2FzbV90ZXN0IiAiVHJhY2Vwb2ludCBcWzAtOVxdKyBhdCAuKiIgInNldCB0cmFjZXBvaW50IDIiCitnZGJfdGVzdCAidHJhY2UgJHRlc3RsaW5lMSIgICAiVHJhY2Vwb2ludCBcWzAtOVxdKyBhdCAuKiIgInNldCB0cmFjZXBvaW50IDMiCisKK2dkYl90ZXN0ICJpbmZvIHRyYWNlcG9pbnRzIiBcCisgICAgIk51bSBFbmIgQWRkcmVzcyAgICBQYXNzQyBTdGVwQyBXaGF0LipcWzAtOVxdK1xbXHQgXF0reVxbXHQgXF0rMHhcWzAtOWEtZkEtRlxdKy4qaW4gZ2RiX2NfdGVzdC4qXFswLTlcXStcW1x0IFxdK3lcW1x0IFxdKzB4XFswLTlhLWZBLUZcXSsuKmdkYl9hc21fdGVzdC4qXFswLTlcXStcW1x0IFxdK3lcW1x0IFxdKzB4XFswLTlhLWZBLUZcXSsuKmluIGdkYl9yZWN1cnNpb25fdGVzdC4qIiBcCisJCQkiMy4xYTogc2V0IHRocmVlIHRyYWNlcG9pbnRzIgorCitzZW5kX2dkYiAiZGVsZXRlIHRyYWNlcG9pbnRzXG4iCitnZGJfZXhwZWN0IDMwIHsKKyAgICAtcmUgIkRlbGV0ZSBhbGwgdHJhY2Vwb2ludHMuKnkgb3Igbi4qJCIgeworCXNlbmRfZ2RiICJ5XG4iCisJZ2RiX2V4cGVjdCAzMCB7CisJICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeworCQlwYXNzICIzLjFiOiBkZWxldGUgYWxsIHRyYWNlcG9pbnRzIgorCSAgICB9CisJICAgIHRpbWVvdXQgeyBmYWlsICIzLjFiOiBkZWxldGUgYWxsIHRyYWNlcG9pbnRzICh0aW1lb3V0KSIgfQorCX0KKyAgICB9CisgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7ICMgVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlcmUgYXJlIG5vIHRyYWNlcG9pbnRzCisJZmFpbCAiMy4xYjogZGVsZXRlIGFsbCB0cmFjZXBvaW50cyAobm8gdHJhY2Vwb2ludHM/KSIKKyAgICB9CisgICAgdGltZW91dCB7IGZhaWwgIjMuMWI6IGRlbGV0ZSBhbGwgdHJhY2Vwb2ludHMgKHRpbWVvdXQpIiB9Cit9CisKKyMgMy4yIGRlbGV0ZSB0cmFjZXBvaW50IDxuPgorZ2RiX2RlbGV0ZV90cmFjZXBvaW50cworc2V0IHRyY3B0MSBbZ2RiX2dldHRwbnVtIGdkYl9jX3Rlc3RdOworc2V0IHRyY3B0MiBbZ2RiX2dldHRwbnVtIGdkYl9hc21fdGVzdF07CitzZXQgdHJjcHQzIFtnZGJfZ2V0dHBudW0gJHRlc3RsaW5lMV07CitpZiB7ICR0cmNwdDEgPD0gMCB8fCAkdHJjcHQyIDw9IDAgfHwgJHRyY3B0MyA8PSAwIH0gdGhlbiB7CisgICAgZmFpbCAic2V0dGluZyB0cmFjZXBvaW50cyIKKyAgICByZXR1cm47Cit9CisKK2dkYl90ZXN0ICJpbmZvIHRyYWNlcG9pbnRzIiBcCisgICAgIk51bSBFbmIgQWRkcmVzcyAgICBQYXNzQyBTdGVwQyBXaGF0LiokdHJjcHQxXFtcdCBcXSt5XFtcdCBcXSsweFxbMC05YS1mQS1GXF0rLippbi4qZ2RiX2NfdGVzdC4qJHRyY3B0MlxbXHQgXF0reVxbXHQgXF0rMHhcWzAtOWEtZkEtRlxdKy4qZ2RiX2FzbV90ZXN0LiokdHJjcHQzXFtcdCBcXSt5XFtcdCBcXSsweFxbMC05YS1mQS1GXF0rLippbi4qZ2RiX3JlY3Vyc2lvbl90ZXN0LioiIFwKKwkJCSIzLjJhOiBzZXQgdGhyZWUgdHJhY2Vwb2ludHMiCisKKyNnZGJfdGVzdCAiZGVsZXRlIHRyYWNlcG9pbnQgJHRyY3B0MSIgIiIgIiIKK3NlbmRfZ2RiICJkZWxldGUgdHJhY2Vwb2ludCAkdHJjcHQxXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIk5vIHRyYWNlcG9pbnQgbnVtYmVyLiokZ2RiX3Byb21wdCAkIiB7CisJZmFpbCAiMy4yYjogZGVsZXRlIGZpcnN0IHRyYWNlcG9pbnQiCisgICAgfQorICAgIC1yZSAiLipcW0VlXF1ycm9yLiokZ2RiX3Byb21wdCAkIiB7CisJZmFpbCAiMy4yYjogZGVsZXRlIGZpcnN0IHRyYWNlcG9pbnQiCisgICAgfQorICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeworCXBhc3MgIjMuMmI6IGRlbGV0ZSBmaXJzdCB0cmFjZXBvaW50IgorICAgIH0KKyAgICB0aW1lb3V0IHsKKwlmYWlsICIzLjJiOiBkZWxldGUgZmlyc3QgdHJhY2Vwb2ludCAodGltZW91dCkiCisgICAgfQorfQorCitzZW5kX2dkYiAiaW5mbyB0cmFjZXBvaW50c1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIkdHJjcHQxXFtcdCBcXSt5XFtcdCBcXSsweC4qaW4uKmdkYl9jX3Rlc3QuKiRnZGJfcHJvbXB0ICQiIHsKKwlmYWlsICIzLjJjOiB2ZXJpZnkgZGVsZXRlIGZpcnN0IHRyYWNlcG9pbnQgKGFyZ2gpIgorICAgIH0KKyAgICAtcmUgIiR0cmNwdDJcW1x0IFxdK3kuKmdkYl9hc21fdGVzdC4qXFtcclxuXHQgXSskdHJjcHQzXFtcdCBcXSt5LiogaW4gZ2RiX3JlY3Vyc2lvbl90ZXN0IGF0IC4qJGdkYl9wcm9tcHQgJCIgeworCXBhc3MgIjMuMmM6IHZlcmlmeSBkZWxldGUgZmlyc3QgdHJhY2Vwb2ludCIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwlmYWlsICIzLjJjOiB2ZXJpZnkgZGVsZXRlIGZpcnN0IHRyYWNlcG9pbnQgKG11bWJsZSkiIAorICAgIH0KKyAgICB0aW1lb3V0IHsKKwlmYWlsICIzLjJjOiB2ZXJpZnkgZGVsZXRlIGZpcnN0IHRyYWNlcG9pbnQgKHRpbWVvdXQpIgorICAgIH0KK30KKworI2dkYl90ZXN0ICJkZWxldGUgdHJhY2Vwb2ludCAkdHJjcHQyIiAiIiAiIgorc2VuZF9nZGIgImRlbGV0ZSB0cmFjZXBvaW50ICR0cmNwdDJcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiTm8gdHJhY2Vwb2ludCBudW1iZXIuKiRnZGJfcHJvbXB0ICQiIHsKKwlmYWlsICIzLjJkOiBkZWxldGUgc2Vjb25kIHRyYWNlcG9pbnQiCisgICAgfQorICAgIC1yZSAiLipcW0VlXF1ycm9yLiokZ2RiX3Byb21wdCAkIiB7CisJZmFpbCAiMy4yZDogZGVsZXRlIHNlY29uZCB0cmFjZXBvaW50IgorICAgIH0KKyAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsKKwlwYXNzICIzLjJkOiBkZWxldGUgc2Vjb25kIHRyYWNlcG9pbnQiCisgICAgfQorICAgIHRpbWVvdXQgeworCWZhaWwgIjMuMmQ6IGRlbGV0ZSBzZWNvbmQgdHJhY2Vwb2ludCAodGltZW91dCkiCisgICAgfQorfQorCitzZW5kX2dkYiAiaW5mbyB0cmFjZXBvaW50c1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIkdHJjcHQxXFtcdCBcXSt5XFtcdCBcXSsweC4qaW4uKmdkYl9jX3Rlc3QuKiRnZGJfcHJvbXB0ICQiIHsKKwlmYWlsICIzLjJlOiB2ZXJpZnkgZGVsZXRlIHNlY29uZCB0cmFjZXBvaW50IgorICAgIH0KKyAgICAtcmUgIiR0cmNwdDJcW1x0IFxdK3lcW1x0IFxdKzB4LippbiBnZGJfYXNtX3Rlc3QuKiRnZGJfcHJvbXB0ICQiIHsKKwlmYWlsICIzLjJlOiB2ZXJpZnkgZGVsZXRlIHNlY29uZCB0cmFjZXBvaW50IgorICAgIH0KKyAgICAtcmUgIiR0cmNwdDNcW1x0IFxdK3lcW1x0IFxdKzB4LippbiBnZGJfcmVjdXJzaW9uX3Rlc3QuKiRnZGJfcHJvbXB0ICQiIHsKKwlwYXNzICIzLjJlOiB2ZXJpZnkgZGVsZXRlIHNlY29uZCB0cmFjZXBvaW50IgorICAgIH0KKyAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsKKwlmYWlsICIzLjJlOiB2ZXJpZnkgZGVsZXRlIHNlY29uZCB0cmFjZXBvaW50IiAKKyAgICB9CisgICAgdGltZW91dCB7CisJZmFpbCAiMy4yZTogdmVyaWZ5IGRlbGV0ZSBzZWNvbmQgdHJhY2Vwb2ludCAodGltZW91dCkiCisgICAgfQorfQorCisjZ2RiX3Rlc3QgImRlbGV0ZSB0cmFjZXBvaW50ICR0cmNwdDMiICIiICIiCitzZW5kX2dkYiAiZGVsZXRlIHRyYWNlcG9pbnQgJHRyY3B0M1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJObyB0cmFjZXBvaW50IG51bWJlci4qJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgIjMuMmY6IGRlbGV0ZSB0aGlyZCB0cmFjZXBvaW50IgorICAgIH0KKyAgICAtcmUgIi4qXFtFZVxdcnJvci4qJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgIjMuMmY6IGRlbGV0ZSB0aGlyZCB0cmFjZXBvaW50IgorICAgIH0KKyAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsKKwlwYXNzICIzLjJmOiBkZWxldGUgdGhpcmQgdHJhY2Vwb2ludCIKKyAgICB9CisgICAgdGltZW91dCB7CisJZmFpbCAiMy4yZjogZGVsZXRlIHRoaXJkIHRyYWNlcG9pbnQgKHRpbWVvdXQpIgorICAgIH0KK30KKworIyBzZW5kX2dkYiAiQVJGISBcXG5cbiIKK3NlbmRfZ2RiICJpbmZvIHRyYWNlcG9pbnRzXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIiR0cmNwdDNcW1x0IFxdK3lcW1x0IFxdKzB4LippbiBnZGJfcmVjdXJzaW9uX3Rlc3QuKiRnZGJfcHJvbXB0ICQiIHsKKwlmYWlsICIzLjJnOiB2ZXJpZnkgZGVsZXRlIHRoaXJkIHRyYWNlcG9pbnQiCisgICAgfQorICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeworCXBhc3MgIjMuMmc6IHZlcmlmeSBkZWxldGUgdGhpcmQgdHJhY2Vwb2ludCIKKyAgICB9CisgICAgdGltZW91dCB7CisJZmFpbCAiMy4yZzogdmVyaWZ5IGRlbGV0ZSB0aGlyZCB0cmFjZXBvaW50ICh0aW1lb3V0KSIgCisgICAgfQorfQorCisjIDMuMyBkZWxldGUgdGhyZWUgdHJhY2Vwb2ludHMgYXQgb25jZQorZ2RiX2RlbGV0ZV90cmFjZXBvaW50cworc2V0IHRyY3B0MSBbZ2RiX2dldHRwbnVtIGdkYl9jX3Rlc3RdOworc2V0IHRyY3B0MiBbZ2RiX2dldHRwbnVtIGdkYl9hc21fdGVzdF07CitzZXQgdHJjcHQzIFtnZGJfZ2V0dHBudW0gJHRlc3RsaW5lMV07CitpZiB7ICR0cmNwdDEgPD0gMCB8fCAkdHJjcHQyIDw9IDAgfHwgJHRyY3B0MyA8PSAwIH0gdGhlbiB7CisgICAgZmFpbCAic2V0dGluZyB0cmFjZXBvaW50cyIKKyAgICByZXR1cm47Cit9CisKK2dkYl90ZXN0ICJpbmZvIHRyYWNlcG9pbnRzIiBcCisgICAgIk51bSBFbmIgQWRkcmVzcyAgICBQYXNzQyBTdGVwQyBXaGF0LiokdHJjcHQxXFtcdCBcXSt5XFtcdCBcXSsweFxbMC05YS1mQS1GXF0rLippbiBnZGJfY190ZXN0LiokdHJjcHQyXFtcdCBcXSt5XFtcdCBcXSsweFxbMC05YS1mQS1GXF0rLipnZGJfYXNtX3Rlc3QuKiR0cmNwdDNcW1x0IFxdK3lcW1x0IFxdKzB4XFswLTlhLWZBLUZcXSsuKmluIGdkYl9yZWN1cnNpb25fdGVzdC4qIiBcCisJCQkiMy4zYTogc2V0IHRocmVlIHRyYWNlcG9pbnRzIgorCisjZ2RiX3Rlc3QgImRlbGV0ZSB0cmFjZXBvaW50ICR0cmNwdDEgJHRyY3B0MiAkdHJjcHQzIiAiIiAiIgorc2VuZF9nZGIgImRlbGV0ZSB0cmFjZXBvaW50ICR0cmNwdDEgJHRyY3B0MiAkdHJjcHQzXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIk5vIHRyYWNlcG9pbnQgbnVtYmVyLiokZ2RiX3Byb21wdCAkIiB7CisJZmFpbCAiMy4zYjogZGVsZXRlIHRocmVlIHRyYWNlcG9pbnRzIgorICAgIH0KKyAgICAtcmUgIi4qXFtFZVxdcnJvci4qJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgIjMuM2I6IGRlbGV0ZSB0aHJlZSB0cmFjZXBvaW50cyIKKyAgICB9CisgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7CisJcGFzcyAiMy4zYjogZGVsZXRlIHRocmVlIHRyYWNlcG9pbnRzIgorICAgIH0KKyAgICB0aW1lb3V0IHsKKwlmYWlsICIzLjNiOiBkZWxldGUgdGhyZWUgdHJhY2Vwb2ludCAodGltZW91dCkiCisgICAgfQorfQorCitzZW5kX2dkYiAiaW5mbyB0cmFjZXBvaW50c1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICIkdHJjcHQxXFtcdCBcXSt5XFtcdCBcXSsweC4qaW4gZ2RiX2NfdGVzdC4qJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgIjMuM2M6IHZlcmlmeSBkZWxldGUgdGhyZWUgdHJhY2Vwb2ludHMgKGZpcnN0IG9uZSBwZXJzaXN0cykiCisgICAgfQorICAgIC1yZSAiJHRyY3B0MlxbXHQgXF0reVxbXHQgXF0rMHguKmluIGdkYl9hc21fdGVzdC4qJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgIjMuM2M6IHZlcmlmeSBkZWxldGUgdGhyZWUgdHJhY2Vwb2ludHMgKHNlY29uZCBvbmUgcGVyc2lzdHMpIgorICAgIH0KKyAgICAtcmUgIiR0cmNwdDNcW1x0IFxdK3lcW1x0IFxdKzB4LippbiBnZGJfcmVjdXJzaW9uX3Rlc3QuKiRnZGJfcHJvbXB0ICQiIHsKKwlmYWlsICIzLjNjOiB2ZXJpZnkgZGVsZXRlIHRocmVlIHRyYWNlcG9pbnRzICh0aGlyZCBvbmUgcGVyc2lzdHMpIgorICAgIH0KKyAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsKKwlwYXNzICIzLjNjOiB2ZXJpZnkgZGVsZXRlIHRocmVlIHRyYWNlcG9pbnRzIiAKKyAgICB9CisgICAgdGltZW91dCB7IAorCWZhaWwgIjMuM2M6IHZlcmlmeSBkZWxldGUgdGhyZWUgdHJhY2Vwb2ludHMgKHRpbWVvdXQpIgorICAgIH0KK30KKworIyAzLjQgZGVsZXRlIGludmFsaWQgdHJhY2Vwb2ludCBudW1iZXIKK2dkYl90ZXN0ICJkZWxldGUgdHJhY2Vwb2ludCBbZXhwciAkdHJjcHQyICsgJHRyY3B0M10iIFwKKyAgICAiTm8gdHJhY2Vwb2ludCBudW1iZXIgW2V4cHIgJHRyY3B0MiArICR0cmNwdDNdLiIgXAorCQkJIjMuNDogZGVsZXRlIGludmFsaWQgdHJhY2Vwb2ludCBudW1iZXIiCisKKyMgMy41IGRlbGV0ZSB0cmFjZXBvaW50IG51bWJlciB6ZXJvCitnZGJfdGVzdCAiZGVsZXRlIHRyYWNlcG9pbnQgMCIgIk5vIHRyYWNlcG9pbnQgbnVtYmVyIDAuIiBcCisJCQkiMy41OiBkZWxldGUgdHJhY2Vwb2ludCBudW1iZXIgemVybyIKKworIyAzLjYgaGVscCBkZWxldGUgdHJhY2Vwb2ludHMKK2dkYl90ZXN0ICJoZWxwIGRlbGV0ZSB0cmFjZXBvaW50cyIgXAorICAgICJEZWxldGUgc3BlY2lmaWVkIHRyYWNlcG9pbnRzLioiIFwKKwkJCSIzLjY6IGhlbHAgZGVsZXRlIHRyYWNlcG9pbnRzIgpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvZ2RiX2NfdGVzdC5jIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvZ2RiX2NfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NDdmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9nZGJfY190ZXN0LmMKQEAgLTAsMCArMSwzNzkyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENPUFlSSUdIVCAoQykgYnkgRU1DIENvcnBvcmF0aW9uLCAxOTk3IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAkSWQkCisgKiBERVNDUklQVElPTjogVGhpcyBtb2R1bGUgaGFzIGJlZW4gcHJvdmlkZWQgZm9yIHRoZSBwdXJwb3NlIG9mIHRlc3RpbmcgR0RCLgorICoKKyAqIE5PVEVTOgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DTFVERSAgRklMRVMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisjaWZkZWYgRE9fSVRfQllfVEhFX0JPT0sKKworCisjaW5jbHVkZSAic3ltdHlwZXNfZGVmcy5oIgorI2luY2x1ZGUgInByaW50cC5oIgorCisjaW5jbHVkZSAiYWRiZ19leHByZXNzaW9uLmgiCisjaW5jbHVkZSAiY29tbW9uX2h3X2RzLmgiCisjaW5jbHVkZSAiY29tbW9uX2h3X2RlZnMuaCIKKyNpbmNsdWRlICJldm50dHJhYy5oIgorI2luY2x1ZGUgInN5bV9zY3JhdGNoX2RzLmgiCisjaW5jbHVkZSAic3ltZ2xvYl9kcy5oIgorI2luY2x1ZGUgInN5bV9wcm90Z2xvYl9kcy5oIgorCisjaW5jbHVkZSAiZXRoZXIuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKworI2Vsc2UKKworI2luY2x1ZGUgImFkYmdfZHRjLmgiCisKKyNkZWZpbmUgWUVTICAgICAgICAgICAgIDEKKyNkZWZpbmUgTk8gICAgICAgICAgICAgIDAKKworI2RlZmluZSBUUlVFICAgICAgICAgICAgMQorI2RlZmluZSBGQUxTRSAgICAgICAgICAgMAorCisjZGVmaW5lIEVOQUJMRUQgICAgICAgICAxCisjZGVmaW5lIERJU0FCTEVEICAgICAgICAwCisKKyNkZWZpbmUgQ09OVFJPTF9DICAgICAgIDMgICAvKiBBU0NJSSAnRVRYJyAqLworCisKKy8qCisgKiBGYWtlZCBhZnRlciBjdHlwZS5oCisgKi8KKworI2RlZmluZSBpc3hkaWdpdChYKSAoKChYKSA+PSAnMCcgJiYgKFgpIDw9ICc5JykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgKChYKSA+PSAnQScgJiYgKFgpIDw9ICdGJykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgKChYKSA+PSAnYScgJiYgKFgpIDw9ICdmJykpCisvKgorICogQm9ycm93ZWQgZnJvbSBzdHJpbmcuaAorICovCisKK2V4dGVybiB1bnNpZ25lZCBpbnQgc3RybGVuICggY29uc3QgY2hhciAqICk7CisKKy8qCisgKiBFeHRyYWN0ZWQgZnJvbSBzeW10eXBlcy5oOgorICovCisKK3R5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgICAgQk9PTDsgICAgIC8qICA4IEJpdHMgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICAgICAgVUNIQVI7ICAgIC8qICA4IEJpdHMgKi8KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICAgICAgVVNIT1JUOyAgIC8qIDE2IEJpdHMgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgICAgVUxPTkc7ICAgIC8qIDMyIEJpdHMgKi8KKworLyoKKyAqIGZvciBzdHJ1Y3QgdF9leHByX3RhZyBhbmQKKyAqIGRlY2wgb2YgYnVpbGRfYW5kX2FkZF9leHByZXNzaW9uCisgKi8KKyNpbmNsdWRlICJhZGJnX2V4cHJlc3Npb24uaCIKKyNkZWZpbmUgTlVMTAkwCisKKy8qCisgKiBFeHRyYWN0ZWQgZnJvbSBwcmludHAuaDoKKyAqLworCitleHRlcm4gdm9pZCBwcmludHAgKCBjb25zdCBjaGFyICogZnB0ciwgLi4uICk7CitleHRlcm4gdm9pZCBzcHJpbnRwICggY29uc3QgY2hhciAqIGZwdHIsIC4uLiApOworCisvKgorICogRXh0cmFjdGVkIGZyb20gZXRoZXIuaDoKKyAqLworCitleHRlcm4gbG9uZyBldGhfdG9fZ2RiICggVUNIQVIgKmJ1ZiwgbG9uZyBsZW5ndGggKTsKKworCisvKgorICogRGVyaXZlZCBmcm9tIGh3ZXF1cy5zOgorICovCisKKyNkZWZpbmUgQ1NfQ09ERV9TVEFSVCAgICAgICAgICAgMHgxMDAwMDAKKyNkZWZpbmUgQ1NfQ09ERV9TSVpFICAgICAgICAgICAgMHgyMDAwMDAKKyNkZWZpbmUgTEFTVF9DU19XT1JEICAgICAgICAgICAgKENTX0NPREVfU1RBUlQgKyBDU19DT0RFX1NJWkUgLSAyKQorCisjZGVmaW5lIHNoX2dlbnN0YXQxICAgICAgICAgICAgICgqKCh2b2xhdGlsZSBVTE9ORyAqKSAweEZGRkZGRTU0KSkKKworI2RlZmluZSByczIzMl9tb2RlMSAgICAgICAgICAgICAwICAgICAgICAgICAgICAgLyogcnMtMjMyIG1vZGUgMSByZWcuICovCisjZGVmaW5lIHJzMjMyX21vZGUyICAgICAgICAgICAgIHJzMjMyX21vZGUxICAgICAvKiBycy0yMzIgbW9kZSAyIHJlZy4gKi8KKyNkZWZpbmUgcnMyMzJfc3RhdCAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgIC8qIHJzLTIzMiBzdGF0dXMgcmVnLiAqLworI2RlZmluZSByczIzMl9jbGsgICAgICAgICAgICAgICByczIzMl9zdGF0ICAgICAgLyogcnMtMjMyIGNsb2NrIHNlbGVjdCByZWcuICovCisjZGVmaW5lIHJzMjMyX2NtZCAgICAgICAgICAgICAgIDggICAgICAgICAgICAgICAvKiBycy0yMzIgY29tbWFuZCByZWcgKi8KKyNkZWZpbmUgcnMyMzJfdHJhbnNtaXQgICAgICAgICAgMTIgICAgICAgICAgICAgIC8qIHJzLTIzMiB0cmFuc21pdCByZWcuICovCisjZGVmaW5lIHJzMjMyX3JlY2VpdmUgICAgICAgICAgIHJzMjMyX3RyYW5zbWl0ICAvKiBycy0yMzIgdHJhbnNtaXQgcmVnLiAqLworI2RlZmluZSByczIzMl9hdXggICAgICAgICAgICAgICAxNiAgICAgICAgICAgICAgLyogcnMtMjMyIGF1eCBjb250cm9sIHJlZy4gKi8KKyNkZWZpbmUgcnMyMzJfaXNyICAgICAgICAgICAgICAgMjAgICAgICAgICAgICAgIC8qIHJzLTIzMiBpbnRlcnJ1cHQgc3RhdHVzIHJlZy4gKi8KKyNkZWZpbmUgcnMyMzJfaW1yICAgICAgICAgICAgICAgcnMyMzJfaXNyICAgICAgIC8qIHJzLTIzMiBpbnRlcnJ1cHQgbWFzayByZWcuICovCisjZGVmaW5lIHJzMjMyX3RjX2hpZ2ggICAgICAgICAgIDI0ICAgICAgICAgICAgICAvKiBycy0yMzIgdGltZXIvY291bnRlciBoaWdoIHJlZy4gKi8KKyNkZWZpbmUgcnMyMzJfdGNfbG93ICAgICAgICAgICAgMjggICAgICAgICAgICAgIC8qIHJzLTIzMiB0aW1lci9jb3VudGVyIGxvdyByZWcuICAqLworCisKKyNlbmRpZgorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RVTEUgIERFRklORVMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBQX1JTVF9MQU5fVUFSVF9SRUcgICAgICAoKHZvbGF0aWxlIFVDSEFSICAqKSAweEZGRkZGRTQ1KQorI2RlZmluZSBNX1JTVF9MQU5fVUFSVCAgICAgICAgICAweDgwICAgICAgICAgIC8qIEJpdCAgNyAqLworCisjZGVmaW5lIFBfTEFOMFRSX1JFRyAgICAgICAgICAgIFBfUlNUX0xBTl9VQVJUX1JFRworI2RlZmluZSBNX0xBTjBUUiAgICAgICAgICAgICAgICAweDIwICAgICAgICAgIC8qIEJpdCAgNSAqLworCisjZGVmaW5lIE1fU0hfR0VOQ09OX0xBTjBUUiAgICAgIDB4MDAyMDAwMDAgICAgLyogQml0IDIxICovCisKKyNkZWZpbmUgTUFYX1JTMjMyX0NIQVJTICAgICAgICAgNTEyCisKKyNkZWZpbmUgTEFOX1FfTU9EKFgpICAgICAgICAgICAgKChYKSAlIE1BWF9SUzIzMl9DSEFSUykKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiAgICAgICAgICAgTEFOICBVQVJUICBSZWdpc3RlcnMgICAgICAgICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBMQU5fVUFSVF9CQVNFICAgICAgICAgICAgICAgKChVTE9ORykgMHhmZmZmZmMyMikKKworLyogIFdyaXRlLVJlYWQgICovCisKKyNkZWZpbmUgUF9MQU5fTVIxICAgICAgICAgICAgICAgICAgICgodm9sYXRpbGUgVUNIQVIgKikgKExBTl9VQVJUX0JBU0UgKyAoKFVMT05HKSByczIzMl9tb2RlMSAgICkpKQorI2RlZmluZSBQX0xBTl9NUjIgICAgICAgICAgICAgICAgICAgKCh2b2xhdGlsZSBVQ0hBUiAqKSAoTEFOX1VBUlRfQkFTRSArICgoVUxPTkcpIHJzMjMyX21vZGUyICAgKSkpCisKKy8qICBXcml0ZS1Pbmx5ICAqLworCisjZGVmaW5lIFBfTEFOX0FDUiAgICAgICAgICAgICAgICAgICAoKHZvbGF0aWxlIFVDSEFSICopIChMQU5fVUFSVF9CQVNFICsgKChVTE9ORykgcnMyMzJfYXV4ICAgICApKSkKKyNkZWZpbmUgUF9MQU5fQ1IgICAgICAgICAgICAgICAgICAgICgodm9sYXRpbGUgVUNIQVIgKikgKExBTl9VQVJUX0JBU0UgKyAoKFVMT05HKSByczIzMl9jbWQgICAgICkpKQorI2RlZmluZSBQX0xBTl9DU1IgICAgICAgICAgICAgICAgICAgKCh2b2xhdGlsZSBVQ0hBUiAqKSAoTEFOX1VBUlRfQkFTRSArICgoVUxPTkcpIHJzMjMyX2NsayAgICAgKSkpCisjZGVmaW5lIFBfTEFOX0NUTFIgICAgICAgICAgICAgICAgICAoKHZvbGF0aWxlIFVDSEFSICopIChMQU5fVUFSVF9CQVNFICsgKChVTE9ORykgcnMyMzJfdGNfbG93ICApKSkKKyNkZWZpbmUgUF9MQU5fQ1RVUiAgICAgICAgICAgICAgICAgICgodm9sYXRpbGUgVUNIQVIgKikgKExBTl9VQVJUX0JBU0UgKyAoKFVMT05HKSByczIzMl90Y19oaWdoICkpKQorI2RlZmluZSBQX0xBTl9JTVIgICAgICAgICAgICAgICAgICAgKCh2b2xhdGlsZSBVQ0hBUiAqKSAoTEFOX1VBUlRfQkFTRSArICgoVUxPTkcpIHJzMjMyX2ltciAgICAgKSkpCisKKy8qICBSZWFkLU9ubHkgKi8KKworI2RlZmluZSBQX0xBTl9TUiAgICAgICAgICAgICAgICAgICAgKCh2b2xhdGlsZSBVQ0hBUiAqKSAoTEFOX1VBUlRfQkFTRSArICgoVUxPTkcpIHJzMjMyX3N0YXQgICAgKSkpCisjZGVmaW5lIFBfTEFOX0lTUiAgICAgICAgICAgICAgICAgICAoKHZvbGF0aWxlIFVDSEFSICopIChMQU5fVUFSVF9CQVNFICsgKChVTE9ORykgcnMyMzJfaXNyICAgICApKSkKKyNkZWZpbmUgUF9MQU5fWE1UICAgICAgICAgICAgICAgICAgICgodm9sYXRpbGUgVUNIQVIgKikgKExBTl9VQVJUX0JBU0UgKyAoKFVMT05HKSByczIzMl90cmFuc21pdCkpKQorI2RlZmluZSBQX0xBTl9SQ1YgICAgICAgICAgICAgICAgICAgKCh2b2xhdGlsZSBVQ0hBUiAqKSAoTEFOX1VBUlRfQkFTRSArICgoVUxPTkcpIHJzMjMyX3JlY2VpdmUgKSkpCisKKy8qCisgKiAgIEJpdCBWYWx1ZXMgZm9yIFdyaXRlLVJlYWQgYW5kIFdyaXRlLU9ubHkgUmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBERUZBVUxUX0xBTl9NUjEgICAgICAgICAgICAgKChVQ0hBUikgMHgxMykKKyNkZWZpbmUgREVGQVVMVF9MQU5fTVIyICAgICAgICAgICAgICgoVUNIQVIpIDB4MDcpCisjZGVmaW5lIERFRkFVTFRfTEFOX0NTUiAgICAgICAgICAgICAoKFVDSEFSKSAweGNjKQorI2RlZmluZSBERUZBVUxUX0xBTl9BQ1IgICAgICAgICAgICAgKChVQ0hBUikgMHgzOCkKKyNkZWZpbmUgREVGQVVMVF9MQU5fQ1RVUiAgICAgICAgICAgICgoVUNIQVIpIDB4ZmYpCisjZGVmaW5lIERFRkFVTFRfTEFOX0NUTFIgICAgICAgICAgICAoKFVDSEFSKSAweGZmKQorCisjZGVmaW5lIExBTl9BQ1JfU0VMRUNUX0JSR18wICAgICAgICBERUZBVUxUX0xBTl9BQ1IKKyNkZWZpbmUgTEFOX0FDUl9TRUxFQ1RfQlJHXzEgICAgICAgIChERUZBVUxUX0xBTl9BQ1IgfCAweDgwKQorCisjZGVmaW5lIFVBUlRfQ1JfUkVTRVRfTVJfUFRSICAgICAgICAoKFVDSEFSKSAweDEwKSAvKiBSZXNldCBNUiBwb2ludGVyIChwb2ludHMgdG8gTVIxKS4gKi8KKyNkZWZpbmUgVUFSVF9DUl9SRVNFVF9SVkNSICAgICAgICAgICgoVUNIQVIpIDB4MjApIC8qIFJlc2V0IHJlY2VpdmVyIChkaXNhYmxlZCkuICAgICAgICAqLworI2RlZmluZSBVQVJUX0NSX1JFU0VUX1hNVFIgICAgICAgICAgKChVQ0hBUikgMHgzMCkgLyogUmVzZXQgdHJhbnNtaXR0ZXIgKGRpc2FibGVkKS4gICAgICovCisjZGVmaW5lIFVBUlRfQ1JfUkVTRVRfRVJST1JfU1RBVFVTICAoKFVDSEFSKSAweDQwKSAvKiBSZXNldCBlcnJvciBzdGF0dXMuICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9DUl9SRVNFVF9CUktfQ0hHX0lOVCAgICgoVUNIQVIpIDB4NTApIC8qIFJlc2V0IGJyZWFrIGNoYW5nZSBpbnRlcnJ1cHQuICAgICAqLworI2RlZmluZSBVQVJUX0NSX1NUQVJUX0NOVFJfVElNRVIgICAgKChVQ0hBUikgMHg4MCkgLyogU3RhcnQgY291bnRlci90aW1lci4gICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ1JfU1RPUF9DTlRSICAgICAgICAgICAoKFVDSEFSKSAweDkwKSAvKiBTdG9wIGNvdW50ZXIuICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBVQVJUX0NSX0RJU0FCTEVfWE1UUiAgICAgICAgKChVQ0hBUikgMHgwOCkgLyogRGlzYWJsZSB0cmFuc21pdHRlci4gICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfQ1JfRU5BQkxFX1hNVFIgICAgICAgICAoKFVDSEFSKSAweDA0KSAvKiBFbmFibGUgdHJhbnNtaXR0ZXIuICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9DUl9ESVNBQkxFX1JDVlIgICAgICAgICgoVUNIQVIpIDB4MDIpIC8qIERpc2FibGUgcmVjZWl2ZXIuICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0NSX0VOQUJMRV9SQ1ZSICAgICAgICAgKChVQ0hBUikgMHgwMSkgLyogRW5hYmxlIHJlY2VpdmVyLiAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgVUFSVF9DU1JfQlJfNDgwMCAgICAgICAgICAgICgoVUNIQVIpIDB4OTkpIC8qIFdpdGggZWl0aGVyIEJSRyBTZXQgc2VsZWN0ZWQgKHZpYSBBQ1IpLiAqLworI2RlZmluZSBVQVJUX0NTUl9CUl85NjAwICAgICAgICAgICAgKChVQ0hBUikgMHhiYikgLyogV2l0aCBlaXRoZXIgQlJHIFNldCBzZWxlY3RlZCAodmlhIEFDUikuICovCisjZGVmaW5lIFVBUlRfQ1NSX0JSXzE5MjAwICAgICAgICAgICAoKFVDSEFSKSAweGNjKSAvKiBXaXRoIEJSRyBTZXQgJzEnIHNlbGVjdGVkICh2aWEgQUNSKS4gKi8KKyNkZWZpbmUgVUFSVF9DU1JfQlJfMzg0MDAgICAgICAgICAgICgoVUNIQVIpIDB4Y2MpIC8qIFdpdGggQlJHIFNldCAnMCcgc2VsZWN0ZWQgKHZpYSBBQ1IpLiAqLworCisjZGVmaW5lIFVBUlRfSU1SX1J4UkRZICAgICAgICAgICAgICAoKFVDSEFSKSAweDA0KSAvKiBFbmFibGUgJ1J4UkRZJyBpbnRlcnJ1cHQuICovCisjZGVmaW5lIFVBUlRfSU1SX1R4RU1UICAgICAgICAgICAgICAoKFVDSEFSKSAweDAyKSAvKiBFbmFibGUgJ1R4RU1UJyBpbnRlcnJ1cHQuICovCisjZGVmaW5lIFVBUlRfSU1SX1R4UkRZICAgICAgICAgICAgICAoKFVDSEFSKSAweDAxKSAvKiBFbmFibGUgJ1R4UkRZJyBpbnRlcnJ1cHQuICovCisKKy8qCisgKiAgIEJpdCBNYXNrcyBmb3IgUmVhZC1Pbmx5IFJlZ2lzdGVycworICovCisKKyNkZWZpbmUgTV9VQVJUX1NSX1JDVkRfQlJLICAgICAgMHg4MCAgICAvKiBCaXQgNyAqLworI2RlZmluZSBNX1VBUlRfU1JfRkUgICAgICAgICAgICAweDQwICAgIC8qIEJpdCA2ICovCisjZGVmaW5lIE1fVUFSVF9TUl9QRSAgICAgICAgICAgIDB4MjAgICAgLyogQml0IDUgKi8KKyNkZWZpbmUgTV9VQVJUX1NSX09FICAgICAgICAgICAgMHgxMCAgICAvKiBCaXQgNCAqLworI2RlZmluZSBNX1VBUlRfU1JfVHhFTVQgICAgICAgICAweDA4ICAgIC8qIEJpdCAzICovCisjZGVmaW5lIE1fVUFSVF9TUl9UeFJEWSAgICAgICAgIDB4MDQgICAgLyogQml0IDIgKi8KKyNkZWZpbmUgTV9VQVJUX1NSX0ZGVUxMICAgICAgICAgMHgwMiAgICAvKiBCaXQgMSAqLworI2RlZmluZSBNX1VBUlRfU1JfUnhSRFkgICAgICAgICAweDAxICAgIC8qIEJpdCAwICovCisKKyNkZWZpbmUgTV9VQVJUX0lTUl9SeFJEWSAgICAgICAgMHgwNCAgICAvKiBCaXQgMiAqLworI2RlZmluZSBNX1VBUlRfSVNSX1R4RU1UICAgICAgICAweDAyICAgIC8qIEJpdCAxICovCisjZGVmaW5lIE1fVUFSVF9JU1JfVHhSRFkgICAgICAgIDB4MDEgICAgLyogQml0IDAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiAgICAgICBTdXBwb3J0IGZvciAnVXRpbGl0eSA4MycuICAgICAgICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBMQU5fVVRJTF9DT0RFICAgICAgICAgICAweDgzCisKKyNkZWZpbmUgTEFOX0lOSVQgICAgICAgICAgICAgICAgKChVTE9ORykgKCgnSScgPDwgMjQpIHwgKCdOJyA8PCAxNikgfCAoJ0knIDw8IDgpIHwgJ1QnKSkKKyNkZWZpbmUgTEFOX0JBVUQgICAgICAgICAgICAgICAgKChVTE9ORykgKCgnQicgPDwgMjQpIHwgKCdBJyA8PCAxNikgfCAoJ1UnIDw8IDgpIHwgJ0QnKSkKKyNkZWZpbmUgTEFOX0lOVFIgICAgICAgICAgICAgICAgKChVTE9ORykgKCgnSScgPDwgMjQpIHwgKCdOJyA8PCAxNikgfCAoJ1QnIDw8IDgpIHwgJ1InKSkKKyNkZWZpbmUgTEFOX1hNVCAgICAgICAgICAgICAgICAgKChVTE9ORykgICAgICAgICAgICAgICAoKCdYJyA8PCAxNikgfCAoJ00nIDw8IDgpIHwgJ1QnKSkKKyNkZWZpbmUgTEFOX0VDSE8gICAgICAgICAgICAgICAgKChVTE9ORykgKCgnRScgPDwgMjQpIHwgKCdDJyA8PCAxNikgfCAoJ0gnIDw8IDgpIHwgJ08nKSkKKyNkZWZpbmUgTEFOX1NUQVQgICAgICAgICAgICAgICAgKChVTE9ORykgKCgnUycgPDwgMjQpIHwgKCdUJyA8PCAxNikgfCAoJ0EnIDw8IDgpIHwgJ1QnKSkKKyNkZWZpbmUgTEFOX0lOICAgICAgICAgICAgICAgICAgKChVTE9ORykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoJ0knIDw8IDgpIHwgJ04nKSkKKyNkZWZpbmUgTEFOX09VVCAgICAgICAgICAgICAgICAgKChVTE9ORykgICAgICAgICAgICAgICAoKCdPJyA8PCAxNikgfCAoJ1UnIDw8IDgpIHwgJ1QnKSkKKworI2RlZmluZSBMQU5fUFVUQyAgICAgICAgICAgICAgICAoKFVMT05HKSAoKCdQJyA8PCAyNCkgfCAoJ1UnIDw8IDE2KSB8ICgnVCcgPDwgOCkgfCAnQycpKQorI2RlZmluZSBMQU5fV1BNICAgICAgICAgICAgICAgICAoKFVMT05HKSAgICAgICAgICAgICAgICgoJ1cnIDw8IDE2KSB8ICgnUCcgPDwgOCkgfCAnTScpKQorCisjZGVmaW5lIFNUQVRVUyhYKSAgICAgICAgICAgICAgICggKCAoIFggKSA9PSAwICkgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiICkKKworI2RlZmluZSBYTVRfVklBX0JQX0VOQUJMRUQoKSAgICAoICpQX0xBTjBUUl9SRUcgJiBNX0xBTjBUUiAgPyAgMSA6IDAgKQorCisjZGVmaW5lIFRSQVBfMV9JTlNUICAgICAgICAgICAgIDB4NEU0MQorCisvKgorICogICBCaXQgIzEzIG9mIHNoYXJlZCBnZW5zdGF0IDEgaW5kaWNhdGVzCisgKiAgIHdoaWNoIHByb2Nlc3NvciB3ZSBhcmUgYXMgZm9sbG93cy4KKyAqCisgKiAgICAgICAgICAgMCA9PiBYIChzaWRlIEEpCisgKiAgICAgICAgICAgMSA9PiBZIChzaWRlIEIpCisgKi8KKworI2RlZmluZSBNX1BST0NfSUQgICAgICAgICAgICAgICAweDAwMDAyMDAwCisKKyNkZWZpbmUgSVNfU0lERV9BKCkgICAgICAgICAgICAgKCAoIChzaF9nZW5zdGF0MSkgJiBNX1BST0NfSUQgKSA9PSAwICkKKyNkZWZpbmUgSVNfU0lERV9CKCkgICAgICAgICAgICAgKCAoc2hfZ2Vuc3RhdDEpICYgTV9QUk9DX0lEICkKKworCisjaWZkZWYgU1RBTkRBTE9ORSAgICAgICAvKiBDb21waWxlIHRoaXMgbW9kdWxlIHN0YW5kLWFsb25lIGZvciBkZWJ1Z2dpbmcgKi8KKyNkZWZpbmUgTEFOX1BVVF9DSEFSKFgpIHByaW50ZigiJWMiLCBYKQorI2Vsc2UKKyNkZWZpbmUgTEFOX1BVVF9DSEFSKFgpIHdoaWxlICggbGFuX3B1dF9jaGFyKCBYICkgKQorI2VuZGlmCisKKworCisKKyNkZWZpbmUgVklBX1JTMjMyICAgICAgICAgICAgIDAKKyNkZWZpbmUgVklBX0VUSEVSTkVUICAgICAgICAgIDEKKworI2RlZmluZSBNQVhfSU9fQlVGX1NJWkUgICAgICAgNDAwCisKKyNkZWZpbmUgTUFYX0JZVEVfQ09ERVMgICAgICAgIDIwMCAvKiBtYXhpbXVtIGxlbmd0aCBmb3IgYnl0ZWNvZGUgc3RyaW5nICovCisKKworc3RhdGljICBVTE9ORyAgICAgICAgICAgZ2RiX2hvc3RfY29tbTsKKworc3RhdGljICBVTE9ORyAgICAgICAgICAgZ2RiX2NhdF9hY2s7CisKK3N0YXRpYyAgY2hhciAgICAgICAgICAgIGV0aF9vdXRidWZmZXJbIE1BWF9JT19CVUZfU0laRSArIDEgXTsKKworCisjaWZkZWYgU1RBTkRBTE9ORQorCisjZGVmaW5lIEFDS19QS1QoKSAgICAgICBMQU5fUFVUX0NIQVIoICcrJyApCisjZGVmaW5lIE5BQ0tfUEtUKCkgICAgICBMQU5fUFVUX0NIQVIoICctJyApCisKKyNlbHNlCisKKyNkZWZpbmUgQUNLX1BLVCgpICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggVklBX0VUSEVSTkVUID09IGdkYl9ob3N0X2NvbW0gKSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZGJfY2F0X2FjayA9IFlFUzsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEFOX1BVVF9DSEFSKCAnKycgKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisKKyNkZWZpbmUgTkFDS19QS1QoKSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggVklBX0VUSEVSTkVUID09IGdkYl9ob3N0X2NvbW0gKSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGhfb3V0YnVmZmVyWyAwIF0gPSAnLSc7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRoX3RvX2dkYiggKFVDSEFSICopIGV0aF9vdXRidWZmZXIsIDEgKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExBTl9QVVRfQ0hBUiggJy0nICk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyNlbmRpZgorCisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFICBUWVBFREVGUworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit0eXBlZGVmIHN0cnVjdCByczIzMl9xdWV1ZSB7CisKKyAgbG9uZyAgICBoZWFkX2luZGV4OworCisgIGxvbmcgICAgdGFpbF9pbmRleDsKKworICBVTE9ORyAgIG92ZXJmbG93czsKKworICBsb25nICAgIGdkYl9wYWNrZXRfc3RhcnQ7CisgIGxvbmcgICAgZ2RiX3BhY2tldF9lbmQ7CisgIGxvbmcgICAgZ2RiX3BhY2tldF9jc3VtMTsKKyAgbG9uZyAgICBnZGJfcGFja2V0X2NzdW0yOworCisgIFVDSEFSICAgYnVmWyBNQVhfUlMyMzJfQ0hBUlMgXTsKKworfSBUX1JTMjMyX1FVRVVFOworCisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICAgICAgICAgICAgICAgICAgICAgIEVYVEVSTkFMIEdMT0JBTCBWQVJJQUJMRVMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworZXh0ZXJuIHZvbGF0aWxlIFVDSEFSICAgICAgICAgc3NzX3RyYWNlX2ZsYWc7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFUSUMgIE1PRFVMRSAgREVDTEFSQVRJT05TCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyAgVF9SUzIzMl9RVUVVRSBsYW5faW5wdXRfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbGFuX291dHB1dF9xdWV1ZTsKKworc3RhdGljICBCT09MICAgICAgICAgIHRlc3RfZWNobzsKKworI2lmIDAKKy8qIFRoZSBzdHViIG5vIGxvbmdlciBzZWVtcyB0byB1c2UgdGhpcy4gICovCitzdGF0aWMgIEJPT0wgICAgICAgICAgd3JpdGVfYWNjZXNzX2VuYWJsZWQ7CisjZW5kaWYKKworc3RhdGljICBpbnQgICAgICAgICAgIGJhdWRfcmF0ZV9pZHg7CisKK3N0YXRpYyAgVUxPTkcgICAgICAgICB0eF9ieV9pbnRyLAorICAgICAgICAgICAgICAgICAgICAgIHR4X2J5X3BvbGw7CisKK3N0YXRpYyAgVUNIQVIgICAgICAgICBsYW5fc2hhZG93X2ltcjsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICAgICAgICAgICAgICAgICAgICAgIEVYVEVSTkFMIEZVTkNUSU9OIFBST1RPVFlQRVMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworZXh0ZXJuICBsb25nICB3cml0ZV90b19wcm90ZWN0ZWRfbWVtKCB2b2lkICphZGRyZXNzLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSApOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgICAgICAgICAgICAgICAgICAgIE1PRFVMRSBHTE9CQUwgRlVOQ1RJT05TIFBST1RPVFlQRVMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworVUxPTkcgZ2RiX2NfdGVzdCggVUxPTkcgKnBhcm0gKTsKKworCit2b2lkICBsYW5faW5pdCggdm9pZCApOworCit2b2lkICBsYW5faXNyKCB2b2lkICk7CisKK2xvbmcgIGxhbl9nZXRfY2hhciggdm9pZCApOworCitsb25nICBsYW5fcHV0X2NoYXIoIFVDSEFSIGMgKTsKKworVUxPTkcgbGFuX3V0aWwoIFVMT05HICpwYXJtICk7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogICAgICAgICAgICAgICAgICAgICAgTU9EVUxFIExPQ0FMIEZVTkNUSU9OIFBST1RPVFlQRVMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljICB2b2lkICBsYW5fcmVzZXQoIHZvaWQgKTsKKworc3RhdGljICB2b2lkICBsYW5fY29uZmlndXJlKCB2b2lkICk7CisKK3N0YXRpYyAgdm9pZCAgbGFuX2luaXRfcXVldWUoIFRfUlMyMzJfUVVFVUUgKnBfcXVldWUgKTsKKworc3RhdGljICB2b2lkICBsYW5fYWRkX3RvX3F1ZXVlKCBsb25nIGMsIFRfUlMyMzJfUVVFVUUgKnBfcXVldWUgKTsKKworc3RhdGljICBVQ0hBUiBsYW5fbmV4dF9xdWV1ZV9jaGFyKCBUX1JTMjMyX1FVRVVFICpwX3F1ZXVlICk7CisKK3N0YXRpYyAgdm9pZCAgbGFuX3V0aWxfbWVudSggdm9pZCApOworCitzdGF0aWMgIGxvbmcgIGdldF9nZGJfaW5wdXQoIGxvbmcgYywgVF9SUzIzMl9RVUVVRSAqcF9pbnB1dF9xICk7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogICAgICAgICAgICAgICAgICAgICAgR0RCIFNUVUIgRlVOQ1RJT04gUFJPVE9UWVBFUworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit2b2lkICBnZGJfdHJhcF8xX2hhbmRsZXIoIHZvaWQgKTsKK3ZvaWQgIGdkYl90cmFjZV9oYW5kbGVyICggdm9pZCApOworCit2b2lkICBnZGJfZ2V0X2V0aF9pbnB1dCggdW5zaWduZWQgY2hhciAqYnVmLCBsb25nIGxlbmd0aCApOworCitzdGF0aWMgdm9pZCBnZXRwYWNrZXQgKCB2b2lkICk7CitzdGF0aWMgdm9pZCBwdXRwYWNrZXQgKCBjaGFyICogKTsKK3N0YXRpYyB2b2lkIGRpc2NhcmRfcGFja2V0ICggdm9pZCApOworCisjaWZkZWYgICAgU1RBTkRBTE9ORSAgICAvKiBDb21waWxlIHRoaXMgbW9kdWxlIHN0YW5kLWFsb25lIGZvciBkZWJ1Z2dpbmcgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBwcmludHAgcHJpbnRmICAgLyogZWFzaWVyIHRoYW4gZGVjbGFyaW5nIGEgbG9jYWwgdmFyYXJncyBzdHViIGZ1bmMuICAqLworI2VuZGlmIC8qIFNUQU5EQUxPTkUgKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PRFVMRSBCT0RZCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gVGhpbmdzIHRoYXQgYmVsb25nIGluIGEgaGVhZGVyIGZpbGUgLS0tLS0tLS0tLS0tLS0tICovCitleHRlcm4gY2hhciAqbWVtc2V0IChjaGFyICosIGludCwgaW50KTsKKworICAgICAgICAgICAgICAgICAgLyolJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUqCisgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICogICAgICAgR2xvYmFsIE1vZHVsZSBGdW5jdGlvbnMgICAgICAgKgorICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAqJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlKi8KKworCitzdGF0aWMgY2hhciAgIGdkYl9jaGFyX3Rlc3Q7CitzdGF0aWMgc2hvcnQgIGdkYl9zaG9ydF90ZXN0Oworc3RhdGljIGxvbmcgICBnZGJfbG9uZ190ZXN0Oworc3RhdGljIGNoYXIgICBnZGJfYXJyX3Rlc3RbMjVdOworc3RhdGljIHN0cnVjdCBHREJfU1RSVUNUX1RFU1QKK3sKKyAgY2hhciAgIGM7CisgIHNob3J0ICBzOworICBsb25nICAgbDsKKyAgaW50ICAgIGJmaWVsZCA6IDExOwkvKiBjb2xsZWN0IGJpdGZpZWxkICovCisgIGNoYXIgICBhcnJbMjVdOworICBzdHJ1Y3QgR0RCX1NUUlVDVF9URVNUICpuZXh0OworfSBnZGJfc3RydWN0MV90ZXN0LCBnZGJfc3RydWN0Ml90ZXN0LCAqZ2RiX3N0cnVjdHBfdGVzdCwgKipnZGJfc3RydWN0cHBfdGVzdDsKKworc3RhdGljIHVuaW9uIEdEQl9VTklPTl9URVNUCit7CisgIGNoYXIgICBjOworICBzaG9ydCAgczsKKyAgbG9uZyAgIGw7CisgIGludCAgICBiZmllbGQgOiAxMTsJLyogY29sbGVjdCBiaXRmaWVsZCAqLworICBjaGFyICAgYXJyWzRdOworICB1bmlvbiBHREJfVU5JT05fVEVTVCAqbmV4dDsKK30gZ2RiX3VuaW9uMV90ZXN0OworCit2b2lkIGdkYl9yZWN1cnNpb25fdGVzdCAoaW50LCBpbnQsIGludCwgaW50LCAgaW50LCAgaW50LCAgaW50KTsKKwordm9pZCBnZGJfcmVjdXJzaW9uX3Rlc3QgKGludCBkZXB0aCwgCisJCQkgaW50IHExLCAKKwkJCSBpbnQgcTIsIAorCQkJIGludCBxMywgCisJCQkgaW50IHE0LCAKKwkJCSBpbnQgcTUsIAorCQkJIGludCBxNikKK3sJLyogZ2RiX3JlY3Vyc2lvbl90ZXN0IGxpbmUgMCAqLworICBpbnQgcSA9IHExOwkJCQkJCS8qIGdkYnRlc3RsaW5lIDEgKi8KKworICBxMSA9IHEyOwkJCQkJCS8qIGdkYnRlc3RsaW5lIDIgKi8KKyAgcTIgPSBxMzsJCQkJCQkvKiBnZGJ0ZXN0bGluZSAzICovCisgIHEzID0gcTQ7CQkJCQkJLyogZ2RidGVzdGxpbmUgNCAqLworICBxNCA9IHE1OwkJCQkJCS8qIGdkYnRlc3RsaW5lIDUgKi8KKyAgcTUgPSBxNjsJCQkJCQkvKiBnZGJ0ZXN0bGluZSA2ICovCisgIHE2ID0gcTsJCQkJCQkvKiBnZGJ0ZXN0bGluZSA3ICovCisgIGlmIChkZXB0aC0tKQkJCQkJCS8qIGdkYnRlc3RsaW5lIDggKi8KKyAgICBnZGJfcmVjdXJzaW9uX3Rlc3QgKGRlcHRoLCBxMSwgcTIsIHEzLCBxNCwgcTUsIHE2KTsJLyogZ2RidGVzdGxpbmUgOSAqLworfQorCisKK1VMT05HICAgZ2RiX2NfdGVzdCggVUxPTkcgKnBhcm0gKQorCit7CisgICBjaGFyICpwID0gImdkYl9jX3Rlc3QiOworICAgY2hhciAqcmVkaWN1bG91c2x5X2xvbmdfdmFyaWFibGVfbmFtZV93aXRoX2VxdWFsbHlfbG9uZ19zdHJpbmdfYXNzaWdubWVudDsKKyAgIHJlZ2lzdGVyIGxvbmcgbG9jYWxfcmVnID0gNzsKKyAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxvY2FsX3N0YXRpYywgbG9jYWxfc3RhdGljX3NpemVvZjsKKyAgIGxvbmcgbG9jYWxfbG9uZzsKKyAgIHVuc2lnbmVkIGxvbmcgKnN0YWNrX3B0cjsKKyAgIHVuc2lnbmVkIGxvbmcgZW5kX29mX3N0YWNrOworCisgICByZWRpY3Vsb3VzbHlfbG9uZ192YXJpYWJsZV9uYW1lX3dpdGhfZXF1YWxseV9sb25nX3N0cmluZ19hc3NpZ25tZW50ID0gCisgICAgICJyZWRpY3Vsb3VzbHkgbG9uZyB2YXJpYWJsZSBuYW1lIHdpdGggZXF1YWxseSBsb25nIHN0cmluZyBhc3NpZ25tZW50IjsKKyAgIGxvY2FsX3N0YXRpYyA9IDk7CisgICBsb2NhbF9zdGF0aWNfc2l6ZW9mID0gc2l6ZW9mIChzdHJ1Y3QgR0RCX1NUUlVDVF9URVNUKTsKKyAgIGxvY2FsX2xvbmcgPSBsb2NhbF9yZWcgKyAxOworICAgc3RhY2tfcHRyICA9ICh1bnNpZ25lZCBsb25nICopICZsb2NhbF9sb25nOworICAgZW5kX29mX3N0YWNrID0gCisgICAgICh1bnNpZ25lZCBsb25nKSAmc3RhY2tfcHRyICsgc2l6ZW9mKHN0YWNrX3B0cikgKyBzaXplb2YoZW5kX29mX3N0YWNrKSAtIDE7CisKKyAgIHByaW50cCAoIlxuJElkJFxuIik7CisKKyAgIHByaW50cCggIiVzOiBhcmd1bWVudHMgPSAlWCwgJVgsICVYLCAlWCwgJVgsICVYXG4iLAorICAgICAgICAgICBwLCBwYXJtWyAxIF0sIHBhcm1bIDIgXSwgcGFybVsgMyBdLCBwYXJtWyA0IF0sIHBhcm1bIDUgXSwgcGFybVsgNiBdICk7CisKKyAgIGdkYl9jaGFyX3Rlc3QgICA9IGdkYl9zdHJ1Y3QxX3Rlc3QuYyA9IChjaGFyKSAgICgobG9uZykgcGFybVsxXSAmIDB4ZmYpOworICAgZ2RiX3Nob3J0X3Rlc3QgID0gZ2RiX3N0cnVjdDFfdGVzdC5zID0gKHNob3J0KSAgKChsb25nKSBwYXJtWzJdICYgMHhmZmZmKTsKKyAgIGdkYl9sb25nX3Rlc3QgICA9IGdkYl9zdHJ1Y3QxX3Rlc3QubCA9IChsb25nKSAgICgobG9uZykgcGFybVszXSAmIDB4ZmZmZmZmZmYpOworICAgZ2RiX3VuaW9uMV90ZXN0LmwgPSAobG9uZykgcGFybVs0XTsKKyAgIGdkYl9hcnJfdGVzdFswXSA9IGdkYl9zdHJ1Y3QxX3Rlc3QuYXJyWzBdID0gKGNoYXIpICgobG9uZykgcGFybVsxXSAmIDB4ZmYpOworICAgZ2RiX2Fycl90ZXN0WzFdID0gZ2RiX3N0cnVjdDFfdGVzdC5hcnJbMV0gPSAoY2hhcikgKChsb25nKSBwYXJtWzJdICYgMHhmZik7CisgICBnZGJfYXJyX3Rlc3RbMl0gPSBnZGJfc3RydWN0MV90ZXN0LmFyclsyXSA9IChjaGFyKSAoKGxvbmcpIHBhcm1bM10gJiAweGZmKTsKKyAgIGdkYl9hcnJfdGVzdFszXSA9IGdkYl9zdHJ1Y3QxX3Rlc3QuYXJyWzNdID0gKGNoYXIpICgobG9uZykgcGFybVs0XSAmIDB4ZmYpOworICAgZ2RiX2Fycl90ZXN0WzRdID0gZ2RiX3N0cnVjdDFfdGVzdC5hcnJbNF0gPSAoY2hhcikgKChsb25nKSBwYXJtWzVdICYgMHhmZik7CisgICBnZGJfYXJyX3Rlc3RbNV0gPSBnZGJfc3RydWN0MV90ZXN0LmFycls1XSA9IChjaGFyKSAoKGxvbmcpIHBhcm1bNl0gJiAweGZmKTsKKyAgIGdkYl9zdHJ1Y3QxX3Rlc3QuYmZpZWxkID0gMTQ0OworICAgZ2RiX3N0cnVjdDFfdGVzdC5uZXh0ID0gJmdkYl9zdHJ1Y3QyX3Rlc3Q7CisgICBnZGJfc3RydWN0cF90ZXN0ICAgICAgPSAmZ2RiX3N0cnVjdDFfdGVzdDsKKyAgIGdkYl9zdHJ1Y3RwcF90ZXN0ICAgICA9ICZnZGJfc3RydWN0cF90ZXN0OworCisgICBnZGJfcmVjdXJzaW9uX3Rlc3QgKDMsIChsb25nKSBwYXJtWzFdLCAobG9uZykgcGFybVsyXSwgKGxvbmcpIHBhcm1bM10sCisJCSAgICAgICAobG9uZykgcGFybVs0XSwgKGxvbmcpIHBhcm1bNV0sIChsb25nKSBwYXJtWzZdKTsKKworICAgZ2RiX2NoYXJfdGVzdCA9IGdkYl9zaG9ydF90ZXN0ID0gZ2RiX2xvbmdfdGVzdCA9IDA7CisgICBnZGJfc3RydWN0cF90ZXN0ICA9ICh2b2lkICopIDA7CisgICBnZGJfc3RydWN0cHBfdGVzdCA9ICh2b2lkICopIDA7CisgICBtZW1zZXQgKChjaGFyICopICZnZGJfc3RydWN0MV90ZXN0LCAwLCBzaXplb2YgKGdkYl9zdHJ1Y3QxX3Rlc3QpKTsKKyAgIG1lbXNldCAoKGNoYXIgKikgJmdkYl9zdHJ1Y3QyX3Rlc3QsIDAsIHNpemVvZiAoZ2RiX3N0cnVjdDJfdGVzdCkpOworICAgbG9jYWxfc3RhdGljX3NpemVvZiA9IDA7CisgICBsb2NhbF9zdGF0aWMgPSAwOworICAgcmV0dXJuICggKFVMT05HKSAwICk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZVTkNUSU9OIE5BTUU6ICAgbGFuX2luaXQKKyAqCisgKgorICogREVTQ1JJUFRJT046CisgKgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqCisgKgorICogVVNFRCBHTE9CQUwgVkFSSUFCTEVTOgorICoKKyAqCisgKiBBRkZFQ1RFRCBHTE9CQUwgVkFSSUFCTEVTL1NJREUgRUZGRUNUUzoKKyAqCisgKgorICogTk9URVM6CisgKgorICoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgICAgbGFuX2luaXQoIHZvaWQgKQorCit7CisKKyAgaWYgKCBJU19TSURFX0EoICkgKQorICB7CisKKyAgICBsYW5fcmVzZXQoICk7CisKKyAgICBsYW5faW5pdF9xdWV1ZSggJmxhbl9pbnB1dF9xdWV1ZSApOworCisgICAgbGFuX2luaXRfcXVldWUoICZsYW5fb3V0cHV0X3F1ZXVlICk7CisKKyAgICBsYW5fY29uZmlndXJlKCApOworICB9CisKKyAgcmV0dXJuOworfQorLyogZW5kIG9mICdsYW5faW5pdCcKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRlVOQ1RJT04gTkFNRTogICBsYW5faXNyCisgKgorICoKKyAqIERFU0NSSVBUSU9OOgorICoKKyAqCisgKiBSRVRVUk4gVkFMVUU6ICAgIE5vbmUuCisgKgorICoKKyAqIFVTRUQgR0xPQkFMIFZBUklBQkxFUzoKKyAqCisgKgorICogQUZGRUNURUQgR0xPQkFMIFZBUklBQkxFUy9TSURFIEVGRkVDVFM6CisgKgorICoKKyAqIE5PVEVTOgorICoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgICAgICBsYW5faXNyKCB2b2lkICkKKworeworICBVQ0hBUiAgIGM7CisKKworICBsYW5fc2hhZG93X2ltciA9IDA7ICAgICAgICAgICAvKiAgRGlzYWJsZSBhbGwgVUFSVCBpbnRlcnJ1cHRzLiAgKi8KKyAgKlBfTEFOX0lNUiA9IGxhbl9zaGFkb3dfaW1yOworCisKKyAgaWYgKCAqUF9MQU5fSVNSICYgTV9VQVJUX0lTUl9SeFJEWSApCisgIHsKKworICAgIGdkYl9ob3N0X2NvbW0gPSBWSUFfUlMyMzI7CisKKyAgICBjID0gKlBfTEFOX1JDVjsKKworICAgIGlmICggdGVzdF9lY2hvICkKKyAgICB7CisgICAgICAvKiA/Pz8/PyAqLworICAgIH0KKworICAgIGlmICggYyA9PSBDT05UUk9MX0MgKQorICAgIHsKKyAgICAgICAgLyogY2FuJ3Qgc3RvcCB0aGUgdGFyZ2V0LCBidXQgd2UgY2FuIHRlbGwgZ2RiIHRvIHN0b3Agd2FpdGluZy4uLiAqLworICAgICAgZGlzY2FyZF9wYWNrZXQoICk7CisgICAgICBwdXRwYWNrZXQoICJTMDMiICk7ICAgICAgIC8qIHNlbmQgYmFjayBTSUdJTlQgdG8gdGhlIGRlYnVnZ2VyICovCisgICAgfQorCisgICAgZWxzZQorICAgIHsKKyAgICAgIGxhbl9hZGRfdG9fcXVldWUoIChsb25nKSBjLCAmbGFuX2lucHV0X3F1ZXVlICk7CisgICAgICBnZXRfZ2RiX2lucHV0KCAobG9uZykgYywgJmxhbl9pbnB1dF9xdWV1ZSApOworICAgIH0KKworICB9CisKKyAgaWYgKCBYTVRfVklBX0JQX0VOQUJMRUQoICkgKQorICB7CisKKyAgICBjID0gMDsKKworICAgIHdoaWxlICggKCpQX0xBTl9JU1IgJiBNX1VBUlRfSVNSX1R4UkRZKSAgJiYgIChjID0gbGFuX25leHRfcXVldWVfY2hhciggJmxhbl9vdXRwdXRfcXVldWUgKSkgKQorICAgIHsKKyAgICAgICpQX0xBTl9YTVQgPSBjOworICAgICAgKyt0eF9ieV9pbnRyOworICAgIH0KKworICAgIGlmICggYyApCisgICAgeworICAgICAgbGFuX3NoYWRvd19pbXIgfD0gVUFSVF9JTVJfVHhSRFk7ICAgLyogIChSZS0pRW5hYmxlICdUeFJEWScgaW50ZXJydXB0IGZyb20gVUFSVC4gICovCisgICAgfQorCisgIH0KKworCisgIGxhbl9zaGFkb3dfaW1yIHw9IFVBUlRfSU1SX1J4UkRZOyAgICAgICAvKiAgUmUtRW5hYmxlICdSeFJEWScgaW50ZXJydXB0IGZyb20gVUFSVC4gICovCisgICpQX0xBTl9JTVIgPSBsYW5fc2hhZG93X2ltcjsKKworCisKKyAgcmV0dXJuOworfQorLyogZW5kIG9mICdsYW5faXNyJworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGVU5DVElPTiBOQU1FOiAgIGxhbl9nZXRfY2hhcgorICoKKyAqCisgKiBERVNDUklQVElPTjogICAgIEZldGNoZXMgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgVUFSVC4KKyAqCisgKgorICogUkVUVVJOIFZBTFVFOiAgICAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisgKgorICoKKyAqIFVTRUQgR0xPQkFMIFZBUklBQkxFUzoKKyAqCisgKgorICogQUZGRUNURUQgR0xPQkFMIFZBUklBQkxFUy9TSURFIEVGRkVDVFM6CisgKgorICoKKyAqIE5PVEVTOgorICoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2xvbmcgICAgbGFuX2dldF9jaGFyKCB2b2lkICkKKworeworICBsb25nIHN0YXR1cyA9IC0yOyAvKiBBR0Q6IG5vdGhpbmcgZm91bmQgaW4gcmN2IGJ1ZmZlciAqLworCisgIGlmICggKlBfTEFOX1NSICYgTV9VQVJUX1NSX1J4UkRZICkKKyAgeworICAgIGNoYXIgYyA9IChjaGFyKSAqUF9MQU5fUkNWOworCisgICAgaWYgKCB0ZXN0X2VjaG8gKQorICAgIHsKKyAgICAgIExBTl9QVVRfQ0hBUiAoIGMgKTsKKyAgICB9CisKKyAgICBpZiAoIGMgPT0gQ09OVFJPTF9DICkKKyAgICB7CisgICAgICAgIC8qIGNhbid0IHN0b3AgdGhlIHRhcmdldCwgYnV0IHdlIGNhbiB0ZWxsIGdkYiB0byBzdG9wIHdhaXRpbmcuLi4gKi8KKyAgICAgIGRpc2NhcmRfcGFja2V0KCApOworICAgICAgcHV0cGFja2V0KCAiUzAzIiApOyAgICAgICAvKiBzZW5kIGJhY2sgU0lHSU5UIHRvIHRoZSBkZWJ1Z2dlciAqLworICAgICAgc3RhdHVzID0gMDsgICAgICAgICAgICAgICAvKiBzdWNjZXNzICovCisgICAgfQorCisgICAgZWxzZQorICAgIHsKKyAgICAgIGxhbl9hZGRfdG9fcXVldWUoIChsb25nKSBjLCAmbGFuX2lucHV0X3F1ZXVlICk7CisgICAgICBzdGF0dXMgPSBnZXRfZ2RiX2lucHV0KCAobG9uZykgYywgJmxhbl9pbnB1dF9xdWV1ZSApOworICAgIH0KKworICB9CisKKyAgcmV0dXJuKCBzdGF0dXMgKTsKK30KKy8qIGVuZCBvZiAnbGFuX2dldF9jaGFyJworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGVU5DVElPTiBOQU1FOiAgIGxhbl9wdXRfY2hhcgorICoKKyAqIERFU0NSSVBUSU9OOiAgICAgUHV0cyBhIGNoYXJhY3RlciBvdXQgdmlhIHRoZSBVQVJULgorICoKKyAqIFJFVFVSTiBWQUxVRTogICAgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICoKKyAqIFVTRUQgR0xPQkFMIFZBUklBQkxFUzogbm9uZS4KKyAqCisgKiBBRkZFQ1RFRCBHTE9CQUwgVkFSSUFCTEVTL1NJREUgRUZGRUNUUzoKKyAqCisgKiBOT1RFUzogISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICogICAgICAgICEhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISEKKyAqICAgICAgICAhISAgSWYgJ1hNVF9WSUFfQlBfRU5BQkxFRCgpJyBpcyBGQUxTRSB0aGVuIG91dHB1dCBpcyBUSFJPV04gQVdBWS4gICEhCisgKiAgICAgICAgISEgIFRoaXMgcHJldmVudHMgYW55b25lIGluZmluaXRlLWxvb3Bpbmcgb24gdGhpcyBmdW5jdGlvbi4gICAgICAgICAhIQorICogICAgICAgICEhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISEKKyAqICAgICAgICAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitsb25nICAgIGxhbl9wdXRfY2hhciggVUNIQVIgYyApCisKK3sKKyAgbG9uZyAgICBzdGF0dXMgPSAtMTsKKworICBpZiAoIFhNVF9WSUFfQlBfRU5BQkxFRCggKSApCisgIHsKKworICAgIGlmICggKlBfTEFOX1NSICYgTV9VQVJUX1NSX1R4UkRZICkKKyAgICB7CisgICAgICBsYW5fYWRkX3RvX3F1ZXVlKCAobG9uZykgYywgJmxhbl9vdXRwdXRfcXVldWUgKTsKKworICAgICAgYyA9IGxhbl9uZXh0X3F1ZXVlX2NoYXIoICZsYW5fb3V0cHV0X3F1ZXVlICk7CisKKyAgICAgICpQX0xBTl9YTVQgPSBjOworICAgICAgKyt0eF9ieV9wb2xsOworICAgICAgc3RhdHVzID0gMDsKKyAgICB9CisjaWYgMAorICAgIGVsc2UKKyAgICB7CisgICAgICBzdGF0dXMgPSAwOworICAgICAgbGFuX3NoYWRvd19pbXIgfD0gVUFSVF9JTVJfVHhSRFk7ICAgLyogIEVuYWJsZSAnVHhSRFknIGludGVycnVwdCBmcm9tIFVBUlQuICovCisgICAgICAqUF9MQU5fSU1SID0gbGFuX3NoYWRvd19pbXI7CisgICAgfQorI2VuZGlmCisgIH0KKworICBlbHNlCisgIHsKKyAgICBzdGF0dXMgPSAwOyAgIC8qIFlvdSBsb3NlOiBpbnB1dCBjaGFyYWN0ZXIgZ29lcyB0byB0aGUgYml0IGJ1Y2tldC4gKi8KKyAgfQorCisgIHJldHVybiggc3RhdHVzICk7Cit9CisvKiBlbmQgb2YgJ2xhbl9wdXRfY2hhcicKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRlVOQ1RJT04gTkFNRTogICBsYW5fdXRpbAorICoKKyAqIERFU0NSSVBUSU9OOgorICoKKyAqIFJFVFVSTiBWQUxVRToKKyAqCisgKiBVU0VEIEdMT0JBTCBWQVJJQUJMRVM6CisgKgorICogQUZGRUNURUQgR0xPQkFMIFZBUklBQkxFUy9TSURFIEVGRkVDVFM6CisgKgorICogTk9URVM6CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitVTE9ORyAgIGxhbl91dGlsKCBVTE9ORyAqcGFybSApCisKK3sKKworCisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCisgICAgVUxPTkcgcmF0ZV9jb2RlOworICAgIFVDSEFSIGFjcl9zZXR0aW5nOworICAgIFVDSEFSIGNzcl9zZXR0aW5nOworCisgIH0gYmF1ZF9yYXRlX3NldHRpbmcgW10gPSB7CisKKyAgICB7IDB4Mzg0MDAsIExBTl9BQ1JfU0VMRUNUX0JSR18wLCBVQVJUX0NTUl9CUl8zODQwMCB9LAorICAgIHsgMHgxOTIwMCwgTEFOX0FDUl9TRUxFQ1RfQlJHXzEsIFVBUlRfQ1NSX0JSXzE5MjAwIH0sCisgICAgeyAweDk2MDAsICBMQU5fQUNSX1NFTEVDVF9CUkdfMCwgVUFSVF9DU1JfQlJfOTYwMCAgfSwKKyAgICB7IDB4NDgwMCwgIExBTl9BQ1JfU0VMRUNUX0JSR18wLCBVQVJUX0NTUl9CUl80ODAwICB9CisgIH07CisKKworI2RlZmluZSBCT0dVU19QMSAgICAgICAgMHhFMQorI2RlZmluZSBCT0dVU19QMiAgICAgICAgMHhFMgorCisgIFVMT05HICAgbm90X2RvbmVfY29kZTsKKworCisgIFVMT05HICAgb3Bjb2RlOworICBVTE9ORyAgIHBhcm1fMTsKKyAgVUxPTkcgICBwYXJtXzI7CisKKyAgaW50ICAgICBpOworICBVQ0hBUiAgIGM7CisKKworICBub3RfZG9uZV9jb2RlID0gMDsKKworICBvcGNvZGUgPSBwYXJtWyAxIF07CisgIHBhcm1fMSA9IHBhcm1bIDIgXTsKKyAgcGFybV8yID0gcGFybVsgMyBdOworCisKKyAgc3dpdGNoICggb3Bjb2RlICkKKyAgeworCisgICAgY2FzZSBMQU5fSU5JVDoKKyAgICAgIHsKKworICAgICAgICBsYW5faW5pdCggKTsKKyAgICAgICAgcHJpbnRwKCAiXG5cbiAgSW50ZXJmYWNlIChSZSlJbml0aWFsaXplZCAuLi5cblxuIiApOworCisgICAgICAgIGJyZWFrOworICAgICAgfQorCisKKyAgICBjYXNlIExBTl9CQVVEOgorICAgICAgeworCisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgKGludCkoc2l6ZW9mKGJhdWRfcmF0ZV9zZXR0aW5nKSAvIHNpemVvZihiYXVkX3JhdGVfc2V0dGluZ1swXSkpOyBpICsrICkKKyAgICAgICAgeworICAgICAgICAgIGlmICggYmF1ZF9yYXRlX3NldHRpbmdbaV0ucmF0ZV9jb2RlID09IHBhcm1fMSApCisgICAgICAgICAgeworICAgICAgICAgICAgYmF1ZF9yYXRlX2lkeCA9IGk7CisgICAgICAgICAgICAqUF9MQU5fQUNSID0gYmF1ZF9yYXRlX3NldHRpbmdbaV0uYWNyX3NldHRpbmc7CisgICAgICAgICAgICAqUF9MQU5fQ1NSID0gYmF1ZF9yYXRlX3NldHRpbmdbaV0uY3NyX3NldHRpbmc7CisgICAgICAgICAgICBwcmludHAgKCAiQmF1ZCByYXRlIHNldCB0byAlWCFcbiIsIGJhdWRfcmF0ZV9zZXR0aW5nW2ldLnJhdGVfY29kZSApOworICAgICAgICAgICAgcmV0dXJuKCBub3RfZG9uZV9jb2RlICk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpbnRwKCAiXG5cbiAgKioqIFNZTlRBWCBFcnJvciAgLSAgSW52YWxpZCBiYXVkcmF0ZSAoUDIpXG5cbiIgKTsKKyAgICAgICAgbm90X2RvbmVfY29kZSA9IEJPR1VTX1AyOworCisgICAgICAgIGJyZWFrOworICAgICAgfQorCisKKyAgICBjYXNlIExBTl9JTlRSOgorICAgICAgeworCisgICAgICAgIHN3aXRjaCAoIHBhcm1fMSApCisgICAgICAgIHsKKworICAgICAgICAgIGNhc2UgMHgwRDogLyogRGlzYWJsZSAnUnhSRFknIEludGVycnVwdHMgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbGFuX3NoYWRvd19pbXIgJj0gflVBUlRfSU1SX1J4UkRZOworICAgICAgICAgICAgICAqUF9MQU5fSU1SID0gbGFuX3NoYWRvd19pbXI7CisgICAgICAgICAgICAgIHByaW50cCggIlxuXG4gIFJlY2VpdmUgUmVhZHkgSW50ZXJydXB0cyBESVNBQkxFRCAuLi5cblxuIiApOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGNhc2UgMHgwRTogLyogRW5hYmxlICdSeFJEWScgSW50ZXJydXB0cyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBsYW5fc2hhZG93X2ltciB8PSBVQVJUX0lNUl9SeFJEWTsKKyAgICAgICAgICAgICAgKlBfTEFOX0lNUiA9IGxhbl9zaGFkb3dfaW1yOworICAgICAgICAgICAgICBwcmludHAoICJcblxuICBSZWNlaXZlIFJlYWR5IEludGVycnVwdHMgRU5BQkxFRCAuLi5cblxuIiApOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50cCggIlxuXG4gICoqKiBTWU5UQVggRXJyb3IgIC0gIEludmFsaWQgUDIgKHVzZSBEIG9yIEUpXG5cbiIgKTsKKyAgICAgICAgICAgICAgbm90X2RvbmVfY29kZSA9IEJPR1VTX1AyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKworICAgIGNhc2UgTEFOX1hNVDoKKyAgICAgIHsKKworICAgICAgICBzd2l0Y2ggKCBwYXJtXzEgKQorICAgICAgICB7CisKKyAgICAgICAgICBjYXNlIDB4MEU6IC8qIEVuYWJsZSBUcmFuc21pc3Npb24tdmlhLUJhY2twbGFuZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoICEoKlBfTEFOMFRSX1JFRyAmIE1fTEFOMFRSKSApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqUF9MQU4wVFJfUkVHIHw9IE1fTEFOMFRSOyAgLyogMCAtPiAxICovCisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBwcmludHAoICJcblxuICBUcmFuc21pdC12aWEtQmFja3BsYW5lIEVOQUJMRUQgLi4uXG5cbiIgKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBjYXNlIDB4MEQ6IC8qIERpc2FibGUgVHJhbnNtaXNzaW9uLXZpYS1CYWNrcGxhbmUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCAqUF9MQU4wVFJfUkVHICYgTV9MQU4wVFIgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKlBfTEFOMFRSX1JFRyAmPSB+TV9MQU4wVFI7IC8qIDEgLT4gMCAqLworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcHJpbnRwKCAiXG5cbiAgVHJhbnNtaXQtdmlhLUJhY2twbGFuZSBESVNBQkxFRCAuLi5cblxuIiApOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50cCggIlxuXG4gICoqKiBTWU5UQVggRXJyb3IgIC0gIEludmFsaWQgUDIgKHVzZSBEIG9yIEUpXG5cbiIgKTsKKyAgICAgICAgICAgICAgbm90X2RvbmVfY29kZSA9IEJPR1VTX1AyOworICAgICAgICAgICAgICBsYW5fdXRpbF9tZW51KCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKworICAgIGNhc2UgTEFOX1NUQVQ6CisgICAgICB7CisKKyAgICAgIHByaW50cCggIlxuICAgICAgICAgICAgICAtLSBTdGF0dXMgLS1cblxuIiApOworCisgICAgICAgIHByaW50cCggIiAgICAgICAgICBCYXVkIFJhdGU6ICVYICpcbiIsICAgYmF1ZF9yYXRlX3NldHRpbmdbIGJhdWRfcmF0ZV9pZHggXS5yYXRlX2NvZGUgKTsKKyAgICAgICAgcHJpbnRwKCAiICAgICAgICAgWG10LXZpYS1CUDogJXMgKlxuIiwgICBTVEFUVVMoIFhNVF9WSUFfQlBfRU5BQkxFRCggKSApICk7CisgICAgICAgIHByaW50cCggIiAgICAgICAgIFJ4UmR5IEludHI6ICVzICpcbiIsICAgU1RBVFVTKCAobGFuX3NoYWRvd19pbXIgJiBNX1VBUlRfSVNSX1J4UkRZKSApICk7CisgICAvKioqIHByaW50cCggIiAgICAgICAgIFR4UmR5IEludHI6ICVzXG4iLCAgICAgU1RBVFVTKCAobGFuX3NoYWRvd19pbXIgJiBNX1VBUlRfSVNSX1R4UkRZKSApICk7ICoqKi8KKyAgICAgICAgcHJpbnRwKCAiICAgICAgICAgICAgICAgRWNobzogJXMgKlxuXG4iLCBTVEFUVVMoIHRlc3RfZWNobyApICk7CisKKyAgICAgICAgcHJpbnRwKCAiICAgICAgICAgICAgICAgIElNUjogJTAyWFxuIiwgKFVMT05HKSBsYW5fc2hhZG93X2ltciApOworICAgICAgICBwcmludHAoICIgICAgICAgICAgICAgICAgSVNSOiAlMDJYXG4iLCAoVUxPTkcpICpQX0xBTl9JU1IgKTsKKyAgICAgICAgcHJpbnRwKCAiICAgICAgICAgICAgICAgICBTUjogJTAyWFxuXG4iLCAoVUxPTkcpICpQX0xBTl9TUiApOworCisgICAgICAgIHByaW50cCggIiAgICBJbnB1dCBPdmVyZmxvd3M6ICVkXG5cbiIsIGxhbl9pbnB1dF9xdWV1ZS5vdmVyZmxvd3MgKTsKKworICAgICAgICBwcmludHAoICIgICAgICAgICBUeCBieSBJbnRyOiAlZFxuIiwgdHhfYnlfaW50ciAgKTsKKyAgICAgICAgcHJpbnRwKCAiICAgICAgICAgVHggYnkgUG9sbDogJWRcblxuIiwgdHhfYnlfcG9sbCApOworCisgICAgICAgIHByaW50cCggIiAgICAgICAgICogIENhbiBiZSBzZXQgb3IgdG9nZ2xlZCB2aWEgVXRpbGl0eSAlMlguXG5cbiIsIChVTE9ORykgTEFOX1VUSUxfQ09ERSApOworCisgICAgICAgIGJyZWFrOworICAgICAgfQorCisKKyAgICBjYXNlIExBTl9JTjoKKyAgICAgIHsKKworICAgICAgICBzd2l0Y2ggKCBwYXJtXzEgKQorICAgICAgICB7CisKKyAgICAgICAgICBjYXNlIDB4MEM6IC8qIENsZWFyIGFuZCBSZXNldCBRdWV1ZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBsYW5faW5pdF9xdWV1ZSggJmxhbl9pbnB1dF9xdWV1ZSApOworICAgICAgICAgICAgICBwcmludHAoICJcblxuICBRdWV1ZSBDTEVBUkVEL1JFU0VUIC4uLlxuXG4iICk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgY2FzZSAweDBEOiAvKiBEaXNwbGF5IFF1ZXVlICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50cCggIlxuICAgICAgICAgICAgICAgICAgICAgICAgLS0gSW5wdXQgUXVldWUgLS1cbiIgKTsKKyAgICAgICAgICAgICAgcHJpbnRwKCAiXG4gICAgICAgIEhlYWQgSW5kZXg6ICU4WCAgICAgVGFpbCBJbmRleDogJThYXG5cbiAgICAiLAorICAgICAgICAgICAgICAgICAgICAgKFVMT05HKSBsYW5faW5wdXRfcXVldWUuaGVhZF9pbmRleCwgKFVMT05HKSBsYW5faW5wdXRfcXVldWUudGFpbF9pbmRleCApOworCisgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgTUFYX1JTMjMyX0NIQVJTOyArK2kgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRwKCAiICUwMlgiLCAoVUxPTkcpIGxhbl9pbnB1dF9xdWV1ZS5idWZbIGkgXSApOworCisgICAgICAgICAgICAgICAgaWYgKCAxNSA9PSAoaSAlIDE2KSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICAgICAgICAgIHByaW50cCAoICIgICAgIiApOworICAgICAgICAgICAgICAgICAgZm9yICggaiA9IGkgLSAxNTsgaiA8PSBpOyBqKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsYW5faW5wdXRfcXVldWUuYnVmWyBqIF0gPj0gJyAnICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbl9pbnB1dF9xdWV1ZS5idWZbIGogXSA8IDEyNyApCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludHAgKCAiJWMiLCBsYW5faW5wdXRfcXVldWUuYnVmWyBqIF0gKTsKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludHAgKCAiLiIgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgcHJpbnRwKCAiXG4gICAgIiApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCA3ID09IChpICUgOCkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHByaW50cCggIiAiICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBwcmludHAoICJcbiIgKTsKKworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGNhc2UgMHgwRjogLyogRmV0Y2ggbmV4dCBjaGFyYWN0ZXIgaW4gUXVldWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYyA9IGxhbl9uZXh0X3F1ZXVlX2NoYXIoICZsYW5faW5wdXRfcXVldWUgKTsKKworICAgICAgICAgICAgICBpZiAoIGMgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRwKCAiXG5cbiAgTmV4dCBDaGFyYWN0ZXI6ICIgKTsKKyAgICAgICAgICAgICAgICBpZiAoICAweDIxIDw9IGMgICYmICBjIDw9IDB4N0YgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHByaW50cCggIiVjXG5cbiIsIChVTE9ORykgYyApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAweDIwID09ICgoVUNIQVIpIGMpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwcmludHAoICI8c3BhY2U+XG5cbiIgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcHJpbnRwKCAiJTAyWFxuXG4iLCAoVUxPTkcpIGMgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludHAoICJcblxuICBJbnB1dCBRdWV1ZSBFTVBUWSAuLi5cblxuIiApOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50cCggIlxuXG4gICoqKiBTWU5UQVggRXJyb3IgIC0gIEludmFsaWQgUDIgLi4uXG5cbiIgKTsKKyAgICAgICAgICAgIG5vdF9kb25lX2NvZGUgPSBCT0dVU19QMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIGJyZWFrOworICAgICAgfQorCisKKyAgICBjYXNlIExBTl9PVVQ6CisgICAgICB7CisKKyAgICAgICAgc3dpdGNoICggcGFybV8xICkKKyAgICAgICAgeworCisgICAgICAgICAgY2FzZSAweDBDOiAvKiBDbGVhciBhbmQgUmVzZXQgUXVldWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbGFuX2luaXRfcXVldWUoICZsYW5fb3V0cHV0X3F1ZXVlICk7CisgICAgICAgICAgICAgIHByaW50cCggIlxuXG4gIFF1ZXVlIENMRUFSRUQvUkVTRVQgLi4uXG5cbiIgKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBjYXNlIDB4MEQ6IC8qIERpc3BsYXkgUXVldWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgcHJpbnRwKCAiXG4gICAgICAgICAgICAgICAgICAgICAgIC0tIE91dHB1dCBRdWV1ZSAtLVxuIiApOworICAgICAgICAgICAgICBwcmludHAoICJcbiAgICAgICAgSGVhZCBJbmRleDogJThYICAgICBUYWlsIEluZGV4OiAlOFhcblxuICAgICIsCisgICAgICAgICAgICAgICAgICAgICAoVUxPTkcpIGxhbl9vdXRwdXRfcXVldWUuaGVhZF9pbmRleCwgKFVMT05HKSBsYW5fb3V0cHV0X3F1ZXVlLnRhaWxfaW5kZXggKTsKKworICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IE1BWF9SUzIzMl9DSEFSUzsgKytpICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50cCggIiAlMDJYIiwgKFVMT05HKSBsYW5fb3V0cHV0X3F1ZXVlLmJ1ZlsgaSBdICk7CisKKyAgICAgICAgICAgICAgICBpZiAoIDE1ID09IChpICUgMTYpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgICAgICAgcHJpbnRwICggIiAgICAiICk7CisgICAgICAgICAgICAgICAgICBmb3IgKCBqID0gaSAtIDE1OyBqIDw9IGk7IGorKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxhbl9vdXRwdXRfcXVldWUuYnVmWyBqIF0gPj0gJyAnICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbl9vdXRwdXRfcXVldWUuYnVmWyBqIF0gPCAxMjcgKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRwICggIiVjIiwgbGFuX291dHB1dF9xdWV1ZS5idWZbIGogXSApOworICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50cCAoICIuIiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBwcmludHAoICJcbiAgICAiICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIDcgPT0gKGkgJSA4KSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgcHJpbnRwKCAiICIgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHByaW50cCggIlxuIiApOworCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgY2FzZSAweDBGOiAvKiBGZXRjaCBuZXh0IGNoYXJhY3RlciBpbiBRdWV1ZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICBjID0gbGFuX25leHRfcXVldWVfY2hhciggJmxhbl9vdXRwdXRfcXVldWUgKTsKKworICAgICAgICAgICAgICBpZiAoIGMgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRwKCAiXG5cbiAgTmV4dCBDaGFyYWN0ZXI6ICIgKTsKKyAgICAgICAgICAgICAgICBpZiAoICAweDIxIDw9IGMgICYmICBjIDw9IDB4N0YgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHByaW50cCggIiVjXG5cbiIsIChVTE9ORykgYyApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAweDIwID09IGMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHByaW50cCggIjxzcGFjZT5cblxuIiApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBwcmludHAoICIlMDJYXG5cbiIsIChVTE9ORykgYyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50cCggIlxuXG4gIElucHV0IFF1ZXVlIEVNUFRZIC4uLlxuXG4iICk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICBwcmludHAoICJcblxuICAqKiogU1lOVEFYIEVycm9yICAtICBJbnZhbGlkIFAyIC4uLlxuXG4iICk7CisgICAgICAgICAgICBub3RfZG9uZV9jb2RlID0gQk9HVVNfUDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgICAgfQorCisKKyAgICBjYXNlIExBTl9FQ0hPOgorICAgICAgeworCisgICAgICAgIHN3aXRjaCAoIHBhcm1fMSApCisgICAgICAgIHsKKworICAgICAgICAgIGNhc2UgMHgwRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdGVzdF9lY2hvID0gRU5BQkxFRDsKKyAgICAgICAgICAgICAgcHJpbnRwKCAiXG5cbiAgVGVzdCBlY2hvIEVOQUJMRUQgLi4uXG5cbiIgKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBjYXNlIDB4MEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHRlc3RfZWNobyA9IERJU0FCTEVEOworICAgICAgICAgICAgICBwcmludHAoICJcblxuICBUZXN0IGVjaG8gRElTQUJMRUQgLi4uXG5cbiIgKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICBwcmludHAoICJcblxuICAqKiogU1lOVEFYIEVycm9yICAtICBJbnZhbGlkIFAyIC4uLlxuXG4iICk7CisgICAgICAgICAgICAgIG5vdF9kb25lX2NvZGUgPSBCT0dVU19QMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICAgIH0KKworCisgICAgY2FzZSBMQU5fUFVUQzoKKyAgICAgIHsKKworICAgICAgICBpZiAoIDB4MjAgPCBwYXJtXzEgICYmICBwYXJtXzEgPCAweDdGICkKKyAgICAgICAgeworICAgICAgICAgIGlmICggbGFuX3B1dF9jaGFyKCAoVUNIQVIpIHBhcm1fMSApICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBwcmludHAoICJcblxuICAqKiogJ2xhbl9wdXRfY2hhcicgRXJyb3IgLi4uXG4iICk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50cCggIlxuXG4gIE8uSy4gLi4uXG4iICk7CisgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBwcmludHAoICJcblxuICAqKiogRXJyb3IgIC0gIGNoYXJhY3RlciBtdXN0IGJlIGluIHRoZSAweDIxLTB4N0UgcmFuZ2UgLi4uXG4iICk7CisgICAgICAgICAgbm90X2RvbmVfY29kZSA9IEJPR1VTX1AyOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKy8qKioKKyAgICBjYXNlIExBTl9XUE06CisgICAgICB7CisKKyAgICAgICAgaWYgKCB3cml0ZV90b19wcm90ZWN0ZWRfbWVtKCAodm9pZCAqKSBwYXJtXzEsICh1bnNpZ25lZCBzaG9ydCkgcGFybV8yICkgKQorICAgICAgICB7CisgICAgICAgICAgcHJpbnRwKCAiXG4gIFdyaXRlIHRvIHByb3RlY3RlZCBtZW1vcnkgRkFJTEVEIC4uLlxuIiApOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisqKiovCisKKyAgICBjYXNlIDA6IC8qIG5vIGFyZ3VtZW50IC0tIHByaW50IG1lbnUgKi8KKyAgICAgIHsKKyAgICAgICAgbGFuX3V0aWxfbWVudSggKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKworICAgIGRlZmF1bHQ6CisgICAgICB7CisgICAgICAgIHBhcm1fMiA9IDA7ICAvKiB0byBzdXByZXNzIGNvbXBpbGVyIHdhcm5pbmcgd2l0aCAnTEFOX1dQTScgY2FzZSBkaXNhYmxlZCAqLworCisgICAgICAgIHByaW50cCggIlxuXG4gICoqKiBTWU5UQVggRXJyb3IgIC0gIEludmFsaWQgUDEgLi4uXG5cbiIgKTsKKyAgICAgICAgbm90X2RvbmVfY29kZSA9IEJPR1VTX1AxOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworCisgIH0gLyogIEVuZCBvZiAnc3dpdGNoICggb3Bjb2RlICknLiAqLworCisKK3JldHVybiggbm90X2RvbmVfY29kZSApOworfQorLyogZW5kIG9mICdsYW5fdXRpbCcKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisgICAgICAgICAgICAgICAgICAvKiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSoKKyAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgKiAgICAgICAgIExvY2FsIE1vZHVsZSBGdW5jdGlvbnMgICAgICAqCisgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgIColJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRlVOQ1RJT04gTkFNRTogICBsYW5fcmVzZXQKKyAqCisgKiBERVNDUklQVElPTjogICAgIFJlc2V0cyB0aGUgTEFOIFVBUlQgYnkgc3Ryb2JpbmcgdGhlICdSU1RfTEFOX1VBUlQnIGJpdCBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgU2hhcmVkIENvbnRyb2wgMSBhcmVhLgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIF98ICAgICAgIF9fX19fXworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAgIHwgICAgICB8ICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgX3xfX19fX198ICAgICAgfF9fX19fXworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0+IHQKKyAqCisgKiBSRVRVUk4gVkFMVUU6ICAgIE5vbmUuCisgKgorICogVVNFRCBHTE9CQUwgVkFSSUFCTEVTOgorICoKKyAqIEFGRkVDVEVEIEdMT0JBTCBWQVJJQUJMRVMvU0lERSBFRkZFQ1RTOgorICoKKyAqIE5PVEVTOiAgICAgICAgICAgSC9XIGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgdGhhdCBhIGJ5dGUgaW4gdGhlIHNoYXJlZAorICogICAgICAgICAgICAgICAgICBjb250cm9sIDEgYXJlYSBtdXN0IGJlIHJlYWQgYmVmb3JlIGJlaW5nIHdyaXR0ZW4uCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgIHZvaWQgICAgbGFuX3Jlc2V0KCB2b2lkICkKKworeworCisgIHdoaWxlICggKlBfUlNUX0xBTl9VQVJUX1JFRyAmIE1fUlNUX0xBTl9VQVJUICkKKyAgeworICAgICpQX1JTVF9MQU5fVUFSVF9SRUcgJj0gfk1fUlNUX0xBTl9VQVJUOyAgICAgLyogMCAqLworICB9CisKKyAgd2hpbGUgKCAhKCpQX1JTVF9MQU5fVUFSVF9SRUcgJiBNX1JTVF9MQU5fVUFSVCkgKQorICB7CisgICAgKlBfUlNUX0xBTl9VQVJUX1JFRyB8PSBNX1JTVF9MQU5fVUFSVDsgICAgICAvKiAxICovCisgIH0KKworICB3aGlsZSAoICpQX1JTVF9MQU5fVUFSVF9SRUcgJiBNX1JTVF9MQU5fVUFSVCApCisgIHsKKyAgICAqUF9SU1RfTEFOX1VBUlRfUkVHICY9IH5NX1JTVF9MQU5fVUFSVDsgICAgIC8qIDAgKi8KKyAgfQorCit9CisvKiBlbmQgb2YgJ2xhbl9yZXNldCcKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRlVOQ1RJT04gTkFNRTogICBsYW5fY29uZmlndXJlCisgKgorICoKKyAqIERFU0NSSVBUSU9OOgorICoKKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKgorICoKKyAqIFVTRUQgR0xPQkFMIFZBUklBQkxFUzoKKyAqCisgKgorICogQUZGRUNURUQgR0xPQkFMIFZBUklBQkxFUy9TSURFIEVGRkVDVFM6CisgKgorICoKKyAqIE5PVEVTOgorICoKKyAqCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgIHZvaWQgICAgbGFuX2NvbmZpZ3VyZSggdm9pZCApCisKK3sKKworICAqUF9MQU5fQ1IgPSBVQVJUX0NSX1JFU0VUX01SX1BUUjsgICAgICAgLyogIFBvaW50cyB0byBNUjEuICAgICAgICAqLworICAqUF9MQU5fQ1IgPSBVQVJUX0NSX1JFU0VUX1JWQ1I7ICAgICAgICAgLyogIFJlY2VpdmVyIGRpc2FibGVkLiAgICAqLworICAqUF9MQU5fQ1IgPSBVQVJUX0NSX1JFU0VUX1hNVFI7ICAgICAgICAgLyogIFRyYW5zbWl0dGVyIGRpc2FibGVkLiAqLworICAqUF9MQU5fQ1IgPSBVQVJUX0NSX1JFU0VUX0VSUk9SX1NUQVRVUzsKKyAgKlBfTEFOX0NSID0gVUFSVF9DUl9SRVNFVF9CUktfQ0hHX0lOVDsKKworICAqUF9MQU5fTVIxID0gREVGQVVMVF9MQU5fTVIxOworICAqUF9MQU5fTVIyID0gREVGQVVMVF9MQU5fTVIyOworCisgICpQX0xBTl9BQ1IgPSBERUZBVUxUX0xBTl9BQ1I7CisKKyAgKlBfTEFOX0NTUiA9IFVBUlRfQ1NSX0JSXzk2MDA7CisgIGJhdWRfcmF0ZV9pZHggPSAyOworCisgICpQX0xBTl9DVFVSID0gREVGQVVMVF9MQU5fQ1RVUjsKKyAgKlBfTEFOX0NUTFIgPSBERUZBVUxUX0xBTl9DVExSOworCisgICpQX0xBTl9DUiA9IChVQVJUX0NSX1NUQVJUX0NOVFJfVElNRVIgfCBVQVJUX0NSX0VOQUJMRV9YTVRSIHwgVUFSVF9DUl9FTkFCTEVfUkNWUik7CisKKyAgbGFuX3NoYWRvd19pbXIgPSBVQVJUX0lNUl9SeFJEWTsgICAgICAgIC8qICBFbmFibGUgb25seSAnUnhSRFknIGludGVycnVwdCBmcm9tIFVBUlQuICovCisgICpQX0xBTl9JTVIgPSBsYW5fc2hhZG93X2ltcjsKKworICB0eF9ieV9pbnRyID0gMDsKKyAgdHhfYnlfcG9sbCA9IDA7CisKKyAgcmV0dXJuOworfQorLyogZW5kIG9mICdsYW5fY29uZmlndXJlJworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGVU5DVElPTiBOQU1FOiAgIGxhbl9pbml0X3F1ZXVlCisgKgorICogREVTQ1JJUFRJT046CisgKgorICogUkVUVVJOIFZBTFVFOiAgICBOb25lLgorICoKKyAqIFVTRUQgR0xPQkFMIFZBUklBQkxFUzoKKyAqCisgKiBBRkZFQ1RFRCBHTE9CQUwgVkFSSUFCTEVTL1NJREUgRUZGRUNUUzoKKyAqCisgKiBOT1RFUzoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyAgdm9pZCAgICBsYW5faW5pdF9xdWV1ZSggVF9SUzIzMl9RVUVVRSAqcF9xdWV1ZSApCisKK3sKKyAgbG9uZyBpOworCisgICAgLyoKKyAgICAqICAgV2Ugc2V0ICJoZWFkIiBlcXVhbCB0byAidGFpbCIgaW1wbHlpbmcgdGhlIHF1ZXVlIGlzIGVtcHR5LAorICAgICogICBCVVQgdGhlICJoZWFkIiBhbmQgInRhaWwiIHNob3VsZCBlYWNoIHBvaW50IHRvIHZhbGlkIHF1ZXVlCisgICAgKiAgIHBvc2l0aW9ucy4KKyAgICAqLworCisgIHBfcXVldWUtPmhlYWRfaW5kZXggPSAwOworICBwX3F1ZXVlLT50YWlsX2luZGV4ID0gMDsKKworICBwX3F1ZXVlLT5vdmVyZmxvd3MgPSAwOworCisgIHBfcXVldWUtPmdkYl9wYWNrZXRfc3RhcnQgPSAtMTsKKyAgcF9xdWV1ZS0+Z2RiX3BhY2tldF9lbmQgICA9IC0xOworCisgIHBfcXVldWUtPmdkYl9wYWNrZXRfY3N1bTEgPSAtMTsKKyAgcF9xdWV1ZS0+Z2RiX3BhY2tldF9jc3VtMiA9IC0xOworCisgIGZvciAoIGkgPSAwOyBpIDwgTUFYX1JTMjMyX0NIQVJTOyArK2kgKQorICB7CisgICAgcF9xdWV1ZS0+YnVmWyBpIF0gPSAwOworICB9CisKKyAgcmV0dXJuOworfQorLyogZW5kIG9mICdsYW5faW5pdF9xdWV1ZScKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRlVOQ1RJT04gTkFNRTogICBsYW5fYWRkX3RvX3F1ZXVlCisgKgorICoKKyAqIERFU0NSSVBUSU9OOiAgICAgQWRkcyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciB0byB0aGUgdGFpbCBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHF1ZXVlLiAgT2JzZXJ2ZXMgIm9sZGVzdCB0aHJvd24gb24gZmxvb3IiCisgKiAgICAgICAgICAgICAgICAgIHJ1bGUgKGkuZS4gdGhlIHF1ZXVlIGlzIGFsbG93ZWQgdG8gIndyYXAiIGFuZCB0aGUKKyAqICAgICAgICAgICAgICAgICAgaW5wdXQgY2hhcmFjdGVyIGlzIHVuY29uZGl0aW9uYWxseSBwbGFjZWQgYXQgdGhlCisgKiAgICAgICAgICAgICAgICAgIHRhaWwgb2YgdGhlIHF1ZXVlLgorICoKKyAqCisgKiBSRVRVUk4gVkFMVUU6ICAgIE5vbmUuCisgKgorICoKKyAqIFVTRUQgR0xPQkFMIFZBUklBQkxFUzoKKyAqCisgKgorICogQUZGRUNURUQgR0xPQkFMIFZBUklBQkxFUy9TSURFIEVGRkVDVFM6CisgKgorICoKKyAqIE5PVEVTOgorICoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyAgdm9pZCAgICBsYW5fYWRkX3RvX3F1ZXVlKCBsb25nIGMsIFRfUlMyMzJfUVVFVUUgKnBfcXVldWUgKQorCit7CisKKyAgaWYgKCBwX3F1ZXVlICkgICAgLyogIFNhbml0eSBjaGVjay4gKi8KKyAgeworCisgICAgaWYgKCBjICYgMHgwMDAwMDBGRiApICAgLyogIFdlIGRvbid0IGFsbG93IE5VTEwgY2hhcmFjdGVycyB0byBiZSBhZGRlZCB0byBhIHF1ZXVlLiAgKi8KKyAgICB7CisgICAgICAgIC8qICBJbnNlcnQgdGhlIG5ldyBjaGFyYWN0ZXIgYXQgdGhlIHRhaWwgb2YgdGhlIHF1ZXVlLiAgKi8KKworICAgICAgcF9xdWV1ZS0+YnVmWyBwX3F1ZXVlLT50YWlsX2luZGV4IF0gPSAoVUNIQVIpIChjICYgMHgwMDAwMDBGRik7CisKKyAgICAgICAgLyogIEluY3JlbWVudCB0aGUgdGFpbCBpbmRleC4gKi8KKworICAgICAgaWYgKCBNQVhfUlMyMzJfQ0hBUlMgPD0gKysocF9xdWV1ZS0+dGFpbF9pbmRleCkgKQorICAgICAgeworICAgICAgICBwX3F1ZXVlLT50YWlsX2luZGV4ID0gMDsKKyAgICAgIH0KKworICAgICAgICAvKiAgQ2hlY2sgZm9yIHdyYXBwaW5nIChpLmUuIG92ZXJmbG93KS4gKi8KKworICAgICAgaWYgKCBwX3F1ZXVlLT5oZWFkX2luZGV4ID09IHBfcXVldWUtPnRhaWxfaW5kZXggKQorICAgICAgeworICAgICAgICAgIC8qICBJZiB0aGUgdGFpbCBoYXMgY2F1Z2h0IHVwIHRvIHRoZSBoZWFkIHJlY29yZCB0aGUgb3ZlcmZsb3cgLiAuIC4gKi8KKworICAgICAgICArKyhwX3F1ZXVlLT5vdmVyZmxvd3MpOworCisgICAgICAgICAgLyogIC4gLiAuIHRoZW4gaW5jcmVtZW50IHRoZSBoZWFkIGluZGV4LiAgKi8KKworICAgICAgICBpZiAoIE1BWF9SUzIzMl9DSEFSUyA8PSArKyhwX3F1ZXVlLT5oZWFkX2luZGV4KSApCisgICAgICAgIHsKKyAgICAgICAgICBwX3F1ZXVlLT5oZWFkX2luZGV4ID0gMDsKKyAgICAgICAgfQorCisgICAgICB9CisKKyAgICB9IC8qICBFbmQgb2YgJ2lmICggYyAmIDB4MDAwMDAwRkYgKScuICovCisKKyAgfSAvKiAgRW5kIG9mICdpZiAoIHBfcXVldWUgKScuICAqLworCisKKyAgcmV0dXJuOworfQorLyogZW5kIG9mICdsYW5fYWRkX3RvX3F1ZXVlJworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGVU5DVElPTiBOQU1FOiAgIGxhbl9uZXh0X3F1ZXVlX2NoYXIKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCisgKiBSRVRVUk4gVkFMVUU6CisgKgorICogVVNFRCBHTE9CQUwgVkFSSUFCTEVTOgorICoKKyAqIEFGRkVDVEVEIEdMT0JBTCBWQVJJQUJMRVMvU0lERSBFRkZFQ1RTOgorICoKKyAqIE5PVEVTOgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljICBVQ0hBUiAgIGxhbl9uZXh0X3F1ZXVlX2NoYXIoIFRfUlMyMzJfUVVFVUUgKnBfcXVldWUgKQorCit7CisgIFVDSEFSICAgYzsKKworCisgIGMgPSAwOworCisgIGlmICggcF9xdWV1ZSApCisgIHsKKworICAgIGlmICggcF9xdWV1ZS0+aGVhZF9pbmRleCAhPSBwX3F1ZXVlLT50YWlsX2luZGV4ICkKKyAgICB7CisgICAgICAgIC8qICBSZXR1cm4gdGhlICdvbGRlc3QnIGNoYXJhY3RlciBpbiB0aGUgcXVldWUuICovCisKKyAgICAgIGMgPSBwX3F1ZXVlLT5idWZbIHBfcXVldWUtPmhlYWRfaW5kZXggXTsKKworICAgICAgICAvKiAgSW5jcmVtZW50IHRoZSBoZWFkIGluZGV4LiAqLworCisgICAgICBpZiAoIE1BWF9SUzIzMl9DSEFSUyA8PSArKyhwX3F1ZXVlLT5oZWFkX2luZGV4KSApCisgICAgICB7CisgICAgICAgIHBfcXVldWUtPmhlYWRfaW5kZXggPSAwOworICAgICAgfQorCisgICAgfQorCisgIH0gLyogIEVuZCBvZiAnaWYgKCBwX3F1ZXVlICknLiAgKi8KKworCisgIHJldHVybiggYyApOworfQorCisvKiBlbmQgb2YgJ2xhbl9uZXh0X3F1ZXVlX2NoYXInCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZVTkNUSU9OIE5BTUU6ICAgbGFuX3V0aWxfbWVudQorICoKKyAqIERFU0NSSVBUSU9OOiAgICAgUHJpbnRzIG91dCBhIGJyaWVmIGhlbHAgb24gdGhlIExBTiBVQVJUIGNvbnRyb2wgdXRpbGl0eS4KKyAqCisgKiBSRVRVUk4gVkFMVUU6ICAgIE5vbmUuCisgKgorICogVVNFRCBHTE9CQUwgVkFSSUFCTEVTOiBOb25lLgorICoKKyAqIEFGRkVDVEVEIEdMT0JBTCBWQVJJQUJMRVMvU0lERSBFRkZFQ1RTOiBOb25lLgorICoKKyAqIE5PVEVTOiBOb25lLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljICB2b2lkICAgIGxhbl91dGlsX21lbnUoIHZvaWQgKQorCit7CisKKyAgLyoKKyAgICogTXVsdGlwbHkgY2FsbGluZyBwcmludHAoKSBiZWxvdyBpcyBtYWRlIGR1ZSB0byB0aGUgbGltaXRhdGlvbnMKKyAgICogb2YgcHJpbnRwKCksIGluY2FwYWJsZSBvZiBoYW5kbGluZyBsb25nIGZvcm1hdHRpbmcgY29uc3RhbnRzOgorICAgKi8KKworIHByaW50cCggIlxuICAgICAgICAgICAgICAgLS0gT3B0aW9ucyAtLVxuXG4iICk7CisKKyAgcHJpbnRwKCAiICAgICUyWCwnSU5JVCcgLi4uLi4uLi4uLi4uLi4uIFJlc2V0ICYgKFJlKUlOSVRJQUxJWkUgSW50ZXJmYWNlLlxuIiwgKFVMT05HKSBMQU5fVVRJTF9DT0RFICk7CisgIHByaW50cCggIiAgICAlMlgsJ0JBVUQnLDxyYXRlPiAuLi4uLi4uLiBTZXQgQkFVRCBSYXRlLlxuIiwgKFVMT05HKSBMQU5fVVRJTF9DT0RFICk7CisgIHByaW50cCggIiAgICAlMlgsJ0lOVFInLDxtb2RlPiAuLi4uLi4uLiBUb2dnbGUgJ1J4UkRZJyBJbnRlcnJ1cHRzLlxuIiwgKFVMT05HKSBMQU5fVVRJTF9DT0RFICk7CisgIHByaW50cCggIiAgICAlMlgsJ1hNVCcsPG1vZGU+IC4uLi4uLi4uLiBUb2dnbGUgVFJBTlNNSVQtdmlhLWJhY2twbGFuZS5cbiIsIChVTE9ORykgTEFOX1VUSUxfQ09ERSApOworICBwcmludHAoICIgICAgJTJYLCdTVEFUJyAuLi4uLi4uLi4uLi4uLi4gRGlzcGxheSBTVEFUVVMuXG4iLCAoVUxPTkcpIExBTl9VVElMX0NPREUgKTsKKyAgcHJpbnRwKCAiICAgICUyWCwnRUNITycsPG1vZGU+IC4uLi4uLi4uIEVuYWJsZS9EaXNhYmxlIFRlc3QgRUNITy5cbiIsIChVTE9ORykgTEFOX1VUSUxfQ09ERSApOworICBwcmludHAoICIgICAgJTJYLCdJTicsPGFjdGlvbj4gLi4uLi4uLi4gQWNjZXNzIElOUFVUIFF1ZXVlLlxuIiwgKFVMT05HKSBMQU5fVVRJTF9DT0RFICk7CisgIHByaW50cCggIiAgICAlMlgsJ09VVCcsPGFjdGlvbj4gLi4uLi4uLiBBY2Nlc3MgT1VUUFVUIFF1ZXVlLlxuXG4iLCAoVUxPTkcpIExBTl9VVElMX0NPREUgKTsKKworICBwcmludHAoICIgICAgJTJYLCdQVVRDJyw8Y2hhcj4gLi4uLi4uLi4gT3V0cHV0IGEgQ2hhcmFjdGVyIChpLmUuIDxjaGFyPikuXG5cbiIsIChVTE9ORykgTEFOX1VUSUxfQ09ERSApOworCisvKioqCisgIHByaW50cCggIiAgICAlMlgsJ1dQTScsYWRkcmVzcyx3b3JkIC4uLiBXcml0ZSBQcm90ZWN0ZWQgTWVtb3J5IFRlc3QuXG5cbiIsIChVTE9ORykgTEFOX1VUSUxfQ09ERSApOworKioqLworCisgIHByaW50cCggIiAgICA8cmF0ZT46ICA0ODAwICA8bW9kZT46ICBFIC0gZW5hYmxlICAgPGFjdGlvbj46ICBDIC0gY2xlYXIvcmVzZXRcbiIgKTsKKyAgcHJpbnRwKCAiICAgICAgICAgICAgIDk2MDAgICAgICAgICAgIEQgLSBkaXNhYmxlICAgICAgICAgICAgIEQgLSBkaXNwbGF5XG4iICk7CisgIHByaW50cCggIiAgICAgICAgICAgIDE5MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGIC0gZmV0Y2ggbmV4dCBjaGFyXG4iICk7CisgIHByaW50cCggIiAgICAgICAgICAgIDM4NDAwXG4iICk7Cit9CisvKiBlbmQgb2YgJ2xhbl91dGlsX21lbnUnCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyogVGh1IEZlYiAgNSAxNzoxNDo0MSBFU1QgMTk5OCAgQ1lHTlVTLi4uQ1lHTlVTLi4uQ1lHTlVTLi4uQ1lHTlVTLi4uQ1lHTlVTLi4uQ1lHTlVTLi4uQ1lHTlVTLi4uQ1lHTlVTICovCisKKworc3RhdGljICBsb25nICAgIGdldF9nZGJfaW5wdXQoIGxvbmcgYywgVF9SUzIzMl9RVUVVRSAqIHBfaW5wdXRfcSApCisKK3sKKworICAvKiBOb3cgdG8gZGV0ZWN0IHdoZW4gd2UndmUgZ290IGEgZ2RiIHBhY2tldC4uLiAqLworCisgIGlmICggJyQnID09IGMgKSB7IC8qIGNoYXIgbWFya3MgYmVnaW5uaW5nIG9mIGEgcGFja2V0ICovCisKKyAgICAgIGlmICggLTEgIT0gcF9pbnB1dF9xLT5nZGJfcGFja2V0X3N0YXJ0IHx8CisgICAgICAgICAgIC0xICE9IHBfaW5wdXRfcS0+Z2RiX3BhY2tldF9lbmQgICB8fAorICAgICAgICAgICAtMSAhPSBwX2lucHV0X3EtPmdkYl9wYWNrZXRfY3N1bTEgfHwKKyAgICAgICAgICAgLTEgIT0gcF9pbnB1dF9xLT5nZGJfcGFja2V0X2NzdW0yICkgeyAvKiBQUk9UT0NPTCBFUlJPUiAqLworCisgICAgICAgIC8qIE5FVzogQWN0dWFsbHksIHRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB3ZSBtdWZmZWQgYSBwYWNrZXQsCisgICAgICAgICAgIGFuZCBHREIgaGFzIGFscmVhZHkgcmVzZW50IGl0LiAgVGhlIHRoaW5nIHRvIGRvIG5vdyBpcyB0bworICAgICAgICAgICB0aHJvdyBhd2F5IHRoZSBvbmUgd2UgV0VSRSB3b3JraW5nIG9uLCBidXQgaW1tZWRpYXRlbHkgc3RhcnQKKyAgICAgICAgICAgYWNjZXB0aW5nIHRoZSBuZXcgb25lLiAgRG9uJ3QgTkFLLCBvciBHREIgd2lsbCBoYXZlIHRvIHRyeQorICAgICAgICAgICBhbmQgc2VuZCBpdCB5ZXQgYSB0aGlyZCB0aW1lISAgKi8KKworICAgICAgICAgIC8qTkFDS19QS1QoICk7Ki8gICAgLyo8RVRIRVJORVQ+Ki8KKyAgICAgICAgICBkaXNjYXJkX3BhY2tldCggKTsgICAgICAgICAgICAgICAgICAgIC8qIHRocm93IGF3YXkgb2xkIHBhY2tldCAqLworICAgICAgICAgIGxhbl9hZGRfdG9fcXVldWUgKCckJywgcF9pbnB1dF9xKTsgICAgLyogcHV0IHRoZSBuZXcgIiQiIGJhY2sgaW4gKi8KKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0gZWxzZSB7ICAgICAgICAgIC8qIG1hdGNoIG5ldyAiJCIgKi8KKyAgICAgICAgcF9pbnB1dF9xLT5nZGJfcGFja2V0X3N0YXJ0ID0gcF9pbnB1dF9xLT50YWlsX2luZGV4OworICAgICAgICBwX2lucHV0X3EtPmdkYl9wYWNrZXRfZW5kID0KKyAgICAgICAgICBwX2lucHV0X3EtPmdkYl9wYWNrZXRfY3N1bTEgPQorICAgICAgICAgICAgcF9pbnB1dF9xLT5nZGJfcGFja2V0X2NzdW0yID0gLTE7CisgICAgICB9CisgICAgfSBlbHNlIGlmICggJyMnID09IGMgKSB7IC8qICMgbWFya3MgZW5kIG9mIHBhY2tldCAoZXhjZXB0IGZvciBjaGVja3N1bSkgKi8KKworICAgICAgaWYgKCAtMSA9PSBwX2lucHV0X3EtPmdkYl9wYWNrZXRfc3RhcnQgfHwKKyAgICAgICAgICAgLTEgIT0gcF9pbnB1dF9xLT5nZGJfcGFja2V0X2VuZCAgIHx8CisgICAgICAgICAgIC0xICE9IHBfaW5wdXRfcS0+Z2RiX3BhY2tldF9jc3VtMSB8fAorICAgICAgICAgICAtMSAhPSBwX2lucHV0X3EtPmdkYl9wYWNrZXRfY3N1bTIgKSB7IC8qIFBST1RPQ09MIEVSUk9SICovCisKKyAgICAgICAgICAvKiBHYXJibGVkIHBhY2tldC4gIERpc2NhcmQsIGJ1dCBkbyBub3QgTkFLLiAgKi8KKworICAgICAgICAgIC8qTkFDS19QS1QoICk7Ki8gICAgLyo8RVRIRVJORVQ+Ki8KKyAgICAgICAgICBkaXNjYXJkX3BhY2tldCggKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBwX2lucHV0X3EtPmdkYl9wYWNrZXRfZW5kID0gcF9pbnB1dF9xLT50YWlsX2luZGV4OworICAgICAgcF9pbnB1dF9xLT5nZGJfcGFja2V0X2NzdW0xID0gcF9pbnB1dF9xLT5nZGJfcGFja2V0X2NzdW0yID0gLTE7CisKKyAgfSBlbHNlIGlmICggLTEgIT0gcF9pbnB1dF9xLT5nZGJfcGFja2V0X3N0YXJ0ICYmCisgICAgICAgICAgICAgIC0xICE9IHBfaW5wdXRfcS0+Z2RiX3BhY2tldF9lbmQpIHsKKworICAgIGlmICggaXN4ZGlnaXQoIGMgKSApIHsgLyogY2hhciBpcyBvbmUgb2YgdHdvIGNoZWNrc3VtIGRpZ2l0cyBmb3IgcGFja2V0ICovCisKKyAgICAgIGlmICggLTEgPT0gcF9pbnB1dF9xLT5nZGJfcGFja2V0X2NzdW0xICYmCisgICAgICAgICAgIExBTl9RX01PRCggcF9pbnB1dF9xLT5nZGJfcGFja2V0X2VuZCArIDEgKSA9PQorICAgICAgICAgICBwX2lucHV0X3EtPnRhaWxfaW5kZXggKSB7CisKKyAgICAgICAgLyogZmlyc3QgY2hlY2tzdW0gZGlnaXQgKi8KKworICAgICAgICBwX2lucHV0X3EtPmdkYl9wYWNrZXRfY3N1bTEgPSBwX2lucHV0X3EtPnRhaWxfaW5kZXg7CisgICAgICAgIHBfaW5wdXRfcS0+Z2RiX3BhY2tldF9jc3VtMiA9IC0xOworCisgICAgICB9IGVsc2UgaWYgKCAtMSA9PSBwX2lucHV0X3EtPmdkYl9wYWNrZXRfY3N1bTIgJiYKKyAgICAgICAgICAgICAgICAgIExBTl9RX01PRCggcF9pbnB1dF9xLT5nZGJfcGFja2V0X2VuZCArIDIgKSA9PQorICAgICAgICAgICAgICAgICAgcF9pbnB1dF9xLT50YWlsX2luZGV4ICkgeworCisgICAgICAgIC8qIHNlY29uZCBjaGVja3N1bSBkaWdpdDogcGFja2V0IGlzIGNvbXBsZXRlISAqLworCisgICAgICAgIHBfaW5wdXRfcS0+Z2RiX3BhY2tldF9jc3VtMiA9IHBfaW5wdXRfcS0+dGFpbF9pbmRleDsKKyAgICAgICAgZ2V0cGFja2V0KCk7ICAgIC8qIGdvdCBhIHBhY2tldCAtLSBleHRyYWN0IGl0ICovCisKKyAgICAgIH0gZWxzZSB7IC8qIHByb2JhYmx5IGNhbid0IGhhcHBlbiAodW0uLi4gdGhyZWUgaGV4IGRpZ2l0cz8pICovCisKKyAgICAgICAgLyogUFJPVE9DT0wgRVJST1IgKi8KKyAgICAgICAgLyogTm90IHN1cmUgaG93IHRoaXMgY2FuIGhhcHBlbiwgYnV0IC4uLgorICAgICAgICAgICBkaXNjYXJkIGl0LCBidXQgZG8gbm90IE5BSyBpdC4gICovCisgICAgICAgIC8qTkFDS19QS1QoICk7Ki8gICAgLyo8RVRIRVJORVQ+Ki8KKyAgICAgICAgZGlzY2FyZF9wYWNrZXQoICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKworICAgIH0gZWxzZSB7IC8qICcjJyBmb2xsb3dlZCBieSBub24taGV4IGNoYXIgKi8KKworICAgICAgLyogUFJPVE9DT0wgRVJST1IgKi8KKyAgICAgIC8qIEJhZCBwYWNrZXQgLS0gZGlzY2FyZCBidXQgZG8gbm90IE5BSyAqLworICAgICAgLypOQUNLX1BLVCggKTsqLyAgICAvKjxFVEhFUk5FVD4qLworICAgICAgZGlzY2FyZF9wYWNrZXQoICk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKworCisKKyNpZmRlZiAgICBTVEFOREFMT05FCisKKy8qIHN0YW5kLWFsb25lIHN0YW5kLWFsb25lIHN0YW5kLWFsb25lIHN0YW5kLWFsb25lIHN0YW5kLWFsb25lIHN0YW5kLWFsb25lCisgICBzdGFuZC1hbG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZC1hbG9uZQorICAgc3RhbmQtYWxvbmUgRW5hYmxlIHN0YW5kLWFsb25lIGJ1aWxkLCBmb3IgZWFzZSBvZiBkZWJ1Z2dpbmcgc3RhbmQtYWxvbmUKKyAgIHN0YW5kLWFsb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kLWFsb25lCisgICBzdGFuZC1hbG9uZSBzdGFuZC1hbG9uZSBzdGFuZC1hbG9uZSBzdGFuZC1hbG9uZSBzdGFuZC1hbG9uZSBzdGFuZC1hbG9uZSAqLworCitsb25nIHdyaXRlX3RvX3Byb3RlY3RlZF9tZW0gKGFkZHIsIHdvcmQpCisgICAgIHZvaWQgKmFkZHI7CisgICAgIHVuc2lnbmVkIHNob3J0IHdvcmQ7Cit7CisgIHJldHVybiAwOworfQorCisKK2NoYXIgZHVtbXlfbWVtb3J5WzB4NDAwMF07CisKK2ludCBtYWluICggdm9pZCApCit7CisgIGxvbmcgYzsKKworICBsYW5faW5pdF9xdWV1ZSggJmxhbl9pbnB1dF9xdWV1ZSApOworICBwcmludGYoICJTdGFuZC1hbG9uZSBFTUMgJ3N0dWInLCBwaWQgPSAlZFxuIiwgZ2V0cGlkKCApICk7CisgIHByaW50ZiggIlN0YXJ0IG9mIHNpbXVsYXRlZCAnbWVtb3J5JzogMHglMDh4XG4iLCAmZHVtbXlfbWVtb3J5KTsKKyAgd2hpbGUgKCAoYyA9IGdldGMoIHN0ZGluICkgKSAhPSBFT0YgKQorICAgIHsKKyAgICAgIGlmICggYyA9PSAnXFwnICkgIC8qIGVzY2FwZSBjaGFyICovCisgICAgICAgIGJyZWFrOworCisgICAgICBsYW5fYWRkX3RvX3F1ZXVlKCBjLCAmbGFuX2lucHV0X3F1ZXVlICk7CisgICAgICBnZXRfZ2RiX2lucHV0IChjLCAmbGFuX2lucHV0X3F1ZXVlKTsKKyAgICAgIGZmbHVzaCggc3Rkb3V0ICk7CisgICAgfQorCisgIHByaW50ZiggIkdvb2RieWUhXG4iICk7CisgIGV4aXQoIDAgKTsKK30KKworI2RlZmluZSBTUkFNX1NUQVJUICAgICAgKCh2b2lkICopICgmZHVtbXlfbWVtb3J5WzBdICsgMHgwMDAwMDAwMCkpCisjZGVmaW5lIFNSQU1fRU5EICAgICAgICAoKHZvaWQgKikgKCZkdW1teV9tZW1vcnlbMF0gKyAweDAwMDAwNDAwKSkKKworI2RlZmluZSBST19BUkVBX1NUQVJUICAgKCh2b2lkICopICgmZHVtbXlfbWVtb3J5WzBdICsgMHgwMDAwMDEwMCkpCisjZGVmaW5lIFJPX0FSRUFfRU5EICAgICAoKHZvaWQgKikgKCZkdW1teV9tZW1vcnlbMF0gKyAweDAwMDAwMzAwKSkKKworI2RlZmluZSBOVkRfU1RBUlQgICAgICAgKCh2b2lkICopICgmZHVtbXlfbWVtb3J5WzBdICsgMHgwMDAwMzAwMCkpCisjZGVmaW5lIE5WRF9FTkQgICAgICAgICAoKHZvaWQgKikgKCZkdW1teV9tZW1vcnlbMF0gKyAweDAwMDAzMTAwKSkKKworI2Vsc2UgICAvKiBub3JtYWwgc3R1YiAobm90IHN0YW5kLWFsb25lKSAqLworCisjZGVmaW5lIFNSQU1fU1RBUlQgICAgICAgICAgICAgICgodm9pZCAqKSAweDAwMDAwMDAwKQorI2RlZmluZSBTUkFNX0VORCAgICAgICAgICAgICAgICAoKHZvaWQgKikgMHgwMDQwMDAwMCkKKworI2RlZmluZSBST19BUkVBX1NUQVJUICAgICAgICAgICAoKHZvaWQgKikgMHgwMDEwMDAwMCkKKyNkZWZpbmUgUk9fQVJFQV9FTkQgICAgICAgICAgICAgKCh2b2lkICopIDB4MDAzMDAwMDApCisKKyNkZWZpbmUgTlZEX1NUQVJUICAgICAgICAgICAgICAgKCh2b2lkICopIDB4MDMwMDAwMDApCisjZGVmaW5lIE5WRF9FTkQgICAgICAgICAgICAgICAgICgodm9pZCAqKSAweDAzMTAwMDAwKQorCisjZW5kaWYgLyogU1RBTkRBTE9ORSAqLworCisKKworCisvKiBnZGIgZ2RiIGdkYiBnZGIgZ2RiIGdkYiBnZGIgZ2RiIGdkYiBnZGIgZ2RiIGdkYiBnZGIgZ2RiIGdkYiBnZGIgZ2RiIGdkYgorICAgZ2RiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZGIKKyAgIGdkYiAgICAgICAgICAgICAgICBIZXJlIGJlZ2lucyB0aGUgZ2RiIHN0dWIgc2VjdGlvbi4gICAgICAgICAgICAgICAgZ2RiCisgICBnZGIgICAgICAgICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgd2VyZSBhZGRlZCBieSBDeWdudXMsICAgICAgICAgIGdkYgorICAgZ2RiICAgICAgICAgICAgIHRvIG1ha2UgdGhpcyB0aGluZyBhY3QgbGlrZSBhIGdkYiBzdHViLiAgICAgICAgICAgICBnZGIKKyAgIGdkYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RiCisgICBnZGIgZ2RiIGdkYiBnZGIgZ2RiIGdkYiBnZGIgZ2RiIGdkYiBnZGIgZ2RiIGdkYiBnZGIgZ2RiIGdkYiBnZGIgZ2RiIGdkYiAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xvYmFsIGRlZmluZXMgYW5kIGRhdGEgZGVjbCdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgaGV4Y2hhcnMgICAgICAgICIwMTIzNDU2Nzg5YWJjZGVmIgorCisvKiB0aGVyZSBhcmUgMTgwIGJ5dGVzIG9mIHJlZ2lzdGVycyBvbiBhIDY4MDIwIHcvNjg4ODEgICAgICAqLworLyogbWFueSBvZiB0aGUgZnBhIHJlZ2lzdGVycyBhcmUgMTIgYnl0ZSAoOTYgYml0KSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlVNUkVHQllURVMgICAgICAgICAgMTgwCisjZGVmaW5lIE5VTVJFR1MgICAgICAgICAgICAgIDI5CisjZGVmaW5lIFJFR0lTVEVSX0JZVEUocmVnbm8pIHJlZ25vCisKK2VudW0gcmVnbmFtZXMgeyBEMCwgRDEsIEQyLCBEMywgRDQsIEQ1LCBENiwgRDcsCisgICAgICAgICAgICAgICAgQTAsIEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3LAorICAgICAgICAgICAgICAgIFBTLCBQQywKKyAgICAgICAgICAgICAgICBGUDAsIEZQMSwKKyAgICAgICAgICAgICAgICBGUDIsIEZQMywKKyAgICAgICAgICAgICAgICBGUDQsIEZQNSwKKyAgICAgICAgICAgICAgICBGUDYsIEZQNywKKyAgICAgICAgICAgICAgICBGUENPTlRST0wsIEZQU1RBVFVTLCBGUElBRERSCisgICAgICAgICAgICAgIH07CisKK3Vuc2lnbmVkIGxvbmcgcmVnaXN0ZXJzW05VTVJFR0JZVEVTLzRdOworCitzdGF0aWMgbG9uZyByZW1vdGVfZGVidWc7CisKKyNkZWZpbmUgQlVGTUFYICAgICAgICAgICAgICAgIE1BWF9JT19CVUZfU0laRQorc3RhdGljIGNoYXIgaW5idWZmZXJbQlVGTUFYXSwgb3V0YnVmZmVyW0JVRk1BWF07CitzdGF0aWMgY2hhciBzcGFyZV9idWZmZXJbQlVGTUFYXTsKKworCitzdHJ1Y3Qgc3R1Yl90cmFjZV9mcmFtZQoreworICBpbnQgICAgICAgICAgICAgICAgICAgIHZhbGlkOworICB1bnNpZ25lZCBsb25nICAgICAgICAgIGZyYW1lX2lkOworICB1bnNpZ25lZCBsb25nICAgICAgICAgIHRkcF9pZDsKKyAgRlJBTUVfREVGICAgICAgICAgICAgICpmcmFtZV9kYXRhOworICBDT0xMRUNUSU9OX0ZPUk1BVF9ERUYgKmZvcm1hdDsKKyAgdW5zaWduZWQgbG9uZyAgICAgICAgICB0cmFjZXJlZ3NbTlVNUkVHQllURVMvNF07CisgIHVuc2lnbmVkIGNoYXIgICAgICAgICAqc3RhY2tfZGF0YTsKKyAgdW5zaWduZWQgY2hhciAgICAgICAgICptZW1yYW5nZV9kYXRhOworfSBjdXJmcmFtZTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBoYW5kbGVfcmVxdWVzdCAoIGNoYXIgKiApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgSW1wbGVtZW50YXRpb24gICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZAorZGlzY2FyZF9wYWNrZXQoIHZvaWQgKQoreworICBsYW5faW5wdXRfcXVldWUuaGVhZF9pbmRleCA9IGxhbl9pbnB1dF9xdWV1ZS50YWlsX2luZGV4OworCisgIGxhbl9pbnB1dF9xdWV1ZS5nZGJfcGFja2V0X3N0YXJ0ID0KKyAgICBsYW5faW5wdXRfcXVldWUuZ2RiX3BhY2tldF9lbmQgICA9CisgICAgICBsYW5faW5wdXRfcXVldWUuZ2RiX3BhY2tldF9jc3VtMSA9CisgICAgICAgIGxhbl9pbnB1dF9xdWV1ZS5nZGJfcGFja2V0X2NzdW0yID0gLTE7Cit9CisKKy8qIFV0aWxpdHkgZnVuY3Rpb246IGNvbnZlcnQgYW4gQVNDSUkgaXN4ZGlnaXQgdG8gYSBoZXggbnliYmxlICovCisKK3N0YXRpYyBsb25nCitoZXgoIGNoYXIgY2ggKQoreworICBpZiAoIChjaCA+PSAnQScpICYmIChjaCA8PSAnRicpICkKKyAgICByZXR1cm4gY2ggLSAnQScgKyAxMDsKKyAgaWYgKCAoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ2YnKSApCisgICAgcmV0dXJuIGNoIC0gJ2EnICsgMTA7CisgIGlmICggKGNoID49ICcwJykgJiYgKGNoIDw9ICc5JykgKQorICAgIHJldHVybiBjaCAtICcwJzsKKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZAorZ2V0cGFja2V0KCB2b2lkICkKK3sKKyAgdW5zaWduZWQgY2hhciBvdXJfY2hlY2tzdW0sIHRoZWlyX2NoZWNrc3VtOworICBjaGFyICpjb3B5ID0gaW5idWZmZXI7CisgIHVuc2lnbmVkIGNoYXIgYzsKKworICBvdXJfY2hlY2tzdW0gPSAwOworCisgIC8qIGZpcnN0IGZpbmQgdGhlICckJyAqLworICB3aGlsZSAoKGMgPSBsYW5fbmV4dF9xdWV1ZV9jaGFyICggJmxhbl9pbnB1dF9xdWV1ZSApKSAhPSAnJCcpCisgICAgaWYgKGMgPT0gMCkgICAgICAgICAgICAgICAgIC8qID8/PyBQcm90b2NvbCBlcnJvcj8gKHBhcmFub2lhKSAqLworICAgICAgeworICAgICAgICAgIC8qIFBST1RPQ09MIEVSUk9SIChtaXNzaW5nICckJykgKi8KKyAgICAgICAgLypOQUNLX1BLVCggKTsqLyAgICAvKjxFVEhFUk5FVD4qLworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgLyogTm93IGNvcHkgdGhlIG1lc3NhZ2UgKHVwIHRvIHRoZSAnIycpICovCisgIGZvciAoYyA9IGxhbl9uZXh0X3F1ZXVlX2NoYXIgKCAmbGFuX2lucHV0X3F1ZXVlICk7ICAgIC8qIHNraXAgIHRoZSAgICckJyAqLworICAgICAgIGMgIT0gMCAmJiBjICE9ICcjJzsgICAgICAgICAgICAgIC8qIHN0b3AgYXQgdGhlICcjJyAqLworICAgICAgIGMgPSBsYW5fbmV4dF9xdWV1ZV9jaGFyICggJmxhbl9pbnB1dF9xdWV1ZSApKQorICAgIHsKKyAgICAgICpjb3B5KysgPSBjOworICAgICAgb3VyX2NoZWNrc3VtICs9IGM7CisgICAgfQorICAqY29weSsrID0gJ1wwJzsgICAgICAgICAgICAgICAvKiB0ZXJtaW5hdGUgdGhlIGNvcHkgKi8KKworICBpZiAoYyA9PSAwKSAgICAgICAgICAgICAgICAgICAvKiA/Pz8gUHJvdG9jb2wgZXJyb3I/IChwYXJhbm9pYSkgKi8KKyAgICB7CisgICAgICAgIC8qIFBST1RPQ09MIEVSUk9SIChtaXNzaW5nICcjJykgKi8KKyAgICAgIC8qTkFDS19QS1QoICk7Ki8gICAgLyo8RVRIRVJORVQ+Ki8KKyAgICAgIHJldHVybjsKKyAgICB9CisgIHRoZWlyX2NoZWNrc3VtICA9IGhleCggbGFuX25leHRfcXVldWVfY2hhciAoICZsYW5faW5wdXRfcXVldWUgKSApIDw8IDQ7CisgIHRoZWlyX2NoZWNrc3VtICs9IGhleCggbGFuX25leHRfcXVldWVfY2hhciAoICZsYW5faW5wdXRfcXVldWUgKSApOworCisgIC8qIE5vdyByZXNldCB0aGUgcXVldWUgcGFja2V0LXJlY29nbml0aW9uIGJpdHMgKi8KKyAgZGlzY2FyZF9wYWNrZXQoICk7CisKKyAgaWYgKCByZW1vdGVfZGVidWcgfHwKKyAgICAgIG91cl9jaGVja3N1bSA9PSB0aGVpcl9jaGVja3N1bSApCisgICAgeworICAgICAgQUNLX1BLVCggKTsgICAgICAvKiBnb29kIHBhY2tldCAqLworICAgICAgLyogUGFyc2UgYW5kIHByb2Nlc3MgdGhlIHBhY2tldCAqLworICAgICAgaGFuZGxlX3JlcXVlc3QoIGluYnVmZmVyICk7CisgICAgfQorICBlbHNlCisgICAgICAvKiBQUk9UT0NPTCBFUlJPUiAoYmFkIGNoZWNrIHN1bSkgKi8KKyAgICBOQUNLX1BLVCggKTsKK30KKworLyogRU1DIHdpbGwgcHJvdmlkZSBhIGJldHRlciBpbXBsZW1lbnRhdGlvbgorICAgKHBlcmhhcHMganVzdCBvZiBMQU5fUFVUX0NIQVIpIHRoYXQgZG9lcyBub3QgYmxvY2suCisgICBGb3Igbm93LCB0aGlzIHdvcmtzLiAgKi8KKworCitzdGF0aWMgdm9pZAorcHV0cGFja2V0KCBjaGFyICpzdHIgKQoreworICB1bnNpZ25lZCBjaGFyIGNoZWNrc3VtOworCisgIC8qICckJzxwYWNrZXQ+JyMnPGNoZWNrc3VtPiAqLworCisgIGlmICggVklBX0VUSEVSTkVUID09IGdkYl9ob3N0X2NvbW0gKQorICB7CisgICAgY2hhciAgKnBfb3V0OworICAgIGxvbmcgIGxlbmd0aDsKKworICAgIHBfb3V0ICA9IGV0aF9vdXRidWZmZXI7CisgICAgbGVuZ3RoID0gMDsKKworCisgICAgaWYgKCBZRVMgPT0gZ2RiX2NhdF9hY2sgKQorICAgIHsKKyAgICAgICpwX291dCsrID0gJysnOworICAgICAgKytsZW5ndGg7CisgICAgfQorCisgICAgZ2RiX2NhdF9hY2sgPSBOTzsKKworCisgICAgKnBfb3V0KysgPSAnJCc7CisgICAgKytsZW5ndGg7CisKKyAgICBjaGVja3N1bSA9IDA7CisKKyAgICB3aGlsZSAoICpzdHIgKQorICAgIHsKKyAgICAgICpwX291dCsrID0gKnN0cjsKKyAgICAgICsrbGVuZ3RoOworICAgICAgY2hlY2tzdW0gKz0gKnN0cisrOworICAgIH0KKworICAgICpwX291dCsrID0gJyMnOworICAgICpwX291dCsrID0gaGV4Y2hhcnNbY2hlY2tzdW0gPj4gNF07CisgICAgKnBfb3V0ID0gaGV4Y2hhcnNbY2hlY2tzdW0gJSAxNl07CisgICAgbGVuZ3RoICs9IDM7CisKKyAgICBldGhfdG9fZ2RiKCAoVUNIQVIgKikgZXRoX291dGJ1ZmZlciwgbGVuZ3RoICk7CisgIH0KKworICBlbHNlCisgIHsKKworICAgICAgLyogdmlhIFJTLTIzMiAqLworICAgIGRvIHsKKyAgICAgIExBTl9QVVRfQ0hBUiggJyQnICk7CisgICAgICBjaGVja3N1bSA9IDA7CisKKyAgICAgIHdoaWxlICggKnN0ciApCisgICAgICAgIHsKKyAgICAgICAgICBMQU5fUFVUX0NIQVIoICpzdHIgKTsKKyAgICAgICAgICBjaGVja3N1bSArPSAqc3RyKys7CisgICAgICAgIH0KKworICAgICAgTEFOX1BVVF9DSEFSKCAnIycgKTsKKyAgICAgIExBTl9QVVRfQ0hBUiggaGV4Y2hhcnNbY2hlY2tzdW0gPj4gNF0gKTsKKyAgICAgIExBTl9QVVRfQ0hBUiggaGV4Y2hhcnNbY2hlY2tzdW0gJSAxNl0gKTsKKyAgICB9IHdoaWxlICggMCAvKiBnZXRfZGVidWdfY2hhciggKSAhPSAnKycgKi8gKTsKKyAgICAvKiBYWFggRklYTUU6IG5vdCB3YWl0aW5nIGZvciB0aGUgYWNrLiAqLworCisgIH0KKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBGVU5DVElPTiBOQU1FOiAgIGdkYl9nZXRfZXRoX2lucHV0CisgKgorICoKKyAqIERFU0NSSVBUSU9OOgorICoKKyAqCisgKiBSRVRVUk4gVkFMVUU6ICAgIE5vbmUuCisgKgorICoKKyAqIFVTRUQgR0xPQkFMIFZBUklBQkxFUzoKKyAqCisgKgorICogQUZGRUNURUQgR0xPQkFMIFZBUklBQkxFUy9TSURFIEVGRkVDVFM6CisgKgorICoKKyAqIE5PVEVTOgorICoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgICAgZ2RiX2dldF9ldGhfaW5wdXQoIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgbG9uZyBsZW5ndGggKQorCit7CisKKyAgZ2RiX2hvc3RfY29tbSA9IFZJQV9FVEhFUk5FVDsKKworICBmb3IgKCA7IDAgPCBsZW5ndGg7ICsrYnVmLCAtLWxlbmd0aCkKKyAgeworCisgICAgaWYgKCAqYnVmID09IENPTlRST0xfQyApCisgICAgeworICAgICAgICAvKiBjYW4ndCBzdG9wIHRoZSB0YXJnZXQsIGJ1dCB3ZSBjYW4gdGVsbCBnZGIgdG8gc3RvcCB3YWl0aW5nLi4uICovCisgICAgICBkaXNjYXJkX3BhY2tldCggKTsKKyAgICAgIHB1dHBhY2tldCggIlMwMyIgKTsgICAgICAgLyogc2VuZCBiYWNrIFNJR0lOVCB0byB0aGUgZGVidWdnZXIgKi8KKyAgICB9CisKKyAgICBlbHNlCisgICAgeworICAgICAgbGFuX2FkZF90b19xdWV1ZSggKGxvbmcpICpidWYsICZsYW5faW5wdXRfcXVldWUgKTsKKyAgICAgIGdldF9nZGJfaW5wdXQoIChsb25nKSAqYnVmLCAmbGFuX2lucHV0X3F1ZXVlICk7CisgICAgfQorCisgIH0KKworCisgIHJldHVybjsKK30KKy8qIGVuZCBvZiAnZ2RiX2dldF9ldGhfaW5wdXQnCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qIFNURE9VVCBTVERPVVQgU1RET1VUIFNURE9VVCBTVERPVVQgU1RET1VUIFNURE9VVCBTVERPVVQgU1RET1VUIFNURE9VVAorICAgU3R1ZmYgcGVydGFpbmluZyB0byBzaW11bGF0aW5nIHN0ZG91dCBieSBzZW5kaW5nIGNoYXJzIHRvIGdkYiB0byBiZSBlY2hvZWQuCisKKyAgIERlYXIgcmVhZGVyOgorICAgICAgIFRoaXMgY29kZSBpcyBiYXNlZCBvbiB0aGUgcHJlbWlzZSB0aGF0IGlmIEdEQiByZWNlaXZlcyBhIHBhY2tldAorICAgZnJvbSB0aGUgc3R1YiB0aGF0IGJlZ2lucyB3aXRoIHRoZSBjaGFyYWN0ZXIgQ0FQSVRBTC1PSCwgR0RCIHdpbGwKKyAgIGVjaG8gdGhlIHJlc3Qgb2YgdGhlIHBhY2tldCB0byBHREIncyBjb25zb2xlIC8gc3Rkb3V0LiAgVGhpcyBnaXZlcworICAgdGhlIHN0dWIgYSB3YXkgdG8gc2VuZCBhIG1lc3NhZ2UgZGlyZWN0bHkgdG8gdGhlIHVzZXIuICBJbiBwcmFjdGljZSwKKyAgIChhcyBjdXJyZW50bHkgaW1wbGVtZW50ZWQpLCBHREIgd2lsbCBvbmx5IGFjY2VwdCBzdWNoIGEgcGFja2V0IHdoZW4KKyAgIGl0IGJlbGlldmVzIHRoZSB0YXJnZXQgdG8gYmUgcnVubmluZyAoaWUuIHdoZW4geW91IHNheSBTVEVQIG9yCisgICBDT05USU5VRSk7IGF0IG90aGVyIHRpbWVzIGl0IGRvZXMgbm90IGV4cGVjdCBpdC4gIFRoaXMgd2lsbCBwcm9iYWJseQorICAgY2hhbmdlIGFzIGEgc2lkZSBlZmZlY3Qgb2YgdGhlICJhc3luY2hyb25vdXMiIGJlaGF2aW9yLgorCisgICBGdW5jdGlvbnM6IGdkYl9wdXRjaGFyKGNoYXIgY2gpCisgICAgICAgICAgICAgIGdkYl93cml0ZShjaGFyICpzdHIsIGludCBsZW4pCisgICAgICAgICAgICAgIGdkYl9wdXRzKGNoYXIgKnN0cikKKyAgICAgICAgICAgICAgZ2RiX2Vycm9yKGNoYXIgKmZvcm1hdCwgY2hhciAqcGFybSkKKyAqLworCisjaWYgMCAvKiBhdm9pZCBjb21waWxlciB3YXJuaW5nIHdoaWxlIHRoaXMgaXMgbm90IHVzZWQgKi8KKworLyogRnVuY3Rpb246IGdkYl9wdXRjaGFyKGludCkKKyAgIE1ha2UgZ2RiIHdyaXRlIGEgY2hhciB0byBzdGRvdXQuCisgICBSZXR1cm5zOiB0aGUgY2hhciAqLworCitzdGF0aWMgaW50CitnZGJfcHV0Y2hhciggbG9uZyBjaCApCit7CisgIGNoYXIgYnVmWzRdOworCisgIGJ1ZlswXSA9ICdPJzsKKyAgYnVmWzFdID0gaGV4Y2hhcnNbY2ggPj4gNF07CisgIGJ1ZlsyXSA9IGhleGNoYXJzW2NoICYgMHgwRl07CisgIGJ1ZlszXSA9IDA7CisgIHB1dHBhY2tldCggYnVmICk7CisgIHJldHVybiBjaDsKK30KKyNlbmRpZgorCisvKiBGdW5jdGlvbjogZ2RiX3dyaXRlKGNoYXIgKiwgaW50KQorICAgTWFrZSBnZGIgd3JpdGUgbiBieXRlcyB0byBzdGRvdXQgKG5vdCBhc3N1bWVkIHRvIGJlIG51bGwtdGVybWluYXRlZCkuCisgICBSZXR1cm5zOiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiAqLworCitzdGF0aWMgaW50CitnZGJfd3JpdGUoIGNoYXIgKmRhdGEsIGxvbmcgbGVuICkKK3sKKyAgY2hhciAqYnVmLCAqY3B5OworICBsb25nIGk7CisKKyAgYnVmID0gb3V0YnVmZmVyOworICBidWZbMF0gPSAnTyc7CisgIGkgPSAwOworICB3aGlsZSAoIGkgPCBsZW4gKQorICAgIHsKKyAgICAgIGZvciAoIGNweSA9IGJ1ZisxOworICAgICAgICAgICBpIDwgbGVuICYmIGNweSA8IGJ1ZiArIEJVRk1BWCAtIDM7CisgICAgICAgICAgIGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAqY3B5KysgPSBoZXhjaGFyc1tkYXRhW2ldID4+IDRdOworICAgICAgICAgICpjcHkrKyA9IGhleGNoYXJzW2RhdGFbaV0gJiAweDBGXTsKKyAgICAgICAgfQorICAgICAgKmNweSA9IDA7CisgICAgICBwdXRwYWNrZXQoIGJ1ZiApOworICAgIH0KKyAgcmV0dXJuIGxlbjsKK30KKworLyogRnVuY3Rpb246IGdkYl9wdXRzKGNoYXIgKikKKyAgIE1ha2UgZ2RiIHdyaXRlIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byBzdGRvdXQuCisgICBSZXR1cm5zOiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKi8KKworc3RhdGljIGludAorZ2RiX3B1dHMoIGNoYXIgKnN0ciApCit7CisgIHJldHVybiBnZGJfd3JpdGUoIHN0ciwgc3RybGVuKCBzdHIgKSApOworfQorCisvKiBGdW5jdGlvbjogZ2RiX2Vycm9yKGNoYXIgKiwgY2hhciAqKQorICAgU2VuZCBhbiBlcnJvciBtZXNzYWdlIHRvIGdkYidzIHN0ZG91dC4KKyAgIEZpcnN0IHN0cmluZyBtYXkgaGF2ZSAxIChvbmUpIG9wdGlvbmFsICIlcyIgaW4gaXQsIHdoaWNoCisgICB3aWxsIGNhdXNlIHRoZSBvcHRpb25hbCBzZWNvbmQgc3RyaW5nIHRvIGJlIGluc2VydGVkLiAgKi8KKworI2lmIDAKK3N0YXRpYyB2b2lkCitnZGJfZXJyb3IoIGNoYXIgKmZvcm1hdCwgY2hhciAqcGFybSApCit7CisgIHN0YXRpYyBjaGFyIGJ1Zls0MDBdOworICBjaGFyICpjcHk7CisgIGxvbmcgbGVuOworCisgIGlmICggcmVtb3RlX2RlYnVnICkKKyAgICB7CisgICAgICBpZiAoIGZvcm1hdCAmJiAqZm9ybWF0ICkKKyAgICAgICAgbGVuID0gc3RybGVuKCBmb3JtYXQgKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAvKiBlbXB0eSBpbnB1dCAqLworCisgICAgICBpZiAoIHBhcm0gJiYgKnBhcm0gKQorICAgICAgICBsZW4gKz0gc3RybGVuKCBwYXJtICk7CisKKyAgICAgIGZvciAoIGNweSA9IGJ1ZjsgKmZvcm1hdDsgKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCBmb3JtYXRbMF0gPT0gJyUnICYmIGZvcm1hdFsxXSA9PSAncycgKSAvKiBpbmNsdWRlIDJuZCBzdHJpbmcgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZm9ybWF0ICs9IDI7ICAgICAgICAgIC8qIGFkdmFuY2UgdHdvIGNoYXJzIGluc3RlYWQgb2YganVzdCBvbmUgKi8KKyAgICAgICAgICAgICAgd2hpbGUgKCBwYXJtICYmICpwYXJtICkKKyAgICAgICAgICAgICAgICAqY3B5KysgPSAqcGFybSsrOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpjcHkrKyA9ICpmb3JtYXQrKzsKKyAgICAgICAgfQorICAgICAgKmNweSA9ICdcMCc7CisgICAgICBnZGJfcHV0cyggYnVmICk7CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGdkYl9ub3RlIChjaGFyICosIGludCk7CitzdGF0aWMgaW50ICBlcnJvcl9yZXQgKGludCwgY2hhciAqLCBpbnQpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZworZWxpbnVtX3RvX2luZGV4ICh1bnNpZ25lZCBsb25nIGVsaW51bSkKK3sKKyAgaWYgKChlbGludW0gJiAweGYwKSA9PSAweGQwKQorICAgIHJldHVybiAoZWxpbnVtICYgMHgwZik7CisgIGVsc2UgaWYgKChlbGludW0gJiAweGYwKSA9PSAweGEwKQorICAgIHJldHVybiAoZWxpbnVtICYgMHgwZikgKyA4OworICBlbHNlCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgbG9uZworaW5kZXhfdG9fZWxpbnVtICh1bnNpZ25lZCBsb25nIGluZGV4KQoreworICBpZiAoaW5kZXggPD0gNykKKyAgICByZXR1cm4gaW5kZXggKyAweGQwOworICBlbHNlIGlmIChpbmRleCA8PSAxNSkKKyAgICByZXR1cm4gKGluZGV4IC0gOCkgKyAweGEwOworICBlbHNlCisgICAgcmV0dXJuIC0xOworfQorCisKKy8qCisgIFJFQURNRU0gUkVBRE1FTSBSRUFETUVNIFJFQURNRU0gUkVBRE1FTSBSRUFETUVNIFJFQURNRU0gUkVBRE1FTSBSRUFETUVNCisKKyAgVGhlIGZvbGxvd2luZyBjb2RlIHBlcnRhaW5zIHRvIHJlYWRpbmcgbWVtb3J5IGZyb20gdGhlIHRhcmdldC4KKyAgU29tZSBzb3J0IG9mIGV4Y2VwdGlvbiBoYW5kbGluZyBzaG91bGQgYmUgYWRkZWQgdG8gbWFrZSBpdCBzYWZlLgorCisgIFJFQURNRU0gUkVBRE1FTSBSRUFETUVNIFJFQURNRU0gUkVBRE1FTSBSRUFETUVNIFJFQURNRU0gUkVBRE1FTSBSRUFETUVNCisKKyAgU2FmZSBNZW1vcnkgQWNjZXNzOgorCisgIEFsbCByZWFkcyBhbmQgd3JpdGVzIGludG8gdGhlIGFwcGxpY2F0aW9uJ3MgbWVtb3J5IHdpbGwgcGFzcyB0aHJ1CisgIGdldF91Y2hhcigpIG9yIHNldF91Y2hhcigpLCB3aGljaCBjaGVjayB3aGV0aGVyIGFjY2Vzc2luZyB0aGVpcgorICBhcmd1bWVudCBpcyBsZWdhbCBiZWZvcmUgYWN0dWFsIGFjY2VzcyAodGh1cyBhdm9pZGluZyBhIGJ1cyBlcnJvcikuCisKKyAgKi8KKworZW51bSB7IFNVQ0NFU1MgPSAwLCBGQUlMID0gLTEgfTsKKworI2lmIDAKK3N0YXRpYyBsb25nIGdldF91Y2hhciAoIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiApOworI2VuZGlmCitzdGF0aWMgbG9uZyBzZXRfdWNoYXIgKCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKTsKK3N0YXRpYyBsb25nIHJlYWRfYWNjZXNzX3Zpb2xhdGlvbiAoIGNvbnN0IHZvaWQgKiApOworc3RhdGljIGxvbmcgd3JpdGVfYWNjZXNzX3Zpb2xhdGlvbiAoIGNvbnN0IHZvaWQgKiApOworc3RhdGljIGxvbmcgcmVhZF9hY2Nlc3NfcmFuZ2UoY29uc3Qgdm9pZCAqLCBsb25nKTsKK3N0YXRpYyBEVENfUkVTUE9OU0UgZmluZF9tZW1vcnkodW5zaWduZWQgY2hhciAqLGxvbmcsdW5zaWduZWQgY2hhciAqKixsb25nICopOworCitzdGF0aWMgaW50CitkdGNfZXJyb3JfcmV0IChpbnQgcmV0LCBjaGFyICpzcmMsIERUQ19SRVNQT05TRSBjb2RlKQoreworICBpZiAoc3JjKQorICAgIHNwcmludHAgKHNwYXJlX2J1ZmZlciwKKyAgICAgICAgICAgICAiJyVzJyByZXR1cm5lZCBEVEMgZXJyb3IgJyVzJy5cbiIsIHNyYywgZ2V0X2Vycl90ZXh0IChjb2RlKSk7CisgIGVsc2UKKyAgICBzcHJpbnRwIChzcGFyZV9idWZmZXIsICJEVEMgZXJyb3IgJyVzJy5cbiIsIGdldF9lcnJfdGV4dCAoY29kZSkpOworCisgIGdkYl9wdXRzIChzcGFyZV9idWZmZXIpOworICByZXR1cm4gcmV0OworfQorCisKKyNpZiAwCisvKiBJIHRoaW5rIHRoaXMgZnVuY3Rpb24gaXMgdW5uZWNlc3Nhcnkgc2luY2UgdGhlIGludHJvZHVjdGlvbiBvZgorICAgYWRiZ19maW5kX21lbW9yeV9hZGRyX2luX2ZyYW1lLiAgKi8KKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgZXhwcmVzc2lvbnMgaW4gdGhlIGZvcm1hdCBhc3NvY2lhdGVkIHdpdGggYQorICAgZ2l2ZW4gdHJhY2UgZnJhbWUuICAqLworc3RhdGljIGludAorY291bnRfZnJhbWVfZXhwcnMgKEZSQU1FX0RFRiAqZnJhbWUpCit7CisgIENGRCAqZm9ybWF0OworICBUX0VYUFIgKmV4cHI7CisgIGludCBudW1fZXhwcnM7CisKKyAgLyogR2V0IHRoZSBmb3JtYXQgZnJvbSB0aGUgZnJhbWUuICAqLworICBnZXRfZnJhbWVfZm9ybWF0X3BvaW50ZXIgKGZyYW1lLCAmZm9ybWF0KTsKKworICAvKiBXYWxrIHRoZSBsaW5rZWQgbGlzdCBvZiBleHByZXNzaW9ucywgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YKKyAgICAgZXhwcmVzc2lvbnMgd2UgZmluZCB0aGVyZS4gICovCisgIG51bV9leHBycyA9IDA7CisgIGZvciAoZXhwciA9IGZvcm1hdC0+cF9jZmRfZXhwcjsgZXhwcjsgZXhwciA9IGV4cHItPm5leHQpCisgICAgbnVtX2V4cHJzKys7CisKKyAgcmV0dXJuIG51bV9leHByczsKK30KKyNlbmRpZgorCisjaWYgMAorLyogRnVuY3Rpb246IGdldF9mcmFtZV9hZGRyCisgKgorICogRGVzY3JpcHRpb246IElmIHRoZSBpbnB1dCBtZW1vcnkgYWRkcmVzcyB3YXMgY29sbGVjdGVkIGluIHRoZQorICogICAgIGN1cnJlbnQgdHJhY2UgZnJhbWUsIHRoZW4gbG9va3VwIGFuZCByZXR1cm4gdGhlIGFkZHJlc3MKKyAqICAgICBmcm9tIHdpdGhpbiB0aGUgdHJhY2UgYnVmZmVyIGZyb20gd2hpY2ggdGhlIGNvbGxlY3RlZCBieXRlCisgKiBtYXkgYmUgcmV0cmlldmVkLiAgRWxzZSByZXR1cm4gLTEuICAqLworCit1bnNpZ25lZCBjaGFyICoKK2dldF9mcmFtZV9hZGRyICggY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciApCit7CisgIHVuc2lnbmVkIGNoYXIgKmJhc2UsICpyZWdzLCAqc3RhY2ssICptZW07CisgIENGRCAqZHVtbXk7CisgIERUQ19SRVNQT05TRSByZXQ7CisKKyAgLyogZmlyc3QsIHNlZSBpZiBhZGRyIGlzIG9uIHRoZSBzYXZlZCBwaWVjZSBvZiBzdGFjayBmb3IgY3VyZnJhbWUgKi8KKyAgaWYgKGN1cmZyYW1lLmZvcm1hdC0+c3RhY2tfc2l6ZSA+IDAgJiYKKyAgICAgIChiYXNlID0gKHVuc2lnbmVkIGNoYXIgKikgY3VyZnJhbWUudHJhY2VyZWdzW0E3XSkgPD0gYWRkciAgJiYKKyAgICAgIGFkZHIgPCBiYXNlICsgY3VyZnJhbWUuZm9ybWF0LT5zdGFja19zaXplKQorICAgIHsKKyAgICAgIGdkYl9wdXRzKCJTVFVCOiBnZXRfZnJhbWVfYWRkcjogY2FsbCBnZXRfYWRkcl90b19mcmFtZV9yZWdzX3N0YWNrX21lbVxuIik7CisgICAgICBpZiAoKHJldCA9IGdldF9hZGRyX3RvX2ZyYW1lX3JlZ3Nfc3RhY2tfbWVtIChjdXJmcmFtZS5mcmFtZV9kYXRhLAorCQkJCQkJICAgJmR1bW15LAorCQkJCQkJICAgKHZvaWQgKikgJnJlZ3MsCisJCQkJCQkgICAodm9pZCAqKSAmc3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAmbWVtKSkKKyAgICAgICAgICAhPSBPS19UQVJHRVRfUkVTUE9OU0UpCisgICAgICAgIHJldHVybiAodm9pZCAqKSBkdGNfZXJyb3JfcmV0ICgtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRfYWRkcl90b19mcmFtZV9yZWdzX3N0YWNrX21lbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gc3RhY2sgKyAoYWRkciAtIGJhc2UpOworICAgIH0KKworICAvKiBOZXh0LCB0cnkgdG8gZmluZCBhZGRyIGluIHRoZSBjdXJyZW50IGZyYW1lJ3MgZXhwcmVzc2lvbi0KKyAgICAgY29sbGVjdGVkIG1lbW9yeSBibG9ja3MuICBJJ20gc3VyZSB0aGlzIGlzIGF0IGxlYXN0IHF1YWRyYWRpYyBpbgorICAgICB0aW1lLiAgKi8KKyAgeworICAgIGludCBudW1fZXhwcnMgPSBjb3VudF9mcmFtZV9leHBycyAoY3VyZnJhbWUuZnJhbWVfZGF0YSk7CisgICAgaW50IGV4cHIsIGJsb2NrOworCisgICAgLyogVHJ5IGVhY2ggZXhwcmVzc2lvbiBpbiB0dXJuLiAgKi8KKyAgICBmb3IgKGV4cHIgPSAwOyBleHByIDwgbnVtX2V4cHJzOyBleHByKyspCisgICAgICB7CisJZm9yIChibG9jayA9IDA7IDsgYmxvY2srKykKKwkgIHsKKwkgICAgVF9FWFBSX0RBVEEgKmRhdGE7CisJICAgIGlmIChhZGJnX2dldF9leHByX2RhdGEgKGN1cmZyYW1lLmZyYW1lX2RhdGEsCisJCQkJICAgICd4JywgZXhwciwgYmxvY2ssCisJCQkJICAgICZkYXRhKQorCQkhPSBPS19UQVJHRVRfUkVTUE9OU0UpCisJICAgICAgYnJlYWs7CisJICAgIGVsc2UgaWYgKCh1bnNpZ25lZCBjaGFyICopIGRhdGEtPmFkZHJlc3MgPD0gYWRkcgorCQkgICAgICYmIGFkZHIgPCAoKHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+YWRkcmVzcyArIGRhdGEtPnNpemUpKQorCSAgICAgIHsKKwkJLyogV2UgaGF2ZSBmb3VuZCB0aGUgcmlnaHQgYmxvY2s7IGlzIGl0IHZhbGlkIGRhdGE/CisJCSAgIFVwcGVyLWNhc2Ugc3RhbXBzIG1lYW4gYmFkIGRhdGEuICAqLworCQlpZiAoJ0EnIDw9IGRhdGEtPnN0YW1wICYmIGRhdGEtPnN0YW1wIDw9ICdaJykKKwkJICB7CisJCSAgICBnZGJfcHV0cygiU1RVQjogZ2V0X2ZyYW1lX2FkZHI6IGFkYmdfZ2V0X2V4cHJfZGF0YSBJTlZBTElEXG4iKTsKKwkJICAgIHJldHVybiAodW5zaWduZWQgY2hhciAqKSAtMTsKKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICBpZiAocmVtb3RlX2RlYnVnID4gMSkKKwkJICAgICAgeworCQkJc3ByaW50cChzcGFyZV9idWZmZXIsCisJCQkJIlNUVUI6IGdldF9mcmFtZV9hZGRyOiBnb3QgaXQgWyV4LCV4KVxuIiwKKwkJCQlkYXRhLT5hZGRyZXNzLCBkYXRhLT5hZGRyZXNzICsgZGF0YS0+c2l6ZSk7CisJCQlnZGJfcHV0cyhzcGFyZV9idWZmZXIpOworCQkgICAgICB9CisKKwkJICAgIHJldHVybiAoKCh1bnNpZ25lZCBjaGFyICopICZkYXRhLT5kYXRhKQorCQkJICAgICsgKGFkZHIgLSAodW5zaWduZWQgY2hhciAqKSBkYXRhLT5hZGRyZXNzKSk7CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKyAgfQorCisgIC8qIG5vdCBmb3VuZCwgcmV0dXJuIGVycm9yICovCisgIHJldHVybiAodW5zaWduZWQgY2hhciAqKSAtMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgbG9uZyBnZXRfdWNoYXIgKCBjb25zdCB1bnNpZ25lZCBjaGFyICogYWRkciApCit7CisgIHVuc2lnbmVkIGNoYXIgKmZyYW1lX2FkZHI7CisKKyAgaWYgKCByZWFkX2FjY2Vzc192aW9sYXRpb24gKCBhZGRyICkgKQorICAgIHJldHVybiAoIC0xICk7IC8qIEFjY2VzcyBlcnJvciAqLworCisgIGlmIChjdXJmcmFtZS52YWxpZCkgICAvKiBpZiBkZWJ1Z2dpbmcgYSB0cmFjZSBmcmFtZT8gKi8KKyAgICB7CisgICAgICAvKiBJZiB0aGUgcmVxdWVzdGVkIGFkZHJlc3Mgd2FzIGNvbGxlY3RlZCBpbiB0aGUgY3VycmVudCBmcmFtZSwKKyAgICAgICAqIHRoZW4gZmV0Y2ggYW5kIHJldHVybiB0aGUgZGF0YSBmcm9tIHRoZSB0cmFjZSBidWZmZXIuCisgICAgICAgKi8KKyAgICAgIGlmICgoZnJhbWVfYWRkciA9IGdldF9mcmFtZV9hZGRyIChhZGRyKSkgIT0gKHVuc2lnbmVkIGNoYXIgKikgLTEpCisgICAgICAgIHJldHVybiAoICpmcmFtZV9hZGRyICk7CisgICAgICAvKiBJZiB0aGUgcmVxdWVzdGVkIGFkZHJlc3MgaXMgaW4gdGhlIENvZGUgU2VjdGlvbiwKKyAgICAgICAqIGxldCdzIGJlIG1hZ25hbmltb3VzIGFuZCByZWFkIGl0IGFueXdheSAoZWxzZSB3ZSBzaGFsbAorICAgICAgICogbm90IGJlIGFibGUgdG8gZGlzYXNzZW1ibGUsIGZpbmQgZnVuY3Rpb24gcHJvbG9ndWVzLCBldGMuKQorICAgICAgICovCisgICAgICBlbHNlIGlmIChDU19DT0RFX1NUQVJUIDw9ICh1bnNpZ25lZCBsb25nKSBhZGRyICYmCisgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgYWRkciA8IENTX0NPREVfU1RBUlQgKyBDU19DT0RFX1NJWkUpCisgICAgICAgIHJldHVybiAoKmFkZHIpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gKCAtMSApOyAgLyogIkFjY2VzcyBlcnJvciIgKHRoZSBkYXRhIHdhcyBub3QgY29sbGVjdGVkKSAqLworICAgIH0KKyAgZWxzZQorICAgIC8qIE5vdCBkZWJ1Z2dpbmcgYSB0cmFjZSBmcmFtZSwgcmVhZCB0aGUgZGF0YSBmcm9tIGxpdmUgbWVtb3J5LiAqLworICAgIHJldHVybiAoICphZGRyICk7IC8qIE1lYW5pbmdmdWwgcmVzdWx0ID49IDAgKi8KK30KKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBsb25nIHNldF91Y2hhciAoIHVuc2lnbmVkIGNoYXIgKiBhZGRyLCB1bnNpZ25lZCBjaGFyIHZhbCApCit7CisgIGxvbmcgY2hlY2tfcmVzdWx0ID0gd3JpdGVfYWNjZXNzX3Zpb2xhdGlvbiAoIGFkZHIgKTsKKworICBpZiAoIGNoZWNrX3Jlc3VsdCAhPSAwTCApCisgICAgcmV0dXJuICggY2hlY2tfcmVzdWx0ICk7IC8qIEFjY2VzcyBlcnJvciAqLworCisgIHJldHVybiAoICphZGRyID0gdmFsICk7ICAgIC8qIFN1Y2Nlc3NmdWwgd3JpdGluZyAqLworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBGdW5jdGlvbiByZWFkX2FjY2Vzc192aW9sYXRpb24oKSBiZWxvdyByZXR1cm5zIFRSVUUgaWYgZGVyZWZlcmVuY2luZworICogaXRzIGFyZ3VtZW50IGZvciByZWFkaW5nIHdvdWxkIGNhdXNlIGEgYnVzIGVycm9yIC0gYW5kIEZBTFNFIG90aGVyd2lzZToKKyAqLworCitzdGF0aWMgbG9uZyByZWFkX2FjY2Vzc192aW9sYXRpb24gKCBjb25zdCB2b2lkICogYWRkciApCit7CisgIHJldHVybiAoICggKCBhZGRyIDwgU1JBTV9TVEFSVCApIHx8ICggYWRkciA+PSBTUkFNX0VORCApICkgJiYKKyAgICAgICAgICAgKCAoIGFkZHIgPCBOVkRfU1RBUlQgKSAgfHwgKCBhZGRyID49IE5WRF9FTkQgKSApICk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIEZ1bmN0aW9uIHdyaXRlX2FjY2Vzc192aW9sYXRpb24oKSBiZWxvdyByZXR1cm5zIHplcm8gaWYgZGVyZWZlcmVuY2luZworICogaXRzIGFyZ3VtZW50IGZvciB3cml0aW5nIGlzIHNhZmUsIC0xIG9uIGEgc29mdCBlcnJvciAodGhlIGFyZ3VtZW50CisgKiBmYWxscyBpbnRvIHRoZSB3cml0ZS1wcm90ZWN0ZWQgYXJlYSksIC0yIG9uIGEgaGFyZCBlcnJvciAodGhlIGFyZ3VtZW50CisgKiBwb2ludHMgdG8gYSBub24tZXhpc3RlbnQgbWVtb3J5IGxvY2F0aW9uKS4gSW4gb3RoZXIgd29yZHMsIGl0IHJldHVybnMKKyAqIEZBTFNFIHdoZW4gbm8gYnVzIGVycm9yIGlzIGV4cGVjdGVkIC0gYW5kIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlOgorICovCisKK3N0YXRpYyBsb25nIHdyaXRlX2FjY2Vzc192aW9sYXRpb24gKCBjb25zdCB2b2lkICogYWRkciApCit7CisgIC8qCisgICAqIFRoZSBib3VuZGFyaWVzIG9mIHRoZSB3cml0ZS1wcm90ZWN0ZWQgYXJlYSBoYXZlIHRvIGJlIHJlY2VpdmVkIHZpYQorICAgKiBhbiBBUEkgcHJvdmlkZWQgaW4gdGhlIFN5bW1ldHJpeCBjb3JlIGNvZGUuIEZvciBub3csIHRoZXNlIGxpbWl0cworICAgKiBhcmUgaGFyZC1jb2RlZDoKKyAgICovCisKKyAgaWYgKCAoIGFkZHIgPj0gUk9fQVJFQV9TVEFSVCApICYmICggYWRkciA8IFJPX0FSRUFfRU5EICkgKQorICAgIHJldHVybiAoIC0xICk7IC8qIHNvZnQgZXJyb3IgKi8KKworICBpZiAoICggKCBhZGRyIDwgU1JBTV9TVEFSVCApIHx8ICggYWRkciA+PSBTUkFNX0VORCApICkgJiYKKyAgICAgICAoICggYWRkciA8IE5WRF9TVEFSVCApICB8fCAoIGFkZHIgPj0gTlZEX0VORCApICkgKQorICAgIHJldHVybiAoIC0yICk7IC8qIGhhcmQgZXJyb3IgKi8KKworICByZXR1cm4gKCAwICk7Cit9CisKKworLyogcmVhZF9hY2Nlc3NfcmFuZ2UgaXMgbGlrZSByZWFkX2FjY2Vzc192aW9sYXRpb24sCisgICBidXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGNhbiByZWFkIHcvbyBmYXVsdGluZy4KKyAgIHRoYXQgaXMsIGl0IGNoZWNrcyBhbiBhZGRyZXNzIHJhbmdlIGFuZCB0ZWxscyB1cyB3aGF0IHBvcnRpb24KKyAgIChpZiBhbnkpIG9mIHRoZSBwcmVmaXggaXMgc2FmZSB0byByZWFkIHdpdGhvdXQgYSBidXMgZXJyb3IgKi8KK3N0YXRpYyBsb25nCityZWFkX2FjY2Vzc19yYW5nZShjb25zdCB2b2lkICphZGRyLCBsb25nIGNvdW50KQoreworICBpZiAoKGFkZHIgPj0gU1JBTV9TVEFSVCkgJiYgKGFkZHIgPCBTUkFNX0VORCkpCisgICAgeworICAgICAgaWYgKChjaGFyICopYWRkciArIGNvdW50IDwgKGNoYXIgKilTUkFNX0VORCkKKwlyZXR1cm4gKGNvdW50KTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gKChjaGFyICopU1JBTV9FTkQgLSAoY2hhciAqKWFkZHIpOworICAgIH0KKyAgZWxzZSBpZiAoKChjaGFyICopYWRkciA+PSAoY2hhciAqKU5WRF9TVEFSVCkgJiYKKwkgICAoKGNoYXIgKilhZGRyIDwgKGNoYXIgKilOVkRfRU5EKSkKKyAgICB7CisgICAgICBpZiAoKGNoYXIgKilhZGRyICsgY291bnQgPCAoY2hhciAqKU5WRF9FTkQpCisJcmV0dXJuIChjb3VudCk7CisgICAgICBlbHNlCisJcmV0dXJuICgoY2hhciAqKU5WRF9FTkQgLSAoY2hhciAqKWFkZHIpOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAoMCk7Cit9CisKKy8qIENvbnZlcnQgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IG1lbSBpbnRvIGhleCwgcGxhY2luZyByZXN1bHQgaW4gYnVmLgorICAgUmV0dXJuIFNVQ0NFU1Mgb3IgRkFJTC4KKyAgIElmIE1BWV9GQVVMVCBpcyBub24temVybywgdGhlbiB3ZSBzaG91bGQgcmV0dXJuIEZBSUwgaW4gcmVzcG9uc2UgdG8KKyAgIGEgZmF1bHQ7IGlmIHplcm8gdHJlYXQgYSBmYXVsdCBsaWtlIGFueSBvdGhlciBmYXVsdCBpbiB0aGUgc3R1Yi4gICovCisKK3N0YXRpYyBsb25nCittZW0yaGV4KHVuc2lnbmVkIGNoYXIgKm1lbSwgY2hhciAqYnVmLCBsb25nIGNvdW50LCBsb25nIG1heV9mYXVsdCkKK3sKKyAgbG9uZyBuZHg7CisgIGxvbmcgbmR4MjsKKyAgbG9uZyBjaDsKKyAgbG9uZyBpbmNyOworICB1bnNpZ25lZCBjaGFyICpsb2NhdGlvbjsKKyAgRFRDX1JFU1BPTlNFIHN0YXR1czsKKworICBpZiAobWF5X2ZhdWx0KQorICAgIHsKKyAgICAgIGZvciAobmR4ID0gMCwgaW5jciA9IDE7IChuZHggPCBjb3VudCkgJiYgKGluY3IgPiAwKTsgbmR4ICs9IGluY3IpCisJeworCSAgc3RhdHVzID0gZmluZF9tZW1vcnkobWVtLCBjb3VudCAtIG5keCwgJmxvY2F0aW9uLCAmaW5jcik7CisKKwkgIGlmIChzdGF0dXMgPT0gT0tfVEFSR0VUX1JFU1BPTlNFKQorCSAgICB7CisJICAgICAgaWYgKGluY3IgPiAwKQorCQl7CisJCSAgZm9yIChuZHgyID0gMDsgbmR4MiA8IGluY3I7IG5keDIrKykKKwkJICAgIHsKKwkJICAgICAgY2ggPSAqbG9jYXRpb24rKzsKKwkJICAgICAgKmJ1ZisrID0gaGV4Y2hhcnNbY2ggPj4gNF07CisJCSAgICAgICpidWYrKyA9IGhleGNoYXJzW2NoICYgMHhmXTsKKwkJICAgIH0KKwkJICBtZW0gKz0gaW5jcjsKKwkJfQorCSAgICAgIGVsc2UgaWYgKGluY3IgPD0gMCkgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQl7CisJCSAgKmJ1ZiA9IDA7CisJCSAgcmV0dXJuICgwKTsKKwkJfQorCSAgICB9CisJICBlbHNlIGlmIChzdGF0dXMgPT0gTk9UX0ZPVU5EX1RBUkdFVF9SRVNQT05TRSkKKwkgICAgeworCSAgICAgICpidWYgPSAwOworCSAgICAgIHJldHVybiAobmR4KTsJLyogcmV0dXJuIGFtb3VudCBjb3BpZWQgKi8KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgKmJ1ZiA9IDA7CisJICAgICAgcmV0dXJuICgwKTsJLyogWFhYOiBob3cgZG8gd2UgdGVsbCB0aGUgdXNlciB0aGUgc3RhdHVzPyAqLworCSAgICB9CisJfQorICAgICAgKmJ1ZiA9IDA7CisgICAgICByZXR1cm4gKGNvdW50KTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKG5keCA9IDA7IG5keCA8IGNvdW50OyBuZHgrKykKKwl7CisJICBjaCA9ICptZW0rKzsKKwkgICpidWYrKyA9IGhleGNoYXJzW2NoID4+IDRdOworCSAgKmJ1ZisrID0gaGV4Y2hhcnNbY2ggJiAweGZdOworCX0KKyAgICAgICpidWYgPSAwOworICAgICAgcmV0dXJuIChjb3VudCk7CQkvKiB3ZSBjb3BpZWQgZXZlcnl0aGluZyAqLworICAgIH0KK30KKworc3RhdGljIERUQ19SRVNQT05TRQorZmluZF9tZW1vcnkodW5zaWduZWQgY2hhciAqbWVtLCBsb25nIGNvdW50LAorCSAgICB1bnNpZ25lZCBjaGFyICoqbG9jYXRpb24sIGxvbmcgKmluY3IpCit7CisgIERUQ19SRVNQT05TRSByZXR2YWw7CisgIGxvbmcgbGVuZ3RoOworCisgIC8qIGZpZ3VyZSBvdXQgaG93IG11Y2ggb2YgdGhlIG1lbW9yeSByYW5nZSB3ZSBjYW4gcmVhZCB3L28gZmF1bHRpbmcgKi8KKyAgY291bnQgPSByZWFkX2FjY2Vzc19yYW5nZShtZW0sIGNvdW50KTsKKyAgaWYgKGNvdW50ID09IDApCisgICAgcmV0dXJuIChOT1RfRk9VTkRfVEFSR0VUX1JFU1BPTlNFKTsKKworICBpZiAoY3VyZnJhbWUudmFsaWQpCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciAqbWVtX2Jsb2NrOworICAgICAgdW5zaWduZWQgY2hhciAqbWVtX2FkZHI7CisgICAgICB1bnNpZ25lZCBsb25nIG1lbV9zaXplOworICAgICAgdW5zaWduZWQgbG9uZyBtZW1fc3RhbXA7CisKKyAgICAgIHJldHZhbCA9IGFkYmdfZmluZF9tZW1vcnlfYWRkcl9pbl9mcmFtZShjdXJmcmFtZS5mcmFtZV9kYXRhLCBtZW0sCisJCQkJCSAgICAgICh1bnNpZ25lZCBsb25nICoqKSZtZW1fYmxvY2ssCisJCQkJCSAgICAgICh1bnNpZ25lZCBsb25nICoqKSZtZW1fYWRkciwKKwkJCQkJICAgICAgJm1lbV9zaXplLCAmbWVtX3N0YW1wKTsKKworICAgICAgc3dpdGNoIChyZXR2YWwpCisJeworCWNhc2UgT0tfVEFSR0VUX1JFU1BPTlNFOgorI2lmIDAKKwkgIHByaW50cCgiRk9VTkQ6IG1lbSAleCBibG9jayAleCBhZGRyICV4IHNpemUgJWQgc3RhbXAgJXhcbiIsCisJCSBtZW0sIG1lbV9ibG9jaywgbWVtX2FkZHIsIG1lbV9zaXplLCBtZW1fc3RhbXApOworI2VuZGlmCisJICAqbG9jYXRpb24gPSBtZW1fYmxvY2sgKyAobWVtIC0gbWVtX2FkZHIpOworCSAgbGVuZ3RoID0gbWVtX3NpemUgLSAobWVtIC0gbWVtX2FkZHIpOzsKKworCSAgaWYgKGxlbmd0aCA8IGNvdW50KQorCSAgICAqaW5jciA9IGxlbmd0aDsKKwkgIGVsc2UKKwkgICAgKmluY3IgPSBjb3VudDsKKworCSAgYnJlYWs7CisKKwljYXNlIE5PVF9GT1VORF9UQVJHRVRfUkVTUE9OU0U6CisJY2FzZSBORUFSX0ZPVU5EX1RBUkdFVF9SRVNQT05TRToKKyNpZiAwCisJICBwcmludHAoIk5PVCBGT1VORDogbWVtICV4LCBjaGVja2luZyBjb2RlIHJlZ2lvblxuIiwgbWVtKTsKKyNlbmRpZgorCSAgLyogY2hlY2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIGNvZGUgcmVnaW9uICovCisJICBpZiAoKENTX0NPREVfU1RBUlQgPD0gKGxvbmcpbWVtKSAmJgorCSAgICAgICgobG9uZyltZW0gPCBDU19DT0RFX1NUQVJUICsgQ1NfQ09ERV9TSVpFKSkKKwkgICAgeworCSAgICAgIC8qIHNvbWUgb3IgYWxsIG9mIHRoZSBhZGRyZXNzIHJhbmdlIGlzIGluIHRoZSBjb2RlICovCisJICAgICAgKmxvY2F0aW9uID0gbWVtOworCSAgICAgIGlmICgobG9uZyltZW0gKyBjb3VudCA8PSBDU19DT0RFX1NUQVJUICsgQ1NfQ09ERV9TSVpFKQorCQkqaW5jciA9IGNvdW50OyAvKiBpdCdzIHRvdGFsbHkgaW4gdGhlIGNvZGUgKi8KKwkgICAgICBlbHNlCisJCS8qIGhvdyBtdWNoIGlzIGluIHRoZSBjb2RlPyAqLworCQkqaW5jciA9IENTX0NPREVfU1RBUlQgKyBDU19DT0RFX1NJWkUgLSAobG9uZyltZW07CisjaWYgMAorCSAgICAgIHByaW50cCgiRk9VTkQgaW4gY29kZSByZWdpb246ICV4XG4iLCBtZW0pOworI2VuZGlmCisJICAgICAgcmV0dmFsID0gT0tfVEFSR0VUX1JFU1BPTlNFOworCSAgICB9CisJICBlbHNlCisJICAgIHJldHZhbCA9IE5PVF9GT1VORF9UQVJHRVRfUkVTUE9OU0U7CisKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKyNpZiAwCisJICBwcmludHAoIkJBRCBSRVRVUk46ICVkXG4iLCByZXR2YWwpOworI2VuZGlmCisJICByZXR2YWwgPSBOT1RfRk9VTkRfVEFSR0VUX1JFU1BPTlNFOworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICpsb2NhdGlvbiA9IG1lbTsKKyAgICAgICppbmNyID0gY291bnQ7CisgICAgICByZXR2YWwgPSBPS19UQVJHRVRfUkVTUE9OU0U7CisgICAgfQorCisgIHJldHVybiAocmV0dmFsKTsKK30KKworLyogQ29udmVydCB0aGUgaGV4IGFycmF5IHBvaW50ZWQgdG8gYnkgYnVmIGludG8gYmluYXJ5IHRvIGJlIHBsYWNlZCBpbiBtZW0uCisgICBSZXR1cm4gU1VDQ0VTUyBvciBGQUlMLiAgKi8KKworc3RhdGljIGxvbmcKK2hleDJtZW0oIGNoYXIgKmJ1ZiwgdW5zaWduZWQgY2hhciAqbWVtLCBsb25nIGNvdW50LCBsb25nIG1heV9mYXVsdCApCit7CisgIGxvbmcgaSwgY2g7CisKKyAgZm9yICggaT0wOyBpPGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgIGNoID0gaGV4KCAqYnVmKysgKSA8PCA0OworICAgICAgY2ggPSBjaCArIGhleCggKmJ1ZisrICk7CisgICAgICBpZiAoIG1heV9mYXVsdCApCisgICAgICAgIHsKKyAgICAgICAgICBjaCA9IHNldF91Y2hhciggbWVtKyssIGNoICk7CisgICAgICAgICAgaWYgKCBjaCA8IDAgKSAgICAvKiBuZWdhdGl2ZSByZXR1cm4gaW5kaWNhdGVzIGVycm9yICovCisgICAgICAgICAgICByZXR1cm4gRkFJTDsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICAqbWVtKysgPSBjaDsKKyAgICB9CisgIHJldHVybiBTVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFdISUxFIFdFIEZJTkQgTklDRSBIRVggQ0hBUlMsIEJVSUxEIEFOIElOVCAqLworLyogUkVUVVJOIE5VTUJFUiBPRiBDSEFSUyBQUk9DRVNTRUQgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAoraGV4VG9JbnQoIGNoYXIgKipwdHIsIHVuc2lnbmVkIGxvbmcgKmludFZhbHVlICkKK3sKKyAgbG9uZyBudW1DaGFycyA9IDA7CisgIGxvbmcgaGV4VmFsdWU7CisKKyAgKmludFZhbHVlID0gMDsKKyAgd2hpbGUgKCAqKnB0ciApCisgICAgeworICAgICAgaGV4VmFsdWUgPSBoZXgoICoqcHRyICk7CisgICAgICBpZiAoIGhleFZhbHVlID49MCApCisgICAgICAgIHsKKyAgICAgICAgICAqaW50VmFsdWUgPSAoKmludFZhbHVlIDw8IDQpIHwgaGV4VmFsdWU7CisgICAgICAgICAgbnVtQ2hhcnMgKys7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgICAoKnB0cikrKzsKKyAgICB9CisgIHJldHVybiBudW1DaGFyczsKK30KKworc3RhdGljIHZvbGF0aWxlIGxvbmcgZ2RiX2hhbmRsaW5nX3RyYXAxOworc3RhdGljIHZvbGF0aWxlIGxvbmcgZ2RiX2hhbmRsaW5nX3NzdHJhY2U7CitzdGF0aWMgdm9sYXRpbGUgbG9uZyBnZGJfc2lnbm87CisKKy8qCisgICBIZXJlIGlzIHRoZSAiY2FsbGFibGUiIHN0dWIgZW50cnkgcG9pbnQuCisgICBDYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBhIEdEQiByZXF1ZXN0IGFzIGFuIGFyZ3VtZW50LAorICAgYW5kIGl0IHdpbGwgc2VydmljZSB0aGUgcmVxdWVzdCBhbmQgcmV0dXJuLgorCisgICBNYXkgYmUgZnVydGhlciBicm9rZW4gdXAgYXMgd2UgZ28gYWxvbmcsIHdpdGggaW5kaXZpZHVhbCByZXF1ZXN0cworICAgYnJva2VuIG91dCBhcyBzZXBhcmF0ZSBmdW5jdGlvbnMuCisgKi8KKworc3RhdGljIGNoYXIgKiBoYW5kbGVfdHJhY2VfcXVlcnkgKGNoYXIgKik7CitzdGF0aWMgY2hhciAqIGhhbmRsZV90cmFjZV9zZXQgKGNoYXIgKik7CitzdGF0aWMgaW50ICAgIGhhbmRsZV9mb3JtYXQgKGNoYXIgKipyZXF1ZXN0LCBDRkQgKmZvcm1hdCk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjcmMzMiAodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLCB1bnNpZ25lZCBsb25nIGNyYyk7CitzdGF0aWMgY2hhciAqIGNyY19xdWVyeSAoY2hhciAqKTsKK3N0YXRpYyBjaGFyICogaGFuZGxlX3Rlc3QgKGNoYXIgKik7CisKK3ZvaWQKK2hhbmRsZV9yZXF1ZXN0KCBjaGFyICpyZXF1ZXN0ICkKK3sKKyNpZiAwCisgIHJlbW90ZV9kZWJ1ZyA9IDI7CisjZW5kaWYKKyAgc3dpdGNoKCAqcmVxdWVzdCsrICkKKyAgICB7CisgICAgY2FzZSAnayc6CQkvKiAia2lsbCIgKi8KKyAgICAgIGN1cmZyYW1lLnZhbGlkID0gRkFMU0U7CisgICAgICBwdXRwYWNrZXQgKCIiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0QnOgkJLyogImRldGFjaCIgKi8KKyAgICAgIGN1cmZyYW1lLnZhbGlkID0gRkFMU0U7CisgICAgICBwdXRwYWNrZXQgKCIiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgLyogVW5rbm93biBjb2RlLiAgUmV0dXJuIGFuIGVtcHR5IHJlcGx5IG1lc3NhZ2UuICovCisgICAgICBwdXRwYWNrZXQoICIiICk7ICAvKiByZXR1cm4gZW1wdHkgcGFja2V0ICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgJ0gnOiAgICAgICAgICAgLyogU2V0IHRocmVhZCBmb3Igc3Vic2VxdWVudCBvcGVyYXRpb25zLgorICAgIEhjdC4uLiAgICAgICAgICAgICAgICAgYyA9ICdjJyBmb3IgdGhyZWFkIHVzZWQgaW4gc3RlcCBhbmQgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0Li4uIGNhbiBiZSAtMSBmb3IgYWxsIHRocmVhZHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gJ2cnIGZvciB0aHJlYWQgdXNlZCBpbiBvdGhlciBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgemVybywgcGljayBhIHRocmVhZCwgYW55IHRocmVhZC4gICovCisKKyAgICAgIHB1dHBhY2tldCggIk9LIiApOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdnJzogICAgICAgICAgIC8qIFJlYWQgcmVnaXN0ZXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRWFjaCBieXRlIG9mIHJlZ2lzdGVyIGRhdGEgaXMgZGVzY3JpYmVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gaGV4IGRpZ2l0cy4gIHJlZ2lzdGVycyBhcmUgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCBvcmRlciBmb3IgR0RCLCBhbmQgdGhlIGJ5dGVzIGluIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGFyZSBpbiB0aGUgc2FtZSBvcmRlciB0aGUgbWFjaGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcy4gICovCisgICAgICB7CisgICAgICAgIC8qIFJldHVybiB0aGUgdmFsdWVzIGluIChvbmUgb2YpIHRoZSByZWdpc3RlcnMgY2FjaGUocykuCisgICAgICAgICAgIFNldmVyYWwgc2l0dWF0aW9ucyBtYXkgcGVydGFpbjoKKyAgICAgICAgICAgMSkgV2UncmUgc3luY2hyb25vdXMsIGluIHdoaWNoIGNhc2UgdGhlICJyZWdpc3RlcnMiIGFycmF5CisgICAgICAgICAgICAgIHNob3VsZCBhY3R1YWxseSBiZSBjdXJyZW50LgorICAgICAgICAgICAyKSBXZSdyZSBhc3luY2hyb25vdXMsIGluIHdoaWNoIGNhc2UgdGhlICJyZWdpc3RlcnMiIGFycmF5CisgICAgICAgICAgICAgIGhvbGRzIHdoYXRldmVyIHdhcyBjYWNoZWQgbW9zdCByZWNlbnRseS4KKyAgICAgICAgICAgMykgV2UncmUgbG9va2luZyBhdCBhIHRyYWNlIGZyYW1lIHRoYXQgd2FzIGNvbGxlY3RlZCBlYXJsaWVyOgorICAgICAgICAgICAgICB3ZSB3aWxsIHJldHVybiB0aG9zZSBlYXJsaWVyIHJlZ2lzdGVycy4KKyAgICAgICAgICovCisKKyAgICAgICAgLyogYWxsIHJlZ2lzdGVycyBkZWZhdWx0IHRvIHplcm8gKi8KKyAgICAgICAgbWVtc2V0IChvdXRidWZmZXIsICcwJywgTlVNUkVHQllURVMpOworICAgICAgICBvdXRidWZmZXJbTlVNUkVHQllURVNdID0gJ1wwJzsKKworICAgICAgICBpZiAoY3VyZnJhbWUudmFsaWQpICAgICAvKiBkZWJ1Z2dpbmcgYSB0cmFjZSBmcmFtZSAqLworICAgICAgICAgIG1lbTJoZXgoICh1bnNpZ25lZCBjaGFyKikgY3VyZnJhbWUudHJhY2VyZWdzLAorICAgICAgICAgICAgICAgICAgb3V0YnVmZmVyLCBOVU1SRUdCWVRFUywgMCApOworICAgICAgICBlbHNlCisgICAgICAgICAgbWVtMmhleCggKHVuc2lnbmVkIGNoYXIqKSByZWdpc3RlcnMsIG91dGJ1ZmZlciwgTlVNUkVHQllURVMsIDAgKTsKKworICAgICAgICBwdXRwYWNrZXQoIG91dGJ1ZmZlciApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnRyc6ICAgICAgICAgICAvKiBXcml0ZSByZWdpc3RlcnMuCisgICAgR3h4eHh4eHh4ICAgICAgICAgICAgICBFYWNoIGJ5dGUgb2YgcmVnaXN0ZXIgZGF0YSBpcyBkZXNjcmliZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR3byBoZXggZGlnaXRzLiAgKi8KKyAgICAgIGlmIChjdXJmcmFtZS52YWxpZCkgICAgICAgLyogZGVidWdnaW5nIGEgdHJhY2UgZnJhbWUgKi8KKyAgICAgICAgcHV0cGFja2V0ICgiRTAzIik7ICAgICAgLyogY2FuJ3Qgd3JpdGUgcmVncyBpbnRvIGEgdHJhY2UgZnJhbWUhICovCisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBXcml0ZSB0aGUgdmFsdWVzIGludG8gdGhlIGxvY2FsIHJlZ2lzdGVycyBjYWNoZS4uLgorICAgICAgICAgICAgIE5vdGUgdGhhdCBubyBhY3R1YWwgcmVnaXN0ZXJzIGFyZSBiZWluZyBjaGFuZ2VkLiAgKi8KKworICAgICAgICAgIGhleDJtZW0oIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKSByZWdpc3RlcnMsIE5VTVJFR0JZVEVTLCAwICk7CisgICAgICAgICAgcHV0cGFja2V0KCAiT0siICk7CisgICAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1AnOiAgICAgICAgICAgLyogV3JpdGUgKHNpbmdsZSkgcmVnaXN0ZXIuCisgICAgUG5uPXh4eHh4eHh4ICAgICAgICAgICByZWdpc3RlciBubiBnZXRzIHZhbHVlIHh4eHh4eHh4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvIGhleCBkaWdpdHMgZm9yIGVhY2ggYnl0ZSBpbiB0aGUgcmVnaXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh0YXJnZXQgYnl0ZSBvcmRlcikuICAqLworCisgICAgICBpZiAoY3VyZnJhbWUudmFsaWQpCisgICAgICAgIHB1dHBhY2tldCAoIkUwMyIpOyAgICAgIC8qIGNhbid0IHdyaXRlIHJlZ3MgaW50byBhIHRyYWNlIGZyYW1lISAqLworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgdW5zaWduZWQgbG9uZyByZWdubzsKKworICAgICAgICAgIGlmICggaGV4VG9JbnQoICZyZXF1ZXN0LCAmcmVnbm8gKSAmJiAqKHJlcXVlc3QrKykgPT0gJz0nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKCByZWdubyA8IE5VTVJFR1MgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGhleFRvSW50KCAmcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nICopICZyZWdpc3RlcnNbUkVHSVNURVJfQllURShyZWdubyldKTsKKworICAgICAgICAgICAgICAgICAgcHV0cGFja2V0KCAiT0siICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHV0cGFja2V0KCAiRTAxIiApOyAgIC8qIGJhZCBwYWNrZXQgb3IgcmVnbm8gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6ICAgICAgICAgICAvKiBSZWFkIG1lbW9yeS4KKyAgICBtQUFBQUFBQUEsTExMTCAgICAgICAgIEFBQUFBQUFBIGlzIGFkZHJlc3MsIExMTEwgaXMgbGVuZ3RoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwbHkgY2FuIGJlIGZld2VyIGJ5dGVzIHRoYW4gcmVxdWVzdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBhYmxlIHRvIHJlYWQgb25seSBwYXJ0IG9mIHRoZSBkYXRhLiAgKi8KKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBsZW47CisKKyAgICAgICAgaWYgKCBoZXhUb0ludCggJnJlcXVlc3QsICZhZGRyICkgICAgJiYKKyAgICAgICAgICAgICAqKHJlcXVlc3QrKykgPT0gJywnICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICBoZXhUb0ludCggJnJlcXVlc3QsICZsZW4gKSApCisgICAgICAgICAgeworICAgICAgICAgICAgLyogYmV0dGVyIG5vdCBvdmVyd3JpdGUgb3V0YnVmZmVyISAqLworICAgICAgICAgICAgaWYgKCBsZW4gPiAoQlVGTUFYIC8gMikgLSA1ICkKKyAgICAgICAgICAgICAgbGVuID0gKEJVRk1BWCAvIDIpIC0gNTsKKyAgICAgICAgICAgIGlmIChtZW0yaGV4KCh1bnNpZ25lZCBjaGFyICopIGFkZHIsIG91dGJ1ZmZlciwgbGVuLCAxKSA9PSAwKSAvKiBYWFg6IGV2ZW50dWFsbHkgdXNlIHJldHVybmVkIHZhbHVlICovCisgICAgICAgICAgICAgIHB1dHBhY2tldCggIkUwMyIgKTsgICAgICAgLyogcmVhZCBmYXVsdCAoYWNjZXNzIGRlbmllZCkgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcHV0cGFja2V0KCBvdXRidWZmZXIgKTsgICAvKiByZWFkIHN1Y2NlZWRlZCAqLworICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHB1dHBhY2tldCggIkUwMSIgKTsgICAgICAgICAgIC8qIGJhZGx5IGZvcm1lZCByZWFkIHJlcXVlc3QgKi8KKworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnTSc6ICAgICAgICAgICAvKiBXcml0ZSBtZW1vcnkuCisgICAgTWFhYWFhYWFhLGxsbGw6eHh4eCAgICBhYWFhYWFhYSBpcyBhZGRyZXNzLCBsbGxsIGlzIGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHh4eHggaXMgZGF0YSB0byB3cml0ZS4gICovCisKKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBsZW47CisKKyAgICAgICAgaWYgKGN1cmZyYW1lLnZhbGlkKSAgICAgLyogY2FuJ3Qgd3JpdGUgbWVtb3J5IGludG8gYSB0cmFjZSBmcmFtZSEgKi8KKyAgICAgICAgICBwdXRwYWNrZXQgKCJFMDMiKTsgICAgLyogImFjY2VzcyBkZW5pZWQiICovCisgICAgICAgIGVsc2UgLyoqKiBpZiAoIHdyaXRlX2FjY2Vzc19lbmFibGVkICkgKioqLworICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggaGV4VG9JbnQoICZyZXF1ZXN0LCAmYWRkciApICAmJgorICAgICAgICAgICAgICAgICAqKHJlcXVlc3QrKykgPT0gJywnICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgIGhleFRvSW50KCAmcmVxdWVzdCwgJmxlbiApICAgJiYKKyAgICAgICAgICAgICAgICAgKihyZXF1ZXN0KyspID09ICc6JyApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobGVuID09IDIgJiYKKyAgICAgICAgICAgICAgICAgICAgYWRkciA+PSBDU19DT0RFX1NUQVJUICYmCisgICAgICAgICAgICAgICAgICAgIGFkZHIgPD0gTEFTVF9DU19XT1JEKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHZhbDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoICFoZXhUb0ludCggJnJlcXVlc3QsICZ2YWwgKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX3RvX3Byb3RlY3RlZF9tZW0oICh2b2lkICopYWRkciwgdmFsICkgKQorICAgICAgICAgICAgICAgICAgICAgIHB1dHBhY2tldCggIkUwMyIgKTsgICAvKiB3cml0ZSBmYXVsdCAoYWNjZXNzIGRlbmllZCkgKi8KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIHB1dHBhY2tldCggIk9LIiApOyAgICAvKiB3cml0ZSBzdWNjZWVkZWQgKi8KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaGV4Mm1lbSggcmVxdWVzdCwgKHVuc2lnbmVkIGNoYXIqKSBhZGRyLCBsZW4sIDEgKSApCisgICAgICAgICAgICAgICAgICAgICAgcHV0cGFja2V0KCAiRTAzIiApOyAgIC8qIHdyaXRlIGZhdWx0IChhY2Nlc3MgZGVuaWVkKSAqLworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgcHV0cGFja2V0KCAiT0siICk7ICAgIC8qIHdyaXRlIHN1Y2NlZWRlZCAqLworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHV0cGFja2V0KCAiRTAyIiApOyAgICAgLyogYmFkbHkgZm9ybWVkIHdyaXRlIHJlcXVlc3QgKi8KKyAgICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdjJzogICAgICAgICAgIC8qIENvbnRpbnVlLgorICAgIGNBQUFBQUFBQSAgICAgICAgICAgICAgQUFBQUFBQUEgaXMgYWRkcmVzcyBmcm9tIHdoaWNoIHRvIHJlc3VtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG9taXR0ZWQsIHJlc3VtZSBhdCBjdXJyZW50IFBDLiAgKi8KKworICAgICAgeworICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlpZiAoY3VyZnJhbWUudmFsaWQpCisJICB7CisJICAgIC8qIERvbid0IGNvbnRpbnVlIGlmIGRlYnVnZ2luZyBhIHRyYWNlIGZyYW1lISAqLworCSAgICBnZGJfcHV0cyAoIkVycm9yOiBjYW4ndCBjb250aW51ZSFcbiIpOworCSAgICBwdXRwYWNrZXQgKCJTMDMiKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGdkYl9zaWdubyA9IDM7CisJICAgIGlmIChpc3hkaWdpdChyZXF1ZXN0WzBdKSkKKwkgICAgICB7CisJCWhleFRvSW50KCZyZXF1ZXN0LCAmYWRkcik7CisJCXJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKFBDKV0gPSBhZGRyOworCSAgICAgIH0KKworCSAgICBnZGJfaGFuZGxpbmdfdHJhcDEgPSBGQUxTRTsKKwkgICAgZ2RiX2hhbmRsaW5nX3NzdHJhY2UgPSBGQUxTRTsKKwkgICAgc3NzX3RyYWNlX2ZsYWcgPSAnXDAnOworCSAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6ICAgICAgICAgICAvKiBTdGVwLgorICAgIHNBQUFBQUFBQSAgICAgICAgICAgICAgQUFBQUFBQUEgaXMgYWRkcmVzcyBmcm9tIHdoaWNoIHRvIGJlZ2luIHN0ZXBwaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgb21pdHRlZCwgYmVnaW4gc3RlcHBpbmcgYXQgY3VycmVudCBQQy4gICovCisgICAgICB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcjsKKworCWlmIChjdXJmcmFtZS52YWxpZCkKKwkgIHsKKwkgICAgLyogRG9uJ3Qgc3RlcCBpZiBkZWJ1Z2dpbmcgYSB0cmFjZSBmcmFtZSEgKi8KKwkgICAgZ2RiX3B1dHMgKCJFcnJvcjogY2FuJ3Qgc3RlcCFcbiIpOworCSAgICBwdXRwYWNrZXQgKCJTMDMiKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGdkYl9zaWdubyA9IDM7CisJICAgIGlmIChpc3hkaWdpdChyZXF1ZXN0WzBdKSkKKwkgICAgICB7CisJCWhleFRvSW50KCZyZXF1ZXN0LCAmYWRkcik7CisJCXJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKFBDKV0gPSBhZGRyOworCSAgICAgIH0KKworCSAgICBnZGJfaGFuZGxpbmdfdHJhcDEgPSBGQUxTRTsKKwkgICAgZ2RiX2hhbmRsaW5nX3NzdHJhY2UgPSBGQUxTRTsKKwkgICAgc3NzX3RyYWNlX2ZsYWcgPSAndCc7CisJICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdDJzogICAgICAgICAgIC8qIENvbnRpbnVlIHdpdGggc2lnbmFsLgorICAgIEN4eDtBQUFBQUFBQSAgICAgICAgICAgeHggaXMgc2lnbmFsIG51bWJlciBpbiBoZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUFBQUFBQSBpcyBhZGRkcmVzcyBmcm9tIHdoaWNoIHRvIHJlc3VtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIDtBQUFBQUFBQSBvbWl0dGVkLCBjb250aW51ZSBmcm9tIFBDLiAgICovCisKKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyID0gMDsKKworICAgICAgICBpZiAoIWdkYl9oYW5kbGluZ190cmFwMSB8fCBjdXJmcmFtZS52YWxpZCkKKyAgICAgICAgICB7CisJICAgIC8qIERvbid0IGNvbnRpbnVlIGlmIG5vdCBjdXJyZW50bHkgaW4gc3luY2hyb25vdXMgbW9kZSwKKwkgICAgICAgb3IgaWYgY3VycmVudGx5IGRlYnVnZ2luZyBhIHRyYWNlIGZyYW1lISAgKi8KKyAgICAgICAgICAgIGdkYl9wdXRzKCAiRXJyb3I6IGNhbid0IGNvbnRpbnVlIVxuIiApOworICAgICAgICAgICAgcHV0cGFja2V0KCAiUzAzIiApOyAgICAgICAvKiAic2lncXVpdCIgIChiZXR0ZXIgaWRlYT8pICovCisgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgeworCSAgICBnZGJfc2lnbm8gPSAzOworICAgICAgICAgICAgaWYgKCBpc3hkaWdpdCggKnJlcXVlc3QgKSApCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZXgybWVtKCByZXF1ZXN0LCAodW5zaWduZWQgY2hhciAqKSAmZ2RiX3NpZ25vLCAyLCAwICk7CisgICAgICAgICAgICAgICAgcmVxdWVzdCArPSAyOworICAgICAgICAgICAgICAgIGlmICggKnJlcXVlc3QgPT0gJzsnICYmIGlzeGRpZ2l0KCAqKytyZXF1ZXN0ICkgKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoZXhUb0ludCggJnJlcXVlc3QsICZhZGRyICk7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyc1tSRUdJU1RFUl9CWVRFKFBDKV0gPSBhZGRyOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICBnZGJfaGFuZGxpbmdfdHJhcDEgPSBGQUxTRTsKKyAgICAgICAgICAgIGdkYl9oYW5kbGluZ19zc3RyYWNlID0gRkFMU0U7CisgICAgICAgICAgICBzc3NfdHJhY2VfZmxhZyA9ICdcMCc7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnUyc6ICAgICAgICAgICAvKiBTdGVwIHdpdGggc2lnbmFsLgorICAgIFN4eDtBQUFBQUFBQSAgICAgICAgICAgeHggaXMgc2lnbmFsIG51bWJlciBpbiBoZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUFBQUFBQSBpcyBhZGRkcmVzcyBmcm9tIHdoaWNoIHRvIGJlZ2luIHN0ZXBwaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgO0FBQUFBQUFBIG9taXR0ZWQsIGJlZ2luIHN0ZXBwaW5nIGZyb20gUEMuICAgKi8KKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyID0gMDsKKworICAgICAgICBpZiAoIWdkYl9oYW5kbGluZ190cmFwMSB8fCBjdXJmcmFtZS52YWxpZCkKKyAgICAgICAgICB7CisJICAgIC8qIERvbid0IHN0ZXAgaWYgbm90IGN1cnJlbnRseSBpbiBzeW5jaHJvbm91cyBtb2RlLAorCSAgICAgICBvciBpZiBjdXJyZW50bHkgZGVidWdnaW5nIGEgdHJhY2UgZnJhbWUhICAqLworICAgICAgICAgICAgZ2RiX3B1dHMoICJFcnJvcjogY2FuJ3Qgc3RlcCFcbiIgKTsKKyAgICAgICAgICAgIHB1dHBhY2tldCggIlMwMyIgKTsgICAgICAgLyogInNpZ3F1aXQiICAoYmV0dGVyIGlkZWE/KSAqLworICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHsKKwkgICAgZ2RiX3NpZ25vID0gMzsKKyAgICAgICAgICAgIGlmICggaXN4ZGlnaXQoICpyZXF1ZXN0ICkgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGV4Mm1lbSggcmVxdWVzdCwgKHVuc2lnbmVkIGNoYXIgKikgJmdkYl9zaWdubywgMiwgMCApOworICAgICAgICAgICAgICAgIHJlcXVlc3QgKz0gMjsKKyAgICAgICAgICAgICAgICBpZiAoICpyZXF1ZXN0ID09ICc7JyAmJiBpc3hkaWdpdCggKisrcmVxdWVzdCApICkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGV4VG9JbnQoICZyZXF1ZXN0LCAmYWRkciApOworICAgICAgICAgICAgICAgICAgICByZWdpc3RlcnNbUkVHSVNURVJfQllURShQQyldID0gYWRkcjsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2RiX2hhbmRsaW5nX3RyYXAxID0gRkFMU0U7CisgICAgICAgICAgICBnZGJfaGFuZGxpbmdfc3N0cmFjZSA9IEZBTFNFOworICAgICAgICAgICAgc3NzX3RyYWNlX2ZsYWcgPSAndCc7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnPyc6ICAgICAgICAgICAvKiBRdWVyeSB0aGUgbGF0ZXN0IHJlYXNvbiBmb3Igc3RvcHBpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG91bGQgYmUgc2FtZSByZXBseSBhcyB3YXMgbGFzdCBnZW5lcmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzdGVwIG9yIGNvbnRpbnVlLiAgKi8KKworICAgICAgaWYgKCBnZGJfc2lnbm8gPT0gMCApCisgICAgICAgIGdkYl9zaWdubyA9IDM7ICAvKiBkZWZhdWx0IHRvIFNJR1FVSVQgKi8KKyAgICAgIG91dGJ1ZmZlclsgMCBdID0gJ1MnOworICAgICAgb3V0YnVmZmVyWyAxIF0gPSBoZXhjaGFyc1sgZ2RiX3NpZ25vID4+ICA0IF07CisgICAgICBvdXRidWZmZXJbIDIgXSA9IGhleGNoYXJzWyBnZGJfc2lnbm8gJiAweGYgXTsKKyAgICAgIG91dGJ1ZmZlclsgMyBdID0gMDsKKyAgICAgIHB1dHBhY2tldCggb3V0YnVmZmVyICk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2QnOiAgICAgICAgICAgLyogVG9nZ2xlIGRlYnVnIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEknbSBzdXJlIHdlIGNhbiB0aGluayBvZiBzb21ldGhpbmcgaW50ZXJlc3RpbmcuICAqLworCisgICAgICByZW1vdGVfZGVidWcgPSAhcmVtb3RlX2RlYnVnOworICAgICAgcHV0cGFja2V0KCAiIiApOyAgLyogcmV0dXJuIGVtcHR5IHBhY2tldCAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdxJzogICAgICAgICAgIC8qIGdlbmVyYWwgcXVlcnkgKi8KKyAgICAgIHN3aXRjaCAoKnJlcXVlc3QrKykKKyAgICAgICAgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHB1dHBhY2tldCAoIiIpOyAgICAgICAvKiBuYWsgYSByZXF1ZXN0IHdoaWNoIHdlIGRvbid0IGhhbmRsZSAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdUJzogICAgICAgICAgICAgICAvKiB0cmFjZSBxdWVyeSAqLworICAgICAgICAgIHB1dHBhY2tldCAoaGFuZGxlX3RyYWNlX3F1ZXJ5IChyZXF1ZXN0KSk7CisgICAgICAgICAgYnJlYWs7CisJY2FzZSAnQyc6CQkvKiBjcmMgcXVlcnkgKD8pICovCisJICBpZiAoKnJlcXVlc3QrKyA9PSAnUicgJiYKKwkgICAgICAqcmVxdWVzdCsrID09ICdDJyAmJgorCSAgICAgICpyZXF1ZXN0KysgPT0gJzonKQorCSAgICBwdXRwYWNrZXQgKGNyY19xdWVyeSAocmVxdWVzdCkpOworCSAgZWxzZQorCSAgICBwdXRwYWNrZXQgKCIiKTsJLyogdW5rbm93biBxdWVyeSAqLworCSAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnUSc6ICAgICAgICAgICAgICAgICAgIC8qIGdlbmVyYWwgc2V0ICovCisgICAgICBzd2l0Y2ggKCpyZXF1ZXN0KyspCisgICAgICAgIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBwdXRwYWNrZXQgKCIiKTsgICAgICAgLyogbmFrIGEgcmVxdWVzdCB3aGljaCB3ZSBkb24ndCBoYW5kbGUgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnVCc6ICAgICAgICAgICAgICAgLyogdHJhY2UgKi8KKyAgICAgICAgICBwdXRwYWNrZXQgKGhhbmRsZV90cmFjZV9zZXQgKHJlcXVlc3QpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdUJzoKKyAgICAgIC8qIGNhbGwgdGVzdCBmdW5jdGlvbjogVEFBQSxCQkIsQ0NDIAorCSBBLCBCLCBhbmQgQyBhcmUgYXJndW1lbnRzIHRvIHBhc3MgdG8gZ2RiX2NfdGVzdC4gIFJlcGx5IGlzCisJICJFMDEiIChiYWQgYXJndW1lbnRzKSBvciAiT0siICh0ZXN0IGZ1bmN0aW9uIGNhbGxlZCkuICAqLworICAgICAgcHV0cGFja2V0IChoYW5kbGVfdGVzdCAocmVxdWVzdCkpOworICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgVERQX1NFVFVQX0lORk8gdGRwX3RlbXA7CitzdGF0aWMgaW50IHRyYWNlX3J1bm5pbmc7CisKKy8qCisgKiBGdW5jdGlvbiBtc2djbXA6CisgKgorICogSWYgc2Vjb25kIGFyZ3VtZW50IChzdHIpIGlzIG1hdGNoZWQgaW4gZmlyc3QgYXJndW1lbnQsCisgKiAgICB0aGVuIGFkdmFuY2UgZmlyc3QgYXJndW1lbnQgcGFzdCBlbmQgb2Ygc3RyIGFuZCByZXR1cm4gIlNBTUUiCisgKiBlbHNlIHJldHVybiAiRElGRkVSRU5UIiB3aXRob3V0IGNoYW5naW5nIGZpcnN0IGFyZ3VtZW50LgorICoKKyAqIFJldHVybjogemVybyBmb3IgRElGRkVSRU5ULCBub24temVybyBmb3IgU1VDQ0VTUworICovCisKK3N0YXRpYyBpbnQKK21zZ2NtcCAoY2hhciAqKm1zZ3AsIGNoYXIgKnN0cikKK3sKKyAgY2hhciAqbmV4dDsKKworICBpZiAobXNncCAhPSAwICYmIHN0ciAhPSAwKSAgICAvKiBpbnB1dCB2YWxpZGF0aW9uICovCisgICAgaWYgKChuZXh0ID0gKm1zZ3ApICE9IDApCisgICAgICB7CisgICAgICAgIGZvciAoOworICAgICAgICAgICAgICpuZXh0ICYmICpzdHIgJiYgKm5leHQgPT0gKnN0cjsKKyAgICAgICAgICAgICBuZXh0KyssIHN0cisrKQorICAgICAgICAgIDsKKworICAgICAgICBpZiAoKnN0ciA9PSAwKSAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgYWxsIG9mIHN0ciBpbiBtc2cgKi8KKyAgICAgICAgICByZXR1cm4gKGludCkgKCptc2dwID0gbmV4dCk7ICAvKiBhZHZhbmNlIG1zZyBwdHIgcGFzdCBzdHIgICovCisgICAgICB9CisgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmFpbHVyZSAqLworfQorCitzdGF0aWMgY2hhciAqCitoYW5kbGVfdHJhY2VfcXVlcnkgKGNoYXIgKnJlcXVlc3QpCit7CisgIGlmIChtc2djbXAgKCZyZXF1ZXN0LCAiU3RhdHVzIikpCisgICAgeworICAgICAgaWYgKGFkYmdfY2hlY2tfaWZfYWN0aXZlICgpKQorCXsKKwkgIGdkYl9wdXRzICgiVGFyZ2V0IHRyYWNlIGlzIHJ1bm5pbmcuXG4iKTsKKwkgIHJldHVybiAiVDEiOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBnZGJfcHV0cyAoIlRhcmdldCB0cmFjZSBub3QgcnVubmluZy5cbiIpOworCSAgdHJhY2VfcnVubmluZyA9IDA7CisJICByZXR1cm4gIlQwIjsKKwl9CisgICAgfQorICBlbHNlICAgICAgICAgICAgICAgICAgLyogdW5rbm93biB0cmFjZSBxdWVyeSAqLworICAgIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitnZGJfbm90ZSAoY2hhciAqZm10LCBpbnQgYXJnMSkKK3sKKyAgaWYgKHJlbW90ZV9kZWJ1ZyA+IDEpCisgICAgeworICAgICAgc3ByaW50cCAoc3BhcmVfYnVmZmVyLCBmbXQsIGFyZzEpOworICAgICAgZ2RiX3B1dHMgKHNwYXJlX2J1ZmZlcik7CisgICAgfQorfQorCitzdGF0aWMgaW50CitlcnJvcl9yZXQgKGludCByZXQsIGNoYXIgKmZtdCwgaW50IGFyZzEpCit7CisgIGlmIChyZW1vdGVfZGVidWcgPiAwKQorICAgIHsKKyAgICAgIHNwcmludHAgKHNwYXJlX2J1ZmZlciwgZm10LCBhcmcxKTsKKyAgICAgIGdkYl9wdXRzIChzcGFyZV9idWZmZXIpOworICAgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAoraGFuZGxlX2Zvcm1hdCAoY2hhciAqKnJlcXVlc3QsIENPTExFQ1RJT05fRk9STUFUX0RFRiAqZm9ybWF0KQoreworICBNRU1SQU5HRV9ERUYgbTsKKyAgRFRDX1JFU1BPTlNFIHJldDsKKyAgaW50IGVsaW51bTsKKyAgdW5zaWduZWQgbG9uZyByZWdudW07CisgIGxvbmcgYnl0ZWNvZGVzWyhNQVhfQllURV9DT0RFUyArIHNpemVvZiAoc3RydWN0IHRfZXhwcl90YWcpKS8gNF07CisgIHN0cnVjdCB0X2V4cHJfdGFnICp0X2V4cHIgPSAoc3RydWN0IHRfZXhwcl90YWcgKilieXRlY29kZXM7CisKKyAgaWYgKGZvcm1hdC0+aWQgPT0gMCkKKyAgICB7CisgICAgICBpZiAoKHJldCA9IGdldF91bnVzZWRfZm9ybWF0X2lkICgmZm9ybWF0LT5pZCkpICE9IE9LX1RBUkdFVF9SRVNQT05TRSkKKwlyZXR1cm4gZHRjX2Vycm9yX3JldCAoLTEsICJnZXRfdW51c2VkX2Zvcm1hdF9pZCIsIHJldCk7CisKKyAgICAgIGlmICgqKnJlcXVlc3QgPT0gJ1InKQorCXsKKwkgICgqcmVxdWVzdCkrKzsKKwkgIGhleFRvSW50IChyZXF1ZXN0LCAmZm9ybWF0LT5yZWdzX21hc2spOworCX0KKyAgICAgIGdkYl9ub3RlICgiU1RVQjogY2FsbCBkZWZpbmVfZm9ybWF0IChpZCA9ICVkLCAiLCBmb3JtYXQtPmlkKTsKKyAgICAgIGdkYl9ub3RlICgicmVnc19tYXNrID0gMHglWCk7XG4iLCBmb3JtYXQtPnJlZ3NfbWFzayk7CisKKyAgICAgIGlmICgocmV0ID0gZGVmaW5lX2Zvcm1hdCAoZm9ybWF0KSkgIT0gT0tfVEFSR0VUX1JFU1BPTlNFKQorCXsKKwkgIHNwcmludHAgKHNwYXJlX2J1ZmZlciwKKwkJICAgIidkZWZpbmVfZm9ybWF0JzogRFRDIGVycm9yICclcycgZm9yIGZvcm1hdCBpZCAlZC5cbiIsCisJCSAgIGdldF9lcnJfdGV4dCAocmV0KSwKKwkJICAgZm9ybWF0LT5pZCk7CisJICBnZGJfcHV0cyAoc3BhcmVfYnVmZmVyKTsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgIHdoaWxlICgoKipyZXF1ZXN0ID09ICdNJykgfHwgKCoqcmVxdWVzdCA9PSAnWCcpKQorICAgIHsKKyAgICAgIHN3aXRjaCAoKipyZXF1ZXN0KQorCXsKKwljYXNlICdNJzoJCS8qIE08cmVnbnVtPiw8b2Zmc2V0Piw8c2l6ZT4gKi8KKwkgICgqcmVxdWVzdCkrKzsKKwkgIGhleFRvSW50KHJlcXVlc3QsICZyZWdudW0pOworCisJICBpZiAocmVnbnVtID09IDAgfHwgcmVnbnVtID09ICh1bnNpZ25lZCBsb25nKSAtMSkKKwkgICAgbS50eXBlY29kZSA9IC0xOworCSAgZWxzZSBpZiAoKGVsaW51bSA9IGluZGV4X3RvX2VsaW51bSAocmVnbnVtKSkgPiAwKQorCSAgICBtLnR5cGVjb2RlID0gZWxpbnVtOworCSAgZWxzZQorCSAgICByZXR1cm4gZXJyb3JfcmV0ICgtMSwKKwkJCSAgICAgICJNZW1yYW5nZSByZWdpc3RlciAlZCBpcyBub3QgYmV0d2VlbiAwIGFuZCAxNVxuIiwKKwkJCSAgICAgIHJlZ251bSk7CisKKwkgIGlmICgqKCpyZXF1ZXN0KSsrICE9ICcsJykKKwkgICAgcmV0dXJuIGVycm9yX3JldCAoLTEsIk1hbGZvcm1lZCBtZW1yYW5nZSAoY29tbWEgIyVkIG1pc3NpbmcpXG4iLDEpOworCSAgaGV4VG9JbnQocmVxdWVzdCwgJm0ub2Zmc2V0KTsKKwkgIGlmICgqKCpyZXF1ZXN0KSsrICE9ICcsJykKKwkgICAgcmV0dXJuIGVycm9yX3JldCAoLTEsIk1hbGZvcm1lZCBtZW1yYW5nZSAoY29tbWEgIyVkIG1pc3NpbmcpXG4iLDIpOworCSAgaGV4VG9JbnQocmVxdWVzdCwgJm0uc2l6ZSk7CisKKwkgIGdkYl9ub3RlICgiU1RVQjogY2FsbCBhZGRfZm9ybWF0X21lbV9yYW5nZSAodHlwZWNvZGUgPSAgMHgleCwgIiwKKwkJICAgIG0udHlwZWNvZGUpOworCSAgZ2RiX25vdGUgKCJvZmZzZXQgPSAweCVYLCAiLCBtLm9mZnNldCk7CisJICBnZGJfbm90ZSAoInNpemUgPSAlZCk7XG4iLCBtLnNpemUpOworCSAgaWYgKChyZXQgPSBhZGRfZm9ybWF0X21lbV9yYW5nZXMgKGZvcm1hdC0+aWQsICZtKSkgIT0gCisJICAgICAgT0tfVEFSR0VUX1JFU1BPTlNFKQorCSAgICB7CisJICAgICAgZHRjX2Vycm9yX3JldCAoLTEsICJhZGRfZm9ybWF0X21lbV9yYW5nZXMiLCByZXQpOworCSAgICAgIHNwcmludHAgKHNwYXJlX2J1ZmZlciwKKwkJICAgICAgICJmb3JtYXQgaWQgJWQ6IG1lbXJhbmdlICgweCV4LCAweCV4LCAweCV4KS5cbiIsCisJCSAgICAgICBmb3JtYXQtPmlkLCBtLnR5cGVjb2RlLCBtLm9mZnNldCwgbS5zaXplKTsKKwkgICAgICBnZGJfcHV0cyAoc3BhcmVfYnVmZmVyKTsKKwkgICAgICByZXR1cm4gLTE7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSAnWCc6CQkvKiBYPGxlbmd0aD4sPGJ5dGVjb2Rlcz4gKi8KKwkgIHsKKwkgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7CisKKwkgICAgKCpyZXF1ZXN0KSsrOworCSAgICBoZXhUb0ludChyZXF1ZXN0LCAmbGVuZ3RoKTsKKworCSAgICBpZiAoKGxlbmd0aCA8PSAwKSB8fCAobGVuZ3RoID4gTUFYX0JZVEVfQ09ERVMpKQorCSAgICAgIHJldHVybiBlcnJvcl9yZXQgKC0xLCAKKwkJCQkiQnl0ZWNvZGUgZXhwcmVzc2lvbiBsZW5ndGggKCVkKSB0b28gbGFyZ2VcbiIsCisJCQkJbGVuZ3RoKTsKKworCSAgICBpZiAoKigqcmVxdWVzdCkrKyAhPSAnLCcpCisJICAgICAgcmV0dXJuIGVycm9yX3JldCAoLTEsIAorCQkJCSJNYWxmb3JtZWQgYnl0ZWNvZGUgZXhwciAoY29tbWEjJWQgbWlzc2luZylcbiIsCisJCQkJMSk7CisJICAgIHRfZXhwci0+bmV4dCA9IE5VTEw7CisJICAgIC8qIHN1YnRyYWN0IG9uZSB0byBhY2NvdW50IGZvciBleHByWzBdIGluIGhlYWRlciAqLworCSAgICB0X2V4cHItPnNpemUgPSBzaXplb2Yoc3RydWN0IHRfZXhwcl90YWcpICsgbGVuZ3RoIC0gMTsKKwkgICAgdF9leHByLT5leHByX3NpemUgPSBsZW5ndGg7CisKKwkgICAgaGV4Mm1lbSgqcmVxdWVzdCwgJnRfZXhwci0+ZXhwclswXSwgbGVuZ3RoLCAwKTsKKwkgICAgKnJlcXVlc3QgKz0gMiAqIGxlbmd0aDsKKwkgICAgYnVpbGRfYW5kX2FkZF9leHByZXNzaW9uKGZvcm1hdC0+aWQsIHRfZXhwcik7CisJICB9CisJICBicmVhazsKKwl9CisgICAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKgoraGFuZGxlX3RyYWNlX3NldCAoY2hhciAqcmVxdWVzdCkKK3sKKyAgbG9uZyBuX2ZyYW1lOworICB1bnNpZ25lZCBsb25nIGZyYW1lbm8sIHRkcCwgcGMsIHN0YXJ0LCBzdG9wOworICBEVENfUkVTUE9OU0UgcmV0ID0gLTE7CisgIHN0YXRpYyBDT0xMRUNUSU9OX0ZPUk1BVF9ERUYgdGVtcGZtdDE7CisgIHN0YXRpYyBjaGFyIGVuYWJsZTsKKyAgc3RhdGljIGNoYXIgcmV0YnVmWzIwXTsKKworICBpZiAobXNnY21wICgmcmVxdWVzdCwgImluaXQiKSkKKyAgICB7CisgICAgICBnZGJfbm90ZSAoIlNUVUI6IGNhbGwgY2xlYXJfdHJhY2Vfc3RhdGUoKTtcbiIsIDApOworICAgICAgY3VyZnJhbWUudmFsaWQgPSAwOyAgICAgICAvKiBhbGwgb2xkIGZyYW1lcyBiZWNvbWUgaW52YWxpZCBub3cgKi8KKyAgICAgIGlmICgocmV0ID0gY2xlYXJfdHJhY2Vfc3RhdGUgKCkpID09IE9LX1RBUkdFVF9SRVNQT05TRSkKKyAgICAgICAgcmV0dXJuICJPSyI7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBzcHJpbnRwIChyZXRidWYsICJFMiV4IiwgcmV0KTsKKyAgICAgICAgICByZXR1cm4gKGNoYXIgKikgZHRjX2Vycm9yX3JldCAoKGludCkgJnJldGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsZWFyX3RyYWNlX3N0YXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0KTsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZSBpZiAobXNnY21wICgmcmVxdWVzdCwgIlN0YXJ0IikpCisgICAgeworICAgICAgdHJhY2VfcnVubmluZyA9IDE7CisgICAgICBjdXJmcmFtZS52YWxpZCA9IDA7ICAgICAgIC8qIGFsbCBvbGQgZnJhbWVzIGJlY29tZSBpbnZhbGlkIG5vdyAqLworICAgICAgZ2RiX25vdGUgKCJTVFVCOiBjYWxsIHN0YXJ0X3RyYWNlX2V4cGVyaW1lbnQoKTtcbiIsIDApOworICAgICAgYWRiZ19zYXZlX3RyYWNlX2luX252ZCAoKTsKKyAgICAgIGlmICgocmV0ID0gc3RhcnRfdHJhY2VfZXhwZXJpbWVudCAoKSkgPT0gT0tfVEFSR0VUX1JFU1BPTlNFKQorICAgICAgICByZXR1cm4gIk9LIjsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHNwcmludHAgKHJldGJ1ZiwgIkUyJXgiLCByZXQpOworICAgICAgICAgIHJldHVybiAoY2hhciAqKSBkdGNfZXJyb3JfcmV0ICgoaW50KSAmcmV0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhcnRfdHJhY2VfZXhwZXJpbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgaWYgKG1zZ2NtcCAoJnJlcXVlc3QsICJTdG9wIikpCisgICAgeworICAgICAgdHJhY2VfcnVubmluZyA9IDA7CisgICAgICBpZiAoYWRiZ19jaGVja19pZl9hY3RpdmUgKCkpCisJeworCSAgZ2RiX25vdGUgKCJTVFVCOiBjYWxsIGVuZF90cmFjZV9leHBlcmltZW50KCk7XG4iLCAwKTsKKwkgIGlmICgocmV0ID0gZW5kX3RyYWNlX2V4cGVyaW1lbnQgKCkpID09IE9LX1RBUkdFVF9SRVNQT05TRSkKKwkgICAgcmV0dXJuICJPSyI7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzcHJpbnRwIChyZXRidWYsICJFMiV4IiwgcmV0KTsKKwkgICAgICByZXR1cm4gKGNoYXIgKikgZHRjX2Vycm9yX3JldCAoKGludCkgJnJldGJ1ZiwKKwkJCQkJICAgICAiZW5kX3RyYWNlX2V4cGVyaW1lbnQiLAorCQkJCQkgICAgIHJldCk7CisJICAgIH0KKwl9CisgICAgICBlbHNlIHJldHVybiAiT0siOworICAgIH0KKyAgLyogIlREUDoiIChUaGUgJ1QnIHdhcyBjb25zdW1lZCBpbiBoYW5kbGVfcmVxdWVzdC4pICAqLworICBlbHNlIGlmIChtc2djbXAgKCZyZXF1ZXN0LCAiRFA6IikpCisgICAgeworICAgICAgLyogVERQOjxpZD46PGFkZHI+OntELEV9OjxzdGVwY291bnQ+OjxwYXNzX2xpbWl0PntSW00sWF0rfTx0ZHAtZm9ybWF0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7U3tSW00sWF0rfX08dHAtZm9ybWF0PgorCisJIEQgLS0gZGlzYWJsZSB0cmFjZXBvaW50IChpbGxlZ2FsIGZyb20gRU1DJ3MgcG9pbnQgb2YgdmlldykKKwkgRSAtLSBlbmFibGUgdHJhY2Vwb2ludD8KKworCSBSIC0tIHJlZ3MgZm9ybWF0OiBSPHJlZ3MtbWFzaz4KKwkgTSAtLSBtZW1vcnkgZm9ybWF0OiBNPHJlZ251bT4sPG9mZnNldD4sPHNpemU+CisJIFggLS0gZXhwciBmb3JtYXQ6IFg8c2l6ZT4sPGJ5dGVjb2Rlcz4KKwkgUyAtLSBmZW5jZXBvc3QgYmV0d2VlbiB0cmFwIGZvcm1hdHMgYW5kIHN0ZXBwaW5nIGZvcm1hdHMuCisJICovCisKKyAgICAgIC8qIHN0YXRlIHZhcmlhYmxlLCByZXF1aXJlZCBmb3Igc3BsaXR0aW5nIFREUCBwYWNrZXRzLiAqLworICAgICAgc3RhdGljIGludCBkb2luZ19zdGVwX2Zvcm1hdHM7CisKKyAgICAgIC8qIAorICAgICAgICogVERQOiBwYWNrZXRzIG1heSBub3cgYmUgc3BsaXQgaW50byBtdWx0aXBsZSBwYWNrZXRzLgorICAgICAgICogSWYgYSBURFAgcGFja2V0IGlzIHRvIGJlIGNvbnRpbnVlZCBpbiBhbm90aGVyIHBhY2tldCwgaXQKKyAgICAgICAqIG11c3QgZW5kIGluIGEgIi0iIGNoYXJhY3Rlci4gIFRoZSBzdWJzZXF1ZW50IGNvbnRpbnVhdGlvbgorICAgICAgICogcGFja2V0IHdpbGwgdGhlbiBiZWdpbiB3aXRoIGEgIi0iIGNoYXJhY3RlciwgYmV0d2VlbiB0aGUKKyAgICAgICAqIHRva2VuICJURFA6IiBhbmQgdGhlIHRkcF9pZCBmaWVsZC4gIFRoZSBJRCBhbmQgYWRkcmVzcworICAgICAgICogd2lsbCBiZSByZXBlYXRlZCBpbiBlYWNoIHN1Yi1wYWNrZXQuICBUaGUgc3RlcF9jb3VudCwgCisgICAgICAgKiBwYXNzX2NvdW50LCBhbmQgJ2VuYWJsZWQnIGZpZWxkIG11c3QgYXBwZWFyIGluIHRoZSBmaXJzdAorICAgICAgICogcGFja2V0LiAgVGhlIGJvdW5kYXJ5IGJldHdlZW4gc3ViLXBhY2tldHMgbWF5IG5vdCBhcHBlYXIKKyAgICAgICAqIGJldHdlZW4gdGhlICJTIiB0aGF0IGRlbm90ZXMgdGhlIHN0YXJ0IG9mIHN0ZXBwaW5nICJmb3JtYXRzIiwKKyAgICAgICAqIGFuZCB0aGUgcmVnc19tYXNrIHRoYXQgZm9sbG93cyBpdC4gIFRoZSBzcGxpdCBtYXkgYWxzbyBub3QKKyAgICAgICAqIG9jY3VyIGluIHRoZSBtaWRkbGUgb2YgZWl0aGVyIGEgbWVtcmFuZ2UgZGVzY3JpcHRpb24gb3IgYQorICAgICAgICogYnl0ZWNvZGUgc3RyaW5nLiAgLS0gTVZTCisgICAgICAgKi8KKworICAgICAgaWYgKCpyZXF1ZXN0ID09ICctJykJLyogdGhpcyBpcyBhIGNvbnRpbnVhdGlvbiBvZiBhIAorCQkJCSAgIHRyYWNlIGRlZmluaXRpb24gaW4gcHJvZ3Jlc3MgKi8KKwl7CisJICB1bnNpZ25lZCBsb25nIHRlbXBfaWQsIHRlbXBfYWRkcjsKKworCSAgcmVxdWVzdCsrOworCSAgaWYgKCEoaGV4VG9JbnQgKCZyZXF1ZXN0LCAmdGVtcF9pZCkgJiYKKwkJKnJlcXVlc3QrKyA9PSAnOicpKQorCSAgICByZXR1cm4gIkUxMSI7ICAgICAgICAgICAvKiBiYWRseSBmb3JtZWQgcGFja2V0LCBmaWVsZCAxICovCisKKwkgIGlmICghKGhleFRvSW50ICgmcmVxdWVzdCwgKHVuc2lnbmVkIGxvbmcgKikgJnRlbXBfYWRkcikgJiYKKwkJKnJlcXVlc3QrKyA9PSAnOicpKQorCSAgICByZXR1cm4gIkUxMiI7ICAgICAgICAgICAvKiBiYWRseSBmb3JtZWQgcGFja2V0LCBmaWVsZCAyICovCisKKwkgIGlmICh0ZW1wX2lkICAgIT0gdGRwX3RlbXAuaWQpCisJICAgIHJldHVybiAiRTExIjsJLyogc29tZXRoaW5nIHdyb25nOiBmaWVsZCAxIGRvZXNuJ3QgbWF0Y2ggKi8KKwkgIGlmICh0ZW1wX2FkZHIgIT0gKHVuc2lnbmVkIGxvbmcpIHRkcF90ZW1wLmFkZHIpCisJICAgIHJldHVybiAiRTEyIjsJLyogc29tZXRoaW5nIHdyb25nOiBmaWVsZCAyIGRvZXNuJ3QgbWF0Y2ggKi8KKwl9CisgICAgICBlbHNlCQkJLyogVGhpcyBpcyBhIG5ldyBURFAgZGVmaW5pdGlvbiAqLworCXsKKwkgIG1lbXNldCAoKGNoYXIgKikgJnRkcF90ZW1wLCAwLCBzaXplb2YgKHRkcF90ZW1wKSk7CisJICBtZW1zZXQgKChjaGFyICopICZ0ZW1wZm10MSwgMCwgc2l6ZW9mICh0ZW1wZm10MSkpOworCSAgZG9pbmdfc3RlcF9mb3JtYXRzID0gRkFMU0U7CisKKwkgIGlmICghKGhleFRvSW50ICgmcmVxdWVzdCwgJnRkcF90ZW1wLmlkKSAmJgorCQkqcmVxdWVzdCsrID09ICc6JykpCisJICAgIHJldHVybiAiRTExIjsgICAgICAgICAgIC8qIGJhZGx5IGZvcm1lZCBwYWNrZXQsIGZpZWxkIDEgKi8KKworCSAgaWYgKCEoaGV4VG9JbnQgKCZyZXF1ZXN0LCAodW5zaWduZWQgbG9uZyAqKSAmdGRwX3RlbXAuYWRkcikgJiYKKwkJKnJlcXVlc3QrKyA9PSAnOicpKQorCSAgICByZXR1cm4gIkUxMiI7ICAgICAgICAgICAvKiBiYWRseSBmb3JtZWQgcGFja2V0LCBmaWVsZCAyICovCisKKwkgIGlmICghKCgoZW5hYmxlID0gKnJlcXVlc3QrKykgPT0gJ0QnIHx8IGVuYWJsZSA9PSAnRScpICYmCisJCSpyZXF1ZXN0KysgPT0gJzonKSkKKwkgICAgcmV0dXJuICJFMTMiOyAgICAgICAgICAgLyogYmFkbHkgZm9ybWVkIHBhY2tldCwgZmllbGQgMyAqLworI2lmIDAKKwkgIGlmIChlbmFibGUgPT0gJ0QnKQorCSAgICB7CisJICAgICAgZ2RiX3B1dHMgKCJEaXNhYmxpbmcgb2YgdHJhY2Vwb2ludHMgbm90IHN1cHBvcnRlZCBieSBFTUMgdGFyZ2V0XG4iKTsKKwkgICAgICByZXR1cm4gIkUyMCI7CisJICAgIH0KKyNlbmRpZgorCSAgaWYgKCEoaGV4VG9JbnQgKCZyZXF1ZXN0LCAmdGRwX3RlbXAuc3RlcGNvdW50KSAmJgorCQkqcmVxdWVzdCsrID09ICc6JykpCisJICAgIHJldHVybiAiRTE0IjsgICAgICAgICAgIC8qIGJhZGx5IGZvcm1lZCBwYWNrZXQsIGZpZWxkIDQgKi8KKworCSAgaWYgKCFoZXhUb0ludCAoJnJlcXVlc3QsICZ0ZHBfdGVtcC5wYXNzX2xpbWl0KSkKKwkgICAgcmV0dXJuICJFMTUiOyAgICAgICAgICAgLyogYmFkbHkgZm9ybWVkIHBhY2tldCwgZmllbGQgNSAqLworCisJfQorCisgICAgICAvKiBUeXBpY2FsbHksIHRoZSBmaXJzdCBncm91cCBvZiBjb2xsZWN0aW9uIGRlc2NyaXB0b3JzCisJIHJlZmVycyB0byB0aGUgdHJhcCBjb2xsZWN0aW9uLiAgVGhlcmUgaXMgYW4gIlMiIHRva2VuCisJIHRvIGFjdCBhcyBhIGZlbmNlcG9zdCBiZXR3ZWVuIGNvbGxlY3Rpb24gZGVzY3JpcHRvcnMgZm9yCisJIHRoZSB0cmFwLCBhbmQgdGhvc2UgZm9yIHRoZSBzaW5nbGUtc3RlcHBpbmcuCisKKwkgSG93ZXZlciwgd2hlbiB0aGUgcGFja2V0IGlzIHNwbGl0IHVwIGludG8gc2V2ZXJhbCBwYWNrZXRzLAorCSB0aGlzICJTIiB0b2tlbiBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gc2VlbiBpbiBhIHByZXZpb3VzCisJIHN1Yi1wYWNrZXQ7IHNvIHdlIGhhdmUgdG8gcmVtZW1iZXIgaXQgaW4gYSBzdGF0ZSB2YXJpYWJsZS4gICovCisKKyAgICAgIGlmICgqcmVxdWVzdCA9PSAnUicgfHwgKnJlcXVlc3QgPT0gJ00nIHx8ICpyZXF1ZXN0ID09ICdYJykKKyAgICAgICAgeworICAgICAgICAgIGlmIChoYW5kbGVfZm9ybWF0ICgmcmVxdWVzdCwgJnRlbXBmbXQxKSkKKyAgICAgICAgICAgIHJldHVybiAiRTE2IjsKKwkgIGlmIChkb2luZ19zdGVwX2Zvcm1hdHMpCisJICAgIHRkcF90ZW1wLnRwX2Zvcm1hdF9wICA9IHRlbXBmbXQxLmlkOworCSAgZWxzZQorCSAgICB0ZHBfdGVtcC50ZHBfZm9ybWF0X3AgPSB0ZW1wZm10MS5pZDsKKyAgICAgICAgfQorCisgICAgICAvKiBXaGVuIHdlIHNlZSB0aGUgIlMiIHRva2VuLCB3ZSByZW1lbWJlciBpdCBpbiBhIHN0YXRlIHZhcmlhYmxlCisgICAgICAgICAoaW4gY2FzZSB0aGUgcGFja2V0IGlzIHNwbGl0IHVwIGFuZCBjb250aW51ZWQgaW4gYW5vdGhlciBtZXNzYWdlKSwKKwkgYW5kIGRpc2NhcmQgYWxsIGN1cnJlbnQgc3RhdGUgZnJvbSB0aGUgY29sbGVjdGlvbiAiZm9ybWF0Ii4gICovCisgICAgICBpZiAoKnJlcXVlc3QgPT0gJ1MnKQorCXsKKwkgIGRvaW5nX3N0ZXBfZm9ybWF0cyA9IFRSVUU7CisJICAvKiBkaXNjYXJkIHByZXYgZm9ybWF0IGFuZCBzdGFydCBhIG5ldyBvbmUgKi8KKwkgIG1lbXNldCAoKGNoYXIgKikgJnRlbXBmbXQxLCAwLCBzaXplb2YgKHRlbXBmbXQxKSk7CisJICByZXF1ZXN0Kys7CisKKwkgIC8qIEhhdmluZyBzZWVuIHRoZSAiUyIgZmVuY2Vwb3N0LCBpdCBpcyBub3cgcG9zc2libGUgdGhhdAorCSAgICAgd2Ugd2lsbCBzZWUgc29tZSBtb3JlIGNvbGxlY3Rpb24gZGVzY3JpcHRvcnMgcGVydGFpbmluZworCSAgICAgdG8gdGhlIHN0ZXBwaW5nIGNvbGxlY3Rpb24uICAqLworCSAgaWYgKCpyZXF1ZXN0ICAgPT0gJ1InIHx8ICpyZXF1ZXN0ID09ICdNJyB8fCAqcmVxdWVzdCA9PSAnWCcpCisJICAgIHsKKwkgICAgICBpZiAoaGFuZGxlX2Zvcm1hdCAoJnJlcXVlc3QsICZ0ZW1wZm10MSkpCisJCXJldHVybiAiRTE3IjsKKwkgICAgICAvKiBuZXcgZm9ybWF0IElEIGlzIHRwX2Zvcm1hdCAqLworCSAgICAgIHRkcF90ZW1wLnRwX2Zvcm1hdF9wID0gdGVtcGZtdDEuaWQ7CisJICAgIH0KKwl9CisKKyAgICAgIGlmICgqcmVxdWVzdCA9PSAnLScpCS8qIHRoaXMgVERQIGRlZmluaXRpb24gd2lsbCBiZSBjb250aW51ZWQuICovCisJc3ByaW50cCAocmV0YnVmLCAiT0siKTsKKyAgICAgIGVsc2UgaWYgKGVuYWJsZSA9PSAnRScpCS8qIGVuZCBvZiBURFAgZGVmaW5pdGlvbjogcGFzcyB0byBBREJHIChpZiBlbmFibGVkISkgKi8KKwl7CisJICBnZGJfbm90ZSAoIlNUVUI6IGNhbGwgZGVmaW5lX3RkcCAoaWQgJWQsICIsIHRkcF90ZW1wLmlkKTsKKwkgIGdkYl9ub3RlICgiYWRkciAweCVYLCAiLCAoaW50KSB0ZHBfdGVtcC5hZGRyKTsKKwkgIGdkYl9ub3RlICgicGFzc2MgJWQsICIsICAgICAgICB0ZHBfdGVtcC5wYXNzX2xpbWl0KTsKKwkgIGdkYl9ub3RlICgic3RlcGMgJWQsICIsICAgICAgICB0ZHBfdGVtcC5zdGVwY291bnQpOworCSAgZ2RiX25vdGUgKCJURFAgZm10ICMlZCwgIiwgICAgIHRkcF90ZW1wLnRkcF9mb3JtYXRfcCk7CisJICBnZGJfbm90ZSAoIlRQIGZtdCAjJWQpO1xuIiwgICAgdGRwX3RlbXAudHBfZm9ybWF0X3ApOworCSAgCisJICByZXQgPSBkZWZpbmVfdGRwICh0ZHBfdGVtcC5pZCwgJnRkcF90ZW1wLCAwKTsKKworCSAgaWYgKHJldCA9PSBPS19UQVJHRVRfUkVTUE9OU0UpCisJICAgIHsKKwkgICAgICBzcHJpbnRwIChyZXRidWYsICJPSyIpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzcHJpbnRwIChzcGFyZV9idWZmZXIsCisJCSAgICAgICAiJ2RlZmluZV90ZHAnIHJldHVybmVkIERUQyBlcnJvciAnJXMnIGZvciB0cmFjZXBvaW50ICVkLlxuIiwKKwkJICAgICAgIGdldF9lcnJfdGV4dCAocmV0KSwKKwkJICAgICAgIHRkcF90ZW1wLmlkKTsKKwkgICAgICBnZGJfcHV0cyAoc3BhcmVfYnVmZmVyKTsKKwkgICAgICBzcHJpbnRwIChyZXRidWYsICJFMiV4IiwgcmV0KTsKKwkgICAgfQorCSAgLyogUmVkdW5kYW50LCBidXQgbGV0J3MgdHJ5IHRvIG1ha2Ugc3VyZSB0aGlzIHN0YXRlIGdldHMgZGlzY2FyZGVkLiAqLworCSAgeworCSAgICBtZW1zZXQgKChjaGFyICopICZ0ZHBfdGVtcCwgMCwgc2l6ZW9mICh0ZHBfdGVtcCkpOworCSAgICBtZW1zZXQgKChjaGFyICopICZ0ZW1wZm10MSwgMCwgc2l6ZW9mICh0ZW1wZm10MSkpOworCSAgfQorCX0KKyAgICAgIGVsc2UgLyogQURCR19EVEMgZG9lcyBub3Qgc3VwcG9ydCBkaXNhYmxlZCB0cmFjZXBvaW50cyAtLSBpZ25vcmUgaXQuICAqLworCWdkYl9ub3RlICgiU1RVQjogaWdub3JpbmcgZGlzYWJsZWQgdHJhY2Vwb2ludCAlZC5cbiIsIHRkcF90ZW1wLmlkKTsKKworICAgICAgcmV0dXJuIHJldGJ1ZjsKKyAgICB9CisgIGVsc2UgaWYgKG1zZ2NtcCAoJnJlcXVlc3QsICJGcmFtZToiKSkKKyAgICB7CisgICAgICByZXQgPSBPS19UQVJHRVRfUkVTUE9OU0U7CisKKyAgICAgIGlmIChtc2djbXAgKCZyZXF1ZXN0LCAicGM6IikpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIWhleFRvSW50ICgmcmVxdWVzdCwgJnBjKSkKKyAgICAgICAgICAgIHJldHVybiAiRTEwIjsgICAgICAgLyogYmFkbHkgZm9ybWVkIHBhY2tldCAqLworICAgICAgICAgIG5fZnJhbWUgPSBjdXJmcmFtZS52YWxpZCA/IGN1cmZyYW1lLmZyYW1lX2lkICsgMSA6IDA7CisgICAgICAgICAgZ2RiX25vdGUgKCJTVFVCOiBjYWxsIGZldGNoX3RyYWNlX2ZyYW1lX3BjIChpZCAlZCwgIiwgbl9mcmFtZSk7CisgICAgICAgICAgZ2RiX25vdGUgKCJwYyAweCVYKTtcbiIsIHBjKTsKKyAgICAgICAgICByZXQgPSBmZXRjaF90cmFjZV9mcmFtZV93aXRoX3BjICgmbl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VyZnJhbWUuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJmcmFtZS5mcmFtZV9kYXRhKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAobXNnY21wICgmcmVxdWVzdCwgInRkcDoiKSkKKyAgICAgICAgeworICAgICAgICAgIGlmICghaGV4VG9JbnQgKCZyZXF1ZXN0LCAmdGRwKSkKKyAgICAgICAgICAgIHJldHVybiAiRTEwIjsgICAgICAgLyogYmFkbHkgZm9ybWVkIHBhY2tldCAqLworICAgICAgICAgIG5fZnJhbWUgPSBjdXJmcmFtZS52YWxpZCA/IGN1cmZyYW1lLmZyYW1lX2lkICsgMTogMDsKKyAgICAgICAgICBnZGJfbm90ZSAoIlNUVUI6IGNhbGwgZmV0Y2hfdHJhY2VfZnJhbWVfdGRwIChpZCAlZCwgIiwgbl9mcmFtZSk7CisgICAgICAgICAgZ2RiX25vdGUgKCJ0ZHAgMHglWCk7XG4iLCB0ZHApOworICAgICAgICAgIHJldCA9IGZldGNoX3RyYWNlX2ZyYW1lX3dpdGhfdGRwICgmbl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VyZnJhbWUuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VyZnJhbWUuZnJhbWVfZGF0YSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG1zZ2NtcCAoJnJlcXVlc3QsICJyYW5nZToiKSkKKyAgICAgICAgeworICAgICAgICAgIGlmICghKGhleFRvSW50ICgmcmVxdWVzdCwgJnN0YXJ0KSAmJgorICAgICAgICAgICAgICAgICpyZXF1ZXN0KysgPT0gJzonKSkKKyAgICAgICAgICAgIHJldHVybiAiRTExIjsgICAgICAvKiBiYWRseSBmb3JtZWQgcGFja2V0LCBmaWVsZCAxICovCisgICAgICAgICAgZWxzZSBpZiAoIWhleFRvSW50ICgmcmVxdWVzdCwgJnN0b3ApKQorICAgICAgICAgICAgcmV0dXJuICJFMTIiOyAgICAgICAvKiBiYWRseSBmb3JtZWQgcGFja2V0LCBmaWVsZCAyICovCisgICAgICAgICAgbl9mcmFtZSA9IGN1cmZyYW1lLnZhbGlkID8gY3VyZnJhbWUuZnJhbWVfaWQgKyAxOiAwOworICAgICAgICAgIGdkYl9ub3RlICgiU1RVQjogY2FsbCBmZXRjaF90cmFjZV9mcmFtZV9yYW5nZSAoaWQgJWQsICIsIG5fZnJhbWUpOworICAgICAgICAgIGdkYl9ub3RlICgic3RhcnQgMHglWCwgIiwgICBzdGFydCk7CisgICAgICAgICAgZ2RiX25vdGUgKCJzdG9wICAweCVYKTtcbiIsIHN0b3ApOworICAgICAgICAgIHJldCA9IGZldGNoX3RyYWNlX2ZyYW1lX3dpdGhfcGNfaW5fcmFuZ2UgKCZuX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIHN0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1cmZyYW1lLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VyZnJhbWUuZnJhbWVfZGF0YSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKG1zZ2NtcCAoJnJlcXVlc3QsICJvdXRzaWRlOiIpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCEoaGV4VG9JbnQgKCZyZXF1ZXN0LCAmc3RhcnQpICYmCisgICAgICAgICAgICAgICAgKnJlcXVlc3QrKyA9PSAnOicpKQorICAgICAgICAgICAgcmV0dXJuICJFMTEiOyAgICAgICAvKiBiYWRseSBmb3JtZWQgcGFja2V0LCBmaWVsZCAxICovCisgICAgICAgICAgZWxzZSBpZiAoIWhleFRvSW50ICgmcmVxdWVzdCwgJnN0b3ApKQorICAgICAgICAgICAgcmV0dXJuICJFMTIiOyAgICAgICAvKiBiYWRseSBmb3JtZWQgcGFja2V0LCBmaWVsZCAyICovCisgICAgICAgICAgbl9mcmFtZSA9IGN1cmZyYW1lLnZhbGlkID8gY3VyZnJhbWUuZnJhbWVfaWQgKyAxOiAwOworICAgICAgICAgIGdkYl9ub3RlICgiU1RVQjogY2FsbCBmZXRjaF90cmFjZV9mcmFtZV9vdXRzaWRlIChpZCAlZCwgIiwgbl9mcmFtZSk7CisgICAgICAgICAgZ2RiX25vdGUgKCJzdGFydCAweCVYLCAiLCAgIHN0YXJ0KTsKKyAgICAgICAgICBnZGJfbm90ZSAoInN0b3AgIDB4JVgpO1xuIiwgc3RvcCk7CisgICAgICAgICAgcmV0ID0gZmV0Y2hfdHJhY2VfZnJhbWVfd2l0aF9wY19vdXRzaWRlICgmbl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJmcmFtZS5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VyZnJhbWUuZnJhbWVfZGF0YSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgLyogc2ltcGxlIFRGaW5kIGJ5IGZyYW1lIG51bWJlcjogKi8KKyAgICAgICAgeworICAgICAgICAgIGlmICghaGV4VG9JbnQgKCZyZXF1ZXN0LCAmZnJhbWVubykpCisgICAgICAgICAgICByZXR1cm4gIkUxMCI7ICAgICAgIC8qIGJhZGx5IGZvcm1lZCBwYWNrZXQgKi8KKyAgICAgICAgICBpZiAoZnJhbWVubyAhPSAodW5zaWduZWQgbG9uZykgLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGdkYl9ub3RlICgiU1RVQjogY2FsbCBmZXRjaF90cmFjZV9mcmFtZSAoaWQgJWQpO1xuIiwgZnJhbWVubyk7CisgICAgICAgICAgICAgIHJldCA9IGZldGNoX3RyYWNlX2ZyYW1lIChuX2ZyYW1lID0gZnJhbWVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJmcmFtZS5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VyZnJhbWUuZnJhbWVfZGF0YSk7CisjaWYgMAorCSAgICAgIHByaW50cCgiU1RVQjogZmV0Y2hfdHJhY2VfZnJhbWU6IHJldHVybiAlZFxuIiwgcmV0KTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgIC8qIGRpc2NhcmQgYW55IHRyYWNlIGZyYW1lLCBkZWJ1ZyAidGhlIHJlYWwgd29ybGQiICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChjdXJmcmFtZS52YWxpZCkKKyAgICAgICAgICAgICAgICBnZGJfbm90ZSAoIlNUVUI6IGRpc2NhcmQgY3VycmVudCB0cmFjZSBmcmFtZSAjJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJmcmFtZS5mcmFtZV9pZCk7CisgICAgICAgICAgICAgIGN1cmZyYW1lLnZhbGlkID0gMDsKKyAgICAgICAgICAgICAgcmV0dXJuICJPSyI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGlmIChyZXQgPT0gT0tfVEFSR0VUX1JFU1BPTlNFKSAgICAvKiBmZXRjaF90cmFjZV9mcmFtZSBzdWNjZWVkZWQgKi8KKyAgICAgICAgeyAvKiBzZXR1cCBmb3IgZGVidWdnaW5nIHRoZSB0cmFjZSBmcmFtZSAqLworICAgICAgICAgIGN1cmZyYW1lLnZhbGlkICAgID0gMTsKKyAgICAgICAgICBjdXJmcmFtZS5mcmFtZV9pZCA9IG5fZnJhbWU7CisgICAgICAgICAgY3VyZnJhbWUudGRwX2lkICAgPSBjdXJmcmFtZS5mcmFtZV9kYXRhLT5pZDsKKworICAgICAgICAgIG1lbXNldCAoKGNoYXIgKikgJmN1cmZyYW1lLnRyYWNlcmVncywgMCwKKyAgICAgICAgICAgICAgICAgIHNpemVvZiAoY3VyZnJhbWUudHJhY2VyZWdzKSk7CisgICAgICAgICAgY3VyZnJhbWUudHJhY2VyZWdzW1BDXSA9ICh1bnNpZ25lZCBsb25nKQorICAgICAgICAgICAgY3VyZnJhbWUuZnJhbWVfZGF0YS0+cHJvZ3JhbV9jb3VudGVyOworCisgICAgICAgICAgaWYgKGN1cmZyYW1lLmZvcm1hdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyByZWdzX21hc2sgPSBjdXJmcmFtZS5mb3JtYXQtPnJlZ3NfbWFzazsKKyAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqcmVncywgKnN0YWNrLCAqbWVtOworICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHJlZ25vLCBpbmRleCA9IDA7CisgICAgICAgICAgICAgIENGRCAqZHVtbXk7CisKKyAgICAgICAgICAgICAgaWYgKChyZXQgPSBnZXRfYWRkcl90b19mcmFtZV9yZWdzX3N0YWNrX21lbQorICAgICAgICAgICAgICAgICAgIChjdXJmcmFtZS5mcmFtZV9kYXRhLCAmZHVtbXksICZyZWdzLCAmc3RhY2ssICZtZW0pKQorICAgICAgICAgICAgICAgICAgIT0gT0tfVEFSR0VUX1JFU1BPTlNFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGN1cmZyYW1lLnZhbGlkID0gMDsKKyAgICAgICAgICAgICAgICAgIHNwcmludHAgKHJldGJ1ZiwgIkUyJXgiLCByZXQpOworICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGFyICopCisgICAgICAgICAgICAgICAgICAgIGR0Y19lcnJvcl9yZXQgKChpbnQpICZyZXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRfYWRkcl90b19mcmFtZV9yZWdzX3N0YWNrX21lbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChyZW1vdGVfZGVidWcgPiAxKQorICAgICAgICAgICAgICAgIHsgLyogZWNobyB3aGF0IHdlJ3ZlIGZvdW5kIHRvIGdkYiBjb25zb2xlICovCisgICAgICAgICAgICAgICAgICBzcHJpbnRwIChzcGFyZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1RVQjogRm91bmQgZnJhbWUgJWQsIFREUCAlZCwgZm9ybWF0ICVkICglcyk6XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyZnJhbWUuZnJhbWVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJmcmFtZS50ZHBfaWQgJiAweDdmZmZmZmZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyZnJhbWUuZm9ybWF0LT5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmZyYW1lLnRkcF9pZCAmIDB4ODAwMDAwMDAgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYXAgZnJhbWUiIDogInN0ZXBwaW5nIGZyYW1lIik7CisgICAgICAgICAgICAgICAgICBnZGJfcHV0cyAoc3BhcmVfYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIC8qIGNvcHkgdHJhY2UgZnJhbWUgcmVncyBpbnRvIHN0dWIncyBkYXRhIGZvcm1hdCAqLworICAgICAgICAgICAgICBmb3IgKHJlZ25vID0gMCwgaW5kZXggPSAwOworICAgICAgICAgICAgICAgICAgIHJlZ25vIDwgMTY7CisgICAgICAgICAgICAgICAgICAgcmVnbm8rKywgcmVnc19tYXNrID4+PSAxKQorICAgICAgICAgICAgICAgIGlmIChyZWdzX21hc2sgJiAxKSAgICAgIC8qIGdvdCBhIGNvbGxlY3RlZCByZWdpc3RlciAqLworICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXJmcmFtZS50cmFjZXJlZ3NbcmVnbm9dID0gcmVnc1tpbmRleCsrXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW90ZV9kZWJ1ZyA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50cCAoc3BhcmVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIENvbGxlY3RlZCAweCUwOHggZm9yIHJlZ2lzdGVyICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmZyYW1lLnRyYWNlcmVnc1tyZWdub10sIHJlZ25vKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdkYl9wdXRzIChzcGFyZV9idWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHJlbW90ZV9kZWJ1ZyA+IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgbWlkeCwgcmlkeCwgbGVuOworICAgICAgICAgICAgICAgICAgTUVNUkFOR0VfREVGICAqbXJhbmdlOworICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgKmJhc2U7CisKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJmcmFtZS5mb3JtYXQtPnN0YWNrX3NpemUgPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgbGVuID0gY3VyZnJhbWUuZm9ybWF0LT5zdGFja19zaXplOworICAgICAgICAgICAgICAgICAgICAgIHNwcmludHAgKHNwYXJlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgQ29sbGVjdGVkICVkIGJ5dGVzIG9mIHN0YWNrIGF0IDB4JXg6XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgY3VyZnJhbWUudHJhY2VyZWdzW0E3XSk7CisgICAgICAgICAgICAgICAgICAgICAgZ2RiX3B1dHMgKHNwYXJlX2J1ZmZlcik7CisKKyAgICAgICAgICAgICAgICAgICAgICAvKiBwcmludCBzdGFjayBkYXRhLCBidXQgc3RheSB1bmRlciBtc2cgbGVuICovCisgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+PSAoTlVNUkVHQllURVMvMiAtIDIpKQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gICAgKE5VTVJFR0JZVEVTLzIgLSAzKTsKKyAgICAgICAgICAgICAgICAgICAgICBtZW0yaGV4ICgodW5zaWduZWQgY2hhciAqKSBzdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFyZV9idWZmZXIsIGxlbiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgc3BhcmVfYnVmZmVyIFtsZW4gKiAyXSA9ICdcbic7CisgICAgICAgICAgICAgICAgICAgICAgc3BhcmVfYnVmZmVyIFtsZW4gKiAyICsgMV0gPSAnXDAnOyAvKiBFT1MgKi8KKyAgICAgICAgICAgICAgICAgICAgICBnZGJfcHV0cyAoc3BhcmVfYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkgIGVsc2UKKwkJICAgIGdkYl9wdXRzICgiU3RhY2sgbm90IGNvbGxlY3RlZFxuIik7CisKKyAgICAgICAgICAgICAgICAgIGZvciAobWlkeCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgIGdldF9hZGRyX3RvX2FfbWVtX3JhbmdlIChjdXJmcmFtZS5mcmFtZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikgJmRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgID09IE9LX1RBUkdFVF9SRVNQT05TRTsKKyAgICAgICAgICAgICAgICAgICAgICAgbWlkeCsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKChtcmFuZ2UtPnR5cGVjb2RlID09IDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChtcmFuZ2UtPnR5cGVjb2RlID09ICh1bnNpZ25lZCBsb25nKSAtMSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludHAgKHNwYXJlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIENvbGxlY3RlZCAlZCBieXRlcyBhdCBNRU06IDB4JXg6XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcmFuZ2UtPnNpemUsIG1yYW5nZS0+b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9ICh1bnNpZ25lZCBjaGFyICopIG1yYW5nZS0+b2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyaWR4ID0gZWxpbnVtX3RvX2luZGV4IChtcmFuZ2UtPnR5cGVjb2RlKSkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSAodW5zaWduZWQgY2hhciAqKSBjdXJmcmFtZS50cmFjZXJlZ3NbcmlkeF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGxvbmcpIG1yYW5nZS0+b2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50cCAoc3BhcmVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICJTVFVCOiBiYWQgdHlwZWNvZGUgaW4gbWVtcmFuZ2UgIyVkOiAoMHgleCwweCV4LDB4JXgpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcmFuZ2UtPnR5cGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXJhbmdlLT5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcmFuZ2UtPnNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RiX3B1dHMgKHNwYXJlX2J1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludHAgKHNwYXJlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAiICAgICAgQ29sbGVjdGVkICVkIGJ5dGVzIGF0IDB4JXggKFJFRyAlWCArICVkKTpcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1yYW5nZS0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXJhbmdlLT50eXBlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXJhbmdlLT5vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGdkYl9wdXRzIChzcGFyZV9idWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IG1yYW5nZS0+c2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuID49IChOVU1SRUdCWVRFUy8yIC0gMikpCisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAgICAoTlVNUkVHQllURVMvMiAtIDMpOworICAgICAgICAgICAgICAgICAgICAgIG1lbTJoZXggKGRhdGEsIHNwYXJlX2J1ZmZlciwgbGVuLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICBzcGFyZV9idWZmZXIgW2xlbiAqIDJdID0gJ1xuJzsKKyAgICAgICAgICAgICAgICAgICAgICBzcGFyZV9idWZmZXIgW2xlbiAqIDIgKyAxXSA9ICdcMCc7IC8qIEVPUyAqLworICAgICAgICAgICAgICAgICAgICAgIGdkYl9wdXRzIChzcGFyZV9idWZmZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIHNwcmludHAgKHJldGJ1ZiwgIkYleFQleCIsIG5fZnJhbWUsIGN1cmZyYW1lLnRkcF9pZCAmIDB4N2ZmZmZmZmYpOworICAgICAgICAgIHJldHVybiAgIHJldGJ1ZjsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocmV0ID09IE5PVF9GT1VORF9UQVJHRVRfUkVTUE9OU0UpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBIZXJlJ3MgYSBxdWVzdGlvbjogaWYgdGhlIGZldGNoX3RyYWNlX2ZyYW1lIGNhbGwgZmFpbGVkCisgICAgICAgICAgICAgKHdoaWNoIHByb2JhYmx5IG1lYW5zIGEgYmFkICJURklORCIgY29tbWFuZCBmcm9tIEdEQiksCisgICAgICAgICAgICAgc2hvdWxkIHdlIHJlbWFpbiBmb2N1c2VkIG9uIHRoZSBwcmV2aW91cyBmcmFtZSAoaWYgYW55KSwKKyAgICAgICAgICAgICBvciBzaG91bGQgd2UgcmV2ZXJ0IHRvICJubyBjdXJyZW50IGZyYW1lIj8KKyAgICAgICAgICAgKi8KKyAgICAgICAgICByZXR1cm4gIkYtMSI7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHNwcmludHAgKHJldGJ1ZiwgIkUyJXgiLCByZXQpOworICAgICAgICAgIHJldHVybiAoY2hhciAqKSBkdGNfZXJyb3JfcmV0ICgoaW50KSAmcmV0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmV0Y2hfdHJhY2VfZnJhbWVbLi4uXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCk7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UgICAgICAgICAgICAgICAgICAvKiB1bmtub3duIHRyYWNlIGNvbW1hbmQgKi8KKyAgICB7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorfQorCisvKiBUYWJsZSB1c2VkIGJ5IHRoZSBjcmMzMiBmdW5jdGlvbiB0byBjYWxjdWF0ZSB0aGUgY2hlY2tzdW0uICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjcmMzMl90YWJsZVsyNTZdOworCitzdGF0aWMgaW50IGNyY19tZW1fZXJyOworCitzdGF0aWMgdW5zaWduZWQgbG9uZworY3JjMzIgKGJ1ZiwgbGVuLCBjcmMpCisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICAgaW50IGxlbjsKKyAgICAgdW5zaWduZWQgbG9uZyBjcmM7Cit7CisgIGNyY19tZW1fZXJyID0gRkFMU0U7CisKKyAgaWYgKCEgY3JjMzJfdGFibGVbMV0pCisgICAgeworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgQ1JDIHRhYmxlIGFuZCB0aGUgZGVjb2RpbmcgdGFibGUuICovCisgICAgICBpbnQgaSwgajsKKyAgICAgIHVuc2lnbmVkIGludCBjOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJeworCSAgZm9yIChjID0gaSA8PCAyNCwgaiA9IDg7IGogPiAwOyAtLWopCisJICAgIGMgPSBjICYgMHg4MDAwMDAwMCA/IChjIDw8IDEpIF4gMHgwNGMxMWRiNyA6IChjIDw8IDEpOworCSAgY3JjMzJfdGFibGVbaV0gPSBjOworCX0KKyAgICB9CisKKyAgd2hpbGUgKGxlbi0tKQorICAgIHsKKyAgICAgIGlmIChyZWFkX2FjY2Vzc192aW9sYXRpb24gKGJ1ZikpCisJeworCSAgY3JjX21lbV9lcnIgPSBUUlVFOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIGNyYyA9IChjcmMgPDwgOCkgXiBjcmMzMl90YWJsZVsoKGNyYyA+PiAyNCkgXiAqYnVmKyspICYgMjU1XTsKKyAgICB9CisgIHJldHVybiBjcmM7Cit9CisKK3N0YXRpYyBjaGFyICoKK2NyY19xdWVyeSAoY21kKQorICAgICBjaGFyICpjbWQ7Cit7CisgIHVuc2lnbmVkIGxvbmcgc3RhcnRtZW0sIGxlbiwgY3JjOworICBzdGF0aWMgY2hhciBidWZbMzJdOworCisgIGlmIChoZXhUb0ludCAoJmNtZCwgJnN0YXJ0bWVtKSAmJgorICAgICAgKmNtZCsrID09ICcsJyAgICAgICAgICAgICAgJiYKKyAgICAgIGhleFRvSW50ICgmY21kLCAmbGVuKSkKKyAgICB7CisgICAgICBjcmMgPSBjcmMzMiAgKCh1bnNpZ25lZCBjaGFyICopIHN0YXJ0bWVtLCBsZW4sIDB4ZmZmZmZmZmYpOworICAgICAgaWYgKCFjcmNfbWVtX2VycikKKwl7CisJICBzcHJpbnRwIChidWYsICJDJTA4eCIsIGNyYyk7CisJICByZXR1cm4gYnVmOworCX0KKyAgICAgIC8qIGVsc2UgZXJyb3IsIGZhbGwgdGhydSAqLworICAgIH0KKyAgc3ByaW50cCAoYnVmLCAiRTAxIik7CisgIHJldHVybiBidWY7Cit9CisKKworc3RhdGljIGNoYXIgKgoraGFuZGxlX3Rlc3QgKHJlcXVlc3QpCisgICAgIGNoYXIgKnJlcXVlc3Q7Cit7CisgIFVMT05HIGFyZ3NbN107CisgIGludCBpOworCisgIC8qIFBhcnNlIHRoZSBhcmd1bWVudHMsIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgaGV4IG51bWJlcnMsIGludG8KKyAgICAgQVJHUy4gIFBhcnNlIGF0IG1vc3Qgc2l4IGFyZ3VtZW50cy4gICovCisgIGkgPSAxOworICBpZiAoKnJlcXVlc3QgIT0gJ1wwJykKKyAgICB3aGlsZSAoaSA8IDcpCisgICAgICB7CisJaWYgKCEgaGV4VG9JbnQgKCZyZXF1ZXN0LCAmYXJnc1tpKytdKSkKKwkgIHJldHVybiAiRTAxIjsKKwlpZiAoKnJlcXVlc3QgPT0gJ1wwJykKKwkgIGJyZWFrOworCWlmICgqcmVxdWVzdCsrICE9ICcsJykKKwkgIHJldHVybiAiRTAxIjsKKyAgICAgIH0KKworICAvKiBGaWxsIHRoZSByZXN0IG9mIHRoZSBhcmdzIGFycmF5IHdpdGggemVyb3MuICBUaGlzIGlzIHdoYXQgdGhlCisgICAgIElOTElORVMgY29tbWFuZCBwcm9jZXNzb3IgZG9lcyB3aXRoIG9taXR0ZWQgYXJndW1lbnRzLiAgKi8KKyAgZm9yICg7IGkgPCA3OyBpKyspCisgICAgYXJnc1tpXSA9IDA7CisKKyAgZ2RiX2NfdGVzdCAoYXJncyk7CisKKyAgcmV0dXJuICJPSyI7Cit9CisKKworLyogR0RCX1RSQVBfMV9IQU5ETEVSCisKKyAgIEJ5IHRoZSB0aW1lIHRoaXMgaXMgY2FsbGVkLCB0aGUgcmVnaXN0ZXJzIGhhdmUgYmVlbiBzYXZlZCBpbiAicmVnaXN0ZXJzIiwKKyAgIGFuZCB0aGUgaW50ZXJydXB0IHByaW9yaXR5IGhhcyBiZWVuIHNldCB0byBwZXJtaXQgc2VyaWFsIFVBUlQgaW50ZXJydXB0cy4KKworICAgSG93ZXZlciwgc2luY2Ugbm8gZ2RiIHJlcXVlc3QgaGFzIHlldCBiZWVuIHJlY2VpdmVkLCBhbmQgdGhlcmUgaXMgbm8KKyAgIGVxdWl2YWxlbnQgb2YgZ2V0cGFja2V0IGZvciB1cyB0byB3YWl0IG9uLCB3ZSBjYW4ndCBzaXQgaGVyZSB3YWl0aW5nCisgICBmb3IgcGFja2V0cyBhbmQgcHJvY2Vzc2luZyB0aGVtLgorCisgICBJbiBmYWN0LCB0aGUgT05MWSB0aGluZyBmb3IgdXMgdG8gZG8gaGVyZSBpcyBzaXQgYW5kIHdhaXQuCisgICBBcyBnZGIgc2VuZHMgcGFja2V0IHJlcXVlc3RzLCB0aGV5IHdpbGwgaGFuZGxlIHRoZW1zZWx2ZXMgYXQgdGhlCisgICBpbnRlcnJ1cHQgbGV2ZWwuICBXaGVuIGdkYiBkZWNpZGVzIHdlIGNhbiBjb250aW51ZSwgaXQgd2lsbCByZXNldAorICAgdGhlIGdsb2JhbCB2YXJpYWJsZSAiZ2RiX2hhbmRsaW5nX3RyYXAxIiwgYW5kIHdlIHdpbGwgcmV0dXJuCisgICAod2hlcmV1cG9uIHJlZ2lzdGVycyB3aWxsIGJlIHJlc3RvcmVkIGV0Yy4pICAgKi8KKwordm9pZCAgZ2RiX3RyYXBfMV9oYW5kbGVyKCB2b2lkICkKK3sKKyAgZ2RiX2hhbmRsaW5nX3RyYXAxID0gVFJVRTsKKyAgc3NzX3RyYWNlX2ZsYWcgPSAnXDAnOyAgICAgICAgLyogc2h1dCBvZmYgInRyYWNlIGJpdCIgKGluZGlyZWN0bHkpICovCisgIGdkYl9zaWdubyA9IDU7CisgIHB1dHBhY2tldCggIlMwNSIgKTsKKyAgd2hpbGUgKCBnZGJfaGFuZGxpbmdfdHJhcDEgKQorICAgIDsKKyAgcmV0dXJuOworfQorCit2b2lkICBnZGJfdHJhY2VfaGFuZGxlciggdm9pZCApCit7CisgIHNzc190cmFjZV9mbGFnID0gJ1wwJzsgICAgICAgIC8qIHNodXQgb2ZmICJ0cmFjZSBiaXQiIChpbmRpcmVjdGx5KSAqLworICBnZGJfaGFuZGxpbmdfdHJhcDEgPSBUUlVFOworICBnZGJfaGFuZGxpbmdfc3N0cmFjZSA9IFRSVUU7CisgIGdkYl9zaWdubyA9IDU7CisgIHB1dHBhY2tldCggIlMwNSIgKTsKKyAgd2hpbGUgKCBnZGJfaGFuZGxpbmdfdHJhcDEgKQorICAgIDsKKyAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvaW5mb3RyYWNlLmV4cCBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL2luZm90cmFjZS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjZjI1ZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL2luZm90cmFjZS5leHAKQEAgLTAsMCArMSw5OSBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IE1pY2hhZWwgU255ZGVyIChtc255ZGVyQGN5Z251cy5jb20pCisKK2xvYWRfbGliICJ0cmFjZS1zdXBwb3J0LmV4cCI7CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorCitpZiBbaXN0YXJnZXQgIm02OGstKi1lbGYiXSB0aGVuIHsKKyAgICBzZXQgc3JjZmlsZSBnZGJfY190ZXN0LmMKKyAgICBzZXQgYmluZmlsZSBbYm9hcmRfaW5mbyB0YXJnZXQgZDQ5MF9iaW5maWxlXTsKK30gZWxzZSB7CisgICAgc2V0IHRlc3RmaWxlICJhY3Rpb25zIgorICAgIHNldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKKyAgICBzZXQgYmluZmlsZSAkb2JqZGlyLyRzdWJkaXIvJHRlc3RmaWxlCisgICAgaWYgeyBbZ2RiX2NvbXBpbGUgIiRzcmNkaXIvJHN1YmRpci8kc3JjZmlsZSIgJGJpbmZpbGUgXAorCSAgICBleGVjdXRhYmxlIHtkZWJ1ZyBhZGRpdGlvbmFsX2ZsYWdzPS13fV0gIT0gIiIgfSB7CisJZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCisgICAgfQorfQorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisKKyMgSWYgdGVzdGluZyBvbiBhIHJlbW90ZSBob3N0LCBkb3dubG9hZCB0aGUgc291cmNlIGZpbGUuCisjIHJlbW90ZV9kb3dubG9hZCBob3N0ICRzcmNkaXIvJHN1YmRpci8kc3JjZmlsZQorCitnZGJfZmlsZV9jbWQgJGJpbmZpbGUKKworIworIyB0ZXN0ICJpbmZvIHRyYWNlcG9pbnRzIiBjb21tYW5kCisjCisKK2dkYl9kZWxldGVfdHJhY2Vwb2ludHMKK3NldCBjX3Rlc3RfbnVtIFtnZGJfZ2V0dHBudW0gZ2RiX2NfdGVzdF07CitzZXQgYXNtX3Rlc3RfbnVtIFtnZGJfZ2V0dHBudW0gZ2RiX2FzbV90ZXN0XTsKK2lmIHsgJGNfdGVzdF9udW0gPD0gMCB8fCAkYXNtX3Rlc3RfbnVtIDw9IDAgfSB0aGVuIHsKKyAgICBmYWlsICJzZXR0aW5nIHRyYWNlcG9pbnRzIgorICAgIHJldHVybjsKK30KKworIyAyLjEgaW5mbyB0cmFjZXBvaW50cyAoYWxsKQorZ2RiX3Rlc3QgImluZm8gdHJhY2Vwb2ludHMiIFwKKyAgICAiTnVtIEVuYiBBZGRyZXNzICAgIFBhc3NDIFN0ZXBDIFdoYXQuKiRjX3Rlc3RfbnVtXFtcdCBcXSt5XFtcdCBcXSsweFxbMC05YS1mQS1GXF0rLippbiBnZGJfY190ZXN0LiokYXNtX3Rlc3RfbnVtXFtcdCBcXSt5XFtcdCBcXSsweFxbMC05YS1mQS1GXF0rLipnZGJfYXNtX3Rlc3QuKiIgXAorICAgICIyLjE6IGluZm8gdHJhY2Vwb2ludHMgKGFsbCkiCisKKyMgMi4yIGluZm8gdHJhY2Vwb2ludCAoc3BlY2lmaWMpCitnZGJfdGVzdCAiaW5mbyB0cmFjZXBvaW50ICRjX3Rlc3RfbnVtIiBcCisgICAgIiRjX3Rlc3RfbnVtXFtcdCBcXSt5XFtcdCBcXSsweFxbMC05YS1mQS1GXF0rLippbiBnZGJfY190ZXN0LioiIFwKKyAgICAiMi4yYTogaW5mbyB0cmFjZXBvaW50ICRjX3Rlc3RfbnVtIChnZGJfY190ZXN0KSIKKworZ2RiX3Rlc3QgImluZm8gdHJhY2Vwb2ludCAkYXNtX3Rlc3RfbnVtIiBcCisgICAgIiRhc21fdGVzdF9udW1cW1x0IFxdK3lcW1x0IFxdKzB4XFswLTlhLWZBLUZcXSsuKmdkYl9hc21fdGVzdC4qIiBcCisgICAgIjIuMmI6IGluZm8gdHJhY2Vwb2ludCAkYXNtX3Rlc3RfbnVtIChnZGJfYXNtX3Rlc3QpIgorCisjIDIuMyBpbmZvIHRyYWNlcG9pbnQgKGludmFsaWQgdHJhY2Vwb2ludCBudW1iZXIpCitnZGJfdGVzdCAiaW5mbyB0cmFjZXBvaW50IFtleHByICRjX3Rlc3RfbnVtICsgJGFzbV90ZXN0X251bV0iIFwKKyAgICAiTm8gdHJhY2Vwb2ludCBudW1iZXIgW2V4cHIgJGNfdGVzdF9udW0gKyAkYXNtX3Rlc3RfbnVtXS4iIFwKKyAgICAiMi4zOiBpbmZvIHRyYWNlcG9pbnQgKGludmFsaWQgdHJhY2Vwb2ludCBudW1iZXIpIgorCisjIDIuNCBpbmZvIHRyYWNlcG9pbnRzIChsaXN0IG9mIG51bWJlcnMpCitzZW5kX2dkYiAiaW5mbyB0cmFjZXBvaW50cyAkY190ZXN0X251bSAkYXNtX3Rlc3RfbnVtIFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJOdW0gRW5iIC4qJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgIjIuNDogaW5mbyB0cmFjZSByZWplY3RzIG11bHRpcGxlIHRyYWNlcG9pbnQgbnVtYmVycyIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwlwYXNzICIyLjQ6IGluZm8gdHJhY2UgcmVqZWN0cyBtdWx0aXBsZSB0cmFjZXBvaW50IG51bWJlcnMiCisgICAgfQorfQorCisjIDIuNSBoZWxwIGluZm8gdHJhY2UKK2dkYl90ZXN0ICJoZWxwIGluZm8gdHJhY2Vwb2ludHMiIFwKKyAgICAiU3RhdHVzIG9mIHRyYWNlcG9pbnRzLCBvciB0cmFjZXBvaW50IG51bWJlciBOVU1CRVIuKiIgXAorICAgICIyLjU6IGhlbHAgaW5mbyB0cmFjZXBvaW50cyIKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvbGltaXRzLmMgYi9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9saW1pdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWMwMmU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvbGltaXRzLmMKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIFRlc3QgcHJvZ3JhbSBmb3IgdHJhY2luZyBpbnRlcm5hbCBsaW1pdHMgKG51bWJlciBvZiB0cmFjZXBvaW50cyBldGMuKQorICovCisKK2ludCBuID0gNjsKKworaW50IGFycls2NF07CisKK3N0YXRpYyB2b2lkIGZvbyhpbnQgeCkKK3sKK30KKworc3RhdGljIHZvaWQgYmFyKGludCB5KQoreworfQorCitzdGF0aWMgdm9pZCBiYXooaW50IHopCit7Cit9CisKK3N0YXRpYyB2b2lkIGJlZ2luICgpCS8qIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSAqLworeworfQorCitzdGF0aWMgdm9pZCBlbmQgKCkJLyogY2FsbGVkIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZSAqLworeworfQorCitpbnQKK21haW4gKGFyZ2MsIGFyZ3YsIGVudnApCisgICAgIGludCBhcmdjOworICAgICBjaGFyICphcmd2W10sICoqZW52cDsKK3sKKyAgaW50IGk7CisKKyNpZmRlZiB1c2VzdHVicworICBzZXRfZGVidWdfdHJhcHMgKCk7CisgIGJyZWFrcG9pbnQgKCk7CisjZW5kaWYKKworICBiZWdpbiAoKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihhcnIpIC8gc2l6ZW9mKGFyclswXSk7IGkrKykKKyAgICBhcnJbaV0gPSBpICsgMTsKKworICBmb28gKDEpOworICBiYXIgKDIpOworICBiYXogKDMpOworICBlbmQgKCk7CisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9saW1pdHMuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvbGltaXRzLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGUxNWIyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvbGltaXRzLmV4cApAQCAtMCwwICsxLDMxNiBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKK2lmIFtpc3RhcmdldCAibTY4ay0qLWVsZiJdIHRoZW4geworICAgIHBhc3MgIlRlc3Qgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHRhcmdldCIKKyAgICByZXR1cm47Cit9CisKK2xvYWRfbGliICJ0cmFjZS1zdXBwb3J0LmV4cCIKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisJc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitzZXQgdGVzdGZpbGUgImxpbWl0cyIKK3NldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKK3NldCBiaW5maWxlICRvYmpkaXIvJHN1YmRpci8kdGVzdGZpbGUKKworaWYgeyBbZ2RiX2NvbXBpbGUgIiRzcmNkaXIvJHN1YmRpci8kc3JjZmlsZSIgJGJpbmZpbGUgXAorCWV4ZWN1dGFibGUge2RlYnVnIGFkZGl0aW9uYWxfZmxhZ3M9LXd9XSAhPSAiIiB9IHsKKyAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKK30KKworIyBUZXN0czoKKyMgMSkgTWVldCBhbmQgZXhjZWVkIGFydGlmaWNpYWwgbGltaXQgb24gbnVtYmVyIG9mIHRyYWNlcG9pbnRzCisjIDIpIE1lZXQgYW5kIGV4Y2VlZCBhcnRpZmljaWFsIGxpbWl0IG9uIG51bWJlciBvZiBtZW1yYW5nZXMKKyMgMykgTWVldCBhbmQgZXhjZWVkIGFydGlmaWNpYWwgbGltaXQgb24gYnl0ZXMgIG9mIGJ5dGVjb2RlIGRhdGEKKyMgW05PVEU6IG51bWJlciBmb3VyIGlzIG1vdmVkIG91dCBpbnRvIGl0cyBvd24gc2VwYXJhdGUgdGVzdCBtb2R1bGUuXQorIyA0KSBNZWV0IGFuZCBleGNlZWQgYXJ0aWZpY2lhbCBsaW1pdCBvbiBieXRlcyAgb2YgdHJhY2UgYnVmZmVyIHN0b3JhZ2UKKyMgICAgKGNpcmN1bGFyIGFuZCBub24tY2lyY3VsYXIgbW9kZXMpLiAgSG93ZXZlciBub3RlIHRoYXQgYSBtb3JlIAorIyAgICB0aG9yb3VnaCB0ZXN0IG9mIHRoZSBjaXJjdWxhciBtb2RlIGNhbiBiZSBtYWRlIHNlcGFyYXRlbHkuCisKK3NldCBjciAiXFtcclxuXF0rIgorCitwcm9jIGdkYl90cmFjZXBvaW50X2xpbWl0X3Rlc3QgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBjcgorCisgICAgIyBNYWtlIHN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXJ0aW5nIHN0YXRlLgorICAgIGdkYl90ZXN0ICJ0c3RvcCIgIiIgIiIKKyAgICBnZGJfdGVzdCAidGZpbmQgbm9uZSIgIiIgIiIKKyAgICBnZGJfZGVsZXRlX3RyYWNlcG9pbnRzCisKKyAgICAjIFNldCB0aHJlZSB0cmFjZXBvaW50cworICAgIGdkYl90ZXN0ICJ0cmFjZSBmb28iIFwKKwkgICAgIlRyYWNlcG9pbnQgXFswLTlcXSsgYXQgLioiIFwKKwkgICAgInRyYWNlcG9pbnQgbGltaXQgdGVzdDogc2V0IGZpcnN0IHRyYWNlcG9pbnQiCisKKyAgICBnZGJfdGVzdCAidHJhY2UgYmFyIiBcCisJICAgICJUcmFjZXBvaW50IFxbMC05XF0rIGF0IC4qIiBcCisJICAgICJ0cmFjZXBvaW50IGxpbWl0IHRlc3Q6IHNldCBzZWNvbmQgdHJhY2Vwb2ludCIKKworICAgIGdkYl90ZXN0ICJ0cmFjZSBiYXoiIFwKKwkgICAgIlRyYWNlcG9pbnQgXFswLTlcXSsgYXQgLioiIFwKKwkgICAgInRyYWNlcG9pbnQgbGltaXQgdGVzdDogc2V0IHRoaXJkIHRyYWNlcG9pbnQiCisKKyAgICAjIFNldCBzZWNyZXQgYXJ0aWZpY2lhbCB0cmFjZXBvaW50IGxpbWl0IHRvIGZvdXIKKyAgICBnZGJfdGVzdCAibWFpbnQgcGFja2V0IFFUTGltaXQ6dHA6NCIgXAorCSAgICAicmVjZWl2ZWQ6IC5PSy4iIFwKKwkgICAgInRyYWNlcG9pbnQgbGltaXQgdGVzdDogc2V0IGxpbWl0IHRvIGZvdXIiCisKKyAgICAjIE5vdyBzZW5kaW5nIHRocmVlIHRyYWNlcG9pbnRzIHNob3VsZCBzdWNjZWVkLgorICAgIHNlbmRfZ2RiICJ0c3RhcnRcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIiRjciRnZGJfcHJvbXB0IiB7CisJICAgIHBhc3MgInRyYWNlcG9pbnQgbGltaXQgdGVzdDogc2VuZCBmZXdlciB0aGFuIGxpbWl0IgorCX0KKwlkZWZhdWx0IHsKKwkgICAgZmFpbCAidHJhY2Vwb2ludCBsaW1pdCB0ZXN0OiBzZW5kIGZld2VyIHRoYW4gbGltaXQiCisJfQorICAgIH0KKworICAgICMgU2V0IHNlY3JldCBhcnRpZmljaWFsIHRyYWNlcG9pbnQgbGltaXQgdG8gdGhyZWUKKyAgICBnZGJfdGVzdCAibWFpbnQgcGFja2V0IFFUTGltaXQ6dHA6MyIgXAorCSAgICAicmVjZWl2ZWQ6IC5PSy4iIFwKKwkgICAgInRyYWNlcG9pbnQgbGltaXQgdGVzdDogc2V0IGxpbWl0IHRvIHRocmVlIgorCisgICAgIyBOb3cgc2VuZGluZyB0aHJlZSB0cmFjZXBvaW50cyBzaG91bGQgc3RpbGwgc3VjY2VlZC4KKyAgICBzZW5kX2dkYiAidHN0YXJ0XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIkY3IkZ2RiX3Byb21wdCIgeworCSAgICBwYXNzICJ0cmFjZXBvaW50IGxpbWl0IHRlc3Q6IHNlbmQgZXF1YWwgdG8gbGltaXQiCisJfQorCWRlZmF1bHQgeworCSAgICBmYWlsICJ0cmFjZXBvaW50IGxpbWl0IHRlc3Q6IHNlbmQgZXF1YWwgdG8gbGltaXQiCisJfQorICAgIH0KKworICAgICMgU2V0IHNlY3JldCBhcnRpZmljaWFsIHRyYWNlcG9pbnQgbGltaXQgdG8gdHdvCisgICAgZ2RiX3Rlc3QgIm1haW50IHBhY2tldCBRVExpbWl0OnRwOjIiIFwKKwkgICAgInJlY2VpdmVkOiAuT0suIiBcCisJICAgICJ0cmFjZXBvaW50IGxpbWl0IHRlc3Q6IHNldCBsaW1pdCB0byB0d28iCisKKyAgICAjIE5vdyBzZW5kaW5nIHRocmVlIHRyYWNlcG9pbnRzIHNob3VsZCBmYWlsLgorICAgIGdkYl90ZXN0ICJ0c3RhcnQiIFwKKwkgICAgIi4qXFtFZVxdcnJvci4qIiBcCisJICAgICJ0cmFjZXBvaW50IGxpbWl0IHRlc3Q6IHNlbmQgbW9yZSB0aGFuIGxpbWl0IgorCisgICAgIyBDbGVhbiB1cDoKKyAgICBnZGJfdGVzdCAidHN0b3AiICIiICIiCisgICAgZ2RiX3Rlc3QgIm1haW50IHBhY2tldCBRVExpbWl0OnRwOkZGRkZGRkZGIiAiIiAiIgorfQorCitwcm9jIGdkYl9tZW1yYW5nZV9saW1pdF90ZXN0IHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgY3IKKworICAgICMgTWFrZSBzdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGFydGluZyBzdGF0ZS4KKyAgICBnZGJfdGVzdCAidHN0b3AiICIiICIiCisgICAgZ2RiX3Rlc3QgInRmaW5kIG5vbmUiICIiICIiCisgICAgZ2RiX2RlbGV0ZV90cmFjZXBvaW50cworCisgICAgIyBTZXQgdGhyZWUgdHJhY2Vwb2ludHMsIGFuZCBtYWtlICdlbSBjb2xsZWN0IG1lbXJhbmdlcworICAgIGdkYl90ZXN0ICJ0cmFjZSBmb28iIFwKKwkgICAgIlRyYWNlcG9pbnQgXFswLTlcXSsgYXQgLioiIFwKKwkgICAgIm1lbXJhbmdlIGxpbWl0IHRlc3Q6IHNldCBmaXJzdCB0cmFjZXBvaW50IgorCisgICAgZ2RiX3RyYWNlX3NldGFjdGlvbnMgIm1lbXJhbmdlIGxpbWl0IHRlc3Q6IHNldCBmaXJzdCBhY3Rpb25zIiBcCisJICAgICIiIFwKKwkgICAgImNvbGxlY3QgXCRhcmciICJeJCIKKworICAgIGdkYl90ZXN0ICJ0cmFjZSBiYXIiIFwKKwkgICAgIlRyYWNlcG9pbnQgXFswLTlcXSsgYXQgLioiIFwKKwkgICAgIm1lbXJhbmdlIGxpbWl0IHRlc3Q6IHNldCBzZWNvbmQgdHJhY2Vwb2ludCIKKworICAgIGdkYl90cmFjZV9zZXRhY3Rpb25zICJtZW1yYW5nZSBsaW1pdCB0ZXN0OiBzZXQgc2Vjb25kIGFjdGlvbnMiIFwKKwkgICAgIiIgXAorCSAgICAiY29sbGVjdCBcJGFyZyIgIl4kIgorCisgICAgZ2RiX3Rlc3QgInRyYWNlIGJheiIgXAorCSAgICAiVHJhY2Vwb2ludCBcWzAtOVxdKyBhdCAuKiIgXAorCSAgICAibWVtcmFuZ2UgbGltaXQgdGVzdDogc2V0IHRoaXJkIHRyYWNlcG9pbnQiCisKKyAgICBnZGJfdHJhY2Vfc2V0YWN0aW9ucyAibWVtcmFuZ2UgbGltaXQgdGVzdDogc2V0IHRoaXJkIGFjdGlvbnMiIFwKKwkgICAgIiIgXAorCSAgICAiY29sbGVjdCBcJGFyZyIgIl4kIgorCisgICAgIyBTZXQgc2VjcmV0IGFydGlmaWNpYWwgbWVtcmFuZ2UgbGltaXQgdG8gZm91cgorICAgIGdkYl90ZXN0ICJtYWludCBwYWNrZXQgUVRMaW1pdDptZW1yYW5nZTo0IiBcCisJICAgICJyZWNlaXZlZDogLk9LLiIgXAorCSAgICAibWVtcmFuZ2UgbGltaXQgdGVzdDogc2V0IGxpbWl0IHRvIGZvdXIiCisKKyAgICAjIE5vdyBzZW5kaW5nIHRocmVlIG1lbXJhbmdlcyBzaG91bGQgc3RpbGwgc3VjY2VlZC4KKyAgICBzZW5kX2dkYiAidHN0YXJ0XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIkY3IkZ2RiX3Byb21wdCIgeworCSAgICBwYXNzICJtZW1yYW5nZSBsaW1pdCB0ZXN0OiBzZW5kIGZld2VyIHRoYW4gbGltaXQiCisJfQorCWRlZmF1bHQgeworCSAgICBmYWlsICJtZW1yYW5nZSBsaW1pdCB0ZXN0OiBzZW5kIGZld2VyIHRoYW4gbGltaXQiCisJfQorICAgIH0KKworICAgICMgU2V0IHNlY3JldCBhcnRpZmljaWFsIG1lbXJhbmdlIGxpbWl0IHRvIHRocmVlCisgICAgZ2RiX3Rlc3QgIm1haW50IHBhY2tldCBRVExpbWl0Om1lbXJhbmdlOjMiIFwKKwkgICAgInJlY2VpdmVkOiAuT0suIiBcCisJICAgICJtZW1yYW5nZSBsaW1pdCB0ZXN0OiBzZXQgbGltaXQgdG8gdGhyZWUiCisKKyAgICAjIE5vdyBzZW5kaW5nIHRocmVlIG1lbXJhbmdlcyBzaG91bGQgc3RpbGwgc3VjY2VlZC4KKyAgICBzZW5kX2dkYiAidHN0YXJ0XG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIkY3IkZ2RiX3Byb21wdCIgeworCSAgICBwYXNzICJtZW1yYW5nZSBsaW1pdCB0ZXN0OiBzZW5kIGVxdWFsIHRvIGxpbWl0IgorCX0KKwlkZWZhdWx0IHsKKwkgICAgZmFpbCAibWVtcmFuZ2UgbGltaXQgdGVzdDogc2VuZCBlcXVhbCB0byBsaW1pdCIKKwl9CisgICAgfQorCisgICAgIyBTZXQgc2VjcmV0IGFydGlmaWNpYWwgbWVtcmFuZ2UgbGltaXQgdG8gdHdvCisgICAgZ2RiX3Rlc3QgIm1haW50IHBhY2tldCBRVExpbWl0Om1lbXJhbmdlOjIiIFwKKwkgICAgInJlY2VpdmVkOiAuT0suIiBcCisJICAgICJtZW1yYW5nZSBsaW1pdCB0ZXN0OiBzZXQgbGltaXQgdG8gdHdvIgorCisgICAgIyBOb3cgc2VuZGluZyB0aHJlZSBtZW1yYW5nZXMgc2hvdWxkIGZhaWwuCisgICAgZ2RiX3Rlc3QgInRzdGFydCIgXAorCSAgICAiLipcW0VlXF1ycm9yLioiIFwKKwkgICAgIm1lbXJhbmdlIGxpbWl0IHRlc3Q6IHNlbmQgbW9yZSB0aGFuIGxpbWl0IgorCisgICAgIyBDbGVhbiB1cDoKKyAgICBnZGJfdGVzdCAidHN0b3AiICIiICIiCisgICAgZ2RiX3Rlc3QgIm1haW50IHBhY2tldCBRVExpbWl0Om1lbXJhbmdlOkZGRkZGRkZGIiAiIiAiIgorfQorCisKK3Byb2MgZ2RiX2J5dGVjb2RlX2xpbWl0X3Rlc3QgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIGdsb2JhbCBjcgorCisgICAgIyBNYWtlIHN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXJ0aW5nIHN0YXRlLgorICAgIGdkYl90ZXN0ICJ0c3RvcCIgIiIgIiIKKyAgICBnZGJfdGVzdCAidGZpbmQgbm9uZSIgIiIgIiIKKyAgICBnZGJfZGVsZXRlX3RyYWNlcG9pbnRzCisKKyAgICAjIFNldCB0aHJlZSB0cmFjZXBvaW50cworICAgIGdkYl90ZXN0ICJ0cmFjZSBmb28iIFwKKwkgICAgIlRyYWNlcG9pbnQgXFswLTlcXSsgYXQgLioiIFwKKwkgICAgImJ5dGVjb2RlIGxpbWl0IHRlc3Q6IHNldCBmaXJzdCB0cmFjZXBvaW50IgorCisgICAgZ2RiX3RyYWNlX3NldGFjdGlvbnMgImJ5dGVjb2RlIGxpbWl0IHRlc3Q6IHNldCBmaXJzdCBhY3Rpb25zIiBcCisJICAgICIiIFwKKwkgICAgImNvbGxlY3QgeCArIG4iICJeJCIKKworICAgIGdkYl90ZXN0ICJ0cmFjZSBiYXIiIFwKKwkgICAgIlRyYWNlcG9pbnQgXFswLTlcXSsgYXQgLioiIFwKKwkgICAgImJ5dGVjb2RlIGxpbWl0IHRlc3Q6IHNldCBzZWNvbmQgdHJhY2Vwb2ludCIKKworICAgIGdkYl90cmFjZV9zZXRhY3Rpb25zICJieXRlY29kZSBsaW1pdCB0ZXN0OiBzZXQgc2Vjb25kIGFjdGlvbnMiIFwKKwkgICAgIiIgXAorCSAgICAiY29sbGVjdCB5ICsgbiIgIl4kIgorCisgICAgZ2RiX3Rlc3QgInRyYWNlIGJheiIgXAorCSAgICAiVHJhY2Vwb2ludCBcWzAtOVxdKyBhdCAuKiIgXAorCSAgICAiYnl0ZWNvZGUgbGltaXQgdGVzdDogc2V0IHRoaXJkIHRyYWNlcG9pbnQiCisKKyAgICBnZGJfdHJhY2Vfc2V0YWN0aW9ucyAiYnl0ZWNvZGUgbGltaXQgdGVzdDogc2V0IHRoaXJkIGFjdGlvbnMiIFwKKwkgICAgIiIgXAorCSAgICAiY29sbGVjdCB6ICsgbiIgIl4kIgorCisgICAgIyBTZXQgc2VjcmV0IGFydGlmaWNpYWwgYnl0ZWNvZGUgbGltaXQgdG8gYSBsYXJnZSBudW1iZXIKKyAgICBnZGJfdGVzdCAibWFpbnQgcGFja2V0IFFUTGltaXQ6Ynl0ZWNvZGU6NDAwIiBcCisJICAgICJyZWNlaXZlZDogLk9LLiIgXAorCSAgICAiYnl0ZWNvZGUgbGltaXQgdGVzdDogc2V0IGxpbWl0IHRvIGxhcmdlIgorCisgICAgIyBOb3cgc2VuZGluZyB0aHJlZSBieXRlY29kZXMgc2hvdWxkIHN0aWxsIHN1Y2NlZWQuCisgICAgc2VuZF9nZGIgInRzdGFydFxuIgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiJGNyJGdkYl9wcm9tcHQiIHsKKwkgICAgcGFzcyAiYnl0ZWNvZGUgbGltaXQgdGVzdDogc2VuZCBmZXdlciB0aGFuIGxpbWl0IgorCX0KKwlkZWZhdWx0IHsKKwkgICAgZmFpbCAiYnl0ZWNvZGUgbGltaXQgdGVzdDogc2VuZCBmZXdlciB0aGFuIGxpbWl0IgorCX0KKyAgICB9CisKKyAgICAjIFNldCBzZWNyZXQgYXJ0aWZpY2lhbCBieXRlY29kZSBsaW1pdCB0byBhIHNtYWxsIG51bWJlcgorICAgIGdkYl90ZXN0ICJtYWludCBwYWNrZXQgUVRMaW1pdDpieXRlY29kZTo0MCIgXAorCSAgICAicmVjZWl2ZWQ6IC5PSy4iIFwKKwkgICAgImJ5dGVjb2RlIGxpbWl0IHRlc3Q6IHNldCBsaW1pdCB0byBzbWFsbCIKKworICAgICMgTm93IHNlbmRpbmcgdGhyZWUgYnl0ZWNvZGVzIHNob3VsZCBmYWlsLgorICAgIGdkYl90ZXN0ICJ0c3RhcnQiIFwKKwkgICAgIi4qXFtFZVxdcnJvci4qIiBcCisJICAgICJieXRlY29kZSBsaW1pdCB0ZXN0OiBzZW5kIG1vcmUgdGhhbiBsaW1pdCIKKworCisgICAgIyBDbGVhbiB1cDoKKyAgICBnZGJfdGVzdCAidHN0b3AiICIiICIiCisgICAgZ2RiX3Rlc3QgIm1haW50IHBhY2tldCBRVExpbWl0OmJ5dGVjb2RlOkZGRkZGRkZGIiAiIiAiIgorfQorCitwcm9jIGdkYl90cmFjZV9saW1pdHNfdGVzdHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgIyBXZSBnZW5lcm91c2x5IGdpdmUgb3Vyc2VsdmVzIG9uZSAicGFzcyIgaWYgd2Ugc3VjY2Vzc2Z1bGx5IAorICAgICMgZGV0ZWN0IHRoYXQgdGhpcyB0ZXN0IGNhbm5vdCBiZSBydW4gb24gdGhpcyB0YXJnZXQhCisKKyAgICBpZiB7ICFbZ2RiX3RhcmdldF9zdXBwb3J0c190cmFjZV0gfSB0aGVuIHsgCisJcGFzcyAiQ3VycmVudCB0YXJnZXQgZG9lcyBub3Qgc3VwcG9yc3QgdHJhY2UiCisJcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgW2dkYl90ZXN0ICJtYWludCBwYWNrZXQgUVRMaW1pdDp0cDpmZmZmZmZmZiIgXAorCSAgICAicmVjZWl2ZWQ6IC5PSy4iICIiXSB0aGVuIHsgCisJcGFzcyAiVGhpcyB0ZXN0IGNhbm5vdCBiZSBydW4gb24gdGhpcyB0YXJnZXQiCisJcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgW2dkYl90ZXN0ICJtYWludCBwYWNrZXQgUVRMaW1pdDptZW1yYW5nZTpmZmZmZmZmZiIgXAorCSAgICAicmVjZWl2ZWQ6IC5PSy4iICIiXSB0aGVuIHsgCisJcGFzcyAiVGhpcyB0ZXN0IGNhbm5vdCBiZSBydW4gb24gdGhpcyB0YXJnZXQiCisJcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgW2dkYl90ZXN0ICJtYWludCBwYWNrZXQgUVRMaW1pdDpieXRlY29kZTpmZmZmZmZmZiIgXAorCSAgICAicmVjZWl2ZWQ6IC5PSy4iICIiXSB0aGVuIHsgCisJcGFzcyAiVGhpcyB0ZXN0IGNhbm5vdCBiZSBydW4gb24gdGhpcyB0YXJnZXQiCisJcmV0dXJuOworICAgIH0KKworICAgIGdkYl90cmFjZXBvaW50X2xpbWl0X3Rlc3QKKyAgICBnZGJfbWVtcmFuZ2VfbGltaXRfdGVzdAorICAgIGdkYl9ieXRlY29kZV9saW1pdF90ZXN0Cit9CisKKyMgU3RhcnQgd2l0aCBhIGZyZXNoIGdkYi4KKworZ2RiX2V4aXQKK2dkYl9zdGFydAorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCitnZGJfbG9hZCAkYmluZmlsZQorIAoraWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGJfc3R1Yl0geworICAgIGdkYl9zdGVwX2Zvcl9zdHViOworfQorIyBCb2R5IG9mIHRlc3QgZW5jYXNlZCBpbiBhIHByb2Mgc28gd2UgY2FuIHJldHVybiBwcmVtYXR1cmVseS4KK2dkYl90cmFjZV9saW1pdHNfdGVzdHMKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL3BhY2tldGxlbi5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9wYWNrZXRsZW4uZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNTNlNDUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9wYWNrZXRsZW4uZXhwCkBAIC0wLDAgKzEsMTAwIEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgTWljaGFlbCBTbnlkZXIgKG1zbnlkZXJAY3lnbnVzLmNvbSkKKworbG9hZF9saWIgInRyYWNlLXN1cHBvcnQuZXhwIgorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK2dkYl9leGl0CitnZGJfc3RhcnQKKworaWYgW2lzdGFyZ2V0ICJtNjhrLSotZWxmIl0gdGhlbiB7CisgICAgbG9hZF9saWIgImVtYy1zdXBwb3J0LmV4cCIKKyAgICBzZXQgc3JjZmlsZSBnZGJfY190ZXN0LmMKKyAgICBzZXQgYmluZmlsZSBbYm9hcmRfaW5mbyB0YXJnZXQgZDQ5MF9iaW5maWxlXTsKKyAgICBnZGJfdGVzdCAic2V0IHJlbW90ZXRpbWVvdXQgNiIgIiIgIiIKKyAgICBzZXQgdGltZW91dCA1MDAKKyAgICBnZGJfdGFyZ2V0X21vbml0b3IgIiRiaW5maWxlIgorICAgICMgR2l2ZSBhIFRTVE9QIGFuZCBpZ25vcmUgZXJyb3JzLCB0byBtYWtlIHN1cmUgYW55IHByZXZpb3VzIHRyYWNlIGlzIG9mZgorICAgIGdkYl90ZXN0ICJ0c3RvcCIgIiIgIiIKKyAgICBnZGJfdGVzdCAidGZpbmQgbm9uZSIgICIiICIiCisgICAgc2VuZF9nZGIgImNvbXBhcmUtc2VjdGlvbnMgQ1NcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIk1JUy1NQVRDSEVELiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiU3ltYm9sIGZpbGUgZG9lcyBub3QgbWF0Y2ggdGFyZ2V0IQorCSAgICBhbGwgdGVzdHMgaW4gdGhpcyBtb2R1bGUgd2lsbCBmYWlsLiI7CisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IH0KKyAgICB9Cit9IGVsc2UgeworICAgIHNldCB0ZXN0ZmlsZSAiYWN0aW9ucyIKKyAgICBzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCisgICAgc2V0IGJpbmZpbGUgJG9iamRpci8kc3ViZGlyLyR0ZXN0ZmlsZQorICAgIGlmIHsgW2dkYl9jb21waWxlICIkc3JjZGlyLyRzdWJkaXIvJHNyY2ZpbGUiICRiaW5maWxlIFwKKwkgICAgZXhlY3V0YWJsZSB7ZGVidWcgYWRkaXRpb25hbF9mbGFncz0td31dICE9ICIiIH0geworCWdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorICAgIH0KKyAgICBnZGJfbG9hZCAkYmluZmlsZQorICAgIGdkYl90ZXN0ICJ0c3RvcCIgICAgICAgIiIgIiIKKyAgICBnZGJfdGVzdCAidGZpbmQgbm9uZSIgICIiICIiCisgICAgcnVudG9fbWFpbgorfQorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisKKyMgSWYgdGVzdGluZyBvbiBhIHJlbW90ZSBob3N0LCBkb3dubG9hZCB0aGUgc291cmNlIGZpbGUuCisjIHJlbW90ZV9kb3dubG9hZCBob3N0ICRzcmNkaXIvJHN1YmRpci8kc3JjZmlsZQorCisjCisjIFRlc3QgY29sbGVjdGluZyBhIHdob2xlIGJ1bmNoIG9mIHN0dWZmIGF0IGEgc2luZ2xlIHRyYWNlcG9pbnQuCisjIFRoZSB0ZXN0IGlzIHdoZXRoZXIgdGhpcyBjcmFzaGVzIEdEQi4KKyMKKworZ2RiX2RlbGV0ZV90cmFjZXBvaW50cworZ2RiX3Rlc3QgInRyYWNlIGdkYl9jX3Rlc3QiICIiICIiCitnZGJfdHJhY2Vfc2V0YWN0aW9ucyAic2V0dXAgY29sbGVjdCBhY3Rpb25zIiBcCisJIiIgXAorCSJjb2xsZWN0IHBhcm1cWzBcXSwgcGFybVxbMVxdLCBwYXJtXFsyXF0sIHBhcm1cWzNcXSIgIl4kIiBcCisJImNvbGxlY3QgcGFybVxbNFxdLCBwYXJtXFs1XF0sIHBhcm1cWzZcXSwgcGFybVxbN1xdIiAiXiQiIFwKKwkiY29sbGVjdCBwLCBsb2NhbF9yZWcsIGxvY2FsX3N0YXRpYywgbG9jYWxfc3RhdGljX3NpemVvZiIgIl4kIiBcCisJImNvbGxlY3QgbG9jYWxfbG9uZywgc3RhY2tfcHRyLCBlbmRfb2Zfc3RhY2siICJeJCIgXAorCSJjb2xsZWN0IGdkYl9jaGFyX3Rlc3QsIGdkYl9zaG9ydF90ZXN0LCBnZGJfbG9uZ190ZXN0IiAiXiQiIFwKKwkiY29sbGVjdCBnZGJfYXJyX3Rlc3QsIGdkYl9zdHJ1Y3QxX3Rlc3QsIGdkYl9zdHJ1Y3QyX3Rlc3QiICJeJCIgXAorCSJjb2xsZWN0IGdkYl9zdHJ1Y3RwX3Rlc3QsIGdkYl9zdHJ1Y3RwcF90ZXN0LCBnZGJfdW5pb24xX3Rlc3QiICJeJCIgXAorCSJlbmQiICIiCisKK2dkYl90ZXN0ICJ0c3RhcnQiICIiICJzdXJ2aXZlIHRoZSBsb25nIHBhY2tldCBzZW5kIgoraWYgW2lzdGFyZ2V0ICJtNjhrLSotZWxmIl0gdGhlbiB7CisgICAgZ2RiX2VtY2xhcHRvcF9jb21tYW5kICI4NSwxLDIsMyw0LDUsNiIKKyAgICBzbGVlcCA1Cit9IGVsc2UgeworICAgIGdkYl90ZXN0ICJicmVhayBlbmQiICIiICIiCisgICAgZ2RiX3Rlc3QgImNvbnRpbnVlIiBcCisJICAgICJDb250aW51aW5nLipCcmVha3BvaW50ICRkZWNpbWFsLCBlbmQuKiIgXAorCSAgICAicnVuIHRyYWNlIGV4cGVyaW1lbnQiCit9CisKK2dkYl90ZXN0ICJ0c3RvcCIgIiIgImNvbmZpcm06IHN1cnZpdmVkIHRoZSBsb25nIHBhY2tldCBzZW5kIgorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9wYXNzYy1keW4uZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvcGFzc2MtZHluLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzBhMmVjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvcGFzc2MtZHluLmV4cApAQCAtMCwwICsxLDE4MSBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IE1pY2hhZWwgU255ZGVyIChtc255ZGVyQGN5Z251cy5jb20pCisKK2xvYWRfbGliICJ0cmFjZS1zdXBwb3J0LmV4cCI7CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworZ2RiX2V4aXQKK2dkYl9zdGFydAoraWYgW2lzdGFyZ2V0ICJtNjhrLSotZWxmIl0gdGhlbiB7CisgICAgbG9hZF9saWIgImVtYy1zdXBwb3J0LmV4cCI7CisgICAgc2V0IHNyY2ZpbGUgZ2RiX2NfdGVzdC5jCisgICAgc2V0IGJpbmZpbGUgW2JvYXJkX2luZm8gdGFyZ2V0IGQ0OTBfYmluZmlsZV07CisgICAgZ2RiX3Rlc3QgInNldCByZW1vdGV0aW1lb3V0IDYiICIiICIiCisgICAgc2V0IHRpbWVvdXQgNTAwCisgICAgZ2RiX3RhcmdldF9tb25pdG9yICRiaW5maWxlCisgICAgIyBHaXZlIGEgVFNUT1AgYW5kIGlnbm9yZSBlcnJvcnMsIHRvIG1ha2Ugc3VyZSBhbnkgcHJldmlvdXMgdHJhY2UgaXMgb2ZmCisgICAgZ2RiX3Rlc3QgInRzdG9wIiAiIiAiIgorICAgIGdkYl90ZXN0ICJ0ZmluZCBub25lIiAiIiAiIgorICAgIHNlbmRfZ2RiICJjb21wYXJlLXNlY3Rpb25zIENTXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJNSVMtTUFUQ0hFRC4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlN5bWJvbCBmaWxlIGRvZXMgbm90IG1hdGNoIHRhcmdldCEKKwkgICAgYWxsIHRlc3RzIGluIHRoaXMgbW9kdWxlIHdpbGwgZmFpbC4iOworCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyB9CisgICAgfQorfSBlbHNlIHsKKyAgICBzZXQgdGVzdGZpbGUgImFjdGlvbnMiCisgICAgc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworICAgIHNldCBiaW5maWxlICRvYmpkaXIvJHN1YmRpci8kdGVzdGZpbGUKKyAgICBpZiB7IFtnZGJfY29tcGlsZSAiJHNyY2Rpci8kc3ViZGlyLyRzcmNmaWxlIiAkYmluZmlsZSBcCisJICAgIGV4ZWN1dGFibGUge2RlYnVnIGFkZGl0aW9uYWxfZmxhZ3M9LXd9XSAhPSAiIiB9IHsKKwlnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKKyAgICB9CisgICAgZ2RiX2xvYWQgJGJpbmZpbGUKKyAgICBnZGJfdGVzdCAidHN0b3AiICAgICAgICIiICIiCisgICAgZ2RiX3Rlc3QgInRmaW5kIG5vbmUiICAiIiAiIgorICAgIHJ1bnRvX21haW4KK30KK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCisjIFdlIGdlbmVyb3VzbHkgZ2l2ZSBvdXJzZWx2ZXMgb25lICJwYXNzIiBpZiB3ZSBzdWNjZXNzZnVsbHkgCisjIGRldGVjdCB0aGF0IHRoaXMgdGVzdCBjYW5ub3QgYmUgcnVuIG9uIHRoaXMgdGFyZ2V0IQoraWYgeyAhW2dkYl90YXJnZXRfc3VwcG9ydHNfdHJhY2VdIH0gdGhlbiB7CisgICAgcGFzcyAiQ3VycmVudCB0YXJnZXQgZG9lcyBub3Qgc3VwcG9yc3QgdHJhY2UiCisgICAgcmV0dXJuIDE7CisKK30KKworIyBJZiB0ZXN0aW5nIG9uIGEgcmVtb3RlIGhvc3QsIGRvd25sb2FkIHRoZSBzb3VyY2UgZmlsZS4KKyMgcmVtb3RlX2Rvd25sb2FkIGhvc3QgJHNyY2Rpci8kc3ViZGlyLyRzcmNmaWxlCisKKworIworIyB0ZXN0IHBhc3Njb3VudCBkeW5hbWljYWxseSAobGl2ZSB0YXJnZXQpCisjCisKK3NldCBiYXNlbGluZSBbZ2RiX2ZpbmRfcmVjdXJzaW9uX3Rlc3RfYmFzZWxpbmUgJHNyY2ZpbGVdOworCitpZiB7ICRiYXNlbGluZSA9PSAtMSB9IHRoZW4geworICAgIGZhaWwgIkNvdWxkIG5vdCBmaW5kIGdkYl9yZWN1cnNpb25fdGVzdCBmdW5jdGlvbiIKKyAgICByZXR1cm47Cit9CisKKyMgZGVmaW5lIHJlbGF0aXZlIHNvdXJjZSBsaW5lIG51bWJlcnM6CisjIGFsbCBzdWJzZXF1ZW50IGxpbmUgbnVtYmVycyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBmaXJzdCBvbmUgKGJhc2VsaW5lKQorCitzZXQgdGVzdGxpbmUyICBbZXhwciAkYmFzZWxpbmUgKyAgNF0KK3NldCB0ZXN0bGluZTMgIFtleHByICRiYXNlbGluZSArICA1XQorc2V0IHRlc3RsaW5lNCAgW2V4cHIgJGJhc2VsaW5lICsgIDZdCisKKyMKKyMgdGVzdCBwYXNzY291bnQgY29tbWFuZCBzZW1hbnRpY3MgKGxpdmUgdGVzdCkKKyMKKworIyMgU2V0IHRocmVlIHRyYWNlcG9pbnRzIHdpdGggdGhyZWUgZGlmZmVyZW50IHBhc3Njb3VudHMuCisjIyBWZXJpZnkgdGhhdCB0aGUgZXhwZXJpbWVudCBzdG9wcyBhZnRlciB0aGUgb25lIHdpdGggdGhlIAorIyMgbG93ZXN0IHBhc3Njb3VudCBpcyBoaXQuCisKK2dkYl9kZWxldGVfdHJhY2Vwb2ludHMKK3NldCB0ZHAyIFtnZGJfZ2V0dHBudW0gIiR0ZXN0bGluZTIiXQorc2V0IHRkcDMgW2dkYl9nZXR0cG51bSAiJHRlc3RsaW5lMyJdCitzZXQgdGRwNCBbZ2RiX2dldHRwbnVtICIkdGVzdGxpbmU0Il0KK2lmIHsgJHRkcDIgPD0gMCB8fCAkdGRwMyA8PSAwIHx8ICR0ZHA0IDw9IDAgfSB0aGVuIHsKKyAgICBmYWlsICJzZXR0aW5nIHRyYWNlcG9pbnRzIgorICAgIHJldHVybjsKK30KKworZ2RiX3Rlc3QgInBhc3Njb3VudCA0ICR0ZHAyIiAiU2V0dGluZyB0cmFjZXBvaW50ICR0ZHAyJ3MgcGFzc2NvdW50IHRvIDQiIFwKKwkiNC41OiBzZXQgcGFzc2NvdW50IGZvciB0cmFjZXBvaW50ICR0ZHAyIgorZ2RiX3Rlc3QgInBhc3Njb3VudCAyICR0ZHAzIiAiU2V0dGluZyB0cmFjZXBvaW50ICR0ZHAzJ3MgcGFzc2NvdW50IHRvIDIiIFwKKwkiNC41OiBzZXQgcGFzc2NvdW50IGZvciB0cmFjZXBvaW50ICR0ZHAzIgorZ2RiX3Rlc3QgInBhc3Njb3VudCAzICR0ZHA0IiAiU2V0dGluZyB0cmFjZXBvaW50ICR0ZHA0J3MgcGFzc2NvdW50IHRvIDMiIFwKKwkiNC41OiBzZXQgcGFzc2NvdW50IGZvciB0cmFjZXBvaW50ICR0ZHA0IgorCitnZGJfdGVzdCAidHN0YXJ0IiAiIiAiIgorCitpZiBbaXN0YXJnZXQgIm02OGstKi1lbGYiXSB0aGVuIHsKKyAgICBnZGJfZW1jbGFwdG9wX2NvbW1hbmQgIjg1LDEsMiwzLDQsNSw2IgorICAgIHNsZWVwIDUKKyAgICBnZGJfZW1jbGFwdG9wX2NvbW1hbmQgIjg1LDcsOCw5LEEsQixDIgorICAgIHNsZWVwIDUKKyAgICBnZGJfZW1jbGFwdG9wX2NvbW1hbmQgIjg1LEQsRSxGLDEwLDExLDEyIgorICAgIHNsZWVwIDUKKyAgICAjIGdkYl90ZXN0ICJ0c3RvcCIKKyAgICAjIworICAgICMjIE5vdGUhIE11c3QgTk9UIGdpdmUgdGhlIHRzdG9wIGNvbW1hbmQsIGJlY2F1c2UgdGhlIHBhc3Njb3VudAorICAgICMjICAgICAgIGhhcyBhbHJlYWR5IHN0b3BwZWQgdGhlIGV4cGVyaW1lbnQuICBZb3Ugd291bGQgbm90CisgICAgIyMgICAgICAgdGhpbmsgdGhpcyB3b3VsZCBiZSBhbiBlcnJvciwgYnV0IGluIEVNQydzIG1pbmQgaXQgaXMuLi4KKyAgICAjIworfSBlbHNlIHsKKyAgICBnZGJfdGVzdCAiYnJlYWsgZW5kIiAiIiAiIgorICAgIGdkYl90ZXN0ICJjb250aW51ZSIgXAorCSAgICAiQ29udGludWluZy4qQnJlYWtwb2ludCAkZGVjaW1hbCwgZW5kLioiIFwKKwkgICAgInJ1biB0cmFjZSBleHBlcmltZW50IgorICAgIGdkYl90ZXN0ICJ0c3RvcCIgIiIgIiIKK30KKworZ2RiX3Rlc3QgInRmaW5kIG5vbmUiICIiICIiCitpZiBbZ2RiX3Rlc3QgInByaW50ZiBcInggXCVkIHhcXG5cIiwgXCR0cmFjZV9mcmFtZSIgInggLTEgeCIgIiJdIHsKKyAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIjA6IHRmaW5kIG5vbmUgZmFpbGVkIgorfQorCitnZGJfdGVzdCAidGZpbmQgdHJhY2Vwb2ludCAkdGRwMiIgIiIgIiIKK2lmIFtnZGJfdGVzdCAicHJpbnRmIFwieCBcJWQgeFxcblwiLCBcJHRyYWNlX2ZyYW1lIiAieCAwIHgiICIiXSB7CisgICAgZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICIxOiBmaXJzdCB0ZmluZCBmYWlsZWQiCit9CisKK2dkYl90ZXN0ICJ0ZmluZCB0cmFjZXBvaW50ICR0ZHAzIiAiIiAiIgoraWYgW2dkYl90ZXN0ICJwcmludGYgXCJ4IFwlZCB4XFxuXCIsIFwkdHJhY2VfZnJhbWUiICJ4IDEgeCIgIiJdIHsKKyAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIjI6IHNlY29uZCB0ZmluZCBmYWlsZWQiCit9CisKK2dkYl90ZXN0ICJ0ZmluZCB0cmFjZXBvaW50ICR0ZHA0IiAiIiAiIgoraWYgW2dkYl90ZXN0ICJwcmludGYgXCJ4IFwlZCB4XFxuXCIsIFwkdHJhY2VfZnJhbWUiICJ4IDIgeCIgIiJdIHsKKyAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIjM6IHRoaXJkIHRmaW5kIGZhaWxlZCIKK30KKworZ2RiX3Rlc3QgInRmaW5kIHRyYWNlcG9pbnQgJHRkcDIiICIiICIiCitpZiBbZ2RiX3Rlc3QgInByaW50ZiBcInggXCVkIHhcXG5cIiwgXCR0cmFjZV9mcmFtZSIgInggMyB4IiAiIl0geworICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiNDogZm91cnRoIHRmaW5kIGZhaWxlZCIKK30KKworZ2RiX3Rlc3QgInRmaW5kIHRyYWNlcG9pbnQgJHRkcDMiICIiICIiCitpZiBbZ2RiX3Rlc3QgInByaW50ZiBcInggXCVkIHhcXG5cIiwgXCR0cmFjZV9mcmFtZSIgInggNCB4IiAiIl0geworICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiNTogZmlmdGggdGZpbmQgZmFpbGVkIgorfQorCisjIyBXZSBzaG91bGQgbm93IGJlIGF0IHRoZSBsYXN0IGZyYW1lLCBiZWNhdXNlIHRoaXMgZnJhbWUncyBwYXNzY291bnQKKyMjIHNob3VsZCBoYXZlIGNhdXNlZCBjb2xsZWN0aW9uIHRvIHN0b3AuICBJZiB3ZSBkbyBhIHRmaW5kIG5vdywgCisjIyBpdCBzaG91bGQgZmFpbC4KKworZ2RiX3Rlc3QgInRmaW5kIiAiZmFpbGVkIHRvIGZpbmQuKiIgIjQuNTogZHluYW1pYyBwYXNzY291bnQgdGVzdCIKKworIyBGaW5pc2hlZCEKK2dkYl90ZXN0ICJ0ZmluZCBub25lIiAiIiAiIgorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9wYXNzY291bnQuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvcGFzc2NvdW50LmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWU2ZGRmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvcGFzc2NvdW50LmV4cApAQCAtMCwwICsxLDE3OCBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IE1pY2hhZWwgU255ZGVyIChtc255ZGVyQGN5Z251cy5jb20pCisKK2xvYWRfbGliICJ0cmFjZS1zdXBwb3J0LmV4cCI7CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworZ2RiX2V4aXQKK2dkYl9zdGFydAoraWYgW2lzdGFyZ2V0ICJtNjhrLSotZWxmIl0gdGhlbiB7CisgICAgc2V0IHNyY2ZpbGUgZ2RiX2NfdGVzdC5jCisgICAgc2V0IGJpbmZpbGUgW2JvYXJkX2luZm8gdGFyZ2V0IGQ0OTBfYmluZmlsZV07Cit9IGVsc2UgeworICAgIHNldCB0ZXN0ZmlsZSAiYWN0aW9ucyIKKyAgICBzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCisgICAgc2V0IGJpbmZpbGUgJG9iamRpci8kc3ViZGlyLyR0ZXN0ZmlsZQorICAgIGlmIHsgW2dkYl9jb21waWxlICIkc3JjZGlyLyRzdWJkaXIvJHNyY2ZpbGUiICRiaW5maWxlIFwKKwkgICAgZXhlY3V0YWJsZSB7ZGVidWcgYWRkaXRpb25hbF9mbGFncz0td31dICE9ICIiIH0geworCWdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorICAgIH0KK30KK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCisjIElmIHRlc3Rpbmcgb24gYSByZW1vdGUgaG9zdCwgZG93bmxvYWQgdGhlIHNvdXJjZSBmaWxlLgorIyByZW1vdGVfZG93bmxvYWQgaG9zdCAkc3JjZGlyLyRzdWJkaXIvJHNyY2ZpbGUKKworZ2RiX2ZpbGVfY21kICRiaW5maWxlCisKKyMgZGVmaW5lIHJlbGF0aXZlIHNvdXJjZSBsaW5lIG51bWJlcnM6CisjIGFsbCBzdWJzZXF1ZW50IGxpbmUgbnVtYmVycyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBmaXJzdCBvbmUgKGJhc2VsaW5lKQorc2V0IGJhc2VsaW5lICBbZ2RiX2ZpbmRfcmVjdXJzaW9uX3Rlc3RfYmFzZWxpbmUgJHNyY2ZpbGVdOworaWYgeyAkYmFzZWxpbmUgPT0gLTEgfSB0aGVuIHsKKyAgICBmYWlsICJDb3VsZCBub3QgZmluZCBnZGJfcmVjdXJzaW9uX3Rlc3QgZnVuY3Rpb24iCisgICAgcmV0dXJuOworfQorCitzZXQgdGVzdGxpbmUxICBbZXhwciAkYmFzZWxpbmUgKyAzXQorCisjCisjIHRlc3QgInBhc3Njb3VudCIgY29tbWFuZAorIworCitnZGJfZGVsZXRlX3RyYWNlcG9pbnRzCitzZXQgdHJjcHQxIFtnZGJfZ2V0dHBudW0gZ2RiX2NfdGVzdF07CitzZXQgdHJjcHQyIFtnZGJfZ2V0dHBudW0gZ2RiX2FzbV90ZXN0XTsKK3NldCB0cmNwdDMgW2dkYl9nZXR0cG51bSAkdGVzdGxpbmUxXTsKK2lmIHsgJHRyY3B0MSA8PSAwIHx8ICR0cmNwdDIgPD0gMCB8fCAkdHJjcHQzIDw9IDAgfSB0aGVuIHsKKyAgICBmYWlsICJzZXR0aW5nIHRyYWNlcG9pbnRzIgorICAgIHJldHVybjsKK30KKworIyA0LjEgcGFzc2NvdW50IG9mIHNwZWNpZmllZCB0cmFjZXBvaW50CisKK2dkYl90ZXN0ICJpbmZvIHRyYWNlcG9pbnRzIiBcCisgICAgIk51bSBFbmIgQWRkcmVzcyAgICBQYXNzQyBTdGVwQyBXaGF0LiokdHJjcHQxXFtcdCBcXSt5XFtcdCBcXSskaGV4XFtcdCBcXSswXFtcdCBcXSsuKmluIGdkYl9jX3Rlc3QuKiR0cmNwdDJcW1x0IFxdK3lcW1x0IFxdKyRoZXhcW1x0IFxdKzBcW1x0IFxdKy4qZ2RiX2FzbV90ZXN0LiokdHJjcHQzXFtcdCBcXSt5XFtcdCBcXSskaGV4XFtcdCBcXSswXFtcdCBcXSsuKmluIGdkYl9yZWN1cnNpb25fdGVzdC4qIiBcCisJCQkiNC4xYTogc2V0IHRocmVlIHRyYWNlcG9pbnRzLCBwYXNzY291bnRzIGFsbCB6ZXJvIgorCitnZGJfdGVzdCAicGFzc2NvdW50IDIgJHRyY3B0MSIgXAorCSJTZXR0aW5nIHRyYWNlcG9pbnQgJHRyY3B0MS5zIHBhc3Njb3VudCB0byAyIiBcCisJIjQuMWI6IHNldCAxc3QgdHJhY2Vwb2ludCdzIHBhc3Njb3VudCB0byB0d28iCisKK2dkYl90ZXN0ICJpbmZvIHRyYWNlcG9pbnRzIiBcCisJIk51bSBFbmIgQWRkcmVzcyAgICBQYXNzQyBTdGVwQyBXaGF0LiokdHJjcHQxXFtcdCBcXSt5XFtcdCBcXSskaGV4XFtcdCBcXSsyXFtcdCBcXSsuKmluIGdkYl9jX3Rlc3QuKiR0cmNwdDJcW1x0IFxdK3lcW1x0IFxdKyRoZXhcW1x0IFxdKzBcW1x0IFxdKy4qZ2RiX2FzbV90ZXN0LiokdHJjcHQzXFtcdCBcXSt5XFtcdCBcXSskaGV4XFtcdCBcXSswXFtcdCBcXSsuKmluIGdkYl9yZWN1cnNpb25fdGVzdC4qIiBcCisJIjQuMWM6IHZlcmlmeSAxc3QgdHJhY2Vwb2ludCdzIHBhc3Njb3VudCBzZXQgdG8gdHdvIgorCitnZGJfdGVzdCAicGFzc2NvdW50IDQgJHRyY3B0MiIgXAorCSJTZXR0aW5nIHRyYWNlcG9pbnQgJHRyY3B0Mi5zIHBhc3Njb3VudCB0byA0IiBcCisJIjQuMWQ6IHNldCAybmQgdHJhY2Vwb2ludCdzIHBhc3Njb3VudCB0byBmb3VyIgorCitnZGJfdGVzdCAiaW5mbyB0cmFjZXBvaW50cyIgXAorCSJOdW0gRW5iIEFkZHJlc3MgICAgUGFzc0MgU3RlcEMgV2hhdC4qJHRyY3B0MVxbXHQgXF0reVxbXHQgXF0rJGhleFxbXHQgXF0rMlxbXHQgXF0rLippbiBnZGJfY190ZXN0LiokdHJjcHQyXFtcdCBcXSt5XFtcdCBcXSskaGV4XFtcdCBcXSs0XFtcdCBcXSsuKmdkYl9hc21fdGVzdC4qJHRyY3B0M1xbXHQgXF0reVxbXHQgXF0rJGhleFxbXHQgXF0rMFxbXHQgXF0rLippbiBnZGJfcmVjdXJzaW9uX3Rlc3QuKiIgXAorCSI0LjFjOiB2ZXJpZnkgMm5kIHRyYWNlcG9pbnQncyBwYXNzY291bnQgc2V0IHRvIGZvdXIiCisKKyMgNC4yIHBhc3Njb3VudCBvZiBsYXN0IChkZWZhdWx0KSB0cmFjZXBvaW50CisKK2dkYl90ZXN0ICJwYXNzY291bnQgNiIgXAorCSJTZXR0aW5nIHRyYWNlcG9pbnQgJHRyY3B0My5zIHBhc3Njb3VudCB0byA2IiBcCisJIjQuMmI6IHNldCBsYXN0IChkZWZhdWx0KSB0cCdzIHBhc3Njb3VudCB0byBzaXgiCisKK2dkYl90ZXN0ICJpbmZvIHRyYWNlcG9pbnRzIiBcCisJIk51bSBFbmIgQWRkcmVzcyAgICBQYXNzQyBTdGVwQyBXaGF0LiokdHJjcHQxXFtcdCBcXSt5XFtcdCBcXSskaGV4XFtcdCBcXSsyXFtcdCBcXSsuKmluIGdkYl9jX3Rlc3QuKiR0cmNwdDJcW1x0IFxdK3lcW1x0IFxdKyRoZXhcW1x0IFxdKzRcW1x0IFxdKy4qZ2RiX2FzbV90ZXN0LiokdHJjcHQzXFtcdCBcXSt5XFtcdCBcXSskaGV4XFtcdCBcXSs2XFtcdCBcXSsuKmluIGdkYl9yZWN1cnNpb25fdGVzdC4qIiBcCisJIjQuMmI6IHZlcmlmeSBsYXN0IChkZWZhdWx0KSB0cCdzIHBhc3Njb3VudCBzZXQgdG8gc2l4IgorCisjIDQuMyBydW4gdW50aWwgc3RvcHBlZCBleHBsaWNpdGx5IGJ5IHVzZXIKKyMgICAgIFtkZWZlcnJlZCB0byBkeW5hbWljIHRlc3Qgc2VjdGlvbl0KKworIyA0LjQgcmVzZXQgdGhlIHByZXZpb3VzbHkgc2V0IHBhc3Njb3VudHMgdG8gbmV3IHZhbHVlcworCitnZGJfdGVzdCAicGFzc2NvdW50IDciIFwKKwkiU2V0dGluZyB0cmFjZXBvaW50ICR0cmNwdDMucyBwYXNzY291bnQgdG8gNyIgXAorCSI0LjRhOiByZXNldCBsYXN0IChkZWZhdWx0KSB0cCdzIHBhc3Njb3VudCB0byBzZXZlbiIKKworZ2RiX3Rlc3QgImluZm8gdHJhY2Vwb2ludHMiIFwKKwkiTnVtIEVuYiBBZGRyZXNzICAgIFBhc3NDIFN0ZXBDIFdoYXQuKiR0cmNwdDFcW1x0IFxdK3lcW1x0IFxdKyRoZXhcW1x0IFxdKzJcW1x0IFxdKy4qaW4gZ2RiX2NfdGVzdC4qJHRyY3B0MlxbXHQgXF0reVxbXHQgXF0rJGhleFxbXHQgXF0rNFxbXHQgXF0rLipnZGJfYXNtX3Rlc3QuKiR0cmNwdDNcW1x0IFxdK3lcW1x0IFxdKyRoZXhcW1x0IFxdKzdcW1x0IFxdKy4qaW4gZ2RiX3JlY3Vyc2lvbl90ZXN0LioiIFwKKwkiNC40YTogdmVyaWZ5IHJlc2V0IGxhc3QgKGRlZmF1bHQpIHRwJ3MgcGFzc2NvdW50IHRvIHNldmVuIgorCitnZGJfdGVzdCAicGFzc2NvdW50IDUgJHRyY3B0MiIgXAorCSJTZXR0aW5nIHRyYWNlcG9pbnQgJHRyY3B0Mi5zIHBhc3Njb3VudCB0byA1IiBcCisJIjQuNGI6IHJlc2V0IHNlY29uZCB0cmFjZXBvaW50J3MgcGFzc2NvdW50IHRvIGZpdmUiCisKK2dkYl90ZXN0ICJpbmZvIHRyYWNlcG9pbnRzIiBcCisJIk51bSBFbmIgQWRkcmVzcyAgICBQYXNzQyBTdGVwQyBXaGF0LiokdHJjcHQxXFtcdCBcXSt5XFtcdCBcXSskaGV4XFtcdCBcXSsyXFtcdCBcXSsuKmluIGdkYl9jX3Rlc3QuKiR0cmNwdDJcW1x0IFxdK3lcW1x0IFxdKyRoZXhcW1x0IFxdKzVcW1x0IFxdKy4qZ2RiX2FzbV90ZXN0LiokdHJjcHQzXFtcdCBcXSt5XFtcdCBcXSskaGV4XFtcdCBcXSs3XFtcdCBcXSsuKmluIGdkYl9yZWN1cnNpb25fdGVzdC4qIiBcCisJIjQuNGM6IHZlcmlmeSByZXNldCBzZWNvbmQgdHJhY2Vwb2ludCdzIHBhc3Njb3VudCB0byBmaXZlIgorCisjIDQuMjAgPEZJWE1FIHRlc3QgbnVtYmVyPiBwYXNzY291bnQgZm9yICJhbGwiCisKK2dkYl90ZXN0ICJwYXNzY291bnQgMyBhbGwiIFwKKwkiLiokdHJjcHQxLnMgcGFzcy4qIDMuKiR0cmNwdDIucyBwYXNzLiogMy4qJHRyY3B0My5zIHBhc3MuKiAzIiBcCisJIjQuMjBhOiBzZXQgYWxsIHRocmVlIHBhc3Njb3VudHMgdG8gdGhyZWUiCisKK2dkYl90ZXN0ICJpbmZvIHRyYWNlcG9pbnRzIiBcCisJIk51bSBFbmIgQWRkcmVzcyAgICBQYXNzQyBTdGVwQyBXaGF0LiokdHJjcHQxXFtcdCBcXSt5XFtcdCBcXSskaGV4XFtcdCBcXSszXFtcdCBcXSsuKmluIGdkYl9jX3Rlc3QuKiR0cmNwdDJcW1x0IFxdK3lcW1x0IFxdKyRoZXhcW1x0IFxdKzNcW1x0IFxdKy4qZ2RiX2FzbV90ZXN0LiokdHJjcHQzXFtcdCBcXSt5XFtcdCBcXSskaGV4XFtcdCBcXSszXFtcdCBcXSsuKmluIGdkYl9yZWN1cnNpb25fdGVzdC4qIiBcCisJIjQuMjBhOiBzZXQgYWxsIHRocmVlIHBhc3Njb3VudHMgdG8gdGhyZWUiCisKK2dkYl90ZXN0ICJwYXNzY291bnQgNCBhbGwiIFwKKwkiLiokdHJjcHQxLnMgcGFzcy4qIDQuKiR0cmNwdDIucyBwYXNzLiogNC4qJHRyY3B0My5zIHBhc3MuKiA0IiBcCisJIjQuMjBhOiByZXNldCBhbGwgdGhyZWUgcGFzc2NvdW50cyB0byBmb3VyIgorCitnZGJfdGVzdCAiaW5mbyB0cmFjZXBvaW50cyIgXAorCSJOdW0gRW5iIEFkZHJlc3MgICAgUGFzc0MgU3RlcEMgV2hhdC4qJHRyY3B0MVxbXHQgXF0reVxbXHQgXF0rJGhleFxbXHQgXF0rNFxbXHQgXF0rLippbiBnZGJfY190ZXN0LiokdHJjcHQyXFtcdCBcXSt5XFtcdCBcXSskaGV4XFtcdCBcXSs0XFtcdCBcXSsuKmdkYl9hc21fdGVzdC4qJHRyY3B0M1xbXHQgXF0reVxbXHQgXF0rJGhleFxbXHQgXF0rNFxbXHQgXF0rLippbiBnZGJfcmVjdXJzaW9uX3Rlc3QuKiIgXAorCSI0LjIwYjogcmVzZXQgYWxsIHRocmVlIHBhc3Njb3VudHMgdG8gZm91ciIKKworIyA0LjUgVmVyaWZ5IHRyYWNlIHN0b3BzIG9uIGZpcnN0ICJzYXRpc2ZpZWQiIHBhc3Njb3VudAorIyAgICAgW2RlZmVycmVkIHRvIGR5bmFtaWMgdGVzdCBzZWN0aW9uXQorCisjIDQuNiBtaW5pbXVtIHBhc3Njb3VudCBib3VuZGFyeSBjb25kaXRpb24KKworZ2RiX3Rlc3QgInBhc3Njb3VudCAwICR0cmNwdDEiIFwKKwkiU2V0dGluZyB0cmFjZXBvaW50ICR0cmNwdDEucyBwYXNzY291bnQgdG8gMCIgXAorCSI0LjY6IHNldCBwYXNzY291bnQgdG8gemVybyIKKworZ2RiX3Rlc3QgImluZm8gdHJhY2Vwb2ludHMiIFwKKwkiTnVtIEVuYiBBZGRyZXNzICAgIFBhc3NDIFN0ZXBDIFdoYXQuKiR0cmNwdDFcW1x0IFxdK3lcW1x0IFxdKyRoZXhcW1x0IFxdKzBcW1x0IFxdKy4qaW4gZ2RiX2NfdGVzdC4qJHRyY3B0MlxbXHQgXF0reVxbXHQgXF0rJGhleFxbXHQgXF0rNFxbXHQgXF0rLipnZGJfYXNtX3Rlc3QuKiR0cmNwdDNcW1x0IFxdK3lcW1x0IFxdKyRoZXhcW1x0IFxdKzRcW1x0IFxdKy4qaW4gZ2RiX3JlY3Vyc2lvbl90ZXN0LioiIFwKKwkiNC42OiBzZXQgcGFzc2NvdW50IHRvIHplcm8iCisKKyMgNC43ICh0ZXN0IGEgdmVyeSBsYXJnZSBwYXNzY291bnQpCisKK2dkYl90ZXN0ICJwYXNzY291bnQgMzI3NjcgJHRyY3B0MSIgXAorCSJTZXR0aW5nIHRyYWNlcG9pbnQgJHRyY3B0MS5zIHBhc3Njb3VudCB0byAzMjc2NyIgXAorCSI0Ljc6IHNldCBwYXNzY291bnQgdG8gbGFyZ2UgbnVtYmVyICgzMjc2NykiCisKK2dkYl90ZXN0ICJpbmZvIHRyYWNlcG9pbnRzIiBcCisJIk51bSBFbmIgQWRkcmVzcyAgICBQYXNzQyBTdGVwQyBXaGF0LiokdHJjcHQxXFtcdCBcXSt5XFtcdCBcXSskaGV4XFtcdCBcXSszMjc2N1xbXHQgXF0rLippbiBnZGJfY190ZXN0LiokdHJjcHQyXFtcdCBcXSt5XFtcdCBcXSskaGV4XFtcdCBcXSs0XFtcdCBcXSsuKmdkYl9hc21fdGVzdC4qJHRyY3B0M1xbXHQgXF0reVxbXHQgXF0rJGhleFxbXHQgXF0rNFxbXHQgXF0rLippbiBnZGJfcmVjdXJzaW9uX3Rlc3QuKiIgXAorCSI0Ljc6IHNldCBwYXNzY291bnQgdG8gbGFyZ2UgbnVtYmVyICgzMjc2NykiCisKKyMgNC44IHNldCBwYXNzY291bnQgZm9yIGludmFsaWQgdHJhY2Vwb2ludAorCitnZGJfdGVzdCAicGFzc2NvdW50IDEgW2V4cHIgJHRyY3B0MiArICR0cmNwdDNdIiBcCisJIk5vIHRyYWNlcG9pbnQgbnVtYmVyIFtleHByICR0cmNwdDIgKyAkdHJjcHQzXS4iIFwKKwkiNC44OiBpbnZhbGlkIHRyYWNlcG9pbnQgbnVtYmVyIGluIHBhc3Njb3VudCIKKworIyA0LjkgaGVscCBwYXNzY291bnQKK2dkYl90ZXN0ICJoZWxwIHBhc3Njb3VudCIgIlNldCB0aGUgcGFzc2NvdW50IGZvciBhIHRyYWNlcG9pbnQuKiIgXAorCSI0Ljk6IGhlbHAgcGFzc2NvdW50IgorCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS9yZXBvcnQuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvcmVwb3J0LmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjEzM2FkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvcmVwb3J0LmV4cApAQCAtMCwwICsxLDQyMSBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IE1pY2hhZWwgU255ZGVyIChtc255ZGVyQGN5Z251cy5jb20pCisKK2xvYWRfbGliICJ0cmFjZS1zdXBwb3J0LmV4cCI7CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorCitpZiBbaXN0YXJnZXQgIm02OGstKi1lbGYiXSB0aGVuIHsKKyAgICBsb2FkX2xpYiAiZW1jLXN1cHBvcnQuZXhwIjsKKyAgICBzZXQgc3JjZmlsZSBnZGJfY190ZXN0LmMKKyAgICBzZXQgYmluZmlsZSBbYm9hcmRfaW5mbyB0YXJnZXQgZDQ5MF9iaW5maWxlXTsKKyAgICBnZGJfdGVzdCAic2V0IHJlbW90ZXRpbWVvdXQgNiIgIiIgIiIKKyAgICBzZXQgdGltZW91dCA1MDAKKyAgICBnZGJfdGFyZ2V0X21vbml0b3IgJGJpbmZpbGUKKyAgICAjIEdpdmUgYSBUU1RPUCBhbmQgaWdub3JlIGVycm9ycywgdG8gbWFrZSBzdXJlIGFueSBwcmV2aW91cyB0cmFjZSBpcyBvZmYKKyAgICBnZGJfdGVzdCAidHN0b3AiICIiICIiCisgICAgZ2RiX3Rlc3QgInRmaW5kIG5vbmUiICAiIiAiIgorICAgIHNlbmRfZ2RiICJjb21wYXJlLXNlY3Rpb25zIENTXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICJNSVMtTUFUQ0hFRC4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlN5bWJvbCBmaWxlIGRvZXMgbm90IG1hdGNoIHRhcmdldCEKKwkgICAgYWxsIHRlc3RzIGluIHRoaXMgbW9kdWxlIHdpbGwgZmFpbC4iOworCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyB9CisgICAgfQorfSBlbHNlIHsKKyAgICBzZXQgdGVzdGZpbGUgImFjdGlvbnMiCisgICAgc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworICAgIHNldCBiaW5maWxlICRvYmpkaXIvJHN1YmRpci8kdGVzdGZpbGUKKyAgICBpZiB7IFtnZGJfY29tcGlsZSAiJHNyY2Rpci8kc3ViZGlyLyRzcmNmaWxlIiAkYmluZmlsZSBcCisJICAgICBleGVjdXRhYmxlIHtkZWJ1ZyBhZGRpdGlvbmFsX2ZsYWdzPS13fV0gIT0gIiIgfSB7CisJZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCisgICAgfQorICAgIGdkYl9sb2FkICRiaW5maWxlCisgICAgZ2RiX3Rlc3QgInRzdG9wIiAgICAgICAiIiAiIgorICAgIGdkYl90ZXN0ICJ0ZmluZCBub25lIiAgIiIgIiIKKyAgICBydW50b19tYWluCit9CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKworIyBXZSBnZW5lcm91c2x5IGdpdmUgb3Vyc2VsdmVzIG9uZSAicGFzcyIgaWYgd2Ugc3VjY2Vzc2Z1bGx5IAorIyBkZXRlY3QgdGhhdCB0aGlzIHRlc3QgY2Fubm90IGJlIHJ1biBvbiB0aGlzIHRhcmdldCEKK2lmIHsgIVtnZGJfdGFyZ2V0X3N1cHBvcnRzX3RyYWNlXSB9IHRoZW4geworICAgIHBhc3MgIkN1cnJlbnQgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnN0IHRyYWNlIgorICAgIHJldHVybiAxOworCit9CisKK3NldCBjciAiXFtcclxuXF0rIgorCisjIElmIHRlc3Rpbmcgb24gYSByZW1vdGUgaG9zdCwgZG93bmxvYWQgdGhlIHNvdXJjZSBmaWxlLgorIyByZW1vdGVfZG93bmxvYWQgaG9zdCAkc3JjZGlyLyRzdWJkaXIvJHNyY2ZpbGUKKworIworIyB0ZXN0IGdlbmVyYWwgcmVwb3J0aW5nIG9mIHRyYWNlIGV4cGVyaW1lbnQgcmVzdWx0cworIworCitzZXQgdGVzdGxpbmUxIDAKK3NldCB0ZXN0bGluZTIgMAorc2V0IHRlc3RsaW5lMyAwCitzZXQgdGVzdGxpbmU0IDAKK3NldCB0ZXN0bGluZTUgMAorc2V0IHRlc3RsaW5lNiAwCisKK3NldCBhcmcxIDEKK3NldCBhcmcyIDIKK3NldCBhcmczIDMKK3NldCBhcmc0IDQKK3NldCBhcmc1IDUKK3NldCBhcmc2IDYKKworc2V0IGdkYl9yZWN1cnNpb25fdGVzdF9iYXNlbGluZSBbZ2RiX2ZpbmRfcmVjdXJzaW9uX3Rlc3RfYmFzZWxpbmUgJHNyY2ZpbGVdOworaWYgeyAkZ2RiX3JlY3Vyc2lvbl90ZXN0X2Jhc2VsaW5lID09IC0xIH0geworICAgIGZhaWwgIkNvdWxkIG5vdCBmaW5kIGdkYl9yZWN1cnNpb25fdGVzdCBmdW5jdGlvbiIKKyAgICByZXR1cm47Cit9CisKK3NlbmRfZ2RiICJsaXN0ICRnZGJfcmVjdXJzaW9uX3Rlc3RfYmFzZWxpbmUsICsxMlxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJcW1xyXG5cXShcWzAtOVxdKylcW15cclxuXF0rZ2RidGVzdGxpbmUgMSAiIHsKKwlzZXQgdGVzdGxpbmUxICRleHBlY3Rfb3V0KDEsc3RyaW5nKQorCWV4cF9jb250aW51ZQorICAgIH0KKyAgICAtcmUgIlxbXHJcblxdKFxbMC05XF0rKVxbXlxyXG5cXStnZGJ0ZXN0bGluZSAyICIgeworCXNldCB0ZXN0bGluZTIgJGV4cGVjdF9vdXQoMSxzdHJpbmcpCisJZXhwX2NvbnRpbnVlCisgICAgfQorICAgIC1yZSAiXFtcclxuXF0oXFswLTlcXSspXFteXHJcblxdK2dkYnRlc3RsaW5lIDMgIiB7CisJc2V0IHRlc3RsaW5lMyAkZXhwZWN0X291dCgxLHN0cmluZykKKwlleHBfY29udGludWUKKyAgICB9CisgICAgLXJlICJcW1xyXG5cXShcWzAtOVxdKylcW15cclxuXF0rZ2RidGVzdGxpbmUgNCAiIHsKKwlzZXQgdGVzdGxpbmU0ICRleHBlY3Rfb3V0KDEsc3RyaW5nKQorCWV4cF9jb250aW51ZQorICAgIH0KKyAgICAtcmUgIlxbXHJcblxdKFxbMC05XF0rKVxbXlxyXG5cXStnZGJ0ZXN0bGluZSA1ICIgeworCXNldCB0ZXN0bGluZTUgJGV4cGVjdF9vdXQoMSxzdHJpbmcpCisJZXhwX2NvbnRpbnVlCisgICAgfQorICAgIC1yZSAiXFtcclxuXF0oXFswLTlcXSspXFteXHJcblxdK2dkYnRlc3RsaW5lIDYgIiB7CisJc2V0IHRlc3RsaW5lNiAkZXhwZWN0X291dCgxLHN0cmluZykKKwlleHBfY29udGludWUKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwlpZiB7ICgkdGVzdGxpbmUxID09IDApIHx8ICgkdGVzdGxpbmUyID09IDApIHx8ICgkdGVzdGxpbmUzID09IDApIHx8ICgkdGVzdGxpbmU0ID09IDApIHx8ICgkdGVzdGxpbmU1ID09IDApIHx8ICgkdGVzdGxpbmU2ID09IDApIH0geworCSAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgImZhaWxlZCB0byBsb2NhdGUgdGVzdCBzb3VyY2UgbGluZXM6CithbGwgdGVzdHMgaW4gdGhpcyBtb2R1bGUgd2lsbCBmYWlsLiIKKwl9CisgICAgfQorICAgIGRlZmF1bHQgeworCSAgICBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgImZhaWxlZCB0byBsb2NhdGUgdGVzdCBzb3VyY2UgbGluZXMgKGRlZik6CithbGwgdGVzdHMgaW4gdGhpcyBtb2R1bGUgd2lsbCBmYWlsLiIKKyAgICB9IAorfQorCisjCisjIFNldHVwIHRyYWNlIGV4cGVyaW1lbnQuICBUaGlzIHdpbGwgaW52b2x2ZToKKyMgICAxKSBhIHRyYWNlcG9pbnQgd2hlcmUgbm90aGluZyBpcyBjb2xsZWN0ZWQKKyMgICAyKSBhIHRyYWNlcG9pbnQgd2hlcmUgb25seSByZWdzIGFyZSBjb2xsZWN0ZWQKKyMgICAzKSBhIHRyYWNlcG9pbnQgd2hlcmUgb25seSBhcmdzIGFyZSBjb2xsZWN0ZWQKKyMgICA0KSBhIHRyYWNlcG9pbnQgd2hlcmUgb25seSBsb2NhbHMgYXJlIGNvbGxlY3RlZAorIyAgIDUpIGEgdHJhY2Vwb2ludCB3aGVyZSBzb21lIGFtb3VudCBvZiBzdGFjayBtZW1vcnkgaXMgY29sbGVjdGVkLgorIyAgIDYpIGEgdHJhY2Vwb2ludCB3aGVyZSBzb21lIGV4cHJlc3Npb25zIGFyZSBjb2xsZWN0ZWQuCisjCisKK2dkYl9kZWxldGVfdHJhY2Vwb2ludHMKK3NldCB0ZHAxIFtnZGJfZ2V0dHBudW0gJHRlc3RsaW5lMV0KK3NldCB0ZHAyIFtnZGJfZ2V0dHBudW0gJHRlc3RsaW5lMl0KK3NldCB0ZHAzIFtnZGJfZ2V0dHBudW0gJHRlc3RsaW5lM10KK3NldCB0ZHA0IFtnZGJfZ2V0dHBudW0gJHRlc3RsaW5lNF0KK3NldCB0ZHA1IFtnZGJfZ2V0dHBudW0gJHRlc3RsaW5lNV0KK3NldCB0ZHA2IFtnZGJfZ2V0dHBudW0gJHRlc3RsaW5lNl0KKworaWYgeyAgICAkdGRwMSA8PSAwIHx8ICR0ZHAyIDw9IDAgfHwgJHRkcDMgPD0gMCB8fCBcCisJJHRkcDQgPD0gMCB8fCAkdGRwNSA8PSAwIHx8ICR0ZHA2IDw9IDAgfSB0aGVuIHsKKyAgICBmYWlsICJzZXR0aW5nIHRyYWNlcG9pbnRzIGZhaWxlZCIKKyAgICByZXR1cm47Cit9CisKK2dkYl90cmFjZV9zZXRhY3Rpb25zICI5Lng6IHNldHVwIFRQIHRvIGNvbGxlY3QgcmVncyIgXAorCSIkdGRwMiIgXAorCSJjb2xsZWN0IFwkcmVncyIgIl4kIgorCisKK2dkYl90cmFjZV9zZXRhY3Rpb25zICI5Lng6IHNldHVwIFRQIHRvIGNvbGxlY3QgYXJncyIgXAorCSIkdGRwMyIgXAorCSJjb2xsZWN0IFwkYXJncyIgIl4kIgorCitnZGJfdHJhY2Vfc2V0YWN0aW9ucyAiOS54OiBzZXR1cCBUUCB0byBjb2xsZWN0IGxvY2FscyIgXAorCSIkdGRwNCIgXAorCSJjb2xsZWN0IFwkbG9jcyIgIl4kIgorCitnZGJfdHJhY2Vfc2V0YWN0aW9ucyAiOS54OiBzZXR1cCBUUCB0byBjb2xsZWN0IHN0YWNrIG1lbW9yeSIgXAorCSIkdGRwNSIgXAorCSJjb2xsZWN0IFwkZnAsIFwqXCh2b2lkIFwqXCpcKSBcJHNwIEAgNjQiICJeJCIKKworZ2RiX3RyYWNlX3NldGFjdGlvbnMgIjkueDogc2V0dXAgVFAgdG8gY29sbGVjdCBleHByZXNzaW9ucyIgXAorCSIkdGRwNiIgXAorCSJjb2xsZWN0IGdkYl9jaGFyX3Rlc3QsIGdkYl9zaG9ydF90ZXN0LCBnZGJfbG9uZ190ZXN0IiAiXiQiCisKK2dkYl90ZXN0ICJ0c3RhcnQiICIiICIiCisKK2lmIFtpc3RhcmdldCAibTY4ay0qLWVsZiJdIHRoZW4geworICAgIGdkYl9lbWNsYXB0b3BfY29tbWFuZCAiODUsJGFyZzEsJGFyZzIsJGFyZzMsJGFyZzQsJGFyZzUsJGFyZzYiCisgICAgc2xlZXAgNQorICAgIAorfSBlbHNlIHsKKyAgICBnZGJfdGVzdCAiYnJlYWsgZW5kIiAiIiAiIgorICAgIGdkYl90ZXN0ICJjb250aW51ZSIgXAorCSAgICAiQ29udGludWluZy4qQnJlYWtwb2ludCAkZGVjaW1hbCwgZW5kLioiIFwKKwkgICAgInJ1biB0cmFjZSBleHBlcmltZW50IgorfQorCitnZGJfdGVzdCAidHN0b3AiICIiICIiCisKKyMKKyMgOS4xIHRlc3QgdGhlIHRkdW1wIGNvbW1hbmQKKyMKKworc2V0IHRpbWVvdXQgNjAKKworZ2RiX3RmaW5kX3Rlc3QgIjkuMTogaW5pdDogbWFrZSBzdXJlIG5vdCBkZWJ1Z2dpbmcgYW55IHRyYWNlIGZyYW1lIiAibm9uZSIgIi0xIgorCitnZGJfdGZpbmRfdGVzdCAiOS4xOiBmaW5kIGZyYW1lIGZvciBUUCAkdGRwMSIgInRyYWNlcG9pbnQgJHRkcDEiIFwKKwkiXCR0cmFjZXBvaW50IiAiJHRkcDEiCisKKyMgTm90aGluZyB3YXMgY29sbGVjdGVkIGF0IHRkcDEsIHNvIHRoaXMgdGR1bXAgc2hvdWxkIGJlIGVtcHR5LgorZ2RiX3Rlc3QgInRkdW1wIiBcCisJIkRhdGEgY29sbGVjdGVkIGF0IHRyYWNlcG9pbnQgJHRkcDEsIHRyYWNlIGZyYW1lICRkZWNpbWFsOiIgXAorCSI5LjE6IHRkdW1wLCBub3RoaW5nIGNvbGxlY3RlZCIKKworZ2RiX3RmaW5kX3Rlc3QgIjkuMTogZmluZCBmcmFtZSBmb3IgVFAgJHRkcDIiICJ0cmFjZXBvaW50ICR0ZHAyIiBcCisJIlwkdHJhY2Vwb2ludCIgIiR0ZHAyIgorCisjIHJlZ3Mgd2VyZSBjb2xsZWN0ZWQgYXQgdGRwMi4KKyMgSG93IHRvIG1hdGNoIGZvciB0aGUgb3V0cHV0IG9mICJpbmZvIHJlZ2lzdGVycyIgb24gYW4gdW5rbm93biBhcmNoaXRlY3R1cmU/CisjIEZvciBub3csIGFzc3VtZSB0aGF0IGV2ZXJ5IGFyY2hpdGVjdHVyZSBoYXMgYSByZWdpc3RlciBjYWxsZWQgInBjIi4KK2dkYl90ZXN0ICJ0ZHVtcCIgXAorCSJcW1xyXG5cXXBjIC4qIiBcCisJIjkuMTogdGR1bXAsIHJlZ3MgY29sbGVjdGVkIgorCitnZGJfdGZpbmRfdGVzdCAiOS4xOiBmaW5kIGZyYW1lIGZvciBUUCAkdGRwMyIgInRyYWNlcG9pbnQgJHRkcDMiIFwKKwkiXCR0cmFjZXBvaW50IiAiJHRkcDMiCisKKyMgYXJncyB3ZXJlIGNvbGxlY3RlZCBhdCB0ZHAzCitnZGJfdGVzdCAidGR1bXAiIFwKKwkiZGVwdGggPSAzLipxMSA9IDIuKnEyID0gMi4qcTMgPSAzLipxNCA9IDQuKnE1ID0gNS4qcTYgPSA2IiBcCisJIjkuMTogdGR1bXAsIGFyZ3MgY29sbGVjdGVkIgorCitnZGJfdGZpbmRfdGVzdCAiOS4xOiBmaW5kIGZyYW1lIGZvciBUUCAkdGRwNCIgInRyYWNlcG9pbnQgJHRkcDQiIFwKKwkiXCR0cmFjZXBvaW50IiAiJHRkcDQiCisKKyMgbG9jYWxzIHdlcmUgY29sbGVjdGVkIGF0IHRkcDQKK2dkYl90ZXN0ICJ0ZHVtcCIgXAorCSJxID0gMSIgXAorCSI5LjE6IHRkdW1wLCBsb2NhbHMgY29sbGVjdGVkIgorCitnZGJfdGZpbmRfdGVzdCAiOS4xOiBmaW5kIGZyYW1lIGZvciBUUCAkdGRwNSIgInRyYWNlcG9pbnQgJHRkcDUiIFwKKwkiXCR0cmFjZXBvaW50IiAiJHRkcDUiCisKKyMgc3RhY2sgd2FzIGNvbGxlY3RlZCBhdCB0ZHA1LCBwbHVzIHRoZSBmcmFtZSBwb2ludGVyCitnZGJfdGVzdCAidGR1bXAiIFwKKwkiLmZwID0gLipzcCBAIDY0ID0gLioiIFwKKwkiOS4xOiB0ZHVtcCwgbWVtcmFuZ2UgY29sbGVjdGVkIgorCitnZGJfdGZpbmRfdGVzdCAiOS4xOiBmaW5kIGZyYW1lIGZvciBUUCAkdGRwNiIgInRyYWNlcG9pbnQgJHRkcDYiIFwKKwkiXCR0cmFjZXBvaW50IiAiJHRkcDYiCisKKyMgZ2xvYmFscyB3ZXJlIGNvbGxlY3RlZCBhdCB0ZHA2CitnZGJfdGVzdCAidGR1bXAiIFwKKwkiZ2RiX2NoYXJfdGVzdCA9IDEuKmdkYl9zaG9ydF90ZXN0ID0gMi4qZ2RiX2xvbmdfdGVzdCA9IDMiIFwKKwkiOS4xOiB0ZHVtcCwgZ2xvYmFsIHZhcmlhYmxlcyBjb2xsZWN0ZWQiCisKKyMgOS4yIHRlc3QgdGR1bXAgd2l0aCBhcmd1bWVudHMKKyMgICAgIFtubyBnbywgdGR1bXAgZG9lc24ndCBoYXZlIGFueSBhcmd1bWVudHNdCisKKyMgOS4zIGhlbHAgdGR1bXAKKworZ2RiX3Rlc3QgImhlbHAgdGR1bXAiICJQcmludCBldmVyeXRoaW5nIGNvbGxlY3RlZCBhdCB0aGUgY3VycmVudC4qIiBcCisJIjkuMzogaGVscCB0ZHVtcCIKKworc2V0IGxpbmVjb3VudDEgMAorc2V0IGxpbmVjb3VudDIgMAorc2V0IGxpbmVjb3VudDMgMAorc2V0IGxpbmVjb3VudDQgMAorc2V0IGxpbmVjb3VudDUgMAorc2V0IGxpbmVjb3VudDYgMAorCitnZGJfdGZpbmRfdGVzdCAiMTEueCwgMTIuMTogZmluZCBzdGFydCBmcmFtZSIgInN0YXJ0IiAiMCIKKworIworIyAxMS54IHRlc3QgYnVpbHQtaW4gdHJhY2UgdmFyaWFibGVzICR0cmFjZV9mcmFtZSwgJHRyYWNlX2xpbmUgZXRjLgorIworCitnZGJfdGVzdCAicHJpbnRmIFwieCAlZCB4XFxuXCIsIFwkdHJhY2VfZnJhbWUiICJ4IDAgeCIgXAorCSIxMS4xOiB0ZXN0IFwkdHJhY2VfZnJhbWUiCisKK2dkYl90ZXN0ICJwcmludGYgXCJ4ICVkIHhcXG5cIiwgXCR0cmFjZXBvaW50IiAieCAkdGRwMSB4IiBcCisJIjExLjI6IHRlc3QgXCR0cmFjZXBvaW50IgorCitnZGJfdGVzdCAicHJpbnRmIFwieCAlZCB4XFxuXCIsIFwkdHJhY2VfbGluZSIgInggJHRlc3RsaW5lMSB4IiBcCisJIjExLjM6IHRlc3QgXCR0cmFjZV9saW5lIgorCitzZW5kX2dkYiAicHJpbnQgXCR0cmFjZV9maWxlXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIlxcJFxbMC05XF0rID0gXCIkc3JjZmlsZVwiXFtcclxuXF0rJGdkYl9wcm9tcHQgJCIgeworCXBhc3MgIjExLjQ6IHRlc3QgXCR0cmFjZV9maWxlIgorICAgIH0KKyAgICAtcmUgIlxcJFxbMC05XF0rID0gXCIkc3JjZGlyLyRzdWJkaXIvJHNyY2ZpbGVcIlxbXHJcblxdKyRnZGJfcHJvbXB0ICQiIHsKKwlwYXNzICIxMS40OiB0ZXN0IFwkdHJhY2VfZmlsZSIKKyAgICB9CisgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7CisJZmFpbCAiMTEuNDogdGVzdCBcJHRyYWNlX2ZpbGUiCisgICAgfQorICAgIHRpbWVvdXQgeworCWZhaWwgIjExLjQ6IHRlc3QgXCR0cmFjZV9maWxlICh0aW1lb3V0KSIKKyAgICB9Cit9CisKKyNnZGJfdGVzdCAicHJpbnQgXCR0cmFjZV9maWxlIiAiXCIkc3JjZGlyLyRzdWJkaXIvJHNyY2ZpbGVcIiIgXAorIwkiMTEuNDogdGVzdCBcJHRyYWNlX2ZpbGUiCisKKyMKKyMgMTIueCB0ZXN0IHJlcG9ydCBnZW5lcmF0aW9uIHVzaW5nIGFyYml0cmFyeSBHREIgY29tbWFuZHMsIGxvb3BzIGV0Yy4KKyMKKworc2VuZF9nZGIgIndoaWxlIFwkdHJhY2VfZnJhbWUgIT0gLTFcbiAgb3V0cHV0IFwkdHJhY2VfZmlsZVxuICBwcmludGYgXCIsIGxpbmUgXCVkIFwodHJhY2Vwb2ludCAjXCVkXClcXG5cIiwgXCR0cmFjZV9saW5lLCBcJHRyYWNlcG9pbnRcbiAgdGZpbmRcbiAgZW5kXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIiBsaW5lICR0ZXN0bGluZTEgLnRyYWNlcG9pbnQgLiR0ZHAxIiB7CisJc2V0IGxpbmVjb3VudDEgW2V4cHIgJGxpbmVjb3VudDEgKyAxXQorCWV4cF9jb250aW51ZQorICAgIH0KKyAgICAtcmUgIiBsaW5lICR0ZXN0bGluZTIgLnRyYWNlcG9pbnQgLiR0ZHAyIiB7CisJc2V0IGxpbmVjb3VudDIgW2V4cHIgJGxpbmVjb3VudDIgKyAxXQorCWV4cF9jb250aW51ZQorICAgIH0KKyAgICAtcmUgIiBsaW5lICR0ZXN0bGluZTMgLnRyYWNlcG9pbnQgLiR0ZHAzIiB7CisJc2V0IGxpbmVjb3VudDMgW2V4cHIgJGxpbmVjb3VudDMgKyAxXQorCWV4cF9jb250aW51ZQorICAgIH0KKyAgICAtcmUgIiBsaW5lICR0ZXN0bGluZTQgLnRyYWNlcG9pbnQgLiR0ZHA0IiB7CisJc2V0IGxpbmVjb3VudDQgW2V4cHIgJGxpbmVjb3VudDQgKyAxXQorCWV4cF9jb250aW51ZQorICAgIH0KKyAgICAtcmUgIiBsaW5lICR0ZXN0bGluZTUgLnRyYWNlcG9pbnQgLiR0ZHA1IiB7CisJc2V0IGxpbmVjb3VudDUgW2V4cHIgJGxpbmVjb3VudDUgKyAxXQorCWV4cF9jb250aW51ZQorICAgIH0KKyAgICAtcmUgIiBsaW5lICR0ZXN0bGluZTYgLnRyYWNlcG9pbnQgLiR0ZHA2IiB7CisJc2V0IGxpbmVjb3VudDYgW2V4cHIgJGxpbmVjb3VudDYgKyAxXQorCWV4cF9jb250aW51ZQorICAgIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCWlmIHsgKCRsaW5lY291bnQxIDwgNCkgfHwgKCRsaW5lY291bnQyIDwgNCkgfHwgKCRsaW5lY291bnQzIDwgNCkgfHwgKCRsaW5lY291bnQ0IDwgNCkgfHwgKCRsaW5lY291bnQ1IDwgNCkgfHwgKCRsaW5lY291bnQ2IDwgNCkgfSB7CisJICAgIGZhaWwgIjEyLjE6IHRyYWNlIHJlcG9ydCAjMSIKKwl9IGVsc2UgeworCSAgICBwYXNzICIxMi4xOiB0cmFjZSByZXBvcnQgIzEiCisJfQorICAgIH0KKyAgICB0aW1lb3V0IHsKKwlmYWlsICIxMi4xOiB0cmFjZSByZXBvcnQgIzEgKHRpbWVvdXQpIgorICAgIH0KK30KKworZ2RiX3RmaW5kX3Rlc3QgIjEyLjI6IGZpbmQgZmlyc3QgVERQICMyIGZyYW1lIiAidHJhY2Vwb2ludCAkdGRwMiIgXAorCSJcJHRyYWNlcG9pbnQiICIkdGRwMiIKKworc2V0IGxpbmVjb3VudDIgMAorCitzZW5kX2dkYiAid2hpbGUgXCR0cmFjZV9mcmFtZSAhPSAtMVxuIHByaW50ZiBcInRyYWNlcG9pbnQgI1wlZCwgRlAgMHhcJTA4eCwgU1AgMHhcJTA4eCwgUEMgMHglMDh4XFxuXCIsIFwkdHJhY2Vwb2ludCwgXCRmcCwgXCRzcCwgXCRwY1xuIHRmaW5kIHRyYWNlcG9pbnRcbiBlbmRcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAidHJhY2Vwb2ludCAjJHRkcDIsIEZQICRoZXgsIFNQICRoZXgsIFBDICRoZXgiIHsKKwlzZXQgbGluZWNvdW50MiBbZXhwciAkbGluZWNvdW50MiArIDFdCisJZXhwX2NvbnRpbnVlCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJaWYgeyAoJGxpbmVjb3VudDIgPCA0KSB9IHsKKwkgICAgZmFpbCAiMTIuMjogdHJhY2UgcmVwb3J0ICMyIgorCX0gZWxzZSB7CisJICAgIHBhc3MgIjEyLjI6IHRyYWNlIHJlcG9ydCAjMiIKKwl9CisgICAgfQorICAgIHRpbWVvdXQgeworCWZhaWwgIjEyLjI6IHRyYWNlIHJlcG9ydCAjMiAodGltZW91dCkiCisgICAgfQorfQorCitnZGJfdGZpbmRfdGVzdCAiMTIuMzogZmluZCBmaXJzdCBURFAgIzMgZnJhbWUiICJ0cmFjZXBvaW50ICR0ZHAzIiBcCisJIlwkdHJhY2Vwb2ludCIgIiR0ZHAzIgorCitzZXQgbGluZWNvdW50MyAwCisKK3NlbmRfZ2RiICJ3aGlsZSBcJHRyYWNlX2ZyYW1lICE9IC0xXG4gcHJpbnRmIFwiVERQICNcJWQsIGZyYW1lIFwlZDogZGVwdGggPSBcJWQsIHExID0gXCVkXFxuXCIsIFwkdHJhY2Vwb2ludCwgXCR0cmFjZV9mcmFtZSwgZGVwdGgsIHExXG4gdGZpbmQgdHJhY2Vwb2ludFxuIGVuZFxuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJURFAgIyR0ZHAzLCBmcmFtZSAkZGVjaW1hbDogZGVwdGggPSAkZGVjaW1hbCwgcTEgPSAkZGVjaW1hbCIgeworCXNldCBsaW5lY291bnQzIFtleHByICRsaW5lY291bnQzICsgMV0KKwlleHBfY29udGludWUKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwlpZiB7ICgkbGluZWNvdW50MyA8IDQpIH0geworCSAgICBmYWlsICIxMi4zOiB0cmFjZSByZXBvcnQgIzMiCisJfSBlbHNlIHsKKwkgICAgcGFzcyAiMTIuMzogdHJhY2UgcmVwb3J0ICMzIgorCX0KKyAgICB9CisgICAgdGltZW91dCB7CisJZmFpbCAiMTIuMzogdHJhY2UgcmVwb3J0ICMzICh0aW1lb3V0KSIKKyAgICB9Cit9CisKK2dkYl90ZmluZF90ZXN0ICIxMi40OiBmaW5kIGZpcnN0IFREUCAjNiBmcmFtZSIgInRyYWNlcG9pbnQgJHRkcDYiIFwKKwkiXCR0cmFjZXBvaW50IiAiJHRkcDYiCisKK3NldCBsaW5lY291bnQ2IDAKKworc2VuZF9nZGIgIndoaWxlIFwkdHJhY2VfZnJhbWUgIT0gLTFcbiBwcmludGYgXCJURFAgI1wlZCwgZnJhbWUgJWQ6IGNoYXJfdGVzdCA9IFwlZCwgbG9uZ190ZXN0ID0gXCVkXFxuXCIsIFwkdHJhY2Vwb2ludCwgXCR0cmFjZV9mcmFtZSwgZ2RiX2NoYXJfdGVzdCwgZ2RiX2xvbmdfdGVzdFxuIHRmaW5kIHRyYWNlcG9pbnRcbiBlbmRcbiIKK2dkYl9leHBlY3QgeworICAgIC1yZSAiVERQICMkdGRwNiwgZnJhbWUgJGRlY2ltYWw6IGNoYXJfdGVzdCA9ICRhcmcxLCBsb25nX3Rlc3QgPSAkYXJnMyIgeworCXNldCBsaW5lY291bnQ2IFtleHByICRsaW5lY291bnQ2ICsgMV0KKwlleHBfY29udGludWUKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwlpZiB7ICgkbGluZWNvdW50NiA8IDQpIH0geworCSAgICBmYWlsICIxMi40OiB0cmFjZSByZXBvcnQgIzQiCisJfSBlbHNlIHsKKwkgICAgcGFzcyAiMTIuNDogdHJhY2UgcmVwb3J0ICM0IgorCX0KKyAgICB9CisgICAgdGltZW91dCB7CisJZmFpbCAiMTIuNDogdHJhY2UgcmVwb3J0ICM0ICh0aW1lb3V0KSIKKyAgICB9Cit9CisKKyMgRmluaXNoZWQhCitnZGJfdGZpbmRfdGVzdCAiZmluaXNoZWQ6IG1ha2Ugc3VyZSBub3QgZGVidWdnaW5nIGFueSB0cmFjZSBmcmFtZSIgIm5vbmUiICItMSIKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL3NhdmUtdHJhY2UuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2Uvc2F2ZS10cmFjZS5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmOTg5MAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL3NhdmUtdHJhY2UuZXhwCkBAIC0wLDAgKzEsMTcxIEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgTWljaGFlbCBTbnlkZXIgKG1zbnlkZXJAY3lnbnVzLmNvbSkKKworbG9hZF9saWIgInRyYWNlLXN1cHBvcnQuZXhwIjsKKworaWYgJHRyYWNlbGV2ZWwgdGhlbiB7CisgICAgc3RyYWNlICR0cmFjZWxldmVsCit9CisKK3NldCBwcm1zX2lkIDAKK3NldCBidWdfaWQgMAorCitnZGJfZXhpdAorZ2RiX3N0YXJ0CisKK2lmIFtpc3RhcmdldCAibTY4ay0qLWVsZiJdIHRoZW4geworICAgIHNldCBzcmNmaWxlIGdkYl9jX3Rlc3QuYworICAgIHNldCBiaW5maWxlIFtib2FyZF9pbmZvIHRhcmdldCBkNDkwX2JpbmZpbGVdOworfSBlbHNlIHsKKyAgICBzZXQgdGVzdGZpbGUgImFjdGlvbnMiCisgICAgc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworICAgIHNldCBiaW5maWxlICRvYmpkaXIvJHN1YmRpci8kdGVzdGZpbGUKKyAgICBpZiB7IFtnZGJfY29tcGlsZSAiJHNyY2Rpci8kc3ViZGlyLyRzcmNmaWxlIiAkYmluZmlsZSBcCisJICAgIGV4ZWN1dGFibGUge2RlYnVnIGFkZGl0aW9uYWxfZmxhZ3M9LXd9XSAhPSAiIiB9IHsKKwlnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKKyAgICB9Cit9CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKworIyBJZiB0ZXN0aW5nIG9uIGEgcmVtb3RlIGhvc3QsIGRvd25sb2FkIHRoZSBzb3VyY2UgZmlsZS4KKyMgcmVtb3RlX2Rvd25sb2FkIGhvc3QgJHNyY2Rpci8kc3ViZGlyLyRzcmNmaWxlCisKK2dkYl9maWxlX2NtZCAkYmluZmlsZQorCisjIGRlZmluZSByZWxhdGl2ZSBzb3VyY2UgbGluZSBudW1iZXJzOgorIyBhbGwgc3Vic2VxdWVudCBsaW5lIG51bWJlcnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgZmlyc3Qgb25lIChiYXNlbGluZSkKK3NldCBiYXNlbGluZSAgW2dkYl9maW5kX3JlY3Vyc2lvbl90ZXN0X2Jhc2VsaW5lICRzcmNmaWxlXTsKK2lmIHsgJGJhc2VsaW5lID09IC0xIH0gdGhlbiB7CisgICAgZmFpbCAiQ291bGQgbm90IGZpbmQgZ2RiX3JlY3Vyc2lvbl90ZXN0IGZ1bmN0aW9uIgorICAgIHJldHVybjsKK30KKworc2V0IHRlc3RsaW5lMSBbZXhwciAkYmFzZWxpbmUgKyA0XQorc2V0IHRlc3RsaW5lMiBbZXhwciAkYmFzZWxpbmUgKyA1XQorc2V0IHRlc3RsaW5lMyBbZXhwciAkYmFzZWxpbmUgKyA2XQorc2V0IHRlc3RsaW5lNCBbZXhwciAkYmFzZWxpbmUgKyA3XQorc2V0IHRlc3RsaW5lNSBbZXhwciAkYmFzZWxpbmUgKyA4XQorc2V0IHRlc3RsaW5lNiBbZXhwciAkYmFzZWxpbmUgKyA5XQorCisjCisjIHRlc3Qgc2F2ZS10cmFjZSBjb21tYW5kCisjCisKKyMgc2V0dXAgYSBzZXQgb2YgdHJhY2Vwb2ludHMgdG8gc2F2ZQorCitnZGJfZGVsZXRlX3RyYWNlcG9pbnRzCisKK2ZvcmVhY2ggeCB7IDEgMiAzIDQgNSA2IH0geworICAgIHNldCB0ZXN0bGluZSBbZXhwciBcJHRlc3RsaW5lJHhdOworICAgIHNldCB0cmNwdCBbZ2RiX2dldHRwbnVtICR0ZXN0bGluZV07CisgICAgc2V0IHRyY3B0JHggJHRyY3B0OworICAgIGdkYl90ZXN0ICJwYXNzY291bnQgJHgiIFwKKwkgICAgICJTZXR0aW5nIHRyYWNlcG9pbnQgJHRyY3B0LiogdG8gJHgiIFwKKwkgICAgICIxMC54OiBzZXQgcGFzc2NvdW50IGZvciB0cmFjZXBvaW50ICR0cmNwdCIKKworICAgIGdkYl90cmFjZV9zZXRhY3Rpb25zICIxMC54OiBzZXQgYWN0aW9ucyBmb3IgdHJhY2Vwb2ludCAkeCIgXAorCSAgICAiIiBcCisJICAgICJjb2xsZWN0IHEkeCIgIl4kIiBcCisJICAgICJ3aGlsZS1zdGVwcGluZyAkeCIgIl4kIiBcCisJICAgICJjb2xsZWN0IHEkeCIgIl4kIiBcCisJICAgICJlbmQiICJeJCIKK30KKworCitwcm9jIGdkYl92ZXJpZnlfdHJhY2Vwb2ludHMgeyB0ZXN0bmFtZSB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdDsKKworICAgIHNldCB3cyAiXFtcdCBcXSsiCisgICAgc2V0IG5sICJcW1xyXG5cXSsiCisgICAgc2V0IG91cnN0YXRlIDE7CisgICAgc2V0IHJlc3VsdCAicGFzcyI7CisgICAgc2VuZF9nZGIgImluZm8gdHJhY2Vwb2ludHNcbiI7CisgICAgZ2RiX2V4cGVjdCAxMCB7CisJLXJlICJ5XFtcdCBcXSsweFxbMC05YS1mQS1GXF0rXFtcdCBcXSsoXFswLTlcXSspXFtcdCBcXSsoXFswLTlcXSspXFtcdCBcXStpbiBnZGJfcmVjdXJzaW9uX3Rlc3RcW15cclxuXF0rIiB7CisJICAgIGlmIHsgJGV4cGVjdF9vdXQoMSxzdHJpbmcpICE9ICRleHBlY3Rfb3V0KDIsc3RyaW5nKSB9IHsKKwkJI3NldCByZXN1bHQgImZhaWwiOworCSAgICB9CisJICAgIGlmIHsgJGV4cGVjdF9vdXQoMSxzdHJpbmcpICE9ICRvdXJzdGF0ZSB9IHsKKwkJc2V0IHJlc3VsdCAiZmFpbCI7CisJICAgIH0KKwkgICAgaW5jciBvdXJzdGF0ZTsKKwkgICAgZXhwX2NvbnRpbnVlOworCX0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgaWYgeyAkb3Vyc3RhdGUgPj0gNiB9IHsKKwkJc2V0IHJlc3VsdCAicGFzcyI7CisJICAgIH0gZWxzZSB7CisJCXNldCByZXN1bHQgImZhaWwiOworCSAgICB9CisJfQorCWRlZmF1bHQgeworCSAgICBzZXQgcmVzdWx0ICJmYWlsIjsKKwl9CisgICAgfQorICAgICRyZXN1bHQgJHRlc3RuYW1lOworICAgIHJldHVybiAkcmVzdWx0OworfQorCitnZGJfdmVyaWZ5X3RyYWNlcG9pbnRzICIxMC54OiB2ZXJpZnkgdHJhY2Ugc2V0dXAiOworCisjIDEwLjEgU2F2ZSBjdXJyZW50IHRyYWNlcG9pbnQgZGVmaW5pdGlvbnMgdG8gYSBmaWxlCisKK3JlbW90ZV9maWxlIGhvc3QgZGVsZXRlIHNhdmV0cmFjZS50cgorZ2RiX3Rlc3QgInNhdmUtdHJhY2Vwb2ludHMgc2F2ZXRyYWNlLnRyIiBcCisJIlRyYWNlcG9pbnRzIHNhdmVkIHRvIGZpbGUgJ3NhdmV0cmFjZS50cicuIiBcCisJIjEwLjE6IHNhdmUgdHJhY2Vwb2ludCBkZWZpbml0aW9ucyIKKworIyAxMC4yIFJlYWQgYmFjayB0cmFjZXBvaW50IGRlZmluaXRpb25zCisKK2dkYl9kZWxldGVfdHJhY2Vwb2ludHMKK2dkYl90ZXN0ICJpbmZvIHRyYWNlcG9pbnRzIiAiTm8gdHJhY2Vwb2ludHMuIiAiMTAuMjogZGVsZXRlIHRyYWNlcG9pbnRzIgorZ2RiX3Rlc3QgInNvdXJjZSBzYXZldHJhY2UudHIiIFwKKwkiVHJhY2Vwb2ludCBcWzAtOVxdKyBhdCAuKiIgXAorCSIxMC4yOiByZWFkIGJhY2sgc2F2ZWQgdHJhY2Vwb2ludHMiCitnZGJfdmVyaWZ5X3RyYWNlcG9pbnRzICIxMC4yOiB2ZXJpZnkgcmVjb3ZlcmVkIHRyYWNlcG9pbnRzIjsKK3JlbW90ZV9maWxlIGhvc3QgZGVsZXRlIHNhdmV0cmFjZS50cgorCisjIDEwLjMgcmVwZWF0IHdpdGggYSBwYXRoIHRvIHRoZSBmaWxlCisKK3JlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRvYmpkaXIvc2F2ZXRyYWNlLnRyCitnZGJfdGVzdCAic2F2ZS10cmFjZXBvaW50cyAkb2JqZGlyL3NhdmV0cmFjZS50ciIgXAorCSJUcmFjZXBvaW50cyBzYXZlZCB0byBmaWxlICckb2JqZGlyL3NhdmV0cmFjZS50cicuIiBcCisJIjEwLjM6IHNhdmUgdHJhY2Vwb2ludCBkZWZpbml0aW9ucywgZnVsbCBwYXRoIgorCitnZGJfZGVsZXRlX3RyYWNlcG9pbnRzCitnZGJfdGVzdCAiaW5mbyB0cmFjZXBvaW50cyIgIk5vIHRyYWNlcG9pbnRzLiIgIjEwLjM6IGRlbGV0ZSB0cmFjZXBvaW50cyIKK2dkYl90ZXN0ICJzb3VyY2UgJG9iamRpci9zYXZldHJhY2UudHIiIFwKKwkiVHJhY2Vwb2ludCBcWzAtOVxdKyBhdCAuKiIgXAorCSIxMC40OiByZWFkIHNhdmVkIHRyYWNlcG9pbnRzLCBmdWxsIHBhdGgiCitnZGJfdmVyaWZ5X3RyYWNlcG9pbnRzICIxMC4zOiB2ZXJpZnkgcmVjb3ZlcmVkIHRyYWNlcG9pbnRzLCBmdWxsIHBhdGgiOworcmVtb3RlX2ZpbGUgaG9zdCBkZWxldGUgJG9iamRpci9zYXZldHJhY2UudHIKKworIyAxMC41IGludmFsaWQgZmlsZW5hbWUKKyMgICAgICBbZGVmZXJyZWQgLS0gbm90IHN1cmUgd2hhdCBhIGdvb2QgaW52YWxpZCBmaWxlbmFtZSB3b3VsZCBiZV0KKworIyAxMC42IHNhdmUtdHJhY2UgKGZpbGUgYWxyZWFkeSBleGlzdHMpCisjICAgICAgW2V4cGVjdCBpdCB0byBjbG9iYmVyIHRoZSBvbGQgb25lXQorCisjIDEwLjcgaGVscCBzYXZlLXRyYWNlcG9pbnRzCisKK2dkYl90ZXN0ICJoZWxwIHNhdmUtdHJhY2Vwb2ludHMiIFwKKwkiU2F2ZSBjdXJyZW50IHRyYWNlcG9pbnQgZGVmaW5pdGlvbnMgYXMgYSBzY3JpcHQuKiIgXAorCSIxMC43OiBoZWxwIHNhdmUtdHJhY2Vwb2ludHMiCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS90ZmluZC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS90ZmluZC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwMTg1MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL3RmaW5kLmV4cApAQCAtMCwwICsxLDQwNSBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IE1pY2hhZWwgU255ZGVyIChtc255ZGVyQGN5Z251cy5jb20pCisKK2xvYWRfbGliICJ0cmFjZS1zdXBwb3J0LmV4cCI7CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorCitpZiBbaXN0YXJnZXQgIm02OGstKi1lbGYiXSB0aGVuIHsKKyAgICBsb2FkX2xpYiAiZW1jLXN1cHBvcnQuZXhwIjsKKyAgICBzZXQgc3JjZmlsZSBnZGJfY190ZXN0LmMKKyAgICBzZXQgYmluZmlsZSBbYm9hcmRfaW5mbyB0YXJnZXQgZDQ5MF9iaW5maWxlXTsKKyAgICBnZGJfdGVzdCAic2V0IHJlbW90ZXRpbWVvdXQgNiIgIiIgIiIKKyAgICBzZXQgdGltZW91dCA1MDAKKyAgICBnZGJfdGFyZ2V0X21vbml0b3IgJGJpbmZpbGUKKyAgICAjIEdpdmUgYSBUU1RPUCBhbmQgaWdub3JlIGVycm9ycywgdG8gbWFrZSBzdXJlIGFueSBwcmV2aW91cyB0cmFjZSBpcyBvZmYKKyAgICBnZGJfdGVzdCAidHN0b3AiICIiICIiCisgICAgZ2RiX3Rlc3QgInRmaW5kIG5vbmUiICIiICIiCisgICAgc2VuZF9nZGIgImNvbXBhcmUtc2VjdGlvbnMgQ1NcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIk1JUy1NQVRDSEVELiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiU3ltYm9sIGZpbGUgZG9lcyBub3QgbWF0Y2ggdGFyZ2V0IQorCSAgICBhbGwgdGVzdHMgaW4gdGhpcyBtb2R1bGUgd2lsbCBmYWlsLiI7CisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IH0KKyAgICB9Cit9IGVsc2UgeworICAgIHNldCB0ZXN0ZmlsZSAiYWN0aW9ucyIKKyAgICBzZXQgc3JjZmlsZSAke3Rlc3RmaWxlfS5jCisgICAgc2V0IGJpbmZpbGUgJG9iamRpci8kc3ViZGlyLyR0ZXN0ZmlsZQorICAgIGlmIHsgW2dkYl9jb21waWxlICIkc3JjZGlyLyRzdWJkaXIvJHNyY2ZpbGUiICIkYmluZmlsZSAtTzEiIFwKKwkgICAgZXhlY3V0YWJsZSB7ZGVidWcgYWRkaXRpb25hbF9mbGFncz0td31dICE9ICIiIH0geworCWdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiVGVzdGNhc2UgY29tcGlsZSBmYWlsZWQsIHNvIGFsbCB0ZXN0cyBpbiB0aGlzIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGZhaWwuIgorICAgIH0KKyAgICBnZGJfbG9hZCAkYmluZmlsZQorICAgIGdkYl90ZXN0ICJ0c3RvcCIgICAgICAgIiIgIiIKKyAgICBnZGJfdGVzdCAidGZpbmQgbm9uZSIgICIiICIiCisgICAgcnVudG9fbWFpbgorfQorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisKKyMgV2UgZ2VuZXJvdXNseSBnaXZlIG91cnNlbHZlcyBvbmUgInBhc3MiIGlmIHdlIHN1Y2Nlc3NmdWxseSAKKyMgZGV0ZWN0IHRoYXQgdGhpcyB0ZXN0IGNhbm5vdCBiZSBydW4gb24gdGhpcyB0YXJnZXQhCitpZiB7ICFbZ2RiX3RhcmdldF9zdXBwb3J0c190cmFjZV0gfSB0aGVuIHsKKyAgICBwYXNzICJDdXJyZW50IHRhcmdldCBkb2VzIG5vdCBzdXBwb3JzdCB0cmFjZSIKKyAgICByZXR1cm4gMTsKKworfQorCisjIElmIHRlc3Rpbmcgb24gYSByZW1vdGUgaG9zdCwgZG93bmxvYWQgdGhlIHNvdXJjZSBmaWxlLgorIyByZW1vdGVfZG93bmxvYWQgaG9zdCAkc3JjZGlyLyRzdWJkaXIvJHNyY2ZpbGUKKworIyBkZWZpbmUgcmVsYXRpdmUgc291cmNlIGxpbmUgbnVtYmVyczoKKyMgYWxsIHN1YnNlcXVlbnQgbGluZSBudW1iZXJzIGFyZSByZWxhdGl2ZSB0byB0aGlzIGZpcnN0IG9uZSAoYmFzZWxpbmUpCitzZXQgYmFzZWxpbmUgIFtnZGJfZmluZF9yZWN1cnNpb25fdGVzdF9iYXNlbGluZSAkc3JjZmlsZV07CitpZiB7ICRiYXNlbGluZSA9PSAtMSB9IHRoZW4geworICAgIGZhaWwgIkNvdWxkIG5vdCBmaW5kIGdkYl9yZWN1cnNpb25fdGVzdCBmdW5jdGlvbiIKKyAgICByZXR1cm47Cit9CisKK3NldCB0ZXN0bGluZTEgW2V4cHIgJGJhc2VsaW5lICsgMV0KK3NldCB0ZXN0bGluZTIgW2V4cHIgJGJhc2VsaW5lICsgNV0KK3NldCB0ZXN0bGluZTMgW2V4cHIgJGJhc2VsaW5lICsgNl0KK3NldCB0ZXN0bGluZTQgW2V4cHIgJGJhc2VsaW5lICsgN10KK3NldCB0ZXN0bGluZTUgW2V4cHIgJGJhc2VsaW5lICsgOF0KKworIworIyB0ZXN0IHRmaW5kIGNvbW1hbmQKKyMKKworZ2RiX2RlbGV0ZV90cmFjZXBvaW50cworc2V0IHRkcDEgW2dkYl9nZXR0cG51bSAiXCpnZGJfcmVjdXJzaW9uX3Rlc3QiXQorc2V0IHRkcDIgW2dkYl9nZXR0cG51bSAkdGVzdGxpbmUyXQorc2V0IHRkcDMgW2dkYl9nZXR0cG51bSAkdGVzdGxpbmUzXQorc2V0IHRkcDQgW2dkYl9nZXR0cG51bSAkdGVzdGxpbmU0XQorc2V0IHRkcDUgW2dkYl9nZXR0cG51bSAkdGVzdGxpbmU1XQoraWYgeyAkdGRwMSA8PSAwIHx8ICR0ZHAyIDw9IDAgfHwgJHRkcDMgPD0gMCB8fCBcCisgICAgICR0ZHA0IDw9IDAgfHwgJHRkcDUgPD0gMCB9IHRoZW4geworICAgIGZhaWwgInNldHRpbmcgdHJhY2Vwb2ludHMiCisgICAgcmV0dXJuOworfQorCisjIDYuMSB0ZXN0IHRzdGFydCBjb21tYW5kCitzZW5kX2dkYiAidHN0YXJ0XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIlRyYWNlIGNhbiBvbmx5IGJlIHJ1biBvbiByZW1vdGUgdGFyZ2V0cy4qJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgIjYuMTogdHN0YXJ0IChub3QgY29ubmVjdGVkIHRvIHJlbW90ZT8pIgorCXJldHVybjsKKyAgICB9CisgICAgLXJlICJUYXJnZXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGNvbW1hbmQuKiRnZGJfcHJvbXB0ICQiIHsKKwlmYWlsICI2LjE6IHRzdGFydCAoY29ubmVjdGVkIHRvIHdyb25nIHRhcmdldD8pIgorCXJldHVybjsKKyAgICB9CisgICAgLXJlICJUYXJnZXQgcmV0dXJucyBlcnJvciBjb2RlLiokZ2RiX3Byb21wdCAkIiB7CisJZmFpbCAiNi4xOiB0c3RhcnQgKGNvbm5lY3RlZCB0byB3cm9uZyB0YXJnZXQ/KSIKKwlyZXR1cm47CisgICAgfQorICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeworCXBhc3MgIjYuMTogdHN0YXJ0IgorICAgIH0KKyAgICBkZWZhdWx0IHsKKwlmYWlsICI2LjE6IHRzdGFydCAoZGVmYXVsdCkiCisJcmV0dXJuOworICAgIH0KK30KKworIyB0ZXN0IHRzdGF0dXMgKHdoZW4gdHJhY2Ugb24pCitnZGJfdGVzdCAidHN0YXR1cyIgIlxbVHRcXXJhY2UgaXMgcnVubmluZy4qIiAidGVzdCB0c3RhdHVzIG9uIgorCisjIDYuMiB0ZXN0IGhlbHAgdHN0YXJ0CitnZGJfdGVzdCAiaGVscCB0c3RhcnQiICJTdGFydCB0cmFjZSBkYXRhIGNvbGxlY3Rpb24uIiAiNi4yOiBoZWxwIHRzdGFydCIKKworaWYgW2lzdGFyZ2V0ICJtNjhrLSotZWxmIl0gdGhlbiB7CisgICAgZ2RiX2VtY2xhcHRvcF9jb21tYW5kICI4NSwxLDIsMyw0LDUsNiIKKyAgICBzbGVlcCA1CisgICAgCisgICAgZ2RiX2VtY2xhcHRvcF9jb21tYW5kICI4NSw3LDgsOSxBLEIsQyIKKyAgICBzbGVlcCA1Cit9IGVsc2UgeworICAgIGdkYl90ZXN0ICJicmVhayBlbmQiICIiICIiCisgICAgZ2RiX3Rlc3QgImNvbnRpbnVlIiBcCisJICAgICJDb250aW51aW5nLipCcmVha3BvaW50ICRkZWNpbWFsLCBlbmQuKiIgXAorCSAgICAicnVuIHRyYWNlIGV4cGVyaW1lbnQiCit9CisKKyMgNy4xIHRlc3QgdHN0b3AgY29tbWFuZAorc2VuZF9nZGIgInRzdG9wXG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIlRyYWNlIGNhbiBvbmx5IGJlIHJ1biBvbiByZW1vdGUgdGFyZ2V0cy4qJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgIjcuMTogdHN0b3AgKG5vdCBjb25uZWN0ZWQgdG8gcmVtb3RlPykiCisJcmV0dXJuOworICAgIH0KKyAgICAtcmUgIlRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgY29tbWFuZC4qJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgIjcuMTogdHN0b3AgKGNvbm5lY3RlZCB0byB3cm9uZyB0YXJnZXQ/KSIKKwlyZXR1cm47CisgICAgfQorICAgIC1yZSAiVGFyZ2V0IHJldHVybnMgZXJyb3IgY29kZS4qJGdkYl9wcm9tcHQgJCIgeworCWZhaWwgIjcuMTogdHN0b3AgKGNvbm5lY3RlZCB0byB3cm9uZyB0YXJnZXQ/KSIKKwlyZXR1cm47CisgICAgfQorICAgIC1yZSAiJGdkYl9wcm9tcHQgJCIgeworCXBhc3MgIjcuMTogdHN0b3AiCisgICAgfQorICAgIGRlZmF1bHQgeworCWZhaWwgIjcuMTogdHN0b3AgKGRlZmF1bHQpIgorCXJldHVybjsKKyAgICB9Cit9CisKKyMgNy4yIHRlc3QgaGVscCB0c3RvcAorZ2RiX3Rlc3QgImhlbHAgdHN0b3AiICJTdG9wIHRyYWNlIGRhdGEgY29sbGVjdGlvbi4iICI3LjI6IGhlbHAgdHN0b3AiCisKKyMgdGVzdCB0c3RhdHVzICh3aGVuIHRyYWNlIG9mZikKK2dkYl90ZXN0ICJ0c3RhdHVzIiAiXFtUdFxdcmFjZS4qIG5vdCBydW5uaW5nLioiICJ0ZXN0IHRzdGF0dXMgb2ZmIgorCisjIyByZWNvcmQgc3RhcnRpbmcgUEMKK3NldCBzYXZlX3BjIFtnZGJfcmVhZGV4cHIgIih1bnNpZ25lZCBsb25nKSBcJHBjIl07CitpZiB7ICRzYXZlX3BjID09IC0xIH0gdGhlbiB7CisgICAgZmFpbCAiY291bGQgbm90IHJlYWQgUEMiCisgICAgcmV0dXJuOworfQorCisjIDguNyAgdGZpbmQgc3RhcnQKKyMjIGNoZWNrICR0cmFjZV9mcmFtZSA9PSAwCitnZGJfdGZpbmRfdGVzdCAiOC43OiB0ZmluZCBzdGFydCBjb21tYW5kIiAic3RhcnQiICIwIjsKKyMjIGNoZWNrICRwYyAhPSBzdGFydFBDCitnZGJfdGVzdCAicHJpbnRmIFwieCBcJWQgeFxcblwiLCBcJHBjICE9ICRzYXZlX3BjIiBcCisJInggMSB4IiBcCisJIjguN2I6IHRmaW5kIHN0YXJ0IgorCisjIDguOCAgdGZpbmQgbm9uZQorIyMgY2hlY2sgJHRyYWNlX2ZyYW1lID09IC0xCitnZGJfdGZpbmRfdGVzdCAiOC44OiB0ZmluZCBub25lIiAibm9uZSIgIi0xIjsKKyMjIGNoZWNrICRwYyA9PSBzdGFydFBDCitnZGJfdGVzdCAicHJpbnRmIFwieCBcJWQgeFxcblwiLCBcJHBjID09ICRzYXZlX3BjIiBcCisJInggMSB4IiBcCisJIjguOGI6IHRmaW5kIG5vbmUgKHJlc3RvcmVzIG5vbi10cmFjZSBQQykiCisKKyMgOC45ICB0ZmluZCBlbmQKKyMjIGNoZWNrICR0cmFjZV9mcmFtZSA9PSAtMQorZ2RiX3RmaW5kX3Rlc3QgIjguOTogdGZpbmQgZW5kLCBzZWxlY3RzIG5vIGZyYW1lIiAiZW5kIiAiLTEiOworIyMgY2hlY2sgJHBjID09IHN0YXJ0UEMKK2dkYl90ZXN0ICJwcmludGYgXCJ4IFwlZCB4XFxuXCIsIFwkcGMgPT0gJHNhdmVfcGMiIFwKKwkieCAxIHgiIFwKKwkiOC45YjogdGZpbmQgZW5kIChyZXN0b3JlcyBub24tdHJhY2luZyBQQykiCisKKyMgOC4xICB0ZmluZCBuCisjIyBjaGVjayAkdHJhY2VfZnJhbWUgPT0gbgorZ2RiX3RmaW5kX3Rlc3QgIjguMTogdGZpbmQgMSIgIjEiICIxIgorIyMgY2hlY2sgJHRyYWNlX2xpbmUgY29ycmVzcG9uZHMgdG8gdHJhY2Vwb2ludCBmb3IgZnJhbWUgbgorZ2RiX3Rlc3QgInByaW50IFwkdHJhY2VfbGluZSIgIiR0ZXN0bGluZTIiICI4LjFiOiB0ZmluZCAxIChjb3JyZWN0IGxpbmUpIgorCisjIDguMjggdGZpbmQgaW52YWxpZCBuIChiaWcgbnVtYmVyKQorIyMgY2hlY2sgIm5vdCBmb3VuZCIgZXJyb3IKKyMjIGNoZWNrICR0cmFjZV9mcmFtZSAhPSBuCitnZGJfdGVzdCAidGZpbmQgMzI3NjciIFwKKwkiZmFpbGVkIHRvIGZpbmQuKiIgXAorCSI4LjI4OiB0ZmluZCA8bj4gY29tbWFuZCByZWplY3RzIGludmFsaWQgZnJhbWUgbnVtYmVyIgorCitnZGJfdGVzdCAicHJpbnRmIFwieCBcJWQgeFxcblwiLCBcJHRyYWNlX2ZyYW1lID09IDMyNzY3IiBcCisJInggMCB4IiBcCisJIjguMjg6IHRmaW5kIDxuPiByZWplY3RlZCBiYWQgaW5wdXQgKDMyNzY3KSIKKworIyA4LjMxIHRmaW5kIG5lZ2F0aXZlIG4KKyMjIGNoZWNrIGVycm9yCitnZGJfdGVzdCAidGZpbmQgLTMiICJpbnZhbGlkIGlucHV0LioiICI4LjMxOiB0ZmluZCA8bj4gcmVqZWN0cyBuZWdhdGl2ZSBpbnB1dCIKKyMjIGNoZWNrICR0cmFjZV9mcmFtZSAhPSAtbgorZ2RiX3Rlc3QgInByaW50ZiBcInggXCVkIHhcXG5cIiwgXCR0cmFjZV9mcmFtZSA9PSAtMyIgInggMCB4IiBcCisJIjguMzE6IHRmaW5kIDxuPiByZWplY3RlZCBuZWdhdGl2ZSBpbnB1dCAoLTMpIgorCisjIDguMTAgdGZpbmQgPG5vIGFyZz4KKyMjIGNoZWNrICR0cmFjZV9mcmFtZSArPSAxCisKK2dkYl90ZmluZF90ZXN0ICI4LjEwOiB0ZmluZCBzdGFydCIgInN0YXJ0IiAiMCI7CitnZGJfdGVzdCAicHJpbnQgXCR0cmFjZV9saW5lIiAiJGJhc2VsaW5lIiAgXAorCSI4LjEwOiB0ZmluZCAwIChjb3JyZWN0IGxpbmUgJGJhc2VsaW5lKSIKK2dkYl90ZmluZF90ZXN0ICI4LjEwOiB0ZmluZCBub2FyZ3VtZW50IDEiICIiICIxIjsKK2dkYl90ZXN0ICJwcmludCBcJHRyYWNlX2xpbmUiICIkdGVzdGxpbmUyIiBcCisJIjguMTA6IHRmaW5kIDEgKGNvcnJlY3QgbGluZSAkdGVzdGxpbmUyKSIKK2dkYl90ZmluZF90ZXN0ICI4LjEwOiB0ZmluZCBub2FyZ3VtZW50IDIiICIiICIyIjsKK2dkYl90ZXN0ICJwcmludCBcJHRyYWNlX2xpbmUiICIkdGVzdGxpbmUzIiBcCisJIjguMTA6IHRmaW5kIDIgKGNvcnJlY3QgbGluZSAkdGVzdGxpbmUzKSIKK2dkYl90ZmluZF90ZXN0ICI4LjEwOiB0ZmluZCBub2FyZ3VtZW50IDMiICIiICIzIjsKK2dkYl90ZXN0ICJwcmludCBcJHRyYWNlX2xpbmUiICIkdGVzdGxpbmU0IiBcCisJIjguMTA6IHRmaW5kIDMgKGNvcnJlY3QgbGluZSAkdGVzdGxpbmU0KSIKKworZ2RiX3RmaW5kX3Rlc3QgIjguMTE6IHRmaW5kIDMiICIzIiAiMyI7CitnZGJfdGVzdCAicHJpbnQgXCR0cmFjZV9saW5lIiAiJHRlc3RsaW5lNCIgXAorCSI4LjExOiB0ZmluZCAzIChjb3JyZWN0IGxpbmUgJHRlc3RsaW5lNCkiCitnZGJfdGZpbmRfdGVzdCAiOC4xMTogdGZpbmQgYmFja3dhcmQgMiIgIi0iICIyIjsKK2dkYl90ZXN0ICJwcmludCBcJHRyYWNlX2xpbmUiICIkdGVzdGxpbmUzIiBcCisJIjguMTE6IHRmaW5kIDIgKGNvcnJlY3QgbGluZSAkdGVzdGxpbmUzKSIKK2dkYl90ZmluZF90ZXN0ICI4LjExOiB0ZmluZCBiYWNrd2FyZCAxIiAiLSIgIjEiOworZ2RiX3Rlc3QgInByaW50IFwkdHJhY2VfbGluZSIgIiR0ZXN0bGluZTIiIFwKKwkiOC4xMTogdGZpbmQgMSAoY29ycmVjdCBsaW5lICR0ZXN0bGluZTIpIgorZ2RiX3RmaW5kX3Rlc3QgIjguMTE6IHRmaW5kIGJhY2t3YXJkIDAiICItIiAiMCI7CitnZGJfdGVzdCAicHJpbnQgXCR0cmFjZV9saW5lIiAiJGJhc2VsaW5lIiAgXAorCSI4LjExOiB0ZmluZCAwIChjb3JyZWN0IGxpbmUgJGJhc2VsaW5lKSIKKworZ2RiX3RmaW5kX3Rlc3QgIjguMTI6IHRmaW5kIG5vbmUiICJub25lIiAiLTEiOworZ2RiX3RmaW5kX3Rlc3QgIjguMTI6IHRmaW5kIHRyYWNlcG9pbnQgPG4+IiAidHJhY2Vwb2ludCAkdGRwMiIgXAorCSJcJHRyYWNlcG9pbnQiICIkdGRwMiI7CitnZGJfdGVzdCAicHJpbnQgXCR0cmFjZV9saW5lIiAiJHRlc3RsaW5lMiIgXAorCSI4LjEyOiB0ZmluZCB0cmFjZXBvaW50IDxuPiAobGluZSAkdGVzdGxpbmUyKSIKKworZ2RiX3RmaW5kX3Rlc3QgIjguMjU6IHRmaW5kIG5vbmUiICJub25lIiAiLTEiOworZ2RiX3Rlc3QgInRmaW5kIHRyYWNlcG9pbnQgMCIgImZhaWxlZCB0byBmaW5kLioiIFwKKwkiOC4yNTogdGZpbmQgdHJhY2Vwb2ludCByZWplY3RzIHplcm8iCitnZGJfdGVzdCAidGZpbmQgdHJhY2Vwb2ludCAzMjc2NyIgImZhaWxlZCB0byBmaW5kLioiIFwKKwkiOC4yNTogdGZpbmQgdHJhY2Vwb2ludCByZWplY3RzIG5vbmV4aXN0YW50IHRyYWNlcG9pbnQgKDMyNzY3KSIKK2dkYl90ZXN0ICJ0ZmluZCB0cmFjZXBvaW50IC0xIiAiZmFpbGVkIHRvIGZpbmQuKiIgXAorCSI4LjI1OiB0ZmluZCB0cmFjZXBvaW50IHJlamVjdHMgbm9uZXhpc3RhbnQgdHJhY2Vwb2ludCAoLTEpIgorCisjIDguMzcgdGZpbmQgdHJhY2Vwb2ludCBuIHdoZXJlIG4gbm8gbG9uZ2VyIGV4aXN0cyAoYnV0IHVzZWQgdG8pCitnZGJfdGVzdCAiZGVsZXRlIHRyYWNlICR0ZHAyIiAiIiAiIgorZ2RiX3RmaW5kX3Rlc3QgIjguMzc6IHRmaW5kIG5vbmUiICJub25lIiAiLTEiOworZ2RiX3RmaW5kX3Rlc3QgIjguMzc6IHRmaW5kIGRlbGV0ZWQgdHJhY2Vwb2ludCIgXAorCSJ0cmFjZXBvaW50ICR0ZHAyIiBcCisJIlwkdHJhY2Vwb2ludCIgIiR0ZHAyIjsKK2dkYl90ZXN0ICJwcmludCBcJHRyYWNlX2xpbmUiICIkdGVzdGxpbmUyIiBcCisJIjguMzc6IHRmaW5kIGRlbGV0ZWQgdHJhY2Vwb2ludCAobGluZSAkdGVzdGxpbmUyKSIKKworIyA4LjEzIHRmaW5kIHRyYWNlcG9pbnQgPG5vIGFyZz4KKyMjIGNoZWNrICR0cmFjZXBvaW50IHNhbWUgYmVmb3JlIGFuZCBhZnRlciwgJHRyYWNlX2ZyYW1lIGNoYW5nZWQKKworZ2RiX3RmaW5kX3Rlc3QgIjguMTM6IHRmaW5kIG5vbmUiICJub25lIiAiLTEiOworZ2RiX3RmaW5kX3Rlc3QgIjguMTM6IHRyYWNlcG9pbnQgJHRkcDEiICJ0cmFjZXBvaW50ICR0ZHAxIiBcCisJIlwkdHJhY2Vwb2ludCIgIiR0ZHAxIjsKK2dkYl90ZXN0ICJwcmludCBcJHRyYWNlX2xpbmUiICIkYmFzZWxpbmUiIFwKKwkiOC4xMzogdGZpbmQgdHJhY2Vwb2ludCAkdGRwMSAobGluZSAkYmFzZWxpbmUpIgorZ2RiX3Rlc3QgInNldCBcJHNhdmVfZnJhbWUgPSBcJHRyYWNlX2ZyYW1lIiAiIiAiIgorZ2RiX3RmaW5kX3Rlc3QgIjguMTM6IHRyYWNlcG9pbnQgPG5vIGFyZz4iICJ0cmFjZXBvaW50IiBcCisJIlwkdHJhY2Vwb2ludCIgIiR0ZHAxIjsKK2dkYl90ZXN0ICJwcmludGYgXCJ4IFwlZCB4XFxuXCIsIFwkdHJhY2VfZnJhbWUgPT0gXCRzYXZlX2ZyYW1lIiBcCisJInggMCB4IiBcCisJIjguMTM6IHRyYWNlcG9pbnQgPG5vIGFyZz4sIHRyYWNlcG9pbnQgbnVtYmVyIHVuY2hhbmdlZCJdCisKKyMgMS4xMiBzZXQgdHJhY2Vwb2ludCBpbiBwcm9sb2d1ZQorIworIyB0ZHAxIHdhcyBzZXQgYXQgKmdkYl9yZWN1cnNpb25fdGVzdCAoaWUuIHRoZSBoYXJkIGFkZHJlc3Mgb2YgdGhlCisjIGZ1bmN0aW9uLCBiZWZvcmUgdGhlIHByb2xvZ3VlKS4gIFRlc3QgdG8gc2VlIHRoYXQgaXQgc3VjY2VlZGVkLgorIyBDdXJyZW50IHBjIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24uCisKK2dkYl90ZXN0ICJwcmludGYgXCJ4IFwlZCB4XFxuXCIsIFwkcGMgPT0gZ2RiX3JlY3Vyc2lvbl90ZXN0IiBcCisJInggMSB4IiBcCisJIjEuMTI6IHNldCB0cmFjZXBvaW50IGluIHByb2xvZ3VlIgorCisjIDguMTQgdGZpbmQgcGMgeAorIyMgY2hlY2sgcGMgPT0geCwgJHRyYWNlX2ZyYW1lICE9IC0xCitnZGJfdGZpbmRfdGVzdCAiOC4xNDogdGZpbmQgMyIgIjMiICIzIgorZ2RiX3Rlc3QgInByaW50IFwkdHJhY2VfbGluZSIgIiR0ZXN0bGluZTQiIFwKKwkiOC4xNDogdGZpbmQgMyAobGluZSAkdGVzdGxpbmU0KSIKKworZ2RiX3Rlc3QgInNldCBcJHRlc3RfcGMgPSBcJHBjIiAiIiAiIgorZ2RiX3RmaW5kX3Rlc3QgIjguMTQ6IHRmaW5kIG5vbmUiICJub25lIiAiLTEiCitnZGJfdGZpbmRfdGVzdCAiOC4xNDogdGZpbmQgcGMiICJwYyBcJHRlc3RfcGMiICJcJHRyYWNlX2ZyYW1lICE9IC0xIiAiMSI7CitnZGJfdGVzdCAicHJpbnQgXCR0cmFjZV9saW5lIiAiJHRlc3RsaW5lNCIgXAorCSI4LjE0OiB0ZmluZCBwYyB4IChsaW5lICR0ZXN0bGluZTQpIgorZ2RiX3Rlc3QgInByaW50ZiBcInggXCVkIHhcXG5cIiwgXCRwYyA9PSBcJHRlc3RfcGMiIFwKKwkieCAxIHgiIFwKKwkiOC4xNDogdGZpbmQgcGMgeCIKKworIyA4LjE1IHRmaW5kIHBjIDxubyBhcmc+CisjIyBjaGVjayBwYyBzYW1lIGJlZm9yZSBhbmQgYWZ0ZXIsICR0cmFjZV9mcmFtZSBjaGFuZ2VkCitnZGJfdGZpbmRfdGVzdCAiOC4xNTogdGZpbmQgMyIgIjMiICIzIgorZ2RiX3Rlc3QgInByaW50IFwkdHJhY2VfbGluZSIgIiR0ZXN0bGluZTQiIFwKKwkiOC4xNTogdGZpbmQgMyAobGluZSAkdGVzdGxpbmU0KSIKK2dkYl90ZXN0ICJzZXQgXCR0ZXN0X3BjID0gXCRwYyIgIiIgIiIKK2dkYl90ZmluZF90ZXN0ICI4LjE1OiB0ZmluZCBwYyIgInBjIiAiXCRwYyA9PSBcJHRlc3RfcGMiICIxIgorZ2RiX3Rlc3QgInByaW50IFwkdHJhY2VfbGluZSIgIiR0ZXN0bGluZTQiIFwKKwkiOC4xNTogdGZpbmQgcGMgKGxpbmUgJHRlc3RsaW5lNCkiCitnZGJfdGVzdCAicHJpbnRmIFwieCBcJWQgeFxcblwiLCBcJHRyYWNlX2ZyYW1lICE9IDMiICJ4IDEgeCIgXAorCSI4LjE1OiB0cmFjZSBmcmFtZSBkaWRuJ3QgY2hhbmdlIgorCisjIDguMjYgdGZpbmQgcGMgaW52YWxpZCB4CisjIyBjaGVjayBlcnJvciwgcGMgIT0geCAodHJhY2VfZnJhbWUgdW5jaGFuZ2VkPykKK2dkYl90ZmluZF90ZXN0ICI4LjI2OiB0ZmluZCBzdGFydCIgInN0YXJ0IiAiMCIKK2dkYl90ZXN0ICJ0ZmluZCBwYyAgMCIgImZhaWxlZCB0byBmaW5kLioiICI4LjI2OiB0ZmluZCBwYyB6ZXJvIgorZ2RiX3Rlc3QgInRmaW5kIHBjIC0xIiAiZmFpbGVkIHRvIGZpbmQuKiIgIjguMjY6IHRmaW5kIHBjIC0xIgorCisjIDguMTYgdGZpbmQgbGluZSBuCisjIyBjaGVjayAjdHJhY2VfZnJhbWUgIT0gLTEsICR0cmFjZV9saW5lID09IG4KK2dkYl90ZmluZF90ZXN0ICI4LjE2OiB0ZmluZCBub25lIiAibm9uZSIgIi0xIgorZ2RiX3RmaW5kX3Rlc3QgIjguMTY6IHRmaW5kIGxpbmUgJHRlc3RsaW5lMyIgXAorCSJsaW5lICR0ZXN0bGluZTMiIFwKKwkiXCR0cmFjZV9saW5lID09ICR0ZXN0bGluZTMiICIxIgorCisjIDguMTcgdGZpbmQgbGluZSA8bm8gYXJnPiAoIyA4LjE5LCA4LjIwKQorIyMgY2hlY2sgJHRyYWNlX2xpbmUgY2hhbmdlZCwgbm8gZXJyb3IsIHBjIGNoYW5nZWQsIGZyYW1lIGNoYW5nZWQsIHRkcCBjaGFuZ2VkCitnZGJfdGZpbmRfdGVzdCAiOC4xNzogdGZpbmQgbm9uZSIgIm5vbmUiICItMSIKK2dkYl90ZmluZF90ZXN0ICI4LjE3OiB0ZmluZCBsaW5lICR0ZXN0bGluZTMiICJsaW5lICR0ZXN0bGluZTMiICJcJHRyYWNlX2xpbmUgPT0gJHRlc3RsaW5lMyIgIjEiCitnZGJfdGZpbmRfdGVzdCAiOC4xNzogdGZpbmQgbGluZSA8bm8gYXJnPiIgImxpbmUiICJcJHRyYWNlX2xpbmUgIT0gJHRlc3RsaW5lMyIgIjEiCisKKyMgOC4zNiB0ZmluZCBhbmQgZGlzYXNzZW1ibHkKK2dkYl90ZmluZF90ZXN0ICI4LjM2OiB0ZmluZCBzdGFydCIgInN0YXJ0IiAiMCIKK3NldCB0aW1lb3V0IDYwCitzZW5kX2dkYiAiZGlzYXNzZW1ibGUgZ2RiX2NfdGVzdFxuIgorIyBsb29rIGZvciBkaXNhc3NlbWJseSBvZiBmdW5jdGlvbiBsYWJlbAorZ2RiX2V4cGVjdCB7CisgICAgLXJlICI8Z2RiX2NfdGVzdD46LiokZ2RiX3Byb21wdCAkIiAgICAgIHsgcGFzcyAiOC4zNjogdHJhY2UgZGlzYXNzZW1ibHkiIH0KKyAgICAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgICAgICAgICAgICAgICAgICAgeyBmYWlsICI4LjM2OiB0cmFjZSBkaXNhc3NlbWJseSIgfQorICAgIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgIHsgZmFpbCAiOC4zNjogdHJhY2UgZGlzYXNzZW1ibHkgKHRpbWVvdXQpIiB9Cit9CisKK2dkYl90ZXN0ICJ0ZmluZCBsaW5lIDAiIFwKKwkib3V0IG9mIHJhbmdlLip8ZmFpbGVkIHRvIGZpbmQuKiIgXAorCSI4LjE4OiB0ZmluZCBsaW5lIDAiOworZ2RiX3Rlc3QgInRmaW5kIGxpbmUgMzI3NjciIFwKKwkib3V0IG9mIHJhbmdlLip8ZmFpbGVkIHRvIGZpbmQuKiIgXAorCSI4LjI3OiB0ZmluZCBsaW5lIDMyNzY3IjsKK2dkYl90ZXN0ICJ0ZmluZCBsaW5lIE5vU3VDaEZpTGUuYzokYmFzZWxpbmUiIFwKKwkiTm8gc291cmNlIGZpbGUgbmFtZWQuKiIgXAorCSI4LjI3OiB0ZmluZCBsaW5lIGluIGJhZCBzb3VyY2UgZmlsZSI7CisKKyMgOC4zMiB0ZmluZCBpbnZhbGlkIHN1YmNvbW1hbmQgKHRmaW5kIGZvbykgCisjIyBjaGVjayBlcnJvcgorZ2RiX3Rlc3QgInRmaW5kIE5vU3VDaE9wVGlPbiAyMSIgXAorCSJObyBzeW1ib2wuKnxcW1d3XF1hcm5pbmcuKnxcW0VlXF1ycm9yLioiIFwKKwkiOC4zMjogdGZpbmQgd2l0aCBiYWQgc3ViY29tbWFuZCIKKworIyA4LjM4IHRlc3QgaGVscCB0ZmluZAorZ2RiX3Rlc3QgImhlbHAgdGZpbmQiICAgICAgICJTZWxlY3QgYSB0cmFjZSBmcmFtZS4qIiAgICAgIFwKKwkiOC4zODogaGVscCB0ZmluZCIKK2dkYl90ZXN0ICJoZWxwIHRmaW5kIHBjIiAgICAiU2VsZWN0IGEgdHJhY2UgZnJhbWUgYnkgUEMuKiIgXAorCSI4LjM4OiBoZWxwIHRmaW5kIFBDIgorZ2RiX3Rlc3QgImhlbHAgdGZpbmQgZW5kIiAgICJTeW5vbnltIGZvciAnbm9uZScuKiIgICAgICAgIFwKKwkiOC4zODogaGVscCB0ZmluZCBlbmQiCitnZGJfdGVzdCAiaGVscCB0ZmluZCBub25lIiAgIkRlLXNlbGVjdCBhbnkgdHJhY2UgZnJhbWUuKiIgXAorCSI4LjM4OiBoZWxwIHRmaW5kIG5vbmUiCitnZGJfdGVzdCAiaGVscCB0ZmluZCBsaW5lIiAgIlNlbGVjdCBhIHRyYWNlIGZyYW1lIGJ5IHNvdXJjZSBsaW5lLioiIFwKKwkiOC4zODogaGVscCB0ZmluZCBsaW5lIgorZ2RiX3Rlc3QgImhlbHAgdGZpbmQgc3RhcnQiICJTZWxlY3QgdGhlIGZpcnN0IHRyYWNlIGZyYW1lLioiIFwKKwkiOC4zODogaGVscCB0ZmluZCBzdGFydCIKK2dkYl90ZXN0ICJoZWxwIHRmaW5kIHJhbmdlIiAiU2VsZWN0IGEgdHJhY2UgZnJhbWUgd2hvc2UgUEMgaXMgaW4uKiIgXAorCSI4LjM4OiBoZWxwIHRmaW5kIHJhbmdlIgorZ2RiX3Rlc3QgImhlbHAgdGZpbmQgdHJhY2UiICJTZWxlY3QgYSB0cmFjZSBmcmFtZSBieSB0cmFjZXBvaW50IG51bWJlci4qIiBcCisJIjguMzg6IGhlbHAgdGZpbmQgdHJhY2Vwb2ludCIKKworIyBGaW5pc2hlZCEKK2dkYl90ZmluZF90ZXN0ICI4LjE3OiB0ZmluZCBub25lIiAibm9uZSIgIi0xIgpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvdHJhY2VjbWQuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudHJhY2UvdHJhY2VjbWQuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYTU1MDEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS90cmFjZWNtZC5leHAKQEAgLTAsMCArMSwyNjkgQEAKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAorCisjIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgorIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQorCisjIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBNaWNoYWVsIFNueWRlciAobXNueWRlckBjeWdudXMuY29tKQorCitsb2FkX2xpYiAidHJhY2Utc3VwcG9ydC5leHAiOworCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK2dkYl9leGl0CitnZGJfc3RhcnQKK2lmIFtpc3RhcmdldCAibTY4ay0qLWVsZiJdIHRoZW4geworICAgIHNldCBzcmNmaWxlIGdkYl9jX3Rlc3QuYworICAgIHNldCBiaW5maWxlIFtib2FyZF9pbmZvIHRhcmdldCBkNDkwX2JpbmZpbGVdOworfSBlbHNlIHsKKyAgICBzZXQgdGVzdGZpbGUgImFjdGlvbnMiCisgICAgc2V0IHNyY2ZpbGUgJHt0ZXN0ZmlsZX0uYworICAgIHNldCBiaW5maWxlICRvYmpkaXIvJHN1YmRpci8kdGVzdGZpbGUKKyAgICBpZiB7IFtnZGJfY29tcGlsZSAiJHNyY2Rpci8kc3ViZGlyLyRzcmNmaWxlIiAkYmluZmlsZSBcCisJICAgIGV4ZWN1dGFibGUge2RlYnVnIGFkZGl0aW9uYWxfZmxhZ3M9LXd9XSAhPSAiIiB9IHsKKwlnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKKyAgICB9Cit9CitnZGJfcmVpbml0aWFsaXplX2RpciAkc3JjZGlyLyRzdWJkaXIKKworIyBJZiB0ZXN0aW5nIG9uIGEgcmVtb3RlIGhvc3QsIGRvd25sb2FkIHRoZSBzb3VyY2UgZmlsZS4KKyMgcmVtb3RlX2Rvd25sb2FkIGhvc3QgJHNyY2Rpci8kc3ViZGlyLyRzcmNmaWxlCisKK2dkYl9maWxlX2NtZCAkYmluZmlsZQorCisjIGRlZmluZSByZWxhdGl2ZSBzb3VyY2UgbGluZSBudW1iZXJzOgorIyBhbGwgc3Vic2VxdWVudCBsaW5lIG51bWJlcnMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgZmlyc3Qgb25lIChiYXNlbGluZSkKK3NldCBiYXNlbGluZSAgW2dkYl9maW5kX3JlY3Vyc2lvbl90ZXN0X2Jhc2VsaW5lICRzcmNmaWxlXTsKK2lmIHsgJGJhc2VsaW5lID09IC0xIH0gdGhlbiB7CisgICAgZmFpbCAiQ291bGQgbm90IGZpbmQgZ2RiX3JlY3Vyc2lvbl90ZXN0IGZ1bmN0aW9uIgorICAgIHJldHVybjsKK30KKworc2V0IHRlc3RsaW5lMSBbZXhwciAkYmFzZWxpbmUgKyAxXQorc2V0IHRlc3RsaW5lMiBbZXhwciAkYmFzZWxpbmUgKyAzXQorCisjCisjIHRlc3QgImhlbHAgdHJhY2Vwb2ludHMiCisjCisKK3NldCBoZWxwY250IDA7CitzZW5kX2dkYiAiaGVscCB0cmFjZXBvaW50c1xuIgorZ2RiX2V4cGVjdCB7CisgICAgLXJlICJUcmFjaW5nIG9mIHByb2dyYW0gZXhlY3V0aW9uIHdpdGhvdXQgc3RvcHBpbmcgdGhlIHByb2dyYW0uIiB7CisJaW5jciBoZWxwY250OworCWV4cF9jb250aW51ZQorICAgIH0KKyAgICAtcmUgImFjdGlvbnMgLS0gU3BlY2lmeSB0aGUgYWN0aW9ucyB0byBiZSB0YWtlbiBhdCBhIHRyYWNlcG9pbnQiIHsKKwlpbmNyIGhlbHBjbnQ7CisJZXhwX2NvbnRpbnVlCisgICAgfQorICAgIC1yZSAiY29sbGVjdCAtLSBTcGVjaWZ5IG9uZSBvciBtb3JlIGRhdGEgaXRlbXMgdG8gYmUgY29sbGVjdGVkIiB7CisJaW5jciBoZWxwY250OworCWV4cF9jb250aW51ZQorICAgIH0KKyAgICAtcmUgImRlbGV0ZSB0cmFjZXBvaW50cyAtLSBEZWxldGUgc3BlY2lmaWVkIHRyYWNlcG9pbnRzIiB7CisJaW5jciBoZWxwY250OworCWV4cF9jb250aW51ZQorICAgIH0KKyAgICAtcmUgImVuZCAtLSBFbmRzIGEgbGlzdCBvZi4qYWN0aW9ucyIgeworCWluY3IgaGVscGNudDsKKwlleHBfY29udGludWUKKyAgICB9CisgICAgLXJlICJpbmZvIHRyYWNlcG9pbnRzIC0tIFN0YXR1cyBvZiB0cmFjZXBvaW50cyIgeworCWluY3IgaGVscGNudDsKKwlleHBfY29udGludWUKKyAgICB9CisgICAgLXJlICJwYXNzY291bnQgLS0gU2V0IHRoZSBwYXNzY291bnQgZm9yIGEgdHJhY2Vwb2ludCIgeworCWluY3IgaGVscGNudDsKKwlleHBfY29udGludWUKKyAgICB9CisgICAgLXJlICJzYXZlLXRyYWNlcG9pbnRzIC0tIFNhdmUgY3VycmVudCB0cmFjZXBvaW50IGRlZmluaXRpb25zIiB7CisJaW5jciBoZWxwY250OworCWV4cF9jb250aW51ZQorICAgIH0KKyAgICAtcmUgInRkdW1wIC0tIFByaW50IGV2ZXJ5dGhpbmcgY29sbGVjdGVkIGF0IHRoZSBjdXJyZW50IHRyYWNlcG9pbnQiIHsKKwlpbmNyIGhlbHBjbnQ7CisJZXhwX2NvbnRpbnVlCisgICAgfQorICAgIC1yZSAidGZpbmQgLS0gU2VsZWN0IGEgdHJhY2UgZnJhbWUiIHsKKwlpbmNyIGhlbHBjbnQ7CisJZXhwX2NvbnRpbnVlCisgICAgfQorICAgIC1yZSAidGZpbmQgZW5kIC0tIFN5bm9ueW0gZm9yICdub25lJyIgeworCWluY3IgaGVscGNudDsKKwlleHBfY29udGludWUKKyAgICB9CisgICAgLXJlICJ0ZmluZCBsaW5lIC0tIFNlbGVjdCBhIHRyYWNlIGZyYW1lIGJ5IGxpbmUgbnVtYmVyIiB7CisJaW5jciBoZWxwY250OworCWV4cF9jb250aW51ZQorICAgIH0KKyAgICAtcmUgInRmaW5kIG5vbmUgLS0gRGUtc2VsZWN0IGFueSB0cmFjZSBmcmFtZSBhbmQgcmVzdW1lICdsaXZlJyBkZWJ1Z2dpbmciIHsKKwlpbmNyIGhlbHBjbnQ7CisJZXhwX2NvbnRpbnVlCisgICAgfQorICAgIC1yZSAidGZpbmQgb3V0c2lkZSAtLSBTZWxlY3QgYSB0cmFjZSBmcmFtZSB3aG9zZSBQQyBpcyBvdXRzaWRlIiB7CisJaW5jciBoZWxwY250OworCWV4cF9jb250aW51ZQorICAgIH0KKyAgICAtcmUgInRmaW5kIHBjIC0tIFNlbGVjdCBhIHRyYWNlIGZyYW1lIGJ5IFBDIiB7CisJaW5jciBoZWxwY250OworCWV4cF9jb250aW51ZQorICAgIH0KKyAgICAtcmUgInRmaW5kIHJhbmdlIC0tIFNlbGVjdCBhIHRyYWNlIGZyYW1lIHdob3NlIFBDIGlzIGluIHRoZSBnaXZlbiIgeworCWluY3IgaGVscGNudDsKKwlleHBfY29udGludWUKKyAgICB9CisgICAgLXJlICJ0ZmluZCBzdGFydCAtLSBTZWxlY3QgdGhlIGZpcnN0IHRyYWNlIGZyYW1lIGluIHRoZSB0cmFjZSBidWZmZXIiIHsKKwlpbmNyIGhlbHBjbnQ7CisJZXhwX2NvbnRpbnVlCisgICAgfQorICAgIC1yZSAidGZpbmQgdHJhY2Vwb2ludCAtLSBTZWxlY3QgYSB0cmFjZSBmcmFtZSBieSB0cmFjZXBvaW50IG51bWJlciIgeworCWluY3IgaGVscGNudDsKKwlleHBfY29udGludWUKKyAgICB9CisgICAgLXJlICJ0cmFjZSAtLSBTZXQgYSB0cmFjZXBvaW50IGF0IGEgc3BlY2lmaWVkIGxpbmUgb3IgZnVuY3Rpb24gb3IgYWRkciIgeworCWluY3IgaGVscGNudDsKKwlleHBfY29udGludWUKKyAgICB9CisgICAgLXJlICJ0c3RhcnQgLS0gU3RhcnQgdHJhY2UgZGF0YSBjb2xsZWN0aW9uIiB7CisJaW5jciBoZWxwY250OworCWV4cF9jb250aW51ZQorICAgIH0KKyAgICAtcmUgInRzdGF0dXMgLS0gRGlzcGxheSB0aGUgc3RhdHVzIG9mIHRoZSBjdXJyZW50IHRyYWNlIGRhdGEgY29sbGVjdGlvbiIgeworCWluY3IgaGVscGNudDsKKwlleHBfY29udGludWUKKyAgICB9CisgICAgLXJlICJ0c3RvcCAtLSBTdG9wIHRyYWNlIGRhdGEgY29sbGVjdGlvbiIgeworCWluY3IgaGVscGNudDsKKwlleHBfY29udGludWUKKyAgICB9CisgICAgLXJlICJ3aGlsZS1zdGVwcGluZyAtLSBTcGVjaWZ5IHNpbmdsZS1zdGVwcGluZyBiZWhhdmlvciBhdCBhIHRyYWNlcG9pbnQiIHsKKwlpbmNyIGhlbHBjbnQ7CisJZXhwX2NvbnRpbnVlCisgICAgfQorICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisJaWYgeyAkaGVscGNudCA9PSAyMSB9IHsKKwkgICAgcGFzcyAiMS4wOiBoZWxwIHRyYWNlcG9pbnRzIgorCX0gZWxzZSB7CisJICAgIHdhcm5pbmcgIiRoZWxwY250IjsKKwkgICAgZmFpbCAiMS4wOiBoZWxwIHRyYWNlcG9pbnRzIgorCX0KKyAgICB9Cit9CisKKyMKKyMgdGVzdCB0cmFjZSBjb21tYW5kOgorIworCisjIDEuMSB0cmFjZSBzb3VyY2UgbGluZQorZ2RiX2RlbGV0ZV90cmFjZXBvaW50cworZ2RiX3Rlc3QgInRyYWNlICRzcmNmaWxlOiR0ZXN0bGluZTIiIFwKKwkiVHJhY2Vwb2ludCAkZGVjaW1hbCBhdCAkaGV4OiBmaWxlLiokc3JjZmlsZSwgbGluZSAkdGVzdGxpbmUyLiIgXAorCSIxLjFhOiBzZXQgdHJhY2Vwb2ludCBhdCBzb3VyY2VsaW5lIgorZ2RiX3Rlc3QgImluZm8gdHJhY2UiICJpbiBnZGJfcmVjdXJzaW9uX3Rlc3QuKiRzcmNmaWxlOiR0ZXN0bGluZTIiIFwKKwkiMS4xYjogdHJhY2Ugc291cmNlZmlsZTpsaW5lIgorCisjIDEuMiB0cmFjZSBpbnZhbGlkIHNvdXJjZSBsaW5lCitnZGJfZGVsZXRlX3RyYWNlcG9pbnRzCitnZGJfdGVzdCAidHJhY2UgJHNyY2ZpbGU6OTk5OTkiICJObyBsaW5lIDk5OTk5IGluIGZpbGUgXCIuKiRzcmNmaWxlXCIuIiBcCisJIjEuMmE6IHRyYWNlIGludmFsaWQgbGluZSBpbiBzb3VyY2VmaWxlIgorZ2RiX3Rlc3QgImluZm8gdHJhY2UiICJObyB0cmFjZXBvaW50cy4qIiBcCisJIjEuMmI6IHJlamVjdCBpbnZhbGlkIGxpbmUgaW4gc3JjZmlsZSIKKworIyAxLjMgdHJhY2UgbGluZSBpbiBpbnZhbGlkIHNvdXJjZSBmaWxlCitnZGJfZGVsZXRlX3RyYWNlcG9pbnRzCitnZGJfdGVzdCAidHJhY2UgTm9TdUNoRmlMZS5jOjEiICJObyBzb3VyY2UgZmlsZSBuYW1lZCBOb1N1Q2hGaUxlLmMuIiBcCisJIjEuM2E6IHRyYWNlIGludmFsaWQgc291cmNlIGZpbGUiCitnZGJfdGVzdCAiaW5mbyB0cmFjZSIgIk5vIHRyYWNlcG9pbnRzLioiIFwKKwkiMS4zYjogcmVqZWN0IGludmFsaWQgc3JjZmlsZSIKKworIyAxLjQgdHJhY2UgZnVuY3Rpb24gYnkgbmFtZQorZ2RiX2RlbGV0ZV90cmFjZXBvaW50cworZ2RiX3Rlc3QgInRyYWNlIGdkYl9yZWN1cnNpb25fdGVzdCIgXAorCSJUcmFjZXBvaW50ICRkZWNpbWFsIGF0ICRoZXg6IGZpbGUuKiRzcmNmaWxlLCBsaW5lICR0ZXN0bGluZTEuIiBcCisJIjEuNGE6IHRyYWNlIGZ1bmN0aW9uIGJ5IG5hbWUiCitnZGJfdGVzdCAiaW5mbyB0cmFjZSIgImluIGdkYl9yZWN1cnNpb25fdGVzdC4qJHNyY2ZpbGU6JHRlc3RsaW5lMSIgXAorCSIxLjRiOiB0cmFjZSBmdW5jdGlvbiBieSBuYW1lIgorCisjIDEuNSB0cmFjZSBub24tZXhpc3RhbnQgZnVuY3Rpb24KK2dkYl9kZWxldGVfdHJhY2Vwb2ludHMKK2dkYl90ZXN0ICJ0cmFjZSBOb1N1Q2hGdU5jIiAiRnVuY3Rpb24gXCJOb1N1Q2hGdU5jXCIgbm90IGRlZmluZWQuIiBcCisJIjEuNWE6IHRyYWNlIGludmFsaWQgZnVuY3Rpb24iCitnZGJfdGVzdCAiaW5mbyB0cmFjZSIgIk5vIHRyYWNlcG9pbnRzLioiIFwKKwkiMS41YjogcmVqZWN0IGludmFsaWQgc3JjZmlsZSIKKworIyAxLjYgdHJhY2UgYXQgYSBzcGVjaWZpYyBhZGRyZXNzCisjICAgICBDb2xsZWN0IHRoZSBhZGRyZXNzIG9mICJnZGJfYXNtX3Rlc3QiLCBhbmQgdXNlIHRoYXQuCitzZW5kX2dkYiAicHJpbnQgZ2RiX2FzbV90ZXN0XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIlxbJFxdXFswLTlcXS4qMHgoXFswLTlhLWZBLUZcXSspLiokZ2RiX3Byb21wdCAkIiB7CisJc2V0IGFzbV90ZXN0X2FkZHIgJGV4cGVjdF9vdXQoMSxzdHJpbmcpCisgICAgfQorICAgIHRpbWVvdXQgeyB9Cit9CisKK2dkYl9kZWxldGVfdHJhY2Vwb2ludHMKK2dkYl90ZXN0ICJ0cmFjZSBcKjB4JGFzbV90ZXN0X2FkZHIiIFwKKwkiVHJhY2Vwb2ludCAkZGVjaW1hbCBhdCAuKiRhc21fdGVzdF9hZGRyLioiIFwKKwkiMS42YTogdHJhY2UgYXQgc3BlY2lmaWMgYWRkcmVzcyIKK2dkYl90ZXN0ICJpbmZvIHRyYWNlIiAiJGFzbV90ZXN0X2FkZHIuKmdkYl9hc21fdGVzdC4qIiBcCisJIjEuNmI6IHZlcmlmeSB0cmFjZSBhdCBzcGVjaWZpYyBhZGRyZXNzIgorCisjIDEuNyB0cmFjZSBhdCBmdW5jdGlvbidzIGV4YWN0IGFkZHJlc3MKKyMgICAgIENvbGxlY3QgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGZvciBjb21wYXJpc29uCitzZW5kX2dkYiAicHJpbnQgZ2RiX3JlY3Vyc2lvbl90ZXN0XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgIlxbJFxdXFswLTlcXS4qMHgoXFswLTlhLWZBLUZcXSspLiokZ2RiX3Byb21wdCAkIiB7CisJc2V0IGNfdGVzdF9hZGRyICRleHBlY3Rfb3V0KDEsc3RyaW5nKQorICAgIH0KKyAgICB0aW1lb3V0IHsgfQorfQorCitnZGJfZGVsZXRlX3RyYWNlcG9pbnRzCitnZGJfdGVzdCAidHJhY2UgXCpnZGJfcmVjdXJzaW9uX3Rlc3QiIFwKKwkiVHJhY2Vwb2ludCAkZGVjaW1hbCBhdCAuKiRjX3Rlc3RfYWRkci4qIiBcCisJIjEuN2E6IHRyYWNlIGF0IGZ1bmN0aW9uIGxhYmVsIChiZWZvcmUgcHJvbG9ndWUpIgorZ2RiX3Rlc3QgImluZm8gdHJhY2UiICIkY190ZXN0X2FkZHIuKmluIGdkYl9yZWN1cnNpb25fdGVzdC4qOiRiYXNlbGluZSIgXAorCSIxLjdiOiB2ZXJpZnkgdHJhY2UgYXQgc3BlY2lmaWMgYWRkcmVzcyIKKworIyAxLjggdHJhY2UgYXQgaW52YWxpZCBhZGRyZXNzCisjIG5vIGFkZHJlc3MgaXMgaW52YWxpZAorCisjIDEuOSB0cmFjZSBubyBhcmd1bWVudHMKK2dkYl90ZXN0ICJ0cmFjZSIgInRyYWNlIGNvbW1hbmQgcmVxdWlyZXMgYW4gYXJndW1lbnQiIFwKKwkiMS45OiB0cmFjZSA8bm8gYXJndW1lbnRzPiIKKworIyAxLjEwIHNldCBsYXJnZSBudW1iZXIgb2YgdHJhY2Vwb2ludHMKKyMgZGVmZXJyZWQgdG8gbGltaXRzIHRlc3QgbW9kdWxlCisKKyMgMS4xMSB0cmFjZXBvaW50IGNvbmRpdGlvbnMKKyMgY29uZGl0aW9ucyBvbiB0cmFjZXBvaW50cyBub3QgaW1wbGVtZW50ZWQKKworIyAxLjEyIHNldCB0cmFjZXBvaW50IGluIHByb2xvZ3VlCisjIFtzZWUgdGZpbmQuZXhwXQorCisjIDEuMTMgdHJhY2Ugb24gcmVjdXJzaW9uCisjIGludGVyZXN0aW5nIG9ubHkgaW4gImxpdmUiIHNlc3Npb246IHNlZSBiYWNrdHJhY2UuZXhwIGZvciBsaXZlIHRlc3QuCisKKyMgMS4xNCBoZWxwIHRyYWNlCitnZGJfdGVzdCAiaGVscCB0cmFjZSIgIlNldCBhIHRyYWNlcG9pbnQgYXQgLioiICIxLjE0OiBoZWxwIHRyYWNlIgorCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL3doaWxlLWR5bi5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS93aGlsZS1keW4uZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZmYwZmMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS93aGlsZS1keW4uZXhwCkBAIC0wLDAgKzEsMTI0IEBACisjICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgTWljaGFlbCBTbnlkZXIgKG1zbnlkZXJAY3lnbnVzLmNvbSkKKworbG9hZF9saWIgInRyYWNlLXN1cHBvcnQuZXhwIgorCitpZiAkdHJhY2VsZXZlbCB0aGVuIHsKKyAgICBzdHJhY2UgJHRyYWNlbGV2ZWwKK30KKworc2V0IHBybXNfaWQgMAorc2V0IGJ1Z19pZCAwCisKK2dkYl9leGl0CitnZGJfc3RhcnQKKworaWYgW2lzdGFyZ2V0ICJtNjhrLSotZWxmIl0gdGhlbiB7CisgICAgbG9hZF9saWIgImVtYy1zdXBwb3J0LmV4cCIKKyAgICBzZXQgdGVzdGZpbGUgImdkYl9jX3Rlc3QiCisgICAgc2V0IHNyY2ZpbGUgICR0ZXN0ZmlsZS5jCisgICAgc2V0IGJpbmZpbGUgW2JvYXJkX2luZm8gdGFyZ2V0IGQ0OTBfYmluZmlsZV07CisgICAgZ2RiX3Rlc3QgInNldCByZW1vdGV0aW1lb3V0IDYiICIiICIiCisgICAgc2V0IHRpbWVvdXQgNTAwCisgICAgZ2RiX3RhcmdldF9tb25pdG9yICIkYmluZmlsZSIKKyAgICAjIEdpdmUgYSBUU1RPUCBhbmQgaWdub3JlIGVycm9ycywgdG8gbWFrZSBzdXJlIGFueSBwcmV2aW91cyB0cmFjZSBpcyBvZmYKKyAgICBnZGJfdGVzdCAidHN0b3AiICIiICIiCisgICAgZ2RiX3Rlc3QgInRmaW5kIG5vbmUiICAiIiAiIgorICAgIHNlbmRfZ2RiICJjb21wYXJlLXNlY3Rpb24gQ1NcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIk1JUy1NQVRDSEVELiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiU3ltYm9sIGZpbGUgZG9lcyBub3QgbWF0Y2ggdGFyZ2V0IQorCSAgICBhbGwgdGVzdHMgaW4gdGhpcyBtb2R1bGUgd2lsbCBmYWlsLiI7CisJfQorCS1yZSAiLiokZ2RiX3Byb21wdCAkIiB7IH0KKyAgICB9Cit9IGVsc2UgeworICAgIHNldCB0ZXN0ZmlsZSAiYWN0aW9ucyIKKyAgICBzZXQgc3JjZmlsZSAkdGVzdGZpbGUuYworICAgIHNldCBiaW5maWxlICRvYmpkaXIvJHN1YmRpci8kdGVzdGZpbGUKKyAgICBpZiB7IFtnZGJfY29tcGlsZSAiJHNyY2Rpci8kc3ViZGlyLyRzcmNmaWxlIiAkYmluZmlsZSBcCisJICAgIGV4ZWN1dGFibGUge2RlYnVnIGFkZGl0aW9uYWxfZmxhZ3M9LXd9XSAhPSAiIiB9IHsKKwlnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgIlRlc3RjYXNlIGNvbXBpbGUgZmFpbGVkLCBzbyBhbGwgdGVzdHMgaW4gdGhpcyBmaWxlIHdpbGwgYXV0b21hdGljYWxseSBmYWlsLiIKKyAgICB9CisgICAgZ2RiX2xvYWQgJGJpbmZpbGUKKyAgICBnZGJfdGVzdCAidHN0b3AiICAgICAgICIiICIiCisgICAgZ2RiX3Rlc3QgInRmaW5kIG5vbmUiICAiIiAiIgorICAgIHJ1bnRvX21haW4KK30KK2dkYl9yZWluaXRpYWxpemVfZGlyICRzcmNkaXIvJHN1YmRpcgorCisjIFdlIGdlbmVyb3VzbHkgZ2l2ZSBvdXJzZWx2ZXMgb25lICJwYXNzIiBpZiB3ZSBzdWNjZXNzZnVsbHkgCisjIGRldGVjdCB0aGF0IHRoaXMgdGVzdCBjYW5ub3QgYmUgcnVuIG9uIHRoaXMgdGFyZ2V0IQoraWYgeyAhW2dkYl90YXJnZXRfc3VwcG9ydHNfdHJhY2VdIH0gdGhlbiB7CisgICAgcGFzcyAiQ3VycmVudCB0YXJnZXQgZG9lcyBub3Qgc3VwcG9yc3QgdHJhY2UiCisgICAgcmV0dXJuIDE7CisKK30KKworIyBJZiB0ZXN0aW5nIG9uIGEgcmVtb3RlIGhvc3QsIGRvd25sb2FkIHRoZSBzb3VyY2UgZmlsZS4KKyMgcmVtb3RlX2Rvd25sb2FkIGhvc3QgJHNyY2Rpci8kc3ViZGlyLyRzcmNmaWxlCisKKyMKKyMgdGVzdCB3aGlsZS1zdGVwcGluZyBkeW5hbWljYWxseSAobGl2ZSB0YXJnZXQpCisjCisKKyMjIHZlcmlmeSBudW1iZXIgb2YgdHJhY2UgZnJhbWVzIGNvbGxlY3RlZCBtYXRjaGVzIHN0ZXBjb3VudAorCitnZGJfZGVsZXRlX3RyYWNlcG9pbnRzCitnZGJfdGVzdCAidHJhY2UgZ2RiX2NfdGVzdCIgXAorCSJUcmFjZXBvaW50ICRkZWNpbWFsIGF0IC4qIiBcCisJIlNldCB0cmFjZXBvaW50IGF0IGdkYl9jX3Rlc3QiCisKK2dkYl90cmFjZV9zZXRhY3Rpb25zICI1LjEyOiBkZWZpbmUgd2hpbGUtc3RlcHBpbmcgPHN0ZXBjb3VudD4iIFwKKwkiIiBcCisJImNvbGxlY3QgXCRmcCIgIl4kIiBcCisJIndoaWxlLXN0ZXBwaW5nIDUiICJeJCIgXAorCSJjb2xsZWN0IHAiICJeJCIgXAorCSJlbmQiICJeJCIgXAorCSJlbmQiICIiCisKK2dkYl90ZXN0ICJ0c3RhcnQiICIiICIiCisKK2lmIFtpc3RhcmdldCAibTY4ay0qLWVsZiJdIHRoZW4geworICAgIGdkYl9lbWNsYXB0b3BfY29tbWFuZCAiODUsMSwyLDMsNCw1LDYiCisgICAgc2xlZXAgNQorfSBlbHNlIHsKKyAgICBnZGJfdGVzdCAiYnJlYWsgZW5kIiAiIiAiIgorICAgIGdkYl90ZXN0ICJjb250aW51ZSIgXAorCSAgICAiQ29udGludWluZy4qQnJlYWtwb2ludCAkZGVjaW1hbCwgZW5kLioiIFwKKwkgICAgInJ1biB0cmFjZSBleHBlcmltZW50IgorfQorCitnZGJfdGVzdCAidHN0b3AiICIiICIiCisKK2dkYl90ZmluZF90ZXN0ICI1LjEyOiBmcmFtZSA1IHNob3VsZCBiZSB0aGUgbGFzdCBvbmUgY29sbGVjdGVkIiAiNSIgIjUiCisKK3NlbmRfZ2RiICJ0ZmluZCA2XG4iCitnZGJfZXhwZWN0IHsKKyAgICAtcmUgImZhaWxlZCB0byBmaW5kLiokZ2RiX3Byb21wdCAkIiB7CisJcGFzcyAiNS4xMjogdHJhY2Ugc3RvcHBlZCBhZnRlciA1IHN0ZXBwaW5nIGZyYW1lcyIKKyAgICB9CisgICAgLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwlmYWlsICI1LjEyOiB0cmFjZSBzdG9wcGVkIGFmdGVyIDUgc3RlcHBpbmcgZnJhbWVzIgorICAgIH0KK30KKworZ2RiX3Rlc3QgInRmaW5kIG5vbmUiICIiICIiCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS93aGlsZS1zdGVwcGluZy5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi50cmFjZS93aGlsZS1zdGVwcGluZy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEwYmQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvZ2RiLnRyYWNlL3doaWxlLXN0ZXBwaW5nLmV4cApAQCAtMCwwICsxLDExNiBAQAorIyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IE1pY2hhZWwgU255ZGVyIChtc255ZGVyQGN5Z251cy5jb20pCisKK2xvYWRfbGliICJ0cmFjZS1zdXBwb3J0LmV4cCI7CisKK2lmICR0cmFjZWxldmVsIHRoZW4geworICAgIHN0cmFjZSAkdHJhY2VsZXZlbAorfQorCitzZXQgcHJtc19pZCAwCitzZXQgYnVnX2lkIDAKKworZ2RiX2V4aXQKK2dkYl9zdGFydAorCitpZiBbaXN0YXJnZXQgIm02OGstKi1lbGYiXSB0aGVuIHsKKyAgICBzZXQgc3JjZmlsZSBnZGJfY190ZXN0LmMKKyAgICBzZXQgYmluZmlsZSBbYm9hcmRfaW5mbyB0YXJnZXQgZDQ5MF9iaW5maWxlXTsKK30gZWxzZSB7CisgICAgc2V0IHRlc3RmaWxlICJhY3Rpb25zIgorICAgIHNldCBzcmNmaWxlICR7dGVzdGZpbGV9LmMKKyAgICBzZXQgYmluZmlsZSAke29iamRpcn0vJHtzdWJkaXJ9LyR7dGVzdGZpbGV9CisgICAgaWYgeyBbZ2RiX2NvbXBpbGUgIiR7c3JjZGlyfS8ke3N1YmRpcn0vJHtzcmNmaWxlfSIgJGJpbmZpbGUgXAorCSAgICBleGVjdXRhYmxlIHtkZWJ1ZyBhZGRpdGlvbmFsX2ZsYWdzPS13fV0gIT0gIiIgfSB7CisJZ2RiX3N1cHByZXNzX2VudGlyZV9maWxlICJUZXN0Y2FzZSBjb21waWxlIGZhaWxlZCwgc28gYWxsIHRlc3RzIGluIHRoaXMgZmlsZSB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC4iCisgICAgfQorfQorZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgJHNyY2Rpci8kc3ViZGlyCisKKyMgSWYgdGVzdGluZyBvbiBhIHJlbW90ZSBob3N0LCBkb3dubG9hZCB0aGUgc291cmNlIGZpbGUuCisjIHJlbW90ZV9kb3dubG9hZCBob3N0ICRzcmNkaXIvJHN1YmRpci8kc3JjZmlsZQorCitnZGJfZmlsZV9jbWQgJGJpbmZpbGUKKworIworIyB0ZXN0IHdoaWxlLXN0ZXBwaW5nIGNvbW1hbmQKKyMKKworZ2RiX2RlbGV0ZV90cmFjZXBvaW50cworc2V0IHRyY3B0MSBbZ2RiX2dldHRwbnVtIGdkYl9jX3Rlc3RdCitpZiB7ICR0cmNwdDEgPD0gMCB9IHRoZW4geworICAgIGZhaWwgIkNvdWxkIG5vdCBmaW5kIGdkYl9jX3Rlc3QgZnVuY3Rpb24iCisgICAgcmV0dXJuOworfQorCisjIDUuMTIgYmFzaWMgd2hpbGUtc3RlcHBpbmcgY29tbWFuZCAoY29sbGVjdCByZWdzKQorCitnZGJfdGVzdCAiaW5mbyB0cmFjZXBvaW50cyIgXAorCSJOdW0gRW5iIEFkZHJlc3MgICAgUGFzc0MgU3RlcEMgV2hhdC4qJHRyY3B0MS4qMHguKlxbXHQgXF0rXFswLTlcXStcW1x0IFxdKzBcW1x0IFxdKy4qaW4gZ2RiX2NfdGVzdC4qIiBcCisJIjUuMTI6IHNldCBhIHRyYWNlcG9pbnQsIHN0ZXBjb3VudCBpcyB6ZXJvIgorCitzZXQgc3RlcGNvdW50IDEyCisKK2dkYl90cmFjZV9zZXRhY3Rpb25zICI1LjEyOiBzZXQgc3RlcGNvdW50IHRvICRzdGVwY291bnQiIFwKKwkiIiBcCisJIndoaWxlLXN0ZXBwaW5nICRzdGVwY291bnQiICIiIFwKKwkiY29sbGVjdCBcJHJlZ3MiICJeJCIgXAorCSJlbmQiICIiCisKK2dkYl90ZXN0ICJpbmZvIHRyYWNlcG9pbnRzIiBcCisgICAgIk51bSBFbmIgQWRkcmVzcyAgICBQYXNzQyBTdGVwQyBXaGF0LiokdHJjcHQxLioweC4qXFtcdCBcXStcWzAtOVxdK1xbXHQgXF0rJHN0ZXBjb3VudFxbXHQgXF0rLippbiBnZGJfY190ZXN0LioiIFwKKwkiNS4xMjogY29uZmlybSBzdGVwY291bnQgc2V0IHRvICRzdGVwY291bnQiCisKK2dkYl90ZXN0ICJpbmZvIHRyYWNlcG9pbnRzIiBcCisgICAgIk51bSBFbmIgQWRkcmVzcyAgICBQYXNzQyBTdGVwQyBXaGF0LioKKy4qd2hpbGUtc3RlcHBpbmcgJHN0ZXBjb3VudC4qIiBcCisJIjUuMTI6IGluZm8gdHJhY2Ugc2hvd3MgXCJ3aGlsZS1zdGVwcGluZ1wiIgorCisKKyMgNS4xMyBzdGVwIG91dCBvZiBjb250ZXh0IHdoaWxlIGNvbGxlY3RpbmcgbG9jYWwgdmFyaWFibGUKKyMgICAgICBbZGVmZXJyZWQgdG8gZHluYW1pYyB0ZXN0IHNlY3Rpb25dCisKK3Byb2Mgd2hpbGVfc3RlcHBpbmdfYm9ndXNfYXJnIHsgYm9ndXMgbXNnc3RyaW5nIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0OworCisgICAgZ2RiX3RyYWNlX3NldGFjdGlvbnMgIiRtc2dzdHJpbmciIFwKKwkgICAgIiIgXAorCSAgICAid2hpbGUtc3RlcHBpbmcgJGJvZ3VzIiAiXFtFZVxdcnJvcnxcW1d3XF1hcm5pbmciCit9CisKKyMgNS4xNCB3aGlsZS1zdGVwcGluZyAobm8gYXJndW1lbnQpCisKK3doaWxlX3N0ZXBwaW5nX2JvZ3VzX2FyZyAiIiAiNS4xNDogd2hpbGUtc3RlcHBpbmcgbnVsbCBzdGVwY291bnQiCisKKyMgNS4xNSB3aGlsZS1zdGVwcGluZyAoemVybyBzdGVwY291bnQpCisKK3doaWxlX3N0ZXBwaW5nX2JvZ3VzX2FyZyAiMCIgIjUuMTU6IHdoaWxlLXN0ZXBwaW5nIHJlamVjdHMgemVybyBzdGVwY291bnQiCisKKyMgNS4xNiB3aGlsZS1zdGVwcGluZyB3aXRob3V0IGNvbGxlY3RpbmcgYW55dGhpbmcKK2dkYl90cmFjZV9zZXRhY3Rpb25zICI1LjE2OiBzdGVwIHdpdGhvdXQgY29sbGVjdGluZyBhbnl0aGluZyIgXAorCSIiIFwKKwkid2hpbGUtc3RlcHBpbmcgJHN0ZXBjb3VudCIgIl4kIiBcCisJImVuZCIgIiIKKworZ2RiX3Rlc3QgImluZm8gdHJhY2Vwb2ludHMiIFwKKwkiLiokdHJjcHQxLioweC4qXFtcdCBcXStcWzAtOVxdK1xbXHQgXF0rJHN0ZXBjb3VudFxbXHQgXF0rLippbiBnZGJfY190ZXN0LipcWyBcdFxdK0FjdGlvbnMgZm9yIHRyYWNlcG9pbnQgJHRyY3B0MTouKlxbIFx0XF0rd2hpbGUtc3RlcHBpbmcgJHN0ZXBjb3VudC4qXFsgXHRcXStlbmQuKlxbIFx0XF0rZW5kLioiIFwKKwkiNS4xNjogY29uZmlybSBhY3Rpb25zLCBzdGVwIHdpdGhvdXQgY29sbGVjdGluZyBhbnl0aGluZyIKKwpkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9saWIvZW1jLXN1cHBvcnQuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9saWIvZW1jLXN1cHBvcnQuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYmYyZGYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2xpYi9lbWMtc3VwcG9ydC5leHAKQEAgLTAsMCArMSwyMjMgQEAKK3Byb2MgZ2RiX2VtY19yZWFkdmFyIHsgdmFybmFtZSB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdDsKKworICAgIHNldCByZXN1bHQgLTE7CisgICAgc2VuZF9nZGIgInByaW50ICR2YXJuYW1lXG4iCisgICAgZ2RiX2V4cGVjdCA1IHsKKwktcmUgIlxbJFxdLio9IChcWzAtOVxdKykuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0IHJlc3VsdCAkZXhwZWN0X291dCgxLHN0cmluZyk7CisJfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyB9CisJZGVmYXVsdCB7IH0KKyAgICB9CisgICAgcmV0dXJuICRyZXN1bHQ7Cit9CisgICAgCitwcm9jIGdkYl9lbWNfZ2V0dHBudW0geyB0ZXN0bmFtZSB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdDsKKworICAgIGlmIHsgJHRlc3RuYW1lICE9ICIiIH0geworCWdkYl90ZXN0ICJ0cmFjZSAkdGVzdG5hbWUiICIiICIiCisgICAgfQorICAgIHJldHVybiBbZ2RiX2VtY19yZWFkdmFyICJcJHRwbnVtIl07Cit9CisKK3Byb2MgZ2RiX2VtY19zZXRhY3Rpb25zIHsgdGVzdG5hbWUgYWN0aW9ubmFtZSBhcmdzIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0OworCisgICAgc2V0IHN0YXRlIDA7CisgICAgc2V0IHN0YXR1cyAicGFzcyI7CisgICAgc2VuZF9nZGIgImFjdGlvbnMgJGFjdGlvbm5hbWVcbiI7CisgICAgc2V0IGV4cGVjdGVkX3Jlc3VsdCAiIjsKKyAgICBnZGJfZXhwZWN0IDUgeworCS1yZSAiTm8gdHJhY2Vwb2ludCBudW1iZXIgLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgJHRlc3RuYW1lCisJICAgIHJldHVybiAxOworCX0KKwktcmUgIkVudGVyIGFjdGlvbnMgZm9yIHRyYWNlcG9pbnQgJGFjdGlvbm5hbWUuKj4iIHsKKwkgICAgaWYgeyBbbGxlbmd0aCAkYXJnc10gPiAwIH0geworCQlzZXQgbGFzdGNvbW1hbmQgIltsaW5kZXggJGFyZ3MgJHN0YXRlXSI7CisJCXNlbmRfZ2RiICJbbGluZGV4ICRhcmdzICRzdGF0ZV1cbiI7CisJCWluY3Igc3RhdGU7CisJCXNldCBleHBlY3RlZF9yZXN1bHQgW2xpbmRleCAkYXJncyAkc3RhdGVdOworCQlpbmNyIHN0YXRlOworCSAgICB9IGVsc2UgeworCQlzZW5kX2dkYiAiZW5kXG4iOworCSAgICB9CisJICAgIGV4cF9jb250aW51ZTsKKwl9CisJLXJlICJcKC4qXFtcclxuXF0rKVxbIFx0XSo+ICQiIHsKKwkgICAgaWYgeyAkZXhwZWN0ZWRfcmVzdWx0ICE9ICIiIH0geworCQkjIFJlbW92ZSBlY2hvZWQgY29tbWFuZCBhbmQgaXRzIGFzc29jaWF0ZWQgbmV3bGluZS4KKwkJcmVnc3ViICJeXFteXHJcblxdK1xbXHJcblxdKyIgIiRleHBlY3Rfb3V0KDEsc3RyaW5nKSIgIiIgb3V0OworCQkjIFN0cmlwIG9mZiBhbnkgbmV3bGluZXMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorCQlyZWdzdWIgIlxbXHJcblxdKyQiICIkb3V0IiAiIiBvdXQ7CisJCXZlcmJvc2UgImV4cGVjdGVkICckZXhwZWN0ZWRfcmVzdWx0JywgZ290ICckb3V0JywgZXhwZWN0X291dCBpcyAnJGV4cGVjdF9vdXQoMSxzdHJpbmcpJyI7CisJCWlmICFbcmVnZXhwICRleHBlY3RlZF9yZXN1bHQgJG91dF0geworCQkgICAgc2V0IHN0YXR1cyAiZmFpbCI7CisJCX0KKwkJc2V0IGV4cGVjdGVkX3Jlc3VsdCAiIjsKKwkgICAgfQorCSAgICBpZiB7ICRzdGF0ZSA8IFtsbGVuZ3RoICRhcmdzXSB9IHsKKwkJc2VuZF9nZGIgIltsaW5kZXggJGFyZ3MgJHN0YXRlXVxuIjsKKwkJaW5jciBzdGF0ZTsKKwkJc2V0IGV4cGVjdGVkX3Jlc3VsdCBbbGluZGV4ICRhcmdzICRzdGF0ZV07CisJCWluY3Igc3RhdGU7CisJICAgIH0gZWxzZSB7CisJCXNlbmRfZ2RiICJlbmRcbiI7CisJCXNldCBleHBlY3RlZF9yZXN1bHQgIiI7CisJICAgIH0KKwkgICAgZXhwX2NvbnRpbnVlOworCX0KKwktcmUgIlwoLipcKSRnZGJfcHJvbXB0ICQiIHsKKwkgICAgaWYgeyAkZXhwZWN0ZWRfcmVzdWx0ICE9ICIiIH0geworCQlpZiAhW3JlZ2V4cCAkZXhwZWN0ZWRfcmVzdWx0ICRleHBlY3Rfb3V0KDEsc3RyaW5nKV0geworCQkgICAgc2V0IHN0YXR1cyAiZmFpbCI7CisJCX0KKwkJc2V0IGV4cGVjdGVkX3Jlc3VsdCAiIjsKKwkgICAgfQorCSAgICBpZiB7IFtsbGVuZ3RoICRhcmdzXSA8ICRzdGF0ZSB9IHsKKwkJc2V0IHN0YXR1cyAiZmFpbCI7CisJICAgIH0KKwl9CisJZGVmYXVsdCB7CisJICAgIHNldCBzdGF0dXMgImZhaWwiOworCX0KKyAgICB9CisgICAgaWYgeyAkdGVzdG5hbWUgIT0gIiIgfSB7CisJJHN0YXR1cyAkdGVzdG5hbWU7CisgICAgfQorICAgIGlmIHsgJHN0YXR1cyA9PSAicGFzcyIgfSB0aGVuIHsgCisJcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gMTsKKyAgICB9Cit9CisKKyMKKyMgdGVzdCBjb2xsZWN0IGNvbW1hbmQKKyMKKworcHJvYyBnZGJfZW1jX3RyYWNldGVzdF9jb2xsZWN0IHsgYXJnMSBtc2dzdHJpbmcgfSB7CisgICAgZ2xvYmFsIGRlY2ltYWwKKyAgICBnbG9iYWwgZ2RiX3Byb21wdDsKKworICAgIHNldCB0ZXN0c3RhdGUgMAorICAgIGdkYl9leHBlY3QgMzAgeworICAgICAgICAtcmUgIkVudGVyIGFjdGlvbnMgZm9yIHRyYWNlcG9pbnQgJGRlY2ltYWwuKj4gJCIgeworICAgICAgICAgICAgc2VuZF9nZGIgImNvbGxlY3QgJGFyZzFcbiIKKyAgICAgICAgICAgIGluY3IgdGVzdHN0YXRlOworICAgICAgICAgICAgZXhwX2NvbnRpbnVlCisgICAgICAgIH0KKyAgICAgICAgLXJlICI+ICQiIHsKKyAgICAgICAgICAgIGlmIHsgJHRlc3RzdGF0ZSA9PSAxIH0geworICAgICAgICAgICAgICAgIHNlbmRfZ2RiICJlbmRcbiIKKwkJaW5jciB0ZXN0c3RhdGU7CisgICAgICAgICAgICAgICAgZXhwX2NvbnRpbnVlCisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgICBmYWlsICIkbXNnc3RyaW5nIgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBpZiB7ICR0ZXN0c3RhdGUgPT0gMiB9IHsKKyAgICAgICAgICAgICAgICBwYXNzICIkbXNnc3RyaW5nIjsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICAgIGZhaWwgIiRtc2dzdHJpbmciOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlZmF1bHQgeyAKKyAgICAgICAgICAgIGZhaWwgIiRtc2dzdHJpbmcgKGRlZmF1bHQpIjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZWdzdWIgLWFsbCAiKFxbKCRAKispXF0pIiAiY29sbGVjdCAkYXJnMSIgIlxbXFwxXF0iIGFyZzFfcmVnZXhwOworICAgIGdkYl90ZXN0ICJpbmZvIHRyYWNlcG9pbnRzIiAiLiokYXJnMV9yZWdleHAuKiIgIiRtc2dzdHJpbmcgaW5mbyB0cmFjZXBvaW50IgorfQorCitwcm9jIGdkYl9kZWxldGVfdHJhY2Vwb2ludHMgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdDsKKworICAgIHNlbmRfZ2RiICJkZWxldGUgdHJhY2Vwb2ludHNcbiIKKyAgICBnZGJfZXhwZWN0IDMwIHsKKwktcmUgIkRlbGV0ZSBhbGwgdHJhY2Vwb2ludHMuKnkgb3Igbi4qJCIgeworCSAgICBzZW5kX2dkYiAieVxuIgorCSAgICBleHBfY29udGludWU7CisJfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyB9CisJdGltZW91dCB7IGZhaWwgImRlbGV0ZSBhbGwgdHJhY2Vwb2ludHMgKHRpbWVvdXQpIiB9CisgICAgfQorfQorCisKKyMgU2VuZCBlYWNoIGNvbW1hbmQgaW4gdGhlIGxpc3QgQ01ETElTVCB0byBnZGIuIElmIHdlIHNlZSB0aGUgc3RyaW5nCisjICJlcnJvciIgb3IgIndhcm5pbmciIGZyb20gZ2RiLCB3ZSBhc3N1bWUgYW4gZXJyb3IgaGFzIG9jY3VyZWQgYW5kCisjIHJldHVybiBhIG5vbi16ZXJvIHJlc3VsdC4gQWxsIG9mIHRoZSBjb21tYW5kcyBpbiBDTURMSVNUIGFyZSBhbHdheXMKKyMgc2VudCwgZXZlbiBpZiBhbiBlcnJvciBvY2N1cnMuCisjIElmIFRFU1ROQU1FIGlzIG5vbi1udWxsLCB3ZSBjYWxsIHBhc3Mgb3IgZmFpbCB3aXRoIHRoZSBzdHJpbmcgaW4gVEVTVE5BTUUKKyMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IGFuIGVycm9yL3dhcm5pbmcgaGFzIG9jY3VycmVkLgorIworcHJvYyBnZGJfZG9fY21kbGlzdCB7IGNtZGxpc3QgdGVzdG5hbWUgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQ7CisKKyAgICBzZXQgc3RhdHVzIDA7CisKKyAgICBmb3JlYWNoIHggJGNtZGxpc3QgeworCXNlbmRfZ2RiICIkeFxuIjsKKwlnZGJfZXhwZWN0IDYwIHsKKwkgICAgLXJlICJcW0VlXF1ycm9yfFxbV3dcXWFybmluZyIgeworCQlzZXQgc3RhdHVzIDE7CisJCWV4cF9jb250aW51ZTsKKwkgICAgfQorCSAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgfQorCSAgICAtcmUgIlxbXHJcblxdXFsgXHRcXSo+ICokIiB7IH0KKwl9CisgICAgfQorICAgIGlmIHsgJHRlc3RuYW1lICE9ICIiIH0geworCWlmIHsgJHN0YXR1cyA9PSAwIH0geworCSAgICBwYXNzICIkdGVzdG5hbWUiOworCX0gZWxzZSB7CisJICAgIGZhaWwgIiR0ZXN0bmFtZSI7CisJfQorICAgIH0KKyAgICByZXR1cm4gJHN0YXR1czsKK30KKworIworIyBHaXZlbiB0aGUgZmlsZSBGSUxFTkFNRSwgd2UgcmVhZCBpdCBhcyBhIGxpc3Qgb2YgY29tbWFuZHMgYW5kIGdlbmVyYXRlCisjIGEgbGlzdCBzdWl0YWJsZSBmb3IgdXNlIGJ5IGdkYl9kb19jbWRsaXN0LiBMaW5lcyBiZWdpbm5pbmcgd2l0aCAjIGFyZQorIyBpZ25vcmVkOyBibGFuayBsaW5lcyBhcmUgaW50ZXJwcmV0ZWQgYXMgZW1wdHkgbGluZXMgdG8gYmUgc2VudCB0byBnZGIuCisjCitwcm9jIGdkYl9wcm9jZXNzX2NtZGZpbGUgeyBmaWxlbmFtZSB9IHsKKyAgICBzZXQgaWQgW29wZW4gJGZpbGVuYW1lICJyIl07CisgICAgaWYgeyAkaWQgPCAwIH0geworCXJldHVybiAiIjsKKyAgICB9CisgICAgc2V0IHJlc3VsdCB7fTsKKyAgICB3aGlsZSB7IFtnZXRzICRpZCBsaW5lXSA+PSAwIH0geworCWlmIFtyZWdleHAgIl4jIiAkbGluZV0geworCSAgICBjb250aW51ZTsKKwl9CisJc2V0IHJlc3VsdCBbY29uY2F0ICRyZXN1bHQgW2xpc3QgIiRsaW5lIl1dOworICAgIH0KKyAgICBjbG9zZSAkaWQ7CisgICAgcmV0dXJuICRyZXN1bHQ7Cit9CisKKyMgZ2RiX2ZpbmRfY190ZXN0X2Jhc2VsaW5lCisjIHJldHVybnMgLTEgb24gZmFpbHVyZSAoQ0FMTEVSIE1VU1QgQ0hFQ0sgUkVUVVJOISkKK3Byb2MgZ2RiX2ZpbmRfY190ZXN0X2Jhc2VsaW5lIHsgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQ7CisKKyAgICBzZXQgZ2RiX2NfdGVzdF9iYXNlbGluZSAtMTsKKworICAgIHNlbmRfZ2RiICJsaXN0IGdkYl9jX3Rlc3RcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgInZvaWQuKnA1LC4qdm9pZC4qcDYuKlxbXHJcblxdKFxbMC05XF0rKVxbXHQgXF0rXHsuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgc2V0IGdkYl9jX3Rlc3RfYmFzZWxpbmUgJGV4cGVjdF9vdXQoMSxzdHJpbmcpCisJfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyB9CisJZGVmYXVsdCB7IH0KKyAgICB9CisgICAgcmV0dXJuICRnZGJfY190ZXN0X2Jhc2VsaW5lOworfQorCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvbGliL2dkYi5leHAgYi9nZGIvdGVzdHN1aXRlL2xpYi9nZGIuZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MWFiYjYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2xpYi9nZGIuZXhwCkBAIC0wLDAgKzEsMTMzNCBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTQsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisKKyMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86CisjIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1CisKKyMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IEZyZWQgRmlzaC4gKGZuZkBjeWdudXMuY29tKQorCisjIEdlbmVyaWMgZ2RiIHN1YnJvdXRpbmVzIHRoYXQgc2hvdWxkIHdvcmsgZm9yIGFueSB0YXJnZXQuICBJZiB0aGVzZQorIyBuZWVkIHRvIGJlIG1vZGlmaWVkIGZvciBhbnkgdGFyZ2V0LCBpdCBjYW4gYmUgZG9uZSB3aXRoIGEgdmFyaWFibGUKKyMgb3IgYnkgcGFzc2luZyBhcmd1bWVudHMuCisKK2xvYWRfbGliIGxpYmdsb3NzLmV4cAorCitnbG9iYWwgR0RCCitnbG9iYWwgQ0hJTExfTElCCitnbG9iYWwgQ0hJTExfUlQwCisKK2lmICFbaW5mbyBleGlzdHMgQ0hJTExfTElCXSB7CisgICAgc2V0IENISUxMX0xJQiBbZmluZGZpbGUgJGJhc2VfZGlyLy4uLy4uL2djYy9jaC9ydW50aW1lL2xpYmNoaWxsLmEgIiRiYXNlX2Rpci8uLi8uLi9nY2MvY2gvcnVudGltZS9saWJjaGlsbC5hIiBbdHJhbnNmb3JtIC1sY2hpbGxdXQorfQordmVyYm9zZSAidXNpbmcgQ0hJTExfTElCID0gJENISUxMX0xJQiIgMgoraWYgIVtpbmZvIGV4aXN0cyBDSElMTF9SVDBdIHsKKyAgICBzZXQgQ0hJTExfUlQwIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vLi4vZ2NjL2NoL3J1bnRpbWUvY2hpbGxydDAubyAiJGJhc2VfZGlyLy4uLy4uL2djYy9jaC9ydW50aW1lL2NoaWxscnQwLm8iICIiXQorfQordmVyYm9zZSAidXNpbmcgQ0hJTExfUlQwID0gJENISUxMX1JUMCIgMgorCitpZiBbaW5mbyBleGlzdHMgVE9PTF9FWEVDVVRBQkxFXSB7CisgICAgc2V0IEdEQiAkVE9PTF9FWEVDVVRBQkxFOworfQoraWYgIVtpbmZvIGV4aXN0cyBHREJdIHsKKyAgICBpZiAhW2lzX3JlbW90ZSBob3N0XSB7CisJc2V0IEdEQiBbZmluZGZpbGUgJGJhc2VfZGlyLy4uLy4uL2dkYi9nZGIgIiRiYXNlX2Rpci8uLi8uLi9nZGIvZ2RiIiBbdHJhbnNmb3JtIGdkYl1dCisgICAgfSBlbHNlIHsKKwlzZXQgR0RCIFt0cmFuc2Zvcm0gZ2RiXTsKKyAgICB9Cit9Cit2ZXJib3NlICJ1c2luZyBHREIgPSAkR0RCIiAyCisKK2dsb2JhbCBHREJGTEFHUworaWYgIVtpbmZvIGV4aXN0cyBHREJGTEFHU10geworICAgIHNldCBHREJGTEFHUyAiLW54IgorfQordmVyYm9zZSAidXNpbmcgR0RCRkxBR1MgPSAkR0RCRkxBR1MiIDIKKworIyBUaGUgdmFyaWFibGUgcHJvbXB0IGlzIGEgcmVnZXhwIHdoaWNoIG1hdGNoZXMgdGhlIGdkYiBwcm9tcHQuICBTZXQgaXQgaWYgaXQKKyMgaXMgbm90IGFscmVhZHkgc2V0LgorZ2xvYmFsIGdkYl9wcm9tcHQKK2lmICFbaW5mbyBleGlzdHMgcHJvbXB0XSB0aGVuIHsKKyAgICBzZXQgZ2RiX3Byb21wdCAiXFsoXF1nZGJcWylcXSIKK30KKworIworIyBnZGJfdmVyc2lvbiAtLSBleHRyYWN0IGFuZCBwcmludCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgR0RCCisjCitwcm9jIGRlZmF1bHRfZ2RiX3ZlcnNpb24ge30geworICAgIGdsb2JhbCBHREIKKyAgICBnbG9iYWwgR0RCRkxBR1MKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorICAgIHNldCBmaWxlaWQgW29wZW4gImdkYl9jbWQiIHddOworICAgIHB1dHMgJGZpbGVpZCAicSI7CisgICAgY2xvc2UgJGZpbGVpZDsKKyAgICBzZXQgY21kZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgImdkYl9jbWQiXTsKKyAgICBzZXQgb3V0cHV0IFtyZW1vdGVfZXhlYyBob3N0ICIkR0RCIC1udyAtLWNvbW1hbmQgJGNtZGZpbGUiXQorICAgIHJlbW90ZV9maWxlIGJ1aWxkIGRlbGV0ZSAiZ2RiX2NtZCI7CisgICAgcmVtb3RlX2ZpbGUgaG9zdCBkZWxldGUgIiRjbWRmaWxlIjsKKyAgICBzZXQgdG1wIFtsaW5kZXggJG91dHB1dCAxXTsKKyAgICBzZXQgdmVyc2lvbiAiIgorICAgIHJlZ2V4cCAiIFxbMC05XF1cW14gXHRcblxyXF0rIiAiJHRtcCIgdmVyc2lvbgorICAgIGlmICFbaXNfcmVtb3RlIGhvc3RdIHsKKwljbG9uZV9vdXRwdXQgIlt3aGljaCAkR0RCXSB2ZXJzaW9uICR2ZXJzaW9uICRHREJGTEFHU1xuIgorICAgIH0gZWxzZSB7CisJY2xvbmVfb3V0cHV0ICIkR0RCIG9uIHJlbW90ZSBob3N0IHZlcnNpb24gJHZlcnNpb24gJEdEQkZMQUdTXG4iCisgICAgfQorfQorCitwcm9jIGdkYl92ZXJzaW9uIHsgfSB7CisgICAgcmV0dXJuIFtkZWZhdWx0X2dkYl92ZXJzaW9uXTsKK30KKworIworIyBnZGJfdW5sb2FkIC0tIHVubG9hZCBhIGZpbGUgaWYgb25lIGlzIGxvYWRlZAorIworCitwcm9jIGdkYl91bmxvYWQge30geworICAgIGdsb2JhbCB2ZXJib3NlCisgICAgZ2xvYmFsIEdEQgorICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgc2VuZF9nZGIgImZpbGVcbiIKKyAgICBnZGJfZXhwZWN0IDYwIHsKKwktcmUgIk5vIGV4ZWN1dGFibGUgZmlsZSBub3dcW15cclxuXF0qXFtcclxuXF0iIHsgZXhwX2NvbnRpbnVlIH0KKwktcmUgIk5vIHN5bWJvbCBmaWxlIG5vd1xbXlxyXG5cXSpcW1xyXG5cXSIgeyBleHBfY29udGludWUgfQorCS1yZSAiQSBwcm9ncmFtIGlzIGJlaW5nIGRlYnVnZ2VkIGFscmVhZHkuLipLaWxsIGl0Lip5IG9yIG4uICQiXAorCSAgICB7IHNlbmRfZ2RiICJ5XG4iCisJCXZlcmJvc2UgIlx0XHRLaWxsaW5nIHByZXZpb3VzIHByb2dyYW0gYmVpbmcgZGVidWdnZWQiCisJICAgIGV4cF9jb250aW51ZQorCX0KKwktcmUgIkRpc2NhcmQgc3ltYm9sIHRhYmxlIGZyb20gLip5IG9yIG4uKiQiIHsKKwkgICAgc2VuZF9nZGIgInlcbiIKKwkgICAgZXhwX2NvbnRpbnVlCisJfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIge30KKwl0aW1lb3V0IHsKKwkgICAgcGVycm9yICJjb3VsZG4ndCB1bmxvYWQgZmlsZSBpbiAkR0RCICh0aW1lZCBvdXQpLiIKKwkgICAgcmV0dXJuIC0xCisJfQorICAgIH0KK30KKworIyBNYW55IG9mIHRoZSB0ZXN0cyBkZXBlbmQgb24gc2V0dGluZyBicmVha3BvaW50cyBhdCB2YXJpb3VzIHBsYWNlcyBhbmQKKyMgcnVubmluZyB1bnRpbCB0aGF0IGJyZWFrcG9pbnQgaXMgcmVhY2hlZC4gIEF0IHRpbWVzLCB3ZSB3YW50IHRvIHN0YXJ0CisjIHdpdGggYSBjbGVhbi1zbGF0ZSB3aXRoIHJlc3BlY3QgdG8gYnJlYWtwb2ludHMsIHNvIHRoaXMgdXRpbGl0eSBwcm9jIAorIyBsZXRzIHVzIGRvIHRoaXMgd2l0aG91dCBkdXBsaWNhdGluZyB0aGlzIGNvZGUgZXZlcnl3aGVyZS4KKyMKKworcHJvYyBkZWxldGVfYnJlYWtwb2ludHMge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBzZW5kX2dkYiAiZGVsZXRlIGJyZWFrcG9pbnRzXG4iCisgICAgZ2RiX2V4cGVjdCAzMCB7CisJIC1yZSAiRGVsZXRlIGFsbCBicmVha3BvaW50cy4qeSBvciBuLiokIiB7CisJICAgIHNlbmRfZ2RiICJ5XG4iOworCSAgICBleHBfY29udGludWUKKwl9CisJIC1yZSAiJGdkYl9wcm9tcHQgJCIgeyAjIFRoaXMgaGFwcGVucyBpZiB0aGVyZSB3ZXJlIG5vIGJyZWFrcG9pbnRzCisJICAgIH0KKwkgdGltZW91dCB7IHBlcnJvciAiRGVsZXRlIGFsbCBicmVha3BvaW50cyBpbiBkZWxldGVfYnJlYWtwb2ludHMgKHRpbWVvdXQpIiA7IHJldHVybiB9CisgICAgfQorICAgIHNlbmRfZ2RiICJpbmZvIGJyZWFrcG9pbnRzXG4iCisgICAgZ2RiX2V4cGVjdCAzMCB7CisJIC1yZSAiTm8gYnJlYWtwb2ludHMgb3Igd2F0Y2hwb2ludHMuLiokZ2RiX3Byb21wdCAkIiB7fQorCSAtcmUgIiRnZGJfcHJvbXB0ICQiIHsgcGVycm9yICJicmVha3BvaW50cyBub3QgZGVsZXRlZCIgOyByZXR1cm4gfQorCSAtcmUgIkRlbGV0ZSBhbGwgYnJlYWtwb2ludHMuKm9yIG4uKiQiIHsKKwkgICAgc2VuZF9nZGIgInlcbiI7CisJICAgIGV4cF9jb250aW51ZQorCX0KKwkgdGltZW91dCB7IHBlcnJvciAiaW5mbyBicmVha3BvaW50cyAodGltZW91dCkiIDsgcmV0dXJuIH0KKyAgICB9Cit9CisKKworIworIyBHZW5lcmljIHJ1biBjb21tYW5kLgorIworIyBUaGUgc2Vjb25kIHBhdHRlcm4gYmVsb3cgbWF0Y2hlcyB1cCB0byB0aGUgZmlyc3QgbmV3bGluZSAqb25seSouCisjIFVzaW5nIGBgLiokJycgY291bGQgc3dhbGxvdyB1cCBvdXRwdXQgdGhhdCB3ZSBhdHRlbXB0IHRvIG1hdGNoCisjIGVsc2V3aGVyZS4KKyMKK3Byb2MgZ2RiX3J1bl9jbWQge2FyZ3N9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGJfaW5pdF9jb21tYW5kXSB7CisJc2VuZF9nZGIgIlt0YXJnZXRfaW5mbyBnZGJfaW5pdF9jb21tYW5kXVxuIjsKKwlnZGJfZXhwZWN0IDMwIHsKKwkgICAgLXJlICIkZ2RiX3Byb21wdCAkIiB7IH0KKwkgICAgZGVmYXVsdCB7CisJCXBlcnJvciAiZ2RiX2luaXRfY29tbWFuZCBmb3IgdGFyZ2V0IGZhaWxlZCI7CisJCXJldHVybjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIHVzZV9nZGJfc3R1Yl0geworCWlmIFt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiLGRvX3JlbG9hZF9vbl9ydW5dIHsKKwkgICAgIyBBY2NvcmRpbmcgdG8gU3R1LCB0aGlzIHdpbGwgYWx3YXlzIHdvcmsuCisJICAgIGdkYl9sb2FkICIiOworCSAgICBzZW5kX2dkYiAiY29udGludWVcbiI7CisJICAgIGdkYl9leHBlY3QgNjAgeworCQktcmUgIkNvbnRpbnVcW15cclxuXF0qXFtcclxuXF0iIHt9CisJCWRlZmF1bHQge30KKwkgICAgfQorCSAgICByZXR1cm47CisJfQorCisJaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGIsc3RhcnRfc3ltYm9sXSB7CisJICAgIHNldCBzdGFydCBbdGFyZ2V0X2luZm8gZ2RiLHN0YXJ0X3N5bWJvbF07CisJfSBlbHNlIHsKKwkgICAgc2V0IHN0YXJ0ICJzdGFydCI7CisJfQorCXNlbmRfZ2RiICAianVtcCAqJHN0YXJ0XG4iCisJZ2RiX2V4cGVjdCAzMCB7CisJICAgIC1yZSAiQ29udGludWluZyBhdCBcW15cclxuXF0qXFtcclxuXF0iIHsKKwkJaWYgIVt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiX3N0dWJdIHsKKwkJICAgIHJldHVybjsKKwkJfQorCSAgICB9CisJICAgIC1yZSAiTm8gc3ltYm9sIFwic3RhcnRcIiBpbiBjdXJyZW50LiokZ2RiX3Byb21wdCAkIiB7CisJCXNlbmRfZ2RiICJqdW1wICpfc3RhcnRcbiI7CisJCWV4cF9jb250aW51ZTsKKwkgICAgfQorCSAgICAtcmUgIk5vIHN5bWJvbCBcIl9zdGFydFwiIGluIGN1cnJlbnQuKiRnZGJfcHJvbXB0ICQiIHsKKwkJcGVycm9yICJDYW4ndCBmaW5kIHN0YXJ0IHN5bWJvbCB0byBydW4gaW4gZ2RiX3J1biI7CisJCXJldHVybjsKKwkgICAgfQorCSAgICAtcmUgIkxpbmUuKiBKdW1wIGFueXdheS4qeSBvciBuLiAkIiB7CisJCXNlbmRfZ2RiICJ5XG4iCisJCWV4cF9jb250aW51ZTsKKyAgICAgICAgICAgIH0KKwkgICAgLXJlICJObyBzeW1ib2wuKmNvbnRleHQuKiRnZGJfcHJvbXB0ICQiIHt9CisJICAgIC1yZSAiVGhlIHByb2dyYW0gaXMgbm90IGJlaW5nIHJ1bi4qJGdkYl9wcm9tcHQgJCIgeworCQlnZGJfbG9hZCAiIjsKKwkJc2VuZF9nZGIgImp1bXAgKiRzdGFydFxuIjsKKwkJZXhwX2NvbnRpbnVlOworCSAgICB9CisJICAgIHRpbWVvdXQgeyBwZXJyb3IgIkp1bXAgdG8gc3RhcnQoKSBmYWlsZWQgKHRpbWVvdXQpIjsgcmV0dXJuIH0KKwl9CisJaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGJfc3R1Yl0geworCSAgICBnZGJfZXhwZWN0IDYwIHsKKwkJLXJlICIkZ2RiX3Byb21wdCAkIiB7CisJCSAgICBzZW5kX2dkYiAiY29udGludWVcbiIKKwkJfQorCSAgICB9CisJfQorCXJldHVybgorICAgIH0KKyAgICBzZW5kX2dkYiAicnVuICRhcmdzXG4iCisjIFRoaXMgZG9lc24ndCB3b3JrIHF1aXRlIHJpZ2h0IHlldC4KKyAgICBnZGJfZXhwZWN0IDYwIHsKKwktcmUgIlRoZSBwcm9ncmFtIC4qIGhhcyBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS4qeSBvciBuLiAkIiB7CisJICAgIHNlbmRfZ2RiICJ5XG4iCisJICAgIGV4cF9jb250aW51ZQorCX0KKwktcmUgIlN0YXJ0aW5nIHByb2dyYW06IFxbXlxyXG5cXSoiIHt9CisgICAgfQorfQorCitwcm9jIGdkYl9icmVha3BvaW50IHsgZnVuY3Rpb24gfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgZGVjaW1hbAorCisgICAgc2VuZF9nZGIgImJyZWFrICRmdW5jdGlvblxuIgorICAgICMgVGhlIGZpcnN0IHR3byByZWdleHBzIGFyZSB3aGF0IHdlIGdldCB3aXRoIC1nLCB0aGUgdGhpcmQgaXMgd2l0aG91dCAtZy4KKyAgICBnZGJfZXhwZWN0IDMwIHsKKwktcmUgIkJyZWFrcG9pbnQgXFswLTlcXSogYXQgLio6IGZpbGUgLiosIGxpbmUgJGRlY2ltYWwuXHJcbiRnZGJfcHJvbXB0ICQiIHt9CisJLXJlICJCcmVha3BvaW50IFxbMC05XF0qOiBmaWxlIC4qLCBsaW5lICRkZWNpbWFsLlxyXG4kZ2RiX3Byb21wdCAkIiB7fQorCS1yZSAiQnJlYWtwb2ludCBcWzAtOVxdKiBhdCAuKiRnZGJfcHJvbXB0ICQiIHt9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IGZhaWwgInNldHRpbmcgYnJlYWtwb2ludCBhdCAkZnVuY3Rpb24iIDsgcmV0dXJuIDAgfQorCXRpbWVvdXQgeyBmYWlsICJzZXR0aW5nIGJyZWFrcG9pbnQgYXQgJGZ1bmN0aW9uICh0aW1lb3V0KSIgOyByZXR1cm4gMCB9CisgICAgfQorICAgIHJldHVybiAxOworfSAgICAKKworIyBTZXQgYnJlYWtwb2ludCBhdCBmdW5jdGlvbiBhbmQgcnVuIGdkYiB1bnRpbCBpdCBicmVha3MgdGhlcmUuCisjIFNpbmNlIHRoaXMgaXMgdGhlIG9ubHkgYnJlYWtwb2ludCB0aGF0IHdpbGwgYmUgc2V0LCBpZiBpdCBzdG9wcworIyBhdCBhIGJyZWFrcG9pbnQsIHdlIHdpbGwgYXNzdW1lIGl0IGlzIHRoZSBvbmUgd2Ugd2FudC4gIFdlIGNhbid0CisjIGp1c3QgY29tcGFyZSB0byAiZnVuY3Rpb24iIGJlY2F1c2UgaXQgbWlnaHQgYmUgYSBmdWxseSBxdWFsaWZpZWQsCisjIHNpbmdsZSBxdW90ZWQgQysrIGZ1bmN0aW9uIHNwZWNpZmllci4KKworcHJvYyBydW50byB7IGZ1bmN0aW9uIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIGRlbGV0ZV9icmVha3BvaW50cworCisgICAgaWYgIVtnZGJfYnJlYWtwb2ludCAkZnVuY3Rpb25dIHsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBnZGJfcnVuX2NtZAorICAgIAorICAgICMgdGhlICJhdCBmb28uYzozNiIgb3V0cHV0IHdlIGdldCB3aXRoIC1nLgorICAgICMgdGhlICJpbiBmdW5jIiBvdXRwdXQgd2UgZ2V0IHdpdGhvdXQgLWcuCisgICAgZ2RiX2V4cGVjdCAzMCB7CisJLXJlICJCcmVhay4qIGF0IC4qOiRkZWNpbWFsLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHJldHVybiAxCisJfQorCS1yZSAiQnJlYWtwb2ludCBcWzAtOVxdKiwgXFswLTl4YS1mXF0qIGluIC4qJGdkYl9wcm9tcHQgJCIgeyAKKwkgICAgcmV0dXJuIDEKKwl9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IAorCSAgICBmYWlsICJydW5uaW5nIHRvICRmdW5jdGlvbiBpbiBydW50byIKKwkgICAgcmV0dXJuIDAKKwl9CisJdGltZW91dCB7IAorCSAgICBmYWlsICJydW5uaW5nIHRvICRmdW5jdGlvbiBpbiBydW50byAodGltZW91dCkiCisJICAgIHJldHVybiAwCisJfQorICAgIH0KKyAgICByZXR1cm4gMQorfQorCisjCisjIHJ1bnRvX21haW4gLS0gYXNrIGdkYiB0byBydW4gdW50aWwgd2UgaGl0IGEgYnJlYWtwb2ludCBhdCBtYWluLgorIwkJVGhlIGNhc2Ugd2hlcmUgdGhlIHRhcmdldCB1c2VzIHN0dWJzIGhhcyB0byBiZSBoYW5kbGVkCisjCQlzcGVjaWFsbHktLWlmIGl0IHVzZXMgc3R1YnMsIGFzc3VtaW5nIHdlIGhpdAorIwkJYnJlYWtwb2ludCgpIGFuZCBqdXN0IHN0ZXAgb3V0IG9mIHRoZSBmdW5jdGlvbi4KKyMKK3Byb2MgcnVudG9fbWFpbiB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIGlmICFbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYl9zdHViXSB7CisJcmV0dXJuIFtydW50byBtYWluXQorICAgIH0JCQkKKworICAgIGRlbGV0ZV9icmVha3BvaW50cworCisgICAgZ2RiX3N0ZXBfZm9yX3N0dWI7CisKKyAgICByZXR1cm4gMQorfQorCisjIGdkYl90ZXN0IENPTU1BTkQgUEFUVEVSTiBNRVNTQUdFIC0tIHNlbmQgYSBjb21tYW5kIHRvIGdkYjsgdGVzdCB0aGUgcmVzdWx0LgorIworIyBDT01NQU5EIGlzIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUsIHNlbmQgdG8gR0RCIHdpdGggc2VuZF9nZGIuICBJZgorIyAgIHRoaXMgaXMgdGhlIG51bGwgc3RyaW5nIG5vIGNvbW1hbmQgaXMgc2VudC4KKyMgUEFUVEVSTiBpcyB0aGUgcGF0dGVybiB0byBtYXRjaCBmb3IgYSBQQVNTLCBhbmQgbXVzdCBOT1QgaW5jbHVkZQorIyAgIHRoZSBcclxuIHNlcXVlbmNlIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgZ2RiIHByb21wdC4KKyMgTUVTU0FHRSBpcyBhbiBvcHRpb25hbCBtZXNzYWdlIHRvIGJlIHByaW50ZWQuICBJZiB0aGlzIGlzCisjICAgb21pdHRlZCwgdGhlbiB0aGUgcGFzcy9mYWlsIG1lc3NhZ2VzIHVzZSB0aGUgY29tbWFuZCBzdHJpbmcgYXMgdGhlCisjICAgbWVzc2FnZS4gIChJZiB0aGlzIGlzIHRoZSBlbXB0eSBzdHJpbmcsIHRoZW4gc29tZXRpbWVzIHdlIGRvbid0CisjICAgY2FsbCBwYXNzIG9yIGZhaWwgYXQgYWxsOyBJIGRvbid0IHVuZGVyc3RhbmQgdGhpcyBhdCBhbGwuKQorIworIyBSZXR1cm5zOgorIyAgICAxIGlmIHRoZSB0ZXN0IGZhaWxlZCwKKyMgICAgMCBpZiB0aGUgdGVzdCBwYXNzZXMsCisjICAgLTEgaWYgdGhlcmUgd2FzIGFuIGludGVybmFsIGVycm9yLgorIyAgCitwcm9jIGdkYl90ZXN0IHsgYXJncyB9IHsKKyAgICBnbG9iYWwgdmVyYm9zZQorICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIEdEQgorICAgIHVwdmFyIHRpbWVvdXQgdGltZW91dAorCisgICAgaWYgW2xsZW5ndGggJGFyZ3NdPjIgdGhlbiB7CisJc2V0IG1lc3NhZ2UgW2xpbmRleCAkYXJncyAyXQorICAgIH0gZWxzZSB7CisJc2V0IG1lc3NhZ2UgW2xpbmRleCAkYXJncyAwXQorICAgIH0KKyAgICBzZXQgY29tbWFuZCBbbGluZGV4ICRhcmdzIDBdCisgICAgc2V0IHBhdHRlcm4gW2xpbmRleCAkYXJncyAxXQorCisgICAgaWYgW2xsZW5ndGggJGFyZ3NdPT01IHsKKwlzZXQgcXVlc3Rpb25fc3RyaW5nIFtsaW5kZXggJGFyZ3MgM107CisJc2V0IHJlc3BvbnNlX3N0cmluZyBbbGluZGV4ICRhcmdzIDRdOworICAgIH0gZWxzZSB7CisJc2V0IHF1ZXN0aW9uX3N0cmluZyAiXkZPT0JBUiQiCisgICAgfQorCisgICAgaWYgJHZlcmJvc2U+MiB0aGVuIHsKKwlzZW5kX3VzZXIgIlNlbmRpbmcgXCIkY29tbWFuZFwiIHRvIGdkYlxuIgorCXNlbmRfdXNlciAiTG9va2luZyB0byBtYXRjaCBcIiRwYXR0ZXJuXCJcbiIKKwlzZW5kX3VzZXIgIk1lc3NhZ2UgaXMgXCIkbWVzc2FnZVwiXG4iCisgICAgfQorCisgICAgc2V0IHJlc3VsdCAtMQorICAgIHNldCBzdHJpbmcgIiR7Y29tbWFuZH1cbiI7CisgICAgaWYgeyAkY29tbWFuZCAhPSAiIiB9IHsKKwl3aGlsZSB7ICIkc3RyaW5nIiAhPSAiIiB9IHsKKwkgICAgc2V0IGZvbyBbc3RyaW5nIGZpcnN0ICJcbiIgIiRzdHJpbmciXTsKKwkgICAgc2V0IGxlbiBbc3RyaW5nIGxlbmd0aCAiJHN0cmluZyJdOworCSAgICBpZiB7ICRmb28gPCBbZXhwciAkbGVuIC0gMV0gfSB7CisJCXNldCBzdHIgW3N0cmluZyByYW5nZSAiJHN0cmluZyIgMCAkZm9vXTsKKwkJaWYgeyBbc2VuZF9nZGIgIiRzdHIiXSAhPSAiIiB9IHsKKwkJICAgIGdsb2JhbCBzdXBwcmVzc19mbGFnOworCisJCSAgICBpZiB7ICEgJHN1cHByZXNzX2ZsYWcgfSB7CisJCQlwZXJyb3IgIkNvdWxkbid0IHNlbmQgJGNvbW1hbmQgdG8gR0RCLiI7CisJCSAgICB9CisJCSAgICBmYWlsICIkbWVzc2FnZSI7CisJCSAgICByZXR1cm4gJHJlc3VsdDsKKwkJfQorCQlnZGJfZXhwZWN0IDIgeworCQkgICAgLXJlICJcW1xyXG5cXSIgeyB9CisJCSAgICB0aW1lb3V0IHsgfQorCQl9CisJCXNldCBzdHJpbmcgW3N0cmluZyByYW5nZSAiJHN0cmluZyIgW2V4cHIgJGZvbyArIDFdIGVuZF07CisJICAgIH0gZWxzZSB7CisJCWJyZWFrOworCSAgICB9CisJfQorCWlmIHsgIiRzdHJpbmciICE9ICIiIH0geworCSAgICBpZiB7IFtzZW5kX2dkYiAiJHN0cmluZyJdICE9ICIiIH0geworCQlnbG9iYWwgc3VwcHJlc3NfZmxhZzsKKworCQlpZiB7ICEgJHN1cHByZXNzX2ZsYWcgfSB7CisJCSAgICBwZXJyb3IgIkNvdWxkbid0IHNlbmQgJGNvbW1hbmQgdG8gR0RCLiI7CisJCX0KKwkJZmFpbCAiJG1lc3NhZ2UiOworCQlyZXR1cm4gJHJlc3VsdDsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiBbaW5mbyBleGlzdHMgdGltZW91dF0geworCXNldCB0bXQgJHRpbWVvdXQ7CisgICAgfSBlbHNlIHsKKwlnbG9iYWwgdGltZW91dDsKKwlpZiBbaW5mbyBleGlzdHMgdGltZW91dF0geworCSAgICBzZXQgdG10ICR0aW1lb3V0OworCX0gZWxzZSB7CisJICAgIHNldCB0bXQgNjA7CisJfQorICAgIH0KKyAgICBnZGJfZXhwZWN0ICR0bXQgeworCSAtcmUgIlxcKlxcKlxcKiBET1NFWElUIGNvZGUuKiIgeworCSAgICAgaWYgeyAkbWVzc2FnZSAhPSAiIiB9IHsKKwkJIGZhaWwgIiRtZXNzYWdlIjsKKwkgICAgIH0KKwkgICAgIGdkYl9zdXBwcmVzc19lbnRpcmVfZmlsZSAiR0RCIGRpZWQiOworCSAgICAgcmV0dXJuIC0xOworCSB9CisJIC1yZSAiRW5kaW5nIHJlbW90ZSBkZWJ1Z2dpbmcuKiRnZGJfcHJvbXB0JCIgeworCSAgICBpZiAhW2lzbmF0aXZlXSB0aGVuIHsKKwkJd2FybmluZyAiQ2FuYHQgY29tbXVuaWNhdGUgdG8gcmVtb3RlIHRhcmdldC4iCisJICAgIH0KKwkgICAgZ2RiX2V4aXQKKwkgICAgZ2RiX3N0YXJ0CisJICAgIHNldCByZXN1bHQgLTEKKwl9CisJIC1yZSAiXFtcclxuXF0qKCRwYXR0ZXJuKVxbXHJcblxdKyRnZGJfcHJvbXB0ICQiIHsKKwkgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJG1lc3NhZ2VdIHRoZW4geworCQlwYXNzICIkbWVzc2FnZSIKKwkgICAgfQorCSAgICBzZXQgcmVzdWx0IDAKKwl9CisJIC1yZSAiKCR7cXVlc3Rpb25fc3RyaW5nfSkkIiB7CisJICAgIHNlbmRfZ2RiICIkcmVzcG9uc2Vfc3RyaW5nXG4iOworCSAgICBleHBfY29udGludWU7CisJfQorCSAtcmUgIlVuZGVmaW5lZCBjb21tYW5kOi4qJGdkYl9wcm9tcHQiIHsKKwkgICAgcGVycm9yICJVbmRlZmluZWQgY29tbWFuZCBcIiRjb21tYW5kXCIuIgorCSAgICBzZXQgcmVzdWx0IDEKKwl9CisJIC1yZSAiQW1iaWd1b3VzIGNvbW1hbmQuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGVycm9yICJcIiRjb21tYW5kXCIgaXMgbm90IGEgdW5pcXVlIGNvbW1hbmQgbmFtZS4iCisJICAgIHNldCByZXN1bHQgMQorCX0KKwkgLXJlICJQcm9ncmFtIGV4aXRlZCB3aXRoIGNvZGUgXFswLTlcXSsuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJG1lc3NhZ2VdIHRoZW4geworCQlzZXQgZXJybXNnICIkbWVzc2FnZTogdGhlIHByb2dyYW0gZXhpdGVkIgorCSAgICB9IGVsc2UgeworCQlzZXQgZXJybXNnICIkY29tbWFuZDogdGhlIHByb2dyYW0gZXhpdGVkIgorCSAgICB9CisJICAgIGZhaWwgIiRlcnJtc2ciCisJICAgIHJldHVybiAtMQorCX0KKwkgLXJlICJUaGUgcHJvZ3JhbSBpcyBub3QgYmVpbmcgcnVuLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRtZXNzYWdlXSB0aGVuIHsKKwkJc2V0IGVycm1zZyAiJG1lc3NhZ2U6IHRoZSBwcm9ncmFtIGlzIG5vIGxvbmdlciBydW5uaW5nIgorCSAgICB9IGVsc2UgeworCQlzZXQgZXJybXNnICIkY29tbWFuZDogdGhlIHByb2dyYW0gaXMgbm8gbG9uZ2VyIHJ1bm5pbmciCisJICAgIH0KKwkgICAgZmFpbCAiJGVycm1zZyIKKwkgICAgcmV0dXJuIC0xCisJfQorCSAtcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkbWVzc2FnZV0gdGhlbiB7CisJCWZhaWwgIiRtZXNzYWdlIgorCSAgICB9CisJICAgIHNldCByZXN1bHQgMQorCX0KKwkgIjxyZXR1cm4+IiB7CisJICAgIHNlbmRfZ2RiICJcbiIKKwkgICAgcGVycm9yICJXaW5kb3cgdG9vIHNtYWxsLiIKKwl9CisJIC1yZSAiXFwoeSBvciBuXFwpICIgeworCSAgICBzZW5kX2dkYiAiblxuIgorCSAgICBwZXJyb3IgIkdvdCBpbnRlcmFjdGl2ZSBwcm9tcHQuIgorCX0KKwkgZW9mIHsKKwkgICAgIHBlcnJvciAiUHJvY2VzcyBubyBsb25nZXIgZXhpc3RzIgorCSAgICAgaWYgeyAkbWVzc2FnZSAhPSAiIiB9IHsKKwkJIGZhaWwgIiRtZXNzYWdlIgorCSAgICAgfQorCSAgICAgcmV0dXJuIC0xCisJfQorCSBmdWxsX2J1ZmZlciB7CisJICAgIHBlcnJvciAiaW50ZXJuYWwgYnVmZmVyIGlzIGZ1bGwuIgorCX0KKwl0aW1lb3V0CXsKKwkgICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJG1lc3NhZ2VdIHRoZW4geworCQlmYWlsICIkbWVzc2FnZSAodGltZW91dCkiCisJICAgIH0KKwkgICAgc2V0IHJlc3VsdCAxCisJfQorICAgIH0KKyAgICByZXR1cm4gJHJlc3VsdAorfQorDAorIyBUZXN0IHRoYXQgYSBjb21tYW5kIGdpdmVzIGFuIGVycm9yLiAgRm9yIHBhc3Mgb3IgZmFpbCwgcmV0dXJuCisjIGEgMSB0byBpbmRpY2F0ZSB0aGF0IG1vcmUgdGVzdHMgY2FuIHByb2NlZWQuICBIb3dldmVyIGEgdGltZW91dAorIyBpcyBhIHNlcmlvdXMgZXJyb3IsIGdlbmVyYXRlcyBhIHNwZWNpYWwgZmFpbCBtZXNzYWdlLCBhbmQgY2F1c2VzCisjIGEgMCB0byBiZSByZXR1cm5lZCB0byBpbmRpY2F0ZSB0aGF0IG1vcmUgdGVzdHMgYXJlIGxpa2VseSB0byBmYWlsCisjIGFzIHdlbGwuCisKK3Byb2MgdGVzdF9wcmludF9yZWplY3QgeyBhcmdzIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIHZlcmJvc2UKKworICAgIGlmIFtsbGVuZ3RoICRhcmdzXT09MiB0aGVuIHsKKwlzZXQgZXhwZWN0dGhpcyBbbGluZGV4ICRhcmdzIDFdCisgICAgfSBlbHNlIHsKKwlzZXQgZXhwZWN0dGhpcyAic2hvdWxkIG5ldmVyIG1hdGNoIHRoaXMgYm9ndXMgc3RyaW5nIgorICAgIH0KKyAgICBzZXQgc2VuZHRoaXMgW2xpbmRleCAkYXJncyAwXQorICAgIGlmICR2ZXJib3NlPjIgdGhlbiB7CisJc2VuZF91c2VyICJTZW5kaW5nIFwiJHNlbmR0aGlzXCIgdG8gZ2RiXG4iCisJc2VuZF91c2VyICJMb29raW5nIHRvIG1hdGNoIFwiJGV4cGVjdHRoaXNcIlxuIgorICAgIH0KKyAgICBzZW5kX2dkYiAiJHNlbmR0aGlzXG4iCisgICAgI0ZJWE1FOiBTaG91bGQgYWRkIHRpbWVvdXQgYXMgcGFyYW1ldGVyLgorICAgIGdkYl9leHBlY3QgeworCS1yZSAiQSAuKiBpbiBleHByZXNzaW9uLipcXC4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJyZWplY3QgJHNlbmR0aGlzIgorCSAgICByZXR1cm4gMQorCX0KKwktcmUgIkludmFsaWQgc3ludGF4IGluIGV4cHJlc3Npb24uKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicmVqZWN0ICRzZW5kdGhpcyIKKwkgICAgcmV0dXJuIDEKKwl9CisJLXJlICJKdW5rIGFmdGVyIGVuZCBvZiBleHByZXNzaW9uLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInJlamVjdCAkc2VuZHRoaXMiCisJICAgIHJldHVybiAxCisJfQorCS1yZSAiSW52YWxpZCBudW1iZXIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicmVqZWN0ICRzZW5kdGhpcyIKKwkgICAgcmV0dXJuIDEKKwl9CisJLXJlICJJbnZhbGlkIGNoYXJhY3RlciBjb25zdGFudC4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBwYXNzICJyZWplY3QgJHNlbmR0aGlzIgorCSAgICByZXR1cm4gMQorCX0KKwktcmUgIk5vIHN5bWJvbCB0YWJsZSBpcyBsb2FkZWQuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicmVqZWN0ICRzZW5kdGhpcyIKKwkgICAgcmV0dXJuIDEKKwl9CisJLXJlICJObyBzeW1ib2wgLiogaW4gY3VycmVudCBjb250ZXh0LiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHBhc3MgInJlamVjdCAkc2VuZHRoaXMiCisJICAgIHJldHVybiAxCisJfQorCS1yZSAiJGV4cGVjdHRoaXMuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcGFzcyAicmVqZWN0ICRzZW5kdGhpcyIKKwkgICAgcmV0dXJuIDEKKwl9CisJLXJlICIuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgZmFpbCAicmVqZWN0ICRzZW5kdGhpcyIKKwkgICAgcmV0dXJuIDEKKwl9CisJZGVmYXVsdCB7CisJICAgIGZhaWwgInJlamVjdCAkc2VuZHRoaXMgKGVvZiBvciB0aW1lb3V0KSIKKwkgICAgcmV0dXJuIDAKKwl9CisgICAgfQorfQorDAorIyBHaXZlbiBhbiBpbnB1dCBzdHJpbmcsIGFkZHMgYmFja3NsYXNoZXMgYXMgbmVlZGVkIHRvIGNyZWF0ZSBhCisjIHJlZ2V4cCB0aGF0IHdpbGwgbWF0Y2ggdGhlIHN0cmluZy4KKworcHJvYyBzdHJpbmdfdG9fcmVnZXhwIHtzdHJ9IHsKKyAgICBzZXQgcmVzdWx0ICRzdHIKKyAgICByZWdzdWIgLWFsbCB7W10qKy58KCleJFxbXX0gJHN0ciB7XFwmfSByZXN1bHQKKyAgICByZXR1cm4gJHJlc3VsdAorfQorCisjIFNhbWUgYXMgZ2RiX3Rlc3QsIGJ1dCB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBub3QgYSByZWdleHAsCisjIGJ1dCBhIHN0cmluZyB0aGF0IG11c3QgbWF0Y2ggZXhhY3RseS4KKworcHJvYyBnZGJfdGVzdF9leGFjdCB7IGFyZ3MgfSB7CisgICAgdXB2YXIgdGltZW91dCB0aW1lb3V0CisKKyAgICBzZXQgY29tbWFuZCBbbGluZGV4ICRhcmdzIDBdCisKKyAgICAjIFRoaXMgYXBwbGllcyBhIHNwZWNpYWwgbWVhbmluZyB0byBhIG51bGwgc3RyaW5nIHBhdHRlcm4uICBXaXRob3V0CisgICAgIyB0aGlzLCAiJHBhdHRlcm5cclxuJGdkYl9wcm9tcHQgJCIgd2lsbCBtYXRjaCBhbnl0aGluZywgaW5jbHVkaW5nIGVycm9yCisgICAgIyBtZXNzYWdlcyBmcm9tIGNvbW1hbmRzIHRoYXQgc2hvdWxkIGhhdmUgbm8gb3V0cHV0IGV4Y2VwdCBhIG5ldworICAgICMgcHJvbXB0LiAgV2l0aCB0aGlzLCBvbmx5IHJlc3VsdHMgb2YgYSBudWxsIHN0cmluZyB3aWxsIG1hdGNoIGEgbnVsbAorICAgICMgc3RyaW5nIHBhdHRlcm4uCisKKyAgICBzZXQgcGF0dGVybiBbbGluZGV4ICRhcmdzIDFdCisgICAgaWYgW3N0cmluZyBtYXRjaCAkcGF0dGVybiAiIl0geworCXNldCBwYXR0ZXJuIFtzdHJpbmdfdG9fcmVnZXhwIFtsaW5kZXggJGFyZ3MgMF1dCisgICAgfSBlbHNlIHsKKwlzZXQgcGF0dGVybiBbc3RyaW5nX3RvX3JlZ2V4cCBbbGluZGV4ICRhcmdzIDFdXQorICAgIH0KKworICAgICMgSXQgaXMgbW9zdCBuYXR1cmFsIHRvIHdyaXRlIHRoZSBwYXR0ZXJuIGFyZ3VtZW50IHdpdGggb25seQorICAgICMgZW1iZWRkZWQgXG4ncywgZXNwZWNpYWxseSBpZiB5b3UgYXJlIHRyeWluZyB0byBhdm9pZCBUY2wgcXVvdGluZworICAgICMgcHJvYmxlbXMuICBCdXQgZ2RiX2V4cGVjdCByZWFsbHkgd2FudHMgdG8gc2VlIFxyXG4gaW4gcGF0dGVybnMuICBTbworICAgICMgdHJhbnNmb3JtIHRoZSBwYXR0ZXJuIGhlcmUuICBGaXJzdCB0cmFuc2Zvcm0gXHJcbiBiYWNrIHRvIFxuLCBpbgorICAgICMgY2FzZSBzb21lIHVzZXJzIG9mIGdkYl90ZXN0X2V4YWN0IGFscmVhZHkgZG8gdGhlIHJpZ2h0IHRoaW5nLgorICAgIHJlZ3N1YiAtYWxsICJcclxuIiAkcGF0dGVybiAiXG4iIHBhdHRlcm4KKyAgICByZWdzdWIgLWFsbCAiXG4iICRwYXR0ZXJuICJcclxuIiBwYXR0ZXJuCisgICAgaWYgW2xsZW5ndGggJGFyZ3NdPT0zIHRoZW4geworCXNldCBtZXNzYWdlIFtsaW5kZXggJGFyZ3MgMl0KKyAgICB9IGVsc2UgeworCXNldCBtZXNzYWdlICRjb21tYW5kCisgICAgfQorCisgICAgcmV0dXJuIFtnZGJfdGVzdCAkY29tbWFuZCAkcGF0dGVybiAkbWVzc2FnZV0KK30KKwwKK3Byb2MgZ2RiX3JlaW5pdGlhbGl6ZV9kaXIgeyBzdWJkaXIgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKworICAgIGlmIFtpc19yZW1vdGUgaG9zdF0geworCXJldHVybiAiIjsKKyAgICB9CisgICAgc2VuZF9nZGIgImRpclxuIgorICAgIGdkYl9leHBlY3QgNjAgeworCS1yZSAiUmVpbml0aWFsaXplIHNvdXJjZSBwYXRoIHRvIGVtcHR5Lip5IG9yIG4uICIgeworCSAgICBzZW5kX2dkYiAieVxuIgorCSAgICBnZGJfZXhwZWN0IDYwIHsKKwkJLXJlICJTb3VyY2UgZGlyZWN0b3JpZXMgc2VhcmNoZWQuKiRnZGJfcHJvbXB0ICQiIHsKKwkJICAgIHNlbmRfZ2RiICJkaXIgJHN1YmRpclxuIgorCQkgICAgZ2RiX2V4cGVjdCA2MCB7CisJCQktcmUgIlNvdXJjZSBkaXJlY3RvcmllcyBzZWFyY2hlZC4qJGdkYl9wcm9tcHQgJCIgeworCQkJICAgIHZlcmJvc2UgIkRpciBzZXQgdG8gJHN1YmRpciIKKwkJCX0KKwkJCS1yZSAiJGdkYl9wcm9tcHQgJCIgeworCQkJICAgIHBlcnJvciAiRGlyIFwiJHN1YmRpclwiIGZhaWxlZC4iCisJCQl9CisJCSAgICB9CisJCX0KKwkJLXJlICIkZ2RiX3Byb21wdCAkIiB7CisJCSAgICBwZXJyb3IgIkRpciBcIiRzdWJkaXJcIiBmYWlsZWQuIgorCQl9CisJICAgIH0KKwl9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7CisJICAgIHBlcnJvciAiRGlyIFwiJHN1YmRpclwiIGZhaWxlZC4iCisJfQorICAgIH0KK30KKworIworIyBnZGJfZXhpdCAtLSBleGl0IHRoZSBHREIsIGtpbGxpbmcgdGhlIHRhcmdldCBwcm9ncmFtIGlmIG5lY2Vzc2FyeQorIworcHJvYyBkZWZhdWx0X2dkYl9leGl0IHt9IHsKKyAgICBnbG9iYWwgR0RCCisgICAgZ2xvYmFsIEdEQkZMQUdTCisgICAgZ2xvYmFsIHZlcmJvc2UKKyAgICBnbG9iYWwgZ2RiX3NwYXduX2lkOworCisgICAgZ2RiX3N0b3Bfc3VwcHJlc3NpbmdfdGVzdHM7CisKKyAgICBpZiAhW2luZm8gZXhpc3RzIGdkYl9zcGF3bl9pZF0geworCXJldHVybjsKKyAgICB9CisKKyAgICB2ZXJib3NlICJRdWl0dGluZyAkR0RCICRHREJGTEFHUyIKKworICAgIGlmIHsgW2lzX3JlbW90ZSBob3N0XSAmJiBbYm9hcmRfaW5mbyBob3N0IGV4aXN0cyBmaWxlaWRdIH0geworCXNlbmRfZ2RiICJxdWl0XG4iOworCWdkYl9leHBlY3QgMTAgeworCSAgICAtcmUgInkgb3IgbiIgeworCQlzZW5kX2dkYiAieVxuIjsKKwkJZXhwX2NvbnRpbnVlOworCSAgICB9CisJICAgIC1yZSAiRE9TRVhJVCBjb2RlIiB7IH0KKwkgICAgZGVmYXVsdCB7IH0KKwl9CisgICAgfQorCisgICAgaWYgIVtpc19yZW1vdGUgaG9zdF0geworCXJlbW90ZV9jbG9zZSBob3N0OworICAgIH0KKyAgICB1bnNldCBnZGJfc3Bhd25faWQKK30KKworIworIyBsb2FkIGEgZmlsZSBpbnRvIHRoZSBkZWJ1Z2dlci4KKyMgcmV0dXJuIGEgLTEgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4KKyMKK3Byb2MgZ2RiX2ZpbGVfY21kIHsgYXJnIH0geworICAgIGdsb2JhbCB2ZXJib3NlCisgICAgZ2xvYmFsIGxvYWRwYXRoCisgICAgZ2xvYmFsIGxvYWRmaWxlCisgICAgZ2xvYmFsIEdEQgorICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgdXB2YXIgdGltZW91dCB0aW1lb3V0CisKKyAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKKwlzZXQgYXJnIFtyZW1vdGVfZG93bmxvYWQgaG9zdCAkYXJnXTsKKwlpZiB7ICRhcmcgPT0gIiIgfSB7CisJICAgIGVycm9yICJkb3dubG9hZCBmYWlsZWQiCisJICAgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgICAgc2VuZF9nZGIgImZpbGUgJGFyZ1xuIgorICAgIGdkYl9leHBlY3QgMTIwIHsKKyAgICAgICAgLXJlICJSZWFkaW5nIHN5bWJvbHMgZnJvbS4qZG9uZS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgdmVyYm9zZSAiXHRcdExvYWRlZCAkYXJnIGludG8gdGhlICRHREIiCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICB9CisgICAgICAgIC1yZSAiaGFzIG5vIHN5bWJvbC10YWJsZS4qJGdkYl9wcm9tcHQgJCIgeworICAgICAgICAgICAgcGVycm9yICIkYXJnIHdhc24ndCBjb21waWxlZCB3aXRoIFwiLWdcIiIKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICB9CisgICAgICAgIC1yZSAiQSBwcm9ncmFtIGlzIGJlaW5nIGRlYnVnZ2VkIGFscmVhZHkuKktpbGwgaXQuKnkgb3Igbi4gJCIgeworICAgICAgICAgICAgc2VuZF9nZGIgInlcbiIKKyAgICAgICAgICAgICAgICB2ZXJib3NlICJcdFx0S2lsbGluZyBwcmV2aW91cyBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkIgorICAgICAgICAgICAgZXhwX2NvbnRpbnVlCisgICAgICAgIH0KKyAgICAgICAgLXJlICJMb2FkIG5ldyBzeW1ib2wgdGFibGUgZnJvbSBcIi4qXCIuKnkgb3Igbi4gJCIgeworICAgICAgICAgICAgc2VuZF9nZGIgInlcbiIKKyAgICAgICAgICAgIGdkYl9leHBlY3QgMTIwIHsKKyAgICAgICAgICAgICAgICAtcmUgIlJlYWRpbmcgc3ltYm9scyBmcm9tLipkb25lLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgIlx0XHRMb2FkZWQgJGFyZyB3aXRoIG5ldyBzeW1ib2wgdGFibGUgaW50byAkR0RCIgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aW1lb3V0IHsKKyAgICAgICAgICAgICAgICAgICAgcGVycm9yICIodGltZW91dCkgQ291bGRuJ3QgbG9hZCAkYXJnLCBvdGhlciBwcm9ncmFtIGFscmVhZHkgbG9hZGVkLiIKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCX0KKyAgICAgICAgLXJlICJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBwZXJyb3IgIigkYXJnKSBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XG4iCisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgfQorICAgICAgICAtcmUgIiRnZGJfcHJvbXB0ICQiIHsKKyAgICAgICAgICAgIHBlcnJvciAiY291bGRuJ3QgbG9hZCAkYXJnIGludG8gJEdEQi4iCisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIH0KKyAgICAgICAgdGltZW91dCB7CisgICAgICAgICAgICBwZXJyb3IgImNvdWxkbid0IGxvYWQgJGFyZyBpbnRvICRHREIgKHRpbWVkIG91dCkuIgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIH0KKyAgICAgICAgZW9mIHsKKyAgICAgICAgICAgICMgVGhpcyBpcyBhbiBhdHRlbXB0IHRvIGRldGVjdCBhIGNvcmUgZHVtcCwgYnV0IHNlZW1zIG5vdCB0bworICAgICAgICAgICAgIyB3b3JrLiAgUGVyaGFwcyB3ZSBuZWVkIHRvIG1hdGNoIC4qIGZvbGxvd2VkIGJ5IGVvZiwgaW4gd2hpY2gKKyAgICAgICAgICAgICMgZ2RiX2V4cGVjdCBkb2VzIG5vdCBzZWVtIHRvIGhhdmUgYSB3YXkgdG8gZG8gdGhhdC4KKyAgICAgICAgICAgIHBlcnJvciAiY291bGRuJ3QgbG9hZCAkYXJnIGludG8gJEdEQiAoZW5kIG9mIGZpbGUpLiIKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICB9CisgICAgfQorfQorCisjCisjIHN0YXJ0IGdkYiAtLSBzdGFydCBnZGIgcnVubmluZywgZGVmYXVsdCBwcm9jZWR1cmUKKyMKKyMgV2hlbiBydW5uaW5nIG92ZXIgTkZTLCBwYXJ0aWN1bGFybHkgaWYgcnVubmluZyBtYW55IHNpbXVsdGFuZW91cworIyB0ZXN0cyBvbiBkaWZmZXJlbnQgaG9zdHMgYWxsIHVzaW5nIHRoZSBzYW1lIHNlcnZlciwgdGhpbmdzIGNhbgorIyBnZXQgcmVhbGx5IHNsb3cuICBHaXZlIGdkYiBhdCBsZWFzdCAzIG1pbnV0ZXMgdG8gc3RhcnQgdXAuCisjCitwcm9jIGRlZmF1bHRfZ2RiX3N0YXJ0IHsgfSB7CisgICAgZ2xvYmFsIHZlcmJvc2UKKyAgICBnbG9iYWwgR0RCCisgICAgZ2xvYmFsIEdEQkZMQUdTCisgICAgZ2xvYmFsIGdkYl9wcm9tcHQKKyAgICBnbG9iYWwgdGltZW91dAorICAgIGdsb2JhbCBnZGJfc3Bhd25faWQ7CisKKyAgICBnZGJfc3RvcF9zdXBwcmVzc2luZ190ZXN0czsKKworICAgIHZlcmJvc2UgIlNwYXduaW5nICRHREIgLW53ICRHREJGTEFHUyIKKworICAgIGlmIFtpbmZvIGV4aXN0cyBnZGJfc3Bhd25faWRdIHsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAhW2lzX3JlbW90ZSBob3N0XSB7CisJaWYgeyBbd2hpY2ggJEdEQl0gPT0gMCB9IHRoZW4geworCSAgICBwZXJyb3IgIiRHREIgZG9lcyBub3QgZXhpc3QuIgorCSAgICBleGl0IDEKKwl9CisgICAgfQorICAgIHNldCByZXMgW3JlbW90ZV9zcGF3biBob3N0ICIkR0RCIC1udyAkR0RCRkxBR1MgW2hvc3RfaW5mbyBnZGJfb3B0c10iXTsKKyAgICBpZiB7ICRyZXMgPCAwIHx8ICRyZXMgPT0gIiIgfSB7CisJcGVycm9yICJTcGF3bmluZyAkR0RCIGZhaWxlZC4iCisJcmV0dXJuIDE7CisgICAgfQorICAgIGdkYl9leHBlY3QgMzYwIHsKKwktcmUgIlxbXHJcblxdJGdkYl9wcm9tcHQgJCIgeworCSAgICB2ZXJib3NlICJHREIgaW5pdGlhbGl6ZWQuIgorCX0KKwktcmUgIiRnZGJfcHJvbXB0ICQiCXsKKwkgICAgcGVycm9yICJHREIgbmV2ZXIgaW5pdGlhbGl6ZWQuIgorCSAgICByZXR1cm4gLTEKKwl9CisJdGltZW91dAl7CisJICAgIHBlcnJvciAiKHRpbWVvdXQpIEdEQiBuZXZlciBpbml0aWFsaXplZCBhZnRlciAxMCBzZWNvbmRzLiIKKwkgICAgcmVtb3RlX2Nsb3NlIGhvc3Q7CisJICAgIHJldHVybiAtMQorCX0KKyAgICB9CisgICAgc2V0IGdkYl9zcGF3bl9pZCAtMTsKKyAgICAjIGZvcmNlIHRoZSBoZWlnaHQgdG8gInVubGltaXRlZCIsIHNvIG5vIHBhZ2VycyBnZXQgdXNlZAorCisgICAgc2VuZF9nZGIgInNldCBoZWlnaHQgMFxuIgorICAgIGdkYl9leHBlY3QgMTAgeworCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyAKKwkgICAgdmVyYm9zZSAiU2V0dGluZyBoZWlnaHQgdG8gMC4iIDIKKwl9CisJdGltZW91dCB7CisJICAgIHdhcm5pbmcgIkNvdWxkbid0IHNldCB0aGUgaGVpZ2h0IHRvIDAiCisJfQorICAgIH0KKyAgICAjIGZvcmNlIHRoZSB3aWR0aCB0byAidW5saW1pdGVkIiwgc28gbm8gd3JhcGFyb3VuZCBvY2N1cnMKKyAgICBzZW5kX2dkYiAic2V0IHdpZHRoIDBcbiIKKyAgICBnZGJfZXhwZWN0IDEwIHsKKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgdmVyYm9zZSAiU2V0dGluZyB3aWR0aCB0byAwLiIgMgorCX0KKwl0aW1lb3V0IHsKKwkgICAgd2FybmluZyAiQ291bGRuJ3Qgc2V0IHRoZSB3aWR0aCB0byAwLiIKKwl9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjICogRm9yIGNyb3NzZXMsIHRoZSBDSElMTCBydW50aW1lIGRvZXNuJ3QgYnVpbGQgYmVjYXVzZSBpdCBjYW4ndCBmaW5kCisjIHNldGptcC5oLCBzdGRpby5oLCBldGMuCisjICogRm9yIEFJWCAoYXMgb2YgMTYgTWFyIDk1KSwgKGEpIHRoZXJlIGlzIG5vIGxhbmd1YWdlIGNvZGUgZm9yCisjIENISUxMIGluIG91dHB1dF9lcGlsb2cgaW4gZ2NjL2NvbmZpZy9yczYwMDAvcnM2MDAwLmMsIChiKSBjb2xsZWN0MgorIyBkb2VzIG5vdCBnZXQgYWxvbmcgd2l0aCBBSVgncyB0b28tY2xldmVyIGxpbmtlci4KKyMgKiBPbiBJcml4NSwgdGhlcmUgaXMgYSBidWcgd2hlcmVieSBzZXQgb2YgYm9vbCwgZXRjLiwgZG9uJ3QgZ2V0CisjIFRZUEVfTE9XX0JPVU5EIGZvciB0aGUgYm9vbCByaWdodCBiZWNhdXNlIGZvcmNlX3RvX3JhbmdlX3R5cGUgZG9lc24ndAorIyB3b3JrIHdpdGggc3R1YiB0eXBlcy4KKyMgTG90cyBvZiB0aGluZ3Mgc2VlbSB0byBmYWlsIG9uIHRoZSBQQSwgYW5kIHNpbmNlIGl0J3Mgbm90IGEgc3VwcG9ydGVkCisjIGNoaWxsIHRhcmdldCBhdCB0aGUgbW9tZW50LCBkb24ndCBydW4gdGhlIGNoaWxsIHRlc3RzLgorCitwcm9jIHNraXBfY2hpbGxfdGVzdHMge30geworICAgIGlmICFbaW5mbyBleGlzdHMgZG9fY2hpbGxfdGVzdHNdIHsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgZXZhbCBzZXQgc2tpcF9jaGlsbCBbZXhwciAhW2lzbmF0aXZlXSB8fCBbaXN0YXJnZXQgIiotKi1haXgqIl0gfHwgW2lzdGFyZ2V0ICIqLSotaXJpeDUqIl0gfHwgW2lzdGFyZ2V0ICIqLSotaXJpeDYqIl0gfHwgW2lzdGFyZ2V0ICJhbHBoYS0qLW9zZioiXSB8fCBbaXN0YXJnZXQgImhwcGEqLSotKiJdXQorICAgIHZlcmJvc2UgIlNraXAgY2hpbGwgdGVzdHMgaXMgJHNraXBfY2hpbGwiCisgICAgcmV0dXJuICRza2lwX2NoaWxsCit9CisKKyMgc2tpcCBhbGwgdGhlIHRlc3RzIGluIHRoZSBmaWxlIGlmIHlvdSBhcmUgbm90IG9uIGFuIGhwcGEgcnVubmluZyBocHV4IHRhcmdldC4KKyMgYW5kIHlvdSBjb21waWxlZCB3aXRoIGdjYworcHJvYyBza2lwX2hwX3Rlc3RzIHtnY2NfdXNlZH0geworICAjICBpZiAhW2luZm8gZXhpc3RzIGRvX2hwX3Rlc3RzXSB7CisgICMJcmV0dXJuIDE7CisgICMgIH0KKyAgICBldmFsIHNldCBza2lwX2hwIFtleHByICFbaXNuYXRpdmVdIHx8ICFbaXN0YXJnZXQgImhwcGEqLSotaHB1eCoiXSB8fCAkZ2NjX3VzZWQhPTAgXQorICAgIHZlcmJvc2UgIlNraXAgaHAgdGVzdHMgaXMgJHNraXBfaHAiCisgICAgcmV0dXJuICRza2lwX2hwCit9CisKK3Byb2MgZ2V0X2NvbXBpbGVyX2luZm8ge2JpbmZpbGUgYXJnc30geworICAgICMgQ3JlYXRlIGFuZCBzb3VyY2UgdGhlIGZpbGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIKKyAgICAjIHVzZWQgdG8gY29tcGlsZSB0aGUgdGVzdCBjYXNlLgorICAgICMgQ29tcGlsZXJfdHlwZSBjYW4gYmUgbnVsbCBvciBjKysuIElmIG51bGwgd2UgYXNzdW1lIGMuCisgICAgZ2xvYmFsIHNyY2RpcgorICAgIGdsb2JhbCBzdWJkaXIKKyAgICAjIFRoZXNlIHR3byBjb21lIGZyb20gY29tcGlsZXIuYy4KKyAgICBnbG9iYWwgc2lnbmVkX2tleXdvcmRfbm90X3VzZWQKKyAgICBnbG9iYWwgZ2NjX2NvbXBpbGVkCisKKyAgICBpZiB7IVtpc3RhcmdldCAiaHBwYSotKi1ocHV4KiJdfSB7CisJaWYgeyBbbGxlbmd0aCAkYXJnc10gPiAwIH0geworCSAgICBpZiB7JGFyZ3MgPT0gImMrKyJ9IHsKKwlpZiB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS9jb21waWxlci5jYyIgIiR7YmluZmlsZX0uY2kiIHByZXByb2Nlc3Mge31dICE9ICIiIH0geworCQkgICAgcGVycm9yICJDb3VsZG4ndCBtYWtlICR7YmluZmlsZX0uY2kgZmlsZSIKKwkJICAgIHJldHVybiAxOworCQl9CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBpZiB7IFtnZGJfY29tcGlsZSAiJHtzcmNkaXJ9LyR7c3ViZGlyfS9jb21waWxlci5jIiAiJHtiaW5maWxlfS5jaSIgcHJlcHJvY2VzcyB7fV0gIT0gIiIgfSB7CisJCXBlcnJvciAiQ291bGRuJ3QgbWFrZSAke2JpbmZpbGV9LmNpIGZpbGUiCisJCXJldHVybiAxOworCSAgICB9CisJfQorICAgIH0gZWxzZSB7CisJaWYgeyBbbGxlbmd0aCAkYXJnc10gPiAwIH0geworCSAgICBpZiB7JGFyZ3MgPT0gImMrKyJ9IHsKKwkJaWYgeyBbZXZhbCBnZGJfcHJlcHJvY2VzcyBcCisJCQlbbGlzdCAiJHtzcmNkaXJ9LyR7c3ViZGlyfS9jb21waWxlci5jYyIgIiR7YmluZmlsZX0uY2kiXSBcCisJCQkkYXJnc10gIT0gIiIgfSB7CisJCSAgICBwZXJyb3IgIkNvdWxkbid0IG1ha2UgJHtiaW5maWxlfS5jaSBmaWxlIgorCQkgICAgcmV0dXJuIDE7CisJCX0KKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGlmIHsgW2V2YWwgZ2RiX3ByZXByb2Nlc3MgXAorCQkgICAgW2xpc3QgIiR7c3JjZGlyfS8ke3N1YmRpcn0vY29tcGlsZXIuYyIgIiR7YmluZmlsZX0uY2kiXSBcCisJCSAgICAkYXJnc10gIT0gIiIgfSB7CisJCXBlcnJvciAiQ291bGRuJ3QgbWFrZSAke2JpbmZpbGV9LmNpIGZpbGUiCisJCXJldHVybiAxOworCSAgICB9CisJfQorICAgIH0KKyAgICAKKyAgICBzb3VyY2UgJHtiaW5maWxlfS5jaQorICAgIHJldHVybiAwOworfQorCitwcm9jIGdkYl9wcmVwcm9jZXNzIHtzb3VyY2UgZGVzdCBhcmdzfSB7CisgICAgZ2xvYmFsIENDX0ZPUl9UQVJHRVQKKyAgICBnbG9iYWwgQ1hYX0ZPUl9UQVJHRVQKKworICAgIGlmIHsgW2xsZW5ndGggJGFyZ3NdID09IDAgfSB7CisgICAgICAgIHNldCB3aGljaF9jb21waWxlciAiYyIKKyAgICB9IGVsc2UgeworICAgICAgICBpZiB7ICRhcmdzID09ImMrKyIgfSB7CisgICAgICAgICAgICBzZXQgd2hpY2hfY29tcGlsZXIgImMrKyIKKyAgICAgICAgfSBlbHNlIHsKKwkgICAgcGVycm9yICJVbmtub3duIGNvbXBpbGVyIHR5cGUgc3VwcGxpZWQgdG8gZ2RiX3ByZXByb2Nlc3MiCisJICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgW2luZm8gZXhpc3RzIENDX0ZPUl9UQVJHRVRdIHsKKwlpZiB7ICR3aGljaF9jb21waWxlciA9PSAiYyJ9IHsKKwkgICAgc2V0IGNvbXBpbGVyICRDQ19GT1JfVEFSR0VUOworCX0KKyAgICB9CisgCisgICAgaWYgW2luZm8gZXhpc3RzIENYWF9GT1JfVEFSR0VUXSB7CisJaWYgeyAkd2hpY2hfY29tcGlsZXIgPT0gImMrKyJ9IHsKKwkgICAgc2V0IGNvbXBpbGVyICRDWFhfRk9SX1RBUkdFVDsKKwl9CisgICAgfQorCisgICAgaWYgeyAhW2luZm8gZXhpc3RzIGNvbXBpbGVyXSB9IHsKKyAgICAgICAgaWYgeyAkd2hpY2hfY29tcGlsZXIgPT0gImMiIH0geworCSAgICBpZiB7W2luZm8gZXhpc3RzIENDXX0geworCQlzZXQgY29tcGlsZXIgJENDOworCSAgICB9CisJfQorICAgICAgICBpZiB7ICR3aGljaF9jb21waWxlciA9PSAiYysrIiB9IHsKKwkgICAgaWYge1tpbmZvIGV4aXN0cyBDWFhdfSB7CisJCXNldCBjb21waWxlciAkQ1hYOworCSAgICB9CisJfQorCWlmIHshW2luZm8gZXhpc3RzIGNvbXBpbGVyXX0geworCSAgICBzZXQgY29tcGlsZXIgW2JvYXJkX2luZm8gW3RhcmdldF9pbmZvIG5hbWVdIGNvbXBpbGVyXTsKKwkgICAgaWYgeyAkY29tcGlsZXIgPT0gIiIgfSB7CisJCXB1dHMgImRlZmF1bHRfdGFyZ2V0X2NvbXBpbGU6IE5vIGNvbXBpbGVyIHRvIGNvbXBpbGUgd2l0aCI7CisJCXJldHVybiAiZGVmYXVsdF90YXJnZXRfY29tcGlsZTogTm8gY29tcGlsZXIgdG8gY29tcGlsZSB3aXRoIjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBzZXQgY21kbGluZSAiJGNvbXBpbGVyIC1FICRzb3VyY2UgPiAkZGVzdCIKKworICAgIHZlcmJvc2UgIkludm9raW5nICRjb21waWxlciAtRSAkc291cmNlID4gJGRlc3QiCisgICAgdmVyYm9zZSAtbG9nICJFeGVjdXRpbmcgb24gbG9jYWwgaG9zdDogJGNtZGxpbmUiIDIKKyAgICBzZXQgc3RhdHVzIFtjYXRjaCAiZXhlYyAke2NtZGxpbmV9IiBleGVjX291dHB1dF0KKworICAgIHNldCByZXN1bHQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KKyAgICByZWdzdWIgIlxbXHJcblxdKiQiICIkcmVzdWx0IiAiIiByZXN1bHQ7CisgICAgcmVnc3ViICJeXFtcclxuXF0qIiAiJHJlc3VsdCIgIiIgcmVzdWx0OworICAgIGlmIHsgJHJlc3VsdCAhPSAiIiB9IHsKKyAgICAgICAgY2xvbmVfb3V0cHV0ICJnZGIgY29tcGlsZSBmYWlsZWQsICRyZXN1bHQiCisgICAgfQorICAgIHJldHVybiAkcmVzdWx0OworfQorCitwcm9jIGdkYl9jb21waWxlIHtzb3VyY2UgZGVzdCB0eXBlIG9wdGlvbnN9IHsKKyAgICBnbG9iYWwgR0RCX1RFU1RDQVNFX09QVElPTlM7CisKKyAgICBpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYl9zdHViXSB7CisJc2V0IG9wdGlvbnMyIHsgImFkZGl0aW9uYWxfZmxhZ3M9LUR1c2VzdHVicyIgfQorCWxhcHBlbmQgb3B0aW9ucyAibGlicz1bdGFyZ2V0X2luZm8gZ2RiX3N0dWJdIjsKKwlzZXQgb3B0aW9ucyBbY29uY2F0ICRvcHRpb25zMiAkb3B0aW9uc10KKyAgICB9CisgICAgaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBpc192eHdvcmtzXSB7CisJc2V0IG9wdGlvbnMyIHsgImFkZGl0aW9uYWxfZmxhZ3M9LUR2eHdvcmtzIiB9CisJbGFwcGVuZCBvcHRpb25zICJsaWJzPVt0YXJnZXRfaW5mbyBnZGJfc3R1Yl0iOworCXNldCBvcHRpb25zIFtjb25jYXQgJG9wdGlvbnMyICRvcHRpb25zXQorICAgIH0KKyAgICBpZiBbaW5mbyBleGlzdHMgR0RCX1RFU1RDQVNFX09QVElPTlNdIHsKKwlsYXBwZW5kIG9wdGlvbnMgImFkZGl0aW9uYWxfZmxhZ3M9JEdEQl9URVNUQ0FTRV9PUFRJT05TIjsKKyAgICB9CisgICAgdmVyYm9zZSAib3B0aW9ucyBhcmUgJG9wdGlvbnMiCisgICAgdmVyYm9zZSAic291cmNlIGlzICRzb3VyY2UgJGRlc3QgJHR5cGUgJG9wdGlvbnMiCisKKyAgICBzZXQgcmVzdWx0IFt0YXJnZXRfY29tcGlsZSAkc291cmNlICRkZXN0ICR0eXBlICRvcHRpb25zXTsKKyAgICByZWdzdWIgIlxbXHJcblxdKiQiICIkcmVzdWx0IiAiIiByZXN1bHQ7CisgICAgcmVnc3ViICJeXFtcclxuXF0qIiAiJHJlc3VsdCIgIiIgcmVzdWx0OworICAgIGlmIHsgJHJlc3VsdCAhPSAiIiB9IHsKKwljbG9uZV9vdXRwdXQgImdkYiBjb21waWxlIGZhaWxlZCwgJHJlc3VsdCIKKyAgICB9CisgICAgcmV0dXJuICRyZXN1bHQ7Cit9CisKK3Byb2Mgc2VuZF9nZGIgeyBzdHJpbmcgfSB7CisgICAgZ2xvYmFsIHN1cHByZXNzX2ZsYWc7CisgICAgaWYgeyAkc3VwcHJlc3NfZmxhZyB9IHsKKwlyZXR1cm4gInN1cHByZXNzZWQiOworICAgIH0KKyAgICByZXR1cm4gW3JlbW90ZV9zZW5kIGhvc3QgIiRzdHJpbmciXTsKK30KKworIworIworCitwcm9jIGdkYl9leHBlY3QgeyBhcmdzIH0geworICAgIGlmIHsgW2xsZW5ndGggJGFyZ3NdID09IDIgICYmIFtsaW5kZXggJGFyZ3MgMF0gIT0gIi1yZSIgfSB7CisJc2V0IGd0aW1lb3V0IFtsaW5kZXggJGFyZ3MgMF07CisJc2V0IGV4cGNvZGUgW2xpc3QgW2xpbmRleCAkYXJncyAxXV07CisgICAgfSBlbHNlIHsKKwl1cHZhciB0aW1lb3V0IHRpbWVvdXQ7CisKKwlzZXQgZXhwY29kZSAkYXJnczsKKwlpZiBbdGFyZ2V0X2luZm8gZXhpc3RzIGdkYix0aW1lb3V0XSB7CisJICAgIGlmIFtpbmZvIGV4aXN0cyB0aW1lb3V0XSB7CisJCWlmIHsgJHRpbWVvdXQgPCBbdGFyZ2V0X2luZm8gZ2RiLHRpbWVvdXRdIH0geworCQkgICAgc2V0IGd0aW1lb3V0IFt0YXJnZXRfaW5mbyBnZGIsdGltZW91dF07CisJCX0gZWxzZSB7CisJCSAgICBzZXQgZ3RpbWVvdXQgJHRpbWVvdXQ7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJc2V0IGd0aW1lb3V0IFt0YXJnZXRfaW5mbyBnZGIsdGltZW91dF07CisJICAgIH0KKwl9CisKKwlpZiAhW2luZm8gZXhpc3RzIGd0aW1lb3V0XSB7CisJICAgIGdsb2JhbCB0aW1lb3V0OworCSAgICBpZiBbaW5mbyBleGlzdHMgdGltZW91dF0geworCQlzZXQgZ3RpbWVvdXQgJHRpbWVvdXQ7CisJICAgIH0gZWxzZSB7CisJCSMgRWVlZWV3LgorCQlzZXQgZ3RpbWVvdXQgNjA7CisJICAgIH0KKwl9CisgICAgfQorICAgIGdsb2JhbCBzdXBwcmVzc19mbGFnOworICAgIGdsb2JhbCByZW1vdGVfc3VwcHJlc3NfZmxhZzsKKyAgICBpZiBbaW5mbyBleGlzdHMgcmVtb3RlX3N1cHByZXNzX2ZsYWddIHsKKwlzZXQgb2xkX3ZhbCAkcmVtb3RlX3N1cHByZXNzX2ZsYWc7CisgICAgfQorICAgIGlmIFtpbmZvIGV4aXN0cyBzdXBwcmVzc19mbGFnXSB7CisJaWYgeyAkc3VwcHJlc3NfZmxhZyB9IHsKKwkgICAgc2V0IHJlbW90ZV9zdXBwcmVzc19mbGFnIDE7CisJfQorICAgIH0KKyAgICBzZXQgY29kZSBbY2F0Y2gge3VwbGV2ZWwgcmVtb3RlX2V4cGVjdCBob3N0ICRndGltZW91dCAkZXhwY29kZX0gc3RyaW5nXTsKKyAgICBpZiBbaW5mbyBleGlzdHMgb2xkX3ZhbF0geworCXNldCByZW1vdGVfc3VwcHJlc3NfZmxhZyAkb2xkX3ZhbDsKKyAgICB9IGVsc2UgeworCWlmIFtpbmZvIGV4aXN0cyByZW1vdGVfc3VwcHJlc3NfZmxhZ10geworCSAgICB1bnNldCByZW1vdGVfc3VwcHJlc3NfZmxhZzsKKwl9CisgICAgfQorCisgICAgaWYgeyRjb2RlID09IDF9IHsKKyAgICAgICAgZ2xvYmFsIGVycm9ySW5mbyBlcnJvckNvZGU7CisKKwlyZXR1cm4gLWNvZGUgZXJyb3IgLWVycm9yaW5mbyAkZXJyb3JJbmZvIC1lcnJvcmNvZGUgJGVycm9yQ29kZSAkc3RyaW5nCisgICAgfSBlbHNlaWYgeyRjb2RlID09IDJ9IHsKKwlyZXR1cm4gLWNvZGUgcmV0dXJuICRzdHJpbmcKKyAgICB9IGVsc2VpZiB7JGNvZGUgPT0gM30geworCXJldHVybgorICAgIH0gZWxzZWlmIHskY29kZSA+IDR9IHsKKwlyZXR1cm4gLWNvZGUgJGNvZGUgJHN0cmluZworICAgIH0KK30KKworcHJvYyBnZGJfc3VwcHJlc3NfZW50aXJlX2ZpbGUgeyByZWFzb24gfSB7CisgICAgZ2xvYmFsIHN1cHByZXNzX2ZsYWc7CisKKyAgICB3YXJuaW5nICIkcmVhc29uXG4iOworICAgIHNldCBzdXBwcmVzc19mbGFnIC0xOworfQorCisjCisjIFNldCBzdXBwcmVzc19mbGFnLCB3aGljaCB3aWxsIGNhdXNlIGFsbCBzdWJzZXF1ZW50IGNhbGxzIHRvIHNlbmRfZ2RiIGFuZAorIyBnZGJfZXhwZWN0IHRvIGZhaWwgaW1tZWRpYXRlbHkgKHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gCisjIGdkYl9zdG9wX3N1cHByZXNzaW5nX3Rlc3RzKS4KKyMKK3Byb2MgZ2RiX3N1cHByZXNzX3Rlc3RzIHsgYXJncyB9IHsKKyAgICBnbG9iYWwgc3VwcHJlc3NfZmxhZzsKKworICAgIHJldHVybjsgICMgZm5mIC0gZGlzYWJsZSBwZW5kaW5nIHJldmlldyBvZiByZXN1bHRzIHdoZXJlCisgICAgICAgICAgICAgIyB0ZXN0c3VpdGUgcmFuIGJldHRlciB3aXRob3V0IHRoaXMKKyAgICBpbmNyIHN1cHByZXNzX2ZsYWc7CisKKyAgICBpZiB7ICRzdXBwcmVzc19mbGFnID09IDEgfSB7CisJaWYgeyBbbGxlbmd0aCAkYXJnc10gPiAwIH0geworCSAgICB3YXJuaW5nICJbbGluZGV4ICRhcmdzIDBdXG4iOworCX0gZWxzZSB7CisJICAgIHdhcm5pbmcgIkJlY2F1c2Ugb2YgcHJldmlvdXMgZmFpbHVyZSwgYWxsIHN1YnNlcXVlbnQgdGVzdHMgaW4gdGhpcyBncm91cCB3aWxsIGF1dG9tYXRpY2FsbHkgZmFpbC5cbiI7CisJfQorICAgIH0KK30KKworIworIyBDbGVhciBzdXBwcmVzc19mbGFnLgorIworcHJvYyBnZGJfc3RvcF9zdXBwcmVzc2luZ190ZXN0cyB7IH0geworICAgIGdsb2JhbCBzdXBwcmVzc19mbGFnOworCisgICAgaWYgW2luZm8gZXhpc3RzIHN1cHByZXNzX2ZsYWddIHsKKwlpZiB7ICRzdXBwcmVzc19mbGFnID4gMCB9IHsKKwkgICAgc2V0IHN1cHByZXNzX2ZsYWcgMDsKKwkgICAgY2xvbmVfb3V0cHV0ICJUZXN0cyByZXN0YXJ0ZWQuXG4iOworCX0KKyAgICB9IGVsc2UgeworCXNldCBzdXBwcmVzc19mbGFnIDA7CisgICAgfQorfQorCitwcm9jIGdkYl9jbGVhcl9zdXBwcmVzc2VkIHsgfSB7CisgICAgZ2xvYmFsIHN1cHByZXNzX2ZsYWc7CisKKyAgICBzZXQgc3VwcHJlc3NfZmxhZyAwOworfQorCitwcm9jIGdkYl9zdGFydCB7IH0geworICAgIGRlZmF1bHRfZ2RiX3N0YXJ0Cit9CisKK3Byb2MgZ2RiX2V4aXQgeyB9IHsKKyAgICBjYXRjaCBkZWZhdWx0X2dkYl9leGl0Cit9CisKKyMKKyMgZ2RiX2xvYWQgLS0gbG9hZCBhIGZpbGUgaW50byB0aGUgZGVidWdnZXIuCisjICAgICAgICAgICAgIHJldHVybiBhIC0xIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuCisjCitwcm9jIGdkYl9sb2FkIHsgYXJnIH0geworICAgIHJldHVybiBbZ2RiX2ZpbGVfY21kICRhcmddCit9CisKK3Byb2MgZ2RiX2NvbnRpbnVlIHsgZnVuY3Rpb24gfSB7CisgICAgZ2xvYmFsIGRlY2ltYWwKKworICAgIHJldHVybiBbZ2RiX3Rlc3QgImNvbnRpbnVlIiAiLipCcmVha3BvaW50ICRkZWNpbWFsLCAkZnVuY3Rpb24gLioiICJjb250aW51ZSB0byAkZnVuY3Rpb24iXTsKK30KKworcHJvYyBkZWZhdWx0X2dkYl9pbml0IHsgYXJncyB9IHsKKyAgICBnZGJfY2xlYXJfc3VwcHJlc3NlZDsKKworICAgICMgVWgsIHRoaXMgaXMgbGFtZS4gUmVhbGx5LCByZWFsbHksIHJlYWxseSBsYW1lLiBCdXQgdGhlcmUncyB0aGlzICpvbmUqCisgICAgIyB0ZXN0Y2FzZSB0aGF0IHdpbGwgZmFpbCBpbiByYW5kb20gcGxhY2VzIGlmIHdlIGRvbid0IGluY3JlYXNlIHRoaXMuCisgICAgbWF0Y2hfbWF4IC1kIDIwMDAwCisKKyAgICAjIFdlIHdhbnQgdG8gYWRkIHRoZSBuYW1lIG9mIHRoZSBUQ0wgdGVzdGNhc2UgdG8gdGhlIFBBU1MvRkFJTCBtZXNzYWdlcy4KKyAgICBpZiB7IFtsbGVuZ3RoICRhcmdzXSA+IDAgfSB7CisJZ2xvYmFsIHBmX3ByZWZpeAorCisJc2V0IGZpbGUgW2xpbmRleCAkYXJncyAwXTsKKworCXNldCBwZl9wcmVmaXggIltmaWxlIHRhaWwgW2ZpbGUgZGlybmFtZSAkZmlsZV1dL1tmaWxlIHRhaWwgJGZpbGVdOiI7CisgICAgfQorICAgIGdsb2JhbCBnZGJfcHJvbXB0OworICAgIGlmIFt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiX3Byb21wdF0geworCXNldCBnZGJfcHJvbXB0IFt0YXJnZXRfaW5mbyBnZGJfcHJvbXB0XTsKKyAgICB9IGVsc2UgeworCXNldCBnZGJfcHJvbXB0ICJcXChnZGJcXCkiCisgICAgfQorfQorCitwcm9jIGdkYl9pbml0IHsgYXJncyB9IHsKKyAgICByZXR1cm4gW2V2YWwgZGVmYXVsdF9nZGJfaW5pdCAkYXJnc107Cit9CisKK3Byb2MgZ2RiX2ZpbmlzaCB7IH0geworICAgIGdkYl9leGl0OworfQorCitnbG9iYWwgZGVidWdfZm9ybWF0CisKKyMgUnVuIHRoZSBnZGIgY29tbWFuZCAiaW5mbyBzb3VyY2UiIGFuZCBleHRyYWN0IHRoZSBkZWJ1Z2dpbmcgZm9ybWF0CisjIGluZm9ybWF0aW9uIGZyb20gdGhlIG91dHB1dCBhbmQgc2F2ZSBpdCBpbiBkZWJ1Z19mb3JtYXQuCisKK3Byb2MgZ2V0X2RlYnVnX2Zvcm1hdCB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisgICAgZ2xvYmFsIHZlcmJvc2UKKyAgICBnbG9iYWwgZXhwZWN0X291dAorICAgIGdsb2JhbCBkZWJ1Z19mb3JtYXQKKworICAgIHNldCBkZWJ1Z19mb3JtYXQgInVua25vd24iCisgICAgc2VuZF9nZGIgImluZm8gc291cmNlXG4iCisgICAgZ2RiX2V4cGVjdCAxMCB7CisJLXJlICJDb21waWxlZCB3aXRoICguKikgZGVidWdnaW5nIGZvcm1hdC5cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBzZXQgZGVidWdfZm9ybWF0ICRleHBlY3Rfb3V0KDEsc3RyaW5nKQorCSAgICB2ZXJib3NlICJkZWJ1ZyBmb3JtYXQgaXMgJGRlYnVnX2Zvcm1hdCIKKwkgICAgcmV0dXJuIDE7CisJfQorCS1yZSAiTm8gY3VycmVudCBzb3VyY2UgZmlsZS5cclxuJGdkYl9wcm9tcHQgJCIgeworCSAgICBwZXJyb3IgImdldF9kZWJ1Z19mb3JtYXQgdXNlZCB3aGVuIG5vIGN1cnJlbnQgc291cmNlIGZpbGUiCisJICAgIHJldHVybiAwOworCX0KKwktcmUgIiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgd2FybmluZyAiY291bGRuJ3QgY2hlY2sgZGVidWcgZm9ybWF0IChubyB2YWxpZCByZXNwb25zZSkuIgorCSAgICByZXR1cm4gMTsKKwl9CisJdGltZW91dCB7CisJICAgIHdhcm5pbmcgImNvdWxkbid0IGNoZWNrIGRlYnVnIGZvcm1hdCAodGltZWQgb3V0KS4iCisJICAgIHJldHVybiAxOworCX0KKyAgICB9Cit9CisKKyMgTGlrZSBzZXR1cF94ZmFpbCwgYnV0IHRha2VzIHRoZSBuYW1lIG9mIGEgZGVidWcgZm9ybWF0IChEV0FSRiAxLAorIyBDT0ZGLCBzdGFicywgZXRjKS4gIElmIHRoYXQgZm9ybWF0IG1hdGNoZXMgdGhlIGZvcm1hdCB0aGF0IHRoZQorIyBjdXJyZW50IHRlc3Qgd2FzIGNvbXBpbGVkIHdpdGgsIHRoZW4gdGhlIG5leHQgdGVzdCBpcyBleHBlY3RlZCB0bworIyBmYWlsIGZvciBhbnkgdGFyZ2V0LiAgUmV0dXJucyAxIGlmIHRoZSBuZXh0IHRlc3Qgb3Igc2V0IG9mIHRlc3RzIGlzCisjIGV4cGVjdGVkIHRvIGZhaWwsIDAgb3RoZXJ3aXNlIChvciBpZiBpdCBpcyB1bmtub3duKS4gIE11c3QgaGF2ZQorIyBwcmV2aW91c2x5IGNhbGxlZCBnZXRfZGVidWdfZm9ybWF0LgorCitwcm9jIHNldHVwX3hmYWlsX2Zvcm1hdCB7IGZvcm1hdCB9IHsKKyAgICBnbG9iYWwgZGVidWdfZm9ybWF0CisKKyAgICBpZiBbc3RyaW5nIG1hdGNoICRkZWJ1Z19mb3JtYXQgJGZvcm1hdF0gdGhlbiB7CisJc2V0dXBfeGZhaWwgIiotKi0qIgorCXJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMAorfSAgICAKKworcHJvYyBnZGJfc3RlcF9mb3Jfc3R1YiB7IH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0OworCisgICAgaWYgIVt0YXJnZXRfaW5mbyBleGlzdHMgZ2RiLHVzZV9icmVha3BvaW50X2Zvcl9zdHViXSB7CisJaWYgW3RhcmdldF9pbmZvIGV4aXN0cyBnZGJfc3R1Yl9zdGVwX2NvbW1hbmRdIHsKKwkgICAgc2V0IGNvbW1hbmQgW3RhcmdldF9pbmZvIGdkYl9zdHViX3N0ZXBfY29tbWFuZF07CisJfSBlbHNlIHsKKwkgICAgc2V0IGNvbW1hbmQgInN0ZXAiOworCX0KKwlzZW5kX2dkYiAiJHtjb21tYW5kfVxuIjsKKwlzZXQgdHJpZXMgMDsKKwlnZGJfZXhwZWN0IDYwIHsKKwkgICAgLXJlICIobWFpbi4qIGF0IHwuKmluIC4qc3RhcnQpLiokZ2RiX3Byb21wdCIgeworCQlyZXR1cm47CisJICAgIH0KKwkgICAgLXJlICIuKiRnZGJfcHJvbXB0IiB7CisJCWluY3IgdHJpZXM7CisJCWlmIHsgJHRyaWVzID09IDUgfSB7CisJCSAgICBmYWlsICJzdGVwcGluZyBvdXQgb2YgYnJlYWtwb2ludCBmdW5jdGlvbiI7CisJCSAgICByZXR1cm47CisJCX0KKwkJc2VuZF9nZGIgIiR7Y29tbWFuZH1cbiI7CisJCWV4cF9jb250aW51ZTsKKwkgICAgfQorCSAgICBkZWZhdWx0IHsKKwkJZmFpbCAic3RlcHBpbmcgb3V0IG9mIGJyZWFrcG9pbnQgZnVuY3Rpb24iOworCQlyZXR1cm47CisJICAgIH0KKwl9CisgICAgfQorICAgIHNlbmRfZ2RiICJ3aGVyZVxuIjsKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIm1haW5cW15cclxuXF0qYXQgXChcW146XStcKTpcKFxbMC05XF0rXCkiIHsKKwkgICAgc2V0IGZpbGUgJGV4cGVjdF9vdXQoMSxzdHJpbmcpOworCSAgICBzZXQgbGluZW51bSBbZXhwciAkZXhwZWN0X291dCgyLHN0cmluZykgKyAxXTsKKwkgICAgc2V0IGJyZWFrcGxhY2UgIiR7ZmlsZX06JHtsaW5lbnVtfSI7CisJfQorCWRlZmF1bHQge30KKyAgICB9CisgICAgc2VuZF9nZGIgImJyZWFrICR7YnJlYWtwbGFjZX1cbiI7CisgICAgZ2RiX2V4cGVjdCA2MCB7CisJLXJlICJCcmVha3BvaW50IChcWzAtOVxdKykgYXQuKiRnZGJfcHJvbXB0IiB7CisJICAgIHNldCBicmVha3BvaW50ICRleHBlY3Rfb3V0KDEsc3RyaW5nKTsKKwl9CisJLXJlICJCcmVha3BvaW50IChcWzAtOVxdKyk6IGZpbGUuKiRnZGJfcHJvbXB0IiB7CisJICAgIHNldCBicmVha3BvaW50ICRleHBlY3Rfb3V0KDEsc3RyaW5nKTsKKwl9CisJZGVmYXVsdCB7fQorICAgIH0KKyAgICBzZW5kX2dkYiAiY29udGludWVcbiI7CisgICAgZ2RiX2V4cGVjdCA2MCB7CisJLXJlICJCcmVha3BvaW50ICR7YnJlYWtwb2ludH0sLiokZ2RiX3Byb21wdCIgeworCSAgICBnZGJfdGVzdCAiZGVsZXRlICRicmVha3BvaW50IiAiLioiICIiOworCSAgICByZXR1cm47CisJfQorCWRlZmF1bHQge30KKyAgICB9Cit9CisKKyMjIyBnZGJfZ2V0X2xpbmVfbnVtYmVyIFRFWFQgW0ZJTEVdCisjIyMKKyMjIyBTZWFyY2ggdGhlIHNvdXJjZSBmaWxlIEZJTEUsIGFuZCByZXR1cm4gdGhlIGxpbmUgbnVtYmVyIG9mIGEgbGluZQorIyMjIGNvbnRhaW5pbmcgVEVYVC4gIFVzZSB0aGlzIGZ1bmN0aW9uIGluc3RlYWQgb2YgaGFyZC1jb2RpbmcgbGluZQorIyMjIG51bWJlcnMgaW50byB5b3VyIHRlc3Qgc2NyaXB0LgorIyMjCisjIyMgU3BlY2lmaWNhbGx5LCB0aGlzIGZ1bmN0aW9uIHVzZXMgR0RCJ3MgInNlYXJjaCIgY29tbWFuZCB0byBzZWFyY2gKKyMjIyBGSUxFIGZvciB0aGUgZmlyc3QgbGluZSBjb250YWluaW5nIFRFWFQsIGFuZCByZXR1cm5zIGl0cyBsaW5lCisjIyMgbnVtYmVyLiAgVGh1cywgRklMRSBtdXN0IGJlIGEgc291cmNlIGZpbGUsIGNvbXBpbGVkIGludG8gdGhlCisjIyMgZXhlY3V0YWJsZSB5b3UgYXJlIHJ1bm5pbmcuICBJZiBvbWl0dGVkLCBGSUxFIGRlZmF1bHRzIHRvIHRoZQorIyMjIHZhbHVlIG9mIHRoZSBnbG9iYWwgdmFyaWFibGUgYHNyY2ZpbGUnOyBtb3N0IHRlc3Qgc2NyaXB0cyBzZXQKKyMjIyBgc3JjZmlsZScgYXBwcm9wcmlhdGVseSBhdCB0aGUgdG9wIGFueXdheS4KKyMjIworIyMjIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGtlZXAgeW91ciB0ZXN0IHNjcmlwdHMgaW5kZXBlbmRlbnQgb2YgdGhlCisjIyMgZXhhY3QgbGluZSBudW1iZXJpbmcgb2YgdGhlIHNvdXJjZSBmaWxlLiAgRG9uJ3Qgd3JpdGU6CisjIyMgCisjIyMgICBzZW5kX2dkYiAiYnJlYWsgMjAiCisjIyMgCisjIyMgVGhpcyBtZWFucyB0aGF0IGlmIGFueW9uZSBldmVyIGVkaXRzIHlvdXIgdGVzdCdzIHNvdXJjZSBmaWxlLCAKKyMjIyB5b3VyIHRlc3QgY291bGQgYnJlYWsuICBJbnN0ZWFkLCBwdXQgYSBjb21tZW50IGxpa2UgdGhpcyBvbiB0aGUKKyMjIyBzb3VyY2UgZmlsZSBsaW5lIHlvdSB3YW50IHRvIGJyZWFrIGF0OgorIyMjIAorIyMjICAgLyogYnJlYWtwb2ludCBzcG90OiBmcm90ei5leHA6IHRlc3QgbmFtZSAqLworIyMjIAorIyMjIGFuZCB0aGVuIHdyaXRlLCBpbiB5b3VyIHRlc3Qgc2NyaXB0ICh3aGljaCB3ZSBhc3N1bWUgaXMgbmFtZWQKKyMjIyBmcm90ei5leHApOgorIyMjIAorIyMjICAgc2VuZF9nZGIgImJyZWFrIFtnZGJfZ2V0X2xpbmVfbnVtYmVyICJmcm90ei5leHA6IHRlc3QgbmFtZSJdXG4iCisjIyMKKyMjIyAoWWVzLCBUY2wga25vd3MgaG93IHRvIGhhbmRsZSB0aGUgbmVzdGVkIHF1b3RlcyBhbmQgYnJhY2tldHMuCisjIyMgVHJ5IHRoaXM6CisjIyMgCSQgdGNsc2gKKyMjIyAJJSBwdXRzICJmb28gW2xpbmRleCAiYmFyIGJheiIgMV0iCisjIyMgCWZvbyBiYXoKKyMjIyAJJSAKKyMjIyBUY2wgaXMgcXVpdGUgY2xldmVyLCBmb3IgYSBsaXR0bGUgc3RyaW5neSBsYW5ndWFnZS4pCisKK3Byb2MgZ2RiX2dldF9saW5lX251bWJlciB7dGV4dCB7ZmlsZSAvb21pdHRlZC99fSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQ7CisgICAgZ2xvYmFsIHNyY2ZpbGU7CisKKyAgICBpZiB7ISBbc3RyaW5nIGNvbXBhcmUgJGZpbGUgL29taXR0ZWQvXX0geworCXNldCBmaWxlICRzcmNmaWxlCisgICAgfQorCisgICAgc2V0IHJlc3VsdCAtMTsKKyAgICBnZGJfdGVzdCAibGlzdCAke2ZpbGV9OjEsMSIgIi4qIiAiIgorICAgIHNlbmRfZ2RiICJzZWFyY2ggJHt0ZXh0fVxuIgorICAgIGdkYl9leHBlY3QgeworICAgICAgICAtcmUgIlxbXHJcblxdKyhcWzAtOVxdKylcWyBcdFxdLioke3RleHR9LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBzZXQgcmVzdWx0ICRleHBlY3Rfb3V0KDEsc3RyaW5nKQorICAgICAgICB9CisgICAgICAgIC1yZSAiLiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgICAgICBmYWlsICJmaW5kIGxpbmUgbnVtYmVyIGNvbnRhaW5pbmcgXCIke3RleHR9XCIiCisgICAgICAgIH0KKyAgICAgICAgdGltZW91dCB7CisgICAgICAgICAgICBmYWlsICJmaW5kIGxpbmUgbnVtYmVyIGNvbnRhaW5pbmcgXCIke3RleHR9XCIgKHRpbWVvdXQpIgorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkcmVzdWx0OworfQorCisKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvbGliL3RyYWNlLXN1cHBvcnQuZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9saWIvdHJhY2Utc3VwcG9ydC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2NTc5MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90ZXN0c3VpdGUvbGliL3RyYWNlLXN1cHBvcnQuZXhwCkBAIC0wLDAgKzEsMzA3IEBACisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKKworIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKKyMgYnVnLWdkYkBwcmVwLmFpLm1pdC5lZHUKKworCisjCisjIFN1cHBvcnQgcHJvY2VkdXJlcyBmb3IgdHJhY2UgdGVzdGluZworIworCisKKyMKKyMgUHJvY2VkdXJlOiBnZGJfdGFyZ2V0X3N1cHBvcnRzX3RyYWNlCisjIFJldHVybnMgdHJ1ZSBpZiBHREIgaXMgY29ubmVjdGVkIHRvIGEgdGFyZ2V0IHRoYXQgc3VwcG9ydHMgdHJhY2luZy4KKyMgQWxsb3dzIHRlc3RzIHRvIGFib3J0IGVhcmx5IGlmIG5vdCBydW5uaW5nIG9uIGEgdHJhY2UtYXdhcmUgdGFyZ2V0LgorIworCitwcm9jIGdkYl90YXJnZXRfc3VwcG9ydHNfdHJhY2UgeyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdAorCisgICAgc2VuZF9nZGIgInRzdGF0dXNcbiIKKyAgICBnZGJfZXhwZWN0IHsKKwktcmUgIlxbVHRcXXJhY2UgY2FuIG9ubHkgYmUgcnVuIG9uLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHJldHVybiAwCisJfQorCS1yZSAiXFtUdFxdcmFjZSBjYW4gbm90IGJlIHJ1biBvbi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICByZXR1cm4gMAorCX0KKwktcmUgIlxbVHRcXWFyZ2V0IGRvZXMgbm90IHN1cHBvcnQuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcmV0dXJuIDAKKwl9CisJLXJlICIuKlxbRWVcXXJyb3IuKiRnZGJfcHJvbXB0ICQiIHsKKwkgICAgcmV0dXJuIDAKKwl9CisJLXJlICIuKlxbV3dcXWFybmluZy4qJGdkYl9wcm9tcHQgJCIgeworCSAgICByZXR1cm4gMAorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeworCSAgICByZXR1cm4gMQorCX0KKwl0aW1lb3V0IHsKKwkgICAgcmV0dXJuIDAKKwl9CisgICAgfQorfQorCisKKyMKKyMgUHJvY2VkdXJlOiBnZGJfZGVsZXRlX3RyYWNlcG9pbnRzCisjIE1hbnkgb2YgdGhlIHRlc3RzIGRlcGVuZCBvbiBzZXR0aW5nIHRyYWNlcG9pbnRzIGF0IHZhcmlvdXMgcGxhY2VzIGFuZAorIyBydW5uaW5nIHVudGlsIHRoYXQgdHJhY2Vwb2ludCBpcyByZWFjaGVkLiAgQXQgdGltZXMsIHdlIHdhbnQgdG8gc3RhcnQKKyMgd2l0aCBhIGNsZWFuIHNsYXRlIHdpdGggcmVzcGVjdCB0byB0cmFjZXBvaW50cywgc28gdGhpcyB1dGlsaXR5IHByb2MgCisjIGxldHMgdXMgZG8gdGhpcyB3aXRob3V0IGR1cGxpY2F0aW5nIHRoaXMgY29kZSBldmVyeXdoZXJlLgorIworCitwcm9jIGdkYl9kZWxldGVfdHJhY2Vwb2ludHMge30geworICAgIGdsb2JhbCBnZGJfcHJvbXB0CisKKyAgICBzZW5kX2dkYiAiZGVsZXRlIHRyYWNlcG9pbnRzXG4iCisgICAgZ2RiX2V4cGVjdCAzMCB7CisJLXJlICJEZWxldGUgYWxsIHRyYWNlcG9pbnRzLip5IG9yIG4uKiQiIHsKKwkgICAgc2VuZF9nZGIgInlcbiI7CisJICAgIGV4cF9jb250aW51ZQorCX0KKwktcmUgIi4qJGdkYl9wcm9tcHQgJCIgeyAjIFRoaXMgaGFwcGVucyBpZiB0aGVyZSB3ZXJlIG5vIHRyYWNlcG9pbnRzIH0KKwl0aW1lb3V0IHsgCisJICAgIHBlcnJvciAiRGVsZXRlIGFsbCB0cmFjZXBvaW50cyBpbiBkZWxldGVfdHJhY2Vwb2ludHMgKHRpbWVvdXQpIiAKKwkgICAgcmV0dXJuIAorCX0KKyAgICB9CisgICAgc2VuZF9nZGIgImluZm8gdHJhY2Vwb2ludHNcbiIKKyAgICBnZGJfZXhwZWN0IDMwIHsKKwkgLXJlICJObyB0cmFjZXBvaW50cy4qJGdkYl9wcm9tcHQgJCIge30KKwkgLXJlICIkZ2RiX3Byb21wdCAkIiB7IHBlcnJvciAidHJhY2Vwb2ludHMgbm90IGRlbGV0ZWQiIDsgcmV0dXJuIH0KKwkgdGltZW91dCB7IHBlcnJvciAiaW5mbyB0cmFjZXBvaW50cyAodGltZW91dCkiIDsgcmV0dXJuIH0KKyAgICB9Cit9CisKKyMKKyMgUHJvY2VkdXJlOiBnZGJfdHJhY2Vfc2V0YWN0aW9ucworIyAgIERlZmluZSBhY3Rpb25zIGZvciBhIHRyYWNlcG9pbnQuCisjICAgQXJndW1lbnRzOgorIwl0ZXN0bmFtZSAgIC0tIGlkZW50aWZ5aW5nIHN0cmluZyBmb3IgcGFzcy9mYWlsIG91dHB1dAorIwl0cmFjZXBvaW50IC0tIHRvIHdoaWNoIHRyYWNlcG9pbnQgZG8gdGhlc2UgYWN0aW9ucyBhcHBseT8gKG9wdGlvbmFsKQorIwlhcmdzICAgICAgIC0tIGxpc3Qgb2YgYWN0aW9ucyB0byBiZSBkZWZpbmVkLgorIyAgIFJldHVybnM6CisjCXplcm8gICAgICAgLS0gc3VjY2VzcworIwlub24temVybyAgIC0tIGZhaWx1cmUKKworcHJvYyBnZGJfdHJhY2Vfc2V0YWN0aW9ucyB7IHRlc3RuYW1lIHRyYWNlcG9pbnQgYXJncyB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdDsKKworICAgIHNldCBzdGF0ZSAwOworICAgIHNldCBwYXNzZmFpbCAicGFzcyI7CisgICAgc2VuZF9nZGIgImFjdGlvbnMgJHRyYWNlcG9pbnRcbiI7CisgICAgc2V0IGV4cGVjdGVkX3Jlc3VsdCAiIjsKKyAgICBnZGJfZXhwZWN0IDUgeworCS1yZSAiTm8gdHJhY2Vwb2ludCBudW1iZXIgLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIGZhaWwgJHRlc3RuYW1lCisJICAgIHJldHVybiAxOworCX0KKwktcmUgIkVudGVyIGFjdGlvbnMgZm9yIHRyYWNlcG9pbnQgJHRyYWNlcG9pbnQuKj4iIHsKKwkgICAgaWYgeyBbbGxlbmd0aCAkYXJnc10gPiAwIH0geworCQlzZXQgbGFzdGNvbW1hbmQgIltsaW5kZXggJGFyZ3MgJHN0YXRlXSI7CisJCXNlbmRfZ2RiICJbbGluZGV4ICRhcmdzICRzdGF0ZV1cbiI7CisJCWluY3Igc3RhdGU7CisJCXNldCBleHBlY3RlZF9yZXN1bHQgW2xpbmRleCAkYXJncyAkc3RhdGVdOworCQlpbmNyIHN0YXRlOworCSAgICB9IGVsc2UgeworCQlzZW5kX2dkYiAiZW5kXG4iOworCSAgICB9CisJICAgIGV4cF9jb250aW51ZTsKKwl9CisJLXJlICJcKC4qXClcW1xyXG5cXStcWyBcdF0qPiAkIiB7CisJICAgIGlmIHsgJGV4cGVjdGVkX3Jlc3VsdCAhPSAiIiB9IHsKKwkJcmVnc3ViICJeXFteXHJcblxdK1xbXHJcblxdKyIgIiRleHBlY3Rfb3V0KDEsc3RyaW5nKSIgIiIgb3V0OworCQlpZiAhW3JlZ2V4cCAkZXhwZWN0ZWRfcmVzdWx0ICRvdXRdIHsKKwkJICAgIHNldCBwYXNzZmFpbCAiZmFpbCI7CisJCX0KKwkJc2V0IGV4cGVjdGVkX3Jlc3VsdCAiIjsKKwkgICAgfQorCSAgICBpZiB7ICRzdGF0ZSA8IFtsbGVuZ3RoICRhcmdzXSB9IHsKKwkJc2VuZF9nZGIgIltsaW5kZXggJGFyZ3MgJHN0YXRlXVxuIjsKKwkJaW5jciBzdGF0ZTsKKwkJc2V0IGV4cGVjdGVkX3Jlc3VsdCBbbGluZGV4ICRhcmdzICRzdGF0ZV07CisJCWluY3Igc3RhdGU7CisJICAgIH0gZWxzZSB7CisJCXNlbmRfZ2RiICJlbmRcbiI7CisJCXNldCBleHBlY3RlZF9yZXN1bHQgIiI7CisJICAgIH0KKwkgICAgZXhwX2NvbnRpbnVlOworCX0KKwktcmUgIlwoLipcKSRnZGJfcHJvbXB0ICQiIHsKKwkgICAgaWYgeyAkZXhwZWN0ZWRfcmVzdWx0ICE9ICIiIH0geworCQlpZiAhW3JlZ2V4cCAkZXhwZWN0ZWRfcmVzdWx0ICRleHBlY3Rfb3V0KDEsc3RyaW5nKV0geworCQkgICAgc2V0IHBhc3NmYWlsICJmYWlsIjsKKwkJfQorCQlzZXQgZXhwZWN0ZWRfcmVzdWx0ICIiOworCSAgICB9CisJICAgIGlmIHsgW2xsZW5ndGggJGFyZ3NdIDwgJHN0YXRlIH0geworCQlzZXQgcGFzc2ZhaWwgImZhaWwiOworCSAgICB9CisJfQorCWRlZmF1bHQgeworCSAgICBzZXQgcGFzc2ZhaWwgImZhaWwiOworCX0KKyAgICB9CisgICAgaWYgeyAkdGVzdG5hbWUgIT0gIiIgfSB7CisJJHBhc3NmYWlsICR0ZXN0bmFtZTsKKyAgICB9CisgICAgaWYgeyAkcGFzc2ZhaWwgPT0gInBhc3MiIH0gdGhlbiB7IAorCXJldHVybiAwOworICAgIH0gZWxzZSB7CisJcmV0dXJuIDE7CisgICAgfQorfQorCisjCisjIFByb2NlZHVyZTogZ2RiX3RmaW5kX3Rlc3QKKyMgICBGaW5kIGEgc3BlY2lmaWVkIHRyYWNlIGZyYW1lLgorIyAgIEFyZ3VtZW50czogCisjCXRlc3RuYW1lICAgLS0gaWRlbnRpZnlpbmcgc3RyaW5nIGZvciBwYXNzL2ZhaWwgb3V0cHV0CisjCXRmaW5kX2FyZyAgLS0gZnJhbWUgKGxpbmUsIFBDLCBldGMuKSBpZGVudGlmaWVyCisjCWV4cF9yZXMgICAgLS0gRXhwZWN0ZWQgcmVzdWx0IG9mIGZyYW1lIHRlc3QKKyMJYXJncyAgICAgICAtLSBUZXN0IGV4cHJlc3Npb24KKyMgICBSZXR1cm5zOgorIwl6ZXJvICAgICAgIC0tIHN1Y2Nlc3MKKyMJbm9uLXplcm8gICAtLSBmYWlsdXJlCisjCisKK3Byb2MgZ2RiX3RmaW5kX3Rlc3QgeyB0ZXN0bmFtZSB0ZmluZF9hcmcgZXhwX3JlcyBhcmdzIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0OworCisgICAgaWYgeyAiJGFyZ3MiICE9ICIiIH0geworCXNldCBleHByICIkZXhwX3JlcyI7CisJc2V0IGV4cF9yZXMgIiRhcmdzIjsKKyAgICB9IGVsc2UgeworCXNldCBleHByICIoaW50KSBcJHRyYWNlX2ZyYW1lIjsKKyAgICB9CisgICAgc2V0IHBhc3NmYWlsICJmYWlsIjsKKworICAgIGdkYl90ZXN0ICJ0ZmluZCAkdGZpbmRfYXJnIiAiIiAiIgorICAgIHNlbmRfZ2RiICJwcmludGYgXCJ4IFwlZCB4XFxuXCIsICRleHByXG4iOworICAgIGdkYl9leHBlY3QgMTAgeworCS1yZSAieCAoLSpcWzAtOVxdKykgeCIgeworCSAgICBpZiB7ICRleHBlY3Rfb3V0KDEsc3RyaW5nKSA9PSAkZXhwX3JlcyB9IHsKKwkJc2V0IHBhc3NmYWlsICJwYXNzIjsKKwkgICAgfQorCSAgICBleHBfY29udGludWU7CisJfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyB9CisgICAgfQorICAgICRwYXNzZmFpbCAiJHRlc3RuYW1lIjsKKyAgICBpZiB7ICRwYXNzZmFpbCA9PSAicGFzcyIgfSB0aGVuIHsgCisJcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gMTsKKyAgICB9Cit9CisKKyMKKyMgUHJvY2VkdXJlOiBnZGJfcmVhZGV4cHIKKyMgICBBcmd1bWVudHM6CisjCWdkYl9leHByICAgIC0tIHRoZSBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGRlc2lyZWQKKyMgICBSZXR1cm5zOgorIwl0aGUgdmFsdWUgb2YgZ2RiX2V4cHIsIGFzIGV2YWx1YXRlZCBieSBnZGIuCisjICAgICAgIFtGSVhNRTogcmV0dXJucyAtMSBvbiBlcnJvciwgd2hpY2ggaXMgc29tZXRpbWVzIGEgbGVnaXQgdmFsdWVdCisjCisKK3Byb2MgZ2RiX3JlYWRleHByIHsgZ2RiX2V4cHIgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQ7CisKKyAgICBzZXQgcmVzdWx0IC0xOworICAgIHNlbmRfZ2RiICJwcmludCAkZ2RiX2V4cHJcbiIKKyAgICBnZGJfZXhwZWN0IDUgeworCS1yZSAiXFskXF0uKj0gKFxbMC05XF0rKS4qJGdkYl9wcm9tcHQgJCIgeworCSAgICBzZXQgcmVzdWx0ICRleHBlY3Rfb3V0KDEsc3RyaW5nKTsKKwl9CisJLXJlICIkZ2RiX3Byb21wdCAkIiB7IH0KKwlkZWZhdWx0IHsgfQorICAgIH0KKyAgICByZXR1cm4gJHJlc3VsdDsKK30KKworIworIyBQcm9jZWR1cmU6IGdkYl9nZXR0cG51bQorIyAgIEFyZ3VtZW50czoKKyMJdHJhY2Vwb2ludCAob3B0aW9uYWwpOiBpZiBzdXBwbGllZCwgc2V0IGEgdHJhY2Vwb2ludCBoZXJlLgorIyAgIFJldHVybnM6CisjCXRoZSB0cmFjZXBvaW50IElEIG9mIHRoZSBtb3N0IHJlY2VudGx5IHNldCB0cmFjZXBvaW50LgorIworCitwcm9jIGdkYl9nZXR0cG51bSB7IHRyYWNlcG9pbnQgfSB7CisgICAgZ2xvYmFsIGdkYl9wcm9tcHQ7CisKKyAgICBpZiB7ICR0cmFjZXBvaW50ICE9ICIiIH0geworCWdkYl90ZXN0ICJ0cmFjZSAkdHJhY2Vwb2ludCIgIiIgIiIKKyAgICB9CisgICAgcmV0dXJuIFtnZGJfcmVhZGV4cHIgIlwkdHBudW0iXTsKK30KKworCisjCisjIFByb2NlZHVyZTogZ2RiX2ZpbmRfZnVuY3Rpb25fYmFzZWxpbmUKKyMgICBBcmd1bWVudHM6CisjCWZ1bmNfbmFtZSAtLSBuYW1lIG9mIHNvdXJjZSBmdW5jdGlvbgorIyAgIFJldHVybnM6CisjCVNvdXJjZWZpbGUgbGluZSBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIChvcGVuIGN1cmx5IGJyYWNlKSwKKyMJb3IgLTEgb24gZmFpbHVyZS4gIENhbGxlciBtdXN0IGNoZWNrIHJldHVybiB2YWx1ZS4KKyMgICBOb3RlOgorIwlXb3JrcyBvbmx5IGZvciBvcGVuIGN1cmx5IGJyYWNlIGF0IGJlZ2lubmluZyBvZiBzb3VyY2UgbGluZSEKKyMKKworcHJvYyBnZGJfZmluZF9mdW5jdGlvbl9iYXNlbGluZSB7IGZ1bmNfbmFtZSB9IHsKKyAgICBnbG9iYWwgZ2RiX3Byb21wdDsKKworICAgIHNldCBiYXNlbGluZSAtMTsKKworICAgIHNlbmRfZ2RiICJsaXN0ICRmdW5jX25hbWVcbiIKKyMgICAgZ2RiX2V4cGVjdCB7CisjCS1yZSAiXFtcclxuXF1cW1x7XF0uKiRnZGJfcHJvbXB0ICQiIHsKKyMJICAgIHNldCBiYXNlbGluZSAxCisjICAgICAgICB9CisjICAgIH0KK30KKworIworIyBQcm9jZWR1cmU6IGdkYl9maW5kX2Z1bmN0aW9uX2Jhc2VsaW5lCisjICAgQXJndW1lbnRzOgorIwlmaWxlbmFtZTogbmFtZSBvZiBzb3VyY2UgZmlsZSBvZiBkZXNpcmVkIGZ1bmN0aW9uLgorIyAgIFJldHVybnM6CisjCVNvdXJjZWZpbGUgbGluZSBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIChvcGVuIGN1cmx5IGJyYWNlKSwKKyMJb3IgLTEgb24gZmFpbHVyZS4gIENhbGxlciBtdXN0IGNoZWNrIHJldHVybiB2YWx1ZS4KKyMgICBOb3RlOgorIwlXb3JrcyBvbmx5IGZvciBvcGVuIGN1cmx5IGJyYWNlIGF0IGJlZ2lubmluZyBvZiBzb3VyY2UgbGluZSEKKyMKKworcHJvYyBnZGJfZmluZF9yZWN1cnNpb25fdGVzdF9iYXNlbGluZSB7IGZpbGVuYW1lIH0geworICAgIGdsb2JhbCBnZGJfcHJvbXB0OworCisgICAgc2V0IGJhc2VsaW5lIC0xOworCisgICAgZ2RiX3Rlc3QgImxpc3QgJGZpbGVuYW1lOjEiICIiICIiCisgICAgc2VuZF9nZGIgInNlYXJjaCBnZGJfcmVjdXJzaW9uX3Rlc3QgbGluZSAwXG4iCisgICAgZ2RiX2V4cGVjdCB7CisJLXJlICIoXFswLTlcXSspXFtcdCBcXStcey4qbGluZSAwLiokZ2RiX3Byb21wdCAkIiB7CisJICAgIHNldCBiYXNlbGluZSAkZXhwZWN0X291dCgxLHN0cmluZyk7CisJfQorCS1yZSAiJGdkYl9wcm9tcHQgJCIgeyB9CisJZGVmYXVsdCB7IH0KKyAgICB9CisgICAgcmV0dXJuICRiYXNlbGluZTsKK30KZGlmZiAtLWdpdCBhL2dkYi90aHJlYWQuYyBiL2dkYi90aHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTdhYjA5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3RocmVhZC5jCkBAIC0wLDAgKzEsNzIxIEBACisvKiBNdWx0aS1wcm9jZXNzL3RocmVhZCBjb250cm9sIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OCwgMTk5MywgMTk5OAorCisgICBDb250cmlidXRlZCBieSBMeW54IFJlYWwtVGltZSBTeXN0ZW1zLCBJbmMuICBMb3MgR2F0b3MsIENBLgorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAiZW52aXJvbi5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiZ2RidGhyZWFkLmgiCisjaW5jbHVkZSAiY29tbWFuZC5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworLyojaW5jbHVkZSAibHlueG9zLWNvcmUuaCIqLworCitzdHJ1Y3QgdGhyZWFkX2luZm8KK3sKKyAgc3RydWN0IHRocmVhZF9pbmZvICpuZXh0OworICBpbnQgcGlkOwkJCS8qIEFjdHVhbCBwcm9jZXNzIGlkICovCisgIGludCBudW07CQkJLyogQ29udmVuaWVudCBoYW5kbGUgKi8KKyAgQ09SRV9BRERSIHByZXZfcGM7CQkvKiBTdGF0ZSBmcm9tIHdhaXRfZm9yX2luZmVyaW9yICovCisgIENPUkVfQUREUiBwcmV2X2Z1bmNfc3RhcnQ7CisgIGNoYXIgKnByZXZfZnVuY19uYW1lOworICBzdHJ1Y3QgYnJlYWtwb2ludCAqc3RlcF9yZXN1bWVfYnJlYWtwb2ludDsKKyAgc3RydWN0IGJyZWFrcG9pbnQgKnRocm91Z2hfc2lndHJhbXBfYnJlYWtwb2ludDsKKyAgQ09SRV9BRERSIHN0ZXBfcmFuZ2Vfc3RhcnQ7CisgIENPUkVfQUREUiBzdGVwX3JhbmdlX2VuZDsKKyAgQ09SRV9BRERSIHN0ZXBfZnJhbWVfYWRkcmVzczsKKyAgaW50IHRyYXBfZXhwZWN0ZWQ7CisgIGludCBoYW5kbGluZ19sb25nam1wOworICBpbnQgYW5vdGhlcl90cmFwOworCisgIC8qIFRoaXMgaXMgc2V0IFRSVUUgd2hlbiBhIGNhdGNocG9pbnQgb2YgYSBzaGFyZWQgbGlicmFyeSBldmVudAorICAgICB0cmlnZ2Vycy4gIFNpbmNlIHdlIGRvbid0IHdpc2ggdG8gbGVhdmUgdGhlIGluZmVyaW9yIGluIHRoZQorICAgICBzb2xpYiBob29rIHdoZW4gd2UgcmVwb3J0IHRoZSBldmVudCwgd2Ugc3RlcCB0aGUgaW5mZXJpb3IKKyAgICAgYmFjayB0byB1c2VyIGNvZGUgYmVmb3JlIHN0b3BwaW5nIGFuZCByZXBvcnRpbmcgdGhlIGV2ZW50LgorICAgICAqLworICBpbnQgIHN0ZXBwaW5nX3Rocm91Z2hfc29saWJfYWZ0ZXJfY2F0Y2g7CisKKyAgLyogV2hlbiBzdGVwcGluZ190aHJvdWdoX3NvbGliX2FmdGVyX2NhdGNoIGlzIFRSVUUsIHRoaXMgaXMgYQorICAgICBsaXN0IG9mIHRoZSBjYXRjaHBvaW50cyB0aGF0IHNob3VsZCBiZSByZXBvcnRlZCBhcyB0cmlnZ2VyaW5nCisgICAgIHdoZW4gd2UgZmluYWxseSBkbyBzdG9wIHN0ZXBwaW5nLgorICAgICAqLworICBicHN0YXQgIHN0ZXBwaW5nX3Rocm91Z2hfc29saWJfY2F0Y2hwb2ludHM7CisKKyAgLyogVGhpcyBpcyBzZXQgdG8gVFJVRSB3aGVuIHRoaXMgdGhyZWFkIGlzIGluIGEgc2lnbmFsIGhhbmRsZXIKKyAgICAgdHJhbXBvbGluZSBhbmQgd2UncmUgc2luZ2xlLXN0ZXBwaW5nIHRocm91Z2ggaXQgKi8KKyAgaW50IHN0ZXBwaW5nX3Rocm91Z2hfc2lndHJhbXA7CisKK307CisKKy8qIFByb3RvdHlwZXMgZm9yIGV4cG9ydGVkIGZ1bmN0aW9ucy4gKi8KKwordm9pZCBfaW5pdGlhbGl6ZV90aHJlYWQgUEFSQU1TICgodm9pZCkpOworCisvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICovCisKKyNpZiAhZGVmaW5lZChGSU5EX05FV19USFJFQURTKQorI2RlZmluZSBGSU5EX05FV19USFJFQURTIHRhcmdldF9maW5kX25ld190aHJlYWRzCisjZW5kaWYgIAorCQkJICAgCitzdGF0aWMgc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWRfbGlzdCA9IE5VTEw7CitzdGF0aWMgaW50IGhpZ2hlc3RfdGhyZWFkX251bTsKKworc3RhdGljIHN0cnVjdCB0aHJlYWRfaW5mbyAqIGZpbmRfdGhyZWFkX2lkIFBBUkFNUyAoKGludCBudW0pKTsKKworc3RhdGljIHZvaWQgdGhyZWFkX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqIHRpZHN0ciwgaW50IGZyb21fdHR5KSk7CitzdGF0aWMgdm9pZCB0aHJlYWRfYXBwbHlfYWxsX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyBpbnQgIHRocmVhZF9hbGl2ZSBQQVJBTVMgKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikpOworc3RhdGljIHZvaWQgaW5mb190aHJlYWRzX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIHRocmVhZF9hcHBseV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCByZXN0b3JlX2N1cnJlbnRfdGhyZWFkIFBBUkFNUyAoKGludCkpOworc3RhdGljIHZvaWQgc3dpdGNoX3RvX3RocmVhZCBQQVJBTVMgKChpbnQgcGlkKSk7CitzdGF0aWMgdm9pZCBwcnVuZV90aHJlYWRzIFBBUkFNUyAoKHZvaWQpKTsKKworLyogSWYgdGhlIGhvc3QgaGFzIHRocmVhZHMsIHRoZSBob3N0IG1hY2hpbmUgZGVmaW5pdGlvbiBtYXkgc2V0IHRoaXMKKyAgIG1hY3JvLiBCdXQsIGZvciByZW1vdGUgdGhyZWFkIGRlYnVnZ2luZywgaXQgZ2V0cyBtb3JlIGNvbXBsZXggYW5kCisgICBzZXR0aW5nIG1hY3JvcyBkb2VzIG5vdCBiaW5kIHRvIHRoZSB2YXJpb3VzIHRhcmdldCBkZXBlbmRlbnQKKyAgIG1ldGhvZHMgd2VsbC4gU28sIHdlIHVzZSB0aGUgdmVjdG9yIHRhcmdldF90aHJlYWRfZnVuY3Rpb25zICovCisKK3N0YXRpYyBzdHJ1Y3QgdGFyZ2V0X3RocmVhZF92ZWN0b3IgKnRhcmdldF90aHJlYWRfZnVuY3Rpb25zOworCitpbnQKK3RhcmdldF9maW5kX25ld190aHJlYWRzICgpCit7CisgIGludCByZXR2YWwgPSAwOworICBpZiAodGFyZ2V0X3RocmVhZF9mdW5jdGlvbnMgJiYKKyAgICAgIHRhcmdldF90aHJlYWRfZnVuY3Rpb25zLT5maW5kX25ld190aHJlYWRzKQorICAgIHJldHZhbCA9ICgqKHRhcmdldF90aHJlYWRfZnVuY3Rpb25zLT5maW5kX25ld190aHJlYWRzKSkgKCk7CisgIHJldHVybiByZXR2YWw7CQkvKiBubyBzdXBwb3J0ICovCit9CisKKworaW50Cit0YXJnZXRfZ2V0X3RocmVhZF9pbmZvIFBBUkFNUyAoKGdkYl90aHJlYWRyZWYgKiByZWYsCisJCQkJaW50IHNlbGVjdGlvbiwJCS8qIEZJWE1FOiBTZWxlY3Rpb24gKi8KKwkJCQlzdHJ1Y3QgZ2RiX2V4dF90aHJlYWRfaW5mbyAqIGluZm8pKTsKKworaW50Cit0YXJnZXRfZ2V0X3RocmVhZF9pbmZvIChyZWYsIHNlbGVjdGlvbiwgaW5mbykKKworICAgICBnZGJfdGhyZWFkcmVmICpyZWY7CisgICAgIGludCBzZWxlY3Rpb247CisgICAgLyogRklYTUU6IFNlbGVjdGlvbiAqLworICAgICBzdHJ1Y3QgZ2RiX2V4dF90aHJlYWRfaW5mbyAqaW5mbzsKKworeworICBpbnQgcmV0dmFsID0gMDsKKyAgaWYgKHRhcmdldF90aHJlYWRfZnVuY3Rpb25zCisgICAgICAmJiB0YXJnZXRfdGhyZWFkX2Z1bmN0aW9ucy0+Z2V0X3RocmVhZF9pbmZvKQorICAgIHJldHZhbCA9ICgqKHRhcmdldF90aHJlYWRfZnVuY3Rpb25zLT5nZXRfdGhyZWFkX2luZm8pKSAocmVmLCBzZWxlY3Rpb24sIGluZm8pOworICByZXR1cm4gcmV0dmFsOworfQorCisKKy8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlc2UgYmluZCBhbmQgdW5iaW5mIGZ1bmN0aW9ucyBpbXBsZW1lbnQgYQorICAgc3RhY2sgdGhlIGludGVyZmFjZSBhbGxvd3MgaXQsIGJ1dCBpdHMgbm90IGltcGxlbWVudGVkIHRoYXQgd2F5CisgKi8KKworCit2b2lkCitiaW5kX3RhcmdldF90aHJlYWRfdmVjdG9yICh2ZWMpCisgICAgIHN0cnVjdCB0YXJnZXRfdGhyZWFkX3ZlY3RvciAqdmVjOworeworICB0YXJnZXRfdGhyZWFkX2Z1bmN0aW9ucyA9IHZlYzsKK30KKworc3RydWN0IHRhcmdldF90aHJlYWRfdmVjdG9yICoKK3VuYmluZF90YXJnZXRfdGhyZWFkX3ZlY3RvciAoKQoreworICBzdHJ1Y3QgdGFyZ2V0X3RocmVhZF92ZWN0b3IgKnJldHZhbDsKKyAgcmV0dmFsID0gdGFyZ2V0X3RocmVhZF9mdW5jdGlvbnM7CisgIHRhcmdldF90aHJlYWRfZnVuY3Rpb25zID0gMDsKKyAgcmV0dXJuIHJldHZhbDsKK30JCQkJLyogdW5iaW5kX3RhcmdldF90aHJlYWQtdmVjdG9yICovCisKK3ZvaWQKK2luaXRfdGhyZWFkX2xpc3QgKCkKK3sKKyAgc3RydWN0IHRocmVhZF9pbmZvICp0cCwgKnRwbmV4dDsKKworICBpZiAoIXRocmVhZF9saXN0KQorICAgIHJldHVybjsKKworICBmb3IgKHRwID0gdGhyZWFkX2xpc3Q7IHRwOyB0cCA9IHRwbmV4dCkKKyAgICB7CisgICAgICB0cG5leHQgPSB0cC0+bmV4dDsKKyAgICAgIGZyZWUgKHRwKTsKKyAgICB9CisKKyAgdGhyZWFkX2xpc3QgPSBOVUxMOworICBoaWdoZXN0X3RocmVhZF9udW0gPSAwOworfQorCit2b2lkCithZGRfdGhyZWFkIChwaWQpCisgICAgIGludCBwaWQ7Cit7CisgIHN0cnVjdCB0aHJlYWRfaW5mbyAqdHA7CisKKyAgdHAgPSAoc3RydWN0IHRocmVhZF9pbmZvICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHRocmVhZF9pbmZvKSk7CisKKyAgdHAtPnBpZCA9IHBpZDsKKyAgdHAtPm51bSA9ICsraGlnaGVzdF90aHJlYWRfbnVtOworICB0cC0+cHJldl9wYyA9IDA7CisgIHRwLT5wcmV2X2Z1bmNfc3RhcnQgPSAwOworICB0cC0+cHJldl9mdW5jX25hbWUgPSBOVUxMOworICB0cC0+c3RlcF9yYW5nZV9zdGFydCA9IDA7CisgIHRwLT5zdGVwX3JhbmdlX2VuZCA9IDA7CisgIHRwLT5zdGVwX2ZyYW1lX2FkZHJlc3MgPTA7CisgIHRwLT5zdGVwX3Jlc3VtZV9icmVha3BvaW50ID0gMDsKKyAgdHAtPnRocm91Z2hfc2lndHJhbXBfYnJlYWtwb2ludCA9IDA7CisgIHRwLT5oYW5kbGluZ19sb25nam1wID0gMDsKKyAgdHAtPnRyYXBfZXhwZWN0ZWQgPSAwOworICB0cC0+YW5vdGhlcl90cmFwID0gMDsKKyAgdHAtPnN0ZXBwaW5nX3Rocm91Z2hfc29saWJfYWZ0ZXJfY2F0Y2ggPSAwOworICB0cC0+c3RlcHBpbmdfdGhyb3VnaF9zb2xpYl9jYXRjaHBvaW50cyA9IE5VTEw7CisgIHRwLT5zdGVwcGluZ190aHJvdWdoX3NpZ3RyYW1wID0gMDsKKyAgdHAtPm5leHQgPSB0aHJlYWRfbGlzdDsKKyAgdGhyZWFkX2xpc3QgPSB0cDsKK30KKwordm9pZAorZGVsZXRlX3RocmVhZCAocGlkKQorICAgICBpbnQgcGlkOworeworICBzdHJ1Y3QgdGhyZWFkX2luZm8gKnRwLCAqdHBwcmV2OworCisgIHRwcHJldiA9IE5VTEw7CisKKyAgZm9yICh0cCA9IHRocmVhZF9saXN0OyB0cDsgdHBwcmV2ID0gdHAsIHRwID0gdHAtPm5leHQpCisgICAgaWYgKHRwLT5waWQgPT0gcGlkKQorICAgICAgYnJlYWs7CisKKyAgaWYgKCF0cCkKKyAgICByZXR1cm47CisKKyAgaWYgKHRwcHJldikKKyAgICB0cHByZXYtPm5leHQgPSB0cC0+bmV4dDsKKyAgZWxzZQorICAgIHRocmVhZF9saXN0ID0gdHAtPm5leHQ7CisKKyAgZnJlZSAodHApOworCisgIHJldHVybjsKK30KKworc3RhdGljIHN0cnVjdCB0aHJlYWRfaW5mbyAqCitmaW5kX3RocmVhZF9pZCAobnVtKQorICAgIGludCBudW07Cit7CisgIHN0cnVjdCB0aHJlYWRfaW5mbyAqdHA7CisKKyAgZm9yICh0cCA9IHRocmVhZF9saXN0OyB0cDsgdHAgPSB0cC0+bmV4dCkKKyAgICBpZiAodHAtPm51bSA9PSBudW0pCisgICAgICByZXR1cm4gdHA7CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2ludAordmFsaWRfdGhyZWFkX2lkIChudW0pCisgICAgaW50IG51bTsKK3sKKyAgc3RydWN0IHRocmVhZF9pbmZvICp0cDsKKworICBmb3IgKHRwID0gdGhyZWFkX2xpc3Q7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIGlmICh0cC0+bnVtID09IG51bSkKKyAgICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCitpbnQKK3BpZF90b190aHJlYWRfaWQgKHBpZCkKKyAgICBpbnQgcGlkOworeworICBzdHJ1Y3QgdGhyZWFkX2luZm8gKnRwOworCisgIGZvciAodHAgPSB0aHJlYWRfbGlzdDsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgaWYgKHRwLT5waWQgPT0gcGlkKQorICAgICAgcmV0dXJuIHRwLT5udW07CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludAordGhyZWFkX2lkX3RvX3BpZCAobnVtKQorICAgIGludCBudW07Cit7CisgIHN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkID0gZmluZF90aHJlYWRfaWQgKG51bSk7CisgIGlmICh0aHJlYWQpCisgICAgcmV0dXJuIHRocmVhZC0+cGlkOworICBlbHNlCisgICAgcmV0dXJuIC0xOworfQorCitpbnQKK2luX3RocmVhZF9saXN0IChwaWQpCisgICAgaW50IHBpZDsKK3sKKyAgc3RydWN0IHRocmVhZF9pbmZvICp0cDsKKworICBmb3IgKHRwID0gdGhyZWFkX2xpc3Q7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIGlmICh0cC0+cGlkID09IHBpZCkKKyAgICAgIHJldHVybiAxOworCisgIHJldHVybiAwOwkJCS8qIE5ldmVyIGhlYXJkIG9mICdpbSAqLworfQorCisvKiBMb2FkIGluZnJ1biBzdGF0ZSBmb3IgdGhlIHRocmVhZCBQSUQuICAqLworCit2b2lkIGxvYWRfaW5mcnVuX3N0YXRlIChwaWQsIHByZXZfcGMsIHByZXZfZnVuY19zdGFydCwgcHJldl9mdW5jX25hbWUsCisJCQl0cmFwX2V4cGVjdGVkLCBzdGVwX3Jlc3VtZV9icmVha3BvaW50LAorCQkJdGhyb3VnaF9zaWd0cmFtcF9icmVha3BvaW50LCBzdGVwX3JhbmdlX3N0YXJ0LAorCQkJc3RlcF9yYW5nZV9lbmQsIHN0ZXBfZnJhbWVfYWRkcmVzcywKKwkJCWhhbmRsaW5nX2xvbmdqbXAsIGFub3RoZXJfdHJhcCwKKwkJCXN0ZXBwaW5nX3Rocm91Z2hfc29saWJfYWZ0ZXJfY2F0Y2gsCisJCQlzdGVwcGluZ190aHJvdWdoX3NvbGliX2NhdGNocG9pbnRzLAorCQkJc3RlcHBpbmdfdGhyb3VnaF9zaWd0cmFtcCkKKyAgICAgaW50IHBpZDsKKyAgICAgQ09SRV9BRERSICpwcmV2X3BjOworICAgICBDT1JFX0FERFIgKnByZXZfZnVuY19zdGFydDsKKyAgICAgY2hhciAqKnByZXZfZnVuY19uYW1lOworICAgICBpbnQgKnRyYXBfZXhwZWN0ZWQ7CisgICAgIHN0cnVjdCBicmVha3BvaW50ICoqc3RlcF9yZXN1bWVfYnJlYWtwb2ludDsKKyAgICAgc3RydWN0IGJyZWFrcG9pbnQgKip0aHJvdWdoX3NpZ3RyYW1wX2JyZWFrcG9pbnQ7CisgICAgIENPUkVfQUREUiAqc3RlcF9yYW5nZV9zdGFydDsKKyAgICAgQ09SRV9BRERSICpzdGVwX3JhbmdlX2VuZDsKKyAgICAgQ09SRV9BRERSICpzdGVwX2ZyYW1lX2FkZHJlc3M7CisgICAgIGludCAqaGFuZGxpbmdfbG9uZ2ptcDsKKyAgICAgaW50ICphbm90aGVyX3RyYXA7CisgICAgIGludCAqICBzdGVwcGluZ190aHJvdWdoX3NvbGliX2FmdGVyX2NhdGNoOworICAgICBicHN0YXQgKiAgc3RlcHBpbmdfdGhyb3VnaF9zb2xpYl9jYXRjaHBvaW50czsKKyAgICAgaW50ICogIHN0ZXBwaW5nX3Rocm91Z2hfc2lndHJhbXA7Cit7CisgIHN0cnVjdCB0aHJlYWRfaW5mbyAqdHA7CisKKyAgLyogSWYgd2UgY2FuJ3QgZmluZCB0aGUgdGhyZWFkLCB0aGVuIHdlJ3JlIGRlYnVnZ2luZyBhIHNpbmdsZSB0aHJlYWRlZAorICAgICBwcm9jZXNzLiAgTm8gbmVlZCB0byBkbyBhbnl0aGluZyBpbiB0aGF0IGNhc2UuICAqLworICB0cCA9IGZpbmRfdGhyZWFkX2lkIChwaWRfdG9fdGhyZWFkX2lkIChwaWQpKTsKKyAgaWYgKHRwID09IE5VTEwpCisgICAgcmV0dXJuOworCisgICpwcmV2X3BjID0gdHAtPnByZXZfcGM7CisgICpwcmV2X2Z1bmNfc3RhcnQgPSB0cC0+cHJldl9mdW5jX3N0YXJ0OworICAqcHJldl9mdW5jX25hbWUgPSB0cC0+cHJldl9mdW5jX25hbWU7CisgICpzdGVwX3Jlc3VtZV9icmVha3BvaW50ID0gdHAtPnN0ZXBfcmVzdW1lX2JyZWFrcG9pbnQ7CisgICpzdGVwX3JhbmdlX3N0YXJ0ID0gdHAtPnN0ZXBfcmFuZ2Vfc3RhcnQ7CisgICpzdGVwX3JhbmdlX2VuZCA9IHRwLT5zdGVwX3JhbmdlX2VuZDsKKyAgKnN0ZXBfZnJhbWVfYWRkcmVzcyA9IHRwLT5zdGVwX2ZyYW1lX2FkZHJlc3M7CisgICp0aHJvdWdoX3NpZ3RyYW1wX2JyZWFrcG9pbnQgPSB0cC0+dGhyb3VnaF9zaWd0cmFtcF9icmVha3BvaW50OworICAqaGFuZGxpbmdfbG9uZ2ptcCA9IHRwLT5oYW5kbGluZ19sb25nam1wOworICAqdHJhcF9leHBlY3RlZCA9IHRwLT50cmFwX2V4cGVjdGVkOworICAqYW5vdGhlcl90cmFwID0gdHAtPmFub3RoZXJfdHJhcDsKKyAgKnN0ZXBwaW5nX3Rocm91Z2hfc29saWJfYWZ0ZXJfY2F0Y2ggPSB0cC0+c3RlcHBpbmdfdGhyb3VnaF9zb2xpYl9hZnRlcl9jYXRjaDsKKyAgKnN0ZXBwaW5nX3Rocm91Z2hfc29saWJfY2F0Y2hwb2ludHMgPSB0cC0+c3RlcHBpbmdfdGhyb3VnaF9zb2xpYl9jYXRjaHBvaW50czsKKyAgKnN0ZXBwaW5nX3Rocm91Z2hfc2lndHJhbXAgPSB0cC0+c3RlcHBpbmdfdGhyb3VnaF9zaWd0cmFtcDsKK30KKworLyogU2F2ZSBpbmZydW4gc3RhdGUgZm9yIHRoZSB0aHJlYWQgUElELiAgKi8KKwordm9pZCBzYXZlX2luZnJ1bl9zdGF0ZSAocGlkLCBwcmV2X3BjLCBwcmV2X2Z1bmNfc3RhcnQsIHByZXZfZnVuY19uYW1lLAorCQkJdHJhcF9leHBlY3RlZCwgc3RlcF9yZXN1bWVfYnJlYWtwb2ludCwKKwkJCXRocm91Z2hfc2lndHJhbXBfYnJlYWtwb2ludCwgc3RlcF9yYW5nZV9zdGFydCwKKwkJCXN0ZXBfcmFuZ2VfZW5kLCBzdGVwX2ZyYW1lX2FkZHJlc3MsCisJCQloYW5kbGluZ19sb25nam1wLCBhbm90aGVyX3RyYXAsCisJCQlzdGVwcGluZ190aHJvdWdoX3NvbGliX2FmdGVyX2NhdGNoLAorCQkJc3RlcHBpbmdfdGhyb3VnaF9zb2xpYl9jYXRjaHBvaW50cywKKwkJCXN0ZXBwaW5nX3Rocm91Z2hfc2lndHJhbXApCisgICAgIGludCBwaWQ7CisgICAgIENPUkVfQUREUiBwcmV2X3BjOworICAgICBDT1JFX0FERFIgcHJldl9mdW5jX3N0YXJ0OworICAgICBjaGFyICpwcmV2X2Z1bmNfbmFtZTsKKyAgICAgaW50IHRyYXBfZXhwZWN0ZWQ7CisgICAgIHN0cnVjdCBicmVha3BvaW50ICpzdGVwX3Jlc3VtZV9icmVha3BvaW50OworICAgICBzdHJ1Y3QgYnJlYWtwb2ludCAqdGhyb3VnaF9zaWd0cmFtcF9icmVha3BvaW50OworICAgICBDT1JFX0FERFIgc3RlcF9yYW5nZV9zdGFydDsKKyAgICAgQ09SRV9BRERSIHN0ZXBfcmFuZ2VfZW5kOworICAgICBDT1JFX0FERFIgc3RlcF9mcmFtZV9hZGRyZXNzOworICAgICBpbnQgaGFuZGxpbmdfbG9uZ2ptcDsKKyAgICAgaW50IGFub3RoZXJfdHJhcDsKKyAgICAgaW50ICBzdGVwcGluZ190aHJvdWdoX3NvbGliX2FmdGVyX2NhdGNoOworICAgICBicHN0YXQgIHN0ZXBwaW5nX3Rocm91Z2hfc29saWJfY2F0Y2hwb2ludHM7CisgICAgIGludCAgc3RlcHBpbmdfdGhyb3VnaF9zaWd0cmFtcDsKK3sKKyAgc3RydWN0IHRocmVhZF9pbmZvICp0cDsKKworICAvKiBJZiB3ZSBjYW4ndCBmaW5kIHRoZSB0aHJlYWQsIHRoZW4gd2UncmUgZGVidWdnaW5nIGEgc2luZ2xlLXRocmVhZGVkCisgICAgIHByb2Nlc3MuICBOb3RoaW5nIHRvIGRvIGluIHRoYXQgY2FzZS4gICovCisgIHRwID0gZmluZF90aHJlYWRfaWQgKHBpZF90b190aHJlYWRfaWQgKHBpZCkpOworICBpZiAodHAgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgdHAtPnByZXZfcGMgPSBwcmV2X3BjOworICB0cC0+cHJldl9mdW5jX3N0YXJ0ID0gcHJldl9mdW5jX3N0YXJ0OworICB0cC0+cHJldl9mdW5jX25hbWUgPSBwcmV2X2Z1bmNfbmFtZTsKKyAgdHAtPnN0ZXBfcmVzdW1lX2JyZWFrcG9pbnQgPSBzdGVwX3Jlc3VtZV9icmVha3BvaW50OworICB0cC0+c3RlcF9yYW5nZV9zdGFydCA9IHN0ZXBfcmFuZ2Vfc3RhcnQ7CisgIHRwLT5zdGVwX3JhbmdlX2VuZCA9IHN0ZXBfcmFuZ2VfZW5kOworICB0cC0+c3RlcF9mcmFtZV9hZGRyZXNzID0gc3RlcF9mcmFtZV9hZGRyZXNzOworICB0cC0+dGhyb3VnaF9zaWd0cmFtcF9icmVha3BvaW50ID0gdGhyb3VnaF9zaWd0cmFtcF9icmVha3BvaW50OworICB0cC0+aGFuZGxpbmdfbG9uZ2ptcCA9IGhhbmRsaW5nX2xvbmdqbXA7CisgIHRwLT50cmFwX2V4cGVjdGVkID0gdHJhcF9leHBlY3RlZDsKKyAgdHAtPmFub3RoZXJfdHJhcCA9IGFub3RoZXJfdHJhcDsKKyAgdHAtPnN0ZXBwaW5nX3Rocm91Z2hfc29saWJfYWZ0ZXJfY2F0Y2ggPSBzdGVwcGluZ190aHJvdWdoX3NvbGliX2FmdGVyX2NhdGNoOworICB0cC0+c3RlcHBpbmdfdGhyb3VnaF9zb2xpYl9jYXRjaHBvaW50cyA9IHN0ZXBwaW5nX3Rocm91Z2hfc29saWJfY2F0Y2hwb2ludHM7CisgIHRwLT5zdGVwcGluZ190aHJvdWdoX3NpZ3RyYW1wID0gc3RlcHBpbmdfdGhyb3VnaF9zaWd0cmFtcDsKK30KKworLyogUmV0dXJuIHRydWUgaWYgVFAgaXMgYW4gYWN0aXZlIHRocmVhZC4gKi8KK3N0YXRpYyBpbnQKK3RocmVhZF9hbGl2ZSAodHApCisgICAgIHN0cnVjdCB0aHJlYWRfaW5mbyAqdHA7Cit7CisgIGlmICh0cC0+cGlkID09IC0xKQorICAgIHJldHVybiAwOworICBpZiAoISB0YXJnZXRfdGhyZWFkX2FsaXZlICh0cC0+cGlkKSkKKyAgICB7CisgICAgICB0cC0+cGlkID0gLTE7CS8qIE1hcmsgaXQgYXMgZGVhZCAqLworICAgICAgcmV0dXJuIDA7CisgICAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3BydW5lX3RocmVhZHMgKCkKK3sKKyAgc3RydWN0IHRocmVhZF9pbmZvICp0cCwgKnRwcHJldiwgKm5leHQ7CisKKyAgdHBwcmV2ID0gMDsKKyAgZm9yICh0cCA9IHRocmVhZF9saXN0OyB0cDsgdHAgPSBuZXh0KQorICAgIHsKKyAgICAgIG5leHQgPSB0cC0+bmV4dDsKKyAgICAgIGlmICghdGhyZWFkX2FsaXZlICh0cCkpCisJeworCSAgaWYgKHRwcHJldikKKwkgICAgdHBwcmV2LT5uZXh0ID0gbmV4dDsKKwkgIGVsc2UKKwkgICAgdGhyZWFkX2xpc3QgID0gbmV4dDsKKwkgIGZyZWUgKHRwKTsKKwl9CisgICAgICBlbHNlCisJdHBwcmV2ID0gdHA7CisgICAgfQorfQorCisvKiBQcmludCBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50bHkga25vd24gdGhyZWFkcyAKKyAqCisgKiBOb3RlOiB0aGlzIGhhcyB0aGUgZHJhd2JhY2sgdGhhdCBpdCBfcmVhbGx5XyBzd2l0Y2hlcworICogICAgICAgdGhyZWFkcywgd2hpY2ggZnJlZXMgdGhlIGZyYW1lIGNhY2hlLiAgQSBuby1zaWRlCisgKiAgICAgICBlZmZlY3RzIGluZm8tdGhyZWFkcyBjb21tYW5kIHdvdWxkIGJlIG5pY2VyLgorICovCisKK3N0YXRpYyB2b2lkCitpbmZvX3RocmVhZHNfY29tbWFuZCAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCB0aHJlYWRfaW5mbyAqdHA7CisgIGludCAgICAgICAgICAgICAgICBjdXJyZW50X3BpZDsKKyAgc3RydWN0IGZyYW1lX2luZm8gICpjdXJfZnJhbWU7CisgIGludCAgICAgICAgICAgICAgICBzYXZlZF9mcmFtZV9sZXZlbCA9IHNlbGVjdGVkX2ZyYW1lX2xldmVsOworICBpbnQgICAgICAgICAgICAgICAgY291bnRlcjsKKworICAvKiBBdm9pZCBjb3JlZHVtcHMgd2hpY2ggd291bGQgaGFwcGVuIGlmIHdlIHRyaWVkIHRvIGFjY2VzcyBhIE5VTEwKKyAgICAgc2VsZWN0ZWRfZnJhbWUuICAqLworICBpZiAoIXRhcmdldF9oYXNfc3RhY2spIGVycm9yICgiTm8gc3RhY2suIik7CisKKyAgcHJ1bmVfdGhyZWFkcyAoKTsKKyNpZiBkZWZpbmVkKEZJTkRfTkVXX1RIUkVBRFMpCisgIEZJTkRfTkVXX1RIUkVBRFMgKCk7CisjZW5kaWYKKyAgY3VycmVudF9waWQgPSBpbmZlcmlvcl9waWQ7CisgIGZvciAodHAgPSB0aHJlYWRfbGlzdDsgdHA7IHRwID0gdHAtPm5leHQpCisgICAgeworICAgICAgaWYgKHRwLT5waWQgPT0gY3VycmVudF9waWQpCisJcHJpbnRmX2ZpbHRlcmVkICgiKiAiKTsKKyAgICAgIGVsc2UKKwlwcmludGZfZmlsdGVyZWQgKCIgICIpOworCisjaWZkZWYgSFBVWEhQUEEKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkICVzICAiLCB0cC0+bnVtLCB0YXJnZXRfdGlkX3RvX3N0ciAodHAtPnBpZCkpOworI2Vsc2UKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkICVzICAiLCB0cC0+bnVtLCB0YXJnZXRfcGlkX3RvX3N0ciAodHAtPnBpZCkpOworI2VuZGlmCisgICAgICBzd2l0Y2hfdG9fdGhyZWFkICh0cC0+cGlkKTsKKyAgICAgIGlmIChzZWxlY3RlZF9mcmFtZSkKKwlwcmludF9vbmx5X3N0YWNrX2ZyYW1lIChzZWxlY3RlZF9mcmFtZSwgLTEsIDApOworICAgICAgZWxzZQorCXByaW50Zl9maWx0ZXJlZCAoIltObyBzdGFjay5dXG4iKTsKKyAgICB9CisKKyAgc3dpdGNoX3RvX3RocmVhZCAoY3VycmVudF9waWQpOworCisgIC8qIENvZGUgYmVsb3cgY29waWVkIGZyb20gInVwX3NpbGVudGx5X2Jhc2UiIGluICJzdGFjay5jIi4KKyAgICogSXQgcmVzdG9yZXMgdGhlIGZyYW1lIHNldCBieSB0aGUgdXNlciBiZWZvcmUgdGhlICJpbmZvIHRocmVhZHMiCisgICAqIGNvbW1hbmQuICBXZSBoYXZlIGZpbmlzaGVkIHRoZSBpbmZvLXRocmVhZHMgZGlzcGxheSBieSBzd2l0Y2hpbmcKKyAgICogYmFjayB0byB0aGUgY3VycmVudCB0aHJlYWQuICBUaGF0IHN3aXRjaCBoYXMgcHV0IHVzIGF0IHRoZSB0b3AKKyAgICogb2YgdGhlIHN0YWNrIChsZWFmIGZyYW1lKS4KKyAgICovCisgIGNvdW50ZXIgICA9IHNhdmVkX2ZyYW1lX2xldmVsOworICBjdXJfZnJhbWUgPSBmaW5kX3JlbGF0aXZlX2ZyYW1lKHNlbGVjdGVkX2ZyYW1lLCAmY291bnRlcik7CisgIGlmIChjb3VudGVyICE9IDApCisgICAgeworICAgICAgLyogT29vcHMsIGNhbid0IHJlc3RvcmUsIHRlbGwgdXNlciB3aGVyZSB3ZSBhcmUuICovCisgICAgICB3YXJuaW5nICgiQ291bGRuJ3QgcmVzdG9yZSBmcmFtZSBpbiBjdXJyZW50IHRocmVhZCwgYXQgZnJhbWUgMCIpOworICAgICAgcHJpbnRfc3RhY2tfZnJhbWUgKHNlbGVjdGVkX2ZyYW1lLCAtMSwgMCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2VsZWN0X2ZyYW1lKGN1cl9mcmFtZSwgc2F2ZWRfZnJhbWVfbGV2ZWwpOworICAgIH0KKworICAvKiByZS1zaG93IGN1cnJlbnQgZnJhbWUuICovCisgIHNob3dfc3RhY2tfZnJhbWUoY3VyX2ZyYW1lKTsKK30KKworLyogU3dpdGNoIGZyb20gb25lIHRocmVhZCB0byBhbm90aGVyLiAqLworCitzdGF0aWMgdm9pZAorc3dpdGNoX3RvX3RocmVhZCAocGlkKQorICAgICBpbnQgcGlkOworeworICBpZiAocGlkID09IGluZmVyaW9yX3BpZCkKKyAgICByZXR1cm47CisKKyAgaW5mZXJpb3JfcGlkID0gcGlkOworICBmbHVzaF9jYWNoZWRfZnJhbWVzICgpOworICByZWdpc3RlcnNfY2hhbmdlZCAoKTsKKyAgc3RvcF9wYyA9IHJlYWRfcGMoKTsKKyAgc2VsZWN0X2ZyYW1lIChnZXRfY3VycmVudF9mcmFtZSAoKSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCityZXN0b3JlX2N1cnJlbnRfdGhyZWFkIChwaWQpCisgICAgIGludCBwaWQ7Cit7CisgIGlmIChwaWQgIT0gaW5mZXJpb3JfcGlkKSAKKyAgICB7CisgICAgICBzd2l0Y2hfdG9fdGhyZWFkIChwaWQpOworICAgICAgcHJpbnRfc3RhY2tfZnJhbWUoIGdldF9jdXJyZW50X2ZyYW1lKCksIDAsIC0xKTsKKyAgICB9Cit9CisKKy8qIEFwcGx5IGEgR0RCIGNvbW1hbmQgdG8gYSBsaXN0IG9mIHRocmVhZHMuICBMaXN0IHN5bnRheCBpcyBhIHdoaXRlc3BhY2UKKyAgIHNlcGVyYXRlZCBsaXN0IG9mIG51bWJlcnMsIG9yIHJhbmdlcywgb3IgdGhlIGtleXdvcmQgYGFsbCcuICBSYW5nZXMgY29uc2lzdAorICAgb2YgdHdvIG51bWJlcnMgc2VwZXJhdGVkIGJ5IGEgaHlwaGVuLiAgRXhhbXBsZXM6CisKKwl0aHJlYWQgYXBwbHkgMSAyIDcgNCBiYWNrdHJhY2UJQXBwbHkgYmFja3RyYWNlIGNtZCB0byB0aHJlYWRzIDEsMiw3LDQKKwl0aHJlYWQgYXBwbHkgMi03IDkgcCBmb28oMSkJQXBwbHkgcCBmb28oMSkgY21kIHRvIHRocmVhZHMgMi0+NyAmIDkKKwl0aHJlYWQgYXBwbHkgYWxsIHAgeC9pICRwYwlBcHBseSB4L2kgJHBjIGNtZCB0byBhbGwgdGhyZWFkcworKi8KKworc3RhdGljIHZvaWQKK3RocmVhZF9hcHBseV9hbGxfY29tbWFuZCAoY21kLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqY21kOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCB0aHJlYWRfaW5mbyAqdHA7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisKKyAgaWYgKGNtZCA9PSBOVUxMIHx8ICpjbWQgPT0gJ1wwMDAnKQorICAgIGVycm9yICgiUGxlYXNlIHNwZWNpZnkgYSBjb21tYW5kIGZvbGxvd2luZyB0aGUgdGhyZWFkIElEIGxpc3QiKTsKKworICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgcmVzdG9yZV9jdXJyZW50X3RocmVhZCwgCisJCQkgICAgKHZvaWQgKikgaW5mZXJpb3JfcGlkKTsKKworICBmb3IgKHRwID0gdGhyZWFkX2xpc3Q7IHRwOyB0cCA9IHRwLT5uZXh0KQorICAgIGlmICh0aHJlYWRfYWxpdmUgKHRwKSkKKyAgICAgIHsKKwlzd2l0Y2hfdG9fdGhyZWFkICh0cC0+cGlkKTsKKyNpZmRlZiBIUFVYSFBQQQorCXByaW50Zl9maWx0ZXJlZCAoIlxuVGhyZWFkICVkICglcyk6XG4iLAorCQkJIHRwLT5udW0sCisJCQkgdGFyZ2V0X3RpZF90b19zdHIgKGluZmVyaW9yX3BpZCkpOworI2Vsc2UKKwlwcmludGZfZmlsdGVyZWQgKCJcblRocmVhZCAlZCAoJXMpOlxuIiwgdHAtPm51bSwKKwkJCSB0YXJnZXRfcGlkX3RvX3N0ciAoaW5mZXJpb3JfcGlkKSk7CisjZW5kaWYKKwlleGVjdXRlX2NvbW1hbmQgKGNtZCwgZnJvbV90dHkpOworICAgICAgfQorfQorCitzdGF0aWMgdm9pZAordGhyZWFkX2FwcGx5X2NvbW1hbmQgKHRpZGxpc3QsIGZyb21fdHR5KQorICAgICBjaGFyICp0aWRsaXN0OworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGNoYXIgKmNtZDsKKyAgY2hhciAqcDsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKworICBpZiAodGlkbGlzdCA9PSBOVUxMIHx8ICp0aWRsaXN0ID09ICdcMDAwJykKKyAgICBlcnJvciAoIlBsZWFzZSBzcGVjaWZ5IGEgdGhyZWFkIElEIGxpc3QiKTsKKworICBmb3IgKGNtZCA9IHRpZGxpc3Q7ICpjbWQgIT0gJ1wwMDAnICYmICFpc2FscGhhKCpjbWQpOyBjbWQrKyk7CisKKyAgaWYgKCpjbWQgPT0gJ1wwMDAnKQorICAgIGVycm9yICgiUGxlYXNlIHNwZWNpZnkgYSBjb21tYW5kIGZvbGxvd2luZyB0aGUgdGhyZWFkIElEIGxpc3QiKTsKKworICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgcmVzdG9yZV9jdXJyZW50X3RocmVhZCwgCisJCQkgICAgKHZvaWQgKikgaW5mZXJpb3JfcGlkKTsKKworICB3aGlsZSAodGlkbGlzdCA8IGNtZCkKKyAgICB7CisgICAgICBzdHJ1Y3QgdGhyZWFkX2luZm8gKnRwOworICAgICAgaW50IHN0YXJ0LCBlbmQ7CisKKyAgICAgIHN0YXJ0ID0gc3RydG9sICh0aWRsaXN0LCAmcCwgMTApOworICAgICAgaWYgKHAgPT0gdGlkbGlzdCkKKwllcnJvciAoIkVycm9yIHBhcnNpbmcgJXMiLCB0aWRsaXN0KTsKKyAgICAgIHRpZGxpc3QgPSBwOworCisgICAgICB3aGlsZSAoKnRpZGxpc3QgPT0gJyAnIHx8ICp0aWRsaXN0ID09ICdcdCcpCisJdGlkbGlzdCsrOworCisgICAgICBpZiAoKnRpZGxpc3QgPT0gJy0nKQkvKiBHb3QgYSByYW5nZSBvZiBJRHM/ICovCisJeworCSAgdGlkbGlzdCsrOwkvKiBTa2lwIHRoZSAtICovCisJICBlbmQgPSBzdHJ0b2wgKHRpZGxpc3QsICZwLCAxMCk7CisJICBpZiAocCA9PSB0aWRsaXN0KQorCSAgICBlcnJvciAoIkVycm9yIHBhcnNpbmcgJXMiLCB0aWRsaXN0KTsKKwkgIHRpZGxpc3QgPSBwOworCisJICB3aGlsZSAoKnRpZGxpc3QgPT0gJyAnIHx8ICp0aWRsaXN0ID09ICdcdCcpCisJICAgIHRpZGxpc3QrKzsKKwl9CisgICAgICBlbHNlCisJZW5kID0gc3RhcnQ7CisKKyAgICAgIGZvciAoOyBzdGFydCA8PSBlbmQ7IHN0YXJ0KyspCisJeworCSAgdHAgPSBmaW5kX3RocmVhZF9pZCAoc3RhcnQpOworCisJICBpZiAoIXRwKQorCSAgICB3YXJuaW5nICgiVW5rbm93biB0aHJlYWQgJWQuIiwgc3RhcnQpOworCSAgZWxzZSBpZiAoIXRocmVhZF9hbGl2ZSAodHApKQorCSAgICB3YXJuaW5nICgiVGhyZWFkICVkIGhhcyB0ZXJtaW5hdGVkLiIsIHN0YXJ0KTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN3aXRjaF90b190aHJlYWQgKHRwLT5waWQpOworI2lmZGVmIEhQVVhIUFBBCisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG5UaHJlYWQgJWQgKCVzKTpcbiIsIHRwLT5udW0sCisJCQkgICAgICAgdGFyZ2V0X3RpZF90b19zdHIgKGluZmVyaW9yX3BpZCkpOworI2Vsc2UKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCJcblRocmVhZCAlZCAoJXMpOlxuIiwgdHAtPm51bSwKKwkJCSAgICAgICB0YXJnZXRfcGlkX3RvX3N0ciAoaW5mZXJpb3JfcGlkKSk7CisjZW5kaWYKKwkgICAgICBleGVjdXRlX2NvbW1hbmQgKGNtZCwgZnJvbV90dHkpOworCSAgICB9CisJfQorICAgIH0KK30KKworLyogU3dpdGNoIHRvIHRoZSBzcGVjaWZpZWQgdGhyZWFkLiAgV2lsbCBkaXNwYXRjaCBvZmYgdG8gdGhyZWFkX2FwcGx5X2NvbW1hbmQKKyAgIGlmIHByZWZpeCBvZiBhcmcgaXMgYGFwcGx5Jy4gICovCisKK3N0YXRpYyB2b2lkCit0aHJlYWRfY29tbWFuZCAodGlkc3RyLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqdGlkc3RyOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGludCBudW07CisgIHN0cnVjdCB0aHJlYWRfaW5mbyAqdHA7CisKKyAgaWYgKCF0aWRzdHIpCisgICAgeworICAgICAgLyogRG9uJ3QgZ2VuZXJhdGUgYW4gZXJyb3IsIGp1c3Qgc2F5IHdoaWNoIHRocmVhZCBpcyBjdXJyZW50LiAqLworICAgICAgaWYgKHRhcmdldF9oYXNfc3RhY2spCisJcHJpbnRmX2ZpbHRlcmVkICgiW0N1cnJlbnQgdGhyZWFkIGlzICVkICglcyldXG4iLAorCQkJIHBpZF90b190aHJlYWRfaWQoaW5mZXJpb3JfcGlkKSwKKyNpZiBkZWZpbmVkKEhQVVhIUFBBKQorCQkJIHRhcmdldF90aWRfdG9fc3RyKGluZmVyaW9yX3BpZCkKKyNlbHNlCisJCQkgdGFyZ2V0X3BpZF90b19zdHIoaW5mZXJpb3JfcGlkKQorI2VuZGlmCisJCQkgKTsKKyAgICAgIGVsc2UKKwllcnJvciAoIk5vIHN0YWNrLiIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgbnVtID0gYXRvaSAodGlkc3RyKTsKKworICB0cCA9IGZpbmRfdGhyZWFkX2lkIChudW0pOworCisgIGlmICghdHApCisgICAgZXJyb3IgKCJUaHJlYWQgSUQgJWQgbm90IGtub3duLiAgVXNlIHRoZSBcImluZm8gdGhyZWFkc1wiIGNvbW1hbmQgdG9cblwKK3NlZSB0aGUgSURzIG9mIGN1cnJlbnRseSBrbm93biB0aHJlYWRzLiIsIG51bSk7CisKKyAgaWYgKCF0aHJlYWRfYWxpdmUgKHRwKSkKKyAgICBlcnJvciAoIlRocmVhZCBJRCAlZCBoYXMgdGVybWluYXRlZC5cbiIsIG51bSk7CisKKyAgc3dpdGNoX3RvX3RocmVhZCAodHAtPnBpZCk7CisKKyAgaWYgKGNvbnRleHRfaG9vaykKKyAgICBjb250ZXh0X2hvb2sgKG51bSk7CisKKyAgcHJpbnRmX2ZpbHRlcmVkICgiW1N3aXRjaGluZyB0byB0aHJlYWQgJWQgKCVzKV1cbiIsCisJCSAgIHBpZF90b190aHJlYWRfaWQgKGluZmVyaW9yX3BpZCksCisjaWYgZGVmaW5lZChIUFVYSFBQQSkKKwkJICAgdGFyZ2V0X3RpZF90b19zdHIgKGluZmVyaW9yX3BpZCkKKyNlbHNlCisJCSAgIHRhcmdldF9waWRfdG9fc3RyIChpbmZlcmlvcl9waWQpCisjZW5kaWYKKwkJICAgKTsKKyAgcHJpbnRfc3RhY2tfZnJhbWUgKHNlbGVjdGVkX2ZyYW1lLCBzZWxlY3RlZF9mcmFtZV9sZXZlbCwgMSk7Cit9CisKKy8qIENvbW1hbmRzIHdpdGggYSBwcmVmaXggb2YgYHRocmVhZCcuICAqLworc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKnRocmVhZF9jbWRfbGlzdCA9IE5VTEw7CisKK3ZvaWQKK19pbml0aWFsaXplX3RocmVhZCAoKQoreworICBzdGF0aWMgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKnRocmVhZF9hcHBseV9saXN0ID0gTlVMTDsKKyAgZXh0ZXJuIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjbWRsaXN0OworCisgIGFkZF9pbmZvICgidGhyZWFkcyIsIGluZm9fdGhyZWFkc19jb21tYW5kLAorCSAgICAiSURzIG9mIGN1cnJlbnRseSBrbm93biB0aHJlYWRzLiIpOworCisgIGFkZF9wcmVmaXhfY21kICgidGhyZWFkIiwgY2xhc3NfcnVuLCB0aHJlYWRfY29tbWFuZCwKKwkJICAiVXNlIHRoaXMgY29tbWFuZCB0byBzd2l0Y2ggYmV0d2VlbiB0aHJlYWRzLlxuXAorVGhlIG5ldyB0aHJlYWQgSUQgbXVzdCBiZSBjdXJyZW50bHkga25vd24uIiwgJnRocmVhZF9jbWRfbGlzdCwgInRocmVhZCAiLCAxLAorCQkgICZjbWRsaXN0KTsKKworICBhZGRfcHJlZml4X2NtZCAoImFwcGx5IiwgY2xhc3NfcnVuLCB0aHJlYWRfYXBwbHlfY29tbWFuZCwKKwkJICAiQXBwbHkgYSBjb21tYW5kIHRvIGEgbGlzdCBvZiB0aHJlYWRzLiIsCisJCSAgJnRocmVhZF9hcHBseV9saXN0LCAiYXBwbHkgIiwgMSwgJnRocmVhZF9jbWRfbGlzdCk7CisKKyAgYWRkX2NtZCAoImFsbCIsIGNsYXNzX3J1biwgdGhyZWFkX2FwcGx5X2FsbF9jb21tYW5kLAorCSAgICJBcHBseSBhIGNvbW1hbmQgdG8gYWxsIHRocmVhZHMuIiwKKwkgICAmdGhyZWFkX2FwcGx5X2xpc3QpOworCisgIGlmICgheGRiX2NvbW1hbmRzKQorICAgIGFkZF9jb21fYWxpYXMgKCJ0IiwgInRocmVhZCIsIGNsYXNzX3J1biwgMSk7Cit9CmRpZmYgLS1naXQgYS9nZGIvdG9wLmMgYi9nZGIvdG9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5ZTNjMwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90b3AuYwpAQCAtMCwwICsxLDM2NzcgQEAKKy8qIFRvcCBsZXZlbCBzdHVmZiBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5ODYsIDg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJjYWxsLWNtZHMuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgInNpZ25hbHMuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJicmVha3BvaW50LmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1ZGUgInRlcm1pbmFsLmgiIC8qIEZvciBqb2JfY29udHJvbC4gICovCisjaW5jbHVkZSAiYW5ub3RhdGUuaCIKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlICJ0b3AuaCIKKworLyogcmVhZGxpbmUgaW5jbHVkZSBmaWxlcyAqLworI2luY2x1ZGUgPHJlYWRsaW5lL3JlYWRsaW5lLmg+CisjaW5jbHVkZSA8cmVhZGxpbmUvaGlzdG9yeS5oPgorCisvKiByZWFkbGluZSBkZWZpbmVzIHRoaXMuICAqLworI3VuZGVmIHNhdmVzdHJpbmcKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImdkYl9zdGF0LmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworZXh0ZXJuIHZvaWQgaW5pdGlhbGl6ZV91dGlscyBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgdm9pZCBkb250X3JlcGVhdF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHNvdXJjZV9jbGVhbnVwX2xpbmVzIFBBUkFNUyAoKFBUUikpOworCitzdGF0aWMgdm9pZCB1c2VyX2RlZmluZWRfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBpbml0X3NpZ25hbHMgUEFSQU1TICgodm9pZCkpOworCisjaWZkZWYgU1RPUF9TSUdOQUwKK3N0YXRpYyB2b2lkIHN0b3Bfc2lnIFBBUkFNUyAoKGludCkpOworI2VuZGlmCisKK3N0YXRpYyBjaGFyICogbGluZV9jb21wbGV0aW9uX2Z1bmN0aW9uIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBjaGFyICosIGludCkpOworCitzdGF0aWMgY2hhciAqIHJlYWRsaW5lX2xpbmVfY29tcGxldGlvbl9mdW5jdGlvbiBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBjb21tYW5kX2xvb3BfbWFya2VyIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgdm9pZCB3aGlsZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGlmX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHN0cnVjdCBjb21tYW5kX2xpbmUgKgorYnVpbGRfY29tbWFuZF9saW5lIFBBUkFNUyAoKGVudW0gY29tbWFuZF9jb250cm9sX3R5cGUsIGNoYXIgKikpOworCitzdGF0aWMgc3RydWN0IGNvbW1hbmRfbGluZSAqCitnZXRfY29tbWFuZF9saW5lIFBBUkFNUyAoKGVudW0gY29tbWFuZF9jb250cm9sX3R5cGUsIGNoYXIgKikpOworCitzdGF0aWMgdm9pZCByZWFsbG9jX2JvZHlfbGlzdCBQQVJBTVMgKChzdHJ1Y3QgY29tbWFuZF9saW5lICosIGludCkpOworCitzdGF0aWMgZW51bSBtaXNjX2NvbW1hbmRfdHlwZSByZWFkX25leHRfbGluZSBQQVJBTVMgKChzdHJ1Y3QgY29tbWFuZF9saW5lICoqKSk7CisKK3N0YXRpYyBlbnVtIGNvbW1hbmRfY29udHJvbF90eXBlCityZWN1cnNlX3JlYWRfY29udHJvbF9zdHJ1Y3R1cmUgUEFSQU1TICgoc3RydWN0IGNvbW1hbmRfbGluZSAqKSk7CisKK3N0YXRpYyBzdHJ1Y3QgY2xlYW51cCAqIHNldHVwX3VzZXJfYXJncyBQQVJBTVMgKChjaGFyICopKTsKKworc3RhdGljIGNoYXIgKiBsb2NhdGVfYXJnIFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgY2hhciAqIGluc2VydF9hcmdzIFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgdm9pZCBhcmdfY2xlYW51cCBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIGluaXRfbWFpbiBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIGluaXRfY21kX2xpc3RzIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQgZmxvYXRfaGFuZGxlciBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIHZvaWQgaW5pdF9zaWduYWxzIFBBUkFNUyAoKHZvaWQpKTsKKworc3RhdGljIHZvaWQgc2V0X3ZlcmJvc2UgUEFSQU1TICgoY2hhciAqLCBpbnQsIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICopKTsKKworc3RhdGljIHZvaWQgc2hvd19oaXN0b3J5IFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHNldF9oaXN0b3J5IFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHNldF9oaXN0b3J5X3NpemVfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCwKKwkJCQkJICAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKikpOworCitzdGF0aWMgdm9pZCBzaG93X2NvbW1hbmRzIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGVjaG9fY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBwd2RfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBzaG93X3ZlcnNpb24gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgZG9jdW1lbnRfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBkZWZpbmVfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCB2YWxpZGF0ZV9jb21uYW1lIFBBUkFNUyAoKGNoYXIgKikpOworCitzdGF0aWMgdm9pZCBoZWxwX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgc2hvd19jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGluZm9fY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBjb21wbGV0ZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGRvX25vdGhpbmcgUEFSQU1TICgoaW50KSk7CisKKyNpZmRlZiBTSUdIVVAKK3N0YXRpYyBpbnQgcXVpdF9jb3ZlciBQQVJBTVMgKChQVFIpKTsKKworc3RhdGljIHZvaWQgZGlzY29ubmVjdCBQQVJBTVMgKChpbnQpKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzb3VyY2VfY2xlYW51cCBQQVJBTVMgKChGSUxFICopKTsKKworLyogSWYgdGhpcyBkZWZpbml0aW9uIGlzbid0IG92ZXJyaWRkZW4gYnkgdGhlIGhlYWRlciBmaWxlcywgYXNzdW1lCisgICB0aGF0IGlzYXR0eSBhbmQgZmlsZW5vIGV4aXN0IG9uIHRoaXMgc3lzdGVtLiAgKi8KKyNpZm5kZWYgSVNBVFRZCisjZGVmaW5lIElTQVRUWShGUCkJKGlzYXR0eSAoZmlsZW5vIChGUCkpKQorI2VuZGlmCisKKy8qIEluaXRpYWxpemF0aW9uIGZpbGUgbmFtZSBmb3IgZ2RiLiAgVGhpcyBpcyBvdmVycmlkZGVuIGluIHNvbWUgY29uZmlncy4gICovCisKKyNpZm5kZWYJR0RCSU5JVF9GSUxFTkFNRQorI2RlZmluZQlHREJJTklUX0ZJTEVOQU1FCSIuZ2RiaW5pdCIKKyNlbmRpZgorY2hhciBnZGJpbml0W10gPSBHREJJTklUX0ZJTEVOQU1FOworCitpbnQgaW5oaWJpdF9nZGJpbml0ID0gMDsKKworLyogSWYgbm9uemVybywgYW5kIEdEQiBoYXMgYmVlbiBjb25maWd1cmVkIHRvIGJlIGFibGUgdG8gdXNlIHdpbmRvd3MsCisgICBhdHRlbXB0IHRvIG9wZW4gdGhlbSB1cG9uIHN0YXJ0dXAuICAqLworCitpbnQgdXNlX3dpbmRvd3MgPSAxOworCisvKiBWZXJzaW9uIG51bWJlciBvZiBHREIsIGFzIGEgc3RyaW5nLiAgKi8KKworZXh0ZXJuIGNoYXIgKnZlcnNpb247CisKKy8qIENhbm9uaWNhbCBob3N0IG5hbWUgYXMgYSBzdHJpbmcuICovCisKK2V4dGVybiBjaGFyICpob3N0X25hbWU7CisKKy8qIENhbm9uaWNhbCB0YXJnZXQgbmFtZSBhcyBhIHN0cmluZy4gKi8KKworZXh0ZXJuIGNoYXIgKnRhcmdldF9uYW1lOworCitleHRlcm4gY2hhciBsYW5nX2ZyYW1lX21pc21hdGNoX3dhcm5bXTsJCS8qIGxhbmd1YWdlLmMgKi8KKworLyogRmxhZyBmb3Igd2hldGhlciB3ZSB3YW50IGFsbCB0aGUgImZyb21fdHR5IiBndWJiaXNoIHByaW50ZWQuICAqLworCitpbnQgY2F1dGlvbiA9IDE7CQkJLyogRGVmYXVsdCBpcyB5ZXMsIHNpZ2guICovCisKKy8qIERlZmluZSBhbGwgY21kX2xpc3RfZWxlbWVudHMuICAqLworCisvKiBDaGFpbiBjb250YWluaW5nIGFsbCBkZWZpbmVkIGNvbW1hbmRzLiAgKi8KKworc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmNtZGxpc3Q7CisKKy8qIENoYWluIGNvbnRhaW5pbmcgYWxsIGRlZmluZWQgaW5mbyBzdWJjb21tYW5kcy4gICovCisKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICppbmZvbGlzdDsKKworLyogQ2hhaW4gY29udGFpbmluZyBhbGwgZGVmaW5lZCBlbmFibGUgc3ViY29tbWFuZHMuICovCisKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICplbmFibGVsaXN0OworCisvKiBDaGFpbiBjb250YWluaW5nIGFsbCBkZWZpbmVkIGRpc2FibGUgc3ViY29tbWFuZHMuICovCisKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpkaXNhYmxlbGlzdDsKKworLyogQ2hhaW4gY29udGFpbmluZyBhbGwgZGVmaW5lZCB0b2dnbGUgc3ViY29tbWFuZHMuICovCisKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICp0b2dnbGVsaXN0OworCisvKiBDaGFpbiBjb250YWluaW5nIGFsbCBkZWZpbmVkIHN0b3Agc3ViY29tbWFuZHMuICovCisKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpzdG9wbGlzdDsKKworLyogQ2hhaW4gY29udGFpbmluZyBhbGwgZGVmaW5lZCBkZWxldGUgc3ViY29tbWFuZHMuICovCisKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpkZWxldGVsaXN0OworCisvKiBDaGFpbiBjb250YWluaW5nIGFsbCBkZWZpbmVkICJlbmFibGUgYnJlYWtwb2ludCIgc3ViY29tbWFuZHMuICovCisKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICplbmFibGVicmVha2xpc3Q7CisKKy8qIENoYWluIGNvbnRhaW5pbmcgYWxsIGRlZmluZWQgc2V0IHN1YmNvbW1hbmRzICovCisKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpzZXRsaXN0OworCisvKiBDaGFpbiBjb250YWluaW5nIGFsbCBkZWZpbmVkIHVuc2V0IHN1YmNvbW1hbmRzICovCisKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICp1bnNldGxpc3Q7CisKKy8qIENoYWluIGNvbnRhaW5pbmcgYWxsIGRlZmluZWQgc2hvdyBzdWJjb21tYW5kcy4gICovCisKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpzaG93bGlzdDsKKworLyogQ2hhaW4gY29udGFpbmluZyBhbGwgZGVmaW5lZCBcInNldCBoaXN0b3J5XCIuICAqLworCitzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqc2V0aGlzdGxpc3Q7CisKKy8qIENoYWluIGNvbnRhaW5pbmcgYWxsIGRlZmluZWQgXCJzaG93IGhpc3RvcnlcIi4gICovCisKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpzaG93aGlzdGxpc3Q7CisKKy8qIENoYWluIGNvbnRhaW5pbmcgYWxsIGRlZmluZWQgXCJ1bnNldCBoaXN0b3J5XCIuICAqLworCitzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqdW5zZXRoaXN0bGlzdDsKKworLyogQ2hhaW4gY29udGFpbmluZyBhbGwgZGVmaW5lZCBtYWludGVuYW5jZSBzdWJjb21tYW5kcy4gKi8KKworI2lmIE1BSU5URU5BTkNFX0NNRFMKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICptYWludGVuYW5jZWxpc3Q7CisjZW5kaWYKKworLyogQ2hhaW4gY29udGFpbmluZyBhbGwgZGVmaW5lZCAibWFpbnRlbmFuY2UgaW5mbyIgc3ViY29tbWFuZHMuICovCisKKyNpZiBNQUlOVEVOQU5DRV9DTURTCitzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqbWFpbnRlbmFuY2VpbmZvbGlzdDsKKyNlbmRpZgorCisvKiBDaGFpbiBjb250YWluaW5nIGFsbCBkZWZpbmVkICJtYWludGVuYW5jZSBwcmludCIgc3ViY29tbWFuZHMuICovCisKKyNpZiBNQUlOVEVOQU5DRV9DTURTCitzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqbWFpbnRlbmFuY2VwcmludGxpc3Q7CisjZW5kaWYKKworc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKnNldHByaW50bGlzdDsKKworc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKnNob3dwcmludGxpc3Q7CisKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpzZXRjaGVja2xpc3Q7CisKK3N0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpzaG93Y2hlY2tsaXN0OworCisvKiBzdGRpbyBzdHJlYW0gdGhhdCBjb21tYW5kIGlucHV0IGlzIGJlaW5nIHJlYWQgZnJvbS4gIFNldCB0byBzdGRpbiBub3JtYWxseS4KKyAgIFNldCBieSBzb3VyY2VfY29tbWFuZCB0byB0aGUgZmlsZSB3ZSBhcmUgc291cmNpbmcuICBTZXQgdG8gTlVMTCBpZiB3ZSBhcmUKKyAgIGV4ZWN1dGluZyBhIHVzZXItZGVmaW5lZCBjb21tYW5kIG9yIGludGVyYWN0aW5nIHZpYSBhIEdVSS4gICovCisKK0ZJTEUgKmluc3RyZWFtOworCisvKiBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgKi8KKworY2hhciAqY3VycmVudF9kaXJlY3Rvcnk7CisKKy8qIFRoZSBkaXJlY3RvcnkgbmFtZSBpcyBhY3R1YWxseSBzdG9yZWQgaGVyZSAodXN1YWxseSkuICAqLworY2hhciBnZGJfZGlyYnVmWzEwMjRdOworCisvKiBGdW5jdGlvbiB0byBjYWxsIGJlZm9yZSByZWFkaW5nIGEgY29tbWFuZCwgaWYgbm9uemVyby4KKyAgIFRoZSBmdW5jdGlvbiByZWNlaXZlcyB0d28gYXJnczogYW4gaW5wdXQgc3RyZWFtLAorICAgYW5kIGEgcHJvbXB0IHN0cmluZy4gICovCisKK3ZvaWQgKCp3aW5kb3dfaG9vaykgUEFSQU1TICgoRklMRSAqLCBjaGFyICopKTsKKworaW50IGVwb2NoX2ludGVyZmFjZTsKK2ludCB4Z2RiX3ZlcmJvc2U7CisKKy8qIGdkYiBwcmludHMgdGhpcyB3aGVuIHJlYWRpbmcgYSBjb21tYW5kIGludGVyYWN0aXZlbHkgKi8KK3N0YXRpYyBjaGFyICpwcm9tcHQ7CisKKy8qIEJ1ZmZlciB1c2VkIGZvciByZWFkaW5nIGNvbW1hbmQgbGluZXMsIGFuZCB0aGUgc2l6ZQorICAgYWxsb2NhdGVkIGZvciBpdCBzbyBmYXIuICAqLworCitjaGFyICpsaW5lOworaW50IGxpbmVzaXplID0gMTAwOworCisvKiBOb256ZXJvIGlmIHRoZSBjdXJyZW50IGNvbW1hbmQgaXMgbW9kaWZpZWQgYnkgInNlcnZlciAiLiAgVGhpcworICAgYWZmZWN0cyB0aGluZ3MgbGlrZSByZWNvcmRpbmcgaW50byB0aGUgY29tbWFuZCBoaXN0b3J5LCBjb21hbW5kcworICAgcmVwZWF0aW5nIG9uIFJFVFVSTiwgZXRjLiAgVGhpcyBpcyBzbyBhIHVzZXIgaW50ZXJmYWNlIChlbWFjcywgR1VJLAorICAgd2hhdGV2ZXIpIGNhbiBpc3N1ZSBpdHMgb3duIGNvbW1hbmRzIGFuZCBhbHNvIHNlbmQgYWxvbmcgY29tbWFuZHMKKyAgIGZyb20gdGhlIHVzZXIsIGFuZCBoYXZlIHRoZSB1c2VyIG5vdCBub3RpY2UgdGhhdCB0aGUgdXNlciBpbnRlcmZhY2UKKyAgIGlzIGlzc3VpbmcgY29tbWFuZHMgdG9vLiAgKi8KK2ludCBzZXJ2ZXJfY29tbWFuZDsKKworLyogQmF1ZCByYXRlIHNwZWNpZmllZCBmb3IgdGFsa2luZyB0byBzZXJpYWwgdGFyZ2V0IHN5c3RlbXMuICBEZWZhdWx0CisgICBpcyBsZWZ0IGFzIC0xLCBzbyB0YXJnZXRzIGNhbiBjaG9vc2UgdGhlaXIgb3duIGRlZmF1bHRzLiAgKi8KKy8qIEZJWE1FOiBUaGlzIG1lYW5zIHRoYXQgInNob3cgcmVtb3RlYmF1ZCIgYW5kIGdyX2ZpbGVzX2luZm8gY2FuIHByaW50IC0xCisgICBvciAodW5zaWduZWQgaW50KS0xLiAgVGhpcyBpcyBhIEJhZCBVc2VyIEludGVyZmFjZS4gICovCisKK2ludCBiYXVkX3JhdGUgPSAtMTsKKworLyogVGltZW91dCBsaW1pdCBmb3IgcmVzcG9uc2UgZnJvbSB0YXJnZXQuICovCisKK2ludCByZW1vdGVfdGltZW91dCA9IDIwOwkvKiBTZXQgZGVmYXVsdCB0byAyMCAqLworCisvKiBOb24temVybyB0ZWxscyByZW1vdGUqIG1vZHVsZXMgdG8gb3V0cHV0IGRlYnVnZ2luZyBpbmZvLiAgKi8KKworaW50IHJlbW90ZV9kZWJ1ZyA9IDA7CisKKy8qIExldmVsIG9mIGNvbnRyb2wgc3RydWN0dXJlLiAgKi8KK3N0YXRpYyBpbnQgY29udHJvbF9sZXZlbDsKKworLyogU3RydWN0dXJlIGZvciBhcmd1bWVudHMgdG8gdXNlciBkZWZpbmVkIGZ1bmN0aW9ucy4gICovCisjZGVmaW5lIE1BWFVTRVJBUkdTIDEwCitzdHJ1Y3QgdXNlcl9hcmdzCit7CisgIHN0cnVjdCB1c2VyX2FyZ3MgKm5leHQ7CisgIHN0cnVjdAorICAgIHsKKyAgICAgIGNoYXIgKmFyZzsKKyAgICAgIGludCBsZW47CisgICAgfSBhW01BWFVTRVJBUkdTXTsKKyAgaW50IGNvdW50OworfSAqdXNlcl9hcmdzOworCisvKiBTaWduYWwgdG8gY2F0Y2ggXlogdHlwZWQgd2hpbGUgcmVhZGluZyBhIGNvbW1hbmQ6IFNJR1RTVFAgb3IgU0lHQ09OVC4gICovCisKKyNpZm5kZWYgU1RPUF9TSUdOQUwKKyNpZmRlZiBTSUdUU1RQCisjZGVmaW5lIFNUT1BfU0lHTkFMIFNJR1RTVFAKK3N0YXRpYyB2b2lkIHN0b3Bfc2lnIFBBUkFNUyAoKGludCkpOworI2VuZGlmCisjZW5kaWYKKworLyogU29tZSBTeXN0ZW0gViBoYXZlIGpvYiBjb250cm9sIGJ1dCBub3Qgc2lnc2V0bWFzaygpLiAqLworI2lmICFkZWZpbmVkIChIQVZFX1NJR1NFVE1BU0spCisjaWYgIWRlZmluZWQgKFVTRykKKyNkZWZpbmUgSEFWRV9TSUdTRVRNQVNLIDEKKyNlbHNlCisjZGVmaW5lIEhBVkVfU0lHU0VUTUFTSyAwCisjZW5kaWYKKyNlbmRpZgorCisjaWYgMCA9PSAoSEFWRV9TSUdTRVRNQVNLKQorI2RlZmluZSBzaWdzZXRtYXNrKG4pCisjZW5kaWYKKworLyogSG9va3MgZm9yIGFsdGVybmF0ZSBjb21tYW5kIGludGVyZmFjZXMuICAqLworCisvKiBDYWxsZWQgYWZ0ZXIgbW9zdCBtb2R1bGVzIGhhdmUgYmVlbiBpbml0aWFsaXplZCwgYnV0IGJlZm9yZSB0YWtpbmcgdXNlcnMKKyAgIGNvbW1hbmQgZmlsZS4gICovCisKK3ZvaWQgKCppbml0X3VpX2hvb2spIFBBUkFNUyAoKGNoYXIgKmFyZ3YwKSk7CisjaWZkZWYgX19DWUdXSU4zMl9fCit2b2lkICgqdWlfbG9vcF9ob29rKSBQQVJBTVMgKChpbnQpKTsKKyNlbmRpZgorCisvKiBDYWxsZWQgaW5zdGVhZCBvZiBjb21tYW5kX2xvb3AgYXQgdG9wIGxldmVsLiAgQ2FuIGJlIGludm9rZWQgdmlhCisgICByZXR1cm5fdG9fdG9wX2xldmVsLiAgKi8KKwordm9pZCAoKmNvbW1hbmRfbG9vcF9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CisKKworLyogQ2FsbGVkIGluc3RlYWQgb2YgZnB1dHMgZm9yIGFsbCBvdXRwdXQuICAqLworCit2b2lkICgqZnB1dHNfdW5maWx0ZXJlZF9ob29rKSBQQVJBTVMgKChjb25zdCBjaGFyICpsaW5lYnVmZmVyLCBHREJfRklMRSAqc3RyZWFtKSk7CisKKy8qIENhbGxlZCB3aGVuIHRoZSB0YXJnZXQgc2F5cyBzb21ldGhpbmcgdG8gdGhlIGhvc3QsIHdoaWNoIG1heQorICAgd2FudCB0byBhcHBlYXIgaW4gYSBkaWZmZXJlbnQgd2luZG93LiAqLworCit2b2lkICgqdGFyZ2V0X291dHB1dF9ob29rKSBQQVJBTVMgKChjaGFyICopKTsKKworLyogQ2FsbGVkIGZyb20gcHJpbnRfZnJhbWVfaW5mbyB0byBsaXN0IHRoZSBsaW5lIHdlIHN0b3BwZWQgaW4uICAqLworCit2b2lkICgqcHJpbnRfZnJhbWVfaW5mb19saXN0aW5nX2hvb2spIFBBUkFNUyAoKHN0cnVjdCBzeW10YWIgKnMsIGludCBsaW5lLAorCQkJCQkgICAgICAgaW50IHN0b3BsaW5lLCBpbnQgbm9lcnJvcikpOworLyogUmVwbGFjZXMgbW9zdCBvZiBxdWVyeS4gICovCisKK2ludCAoKnF1ZXJ5X2hvb2spIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworCisvKiBSZXBsYWNlcyBtb3N0IG9mIHdhcm5pbmcuICAqLworCit2b2lkICgqd2FybmluZ19ob29rKSBQQVJBTVMgKChjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKKworLyogQ2FsbGVkIGZyb20gZ2RiX2ZsdXNoIHRvIGZsdXNoIG91dHB1dC4gICovCisKK3ZvaWQgKCpmbHVzaF9ob29rKSBQQVJBTVMgKChHREJfRklMRSAqc3RyZWFtKSk7CisKKy8qIFRoZXNlIHRocmVlIGZ1bmN0aW9ucyBzdXBwb3J0IGdldHRpbmcgbGluZXMgb2YgdGV4dCBmcm9tIHRoZSB1c2VyLiAgVGhleQorICAgYXJlIHVzZWQgaW4gc2VxdWVuY2UuICBGaXJzdCByZWFkbGluZV9iZWdpbl9ob29rIGlzIGNhbGxlZCB3aXRoIGEgdGV4dAorICAgc3RyaW5nIHRoYXQgbWlnaHQgYmUgKGZvciBleGFtcGxlKSBhIG1lc3NhZ2UgZm9yIHRoZSB1c2VyIHRvIHR5cGUgaW4gYQorICAgc2VxdWVuY2Ugb2YgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQgYXQgYSBicmVha3BvaW50LiAgSWYgdGhpcyBmdW5jdGlvbgorICAgY2FsbHMgYmFjayB0byBhIEdVSSwgaXQgbWlnaHQgdGFrZSB0aGlzIG9wcG9ydHVuaXR5IHRvIHBvcCB1cCBhIHRleHQKKyAgIGludGVyYWN0aW9uIHdpbmRvdyB3aXRoIHRoaXMgbWVzc2FnZS4gIE5leHQsIHJlYWRsaW5lX2hvb2sgaXMgY2FsbGVkCisgICB3aXRoIGEgcHJvbXB0IHRoYXQgaXMgZW1pdHRlZCBwcmlvciB0byBjb2xsZWN0aW5nIHRoZSB1c2VyIGlucHV0LgorICAgSXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gIEZpbmFsbHksIHJlYWRsaW5lX2VuZF9ob29rIGlzIGNhbGxlZAorICAgdG8gbm90aWZ5IHRoZSBHVUkgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBpbnRlcmFjdGlvbiB3aW5kb3cgYW5kIGl0CisgICBjYW4gY2xvc2UgaXQuICovCisKK3ZvaWQgKCpyZWFkbGluZV9iZWdpbl9ob29rKSBQQVJBTVMgKChjaGFyICosIC4uLikpOworY2hhciAqICgqcmVhZGxpbmVfaG9vaykgUEFSQU1TICgoY2hhciAqKSk7Cit2b2lkICgqcmVhZGxpbmVfZW5kX2hvb2spIFBBUkFNUyAoKHZvaWQpKTsKKworLyogQ2FsbGVkIGFzIGFwcHJvcHJpYXRlIHRvIG5vdGlmeSB0aGUgaW50ZXJmYWNlIG9mIHRoZSBzcGVjaWZpZWQgYnJlYWtwb2ludAorICAgY29uZGl0aW9ucy4gICovCisKK3ZvaWQgKCpjcmVhdGVfYnJlYWtwb2ludF9ob29rKSBQQVJBTVMgKChzdHJ1Y3QgYnJlYWtwb2ludCAqYnB0KSk7Cit2b2lkICgqZGVsZXRlX2JyZWFrcG9pbnRfaG9vaykgUEFSQU1TICgoc3RydWN0IGJyZWFrcG9pbnQgKmJwdCkpOwordm9pZCAoKm1vZGlmeV9icmVha3BvaW50X2hvb2spIFBBUkFNUyAoKHN0cnVjdCBicmVha3BvaW50ICpicHQpKTsKKworLyogQ2FsbGVkIGR1cmluZyBsb25nIGNhbGN1bGF0aW9ucyB0byBhbGxvdyBHVUkgdG8gcmVwYWlyIHdpbmRvdyBkYW1hZ2UsIGFuZCB0bworICAgY2hlY2sgZm9yIHN0b3AgYnV0dG9ucywgZXRjLi4uICovCisKK3ZvaWQgKCppbnRlcmFjdGl2ZV9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIENhbGxlZCB3aGVuIHRoZSByZWdpc3RlcnMgaGF2ZSBjaGFuZ2VkLCBhcyBhIGhpbnQgdG8gYSBHVUkKKyAgIHRvIG1pbmltaXplIHdpbmRvdyB1cGRhdGUuICovCisKK3ZvaWQgKCpyZWdpc3RlcnNfY2hhbmdlZF9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIFRlbGwgdGhlIEdVSSBzb21lb25lIGNoYW5nZWQgdGhlIHJlZ2lzdGVyIFJFR05PLiAtMSBtZWFucworICAgdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90IGtub3cgd2hpY2ggcmVnaXN0ZXIgY2hhbmdlZCBvcgorICAgdGhhdCBzZXZlcmFsIHJlZ2lzdGVycyBoYXZlIGNoYW5nZWQgKHNlZSB2YWx1ZV9hc3NpZ24pLiovCit2b2lkICgqcmVnaXN0ZXJfY2hhbmdlZF9ob29rKSBQQVJBTVMgKChpbnQgcmVnbm8pKTsKKworLyogVGVsbCB0aGUgR1VJIHNvbWVvbmUgY2hhbmdlZCBMRU4gYnl0ZXMgb2YgbWVtb3J5IGF0IEFERFIgKi8KK3ZvaWQgKCptZW1vcnlfY2hhbmdlZF9ob29rKSBQQVJBTVMgKChDT1JFX0FERFIgYWRkciwgaW50IGxlbikpOworCisvKiBDYWxsZWQgd2hlbiBnb2luZyB0byB3YWl0IGZvciB0aGUgdGFyZ2V0LiAgVXN1YWxseSBhbGxvd3MgdGhlIEdVSSB0byBydW4KKyAgIHdoaWxlIHdhaXRpbmcgZm9yIHRhcmdldCBldmVudHMuICAqLworCitpbnQgKCp0YXJnZXRfd2FpdF9ob29rKSBQQVJBTVMgKChpbnQgcGlkLCBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKnN0YXR1cykpOworCisvKiBVc2VkIGJ5IFVJIGFzIGEgd3JhcHBlciBhcm91bmQgY29tbWFuZCBleGVjdXRpb24uICBNYXkgZG8gdmFyaW91cyB0aGluZ3MKKyAgIGxpa2UgZW5hYmxpbmcvZGlzYWJsaW5nIGJ1dHRvbnMsIGV0Yy4uLiAgKi8KKwordm9pZCAoKmNhbGxfY29tbWFuZF9ob29rKSBQQVJBTVMgKChzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqYywgY2hhciAqY21kLAorCQkJCSAgIGludCBmcm9tX3R0eSkpOworCisvKiBDYWxsZWQgd2hlbiB0aGUgY3VycmVudCB0aHJlYWQgY2hhbmdlcy4gIEFyZ3VtZW50IGlzIHRocmVhZCBpZC4gICovCisKK3ZvaWQgKCpjb250ZXh0X2hvb2spIFBBUkFNUyAoKGludCBpZCkpOworCisvKiBUYWtlcyBjb250cm9sIGZyb20gZXJyb3IgKCkuICBUeXBpY2FsbHkgdXNlZCB0byBwcmV2ZW50IGxvbmdqbXBzIG91dCBvZiB0aGUKKyAgIG1pZGRsZSBvZiB0aGUgR1VJLiAgVXN1YWxseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYSBjYXRjaCByb3V0aW5lLiAgKi8KKworTk9SRVRVUk4gdm9pZCAoKmVycm9yX2hvb2spIFBBUkFNUyAoKHZvaWQpKSBBVFRSX05PUkVUVVJOOworCisMCisvKiBXaGVyZSB0byBnbyBmb3IgcmV0dXJuX3RvX3RvcF9sZXZlbCAoUkVUVVJOX0VSUk9SKS4gICovCitTSUdKTVBfQlVGIGVycm9yX3JldHVybjsKKy8qIFdoZXJlIHRvIGdvIGZvciByZXR1cm5fdG9fdG9wX2xldmVsIChSRVRVUk5fUVVJVCkuICAqLworU0lHSk1QX0JVRiBxdWl0X3JldHVybjsKKworLyogUmV0dXJuIGZvciByZWFzb24gUkVBU09OLiAgVGhpcyBnZW5lcmFsbHkgZ2V0cyBiYWNrIHRvIHRoZSBjb21tYW5kCisgICBsb29wLCBidXQgY2FuIGJlIGNhdWdodCB2aWEgY2F0Y2hfZXJyb3JzLiAgKi8KKworTk9SRVRVUk4gdm9pZAorcmV0dXJuX3RvX3RvcF9sZXZlbCAocmVhc29uKQorICAgICBlbnVtIHJldHVybl9yZWFzb24gcmVhc29uOworeworICBxdWl0X2ZsYWcgPSAwOworICBpbW1lZGlhdGVfcXVpdCA9IDA7CisKKyAgLyogUGVyaGFwcyBpdCB3b3VsZCBiZSBjbGVhbmVyIHRvIGRvIHRoaXMgdmlhIHRoZSBjbGVhbnVwIGNoYWluIChub3Qgc3VyZQorICAgICBJIGNhbiB0aGluayBvZiBhIHJlYXNvbiB3aHkgdGhhdCBpcyB2aXRhbCwgdGhvdWdoKS4gICovCisgIGJwc3RhdF9jbGVhcl9hY3Rpb25zKHN0b3BfYnBzdGF0KTsJLyogQ2xlYXIgcXVldWVkIGJyZWFrcG9pbnQgY29tbWFuZHMgKi8KKworICBkaXNhYmxlX2N1cnJlbnRfZGlzcGxheSAoKTsKKyAgZG9fY2xlYW51cHMgKEFMTF9DTEVBTlVQUyk7CisKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHN3aXRjaCAocmVhc29uKQorICAgICAgeworICAgICAgY2FzZSBSRVRVUk5fUVVJVDoKKwlhbm5vdGF0ZV9xdWl0ICgpOworCWJyZWFrOworICAgICAgY2FzZSBSRVRVUk5fRVJST1I6CisJYW5ub3RhdGVfZXJyb3IgKCk7CisJYnJlYWs7CisgICAgICB9CisKKyAgKE5PUkVUVVJOIHZvaWQpIFNJR0xPTkdKTVAKKyAgICAocmVhc29uID09IFJFVFVSTl9FUlJPUiA/IGVycm9yX3JldHVybiA6IHF1aXRfcmV0dXJuLCAxKTsKK30KKworLyogQ2FsbCBGVU5DIHdpdGggYXJnIEFSR1MsIGNhdGNoaW5nIGFueSBlcnJvcnMuICBJZiB0aGVyZSBpcyBubworICAgZXJyb3IsIHJldHVybiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgRlVOQy4gIElmIHRoZXJlIGlzIGFuIGVycm9yLAorICAgcHJpbnQgRVJSU1RSSU5HLCBwcmludCB0aGUgc3BlY2lmaWMgZXJyb3IgbWVzc2FnZSwgdGhlbiByZXR1cm4KKyAgIHplcm8uCisKKyAgIE11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGltbWVkaWF0ZV9xdWl0IGluIGVmZmVjdCAoYmFkIHRoaW5ncyBtaWdodAorICAgaGFwcGVuLCBzYXkgd2UgZ290IGEgc2lnbmFsIGluIHRoZSBtaWRkbGUgb2YgYSBtZW1jcHkgdG8gcXVpdF9yZXR1cm4pLgorICAgVGhpcyBpcyBhbiBPSyByZXN0cmljdGlvbjsgd2l0aCB2ZXJ5IGZldyBleGNlcHRpb25zIGltbWVkaWF0ZV9xdWl0IGNhbgorICAgYmUgcmVwbGFjZWQgYnkganVkaWNpb3VzIHVzZSBvZiBRVUlULgorCisgICBNQVNLIHNwZWNpZmllcyB3aGF0IHRvIGNhdGNoOyBpdCBpcyBub3JtYWxseSBzZXQgdG8KKyAgIFJFVFVSTl9NQVNLX0FMTCwgaWYgZm9yIG5vIG90aGVyIHJlYXNvbiB0aGFuIHRoYXQgdGhlIGNvZGUgd2hpY2gKKyAgIGNhbGxzIGNhdGNoX2Vycm9ycyBtaWdodCBub3QgYmUgc2V0IHVwIHRvIGRlYWwgd2l0aCBhIHF1aXQgd2hpY2gKKyAgIGlzbid0IGNhdWdodC4gIEJ1dCBpZiB0aGUgY29kZSBjYW4gZGVhbCB3aXRoIGl0LCBpdCBnZW5lcmFsbHkKKyAgIHNob3VsZCBiZSBSRVRVUk5fTUFTS19FUlJPUiwgdW5sZXNzIGZvciBzb21lIHJlYXNvbiBpdCBpcyBtb3JlCisgICB1c2VmdWwgdG8gYWJvcnQgb25seSB0aGUgcG9ydGlvbiBvZiB0aGUgb3BlcmF0aW9uIGluc2lkZSB0aGUKKyAgIGNhdGNoX2Vycm9ycy4gIE5vdGUgdGhhdCBxdWl0IHNob3VsZCByZXR1cm4gdG8gdGhlIGNvbW1hbmQgbGluZQorICAgZmFpcmx5IHF1aWNrbHksIGV2ZW4gaWYgc29tZSBmdXJ0aGVyIHByb2Nlc3NpbmcgaXMgYmVpbmcgZG9uZS4gICovCisKK2ludAorY2F0Y2hfZXJyb3JzIChmdW5jLCBhcmdzLCBlcnJzdHJpbmcsIG1hc2spCisgICAgIGNhdGNoX2Vycm9yc19mdHlwZSAqZnVuYzsKKyAgICAgUFRSIGFyZ3M7CisgICAgIGNoYXIgKmVycnN0cmluZzsKKyAgICAgcmV0dXJuX21hc2sgbWFzazsKK3sKKyAgU0lHSk1QX0JVRiBzYXZlZF9lcnJvcjsKKyAgU0lHSk1QX0JVRiBzYXZlZF9xdWl0OworICBTSUdKTVBfQlVGIHRtcF9qbXA7CisgIGludCB2YWw7CisgIHN0cnVjdCBjbGVhbnVwICpzYXZlZF9jbGVhbnVwX2NoYWluOworICBjaGFyICpzYXZlZF9lcnJvcl9wcmVfcHJpbnQ7CisgIGNoYXIgKnNhdmVkX3F1aXRfcHJlX3ByaW50OworCisgIHNhdmVkX2NsZWFudXBfY2hhaW4gPSBzYXZlX2NsZWFudXBzICgpOworICBzYXZlZF9lcnJvcl9wcmVfcHJpbnQgPSBlcnJvcl9wcmVfcHJpbnQ7CisgIHNhdmVkX3F1aXRfcHJlX3ByaW50ID0gcXVpdF9wcmVfcHJpbnQ7CisKKyAgaWYgKG1hc2sgJiBSRVRVUk5fTUFTS19FUlJPUikKKyAgICB7CisgICAgICBtZW1jcHkgKChjaGFyICopc2F2ZWRfZXJyb3IsIChjaGFyICopZXJyb3JfcmV0dXJuLCBzaXplb2YgKFNJR0pNUF9CVUYpKTsKKyAgICAgIGVycm9yX3ByZV9wcmludCA9IGVycnN0cmluZzsKKyAgICB9CisgIGlmIChtYXNrICYgUkVUVVJOX01BU0tfUVVJVCkKKyAgICB7CisgICAgICBtZW1jcHkgKHNhdmVkX3F1aXQsIHF1aXRfcmV0dXJuLCBzaXplb2YgKFNJR0pNUF9CVUYpKTsKKyAgICAgIHF1aXRfcHJlX3ByaW50ID0gZXJyc3RyaW5nOworICAgIH0KKworICBpZiAoU0lHU0VUSk1QICh0bXBfam1wKSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChtYXNrICYgUkVUVVJOX01BU0tfRVJST1IpCisJbWVtY3B5IChlcnJvcl9yZXR1cm4sIHRtcF9qbXAsIHNpemVvZiAoU0lHSk1QX0JVRikpOworICAgICAgaWYgKG1hc2sgJiBSRVRVUk5fTUFTS19RVUlUKQorCW1lbWNweSAocXVpdF9yZXR1cm4sIHRtcF9qbXAsIHNpemVvZiAoU0lHSk1QX0JVRikpOworICAgICAgdmFsID0gKCpmdW5jKSAoYXJncyk7CisgICAgfQorICBlbHNlCisgICAgdmFsID0gMDsKKworICByZXN0b3JlX2NsZWFudXBzIChzYXZlZF9jbGVhbnVwX2NoYWluKTsKKworICBpZiAobWFzayAmIFJFVFVSTl9NQVNLX0VSUk9SKQorICAgIHsKKyAgICAgIG1lbWNweSAoZXJyb3JfcmV0dXJuLCBzYXZlZF9lcnJvciwgc2l6ZW9mIChTSUdKTVBfQlVGKSk7CisgICAgICBlcnJvcl9wcmVfcHJpbnQgPSBzYXZlZF9lcnJvcl9wcmVfcHJpbnQ7CisgICAgfQorICBpZiAobWFzayAmIFJFVFVSTl9NQVNLX1FVSVQpCisgICAgeworICAgICAgbWVtY3B5IChxdWl0X3JldHVybiwgc2F2ZWRfcXVpdCwgc2l6ZW9mIChTSUdKTVBfQlVGKSk7CisgICAgICBxdWl0X3ByZV9wcmludCA9IHNhdmVkX3F1aXRfcHJlX3ByaW50OworICAgIH0KKyAgcmV0dXJuIHZhbDsKK30KKworLyogSGFuZGxlciBmb3IgU0lHSFVQLiAgKi8KKworI2lmZGVmIFNJR0hVUAorc3RhdGljIHZvaWQKK2Rpc2Nvbm5lY3QgKHNpZ25vKQoraW50IHNpZ25vOworeworICBjYXRjaF9lcnJvcnMgKHF1aXRfY292ZXIsIE5VTEwsCisJCSJDb3VsZCBub3Qga2lsbCB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZCIsIFJFVFVSTl9NQVNLX0FMTCk7CisgIHNpZ25hbCAoU0lHSFVQLCBTSUdfREZMKTsKKyAga2lsbCAoZ2V0cGlkICgpLCBTSUdIVVApOworfQorCisvKiBKdXN0IGEgbGl0dGxlIGhlbHBlciBmdW5jdGlvbiBmb3IgZGlzY29ubmVjdCgpLiAgKi8KKworc3RhdGljIGludAorcXVpdF9jb3ZlciAocykKKyAgICAgUFRSIHM7Cit7CisgIGNhdXRpb24gPSAwOwkJLyogVGhyb3cgY2F1dGlvbiB0byB0aGUgd2luZCAtLSB3ZSdyZSBleGl0aW5nLgorCQkJICAgVGhpcyBwcmV2ZW50cyBhc2tpbmcgdGhlIHVzZXIgZHVtYiBxdWVzdGlvbnMuICAqLworICBxdWl0X2NvbW1hbmQoKGNoYXIgKikwLCAwKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogZGVmaW5lZCBTSUdIVVAgKi8KKwwKKy8qIExpbmUgbnVtYmVyIHdlIGFyZSBjdXJyZW50bHkgaW4gaW4gYSBmaWxlIHdoaWNoIGlzIGJlaW5nIHNvdXJjZWQuICAqLworc3RhdGljIGludCBzb3VyY2VfbGluZV9udW1iZXI7CisKKy8qIE5hbWUgb2YgdGhlIGZpbGUgd2UgYXJlIHNvdXJjaW5nLiAgKi8KK3N0YXRpYyBjaGFyICpzb3VyY2VfZmlsZV9uYW1lOworCisvKiBCdWZmZXIgY29udGFpbmluZyB0aGUgZXJyb3JfcHJlX3ByaW50IHVzZWQgYnkgdGhlIHNvdXJjZSBzdHVmZi4KKyAgIE1hbGxvYydkLiAgKi8KK3N0YXRpYyBjaGFyICpzb3VyY2VfZXJyb3I7CitzdGF0aWMgaW50IHNvdXJjZV9lcnJvcl9hbGxvY2F0ZWQ7CisKKy8qIFNvbWV0aGluZyB0byBnbG9tIG9uIHRvIHRoZSBzdGFydCBvZiBlcnJvcl9wcmVfcHJpbnQgaWYgc291cmNlX2ZpbGVfbmFtZQorICAgaXMgc2V0LiAgKi8KK3N0YXRpYyBjaGFyICpzb3VyY2VfcHJlX2Vycm9yOworCisvKiBDbGVhbiB1cCBvbiBlcnJvciBkdXJpbmcgYSAic291cmNlIiBjb21tYW5kIChvciBleGVjdXRpb24gb2YgYQorICAgdXNlci1kZWZpbmVkIGNvbW1hbmQpLiAgKi8KKworc3RhdGljIHZvaWQKK3NvdXJjZV9jbGVhbnVwIChzdHJlYW0pCisgICAgIEZJTEUgKnN0cmVhbTsKK3sKKyAgLyogUmVzdG9yZSB0aGUgcHJldmlvdXMgaW5wdXQgc3RyZWFtLiAgKi8KKyAgaW5zdHJlYW0gPSBzdHJlYW07Cit9CisKKy8qIFJlYWQgY29tbWFuZHMgZnJvbSBTVFJFQU0uICAqLwordm9pZAorcmVhZF9jb21tYW5kX2ZpbGUgKHN0cmVhbSkKKyAgICAgRklMRSAqc3RyZWFtOworeworICBzdHJ1Y3QgY2xlYW51cCAqY2xlYW51cHM7CisKKyAgY2xlYW51cHMgPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgc291cmNlX2NsZWFudXAsIGluc3RyZWFtKTsKKyAgaW5zdHJlYW0gPSBzdHJlYW07CisgIGNvbW1hbmRfbG9vcCAoKTsKKyAgZG9fY2xlYW51cHMgKGNsZWFudXBzKTsKK30KKwwKK2V4dGVybiB2b2lkIGluaXRfcHJvYyBQQVJBTVMgKCh2b2lkKSk7CisKK3ZvaWQgKCpwcmVfaW5pdF91aV9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CisKK3ZvaWQKK2dkYl9pbml0IChhcmd2MCkKKyAgICAgY2hhciAqYXJndjA7Cit7CisgIGlmIChwcmVfaW5pdF91aV9ob29rKQorICAgIHByZV9pbml0X3VpX2hvb2sgKCk7CisKKyAgLyogUnVuIHRoZSBpbml0IGZ1bmN0aW9uIG9mIGVhY2ggc291cmNlIGZpbGUgKi8KKworICBnZXRjd2QgKGdkYl9kaXJidWYsIHNpemVvZiAoZ2RiX2RpcmJ1ZikpOworICBjdXJyZW50X2RpcmVjdG9yeSA9IGdkYl9kaXJidWY7CisKKyAgaW5pdF9jbWRfbGlzdHMgKCk7CS8qIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBmaXJzdCAqLworICBpbml0aWFsaXplX3RhcmdldHMgKCk7IC8qIFNldHVwIHRhcmdldF90ZXJtaW5hbCBtYWNyb3MgZm9yIHV0aWxzLmMgKi8KKyAgaW5pdGlhbGl6ZV91dGlscyAoKTsJLyogTWFrZSBlcnJvcnMgYW5kIHdhcm5pbmdzIHBvc3NpYmxlICovCisgIGluaXRpYWxpemVfYWxsX2ZpbGVzICgpOworICBpbml0X21haW4gKCk7CQkvKiBCdXQgdGhhdCBvbWl0cyB0aGlzIGZpbGUhICBEbyBpdCBub3cgKi8KKyAgaW5pdF9zaWduYWxzICgpOworCisgIGluaXRfcHJvYyAoKTsKKworICAvKiBXZSBuZWVkIGEgZGVmYXVsdCBsYW5ndWFnZSBmb3IgcGFyc2luZyBleHByZXNzaW9ucywgc28gc2ltcGxlIHRoaW5ncyBsaWtlCisgICAgICJzZXQgd2lkdGggMCIgd29uJ3QgZmFpbCBpZiBubyBsYW5ndWFnZSBpcyBleHBsaWNpdGx5IHNldCBpbiBhIGNvbmZpZyBmaWxlCisgICAgIG9yIGltcGxpY2l0bHkgc2V0IGJ5IHJlYWRpbmcgYW4gZXhlY3V0YWJsZSBkdXJpbmcgc3RhcnR1cC4gKi8KKyAgc2V0X2xhbmd1YWdlIChsYW5ndWFnZV9jKTsKKyAgZXhwZWN0ZWRfbGFuZ3VhZ2UgPSBjdXJyZW50X2xhbmd1YWdlOwkvKiBkb24ndCB3YXJuIGFib3V0IHRoZSBjaGFuZ2UuICAqLworCisgIGlmIChpbml0X3VpX2hvb2spCisgICAgaW5pdF91aV9ob29rIChhcmd2MCk7Cit9CisKKy8qIEFsbG9jYXRlLCBpbml0aWFsaXplIGEgbmV3IGNvbW1hbmQgbGluZSBzdHJ1Y3R1cmUgZm9yIG9uZSBvZiB0aGUKKyAgIGNvbnRyb2wgY29tbWFuZHMgKGlmL3doaWxlKS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgY29tbWFuZF9saW5lICoKK2J1aWxkX2NvbW1hbmRfbGluZSAodHlwZSwgYXJncykKKyAgICAgZW51bSBjb21tYW5kX2NvbnRyb2xfdHlwZSB0eXBlOworICAgICBjaGFyICphcmdzOworeworICBzdHJ1Y3QgY29tbWFuZF9saW5lICpjbWQ7CisKKyAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICBlcnJvciAoImlmL3doaWxlIGNvbW1hbmRzIHJlcXVpcmUgYXJndW1lbnRzLlxuIik7CisKKyAgY21kID0gKHN0cnVjdCBjb21tYW5kX2xpbmUgKil4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb21tYW5kX2xpbmUpKTsKKyAgY21kLT5uZXh0ID0gTlVMTDsKKyAgY21kLT5jb250cm9sX3R5cGUgPSB0eXBlOworCisgIGNtZC0+Ym9keV9jb3VudCA9IDE7CisgIGNtZC0+Ym9keV9saXN0CisgICAgPSAoc3RydWN0IGNvbW1hbmRfbGluZSAqKil4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb21tYW5kX2xpbmUgKikKKwkJCQkgICAgICAgKiBjbWQtPmJvZHlfY291bnQpOworICBtZW1zZXQgKGNtZC0+Ym9keV9saXN0LCAwLCBzaXplb2YgKHN0cnVjdCBjb21tYW5kX2xpbmUgKikgKiBjbWQtPmJvZHlfY291bnQpOworICBjbWQtPmxpbmUgPSBzYXZlc3RyaW5nIChhcmdzLCBzdHJsZW4gKGFyZ3MpKTsKKyAgcmV0dXJuIGNtZDsKK30KKworLyogQnVpbGQgYW5kIHJldHVybiBhIG5ldyBjb21tYW5kIHN0cnVjdHVyZSBmb3IgdGhlIGNvbnRyb2wgY29tbWFuZHMKKyAgIHN1Y2ggYXMgImlmIiBhbmQgIndoaWxlIi4gICovCisKK3N0YXRpYyBzdHJ1Y3QgY29tbWFuZF9saW5lICoKK2dldF9jb21tYW5kX2xpbmUgKHR5cGUsIGFyZykKKyAgICAgZW51bSBjb21tYW5kX2NvbnRyb2xfdHlwZSB0eXBlOworICAgICBjaGFyICphcmc7Cit7CisgIHN0cnVjdCBjb21tYW5kX2xpbmUgKmNtZDsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbiA9IE5VTEw7CisKKyAgLyogQWxsb2NhdGUgYW5kIGJ1aWxkIGEgbmV3IGNvbW1hbmQgbGluZSBzdHJ1Y3R1cmUuICAqLworICBjbWQgPSBidWlsZF9jb21tYW5kX2xpbmUgKHR5cGUsIGFyZyk7CisKKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfY29tbWFuZF9saW5lcywgJmNtZCk7CisKKyAgLyogUmVhZCBpbiB0aGUgYm9keSBvZiB0aGlzIGNvbW1hbmQuICAqLworICBpZiAocmVjdXJzZV9yZWFkX2NvbnRyb2xfc3RydWN0dXJlIChjbWQpID09IGludmFsaWRfY29udHJvbCkKKyAgICB7CisgICAgICB3YXJuaW5nICgiZXJyb3IgcmVhZGluZyBpbiBjb250cm9sIHN0cnVjdHVyZVxuIik7CisgICAgICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBkaXNjYXJkX2NsZWFudXBzIChvbGRfY2hhaW4pOworICByZXR1cm4gY21kOworfQorCisvKiBSZWN1cnNpdmVseSBwcmludCBhIGNvbW1hbmQgKGluY2x1ZGluZyBmdWxsIGNvbnRyb2wgc3RydWN0dXJlcykuICAqLwordm9pZAorcHJpbnRfY29tbWFuZF9saW5lIChjbWQsIGRlcHRoKQorICAgICBzdHJ1Y3QgY29tbWFuZF9saW5lICpjbWQ7CisgICAgIHVuc2lnbmVkIGludCBkZXB0aDsKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgaWYgKGRlcHRoKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBkZXB0aDsgaSsrKQorCWZwdXRzX2ZpbHRlcmVkICgiICAiLCBnZGJfc3Rkb3V0KTsKKyAgICB9CisKKyAgLyogQSBzaW1wbGUgY29tbWFuZCwgcHJpbnQgaXQgYW5kIHJldHVybi4gICovCisgIGlmIChjbWQtPmNvbnRyb2xfdHlwZSA9PSBzaW1wbGVfY29udHJvbCkKKyAgICB7CisgICAgICBmcHV0c19maWx0ZXJlZCAoY21kLT5saW5lLCBnZGJfc3Rkb3V0KTsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiXG4iLCBnZGJfc3Rkb3V0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogbG9vcF9jb250aW51ZSB0byBqdW1wIHRvIHRoZSBzdGFydCBvZiBhIHdoaWxlIGxvb3AsIHByaW50IGl0CisgICAgIGFuZCByZXR1cm4uICovCisgIGlmIChjbWQtPmNvbnRyb2xfdHlwZSA9PSBjb250aW51ZV9jb250cm9sKQorICAgIHsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgibG9vcF9jb250aW51ZVxuIiwgZ2RiX3N0ZG91dCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIGxvb3BfYnJlYWsgdG8gYnJlYWsgb3V0IG9mIGEgd2hpbGUgbG9vcCwgcHJpbnQgaXQgYW5kIHJldHVybi4gICovCisgIGlmIChjbWQtPmNvbnRyb2xfdHlwZSA9PSBicmVha19jb250cm9sKQorICAgIHsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgibG9vcF9icmVha1xuIiwgZ2RiX3N0ZG91dCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIEEgd2hpbGUgY29tbWFuZC4gIFJlY3Vyc2l2ZWx5IHByaW50IGl0cyBzdWJjb21tYW5kcyBiZWZvcmUgcmV0dXJuaW5nLiAgKi8KKyAgaWYgKGNtZC0+Y29udHJvbF90eXBlID09IHdoaWxlX2NvbnRyb2wpCisgICAgeworICAgICAgc3RydWN0IGNvbW1hbmRfbGluZSAqbGlzdDsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgid2hpbGUgIiwgZ2RiX3N0ZG91dCk7CisgICAgICBmcHV0c19maWx0ZXJlZCAoY21kLT5saW5lLCBnZGJfc3Rkb3V0KTsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiXG4iLCBnZGJfc3Rkb3V0KTsKKyAgICAgIGxpc3QgPSAqY21kLT5ib2R5X2xpc3Q7CisgICAgICB3aGlsZSAobGlzdCkKKwl7CisJICBwcmludF9jb21tYW5kX2xpbmUgKGxpc3QsIGRlcHRoICsgMSk7CisJICBsaXN0ID0gbGlzdC0+bmV4dDsKKwl9CisgICAgfQorCisgIC8qIEFuIGlmIGNvbW1hbmQuICBSZWN1cnNpdmVseSBwcmludCBib3RoIGFybXMgYmVmb3JlIHJldHVybmluZy4gICovCisgIGlmIChjbWQtPmNvbnRyb2xfdHlwZSA9PSBpZl9jb250cm9sKQorICAgIHsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiaWYgIiwgZ2RiX3N0ZG91dCk7CisgICAgICBmcHV0c19maWx0ZXJlZCAoY21kLT5saW5lLCBnZGJfc3Rkb3V0KTsKKyAgICAgIGZwdXRzX2ZpbHRlcmVkICgiXG4iLCBnZGJfc3Rkb3V0KTsKKyAgICAgIC8qIFRoZSB0cnVlIGFybS4gKi8KKyAgICAgIHByaW50X2NvbW1hbmRfbGluZSAoY21kLT5ib2R5X2xpc3RbMF0sIGRlcHRoICsgMSk7CisKKyAgICAgIC8qIFNob3cgdGhlIGZhbHNlIGFybSBpZiBpdCBleGlzdHMuICAqLworICAgICAgaWYgKGNtZC0+Ym9keV9jb3VudCA9PSAyKQorCSAgeworCSAgICBpZiAoZGVwdGgpCisJICAgICAgeworCQlmb3IgKGkgPSAwOyBpIDwgZGVwdGg7IGkrKykKKwkJICBmcHV0c19maWx0ZXJlZCAoIiAgIiwgZ2RiX3N0ZG91dCk7CisJICAgICAgfQorCSAgICBmcHV0c19maWx0ZXJlZCAoImVsc2VcbiIsIGdkYl9zdGRvdXQpOworCSAgICBwcmludF9jb21tYW5kX2xpbmUgKGNtZC0+Ym9keV9saXN0WzFdLCBkZXB0aCArIDEpOworCSAgfQorICAgICAgaWYgKGRlcHRoKQorCXsKKwkgIGZvciAoaSA9IDA7IGkgPCBkZXB0aDsgaSsrKQorCSAgICBmcHV0c19maWx0ZXJlZCAoIiAgIiwgZ2RiX3N0ZG91dCk7CisJfQorICAgICAgZnB1dHNfZmlsdGVyZWQgKCJlbmRcbiIsIGdkYl9zdGRvdXQpOworICAgIH0KK30KKworLyogRXhlY3V0ZSB0aGUgY29tbWFuZCBpbiBDTUQuICAqLworCitlbnVtIGNvbW1hbmRfY29udHJvbF90eXBlCitleGVjdXRlX2NvbnRyb2xfY29tbWFuZCAoY21kKQorICAgICBzdHJ1Y3QgY29tbWFuZF9saW5lICpjbWQ7Cit7CisgIHN0cnVjdCBleHByZXNzaW9uICpleHByOworICBzdHJ1Y3QgY29tbWFuZF9saW5lICpjdXJyZW50OworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluID0gMDsKKyAgdmFsdWVfcHRyIHZhbDsKKyAgdmFsdWVfcHRyIHZhbF9tYXJrOworICBpbnQgbG9vcDsKKyAgZW51bSBjb21tYW5kX2NvbnRyb2xfdHlwZSByZXQ7CisgIGNoYXIgKm5ld19saW5lOworCisgIHN3aXRjaCAoY21kLT5jb250cm9sX3R5cGUpCisgICAgeworICAgIGNhc2Ugc2ltcGxlX2NvbnRyb2w6CisgICAgICAvKiBBIHNpbXBsZSBjb21tYW5kLCBleGVjdXRlIGl0IGFuZCByZXR1cm4uICAqLworICAgICAgbmV3X2xpbmUgPSBpbnNlcnRfYXJncyAoY21kLT5saW5lKTsKKyAgICAgIGlmICghbmV3X2xpbmUpCisJcmV0dXJuIGludmFsaWRfY29udHJvbDsKKyAgICAgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlX2N1cnJlbnRfY29udGVudHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3X2xpbmUpOworICAgICAgZXhlY3V0ZV9jb21tYW5kIChuZXdfbGluZSwgMCk7CisgICAgICByZXQgPSBjbWQtPmNvbnRyb2xfdHlwZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBjb250aW51ZV9jb250cm9sOgorICAgIGNhc2UgYnJlYWtfY29udHJvbDoKKyAgICAgIC8qIFJldHVybiBmb3IgImNvbnRpbnVlIiwgYW5kICJicmVhayIgc28gd2UgY2FuIGVpdGhlcgorCSBjb250aW51ZSB0aGUgbG9vcCBhdCB0aGUgdG9wLCBvciBicmVhayBvdXQuICAqLworICAgICAgcmV0ID0gY21kLT5jb250cm9sX3R5cGU7CisgICAgICBicmVhazsKKworICAgIGNhc2Ugd2hpbGVfY29udHJvbDoKKyAgICAgIHsKKwkvKiBQYXJzZSB0aGUgbG9vcCBjb250cm9sIGV4cHJlc3Npb24gZm9yIHRoZSB3aGlsZSBzdGF0ZW1lbnQuICAqLworCW5ld19saW5lID0gaW5zZXJ0X2FyZ3MgKGNtZC0+bGluZSk7CisJaWYgKCFuZXdfbGluZSkKKwkgIHJldHVybiBpbnZhbGlkX2NvbnRyb2w7CisJb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfY3VycmVudF9jb250ZW50cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld19saW5lKTsKKwlleHByID0gcGFyc2VfZXhwcmVzc2lvbiAobmV3X2xpbmUpOworCW1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlX2N1cnJlbnRfY29udGVudHMsICZleHByKTsKKwkKKwlyZXQgPSBzaW1wbGVfY29udHJvbDsKKwlsb29wID0gMTsKKworCS8qIEtlZXAgaXRlcmF0aW5nIHNvIGxvbmcgYXMgdGhlIGV4cHJlc3Npb24gaXMgdHJ1ZS4gICovCisJd2hpbGUgKGxvb3AgPT0gMSkKKwkgIHsKKwkgICAgaW50IGNvbmRfcmVzdWx0OworCisJICAgIFFVSVQ7CisKKwkgICAgLyogRXZhbHVhdGUgdGhlIGV4cHJlc3Npb24uICAqLworCSAgICB2YWxfbWFyayA9IHZhbHVlX21hcmsgKCk7CisJICAgIHZhbCA9IGV2YWx1YXRlX2V4cHJlc3Npb24gKGV4cHIpOworCSAgICBjb25kX3Jlc3VsdCA9IHZhbHVlX3RydWUgKHZhbCk7CisJICAgIHZhbHVlX2ZyZWVfdG9fbWFyayAodmFsX21hcmspOworCisJICAgIC8qIElmIHRoZSB2YWx1ZSBpcyBmYWxzZSwgdGhlbiBicmVhayBvdXQgb2YgdGhlIGxvb3AuICAqLworCSAgICBpZiAoIWNvbmRfcmVzdWx0KQorCSAgICAgIGJyZWFrOworCisJICAgIC8qIEV4ZWN1dGUgdGhlIGJvZHkgb2YgdGhlIHdoaWxlIHN0YXRlbWVudC4gICovCisJICAgIGN1cnJlbnQgPSAqY21kLT5ib2R5X2xpc3Q7CisJICAgIHdoaWxlIChjdXJyZW50KQorCSAgICAgIHsKKwkJcmV0ID0gZXhlY3V0ZV9jb250cm9sX2NvbW1hbmQgKGN1cnJlbnQpOworCisJCS8qIElmIHdlIGdvdCBhbiBlcnJvciwgb3IgYSAiYnJlYWsiIGNvbW1hbmQsIHRoZW4gc3RvcAorCQkgICBsb29waW5nLiAgKi8KKwkJaWYgKHJldCA9PSBpbnZhbGlkX2NvbnRyb2wgfHwgcmV0ID09IGJyZWFrX2NvbnRyb2wpCisJCSAgeworCQkgICAgbG9vcCA9IDA7CisJCSAgICBicmVhazsKKwkJICB9CisKKwkJLyogSWYgd2UgZ290IGEgImNvbnRpbnVlIiBjb21tYW5kLCB0aGVuIHJlc3RhcnQgdGhlIGxvb3AKKwkJICAgYXQgdGhpcyBwb2ludC4gICovCisJCWlmIChyZXQgPT0gY29udGludWVfY29udHJvbCkKKwkJICBicmVhazsKKwkJCisJCS8qIEdldCB0aGUgbmV4dCBzdGF0ZW1lbnQuICAqLworCQljdXJyZW50ID0gY3VycmVudC0+bmV4dDsgCisJICAgICAgfQorCSAgfQorCisJLyogUmVzZXQgUkVUIHNvIHRoYXQgd2UgZG9uJ3QgcmVjdXJzZSB0aGUgYnJlYWsgYWxsIHRoZSB3YXkgZG93bi4gICovCisJaWYgKHJldCA9PSBicmVha19jb250cm9sKQorCSAgcmV0ID0gc2ltcGxlX2NvbnRyb2w7CisKKwlicmVhazsKKyAgICAgIH0KKworICAgIGNhc2UgaWZfY29udHJvbDoKKyAgICAgIHsKKwluZXdfbGluZSA9IGluc2VydF9hcmdzIChjbWQtPmxpbmUpOworCWlmICghbmV3X2xpbmUpCisJICByZXR1cm4gaW52YWxpZF9jb250cm9sOworCW9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlX2N1cnJlbnRfY29udGVudHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfbGluZSk7CisJLyogUGFyc2UgdGhlIGNvbmRpdGlvbmFsIGZvciB0aGUgaWYgc3RhdGVtZW50LiAgKi8KKwlleHByID0gcGFyc2VfZXhwcmVzc2lvbiAobmV3X2xpbmUpOworCW1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlX2N1cnJlbnRfY29udGVudHMsICZleHByKTsKKworCWN1cnJlbnQgPSBOVUxMOworCXJldCA9IHNpbXBsZV9jb250cm9sOworCisJLyogRXZhbHVhdGUgdGhlIGNvbmRpdGlvbmFsLiAgKi8KKwl2YWxfbWFyayA9IHZhbHVlX21hcmsgKCk7CisJdmFsID0gZXZhbHVhdGVfZXhwcmVzc2lvbiAoZXhwcik7CisKKwkvKiBDaG9vc2Ugd2hpY2ggYXJtIHRvIHRha2UgY29tbWFuZHMgZnJvbSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlCisJICAgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4gICovCisJaWYgKHZhbHVlX3RydWUgKHZhbCkpCisJICBjdXJyZW50ID0gKmNtZC0+Ym9keV9saXN0OworCWVsc2UgaWYgKGNtZC0+Ym9keV9jb3VudCA9PSAyKQorCSAgY3VycmVudCA9ICooY21kLT5ib2R5X2xpc3QgKyAxKTsKKwl2YWx1ZV9mcmVlX3RvX21hcmsgKHZhbF9tYXJrKTsKKworCS8qIEV4ZWN1dGUgY29tbWFuZHMgaW4gdGhlIGdpdmVuIGFybS4gICovCisJd2hpbGUgKGN1cnJlbnQpCisJICB7CisJICAgIHJldCA9IGV4ZWN1dGVfY29udHJvbF9jb21tYW5kIChjdXJyZW50KTsKKworCSAgICAvKiBJZiB3ZSBnb3QgYW4gZXJyb3IsIGdldCBvdXQuICAqLworCSAgICBpZiAocmV0ICE9IHNpbXBsZV9jb250cm9sKQorCSAgICAgIGJyZWFrOworCisJICAgIC8qIEdldCB0aGUgbmV4dCBzdGF0ZW1lbnQgaW4gdGhlIGJvZHkuICAqLworCSAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKKwkgIH0KKworCWJyZWFrOworICAgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHdhcm5pbmcgKCJJbnZhbGlkIGNvbnRyb2wgdHlwZSBpbiBjb21tYW5kIHN0cnVjdHVyZS4iKTsKKyAgICAgIHJldHVybiBpbnZhbGlkX2NvbnRyb2w7CisgICAgfQorCisgIGlmIChvbGRfY2hhaW4pCisgICAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyogIndoaWxlIiBjb21tYW5kIHN1cHBvcnQuICBFeGVjdXRlcyBhIGJvZHkgb2Ygc3RhdGVtZW50cyB3aGlsZSB0aGUKKyAgIGxvb3AgY29uZGl0aW9uIGlzIG5vbnplcm8uICAqLworCitzdGF0aWMgdm9pZAord2hpbGVfY29tbWFuZCAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCBjb21tYW5kX2xpbmUgKmNvbW1hbmQgPSBOVUxMOworCisgIGNvbnRyb2xfbGV2ZWwgPSAxOworICBjb21tYW5kID0gZ2V0X2NvbW1hbmRfbGluZSAod2hpbGVfY29udHJvbCwgYXJnKTsKKworICBpZiAoY29tbWFuZCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBleGVjdXRlX2NvbnRyb2xfY29tbWFuZCAoY29tbWFuZCk7CisgIGZyZWVfY29tbWFuZF9saW5lcyAoJmNvbW1hbmQpOworfQorCisvKiAiaWYiIGNvbW1hbmQgc3VwcG9ydC4gIEV4ZWN1dGUgZWl0aGVyIHRoZSB0cnVlIG9yIGZhbHNlIGFybSBkZXBlbmRpbmcKKyAgIG9uIHRoZSB2YWx1ZSBvZiB0aGUgaWYgY29uZGl0aW9uYWwuICAqLworCitzdGF0aWMgdm9pZAoraWZfY29tbWFuZCAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCBjb21tYW5kX2xpbmUgKmNvbW1hbmQgPSBOVUxMOworCisgIGNvbnRyb2xfbGV2ZWwgPSAxOworICBjb21tYW5kID0gZ2V0X2NvbW1hbmRfbGluZSAoaWZfY29udHJvbCwgYXJnKTsKKworICBpZiAoY29tbWFuZCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBleGVjdXRlX2NvbnRyb2xfY29tbWFuZCAoY29tbWFuZCk7CisgIGZyZWVfY29tbWFuZF9saW5lcyAoJmNvbW1hbmQpOworfQorCisvKiBDbGVhbnVwICovCitzdGF0aWMgdm9pZAorYXJnX2NsZWFudXAgKCkKK3sKKyAgc3RydWN0IHVzZXJfYXJncyAqb2FyZ3MgPSB1c2VyX2FyZ3M7CisgIGlmICghdXNlcl9hcmdzKQorICAgIGZhdGFsICgiSW50ZXJuYWwgZXJyb3IsIGFyZ19jbGVhbnVwIGNhbGxlZCB3aXRoIG5vIHVzZXIgYXJncy5cbiIpOworCisgIHVzZXJfYXJncyA9IHVzZXJfYXJncy0+bmV4dDsKKyAgZnJlZSAob2FyZ3MpOworfQorCisvKiBCaW5kIHRoZSBpbmNvbW1pbmcgYXJndW1lbnRzIGZvciBhIHVzZXIgZGVmaW5lZCBjb21tYW5kIHRvCisgICAkYXJnMCwgJGFyZzEgLi4uICRhcmdNQVhVU0VSQVJHUy4gICovCisKK3N0YXRpYyBzdHJ1Y3QgY2xlYW51cCAqCitzZXR1cF91c2VyX2FyZ3MgKHApCisgICAgIGNoYXIgKnA7Cit7CisgIHN0cnVjdCB1c2VyX2FyZ3MgKmFyZ3M7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisgIHVuc2lnbmVkIGludCBhcmdfY291bnQgPSAwOworCisgIGFyZ3MgPSAoc3RydWN0IHVzZXJfYXJncyAqKXhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHVzZXJfYXJncykpOworICBtZW1zZXQgKGFyZ3MsIDAsIHNpemVvZiAoc3RydWN0IHVzZXJfYXJncykpOworCisgIGFyZ3MtPm5leHQgPSB1c2VyX2FyZ3M7CisgIHVzZXJfYXJncyA9IGFyZ3M7CisKKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGFyZ19jbGVhbnVwLCAwKTsKKworICBpZiAocCA9PSBOVUxMKQorICAgIHJldHVybiBvbGRfY2hhaW47CisKKyAgd2hpbGUgKCpwKQorICAgIHsKKyAgICAgIGNoYXIgKnN0YXJ0X2FyZzsKKyAgICAgIGludCBzcXVvdGUgPSAwOworICAgICAgaW50IGRxdW90ZSA9IDA7CisgICAgICBpbnQgYnNxdW90ZSA9IDA7CisKKyAgICAgIGlmIChhcmdfY291bnQgPj0gTUFYVVNFUkFSR1MpCisJeworCSAgZXJyb3IgKCJ1c2VyIGRlZmluZWQgZnVuY3Rpb24gbWF5IG9ubHkgaGF2ZSAlZCBhcmd1bWVudHMuXG4iLAorCQkgTUFYVVNFUkFSR1MpOworCSAgcmV0dXJuIG9sZF9jaGFpbjsKKwl9CisKKyAgICAgIC8qIFN0cmlwIHdoaXRlc3BhY2UuICAqLworICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorCXArKzsKKworICAgICAgLyogUCBub3cgcG9pbnRzIHRvIGFuIGFyZ3VtZW50LiAgKi8KKyAgICAgIHN0YXJ0X2FyZyA9IHA7CisgICAgICB1c2VyX2FyZ3MtPmFbYXJnX2NvdW50XS5hcmcgPSBwOworCisgICAgICAvKiBHZXQgdG8gdGhlIGVuZCBvZiB0aGlzIGFyZ3VtZW50LiAgKi8KKyAgICAgIHdoaWxlICgqcCkKKwl7CisJICBpZiAoKCgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykpICYmICFzcXVvdGUgJiYgIWRxdW90ZSAmJiAhYnNxdW90ZSkKKwkgICAgYnJlYWs7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoYnNxdW90ZSkKKwkJYnNxdW90ZSA9IDA7CisJICAgICAgZWxzZSBpZiAoKnAgPT0gJ1xcJykKKwkJYnNxdW90ZSA9IDE7CisJICAgICAgZWxzZSBpZiAoc3F1b3RlKQorCQl7CisJCSAgaWYgKCpwID09ICdcJycpCisJCSAgICBzcXVvdGUgPSAwOworCQl9CisJICAgICAgZWxzZSBpZiAoZHF1b3RlKQorCQl7CisJCSAgaWYgKCpwID09ICciJykKKwkJICAgIGRxdW90ZSA9IDA7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBpZiAoKnAgPT0gJ1wnJykKKwkJICAgIHNxdW90ZSA9IDE7CisJCSAgZWxzZSBpZiAoKnAgPT0gJyInKQorCQkgICAgZHF1b3RlID0gMTsKKwkJfQorCSAgICAgIHArKzsKKwkgICAgfQorCX0KKworICAgICAgdXNlcl9hcmdzLT5hW2FyZ19jb3VudF0ubGVuID0gcCAtIHN0YXJ0X2FyZzsKKyAgICAgIGFyZ19jb3VudCsrOworICAgICAgdXNlcl9hcmdzLT5jb3VudCsrOworICAgIH0KKyAgcmV0dXJuIG9sZF9jaGFpbjsKK30KKworLyogR2l2ZW4gY2hhcmFjdGVyIHN0cmluZyBQLCByZXR1cm4gYSBwb2ludCB0byB0aGUgZmlyc3QgYXJndW1lbnQgKCRhcmcpLAorICAgb3IgTlVMTCBpZiBQIGNvbnRhaW5zIG5vIGFyZ3VtZW50cy4gICovCisKK3N0YXRpYyBjaGFyICoKK2xvY2F0ZV9hcmcgKHApCisgICAgIGNoYXIgKnA7Cit7CisgIHdoaWxlICgocCA9IHN0cmNociAocCwgJyQnKSkpCisgICAgeworICAgICAgaWYgKHN0cm5jbXAgKHAsICIkYXJnIiwgNCkgPT0gMCAmJiBpc2RpZ2l0IChwWzRdKSkKKwlyZXR1cm4gcDsKKyAgICAgIHArKzsKKyAgICB9CisgIHJldHVybiBOVUxMOworfQorCisvKiBJbnNlcnQgdGhlIHVzZXIgZGVmaW5lZCBhcmd1bWVudHMgc3RvcmVkIGluIHVzZXJfYXJnIGludG8gdGhlICRhcmcKKyAgIGFyZ3VtZW50cyBmb3VuZCBpbiBsaW5lLCB3aXRoIHRoZSB1cGRhdGVkIGNvcHkgYmVpbmcgcGxhY2VkIGludG8gbmxpbmUuICAqLworCitzdGF0aWMgY2hhciAqCitpbnNlcnRfYXJncyAobGluZSkKKyAgICAgY2hhciAqbGluZTsKK3sKKyAgY2hhciAqcCwgKnNhdmVfbGluZSwgKm5ld19saW5lOworICB1bnNpZ25lZCBsZW4sIGk7CisKKyAgLyogRmlyc3Qgd2UgbmVlZCB0byBrbm93IGhvdyBtdWNoIG1lbW9yeSB0byBhbGxvY2F0ZSBmb3IgdGhlIG5ldyBsaW5lLiAgKi8KKyAgc2F2ZV9saW5lID0gbGluZTsKKyAgbGVuID0gMDsKKyAgd2hpbGUgKChwID0gbG9jYXRlX2FyZyAobGluZSkpKQorICAgIHsKKyAgICAgIGxlbiArPSBwIC0gbGluZTsKKyAgICAgIGkgPSBwWzRdIC0gJzAnOworICAgICAgCisgICAgICBpZiAoaSA+PSB1c2VyX2FyZ3MtPmNvdW50KQorCXsKKwkgIGVycm9yICgiTWlzc2luZyBhcmd1bWVudCAlZCBpbiB1c2VyIGZ1bmN0aW9uLlxuIiwgaSk7CisJICByZXR1cm4gTlVMTDsKKwl9CisgICAgICBsZW4gKz0gdXNlcl9hcmdzLT5hW2ldLmxlbjsKKyAgICAgIGxpbmUgPSBwICsgNTsKKyAgICB9CisKKyAgLyogRG9uJ3QgZm9yZ2V0IHRoZSB0YWlsLiAgKi8KKyAgbGVuICs9IHN0cmxlbiAobGluZSk7CisKKyAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBuZXcgbGluZSBhbmQgZmlsbCBpdCBpbi4gICovCisgIG5ld19saW5lID0gKGNoYXIgKil4bWFsbG9jIChsZW4gKyAxKTsKKyAgaWYgKG5ld19saW5lID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogUmVzdG9yZSBwb2ludGVyIHRvIGJlZ2lubmluZyBvZiBvbGQgbGluZS4gICovCisgIGxpbmUgPSBzYXZlX2xpbmU7CisKKyAgLyogU2F2ZSBwb2ludGVyIHRvIGJlZ2lubmluZyBvZiBuZXcgbGluZS4gICovCisgIHNhdmVfbGluZSA9IG5ld19saW5lOworCisgIHdoaWxlICgocCA9IGxvY2F0ZV9hcmcgKGxpbmUpKSkKKyAgICB7CisgICAgICBpbnQgaSwgbGVuOworCisgICAgICBtZW1jcHkgKG5ld19saW5lLCBsaW5lLCBwIC0gbGluZSk7CisgICAgICBuZXdfbGluZSArPSBwIC0gbGluZTsKKyAgICAgIGkgPSBwWzRdIC0gJzAnOworCisgICAgICBsZW4gPSB1c2VyX2FyZ3MtPmFbaV0ubGVuOworICAgICAgaWYgKGxlbikKKwl7CisJICBtZW1jcHkgKG5ld19saW5lLCB1c2VyX2FyZ3MtPmFbaV0uYXJnLCBsZW4pOworCSAgbmV3X2xpbmUgKz0gbGVuOworCX0KKyAgICAgIGxpbmUgPSBwICsgNTsKKyAgICB9CisgIC8qIERvbid0IGZvcmdldCB0aGUgdGFpbC4gICovCisgIHN0cmNweSAobmV3X2xpbmUsIGxpbmUpOworCisgIC8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV3IGxpbmUuICAqLworICByZXR1cm4gc2F2ZV9saW5lOworfQorCit2b2lkCitleGVjdXRlX3VzZXJfY29tbWFuZCAoYywgYXJncykKKyAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7CisgICAgIGNoYXIgKmFyZ3M7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBjb21tYW5kX2xpbmUgKmNtZGxpbmVzOworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworICBlbnVtIGNvbW1hbmRfY29udHJvbF90eXBlIHJldDsKKworICBvbGRfY2hhaW4gPSBzZXR1cF91c2VyX2FyZ3MgKGFyZ3MpOworCisgIGNtZGxpbmVzID0gYy0+dXNlcl9jb21tYW5kczsKKyAgaWYgKGNtZGxpbmVzID09IDApCisgICAgLyogTnVsbCBjb21tYW5kICovCisgICAgcmV0dXJuOworCisgIC8qIFNldCB0aGUgaW5zdHJlYW0gdG8gMCwgaW5kaWNhdGluZyBleGVjdXRpb24gb2YgYQorICAgICB1c2VyLWRlZmluZWQgZnVuY3Rpb24uICAqLworICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgc291cmNlX2NsZWFudXAsIGluc3RyZWFtKTsKKyAgaW5zdHJlYW0gPSAoRklMRSAqKSAwOworICB3aGlsZSAoY21kbGluZXMpCisgICAgeworICAgICAgcmV0ID0gZXhlY3V0ZV9jb250cm9sX2NvbW1hbmQgKGNtZGxpbmVzKTsKKyAgICAgIGlmIChyZXQgIT0gc2ltcGxlX2NvbnRyb2wgJiYgcmV0ICE9IGJyZWFrX2NvbnRyb2wpCisJeworCSAgd2FybmluZyAoIkVycm9yIGluIGNvbnRyb2wgc3RydWN0dXJlLlxuIik7CisJICBicmVhazsKKwl9CisgICAgICBjbWRsaW5lcyA9IGNtZGxpbmVzLT5uZXh0OworICAgIH0KKyAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7Cit9CisKKy8qIEV4ZWN1dGUgdGhlIGxpbmUgUCBhcyBhIGNvbW1hbmQuCisgICBQYXNzIEZST01fVFRZIGFzIHNlY29uZCBhcmd1bWVudCB0byB0aGUgZGVmaW5pbmcgZnVuY3Rpb24uICAqLworCit2b2lkCitleGVjdXRlX2NvbW1hbmQgKHAsIGZyb21fdHR5KQorICAgICBjaGFyICpwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjOworICByZWdpc3RlciBlbnVtIGxhbmd1YWdlIGZsYW5nOworICBzdGF0aWMgaW50IHdhcm5lZCA9IDA7CisgIC8qIEZJWE1FOiBUaGVzZSBzaG91bGQgcmVhbGx5IGJlIGluIGFuIGFwcHJvcHJpYXRlIGhlYWRlciBmaWxlICovCisgIGV4dGVybiB2b2lkIHNlcmlhbF9sb2dfY29tbWFuZCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKKworICBmcmVlX2FsbF92YWx1ZXMgKCk7CisKKyAgLyogRm9yY2UgY2xlYW51cCBvZiBhbnkgYWxsb2NhIGFyZWFzIGlmIHVzaW5nIEMgYWxsb2NhIGluc3RlYWQgb2YKKyAgICAgYSBidWlsdGluIGFsbG9jYS4gICovCisgIGFsbG9jYSAoMCk7CisKKyAgLyogVGhpcyBjYW4gaGFwcGVuIHdoZW4gY29tbWFuZF9saW5lX2lucHV0IGhpdHMgZW5kIG9mIGZpbGUuICAqLworICBpZiAocCA9PSBOVUxMKQorICAgICAgcmV0dXJuOworCisgIHNlcmlhbF9sb2dfY29tbWFuZCAocCk7CisKKyAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKSBwKys7CisgIGlmICgqcCkKKyAgICB7CisgICAgICBjaGFyICphcmc7CisKKyAgICAgIGMgPSBsb29rdXBfY21kICgmcCwgY21kbGlzdCwgIiIsIDAsIDEpOworICAgICAgLyogUGFzcyBudWxsIGFyZyByYXRoZXIgdGhhbiBhbiBlbXB0eSBvbmUuICAqLworICAgICAgYXJnID0gKnAgPyBwIDogMDsKKworICAgICAgLyogQ2xlYXIgb2ZmIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGV4Y2VwdCBmb3Igc2V0IGFuZCBjb21wbGV0ZSBjb21tYW5kLiAgKi8KKyAgICAgIGlmIChhcmcgJiYgYy0+dHlwZSAhPSBzZXRfY21kICYmIGMtPmZ1bmN0aW9uLmNmdW5jICE9IGNvbXBsZXRlX2NvbW1hbmQpCisJeworCSAgcCA9IGFyZyArIHN0cmxlbiAoYXJnKSAtIDE7CisJICB3aGlsZSAocCA+PSBhcmcgJiYgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKSkKKwkgICAgcC0tOworCSAgKihwICsgMSkgPSAnXDAnOworCX0KKworICAgICAgLyogSWYgdGhpcyBjb21tYW5kIGhhcyBiZWVuIGhvb2tlZCwgcnVuIHRoZSBob29rIGZpcnN0LiAqLworICAgICAgaWYgKGMtPmhvb2spCisJZXhlY3V0ZV91c2VyX2NvbW1hbmQgKGMtPmhvb2ssIChjaGFyICopMCk7CisKKyAgICAgIGlmIChjLT5jbGFzcyA9PSBjbGFzc191c2VyKQorCWV4ZWN1dGVfdXNlcl9jb21tYW5kIChjLCBhcmcpOworICAgICAgZWxzZSBpZiAoYy0+dHlwZSA9PSBzZXRfY21kIHx8IGMtPnR5cGUgPT0gc2hvd19jbWQpCisJZG9fc2V0c2hvd19jb21tYW5kIChhcmcsIGZyb21fdHR5ICYgY2F1dGlvbiwgYyk7CisgICAgICBlbHNlIGlmIChjLT5mdW5jdGlvbi5jZnVuYyA9PSBOT19GVU5DVElPTikKKwllcnJvciAoIlRoYXQgaXMgbm90IGEgY29tbWFuZCwganVzdCBhIGhlbHAgdG9waWMuIik7CisgICAgICBlbHNlIGlmIChjYWxsX2NvbW1hbmRfaG9vaykKKwljYWxsX2NvbW1hbmRfaG9vayAoYywgYXJnLCBmcm9tX3R0eSAmIGNhdXRpb24pOworICAgICAgZWxzZQorCSgqYy0+ZnVuY3Rpb24uY2Z1bmMpIChhcmcsIGZyb21fdHR5ICYgY2F1dGlvbik7CisgICB9CisKKyAgLyogVGVsbCB0aGUgdXNlciBpZiB0aGUgbGFuZ3VhZ2UgaGFzIGNoYW5nZWQgKGV4Y2VwdCBmaXJzdCB0aW1lKS4gICovCisgIGlmIChjdXJyZW50X2xhbmd1YWdlICE9IGV4cGVjdGVkX2xhbmd1YWdlKQorICB7CisgICAgaWYgKGxhbmd1YWdlX21vZGUgPT0gbGFuZ3VhZ2VfbW9kZV9hdXRvKSB7CisgICAgICBsYW5ndWFnZV9pbmZvICgxKTsJLyogUHJpbnQgd2hhdCBjaGFuZ2VkLiAgKi8KKyAgICB9CisgICAgd2FybmVkID0gMDsKKyAgfQorCisgIC8qIFdhcm4gdGhlIHVzZXIgaWYgdGhlIHdvcmtpbmcgbGFuZ3VhZ2UgZG9lcyBub3QgbWF0Y2ggdGhlCisgICAgIGxhbmd1YWdlIG9mIHRoZSBjdXJyZW50IGZyYW1lLiAgT25seSB3YXJuIHRoZSB1c2VyIGlmIHdlIGFyZQorICAgICBhY3R1YWxseSBydW5uaW5nIHRoZSBwcm9ncmFtLCBpLmUuIHRoZXJlIGlzIGEgc3RhY2suICovCisgIC8qIEZJWE1FOiAgVGhpcyBzaG91bGQgYmUgY2FjaGVpbmcgdGhlIGZyYW1lIGFuZCBvbmx5IHJ1bm5pbmcgd2hlbgorICAgICB0aGUgZnJhbWUgY2hhbmdlcy4gICovCisKKyAgaWYgKHRhcmdldF9oYXNfc3RhY2spCisgICAgeworICAgICAgZmxhbmcgPSBnZXRfZnJhbWVfbGFuZ3VhZ2UgKCk7CisgICAgICBpZiAoIXdhcm5lZAorCSAgJiYgZmxhbmcgIT0gbGFuZ3VhZ2VfdW5rbm93bgorCSAgJiYgZmxhbmcgIT0gY3VycmVudF9sYW5ndWFnZS0+bGFfbGFuZ3VhZ2UpCisJeworCSAgcHJpbnRmX2ZpbHRlcmVkICgiJXNcbiIsIGxhbmdfZnJhbWVfbWlzbWF0Y2hfd2Fybik7CisJICB3YXJuZWQgPSAxOworCX0KKyAgICB9Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorY29tbWFuZF9sb29wX21hcmtlciAoZm9vKQorICAgICBpbnQgZm9vOworeworfQorCisvKiBSZWFkIGNvbW1hbmRzIGZyb20gYGluc3RyZWFtJyBhbmQgZXhlY3V0ZSB0aGVtCisgICB1bnRpbCBlbmQgb2YgZmlsZSBvciBlcnJvciByZWFkaW5nIGluc3RyZWFtLiAgKi8KKwordm9pZAorY29tbWFuZF9sb29wICgpCit7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47CisgIGNoYXIgKmNvbW1hbmQ7CisgIGludCBzdGRpbl9pc190dHkgPSBJU0FUVFkgKHN0ZGluKTsKKyAgbG9uZyB0aW1lX2F0X2NtZF9zdGFydDsKKyNpZmRlZiBIQVZFX1NCUksKKyAgbG9uZyBzcGFjZV9hdF9jbWRfc3RhcnQgPSAwOworI2VuZGlmCisgIGV4dGVybiBpbnQgZGlzcGxheV90aW1lOworICBleHRlcm4gaW50IGRpc3BsYXlfc3BhY2U7CisKKyAgd2hpbGUgKGluc3RyZWFtICYmICFmZW9mIChpbnN0cmVhbSkpCisgICAgeworI2lmIGRlZmluZWQoVFVJKQorICAgICAgZXh0ZXJuIGludCBpbnNlcnRfbW9kZTsKKyNlbmRpZgorICAgICAgaWYgKHdpbmRvd19ob29rICYmIGluc3RyZWFtID09IHN0ZGluKQorCSgqd2luZG93X2hvb2spIChpbnN0cmVhbSwgcHJvbXB0KTsKKworICAgICAgcXVpdF9mbGFnID0gMDsKKyAgICAgIGlmIChpbnN0cmVhbSA9PSBzdGRpbiAmJiBzdGRpbl9pc190dHkpCisJcmVpbml0aWFsaXplX21vcmVfZmlsdGVyICgpOworICAgICAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGNvbW1hbmRfbG9vcF9tYXJrZXIsIDApOworCisjaWYgZGVmaW5lZChUVUkpCisgICAgICAvKiBBIGJpdCBvZiBwYXJhbm9pYTogSSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgImluc2VydF9tb2RlIiBnbG9iYWwKKyAgICAgICAqIGlzIGNsZWFyIGV4Y2VwdCB3aGVuIGl0IGlzIGJlaW5nIHVzZWQgZm9yIGNvbW1hbmQtbGluZSBlZGl0aW5nCisgICAgICAgKiAoc2VlIHR1aUlPLmMsIHV0aWxzLmMpOyBvdGhlcndpc2Ugbm9ybWFsIG91dHB1dCB3aWxsCisgICAgICAgKiBnZXQgbWVzc2VkIHVwIGluIHRoZSBUVUkuIFNvIGNsZWFyIGl0IGJlZm9yZS9hZnRlcgorICAgICAgICogdGhlIGNvbW1hbmQtbGluZS1pbnB1dCBjYWxsLiAtIFJUCisgICAgICAgKi8KKyAgICAgIGluc2VydF9tb2RlID0gMDsKKyNlbmRpZgorICAgICAgLyogR2V0IGEgY29tbWFuZC1saW5lLiBUaGlzIGNhbGxzIHRoZSByZWFkbGluZSBwYWNrYWdlLiAqLworICAgICAgY29tbWFuZCA9IGNvbW1hbmRfbGluZV9pbnB1dCAoaW5zdHJlYW0gPT0gc3RkaW4gPyBwcm9tcHQgOiAoY2hhciAqKSBOVUxMLAorCQkJCSAgICBpbnN0cmVhbSA9PSBzdGRpbiwgInByb21wdCIpOworI2lmIGRlZmluZWQoVFVJKQorICAgICAgaW5zZXJ0X21vZGUgPSAwOworI2VuZGlmCisgICAgICBpZiAoY29tbWFuZCA9PSAwKQorCXJldHVybjsKKworICAgICAgdGltZV9hdF9jbWRfc3RhcnQgPSBnZXRfcnVuX3RpbWUgKCk7CisKKyAgICAgIGlmIChkaXNwbGF5X3NwYWNlKQorCXsKKyNpZmRlZiBIQVZFX1NCUksKKwkgIGV4dGVybiBjaGFyICoqZW52aXJvbjsKKwkgIGNoYXIgKmxpbSA9IChjaGFyICopIHNicmsgKDApOworCisJICBzcGFjZV9hdF9jbWRfc3RhcnQgPSAobG9uZykgKGxpbSAtIChjaGFyICopICZlbnZpcm9uKTsKKyNlbmRpZgorCX0KKworICAgICAgZXhlY3V0ZV9jb21tYW5kIChjb21tYW5kLCBpbnN0cmVhbSA9PSBzdGRpbik7CisgICAgICAvKiBEbyBhbnkgY29tbWFuZHMgYXR0YWNoZWQgdG8gYnJlYWtwb2ludCB3ZSBzdG9wcGVkIGF0LiAgKi8KKyAgICAgIGJwc3RhdF9kb19hY3Rpb25zICgmc3RvcF9icHN0YXQpOworICAgICAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisKKyAgICAgIGlmIChkaXNwbGF5X3RpbWUpCisJeworCSAgbG9uZyBjbWRfdGltZSA9IGdldF9ydW5fdGltZSAoKSAtIHRpbWVfYXRfY21kX3N0YXJ0OworCisJICBwcmludGZfdW5maWx0ZXJlZCAoIkNvbW1hbmQgZXhlY3V0aW9uIHRpbWU6ICVsZC4lMDZsZFxuIiwKKwkJCSAgICAgY21kX3RpbWUgLyAxMDAwMDAwLCBjbWRfdGltZSAlIDEwMDAwMDApOworCX0KKworICAgICAgaWYgKGRpc3BsYXlfc3BhY2UpCisJeworI2lmZGVmIEhBVkVfU0JSSworCSAgZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworCSAgY2hhciAqbGltID0gKGNoYXIgKikgc2JyayAoMCk7CisJICBsb25nIHNwYWNlX25vdyA9IGxpbSAtIChjaGFyICopICZlbnZpcm9uOworCSAgbG9uZyBzcGFjZV9kaWZmID0gc3BhY2Vfbm93IC0gc3BhY2VfYXRfY21kX3N0YXJ0OworCisJICBwcmludGZfdW5maWx0ZXJlZCAoIlNwYWNlIHVzZWQ6ICVsZCAoJWMlbGQgZm9yIHRoaXMgY29tbWFuZClcbiIsCisJCQkgICAgIHNwYWNlX25vdywKKwkJCSAgICAgKHNwYWNlX2RpZmYgPj0gMCA/ICcrJyA6ICctJyksCisJCQkgICAgIHNwYWNlX2RpZmYpOworI2VuZGlmCisJfQorICAgIH0KK30KKwwKKy8qIENvbW1hbmRzIGNhbGwgdGhpcyBpZiB0aGV5IGRvIG5vdCB3YW50IHRvIGJlIHJlcGVhdGVkIGJ5IG51bGwgbGluZXMuICAqLworCit2b2lkCitkb250X3JlcGVhdCAoKQoreworICBpZiAoc2VydmVyX2NvbW1hbmQpCisgICAgcmV0dXJuOworCisgIC8qIElmIHdlIGFyZW4ndCByZWFkaW5nIGZyb20gc3RhbmRhcmQgaW5wdXQsIHdlIGFyZSBzYXZpbmcgdGhlIGxhc3QKKyAgICAgdGhpbmcgcmVhZCBmcm9tIHN0ZGluIGluIGxpbmUgYW5kIGRvbid0IHdhbnQgdG8gZGVsZXRlIGl0LiAgTnVsbCBsaW5lcworICAgICB3b24ndCByZXBlYXQgaGVyZSBpbiBhbnkgY2FzZS4gICovCisgIGlmIChpbnN0cmVhbSA9PSBzdGRpbikKKyAgICAqbGluZSA9IDA7Cit9CisMCisvKiBSZWFkIGEgbGluZSBmcm9tIHRoZSBzdHJlYW0gImluc3RyZWFtIiB3aXRob3V0IGNvbW1hbmQgbGluZSBlZGl0aW5nLgorCisgICBJdCBwcmludHMgUFJST01QVCBvbmNlIGF0IHRoZSBzdGFydC4KKyAgIEFjdGlvbiBpcyBjb21wYXRpYmxlIHdpdGggInJlYWRsaW5lIiwgZS5nLiBzcGFjZSBmb3IgdGhlIHJlc3VsdCBpcworICAgbWFsbG9jJ2QgYW5kIHNob3VsZCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorCisgICBBIE5VTEwgcmV0dXJuIG1lYW5zIGVuZCBvZiBmaWxlLiAgKi8KK2NoYXIgKgorZ2RiX3JlYWRsaW5lIChwcnJvbXB0KQorICAgICBjaGFyICpwcnJvbXB0OworeworICBpbnQgYzsKKyAgY2hhciAqcmVzdWx0OworICBpbnQgaW5wdXRfaW5kZXggPSAwOworICBpbnQgcmVzdWx0X3NpemUgPSA4MDsKKworICBpZiAocHJyb21wdCkKKyAgICB7CisgICAgICAvKiBEb24ndCB1c2UgYSBfZmlsdGVyZWQgZnVuY3Rpb24gaGVyZS4gIEl0IGNhdXNlcyB0aGUgYXNzdW1lZAorCSBjaGFyYWN0ZXIgcG9zaXRpb24gdG8gYmUgb2ZmLCBzaW5jZSB0aGUgbmV3bGluZSB3ZSByZWFkIGZyb20KKwkgdGhlIHVzZXIgaXMgbm90IGFjY291bnRlZCBmb3IuICAqLworICAgICAgZnB1dHNfdW5maWx0ZXJlZCAocHJyb21wdCwgZ2RiX3N0ZG91dCk7CisjaWZkZWYgTVBXCisgICAgICAvKiBNb3ZlIHRvIGEgbmV3IGxpbmUgc28gdGhlIGVudGVyZWQgbGluZSBkb2Vzbid0IGhhdmUgYSBwcm9tcHQKKwkgb24gdGhlIGZyb250IG9mIGl0LiAqLworICAgICAgZnB1dHNfdW5maWx0ZXJlZCAoIlxuIiwgZ2RiX3N0ZG91dCk7CisjZW5kaWYgLyogTVBXICovCisgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworICAgIH0KKworICByZXN1bHQgPSAoY2hhciAqKSB4bWFsbG9jIChyZXN1bHRfc2l6ZSk7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgLyogUmVhZCBmcm9tIHN0ZGluIGlmIHdlIGFyZSBleGVjdXRpbmcgYSB1c2VyIGRlZmluZWQgY29tbWFuZC4KKwkgVGhpcyBpcyB0aGUgcmlnaHQgdGhpbmcgZm9yIHByb21wdF9mb3JfY29udGludWUsIGF0IGxlYXN0LiAgKi8KKyAgICAgIGMgPSBmZ2V0YyAoaW5zdHJlYW0gPyBpbnN0cmVhbSA6IHN0ZGluKTsKKworICAgICAgaWYgKGMgPT0gRU9GKQorCXsKKwkgIGlmIChpbnB1dF9pbmRleCA+IDApCisJICAgIC8qIFRoZSBsYXN0IGxpbmUgZG9lcyBub3QgZW5kIHdpdGggYSBuZXdsaW5lLiAgUmV0dXJuIGl0LCBhbmQKKwkgICAgICAgaWYgd2UgYXJlIGNhbGxlZCBhZ2FpbiBmZ2V0YyB3aWxsIHN0aWxsIHJldHVybiBFT0YgYW5kCisJICAgICAgIHdlJ2xsIHJldHVybiBOVUxMIHRoZW4uICAqLworCSAgICBicmVhazsKKwkgIGZyZWUgKHJlc3VsdCk7CisJICByZXR1cm4gTlVMTDsKKwl9CisKKyAgICAgIGlmIChjID09ICdcbicpCisjaWZuZGVmIENSTEZfU09VUkNFX0ZJTEVTCisJYnJlYWs7CisjZWxzZQorCXsKKwkgIGlmIChpbnB1dF9pbmRleCA+IDAgJiYgcmVzdWx0W2lucHV0X2luZGV4IC0gMV0gPT0gJ1xyJykKKwkgICAgaW5wdXRfaW5kZXgtLTsKKwkgIGJyZWFrOworCX0KKyNlbmRpZgorCisgICAgICByZXN1bHRbaW5wdXRfaW5kZXgrK10gPSBjOworICAgICAgd2hpbGUgKGlucHV0X2luZGV4ID49IHJlc3VsdF9zaXplKQorCXsKKwkgIHJlc3VsdF9zaXplICo9IDI7CisJICByZXN1bHQgPSAoY2hhciAqKSB4cmVhbGxvYyAocmVzdWx0LCByZXN1bHRfc2l6ZSk7CisJfQorICAgIH0KKworICByZXN1bHRbaW5wdXRfaW5kZXgrK10gPSAnXDAnOworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBWYXJpYWJsZXMgd2hpY2ggY29udHJvbCBjb21tYW5kIGxpbmUgZWRpdGluZyBhbmQgaGlzdG9yeQorICAgc3Vic3RpdHV0aW9uLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBnaXZlbiBkZWZhdWx0IHZhbHVlcyBhdCB0aGUgZW5kCisgICBvZiB0aGlzIGZpbGUuICAqLworc3RhdGljIGludCBjb21tYW5kX2VkaXRpbmdfcDsKK3N0YXRpYyBpbnQgaGlzdG9yeV9leHBhbnNpb25fcDsKK3N0YXRpYyBpbnQgd3JpdGVfaGlzdG9yeV9wOworc3RhdGljIGludCBoaXN0b3J5X3NpemU7CitzdGF0aWMgY2hhciAqaGlzdG9yeV9maWxlbmFtZTsKKworLyogcmVhZGxpbmUgdXNlcyB0aGUgd29yZCBicmVha3MgZm9yIHR3byB0aGluZ3M6CisgICAoMSkgSW4gZmlndXJpbmcgb3V0IHdoZXJlIHRvIHBvaW50IHRoZSBURVhUIHBhcmFtZXRlciB0byB0aGUKKyAgIHJsX2NvbXBsZXRpb25fZW50cnlfZnVuY3Rpb24uICBTaW5jZSB3ZSBkb24ndCB1c2UgVEVYVCBmb3IgbXVjaCwKKyAgIGl0IGRvZXNuJ3QgbWF0dGVyIGEgbG90IHdoYXQgdGhlIHdvcmQgYnJlYWtzIGFyZSBmb3IgdGhpcyBwdXJwb3NlLCBidXQKKyAgIGl0IGRvZXMgYWZmZWN0IGhvdyBtdWNoIHN0dWZmIE0tPyBsaXN0cy4KKyAgICgyKSBJZiBvbmUgb2YgdGhlIG1hdGNoZXMgY29udGFpbnMgYSB3b3JkIGJyZWFrIGNoYXJhY3RlciwgcmVhZGxpbmUKKyAgIHdpbGwgcXVvdGUgaXQuICBUaGF0J3Mgd2h5IHdlIHN3aXRjaCBiZXR3ZWVuCisgICBnZGJfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycyBhbmQKKyAgIGdkYl9jb21wbGV0ZXJfY29tbWFuZF93b3JkX2JyZWFrX2NoYXJhY3RlcnMuICBJJ20gbm90IHN1cmUgd2hlbgorICAgd2UgbmVlZCB0aGlzIGJlaGF2aW9yIChwZXJoYXBzIGZvciBmdW5reSBjaGFyYWN0ZXJzIGluIEMrKyBzeW1ib2xzPykuICAqLworCisvKiBWYXJpYWJsZXMgd2hpY2ggYXJlIG5lY2Vzc2FyeSBmb3IgZmFuY3kgY29tbWFuZCBsaW5lIGVkaXRpbmcuICAqLworY2hhciAqZ2RiX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMgPQorICAiIFx0XG4hQCMkJV4mKigpKz18fmB9e1tdXCInOzo/Lz4uPCwtIjsKKworLyogV2hlbiBjb21wbGV0aW5nIG9uIGNvbW1hbmQgbmFtZXMsIHdlIHJlbW92ZSAnLScgZnJvbSB0aGUgbGlzdCBvZgorICAgd29yZCBicmVhayBjaGFyYWN0ZXJzLCBzaW5jZSB3ZSB1c2UgaXQgaW4gY29tbWFuZCBuYW1lcy4gIElmIHRoZQorICAgcmVhZGxpbmUgbGlicmFyeSBzZWVzIG9uZSBpbiBhbnkgb2YgdGhlIGN1cnJlbnQgY29tcGxldGlvbiBzdHJpbmdzLAorICAgaXQgdGhpbmtzIHRoYXQgdGhlIHN0cmluZyBuZWVkcyB0byBiZSBxdW90ZWQgYW5kIGF1dG9tYXRpY2FsbHkgc3VwcGxpZXMKKyAgIGEgbGVhZGluZyBxdW90ZS4gKi8KK2NoYXIgKmdkYl9jb21wbGV0ZXJfY29tbWFuZF93b3JkX2JyZWFrX2NoYXJhY3RlcnMgPQorICAiIFx0XG4hQCMkJV4mKigpKz18fmB9e1tdXCInOzo/Lz4uPCwiOworCisvKiBDaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gcXVvdGUgY29tcGxldGlvbiBzdHJpbmdzLiAgTm90ZSB0aGF0IHdlCisgICBjYW4ndCBpbmNsdWRlICciJyBiZWNhdXNlIHRoZSBnZGIgQyBwYXJzZXIgdHJlYXRzIHN1Y2ggcXVvdGVkIHNlcXVlbmNlcworICAgYXMgc3RyaW5ncy4gKi8KK2NoYXIgKmdkYl9jb21wbGV0ZXJfcXVvdGVfY2hhcmFjdGVycyA9CisgICInIjsKKworLyogRnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgZmFuY3kgY29tbWFuZCBsaW5lIGVkaXRpbmcuICAqLworCisvKiBUaGlzIGNhbiBiZSB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZG9uJ3Qgd2FudCB0byBjb21wbGV0ZSBvbiBzeW1ib2xzCisgICBidXQgZG9uJ3Qgd2FudCB0byBjb21wbGV0ZSBvbiBhbnl0aGluZyBlbHNlIGVpdGhlci4gICovCisvKiBBUkdTVVNFRCAqLworY2hhciAqKgorbm9vcF9jb21wbGV0ZXIgKHRleHQsIHByZWZpeCkKKyAgICAgY2hhciAqdGV4dDsKKyAgICAgY2hhciAqcHJlZml4OworeworICByZXR1cm4gTlVMTDsKK30KKworLyogQ29tcGxldGUgb24gZmlsZW5hbWVzLiAgKi8KK2NoYXIgKioKK2ZpbGVuYW1lX2NvbXBsZXRlciAodGV4dCwgd29yZCkKKyAgICAgY2hhciAqdGV4dDsKKyAgICAgY2hhciAqd29yZDsKK3sKKyAgLyogRnJvbSByZWFkbGluZS4gICovCisgIGV4dGVybiBjaGFyICpmaWxlbmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisgIGludCBzdWJzZXF1ZW50X25hbWU7CisgIGNoYXIgKipyZXR1cm5fdmFsOworICBpbnQgcmV0dXJuX3ZhbF91c2VkOworICBpbnQgcmV0dXJuX3ZhbF9hbGxvY2VkOworCisgIHJldHVybl92YWxfdXNlZCA9IDA7CisgIC8qIFNtYWxsIGZvciB0ZXN0aW5nLiAgKi8KKyAgcmV0dXJuX3ZhbF9hbGxvY2VkID0gMTsKKyAgcmV0dXJuX3ZhbCA9IChjaGFyICoqKSB4bWFsbG9jIChyZXR1cm5fdmFsX2FsbG9jZWQgKiBzaXplb2YgKGNoYXIgKikpOworCisgIHN1YnNlcXVlbnRfbmFtZSA9IDA7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGNoYXIgKnA7CisgICAgICBwID0gZmlsZW5hbWVfY29tcGxldGlvbl9mdW5jdGlvbiAodGV4dCwgc3Vic2VxdWVudF9uYW1lKTsKKyAgICAgIGlmIChyZXR1cm5fdmFsX3VzZWQgPj0gcmV0dXJuX3ZhbF9hbGxvY2VkKQorCXsKKwkgIHJldHVybl92YWxfYWxsb2NlZCAqPSAyOworCSAgcmV0dXJuX3ZhbCA9CisJICAgIChjaGFyICoqKSB4cmVhbGxvYyAocmV0dXJuX3ZhbCwKKwkJCQlyZXR1cm5fdmFsX2FsbG9jZWQgKiBzaXplb2YgKGNoYXIgKikpOworCX0KKyAgICAgIGlmIChwID09IE5VTEwpCisJeworCSAgcmV0dXJuX3ZhbFtyZXR1cm5fdmFsX3VzZWQrK10gPSBwOworCSAgYnJlYWs7CisJfQorICAgICAgLyogTGlrZSBlbWFjcywgZG9uJ3QgY29tcGxldGUgb24gb2xkIHZlcnNpb25zLiAgRXNwZWNpYWxseSB1c2VmdWwKKwkgaW4gdGhlICJzb3VyY2UiIGNvbW1hbmQuICAqLworICAgICAgaWYgKHBbc3RybGVuIChwKSAtIDFdID09ICd+JykKKwljb250aW51ZTsKKworICAgICAgeworCWNoYXIgKnE7CisJaWYgKHdvcmQgPT0gdGV4dCkKKwkgIC8qIFJldHVybiBleGFjdGx5IHAuICAqLworCSAgcmV0dXJuX3ZhbFtyZXR1cm5fdmFsX3VzZWQrK10gPSBwOworCWVsc2UgaWYgKHdvcmQgPiB0ZXh0KQorCSAgeworCSAgICAvKiBSZXR1cm4gc29tZSBwb3J0aW9uIG9mIHAuICAqLworCSAgICBxID0geG1hbGxvYyAoc3RybGVuIChwKSArIDUpOworCSAgICBzdHJjcHkgKHEsIHAgKyAod29yZCAtIHRleHQpKTsKKwkgICAgcmV0dXJuX3ZhbFtyZXR1cm5fdmFsX3VzZWQrK10gPSBxOworCSAgICBmcmVlIChwKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIC8qIFJldHVybiBzb21lIG9mIFRFWFQgcGx1cyBwLiAgKi8KKwkgICAgcSA9IHhtYWxsb2MgKHN0cmxlbiAocCkgKyAodGV4dCAtIHdvcmQpICsgNSk7CisJICAgIHN0cm5jcHkgKHEsIHdvcmQsIHRleHQgLSB3b3JkKTsKKwkgICAgcVt0ZXh0IC0gd29yZF0gPSAnXDAnOworCSAgICBzdHJjYXQgKHEsIHApOworCSAgICByZXR1cm5fdmFsW3JldHVybl92YWxfdXNlZCsrXSA9IHE7CisJICAgIGZyZWUgKHApOworCSAgfQorICAgICAgfQorICAgICAgc3Vic2VxdWVudF9uYW1lID0gMTsKKyAgICB9CisjaWYgMAorICAvKiBUaGVyZSBpcyBubyB3YXkgdG8gZG8gdGhpcyBqdXN0IGxvbmcgZW5vdWdoIHRvIGFmZmVjdCBxdW90ZSBpbnNlcnRpbmcKKyAgICAgd2l0aG91dCBhbHNvIGFmZmVjdGluZyB0aGUgbmV4dCBjb21wbGV0aW9uLiAgVGhpcyBzaG91bGQgYmUgZml4ZWQgaW4KKyAgICAgcmVhZGxpbmUuICBGSVhNRS4gICovCisgIC8qIEluc3VyZSB0aGF0IHJlYWRsaW5lIGRvZXMgdGhlIHJpZ2h0IHRoaW5nCisgICAgIHdpdGggcmVzcGVjdCB0byBpbnNlcnRpbmcgcXVvdGVzLiAgKi8KKyAgcmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycyA9ICIiOworI2VuZGlmCisgIHJldHVybiByZXR1cm5fdmFsOworfQorCisvKiBIZXJlIGFyZSBzb21lIHVzZWZ1bCB0ZXN0IGNhc2VzIGZvciBjb21wbGV0aW9uLiAgRklYTUU6IFRoZXNlIHNob3VsZAorICAgYmUgcHV0IGluIHRoZSB0ZXN0IHN1aXRlLiAgVGhleSBzaG91bGQgYmUgdGVzdGVkIHdpdGggYm90aCBNLT8gYW5kIFRBQi4KKworICAgInNob3cgb3V0cHV0LSIgInJhZGl4IgorICAgInNob3cgb3V0cHV0IiAiLXJhZGl4IgorICAgInAiIGFtYmlndW91cyAoY29tbWFuZHMgc3RhcnRpbmcgd2l0aCBwLS1wYXRoLCBwcmludCwgcHJpbnRmLCBldGMuKQorICAgInAgIiAgYW1iaWd1b3VzIChhbGwgc3ltYm9scykKKyAgICJpbmZvIHQgZm9vIiBubyBjb21wbGV0aW9ucworICAgImluZm8gdCAiIG5vIGNvbXBsZXRpb25zCisgICAiaW5mbyB0IiBhbWJpZ3VvdXMgKCJpbmZvIHRhcmdldCIsICJpbmZvIHRlcm1pbmFsIiwgZXRjLikKKyAgICJpbmZvIGFqa3NkbGZrIiBubyBjb21wbGV0aW9ucworICAgImluZm8gYWprc2RsZmsgIiBubyBjb21wbGV0aW9ucworICAgImluZm8iICIgIgorICAgImluZm8gIiBhbWJpZ3VvdXMgKGFsbCBpbmZvIGNvbW1hbmRzKQorICAgInAgXCJhIiBubyBjb21wbGV0aW9ucyAoc3RyaW5nIGNvbnN0YW50KQorICAgInAgJ2EiIGFtYmlndW91cyAoYWxsIHN5bWJvbHMgc3RhcnRpbmcgd2l0aCBhKQorICAgInAgYi1hIiBhbWJpZ3VvdXMgKGFsbCBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggYSkKKyAgICJwIGItIiBhbWJpZ3VvdXMgKGFsbCBzeW1ib2xzKQorICAgImZpbGUgTWFrZSIgImZpbGUiICh3b3JkIGJyZWFrIGhhcmQgdG8gc2NyZXcgdXAgaGVyZSkKKyAgICJmaWxlIC4uL2dkYi5zdGFicy93ZSIgImlyZCIgKG5lZWRzIHRvIG5vdCBicmVhayB3b3JkIGF0IHNsYXNoKQorICAgKi8KKworLyogR2VuZXJhdGUgY29tcGxldGlvbnMgb25lIGJ5IG9uZSBmb3IgdGhlIGNvbXBsZXRlci4gIEVhY2ggdGltZSB3ZSBhcmUKKyAgIGNhbGxlZCByZXR1cm4gYW5vdGhlciBwb3RlbnRpYWwgY29tcGxldGlvbiB0byB0aGUgY2FsbGVyLgorICAgbGluZV9jb21wbGV0aW9uIGp1c3QgY29tcGxldGVzIG9uIGNvbW1hbmRzIG9yIHBhc3NlcyB0aGUgYnVjayB0byB0aGUKKyAgIGNvbW1hbmQncyBjb21wbGV0ZXIgZnVuY3Rpb24sIHRoZSBzdHVmZiBzcGVjaWZpYyB0byBzeW1ib2wgY29tcGxldGlvbgorICAgaXMgaW4gbWFrZV9zeW1ib2xfY29tcGxldGlvbl9saXN0LgorCisgICBURVhUIGlzIHRoZSBjYWxsZXIncyBpZGVhIG9mIHRoZSAid29yZCIgd2UgYXJlIGxvb2tpbmcgYXQuCisKKyAgIE1BVENIRVMgaXMgdGhlIG51bWJlciBvZiBtYXRjaGVzIHRoYXQgaGF2ZSBjdXJyZW50bHkgYmVlbiBjb2xsZWN0ZWQgZnJvbQorICAgY2FsbGluZyB0aGlzIGNvbXBsZXRpb24gZnVuY3Rpb24uICBXaGVuIHplcm8sIHRoZW4gd2UgbmVlZCB0byBpbml0aWFsaXplLAorICAgb3RoZXJ3aXNlIHRoZSBpbml0aWFsaXphdGlvbiBoYXMgYWxyZWFkeSB0YWtlbiBwbGFjZSBhbmQgd2UgY2FuIGp1c3QKKyAgIHJldHVybiB0aGUgbmV4dCBwb3RlbnRpYWwgY29tcGxldGlvbiBzdHJpbmcuCisKKyAgIExJTkVfQlVGRkVSIGlzIGF2YWlsYWJsZSB0byBiZSBsb29rZWQgYXQ7IGl0IGNvbnRhaW5zIHRoZSBlbnRpcmUgdGV4dAorICAgb2YgdGhlIGxpbmUuICBQT0lOVCBpcyB0aGUgb2Zmc2V0IGluIHRoYXQgbGluZSBvZiB0aGUgY3Vyc29yLiAgWW91CisgICBzaG91bGQgcHJldGVuZCB0aGF0IHRoZSBsaW5lIGVuZHMgYXQgUE9JTlQuCisKKyAgIFJldHVybnMgTlVMTCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBjb21wbGV0aW9ucywgZWxzZSBhIHBvaW50ZXIgdG8gYSBzdHJpbmcKKyAgIHdoaWNoIGlzIGEgcG9zc2libGUgY29tcGxldGlvbiwgaXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvCisgICBmcmVlIHRoZSBzdHJpbmcuICAqLworCitzdGF0aWMgY2hhciAqCitsaW5lX2NvbXBsZXRpb25fZnVuY3Rpb24gKHRleHQsIG1hdGNoZXMsIGxpbmVfYnVmZmVyLCBwb2ludCkKKyAgICAgY2hhciAqdGV4dDsKKyAgICAgaW50IG1hdGNoZXM7CisgICAgIGNoYXIgKmxpbmVfYnVmZmVyOworICAgICBpbnQgcG9pbnQ7Cit7CisgIHN0YXRpYyBjaGFyICoqbGlzdCA9IChjaGFyICoqKU5VTEw7CQkvKiBDYWNoZSBvZiBjb21wbGV0aW9ucyAqLworICBzdGF0aWMgaW50IGluZGV4OwkJCQkvKiBOZXh0IGNhY2hlZCBjb21wbGV0aW9uICovCisgIGNoYXIgKm91dHB1dCA9IE5VTEw7CisgIGNoYXIgKnRtcF9jb21tYW5kLCAqcDsKKyAgLyogUG9pbnRlciB3aXRoaW4gdG1wX2NvbW1hbmQgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGV4dC4gICovCisgIGNoYXIgKndvcmQ7CisgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjLCAqcmVzdWx0X2xpc3Q7CisKKyAgaWYgKG1hdGNoZXMgPT0gMCkKKyAgICB7CisgICAgICAvKiBUaGUgY2FsbGVyIGlzIGJlZ2lubmluZyB0byBhY2N1bXVsYXRlIGEgbmV3IHNldCBvZiBjb21wbGV0aW9ucywgc28KKwkgd2UgbmVlZCB0byBmaW5kIGFsbCBvZiB0aGVtIG5vdywgYW5kIGNhY2hlIHRoZW0gZm9yIHJldHVybmluZyBvbmUgYXQKKwkgYSB0aW1lIG9uIGZ1dHVyZSBjYWxscy4gKi8KKworICAgICAgaWYgKGxpc3QpCisJeworCSAgLyogRnJlZSB0aGUgc3RvcmFnZSB1c2VkIGJ5IExJU1QsIGJ1dCBub3QgYnkgdGhlIHN0cmluZ3MgaW5zaWRlLgorCSAgICAgVGhpcyBpcyBiZWNhdXNlIHJsX2NvbXBsZXRlX2ludGVybmFsICgpIGZyZWVzIHRoZSBzdHJpbmdzLiAqLworCSAgZnJlZSAoKFBUUilsaXN0KTsKKwl9CisgICAgICBsaXN0ID0gMDsKKyAgICAgIGluZGV4ID0gMDsKKworICAgICAgLyogQ2hvb3NlIHRoZSBkZWZhdWx0IHNldCBvZiB3b3JkIGJyZWFrIGNoYXJhY3RlcnMgdG8gYnJlYWsgY29tcGxldGlvbnMuCisJIElmIHdlIGxhdGVyIGZpbmQgb3V0IHRoYXQgd2UgYXJlIGRvaW5nIGNvbXBsZXRpb25zIG9uIGNvbW1hbmQgc3RyaW5ncworCSAoYXMgb3Bwb3NlZCB0byBzdHJpbmdzIHN1cHBsaWVkIGJ5IHRoZSBpbmRpdmlkdWFsIGNvbW1hbmQgY29tcGxldGVyCisJIGZ1bmN0aW9ucywgd2hpY2ggY2FuIGJlIGFueSBzdHJpbmcpIHRoZW4gd2Ugd2lsbCBzd2l0Y2ggdG8gdGhlCisJIHNwZWNpYWwgd29yZCBicmVhayBzZXQgZm9yIGNvbW1hbmQgc3RyaW5ncywgd2hpY2ggbGVhdmVzIG91dCB0aGUKKwkgJy0nIGNoYXJhY3RlciB1c2VkIGluIHNvbWUgY29tbWFuZHMuICAqLworCisgICAgICBybF9jb21wbGV0ZXJfd29yZF9icmVha19jaGFyYWN0ZXJzID0KKwkgIGdkYl9jb21wbGV0ZXJfd29yZF9icmVha19jaGFyYWN0ZXJzOworCisgICAgICAvKiBEZWNpZGUgd2hldGhlciB0byBjb21wbGV0ZSBvbiBhIGxpc3Qgb2YgZ2RiIGNvbW1hbmRzIG9yIG9uIHN5bWJvbHMuICovCisgICAgICB0bXBfY29tbWFuZCA9IChjaGFyICopIGFsbG9jYSAocG9pbnQgKyAxKTsKKyAgICAgIHAgPSB0bXBfY29tbWFuZDsKKworICAgICAgc3RybmNweSAodG1wX2NvbW1hbmQsIGxpbmVfYnVmZmVyLCBwb2ludCk7CisgICAgICB0bXBfY29tbWFuZFtwb2ludF0gPSAnXDAnOworICAgICAgLyogU2luY2UgdGV4dCBhbHdheXMgY29udGFpbnMgc29tZSBudW1iZXIgb2YgY2hhcmFjdGVycyBsZWFkaW5nIHVwCisJIHRvIHBvaW50LCB3ZSBjYW4gZmluZCB0aGUgZXF1aXZhbGVudCBwb3NpdGlvbiBpbiB0bXBfY29tbWFuZAorCSBieSBzdWJ0cmFjdGluZyB0aGF0IG1hbnkgY2hhcmFjdGVycyBmcm9tIHRoZSBlbmQgb2YgdG1wX2NvbW1hbmQuICAqLworICAgICAgd29yZCA9IHRtcF9jb21tYW5kICsgcG9pbnQgLSBzdHJsZW4gKHRleHQpOworCisgICAgICBpZiAocG9pbnQgPT0gMCkKKwl7CisJICAvKiBBbiBlbXB0eSBsaW5lIHdlIHdhbnQgdG8gY29uc2lkZXIgYW1iaWd1b3VzOyB0aGF0IGlzLCBpdAorCSAgICAgY291bGQgYmUgYW55IGNvbW1hbmQuICAqLworCSAgYyA9IChzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqKSAtMTsKKwkgIHJlc3VsdF9saXN0ID0gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgYyA9IGxvb2t1cF9jbWRfMSAoJnAsIGNtZGxpc3QsICZyZXN1bHRfbGlzdCwgMSk7CisJfQorCisgICAgICAvKiBNb3ZlIHAgdXAgdG8gdGhlIG5leHQgaW50ZXJlc3RpbmcgdGhpbmcuICAqLworICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorCXsKKwkgIHArKzsKKwl9CisKKyAgICAgIGlmICghYykKKwl7CisJICAvKiBJdCBpcyBhbiB1bnJlY29nbml6ZWQgY29tbWFuZC4gIFNvIHRoZXJlIGFyZSBubworCSAgICAgcG9zc2libGUgY29tcGxldGlvbnMuICAqLworCSAgbGlzdCA9IE5VTEw7CisJfQorICAgICAgZWxzZSBpZiAoYyA9PSAoc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKikgLTEpCisJeworCSAgY2hhciAqcTsKKworCSAgLyogbG9va3VwX2NtZF8xIGFkdmFuY2VzIHAgdXAgdG8gdGhlIGZpcnN0IGFtYmlndW91cyB0aGluZywgYnV0CisJICAgICBkb2Vzbid0IGFkdmFuY2Ugb3ZlciB0aGF0IHRoaW5nIGl0c2VsZi4gIERvIHNvIG5vdy4gICovCisJICBxID0gcDsKKwkgIHdoaWxlICgqcSAmJiAoaXNhbG51bSAoKnEpIHx8ICpxID09ICctJyB8fCAqcSA9PSAnXycpKQorCSAgICArK3E7CisJICBpZiAocSAhPSB0bXBfY29tbWFuZCArIHBvaW50KQorCSAgICB7CisJICAgICAgLyogVGhlcmUgaXMgc29tZXRoaW5nIGJleW9uZCB0aGUgYW1iaWd1b3VzCisJCSBjb21tYW5kLCBzbyB0aGVyZSBhcmUgbm8gcG9zc2libGUgY29tcGxldGlvbnMuICBGb3IKKwkJIGV4YW1wbGUsICJpbmZvIHQgIiBvciAiaW5mbyB0IGZvbyIgZG9lcyBub3QgY29tcGxldGUKKwkJIHRvIGFueXRoaW5nLCBiZWNhdXNlICJpbmZvIHQiIGNhbiBiZSAiaW5mbyB0YXJnZXQiIG9yCisJCSAiaW5mbyB0ZXJtaW5hbCIuICAqLworCSAgICAgIGxpc3QgPSBOVUxMOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBXZSdyZSB0cnlpbmcgdG8gY29tcGxldGUgb24gdGhlIGNvbW1hbmQgd2hpY2ggd2FzIGFtYmlndW91cy4KKwkJIFRoaXMgd2UgY2FuIGRlYWwgd2l0aC4gICovCisJICAgICAgaWYgKHJlc3VsdF9saXN0KQorCQl7CisJCSAgbGlzdCA9IGNvbXBsZXRlX29uX2NtZGxpc3QgKCpyZXN1bHRfbGlzdC0+cHJlZml4bGlzdCwgcCwKKwkJCQkJICAgICAgd29yZCk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBsaXN0ID0gY29tcGxldGVfb25fY21kbGlzdCAoY21kbGlzdCwgcCwgd29yZCk7CisJCX0KKwkgICAgICAvKiBJbnN1cmUgdGhhdCByZWFkbGluZSBkb2VzIHRoZSByaWdodCB0aGluZyB3aXRoIHJlc3BlY3QgdG8KKwkJIGluc2VydGluZyBxdW90ZXMuICAqLworCSAgICAgIHJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMgPQorCQlnZGJfY29tcGxldGVyX2NvbW1hbmRfd29yZF9icmVha19jaGFyYWN0ZXJzOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFdlJ3ZlIHJlY29nbml6ZWQgYSBmdWxsIGNvbW1hbmQuICAqLworCisJICBpZiAocCA9PSB0bXBfY29tbWFuZCArIHBvaW50KQorCSAgICB7CisJICAgICAgLyogVGhlcmUgaXMgbm8gbm9uLXdoaXRlc3BhY2UgaW4gdGhlIGxpbmUgYmV5b25kIHRoZSBjb21tYW5kLiAgKi8KKworCSAgICAgIGlmIChwWy0xXSA9PSAnICcgfHwgcFstMV0gPT0gJ1x0JykKKwkJeworCQkgIC8qIFRoZSBjb21tYW5kIGlzIGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2U7IHdlIG5lZWQgdG8gY29tcGxldGUKKwkJICAgICBvbiB3aGF0ZXZlciBjb21lcyBhZnRlciBjb21tYW5kLiAgKi8KKwkJICBpZiAoYy0+cHJlZml4bGlzdCkKKwkJICAgIHsKKwkJICAgICAgLyogSXQgaXMgYSBwcmVmaXggY29tbWFuZDsgd2hhdCBjb21lcyBhZnRlciBpdCBpcworCQkJIGEgc3ViY29tbWFuZCAoZS5nLiAiaW5mbyAiKS4gICovCisJCSAgICAgIGxpc3QgPSBjb21wbGV0ZV9vbl9jbWRsaXN0ICgqYy0+cHJlZml4bGlzdCwgcCwgd29yZCk7CisKKwkJICAgICAgLyogSW5zdXJlIHRoYXQgcmVhZGxpbmUgZG9lcyB0aGUgcmlnaHQgdGhpbmcKKwkJCSB3aXRoIHJlc3BlY3QgdG8gaW5zZXJ0aW5nIHF1b3Rlcy4gICovCisJCSAgICAgIHJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMgPQorCQkJZ2RiX2NvbXBsZXRlcl9jb21tYW5kX3dvcmRfYnJlYWtfY2hhcmFjdGVyczsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChjLT5lbnVtcykKKwkJICAgIHsKKwkJICAgICAgbGlzdCA9IGNvbXBsZXRlX29uX2VudW0gKGMtPmVudW1zLCBwLCB3b3JkKTsKKwkJICAgICAgcmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycyA9CisJCQlnZGJfY29tcGxldGVyX2NvbW1hbmRfd29yZF9icmVha19jaGFyYWN0ZXJzOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgLyogSXQgaXMgYSBub3JtYWwgY29tbWFuZDsgd2hhdCBjb21lcyBhZnRlciBpdCBpcworCQkJIGNvbXBsZXRlZCBieSB0aGUgY29tbWFuZCdzIGNvbXBsZXRlciBmdW5jdGlvbi4gICovCisJCSAgICAgIGxpc3QgPSAoKmMtPmNvbXBsZXRlcikgKHAsIHdvcmQpOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogVGhlIGNvbW1hbmQgaXMgbm90IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2U7IHdlIG5lZWQgdG8KKwkJICAgICBjb21wbGV0ZSBvbiB0aGUgY29tbWFuZCBpdHNlbGYuICBlLmcuICJwIiB3aGljaCBpcyBhCisJCSAgICAgY29tbWFuZCBpdHNlbGYgYnV0IGFsc28gY2FuIGNvbXBsZXRlIHRvICJwcmludCIsICJwdHlwZSIKKwkJICAgICBldGMuICAqLworCQkgIGNoYXIgKnE7CisKKwkJICAvKiBGaW5kIHRoZSBjb21tYW5kIHdlIGFyZSBjb21wbGV0aW5nIG9uLiAgKi8KKwkJICBxID0gcDsKKwkJICB3aGlsZSAocSA+IHRtcF9jb21tYW5kKQorCQkgICAgeworCQkgICAgICBpZiAoaXNhbG51bSAocVstMV0pIHx8IHFbLTFdID09ICctJyB8fCBxWy0xXSA9PSAnXycpCisJCQktLXE7CisJCSAgICAgIGVsc2UKKwkJCWJyZWFrOworCQkgICAgfQorCisJCSAgbGlzdCA9IGNvbXBsZXRlX29uX2NtZGxpc3QgKHJlc3VsdF9saXN0LCBxLCB3b3JkKTsKKworCQkgIC8qIEluc3VyZSB0aGF0IHJlYWRsaW5lIGRvZXMgdGhlIHJpZ2h0IHRoaW5nCisJCSAgICAgd2l0aCByZXNwZWN0IHRvIGluc2VydGluZyBxdW90ZXMuICAqLworCQkgIHJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMgPQorCQkgICAgZ2RiX2NvbXBsZXRlcl9jb21tYW5kX3dvcmRfYnJlYWtfY2hhcmFjdGVyczsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBUaGVyZSBpcyBub24td2hpdGVzcGFjZSBiZXlvbmQgdGhlIGNvbW1hbmQuICAqLworCisJICAgICAgaWYgKGMtPnByZWZpeGxpc3QgJiYgIWMtPmFsbG93X3Vua25vd24pCisJCXsKKwkJICAvKiBJdCBpcyBhbiB1bnJlY29nbml6ZWQgc3ViY29tbWFuZCBvZiBhIHByZWZpeCBjb21tYW5kLAorCQkgICAgIGUuZy4gImluZm8gYWRzZmtkaiIuICAqLworCQkgIGxpc3QgPSBOVUxMOworCQl9CisJICAgICAgZWxzZSBpZiAoYy0+ZW51bXMpCisJCXsKKwkJICBsaXN0ID0gY29tcGxldGVfb25fZW51bSAoYy0+ZW51bXMsIHAsIHdvcmQpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogSXQgaXMgYSBub3JtYWwgY29tbWFuZC4gICovCisJCSAgbGlzdCA9ICgqYy0+Y29tcGxldGVyKSAocCwgd29yZCk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogSWYgd2UgZm91bmQgYSBsaXN0IG9mIHBvdGVudGlhbCBjb21wbGV0aW9ucyBkdXJpbmcgaW5pdGlhbGl6YXRpb24gdGhlbgorICAgICBkb2xlIHRoZW0gb3V0IG9uZSBhdCBhIHRpbWUuICBUaGUgdmVjdG9yIG9mIGNvbXBsZXRpb25zIGlzIE5VTEwKKyAgICAgdGVybWluYXRlZCwgc28gYWZ0ZXIgcmV0dXJuaW5nIHRoZSBsYXN0IG9uZSwgcmV0dXJuIE5VTEwgKGFuZCBjb250aW51ZQorICAgICB0byBkbyBzbykgZWFjaCB0aW1lIHdlIGFyZSBjYWxsZWQgYWZ0ZXIgdGhhdCwgdW50aWwgYSBuZXcgbGlzdCBpcworICAgICBhdmFpbGFibGUuICovCisKKyAgaWYgKGxpc3QpCisgICAgeworICAgICAgb3V0cHV0ID0gbGlzdFtpbmRleF07CisgICAgICBpZiAob3V0cHV0KQorCXsKKwkgIGluZGV4Kys7CisJfQorICAgIH0KKworI2lmIDAKKyAgLyogQ2FuJ3QgZG8gdGhpcyBiZWNhdXNlIHJlYWRsaW5lIGhhc24ndCB5ZXQgY2hlY2tlZCB0aGUgd29yZCBicmVha3MKKyAgICAgZm9yIGZpZ3VyaW5nIG91dCB3aGV0aGVyIHRvIGluc2VydCBhIHF1b3RlLiAgKi8KKyAgaWYgKG91dHB1dCA9PSBOVUxMKQorICAgIC8qIE1ha2Ugc3VyZSB0aGUgd29yZCBicmVhayBjaGFyYWN0ZXJzIGFyZSBzZXQgYmFjayB0byBub3JtYWwgZm9yIHRoZQorICAgICAgIG5leHQgdGltZSB0aGF0IHJlYWRsaW5lIHRyaWVzIHRvIGNvbXBsZXRlIHNvbWV0aGluZy4gICovCisgICAgcmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycyA9CisgICAgICBnZGJfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVyczsKKyNlbmRpZgorCisgIHJldHVybiAob3V0cHV0KTsKK30KKworLyogTGluZSBjb21wbGV0aW9uIGludGVyZmFjZSBmdW5jdGlvbiBmb3IgcmVhZGxpbmUuICAqLworCitzdGF0aWMgY2hhciAqCityZWFkbGluZV9saW5lX2NvbXBsZXRpb25fZnVuY3Rpb24gKHRleHQsIG1hdGNoZXMpCisgICAgIGNoYXIgKnRleHQ7CisgICAgIGludCBtYXRjaGVzOworeworICByZXR1cm4gbGluZV9jb21wbGV0aW9uX2Z1bmN0aW9uICh0ZXh0LCBtYXRjaGVzLCBybF9saW5lX2J1ZmZlciwgcmxfcG9pbnQpOworfQorCisvKiBTa2lwIG92ZXIgYSBwb3NzaWJseSBxdW90ZWQgd29yZCAoYXMgZGVmaW5lZCBieSB0aGUgcXVvdGUgY2hhcmFjdGVycworICAgYW5kIHdvcmQgYnJlYWsgY2hhcmFjdGVycyB0aGUgY29tcGxldGVyIHVzZXMpLiAgUmV0dXJucyBwb2ludGVyIHRvIHRoZQorICAgbG9jYXRpb24gYWZ0ZXIgdGhlICJ3b3JkIi4gKi8KKworY2hhciAqCitza2lwX3F1b3RlZCAoc3RyKQorICAgICBjaGFyICpzdHI7Cit7CisgIGNoYXIgcXVvdGVfY2hhciA9ICdcMCc7CisgIGNoYXIgKnNjYW47CisKKyAgZm9yIChzY2FuID0gc3RyOyAqc2NhbiAhPSAnXDAnOyBzY2FuKyspCisgICAgeworICAgICAgaWYgKHF1b3RlX2NoYXIgIT0gJ1wwJykKKwl7CisJICAvKiBJZ25vcmUgZXZlcnl0aGluZyB1bnRpbCB0aGUgbWF0Y2hpbmcgY2xvc2UgcXVvdGUgY2hhciAqLworCSAgaWYgKCpzY2FuID09IHF1b3RlX2NoYXIpCisJICAgIHsKKwkgICAgICAvKiBGb3VuZCBtYXRjaGluZyBjbG9zZSBxdW90ZS4gKi8KKwkgICAgICBzY2FuKys7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChzdHJjaHIgKGdkYl9jb21wbGV0ZXJfcXVvdGVfY2hhcmFjdGVycywgKnNjYW4pKQorCXsKKwkgIC8qIEZvdW5kIHN0YXJ0IG9mIGEgcXVvdGVkIHN0cmluZy4gKi8KKwkgIHF1b3RlX2NoYXIgPSAqc2NhbjsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjaHIgKGdkYl9jb21wbGV0ZXJfd29yZF9icmVha19jaGFyYWN0ZXJzLCAqc2NhbikpCisJeworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgcmV0dXJuIChzY2FuKTsKK30KKworDAorI2lmZGVmIFNUT1BfU0lHTkFMCitzdGF0aWMgdm9pZAorc3RvcF9zaWcgKHNpZ25vKQoraW50IHNpZ25vOworeworI2lmIFNUT1BfU0lHTkFMID09IFNJR1RTVFAKKyAgc2lnbmFsIChTSUdUU1RQLCBTSUdfREZMKTsKKyAgc2lnc2V0bWFzayAoMCk7CisgIGtpbGwgKGdldHBpZCAoKSwgU0lHVFNUUCk7CisgIHNpZ25hbCAoU0lHVFNUUCwgc3RvcF9zaWcpOworI2Vsc2UKKyAgc2lnbmFsIChTVE9QX1NJR05BTCwgc3RvcF9zaWcpOworI2VuZGlmCisgIHByaW50Zl91bmZpbHRlcmVkICgiJXMiLCBwcm9tcHQpOworICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCisgIC8qIEZvcmdldCBhYm91dCBhbnkgcHJldmlvdXMgY29tbWFuZCAtLSBudWxsIGxpbmUgbm93IHdpbGwgZG8gbm90aGluZy4gICovCisgIGRvbnRfcmVwZWF0ICgpOworfQorI2VuZGlmIC8qIFNUT1BfU0lHTkFMICovCisKKy8qIEluaXRpYWxpemUgc2lnbmFsIGhhbmRsZXJzLiAqLworc3RhdGljIHZvaWQKK2RvX25vdGhpbmcgKHNpZ25vKQoraW50IHNpZ25vOworeworICAvKiBVbmRlciBTeXN0ZW0gViB0aGUgZGVmYXVsdCBkaXNwb3NpdGlvbiBvZiBhIHNpZ25hbCBpcyByZWluc3RhdGVkIGFmdGVyCisgICAgIHRoZSBzaWduYWwgaXMgY2F1Z2h0IGFuZCBkZWxpdmVyZWQgdG8gYW4gYXBwbGljYXRpb24gcHJvY2Vzcy4gIE9uIHN1Y2gKKyAgICAgc3lzdGVtcyBvbmUgbXVzdCByZXN0b3JlIHRoZSByZXBsYWNlbWVudCBzaWduYWwgaGFuZGxlciBpZiBvbmUgd2lzaGVzCisgICAgIHRvIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBzaWduYWwgaW4gb25lJ3MgcHJvZ3JhbS4gIE9uIEJTRCBzeXN0ZW1zIHRoaXMKKyAgICAgaXMgbm90IG5lZWRlZCBidXQgaXQgaXMgaGFybWxlc3MsIGFuZCBpdCBzaW1wbGlmaWVzIHRoZSBjb2RlIHRvIGp1c3QgZG8KKyAgICAgaXQgdW5jb25kaXRpb25hbGx5LiAqLworICBzaWduYWwgKHNpZ25vLCBkb19ub3RoaW5nKTsKK30KKworc3RhdGljIHZvaWQKK2luaXRfc2lnbmFscyAoKQoreworICBzaWduYWwgKFNJR0lOVCwgcmVxdWVzdF9xdWl0KTsKKworICAvKiBJZiBTSUdUUkFQIHdhcyBzZXQgdG8gU0lHX0lHTiwgdGhlbiB0aGUgU0lHX0lHTiB3aWxsIGdldCBwYXNzZWQKKyAgICAgdG8gdGhlIGluZmVyaW9yIGFuZCBicmVha3BvaW50cyB3aWxsIGJlIGlnbm9yZWQuICAqLworI2lmZGVmIFNJR1RSQVAKKyAgc2lnbmFsIChTSUdUUkFQLCBTSUdfREZMKTsKKyNlbmRpZgorCisgIC8qIElmIHdlIGluaXRpYWxpemUgU0lHUVVJVCB0byBTSUdfSUdOLCB0aGVuIHRoZSBTSUdfSUdOIHdpbGwgZ2V0CisgICAgIHBhc3NlZCB0byB0aGUgaW5mZXJpb3IsIHdoaWNoIHdlIGRvbid0IHdhbnQuICBJdCB3b3VsZCBiZQorICAgICBwb3NzaWJsZSB0byBkbyBhICJzaWduYWwgKFNJR1FVSVQsIFNJR19ERkwpIiBhZnRlciB3ZSBmb3JrLCBidXQKKyAgICAgb24gQlNENC4zIHN5c3RlbXMgdXNpbmcgdmZvcmssIHRoYXQgY2FuIGFmZmVjdCB0aGUKKyAgICAgR0RCIHByb2Nlc3MgYXMgd2VsbCBhcyB0aGUgaW5mZXJpb3IgKHRoZSBzaWduYWwgaGFuZGxpbmcgdGFibGVzCisgICAgIG1pZ2h0IGJlIGluIG1lbW9yeSwgc2hhcmVkIGJldHdlZW4gdGhlIHR3bykuICBTaW5jZSB3ZSBlc3RhYmxpc2gKKyAgICAgYSBoYW5kbGVyIGZvciBTSUdRVUlULCB3aGVuIHdlIGNhbGwgZXhlYyBpdCB3aWxsIHNldCB0aGUgc2lnbmFsCisgICAgIHRvIFNJR19ERkwgZm9yIHVzLiAgKi8KKyAgc2lnbmFsIChTSUdRVUlULCBkb19ub3RoaW5nKTsKKyNpZmRlZiBTSUdIVVAKKyAgaWYgKHNpZ25hbCAoU0lHSFVQLCBkb19ub3RoaW5nKSAhPSBTSUdfSUdOKQorICAgIHNpZ25hbCAoU0lHSFVQLCBkaXNjb25uZWN0KTsKKyNlbmRpZgorICBzaWduYWwgKFNJR0ZQRSwgZmxvYXRfaGFuZGxlcik7CisKKyNpZiBkZWZpbmVkKFNJR1dJTkNIKSAmJiBkZWZpbmVkKFNJR1dJTkNIX0hBTkRMRVIpCisgIHNpZ25hbCAoU0lHV0lOQ0gsIFNJR1dJTkNIX0hBTkRMRVIpOworI2VuZGlmCit9CisMCisvKiBSZWFkIG9uZSBsaW5lIGZyb20gdGhlIGNvbW1hbmQgaW5wdXQgc3RyZWFtIGBpbnN0cmVhbScKKyAgIGludG8gdGhlIGxvY2FsIHN0YXRpYyBidWZmZXIgYGxpbmVidWZmZXInICh3aG9zZSBjdXJyZW50IGxlbmd0aAorICAgaXMgYGxpbmVsZW5ndGgnKS4KKyAgIFRoZSBidWZmZXIgaXMgbWFkZSBiaWdnZXIgYXMgbmVjZXNzYXJ5LgorICAgUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuCisKKyAgIE5VTEwgaXMgcmV0dXJuZWQgZm9yIGVuZCBvZiBmaWxlLgorCisgICAqSWYqIHRoZSBpbnN0cmVhbSA9PSBzdGRpbiAmIHN0ZGluIGlzIGEgdGVybWluYWwsIHRoZSBsaW5lIHJlYWQKKyAgIGlzIGNvcGllZCBpbnRvIHRoZSBmaWxlIGxpbmUgc2F2ZXIgKGdsb2JhbCB2YXIgY2hhciAqbGluZSwKKyAgIGxlbmd0aCBsaW5lc2l6ZSkgc28gdGhhdCBpdCBjYW4gYmUgZHVwbGljYXRlZC4KKworICAgVGhpcyByb3V0aW5lIGVpdGhlciB1c2VzIGZhbmN5IGNvbW1hbmQgbGluZSBlZGl0aW5nIG9yCisgICBzaW1wbGUgaW5wdXQgYXMgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZC4gICovCisKK2NoYXIgKgorY29tbWFuZF9saW5lX2lucHV0IChwcnJvbXB0LCByZXBlYXQsIGFubm90YXRpb25fc3VmZml4KQorICAgICBjaGFyICpwcnJvbXB0OworICAgICBpbnQgcmVwZWF0OworICAgICBjaGFyICphbm5vdGF0aW9uX3N1ZmZpeDsKK3sKKyAgc3RhdGljIGNoYXIgKmxpbmVidWZmZXIgPSAwOworICBzdGF0aWMgdW5zaWduZWQgbGluZWxlbmd0aCA9IDA7CisgIHJlZ2lzdGVyIGNoYXIgKnA7CisgIGNoYXIgKnAxOworICBjaGFyICpybDsKKyAgY2hhciAqbG9jYWxfcHJvbXB0ID0gcHJyb21wdDsKKyAgY2hhciAqbmxpbmU7CisgIGNoYXIgZ290X2VvZiA9IDA7CisKKyAgLyogVGhlIGFubm90YXRpb24gc3VmZml4IG11c3QgYmUgbm9uLU5VTEwuICAqLworICBpZiAoYW5ub3RhdGlvbl9zdWZmaXggPT0gTlVMTCkKKyAgICBhbm5vdGF0aW9uX3N1ZmZpeCA9ICIiOworCisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSAmJiBpbnN0cmVhbSA9PSBzdGRpbikKKyAgICB7CisgICAgICBsb2NhbF9wcm9tcHQgPSBhbGxvY2EgKChwcnJvbXB0ID09IE5VTEwgPyAwIDogc3RybGVuIChwcnJvbXB0KSkKKwkJCSAgICAgKyBzdHJsZW4gKGFubm90YXRpb25fc3VmZml4KSArIDQwKTsKKyAgICAgIGlmIChwcnJvbXB0ID09IE5VTEwpCisJbG9jYWxfcHJvbXB0WzBdID0gJ1wwJzsKKyAgICAgIGVsc2UKKwlzdHJjcHkgKGxvY2FsX3Byb21wdCwgcHJyb21wdCk7CisgICAgICBzdHJjYXQgKGxvY2FsX3Byb21wdCwgIlxuXDAzMlwwMzIiKTsKKyAgICAgIHN0cmNhdCAobG9jYWxfcHJvbXB0LCBhbm5vdGF0aW9uX3N1ZmZpeCk7CisgICAgICBzdHJjYXQgKGxvY2FsX3Byb21wdCwgIlxuIik7CisgICAgfQorCisgIGlmIChsaW5lYnVmZmVyID09IDApCisgICAgeworICAgICAgbGluZWxlbmd0aCA9IDgwOworICAgICAgbGluZWJ1ZmZlciA9IChjaGFyICopIHhtYWxsb2MgKGxpbmVsZW5ndGgpOworICAgIH0KKworICBwID0gbGluZWJ1ZmZlcjsKKworICAvKiBDb250cm9sLUMgcXVpdHMgaW5zdGFudGx5IGlmIHR5cGVkIHdoaWxlIGluIHRoaXMgbG9vcAorICAgICBzaW5jZSBpdCBzaG91bGQgbm90IHdhaXQgdW50aWwgdGhlIHVzZXIgdHlwZXMgYSBuZXdsaW5lLiAgKi8KKyAgaW1tZWRpYXRlX3F1aXQrKzsKKyNpZmRlZiBTVE9QX1NJR05BTAorICBpZiAoam9iX2NvbnRyb2wpCisgICAgc2lnbmFsIChTVE9QX1NJR05BTCwgc3RvcF9zaWcpOworI2VuZGlmCisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgLyogTWFrZSBzdXJlIHRoYXQgYWxsIG91dHB1dCBoYXMgYmVlbiBvdXRwdXQuICBTb21lIG1hY2hpbmVzIG1heSBsZXQKKwkgeW91IGdldCBhd2F5IHdpdGggbGVhdmluZyBvdXQgc29tZSBvZiB0aGUgZ2RiX2ZsdXNoLCBidXQgbm90IGFsbC4gICovCisgICAgICB3cmFwX2hlcmUgKCIiKTsKKyAgICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRlcnIpOworCisgICAgICBpZiAoc291cmNlX2ZpbGVfbmFtZSAhPSBOVUxMKQorCXsKKwkgICsrc291cmNlX2xpbmVfbnVtYmVyOworCSAgc3ByaW50ZiAoc291cmNlX2Vycm9yLAorCQkgICAiJXMlczolZDogRXJyb3IgaW4gc291cmNlZCBjb21tYW5kIGZpbGU6XG4iLAorCQkgICBzb3VyY2VfcHJlX2Vycm9yLAorCQkgICBzb3VyY2VfZmlsZV9uYW1lLAorCQkgICBzb3VyY2VfbGluZV9udW1iZXIpOworCSAgZXJyb3JfcHJlX3ByaW50ID0gc291cmNlX2Vycm9yOworCX0KKworICAgICAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxICYmIGluc3RyZWFtID09IHN0ZGluKQorCXsKKwkgIHByaW50Zl91bmZpbHRlcmVkICgiXG5cMDMyXDAzMnByZS0iKTsKKwkgIHByaW50Zl91bmZpbHRlcmVkIChhbm5vdGF0aW9uX3N1ZmZpeCk7CisJICBwcmludGZfdW5maWx0ZXJlZCAoIlxuIik7CisJfQorCisgICAgICAvKiBEb24ndCB1c2UgZmFuY3kgc3R1ZmYgaWYgbm90IHRhbGtpbmcgdG8gc3RkaW4uICAqLworICAgICAgaWYgKHJlYWRsaW5lX2hvb2sgJiYgaW5zdHJlYW0gPT0gTlVMTCkKKwl7CisJICBybCA9ICgqcmVhZGxpbmVfaG9vaykgKGxvY2FsX3Byb21wdCk7CisJfQorICAgICAgZWxzZSBpZiAoY29tbWFuZF9lZGl0aW5nX3AgJiYgaW5zdHJlYW0gPT0gc3RkaW4gJiYgSVNBVFRZIChpbnN0cmVhbSkpCisJeworCSAgcmwgPSByZWFkbGluZSAobG9jYWxfcHJvbXB0KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcmwgPSBnZGJfcmVhZGxpbmUgKGxvY2FsX3Byb21wdCk7CisJfQorCisgICAgICBpZiAoYW5ub3RhdGlvbl9sZXZlbCA+IDEgJiYgaW5zdHJlYW0gPT0gc3RkaW4pCisJeworCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcblwwMzJcMDMycG9zdC0iKTsKKwkgIHByaW50Zl91bmZpbHRlcmVkIChhbm5vdGF0aW9uX3N1ZmZpeCk7CisJICBwcmludGZfdW5maWx0ZXJlZCAoIlxuIik7CisJfQorCisgICAgICBpZiAoIXJsIHx8IHJsID09IChjaGFyICopIEVPRikKKwl7CisJICBnb3RfZW9mID0gMTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGlmIChzdHJsZW4ocmwpICsgMSArIChwIC0gbGluZWJ1ZmZlcikgPiBsaW5lbGVuZ3RoKQorCXsKKwkgIGxpbmVsZW5ndGggPSBzdHJsZW4ocmwpICsgMSArIChwIC0gbGluZWJ1ZmZlcik7CisJICBubGluZSA9IChjaGFyICopIHhyZWFsbG9jIChsaW5lYnVmZmVyLCBsaW5lbGVuZ3RoKTsKKwkgIHAgKz0gbmxpbmUgLSBsaW5lYnVmZmVyOworCSAgbGluZWJ1ZmZlciA9IG5saW5lOworCX0KKyAgICAgIHAxID0gcmw7CisgICAgICAvKiBDb3B5IGxpbmUuICBEb24ndCBjb3B5IG51bGwgYXQgZW5kLiAgKExlYXZlcyBsaW5lIGFsb25lCisgICAgICAgICBpZiB0aGlzIHdhcyBqdXN0IGEgbmV3bGluZSkgICovCisgICAgICB3aGlsZSAoKnAxKQorCSpwKysgPSAqcDErKzsKKworICAgICAgZnJlZSAocmwpOwkJCS8qIEFsbG9jYXRlZCBpbiByZWFkbGluZS4gICovCisKKyAgICAgIGlmIChwID09IGxpbmVidWZmZXIgfHwgKihwIC0gMSkgIT0gJ1xcJykKKwlicmVhazsKKworICAgICAgcC0tOwkJCS8qIFB1dCBvbiB0b3Agb2YgJ1wnLiAgKi8KKyAgICAgIGxvY2FsX3Byb21wdCA9IChjaGFyICopIDA7CisgIH0KKworI2lmZGVmIFNUT1BfU0lHTkFMCisgIGlmIChqb2JfY29udHJvbCkKKyAgICBzaWduYWwgKFNUT1BfU0lHTkFMLCBTSUdfREZMKTsKKyNlbmRpZgorICBpbW1lZGlhdGVfcXVpdC0tOworCisgIGlmIChnb3RfZW9mKQorICAgIHJldHVybiBOVUxMOworCisjZGVmaW5lIFNFUlZFUl9DT01NQU5EX0xFTkdUSCA3CisgIHNlcnZlcl9jb21tYW5kID0KKyAgICAocCAtIGxpbmVidWZmZXIgPiBTRVJWRVJfQ09NTUFORF9MRU5HVEgpCisgICAgICAmJiBTVFJFUU4gKGxpbmVidWZmZXIsICJzZXJ2ZXIgIiwgU0VSVkVSX0NPTU1BTkRfTEVOR1RIKTsKKyAgaWYgKHNlcnZlcl9jb21tYW5kKQorICAgIHsKKyAgICAgIC8qIE5vdGUgdGhhdCB3ZSBkb24ndCBzZXQgYGxpbmUnLiAgQmV0d2VlbiB0aGlzIGFuZCB0aGUgY2hlY2sgaW4KKwkgZG9udF9yZXBlYXQsIHRoaXMgaW5zdXJlcyB0aGF0IHJlcGVhdGluZyB3aWxsIHN0aWxsIGRvIHRoZQorCSByaWdodCB0aGluZy4gICovCisgICAgICAqcCA9ICdcMCc7CisgICAgICByZXR1cm4gbGluZWJ1ZmZlciArIFNFUlZFUl9DT01NQU5EX0xFTkdUSDsKKyAgICB9CisKKyAgLyogRG8gaGlzdG9yeSBleHBhbnNpb24gaWYgdGhhdCBpcyB3aXNoZWQuICAqLworICBpZiAoaGlzdG9yeV9leHBhbnNpb25fcCAmJiBpbnN0cmVhbSA9PSBzdGRpbgorICAgICAgJiYgSVNBVFRZIChpbnN0cmVhbSkpCisgICAgeworICAgICAgY2hhciAqaGlzdG9yeV92YWx1ZTsKKyAgICAgIGludCBleHBhbmRlZDsKKworICAgICAgKnAgPSAnXDAnOwkJLyogSW5zZXJ0IG51bGwgbm93LiAgKi8KKyAgICAgIGV4cGFuZGVkID0gaGlzdG9yeV9leHBhbmQgKGxpbmVidWZmZXIsICZoaXN0b3J5X3ZhbHVlKTsKKyAgICAgIGlmIChleHBhbmRlZCkKKwl7CisJICAvKiBQcmludCB0aGUgY2hhbmdlcy4gICovCisJICBwcmludGZfdW5maWx0ZXJlZCAoIiVzXG4iLCBoaXN0b3J5X3ZhbHVlKTsKKworCSAgLyogSWYgdGhlcmUgd2FzIGFuIGVycm9yLCBjYWxsIHRoaXMgZnVuY3Rpb24gYWdhaW4uICAqLworCSAgaWYgKGV4cGFuZGVkIDwgMCkKKwkgICAgeworCSAgICAgIGZyZWUgKGhpc3RvcnlfdmFsdWUpOworCSAgICAgIHJldHVybiBjb21tYW5kX2xpbmVfaW5wdXQgKHBycm9tcHQsIHJlcGVhdCwgYW5ub3RhdGlvbl9zdWZmaXgpOworCSAgICB9CisJICBpZiAoc3RybGVuIChoaXN0b3J5X3ZhbHVlKSA+IGxpbmVsZW5ndGgpCisJICAgIHsKKwkgICAgICBsaW5lbGVuZ3RoID0gc3RybGVuIChoaXN0b3J5X3ZhbHVlKSArIDE7CisJICAgICAgbGluZWJ1ZmZlciA9IChjaGFyICopIHhyZWFsbG9jIChsaW5lYnVmZmVyLCBsaW5lbGVuZ3RoKTsKKwkgICAgfQorCSAgc3RyY3B5IChsaW5lYnVmZmVyLCBoaXN0b3J5X3ZhbHVlKTsKKwkgIHAgPSBsaW5lYnVmZmVyICsgc3RybGVuKGxpbmVidWZmZXIpOworCSAgZnJlZSAoaGlzdG9yeV92YWx1ZSk7CisJfQorICAgIH0KKworICAvKiBJZiB3ZSBqdXN0IGdvdCBhbiBlbXB0eSBsaW5lLCBhbmQgdGhhdCBpcyBzdXBwb3NlZAorICAgICB0byByZXBlYXQgdGhlIHByZXZpb3VzIGNvbW1hbmQsIHJldHVybiB0aGUgdmFsdWUgaW4gdGhlCisgICAgIGdsb2JhbCBidWZmZXIuICAqLworICBpZiAocmVwZWF0ICYmIHAgPT0gbGluZWJ1ZmZlcikKKyAgICByZXR1cm4gbGluZTsKKyAgZm9yIChwMSA9IGxpbmVidWZmZXI7ICpwMSA9PSAnICcgfHwgKnAxID09ICdcdCc7IHAxKyspIDsKKyAgaWYgKHJlcGVhdCAmJiAhKnAxKQorICAgIHJldHVybiBsaW5lOworCisgICpwID0gMDsKKworICAvKiBBZGQgbGluZSB0byBoaXN0b3J5IGlmIGFwcHJvcHJpYXRlLiAgKi8KKyAgaWYgKGluc3RyZWFtID09IHN0ZGluCisgICAgICAmJiBJU0FUVFkgKHN0ZGluKSAmJiAqbGluZWJ1ZmZlcikKKyAgICBhZGRfaGlzdG9yeSAobGluZWJ1ZmZlcik7CisKKyAgLyogTm90ZTogbGluZXMgY29uc2lzdGluZyBzb2xlbHkgb2YgY29tbWVudHMgYXJlIGFkZGVkIHRvIHRoZSBjb21tYW5kCisgICAgIGhpc3RvcnkuICBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSB0eXBlIGEgY29tbWFuZCwgYW5kIHRoZW4KKyAgICAgcmVhbGl6ZSB5b3UgZG9uJ3Qgd2FudCB0byBleGVjdXRlIGl0IHF1aXRlIHlldC4gIFlvdSBjYW4gY29tbWVudAorICAgICBvdXQgdGhlIGNvbW1hbmQgYW5kIHRoZW4gbGF0ZXIgZmV0Y2ggaXQgZnJvbSB0aGUgdmFsdWUgaGlzdG9yeQorICAgICBhbmQgcmVtb3ZlIHRoZSAnIycuICBUaGUga2lsbCByaW5nIGlzIHByb2JhYmx5IGJldHRlciwgYnV0IHNvbWUKKyAgICAgcGVvcGxlIGFyZSBpbiB0aGUgaGFiaXQgb2YgY29tbWVudGluZyB0aGluZ3Mgb3V0LiAgKi8KKyAgaWYgKCpwMSA9PSAnIycpCisgICAgKnAxID0gJ1wwJzsgIC8qIEZvdW5kIGEgY29tbWVudC4gKi8KKworICAvKiBTYXZlIGludG8gZ2xvYmFsIGJ1ZmZlciBpZiBhcHByb3ByaWF0ZS4gICovCisgIGlmIChyZXBlYXQpCisgICAgeworICAgICAgaWYgKGxpbmVsZW5ndGggPiBsaW5lc2l6ZSkKKwl7CisJICBsaW5lID0geHJlYWxsb2MgKGxpbmUsIGxpbmVsZW5ndGgpOworCSAgbGluZXNpemUgPSBsaW5lbGVuZ3RoOworCX0KKyAgICAgIHN0cmNweSAobGluZSwgbGluZWJ1ZmZlcik7CisgICAgICByZXR1cm4gbGluZTsKKyAgICB9CisKKyAgcmV0dXJuIGxpbmVidWZmZXI7Cit9CisMCisKKy8qIEV4cGFuZCB0aGUgYm9keV9saXN0IG9mIENPTU1BTkQgc28gdGhhdCBpdCBjYW4gaG9sZCBORVdfTEVOR1RICisgICBjb2RlIGJvZGllcy4gIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiB3ZSBlbmNvdW50ZXIgYW4gImVsc2UiCisgICBjbGF1c2UgZm9yIGFuICJpZiIgY29tbWFuZC4gICovCisKK3N0YXRpYyB2b2lkCityZWFsbG9jX2JvZHlfbGlzdCAoY29tbWFuZCwgbmV3X2xlbmd0aCkKKyAgICAgc3RydWN0IGNvbW1hbmRfbGluZSAqY29tbWFuZDsKKyAgICAgaW50IG5ld19sZW5ndGg7Cit7CisgIGludCBuOworICBzdHJ1Y3QgY29tbWFuZF9saW5lICoqYm9keV9saXN0OworCisgIG4gPSBjb21tYW5kLT5ib2R5X2NvdW50OworCisgIC8qIE5vdGhpbmcgdG8gZG8/ICAqLworICBpZiAobmV3X2xlbmd0aCA8PSBuKQorICAgIHJldHVybjsKKworICBib2R5X2xpc3QgPSAoc3RydWN0IGNvbW1hbmRfbGluZSAqKikKKyAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb21tYW5kX2xpbmUgKikgKiBuZXdfbGVuZ3RoKTsKKworICBtZW1jcHkgKGJvZHlfbGlzdCwgY29tbWFuZC0+Ym9keV9saXN0LCBzaXplb2YgKHN0cnVjdCBjb21tYW5kX2xpbmUgKikgKiBuKTsKKworICBmcmVlIChjb21tYW5kLT5ib2R5X2xpc3QpOworICBjb21tYW5kLT5ib2R5X2xpc3QgPSBib2R5X2xpc3Q7CisgIGNvbW1hbmQtPmJvZHlfY291bnQgPSBuZXdfbGVuZ3RoOworfQorCisvKiBSZWFkIG9uZSBsaW5lIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gIElmIHRoZSBjb21tYW5kIGlzIGFuICJlbHNlIiBvcgorICAgImVuZCIsIHJldHVybiBzdWNoIGFuIGluZGljYXRpb24gdG8gdGhlIGNhbGxlci4gICovCisKK3N0YXRpYyBlbnVtIG1pc2NfY29tbWFuZF90eXBlCityZWFkX25leHRfbGluZSAoY29tbWFuZCkKKyAgICAgc3RydWN0IGNvbW1hbmRfbGluZSAqKmNvbW1hbmQ7Cit7CisgIGNoYXIgKnAsICpwMSwgKnByb21wdF9wdHIsIGNvbnRyb2xfcHJvbXB0WzI1Nl07CisgIGludCBpID0gMDsKKworICBpZiAoY29udHJvbF9sZXZlbCA+PSAyNTQpCisgICAgZXJyb3IgKCJDb250cm9sIG5lc3RpbmcgdG9vIGRlZXAhXG4iKTsKKworICAvKiBTZXQgYSBwcm9tcHQgYmFzZWQgb24gdGhlIG5lc3Rpbmcgb2YgdGhlIGNvbnRyb2wgY29tbWFuZHMuICAqLworICBpZiAoaW5zdHJlYW0gPT0gc3RkaW4gfHwgKGluc3RyZWFtID09IDAgJiYgcmVhZGxpbmVfaG9vayAhPSBOVUxMKSkKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udHJvbF9sZXZlbDsgaSsrKQorCWNvbnRyb2xfcHJvbXB0W2ldID0gJyAnOworICAgICAgY29udHJvbF9wcm9tcHRbaV0gPSAnPic7CisgICAgICBjb250cm9sX3Byb21wdFtpKzFdID0gJ1wwJzsKKyAgICAgIHByb21wdF9wdHIgPSAoY2hhciAqKSZjb250cm9sX3Byb21wdFswXTsKKyAgICB9CisgIGVsc2UKKyAgICBwcm9tcHRfcHRyID0gTlVMTDsKKworICBwID0gY29tbWFuZF9saW5lX2lucHV0IChwcm9tcHRfcHRyLCBpbnN0cmVhbSA9PSBzdGRpbiwgImNvbW1hbmRzIik7CisKKyAgLyogTm90IHN1cmUgd2hhdCB0byBkbyBoZXJlLiAgKi8KKyAgaWYgKHAgPT0gTlVMTCkKKyAgICByZXR1cm4gZW5kX2NvbW1hbmQ7CisKKyAgLyogU3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gICovCisgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKKyAgICBwKys7CisKKyAgcDEgPSBwICsgc3RybGVuIChwKTsKKyAgd2hpbGUgKHAxICE9IHAgJiYgKHAxWy0xXSA9PSAnICcgfHwgcDFbLTFdID09ICdcdCcpKQorICAgIHAxLS07CisKKyAgLyogQmxhbmtzIGFuZCBjb21tZW50cyBkb24ndCByZWFsbHkgZG8gYW55dGhpbmcsIGJ1dCB3ZSBuZWVkIHRvCisgICAgIGRpc3Rpbmd1aXNoIHRoZW0gZnJvbSBlbHNlLCBlbmQgYW5kIG90aGVyIGNvbW1hbmRzIHdoaWNoIGNhbiBiZQorICAgICBleGVjdXRlZC4gICovCisgIGlmIChwMSA9PSBwIHx8IHBbMF0gPT0gJyMnKQorICAgIHJldHVybiBub3BfY29tbWFuZDsKKyAgICAgIAorICAvKiBJcyB0aGlzIHRoZSBlbmQgb2YgYSBzaW1wbGUsIHdoaWxlLCBvciBpZiBjb250cm9sIHN0cnVjdHVyZT8gICovCisgIGlmIChwMSAtIHAgPT0gMyAmJiAhc3RybmNtcCAocCwgImVuZCIsIDMpKQorICAgIHJldHVybiBlbmRfY29tbWFuZDsKKworICAvKiBJcyB0aGUgZWxzZSBjbGF1c2Ugb2YgYW4gaWYgY29udHJvbCBzdHJ1Y3R1cmU/ICAqLworICBpZiAocDEgLSBwID09IDQgJiYgIXN0cm5jbXAgKHAsICJlbHNlIiwgNCkpCisgICAgcmV0dXJuIGVsc2VfY29tbWFuZDsKKworICAvKiBDaGVjayBmb3Igd2hpbGUsIGlmLCBicmVhaywgY29udGludWUsIGV0YyBhbmQgYnVpbGQgYSBuZXcgY29tbWFuZAorICAgICBsaW5lIHN0cnVjdHVyZSBmb3IgdGhlbS4gICovCisgIGlmIChwMSAtIHAgPiA1ICYmICFzdHJuY21wIChwLCAid2hpbGUiLCA1KSkKKyAgICAqY29tbWFuZCA9IGJ1aWxkX2NvbW1hbmRfbGluZSAod2hpbGVfY29udHJvbCwgcCArIDYpOworICBlbHNlIGlmIChwMSAtIHAgPiAyICYmICFzdHJuY21wIChwLCAiaWYiLCAyKSkKKyAgICAqY29tbWFuZCA9IGJ1aWxkX2NvbW1hbmRfbGluZSAoaWZfY29udHJvbCwgcCArIDMpOworICBlbHNlIGlmIChwMSAtIHAgPT0gMTAgJiYgIXN0cm5jbXAgKHAsICJsb29wX2JyZWFrIiwgMTApKQorICAgIHsKKyAgICAgICpjb21tYW5kID0gKHN0cnVjdCBjb21tYW5kX2xpbmUgKikKKwl4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb21tYW5kX2xpbmUpKTsKKyAgICAgICgqY29tbWFuZCktPm5leHQgPSBOVUxMOworICAgICAgKCpjb21tYW5kKS0+bGluZSA9IE5VTEw7CisgICAgICAoKmNvbW1hbmQpLT5jb250cm9sX3R5cGUgPSBicmVha19jb250cm9sOworICAgICAgKCpjb21tYW5kKS0+Ym9keV9jb3VudCA9IDA7CisgICAgICAoKmNvbW1hbmQpLT5ib2R5X2xpc3QgPSBOVUxMOworICAgIH0KKyAgZWxzZSBpZiAocDEgLSBwID09IDEzICYmICFzdHJuY21wIChwLCAibG9vcF9jb250aW51ZSIsIDEzKSkKKyAgICB7CisgICAgICAqY29tbWFuZCA9IChzdHJ1Y3QgY29tbWFuZF9saW5lICopCisJeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29tbWFuZF9saW5lKSk7CisgICAgICAoKmNvbW1hbmQpLT5uZXh0ID0gTlVMTDsKKyAgICAgICgqY29tbWFuZCktPmxpbmUgPSBOVUxMOworICAgICAgKCpjb21tYW5kKS0+Y29udHJvbF90eXBlID0gY29udGludWVfY29udHJvbDsKKyAgICAgICgqY29tbWFuZCktPmJvZHlfY291bnQgPSAwOworICAgICAgKCpjb21tYW5kKS0+Ym9keV9saXN0ID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBBIG5vcm1hbCBjb21tYW5kLiAgKi8KKyAgICAgICpjb21tYW5kID0gKHN0cnVjdCBjb21tYW5kX2xpbmUgKikKKwl4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb21tYW5kX2xpbmUpKTsKKyAgICAgICgqY29tbWFuZCktPm5leHQgPSBOVUxMOworICAgICAgKCpjb21tYW5kKS0+bGluZSA9IHNhdmVzdHJpbmcgKHAsIHAxIC0gcCk7CisgICAgICAoKmNvbW1hbmQpLT5jb250cm9sX3R5cGUgPSBzaW1wbGVfY29udHJvbDsKKyAgICAgICgqY29tbWFuZCktPmJvZHlfY291bnQgPSAwOworICAgICAgKCpjb21tYW5kKS0+Ym9keV9saXN0ID0gTlVMTDsKKyAgfQorCisgIC8qIE5vdGhpbmcgc3BlY2lhbC4gICovCisgIHJldHVybiBva19jb21tYW5kOworfQorCisvKiBSZWN1cnNpdmVseSByZWFkIGluIHRoZSBjb250cm9sIHN0cnVjdHVyZXMgYW5kIGNyZWF0ZSBhIGNvbW1hbmRfbGluZSAKKyAgIHN0cnVjdHVyZSBmcm9tIHRoZW0uCisKKyAgIFRoZSBwYXJlbnRfY29udHJvbCBwYXJhbWV0ZXIgaXMgdGhlIGNvbnRyb2wgc3RydWN0dXJlIGluIHdoaWNoIHRoZQorICAgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSBuZXN0ZWQuICAqLworCitzdGF0aWMgZW51bSBjb21tYW5kX2NvbnRyb2xfdHlwZQorcmVjdXJzZV9yZWFkX2NvbnRyb2xfc3RydWN0dXJlIChjdXJyZW50X2NtZCkKKyAgICAgc3RydWN0IGNvbW1hbmRfbGluZSAqY3VycmVudF9jbWQ7Cit7CisgIGludCBjdXJyZW50X2JvZHksIGk7CisgIGVudW0gbWlzY19jb21tYW5kX3R5cGUgdmFsOworICBlbnVtIGNvbW1hbmRfY29udHJvbF90eXBlIHJldDsKKyAgc3RydWN0IGNvbW1hbmRfbGluZSAqKmJvZHlfcHRyLCAqY2hpbGRfdGFpbCwgKm5leHQ7CisKKyAgY2hpbGRfdGFpbCA9IE5VTEw7CisgIGN1cnJlbnRfYm9keSA9IDE7CisKKyAgLyogU2FuaXR5IGNoZWNrcy4gICovCisgIGlmIChjdXJyZW50X2NtZC0+Y29udHJvbF90eXBlID09IHNpbXBsZV9jb250cm9sKQorICAgIHsKKyAgICAgIGVycm9yICgiUmVjdXJzZWQgb24gYSBzaW1wbGUgY29udHJvbCB0eXBlXG4iKTsKKyAgICAgIHJldHVybiBpbnZhbGlkX2NvbnRyb2w7CisgICAgfQorCisgIGlmIChjdXJyZW50X2JvZHkgPiBjdXJyZW50X2NtZC0+Ym9keV9jb3VudCkKKyAgICB7CisgICAgICBlcnJvciAoIkFsbG9jYXRlZCBib2R5IGlzIHNtYWxsZXIgdGhhbiB0aGlzIGNvbW1hbmQgdHlwZSBuZWVkc1xuIik7CisgICAgICByZXR1cm4gaW52YWxpZF9jb250cm9sOworICAgIH0KKworICAvKiBSZWFkIGxpbmVzIGZyb20gdGhlIGlucHV0IHN0cmVhbSBhbmQgYnVpbGQgY29udHJvbCBzdHJ1Y3R1cmVzLiAgKi8KKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgZG9udF9yZXBlYXQgKCk7CisKKyAgICAgIG5leHQgPSBOVUxMOworICAgICAgdmFsID0gcmVhZF9uZXh0X2xpbmUgKCZuZXh0KTsKKworICAgICAgLyogSnVzdCBza2lwIGJsYW5rcyBhbmQgY29tbWVudHMuICAqLworICAgICAgaWYgKHZhbCA9PSBub3BfY29tbWFuZCkKKwljb250aW51ZTsKKworICAgICAgaWYgKHZhbCA9PSBlbmRfY29tbWFuZCkKKwl7CisJICBpZiAoY3VycmVudF9jbWQtPmNvbnRyb2xfdHlwZSA9PSB3aGlsZV9jb250cm9sCisJICAgICAgfHwgY3VycmVudF9jbWQtPmNvbnRyb2xfdHlwZSA9PSBpZl9jb250cm9sKQorCSAgICB7CisJICAgICAgLyogU3VjY2VzcyByZWFkaW5nIGFuIGVudGlyZSBjb250cm9sIHN0cnVjdHVyZS4gICovCisJICAgICAgcmV0ID0gc2ltcGxlX2NvbnRyb2w7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHJldCA9IGludmFsaWRfY29udHJvbDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIAorICAgICAgLyogTm90IHRoZSBlbmQgb2YgYSBjb250cm9sIHN0cnVjdHVyZS4gICovCisgICAgICBpZiAodmFsID09IGVsc2VfY29tbWFuZCkKKwl7CisJICBpZiAoY3VycmVudF9jbWQtPmNvbnRyb2xfdHlwZSA9PSBpZl9jb250cm9sCisJICAgICAgJiYgY3VycmVudF9ib2R5ID09IDEpCisJICAgIHsKKwkgICAgICByZWFsbG9jX2JvZHlfbGlzdCAoY3VycmVudF9jbWQsIDIpOworCSAgICAgIGN1cnJlbnRfYm9keSA9IDI7CisJICAgICAgY2hpbGRfdGFpbCA9IE5VTEw7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHJldCA9IGludmFsaWRfY29udHJvbDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgaWYgKGNoaWxkX3RhaWwpCisJeworCSAgY2hpbGRfdGFpbC0+bmV4dCA9IG5leHQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJvZHlfcHRyID0gY3VycmVudF9jbWQtPmJvZHlfbGlzdDsKKwkgIGZvciAoaSA9IDE7IGkgPCBjdXJyZW50X2JvZHk7IGkrKykKKwkgICAgYm9keV9wdHIrKzsKKworCSAgKmJvZHlfcHRyID0gbmV4dDsKKworCX0KKworICAgICAgY2hpbGRfdGFpbCA9IG5leHQ7CisKKyAgICAgIC8qIElmIHRoZSBsYXRlc3QgbGluZSBpcyBhbm90aGVyIGNvbnRyb2wgc3RydWN0dXJlLCB0aGVuIHJlY3Vyc2UKKwkgb24gaXQuICAqLworICAgICAgaWYgKG5leHQtPmNvbnRyb2xfdHlwZSA9PSB3aGlsZV9jb250cm9sCisJICB8fCBuZXh0LT5jb250cm9sX3R5cGUgPT0gaWZfY29udHJvbCkKKwl7CisJICBjb250cm9sX2xldmVsKys7CisJICByZXQgPSByZWN1cnNlX3JlYWRfY29udHJvbF9zdHJ1Y3R1cmUgKG5leHQpOworCSAgY29udHJvbF9sZXZlbC0tOworCisJICBpZiAocmV0ICE9IHNpbXBsZV9jb250cm9sKQorCSAgICBicmVhazsKKwl9CisgICAgfQorCisgIGRvbnRfcmVwZWF0ICgpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIFJlYWQgbGluZXMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIGFuZCBhY2N1bXVsYXRlIHRoZW0gaW4gYSBjaGFpbiBvZgorICAgc3RydWN0IGNvbW1hbmRfbGluZSdzLCB3aGljaCBpcyB0aGVuIHJldHVybmVkLiAgRm9yIGlucHV0IGZyb20gYQorICAgdGVybWluYWwsIHRoZSBzcGVjaWFsIGNvbW1hbmQgImVuZCIgaXMgdXNlZCB0byBtYXJrIHRoZSBlbmQgb2YgdGhlCisgICBpbnB1dCwgYW5kIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmV0dXJuZWQgY2hhaW4gb2YgY29tbWFuZHMuICovCisKKyNkZWZpbmUgRU5EX01FU1NBR0UgIkVuZCB3aXRoIGEgbGluZSBzYXlpbmcganVzdCBcImVuZFwiLiIKKworc3RydWN0IGNvbW1hbmRfbGluZSAqCityZWFkX2NvbW1hbmRfbGluZXMgKHByb21wdCwgZnJvbV90dHkpCitjaGFyICpwcm9tcHQ7CitpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCBjb21tYW5kX2xpbmUgKmhlYWQsICp0YWlsLCAqbmV4dDsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKyAgZW51bSBjb21tYW5kX2NvbnRyb2xfdHlwZSByZXQ7CisgIGVudW0gbWlzY19jb21tYW5kX3R5cGUgdmFsOworCisgIGlmIChyZWFkbGluZV9iZWdpbl9ob29rKQorICAgIHsKKyAgICAgIC8qIE5vdGUgLSBpbnRlbnRpb25hbCB0byBtZXJnZSBtZXNzYWdlcyB3aXRoIG5vIG5ld2xpbmUgKi8KKyAgICAgICgqcmVhZGxpbmVfYmVnaW5faG9vaykgKCIlcyAgJXNcbiIsIHByb21wdCwgRU5EX01FU1NBR0UpOworICAgIH0KKyAgZWxzZSBpZiAoZnJvbV90dHkgJiYgaW5wdXRfZnJvbV90ZXJtaW5hbF9wICgpKQorICAgIHsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiJXNcbiVzXG4iLCBwcm9tcHQsIEVORF9NRVNTQUdFKTsKKyAgICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisgICAgfQorCisgIGhlYWQgPSB0YWlsID0gTlVMTDsKKyAgb2xkX2NoYWluID0gTlVMTDsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICB2YWwgPSByZWFkX25leHRfbGluZSAoJm5leHQpOworCisgICAgICAvKiBJZ25vcmUgYmxhbmsgbGluZXMgb3IgY29tbWVudHMuICAqLworICAgICAgaWYgKHZhbCA9PSBub3BfY29tbWFuZCkKKwljb250aW51ZTsKKworICAgICAgaWYgKHZhbCA9PSBlbmRfY29tbWFuZCkKKwl7CisJICByZXQgPSBzaW1wbGVfY29udHJvbDsKKwkgIGJyZWFrOworCX0KKworICAgICAgaWYgKHZhbCAhPSBva19jb21tYW5kKQorCXsKKwkgIHJldCA9IGludmFsaWRfY29udHJvbDsKKwkgIGJyZWFrOworCX0KKworICAgICAgaWYgKG5leHQtPmNvbnRyb2xfdHlwZSA9PSB3aGlsZV9jb250cm9sCisJICB8fCBuZXh0LT5jb250cm9sX3R5cGUgPT0gaWZfY29udHJvbCkKKwl7CisJICBjb250cm9sX2xldmVsKys7CisJICByZXQgPSByZWN1cnNlX3JlYWRfY29udHJvbF9zdHJ1Y3R1cmUgKG5leHQpOworCSAgY29udHJvbF9sZXZlbC0tOworCisJICBpZiAocmV0ID09IGludmFsaWRfY29udHJvbCkKKwkgICAgYnJlYWs7CisJfQorICAgICAgCisgICAgICBpZiAodGFpbCkKKwl7CisJICB0YWlsLT5uZXh0ID0gbmV4dDsKKwl9CisgICAgICBlbHNlCisJeworCSAgaGVhZCA9IG5leHQ7CisJICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZnJlZV9jb21tYW5kX2xpbmVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWFkKTsKKwl9CisgICAgICB0YWlsID0gbmV4dDsKKyAgICB9CisKKyAgZG9udF9yZXBlYXQgKCk7CisKKyAgaWYgKGhlYWQpCisgICAgeworICAgICAgaWYgKHJldCAhPSBpbnZhbGlkX2NvbnRyb2wpCisJeworCSAgZGlzY2FyZF9jbGVhbnVwcyAob2xkX2NoYWluKTsKKwl9CisgICAgICBlbHNlCisJZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisgICAgfQorCisgIGlmIChyZWFkbGluZV9lbmRfaG9vaykKKyAgICB7CisgICAgICAoKnJlYWRsaW5lX2VuZF9ob29rKSAoKTsKKyAgICB9CisgIHJldHVybiAoaGVhZCk7Cit9CisKKy8qIEZyZWUgYSBjaGFpbiBvZiBzdHJ1Y3QgY29tbWFuZF9saW5lJ3MuICAqLworCit2b2lkCitmcmVlX2NvbW1hbmRfbGluZXMgKGxwdHIpCisgICAgICBzdHJ1Y3QgY29tbWFuZF9saW5lICoqbHB0cjsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGNvbW1hbmRfbGluZSAqbCA9ICpscHRyOworICByZWdpc3RlciBzdHJ1Y3QgY29tbWFuZF9saW5lICpuZXh0OworICBzdHJ1Y3QgY29tbWFuZF9saW5lICoqYmxpc3Q7CisgIGludCBpOworCisgIHdoaWxlIChsKQorICAgIHsKKyAgICAgIGlmIChsLT5ib2R5X2NvdW50ID4gMCkKKwl7CisJICBibGlzdCA9IGwtPmJvZHlfbGlzdDsKKwkgIGZvciAoaSA9IDA7IGkgPCBsLT5ib2R5X2NvdW50OyBpKyssIGJsaXN0KyspCisJICAgIGZyZWVfY29tbWFuZF9saW5lcyAoYmxpc3QpOworCX0KKyAgICAgIG5leHQgPSBsLT5uZXh0OworICAgICAgZnJlZSAobC0+bGluZSk7CisgICAgICBmcmVlICgoUFRSKWwpOworICAgICAgbCA9IG5leHQ7CisgICAgfQorfQorDAorLyogQWRkIGFuIGVsZW1lbnQgdG8gdGhlIGxpc3Qgb2YgaW5mbyBzdWJjb21tYW5kcy4gICovCisKK3ZvaWQKK2FkZF9pbmZvIChuYW1lLCBmdW4sIGRvYykKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgdm9pZCAoKmZ1bikgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKyAgICAgY2hhciAqZG9jOworeworICBhZGRfY21kIChuYW1lLCBub19jbGFzcywgZnVuLCBkb2MsICZpbmZvbGlzdCk7Cit9CisKKy8qIEFkZCBhbiBhbGlhcyB0byB0aGUgbGlzdCBvZiBpbmZvIHN1YmNvbW1hbmRzLiAgKi8KKwordm9pZAorYWRkX2luZm9fYWxpYXMgKG5hbWUsIG9sZG5hbWUsIGFiYnJldl9mbGFnKQorICAgICBjaGFyICpuYW1lOworICAgICBjaGFyICpvbGRuYW1lOworICAgICBpbnQgYWJicmV2X2ZsYWc7Cit7CisgIGFkZF9hbGlhc19jbWQgKG5hbWUsIG9sZG5hbWUsIDAsIGFiYnJldl9mbGFnLCAmaW5mb2xpc3QpOworfQorCisvKiBUaGUgImluZm8iIGNvbW1hbmQgaXMgZGVmaW5lZCBhcyBhIHByZWZpeCwgd2l0aCBhbGxvd191bmtub3duID0gMC4KKyAgIFRoZXJlZm9yZSwgaXRzIG93biBkZWZpbml0aW9uIGlzIGNhbGxlZCBvbmx5IGZvciAiaW5mbyIgd2l0aCBubyBhcmdzLiAgKi8KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitpbmZvX2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBwcmludGZfdW5maWx0ZXJlZCAoIlwiaW5mb1wiIG11c3QgYmUgZm9sbG93ZWQgYnkgdGhlIG5hbWUgb2YgYW4gaW5mbyBjb21tYW5kLlxuIik7CisgIGhlbHBfbGlzdCAoaW5mb2xpc3QsICJpbmZvICIsIC0xLCBnZGJfc3Rkb3V0KTsKK30KKworLyogVGhlICJjb21wbGV0ZSIgY29tbWFuZCBpcyB1c2VkIGJ5IEVtYWNzIHRvIGltcGxlbWVudCBjb21wbGV0aW9uLiAgKi8KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitjb21wbGV0ZV9jb21tYW5kIChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgaW50IGk7CisgIGludCBhcmdwb2ludDsKKyAgY2hhciAqY29tcGxldGlvbjsKKworICBkb250X3JlcGVhdCAoKTsKKworICBpZiAoYXJnID09IE5VTEwpCisgICAgYXJnID0gIiI7CisgIGFyZ3BvaW50ID0gc3RybGVuIChhcmcpOworCisgIGZvciAoY29tcGxldGlvbiA9IGxpbmVfY29tcGxldGlvbl9mdW5jdGlvbiAoYXJnLCBpID0gMCwgYXJnLCBhcmdwb2ludCk7CisgICAgICAgY29tcGxldGlvbjsKKyAgICAgICBjb21wbGV0aW9uID0gbGluZV9jb21wbGV0aW9uX2Z1bmN0aW9uIChhcmcsICsraSwgYXJnLCBhcmdwb2ludCkpCisgICAgeworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlc1xuIiwgY29tcGxldGlvbik7CisgICAgICBmcmVlIChjb21wbGV0aW9uKTsKKyAgICB9Cit9CisKKy8qIFRoZSAic2hvdyIgY29tbWFuZCB3aXRoIG5vIGFyZ3VtZW50cyBzaG93cyBhbGwgdGhlIHNldHRpbmdzLiAgKi8KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitzaG93X2NvbW1hbmQgKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjbWRfc2hvd19saXN0IChzaG93bGlzdCwgZnJvbV90dHksICIiKTsKK30KKwwKKy8qIEFkZCBhbiBlbGVtZW50IHRvIHRoZSBsaXN0IG9mIGNvbW1hbmRzLiAgKi8KKwordm9pZAorYWRkX2NvbSAobmFtZSwgY2xhc3MsIGZ1biwgZG9jKQorICAgICBjaGFyICpuYW1lOworICAgICBlbnVtIGNvbW1hbmRfY2xhc3MgY2xhc3M7CisgICAgIHZvaWQgKCpmdW4pIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisgICAgIGNoYXIgKmRvYzsKK3sKKyAgYWRkX2NtZCAobmFtZSwgY2xhc3MsIGZ1biwgZG9jLCAmY21kbGlzdCk7Cit9CisKKy8qIEFkZCBhbiBhbGlhcyBvciBhYmJyZXZpYXRpb24gY29tbWFuZCB0byB0aGUgbGlzdCBvZiBjb21tYW5kcy4gICovCisKK3ZvaWQKK2FkZF9jb21fYWxpYXMgKG5hbWUsIG9sZG5hbWUsIGNsYXNzLCBhYmJyZXZfZmxhZykKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgY2hhciAqb2xkbmFtZTsKKyAgICAgZW51bSBjb21tYW5kX2NsYXNzIGNsYXNzOworICAgICBpbnQgYWJicmV2X2ZsYWc7Cit7CisgIGFkZF9hbGlhc19jbWQgKG5hbWUsIG9sZG5hbWUsIGNsYXNzLCBhYmJyZXZfZmxhZywgJmNtZGxpc3QpOworfQorCit2b2lkCitlcnJvcl9ub19hcmcgKHdoeSkKKyAgICAgY2hhciAqd2h5OworeworICBlcnJvciAoIkFyZ3VtZW50IHJlcXVpcmVkICglcykuIiwgd2h5KTsKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitoZWxwX2NvbW1hbmQgKGNvbW1hbmQsIGZyb21fdHR5KQorICAgICBjaGFyICpjb21tYW5kOworICAgICBpbnQgZnJvbV90dHk7IC8qIElnbm9yZWQgKi8KK3sKKyAgaGVscF9jbWQgKGNvbW1hbmQsIGdkYl9zdGRvdXQpOworfQorDAorc3RhdGljIHZvaWQKK3ZhbGlkYXRlX2NvbW5hbWUgKGNvbW5hbWUpCisgICAgIGNoYXIgKmNvbW5hbWU7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKnA7CisKKyAgaWYgKGNvbW5hbWUgPT0gMCkKKyAgICBlcnJvcl9ub19hcmcgKCJuYW1lIG9mIGNvbW1hbmQgdG8gZGVmaW5lIik7CisKKyAgcCA9IGNvbW5hbWU7CisgIHdoaWxlICgqcCkKKyAgICB7CisgICAgICBpZiAoIWlzYWxudW0oKnApICYmICpwICE9ICctJyAmJiAqcCAhPSAnXycpCisJZXJyb3IgKCJKdW5rIGluIGFyZ3VtZW50IGxpc3Q6IFwiJXNcIiIsIHApOworICAgICAgcCsrOworICAgIH0KK30KKworLyogVGhpcyBpcyBqdXN0IGEgcGxhY2Vob2xkZXIgaW4gdGhlIGNvbW1hbmQgZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KK3N0YXRpYyB2b2lkCit1c2VyX2RlZmluZWRfY29tbWFuZCAoaWdub3JlLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqaWdub3JlOworICAgICBpbnQgZnJvbV90dHk7Cit7Cit9CisKK3N0YXRpYyB2b2lkCitkZWZpbmVfY29tbWFuZCAoY29tbmFtZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmNvbW5hbWU7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGNvbW1hbmRfbGluZSAqY21kczsKKyAgcmVnaXN0ZXIgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmMsICpuZXdjLCAqaG9va2MgPSAwOworICBjaGFyICp0ZW0gPSBjb21uYW1lOworICBjaGFyIHRtcGJ1ZlsxMjhdOworI2RlZmluZQlIT09LX1NUUklORwkiaG9vay0iCisjZGVmaW5lCUhPT0tfTEVOIDUKKworICB2YWxpZGF0ZV9jb21uYW1lIChjb21uYW1lKTsKKworICAvKiBMb29rIGl0IHVwLCBhbmQgdmVyaWZ5IHRoYXQgd2UgZ290IGFuIGV4YWN0IG1hdGNoLiAgKi8KKyAgYyA9IGxvb2t1cF9jbWQgKCZ0ZW0sIGNtZGxpc3QsICIiLCAtMSwgMSk7CisgIGlmIChjICYmICFTVFJFUSAoY29tbmFtZSwgYy0+bmFtZSkpCisgICAgYyA9IDA7CisKKyAgaWYgKGMpCisgICAgeworICAgICAgaWYgKGMtPmNsYXNzID09IGNsYXNzX3VzZXIgfHwgYy0+Y2xhc3MgPT0gY2xhc3NfYWxpYXMpCisJdGVtID0gIlJlZGVmaW5lIGNvbW1hbmQgXCIlc1wiPyAiOworICAgICAgZWxzZQorCXRlbSA9ICJSZWFsbHkgcmVkZWZpbmUgYnVpbHQtaW4gY29tbWFuZCBcIiVzXCI/ICI7CisgICAgICBpZiAoIXF1ZXJ5ICh0ZW0sIGMtPm5hbWUpKQorCWVycm9yICgiQ29tbWFuZCBcIiVzXCIgbm90IHJlZGVmaW5lZC4iLCBjLT5uYW1lKTsKKyAgICB9CisKKyAgLyogSWYgdGhpcyBuZXcgY29tbWFuZCBpcyBhIGhvb2ssIHRoZW4gbWFyayB0aGUgY29tbWFuZCB3aGljaCBpdAorICAgICBpcyBob29raW5nLiAgTm90ZSB0aGF0IHdlIGFsbG93IGhvb2tpbmcgYGhlbHAnIGNvbW1hbmRzLCBzbyB0aGF0CisgICAgIHdlIGNhbiBob29rIHRoZSBgc3RvcCcgcHNldWRvLWNvbW1hbmQuICAqLworCisgIGlmICghc3RybmNtcCAoY29tbmFtZSwgSE9PS19TVFJJTkcsIEhPT0tfTEVOKSkKKyAgICB7CisgICAgICAvKiBMb29rIHVwIGNtZCBpdCBob29rcywgYW5kIHZlcmlmeSB0aGF0IHdlIGdvdCBhbiBleGFjdCBtYXRjaC4gICovCisgICAgICB0ZW0gPSBjb21uYW1lK0hPT0tfTEVOOworICAgICAgaG9va2MgPSBsb29rdXBfY21kICgmdGVtLCBjbWRsaXN0LCAiIiwgLTEsIDApOworICAgICAgaWYgKGhvb2tjICYmICFTVFJFUSAoY29tbmFtZStIT09LX0xFTiwgaG9va2MtPm5hbWUpKQorCWhvb2tjID0gMDsKKyAgICAgIGlmICghaG9va2MpCisJeworCSAgd2FybmluZyAoIllvdXIgbmV3IGAlcycgY29tbWFuZCBkb2VzIG5vdCBob29rIGFueSBleGlzdGluZyBjb21tYW5kLiIsCisJCSAgIGNvbW5hbWUpOworCSAgaWYgKCFxdWVyeSAoIlByb2NlZWQ/ICIpKQorCSAgICBlcnJvciAoIk5vdCBjb25maXJtZWQuIik7CisJfQorICAgIH0KKworICBjb21uYW1lID0gc2F2ZXN0cmluZyAoY29tbmFtZSwgc3RybGVuIChjb21uYW1lKSk7CisKKyAgLyogSWYgdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmRzIHdpbGwgYmUgY2FzZSBpbnNlbnNpdGl2ZSwgdGhpcyBvbmUKKyAgICAgc2hvdWxkIGJlaGF2ZSBpbiB0aGUgc2FtZSBtYW5uZXIuICovCisgIGZvciAodGVtID0gY29tbmFtZTsgKnRlbTsgdGVtKyspCisgICAgaWYgKGlzdXBwZXIoKnRlbSkpICp0ZW0gPSB0b2xvd2VyKCp0ZW0pOworCisgIGNvbnRyb2xfbGV2ZWwgPSAwOworICBzcHJpbnRmICh0bXBidWYsICJUeXBlIGNvbW1hbmRzIGZvciBkZWZpbml0aW9uIG9mIFwiJXNcIi4iLCBjb21uYW1lKTsKKyAgY21kcyA9IHJlYWRfY29tbWFuZF9saW5lcyAodG1wYnVmLCBmcm9tX3R0eSk7CisKKyAgaWYgKGMgJiYgYy0+Y2xhc3MgPT0gY2xhc3NfdXNlcikKKyAgICBmcmVlX2NvbW1hbmRfbGluZXMgKCZjLT51c2VyX2NvbW1hbmRzKTsKKworICBuZXdjID0gYWRkX2NtZCAoY29tbmFtZSwgY2xhc3NfdXNlciwgdXNlcl9kZWZpbmVkX2NvbW1hbmQsCisJICAgKGMgJiYgYy0+Y2xhc3MgPT0gY2xhc3NfdXNlcikKKwkgICA/IGMtPmRvYyA6IHNhdmVzdHJpbmcgKCJVc2VyLWRlZmluZWQuIiwgMTMpLCAmY21kbGlzdCk7CisgIG5ld2MtPnVzZXJfY29tbWFuZHMgPSBjbWRzOworCisgIC8qIElmIHRoaXMgbmV3IGNvbW1hbmQgaXMgYSBob29rLCB0aGVuIG1hcmsgYm90aCBjb21tYW5kcyBhcyBiZWluZworICAgICB0aWVkLiAgKi8KKyAgaWYgKGhvb2tjKQorICAgIHsKKyAgICAgIGhvb2tjLT5ob29rID0gbmV3YzsJLyogVGFyZ2V0IGdldHMgaG9va2VkLiAgKi8KKyAgICAgIG5ld2MtPmhvb2tlZSA9IGhvb2tjOwkvKiBXZSBhcmUgbWFya2VkIGFzIGhvb2tpbmcgdGFyZ2V0IGNtZC4gICovCisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZG9jdW1lbnRfY29tbWFuZCAoY29tbmFtZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKmNvbW5hbWU7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgc3RydWN0IGNvbW1hbmRfbGluZSAqZG9jbGluZXM7CisgIHJlZ2lzdGVyIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjOworICBjaGFyICp0ZW0gPSBjb21uYW1lOworICBjaGFyIHRtcGJ1ZlsxMjhdOworCisgIHZhbGlkYXRlX2NvbW5hbWUgKGNvbW5hbWUpOworCisgIGMgPSBsb29rdXBfY21kICgmdGVtLCBjbWRsaXN0LCAiIiwgMCwgMSk7CisKKyAgaWYgKGMtPmNsYXNzICE9IGNsYXNzX3VzZXIpCisgICAgZXJyb3IgKCJDb21tYW5kIFwiJXNcIiBpcyBidWlsdC1pbi4iLCBjb21uYW1lKTsKKworICBzcHJpbnRmICh0bXBidWYsICJUeXBlIGRvY3VtZW50YXRpb24gZm9yIFwiJXNcIi4iLCBjb21uYW1lKTsKKyAgZG9jbGluZXMgPSByZWFkX2NvbW1hbmRfbGluZXMgKHRtcGJ1ZiwgZnJvbV90dHkpOworCisgIGlmIChjLT5kb2MpIGZyZWUgKGMtPmRvYyk7CisKKyAgeworICAgIHJlZ2lzdGVyIHN0cnVjdCBjb21tYW5kX2xpbmUgKmNsMTsKKyAgICByZWdpc3RlciBpbnQgbGVuID0gMDsKKworICAgIGZvciAoY2wxID0gZG9jbGluZXM7IGNsMTsgY2wxID0gY2wxLT5uZXh0KQorICAgICAgbGVuICs9IHN0cmxlbiAoY2wxLT5saW5lKSArIDE7CisKKyAgICBjLT5kb2MgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKKyAgICAqYy0+ZG9jID0gMDsKKworICAgIGZvciAoY2wxID0gZG9jbGluZXM7IGNsMTsgY2wxID0gY2wxLT5uZXh0KQorICAgICAgeworCXN0cmNhdCAoYy0+ZG9jLCBjbDEtPmxpbmUpOworCWlmIChjbDEtPm5leHQpCisJICBzdHJjYXQgKGMtPmRvYywgIlxuIik7CisgICAgICB9CisgIH0KKworICBmcmVlX2NvbW1hbmRfbGluZXMgKCZkb2NsaW5lcyk7Cit9CisMCisvKiBQcmludCB0aGUgR0RCIGJhbm5lci4gKi8KK3ZvaWQKK3ByaW50X2dkYl92ZXJzaW9uIChzdHJlYW0pCisgIEdEQl9GSUxFICpzdHJlYW07Cit7CisgIC8qIEZyb20gR05VIGNvZGluZyBzdGFuZGFyZHMsIGZpcnN0IGxpbmUgaXMgbWVhbnQgdG8gYmUgZWFzeSBmb3IgYQorICAgICBwcm9ncmFtIHRvIHBhcnNlLCBhbmQgaXMganVzdCBjYW5vbmljYWwgcHJvZ3JhbSBuYW1lIGFuZCB2ZXJzaW9uCisgICAgIG51bWJlciwgd2hpY2ggc3RhcnRzIGFmdGVyIGxhc3Qgc3BhY2UuICovCisKKyAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiR05VIGdkYiAlc1xuIiwgdmVyc2lvbik7CisKKyAgLyogU2Vjb25kIGxpbmUgaXMgYSBjb3B5cmlnaHQgbm90aWNlLiAqLworCisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIkNvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIik7CisKKyAgLyogRm9sbG93aW5nIHRoZSBjb3B5cmlnaHQgaXMgYSBicmllZiBzdGF0ZW1lbnQgdGhhdCB0aGUgcHJvZ3JhbSBpcworICAgICBmcmVlIHNvZnR3YXJlLCB0aGF0IHVzZXJzIGFyZSBmcmVlIHRvIGNvcHkgYW5kIGNoYW5nZSBpdCBvbgorICAgICBjZXJ0YWluIGNvbmRpdGlvbnMsIHRoYXQgaXQgaXMgY292ZXJlZCBieSB0aGUgR05VIEdQTCwgYW5kIHRoYXQKKyAgICAgdGhlcmUgaXMgbm8gd2FycmFudHkuICovCisKKyAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiXAorR0RCIGlzIGZyZWUgc29mdHdhcmUsIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhbmQgeW91IGFyZVxuXAord2VsY29tZSB0byBjaGFuZ2UgaXQgYW5kL29yIGRpc3RyaWJ1dGUgY29waWVzIG9mIGl0IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy5cblwKK1R5cGUgXCJzaG93IGNvcHlpbmdcIiB0byBzZWUgdGhlIGNvbmRpdGlvbnMuXG5cCitUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5IGZvciBHREIuICBUeXBlIFwic2hvdyB3YXJyYW50eVwiIGZvciBkZXRhaWxzLlxuIik7CisKKyAgLyogQWZ0ZXIgdGhlIHJlcXVpcmVkIGluZm8gd2UgcHJpbnQgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICovCisKKyAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiVGhpcyBHREIgd2FzIGNvbmZpZ3VyZWQgYXMgXCIiKTsKKyAgaWYgKCFTVFJFUSAoaG9zdF9uYW1lLCB0YXJnZXRfbmFtZSkpCisgICAgeworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiLS1ob3N0PSVzIC0tdGFyZ2V0PSVzIiwgaG9zdF9uYW1lLCB0YXJnZXRfbmFtZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJXMiLCBob3N0X25hbWUpOworICAgIH0KKyAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiXCIuIik7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorc2hvd192ZXJzaW9uIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpbW1lZGlhdGVfcXVpdCsrOworICBwcmludF9nZGJfdmVyc2lvbiAoZ2RiX3N0ZG91dCk7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgIGltbWVkaWF0ZV9xdWl0LS07Cit9CisMCisvKiB4Z2RiIGNhbGxzIHRoaXMgdG8gcmVwcmludCB0aGUgdXN1YWwgR0RCIHByb21wdC4gIE9ic29sZXRlIG5vdyB0aGF0IHhnZGIKKyAgIGlzIG9ic29sZXRlLiAgKi8KKwordm9pZAorcHJpbnRfcHJvbXB0ICgpCit7CisgIHByaW50Zl91bmZpbHRlcmVkICgiJXMiLCBwcm9tcHQpOworICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworfQorCisvKiBUaGlzIHJlcGxhY2VzIHRoZSBhYm92ZSBmb3IgdGhlIGZyb250ZW5kczogaXQgcmV0dXJucyBhIHBvaW50ZXIKKyAgIHRvIHRoZSBwcm9tcHQuICovCitjaGFyICoKK2dldF9wcm9tcHQgKCkKK3sKKyAgcmV0dXJuIHByb21wdDsKK30KKwordm9pZAorc2V0X3Byb21wdCAocykKKyAgICAgY2hhciAqczsKK3sKKy8qID8/cmVocmF1ZXI6IEkgZG9uJ3Qga25vdyB3aHkgdGhpcyBmYWlscywgc2luY2UgaXQgbG9va3MgYXMgdGhvdWdoCisgICBhc3NpZ25tZW50cyB0byBwcm9tcHQgYXJlIHdyYXBwZWQgaW4gY2FsbHMgdG8gc2F2ZXN0cmluZy4uLgorICBpZiAocHJvbXB0ICE9IE5VTEwpCisgICAgZnJlZSAocHJvbXB0KTsKKyovCisgIHByb21wdCA9IHNhdmVzdHJpbmcgKHMsIHN0cmxlbiAocykpOworfQorCisMCisvKiBJZiBuZWNlc3NhcnksIG1ha2UgdGhlIHVzZXIgY29uZmlybSB0aGF0IHdlIHNob3VsZCBxdWl0LiAgUmV0dXJuCisgICBub24temVybyBpZiB3ZSBzaG91bGQgcXVpdCwgemVybyBpZiB3ZSBzaG91bGRuJ3QuICAqLworCitpbnQKK3F1aXRfY29uZmlybSAoKQoreworICBpZiAoaW5mZXJpb3JfcGlkICE9IDAgJiYgdGFyZ2V0X2hhc19leGVjdXRpb24pCisgICAgeworICAgICAgY2hhciAqczsKKworICAgICAgLyogVGhpcyBpcyBzb21ldGhpbmcgb2YgYSBoYWNrLiAgQnV0IHRoZXJlJ3Mgbm8gcmVsaWFibGUgd2F5IHRvCisJIHNlZSBpZiBhIEdVSSBpcyBydW5uaW5nLiAgVGhlIGB1c2Vfd2luZG93cycgdmFyaWFibGUgZG9lc24ndAorCSBjdXQgaXQuICAqLworICAgICAgaWYgKGluaXRfdWlfaG9vaykKKwlzID0gIkEgZGVidWdnaW5nIHNlc3Npb24gaXMgYWN0aXZlLlxuRG8geW91IHN0aWxsIHdhbnQgdG8gY2xvc2UgdGhlIGRlYnVnZ2VyPyI7CisgICAgICBlbHNlIGlmIChhdHRhY2hfZmxhZykKKwlzID0gIlRoZSBwcm9ncmFtIGlzIHJ1bm5pbmcuICBRdWl0IGFueXdheSAoYW5kIGRldGFjaCBpdCk/ICI7CisgICAgICBlbHNlCisJcyA9ICJUaGUgcHJvZ3JhbSBpcyBydW5uaW5nLiAgRXhpdCBhbnl3YXk/ICI7CisKKyAgICAgIGlmICghIHF1ZXJ5IChzKSkKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFF1aXQgd2l0aG91dCBhc2tpbmcgZm9yIGNvbmZpcm1hdGlvbi4gICovCisKK3ZvaWQKK3F1aXRfZm9yY2UgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGludCBleGl0X2NvZGUgPSAwOworCisgIC8qIEFuIG9wdGlvbmFsIGV4cHJlc3Npb24gbWF5IGJlIHVzZWQgdG8gY2F1c2UgZ2RiIHRvIHRlcm1pbmF0ZSB3aXRoIHRoZSAKKyAgICAgdmFsdWUgb2YgdGhhdCBleHByZXNzaW9uLiAqLworICBpZiAoYXJncykKKyAgICB7CisgICAgICB2YWx1ZV9wdHIgdmFsID0gcGFyc2VfYW5kX2V2YWwgKGFyZ3MpOworCisgICAgICBleGl0X2NvZGUgPSAoaW50KSB2YWx1ZV9hc19sb25nICh2YWwpOworICAgIH0KKworICBpZiAoaW5mZXJpb3JfcGlkICE9IDAgJiYgdGFyZ2V0X2hhc19leGVjdXRpb24pCisgICAgeworICAgICAgaWYgKGF0dGFjaF9mbGFnKQorCXRhcmdldF9kZXRhY2ggKGFyZ3MsIGZyb21fdHR5KTsKKyAgICAgIGVsc2UKKwl0YXJnZXRfa2lsbCAoKTsKKyAgICB9CisKKyAgLyogVURJIHdhbnRzIHRoaXMsIHRvIGtpbGwgdGhlIFRJUC4gICovCisgIHRhcmdldF9jbG9zZSAoMSk7CisKKyAgLyogU2F2ZSB0aGUgaGlzdG9yeSBpbmZvcm1hdGlvbiBpZiBpdCBpcyBhcHByb3ByaWF0ZSB0byBkbyBzby4gICovCisgIGlmICh3cml0ZV9oaXN0b3J5X3AgJiYgaGlzdG9yeV9maWxlbmFtZSkKKyAgICB3cml0ZV9oaXN0b3J5IChoaXN0b3J5X2ZpbGVuYW1lKTsKKworICBkb19maW5hbF9jbGVhbnVwcyhBTExfQ0xFQU5VUFMpOwkvKiBEbyBhbnkgZmluYWwgY2xlYW51cHMgYmVmb3JlIGV4aXRpbmcgKi8KKworI2lmIGRlZmluZWQoVFVJKQorICAvKiB0dWlEbygoVHVpT3BhcXVlRnVuY1B0cil0dWlDbGVhblVwKTsgKi8KKyAgLyogVGhlIGFib3ZlIGRvZXMgbm90IG5lZWQgdG8gYmUgaW5zaWRlIGEgdHVpRG8oKSwgc2luY2UKKyAgICogaXQgaXMgbm90IG1hbmlwdWxhdGluZyB0aGUgY3Vyc2VzIHNjcmVlbiwgYnV0IHJhdGhlciwKKyAgICogaXQgaXMgdGVhcmluZyBpdCBkb3duLgorICAgKi8KKyAgaWYgKHR1aV92ZXJzaW9uKQorICAgIHR1aUNsZWFuVXAoKTsKKyNlbmRpZgorCisgIGV4aXQgKGV4aXRfY29kZSk7Cit9CisKKy8qIEhhbmRsZSB0aGUgcXVpdCBjb21tYW5kLiAgKi8KKwordm9pZAorcXVpdF9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAoISBxdWl0X2NvbmZpcm0gKCkpCisgICAgZXJyb3IgKCJOb3QgY29uZmlybWVkLiIpOworICBxdWl0X2ZvcmNlIChhcmdzLCBmcm9tX3R0eSk7Cit9CisKKy8qIFJldHVybnMgd2hldGhlciBHREIgaXMgcnVubmluZyBvbiBhIHRlcm1pbmFsIGFuZCB3aGV0aGVyIHRoZSB1c2VyCisgICBkZXNpcmVzIHRoYXQgcXVlc3Rpb25zIGJlIGFza2VkIG9mIHRoZW0gb24gdGhhdCB0ZXJtaW5hbC4gICovCisKK2ludAoraW5wdXRfZnJvbV90ZXJtaW5hbF9wICgpCit7CisgIHJldHVybiBnZGJfaGFzX2FfdGVybWluYWwgKCkgJiYgKGluc3RyZWFtID09IHN0ZGluKSAmIGNhdXRpb247Cit9CisMCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3B3ZF9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAoYXJncykgZXJyb3IgKCJUaGUgXCJwd2RcIiBjb21tYW5kIGRvZXMgbm90IHRha2UgYW4gYXJndW1lbnQ6ICVzIiwgYXJncyk7CisgIGdldGN3ZCAoZ2RiX2RpcmJ1Ziwgc2l6ZW9mIChnZGJfZGlyYnVmKSk7CisKKyAgaWYgKCFTVFJFUSAoZ2RiX2RpcmJ1ZiwgY3VycmVudF9kaXJlY3RvcnkpKQorICAgIHByaW50Zl91bmZpbHRlcmVkICgiV29ya2luZyBkaXJlY3RvcnkgJXNcbiAoY2Fub25pY2FsbHkgJXMpLlxuIiwKKwkgICAgY3VycmVudF9kaXJlY3RvcnksIGdkYl9kaXJidWYpOworICBlbHNlCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJXb3JraW5nIGRpcmVjdG9yeSAlcy5cbiIsIGN1cnJlbnRfZGlyZWN0b3J5KTsKK30KKwordm9pZAorY2RfY29tbWFuZCAoZGlyLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqZGlyOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGludCBsZW47CisgIC8qIEZvdW5kIHNvbWV0aGluZyBvdGhlciB0aGFuIGxlYWRpbmcgcmVwZXRpdGlvbnMgb2YgIi8uLiIuICAqLworICBpbnQgZm91bmRfcmVhbF9wYXRoOworICBjaGFyICpwOworCisgIC8qIElmIHRoZSBuZXcgZGlyZWN0b3J5IGlzIGFic29sdXRlLCByZXBlYXQgaXMgYSBuby1vcDsgaWYgcmVsYXRpdmUsCisgICAgIHJlcGVhdCBtaWdodCBiZSB1c2VmdWwgYnV0IGlzIG1vcmUgbGlrZWx5IHRvIGJlIGEgbWlzdGFrZS4gICovCisgIGRvbnRfcmVwZWF0ICgpOworCisgIGlmIChkaXIgPT0gMCkKKyAgICBlcnJvcl9ub19hcmcgKCJuZXcgd29ya2luZyBkaXJlY3RvcnkiKTsKKworICBkaXIgPSB0aWxkZV9leHBhbmQgKGRpcik7CisgIG1ha2VfY2xlYW51cCAoZnJlZSwgZGlyKTsKKworICBpZiAoY2hkaXIgKGRpcikgPCAwKQorICAgIHBlcnJvcl93aXRoX25hbWUgKGRpcik7CisKKyAgbGVuID0gc3RybGVuIChkaXIpOworICBkaXIgPSBzYXZlc3RyaW5nIChkaXIsIGxlbiAtIChsZW4gPiAxICYmIFNMQVNIX1AoZGlyW2xlbi0xXSkpKTsKKyAgaWYgKFJPT1RFRF9QKGRpcikpCisgICAgY3VycmVudF9kaXJlY3RvcnkgPSBkaXI7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoU0xBU0hfUCAoY3VycmVudF9kaXJlY3RvcnlbMF0pICYmIGN1cnJlbnRfZGlyZWN0b3J5WzFdID09ICdcMCcpCisJY3VycmVudF9kaXJlY3RvcnkgPSBjb25jYXQgKGN1cnJlbnRfZGlyZWN0b3J5LCBkaXIsIE5VTEwpOworICAgICAgZWxzZQorCWN1cnJlbnRfZGlyZWN0b3J5ID0gY29uY2F0IChjdXJyZW50X2RpcmVjdG9yeSwgU0xBU0hfU1RSSU5HLCBkaXIsIE5VTEwpOworICAgICAgZnJlZSAoZGlyKTsKKyAgICB9CisKKyAgLyogTm93IHNpbXBsaWZ5IGFueSBvY2N1cnJlbmNlcyBvZiBgLicgYW5kIGAuLicgaW4gdGhlIHBhdGhuYW1lLiAgKi8KKworICBmb3VuZF9yZWFsX3BhdGggPSAwOworICBmb3IgKHAgPSBjdXJyZW50X2RpcmVjdG9yeTsgKnA7KQorICAgIHsKKyAgICAgIGlmIChTTEFTSF9QIChwWzBdKSAmJiBwWzFdID09ICcuJyAmJiAocFsyXSA9PSAwIHx8IFNMQVNIX1AgKHBbMl0pKSkKKwlzdHJjcHkgKHAsIHAgKyAyKTsKKyAgICAgIGVsc2UgaWYgKFNMQVNIX1AgKHBbMF0pICYmIHBbMV0gPT0gJy4nICYmIHBbMl0gPT0gJy4nCisJICAgICAgICYmIChwWzNdID09IDAgfHwgU0xBU0hfUCAocFszXSkpKQorCXsKKwkgIGlmIChmb3VuZF9yZWFsX3BhdGgpCisJICAgIHsKKwkgICAgICAvKiBTZWFyY2ggYmFja3dhcmRzIGZvciB0aGUgZGlyZWN0b3J5IGp1c3QgYmVmb3JlIHRoZSAiLy4uIgorCQkgYW5kIG9ibGl0ZXJhdGUgaXQgYW5kIHRoZSAiLy4uIi4gICovCisJICAgICAgY2hhciAqcSA9IHA7CisJICAgICAgd2hpbGUgKHEgIT0gY3VycmVudF9kaXJlY3RvcnkgJiYgISBTTEFTSF9QIChxWy0xXSkpCisJCS0tcTsKKworCSAgICAgIGlmIChxID09IGN1cnJlbnRfZGlyZWN0b3J5KQorCQkvKiBjdXJyZW50X2RpcmVjdG9yeSBpcworCQkgICBhIHJlbGF0aXZlIHBhdGhuYW1lICgiY2FuJ3QgaGFwcGVuIi0tbGVhdmUgaXQgYWxvbmUpLiAgKi8KKwkJKytwOworCSAgICAgIGVsc2UKKwkJeworCQkgIHN0cmNweSAocSAtIDEsIHAgKyAzKTsKKwkJICBwID0gcSAtIDE7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICAvKiBXZSBhcmUgZGVhbGluZyB3aXRoIGxlYWRpbmcgcmVwZXRpdGlvbnMgb2YgIi8uLiIsIGZvciBleGFtcGxlCisJICAgICAgICIvLi4vLi4iLCB3aGljaCBpcyB0aGUgTWFjaCBzdXBlci1yb290LiAgKi8KKwkgICAgcCArPSAzOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBmb3VuZF9yZWFsX3BhdGggPSAxOworCSAgKytwOworCX0KKyAgICB9CisKKyAgZm9yZ2V0X2NhY2hlZF9zb3VyY2VfaW5mbyAoKTsKKworICBpZiAoZnJvbV90dHkpCisgICAgcHdkX2NvbW1hbmQgKChjaGFyICopIDAsIDEpOworfQorDAorc3RydWN0IHNvdXJjZV9jbGVhbnVwX2xpbmVzX2FyZ3MgeworICBpbnQgb2xkX2xpbmU7CisgIGNoYXIgKm9sZF9maWxlOworICBjaGFyICpvbGRfcHJlX2Vycm9yOworICBjaGFyICpvbGRfZXJyb3JfcHJlX3ByaW50OworfTsKKworc3RhdGljIHZvaWQKK3NvdXJjZV9jbGVhbnVwX2xpbmVzIChhcmdzKQorICAgICBQVFIgYXJnczsKK3sKKyAgc3RydWN0IHNvdXJjZV9jbGVhbnVwX2xpbmVzX2FyZ3MgKnAgPQorICAgIChzdHJ1Y3Qgc291cmNlX2NsZWFudXBfbGluZXNfYXJncyAqKWFyZ3M7CisgIHNvdXJjZV9saW5lX251bWJlciA9IHAtPm9sZF9saW5lOworICBzb3VyY2VfZmlsZV9uYW1lID0gcC0+b2xkX2ZpbGU7CisgIHNvdXJjZV9wcmVfZXJyb3IgPSBwLT5vbGRfcHJlX2Vycm9yOworICBlcnJvcl9wcmVfcHJpbnQgPSBwLT5vbGRfZXJyb3JfcHJlX3ByaW50OworfQorCisvKiBBUkdTVVNFRCAqLwordm9pZAorc291cmNlX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIEZJTEUgKnN0cmVhbTsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jbGVhbnVwczsKKyAgY2hhciAqZmlsZSA9IGFyZ3M7CisgIHN0cnVjdCBzb3VyY2VfY2xlYW51cF9saW5lc19hcmdzIG9sZF9saW5lczsKKyAgaW50IG5lZWRlZF9sZW5ndGg7CisKKyAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBlcnJvciAoInNvdXJjZSBjb21tYW5kIHJlcXVpcmVzIHBhdGhuYW1lIG9mIGZpbGUgdG8gc291cmNlLiIpOworICAgIH0KKworICBmaWxlID0gdGlsZGVfZXhwYW5kIChmaWxlKTsKKyAgb2xkX2NsZWFudXBzID0gbWFrZV9jbGVhbnVwIChmcmVlLCBmaWxlKTsKKworICBzdHJlYW0gPSBmb3BlbiAoZmlsZSwgRk9QRU5fUlQpOworICBpZiAoIXN0cmVhbSkKKyAgICBpZiAoZnJvbV90dHkpCisgICAgICBwZXJyb3Jfd2l0aF9uYW1lIChmaWxlKTsKKyAgICBlbHNlCisgICAgICByZXR1cm47CisKKyAgbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZjbG9zZSwgc3RyZWFtKTsKKworICBvbGRfbGluZXMub2xkX2xpbmUgPSBzb3VyY2VfbGluZV9udW1iZXI7CisgIG9sZF9saW5lcy5vbGRfZmlsZSA9IHNvdXJjZV9maWxlX25hbWU7CisgIG9sZF9saW5lcy5vbGRfcHJlX2Vycm9yID0gc291cmNlX3ByZV9lcnJvcjsKKyAgb2xkX2xpbmVzLm9sZF9lcnJvcl9wcmVfcHJpbnQgPSBlcnJvcl9wcmVfcHJpbnQ7CisgIG1ha2VfY2xlYW51cCAoc291cmNlX2NsZWFudXBfbGluZXMsICZvbGRfbGluZXMpOworICBzb3VyY2VfbGluZV9udW1iZXIgPSAwOworICBzb3VyY2VfZmlsZV9uYW1lID0gZmlsZTsKKyAgc291cmNlX3ByZV9lcnJvciA9IGVycm9yX3ByZV9wcmludCA9PSBOVUxMID8gIiIgOiBlcnJvcl9wcmVfcHJpbnQ7CisgIHNvdXJjZV9wcmVfZXJyb3IgPSBzYXZlc3RyaW5nIChzb3VyY2VfcHJlX2Vycm9yLCBzdHJsZW4gKHNvdXJjZV9wcmVfZXJyb3IpKTsKKyAgbWFrZV9jbGVhbnVwIChmcmVlLCBzb3VyY2VfcHJlX2Vycm9yKTsKKyAgLyogVGhpcyB3aWxsIGdldCBzZXQgZXZlcnkgdGltZSB3ZSByZWFkIGEgbGluZS4gIFNvIGl0IHdvbid0IHN0YXkgIiIgZm9yCisgICAgIGxvbmcuICAqLworICBlcnJvcl9wcmVfcHJpbnQgPSAiIjsKKworICBuZWVkZWRfbGVuZ3RoID0gc3RybGVuIChzb3VyY2VfZmlsZV9uYW1lKSArIHN0cmxlbiAoc291cmNlX3ByZV9lcnJvcikgKyA4MDsKKyAgaWYgKHNvdXJjZV9lcnJvcl9hbGxvY2F0ZWQgPCBuZWVkZWRfbGVuZ3RoKQorICAgIHsKKyAgICAgIHNvdXJjZV9lcnJvcl9hbGxvY2F0ZWQgKj0gMjsKKyAgICAgIGlmIChzb3VyY2VfZXJyb3JfYWxsb2NhdGVkIDwgbmVlZGVkX2xlbmd0aCkKKwlzb3VyY2VfZXJyb3JfYWxsb2NhdGVkID0gbmVlZGVkX2xlbmd0aDsKKyAgICAgIGlmIChzb3VyY2VfZXJyb3IgPT0gTlVMTCkKKwlzb3VyY2VfZXJyb3IgPSB4bWFsbG9jIChzb3VyY2VfZXJyb3JfYWxsb2NhdGVkKTsKKyAgICAgIGVsc2UKKwlzb3VyY2VfZXJyb3IgPSB4cmVhbGxvYyAoc291cmNlX2Vycm9yLCBzb3VyY2VfZXJyb3JfYWxsb2NhdGVkKTsKKyAgICB9CisKKyAgcmVhZF9jb21tYW5kX2ZpbGUgKHN0cmVhbSk7CisKKyAgZG9fY2xlYW51cHMgKG9sZF9jbGVhbnVwcyk7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorZWNob19jb21tYW5kICh0ZXh0LCBmcm9tX3R0eSkKKyAgICAgY2hhciAqdGV4dDsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjaGFyICpwID0gdGV4dDsKKyAgcmVnaXN0ZXIgaW50IGM7CisKKyAgaWYgKHRleHQpCisgICAgd2hpbGUgKChjID0gKnArKykgIT0gJ1wwJykKKyAgICAgIHsKKwlpZiAoYyA9PSAnXFwnKQorCSAgeworCSAgICAvKiBcIGF0IGVuZCBvZiBhcmd1bWVudCBpcyB1c2VkIGFmdGVyIHNwYWNlcworCSAgICAgICBzbyB0aGV5IHdvbid0IGJlIGxvc3QuICAqLworCSAgICBpZiAoKnAgPT0gMCkKKwkgICAgICByZXR1cm47CisKKwkgICAgYyA9IHBhcnNlX2VzY2FwZSAoJnApOworCSAgICBpZiAoYyA+PSAwKQorCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiVjIiwgYyk7CisJICB9CisJZWxzZQorCSAgcHJpbnRmX2ZpbHRlcmVkICgiJWMiLCBjKTsKKyAgICAgIH0KKworICAvKiBGb3JjZSB0aGlzIG91dHB1dCB0byBhcHBlYXIgbm93LiAgKi8KKyAgd3JhcF9oZXJlICgiIik7CisgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7Cit9CisKKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZAorZG9udF9yZXBlYXRfY29tbWFuZCAoaWdub3JlZCwgZnJvbV90dHkpCisgICAgIGNoYXIgKmlnbm9yZWQ7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgKmxpbmUgPSAwOwkJLyogQ2FuJ3QgY2FsbCBkb250X3JlcGVhdCBoZXJlIGJlY2F1c2Ugd2UncmUgbm90CisJCQkgICBuZWNlc3NhcmlseSByZWFkaW5nIGZyb20gc3RkaW4uICAqLworfQorDAorLyogRnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgY29tbWFuZCBsaW5lIGVkaXRpbmcgY29udHJvbCB2YXJpYWJsZXMuICAqLworCisvKiBOdW1iZXIgb2YgY29tbWFuZHMgdG8gcHJpbnQgaW4gZWFjaCBjYWxsIHRvIHNob3dfY29tbWFuZHMuICAqLworI2RlZmluZSBIaXN0X3ByaW50IDEwCitzdGF0aWMgdm9pZAorc2hvd19jb21tYW5kcyAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgLyogSW5kZXggZm9yIGhpc3RvcnkgY29tbWFuZHMuICBSZWxhdGl2ZSB0byBoaXN0b3J5X2Jhc2UuICAqLworICBpbnQgb2Zmc2V0OworCisgIC8qIE51bWJlciBvZiB0aGUgaGlzdG9yeSBlbnRyeSB3aGljaCB3ZSBhcmUgcGxhbm5pbmcgdG8gZGlzcGxheSBuZXh0LgorICAgICBSZWxhdGl2ZSB0byBoaXN0b3J5X2Jhc2UuICAqLworICBzdGF0aWMgaW50IG51bSA9IDA7CisKKyAgLyogVGhlIGZpcnN0IGNvbW1hbmQgaW4gdGhlIGhpc3Rvcnkgd2hpY2ggZG9lc24ndCBleGlzdCAoaS5lLiBvbmUgbW9yZQorICAgICB0aGFuIHRoZSBudW1iZXIgb2YgdGhlIGxhc3QgY29tbWFuZCkuICBSZWxhdGl2ZSB0byBoaXN0b3J5X2Jhc2UuICAqLworICBpbnQgaGlzdF9sZW47CisKKyAgZXh0ZXJuIEhJU1RfRU5UUlkgKmhpc3RvcnlfZ2V0IFBBUkFNUyAoKGludCkpOworCisgIC8qIFByaW50IG91dCBzb21lIG9mIHRoZSBjb21tYW5kcyBmcm9tIHRoZSBjb21tYW5kIGhpc3RvcnkuICAqLworICAvKiBGaXJzdCBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgaGlzdG9yeSBsaXN0LiAgKi8KKyAgaGlzdF9sZW4gPSBoaXN0b3J5X3NpemU7CisgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgaGlzdG9yeV9zaXplOyBvZmZzZXQrKykKKyAgICB7CisgICAgICBpZiAoIWhpc3RvcnlfZ2V0IChoaXN0b3J5X2Jhc2UgKyBvZmZzZXQpKQorCXsKKwkgIGhpc3RfbGVuID0gb2Zmc2V0OworCSAgYnJlYWs7CisJfQorICAgIH0KKworICBpZiAoYXJncykKKyAgICB7CisgICAgICBpZiAoYXJnc1swXSA9PSAnKycgJiYgYXJnc1sxXSA9PSAnXDAnKQorCS8qICJpbmZvIGVkaXRpbmcgKyIgc2hvdWxkIHByaW50IGZyb20gdGhlIHN0b3JlZCBwb3NpdGlvbi4gICovCisJOworICAgICAgZWxzZQorCS8qICJpbmZvIGVkaXRpbmcgPGV4cD4iIHNob3VsZCBwcmludCBhcm91bmQgY29tbWFuZCBudW1iZXIgPGV4cD4uICAqLworCW51bSA9IChwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIChhcmdzKSAtIGhpc3RvcnlfYmFzZSkgLSBIaXN0X3ByaW50IC8gMjsKKyAgICB9CisgIC8qICJzaG93IGNvbW1hbmRzIiBtZWFucyBwcmludCB0aGUgbGFzdCBIaXN0X3ByaW50IGNvbW1hbmRzLiAgKi8KKyAgZWxzZQorICAgIHsKKyAgICAgIG51bSA9IGhpc3RfbGVuIC0gSGlzdF9wcmludDsKKyAgICB9CisKKyAgaWYgKG51bSA8IDApCisgICAgbnVtID0gMDsKKworICAvKiBJZiB0aGVyZSBhcmUgYXQgbGVhc3QgSGlzdF9wcmludCBjb21tYW5kcywgd2Ugd2FudCB0byBkaXNwbGF5IHRoZSBsYXN0CisgICAgIEhpc3RfcHJpbnQgcmF0aGVyIHRoYW4sIHNheSwgdGhlIGxhc3QgNi4gICovCisgIGlmIChoaXN0X2xlbiAtIG51bSA8IEhpc3RfcHJpbnQpCisgICAgeworICAgICAgbnVtID0gaGlzdF9sZW4gLSBIaXN0X3ByaW50OworICAgICAgaWYgKG51bSA8IDApCisJbnVtID0gMDsKKyAgICB9CisKKyAgZm9yIChvZmZzZXQgPSBudW07IG9mZnNldCA8IG51bSArIEhpc3RfcHJpbnQgJiYgb2Zmc2V0IDwgaGlzdF9sZW47IG9mZnNldCsrKQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiU1ZCAgJXNcbiIsIGhpc3RvcnlfYmFzZSArIG9mZnNldCwKKwkgICAgICAoaGlzdG9yeV9nZXQgKGhpc3RvcnlfYmFzZSArIG9mZnNldCkpLT5saW5lKTsKKyAgICB9CisKKyAgLyogVGhlIG5leHQgY29tbWFuZCB3ZSB3YW50IHRvIGRpc3BsYXkgaXMgdGhlIG5leHQgb25lIHRoYXQgd2UgaGF2ZW4ndAorICAgICBkaXNwbGF5ZWQgeWV0LiAgKi8KKyAgbnVtICs9IEhpc3RfcHJpbnQ7CisKKyAgLyogSWYgdGhlIHVzZXIgcmVwZWF0cyB0aGlzIGNvbW1hbmQgd2l0aCByZXR1cm4sIGl0IHNob3VsZCBkbyB3aGF0CisgICAgICJzaG93IGNvbW1hbmRzICsiIGRvZXMuICBUaGlzIGlzIHVubmVjZXNzYXJ5IGlmIGFyZyBpcyBudWxsLAorICAgICBiZWNhdXNlICJzaG93IGNvbW1hbmRzICsiIGlzIG5vdCB1c2VmdWwgYWZ0ZXIgInNob3cgY29tbWFuZHMiLiAgKi8KKyAgaWYgKGZyb21fdHR5ICYmIGFyZ3MpCisgICAgeworICAgICAgYXJnc1swXSA9ICcrJzsKKyAgICAgIGFyZ3NbMV0gPSAnXDAnOworICAgIH0KK30KKworLyogQ2FsbGVkIGJ5IGRvX3NldHNob3dfY29tbWFuZC4gICovCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3NldF9oaXN0b3J5X3NpemVfY29tbWFuZCAoYXJncywgZnJvbV90dHksIGMpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKKyAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7Cit7CisgIGlmIChoaXN0b3J5X3NpemUgPT0gSU5UX01BWCkKKyAgICB1bnN0aWZsZV9oaXN0b3J5ICgpOworICBlbHNlIGlmIChoaXN0b3J5X3NpemUgPj0gMCkKKyAgICBzdGlmbGVfaGlzdG9yeSAoaGlzdG9yeV9zaXplKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGhpc3Rvcnlfc2l6ZSA9IElOVF9NQVg7CisgICAgICBlcnJvciAoIkhpc3Rvcnkgc2l6ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpOworICAgIH0KK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitzZXRfaGlzdG9yeSAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcInNldCBoaXN0b3J5XCIgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiBhIGhpc3Rvcnkgc3ViY29tbWFuZC5cbiIpOworICBoZWxwX2xpc3QgKHNldGhpc3RsaXN0LCAic2V0IGhpc3RvcnkgIiwgLTEsIGdkYl9zdGRvdXQpOworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3Nob3dfaGlzdG9yeSAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgY21kX3Nob3dfbGlzdCAoc2hvd2hpc3RsaXN0LCBmcm9tX3R0eSwgIiIpOworfQorCitpbnQgaW5mb192ZXJib3NlID0gMDsJCS8qIERlZmF1bHQgdmVyYm9zZSBtc2dzIG9mZiAqLworCisvKiBDYWxsZWQgYnkgZG9fc2V0c2hvd19jb21tYW5kLiAgQW4gZWxhYm9yYXRlIGpva2UuICAqLworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitzZXRfdmVyYm9zZSAoYXJncywgZnJvbV90dHksIGMpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKKyAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7Cit7CisgIGNoYXIgKmNtZG5hbWUgPSAidmVyYm9zZSI7CisgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpzaG93Y21kOworCisgIHNob3djbWQgPSBsb29rdXBfY21kXzEgKCZjbWRuYW1lLCBzaG93bGlzdCwgTlVMTCwgMSk7CisKKyAgaWYgKGluZm9fdmVyYm9zZSkKKyAgICB7CisgICAgICBjLT5kb2MgPSAiU2V0IHZlcmJvc2UgcHJpbnRpbmcgb2YgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4iOworICAgICAgc2hvd2NtZC0+ZG9jID0gIlNob3cgdmVyYm9zZSBwcmludGluZyBvZiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLiI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYy0+ZG9jID0gIlNldCB2ZXJib3NpdHkuIjsKKyAgICAgIHNob3djbWQtPmRvYyA9ICJTaG93IHZlcmJvc2l0eS4iOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2Zsb2F0X2hhbmRsZXIgKHNpZ25vKQoraW50IHNpZ25vOworeworICAvKiBUaGlzIG1lc3NhZ2UgaXMgYmFzZWQgb24gQU5TSSBDLCBzZWN0aW9uIDQuNy4gIE5vdGUgdGhhdCBpbnRlZ2VyCisgICAgIGRpdmlkZSBieSB6ZXJvIGNhdXNlcyB0aGlzLCBzbyAiZmxvYXQiIGlzIGEgbWlzbm9tZXIuICAqLworICBzaWduYWwgKFNJR0ZQRSwgZmxvYXRfaGFuZGxlcik7CisgIGVycm9yICgiRXJyb25lb3VzIGFyaXRobWV0aWMgb3BlcmF0aW9uLiIpOworfQorCisMCitzdGF0aWMgdm9pZAoraW5pdF9jbWRfbGlzdHMgKCkKK3sKKyAgY21kbGlzdCA9IE5VTEw7CisgIGluZm9saXN0ID0gTlVMTDsKKyAgZW5hYmxlbGlzdCA9IE5VTEw7CisgIGRpc2FibGVsaXN0ID0gTlVMTDsKKyAgdG9nZ2xlbGlzdCA9IE5VTEw7CisgIHN0b3BsaXN0ID0gTlVMTDsKKyAgZGVsZXRlbGlzdCA9IE5VTEw7CisgIGVuYWJsZWJyZWFrbGlzdCA9IE5VTEw7CisgIHNldGxpc3QgPSBOVUxMOworICB1bnNldGxpc3QgPSBOVUxMOworICBzaG93bGlzdCA9IE5VTEw7CisgIHNldGhpc3RsaXN0ID0gTlVMTDsKKyAgc2hvd2hpc3RsaXN0ID0gTlVMTDsKKyAgdW5zZXRoaXN0bGlzdCA9IE5VTEw7CisjaWYgTUFJTlRFTkFOQ0VfQ01EUworICBtYWludGVuYW5jZWxpc3QgPSBOVUxMOworICBtYWludGVuYW5jZWluZm9saXN0ID0gTlVMTDsKKyAgbWFpbnRlbmFuY2VwcmludGxpc3QgPSBOVUxMOworI2VuZGlmCisgIHNldHByaW50bGlzdCA9IE5VTEw7CisgIHNob3dwcmludGxpc3QgPSBOVUxMOworICBzZXRjaGVja2xpc3QgPSBOVUxMOworICBzaG93Y2hlY2tsaXN0ID0gTlVMTDsKK30KKworLyogSW5pdCB0aGUgaGlzdG9yeSBidWZmZXIuICBOb3RlIHRoYXQgd2UgYXJlIGNhbGxlZCBhZnRlciB0aGUgaW5pdCBmaWxlKHMpCisgKiBoYXZlIGJlZW4gcmVhZCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBjaGFuZ2UgdGhlIGhpc3RvcnkgZmlsZSB2aWEgaGlzCisgKiAuZ2RiaW5pdCBmaWxlIChmb3IgaW5zdGFuY2UpLiAgVGhlIEdEQkhJU1RGSUxFIGVudmlyb25tZW50IHZhcmlhYmxlCisgKiBvdmVycmlkZXMgYWxsIG9mIHRoaXMuCisgKi8KKwordm9pZAoraW5pdF9oaXN0b3J5KCkKK3sKKyAgY2hhciAqdG1wZW52OworCisgIHRtcGVudiA9IGdldGVudiAoIkhJU1RTSVpFIik7CisgIGlmICh0bXBlbnYpCisgICAgaGlzdG9yeV9zaXplID0gYXRvaSAodG1wZW52KTsKKyAgZWxzZSBpZiAoIWhpc3Rvcnlfc2l6ZSkKKyAgICBoaXN0b3J5X3NpemUgPSAyNTY7CisKKyAgc3RpZmxlX2hpc3RvcnkgKGhpc3Rvcnlfc2l6ZSk7CisKKyAgdG1wZW52ID0gZ2V0ZW52ICgiR0RCSElTVEZJTEUiKTsKKyAgaWYgKHRtcGVudikKKyAgICBoaXN0b3J5X2ZpbGVuYW1lID0gc2F2ZXN0cmluZyAodG1wZW52LCBzdHJsZW4odG1wZW52KSk7CisgIGVsc2UgaWYgKCFoaXN0b3J5X2ZpbGVuYW1lKSB7CisgICAgLyogV2UgaW5jbHVkZSB0aGUgY3VycmVudCBkaXJlY3Rvcnkgc28gdGhhdCBpZiB0aGUgdXNlciBjaGFuZ2VzCisgICAgICAgZGlyZWN0b3JpZXMgdGhlIGZpbGUgd3JpdHRlbiB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBvbmUKKyAgICAgICB0aGF0IHdhcyByZWFkLiAgKi8KKyAgICBoaXN0b3J5X2ZpbGVuYW1lID0gY29uY2F0IChjdXJyZW50X2RpcmVjdG9yeSwgIi8uZ2RiX2hpc3RvcnkiLCBOVUxMKTsKKyAgfQorICByZWFkX2hpc3RvcnkgKGhpc3RvcnlfZmlsZW5hbWUpOworfQorCitzdGF0aWMgdm9pZAoraW5pdF9tYWluICgpCit7CisgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjOworCisjaWZkZWYgREVGQVVMVF9QUk9NUFQKKyAgcHJvbXB0ID0gc2F2ZXN0cmluZyAoREVGQVVMVF9QUk9NUFQsIHN0cmxlbihERUZBVUxUX1BST01QVCkpOworI2Vsc2UKKyAgcHJvbXB0ID0gc2F2ZXN0cmluZyAoIihnZGIpICIsIDYpOworI2VuZGlmCisKKyAgLyogU2V0IHRoZSBpbXBvcnRhbnQgc3R1ZmYgdXAgZm9yIGNvbW1hbmQgZWRpdGluZy4gICovCisgIGNvbW1hbmRfZWRpdGluZ19wID0gMTsKKyAgaGlzdG9yeV9leHBhbnNpb25fcCA9IDA7CisgIHdyaXRlX2hpc3RvcnlfcCA9IDA7CisKKyAgLyogU2V0dXAgaW1wb3J0YW50IHN0dWZmIGZvciBjb21tYW5kIGxpbmUgZWRpdGluZy4gICovCisgIHJsX2NvbXBsZXRpb25fZW50cnlfZnVuY3Rpb24gPSAoaW50ICgqKSgpKSByZWFkbGluZV9saW5lX2NvbXBsZXRpb25fZnVuY3Rpb247CisgIHJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMgPSBnZGJfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVyczsKKyAgcmxfY29tcGxldGVyX3F1b3RlX2NoYXJhY3RlcnMgPSBnZGJfY29tcGxldGVyX3F1b3RlX2NoYXJhY3RlcnM7CisgIHJsX3JlYWRsaW5lX25hbWUgPSAiZ2RiIjsKKworICAvKiBEZWZpbmUgdGhlIGNsYXNzZXMgb2YgY29tbWFuZHMuCisgICAgIFRoZXkgd2lsbCBhcHBlYXIgaW4gdGhlIGhlbHAgbGlzdCBpbiB0aGUgcmV2ZXJzZSBvZiB0aGlzIG9yZGVyLiAgKi8KKworICBhZGRfY21kICgiaW50ZXJuYWxzIiwgY2xhc3NfbWFpbnRlbmFuY2UsIE5PX0ZVTkNUSU9OLAorCSAgICJNYWludGVuYW5jZSBjb21tYW5kcy5cblwKK1NvbWUgZ2RiIGNvbW1hbmRzIGFyZSBwcm92aWRlZCBqdXN0IGZvciB1c2UgYnkgZ2RiIG1haW50YWluZXJzLlxuXAorVGhlc2UgY29tbWFuZHMgYXJlIHN1YmplY3QgdG8gZnJlcXVlbnQgY2hhbmdlLCBhbmQgbWF5IG5vdCBiZSBhc1xuXAord2VsbCBkb2N1bWVudGVkIGFzIHVzZXIgY29tbWFuZHMuIiwKKwkgICAmY21kbGlzdCk7CisgIGFkZF9jbWQgKCJvYnNjdXJlIiwgY2xhc3Nfb2JzY3VyZSwgTk9fRlVOQ1RJT04sICJPYnNjdXJlIGZlYXR1cmVzLiIsICZjbWRsaXN0KTsKKyAgYWRkX2NtZCAoImFsaWFzZXMiLCBjbGFzc19hbGlhcywgTk9fRlVOQ1RJT04sICJBbGlhc2VzIG9mIG90aGVyIGNvbW1hbmRzLiIsICZjbWRsaXN0KTsKKyAgYWRkX2NtZCAoInVzZXItZGVmaW5lZCIsIGNsYXNzX3VzZXIsIE5PX0ZVTkNUSU9OLCAiVXNlci1kZWZpbmVkIGNvbW1hbmRzLlxuXAorVGhlIGNvbW1hbmRzIGluIHRoaXMgY2xhc3MgYXJlIHRob3NlIGRlZmluZWQgYnkgdGhlIHVzZXIuXG5cCitVc2UgdGhlIFwiZGVmaW5lXCIgY29tbWFuZCB0byBkZWZpbmUgYSBjb21tYW5kLiIsICZjbWRsaXN0KTsKKyAgYWRkX2NtZCAoInN1cHBvcnQiLCBjbGFzc19zdXBwb3J0LCBOT19GVU5DVElPTiwgIlN1cHBvcnQgZmFjaWxpdGllcy4iLCAmY21kbGlzdCk7CisgIGlmICghZGJ4X2NvbW1hbmRzKQorICAgIGFkZF9jbWQgKCJzdGF0dXMiLCBjbGFzc19pbmZvLCBOT19GVU5DVElPTiwgIlN0YXR1cyBpbnF1aXJpZXMuIiwgJmNtZGxpc3QpOworICBhZGRfY21kICgiZmlsZXMiLCBjbGFzc19maWxlcywgTk9fRlVOQ1RJT04sICJTcGVjaWZ5aW5nIGFuZCBleGFtaW5pbmcgZmlsZXMuIiwgJmNtZGxpc3QpOworICBhZGRfY21kICgiYnJlYWtwb2ludHMiLCBjbGFzc19icmVha3BvaW50LCBOT19GVU5DVElPTiwgIk1ha2luZyBwcm9ncmFtIHN0b3AgYXQgY2VydGFpbiBwb2ludHMuIiwgJmNtZGxpc3QpOworICBhZGRfY21kICgiZGF0YSIsIGNsYXNzX3ZhcnMsIE5PX0ZVTkNUSU9OLCAiRXhhbWluaW5nIGRhdGEuIiwgJmNtZGxpc3QpOworICBhZGRfY21kICgic3RhY2siLCBjbGFzc19zdGFjaywgTk9fRlVOQ1RJT04sICJFeGFtaW5pbmcgdGhlIHN0YWNrLlxuXAorVGhlIHN0YWNrIGlzIG1hZGUgdXAgb2Ygc3RhY2sgZnJhbWVzLiAgR2RiIGFzc2lnbnMgbnVtYmVycyB0byBzdGFjayBmcmFtZXNcblwKK2NvdW50aW5nIGZyb20gemVybyBmb3IgdGhlIGlubmVybW9zdCAoY3VycmVudGx5IGV4ZWN1dGluZykgZnJhbWUuXG5cblwKK0F0IGFueSB0aW1lIGdkYiBpZGVudGlmaWVzIG9uZSBmcmFtZSBhcyB0aGUgXCJzZWxlY3RlZFwiIGZyYW1lLlxuXAorVmFyaWFibGUgbG9va3VwcyBhcmUgZG9uZSB3aXRoIHJlc3BlY3QgdG8gdGhlIHNlbGVjdGVkIGZyYW1lLlxuXAorV2hlbiB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZCBzdG9wcywgZ2RiIHNlbGVjdHMgdGhlIGlubmVybW9zdCBmcmFtZS5cblwKK1RoZSBjb21tYW5kcyBiZWxvdyBjYW4gYmUgdXNlZCB0byBzZWxlY3Qgb3RoZXIgZnJhbWVzIGJ5IG51bWJlciBvciBhZGRyZXNzLiIsCisJICAgJmNtZGxpc3QpOworICBhZGRfY21kICgicnVubmluZyIsIGNsYXNzX3J1biwgTk9fRlVOQ1RJT04sICJSdW5uaW5nIHRoZSBwcm9ncmFtLiIsICZjbWRsaXN0KTsKKworICBhZGRfY29tICgicHdkIiwgY2xhc3NfZmlsZXMsIHB3ZF9jb21tYW5kLAorCSAgICJQcmludCB3b3JraW5nIGRpcmVjdG9yeS4gIFRoaXMgaXMgdXNlZCBmb3IgeW91ciBwcm9ncmFtIGFzIHdlbGwuIik7CisgIGMgPSBhZGRfY21kICgiY2QiLCBjbGFzc19maWxlcywgY2RfY29tbWFuZCwKKwkgICAiU2V0IHdvcmtpbmcgZGlyZWN0b3J5IHRvIERJUiBmb3IgZGVidWdnZXIgYW5kIHByb2dyYW0gYmVpbmcgZGVidWdnZWQuXG5cCitUaGUgY2hhbmdlIGRvZXMgbm90IHRha2UgZWZmZWN0IGZvciB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZFxuXAordW50aWwgdGhlIG5leHQgdGltZSBpdCBpcyBzdGFydGVkLiIsICZjbWRsaXN0KTsKKyAgYy0+Y29tcGxldGVyID0gZmlsZW5hbWVfY29tcGxldGVyOworCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgicHJvbXB0IiwgY2xhc3Nfc3VwcG9ydCwgdmFyX3N0cmluZywgKGNoYXIgKikmcHJvbXB0LAorCSAgICJTZXQgZ2RiJ3MgcHJvbXB0IiwKKwkgICAmc2V0bGlzdCksCisgICAgICZzaG93bGlzdCk7CisKKyAgYWRkX2NvbSAoImVjaG8iLCBjbGFzc19zdXBwb3J0LCBlY2hvX2NvbW1hbmQsCisJICAgIlByaW50IGEgY29uc3RhbnQgc3RyaW5nLiAgR2l2ZSBzdHJpbmcgYXMgYXJndW1lbnQuXG5cCitDIGVzY2FwZSBzZXF1ZW5jZXMgbWF5IGJlIHVzZWQgaW4gdGhlIGFyZ3VtZW50LlxuXAorTm8gbmV3bGluZSBpcyBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBhcmd1bWVudDtcblwKK3VzZSBcIlxcblwiIGlmIHlvdSB3YW50IGEgbmV3bGluZSB0byBiZSBwcmludGVkLlxuXAorU2luY2UgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBhcmUgaWdub3JlZCBpbiBjb21tYW5kIGFyZ3VtZW50cyxcblwKK2lmIHlvdSB3YW50IHRvIHByaW50IHNvbWUgeW91IG11c3QgdXNlIFwiXFxcIiBiZWZvcmUgbGVhZGluZyB3aGl0ZXNwYWNlXG5cCit0byBiZSBwcmludGVkIG9yIGFmdGVyIHRyYWlsaW5nIHdoaXRlc3BhY2UuIik7CisgIGFkZF9jb20gKCJkb2N1bWVudCIsIGNsYXNzX3N1cHBvcnQsIGRvY3VtZW50X2NvbW1hbmQsCisJICAgIkRvY3VtZW50IGEgdXNlci1kZWZpbmVkIGNvbW1hbmQuXG5cCitHaXZlIGNvbW1hbmQgbmFtZSBhcyBhcmd1bWVudC4gIEdpdmUgZG9jdW1lbnRhdGlvbiBvbiBmb2xsb3dpbmcgbGluZXMuXG5cCitFbmQgd2l0aCBhIGxpbmUgb2YganVzdCBcImVuZFwiLiIpOworICBhZGRfY29tICgiZGVmaW5lIiwgY2xhc3Nfc3VwcG9ydCwgZGVmaW5lX2NvbW1hbmQsCisJICAgIkRlZmluZSBhIG5ldyBjb21tYW5kIG5hbWUuICBDb21tYW5kIG5hbWUgaXMgYXJndW1lbnQuXG5cCitEZWZpbml0aW9uIGFwcGVhcnMgb24gZm9sbG93aW5nIGxpbmVzLCBvbmUgY29tbWFuZCBwZXIgbGluZS5cblwKK0VuZCB3aXRoIGEgbGluZSBvZiBqdXN0IFwiZW5kXCIuXG5cCitVc2UgdGhlIFwiZG9jdW1lbnRcIiBjb21tYW5kIHRvIGdpdmUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIG5ldyBjb21tYW5kLlxuXAorQ29tbWFuZHMgZGVmaW5lZCBpbiB0aGlzIHdheSBtYXkgaGF2ZSB1cCB0byB0ZW4gYXJndW1lbnRzLiIpOworCisjaWZkZWYgX19TVERDX18KKyAgYyA9IGFkZF9jbWQgKCJzb3VyY2UiLCBjbGFzc19zdXBwb3J0LCBzb3VyY2VfY29tbWFuZCwKKwkgICAiUmVhZCBjb21tYW5kcyBmcm9tIGEgZmlsZSBuYW1lZCBGSUxFLlxuXAorTm90ZSB0aGF0IHRoZSBmaWxlIFwiIiBHREJJTklUX0ZJTEVOQU1FICJcIiBpcyByZWFkIGF1dG9tYXRpY2FsbHkgaW4gdGhpcyB3YXlcblwKK3doZW4gZ2RiIGlzIHN0YXJ0ZWQuIiwgJmNtZGxpc3QpOworI2Vsc2UKKyAgLyogUHVudCBmaWxlIG5hbWUsIHdlIGNhbid0IGhlbHAgaXQgZWFzaWx5LiAgKi8KKyAgYyA9IGFkZF9jbWQgKCJzb3VyY2UiLCBjbGFzc19zdXBwb3J0LCBzb3VyY2VfY29tbWFuZCwKKwkgICAiUmVhZCBjb21tYW5kcyBmcm9tIGEgZmlsZSBuYW1lZCBGSUxFLlxuXAorTm90ZSB0aGF0IHRoZSBmaWxlIFwiLmdkYmluaXRcIiBpcyByZWFkIGF1dG9tYXRpY2FsbHkgaW4gdGhpcyB3YXlcblwKK3doZW4gZ2RiIGlzIHN0YXJ0ZWQuIiwgJmNtZGxpc3QpOworI2VuZGlmCisgIGMtPmNvbXBsZXRlciA9IGZpbGVuYW1lX2NvbXBsZXRlcjsKKworICBhZGRfY29tICgicXVpdCIsIGNsYXNzX3N1cHBvcnQsIHF1aXRfY29tbWFuZCwgIkV4aXQgZ2RiLiIpOworICBhZGRfY29tICgiaGVscCIsIGNsYXNzX3N1cHBvcnQsIGhlbHBfY29tbWFuZCwgIlByaW50IGxpc3Qgb2YgY29tbWFuZHMuIik7CisgIGFkZF9jb21fYWxpYXMgKCJxIiwgInF1aXQiLCBjbGFzc19zdXBwb3J0LCAxKTsKKyAgYWRkX2NvbV9hbGlhcyAoImgiLCAiaGVscCIsIGNsYXNzX3N1cHBvcnQsIDEpOworCisgIGFkZF9jb20gKCJkb250LXJlcGVhdCIsIGNsYXNzX3N1cHBvcnQsIGRvbnRfcmVwZWF0X2NvbW1hbmQsICJEb24ndCByZXBlYXQgdGhpcyBjb21tYW5kLlxuXAorUHJpbWFyaWx5IHVzZWQgaW5zaWRlIG9mIHVzZXItZGVmaW5lZCBjb21tYW5kcyB0aGF0IHNob3VsZCBub3QgYmUgcmVwZWF0ZWQgd2hlblxuXAoraGl0dGluZyByZXR1cm4uIik7CisKKyAgYyA9IGFkZF9zZXRfY21kICgidmVyYm9zZSIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLCAoY2hhciAqKSZpbmZvX3ZlcmJvc2UsCisJCSAgICJTZXQgIiwKKwkJICAgJnNldGxpc3QpLAorICBhZGRfc2hvd19mcm9tX3NldCAoYywgJnNob3dsaXN0KTsKKyAgYy0+ZnVuY3Rpb24uc2Z1bmMgPSBzZXRfdmVyYm9zZTsKKyAgc2V0X3ZlcmJvc2UgKE5VTEwsIDAsIGMpOworCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgiZWRpdGluZyIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLCAoY2hhciAqKSZjb21tYW5kX2VkaXRpbmdfcCwKKwkgICAiU2V0IGVkaXRpbmcgb2YgY29tbWFuZCBsaW5lcyBhcyB0aGV5IGFyZSB0eXBlZC5cblwKK1VzZSBcIm9uXCIgdG8gZW5hYmxlIHRoZSBlZGl0aW5nLCBhbmQgXCJvZmZcIiB0byBkaXNhYmxlIGl0LlxuXAorV2l0aG91dCBhbiBhcmd1bWVudCwgY29tbWFuZCBsaW5lIGVkaXRpbmcgaXMgZW5hYmxlZC4gIFRvIGVkaXQsIHVzZVxuXAorRU1BQ1MtbGlrZSBvciBWSS1saWtlIGNvbW1hbmRzIGxpa2UgY29udHJvbC1QIG9yIEVTQy4iLCAmc2V0bGlzdCksCisgICAgICZzaG93bGlzdCk7CisKKyAgYWRkX3ByZWZpeF9jbWQgKCJoaXN0b3J5IiwgY2xhc3Nfc3VwcG9ydCwgc2V0X2hpc3RvcnksCisJCSAgIkdlbmVyaWMgY29tbWFuZCBmb3Igc2V0dGluZyBjb21tYW5kIGhpc3RvcnkgcGFyYW1ldGVycy4iLAorCQkgICZzZXRoaXN0bGlzdCwgInNldCBoaXN0b3J5ICIsIDAsICZzZXRsaXN0KTsKKyAgYWRkX3ByZWZpeF9jbWQgKCJoaXN0b3J5IiwgY2xhc3Nfc3VwcG9ydCwgc2hvd19oaXN0b3J5LAorCQkgICJHZW5lcmljIGNvbW1hbmQgZm9yIHNob3dpbmcgY29tbWFuZCBoaXN0b3J5IHBhcmFtZXRlcnMuIiwKKwkJICAmc2hvd2hpc3RsaXN0LCAic2hvdyBoaXN0b3J5ICIsIDAsICZzaG93bGlzdCk7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQKKyAgICAoYWRkX3NldF9jbWQgKCJleHBhbnNpb24iLCBub19jbGFzcywgdmFyX2Jvb2xlYW4sIChjaGFyICopJmhpc3RvcnlfZXhwYW5zaW9uX3AsCisJICAgIlNldCBoaXN0b3J5IGV4cGFuc2lvbiBvbiBjb21tYW5kIGlucHV0LlxuXAorV2l0aG91dCBhbiBhcmd1bWVudCwgaGlzdG9yeSBleHBhbnNpb24gaXMgZW5hYmxlZC4iLCAmc2V0aGlzdGxpc3QpLAorICAgICAmc2hvd2hpc3RsaXN0KTsKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoInNhdmUiLCBub19jbGFzcywgdmFyX2Jvb2xlYW4sIChjaGFyICopJndyaXRlX2hpc3RvcnlfcCwKKwkgICAiU2V0IHNhdmluZyBvZiB0aGUgaGlzdG9yeSByZWNvcmQgb24gZXhpdC5cblwKK1VzZSBcIm9uXCIgdG8gZW5hYmxlIHRoZSBzYXZpbmcsIGFuZCBcIm9mZlwiIHRvIGRpc2FibGUgaXQuXG5cCitXaXRob3V0IGFuIGFyZ3VtZW50LCBzYXZpbmcgaXMgZW5hYmxlZC4iLCAmc2V0aGlzdGxpc3QpLAorICAgICAmc2hvd2hpc3RsaXN0KTsKKworICBjID0gYWRkX3NldF9jbWQgKCJzaXplIiwgbm9fY2xhc3MsIHZhcl9pbnRlZ2VyLCAoY2hhciAqKSZoaXN0b3J5X3NpemUsCisJCSAgICJTZXQgdGhlIHNpemUgb2YgdGhlIGNvbW1hbmQgaGlzdG9yeSwgXG5cCitpZS4gdGhlIG51bWJlciBvZiBwcmV2aW91cyBjb21tYW5kcyB0byBrZWVwIGEgcmVjb3JkIG9mLiIsICZzZXRoaXN0bGlzdCk7CisgIGFkZF9zaG93X2Zyb21fc2V0IChjLCAmc2hvd2hpc3RsaXN0KTsKKyAgYy0+ZnVuY3Rpb24uc2Z1bmMgPSBzZXRfaGlzdG9yeV9zaXplX2NvbW1hbmQ7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQKKyAgICAoYWRkX3NldF9jbWQgKCJmaWxlbmFtZSIsIG5vX2NsYXNzLCB2YXJfZmlsZW5hbWUsIChjaGFyICopJmhpc3RvcnlfZmlsZW5hbWUsCisJICAgIlNldCB0aGUgZmlsZW5hbWUgaW4gd2hpY2ggdG8gcmVjb3JkIHRoZSBjb21tYW5kIGhpc3RvcnlcblwKKyAodGhlIGxpc3Qgb2YgcHJldmlvdXMgY29tbWFuZHMgb2Ygd2hpY2ggYSByZWNvcmQgaXMga2VwdCkuIiwgJnNldGhpc3RsaXN0KSwKKyAgICAgJnNob3doaXN0bGlzdCk7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQKKyAgICAoYWRkX3NldF9jbWQgKCJjb25maXJtIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCisJCSAgKGNoYXIgKikmY2F1dGlvbiwKKwkJICAiU2V0IHdoZXRoZXIgdG8gY29uZmlybSBwb3RlbnRpYWxseSBkYW5nZXJvdXMgb3BlcmF0aW9ucy4iLAorCQkgICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKKworICBhZGRfcHJlZml4X2NtZCAoImluZm8iLCBjbGFzc19pbmZvLCBpbmZvX2NvbW1hbmQsCisgICAgICAgICJHZW5lcmljIGNvbW1hbmQgZm9yIHNob3dpbmcgdGhpbmdzIGFib3V0IHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkLiIsCisJCSAgJmluZm9saXN0LCAiaW5mbyAiLCAwLCAmY21kbGlzdCk7CisgIGFkZF9jb21fYWxpYXMgKCJpIiwgImluZm8iLCBjbGFzc19pbmZvLCAxKTsKKworICBhZGRfY29tICgiY29tcGxldGUiLCBjbGFzc19vYnNjdXJlLCBjb21wbGV0ZV9jb21tYW5kLAorCSAgICJMaXN0IHRoZSBjb21wbGV0aW9ucyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgYXMgYSBjb21tYW5kLiIpOworCisgIGFkZF9wcmVmaXhfY21kICgic2hvdyIsIGNsYXNzX2luZm8sIHNob3dfY29tbWFuZCwKKwkJICAiR2VuZXJpYyBjb21tYW5kIGZvciBzaG93aW5nIHRoaW5ncyBhYm91dCB0aGUgZGVidWdnZXIuIiwKKwkJICAmc2hvd2xpc3QsICJzaG93ICIsIDAsICZjbWRsaXN0KTsKKyAgLyogQW5vdGhlciB3YXkgdG8gZ2V0IGF0IHRoZSBzYW1lIHRoaW5nLiAgKi8KKyAgYWRkX2luZm8gKCJzZXQiLCBzaG93X2NvbW1hbmQsICJTaG93IGFsbCBHREIgc2V0dGluZ3MuIik7CisKKyAgYWRkX2NtZCAoImNvbW1hbmRzIiwgbm9fY2xhc3MsIHNob3dfY29tbWFuZHMsCisJICAgIlNob3cgdGhlIGhpc3Rvcnkgb2YgY29tbWFuZHMgeW91IHR5cGVkLlxuXAorWW91IGNhbiBzdXBwbHkgYSBjb21tYW5kIG51bWJlciB0byBzdGFydCB3aXRoLCBvciBhIGArJyB0byBzdGFydCBhZnRlclxuXAordGhlIHByZXZpb3VzIGNvbW1hbmQgbnVtYmVyIHNob3duLiIsCisJICAgJnNob3dsaXN0KTsKKworICBhZGRfY21kICgidmVyc2lvbiIsIG5vX2NsYXNzLCBzaG93X3ZlcnNpb24sCisJICAgIlNob3cgd2hhdCB2ZXJzaW9uIG9mIEdEQiB0aGlzIGlzLiIsICZzaG93bGlzdCk7CisKKyAgYWRkX2NvbSAoIndoaWxlIiwgY2xhc3Nfc3VwcG9ydCwgd2hpbGVfY29tbWFuZCwKKyJFeGVjdXRlIG5lc3RlZCBjb21tYW5kcyBXSElMRSB0aGUgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBub24gemVyby5cblwKK1RoZSBjb25kaXRpb25hbCBleHByZXNzaW9uIG11c3QgZm9sbG93IHRoZSB3b3JkIGB3aGlsZScgYW5kIG11c3QgaW4gdHVybiBiZVxuXAorZm9sbG93ZWQgYnkgYSBuZXcgbGluZS4gIFRoZSBuZXN0ZWQgY29tbWFuZHMgbXVzdCBiZSBlbnRlcmVkIG9uZSBwZXIgbGluZSxcblwKK2FuZCBzaG91bGQgYmUgdGVybWluYXRlZCBieSB0aGUgd29yZCBgZW5kJy4iKTsKKworICBhZGRfY29tICgiaWYiLCBjbGFzc19zdXBwb3J0LCBpZl9jb21tYW5kLAorIkV4ZWN1dGUgbmVzdGVkIGNvbW1hbmRzIG9uY2UgSUYgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgbm9uIHplcm8uXG5cCitUaGUgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBtdXN0IGZvbGxvdyB0aGUgd29yZCBgaWYnIGFuZCBtdXN0IGluIHR1cm4gYmVcblwKK2ZvbGxvd2VkIGJ5IGEgbmV3IGxpbmUuICBUaGUgbmVzdGVkIGNvbW1hbmRzIG11c3QgYmUgZW50ZXJlZCBvbmUgcGVyIGxpbmUsXG5cCithbmQgc2hvdWxkIGJlIHRlcm1pbmF0ZWQgYnkgdGhlIHdvcmQgJ2Vsc2UnIG9yIGBlbmQnLiAgSWYgYW4gZWxzZSBjbGF1c2VcblwKK2lzIHVzZWQsIHRoZSBzYW1lIHJ1bGVzIGFwcGx5IHRvIGl0cyBuZXN0ZWQgY29tbWFuZHMgYXMgdG8gdGhlIGZpcnN0IG9uZXMuIik7CisKKyAgLyogSWYgdGFyZ2V0IGlzIG9wZW4gd2hlbiBiYXVkIGNoYW5nZXMsIGl0IGRvZXNuJ3QgdGFrZSBlZmZlY3QgdW50aWwgdGhlCisgICAgIG5leHQgb3BlbiAoSSB0aGluaywgbm90IHN1cmUpLiAgKi8KKyAgYWRkX3Nob3dfZnJvbV9zZXQgKGFkZF9zZXRfY21kICgicmVtb3RlYmF1ZCIsIG5vX2NsYXNzLAorCQkJCSAgdmFyX3ppbnRlZ2VyLCAoY2hhciAqKSZiYXVkX3JhdGUsCisJCQkJICAiU2V0IGJhdWQgcmF0ZSBmb3IgcmVtb3RlIHNlcmlhbCBJL08uXG5cCitUaGlzIHZhbHVlIGlzIHVzZWQgdG8gc2V0IHRoZSBzcGVlZCBvZiB0aGUgc2VyaWFsIHBvcnQgd2hlbiBkZWJ1Z2dpbmdcblwKK3VzaW5nIHJlbW90ZSB0YXJnZXRzLiIsICZzZXRsaXN0KSwKKwkJICAgICAmc2hvd2xpc3QpOworCisgIGFkZF9zaG93X2Zyb21fc2V0ICgKKyAgICBhZGRfc2V0X2NtZCAoInJlbW90ZWRlYnVnIiwgbm9fY2xhc3MsIHZhcl96aW50ZWdlciwgKGNoYXIgKikmcmVtb3RlX2RlYnVnLAorCQkgICAiU2V0IGRlYnVnZ2luZyBvZiByZW1vdGUgcHJvdG9jb2wuXG5cCitXaGVuIGVuYWJsZWQsIGVhY2ggcGFja2V0IHNlbnQgb3IgcmVjZWl2ZWQgd2l0aCB0aGUgcmVtb3RlIHRhcmdldFxuXAoraXMgZGlzcGxheWVkLiIsICZzZXRsaXN0KSwKKwkJICAgICAmc2hvd2xpc3QpOworCisgIGFkZF9zaG93X2Zyb21fc2V0ICgKKyAgICBhZGRfc2V0X2NtZCAoInJlbW90ZXRpbWVvdXQiLCBub19jbGFzcywgdmFyX2ludGVnZXIsIChjaGFyICopJnJlbW90ZV90aW1lb3V0LAorCQkgICAiU2V0IHRpbWVvdXQgbGltaXQgdG8gd2FpdCBmb3IgdGFyZ2V0IHRvIHJlc3BvbmQuXG5cCitUaGlzIHZhbHVlIGlzIHVzZWQgdG8gc2V0IHRoZSB0aW1lIGxpbWl0IGZvciBnZGIgdG8gd2FpdCBmb3IgYSByZXNwb25zZVxuXAorZnJvbSB0aGUgdGFyZ2V0LiIsICZzZXRsaXN0KSwKKwkJICAgICAmc2hvd2xpc3QpOworCisgIGMgPSBhZGRfc2V0X2NtZCAoImFubm90YXRlIiwgY2xhc3Nfb2JzY3VyZSwgdmFyX3ppbnRlZ2VyLCAKKwkJICAgKGNoYXIgKikmYW5ub3RhdGlvbl9sZXZlbCwgIlNldCBhbm5vdGF0aW9uX2xldmVsLlxuXAorMCA9PSBub3JtYWw7ICAgICAxID09IGZ1bGxuYW1lIChmb3IgdXNlIHdoZW4gcnVubmluZyB1bmRlciBlbWFjcylcblwKKzIgPT0gb3V0cHV0IGFubm90YXRlZCBzdWl0YWJseSBmb3IgdXNlIGJ5IHByb2dyYW1zIHRoYXQgY29udHJvbCBHREIuIiwKKwkJICZzZXRsaXN0KTsKKyAgYyA9IGFkZF9zaG93X2Zyb21fc2V0IChjLCAmc2hvd2xpc3QpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3RvcC5oIGIvZ2RiL3RvcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNzAwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdG9wLmgKQEAgLTAsMCArMSw2NyBAQAorLyogVG9wIGxldmVsIHN0dWZmIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogRnJvbSB0b3AuYy4gICovCitleHRlcm4gY2hhciAqbGluZTsKK2V4dGVybiBpbnQgbGluZXNpemU7CitleHRlcm4gRklMRSAqaW5zdHJlYW07CitleHRlcm4gY2hhciBnZGJfZGlyYnVmWzEwMjRdOworZXh0ZXJuIGludCBpbmhpYml0X2dkYmluaXQ7CitleHRlcm4gaW50IGVwb2NoX2ludGVyZmFjZTsKK2V4dGVybiBjaGFyIGdkYmluaXRbXTsKKworLyogR2VuZXJhbGx5IG9uZSBzaG91bGQgdXNlIGNhdGNoX2Vycm9ycyByYXRoZXIgdGhhbiBtYW5pcHVsYXRpbmcgdGhlc2UKKyAgIGRpcmVjdGx5LiAgVGhlIGV4Y2VwdGlvbiBpcyBtYWluKCkuICAqLworI2lmIGRlZmluZWQoSEFWRV9TSUdTRVRKTVApCisjZGVmaW5lIFNJR0pNUF9CVUYJCXNpZ2ptcF9idWYKKyNkZWZpbmUgU0lHU0VUSk1QKGJ1ZikJCXNpZ3NldGptcChidWYsIDEpCisjZGVmaW5lIFNJR0xPTkdKTVAoYnVmLHZhbCkJc2lnbG9uZ2ptcChidWYsdmFsKQorI2Vsc2UKKyNkZWZpbmUgU0lHSk1QX0JVRgkJam1wX2J1ZgorI2RlZmluZSBTSUdTRVRKTVAoYnVmKQkJc2V0am1wKGJ1ZikKKyNkZWZpbmUgU0lHTE9OR0pNUChidWYsdmFsKQlsb25nam1wKGJ1Zix2YWwpCisjZW5kaWYKKworZXh0ZXJuIFNJR0pNUF9CVUYgZXJyb3JfcmV0dXJuOworZXh0ZXJuIFNJR0pNUF9CVUYgcXVpdF9yZXR1cm47CisKK2V4dGVybiB2b2lkIHByaW50X2dkYl92ZXJzaW9uIFBBUkFNUyAoKEdEQl9GSUxFICopKTsKKworZXh0ZXJuIHZvaWQgc291cmNlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK2V4dGVybiB2b2lkIGNkX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK2V4dGVybiB2b2lkIHJlYWRfY29tbWFuZF9maWxlIFBBUkFNUyAoKEZJTEUgKikpOworZXh0ZXJuIHZvaWQgaW5pdF9oaXN0b3J5IFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkIGNvbW1hbmRfbG9vcCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gaW50IHF1aXRfY29uZmlybSBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCBxdWl0X2ZvcmNlIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitleHRlcm4gdm9pZCBxdWl0X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRoYXQgaXMgdXNlZAorICAgYnkgZ2RiIGZvciBpdHMgY29tbWFuZCBwcm9tcHQuICovCitleHRlcm4gY2hhciAqZ2V0X3Byb21wdCBQQVJBTVMoKHZvaWQpKTsKKyAKKy8qIFRoaXMgZnVuY3Rpb24gY29waWVzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGludG8gdGhlIHN0cmluZyB0aGF0CisgICBpcyB1c2VkIGJ5IGdkYiBmb3IgaXRzIGNvbW1hbmQgcHJvbXB0LiAqLworZXh0ZXJuIHZvaWQgc2V0X3Byb21wdCBQQVJBTVMgKChjaGFyICopKTsKKworLyogRnJvbSByYW5kb20gcGxhY2VzLiAgKi8KK2V4dGVybiBpbnQgbWFwcGVkX3N5bWJvbF9maWxlczsKK2V4dGVybiBpbnQgcmVhZG5vd19zeW1ib2xfZmlsZXM7CisjZGVmaW5lCUFMTF9DTEVBTlVQUwkoKHN0cnVjdCBjbGVhbnVwICopMCkKZGlmZiAtLWdpdCBhL2dkYi90cmFjZXBvaW50LmMgYi9nZGIvdHJhY2Vwb2ludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMDM2MTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdHJhY2Vwb2ludC5jCkBAIC0wLDAgKzEsMjc4MCBAQAorLyogVHJhY2luZyBmdW5jdGlvbmFsaXR5IGZvciByZW1vdGUgdGFyZ2V0cyBpbiBjdXN0b20gR0RCIHByb3RvY29sCisgICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAidHJhY2Vwb2ludC5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisKKyNpbmNsdWRlICJheC5oIgorI2luY2x1ZGUgImF4LWdkYi5oIgorCisvKiByZWFkbGluZSBpbmNsdWRlIGZpbGVzICovCisjaW5jbHVkZSA8cmVhZGxpbmUvcmVhZGxpbmUuaD4KKyNpbmNsdWRlIDxyZWFkbGluZS9oaXN0b3J5Lmg+CisKKy8qIHJlYWRsaW5lIGRlZmluZXMgdGhpcy4gICovCisjdW5kZWYgc2F2ZXN0cmluZworCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKy8qIG1heGltdW0gbGVuZ3RoIG9mIGFuIGFnZW50IGFleHByZXNzaW9uLgorICAgdGhpcyBhY2NvdW50cyBmb3IgdGhlIGZhY3QgdGhhdCBwYWNrZXRzIGFyZSBsaW1pdGVkIHRvIDQwMCBieXRlcworICAgKHdoaWNoIGluY2x1ZGVzIGV2ZXJ5dGhpbmcgLS0gaW5jbHVkaW5nIHRoZSBjaGVja3N1bSksIGFuZCBhc3N1bWVzCisgICB0aGUgd29yc3QgY2FzZSBvZiBtYXhpbXVtIGxlbmd0aCBmb3IgZWFjaCBvZiB0aGUgcGllY2VzIG9mIGEKKyAgIGNvbnRpbnVhdGlvbiBwYWNrZXQuCisgICAKKyAgIE5PVEU6IGV4cHJlc3Npb25zIGdldCBtZW0yaGV4J2VkIG90aGVyd2lzZSB0aGlzIHdvdWxkIGJlIHR3aWNlIGFzCisgICBsYXJnZS4gICg0MDAgLSAzMSkvMiA9PSAxODQgKi8KKyNkZWZpbmUgTUFYX0FHRU5UX0VYUFJfTEVOCTE4NAorCisKK2V4dGVybiBpbnQgaW5mb192ZXJib3NlOworZXh0ZXJuIHZvaWQgKCpyZWFkbGluZV9iZWdpbl9ob29rKSBQQVJBTVMgKChjaGFyICosIC4uLikpOworZXh0ZXJuIGNoYXIgKiAoKnJlYWRsaW5lX2hvb2spIFBBUkFNUyAoKGNoYXIgKikpOworZXh0ZXJuIHZvaWQgKCpyZWFkbGluZV9lbmRfaG9vaykgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgeF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitleHRlcm4gaW50IGFkZHJlc3NwcmludDsJCS8qIFByaW50IG1hY2hpbmUgYWRkcmVzc2VzPyAqLworCisvKiBJZiB0aGlzIGRlZmluaXRpb24gaXNuJ3Qgb3ZlcnJpZGRlbiBieSB0aGUgaGVhZGVyIGZpbGVzLCBhc3N1bWUKKyAgIHRoYXQgaXNhdHR5IGFuZCBmaWxlbm8gZXhpc3Qgb24gdGhpcyBzeXN0ZW0uICAqLworI2lmbmRlZiBJU0FUVFkKKyNkZWZpbmUgSVNBVFRZKEZQKQkoaXNhdHR5IChmaWxlbm8gKEZQKSkpCisjZW5kaWYKKworLyogCisgICBUcmFjZXBvaW50LmM6CisKKyAgIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBkZWJ1Z2dlciBjb21tYW5kczoKKyAgIHRyYWNlICAgICAgICAgICAgOiBzZXQgYSB0cmFjZXBvaW50IG9uIGEgZnVuY3Rpb24sIGxpbmUsIG9yIGFkZHJlc3MuCisgICBpbmZvIHRyYWNlICAgICAgIDogbGlzdCBhbGwgZGVidWdnZXItZGVmaW5lZCB0cmFjZXBvaW50cy4KKyAgIGRlbGV0ZSB0cmFjZSAgICAgOiBkZWxldGUgb25lIG9yIG1vcmUgdHJhY2Vwb2ludHMuCisgICBlbmFibGUgdHJhY2UgICAgIDogZW5hYmxlIG9uZSBvciBtb3JlIHRyYWNlcG9pbnRzLgorICAgZGlzYWJsZSB0cmFjZSAgICA6IGRpc2FibGUgb25lIG9yIG1vcmUgdHJhY2Vwb2ludHMuCisgICBhY3Rpb25zICAgICAgICAgIDogc3BlY2lmeSBhY3Rpb25zIHRvIGJlIHRha2VuIGF0IGEgdHJhY2Vwb2ludC4KKyAgIHBhc3Njb3VudCAgICAgICAgOiBzcGVjaWZ5IGEgcGFzcyBjb3VudCBmb3IgYSB0cmFjZXBvaW50LgorICAgdHN0YXJ0ICAgICAgICAgICA6IHN0YXJ0IGEgdHJhY2UgZXhwZXJpbWVudC4KKyAgIHRzdG9wICAgICAgICAgICAgOiBzdG9wIGEgdHJhY2UgZXhwZXJpbWVudC4KKyAgIHRzdGF0dXMgICAgICAgICAgOiBxdWVyeSB0aGUgc3RhdHVzIG9mIGEgdHJhY2UgZXhwZXJpbWVudC4KKyAgIHRmaW5kICAgICAgICAgICAgOiBmaW5kIGEgdHJhY2UgZnJhbWUgaW4gdGhlIHRyYWNlIGJ1ZmZlci4KKyAgIHRkdW1wICAgICAgICAgICAgOiBwcmludCBldmVyeXRoaW5nIGNvbGxlY3RlZCBhdCB0aGUgY3VycmVudCB0cmFjZXBvaW50LgorICAgc2F2ZS10cmFjZXBvaW50cyA6IHdyaXRlIHRyYWNlcG9pbnQgc2V0dXAgaW50byBhIGZpbGUuCisKKyAgIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyB1c2VyLXZpc2libGUgZGVidWdnZXIgdmFyaWFibGVzOgorICAgJHRyYWNlX2ZyYW1lIDogc2VxdWVuY2UgbnVtYmVyIG9mIHRyYWNlIGZyYW1lIGN1cnJlbnRseSBiZWluZyBkZWJ1Z2dlZC4KKyAgICR0cmFjZV9saW5lICA6IHNvdXJjZSBsaW5lIG9mIHRyYWNlIGZyYW1lIGN1cnJlbnRseSBiZWluZyBkZWJ1Z2dlZC4KKyAgICR0cmFjZV9maWxlICA6IHNvdXJjZSBmaWxlIG9mIHRyYWNlIGZyYW1lIGN1cnJlbnRseSBiZWluZyBkZWJ1Z2dlZC4KKyAgICR0cmFjZXBvaW50ICA6IHRyYWNlcG9pbnQgbnVtYmVyIG9mIHRyYWNlIGZyYW1lIGN1cnJlbnRseSBiZWluZyBkZWJ1Z2dlZC4KKyAgICovCisKKworLyogPT09PT09PSBJbXBvcnRhbnQgZ2xvYmFsIHZhcmlhYmxlczogPT09PT09PSAqLworCisvKiBDaGFpbiBvZiBhbGwgdHJhY2Vwb2ludHMgZGVmaW5lZC4gICovCitzdHJ1Y3QgdHJhY2Vwb2ludCAqdHJhY2Vwb2ludF9jaGFpbjsKKworLyogTnVtYmVyIG9mIGxhc3QgdHJhY2Vwb2ludCBtYWRlLiAgKi8KK3N0YXRpYyBpbnQgdHJhY2Vwb2ludF9jb3VudDsKKworLyogTnVtYmVyIG9mIGxhc3QgdHJhY2VmcmFtZSBjb2xsZWN0ZWQuICAqLworc3RhdGljIGludCB0cmFjZWZyYW1lX251bWJlcjsKKworLyogVHJhY2Vwb2ludCBmb3IgbGFzdCB0cmFjZWZyYW1lIGNvbGxlY3RlZC4gICovCitzdGF0aWMgaW50IHRyYWNlcG9pbnRfbnVtYmVyOworCisvKiBTeW1ib2wgZm9yIGZ1bmN0aW9uIGZvciBsYXN0IHRyYWNlZnJhbWUgY29sbGVjdGVkICovCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqdHJhY2VmcmFtZV9mdW47CisKKy8qIFN5bXRhYiBhbmQgbGluZSBmb3IgbGFzdCB0cmFjZWZyYW1lIGNvbGxlY3RlZCAqLworc3RhdGljIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgdHJhY2VmcmFtZV9zYWw7CisKKy8qIFRyYWNpbmcgY29tbWFuZCBsaXN0cyAqLworc3RhdGljIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICp0ZmluZGxpc3Q7CisKKy8qID09PT09PT0gSW1wb3J0YW50IGNvbW1hbmQgZnVuY3Rpb25zOiA9PT09PT09ICovCitzdGF0aWMgdm9pZCB0cmFjZV9jb21tYW5kICAgICAgICAgICAgICAgICBQQVJBTVMgKChjaGFyICosIGludCkpOworc3RhdGljIHZvaWQgdHJhY2Vwb2ludHNfaW5mbyAgICAgICAgICAgICAgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIGRlbGV0ZV90cmFjZV9jb21tYW5kICAgICAgICAgIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBlbmFibGVfdHJhY2VfY29tbWFuZCAgICAgICAgICBQQVJBTVMgKChjaGFyICosIGludCkpOworc3RhdGljIHZvaWQgZGlzYWJsZV90cmFjZV9jb21tYW5kICAgICAgICAgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIHRyYWNlX3Bhc3NfY29tbWFuZCAgICAgICAgICAgIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCB0cmFjZV9hY3Rpb25zX2NvbW1hbmQgICAgICAgICBQQVJBTVMgKChjaGFyICosIGludCkpOworc3RhdGljIHZvaWQgdHJhY2Vfc3RhcnRfY29tbWFuZCAgICAgICAgICAgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIHRyYWNlX3N0b3BfY29tbWFuZCAgICAgICAgICAgIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCB0cmFjZV9zdGF0dXNfY29tbWFuZCAgICAgICAgICBQQVJBTVMgKChjaGFyICosIGludCkpOworc3RhdGljIHZvaWQgdHJhY2VfZmluZF9jb21tYW5kICAgICAgICAgICAgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIHRyYWNlX2ZpbmRfcGNfY29tbWFuZCAgICAgICAgIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCB0cmFjZV9maW5kX3RyYWNlcG9pbnRfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworc3RhdGljIHZvaWQgdHJhY2VfZmluZF9saW5lX2NvbW1hbmQgICAgICAgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIHRyYWNlX2ZpbmRfcmFuZ2VfY29tbWFuZCAgICAgIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCB0cmFjZV9maW5kX291dHNpZGVfY29tbWFuZCAgICBQQVJBTVMgKChjaGFyICosIGludCkpOworc3RhdGljIHZvaWQgdHJhY2Vwb2ludF9zYXZlX2NvbW1hbmQgICAgICAgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIHRyYWNlX2R1bXBfY29tbWFuZCAgICAgICAgICAgIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKKy8qIHN1cHBvcnQgcm91dGluZXMgKi8KK3N0YXRpYyB2b2lkIHRyYWNlX21lbnRpb24gICAgICAgICAgICAgICAgIFBBUkFNUyAoKHN0cnVjdCB0cmFjZXBvaW50ICopKTsKKworc3RydWN0IGNvbGxlY3Rpb25fbGlzdDsKK3N0YXRpYyB2b2lkIGFkZF9hZXhwciBQQVJBTVMgKChzdHJ1Y3QgY29sbGVjdGlvbl9saXN0ICosIHN0cnVjdCBhZ2VudF9leHByICopKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICptZW0yaGV4KHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpOworCisvKiBVdGlsaXR5OiByZXR1cm5zIHRydWUgaWYgInRhcmdldCByZW1vdGUiICovCitzdGF0aWMgaW50Cit0YXJnZXRfaXNfcmVtb3RlICgpCit7CisgIGlmIChjdXJyZW50X3RhcmdldC50b19zaG9ydG5hbWUgJiYKKyAgICAgIHN0cmNtcCAoY3VycmVudF90YXJnZXQudG9fc2hvcnRuYW1lLCAicmVtb3RlIikgPT0gMCkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBVdGlsaXR5OiBnZW5lcmF0ZSBlcnJvciBmcm9tIGFuIGluY29taW5nIHN0dWIgcGFja2V0LiAgKi8KK3N0YXRpYyB2b2lkIAordHJhY2VfZXJyb3IgKGJ1ZikKKyAgICAgY2hhciAqYnVmOworeworICBpZiAoKmJ1ZisrICE9ICdFJykKKyAgICByZXR1cm47CQkJLyogbm90IGFuIGVycm9yIG1zZyAqLworICBzd2l0Y2ggKCpidWYpIAorICAgIHsKKyAgICBjYXNlICcxJzoJCQkvKiBtYWxmb3JtZWQgcGFja2V0IGVycm9yICovCisgICAgICBpZiAoKisrYnVmID09ICcwJykJLyogICBnZW5lcmFsIGNhc2U6ICovCisJZXJyb3IgKCJ0cmFjZXBvaW50LmM6IGVycm9yIGluIG91dGdvaW5nIHBhY2tldC4iKTsKKyAgICAgIGVsc2UKKwllcnJvciAoInRyYWNlcG9pbnQuYzogZXJyb3IgaW4gb3V0Z29pbmcgcGFja2V0IGF0IGZpZWxkICMlZC4iLCAKKwkgICAgICAgc3RydG9sIChidWYsIE5VTEwsIDE2KSk7CisgICAgY2FzZSAnMic6CisgICAgICBlcnJvciAoInRyYWNlIEFQSSBlcnJvciAweCVzLiIsICsrYnVmKTsKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IgKCJUYXJnZXQgcmV0dXJucyBlcnJvciBjb2RlICclcycuIiwgYnVmKTsKKyAgICB9Cit9CisKKy8qIFV0aWxpdHk6IHdhaXQgZm9yIHJlcGx5IGZyb20gc3R1Yiwgd2hpbGUgYWNjZXB0aW5nICJPIiBwYWNrZXRzICovCitzdGF0aWMgY2hhciAqCityZW1vdGVfZ2V0X25vaXN5X3JlcGx5IChidWYpCisgICAgIGNoYXIgKmJ1ZjsKK3sKKyAgZG8JLyogbG9vcCBvbiByZXBseSBmcm9tIHJlbW90ZSBzdHViICovCisgICAgeworICAgICAgUVVJVDsJCQkJLyogYWxsb3cgdXNlciB0byBiYWlsIG91dCB3aXRoIF5DICovCisgICAgICBnZXRwa3QgKGJ1ZiwgMCk7CisgICAgICBpZiAoYnVmWzBdID09IDApCisJZXJyb3IgKCJUYXJnZXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGNvbW1hbmQuIik7CisgICAgICBlbHNlIGlmIChidWZbMF0gPT0gJ0UnKQorCXRyYWNlX2Vycm9yIChidWYpOworICAgICAgZWxzZSBpZiAoYnVmWzBdID09ICdPJyAmJgorCSAgICAgICBidWZbMV0gIT0gJ0snKQorCXJlbW90ZV9jb25zb2xlX291dHB1dCAoYnVmICsgMSk7CS8qICdPJyBtZXNzYWdlIGZyb20gc3R1YiAqLworICAgICAgZWxzZQorCXJldHVybiBidWY7CQkJCS8qIGhlcmUncyB0aGUgYWN0dWFsIHJlcGx5ICovCisgICAgfSB3aGlsZSAoMSk7Cit9CisKKy8qIFNldCB0cmFjZXBvaW50IGNvdW50IHRvIE5VTS4gICovCitzdGF0aWMgdm9pZAorc2V0X3RyYWNlcG9pbnRfY291bnQgKG51bSkKKyAgICAgaW50IG51bTsKK3sKKyAgdHJhY2Vwb2ludF9jb3VudCA9IG51bTsKKyAgc2V0X2ludGVybmFsdmFyIChsb29rdXBfaW50ZXJuYWx2YXIgKCJ0cG51bSIpLAorCQkgICB2YWx1ZV9mcm9tX2xvbmdlc3QgKGJ1aWx0aW5fdHlwZV9pbnQsIChMT05HRVNUKSBudW0pKTsKK30KKworLyogU2V0IHRyYWNlZnJhbWUgbnVtYmVyIHRvIE5VTS4gICovCitzdGF0aWMgdm9pZAorc2V0X3RyYWNlZnJhbWVfbnVtIChudW0pCisgICAgIGludCBudW07Cit7CisgIHRyYWNlZnJhbWVfbnVtYmVyID0gbnVtOworICBzZXRfaW50ZXJuYWx2YXIgKGxvb2t1cF9pbnRlcm5hbHZhciAoInRyYWNlX2ZyYW1lIiksCisJCSAgIHZhbHVlX2Zyb21fbG9uZ2VzdCAoYnVpbHRpbl90eXBlX2ludCwgKExPTkdFU1QpIG51bSkpOworfQorCisvKiBTZXQgdHJhY2Vwb2ludCBudW1iZXIgdG8gTlVNLiAgKi8KK3N0YXRpYyB2b2lkCitzZXRfdHJhY2Vwb2ludF9udW0gKG51bSkKKyAgICAgaW50IG51bTsKK3sKKyAgdHJhY2Vwb2ludF9udW1iZXIgPSBudW07CisgIHNldF9pbnRlcm5hbHZhciAobG9va3VwX2ludGVybmFsdmFyICgidHJhY2Vwb2ludCIpLAorCQkgICB2YWx1ZV9mcm9tX2xvbmdlc3QgKGJ1aWx0aW5fdHlwZV9pbnQsIChMT05HRVNUKSBudW0pKTsKK30KKworLyogU2V0IGV4dGVybmFsbHkgdmlzaWJsZSBkZWJ1ZyB2YXJpYWJsZXMgZm9yIHF1ZXJ5aW5nL3ByaW50aW5nCisgICB0aGUgdHJhY2VmcmFtZSBjb250ZXh0IChsaW5lLCBmdW5jdGlvbiwgZmlsZSkgKi8KKworc3RhdGljIHZvaWQKK3NldF90cmFjZWZyYW1lX2NvbnRleHQgKHRyYWNlX3BjKQorICAgICBDT1JFX0FERFIgdHJhY2VfcGM7Cit7CisgIHN0YXRpYyBzdHJ1Y3QgdHlwZSAqZnVuY19zdHJpbmcsICpmaWxlX3N0cmluZzsKKyAgc3RhdGljIHN0cnVjdCB0eXBlICpmdW5jX3JhbmdlLCAgKmZpbGVfcmFuZ2U7CisgIHN0YXRpYyB2YWx1ZV9wdHIgICAgZnVuY192YWwsICAgICBmaWxlX3ZhbDsKKyAgc3RhdGljIHN0cnVjdCB0eXBlICpjaGFyc3RhcjsKKyAgaW50IGxlbjsKKworICBpZiAoY2hhcnN0YXIgPT0gKHN0cnVjdCB0eXBlICopIE5VTEwpCisgICAgY2hhcnN0YXIgPSBsb29rdXBfcG9pbnRlcl90eXBlIChidWlsdGluX3R5cGVfY2hhcik7CisKKyAgaWYgKHRyYWNlX3BjID09IC0xKQkvKiBjZWFzZSBkZWJ1Z2dpbmcgYW55IHRyYWNlIGJ1ZmZlcnMgKi8KKyAgICB7CisgICAgICB0cmFjZWZyYW1lX2Z1biA9IDA7CisgICAgICB0cmFjZWZyYW1lX3NhbC5wYyA9IHRyYWNlZnJhbWVfc2FsLmxpbmUgPSAwOworICAgICAgdHJhY2VmcmFtZV9zYWwuc3ltdGFiID0gTlVMTDsKKyAgICAgIHNldF9pbnRlcm5hbHZhciAobG9va3VwX2ludGVybmFsdmFyICgidHJhY2VfZnVuYyIpLCAKKwkJICAgICAgIHZhbHVlX2Zyb21fbG9uZ2VzdCAoY2hhcnN0YXIsIChMT05HRVNUKSAwKSk7CisgICAgICBzZXRfaW50ZXJuYWx2YXIgKGxvb2t1cF9pbnRlcm5hbHZhciAoInRyYWNlX2ZpbGUiKSwgCisJCSAgICAgICB2YWx1ZV9mcm9tX2xvbmdlc3QgKGNoYXJzdGFyLCAoTE9OR0VTVCkgMCkpOworICAgICAgc2V0X2ludGVybmFsdmFyIChsb29rdXBfaW50ZXJuYWx2YXIgKCJ0cmFjZV9saW5lIiksCisJCSAgICAgICB2YWx1ZV9mcm9tX2xvbmdlc3QgKGJ1aWx0aW5fdHlwZV9pbnQsIChMT05HRVNUKSAtMSkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBzYXZlIGFzIGdsb2JhbHMgZm9yIGludGVybmFsIHVzZSAqLworICB0cmFjZWZyYW1lX3NhbCA9IGZpbmRfcGNfbGluZSAodHJhY2VfcGMsIDApOworICB0cmFjZWZyYW1lX2Z1biA9IGZpbmRfcGNfZnVuY3Rpb24gKHRyYWNlX3BjKTsKKworICAvKiBzYXZlIGxpbmVudW1iZXIgYXMgIiR0cmFjZV9saW5lIiwgYSBkZWJ1Z2dlciB2YXJpYWJsZSB2aXNpYmxlIHRvIHVzZXJzICovCisgIHNldF9pbnRlcm5hbHZhciAobG9va3VwX2ludGVybmFsdmFyICgidHJhY2VfbGluZSIpLAorCQkgICB2YWx1ZV9mcm9tX2xvbmdlc3QgKGJ1aWx0aW5fdHlwZV9pbnQsIAorCQkJCSAgICAgICAoTE9OR0VTVCkgdHJhY2VmcmFtZV9zYWwubGluZSkpOworCisgIC8qIHNhdmUgZnVuYyBuYW1lIGFzICIkdHJhY2VfZnVuYyIsIGEgZGVidWdnZXIgdmFyaWFibGUgdmlzaWJsZSB0byB1c2VycyAqLworICBpZiAodHJhY2VmcmFtZV9mdW4gPT0gTlVMTCB8fCAKKyAgICAgIFNZTUJPTF9OQU1FICh0cmFjZWZyYW1lX2Z1bikgPT0gTlVMTCkKKyAgICBzZXRfaW50ZXJuYWx2YXIgKGxvb2t1cF9pbnRlcm5hbHZhciAoInRyYWNlX2Z1bmMiKSwgCisJCSAgICAgdmFsdWVfZnJvbV9sb25nZXN0IChjaGFyc3RhciwgKExPTkdFU1QpIDApKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGxlbiA9IHN0cmxlbiAoU1lNQk9MX05BTUUgKHRyYWNlZnJhbWVfZnVuKSk7CisgICAgICBmdW5jX3JhbmdlICA9IGNyZWF0ZV9yYW5nZV90eXBlIChmdW5jX3JhbmdlLCAgCisJCQkJICAgICAgIGJ1aWx0aW5fdHlwZV9pbnQsIDAsIGxlbiAtIDEpOworICAgICAgZnVuY19zdHJpbmcgPSBjcmVhdGVfYXJyYXlfdHlwZSAoZnVuY19zdHJpbmcsIAorCQkJCSAgICAgICBidWlsdGluX3R5cGVfY2hhciwgZnVuY19yYW5nZSk7CisgICAgICBmdW5jX3ZhbCA9IGFsbG9jYXRlX3ZhbHVlIChmdW5jX3N0cmluZyk7CisgICAgICBWQUxVRV9UWVBFIChmdW5jX3ZhbCkgPSBmdW5jX3N0cmluZzsKKyAgICAgIG1lbWNweSAoVkFMVUVfQ09OVEVOVFNfUkFXIChmdW5jX3ZhbCksIAorCSAgICAgIFNZTUJPTF9OQU1FICh0cmFjZWZyYW1lX2Z1biksIAorCSAgICAgIGxlbik7CisgICAgICBmdW5jX3ZhbC0+bW9kaWZpYWJsZSA9IDA7CisgICAgICBzZXRfaW50ZXJuYWx2YXIgKGxvb2t1cF9pbnRlcm5hbHZhciAoInRyYWNlX2Z1bmMiKSwgZnVuY192YWwpOworICAgIH0KKworICAvKiBzYXZlIGZpbGUgbmFtZSBhcyAiJHRyYWNlX2ZpbGUiLCBhIGRlYnVnZ2VyIHZhcmlhYmxlIHZpc2libGUgdG8gdXNlcnMgKi8KKyAgaWYgKHRyYWNlZnJhbWVfc2FsLnN5bXRhYiA9PSBOVUxMIHx8IAorICAgICAgdHJhY2VmcmFtZV9zYWwuc3ltdGFiLT5maWxlbmFtZSA9PSBOVUxMKQorICAgIHNldF9pbnRlcm5hbHZhciAobG9va3VwX2ludGVybmFsdmFyICgidHJhY2VfZmlsZSIpLCAKKwkJICAgICB2YWx1ZV9mcm9tX2xvbmdlc3QgKGNoYXJzdGFyLCAoTE9OR0VTVCkgMCkpOworICBlbHNlCisgICAgeworICAgICAgbGVuID0gc3RybGVuICh0cmFjZWZyYW1lX3NhbC5zeW10YWItPmZpbGVuYW1lKTsKKyAgICAgIGZpbGVfcmFuZ2UgID0gY3JlYXRlX3JhbmdlX3R5cGUgKGZpbGVfcmFuZ2UsICAKKwkJCQkgICAgICAgYnVpbHRpbl90eXBlX2ludCwgMCwgbGVuIC0gMSk7CisgICAgICBmaWxlX3N0cmluZyA9IGNyZWF0ZV9hcnJheV90eXBlIChmaWxlX3N0cmluZywgCisJCQkJICAgICAgIGJ1aWx0aW5fdHlwZV9jaGFyLCBmaWxlX3JhbmdlKTsKKyAgICAgIGZpbGVfdmFsID0gYWxsb2NhdGVfdmFsdWUgKGZpbGVfc3RyaW5nKTsKKyAgICAgIFZBTFVFX1RZUEUgKGZpbGVfdmFsKSA9IGZpbGVfc3RyaW5nOworICAgICAgbWVtY3B5IChWQUxVRV9DT05URU5UU19SQVcgKGZpbGVfdmFsKSwgCisJICAgICAgdHJhY2VmcmFtZV9zYWwuc3ltdGFiLT5maWxlbmFtZSwgCisJICAgICAgbGVuKTsKKyAgICAgIGZpbGVfdmFsLT5tb2RpZmlhYmxlID0gMDsKKyAgICAgIHNldF9pbnRlcm5hbHZhciAobG9va3VwX2ludGVybmFsdmFyICgidHJhY2VfZmlsZSIpLCBmaWxlX3ZhbCk7CisgICAgfQorfQorCisvKiBMb3cgbGV2ZWwgcm91dGluZSB0byBzZXQgYSB0cmFjZXBvaW50LgorICAgUmV0dXJucyB0aGUgdHJhY2Vwb2ludCBvYmplY3Qgc28gY2FsbGVyIGNhbiBzZXQgb3RoZXIgdGhpbmdzLgorICAgRG9lcyBub3Qgc2V0IHRoZSB0cmFjZXBvaW50IG51bWJlciEKKyAgIERvZXMgbm90IHByaW50IGFueXRoaW5nLgorCisgICA9PT4gVGhpcyByb3V0aW5lIHNob3VsZCBub3QgYmUgY2FsbGVkIGlmIHRoZXJlIGlzIGEgY2hhbmNlIG9mIGxhdGVyCisgICBlcnJvcigpOyBvdGhlcndpc2UgaXQgbGVhdmVzIGEgYm9ndXMgdHJhY2Vwb2ludCBvbiB0aGUgY2hhaW4uICBWYWxpZGF0ZQorICAgeW91ciBhcmd1bWVudHMgQkVGT1JFIGNhbGxpbmcgdGhpcyByb3V0aW5lISAgKi8KKworc3RhdGljIHN0cnVjdCB0cmFjZXBvaW50ICoKK3NldF9yYXdfdHJhY2Vwb2ludCAoc2FsKQorICAgICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHRyYWNlcG9pbnQgKnQsICp0YzsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKworICB0ID0gKHN0cnVjdCB0cmFjZXBvaW50ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHRyYWNlcG9pbnQpKTsKKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwIChmcmVlLCB0KTsKKyAgbWVtc2V0ICh0LCAwLCBzaXplb2YgKCp0KSk7CisgIHQtPmFkZHJlc3MgPSBzYWwucGM7CisgIGlmIChzYWwuc3ltdGFiID09IE5VTEwpCisgICAgdC0+c291cmNlX2ZpbGUgPSBOVUxMOworICBlbHNlCisgICAgdC0+c291cmNlX2ZpbGUgPSBzYXZlc3RyaW5nIChzYWwuc3ltdGFiLT5maWxlbmFtZSwgCisJCQkJIHN0cmxlbiAoc2FsLnN5bXRhYi0+ZmlsZW5hbWUpKTsKKworICB0LT5zZWN0aW9uICAgICA9IHNhbC5zZWN0aW9uOworICB0LT5sYW5ndWFnZSAgICA9IGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2xhbmd1YWdlOworICB0LT5pbnB1dF9yYWRpeCA9IGlucHV0X3JhZGl4OworICB0LT5saW5lX251bWJlciA9IHNhbC5saW5lOworICB0LT5lbmFibGVkICAgICA9IGVuYWJsZWQ7CisgIHQtPm5leHQgICAgICAgID0gMDsKKyAgdC0+c3RlcF9jb3VudCAgPSAwOworICB0LT5wYXNzX2NvdW50ICA9IDA7CisgIHQtPmFkZHJfc3RyaW5nID0gTlVMTDsKKworICAvKiBBZGQgdGhpcyB0cmFjZXBvaW50IHRvIHRoZSBlbmQgb2YgdGhlIGNoYWluCisgICAgIHNvIHRoYXQgYSBsaXN0IG9mIHRyYWNlcG9pbnRzIHdpbGwgY29tZSBvdXQgaW4gb3JkZXIKKyAgICAgb2YgaW5jcmVhc2luZyBudW1iZXJzLiAgKi8KKworICB0YyA9IHRyYWNlcG9pbnRfY2hhaW47CisgIGlmICh0YyA9PSAwKQorICAgIHRyYWNlcG9pbnRfY2hhaW4gPSB0OworICBlbHNlCisgICAgeworICAgICAgd2hpbGUgKHRjLT5uZXh0KQorCXRjID0gdGMtPm5leHQ7CisgICAgICB0Yy0+bmV4dCA9IHQ7CisgICAgfQorICBkaXNjYXJkX2NsZWFudXBzIChvbGRfY2hhaW4pOworICByZXR1cm4gdDsKK30KKworLyogU2V0IGEgdHJhY2Vwb2ludCBhY2NvcmRpbmcgdG8gQVJHIChmdW5jdGlvbiwgbGluZW51bSBvciAqYWRkcmVzcykgKi8KK3N0YXRpYyB2b2lkCit0cmFjZV9jb21tYW5kIChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgY2hhciAqKmNhbm9uaWNhbCA9IChjaGFyICoqKU5VTEw7CisgIHN0cnVjdCBzeW10YWJzX2FuZF9saW5lcyBzYWxzOworICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKyAgc3RydWN0IHRyYWNlcG9pbnQgKnQ7CisgIGNoYXIgKmFkZHJfc3RhcnQgPSAwLCAqYWRkcl9lbmQgPSAwOworICBpbnQgaTsKKworICBpZiAoIWFyZyB8fCAhKmFyZykKKyAgICBlcnJvciAoInRyYWNlIGNvbW1hbmQgcmVxdWlyZXMgYW4gYXJndW1lbnQiKTsKKworICBpZiAoZnJvbV90dHkgJiYgaW5mb192ZXJib3NlKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlRSQUNFICVzXG4iLCBhcmcpOworCisgIGFkZHJfc3RhcnQgPSBhcmc7CisgIHNhbHMgPSBkZWNvZGVfbGluZV8xICgmYXJnLCAxLCAoc3RydWN0IHN5bXRhYiAqKU5VTEwsIDAsICZjYW5vbmljYWwpOworICBhZGRyX2VuZCAgID0gYXJnOworICBpZiAoISBzYWxzLm5lbHRzKSAKKyAgICByZXR1cm47CS8qID8/PyBQcmVzdW1hYmx5IGRlY29kZV9saW5lXzEgaGFzIGFscmVhZHkgd2FybmVkPyAqLworCisgIC8qIFJlc29sdmUgYWxsIGxpbmUgbnVtYmVycyB0byBQQydzICovCisgIGZvciAoaSA9IDA7IGkgPCBzYWxzLm5lbHRzOyBpKyspCisgICAgcmVzb2x2ZV9zYWxfcGMgKCZzYWxzLnNhbHNbaV0pOworCisgIC8qIE5vdyBzZXQgYWxsIHRoZSB0cmFjZXBvaW50cy4gICovCisgIGZvciAoaSA9IDA7IGkgPCBzYWxzLm5lbHRzOyBpKyspCisgICAgeworICAgICAgc2FsID0gc2Fscy5zYWxzW2ldOworCisgICAgICB0ID0gc2V0X3Jhd190cmFjZXBvaW50IChzYWwpOworICAgICAgc2V0X3RyYWNlcG9pbnRfY291bnQgKHRyYWNlcG9pbnRfY291bnQgKyAxKTsKKyAgICAgIHQtPm51bWJlciA9IHRyYWNlcG9pbnRfY291bnQ7CisKKyAgICAgIC8qIElmIGEgY2Fub25pY2FsIGxpbmUgc3BlYyBpcyBuZWVkZWQgdXNlIHRoYXQgaW5zdGVhZCBvZiB0aGUKKwkgY29tbWFuZCBzdHJpbmcuICAqLworICAgICAgaWYgKGNhbm9uaWNhbCAhPSAoY2hhciAqKilOVUxMICYmIGNhbm9uaWNhbFtpXSAhPSBOVUxMKQorCXQtPmFkZHJfc3RyaW5nID0gY2Fub25pY2FsW2ldOworICAgICAgZWxzZSBpZiAoYWRkcl9zdGFydCkKKwl0LT5hZGRyX3N0cmluZyA9IHNhdmVzdHJpbmcgKGFkZHJfc3RhcnQsIGFkZHJfZW5kIC0gYWRkcl9zdGFydCk7CisKKyAgICAgIHRyYWNlX21lbnRpb24gKHQpOworCisgICAgICAvKiBMZXQgdGhlIFVJIGtub3cgb2YgYW55IGFkZGl0aW9ucyAqLworICAgICAgaWYgKGNyZWF0ZV90cmFjZXBvaW50X2hvb2spCisJY3JlYXRlX3RyYWNlcG9pbnRfaG9vayAodCk7CisgICAgfQorCisgIGlmIChzYWxzLm5lbHRzID4gMSkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJNdWx0aXBsZSB0cmFjZXBvaW50cyB3ZXJlIHNldC5cbiIpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiVXNlICdkZWxldGUgdHJhY2UnIHRvIGRlbGV0ZSB1bndhbnRlZCB0cmFjZXBvaW50cy5cbiIpOworICAgIH0KK30KKworLyogVGVsbCB0aGUgdXNlciB3ZSBoYXZlIGp1c3Qgc2V0IGEgdHJhY2Vwb2ludCBUUC4gKi8KKworc3RhdGljIHZvaWQKK3RyYWNlX21lbnRpb24gKHRwKQorICAgICBzdHJ1Y3QgdHJhY2Vwb2ludCAqdHA7Cit7CisgIHByaW50Zl9maWx0ZXJlZCAoIlRyYWNlcG9pbnQgJWQiLCB0cC0+bnVtYmVyKTsKKworICBpZiAoYWRkcmVzc3ByaW50IHx8ICh0cC0+c291cmNlX2ZpbGUgPT0gTlVMTCkpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiIGF0ICIpOworICAgICAgcHJpbnRfYWRkcmVzc19udW1lcmljICh0cC0+YWRkcmVzcywgMSwgZ2RiX3N0ZG91dCk7CisgICAgfQorICBpZiAodHAtPnNvdXJjZV9maWxlKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIjogZmlsZSAlcywgbGluZSAlZC4iLAorCQkgICAgIHRwLT5zb3VyY2VfZmlsZSwgdHAtPmxpbmVfbnVtYmVyKTsKKworICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworfQorCisvKiBQcmludCBpbmZvcm1hdGlvbiBvbiB0cmFjZXBvaW50IG51bWJlciBUUE5VTV9FWFAsIG9yIGFsbCBpZiBvbWl0dGVkLiAgKi8KKworc3RhdGljIHZvaWQKK3RyYWNlcG9pbnRzX2luZm8gKHRwbnVtX2V4cCwgZnJvbV90dHkpCisgICAgIGNoYXIgKnRwbnVtX2V4cDsKKyAgICAgaW50IGZyb21fdHR5OworeworICBzdHJ1Y3QgdHJhY2Vwb2ludCAqdDsKKyAgc3RydWN0IGFjdGlvbl9saW5lICphY3Rpb247CisgIGludCBmb3VuZF9hX3RyYWNlcG9pbnQgPSAwOworICBjaGFyIHdyYXBfaW5kZW50WzgwXTsKKyAgc3RydWN0IHN5bWJvbCAqc3ltOworICBpbnQgdHBudW0gPSAtMTsKKworICBpZiAodHBudW1fZXhwKQorICAgIHRwbnVtID0gcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAodHBudW1fZXhwKTsKKworICBBTExfVFJBQ0VQT0lOVFMgKHQpCisgICAgaWYgKHRwbnVtID09IC0xIHx8IHRwbnVtID09IHQtPm51bWJlcikKKyAgICAgIHsKKwlleHRlcm4gaW50IGFkZHJlc3NwcmludDsJLyogcHJpbnQgbWFjaGluZSBhZGRyZXNzZXM/ICovCisKKwlpZiAoIWZvdW5kX2FfdHJhY2Vwb2ludCsrKQorCSAgeworCSAgICBwcmludGZfZmlsdGVyZWQgKCJOdW0gRW5iICIpOworCSAgICBpZiAoYWRkcmVzc3ByaW50KQorCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkFkZHJlc3MgICAgIik7CisJICAgIHByaW50Zl9maWx0ZXJlZCAoIlBhc3NDIFN0ZXBDIFdoYXRcbiIpOworCSAgfQorCXN0cmNweSAod3JhcF9pbmRlbnQsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKKwlpZiAoYWRkcmVzc3ByaW50KQorCSAgc3RyY2F0ICh3cmFwX2luZGVudCwgIiAgICAgICAgICAgIik7CisKKwlwcmludGZfZmlsdGVyZWQgKCIlLTNkICUtM3MgIiwgdC0+bnVtYmVyLCAKKwkJCSB0LT5lbmFibGVkID09IGVuYWJsZWQgPyAieSIgOiAibiIpOworCWlmIChhZGRyZXNzcHJpbnQpCisJICBwcmludGZfZmlsdGVyZWQgKCIlcyAiLCAKKwkJCSAgIGxvY2FsX2hleF9zdHJpbmdfY3VzdG9tICgodW5zaWduZWQgbG9uZykgdC0+YWRkcmVzcywKKwkJCQkJCSAgICAiMDhsIikpOworCXByaW50Zl9maWx0ZXJlZCAoIiUtNWQgJS01ZCAiLCB0LT5wYXNzX2NvdW50LCB0LT5zdGVwX2NvdW50KTsKKworCWlmICh0LT5zb3VyY2VfZmlsZSkKKwkgIHsKKwkgICAgc3ltID0gZmluZF9wY19zZWN0X2Z1bmN0aW9uICh0LT5hZGRyZXNzLCB0LT5zZWN0aW9uKTsKKwkgICAgaWYgKHN5bSkKKwkgICAgICB7CisJCWZwdXRzX2ZpbHRlcmVkICgiaW4gIiwgZ2RiX3N0ZG91dCk7CisJCWZwdXRzX2ZpbHRlcmVkIChTWU1CT0xfU09VUkNFX05BTUUgKHN5bSksIGdkYl9zdGRvdXQpOworCQl3cmFwX2hlcmUgKHdyYXBfaW5kZW50KTsKKwkJZnB1dHNfZmlsdGVyZWQgKCIgYXQgIiwgZ2RiX3N0ZG91dCk7CisJICAgICAgfQorCSAgICBmcHV0c19maWx0ZXJlZCAodC0+c291cmNlX2ZpbGUsIGdkYl9zdGRvdXQpOworCSAgICBwcmludGZfZmlsdGVyZWQgKCI6JWQiLCB0LT5saW5lX251bWJlcik7CisJICB9CisJZWxzZQorCSAgcHJpbnRfYWRkcmVzc19zeW1ib2xpYyAodC0+YWRkcmVzcywgZ2RiX3N0ZG91dCwgZGVtYW5nbGUsICIgIik7CisKKwlwcmludGZfZmlsdGVyZWQgKCJcbiIpOworCWlmICh0LT5hY3Rpb25zKQorCSAgeworCSAgICBwcmludGZfZmlsdGVyZWQgKCIgIEFjdGlvbnMgZm9yIHRyYWNlcG9pbnQgJWQ6IFxuIiwgdC0+bnVtYmVyKTsKKwkgICAgZm9yIChhY3Rpb24gPSB0LT5hY3Rpb25zOyBhY3Rpb247IGFjdGlvbiA9IGFjdGlvbi0+bmV4dCkKKwkgICAgICB7CisJCXByaW50Zl9maWx0ZXJlZCAoIlx0JXNcbiIsIGFjdGlvbi0+YWN0aW9uKTsKKwkgICAgICB9CisJICB9CisgICAgICB9CisgIGlmICghZm91bmRfYV90cmFjZXBvaW50KQorICAgIHsKKyAgICAgIGlmICh0cG51bSA9PSAtMSkKKyAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiTm8gdHJhY2Vwb2ludHMuXG4iKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiTm8gdHJhY2Vwb2ludCBudW1iZXIgJWQuXG4iLCB0cG51bSk7CisgICAgfQorfQorCisvKiBPcHRpbWl6YXRpb246IHRoZSBjb2RlIHRvIHBhcnNlIGFuIGVuYWJsZSwgZGlzYWJsZSwgb3IgZGVsZXRlIFRQIGNvbW1hbmQKKyAgIGlzIHZpcnR1YWxseSBpZGVudGljYWwgZXhjZXB0IGZvciB3aGV0aGVyIGl0IHBlcmZvcm1zIGFuIGVuYWJsZSwgZGlzYWJsZSwKKyAgIG9yIGRlbGV0ZS4gIFRoZXJlZm9yZSBJJ3ZlIGNvbWJpbmVkIHRoZW0gaW50byBvbmUgZnVuY3Rpb24gd2l0aCBhbiBvcGNvZGUuCisgICAqLworZW51bSB0cmFjZXBvaW50X29wY29kZSAKK3sKKyAgZW5hYmxlLCAKKyAgZGlzYWJsZSwKKyAgZGVsZXRlCit9OworCisvKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgZW5hYmxlLCBkaXNhYmxlIGFuZCBkZWxldGUuICovCitzdGF0aWMgdm9pZAordHJhY2Vwb2ludF9vcGVyYXRpb24gKHQsIGZyb21fdHR5LCBvcGNvZGUpCisgICAgIHN0cnVjdCB0cmFjZXBvaW50ICp0OworICAgICBpbnQgZnJvbV90dHk7CisgICAgIGVudW0gdHJhY2Vwb2ludF9vcGNvZGUgb3Bjb2RlOworeworICBzdHJ1Y3QgdHJhY2Vwb2ludCAqdDI7CisKKyAgc3dpdGNoIChvcGNvZGUpIHsKKyAgY2FzZSBlbmFibGU6CisgICAgdC0+ZW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgaWYgKG1vZGlmeV90cmFjZXBvaW50X2hvb2spCisgICAgICBtb2RpZnlfdHJhY2Vwb2ludF9ob29rICh0KTsKKyAgICBicmVhazsKKyAgY2FzZSBkaXNhYmxlOgorICAgIHQtPmVuYWJsZWQgPSBkaXNhYmxlZDsKKyAgICBpZiAobW9kaWZ5X3RyYWNlcG9pbnRfaG9vaykKKyAgICAgIG1vZGlmeV90cmFjZXBvaW50X2hvb2sgKHQpOworICAgIGJyZWFrOworICBjYXNlIGRlbGV0ZToKKyAgICBpZiAodHJhY2Vwb2ludF9jaGFpbiA9PSB0KQorICAgICAgdHJhY2Vwb2ludF9jaGFpbiA9IHQtPm5leHQ7CisKKyAgICBBTExfVFJBQ0VQT0lOVFMgKHQyKQorICAgICAgaWYgKHQyLT5uZXh0ID09IHQpCisJeworCSAgdDItPm5leHQgPSB0LT5uZXh0OworCSAgYnJlYWs7CisJfQorCisgICAgLyogTGV0IHRoZSBVSSBrbm93IG9mIGFueSBkZWxldGlvbnMgKi8KKyAgICBpZiAoZGVsZXRlX3RyYWNlcG9pbnRfaG9vaykKKyAgICAgIGRlbGV0ZV90cmFjZXBvaW50X2hvb2sgKHQpOworCisgICAgaWYgKHQtPmFkZHJfc3RyaW5nKQorICAgICAgZnJlZSAodC0+YWRkcl9zdHJpbmcpOworICAgIGlmICh0LT5zb3VyY2VfZmlsZSkKKyAgICAgIGZyZWUgKHQtPnNvdXJjZV9maWxlKTsKKyAgICBpZiAodC0+YWN0aW9ucykKKyAgICAgIGZyZWVfYWN0aW9ucyAodCk7CisKKyAgICBmcmVlICh0KTsKKyAgICBicmVhazsKKyAgfQorfQorCisvKiBVdGlsaXR5OiBwYXJzZSBhIHRyYWNlcG9pbnQgbnVtYmVyIGFuZCBsb29rIGl0IHVwIGluIHRoZSBsaXN0LiAgKi8KK3N0cnVjdCB0cmFjZXBvaW50ICoKK2dldF90cmFjZXBvaW50X2J5X251bWJlciAoYXJnKQorICAgICBjaGFyICoqYXJnOworeworICBzdHJ1Y3QgdHJhY2Vwb2ludCAqdDsKKyAgY2hhciAqZW5kLCAqY29weTsKKyAgdmFsdWVfcHRyIHZhbDsKKyAgaW50IHRwbnVtOworCisgIGlmIChhcmcgPT0gMCkKKyAgICBlcnJvciAoIkJhZCB0cmFjZXBvaW50IGFyZ3VtZW50Iik7CisKKyAgaWYgKCphcmcgPT0gMCB8fCAqKmFyZyA9PSAwKQkvKiBlbXB0eSBhcmcgbWVhbnMgcmVmZXIgdG8gbGFzdCB0cCAqLworICAgIHRwbnVtID0gdHJhY2Vwb2ludF9jb3VudDsKKyAgZWxzZSBpZiAoKiphcmcgPT0gJyQnKQkvKiBoYW5kbGUgY29udmVuaWVuY2UgdmFyaWFibGUgKi8KKyAgICB7CisgICAgICAvKiBNYWtlIGEgY29weSBvZiB0aGUgbmFtZSwgc28gd2UgY2FuIG51bGwtdGVybWluYXRlIGl0CisJIHRvIHBhc3MgdG8gbG9va3VwX2ludGVybmFsdmFyKCkuICAqLworICAgICAgZW5kID0gKmFyZyArIDE7CisgICAgICB3aGlsZSAoaXNhbG51bSgqZW5kKSB8fCAqZW5kID09ICdfJykKKwllbmQrKzsKKyAgICAgIGNvcHkgPSAoY2hhciAqKSBhbGxvY2EgKGVuZCAtICphcmcpOworICAgICAgc3RybmNweSAoY29weSwgKmFyZyArIDEsIChlbmQgLSAqYXJnIC0gMSkpOworICAgICAgY29weVtlbmQgLSAqYXJnIC0gMV0gPSAnXDAnOworICAgICAgKmFyZyA9IGVuZDsKKworICAgICAgdmFsID0gdmFsdWVfb2ZfaW50ZXJuYWx2YXIgKGxvb2t1cF9pbnRlcm5hbHZhciAoY29weSkpOworICAgICAgaWYgKFRZUEVfQ09ERSggVkFMVUVfVFlQRSAodmFsKSkgIT0gVFlQRV9DT0RFX0lOVCkKKwllcnJvciAoIkNvbnZlbmllbmNlIHZhcmlhYmxlIG11c3QgaGF2ZSBpbnRlZ3JhbCB0eXBlLiIpOworICAgICAgdHBudW0gPSAoaW50KSB2YWx1ZV9hc19sb25nICh2YWwpOworICAgIH0KKyAgZWxzZQkJLyogaGFuZGxlIHRyYWNlcG9pbnQgbnVtYmVyICovCisgICAgeworICAgICAgdHBudW0gPSBzdHJ0b2wgKCphcmcsIGFyZywgMCk7CisgICAgICBpZiAodHBudW0gPT0gMCkJCS8qIHBvc3NpYmxlIHN0cnRvbCBmYWlsdXJlICovCisJd2hpbGUgKCoqYXJnICYmICFpc3NwYWNlICgqKmFyZykpCisJICAoKmFyZykrKzsJCS8qIGFkdmFuY2UgdG8gbmV4dCB3aGl0ZSBzcGFjZSwgaWYgYW55ICovCisgICAgfQorICBBTExfVFJBQ0VQT0lOVFMgKHQpCisgICAgaWYgKHQtPm51bWJlciA9PSB0cG51bSkKKyAgICAgIHsKKwlyZXR1cm4gdDsKKyAgICAgIH0KKyAgcHJpbnRmX3VuZmlsdGVyZWQgKCJObyB0cmFjZXBvaW50IG51bWJlciAlZC5cbiIsIHRwbnVtKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFV0aWxpdHk6IHBhcnNlIGEgbGlzdCBvZiB0cmFjZXBvaW50IG51bWJlcnMsIGFuZCBjYWxsIGEgZnVuYyBmb3IgZWFjaC4gKi8KK3N0YXRpYyB2b2lkCittYXBfYXJnc19vdmVyX3RyYWNlcG9pbnRzIChhcmdzLCBmcm9tX3R0eSwgb3Bjb2RlKQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7CisgICAgIGVudW0gdHJhY2Vwb2ludF9vcGNvZGUgb3Bjb2RlOworeworICBzdHJ1Y3QgdHJhY2Vwb2ludCAqdCwgKnRtcDsKKyAgaW50IHRwbnVtOworICBjaGFyICpjcDsKKworICBpZiAoYXJncyA9PSAwIHx8ICphcmdzID09IDApCS8qIGRvIHRoZW0gYWxsICovCisgICAgQUxMX1RSQUNFUE9JTlRTX1NBRkUgKHQsIHRtcCkKKyAgICAgIHRyYWNlcG9pbnRfb3BlcmF0aW9uICh0LCBmcm9tX3R0eSwgb3Bjb2RlKTsKKyAgZWxzZQorICAgIHdoaWxlICgqYXJncykKKyAgICAgIHsKKwlRVUlUOwkJLyogZ2l2ZSB1c2VyIG9wdGlvbiB0byBiYWlsIG91dCB3aXRoIF5DICovCisJaWYgKHQgPSBnZXRfdHJhY2Vwb2ludF9ieV9udW1iZXIgKCZhcmdzKSkKKwkgIHRyYWNlcG9pbnRfb3BlcmF0aW9uICh0LCBmcm9tX3R0eSwgb3Bjb2RlKTsKKwl3aGlsZSAoKmFyZ3MgPT0gJyAnIHx8ICphcmdzID09ICdcdCcpCisJICBhcmdzKys7CisgICAgICB9Cit9CisKKy8qIFRoZSAnZW5hYmxlIHRyYWNlJyBjb21tYW5kIGVuYWJsZXMgdHJhY2Vwb2ludHMuICBOb3Qgc3VwcG9ydGVkIGJ5IGFsbCB0YXJnZXRzLiAgKi8KK3N0YXRpYyB2b2lkCitlbmFibGVfdHJhY2VfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZG9udF9yZXBlYXQgKCk7CisgIG1hcF9hcmdzX292ZXJfdHJhY2Vwb2ludHMgKGFyZ3MsIGZyb21fdHR5LCBlbmFibGUpOworfQorCisvKiBUaGUgJ2Rpc2FibGUgdHJhY2UnIGNvbW1hbmQgZW5hYmxlcyB0cmFjZXBvaW50cy4gIE5vdCBzdXBwb3J0ZWQgYnkgYWxsIHRhcmdldHMuICAqLworc3RhdGljIHZvaWQKK2Rpc2FibGVfdHJhY2VfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZG9udF9yZXBlYXQgKCk7CisgIG1hcF9hcmdzX292ZXJfdHJhY2Vwb2ludHMgKGFyZ3MsIGZyb21fdHR5LCBkaXNhYmxlKTsKK30KKworLyogUmVtb3ZlIGEgdHJhY2Vwb2ludCAob3IgYWxsIGlmIG5vIGFyZ3VtZW50KSAqLworc3RhdGljIHZvaWQKK2RlbGV0ZV90cmFjZV9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBkb250X3JlcGVhdCAoKTsKKyAgaWYgKCFhcmdzIHx8ICEqYXJncykJCS8qIE5vIGFyZ3MgaW1wbGllcyBhbGwgdHJhY2Vwb2ludHM7ICovCisgICAgaWYgKGZyb21fdHR5KQkJLyogY29uZmlybSBvbmx5IGlmIGZyb21fdHR5Li4uICovCisgICAgICBpZiAodHJhY2Vwb2ludF9jaGFpbikgCS8qIGFuZCBpZiB0aGVyZSBhcmUgdHJhY2Vwb2ludHMgdG8gZGVsZXRlISAqLworCWlmICghcXVlcnkgKCJEZWxldGUgYWxsIHRyYWNlcG9pbnRzPyAiKSkKKwkgIHJldHVybjsKKworICBtYXBfYXJnc19vdmVyX3RyYWNlcG9pbnRzIChhcmdzLCBmcm9tX3R0eSwgZGVsZXRlKTsKK30KKworLyogU2V0IHBhc3Njb3VudCBmb3IgdHJhY2Vwb2ludC4KKworICAgRmlyc3QgY29tbWFuZCBhcmd1bWVudCBpcyBwYXNzY291bnQsIHNlY29uZCBpcyB0cmFjZXBvaW50IG51bWJlci4KKyAgIElmIHRyYWNlcG9pbnQgbnVtYmVyIG9taXR0ZWQsIGFwcGx5IHRvIG1vc3QgcmVjZW50bHkgZGVmaW5lZC4KKyAgIEFsc28gYWNjZXB0cyBzcGVjaWFsIGFyZ3VtZW50ICJhbGwiLiAgKi8KKworc3RhdGljIHZvaWQKK3RyYWNlX3Bhc3NfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgc3RydWN0IHRyYWNlcG9pbnQgKnQxID0gKHN0cnVjdCB0cmFjZXBvaW50ICopIC0xLCAqdDI7CisgIHVuc2lnbmVkIGxvbmcgY291bnQ7CisKKyAgaWYgKGFyZ3MgPT0gMCB8fCAqYXJncyA9PSAwKQorICAgIGVycm9yICgiUEFTUyBjb21tYW5kIHJlcXVpcmVzIGFuIGFyZ3VtZW50IChjb3VudCArIG9wdGlvbmFsIFRQIG51bSkiKTsKKworICBjb3VudCA9IHN0cnRvdWwgKGFyZ3MsICZhcmdzLCAxMCk7CS8qIGNvdW50IGNvbWVzIGZpcnN0LCB0aGVuIFRQIG51bSAqLworCisgIHdoaWxlICgqYXJncyAmJiBpc3NwYWNlICgqYXJncykpCisgICAgYXJncysrOworCisgIGlmICgqYXJncyAmJiBzdHJuY2FzZWNtcCAoYXJncywgImFsbCIsIDMpID09IDApCisgICAgYXJncyArPSAzOwkvKiBza2lwIHNwZWNpYWwgYXJndW1lbnQgImFsbCIgKi8KKyAgZWxzZQorICAgIHQxID0gZ2V0X3RyYWNlcG9pbnRfYnlfbnVtYmVyICgmYXJncyk7CisKKyAgaWYgKCphcmdzKQorICAgIGVycm9yICgiSnVuayBhdCBlbmQgb2YgYXJndW1lbnRzLiIpOworCisgIGlmICh0MSA9PSBOVUxMKQorICAgIHJldHVybjsJLyogZXJyb3IsIGJhZCB0cmFjZXBvaW50IG51bWJlciAqLworCisgIEFMTF9UUkFDRVBPSU5UUyAodDIpCisgICAgaWYgKHQxID09IChzdHJ1Y3QgdHJhY2Vwb2ludCAqKSAtMSB8fCB0MSA9PSB0MikKKyAgICAgIHsKKwl0Mi0+cGFzc19jb3VudCA9IGNvdW50OworICAgICAgICBpZiAobW9kaWZ5X3RyYWNlcG9pbnRfaG9vaykKKyAgICAgICAgICBtb2RpZnlfdHJhY2Vwb2ludF9ob29rICh0Mik7CisJaWYgKGZyb21fdHR5KQorCSAgcHJpbnRmX2ZpbHRlcmVkICgiU2V0dGluZyB0cmFjZXBvaW50ICVkJ3MgcGFzc2NvdW50IHRvICVkXG4iLCAKKwkJCSAgIHQyLT5udW1iZXIsIGNvdW50KTsKKyAgICAgIH0KK30KKworLyogQUNUSU9OUyBmdW5jdGlvbnM6ICovCisKKy8qIFByb3RvdHlwZXMgZm9yIGFjdGlvbi1wYXJzaW5nIHV0aWxpdHkgY29tbWFuZHMgICovCitzdGF0aWMgdm9pZCAgcmVhZF9hY3Rpb25zIFBBUkFNUygoc3RydWN0IHRyYWNlcG9pbnQgKikpOworc3RhdGljIGNoYXIgKnBhcnNlX2FuZF9ldmFsX21lbXJhbmdlIFBBUkFNUyAoKGNoYXIgKiwKKwkJCQkJICAgICAgQ09SRV9BRERSLCAKKwkJCQkJICAgICAgbG9uZyAqLAorCQkJCQkgICAgICBiZmRfc2lnbmVkX3ZtYSAqLAorCQkJCQkgICAgICBsb25nICopKTsKKworLyogVGhlIHRocmVlIGZ1bmN0aW9uczoKKyAgIAljb2xsZWN0X3BzZXVkb2NvbW1hbmQsIAorCXdoaWxlX3N0ZXBwaW5nX3BzZXVkb2NvbW1hbmQsIGFuZCAKKwllbmRfYWN0aW9uc19wc2V1ZG9jb21tYW5kCisgICBhcmUgcGxhY2Vob2xkZXJzIGZvciAiY29tbWFuZHMiIHRoYXQgYXJlIGFjdHVhbGx5IE9OTFkgdG8gYmUgdXNlZAorICAgd2l0aGluIGEgdHJhY2Vwb2ludCBhY3Rpb24gbGlzdC4gIElmIHRoZSBhY3R1YWwgZnVuY3Rpb24gaXMgZXZlciBjYWxsZWQsCisgICBpdCBtZWFucyB0aGF0IHNvbWVib2R5IGlzc3VlZCB0aGUgImNvbW1hbmQiIGF0IHRoZSB0b3AgbGV2ZWwsCisgICB3aGljaCBpcyBhbHdheXMgYW4gZXJyb3IuICAqLworCitzdGF0aWMgdm9pZCAKK2VuZF9hY3Rpb25zX3BzZXVkb2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGVycm9yICgiVGhpcyBjb21tYW5kIGNhbm5vdCBiZSB1c2VkIGF0IHRoZSB0b3AgbGV2ZWwuIik7Cit9CisKK3N0YXRpYyB2b2lkCit3aGlsZV9zdGVwcGluZ19wc2V1ZG9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBlcnJvciAoIlRoaXMgY29tbWFuZCBjYW4gb25seSBiZSB1c2VkIGluIGEgdHJhY2Vwb2ludCBhY3Rpb25zIGxpc3QuIik7Cit9CisKK3N0YXRpYyB2b2lkCitjb2xsZWN0X3BzZXVkb2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGVycm9yICgiVGhpcyBjb21tYW5kIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSB0cmFjZXBvaW50IGFjdGlvbnMgbGlzdC4iKTsKK30KKworLyogRW50ZXIgYSBsaXN0IG9mIGFjdGlvbnMgZm9yIGEgdHJhY2Vwb2ludC4gICovCitzdGF0aWMgdm9pZAordHJhY2VfYWN0aW9uc19jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBzdHJ1Y3QgdHJhY2Vwb2ludCAqdDsKKyAgY2hhciAqYWN0aW9uczsKKyAgY2hhciB0bXBidWZbMTI4XTsKKyAgY2hhciAqZW5kX21zZyA9ICJFbmQgd2l0aCBhIGxpbmUgc2F5aW5nIGp1c3QgXCJlbmRcIi4iOworCisgIGlmICh0ID0gZ2V0X3RyYWNlcG9pbnRfYnlfbnVtYmVyICgmYXJncykpCisgICAgeworICAgICAgc3ByaW50ZiAodG1wYnVmLCAiRW50ZXIgYWN0aW9ucyBmb3IgdHJhY2Vwb2ludCAlZCwgb25lIHBlciBsaW5lLiIsCisJICAgICAgIHQtPm51bWJlcik7CisKKyAgICAgIGlmIChmcm9tX3R0eSkKKwl7CisJICBpZiAocmVhZGxpbmVfYmVnaW5faG9vaykKKwkgICAgKCpyZWFkbGluZV9iZWdpbl9ob29rKSAoIiVzICAlc1xuIiwgdG1wYnVmLCBlbmRfbXNnKTsKKwkgIGVsc2UgaWYgKGlucHV0X2Zyb21fdGVybWluYWxfcCAoKSkKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgiJXNcbiVzXG4iLCB0bXBidWYsIGVuZF9tc2cpOworCX0KKworICAgICAgZnJlZV9hY3Rpb25zICh0KTsKKyAgICAgIHQtPnN0ZXBfY291bnQgPSAwOwkvKiByZWFkX2FjdGlvbnMgbWF5IHNldCB0aGlzICovCisgICAgICByZWFkX2FjdGlvbnMgKHQpOworCisgICAgICBpZiAocmVhZGxpbmVfZW5kX2hvb2spCisJKCpyZWFkbGluZV9lbmRfaG9vaykgKCk7CisKKyAgICAgIC8qIHRyYWNlcG9pbnRzX2NoYW5nZWQgKCkgKi8KKyAgICB9CisgIC8qIGVsc2UgZXJyb3IsIGp1c3QgcmV0dXJuOyAqLworfQorCisvKiB3b3JrZXIgZnVuY3Rpb24gKi8KK3N0YXRpYyB2b2lkCityZWFkX2FjdGlvbnMgKHQpCisgICAgIHN0cnVjdCB0cmFjZXBvaW50ICp0OworeworICBjaGFyICpsaW5lOworICBjaGFyICpwcm9tcHQxID0gIj4gIiwgKnByb21wdDIgPSAiICA+ICI7CisgIGNoYXIgKnByb21wdCA9IHByb21wdDE7CisgIGVudW0gYWN0aW9ubGluZV90eXBlIGxpbmV0eXBlOworICBleHRlcm4gRklMRSAqaW5zdHJlYW07CisgIHN0cnVjdCBhY3Rpb25fbGluZSAqbmV4dCA9IE5VTEwsICp0ZW1wOworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworCisgIC8qIENvbnRyb2wtQyBxdWl0cyBpbnN0YW50bHkgaWYgdHlwZWQgd2hpbGUgaW4gdGhpcyBsb29wCisgICAgIHNpbmNlIGl0IHNob3VsZCBub3Qgd2FpdCB1bnRpbCB0aGUgdXNlciB0eXBlcyBhIG5ld2xpbmUuICAqLworICBpbW1lZGlhdGVfcXVpdCsrOworI2lmZGVmIFNUT1BfU0lHTkFMCisgIGlmIChqb2JfY29udHJvbCkKKyAgICBzaWduYWwgKFNUT1BfU0lHTkFMLCBzdG9wX3NpZyk7CisjZW5kaWYKKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfYWN0aW9ucywgKHZvaWQgKikgdCk7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IGFsbCBvdXRwdXQgaGFzIGJlZW4gb3V0cHV0LiAgU29tZSBtYWNoaW5lcyBtYXkgbGV0CisJIHlvdSBnZXQgYXdheSB3aXRoIGxlYXZpbmcgb3V0IHNvbWUgb2YgdGhlIGdkYl9mbHVzaCwgYnV0IG5vdCBhbGwuICAqLworICAgICAgd3JhcF9oZXJlICgiIik7CisgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworICAgICAgZ2RiX2ZsdXNoIChnZGJfc3RkZXJyKTsKKworICAgICAgaWYgKHJlYWRsaW5lX2hvb2sgJiYgaW5zdHJlYW0gPT0gTlVMTCkKKwlsaW5lID0gKCpyZWFkbGluZV9ob29rKSAocHJvbXB0KTsKKyAgICAgIGVsc2UgaWYgKGluc3RyZWFtID09IHN0ZGluICYmIElTQVRUWSAoaW5zdHJlYW0pKQorCXsKKwkgIGxpbmUgPSByZWFkbGluZSAocHJvbXB0KTsKKwkgIGlmIChsaW5lICYmICpsaW5lKQkJLyogYWRkIGl0IHRvIGNvbW1hbmQgaGlzdG9yeSAqLworCSAgICBhZGRfaGlzdG9yeSAobGluZSk7CisJfQorICAgICAgZWxzZQorCWxpbmUgPSBnZGJfcmVhZGxpbmUgKDApOworCisgICAgICBsaW5ldHlwZSA9IHZhbGlkYXRlX2FjdGlvbmxpbmUgKCZsaW5lLCB0KTsKKyAgICAgIGlmIChsaW5ldHlwZSA9PSBCQURMSU5FKQorCWNvbnRpbnVlOwkvKiBhbHJlYWR5IHdhcm5lZCAtLSBjb2xsZWN0IGFub3RoZXIgbGluZSAqLworCisgICAgICB0ZW1wID0geG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYWN0aW9uX2xpbmUpKTsKKyAgICAgIHRlbXAtPm5leHQgPSBOVUxMOworICAgICAgdGVtcC0+YWN0aW9uID0gbGluZTsKKworICAgICAgaWYgKG5leHQgPT0gTlVMTCkJCS8qIGZpcnN0IGFjdGlvbiBmb3IgdGhpcyB0cmFjZXBvaW50PyAqLworCXQtPmFjdGlvbnMgPSBuZXh0ID0gdGVtcDsKKyAgICAgIGVsc2UKKwl7CisJICBuZXh0LT5uZXh0ID0gdGVtcDsKKwkgIG5leHQgPSB0ZW1wOworCX0KKworICAgICAgaWYgKGxpbmV0eXBlID09IFNURVBQSU5HKQkvKiBiZWdpbiAid2hpbGUtc3RlcHBpbmciICovCisJaWYgKHByb21wdCA9PSBwcm9tcHQyKQorCSAgeworCSAgICB3YXJuaW5nICgiQWxyZWFkeSBwcm9jZXNzaW5nICd3aGlsZS1zdGVwcGluZyciKTsKKwkgICAgY29udGludWU7CisJICB9CisJZWxzZQorCSAgcHJvbXB0ID0gcHJvbXB0MjsJLyogY2hhbmdlIHByb21wdCBmb3Igc3RlcHBpbmcgYWN0aW9ucyAqLworICAgICAgZWxzZSBpZiAobGluZXR5cGUgPT0gRU5EKQorCWlmIChwcm9tcHQgPT0gcHJvbXB0MikKKwkgIHsKKwkgICAgcHJvbXB0ID0gcHJvbXB0MTsJLyogZW5kIG9mIHNpbmdsZS1zdGVwcGluZyBhY3Rpb25zICovCisJICB9CisJZWxzZQorCSAgeyAvKiBlbmQgb2YgYWN0aW9ucyAqLworCSAgICBpZiAodC0+YWN0aW9ucy0+bmV4dCA9PSBOVUxMKQorCSAgICAgIHsKKwkJLyogYW4gImVuZCIgYWxsIGJ5IGl0c2VsZiB3aXRoIG5vIG90aGVyIGFjdGlvbnMgbWVhbnMKKwkJICAgdGhpcyB0cmFjZXBvaW50IGhhcyBubyBhY3Rpb25zLiAgRGlzY2FyZCBlbXB0eSBsaXN0LiAqLworCQlmcmVlX2FjdGlvbnMgKHQpOworCSAgICAgIH0KKwkgICAgYnJlYWs7CisJICB9CisgICAgfQorI2lmZGVmIFNUT1BfU0lHTkFMCisgIGlmIChqb2JfY29udHJvbCkKKyAgICBzaWduYWwgKFNUT1BfU0lHTkFMLCBTSUdfREZMKTsKKyNlbmRpZgorICBpbW1lZGlhdGVfcXVpdCA9IDA7CisgIGRpc2NhcmRfY2xlYW51cHMgKG9sZF9jaGFpbik7Cit9CisKKy8qIHdvcmtlciBmdW5jdGlvbiAqLworZW51bSBhY3Rpb25saW5lX3R5cGUKK3ZhbGlkYXRlX2FjdGlvbmxpbmUgKGxpbmUsIHQpCisgICAgIGNoYXIgKipsaW5lOworICAgICBzdHJ1Y3QgdHJhY2Vwb2ludCAqdDsKK3sKKyAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7CisgIHN0cnVjdCBleHByZXNzaW9uICpleHAgPSBOVUxMOworICB2YWx1ZV9wdHIgdGVtcCwgdGVtcDI7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW4gPSBOVUxMOworICBjaGFyICpwOworCisgIGZvciAocCA9ICpsaW5lOyBpc3NwYWNlICgqcCk7ICkKKyAgICBwKys7CisKKyAgLyogc3ltYm9sIGxvb2t1cCBldGMuICovCisgIGlmICgqcCA9PSAnXDAnKQkvKiBlbXB0eSBsaW5lOiBqdXN0IHByb21wdCBmb3IgYW5vdGhlciBsaW5lLiAqLworICAgIHJldHVybiBCQURMSU5FOworCisgIGlmICgqcCA9PSAnIycpCS8qIGNvbW1lbnQgbGluZSAqLworICAgIHJldHVybiBHRU5FUklDOworCisgIGMgPSBsb29rdXBfY21kICgmcCwgY21kbGlzdCwgIiIsIC0xLCAxKTsKKyAgaWYgKGMgPT0gMCkKKyAgICB7CisgICAgICB3YXJuaW5nICgiJyVzJyBpcyBub3QgYW4gYWN0aW9uIHRoYXQgSSBrbm93LCBvciBpcyBhbWJpZ3VvdXMuIiwgcCk7CisgICAgICByZXR1cm4gQkFETElORTsKKyAgICB9CisgICAgCisgIGlmIChjLT5mdW5jdGlvbi5jZnVuYyA9PSBjb2xsZWN0X3BzZXVkb2NvbW1hbmQpCisgICAgeworICAgICAgc3RydWN0IGFnZW50X2V4cHIgKmFleHByOworICAgICAgc3RydWN0IGFnZW50X3JlcXMgYXJlcXM7CisKKyAgICAgIGRvIHsJCQkvKiByZXBlYXQgb3ZlciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0ICovCisJUVVJVDsJCQkvKiBhbGxvdyB1c2VyIHRvIGJhaWwgb3V0IHdpdGggXkMgKi8KKwl3aGlsZSAoaXNzcGFjZSAoKnApKQorCSAgcCsrOworCisJaWYgKCpwID09ICckJykJCQkvKiBsb29rIGZvciBzcGVjaWFsIHBzZXVkby1zeW1ib2xzICovCisJICB7CisJICAgIGxvbmcgdHlwZWNvZGUsIHNpemU7CisJICAgIGJmZF9zaWduZWRfdm1hIG9mZnNldDsKKworCSAgICBpZiAoKDAgPT0gc3RybmNhc2VjbXAgKCJyZWciLCBwICsgMSwgMykpIHx8CisJCSgwID09IHN0cm5jYXNlY21wICgiYXJnIiwgcCArIDEsIDMpKSB8fAorCQkoMCA9PSBzdHJuY2FzZWNtcCAoImxvYyIsIHAgKyAxLCAzKSkpCisJICAgICAgeworCQlwID0gc3RyY2hyIChwLCAnLCcpOworCQljb250aW51ZTsKKwkgICAgICB9CisJICAgIC8qIGVsc2UgZmFsbCB0aHJ1LCB0cmVhdCBwIGFzIGFuIGV4cHJlc3Npb24gYW5kIHBhcnNlIGl0ISAqLworCSAgfQorCWV4cCAgID0gcGFyc2VfZXhwXzEgKCZwLCBibG9ja19mb3JfcGMgKHQtPmFkZHJlc3MpLCAxKTsKKwlvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZnJlZV9jdXJyZW50X2NvbnRlbnRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhwKTsKKworCWlmIChleHAtPmVsdHNbMF0ub3Bjb2RlID09IE9QX1ZBUl9WQUxVRSkKKwkgIGlmIChTWU1CT0xfQ0xBU1MgKGV4cC0+ZWx0c1syXS5zeW1ib2wpID09IExPQ19DT05TVCkKKwkgICAgeworCSAgICAgIHdhcm5pbmcgKCIlcyBpcyBjb25zdGFudCAodmFsdWUgJWQpOiB3aWxsIG5vdCBiZSBjb2xsZWN0ZWQuIiwKKwkJICAgICAgIFNZTUJPTF9OQU1FIChleHAtPmVsdHNbMl0uc3ltYm9sKSwKKwkJICAgICAgIFNZTUJPTF9WQUxVRSAoZXhwLT5lbHRzWzJdLnN5bWJvbCkpOworCSAgICAgIHJldHVybiBCQURMSU5FOworCSAgICB9CisJICBlbHNlIGlmIChTWU1CT0xfQ0xBU1MgKGV4cC0+ZWx0c1syXS5zeW1ib2wpID09IExPQ19PUFRJTUlaRURfT1VUKQorCSAgICB7CisJICAgICAgd2FybmluZyAoIiVzIGlzIG9wdGltaXplZCBhd2F5IGFuZCBjYW5ub3QgYmUgY29sbGVjdGVkLiIsCisJCSAgICAgICBTWU1CT0xfTkFNRSAoZXhwLT5lbHRzWzJdLnN5bWJvbCkpOworCSAgICAgIHJldHVybiBCQURMSU5FOworCSAgICB9CisKKwkvKiB3ZSBoYXZlIHNvbWV0aGluZyB0byBjb2xsZWN0LCBtYWtlIHN1cmUgdGhhdCB0aGUgZXhwciB0bworCSAgIGJ5dGVjb2RlIHRyYW5zbGF0b3IgY2FuIGhhbmRsZSBpdCBhbmQgdGhhdCBpdCdzIG5vdCB0b28gbG9uZyAqLworCWFleHByID0gZ2VuX3RyYWNlX2Zvcl9leHByICh0LT5hZGRyZXNzLCBleHApOworCSh2b2lkKSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZnJlZV9hZ2VudF9leHByLCBhZXhwcik7CisKKwlpZiAoYWV4cHItPmxlbiA+IE1BWF9BR0VOVF9FWFBSX0xFTikKKwkgIGVycm9yICgiZXhwcmVzc2lvbiB0b28gY29tcGxpY2F0ZWQsIHRyeSBzaW1wbGlmeWluZyIpOworCisJYXhfcmVxcyhhZXhwciwgJmFyZXFzKTsKKwkodm9pZCkgbWFrZV9jbGVhbnVwIChmcmVlLCBhcmVxcy5yZWdfbWFzayk7CisKKwlpZiAoYXJlcXMuZmxhdyAhPSBhZ2VudF9mbGF3X25vbmUpCisJICBlcnJvciAoIm1hbGZvcm1lZCBleHByZXNzaW9uIik7CisKKwlpZiAoYXJlcXMubWluX2hlaWdodCA8IDApCisJICBlcnJvciAoImdkYjogSW50ZXJuYWwgZXJyb3I6IGV4cHJlc3Npb24gaGFzIG1pbiBoZWlnaHQgPCAwIik7CisKKwlpZiAoYXJlcXMubWF4X2hlaWdodCA+IDIwKQorCSAgZXJyb3IgKCJleHByZXNzaW9uIHRvbyBjb21wbGljYXRlZCwgdHJ5IHNpbXBsaWZ5aW5nIik7CisKKwlkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKKyAgICAgIH0gd2hpbGUgKHAgJiYgKnArKyA9PSAnLCcpOworICAgICAgcmV0dXJuIEdFTkVSSUM7CisgICAgfQorICBlbHNlIGlmIChjLT5mdW5jdGlvbi5jZnVuYyA9PSB3aGlsZV9zdGVwcGluZ19wc2V1ZG9jb21tYW5kKQorICAgIHsKKyAgICAgIGNoYXIgKnN0ZXBhcmc7CS8qIGluIGNhc2Ugd2FybmluZyBpcyBuZWNlc3NhcnkgKi8KKworICAgICAgd2hpbGUgKGlzc3BhY2UgKCpwKSkKKwlwKys7CisgICAgICBzdGVwYXJnID0gcDsKKworICAgICAgaWYgKCpwID09ICdcMCcgfHwKKwkgICh0LT5zdGVwX2NvdW50ID0gc3RydG9sIChwLCAmcCwgMCkpID09IDApCisJeworCSAgd2FybmluZyAoImJhZCBzdGVwLWNvdW50OiBjb21tYW5kIGlnbm9yZWQuIiwgKmxpbmUpOworCSAgcmV0dXJuIEJBRExJTkU7CisJfQorICAgICAgcmV0dXJuIFNURVBQSU5HOworICAgIH0KKyAgZWxzZSBpZiAoYy0+ZnVuY3Rpb24uY2Z1bmMgPT0gZW5kX2FjdGlvbnNfcHNldWRvY29tbWFuZCkKKyAgICByZXR1cm4gRU5EOworICBlbHNlCisgICAgeworICAgICAgd2FybmluZyAoIiclcycgaXMgbm90IGEgc3VwcG9ydGVkIHRyYWNlcG9pbnQgYWN0aW9uLiIsICpsaW5lKTsKKyAgICAgIHJldHVybiBCQURMSU5FOworICAgIH0KK30KKworLyogd29ya2VyIGZ1bmN0aW9uICovCit2b2lkIAorZnJlZV9hY3Rpb25zICh0KQorICAgICBzdHJ1Y3QgdHJhY2Vwb2ludCAqdDsKK3sKKyAgc3RydWN0IGFjdGlvbl9saW5lICpsaW5lLCAqbmV4dDsKKworICBmb3IgKGxpbmUgPSB0LT5hY3Rpb25zOyBsaW5lOyBsaW5lID0gbmV4dCkKKyAgICB7CisgICAgICBuZXh0ID0gbGluZS0+bmV4dDsKKyAgICAgIGlmIChsaW5lLT5hY3Rpb24pIAorCWZyZWUgKGxpbmUtPmFjdGlvbik7CisgICAgICBmcmVlIChsaW5lKTsKKyAgICB9CisgIHQtPmFjdGlvbnMgPSBOVUxMOworfQorCitzdHJ1Y3QgbWVtcmFuZ2UgeworICBpbnQgdHlwZTsJCS8qIDAgZm9yIGFic29sdXRlIG1lbW9yeSByYW5nZSwgZWxzZSBiYXNlcmVnIG51bWJlciAqLworICBiZmRfc2lnbmVkX3ZtYSBzdGFydDsKKyAgYmZkX3NpZ25lZF92bWEgZW5kOworfTsKKworc3RydWN0IGNvbGxlY3Rpb25fbGlzdCB7CisgIHVuc2lnbmVkIGNoYXIgcmVnc19tYXNrWzhdOwkvKiByb29tIGZvciB1cCB0byAyNTYgcmVncyAqLworICBsb25nIGxpc3RzaXplOworICBsb25nIG5leHRfbWVtcmFuZ2U7CisgIHN0cnVjdCBtZW1yYW5nZSAqbGlzdDsKKyAgbG9uZyBhZXhwcl9saXN0c2l6ZTsJCS8qIHNpemUgb2YgYXJyYXkgcG9pbnRlZCB0byBieSBleHByX2xpc3QgZWx0ICovCisgIGxvbmcgbmV4dF9hZXhwcl9lbHQ7CisgIHN0cnVjdCBhZ2VudF9leHByICoqYWV4cHJfbGlzdDsKKyAgCit9IHRyYWNlcG9pbnRfbGlzdCwgc3RlcHBpbmdfbGlzdDsKKworLyogTUVNUkFOR0UgZnVuY3Rpb25zOiAqLworCitzdGF0aWMgaW50IG1lbXJhbmdlX2NtcCBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOworCisvKiBjb21wYXJlIG1lbXJhbmdlcyBmb3IgcXNvcnQgKi8KK3N0YXRpYyBpbnQKK21lbXJhbmdlX2NtcCAodmEsIHZiKQorICAgICBjb25zdCB2b2lkICp2YTsKKyAgICAgY29uc3Qgdm9pZCAqdmI7Cit7CisgIGNvbnN0IHN0cnVjdCBtZW1yYW5nZSAqYSA9IHZhLCAqYiA9IHZiOworCisgIGlmIChhLT50eXBlIDwgYi0+dHlwZSkKKyAgICByZXR1cm4gLTE7CisgIGlmIChhLT50eXBlID4gYi0+dHlwZSkKKyAgICByZXR1cm4gIDE7CisgIGlmIChhLT50eXBlID09IDApCisgICAgeworICAgICAgaWYgKChiZmRfdm1hKSBhLT5zdGFydCAgPCAoYmZkX3ZtYSkgYi0+c3RhcnQpICByZXR1cm4gLTE7CisgICAgICBpZiAoKGJmZF92bWEpIGEtPnN0YXJ0ICA+IChiZmRfdm1hKSBiLT5zdGFydCkgIHJldHVybiAgMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoYS0+c3RhcnQgIDwgYi0+c3RhcnQpCisJcmV0dXJuIC0xOworICAgICAgaWYgKGEtPnN0YXJ0ICA+IGItPnN0YXJ0KQorCXJldHVybiAgMTsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBTb3J0IHRoZSBtZW1yYW5nZSBsaXN0IHVzaW5nIHFzb3J0LCBhbmQgbWVyZ2UgYWRqYWNlbnQgbWVtcmFuZ2VzICovCitzdGF0aWMgdm9pZAorbWVtcmFuZ2Vfc29ydG1lcmdlIChtZW1yYW5nZXMpCisgICAgIHN0cnVjdCBjb2xsZWN0aW9uX2xpc3QgKm1lbXJhbmdlczsKK3sKKyAgaW50IGEsIGI7CisKKyAgcXNvcnQgKG1lbXJhbmdlcy0+bGlzdCwgbWVtcmFuZ2VzLT5uZXh0X21lbXJhbmdlLCAKKwkgc2l6ZW9mIChzdHJ1Y3QgbWVtcmFuZ2UpLCBtZW1yYW5nZV9jbXApOworICBpZiAobWVtcmFuZ2VzLT5uZXh0X21lbXJhbmdlID4gMCkKKyAgICB7CisgICAgICBmb3IgKGEgPSAwLCBiID0gMTsgYiA8IG1lbXJhbmdlcy0+bmV4dF9tZW1yYW5nZTsgYisrKQorCXsKKwkgIGlmIChtZW1yYW5nZXMtPmxpc3RbYV0udHlwZSA9PSBtZW1yYW5nZXMtPmxpc3RbYl0udHlwZSAmJgorCSAgICAgIG1lbXJhbmdlcy0+bGlzdFtiXS5zdGFydCAtIG1lbXJhbmdlcy0+bGlzdFthXS5lbmQgPD0gCisJICAgICAgTUFYX1JFR0lTVEVSX1ZJUlRVQUxfU0laRSkKKwkgICAgeworCSAgICAgIC8qIG1lbXJhbmdlIGIgc3RhcnRzIGJlZm9yZSBtZW1yYW5nZSBhIGVuZHM7IG1lcmdlIHRoZW0uICAqLworCSAgICAgIGlmIChtZW1yYW5nZXMtPmxpc3RbYl0uZW5kID4gbWVtcmFuZ2VzLT5saXN0W2FdLmVuZCkKKwkJbWVtcmFuZ2VzLT5saXN0W2FdLmVuZCA9IG1lbXJhbmdlcy0+bGlzdFtiXS5lbmQ7CisJICAgICAgY29udGludWU7CQkvKiBuZXh0IGIsIHNhbWUgYSAqLworCSAgICB9CisJICBhKys7CQkJLyogbmV4dCBhICovCisJICBpZiAoYSAhPSBiKQorCSAgICBtZW1jcHkgKCZtZW1yYW5nZXMtPmxpc3RbYV0sICZtZW1yYW5nZXMtPmxpc3RbYl0sIAorCQkgICAgc2l6ZW9mIChzdHJ1Y3QgbWVtcmFuZ2UpKTsKKwl9CisgICAgICBtZW1yYW5nZXMtPm5leHRfbWVtcmFuZ2UgPSBhICsgMTsKKyAgICB9Cit9CisKKy8qIEFkZCBhIHJlZ2lzdGVyIHRvIGEgY29sbGVjdGlvbiBsaXN0ICovCit2b2lkCithZGRfcmVnaXN0ZXIgKGNvbGxlY3Rpb24sIHJlZ25vKQorICAgICBzdHJ1Y3QgY29sbGVjdGlvbl9saXN0ICpjb2xsZWN0aW9uOworICAgICB1bnNpZ25lZCBsb25nIHJlZ25vOworeworICBpZiAoaW5mb192ZXJib3NlKQorICAgIHByaW50Zl9maWx0ZXJlZCAoImNvbGxlY3QgcmVnaXN0ZXIgJWRcbiIsIHJlZ25vKTsKKyAgaWYgKHJlZ25vID4gKDggKiBzaXplb2YgKGNvbGxlY3Rpb24tPnJlZ3NfbWFzaykpKQorICAgIGVycm9yICgiSW50ZXJuYWw6IHJlZ2lzdGVyIG51bWJlciAlZCB0b28gbGFyZ2UgZm9yIHRyYWNlcG9pbnQiLAorCSAgIHJlZ25vKTsKKyAgY29sbGVjdGlvbi0+cmVnc19tYXNrIFtyZWdubyAvIDhdIHw9IDEgPDwgKHJlZ25vICAlIDgpOworfQorCisvKiBBZGQgYSBtZW1yYW5nZSB0byBhIGNvbGxlY3Rpb24gbGlzdCAqLworc3RhdGljIHZvaWQKK2FkZF9tZW1yYW5nZSAobWVtcmFuZ2VzLCB0eXBlLCBiYXNlLCBsZW4pCisgICAgIHN0cnVjdCBjb2xsZWN0aW9uX2xpc3QgKm1lbXJhbmdlczsKKyAgICAgaW50IHR5cGU7CisgICAgIGJmZF9zaWduZWRfdm1hIGJhc2U7CisgICAgIHVuc2lnbmVkIGxvbmcgbGVuOworeworICBpZiAoaW5mb192ZXJib3NlKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIiglZCwweCV4LCVkKVxuIiwgdHlwZSwgYmFzZSwgbGVuKTsKKyAgLyogdHlwZTogMCA9PSBtZW1vcnksIG4gPT0gYmFzZXJlZyAqLworICBtZW1yYW5nZXMtPmxpc3RbbWVtcmFuZ2VzLT5uZXh0X21lbXJhbmdlXS50eXBlICA9IHR5cGU7CisgIC8qIGJhc2U6IGFkZHIgaWYgbWVtb3J5LCBvZmZzZXQgaWYgcmVnIHJlbGF0aXZlLiAqLworICBtZW1yYW5nZXMtPmxpc3RbbWVtcmFuZ2VzLT5uZXh0X21lbXJhbmdlXS5zdGFydCA9IGJhc2U7CisgIC8qIGxlbjogd2UgYWN0dWFsbHkgc2F2ZSBlbmQgKGJhc2UgKyBsZW4pIGZvciBjb252ZW5pZW5jZSAqLworICBtZW1yYW5nZXMtPmxpc3RbbWVtcmFuZ2VzLT5uZXh0X21lbXJhbmdlXS5lbmQgICA9IGJhc2UgKyBsZW47CisgIG1lbXJhbmdlcy0+bmV4dF9tZW1yYW5nZSsrOworICBpZiAobWVtcmFuZ2VzLT5uZXh0X21lbXJhbmdlID49IG1lbXJhbmdlcy0+bGlzdHNpemUpCisgICAgeworICAgICAgbWVtcmFuZ2VzLT5saXN0c2l6ZSAqPSAyOworICAgICAgbWVtcmFuZ2VzLT5saXN0ID0geHJlYWxsb2MgKG1lbXJhbmdlcy0+bGlzdCwgCisJCQkJICBtZW1yYW5nZXMtPmxpc3RzaXplKTsKKyAgICB9CisKKyAgaWYgKHR5cGUgIT0gLTEpCS8qIGJldHRlciBjb2xsZWN0IHRoZSBiYXNlIHJlZ2lzdGVyISAqLworICAgIGFkZF9yZWdpc3RlciAobWVtcmFuZ2VzLCB0eXBlKTsKK30KKworLyogQWRkIGEgc3ltYm9sIHRvIGEgY29sbGVjdGlvbiBsaXN0ICovCitzdGF0aWMgdm9pZAorY29sbGVjdF9zeW1ib2wgKGNvbGxlY3QsIHN5bSwgZnJhbWVfcmVnbm8sIGZyYW1lX29mZnNldCkKKyAgICAgc3RydWN0IGNvbGxlY3Rpb25fbGlzdCAqY29sbGVjdDsKKyAgICAgc3RydWN0IHN5bWJvbCAqc3ltOworICAgICBsb25nIGZyYW1lX3JlZ25vOworICAgICBsb25nIGZyYW1lX29mZnNldDsKK3sKKyAgdW5zaWduZWQgbG9uZyAgbGVuOworICB1bnNpZ25lZCBsb25nICByZWc7CisgIGJmZF9zaWduZWRfdm1hIG9mZnNldDsKKworICBsZW4gID0gVFlQRV9MRU5HVEggKGNoZWNrX3R5cGVkZWYgKFNZTUJPTF9UWVBFIChzeW0pKSk7CisgIHN3aXRjaCAoU1lNQk9MX0NMQVNTIChzeW0pKSB7CisgIGRlZmF1bHQ6CisgICAgcHJpbnRmX2ZpbHRlcmVkICgiJXM6IGRvbid0IGtub3cgc3ltYm9sIGNsYXNzICVkXG4iLAorCQkgICAgIFNZTUJPTF9OQU1FIChzeW0pLCBTWU1CT0xfQ0xBU1MgKHN5bSkpOworICAgIGJyZWFrOworICBjYXNlIExPQ19DT05TVDoKKyAgICBwcmludGZfZmlsdGVyZWQgKCIlcyBpcyBjb25zdGFudCwgdmFsdWUgaXMgJWQ6IHdpbGwgbm90IGJlIGNvbGxlY3RlZC5cbiIsCisJCSAgICAgU1lNQk9MX05BTUUgKHN5bSksIFNZTUJPTF9WQUxVRSAoc3ltKSk7CisgICAgYnJlYWs7CisgIGNhc2UgTE9DX1NUQVRJQzoKKyAgICBvZmZzZXQgPSBTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltKTsgCisgICAgaWYgKGluZm9fdmVyYm9zZSkKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkxPQ19TVEFUSUMgJXM6IGNvbGxlY3QgJWQgYnl0ZXMgYXQgMHglMDh4XG4iLAorCQkgICAgICAgU1lNQk9MX05BTUUgKHN5bSksIGxlbiwgb2Zmc2V0KTsKKyAgICBhZGRfbWVtcmFuZ2UgKGNvbGxlY3QsIC0xLCBvZmZzZXQsIGxlbik7CS8qIDAgPT0gbWVtb3J5ICovCisgICAgYnJlYWs7CisgIGNhc2UgTE9DX1JFR0lTVEVSOgorICBjYXNlIExPQ19SRUdQQVJNOgorICAgIHJlZyA9IFNZTUJPTF9WQUxVRSAoc3ltKTsgCisgICAgaWYgKGluZm9fdmVyYm9zZSkKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkxPQ19SRUdbcGFybV0gJXM6ICIsIFNZTUJPTF9OQU1FIChzeW0pKTsKKyAgICBhZGRfcmVnaXN0ZXIgKGNvbGxlY3QsIHJlZyk7CisgICAgLyogY2hlY2sgZm9yIGRvdWJsZXMgc3RvcmVkIGluIHR3byByZWdpc3RlcnMgKi8KKyAgICAvKiBGSVhNRTogaG93IGFib3V0IGxhcmdlciB0eXBlcyBzdG9yZWQgaW4gMyBvciBtb3JlIHJlZ3M/ICovCisgICAgaWYgKFRZUEVfQ09ERSAoU1lNQk9MX1RZUEUgKHN5bSkpID09IFRZUEVfQ09ERV9GTFQgJiYKKwlsZW4gPiBSRUdJU1RFUl9SQVdfU0laRSAocmVnKSkKKyAgICAgIGFkZF9yZWdpc3RlciAoY29sbGVjdCwgcmVnICsgMSk7CisgICAgYnJlYWs7CisgIGNhc2UgTE9DX1JFRl9BUkc6CisgICAgcHJpbnRmX2ZpbHRlcmVkICgiU29ycnksIGRvbid0IGtub3cgaG93IHRvIGRvIExPQ19SRUZfQVJHIHlldC5cbiIpOworICAgIHByaW50Zl9maWx0ZXJlZCAoIiAgICAgICAod2lsbCBub3QgY29sbGVjdCAlcylcbiIsIAorCQkgICAgIFNZTUJPTF9OQU1FIChzeW0pKTsKKyAgICBicmVhazsKKyAgY2FzZSBMT0NfQVJHOgorICAgIHJlZyAgICA9IGZyYW1lX3JlZ25vOworICAgIG9mZnNldCA9IGZyYW1lX29mZnNldCArIFNZTUJPTF9WQUxVRSAoc3ltKTsKKyAgICBpZiAoaW5mb192ZXJib3NlKQorICAgICAgeworCXByaW50Zl9maWx0ZXJlZCAoIkxPQ19MT0NBTCAlczogQ29sbGVjdCAlZCBieXRlcyBhdCBvZmZzZXQiLAorCQkJIFNZTUJPTF9OQU1FIChzeW0pLCBsZW4pOworCXByaW50Zl9maWx0ZXJlZCAoIiAlZCBmcm9tIGZyYW1lIHB0ciByZWcgJWRcbiIsIG9mZnNldCwgcmVnKTsKKyAgICAgIH0KKyAgICBhZGRfbWVtcmFuZ2UgKGNvbGxlY3QsIHJlZywgb2Zmc2V0LCBsZW4pOworICAgIGJyZWFrOworICBjYXNlIExPQ19SRUdQQVJNX0FERFI6CisgICAgcmVnID0gU1lNQk9MX1ZBTFVFIChzeW0pOworICAgIG9mZnNldCA9IDA7CisgICAgaWYgKGluZm9fdmVyYm9zZSkKKyAgICAgIHsKKwlwcmludGZfZmlsdGVyZWQgKCJMT0NfUkVHUEFSTV9BRERSICVzOiBDb2xsZWN0ICVkIGJ5dGVzIGF0IG9mZnNldCIsCisJCQkgU1lNQk9MX05BTUUgKHN5bSksIGxlbik7CisJcHJpbnRmX2ZpbHRlcmVkICgiICVkIGZyb20gcmVnICVkXG4iLCBvZmZzZXQsIHJlZyk7CisgICAgICB9CisgICAgYWRkX21lbXJhbmdlIChjb2xsZWN0LCByZWcsIG9mZnNldCwgbGVuKTsKKyAgICBicmVhazsKKyAgY2FzZSBMT0NfTE9DQUw6CisgIGNhc2UgTE9DX0xPQ0FMX0FSRzoKKyAgICByZWcgICAgPSBmcmFtZV9yZWdubzsKKyAgICBvZmZzZXQgPSBmcmFtZV9vZmZzZXQgKyBTWU1CT0xfVkFMVUUgKHN5bSk7CisgICAgaWYgKGluZm9fdmVyYm9zZSkKKyAgICAgIHsKKwlwcmludGZfZmlsdGVyZWQgKCJMT0NfTE9DQUwgJXM6IENvbGxlY3QgJWQgYnl0ZXMgYXQgb2Zmc2V0IiwKKwkJCSBTWU1CT0xfTkFNRSAoc3ltKSwgbGVuKTsKKwlwcmludGZfZmlsdGVyZWQgKCIgJWQgZnJvbSBmcmFtZSBwdHIgcmVnICVkXG4iLCBvZmZzZXQsIHJlZyk7CisgICAgICB9CisgICAgYWRkX21lbXJhbmdlIChjb2xsZWN0LCByZWcsIG9mZnNldCwgbGVuKTsKKyAgICBicmVhazsKKyAgY2FzZSBMT0NfQkFTRVJFRzoKKyAgY2FzZSBMT0NfQkFTRVJFR19BUkc6CisgICAgcmVnID0gU1lNQk9MX0JBU0VSRUcgKHN5bSk7CisgICAgb2Zmc2V0ICA9IFNZTUJPTF9WQUxVRSAoc3ltKTsKKyAgICBpZiAoaW5mb192ZXJib3NlKQorICAgICAgeworCXByaW50Zl9maWx0ZXJlZCAoIkxPQ19CQVNFUkVHICVzOiBjb2xsZWN0ICVkIGJ5dGVzIGF0IG9mZnNldCAlZCBmcm9tIGJhc2VyZWcgJWRcbiIsIAorCQkJIFNZTUJPTF9OQU1FIChzeW0pLCBsZW4sIG9mZnNldCwgcmVnKTsKKyAgICAgIH0KKyAgICBhZGRfbWVtcmFuZ2UgKGNvbGxlY3QsIHJlZywgb2Zmc2V0LCBsZW4pOworICAgIGJyZWFrOworICBjYXNlIExPQ19VTlJFU09MVkVEOgorICAgIHByaW50Zl9maWx0ZXJlZCAoIkRvbid0IGtub3cgTE9DX1VOUkVTT0xWRUQgJXNcbiIsIFNZTUJPTF9OQU1FIChzeW0pKTsKKyAgICBicmVhazsKKyAgY2FzZSBMT0NfT1BUSU1JWkVEX09VVDoKKyAgICBwcmludGZfZmlsdGVyZWQgKCIlcyBoYXMgYmVlbiBvcHRpbWl6ZWQgb3V0IG9mIGV4aXN0YW5jZS5cbiIsCisJCSAgICAgU1lNQk9MX05BTUUgKHN5bSkpOworICAgIGJyZWFrOworICB9Cit9CisKKy8qIEFkZCBhbGwgbG9jYWxzIChvciBhcmdzKSBzeW1ib2xzIHRvIGNvbGxlY3Rpb24gbGlzdCAqLworc3RhdGljIHZvaWQKK2FkZF9sb2NhbF9zeW1ib2xzIChjb2xsZWN0LCBwYywgZnJhbWVfcmVnbm8sIGZyYW1lX29mZnNldCwgdHlwZSkKKyAgICAgc3RydWN0IGNvbGxlY3Rpb25fbGlzdCAqY29sbGVjdDsKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBsb25nIGZyYW1lX3JlZ25vOworICAgICBsb25nIGZyYW1lX29mZnNldDsKKyAgICAgaW50IHR5cGU7Cit7CisgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgc3RydWN0IGJsb2NrICAqYmxvY2s7CisgIGludCBpLCBuc3ltcywgY291bnQgPSAwOworCisgIGJsb2NrID0gYmxvY2tfZm9yX3BjIChwYyk7CisgIHdoaWxlIChibG9jayAhPSAwKQorICAgIHsKKyAgICAgIFFVSVQ7CQkJCS8qIGFsbG93IHVzZXIgdG8gYmFpbCBvdXQgd2l0aCBeQyAqLworICAgICAgbnN5bXMgPSBCTE9DS19OU1lNUyAoYmxvY2spOworICAgICAgZm9yIChpID0gMDsgaSA8IG5zeW1zOyBpKyspCisJeworCSAgc3ltID0gQkxPQ0tfU1lNIChibG9jaywgaSk7CisJICBzd2l0Y2ggKFNZTUJPTF9DTEFTUyAoc3ltKSkgeworCSAgY2FzZSBMT0NfTE9DQUw6CisJICBjYXNlIExPQ19TVEFUSUM6CisJICBjYXNlIExPQ19SRUdJU1RFUjoKKwkgIGNhc2UgTE9DX0JBU0VSRUc6CisJICAgIGlmICh0eXBlID09ICdMJykJLyogY29sbGVjdGluZyBMb2NhbHMgKi8KKwkgICAgICB7CisJCWNvdW50Kys7CisJCWNvbGxlY3Rfc3ltYm9sIChjb2xsZWN0LCBzeW0sIGZyYW1lX3JlZ25vLCBmcmFtZV9vZmZzZXQpOworCSAgICAgIH0KKwkgICAgYnJlYWs7CisJICBjYXNlIExPQ19BUkc6CisJICBjYXNlIExPQ19MT0NBTF9BUkc6CisJICBjYXNlIExPQ19SRUZfQVJHOgorCSAgY2FzZSBMT0NfUkVHUEFSTToKKwkgIGNhc2UgTE9DX1JFR1BBUk1fQUREUjoKKwkgIGNhc2UgTE9DX0JBU0VSRUdfQVJHOgorCSAgICBpZiAodHlwZSA9PSAnQScpCS8qIGNvbGxlY3RpbmcgQXJndW1lbnRzICovCisJICAgICAgeworCQljb3VudCsrOworCQljb2xsZWN0X3N5bWJvbCAoY29sbGVjdCwgc3ltLCBmcmFtZV9yZWdubywgZnJhbWVfb2Zmc2V0KTsKKwkgICAgICB9CisJICB9CisJfQorICAgICAgaWYgKEJMT0NLX0ZVTkNUSU9OIChibG9jaykpCisJYnJlYWs7CisgICAgICBlbHNlCisJYmxvY2sgPSBCTE9DS19TVVBFUkJMT0NLIChibG9jayk7CisgICAgfQorICBpZiAoY291bnQgPT0gMCkKKyAgICB3YXJuaW5nICgiTm8gJXMgZm91bmQgaW4gc2NvcGUuIiwgdHlwZSA9PSAnTCcgPyAibG9jYWxzIiA6ICJhcmdzIik7Cit9CisKKy8qIHdvcmtlciBmdW5jdGlvbiAqLworc3RhdGljIHZvaWQKK2NsZWFyX2NvbGxlY3Rpb25fbGlzdCAobGlzdCkKKyAgICAgc3RydWN0IGNvbGxlY3Rpb25fbGlzdCAqbGlzdDsKK3sKKyAgaW50IG5keDsKKworICBsaXN0LT5uZXh0X21lbXJhbmdlID0gMDsKKyAgZm9yIChuZHggPSAwOyBuZHggPCBsaXN0LT5uZXh0X2FleHByX2VsdDsgbmR4KyspCisgICAgeworICAgICAgZnJlZV9hZ2VudF9leHByKGxpc3QtPmFleHByX2xpc3RbbmR4XSk7CisgICAgICBsaXN0LT5hZXhwcl9saXN0W25keF0gPSBOVUxMOworICAgIH0KKyAgbGlzdC0+bmV4dF9hZXhwcl9lbHQgPSAwOworICBtZW1zZXQgKGxpc3QtPnJlZ3NfbWFzaywgMCwgc2l6ZW9mIChsaXN0LT5yZWdzX21hc2spKTsKK30KKworLyogcmVkdWNlIGEgY29sbGVjdGlvbiBsaXN0IHRvIHN0cmluZyBmb3JtIChmb3IgZ2RiIHByb3RvY29sKSAqLworc3RhdGljIGNoYXIgKioKK3N0cmluZ2lmeV9jb2xsZWN0aW9uX2xpc3QgKGxpc3QsIHN0cmluZykKKyAgICAgc3RydWN0IGNvbGxlY3Rpb25fbGlzdCAqbGlzdDsKKyAgICAgY2hhciAqc3RyaW5nOworeworICBjaGFyIHRlbXBfYnVmWzIwNDhdOworICBpbnQgY291bnQ7CisgIGludCBuZHggPSAwOworICBjaGFyICooKnN0cl9saXN0KVtdOworICBjaGFyICplbmQ7CisgIGxvbmcgIGk7CisKKyAgY291bnQgPSAxICsgbGlzdC0+bmV4dF9tZW1yYW5nZSArIGxpc3QtPm5leHRfYWV4cHJfZWx0ICsgMTsKKyAgc3RyX2xpc3QgPSAoY2hhciAqKCopW10peG1hbGxvYyhjb3VudCAqIHNpemVvZiAoY2hhciAqKSk7CisKKyAgZm9yIChpID0gc2l6ZW9mIChsaXN0LT5yZWdzX21hc2spIC0gMTsgaSA+IDA7IGktLSkKKyAgICBpZiAobGlzdC0+cmVnc19tYXNrW2ldICE9IDApCS8qIHNraXAgbGVhZGluZyB6ZXJvZXMgaW4gcmVnc19tYXNrICovCisgICAgICBicmVhazsKKyAgaWYgKGxpc3QtPnJlZ3NfbWFza1tpXSAhPSAwKQkvKiBwcmVwYXJlIHRvIHNlbmQgcmVnc19tYXNrIHRvIHRoZSBzdHViICovCisgICAgeworICAgICAgaWYgKGluZm9fdmVyYm9zZSkKKwlwcmludGZfZmlsdGVyZWQgKCJcbkNvbGxlY3RpbmcgcmVnaXN0ZXJzIChtYXNrKTogMHgiKTsKKyAgICAgIGVuZCA9IHRlbXBfYnVmOworICAgICAgKmVuZCsrPSdSJzsKKyAgICAgIGZvciAoOyBpID49IDA7IGktLSkKKwl7CisJICBRVUlUOwkJCQkvKiBhbGxvdyB1c2VyIHRvIGJhaWwgb3V0IHdpdGggXkMgKi8KKwkgIGlmIChpbmZvX3ZlcmJvc2UpCisJICAgIHByaW50Zl9maWx0ZXJlZCAoIiUwMlgiLCBsaXN0LT5yZWdzX21hc2tbaV0pOworCSAgc3ByaW50ZiAoZW5kLCAgIiUwMlgiLCBsaXN0LT5yZWdzX21hc2tbaV0pOworCSAgZW5kICs9IDI7CisJfQorICAgICAgKCpzdHJfbGlzdClbbmR4XSA9IHNhdmVzdHJpbmcodGVtcF9idWYsIGVuZCAtIHRlbXBfYnVmKTsKKyAgICAgIG5keCsrOworICAgIH0KKyAgaWYgKGluZm9fdmVyYm9zZSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICBpZiAobGlzdC0+bmV4dF9tZW1yYW5nZSA+IDAgJiYgaW5mb192ZXJib3NlKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIkNvbGxlY3RpbmcgbWVtcmFuZ2VzOiBcbiIpOworICBmb3IgKGkgPSAwLCBjb3VudCA9IDAsIGVuZCA9IHRlbXBfYnVmOyBpIDwgbGlzdC0+bmV4dF9tZW1yYW5nZTsgaSsrKQorICAgIHsKKyAgICAgIFFVSVQ7CQkJLyogYWxsb3cgdXNlciB0byBiYWlsIG91dCB3aXRoIF5DICovCisgICAgICBpZiAoaW5mb192ZXJib3NlKQorCXByaW50Zl9maWx0ZXJlZCAoIiglZCwgMHgleCwgJWQpXG4iLCAKKwkJCSBsaXN0LT5saXN0W2ldLnR5cGUsIAorCQkJIGxpc3QtPmxpc3RbaV0uc3RhcnQsIAorCQkJIGxpc3QtPmxpc3RbaV0uZW5kIC0gbGlzdC0+bGlzdFtpXS5zdGFydCk7CisgICAgICBpZiAoY291bnQgKyAyNyA+IE1BWF9BR0VOVF9FWFBSX0xFTikKKwl7CisJICAoKnN0cl9saXN0KVtuZHhdID0gc2F2ZXN0cmluZyh0ZW1wX2J1ZiwgY291bnQpOworCSAgbmR4Kys7CisJICBjb3VudCA9IDA7CisJICBlbmQgPSB0ZW1wX2J1ZjsKKwl9CisgICAgICBzcHJpbnRmIChlbmQsICJNJVgsJVgsJVgiLCAKKwkgICAgICAgbGlzdC0+bGlzdFtpXS50eXBlLCAKKwkgICAgICAgbGlzdC0+bGlzdFtpXS5zdGFydCwgCisJICAgICAgIGxpc3QtPmxpc3RbaV0uZW5kIC0gbGlzdC0+bGlzdFtpXS5zdGFydCk7CisgICAgICBjb3VudCArPSBzdHJsZW4gKGVuZCk7CisgICAgICBlbmQgKz0gc3RybGVuIChlbmQpOworICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbGlzdC0+bmV4dF9hZXhwcl9lbHQ7IGkrKykKKyAgICB7CisgICAgICBRVUlUOwkJCS8qIGFsbG93IHVzZXIgdG8gYmFpbCBvdXQgd2l0aCBeQyAqLworICAgICAgaWYgKChjb3VudCArIDEwICsgMiAqIGxpc3QtPmFleHByX2xpc3RbaV0tPmxlbikgPiBNQVhfQUdFTlRfRVhQUl9MRU4pCisJeworCSAgKCpzdHJfbGlzdClbbmR4XSA9IHNhdmVzdHJpbmcodGVtcF9idWYsIGNvdW50KTsKKwkgIG5keCsrOworCSAgY291bnQgPSAwOworCSAgZW5kID0gdGVtcF9idWY7CisJfQorICAgICAgc3ByaW50ZiAoZW5kLCAiWCUwOFgsIiwgbGlzdC0+YWV4cHJfbGlzdFtpXS0+bGVuKTsKKyAgICAgIGVuZCArPSAxMDsJCS8qICdYJyArIDggaGV4IGRpZ2l0cyArICcsJyAqLworICAgICAgY291bnQgKz0gMTA7CisKKyAgICAgIGVuZCA9IG1lbTJoZXgobGlzdC0+YWV4cHJfbGlzdFtpXS0+YnVmLCBlbmQsIGxpc3QtPmFleHByX2xpc3RbaV0tPmxlbik7CisgICAgICBjb3VudCArPSAyICogbGlzdC0+YWV4cHJfbGlzdFtpXS0+bGVuOworICAgIH0KKworICBpZiAoY291bnQgIT0gMCkKKyAgICB7CisgICAgICAoKnN0cl9saXN0KVtuZHhdID0gc2F2ZXN0cmluZyh0ZW1wX2J1ZiwgY291bnQpOworICAgICAgbmR4Kys7CisgICAgICBjb3VudCA9IDA7CisgICAgICBlbmQgPSB0ZW1wX2J1ZjsKKyAgICB9CisgICgqc3RyX2xpc3QpW25keF0gPSBOVUxMOworCisgIGlmIChuZHggPT0gMCkKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZQorICAgIHJldHVybiAqc3RyX2xpc3Q7Cit9CisKK3ZvaWQKK2ZyZWVfYWN0aW9uc19saXN0KGFjdGlvbnNfbGlzdCkKKyAgICAgY2hhciAqKmFjdGlvbnNfbGlzdDsKK3sKKyAgaW50IG5keDsKKworICBpZiAoYWN0aW9uc19saXN0ID09IDApCisgICAgcmV0dXJuOworCisgIGZvciAobmR4ID0gMDsgYWN0aW9uc19saXN0W25keF07IG5keCsrKQorICAgIGZyZWUoYWN0aW9uc19saXN0W25keF0pOworCisgIGZyZWUoYWN0aW9uc19saXN0KTsKK30KKworLyogcmVuZGVyIGFsbCBhY3Rpb25zIGludG8gZ2RiIHByb3RvY29sICovCitzdGF0aWMgdm9pZAorZW5jb2RlX2FjdGlvbnMgKHQsIHRkcF9hY3Rpb25zLCBzdGVwcGluZ19hY3Rpb25zKQorICAgICBzdHJ1Y3QgdHJhY2Vwb2ludCAgKnQ7CisgICAgIGNoYXIgICAgICAgICAgICAgICoqKnRkcF9hY3Rpb25zOworICAgICBjaGFyICAgICAgICAgICAgICAqKipzdGVwcGluZ19hY3Rpb25zOworeworICBzdGF0aWMgY2hhciAgICAgICAgdGRwX2J1ZmZbMjA0OF0sIHN0ZXBfYnVmZlsyMDQ4XTsKKyAgY2hhciAgICAgICAgICAgICAgICphY3Rpb25fZXhwOworICBzdHJ1Y3QgZXhwcmVzc2lvbiAgKmV4cCA9IE5VTEw7CisgIHN0cnVjdCBhY3Rpb25fbGluZSAqYWN0aW9uOworICBiZmRfc2lnbmVkX3ZtYSAgICAgIG9mZnNldDsKKyAgbG9uZyAgICAgICAgICAgICAgICBpOworICB2YWx1ZV9wdHIgICAgICAgICAgIHRlbXB2YWw7CisgIHN0cnVjdCBjb2xsZWN0aW9uX2xpc3QgICpjb2xsZWN0OworICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqY21kOworICBzdHJ1Y3QgYWdlbnRfZXhwciAqYWV4cHI7CisgIGxvbmcgICAgICAgICAgICAgICAgZnJhbWVfcmVnLCBmcmFtZV9vZmZzZXQ7CisKKworICBjbGVhcl9jb2xsZWN0aW9uX2xpc3QgKCZ0cmFjZXBvaW50X2xpc3QpOworICBjbGVhcl9jb2xsZWN0aW9uX2xpc3QgKCZzdGVwcGluZ19saXN0KTsKKyAgY29sbGVjdCA9ICZ0cmFjZXBvaW50X2xpc3Q7CisKKyAgKnRkcF9hY3Rpb25zID0gTlVMTDsKKyAgKnN0ZXBwaW5nX2FjdGlvbnMgPSBOVUxMOworCisgIFRBUkdFVF9WSVJUVUFMX0ZSQU1FX1BPSU5URVIgKHQtPmFkZHJlc3MsICZmcmFtZV9yZWcsICZmcmFtZV9vZmZzZXQpOworCisgIGZvciAoYWN0aW9uID0gdC0+YWN0aW9uczsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpCisgICAgeworICAgICAgUVVJVDsJCQkvKiBhbGxvdyB1c2VyIHRvIGJhaWwgb3V0IHdpdGggXkMgKi8KKyAgICAgIGFjdGlvbl9leHAgPSBhY3Rpb24tPmFjdGlvbjsKKyAgICAgIHdoaWxlIChpc3NwYWNlICgqYWN0aW9uX2V4cCkpCisJYWN0aW9uX2V4cCsrOworCisgICAgICBpZiAoKmFjdGlvbl9leHAgPT0gJyMnKQkvKiBjb21tZW50IGxpbmUgKi8KKwlyZXR1cm47CisKKyAgICAgIGNtZCA9IGxvb2t1cF9jbWQgKCZhY3Rpb25fZXhwLCBjbWRsaXN0LCAiIiwgLTEsIDEpOworICAgICAgaWYgKGNtZCA9PSAwKQorCWVycm9yICgiQmFkIGFjdGlvbiBsaXN0IGl0ZW06ICVzIiwgYWN0aW9uX2V4cCk7CisKKyAgICAgIGlmIChjbWQtPmZ1bmN0aW9uLmNmdW5jID09IGNvbGxlY3RfcHNldWRvY29tbWFuZCkKKwl7CisJICBkbyB7CS8qIHJlcGVhdCBvdmVyIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QgKi8KKwkgICAgUVVJVDsJCS8qIGFsbG93IHVzZXIgdG8gYmFpbCBvdXQgd2l0aCBeQyAqLworCSAgICB3aGlsZSAoaXNzcGFjZSAoKmFjdGlvbl9leHApKQorCSAgICAgIGFjdGlvbl9leHArKzsKKworCSAgICBpZiAoMCA9PSBzdHJuY2FzZWNtcCAoIiRyZWciLCBhY3Rpb25fZXhwLCA0KSkKKwkgICAgICB7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fUkVHUzsgaSsrKQorCQkgIGFkZF9yZWdpc3RlciAoY29sbGVjdCwgaSk7CisJCWFjdGlvbl9leHAgPSBzdHJjaHIgKGFjdGlvbl9leHAsICcsJyk7IC8qIG1vcmU/ICovCisJICAgICAgfQorCSAgICBlbHNlIGlmICgwID09IHN0cm5jYXNlY21wICgiJGFyZyIsIGFjdGlvbl9leHAsIDQpKQorCSAgICAgIHsKKwkJYWRkX2xvY2FsX3N5bWJvbHMgKGNvbGxlY3QsIAorCQkJCSAgIHQtPmFkZHJlc3MsIAorCQkJCSAgIGZyYW1lX3JlZywKKwkJCQkgICBmcmFtZV9vZmZzZXQsCisJCQkJICAgJ0EnKTsKKwkJYWN0aW9uX2V4cCA9IHN0cmNociAoYWN0aW9uX2V4cCwgJywnKTsgLyogbW9yZT8gKi8KKwkgICAgICB9CisJICAgIGVsc2UgaWYgKDAgPT0gc3RybmNhc2VjbXAgKCIkbG9jIiwgYWN0aW9uX2V4cCwgNCkpCisJICAgICAgeworCQlhZGRfbG9jYWxfc3ltYm9scyAoY29sbGVjdCwgCisJCQkJICAgdC0+YWRkcmVzcywgCisJCQkJICAgZnJhbWVfcmVnLAorCQkJCSAgIGZyYW1lX29mZnNldCwKKwkJCQkgICAnTCcpOworCQlhY3Rpb25fZXhwID0gc3RyY2hyIChhY3Rpb25fZXhwLCAnLCcpOyAvKiBtb3JlPyAqLworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJdW5zaWduZWQgbG9uZyBhZGRyLCBsZW47CisJCXN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW4gPSBOVUxMOworCQlzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluMSA9IE5VTEw7CisJCXN0cnVjdCBhZ2VudF9yZXFzIGFyZXFzOworCisJCWV4cCA9IHBhcnNlX2V4cF8xICgmYWN0aW9uX2V4cCwgYmxvY2tfZm9yX3BjICh0LT5hZGRyZXNzKSwgMSk7CisJCW9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfY3VycmVudF9jb250ZW50cywgJmV4cCk7CisKKwkJc3dpdGNoIChleHAtPmVsdHNbMF0ub3Bjb2RlKSB7CisJCWNhc2UgT1BfUkVHSVNURVI6CisJCSAgaSA9IGV4cC0+ZWx0c1sxXS5sb25nY29uc3Q7CisJCSAgaWYgKGluZm9fdmVyYm9zZSkKKwkJICAgIHByaW50Zl9maWx0ZXJlZCAoIk9QX1JFR0lTVEVSOiAiKTsKKwkJICBhZGRfcmVnaXN0ZXIgKGNvbGxlY3QsIGkpOworCQkgIGJyZWFrOworCisJCWNhc2UgVU5PUF9NRU1WQUw6CisJCSAgLyogc2FmZSBiZWNhdXNlIHdlIGtub3cgaXQncyBhIHNpbXBsZSBleHByZXNzaW9uICovCisJCSAgdGVtcHZhbCA9IGV2YWx1YXRlX2V4cHJlc3Npb24gKGV4cCk7CisJCSAgYWRkciA9IFZBTFVFX0FERFJFU1MgKHRlbXB2YWwpICsgVkFMVUVfT0ZGU0VUICh0ZW1wdmFsKTsKKwkJICBsZW4gPSBUWVBFX0xFTkdUSCAoY2hlY2tfdHlwZWRlZiAoZXhwLT5lbHRzWzFdLnR5cGUpKTsKKwkJICBhZGRfbWVtcmFuZ2UgKGNvbGxlY3QsIC0xLCBhZGRyLCBsZW4pOworCQkgIGJyZWFrOworCisJCWNhc2UgT1BfVkFSX1ZBTFVFOgorCQkgIGNvbGxlY3Rfc3ltYm9sIChjb2xsZWN0LCAKKwkJCQkgIGV4cC0+ZWx0c1syXS5zeW1ib2wsCisJCQkJICBmcmFtZV9yZWcsCisJCQkJICBmcmFtZV9vZmZzZXQpOworCQkgIGJyZWFrOworCisJCWRlZmF1bHQ6CS8qIGZ1bGwtZmxlZGdlZCBleHByZXNzaW9uICovCisJCSAgYWV4cHIgPSBnZW5fdHJhY2VfZm9yX2V4cHIgKHQtPmFkZHJlc3MsIGV4cCk7CisKKwkJICBvbGRfY2hhaW4xID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9hZ2VudF9leHByLCBhZXhwcik7CisKKwkJICBheF9yZXFzIChhZXhwciwgJmFyZXFzKTsKKwkJICBpZiAoYXJlcXMuZmxhdyAhPSBhZ2VudF9mbGF3X25vbmUpCisJCSAgICBlcnJvciAoIm1hbGZvcm1lZCBleHByZXNzaW9uIik7CisKKwkJICBpZiAoYXJlcXMubWluX2hlaWdodCA8IDApCisJCSAgICBlcnJvciAoImdkYjogSW50ZXJuYWwgZXJyb3I6IGV4cHJlc3Npb24gaGFzIG1pbiBoZWlnaHQgPCAwIik7CisJCSAgaWYgKGFyZXFzLm1heF9oZWlnaHQgPiAyMCkKKwkJICAgIGVycm9yICgiZXhwcmVzc2lvbiB0b28gY29tcGxpY2F0ZWQsIHRyeSBzaW1wbGlmeWluZyIpOworCisJCSAgZGlzY2FyZF9jbGVhbnVwcyAob2xkX2NoYWluMSk7CisJCSAgYWRkX2FleHByIChjb2xsZWN0LCBhZXhwcik7CisKKwkJICAvKiB0YWtlIGNhcmUgb2YgdGhlIHJlZ2lzdGVycyAqLworCQkgIGlmIChhcmVxcy5yZWdfbWFza19sZW4gPiAwKQorCQkgICAgeworCQkgICAgICBpbnQgbmR4MTsKKwkJICAgICAgaW50IG5keDI7CisKKwkJICAgICAgZm9yIChuZHgxID0gMDsgbmR4MSA8IGFyZXFzLnJlZ19tYXNrX2xlbjsgbmR4MSsrKQorCQkJeworCQkJICBRVUlUOwkJLyogYWxsb3cgdXNlciB0byBiYWlsIG91dCB3aXRoIF5DICovCisJCQkgIGlmIChhcmVxcy5yZWdfbWFza1tuZHgxXSAhPSAwKQorCQkJICAgIHsKKwkJCSAgICAgIC8qIGFzc3VtZSBjaGFycyBoYXZlIDggYml0cyAqLworCQkJICAgICAgZm9yIChuZHgyID0gMDsgbmR4MiA8IDg7IG5keDIrKykKKwkJCQlpZiAoYXJlcXMucmVnX21hc2tbbmR4MV0gJiAoMSA8PCBuZHgyKSkKKwkJCQkgIC8qIGl0J3MgdXNlZCAtLSByZWNvcmQgaXQgKi8KKwkJCQkgIGFkZF9yZWdpc3RlciAoY29sbGVjdCwgbmR4MSAqIDggKyBuZHgyKTsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9CisJCSAgYnJlYWs7CisJCX0JLyogc3dpdGNoICovCisJCWRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworCSAgICAgIH0JCS8qIGRvICovCisJICB9IHdoaWxlIChhY3Rpb25fZXhwICYmICphY3Rpb25fZXhwKysgPT0gJywnKTsKKwl9CQkvKiBpZiAqLworICAgICAgZWxzZSBpZiAoY21kLT5mdW5jdGlvbi5jZnVuYyA9PSB3aGlsZV9zdGVwcGluZ19wc2V1ZG9jb21tYW5kKQorCXsKKwkgIGNvbGxlY3QgPSAmc3RlcHBpbmdfbGlzdDsKKwl9CisgICAgICBlbHNlIGlmIChjbWQtPmZ1bmN0aW9uLmNmdW5jID09IGVuZF9hY3Rpb25zX3BzZXVkb2NvbW1hbmQpCisJeworCSAgaWYgKGNvbGxlY3QgPT0gJnN0ZXBwaW5nX2xpc3QpCS8qIGVuZCBzdGVwcGluZyBhY3Rpb25zICovCisJICAgIGNvbGxlY3QgPSAmdHJhY2Vwb2ludF9saXN0OworCSAgZWxzZQorCSAgICBicmVhazsJCQkvKiBlbmQgdHJhY2Vwb2ludCBhY3Rpb25zICovCisJfQorICAgIH0JCQkvKiBmb3IgKi8KKyAgbWVtcmFuZ2Vfc29ydG1lcmdlICgmdHJhY2Vwb2ludF9saXN0KTsgCisgIG1lbXJhbmdlX3NvcnRtZXJnZSAoJnN0ZXBwaW5nX2xpc3QpOyAKKworICAqdGRwX2FjdGlvbnMgICAgICA9IHN0cmluZ2lmeV9jb2xsZWN0aW9uX2xpc3QgKCZ0cmFjZXBvaW50X2xpc3QsICZ0ZHBfYnVmZik7CisgICpzdGVwcGluZ19hY3Rpb25zID0gc3RyaW5naWZ5X2NvbGxlY3Rpb25fbGlzdCAoJnN0ZXBwaW5nX2xpc3QsICAgJnN0ZXBfYnVmZik7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfYWV4cHIoY29sbGVjdCwgYWV4cHIpCisgICAgIHN0cnVjdCBjb2xsZWN0aW9uX2xpc3QgKmNvbGxlY3Q7CisgICAgIHN0cnVjdCBhZ2VudF9leHByICphZXhwcjsKK3sKKyAgaWYgKGNvbGxlY3QtPm5leHRfYWV4cHJfZWx0ID49IGNvbGxlY3QtPmFleHByX2xpc3RzaXplKQorICAgIHsKKyAgICAgIGNvbGxlY3QtPmFleHByX2xpc3QgPQorCXhyZWFsbG9jIChjb2xsZWN0LT5hZXhwcl9saXN0LAorCQkgIDIgKiBjb2xsZWN0LT5hZXhwcl9saXN0c2l6ZSAqIHNpemVvZiAoc3RydWN0IGFnZW50X2V4cHIgKikpOworICAgICAgY29sbGVjdC0+YWV4cHJfbGlzdHNpemUgKj0gMjsKKyAgICB9CisgIGNvbGxlY3QtPmFleHByX2xpc3RbY29sbGVjdC0+bmV4dF9hZXhwcl9lbHRdID0gYWV4cHI7CisgIGNvbGxlY3QtPm5leHRfYWV4cHJfZWx0Kys7Cit9CisKK3N0YXRpYyBjaGFyIHRhcmdldF9idWZbMjA0OF07CisKKy8qIFNldCAidHJhbnNwYXJlbnQiIG1lbW9yeSByYW5nZXMKKworICAgQWxsb3cgdHJhY2UgbWVjaGFuaXNtIHRvIHRyZWF0IHRleHQtbGlrZSBzZWN0aW9ucworICAgKGFuZCBwZXJoYXBzIGFsbCByZWFkLW9ubHkgc2VjdGlvbnMpIHRyYW5zcGFyZW50bHksIAorICAgaS5lLiBkb24ndCByZWplY3QgbWVtb3J5IHJlcXVlc3RzIGZyb20gdGhlc2UgYWRkcmVzcyByYW5nZXMKKyAgIGp1c3QgYmVjYXVzZSB0aGV5IGhhdmVuJ3QgYmVlbiBjb2xsZWN0ZWQuICAqLworCitzdGF0aWMgdm9pZAorcmVtb3RlX3NldF90cmFuc3BhcmVudF9yYW5nZXMgKHZvaWQpCit7CisgIGV4dGVybiBiZmQgKmV4ZWNfYmZkOworICBhc2VjdGlvbiAqczsKKyAgYmZkX3NpemVfdHlwZSBzaXplOworICBiZmRfdm1hIGxtYTsKKyAgaW50IGFueXNlY3MgPSAwOworCisgIGlmICghZXhlY19iZmQpCisgICAgcmV0dXJuOwkJLyogbm8gaW5mb3JtYXRpb24gdG8gZ2l2ZS4gKi8KKworICBzdHJjcHkgKHRhcmdldF9idWYsICJRVHJvIik7CisgIGZvciAocyA9IGV4ZWNfYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCisgICAgeworICAgICAgY2hhciB0bXBbNDBdOworCisgICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpICAgICA9PSAwIHx8CisgICAgICAgLyogKHMtPmZsYWdzICYgU0VDX0NPREUpICAgICA9PSAwIHx8ICovCisJICAocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDApCisJY29udGludWU7CisKKyAgICAgIGFueXNlY3MgPSAxOworICAgICAgbG1hICA9IHMtPmxtYTsKKyAgICAgIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHMpOworICAgICAgc3ByaW50ZiAodG1wLCAiOiV4LCV4IiwgbG1hLCBsbWEgKyBzaXplKTsKKyAgICAgIHN0cmNhdCAodGFyZ2V0X2J1ZiwgdG1wKTsKKyAgICB9CisgIGlmIChhbnlzZWNzKQorICAgIHsKKyAgICAgIHB1dHBrdCAodGFyZ2V0X2J1Zik7CisgICAgICBnZXRwa3QgKHRhcmdldF9idWYsIDApOworICAgIH0KK30KKworLyogdHN0YXJ0IGNvbW1hbmQ6CisgCisgICBUZWxsIHRhcmdldCB0byBjbGVhciBhbnkgcHJldmlvdXMgdHJhY2UgZXhwZXJpbWVudC4KKyAgIFdhbGsgdGhlIGxpc3Qgb2YgdHJhY2Vwb2ludHMsIGFuZCBzZW5kIHRoZW0gKGFuZCB0aGVpciBhY3Rpb25zKQorICAgdG8gdGhlIHRhcmdldC4gIElmIG5vIGVycm9ycywgCisgICBUZWxsIHRhcmdldCB0byBzdGFydCBhIG5ldyB0cmFjZSBleHBlcmltZW50LiAgKi8KKworc3RhdGljIHZvaWQKK3RyYWNlX3N0YXJ0X2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7IC8qIFNUVUJfQ09NTSBNT1NUTFlfSU1QTEVNRU5URUQgKi8KKyAgc3RydWN0IHRyYWNlcG9pbnQgKnQ7CisgIGNoYXIgYnVmWzIwNDhdOworICBjaGFyICoqdGRwX2FjdGlvbnM7CisgIGNoYXIgKipzdGVwcGluZ19hY3Rpb25zOworICBpbnQgbmR4OworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluID0gTlVMTDsKKworICBkb250X3JlcGVhdCAoKTsJLyogbGlrZSAicnVuIiwgZGFuZ2Vyb3VzIHRvIHJlcGVhdCBhY2NpZGVudGFsbHkgKi8KKyAgCisgIGlmICh0YXJnZXRfaXNfcmVtb3RlICgpKQorICAgIHsKKyAgICAgIHB1dHBrdCAoIlFUaW5pdCIpOworICAgICAgcmVtb3RlX2dldF9ub2lzeV9yZXBseSAodGFyZ2V0X2J1Zik7CisgICAgICBpZiAoc3RyY21wICh0YXJnZXRfYnVmLCAiT0siKSkKKwllcnJvciAoIlRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgY29tbWFuZC4iKTsKKworICAgICAgQUxMX1RSQUNFUE9JTlRTICh0KQorCXsKKwkgIGludCBzc19jb3VudDsJCS8qIGlmIGFjdGlvbnMgaW5jbHVkZSBzaW5nbGVzdGVwcGluZyAqLworCSAgaW50IGRpc2FibGVfbWFzazsJLyogPz8/ICovCisJICBpbnQgZW5hYmxlX21hc2s7CS8qID8/PyAqLworCisJICBzcHJpbnRmIChidWYsICJRVERQOiV4OiV4OiVjOiV4OiV4IiwgdC0+bnVtYmVyLCB0LT5hZGRyZXNzLCAKKwkJICAgdC0+ZW5hYmxlZCA9PSBlbmFibGVkID8gJ0UnIDogJ0QnLCAKKwkJICAgdC0+c3RlcF9jb3VudCwgdC0+cGFzc19jb3VudCk7CisKKwkgIGlmICh0LT5hY3Rpb25zKQorCSAgICBzdHJjYXQgKGJ1ZiwgIi0iKTsKKwkgIHB1dHBrdCAoYnVmKTsKKwkgIHJlbW90ZV9nZXRfbm9pc3lfcmVwbHkgKHRhcmdldF9idWYpOworCSAgaWYgKHN0cmNtcCAodGFyZ2V0X2J1ZiwgIk9LIikpCisJICAgIGVycm9yICgiVGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgdHJhY2Vwb2ludHMuIik7CisKKwkgIGlmICh0LT5hY3Rpb25zKQorCSAgICB7CisJICAgICAgZW5jb2RlX2FjdGlvbnMgKHQsICZ0ZHBfYWN0aW9ucywgJnN0ZXBwaW5nX2FjdGlvbnMpOworCSAgICAgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoZnJlZV9hY3Rpb25zX2xpc3QsIHRkcF9hY3Rpb25zKTsKKwkgICAgICAodm9pZCkgbWFrZV9jbGVhbnVwIChmcmVlX2FjdGlvbnNfbGlzdCwgc3RlcHBpbmdfYWN0aW9ucyk7CisKKwkgICAgICAvKiBkb19zaW5nbGVfc3RlcHMgKHQpOyAqLworCSAgICAgIGlmICh0ZHBfYWN0aW9ucykKKwkJeworCQkgIGZvciAobmR4ID0gMDsgdGRwX2FjdGlvbnNbbmR4XTsgbmR4KyspCisJCSAgICB7CisJCSAgICAgIFFVSVQ7CQkvKiBhbGxvdyB1c2VyIHRvIGJhaWwgb3V0IHdpdGggXkMgKi8KKwkJICAgICAgc3ByaW50ZiAoYnVmLCAiUVREUDotJXg6JXg6JXMlYyIsCisJCQkgICAgICAgdC0+bnVtYmVyLCB0LT5hZGRyZXNzLAorCQkJICAgICAgIHRkcF9hY3Rpb25zW25keF0sCisJCQkgICAgICAgKCh0ZHBfYWN0aW9uc1tuZHgrMV0gfHwgc3RlcHBpbmdfYWN0aW9ucykKKwkJCQk/ICctJyA6IDApKTsKKwkJICAgICAgcHV0cGt0IChidWYpOworCQkgICAgICByZW1vdGVfZ2V0X25vaXN5X3JlcGx5ICh0YXJnZXRfYnVmKTsKKwkJICAgICAgaWYgKHN0cmNtcCAodGFyZ2V0X2J1ZiwgIk9LIikpCisJCQllcnJvciAoIkVycm9yIG9uIHRhcmdldCB3aGlsZSBzZXR0aW5nIHRyYWNlcG9pbnRzLiIpOworCQkgICAgfQorCQl9CisJICAgICAgaWYgKHN0ZXBwaW5nX2FjdGlvbnMpCisJCXsKKwkJICBmb3IgKG5keCA9IDA7IHN0ZXBwaW5nX2FjdGlvbnNbbmR4XTsgbmR4KyspCisJCSAgICB7CisJCSAgICAgIFFVSVQ7CQkvKiBhbGxvdyB1c2VyIHRvIGJhaWwgb3V0IHdpdGggXkMgKi8KKwkJICAgICAgc3ByaW50ZiAoYnVmLCAiUVREUDotJXg6JXg6JXMlcyVzIiwKKwkJCSAgICAgICB0LT5udW1iZXIsIHQtPmFkZHJlc3MsCisJCQkgICAgICAgKChuZHggPT0gMCkgPyAiUyIgOiAiIiksCisJCQkgICAgICAgc3RlcHBpbmdfYWN0aW9uc1tuZHhdLAorCQkJICAgICAgIChzdGVwcGluZ19hY3Rpb25zW25keCsxXSA/ICItIiA6ICIiKSk7CisJCSAgICAgIHB1dHBrdCAoYnVmKTsKKwkJICAgICAgcmVtb3RlX2dldF9ub2lzeV9yZXBseSAodGFyZ2V0X2J1Zik7CisJCSAgICAgIGlmIChzdHJjbXAgKHRhcmdldF9idWYsICJPSyIpKQorCQkJZXJyb3IgKCJFcnJvciBvbiB0YXJnZXQgd2hpbGUgc2V0dGluZyB0cmFjZXBvaW50cy4iKTsKKwkJICAgIH0KKwkJfQorCisJICAgICAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisJICAgIH0KKwl9CisgICAgICAvKiBUZWxsIHRhcmdldCB0byB0cmVhdCB0ZXh0LWxpa2Ugc2VjdGlvbnMgYXMgdHJhbnNwYXJlbnQgKi8KKyAgICAgIHJlbW90ZV9zZXRfdHJhbnNwYXJlbnRfcmFuZ2VzICgpOworICAgICAgLyogTm93IGluc2VydCB0cmFwcyBhbmQgYmVnaW4gY29sbGVjdGluZyBkYXRhICovCisgICAgICBwdXRwa3QgKCJRVFN0YXJ0Iik7CisgICAgICByZW1vdGVfZ2V0X25vaXN5X3JlcGx5ICh0YXJnZXRfYnVmKTsKKyAgICAgIGlmIChzdHJjbXAgKHRhcmdldF9idWYsICJPSyIpKQorCWVycm9yICgiQm9ndXMgcmVwbHkgZnJvbSB0YXJnZXQ6ICVzIiwgdGFyZ2V0X2J1Zik7CisgICAgICBzZXRfdHJhY2VmcmFtZV9udW0gKC0xKTsJLyogYWxsIG9sZCB0cmFjZWZyYW1lcyBpbnZhbGlkYXRlZCAqLworICAgICAgc2V0X3RyYWNlcG9pbnRfbnVtICgtMSk7CisgICAgICBzZXRfdHJhY2VmcmFtZV9jb250ZXh0KC0xKTsKKyAgICAgIHRyYWNlX3J1bm5pbmdfcCA9IDE7CisgICAgICBpZiAodHJhY2Vfc3RhcnRfc3RvcF9ob29rKQorCXRyYWNlX3N0YXJ0X3N0b3BfaG9vaygxLCBmcm9tX3R0eSk7CisgICAgICAKKyAgICB9CisgIGVsc2UKKyAgICBlcnJvciAoIlRyYWNlIGNhbiBvbmx5IGJlIHJ1biBvbiByZW1vdGUgdGFyZ2V0cy4iKTsKK30KKworLyogdHN0b3AgY29tbWFuZCAqLworc3RhdGljIHZvaWQKK3RyYWNlX3N0b3BfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sgLyogU1RVQl9DT01NIElTX0lNUExFTUVOVEVEICovCisgIGlmICh0YXJnZXRfaXNfcmVtb3RlICgpKQorICAgIHsKKyAgICAgIHB1dHBrdCAoIlFUU3RvcCIpOworICAgICAgcmVtb3RlX2dldF9ub2lzeV9yZXBseSAodGFyZ2V0X2J1Zik7CisgICAgICBpZiAoc3RyY21wICh0YXJnZXRfYnVmLCAiT0siKSkKKwllcnJvciAoIkJvZ3VzIHJlcGx5IGZyb20gdGFyZ2V0OiAlcyIsIHRhcmdldF9idWYpOworICAgICAgdHJhY2VfcnVubmluZ19wID0gMDsKKyAgICAgIGlmICh0cmFjZV9zdGFydF9zdG9wX2hvb2spCisJdHJhY2Vfc3RhcnRfc3RvcF9ob29rKDAsIGZyb21fdHR5KTsKKyAgICB9CisgIGVsc2UKKyAgICBlcnJvciAoIlRyYWNlIGNhbiBvbmx5IGJlIHJ1biBvbiByZW1vdGUgdGFyZ2V0cy4iKTsKK30KKwordW5zaWduZWQgbG9uZyB0cmFjZV9ydW5uaW5nX3A7CisKKy8qIHRzdGF0dXMgY29tbWFuZCAqLworc3RhdGljIHZvaWQKK3RyYWNlX3N0YXR1c19jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeyAvKiBTVFVCX0NPTU0gSVNfSU1QTEVNRU5URUQgKi8KKyAgaWYgKHRhcmdldF9pc19yZW1vdGUgKCkpCisgICAgeworICAgICAgcHV0cGt0ICgicVRTdGF0dXMiKTsKKyAgICAgIHJlbW90ZV9nZXRfbm9pc3lfcmVwbHkgKHRhcmdldF9idWYpOworCisgICAgICBpZiAodGFyZ2V0X2J1ZlswXSAhPSAnVCcgfHwKKwkgICh0YXJnZXRfYnVmWzFdICE9ICcwJyAmJiB0YXJnZXRfYnVmWzFdICE9ICcxJykpCisJZXJyb3IgKCJCb2d1cyByZXBseSBmcm9tIHRhcmdldDogJXMiLCB0YXJnZXRfYnVmKTsKKworICAgICAgLyogZXhwb3J0ZWQgZm9yIHVzZSBieSB0aGUgR1VJICovCisgICAgICB0cmFjZV9ydW5uaW5nX3AgPSAodGFyZ2V0X2J1ZlsxXSA9PSAnMScpOworICAgIH0KKyAgZWxzZQorICAgIGVycm9yICgiVHJhY2UgY2FuIG9ubHkgYmUgcnVuIG9uIHJlbW90ZSB0YXJnZXRzLiIpOworfQorCisvKiBXb3JrZXIgZnVuY3Rpb24gZm9yIHRoZSB2YXJpb3VzIGZsYXZvcnMgb2YgdGhlIHRmaW5kIGNvbW1hbmQgKi8KK3N0YXRpYyB2b2lkCitmaW5pc2hfdGZpbmRfY29tbWFuZCAobXNnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqbXNnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGludCB0YXJnZXRfZnJhbWVubyA9IC0xLCB0YXJnZXRfdHJhY2VwdCA9IC0xOworICBDT1JFX0FERFIgb2xkX2ZyYW1lX2FkZHI7CisgIHN0cnVjdCBzeW1ib2wgKm9sZF9mdW5jOworICBjaGFyICpyZXBseTsKKworICBvbGRfZnJhbWVfYWRkciA9IEZSQU1FX0ZQIChnZXRfY3VycmVudF9mcmFtZSAoKSk7CisgIG9sZF9mdW5jICAgICAgID0gZmluZF9wY19mdW5jdGlvbiAocmVhZF9wYyAoKSk7CisKKyAgcHV0cGt0IChtc2cpOworICByZXBseSA9IHJlbW90ZV9nZXRfbm9pc3lfcmVwbHkgKG1zZyk7CisKKyAgd2hpbGUgKHJlcGx5ICYmICpyZXBseSkKKyAgICBzd2l0Y2ggKCpyZXBseSkgeworICAgIGNhc2UgJ0YnOgorICAgICAgaWYgKCh0YXJnZXRfZnJhbWVubyA9IChpbnQpIHN0cnRvbCAoKytyZXBseSwgJnJlcGx5LCAxNikpID09IC0xKQorCXsgCisJICAvKiBBIHJlcXVlc3QgZm9yIGEgbm9uLWV4aXN0YW50IHRyYWNlIGZyYW1lIGhhcyBmYWlsZWQuCisJICAgICBPdXIgcmVzcG9uc2Ugd2lsbCBiZSBkaWZmZXJlbnQsIGRlcGVuZGluZyBvbiBGUk9NX1RUWToKKworCSAgICAgSWYgRlJPTV9UVFkgaXMgdHJ1ZSwgbWVhbmluZyB0aGF0IHRoaXMgY29tbWFuZCB3YXMgCisJICAgICB0eXBlZCBpbnRlcmFjdGl2ZWx5IGJ5IHRoZSB1c2VyLCB0aGVuIGdpdmUgYW4gZXJyb3IKKwkgICAgIGFuZCBETyBOT1QgY2hhbmdlIHRoZSBzdGF0ZSBvZiB0cmFjZWZyYW1lX251bWJlciBldGMuCisKKwkgICAgIEhvd2V2ZXIgaWYgRlJPTV9UVFkgaXMgZmFsc2UsIG1lYW5pbmcgdGhhdCB3ZSdyZSBlaXRoZXIKKwkgICAgIGluIGEgc2NyaXB0LCBhIGxvb3AsIG9yIGEgdXNlci1kZWZpbmVkIGNvbW1hbmQsIHRoZW4gCisJICAgICBET04nVCBnaXZlIGFuIGVycm9yLCBidXQgRE8gY2hhbmdlIHRoZSBzdGF0ZSBvZgorCSAgICAgdHJhY2VmcmFtZV9udW1iZXIgZXRjLiB0byBpbnZhbGlkLgorCisJICAgICBUaGUgcmF0aW9uYWxsZSBpcyB0aGF0IGlmIHlvdSB0eXBlZCB0aGUgY29tbWFuZCwgeW91CisJICAgICBtaWdodCBqdXN0IGhhdmUgY29tbWl0dGVkIGEgdHlwbyBvciBzb21ldGhpbmcsIGFuZCB5b3UnZAorCSAgICAgbGlrZSB0byBOT1QgbG9zZSB5b3VyIGN1cnJlbnQgZGVidWdnaW5nIHN0YXRlLiAgSG93ZXZlcgorCSAgICAgaWYgeW91J3JlIGluIGEgdXNlci1kZWZpbmVkIGNvbW1hbmQgb3IgZXNwZWNpYWxseSBpbiBhCisJICAgICBsb29wLCB0aGVuIHlvdSBuZWVkIGEgd2F5IHRvIGRldGVjdCB0aGF0IHRoZSBjb21tYW5kCisJICAgICBmYWlsZWQgV0lUSE9VVCBhYm9ydGluZy4gIFRoaXMgYWxsb3dzIHlvdSB0byB3cml0ZQorCSAgICAgc2NyaXB0cyB0aGF0IHNlYXJjaCB0aHJ1IHRoZSB0cmFjZSBidWZmZXIgdW50aWwgdGhlIGVuZCwKKwkgICAgIGFuZCB0aGVuIGNvbnRpbnVlIG9uIHRvIGRvIHNvbWV0aGluZyBlbHNlLiAgKi8KKworCSAgaWYgKGZyb21fdHR5KQorCSAgICBlcnJvciAoIlRhcmdldCBmYWlsZWQgdG8gZmluZCByZXF1ZXN0ZWQgdHJhY2UgZnJhbWUuIik7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoaW5mb192ZXJib3NlKQorCQlwcmludGZfZmlsdGVyZWQgKCJFbmQgb2YgdHJhY2UgYnVmZmVyLlxuIik7CisJICAgICAgLyogVGhlIGZvbGxvd2luZyB3aWxsIG5vdCByZWN1cnNlLCBzaW5jZSBpdCdzIHNwZWNpYWwtY2FzZWQgKi8KKwkgICAgICB0cmFjZV9maW5kX2NvbW1hbmQgKCItMSIsIGZyb21fdHR5KTsKKwkgICAgICByZXBseSA9IE5VTEw7CS8qIGJyZWFrIG91dCBvZiBsb29wLCAKKwkJCQkgICAoYXZvaWQgcmVjdXJzaXZlIG5vbnNlbnNlKSAqLworCSAgICB9CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnVCc6CisgICAgICBpZiAoKHRhcmdldF90cmFjZXB0ID0gKGludCkgc3RydG9sICgrK3JlcGx5LCAmcmVwbHksIDE2KSkgPT0gLTEpCisJZXJyb3IgKCJUYXJnZXQgZmFpbGVkIHRvIGZpbmQgcmVxdWVzdGVkIHRyYWNlIGZyYW1lLiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnTyc6CS8qICJPSyI/ICovCisgICAgICBpZiAocmVwbHlbMV0gPT0gJ0snICYmIHJlcGx5WzJdID09ICdcMCcpCisJcmVwbHkgKz0gMjsKKyAgICAgIGVsc2UKKwllcnJvciAoIkJvZ3VzIHJlcGx5IGZyb20gdGFyZ2V0OiAlcyIsIHJlcGx5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciAoIkJvZ3VzIHJlcGx5IGZyb20gdGFyZ2V0OiAlcyIsIHJlcGx5KTsKKyAgICB9CisKKyAgZmx1c2hfY2FjaGVkX2ZyYW1lcyAoKTsKKyAgcmVnaXN0ZXJzX2NoYW5nZWQgKCk7CisgIHNlbGVjdF9mcmFtZSAoZ2V0X2N1cnJlbnRfZnJhbWUgKCksIDApOworICBzZXRfdHJhY2VmcmFtZV9udW0gKHRhcmdldF9mcmFtZW5vKTsKKyAgc2V0X3RyYWNlcG9pbnRfbnVtICh0YXJnZXRfdHJhY2VwdCk7CisgIGlmICh0YXJnZXRfZnJhbWVubyA9PSAtMSkKKyAgICBzZXRfdHJhY2VmcmFtZV9jb250ZXh0ICgtMSk7CisgIGVsc2UKKyAgICBzZXRfdHJhY2VmcmFtZV9jb250ZXh0IChyZWFkX3BjICgpKTsKKworICBpZiAoZnJvbV90dHkpCisgICAgeworICAgICAgaW50IHNvdXJjZV9vbmx5OworCisgICAgICAvKiBOT1RFOiBpbiBpbW1pdGF0aW9uIG9mIHRoZSBzdGVwIGNvbW1hbmQsIHRyeSB0byBkZXRlcm1pbmUKKwkgd2hldGhlciB3ZSBoYXZlIG1hZGUgYSB0cmFuc2l0aW9uIGZyb20gb25lIGZ1bmN0aW9uIHRvIGFub3RoZXIuCisJIElmIHNvLCB3ZSdsbCBwcmludCB0aGUgInN0YWNrIGZyYW1lIiAoaWUuIHRoZSBuZXcgZnVuY3Rpb24gYW5kCisJIGl0J3MgYXJndW1lbnRzKSAtLSBvdGhlcndpc2Ugd2UnbGwganVzdCBzaG93IHRoZSBuZXcgc291cmNlIGxpbmUuCisKKwkgVGhpcyBkZXRlcm1pbmF0aW9uIGlzIG1hZGUgYnkgY2hlY2tpbmcgKDEpIHdoZXRoZXIgdGhlIGN1cnJlbnQKKwkgZnVuY3Rpb24gaGFzIGNoYW5nZWQsIGFuZCAoMikgd2hldGhlciB0aGUgY3VycmVudCBGUCBoYXMgY2hhbmdlZC4KKwkgSGFjazogaWYgdGhlIEZQIHdhc24ndCBjb2xsZWN0ZWQsIGVpdGhlciBhdCB0aGUgY3VycmVudCBvciB0aGUKKwkgcHJldmlvdXMgZnJhbWUsIGFzc3VtZSB0aGF0IHRoZSBGUCBoYXMgTk9UIGNoYW5nZWQuICAqLworCisgICAgICBpZiAob2xkX2Z1bmMgICAgICAgPT0gZmluZF9wY19mdW5jdGlvbiAocmVhZF9wYyAoKSkgJiYKKwkgKG9sZF9mcmFtZV9hZGRyID09IDAgfHwKKwkgIEZSQU1FX0ZQIChnZXRfY3VycmVudF9mcmFtZSAoKSkgPT0gMCB8fAorCSAgb2xkX2ZyYW1lX2FkZHIgPT0gRlJBTUVfRlAgKGdldF9jdXJyZW50X2ZyYW1lICgpKSkpCisJc291cmNlX29ubHkgPSAtMTsKKyAgICAgIGVsc2UKKwlzb3VyY2Vfb25seSA9ICAxOworCisgICAgICBwcmludF9zdGFja19mcmFtZSAoc2VsZWN0ZWRfZnJhbWUsIHNlbGVjdGVkX2ZyYW1lX2xldmVsLCBzb3VyY2Vfb25seSk7CisgICAgICBkb19kaXNwbGF5cyAoKTsKKyAgICB9Cit9CisKKy8qIHRyYWNlX2ZpbmRfY29tbWFuZCB0YWtlcyBhIHRyYWNlIGZyYW1lIG51bWJlciBuLCAKKyAgIHNlbmRzICJRVEZyYW1lOjxuPiIgdG8gdGhlIHRhcmdldCwgCisgICBhbmQgYWNjZXB0cyBhIHJlcGx5IHRoYXQgbWF5IGNvbnRhaW4gc2V2ZXJhbCBvcHRpb25hbCBwaWVjZXMKKyAgIG9mIGluZm9ybWF0aW9uOiBhIGZyYW1lIG51bWJlciwgYSB0cmFjZXBvaW50IG51bWJlciwgYW5kIGFuCisgICBpbmRpY2F0aW9uIG9mIHdoZXRoZXIgdGhpcyBpcyBhIHRyYXAgZnJhbWUgb3IgYSBzdGVwcGluZyBmcmFtZS4KKworICAgVGhlIG1pbmltYWwgcmVzcG9uc2UgaXMganVzdCAiT0siICh3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgCisgICB0YXJnZXQgZG9lcyBub3QgZ2l2ZSB1cyBhIGZyYW1lIG51bWJlciBvciBhIHRyYWNlcG9pbnQgbnVtYmVyKS4KKyAgIEluc3RlYWQgb2YgdGhhdCwgdGhlIHRhcmdldCBtYXkgc2VuZCB1cyBhIHN0cmluZyBjb250YWluaW5nCisgICBhbnkgY29tYmluYXRpb24gb2Y6CisJRjxoZXhudW0+CShnaXZlcyB0aGUgc2VsZWN0ZWQgZnJhbWUgbnVtYmVyKQorCVQ8aGV4bnVtPgkoZ2l2ZXMgdGhlIHNlbGVjdGVkIHRyYWNlcG9pbnQgbnVtYmVyKQorICAgKi8KKworLyogdGZpbmQgY29tbWFuZCAqLworc3RhdGljIHZvaWQKK3RyYWNlX2ZpbmRfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sgLyogU1RVQl9DT01NIFBBUlRfSU1QTEVNRU5URUQgKi8KKyAgLyogdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2l0aCBhIG51bWVyaWMgYXJndW1lbnQgKi8KKyAgaW50IGZyYW1lbm8gPSAtMTsKKyAgY2hhciAqdG1wOworCisgIGlmICh0YXJnZXRfaXNfcmVtb3RlICgpKQorICAgIHsKKyAgICAgIGlmICh0cmFjZV9maW5kX2hvb2spCisJdHJhY2VfZmluZF9ob29rIChhcmdzLCBmcm9tX3R0eSk7ICAKKyAgICAgIAorICAgICAgaWYgKGFyZ3MgPT0gMCB8fCAqYXJncyA9PSAwKQorCXsgLyogVEZJTkQgd2l0aCBubyBhcmdzIG1lYW5zIGZpbmQgTkVYVCB0cmFjZSBmcmFtZS4gKi8KKwkgIGlmICh0cmFjZWZyYW1lX251bWJlciA9PSAtMSkKKwkgICAgZnJhbWVubyA9IDA7CS8qICJuZXh0IiBpcyBmaXJzdCBvbmUgKi8KKwkgIGVsc2UKKwkgICAgZnJhbWVubyA9IHRyYWNlZnJhbWVfbnVtYmVyICsgMTsKKwl9CisgICAgICBlbHNlIGlmICgwID09IHN0cmNtcCAoYXJncywgIi0iKSkKKwl7CisJICBpZiAodHJhY2VmcmFtZV9udW1iZXIgPT0gLTEpCisJICAgIGVycm9yICgibm90IGRlYnVnZ2luZyB0cmFjZSBidWZmZXIiKTsKKwkgIGVsc2UgaWYgKGZyb21fdHR5ICYmIHRyYWNlZnJhbWVfbnVtYmVyID09IDApCisJICAgIGVycm9yICgiYWxyZWFkeSBhdCBzdGFydCBvZiB0cmFjZSBidWZmZXIiKTsKKworCSAgZnJhbWVubyA9IHRyYWNlZnJhbWVfbnVtYmVyIC0gMTsKKwl9CisgICAgICBlbHNlCisJZnJhbWVubyA9IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgKGFyZ3MpOworCisgICAgICBpZiAoZnJhbWVubyA8IC0xKQorCWVycm9yICgiaW52YWxpZCBpbnB1dCAoJWQgaXMgbGVzcyB0aGFuIHplcm8pIiwgZnJhbWVubyk7CisKKyAgICAgIHNwcmludGYgKHRhcmdldF9idWYsICJRVEZyYW1lOiV4IiwgZnJhbWVubyk7CisgICAgICBmaW5pc2hfdGZpbmRfY29tbWFuZCAodGFyZ2V0X2J1ZiwgZnJvbV90dHkpOworICAgIH0KKyAgZWxzZQorICAgIGVycm9yICgiVHJhY2UgY2FuIG9ubHkgYmUgcnVuIG9uIHJlbW90ZSB0YXJnZXRzLiIpOworfQorCisvKiB0ZmluZCBlbmQgKi8KK3N0YXRpYyB2b2lkCit0cmFjZV9maW5kX2VuZF9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICB0cmFjZV9maW5kX2NvbW1hbmQgKCItMSIsIGZyb21fdHR5KTsKK30KKworLyogdGZpbmQgbm9uZSAqLworc3RhdGljIHZvaWQKK3RyYWNlX2ZpbmRfbm9uZV9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICB0cmFjZV9maW5kX2NvbW1hbmQgKCItMSIsIGZyb21fdHR5KTsKK30KKworLyogdGZpbmQgc3RhcnQgKi8KK3N0YXRpYyB2b2lkCit0cmFjZV9maW5kX3N0YXJ0X2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHRyYWNlX2ZpbmRfY29tbWFuZCAoIjAiLCBmcm9tX3R0eSk7Cit9CisKKy8qIHRmaW5kIHBjIGNvbW1hbmQgKi8KK3N0YXRpYyB2b2lkCit0cmFjZV9maW5kX3BjX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7IC8qIFNUVUJfQ09NTSBQQVJUX0lNUExFTUVOVEVEICovCisgIENPUkVfQUREUiBwYzsKKyAgY2hhciAqdG1wOworCisgIGlmICh0YXJnZXRfaXNfcmVtb3RlICgpKQorICAgIHsKKyAgICAgIGlmIChhcmdzID09IDAgfHwgKmFyZ3MgPT0gMCkKKwlwYyA9IHJlYWRfcGMgKCk7CS8qIGRlZmF1bHQgaXMgY3VycmVudCBwYyAqLworICAgICAgZWxzZQorCXBjID0gcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAoYXJncyk7CisKKyAgICAgIHNwcmludGYgKHRhcmdldF9idWYsICJRVEZyYW1lOnBjOiV4IiwgcGMpOworICAgICAgZmluaXNoX3RmaW5kX2NvbW1hbmQgKHRhcmdldF9idWYsIGZyb21fdHR5KTsKKyAgICB9CisgIGVsc2UKKyAgICBlcnJvciAoIlRyYWNlIGNhbiBvbmx5IGJlIHJ1biBvbiByZW1vdGUgdGFyZ2V0cy4iKTsKK30KKworLyogdGZpbmQgdHJhY2Vwb2ludCBjb21tYW5kICovCitzdGF0aWMgdm9pZAordHJhY2VfZmluZF90cmFjZXBvaW50X2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7IC8qIFNUVUJfQ09NTSBQQVJUX0lNUExFTUVOVEVEICovCisgIGludCB0ZHA7CisgIGNoYXIgYnVmWzQwXSwgKnRtcDsKKworICBpZiAodGFyZ2V0X2lzX3JlbW90ZSAoKSkKKyAgICB7CisgICAgICBpZiAoYXJncyA9PSAwIHx8ICphcmdzID09IDApCisJaWYgKHRyYWNlcG9pbnRfbnVtYmVyID09IC0xKQorCSAgZXJyb3IgKCJObyBjdXJyZW50IHRyYWNlcG9pbnQgLS0gcGxlYXNlIHN1cHBseSBhbiBhcmd1bWVudC4iKTsKKwllbHNlCisJICB0ZHAgPSB0cmFjZXBvaW50X251bWJlcjsJLyogZGVmYXVsdCBpcyBjdXJyZW50IFREUCAqLworICAgICAgZWxzZQorCXRkcCA9IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgKGFyZ3MpOworCisgICAgICBzcHJpbnRmICh0YXJnZXRfYnVmLCAiUVRGcmFtZTp0ZHA6JXgiLCB0ZHApOworICAgICAgZmluaXNoX3RmaW5kX2NvbW1hbmQgKHRhcmdldF9idWYsIGZyb21fdHR5KTsKKyAgICB9CisgIGVsc2UKKyAgICBlcnJvciAoIlRyYWNlIGNhbiBvbmx5IGJlIHJ1biBvbiByZW1vdGUgdGFyZ2V0cy4iKTsKK30KKworLyogVEZJTkQgTElORSBjb21tYW5kOgorIAorICAgVGhpcyBjb21tYW5kIHdpbGwgdGFrZSBhIHNvdXJjZWxpbmUgZm9yIGFyZ3VtZW50LCBqdXN0IGxpa2UgQlJFQUsKKyAgIG9yIFRSQUNFIChpZS4gYW55dGhpbmcgdGhhdCAiZGVjb2RlX2xpbmVfMSIgY2FuIGhhbmRsZSkuICAKKyAgIAorICAgV2l0aCBubyBhcmd1bWVudCwgdGhpcyBjb21tYW5kIHdpbGwgZmluZCB0aGUgbmV4dCB0cmFjZSBmcmFtZSAKKyAgIGNvcnJlc3BvbmRpbmcgdG8gYSBzb3VyY2UgbGluZSBPVEhFUiBUSEFOIFRIRSBDVVJSRU5UIE9ORS4gICovCisKK3N0YXRpYyB2b2lkCit0cmFjZV9maW5kX2xpbmVfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sgLyogU1RVQl9DT01NIFBBUlRfSU1QTEVNRU5URUQgKi8KKyAgc3RhdGljIENPUkVfQUREUiBzdGFydF9wYywgZW5kX3BjOworICBzdHJ1Y3Qgc3ltdGFic19hbmRfbGluZXMgc2FsczsKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CisgIGNoYXIgKnRtcDsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKworICBpZiAodGFyZ2V0X2lzX3JlbW90ZSAoKSkKKyAgICB7CisgICAgICBpZiAoYXJncyA9PSAwIHx8ICphcmdzID09IDApCisJeworCSAgc2FsID0gZmluZF9wY19saW5lICgoZ2V0X2N1cnJlbnRfZnJhbWUgKCkpLT5wYywgMCk7CisJICBzYWxzLm5lbHRzID0gMTsKKwkgIHNhbHMuc2FscyA9IChzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lICopCisJICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHN5bXRhYl9hbmRfbGluZSkpOworCSAgc2Fscy5zYWxzWzBdID0gc2FsOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzYWxzID0gZGVjb2RlX2xpbmVfc3BlYyAoYXJncywgMSk7CisJICBzYWwgID0gc2Fscy5zYWxzWzBdOworCX0KKworICAgICAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwIChmcmVlLCBzYWxzLnNhbHMpOworICAgICAgaWYgKHNhbC5zeW10YWIgPT0gMCkKKwl7CisJICBwcmludGZfZmlsdGVyZWQgKCJURklORDogTm8gbGluZSBudW1iZXIgaW5mb3JtYXRpb24gYXZhaWxhYmxlIik7CisJICBpZiAoc2FsLnBjICE9IDApCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGlzIHVzZWZ1bCBmb3IgImluZm8gbGluZSAqMHg3ZjM0Ii4gIElmIHdlIGNhbid0IHRlbGwgdGhlCisJCSB1c2VyIGFib3V0IGEgc291cmNlIGxpbmUsIGF0IGxlYXN0IGxldCB0aGVtIGhhdmUgdGhlIHN5bWJvbGljCisJCSBhZGRyZXNzLiAgKi8KKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCIgZm9yIGFkZHJlc3MgIik7CisJICAgICAgd3JhcF9oZXJlICgiICAiKTsKKwkgICAgICBwcmludF9hZGRyZXNzIChzYWwucGMsIGdkYl9zdGRvdXQpOworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIjtcbiAtLSB3aWxsIGF0dGVtcHQgdG8gZmluZCBieSBQQy4gXG4iKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiLlxuIik7CisJICAgICAgcmV0dXJuOwkvKiBubyBsaW5lLCBubyBQQzsgd2hhdCBjYW4gd2UgZG8/ICovCisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChzYWwubGluZSA+IDAKKwkgICAgICAgJiYgZmluZF9saW5lX3BjX3JhbmdlIChzYWwsICZzdGFydF9wYywgJmVuZF9wYykpCisJeworCSAgaWYgKHN0YXJ0X3BjID09IGVuZF9wYykKKwkgICAgeworCSAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkxpbmUgJWQgb2YgXCIlc1wiIiwKKwkJCSAgICAgICBzYWwubGluZSwgc2FsLnN5bXRhYi0+ZmlsZW5hbWUpOworCSAgICAgIHdyYXBfaGVyZSAoIiAgIik7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiIGlzIGF0IGFkZHJlc3MgIik7CisJICAgICAgcHJpbnRfYWRkcmVzcyAoc3RhcnRfcGMsIGdkYl9zdGRvdXQpOworCSAgICAgIHdyYXBfaGVyZSAoIiAgIik7CisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiIGJ1dCBjb250YWlucyBubyBjb2RlLlxuIik7CisJICAgICAgc2FsID0gZmluZF9wY19saW5lIChzdGFydF9wYywgMCk7CisJICAgICAgaWYgKHNhbC5saW5lID4gMCAmJgorCQkgIGZpbmRfbGluZV9wY19yYW5nZSAoc2FsLCAmc3RhcnRfcGMsICZlbmRfcGMpICYmCisJCSAgc3RhcnRfcGMgIT0gZW5kX3BjKQorCQlwcmludGZfZmlsdGVyZWQgKCJBdHRlbXB0aW5nIHRvIGZpbmQgbGluZSAlZCBpbnN0ZWFkLlxuIiwKKwkJCQkgc2FsLmxpbmUpOworCSAgICAgIGVsc2UKKwkJZXJyb3IgKCJDYW5ub3QgZmluZCBhIGdvb2QgbGluZS4iKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwkvKiBJcyB0aGVyZSBhbnkgY2FzZSBpbiB3aGljaCB3ZSBnZXQgaGVyZSwgYW5kIGhhdmUgYW4gYWRkcmVzcworCSAgIHdoaWNoIHRoZSB1c2VyIHdvdWxkIHdhbnQgdG8gc2VlPyAgSWYgd2UgaGF2ZSBkZWJ1Z2dpbmcgc3ltYm9scworCSAgIGFuZCBubyBsaW5lIG51bWJlcnM/ICAqLworCWVycm9yICgiTGluZSBudW1iZXIgJWQgaXMgb3V0IG9mIHJhbmdlIGZvciBcIiVzXCIuXG4iLAorCSAgICAgICBzYWwubGluZSwgc2FsLnN5bXRhYi0+ZmlsZW5hbWUpOworCisgICAgICBpZiAoYXJncyAmJiAqYXJncykJLyogZmluZCB3aXRoaW4gcmFuZ2Ugb2Ygc3RhdGVkIGxpbmUgKi8KKwlzcHJpbnRmICh0YXJnZXRfYnVmLCAiUVRGcmFtZTpyYW5nZToleDoleCIsIHN0YXJ0X3BjLCBlbmRfcGMgLSAxKTsKKyAgICAgIGVsc2UJCQkvKiBmaW5kIE9VVFNJREUgT0YgcmFuZ2Ugb2YgQ1VSUkVOVCBsaW5lICovCisJc3ByaW50ZiAodGFyZ2V0X2J1ZiwgIlFURnJhbWU6b3V0c2lkZToleDoleCIsIHN0YXJ0X3BjLCBlbmRfcGMgLSAxKTsKKyAgICAgIGZpbmlzaF90ZmluZF9jb21tYW5kICh0YXJnZXRfYnVmLCBmcm9tX3R0eSk7CisgICAgICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKKyAgICB9CisgIGVsc2UKKyAgICAgIGVycm9yICgiVHJhY2UgY2FuIG9ubHkgYmUgcnVuIG9uIHJlbW90ZSB0YXJnZXRzLiIpOworfQorCisvKiB0ZmluZCByYW5nZSBjb21tYW5kICovCitzdGF0aWMgdm9pZAordHJhY2VfZmluZF9yYW5nZV9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeyAvKiBTVFVCX0NPTU0gUEFSVF9JTVBMRU1FTlRFRCAqLworICBzdGF0aWMgQ09SRV9BRERSIHN0YXJ0LCBzdG9wOworICBjaGFyICp0bXA7CisKKyAgaWYgKHRhcmdldF9pc19yZW1vdGUgKCkpCisgICAgeworICAgICAgaWYgKGFyZ3MgPT0gMCB8fCAqYXJncyA9PSAwKQorCXsgLyogWFhYIEZJWE1FOiB3aGF0IHNob3VsZCBkZWZhdWx0IGJlaGF2aW9yIGJlPyAqLworCSAgcHJpbnRmX2ZpbHRlcmVkICgiVXNhZ2U6IHRmaW5kIHJhbmdlIDxzdGFydGFkZHI+LDxlbmRhZGRyPlxuIik7CisJICByZXR1cm47CisJfQorCisgICAgICBpZiAoMCAhPSAodG1wID0gc3RyY2hyIChhcmdzLCAnLCcgKSkpCisJeworCSAgKnRtcCsrID0gJ1wwJzsJLyogdGVybWluYXRlIHN0YXJ0IGFkZHJlc3MgKi8KKwkgIHdoaWxlIChpc3NwYWNlICgqdG1wKSkKKwkgICAgdG1wKys7CisJICBzdGFydCA9IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgKGFyZ3MpOworCSAgc3RvcCAgPSBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzICh0bXApOworCX0KKyAgICAgIGVsc2UKKwl7IC8qIG5vIGV4cGxpY2l0IGVuZCBhZGRyZXNzPyAqLworCSAgc3RhcnQgPSBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIChhcmdzKTsKKwkgIHN0b3AgID0gc3RhcnQgKyAxOyAvKiA/Pz8gKi8KKwl9CisKKyAgICAgIHNwcmludGYgKHRhcmdldF9idWYsICJRVEZyYW1lOnJhbmdlOiV4OiV4Iiwgc3RhcnQsIHN0b3ApOworICAgICAgZmluaXNoX3RmaW5kX2NvbW1hbmQgKHRhcmdldF9idWYsIGZyb21fdHR5KTsKKyAgICB9CisgIGVsc2UKKyAgICAgIGVycm9yICgiVHJhY2UgY2FuIG9ubHkgYmUgcnVuIG9uIHJlbW90ZSB0YXJnZXRzLiIpOworfQorCisvKiB0ZmluZCBvdXRzaWRlIGNvbW1hbmQgKi8KK3N0YXRpYyB2b2lkCit0cmFjZV9maW5kX291dHNpZGVfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sgLyogU1RVQl9DT01NIFBBUlRfSU1QTEVNRU5URUQgKi8KKyAgQ09SRV9BRERSIHN0YXJ0LCBzdG9wOworICBjaGFyICp0bXA7CisKKyAgaWYgKHRhcmdldF9pc19yZW1vdGUgKCkpCisgICAgeworICAgICAgaWYgKGFyZ3MgPT0gMCB8fCAqYXJncyA9PSAwKQorCXsgLyogWFhYIEZJWE1FOiB3aGF0IHNob3VsZCBkZWZhdWx0IGJlaGF2aW9yIGJlPyAqLworCSAgcHJpbnRmX2ZpbHRlcmVkICgiVXNhZ2U6IHRmaW5kIG91dHNpZGUgPHN0YXJ0YWRkcj4sPGVuZGFkZHI+XG4iKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGlmICgwICE9ICh0bXAgPSBzdHJjaHIgKGFyZ3MsICcsJyApKSkKKwl7CisJICAqdG1wKysgPSAnXDAnOwkvKiB0ZXJtaW5hdGUgc3RhcnQgYWRkcmVzcyAqLworCSAgd2hpbGUgKGlzc3BhY2UgKCp0bXApKQorCSAgICB0bXArKzsKKwkgIHN0YXJ0ID0gcGFyc2VfYW5kX2V2YWxfYWRkcmVzcyAoYXJncyk7CisJICBzdG9wICA9IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgKHRtcCk7CisJfQorICAgICAgZWxzZQorCXsgLyogbm8gZXhwbGljaXQgZW5kIGFkZHJlc3M/ICovCisJICBzdGFydCA9IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgKGFyZ3MpOworCSAgc3RvcCAgPSBzdGFydCArIDE7IC8qID8/PyAqLworCX0KKworICAgICAgc3ByaW50ZiAodGFyZ2V0X2J1ZiwgIlFURnJhbWU6b3V0c2lkZToleDoleCIsIHN0YXJ0LCBzdG9wKTsKKyAgICAgIGZpbmlzaF90ZmluZF9jb21tYW5kICh0YXJnZXRfYnVmLCBmcm9tX3R0eSk7CisgICAgfQorICBlbHNlCisgICAgICBlcnJvciAoIlRyYWNlIGNhbiBvbmx5IGJlIHJ1biBvbiByZW1vdGUgdGFyZ2V0cy4iKTsKK30KKworLyogc2F2ZS10cmFjZXBvaW50cyBjb21tYW5kICovCitzdGF0aWMgdm9pZAordHJhY2Vwb2ludF9zYXZlX2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCB0cmFjZXBvaW50ICAqdHA7CisgIHN0cnVjdCBhY3Rpb25fbGluZSAqbGluZTsKKyAgRklMRSAqZnA7CisgIGNoYXIgKmkxID0gIiAgICAiLCAqaTIgPSAiICAgICAgIjsKKyAgY2hhciAqaW5kZW50LCAqYWN0aW9ubGluZTsKKworICBpZiAoYXJncyA9PSAwIHx8ICphcmdzID09IDApCisgICAgZXJyb3IgKCJBcmd1bWVudCByZXF1aXJlZCAoZmlsZSBuYW1lIGluIHdoaWNoIHRvIHNhdmUgdHJhY2Vwb2ludHMiKTsKKworICBpZiAodHJhY2Vwb2ludF9jaGFpbiA9PSAwKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJzYXZlLXRyYWNlcG9pbnRzOiBubyB0cmFjZXBvaW50cyB0byBzYXZlLlxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICghKGZwID0gZm9wZW4gKGFyZ3MsICJ3IikpKQorICAgIGVycm9yICgiVW5hYmxlIHRvIG9wZW4gZmlsZSAnJXMnIGZvciBzYXZpbmcgdHJhY2Vwb2ludHMiKTsKKworICBBTExfVFJBQ0VQT0lOVFMgKHRwKQorICAgIHsKKyAgICAgIGlmICh0cC0+YWRkcl9zdHJpbmcpCisJZnByaW50ZiAoZnAsICJ0cmFjZSAlc1xuIiwgdHAtPmFkZHJfc3RyaW5nKTsKKyAgICAgIGVsc2UKKwlmcHJpbnRmIChmcCwgInRyYWNlICoweCV4XG4iLCB0cC0+YWRkcmVzcyk7CisKKyAgICAgIGlmICh0cC0+cGFzc19jb3VudCkKKwlmcHJpbnRmIChmcCwgIiAgcGFzc2NvdW50ICVkXG4iLCB0cC0+cGFzc19jb3VudCk7CisKKyAgICAgIGlmICh0cC0+YWN0aW9ucykKKwl7CisJICBmcHJpbnRmIChmcCwgIiAgYWN0aW9uc1xuIik7CisJICBpbmRlbnQgPSBpMTsKKwkgIGZvciAobGluZSA9IHRwLT5hY3Rpb25zOyBsaW5lOyBsaW5lID0gbGluZS0+bmV4dCkKKwkgICAgeworCSAgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjbWQ7CisKKwkgICAgICBRVUlUOwkJCS8qIGFsbG93IHVzZXIgdG8gYmFpbCBvdXQgd2l0aCBeQyAqLworCSAgICAgIGFjdGlvbmxpbmUgPSBsaW5lLT5hY3Rpb247CisJICAgICAgd2hpbGUgKGlzc3BhY2UoKmFjdGlvbmxpbmUpKQorCQlhY3Rpb25saW5lKys7CisKKwkgICAgICBmcHJpbnRmIChmcCwgIiVzJXNcbiIsIGluZGVudCwgYWN0aW9ubGluZSk7CisJICAgICAgaWYgKCphY3Rpb25saW5lICE9ICcjJykJLyogc2tpcCBmb3IgY29tbWVudCBsaW5lcyAqLworCQl7CisJCSAgY21kID0gbG9va3VwX2NtZCAoJmFjdGlvbmxpbmUsIGNtZGxpc3QsICIiLCAtMSwgMSk7CisJCSAgaWYgKGNtZCA9PSAwKQorCQkgICAgZXJyb3IgKCJCYWQgYWN0aW9uIGxpc3QgaXRlbTogJXMiLCBhY3Rpb25saW5lKTsKKwkJICBpZiAoY21kLT5mdW5jdGlvbi5jZnVuYyA9PSB3aGlsZV9zdGVwcGluZ19wc2V1ZG9jb21tYW5kKQorCQkgICAgaW5kZW50ID0gaTI7CisJCSAgZWxzZSBpZiAoY21kLT5mdW5jdGlvbi5jZnVuYyA9PSBlbmRfYWN0aW9uc19wc2V1ZG9jb21tYW5kKQorCQkgICAgaW5kZW50ID0gaTE7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgIGZjbG9zZSAoZnApOworICBpZiAoZnJvbV90dHkpCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiVHJhY2Vwb2ludHMgc2F2ZWQgdG8gZmlsZSAnJXMnLlxuIiwgYXJncyk7CisgIHJldHVybjsKK30KKworLyogaW5mbyBzY29wZSBjb21tYW5kOiBsaXN0IHRoZSBsb2NhbHMgZm9yIGEgc2NvcGUuICAqLworc3RhdGljIHZvaWQKK3Njb3BlX2luZm8gKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOworICBzdHJ1Y3Qgc3ltdGFic19hbmRfbGluZXMgc2FsczsKKyAgc3RydWN0IHN5bWJvbCAqc3ltOworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW07CisgIHN0cnVjdCBibG9jayAqYmxvY2s7CisgIGNoYXIgKipjYW5vbmljYWwsICpzeW1uYW1lLCAqc2F2ZV9hcmdzID0gYXJnczsKKyAgaW50IGksIGosIG5zeW1zLCBjb3VudCA9IDA7CisKKyAgaWYgKGFyZ3MgPT0gMCB8fCAqYXJncyA9PSAwKQorICAgIGVycm9yICgicmVxdWlyZXMgYW4gYXJndW1lbnQgKGZ1bmN0aW9uLCBsaW5lIG9yICphZGRyKSB0byBkZWZpbmUgYSBzY29wZSIpOworCisgIHNhbHMgPSBkZWNvZGVfbGluZV8xICgmYXJncywgMSwgTlVMTCwgMCwgJmNhbm9uaWNhbCk7CisgIGlmIChzYWxzLm5lbHRzID09IDApCisgICAgcmV0dXJuOwkJLyogcHJlc3VtYWJseSBkZWNvZGVfbGluZV8xIGhhcyBhbHJlYWR5IHdhcm5lZCAqLworCisgIC8qIFJlc29sdmUgbGluZSBudW1iZXJzIHRvIFBDICovCisgIHJlc29sdmVfc2FsX3BjICgmc2Fscy5zYWxzWzBdKTsKKyAgYmxvY2sgPSBibG9ja19mb3JfcGMgKHNhbHMuc2Fsc1swXS5wYyk7CisKKyAgd2hpbGUgKGJsb2NrICE9IDApCisgICAgeworICAgICAgUVVJVDsJCQkJLyogYWxsb3cgdXNlciB0byBiYWlsIG91dCB3aXRoIF5DICovCisgICAgICBuc3ltcyA9IEJMT0NLX05TWU1TIChibG9jayk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnN5bXM7IGkrKykKKwl7CisJICBRVUlUOwkJCQkvKiBhbGxvdyB1c2VyIHRvIGJhaWwgb3V0IHdpdGggXkMgKi8KKwkgIGlmIChjb3VudCA9PSAwKQorCSAgICBwcmludGZfZmlsdGVyZWQgKCJTY29wZSBmb3IgJXM6XG4iLCBzYXZlX2FyZ3MpOworCSAgY291bnQrKzsKKwkgIHN5bSA9IEJMT0NLX1NZTSAoYmxvY2ssIGkpOworCSAgc3ltbmFtZSA9IFNZTUJPTF9OQU1FIChzeW0pOworCSAgaWYgKHN5bW5hbWUgPT0gTlVMTCB8fCAqc3ltbmFtZSA9PSAnXDAnKQorCSAgICBjb250aW51ZTsJLyogcHJvYmFibHkgYm90Y2hlZCwgY2VydGFpbmx5IHVzZWxlc3MgKi8KKworCSAgcHJpbnRmX2ZpbHRlcmVkICgiU3ltYm9sICVzIGlzICIsIHN5bW5hbWUpOworCSAgc3dpdGNoIChTWU1CT0xfQ0xBU1MgKHN5bSkpIHsKKwkgIGRlZmF1bHQ6CisJICBjYXNlIExPQ19VTkRFRjoJCS8qIG1lc3NlZCB1cCBzeW1ib2w/ICovCisJICAgIHByaW50Zl9maWx0ZXJlZCAoImEgYm9ndXMgc3ltYm9sLCBjbGFzcyAlZC5cbiIsIAorCQkJICAgICBTWU1CT0xfQ0xBU1MgKHN5bSkpOworCSAgICBjb3VudC0tOwkJCS8qIGRvbid0IGNvdW50IHRoaXMgb25lICovCisJICAgIGNvbnRpbnVlOworCSAgY2FzZSBMT0NfQ09OU1Q6CisJICAgIHByaW50Zl9maWx0ZXJlZCAoImEgY29uc3RhbnQgd2l0aCB2YWx1ZSAlZCAoMHgleCkiLCAKKwkJCSAgICAgU1lNQk9MX1ZBTFVFIChzeW0pLCBTWU1CT0xfVkFMVUUgKHN5bSkpOworCSAgICBicmVhazsKKwkgIGNhc2UgTE9DX0NPTlNUX0JZVEVTOgorCSAgICBwcmludGZfZmlsdGVyZWQgKCJjb25zdGFudCBieXRlczogIik7CisJICAgIGlmIChTWU1CT0xfVFlQRSAoc3ltKSkKKwkgICAgICBmb3IgKGogPSAwOyBqIDwgVFlQRV9MRU5HVEggKFNZTUJPTF9UWVBFIChzeW0pKTsgaisrKQorCQlmcHJpbnRmX2ZpbHRlcmVkIChnZGJfc3Rkb3V0LCAiICUwMngiLAorCQkJCSAgKHVuc2lnbmVkKSBTWU1CT0xfVkFMVUVfQllURVMgKHN5bSkgW2pdKTsKKyAgCSAgICBicmVhazsKKwkgIGNhc2UgTE9DX1NUQVRJQzoKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgiaW4gc3RhdGljIHN0b3JhZ2UgYXQgYWRkcmVzcyAiKTsKKwkgICAgcHJpbnRfYWRkcmVzc19udW1lcmljIChTWU1CT0xfVkFMVUVfQUREUkVTUyAoc3ltKSwgMSwgZ2RiX3N0ZG91dCk7CisJICAgIGJyZWFrOworCSAgY2FzZSBMT0NfUkVHSVNURVI6CisJICAgIHByaW50Zl9maWx0ZXJlZCAoImEgbG9jYWwgdmFyaWFibGUgaW4gcmVnaXN0ZXIgJCVzIiwKKwkJCSAgICAgUkVHSVNURVJfTkFNRSAoU1lNQk9MX1ZBTFVFIChzeW0pKSk7CisJICAgIGJyZWFrOworCSAgY2FzZSBMT0NfQVJHOgorCSAgY2FzZSBMT0NfTE9DQUxfQVJHOgorCSAgICBwcmludGZfZmlsdGVyZWQgKCJhbiBhcmd1bWVudCBhdCBzdGFjay9mcmFtZSBvZmZzZXQgJWxkIiwKKwkJCSAgICAgU1lNQk9MX1ZBTFVFIChzeW0pKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIExPQ19MT0NBTDoKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgiYSBsb2NhbCB2YXJpYWJsZSBhdCBmcmFtZSBvZmZzZXQgJWxkIiwKKwkJCSAgICAgU1lNQk9MX1ZBTFVFIChzeW0pKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIExPQ19SRUZfQVJHOgorCSAgICBwcmludGZfZmlsdGVyZWQgKCJhIHJlZmVyZW5jZSBhcmd1bWVudCBhdCBvZmZzZXQgJWxkIiwKKwkJCSAgICAgU1lNQk9MX1ZBTFVFIChzeW0pKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIExPQ19SRUdQQVJNOgorCSAgICBwcmludGZfZmlsdGVyZWQgKCJhbiBhcmd1bWVudCBpbiByZWdpc3RlciAkJXMiLAorCQkJICAgICBSRUdJU1RFUl9OQU1FIChTWU1CT0xfVkFMVUUgKHN5bSkpKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIExPQ19SRUdQQVJNX0FERFI6CisJICAgIHByaW50Zl9maWx0ZXJlZCAoInRoZSBhZGRyZXNzIG9mIGFuIGFyZ3VtZW50LCBpbiByZWdpc3RlciAkJXMiLAorCQkJICAgICBSRUdJU1RFUl9OQU1FIChTWU1CT0xfVkFMVUUgKHN5bSkpKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIExPQ19UWVBFREVGOgorCSAgICBwcmludGZfZmlsdGVyZWQgKCJhIHR5cGVkZWYuXG4iKTsKKwkgICAgY29udGludWU7CisJICBjYXNlIExPQ19MQUJFTDoKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgiYSBsYWJlbCBhdCBhZGRyZXNzICIpOworCSAgICBwcmludF9hZGRyZXNzX251bWVyaWMgKFNZTUJPTF9WQUxVRV9BRERSRVNTIChzeW0pLCAxLCBnZGJfc3Rkb3V0KTsKKwkgICAgYnJlYWs7CisJICBjYXNlIExPQ19CTE9DSzoKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgiYSBmdW5jdGlvbiBhdCBhZGRyZXNzICIpOworCSAgICBwcmludF9hZGRyZXNzX251bWVyaWMgKEJMT0NLX1NUQVJUIChTWU1CT0xfQkxPQ0tfVkFMVUUgKHN5bSkpLCAxLAorCQkJCSAgIGdkYl9zdGRvdXQpOworCSAgICBicmVhazsKKwkgIGNhc2UgTE9DX0JBU0VSRUc6CisJICAgIHByaW50Zl9maWx0ZXJlZCAoImEgdmFyaWFibGUgYXQgb2Zmc2V0ICVkIGZyb20gcmVnaXN0ZXIgJCVzIiwKKwkJCSAgICAgU1lNQk9MX1ZBTFVFIChzeW0pLAorCQkJICAgICBSRUdJU1RFUl9OQU1FICAoU1lNQk9MX0JBU0VSRUcgKHN5bSkpKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIExPQ19CQVNFUkVHX0FSRzoKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgiYW4gYXJndW1lbnQgYXQgb2Zmc2V0ICVkIGZyb20gcmVnaXN0ZXIgJCVzIiwKKwkJCSAgICAgU1lNQk9MX1ZBTFVFIChzeW0pLAorCQkJICAgICBSRUdJU1RFUl9OQU1FICAoU1lNQk9MX0JBU0VSRUcgKHN5bSkpKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIExPQ19VTlJFU09MVkVEOgorCSAgICBtc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sIChTWU1CT0xfTkFNRSAoc3ltKSwgTlVMTCwgTlVMTCk7CisJICAgIGlmIChtc3ltID09IE5VTEwpCisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiVW5yZXNvbHZlZCBTdGF0aWMiKTsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJcHJpbnRmX2ZpbHRlcmVkICgic3RhdGljIHN0b3JhZ2UgYXQgYWRkcmVzcyAiKTsKKwkJcHJpbnRfYWRkcmVzc19udW1lcmljIChTWU1CT0xfVkFMVUVfQUREUkVTUyAobXN5bSksIDEsIAorCQkJCSAgICAgICBnZGJfc3Rkb3V0KTsKKwkgICAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSBMT0NfT1BUSU1JWkVEX09VVDoKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgib3B0aW1pemVkIG91dC5cbiIpOworCSAgICBjb250aW51ZTsKKwkgIH0KKwkgIGlmIChTWU1CT0xfVFlQRSAoc3ltKSkKKwkgICAgcHJpbnRmX2ZpbHRlcmVkICgiLCBsZW5ndGggJWQuXG4iLCAKKwkJCSAgICAgVFlQRV9MRU5HVEggKGNoZWNrX3R5cGVkZWYgKFNZTUJPTF9UWVBFIChzeW0pKSkpOworCX0KKyAgICAgIGlmIChCTE9DS19GVU5DVElPTiAoYmxvY2spKQorCWJyZWFrOworICAgICAgZWxzZQorCWJsb2NrID0gQkxPQ0tfU1VQRVJCTE9DSyAoYmxvY2spOworICAgIH0KKyAgaWYgKGNvdW50IDw9IDApCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiU2NvcGUgZm9yICVzIGNvbnRhaW5zIG5vIGxvY2FscyBvciBhcmd1bWVudHMuXG4iLAorCQkgICAgIHNhdmVfYXJncyk7Cit9CisKKy8qIHdvcmtlciBmdW5jdGlvbiAoY2xlYW51cCkgKi8KK3N0YXRpYyB2b2lkCityZXBsYWNlX2NvbW1hIChjb21tYSkKKyAgICAgY2hhciAqY29tbWE7Cit7CisgICpjb21tYSA9ICcsJzsKK30KKworLyogdGR1bXAgY29tbWFuZCAqLworc3RhdGljIHZvaWQKK3RyYWNlX2R1bXBfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgc3RydWN0IHRyYWNlcG9pbnQgICp0OworICBzdHJ1Y3QgYWN0aW9uX2xpbmUgKmFjdGlvbjsKKyAgY2hhciAgICAgICAgICAgICAgICphY3Rpb25fZXhwLCAqbmV4dF9jb21tYTsKKyAgc3RydWN0IGNsZWFudXAgICAgICpvbGRfY2xlYW51cHM7CisgIGludCAgICAgICAgICAgICAgICAgc3RlcHBpbmdfYWN0aW9ucyA9IDA7CisgIGludCAgICAgICAgICAgICAgICAgc3RlcHBpbmdfZnJhbWUgICA9IDA7CisKKyAgaWYgKCF0YXJnZXRfaXNfcmVtb3RlICgpKQorICAgIHsKKyAgICAgIGVycm9yICgiVHJhY2UgY2FuIG9ubHkgYmUgcnVuIG9uIHJlbW90ZSB0YXJnZXRzLiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAodHJhY2Vwb2ludF9udW1iZXIgPT0gLTEpCisgICAgeworICAgICAgd2FybmluZyAoIk5vIGN1cnJlbnQgdHJhY2UgZnJhbWUuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIEFMTF9UUkFDRVBPSU5UUyAodCkKKyAgICBpZiAodC0+bnVtYmVyID09IHRyYWNlcG9pbnRfbnVtYmVyKQorICAgICAgYnJlYWs7CisKKyAgaWYgKHQgPT0gTlVMTCkKKyAgICBlcnJvciAoIk5vIGtub3duIHRyYWNlcG9pbnQgbWF0Y2hlcyAnY3VycmVudCcgdHJhY2Vwb2ludCAjJWQuIiwgCisJICAgdHJhY2Vwb2ludF9udW1iZXIpOworCisgIG9sZF9jbGVhbnVwcyA9IG1ha2VfY2xlYW51cCAobnVsbF9jbGVhbnVwLCBOVUxMKTsKKworICBwcmludGZfZmlsdGVyZWQgKCJEYXRhIGNvbGxlY3RlZCBhdCB0cmFjZXBvaW50ICVkLCB0cmFjZSBmcmFtZSAlZDpcbiIsIAorCQkgICB0cmFjZXBvaW50X251bWJlciwgdHJhY2VmcmFtZV9udW1iZXIpOworCisgIC8qIFRoZSBjdXJyZW50IGZyYW1lIGlzIGEgdHJhcCBmcmFtZSBpZiB0aGUgZnJhbWUgUEMgaXMgZXF1YWwKKyAgICAgdG8gdGhlIHRyYWNlcG9pbnQgUEMuICBJZiBub3QsIHRoZW4gdGhlIGN1cnJlbnQgZnJhbWUgd2FzCisgICAgIGNvbGxlY3RlZCBkdXJpbmcgc2luZ2xlLXN0ZXBwaW5nLiAgKi8KKworICBzdGVwcGluZ19mcmFtZSA9ICh0LT5hZGRyZXNzICE9IHJlYWRfcGMoKSk7CisKKyAgZm9yIChhY3Rpb24gPSB0LT5hY3Rpb25zOyBhY3Rpb247IGFjdGlvbiA9IGFjdGlvbi0+bmV4dCkKKyAgICB7CisgICAgICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqY21kOworCisgICAgICBRVUlUOwkJCQkvKiBhbGxvdyB1c2VyIHRvIGJhaWwgb3V0IHdpdGggXkMgKi8KKyAgICAgIGFjdGlvbl9leHAgPSBhY3Rpb24tPmFjdGlvbjsKKyAgICAgIHdoaWxlIChpc3NwYWNlICgqYWN0aW9uX2V4cCkpCisJYWN0aW9uX2V4cCsrOworCisgICAgICAvKiBUaGUgY29sbGVjdGlvbiBhY3Rpb25zIHRvIGJlIGRvbmUgd2hpbGUgc3RlcHBpbmcgYXJlCisJIGJyYWNrZXRlZCBieSB0aGUgY29tbWFuZHMgIndoaWxlLXN0ZXBwaW5nIiBhbmQgImVuZCIuICAqLworCisgICAgICBpZiAoKmFjdGlvbl9leHAgPT0gJyMnKQkvKiBjb21tZW50IGxpbmUgKi8KKwljb250aW51ZTsKKworICAgICAgY21kID0gbG9va3VwX2NtZCAoJmFjdGlvbl9leHAsIGNtZGxpc3QsICIiLCAtMSwgMSk7CisgICAgICBpZiAoY21kID09IDApCisJZXJyb3IgKCJCYWQgYWN0aW9uIGxpc3QgaXRlbTogJXMiLCBhY3Rpb25fZXhwKTsKKworICAgICAgaWYgKGNtZC0+ZnVuY3Rpb24uY2Z1bmMgPT0gd2hpbGVfc3RlcHBpbmdfcHNldWRvY29tbWFuZCkKKwlzdGVwcGluZ19hY3Rpb25zID0gMTsKKyAgICAgIGVsc2UgaWYgKGNtZC0+ZnVuY3Rpb24uY2Z1bmMgPT0gZW5kX2FjdGlvbnNfcHNldWRvY29tbWFuZCkKKwlzdGVwcGluZ19hY3Rpb25zID0gMDsKKyAgICAgIGVsc2UgaWYgKGNtZC0+ZnVuY3Rpb24uY2Z1bmMgPT0gY29sbGVjdF9wc2V1ZG9jb21tYW5kKQorCXsKKwkgIC8qIERpc3BsYXkgdGhlIGNvbGxlY3RlZCBkYXRhLgorCSAgICAgRm9yIHRoZSB0cmFwIGZyYW1lLCBkaXNwbGF5IG9ubHkgd2hhdCB3YXMgY29sbGVjdGVkIGF0IHRoZSB0cmFwLgorCSAgICAgTGlrZXdpc2UgZm9yIHN0ZXBwaW5nIGZyYW1lcywgZGlzcGxheSBvbmx5IHdoYXQgd2FzIGNvbGxlY3RlZAorCSAgICAgd2hpbGUgc3RlcHBpbmcuICBUaGlzIG1lYW5zIHRoYXQgdGhlIHR3byBib29sZWFuIHZhcmlhYmxlcywKKwkgICAgIFNURVBQSU5HX0ZSQU1FIGFuZCBTVEVQUElOR19BQ1RJT05TIHNob3VsZCBiZSBlcXVhbC4gICovCisJICBpZiAoc3RlcHBpbmdfZnJhbWUgPT0gc3RlcHBpbmdfYWN0aW9ucykKKwkgICAgeworCSAgICAgIGRvIHsgLyogcmVwZWF0IG92ZXIgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCAqLworCQlRVUlUOwkJLyogYWxsb3cgdXNlciB0byBiYWlsIG91dCB3aXRoIF5DICovCisJCWlmICgqYWN0aW9uX2V4cCA9PSAnLCcpCisJCSAgYWN0aW9uX2V4cCsrOworCQl3aGlsZSAoaXNzcGFjZSAoKmFjdGlvbl9leHApKQorCQkgIGFjdGlvbl9leHArKzsKKworCQluZXh0X2NvbW1hID0gc3RyY2hyIChhY3Rpb25fZXhwLCAnLCcpOworCisJCWlmICAgICAgKDAgPT0gc3RybmNhc2VjbXAgKGFjdGlvbl9leHAsICIkcmVnIiwgNCkpCisJCSAgcmVnaXN0ZXJzX2luZm8gKE5VTEwsIGZyb21fdHR5KTsKKwkJZWxzZSBpZiAoMCA9PSBzdHJuY2FzZWNtcCAoYWN0aW9uX2V4cCwgIiRsb2MiLCA0KSkKKwkJICBsb2NhbHNfaW5mbyAoTlVMTCwgZnJvbV90dHkpOworCQllbHNlIGlmICgwID09IHN0cm5jYXNlY21wIChhY3Rpb25fZXhwLCAiJGFyZyIsIDQpKQorCQkgIGFyZ3NfaW5mbyAoTlVMTCwgZnJvbV90dHkpOworCQllbHNlCisJCSAgeyAvKiB2YXJpYWJsZSAqLworCQkgICAgaWYgKG5leHRfY29tbWEpCisJCSAgICAgIHsKKwkJCW1ha2VfY2xlYW51cCAocmVwbGFjZV9jb21tYSwgbmV4dF9jb21tYSk7CisJCQkqbmV4dF9jb21tYSA9ICdcMCc7CisJCSAgICAgIH0KKwkJICAgIHByaW50Zl9maWx0ZXJlZCAoIiVzID0gIiwgYWN0aW9uX2V4cCk7CisJCSAgICBvdXRwdXRfY29tbWFuZCAoYWN0aW9uX2V4cCwgZnJvbV90dHkpOworCQkgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKwkJICB9CisJCWlmIChuZXh0X2NvbW1hKQorCQkgICpuZXh0X2NvbW1hID0gJywnOworCQlhY3Rpb25fZXhwID0gbmV4dF9jb21tYTsKKwkgICAgICB9IHdoaWxlIChhY3Rpb25fZXhwICYmICphY3Rpb25fZXhwID09ICcsJyk7CisJICAgIH0KKwl9CisgICAgfQorICBkaXNjYXJkX2NsZWFudXBzIChvbGRfY2xlYW51cHMpOworfQorCisvKiBDb252ZXJ0IHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSBtZW0gaW50byBoZXgsIHBsYWNpbmcgcmVzdWx0IGluIGJ1Zi4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGxhc3QgY2hhciBwdXQgaW4gYnVmIChudWxsKQorICogInN0b2xlbiIgZnJvbSBzcGFyYy1zdHViLmMKKyAqLworCitzdGF0aWMgY29uc3QgY2hhciBoZXhjaGFyc1tdPSIwMTIzNDU2Nzg5YWJjZGVmIjsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgorbWVtMmhleChtZW0sIGJ1ZiwgY291bnQpCisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbTsKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgICBpbnQgY291bnQ7Cit7CisgIHVuc2lnbmVkIGNoYXIgY2g7CisKKyAgd2hpbGUgKGNvdW50LS0gPiAwKQorICAgIHsKKyAgICAgIGNoID0gKm1lbSsrOworCisgICAgICAqYnVmKysgPSBoZXhjaGFyc1tjaCA+PiA0XTsKKyAgICAgICpidWYrKyA9IGhleGNoYXJzW2NoICYgMHhmXTsKKyAgICB9CisKKyAgKmJ1ZiA9IDA7CisKKyAgcmV0dXJuIGJ1ZjsKK30KKworaW50IGdldF90cmFjZWZyYW1lX251bWJlcigpCit7CisgcmV0dXJuIHRyYWNlZnJhbWVfbnVtYmVyOworfQorCisKKy8qIG1vZHVsZSBpbml0aWFsaXphdGlvbiAqLwordm9pZAorX2luaXRpYWxpemVfdHJhY2Vwb2ludCAoKQoreworICB0cmFjZXBvaW50X2NoYWluICA9IDA7CisgIHRyYWNlcG9pbnRfY291bnQgID0gMDsKKyAgdHJhY2VmcmFtZV9udW1iZXIgPSAtMTsKKyAgdHJhY2Vwb2ludF9udW1iZXIgPSAtMTsKKworICBzZXRfaW50ZXJuYWx2YXIgKGxvb2t1cF9pbnRlcm5hbHZhciAoInRwbnVtIiksIAorCQkgICB2YWx1ZV9mcm9tX2xvbmdlc3QgKGJ1aWx0aW5fdHlwZV9pbnQsIChMT05HRVNUKSAwKSk7CisgIHNldF9pbnRlcm5hbHZhciAobG9va3VwX2ludGVybmFsdmFyICgidHJhY2VfZnJhbWUiKSwgCisJCSAgIHZhbHVlX2Zyb21fbG9uZ2VzdCAoYnVpbHRpbl90eXBlX2ludCwgKExPTkdFU1QpIC0xKSk7CisKKyAgaWYgKHRyYWNlcG9pbnRfbGlzdC5saXN0ID09IE5VTEwpCisgICAgeworICAgICAgdHJhY2Vwb2ludF9saXN0Lmxpc3RzaXplID0gMTI4OworICAgICAgdHJhY2Vwb2ludF9saXN0Lmxpc3QgPSB4bWFsbG9jIAorCSh0cmFjZXBvaW50X2xpc3QubGlzdHNpemUgKiBzaXplb2YgKHN0cnVjdCBtZW1yYW5nZSkpOworICAgIH0KKyAgaWYgKHRyYWNlcG9pbnRfbGlzdC5hZXhwcl9saXN0ID09IE5VTEwpCisgICAgeworICAgICAgdHJhY2Vwb2ludF9saXN0LmFleHByX2xpc3RzaXplID0gMTI4OworICAgICAgdHJhY2Vwb2ludF9saXN0LmFleHByX2xpc3QgPSB4bWFsbG9jCisJKHRyYWNlcG9pbnRfbGlzdC5hZXhwcl9saXN0c2l6ZSAqIHNpemVvZiAoc3RydWN0IGFnZW50X2V4cHIgKikpOworICAgIH0KKworICBpZiAoc3RlcHBpbmdfbGlzdC5saXN0ID09IE5VTEwpCisgICAgeworICAgICAgc3RlcHBpbmdfbGlzdC5saXN0c2l6ZSA9IDEyODsKKyAgICAgIHN0ZXBwaW5nX2xpc3QubGlzdCA9IHhtYWxsb2MgCisJKHN0ZXBwaW5nX2xpc3QubGlzdHNpemUgKiBzaXplb2YgKHN0cnVjdCBtZW1yYW5nZSkpOworICAgIH0KKworICBpZiAoc3RlcHBpbmdfbGlzdC5hZXhwcl9saXN0ID09IE5VTEwpCisgICAgeworICAgICAgc3RlcHBpbmdfbGlzdC5hZXhwcl9saXN0c2l6ZSA9IDEyODsKKyAgICAgIHN0ZXBwaW5nX2xpc3QuYWV4cHJfbGlzdCA9IHhtYWxsb2MKKwkoc3RlcHBpbmdfbGlzdC5hZXhwcl9saXN0c2l6ZSAqIHNpemVvZiAoc3RydWN0IGFnZW50X2V4cHIgKikpOworICAgIH0KKworICBhZGRfaW5mbyAoInNjb3BlIiwgc2NvcGVfaW5mbywgCisJICAgICJMaXN0IHRoZSB2YXJpYWJsZXMgbG9jYWwgdG8gYSBzY29wZSIpOworCisgIGFkZF9jbWQgKCJ0cmFjZXBvaW50cyIsIGNsYXNzX3RyYWNlLCBOT19GVU5DVElPTiwgCisJICAgIlRyYWNpbmcgb2YgcHJvZ3JhbSBleGVjdXRpb24gd2l0aG91dCBzdG9wcGluZyB0aGUgcHJvZ3JhbS4iLCAKKwkgICAmY21kbGlzdCk7CisKKyAgYWRkX2luZm8gKCJ0cmFjZXBvaW50cyIsIHRyYWNlcG9pbnRzX2luZm8sCisJICAgICJTdGF0dXMgb2YgdHJhY2Vwb2ludHMsIG9yIHRyYWNlcG9pbnQgbnVtYmVyIE5VTUJFUi5cblwKK0NvbnZlbmllbmNlIHZhcmlhYmxlIFwiJHRwbnVtXCIgY29udGFpbnMgdGhlIG51bWJlciBvZiB0aGVcblwKK2xhc3QgdHJhY2Vwb2ludCBzZXQuIik7CisKKyAgYWRkX2luZm9fYWxpYXMgKCJ0cCIsICJ0cmFjZXBvaW50cyIsIDEpOworCisgIGFkZF9jb20gKCJzYXZlLXRyYWNlcG9pbnRzIiwgY2xhc3NfdHJhY2UsIHRyYWNlcG9pbnRfc2F2ZV9jb21tYW5kLCAKKwkgICAiU2F2ZSBjdXJyZW50IHRyYWNlcG9pbnQgZGVmaW5pdGlvbnMgYXMgYSBzY3JpcHQuXG5cCitVc2UgdGhlICdzb3VyY2UnIGNvbW1hbmQgaW4gYW5vdGhlciBkZWJ1ZyBzZXNzaW9uIHRvIHJlc3RvcmUgdGhlbS4iKTsKKworICBhZGRfY29tICgidGR1bXAiLCBjbGFzc190cmFjZSwgdHJhY2VfZHVtcF9jb21tYW5kLCAKKwkgICAiUHJpbnQgZXZlcnl0aGluZyBjb2xsZWN0ZWQgYXQgdGhlIGN1cnJlbnQgdHJhY2Vwb2ludC4iKTsKKworICBhZGRfcHJlZml4X2NtZCAoInRmaW5kIiwgIGNsYXNzX3RyYWNlLCB0cmFjZV9maW5kX2NvbW1hbmQsCisJCSAgIlNlbGVjdCBhIHRyYWNlIGZyYW1lO1xuXAorTm8gYXJndW1lbnQgbWVhbnMgZm9yd2FyZCBieSBvbmUgZnJhbWU7ICctJyBtZWFuZCBiYWNrd2FyZCBieSBvbmUgZnJhbWUuIiwKKwkJICAmdGZpbmRsaXN0LCAidGZpbmQgIiwgMSwgJmNtZGxpc3QpOworCisgIGFkZF9jbWQgKCJvdXRzaWRlIiwgY2xhc3NfdHJhY2UsIHRyYWNlX2ZpbmRfb3V0c2lkZV9jb21tYW5kLAorCSAgICJTZWxlY3QgYSB0cmFjZSBmcmFtZSB3aG9zZSBQQyBpcyBvdXRzaWRlIHRoZSBnaXZlbiBcCityYW5nZS5cblVzYWdlOiB0ZmluZCBvdXRzaWRlIGFkZHIxLCBhZGRyMiIsIAorCSAgICZ0ZmluZGxpc3QpOworCisgIGFkZF9jbWQgKCJyYW5nZSIsIGNsYXNzX3RyYWNlLCB0cmFjZV9maW5kX3JhbmdlX2NvbW1hbmQsCisJICAgIlNlbGVjdCBhIHRyYWNlIGZyYW1lIHdob3NlIFBDIGlzIGluIHRoZSBnaXZlbiByYW5nZS5cblwKK1VzYWdlOiB0ZmluZCByYW5nZSBhZGRyMSxhZGRyMiIsIAorCSAgICZ0ZmluZGxpc3QpOworCisgIGFkZF9jbWQgKCJsaW5lIiwgY2xhc3NfdHJhY2UsIHRyYWNlX2ZpbmRfbGluZV9jb21tYW5kLAorCSAgICJTZWxlY3QgYSB0cmFjZSBmcmFtZSBieSBzb3VyY2UgbGluZS5cblwKK0FyZ3VtZW50IGNhbiBiZSBhIGxpbmUgbnVtYmVyICh3aXRoIG9wdGlvbmFsIHNvdXJjZSBmaWxlKSwgXG5cCithIGZ1bmN0aW9uIG5hbWUsIG9yICcqJyBmb2xsb3dlZCBieSBhbiBhZGRyZXNzLlxuXAorRGVmYXVsdCBhcmd1bWVudCBpcyAndGhlIG5leHQgc291cmNlIGxpbmUgdGhhdCB3YXMgdHJhY2VkJy4iLAorCSAgICZ0ZmluZGxpc3QpOworCisgIGFkZF9jbWQgKCJ0cmFjZXBvaW50IiwgY2xhc3NfdHJhY2UsIHRyYWNlX2ZpbmRfdHJhY2Vwb2ludF9jb21tYW5kLAorCSAgICJTZWxlY3QgYSB0cmFjZSBmcmFtZSBieSB0cmFjZXBvaW50IG51bWJlci5cblwKK0RlZmF1bHQgaXMgdGhlIHRyYWNlcG9pbnQgZm9yIHRoZSBjdXJyZW50IHRyYWNlIGZyYW1lLiIsCisJICAgJnRmaW5kbGlzdCk7CisKKyAgYWRkX2NtZCAoInBjIiwgY2xhc3NfdHJhY2UsIHRyYWNlX2ZpbmRfcGNfY29tbWFuZCwKKwkgICAiU2VsZWN0IGEgdHJhY2UgZnJhbWUgYnkgUEMuXG5cCitEZWZhdWx0IGlzIHRoZSBjdXJyZW50IFBDLCBvciB0aGUgUEMgb2YgdGhlIGN1cnJlbnQgdHJhY2UgZnJhbWUuIiwKKwkgICAmdGZpbmRsaXN0KTsKKworICBhZGRfY21kICgiZW5kIiwgY2xhc3NfdHJhY2UsIHRyYWNlX2ZpbmRfZW5kX2NvbW1hbmQsCisJICAgIlN5bm9ueW0gZm9yICdub25lJy5cblwKK0RlLXNlbGVjdCBhbnkgdHJhY2UgZnJhbWUgYW5kIHJlc3VtZSAnbGl2ZScgZGVidWdnaW5nLiIsCisJICAgJnRmaW5kbGlzdCk7CisKKyAgYWRkX2NtZCAoIm5vbmUiLCBjbGFzc190cmFjZSwgdHJhY2VfZmluZF9ub25lX2NvbW1hbmQsCisJICAgIkRlLXNlbGVjdCBhbnkgdHJhY2UgZnJhbWUgYW5kIHJlc3VtZSAnbGl2ZScgZGVidWdnaW5nLiIsCisJICAgJnRmaW5kbGlzdCk7CisKKyAgYWRkX2NtZCAoInN0YXJ0IiwgY2xhc3NfdHJhY2UsIHRyYWNlX2ZpbmRfc3RhcnRfY29tbWFuZCwKKwkgICAiU2VsZWN0IHRoZSBmaXJzdCB0cmFjZSBmcmFtZSBpbiB0aGUgdHJhY2UgYnVmZmVyLiIsCisJICAgJnRmaW5kbGlzdCk7CisKKyAgYWRkX2NvbSAoInRzdGF0dXMiLCAgY2xhc3NfdHJhY2UsIHRyYWNlX3N0YXR1c19jb21tYW5kLAorCSAgICJEaXNwbGF5IHRoZSBzdGF0dXMgb2YgdGhlIGN1cnJlbnQgdHJhY2UgZGF0YSBjb2xsZWN0aW9uLiIpOworCisgIGFkZF9jb20gKCJ0c3RvcCIsICBjbGFzc190cmFjZSwgdHJhY2Vfc3RvcF9jb21tYW5kLAorCSAgICJTdG9wIHRyYWNlIGRhdGEgY29sbGVjdGlvbi4iKTsKKworICBhZGRfY29tICgidHN0YXJ0IiwgY2xhc3NfdHJhY2UsIHRyYWNlX3N0YXJ0X2NvbW1hbmQsCisJICAgIlN0YXJ0IHRyYWNlIGRhdGEgY29sbGVjdGlvbi4iKTsKKworICBhZGRfY29tICgicGFzc2NvdW50IiwgY2xhc3NfdHJhY2UsIHRyYWNlX3Bhc3NfY29tbWFuZCwgCisJICAgIlNldCB0aGUgcGFzc2NvdW50IGZvciBhIHRyYWNlcG9pbnQuXG5cCitUaGUgdHJhY2Ugd2lsbCBlbmQgd2hlbiB0aGUgdHJhY2Vwb2ludCBoYXMgYmVlbiBwYXNzZWQgJ2NvdW50JyB0aW1lcy5cblwKK1VzYWdlOiBwYXNzY291bnQgQ09VTlQgVFBOVU0sIHdoZXJlIFRQTlVNIG1heSBhbHNvIGJlIFwiYWxsXCI7XG5cCitpZiBUUE5VTSBpcyBvbWl0dGVkLCBwYXNzY291bnQgcmVmZXJzIHRvIHRoZSBsYXN0IHRyYWNlcG9pbnQgZGVmaW5lZC4iKTsKKworICBhZGRfY29tICgiZW5kIiwgY2xhc3NfdHJhY2UsIGVuZF9hY3Rpb25zX3BzZXVkb2NvbW1hbmQsCisJICAgIkVuZHMgYSBsaXN0IG9mIGNvbW1hbmRzIG9yIGFjdGlvbnMuXG5cCitTZXZlcmFsIEdEQiBjb21tYW5kcyBhbGxvdyB5b3UgdG8gZW50ZXIgYSBsaXN0IG9mIGNvbW1hbmRzIG9yIGFjdGlvbnMuXG5cCitFbnRlcmluZyBcImVuZFwiIG9uIGEgbGluZSBieSBpdHNlbGYgaXMgdGhlIG5vcm1hbCB3YXkgdG8gdGVybWluYXRlXG5cCitzdWNoIGEgbGlzdC5cblxuXAorTm90ZTogdGhlIFwiZW5kXCIgY29tbWFuZCBjYW5ub3QgYmUgdXNlZCBhdCB0aGUgZ2RiIHByb21wdC4iKTsKKworICBhZGRfY29tICgid2hpbGUtc3RlcHBpbmciLCBjbGFzc190cmFjZSwgd2hpbGVfc3RlcHBpbmdfcHNldWRvY29tbWFuZCwKKwkgICAiU3BlY2lmeSBzaW5nbGUtc3RlcHBpbmcgYmVoYXZpb3IgYXQgYSB0cmFjZXBvaW50LlxuXAorQXJndW1lbnQgaXMgbnVtYmVyIG9mIGluc3RydWN0aW9ucyB0byB0cmFjZSBpbiBzaW5nbGUtc3RlcCBtb2RlXG5cCitmb2xsb3dpbmcgdGhlIHRyYWNlcG9pbnQuICBUaGlzIGNvbW1hbmQgaXMgbm9ybWFsbHkgZm9sbG93ZWQgYnlcblwKK29uZSBvciBtb3JlIFwiY29sbGVjdFwiIGNvbW1hbmRzLCB0byBzcGVjaWZ5IHdoYXQgdG8gY29sbGVjdFxuXAord2hpbGUgc2luZ2xlLXN0ZXBwaW5nLlxuXG5cCitOb3RlOiB0aGlzIGNvbW1hbmQgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIHRyYWNlcG9pbnQgXCJhY3Rpb25zXCIgbGlzdC4iKTsKKworICBhZGRfY29tX2FsaWFzICgid3MiLCAgICAgICAgICJ3aGlsZS1zdGVwcGluZyIsIGNsYXNzX2FsaWFzLCAwKTsKKyAgYWRkX2NvbV9hbGlhcyAoInN0ZXBwaW5nIiwgICAid2hpbGUtc3RlcHBpbmciLCBjbGFzc19hbGlhcywgMCk7CisKKyAgYWRkX2NvbSAoImNvbGxlY3QiLCBjbGFzc190cmFjZSwgY29sbGVjdF9wc2V1ZG9jb21tYW5kLCAKKwkgICAiU3BlY2lmeSBvbmUgb3IgbW9yZSBkYXRhIGl0ZW1zIHRvIGJlIGNvbGxlY3RlZCBhdCBhIHRyYWNlcG9pbnQuXG5cCitBY2NlcHRzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgKG9uZSBvciBtb3JlKSBleHByZXNzaW9ucy4gIEdEQiB3aWxsXG5cCitjb2xsZWN0IGFsbCBkYXRhICh2YXJpYWJsZXMsIHJlZ2lzdGVycykgcmVmZXJlbmNlZCBieSB0aGF0IGV4cHJlc3Npb24uXG5cCitBbHNvIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBzcGVjaWFsIGFyZ3VtZW50czpcblwKKyAgICAkcmVncyAgIC0tIGFsbCByZWdpc3RlcnMuXG5cCisgICAgJGFyZ3MgICAtLSBhbGwgZnVuY3Rpb24gYXJndW1lbnRzLlxuXAorICAgICRsb2NhbHMgLS0gYWxsIHZhcmlhYmxlcyBsb2NhbCB0byB0aGUgYmxvY2svZnVuY3Rpb24gc2NvcGUuXG5cCitOb3RlOiB0aGlzIGNvbW1hbmQgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIHRyYWNlcG9pbnQgXCJhY3Rpb25zXCIgbGlzdC4iKTsKKworICBhZGRfY29tICgiYWN0aW9ucyIsIGNsYXNzX3RyYWNlLCB0cmFjZV9hY3Rpb25zX2NvbW1hbmQsCisJICAgIlNwZWNpZnkgdGhlIGFjdGlvbnMgdG8gYmUgdGFrZW4gYXQgYSB0cmFjZXBvaW50LlxuXAorVHJhY2Vwb2ludCBhY3Rpb25zIG1heSBpbmNsdWRlIGNvbGxlY3Rpbmcgb2Ygc3BlY2lmaWVkIGRhdGEsIFxuXAorc2luZ2xlLXN0ZXBwaW5nLCBvciBlbmFibGluZy9kaXNhYmxpbmcgb3RoZXIgdHJhY2Vwb2ludHMsIFxuXAorZGVwZW5kaW5nIG9uIHRhcmdldCdzIGNhcGFiaWxpdGllcy4iKTsKKworICBhZGRfY21kICgidHJhY2Vwb2ludHMiLCBjbGFzc190cmFjZSwgZGVsZXRlX3RyYWNlX2NvbW1hbmQsIAorCSAgICJEZWxldGUgc3BlY2lmaWVkIHRyYWNlcG9pbnRzLlxuXAorQXJndW1lbnRzIGFyZSB0cmFjZXBvaW50IG51bWJlcnMsIHNlcGFyYXRlZCBieSBzcGFjZXMuXG5cCitObyBhcmd1bWVudCBtZWFucyBkZWxldGUgYWxsIHRyYWNlcG9pbnRzLiIsCisJICAgJmRlbGV0ZWxpc3QpOworCisgIGFkZF9jbWQgKCJ0cmFjZXBvaW50cyIsIGNsYXNzX3RyYWNlLCBkaXNhYmxlX3RyYWNlX2NvbW1hbmQsIAorCSAgICJEaXNhYmxlIHNwZWNpZmllZCB0cmFjZXBvaW50cy5cblwKK0FyZ3VtZW50cyBhcmUgdHJhY2Vwb2ludCBudW1iZXJzLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLlxuXAorTm8gYXJndW1lbnQgbWVhbnMgZGlzYWJsZSBhbGwgdHJhY2Vwb2ludHMuIiwKKwkgICAmZGlzYWJsZWxpc3QpOworCisgIGFkZF9jbWQgKCJ0cmFjZXBvaW50cyIsIGNsYXNzX3RyYWNlLCBlbmFibGVfdHJhY2VfY29tbWFuZCwgCisJICAgIkVuYWJsZSBzcGVjaWZpZWQgdHJhY2Vwb2ludHMuXG5cCitBcmd1bWVudHMgYXJlIHRyYWNlcG9pbnQgbnVtYmVycywgc2VwYXJhdGVkIGJ5IHNwYWNlcy5cblwKK05vIGFyZ3VtZW50IG1lYW5zIGVuYWJsZSBhbGwgdHJhY2Vwb2ludHMuIiwKKwkgICAmZW5hYmxlbGlzdCk7CisKKyAgYWRkX2NvbSAoInRyYWNlIiwgY2xhc3NfdHJhY2UsIHRyYWNlX2NvbW1hbmQsCisJICAgIlNldCBhIHRyYWNlcG9pbnQgYXQgYSBzcGVjaWZpZWQgbGluZSBvciBmdW5jdGlvbiBvciBhZGRyZXNzLlxuXAorQXJndW1lbnQgbWF5IGJlIGEgbGluZSBudW1iZXIsIGZ1bmN0aW9uIG5hbWUsIG9yICcqJyBwbHVzIGFuIGFkZHJlc3MuXG5cCitGb3IgYSBsaW5lIG51bWJlciBvciBmdW5jdGlvbiwgdHJhY2UgYXQgdGhlIHN0YXJ0IG9mIGl0cyBjb2RlLlxuXAorSWYgYW4gYWRkcmVzcyBpcyBzcGVjaWZpZWQsIHRyYWNlIGF0IHRoYXQgZXhhY3QgYWRkcmVzcy5cblxuXAorRG8gXCJoZWxwIHRyYWNlcG9pbnRzXCIgZm9yIGluZm8gb24gb3RoZXIgdHJhY2Vwb2ludCBjb21tYW5kcy4iKTsKKworICBhZGRfY29tX2FsaWFzICgidHAiLCAgICJ0cmFjZSIsIGNsYXNzX2FsaWFzLCAwKTsKKyAgYWRkX2NvbV9hbGlhcyAoInRyIiwgICAidHJhY2UiLCBjbGFzc19hbGlhcywgMSk7CisgIGFkZF9jb21fYWxpYXMgKCJ0cmEiLCAgInRyYWNlIiwgY2xhc3NfYWxpYXMsIDEpOworICBhZGRfY29tX2FsaWFzICgidHJhYyIsICJ0cmFjZSIsIGNsYXNzX2FsaWFzLCAxKTsKK30KKwpkaWZmIC0tZ2l0IGEvZ2RiL3RyYWNlcG9pbnQuaCBiL2dkYi90cmFjZXBvaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxZWU4MgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90cmFjZXBvaW50LmgKQEAgLTAsMCArMSwxMzcgQEAKKy8qIERhdGEgc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggdHJhY2Vwb2ludHMgaW4gR0RCLgorICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCAoVFJBQ0VQT0lOVF9IKQorI2RlZmluZSBUUkFDRVBPSU5UX0ggMQorCisjaWYgIWRlZmluZWQgKEJSRUFLUE9JTlRfSCkKK2VudW0gZW5hYmxlIHsgZGlzYWJsZWQsIGVuYWJsZWQgfTsKKyNlbmRpZgorLyogVGhlIGRhdGEgc3RydWN0dXJlIGZvciBhbiBhY3Rpb246ICovCitzdHJ1Y3QgYWN0aW9uX2xpbmUgCit7CisgIHN0cnVjdCBhY3Rpb25fbGluZSAqbmV4dDsKKyAgY2hhciAqYWN0aW9uOworfTsKKworLyogVGhlIGRhdGEgc3RydWN0dXJlIGZvciBhIHRyYWNlcG9pbnQ6ICovCisKK3N0cnVjdCB0cmFjZXBvaW50Cit7CisgIHN0cnVjdCB0cmFjZXBvaW50ICpuZXh0OworCisgIGVudW0gZW5hYmxlIGVuYWJsZWQ7CisKKyNpZiAwCisgIC8qIFR5cGUgb2YgdHJhY2Vwb2ludCAoTVZTIEZJWE1FOiBuZWVkZWQ/KS4gKi8KKyAgZW51bSB0cHR5cGUgdHlwZTsKKworICAvKiBXaGF0IHRvIGRvIHdpdGggdGhpcyB0cmFjZXBvaW50IGFmdGVyIHdlIGhpdCBpdCBNVlMgRklYTUU6IG5lZWRlZD8pLiAqLworICBlbnVtIHRwZGlzcCBkaXNwb3NpdGlvbjsKKyNlbmRpZgorICAvKiBOdW1iZXIgYXNzaWduZWQgdG8gZGlzdGluZ3Vpc2ggdHJhY2Vwb2ludHMuICAqLworICBpbnQgbnVtYmVyOworCisgIC8qIEFkZHJlc3MgdG8gdHJhY2UgYXQsIG9yIE5VTEwgaWYgbm90IGFuIGluc3RydWN0aW9uIHRyYWNlcG9pbnQgKE1WUyA/KS4gKi8KKyAgQ09SRV9BRERSIGFkZHJlc3M7CisKKyAgLyogTGluZSBudW1iZXIgb2YgdGhpcyBhZGRyZXNzLiAgT25seSBtYXR0ZXJzIGlmIGFkZHJlc3MgaXMgbm9uLU5VTEwuICAqLworICBpbnQgbGluZV9udW1iZXI7CisKKyAgLyogU291cmNlIGZpbGUgbmFtZSBvZiB0aGlzIGFkZHJlc3MuICBPbmx5IG1hdHRlcnMgaWYgYWRkcmVzcyBpcyBub24tTlVMTC4gKi8KKyAgY2hhciAqc291cmNlX2ZpbGU7CisKKyAgLyogTnVtYmVyIG9mIHRpbWVzIHRoaXMgdHJhY2Vwb2ludCBzaG91bGQgc2luZ2xlLXN0ZXAgCisgICAgIGFuZCBjb2xsZWN0IGFkZGl0aW9uYWwgZGF0YSAqLworICBsb25nIHN0ZXBfY291bnQ7CisKKyAgLyogTnVtYmVyIG9mIHRpbWVzIHRoaXMgdHJhY2Vwb2ludCBzaG91bGQgYmUgaGl0IGJlZm9yZSBkaXNhYmxpbmcvZW5kaW5nLiAqLworICBpbnQgcGFzc19jb3VudDsKKyAgCisgIC8qIENoYWluIG9mIGFjdGlvbiBsaW5lcyB0byBleGVjdXRlIHdoZW4gdGhpcyB0cmFjZXBvaW50IGlzIGhpdC4gKi8KKyAgc3RydWN0IGFjdGlvbl9saW5lICphY3Rpb25zOworCisgIC8qIENvbmRpdGlvbmFsIChNVlMgPykuICAqLworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqY29uZDsKKworICAvKiBTdHJpbmcgd2UgdXNlZCB0byBzZXQgdGhlIHRyYWNlcG9pbnQgKG1hbGxvYydkKS4gIE9ubHkgbWF0dGVycyBpZgorICAgICBhZGRyZXNzIGlzIG5vbi1OVUxMLiAgKi8KKyAgY2hhciAqYWRkcl9zdHJpbmc7CisKKyAgLyogTGFuZ3VhZ2Ugd2UgdXNlZCB0byBzZXQgdGhlIHRyYWNlcG9pbnQuICAqLworICBlbnVtIGxhbmd1YWdlIGxhbmd1YWdlOworCisgIC8qIElucHV0IHJhZGl4IHdlIHVzZWQgdG8gc2V0IHRoZSB0cmFjZXBvaW50LiAgKi8KKyAgaW50IGlucHV0X3JhZGl4OworCisgIC8qIENvdW50IG9mIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyB0cmFjZXBvaW50IHdhcyB0YWtlbiwgZHVtcGVkCisgICAgIHdpdGggdGhlIGluZm8sIGJ1dCBub3QgdXNlZCBmb3IgYW55dGhpbmcgZWxzZS4gIFVzZWZ1bCBmb3IKKyAgICAgc2VlaW5nIGhvdyBtYW55IHRpbWVzIHlvdSBoaXQgYSB0cmFjZXBvaW50IHByaW9yIHRvIHRoZSBwcm9ncmFtCisgICAgIGFib3J0aW5nLCBzbyB5b3UgY2FuIGJhY2sgdXAgdG8ganVzdCBiZWZvcmUgdGhlIGFib3J0LiAgKi8KKyAgaW50IGhpdF9jb3VudDsKKworICAvKiBUaHJlYWQgbnVtYmVyIGZvciB0aHJlYWQtc3BlY2lmaWMgdHJhY2Vwb2ludCwgb3IgLTEgaWYgZG9uJ3QgY2FyZSAqLyAKKyAgaW50IHRocmVhZDsKKworICAvKiBCRkQgc2VjdGlvbiwgaW4gY2FzZSBvZiBvdmVybGF5czogCisgICAgIG5vLCBJIGRvbid0IGtub3cgaWYgdHJhY2Vwb2ludHMgYXJlIHJlYWxseSBnb25uYSB3b3JrIHdpdGggb3ZlcmxheXMuICAqLworICBhc2VjdGlvbiAqc2VjdGlvbjsKK307CisKK2VudW0gYWN0aW9ubGluZV90eXBlCit7CisgIEJBRExJTkUgID0gLTEsCisgIEdFTkVSSUMgID0gIDAsCisgIEVORCAgICAgID0gIDEsCisgIFNURVBQSU5HID0gIDIKK307CisKKworLyogVGhlIHRyYWNlcG9udCBjaGFpbiBvZiBhbGwgdHJhY2Vwb2ludHMgKi8KKworZXh0ZXJuIHN0cnVjdCB0cmFjZXBvaW50ICp0cmFjZXBvaW50X2NoYWluOworCitleHRlcm4gdW5zaWduZWQgbG9uZyB0cmFjZV9ydW5uaW5nX3A7CisKKy8qIEEgaG9vayB1c2VkIHRvIG5vdGlmeSB0aGUgVUkgb2YgdHJhY2Vwb2ludCBvcGVyYXRpb25zICovCisKK3ZvaWQgKCpjcmVhdGVfdHJhY2Vwb2ludF9ob29rKSBQQVJBTVMgKChzdHJ1Y3QgdHJhY2Vwb2ludCAqKSk7Cit2b2lkICgqZGVsZXRlX3RyYWNlcG9pbnRfaG9vaykgUEFSQU1TICgoc3RydWN0IHRyYWNlcG9pbnQgKikpOwordm9pZCAoKm1vZGlmeV90cmFjZXBvaW50X2hvb2spIFBBUkFNUyAoKHN0cnVjdCB0cmFjZXBvaW50ICopKTsKK3ZvaWQgKCp0cmFjZV9maW5kX2hvb2spIFBBUkFNUyAoKGNoYXIgKmFyZywgaW50IGZyb21fdHR5KSk7Cit2b2lkICgqdHJhY2Vfc3RhcnRfc3RvcF9ob29rKSBQQVJBTVMgKChpbnQgc3RhcnQsIGludCBmcm9tX3R0eSkpOworCitzdHJ1Y3QgdHJhY2Vwb2ludCAqZ2V0X3RyYWNlcG9pbnRfYnlfbnVtYmVyIFBBUkFNUyAoKGNoYXIgKiopKTsKK2ludCBnZXRfdHJhY2VmcmFtZV9udW1iZXIgUEFSQU1TICgodm9pZCkpOwordm9pZCAgZnJlZV9hY3Rpb25zIFBBUkFNUygoc3RydWN0IHRyYWNlcG9pbnQgKikpOworZW51bSBhY3Rpb25saW5lX3R5cGUgdmFsaWRhdGVfYWN0aW9ubGluZSBQQVJBTVMoKGNoYXIgKiosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmFjZXBvaW50ICopKTsKKworCisvKiBXYWxrIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50IG9yIGJsb2NrIHRocm91Z2ggYWxsIHRyYWNlcG9pbnRzLgorICAgQUxMX1RSQUNFUE9JTlRTX1NBRkUgZG9lcyBzbyBldmVuIGlmIHRoZSBzdGF0bWVudCBkZWxldGVzIHRoZSBjdXJyZW50CisgICBicmVha3BvaW50LiAgKi8KKworI2RlZmluZSBBTExfVFJBQ0VQT0lOVFModCkgIGZvciAodCA9IHRyYWNlcG9pbnRfY2hhaW47IHQ7IHQgPSB0LT5uZXh0KQorCisjZGVmaW5lIEFMTF9UUkFDRVBPSU5UU19TQUZFKHQsdG1wKQlcCisJZm9yICh0ID0gdHJhY2Vwb2ludF9jaGFpbjsJXAorCSAgICAgdCA/ICh0bXAgPSB0LT5uZXh0LCAxKSA6IDA7XAorCSAgICAgdCA9IHRtcCkKKyNlbmRpZiAvKiBUUkFDRVBPSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi90dWkvQ2hhbmdlTG9nIGIvZ2RiL3R1aS9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjMWJmNgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90dWkvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMTIxIEBACisxOTk5LTAxLTI2ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIHR1aS5oOiBJbmNsdWRlIHN0ZGFyZy5oIGluc3RlYWQgb2YgdmFyYXJncy5oIGlmIHdlJ3JlIG9uIGFuIElTTyBDaXNoCisJc3lzdGVtLgorCitUaHUgRGVjIDMxIDEyOjA4OjMyIDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgorCisJVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBieSBKaW0gQmxhbmR5IDxqaW1iQGN5Z251cy5jb20+LAorIAlFZGl0aCBFcHN0ZWluIDxlZXBzdGVpbkBjeWdudXMuY29tPiwgRWxlbmEgWmFubm9uaQorIAk8ZXphbm5vbmlAY3lnbnVzLmNvbT4gU3RhbiBTaGVicyA8c2hlYnNAY3lnbnVzLmNvbT4sIGFuZCBEYXZpZAorIAlUYXlsb3IgPHRheWxvckBjeWdudXMuY29tPiwgYXMgcGFydCBvZiB0aGUgcHJvamVjdCB0byBtZXJnZSBpbgorIAljaGFuZ2VzIG9yaWdpbmFsbHkgbWFkZSBieSBIUDsgSFAgZGlkIG5vdCBjcmVhdGUgQ2hhbmdlTG9nCisgCWVudHJpZXMuCisKKwkqIE1ha2VmaWxlLmluOiBOZXcgZmlsZTsgd2UncmUgbWVyZ2luZyBIUCdzIGNoYW5nZXMgaW50byBHREIsIGFuZAorIAl3ZSd2ZSBtb3ZlZCB0aGUgVFVJIGZpbGVzIGludG8gYSBzdWJkaXJlY3RvcnksIHNvIHdlIG5lZWQgYSBuZXcKKyAJTWFrZWZpbGUuCisKKwkqIHR1aS5jOgorCSNpbmNsdWRlIDx0ZXJtLmg+LCBpZiB3ZSBoYXZlIGl0LCB0byBnZXQgZGVjbGFyYXRpb25zIGZvcgorIAl0aGUgdGVybWNhcCBmdW5jdGlvbnMgb24gU29sYXJpcy4KKwkodGdvdG8pOiBBZGQgZXh0ZXJuYWwgSyZSIGRlY2xhcmF0aW9uIGZvciB0aGlzOyBTb2xhcmlzIGRvZXNuJ3QKKwlib3RoZXIgdG8gYWN0dWFsbHkgZGVjbGFyZSBpdCBpbiB0aGVpciBoZWFkZXIgZmlsZXMuCisJKF90dWlSZXNldCk6IElnbm9yZSB0aGUgI2RlZmluaXRpb24gb2YgVElPQ0dFVEMgaWYgVVNHIGlzIGRlZmluZWQ7CisgCXdlJ2QgcmF0aGVyIHVzZSB0aGUgVVNHIG1lY2hhbmlzbXMgdGhhbiB0aGUgQmVya2VsZXkgbWVjaGFuaXNtcworIAkoVElPQ0dFVEMgaXMgb25lIG9mIHRoZSBCZXJrZWxleSB0ZXJtaW5hbCBjb250cm9sIGlvY3RscykuCisgIAlBcG9sb2dpZXMgaWYgdGhpcyBjYXVzZXMgdHJvdWJsZSBsYXRlcjsgdGhpcyBzaG91bGQgYWxsIGJlIGhhbmRsZWQKKyAJYnkgYXV0b2NvbmYuLi4KKwkoc3RyY2F0X3RvX2J1Ziwgc3RyY2F0X3RvX2J1Zl93aXRoX2ZtdCk6IE5ldyBmdW5jdGlvbnMsIG1vdmVkIGhlcmUKKyAJZnJvbSAuLi91dGlscy5oLgorCSh0dWlGcmVlKTogcmVwbGFjZSBzYWZlX2ZyZWUgd2l0aCBmcmVlLgorCShzdHJjYXRfdG9fYnVmKTogbmV3IGZ1bmN0aW9uLCBjb3BpZWQgZnJvbSB1dGlscy5jLgorCSh0dWlJbml0KTogQWRkIGlnbm9yZWQgYGFyZ3YwJyBhcmd1bWVudCwgdG8gbWF0Y2ggdGhlIHR5cGUgdGhhdAorIAlpbml0X3VpX2hvb2sgZXhwZWN0czsgdXBkYXRlZCBkZWNsYXJhdGlvbi4gIENhbGwgdGhlCisgCWluaXRpYWxpemVfdHVpX2ZpbGVzIGZ1bmN0aW9uIGNvbnN0cnVjdGVkIGFib3ZlLiAgSW5pdGlhbGl6ZQorIAlmbHVzaF9ob29rIHRvIE5VTEwuCisJKHR1aUluaXRXaW5kb3dzKTogQ2FsbCB0dWlTZXRMb2NhdG9yQ29udGVudCwgdG8gZ2V0IHRoZSBmaXJzdAorIAllbGVtZW50IG9mIHRoZSBsb2NhdG9yIHdpbmRvdydzIGNvbnRlbnQgYWxsb2NhdGVkLiAgVGhpcyBzZWVtcworIAl3cm9uZywgYmVjYXVzZSBpdCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBzb21laG93IGluIEhQJ3MKKyAJc291cmNlcywgYW5kIHdlIHNob3VsZCBkbyBpdCB0aGUgc2FtZSB3YXkgbm93LiAgQnV0IHdlIGRvIGdldAorIAlmdXJ0aGVyIGJlZm9yZSBpdCBzZWdmYXVsdHMuICBbUG9zdHNjcmlwdDogSFAgZGlkbid0IGJvdGhlciB0bworIAlpbml0aWFsaXplIGl0OyB0aGV5IGNvbXBpbGUKKwkodmFfY2F0Y2hfZXJyb3JzLCB2Y2F0Y2hfZXJyb3JzKTogRnVuY3Rpb25zIG1vdmVkIGhlcmUgZnJvbQorIAkuLi91dGlscy5jIGluIEhQJ3Mgc291cmNlcy4gIFRoZXkncmUgbm90IHVzZWQgYW55d2hlcmUgZWxzZS4KKwkoeGRiX3N0eWxlKTogRGVsZXRlIHRoaXMgdmFyaWFibGUsIGFuZCByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8KKyAJaXQuICBJdCdzIGFsd2F5cyB0cnVlLgorCSh0dWlJbml0LCBfdHVpX3ZEbyk6IFJlZmVyZW5jZXMgcmVtb3ZlZC4KKworCSogdHVpLmg6ICBBZGQgcHJvdG90eXBlcy4KKwlEb24ndCAjaW5jbHVkZSAiZ2VuZGVmcy5oIjsgaXQncyBvbmx5IHVzZWQgaW4gdGhlIFRVSS4KKwlJbnRlZ3JhdGUgaXRzIGNvbnRlbnRzIGludG8gdGhpcyBmaWxlOgorCSNpbmNsdWRlIDxhbnNpZGVjbC5oPiBoZXJlLgorCShPcGFxdWUsIE9wYXF1ZUZ1bmNQdHIpOiBUeXBlZGVmcyBtb3ZlZCB0byBoZXJlLgorCSAgICAgCisJKiB0dWlDb21tYW5kLmM6ICNpbmNsdWRlICJkZWZzLmgiLCBzbyB3ZSBnZXQgdGhlIGFwcHJvcHJpYXRlCisJZGVmaW5pdGlvbiBvZiBHREJfRklMRS4KKworCSogdHVpRGF0YS5jCisgCShmcmVlV2luZG93KTogcmVwbGFjZSBzYWZlX2ZyZWUgd2l0aCBmcmVlLgorCSh0dWlfdmVyc2lvbik6IGRvbid0IGRlZmluZSBpdCBoZXJlOyBpdCdzIGRlZmluZWQgaW4gbWFpbi5jIG5vdy4KKworCSogdHVpRGlzYXNzZW0uYworCSh0dWlTZXREaXNhc3NlbUNvbnRlbnQpOiBDYWxsIHN0cmNhdF9hZGRyZXNzX251bWVyaWMgaW5zdGVhZCBvZgorIAlzdHJjYXRfYWRkcmVzcy4gIFNpbXBsaWZ5IHRoZSBjb250cm9sIHN0cnVjdHVyZS4gVXNlIHByZWRlZmluZWQKKyAJR0RCIGZ1bmN0aW9uIHRvIHByaW50IGFzbSBpbnN0IGFkZHJlc3MuICBVc2UgR0RCX0ZJTEUgdG8gY29sbGVjdAorIAlvdXRwdXQgaW50byBidWZmZXJzLgorCisJKiB0dWlJTy5jCisJKHRnb3RvKTogQWRkIGV4dGVybmFsIEsmUiBkZWNsYXJhdGlvbiBmb3IgdGhpcyBoZXJlIHRvby4KKwkodHVpR2V0YywgdHVpVGVybVNldHVwLCB0dWlUZXJtVW5zZXR1cCk6IFNhbWUuCisJKHR1aVB1dHNfdW5maWx0ZXJlZCk6IGNoYW5nZSBGSUxFIHRvIEdEQl9GSUxFLgorCSh0dWlfdHB1dHMpOiBmaXggcHJvdG90eXBlIGZvciAzcmQgYXJndW1lbnQuCisKKwkqIHR1aUlPLmggKHR1aVB1dHNfdW5maWx0ZXJlZCk6IGNoYW5nZSBkZWNsYXJhdGlvbi4KKyAgICAgCisJKiB0dWlMYXlvdXQuYyAKKwkoX3R1aVNldExheW91dFRvKTogZm9yIGRpc3BsYXlpbmcgcmVnaXN0ZXJzLCBob29rIHVwIHRoZSBIUCBjb2RlCisJdGhhdCBkZWNpZGVzIHdoaWNoIHJlZ2lzdGVycyB0byBkaXNwbGF5IChpLmUuIHNpbmdsZSBwcmVjaXNpb24KKwlmbG9hdCwgZG91YmxlIHByZWNpc2lvbiBmbG9hdCwgZ2VuZXJhbCwgc3BlY2lhbCkuIFByZXZpb3VzbHksCisJb25seSBoYW5kbGVkIFRVSV9HRU5FUkFMX1JFR1MuIE5vdyB0aGF0IHRoZSBjb2RlIGlzIGhvb2tlZCB1cCwKKyAJY29tcGlsaW5nIHdpdGggLXogcG9zZXMgYSBwcm9ibGVtLiBXaGVuIHRoZSBmaXJzdCBsYXlvdXQgY29tbWFuZAorCWlzICdsYXlvdXQgcmVncycsIGRhdGFXaW4tPmRldGFpbCBpcyBhIE5VTEwgcG9pbnRlciwgYW5kIGdkYgorCWNvcmUgZHVtcHMuCisKKwkqIHR1aUxheW91dC5jIChfdHVpU2V0TGF5b3V0VG8pOiByZXBsYWNlIHNhZmVfZnJlZSB3aXRoIGZyZWUuCisKKwkqIHR1aVJlZ3MuYyAjaW5jbHVkZSAiZGVmcy5oIiBlYXJsaWVyLCB0byBhdm9pZCBwcm9ibGVtcyBpbgorIAk8c3RkYXJnLmg+LiAgTm8gaWRlYSBleGFjdGx5IHdoYXQncyBjb25mbGljdGluZyB3aXRoIHdoYXQsIGJ1dCB0aGUKKyAJZXJyb3JzIHdlbnQgYXdheS4uLgorCShfdHVpUmVnaXN0ZXJGb3JtYXQpOiBDaGFuZ2Ugc28gdGhhdCBmdW5jdGlvbiBjcmVhdGVzIGEgR0RCX0ZJTEUKKyAJb2JqZWN0LCBjYWxscyBwYV9kb19zdHJjYXRfcmVnaXN0ZXJzX2luZm8sIGNvcGllcyB0aGUgcmVnaXN0ZXIKKyAJaW5mbyBpbnRvIGEgYnVmZmVyLCBhbmQgZGVhbGxvY2F0ZXMgdGhlIEdEQl9GSUxFIG9iamVjdC4gIFJlbW92ZQorIAlzb21lIGNvZGUgdGhhdCBpcyBub3QgZXhlY3V0ZWQuICBBbHNvLCBjYWxsIHRvCisgCXBhX2RvX3N0cmNhdF9yZWdpc3RlcnNfaW5mbyBoYXMgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIsCisgCXByZWNpc2lvbi4gIFRoaXMgY29kZSByZXF1aXJlcyBzb21lIG5ldyBwZXItdGFyZ2V0IGZ1bmN0aW9ucyB0aGF0CisgCXdlIGRvbid0IHdhbnQgdG8gbWVyZ2UuICBEeWtlIGl0IG91dCwgd2l0aCAjaWZkZWYKKyAJVFVJX0VYVEVOREVEX0ZPUk1BVFRFUlMuCisJKF90dWlTZXRTcGVjaWFsUmVnc0NvbnRlbnQpOiB0aGlzIGZ1bmN0aW9uIHdhcyBpZmRlZmVkIG91dC4KKyAgCUhvb2tlZCB0aGlzIHVwLgorCShfdHVpU2V0R2VuZXJhbEFuZFNwZWNpYWxSZWdzQ29udGVudCk6IHRoaXMgZnVuY3Rpb24gd2FzIGlmZGVmZWQKKyAJb3V0LiAgSG9va2VkIGl0IHVwLgorICAJKElTXzY0QklUKTogSnVzdCBkZWZpbmUgdGhpcyB0byBiZSB6ZXJvOyB3ZSdyZSBub3QgbWVyZ2luZyBpbiB0aGUKKyAJNjQtYml0IHN1cHBvcnQuCisJKHR1aVNob3dSZWdpc3RlcnMpOiBDb21tZW50IG91dCBhbGwgcmVmZXJlbmNlcyB0byB0aGUgInNwZWNpYWwiCisgCXJlZ3M7IHdlIGRvbid0IGhhdmUgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRoZSAic3BlY2lhbCIgYW5kCisgCSJub24tc3BlY2lhbCIgcmVncyBpbiBtb3N0IG9mIG91ciBtYWNoaW5lIGRlc2NyaXB0aW9ucy4gIFRoaXMgY29kZQorIAlpcyBQQS1zcGVjaWZpYyBpbiBvdGhlciB3YXlzIGFzIHdlbGwsIGFuZCBuZWVkcyB0byBiZSByZWRlc2lnbmVkCisgCXRvIGJlIHBvcnRhYmxlIHRvIG90aGVyIHByb2Nlc3NvcnMuCisKKwkqIHR1aVdpbi5jOiAjaW5jbHVkZSA8c3RyaW5nLmg+LCB0byBnZXQgYSBkZWNsYXJhdGlvbiBmb3IKKwlzdHJjaHIuCisgCisJKiB0dWkuYywgdHVpQ29tbWFuZC5jLCB0dWlEYXRhLmMsIHR1aURhdGFXaW4uYywgdHVpRGlzYXNzZW0uYywKKyAJdHVpR2VuZXJhbFdpbi5jLCB0dWlJTy5jLCB0dWlMYXlvdXQuYywgdHVpUmVncy5jLCB0dWlTb3VyY2UuYywKKyAJdHVpU291cmNlV2luLmMsIHR1aVN0YWNrLmMsIHR1aVdpbi5jOiBOZXcgZmlsZXMgKGZyb20gSFApLiAgQ2hhbmdlZAorIAlib29sIHRvIGludCB0aHJvdWdob3V0LiAgUmUtaW5kZW50ZWQsIEdOVSBzdHlsZS4KKworCSogdHVpLmgsIHR1aUNvbW1hbmQuaCwgdHVpRGF0YS5oLCB0dWlEYXRhV2luLmgsIHR1aURpc2Fzc2VtLmgsCisgCXR1aUdlbmVyYWxXaW4uaCwgdHVpSU8uaCwgdHVpTGF5b3V0LmgsIHR1aVJlZ3MuaCwgdHVpU291cmNlLmgsCisgCXR1aVNvdXJjZVdpbi5oLCB0dWlTdGFjay5oLCB0dWlXaW4uaDogbmV3IGZpbGVzIChmcm9tIEhQKS4KKyAgCUNoYW5nZWQgYm9vbCB0byBpbnQgdGhyb3VnaG91dC4KZGlmZiAtLWdpdCBhL2dkYi90dWkvTWFrZWZpbGUuaW4gYi9nZGIvdHVpL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NjQ2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdHVpL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTY4IEBACisjIENvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKK2FsbDogbGlidHVpLmEKKworc3JjZGlyPUBzcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACisKK1NIRUxMID0gQFNIRUxMQAorCitDQz1AQ0NACitDRkxBR1M9QENGTEFHU0AKK0FSPUBBUkAKK1JBTkxJQj1AUkFOTElCQAorCisjIEhvc3QgYW5kIHRhcmdldC1kZXBlbmRlbnQgbWFrZWZpbGUgZnJhZ21lbnRzIGNvbWUgaW4gaGVyZS4KK0Bob3N0X21ha2VmaWxlX2ZyYWdACitAdGFyZ2V0X21ha2VmaWxlX2ZyYWdACisjIEVuZCBvZiBob3N0IGFuZCB0YXJnZXQtZGVwZW5kZW50IG1ha2VmaWxlIGZyYWdtZW50cworCisjIFdoZXJlIGlzIG91ciAiaW5jbHVkZSIgZGlyZWN0b3J5PyAgVHlwaWNhbGx5ICQoc3JjZGlyKS8uLi9pbmNsdWRlLgorIyBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBoZWFkZXIgZmlsZSBkaXJlY3RvcnkgZm9yIHRoZSBsaWJyYXJ5CisjIHJvdXRpbmVzIGluIGxpYmliZXJ0eS4KK0lOQ0xVREVfRElSID0gICQoc3JjZGlyKS8uLi8uLi9pbmNsdWRlCitJTkNMVURFX0NGTEFHUyA9IC1JJChJTkNMVURFX0RJUikKKworIyBDb25maWd1cmVkIGJ5IHRoZSAtLXdpdGgtbW1hbGxvYyBvcHRpb24gdG8gY29uZmlndXJlLgorTU1BTExPQyA9IEBNTUFMTE9DQAorTU1BTExPQ19DRkxBR1MgPSBATU1BTExPQ19DRkxBR1NACisKKyMgV2hlcmUgaXMgdGhlIEJGRCBsaWJyYXJ5PyAgVHlwaWNhbGx5IGluIC4uL2JmZC4KK0JGRF9ESVIgPSAuLi8uLi9iZmQKK0JGRF9TUkMgPSAkKHNyY2RpcikvJChCRkRfRElSKQorQkZEX0NGTEFHUyA9IC1JJChCRkRfRElSKSAtSSQoQkZEX1NSQykKKworIyBXaGVyZSBpcyB0aGUgUkVBRExJTkUgbGlicmFyeT8gIFR5cGljYWxseSBpbiAuLi9yZWFkbGluZS4KK1JFQURMSU5FX0RJUiA9IC4uLy4uL3JlYWRsaW5lCitSRUFETElORV9TUkMgPSAkKHNyY2RpcikvJChSRUFETElORV9ESVIpCitSRUFETElORV9DRkxBR1MgPSAtSSQoUkVBRExJTkVfU1JDKQorCisjIFdoZXJlIGlzIHRoZSBJTlRMIGxpYnJhcnk/ICBUeXBpY2FsbHkgaW4gLi4vaW50bC4KK0lOVExfRElSID0gLi4vLi4vaW50bAorSU5UTF9TUkMgPSAkKHNyY2RpcikvJChJTlRMX0RJUikKK0lOVExfQ0ZMQUdTID0gLUkkKElOVExfRElSKSAtSSQoSU5UTF9TUkMpCisKKyMgV2hlcmUgaXMgdGhlIFRDTCBsaWJyYXJ5PyAgVHlwaWNhbGx5IGluIC4uL3RjbC4KK1RDTF9DRkxBR1MgPSBAVENMSERJUkAKKworIyBXaGVyZSBpcyB0aGUgVEsgbGlicmFyeT8gIFR5cGljYWxseSBpbiAuLi90ay4KK1RLX0NGTEFHUyA9IEBUS0hESVJAIEBUS19CVUlMRF9JTkNMVURFU0AKKworIyBXaGVyZSBpcyBJdGNsPyAgVHlwaWNhbGx5IGluIC4uL2l0Y2wuCitJVENMX0NGTEFHUyA9IEBJVENMSERJUkAKKworIyBXaGVyZSBpcyBUaXg/ICBUeXBpY2FsbHkgaW4gLi4vdGl4LgorVElYX0NGTEFHUyA9IEBUSVhIRElSQAorCitYMTFfQ0ZMQUdTID0gQFRLX1hJTkNMVURFU0AKKworRU5BQkxFX0lERT0gQEVOQUJMRV9JREVACisKK0dVSV9DRkxBR1NfWCA9IC1JJChzcmNkaXIpLy4uLy4uL2xpYmd1aS9zcmMKKworSURFX0NGTEFHU19YID0gLUkkKHNyY2RpcikvLi4vLi4vbGliaWRldGNsL3NyYyAtSSQoc3JjZGlyKS8uLi8uLi9saWJpZGUvc3JjIFwKKyAgYGlmIFsgeCIkKEVOQUJMRV9JREUpIiAhPSB4IF0gOyB0aGVuIFwKKyAgICBlY2hvIC1ESURFIC1JJChzcmNkaXIpLy4uLy4uL2lsdS9ydW50aW1lL21haW5sb29wO1wKKyAgZmlgCisKK0lERV9DRkxBR1M9JChHVUlfQ0ZMQUdTX1gpICQoSURFX0NGTEFHU19YKQorCitFTkFCTEVfQ0ZMQUdTPSBARU5BQkxFX0NGTEFHU0AKKworIyAtSS4gZm9yIGNvbmZpZyBmaWxlcy4KKyMgLUkkKHNyY2RpcikgZm9yIGdkYiBpbnRlcm5hbCBoZWFkZXJzIGFuZCBwb3NzaWJseSBmb3IgZ251LXJlZ2V4LmggYWxzby4KKyMgLUkkKHNyY2RpcikvY29uZmlnIGZvciBtb3JlIGdlbmVyaWMgY29uZmlnIGZpbGVzLgorCisjIEl0IGlzIGFsc28gcG9zc2libGUgdGhhdCB5b3Ugd2lsbCBuZWVkIHRvIGFkZCAtSS91c3IvaW5jbHVkZS9zeXMgaWYKKyMgeW91ciBzeXN0ZW0gZG9lc24ndCBoYXZlIGZjbnRsLmggaW4gL3Vzci9pbmNsdWRlICh3aGljaCBpcyB3aGVyZSBpdAorIyBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIFBvc2l4KS4KK0RFRlMgPSBAREVGU0AKK0dEQl9DRkxBR1MgPSAtSS4gLUkuLiAtSSQoc3JjZGlyKSAtSSQoc3JjZGlyKS8uLiAtSSQoc3JjZGlyKS8uLi9jb25maWcgJChERUZTKQorCisjIE17SCxUfV9DRkxBR1MsIGlmIGRlZmluZWQsIGhhdmUgaG9zdC0gYW5kIHRhcmdldC1kZXBlbmRlbnQgQ0ZMQUdTCisjIGZyb20gdGhlIGNvbmZpZyBkaXJlY3RvcnkuCitHTE9CQUxfQ0ZMQUdTID0gJChNVF9DRkxBR1MpICQoTUhfQ0ZMQUdTKQorI1BST0ZJTEVfQ0ZMQUdTID0gLXBnCisKKyMgSU5URVJOQUxfQ0ZMQUdTIGlzIHRoZSBhZ2dyZWdhdGUgb2YgYWxsIG90aGVyICpDRkxBR1MgbWFjcm9zLgorSU5URVJOQUxfQ0ZMQUdTID0gJChDRkxBR1MpICQoR0xPQkFMX0NGTEFHUykgJChQUk9GSUxFX0NGTEFHUykgXAorCSQoR0RCX0NGTEFHUykgJChSRUFETElORV9DRkxBR1MpICQoQkZEX0NGTEFHUykgXAorCSQoTU1BTExPQ19DRkxBR1MpICQoSU5DTFVERV9DRkxBR1MpICQoSU5UTF9DRkxBR1MpIFwKKwkkKEVOQUJMRV9DRkxBR1MpCisKK0hFQURFUlMgPSB0dWlJTy5oIHR1aURhdGEuaCB0dWlHZW5lcmFsV2luLmggdHVpTGF5b3V0LmggdHVpU3RhY2suaCBcCisJICB0dWlTb3VyY2UuaCB0dWlDb21tYW5kLmggdHVpV2luLmggdHVpRGlzYXNzZW0uaCBcCisJICB0dWlTb3VyY2VXaW4uaCB0dWlSZWdzLmggdHVpRGF0YVdpbi5oCisKK1NPVVJDRVMgPSB0dWkuYyB0dWlEYXRhLmMgdHVpU291cmNlLmMgdHVpU3RhY2suYyB0dWlJTy5jIFwKKwkgIHR1aUdlbmVyYWxXaW4uYyB0dWlMYXlvdXQuYyB0dWlXaW4uYyB0dWlDb21tYW5kLmMgXAorCSAgdHVpRGlzYXNzZW0uYyB0dWlTb3VyY2VXaW4uYyB0dWlSZWdzLmMgdHVpRGF0YVdpbi5jCisKK09CSkVDVFMgPSB0dWkubyB0dWlEYXRhLm8gdHVpU291cmNlLm8gdHVpU3RhY2subyB0dWlJTy5vIFwKKwkgIHR1aUdlbmVyYWxXaW4ubyB0dWlMYXlvdXQubyB0dWlXaW4ubyB0dWlDb21tYW5kLm8gXAorCSAgdHVpRGlzYXNzZW0ubyB0dWlTb3VyY2VXaW4ubyB0dWlSZWdzLm8gdHVpRGF0YVdpbi5vIFwKKwkgIHR1aUluaXQubworCisKKyMgUHJldmVudCBTdW4gbWFrZSBmcm9tIHB1dHRpbmcgaW4gdGhlIG1hY2hpbmUgdHlwZS4gIFNldHRpbmcKKyMgVEFSR0VUX0FSQ0ggdG8gbm90aGluZyB3b3JrcyBmb3IgU3VuT1MgMywgNC4wLCBidXQgbm90IGZvciA0LjEuCisuYy5vOgorCSQoQ0MpIC1jICQoSU5URVJOQUxfQ0ZMQUdTKSAkPAorLlNVRkZJWEVTOiAuY3BwCisuYy5jcHA6CisJJChDQykgLUUgJChJTlRFUk5BTF9DRkxBR1MpICQ8ID4gJEAKKworbGlidHVpLmE6ICQoT0JKRUNUUykKKwlybSAtZiBsaWJ0dWkuYQorCSQoQVIpIHJjIGxpYnR1aS5hICQoT0JKRUNUUykKKwkkKFJBTkxJQikgbGlidHVpLmEKKwordHVpLm86IHR1aS5jIHR1aS5oIHR1aURhdGEuaCB0dWlMYXlvdXQuaCB0dWlJTy5oIHR1aVJlZ3MuaCB0dWlXaW4uaAordHVpQ29tbWFuZC5vOiB0dWkuaCB0dWlEYXRhLmggdHVpV2luLmggdHVpSU8uaAordHVpRGF0YS5vOiB0dWkuaCB0dWlEYXRhLmgKK3R1aURhdGFXaW4ubzogdHVpLmggdHVpRGF0YS5oIHR1aVJlZ3MuaAordHVpRGlzYXNzZW0ubzogdHVpLmggdHVpRGF0YS5oIHR1aUxheW91dC5oIHR1aVNvdXJjZVdpbi5oIHR1aVN0YWNrLmgKK3R1aUdlbmVyYWxXaW4ubzogdHVpLmggdHVpRGF0YS5oIHR1aUdlbmVyYWxXaW4uaAordHVpSU8ubzogdHVpLmggdHVpRGF0YS5oIHR1aUlPLmggdHVpQ29tbWFuZC5oIHR1aVdpbi5oCit0dWlMYXlvdXQubzogdHVpLmggdHVpRGF0YS5oIHR1aUdlbmVyYWxXaW4uaCB0dWlTdGFjay5oIHR1aVJlZ3MuaCBcCisJdHVpRGlzYXNzZW0uaAordHVpUmVncy5vOiB0dWkuaCB0dWlEYXRhLmggdHVpTGF5b3V0LmggdHVpV2luLmgKK3R1aVNvdXJjZS5vOiB0dWkuaCB0dWlEYXRhLmggdHVpU3RhY2suaCB0dWlTb3VyY2VXaW4uaCB0dWlTb3VyY2UuaAordHVpU291cmNlV2luLm86IHR1aS5oIHR1aURhdGEuaCB0dWlTdGFjay5oIHR1aVNvdXJjZVdpbi5oIHR1aVNvdXJjZS5oIFwKKwl0dWlEaXNhc3NlbS5oCit0dWlTdGFjay5vOiB0dWkuaCB0dWlEYXRhLmggdHVpU3RhY2suaCB0dWlTb3VyY2VXaW4uaAordHVpV2luLm86IHR1aS5oIHR1aURhdGEuaCB0dWlHZW5lcmFsV2luLmggdHVpU3RhY2suaCB0dWlTb3VyY2VXaW4uaCBcCisJdHVpRGF0YVdpbi5oCisKK3R1aUluaXQubzogdHVpSW5pdC5jCit0dWlJbml0LmM6ICQoU09VUkNFUykKKwlAZWNobyBNYWtpbmcgdHVpSW5pdC5jCisJQHJtIC1mIGluaXQuYy10bXAKKwlAZWNobyAnLyogRG8gbm90IG1vZGlmeSB0aGlzIGZpbGUuICAqLycgPmluaXQuYy10bXAKKwlAZWNobyAnLyogSXQgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBNYWtlZmlsZS4JKi8nPj5pbml0LmMtdG1wCisJQGVjaG8gJyNpbmNsdWRlICJhbnNpZGVjbC5oIicgPj5pbml0LmMtdG1wCisJQGVjaG8gJ2V4dGVybiB2b2lkIGluaXRpYWxpemVfdHVpX2ZpbGVzIFBBUkFNUyAoKHZvaWQpKTsnID4+aW5pdC5jLXRtcAorCUBlY2hvICd2b2lkIGluaXRpYWxpemVfdHVpX2ZpbGVzIFBBUkFNUyAoKHZvaWQpKSB7JyA+PmluaXQuYy10bXAKKwlALSggY2QgJChzcmNkaXIpIDsgZ3JlcCAnXl9pbml0aWFsaXplX1thLXpfMC05QS1aXSogKignICQoU09VUkNFUykgKSAyPi9kZXYvbnVsbCBcCisJfCBzZWQgLWUgJ3MvXi4qOi8vJyAtZSAncy9eXChbYS16XzAtOUEtWl0qXCkuKi8gIHtleHRlcm4gdm9pZCBcMSBQQVJBTVMgKCh2b2lkKSk7IFwxICgpO30vJyA+PmluaXQuYy10bXAKKwlAZWNobyAnfScgPj5pbml0LmMtdG1wCisJQG12IGluaXQuYy10bXAgdHVpSW5pdC5jCisKK2NsZWFuOgorCXJtIC1mICoubyAqLmEKZGlmZiAtLWdpdCBhL2dkYi90dWkvdHVpLmMgYi9nZGIvdHVpL3R1aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NGRiNDQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdHVpL3R1aS5jCkBAIC0wLDAgKzEsODMwIEBACisvKgorKiogdHVpLmMKKyoqICAgICAgICAgR2VuZXJhbCBmdW5jdGlvbnMgZm9yIHRoZSBXREIgVFVJCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPGN1cnNlcy5oPgorI2lmZGVmIEhBVkVfVEVSTV9ICisjaW5jbHVkZSA8dGVybS5oPgorI2VuZGlmCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0ZXJtaW8uaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAidHVpLmgiCisjaW5jbHVkZSAidHVpRGF0YS5oIgorI2luY2x1ZGUgInR1aUxheW91dC5oIgorI2luY2x1ZGUgInR1aUlPLmgiCisjaW5jbHVkZSAidHVpUmVncy5oIgorI2luY2x1ZGUgInR1aVdpbi5oIgorCisvKiBUaGUgU29sYXJpcyBoZWFkZXIgZmlsZXMgc2VlbSB0byBwcm92aWRlIG5vIGRlY2xhcmF0aW9uIGZvciB0aGlzIGF0CisgICBhbGwgd2hlbiBfX1NURENfXyBpcyBkZWZpbmVkLiAgVGhpcyBzaG91bGRuJ3QgY29uZmxpY3Qgd2l0aAorICAgYW55dGhpbmcuICAqLworZXh0ZXJuIGNoYXIgKnRnb3RvICgpOworCisvKioqKioqKioqKioqKioqKioqKioqKioKKyoqIExvY2FsIERlZmluaXRpb25zCisqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEZJTEVERVMgICAgICAgICAyCisvKiBTb2xhcmlzIDxzeXMvdGVybWlvcy5oPiBkZWZpbmVzIENUUkwuICovCisjaWZuZGVmIENUUkwKKyNkZWZpbmUgQ1RSTCh4KSAgICAgICAgICh4ICYgfjAxNDApCisjZW5kaWYKKyNkZWZpbmUgQ0hLKHZhbCwgZGZ0KSAgICh2YWw8PTAgPyBkZnQgOiB2YWwpCisKKyNkZWZpbmUgVE9HR0xFX1VTQUdFICJVc2FnZTp0b2dnbGUgYnJlYWtwb2ludHMiCisjZGVmaW5lIFRVSV9UT0dHTEVfVVNBR0UgIlVzYWdlOlx0dG9nZ2xlICRmcmVnc1xuXHR0b2dnbGUgYnJlYWtwb2ludHMiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogTG9jYWwgc3RhdGljIGZvcndhcmQgZGVjbHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF90dWlSZXNldCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBfdG9nZ2xlX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIF90dWlfdlRvZ2dsZV9jb21tYW5kIFBBUkFNUyAoKHZhX2xpc3QpKTsKK3N0YXRpYyBPcGFxdWUgX3R1aV92RG8gUEFSQU1TICgoVHVpT3BhcXVlRnVuY1B0ciwgdmFfbGlzdCkpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqCisqKiBQdWJsaWMgRnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisqKiB0dWlJbml0KCkuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlJbml0IChjaGFyICphcmd2MCkKKyNlbHNlCit0dWlJbml0IChhcmd2MCkKKyAgICAgY2hhciAqYXJndjA7CisjZW5kaWYKK3sKKyAgZXh0ZXJuIHZvaWQgaW5pdF9wYWdlX2luZm8gKCk7CisgIGV4dGVybiB2b2lkIGluaXRpYWxpemVfdHVpX2ZpbGVzIFBBUkFNUyAoKHZvaWQpKTsKKworICBpbml0aWFsaXplX3R1aV9maWxlcyAoKTsKKyAgaW5pdGlhbGl6ZVN0YXRpY0RhdGEgKCk7CisgIGluaXRzY3IgKCk7CisgIHJlZnJlc2ggKCk7CisgIHNldFRlcm1IZWlnaHRUbyAoTElORVMpOworICBzZXRUZXJtV2lkdGhUbyAoQ09MUyk7CisgIHR1aUluaXRXaW5kb3dzICgpOworICB3cmVmcmVzaCAoY21kV2luLT5nZW5lcmljLmhhbmRsZSk7CisgIGluaXRfcGFnZV9pbmZvICgpOworICAvKiBEb24ndCBob29rIGRlYnVnZ2VyIG91dHB1dCBpZiBkb2luZyBjb21tYW5kLXdpbmRvdworICAgICAqIHRoZSBYREIgd2F5LiBIb3dldmVyLCBvbmUgdGhpbmcgd2UgZG8gd2FudCB0byBkbyBpbgorICAgICAqIFhEQiBzdHlsZSBpcyBzZXQgdXAgdGhlIHNjcm9sbGluZyByZWdpb24gdG8gYmUKKyAgICAgKiB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gKHR1aVRlcm1VbnNldHVwKCkpLgorICAgICAqLworICBmcHV0c191bmZpbHRlcmVkX2hvb2sgPSBOVUxMOworICBmbHVzaF9ob29rID0gTlVMTDsKKyAgcmxfaW5pdGlhbGl6ZSAoKTsJCS8qIG5lZWQgcmVhZGxpbmUgaW5pdGlhbGl6YXRpb24gdG8KKwkJICAgICAgKiBjcmVhdGUgdGVybWNhcCBzZXF1ZW5jZXMKKwkJICAgICAgKi8KKyAgdHVpVGVybVVuc2V0dXAgKDEsIGNtZFdpbi0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1cmNoKTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aUluaXQgKi8KKworCisvKgorKiogdHVpSW5pdFdpbmRvd3MoKS4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aUluaXRXaW5kb3dzICh2b2lkKQorI2Vsc2UKK3R1aUluaXRXaW5kb3dzICgpCisjZW5kaWYKK3sKKyAgVHVpV2luVHlwZSB0eXBlOworCisgIHR1aVNldExvY2F0b3JDb250ZW50ICgwKTsKKyAgc2hvd0xheW91dCAoU1JDX0NPTU1BTkQpOworICBrZXlwYWQgKGNtZFdpbi0+Z2VuZXJpYy5oYW5kbGUsIFRSVUUpOworICBlY2hvICgpOworICBjcm1vZGUgKCk7CisgIG5sICgpOworICB0dWlTZXRXaW5Gb2N1c1RvIChzcmNXaW4pOworCisgIHJldHVybjsKK30JCQkJLyogdHVpSW5pdFdpbmRvd3MgKi8KKworCisvKgorKiogdHVpQ2xlYW5VcCgpLgorKiogICAgICAgIEtpbGwgc2lnbmFsIGhhbmRsZXIgYW5kIGNsZWFudXAgdGVybWluYXRpb24gbWV0aG9kCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlSZXNldFNjcmVlbiAodm9pZCkKKyNlbHNlCit0dWlSZXNldFNjcmVlbiAoKQorI2VuZGlmCit7CisgIFR1aVdpblR5cGUgdHlwZSA9IFNSQ19XSU47CisKKyAga2V5cGFkIChjbWRXaW4tPmdlbmVyaWMuaGFuZGxlLCBGQUxTRSk7CisgIGZvciAoOyB0eXBlIDwgTUFYX01BSk9SX1dJTkRPV1M7IHR5cGUrKykKKyAgICB7CisgICAgICBpZiAobV93aW5QdHJOb3ROdWxsICh3aW5MaXN0W3R5cGVdKSAmJgorCSAgd2luTGlzdFt0eXBlXS0+Z2VuZXJpYy50eXBlICE9IFVOREVGSU5FRF9XSU4gJiYKKwkgICF3aW5MaXN0W3R5cGVdLT5nZW5lcmljLmlzVmlzaWJsZSkKKwl0dWlEZWxXaW5kb3cgKHdpbkxpc3RbdHlwZV0pOworICAgIH0KKyAgZW5kd2luICgpOworICBpbml0c2NyICgpOworICByZWZyZXNoICgpOworICBlY2hvICgpOworICBjcm1vZGUgKCk7CisgIG5sICgpOworCisgIHJldHVybjsKK30JCQkJLyogdHVpUmVzZXRTY3JlZW4gKi8KKworCisvKgorKiogdHVpQ2xlYW5VcCgpLgorKiogICAgICAgIEtpbGwgc2lnbmFsIGhhbmRsZXIgYW5kIGNsZWFudXAgdGVybWluYXRpb24gbWV0aG9kCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlDbGVhblVwICh2b2lkKQorI2Vsc2UKK3R1aUNsZWFuVXAgKCkKKyNlbmRpZgoreworICBjaGFyICpidWZmZXI7CisgIGV4dGVybiBjaGFyICp0ZXJtX2N1cnNvcl9tb3ZlOworCisgIHNpZ25hbCAoU0lHSU5ULCBTSUdfSUdOKTsKKyAgdHVpVGVybVNldHVwICgwKTsJCS8qIFJlc3RvcmUgc2Nyb2xsaW5nIHJlZ2lvbiB0byB3aG9sZSBzY3JlZW4gKi8KKyAga2V5cGFkIChjbWRXaW4tPmdlbmVyaWMuaGFuZGxlLCBGQUxTRSk7CisgIGZyZWVBbGxXaW5kb3dzICgpOworICBlbmR3aW4gKCk7CisgIGJ1ZmZlciA9IHRnb3RvICh0ZXJtX2N1cnNvcl9tb3ZlLCAwLCB0ZXJtSGVpZ2h0ICgpKTsKKyAgdHB1dHMgKGJ1ZmZlciwgMSwgcHV0Y2hhcik7CisgIF90dWlSZXNldCAoKTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aUNsZWFuVXAgKi8KKworCisvKgorKiogdHVpRXJyb3IoKS4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aUVycm9yICgKKwkgICBjaGFyICpzdHJpbmcsCisJICAgaW50IGV4aXRHZGIpCisjZWxzZQordHVpRXJyb3IgKHN0cmluZywgZXhpdEdkYikKKyAgICAgY2hhciAqc3RyaW5nOworICAgICBpbnQgZXhpdEdkYjsKKyNlbmRpZgoreworICBwdXRzX3VuZmlsdGVyZWQgKHN0cmluZyk7CisgIGlmIChleGl0R2RiKQorICAgIHsKKyAgICAgIHR1aUNsZWFuVXAgKCk7CisgICAgICBleGl0ICgtMSk7CisgICAgfQorCisgIHJldHVybjsKK30JCQkJLyogdHVpRXJyb3IgKi8KKworCisvKgorKiogdHVpX3ZFcnJvcigpCisqKiAgICAgICAgdHVpRXJyb3Igd2l0aCBhcmdzIGluIGEgdmFfbGlzdC4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aV92RXJyb3IgKAorCSAgICAgdmFfbGlzdCBhcmdzKQorI2Vsc2UKK3R1aV92RXJyb3IgKGFyZ3MpCisgICAgIHZhX2xpc3QgYXJnczsKKyNlbmRpZgoreworICBjaGFyICpzdHJpbmc7CisgIGludCBleGl0R2RiOworCisgIHN0cmluZyA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKKyAgZXhpdEdkYiA9IHZhX2FyZyAoYXJncywgaW50KTsKKworICB0dWlFcnJvciAoc3RyaW5nLCBleGl0R2RiKTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aV92RXJyb3IgKi8KKworCisvKgorKiogdHVpRnJlZSgpCisqKiAgICBXcmFwcGVyIG9uIHRvcCBvZiBmcmVlKCkgdG8gZW5zdXJlIHRoYXQgaW5wdXQgYWRkcmVzcyBpcyBncmVhdGVyIHRoYW4gMHgwCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlGcmVlICgKKwkgIGNoYXIgKnB0cikKKyNlbHNlCit0dWlGcmVlIChwdHIpCisgICAgIGNoYXIgKnB0cjsKKyNlbmRpZgoreworICBpZiAocHRyICE9IChjaGFyICopIE5VTEwpCisgICAgeworICAgICAgZnJlZSAocHRyKTsKKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlGcmVlICovCisKKworLyogdHVpR2V0TG93RGlzYXNzZW1ibHlBZGRyZXNzKCkuCisqKiAgICAgICAgRGV0ZXJtaW5lIHdoYXQgdGhlIGxvdyBhZGRyZXNzIHdpbGwgYmUgdG8gZGlzcGxheSBpbiB0aGUgVFVJJ3MKKyoqICAgICAgICBkaXNhc3NlbWJseSB3aW5kb3cuICBUaGlzIG1heSBvciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZQorKiogICAgICAgIGxvdyBhZGRyZXNzIGlucHV0LgorKi8KK09wYXF1ZQorI2lmZGVmIF9fU1REQ19fCit0dWlHZXRMb3dEaXNhc3NlbWJseUFkZHJlc3MgKAorCQkJICAgICAgT3BhcXVlIGxvdywKKwkJCSAgICAgIE9wYXF1ZSBwYykKKyNlbHNlCit0dWlHZXRMb3dEaXNhc3NlbWJseUFkZHJlc3MgKGxvdywgcGMpCisgICAgIE9wYXF1ZSBsb3c7CisgICAgIE9wYXF1ZSBwYzsKKyNlbmRpZgoreworICBpbnQgbGluZTsKKyAgT3BhcXVlIG5ld0xvdzsKKworICAvKgorICAgICoqIERldGVybWluZSB3aGVyZSB0byBzdGFydCB0aGUgZGlzYXNzZW1ibHkgc28gdGhhdCB0aGUgcGMgaXMgYWJvdXQgaW4gdGhlCisgICAgKiogbWlkZGxlIG9mIHRoZSB2aWV3cG9ydC4KKyAgICAqLworICBmb3IgKGxpbmUgPSAwLCBuZXdMb3cgPSBwYzsKKyAgICAgICAobmV3TG93ID4gbG93ICYmCisJbGluZSA8ICh0dWlEZWZhdWx0V2luVmlld3BvcnRIZWlnaHQgKERJU0FTU0VNX1dJTiwKKwkJCQkJICAgICBESVNBU1NFTV9DT01NQU5EKSAvIDIpKTspCisgICAgeworICAgICAgYmZkX2J5dGUgYnVmZmVyWzRdOworCisgICAgICBuZXdMb3cgLT0gc2l6ZW9mIChiZmRfZ2V0YjMyIChidWZmZXIpKTsKKyAgICAgIGxpbmUrKzsKKyAgICB9CisKKyAgcmV0dXJuIG5ld0xvdzsKK30JCQkJLyogdHVpR2V0TG93RGlzYXNzZW1ibHlBZGRyZXNzICovCisKKworLyogdHVpX3ZHZXRMb3dEaXNhc3NlbWJseUFkZHJlc3MoKS4KKyoqICAgICAgICBEZXRlcm1pbmUgd2hhdCB0aGUgbG93IGFkZHJlc3Mgd2lsbCBiZSB0byBkaXNwbGF5IGluIHRoZSBUVUkncworKiogICAgICAgIGRpc2Fzc2VtYmx5IHdpbmRvdyB3aXRoIGFyZ3MgaW4gYSB2YV9saXN0LgorKi8KK09wYXF1ZQorI2lmZGVmIF9fU1REQ19fCit0dWlfdkdldExvd0Rpc2Fzc2VtYmx5QWRkcmVzcyAoCisJCQkJdmFfbGlzdCBhcmdzKQorI2Vsc2UKK3R1aV92R2V0TG93RGlzYXNzZW1ibHlBZGRyZXNzIChhcmdzKQorICAgICB2YV9saXN0IGFyZ3M7CisjZW5kaWYKK3sKKyAgaW50IGxpbmU7CisgIE9wYXF1ZSBuZXdMb3c7CisgIE9wYXF1ZSBsb3c7CisgIE9wYXF1ZSBwYzsKKworICBsb3cgPSB2YV9hcmcgKGFyZ3MsIE9wYXF1ZSk7CisgIHBjID0gdmFfYXJnIChhcmdzLCBPcGFxdWUpOworCisgIHJldHVybiAodHVpR2V0TG93RGlzYXNzZW1ibHlBZGRyZXNzIChsb3csIHBjKSk7CisKK30JCQkJLyogdHVpX3ZHZXRMb3dEaXNhc3NlbWJseUFkZHJlc3MgKi8KKworCisvKgorKiogdHVpRG8oKS4KKyoqICAgICAgICBHZW5lcmFsIHB1cnBvc2UgZnVuY3Rpb24gdG8gZXhlY3V0ZSBhIHR1aSBmdW5jdGlvbi4gIFRyYW5zaXRpb25zCisqKiAgICAgICAgYmV0d2VlbiBjdXJzZXMgYW5kIHRoZSBhcmUgaGFuZGxlZCBoZXJlLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyoqICAgICAgICBieSBub24tdHVpIGdkYiBmdW5jdGlvbnMuCisqKgorKiogICAgICAgIEVycm9ycyBhcmUgY2F1Z2h0IGhlcmUuCisqKiAgICAgICAgSWYgdGhlcmUgaXMgbm8gZXJyb3IsIHRoZSB2YWx1ZSByZXR1cm5lZCBieSAnZnVuYycgaXMgcmV0dXJuZWQuCisqKiAgICAgICAgSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZW4gemVybyBpcyByZXR1cm5lZC4KKyoqCisqKiAgICAgICBNdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBpbW1lZGlhdGVfcXVpdCBpbiBlZmZlY3QgKGJhZCB0aGluZ3MgbWlnaHQKKyoqICAgICAgIGhhcHBlbiwgc2F5IHdlIGdvdCBhIHNpZ25hbCBpbiB0aGUgbWlkZGxlIG9mIGEgbWVtY3B5IHRvIHF1aXRfcmV0dXJuKS4KKyoqICAgICAgIFRoaXMgaXMgYW4gT0sgcmVzdHJpY3Rpb247IHdpdGggdmVyeSBmZXcgZXhjZXB0aW9ucyBpbW1lZGlhdGVfcXVpdCBjYW4KKyoqICAgICAgIGJlIHJlcGxhY2VkIGJ5IGp1ZGljaW91cyB1c2Ugb2YgUVVJVC4KKyovCitPcGFxdWUKKyNpZmRlZiBfX1NURENfXwordHVpRG8gKAorCVR1aU9wYXF1ZUZ1bmNQdHIgZnVuYywuLi4pCisjZWxzZQordHVpRG8gKGZ1bmMsIHZhX2FsaXN0KQorICAgICBUdWlPcGFxdWVGdW5jUHRyIGZ1bmM7CisgICAgIHZhX2RjbAorI2VuZGlmCit7CisgIGV4dGVybiBpbnQgdGVybWluYWxfaXNfb3VyczsKKworICBPcGFxdWUgcmV0ID0gKE9wYXF1ZSkgTlVMTDsKKworICAvKiBJdCBpcyBhbiBlcnJvciB0byBiZSB0dWlEbydpbmcgaWYgd2UKKyAgICAgKiBkb24ndCBvd24gdGhlIHRlcm1pbmFsLgorICAgICAqLworICBpZiAoIXRlcm1pbmFsX2lzX291cnMpCisgICAgcmV0dXJuIHJldDsKKworICBpZiAodHVpX3ZlcnNpb24pCisgICAgeworICAgICAgdmFfbGlzdCBhcmdzOworCisjaWZkZWYgX19TVERDX18KKyAgICAgIHZhX3N0YXJ0IChhcmdzLCBmdW5jKTsKKyNlbHNlCisgICAgICB2YV9zdGFydCAoYXJncyk7CisjZW5kaWYKKyAgICAgIHJldCA9IF90dWlfdkRvIChmdW5jLCBhcmdzKTsKKyAgICAgIHZhX2VuZCAoYXJncyk7CisgICAgfQorCisgIHJldHVybiByZXQ7Cit9CQkJCS8qIHR1aURvICovCisKKworLyoKKyoqIHR1aURvQW5kUmV0dXJuVG9Ub3AoKS4KKyoqICAgICAgICBHZW5lcmFsIHB1cnBvc2UgZnVuY3Rpb24gdG8gZXhlY3V0ZSBhIHR1aSBmdW5jdGlvbi4gIFRyYW5zaXRpb25zCisqKiAgICAgICAgYmV0d2VlbiBjdXJzZXMgYW5kIHRoZSBhcmUgaGFuZGxlZCBoZXJlLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyoqICAgICAgICBieSBub24tdHVpIGdkYiBmdW5jdGlvbnMgd2hvIHdpc2ggdG8gcmVzZXQgZ2RiIHRvIHRoZSB0b3AgbGV2ZWwuCisqKiAgICAgICAgQWZ0ZXIgdGhlIHR1aURvIGlzIHBlcmZvcm1lZCwgYSByZXR1cm4gdG8gdGhlIHRvcCBsZXZlbCBvY2N1cnMuCisqKgorKiogICAgICAgIEVycm9ycyBhcmUgY2F1Z2h0IGhlcmUuCisqKiAgICAgICAgSWYgdGhlcmUgaXMgbm8gZXJyb3IsIHRoZSB2YWx1ZSByZXR1cm5lZCBieSAnZnVuYycgaXMgcmV0dXJuZWQuCisqKiAgICAgICAgSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZW4gemVybyBpcyByZXR1cm5lZC4KKyoqCisqKiAgICAgICBNdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBpbW1lZGlhdGVfcXVpdCBpbiBlZmZlY3QgKGJhZCB0aGluZ3MgbWlnaHQKKyoqICAgICAgIGhhcHBlbiwgc2F5IHdlIGdvdCBhIHNpZ25hbCBpbiB0aGUgbWlkZGxlIG9mIGEgbWVtY3B5IHRvIHF1aXRfcmV0dXJuKS4KKyoqICAgICAgIFRoaXMgaXMgYW4gT0sgcmVzdHJpY3Rpb247IHdpdGggdmVyeSBmZXcgZXhjZXB0aW9ucyBpbW1lZGlhdGVfcXVpdCBjYW4KKyoqICAgICAgIGJlIHJlcGxhY2VkIGJ5IGp1ZGljaW91cyB1c2Ugb2YgUVVJVC4KKyoqCisqLworT3BhcXVlCisjaWZkZWYgX19TVERDX18KK3R1aURvQW5kUmV0dXJuVG9Ub3AgKAorCQkgICAgICBUdWlPcGFxdWVGdW5jUHRyIGZ1bmMsLi4uKQorI2Vsc2UKK3R1aURvQW5kUmV0dXJuVG9Ub3AgKGZ1bmMsIHZhX2FsaXN0KQorICAgICBUdWlPcGFxdWVGdW5jUHRyIGZ1bmM7CisgICAgIHZhX2RjbAorI2VuZGlmCit7CisgIGV4dGVybiBpbnQgdGVybWluYWxfaXNfb3VyczsKKworICBPcGFxdWUgcmV0ID0gKE9wYXF1ZSkgTlVMTDsKKworICAvKiBJdCBpcyBhbiBlcnJvciB0byBiZSB0dWlEbydpbmcgaWYgd2UKKyAgICAgKiBkb24ndCBvd24gdGhlIHRlcm1pbmFsLgorICAgICAqLworICBpZiAoIXRlcm1pbmFsX2lzX291cnMpCisgICAgcmV0dXJuIHJldDsKKworICBpZiAodHVpX3ZlcnNpb24pCisgICAgeworICAgICAgdmFfbGlzdCBhcmdzOworCisjaWZkZWYgX19TVERDX18KKyAgICAgIHZhX3N0YXJ0IChhcmdzLCBmdW5jKTsKKyNlbHNlCisgICAgICB2YV9zdGFydCAoYXJncyk7CisjZW5kaWYKKyAgICAgIHJldCA9IF90dWlfdkRvIChmdW5jLCBhcmdzKTsKKworICAgICAgLyogZm9yY2UgYSByZXR1cm4gdG8gdGhlIHRvcCBsZXZlbCAqLworICAgICAgcmV0dXJuX3RvX3RvcF9sZXZlbCAoUkVUVVJOX0VSUk9SKTsKKyAgICB9CisKKyAgcmV0dXJuIHJldDsKK30JCQkJLyogdHVpRG9BbmRSZXR1cm5Ub1RvcCAqLworCisKK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpX3ZTZWxlY3RTb3VyY2VTeW10YWIgKAorCQkJICB2YV9saXN0IGFyZ3MpCisjZWxzZQordHVpX3ZTZWxlY3RTb3VyY2VTeW10YWIgKGFyZ3MpCisgICAgIHZhX2xpc3QgYXJnczsKKyNlbmRpZgoreworICBzdHJ1Y3Qgc3ltdGFiICpzID0gdmFfYXJnIChhcmdzLCBzdHJ1Y3Qgc3ltdGFiICopOworCisgIHNlbGVjdF9zb3VyY2Vfc3ltdGFiIChzKTsKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlfdlNlbGVjdFNvdXJjZVN5bXRhYiAqLworCisKKy8qCisqKiBfaW5pdGlhbGl6ZV90dWkoKS4KKyoqICAgICAgRnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBnZGIgY29tbWFuZHMsIGZvciB0dWkgd2luZG93IG1hbmlwdWxhdGlvbi4KKyovCit2b2lkCitfaW5pdGlhbGl6ZV90dWkgKCkKK3sKKyNpZiAwCisgIGlmICh0dWlfdmVyc2lvbikKKyAgICB7CisgICAgICBhZGRfY29tICgidG9nZ2xlIiwgY2xhc3NfdHVpLCBfdG9nZ2xlX2NvbW1hbmQsCisJICAgICAgICJUb2dnbGUgVGVybWluYWwgVUkgRmVhdHVyZXNcblwKK1VzYWdlOiBUb2dnbGUgJGZyZWdzXG5cCitcdFRvZ2dsZXMgYmV0d2VlbiBzaW5nbGUgYW5kIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLlxuIik7CisgICAgfQorI2VuZGlmCisgIGNoYXIgKmhlbHBTdHI7CisKKyAgaWYgKHR1aV92ZXJzaW9uKQorICAgIGhlbHBTdHIgPSAiVG9nZ2xlIFNwZWNpZmllZCBGZWF0dXJlc1xuXAorVXNhZ2U6XHR0b2dnbGUgJGZyZWdzXG5cdHRvZ2dsZSBicmVha3BvaW50cyI7CisgIGVsc2UKKyAgICBoZWxwU3RyID0gIlRvZ2dsZSBTcGVjaWZpZWQgRmVhdHVyZXNcblVzYWdlOnRvZ2dsZSBicmVha3BvaW50cyI7CisgIGFkZF9hYmJyZXZfcHJlZml4X2NtZCAoInRvZ2dsZSIsCisJCQkgY2xhc3NfdHVpLAorCQkJIF90b2dnbGVfY29tbWFuZCwKKwkJCSBoZWxwU3RyLAorCQkJICZ0b2dnbGVsaXN0LAorCQkJICJ0b2dnbGUgIiwKKwkJCSAxLAorCQkJICZjbWRsaXN0KTsKK30JCQkJLyogX2luaXRpYWxpemVfdHVpKi8KKworCisvKgorKiogdmFfY2F0Y2hfZXJyb3JzKCkuCisqKiAgICAgICBHZW5lcmFsIHB1cnBvc2UgZnVuY3Rpb24gdG8gZXhlY3V0ZSBhIGZ1bmN0aW9uLCBjYXRjaGluZyBlcnJvcnMuCisqKiAgICAgICBJZiB0aGVyZSBpcyBubyBlcnJvciwgdGhlIHZhbHVlIHJldHVybmVkIGJ5ICdmdW5jJyBpcyByZXR1cm5lZC4KKyoqICAgICAgIElmIHRoZXJlIGlzIGVycm9yLCB0aGVuIHplcm8gaXMgcmV0dXJuZWQuCisqKiAgICAgICBOb3RlIHRoYXQgJ2Z1bmMnIG11c3QgdGFrZSBhIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QgYXMgd2VsbC4KKyoqCisqKiAgICAgICBNdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBpbW1lZGlhdGVfcXVpdCBpbiBlZmZlY3QgKGJhZCB0aGluZ3MgbWlnaHQKKyoqICAgICAgIGhhcHBlbiwgc2F5IHdlIGdvdCBhIHNpZ25hbCBpbiB0aGUgbWlkZGxlIG9mIGEgbWVtY3B5IHRvIHF1aXRfcmV0dXJuKS4KKyoqICAgICAgIFRoaXMgaXMgYW4gT0sgcmVzdHJpY3Rpb247IHdpdGggdmVyeSBmZXcgZXhjZXB0aW9ucyBpbW1lZGlhdGVfcXVpdCBjYW4KKyoqICAgICAgIGJlIHJlcGxhY2VkIGJ5IGp1ZGljaW91cyB1c2Ugb2YgUVVJVC4KKyovCitPcGFxdWUKKyNpZmRlZiBfX1NURENfXwordmFfY2F0Y2hfZXJyb3JzICgKKwkJICBUdWlPcGFxdWVGdW5jUHRyIGZ1bmMsCisJCSAgdmFfbGlzdCBhcmdzKQorI2Vsc2UKK3ZhX2NhdGNoX2Vycm9ycyAoZnVuYywgYXJncykKKyAgICAgVHVpT3BhcXVlRnVuY1B0ciBmdW5jOworICAgICB2YV9saXN0IGFyZ3M7CisjZW5kaWYKK3sKKyAgT3BhcXVlIHJldCA9IChPcGFxdWUpIE5VTEw7CisKKyAgLyoKKyAgKiogV2UgY291bGQgaGF2ZSB1c2VkIGNhdGNoX2Vycm9ycygpLCBidXQgaXQgZG9lc24ndCBoYW5kbGUgdmFyaWFibGUgYXJncy4KKyAgKiogQWxzbywgZm9yIHRoZSB0dWksIHdlIGFsd2F5cyB3YW50IHRvIGNhdGNoIGFsbCBlcnJvcnMsIHNvIHdlIGRvbid0CisgICoqIG5lZWQgdG8gcGFzcyBhIG1hc2ssIG9yIGFuIGVycm9yIHN0cmluZy4KKyAgKi8KKyAgam1wX2J1ZiBzYXZlZF9lcnJvcjsKKyAgam1wX2J1ZiBzYXZlZF9xdWl0OworICBqbXBfYnVmIHRtcF9qbXA7CisgIHN0cnVjdCBjbGVhbnVwICpzYXZlZF9jbGVhbnVwX2NoYWluOworICBjaGFyICpzYXZlZF9lcnJvcl9wcmVfcHJpbnQ7CisgIGNoYXIgKnNhdmVkX3F1aXRfcHJlX3ByaW50OworICBleHRlcm4gam1wX2J1ZiBlcnJvcl9yZXR1cm47CisgIGV4dGVybiBqbXBfYnVmIHF1aXRfcmV0dXJuOworCisgIHNhdmVkX2NsZWFudXBfY2hhaW4gPSBzYXZlX2NsZWFudXBzICgpOworICBzYXZlZF9lcnJvcl9wcmVfcHJpbnQgPSBlcnJvcl9wcmVfcHJpbnQ7CisgIHNhdmVkX3F1aXRfcHJlX3ByaW50ID0gcXVpdF9wcmVfcHJpbnQ7CisKKyAgbWVtY3B5ICgoY2hhciAqKSBzYXZlZF9lcnJvciwgKGNoYXIgKikgZXJyb3JfcmV0dXJuLCBzaXplb2YgKGptcF9idWYpKTsKKyAgZXJyb3JfcHJlX3ByaW50ID0gIiI7CisgIG1lbWNweSAoc2F2ZWRfcXVpdCwgcXVpdF9yZXR1cm4sIHNpemVvZiAoam1wX2J1ZikpOworICBxdWl0X3ByZV9wcmludCA9ICIiOworCisgIGlmIChzZXRqbXAgKHRtcF9qbXApID09IDApCisgICAgeworICAgICAgdmFfbGlzdCBhcmdMaXN0ID0gYXJnczsKKyAgICAgIG1lbWNweSAoZXJyb3JfcmV0dXJuLCB0bXBfam1wLCBzaXplb2YgKGptcF9idWYpKTsKKyAgICAgIG1lbWNweSAocXVpdF9yZXR1cm4sIHRtcF9qbXAsIHNpemVvZiAoam1wX2J1ZikpOworICAgICAgcmV0ID0gZnVuYyAoYXJnTGlzdCk7CisgICAgfQorICByZXN0b3JlX2NsZWFudXBzIChzYXZlZF9jbGVhbnVwX2NoYWluKTsKKyAgbWVtY3B5IChlcnJvcl9yZXR1cm4sIHNhdmVkX2Vycm9yLCBzaXplb2YgKGptcF9idWYpKTsKKyAgZXJyb3JfcHJlX3ByaW50ID0gc2F2ZWRfZXJyb3JfcHJlX3ByaW50OworICBtZW1jcHkgKHF1aXRfcmV0dXJuLCBzYXZlZF9xdWl0LCBzaXplb2YgKGptcF9idWYpKTsKKyAgcXVpdF9wcmVfcHJpbnQgPSBzYXZlZF9xdWl0X3ByZV9wcmludDsKKworICByZXR1cm4gcmV0OworfQorCisvKgorKiogdmNhdGNoX2Vycm9ycygpLgorKiogICAgICAgIENhdGNoIGVycm9ycyBvY2N1cnJpbmcgaW4gdHVpIG9yIG5vbiB0dWkgZnVuY3Rpb24sIGhhbmRsaW5nCisqKiAgICAgICAgdmFyaWFibGUgcGFyYW0gbGlzdHMuIE5vdGUgdGhhdCAnZnVuYycgbXVzdCB0YWtlIGEgdmFyaWFibGUKKyoqICAgICAgICBhcmd1bWVudCBsaXN0IGFzIHdlbGwuCisqLworT3BhcXVlCisjaWZkZWYgX19TVERDX18KK3ZjYXRjaF9lcnJvcnMgKAorCQlPcGFxdWVGdW5jUHRyIGZ1bmMsLi4uKQorI2Vsc2UKK3ZjYXRjaF9lcnJvcnMgKHZhX2FsaXN0KQorICAgICB2YV9kY2wKKy8qCit2Y2F0Y2hfZXJyb3JzKGZ1bmMsIHZhX2FsaXN0KQorICAgIE9wYXF1ZUZ1bmNQdHIgICAgZnVuYzsKKyAgICB2YV9kY2wKKyovCisjZW5kaWYKK3sKKyAgT3BhcXVlIHJldCA9IChPcGFxdWUpIE5VTEw7CisgIHZhX2xpc3QgYXJnczsKKyNpZmRlZiBfX1NURENfXworICB2YV9zdGFydCAoYXJncywgZnVuYyk7CisvKgorICAgIHZhX2FyZyhhcmdzLCBPcGFxdWVGdW5jUHRyKTsKKyovCisjZWxzZQorICBPcGFxdWVGdW5jUHRyIGZ1bmM7CisKKyAgdmFfc3RhcnQgKGFyZ3MpOworICBmdW5jID0gdmFfYXJnIChhcmdzLCBPcGFxdWVGdW5jUHRyKTsKKyNlbmRpZgorICByZXQgPSB2YV9jYXRjaF9lcnJvcnMgKGZ1bmMsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworCisgIHJldHVybiByZXQ7Cit9CisKKwordm9pZAorI2lmZGVmIF9fU1REQ19fCitzdHJjYXRfdG9fYnVmICgKKwkJY2hhciAqYnVmLAorCQlpbnQgYnVmbGVuLAorCQljaGFyICppdGVtVG9BZGQpCisjZWxzZQorc3RyY2F0X3RvX2J1ZiAoYnVmLCBidWZsZW4sIGl0ZW1Ub0FkZCkKKyAgICAgY2hhciAqYnVmOworICAgICBpbnQgYnVmbGVuOworICAgICBjaGFyICppdGVtVG9BZGQ7CisjZW5kaWYKK3sKKyAgaWYgKGl0ZW1Ub0FkZCAhPSAoY2hhciAqKSBOVUxMICYmIGJ1ZiAhPSAoY2hhciAqKSBOVUxMKQorICAgIHsKKyAgICAgIGlmICgoc3RybGVuIChidWYpICsgc3RybGVuIChpdGVtVG9BZGQpKSA8PSBidWZsZW4pCisJc3RyY2F0IChidWYsIGl0ZW1Ub0FkZCk7CisgICAgICBlbHNlCisJc3RybmNhdCAoYnVmLCBpdGVtVG9BZGQsIChidWZsZW4gLSBzdHJsZW4gKGJ1ZikpKTsKKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiBzdHJjYXRfdG9fYnVmICovCisKKy8qIFZBUkFSR1MgKi8KK3ZvaWQKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKK3N0cmNhdF90b19idWZfd2l0aF9mbXQgKAorCQkJIGNoYXIgKmJ1ZiwKKwkJCSBpbnQgYnVmTGVuLAorCQkJIGNoYXIgKmZvcm1hdCwuLi4pCisjZWxzZQorc3RyY2F0X3RvX2J1Zl93aXRoX2ZtdCAodmFfYWxpc3QpCisgICAgIHZhX2RjbAorI2VuZGlmCit7CisgIGNoYXIgKmxpbmVidWZmZXI7CisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2xlYW51cHM7CisgIHZhX2xpc3QgYXJnczsKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisjZWxzZQorICBjaGFyICpidWY7CisgIGludCBidWZMZW47CisgIGNoYXIgKmZvcm1hdDsKKworICB2YV9zdGFydCAoYXJncyk7CisgIGJ1ZiA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKKyAgYnVmTGVuID0gdmFfYXJnIChhcmdzLCBpbnQpOworICBmb3JtYXQgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7CisjZW5kaWYKKyAgdmFzcHJpbnRmICgmbGluZWJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKKyAgb2xkX2NsZWFudXBzID0gbWFrZV9jbGVhbnVwIChmcmVlLCBsaW5lYnVmZmVyKTsKKyAgc3RyY2F0X3RvX2J1ZiAoYnVmLCBidWZMZW4sIGxpbmVidWZmZXIpOworICBkb19jbGVhbnVwcyAob2xkX2NsZWFudXBzKTsKKyAgdmFfZW5kIChhcmdzKTsKK30KKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFN0YXRpYyBGdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKgorKiogX3R1aV92RG8oKS4KKyoqICAgICAgICBHZW5lcmFsIHB1cnBvc2UgZnVuY3Rpb24gdG8gZXhlY3V0ZSBhIHR1aSBmdW5jdGlvbi4gIFRyYW5zaXRpb25zCisqKiAgICAgICAgYmV0d2VlbiBjdXJzZXMgYW5kIHRoZSBhcmUgaGFuZGxlZCBoZXJlLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyoqICAgICAgICBieSBub24tdHVpIGdkYiBmdW5jdGlvbnMuCisqKgorKiogICAgICAgIEVycm9ycyBhcmUgY2F1Z2h0IGhlcmUuCisqKiAgICAgICAgSWYgdGhlcmUgaXMgbm8gZXJyb3IsIHRoZSB2YWx1ZSByZXR1cm5lZCBieSAnZnVuYycgaXMgcmV0dXJuZWQuCisqKiAgICAgICAgSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZW4gemVybyBpcyByZXR1cm5lZC4KKyoqCisqKiAgICAgICBNdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBpbW1lZGlhdGVfcXVpdCBpbiBlZmZlY3QgKGJhZCB0aGluZ3MgbWlnaHQKKyoqICAgICAgIGhhcHBlbiwgc2F5IHdlIGdvdCBhIHNpZ25hbCBpbiB0aGUgbWlkZGxlIG9mIGEgbWVtY3B5IHRvIHF1aXRfcmV0dXJuKS4KKyoqICAgICAgIFRoaXMgaXMgYW4gT0sgcmVzdHJpY3Rpb247IHdpdGggdmVyeSBmZXcgZXhjZXB0aW9ucyBpbW1lZGlhdGVfcXVpdCBjYW4KKyoqICAgICAgIGJlIHJlcGxhY2VkIGJ5IGp1ZGljaW91cyB1c2Ugb2YgUVVJVC4KKyovCitzdGF0aWMgT3BhcXVlCisjaWZkZWYgX19TVERDX18KK190dWlfdkRvICgKKwkgICBUdWlPcGFxdWVGdW5jUHRyIGZ1bmMsCisJICAgdmFfbGlzdCBhcmdzKQorI2Vsc2UKK190dWlfdkRvIChmdW5jLCBhcmdzKQorICAgICBUdWlPcGFxdWVGdW5jUHRyIGZ1bmM7CisgICAgIHZhX2xpc3QgYXJnczsKKyNlbmRpZgoreworICBleHRlcm4gaW50IHRlcm1pbmFsX2lzX291cnM7CisKKyAgT3BhcXVlIHJldCA9IChPcGFxdWUpIE5VTEw7CisKKyAgLyogSXQgaXMgYW4gZXJyb3IgdG8gYmUgdHVpRG8naW5nIGlmIHdlCisgICAgICogZG9uJ3Qgb3duIHRoZSB0ZXJtaW5hbC4KKyAgICAgKi8KKyAgaWYgKCF0ZXJtaW5hbF9pc19vdXJzKQorICAgIHJldHVybiByZXQ7CisKKyAgaWYgKHR1aV92ZXJzaW9uKQorICAgIHsKKyAgICAgIC8qIElmIGRvaW5nIGNvbW1hbmQgd2luZG93IHRoZSAiWERCIHdheSIgKGNvbW1hbmQgd2luZG93CisgICAgICAgICAqIGlzIHVubWFuYWdlZCBieSBjdXJzZXMuLi4KKyAgICAgICAgICovCisgICAgICAvKiBTZXQgdXAgdGVybWluYWwgZm9yIFRVSSAqLworICAgICAgdHVpVGVybVNldHVwICgxKTsKKworICAgICAgcmV0ID0gdmFfY2F0Y2hfZXJyb3JzIChmdW5jLCBhcmdzKTsKKworICAgICAgLyogU2V0IHVwIHRlcm1pbmFsIGZvciBjb21tYW5kIHdpbmRvdyAqLworICAgICAgdHVpVGVybVVuc2V0dXAgKDEsIGNtZFdpbi0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1cmNoKTsKKyAgICB9CisKKyAgcmV0dXJuIHJldDsKK30JCQkJLyogX3R1aV92RG8gKi8KKworCitzdGF0aWMgdm9pZAorI2lmZGVmIF9fU1REQ19fCitfdG9nZ2xlX2NvbW1hbmQgKAorCQkgIGNoYXIgKmFyZywKKwkJICBpbnQgZnJvbVRUWSkKKyNlbHNlCitfdG9nZ2xlX2NvbW1hbmQgKGFyZywgZnJvbVRUWSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbVRUWTsKKyNlbmRpZgoreworICBwcmludGZfZmlsdGVyZWQgKCJTcGVjaWZ5IGZlYXR1cmUgdG8gdG9nZ2xlLlxuJXNcbiIsCisJCSAgICh0dWlfdmVyc2lvbikgPyBUVUlfVE9HR0xFX1VTQUdFIDogVE9HR0xFX1VTQUdFKTsKKy8qCisgIHR1aURvKChUdWlPcGFxdWVGdW5jUHRyKV9Ub2dnbGVfY29tbWFuZCwgYXJnLCBmcm9tVFRZKTsKKyovCit9CisKKy8qCisqKiBfdHVpX3ZUb2dnbGVfY29tbWFuZCgpLgorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK190dWlfdlRvZ2dsZV9jb21tYW5kICgKKwkJICAgICAgIHZhX2xpc3QgYXJncykKKyNlbHNlCitfdHVpX3ZUb2dnbGVfY29tbWFuZCAoYXJncykKKyAgICAgdmFfbGlzdCBhcmdzOworI2VuZGlmCit7CisgIGNoYXIgKmFyZzsKKyAgaW50IGZyb21UVFk7CisKKyAgYXJnID0gdmFfYXJnIChhcmdzLCBjaGFyICopOworCisgIGlmIChhcmcgPT0gKGNoYXIgKikgTlVMTCkKKyAgICBwcmludGZfZmlsdGVyZWQgKFRPR0dMRV9VU0FHRSk7CisgIGVsc2UKKyAgICB7CisgICAgICBjaGFyICpwdHIgPSAoY2hhciAqKSB0dWlTdHJEdXAgKGFyZyk7CisgICAgICBpbnQgaTsKKworICAgICAgZm9yIChpID0gMDsgKHB0cltpXSk7IGkrKykKKwlwdHJbaV0gPSB0b3VwcGVyIChhcmdbaV0pOworCisgICAgICBpZiAoc3Vic2V0Q29tcGFyZSAocHRyLCBUVUlfRkxPQVRfUkVHU19OQU1FKSkKKwl0dWlUb2dnbGVGbG9hdFJlZ3MgKCk7CisvKiAgICAgICAgZWxzZSBpZiAoc3Vic2V0Q29tcGFyZShwdHIsICJBTk9USEVSIFRPR0dMRSBPUFRJT04iKSkKKyAgICAgICAgICAgIC4uLgorKi8KKyAgICAgIGVsc2UKKwlwcmludGZfZmlsdGVyZWQgKFRPR0dMRV9VU0FHRSk7CisgICAgICB0dWlGcmVlIChwdHIpOworICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIF90dWlUb2dnbGVfY29tbWFuZCAqLworCisKK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK190dWlSZXNldCAodm9pZCkKKyNlbHNlCitfdHVpUmVzZXQgKCkKKyNlbmRpZgoreworICBzdHJ1Y3QgdGVybWlvIG1vZGU7CisKKyAgLyoKKyAgICAqKiByZXNldCB0aGUgdGVsZXR5cGUgbW9kZSBiaXRzIHRvIGEgc2Vuc2libGUgc3RhdGUuCisgICAgKiogQ29waWVkIHRzZXQuYworICAgICovCisjaWYgISBkZWZpbmVkIChVU0cpICYmIGRlZmluZWQgKFRJT0NHRVRDKQorICBzdHJ1Y3QgdGNoYXJzIHRidWY7CisjZW5kaWYgLyogIVVTRyAmJiBUSU9DR0VUQyAqLworI2lmZGVmIFVDQl9OVFRZCisgIHN0cnVjdCBsdGNoYXJzIGx0YzsKKworICBpZiAobGRpc2MgPT0gTlRUWURJU0MpCisgICAgeworICAgICAgaW9jdGwgKEZJTEVERVMsIFRJT0NHTFRDLCAmbHRjKTsKKyAgICAgIGx0Yy50X3N1c3BjID0gQ0hLIChsdGMudF9zdXNwYywgQ1RSTCAoJ1onKSk7CisgICAgICBsdGMudF9kc3VzcGMgPSBDSEsgKGx0Yy50X2RzdXNwYywgQ1RSTCAoJ1knKSk7CisgICAgICBsdGMudF9ycHJudGMgPSBDSEsgKGx0Yy50X3Jwcm50YywgQ1RSTCAoJ1InKSk7CisgICAgICBsdGMudF9mbHVzaGMgPSBDSEsgKGx0Yy50X2ZsdXNoYywgQ1RSTCAoJ08nKSk7CisgICAgICBsdGMudF93ZXJhc2MgPSBDSEsgKGx0Yy50X3dlcmFzYywgQ1RSTCAoJ1cnKSk7CisgICAgICBsdGMudF9sbmV4dGMgPSBDSEsgKGx0Yy50X2xuZXh0YywgQ1RSTCAoJ1YnKSk7CisgICAgICBpb2N0bCAoRklMRURFUywgVElPQ1NMVEMsICZsdGMpOworICAgIH0KKyNlbmRpZiAvKiBVQ0JfTlRUWSAqLworI2lmbmRlZiBVU0cKKyNpZmRlZiBUSU9DR0VUQworICBpb2N0bCAoRklMRURFUywgVElPQ0dFVEMsICZ0YnVmKTsKKyAgdGJ1Zi50X2ludHJjID0gQ0hLICh0YnVmLnRfaW50cmMsIENUUkwgKCc/JykpOworICB0YnVmLnRfcXVpdGMgPSBDSEsgKHRidWYudF9xdWl0YywgQ1RSTCAoJ1xcJykpOworICB0YnVmLnRfc3RhcnRjID0gQ0hLICh0YnVmLnRfc3RhcnRjLCBDVFJMICgnUScpKTsKKyAgdGJ1Zi50X3N0b3BjID0gQ0hLICh0YnVmLnRfc3RvcGMsIENUUkwgKCdTJykpOworICB0YnVmLnRfZW9mYyA9IENISyAodGJ1Zi50X2VvZmMsIENUUkwgKCdEJykpOworICAvKiBicmtjIGlzIGxlZnQgYWxvbmUgKi8KKyAgaW9jdGwgKEZJTEVERVMsIFRJT0NTRVRDLCAmdGJ1Zik7CisjZW5kaWYgLyogVElPQ0dFVEMgKi8KKyAgbW9kZS5zZ19mbGFncyAmPSB+KFJBVworI2lmZGVmIENCUkVBSworCQkgICAgIHwgQ0JSRUFLCisjZW5kaWYgLyogQ0JSRUFLICovCisJCSAgICAgfCBWVERFTEFZIHwgQUxMREVMQVkpOworICBtb2RlLnNnX2ZsYWdzIHw9IFhUQUJTIHwgRUNITyB8IENSTU9EIHwgQU5ZUDsKKyNlbHNlIC8qVVNHKi8KKyAgaW9jdGwgKEZJTEVERVMsIFRDR0VUQSwgJm1vZGUpOworICBtb2RlLmNfY2NbVklOVFJdID0gQ0hLIChtb2RlLmNfY2NbVklOVFJdLCBDVFJMICgnPycpKTsKKyAgbW9kZS5jX2NjW1ZRVUlUXSA9IENISyAobW9kZS5jX2NjW1ZRVUlUXSwgQ1RSTCAoJ1xcJykpOworICBtb2RlLmNfY2NbVkVPRl0gPSBDSEsgKG1vZGUuY19jY1tWRU9GXSwgQ1RSTCAoJ0QnKSk7CisKKyAgbW9kZS5jX2lmbGFnICY9IH4oSUdOQlJLIHwgUEFSTVJLIHwgSU5QQ0sgfCBJTkxDUiB8IElHTkNSIHwgSVVDTEMgfCBJWE9GRik7CisgIG1vZGUuY19pZmxhZyB8PSAoQlJLSU5UIHwgSVNUUklQIHwgSUNSTkwgfCBJWE9OKTsKKyAgbW9kZS5jX29mbGFnICY9IH4oT0xDVUMgfCBPQ1JOTCB8IE9OT0NSIHwgT05MUkVUIHwgT0ZJTEwgfCBPRkRFTCB8CisJCSAgICBOTERMWSB8IENSRExZIHwgVEFCRExZIHwgQlNETFkgfCBWVERMWSB8IEZGRExZKTsKKyAgbW9kZS5jX29mbGFnIHw9IChPUE9TVCB8IE9OTENSKTsKKyAgbW9kZS5jX2NmbGFnICY9IH4oQ1NJWkUgfCBQQVJPREQgfCBDTE9DQUwpOworI2lmbmRlZiBocDkwMDBzODAwCisgIG1vZGUuY19jZmxhZyB8PSAoQ1M4IHwgQ1JFQUQpOworI2Vsc2UgLypocDkwMDBzODAwKi8KKyAgbW9kZS5jX2NmbGFnIHw9IChDUzggfCBDU1RPUEIgfCBDUkVBRCk7CisjZW5kaWYgLyogaHA5MDAwczgwMCAqLworICBtb2RlLmNfbGZsYWcgJj0gfihYQ0FTRSB8IEVDSE9OTCB8IE5PRkxTSCk7CisgIG1vZGUuY19sZmxhZyB8PSAoSVNJRyB8IElDQU5PTiB8IEVDSE8gfCBFQ0hPSyk7CisgIGlvY3RsIChGSUxFREVTLCBUQ1NFVEFXLCAmbW9kZSk7CisjZW5kaWYgLyogVVNHICovCisKKyAgcmV0dXJuOworfQkJCQkvKiBfdHVpUmVzZXQgKi8KZGlmZiAtLWdpdCBhL2dkYi90dWkvdHVpLmggYi9nZGIvdHVpL3R1aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOWZiMzEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdHVpL3R1aS5oCkBAIC0wLDAgKzEsMTIwIEBACisvKiBFeHRlcm5hbC9QdWJsaWMgVFVJIEhlYWRlciBGaWxlICovCisKKyNpZm5kZWYgVFVJX0gKKyNkZWZpbmUgVFVJX0gKKyNpbmNsdWRlIDxjdXJzZXMuaD4KKworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2Vsc2UKKyNpbmNsdWRlIDx2YXJhcmdzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisKKyNpZiBkZWZpbmVkKHJlZykKKyN1bmRlZiByZWcKKyNlbmRpZgorI2lmIGRlZmluZWQoY2h0eXBlKQorI3VuZGVmIGNodHlwZQorI2VuZGlmCisKKy8qIE9wYXF1ZSBkYXRhIHR5cGUgKi8KK3R5cGVkZWYgY2hhciAqT3BhcXVlOwordHlwZWRlZiBPcGFxdWUgKCpPcGFxdWVGdW5jUHRyKSBQQVJBTVMgKCh2YV9saXN0KSk7Cit0eXBlZGVmIGNoYXIgKipPcGFxdWVMaXN0OwordHlwZWRlZiBPcGFxdWVMaXN0IE9wYXF1ZVB0cjsKKworLyogR2VuZXJpYyBmdW5jdGlvbiBwb2ludGVyICovCit0eXBlZGVmICAgICB2b2lkICAgICAgICAgICAgICAoKlR1aVZvaWRGdW5jUHRyKSBQQVJBTVMgKCh2YV9saXN0KSk7Cit0eXBlZGVmICAgICBpbnQgICAgICAgICAgICAgICAoKlR1aUludEZ1bmNQdHIpIFBBUkFNUyAoKHZhX2xpc3QpKTsKKy8qCit0eXBlZGVmICAgICBPcGFxdWUgICAgICAgICAgICAoKlR1aU9wYXF1ZUZ1bmNQdHIpIFBBUkFNUyAoKHZhX2xpc3QpKTsKKyovCit0eXBlZGVmICAgICBPcGFxdWVGdW5jUHRyICAgICBUdWlPcGFxdWVGdW5jUHRyOworCitleHRlcm4gT3BhcXVlIHZjYXRjaF9lcnJvcnMgUEFSQU1TICgoT3BhcXVlRnVuY1B0ciwgLi4uKSk7CitleHRlcm4gT3BhcXVlIHZhX2NhdGNoX2Vycm9ycyBQQVJBTVMgKChPcGFxdWVGdW5jUHRyLCB2YV9saXN0KSk7CisKK2V4dGVybiB2b2lkIHN0cmNhdF90b19idWYgUEFSQU1TICgoY2hhciAqLCBpbnQsIGNoYXIgKikpOworZXh0ZXJuIHZvaWQgc3RyY2F0X3RvX2J1Zl93aXRoX2ZtdCBQQVJBTVMgKChjaGFyICosIGludCwgY2hhciAqLCAuLi4pKTsKKworLyogVHlwZXMgb2YgZXJyb3IgcmV0dXJucyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBUVUlfU1VDQ0VTUywKKyAgICBUVUlfRkFJTFVSRQorfSBUdWlTdGF0dXMsICpUdWlTdGF0dXNQdHI7CisKKy8qIFR5cGVzIG9mIHdpbmRvd3MgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgU1JDX1dJTiA9IDAsCisgICAgRElTQVNTRU1fV0lOLAorICAgIERBVEFfV0lOLAorICAgIENNRF9XSU4sCisgICAgLyogVGhpcyBtdXN0IEFMV0FZUyBiZSBBRlRFUiB0aGUgbWFqb3Igd2luZG93cyBsYXN0ICovCisgICAgTUFYX01BSk9SX1dJTkRPV1MsCisgICAgLyogYXV4aWxsYXJ5IHdpbmRvd3MgKi8KKyAgICBMT0NBVE9SX1dJTiwKKyAgICBFWEVDX0lORk9fV0lOLAorICAgIERBVEFfSVRFTV9XSU4sCisgICAgLyogVGhpcyBtdXN0IEFMV0FZUyBiZSBuZXh0IHRvIGxhc3QgKi8KKyAgICBNQVhfV0lORE9XUywKKyAgICBVTkRFRklORURfV0lOIC8qIExBU1QgKi8KK30gVHVpV2luVHlwZSwgKlR1aVdpblR5cGVQdHI7CisKKy8qIFRoaXMgaXMgYSBwb2ludCBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdCBfVHVpUG9pbnQgeworICAgIGludCB4LCB5OworfSBUdWlQb2ludCwgKlR1aVBvaW50UHRyOworCisvKiBHZW5lcmljIHdpbmRvdyBpbmZvcm1hdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgX1R1aUdlbldpbkluZm8geworICAgIFdJTkRPVyAgICAgICAgICAqaGFuZGxlOyAvKiB3aW5kb3cgaGFuZGxlICovCisgICAgVHVpV2luVHlwZSAgICAgIHR5cGU7IC8qIHR5cGUgb2Ygd2luZG93ICovCisgICAgaW50ICAgICAgICAgICAgIHdpZHRoOyAvKiB3aW5kb3cgd2lkdGggKi8KKyAgICBpbnQgICAgICAgICAgICAgaGVpZ2h0OyAvKiB3aW5kb3cgaGVpZ2h0ICovCisgICAgVHVpUG9pbnQgICAgICAgIG9yaWdpbjsgLyogb3JpZ2luIG9mIHdpbmRvdyAqLworICAgIE9wYXF1ZVB0ciAgICAgICBjb250ZW50OyAvKiBjb250ZW50IG9mIHdpbmRvdyAqLworICAgIGludCAgICAgICAgICAgICBjb250ZW50U2l6ZTsgLyogU2l6ZSBvZiBjb250ZW50ICgjIG9mIGVsZW1lbnRzKSAqLworICAgIGludCAgICAgICAgICAgICBjb250ZW50SW5Vc2U7IC8qIENhbiBpdCBiZSB1c2VkLCBvciBpcyBpdCBhbHJlYWR5IHVzZWQ/ICovCisgICAgaW50ICAgICAgICAgICAgIHZpZXdwb3J0SGVpZ2h0OyAvKiB2aWV3cG9ydCBoZWlnaHQgKi8KKyAgICBpbnQgICAgICAgICAgICAgbGFzdFZpc2libGVMaW5lOyAvKiBpbmRleCBvZiBsYXN0IHZpc2libGUgbGluZSAqLworICAgIGludCAgICAgICAgICAgICBpc1Zpc2libGU7IC8qIHdoZXRoZXIgdGhlIHdpbmRvdyBpcyB2aXNpYmxlIG9yIG5vdCAqLworfSBUdWlHZW5XaW5JbmZvLCAqVHVpR2VuV2luSW5mb1B0cjsKKworLyogR0VORVJBTCBUVUkgRlVOQ1RJT05TICovCisvKiB0dWkuYyAqLworZXh0ZXJuIHZvaWQgICAgICAgICAgdHVpSW5pdCBQQVJBTVMgKChjaGFyICphcmd2MCkpOworZXh0ZXJuIHZvaWQgICAgICAgICAgdHVpSW5pdFdpbmRvd3MgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgICAgICAgICAgdHVpUmVzZXRTY3JlZW4gUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgICAgICAgICAgdHVpQ2xlYW5VcCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCAgICAgICAgICB0dWlFcnJvciBQQVJBTVMgKChjaGFyICosIGludCkpOworZXh0ZXJuIHZvaWQgICAgICAgICAgdHVpX3ZFcnJvciBQQVJBTVMgKCh2YV9saXN0KSk7CitleHRlcm4gdm9pZCAgICAgICAgICB0dWlGcmVlIFBBUkFNUyAoKGNoYXIgKikpOworZXh0ZXJuIE9wYXF1ZSAgICAgICAgdHVpRG8gUEFSQU1TICgoVHVpT3BhcXVlRnVuY1B0ciwgLi4uKSk7CitleHRlcm4gT3BhcXVlICAgICAgICB0dWlEb0FuZFJldHVyblRvVG9wIFBBUkFNUyAoKFR1aU9wYXF1ZUZ1bmNQdHIsIC4uLikpOworZXh0ZXJuIE9wYXF1ZSAgICAgICAgdHVpR2V0TG93RGlzYXNzZW1ibHlBZGRyZXNzIFBBUkFNUyAoKE9wYXF1ZSwgT3BhcXVlKSk7CitleHRlcm4gT3BhcXVlICAgICAgICB0dWlfdkdldExvd0Rpc2Fzc2VtYmx5QWRkcmVzcyBQQVJBTVMgKCh2YV9saXN0KSk7CitleHRlcm4gdm9pZCAgICAgICAgICB0dWlfdlNlbGVjdFNvdXJjZVN5bXRhYiBQQVJBTVMgKCh2YV9saXN0KSk7CisKKy8qIHR1aURhdGFXaW4uYyAqLworZXh0ZXJuIHZvaWQJCXR1aV92Q2hlY2tEYXRhVmFsdWVzIFBBUkFNUyAoKHZhX2xpc3QpKTsKKworLyogdHVpSU8uYyAqLworZXh0ZXJuIHZvaWQJCXR1aV92U3RhcnROZXdMaW5lcyBQQVJBTVMgKCh2YV9saXN0KSk7CisKKy8qIHR1aUxheW91dC5jICovCitleHRlcm4gdm9pZAkJdHVpX3ZBZGRXaW5Ub0xheW91dCBQQVJBTVMgKCh2YV9saXN0KSk7CitleHRlcm4gVHVpU3RhdHVzCXR1aV92U2V0TGF5b3V0VG8gUEFSQU1TICgodmFfbGlzdCkpOworCisvKiB0dWlTb3VyY2VXaW4uYyAqLworZXh0ZXJuIHZvaWQJCXR1aURpc3BsYXlNYWluRnVuY3Rpb24gUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQJCXR1aVVwZGF0ZUFsbEV4ZWNJbmZvcyBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZAkJdHVpVXBkYXRlT25FbmQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQJCXR1aV92QWxsU2V0SGFzQnJlYWtBdCBQQVJBTVMgKCh2YV9saXN0KSk7CitleHRlcm4gdm9pZAkJdHVpX3ZVcGRhdGVTb3VyY2VXaW5kb3dzV2l0aEFkZHIgUEFSQU1TICgodmFfbGlzdCkpOworCisvKiB0dWlTdGFjay5jICovCitleHRlcm4gdm9pZAkJdHVpX3ZTaG93RnJhbWVJbmZvIFBBUkFNUyAoKHZhX2xpc3QpKTsKK2V4dGVybiB2b2lkCQl0dWlfdlVwZGF0ZUxvY2F0b3JGaWxlbmFtZSBQQVJBTVMgKCh2YV9saXN0KSk7CisjZW5kaWYgLyogVFVJX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi90dWkvdHVpQ29tbWFuZC5jIGIvZ2RiL3R1aS90dWlDb21tYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0ZGM2MgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90dWkvdHVpQ29tbWFuZC5jCkBAIC0wLDAgKzEsMjE1IEBACisvKgorKiogdHVpQ29tbWFuZC5jCisqKiAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgZnVuY3Rpb25zIHNwZWNpZmljIHRvIGNvbW1hbmQgd2luZG93IHByb2Nlc3NpbmcuCisqLworCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAidHVpLmgiCisjaW5jbHVkZSAidHVpRGF0YS5oIgorI2luY2x1ZGUgInR1aVdpbi5oIgorI2luY2x1ZGUgInR1aUlPLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBTVEFUSUMgTE9DQUwgRlVOQ1RJT05TIEZPUldBUkQgREVDTFMgICAgKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogUFVCTElDIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisqKiB0dWlEaXNwYXRjaEN0cmxDaGFyKCkuCisqKiAgICAgICAgRGlzcGF0Y2ggdGhlIGNvcnJlY3QgdHVpIGZ1bmN0aW9uIGJhc2VkIHVwb24gdGhlIGNvbnRyb2wgY2hhcmFjdGVyLgorKi8KK3Vuc2lnbmVkIGludAorI2lmZGVmIF9fU1REQ19fCit0dWlEaXNwYXRjaEN0cmxDaGFyICgKKwkJICAgICAgdW5zaWduZWQgaW50IGNoKQorI2Vsc2UKK3R1aURpc3BhdGNoQ3RybENoYXIgKGNoKQorICAgICB1bnNpZ25lZCBpbnQgY2g7CisjZW5kaWYKK3sKKyAgVHVpV2luSW5mb1B0ciB3aW5JbmZvID0gdHVpV2luV2l0aEZvY3VzICgpOworCisgIC8qCisgICAgKiogSWYgdGhlIGNvbW1hbmQgd2luZG93IGhhcyB0aGUgbG9naWNhbCBmb2N1cywgb3Igbm8tb25lIGRvZXMKKyAgICAqKiBhc3N1bWUgaXQgaXMgdGhlIGNvbW1hbmQgd2luZG93OyBpbiB0aGlzIGNhc2UsIHBhc3MgdGhlCisgICAgKiogY2hhcmFjdGVyIG9uIHRocm91Z2ggYW5kIGRvIG5vdGhpbmcgaGVyZS4KKyAgICAqLworICBpZiAod2luSW5mbyA9PSAoVHVpV2luSW5mb1B0cikgTlVMTCB8fCB3aW5JbmZvID09IGNtZFdpbikKKyAgICByZXR1cm4gY2g7CisgIGVsc2UKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgYyA9IDAsIGNoQ29weSA9IGNoOworICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICBjaGFyICp0ZXJtOworCisgICAgICAvKiBJZiB0aGlzIGlzIGFuIHh0ZXJtLCBwYWdlIG5leHQvcHJldiBrZXlzIGFyZW4ndCByZXR1cm5lZAorICAgICAgICAqKiBieSBrZXlwYWQgYXMgYSBzaW5nbGUgY2hhciwgc28gd2UgbXVzdCBoYW5kbGUgdGhlbSBoZXJlLgorICAgICAgICAqKiBTZWVtcyBsaWtlIGEgYnVnIGluIHRoZSBjdXJzZXMgbGlicmFyeT8KKyAgICAgICAgKi8KKyAgICAgIHRlcm0gPSAoY2hhciAqKSBnZXRlbnYgKCJURVJNIik7CisgICAgICBmb3IgKGkgPSAwOyAodGVybSAmJiB0ZXJtW2ldKTsgaSsrKQorCXRlcm1baV0gPSB0b3VwcGVyICh0ZXJtW2ldKTsKKyAgICAgIGlmICgoc3RyY21wICh0ZXJtLCAiWFRFUk0iKSA9PSAwKSAmJiBtX2lzU3RhcnRTZXF1ZW5jZSAoY2gpKQorCXsKKwkgIHVuc2lnbmVkIGludCBwYWdlQ2ggPSAwLCB0bXBDaGFyOworCisJICB0bXBDaGFyID0gMDsKKwkgIHdoaWxlICghbV9pc0VuZFNlcXVlbmNlICh0bXBDaGFyKSkKKwkgICAgeworCSAgICAgIHRtcENoYXIgPSAoaW50KSB3Z2V0Y2ggKGNtZFdpbi0+Z2VuZXJpYy5oYW5kbGUpOworCSAgICAgIGlmICghdG1wQ2hhcikKKwkJYnJlYWs7CisJICAgICAgaWYgKHRtcENoYXIgPT0gNTMpCisJCXBhZ2VDaCA9IEtFWV9QUEFHRTsKKwkgICAgICBlbHNlIGlmICh0bXBDaGFyID09IDU0KQorCQlwYWdlQ2ggPSBLRVlfTlBBR0U7CisJICAgIH0KKwkgIGNoQ29weSA9IHBhZ2VDaDsKKwl9CisKKyAgICAgIHN3aXRjaCAoY2hDb3B5KQorCXsKKwljYXNlIEtFWV9OUEFHRToKKwkgIHR1aVNjcm9sbEZvcndhcmQgKHdpbkluZm8sIDApOworCSAgYnJlYWs7CisJY2FzZSBLRVlfUFBBR0U6CisJICB0dWlTY3JvbGxCYWNrd2FyZCAod2luSW5mbywgMCk7CisJICBicmVhazsKKwljYXNlIEtFWV9ET1dOOgorCWNhc2UgS0VZX1NGOgorCSAgdHVpU2Nyb2xsRm9yd2FyZCAod2luSW5mbywgMSk7CisJICBicmVhazsKKwljYXNlIEtFWV9VUDoKKwljYXNlIEtFWV9TUjoKKwkgIHR1aVNjcm9sbEJhY2t3YXJkICh3aW5JbmZvLCAxKTsKKwkgIGJyZWFrOworCWNhc2UgS0VZX1JJR0hUOgorCSAgdHVpU2Nyb2xsTGVmdCAod2luSW5mbywgMSk7CisJICBicmVhazsKKwljYXNlIEtFWV9MRUZUOgorCSAgdHVpU2Nyb2xsUmlnaHQgKHdpbkluZm8sIDEpOworCSAgYnJlYWs7CisJY2FzZSAnXGYnOgorCSAgdHVpUmVmcmVzaEFsbCAoKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBjID0gY2hDb3B5OworCSAgYnJlYWs7CisJfQorICAgICAgcmV0dXJuIGM7CisgICAgfQorfQkJCQkvKiB0dWlEaXNwYXRjaEN0cmxDaGFyICovCisKKworLyoKKyoqIHR1aUluY3JDb21tYW5kQ2hhckNvdW50QnkoKQorKiogICAgIEluY3JlbWVudCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgY291bnQgaW4gdGhlIGNvbW1hbmQgd2luZG93LAorKiogICAgIGNoZWNraW5nIGZvciBvdmVyZmxvdy4gIFJldHVybnMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY2hhciBjb3VudC4KKyovCitpbnQKKyNpZmRlZiBfX1NURENfXwordHVpSW5jckNvbW1hbmRDaGFyQ291bnRCeSAoCisJCQkgICAgaW50IGNvdW50KQorI2Vsc2UKK3R1aUluY3JDb21tYW5kQ2hhckNvdW50QnkgKGNvdW50KQorICAgICBpbnQgY291bnQ7CisjZW5kaWYKK3sKKyAgaWYgKHR1aV92ZXJzaW9uKQorICAgIHsKKyAgICAgIGlmICgoY291bnQgKyBjbWRXaW4tPmRldGFpbC5jb21tYW5kSW5mby5jdXJjaCkgPj0gY21kV2luLT5nZW5lcmljLndpZHRoKQorCWNtZFdpbi0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1cmNoID0KKwkgIChjb3VudCArIGNtZFdpbi0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1cmNoKSAtIGNtZFdpbi0+Z2VuZXJpYy53aWR0aDsKKyAgICAgIGVsc2UKKwljbWRXaW4tPmRldGFpbC5jb21tYW5kSW5mby5jdXJjaCArPSBjb3VudDsKKyAgICB9CisKKyAgcmV0dXJuIGNtZFdpbi0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1cmNoOworfQkJCQkvKiB0dWlJbmNyQ29tbWFuZENoYXJDb3VudEJ5ICovCisKKworLyoKKyoqIHR1aURlY3JDb21tYW5kQ2hhckNvdW50QnkoKQorKiogICAgIERlY3JlbWVudCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgY291bnQgaW4gdGhlIGNvbW1hbmQgd2luZG93LAorKiogICAgIGNoZWNraW5nIGZvciBvdmVyZmxvdy4gIFJldHVybnMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY2hhciBjb3VudC4KKyovCitpbnQKKyNpZmRlZiBfX1NURENfXwordHVpRGVjckNvbW1hbmRDaGFyQ291bnRCeSAoCisJCQkgICAgaW50IGNvdW50KQorI2Vsc2UKK3R1aURlY3JDb21tYW5kQ2hhckNvdW50QnkgKGNvdW50KQorICAgICBpbnQgY291bnQ7CisjZW5kaWYKK3sKKyAgaWYgKHR1aV92ZXJzaW9uKQorICAgIHsKKyAgICAgIGlmICgoY21kV2luLT5kZXRhaWwuY29tbWFuZEluZm8uY3VyY2ggLSBjb3VudCkgPCAwKQorCWNtZFdpbi0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1cmNoID0KKwkgIGNtZFdpbi0+Z2VuZXJpYy53aWR0aCArIChjbWRXaW4tPmRldGFpbC5jb21tYW5kSW5mby5jdXJjaCAtIGNvdW50KTsKKyAgICAgIGVsc2UKKwljbWRXaW4tPmRldGFpbC5jb21tYW5kSW5mby5jdXJjaCAtPSBjb3VudDsKKyAgICB9CisKKyAgcmV0dXJuIGNtZFdpbi0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1cmNoOworfQkJCQkvKiB0dWlEZWNyQ29tbWFuZENoYXJDb3VudEJ5ICovCisKKworLyoKKyoqIHR1aVNldENvbW1hbmRDaGFyQ291bnRUbygpCisqKiAgICAgU2V0IHRoZSBjaGFyYWN0ZXIgY291bnQgdG8gY291bnQuCisqLworaW50CisjaWZkZWYgX19TVERDX18KK3R1aVNldENvbW1hbmRDaGFyQ291bnRUbyAoCisJCQkgICBpbnQgY291bnQpCisjZWxzZQordHVpU2V0Q29tbWFuZENoYXJDb3VudFRvIChjb3VudCkKKyAgICAgaW50IGNvdW50OworI2VuZGlmCit7CisgIGlmICh0dWlfdmVyc2lvbikKKyAgICB7CisgICAgICBpZiAoY291bnQgPiBjbWRXaW4tPmdlbmVyaWMud2lkdGggLSAxKQorCXsKKwkgIGNtZFdpbi0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1cmNoID0gMDsKKwkgIHR1aUluY3JDb21tYW5kQ2hhckNvdW50QnkgKGNvdW50KTsKKwl9CisgICAgICBlbHNlCisJY21kV2luLT5kZXRhaWwuY29tbWFuZEluZm8uY3VyY2ggLT0gY291bnQ7CisgICAgfQorCisgIHJldHVybiBjbWRXaW4tPmRldGFpbC5jb21tYW5kSW5mby5jdXJjaDsKK30JCQkJLyogdHVpU2V0Q29tbWFuZENoYXJDb3VudFRvICovCisKKworCisvKgorKiogdHVpQ2xlYXJDb21tYW5kQ2hhckNvdW50KCkKKyoqICAgICBDbGVhciB0aGUgY2hhcmFjdGVyIGNvdW50IHRvIGNvdW50LgorKi8KK2ludAorI2lmZGVmIF9fU1REQ19fCit0dWlDbGVhckNvbW1hbmRDaGFyQ291bnQgKHZvaWQpCisjZWxzZQordHVpQ2xlYXJDb21tYW5kQ2hhckNvdW50ICgpCisjZW5kaWYKK3sKKyAgaWYgKHR1aV92ZXJzaW9uKQorICAgIGNtZFdpbi0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1cmNoID0gMDsKKworICByZXR1cm4gY21kV2luLT5kZXRhaWwuY29tbWFuZEluZm8uY3VyY2g7Cit9CQkJCS8qIHR1aUNsZWFyQ29tbWFuZENoYXJDb3VudCAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBTVEFUSUMgTE9DQUwgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZ2RiL3R1aS90dWlDb21tYW5kLmggYi9nZGIvdHVpL3R1aUNvbW1hbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDZkOTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3R1aS90dWlDb21tYW5kLmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfVFVJX0NPTU1BTkRfSAorI2RlZmluZSBfVFVJX0NPTU1BTkRfSAorLyoKKyoqIFRoaXMgaGVhZGVyIGZpbGUgc3VwcG9ydHMKKyovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBUWVBFIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogUFVCTElDIEZVTkNUSU9OIEVYVEVSTkFMIERFQ0xTICAgICAgICAqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gdW5zaWduZWQgaW50ICAgICB0dWlEaXNwYXRjaEN0cmxDaGFyIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOworZXh0ZXJuIGludCAgICAgICAgICAgICAgdHVpSW5jckNvbW1hbmRDaGFyQ291bnRCeSBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiBpbnQgICAgICAgICAgICAgIHR1aURlY3JDb21tYW5kQ2hhckNvdW50QnkgUEFSQU1TICgoaW50KSk7CitleHRlcm4gaW50ICAgICAgICAgICAgICB0dWlTZXRDb21tYW5kQ2hhckNvdW50VG8gUEFSQU1TICgoaW50KSk7CitleHRlcm4gaW50ICAgICAgICAgICAgICB0dWlDbGVhckNvbW1hbmRDaGFyQ291bnQgUEFSQU1TICgodm9pZCkpOworCisjZW5kaWYgLypfVFVJX0NPTU1BTkRfSCovCmRpZmYgLS1naXQgYS9nZGIvdHVpL3R1aURhdGEuYyBiL2dkYi90dWkvdHVpRGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OGE2Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdHVpL3R1aURhdGEuYwpAQCAtMCwwICsxLDE2MjQgQEAKKy8qCisqKiB0dWlEYXRhLmMKKyoqICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBkYXRhCisqKiAgICBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlIFRVSQorKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJ0dWkuaCIKKyNpbmNsdWRlICJ0dWlEYXRhLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBHTE9CQUwgREVDTEFSQVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVHVpV2luSW5mb1B0ciB3aW5MaXN0W01BWF9NQUpPUl9XSU5ET1dTXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogUHJpdmF0ZSBEZWZpbml0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRklMRV9XSURUSCAgIDMwCisjZGVmaW5lIFBST0NfV0lEVEggICA0MAorI2RlZmluZSBMSU5FX1dJRFRIICAgNAorI2RlZmluZSBQQ19XSURUSCAgICAgOAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBQcml2YXRlIGRhdGEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY2hhciAqX3R1aU51bGxTdHIgPSBUVUlfTlVMTF9TVFI7CitzdGF0aWMgY2hhciAqX3R1aUJsYW5rU3RyID0gIiAgICI7CitzdGF0aWMgY2hhciAqX3R1aUxvY2F0aW9uU3RyID0gIiAgPiI7CitzdGF0aWMgY2hhciAqX3R1aUJyZWFrU3RyID0gIiAqICI7CitzdGF0aWMgY2hhciAqX3R1aUJyZWFrTG9jYXRpb25TdHIgPSAiICo+IjsKK3N0YXRpYyBUdWlMYXlvdXRUeXBlIF9jdXJyZW50TGF5b3V0ID0gVU5ERUZJTkVEX0xBWU9VVDsKK3N0YXRpYyBpbnQgX3Rlcm1IZWlnaHQsIF90ZXJtV2lkdGg7CitzdGF0aWMgaW50IF9oaXN0b3J5TGltaXQgPSBERUZBVUxUX0hJU1RPUllfQ09VTlQ7CitzdGF0aWMgVHVpR2VuV2luSW5mbyBfbG9jYXRvcjsKK3N0YXRpYyBUdWlHZW5XaW5JbmZvIF9leGVjSW5mb1syXTsKK3N0YXRpYyBUdWlXaW5JbmZvUHRyIF9zcmNXaW5MaXN0WzJdOworc3RhdGljIFR1aUxpc3QgX3NvdXJjZVdpbmRvd3MgPQoreyhPcGFxdWVMaXN0KSBfc3JjV2luTGlzdCwgMH07CitzdGF0aWMgaW50IF9kZWZhdWx0VGFiTGVuID0gREVGQVVMVF9UQUJfTEVOOworc3RhdGljIFR1aVdpbkluZm9QdHIgX3dpbldpdGhGb2N1cyA9IChUdWlXaW5JbmZvUHRyKSBOVUxMOworc3RhdGljIFR1aUxheW91dERlZiBfbGF5b3V0RGVmID0KK3tTUkNfV0lOLAkJCS8qIGRpc3BsYXlNb2RlICovCisgRkFMU0UsCQkJCS8qIHNwbGl0ICovCisgVFVJX1VOREVGSU5FRF9SRUdTLAkJLyogcmVnc0Rpc3BsYXlUeXBlICovCisgVFVJX1NGTE9BVF9SRUdTfTsJCS8qIGZsb2F0UmVnc0Rpc3BsYXlUeXBlICovCitzdGF0aWMgaW50IF93aW5SZXNpemVkID0gRkFMU0U7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogU3RhdGljIGZ1bmN0aW9uIGZvcndhcmQgZGVjbHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBmcmVlQ29udGVudCBQQVJBTVMgKChUdWlXaW5Db250ZW50LCBpbnQsIFR1aVdpblR5cGUpKTsKK3N0YXRpYyB2b2lkIGZyZWVDb250ZW50RWxlbWVudHMgUEFSQU1TICgoVHVpV2luQ29udGVudCwgaW50LCBUdWlXaW5UeXBlKSk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBQVUJMSUMgRlVOQ1RJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBBQ0NFU1NPUlMgJiBNVVRBVE9SUyBGT1IgUFJJVkFURSBEQVRBCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisqKiB0dWlXaW5SZXNpemVkKCkuCisqKiAgICAgICAgQW5zd2VyIGEgd2hldGhlciB0aGUgdGVybWluYWwgd2luZG93IGhhcyBiZWVuIHJlc2l6ZWQgb3Igbm90CisqLworaW50CisjaWZkZWYgX19TVERDX18KK3R1aVdpblJlc2l6ZWQgKHZvaWQpCisjZWxzZQordHVpV2luUmVzaXplZCAoKQorI2VuZGlmCit7CisgIHJldHVybiBfd2luUmVzaXplZDsKK30JCQkJLyogdHVpV2luUmVzaXplZCAqLworCisKKy8qCisqKiB0dWlTZXRXaW5SZXNpemVkKCkuCisqKiAgICAgICAgU2V0IGEgd2hldGhlciB0aGUgdGVybWluYWwgd2luZG93IGhhcyBiZWVuIHJlc2l6ZWQgb3Igbm90CisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlTZXRXaW5SZXNpemVkVG8gKAorCQkgICAgIGludCByZXNpemVkKQorI2Vsc2UKK3R1aVNldFdpblJlc2l6ZWRUbyAocmVzaXplZCkKKyAgICAgaW50IHJlc2l6ZWQ7CisjZW5kaWYKK3sKKyAgX3dpblJlc2l6ZWQgPSByZXNpemVkOworCisgIHJldHVybjsKK30JCQkJLyogdHVpU2V0V2luUmVzaXplZFRvICovCisKKworLyoKKyoqIHR1aUxheW91dERlZigpLgorKiogICAgICAgIEFuc3dlciBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbGF5b3V0IGRlZmluaXRpb24KKyovCitUdWlMYXlvdXREZWZQdHIKKyNpZmRlZiBfX1NURENfXwordHVpTGF5b3V0RGVmICh2b2lkKQorI2Vsc2UKK3R1aUxheW91dERlZiAoKQorI2VuZGlmCit7CisgIHJldHVybiAmX2xheW91dERlZjsKK30JCQkJLyogdHVpTGF5b3V0RGVmICovCisKKworLyoKKyoqIHR1aVdpbldpdGhGb2N1cygpLgorKiogICAgICAgIEFuc3dlciB0aGUgd2luZG93IHdpdGggdGhlIGxvZ2ljYWwgZm9jdXMKKyovCitUdWlXaW5JbmZvUHRyCisjaWZkZWYgX19TVERDX18KK3R1aVdpbldpdGhGb2N1cyAodm9pZCkKKyNlbHNlCit0dWlXaW5XaXRoRm9jdXMgKCkKKyNlbmRpZgoreworICByZXR1cm4gX3dpbldpdGhGb2N1czsKK30JCQkJLyogdHVpV2luV2l0aEZvY3VzICovCisKKworLyoKKyoqIHR1aVNldFdpbldpdGhGb2N1cygpLgorKiogICAgICAgIFNldCB0aGUgd2luZG93IHRoYXQgaGFzIHRoZSBsb2dpY2FsIGZvY3VzCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlTZXRXaW5XaXRoRm9jdXMgKAorCQkgICAgIFR1aVdpbkluZm9QdHIgd2luSW5mbykKKyNlbHNlCit0dWlTZXRXaW5XaXRoRm9jdXMgKHdpbkluZm8pCisgICAgIFR1aVdpbkluZm9QdHIgd2luSW5mbzsKKyNlbmRpZgoreworICBfd2luV2l0aEZvY3VzID0gd2luSW5mbzsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aVNldFdpbldpdGhGb2N1cyAqLworCisKKy8qCisqKiB0dWlEZWZhdWx0VGFiTGVuKCkuCisqKiAgICAgICAgQW5zd2VyIHRoZSBsZW5ndGggaW4gY2hhcnMsIG9mIHRhYnMKKyovCitpbnQKKyNpZmRlZiBfX1NURENfXwordHVpRGVmYXVsdFRhYkxlbiAodm9pZCkKKyNlbHNlCit0dWlEZWZhdWx0VGFiTGVuICgpCisjZW5kaWYKK3sKKyAgcmV0dXJuIF9kZWZhdWx0VGFiTGVuOworfQkJCQkvKiB0dWlEZWZhdWx0VGFiTGVuICovCisKKworLyoKKyoqIHR1aVNldERlZmF1bHRUYWJMZW4oKS4KKyoqICAgICAgICBTZXQgdGhlIGxlbmd0aCBpbiBjaGFycywgb2YgdGFicworKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpU2V0RGVmYXVsdFRhYkxlbiAoCisJCSAgICAgIGludCBsZW4pCisjZWxzZQordHVpU2V0RGVmYXVsdFRhYkxlbiAobGVuKQorICAgICBpbnQgbGVuOworI2VuZGlmCit7CisgIF9kZWZhdWx0VGFiTGVuID0gbGVuOworCisgIHJldHVybjsKK30JCQkJLyogdHVpU2V0RGVmYXVsdFRhYkxlbiAqLworCisKKy8qCisqKiBjdXJyZW50U291cmNlV2luKCkKKyoqICAgICAgICBBY2Nlc3NvciBmb3IgdGhlIGN1cnJlbnQgc291cmNlIHdpbmRvdy4gIFVzdWFsbHkgdGhlcmUgaXMgb25seQorKiogICAgICAgIG9uZSBzb3VyY2Ugd2luZG93IChlaXRoZXIgc291cmNlIG9yIGRpc2Fzc2VtYmx5KSwgYnV0IGJvdGggY2FuCisqKiAgICAgICAgYmUgZGlzcGxheWVkIGF0IHRoZSBzYW1lIHRpbWUuCisqLworVHVpTGlzdFB0cgorI2lmZGVmIF9fU1REQ19fCitzb3VyY2VXaW5kb3dzICh2b2lkKQorI2Vsc2UKK3NvdXJjZVdpbmRvd3MgKCkKKyNlbmRpZgoreworICByZXR1cm4gJl9zb3VyY2VXaW5kb3dzOworfQkJCQkvKiBjdXJyZW50U291cmNlV2luZG93cyAqLworCisKKy8qCisqKiBjbGVhclNvdXJjZVdpbmRvd3MoKQorKiogICAgICAgIENsZWFyIHRoZSBsaXN0IG9mIHNvdXJjZSB3aW5kb3dzLiAgVXN1YWxseSB0aGVyZSBpcyBvbmx5IG9uZQorKiogICAgICAgIHNvdXJjZSB3aW5kb3cgKGVpdGhlciBzb3VyY2Ugb3IgZGlzYXNzZW1ibHkpLCBidXQgYm90aCBjYW4gYmUKKyoqICAgICAgICBkaXNwbGF5ZWQgYXQgdGhlIHNhbWUgdGltZS4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK2NsZWFyU291cmNlV2luZG93cyAodm9pZCkKKyNlbHNlCitjbGVhclNvdXJjZVdpbmRvd3MgKCkKKyNlbmRpZgoreworICBfc291cmNlV2luZG93cy5saXN0WzBdID0gKE9wYXF1ZSkgTlVMTDsKKyAgX3NvdXJjZVdpbmRvd3MubGlzdFsxXSA9IChPcGFxdWUpIE5VTEw7CisgIF9zb3VyY2VXaW5kb3dzLmNvdW50ID0gMDsKKworICByZXR1cm47Cit9CQkJCS8qIGN1cnJlbnRTb3VyY2VXaW5kb3dzICovCisKKworLyoKKyoqIGNsZWFyU291cmNlV2luZG93c0RldGFpbCgpCisqKiAgICAgICAgQ2xlYXIgdGhlIHBlcnRpbmFudCBkZXRhaWwgaW4gdGhlIHNvdXJjZSB3aW5kb3dzLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXworY2xlYXJTb3VyY2VXaW5kb3dzRGV0YWlsICh2b2lkKQorI2Vsc2UKK2NsZWFyU291cmNlV2luZG93c0RldGFpbCAoKQorI2VuZGlmCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCAoc291cmNlV2luZG93cyAoKSktPmNvdW50OyBpKyspCisgICAgY2xlYXJXaW5EZXRhaWwgKChUdWlXaW5JbmZvUHRyKSAoc291cmNlV2luZG93cyAoKSktPmxpc3RbaV0pOworCisgIHJldHVybjsKK30JCQkJLyogY3VycmVudFNvdXJjZVdpbmRvd3MgKi8KKworCisvKgorKiogYWRkU291cmNlV2luZG93VG9MaXN0KCkuCisqKiAgICAgICBBZGQgYSB3aW5kb3cgdG8gdGhlIGxpc3Qgb2Ygc291cmNlIHdpbmRvd3MuICBVc3VhbGx5IHRoZXJlIGlzCisqKiAgICAgICBvbmx5IG9uZSBzb3VyY2Ugd2luZG93IChlaXRoZXIgc291cmNlIG9yIGRpc2Fzc2VtYmx5KSwgYnV0CisqKiAgICAgICBib3RoIGNhbiBiZSBkaXNwbGF5ZWQgYXQgdGhlIHNhbWUgdGltZS4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK2FkZFRvU291cmNlV2luZG93cyAoCisJCSAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvKQorI2Vsc2UKK2FkZFRvU291cmNlV2luZG93cyAod2luSW5mbykKKyAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvOworI2VuZGlmCit7CisgIGlmIChfc291cmNlV2luZG93cy5jb3VudCA8IDIpCisgICAgX3NvdXJjZVdpbmRvd3MubGlzdFtfc291cmNlV2luZG93cy5jb3VudCsrXSA9IChPcGFxdWUpIHdpbkluZm87CisKKyAgcmV0dXJuOworfQkJCQkvKiBhZGRUb1NvdXJjZVdpbmRvd3MgKi8KKworCisvKgorKiogY2xlYXJXaW5EZXRhaWwoKQorKiogICAgICAgIENsZWFyIHRoZSBwZXJ0aW5hbnQgZGV0YWlsIGluIHRoZSB3aW5kb3dzLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXworY2xlYXJXaW5EZXRhaWwgKAorCQkgVHVpV2luSW5mb1B0ciB3aW5JbmZvKQorI2Vsc2UKK2NsZWFyV2luRGV0YWlsICh3aW5JbmZvKQorICAgICBUdWlXaW5JbmZvUHRyIHdpbkluZm87CisjZW5kaWYKK3sKKyAgaWYgKG1fd2luUHRyTm90TnVsbCAod2luSW5mbykpCisgICAgeworICAgICAgc3dpdGNoICh3aW5JbmZvLT5nZW5lcmljLnR5cGUpCisJeworCWNhc2UgU1JDX1dJTjoKKwljYXNlIERJU0FTU0VNX1dJTjoKKwkgIHdpbkluZm8tPmRldGFpbC5zb3VyY2VJbmZvLnN0YXJ0TGluZU9yQWRkci5hZGRyID0gKE9wYXF1ZSkgTlVMTDsKKwkgIHdpbkluZm8tPmRldGFpbC5zb3VyY2VJbmZvLmhvcml6b250YWxPZmZzZXQgPSAwOworCSAgYnJlYWs7CisJY2FzZSBDTURfV0lOOgorCSAgd2luSW5mby0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1ckxpbmUgPQorCSAgICB3aW5JbmZvLT5kZXRhaWwuY29tbWFuZEluZm8uY3VyY2ggPSAwOworCSAgYnJlYWs7CisJY2FzZSBEQVRBX1dJTjoKKwkgIHdpbkluZm8tPmRldGFpbC5kYXRhRGlzcGxheUluZm8uZGF0YUNvbnRlbnQgPQorCSAgICAoVHVpV2luQ29udGVudCkgTlVMTDsKKwkgIHdpbkluZm8tPmRldGFpbC5kYXRhRGlzcGxheUluZm8uZGF0YUNvbnRlbnRDb3VudCA9IDA7CisJICB3aW5JbmZvLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb250ZW50ID0KKwkgICAgKFR1aVdpbkNvbnRlbnQpIE5VTEw7CisJICB3aW5JbmZvLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb250ZW50Q291bnQgPSAwOworCSAgd2luSW5mby0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzRGlzcGxheVR5cGUgPQorCSAgICBUVUlfVU5ERUZJTkVEX1JFR1M7CisJICB3aW5JbmZvLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb2x1bW5Db3VudCA9IDE7CisJICB3aW5JbmZvLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLmRpc3BsYXlSZWdzID0gRkFMU0U7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIGNsZWFyV2luRGV0YWlsICovCisKKworLyoKKyoqIGJsYW5rU3RyKCkKKyoqICAgICAgICBBY2Nlc3NvciBmb3IgdGhlIGJsYW5rIHN0cmluZy4KKyovCitjaGFyICoKKyNpZmRlZiBfX1NURENfXworYmxhbmtTdHIgKHZvaWQpCisjZWxzZQorYmxhbmtTdHIgKCkKKyNlbmRpZgoreworICByZXR1cm4gX3R1aUJsYW5rU3RyOworfQkJCQkvKiBibGFua1N0ciAqLworCisKKy8qCisqKiBsb2NhdGlvblN0cigpCisqKiAgICAgICAgQWNjZXNzb3IgZm9yIHRoZSBsb2NhdGlvbiBzdHJpbmcuCisqLworY2hhciAqCisjaWZkZWYgX19TVERDX18KK2xvY2F0aW9uU3RyICh2b2lkKQorI2Vsc2UKK2xvY2F0aW9uU3RyICgpCisjZW5kaWYKK3sKKyAgcmV0dXJuIF90dWlMb2NhdGlvblN0cjsKK30JCQkJLyogbG9jYXRpb25TdHIgKi8KKworCisvKgorKiogYnJlYWtTdHIoKQorKiogICAgICAgIEFjY2Vzc29yIGZvciB0aGUgYnJlYWsgc3RyaW5nLgorKi8KK2NoYXIgKgorI2lmZGVmIF9fU1REQ19fCiticmVha1N0ciAodm9pZCkKKyNlbHNlCiticmVha1N0ciAoKQorI2VuZGlmCit7CisgIHJldHVybiBfdHVpQnJlYWtTdHI7Cit9CQkJCS8qIGJyZWFrU3RyICovCisKKworLyoKKyoqIGJyZWFrTG9jYXRpb25TdHIoKQorKiogICAgICAgIEFjY2Vzc29yIGZvciB0aGUgYnJlYWtMb2NhdGlvbiBzdHJpbmcuCisqLworY2hhciAqCisjaWZkZWYgX19TVERDX18KK2JyZWFrTG9jYXRpb25TdHIgKHZvaWQpCisjZWxzZQorYnJlYWtMb2NhdGlvblN0ciAoKQorI2VuZGlmCit7CisgIHJldHVybiBfdHVpQnJlYWtMb2NhdGlvblN0cjsKK30JCQkJLyogYnJlYWtMb2NhdGlvblN0ciAqLworCisKKy8qCisqKiBudWxsU3RyKCkKKyoqICAgICAgICBBY2Nlc3NvciBmb3IgdGhlIG51bGwgc3RyaW5nLgorKi8KK2NoYXIgKgorI2lmZGVmIF9fU1REQ19fCitudWxsU3RyICh2b2lkKQorI2Vsc2UKK251bGxTdHIgKCkKKyNlbmRpZgoreworICByZXR1cm4gX3R1aU51bGxTdHI7Cit9CQkJCS8qIG51bGxTdHIgKi8KKworCisvKgorKiogc291cmNlRXhlY0luZm9QdHIoKS4KKyoqICAgICAgICBBY2Nlc3NvciBmb3IgdGhlIHNvdXJjZSBleGVjdXRpb24gaW5mbyBwdHIuCisqLworVHVpR2VuV2luSW5mb1B0cgorI2lmZGVmIF9fU1REQ19fCitzb3VyY2VFeGVjSW5mb1dpblB0ciAodm9pZCkKKyNlbHNlCitzb3VyY2VFeGVjSW5mb1dpblB0ciAoKQorI2VuZGlmCit7CisgIHJldHVybiAmX2V4ZWNJbmZvWzBdOworfQkJCQkvKiBzb3VyY2VFeGVjSW5mb1dpblB0ciAqLworCisKKy8qCisqKiBkaXNhc3NlbUV4ZWNJbmZvUHRyKCkuCisqKiAgICAgICAgQWNjZXNzb3IgZm9yIHRoZSBkaXNhc3NlbSBleGVjdXRpb24gaW5mbyBwdHIuCisqLworVHVpR2VuV2luSW5mb1B0cgorI2lmZGVmIF9fU1REQ19fCitkaXNhc3NlbUV4ZWNJbmZvV2luUHRyICh2b2lkKQorI2Vsc2UKK2Rpc2Fzc2VtRXhlY0luZm9XaW5QdHIgKCkKKyNlbmRpZgoreworICByZXR1cm4gJl9leGVjSW5mb1sxXTsKK30JCQkJLyogZGlzYXNzZW1FeGVjSW5mb1dpblB0ciAqLworCisKKy8qCisqKiBsb2NhdG9yV2luSW5mb1B0cigpLgorKiogICAgICAgIEFjY2Vzc29yIGZvciB0aGUgbG9jYXRvciB3aW4gaW5mby4gIEFuc3dlcnMgYSBwb2ludGVyIHRvIHRoZQorKiogICAgICAgIHN0YXRpYyBsb2NhdG9yIHdpbiBpbmZvIHN0cnVjdC4KKyovCitUdWlHZW5XaW5JbmZvUHRyCisjaWZkZWYgX19TVERDX18KK2xvY2F0b3JXaW5JbmZvUHRyICh2b2lkKQorI2Vsc2UKK2xvY2F0b3JXaW5JbmZvUHRyICgpCisjZW5kaWYKK3sKKyAgcmV0dXJuICZfbG9jYXRvcjsKK30JCQkJLyogbG9jYXRvcldpbkluZm9QdHIgKi8KKworCisvKgorKiogaGlzdG9yeUxpbWl0KCkuCisqKiAgICAgICAgQWNjZXNzb3IgZm9yIHRoZSBoaXN0b3J5IGxpbWl0CisqLworaW50CisjaWZkZWYgX19TVERDX18KK2hpc3RvcnlMaW1pdCAodm9pZCkKKyNlbHNlCitoaXN0b3J5TGltaXQgKCkKKyNlbmRpZgoreworICByZXR1cm4gX2hpc3RvcnlMaW1pdDsKK30JCQkJLyogaGlzdG9yeUxpbWl0ICovCisKKworLyoKKyoqIHNldEhpc3RvcnlMaW1pdFRvKCkuCisqKiAgICAgICAgTXV0YXRvciBmb3IgdGhlIGhpc3RvcnkgbGltaXQKKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3NldEhpc3RvcnlMaW1pdFRvICgKKwkJICAgIGludCBoKQorI2Vsc2UKK3NldEhpc3RvcnlMaW1pdFRvIChoKQorICAgICBpbnQgaDsKKyNlbmRpZgoreworICBfaGlzdG9yeUxpbWl0ID0gaDsKKworICByZXR1cm47Cit9CQkJCS8qIHNldEhpc3RvcnlMaW1pdFRvICovCisKKy8qCisqKiB0ZXJtSGVpZ2h0KCkuCisqKiAgICAgICAgQWNjZXNzb3IgZm9yIHRoZSB0ZXJtSGVpZ2h0CisqLworaW50CisjaWZkZWYgX19TVERDX18KK3Rlcm1IZWlnaHQgKHZvaWQpCisjZWxzZQordGVybUhlaWdodCAoKQorI2VuZGlmCit7CisgIHJldHVybiBfdGVybUhlaWdodDsKK30JCQkJLyogdGVybUhlaWdodCAqLworCisKKy8qCisqKiBzZXRUZXJtSGVpZ2h0VG8oKS4KKyoqICAgICAgICBNdXRhdG9yIGZvciB0aGUgdGVybSBoZWlnaHQKKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3NldFRlcm1IZWlnaHRUbyAoCisJCSAgaW50IGgpCisjZWxzZQorc2V0VGVybUhlaWdodFRvIChoKQorICAgICBpbnQgaDsKKyNlbmRpZgoreworICBfdGVybUhlaWdodCA9IGg7CisKKyAgcmV0dXJuOworfQkJCQkvKiBzZXRUZXJtSGVpZ2h0VG8gKi8KKworCisvKgorKiogdGVybVdpZHRoKCkuCisqKiAgICAgICAgQWNjZXNzb3IgZm9yIHRoZSB0ZXJtV2lkdGgKKyovCitpbnQKKyNpZmRlZiBfX1NURENfXwordGVybVdpZHRoICh2b2lkKQorI2Vsc2UKK3Rlcm1XaWR0aCAoKQorI2VuZGlmCit7CisgIHJldHVybiBfdGVybVdpZHRoOworfQkJCQkvKiB0ZXJtV2lkdGggKi8KKworCisvKgorKiogc2V0VGVybVdpZHRoKCkuCisqKiAgICAgICAgTXV0YXRvciBmb3IgdGhlIHRlcm1XaWR0aAorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXworc2V0VGVybVdpZHRoVG8gKAorCQkgaW50IHcpCisjZWxzZQorc2V0VGVybVdpZHRoVG8gKHcpCisgICAgIGludCB3OworI2VuZGlmCit7CisgIF90ZXJtV2lkdGggPSB3OworCisgIHJldHVybjsKK30JCQkJLyogc2V0VGVybVdpZHRoVG8gKi8KKworCisvKgorKiogY3VycmVudExheW91dCgpLgorKiogICAgICAgIEFjY2Vzc29yIGZvciB0aGUgY3VycmVudCBsYXlvdXQKKyovCitUdWlMYXlvdXRUeXBlCisjaWZkZWYgX19TVERDX18KK2N1cnJlbnRMYXlvdXQgKHZvaWQpCisjZWxzZQorY3VycmVudExheW91dCAoKQorI2VuZGlmCit7CisgIHJldHVybiBfY3VycmVudExheW91dDsKK30JCQkJLyogY3VycmVudExheW91dCAqLworCisKKy8qCisqKiBzZXRDdXJyZW50TGF5b3V0VG8oKS4KKyoqICAgICAgICBNdXRhdG9yIGZvciB0aGUgY3VycmVudCBsYXlvdXQKKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3NldEN1cnJlbnRMYXlvdXRUbyAoCisJCSAgICAgVHVpTGF5b3V0VHlwZSBuZXdMYXlvdXQpCisjZWxzZQorc2V0Q3VycmVudExheW91dFRvIChuZXdMYXlvdXQpCisgICAgIFR1aUxheW91dFR5cGUgbmV3TGF5b3V0OworI2VuZGlmCit7CisgIF9jdXJyZW50TGF5b3V0ID0gbmV3TGF5b3V0OworCisgIHJldHVybjsKK30JCQkJLyogc2V0Q3VycmVudExheW91dFRvICovCisKKworLyoKKyoqIHNldEdlbldpbk9yaWdpbigpLgorKiogICAgICAgIFNldCB0aGUgb3JpZ2luIG9mIHRoZSB3aW5kb3cKKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3NldEdlbldpbk9yaWdpbiAoCisJCSAgVHVpR2VuV2luSW5mb1B0ciB3aW5JbmZvLAorCQkgIGludCB4LAorCQkgIGludCB5KQorI2Vsc2UKK3NldEdlbldpbk9yaWdpbiAod2luSW5mbywgeCwgeSkKKyAgICAgVHVpR2VuV2luSW5mb1B0ciB3aW5JbmZvOworICAgICBpbnQgeDsKKyAgICAgaW50IHk7CisjZW5kaWYKK3sKKyAgd2luSW5mby0+b3JpZ2luLnggPSB4OworICB3aW5JbmZvLT5vcmlnaW4ueSA9IHk7CisKKyAgcmV0dXJuOworfQkJCQkvKiBzZXRHZW5XaW5PcmlnaW4gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIE9USEVSIFBVQkxJQyBGVU5DVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qCisqKiB0dWlOZXh0V2luKCkuCisqKiAgICAgICAgQW5zd2VyIHRoZSBuZXh0IHdpbmRvdyBpbiB0aGUgbGlzdCwgY3ljbGluZyBiYWNrIHRvIHRoZSB0b3AKKyoqICAgICAgICBpZiBuZWNlc3NhcnkKKyovCitUdWlXaW5JbmZvUHRyCisjaWZkZWYgX19TVERDX18KK3R1aU5leHRXaW4gKAorCSAgICAgVHVpV2luSW5mb1B0ciBjdXJXaW4pCisjZWxzZQordHVpTmV4dFdpbiAoY3VyV2luKQorICAgICBUdWlXaW5JbmZvUHRyIGN1cldpbjsKKyNlbmRpZgoreworICBUdWlXaW5UeXBlIHR5cGUgPSBjdXJXaW4tPmdlbmVyaWMudHlwZTsKKyAgVHVpV2luSW5mb1B0ciBuZXh0V2luID0gKFR1aVdpbkluZm9QdHIpIE5VTEw7CisKKyAgaWYgKGN1cldpbi0+Z2VuZXJpYy50eXBlID09IENNRF9XSU4pCisgICAgdHlwZSA9IFNSQ19XSU47CisgIGVsc2UKKyAgICB0eXBlID0gY3VyV2luLT5nZW5lcmljLnR5cGUgKyAxOworICB3aGlsZSAodHlwZSAhPSBjdXJXaW4tPmdlbmVyaWMudHlwZSAmJiBtX3dpblB0cklzTnVsbCAobmV4dFdpbikpCisgICAgeworICAgICAgaWYgKHdpbkxpc3RbdHlwZV0tPmdlbmVyaWMuaXNWaXNpYmxlKQorCW5leHRXaW4gPSB3aW5MaXN0W3R5cGVdOworICAgICAgZWxzZQorCXsKKwkgIGlmICh0eXBlID09IENNRF9XSU4pCisJICAgIHR5cGUgPSBTUkNfV0lOOworCSAgZWxzZQorCSAgICB0eXBlKys7CisJfQorICAgIH0KKworICByZXR1cm4gbmV4dFdpbjsKK30JCQkJLyogdHVpTmV4dFdpbiAqLworCisKKy8qCisqKiB0dWlQcmV2V2luKCkuCisqKiAgICAgICAgQW5zd2VyIHRoZSBwcmV2IHdpbmRvdyBpbiB0aGUgbGlzdCwgY3ljbGluZyBiYWNrIHRvIHRoZSBib3R0b20KKyoqICAgICAgICBpZiBuZWNlc3NhcnkKKyovCitUdWlXaW5JbmZvUHRyCisjaWZkZWYgX19TVERDX18KK3R1aVByZXZXaW4gKAorCSAgICAgVHVpV2luSW5mb1B0ciBjdXJXaW4pCisjZWxzZQordHVpUHJldldpbiAoY3VyV2luKQorICAgICBUdWlXaW5JbmZvUHRyIGN1cldpbjsKKyNlbmRpZgoreworICBUdWlXaW5UeXBlIHR5cGUgPSBjdXJXaW4tPmdlbmVyaWMudHlwZTsKKyAgVHVpV2luSW5mb1B0ciBwcmV2ID0gKFR1aVdpbkluZm9QdHIpIE5VTEw7CisKKyAgaWYgKGN1cldpbi0+Z2VuZXJpYy50eXBlID09IFNSQ19XSU4pCisgICAgdHlwZSA9IENNRF9XSU47CisgIGVsc2UKKyAgICB0eXBlID0gY3VyV2luLT5nZW5lcmljLnR5cGUgLSAxOworICB3aGlsZSAodHlwZSAhPSBjdXJXaW4tPmdlbmVyaWMudHlwZSAmJiBtX3dpblB0cklzTnVsbCAocHJldikpCisgICAgeworICAgICAgaWYgKHdpbkxpc3RbdHlwZV0tPmdlbmVyaWMuaXNWaXNpYmxlKQorCXByZXYgPSB3aW5MaXN0W3R5cGVdOworICAgICAgZWxzZQorCXsKKwkgIGlmICh0eXBlID09IFNSQ19XSU4pCisJICAgIHR5cGUgPSBDTURfV0lOOworCSAgZWxzZQorCSAgICB0eXBlLS07CisJfQorICAgIH0KKworICByZXR1cm4gcHJldjsKK30JCQkJLyogdHVpUHJldldpbiAqLworCisKKy8qCisqKiBkaXNwbGF5YWJsZVdpbkNvbnRlbnRPZigpLgorKiogICAgICAgIEFuc3dlciBhIHRoZSBjb250ZW50IGF0IHRoZSBsb2NhdGlvbiBpbmRpY2F0ZWQgYnkgaW5kZXguICBOb3RlCisqKiAgICAgICAgdGhhdCBpZiB0aGlzIGlzIGEgbG9jYXRvciB3aW5kb3csIHRoZSBzdHJpbmcgcmV0dXJuZWQgc2hvdWxkIGJlCisqKiAgICAgICAgZnJlZWQgYWZ0ZXIgdXNlLgorKi8KK2NoYXIgKgorI2lmZGVmIF9fU1REQ19fCitkaXNwbGF5YWJsZVdpbkNvbnRlbnRPZiAoCisJCQkgIFR1aUdlbldpbkluZm9QdHIgd2luSW5mbywKKwkJCSAgVHVpV2luRWxlbWVudFB0ciBlbGVtZW50UHRyKQorI2Vsc2UKK2Rpc3BsYXlhYmxlV2luQ29udGVudE9mICh3aW5JbmZvLCBlbGVtZW50UHRyKQorICAgICBUdWlHZW5XaW5JbmZvUHRyIHdpbkluZm87CisgICAgIFR1aVdpbkVsZW1lbnRQdHIgZWxlbWVudFB0cjsKKyNlbmRpZgoreworCisgIGNoYXIgKnN0cmluZyA9IG51bGxTdHIgKCk7CisKKyAgaWYgKGVsZW1lbnRQdHIgIT0gKFR1aVdpbkVsZW1lbnRQdHIpIE5VTEwgfHwgd2luSW5mby0+dHlwZSA9PSBMT0NBVE9SX1dJTikKKyAgICB7CisgICAgICAvKgorICAgICAgICAqKiBOb3cgY29udmVydCB0aGUgbGluZSB0byBhIGRpc3BsYXlhYmxlIHN0cmluZworICAgICAgICAqLworICAgICAgc3dpdGNoICh3aW5JbmZvLT50eXBlKQorCXsKKwljYXNlIFNSQ19XSU46CisJY2FzZSBESVNBU1NFTV9XSU46CisJICBzdHJpbmcgPSBlbGVtZW50UHRyLT53aGljaEVsZW1lbnQuc291cmNlLmxpbmU7CisJICBicmVhazsKKwljYXNlIENNRF9XSU46CisJICBzdHJpbmcgPSBlbGVtZW50UHRyLT53aGljaEVsZW1lbnQuY29tbWFuZC5saW5lOworCSAgYnJlYWs7CisJY2FzZSBMT0NBVE9SX1dJTjoKKwkgIGlmICgoc3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoCisJCSAgICAgICh0ZXJtV2lkdGggKCkgKyAxKSAqIHNpemVvZiAoY2hhcikpKSA9PSAoY2hhciAqKSBOVUxMKQorCSAgICAgIHN0cmluZyA9IG51bGxTdHIgKCk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjaGFyIGxpbmVOb1s1MF0sIHBjWzUwXSwgYnVmWzUwXSwgKmZuYW1lLCAqcG5hbWU7CisJICAgICAgcmVnaXN0ZXIgaW50IHN0clNpemUgPSB0ZXJtV2lkdGggKCksIGksIHByb2NXaWR0aCwgZmlsZVdpZHRoOworCisJICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgKiogRmlyc3QgZGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgZmlsZS9wcm9jIG5hbWUgd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgKiogd2UgaGF2ZSBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgKi8KKwkgICAgICBpID0gc3RyU2l6ZSAtIChQQ19XSURUSCArIExJTkVfV0lEVEgKKwkJCSAgICAgKyAyNQkvKiBwYyBhbmQgbGluZSBsYWJlbHMgKi8KKwkJCSAgICAgKyBzdHJsZW4gKEZJTEVfUFJFRklYKSArIDEJLyogZmlsZSBsYWJlbCAqLworCQkJICAgICArIDE1IC8qIHByb2NlZHVyZSBsYWJlbCAqLyApOworCSAgICAgIGlmIChpID49IEZJTEVfV0lEVEggKyBQUk9DX1dJRFRIKQorCQl7CisJCSAgZmlsZVdpZHRoID0gRklMRV9XSURUSDsKKwkJICBwcm9jV2lkdGggPSBQUk9DX1dJRFRIOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgZmlsZVdpZHRoID0gaSAvIDI7CisJCSAgcHJvY1dpZHRoID0gaSAtIGZpbGVXaWR0aDsKKwkJfQorCisJICAgICAgLyogTm93IGNvbnZlcnQgZWxlbWVudHMgdG8gc3RyaW5nIGZvcm0gKi8KKwkgICAgICBpZiAoZWxlbWVudFB0ciAhPSAoVHVpV2luRWxlbWVudFB0cikgTlVMTCAmJgorCQkgICplbGVtZW50UHRyLT53aGljaEVsZW1lbnQubG9jYXRvci5maWxlTmFtZSAhPSAoY2hhcikgMCAmJgorCQkgIHNyY1dpbi0+Z2VuZXJpYy5pc1Zpc2libGUpCisJCWZuYW1lID0gZWxlbWVudFB0ci0+d2hpY2hFbGVtZW50LmxvY2F0b3IuZmlsZU5hbWU7CisJICAgICAgZWxzZQorCQlmbmFtZSA9ICI/PyI7CisJICAgICAgaWYgKGVsZW1lbnRQdHIgIT0gKFR1aVdpbkVsZW1lbnRQdHIpIE5VTEwgJiYKKwkJICAqZWxlbWVudFB0ci0+d2hpY2hFbGVtZW50LmxvY2F0b3IucHJvY05hbWUgIT0gKGNoYXIpIDApCisJCXBuYW1lID0gZWxlbWVudFB0ci0+d2hpY2hFbGVtZW50LmxvY2F0b3IucHJvY05hbWU7CisJICAgICAgZWxzZQorCQlwbmFtZSA9ICI/PyI7CisJICAgICAgaWYgKGVsZW1lbnRQdHIgIT0gKFR1aVdpbkVsZW1lbnRQdHIpIE5VTEwgJiYKKwkJICBlbGVtZW50UHRyLT53aGljaEVsZW1lbnQubG9jYXRvci5saW5lTm8gPiAwKQorCQlzcHJpbnRmIChsaW5lTm8sICIlZCIsCisJCQkgZWxlbWVudFB0ci0+d2hpY2hFbGVtZW50LmxvY2F0b3IubGluZU5vKTsKKwkgICAgICBlbHNlCisJCXN0cmNweSAobGluZU5vLCAiPz8iKTsKKwkgICAgICBpZiAoZWxlbWVudFB0ciAhPSAoVHVpV2luRWxlbWVudFB0cikgTlVMTCAmJgorCQkgIGVsZW1lbnRQdHItPndoaWNoRWxlbWVudC5sb2NhdG9yLmFkZHIgPiAoT3BhcXVlKSAwKQorCQlzcHJpbnRmIChwYywgIjB4JXgiLAorCQkJIGVsZW1lbnRQdHItPndoaWNoRWxlbWVudC5sb2NhdG9yLmFkZHIpOworCSAgICAgIGVsc2UKKwkJc3RyY3B5IChwYywgIj8/Iik7CisJICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgKiogTm93IGNyZWF0ZSB0aGUgbG9jYXRvciBsaW5lIGZyb20gdGhlIHN0cmluZyB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICoqIG9mIHRoZSBlbGVtZW50cy4gIFdlIGNvdWxkIHVzZSBzcHJpbnRmKCkgaGVyZSBidXQKKyAgICAgICAgICAgICAgICAgICAgKiogdGhhdCB3b3VsZG4ndCBlbnN1cmUgdGhhdCB3ZSBkb24ndCBvdmVycnVuIHRoZSBzaXplCisgICAgICAgICAgICAgICAgICAgICoqIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiAgc3RyY2F0X3RvX2J1ZigpIHdpbGwuCisgICAgICAgICAgICAgICAgICAgICovCisJICAgICAgKnN0cmluZyA9IChjaGFyKSAwOworCSAgICAgIC8qIEZpbGVuYW1lICovCisJICAgICAgc3RyY2F0X3RvX2J1ZiAoc3RyaW5nLCBzdHJTaXplLCAiICIpOworCSAgICAgIHN0cmNhdF90b19idWYgKHN0cmluZywgc3RyU2l6ZSwgRklMRV9QUkVGSVgpOworCSAgICAgIGlmIChzdHJsZW4gKGZuYW1lKSA+IGZpbGVXaWR0aCkKKwkJeworCQkgIHN0cm5jcHkgKGJ1ZiwgZm5hbWUsIGZpbGVXaWR0aCAtIDEpOworCQkgIGJ1ZltmaWxlV2lkdGggLSAxXSA9ICcqJzsKKwkJICBidWZbZmlsZVdpZHRoXSA9IChjaGFyKSAwOworCQl9CisJICAgICAgZWxzZQorCQlzdHJjcHkgKGJ1ZiwgZm5hbWUpOworCSAgICAgIHN0cmNhdF90b19idWYgKHN0cmluZywgc3RyU2l6ZSwgYnVmKTsKKwkgICAgICAvKiBwcm9jZWR1cmUvY2xhc3MgbmFtZSAqLworCSAgICAgIHNwcmludGYgKGJ1ZiwgIiUxNXMiLCBQUk9DX1BSRUZJWCk7CisJICAgICAgc3RyY2F0X3RvX2J1ZiAoc3RyaW5nLCBzdHJTaXplLCBidWYpOworCSAgICAgIGlmIChzdHJsZW4gKHBuYW1lKSA+IHByb2NXaWR0aCkKKwkJeworCQkgIHN0cm5jcHkgKGJ1ZiwgcG5hbWUsIHByb2NXaWR0aCAtIDEpOworCQkgIGJ1Zltwcm9jV2lkdGggLSAxXSA9ICcqJzsKKwkJICBidWZbcHJvY1dpZHRoXSA9IChjaGFyKSAwOworCQl9CisJICAgICAgZWxzZQorCQlzdHJjcHkgKGJ1ZiwgcG5hbWUpOworCSAgICAgIHN0cmNhdF90b19idWYgKHN0cmluZywgc3RyU2l6ZSwgYnVmKTsKKwkgICAgICBzcHJpbnRmIChidWYsICIlMTBzIiwgTElORV9QUkVGSVgpOworCSAgICAgIHN0cmNhdF90b19idWYgKHN0cmluZywgc3RyU2l6ZSwgYnVmKTsKKwkgICAgICBzdHJjYXRfdG9fYnVmIChzdHJpbmcsIHN0clNpemUsIGxpbmVObyk7CisJICAgICAgc3ByaW50ZiAoYnVmLCAiJTEwcyIsIFBDX1BSRUZJWCk7CisJICAgICAgc3RyY2F0X3RvX2J1ZiAoc3RyaW5nLCBzdHJTaXplLCBidWYpOworCSAgICAgIHN0cmNhdF90b19idWYgKHN0cmluZywgc3RyU2l6ZSwgcGMpOworCSAgICAgIGZvciAoaSA9IHN0cmxlbiAoc3RyaW5nKTsgaSA8IHN0clNpemU7IGkrKykKKwkJc3RyaW5nW2ldID0gJyAnOworCSAgICAgIHN0cmluZ1tzdHJTaXplXSA9IChjaGFyKSAwOworCSAgICB9CisJICBicmVhazsKKwljYXNlIEVYRUNfSU5GT19XSU46CisJICBzdHJpbmcgPSBlbGVtZW50UHRyLT53aGljaEVsZW1lbnQuc2ltcGxlU3RyaW5nOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIHJldHVybiBzdHJpbmc7Cit9CQkJCS8qIGRpc3BsYXlhYmxlV2luQ29udGVudE9mICovCisKKworLyoKKyoqICAgIHdpbkNvbnRlbnRBdCgpLgorKiogICAgICAgIEFuc3dlciBhIHRoZSBjb250ZW50IGF0IHRoZSBsb2NhdGlvbiBpbmRpY2F0ZWQgYnkgaW5kZXgKKyovCitjaGFyICoKKyNpZmRlZiBfX1NURENfXworZGlzcGxheWFibGVXaW5Db250ZW50QXQgKAorCQkJICBUdWlHZW5XaW5JbmZvUHRyIHdpbkluZm8sCisJCQkgIGludCBpbmRleCkKKyNlbHNlCitkaXNwbGF5YWJsZVdpbkNvbnRlbnRBdCAod2luSW5mbywgaW5kZXgpCisgICAgIFR1aUdlbldpbkluZm9QdHIgd2luSW5mbzsKKyAgICAgaW50IGluZGV4OworI2VuZGlmCit7CisgIHJldHVybiAoZGlzcGxheWFibGVXaW5Db250ZW50T2YgKHdpbkluZm8sIChUdWlXaW5FbGVtZW50UHRyKSB3aW5JbmZvLT5jb250ZW50W2luZGV4XSkpOworfQkJCQkvKiB3aW5Db250ZW50QXQgKi8KKworCisvKgorKiogd2luRWxlbWVudEhlaWdodCgpLgorKiogICAgICAgIEFuc3dlciB0aGUgaGVpZ2h0IG9mIHRoZSBlbGVtZW50IGluIGxpbmVzCisqLworaW50CisjaWZkZWYgX19TVERDX18KK3dpbkVsZW1lbnRIZWlnaHQgKAorCQkgICBUdWlHZW5XaW5JbmZvUHRyIHdpbkluZm8sCisJCSAgIFR1aVdpbkVsZW1lbnRQdHIgZWxlbWVudCkKKyNlbHNlCit3aW5FbGVtZW50SGVpZ2h0ICh3aW5JbmZvLCBlbGVtZW50KQorICAgICBUdWlHZW5XaW5JbmZvUHRyIHdpbkluZm87CisgICAgIFR1aVdpbkVsZW1lbnRQdHIgZWxlbWVudDsKKyNlbmRpZgoreworICBpbnQgaDsKKworICBpZiAod2luSW5mby0+dHlwZSA9PSBEQVRBX1dJTikKKy8qIEZPUiBOT1cgU0FZIElUIElTIE9OTFkgT05FIExJTkUgSElHSCAqLworICAgIGggPSAxOworICBlbHNlCisgICAgaCA9IDE7CisKKyAgcmV0dXJuIGg7Cit9CQkJCS8qIHdpbkVsZW1lbnRIZWlnaHQgKi8KKworCisvKgorKiogIHdpbkJ5TmFtZSgpLgorKiogICAgICBBbnN3ZXIgdGhlIHdpbmRvdyByZXByZXNlbnRlZCBieSBuYW1lCisqLworVHVpV2luSW5mb1B0cgorI2lmZGVmIF9fU1REQ19fCit3aW5CeU5hbWUgKAorCSAgICBjaGFyICpuYW1lKQorI2Vsc2UKK3dpbkJ5TmFtZSAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKKyNlbmRpZgoreworICBUdWlXaW5JbmZvUHRyIHdpbkluZm8gPSAoVHVpV2luSW5mb1B0cikgTlVMTDsKKyAgaW50IGkgPSAwOworCisgIHdoaWxlIChpIDwgTUFYX01BSk9SX1dJTkRPV1MgJiYgbV93aW5QdHJJc051bGwgKHdpbkluZm8pKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHdpbk5hbWUgKCYod2luTGlzdFtpXS0+Z2VuZXJpYykpKSA9PSAwKQorCXdpbkluZm8gPSB3aW5MaXN0W2ldOworICAgICAgaSsrOworICAgIH0KKworICByZXR1cm4gd2luSW5mbzsKK30JCQkJLyogd2luQnlOYW1lICovCisKKworLyoKKyoqICBwYXJ0aWFsV2luQnlOYW1lKCkuCisqKiAgICAgIEFuc3dlciB0aGUgd2luZG93IHJlcHJlc2VudGVkIGJ5IG5hbWUKKyovCitUdWlXaW5JbmZvUHRyCisjaWZkZWYgX19TVERDX18KK3BhcnRpYWxXaW5CeU5hbWUgKAorCQkgICBjaGFyICpuYW1lKQorI2Vsc2UKK3BhcnRpYWxXaW5CeU5hbWUgKG5hbWUpCisgICAgIGNoYXIgKm5hbWU7CisjZW5kaWYKK3sKKyAgVHVpV2luSW5mb1B0ciB3aW5JbmZvID0gKFR1aVdpbkluZm9QdHIpIE5VTEw7CisKKyAgaWYgKG5hbWUgIT0gKGNoYXIgKikgTlVMTCkKKyAgICB7CisgICAgICBpbnQgaSA9IDA7CisKKyAgICAgIHdoaWxlIChpIDwgTUFYX01BSk9SX1dJTkRPV1MgJiYgbV93aW5QdHJJc051bGwgKHdpbkluZm8pKQorCXsKKwkgIGNoYXIgKmN1ck5hbWUgPSB3aW5OYW1lICgmd2luTGlzdFtpXS0+Z2VuZXJpYyk7CisJICBpZiAoc3RybGVuIChuYW1lKSA8PSBzdHJsZW4gKGN1ck5hbWUpICYmCisJICAgICAgc3RybmNtcCAobmFtZSwgY3VyTmFtZSwgc3RybGVuIChuYW1lKSkgPT0gMCkKKwkgICAgd2luSW5mbyA9IHdpbkxpc3RbaV07CisJICBpKys7CisJfQorICAgIH0KKworICByZXR1cm4gd2luSW5mbzsKK30JCQkJLyogcGFydGlhbFdpbkJ5TmFtZSAqLworCisKKy8qCisqKiB3aW5OYW1lKCkuCisqKiAgICAgIEFuc3dlciB0aGUgbmFtZSBvZiB0aGUgd2luZG93CisqLworY2hhciAqCisjaWZkZWYgX19TVERDX18KK3dpbk5hbWUgKAorCSAgVHVpR2VuV2luSW5mb1B0ciB3aW5JbmZvKQorI2Vsc2UKK3dpbk5hbWUgKHdpbkluZm8pCisgICAgIFR1aUdlbldpbkluZm9QdHIgd2luSW5mbzsKKyNlbmRpZgoreworICBjaGFyICpuYW1lID0gKGNoYXIgKikgTlVMTDsKKworICBzd2l0Y2ggKHdpbkluZm8tPnR5cGUpCisgICAgeworICAgIGNhc2UgU1JDX1dJTjoKKyAgICAgIG5hbWUgPSBTUkNfTkFNRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ01EX1dJTjoKKyAgICAgIG5hbWUgPSBDTURfTkFNRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRElTQVNTRU1fV0lOOgorICAgICAgbmFtZSA9IERJU0FTU0VNX05BTUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIERBVEFfV0lOOgorICAgICAgbmFtZSA9IERBVEFfTkFNRTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBuYW1lID0gIiI7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIG5hbWU7Cit9CQkJCS8qIHdpbk5hbWUgKi8KKworCisvKgorKiogaW5pdGlhbGl6ZVN0YXRpY0RhdGEKKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK2luaXRpYWxpemVTdGF0aWNEYXRhICh2b2lkKQorI2Vsc2UKK2luaXRpYWxpemVTdGF0aWNEYXRhICgpCisjZW5kaWYKK3sKKyAgaW5pdEdlbmVyaWNQYXJ0IChzb3VyY2VFeGVjSW5mb1dpblB0ciAoKSk7CisgIGluaXRHZW5lcmljUGFydCAoZGlzYXNzZW1FeGVjSW5mb1dpblB0ciAoKSk7CisgIGluaXRHZW5lcmljUGFydCAobG9jYXRvcldpbkluZm9QdHIgKCkpOworCisgIHJldHVybjsKK30JCQkJLyogaW5pdGlhbGl6ZVN0YXRpY0RhdGEgKi8KKworCisvKgorKiogYWxsb2NHZW5lcmljV2luSW5mbygpLgorKi8KK1R1aUdlbldpbkluZm9QdHIKKyNpZmRlZiBfX1NURENfXworYWxsb2NHZW5lcmljV2luSW5mbyAodm9pZCkKKyNlbHNlCithbGxvY0dlbmVyaWNXaW5JbmZvICgpCisjZW5kaWYKK3sKKyAgVHVpR2VuV2luSW5mb1B0ciB3aW47CisKKyAgaWYgKCh3aW4gPSAoVHVpR2VuV2luSW5mb1B0cikgeG1hbGxvYyAoCisJCSAgICAgc2l6ZW9mIChUdWlHZW5XaW5JbmZvUHRyKSkpICE9IChUdWlHZW5XaW5JbmZvUHRyKSBOVUxMKQorICAgIGluaXRHZW5lcmljUGFydCAod2luKTsKKworICByZXR1cm4gd2luOworfQkJCQkvKiBhbGxvY0dlbmVyaWNXaW5JbmZvICovCisKKworLyoKKyoqIGluaXRHZW5lcmljUGFydCgpLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXworaW5pdEdlbmVyaWNQYXJ0ICgKKwkJICBUdWlHZW5XaW5JbmZvUHRyIHdpbikKKyNlbHNlCitpbml0R2VuZXJpY1BhcnQgKHdpbikKKyAgICAgVHVpR2VuV2luSW5mb1B0ciB3aW47CisjZW5kaWYKK3sKKyAgd2luLT53aWR0aCA9CisgICAgd2luLT5oZWlnaHQgPQorICAgIHdpbi0+b3JpZ2luLnggPQorICAgIHdpbi0+b3JpZ2luLnkgPQorICAgIHdpbi0+dmlld3BvcnRIZWlnaHQgPQorICAgIHdpbi0+Y29udGVudFNpemUgPQorICAgIHdpbi0+bGFzdFZpc2libGVMaW5lID0gMDsKKyAgd2luLT5oYW5kbGUgPSAoV0lORE9XICopIE5VTEw7CisgIHdpbi0+Y29udGVudCA9IChPcGFxdWVQdHIpIE5VTEw7CisgIHdpbi0+Y29udGVudEluVXNlID0KKyAgICB3aW4tPmlzVmlzaWJsZSA9IEZBTFNFOworCisgIHJldHVybjsKK30JCQkJLyogaW5pdEdlbmVyaWNQYXJ0ICovCisKKworLyoKKyoqIGluaXRDb250ZW50RWxlbWVudCgpLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXworaW5pdENvbnRlbnRFbGVtZW50ICgKKwkJICAgICBUdWlXaW5FbGVtZW50UHRyIGVsZW1lbnQsCisJCSAgICAgVHVpV2luVHlwZSB0eXBlKQorI2Vsc2UKK2luaXRDb250ZW50RWxlbWVudCAoZWxlbWVudCwgdHlwZSkKKyAgICAgVHVpV2luRWxlbWVudFB0ciBlbGVtZW50OworICAgICBUdWlXaW5UeXBlIHR5cGU7CisjZW5kaWYKK3sKKyAgZWxlbWVudC0+aGlnaGxpZ2h0ID0gRkFMU0U7CisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSBTUkNfV0lOOgorICAgIGNhc2UgRElTQVNTRU1fV0lOOgorICAgICAgZWxlbWVudC0+d2hpY2hFbGVtZW50LnNvdXJjZS5saW5lID0gKGNoYXIgKikgTlVMTDsKKyAgICAgIGVsZW1lbnQtPndoaWNoRWxlbWVudC5zb3VyY2UubGluZU9yQWRkci5saW5lTm8gPSAwOworICAgICAgZWxlbWVudC0+d2hpY2hFbGVtZW50LnNvdXJjZS5pc0V4ZWNQb2ludCA9IEZBTFNFOworICAgICAgZWxlbWVudC0+d2hpY2hFbGVtZW50LnNvdXJjZS5oYXNCcmVhayA9IEZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBEQVRBX1dJTjoKKyAgICAgIGluaXRHZW5lcmljUGFydCAoJmVsZW1lbnQtPndoaWNoRWxlbWVudC5kYXRhV2luZG93KTsKKyAgICAgIGVsZW1lbnQtPndoaWNoRWxlbWVudC5kYXRhV2luZG93LnR5cGUgPSBEQVRBX0lURU1fV0lOOworICAgICAgKChUdWlHZW5XaW5JbmZvUHRyKSAmIGVsZW1lbnQtPndoaWNoRWxlbWVudC5kYXRhV2luZG93KS0+Y29udGVudCA9CisJKE9wYXF1ZVB0cikgYWxsb2NDb250ZW50ICgxLCBEQVRBX0lURU1fV0lOKTsKKyAgICAgICgoVHVpR2VuV2luSW5mb1B0cikKKyAgICAgICAmIGVsZW1lbnQtPndoaWNoRWxlbWVudC5kYXRhV2luZG93KS0+Y29udGVudFNpemUgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfV0lOOgorICAgICAgZWxlbWVudC0+d2hpY2hFbGVtZW50LmNvbW1hbmQubGluZSA9IChjaGFyICopIE5VTEw7CisgICAgICBicmVhazsKKyAgICBjYXNlIERBVEFfSVRFTV9XSU46CisgICAgICBlbGVtZW50LT53aGljaEVsZW1lbnQuZGF0YS5uYW1lID0gKGNoYXIgKikgTlVMTDsKKyAgICAgIGVsZW1lbnQtPndoaWNoRWxlbWVudC5kYXRhLnR5cGUgPSBUVUlfUkVHSVNURVI7CisgICAgICBlbGVtZW50LT53aGljaEVsZW1lbnQuZGF0YS5pdGVtTm8gPSBVTkRFRklORURfSVRFTTsKKyAgICAgIGVsZW1lbnQtPndoaWNoRWxlbWVudC5kYXRhLnZhbHVlID0gKE9wYXF1ZSkgTlVMTDsKKyAgICAgIGVsZW1lbnQtPndoaWNoRWxlbWVudC5kYXRhLmhpZ2hsaWdodCA9IEZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMT0NBVE9SX1dJTjoKKyAgICAgIGVsZW1lbnQtPndoaWNoRWxlbWVudC5sb2NhdG9yLmZpbGVOYW1lWzBdID0KKwllbGVtZW50LT53aGljaEVsZW1lbnQubG9jYXRvci5wcm9jTmFtZVswXSA9IChjaGFyKSAwOworICAgICAgZWxlbWVudC0+d2hpY2hFbGVtZW50LmxvY2F0b3IubGluZU5vID0gMDsKKyAgICAgIGVsZW1lbnQtPndoaWNoRWxlbWVudC5sb2NhdG9yLmFkZHIgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFWEVDX0lORk9fV0lOOgorICAgICAgZWxlbWVudC0+d2hpY2hFbGVtZW50LnNpbXBsZVN0cmluZyA9IGJsYW5rU3RyICgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuOworfQkJCQkvKiBpbml0Q29udGVudEVsZW1lbnQgKi8KKworLyoKKyoqIGluaXRXaW5JbmZvKCkuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCitpbml0V2luSW5mbyAoCisJICAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvKQorI2Vsc2UKK2luaXRXaW5JbmZvICh3aW5JbmZvKQorICAgICBUdWlXaW5JbmZvUHRyIHdpbkluZm87CisjZW5kaWYKK3sKKyAgaW5pdEdlbmVyaWNQYXJ0ICgmd2luSW5mby0+Z2VuZXJpYyk7CisgIHdpbkluZm8tPmNhbkhpZ2hsaWdodCA9CisgICAgd2luSW5mby0+aXNIaWdobGlnaHRlZCA9IEZBTFNFOworICBzd2l0Y2ggKHdpbkluZm8tPmdlbmVyaWMudHlwZSkKKyAgICB7CisgICAgY2FzZSBTUkNfV0lOOgorICAgIGNhc2UgRElTQVNTRU1fV0lOOgorICAgICAgd2luSW5mby0+ZGV0YWlsLnNvdXJjZUluZm8uZXhlY3V0aW9uSW5mbyA9IChUdWlHZW5XaW5JbmZvUHRyKSBOVUxMOworICAgICAgd2luSW5mby0+ZGV0YWlsLnNvdXJjZUluZm8uaGFzTG9jYXRvciA9IEZBTFNFOworICAgICAgd2luSW5mby0+ZGV0YWlsLnNvdXJjZUluZm8uaG9yaXpvbnRhbE9mZnNldCA9IDA7CisgICAgICB3aW5JbmZvLT5kZXRhaWwuc291cmNlSW5mby5zdGFydExpbmVPckFkZHIuYWRkciA9IChPcGFxdWUpIE5VTEw7CisgICAgICBicmVhazsKKyAgICBjYXNlIERBVEFfV0lOOgorICAgICAgd2luSW5mby0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5kYXRhQ29udGVudCA9IChUdWlXaW5Db250ZW50KSBOVUxMOworICAgICAgd2luSW5mby0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5kYXRhQ29udGVudENvdW50ID0gMDsKKyAgICAgIHdpbkluZm8tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0NvbnRlbnQgPSAoVHVpV2luQ29udGVudCkgTlVMTDsKKyAgICAgIHdpbkluZm8tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0NvbnRlbnRDb3VudCA9IDA7CisgICAgICB3aW5JbmZvLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NEaXNwbGF5VHlwZSA9CisJVFVJX1VOREVGSU5FRF9SRUdTOworICAgICAgd2luSW5mby0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29sdW1uQ291bnQgPSAxOworICAgICAgd2luSW5mby0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5kaXNwbGF5UmVncyA9IEZBTFNFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfV0lOOgorICAgICAgd2luSW5mby0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1ckxpbmUgPSAwOworICAgICAgd2luSW5mby0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1cmNoID0gMDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB3aW5JbmZvLT5kZXRhaWwub3BhcXVlID0gKE9wYXF1ZSkgTlVMTDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIGluaXRXaW5JbmZvICovCisKKworLyoKKyoqIGFsbG9jV2luSW5mbygpLgorKi8KK1R1aVdpbkluZm9QdHIKKyNpZmRlZiBfX1NURENfXworYWxsb2NXaW5JbmZvICgKKwkgICAgICAgVHVpV2luVHlwZSB0eXBlKQorI2Vsc2UKK2FsbG9jV2luSW5mbyAodHlwZSkKKyAgICAgVHVpV2luVHlwZSB0eXBlOworI2VuZGlmCit7CisgIFR1aVdpbkluZm9QdHIgd2luSW5mbyA9IChUdWlXaW5JbmZvUHRyKSBOVUxMOworCisgIHdpbkluZm8gPSAoVHVpV2luSW5mb1B0cikgeG1hbGxvYyAoc2l6ZW9mIChUdWlXaW5JbmZvKSk7CisgIGlmIChtX3dpblB0ck5vdE51bGwgKHdpbkluZm8pKQorICAgIHsKKyAgICAgIHdpbkluZm8tPmdlbmVyaWMudHlwZSA9IHR5cGU7CisgICAgICBpbml0V2luSW5mbyAod2luSW5mbyk7CisgICAgfQorCisgIHJldHVybiB3aW5JbmZvOworfQkJCQkvKiBhbGxvY1dpbkluZm8gKi8KKworCisvKgorKiogYWxsb2NDb250ZW50KCkuCisqKiAgICAgICAgQWxsb2NhdGVzIHRoZSBjb250ZW50IGFuZCBlbGVtZW50cyBpbiBhIGJsb2NrLgorKi8KK1R1aVdpbkNvbnRlbnQKKyNpZmRlZiBfX1NURENfXworYWxsb2NDb250ZW50ICgKKwkgICAgICAgaW50IG51bUVsZW1lbnRzLAorCSAgICAgICBUdWlXaW5UeXBlIHR5cGUpCisjZWxzZQorYWxsb2NDb250ZW50IChudW1FbGVtZW50cywgdHlwZSkKKyAgICAgaW50IG51bUVsZW1lbnRzOworICAgICBUdWlXaW5UeXBlIHR5cGU7CisjZW5kaWYKK3sKKyAgVHVpV2luQ29udGVudCBjb250ZW50ID0gKFR1aVdpbkNvbnRlbnQpIE5VTEw7CisgIGNoYXIgKmVsZW1lbnRCbG9ja1B0ciA9IChjaGFyICopIE5VTEw7CisgIGludCBpOworCisgIGlmICgoY29udGVudCA9IChUdWlXaW5Db250ZW50KQorICB4bWFsbG9jIChzaXplb2YgKFR1aVdpbkVsZW1lbnRQdHIpICogbnVtRWxlbWVudHMpKSAhPSAoVHVpV2luQ29udGVudCkgTlVMTCkKKyAgICB7CQkJCS8qCisgICAgICAgICoqIEFsbCB3aW5kb3dzLCBleGNlcHQgdGhlIGRhdGEgd2luZG93LCBjYW4gYWxsb2NhdGUgdGhlIGVsZW1lbnRzCisgICAgICAgICoqIGluIGEgY2h1bmsuICBUaGUgZGF0YSB3aW5kb3cgY2Fubm90IGJlY2F1c2UgaXRlbXMgY2FuIGJlCisgICAgICAgICoqIGFkZGVkL3JlbW92ZWQgZnJvbSB0aGUgZGF0YSBkaXNwbGF5IGJ5IHRoZSB1c2VyIGF0IGFueSB0aW1lLgorICAgICAgICAqLworICAgICAgaWYgKHR5cGUgIT0gREFUQV9XSU4pCisJeworCSAgaWYgKChlbGVtZW50QmxvY2tQdHIgPSAoY2hhciAqKQorCSAgIHhtYWxsb2MgKHNpemVvZiAoVHVpV2luRWxlbWVudCkgKiBudW1FbGVtZW50cykpICE9IChjaGFyICopIE5VTEwpCisJICAgIHsKKwkgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtRWxlbWVudHM7IGkrKykKKwkJeworCQkgIGNvbnRlbnRbaV0gPSAoVHVpV2luRWxlbWVudFB0cikgZWxlbWVudEJsb2NrUHRyOworCQkgIGluaXRDb250ZW50RWxlbWVudCAoY29udGVudFtpXSwgdHlwZSk7CisJCSAgZWxlbWVudEJsb2NrUHRyICs9IHNpemVvZiAoVHVpV2luRWxlbWVudCk7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgdHVpRnJlZSAoKGNoYXIgKikgY29udGVudCk7CisJICAgICAgY29udGVudCA9IChUdWlXaW5Db250ZW50KSBOVUxMOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm4gY29udGVudDsKK30JCQkJLyogYWxsb2NDb250ZW50ICovCisKKworLyoKKyoqIGFkZENvbnRlbnRFbGVtZW50cygpLgorKiogICAgICAgIEFkZHMgdGhlIGlucHV0IG51bWJlciBvZiBlbGVtZW50cyB0byB0aGUgd2luZG93cydzIGNvbnRlbnQuICBJZgorKiogICAgICAgIG5vIGNvbnRlbnQgaGFzIGJlZW4gYWxsb2NhdGVkIHlldCwgYWxsb2NDb250ZW50KCkgaXMgY2FsbGVkIHRvCisqKiAgICAgICAgZG8gdGhpcy4gIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBhZGRlZCBpcyByZXR1cm5lZCwKKyoqICAgICAgICB1bmxlc3MgdGhlcmUgaXMgYSBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciwgaW4gd2hpY2ggY2FzZSwgKC0xKQorKiogICAgICAgIGlzIHJldHVybmVkLgorKi8KK2ludAorI2lmZGVmIF9fU1REQ19fCithZGRDb250ZW50RWxlbWVudHMgKAorCQkgICAgIFR1aUdlbldpbkluZm9QdHIgd2luSW5mbywKKwkJICAgICBpbnQgbnVtRWxlbWVudHMpCisjZWxzZQorYWRkQ29udGVudEVsZW1lbnRzICh3aW5JbmZvLCBudW1FbGVtZW50cykKKyAgICAgVHVpR2VuV2luSW5mb1B0ciB3aW5JbmZvOworICAgICBpbnQgbnVtRWxlbWVudHM7CisjZW5kaWYKK3sKKyAgVHVpV2luRWxlbWVudFB0ciBlbGVtZW50UHRyOworICBpbnQgaSwgaW5kZXhTdGFydDsKKworICBpZiAod2luSW5mby0+Y29udGVudCA9PSAoT3BhcXVlUHRyKSBOVUxMKQorICAgIHsKKyAgICAgIHdpbkluZm8tPmNvbnRlbnQgPSAoT3BhcXVlUHRyKSBhbGxvY0NvbnRlbnQgKG51bUVsZW1lbnRzLCB3aW5JbmZvLT50eXBlKTsKKyAgICAgIGluZGV4U3RhcnQgPSAwOworICAgIH0KKyAgZWxzZQorICAgIGluZGV4U3RhcnQgPSB3aW5JbmZvLT5jb250ZW50U2l6ZTsKKyAgaWYgKHdpbkluZm8tPmNvbnRlbnQgIT0gKE9wYXF1ZVB0cikgTlVMTCkKKyAgICB7CisgICAgICBmb3IgKGkgPSBpbmRleFN0YXJ0OyAoaSA8IG51bUVsZW1lbnRzICsgaW5kZXhTdGFydCk7IGkrKykKKwl7CisJICBpZiAoKGVsZW1lbnRQdHIgPSAoVHVpV2luRWxlbWVudFB0cikKKwkgICAgICAgeG1hbGxvYyAoc2l6ZW9mIChUdWlXaW5FbGVtZW50KSkpICE9IChUdWlXaW5FbGVtZW50UHRyKSBOVUxMKQorCSAgICB7CisJICAgICAgd2luSW5mby0+Y29udGVudFtpXSA9IChPcGFxdWUpIGVsZW1lbnRQdHI7CisJICAgICAgaW5pdENvbnRlbnRFbGVtZW50IChlbGVtZW50UHRyLCB3aW5JbmZvLT50eXBlKTsKKwkgICAgICB3aW5JbmZvLT5jb250ZW50U2l6ZSsrOworCSAgICB9CisJICBlbHNlCQkJLyogdGhpbmdzIG11c3QgYmUgcmVhbGx5IGhvc2VkIG5vdyEgV2UgcmFuIG91dCBvZiBtZW1vcnkhPyovCisJICAgIHJldHVybiAoLTEpOworCX0KKyAgICB9CisKKyAgcmV0dXJuIGluZGV4U3RhcnQ7Cit9CQkJCS8qIGFkZENvbnRlbnRFbGVtZW50cyAqLworCisKKy8qCisqKiAgdHVpRGVsV2luZG93KCkuCisqKiAgICAgRGVsZXRlIGFsbCBjdXJzZXMgd2luZG93cyBhc3NvY2lhdGVkIHdpdGggd2luSW5mbywgbGVhdmluZyBldmVyeXRoaW5nCisqKiAgICAgZWxzZSBpbiB0YWN0LgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpRGVsV2luZG93ICgKKwkgICAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvKQorI2Vsc2UKK3R1aURlbFdpbmRvdyAod2luSW5mbykKKyAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvOworI2VuZGlmCit7CisgIE9wYXF1ZSBkZXRhaWw7CisgIGludCBpOworICBUdWlHZW5XaW5JbmZvUHRyIGdlbmVyaWNXaW47CisKKworICBzd2l0Y2ggKHdpbkluZm8tPmdlbmVyaWMudHlwZSkKKyAgICB7CisgICAgY2FzZSBTUkNfV0lOOgorICAgIGNhc2UgRElTQVNTRU1fV0lOOgorICAgICAgZ2VuZXJpY1dpbiA9IGxvY2F0b3JXaW5JbmZvUHRyICgpOworICAgICAgaWYgKGdlbmVyaWNXaW4gIT0gKFR1aUdlbldpbkluZm9QdHIpIE5VTEwpCisJeworCSAgdHVpRGVsd2luIChnZW5lcmljV2luLT5oYW5kbGUpOworCSAgZ2VuZXJpY1dpbi0+aGFuZGxlID0gKFdJTkRPVyAqKSBOVUxMOworCSAgZ2VuZXJpY1dpbi0+aXNWaXNpYmxlID0gRkFMU0U7CisJfQorICAgICAgZ2VuZXJpY1dpbiA9IHdpbkluZm8tPmRldGFpbC5zb3VyY2VJbmZvLmV4ZWN1dGlvbkluZm87CisgICAgICBpZiAoZ2VuZXJpY1dpbiAhPSAoVHVpR2VuV2luSW5mb1B0cikgTlVMTCkKKwl7CisJICB0dWlEZWx3aW4gKGdlbmVyaWNXaW4tPmhhbmRsZSk7CisJICBnZW5lcmljV2luLT5oYW5kbGUgPSAoV0lORE9XICopIE5VTEw7CisJICBnZW5lcmljV2luLT5pc1Zpc2libGUgPSBGQUxTRTsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIERBVEFfV0lOOgorICAgICAgaWYgKHdpbkluZm8tPmdlbmVyaWMuY29udGVudCAhPSAoT3BhcXVlUHRyKSBOVUxMKQorCXsKKwkgIGludCBpOworCisJICB0dWlEZWxEYXRhV2luZG93cyAoCisJCQkgICAgICB3aW5JbmZvLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb250ZW50LAorCQkJICB3aW5JbmZvLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb250ZW50Q291bnQpOworCSAgdHVpRGVsRGF0YVdpbmRvd3MgKAorCQkJICAgICAgd2luSW5mby0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5kYXRhQ29udGVudCwKKwkJCSAgd2luSW5mby0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5kYXRhQ29udGVudENvdW50KTsKKwl9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICBpZiAod2luSW5mby0+Z2VuZXJpYy5oYW5kbGUgIT0gKFdJTkRPVyAqKSBOVUxMKQorICAgIHsKKyAgICAgIHR1aURlbHdpbiAod2luSW5mby0+Z2VuZXJpYy5oYW5kbGUpOworICAgICAgd2luSW5mby0+Z2VuZXJpYy5oYW5kbGUgPSAoV0lORE9XICopIE5VTEw7CisgICAgICB3aW5JbmZvLT5nZW5lcmljLmlzVmlzaWJsZSA9IEZBTFNFOworICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIHR1aURlbFdpbmRvdyAqLworCisKKy8qCisqKiAgZnJlZVdpbmRvdygpLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXworZnJlZVdpbmRvdyAoCisJICAgICBUdWlXaW5JbmZvUHRyIHdpbkluZm8pCisjZWxzZQorZnJlZVdpbmRvdyAod2luSW5mbykKKyAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvOworI2VuZGlmCit7CisgIE9wYXF1ZSBkZXRhaWw7CisgIGludCBpOworICBUdWlHZW5XaW5JbmZvUHRyIGdlbmVyaWNXaW47CisKKworICBzd2l0Y2ggKHdpbkluZm8tPmdlbmVyaWMudHlwZSkKKyAgICB7CisgICAgY2FzZSBTUkNfV0lOOgorICAgIGNhc2UgRElTQVNTRU1fV0lOOgorICAgICAgZ2VuZXJpY1dpbiA9IGxvY2F0b3JXaW5JbmZvUHRyICgpOworICAgICAgaWYgKGdlbmVyaWNXaW4gIT0gKFR1aUdlbldpbkluZm9QdHIpIE5VTEwpCisJeworCSAgdHVpRGVsd2luIChnZW5lcmljV2luLT5oYW5kbGUpOworCSAgZ2VuZXJpY1dpbi0+aGFuZGxlID0gKFdJTkRPVyAqKSBOVUxMOworCX0KKyAgICAgIGZyZWVXaW5Db250ZW50IChnZW5lcmljV2luKTsKKyAgICAgIGdlbmVyaWNXaW4gPSB3aW5JbmZvLT5kZXRhaWwuc291cmNlSW5mby5leGVjdXRpb25JbmZvOworICAgICAgaWYgKGdlbmVyaWNXaW4gIT0gKFR1aUdlbldpbkluZm9QdHIpIE5VTEwpCisJeworCSAgdHVpRGVsd2luIChnZW5lcmljV2luLT5oYW5kbGUpOworCSAgZ2VuZXJpY1dpbi0+aGFuZGxlID0gKFdJTkRPVyAqKSBOVUxMOworCSAgZnJlZVdpbkNvbnRlbnQgKGdlbmVyaWNXaW4pOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgREFUQV9XSU46CisgICAgICBpZiAod2luSW5mby0+Z2VuZXJpYy5jb250ZW50ICE9IChPcGFxdWVQdHIpIE5VTEwpCisJeworCSAgZnJlZURhdGFDb250ZW50ICgKKwkJCSAgICB3aW5JbmZvLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb250ZW50LAorCQkJICB3aW5JbmZvLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb250ZW50Q291bnQpOworCSAgd2luSW5mby0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudCA9CisJICAgIChUdWlXaW5Db250ZW50KSBOVUxMOworCSAgd2luSW5mby0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudENvdW50ID0gMDsKKwkgIGZyZWVEYXRhQ29udGVudCAoCisJCQkgICAgd2luSW5mby0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5kYXRhQ29udGVudCwKKwkJCSAgd2luSW5mby0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5kYXRhQ29udGVudENvdW50KTsKKwkgIHdpbkluZm8tPmRldGFpbC5kYXRhRGlzcGxheUluZm8uZGF0YUNvbnRlbnQgPQorCSAgICAoVHVpV2luQ29udGVudCkgTlVMTDsKKwkgIHdpbkluZm8tPmRldGFpbC5kYXRhRGlzcGxheUluZm8uZGF0YUNvbnRlbnRDb3VudCA9IDA7CisJICB3aW5JbmZvLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NEaXNwbGF5VHlwZSA9CisJICAgIFRVSV9VTkRFRklORURfUkVHUzsKKwkgIHdpbkluZm8tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0NvbHVtbkNvdW50ID0gMTsKKwkgIHdpbkluZm8tPmRldGFpbC5kYXRhRGlzcGxheUluZm8uZGlzcGxheVJlZ3MgPSBGQUxTRTsKKwkgIHdpbkluZm8tPmdlbmVyaWMuY29udGVudCA9IChPcGFxdWVQdHIpIE5VTEw7CisJICB3aW5JbmZvLT5nZW5lcmljLmNvbnRlbnRTaXplID0gMDsKKwl9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICBpZiAod2luSW5mby0+Z2VuZXJpYy5oYW5kbGUgIT0gKFdJTkRPVyAqKSBOVUxMKQorICAgIHsKKyAgICAgIHR1aURlbHdpbiAod2luSW5mby0+Z2VuZXJpYy5oYW5kbGUpOworICAgICAgd2luSW5mby0+Z2VuZXJpYy5oYW5kbGUgPSAoV0lORE9XICopIE5VTEw7CisgICAgICBmcmVlV2luQ29udGVudCAoJndpbkluZm8tPmdlbmVyaWMpOworICAgIH0KKyAgZnJlZSAod2luSW5mbyk7CisKKyAgcmV0dXJuOworfQkJCQkvKiBmcmVlV2luZG93ICovCisKKworLyoKKyoqIGZyZWVBbGxTb3VyY2VXaW5zQ29udGVudCgpLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXworZnJlZUFsbFNvdXJjZVdpbnNDb250ZW50ICh2b2lkKQorI2Vsc2UKK2ZyZWVBbGxTb3VyY2VXaW5zQ29udGVudCAoKQorI2VuZGlmCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCAoc291cmNlV2luZG93cyAoKSktPmNvdW50OyBpKyspCisgICAgeworICAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvID0gKFR1aVdpbkluZm9QdHIpIChzb3VyY2VXaW5kb3dzICgpKS0+bGlzdFtpXTsKKworICAgICAgaWYgKG1fd2luUHRyTm90TnVsbCAod2luSW5mbykpCisJeworCSAgZnJlZVdpbkNvbnRlbnQgKCYod2luSW5mby0+Z2VuZXJpYykpOworCSAgZnJlZVdpbkNvbnRlbnQgKHdpbkluZm8tPmRldGFpbC5zb3VyY2VJbmZvLmV4ZWN1dGlvbkluZm8pOworCX0KKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiBmcmVlQWxsU291cmNlV2luc0NvbnRlbnQgKi8KKworCisvKgorKiogZnJlZVdpbkNvbnRlbnQoKS4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK2ZyZWVXaW5Db250ZW50ICgKKwkJIFR1aUdlbldpbkluZm9QdHIgd2luSW5mbykKKyNlbHNlCitmcmVlV2luQ29udGVudCAod2luSW5mbykKKyAgICAgVHVpR2VuV2luSW5mb1B0ciB3aW5JbmZvOworI2VuZGlmCit7CisgIGlmICh3aW5JbmZvLT5jb250ZW50ICE9IChPcGFxdWVQdHIpIE5VTEwpCisgICAgeworICAgICAgZnJlZUNvbnRlbnQgKChUdWlXaW5Db250ZW50KSB3aW5JbmZvLT5jb250ZW50LAorCQkgICB3aW5JbmZvLT5jb250ZW50U2l6ZSwKKwkJICAgd2luSW5mby0+dHlwZSk7CisgICAgICB3aW5JbmZvLT5jb250ZW50ID0gKE9wYXF1ZVB0cikgTlVMTDsKKyAgICB9CisgIHdpbkluZm8tPmNvbnRlbnRTaXplID0gMDsKKworICByZXR1cm47Cit9CQkJCS8qIGZyZWVXaW5Db250ZW50ICovCisKKworLyoKKyoqIGZyZWVBbGxXaW5kb3dzKCkuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCitmcmVlQWxsV2luZG93cyAodm9pZCkKKyNlbHNlCitmcmVlQWxsV2luZG93cyAoKQorI2VuZGlmCit7CisgIFR1aVdpblR5cGUgdHlwZSA9IFNSQ19XSU47CisKKyAgZm9yICg7IHR5cGUgPCBNQVhfTUFKT1JfV0lORE9XUzsgdHlwZSsrKQorICAgIGlmIChtX3dpblB0ck5vdE51bGwgKHdpbkxpc3RbdHlwZV0pICYmCisJd2luTGlzdFt0eXBlXS0+Z2VuZXJpYy50eXBlICE9IFVOREVGSU5FRF9XSU4pCisgICAgICBmcmVlV2luZG93ICh3aW5MaXN0W3R5cGVdKTsKKyAgcmV0dXJuOworfQkJCQkvKiBmcmVlQWxsV2luZG93cyAqLworCisKK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpRGVsRGF0YVdpbmRvd3MgKAorCQkgICAgVHVpV2luQ29udGVudCBjb250ZW50LAorCQkgICAgaW50IGNvbnRlbnRTaXplKQorI2Vsc2UKK3R1aURlbERhdGFXaW5kb3dzIChjb250ZW50LCBjb250ZW50U2l6ZSkKKyAgICAgVHVpV2luQ29udGVudCBjb250ZW50OworICAgICBpbnQgY29udGVudFNpemU7CisjZW5kaWYKK3sKKyAgaW50IGk7CisKKyAgLyoKKyAgICAqKiBSZW1lbWJlciB0aGF0IGRhdGEgd2luZG93IGNvbnRlbnQgZWxlbWVudHMgYXJlIG9mIHR5cGUgVHVpR2VuV2luSW5mb1B0ciwKKyAgICAqKiBlYWNoIG9mIHdoaWNoIHdob3NlIHNpbmdsZSBlbGVtZW50IGlzIGEgZGF0YSBlbGVtZW50LgorICAgICovCisgIGZvciAoaSA9IDA7IGkgPCBjb250ZW50U2l6ZTsgaSsrKQorICAgIHsKKyAgICAgIFR1aUdlbldpbkluZm9QdHIgZ2VuZXJpY1dpbiA9ICZjb250ZW50W2ldLT53aGljaEVsZW1lbnQuZGF0YVdpbmRvdzsKKworICAgICAgaWYgKGdlbmVyaWNXaW4gIT0gKFR1aUdlbldpbkluZm9QdHIpIE5VTEwpCisJeworCSAgdHVpRGVsd2luIChnZW5lcmljV2luLT5oYW5kbGUpOworCSAgZ2VuZXJpY1dpbi0+aGFuZGxlID0gKFdJTkRPVyAqKSBOVUxMOworCSAgZ2VuZXJpY1dpbi0+aXNWaXNpYmxlID0gRkFMU0U7CisJfQorICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIHR1aURlbERhdGFXaW5kb3dzICovCisKKwordm9pZAorI2lmZGVmIF9fU1REQ19fCitmcmVlRGF0YUNvbnRlbnQgKAorCQkgIFR1aVdpbkNvbnRlbnQgY29udGVudCwKKwkJICBpbnQgY29udGVudFNpemUpCisjZWxzZQorZnJlZURhdGFDb250ZW50IChjb250ZW50LCBjb250ZW50U2l6ZSkKKyAgICAgVHVpV2luQ29udGVudCBjb250ZW50OworICAgICBpbnQgY29udGVudFNpemU7CisjZW5kaWYKK3sKKyAgaW50IGk7CisKKyAgLyoKKyAgICAqKiBSZW1lbWJlciB0aGF0IGRhdGEgd2luZG93IGNvbnRlbnQgZWxlbWVudHMgYXJlIG9mIHR5cGUgVHVpR2VuV2luSW5mb1B0ciwKKyAgICAqKiBlYWNoIG9mIHdoaWNoIHdob3NlIHNpbmdsZSBlbGVtZW50IGlzIGEgZGF0YSBlbGVtZW50LgorICAgICovCisgIGZvciAoaSA9IDA7IGkgPCBjb250ZW50U2l6ZTsgaSsrKQorICAgIHsKKyAgICAgIFR1aUdlbldpbkluZm9QdHIgZ2VuZXJpY1dpbiA9ICZjb250ZW50W2ldLT53aGljaEVsZW1lbnQuZGF0YVdpbmRvdzsKKworICAgICAgaWYgKGdlbmVyaWNXaW4gIT0gKFR1aUdlbldpbkluZm9QdHIpIE5VTEwpCisJeworCSAgdHVpRGVsd2luIChnZW5lcmljV2luLT5oYW5kbGUpOworCSAgZ2VuZXJpY1dpbi0+aGFuZGxlID0gKFdJTkRPVyAqKSBOVUxMOworCSAgZnJlZVdpbkNvbnRlbnQgKGdlbmVyaWNXaW4pOworCX0KKyAgICB9CisgIGZyZWVDb250ZW50IChjb250ZW50LAorCSAgICAgICBjb250ZW50U2l6ZSwKKwkgICAgICAgREFUQV9XSU4pOworCisgIHJldHVybjsKK30JCQkJLyogZnJlZURhdGFDb250ZW50ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIExPQ0FMIFNUQVRJQyBGVU5DVElPTlMgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qCisqKiBmcmVlQ29udGVudCgpLgorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK2ZyZWVDb250ZW50ICgKKwkgICAgICBUdWlXaW5Db250ZW50IGNvbnRlbnQsCisJICAgICAgaW50IGNvbnRlbnRTaXplLAorCSAgICAgIFR1aVdpblR5cGUgd2luVHlwZSkKKyNlbHNlCitmcmVlQ29udGVudCAoY29udGVudCwgY29udGVudFNpemUsIHdpblR5cGUpCisgICAgIFR1aVdpbkNvbnRlbnQgY29udGVudDsKKyAgICAgaW50IGNvbnRlbnRTaXplOworICAgICBUdWlXaW5UeXBlIHdpblR5cGU7CisjZW5kaWYKK3sKKyAgaWYgKGNvbnRlbnQgIT0gKFR1aVdpbkNvbnRlbnQpIE5VTEwpCisgICAgeworICAgICAgZnJlZUNvbnRlbnRFbGVtZW50cyAoY29udGVudCwgY29udGVudFNpemUsIHdpblR5cGUpOworICAgICAgdHVpRnJlZSAoKGNoYXIgKikgY29udGVudCk7CisgICAgfQorCisgIHJldHVybjsKK30JCQkJLyogZnJlZUNvbnRlbnQgKi8KKworCisvKgorKiogZnJlZUNvbnRlbnRFbGVtZW50cygpLgorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK2ZyZWVDb250ZW50RWxlbWVudHMgKAorCQkgICAgICBUdWlXaW5Db250ZW50IGNvbnRlbnQsCisJCSAgICAgIGludCBjb250ZW50U2l6ZSwKKwkJICAgICAgVHVpV2luVHlwZSB0eXBlKQorI2Vsc2UKK2ZyZWVDb250ZW50RWxlbWVudHMgKGNvbnRlbnQsIGNvbnRlbnRTaXplLCB0eXBlKQorICAgICBUdWlXaW5Db250ZW50IGNvbnRlbnQ7CisgICAgIGludCBjb250ZW50U2l6ZTsKKyAgICAgVHVpV2luVHlwZSB0eXBlOworI2VuZGlmCit7CisgIGlmIChjb250ZW50ICE9IChUdWlXaW5Db250ZW50KSBOVUxMKQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBpZiAodHlwZSA9PSBTUkNfV0lOIHx8IHR5cGUgPT0gRElTQVNTRU1fV0lOKQorCXsKKwkgIC8qIGZyZWUgd2hvbGUgc291cmNlIGJsb2NrICovCisJICBpZiAoY29udGVudFswXS0+d2hpY2hFbGVtZW50LnNvdXJjZS5saW5lICE9IChjaGFyICopIE5VTEwpCisJICAgIHR1aUZyZWUgKGNvbnRlbnRbMF0tPndoaWNoRWxlbWVudC5zb3VyY2UubGluZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZvciAoaSA9IDA7IGkgPCBjb250ZW50U2l6ZTsgaSsrKQorCSAgICB7CisJICAgICAgVHVpV2luRWxlbWVudFB0ciBlbGVtZW50OworCisJICAgICAgZWxlbWVudCA9IGNvbnRlbnRbaV07CisJICAgICAgaWYgKGVsZW1lbnQgIT0gKFR1aVdpbkVsZW1lbnRQdHIpIE5VTEwpCisJCXsKKwkJICBzd2l0Y2ggKHR5cGUpCisJCSAgICB7CisJCSAgICBjYXNlIERBVEFfV0lOOgorCQkgICAgICB0dWlGcmVlICgoY2hhciAqKSBlbGVtZW50KTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIERBVEFfSVRFTV9XSU46CisJCSAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiogTm90ZSB0aGF0IGRhdGEgZWxlbWVudHMgYXJlIG5vdCBhbGxvY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiBpbiBhIHNpbmdsZSBibG9jaywgYnV0IGluZGl2aWR1YWxseSwgYXMgbmVlZGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCSAgICAgIGlmIChlbGVtZW50LT53aGljaEVsZW1lbnQuZGF0YS50eXBlICE9IFRVSV9SRUdJU1RFUikKKwkJCXR1aUZyZWUgKChjaGFyICopCisJCQkJIGVsZW1lbnQtPndoaWNoRWxlbWVudC5kYXRhLm5hbWUpOworCQkgICAgICB0dWlGcmVlICgoY2hhciAqKSBlbGVtZW50LT53aGljaEVsZW1lbnQuZGF0YS52YWx1ZSk7CisJCSAgICAgIHR1aUZyZWUgKChjaGFyICopIGVsZW1lbnQpOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgQ01EX1dJTjoKKwkJICAgICAgdHVpRnJlZSAoKGNoYXIgKikgZWxlbWVudC0+d2hpY2hFbGVtZW50LmNvbW1hbmQubGluZSk7CisJCSAgICAgIGJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGlmICh0eXBlICE9IERBVEFfV0lOICYmIHR5cGUgIT0gREFUQV9JVEVNX1dJTikKKwl0dWlGcmVlICgoY2hhciAqKSBjb250ZW50WzBdKTsJLyogZnJlZSB0aGUgZWxlbWVudCBibG9jayAqLworICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIGZyZWVDb250ZW50RWxlbWVudHMgKi8KZGlmZiAtLWdpdCBhL2dkYi90dWkvdHVpRGF0YS5oIGIvZ2RiL3R1aS90dWlEYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0ZDE5YwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90dWkvdHVpRGF0YS5oCkBAIC0wLDAgKzEsMzAyIEBACisjaWZuZGVmIFRVSV9EQVRBX0gKKyNkZWZpbmUgVFVJX0RBVEFfSAorCisvKiBDb25zdGFudCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBERUZBVUxUX1RBQl9MRU4gICAgICAgICAgICAgICAgOAorI2RlZmluZSBOT19TUkNfU1RSSU5HICAgICAgICAgICAgICAgICAgIlsgTm8gU291cmNlIEF2YWlsYWJsZSBdIgorI2RlZmluZSBOT19ESVNBU1NFTV9TVFJJTkcgICAgICAgICAgICAgIlsgTm8gQXNzZW1ibHkgQXZhaWxhYmxlIF0iCisjZGVmaW5lIE5PX1JFR1NfU1RSSU5HICAgICAgICAgICAgICAgICAiWyBSZWdpc3RlciBWYWx1ZXMgVW5hdmFpbGFibGUgXSIKKyNkZWZpbmUgTk9fREFUQV9TVFJJTkcgICAgICAgICAgICAgICAgICJbIE5vIERhdGEgVmFsdWVzIERpc3BsYXllZCBdIgorI2RlZmluZSBNQVhfQ09OVEVOVF9DT1VOVCAgICAgICAgICAgICAgMTAwCisjZGVmaW5lIFNSQ19OQU1FICAgICAgICAgICAgICAgICAgICAgICAiU1JDIgorI2RlZmluZSBDTURfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgIkNNRCIKKyNkZWZpbmUgREFUQV9OQU1FICAgICAgICAgICAgICAgICAgICAgICJSRUdTIgorI2RlZmluZSBESVNBU1NFTV9OQU1FICAgICAgICAgICAgICAgICAgIkFTTSIKKyNkZWZpbmUgVFVJX05VTExfU1RSICAgICAgICAgICAgICAgICAgICIiCisjZGVmaW5lIERFRkFVTFRfSElTVE9SWV9DT1VOVCAgICAgICAgICAyNQorI2RlZmluZSBCT1hfV0lORE9XICAgICAgICAgICAgICAgICAgICAgVFJVRQorI2RlZmluZSBET05UX0JPWF9XSU5ET1cgICAgICAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgSElMSVRFICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUKKyNkZWZpbmUgTk9fSElMSVRFICAgICAgICAgICAgICAgICAgICAgIEZBTFNFCisjZGVmaW5lIFdJVEhfTE9DQVRPUiAgICAgICAgICAgICAgICAgICBUUlVFCisjZGVmaW5lIE5PX0xPQ0FUT1IgICAgICAgICAgICAgICAgICAgICBGQUxTRQorI2RlZmluZSBFTVBUWV9TT1VSQ0VfUFJPTVBUICAgICAgICAgICAgVFJVRQorI2RlZmluZSBOT19FTVBUWV9TT1VSQ0VfUFJPTVBUICAgICAgICAgRkFMU0UKKyNkZWZpbmUgVU5ERUZJTkVEX0lURU0gICAgICAgICAgICAgICAgIC0xCisjZGVmaW5lIE1JTl9XSU5fSEVJR0hUICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1JTl9DTURfV0lOX0hFSUdIVCAgICAgICAgICAgICAzCisKKyNkZWZpbmUgRklMRV9QUkVGSVggICAgICAgICAgICAgICAgICAgICJGaWxlOiAiCisjZGVmaW5lIFBST0NfUFJFRklYICAgICAgICAgICAgICAgICAgICAiUHJvY2VkdXJlOiAiCisjZGVmaW5lIExJTkVfUFJFRklYICAgICAgICAgICAgICAgICAgICAiTGluZTogIgorI2RlZmluZSBQQ19QUkVGSVggICAgICAgICAgICAgICAgICAgICAgInBjOiAiCisKKyNkZWZpbmUgVFVJX0ZMT0FUX1JFR1NfTkFNRSAgICAgICAgICAgICAgICAgICIkRlJFR1MiCisjZGVmaW5lIFRVSV9GTE9BVF9SRUdTX05BTUVfTE9XRVIgICAgICAgICAgICAiJGZyZWdzIgorI2RlZmluZSBUVUlfR0VORVJBTF9SRUdTX05BTUUgICAgICAgICAgICAgICAgIiRHUkVHUyIKKyNkZWZpbmUgVFVJX0dFTkVSQUxfUkVHU19OQU1FX0xPV0VSICAgICAgICAgICIkZ3JlZ3MiCisjZGVmaW5lIFRVSV9TUEVDSUFMX1JFR1NfTkFNRSAgICAgICAgICAgICAgICAiJFNSRUdTIgorI2RlZmluZSBUVUlfU1BFQ0lBTF9SRUdTX05BTUVfTE9XRVIgICAgICAgICAgIiRzcmVncyIKKyNkZWZpbmUgVFVJX0dFTkVSQUxfU1BFQ0lBTF9SRUdTX05BTUUgICAgICAgICIkUkVHUyIKKyNkZWZpbmUgVFVJX0dFTkVSQUxfU1BFQ0lBTF9SRUdTX05BTUVfTE9XRVIgICIkcmVncyIKKworLyogU2Nyb2xsIGRpcmVjdGlvbiBlbnVtICovCit0eXBlZGVmIGVudW0geworICAgIEZPUldBUkRfU0NST0xMLAorICAgIEJBQ0tXQVJEX1NDUk9MTCwKKyAgICBMRUZUX1NDUk9MTCwKKyAgICBSSUdIVF9TQ1JPTEwKK30gVHVpU2Nyb2xsRGlyZWN0aW9uLCAqVHVpU2Nyb2xsRGlyZWN0aW9uUHRyOworCisKKy8qIEdlbmVyYWwgbGlzdCBzdHJ1Y3QgKi8KK3R5cGVkZWYgc3RydWN0ICAgIF9UdWlMaXN0IHsKKyAgICBPcGFxdWVMaXN0ICAgIGxpc3Q7CisgICAgaW50ICAgICAgICAgICAgY291bnQ7Cit9IFR1aUxpc3QsICpUdWlMaXN0UHRyOworCisKKy8qIFRoZSBraW5kcyBvZiBsYXlvdXRzIGF2YWlsYWJsZSAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBTUkNfQ09NTUFORCwKKyAgICBESVNBU1NFTV9DT01NQU5ELAorICAgIFNSQ19ESVNBU1NFTV9DT01NQU5ELAorICAgIFNSQ19EQVRBX0NPTU1BTkQsCisgICAgRElTQVNTRU1fREFUQV9DT01NQU5ELAorICAgIFVOREVGSU5FRF9MQVlPVVQKK30gVHVpTGF5b3V0VHlwZSwgKlR1aUxheW91dFR5cGVQdHI7CisKKy8qIEJhc2ljIGRhdGEgdHlwZXMgdGhhdCBjYW4gYmUgZGlzcGxheWVkIGluIHRoZSBkYXRhIHdpbmRvdy4gKi8KK3R5cGVkZWYgZW51bSBfVHVpRGF0YVR5cGUgeworICAgIFRVSV9SRUdJU1RFUiwKKyAgICBUVUlfU0NBTEFSLAorICAgIFRVSV9DT01QTEVYLAorICAgIFRVSV9TVFJVQ1QKK30gVHVpRGF0YVR5cGUsIFR1aURhdGFUeXBlUHRyOworCisvKiBUeXBlcyBvZiByZWdpc3RlciBkaXNwbGF5cyAqLwordHlwZWRlZiBlbnVtIF9UdWlSZWdpc3RlckRpc3BsYXlUeXBlIHsKKyAgICBUVUlfVU5ERUZJTkVEX1JFR1MsCisgICAgVFVJX0dFTkVSQUxfUkVHUywKKyAgICBUVUlfU0ZMT0FUX1JFR1MsCisgICAgVFVJX0RGTE9BVF9SRUdTLAorICAgIFRVSV9TUEVDSUFMX1JFR1MsCisgICAgVFVJX0dFTkVSQUxfQU5EX1NQRUNJQUxfUkVHUworfSBUdWlSZWdpc3RlckRpc3BsYXlUeXBlLCAqVHVpUmVnaXN0ZXJEaXNwbGF5VHlwZVB0cjsKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgc291cmNlIGxpbmUgb3IgbGluZSBhZGRyZXNzICovCit0eXBlZGVmIHVuaW9uIF9UdWlMaW5lT3JBZGRyZXNzIHsKKyAgICBpbnQgICAgICAgICAgIGxpbmVObzsKKyAgICBPcGFxdWUgICAgICAgIGFkZHI7Cit9IFR1aUxpbmVPckFkZHJlc3MsICpUdWlMaW5lT3JBZGRyZXNzUHRyOworCisvKiBDdXJyZW50IExheW91dCBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdCBfVHVpTGF5b3V0RGVmIHsKKyAgICBUdWlXaW5UeXBlICAgICAgICAgICAgICAgICBkaXNwbGF5TW9kZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBzcGxpdDsKKyAgICBUdWlSZWdpc3RlckRpc3BsYXlUeXBlICAgICByZWdzRGlzcGxheVR5cGU7CisgICAgVHVpUmVnaXN0ZXJEaXNwbGF5VHlwZSAgICAgZmxvYXRSZWdzRGlzcGxheVR5cGU7Cit9IFR1aUxheW91dERlZiwgKlR1aUxheW91dERlZlB0cjsKKworLyogRWxlbWVudHMgaW4gdGhlIFNvdXJjZS9EaXNhc3NlbWJseSBXaW5kb3cgKi8KK3R5cGVkZWYgc3RydWN0IF9UdWlTb3VyY2VFbGVtZW50Cit7CisgICAgY2hhciAgICAgICAgICAgICAgICAqbGluZTsKKyAgICBUdWlMaW5lT3JBZGRyZXNzICAgIGxpbmVPckFkZHI7CisgICAgaW50ICAgICAgICAgICAgICAgICBpc0V4ZWNQb2ludDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGhhc0JyZWFrOworfSBUdWlTb3VyY2VFbGVtZW50LCAqVHVpU291cmNlRWxlbWVudFB0cjsKKworCisvKiBFbGVtZW50cyBpbiB0aGUgZGF0YSBkaXNwbGF5IHdpbmRvdyBjb250ZW50ICovCit0eXBlZGVmIHN0cnVjdCBfVHVpRGF0YUVsZW1lbnQKK3sKKyAgICBjaGFyICAgICAgICAqbmFtZTsKKyAgICBpbnQgICAgICAgICBpdGVtTm87ICAgIC8qIHRoZSByZWdpc3RlciBudW1iZXIsIG9yIGRhdGEgZGlzcGxheSBudW1iZXIgKi8KKyAgICBUdWlEYXRhVHlwZSB0eXBlOworICAgIE9wYXF1ZSAgICAgIHZhbHVlOworICAgIGludCAgICAgICAgIGhpZ2hsaWdodDsKK30gVHVpRGF0YUVsZW1lbnQsICpUdWlEYXRhRWxlbWVudFB0cjsKKworCisvKiBFbGVtZW50cyBpbiB0aGUgY29tbWFuZCB3aW5kb3cgY29udGVudCAqLwordHlwZWRlZiBzdHJ1Y3QgX1R1aUNvbW1hbmRFbGVtZW50Cit7CisgICAgY2hhciAgICAqbGluZTsKK30gVHVpQ29tbWFuZEVsZW1lbnQsICpUdWlDb21tYW5kRWxlbWVudFB0cjsKKworCisjZGVmaW5lIE1BWF9MT0NBVE9SX0VMRU1FTlRfTEVOICAgICAgICAxMDAKKworLyogRWxlbWVudHMgaW4gdGhlIGxvY2F0b3Igd2luZG93IGNvbnRlbnQgKi8KK3R5cGVkZWYgc3RydWN0IF9UdWlMb2NhdG9yRWxlbWVudAoreworICAgIGNoYXIgICAgICAgIGZpbGVOYW1lW01BWF9MT0NBVE9SX0VMRU1FTlRfTEVOXTsKKyAgICBjaGFyICAgICAgICBwcm9jTmFtZVtNQVhfTE9DQVRPUl9FTEVNRU5UX0xFTl07CisgICAgaW50ICAgICAgICAgbGluZU5vOworICAgIE9wYXF1ZSAgICAgIGFkZHI7Cit9IFR1aUxvY2F0b3JFbGVtZW50LCAqVHVpTG9jYXRvckVsZW1lbnRQdHI7CisKKworLyogQW4gY29udGVudCBlbGVtZW50IGluIGEgd2luZG93ICovCit0eXBlZGVmIHVuaW9uCit7CisgICAgVHVpU291cmNlRWxlbWVudCAgICAgICBzb3VyY2U7IC8qIHRoZSBzb3VyY2UgZWxlbWVudHMgKi8KKyAgICBUdWlHZW5XaW5JbmZvICAgICAgICAgIGRhdGFXaW5kb3c7IC8qIGRhdGEgZGlzcGxheSBlbGVtZW50cyAqLworICAgIFR1aURhdGFFbGVtZW50ICAgICAgICAgZGF0YTsgLyogZWxlbWVudHMgb2YgZGF0YVdpbmRvdyAqLworICAgIFR1aUNvbW1hbmRFbGVtZW50ICAgICAgY29tbWFuZDsgLyogY29tbWFuZCBlbGVtZW50cyAqLworICAgIFR1aUxvY2F0b3JFbGVtZW50ICAgICAgbG9jYXRvcjsgLyogbG9jYXRvciBlbGVtZW50cyAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgKnNpbXBsZVN0cmluZzsgLyogc2ltcGxlIGNoYXIgYmFzZWQgZWxlbWVudHMgKi8KK30gVHVpV2hpY2hFbGVtZW50LCAqVHVpV2hpY2hFbGVtZW50UHRyOworCit0eXBlZGVmIHN0cnVjdCBfVHVpV2luRWxlbWVudAoreworICAgIGludCAgICAgICAgICAgIGhpZ2hsaWdodDsKKyAgICBUdWlXaGljaEVsZW1lbnQgd2hpY2hFbGVtZW50OworfSBUdWlXaW5FbGVtZW50LCAqVHVpV2luRWxlbWVudFB0cjsKKworCisvKiBUaGlzIGRlc2NyaWJlcyB0aGUgY29udGVudCBvZiB0aGUgd2luZG93LiAqLwordHlwZWRlZiAgICAgICAgVHVpV2luRWxlbWVudFB0ciAgICAqVHVpV2luQ29udGVudDsKKworCisvKiBUaGlzIHN0cnVjdCBkZWZpbmVzIHRoZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCBhIGRhdGEgZGlzcGxheSB3aW5kb3cgKi8KK3R5cGVkZWYgc3RydWN0IF9UdWlEYXRhSW5mbyB7CisgICAgVHVpV2luQ29udGVudCAgICAgICAgICAgIGRhdGFDb250ZW50OyAvKiBzdGFydCBvZiBkYXRhIGRpc3BsYXkgY29udGVudCAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICBkYXRhQ29udGVudENvdW50OworICAgIFR1aVdpbkNvbnRlbnQgICAgICAgICAgICByZWdzQ29udGVudDsgLyogc3RhcnQgb2YgcmVncyBkaXNwbGF5IGNvbnRlbnQgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgcmVnc0NvbnRlbnRDb3VudDsKKyAgICBUdWlSZWdpc3RlckRpc3BsYXlUeXBlICAgcmVnc0Rpc3BsYXlUeXBlOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICByZWdzQ29sdW1uQ291bnQ7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlSZWdzOyAvKiBTaG91bGQgcmVncyBiZSBkaXNwbGF5ZWQgYXQgYWxsPyAqLworfSBUdWlEYXRhSW5mbywgKlR1aURhdGFJbmZvUHRyOworCisKK3R5cGVkZWYgc3RydWN0IF9UdWlTb3VyY2VJbmZvIHsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGhhc0xvY2F0b3I7IC8qIERvZXMgbG9jYXRvciBiZWxvbmdzIHRvIHRoaXMgd2luZG93PyAqLworICAgIFR1aUdlbldpbkluZm9QdHIgICAgZXhlY3V0aW9uSW5mbzsgLyogZXhlY3V0aW9uIGluZm9ybWF0aW9uIHdpbmRvdyAqLworICAgIGludCAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbE9mZnNldDsgLyogdXNlZCBmb3IgaG9yaXpvbnRhbCBzY3JvbGwgKi8KKyAgICBUdWlMaW5lT3JBZGRyZXNzICAgIHN0YXJ0TGluZU9yQWRkcjsKK30gVHVpU291cmNlSW5mbywgKlR1aVNvdXJjZUluZm9QdHI7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1R1aUNvbW1hbmRJbmZvIHsKKyAgICBpbnQgICAgICAgICAgICBjdXJMaW5lOyAgIC8qIFRoZSBjdXJyZW50IGxpbmUgcG9zaXRpb24gKi8KKyAgICBpbnQgICAgICAgICAgICBjdXJjaDsgICAgIC8qIFRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiAqLworfSBUdWlDb21tYW5kSW5mbywgKlR1aUNvbW1hbmRJbmZvUHRyOworCisKKy8qIFRoaXMgZGVmaW5lcyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIGxvZ2ljYWwgd2luZG93ICovCit0eXBlZGVmIHN0cnVjdCBfVHVpV2luSW5mbyB7CisgICAgVHVpR2VuV2luSW5mbyAgICAgICAgICAgIGdlbmVyaWM7ICAgICAgICAvKiBnZW5lcmFsIHdpbmRvdyBpbmZvcm1hdGlvbiAqLworICAgIHVuaW9uIHsKKyAgICAgICAgVHVpU291cmNlSW5mbyAgICAgICAgc291cmNlSW5mbzsKKyAgICAgICAgVHVpRGF0YUluZm8gICAgICAgICAgZGF0YURpc3BsYXlJbmZvOworICAgICAgICBUdWlDb21tYW5kSW5mbyAgICAgICBjb21tYW5kSW5mbzsKKyAgICAgICAgT3BhcXVlICAgICAgICAgICAgICAgb3BhcXVlOworICAgIH0gZGV0YWlsOworICAgIGludCAgICAgICAgICAgICAgICAgY2FuSGlnaGxpZ2h0OyAvKiBDYW4gdGhpcyB3aW5kb3cgZXZlciBiZSBoaWdobGlnaHRlZD8gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGlzSGlnaGxpZ2h0ZWQ7IC8qIElzIHRoaXMgd2luZG93IGhpZ2hsaWdodGVkPyAqLworfSBUdWlXaW5JbmZvLCAqVHVpV2luSW5mb1B0cjsKKworLyogTUFDUk9TIChwcmVmaXhlZCB3aXRoIG1fKSAqLworCisvKiBUZXN0aW5nIG1hY3JvcyAqLworI2RlZmluZSAgICAgICAgbV9nZW5XaW5QdHJJc051bGwod2luSW5mbykgXAorICAgICAgICAgICAgICAgICgod2luSW5mbykgPT0gKFR1aUdlbldpbkluZm9QdHIpTlVMTCkKKyNkZWZpbmUgICAgICAgIG1fZ2VuV2luUHRyTm90TnVsbCh3aW5JbmZvKSBcCisgICAgICAgICAgICAgICAgKCh3aW5JbmZvKSAhPSAoVHVpR2VuV2luSW5mb1B0cilOVUxMKQorI2RlZmluZSAgICAgICAgbV93aW5QdHJJc051bGwod2luSW5mbykgXAorICAgICAgICAgICAgICAgICgod2luSW5mbykgPT0gKFR1aVdpbkluZm9QdHIpTlVMTCkKKyNkZWZpbmUgICAgICAgIG1fd2luUHRyTm90TnVsbCh3aW5JbmZvKSBcCisgICAgICAgICAgICAgICAgKCh3aW5JbmZvKSAhPSAoVHVpV2luSW5mb1B0cilOVUxMKQorCisjZGVmaW5lICAgICAgICBtX3dpbklzU291cmNlVHlwZSh0eXBlKSBcCisgICAgICAgICAgICAgICAgKHR5cGUgPT0gU1JDX1dJTiB8fCB0eXBlID09IERJU0FTU0VNX1dJTikKKyNkZWZpbmUgICAgICAgIG1fd2luSXNBdXhpbGxhcnkod2luVHlwZSkgXAorICAgICAgICAgICAgICAgICh3aW5UeXBlID4gTUFYX01BSk9SX1dJTkRPV1MpCisjZGVmaW5lICAgICAgICBtX2hhc0xvY2F0b3Iod2luSW5mbykgXAorICAgICAgICAgICAgICAgICggKCh3aW5JbmZvKSAhPSAoVHVpV2luSW5mb1B0cilOVUxMKSA/IFwKKyAgICAgICAgICAgICAgICAgICAgKHdpbkluZm8tPmRldGFpbC5zb3VyY2VJbmZvLmhhc0xvY2F0b3IpIDogXAorICAgICAgICAgICAgICAgICAgICBGQUxTRSApCisKKyNkZWZpbmUgICAgIG1fc2V0V2luSGlnaGxpZ2h0T24od2luSW5mbykgXAorICAgICAgICAgICAgICAgIGlmICgod2luSW5mbykgIT0gKFR1aVdpbkluZm9QdHIpTlVMTCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdpbkluZm8pLT5pc0hpZ2hsaWdodGVkID0gVFJVRQorI2RlZmluZSAgICAgbV9zZXRXaW5IaWdobGlnaHRPZmYod2luSW5mbykgXAorICAgICAgICAgICAgICAgIGlmICgod2luSW5mbykgIT0gKFR1aVdpbkluZm9QdHIpTlVMTCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdpbkluZm8pLT5pc0hpZ2hsaWdodGVkID0gRkFMU0UKKworCisvKiBHbG9iYWwgRGF0YSAqLworZXh0ZXJuIFR1aVdpbkluZm9QdHIgICAgICB3aW5MaXN0W01BWF9NQUpPUl9XSU5ET1dTXTsKK2V4dGVybiBpbnQgICAgICAgICAgICAgICAgdHVpX3ZlcnNpb247CisKKy8qIE1hY3JvcyAqLworI2RlZmluZSBzcmNXaW4gICAgICAgICAgICB3aW5MaXN0W1NSQ19XSU5dCisjZGVmaW5lIGRpc2Fzc2VtV2luICAgICAgIHdpbkxpc3RbRElTQVNTRU1fV0lOXQorI2RlZmluZSBkYXRhV2luICAgICAgICAgICB3aW5MaXN0W0RBVEFfV0lOXQorI2RlZmluZSBjbWRXaW4gICAgICAgICAgICB3aW5MaXN0W0NNRF9XSU5dCisKKy8qIERhdGEgTWFuaXB1bGF0aW9uIEZ1bmN0aW9ucyAqLworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICBpbml0aWFsaXplU3RhdGljRGF0YSBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gVHVpR2VuV2luSW5mb1B0ciAgIGFsbG9jR2VuZXJpY1dpbkluZm8gUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIFR1aVdpbkluZm9QdHIgICAgICBhbGxvY1dpbkluZm8gUEFSQU1TICgoVHVpV2luVHlwZSkpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICBpbml0R2VuZXJpY1BhcnQgUEFSQU1TICgoVHVpR2VuV2luSW5mb1B0cikpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICBpbml0V2luSW5mbyBQQVJBTVMgKChUdWlXaW5JbmZvUHRyKSk7CitleHRlcm4gVHVpV2luQ29udGVudCAgICAgIGFsbG9jQ29udGVudCBQQVJBTVMgKChpbnQsIFR1aVdpblR5cGUpKTsKK2V4dGVybiBpbnQgICAgICAgICAgICAgICAgYWRkQ29udGVudEVsZW1lbnRzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMgKChUdWlHZW5XaW5JbmZvUHRyLCBpbnQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgaW5pdENvbnRlbnRFbGVtZW50IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMgKChUdWlXaW5FbGVtZW50UHRyLCBUdWlXaW5UeXBlKSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgIGZyZWVXaW5kb3cgUEFSQU1TICgoVHVpV2luSW5mb1B0cikpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICBmcmVlQWxsV2luZG93cyBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgIGZyZWVXaW5Db250ZW50IFBBUkFNUyAoKFR1aUdlbldpbkluZm9QdHIpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgZnJlZURhdGFDb250ZW50IFBBUkFNUyAoKFR1aVdpbkNvbnRlbnQsIGludCkpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICBmcmVlQWxsU291cmNlV2luc0NvbnRlbnQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICB0dWlEZWxXaW5kb3cgUEFSQU1TICgoVHVpV2luSW5mb1B0cikpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICB0dWlEZWxEYXRhV2luZG93cyBQQVJBTVMgKChUdWlXaW5Db250ZW50LCBpbnQpKTsKK2V4dGVybiBUdWlXaW5JbmZvUHRyICAgICAgd2luQnlOYW1lIFBBUkFNUyAoKGNoYXIgKikpOworZXh0ZXJuIFR1aVdpbkluZm9QdHIgICAgICBwYXJ0aWFsV2luQnlOYW1lIFBBUkFNUyAoKGNoYXIgKikpOworZXh0ZXJuIGNoYXIgICAgICAgICAgICAgICAqd2luTmFtZSBQQVJBTVMgKChUdWlHZW5XaW5JbmZvUHRyKSk7CitleHRlcm4gY2hhciAgICAgICAgICAgICAgICpkaXNwbGF5YWJsZVdpbkNvbnRlbnRPZiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoVHVpR2VuV2luSW5mb1B0ciwgVHVpV2luRWxlbWVudFB0cikpOworZXh0ZXJuIGNoYXIgICAgICAgICAgICAgICAqZGlzcGxheWFibGVXaW5Db250ZW50QXQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNUyAoKFR1aUdlbldpbkluZm9QdHIsIGludCkpOworZXh0ZXJuIGludCAgICAgICAgICAgICAgICB3aW5FbGVtZW50SGVpZ2h0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMgKChUdWlHZW5XaW5JbmZvUHRyLCBUdWlXaW5FbGVtZW50UHRyKSk7CitleHRlcm4gVHVpTGF5b3V0VHlwZSAgICAgIGN1cnJlbnRMYXlvdXQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICBzZXRDdXJyZW50TGF5b3V0VG8gUEFSQU1TICgoVHVpTGF5b3V0VHlwZSkpOworZXh0ZXJuIGludCAgICAgICAgICAgICAgICB0ZXJtSGVpZ2h0IFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgc2V0VGVybUhlaWdodCBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiBpbnQgICAgICAgICAgICAgICAgdGVybVdpZHRoIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgc2V0VGVybVdpZHRoIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIGludCAgICAgICAgICAgICAgICBoaXN0b3J5TGltaXQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICBzZXRIaXN0b3J5TGltaXQgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgIHNldEdlbldpbk9yaWdpbiBQQVJBTVMgKChUdWlHZW5XaW5JbmZvUHRyLCBpbnQsIGludCkpOworZXh0ZXJuIFR1aUdlbldpbkluZm9QdHIgICBsb2NhdG9yV2luSW5mb1B0ciBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gVHVpR2VuV2luSW5mb1B0ciAgIHNvdXJjZUV4ZWNJbmZvV2luUHRyIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiBUdWlHZW5XaW5JbmZvUHRyICAgZGlzYXNzZW1FeGVjSW5mb1dpblB0ciBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gY2hhciAgICAgICAgICAgICAgICpudWxsU3RyIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiBjaGFyICAgICAgICAgICAgICAgKmJsYW5rU3RyIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiBjaGFyICAgICAgICAgICAgICAgKmxvY2F0aW9uU3RyIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiBjaGFyICAgICAgICAgICAgICAgKmJyZWFrU3RyIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiBjaGFyICAgICAgICAgICAgICAgKmJyZWFrTG9jYXRpb25TdHIgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIFR1aUxpc3RQdHIgICAgICAgICBzb3VyY2VXaW5kb3dzIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgY2xlYXJTb3VyY2VXaW5kb3dzIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgY2xlYXJTb3VyY2VXaW5kb3dzRGV0YWlsIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgY2xlYXJXaW5EZXRhaWwgUEFSQU1TICgoVHVpV2luSW5mb1B0ciAgIHdpbkluZm8pKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgdHVpQWRkVG9Tb3VyY2VXaW5kb3dzIFBBUkFNUyAoKFR1aVdpbkluZm9QdHIpKTsKK2V4dGVybiBpbnQgICAgICAgICAgICAgICAgdHVpRGVmYXVsdFRhYkxlbiBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgIHR1aVNldERlZmF1bHRUYWJMZW4gUEFSQU1TICgoaW50KSk7CitleHRlcm4gVHVpV2luSW5mb1B0ciAgICAgIHR1aVdpbldpdGhGb2N1cyBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgIHR1aVNldFdpbldpdGhGb2N1cyBQQVJBTVMgKChUdWlXaW5JbmZvUHRyKSk7CitleHRlcm4gVHVpTGF5b3V0RGVmUHRyICAgIHR1aUxheW91dERlZiBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gaW50ICAgICAgICAgICAgICAgIHR1aVdpblJlc2l6ZWQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICB0dWlTZXRXaW5SZXNpemVkVG8gUEFSQU1TICgoaW50KSk7CisKK2V4dGVybiBUdWlXaW5JbmZvUHRyICAgICAgdHVpTmV4dFdpbiBQQVJBTVMgKChUdWlXaW5JbmZvUHRyKSk7CitleHRlcm4gVHVpV2luSW5mb1B0ciAgICAgIHR1aVByZXZXaW4gUEFSQU1TICgoVHVpV2luSW5mb1B0cikpOworCisKKyNlbmRpZiAvKiBUVUlfREFUQV9IICovCmRpZmYgLS1naXQgYS9nZGIvdHVpL3R1aURhdGFXaW4uYyBiL2dkYi90dWkvdHVpRGF0YVdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMjczMGEKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdHVpL3R1aURhdGFXaW4uYwpAQCAtMCwwICsxLDQwMCBAQAorLyoKKyoqIHR1aURhdGFXaW4uYworKiogICBUaGlzIG1vZHVsZSBjb250YWlucyBmdW5jdGlvbnMgdG8gc3VwcG9ydCB0aGUgZGF0YS9yZWdpc3RlciB3aW5kb3cgZGlzcGxheS4KKyovCisKKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJ0dWkuaCIKKyNpbmNsdWRlICJ0dWlEYXRhLmgiCisjaW5jbHVkZSAidHVpUmVncy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogU1RBVElDIExPQ0FMIEZVTkNUSU9OUyBGT1JXQVJEIERFQ0xTICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFBVQkxJQyBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qCisqKiB0dWlGaXJzdERhdGFJdGVtRGlzcGxheWVkKCkKKyoqICAgIEFuc3dlciB0aGUgaW5kZXggZmlyc3QgZWxlbWVudCBkaXNwbGF5ZWQuCisqKiAgICBJZiBub25lIGFyZSBkaXNwbGF5ZWQsIHRoZW4gcmV0dXJuICgtMSkuCisqLworaW50CisjaWZkZWYgX19TVERDX18KK3R1aUZpcnN0RGF0YUl0ZW1EaXNwbGF5ZWQgKHZvaWQpCisjZWxzZQordHVpRmlyc3REYXRhSXRlbURpc3BsYXllZCAoKQorI2VuZGlmCit7CisgIGludCBlbGVtZW50Tm8gPSAoLTEpOworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyAoaSA8IGRhdGFXaW4tPmdlbmVyaWMuY29udGVudFNpemUgJiYgZWxlbWVudE5vIDwgMCk7IGkrKykKKyAgICB7CisgICAgICBUdWlHZW5XaW5JbmZvUHRyIGRhdGFJdGVtV2luOworCisgICAgICBkYXRhSXRlbVdpbiA9ICYoKFR1aVdpbkNvbnRlbnQpCisJCSAgICAgIGRhdGFXaW4tPmdlbmVyaWMuY29udGVudClbaV0tPndoaWNoRWxlbWVudC5kYXRhV2luZG93OworICAgICAgaWYgKGRhdGFJdGVtV2luLT5oYW5kbGUgIT0gKFdJTkRPVyAqKSBOVUxMICYmIGRhdGFJdGVtV2luLT5pc1Zpc2libGUpCisJZWxlbWVudE5vID0gaTsKKyAgICB9CisKKyAgcmV0dXJuIGVsZW1lbnRObzsKK30JCQkJLyogdHVpRmlyc3REYXRhSXRlbURpc3BsYXllZCAqLworCisKKy8qCisqKiB0dWlGaXJzdERhdGFFbGVtZW50Tm9JbkxpbmUoKQorKiogICAgICAgIEFuc3dlciB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gbGluZU5vLiAgSWYgbGluZU5vIGlzCisqKiAgICAgICAgcGFzdCB0aGUgZGF0YSBhcmVhICgtMSkgaXMgcmV0dXJuZWQuCisqLworaW50CisjaWZkZWYgX19TVERDX18KK3R1aUZpcnN0RGF0YUVsZW1lbnROb0luTGluZSAoCisJCQkgICAgICBpbnQgbGluZU5vKQorI2Vsc2UKK3R1aUZpcnN0RGF0YUVsZW1lbnROb0luTGluZSAobGluZU5vKQorICAgICBpbnQgbGluZU5vOworI2VuZGlmCit7CisgIGludCBmaXJzdEVsZW1lbnRObyA9ICgtMSk7CisKKyAgLyoKKyAgICAqKiBGaXJzdCBzZWUgaWYgdGhlcmUgaXMgYSByZWdpc3RlciBvbiBsaW5lTm8sIGFuZCBpZiBzbywgc2V0IHRoZQorICAgICoqIGZpcnN0IGVsZW1lbnQgbnVtYmVyCisgICAgKi8KKyAgaWYgKChmaXJzdEVsZW1lbnRObyA9IHR1aUZpcnN0UmVnRWxlbWVudE5vSW5MaW5lIChsaW5lTm8pKSA9PSAtMSkKKyAgICB7CQkJCS8qCisgICAgICAqKiBMb29raW5nIGF0IHRoZSBnZW5lcmFsIGRhdGEsIHRoZSAxc3QgZWxlbWVudCBvbiBsaW5lTm8KKyAgICAgICovCisgICAgfQorCisgIHJldHVybiBmaXJzdEVsZW1lbnRObzsKK30JCQkJLyogdHVpRmlyc3REYXRhRWxlbWVudE5vSW5MaW5lICovCisKKworLyoKKyoqIHR1aURlbGV0ZURhdGFDb250ZW50V2luZG93cygpCisqKiAgICAgICAgRnVuY3Rpb24gdG8gZGVsZXRlIGFsbCB0aGUgaXRlbSB3aW5kb3dzIGluIHRoZSBkYXRhIHdpbmRvdy4KKyoqICAgICAgICBUaGlzIGlzIHVzdWFsbHkgZG9uZSB3aGVuIHRoZSBkYXRhIHdpbmRvdyBpcyBzY3JvbGxlZC4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aURlbGV0ZURhdGFDb250ZW50V2luZG93cyAodm9pZCkKKyNlbHNlCit0dWlEZWxldGVEYXRhQ29udGVudFdpbmRvd3MgKCkKKyNlbmRpZgoreworICBpbnQgaTsKKyAgVHVpR2VuV2luSW5mb1B0ciBkYXRhSXRlbVdpblB0cjsKKworICBmb3IgKGkgPSAwOyAoaSA8IGRhdGFXaW4tPmdlbmVyaWMuY29udGVudFNpemUpOyBpKyspCisgICAgeworICAgICAgZGF0YUl0ZW1XaW5QdHIgPSAmKChUdWlXaW5Db250ZW50KQorCQkgICAgICBkYXRhV2luLT5nZW5lcmljLmNvbnRlbnQpW2ldLT53aGljaEVsZW1lbnQuZGF0YVdpbmRvdzsKKyAgICAgIHR1aURlbHdpbiAoZGF0YUl0ZW1XaW5QdHItPmhhbmRsZSk7CisgICAgICBkYXRhSXRlbVdpblB0ci0+aGFuZGxlID0gKFdJTkRPVyAqKSBOVUxMOworICAgICAgZGF0YUl0ZW1XaW5QdHItPmlzVmlzaWJsZSA9IEZBTFNFOworICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIHR1aURlbGV0ZURhdGFDb250ZW50V2luZG93cyAqLworCisKK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpRXJhc2VEYXRhQ29udGVudCAoCisJCSAgICAgIGNoYXIgKnByb21wdCkKKyNlbHNlCit0dWlFcmFzZURhdGFDb250ZW50IChwcm9tcHQpCisgICAgIGNoYXIgKnByb21wdDsKKyNlbmRpZgoreworICB3ZXJhc2UgKGRhdGFXaW4tPmdlbmVyaWMuaGFuZGxlKTsKKyAgY2hlY2tBbmREaXNwbGF5SGlnaGxpZ2h0SWZOZWVkZWQgKGRhdGFXaW4pOworICBpZiAocHJvbXB0ICE9IChjaGFyICopIE5VTEwpCisgICAgeworICAgICAgaW50IGhhbGZXaWR0aCA9IChkYXRhV2luLT5nZW5lcmljLndpZHRoIC0gMikgLyAyOworICAgICAgaW50IHhQb3M7CisKKyAgICAgIGlmIChzdHJsZW4gKHByb21wdCkgPj0gaGFsZldpZHRoKQorCXhQb3MgPSAxOworICAgICAgZWxzZQorCXhQb3MgPSBoYWxmV2lkdGggLSBzdHJsZW4gKHByb21wdCk7CisgICAgICBtdndhZGRzdHIgKGRhdGFXaW4tPmdlbmVyaWMuaGFuZGxlLAorCQkgKGRhdGFXaW4tPmdlbmVyaWMuaGVpZ2h0IC8gMiksCisJCSB4UG9zLAorCQkgcHJvbXB0KTsKKyAgICB9CisgIHdyZWZyZXNoIChkYXRhV2luLT5nZW5lcmljLmhhbmRsZSk7CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlFcmFzZURhdGFDb250ZW50ICovCisKKworLyoKKyoqIHR1aURpc3BsYXlBbGxEYXRhKCkuCisqKiAgICAgICAgVGhpcyBmdW5jdGlvbiBkaXNwbGF5cyB0aGUgZGF0YSB0aGF0IGlzIGluIHRoZSBkYXRhIHdpbmRvdydzCisqKiAgICAgICAgY29udGVudC4gIEl0IGRvZXMgbm90IHNldCB0aGUgY29udGVudC4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aURpc3BsYXlBbGxEYXRhICh2b2lkKQorI2Vsc2UKK3R1aURpc3BsYXlBbGxEYXRhICgpCisjZW5kaWYKK3sKKyAgaWYgKGRhdGFXaW4tPmdlbmVyaWMuY29udGVudFNpemUgPD0gMCkKKyAgICB0dWlFcmFzZURhdGFDb250ZW50IChOT19EQVRBX1NUUklORyk7CisgIGVsc2UKKyAgICB7CisgICAgICB0dWlFcmFzZURhdGFDb250ZW50ICgoY2hhciAqKSBOVUxMKTsKKyAgICAgIHR1aURlbGV0ZURhdGFDb250ZW50V2luZG93cyAoKTsKKyAgICAgIGNoZWNrQW5kRGlzcGxheUhpZ2hsaWdodElmTmVlZGVkIChkYXRhV2luKTsKKyAgICAgIHR1aURpc3BsYXlSZWdpc3RlcnNGcm9tICgwKTsKKyAgICAgIC8qCisgICAgICAgICoqIFRoZW4gZGlzcGxheSB0aGUgb3RoZXIgZGF0YQorICAgICAgICAqLworICAgICAgaWYgKGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8uZGF0YUNvbnRlbnQgIT0KKwkgIChUdWlXaW5Db250ZW50KSBOVUxMICYmCisJICBkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLmRhdGFDb250ZW50Q291bnQgPiAwKQorCXsKKwl9CisgICAgfQorICByZXR1cm47Cit9CQkJCS8qIHR1aURpc3BsYXlBbGxEYXRhICovCisKKworLyoKKyoqIHR1aURpc3BsYXlEYXRhRnJvbUxpbmUoKQorKiogICAgICAgIEZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIGRhdGEgc3RhcnRpbmcgYXQgbGluZSwgbGluZU5vLCBpbiB0aGUKKyoqICAgICAgICBkYXRhIHdpbmRvdy4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aURpc3BsYXlEYXRhRnJvbUxpbmUgKAorCQkJIGludCBsaW5lTm8pCisjZWxzZQordHVpRGlzcGxheURhdGFGcm9tTGluZSAobGluZU5vKQorICAgICBpbnQgbGluZU5vOworI2VuZGlmCit7CisgIGludCBfbGluZU5vID0gbGluZU5vOworCisgIGlmIChsaW5lTm8gPCAwKQorICAgIF9saW5lTm8gPSAwOworCisgIGNoZWNrQW5kRGlzcGxheUhpZ2hsaWdodElmTmVlZGVkIChkYXRhV2luKTsKKworICAvKiB0aGVyZSBpcyBubyBnZW5lcmFsIGRhdGEsIGZvcmNlIHJlZ3MgdG8gZGlzcGxheSAoaWYgdGhlcmUgYXJlIGFueSkgKi8KKyAgaWYgKGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8uZGF0YUNvbnRlbnRDb3VudCA8PSAwKQorICAgIHR1aURpc3BsYXlSZWdpc3RlcnNGcm9tTGluZSAoX2xpbmVObywgVFJVRSk7CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgZWxlbWVudE5vLCBzdGFydExpbmVObzsKKyAgICAgIGludCByZWdzTGFzdExpbmUgPSB0dWlMYXN0UmVnc0xpbmVObyAoKTsKKworCisgICAgICAvKiBkaXNwbGF5IHJlZ3MgaWYgd2UgY2FuICovCisgICAgICBpZiAodHVpRGlzcGxheVJlZ2lzdGVyc0Zyb21MaW5lIChfbGluZU5vLCBGQUxTRSkgPCAwKQorCXsJCQkvKgorICAgICAgICAgICAgKiogX2xpbmVObyBpcyBwYXN0IHRoZSByZWdzIGRpc3BsYXksIHNvIGNhbGMgd2hlcmUgdGhlCisgICAgICAgICAgICAqKiBzdGFydCBkYXRhIGVsZW1lbnQgaXMKKyAgICAgICAgICAgICovCisJICBpZiAocmVnc0xhc3RMaW5lIDwgX2xpbmVObykKKwkgICAgewkJCS8qIGZpZ3VyZSBvdXQgaG93IG1hbnkgbGluZXMgZWFjaCBlbGVtZW50IGlzIHRvIG9idGFpbgorICAgICAgICAgICAgICAgICAgICB0aGUgc3RhcnQgZWxlbWVudE5vICovCisJICAgIH0KKwl9CisgICAgICBlbHNlCisJewkJCS8qCisgICAgICAgICAgICoqIGNhbGN1bGF0ZSB0aGUgc3RhcnRpbmcgZWxlbWVudCBvZiB0aGUgZGF0YSBkaXNwbGF5LCBnaXZlbgorICAgICAgICAgICAqKiByZWdzTGFzdExpbmUgYW5kIGhvdyBtYW55IGxpbmVzIGVhY2ggZWxlbWVudCBpcywgdXAgdG8KKyAgICAgICAgICAgKiogX2xpbmVObworICAgICAgICAgICAqLworCX0KKyAgICAgIC8qIE5vdyBkaXNwbGF5IHRoZSBkYXRhICwgc3RhcnRpbmcgYXQgZWxlbWVudE5vICovCisgICAgfQorCisgIHJldHVybjsKK30JCQkJLyogdHVpRGlzcGxheURhdGFGcm9tTGluZSAqLworCisKKy8qCisqKiB0dWlEaXNwbGF5RGF0YUZyb20oKQorKiogICAgICAgIERpc3BsYXkgZGF0YSBzdGFydGluZyBhdCBlbGVtZW50IGVsZW1lbnRObworKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpRGlzcGxheURhdGFGcm9tICgKKwkJICAgICBpbnQgZWxlbWVudE5vLAorCQkgICAgIGludCByZXVzZVdpbmRvd3MpCisjZWxzZQordHVpRGlzcGxheURhdGFGcm9tIChlbGVtZW50Tm8sIHJldXNlV2luZG93cykKKyAgICAgaW50IGVsZW1lbnRObzsKKyAgICAgaW50IHJldXNlV2luZG93czsKKyNlbmRpZgoreworICBpbnQgZmlyc3RMaW5lID0gKC0xKTsKKworICBpZiAoZWxlbWVudE5vIDwgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudENvdW50KQorICAgIGZpcnN0TGluZSA9IHR1aUxpbmVGcm9tUmVnRWxlbWVudE5vIChlbGVtZW50Tm8pOworICBlbHNlCisgICAgewkJCQkvKiBjYWxjdWxhdGUgdGhlIGZpcnN0TGluZSBmcm9tIHRoZSBlbGVtZW50IG51bWJlciAqLworICAgIH0KKworICBpZiAoZmlyc3RMaW5lID49IDApCisgICAgeworICAgICAgdHVpRXJhc2VEYXRhQ29udGVudCAoKGNoYXIgKikgTlVMTCk7CisgICAgICBpZiAoIXJldXNlV2luZG93cykKKwl0dWlEZWxldGVEYXRhQ29udGVudFdpbmRvd3MgKCk7CisgICAgICB0dWlEaXNwbGF5RGF0YUZyb21MaW5lIChmaXJzdExpbmUpOworICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIHR1aURpc3BsYXlEYXRhRnJvbSAqLworCisKKy8qCisqKiB0dWlSZWZyZXNoRGF0YVdpbigpCisqKiAgICAgICAgRnVuY3Rpb24gdG8gcmVkaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGUgZGF0YSB3aW5kb3cuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlSZWZyZXNoRGF0YVdpbiAodm9pZCkKKyNlbHNlCit0dWlSZWZyZXNoRGF0YVdpbiAoKQorI2VuZGlmCit7CisgIHR1aUVyYXNlRGF0YUNvbnRlbnQgKChjaGFyICopIE5VTEwpOworICBpZiAoZGF0YVdpbi0+Z2VuZXJpYy5jb250ZW50U2l6ZSA+IDApCisgICAgeworICAgICAgaW50IGZpcnN0RWxlbWVudCA9IHR1aUZpcnN0RGF0YUl0ZW1EaXNwbGF5ZWQgKCk7CisKKyAgICAgIGlmIChmaXJzdEVsZW1lbnQgPj0gMCkJLyogcmUtdXNlIGV4aXN0aW5nIHdpbmRvd3MgKi8KKwl0dWlEaXNwbGF5RGF0YUZyb20gKGZpcnN0RWxlbWVudCwgVFJVRSk7CisgICAgfQorCisgIHJldHVybjsKK30JCQkJLyogdHVpUmVmcmVzaERhdGFXaW4gKi8KKworCisvKgorKiogdHVpQ2hlY2tEYXRhVmFsdWVzKCkuCisqKiAgICAgICAgRnVuY3Rpb24gdG8gY2hlY2sgdGhlIGRhdGEgdmFsdWVzIGFuZCBoaWxpdGUgYW55IHRoYXQgaGF2ZSBjaGFuZ2VkCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlDaGVja0RhdGFWYWx1ZXMgKAorCQkgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZSkKKyNlbHNlCit0dWlDaGVja0RhdGFWYWx1ZXMgKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7CisjZW5kaWYKK3sKKyAgdHVpQ2hlY2tSZWdpc3RlclZhbHVlcyAoZnJhbWUpOworCisgIC8qIE5vdyBjaGVjayBhbnkgb3RoZXIgZGF0YSB2YWx1ZXMgdGhhdCB0aGVyZSBhcmUgKi8KKyAgaWYgKG1fd2luUHRyTm90TnVsbCAoZGF0YVdpbikgJiYgZGF0YVdpbi0+Z2VuZXJpYy5pc1Zpc2libGUpCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8uZGF0YUNvbnRlbnRDb3VudDsgaSsrKQorCXsKKyNpZmRlZiBMQVRFUgorCSAgVHVpRGF0YUVsZW1lbnRQdHIgZGF0YUVsZW1lbnRQdHI7CisJICBUdWlHZW5XaW5JbmZvUHRyIGRhdGFJdGVtV2luUHRyOworCSAgT3BhcXVlIG5ld1ZhbHVlOworCisJICBkYXRhSXRlbVB0ciA9ICZkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLgorCSAgICBkYXRhQ29udGVudFtpXS0+d2hpY2hFbGVtZW50LmRhdGFXaW5kb3c7CisJICBkYXRhRWxlbWVudFB0ciA9ICYoKFR1aVdpbkNvbnRlbnQpCisJCQkgICAgIGRhdGFJdGVtV2luUHRyLT5jb250ZW50KVswXS0+d2hpY2hFbGVtZW50LmRhdGE7CisJICBpZiB2YWx1ZQorCSAgICBoYXMgY2hhbmdlZCAoZGF0YUVsZW1lbnRQdHIsIGZyYW1lLCAmbmV3VmFsdWUpCisJICAgIHsKKwkgICAgICBkYXRhRWxlbWVudFB0ci0+dmFsdWUgPSBuZXdWYWx1ZTsKKwkgICAgICB1cGRhdGUgdGhlIGRpc3BsYXkgd2l0aCB0aGUgbmV3IHZhbHVlLCBoaWxpdGluZyBpdC4KKwkgICAgfQorI2VuZGlmCisJfQorICAgIH0KK30JCQkJLyogdHVpQ2hlY2tEYXRhVmFsdWVzICovCisKKworLyoKKyoqIHR1aV92Q2hlY2tEYXRhVmFsdWVzKCkuCisqKiAgICAgICAgRnVuY3Rpb24gdG8gY2hlY2sgdGhlIGRhdGEgdmFsdWVzIGFuZCBoaWxpdGUgYW55IHRoYXQgaGF2ZQorKiogICAgICAgIGNoYW5nZWQgd2l0aCBhcmdzIGluIGEgdmFfbGlzdAorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpX3ZDaGVja0RhdGFWYWx1ZXMgKAorCQkgICAgICAgdmFfbGlzdCBhcmdzKQorI2Vsc2UKK3R1aV92Q2hlY2tEYXRhVmFsdWVzIChhcmdzKQorICAgICB2YV9saXN0IGFyZ3M7CisjZW5kaWYKK3sKKyAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lID0gdmFfYXJnIChhcmdzLCBzdHJ1Y3QgZnJhbWVfaW5mbyAqKTsKKworICB0dWlDaGVja0RhdGFWYWx1ZXMgKGZyYW1lKTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aV92Q2hlY2tEYXRhVmFsdWVzICovCisKKworLyoKKyoqIHR1aVZlcnRpY2FsRGF0YVNjcm9sbCgpCisqKiAgICAgICAgU2Nyb2xsIHRoZSBkYXRhIHdpbmRvdyB2ZXJ0aWNhbGx5IGZvcndhcmQgb3IgYmFja3dhcmQuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlWZXJ0aWNhbERhdGFTY3JvbGwgKAorCQkJVHVpU2Nyb2xsRGlyZWN0aW9uIHNjcm9sbERpcmVjdGlvbiwKKwkJCWludCBudW1Ub1Njcm9sbCkKKyNlbHNlCit0dWlWZXJ0aWNhbERhdGFTY3JvbGwgKHNjcm9sbERpcmVjdGlvbiwgbnVtVG9TY3JvbGwpCisgICAgIFR1aVNjcm9sbERpcmVjdGlvbiBzY3JvbGxEaXJlY3Rpb247CisgICAgIGludCBudW1Ub1Njcm9sbDsKKyNlbmRpZgoreworICBpbnQgZmlyc3RFbGVtZW50Tm87CisgIGludCBmaXJzdExpbmUgPSAoLTEpOworCisgIGZpcnN0RWxlbWVudE5vID0gdHVpRmlyc3REYXRhSXRlbURpc3BsYXllZCAoKTsKKyAgaWYgKGZpcnN0RWxlbWVudE5vIDwgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudENvdW50KQorICAgIGZpcnN0TGluZSA9IHR1aUxpbmVGcm9tUmVnRWxlbWVudE5vIChmaXJzdEVsZW1lbnRObyk7CisgIGVsc2UKKyAgICB7CQkJCS8qIGNhbGN1bGF0ZSB0aGUgZmlyc3QgbGluZSBmcm9tIHRoZSBlbGVtZW50IG51bWJlciB3aGljaCBpcyBpbgorICAgICAgICAqKiB0aGUgZ2VuZXJhbCBkYXRhIGNvbnRlbnQKKyAgICAgICAgKi8KKyAgICB9CisKKyAgaWYgKGZpcnN0TGluZSA+PSAwKQorICAgIHsKKyAgICAgIGludCBsYXN0RWxlbWVudE5vLCBsYXN0TGluZTsKKworICAgICAgaWYgKHNjcm9sbERpcmVjdGlvbiA9PSBGT1JXQVJEX1NDUk9MTCkKKwlmaXJzdExpbmUgKz0gbnVtVG9TY3JvbGw7CisgICAgICBlbHNlCisJZmlyc3RMaW5lIC09IG51bVRvU2Nyb2xsOworICAgICAgdHVpRXJhc2VEYXRhQ29udGVudCAoKGNoYXIgKikgTlVMTCk7CisgICAgICB0dWlEZWxldGVEYXRhQ29udGVudFdpbmRvd3MgKCk7CisgICAgICB0dWlEaXNwbGF5RGF0YUZyb21MaW5lIChmaXJzdExpbmUpOworICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIHR1aVZlcnRpY2FsRGF0YVNjcm9sbCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogU1RBVElDIExPQ0FMIEZVTkNUSU9OUyAgICAgICAgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9nZGIvdHVpL3R1aURhdGFXaW4uaCBiL2dkYi90dWkvdHVpRGF0YVdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOWU0NmQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdHVpL3R1aURhdGFXaW4uaApAQCAtMCwwICsxLDI5IEBACisjaWZuZGVmIF9UVUlfREFUQVdJTl9ICisjZGVmaW5lIF9UVUlfREFUQVdJTl9ICisvKgorKiogVGhpcyBoZWFkZXIgZmlsZSBzdXBwb3J0cyB0aGUgZGlzcGxheSBvZiByZWdpc3RlcnMvZGF0YSBpbiB0aGUgZGF0YSB3aW5kb3cuCisqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogVFlQRSBERUZJTklUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFBVQkxJQyBGVU5DVElPTiBFWFRFUk5BTCBERUNMUyAgICAgICAgKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiB2b2lkICAgICB0dWlFcmFzZURhdGFDb250ZW50IFBBUkFNUyAoKGNoYXIgKikpOworZXh0ZXJuIHZvaWQgICAgIHR1aURpc3BsYXlBbGxEYXRhIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICAgICB0dWlDaGVja0RhdGFWYWx1ZXMgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworZXh0ZXJuIHZvaWQgICAgIHR1aV92Q2hlY2tEYXRhVmFsdWVzIFBBUkFNUyAoKHZhX2xpc3QpKTsKK2V4dGVybiB2b2lkICAgICB0dWlEaXNwbGF5RGF0YUZyb21MaW5lIFBBUkFNUyAoKGludCkpOworZXh0ZXJuIGludCAgICAgIHR1aUZpcnN0RGF0YUl0ZW1EaXNwbGF5ZWQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIGludCAgICAgIHR1aUZpcnN0RGF0YUVsZW1lbnROb0luTGluZSBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiB2b2lkICAgICB0dWlEZWxldGVEYXRhQ29udGVudFdpbmRvd3MgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgICAgIHR1aVJlZnJlc2hEYXRhV2luIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICAgICB0dWlEaXNwbGF5RGF0YUZyb20gUEFSQU1TICgoaW50LCBpbnQpKTsKK2V4dGVybiB2b2lkICAgICB0dWlWZXJ0aWNhbERhdGFTY3JvbGwgUEFSQU1TICgoVHVpU2Nyb2xsRGlyZWN0aW9uLCBpbnQpKTsKKworI2VuZGlmIC8qX1RVSV9EQVRBV0lOX0gqLwpkaWZmIC0tZ2l0IGEvZ2RiL3R1aS90dWlEaXNhc3NlbS5jIGIvZ2RiL3R1aS90dWlEaXNhc3NlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMGI3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdHVpL3R1aURpc2Fzc2VtLmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisqKiB0dWlEaXNhc3NlbS5jCisqKiAgICAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgZGlzYXNzZW1ibHkgZGlzcGxheS4KKyovCisKKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJicmVha3BvaW50LmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKworI2luY2x1ZGUgInR1aS5oIgorI2luY2x1ZGUgInR1aURhdGEuaCIKKyNpbmNsdWRlICJ0dWlMYXlvdXQuaCIKKyNpbmNsdWRlICJ0dWlTb3VyY2VXaW4uaCIKKyNpbmNsdWRlICJ0dWlTdGFjay5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogU1RBVElDIExPQ0FMIEZVTkNUSU9OUyBGT1JXQVJEIERFQ0xTICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgYnJlYWtwb2ludCAqX2hhc0JyZWFrIFBBUkFNUyAoKENPUkVfQUREUikpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogUFVCTElDIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisqKiB0dWlTZXREaXNhc3NlbUNvbnRlbnQoKS4KKyoqICAgICAgICBGdW5jdGlvbiB0byBzZXQgdGhlIGRpc2Fzc2VtYmx5IHdpbmRvdydzIGNvbnRlbnQuCisqLworVHVpU3RhdHVzCisjaWZkZWYgX19TVERDX18KK3R1aVNldERpc2Fzc2VtQ29udGVudCAoCisJCSAgICAgICBzdHJ1Y3Qgc3ltdGFiICpzLAorCQkgICAgICAgT3BhcXVlIHN0YXJ0QWRkcikKKyNlbHNlCisgICAgIHR1aVNldERpc2Fzc2VtQ29udGVudCAocywgc3RhcnRBZGRyKQorICAgICBzdHJ1Y3Qgc3ltdGFiICpzOworICAgICBPcGFxdWUgc3RhcnRBZGRyOworI2VuZGlmCit7CisgIFR1aVN0YXR1cyByZXQgPSBUVUlfRkFJTFVSRTsKKyAgR0RCX0ZJTEUgKmdkYl9kaXNfb3V0OworCisgIGlmIChzdGFydEFkZHIgIT0gKE9wYXF1ZSkgTlVMTCkKKyAgICB7CisgICAgICByZWdpc3RlciBpbnQgaSwgZGVzYzsKKworICAgICAgaWYgKChyZXQgPSB0dWlBbGxvY1NvdXJjZUJ1ZmZlciAoZGlzYXNzZW1XaW4pKSA9PSBUVUlfU1VDQ0VTUykKKwl7CisJICByZWdpc3RlciBpbnQgb2Zmc2V0ID0gZGlzYXNzZW1XaW4tPmRldGFpbC5zb3VyY2VJbmZvLmhvcml6b250YWxPZmZzZXQ7CisJICByZWdpc3RlciBpbnQgdGhyZXNob2xkLCBjdXJMaW5lID0gMCwgbGluZVdpZHRoLCBtYXhMaW5lczsKKwkgIENPUkVfQUREUiBuZXdwYywgcGM7CisJICBkaXNhc3NlbWJsZV9pbmZvIGFzbUluZm87CisJICBUdWlHZW5XaW5JbmZvUHRyIGxvY2F0b3IgPSBsb2NhdG9yV2luSW5mb1B0ciAoKTsKKwkgIGV4dGVybiB2b2lkIHN0cmNhdF9hZGRyZXNzIFBBUkFNUyAoKENPUkVfQUREUiwgY2hhciAqLCBpbnQpKTsKKwkgIGV4dGVybiB2b2lkIHN0cmNhdF9hZGRyZXNzX251bWVyaWMgUEFSQU1TICgoQ09SRV9BRERSLCBpbnQsIGNoYXIgKiwgaW50KSk7CisJICBpbnQgY3VyTGVuID0gMDsKKwkgIGludCB0YWJfbGVuID0gdHVpRGVmYXVsdFRhYkxlbiAoKTsKKworCSAgbWF4TGluZXMgPSBkaXNhc3NlbVdpbi0+Z2VuZXJpYy5oZWlnaHQgLSAyOwkvKiBhY2NvdW50IGZvciBoaWxpdGUgKi8KKwkgIGxpbmVXaWR0aCA9IGRpc2Fzc2VtV2luLT5nZW5lcmljLndpZHRoIC0gMTsKKwkgIHRocmVzaG9sZCA9IChsaW5lV2lkdGggLSAxKSArIG9mZnNldDsKKworCSAgLyogbm93IGluaXQgdGhlIGdkYl9maWxlIHN0cnVjdHVyZSAqLworICAgICAgICAgIGdkYl9kaXNfb3V0ID0gZ2RiX2ZpbGVfaW5pdF9hc3RyaW5nICh0aHJlc2hvbGQpOworCisJICBJTklUX0RJU0FTU0VNQkxFX0lORk9fTk9fQVJDSCAoYXNtSW5mbywgZ2RiX2Rpc19vdXQsIChmcHJpbnRmX2Z0eXBlKSBmcHJpbnRmX2ZpbHRlcmVkKTsKKwkgIGFzbUluZm8ucmVhZF9tZW1vcnlfZnVuYyA9IGRpc19hc21fcmVhZF9tZW1vcnk7CisJICBhc21JbmZvLm1lbW9yeV9lcnJvcl9mdW5jID0gZGlzX2FzbV9tZW1vcnlfZXJyb3I7CisKKwkgIGRpc2Fzc2VtV2luLT5kZXRhaWwuc291cmNlSW5mby5zdGFydExpbmVPckFkZHIuYWRkciA9IHN0YXJ0QWRkcjsKKworCSAgLyogTm93IGNvbnN0cnVjdCBlYWNoIGxpbmUgKi8KKwkgIGZvciAoY3VyTGluZSA9IDAsIHBjID0gKENPUkVfQUREUikgc3RhcnRBZGRyOyAoY3VyTGluZSA8IG1heExpbmVzKTspCisJICAgIHsKKwkgICAgICBUdWlXaW5FbGVtZW50UHRyIGVsZW1lbnQgPSAoVHVpV2luRWxlbWVudFB0cilkaXNhc3NlbVdpbi0+Z2VuZXJpYy5jb250ZW50W2N1ckxpbmVdOworCSAgICAgIHN0cnVjdCBicmVha3BvaW50ICpicDsKKworCSAgICAgIHByaW50X2FkZHJlc3MgKHBjLCBnZGJfZGlzX291dCk7CisKKwkgICAgICBjdXJMZW4gPSBzdHJsZW4gKGdkYl9maWxlX2dldF9zdHJidWYgKGdkYl9kaXNfb3V0KSk7CisJICAgICAgaSA9IGN1ckxlbiAtICgoY3VyTGVuIC8gdGFiX2xlbikgKiB0YWJfbGVuKTsKKworICAgICAgICAgICAgICAvKiBhZGp1c3QgYnVmZmVyIGxlbmd0aCBpZiBuZWNlc3NhcnkgKi8KKwkgICAgICBnZGJfZmlsZV9hZGp1c3Rfc3RyYnVmICgodGFiX2xlbiAtIGkgPiAwKSA/ICh0YWJfbGVuIC0gaSApIDogMCwgZ2RiX2Rpc19vdXQpOworCQkKKwkgICAgICAvKiBBZGQgc3BhY2VzIHRvIG1ha2UgdGhlIGluc3RydWN0aW9ucyBzdGFydCBvbnRoZSBzYW1lIGNvbHVtbiAqLworCSAgICAgIHdoaWxlIChpIDwgdGFiX2xlbikKKwkJeworCQkgIGdkYl9maWxlX2dldF9zdHJidWYgKGdkYl9kaXNfb3V0KVtjdXJMZW5dID0gJyAnOworCQkgIGkrKzsKKwkJICBjdXJMZW4rKzsKKwkJfQorCSAgICAgIGdkYl9maWxlX2dldF9zdHJidWYgKGdkYl9kaXNfb3V0KVtjdXJMZW5dID0gJ1wwJzsKKworCSAgICAgIG5ld3BjID0gcGMgKyAoKCp0bV9wcmludF9pbnNuKSAocGMsICZhc21JbmZvKSk7CisKKwkgICAgICAvKiBOb3cgY29weSB0aGUgbGluZSB0YWtpbmcgdGhlIG9mZnNldCBpbnRvIGFjY291bnQgKi8KKwkgICAgICBpZiAoc3RybGVuIChnZGJfZmlsZV9nZXRfc3RyYnVmIChnZGJfZGlzX291dCkpID4gb2Zmc2V0KQorCQlzdHJjcHkgKGVsZW1lbnQtPndoaWNoRWxlbWVudC5zb3VyY2UubGluZSwKKwkJCSYoZ2RiX2ZpbGVfZ2V0X3N0cmJ1ZiAoZ2RiX2Rpc19vdXQpW29mZnNldF0pKTsKKwkgICAgICBlbHNlCisJCWVsZW1lbnQtPndoaWNoRWxlbWVudC5zb3VyY2UubGluZVswXSA9ICdcMCc7CisJICAgICAgZWxlbWVudC0+d2hpY2hFbGVtZW50LnNvdXJjZS5saW5lT3JBZGRyLmFkZHIgPSAoT3BhcXVlKSBwYzsKKwkgICAgICBlbGVtZW50LT53aGljaEVsZW1lbnQuc291cmNlLmlzRXhlY1BvaW50ID0KKwkJKHBjID09IChDT1JFX0FERFIpICgoVHVpV2luRWxlbWVudFB0cilsb2NhdG9yLT5jb250ZW50WzBdKS0+d2hpY2hFbGVtZW50LmxvY2F0b3IuYWRkcik7CisJICAgICAgYnAgPSBfaGFzQnJlYWsgKHBjKTsKKwkgICAgICBlbGVtZW50LT53aGljaEVsZW1lbnQuc291cmNlLmhhc0JyZWFrID0KKwkJKGJwICE9IChzdHJ1Y3QgYnJlYWtwb2ludCAqKSBOVUxMICYmCisJCSAoIWVsZW1lbnQtPndoaWNoRWxlbWVudC5zb3VyY2UuaXNFeGVjUG9pbnQgfHwKKwkJICAoYnAtPmRpc3Bvc2l0aW9uICE9IGRlbCB8fCBicC0+aGl0X2NvdW50IDw9IDApKSk7CisJICAgICAgY3VyTGluZSsrOworCSAgICAgIHBjID0gbmV3cGM7CisgICAgICAgICAgICAgIC8qIHJlc2V0IHRoZSBidWZmZXIgdG8gZW1wdHkgKi8KKwkgICAgICBnZGJfZmlsZV9nZXRfc3RyYnVmIChnZGJfZGlzX291dClbMF0gPSAnXDAnOworCSAgICB9CisJICBnZGJfZmlsZV9kZWFsbG9jYXRlICgmZ2RiX2Rpc19vdXQpOworCSAgZGlzYXNzZW1XaW4tPmdlbmVyaWMuY29udGVudFNpemUgPSBjdXJMaW5lOworCSAgcmV0ID0gVFVJX1NVQ0NFU1M7CisJfQorICAgIH0KKworICByZXR1cm4gcmV0OworfQkJCQkvKiB0dWlTZXREaXNhc3NlbUNvbnRlbnQgKi8KKworCisvKgorKiogdHVpU2hvd0Rpc2Fzc2VtKCkuCisqKiAgICAgICAgRnVuY3Rpb24gdG8gZGlzcGxheSB0aGUgZGlzYXNzZW1ibHkgd2luZG93IHdpdGggZGlzYXNzZW1ibGVkIGNvZGUuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlTaG93RGlzYXNzZW0gKAorCQkgIE9wYXF1ZSBzdGFydEFkZHIpCisjZWxzZQordHVpU2hvd0Rpc2Fzc2VtIChzdGFydEFkZHIpCisgICAgIE9wYXF1ZSBzdGFydEFkZHI7CisjZW5kaWYKK3sKKyAgc3RydWN0IHN5bXRhYiAqcyA9IGZpbmRfcGNfc3ltdGFiICgoQ09SRV9BRERSKSBzdGFydEFkZHIpOworICBUdWlXaW5JbmZvUHRyIHdpbldpdGhGb2N1cyA9IHR1aVdpbldpdGhGb2N1cyAoKTsKKworICB0dWlBZGRXaW5Ub0xheW91dCAoRElTQVNTRU1fV0lOKTsKKyAgdHVpVXBkYXRlU291cmNlV2luZG93IChkaXNhc3NlbVdpbiwgcywgc3RhcnRBZGRyLCBGQUxTRSk7CisgIC8qCisgICAgKiogaWYgdGhlIGZvY3VzIHdhcyBpbiB0aGUgc3JjIHdpbiwgcHV0IGl0IGluIHRoZSBhc20gd2luLCBpZiB0aGUKKyAgICAqKiBzb3VyY2UgdmlldyBpc24ndCBzcGxpdAorICAgICovCisgIGlmIChjdXJyZW50TGF5b3V0ICgpICE9IFNSQ19ESVNBU1NFTV9DT01NQU5EICYmIHdpbldpdGhGb2N1cyA9PSBzcmNXaW4pCisgICAgdHVpU2V0V2luRm9jdXNUbyAoZGlzYXNzZW1XaW4pOworCisgIHJldHVybjsKK30JCQkJLyogdHVpU2hvd0Rpc2Fzc2VtICovCisKKworLyoKKyoqIHR1aVNob3dEaXNhc3NlbUFuZFVwZGF0ZVNvdXJjZSgpLgorKiogICAgICAgIEZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIGRpc2Fzc2VtYmx5IHdpbmRvdy4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aVNob3dEaXNhc3NlbUFuZFVwZGF0ZVNvdXJjZSAoCisJCQkJIE9wYXF1ZSBzdGFydEFkZHIpCisjZWxzZQordHVpU2hvd0Rpc2Fzc2VtQW5kVXBkYXRlU291cmNlIChzdGFydEFkZHIpCisgICAgIE9wYXF1ZSBzdGFydEFkZHI7CisjZW5kaWYKK3sKKyAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CisKKyAgdHVpU2hvd0Rpc2Fzc2VtIChzdGFydEFkZHIpOworICBpZiAoY3VycmVudExheW91dCAoKSA9PSBTUkNfRElTQVNTRU1fQ09NTUFORCkKKyAgICB7CisgICAgICBUdWlHZW5XaW5JbmZvUHRyIGxvY2F0b3IgPSBsb2NhdG9yV2luSW5mb1B0ciAoKTsKKyAgICAgIC8qCisgICAgICAgICoqIFVwZGF0ZSB3aGF0IGlzIGluIHRoZSBzb3VyY2Ugd2luZG93IGlmIGl0IGlzIGRpc3BsYXllZCB0b28sCisgICAgICAgICoqIG5vdGUgdGhhdCBpdCBmb2xsb3dzIHdoYXQgaXMgaW4gdGhlIGRpc2Fzc2VtYmx5IHdpbmRvdyBhbmQgdmlzYS12ZXJzYQorICAgICAgICAqLworICAgICAgc2FsID0gZmluZF9wY19saW5lICgoQ09SRV9BRERSKSBzdGFydEFkZHIsIDApOworICAgICAgY3VycmVudF9zb3VyY2Vfc3ltdGFiID0gc2FsLnN5bXRhYjsKKyAgICAgIHR1aVVwZGF0ZVNvdXJjZVdpbmRvdyAoc3JjV2luLCBzYWwuc3ltdGFiLCAoT3BhcXVlKSBzYWwubGluZSwgVFJVRSk7CisgICAgICB0dWlVcGRhdGVMb2NhdG9yRmlsZW5hbWUgKHNhbC5zeW10YWItPmZpbGVuYW1lKTsKKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlTaG93RGlzYXNzZW1BbmRVcGRhdGVTb3VyY2UgKi8KKworCisvKgorKiogdHVpU2hvd0Rpc2Fzc2VtQXNJcygpLgorKiogICAgICAgIEZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIGRpc2Fzc2VtYmx5IHdpbmRvdy4gIFRoaXMgZnVuY3Rpb24gc2hvd3MKKyoqICAgICAgICB0aGUgZGlzYXNzZW1ibHkgYXMgc3BlY2lmaWVkIGJ5IHRoZSBob3Jpem9udGFsIG9mZnNldC4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aVNob3dEaXNhc3NlbUFzSXMgKAorCQkgICAgICBPcGFxdWUgYWRkcikKKyNlbHNlCit0dWlTaG93RGlzYXNzZW1Bc0lzIChhZGRyKQorICAgICBPcGFxdWUgYWRkcjsKKyNlbmRpZgoreworICB0dWlBZGRXaW5Ub0xheW91dCAoRElTQVNTRU1fV0lOKTsKKyAgdHVpVXBkYXRlU291cmNlV2luZG93QXNJcyAoZGlzYXNzZW1XaW4sIChzdHJ1Y3Qgc3ltdGFiICopIE5VTEwsIGFkZHIsIEZBTFNFKTsKKyAgLyoKKyAgICAqKiBVcGRhdGUgd2hhdCBpcyBpbiB0aGUgc291cmNlIHdpbmRvdyBpZiBpdCBpcyBkaXNwbGF5ZWQgdG9vLCBub3QgdGhhdCBpdAorICAgICoqIGZvbGxvd3Mgd2hhdCBpcyBpbiB0aGUgZGlzYXNzZW1ibHkgd2luZG93IGFuZCB2aXNhLXZlcnNhCisgICAgKi8KKyAgaWYgKGN1cnJlbnRMYXlvdXQgKCkgPT0gU1JDX0RJU0FTU0VNX0NPTU1BTkQpCisgICAgdHVpU2hvd1NvdXJjZUNvbnRlbnQgKHNyY1dpbik7CS8qPz8/PyAgTmVlZCB0byBkbyBtb3JlPyAqLworCisgIHJldHVybjsKK30JCQkJLyogdHVpU2hvd0Rpc2Fzc2VtICovCisKKworLyoKKyoqIHR1aUdldEJlZ2luQXNtQWRkcmVzcygpLgorKi8KK09wYXF1ZQorI2lmZGVmIF9fU1REQ19fCit0dWlHZXRCZWdpbkFzbUFkZHJlc3MgKHZvaWQpCisjZWxzZQordHVpR2V0QmVnaW5Bc21BZGRyZXNzICgpCisjZW5kaWYKK3sKKyAgVHVpR2VuV2luSW5mb1B0ciBsb2NhdG9yOworICBUdWlMb2NhdG9yRWxlbWVudFB0ciBlbGVtZW50OworICBPcGFxdWUgYWRkcjsKKworICBsb2NhdG9yID0gbG9jYXRvcldpbkluZm9QdHIgKCk7CisgIGVsZW1lbnQgPSAmKChUdWlXaW5FbGVtZW50UHRyKSBsb2NhdG9yLT5jb250ZW50WzBdKS0+d2hpY2hFbGVtZW50LmxvY2F0b3I7CisKKyAgaWYgKGVsZW1lbnQtPmFkZHIgPT0gKE9wYXF1ZSkgMCkKKyAgICB7CisgICAgICAvKnRoZSB0YXJnZXQgaXMgbm90IGV4ZWN1dGluZywgYmVjYXVzZSB0aGUgcGMgaXMgMCovCisKKyAgICAgIGFkZHIgPSAoT3BhcXVlKSBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzICgibWFpbiIpOworCisgICAgICBpZiAoYWRkciA9PSAoT3BhcXVlKSAwKQorCWFkZHIgPSAoT3BhcXVlKSBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzICgiTUFJTiIpOworCisgICAgfQorICBlbHNlCQkJCS8qIHRoZSB0YXJnZXQgaXMgZXhlY3V0aW5nICovCisgICAgYWRkciA9IGVsZW1lbnQtPmFkZHI7CisKKyAgcmV0dXJuIGFkZHI7Cit9CQkJCS8qIHR1aUdldEJlZ2luQXNtQWRkcmVzcyAqLworCisKKy8qCisqKiB0dWlWZXJ0aWNhbERpc2Fzc2VtU2Nyb2xsKCkuCisqKiAgICAgIFNjcm9sbCB0aGUgZGlzYXNzZW1ibHkgZm9yd2FyZCBvciBiYWNrd2FyZCB2ZXJ0aWNhbGx5CisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlWZXJ0aWNhbERpc2Fzc2VtU2Nyb2xsICgKKwkJCSAgICBUdWlTY3JvbGxEaXJlY3Rpb24gc2Nyb2xsRGlyZWN0aW9uLAorCQkJICAgIGludCBudW1Ub1Njcm9sbCkKKyNlbHNlCit0dWlWZXJ0aWNhbERpc2Fzc2VtU2Nyb2xsIChzY3JvbGxEaXJlY3Rpb24sIG51bVRvU2Nyb2xsKQorICAgICBUdWlTY3JvbGxEaXJlY3Rpb24gc2Nyb2xsRGlyZWN0aW9uOworICAgICBpbnQgbnVtVG9TY3JvbGw7CisjZW5kaWYKK3sKKyAgaWYgKGRpc2Fzc2VtV2luLT5nZW5lcmljLmNvbnRlbnQgIT0gKE9wYXF1ZVB0cikgTlVMTCkKKyAgICB7CisgICAgICBPcGFxdWUgcGMsIGxvd0FkZHI7CisgICAgICBUdWlXaW5Db250ZW50IGNvbnRlbnQ7CisgICAgICBzdHJ1Y3Qgc3ltdGFiICpzOworCisgICAgICBjb250ZW50ID0gKFR1aVdpbkNvbnRlbnQpIGRpc2Fzc2VtV2luLT5nZW5lcmljLmNvbnRlbnQ7CisgICAgICBpZiAoY3VycmVudF9zb3VyY2Vfc3ltdGFiID09IChzdHJ1Y3Qgc3ltdGFiICopIE5VTEwpCisJcyA9IGZpbmRfcGNfc3ltdGFiIChzZWxlY3RlZF9mcmFtZS0+cGMpOworICAgICAgZWxzZQorCXMgPSBjdXJyZW50X3NvdXJjZV9zeW10YWI7CisKKyAgICAgIHBjID0gY29udGVudFswXS0+d2hpY2hFbGVtZW50LnNvdXJjZS5saW5lT3JBZGRyLmFkZHI7CisgICAgICBpZiAoZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uICgoQ09SRV9BRERSKSBwYywKKwkJCQkgICAgKGNoYXIgKiopIE5VTEwsCisJCQkJICAgIChDT1JFX0FERFIgKikgJiBsb3dBZGRyLAorCQkJCSAgICAoQ09SRV9BRERSKSBOVUxMKSA9PSAwKQorCWVycm9yICgiTm8gZnVuY3Rpb24gY29udGFpbnMgcHJncmFtIGNvdW50ZXIgZm9yIHNlbGVjdGVkIGZyYW1lLlxuIik7CisgICAgICBlbHNlCisJeworCSAgcmVnaXN0ZXIgaW50IGxpbmUgPSAwOworCSAgcmVnaXN0ZXIgT3BhcXVlIG5ld0xvdzsKKwkgIGJmZF9ieXRlIGJ1ZmZlcls0XTsKKworCSAgbmV3TG93ID0gcGM7CisJICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09IEZPUldBUkRfU0NST0xMKQorCSAgICB7CisJICAgICAgZm9yICg7IGxpbmUgPCBudW1Ub1Njcm9sbDsgbGluZSsrKQorCQluZXdMb3cgKz0gc2l6ZW9mIChiZmRfZ2V0YjMyIChidWZmZXIpKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZm9yICg7IG5ld0xvdyA+PSAoT3BhcXVlKSAwICYmIGxpbmUgPCBudW1Ub1Njcm9sbDsgbGluZSsrKQorCQluZXdMb3cgLT0gc2l6ZW9mIChiZmRfZ2V0YjMyIChidWZmZXIpKTsKKwkgICAgfQorCSAgdHVpVXBkYXRlU291cmNlV2luZG93QXNJcyAoZGlzYXNzZW1XaW4sIHMsIG5ld0xvdywgRkFMU0UpOworCX0KKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlWZXJ0aWNhbERpc2Fzc2VtU2Nyb2xsICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFNUQVRJQyBMT0NBTCBGVU5DVElPTlMgICAgICAgICAgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorKiogX2hhc0JyZWFrKCkuCisqKiAgICAgIEFuc3dlciB3aGV0aGVyIHRoZXJlIGlzIGEgYnJlYWsgcG9pbnQgYXQgdGhlIGlucHV0IGxpbmUgaW4gdGhlCisqKiAgICAgIHNvdXJjZSBmaWxlIGluZGljYXRlZAorKi8KK3N0YXRpYyBzdHJ1Y3QgYnJlYWtwb2ludCAqCisjaWZkZWYgX19TVERDX18KK19oYXNCcmVhayAoCisJICAgIENPUkVfQUREUiBhZGRyKQorI2Vsc2UKK19oYXNCcmVhayAoYWRkcikKKyAgICAgQ09SRV9BRERSIGFkZHI7CisjZW5kaWYKK3sKKyAgc3RydWN0IGJyZWFrcG9pbnQgKmJwV2l0aEJyZWFrID0gKHN0cnVjdCBicmVha3BvaW50ICopIE5VTEw7CisgIHN0cnVjdCBicmVha3BvaW50ICpicDsKKyAgZXh0ZXJuIHN0cnVjdCBicmVha3BvaW50ICpicmVha3BvaW50X2NoYWluOworCisKKyAgZm9yIChicCA9IGJyZWFrcG9pbnRfY2hhaW47CisgICAgICAgKGJwICE9IChzdHJ1Y3QgYnJlYWtwb2ludCAqKSBOVUxMICYmCisJYnBXaXRoQnJlYWsgPT0gKHN0cnVjdCBicmVha3BvaW50ICopIE5VTEwpOworICAgICAgIGJwID0gYnAtPm5leHQpCisgICAgaWYgKGFkZHIgPT0gYnAtPmFkZHJlc3MpCisgICAgICBicFdpdGhCcmVhayA9IGJwOworCisgIHJldHVybiBicFdpdGhCcmVhazsKK30JCQkJLyogX2hhc0JyZWFrICovCmRpZmYgLS1naXQgYS9nZGIvdHVpL3R1aURpc2Fzc2VtLmggYi9nZGIvdHVpL3R1aURpc2Fzc2VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExYWM0OAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90dWkvdHVpRGlzYXNzZW0uaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9UVUlfRElTQVNTRU1fSAorI2RlZmluZSBfVFVJX0RJU0FTU0VNX0gKKy8qCisqKiBUaGlzIGhlYWRlciBmaWxlIHN1cHBvcnRzCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFRZUEUgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBQVUJMSUMgRlVOQ1RJT04gRVhURVJOQUwgREVDTFMgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gVHVpU3RhdHVzICAgICAgICB0dWlTZXREaXNhc3NlbUNvbnRlbnQgUEFSQU1TICgoc3RydWN0IHN5bXRhYiAqLCBPcGFxdWUpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHR1aVNob3dEaXNhc3NlbSBQQVJBTVMgKChPcGFxdWUpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHR1aVNob3dEaXNhc3NlbUFuZFVwZGF0ZVNvdXJjZSBQQVJBTVMgKChPcGFxdWUpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHR1aVZlcnRpY2FsRGlzYXNzZW1TY3JvbGwgUEFSQU1TICgoVHVpU2Nyb2xsRGlyZWN0aW9uLCBpbnQpKTsKK2V4dGVybiBPcGFxdWUgICAgICAgICAgIHR1aUdldEJlZ2luQXNtQWRkcmVzcyBQQVJBTVMgKCh2b2lkKSk7CisKKyNlbmRpZiAvKl9UVUlfRElTQVNTRU1fSCovCmRpZmYgLS1naXQgYS9nZGIvdHVpL3R1aUdlbmVyYWxXaW4uYyBiL2dkYi90dWkvdHVpR2VuZXJhbFdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZjBjZDcKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdHVpL3R1aUdlbmVyYWxXaW4uYwpAQCAtMCwwICsxLDQ2OSBAQAorLyoKKyoqIFR1aUdlbmVyYWxXaW4uYworKiogVGhpcyBtb2R1bGUgc3VwcG9ydHMgZ2VuZXJhbCB3aW5kb3cgYmVoYXZpb3IKKyovCisKKyNpbmNsdWRlIDxjdXJzZXMuaD4KKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAidHVpLmgiCisjaW5jbHVkZSAidHVpRGF0YS5oIgorI2luY2x1ZGUgInR1aUdlbmVyYWxXaW4uaCIKKworCisvKgorKiogbG9jYWwgc3VwcG9ydCBmdW5jdGlvbnMKKyovCitzdGF0aWMgdm9pZCBfd2luUmVzaXplIFBBUkFNUyAoKHZvaWQpKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFBVQkxJQyBGVU5DVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyoqIHR1aVJlZnJlc2hXaW4oKQorKiogICAgICAgIFJlZnJlc2ggdGhlIHdpbmRvdworKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpUmVmcmVzaFdpbiAoCisJCVR1aUdlbldpbkluZm9QdHIgd2luSW5mbykKKyNlbHNlCit0dWlSZWZyZXNoV2luICh3aW5JbmZvKQorICAgICBUdWlHZW5XaW5JbmZvUHRyIHdpbkluZm87CisjZW5kaWYKK3sKKyAgaWYgKHdpbkluZm8tPnR5cGUgPT0gREFUQV9XSU4gJiYgd2luSW5mby0+Y29udGVudFNpemUgPiAwKQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBmb3IgKGkgPSAwOyAoaSA8IHdpbkluZm8tPmNvbnRlbnRTaXplKTsgaSsrKQorCXsKKwkgIFR1aUdlbldpbkluZm9QdHIgZGF0YUl0ZW1XaW5QdHI7CisKKwkgIGRhdGFJdGVtV2luUHRyID0gJigoVHVpV2luQ29udGVudCkKKwkJCSAgICAgd2luSW5mby0+Y29udGVudClbaV0tPndoaWNoRWxlbWVudC5kYXRhV2luZG93OworCSAgaWYgKG1fZ2VuV2luUHRyTm90TnVsbCAoZGF0YUl0ZW1XaW5QdHIpICYmCisJICAgICAgZGF0YUl0ZW1XaW5QdHItPmhhbmRsZSAhPSAoV0lORE9XICopIE5VTEwpCisJICAgIHdyZWZyZXNoIChkYXRhSXRlbVdpblB0ci0+aGFuZGxlKTsKKwl9CisgICAgfQorICBlbHNlIGlmICh3aW5JbmZvLT50eXBlID09IENNRF9XSU4pCisgICAgeworICAgICAgLyogRG8gbm90aGluZyAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICh3aW5JbmZvLT5oYW5kbGUgIT0gKFdJTkRPVyAqKSBOVUxMKQorCXdyZWZyZXNoICh3aW5JbmZvLT5oYW5kbGUpOworICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIHR1aVJlZnJlc2hXaW4gKi8KKworCisvKgorKiogdHVpRGVsd2luKCkKKyoqICAgICAgICBGdW5jdGlvbiB0byBkZWxldGUgdGhlIGN1cnNlcyB3aW5kb3csIGNoZWNraW5nIGZvciBudWxsCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlEZWx3aW4gKAorCSAgICBXSU5ET1cgKiB3aW5kb3cpCisjZWxzZQordHVpRGVsd2luICh3aW5kb3cpCisgICAgIFdJTkRPVyAqd2luZG93OworI2VuZGlmCit7CisgIGlmICh3aW5kb3cgIT0gKFdJTkRPVyAqKSBOVUxMKQorICAgIGRlbHdpbiAod2luZG93KTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aURlbHdpbiAqLworCisKKy8qCisqKiBib3hXaW4oKS4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK2JveFdpbiAoCisJIFR1aUdlbldpbkluZm9QdHIgd2luSW5mbywKKwkgaW50IGhpZ2hsaWdodEZsYWcpCisjZWxzZQorYm94V2luICh3aW5JbmZvLCBoaWdobGlnaHRGbGFnKQorICAgICBUdWlHZW5XaW5JbmZvUHRyIHdpbkluZm87CisgICAgIGludCBoaWdobGlnaHRGbGFnOworI2VuZGlmCit7CisgIGlmIChtX2dlbldpblB0ck5vdE51bGwgKHdpbkluZm8pICYmIHdpbkluZm8tPmhhbmRsZSAhPSAoV0lORE9XICopIE5VTEwpCisgICAgeworICAgICAgaWYgKGhpZ2hsaWdodEZsYWcgPT0gSElMSVRFKQorCWJveCAod2luSW5mby0+aGFuZGxlLCAnfCcsICctJyk7CisgICAgICBlbHNlCisJeworLyogICAgICAgICAgICB3YXR0cm9uKHdpbkluZm8tPmhhbmRsZSwgQV9ESU0pOyovCisJICBib3ggKHdpbkluZm8tPmhhbmRsZSwgJzonLCAnLicpOworLyogICAgICAgICAgICB3YXR0cm9mZih3aW5JbmZvLT5oYW5kbGUsIEFfRElNKTsqLworCX0KKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiBib3hXaW4gKi8KKworCisvKgorKiogdW5oaWdobGlnaHRXaW4oKS4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3VuaGlnaGxpZ2h0V2luICgKKwkJIFR1aVdpbkluZm9QdHIgd2luSW5mbykKKyNlbHNlCit1bmhpZ2hsaWdodFdpbiAod2luSW5mbykKKyAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvOworI2VuZGlmCit7CisgIGlmIChtX3dpblB0ck5vdE51bGwgKHdpbkluZm8pICYmIHdpbkluZm8tPmdlbmVyaWMuaGFuZGxlICE9IChXSU5ET1cgKikgTlVMTCkKKyAgICB7CisgICAgICBib3hXaW4gKChUdWlHZW5XaW5JbmZvUHRyKSB3aW5JbmZvLCBOT19ISUxJVEUpOworICAgICAgd3JlZnJlc2ggKHdpbkluZm8tPmdlbmVyaWMuaGFuZGxlKTsKKyAgICAgIG1fc2V0V2luSGlnaGxpZ2h0T2ZmICh3aW5JbmZvKTsKKyAgICB9Cit9CQkJCS8qIHVuaGlnaGxpZ2h0V2luICovCisKKworLyoKKyoqIGhpZ2hsaWdodFdpbigpLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXworaGlnaGxpZ2h0V2luICgKKwkgICAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvKQorI2Vsc2UKK2hpZ2hsaWdodFdpbiAod2luSW5mbykKKyAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvOworI2VuZGlmCit7CisgIGlmIChtX3dpblB0ck5vdE51bGwgKHdpbkluZm8pICYmCisgICAgICB3aW5JbmZvLT5jYW5IaWdobGlnaHQgJiYgd2luSW5mby0+Z2VuZXJpYy5oYW5kbGUgIT0gKFdJTkRPVyAqKSBOVUxMKQorICAgIHsKKyAgICAgIGJveFdpbiAoKFR1aUdlbldpbkluZm9QdHIpIHdpbkluZm8sIEhJTElURSk7CisgICAgICB3cmVmcmVzaCAod2luSW5mby0+Z2VuZXJpYy5oYW5kbGUpOworICAgICAgbV9zZXRXaW5IaWdobGlnaHRPbiAod2luSW5mbyk7CisgICAgfQorfQkJCQkvKiBoaWdobGlnaHRXaW4gKi8KKworCisvKgorKiogY2hlY2tBbmREaXNwbGF5SGlnaGxpZ2h0SWZOZWNlc3NheQorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXworY2hlY2tBbmREaXNwbGF5SGlnaGxpZ2h0SWZOZWVkZWQgKAorCQkJCSAgIFR1aVdpbkluZm9QdHIgd2luSW5mbykKKyNlbHNlCitjaGVja0FuZERpc3BsYXlIaWdobGlnaHRJZk5lZWRlZCAod2luSW5mbykKKyAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvOworI2VuZGlmCit7CisgIGlmIChtX3dpblB0ck5vdE51bGwgKHdpbkluZm8pICYmIHdpbkluZm8tPmdlbmVyaWMudHlwZSAhPSBDTURfV0lOKQorICAgIHsKKyAgICAgIGlmICh3aW5JbmZvLT5pc0hpZ2hsaWdodGVkKQorCWhpZ2hsaWdodFdpbiAod2luSW5mbyk7CisgICAgICBlbHNlCisJdW5oaWdobGlnaHRXaW4gKHdpbkluZm8pOworCisgICAgfQorICByZXR1cm47Cit9CQkJCS8qIGNoZWNrQW5kRGlzcGxheUhpZ2hsaWdodElmTmVlZGVkICovCisKKworLyoKKyoqIG1ha2VXaW5kb3coKS4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK21ha2VXaW5kb3cgKAorCSAgICAgVHVpR2VuV2luSW5mb1B0ciB3aW5JbmZvLAorCSAgICAgaW50IGJveEl0KQorI2Vsc2UKK21ha2VXaW5kb3cgKHdpbkluZm8sIGJveEl0KQorICAgICBUdWlHZW5XaW5JbmZvUHRyIHdpbkluZm87CisgICAgIGludCBib3hJdDsKKyNlbmRpZgoreworICBXSU5ET1cgKmhhbmRsZTsKKworICBoYW5kbGUgPSBuZXd3aW4gKHdpbkluZm8tPmhlaWdodCwKKwkJICAgd2luSW5mby0+d2lkdGgsCisJCSAgIHdpbkluZm8tPm9yaWdpbi55LAorCQkgICB3aW5JbmZvLT5vcmlnaW4ueCk7CisgIHdpbkluZm8tPmhhbmRsZSA9IGhhbmRsZTsKKyAgaWYgKGhhbmRsZSAhPSAoV0lORE9XICopIE5VTEwpCisgICAgeworICAgICAgaWYgKGJveEl0ID09IEJPWF9XSU5ET1cpCisJYm94V2luICh3aW5JbmZvLCBOT19ISUxJVEUpOworICAgICAgd2luSW5mby0+aXNWaXNpYmxlID0gVFJVRTsKKyAgICAgIHNjcm9sbG9rIChoYW5kbGUsIFRSVUUpOworICAgICAgdHVpUmVmcmVzaFdpbiAod2luSW5mbyk7CisKKyNpZm5kZWYgRk9SX1RFU1QKKyAgICAgIGlmICgJCQkvKiFtX1dpbklzQXV4aWxsYXJ5KHdpbkluZm8tPnR5cGUpICYmICovCisJICAgKHdpbkluZm8tPnR5cGUgIT0gQ01EX1dJTikgJiYKKwkgICAod2luSW5mby0+Y29udGVudCA9PSAoT3BhcXVlUHRyKSBOVUxMKSkKKwl7CisJICBtdndhZGRzdHIgKGhhbmRsZSwgMSwgMSwgd2luTmFtZSAod2luSW5mbykpOworCSAgdHVpUmVmcmVzaFdpbiAod2luSW5mbyk7CisJfQorI2VuZGlmIC8qRk9SX1RFU1QqLworICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIG1ha2VXaW5kb3cgKi8KKworCisvKgorKiogdHVpQ2xlYXJXaW4oKS4KKyoqICAgICAgICBDbGVhciB0aGUgd2luZG93IG9mIGFsbCBjb250ZW50cyB3aXRob3V0IGNhbGxpbmcgd2NsZWFyLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpQ2xlYXJXaW4gKAorCSAgICAgIFR1aUdlbldpbkluZm9QdHIgd2luSW5mbykKKyNlbHNlCit0dWlDbGVhcldpbiAod2luSW5mbykKKyAgICAgVHVpR2VuV2luSW5mb1B0ciB3aW5JbmZvOworI2VuZGlmCit7CisgIGlmIChtX2dlbldpblB0ck5vdE51bGwgKHdpbkluZm8pICYmIHdpbkluZm8tPmhhbmRsZSAhPSAoV0lORE9XICopIE5VTEwpCisgICAgeworICAgICAgaW50IGN1clJvdywgY3VyQ29sOworCisgICAgICBmb3IgKGN1clJvdyA9IDA7IChjdXJSb3cgPCB3aW5JbmZvLT5oZWlnaHQpOyBjdXJSb3crKykKKwlmb3IgKGN1ckNvbCA9IDA7IChjdXJDb2wgPCB3aW5JbmZvLT53aWR0aCk7IGN1ckNvbCsrKQorCSAgbXZ3YWRkY2ggKHdpbkluZm8tPmhhbmRsZSwgY3VyUm93LCBjdXJDb2wsICcgJyk7CisKKyAgICAgIHR1aVJlZnJlc2hXaW4gKHdpbkluZm8pOworICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIHR1aUNsZWFyV2luICovCisKKworLyoKKyoqIG1ha2VWaXNpYmxlKCkuCisqKiAgICAgICAgV2UgY2FuJ3QgcmVhbGx5IG1ha2Ugd2luZG93cyB2aXNpYmxlLCBvciBpbnZpc2libGUuICBTbyB3ZQorKiogICAgICAgIGhhdmUgdG8gZGVsZXRlIHRoZSBlbnRpcmUgd2luZG93IHdoZW4gbWFraW5nIGl0IHZpc2libGUsCisqKiAgICAgICAgYW5kIGNyZWF0ZSBpdCBhZ2FpbiB3aGVuIG1ha2luZyBpdCB2aXNpYmxlLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXworbWFrZVZpc2libGUgKAorCSAgICAgIFR1aUdlbldpbkluZm9QdHIgd2luSW5mbywKKwkgICAgICBpbnQgdmlzaWJsZSkKKyNlbHNlCittYWtlVmlzaWJsZSAod2luSW5mbywgdmlzaWJsZSkKKyAgICAgVHVpR2VuV2luSW5mb1B0ciB3aW5JbmZvOworICAgICBpbnQgdmlzaWJsZTsKKyNlbmRpZgoreworICAvKiBEb24ndCB0ZWFyIGRvd24vcmVjcmVhdGUgY29tbWFuZCB3aW5kb3cgKi8KKyAgaWYgKHdpbkluZm8tPnR5cGUgPT0gQ01EX1dJTikKKyAgICByZXR1cm47CisKKyAgaWYgKHZpc2libGUpCisgICAgeworICAgICAgaWYgKCF3aW5JbmZvLT5pc1Zpc2libGUpCisJeworCSAgbWFrZVdpbmRvdyAoCisJCSAgICAgICB3aW5JbmZvLAorCSAgICh3aW5JbmZvLT50eXBlICE9IENNRF9XSU4gJiYgIW1fd2luSXNBdXhpbGxhcnkgKHdpbkluZm8tPnR5cGUpKSk7CisJICB3aW5JbmZvLT5pc1Zpc2libGUgPSBUUlVFOworCX0KKyAgICAgIHR1aVJlZnJlc2hXaW4gKHdpbkluZm8pOworICAgIH0KKyAgZWxzZSBpZiAoIXZpc2libGUgJiYKKwkgICB3aW5JbmZvLT5pc1Zpc2libGUgJiYgd2luSW5mby0+aGFuZGxlICE9IChXSU5ET1cgKikgTlVMTCkKKyAgICB7CisgICAgICB3aW5JbmZvLT5pc1Zpc2libGUgPSBGQUxTRTsKKyAgICAgIHR1aUNsZWFyV2luICh3aW5JbmZvKTsKKyAgICAgIHR1aURlbHdpbiAod2luSW5mby0+aGFuZGxlKTsKKyAgICAgIHdpbkluZm8tPmhhbmRsZSA9IChXSU5ET1cgKikgTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiBtYWtlVmlzaWJsZSAqLworCisKKy8qCisqKiBtYWtlQWxsVmlzaWJsZSgpLgorKiogICAgICAgIE1ha2VzIGFsbCB3aW5kb3dzIGludmlzaWJsZSAoZXhjZXB0IHRoZSBjb21tYW5kIGFuZCBsb2NhdG9yIHdpbmRvd3MpCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCittYWtlQWxsVmlzaWJsZSAoCisJCSBpbnQgdmlzaWJsZSkKKyNlbHNlCittYWtlQWxsVmlzaWJsZSAodmlzaWJsZSkKKyAgICAgaW50IHZpc2libGU7CisjZW5kaWYKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9NQUpPUl9XSU5ET1dTOyBpKyspCisgICAgeworICAgICAgaWYgKG1fd2luUHRyTm90TnVsbCAod2luTGlzdFtpXSkgJiYKKwkgICgod2luTGlzdFtpXSktPmdlbmVyaWMudHlwZSkgIT0gQ01EX1dJTikKKwl7CisJICBpZiAobV93aW5Jc1NvdXJjZVR5cGUgKCh3aW5MaXN0W2ldKS0+Z2VuZXJpYy50eXBlKSkKKwkgICAgbWFrZVZpc2libGUgKCh3aW5MaXN0W2ldKS0+ZGV0YWlsLnNvdXJjZUluZm8uZXhlY3V0aW9uSW5mbywKKwkJCSB2aXNpYmxlKTsKKwkgIG1ha2VWaXNpYmxlICgoVHVpR2VuV2luSW5mb1B0cikgd2luTGlzdFtpXSwgdmlzaWJsZSk7CisJfQorICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIG1ha2VBbGxWaXNpYmxlICovCisKKworLyoKKyoqIHNjcm9sbFdpbkZvcndhcmQKKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3Njcm9sbFdpbkZvcndhcmQgKAorCQkgICBUdWlHZW5XaW5JbmZvUHRyIHdpbkluZm8sCisJCSAgIGludCBudW1MaW5lcykKKyNlbHNlCitzY3JvbGxXaW5Gb3J3YXJkICh3aW5JbmZvLCBudW1MaW5lcykKKyAgICAgVHVpR2VuV2luSW5mb1B0ciB3aW5JbmZvOworICAgICBpbnQgbnVtTGluZXM7CisjZW5kaWYKK3sKKyAgaWYgKHdpbkluZm8tPmNvbnRlbnQgIT0gKE9wYXF1ZVB0cikgTlVMTCAmJgorICAgICAgd2luSW5mby0+bGFzdFZpc2libGVMaW5lIDwgd2luSW5mby0+Y29udGVudFNpemUgLSAxKQorICAgIHsKKyAgICAgIGludCBpLCBmaXJzdExpbmUsIG5ld0xhc3RMaW5lOworCisgICAgICBmaXJzdExpbmUgPSB3aW5JbmZvLT5sYXN0VmlzaWJsZUxpbmUgLSB3aW5JbmZvLT52aWV3cG9ydEhlaWdodCArIDE7CisgICAgICBpZiAod2luSW5mby0+bGFzdFZpc2libGVMaW5lICsgbnVtTGluZXMgPiB3aW5JbmZvLT5jb250ZW50U2l6ZSkKKwluZXdMYXN0TGluZSA9IHdpbkluZm8tPmNvbnRlbnRTaXplIC0gMTsKKyAgICAgIGVsc2UKKwluZXdMYXN0TGluZSA9IHdpbkluZm8tPmxhc3RWaXNpYmxlTGluZSArIG51bUxpbmVzIC0gMTsKKworICAgICAgZm9yIChpID0gKG5ld0xhc3RMaW5lIC0gd2luSW5mby0+dmlld3BvcnRIZWlnaHQpOworCSAgIChpIDw9IG5ld0xhc3RMaW5lKTsgaSsrKQorCXsKKwkgIFR1aVdpbkVsZW1lbnRQdHIgbGluZTsKKwkgIGludCBsaW5lSGVpZ2h0OworCisJICBsaW5lID0gKFR1aVdpbkVsZW1lbnRQdHIpIHdpbkluZm8tPmNvbnRlbnRbaV07CisJICBpZiAobGluZS0+aGlnaGxpZ2h0KQorCSAgICB3c3RhbmRvdXQgKHdpbkluZm8tPmhhbmRsZSk7CisJICBtdndhZGRzdHIgKHdpbkluZm8tPmhhbmRsZSwKKwkJICAgICBpIC0gKG5ld0xhc3RMaW5lIC0gd2luSW5mby0+dmlld3BvcnRIZWlnaHQpLAorCQkgICAgIDEsCisJCSAgICAgZGlzcGxheWFibGVXaW5Db250ZW50T2YgKHdpbkluZm8sIGxpbmUpKTsKKwkgIGlmIChsaW5lLT5oaWdobGlnaHQpCisJICAgIHdzdGFuZGVuZCAod2luSW5mby0+aGFuZGxlKTsKKwkgIGxpbmVIZWlnaHQgPSB3aW5FbGVtZW50SGVpZ2h0ICh3aW5JbmZvLCBsaW5lKTsKKwkgIG5ld0xhc3RMaW5lICs9IChsaW5lSGVpZ2h0IC0gMSk7CisJfQorICAgICAgd2luSW5mby0+bGFzdFZpc2libGVMaW5lID0gbmV3TGFzdExpbmU7CisgICAgfQorCisgIHJldHVybjsKK30JCQkJLyogc2Nyb2xsV2luRm9yd2FyZCAqLworCisKKy8qCisqKiBzY3JvbGxXaW5CYWNrd2FyZAorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXworc2Nyb2xsV2luQmFja3dhcmQgKAorCQkgICAgVHVpR2VuV2luSW5mb1B0ciB3aW5JbmZvLAorCQkgICAgaW50IG51bUxpbmVzKQorI2Vsc2UKK3Njcm9sbFdpbkJhY2t3YXJkICh3aW5JbmZvLCBudW1MaW5lcykKKyAgICAgVHVpR2VuV2luSW5mb1B0ciB3aW5JbmZvOworICAgICBpbnQgbnVtTGluZXM7CisjZW5kaWYKK3sKKyAgaWYgKHdpbkluZm8tPmNvbnRlbnQgIT0gKE9wYXF1ZVB0cikgTlVMTCAmJgorICAgICAgKHdpbkluZm8tPmxhc3RWaXNpYmxlTGluZSAtIHdpbkluZm8tPnZpZXdwb3J0SGVpZ2h0KSA+IDApCisgICAgeworICAgICAgaW50IGksIG5ld0xhc3RMaW5lLCBmaXJzdExpbmU7CisKKyAgICAgIGZpcnN0TGluZSA9IHdpbkluZm8tPmxhc3RWaXNpYmxlTGluZSAtIHdpbkluZm8tPnZpZXdwb3J0SGVpZ2h0ICsgMTsKKyAgICAgIGlmICgoZmlyc3RMaW5lIC0gbnVtTGluZXMpIDwgMCkKKwluZXdMYXN0TGluZSA9IHdpbkluZm8tPnZpZXdwb3J0SGVpZ2h0IC0gMTsKKyAgICAgIGVsc2UKKwluZXdMYXN0TGluZSA9IHdpbkluZm8tPmxhc3RWaXNpYmxlTGluZSAtIG51bUxpbmVzICsgMTsKKworICAgICAgZm9yIChpID0gbmV3TGFzdExpbmUgLSB3aW5JbmZvLT52aWV3cG9ydEhlaWdodDsgKGkgPD0gbmV3TGFzdExpbmUpOyBpKyspCisJeworCSAgVHVpV2luRWxlbWVudFB0ciBsaW5lOworCSAgaW50IGxpbmVIZWlnaHQ7CisKKwkgIGxpbmUgPSAoVHVpV2luRWxlbWVudFB0cikgd2luSW5mby0+Y29udGVudFtpXTsKKwkgIGlmIChsaW5lLT5oaWdobGlnaHQpCisJICAgIHdzdGFuZG91dCAod2luSW5mby0+aGFuZGxlKTsKKwkgIG12d2FkZHN0ciAod2luSW5mby0+aGFuZGxlLAorCQkgICAgIGkgLSAobmV3TGFzdExpbmUgLSB3aW5JbmZvLT52aWV3cG9ydEhlaWdodCksCisJCSAgICAgMSwKKwkJICAgICBkaXNwbGF5YWJsZVdpbkNvbnRlbnRPZiAod2luSW5mbywgbGluZSkpOworCSAgaWYgKGxpbmUtPmhpZ2hsaWdodCkKKwkgICAgd3N0YW5kZW5kICh3aW5JbmZvLT5oYW5kbGUpOworCSAgbGluZUhlaWdodCA9IHdpbkVsZW1lbnRIZWlnaHQgKHdpbkluZm8sIGxpbmUpOworCSAgbmV3TGFzdExpbmUgKz0gKGxpbmVIZWlnaHQgLSAxKTsKKwl9CisgICAgICB3aW5JbmZvLT5sYXN0VmlzaWJsZUxpbmUgPSBuZXdMYXN0TGluZTsKKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiBzY3JvbGxXaW5CYWNrd2FyZCAqLworCisKKy8qCisqKiByZWZyZXNoQWxsKCkuCisqKiAgICAgICAgRnVuY3Rpb24gdG8gcmVmcmVzaCBhbGwgdGhlIHdpbmRvd3MgY3VycmVudGx5IGRpc3BsYXllZAorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXworcmVmcmVzaEFsbCAoCisJICAgICBUdWlXaW5JbmZvUHRyICogbGlzdCkKKyNlbHNlCityZWZyZXNoQWxsIChsaXN0KQorICAgICBUdWlXaW5JbmZvUHRyICpsaXN0OworI2VuZGlmCit7CisgIFR1aVdpblR5cGUgdHlwZTsKKyAgVHVpR2VuV2luSW5mb1B0ciBsb2NhdG9yID0gbG9jYXRvcldpbkluZm9QdHIgKCk7CisKKyAgZm9yICh0eXBlID0gU1JDX1dJTjsgKHR5cGUgPCBNQVhfTUFKT1JfV0lORE9XUyk7IHR5cGUrKykKKyAgICB7CisgICAgICBpZiAobGlzdFt0eXBlXS0+Z2VuZXJpYy5pc1Zpc2libGUpCisJeworCSAgaWYgKHR5cGUgPT0gU1JDX1dJTiB8fCB0eXBlID09IERJU0FTU0VNX1dJTikKKwkgICAgeworCSAgICAgIHRvdWNod2luIChsaXN0W3R5cGVdLT5kZXRhaWwuc291cmNlSW5mby5leGVjdXRpb25JbmZvLT5oYW5kbGUpOworCSAgICAgIHR1aVJlZnJlc2hXaW4gKGxpc3RbdHlwZV0tPmRldGFpbC5zb3VyY2VJbmZvLmV4ZWN1dGlvbkluZm8pOworCSAgICB9CisJICB0b3VjaHdpbiAobGlzdFt0eXBlXS0+Z2VuZXJpYy5oYW5kbGUpOworCSAgdHVpUmVmcmVzaFdpbiAoJmxpc3RbdHlwZV0tPmdlbmVyaWMpOworCX0KKyAgICB9CisgIGlmIChsb2NhdG9yLT5pc1Zpc2libGUpCisgICAgeworICAgICAgdG91Y2h3aW4gKGxvY2F0b3ItPmhhbmRsZSk7CisgICAgICB0dWlSZWZyZXNoV2luIChsb2NhdG9yKTsKKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiByZWZyZXNoQWxsICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogTG9jYWwgU3RhdGljIEZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZ2RiL3R1aS90dWlHZW5lcmFsV2luLmggYi9nZGIvdHVpL3R1aUdlbmVyYWxXaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTlmOGFiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3R1aS90dWlHZW5lcmFsV2luLmgKQEAgLTAsMCArMSwzMSBAQAorI2lmbmRlZiBUVUlfR0VORVJBTF9XSU5fSAorI2RlZmluZSBUVUlfR0VORVJBTF9XSU5fSAorCisvKgorKiogRnVuY3Rpb25zCisqLworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgdHVpQ2xlYXJXaW4gUEFSQU1TICgoVHVpR2VuV2luSW5mb1B0cikpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgdW5oaWdobGlnaHRXaW4gUEFSQU1TICgoVHVpV2luSW5mb1B0cikpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgbWFrZVZpc2libGUgUEFSQU1TICgoVHVpR2VuV2luSW5mb1B0ciwgaW50KSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBtYWtlQWxsVmlzaWJsZSBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHNjcm9sbFdpbkZvcndhcmQgUEFSQU1TICgoVHVpR2VuV2luSW5mb1B0ciwgaW50KSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBzY3JvbGxXaW5CYWNrd2FyZCBQQVJBTVMgKChUdWlHZW5XaW5JbmZvUHRyLCBpbnQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIG1ha2VXaW5kb3cgUEFSQU1TICgoVHVpR2VuV2luSW5mb1B0ciwgaW50KSk7CitleHRlcm4gVHVpV2luSW5mb1B0ciAgICBjb3B5V2luIFBBUkFNUyAoKFR1aVdpbkluZm9QdHIpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIGJveFdpbiBQQVJBTVMgKChUdWlHZW5XaW5JbmZvUHRyLCBpbnQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIGhpZ2hsaWdodFdpbiBQQVJBTVMgKChUdWlXaW5JbmZvUHRyKSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBjaGVja0FuZERpc3BsYXlIaWdobGlnaHRJZk5lZWRlZCBQQVJBTVMgKChUdWlXaW5JbmZvUHRyKSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICByZWZyZXNoQWxsIFBBUkFNUyAoKFR1aVdpbkluZm9QdHIgKikpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgdHVpRGVsd2luIFBBUkFNUyAoKFdJTkRPVyAgKndpbmRvdykpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgdHVpUmVmcmVzaFdpbiBQQVJBTVMgKChUdWlHZW5XaW5JbmZvUHRyKSk7CisKKy8qCisqKiBNYWNyb3MKKyovCisjZGVmaW5lICAgIG1fYmVWaXNpYmxlKHdpbkluZm8pICAgbWFrZVZpc2libGUoKFR1aUdlbldpbkluZm9QdHIpKHdpbkluZm8pLCBUUlVFKQorI2RlZmluZSAgICBtX2JlSW52aXNpYmxlKHdpbkluZm8pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlVmlzaWJsZSgoVHVpR2VuV2luSW5mb1B0cikod2luSW5mbyksIEZBTFNFKQorI2RlZmluZSAgICBtX2FsbEJlVmlzaWJsZSgpICAgICAgIG1ha2VBbGxWaXNpYmxlKFRSVUUpCisjZGVmaW5lIG1fYWxsQmVJbnZpc2libGUoKSAgICAgICAgbWFrZUFsbFZpc2libGUoRkFMU0UpCisKKyNlbmRpZiAvKlRVSV9HRU5FUkFMX1dJTl9IKi8KZGlmZiAtLWdpdCBhL2dkYi90dWkvdHVpSU8uYyBiL2dkYi90dWkvdHVpSU8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWEzNjEzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3R1aS90dWlJTy5jCkBAIC0wLDAgKzEsNzM0IEBACisKKy8qCisqKiBUaGlzIG1vZHVsZSBjb250YWlucyBmdW5jdGlvbnMgdG8gc3VwcG9ydCBpL28gaW4gdGhlIFRVSQorKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAidGVybWluYWwuaCIKKyNpbmNsdWRlICJ0dWkuaCIKKyNpbmNsdWRlICJ0dWlEYXRhLmgiCisjaW5jbHVkZSAidHVpSU8uaCIKKyNpbmNsdWRlICJ0dWlDb21tYW5kLmgiCisjaW5jbHVkZSAidHVpV2luLmgiCisKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8dmFyYXJncy5oPgorI2VuZGlmCisKKy8qIFRoZSBTb2xhcmlzIGhlYWRlciBmaWxlcyBzZWVtIHRvIHByb3ZpZGUgbm8gZGVjbGFyYXRpb24gZm9yIHRoaXMgYXQKKyAgIGFsbCB3aGVuIF9fU1REQ19fIGlzIGRlZmluZWQuICBUaGlzIHNob3VsZG4ndCBjb25mbGljdCB3aXRoCisgICBhbnl0aGluZy4gICovCitleHRlcm4gY2hhciAqdGdvdG8gKCk7CisKK2ludCBpbnNlcnRfbW9kZSA9IDA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogICAgICAgTE9DQUwgU1RBVElDIEZPUldBUkQgREVDTFMgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF91cGRhdGVDb21tYW5kSW5mbyBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX3R1aUhhbmRsZVJlc2l6ZUR1cmluZ0lPIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVCTElDIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyoqIHR1aVB1dHNfdW5maWx0ZXJlZCgpLgorKiogICAgICAgIEZ1bmN0aW9uIHRvIHB1dCBhIHN0cmluZyB0byB0aGUgY29tbWFuZCB3aW5kb3cKKyoqICAgICAgICAgICAgICBXaGVuIHJ1bm5pbmcgaW4gVFVJIG1vZGUsIHRoaXMgaXMgdGhlICJob29rIgorKiogICAgICAgICAgICAgIGZvciBmcHV0c191bmZpbHRlcmVkKCkuIFRoYXQgaXMsIGFsbCBkZWJ1Z2dlcgorKiogICAgICAgICAgICAgIG91dHB1dCBldmVudHVhbGx5IG1ha2VzIGl0J3Mgd2F5IHRvIHRoZSBib3R0b20tbGV2ZWwKKyoqICAgICAgICAgICAgICByb3V0aW5lIGZwdXRzX3VuZmlsdGVyZWQgKG1haW4uYyksIHdoaWNoIChpbiBUVUkKKyoqICAgICAgICAgICAgICBtb2RlKSwgY2FsbHMgdHVpUHV0c191bmZpbHRlcmVkKCkuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlQdXRzX3VuZmlsdGVyZWQgKAorCQkgICAgIGNvbnN0IGNoYXIgKnN0cmluZywKKwkJICAgICBHREJfRklMRSAqIHN0cmVhbSkKKyNlbHNlCit0dWlQdXRzX3VuZmlsdGVyZWQgKHN0cmluZywgc3RyZWFtKQorICAgICBjaGFyICpzdHJpbmc7CisgICAgIEdEQl9GSUxFICpzdHJlYW07CisjZW5kaWYKK3sKKyAgaW50IGxlbiA9IHN0cmxlbiAoc3RyaW5nKTsKKyAgaW50IGksIGxpbmVjaDsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgeworICAgICAgaWYgKHN0cmluZ1tpXSA9PSAnXG4nIHx8IHN0cmluZ1tpXSA9PSAnXHInKQorCW1fdHVpU3RhcnROZXdMaW5lOworICAgICAgZWxzZQorCXsKKwkgIGlmICgoY21kV2luLT5kZXRhaWwuY29tbWFuZEluZm8uY3VyY2ggKyAxKSA+IGNtZFdpbi0+Z2VuZXJpYy53aWR0aCkKKwkgICAgbV90dWlTdGFydE5ld0xpbmU7CisKKwkgIGlmIChpbnNlcnRfbW9kZSkKKwkgICAgeworCSAgICAgIG12d2luc2NoIChjbWRXaW4tPmdlbmVyaWMuaGFuZGxlLAorCQkJY21kV2luLT5kZXRhaWwuY29tbWFuZEluZm8uY3VyTGluZSwKKwkJCWNtZFdpbi0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1cmNoKyssCisJCQlzdHJpbmdbaV0pOworCSAgICAgIHdtb3ZlIChjbWRXaW4tPmdlbmVyaWMuaGFuZGxlLAorCQkgICAgIGNtZFdpbi0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1ckxpbmUsCisJCSAgICAgY21kV2luLT5kZXRhaWwuY29tbWFuZEluZm8uY3VyY2gpOworCSAgICB9CisJICBlbHNlCisJICAgIG12d2FkZGNoIChjbWRXaW4tPmdlbmVyaWMuaGFuZGxlLAorCQkgICAgICBjbWRXaW4tPmRldGFpbC5jb21tYW5kSW5mby5jdXJMaW5lLAorCQkgICAgICBjbWRXaW4tPmRldGFpbC5jb21tYW5kSW5mby5jdXJjaCsrLAorCQkgICAgICBzdHJpbmdbaV0pOworCX0KKyAgICB9CisgIHR1aVJlZnJlc2hXaW4gKCZjbWRXaW4tPmdlbmVyaWMpOworCisgIHJldHVybjsKK30JCQkJLyogdHVpUHV0c191bmZpbHRlcmVkICovCisKKy8qIEEgY292ZXIgcm91dGluZSBmb3IgdHB1dHMoKS4KKyAqIHRwdXRzKCkgaXMgY2FsbGVkIGZyb20gdGhlIHJlYWRsaW5lIHBhY2thZ2UgdG8gcHV0CisgKiBvdXQgc3RyaW5ncyByZXByZXNlbnRpbmcgY3Vyc29yIHBvc2l0aW9uaW5nLgorICogSW4gVFVJIG1vZGUgKG5vbi1YREItc3R5bGUpLCB0dWlfdHB1dHMoKSBpcyBjYWxsZWQgaW5zdGVhZC4KKyAqCisgKiBUaGUgcmVhc29uIHdlIG5lZWQgdG8gaG9vayB0cHV0cygpIGlzOgorICogU2luY2UgdGhlIG91dHB1dCBpcyBnb2luZyB0byBjdXJzZXMgYW5kIG5vdCB0bworICogYSByYXcgdGVybWluYWwsIHdlIG5lZWQgdG8gaW50ZXJjZXB0IHRoZXNlIHNwZWNpYWwKKyAqIHNlcXVlbmNlcywgYW5kIGhhbmRsZSB0aGVtIHRoZW0gaGVyZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlZW1zIHRvIGJlIGNvcnJlY3RseSBoYW5kbGluZyBhbGwgc2VxdWVuY2VzCisgKiBhaW1lZCBhdCBocHRlcm0ncywgYnV0IHRoZXJlIGlzIGFkZGl0aW9uYWwgd29yayB0byBkbworICogZm9yIHh0ZXJtJ3MgYW5kIGR0dGVybSdzLiBJIGFiYW5kb25lZCBmdXJ0aGVyIHdvcmsgb24gdGhpcworICogaW4gZmF2b3Igb2YgIlhEQiBzdHlsZSIuIEluICJYREIgc3R5bGUiLCB0aGUgY29tbWFuZCByZWdpb24KKyAqIGxvb2tzIGxpa2UgdGVybWluYWwsIG5vdCBhIGN1cnNlcyB3aW5kb3csIGFuZCB0aGlzIHJvdXRpbmUKKyAqIGlzIG5vdCBjYWxsZWQuIC0gUlQKKyAqLwordm9pZAordHVpX3RwdXRzIChzdHIsIGFmZmNudCwgcHV0ZnVuYykKKyAgICAgY2hhciAqc3RyOworICAgICBpbnQgYWZmY250OworICAgICBpbnQgKCpwdXRmdW5jKSBQQVJBTVMgKChpbnQpKTsKK3sKKyAgZXh0ZXJuIGNoYXIgKnJsX3Byb21wdDsJLyogdGhlIHByb21wdCBzdHJpbmcgKi8KKworICAvKiBUaGlzIHNldCBvZiBnbG9iYWxzIGFyZSBkZWZpbmVkIGFuZCBpbml0aWFsaXplZAorICAgKiBieSB0aGUgcmVhZGxpbmUgcGFja2FnZS4KKyAgICoKKyAgICogTm90ZSB3ZSdyZSBhc3N1bWluZyB0dWlfdHB1dHMoKSBpcyBiZWluZyBjYWxsZWQKKyAgICogYnkgdGhlIHJlYWRsaW5lIHBhY2thZ2UuIFRoYXQncyBiZWNhdXNlIHdlJ3JlIHJlY29nbml6aW5nCisgICAqIHRoYXQgYSBnaXZlbiBzdHJpbmcgaXMgYmVpbmcgcGFzc2VkIGJ5CisgICAqIG1hdGNoaW5nIHRoZSBzdHJpbmcgYWRkcmVzcyBhZ2FpbnN0IHJlYWRsaW5lJ3MKKyAgICogdGVybV88d2hhdGV2ZXI+IGdsb2JhbC4gVG8gbWFrZSB0aGlzIG1vcmUgZ2VuZXJhbCwKKyAgICogd2UnZCBoYXZlIHRvIGFjdHVhbGx5IHJlY29nbml6ZSB0aGUgdGVybWNhcCBzZXF1ZW5jZQorICAgKiBpbnNpZGUgdGhlIHN0cmluZyAobW9yZSB3b3JrIHRoYW4gSSB3YW50IHRvIGRvKS4gLSBSVAorICAgKgorICAgKiBXZSBkb24ndCBzZWUgb3IgbmVlZCB0byBoYW5kbGUgZXZlcnkgb25lIG9mIHRoZXNlIGhlcmU7CisgICAqIHRoaXMgaXMganVzdCB0aGUgZnVsbCBsaXN0IGRlZmluZWQgaW4gcmVhZGxpbmUvcmVhZGxpbmUuYworICAgKi8KKyAgZXh0ZXJuIGNoYXIgKnRlcm1fYmFja3NwYWNlOworICBleHRlcm4gY2hhciAqdGVybV9jbHJlb2w7CisgIGV4dGVybiBjaGFyICp0ZXJtX2NscnBhZzsKKyAgZXh0ZXJuIGNoYXIgKnRlcm1fY3I7CisgIGV4dGVybiBjaGFyICp0ZXJtX2RjOworICBleHRlcm4gY2hhciAqdGVybV9laTsKKyAgZXh0ZXJuIGNoYXIgKnRlcm1fZ290bzsKKyAgZXh0ZXJuIGNoYXIgKnRlcm1faWM7CisgIGV4dGVybiBjaGFyICp0ZXJtX2ltOworICBleHRlcm4gY2hhciAqdGVybV9tbTsKKyAgZXh0ZXJuIGNoYXIgKnRlcm1fbW87CisgIGV4dGVybiBjaGFyICp0ZXJtX3VwOworICBleHRlcm4gY2hhciAqdGVybV9zY3JvbGxfcmVnaW9uOworICBleHRlcm4gY2hhciAqdGVybV9tZW1vcnlfbG9jazsKKyAgZXh0ZXJuIGNoYXIgKnRlcm1fbWVtb3J5X3VubG9jazsKKyAgZXh0ZXJuIGNoYXIgKnRlcm1fY3Vyc29yX21vdmU7CisgIGV4dGVybiBjaGFyICp2aXNpYmxlX2JlbGw7CisKKyAgLyogU2FuaXR5IGNoZWNrIC0gaWYgbm90IFRVSSwganVzdCBjYWxsIHRwdXRzKCkgKi8KKyAgaWYgKCF0dWlfdmVyc2lvbikKKyAgICB0cHV0cyAoc3RyLCBhZmZjbnQsIHB1dGZ1bmMpOworCisgIC8qIFRoZSBzdHJpbmdzIHdlIHNwZWNpYWwtY2FzZSBhcmUgaGFuZGxlZCBmaXJzdCAqLworCisgIGlmIChzdHIgPT0gdGVybV9iYWNrc3BhY2UpCisgICAgeworICAgICAgLyogQmFja3NwYWNlLiAqLworCisgICAgICAvKiBXZSBzZWUgdGhpcyBvbiBhbiBlbWFjcyBjb250cm9sLUIuCisgICAgICogSS5lLiwgaXQncyBsaWtlIHRoZSBsZWZ0LWFycm93IGtleSAobm90IGxpa2UgdGhlIGJhY2tzcGFjZSBrZXkpLgorICAgICAqIFRoZSBlZmZlY3QgdGhhdCByZWFkbGluZSB3YW50cyB3aGVuIGl0IHRyYW5zbWl0cyB0aGlzCisgICAgICogY2hhcmFjdGVyIHRvIHVzIGlzIHNpbXBseSB0byBiYWNrIHVwIG9uZSBjaGFyYWN0ZXIKKyAgICAgKiAoYnV0IG5vdCB0byB3cml0ZSBhIHNwYWNlIG92ZXIgdGhlIG9sZCBjaGFyYWN0ZXIpLgorICAgICAqLworCisgICAgICBfdXBkYXRlQ29tbWFuZEluZm8gKC0xKTsKKyAgICAgIHdtb3ZlIChjbWRXaW4tPmdlbmVyaWMuaGFuZGxlLAorCSAgICAgY21kV2luLT5kZXRhaWwuY29tbWFuZEluZm8uY3VyTGluZSwKKwkgICAgIGNtZFdpbi0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1cmNoKTsKKyAgICAgIHdyZWZyZXNoIChjbWRXaW4tPmdlbmVyaWMuaGFuZGxlKTsKKworICAgIH0KKyAgZWxzZSBpZiAoc3RyID09IHRlcm1fY2xyZW9sKQorICAgIHsKKworICAgICAgLyogQ2xlYXIgdG8gZW5kIG9mIGxpbmUuICovCisgICAgICB3Y2xydG9lb2wgKGNtZFdpbi0+Z2VuZXJpYy5oYW5kbGUpOworICAgICAgd3JlZnJlc2ggKGNtZFdpbi0+Z2VuZXJpYy5oYW5kbGUpOworCisgICAgfQorICBlbHNlIGlmIChzdHIgPT0gdGVybV9jcikKKyAgICB7CisKKyAgICAgIC8qIENhcnJpYWdlIHJldHVybiAqLworICAgICAgX3VwZGF0ZUNvbW1hbmRJbmZvICgtY21kV2luLT5kZXRhaWwuY29tbWFuZEluZm8uY3VyY2gpOworICAgICAgd21vdmUgKGNtZFdpbi0+Z2VuZXJpYy5oYW5kbGUsCisJICAgICBjbWRXaW4tPmRldGFpbC5jb21tYW5kSW5mby5jdXJMaW5lLAorCSAgICAgMCAvKiByZWFkbGluZSB3aWxsIHJld3JpdGUgdGhlIHByb21wdCBmcm9tIDAgKi8gKTsKKyAgICAgIHdyZWZyZXNoIChjbWRXaW4tPmdlbmVyaWMuaGFuZGxlKTsKKworICAgIH0KKyAgZWxzZSBpZiAoc3RyID09IHRlcm1fZ290bykKKyAgICB7CisKKyAgICAgIC8qIFRoaXMgaXMgYWN0dWFsbHkgYSB0Z290bygpIHNwZWNpZnlpbmcgYSBjaGFyYWN0ZXIgcG9zaXRpb24sCisgICAgICogZm9sbG93ZWQgYnkgZWl0aGVyIGEgdGVybV9JQy90ZXJtX0RDIHdoaWNoIFtJIHRoaW5rXSBtZWFucworICAgICAqIGluc2VydC9kZWxldGUgb25lIGNoYXJhY3RlciBhdCB0aGF0IHBvc2l0aW9uLgorICAgICAqIFRoZXJlIGFyZSBjb21wbGljYXRpb25zIHdpdGggdGhpcyBvbmUgLSBuZWVkIHRvIGVpdGhlcgorICAgICAqIGV4dHJhY3QgdGhlIHBvc2l0aW9uIGZyb20gdGhlIHN0cmluZywgb3IgaGF2ZSBhIGJhY2tkb29yCisgICAgICogbWVhbnMgb2YgY29tbXVuaWNhdGluZyBpdCBmcm9tIC4uL3JlYWRsaW5lL2Rpc3BsYXkuYy4KKyAgICAgKiBTbyB0aGlzIG9uZSBpcyBub3QgeWV0IGltcGxlbWVudGVkLgorICAgICAqIE5vdCBkb2luZyBpdCBzZWVtcyB0byBoYXZlIG5vIGlsbCBlZmZlY3RzIG9uIGNvbW1hbmQtbGluZS1lZGl0aW5nCisgICAgICogdGhhdCBJJ3ZlIG5vdGljZWQgc28gZmFyLiAtIFJUCisgICAgICovCisKKyAgICB9CisgIGVsc2UgaWYgKHN0ciA9PSB0ZXJtX2RjKQorICAgIHsKKworICAgICAgLyogRGVsZXRlIGNoYXJhY3RlciBhdCBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiAqLworICAgICAgd2RlbGNoIChjbWRXaW4tPmdlbmVyaWMuaGFuZGxlKTsKKyAgICAgIHdyZWZyZXNoIChjbWRXaW4tPmdlbmVyaWMuaGFuZGxlKTsKKworICAgIH0KKyAgZWxzZSBpZiAoc3RyID09IHRlcm1faW0pCisgICAgeworCisgICAgICAvKiBUdXJuIG9uIGluc2VydCBtb2RlLiAqLworICAgICAgaW5zZXJ0X21vZGUgPSAxOworCisgICAgfQorICBlbHNlIGlmIChzdHIgPT0gdGVybV9laSkKKyAgICB7CisKKyAgICAgIC8qIFR1cm4gb2ZmIGluc2VydCBtb2RlLiAqLworICAgICAgaW5zZXJ0X21vZGUgPSAwOworCisgICAgICAvKiBTdHJpbmdzIHdlIGtub3cgYWJvdXQgYnV0IGRvbid0IGhhbmRsZQorICAgKiBzcGVjaWFsbHkgaGVyZSBhcmUganVzdCBwYXNzZWQgYWxvbmcgdG8gdHB1dHMoKS4KKyAgICoKKyAgICogVGhlc2UgYXJlIG5vdCBoYW5kbGVkIGJlY2F1c2UgKGFzIGZhciBhcyBJIGNhbiB0ZWxsKQorICAgKiB0aGV5IGFyZSBub3QgYWN0dWFsbHkgZW1pdHRlZCBieSB0aGUgcmVhZGxpbmUgcGFja2FnZQorICAgKiBpbiB0aGUgY291cnNlIG9mIGRvaW5nIGNvbW1hbmQtbGluZSBlZGl0aW5nLiBTb21lIG9mIHRoZW0KKyAgICogdGhlb3JldGljYWxseSBjb3VsZCBiZSB1c2VkIGluIHRoZSBmdXR1cmUsIGluIHdoaWNoIGNhc2Ugd2UnZAorICAgKiBuZWVkIHRvIGhhbmRsZSB0aGVtLgorICAgKi8KKyAgICB9CisgIGVsc2UgaWYgKHN0ciA9PSB0ZXJtX2ljIHx8CS8qIGluc2VydCBjaGFyYWN0ZXIgKi8KKwkgICBzdHIgPT0gdGVybV9jdXJzb3JfbW92ZSB8fAkvKiBjdXJzb3IgbW92ZSAqLworCSAgIHN0ciA9PSB0ZXJtX2NscnBhZyB8fC8qIGNsZWFyIHBhZ2UgKi8KKwkgICBzdHIgPT0gdGVybV9tbSB8fAkvKiB0dXJuIG9uIG1ldGEga2V5ICovCisJICAgc3RyID09IHRlcm1fbW8gfHwJLyogdHVybiBvZmYgbWV0YSBrZXkgKi8KKwkgICBzdHIgPT0gdGVybV91cCB8fAkvKiB1cCBvbmUgbGluZSAobm90IGV4cGVjdGVkKSAqLworCSAgIHN0ciA9PSB0ZXJtX3Njcm9sbF9yZWdpb24gfHwJLyogc2V0IHNjcm9sbCByZWdpb24gKi8KKwkgICBzdHIgPT0gdGVybV9tZW1vcnlfbG9jayB8fAkvKiBsb2NrIHNjcmVlbiBhYm92ZSBjdXJzb3IgKi8KKwkgICBzdHIgPT0gdGVybV9tZW1vcnlfdW5sb2NrIHx8CS8qIHVubG9jayBzY3JlZW4gYWJvdmUgY3Vyc29yICovCisJICAgc3RyID09IHZpc2libGVfYmVsbCkKKyAgICB7CQkJCS8qIGZsYXNoIHNjcmVlbiAqLworICAgICAgdHB1dHMgKHN0ciwgYWZmY250LCBwdXRmdW5jKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CQkJCS8qIHNvbWV0aGluZyBlbHNlICovCisgICAgICB0cHV0cyAoc3RyLCBhZmZjbnQsIHB1dGZ1bmMpOworICAgIH0KK30JCQkJLyogdHVpX3RwdXRzICovCisKKworLyoKKyoqIHR1aV92d2dldGNoKCkKKyoqICAgICAgICBXcmFwcGVyIGFyb3VuZCB3Z2V0Y2ggd2l0aCB0aGUgd2luZG93IGluIGEgdmFfbGlzdAorKi8KK3Vuc2lnbmVkIGludAorI2lmZGVmIF9fU1REQ19fCit0dWlfdndnZXRjaCAodmFfbGlzdCBhcmdzKQorI2Vsc2UKK3R1aV92d2dldGNoIChhcmdzKQorICAgICB2YV9saXN0IGFyZ3M7CisjZW5kaWYKK3sKKyAgdW5zaWduZWQgaW50IGNoOworICBXSU5ET1cgKndpbmRvdzsKKworICB3aW5kb3cgPSB2YV9hcmcgKGFyZ3MsIFdJTkRPVyAqKTsKKworICByZXR1cm4gKCh1bnNpZ25lZCBpbnQpIHdnZXRjaCAod2luZG93KSk7Cit9CQkJCS8qIHR1aV92d2dldGNoICovCisKKworLyoKKyoqIHR1aV92cmVhZCgpCisqKiAgIFdyYXBwZXIgYXJvdW5kIHJlYWQoKSB3aXRoIHBhcmFtZXRzIGluIGEgdmFfbGlzdAorKi8KK3Vuc2lnbmVkIGludAorI2lmZGVmIF9fU1REQ19fCit0dWlfdnJlYWQgKHZhX2xpc3QgYXJncykKKyNlbHNlCit0dWlfdnJlYWQgKGFyZ3MpCisgICAgIHZhX2xpc3QgYXJnczsKKyNlbmRpZgoreworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IGZpbGVkZXMgPSB2YV9hcmcgKGFyZ3MsIGludCk7CisgIGNoYXIgKmJ1ZiA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKKyAgaW50IG5ieXRlcyA9IHZhX2FyZyAoYXJncywgaW50KTsKKworICByZXN1bHQgPSByZWFkIChmaWxlZGVzLCBidWYsIG5ieXRlcyk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30JCQkJLyogdHVpX3ZyZWFkKCkgKi8KKworLyoKKyoqIHR1aVJlYWQoKQorKiogICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBhIHJlYWQoKSBjYXRjaGluZyByZXNpemUgZXZlbnRzCisqLworaW50CisjaWZkZWYgX19TVERDX18KK3R1aVJlYWQgKAorCSAgaW50IGZpbGVkZXMsCisJICBjaGFyICpidWYsCisJICBpbnQgbmJ5dGVzKQorI2Vsc2UKK3R1aVJlYWQgKGZpbGVkZXMsIGJ1ZiwgbmJ5dGVzKQorICAgICBpbnQgZmlsZWRlczsKKyAgICAgY2hhciAqYnVmOworICAgICBpbnQgbmJ5dGVzOworI2VuZGlmCit7CisgIGludCByZXN1bHQgPSAwOworCisgIHJlc3VsdCA9IChpbnQpIHZjYXRjaF9lcnJvcnMgKChPcGFxdWVGdW5jUHRyKSB0dWlfdnJlYWQsIGZpbGVkZXMsIGJ1ZiwgbmJ5dGVzKTsKKyAgKmJ1ZiA9IF90dWlIYW5kbGVSZXNpemVEdXJpbmdJTyAoKmJ1Zik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30JCQkJLyogdHVpUmVhZCAqLworCisKKy8qCisqKiB0dWlHZXRjKCkuCisqKiAgICAgICAgR2V0IGEgY2hhcmFjdGVyIGZyb20gdGhlIGNvbW1hbmQgd2luZG93LgorKioJCVRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIHJlYWRsaW5lIHBhY2thZ2UsCisqKiAgICAgICAgICAgICAgdGhhdCBpcywgd2UgaGF2ZToKKyoqICAgICAgICAgICAgICAgIHR1aUdldGMoKSBbaGVyZV0sIGNhbGxlZCBmcm9tCisqKiAgICAgICAgICAgICAgICByZWFkbGluZSBjb2RlIFtpbiAuLi9yZWFkbGluZS9dLCBjYWxsZWQgZnJvbQorKiogICAgICAgICAgICAgICAgY29tbWFuZF9saW5lX2lucHV0KCkgaW4gdG9wLmMKKyovCit1bnNpZ25lZCBpbnQKKyNpZmRlZiBfX1NURENfXwordHVpR2V0YyAodm9pZCkKKyNlbHNlCit0dWlHZXRjICgpCisjZW5kaWYKK3sKKyAgdW5zaWduZWQgaW50IGNoOworICBleHRlcm4gY2hhciAqcmxfcHJvbXB0OworICBleHRlcm4gY2hhciAqcmxfbGluZV9idWZmZXI7CisgIGV4dGVybiBpbnQgcmxfcG9pbnQ7CisKKyAgLyogQ2FsbCB0aGUgY3Vyc2VzIHJvdXRpbmUgdGhhdCByZWFkcyBvbmUgY2hhcmFjdGVyICovCisjaWZuZGVmIENPTU1FTlQKKyAgY2ggPSAodW5zaWduZWQgaW50KSB2Y2F0Y2hfZXJyb3JzICgoT3BhcXVlRnVuY1B0cikgdHVpX3Z3Z2V0Y2gsCisJCQkJICAgICBjbWRXaW4tPmdlbmVyaWMuaGFuZGxlKTsKKyNlbHNlCisgIGNoID0gd2dldGNoIChjbWRXaW4tPmdlbmVyaWMuaGFuZGxlKTsKKyNlbmRpZgorICBjaCA9IF90dWlIYW5kbGVSZXNpemVEdXJpbmdJTyAoY2gpOworCisgIGlmIChtX2lzQ29tbWFuZENoYXIgKGNoKSkKKyAgICB7CQkJCS8qIEhhbmRsZSBwcmV2L25leHQvdXAvZG93biBoZXJlICovCisgICAgICB0dWlUZXJtU2V0dXAgKDApOworICAgICAgY2ggPSB0dWlEaXNwYXRjaEN0cmxDaGFyIChjaCk7CisgICAgICBjbWRXaW4tPmRldGFpbC5jb21tYW5kSW5mby5jdXJjaCA9IHN0cmxlbiAocmxfcHJvbXB0KSArIHJsX3BvaW50OworICAgICAgdHVpVGVybVVuc2V0dXAgKDAsIGNtZFdpbi0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1cmNoKTsKKyAgICB9CisgIGlmIChjaCA9PSAnXG4nIHx8IGNoID09ICdccicgfHwgY2ggPT0gJ1xmJykKKyAgICBjbWRXaW4tPmRldGFpbC5jb21tYW5kSW5mby5jdXJjaCA9IDA7CisgIGVsc2UKKyAgICB0dWlJbmNyQ29tbWFuZENoYXJDb3VudEJ5ICgxKTsKKworICByZXR1cm4gY2g7Cit9CQkJCS8qIHR1aUdldGMgKi8KKworCisvKgorKiogdHVpQnVmZmVyR2V0YygpLgorKi8KKy8qZWx6OiB0aGlzIGZ1bmN0aW9uIHJlYWRzIGEgbGluZSBvZiBpbnB1dCBmcm9tIHRoZSB1c2VyIGFuZAorcHV0cyBpdCBpbiBhIHN0YXRpYyBidWZmZXIuIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhpcyBzYW1lIGZ1bmN0aW9uCitvYnRhaW4gb25lIGNoYXIgYXQgdGhlIHRpbWUsIHByb3ZpZGluZyB0aGUgY2FsbGVyIHdpdGggYSBiZWhhdmlvcgorc2ltaWxhciB0byBmZ2V0Yy4gV2hlbiB0aGUgaW5wdXQgaXMgYnVmZmVyZWQsIHRoZSBiYWNrc3BhY2VzIGhhdmUKK3RoZSBuZWVkZWQgZWZmZWN0LCBpLmUuIGlnbm9yZSB0aGUgbGFzdCBjaGFyIGFjdGl2ZSBpbiB0aGUgYnVmZmVyKi8KKy8qIHNvIGZhciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IGZyb20gdGhlIHF1ZXJ5IGZ1bmN0aW9uIGluCit1dGlscy5jKi8KKwordW5zaWduZWQgaW50CisjaWZkZWYgX19TVERDX18KK3R1aUJ1ZmZlckdldGMgKHZvaWQpCisjZWxzZQordHVpQnVmZmVyR2V0YyAoKQorI2VuZGlmCit7CisgIHVuc2lnbmVkIGludCBjaDsKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgX2lidWZmZXJbNTEyXTsKKyAgc3RhdGljIGludCBpbmRleF9yZWFkID0gLTE7CisgIHN0YXRpYyBpbnQgbGVuZ3RoX29mX2Fuc3dlciA9IC0xOworICBpbnQgcG9zID0gMDsKKworICBpZiAobGVuZ3RoX29mX2Fuc3dlciA9PSAtMSkKKyAgICB7CisgICAgICAvKiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRocm91Z2gsIG5lZWQgdG8gcmVhZCB0aGUgYW5zd2VyKi8KKyAgICAgIGRvCisJeworCSAgLyogQ2FsbCB0aGUgY3Vyc2VzIHJvdXRpbmUgdGhhdCByZWFkcyBvbmUgY2hhcmFjdGVyICovCisJICBjaCA9ICh1bnNpZ25lZCBpbnQpIHdnZXRjaCAoY21kV2luLT5nZW5lcmljLmhhbmRsZSk7CisJICBpZiAoY2ggIT0gJ1xiJykKKwkgICAgeworCSAgICAgIF9pYnVmZmVyW3Bvc10gPSBjaDsKKwkgICAgICBwb3MrKzsKKwkgICAgfQorCSAgZWxzZQorCSAgICBwb3MtLTsKKwl9CisgICAgICB3aGlsZSAoY2ggIT0gJ1xyJyAmJiBjaCAhPSAnXG4nKTsKKworICAgICAgbGVuZ3RoX29mX2Fuc3dlciA9IHBvczsKKyAgICAgIGluZGV4X3JlYWQgPSAwOworICAgIH0KKworICBjaCA9IF9pYnVmZmVyW2luZGV4X3JlYWRdOworICBpbmRleF9yZWFkKys7CisKKyAgaWYgKGluZGV4X3JlYWQgPT0gbGVuZ3RoX29mX2Fuc3dlcikKKyAgICB7CisgICAgICAvKnRoaXMgaXMgdGhlIGxhc3QgdGltZSB0aHJvdWdoLCByZXNldCBmb3IgbmV4dCBxdWVyeSovCisgICAgICBpbmRleF9yZWFkID0gLTE7CisgICAgICBsZW5ndGhfb2ZfYW5zd2VyID0gLTE7CisgICAgfQorCisgIHdyZWZyZXNoIChjbWRXaW4tPmdlbmVyaWMuaGFuZGxlKTsKKworICByZXR1cm4gKGNoKTsKK30JCQkJLyogdHVpQnVmZmVyR2V0YyAqLworCisKKy8qCisqKiB0dWlTdGFydE5ld0xpbmVzKCkuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlTdGFydE5ld0xpbmVzICgKKwkJICAgaW50IG51bUxpbmVzKQorI2Vsc2UKK3R1aVN0YXJ0TmV3TGluZXMgKG51bUxpbmVzKQorICAgICBpbnQgbnVtTGluZXM7CisjZW5kaWYKK3sKKyAgaWYgKG51bUxpbmVzID4gMCkKKyAgICB7CisgICAgICBpZiAoY21kV2luLT5nZW5lcmljLnZpZXdwb3J0SGVpZ2h0ID4gMSAmJgorCWNtZFdpbi0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1ckxpbmUgPCBjbWRXaW4tPmdlbmVyaWMudmlld3BvcnRIZWlnaHQpCisJY21kV2luLT5kZXRhaWwuY29tbWFuZEluZm8uY3VyTGluZSArPSBudW1MaW5lczsKKyAgICAgIGVsc2UKKwlzY3JvbGwgKGNtZFdpbi0+Z2VuZXJpYy5oYW5kbGUpOworICAgICAgY21kV2luLT5kZXRhaWwuY29tbWFuZEluZm8uY3VyY2ggPSAwOworICAgICAgd21vdmUgKGNtZFdpbi0+Z2VuZXJpYy5oYW5kbGUsCisJICAgICBjbWRXaW4tPmRldGFpbC5jb21tYW5kSW5mby5jdXJMaW5lLAorCSAgICAgY21kV2luLT5kZXRhaWwuY29tbWFuZEluZm8uY3VyY2gpOworICAgICAgdHVpUmVmcmVzaFdpbiAoJmNtZFdpbi0+Z2VuZXJpYyk7CisgICAgfQorCisgIHJldHVybjsKK30JCQkJLyogdHVpU3RhcnROZXdMaW5lcyAqLworCisKKy8qCisqKiB0dWlfdlN0YXJ0TmV3TGluZXMoKS4KKyoqICAgICAgICBXaXRoIG51bUxpbmVzIGluIGEgdmFfbGlzdAorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpX3ZTdGFydE5ld0xpbmVzICgKKwkJICAgICB2YV9saXN0IGFyZ3MpCisjZWxzZQordHVpX3ZTdGFydE5ld0xpbmVzIChhcmdzKQorICAgICB2YV9saXN0IGFyZ3M7CisjZW5kaWYKK3sKKyAgaW50IG51bUxpbmVzID0gdmFfYXJnIChhcmdzLCBpbnQpOworCisgIHR1aVN0YXJ0TmV3TGluZXMgKG51bUxpbmVzKTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aV92U3RhcnROZXdMaW5lcyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiAgICAgICAgICAgICAgICAgICBMT0NBTCBTVEFUSUMgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKyoqIF90dWlIYW5kbGVSZXNpemVEdXJpbmdJTworKiogICAgVGhpcyBmdW5jdGlvbiBtYW5hZ2VzIHRoZSBjbGVhbnVwIHdoZW4gYSByZXNpemUgaGFzIG9jY3VyZWQKKyoqICAgIEZyb20gd2l0aGluIGEgY2FsbCB0byBnZXRjaCgpIG9yIHJlYWQuICBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIKKyoqICAgIHRvIHJldHVybiBmcm9tIGdldGMgb3IgcmVhZC4KKyovCitzdGF0aWMgdW5zaWduZWQgaW50CisjaWZkZWYgX19TVERDX18KK190dWlIYW5kbGVSZXNpemVEdXJpbmdJTyAoCisJCQkgICB1bnNpZ25lZCBpbnQgb3JpZ2luYWxDaCkJLyogdGhlIGNoYXIganVzdCByZWFkICovCisjZWxzZQorX3R1aUhhbmRsZVJlc2l6ZUR1cmluZ0lPIChvcmlnaW5hbENoKQorICAgICB1bnNpZ25lZCBpbnQgb3JpZ2luYWxDaDsKKyNlbmRpZgoreworICBpZiAodHVpV2luUmVzaXplZCAoKSkKKyAgICB7CisgICAgICB0dWlEbyAoKFR1aU9wYXF1ZUZ1bmNQdHIpIHR1aVJlZnJlc2hBbGwpOworICAgICAgZG9udF9yZXBlYXQgKCk7CisgICAgICB0dWlTZXRXaW5SZXNpemVkVG8gKEZBTFNFKTsKKyAgICAgIHJsX3Jlc2V0ICgpOworICAgICAgcmV0dXJuICdcbic7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIG9yaWdpbmFsQ2g7Cit9CQkJCS8qIF90dWlIYW5kbGVSZXNpemVEdXJpbmdJTyAqLworCisKKy8qCisqKiBfdXBkYXRlQ29tbWFuZEluZm8oKS4KKyoqICAgICAgICBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIGNvbW1hbmQgd2luZG93IGluZm9ybWF0aW9uLgorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK191cGRhdGVDb21tYW5kSW5mbyAoCisJCSAgICAgaW50IHNpemVPZlN0cmluZykKKyNlbHNlCitfdXBkYXRlQ29tbWFuZEluZm8gKHNpemVPZlN0cmluZykKKyAgICAgaW50IHNpemVPZlN0cmluZzsKKyNlbmRpZgoreworCisgIGlmICgoc2l6ZU9mU3RyaW5nICsKKyAgICAgICBjbWRXaW4tPmRldGFpbC5jb21tYW5kSW5mby5jdXJjaCkgPiBjbWRXaW4tPmdlbmVyaWMud2lkdGgpCisgICAgeworICAgICAgaW50IG5ld0N1cmNoID0gc2l6ZU9mU3RyaW5nICsgY21kV2luLT5kZXRhaWwuY29tbWFuZEluZm8uY3VyY2g7CisKKyAgICAgIHR1aVN0YXJ0TmV3TGluZXMgKDEpOworICAgICAgY21kV2luLT5kZXRhaWwuY29tbWFuZEluZm8uY3VyY2ggPSBuZXdDdXJjaCAtIGNtZFdpbi0+Z2VuZXJpYy53aWR0aDsKKyAgICB9CisgIGVsc2UKKyAgICBjbWRXaW4tPmRldGFpbC5jb21tYW5kSW5mby5jdXJjaCArPSBzaXplT2ZTdHJpbmc7CisKKyAgcmV0dXJuOworfQkJCQkvKiBfdXBkYXRlQ29tbWFuZEluZm8gKi8KKworCisvKiBMb29rZWQgYXQgaW4gbWFpbi5jLCBmcHV0c191bmZpbHRlcmVkKCksIHRvIGRlY2lkZQorICogaWYgaXQncyBzYWZlIHRvIGRvIHN0YW5kYXJkIG91dHB1dCB0byB0aGUgY29tbWFuZCB3aW5kb3cuCisgKi8KK2ludCB0dWlfb3duc190ZXJtaW5hbCA9IDA7CisKKy8qIENhbGxlZCB0byBzZXQgdXAgdGhlIHRlcm1pbmFsIGZvciBUVUkgKGN1cnNlcykgSS9PLgorICogV2UgZG8gdGhpcyBlaXRoZXIgb24gb3VyIHdheSAiaW4iIHRvIEdEQiBhZnRlciB0YXJnZXQKKyAqIHByb2dyYW0gZXhlY3V0aW9uLCBvciBlbHNlIHdpdGhpbiB0dWlEbyBqdXN0IGJlZm9yZQorICogZ29pbmcgb2ZmIHRvIFRVSSByb3V0aW5lcy4KKyAqLworCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aVRlcm1TZXR1cCAoCisJICAgICAgIGludCB0dXJuX29mZl9lY2hvKQorI2Vsc2UKK3R1aVRlcm1TZXR1cCAodHVybl9vZmZfZWNobykKKyAgICAgaW50IHR1cm5fb2ZmX2VjaG87CisjZW5kaWYKK3sKKyAgY2hhciAqYnVmZmVyOworICBpbnQgc3RhcnQ7CisgIGludCBlbmQ7CisgIGludCBlbmRjb2w7CisgIGV4dGVybiBjaGFyICp0ZXJtX3Njcm9sbF9yZWdpb247CisgIGV4dGVybiBjaGFyICp0ZXJtX2N1cnNvcl9tb3ZlOworICBleHRlcm4gY2hhciAqdGVybV9tZW1vcnlfbG9jazsKKyAgZXh0ZXJuIGNoYXIgKnRlcm1fbWVtb3J5X3VubG9jazsKKworICAvKiBUdXJuIG9mZiBlY2hvaW5nLCBzaW5jZSB0aGUgVFVJIGRvZXMgbm90CisgICAgICogZXhwZWN0IGVjaG9pbmcuIEJlbG93IEkgb25seSBwdXQgaW4gdGhlIFRFUk1JT1MKKyAgICAgKiBjYXNlLCBzaW5jZSB0aGF0IGlzIHdoYXQgYXBwbGllcyBvbiBIUC1VWC4gdHVybl9vZmZfZWNobworICAgICAqIGlzIDEgZXhjZXB0IGZvciB0aGUgY2FzZSB3aGVyZSB3ZSdyZSBiZWluZyBjYWxsZWQKKyAgICAgKiBvbiBhICJxdWl0IiwgaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGxlYXZlIGVjaG8gb24uCisgICAgICovCisgIGlmICh0dXJuX29mZl9lY2hvKQorICAgIHsKKyNpZmRlZiBIQVZFX1RFUk1JT1MKKyAgICAgIHN0cnVjdCB0ZXJtaW9zIHRpbzsKKyAgICAgIHRjZ2V0YXR0ciAoMCwgJnRpbyk7CisgICAgICB0aW8uY19sZmxhZyAmPSB+KEVDSE8pOworICAgICAgdGNzZXRhdHRyICgwLCBUQ1NBTk9XLCAmdGlvKTsKKyNlbmRpZgorICAgIH0KKworICAvKiBDb21wdXRlIHRoZSBzdGFydCBhbmQgZW5kIGxpbmVzIG9mIHRoZSBjb21tYW5kCisgICAgICogcmVnaW9uLiAoQWN0dWFsbHkgd2Ugb25seSB1c2UgZW5kIGhlcmUpCisgICAgICovCisgIHN0YXJ0ID0gd2luTGlzdFtDTURfV0lOXS0+Z2VuZXJpYy5vcmlnaW4ueTsKKyAgZW5kID0gc3RhcnQgKyB3aW5MaXN0W0NNRF9XSU5dLT5nZW5lcmljLmhlaWdodCAtIDE7CisgIGVuZGNvbCA9IHdpbkxpc3RbQ01EX1dJTl0tPmdlbmVyaWMud2lkdGggLSAxOworCisgIGlmICh0ZXJtX21lbW9yeV91bmxvY2spCisgICAgeworCisgICAgICAvKiBVbi1kbyB0aGUgZWZmZWN0IG9mIHRoZSBtZW1vcnkgbG9jayBpbiB0ZXJtaW5hbF9pbmZlcmlvcigpICovCisgICAgICB0cHV0cyAodGVybV9tZW1vcnlfdW5sb2NrLCAxLCAoaW50ICgqKVBBUkFNUyAoKGludCkpKSBwdXRjaGFyKTsKKyAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKworICAgIH0KKyAgZWxzZSBpZiAodGVybV9zY3JvbGxfcmVnaW9uKQorICAgIHsKKworICAgICAgLyogVW4tZG8gdGhlIGVmZmVjdCBvZiBzZXR0aW5nIHNjcm9sbCByZWdpb24gaW4gdGVybWluYWxfaW5mZXJpb3IoKSAqLworICAgICAgLyogSSdtIGFjdHVhbGx5IG5vdCBzdXJlIGhvdyB0byBkbyB0aGlzICh3ZSBkb24ndCBrbm93IGZvcgorICAgICAgICogc3VyZSB3aGF0IHRoZSBzY3JvbGwgcmVnaW9uIHdhcyAqYmVmb3JlKiB3ZSBjaGFuZ2VkIGl0KSwKKyAgICAgICAqIGJ1dCBJJ2xsIGd1ZXNzIHRoYXQgc2V0dGluZyBpdCB0byB0aGUgd2hvbGUgc2NyZWVuIGlzCisgICAgICAgKiB0aGUgcmlnaHQgdGhpbmcuIFNvLCAuLi4KKyAgICAgICAqLworCisgICAgICAvKiBTZXQgc2Nyb2xsIHJlZ2lvbiB0byBiZSAwLi5lbmQgKi8KKyAgICAgIGJ1ZmZlciA9IChjaGFyICopIHRnb3RvICh0ZXJtX3Njcm9sbF9yZWdpb24sIGVuZCwgMCk7CisgICAgICB0cHV0cyAoYnVmZmVyLCAxLCAoaW50ICgqKVBBUkFNUyAoKGludCkpKSBwdXRjaGFyKTsKKworICAgIH0JCQkJLyogZWxzZSB3ZSdyZSBvdXQgb2YgbHVjayAqLworCisgIC8qIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBrZWVwIHRoZSBsb2dpY2FsICYgcGh5c2ljYWwKKyAgICAgICAqIGN1cnNvciBpbiBzeW5jaCwgZ29pbmcgaW50byBjdXJzZXMuIFdpdGhvdXQgdGhpcywKKyAgICAgICAqIGN1cnNlcyBzZWVtcyB0byBiZSBjb25mdXNlZCBieSB0aGUgZmFjdCB0aGF0CisgICAgICAgKiBHREIgaGFzIHBoeXNpY2FsbHkgbW92ZWQgdGhlIGN1cnNlciBvbiBpdC4gT25lCisgICAgICAgKiB2aXNpYmxlIGVmZmVjdCBvZiByZW1vdmluZyB0aGlzIGNvZGUgaXMgdGhhdCB0aGUKKyAgICAgICAqIGxvY2F0b3Igd2luZG93IGZhaWxzIHRvIGdldCB1cGRhdGVkIGFuZCB0aGUgbGluZQorICAgICAgICogb2YgdGV4dCB0aGF0ICpzaG91bGQqIGdvIGludG8gdGhlIGxvY2F0b3Igd2luZG93CisgICAgICAgKiBvZnRlbiBnb2VzIHRvIHRoZSB3cm9uZyBwbGFjZS4KKyAgICAgICAqLworICAvKiBXaGF0J3MgZG9uZSBoZXJlIGlzIHRvICB0ZWxsIGN1cnNlcyB0byB3cml0ZSBhICcgJworICAgICAgICogYXQgdGhlIGJvdHRvbSByaWdodCBjb3JuZXIgb2YgdGhlIHNjcmVlbi4KKyAgICAgICAqIFRoZSBpZGVhIGlzIHRvIHdpbmQgdXAgd2l0aCB0aGUgY3Vyc29yIGluIGEga25vd24KKyAgICAgICAqIHBsYWNlLgorICAgICAgICogTm90ZSBJJ20gcmVseWluZyBvbiByZWZyZXNoKCkKKyAgICAgICAqIG9ubHkgd3JpdGluZyB3aGF0IGNoYW5nZWQgKHRoZSBzcGFjZSksCisgICAgICAgKiBub3QgdGhlIHdob2xlIHNjcmVlbi4KKyAgICAgICAqLworICBzdGFuZGVuZCAoKTsKKyAgbW92ZSAoZW5kLCBlbmRjb2wgLSAxKTsKKyAgYWRkY2ggKCcgJyk7CisgIHJlZnJlc2ggKCk7CisKKyAgdHVpX293bnNfdGVybWluYWwgPSAxOworfQkJCQkvKiB0dWlUZXJtU2V0dXAgKi8KKworCisvKiBDYWxsZWQgdG8gc2V0IHVwIHRoZSB0ZXJtaW5hbCBmb3IgdGFyZ2V0IHByb2dyYW0gSS9PLCBtZWFuaW5nIEkvTworICogaXMgY29uZmluZWQgdG8gdGhlIGNvbW1hbmQtd2luZG93IGFyZWEuICBXZSBhbHNvIGNhbGwgdGhpcyBvbiBvdXIKKyAqIHdheSBvdXQgb2YgdHVpRG8sIHRodXMgc2V0dGluZyB1cCB0aGUgdGVybWluYWwgdGhpcyB3YXkgZm9yCisgKiBkZWJ1Z2dlciBjb21tYW5kIEkvTy4gICovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aVRlcm1VbnNldHVwICgKKwkJIGludCB0dXJuX29uX2VjaG8sCisJCSBpbnQgdG9fY29sdW1uKQorI2Vsc2UKK3R1aVRlcm1VbnNldHVwICh0dXJuX29uX2VjaG8sIHRvX2NvbHVtbikKKyAgICAgaW50IHR1cm5fb25fZWNobzsKKyAgICAgaW50IHRvX2NvbHVtbjsKKyNlbmRpZgoreworICBpbnQgc3RhcnQ7CisgIGludCBlbmQ7CisgIGludCBjdXJsaW5lOworICBjaGFyICpidWZmZXI7CisgIC8qIFRoZSBuZXh0IGJ1bmNoIG9mIHRoaW5ncyBhcmUgZnJvbSByZWFkbGluZSAqLworICBleHRlcm4gY2hhciAqdGVybV9zY3JvbGxfcmVnaW9uOworICBleHRlcm4gY2hhciAqdGVybV9jdXJzb3JfbW92ZTsKKyAgZXh0ZXJuIGNoYXIgKnRlcm1fbWVtb3J5X2xvY2s7CisgIGV4dGVybiBjaGFyICp0ZXJtX21lbW9yeV91bmxvY2s7CisgIGV4dGVybiBjaGFyICp0ZXJtX3NlOworCisgIC8qIFdlIG5lZWQgdG8gdHVybiBvbiBlY2hvaW5nLCBzaW5jZSB0aGUgVFVJIHR1cm5zIGl0IG9mZiAqLworICAvKiBCZWxvdyBJIG9ubHkgcHV0IGluIHRoZSBURVJNSU9TIGNhc2UsIHNpbmNlIHRoYXQKKyAgICAgKiBpcyB3aGF0IGFwcGxpZXMgb24gSFAtVVguCisgICAgICovCisgIGlmICh0dXJuX29uX2VjaG8pCisgICAgeworI2lmZGVmIEhBVkVfVEVSTUlPUworICAgICAgc3RydWN0IHRlcm1pb3MgdGlvOworICAgICAgdGNnZXRhdHRyICgwLCAmdGlvKTsKKyAgICAgIHRpby5jX2xmbGFnIHw9IChFQ0hPKTsKKyAgICAgIHRjc2V0YXR0ciAoMCwgVENTQU5PVywgJnRpbyk7CisjZW5kaWYKKyAgICB9CisKKyAgLyogQ29tcHV0ZSB0aGUgc3RhcnQgYW5kIGVuZCBsaW5lcyBvZiB0aGUgY29tbWFuZAorICAgICAqIHJlZ2lvbiwgYXMgd2VsbCBhcyB0aGUgbGFzdCAicmVhbCIgbGluZSBvZgorICAgICAqIHRoZSByZWdpb24gKG5vcm1hbGx5IHNhbWUgYXMgZW5kLCBleGNlcHQgd2hlbgorICAgICAqIHdlJ3JlIGZpcnN0IHBvcHVsYXRpbmcgdGhlIHJlZ2lvbikKKyAgICAgKi8KKyAgc3RhcnQgPSB3aW5MaXN0W0NNRF9XSU5dLT5nZW5lcmljLm9yaWdpbi55OworICBlbmQgPSBzdGFydCArIHdpbkxpc3RbQ01EX1dJTl0tPmdlbmVyaWMuaGVpZ2h0IC0gMTsKKyAgY3VybGluZSA9IHN0YXJ0ICsgd2luTGlzdFtDTURfV0lOXS0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1ckxpbmU7CisKKyAgLyogV2Ugd2FudCB0byBjb25maW5lIHRhcmdldCBJL08gdG8gdGhlIGNvbW1hbmQgcmVnaW9uLgorICAgICAqIEluIG9yZGVyIHRvIGRvIHNvLCB3ZSBtdXN0IGVpdGhlciBoYXZlICJtZW1vcnkgbG9jayIKKyAgICAgKiAoaHB0ZXJtJ3MpIG9yICJzY3JvbGwgcmVnaW9ucyIgKHh0ZXJtJ3MpLgorICAgICAqLworICBpZiAodGVybV9jdXJzb3JfbW92ZSAmJiB0ZXJtX21lbW9yeV9sb2NrKQorICAgIHsKKworICAgICAgLyogTWVtb3J5IGxvY2sgbWVhbnMgbG9jayByZWdpb24gYWJvdmUgY3Vyc29yLgorICAgICAgICogU28gZmlyc3QgcG9zaXRpb24gdGhlIGN1cnNvciwgdGhlbiBjYWxsIG1lbW9yeSBsb2NrLgorICAgICAgICovCisgICAgICBidWZmZXIgPSB0Z290byAodGVybV9jdXJzb3JfbW92ZSwgMCwgc3RhcnQpOworICAgICAgdHB1dHMgKGJ1ZmZlciwgMSwgKGludCAoKilQQVJBTVMgKChpbnQpKSkgcHV0Y2hhcik7CisgICAgICB0cHV0cyAodGVybV9tZW1vcnlfbG9jaywgMSwgKGludCAoKilQQVJBTVMgKChpbnQpKSkgcHV0Y2hhcik7CisKKyAgICB9CisgIGVsc2UgaWYgKHRlcm1fc2Nyb2xsX3JlZ2lvbikKKyAgICB7CisKKyAgICAgIC8qIFNldCB0aGUgc2Nyb2xsIHJlZ2lvbiB0byB0aGUgY29tbWFuZCB3aW5kb3cgKi8KKyAgICAgIGJ1ZmZlciA9IHRnb3RvICh0ZXJtX3Njcm9sbF9yZWdpb24sIGVuZCwgc3RhcnQpOworICAgICAgdHB1dHMgKGJ1ZmZlciwgMSwgKGludCAoKilQQVJBTVMgKChpbnQpKSkgcHV0Y2hhcik7CisKKyAgICB9CQkJCS8qIGVsc2Ugd2UgY2FuJ3QgZG8gYW55dGhpbmcgYWJvdXQgdGFyZ2V0IEkvTyAqLworCisgIC8qIEFsc28gdHVybiBvZmYgc3RhbmRvdXQgbW9kZSwgaW4gY2FzZSBpdCBpcyBvbiAqLworICBpZiAodGVybV9zZSAhPSBOVUxMKQorICAgIHRwdXRzICh0ZXJtX3NlLCAxLCAoaW50ICgqKVBBUkFNUyAoKGludCkpKSBwdXRjaGFyKTsKKworICAvKiBOb3cgZ28gdG8gdGhlIGFwcHJvcHJpYXRlIHNwb3Qgb24gdGhlIGVuZCBsaW5lICovCisgIGJ1ZmZlciA9IHRnb3RvICh0ZXJtX2N1cnNvcl9tb3ZlLCB0b19jb2x1bW4sIGVuZCk7CisgIHRwdXRzIChidWZmZXIsIDEsIChpbnQgKCopUEFSQU1TICgoaW50KSkpIHB1dGNoYXIpOworICBmZmx1c2ggKHN0ZG91dCk7CisKKyAgdHVpX293bnNfdGVybWluYWwgPSAwOworfQkJCQkvKiB0dWlUZXJtVW5zZXR1cCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3R1aS90dWlJTy5oIGIvZ2RiL3R1aS90dWlJTy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYmVmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdHVpL3R1aUlPLmgKQEAgLTAsMCArMSw0MyBAQAorI2lmbmRlZiBfVFVJX0lPX0gKKyNkZWZpbmUgX1RVSV9JT19ICisvKgorKiogVGhpcyBoZWFkZXIgY29udGFpbnMgZGVmaXRpb25zIHRvIHN1cHBvcnQgdHVpSU8uYworKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgdHVpUHV0c191bmZpbHRlcmVkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgR0RCX0ZJTEUgKikpOworZXh0ZXJuIHVuc2lnbmVkIGludCAgICAgdHVpR2V0YyBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdW5zaWduZWQgaW50ICAgICB0dWlCdWZmZXJHZXRjIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiBpbnQgICAgICAgICAgICAgIHR1aVJlYWQgUEFSQU1TICgoaW50LCBjaGFyICosIGludCkpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgdHVpU3RhcnROZXdMaW5lcyBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHR1aV92U3RhcnROZXdMaW5lcyBQQVJBTVMgKCh2YV9saXN0KSk7CitleHRlcm4gdW5zaWduZWQgaW50ICAgICB0dWlfdndnZXRjaCBQQVJBTVMgKCh2YV9saXN0KSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICB0dWlUZXJtU2V0dXAgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICB0dWlUZXJtVW5zZXR1cCBQQVJBTVMgKChpbnQsIGludCkpOworCisKKworI2RlZmluZSBtX3R1aVN0YXJ0TmV3TGluZSAgICAgICB0dWlTdGFydE5ld0xpbmVzKDEpCisjZGVmaW5lIG1faXNTdGFydFNlcXVlbmNlKGNoKSAgIChjaCA9PSAyNykKKyNkZWZpbmUgbV9pc0VuZFNlcXVlbmNlKGNoKSAgICAgKGNoID09IDEyNikKKyNkZWZpbmUgbV9pc0JhY2tzcGFjZShjaCkgICAgICAgKGNoID09IDgpCisjZGVmaW5lIG1faXNEZWxldGVDaGFyKGNoKSAgICAgIChjaCA9PSBLRVlfREMpCisjZGVmaW5lIG1faXNEZWxldGVMaW5lKGNoKSAgICAgIChjaCA9PSBLRVlfREwpCisjZGVmaW5lIG1faXNEZWxldGVUb0VvbChjaCkgICAgIChjaCA9PSBLRVlfRU9MKQorI2RlZmluZSBtX2lzTmV4dFBhZ2UoY2gpICAgICAgICAoY2ggPT0gS0VZX05QQUdFKQorI2RlZmluZSBtX2lzUHJldlBhZ2UoY2gpICAgICAgICAoY2ggPT0gS0VZX1BQQUdFKQorI2RlZmluZSBtX2lzTGVmdEFycm93KGNoKSAgICAgICAoY2ggPT0gS0VZX0xFRlQpCisjZGVmaW5lIG1faXNSaWdodEFycm93KGNoKSAgICAgIChjaCA9PSBLRVlfUklHSFQpCisKKyNkZWZpbmUgbV9pc0NvbW1hbmRDaGFyKGNoKSAgICAgKG1faXNOZXh0UGFnZShjaCkgfHwgbV9pc1ByZXZQYWdlKGNoKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faXNMZWZ0QXJyb3coY2gpIHx8IG1faXNSaWdodEFycm93KGNoKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaCA9PSBLRVlfVVApIHx8IChjaCA9PSBLRVlfRE9XTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2ggPT0gS0VZX1NGKSB8fCAoY2ggPT0gS0VZX1NSKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaCA9PSAoaW50KSdcZicpIHx8IG1faXNTdGFydFNlcXVlbmNlKGNoKSkKKworI2RlZmluZSBtX2lzWGRiU3R5bGVDb21tYW5kQ2hhcihjaCkgICAgIChtX2lzTmV4dFBhZ2UoY2gpIHx8IG1faXNQcmV2UGFnZShjaCkpCisKKworI2VuZGlmIC8qX1RVSV9JT19IKi8KZGlmZiAtLWdpdCBhL2dkYi90dWkvdHVpTGF5b3V0LmMgYi9nZGIvdHVpL3R1aUxheW91dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYTM4MGMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdHVpL3R1aUxheW91dC5jCkBAIC0wLDAgKzEsMTQxMCBAQAorLyoKKyoqIHR1aUxheW91dC5jCisqKiBUaGlzIG1vZHVsZSBjb250YWlucyBwcm9jZWR1cmVzIGZvciBoYW5kbGluZyB0aGUgbGF5b3V0IG9mIHRoZSB3aW5kb3dzLgorKi8KKworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorCisjaW5jbHVkZSAidHVpLmgiCisjaW5jbHVkZSAidHVpRGF0YS5oIgorI2luY2x1ZGUgInR1aUdlbmVyYWxXaW4uaCIKKyNpbmNsdWRlICJ0dWlTdGFjay5oIgorI2luY2x1ZGUgInR1aVJlZ3MuaCIKKyNpbmNsdWRlICJ0dWlEaXNhc3NlbS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogU3RhdGljIExvY2FsIERlY2xzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgX2luaXRHZW5XaW5JbmZvIFBBUkFNUworICAoKFR1aUdlbldpbkluZm9QdHIsIFR1aVdpblR5cGUsIGludCwgaW50LCBpbnQsIGludCkpOworc3RhdGljIHZvaWQgX2luaXRBbmRNYWtlV2luIFBBUkFNUworICAoKE9wYXF1ZSAqLCBUdWlXaW5UeXBlLCBpbnQsIGludCwgaW50LCBpbnQsIGludCkpOworc3RhdGljIHZvaWQgX3Nob3dTb3VyY2VPckRpc2Fzc2VtQW5kQ29tbWFuZCBQQVJBTVMKKyAgKChUdWlMYXlvdXRUeXBlKSk7CitzdGF0aWMgdm9pZCBfbWFrZVNvdXJjZU9yRGlzYXNzZW1XaW5kb3cgUEFSQU1TCisgICgoVHVpV2luSW5mb1B0ciAqLCBUdWlXaW5UeXBlLCBpbnQsIGludCkpOworc3RhdGljIHZvaWQgX21ha2VDb21tYW5kV2luZG93IFBBUkFNUyAoKFR1aVdpbkluZm9QdHIgKiwgaW50LCBpbnQpKTsKK3N0YXRpYyB2b2lkIF9tYWtlU291cmNlV2luZG93IFBBUkFNUyAoKFR1aVdpbkluZm9QdHIgKiwgaW50LCBpbnQpKTsKK3N0YXRpYyB2b2lkIF9tYWtlRGlzYXNzZW1XaW5kb3cgUEFSQU1TCisgICgoVHVpV2luSW5mb1B0ciAqLCBpbnQsIGludCkpOworc3RhdGljIHZvaWQgX21ha2VEYXRhV2luZG93IFBBUkFNUyAoKFR1aVdpbkluZm9QdHIgKiwgaW50LCBpbnQpKTsKK3N0YXRpYyB2b2lkIF9zaG93U291cmNlQ29tbWFuZCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBfc2hvd0Rpc2Fzc2VtQ29tbWFuZCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBfc2hvd1NvdXJjZURpc2Fzc2VtQ29tbWFuZCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBfc2hvd0RhdGEgUEFSQU1TICgoVHVpTGF5b3V0VHlwZSkpOworc3RhdGljIFR1aUxheW91dFR5cGUgX25leHRMYXlvdXQgUEFSQU1TICgodm9pZCkpOworc3RhdGljIFR1aUxheW91dFR5cGUgX3ByZXZMYXlvdXQgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgX3R1aUxheW91dF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBfdHVpVG9nZ2xlTGF5b3V0X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIF90dWlfdlRvZ2dsZUxheW91dF9jb21tYW5kIFBBUkFNUyAoKHZhX2xpc3QpKTsKK3N0YXRpYyB2b2lkIF90dWlUb2dnbGVTcGxpdExheW91dF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBfdHVpX3ZUb2dnbGVTcGxpdExheW91dF9jb21tYW5kIFBBUkFNUyAoKHZhX2xpc3QpKTsKK3N0YXRpYyBPcGFxdWUgX2V4dHJhY3REaXNwbGF5U3RhcnRBZGRyIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIF90dWlIYW5kbGVYREJMYXlvdXQgUEFSQU1TICgoVHVpTGF5b3V0RGVmUHRyKSk7CitzdGF0aWMgVHVpU3RhdHVzIF90dWlTZXRMYXlvdXRUbyBQQVJBTVMgKChjaGFyICopKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExBWU9VVF9VU0FHRSAgICAgIlVzYWdlOiBsYXlvdXQgcHJldiB8IG5leHQgfCA8bGF5b3V0X25hbWU+IFxuIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBTdGF0aWMgTG9jYWwgRGF0YQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFR1aUxheW91dFR5cGUgbGFzdExheW91dCA9IFVOREVGSU5FRF9MQVlPVVQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFBVQkxJQyBGVU5DVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyoqIHNob3dMYXlvdXQoKS4KKyoqICAgICAgICBTaG93IHRoZSBzY3JlZW4gbGF5b3V0IGRlZmluZWQKKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3Nob3dMYXlvdXQgKAorCSAgICAgVHVpTGF5b3V0VHlwZSBsYXlvdXQpCisjZWxzZQorc2hvd0xheW91dCAobGF5b3V0KQorICAgICBUdWlMYXlvdXRUeXBlIGxheW91dDsKKyNlbmRpZgoreworICBUdWlMYXlvdXRUeXBlIGN1ckxheW91dCA9IGN1cnJlbnRMYXlvdXQgKCk7CisKKyAgaWYgKGxheW91dCAhPSBjdXJMYXlvdXQpCisgICAgeworICAgICAgLyoKKyAgICAgICAgKiogU2luY2UgdGhlIG5ldyBsYXlvdXQgbWF5IGNhdXNlIGNoYW5nZXMgaW4gd2luZG93IHNpemUsIHdlCisgICAgICAgICoqIHNob3VsZCBmcmVlIHRoZSBjb250ZW50IGFuZCByZWFsbG9jYXRlIG9uIG5leHQgZGlzcGxheSBvZgorICAgICAgICAqKiBzb3VyY2UvYXNtCisgICAgICAgICovCisgICAgICB0dWlDbGVhckFsbFNvdXJjZVdpbnNDb250ZW50IChOT19FTVBUWV9TT1VSQ0VfUFJPTVBUKTsKKyAgICAgIGZyZWVBbGxTb3VyY2VXaW5zQ29udGVudCAoKTsKKyAgICAgIGNsZWFyU291cmNlV2luZG93cyAoKTsKKyAgICAgIGlmIChsYXlvdXQgPT0gU1JDX0RBVEFfQ09NTUFORCB8fCBsYXlvdXQgPT0gRElTQVNTRU1fREFUQV9DT01NQU5EKQorCXsKKwkgIF9zaG93RGF0YSAobGF5b3V0KTsKKwkgIHJlZnJlc2hBbGwgKHdpbkxpc3QpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBGaXJzdCBtYWtlIHRoZSBjdXJyZW50IGxheW91dCBiZSBpbnZpc2libGUgKi8KKwkgIG1fYWxsQmVJbnZpc2libGUgKCk7CisJICBtX2JlSW52aXNpYmxlIChsb2NhdG9yV2luSW5mb1B0ciAoKSk7CisKKwkgIHN3aXRjaCAobGF5b3V0KQorCSAgICB7CisJICAgICAgLyogTm93IHNob3cgdGhlIG5ldyBsYXlvdXQgKi8KKwkgICAgY2FzZSBTUkNfQ09NTUFORDoKKwkgICAgICBfc2hvd1NvdXJjZUNvbW1hbmQgKCk7CisJICAgICAgYWRkVG9Tb3VyY2VXaW5kb3dzIChzcmNXaW4pOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIERJU0FTU0VNX0NPTU1BTkQ6CisJICAgICAgX3Nob3dEaXNhc3NlbUNvbW1hbmQgKCk7CisJICAgICAgYWRkVG9Tb3VyY2VXaW5kb3dzIChkaXNhc3NlbVdpbik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgU1JDX0RJU0FTU0VNX0NPTU1BTkQ6CisJICAgICAgX3Nob3dTb3VyY2VEaXNhc3NlbUNvbW1hbmQgKCk7CisJICAgICAgYWRkVG9Tb3VyY2VXaW5kb3dzIChzcmNXaW4pOworCSAgICAgIGFkZFRvU291cmNlV2luZG93cyAoZGlzYXNzZW1XaW4pOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIHNob3dMYXlvdXQgKi8KKworCisvKgorKiogdHVpU2V0TGF5b3V0KCkKKyoqICAgIEZ1bmN0aW9uIHRvIHNldCB0aGUgbGF5b3V0IHRvIFNSQ19DT01NQU5ELCBESVNBU1NFTV9DT01NQU5ELAorKiogICAgU1JDX0RJU0FTU0VNX0NPTU1BTkQsIFNSQ19EQVRBX0NPTU1BTkQsIG9yIERJU0FTU0VNX0RBVEFfQ09NTUFORC4KKyoqICAgIElmIHRoZSBsYXlvdXQgaXMgU1JDX0RBVEFfQ09NTUFORCwgRElTQVNTRU1fREFUQV9DT01NQU5ELCBvcgorKiogICAgVU5ERUZJTkVEX0xBWU9VVCwgdGhlbiB0aGUgZGF0YSB3aW5kb3cgaXMgcG9wdWxhdGVkIGFjY29yZGluZworKiogICAgdG8gcmVnc0Rpc3BsYXlUeXBlLgorKi8KK1R1aVN0YXR1cworI2lmZGVmIF9fU1REQ19fCit0dWlTZXRMYXlvdXQgKAorCSAgICAgICBUdWlMYXlvdXRUeXBlIGxheW91dFR5cGUsCisJICAgICAgIFR1aVJlZ2lzdGVyRGlzcGxheVR5cGUgcmVnc0Rpc3BsYXlUeXBlKQorI2Vsc2UKK3R1aVNldExheW91dCAobGF5b3V0VHlwZSwgcmVnc0Rpc3BsYXlUeXBlKQorICAgICBUdWlMYXlvdXRUeXBlIGxheW91dFR5cGU7CisgICAgIFR1aVJlZ2lzdGVyRGlzcGxheVR5cGUgcmVnc0Rpc3BsYXlUeXBlOworI2VuZGlmCit7CisgIFR1aVN0YXR1cyBzdGF0dXMgPSBUVUlfU1VDQ0VTUzsKKworICBpZiAobGF5b3V0VHlwZSAhPSBVTkRFRklORURfTEFZT1VUIHx8IHJlZ3NEaXNwbGF5VHlwZSAhPSBUVUlfVU5ERUZJTkVEX1JFR1MpCisgICAgeworICAgICAgVHVpTGF5b3V0VHlwZSBjdXJMYXlvdXQgPSBjdXJyZW50TGF5b3V0ICgpLCBuZXdMYXlvdXQgPSBVTkRFRklORURfTEFZT1VUOworICAgICAgaW50IHJlZ3NQb3B1bGF0ZSA9IEZBTFNFOworICAgICAgT3BhcXVlIGFkZHIgPSBfZXh0cmFjdERpc3BsYXlTdGFydEFkZHIgKCk7CisgICAgICBUdWlXaW5JbmZvUHRyIG5ld1dpbldpdGhGb2N1cyA9IChUdWlXaW5JbmZvUHRyKSBOVUxMLCB3aW5XaXRoRm9jdXMgPSB0dWlXaW5XaXRoRm9jdXMgKCk7CisgICAgICBUdWlMYXlvdXREZWZQdHIgbGF5b3V0RGVmID0gdHVpTGF5b3V0RGVmICgpOworCisKKyAgICAgIGlmIChsYXlvdXRUeXBlID09IFVOREVGSU5FRF9MQVlPVVQgJiYKKwkgIHJlZ3NEaXNwbGF5VHlwZSAhPSBUVUlfVU5ERUZJTkVEX1JFR1MpCisJeworCSAgaWYgKGN1ckxheW91dCA9PSBTUkNfRElTQVNTRU1fQ09NTUFORCkKKwkgICAgbmV3TGF5b3V0ID0gRElTQVNTRU1fREFUQV9DT01NQU5EOworCSAgZWxzZSBpZiAoY3VyTGF5b3V0ID09IFNSQ19DT01NQU5EIHx8IGN1ckxheW91dCA9PSBTUkNfREFUQV9DT01NQU5EKQorCSAgICBuZXdMYXlvdXQgPSBTUkNfREFUQV9DT01NQU5EOworCSAgZWxzZSBpZiAoY3VyTGF5b3V0ID09IERJU0FTU0VNX0NPTU1BTkQgfHwKKwkJICAgY3VyTGF5b3V0ID09IERJU0FTU0VNX0RBVEFfQ09NTUFORCkKKwkgICAgbmV3TGF5b3V0ID0gRElTQVNTRU1fREFUQV9DT01NQU5EOworCX0KKyAgICAgIGVsc2UKKwluZXdMYXlvdXQgPSBsYXlvdXRUeXBlOworCisgICAgICByZWdzUG9wdWxhdGUgPSAobmV3TGF5b3V0ID09IFNSQ19EQVRBX0NPTU1BTkQgfHwKKwkJICAgICAgbmV3TGF5b3V0ID09IERJU0FTU0VNX0RBVEFfQ09NTUFORCB8fAorCQkgICAgICByZWdzRGlzcGxheVR5cGUgIT0gVFVJX1VOREVGSU5FRF9SRUdTKTsKKyAgICAgIGlmIChuZXdMYXlvdXQgIT0gY3VyTGF5b3V0IHx8IHJlZ3NEaXNwbGF5VHlwZSAhPSBUVUlfVU5ERUZJTkVEX1JFR1MpCisJeworCSAgaWYgKG5ld0xheW91dCAhPSBjdXJMYXlvdXQpCisJICAgIHsKKwkgICAgICBpZiAod2luV2l0aEZvY3VzICE9IGNtZFdpbikKKwkJdHVpQ2xlYXJXaW5Gb2N1cyAoKTsKKwkgICAgICBzaG93TGF5b3V0IChuZXdMYXlvdXQpOworCSAgICAgIC8qCisgICAgICAgICAgICAgICAgKiogTm93IGRldGVybWluZSB3aGVyZSBmb2N1cyBzaG91bGQgYmUKKyAgICAgICAgICAgICAgICAqLworCSAgICAgIGlmICh3aW5XaXRoRm9jdXMgIT0gY21kV2luKQorCQl7CisJCSAgc3dpdGNoIChuZXdMYXlvdXQpCisJCSAgICB7CisJCSAgICBjYXNlIFNSQ19DT01NQU5EOgorCQkgICAgICB0dWlTZXRXaW5Gb2N1c1RvIChzcmNXaW4pOworCQkgICAgICBsYXlvdXREZWYtPmRpc3BsYXlNb2RlID0gU1JDX1dJTjsKKwkJICAgICAgbGF5b3V0RGVmLT5zcGxpdCA9IEZBTFNFOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgRElTQVNTRU1fQ09NTUFORDoKKwkJICAgICAgLyogdGhlIHByZXZpb3VzIGxheW91dCB3YXMgbm90IHNob3dpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiBjb2RlLiB0aGlzIGNhbiBoYXBwZW4gaWYgdGhlcmUgaXMgbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiBzb3VyY2UgYXZhaWxhYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIDEuIGlmIHRoZSBzb3VyY2UgZmlsZSBpcyBpbiBhbm90aGVyIGRpciBPUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIDIuIGlmIHRhcmdldCB3YXMgY29tcGlsZWQgd2l0aG91dCAtZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIFdlIHN0aWxsIHdhbnQgdG8gc2hvdyB0aGUgYXNzZW1ibHkgdGhvdWdoIQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCSAgICAgIGFkZHIgPSB2Y2F0Y2hfZXJyb3JzICgoT3BhcXVlRnVuY1B0cikKKwkJCQkJICAgIHR1aUdldEJlZ2luQXNtQWRkcmVzcyk7CisJCSAgICAgIHR1aVNldFdpbkZvY3VzVG8gKGRpc2Fzc2VtV2luKTsKKwkJICAgICAgbGF5b3V0RGVmLT5kaXNwbGF5TW9kZSA9IERJU0FTU0VNX1dJTjsKKwkJICAgICAgbGF5b3V0RGVmLT5zcGxpdCA9IEZBTFNFOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgU1JDX0RJU0FTU0VNX0NPTU1BTkQ6CisJCSAgICAgIC8qIHRoZSBwcmV2aW91cyBsYXlvdXQgd2FzIG5vdCBzaG93aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiogY29kZS4gdGhpcyBjYW4gaGFwcGVuIGlmIHRoZXJlIGlzIG5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiogc291cmNlIGF2YWlsYWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiAxLiBpZiB0aGUgc291cmNlIGZpbGUgaXMgaW4gYW5vdGhlciBkaXIgT1IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiAyLiBpZiB0YXJnZXQgd2FzIGNvbXBpbGVkIHdpdGhvdXQgLWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiBXZSBzdGlsbCB3YW50IHRvIHNob3cgdGhlIGFzc2VtYmx5IHRob3VnaCEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkgICAgICBhZGRyID0gdmNhdGNoX2Vycm9ycyAoKE9wYXF1ZUZ1bmNQdHIpCisJCQkJCSAgICB0dWlHZXRCZWdpbkFzbUFkZHJlc3MpOworCQkgICAgICBpZiAod2luV2l0aEZvY3VzID09IHNyY1dpbikKKwkJCXR1aVNldFdpbkZvY3VzVG8gKHNyY1dpbik7CisJCSAgICAgIGVsc2UKKwkJCXR1aVNldFdpbkZvY3VzVG8gKGRpc2Fzc2VtV2luKTsKKwkJICAgICAgbGF5b3V0RGVmLT5zcGxpdCA9IFRSVUU7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSBTUkNfREFUQV9DT01NQU5EOgorCQkgICAgICBpZiAod2luV2l0aEZvY3VzICE9IGRhdGFXaW4pCisJCQl0dWlTZXRXaW5Gb2N1c1RvIChzcmNXaW4pOworCQkgICAgICBlbHNlCisJCQl0dWlTZXRXaW5Gb2N1c1RvIChkYXRhV2luKTsKKwkJICAgICAgbGF5b3V0RGVmLT5kaXNwbGF5TW9kZSA9IFNSQ19XSU47CisJCSAgICAgIGxheW91dERlZi0+c3BsaXQgPSBGQUxTRTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIERJU0FTU0VNX0RBVEFfQ09NTUFORDoKKwkJICAgICAgLyogdGhlIHByZXZpb3VzIGxheW91dCB3YXMgbm90IHNob3dpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiBjb2RlLiB0aGlzIGNhbiBoYXBwZW4gaWYgdGhlcmUgaXMgbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiBzb3VyY2UgYXZhaWxhYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIDEuIGlmIHRoZSBzb3VyY2UgZmlsZSBpcyBpbiBhbm90aGVyIGRpciBPUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIDIuIGlmIHRhcmdldCB3YXMgY29tcGlsZWQgd2l0aG91dCAtZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIFdlIHN0aWxsIHdhbnQgdG8gc2hvdyB0aGUgYXNzZW1ibHkgdGhvdWdoIQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCSAgICAgIGFkZHIgPSB2Y2F0Y2hfZXJyb3JzICgoT3BhcXVlRnVuY1B0cikKKwkJCQkJICAgIHR1aUdldEJlZ2luQXNtQWRkcmVzcyk7CisJCSAgICAgIGlmICh3aW5XaXRoRm9jdXMgIT0gZGF0YVdpbikKKwkJCXR1aVNldFdpbkZvY3VzVG8gKGRpc2Fzc2VtV2luKTsKKwkJICAgICAgZWxzZQorCQkJdHVpU2V0V2luRm9jdXNUbyAoZGF0YVdpbik7CisJCSAgICAgIGxheW91dERlZi0+ZGlzcGxheU1vZGUgPSBESVNBU1NFTV9XSU47CisJCSAgICAgIGxheW91dERlZi0+c3BsaXQgPSBGQUxTRTsKKwkJICAgICAgYnJlYWs7CisJCSAgICBkZWZhdWx0OgorCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICAgIGlmIChuZXdXaW5XaXRoRm9jdXMgIT0gKFR1aVdpbkluZm9QdHIpIE5VTEwpCisJCXR1aVNldFdpbkZvY3VzVG8gKG5ld1dpbldpdGhGb2N1cyk7CisJICAgICAgLyoKKyAgICAgICAgICAgICAgICAqKiBOb3cgdXBkYXRlIHRoZSB3aW5kb3cgY29udGVudAorICAgICAgICAgICAgICAgICovCisJICAgICAgaWYgKCFyZWdzUG9wdWxhdGUgJiYKKwkJICAobmV3TGF5b3V0ID09IFNSQ19EQVRBX0NPTU1BTkQgfHwKKwkJICAgbmV3TGF5b3V0ID09IERJU0FTU0VNX0RBVEFfQ09NTUFORCkpCisJCXR1aURpc3BsYXlBbGxEYXRhICgpOworCisJICAgICAgdHVpVXBkYXRlU291cmNlV2luZG93c1dpdGhBZGRyIChhZGRyKTsKKwkgICAgfQorCSAgaWYgKHJlZ3NQb3B1bGF0ZSkKKwkgICAgeworCSAgICAgIGxheW91dERlZi0+cmVnc0Rpc3BsYXlUeXBlID0KKwkJKHJlZ3NEaXNwbGF5VHlwZSA9PSBUVUlfVU5ERUZJTkVEX1JFR1MgPworCQkgVFVJX0dFTkVSQUxfUkVHUyA6IHJlZ3NEaXNwbGF5VHlwZSk7CisJICAgICAgdHVpU2hvd1JlZ2lzdGVycyAobGF5b3V0RGVmLT5yZWdzRGlzcGxheVR5cGUpOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHN0YXR1cyA9IFRVSV9GQUlMVVJFOworCisgIHJldHVybiBzdGF0dXM7Cit9CQkJCS8qIHR1aVNldExheW91dCAqLworCisKKy8qCisqKiB0dWlfdlNldExheW91dFRvKCkKKyoqICAgICAgICBGdW5jdGlvbiB0byBzZXQgdGhlIGxheW91dCB0byBTUkMsIEFTTSwgU1BMSVQsIE5FWFQsIFBSRVYsIERBVEEsCisqKiAgICAgICAgUkVHUywgJFJFR1MsICRHUkVHUywgJEZSRUdTLCAkU1JFR1Mgd2l0aCBhcmd1bWVudHMgaW4gYSB2YV9saXN0CisqLworVHVpU3RhdHVzCisjaWZkZWYgX19TVERDX18KK3R1aV92U2V0TGF5b3V0VG8gKAorCQkgICB2YV9saXN0IGFyZ3MpCisjZWxzZQordHVpX3ZTZXRMYXlvdXRUbyAoYXJncykKKyAgICAgdmFfbGlzdCBhcmdzOworI2VuZGlmCit7CisgIGNoYXIgKmxheW91dE5hbWU7CisKKyAgbGF5b3V0TmFtZSA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKKworICByZXR1cm4gKF90dWlTZXRMYXlvdXRUbyAobGF5b3V0TmFtZSkpOworfQkJCQkvKiB0dWlfdlNldExheW91dFRvICovCisKKworLyoKKyoqIHR1aUFkZFdpblRvTGF5b3V0KCkuCisqKiAgICAgICAgQWRkIHRoZSBzcGVjaWZpZWQgd2luZG93IHRvIHRoZSBsYXlvdXQgaW4gYSBsb2dpY2FsIHdheS4KKyoqICAgICAgICBUaGlzIG1lYW5zIHNldHRpbmcgdXAgdGhlIG1vc3QgbG9naWNhbCBsYXlvdXQgZ2l2ZW4gdGhlCisqKiAgICAgICAgd2luZG93IHRvIGJlIGFkZGVkLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpQWRkV2luVG9MYXlvdXQgKAorCQkgICAgVHVpV2luVHlwZSB0eXBlKQorI2Vsc2UKK3R1aUFkZFdpblRvTGF5b3V0ICh0eXBlKQorICAgICBUdWlXaW5UeXBlIHR5cGU7CisjZW5kaWYKK3sKKyAgVHVpTGF5b3V0VHlwZSBjdXJMYXlvdXQgPSBjdXJyZW50TGF5b3V0ICgpOworCisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSBTUkNfV0lOOgorICAgICAgaWYgKGN1ckxheW91dCAhPSBTUkNfQ09NTUFORCAmJgorCSAgY3VyTGF5b3V0ICE9IFNSQ19ESVNBU1NFTV9DT01NQU5EICYmCisJICBjdXJMYXlvdXQgIT0gU1JDX0RBVEFfQ09NTUFORCkKKwl7CisJICBjbGVhclNvdXJjZVdpbmRvd3NEZXRhaWwgKCk7CisJICBpZiAoY3VyTGF5b3V0ID09IERJU0FTU0VNX0RBVEFfQ09NTUFORCkKKwkgICAgc2hvd0xheW91dCAoU1JDX0RBVEFfQ09NTUFORCk7CisJICBlbHNlCisJICAgIHNob3dMYXlvdXQgKFNSQ19DT01NQU5EKTsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIERJU0FTU0VNX1dJTjoKKyAgICAgIGlmIChjdXJMYXlvdXQgIT0gRElTQVNTRU1fQ09NTUFORCAmJgorCSAgY3VyTGF5b3V0ICE9IFNSQ19ESVNBU1NFTV9DT01NQU5EICYmCisJICBjdXJMYXlvdXQgIT0gRElTQVNTRU1fREFUQV9DT01NQU5EKQorCXsKKwkgIGNsZWFyU291cmNlV2luZG93c0RldGFpbCAoKTsKKwkgIGlmIChjdXJMYXlvdXQgPT0gU1JDX0RBVEFfQ09NTUFORCkKKwkgICAgc2hvd0xheW91dCAoRElTQVNTRU1fREFUQV9DT01NQU5EKTsKKwkgIGVsc2UKKwkgICAgc2hvd0xheW91dCAoRElTQVNTRU1fQ09NTUFORCk7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBEQVRBX1dJTjoKKyAgICAgIGlmIChjdXJMYXlvdXQgIT0gU1JDX0RBVEFfQ09NTUFORCAmJgorCSAgY3VyTGF5b3V0ICE9IERJU0FTU0VNX0RBVEFfQ09NTUFORCkKKwl7CisJICBpZiAoY3VyTGF5b3V0ID09IERJU0FTU0VNX0NPTU1BTkQpCisJICAgIHNob3dMYXlvdXQgKERJU0FTU0VNX0RBVEFfQ09NTUFORCk7CisJICBlbHNlCisJICAgIHNob3dMYXlvdXQgKFNSQ19EQVRBX0NPTU1BTkQpOworCX0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlBZGRXaW5Ub0xheW91dCAqLworCisKKy8qCisqKiB0dWlfdkFkZFdpblRvTGF5b3V0KCkuCisqKiAgICAgICAgQWRkIHRoZSBzcGVjaWZpZWQgd2luZG93IHRvIHRoZSBsYXlvdXQgaW4gYSBsb2dpY2FsIHdheSwKKyoqICAgICAgICB3aXRoIGFyZ3VtZW50cyBpbiBhIHZhX2xpc3QuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlfdkFkZFdpblRvTGF5b3V0ICgKKwkJICAgICAgdmFfbGlzdCBhcmdzKQorI2Vsc2UKK3R1aV92QWRkV2luVG9MYXlvdXQgKGFyZ3MpCisgICAgIHZhX2xpc3QgYXJnczsKKyNlbmRpZgoreworICBUdWlXaW5UeXBlIHR5cGUgPSB2YV9hcmcgKGFyZ3MsIFR1aVdpblR5cGUpOworCisgIHR1aUFkZFdpblRvTGF5b3V0ICh0eXBlKTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aV92QWRkV2luVG9MYXlvdXQgKi8KKworCisvKgorKiogdHVpRGVmYXVsdFdpbkhlaWdodCgpLgorKiogICAgICAgIEFuc3dlciB0aGUgaGVpZ2h0IG9mIGEgd2luZG93LiAgSWYgaXQgaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQsCisqKiAgICAgICAgYW5zd2VyIHdoYXQgdGhlIGhlaWdodCBvZiBhIHdpbmRvdyB3b3VsZCBiZSBiYXNlZCB1cG9uIGl0cworKiogICAgICAgIHR5cGUgYW5kIHRoZSBsYXlvdXQuCisqLworaW50CisjaWZkZWYgX19TVERDX18KK3R1aURlZmF1bHRXaW5IZWlnaHQgKAorCQkgICAgICBUdWlXaW5UeXBlIHR5cGUsCisJCSAgICAgIFR1aUxheW91dFR5cGUgbGF5b3V0KQorI2Vsc2UKK3R1aURlZmF1bHRXaW5IZWlnaHQgKHR5cGUsIGxheW91dCkKKyAgICAgVHVpV2luVHlwZSB0eXBlOworICAgICBUdWlMYXlvdXRUeXBlIGxheW91dDsKKyNlbmRpZgoreworICBpbnQgaDsKKworICBpZiAod2luTGlzdFt0eXBlXSAhPSAoVHVpV2luSW5mb1B0cikgTlVMTCkKKyAgICBoID0gd2luTGlzdFt0eXBlXS0+Z2VuZXJpYy5oZWlnaHQ7CisgIGVsc2UKKyAgICB7CisgICAgICBzd2l0Y2ggKGxheW91dCkKKwl7CisJY2FzZSBTUkNfQ09NTUFORDoKKwljYXNlIERJU0FTU0VNX0NPTU1BTkQ6CisJICBpZiAobV93aW5QdHJJc051bGwgKGNtZFdpbikpCisJICAgIGggPSB0ZXJtSGVpZ2h0ICgpIC8gMjsKKwkgIGVsc2UKKwkgICAgaCA9IHRlcm1IZWlnaHQgKCkgLSBjbWRXaW4tPmdlbmVyaWMuaGVpZ2h0OworCSAgYnJlYWs7CisJY2FzZSBTUkNfRElTQVNTRU1fQ09NTUFORDoKKwljYXNlIFNSQ19EQVRBX0NPTU1BTkQ6CisJY2FzZSBESVNBU1NFTV9EQVRBX0NPTU1BTkQ6CisJICBpZiAobV93aW5QdHJJc051bGwgKGNtZFdpbikpCisJICAgIGggPSB0ZXJtSGVpZ2h0ICgpIC8gMzsKKwkgIGVsc2UKKwkgICAgaCA9ICh0ZXJtSGVpZ2h0ICgpIC0gY21kV2luLT5nZW5lcmljLmhlaWdodCkgLyAyOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGggPSAwOworCSAgYnJlYWs7CisJfQorICAgIH0KKworICByZXR1cm4gaDsKK30JCQkJLyogdHVpRGVmYXVsdFdpbkhlaWdodCAqLworCisKKy8qCisqKiB0dWlEZWZhdWx0V2luVmlld3BvcnRIZWlnaHQoKS4KKyoqICAgICAgICBBbnN3ZXIgdGhlIGhlaWdodCBvZiBhIHdpbmRvdy4gIElmIGl0IGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LAorKiogICAgICAgIGFuc3dlciB3aGF0IHRoZSBoZWlnaHQgb2YgYSB3aW5kb3cgd291bGQgYmUgYmFzZWQgdXBvbiBpdHMKKyoqICAgICAgICB0eXBlIGFuZCB0aGUgbGF5b3V0LgorKi8KK2ludAorI2lmZGVmIF9fU1REQ19fCit0dWlEZWZhdWx0V2luVmlld3BvcnRIZWlnaHQgKAorCQkJICAgICAgVHVpV2luVHlwZSB0eXBlLAorCQkJICAgICAgVHVpTGF5b3V0VHlwZSBsYXlvdXQpCisjZWxzZQordHVpRGVmYXVsdFdpblZpZXdwb3J0SGVpZ2h0ICh0eXBlLCBsYXlvdXQpCisgICAgIFR1aVdpblR5cGUgdHlwZTsKKyAgICAgVHVpTGF5b3V0VHlwZSBsYXlvdXQ7CisjZW5kaWYKK3sKKyAgaW50IGg7CisKKyAgaCA9IHR1aURlZmF1bHRXaW5IZWlnaHQgKHR5cGUsIGxheW91dCk7CisKKyAgaWYgKHdpbkxpc3RbdHlwZV0gPT0gY21kV2luKQorICAgIGggLT0gMTsKKyAgZWxzZQorICAgIGggLT0gMjsKKworICByZXR1cm4gaDsKK30JCQkJLyogdHVpRGVmYXVsdFdpblZpZXdwb3J0SGVpZ2h0ICovCisKKworLyoKKyoqIF9pbml0aWFsaXplX3R1aUxheW91dCgpLgorKiogICAgICAgIEZ1bmN0aW9uIHRvIGluaXRpYWxpemUgZ2RiIGNvbW1hbmRzLCBmb3IgdHVpIHdpbmRvdyBsYXlvdXQKKyoqICAgICAgICBtYW5pcHVsYXRpb24uCisqLwordm9pZAorX2luaXRpYWxpemVfdHVpTGF5b3V0ICgpCit7CisgIGlmICh0dWlfdmVyc2lvbikKKyAgICB7CisgICAgICBhZGRfY29tICgibGF5b3V0IiwgY2xhc3NfdHVpLCBfdHVpTGF5b3V0X2NvbW1hbmQsCisJICAgICAgICJDaGFuZ2UgdGhlIGxheW91dCBvZiB3aW5kb3dzLlxuXAorVXNhZ2U6IGxheW91dCBwcmV2IHwgbmV4dCB8IDxsYXlvdXRfbmFtZT4gXG5cCitMYXlvdXQgbmFtZXMgYXJlOlxuXAorICAgc3JjICAgOiBEaXNwbGF5cyBzb3VyY2UgYW5kIGNvbW1hbmQgd2luZG93cy5cblwKKyAgIGFzbSAgIDogRGlzcGxheXMgZGlzYXNzZW1ibHkgYW5kIGNvbW1hbmQgd2luZG93cy5cblwKKyAgIHNwbGl0IDogRGlzcGxheXMgc291cmNlLCBkaXNhc3NlbWJseSBhbmQgY29tbWFuZCB3aW5kb3dzLlxuXAorICAgcmVncyAgOiBEaXNwbGF5cyByZWdpc3RlciB3aW5kb3cuIElmIGV4aXN0aW5nIGxheW91dFxuXAorICAgICAgICAgICBpcyBzb3VyY2UvY29tbWFuZCBvciBhc3NlbWJseS9jb21tYW5kLCB0aGUgXG5cCisgICAgICAgICAgIHJlZ2lzdGVyIHdpbmRvdyBpcyBkaXNwbGF5ZWQuIElmIHRoZVxuXAorICAgICAgICAgICBzb3VyY2UvYXNzZW1ibHkvY29tbWFuZCAoc3BsaXQpIGlzIGRpc3BsYXllZCwgXG5cCisgICAgICAgICAgIHRoZSByZWdpc3RlciB3aW5kb3cgaXMgZGlzcGxheWVkIHdpdGggXG5cCisgICAgICAgICAgIHRoZSB3aW5kb3cgdGhhdCBoYXMgY3VycmVudCBsb2dpY2FsIGZvY3VzLlxuIik7CisgICAgICBpZiAoeGRiX2NvbW1hbmRzKQorCXsKKwkgIGFkZF9jb20gKCJ0ZCIsIGNsYXNzX3R1aSwgX3R1aVRvZ2dsZUxheW91dF9jb21tYW5kLAorCQkgICAiVG9nZ2xlIGJldHdlZW4gU291cmNlL0NvbW1hbmQgYW5kIERpc2Fzc2VtYmx5L0NvbW1hbmQgbGF5b3V0cy5cbiIpOworCSAgYWRkX2NvbSAoInRzIiwgY2xhc3NfdHVpLCBfdHVpVG9nZ2xlU3BsaXRMYXlvdXRfY29tbWFuZCwKKwkJICAgIlRvZ2dsZSBiZXR3ZWVuIFNvdXJjZS9Db21tYW5kIG9yIERpc2Fzc2VtYmx5L0NvbW1hbmQgYW5kIFxuXAorU291cmNlL0Rpc2Fzc2VtYmx5L0NvbW1hbmQgbGF5b3V0cy5cbiIpOworCX0KKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiBfaW50aWFsaXplX3R1aUxheW91dCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBTVEFUSUMgTE9DQUwgRlVOQ1RJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKgorKiogX3R1aVNldExheW91dFRvKCkKKyoqICAgIEZ1bmN0aW9uIHRvIHNldCB0aGUgbGF5b3V0IHRvIFNSQywgQVNNLCBTUExJVCwgTkVYVCwgUFJFViwgREFUQSwgUkVHUywKKyoqICAgICAgICAkUkVHUywgJEdSRUdTLCAkRlJFR1MsICRTUkVHUy4KKyovCitzdGF0aWMgVHVpU3RhdHVzCisjaWZkZWYgX19TVERDX18KK190dWlTZXRMYXlvdXRUbyAoCisJCSAgY2hhciAqbGF5b3V0TmFtZSkKKyNlbHNlCitfdHVpU2V0TGF5b3V0VG8gKGxheW91dE5hbWUpCisgICAgIGNoYXIgKmxheW91dE5hbWU7CisjZW5kaWYKK3sKKyAgVHVpU3RhdHVzIHN0YXR1cyA9IFRVSV9TVUNDRVNTOworCisgIGlmIChsYXlvdXROYW1lICE9IChjaGFyICopIE5VTEwpCisgICAgeworICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICByZWdpc3RlciBjaGFyICpidWZQdHI7CisgICAgICBUdWlMYXlvdXRUeXBlIG5ld0xheW91dCA9IFVOREVGSU5FRF9MQVlPVVQ7CisgICAgICBUdWlSZWdpc3RlckRpc3BsYXlUeXBlIGRweVR5cGUgPSBUVUlfVU5ERUZJTkVEX1JFR1M7CisgICAgICBUdWlMYXlvdXRUeXBlIGN1ckxheW91dCA9IGN1cnJlbnRMYXlvdXQgKCk7CisKKyAgICAgIGJ1ZlB0ciA9IChjaGFyICopIHR1aVN0ckR1cCAobGF5b3V0TmFtZSk7CisgICAgICBmb3IgKGkgPSAwOyAoaSA8IHN0cmxlbiAobGF5b3V0TmFtZSkpOyBpKyspCisJYnVmUHRyW2ldID0gdG91cHBlciAoYnVmUHRyW2ldKTsKKworICAgICAgLyogRmlyc3QgY2hlY2sgZm9yIGFtYmlndW91cyBpbnB1dCAqLworICAgICAgaWYgKHN0cmxlbiAoYnVmUHRyKSA8PSAxICYmICgqYnVmUHRyID09ICdTJyB8fCAqYnVmUHRyID09ICckJykpCisJeworCSAgd2FybmluZyAoIkFtYmlndW91cyBjb21tYW5kIGlucHV0LlxuIik7CisJICBzdGF0dXMgPSBUVUlfRkFJTFVSRTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKHN1YnNldENvbXBhcmUgKGJ1ZlB0ciwgIlNSQyIpKQorCSAgICBuZXdMYXlvdXQgPSBTUkNfQ09NTUFORDsKKwkgIGVsc2UgaWYgKHN1YnNldENvbXBhcmUgKGJ1ZlB0ciwgIkFTTSIpKQorCSAgICBuZXdMYXlvdXQgPSBESVNBU1NFTV9DT01NQU5EOworCSAgZWxzZSBpZiAoc3Vic2V0Q29tcGFyZSAoYnVmUHRyLCAiU1BMSVQiKSkKKwkgICAgbmV3TGF5b3V0ID0gU1JDX0RJU0FTU0VNX0NPTU1BTkQ7CisJICBlbHNlIGlmIChzdWJzZXRDb21wYXJlIChidWZQdHIsICJSRUdTIikgfHwKKwkJICAgc3Vic2V0Q29tcGFyZSAoYnVmUHRyLCBUVUlfR0VORVJBTF9TUEVDSUFMX1JFR1NfTkFNRSkgfHwKKwkJICAgc3Vic2V0Q29tcGFyZSAoYnVmUHRyLCBUVUlfR0VORVJBTF9SRUdTX05BTUUpIHx8CisJCSAgIHN1YnNldENvbXBhcmUgKGJ1ZlB0ciwgVFVJX0ZMT0FUX1JFR1NfTkFNRSkgfHwKKwkJICAgc3Vic2V0Q29tcGFyZSAoYnVmUHRyLCBUVUlfU1BFQ0lBTF9SRUdTX05BTUUpKQorCSAgICB7CisJICAgICAgaWYgKGN1ckxheW91dCA9PSBTUkNfQ09NTUFORCB8fCBjdXJMYXlvdXQgPT0gU1JDX0RBVEFfQ09NTUFORCkKKwkJbmV3TGF5b3V0ID0gU1JDX0RBVEFfQ09NTUFORDsKKwkgICAgICBlbHNlCisJCW5ld0xheW91dCA9IERJU0FTU0VNX0RBVEFfQ09NTUFORDsKKworLyogY291bGQgaWZkZWYgb3V0IHRoZSBmb2xsb3dpbmcgY29kZS4gd2hlbiBjb21waWxlIHdpdGggLXosIHRoZXJlIGFyZSBudWxsIAorICAgcG9pbnRlciByZWZlcmVuY2VzIHRoYXQgY2F1c2UgYSBjb3JlIGR1bXAgaWYgJ2xheW91dCByZWdzJyBpcyB0aGUgZmlyc3QgCisgICBsYXlvdXQgY29tbWFuZCBpc3N1ZWQgYnkgdGhlIHVzZXIuIEhQIGhhcyBhc2tlZCB1cyB0byBob29rIHVwIHRoaXMgY29kZSAKKyAgIC0gZWRpZSBlcHN0ZWluCisgKi8KKwkgICAgICBpZiAoc3Vic2V0Q29tcGFyZSAoYnVmUHRyLCBUVUlfRkxPQVRfUkVHU19OQU1FKSkKKwkJeworCQkgIGlmIChkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NEaXNwbGF5VHlwZSAhPQorCQkgICAgICBUVUlfU0ZMT0FUX1JFR1MgJiYKKwkJICAgICAgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzRGlzcGxheVR5cGUgIT0KKwkJICAgICAgVFVJX0RGTE9BVF9SRUdTKQorCQkgICAgZHB5VHlwZSA9IFRVSV9TRkxPQVRfUkVHUzsKKwkJICBlbHNlCisJCSAgICBkcHlUeXBlID0KKwkJICAgICAgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzRGlzcGxheVR5cGU7CisJCX0KKwkgICAgICBlbHNlIGlmIChzdWJzZXRDb21wYXJlIChidWZQdHIsCisJCQkJICAgICAgVFVJX0dFTkVSQUxfU1BFQ0lBTF9SRUdTX05BTUUpKQorCQlkcHlUeXBlID0gVFVJX0dFTkVSQUxfQU5EX1NQRUNJQUxfUkVHUzsKKwkgICAgICBlbHNlIGlmIChzdWJzZXRDb21wYXJlIChidWZQdHIsIFRVSV9HRU5FUkFMX1JFR1NfTkFNRSkpCisJCWRweVR5cGUgPSBUVUlfR0VORVJBTF9SRUdTOworCSAgICAgIGVsc2UgaWYgKHN1YnNldENvbXBhcmUgKGJ1ZlB0ciwgVFVJX1NQRUNJQUxfUkVHU19OQU1FKSkKKwkJZHB5VHlwZSA9IFRVSV9TUEVDSUFMX1JFR1M7CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0Rpc3BsYXlUeXBlICE9CisJCSAgICAgIFRVSV9VTkRFRklORURfUkVHUykKKwkJICAgIGRweVR5cGUgPQorCQkgICAgICBkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NEaXNwbGF5VHlwZTsKKwkJICBlbHNlCisJCSAgICBkcHlUeXBlID0gVFVJX0dFTkVSQUxfUkVHUzsKKwkJfQorCisvKiBlbmQgb2YgcG90ZW50aWFsIGlmZGVmIAorICovCisKKy8qIGlmIGlmZGVmZWQgb3V0IGNvZGUgYWJvdmUsIHRoZW4gYXNzdW1lIHRoYXQgdGhlIHVzZXIgd2lzaGVzIHRvIGRpc3BsYXkgdGhlIAorICAgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAKKyAqLworCisvKiAgICAgICAgICAgICAgZHB5VHlwZSA9IFRVSV9HRU5FUkFMX1JFR1M7IAorICovCisJICAgIH0KKwkgIGVsc2UgaWYgKHN1YnNldENvbXBhcmUgKGJ1ZlB0ciwgIk5FWFQiKSkKKwkgICAgbmV3TGF5b3V0ID0gX25leHRMYXlvdXQgKCk7CisJICBlbHNlIGlmIChzdWJzZXRDb21wYXJlIChidWZQdHIsICJQUkVWIikpCisJICAgIG5ld0xheW91dCA9IF9wcmV2TGF5b3V0ICgpOworCSAgZWxzZQorCSAgICBzdGF0dXMgPSBUVUlfRkFJTFVSRTsKKwkgIGZyZWUgKGJ1ZlB0cik7CisKKwkgIHR1aVNldExheW91dCAobmV3TGF5b3V0LCBkcHlUeXBlKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgc3RhdHVzID0gVFVJX0ZBSUxVUkU7CisKKyAgcmV0dXJuIHN0YXR1czsKK30JCQkJLyogX3R1aVNldExheW91dFRvICovCisKKworc3RhdGljIE9wYXF1ZQorI2lmZGVmIF9fU1REQ19fCitfZXh0cmFjdERpc3BsYXlTdGFydEFkZHIgKHZvaWQpCisjZWxzZQorX2V4dHJhY3REaXNwbGF5U3RhcnRBZGRyICgpCisjZW5kaWYKK3sKKyAgVHVpTGF5b3V0VHlwZSBjdXJMYXlvdXQgPSBjdXJyZW50TGF5b3V0ICgpOworICBPcGFxdWUgYWRkcjsKKworICBzd2l0Y2ggKGN1ckxheW91dCkKKyAgICB7CisgICAgY2FzZSBTUkNfQ09NTUFORDoKKyAgICBjYXNlIFNSQ19EQVRBX0NPTU1BTkQ6CisgICAgICBhZGRyID0gKE9wYXF1ZSkgZmluZF9saW5lX3BjICgKKwkJCQkgICAgIGN1cnJlbnRfc291cmNlX3N5bXRhYiwKKwkJCSAgc3JjV2luLT5kZXRhaWwuc291cmNlSW5mby5zdGFydExpbmVPckFkZHIubGluZU5vKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRElTQVNTRU1fQ09NTUFORDoKKyAgICBjYXNlIFNSQ19ESVNBU1NFTV9DT01NQU5EOgorICAgIGNhc2UgRElTQVNTRU1fREFUQV9DT01NQU5EOgorICAgICAgYWRkciA9IGRpc2Fzc2VtV2luLT5kZXRhaWwuc291cmNlSW5mby5zdGFydExpbmVPckFkZHIuYWRkcjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhZGRyID0gKE9wYXF1ZSkgTlVMTDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gYWRkcjsKK30JCQkJLyogX2V4dHJhY3REaXNwbGF5U3RhcnRBZGRyICovCisKKworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aUhhbmRsZVhEQkxheW91dCAoCisJCSAgICAgIFR1aUxheW91dERlZlB0ciBsYXlvdXREZWYpCisjZWxzZQorX3R1aUhhbmRsZVhEQkxheW91dCAobGF5b3V0RGVmKQorICAgICBUdWlMYXlvdXREZWZQdHIgbGF5b3V0RGVmOworI2VuZGlmCit7CisgIGlmIChsYXlvdXREZWYtPnNwbGl0KQorICAgIHsKKyAgICAgIHR1aVNldExheW91dCAoU1JDX0RJU0FTU0VNX0NPTU1BTkQsIFRVSV9VTkRFRklORURfUkVHUyk7CisgICAgICB0dWlTZXRXaW5Gb2N1c1RvICh3aW5MaXN0W2xheW91dERlZi0+ZGlzcGxheU1vZGVdKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAobGF5b3V0RGVmLT5kaXNwbGF5TW9kZSA9PSBTUkNfV0lOKQorCXR1aVNldExheW91dCAoU1JDX0NPTU1BTkQsIFRVSV9VTkRFRklORURfUkVHUyk7CisgICAgICBlbHNlCisJdHVpU2V0TGF5b3V0IChESVNBU1NFTV9EQVRBX0NPTU1BTkQsIGxheW91dERlZi0+cmVnc0Rpc3BsYXlUeXBlKTsKKyAgICB9CisKKworICByZXR1cm47Cit9CQkJCS8qIF90dWlIYW5kbGVYREJMYXlvdXQgKi8KKworCitzdGF0aWMgdm9pZAorI2lmZGVmIF9fU1REQ19fCitfdHVpVG9nZ2xlTGF5b3V0X2NvbW1hbmQgKAorCQkJICAgY2hhciAqYXJnLAorCQkJICAgaW50IGZyb21UVFkpCisjZWxzZQorX3R1aVRvZ2dsZUxheW91dF9jb21tYW5kIChhcmcsIGZyb21UVFkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21UVFk7CisjZW5kaWYKK3sKKyAgdHVpRG8gKChUdWlPcGFxdWVGdW5jUHRyKSBfdHVpX3ZUb2dnbGVMYXlvdXRfY29tbWFuZCwgYXJnLCBmcm9tVFRZKTsKK30KKworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aV92VG9nZ2xlTGF5b3V0X2NvbW1hbmQgKAorCQkJICAgICB2YV9saXN0IGFyZ3MpCisjZWxzZQorX3R1aV92VG9nZ2xlTGF5b3V0X2NvbW1hbmQgKGFyZ3MpCisgICAgIHZhX2xpc3QgYXJnczsKKyNlbmRpZgoreworICBUdWlMYXlvdXREZWZQdHIgbGF5b3V0RGVmID0gdHVpTGF5b3V0RGVmICgpOworCisgIGlmIChsYXlvdXREZWYtPmRpc3BsYXlNb2RlID09IFNSQ19XSU4pCisgICAgbGF5b3V0RGVmLT5kaXNwbGF5TW9kZSA9IERJU0FTU0VNX1dJTjsKKyAgZWxzZQorICAgIGxheW91dERlZi0+ZGlzcGxheU1vZGUgPSBTUkNfV0lOOworCisgIGlmICghbGF5b3V0RGVmLT5zcGxpdCkKKyAgICBfdHVpSGFuZGxlWERCTGF5b3V0IChsYXlvdXREZWYpOworCisgIHJldHVybjsKK30JCQkJLyogX3R1aVRvZ2dsZUxheW91dF9jb21tYW5kICovCisKKworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aVRvZ2dsZVNwbGl0TGF5b3V0X2NvbW1hbmQgKAorCQkJCWNoYXIgKmFyZywKKwkJCQlpbnQgZnJvbVRUWSkKKyNlbHNlCitfdHVpVG9nZ2xlU3BsaXRMYXlvdXRfY29tbWFuZCAoYXJnLCBmcm9tVFRZKQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tVFRZOworI2VuZGlmCit7CisgIHR1aURvICgoVHVpT3BhcXVlRnVuY1B0cikgX3R1aV92VG9nZ2xlU3BsaXRMYXlvdXRfY29tbWFuZCwgYXJnLCBmcm9tVFRZKTsKK30KKworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aV92VG9nZ2xlU3BsaXRMYXlvdXRfY29tbWFuZCAoCisJCQkJICB2YV9saXN0IGFyZ3MpCisjZWxzZQorX3R1aV92VG9nZ2xlU3BsaXRMYXlvdXRfY29tbWFuZCAoYXJncykKKyAgICAgdmFfbGlzdCBhcmdzOworI2VuZGlmCit7CisgIFR1aUxheW91dERlZlB0ciBsYXlvdXREZWYgPSB0dWlMYXlvdXREZWYgKCk7CisKKyAgbGF5b3V0RGVmLT5zcGxpdCA9ICghbGF5b3V0RGVmLT5zcGxpdCk7CisgIF90dWlIYW5kbGVYREJMYXlvdXQgKGxheW91dERlZik7CisKKyAgcmV0dXJuOworfQkJCQkvKiBfdHVpX3ZUb2dnbGVTcGxpdExheW91dF9jb21tYW5kICovCisKKworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aUxheW91dF9jb21tYW5kICgKKwkJICAgICBjaGFyICphcmcsCisJCSAgICAgaW50IGZyb21UVFkpCisjZWxzZQorX3R1aUxheW91dF9jb21tYW5kIChhcmcsIGZyb21UVFkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21UVFk7CisjZW5kaWYKK3sKKyAgaWYgKChUdWlTdGF0dXMpIHR1aURvICgKKwkJICAgKFR1aU9wYXF1ZUZ1bmNQdHIpIHR1aV92U2V0TGF5b3V0VG8sIGFyZykgIT0gVFVJX1NVQ0NFU1MpCisgICAgd2FybmluZyAoIkludmFsaWQgbGF5b3V0IHNwZWNpZmllZC5cbiVzIiBMQVlPVVRfVVNBR0UpOworCisgIHJldHVybjsKK30JCQkJLyogX3R1aUxheW91dF9jb21tYW5kICovCisKKy8qCisqKiBfbmV4dExheW91dCgpLgorKiogICAgICAgIEFuc3dlciB0aGUgcHJldmlvdXMgbGF5b3V0IHRvIGN5Y2xlIHRvLgorKi8KK3N0YXRpYyBUdWlMYXlvdXRUeXBlCisjaWZkZWYgX19TVERDX18KK19uZXh0TGF5b3V0ICh2b2lkKQorI2Vsc2UKK19uZXh0TGF5b3V0ICgpCisjZW5kaWYKK3sKKyAgVHVpTGF5b3V0VHlwZSBuZXdMYXlvdXQ7CisKKyAgbmV3TGF5b3V0ID0gY3VycmVudExheW91dCAoKTsKKyAgaWYgKG5ld0xheW91dCA9PSBVTkRFRklORURfTEFZT1VUKQorICAgIG5ld0xheW91dCA9IFNSQ19DT01NQU5EOworICBlbHNlCisgICAgeworICAgICAgbmV3TGF5b3V0Kys7CisgICAgICBpZiAobmV3TGF5b3V0ID09IFVOREVGSU5FRF9MQVlPVVQpCisJbmV3TGF5b3V0ID0gU1JDX0NPTU1BTkQ7CisgICAgfQorCisgIHJldHVybiBuZXdMYXlvdXQ7Cit9CQkJCS8qIF9uZXh0TGF5b3V0ICovCisKKworLyoKKyoqIF9wcmV2TGF5b3V0KCkuCisqKiAgICAgICAgQW5zd2VyIHRoZSBuZXh0IGxheW91dCB0byBjeWNsZSB0by4KKyovCitzdGF0aWMgVHVpTGF5b3V0VHlwZQorI2lmZGVmIF9fU1REQ19fCitfcHJldkxheW91dCAodm9pZCkKKyNlbHNlCitfcHJldkxheW91dCAoKQorI2VuZGlmCit7CisgIFR1aUxheW91dFR5cGUgbmV3TGF5b3V0OworCisgIG5ld0xheW91dCA9IGN1cnJlbnRMYXlvdXQgKCk7CisgIGlmIChuZXdMYXlvdXQgPT0gU1JDX0NPTU1BTkQpCisgICAgbmV3TGF5b3V0ID0gRElTQVNTRU1fREFUQV9DT01NQU5EOworICBlbHNlCisgICAgeworICAgICAgbmV3TGF5b3V0LS07CisgICAgICBpZiAobmV3TGF5b3V0ID09IFVOREVGSU5FRF9MQVlPVVQpCisJbmV3TGF5b3V0ID0gRElTQVNTRU1fREFUQV9DT01NQU5EOworICAgIH0KKworICByZXR1cm4gbmV3TGF5b3V0OworfQkJCQkvKiBfcHJldkxheW91dCAqLworCisKKworLyoKKyoqIF9tYWtlQ29tbWFuZFdpbmRvdygpLgorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK19tYWtlQ29tbWFuZFdpbmRvdyAoCisJCSAgICAgVHVpV2luSW5mb1B0ciAqIHdpbkluZm9QdHIsCisJCSAgICAgaW50IGhlaWdodCwKKwkJICAgICBpbnQgb3JpZ2luWSkKKyNlbHNlCitfbWFrZUNvbW1hbmRXaW5kb3cgKHdpbkluZm9QdHIsIGhlaWdodCwgb3JpZ2luWSkKKyAgICAgVHVpV2luSW5mb1B0ciAqd2luSW5mb1B0cjsKKyAgICAgaW50IGhlaWdodDsKKyAgICAgaW50IG9yaWdpblk7CisjZW5kaWYKK3sKKyAgX2luaXRBbmRNYWtlV2luICgoT3BhcXVlICopIHdpbkluZm9QdHIsCisJCSAgIENNRF9XSU4sCisJCSAgIGhlaWdodCwKKwkJICAgdGVybVdpZHRoICgpLAorCQkgICAwLAorCQkgICBvcmlnaW5ZLAorCQkgICBET05UX0JPWF9XSU5ET1cpOworCisgICgqd2luSW5mb1B0ciktPmNhbkhpZ2hsaWdodCA9IEZBTFNFOworCisgIHJldHVybjsKK30JCQkJLyogX21ha2VDb21tYW5kV2luZG93ICovCisKKworLyoKKyoqIF9tYWtlU291cmNlV2luZG93KCkuCisqLworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX21ha2VTb3VyY2VXaW5kb3cgKAorCQkgICAgVHVpV2luSW5mb1B0ciAqIHdpbkluZm9QdHIsCisJCSAgICBpbnQgaGVpZ2h0LAorCQkgICAgaW50IG9yaWdpblkpCisjZWxzZQorX21ha2VTb3VyY2VXaW5kb3cgKHdpbkluZm9QdHIsIGhlaWdodCwgb3JpZ2luWSkKKyAgICAgVHVpV2luSW5mb1B0ciAqd2luSW5mb1B0cjsKKyAgICAgaW50IGhlaWdodDsKKyAgICAgaW50IG9yaWdpblk7CisjZW5kaWYKK3sKKyAgX21ha2VTb3VyY2VPckRpc2Fzc2VtV2luZG93ICh3aW5JbmZvUHRyLCBTUkNfV0lOLCBoZWlnaHQsIG9yaWdpblkpOworCisgIHJldHVybjsKK30JCQkJLyogX21ha2VTb3VyY2VXaW5kb3cgKi8KKworCisvKgorKiogX21ha2VEaXNhc3NlbVdpbmRvdygpLgorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK19tYWtlRGlzYXNzZW1XaW5kb3cgKAorCQkgICAgICBUdWlXaW5JbmZvUHRyICogd2luSW5mb1B0ciwKKwkJICAgICAgaW50IGhlaWdodCwKKwkJICAgICAgaW50IG9yaWdpblkpCisjZWxzZQorX21ha2VEaXNhc3NlbVdpbmRvdyAod2luSW5mb1B0ciwgaGVpZ2h0LCBvcmlnaW5ZKQorICAgICBUdWlXaW5JbmZvUHRyICp3aW5JbmZvUHRyOworICAgICBpbnQgaGVpZ2h0OworICAgICBpbnQgb3JpZ2luWTsKKyNlbmRpZgoreworICBfbWFrZVNvdXJjZU9yRGlzYXNzZW1XaW5kb3cgKHdpbkluZm9QdHIsIERJU0FTU0VNX1dJTiwgaGVpZ2h0LCBvcmlnaW5ZKTsKKworICByZXR1cm47Cit9CQkJCS8qIF9tYWtlRGlzYXNzZW1XaW5kb3cgKi8KKworCisvKgorKiogX21ha2VEYXRhV2luZG93KCkuCisqLworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX21ha2VEYXRhV2luZG93ICgKKwkJICBUdWlXaW5JbmZvUHRyICogd2luSW5mb1B0ciwKKwkJICBpbnQgaGVpZ2h0LAorCQkgIGludCBvcmlnaW5ZKQorI2Vsc2UKK19tYWtlRGF0YVdpbmRvdyAod2luSW5mb1B0ciwgaGVpZ2h0LCBvcmlnaW5ZKQorICAgICBUdWlXaW5JbmZvUHRyICp3aW5JbmZvUHRyOworICAgICBpbnQgaGVpZ2h0OworICAgICBpbnQgb3JpZ2luWTsKKyNlbmRpZgoreworICBfaW5pdEFuZE1ha2VXaW4gKChPcGFxdWUgKikgd2luSW5mb1B0ciwKKwkJICAgREFUQV9XSU4sCisJCSAgIGhlaWdodCwKKwkJICAgdGVybVdpZHRoICgpLAorCQkgICAwLAorCQkgICBvcmlnaW5ZLAorCQkgICBCT1hfV0lORE9XKTsKKworICByZXR1cm47Cit9CQkJCS8qIF9tYWtlRGF0YVdpbmRvdyAqLworCisKKworLyoKKyoqICAgIF9zaG93U291cmNlQ29tbWFuZCgpLgorKiogICAgICAgIFNob3cgdGhlIFNvdXJjZS9Db21tYW5kIGxheW91dAorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK19zaG93U291cmNlQ29tbWFuZCAodm9pZCkKKyNlbHNlCitfc2hvd1NvdXJjZUNvbW1hbmQgKCkKKyNlbmRpZgoreworICBfc2hvd1NvdXJjZU9yRGlzYXNzZW1BbmRDb21tYW5kIChTUkNfQ09NTUFORCk7CisKKyAgcmV0dXJuOworfQkJCQkvKiBfc2hvd1NvdXJjZUNvbW1hbmQgKi8KKworCisvKgorKiogICAgX3Nob3dEaXNhc3NlbUNvbW1hbmQoKS4KKyoqICAgICAgICBTaG93IHRoZSBEaXNzYXNzZW0vQ29tbWFuZCBsYXlvdXQKKyovCitzdGF0aWMgdm9pZAorI2lmZGVmIF9fU1REQ19fCitfc2hvd0Rpc2Fzc2VtQ29tbWFuZCAodm9pZCkKKyNlbHNlCitfc2hvd0Rpc2Fzc2VtQ29tbWFuZCAoKQorI2VuZGlmCit7CisgIF9zaG93U291cmNlT3JEaXNhc3NlbUFuZENvbW1hbmQgKERJU0FTU0VNX0NPTU1BTkQpOworCisgIHJldHVybjsKK30JCQkJLyogX3Nob3dEaXNhc3NlbUNvbW1hbmQgKi8KKworCisvKgorKiogICAgX3Nob3dTb3VyY2VEaXNhc3NlbUNvbW1hbmQoKS4KKyoqICAgICAgICBTaG93IHRoZSBTb3VyY2UvRGlzYXNzZW0vQ29tbWFuZCBsYXlvdXQKKyovCitzdGF0aWMgdm9pZAorI2lmZGVmIF9fU1REQ19fCitfc2hvd1NvdXJjZURpc2Fzc2VtQ29tbWFuZCAodm9pZCkKKyNlbHNlCitfc2hvd1NvdXJjZURpc2Fzc2VtQ29tbWFuZCAoKQorI2VuZGlmCit7CisgIFR1aUdlbldpbkluZm9QdHIgbG9jYXRvciA9IGxvY2F0b3JXaW5JbmZvUHRyICgpOworCisgIGlmIChjdXJyZW50TGF5b3V0ICgpICE9IFNSQ19ESVNBU1NFTV9DT01NQU5EKQorICAgIHsKKyAgICAgIGludCBjbWRIZWlnaHQsIHNyY0hlaWdodCwgYXNtSGVpZ2h0OworCisgICAgICBpZiAobV93aW5QdHJOb3ROdWxsIChjbWRXaW4pKQorCWNtZEhlaWdodCA9IGNtZFdpbi0+Z2VuZXJpYy5oZWlnaHQ7CisgICAgICBlbHNlCisJY21kSGVpZ2h0ID0gdGVybUhlaWdodCAoKSAvIDM7CisKKyAgICAgIHNyY0hlaWdodCA9ICh0ZXJtSGVpZ2h0ICgpIC0gY21kSGVpZ2h0KSAvIDI7CisgICAgICBhc21IZWlnaHQgPSB0ZXJtSGVpZ2h0ICgpIC0gKHNyY0hlaWdodCArIGNtZEhlaWdodCk7CisKKyAgICAgIGlmIChtX3dpblB0cklzTnVsbCAoc3JjV2luKSkKKwlfbWFrZVNvdXJjZVdpbmRvdyAoJnNyY1dpbiwgc3JjSGVpZ2h0LCAwKTsKKyAgICAgIGVsc2UKKwl7CisJICBfaW5pdEdlbldpbkluZm8gKCZzcmNXaW4tPmdlbmVyaWMsCisJCQkgICBzcmNXaW4tPmdlbmVyaWMudHlwZSwKKwkJCSAgIHNyY0hlaWdodCwKKwkJCSAgIHNyY1dpbi0+Z2VuZXJpYy53aWR0aCwKKwkJCSAgIHNyY1dpbi0+ZGV0YWlsLnNvdXJjZUluZm8uZXhlY3V0aW9uSW5mby0+d2lkdGgsCisJCQkgICAwKTsKKwkgIHNyY1dpbi0+Y2FuSGlnaGxpZ2h0ID0gVFJVRTsKKwkgIF9pbml0R2VuV2luSW5mbyAoc3JjV2luLT5kZXRhaWwuc291cmNlSW5mby5leGVjdXRpb25JbmZvLAorCQkJICAgRVhFQ19JTkZPX1dJTiwKKwkJCSAgIHNyY0hlaWdodCwKKwkJCSAgIDMsCisJCQkgICAwLAorCQkJICAgMCk7CisJICBtX2JlVmlzaWJsZSAoc3JjV2luKTsKKwkgIG1fYmVWaXNpYmxlIChzcmNXaW4tPmRldGFpbC5zb3VyY2VJbmZvLmV4ZWN1dGlvbkluZm8pOworCSAgc3JjV2luLT5kZXRhaWwuc291cmNlSW5mby5oYXNMb2NhdG9yID0gRkFMU0U7OworCX0KKyAgICAgIGlmIChtX3dpblB0ck5vdE51bGwgKHNyY1dpbikpCisJeworCSAgVHVpR2VuV2luSW5mb1B0ciBsb2NhdG9yID0gbG9jYXRvcldpbkluZm9QdHIgKCk7CisKKwkgIHR1aVNob3dTb3VyY2VDb250ZW50IChzcmNXaW4pOworCSAgaWYgKG1fd2luUHRySXNOdWxsIChkaXNhc3NlbVdpbikpCisJICAgIHsKKwkgICAgICBfbWFrZURpc2Fzc2VtV2luZG93ICgmZGlzYXNzZW1XaW4sIGFzbUhlaWdodCwgc3JjSGVpZ2h0IC0gMSk7CisJICAgICAgX2luaXRBbmRNYWtlV2luICgoT3BhcXVlICopICYgbG9jYXRvciwKKwkJCSAgICAgICBMT0NBVE9SX1dJTiwKKwkJCSAgICAgICAyIC8qIDEgKi8gLAorCQkJICAgICAgIHRlcm1XaWR0aCAoKSwKKwkJCSAgICAgICAwLAorCQkJICAgICAgIChzcmNIZWlnaHQgKyBhc21IZWlnaHQpIC0gMSwKKwkJCSAgICAgICBET05UX0JPWF9XSU5ET1cpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfaW5pdEdlbldpbkluZm8gKGxvY2F0b3IsCisJCQkgICAgICAgTE9DQVRPUl9XSU4sCisJCQkgICAgICAgMiAvKiAxICovICwKKwkJCSAgICAgICB0ZXJtV2lkdGggKCksCisJCQkgICAgICAgMCwKKwkJCSAgICAgICAoc3JjSGVpZ2h0ICsgYXNtSGVpZ2h0KSAtIDEpOworCSAgICAgIGRpc2Fzc2VtV2luLT5kZXRhaWwuc291cmNlSW5mby5oYXNMb2NhdG9yID0gVFJVRTsKKwkgICAgICBfaW5pdEdlbldpbkluZm8gKAorCQkJCSZkaXNhc3NlbVdpbi0+Z2VuZXJpYywKKwkJCQlkaXNhc3NlbVdpbi0+Z2VuZXJpYy50eXBlLAorCQkJCWFzbUhlaWdodCwKKwkJCQlkaXNhc3NlbVdpbi0+Z2VuZXJpYy53aWR0aCwKKwkJCWRpc2Fzc2VtV2luLT5kZXRhaWwuc291cmNlSW5mby5leGVjdXRpb25JbmZvLT53aWR0aCwKKwkJCQlzcmNIZWlnaHQgLSAxKTsKKwkgICAgICBfaW5pdEdlbldpbkluZm8gKGRpc2Fzc2VtV2luLT5kZXRhaWwuc291cmNlSW5mby5leGVjdXRpb25JbmZvLAorCQkJICAgICAgIEVYRUNfSU5GT19XSU4sCisJCQkgICAgICAgYXNtSGVpZ2h0LAorCQkJICAgICAgIDMsCisJCQkgICAgICAgMCwKKwkJCSAgICAgICBzcmNIZWlnaHQgLSAxKTsKKwkgICAgICBkaXNhc3NlbVdpbi0+Y2FuSGlnaGxpZ2h0ID0gVFJVRTsKKwkgICAgICBtX2JlVmlzaWJsZSAoZGlzYXNzZW1XaW4pOworCSAgICAgIG1fYmVWaXNpYmxlIChkaXNhc3NlbVdpbi0+ZGV0YWlsLnNvdXJjZUluZm8uZXhlY3V0aW9uSW5mbyk7CisJICAgIH0KKwkgIGlmIChtX3dpblB0ck5vdE51bGwgKGRpc2Fzc2VtV2luKSkKKwkgICAgeworCSAgICAgIHNyY1dpbi0+ZGV0YWlsLnNvdXJjZUluZm8uaGFzTG9jYXRvciA9IEZBTFNFOworCSAgICAgIGRpc2Fzc2VtV2luLT5kZXRhaWwuc291cmNlSW5mby5oYXNMb2NhdG9yID0gVFJVRTsKKwkgICAgICBtX2JlVmlzaWJsZSAobG9jYXRvcik7CisJICAgICAgdHVpU2hvd0xvY2F0b3JDb250ZW50ICgpOworCSAgICAgIHR1aVNob3dTb3VyY2VDb250ZW50IChkaXNhc3NlbVdpbik7CisKKwkgICAgICBpZiAobV93aW5QdHJJc051bGwgKGNtZFdpbikpCisJCV9tYWtlQ29tbWFuZFdpbmRvdyAoJmNtZFdpbiwKKwkJCQkgICAgY21kSGVpZ2h0LAorCQkJCSAgICB0ZXJtSGVpZ2h0ICgpIC0gY21kSGVpZ2h0KTsKKwkgICAgICBlbHNlCisJCXsKKwkJICBfaW5pdEdlbldpbkluZm8gKCZjbWRXaW4tPmdlbmVyaWMsCisJCQkJICAgY21kV2luLT5nZW5lcmljLnR5cGUsCisJCQkJICAgY21kV2luLT5nZW5lcmljLmhlaWdodCwKKwkJCQkgICBjbWRXaW4tPmdlbmVyaWMud2lkdGgsCisJCQkJICAgMCwKKwkJCQkgICBjbWRXaW4tPmdlbmVyaWMub3JpZ2luLnkpOworCQkgIGNtZFdpbi0+Y2FuSGlnaGxpZ2h0ID0gRkFMU0U7CisJCSAgbV9iZVZpc2libGUgKGNtZFdpbik7CisJCX0KKwkgICAgICBpZiAobV93aW5QdHJOb3ROdWxsIChjbWRXaW4pKQorCQl0dWlSZWZyZXNoV2luICgmY21kV2luLT5nZW5lcmljKTsKKwkgICAgfQorCX0KKyAgICAgIHNldEN1cnJlbnRMYXlvdXRUbyAoU1JDX0RJU0FTU0VNX0NPTU1BTkQpOworICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIF9zaG93U291cmNlRGlzYXNzZW1Db21tYW5kICovCisKKworLyoKKyoqICAgIF9zaG93RGF0YSgpLgorKiogICAgICAgIFNob3cgdGhlIFNvdXJjZS9EYXRhL0NvbW1hbmQgb3IgdGhlIERpc3Nhc3NlbWJseS9EYXRhL0NvbW1hbmQgbGF5b3V0CisqLworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3Nob3dEYXRhICgKKwkgICAgVHVpTGF5b3V0VHlwZSBuZXdMYXlvdXQpCisjZWxzZQorX3Nob3dEYXRhIChuZXdMYXlvdXQpCisgICAgIFR1aUxheW91dFR5cGUgbmV3TGF5b3V0OworI2VuZGlmCit7CisgIGludCB0b3RhbEhlaWdodCA9ICh0ZXJtSGVpZ2h0ICgpIC0gY21kV2luLT5nZW5lcmljLmhlaWdodCk7CisgIGludCBzcmNIZWlnaHQsIGRhdGFIZWlnaHQ7CisgIFR1aVdpblR5cGUgd2luVHlwZTsKKyAgVHVpR2VuV2luSW5mb1B0ciBsb2NhdG9yID0gbG9jYXRvcldpbkluZm9QdHIgKCk7CisKKworICBkYXRhSGVpZ2h0ID0gdG90YWxIZWlnaHQgLyAyOworICBzcmNIZWlnaHQgPSB0b3RhbEhlaWdodCAtIGRhdGFIZWlnaHQ7CisgIG1fYWxsQmVJbnZpc2libGUgKCk7CisgIG1fYmVJbnZpc2libGUgKGxvY2F0b3IpOworICBfbWFrZURhdGFXaW5kb3cgKCZkYXRhV2luLCBkYXRhSGVpZ2h0LCAwKTsKKyAgZGF0YVdpbi0+Y2FuSGlnaGxpZ2h0ID0gVFJVRTsKKyAgaWYgKG5ld0xheW91dCA9PSBTUkNfREFUQV9DT01NQU5EKQorICAgIHdpblR5cGUgPSBTUkNfV0lOOworICBlbHNlCisgICAgd2luVHlwZSA9IERJU0FTU0VNX1dJTjsKKyAgaWYgKG1fd2luUHRySXNOdWxsICh3aW5MaXN0W3dpblR5cGVdKSkKKyAgICB7CisgICAgICBpZiAod2luVHlwZSA9PSBTUkNfV0lOKQorCV9tYWtlU291cmNlV2luZG93ICgmd2luTGlzdFt3aW5UeXBlXSwgc3JjSGVpZ2h0LCBkYXRhSGVpZ2h0IC0gMSk7CisgICAgICBlbHNlCisJX21ha2VEaXNhc3NlbVdpbmRvdyAoJndpbkxpc3Rbd2luVHlwZV0sIHNyY0hlaWdodCwgZGF0YUhlaWdodCAtIDEpOworICAgICAgX2luaXRBbmRNYWtlV2luICgoT3BhcXVlICopICYgbG9jYXRvciwKKwkJICAgICAgIExPQ0FUT1JfV0lOLAorCQkgICAgICAgMiAvKiAxICovICwKKwkJICAgICAgIHRlcm1XaWR0aCAoKSwKKwkJICAgICAgIDAsCisJCSAgICAgICB0b3RhbEhlaWdodCAtIDEsCisJCSAgICAgICBET05UX0JPWF9XSU5ET1cpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9pbml0R2VuV2luSW5mbyAoJndpbkxpc3Rbd2luVHlwZV0tPmdlbmVyaWMsCisJCSAgICAgICB3aW5MaXN0W3dpblR5cGVdLT5nZW5lcmljLnR5cGUsCisJCSAgICAgICBzcmNIZWlnaHQsCisJCSAgICAgICB3aW5MaXN0W3dpblR5cGVdLT5nZW5lcmljLndpZHRoLAorCQkgICB3aW5MaXN0W3dpblR5cGVdLT5kZXRhaWwuc291cmNlSW5mby5leGVjdXRpb25JbmZvLT53aWR0aCwKKwkJICAgICAgIGRhdGFIZWlnaHQgLSAxKTsKKyAgICAgIF9pbml0R2VuV2luSW5mbyAod2luTGlzdFt3aW5UeXBlXS0+ZGV0YWlsLnNvdXJjZUluZm8uZXhlY3V0aW9uSW5mbywKKwkJICAgICAgIEVYRUNfSU5GT19XSU4sCisJCSAgICAgICBzcmNIZWlnaHQsCisJCSAgICAgICAzLAorCQkgICAgICAgMCwKKwkJICAgICAgIGRhdGFIZWlnaHQgLSAxKTsKKyAgICAgIG1fYmVWaXNpYmxlICh3aW5MaXN0W3dpblR5cGVdKTsKKyAgICAgIG1fYmVWaXNpYmxlICh3aW5MaXN0W3dpblR5cGVdLT5kZXRhaWwuc291cmNlSW5mby5leGVjdXRpb25JbmZvKTsKKyAgICAgIF9pbml0R2VuV2luSW5mbyAobG9jYXRvciwKKwkJICAgICAgIExPQ0FUT1JfV0lOLAorCQkgICAgICAgMiAvKiAxICovICwKKwkJICAgICAgIHRlcm1XaWR0aCAoKSwKKwkJICAgICAgIDAsCisJCSAgICAgICB0b3RhbEhlaWdodCAtIDEpOworICAgIH0KKyAgd2luTGlzdFt3aW5UeXBlXS0+ZGV0YWlsLnNvdXJjZUluZm8uaGFzTG9jYXRvciA9IFRSVUU7CisgIG1fYmVWaXNpYmxlIChsb2NhdG9yKTsKKyAgdHVpU2hvd0xvY2F0b3JDb250ZW50ICgpOworICBhZGRUb1NvdXJjZVdpbmRvd3MgKHdpbkxpc3Rbd2luVHlwZV0pOworICBzZXRDdXJyZW50TGF5b3V0VG8gKG5ld0xheW91dCk7CisKKyAgcmV0dXJuOworfQkJCQkvKiBfc2hvd0RhdGEgKi8KKworLyoKKyoqIF9pbml0R2VuV2luSW5mbygpLgorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK19pbml0R2VuV2luSW5mbyAoCisJCSAgVHVpR2VuV2luSW5mb1B0ciB3aW5JbmZvLAorCQkgIFR1aVdpblR5cGUgdHlwZSwKKwkJICBpbnQgaGVpZ2h0LAorCQkgIGludCB3aWR0aCwKKwkJICBpbnQgb3JpZ2luWCwKKwkJICBpbnQgb3JpZ2luWSkKKyNlbHNlCitfaW5pdEdlbldpbkluZm8gKHdpbkluZm8sIHR5cGUsIGhlaWdodCwgd2lkdGgsIG9yaWdpblgsIG9yaWdpblkpCisgICAgIFR1aUdlbldpbkluZm9QdHIgd2luSW5mbzsKKyAgICAgVHVpV2luVHlwZSB0eXBlOworICAgICBpbnQgaGVpZ2h0OworICAgICBpbnQgd2lkdGg7CisgICAgIGludCBvcmlnaW5YOworICAgICBpbnQgb3JpZ2luWTsKKyNlbmRpZgoreworICBpbnQgaCA9IGhlaWdodDsKKworICB3aW5JbmZvLT50eXBlID0gdHlwZTsKKyAgd2luSW5mby0+d2lkdGggPSB3aWR0aDsKKyAgd2luSW5mby0+aGVpZ2h0ID0gaDsKKyAgaWYgKGggPiAxKQorICAgIHsKKyAgICAgIHdpbkluZm8tPnZpZXdwb3J0SGVpZ2h0ID0gaCAtIDE7CisgICAgICBpZiAod2luSW5mby0+dHlwZSAhPSBDTURfV0lOKQorCXdpbkluZm8tPnZpZXdwb3J0SGVpZ2h0LS07CisgICAgfQorICBlbHNlCisgICAgd2luSW5mby0+dmlld3BvcnRIZWlnaHQgPSAxOworICB3aW5JbmZvLT5vcmlnaW4ueCA9IG9yaWdpblg7CisgIHdpbkluZm8tPm9yaWdpbi55ID0gb3JpZ2luWTsKKworICByZXR1cm47Cit9CQkJCS8qIF9pbml0R2VuV2luSW5mbyAqLworCisvKgorKiogX2luaXRBbmRNYWtlV2luKCkuCisqLworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX2luaXRBbmRNYWtlV2luICgKKwkJICBPcGFxdWUgKiB3aW5JbmZvUHRyLAorCQkgIFR1aVdpblR5cGUgd2luVHlwZSwKKwkJICBpbnQgaGVpZ2h0LAorCQkgIGludCB3aWR0aCwKKwkJICBpbnQgb3JpZ2luWCwKKwkJICBpbnQgb3JpZ2luWSwKKwkJICBpbnQgYm94SXQpCisjZWxzZQorX2luaXRBbmRNYWtlV2luICh3aW5JbmZvUHRyLCB3aW5UeXBlLCBoZWlnaHQsIHdpZHRoLCBvcmlnaW5YLCBvcmlnaW5ZLCBib3hJdCkKKyAgICAgT3BhcXVlICp3aW5JbmZvUHRyOworICAgICBUdWlXaW5UeXBlIHdpblR5cGU7CisgICAgIGludCBoZWlnaHQ7CisgICAgIGludCB3aWR0aDsKKyAgICAgaW50IG9yaWdpblg7CisgICAgIGludCBvcmlnaW5ZOworICAgICBpbnQgYm94SXQ7CisjZW5kaWYKK3sKKyAgT3BhcXVlIG9wYXF1ZVdpbkluZm8gPSAqd2luSW5mb1B0cjsKKyAgVHVpR2VuV2luSW5mb1B0ciBnZW5lcmljOworCisgIGlmIChvcGFxdWVXaW5JbmZvID09IChPcGFxdWUpIE5VTEwpCisgICAgeworICAgICAgaWYgKG1fd2luSXNBdXhpbGxhcnkgKHdpblR5cGUpKQorCW9wYXF1ZVdpbkluZm8gPSAoT3BhcXVlKSBhbGxvY0dlbmVyaWNXaW5JbmZvICgpOworICAgICAgZWxzZQorCW9wYXF1ZVdpbkluZm8gPSAoT3BhcXVlKSBhbGxvY1dpbkluZm8gKHdpblR5cGUpOworICAgIH0KKyAgaWYgKG1fd2luSXNBdXhpbGxhcnkgKHdpblR5cGUpKQorICAgIGdlbmVyaWMgPSAoVHVpR2VuV2luSW5mb1B0cikgb3BhcXVlV2luSW5mbzsKKyAgZWxzZQorICAgIGdlbmVyaWMgPSAmKChUdWlXaW5JbmZvUHRyKSBvcGFxdWVXaW5JbmZvKS0+Z2VuZXJpYzsKKworICBpZiAob3BhcXVlV2luSW5mbyAhPSAoT3BhcXVlKSBOVUxMKQorICAgIHsKKyAgICAgIF9pbml0R2VuV2luSW5mbyAoZ2VuZXJpYywgd2luVHlwZSwgaGVpZ2h0LCB3aWR0aCwgb3JpZ2luWCwgb3JpZ2luWSk7CisgICAgICBpZiAoIW1fd2luSXNBdXhpbGxhcnkgKHdpblR5cGUpKQorCXsKKwkgIGlmIChnZW5lcmljLT50eXBlID09IENNRF9XSU4pCisJICAgICgoVHVpV2luSW5mb1B0cikgb3BhcXVlV2luSW5mbyktPmNhbkhpZ2hsaWdodCA9IEZBTFNFOworCSAgZWxzZQorCSAgICAoKFR1aVdpbkluZm9QdHIpIG9wYXF1ZVdpbkluZm8pLT5jYW5IaWdobGlnaHQgPSBUUlVFOworCX0KKyAgICAgIG1ha2VXaW5kb3cgKGdlbmVyaWMsIGJveEl0KTsKKyAgICAgIGlmICh3aW5UeXBlID09IExPQ0FUT1JfV0lOKQorCXR1aUNsZWFyTG9jYXRvckRpc3BsYXkgKCk7CisgICAgICBlY2hvICgpOworICAgIH0KKyAgKndpbkluZm9QdHIgPSBvcGFxdWVXaW5JbmZvOworCisgIHJldHVybjsKK30JCQkJLyogX2luaXRBbmRNYWtlV2luICovCisKKworLyoKKyoqIF9tYWtlU291cmNlT3JEaXNhc3NlbVdpbmRvdygpLgorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK19tYWtlU291cmNlT3JEaXNhc3NlbVdpbmRvdyAoCisJCQkgICAgICBUdWlXaW5JbmZvUHRyICogd2luSW5mb1B0ciwKKwkJCSAgICAgIFR1aVdpblR5cGUgdHlwZSwKKwkJCSAgICAgIGludCBoZWlnaHQsCisJCQkgICAgICBpbnQgb3JpZ2luWSkKKyNlbHNlCitfbWFrZVNvdXJjZU9yRGlzYXNzZW1XaW5kb3cgKHdpbkluZm9QdHIsIHR5cGUsIGhlaWdodCwgb3JpZ2luWSkKKyAgICAgVHVpV2luSW5mb1B0ciAqd2luSW5mb1B0cjsKKyAgICAgVHVpV2luVHlwZSB0eXBlOworICAgICBpbnQgaGVpZ2h0OworICAgICBpbnQgb3JpZ2luWTsKKyNlbmRpZgoreworICBUdWlHZW5XaW5JbmZvUHRyIGV4ZWN1dGlvbkluZm8gPSAoVHVpR2VuV2luSW5mb1B0cikgTlVMTDsKKworICAvKgorICAgICoqIENyZWF0ZSB0aGUgZXhldWN0aW9uIGluZm8gd2luZG93LgorICAgICovCisgIGlmICh0eXBlID09IFNSQ19XSU4pCisgICAgZXhlY3V0aW9uSW5mbyA9IHNvdXJjZUV4ZWNJbmZvV2luUHRyICgpOworICBlbHNlCisgICAgZXhlY3V0aW9uSW5mbyA9IGRpc2Fzc2VtRXhlY0luZm9XaW5QdHIgKCk7CisgIF9pbml0QW5kTWFrZVdpbiAoKE9wYXF1ZSAqKSAmIGV4ZWN1dGlvbkluZm8sCisJCSAgIEVYRUNfSU5GT19XSU4sCisJCSAgIGhlaWdodCwKKwkJICAgMywKKwkJICAgMCwKKwkJICAgb3JpZ2luWSwKKwkJICAgRE9OVF9CT1hfV0lORE9XKTsKKyAgLyoKKyAgICAqKiBOb3cgY3JlYXRlIHRoZSBzb3VyY2Ugd2luZG93LgorICAgICovCisgIF9pbml0QW5kTWFrZVdpbiAoKE9wYXF1ZSAqKSB3aW5JbmZvUHRyLAorCQkgICB0eXBlLAorCQkgICBoZWlnaHQsCisJCSAgIHRlcm1XaWR0aCAoKSAtIGV4ZWN1dGlvbkluZm8tPndpZHRoLAorCQkgICBleGVjdXRpb25JbmZvLT53aWR0aCwKKwkJICAgb3JpZ2luWSwKKwkJICAgQk9YX1dJTkRPVyk7CisKKyAgKCp3aW5JbmZvUHRyKS0+ZGV0YWlsLnNvdXJjZUluZm8uZXhlY3V0aW9uSW5mbyA9IGV4ZWN1dGlvbkluZm87CisKKyAgcmV0dXJuOworfQkJCQkvKiBfbWFrZVNvdXJjZU9yRGlzYXNzZW1XaW5kb3cgKi8KKworCisvKgorKiogICAgX3Nob3dTb3VyY2VPckRpc2Fzc2VtQW5kQ29tbWFuZCgpLgorKiogICAgICAgIFNob3cgdGhlIFNvdXJjZS9Db21tYW5kIG9yIHRoZSBEaXNhc3NlbSBsYXlvdXQKKyovCitzdGF0aWMgdm9pZAorI2lmZGVmIF9fU1REQ19fCitfc2hvd1NvdXJjZU9yRGlzYXNzZW1BbmRDb21tYW5kICgKKwkJCQkgIFR1aUxheW91dFR5cGUgbGF5b3V0VHlwZSkKKyNlbHNlCitfc2hvd1NvdXJjZU9yRGlzYXNzZW1BbmRDb21tYW5kIChsYXlvdXRUeXBlKQorICAgICBUdWlMYXlvdXRUeXBlIGxheW91dFR5cGU7CisjZW5kaWYKK3sKKyAgaWYgKGN1cnJlbnRMYXlvdXQgKCkgIT0gbGF5b3V0VHlwZSkKKyAgICB7CisgICAgICBUdWlXaW5JbmZvUHRyICp3aW5JbmZvUHRyOworICAgICAgaW50IGFyZWFMZWZ0OworICAgICAgaW50IHNyY0hlaWdodCwgY21kSGVpZ2h0OworICAgICAgVHVpR2VuV2luSW5mb1B0ciBsb2NhdG9yID0gbG9jYXRvcldpbkluZm9QdHIgKCk7CisKKyAgICAgIGlmIChtX3dpblB0ck5vdE51bGwgKGNtZFdpbikpCisJY21kSGVpZ2h0ID0gY21kV2luLT5nZW5lcmljLmhlaWdodDsKKyAgICAgIGVsc2UKKwljbWRIZWlnaHQgPSB0ZXJtSGVpZ2h0ICgpIC8gMzsKKyAgICAgIHNyY0hlaWdodCA9IHRlcm1IZWlnaHQgKCkgLSBjbWRIZWlnaHQ7CisKKworICAgICAgaWYgKGxheW91dFR5cGUgPT0gU1JDX0NPTU1BTkQpCisJd2luSW5mb1B0ciA9ICZzcmNXaW47CisgICAgICBlbHNlCisJd2luSW5mb1B0ciA9ICZkaXNhc3NlbVdpbjsKKworICAgICAgaWYgKG1fd2luUHRySXNOdWxsICgqd2luSW5mb1B0cikpCisJeworCSAgaWYgKGxheW91dFR5cGUgPT0gU1JDX0NPTU1BTkQpCisJICAgIF9tYWtlU291cmNlV2luZG93ICh3aW5JbmZvUHRyLCBzcmNIZWlnaHQgLSAxLCAwKTsKKwkgIGVsc2UKKwkgICAgX21ha2VEaXNhc3NlbVdpbmRvdyAod2luSW5mb1B0ciwgc3JjSGVpZ2h0IC0gMSwgMCk7CisJICBfaW5pdEFuZE1ha2VXaW4gKChPcGFxdWUgKikgJiBsb2NhdG9yLAorCQkJICAgTE9DQVRPUl9XSU4sCisJCQkgICAyIC8qIDEgKi8gLAorCQkJICAgdGVybVdpZHRoICgpLAorCQkJICAgMCwKKwkJCSAgIHNyY0hlaWdodCAtIDEsCisJCQkgICBET05UX0JPWF9XSU5ET1cpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfaW5pdEdlbldpbkluZm8gKGxvY2F0b3IsCisJCQkgICBMT0NBVE9SX1dJTiwKKwkJCSAgIDIgLyogMSAqLyAsCisJCQkgICB0ZXJtV2lkdGggKCksCisJCQkgICAwLAorCQkJICAgc3JjSGVpZ2h0IC0gMSk7CisJICAoKndpbkluZm9QdHIpLT5kZXRhaWwuc291cmNlSW5mby5oYXNMb2NhdG9yID0gVFJVRTsKKwkgIF9pbml0R2VuV2luSW5mbyAoCisJCQkgICAgJigqd2luSW5mb1B0ciktPmdlbmVyaWMsCisJCQkgICAgKCp3aW5JbmZvUHRyKS0+Z2VuZXJpYy50eXBlLAorCQkJICAgIHNyY0hlaWdodCAtIDEsCisJCQkgICAgKCp3aW5JbmZvUHRyKS0+Z2VuZXJpYy53aWR0aCwKKwkJICAgICAgKCp3aW5JbmZvUHRyKS0+ZGV0YWlsLnNvdXJjZUluZm8uZXhlY3V0aW9uSW5mby0+d2lkdGgsCisJCQkgICAgMCk7CisJICBfaW5pdEdlbldpbkluZm8gKCgqd2luSW5mb1B0ciktPmRldGFpbC5zb3VyY2VJbmZvLmV4ZWN1dGlvbkluZm8sCisJCQkgICBFWEVDX0lORk9fV0lOLAorCQkJICAgc3JjSGVpZ2h0IC0gMSwKKwkJCSAgIDMsCisJCQkgICAwLAorCQkJICAgMCk7CisJICAoKndpbkluZm9QdHIpLT5jYW5IaWdobGlnaHQgPSBUUlVFOworCSAgbV9iZVZpc2libGUgKCp3aW5JbmZvUHRyKTsKKwkgIG1fYmVWaXNpYmxlICgoKndpbkluZm9QdHIpLT5kZXRhaWwuc291cmNlSW5mby5leGVjdXRpb25JbmZvKTsKKwl9CisgICAgICBpZiAobV93aW5QdHJOb3ROdWxsICgqd2luSW5mb1B0cikpCisJeworCSAgKCp3aW5JbmZvUHRyKS0+ZGV0YWlsLnNvdXJjZUluZm8uaGFzTG9jYXRvciA9IFRSVUU7CisJICBtX2JlVmlzaWJsZSAobG9jYXRvcik7CisJICB0dWlTaG93TG9jYXRvckNvbnRlbnQgKCk7CisJICB0dWlTaG93U291cmNlQ29udGVudCAoKndpbkluZm9QdHIpOworCisJICBpZiAobV93aW5QdHJJc051bGwgKGNtZFdpbikpCisJICAgIHsKKwkgICAgICBfbWFrZUNvbW1hbmRXaW5kb3cgKCZjbWRXaW4sIGNtZEhlaWdodCwgc3JjSGVpZ2h0KTsKKwkgICAgICB0dWlSZWZyZXNoV2luICgmY21kV2luLT5nZW5lcmljKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgX2luaXRHZW5XaW5JbmZvICgmY21kV2luLT5nZW5lcmljLAorCQkJICAgICAgIGNtZFdpbi0+Z2VuZXJpYy50eXBlLAorCQkJICAgICAgIGNtZFdpbi0+Z2VuZXJpYy5oZWlnaHQsCisJCQkgICAgICAgY21kV2luLT5nZW5lcmljLndpZHRoLAorCQkJICAgICAgIGNtZFdpbi0+Z2VuZXJpYy5vcmlnaW4ueCwKKwkJCSAgICAgICBjbWRXaW4tPmdlbmVyaWMub3JpZ2luLnkpOworCSAgICAgIGNtZFdpbi0+Y2FuSGlnaGxpZ2h0ID0gRkFMU0U7CisJICAgICAgbV9iZVZpc2libGUgKGNtZFdpbik7CisJICAgIH0KKwl9CisgICAgICBzZXRDdXJyZW50TGF5b3V0VG8gKGxheW91dFR5cGUpOworICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIF9zaG93U291cmNlT3JEaXNhc3NlbUFuZENvbW1hbmQgKi8KZGlmZiAtLWdpdCBhL2dkYi90dWkvdHVpTGF5b3V0LmggYi9nZGIvdHVpL3R1aUxheW91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZDhiYmMKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdHVpL3R1aUxheW91dC5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgVFVJX0xBWU9VVF9ICisjZGVmaW5lIFRVSV9MQVlPVVRfSAorCitleHRlcm4gdm9pZCAgICAgICAgICAgICBzaG93TGF5b3V0IFBBUkFNUyAoKFR1aUxheW91dFR5cGUpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHR1aUFkZFdpblRvTGF5b3V0IFBBUkFNUyAoKFR1aVdpblR5cGUpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHR1aV92QWRkV2luVG9MYXlvdXQgUEFSQU1TICgodmFfbGlzdCkpOworZXh0ZXJuIGludCAgICAgICAgICAgICAgdHVpRGVmYXVsdFdpbkhlaWdodCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoVHVpV2luVHlwZSwgVHVpTGF5b3V0VHlwZSkpOworZXh0ZXJuIGludCAgICAgICAgICAgICAgdHVpRGVmYXVsdFdpblZpZXdwb3J0SGVpZ2h0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMgKChUdWlXaW5UeXBlLCBUdWlMYXlvdXRUeXBlKSk7CitleHRlcm4gVHVpU3RhdHVzICAgICAgICB0dWlTZXRMYXlvdXQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNUyAoKFR1aUxheW91dFR5cGUsIFR1aVJlZ2lzdGVyRGlzcGxheVR5cGUpKTsKK2V4dGVybiBUdWlTdGF0dXMgICAgICAgIHR1aV92U2V0TGF5b3V0VG8gUEFSQU1TICgodmFfbGlzdCkpOworCisjZW5kaWYgLypUVUlfTEFZT1VUX0gqLwpkaWZmIC0tZ2l0IGEvZ2RiL3R1aS90dWlSZWdzLmMgYi9nZGIvdHVpL3R1aVJlZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzhiOWJjCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3R1aS90dWlSZWdzLmMKQEAgLTAsMCArMSwxMjEwIEBACisKKy8qCisqKiB0dWlSZWdzLmMKKyoqICAgICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgZnVuY3Rpb25zIHRvIHN1cHBvcnQgZGlzcGxheSBvZiByZWdpc3RlcnMKKyoqICAgICAgICAgaW4gdGhlIGRhdGEgd2luZG93LgorKi8KKworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgInR1aS5oIgorI2luY2x1ZGUgInR1aURhdGEuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJ0dWlMYXlvdXQuaCIKKyNpbmNsdWRlICJ0dWlXaW4uaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIExPQ0FMIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBET1VCTEVfRkxPQVRfTEFCRUxfV0lEVEggICAgNgorI2RlZmluZSBET1VCTEVfRkxPQVRfTEFCRUxfRk1UICAgICAgIiU2LjZzOiAiCisjZGVmaW5lIERPVUJMRV9GTE9BVF9WQUxVRV9XSURUSCAgICAzMAkvKm1pbiBvZiAxNiBidXQgbWF5IGJlIGluIHNjaSBub3RhdGlvbiAqLworCisjZGVmaW5lIFNJTkdMRV9GTE9BVF9MQUJFTF9XSURUSCAgICA2CisjZGVmaW5lIFNJTkdMRV9GTE9BVF9MQUJFTF9GTVQgICAgICAiJTYuNnM6ICIKKyNkZWZpbmUgU0lOR0xFX0ZMT0FUX1ZBTFVFX1dJRFRIICAgIDI1CS8qIG1pbiBvZiA4IGJ1dCBtYXkgYmUgaW4gc2NpIG5vdGF0aW9uICovCisKKyNkZWZpbmUgU0lOR0xFX0xBQkVMX1dJRFRIICAgIDEwCisjZGVmaW5lIFNJTkdMRV9MQUJFTF9GTVQgICAgICAiJTEwLjEwczogIgorI2RlZmluZSBTSU5HTEVfVkFMVUVfV0lEVEggICAgMTQvKiBtaW5pbXVtIG9mIDggYnV0IG1heSBiZSBpbiBzY2kgbm90YXRpb24gKi8KKworLyogSW4gdGhlIGNvZGUgSFAgZ2F2ZSBDeWdudXMsIHRoaXMgd2FzIGFjdHVhbGx5IGEgZnVuY3Rpb24gY2FsbCB0byBhCisgICBQQS1zcGVjaWZpYyBmdW5jdGlvbiwgd2hpY2ggd2FzIHN1cHBvc2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQorICAgdGFyZ2V0IHdhcyBhIDY0LWJpdCBvciAzMi1iaXQgcHJvY2Vzc29yLiAgSG93ZXZlciwgdGhlIDY0LWJpdAorICAgc3VwcG9ydCB3YXNuJ3QgY29tcGxldGUsIHNvIHdlIGRpZG4ndCBtZXJnZSB0aGF0IGluLCBzbyB3ZSBsZWF2ZQorICAgdGhpcyBoZXJlIGFzIGEgc3R1Yi4gICovCisjZGVmaW5lIElTXzY0QklUIDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBTVEFUSUMgREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFNUQVRJQyBMT0NBTCBGVU5DVElPTlMgRk9SV0FSRCBERUNMUyAgICAqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFR1aVN0YXR1cyBfdHVpU2V0UmVnc0NvbnRlbnQKKyAgUEFSQU1TICgoaW50LCBpbnQsIHN0cnVjdCBmcmFtZV9pbmZvICosCisJICAgVHVpUmVnaXN0ZXJEaXNwbGF5VHlwZSwgaW50KSk7CitzdGF0aWMgY2hhciAqX3R1aVJlZ2lzdGVyTmFtZSBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyBUdWlTdGF0dXMgX3R1aUdldFJlZ2lzdGVyUmF3VmFsdWUKKyAgUEFSQU1TICgoaW50LCBjaGFyICosIHN0cnVjdCBmcmFtZV9pbmZvICopKTsKK3N0YXRpYyB2b2lkIF90dWlTZXRSZWdpc3RlckVsZW1lbnQKKyAgUEFSQU1TICgoaW50LCBzdHJ1Y3QgZnJhbWVfaW5mbyAqLAorCSAgIFR1aURhdGFFbGVtZW50UHRyLCBpbnQpKTsKK3N0YXRpYyB2b2lkIF90dWlEaXNwbGF5UmVnaXN0ZXIKKyAgUEFSQU1TICgoaW50LCBUdWlHZW5XaW5JbmZvUHRyLCBlbnVtIHByZWNpc2lvbl90eXBlKSk7CitzdGF0aWMgdm9pZCBfdHVpUmVnaXN0ZXJGb3JtYXQKKyAgUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCwgVHVpRGF0YUVsZW1lbnRQdHIsCisJICAgZW51bSBwcmVjaXNpb25fdHlwZSkpOworc3RhdGljIFR1aVN0YXR1cyBfdHVpU2V0R2VuZXJhbFJlZ3NDb250ZW50IFBBUkFNUyAoKGludCkpOworc3RhdGljIFR1aVN0YXR1cyBfdHVpU2V0U3BlY2lhbFJlZ3NDb250ZW50IFBBUkFNUyAoKGludCkpOworc3RhdGljIFR1aVN0YXR1cyBfdHVpU2V0R2VuZXJhbEFuZFNwZWNpYWxSZWdzQ29udGVudCBQQVJBTVMgKChpbnQpKTsKK3N0YXRpYyBUdWlTdGF0dXMgX3R1aVNldEZsb2F0UmVnc0NvbnRlbnQgUEFSQU1TICgoVHVpUmVnaXN0ZXJEaXNwbGF5VHlwZSwgaW50KSk7CitzdGF0aWMgaW50IF90dWlSZWdWYWx1ZUhhc0NoYW5nZWQKKyAgUEFSQU1TICgoVHVpRGF0YUVsZW1lbnRQdHIsIHN0cnVjdCBmcmFtZV9pbmZvICosCisJICAgY2hhciAqKSk7CitzdGF0aWMgdm9pZCBfdHVpU2hvd0Zsb2F0X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIF90dWlTaG93R2VuZXJhbF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBfdHVpU2hvd1NwZWNpYWxfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworc3RhdGljIHZvaWQgX3R1aV92U2hvd1JlZ2lzdGVyc19jb21tYW5kU3VwcG9ydCBQQVJBTVMgKCh2YV9saXN0KSk7CitzdGF0aWMgdm9pZCBfdHVpVG9nZ2xlRmxvYXRSZWdzX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIF90dWlTY3JvbGxSZWdzRm9yd2FyZF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBfdHVpU2Nyb2xsUmVnc0JhY2t3YXJkX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIF90dWlfdlNob3dSZWdpc3RlcnNfY29tbWFuZFN1cHBvcnQgUEFSQU1TICgodmFfbGlzdCkpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBQVUJMSUMgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyoqIHR1aUxhc3RSZWdzTGluZU5vKCkKKyoqICAgICAgICBBbnN3ZXIgdGhlIG51bWJlciBvZiB0aGUgbGFzdCBsaW5lIGluIHRoZSByZWdzIGRpc3BsYXkuCisqKiAgICAgICAgSWYgdGhlcmUgYXJlIG5vIHJlZ2lzdGVycyAoLTEpIGlzIHJldHVybmVkLgorKi8KK2ludAorI2lmZGVmIF9fU1REQ19fCit0dWlMYXN0UmVnc0xpbmVObyAodm9pZCkKKyNlbHNlCit0dWlMYXN0UmVnc0xpbmVObyAoKQorI2VuZGlmCit7CisgIHJlZ2lzdGVyIGludCBudW1MaW5lcyA9ICgtMSk7CisKKyAgaWYgKGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0NvbnRlbnRDb3VudCA+IDApCisgICAgeworICAgICAgbnVtTGluZXMgPSAoZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudENvdW50IC8KKwkJICBkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb2x1bW5Db3VudCk7CisgICAgICBpZiAoZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudENvdW50ICUKKwkgIGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0NvbHVtbkNvdW50KQorCW51bUxpbmVzKys7CisgICAgfQorICByZXR1cm4gbnVtTGluZXM7Cit9CQkJCS8qIHR1aUxhc3RSZWdzTGluZU5vICovCisKKworLyoKKyoqIHR1aUxpbmVGcm9tUmVnRWxlbWVudE5vKCkKKyoqICAgICAgICBBbnN3ZXIgdGhlIGxpbmUgbnVtYmVyIHRoYXQgdGhlIHJlZ2lzdGVyIGVsZW1lbnQgYXQgZWxlbWVudE5vIGlzCisqKiAgICAgICAgb24uICBJZiBlbGVtZW50Tm8gaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXIgZWxlbWVudHMKKyoqICAgICAgICB0aGVyZSBhcmUsIC0xIGlzIHJldHVybmVkLgorKi8KK2ludAorI2lmZGVmIF9fU1REQ19fCit0dWlMaW5lRnJvbVJlZ0VsZW1lbnRObyAoCisJCQkgIGludCBlbGVtZW50Tm8pCisjZWxzZQordHVpTGluZUZyb21SZWdFbGVtZW50Tm8gKGVsZW1lbnRObykKKyAgICAgaW50IGVsZW1lbnRObzsKKyNlbmRpZgoreworICBpZiAoZWxlbWVudE5vIDwgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudENvdW50KQorICAgIHsKKyAgICAgIGludCBpLCBsaW5lID0gKC0xKTsKKworICAgICAgaSA9IDE7CisgICAgICB3aGlsZSAobGluZSA9PSAoLTEpKQorCXsKKwkgIGlmIChlbGVtZW50Tm8gPAorCSAgICAgIChkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb2x1bW5Db3VudCAqIGkpKQorCSAgICBsaW5lID0gaSAtIDE7CisJICBlbHNlCisJICAgIGkrKzsKKwl9CisKKyAgICAgIHJldHVybiBsaW5lOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAoLTEpOworfQkJCQkvKiB0dWlMaW5lRnJvbVJlZ0VsZW1lbnRObyAqLworCisKKy8qCisqKiB0dWlGaXJzdFJlZ0VsZW1lbnROb0luTGluZSgpCisqKiAgICAgICAgQW5zd2VyIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiBsaW5lTm8uICBJZiBsaW5lTm8gaXMKKyoqICAgICAgICBwYXN0IHRoZSByZWdpc3RlciBhcmVhICgtMSkgaXMgcmV0dXJuZWQuCisqLworaW50CisjaWZkZWYgX19TVERDX18KK3R1aUZpcnN0UmVnRWxlbWVudE5vSW5MaW5lICgKKwkJCSAgICAgaW50IGxpbmVObykKKyNlbHNlCit0dWlGaXJzdFJlZ0VsZW1lbnROb0luTGluZSAobGluZU5vKQorICAgICBpbnQgbGluZU5vOworI2VuZGlmCit7CisgIGlmICgobGluZU5vICogZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29sdW1uQ291bnQpCisgICAgICA8PSBkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb250ZW50Q291bnQpCisgICAgcmV0dXJuICgobGluZU5vICsgMSkgKgorCSAgICBkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb2x1bW5Db3VudCkgLQorICAgICAgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29sdW1uQ291bnQ7CisgIGVsc2UKKyAgICByZXR1cm4gKC0xKTsKK30JCQkJLyogdHVpRmlyc3RSZWdFbGVtZW50Tm9JbkxpbmUgKi8KKworCisvKgorKiogdHVpTGFzdFJlZ0VsZW1lbnROb0luTGluZSgpCisqKiAgICAgICAgQW5zd2VyIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBlbGVtZW50IGluIGxpbmVOby4gIElmIGxpbmVObyBpcyBwYXN0CisqKiAgICAgICAgdGhlIHJlZ2lzdGVyIGFyZWEgKC0xKSBpcyByZXR1cm5lZC4KKyovCitpbnQKKyNpZmRlZiBfX1NURENfXwordHVpTGFzdFJlZ0VsZW1lbnROb0luTGluZSAoCisJCQkgICAgaW50IGxpbmVObykKKyNlbHNlCit0dWlMYXN0UmVnRWxlbWVudE5vSW5MaW5lIChsaW5lTm8pCisgICAgIGludCBsaW5lTm87CisjZW5kaWYKK3sKKyAgaWYgKChsaW5lTm8gKiBkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb2x1bW5Db3VudCkgPD0KKyAgICAgIGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0NvbnRlbnRDb3VudCkKKyAgICByZXR1cm4gKChsaW5lTm8gKyAxKSAqCisJICAgIGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0NvbHVtbkNvdW50KSAtIDE7CisgIGVsc2UKKyAgICByZXR1cm4gKC0xKTsKK30JCQkJLyogdHVpTGFzdFJlZ0VsZW1lbnROb0luTGluZSAqLworCisKKy8qCisqKiB0dWlDYWxjdWxhdGVSZWdzQ29sdW1uQ291bnQKKyoqICAgICAgICBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjb2x1bW5zIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZGlzcGxheQorKiogICAgICAgIHRoZSByZWdpc3RlcnMuCisqLworaW50CisjaWZkZWYgX19TVERDX18KK3R1aUNhbGN1bGF0ZVJlZ3NDb2x1bW5Db3VudCAoCisJCQkgICAgICBUdWlSZWdpc3RlckRpc3BsYXlUeXBlIGRweVR5cGUpCisjZWxzZQordHVpQ2FsY3VsYXRlUmVnc0NvbHVtbkNvdW50IChkcHlUeXBlKQorICAgICBUdWlSZWdpc3RlckRpc3BsYXlUeXBlIGRweVR5cGU7CisjZW5kaWYKK3sKKyAgaW50IGNvbENvdW50LCBjb2xXaWR0aDsKKworICBpZiAoSVNfNjRCSVQgfHwgZHB5VHlwZSA9PSBUVUlfREZMT0FUX1JFR1MpCisgICAgY29sV2lkdGggPSBET1VCTEVfRkxPQVRfVkFMVUVfV0lEVEggKyBET1VCTEVfRkxPQVRfTEFCRUxfV0lEVEg7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoZHB5VHlwZSA9PSBUVUlfU0ZMT0FUX1JFR1MpCisJY29sV2lkdGggPSBTSU5HTEVfRkxPQVRfVkFMVUVfV0lEVEggKyBTSU5HTEVfRkxPQVRfTEFCRUxfV0lEVEg7CisgICAgICBlbHNlCisJY29sV2lkdGggPSBTSU5HTEVfVkFMVUVfV0lEVEggKyBTSU5HTEVfTEFCRUxfV0lEVEg7CisgICAgfQorICBjb2xDb3VudCA9IChkYXRhV2luLT5nZW5lcmljLndpZHRoIC0gMikgLyBjb2xXaWR0aDsKKworICByZXR1cm4gY29sQ291bnQ7Cit9CQkJCS8qIHR1aUNhbHVsYXRlUmVnc0NvbHVtbkNvdW50ICovCisKKworLyoKKyoqIHR1aVNob3dSZWdpc3RlcnMoKS4KKyoqICAgICAgICBTaG93IHRoZSByZWdpc3RlcnMgaW50IHRoZSBkYXRhIHdpbmRvdyBhcyBpbmRpY2F0ZWQgYnkgZHB5VHlwZS4KKyoqICAgICAgICBJZiB0aGVyZSBpcyBhbnkgb3RoZXIgcmVnaXN0ZXJzIGJlaW5nIGRpc3BsYXllZCwgdGhlbiB0aGV5IGFyZQorKiogICAgICAgIGNsZWFyZWQuICBXaGF0IHJlZ2lzdGVycyBhcmUgZGlzcGxheWVkIGlzIGRlcGVuZGVudCB1cG9uIGRweVR5cGUuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlTaG93UmVnaXN0ZXJzICgKKwkJICAgVHVpUmVnaXN0ZXJEaXNwbGF5VHlwZSBkcHlUeXBlKQorI2Vsc2UKK3R1aVNob3dSZWdpc3RlcnMgKGRweVR5cGUpCisgICAgIFR1aVJlZ2lzdGVyRGlzcGxheVR5cGUgZHB5VHlwZTsKKyNlbmRpZgoreworICBUdWlTdGF0dXMgcmV0ID0gVFVJX0ZBSUxVUkU7CisgIGludCByZWZyZXNoVmFsdWVzT25seSA9IEZBTFNFOworCisgIC8qIFNheSB0aGF0IHJlZ2lzdGVycyBzaG91bGQgYmUgZGlzcGxheWVkLCBldmVuIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSAqLworICBkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLmRpc3BsYXlSZWdzID0gVFJVRTsKKworICBpZiAodGFyZ2V0X2hhc19yZWdpc3RlcnMpCisgICAgeworICAgICAgcmVmcmVzaFZhbHVlc09ubHkgPQorCShkcHlUeXBlID09IGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0Rpc3BsYXlUeXBlKTsKKyAgICAgIHN3aXRjaCAoZHB5VHlwZSkKKwl7CisJY2FzZSBUVUlfR0VORVJBTF9SRUdTOgorCSAgcmV0ID0gX3R1aVNldEdlbmVyYWxSZWdzQ29udGVudCAocmVmcmVzaFZhbHVlc09ubHkpOworCSAgYnJlYWs7CisJY2FzZSBUVUlfU0ZMT0FUX1JFR1M6CisJY2FzZSBUVUlfREZMT0FUX1JFR1M6CisJICByZXQgPSBfdHVpU2V0RmxvYXRSZWdzQ29udGVudCAoZHB5VHlwZSwgcmVmcmVzaFZhbHVlc09ubHkpOworCSAgYnJlYWs7CisKKy8qIGNvdWxkIGlmZGVmIG91dCAqLworCisJY2FzZSBUVUlfU1BFQ0lBTF9SRUdTOgorCSAgcmV0ID0gX3R1aVNldFNwZWNpYWxSZWdzQ29udGVudCAocmVmcmVzaFZhbHVlc09ubHkpOworCSAgYnJlYWs7CisJY2FzZSBUVUlfR0VORVJBTF9BTkRfU1BFQ0lBTF9SRUdTOgorCSAgcmV0ID0gX3R1aVNldEdlbmVyYWxBbmRTcGVjaWFsUmVnc0NvbnRlbnQgKHJlZnJlc2hWYWx1ZXNPbmx5KTsKKwkgIGJyZWFrOworCisvKiBlbmQgb2YgcG90ZW50aWFsIGlmIGRlZiAqLworCisJZGVmYXVsdDoKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIGlmIChyZXQgPT0gVFVJX0ZBSUxVUkUpCisgICAgeworICAgICAgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzRGlzcGxheVR5cGUgPSBUVUlfVU5ERUZJTkVEX1JFR1M7CisgICAgICB0dWlFcmFzZURhdGFDb250ZW50IChOT19SRUdTX1NUUklORyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIC8qIENsZWFyIGFsbCBub3RhdGlvbiBvZiBjaGFuZ2VkIHZhbHVlcyAqLworICAgICAgZm9yIChpID0gMDsgKGkgPCBkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb250ZW50Q291bnQpOyBpKyspCisJeworCSAgVHVpR2VuV2luSW5mb1B0ciBkYXRhSXRlbVdpbjsKKworCSAgZGF0YUl0ZW1XaW4gPSAmZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby4KKwkgICAgcmVnc0NvbnRlbnRbaV0tPndoaWNoRWxlbWVudC5kYXRhV2luZG93OworCSAgKCYoKFR1aVdpbkVsZW1lbnRQdHIpCisJICAgICBkYXRhSXRlbVdpbi0+Y29udGVudFswXSktPndoaWNoRWxlbWVudC5kYXRhKS0+aGlnaGxpZ2h0ID0gRkFMU0U7CisJfQorICAgICAgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzRGlzcGxheVR5cGUgPSBkcHlUeXBlOworICAgICAgdHVpRGlzcGxheUFsbERhdGEgKCk7CisgICAgfQorICAodHVpTGF5b3V0RGVmICgpKS0+cmVnc0Rpc3BsYXlUeXBlID0gZHB5VHlwZTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aVNob3dSZWdpc3RlcnMgKi8KKworCisvKgorKiogdHVpRGlzcGxheVJlZ2lzdGVyc0Zyb20oKS4KKyoqICAgICAgICBGdW5jdGlvbiB0byBkaXNwbGF5IHRoZSByZWdpc3RlcnMgaW4gdGhlIGNvbnRlbnQgZnJvbQorKiogICAgICAgICdzdGFydEVsZW1lbnRObycgdW50aWwgdGhlIGVuZCBvZiB0aGUgcmVnaXN0ZXIgY29udGVudCBvciB0aGUKKyoqICAgICAgICBlbmQgb2YgdGhlIGRpc3BsYXkgaGVpZ2h0LiAgTm8gY2hlY2tpbmcgZm9yIGRpc3BsYXlpbmcgcGFzdAorKiogICAgICAgIHRoZSBlbmQgb2YgdGhlIHJlZ2lzdGVycyBpcyBkb25lIGhlcmUuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlEaXNwbGF5UmVnaXN0ZXJzRnJvbSAoCisJCQkgIGludCBzdGFydEVsZW1lbnRObykKKyNlbHNlCit0dWlEaXNwbGF5UmVnaXN0ZXJzRnJvbSAoc3RhcnRFbGVtZW50Tm8pCisgICAgIGludCBzdGFydEVsZW1lbnRObzsKKyNlbmRpZgoreworICBpZiAoZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudCAhPSAoVHVpV2luQ29udGVudCkgTlVMTCAmJgorICAgICAgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudENvdW50ID4gMCkKKyAgICB7CisgICAgICByZWdpc3RlciBpbnQgaSA9IHN0YXJ0RWxlbWVudE5vOworICAgICAgaW50IGosIHZhbHVlQ2hhcnNXaWRlLCBjaGFyc1dpZGUsIGl0ZW1XaW5XaWR0aCwgY3VyWSwgbGFiZWxXaWR0aDsKKyAgICAgIGVudW0gcHJlY2lzaW9uX3R5cGUgcHJlY2lzaW9uOworCisgICAgICBwcmVjaXNpb24gPSAoZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzRGlzcGxheVR5cGUKKwkJICAgPT0gVFVJX0RGTE9BVF9SRUdTKSA/CisJZG91YmxlX3ByZWNpc2lvbiA6IHVuc3BlY2lmaWVkX3ByZWNpc2lvbjsKKyAgICAgIGlmIChJU182NEJJVCB8fAorCSAgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzRGlzcGxheVR5cGUgPT0gVFVJX0RGTE9BVF9SRUdTKQorCXsKKwkgIHZhbHVlQ2hhcnNXaWRlID0gRE9VQkxFX0ZMT0FUX1ZBTFVFX1dJRFRIOworCSAgbGFiZWxXaWR0aCA9IERPVUJMRV9GTE9BVF9MQUJFTF9XSURUSDsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0Rpc3BsYXlUeXBlID09CisJICAgICAgVFVJX1NGTE9BVF9SRUdTKQorCSAgICB7CisJICAgICAgdmFsdWVDaGFyc1dpZGUgPSBTSU5HTEVfRkxPQVRfVkFMVUVfV0lEVEg7CisJICAgICAgbGFiZWxXaWR0aCA9IFNJTkdMRV9GTE9BVF9MQUJFTF9XSURUSDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgdmFsdWVDaGFyc1dpZGUgPSBTSU5HTEVfVkFMVUVfV0lEVEg7CisJICAgICAgbGFiZWxXaWR0aCA9IFNJTkdMRV9MQUJFTF9XSURUSDsKKwkgICAgfQorCX0KKyAgICAgIGl0ZW1XaW5XaWR0aCA9IHZhbHVlQ2hhcnNXaWRlICsgbGFiZWxXaWR0aDsKKyAgICAgIC8qCisgICAgICAgICoqIE5vdyBjcmVhdGUgZWFjaCBkYXRhICJzdWIiIHdpbmRvdywgYW5kIHdyaXRlIHRoZSBkaXNwbGF5IGludG8gaXQuCisgICAgICAgICovCisgICAgICBjdXJZID0gMTsKKyAgICAgIHdoaWxlIChpIDwgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudENvdW50ICYmCisJICAgICBjdXJZIDw9IGRhdGFXaW4tPmdlbmVyaWMudmlld3BvcnRIZWlnaHQpCisJeworCSAgZm9yIChqID0gMDsKKwkgICAgICAgKGogPCBkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb2x1bW5Db3VudCAmJgorCQlpIDwgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudENvdW50KTsgaisrKQorCSAgICB7CisJICAgICAgVHVpR2VuV2luSW5mb1B0ciBkYXRhSXRlbVdpbjsKKwkgICAgICBUdWlEYXRhRWxlbWVudFB0ciBkYXRhRWxlbWVudFB0cjsKKworCSAgICAgIC8qIGNyZWF0ZSB0aGUgd2luZG93IGlmIG5lY2Vzc2FyeSovCisJICAgICAgZGF0YUl0ZW1XaW4gPSAmZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby4KKwkJcmVnc0NvbnRlbnRbaV0tPndoaWNoRWxlbWVudC5kYXRhV2luZG93OworCSAgICAgIGRhdGFFbGVtZW50UHRyID0gJigoVHVpV2luRWxlbWVudFB0cikKKwkJCQkgZGF0YUl0ZW1XaW4tPmNvbnRlbnRbMF0pLT53aGljaEVsZW1lbnQuZGF0YTsKKwkgICAgICBpZiAoZGF0YUl0ZW1XaW4tPmhhbmRsZSA9PSAoV0lORE9XICopIE5VTEwpCisJCXsKKwkJICBkYXRhSXRlbVdpbi0+aGVpZ2h0ID0gMTsKKwkJICBkYXRhSXRlbVdpbi0+d2lkdGggPSAocHJlY2lzaW9uID09IGRvdWJsZV9wcmVjaXNpb24pID8KKwkJICAgIGl0ZW1XaW5XaWR0aCArIDIgOiBpdGVtV2luV2lkdGggKyAxOworCQkgIGRhdGFJdGVtV2luLT5vcmlnaW4ueCA9IChpdGVtV2luV2lkdGggKiBqKSArIDE7CisJCSAgZGF0YUl0ZW1XaW4tPm9yaWdpbi55ID0gY3VyWTsKKwkJICBtYWtlV2luZG93IChkYXRhSXRlbVdpbiwgRE9OVF9CT1hfV0lORE9XKTsKKwkJfQorCSAgICAgIC8qCisgICAgICAgICAgICAgICAgKiogR2V0IHRoZSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgKiogYW5kIGRpc3BsYXkgaXQKKyAgICAgICAgICAgICAgICAqLworCSAgICAgIF90dWlEaXNwbGF5UmVnaXN0ZXIgKAorCQkJICAgIGRhdGFFbGVtZW50UHRyLT5pdGVtTm8sIGRhdGFJdGVtV2luLCBwcmVjaXNpb24pOworCSAgICAgIGkrKzsJCS8qIG5leHQgcmVnaXN0ZXIgKi8KKwkgICAgfQorCSAgY3VyWSsrOwkJLyogbmV4dCByb3c7ICovCisJfQorICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIHR1aURpc3BsYXlSZWdpc3RlcnNGcm9tICovCisKKworLyoKKyoqIHR1aURpc3BsYXlSZWdFbGVtZW50QXRMaW5lKCkuCisqKiAgICAgICAgRnVuY3Rpb24gdG8gZGlzcGxheSB0aGUgcmVnaXN0ZXJzIGluIHRoZSBjb250ZW50IGZyb20KKyoqICAgICAgICAnc3RhcnRFbGVtZW50Tm8nIG9uICdzdGFydExpbmVObycgdW50aWwgdGhlIGVuZCBvZiB0aGUKKyoqICAgICAgICByZWdpc3RlciBjb250ZW50IG9yIHRoZSBlbmQgb2YgdGhlIGRpc3BsYXkgaGVpZ2h0LgorKiogICAgICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoYXQgd2Ugd29uJ3QgZGlzcGxheSBvZmYgdGhlIGVuZAorKiogICAgICAgIG9mIHRoZSByZWdpc3RlciBkaXNwbGF5LgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpRGlzcGxheVJlZ0VsZW1lbnRBdExpbmUgKAorCQkJICAgICBpbnQgc3RhcnRFbGVtZW50Tm8sCisJCQkgICAgIGludCBzdGFydExpbmVObykKKyNlbHNlCit0dWlEaXNwbGF5UmVnRWxlbWVudEF0TGluZSAoc3RhcnRFbGVtZW50Tm8sIHN0YXJ0TGluZU5vKQorICAgICBpbnQgc3RhcnRFbGVtZW50Tm87CisgICAgIGludCBzdGFydExpbmVObzsKKyNlbmRpZgoreworICBpZiAoZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudCAhPSAoVHVpV2luQ29udGVudCkgTlVMTCAmJgorICAgICAgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudENvdW50ID4gMCkKKyAgICB7CisgICAgICByZWdpc3RlciBpbnQgZWxlbWVudE5vID0gc3RhcnRFbGVtZW50Tm87CisKKyAgICAgIGlmIChzdGFydEVsZW1lbnRObyAhPSAwICYmIHN0YXJ0TGluZU5vICE9IDApCisJeworCSAgcmVnaXN0ZXIgaW50IGxhc3RMaW5lTm8sIGZpcnN0TGluZU9uTGFzdFBhZ2U7CisKKwkgIGxhc3RMaW5lTm8gPSB0dWlMYXN0UmVnc0xpbmVObyAoKTsKKwkgIGZpcnN0TGluZU9uTGFzdFBhZ2UgPSBsYXN0TGluZU5vIC0gKGRhdGFXaW4tPmdlbmVyaWMuaGVpZ2h0IC0gMik7CisJICBpZiAoZmlyc3RMaW5lT25MYXN0UGFnZSA8IDApCisJICAgIGZpcnN0TGluZU9uTGFzdFBhZ2UgPSAwOworCSAgLyoKKyAgICAgICAgICAgICoqIElmIHRoZXJlIGlzIG5vIG90aGVyIGRhdGEgZGlzcGxheWVkIGV4Y2VwdCByZWdpc3RlcnMsCisgICAgICAgICAgICAqKiBhbmQgdGhlIGVsZW1lbnRObyBjYXVzZXMgdXMgdG8gc2Nyb2xsIHBhc3QgdGhlIGVuZCBvZiB0aGUKKyAgICAgICAgICAgICoqIHJlZ2lzdGVycywgYWRqdXN0IHdoYXQgZWxlbWVudCB0byByZWFsbHkgc3RhcnQgdGhlIGRpc3BsYXkgYXQuCisgICAgICAgICAgICAqLworCSAgaWYgKGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8uZGF0YUNvbnRlbnRDb3VudCA8PSAwICYmCisJICAgICAgc3RhcnRMaW5lTm8gPiBmaXJzdExpbmVPbkxhc3RQYWdlKQorCSAgICBlbGVtZW50Tm8gPSB0dWlGaXJzdFJlZ0VsZW1lbnROb0luTGluZSAoZmlyc3RMaW5lT25MYXN0UGFnZSk7CisJfQorICAgICAgdHVpRGlzcGxheVJlZ2lzdGVyc0Zyb20gKGVsZW1lbnRObyk7CisgICAgfQorCisgIHJldHVybjsKK30JCQkJLyogdHVpRGlzcGxheVJlZ0VsZW1lbnRBdExpbmUgKi8KKworCisKKy8qCisqKiB0dWlEaXNwbGF5UmVnaXN0ZXJzRnJvbUxpbmUoKS4KKyoqICAgICAgICBGdW5jdGlvbiB0byBkaXNwbGF5IHRoZSByZWdpc3RlcnMgc3RhcnRpbmcgYXQgbGluZSBsaW5lTm8gaW4KKyoqICAgICAgICB0aGUgZGF0YSB3aW5kb3cuICBBbnN3ZXJzIHRoZSBsaW5lIG51bWJlciB0aGF0IHRoZSBkaXNwbGF5CisqKiAgICAgICAgYWN0dWFsbHkgc3RhcnRlZCBmcm9tLiAgSWYgbm90aGluZyBpcyBkaXNwbGF5ZWQgKC0xKSBpcyByZXR1cm5lZC4KKyovCitpbnQKKyNpZmRlZiBfX1NURENfXwordHVpRGlzcGxheVJlZ2lzdGVyc0Zyb21MaW5lICgKKwkJCSAgICAgIGludCBsaW5lTm8sCisJCQkgICAgICBpbnQgZm9yY2VEaXNwbGF5KQorI2Vsc2UKK3R1aURpc3BsYXlSZWdpc3RlcnNGcm9tTGluZSAobGluZU5vLCBmb3JjZURpc3BsYXkpCisgICAgIGludCBsaW5lTm87CisgICAgIGludCBmb3JjZURpc3BsYXk7CisjZW5kaWYKK3sKKyAgaW50IGVsZW1lbnRObzsKKworICBpZiAoZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudENvdW50ID4gMCkKKyAgICB7CisgICAgICBpbnQgbGluZSwgZWxlbWVudE5vOworCisgICAgICBpZiAobGluZU5vIDwgMCkKKwlsaW5lID0gMDsKKyAgICAgIGVsc2UgaWYgKGZvcmNlRGlzcGxheSkKKwl7CQkJLyoKKyAgICAgICAgICAgICoqIElmIHdlIG11c3QgZGlzcGxheSByZWdzIChmb3JjZURpc3BsYXkgaXMgdHJ1ZSksIHRoZW4gbWFrZQorICAgICAgICAgICAgKiogc3VyZSB0aGF0IHdlIGRvbid0IGRpc3BsYXkgb2ZmIHRoZSBlbmQgb2YgdGhlIHJlZ2lzdGVycy4KKyAgICAgICAgICAgICovCisJICBpZiAobGluZU5vID49IHR1aUxhc3RSZWdzTGluZU5vICgpKQorCSAgICB7CisJICAgICAgaWYgKChsaW5lID0gdHVpTGluZUZyb21SZWdFbGVtZW50Tm8gKAorCQkgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudENvdW50IC0gMSkpIDwgMCkKKwkJbGluZSA9IDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgbGluZSA9IGxpbmVObzsKKwl9CisgICAgICBlbHNlCisJbGluZSA9IGxpbmVObzsKKworICAgICAgZWxlbWVudE5vID0gdHVpRmlyc3RSZWdFbGVtZW50Tm9JbkxpbmUgKGxpbmUpOworICAgICAgaWYgKGVsZW1lbnRObyA8IGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0NvbnRlbnRDb3VudCkKKwl0dWlEaXNwbGF5UmVnRWxlbWVudEF0TGluZSAoZWxlbWVudE5vLCBsaW5lKTsKKyAgICAgIGVsc2UKKwlsaW5lID0gKC0xKTsKKworICAgICAgcmV0dXJuIGxpbmU7CisgICAgfQorCisgIHJldHVybiAoLTEpOwkJCS8qIG5vdGhpbmcgd2FzIGRpc3BsYXllZCAqLworfQkJCQkvKiB0dWlEaXNwbGF5UmVnaXN0ZXJzRnJvbUxpbmUgKi8KKworCisvKgorKiogdHVpQ2hlY2tSZWdpc3RlclZhbHVlcygpCisqKiAgICAgICAgVGhpcyBmdW5jdGlvbiBjaGVjayBhbGwgZGlzcGxheWVkIHJlZ2lzdGVycyBmb3IgY2hhbmdlcyBpbgorKiogICAgICAgIHZhbHVlcywgZ2l2ZW4gYSBwYXJ0aWN1bGFyIGZyYW1lLiAgSWYgdGhlIHZhbHVlcyBoYXZlIGNoYW5nZWQsCisqKiAgICAgICAgdGhleSBhcmUgdXBkYXRlZCB3aXRoIHRoZSBuZXcgdmFsdWUgYW5kIGhpZ2hsaWdodGVkLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpQ2hlY2tSZWdpc3RlclZhbHVlcyAoCisJCQkgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lKQorI2Vsc2UKK3R1aUNoZWNrUmVnaXN0ZXJWYWx1ZXMgKGZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7CisjZW5kaWYKK3sKKyAgaWYgKG1fd2luUHRyTm90TnVsbCAoZGF0YVdpbikgJiYgZGF0YVdpbi0+Z2VuZXJpYy5pc1Zpc2libGUpCisgICAgeworICAgICAgaWYgKGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0NvbnRlbnRDb3VudCA8PSAwICYmCisJICBkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLmRpc3BsYXlSZWdzKQorCXR1aVNob3dSZWdpc3RlcnMgKCh0dWlMYXlvdXREZWYgKCkpLT5yZWdzRGlzcGxheVR5cGUpOworICAgICAgZWxzZQorCXsKKwkgIGludCBpLCBqOworCSAgY2hhciByYXdCdWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKworCSAgZm9yIChpID0gMDsKKwkgICAgICAgKGkgPCBkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb250ZW50Q291bnQpOyBpKyspCisJICAgIHsKKwkgICAgICBUdWlEYXRhRWxlbWVudFB0ciBkYXRhRWxlbWVudFB0cjsKKwkgICAgICBUdWlHZW5XaW5JbmZvUHRyIGRhdGFJdGVtV2luUHRyOworCSAgICAgIGludCB3YXNIaWxpZ2h0ZWQ7CisKKwkgICAgICBkYXRhSXRlbVdpblB0ciA9ICZkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLgorCQlyZWdzQ29udGVudFtpXS0+d2hpY2hFbGVtZW50LmRhdGFXaW5kb3c7CisJICAgICAgZGF0YUVsZW1lbnRQdHIgPSAmKChUdWlXaW5FbGVtZW50UHRyKQorCQkJICAgICBkYXRhSXRlbVdpblB0ci0+Y29udGVudFswXSktPndoaWNoRWxlbWVudC5kYXRhOworCSAgICAgIHdhc0hpbGlnaHRlZCA9IGRhdGFFbGVtZW50UHRyLT5oaWdobGlnaHQ7CisJICAgICAgZGF0YUVsZW1lbnRQdHItPmhpZ2hsaWdodCA9CisJCV90dWlSZWdWYWx1ZUhhc0NoYW5nZWQgKGRhdGFFbGVtZW50UHRyLCBmcmFtZSwgJnJhd0J1ZlswXSk7CisJICAgICAgaWYgKGRhdGFFbGVtZW50UHRyLT5oaWdobGlnaHQpCisJCXsKKwkJICBmb3IgKGogPSAwOyBqIDwgTUFYX1JFR0lTVEVSX1JBV19TSVpFOyBqKyspCisJCSAgICAoKGNoYXIgKikgZGF0YUVsZW1lbnRQdHItPnZhbHVlKVtqXSA9IHJhd0J1ZltqXTsKKwkJICBfdHVpRGlzcGxheVJlZ2lzdGVyICgKKwkJCQkJZGF0YUVsZW1lbnRQdHItPml0ZW1ObywKKwkJCQkJZGF0YUl0ZW1XaW5QdHIsCisJCQkoKGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0Rpc3BsYXlUeXBlID09CisJCQkgIFRVSV9ERkxPQVRfUkVHUykgPworCQkJIGRvdWJsZV9wcmVjaXNpb24gOiB1bnNwZWNpZmllZF9wcmVjaXNpb24pKTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKHdhc0hpbGlnaHRlZCkKKwkJeworCQkgIGRhdGFFbGVtZW50UHRyLT5oaWdobGlnaHQgPSBGQUxTRTsKKwkJICBfdHVpRGlzcGxheVJlZ2lzdGVyICgKKwkJCQkJZGF0YUVsZW1lbnRQdHItPml0ZW1ObywKKwkJCQkJZGF0YUl0ZW1XaW5QdHIsCisJCQkoKGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0Rpc3BsYXlUeXBlID09CisJCQkgIFRVSV9ERkxPQVRfUkVHUykgPworCQkJIGRvdWJsZV9wcmVjaXNpb24gOiB1bnNwZWNpZmllZF9wcmVjaXNpb24pKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgcmV0dXJuOworfQkJCQkvKiB0dWlDaGVja1JlZ2lzdGVyVmFsdWVzICovCisKKworLyoKKyoqIHR1aVRvZ2dsZUZsb2F0UmVncygpLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpVG9nZ2xlRmxvYXRSZWdzICh2b2lkKQorI2Vsc2UKK3R1aVRvZ2dsZUZsb2F0UmVncyAoKQorI2VuZGlmCit7CisgIFR1aUxheW91dERlZlB0ciBsYXlvdXREZWYgPSB0dWlMYXlvdXREZWYgKCk7CisKKyAgaWYgKGxheW91dERlZi0+ZmxvYXRSZWdzRGlzcGxheVR5cGUgPT0gVFVJX1NGTE9BVF9SRUdTKQorICAgIGxheW91dERlZi0+ZmxvYXRSZWdzRGlzcGxheVR5cGUgPSBUVUlfREZMT0FUX1JFR1M7CisgIGVsc2UKKyAgICBsYXlvdXREZWYtPmZsb2F0UmVnc0Rpc3BsYXlUeXBlID0gVFVJX1NGTE9BVF9SRUdTOworCisgIGlmIChtX3dpblB0ck5vdE51bGwgKGRhdGFXaW4pICYmIGRhdGFXaW4tPmdlbmVyaWMuaXNWaXNpYmxlICYmCisgICAgICAoZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzRGlzcGxheVR5cGUgPT0gVFVJX1NGTE9BVF9SRUdTIHx8CisgICAgICAgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzRGlzcGxheVR5cGUgPT0gVFVJX0RGTE9BVF9SRUdTKSkKKyAgICB0dWlTaG93UmVnaXN0ZXJzIChsYXlvdXREZWYtPmZsb2F0UmVnc0Rpc3BsYXlUeXBlKTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aVRvZ2dsZUZsb2F0UmVncyAqLworCisKK3ZvaWQKK19pbml0aWFsaXplX3R1aVJlZ3MgKCkKK3sKKyAgaWYgKHR1aV92ZXJzaW9uICYmIHhkYl9jb21tYW5kcykKKyAgICB7CisgICAgICBhZGRfY29tICgiZnIiLCBjbGFzc190dWksIF90dWlTaG93RmxvYXRfY29tbWFuZCwKKwkgICAgICAgIkRpc3BsYXkgb25seSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnNcbiIpOworICAgICAgYWRkX2NvbSAoImdyIiwgY2xhc3NfdHVpLCBfdHVpU2hvd0dlbmVyYWxfY29tbWFuZCwKKwkgICAgICAgIkRpc3BsYXkgb25seSBnZW5lcmFsIHJlZ2lzdGVyc1xuIik7CisgICAgICBhZGRfY29tICgic3IiLCBjbGFzc190dWksIF90dWlTaG93U3BlY2lhbF9jb21tYW5kLAorCSAgICAgICAiRGlzcGxheSBvbmx5IHNwZWNpYWwgcmVnaXN0ZXJzXG4iKTsKKyAgICAgIGFkZF9jb20gKCIrciIsIGNsYXNzX3R1aSwgX3R1aVNjcm9sbFJlZ3NGb3J3YXJkX2NvbW1hbmQsCisJICAgICAgICJTY3JvbGwgdGhlIHJlZ2lzdGVycyB3aW5kb3cgZm9yd2FyZFxuIik7CisgICAgICBhZGRfY29tICgiLXIiLCBjbGFzc190dWksIF90dWlTY3JvbGxSZWdzQmFja3dhcmRfY29tbWFuZCwKKwkgICAgICAgIlNjcm9sbCB0aGUgcmVnaXN0ZXIgd2luZG93IGJhY2t3YXJkXG4iKTsKKyAgICAgIGFkZF9jb20gKCJ0ZiIsIGNsYXNzX3R1aSwgX3R1aVRvZ2dsZUZsb2F0UmVnc19jb21tYW5kLAorCSAgICAgICAiVG9nZ2xlIGJldHdlZW4gc2luZ2xlIGFuZCBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycy5cbiIpOworICAgICAgYWRkX2NtZCAoVFVJX0ZMT0FUX1JFR1NfTkFNRV9MT1dFUiwKKwkgICAgICAgY2xhc3NfdHVpLAorCSAgICAgICBfdHVpVG9nZ2xlRmxvYXRSZWdzX2NvbW1hbmQsCisJICAgICAgICJUb2dnbGUgYmV0d2VlbiBzaW5nbGUgYW5kIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgXAorcmVnaXN0ZXJzLlxuIiwKKwkgICAgICAgJnRvZ2dsZWxpc3QpOworICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIF9pbml0aWFsaXplX3R1aVJlZ3MgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFNUQVRJQyBMT0NBTCBGVU5DVElPTlMgICAgICAgICAgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKyoqIF90dWlSZWdpc3Rlck5hbWUoKS4KKyoqICAgICAgICBSZXR1cm4gdGhlIHJlZ2lzdGVyIG5hbWUuCisqLworc3RhdGljIGNoYXIgKgorI2lmZGVmIF9fU1REQ19fCitfdHVpUmVnaXN0ZXJOYW1lICgKKwkJICAgaW50IHJlZ051bSkKKyNlbHNlCitfdHVpUmVnaXN0ZXJOYW1lIChyZWdOdW0pCisgICAgIGludCByZWdOdW07CisjZW5kaWYKK3sKKyAgaWYgKHJlZ19uYW1lc1tyZWdOdW1dICE9IChjaGFyICopIE5VTEwgJiYgKihyZWdfbmFtZXNbcmVnTnVtXSkgIT0gKGNoYXIpIDApCisgICAgcmV0dXJuIHJlZ19uYW1lc1tyZWdOdW1dOworICBlbHNlCisgICAgcmV0dXJuICgoY2hhciAqKSBOVUxMKTsKK30JCQkJLyogdHVpR2V0UmVnaXN0ZXJOYW1lICovCisKKworLyoKKyoqIF90dWlSZWdpc3RlckZvcm1hdAorKiogICAgICAgIEZ1bmN0aW9uIHRvIGZvcm1hdCB0aGUgcmVnaXN0ZXIgbmFtZSBhbmQgdmFsdWUgaW50byBhIGJ1ZmZlciwKKyoqICAgICAgICBzdWl0YWJsZSBmb3IgcHJpbnRpbmcgb3IgZGlzcGxheQorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK190dWlSZWdpc3RlckZvcm1hdCAoCisJCSAgICAgY2hhciAqYnVmLAorCQkgICAgIGludCBidWZMZW4sCisJCSAgICAgaW50IHJlZ051bSwKKwkJICAgICBUdWlEYXRhRWxlbWVudFB0ciBkYXRhRWxlbWVudCwKKwkJICAgICBlbnVtIHByZWNpc2lvbl90eXBlIHByZWNpc2lvbikKKyNlbHNlCitfdHVpUmVnaXN0ZXJGb3JtYXQgKGJ1ZiwgYnVmTGVuLCByZWdOdW0sIGRhdGFFbGVtZW50LCBwcmVjaXNpb24pCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgaW50IGJ1ZkxlbjsKKyAgICAgaW50IHJlZ051bTsKKyAgICAgVHVpRGF0YUVsZW1lbnRQdHIgZGF0YUVsZW1lbnQ7CisgICAgIGVudW0gcHJlY2lzaW9uX3R5cGUgcHJlY2lzaW9uOworI2VuZGlmCit7CisgIGNoYXIgdG1wQnVmWzE1XTsKKyAgY2hhciAqZm10OworICBHREJfRklMRSAqc3RyZWFtOworCisgIHN0cmVhbSA9IGdkYl9maWxlX2luaXRfYXN0cmluZyhidWZMZW4pOworICBwYV9kb19zdHJjYXRfcmVnaXN0ZXJzX2luZm8gKHJlZ051bSwgMCwgc3RyZWFtLCBwcmVjaXNpb24pOworICBzdHJjcHkgKGJ1ZiwgZ2RiX2ZpbGVfZ2V0X3N0cmJ1ZihzdHJlYW0pKTsKKyAgZ2RiX2ZpbGVfZGVhbGxvY2F0ZSgmc3RyZWFtKTsKKworICByZXR1cm47Cit9CQkJCS8qIF90dWlSZWdpc3RlckZvcm1hdCAqLworCisKKyNkZWZpbmUgTlVNX0dFTkVSQUxfUkVHUyAgICAzMgorLyoKKyoqIF90dWlTZXRHZW5lcmFsUmVnc0NvbnRlbnQoKS4KKyoqICAgICAgU2V0IHRoZSBjb250ZW50IG9mIHRoZSBkYXRhIHdpbmRvdyB0byBjb25zaXN0IG9mIHRoZSBnZW5lcmFsIHJlZ2lzdGVycy4KKyovCitzdGF0aWMgVHVpU3RhdHVzCisjaWZkZWYgX19TVERDX18KK190dWlTZXRHZW5lcmFsUmVnc0NvbnRlbnQgKAorCQkJICAgIGludCByZWZyZXNoVmFsdWVzT25seSkKKyNlbHNlCitfdHVpU2V0R2VuZXJhbFJlZ3NDb250ZW50IChyZWZyZXNoVmFsdWVzT25seSkKKyAgICAgaW50IHJlZnJlc2hWYWx1ZXNPbmx5OworI2VuZGlmCit7CisgIHJldHVybiAoX3R1aVNldFJlZ3NDb250ZW50ICgwLAorCQkJICAgICAgTlVNX0dFTkVSQUxfUkVHUyAtIDEsCisJCQkgICAgICBzZWxlY3RlZF9mcmFtZSwKKwkJCSAgICAgIFRVSV9HRU5FUkFMX1JFR1MsCisJCQkgICAgICByZWZyZXNoVmFsdWVzT25seSkpOworCit9CQkJCS8qIF90dWlTZXRHZW5lcmFsUmVnc0NvbnRlbnQgKi8KKworCisjZGVmaW5lIFNUQVJUX1NQRUNJQUxfUkVHUyAgICBQQ09RX0hFQURfUkVHTlVNCisvKgorKiogX3R1aVNldFNwZWNpYWxSZWdzQ29udGVudCgpLgorKiogICAgICBTZXQgdGhlIGNvbnRlbnQgb2YgdGhlIGRhdGEgd2luZG93IHRvIGNvbnNpc3Qgb2YgdGhlIHNwZWNpYWwgcmVnaXN0ZXJzLgorKi8KK3N0YXRpYyBUdWlTdGF0dXMKKyNpZmRlZiBfX1NURENfXworX3R1aVNldFNwZWNpYWxSZWdzQ29udGVudCAoCisJCQkgICAgaW50IHJlZnJlc2hWYWx1ZXNPbmx5KQorI2Vsc2UKK190dWlTZXRTcGVjaWFsUmVnc0NvbnRlbnQgKHJlZnJlc2hWYWx1ZXNPbmx5KQorICAgICBpbnQgcmVmcmVzaFZhbHVlc09ubHk7CisjZW5kaWYKK3sKKyAgVHVpU3RhdHVzIHJldCA9IFRVSV9GQUlMVVJFOworICBpbnQgaSwgZW5kUmVnTnVtOworCisgIGVuZFJlZ051bSA9IEZQMF9SRUdOVU0gLSAxOworI2lmIDAKKyAgZW5kUmVnTnVtID0gKC0xKTsKKyAgZm9yIChpID0gU1RBUlRfU1BFQ0lBTF9SRUdTOyAoaSA8IEFSQ0hfTlVNX1JFR1MgJiYgZW5kUmVnTnVtIDwgMCk7IGkrKykKKyAgICBpZiAoVFlQRV9DT0RFIChSRUdJU1RFUl9WSVJUVUFMX1RZUEUgKGkpKSA9PSBUWVBFX0NPREVfRkxUKQorICAgICAgZW5kUmVnTnVtID0gaSAtIDE7CisjZW5kaWYKKyAgcmV0ID0gX3R1aVNldFJlZ3NDb250ZW50IChTVEFSVF9TUEVDSUFMX1JFR1MsCisJCQkgICAgZW5kUmVnTnVtLAorCQkJICAgIHNlbGVjdGVkX2ZyYW1lLAorCQkJICAgIFRVSV9TUEVDSUFMX1JFR1MsCisJCQkgICAgcmVmcmVzaFZhbHVlc09ubHkpOworCisgIHJldHVybiByZXQ7Cit9CQkJCS8qIF90dWlTZXRTcGVjaWFsUmVnc0NvbnRlbnQgKi8KKworCisvKgorKiogX3R1aVNldEdlbmVyYWxBbmRTcGVjaWFsUmVnc0NvbnRlbnQoKS4KKyoqICAgICAgU2V0IHRoZSBjb250ZW50IG9mIHRoZSBkYXRhIHdpbmRvdyB0byBjb25zaXN0IG9mIHRoZSBzcGVjaWFsIHJlZ2lzdGVycy4KKyovCitzdGF0aWMgVHVpU3RhdHVzCisjaWZkZWYgX19TVERDX18KK190dWlTZXRHZW5lcmFsQW5kU3BlY2lhbFJlZ3NDb250ZW50ICgKKwkJCQkgICAgICBpbnQgcmVmcmVzaFZhbHVlc09ubHkpCisjZWxzZQorX3R1aVNldEdlbmVyYWxBbmRTcGVjaWFsUmVnc0NvbnRlbnQgKHJlZnJlc2hWYWx1ZXNPbmx5KQorICAgICBpbnQgcmVmcmVzaFZhbHVlc09ubHk7CisjZW5kaWYKK3sKKyAgVHVpU3RhdHVzIHJldCA9IFRVSV9GQUlMVVJFOworICBpbnQgaSwgZW5kUmVnTnVtID0gKC0xKTsKKworICBlbmRSZWdOdW0gPSBGUDBfUkVHTlVNIC0gMTsKKyNpZiAwCisgIGVuZFJlZ051bSA9ICgtMSk7CisgIGZvciAoaSA9IDA7IChpIDwgQVJDSF9OVU1fUkVHUyAmJiBlbmRSZWdOdW0gPCAwKTsgaSsrKQorICAgIGlmIChUWVBFX0NPREUgKFJFR0lTVEVSX1ZJUlRVQUxfVFlQRSAoaSkpID09IFRZUEVfQ09ERV9GTFQpCisgICAgICBlbmRSZWdOdW0gPSBpIC0gMTsKKyNlbmRpZgorICByZXQgPSBfdHVpU2V0UmVnc0NvbnRlbnQgKAorCSAwLCBlbmRSZWdOdW0sIHNlbGVjdGVkX2ZyYW1lLCBUVUlfU1BFQ0lBTF9SRUdTLCByZWZyZXNoVmFsdWVzT25seSk7CisKKyAgcmV0dXJuIHJldDsKK30JCQkJLyogX3R1aVNldEdlbmVyYWxBbmRTcGVjaWFsUmVnc0NvbnRlbnQgKi8KKworLyoKKyoqIF90dWlTZXRGbG9hdFJlZ3NDb250ZW50KCkuCisqKiAgICAgICAgU2V0IHRoZSBjb250ZW50IG9mIHRoZSBkYXRhIHdpbmRvdyB0byBjb25zaXN0IG9mIHRoZSBmbG9hdCByZWdpc3RlcnMuCisqLworc3RhdGljIFR1aVN0YXR1cworI2lmZGVmIF9fU1REQ19fCitfdHVpU2V0RmxvYXRSZWdzQ29udGVudCAoCisJCQkgIFR1aVJlZ2lzdGVyRGlzcGxheVR5cGUgZHB5VHlwZSwKKwkJCSAgaW50IHJlZnJlc2hWYWx1ZXNPbmx5KQorI2Vsc2UKK190dWlTZXRGbG9hdFJlZ3NDb250ZW50IChkcHlUeXBlLCByZWZyZXNoVmFsdWVzT25seSkKKyAgICAgVHVpUmVnaXN0ZXJEaXNwbGF5VHlwZSBkcHlUeXBlOworICAgICBpbnQgcmVmcmVzaFZhbHVlc09ubHk7CisjZW5kaWYKK3sKKyAgVHVpU3RhdHVzIHJldCA9IFRVSV9GQUlMVVJFOworICBpbnQgaSwgc3RhcnRSZWdOdW07CisKKyAgc3RhcnRSZWdOdW0gPSBGUDBfUkVHTlVNOworI2lmIDAKKyAgc3RhcnRSZWdOdW0gPSAoLTEpOworICBmb3IgKGkgPSBBUkNIX05VTV9SRUdTIC0gMTsgKGkgPj0gMCAmJiBzdGFydFJlZ051bSA8IDApOyBpLS0pCisgICAgaWYgKFRZUEVfQ09ERSAoUkVHSVNURVJfVklSVFVBTF9UWVBFIChpKSkgIT0gVFlQRV9DT0RFX0ZMVCkKKyAgICAgIHN0YXJ0UmVnTnVtID0gaSArIDE7CisjZW5kaWYKKyAgcmV0ID0gX3R1aVNldFJlZ3NDb250ZW50IChzdGFydFJlZ051bSwKKwkJCSAgICBBUkNIX05VTV9SRUdTIC0gMSwKKwkJCSAgICBzZWxlY3RlZF9mcmFtZSwKKwkJCSAgICBkcHlUeXBlLAorCQkJICAgIHJlZnJlc2hWYWx1ZXNPbmx5KTsKKworICByZXR1cm4gcmV0OworfQkJCQkvKiBfdHVpU2V0RmxvYXRSZWdzQ29udGVudCAqLworCisKKy8qCisqKiBfdHVpUmVnVmFsdWVIYXNDaGFuZ2VkKCkuCisqKiAgICAgICAgQW5zd2VyIFRSVUUgaWYgdGhlIHJlZ2lzdGVyJ3MgdmFsdWUgaGFzIGNoYW5nZWQsIEZBTFNFIG90aGVyd2lzZS4KKyoqICAgICAgICBJZiBUUlVFLCBuZXdWYWx1ZSBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgbmV3IHZhbHVlLgorKi8KK3N0YXRpYyBpbnQKKyNpZmRlZiBfX1NURENfXworX3R1aVJlZ1ZhbHVlSGFzQ2hhbmdlZCAoCisJCQkgVHVpRGF0YUVsZW1lbnRQdHIgZGF0YUVsZW1lbnQsCisJCQkgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lLAorCQkJIGNoYXIgKm5ld1ZhbHVlKQorI2Vsc2UKK190dWlSZWdWYWx1ZUhhc0NoYW5nZWQgKGRhdGFFbGVtZW50LCBmcmFtZSwgbmV3VmFsdWUpCisgICAgIFR1aURhdGFFbGVtZW50UHRyIGRhdGFFbGVtZW50OworICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7CisgICAgIGNoYXIgKm5ld1ZhbHVlOworI2VuZGlmCit7CisgIGludCBoYXNDaGFuZ2VkID0gRkFMU0U7CisKKyAgaWYgKGRhdGFFbGVtZW50LT5pdGVtTm8gIT0gVU5ERUZJTkVEX0lURU0gJiYKKyAgICAgIF90dWlSZWdpc3Rlck5hbWUgKGRhdGFFbGVtZW50LT5pdGVtTm8pICE9IChjaGFyICopIE5VTEwpCisgICAgeworICAgICAgY2hhciByYXdCdWZbTUFYX1JFR0lTVEVSX1JBV19TSVpFXTsKKyAgICAgIGludCBpOworCisgICAgICBpZiAoX3R1aUdldFJlZ2lzdGVyUmF3VmFsdWUgKAorCQkJIGRhdGFFbGVtZW50LT5pdGVtTm8sIHJhd0J1ZiwgZnJhbWUpID09IFRVSV9TVUNDRVNTKQorCXsKKwkgIGZvciAoaSA9IDA7IChpIDwgTUFYX1JFR0lTVEVSX1JBV19TSVpFICYmICFoYXNDaGFuZ2VkKTsgaSsrKQorCSAgICBoYXNDaGFuZ2VkID0gKCgoY2hhciAqKSBkYXRhRWxlbWVudC0+dmFsdWUpW2ldICE9IHJhd0J1ZltpXSk7CisJICBpZiAoaGFzQ2hhbmdlZCAmJiBuZXdWYWx1ZSAhPSAoY2hhciAqKSBOVUxMKQorCSAgICB7CisJICAgICAgZm9yIChpID0gMDsgKGkgPCBNQVhfUkVHSVNURVJfUkFXX1NJWkUpOyBpKyspCisJCW5ld1ZhbHVlW2ldID0gcmF3QnVmW2ldOworCSAgICB9CisJfQorICAgIH0KKyAgcmV0dXJuIGhhc0NoYW5nZWQ7Cit9CQkJCS8qIF90dWlSZWdWYWx1ZUhhc0NoYW5nZWQgKi8KKworCisKKy8qCisqKiBfdHVpR2V0UmVnaXN0ZXJSYXdWYWx1ZSgpLgorKiogICAgICAgIEdldCB0aGUgcmVnaXN0ZXIgcmF3IHZhbHVlLiAgVGhlIHJhdyB2YWx1ZSBpcyByZXR1cm5lZCBpbiByZWdWYWx1ZS4KKyovCitzdGF0aWMgVHVpU3RhdHVzCisjaWZkZWYgX19TVERDX18KK190dWlHZXRSZWdpc3RlclJhd1ZhbHVlICgKKwkJCSAgaW50IHJlZ051bSwKKwkJCSAgY2hhciAqcmVnVmFsdWUsCisJCQkgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZSkKKyNlbHNlCitfdHVpR2V0UmVnaXN0ZXJSYXdWYWx1ZSAocmVnTnVtLCByZWdWYWx1ZSwgZnJhbWUpCisgICAgIGludCByZWdOdW07CisgICAgIGNoYXIgKnJlZ1ZhbHVlOworICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7CisjZW5kaWYKK3sKKyAgVHVpU3RhdHVzIHJldCA9IFRVSV9GQUlMVVJFOworCisgIGlmICh0YXJnZXRfaGFzX3JlZ2lzdGVycykKKyAgICB7CisgICAgICByZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlc19mb3JfZnJhbWUgKHJlZ051bSwgcmVnVmFsdWUsIGZyYW1lKTsKKyAgICAgIHJldCA9IFRVSV9TVUNDRVNTOworICAgIH0KKworICByZXR1cm4gcmV0OworfQkJCQkvKiBfdHVpR2V0UmVnaXN0ZXJSYXdWYWx1ZSAqLworCisKKworLyoKKyoqIF90dWlTZXRSZWdpc3RlckVsZW1lbnQoKS4KKyoqICAgICAgIEZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYSBkYXRhIGVsZW1lbnQgd2l0aCB0aGUgaW5wdXQgYW5kCisqKiAgICAgICB0aGUgcmVnaXN0ZXIgdmFsdWUuCisqLworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aVNldFJlZ2lzdGVyRWxlbWVudCAoCisJCQkgaW50IHJlZ051bSwKKwkJCSBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWUsCisJCQkgVHVpRGF0YUVsZW1lbnRQdHIgZGF0YUVsZW1lbnQsCisJCQkgaW50IHJlZnJlc2hWYWx1ZU9ubHkpCisjZWxzZQorX3R1aVNldFJlZ2lzdGVyRWxlbWVudCAocmVnTnVtLCBmcmFtZSwgZGF0YUVsZW1lbnQsIHJlZnJlc2hWYWx1ZU9ubHkpCisgICAgIGludCByZWdOdW07CisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKKyAgICAgVHVpRGF0YUVsZW1lbnRQdHIgZGF0YUVsZW1lbnQ7CisgICAgIGludCByZWZyZXNoVmFsdWVPbmx5OworI2VuZGlmCit7CisgIGlmIChkYXRhRWxlbWVudCAhPSAoVHVpRGF0YUVsZW1lbnRQdHIpIE5VTEwpCisgICAgeworICAgICAgaWYgKCFyZWZyZXNoVmFsdWVPbmx5KQorCXsKKwkgIGRhdGFFbGVtZW50LT5pdGVtTm8gPSByZWdOdW07CisJICBkYXRhRWxlbWVudC0+bmFtZSA9IF90dWlSZWdpc3Rlck5hbWUgKHJlZ051bSk7CisJICBkYXRhRWxlbWVudC0+aGlnaGxpZ2h0ID0gRkFMU0U7CisJfQorICAgICAgaWYgKGRhdGFFbGVtZW50LT52YWx1ZSA9PSAoT3BhcXVlKSBOVUxMKQorCWRhdGFFbGVtZW50LT52YWx1ZSA9IChPcGFxdWUpIHhtYWxsb2MgKE1BWF9SRUdJU1RFUl9SQVdfU0laRSk7CisgICAgICBpZiAoZGF0YUVsZW1lbnQtPnZhbHVlICE9IChPcGFxdWUpIE5VTEwpCisJX3R1aUdldFJlZ2lzdGVyUmF3VmFsdWUgKHJlZ051bSwgZGF0YUVsZW1lbnQtPnZhbHVlLCBmcmFtZSk7CisgICAgfQorCisgIHJldHVybjsKK30JCQkJLyogX3R1aVNldFJlZ2lzdGVyRWxlbWVudCAqLworCisKKy8qCisqKiBfdHVpU2V0UmVnc0NvbnRlbnQoKS4KKyoqICAgICAgICBTZXQgdGhlIGNvbnRlbnQgb2YgdGhlIGRhdGEgd2luZG93IHRvIGNvbnNpc3Qgb2YgdGhlIHJlZ2lzdGVycworKiogICAgICAgIG51bWJlcmVkIGZyb20gc3RhcnRSZWdOdW0gdG8gZW5kUmVnTnVtLiAgTm90ZSB0aGF0IGlmCisqKiAgICAgICAgcmVmcmVzaFZhbHVlc09ubHkgaXMgVFJVRSwgc3RhcnRSZWdOdW0gYW5kIGVuZFJlZ051bSBhcmUgaWdub3JlZC4KKyovCitzdGF0aWMgVHVpU3RhdHVzCisjaWZkZWYgX19TVERDX18KK190dWlTZXRSZWdzQ29udGVudCAoCisJCSAgICAgaW50IHN0YXJ0UmVnTnVtLAorCQkgICAgIGludCBlbmRSZWdOdW0sCisJCSAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lLAorCQkgICAgIFR1aVJlZ2lzdGVyRGlzcGxheVR5cGUgZHB5VHlwZSwKKwkJICAgICBpbnQgcmVmcmVzaFZhbHVlc09ubHkpCisjZWxzZQorX3R1aVNldFJlZ3NDb250ZW50IChzdGFydFJlZ051bSwgZW5kUmVnTnVtLCBmcmFtZSwgZHB5VHlwZSwgcmVmcmVzaFZhbHVlc09ubHkpCisgICAgIGludCBzdGFydFJlZ051bTsKKyAgICAgaW50IGVuZFJlZ051bTsKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworICAgICBUdWlSZWdpc3RlckRpc3BsYXlUeXBlIGRweVR5cGU7CisgICAgIGludCByZWZyZXNoVmFsdWVzT25seTsKKyNlbmRpZgoreworICBUdWlTdGF0dXMgcmV0ID0gVFVJX0ZBSUxVUkU7CisgIGludCBudW1SZWdzID0gZW5kUmVnTnVtIC0gc3RhcnRSZWdOdW0gKyAxOworICBpbnQgYWxsb2NhdGVkSGVyZSA9IEZBTFNFOworCisgIGlmIChkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb250ZW50Q291bnQgPiAwICYmCisgICAgICAhcmVmcmVzaFZhbHVlc09ubHkpCisgICAgeworICAgICAgZnJlZURhdGFDb250ZW50IChkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb250ZW50LAorCQkgICAgICAgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudENvdW50KTsKKyAgICAgIGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0NvbnRlbnRDb3VudCA9IDA7CisgICAgfQorICBpZiAoZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudENvdW50IDw9IDApCisgICAgeworICAgICAgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudCA9CisJYWxsb2NDb250ZW50IChudW1SZWdzLCBEQVRBX1dJTik7CisgICAgICBhbGxvY2F0ZWRIZXJlID0gVFJVRTsKKyAgICB9CisKKyAgaWYgKGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0NvbnRlbnQgIT0gKFR1aVdpbkNvbnRlbnQpIE5VTEwpCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGlmICghcmVmcmVzaFZhbHVlc09ubHkgfHwgYWxsb2NhdGVkSGVyZSkKKwl7CisJICBkYXRhV2luLT5nZW5lcmljLmNvbnRlbnQgPSAoT3BhcXVlUHRyKSBOVUxMOworCSAgZGF0YVdpbi0+Z2VuZXJpYy5jb250ZW50U2l6ZSA9IDA7CisJICBhZGRDb250ZW50RWxlbWVudHMgKCZkYXRhV2luLT5nZW5lcmljLCBudW1SZWdzKTsKKwkgIGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0NvbnRlbnQgPQorCSAgICAoVHVpV2luQ29udGVudCkgZGF0YVdpbi0+Z2VuZXJpYy5jb250ZW50OworCSAgZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudENvdW50ID0gbnVtUmVnczsKKwl9CisgICAgICAvKgorICAgICAgICAqKiBOb3cgc2V0IHRoZSByZWdpc3RlciBuYW1lcyBhbmQgdmFsdWVzCisgICAgICAgICovCisgICAgICBmb3IgKGkgPSBzdGFydFJlZ051bTsgKGkgPD0gZW5kUmVnTnVtKTsgaSsrKQorCXsKKwkgIFR1aUdlbldpbkluZm9QdHIgZGF0YUl0ZW1XaW47CisKKwkgIGRhdGFJdGVtV2luID0gJmRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8uCisJICAgIHJlZ3NDb250ZW50W2kgLSBzdGFydFJlZ051bV0tPndoaWNoRWxlbWVudC5kYXRhV2luZG93OworCSAgX3R1aVNldFJlZ2lzdGVyRWxlbWVudCAoCisJCQkJICAgaSwKKwkJCQkgICBmcmFtZSwKKwkgICAmKChUdWlXaW5FbGVtZW50UHRyKSBkYXRhSXRlbVdpbi0+Y29udGVudFswXSktPndoaWNoRWxlbWVudC5kYXRhLAorCQkJCSAgICFhbGxvY2F0ZWRIZXJlICYmIHJlZnJlc2hWYWx1ZXNPbmx5KTsKKwl9CisgICAgICBkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NDb2x1bW5Db3VudCA9CisJdHVpQ2FsY3VsYXRlUmVnc0NvbHVtbkNvdW50IChkcHlUeXBlKTsKKyNpZmRlZiBMQVRFUgorICAgICAgaWYgKGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8uZGF0YUNvbnRlbnRDb3VudCA+IDApCisJeworCSAgLyogZGVsZXRlIGFsbCB0aGUgd2luZG93cz8gKi8KKwkgIC8qIHJlYWxsb2MgY29udGVudCBlcXVhbCB0byBkYXRhQ29udGVudENvdW50ICsgcmVnc0NvbnRlbnRDb3VudCAqLworCSAgLyogYXBwZW5kIGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8uZGF0YUNvbnRlbnQgdG8gY29udGVudCAqLworCX0KKyNlbmRpZgorICAgICAgZGF0YVdpbi0+Z2VuZXJpYy5jb250ZW50U2l6ZSA9CisJZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzQ29udGVudENvdW50ICsKKwlkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLmRhdGFDb250ZW50Q291bnQ7CisgICAgICByZXQgPSBUVUlfU1VDQ0VTUzsKKyAgICB9CisKKyAgcmV0dXJuIHJldDsKK30JCQkJLyogX3R1aVNldFJlZ3NDb250ZW50ICovCisKKworLyoKKyoqIF90dWlEaXNwbGF5UmVnaXN0ZXIoKS4KKyoqICAgICAgICBGdW5jdGlvbiB0byBkaXNwbGF5IGEgcmVnaXN0ZXIgaW4gYSB3aW5kb3cuICBJZiBoaWxpdGUgaXMgVFJVRSwKKyoqICAgICAgICB0aGFuIHRoZSB2YWx1ZSB3aWxsIGJlIGRpc3BsYXllZCBpbiByZXZlcnNlIHZpZGVvCisqLworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aURpc3BsYXlSZWdpc3RlciAoCisJCSAgICAgIGludCByZWdOdW0sCisJCSAgICAgIFR1aUdlbldpbkluZm9QdHIgd2luSW5mbywJLyogdGhlIGRhdGEgaXRlbSB3aW5kb3cgKi8KKwkJICAgICAgZW51bSBwcmVjaXNpb25fdHlwZSBwcmVjaXNpb24pCisjZWxzZQorX3R1aURpc3BsYXlSZWdpc3RlciAocmVnTnVtLCB3aW5JbmZvLCBwcmVjaXNpb24pCisgICAgIGludCByZWdOdW07CisgICAgIFR1aUdlbldpbkluZm9QdHIgd2luSW5mbzsJLyogdGhlIGRhdGEgaXRlbSB3aW5kb3cgKi8KKyAgICAgZW51bSBwcmVjaXNpb25fdHlwZSBwcmVjaXNpb247CisjZW5kaWYKK3sKKyAgaWYgKHdpbkluZm8tPmhhbmRsZSAhPSAoV0lORE9XICopIE5VTEwpCisgICAgeworICAgICAgY2hhciBidWZbMTAwXTsKKyAgICAgIGludCB2YWx1ZUNoYXJzV2lkZSwgbGFiZWxXaWR0aDsKKyAgICAgIFR1aURhdGFFbGVtZW50UHRyIGRhdGFFbGVtZW50UHRyID0gJigoVHVpV2luQ29udGVudCkKKwkJCQkgICAgd2luSW5mby0+Y29udGVudClbMF0tPndoaWNoRWxlbWVudC5kYXRhOworCisgICAgICBpZiAoSVNfNjRCSVQgfHwKKwkgIGRhdGFXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0Rpc3BsYXlUeXBlID09IFRVSV9ERkxPQVRfUkVHUykKKwl7CisJICB2YWx1ZUNoYXJzV2lkZSA9IERPVUJMRV9GTE9BVF9WQUxVRV9XSURUSDsKKwkgIGxhYmVsV2lkdGggPSBET1VCTEVfRkxPQVRfTEFCRUxfV0lEVEg7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NEaXNwbGF5VHlwZSA9PQorCSAgICAgIFRVSV9TRkxPQVRfUkVHUykKKwkgICAgeworCSAgICAgIHZhbHVlQ2hhcnNXaWRlID0gU0lOR0xFX0ZMT0FUX1ZBTFVFX1dJRFRIOworCSAgICAgIGxhYmVsV2lkdGggPSBTSU5HTEVfRkxPQVRfTEFCRUxfV0lEVEg7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHZhbHVlQ2hhcnNXaWRlID0gU0lOR0xFX1ZBTFVFX1dJRFRIOworCSAgICAgIGxhYmVsV2lkdGggPSBTSU5HTEVfTEFCRUxfV0lEVEg7CisJICAgIH0KKwl9CisKKyAgICAgIGJ1ZlswXSA9IChjaGFyKSAwOworICAgICAgX3R1aVJlZ2lzdGVyRm9ybWF0IChidWYsCisJCQkgIHZhbHVlQ2hhcnNXaWRlICsgbGFiZWxXaWR0aCwKKwkJCSAgcmVnTnVtLAorCQkJICBkYXRhRWxlbWVudFB0ciwKKwkJCSAgcHJlY2lzaW9uKTsKKyAgICAgIGlmIChkYXRhRWxlbWVudFB0ci0+aGlnaGxpZ2h0KQorCXdzdGFuZG91dCAod2luSW5mby0+aGFuZGxlKTsKKworICAgICAgd2VyYXNlICh3aW5JbmZvLT5oYW5kbGUpOworICAgICAgd21vdmUgKHdpbkluZm8tPmhhbmRsZSwgMCwgMCk7CisgICAgICB3YWRkc3RyICh3aW5JbmZvLT5oYW5kbGUsIGJ1Zik7CisKKyAgICAgIGlmIChkYXRhRWxlbWVudFB0ci0+aGlnaGxpZ2h0KQorCXdzdGFuZGVuZCAod2luSW5mby0+aGFuZGxlKTsKKyAgICAgIHR1aVJlZnJlc2hXaW4gKHdpbkluZm8pOworICAgIH0KKyAgcmV0dXJuOworfQkJCQkvKiBfdHVpRGlzcGxheVJlZ2lzdGVyICovCisKKworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aV92U2hvd1JlZ2lzdGVyc19jb21tYW5kU3VwcG9ydCAoCisJCQkJICAgICB2YV9saXN0IGFyZ3MpCisjZWxzZQorX3R1aV92U2hvd1JlZ2lzdGVyc19jb21tYW5kU3VwcG9ydCAoYXJncykKKyAgICAgdmFfbGlzdCBhcmdzOworI2VuZGlmCit7CisgIFR1aVJlZ2lzdGVyRGlzcGxheVR5cGUgZHB5VHlwZSA9IHZhX2FyZyAoYXJncywgVHVpUmVnaXN0ZXJEaXNwbGF5VHlwZSk7CisKKyAgaWYgKG1fd2luUHRyTm90TnVsbCAoZGF0YVdpbikgJiYgZGF0YVdpbi0+Z2VuZXJpYy5pc1Zpc2libGUpCisgICAgewkJCQkvKiBEYXRhIHdpbmRvdyBhbHJlYWR5IGRpc3BsYXllZCwgc2hvdyB0aGUgcmVnaXN0ZXJzICovCisgICAgICBpZiAoZGF0YVdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzRGlzcGxheVR5cGUgIT0gZHB5VHlwZSkKKwl0dWlTaG93UmVnaXN0ZXJzIChkcHlUeXBlKTsKKyAgICB9CisgIGVsc2UKKyAgICAodHVpTGF5b3V0RGVmICgpKS0+cmVnc0Rpc3BsYXlUeXBlID0gZHB5VHlwZTsKKworICByZXR1cm47Cit9CQkJCS8qIF90dWlfdlNob3dSZWdpc3RlcnNfY29tbWFuZFN1cHBvcnQgKi8KKworCitzdGF0aWMgdm9pZAorI2lmZGVmIF9fU1REQ19fCitfdHVpU2hvd0Zsb2F0X2NvbW1hbmQgKAorCQkJY2hhciAqYXJnLAorCQkJaW50IGZyb21UVFkpCisjZWxzZQorX3R1aVNob3dGbG9hdF9jb21tYW5kIChhcmcsIGZyb21UVFkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21UVFk7CisjZW5kaWYKK3sKKyAgaWYgKG1fd2luUHRySXNOdWxsIChkYXRhV2luKSB8fCAhZGF0YVdpbi0+Z2VuZXJpYy5pc1Zpc2libGUgfHwKKyAgICAgIChkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NEaXNwbGF5VHlwZSAhPSBUVUlfU0ZMT0FUX1JFR1MgJiYKKyAgICAgICBkYXRhV2luLT5kZXRhaWwuZGF0YURpc3BsYXlJbmZvLnJlZ3NEaXNwbGF5VHlwZSAhPSBUVUlfREZMT0FUX1JFR1MpKQorICAgIHR1aURvICgoVHVpT3BhcXVlRnVuY1B0cikgX3R1aV92U2hvd1JlZ2lzdGVyc19jb21tYW5kU3VwcG9ydCwKKwkgICAodHVpTGF5b3V0RGVmICgpKS0+ZmxvYXRSZWdzRGlzcGxheVR5cGUpOworCisgIHJldHVybjsKK30JCQkJLyogX3R1aVNob3dGbG9hdF9jb21tYW5kICovCisKKworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aVNob3dHZW5lcmFsX2NvbW1hbmQgKAorCQkJICBjaGFyICphcmcsCisJCQkgIGludCBmcm9tVFRZKQorI2Vsc2UKK190dWlTaG93R2VuZXJhbF9jb21tYW5kIChhcmcsIGZyb21UVFkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21UVFk7CisjZW5kaWYKK3sKKyAgdHVpRG8gKChUdWlPcGFxdWVGdW5jUHRyKSBfdHVpX3ZTaG93UmVnaXN0ZXJzX2NvbW1hbmRTdXBwb3J0LAorCSBUVUlfR0VORVJBTF9SRUdTKTsKKworICByZXR1cm47Cit9CQkJCS8qIF90dWlTaG93R2VuZXJhbF9jb21tYW5kICovCisKKworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aVNob3dTcGVjaWFsX2NvbW1hbmQgKAorCQkJICBjaGFyICphcmcsCisJCQkgIGludCBmcm9tVFRZKQorI2Vsc2UKK190dWlTaG93U3BlY2lhbF9jb21tYW5kIChhcmcsIGZyb21UVFkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21UVFk7CisjZW5kaWYKK3sKKyAgdHVpRG8gKChUdWlPcGFxdWVGdW5jUHRyKSBfdHVpX3ZTaG93UmVnaXN0ZXJzX2NvbW1hbmRTdXBwb3J0LAorCSBUVUlfU1BFQ0lBTF9SRUdTKTsKKworICByZXR1cm47Cit9CQkJCS8qIF90dWlTaG93U3BlY2lhbF9jb21tYW5kICovCisKKworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aVRvZ2dsZUZsb2F0UmVnc19jb21tYW5kICgKKwkJCSAgICAgIGNoYXIgKmFyZywKKwkJCSAgICAgIGludCBmcm9tVFRZKQorI2Vsc2UKK190dWlUb2dnbGVGbG9hdFJlZ3NfY29tbWFuZCAoYXJnLCBmcm9tVFRZKQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tVFRZOworI2VuZGlmCit7CisgIGlmIChtX3dpblB0ck5vdE51bGwgKGRhdGFXaW4pICYmIGRhdGFXaW4tPmdlbmVyaWMuaXNWaXNpYmxlKQorICAgIHR1aURvICgoVHVpT3BhcXVlRnVuY1B0cikgdHVpVG9nZ2xlRmxvYXRSZWdzKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIFR1aUxheW91dERlZlB0ciBsYXlvdXREZWYgPSB0dWlMYXlvdXREZWYgKCk7CisKKyAgICAgIGlmIChsYXlvdXREZWYtPmZsb2F0UmVnc0Rpc3BsYXlUeXBlID09IFRVSV9TRkxPQVRfUkVHUykKKwlsYXlvdXREZWYtPmZsb2F0UmVnc0Rpc3BsYXlUeXBlID0gVFVJX0RGTE9BVF9SRUdTOworICAgICAgZWxzZQorCWxheW91dERlZi0+ZmxvYXRSZWdzRGlzcGxheVR5cGUgPSBUVUlfU0ZMT0FUX1JFR1M7CisgICAgfQorCisKKyAgcmV0dXJuOworfQkJCQkvKiBfdHVpVG9nZ2xlRmxvYXRSZWdzX2NvbW1hbmQgKi8KKworCitzdGF0aWMgdm9pZAorI2lmZGVmIF9fU1REQ19fCitfdHVpU2Nyb2xsUmVnc0ZvcndhcmRfY29tbWFuZCAoCisJCQkJY2hhciAqYXJnLAorCQkJCWludCBmcm9tVFRZKQorI2Vsc2UKK190dWlTY3JvbGxSZWdzRm9yd2FyZF9jb21tYW5kIChhcmcsIGZyb21UVFkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21UVFk7CisjZW5kaWYKK3sKKyAgdHVpRG8gKChUdWlPcGFxdWVGdW5jUHRyKSB0dWlfdlNjcm9sbCwgRk9SV0FSRF9TQ1JPTEwsIGRhdGFXaW4sIDEpOworCisgIHJldHVybjsKK30JCQkJLyogX3R1aVNjcm9sbFJlZ3NGb3J3YXJkX2NvbW1hbmQgKi8KKworCitzdGF0aWMgdm9pZAorI2lmZGVmIF9fU1REQ19fCitfdHVpU2Nyb2xsUmVnc0JhY2t3YXJkX2NvbW1hbmQgKAorCQkJCSBjaGFyICphcmcsCisJCQkJIGludCBmcm9tVFRZKQorI2Vsc2UKK190dWlTY3JvbGxSZWdzQmFja3dhcmRfY29tbWFuZCAoYXJnLCBmcm9tVFRZKQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tVFRZOworI2VuZGlmCit7CisgIHR1aURvICgoVHVpT3BhcXVlRnVuY1B0cikgdHVpX3ZTY3JvbGwsIEJBQ0tXQVJEX1NDUk9MTCwgZGF0YVdpbiwgMSk7CisKKyAgcmV0dXJuOworfQkJCQkvKiBfdHVpU2Nyb2xsUmVnc0JhY2t3YXJkX2NvbW1hbmQgKi8KZGlmZiAtLWdpdCBhL2dkYi90dWkvdHVpUmVncy5oIGIvZ2RiL3R1aS90dWlSZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3NzdlYwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90dWkvdHVpUmVncy5oCkBAIC0wLDAgKzEsMjggQEAKKyNpZm5kZWYgX1RVSV9SRUdTX0gKKyNkZWZpbmUgX1RVSV9SRUdTX0gKKy8qCisqKiBUaGlzIGhlYWRlciBmaWxlIHN1cHBvcnRzIHRoZSBkaXNwbGF5IG9mIHJlZ2lzdGVycyBpbiB0aGUgZGF0YSB3aW5kb3cuCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFRZUEUgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBQVUJMSUMgRlVOQ1RJT04gRVhURVJOQUwgREVDTFMgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gdm9pZCAgICAgdHVpQ2hlY2tSZWdpc3RlclZhbHVlcyBQQVJBTVMgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSk7CitleHRlcm4gdm9pZCAgICAgdHVpU2hvd1JlZ2lzdGVycyBQQVJBTVMgKChUdWlSZWdpc3RlckRpc3BsYXlUeXBlKSk7CitleHRlcm4gdm9pZCAgICAgdHVpRGlzcGxheVJlZ2lzdGVyc0Zyb20gUEFSQU1TICgoaW50KSk7CitleHRlcm4gaW50ICAgICAgdHVpRGlzcGxheVJlZ2lzdGVyc0Zyb21MaW5lIFBBUkFNUyAoKGludCwgaW50KSk7CitleHRlcm4gaW50ICAgICAgdHVpTGFzdFJlZ3NMaW5lTm8gUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIGludCAgICAgIHR1aUZpcnN0UmVnRWxlbWVudEluTGluZSBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiBpbnQgICAgICB0dWlMYXN0UmVnRWxlbWVudEluTGluZSBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiBpbnQgICAgICB0dWlMaW5lRnJvbVJlZ0VsZW1lbnRObyBQQVJBTVMgKChpbnQpKTsKK2V4dGVybiB2b2lkICAgICB0dWlUb2dnbGVGbG9hdFJlZ3MgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIGludCAgICAgIHR1aUNhbGN1bGF0ZVJlZ3NDb2x1bW5Db3VudCBQQVJBTVMgKChUdWlSZWdpc3RlckRpc3BsYXlUeXBlKSk7CisKKworI2VuZGlmIC8qX1RVSV9SRUdTX0gqLwpkaWZmIC0tZ2l0IGEvZ2RiL3R1aS90dWlTb3VyY2UuYyBiL2dkYi90dWkvdHVpU291cmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyNTlkMAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90dWkvdHVpU291cmNlLmMKQEAgLTAsMCArMSw0NjUgQEAKKy8qCisqKiB0dWlTb3VyY2UuYworKiogICAgICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIGRpc3BsYXlpbmcgc291cmNlIGluIHRoZSBzb3VyY2Ugd2luZG93CisqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJicmVha3BvaW50LmgiCisKKyNpbmNsdWRlICJ0dWkuaCIKKyNpbmNsdWRlICJ0dWlEYXRhLmgiCisjaW5jbHVkZSAidHVpU3RhY2suaCIKKyNpbmNsdWRlICJ0dWlTb3VyY2VXaW4uaCIKKyNpbmNsdWRlICJ0dWlTb3VyY2UuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEVYVEVSTkFMIEZVTkNUSU9OIERFQ0xTICAgICAgICAgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBpbnQgb3Blbl9zb3VyY2VfZmlsZSBQQVJBTVMgKChzdHJ1Y3Qgc3ltdGFiICopKTsKK2V4dGVybiB2b2lkIGZpbmRfc291cmNlX2xpbmVzIFBBUkFNUyAoKHN0cnVjdCBzeW10YWIgKiwgaW50KSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRVhURVJOQUwgREFUQSBERUNMUyAgICAgICAgICAgICAgICAgICAgKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBpbnQgY3VycmVudF9zb3VyY2VfbGluZTsKK2V4dGVybiBzdHJ1Y3Qgc3ltdGFiICpjdXJyZW50X3NvdXJjZV9zeW10YWI7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBTVEFUSUMgTE9DQUwgRlVOQ1RJT05TIEZPUldBUkQgREVDTFMgICAgKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBicmVha3BvaW50ICpfaGFzQnJlYWsgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFNUQVRJQyBMT0NBTCBEQVRBICAgICAgICAgICAgICAgICAgICAqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogUFVCTElDIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFNPVVJDRS9ESVNBU1NFTSAgRlVOQ1RJT05TICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisqKiB0dWlTZXRTb3VyY2VDb250ZW50KCkuCisqKiAgICBGdW5jdGlvbiB0byBkaXNwbGF5IHNvdXJjZSBpbiB0aGUgc291cmNlIHdpbmRvdy4KKyovCitUdWlTdGF0dXMKKyNpZmRlZiBfX1NURENfXwordHVpU2V0U291cmNlQ29udGVudCAoCisJCSAgICAgIHN0cnVjdCBzeW10YWIgKnMsCisJCSAgICAgIGludCBsaW5lTm8sCisJCSAgICAgIGludCBub2Vycm9yKQorI2Vsc2UKK3R1aVNldFNvdXJjZUNvbnRlbnQgKHMsIGxpbmVObywgbm9lcnJvcikKKyAgICAgc3RydWN0IHN5bXRhYiAqczsKKyAgICAgaW50IGxpbmVObzsKKyAgICAgaW50IG5vZXJyb3I7CisjZW5kaWYKK3sKKyAgVHVpU3RhdHVzIHJldCA9IFRVSV9GQUlMVVJFOworCisgIGlmIChzICE9IChzdHJ1Y3Qgc3ltdGFiICopIE5VTEwgJiYgcy0+ZmlsZW5hbWUgIT0gKGNoYXIgKikgTlVMTCkKKyAgICB7CisgICAgICByZWdpc3RlciBGSUxFICpzdHJlYW07CisgICAgICByZWdpc3RlciBpbnQgaSwgZGVzYywgYywgbGluZVdpZHRoLCBubGluZXM7CisgICAgICByZWdpc3RlciBjaGFyICpzcmNMaW5lOworCisgICAgICBpZiAoKHJldCA9IHR1aUFsbG9jU291cmNlQnVmZmVyIChzcmNXaW4pKSA9PSBUVUlfU1VDQ0VTUykKKwl7CisJICBsaW5lV2lkdGggPSBzcmNXaW4tPmdlbmVyaWMud2lkdGggLSAxOworCSAgLyoKKyAgICAgICAgICAgICoqIFRha2UgaGlsaXRlICh3aW5kb3cgYm9yZGVyKSBpbnRvIGFjY291bnQsIHdoZW4gY2FsY3VsYXRpbmcKKyAgICAgICAgICAgICoqIHRoZSBudW1iZXIgb2YgbGluZXMKKyAgICAgICAgICAgICovCisJICBubGluZXMgPSAobGluZU5vICsgKHNyY1dpbi0+Z2VuZXJpYy5oZWlnaHQgLSAyKSkgLSBsaW5lTm87CisJICBkZXNjID0gb3Blbl9zb3VyY2VfZmlsZSAocyk7CisJICBpZiAoZGVzYyA8IDApCisJICAgIHsKKwkgICAgICBpZiAoIW5vZXJyb3IpCisJCXsKKwkJICBjaGFyICpuYW1lID0gYWxsb2NhIChzdHJsZW4gKHMtPmZpbGVuYW1lKSArIDEwMCk7CisJCSAgc3ByaW50ZiAobmFtZSwgIiVzOiVkIiwgcy0+ZmlsZW5hbWUsIGxpbmVObyk7CisJCSAgcHJpbnRfc3lzX2Vycm1zZyAobmFtZSwgZXJybm8pOworCQl9CisJICAgICAgcmV0ID0gVFVJX0ZBSUxVUkU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChzLT5saW5lX2NoYXJwb3MgPT0gMCkKKwkJZmluZF9zb3VyY2VfbGluZXMgKHMsIGRlc2MpOworCisJICAgICAgaWYgKGxpbmVObyA8IDEgfHwgbGluZU5vID4gcy0+bmxpbmVzKQorCQl7CisJCSAgY2xvc2UgKGRlc2MpOworCQkgIHByaW50Zl91bmZpbHRlcmVkICgKKwkJCSAgIkxpbmUgbnVtYmVyICVkIG91dCBvZiByYW5nZTsgJXMgaGFzICVkIGxpbmVzLlxuIiwKKwkJCQkgICAgICBsaW5lTm8sIHMtPmZpbGVuYW1lLCBzLT5ubGluZXMpOworCQl9CisJICAgICAgZWxzZSBpZiAobHNlZWsgKGRlc2MsIHMtPmxpbmVfY2hhcnBvc1tsaW5lTm8gLSAxXSwgMCkgPCAwKQorCQl7CisJCSAgY2xvc2UgKGRlc2MpOworCQkgIHBlcnJvcl93aXRoX25hbWUgKHMtPmZpbGVuYW1lKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHJlZ2lzdGVyIGludCBvZmZzZXQsIGN1ckxpbmVObywgY3VyTGluZSwgY3VyTGVuLCB0aHJlc2hvbGQ7CisJCSAgVHVpR2VuV2luSW5mb1B0ciBsb2NhdG9yID0gbG9jYXRvcldpbkluZm9QdHIgKCk7CisJCSAgLyoKKyAgICAgICAgICAgICAgICAgICAgKiogRGV0ZXJtaW5lIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIGxpbmUKKyAgICAgICAgICAgICAgICAgICAgKiogYW5kIHRoZSBvZmZzZXQgdG8gc3RhcnQgdGhlIGRpc3BsYXkKKyAgICAgICAgICAgICAgICAgICAgKi8KKwkJICBvZmZzZXQgPSBzcmNXaW4tPmRldGFpbC5zb3VyY2VJbmZvLmhvcml6b250YWxPZmZzZXQ7CisJCSAgdGhyZXNob2xkID0gKGxpbmVXaWR0aCAtIDEpICsgb2Zmc2V0OworCQkgIHN0cmVhbSA9IGZkb3BlbiAoZGVzYywgRk9QRU5fUlQpOworCQkgIGNsZWFyZXJyIChzdHJlYW0pOworCQkgIGN1ckxpbmUgPSAwOworCQkgIGN1ckxpbmVObyA9CisJCSAgICBzcmNXaW4tPmRldGFpbC5zb3VyY2VJbmZvLnN0YXJ0TGluZU9yQWRkci5saW5lTm8gPSBsaW5lTm87CisJCSAgaWYgKG9mZnNldCA+IDApCisJCSAgICBzcmNMaW5lID0gKGNoYXIgKikgeG1hbGxvYyAoCisJCQkJCSAgICh0aHJlc2hvbGQgKyAxKSAqIHNpemVvZiAoY2hhcikpOworCQkgIHdoaWxlIChjdXJMaW5lIDwgbmxpbmVzKQorCQkgICAgeworCQkgICAgICBUdWlXaW5FbGVtZW50UHRyIGVsZW1lbnQgPSAoVHVpV2luRWxlbWVudFB0cikKKwkJICAgICAgc3JjV2luLT5nZW5lcmljLmNvbnRlbnRbY3VyTGluZV07CisJCSAgICAgIHN0cnVjdCBicmVha3BvaW50ICpicDsKKworCQkgICAgICAvKiBnZXQgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgbGluZSAqLworCQkgICAgICBjID0gZmdldGMgKHN0cmVhbSk7CisKKwkJICAgICAgaWYgKG9mZnNldCA9PSAwKQorCQkJc3JjTGluZSA9ICgoVHVpV2luRWxlbWVudFB0cikKKwkJCQkgICBzcmNXaW4tPmdlbmVyaWMuY29udGVudFsKKwkJCQkJY3VyTGluZV0pLT53aGljaEVsZW1lbnQuc291cmNlLmxpbmU7CisJCSAgICAgIC8qIEluaXQgdGhlIGxpbmUgd2l0aCB0aGUgbGluZSBudW1iZXIgKi8KKwkJICAgICAgc3ByaW50ZiAoc3JjTGluZSwgIiUtNmQiLCBjdXJMaW5lTm8pOworCQkgICAgICBjdXJMZW4gPSBzdHJsZW4gKHNyY0xpbmUpOworCQkgICAgICBpID0gY3VyTGVuIC0KKwkJCSgoY3VyTGVuIC8gdHVpRGVmYXVsdFRhYkxlbiAoKSkgKiB0dWlEZWZhdWx0VGFiTGVuICgpKTsKKwkJICAgICAgd2hpbGUgKGkgPCB0dWlEZWZhdWx0VGFiTGVuICgpKQorCQkJeworCQkJICBzcmNMaW5lW2N1ckxlbl0gPSAnICc7CisJCQkgIGkrKzsKKwkJCSAgY3VyTGVuKys7CisJCQl9CisJCSAgICAgIHNyY0xpbmVbY3VyTGVuXSA9IChjaGFyKSAwOworCisJCSAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAqKiBTZXQgd2hldGhlciBlbGVtZW50IGlzIHRoZSBleGVjdXRpb24gcG9pbnQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAqKiB3aGV0aGVyIHRoZXJlIGlzIGEgYnJlYWsgcG9pbnQgb24gaXQuCisgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkgICAgICBlbGVtZW50LT53aGljaEVsZW1lbnQuc291cmNlLmxpbmVPckFkZHIubGluZU5vID0KKwkJCWN1ckxpbmVObzsKKwkJICAgICAgZWxlbWVudC0+d2hpY2hFbGVtZW50LnNvdXJjZS5pc0V4ZWNQb2ludCA9CisJCQkoc3RyY21wICgoKFR1aVdpbkVsZW1lbnRQdHIpCisJCQlsb2NhdG9yLT5jb250ZW50WzBdKS0+d2hpY2hFbGVtZW50LmxvY2F0b3IuZmlsZU5hbWUsCisJCQkJIHMtPmZpbGVuYW1lKSA9PSAwCisJCQkgJiYgY3VyTGluZU5vID09ICgoVHVpV2luRWxlbWVudFB0cikKKwkJCSBsb2NhdG9yLT5jb250ZW50WzBdKS0+d2hpY2hFbGVtZW50LmxvY2F0b3IubGluZU5vKTsKKwkJICAgICAgYnAgPSBfaGFzQnJlYWsgKHMtPmZpbGVuYW1lLCBjdXJMaW5lTm8pOworCQkgICAgICBlbGVtZW50LT53aGljaEVsZW1lbnQuc291cmNlLmhhc0JyZWFrID0KKwkJCShicCAhPSAoc3RydWN0IGJyZWFrcG9pbnQgKikgTlVMTCAmJgorCQkJICghZWxlbWVudC0+d2hpY2hFbGVtZW50LnNvdXJjZS5pc0V4ZWNQb2ludCB8fAorCQkJICAoYnAtPmRpc3Bvc2l0aW9uICE9IGRlbCB8fCBicC0+aGl0X2NvdW50IDw9IDApKSk7CisJCSAgICAgIGlmIChjICE9IEVPRikKKwkJCXsKKwkJCSAgaSA9IHN0cmxlbiAoc3JjTGluZSkgLSAxOworCQkJICBkbworCQkJICAgIHsKKwkJCSAgICAgIGlmICgoYyAhPSAnXG4nKSAmJgorCQkJCSAgKGMgIT0gJ1xyJykgJiYgKCsraSA8IHRocmVzaG9sZCkpCisJCQkJeworCQkJCSAgaWYgKGMgPCAwNDAgJiYgYyAhPSAnXHQnKQorCQkJCSAgICB7CisJCQkJICAgICAgc3JjTGluZVtpKytdID0gJ14nOworCQkJCSAgICAgIHNyY0xpbmVbaV0gPSBjICsgMDEwMDsKKwkJCQkgICAgfQorCQkJCSAgZWxzZSBpZiAoYyA9PSAwMTc3KQorCQkJCSAgICB7CisJCQkJICAgICAgc3JjTGluZVtpKytdID0gJ14nOworCQkJCSAgICAgIHNyY0xpbmVbaV0gPSAnPyc7CisJCQkJICAgIH0KKwkJCQkgIGVsc2UKKwkJCQkgICAgewkvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIFN0b3JlIHRoZSBjaGFyY3RlciBpbiB0aGUgbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIGJ1ZmZlci4gIElmIGl0IGlzIGEgdGFiLCB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiogdHJhbnNsYXRlIHRvIHRoZSBjb3JyZWN0IG51bWJlciBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIGNoYXJzIHNvIHdlIGRvbid0IG92ZXJ3cml0ZSBvdXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCQkgICAgICBpZiAoYyA9PSAnXHQnKQorCQkJCQl7CisJCQkJCSAgaW50IGosIG1heFRhYkxlbiA9IHR1aURlZmF1bHRUYWJMZW4gKCk7CisKKwkJCQkJICBmb3IgKGogPSBpIC0gKAorCQkJCQkgICAgICAgKGkgLyBtYXhUYWJMZW4pICogbWF4VGFiTGVuKTsKKwkJCQkJICAgICAgICgoaiA8IG1heFRhYkxlbikgJiYKKwkJCQkJCWkgPCB0aHJlc2hvbGQpOworCQkJCQkgICAgICAgaSsrLCBqKyspCisJCQkJCSAgICBzcmNMaW5lW2ldID0gJyAnOworCQkJCQkgIGktLTsKKwkJCQkJfQorCQkJCSAgICAgIGVsc2UKKwkJCQkJc3JjTGluZVtpXSA9IGM7CisJCQkJICAgIH0KKwkJCQkgIHNyY0xpbmVbaSArIDFdID0gMDsKKwkJCQl9CisJCQkgICAgICBlbHNlCisJCQkJewkvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiogaWYgd2UgaGF2ZSBub3QgcmVhY2hlZCBFT0wsIHRoZW4gZWF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiBjaGFycyB1bnRpbCB3ZSBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCQkgIHdoaWxlIChjICE9IEVPRiAmJiBjICE9ICdcbicgJiYgYyAhPSAnXHInKQorCQkJCSAgICBjID0gZmdldGMgKHN0cmVhbSk7CisJCQkJfQorCQkJICAgIH0KKwkJCSAgd2hpbGUgKGMgIT0gRU9GICYmIGMgIT0gJ1xuJyAmJiBjICE9ICdccicgJiYKKwkJCQkgaSA8IHRocmVzaG9sZCAmJiAoYyA9IGZnZXRjIChzdHJlYW0pKSk7CisJCQl9CisJCSAgICAgIC8qIE5vdyBjb3B5IHRoZSBsaW5lIHRha2luZyB0aGUgb2Zmc2V0IGludG8gYWNjb3VudCAqLworCQkgICAgICBpZiAoc3RybGVuIChzcmNMaW5lKSA+IG9mZnNldCkKKwkJCXN0cmNweSAoKChUdWlXaW5FbGVtZW50UHRyKSBzcmNXaW4tPmdlbmVyaWMuY29udGVudFsKKwkJCQkJY3VyTGluZV0pLT53aGljaEVsZW1lbnQuc291cmNlLmxpbmUsCisJCQkJJnNyY0xpbmVbb2Zmc2V0XSk7CisJCSAgICAgIGVsc2UKKwkJCSgoVHVpV2luRWxlbWVudFB0cikKKwkJCSBzcmNXaW4tPmdlbmVyaWMuY29udGVudFsKKwkJCSAgY3VyTGluZV0pLT53aGljaEVsZW1lbnQuc291cmNlLmxpbmVbMF0gPSAoY2hhcikgMDsKKwkJICAgICAgY3VyTGluZSsrOworCQkgICAgICBjdXJMaW5lTm8rKzsKKwkJICAgIH0KKwkJICBpZiAob2Zmc2V0ID4gMCkKKwkJICAgIHR1aUZyZWUgKHNyY0xpbmUpOworCQkgIGZjbG9zZSAoc3RyZWFtKTsKKwkJICBzcmNXaW4tPmdlbmVyaWMuY29udGVudFNpemUgPSBubGluZXM7CisJCSAgcmV0ID0gVFVJX1NVQ0NFU1M7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybiByZXQ7Cit9CQkJCS8qIHR1aVNldFNvdXJjZUNvbnRlbnQgKi8KKworCisvKiBlbHo6IHRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgY29udGVudHMgb2YgdGhlIHNvdXJjZSB3aW5kb3cgdG8gZW1wdHkKKyAgIGV4Y2VwdCBmb3IgYSBsaW5lIGluIHRoZSBtaWRkbGUgd2l0aCBhIHdhcm5pbmcgbWVzc2FnZSBhYm91dCB0aGUKKyAgIHNvdXJjZSBub3QgYmVpbmcgYXZhaWxhYmxlLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieQorICAgdHVpRXJhc2VTb3VyY2VDb250ZW50cywgd2hpY2ggaW4gdHVybiBpcyBpbnZva2VkIHdoZW4gdGhlIHNvdXJjZSBmaWxlcworICAgY2Fubm90IGJlIGFjY2Vzc2VkKi8KKwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlTZXRTb3VyY2VDb250ZW50TmlsICgKKwkJCSBUdWlXaW5JbmZvUHRyIHdpbkluZm8sCisJCQkgY2hhciAqd2FybmluZ19zdHJpbmcpCisjZWxzZQordHVpU2V0U291cmNlQ29udGVudE5pbCAod2luSW5mbywgd2FybmluZ19zdHJpbmcpCisgICAgIFR1aVdpbkluZm9QdHIgd2luSW5mbzsKKyAgICAgY2hhciAqd2FybmluZ19zdHJpbmc7CisjZW5kaWYKK3sKKyAgaW50IGxpbmVXaWR0aDsKKyAgaW50IG5MaW5lczsKKyAgaW50IGN1cnJfbGluZSA9IDA7CisKKyAgbGluZVdpZHRoID0gd2luSW5mby0+Z2VuZXJpYy53aWR0aCAtIDE7CisgIG5MaW5lcyA9IHdpbkluZm8tPmdlbmVyaWMuaGVpZ2h0IC0gMjsKKworICAvKiBzZXQgdG8gZW1wdHkgZWFjaCBsaW5lIGluIHRoZSB3aW5kb3csIGV4Y2VwdCBmb3IgdGhlIG9uZQorICAgIHdoaWNoIGNvbnRhaW5zIHRoZSBtZXNzYWdlKi8KKyAgd2hpbGUgKGN1cnJfbGluZSA8IHdpbkluZm8tPmdlbmVyaWMuY29udGVudFNpemUpCisgICAgeworICAgICAgLyogc2V0IHRoZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGVhY2ggZGlzcGxheWVkIGxpbmUKKyAgICAgdG8gbnVsbDogaS5lLiB0aGUgbGluZSBudW1iZXIgaXMgMCwgdGhlcmUgaXMgbm8gYnAsCisgICAgIGl0IGlzIG5vdCB3aGVyZSB0aGUgcHJvZ3JhbSBpcyBzdG9wcGVkICovCisKKyAgICAgIFR1aVdpbkVsZW1lbnRQdHIgZWxlbWVudCA9CisgICAgICAoVHVpV2luRWxlbWVudFB0cikgd2luSW5mby0+Z2VuZXJpYy5jb250ZW50W2N1cnJfbGluZV07CisgICAgICBlbGVtZW50LT53aGljaEVsZW1lbnQuc291cmNlLmxpbmVPckFkZHIubGluZU5vID0gMDsKKyAgICAgIGVsZW1lbnQtPndoaWNoRWxlbWVudC5zb3VyY2UuaXNFeGVjUG9pbnQgPSBGQUxTRTsKKyAgICAgIGVsZW1lbnQtPndoaWNoRWxlbWVudC5zb3VyY2UuaGFzQnJlYWsgPSBGQUxTRTsKKworICAgICAgLyogc2V0IHRoZSBjb250ZW50cyBvZiB0aGUgbGluZSB0byBibGFuayovCisgICAgICBlbGVtZW50LT53aGljaEVsZW1lbnQuc291cmNlLmxpbmVbMF0gPSAoY2hhcikgMDsKKworICAgICAgLyogaWYgdGhlIGN1cnJlbnQgbGluZSBpcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzY3JlZW4sIHRoZW4gd2Ugd2FudCB0bworICAgICBkaXNwbGF5IHRoZSAnbm8gc291cmNlIGF2YWlsYWJsZScgbWVzc2FnZSBpbiBpdC4KKyAgICAgTm90ZTogdGhlICd3ZWlyZCcgYXJpdGhtZXRpYyB3aXRoIHRoZSBsaW5lIHdpZHRoIGFuZCBoZWlnaHQgY29tZXMgZnJvbQorICAgICB0aGUgZnVuY3Rpb24gdHVpRXJhc2VTb3VyY2VDb250ZW50LiBXZSBuZWVkIHRvIGtlZXAgdGhlIHNjcmVlbiBhbmQgdGhlCisgICAgIHdpbmRvdydzIGFjdHVhbCBjb250ZW50cyBpbiBzeW5jaCAqLworCisgICAgICBpZiAoY3Vycl9saW5lID09IChuTGluZXMgLyAyICsgMSkpCisJeworCSAgaW50IGk7CisJICBpbnQgeHBvczsKKwkgIGludCB3YXJuaW5nX2xlbmd0aCA9IHN0cmxlbiAod2FybmluZ19zdHJpbmcpOworCSAgY2hhciAqc3JjTGluZTsKKworCSAgc3JjTGluZSA9IGVsZW1lbnQtPndoaWNoRWxlbWVudC5zb3VyY2UubGluZTsKKworCSAgaWYgKHdhcm5pbmdfbGVuZ3RoID49ICgobGluZVdpZHRoIC0gMSkgLyAyKSkKKwkgICAgeHBvcyA9IDE7CisJICBlbHNlCisJICAgIHhwb3MgPSAobGluZVdpZHRoIC0gMSkgLyAyIC0gd2FybmluZ19sZW5ndGg7CisKKwkgIGZvciAoaSA9IDA7IGkgPCB4cG9zOyBpKyspCisJICAgIHNyY0xpbmVbaV0gPSAnICc7CisKKwkgIHNwcmludGYgKHNyY0xpbmUgKyBpLCAiJXMiLCB3YXJuaW5nX3N0cmluZyk7CisKKwkgIGZvciAoaSA9IHhwb3MgKyB3YXJuaW5nX2xlbmd0aDsgaSA8IGxpbmVXaWR0aDsgaSsrKQorCSAgICBzcmNMaW5lW2ldID0gJyAnOworCisJICBzcmNMaW5lW2ldID0gJ1xuJzsKKworCX0JCQkvKiBlbmQgaWYgKi8KKworICAgICAgY3Vycl9saW5lKys7CisKKyAgICB9CQkJCS8qIGVuZCB3aGlsZSovCisKK30JCQkJLyp0dWlTZXRTb3VyY2VDb250ZW50TmlsKi8KKworCisKKworLyoKKyoqIHR1aVNob3dTb3VyY2UoKS4KKyoqICAgICAgICBGdW5jdGlvbiB0byBkaXNwbGF5IHNvdXJjZSBpbiB0aGUgc291cmNlIHdpbmRvdy4gIFRoaXMgZnVuY3Rpb24KKyoqICAgICAgICBpbml0aWFsaXplcyB0aGUgaG9yaXpvbnRhbCBzY3JvbGwgdG8gMC4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aVNob3dTb3VyY2UgKAorCQlzdHJ1Y3Qgc3ltdGFiICpzLAorCQlPcGFxdWUgbGluZSwKKwkJaW50IG5vZXJyb3IpCisjZWxzZQordHVpU2hvd1NvdXJjZSAocywgbGluZSwgbm9lcnJvcikKKyAgICAgc3RydWN0IHN5bXRhYiAqczsKKyAgICAgT3BhcXVlIGxpbmU7CisgICAgIGludCBub2Vycm9yOworI2VuZGlmCit7CisgIHNyY1dpbi0+ZGV0YWlsLnNvdXJjZUluZm8uaG9yaXpvbnRhbE9mZnNldCA9IDA7CisgIG1fdHVpU2hvd1NvdXJjZUFzSXMgKHMsIGxpbmUsIG5vZXJyb3IpOworCisgIHJldHVybjsKK30JCQkJLyogdHVpU2hvd1NvdXJjZSAqLworCisKKy8qCisqKiB0dWlTb3VyY2VJc0Rpc3BsYXllZCgpLgorKiogICAgICAgIEFuc3dlciB3aGV0aGVyIHRoZSBzb3VyY2UgaXMgY3VycmVudGx5IGRpc3BsYXllZCBpbiB0aGUgc291cmNlIHdpbmRvdy4KKyovCitpbnQKKyNpZmRlZiBfX1NURENfXwordHVpU291cmNlSXNEaXNwbGF5ZWQgKAorCQkgICAgICAgY2hhciAqZm5hbWUpCisjZWxzZQordHVpU291cmNlSXNEaXNwbGF5ZWQgKGZuYW1lKQorICAgICBjaGFyICpmbmFtZTsKKyNlbmRpZgoreworICByZXR1cm4gKHNyY1dpbi0+Z2VuZXJpYy5jb250ZW50SW5Vc2UgJiYKKwkgIChzdHJjbXAgKCgoVHVpV2luRWxlbWVudFB0cikgKGxvY2F0b3JXaW5JbmZvUHRyICgpKS0+CisJCSAgY29udGVudFswXSktPndoaWNoRWxlbWVudC5sb2NhdG9yLmZpbGVOYW1lLCBmbmFtZSkgPT0gMCkpOworfQkJCQkvKiB0dWlTb3VyY2VJc0Rpc3BsYXllZCAqLworCisKKy8qCisqKiB0dWlWZXJ0aWNhbFNvdXJjZVNjcm9sbCgpLgorKiogICAgICBTY3JvbGwgdGhlIHNvdXJjZSBmb3J3YXJkIG9yIGJhY2t3YXJkIHZlcnRpY2FsbHkKKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aVZlcnRpY2FsU291cmNlU2Nyb2xsICgKKwkJCSAgVHVpU2Nyb2xsRGlyZWN0aW9uIHNjcm9sbERpcmVjdGlvbiwKKwkJCSAgaW50IG51bVRvU2Nyb2xsKQorI2Vsc2UKK3R1aVZlcnRpY2FsU291cmNlU2Nyb2xsIChzY3JvbGxEaXJlY3Rpb24sIG51bVRvU2Nyb2xsKQorICAgICBUdWlTY3JvbGxEaXJlY3Rpb24gc2Nyb2xsRGlyZWN0aW9uOworICAgICBpbnQgbnVtVG9TY3JvbGw7CisjZW5kaWYKK3sKKyAgaWYgKHNyY1dpbi0+Z2VuZXJpYy5jb250ZW50ICE9IChPcGFxdWVQdHIpIE5VTEwpCisgICAgeworICAgICAgaW50IGxpbmU7CisgICAgICBPcGFxdWUgYWRkcjsKKyAgICAgIHN0cnVjdCBzeW10YWIgKnM7CisgICAgICBUdWlXaW5Db250ZW50IGNvbnRlbnQgPSAoVHVpV2luQ29udGVudCkgc3JjV2luLT5nZW5lcmljLmNvbnRlbnQ7CisKKyAgICAgIGlmIChjdXJyZW50X3NvdXJjZV9zeW10YWIgPT0gKHN0cnVjdCBzeW10YWIgKikgTlVMTCkKKwlzID0gZmluZF9wY19zeW10YWIgKHNlbGVjdGVkX2ZyYW1lLT5wYyk7CisgICAgICBlbHNlCisJcyA9IGN1cnJlbnRfc291cmNlX3N5bXRhYjsKKworICAgICAgaWYgKHNjcm9sbERpcmVjdGlvbiA9PSBGT1JXQVJEX1NDUk9MTCkKKwl7CisJICBsaW5lID0gY29udGVudFswXS0+d2hpY2hFbGVtZW50LnNvdXJjZS5saW5lT3JBZGRyLmxpbmVObyArCisJICAgIG51bVRvU2Nyb2xsOworCSAgaWYgKGxpbmUgPiBzLT5ubGluZXMpCisJICAgIC8qbGluZSA9IHMtPm5saW5lcyAtIHdpbkluZm8tPmdlbmVyaWMuY29udGVudFNpemUgKyAxOyovCisJICAgIC8qZWx6OiBmaXggZm9yIGR0cyAyMzM5OCovCisJICAgIGxpbmUgPSBjb250ZW50WzBdLT53aGljaEVsZW1lbnQuc291cmNlLmxpbmVPckFkZHIubGluZU5vOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBsaW5lID0gY29udGVudFswXS0+d2hpY2hFbGVtZW50LnNvdXJjZS5saW5lT3JBZGRyLmxpbmVObyAtCisJICAgIG51bVRvU2Nyb2xsOworCSAgaWYgKGxpbmUgPD0gMCkKKwkgICAgbGluZSA9IDE7CisJfQorICAgICAgdHVpVXBkYXRlU291cmNlV2luZG93QXNJcyAoc3JjV2luLCBzLCAoT3BhcXVlKSBsaW5lLCBGQUxTRSk7CisgICAgfQorCisgIHJldHVybjsKK30JCQkJLyogdHVpVmVydGljYWxTb3VyY2VTY3JvbGwgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFNUQVRJQyBMT0NBTCBGVU5DVElPTlMgICAgICAgICAgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisqKiBfaGFzQnJlYWsoKS4KKyoqICAgICAgICBBbnN3ZXIgd2hldGhlciB0aGVyZSBpcyBhIGJyZWFrIHBvaW50IGF0IHRoZSBpbnB1dCBsaW5lIGluCisqKiAgICAgICAgdGhlIHNvdXJjZSBmaWxlIGluZGljYXRlZAorKi8KK3N0YXRpYyBzdHJ1Y3QgYnJlYWtwb2ludCAqCisjaWZkZWYgX19TVERDX18KK19oYXNCcmVhayAoCisJICAgIGNoYXIgKnNvdXJjZUZpbGVOYW1lLAorCSAgICBpbnQgbGluZU5vKQorI2Vsc2UKK19oYXNCcmVhayAoc291cmNlRmlsZU5hbWUsIGxpbmVObykKKyAgICAgY2hhciAqc291cmNlRmlsZU5hbWU7CisgICAgIGludCBsaW5lTm87CisjZW5kaWYKK3sKKyAgc3RydWN0IGJyZWFrcG9pbnQgKmJwV2l0aEJyZWFrID0gKHN0cnVjdCBicmVha3BvaW50ICopIE5VTEw7CisgIHN0cnVjdCBicmVha3BvaW50ICpicDsKKyAgZXh0ZXJuIHN0cnVjdCBicmVha3BvaW50ICpicmVha3BvaW50X2NoYWluOworCisKKyAgZm9yIChicCA9IGJyZWFrcG9pbnRfY2hhaW47CisgICAgICAgKGJwICE9IChzdHJ1Y3QgYnJlYWtwb2ludCAqKSBOVUxMICYmCisJYnBXaXRoQnJlYWsgPT0gKHN0cnVjdCBicmVha3BvaW50ICopIE5VTEwpOworICAgICAgIGJwID0gYnAtPm5leHQpCisgICAgaWYgKChzdHJjbXAgKHNvdXJjZUZpbGVOYW1lLCBicC0+c291cmNlX2ZpbGUpID09IDApICYmCisJKGxpbmVObyA9PSBicC0+bGluZV9udW1iZXIpKQorICAgICAgYnBXaXRoQnJlYWsgPSBicDsKKworICByZXR1cm4gYnBXaXRoQnJlYWs7Cit9CQkJCS8qIF9oYXNCcmVhayAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3R1aS90dWlTb3VyY2UuaCBiL2dkYi90dWkvdHVpU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg5OGM2MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90dWkvdHVpU291cmNlLmgKQEAgLTAsMCArMSwyNyBAQAorI2lmbmRlZiBfVFVJX1NPVVJDRV9ICisjZGVmaW5lIF9UVUlfU09VUkNFX0gKKy8qCisqKiBUaGlzIGhlYWRlciBmaWxlIHN1cHBvcnRzCisqLworCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaWYgMAorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImJyZWFrcG9pbnQuaCIKKyNlbmRpZgorCitleHRlcm4gVHVpU3RhdHVzICAgIHR1aVNldFNvdXJjZUNvbnRlbnQgUEFSQU1TICgoc3RydWN0IHN5bXRhYiAqLCBpbnQsIGludCkpOworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlTaG93U291cmNlIFBBUkFNUyAoKHN0cnVjdCBzeW10YWIgKiwgT3BhcXVlLCBpbnQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgdHVpU2hvd1NvdXJjZUFzSXMgUEFSQU1TICgoc3RydWN0IHN5bXRhYiAqLCBPcGFxdWUsIGludCkpOworZXh0ZXJuIGludCAgICAgICAgICB0dWlTb3VyY2VJc0Rpc3BsYXllZCBQQVJBTVMgKChjaGFyICopKTsKK2V4dGVybiB2b2lkICAgICAgICAgdHVpVmVydGljYWxTb3VyY2VTY3JvbGwgUEFSQU1TICgoVHVpU2Nyb2xsRGlyZWN0aW9uLCBpbnQpKTsKKworCisvKioqKioqKioqKioqKioqKioqKgorKiogTUFDUk9TICAgICAgICAgKioKKyoqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIG1fdHVpU2hvd1NvdXJjZUFzSXMocywgbGluZSwgbm9lcnJvcikgICAgdHVpVXBkYXRlU291cmNlV2luZG93QXNJcyhzcmNXaW4sIHMsIGxpbmUsIG5vZXJyb3IpCisKKworI2VuZGlmIC8qX1RVSV9TT1VSQ0VfSCovCmRpZmYgLS1naXQgYS9nZGIvdHVpL3R1aVNvdXJjZVdpbi5jIGIvZ2RiL3R1aS90dWlTb3VyY2VXaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjAzOTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3R1aS90dWlTb3VyY2VXaW4uYwpAQCAtMCwwICsxLDEwOTggQEAKKy8qCisqKiB0dWlTb3VyY2VXaW4uYworKiogICAgICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIGRpc3BsYXlpbmcgc291cmNlIG9yIGFzc2VtYmx5IGluIHRoZSAic291cmNlIiB3aW5kb3cuCisqICAgICAgICBUaGUgInNvdXJjZSIgd2luZG93IG1heSBiZSB0aGUgYXNzZW1ibHkgb3IgdGhlIHNvdXJjZSB3aW5kb3dzLgorKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiYnJlYWtwb2ludC5oIgorCisjaW5jbHVkZSAidHVpLmgiCisjaW5jbHVkZSAidHVpRGF0YS5oIgorI2luY2x1ZGUgInR1aVN0YWNrLmgiCisjaW5jbHVkZSAidHVpU291cmNlV2luLmgiCisjaW5jbHVkZSAidHVpU291cmNlLmgiCisjaW5jbHVkZSAidHVpRGlzYXNzZW0uaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEVYVEVSTkFMIEZVTkNUSU9OIERFQ0xTICAgICAgICAgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRVhURVJOQUwgREFUQSBERUNMUyAgICAgICAgICAgICAgICAgICAgKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBpbnQgY3VycmVudF9zb3VyY2VfbGluZTsKK2V4dGVybiBzdHJ1Y3Qgc3ltdGFiICpjdXJyZW50X3NvdXJjZV9zeW10YWI7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBTVEFUSUMgTE9DQUwgRlVOQ1RJT05TIEZPUldBUkQgREVDTFMgICAgKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBTVEFUSUMgTE9DQUwgREFUQSAgICAgICAgICAgICAgICAgICAgKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFBVQkxJQyBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBTT1VSQ0UvRElTQVNTRU0gIEZVTkNUSU9OUyAgICAqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorKiogdHVpU3JjV2luSXNEaXNwbGF5ZWQoKS4KKyovCitpbnQKKyNpZmRlZiBfX1NURENfXwordHVpU3JjV2luSXNEaXNwbGF5ZWQgKHZvaWQpCisjZWxzZQordHVpU3JjV2luSXNEaXNwbGF5ZWQgKCkKKyNlbmRpZgoreworICByZXR1cm4gKG1fd2luUHRyTm90TnVsbCAoc3JjV2luKSAmJiBzcmNXaW4tPmdlbmVyaWMuaXNWaXNpYmxlKTsKK30JCQkJLyogdHVpU3JjV2luSXNEaXNwbGF5ZWQgKi8KKworCisvKgorKiogdHVpQXNtV2luSXNEaXNwbGF5ZWQoKS4KKyovCitpbnQKKyNpZmRlZiBfX1NURENfXwordHVpQXNtV2luSXNEaXNwbGF5ZWQgKHZvaWQpCisjZWxzZQordHVpQXNtV2luSXNEaXNwbGF5ZWQgKCkKKyNlbmRpZgoreworICByZXR1cm4gKG1fd2luUHRyTm90TnVsbCAoZGlzYXNzZW1XaW4pICYmIGRpc2Fzc2VtV2luLT5nZW5lcmljLmlzVmlzaWJsZSk7Cit9CQkJCS8qIHR1aUFzbVdpbklzRGlzcGxheWVkICovCisKKworLyoKKyoqIHR1aURpc3BsYXlNYWluRnVuY3Rpb24oKS4KKyoqICAgICAgICBGdW5jdGlvbiB0byBkaXNwbGF5IHRoZSAibWFpbiIgcm91dGluZSIKKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aURpc3BsYXlNYWluRnVuY3Rpb24gKHZvaWQpCisjZWxzZQordHVpRGlzcGxheU1haW5GdW5jdGlvbiAoKQorI2VuZGlmCit7CisgIGlmICgoc291cmNlV2luZG93cyAoKSktPmNvdW50ID4gMCkKKyAgICB7CisgICAgICBDT1JFX0FERFIgYWRkcjsKKworICAgICAgYWRkciA9IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgKCJtYWluIik7CisgICAgICBpZiAoYWRkciA8PSAoQ09SRV9BRERSKSAwKQorCWFkZHIgPSBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzICgiTUFJTiIpOworICAgICAgaWYgKGFkZHIgPiAoQ09SRV9BRERSKSAwKQorCXsKKwkgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOworCisJICB0dWlVcGRhdGVTb3VyY2VXaW5kb3dzV2l0aEFkZHIgKChPcGFxdWUpIGFkZHIpOworCSAgc2FsID0gZmluZF9wY19saW5lIChhZGRyLCAwKTsKKwkgIHR1aVN3aXRjaEZpbGVuYW1lIChzYWwuc3ltdGFiLT5maWxlbmFtZSk7CisJfQorICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIHR1aURpc3BsYXlNYWluRnVuY3Rpb24gKi8KKworCisKKy8qCisqKiB0dWlVcGRhdGVTb3VyY2VXaW5kb3coKS4KKyoqICAgIEZ1bmN0aW9uIHRvIGRpc3BsYXkgc291cmNlIGluIHRoZSBzb3VyY2Ugd2luZG93LiAgVGhpcyBmdW5jdGlvbgorKiogICAgaW5pdGlhbGl6ZXMgdGhlIGhvcml6b250YWwgc2Nyb2xsIHRvIDAuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlVcGRhdGVTb3VyY2VXaW5kb3cgKAorCQkJVHVpV2luSW5mb1B0ciB3aW5JbmZvLAorCQkJc3RydWN0IHN5bXRhYiAqcywKKwkJCU9wYXF1ZSBsaW5lT3JBZGRyLAorCQkJaW50IG5vZXJyb3IpCisjZWxzZQordHVpVXBkYXRlU291cmNlV2luZG93ICh3aW5JbmZvLCBzLCBsaW5lT3JBZGRyLCBub2Vycm9yKQorICAgICBUdWlXaW5JbmZvUHRyIHdpbkluZm87CisgICAgIHN0cnVjdCBzeW10YWIgKnM7CisgICAgIE9wYXF1ZSBsaW5lT3JBZGRyOworICAgICBpbnQgbm9lcnJvcjsKKyNlbmRpZgoreworICB3aW5JbmZvLT5kZXRhaWwuc291cmNlSW5mby5ob3Jpem9udGFsT2Zmc2V0ID0gMDsKKyAgdHVpVXBkYXRlU291cmNlV2luZG93QXNJcyAod2luSW5mbywgcywgbGluZU9yQWRkciwgbm9lcnJvcik7CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlVcGRhdGVTb3VyY2VXaW5kb3cgKi8KKworCisvKgorKiogdHVpVXBkYXRlU291cmNlV2luZG93QXNJcygpLgorKiogICAgICAgIEZ1bmN0aW9uIHRvIGRpc3BsYXkgc291cmNlIGluIHRoZSBzb3VyY2UvYXNtIHdpbmRvdy4gIFRoaXMKKyoqICAgICAgICBmdW5jdGlvbiBzaG93cyB0aGUgc291cmNlIGFzIHNwZWNpZmllZCBieSB0aGUgaG9yaXpvbnRhbCBvZmZzZXQuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlVcGRhdGVTb3VyY2VXaW5kb3dBc0lzICgKKwkJCSAgICBUdWlXaW5JbmZvUHRyIHdpbkluZm8sCisJCQkgICAgc3RydWN0IHN5bXRhYiAqcywKKwkJCSAgICBPcGFxdWUgbGluZU9yQWRkciwKKwkJCSAgICBpbnQgbm9lcnJvcikKKyNlbHNlCit0dWlVcGRhdGVTb3VyY2VXaW5kb3dBc0lzICh3aW5JbmZvLCBzLCBsaW5lT3JBZGRyLCBub2Vycm9yKQorICAgICBUdWlXaW5JbmZvUHRyIHdpbkluZm87CisgICAgIHN0cnVjdCBzeW10YWIgKnM7CisgICAgIE9wYXF1ZSBsaW5lT3JBZGRyOworICAgICBpbnQgbm9lcnJvcjsKKyNlbmRpZgoreworICBUdWlTdGF0dXMgcmV0OworCisgIGlmICh3aW5JbmZvLT5nZW5lcmljLnR5cGUgPT0gU1JDX1dJTikKKyAgICByZXQgPSB0dWlTZXRTb3VyY2VDb250ZW50IChzLCAoaW50KSBsaW5lT3JBZGRyLCBub2Vycm9yKTsKKyAgZWxzZQorICAgIHJldCA9IHR1aVNldERpc2Fzc2VtQ29udGVudCAocywgKE9wYXF1ZSkgbGluZU9yQWRkcik7CisKKyAgaWYgKHJldCA9PSBUVUlfRkFJTFVSRSkKKyAgICB7CisgICAgICB0dWlDbGVhclNvdXJjZUNvbnRlbnQgKHdpbkluZm8sIEVNUFRZX1NPVVJDRV9QUk9NUFQpOworICAgICAgdHVpQ2xlYXJFeGVjSW5mb0NvbnRlbnQgKHdpbkluZm8pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHR1aUVyYXNlU291cmNlQ29udGVudCAod2luSW5mbywgTk9fRU1QVFlfU09VUkNFX1BST01QVCk7CisgICAgICB0dWlTaG93U291cmNlQ29udGVudCAod2luSW5mbyk7CisgICAgICB0dWlVcGRhdGVFeGVjSW5mbyAod2luSW5mbyk7CisgICAgICBpZiAod2luSW5mby0+Z2VuZXJpYy50eXBlID09IFNSQ19XSU4pCisJeworCSAgY3VycmVudF9zb3VyY2VfbGluZSA9IChpbnQpIGxpbmVPckFkZHIgKworCSAgICAod2luSW5mby0+Z2VuZXJpYy5jb250ZW50U2l6ZSAtIDIpOworCSAgY3VycmVudF9zb3VyY2Vfc3ltdGFiID0gczsKKwkgIC8qCisgICAgICAgICAgICAqKiBJZiB0aGUgZm9jdXMgd2FzIGluIHRoZSBhc20gd2luLCBwdXQgaXQgaW4gdGhlIHNyYworICAgICAgICAgICAgKiogd2luIGlmIHdlIGRvbid0IGhhdmUgYSBzcGxpdCBsYXlvdXQKKyAgICAgICAgICAgICovCisJICBpZiAodHVpV2luV2l0aEZvY3VzICgpID09IGRpc2Fzc2VtV2luICYmCisJICAgICAgY3VycmVudExheW91dCAoKSAhPSBTUkNfRElTQVNTRU1fQ09NTUFORCkKKwkgICAgdHVpU2V0V2luRm9jdXNUbyAoc3JjV2luKTsKKwl9CisgICAgfQorCisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlVcGRhdGVTb3VyY2VXaW5kb3dBc0lzICovCisKKworLyoKKyoqIHR1aVVwZGF0ZVNvdXJjZVdpbmRvd3NXaXRoQWRkcigpLgorKiogICAgICAgIEZ1bmN0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZSBzb3VyY2UgYW5kL29yIGRpc2Fzc2VtbHkgd2luZG93cworKiogICAgICAgIHJlZmxlY3QgdGhlIGlucHV0IGFkZHJlc3MuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlVcGRhdGVTb3VyY2VXaW5kb3dzV2l0aEFkZHIgKAorCQkJCSBPcGFxdWUgYWRkcikKKyNlbHNlCit0dWlVcGRhdGVTb3VyY2VXaW5kb3dzV2l0aEFkZHIgKGFkZHIpCisgICAgIE9wYXF1ZSBhZGRyOworI2VuZGlmCit7CisgIGlmIChhZGRyID4gKE9wYXF1ZSkgTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3Qgc3ltdGFiX2FuZF9saW5lIHNhbDsKKworICAgICAgc3dpdGNoIChjdXJyZW50TGF5b3V0ICgpKQorCXsKKwljYXNlIERJU0FTU0VNX0NPTU1BTkQ6CisJY2FzZSBESVNBU1NFTV9EQVRBX0NPTU1BTkQ6CisJICB0dWlTaG93RGlzYXNzZW0gKGFkZHIpOworCSAgYnJlYWs7CisJY2FzZSBTUkNfRElTQVNTRU1fQ09NTUFORDoKKwkgIHR1aVNob3dEaXNhc3NlbUFuZFVwZGF0ZVNvdXJjZSAoYWRkcik7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgc2FsID0gZmluZF9wY19saW5lICgoQ09SRV9BRERSKSBhZGRyLCAwKTsKKwkgIHR1aVNob3dTb3VyY2UgKHNhbC5zeW10YWIsCisJCQkgKE9wYXF1ZSkgc2FsLmxpbmUsCisJCQkgRkFMU0UpOworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgKHNvdXJjZVdpbmRvd3MgKCkpLT5jb3VudDsgaSsrKQorCXsKKwkgIFR1aVdpbkluZm9QdHIgd2luSW5mbyA9IChUdWlXaW5JbmZvUHRyKSAoc291cmNlV2luZG93cyAoKSktPmxpc3RbaV07CisKKwkgIHR1aUNsZWFyU291cmNlQ29udGVudCAod2luSW5mbywgRU1QVFlfU09VUkNFX1BST01QVCk7CisJICB0dWlDbGVhckV4ZWNJbmZvQ29udGVudCAod2luSW5mbyk7CisJfQorICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIHR1aVVwZGF0ZVNvdXJjZVdpbmRvd3NXaXRoQWRkciAqLworCisKKy8qCisqKiB0dWlfdlVwZGF0ZVNvdXJjZVdpbmRvd3NXaXRoQWRkcigpCisqKiAgICAgICAgVXBkYXRlIHRoZSBzb3VyY2Ugd2luZG93IHdpdGggdGhlIGFkZHJlc3MgaW4gYSB2YV9saXN0CisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlfdlVwZGF0ZVNvdXJjZVdpbmRvd3NXaXRoQWRkciAoCisJCQkJICAgdmFfbGlzdCBhcmdzKQorI2Vsc2UKK3R1aV92VXBkYXRlU291cmNlV2luZG93c1dpdGhBZGRyIChhcmdzKQorICAgICB2YV9saXN0IGFyZ3M7CisjZW5kaWYKK3sKKyAgT3BhcXVlIGFkZHIgPSB2YV9hcmcgKGFyZ3MsIE9wYXF1ZSk7CisKKyAgdHVpVXBkYXRlU291cmNlV2luZG93c1dpdGhBZGRyIChhZGRyKTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aV92VXBkYXRlU291cmNlV2luZG93c1dpdGhBZGRyICovCisKKworLyoKKyoqIHR1aVVwZGF0ZVNvdXJjZVdpbmRvd3NXaXRoTGluZSgpLgorKiogICAgICAgIEZ1bmN0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZSBzb3VyY2UgYW5kL29yIGRpc2Fzc2VtbHkgd2luZG93cworKiogICAgICAgIHJlZmxlY3QgdGhlIGlucHV0IGFkZHJlc3MuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlVcGRhdGVTb3VyY2VXaW5kb3dzV2l0aExpbmUgKAorCQkJCSBzdHJ1Y3Qgc3ltdGFiICpzLAorCQkJCSBpbnQgbGluZSkKKyNlbHNlCit0dWlVcGRhdGVTb3VyY2VXaW5kb3dzV2l0aExpbmUgKHMsIGxpbmUpCisgICAgIHN0cnVjdCBzeW10YWIgKnM7CisgICAgIGludCBsaW5lOworI2VuZGlmCit7CisgIHN3aXRjaCAoY3VycmVudExheW91dCAoKSkKKyAgICB7CisgICAgY2FzZSBESVNBU1NFTV9DT01NQU5EOgorICAgIGNhc2UgRElTQVNTRU1fREFUQV9DT01NQU5EOgorICAgICAgdHVpVXBkYXRlU291cmNlV2luZG93c1dpdGhBZGRyICgoT3BhcXVlKSBmaW5kX2xpbmVfcGMgKHMsIGxpbmUpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0dWlTaG93U291cmNlIChzLCAoT3BhcXVlKSBsaW5lLCBGQUxTRSk7CisgICAgICBpZiAoY3VycmVudExheW91dCAoKSA9PSBTUkNfRElTQVNTRU1fQ09NTUFORCkKKwl0dWlTaG93RGlzYXNzZW0gKChPcGFxdWUpIGZpbmRfbGluZV9wYyAocywgbGluZSkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybjsKK30JCQkJLyogdHVpVXBkYXRlU291cmNlV2luZG93c1dpdGhMaW5lICovCisKKworLyoKKyoqIHR1aV92VXBkYXRlU291cmNlV2luZG93c1dpdGhMaW5lKCkKKyoqICAgICAgICBVcGRhdGUgdGhlIHNvdXJjZSB3aW5kb3cgd2l0aCB0aGUgbGluZSBudW1iZXIgaW4gYSB2YV9saXN0CisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlfdlVwZGF0ZVNvdXJjZVdpbmRvd3NXaXRoTGluZSAoCisJCQkJICAgdmFfbGlzdCBhcmdzKQorI2Vsc2UKK3R1aV92VXBkYXRlU291cmNlV2luZG93c1dpdGhMaW5lIChhcmdzKQorICAgICB2YV9saXN0IGFyZ3M7CisjZW5kaWYKK3sKKyAgc3RydWN0IHN5bXRhYiAqcyA9IHZhX2FyZyAoYXJncywgc3RydWN0IHN5bXRhYiAqKTsKKyAgaW50IGxpbmUgPSB2YV9hcmcgKGFyZ3MsIGludCk7CisKKyAgdHVpVXBkYXRlU291cmNlV2luZG93c1dpdGhMaW5lIChzLCBsaW5lKTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aV92VXBkYXRlU291cmNlV2luZG93c1dpdGhMaW5lICovCisKKworLyoKKyoqIHR1aUNsZWFyU291cmNlQ29udGVudCgpLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpQ2xlYXJTb3VyY2VDb250ZW50ICgKKwkJCVR1aVdpbkluZm9QdHIgd2luSW5mbywKKwkJCWludCBkaXNwbGF5UHJvbXB0KQorI2Vsc2UKK3R1aUNsZWFyU291cmNlQ29udGVudCAod2luSW5mbywgZGlzcGxheVByb21wdCkKKyAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvOworICAgICBpbnQgZGlzcGxheVByb21wdDsKKyNlbmRpZgoreworICBpZiAobV93aW5QdHJOb3ROdWxsICh3aW5JbmZvKSkKKyAgICB7CisgICAgICByZWdpc3RlciBpbnQgaTsKKworICAgICAgd2luSW5mby0+Z2VuZXJpYy5jb250ZW50SW5Vc2UgPSBGQUxTRTsKKyAgICAgIHR1aUVyYXNlU291cmNlQ29udGVudCAod2luSW5mbywgZGlzcGxheVByb21wdCk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgd2luSW5mby0+Z2VuZXJpYy5jb250ZW50U2l6ZTsgaSsrKQorCXsKKwkgIFR1aVdpbkVsZW1lbnRQdHIgZWxlbWVudCA9CisJICAoVHVpV2luRWxlbWVudFB0cikgd2luSW5mby0+Z2VuZXJpYy5jb250ZW50W2ldOworCSAgZWxlbWVudC0+d2hpY2hFbGVtZW50LnNvdXJjZS5oYXNCcmVhayA9IEZBTFNFOworCSAgZWxlbWVudC0+d2hpY2hFbGVtZW50LnNvdXJjZS5pc0V4ZWNQb2ludCA9IEZBTFNFOworCX0KKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlDbGVhclNvdXJjZUNvbnRlbnQgKi8KKworCisvKgorKiogdHVpQ2xlYXJBbGxTb3VyY2VXaW5zQ29udGVudCgpLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpQ2xlYXJBbGxTb3VyY2VXaW5zQ29udGVudCAoCisJCQkgICAgICAgaW50IGRpc3BsYXlQcm9tcHQpCisjZWxzZQordHVpQ2xlYXJBbGxTb3VyY2VXaW5zQ29udGVudCAoZGlzcGxheVByb21wdCkKKyAgICAgaW50IGRpc3BsYXlQcm9tcHQ7CisjZW5kaWYKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IChzb3VyY2VXaW5kb3dzICgpKS0+Y291bnQ7IGkrKykKKyAgICB0dWlDbGVhclNvdXJjZUNvbnRlbnQgKChUdWlXaW5JbmZvUHRyKSAoc291cmNlV2luZG93cyAoKSktPmxpc3RbaV0sCisJCQkgICBkaXNwbGF5UHJvbXB0KTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aUNsZWFyQWxsU291cmNlV2luc0NvbnRlbnQgKi8KKworCisvKgorKiogdHVpRXJhc2VTb3VyY2VDb250ZW50KCkuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlFcmFzZVNvdXJjZUNvbnRlbnQgKAorCQkJVHVpV2luSW5mb1B0ciB3aW5JbmZvLAorCQkJaW50IGRpc3BsYXlQcm9tcHQpCisjZWxzZQordHVpRXJhc2VTb3VyY2VDb250ZW50ICh3aW5JbmZvLCBkaXNwbGF5UHJvbXB0KQorICAgICBUdWlXaW5JbmZvUHRyIHdpbkluZm87CisgICAgIGludCBkaXNwbGF5UHJvbXB0OworI2VuZGlmCit7CisgIGludCB4UG9zOworICBpbnQgaGFsZldpZHRoID0gKHdpbkluZm8tPmdlbmVyaWMud2lkdGggLSAyKSAvIDI7CisKKyAgaWYgKHdpbkluZm8tPmdlbmVyaWMuaGFuZGxlICE9IChXSU5ET1cgKikgTlVMTCkKKyAgICB7CisgICAgICB3ZXJhc2UgKHdpbkluZm8tPmdlbmVyaWMuaGFuZGxlKTsKKyAgICAgIGNoZWNrQW5kRGlzcGxheUhpZ2hsaWdodElmTmVlZGVkICh3aW5JbmZvKTsKKyAgICAgIGlmIChkaXNwbGF5UHJvbXB0ID09IEVNUFRZX1NPVVJDRV9QUk9NUFQpCisJeworCSAgY2hhciAqbm9TcmNTdHI7CisKKwkgIGlmICh3aW5JbmZvLT5nZW5lcmljLnR5cGUgPT0gU1JDX1dJTikKKwkgICAgbm9TcmNTdHIgPSBOT19TUkNfU1RSSU5HOworCSAgZWxzZQorCSAgICBub1NyY1N0ciA9IE5PX0RJU0FTU0VNX1NUUklORzsKKwkgIGlmIChzdHJsZW4gKG5vU3JjU3RyKSA+PSBoYWxmV2lkdGgpCisJICAgIHhQb3MgPSAxOworCSAgZWxzZQorCSAgICB4UG9zID0gaGFsZldpZHRoIC0gc3RybGVuIChub1NyY1N0cik7CisJICBtdndhZGRzdHIgKHdpbkluZm8tPmdlbmVyaWMuaGFuZGxlLAorCQkgICAgICh3aW5JbmZvLT5nZW5lcmljLmhlaWdodCAvIDIpLAorCQkgICAgIHhQb3MsCisJCSAgICAgbm9TcmNTdHIpOworCisJICAvKiBlbHo6IGFkZGVkIHRoaXMgZnVuY3Rpb24gY2FsbCB0byBzZXQgdGhlIHJlYWwgY29udGVudHMgb2YKKyAgICAgICAgICAgICAgICAgICB0aGUgd2luZG93IHRvIHdoYXQgaXMgb24gdGhlICBzY3JlZW4sIHNvIHRoYXQgbGF0ZXIgY2FsbHMKKyAgICAgICAgICAgICAgICAgICB0byByZWZyZXNoLCBkbyBkaXNwbGF5CisgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3Qgc3R1ZmYsIGFuZCBub3QgdGhlIG9sZCBpbWFnZSAqLworCisJICB0dWlTZXRTb3VyY2VDb250ZW50TmlsICh3aW5JbmZvLCBub1NyY1N0cik7CisJfQorICAgICAgdHVpUmVmcmVzaFdpbiAoJndpbkluZm8tPmdlbmVyaWMpOworICAgIH0KKyAgcmV0dXJuOworfQkJCQkvKiB0dWlFcmFzZVNvdXJjZUNvbnRlbnQgKi8KKworCisvKgorKiogdHVpRXJhc2VBbGxTb3VyY2VDb250ZW50KCkuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlFcmFzZUFsbFNvdXJjZVdpbnNDb250ZW50ICgKKwkJCSAgICAgICBpbnQgZGlzcGxheVByb21wdCkKKyNlbHNlCit0dWlFcmFzZUFsbFNvdXJjZVdpbnNDb250ZW50IChkaXNwbGF5UHJvbXB0KQorICAgICBpbnQgZGlzcGxheVByb21wdDsKKyNlbmRpZgoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgKHNvdXJjZVdpbmRvd3MgKCkpLT5jb3VudDsgaSsrKQorICAgIHR1aUVyYXNlU291cmNlQ29udGVudCAoKFR1aVdpbkluZm9QdHIpIChzb3VyY2VXaW5kb3dzICgpKS0+bGlzdFtpXSwKKwkJCSAgIGRpc3BsYXlQcm9tcHQpOworCisgIHJldHVybjsKK30JCQkJLyogdHVpRXJhc2VBbGxTb3VyY2VXaW5zQ29udGVudCAqLworCisKKy8qCisqKiB0dWlTaG93U291cmNlQ29udGVudCgpLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpU2hvd1NvdXJjZUNvbnRlbnQgKAorCQkgICAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvKQorI2Vsc2UKK3R1aVNob3dTb3VyY2VDb250ZW50ICh3aW5JbmZvKQorICAgICBUdWlXaW5JbmZvUHRyIHdpbkluZm87CisjZW5kaWYKK3sKKyAgaW50IGN1ckxpbmUsIGksIGN1clg7CisKKyAgdHVpRXJhc2VTb3VyY2VDb250ZW50ICh3aW5JbmZvLCAod2luSW5mby0+Z2VuZXJpYy5jb250ZW50U2l6ZSA8PSAwKSk7CisgIGlmICh3aW5JbmZvLT5nZW5lcmljLmNvbnRlbnRTaXplID4gMCkKKyAgICB7CisgICAgICBjaGFyICpsaW5lOworCisgICAgICBmb3IgKGN1ckxpbmUgPSAxOyAoY3VyTGluZSA8PSB3aW5JbmZvLT5nZW5lcmljLmNvbnRlbnRTaXplKTsgY3VyTGluZSsrKQorCW12d2FkZHN0ciAoCisJCSAgICB3aW5JbmZvLT5nZW5lcmljLmhhbmRsZSwKKwkJICAgIGN1ckxpbmUsCisJCSAgICAxLAorCQkgICAgKChUdWlXaW5FbGVtZW50UHRyKQorCSAgd2luSW5mby0+Z2VuZXJpYy5jb250ZW50W2N1ckxpbmUgLSAxXSktPndoaWNoRWxlbWVudC5zb3VyY2UubGluZSk7CisgICAgfQorICBjaGVja0FuZERpc3BsYXlIaWdobGlnaHRJZk5lZWRlZCAod2luSW5mbyk7CisgIHR1aVJlZnJlc2hXaW4gKCZ3aW5JbmZvLT5nZW5lcmljKTsKKyAgd2luSW5mby0+Z2VuZXJpYy5jb250ZW50SW5Vc2UgPSBUUlVFOworCisgIHJldHVybjsKK30JCQkJLyogdHVpU2hvd1NvdXJjZUNvbnRlbnQgKi8KKworCisvKgorKiogdHVpU2hvd0FsbFNvdXJjZVdpbnNDb250ZW50KCkKKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aVNob3dBbGxTb3VyY2VXaW5zQ29udGVudCAodm9pZCkKKyNlbHNlCit0dWlTaG93QWxsU291cmNlV2luc0NvbnRlbnQgKCkKKyNlbmRpZgoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgKHNvdXJjZVdpbmRvd3MgKCkpLT5jb3VudDsgaSsrKQorICAgIHR1aVNob3dTb3VyY2VDb250ZW50ICgoVHVpV2luSW5mb1B0cikgKHNvdXJjZVdpbmRvd3MgKCkpLT5saXN0W2ldKTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aVNob3dBbGxTb3VyY2VXaW5zQ29udGVudCAqLworCisKKy8qCisqKiB0dWlIb3Jpem9udGFsU291cmNlU2Nyb2xsKCkuCisqKiAgICAgIFNjcm9sbCB0aGUgc291cmNlIGZvcndhcmQgb3IgYmFja3dhcmQgaG9yaXpvbnRhbGx5CisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlIb3Jpem9udGFsU291cmNlU2Nyb2xsICgKKwkJCSAgICBUdWlXaW5JbmZvUHRyIHdpbkluZm8sCisJCQkgICAgVHVpU2Nyb2xsRGlyZWN0aW9uIGRpcmVjdGlvbiwKKwkJCSAgICBpbnQgbnVtVG9TY3JvbGwpCisjZWxzZQordHVpSG9yaXpvbnRhbFNvdXJjZVNjcm9sbCAod2luSW5mbywgZGlyZWN0aW9uLCBudW1Ub1Njcm9sbCkKKyAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvOworICAgICBUdWlTY3JvbGxEaXJlY3Rpb24gZGlyZWN0aW9uOworICAgICBpbnQgbnVtVG9TY3JvbGw7CisjZW5kaWYKK3sKKyAgaWYgKHdpbkluZm8tPmdlbmVyaWMuY29udGVudCAhPSAoT3BhcXVlUHRyKSBOVUxMKQorICAgIHsKKyAgICAgIGludCBvZmZzZXQ7CisgICAgICBzdHJ1Y3Qgc3ltdGFiICpzOworCisgICAgICBpZiAoY3VycmVudF9zb3VyY2Vfc3ltdGFiID09IChzdHJ1Y3Qgc3ltdGFiICopIE5VTEwpCisJcyA9IGZpbmRfcGNfc3ltdGFiIChzZWxlY3RlZF9mcmFtZS0+cGMpOworICAgICAgZWxzZQorCXMgPSBjdXJyZW50X3NvdXJjZV9zeW10YWI7CisKKyAgICAgIGlmIChkaXJlY3Rpb24gPT0gTEVGVF9TQ1JPTEwpCisJb2Zmc2V0ID0gd2luSW5mby0+ZGV0YWlsLnNvdXJjZUluZm8uaG9yaXpvbnRhbE9mZnNldCArIG51bVRvU2Nyb2xsOworICAgICAgZWxzZQorCXsKKwkgIGlmICgob2Zmc2V0ID0KKwkgICAgIHdpbkluZm8tPmRldGFpbC5zb3VyY2VJbmZvLmhvcml6b250YWxPZmZzZXQgLSBudW1Ub1Njcm9sbCkgPCAwKQorCSAgICBvZmZzZXQgPSAwOworCX0KKyAgICAgIHdpbkluZm8tPmRldGFpbC5zb3VyY2VJbmZvLmhvcml6b250YWxPZmZzZXQgPSBvZmZzZXQ7CisgICAgICB0dWlVcGRhdGVTb3VyY2VXaW5kb3dBc0lzICgKKwkJCQkgIHdpbkluZm8sCisJCQkJICBzLAorCQkJCSAgKCh3aW5JbmZvID09IHNyY1dpbikgPworCQkJCSAgIChPcGFxdWUpICgoVHVpV2luRWxlbWVudFB0cikKKyAgICAgICB3aW5JbmZvLT5nZW5lcmljLmNvbnRlbnRbMF0pLT53aGljaEVsZW1lbnQuc291cmNlLmxpbmVPckFkZHIubGluZU5vIDoKKwkJCQkgICAoT3BhcXVlKSAoKFR1aVdpbkVsZW1lbnRQdHIpCisJIHdpbkluZm8tPmdlbmVyaWMuY29udGVudFswXSktPndoaWNoRWxlbWVudC5zb3VyY2UubGluZU9yQWRkci5hZGRyKSwKKwkJCQkgIChpbnQpIEZBTFNFKTsKKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlIb3Jpem9udGFsU291cmNlU2Nyb2xsICovCisKKworLyoKKyoqIHR1aVNldEhhc0V4ZWNQb2ludEF0KCkuCisqKiAgICAgICAgU2V0IG9yIGNsZWFyIHRoZSBoYXNCcmVhayBmbGFnIGluIHRoZSBsaW5lIHdob3NlIGxpbmUgaXMgbGluZU5vLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpU2V0SXNFeGVjUG9pbnRBdCAoCisJCSAgICAgIE9wYXF1ZSBsaW5lT3JBZGRyLAorCQkgICAgICBUdWlXaW5JbmZvUHRyIHdpbkluZm8pCisjZWxzZQordHVpU2V0SXNFeGVjUG9pbnRBdCAobGluZU9yQWRkciwgd2luSW5mbykKKyAgICAgT3BhcXVlIGxpbmVPckFkZHI7CisgICAgIFR1aVdpbkluZm9QdHIgd2luSW5mbzsKKyNlbmRpZgoreworICBpbnQgaTsKKyAgVHVpV2luQ29udGVudCBjb250ZW50ID0gKFR1aVdpbkNvbnRlbnQpIHdpbkluZm8tPmdlbmVyaWMuY29udGVudDsKKworICBpID0gMDsKKyAgd2hpbGUgKGkgPCB3aW5JbmZvLT5nZW5lcmljLmNvbnRlbnRTaXplKQorICAgIHsKKyAgICAgIGlmIChjb250ZW50W2ldLT53aGljaEVsZW1lbnQuc291cmNlLmxpbmVPckFkZHIuYWRkciA9PSBsaW5lT3JBZGRyKQorCWNvbnRlbnRbaV0tPndoaWNoRWxlbWVudC5zb3VyY2UuaXNFeGVjUG9pbnQgPSBUUlVFOworICAgICAgZWxzZQorCWNvbnRlbnRbaV0tPndoaWNoRWxlbWVudC5zb3VyY2UuaXNFeGVjUG9pbnQgPSBGQUxTRTsKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlTZXRJc0V4ZWNQb2ludEF0ICovCisKKworLyoKKyoqIHR1aVNldEhhc0JyZWFrQXQoKS4KKyoqICAgICAgICBTZXQgb3IgY2xlYXIgdGhlIGhhc0JyZWFrIGZsYWcgaW4gdGhlIGxpbmUgd2hvc2UgbGluZSBpcyBsaW5lTm8uCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlTZXRIYXNCcmVha0F0ICgKKwkJICAgc3RydWN0IGJyZWFrcG9pbnQgKmJwLAorCQkgICBUdWlXaW5JbmZvUHRyIHdpbkluZm8sCisJCSAgIGludCBoYXNCcmVhaykKKyNlbHNlCit0dWlTZXRIYXNCcmVha0F0IChicCwgd2luSW5mbywgaGFzQnJlYWspCisgICAgIHN0cnVjdCBicmVha3BvaW50ICpicDsKKyAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvOworICAgICBpbnQgaGFzQnJlYWs7CisjZW5kaWYKK3sKKyAgaW50IGk7CisgIFR1aVdpbkNvbnRlbnQgY29udGVudCA9IChUdWlXaW5Db250ZW50KSB3aW5JbmZvLT5nZW5lcmljLmNvbnRlbnQ7CisKKyAgaSA9IDA7CisgIHdoaWxlIChpIDwgd2luSW5mby0+Z2VuZXJpYy5jb250ZW50U2l6ZSkKKyAgICB7CisgICAgICBpbnQgZ290SXQ7CisgICAgICBUdWlHZW5XaW5JbmZvUHRyIGxvY2F0b3IgPSBsb2NhdG9yV2luSW5mb1B0ciAoKTsKKworICAgICAgaWYgKHdpbkluZm8gPT0gc3JjV2luKQorCXsKKwkgIGNoYXIgKmZpbGVOYW1lRGlzcGxheWVkID0gKGNoYXIgKikgTlVMTDsKKworCSAgaWYgKCgoVHVpV2luRWxlbWVudFB0cikKKwkgICAgICAgbG9jYXRvci0+Y29udGVudFswXSktPndoaWNoRWxlbWVudC5sb2NhdG9yLmZpbGVOYW1lICE9CisJICAgICAgKGNoYXIgKikgTlVMTCkKKwkgICAgZmlsZU5hbWVEaXNwbGF5ZWQgPSAoKFR1aVdpbkVsZW1lbnRQdHIpCisJCQlsb2NhdG9yLT5jb250ZW50WzBdKS0+d2hpY2hFbGVtZW50LmxvY2F0b3IuZmlsZU5hbWU7CisJICBlbHNlIGlmIChjdXJyZW50X3NvdXJjZV9zeW10YWIgIT0gKHN0cnVjdCBzeW10YWIgKikgTlVMTCkKKwkgICAgZmlsZU5hbWVEaXNwbGF5ZWQgPSBjdXJyZW50X3NvdXJjZV9zeW10YWItPmZpbGVuYW1lOworCisJICBnb3RJdCA9IChmaWxlTmFtZURpc3BsYXllZCAhPSAoY2hhciAqKSBOVUxMICYmCisJCSAgIChzdHJjbXAgKGJwLT5zb3VyY2VfZmlsZSwgZmlsZU5hbWVEaXNwbGF5ZWQpID09IDApICYmCisJCSAgIGNvbnRlbnRbaV0tPndoaWNoRWxlbWVudC5zb3VyY2UubGluZU9yQWRkci5saW5lTm8gPT0KKwkJICAgYnAtPmxpbmVfbnVtYmVyKTsKKwl9CisgICAgICBlbHNlCisJZ290SXQgPSAoY29udGVudFtpXS0+d2hpY2hFbGVtZW50LnNvdXJjZS5saW5lT3JBZGRyLmFkZHIKKwkJID09IChPcGFxdWUpIGJwLT5hZGRyZXNzKTsKKyAgICAgIGlmIChnb3RJdCkKKwl7CisJICBjb250ZW50W2ldLT53aGljaEVsZW1lbnQuc291cmNlLmhhc0JyZWFrID0gaGFzQnJlYWs7CisJICBicmVhazsKKwl9CisgICAgICBpKys7CisgICAgfQorCisgIHJldHVybjsKK30JCQkJLyogdHVpU2V0SGFzQnJlYWtBdCAqLworCisKKy8qCisqKiB0dWlBbGxTZXRIYXNCcmVha0F0KCkuCisqKiAgICAgICAgU2V0IG9yIGNsZWFyIHRoZSBoYXNCcmVhayBmbGFnIGluIGFsbCBkaXNwbGF5ZWQgc291cmNlIHdpbmRvd3MuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlBbGxTZXRIYXNCcmVha0F0ICgKKwkJICAgICAgc3RydWN0IGJyZWFrcG9pbnQgKmJwLAorCQkgICAgICBpbnQgaGFzQnJlYWspCisjZWxzZQordHVpQWxsU2V0SGFzQnJlYWtBdCAoYnAsIGhhc0JyZWFrKQorICAgICBzdHJ1Y3QgYnJlYWtwb2ludCAqYnA7CisgICAgIGludCBoYXNCcmVhazsKKyNlbmRpZgoreworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgKHNvdXJjZVdpbmRvd3MgKCkpLT5jb3VudDsgaSsrKQorICAgIHR1aVNldEhhc0JyZWFrQXQgKGJwLAorCQkgICAgICAoVHVpV2luSW5mb1B0cikgKHNvdXJjZVdpbmRvd3MgKCkpLT5saXN0W2ldLCBoYXNCcmVhayk7CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlBbGxTZXRIYXNCcmVha0F0ICovCisKKworLyoKKyoqIHR1aV92QWxsU2V0SGFzQnJlYWtBdCgpCisqKiAgICAgICAgU2V0IG9yIGNsZWFyIHRoZSBoYXNCcmVhayBmbGFnIGluIGFsbCBkaXNwbGF5ZWQgc291cmNlIHdpbmRvd3MsCisqKiAgICAgICAgd2l0aCBwYXJhbXMgaW4gYSB2YV9saXN0CisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlfdkFsbFNldEhhc0JyZWFrQXQgKAorCQkJdmFfbGlzdCBhcmdzKQorI2Vsc2UKK3R1aV92QWxsU2V0SGFzQnJlYWtBdCAoYXJncykKKyAgICAgdmFfbGlzdCBhcmdzOworI2VuZGlmCit7CisgIHN0cnVjdCBicmVha3BvaW50ICpicCA9IHZhX2FyZyAoYXJncywgc3RydWN0IGJyZWFrcG9pbnQgKik7CisgIGludCBoYXNCcmVhayA9IHZhX2FyZyAoYXJncywgaW50KTsKKworICB0dWlBbGxTZXRIYXNCcmVha0F0IChicCwgaGFzQnJlYWspOworCisgIHJldHVybjsKK30JCQkJLyogdHVpX3ZBbGxTZXRIYXNCcmVha0F0ICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBFWEVDVVRJT04gSU5GTyBGVU5DVElPTlMgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisqKiB0dWlTZXRFeGVjSW5mb0NvbnRlbnQoKS4KKyoqICAgICAgRnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSB0aGUgY29udGVudCBvZiB0aGUgZXhlY3V0aW9uIGluZm8gd2luZG93LAorKiogICAgICBiYXNlZCB1cG9uIHRoZSBpbnB1dCB3aW5kb3cgd2hpY2ggaXMgZWl0aGVyIHRoZSBzb3VyY2Ugb3IKKyoqICAgICAgZGlzYXNzZW1ibHkgd2luZG93LgorKi8KK1R1aVN0YXR1cworI2lmZGVmIF9fU1REQ19fCit0dWlTZXRFeGVjSW5mb0NvbnRlbnQgKAorCQkJVHVpV2luSW5mb1B0ciB3aW5JbmZvKQorI2Vsc2UKK3R1aVNldEV4ZWNJbmZvQ29udGVudCAod2luSW5mbykKKyAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvOworI2VuZGlmCit7CisgIFR1aVN0YXR1cyByZXQgPSBUVUlfU1VDQ0VTUzsKKworICBpZiAod2luSW5mby0+ZGV0YWlsLnNvdXJjZUluZm8uZXhlY3V0aW9uSW5mbyAhPSAoVHVpR2VuV2luSW5mb1B0cikgTlVMTCkKKyAgICB7CisgICAgICBUdWlHZW5XaW5JbmZvUHRyIGV4ZWNJbmZvUHRyID0gd2luSW5mby0+ZGV0YWlsLnNvdXJjZUluZm8uZXhlY3V0aW9uSW5mbzsKKworICAgICAgaWYgKGV4ZWNJbmZvUHRyLT5jb250ZW50ID09IChPcGFxdWVQdHIpIE5VTEwpCisJZXhlY0luZm9QdHItPmNvbnRlbnQgPQorCSAgKE9wYXF1ZVB0cikgYWxsb2NDb250ZW50ICh3aW5JbmZvLT5nZW5lcmljLmhlaWdodCwKKwkJCQkgICAgZXhlY0luZm9QdHItPnR5cGUpOworICAgICAgaWYgKGV4ZWNJbmZvUHRyLT5jb250ZW50ICE9IChPcGFxdWVQdHIpIE5VTEwpCisJeworCSAgaW50IGk7CisKKwkgIGZvciAoaSA9IDA7IGkgPCB3aW5JbmZvLT5nZW5lcmljLmNvbnRlbnRTaXplOyBpKyspCisJICAgIHsKKwkgICAgICBUdWlXaW5FbGVtZW50UHRyIGVsZW1lbnQ7CisJICAgICAgVHVpV2luRWxlbWVudFB0ciBzcmNFbGVtZW50OworCisJICAgICAgZWxlbWVudCA9IChUdWlXaW5FbGVtZW50UHRyKSBleGVjSW5mb1B0ci0+Y29udGVudFtpXTsKKwkgICAgICBzcmNFbGVtZW50ID0gKFR1aVdpbkVsZW1lbnRQdHIpIHdpbkluZm8tPmdlbmVyaWMuY29udGVudFtpXTsKKwkgICAgICAvKgorICAgICAgICAgICAgICAgICoqIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgYnJlYWtwb2ludCB0aGF0IGlzCisgICAgICAgICAgICAgICAgKiogdGVtcG9yYXJ5LiAgSWYgc28sIGFuZCB0aGlzIGlzIG91ciBjdXJyZW50IGV4ZWN1dGlvbiBwb2ludCwKKyAgICAgICAgICAgICAgICAqKiB0aGVuIGNsZWFyIHRoZSBicmVhayBpbmRpY2F0b3IuCisgICAgICAgICAgICAgICAgKi8KKwkgICAgICBpZiAoc3JjRWxlbWVudC0+d2hpY2hFbGVtZW50LnNvdXJjZS5oYXNCcmVhayAmJgorCQkgIHNyY0VsZW1lbnQtPndoaWNoRWxlbWVudC5zb3VyY2UuaXNFeGVjUG9pbnQpCisJCXsKKwkJICBzdHJ1Y3QgYnJlYWtwb2ludCAqYnA7CisJCSAgaW50IGZvdW5kID0gRkFMU0U7CisJCSAgZXh0ZXJuIHN0cnVjdCBicmVha3BvaW50ICpicmVha3BvaW50X2NoYWluOworCisJCSAgZm9yIChicCA9IGJyZWFrcG9pbnRfY2hhaW47CisJCSAgICAgICAoYnAgIT0gKHN0cnVjdCBicmVha3BvaW50ICopIE5VTEwgJiYgIWZvdW5kKTsKKwkJICAgICAgIGJwID0gYnAtPm5leHQpCisJCSAgICB7CisJCSAgICAgIGZvdW5kID0KKwkJCSh3aW5JbmZvID09IHNyY1dpbiAmJgorCQkJIGJwLT5saW5lX251bWJlciA9PQorCQkgICAgICAgc3JjRWxlbWVudC0+d2hpY2hFbGVtZW50LnNvdXJjZS5saW5lT3JBZGRyLmxpbmVObykgfHwKKwkJCSh3aW5JbmZvID09IGRpc2Fzc2VtV2luICYmCisJCQkgYnAtPmFkZHJlc3MgPT0gKENPUkVfQUREUikKKwkJCSBzcmNFbGVtZW50LT53aGljaEVsZW1lbnQuc291cmNlLmxpbmVPckFkZHIuYWRkcik7CisJCSAgICAgIGlmIChmb3VuZCkKKwkJCXNyY0VsZW1lbnQtPndoaWNoRWxlbWVudC5zb3VyY2UuaGFzQnJlYWsgPQorCQkJICAoYnAtPmRpc3Bvc2l0aW9uICE9IGRlbCB8fCBicC0+aGl0X2NvdW50IDw9IDApOworCQkgICAgfQorCQkgIGlmICghZm91bmQpCisJCSAgICBzcmNFbGVtZW50LT53aGljaEVsZW1lbnQuc291cmNlLmhhc0JyZWFrID0gRkFMU0U7CisJCX0KKwkgICAgICAvKgorICAgICAgICAgICAgICAgICoqIE5vdyB1cGRhdGUgdGhlIGV4ZWMgaW5mbyBjb250ZW50IGJhc2VkIHVwb24gdGhlIHN0YXRlCisgICAgICAgICAgICAgICAgKiogb2YgZWFjaCBsaW5lIGFzIGluZGljYXRlZCBieSB0aGUgc291cmNlIGNvbnRlbnQuCisgICAgICAgICAgICAgICAgKi8KKwkgICAgICBpZiAoc3JjRWxlbWVudC0+d2hpY2hFbGVtZW50LnNvdXJjZS5oYXNCcmVhayAmJgorCQkgIHNyY0VsZW1lbnQtPndoaWNoRWxlbWVudC5zb3VyY2UuaXNFeGVjUG9pbnQpCisJCWVsZW1lbnQtPndoaWNoRWxlbWVudC5zaW1wbGVTdHJpbmcgPSBicmVha0xvY2F0aW9uU3RyICgpOworCSAgICAgIGVsc2UgaWYgKHNyY0VsZW1lbnQtPndoaWNoRWxlbWVudC5zb3VyY2UuaGFzQnJlYWspCisJCWVsZW1lbnQtPndoaWNoRWxlbWVudC5zaW1wbGVTdHJpbmcgPSBicmVha1N0ciAoKTsKKwkgICAgICBlbHNlIGlmIChzcmNFbGVtZW50LT53aGljaEVsZW1lbnQuc291cmNlLmlzRXhlY1BvaW50KQorCQllbGVtZW50LT53aGljaEVsZW1lbnQuc2ltcGxlU3RyaW5nID0gbG9jYXRpb25TdHIgKCk7CisJICAgICAgZWxzZQorCQllbGVtZW50LT53aGljaEVsZW1lbnQuc2ltcGxlU3RyaW5nID0gYmxhbmtTdHIgKCk7CisJICAgIH0KKwkgIGV4ZWNJbmZvUHRyLT5jb250ZW50U2l6ZSA9IHdpbkluZm8tPmdlbmVyaWMuY29udGVudFNpemU7CisJfQorICAgICAgZWxzZQorCXJldCA9IFRVSV9GQUlMVVJFOworICAgIH0KKworICByZXR1cm4gcmV0OworfQkJCQkvKiB0dWlTZXRFeGVjSW5mb0NvbnRlbnQgKi8KKworCisvKgorKiogdHVpU2hvd0V4ZWNJbmZvQ29udGVudCgpLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpU2hvd0V4ZWNJbmZvQ29udGVudCAoCisJCQkgVHVpV2luSW5mb1B0ciB3aW5JbmZvKQorI2Vsc2UKK3R1aVNob3dFeGVjSW5mb0NvbnRlbnQgKHdpbkluZm8pCisgICAgIFR1aVdpbkluZm9QdHIgd2luSW5mbzsKKyNlbmRpZgoreworICBUdWlHZW5XaW5JbmZvUHRyIGV4ZWNJbmZvID0gd2luSW5mby0+ZGV0YWlsLnNvdXJjZUluZm8uZXhlY3V0aW9uSW5mbzsKKyAgaW50IGN1ckxpbmU7CisKKyAgd2VyYXNlIChleGVjSW5mby0+aGFuZGxlKTsKKyAgdHVpUmVmcmVzaFdpbiAoZXhlY0luZm8pOworICBmb3IgKGN1ckxpbmUgPSAxOyAoY3VyTGluZSA8PSBleGVjSW5mby0+Y29udGVudFNpemUpOyBjdXJMaW5lKyspCisgICAgbXZ3YWRkc3RyIChleGVjSW5mby0+aGFuZGxlLAorCSAgICAgICBjdXJMaW5lLAorCSAgICAgICAwLAorCSAgICAgICAoKFR1aVdpbkVsZW1lbnRQdHIpCisJCWV4ZWNJbmZvLT5jb250ZW50W2N1ckxpbmUgLSAxXSktPndoaWNoRWxlbWVudC5zaW1wbGVTdHJpbmcpOworICB0dWlSZWZyZXNoV2luIChleGVjSW5mbyk7CisgIGV4ZWNJbmZvLT5jb250ZW50SW5Vc2UgPSBUUlVFOworCisgIHJldHVybjsKK30JCQkJLyogdHVpU2hvd0V4ZWNJbmZvQ29udGVudCAqLworCisKKy8qCisqKiB0dWlTaG93QWxsRXhlY0luZm9zQ29udGVudCgpCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlTaG93QWxsRXhlY0luZm9zQ29udGVudCAodm9pZCkKKyNlbHNlCit0dWlTaG93QWxsRXhlY0luZm9zQ29udGVudCAoKQorI2VuZGlmCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCAoc291cmNlV2luZG93cyAoKSktPmNvdW50OyBpKyspCisgICAgdHVpU2hvd0V4ZWNJbmZvQ29udGVudCAoKFR1aVdpbkluZm9QdHIpIChzb3VyY2VXaW5kb3dzICgpKS0+bGlzdFtpXSk7CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlTaG93QWxsRXhlY0luZm9zQ29udGVudCAqLworCisKKy8qCisqKiB0dWlFcmFzZUV4ZWNJbmZvQ29udGVudCgpLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpRXJhc2VFeGVjSW5mb0NvbnRlbnQgKAorCQkJICBUdWlXaW5JbmZvUHRyIHdpbkluZm8pCisjZWxzZQordHVpRXJhc2VFeGVjSW5mb0NvbnRlbnQgKHdpbkluZm8pCisgICAgIFR1aVdpbkluZm9QdHIgd2luSW5mbzsKKyNlbmRpZgoreworICBUdWlHZW5XaW5JbmZvUHRyIGV4ZWNJbmZvID0gd2luSW5mby0+ZGV0YWlsLnNvdXJjZUluZm8uZXhlY3V0aW9uSW5mbzsKKworICB3ZXJhc2UgKGV4ZWNJbmZvLT5oYW5kbGUpOworICB0dWlSZWZyZXNoV2luIChleGVjSW5mbyk7CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlFcmFzZUV4ZWNJbmZvQ29udGVudCAqLworCisKKy8qCisqKiB0dWlFcmFzZUFsbEV4ZWNJbmZvc0NvbnRlbnQoKQorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpRXJhc2VBbGxFeGVjSW5mb3NDb250ZW50ICh2b2lkKQorI2Vsc2UKK3R1aUVyYXNlQWxsRXhlY0luZm9zQ29udGVudCAoKQorI2VuZGlmCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCAoc291cmNlV2luZG93cyAoKSktPmNvdW50OyBpKyspCisgICAgdHVpRXJhc2VFeGVjSW5mb0NvbnRlbnQgKChUdWlXaW5JbmZvUHRyKSAoc291cmNlV2luZG93cyAoKSktPmxpc3RbaV0pOworCisgIHJldHVybjsKK30JCQkJLyogdHVpRXJhc2VBbGxFeGVjSW5mb3NDb250ZW50ICovCisKKworLyoKKyoqIHR1aUNsZWFyRXhlY0luZm9Db250ZW50KCkuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlDbGVhckV4ZWNJbmZvQ29udGVudCAoCisJCQkgIFR1aVdpbkluZm9QdHIgd2luSW5mbykKKyNlbHNlCit0dWlDbGVhckV4ZWNJbmZvQ29udGVudCAod2luSW5mbykKKyAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvOworI2VuZGlmCit7CisgIHdpbkluZm8tPmRldGFpbC5zb3VyY2VJbmZvLmV4ZWN1dGlvbkluZm8tPmNvbnRlbnRJblVzZSA9IEZBTFNFOworICB0dWlFcmFzZUV4ZWNJbmZvQ29udGVudCAod2luSW5mbyk7CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlDbGVhckV4ZWNJbmZvQ29udGVudCAqLworCisKKy8qCisqKiB0dWlDbGVhckFsbEV4ZWNJbmZvc0NvbnRlbnQoKQorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpQ2xlYXJBbGxFeGVjSW5mb3NDb250ZW50ICh2b2lkKQorI2Vsc2UKK3R1aUNsZWFyQWxsRXhlY0luZm9zQ29udGVudCAoKQorI2VuZGlmCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCAoc291cmNlV2luZG93cyAoKSktPmNvdW50OyBpKyspCisgICAgdHVpQ2xlYXJFeGVjSW5mb0NvbnRlbnQgKChUdWlXaW5JbmZvUHRyKSAoc291cmNlV2luZG93cyAoKSktPmxpc3RbaV0pOworCisgIHJldHVybjsKK30JCQkJLyogdHVpQ2xlYXJBbGxFeGVjSW5mb3NDb250ZW50ICovCisKKworLyoKKyoqIHR1aVVwZGF0ZUV4ZWNJbmZvKCkuCisqKiAgICAgICAgRnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBleGVjdXRpb24gaW5mbyB3aW5kb3cKKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aVVwZGF0ZUV4ZWNJbmZvICgKKwkJICAgIFR1aVdpbkluZm9QdHIgd2luSW5mbykKKyNlbHNlCit0dWlVcGRhdGVFeGVjSW5mbyAod2luSW5mbykKKyAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvOworI2VuZGlmCit7CisgIHR1aVNldEV4ZWNJbmZvQ29udGVudCAod2luSW5mbyk7CisgIHR1aVNob3dFeGVjSW5mb0NvbnRlbnQgKHdpbkluZm8pOworfQkJCQkvKiB0dWlVcGRhdGVFeGVjSW5mbworCisKKy8qCisqKiB0dWlVcGRhdGVBbGxFeGVjSW5mb3MoKQorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpVXBkYXRlQWxsRXhlY0luZm9zICh2b2lkKQorI2Vsc2UKK3R1aVVwZGF0ZUFsbEV4ZWNJbmZvcyAoKQorI2VuZGlmCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCAoc291cmNlV2luZG93cyAoKSktPmNvdW50OyBpKyspCisgICAgdHVpVXBkYXRlRXhlY0luZm8gKChUdWlXaW5JbmZvUHRyKSAoc291cmNlV2luZG93cyAoKSktPmxpc3RbaV0pOworCisgIHJldHVybjsKK30JCQkJLyogdHVpVXBkYXRlQWxsRXhlY0luZm9zKi8KKworCisKKy8qIHR1aVVwZGF0ZU9uRW5kKCkKKyoqICAgICAgIGVsejogVGhpcyBmdW5jdGlvbiBjbGVhcnMgdGhlIGV4ZWN1dGlvbiBpbmZvIGZyb20gdGhlIHNvdXJjZSB3aW5kb3dzCisqKiAgICAgICBhbmQgcmVzZXRzIHRoZSBsb2NhdG9yIHRvIGRpc3BsYXkgbm8gbGluZSBpbmZvLCBwcm9jZWR1cmUgaW5mbywgcGMKKyoqICAgICAgIGluZm8uICBJdCBpcyBjYWxsZWQgYnkgc3RhY2tfcHVibGlzaF9zdG9wcGVkX3dpdGhfbm9fZnJhbWUsIHdoaWNoCisqKiAgICAgICBpcyBjYWxsZWQgdGhlbiB0aGUgdGFyZ2V0IHRlcm1pbmF0ZXMgZXhlY3V0aW9uCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlVcGRhdGVPbkVuZCAodm9pZCkKKyNlbHNlCit0dWlVcGRhdGVPbkVuZCAoKQorI2VuZGlmCit7CisgIGludCBpOworICBUdWlHZW5XaW5JbmZvUHRyIGxvY2F0b3I7CisgIGNoYXIgKmZpbGVuYW1lOworICBUdWlXaW5JbmZvUHRyIHdpbkluZm87CisKKyAgbG9jYXRvciA9IGxvY2F0b3JXaW5JbmZvUHRyICgpOworCisgIC8qIGZvciBhbGwgdGhlIHdpbmRvd3MgKHNyYywgYXNtKSAqLworICBmb3IgKGkgPSAwOyBpIDwgKHNvdXJjZVdpbmRvd3MgKCkpLT5jb3VudDsgaSsrKQorICAgIHsKKyAgICAgIHdpbkluZm8gPSAoVHVpV2luSW5mb1B0cikgKHNvdXJjZVdpbmRvd3MgKCkpLT5saXN0W2ldOworCisgICAgICB0dWlTZXRJc0V4ZWNQb2ludEF0ICgoT3BhcXVlKSAtIDEsIHdpbkluZm8pOwkvKiB0aGUgdGFyZ2V0IGlzJ24gcnVubmluZyAqLworICAgICAgLyogLTEgc2hvdWxkIG5vdCBtYXRjaCBhbnkgbGluZSBudW1iZXIgb3IgcGMgKi8KKyAgICAgIHR1aVNldEV4ZWNJbmZvQ29udGVudCAod2luSW5mbyk7CS8qc2V0IHdpbkluZm8gc28gdGhhdCA+IGlzJ24gZGlzcGxheWVkKi8KKyAgICAgIHR1aVNob3dFeGVjSW5mb0NvbnRlbnQgKHdpbkluZm8pOwkvKiBkaXNwbGF5IHRoZSBuZXcgY29udGVudHMgKi8KKyAgICB9CisKKyAgLypub3cgdXBkYXRlIHRoZSBsb2NhdG9yKi8KKyAgdHVpQ2xlYXJMb2NhdG9yRGlzcGxheSAoKTsKKyAgdHVpR2V0TG9jYXRvckZpbGVuYW1lIChsb2NhdG9yLCAmZmlsZW5hbWUpOworICB0dWlTZXRMb2NhdG9ySW5mbyAoCisJCSAgICAgIGZpbGVuYW1lLAorCQkgICAgICAoY2hhciAqKSBOVUxMLAorCQkgICAgICAwLAorCQkgICAgICAoT3BhcXVlKSBOVUxMLAorCSAgICYoKFR1aVdpbkVsZW1lbnRQdHIpIGxvY2F0b3ItPmNvbnRlbnRbMF0pLT53aGljaEVsZW1lbnQubG9jYXRvcik7CisgIHR1aVNob3dMb2NhdG9yQ29udGVudCAoKTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aVVwZGF0ZU9uRW5kICovCisKKworCitUdWlTdGF0dXMKKyNpZmRlZiBfX1NURENfXwordHVpQWxsb2NTb3VyY2VCdWZmZXIgKAorCQkgICAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvKQorI2Vsc2UKK3R1aUFsbG9jU291cmNlQnVmZmVyICh3aW5JbmZvKQorICAgICBUdWlXaW5JbmZvUHRyIHdpbkluZm87CisjZW5kaWYKK3sKKyAgcmVnaXN0ZXIgY2hhciAqc3JjTGluZSwgKnNyY0xpbmVCdWY7CisgIHJlZ2lzdGVyIGludCBpLCBsaW5lV2lkdGgsIGMsIG1heExpbmVzOworICBUdWlTdGF0dXMgcmV0ID0gVFVJX0ZBSUxVUkU7CisKKyAgbWF4TGluZXMgPSB3aW5JbmZvLT5nZW5lcmljLmhlaWdodDsJLyogbGVzcyB0aGUgaGlnaGxpZ2h0IGJveCAqLworICBsaW5lV2lkdGggPSB3aW5JbmZvLT5nZW5lcmljLndpZHRoIC0gMTsKKyAgLyoKKyAgICAqKiBBbGxvY2F0ZSB0aGUgYnVmZmVyIGZvciB0aGUgc291cmNlIGxpbmVzLiAgRG8gdGhpcyBvbmx5IG9uY2Ugc2luY2UgdGhleQorICAgICoqIHdpbGwgYmUgcmUtdXNlZCBmb3IgYWxsIHNvdXJjZSBkaXNwbGF5cy4gIFRoZSBvbmx5IG90aGVyIHRpbWUgdGhpcyB3aWxsCisgICAgKiogYmUgZG9uZSBpcyB3aGVuIGEgd2luZG93J3Mgc2l6ZSBjaGFuZ2VzLgorICAgICovCisgIGlmICh3aW5JbmZvLT5nZW5lcmljLmNvbnRlbnQgPT0gKE9wYXF1ZVB0cikgTlVMTCkKKyAgICB7CisgICAgICBzcmNMaW5lQnVmID0gKGNoYXIgKikgeG1hbGxvYyAoKG1heExpbmVzICogbGluZVdpZHRoKSAqIHNpemVvZiAoY2hhcikpOworICAgICAgaWYgKHNyY0xpbmVCdWYgPT0gKGNoYXIgKikgTlVMTCkKKwlmcHV0c191bmZpbHRlcmVkICgKKwkgICAiVW5hYmxlIHRvIEFsbG9jYXRlIE1lbW9yeSBmb3IgU291cmNlIG9yIERpc2Fzc2VtYmx5IERpc3BsYXkuXG4iLAorCQkJICAgZ2RiX3N0ZGVycik7CisgICAgICBlbHNlCisJeworCSAgLyogYWxsb2NhdGUgdGhlIGNvbnRlbnQgbGlzdCAqLworCSAgaWYgKCh3aW5JbmZvLT5nZW5lcmljLmNvbnRlbnQgPQorCSAgKE9wYXF1ZVB0cikgYWxsb2NDb250ZW50IChtYXhMaW5lcywgU1JDX1dJTikpID09IChPcGFxdWVQdHIpIE5VTEwpCisJICAgIHsKKwkgICAgICB0dWlGcmVlIChzcmNMaW5lQnVmKTsKKwkgICAgICBzcmNMaW5lQnVmID0gKGNoYXIgKikgTlVMTDsKKwkgICAgICBmcHV0c191bmZpbHRlcmVkICgKKwkJCQkgIlVuYWJsZSB0byBBbGxvY2F0ZSBNZW1vcnkgZm9yIFNvdXJjZSBvciBEaXNhc3NlbWJseSBEaXNwbGF5LlxuIiwKKwkJCQkgZ2RiX3N0ZGVycik7CisJICAgIH0KKwl9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbWF4TGluZXM7IGkrKykKKwkoKFR1aVdpbkVsZW1lbnRQdHIpCisJIHdpbkluZm8tPmdlbmVyaWMuY29udGVudFtpXSktPndoaWNoRWxlbWVudC5zb3VyY2UubGluZSA9CisJICBzcmNMaW5lQnVmICsgKGxpbmVXaWR0aCAqIGkpOworICAgICAgcmV0ID0gVFVJX1NVQ0NFU1M7CisgICAgfQorICBlbHNlCisgICAgcmV0ID0gVFVJX1NVQ0NFU1M7CisKKyAgcmV0dXJuIHJldDsKK30JCQkJLyogdHVpQWxsb2NTb3VyY2VCdWZmZXIgKi8KKworCisvKgorKiogdHVpTGluZUlzRGlzcGxheWVkKCkuCisqKiAgICAgIEFuc3dlciB3aGV0aGVyIHRoZSBhIHBhcnRpY3VsYXIgbGluZSBudW1iZXIgb3IgYWRkcmVzcyBpcyBkaXNwbGF5ZWQKKyoqICAgICAgaW4gdGhlIGN1cnJlbnQgc291cmNlIHdpbmRvdy4KKyovCitpbnQKKyNpZmRlZiBfX1NURENfXwordHVpTGluZUlzRGlzcGxheWVkICgKKwkJICAgICBPcGFxdWUgbGluZU5vT3JBZGRyLAorCQkgICAgIFR1aVdpbkluZm9QdHIgd2luSW5mbywKKwkJICAgICBpbnQgY2hlY2tUaHJlc2hvbGQpCisjZWxzZQordHVpTGluZUlzRGlzcGxheWVkIChsaW5lTm9PckFkZHIsIHdpbkluZm8sIGNoZWNrVGhyZXNob2xkKQorICAgICBPcGFxdWUgbGluZU5vT3JBZGRyOworICAgICBUdWlXaW5JbmZvUHRyIHdpbkluZm87CisgICAgIGludCBjaGVja1RocmVzaG9sZDsKKyNlbmRpZgoreworICBpbnQgaXNEaXNwbGF5ZWQgPSBGQUxTRTsKKyAgaW50IGksIHRocmVzaG9sZDsKKworICBpZiAoY2hlY2tUaHJlc2hvbGQpCisgICAgdGhyZXNob2xkID0gU0NST0xMX1RIUkVTSE9MRDsKKyAgZWxzZQorICAgIHRocmVzaG9sZCA9IDA7CisgIGkgPSAwOworICB3aGlsZSAoaSA8IHdpbkluZm8tPmdlbmVyaWMuY29udGVudFNpemUgLSB0aHJlc2hvbGQgJiYgIWlzRGlzcGxheWVkKQorICAgIHsKKyAgICAgIGlmICh3aW5JbmZvID09IHNyY1dpbikKKwlpc0Rpc3BsYXllZCA9ICgoKFR1aVdpbkVsZW1lbnRQdHIpCisJIHdpbkluZm8tPmdlbmVyaWMuY29udGVudFtpXSktPndoaWNoRWxlbWVudC5zb3VyY2UubGluZU9yQWRkci5saW5lTm8KKwkJICAgICAgID09IChpbnQpIGxpbmVOb09yQWRkcik7CisgICAgICBlbHNlCisJaXNEaXNwbGF5ZWQgPSAoKChUdWlXaW5FbGVtZW50UHRyKQorCSAgIHdpbkluZm8tPmdlbmVyaWMuY29udGVudFtpXSktPndoaWNoRWxlbWVudC5zb3VyY2UubGluZU9yQWRkci5hZGRyCisJCSAgICAgICA9PSBsaW5lTm9PckFkZHIpOworICAgICAgaSsrOworICAgIH0KKworICByZXR1cm4gaXNEaXNwbGF5ZWQ7Cit9CQkJCS8qIHR1aUxpbmVJc0Rpc3BsYXllZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogU1RBVElDIExPQ0FMIEZVTkNUSU9OUyAgICAgICAgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9nZGIvdHVpL3R1aVNvdXJjZVdpbi5oIGIvZ2RiL3R1aS90dWlTb3VyY2VXaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2YzYTc4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3R1aS90dWlTb3VyY2VXaW4uaApAQCAtMCwwICsxLDc0IEBACisjaWZuZGVmIF9UVUlfU09VUkNFV0lOX0gKKyNkZWZpbmUgX1RVSV9TT1VSQ0VXSU5fSAorLyoKKyoqIFRoaXMgaGVhZGVyIGZpbGUgc3VwcG9ydHMKKyovCisKKworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlEaXNwbGF5TWFpbkZ1bmN0aW9uIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgdHVpVXBkYXRlU291cmNlV2luZG93IFBBUkFNUyAKKyAgICAgICAgICAgICAgICAgICAgCSgoVHVpV2luSW5mb1B0ciwgc3RydWN0IHN5bXRhYiAqLCBPcGFxdWUsIGludCkpOworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlVcGRhdGVTb3VyY2VXaW5kb3dBc0lzIFBBUkFNUyAKKyAgICAgICAgICAgICAgICAgICAgICAgICgoVHVpV2luSW5mb1B0ciwgc3RydWN0IHN5bXRhYiAqLCBPcGFxdWUsIGludCkpOworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlVcGRhdGVTb3VyY2VXaW5kb3dzV2l0aEFkZHIgUEFSQU1TICgoT3BhcXVlKSk7CitleHRlcm4gdm9pZCAgICAgICAgIHR1aV92VXBkYXRlU291cmNlV2luZG93c1dpdGhBZGRyIFBBUkFNUyAoKHZhX2xpc3QpKTsKK2V4dGVybiB2b2lkICAgICAgICAgdHVpVXBkYXRlU291cmNlV2luZG93c1dpdGhMaW5lIFBBUkFNUyAoKHN0cnVjdCBzeW10YWIgKiwgaW50KSk7CitleHRlcm4gdm9pZCAgICAgICAgIHR1aV92VXBkYXRlU291cmNlV2luZG93c1dpdGhMaW5lIFBBUkFNUyAoKHZhX2xpc3QpKTsKK2V4dGVybiB2b2lkICAgICAgICAgdHVpVXBkYXRlU291cmNlV2luZG93c0Zyb21Mb2NhdG9yIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgdHVpQ2xlYXJTb3VyY2VDb250ZW50IFBBUkFNUyAoKFR1aVdpbkluZm9QdHIsIGludCkpOworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlDbGVhckFsbFNvdXJjZVdpbnNDb250ZW50IFBBUkFNUyAoKGludCkpOworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlFcmFzZVNvdXJjZUNvbnRlbnQgUEFSQU1TICgoVHVpV2luSW5mb1B0ciwgaW50KSk7CitleHRlcm4gdm9pZCAgICAgICAgIHR1aUVyYXNlQWxsU291cmNlV2luc0NvbnRlbnQgUEFSQU1TICgoaW50KSk7CitleHRlcm4gdm9pZCAgICAgICAgIHR1aVNldFNvdXJjZUNvbnRlbnROaWwgUEFSQU1TICgoVHVpV2luSW5mb1B0ciwgY2hhciAqKSk7CitleHRlcm4gdm9pZCAgICAgICAgIHR1aVNob3dTb3VyY2VDb250ZW50IFBBUkFNUyAoKFR1aVdpbkluZm9QdHIpKTsKK2V4dGVybiB2b2lkICAgICAgICAgdHVpU2hvd0FsbFNvdXJjZVdpbnNDb250ZW50IFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgdHVpSG9yaXpvbnRhbFNvdXJjZVNjcm9sbCBQQVJBTVMgKChUdWlXaW5JbmZvUHRyLCBUdWlTY3JvbGxEaXJlY3Rpb24sIGludCkpOworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlVcGRhdGVPbkVuZCBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBUdWlTdGF0dXMgICAgdHVpU2V0RXhlY0luZm9Db250ZW50IFBBUkFNUyAoKFR1aVdpbkluZm9QdHIpKTsKK2V4dGVybiB2b2lkICAgICAgICAgdHVpU2hvd0V4ZWNJbmZvQ29udGVudCBQQVJBTVMgKChUdWlXaW5JbmZvUHRyKSk7CitleHRlcm4gdm9pZCAgICAgICAgIHR1aVNob3dBbGxFeGVjSW5mb3NDb250ZW50IFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgdHVpRXJhc2VFeGVjSW5mb0NvbnRlbnQgUEFSQU1TICgoVHVpV2luSW5mb1B0cikpOworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlFcmFzZUFsbEV4ZWNJbmZvc0NvbnRlbnQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlDbGVhckV4ZWNJbmZvQ29udGVudCBQQVJBTVMgKChUdWlXaW5JbmZvUHRyKSk7CitleHRlcm4gdm9pZCAgICAgICAgIHR1aUNsZWFyQWxsRXhlY0luZm9zQ29udGVudCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCAgICAgICAgIHR1aVVwZGF0ZUV4ZWNJbmZvIFBBUkFNUyAoKFR1aVdpbkluZm9QdHIpKTsKK2V4dGVybiB2b2lkICAgICAgICAgdHVpVXBkYXRlQWxsRXhlY0luZm9zIFBBUkFNUyAoKHZvaWQpKTsKKworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlTZXRJc0V4ZWNQb2ludEF0IFBBUkFNUyAoKE9wYXF1ZSwgVHVpV2luSW5mb1B0cikpOworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlTZXRIYXNCcmVha0F0IFBBUkFNUyAoKHN0cnVjdCBicmVha3BvaW50ICosIFR1aVdpbkluZm9QdHIsIGludCkpOworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlBbGxTZXRIYXNCcmVha0F0IFBBUkFNUyAoKHN0cnVjdCBicmVha3BvaW50ICosIGludCkpOworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlfdkFsbFNldEhhc0JyZWFrQXQgUEFSQU1TICgodmFfbGlzdCkpOworZXh0ZXJuIFR1aVN0YXR1cyAgICB0dWlBbGxvY1NvdXJjZUJ1ZmZlciBQQVJBTVMgKChUdWlXaW5JbmZvUHRyKSk7CitleHRlcm4gaW50ICAgICAgICAgIHR1aUxpbmVJc0Rpc3BsYXllZCBQQVJBTVMgKChPcGFxdWUsIFR1aVdpbkluZm9QdHIsIGludCkpOworCisKKy8qCisqKiBDb25zdGFudCBkZWZpbml0aW9ucworKi8KKyNkZWZpbmUgICAgICAgIFNDUk9MTF9USFJFU0hPTEQgICAgICAgICAgICAyIC8qIHRocmVzaG9sZCBmb3IgbGF6eSBzY3JvbGwgKi8KKworCisvKgorKiogTWFjcm9zIAorKi8KKyNkZWZpbmUgICAgbV90dWlTZXRCcmVha0F0KGJwLCB3aW5JbmZvKSAgICAgICB0dWlTZXRIYXNCcmVha0F0KChicCwgd2luSW5mbywgVFJVRSkKKyNkZWZpbmUgICAgbV90dWlDbGVhckJyZWFrQXQoYnAsIHdpbkluZm8pICAgICB0dWlTZXRIYXNCcmVha0F0KGJwLCB3aW5JbmZvLCBGQUxTRSkKKworI2RlZmluZSAgICBtX3R1aUFsbFNldEJyZWFrQXQoYnApICAgICAgICAgICAgIHR1aUFsbFNldEhhc0JyZWFrQXQoYnAsIFRSVUUpCisjZGVmaW5lICAgIG1fdHVpQWxsQ2xlYXJCcmVha0F0KGJwKSAgICAgICAgICAgdHVpQWxsU2V0SGFzQnJlYWtBdChicCwgRkFMU0UpCisKKyNkZWZpbmUgICAgbV90dWlTcmNMaW5lRGlzcGxheWVkKGxpbmVObykgICAgICB0dWlMaW5lSXNEaXNwbGF5ZWQoKE9wYXF1ZSkobGluZU5vKSwgc3JjV2luLCBGQUxTRSkKKyNkZWZpbmUgICAgbV90dWlTcmNBZGRyRGlzcGxheWVkKGFkZHIpICAgICAgICB0dWlMaW5lSXNEaXNwbGF5ZWQoKE9wYXF1ZSkoYWRkciksIGRpc2Fzc2VtV2luLCBGQUxTRSkKKyNkZWZpbmUgICAgbV90dWlTcmNMaW5lRGlzcGxheWVkV2l0aGluVGhyZXNob2xkKGxpbmVObykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlMaW5lSXNEaXNwbGF5ZWQoKE9wYXF1ZSkobGluZU5vKSwgc3JjV2luLCBUUlVFKQorI2RlZmluZSAgICBtX3R1aVNyY0FkZHJEaXNwbGF5ZWRXaXRoaW5UaHJlc2hvbGQoYWRkcikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlMaW5lSXNEaXNwbGF5ZWQoKE9wYXF1ZSkoYWRkciksIGRpc2Fzc2VtV2luLCBUUlVFKQorI2RlZmluZSBtX3R1aUxpbmVEaXNwbGF5ZWRXaXRoaW5UaHJlc2hvbGQod2luSW5mbywgbGluZU9yQWRkcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICh3aW5JbmZvID09IHNyY1dpbikgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3R1aVNyY0xpbmVEaXNwbGF5ZWRXaXRoaW5UaHJlc2hvbGQobGluZU9yQWRkcikgOiAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90dWlTcmNBZGRyRGlzcGxheWVkV2l0aGluVGhyZXNob2xkKGxpbmVPckFkZHIpICkKKworCisKKyNlbmRpZiAvKl9UVUlfU09VUkNFV0lOX0ggKi8KZGlmZiAtLWdpdCBhL2dkYi90dWkvdHVpU3RhY2suYyBiL2dkYi90dWkvdHVpU3RhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDFkZmUyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3R1aS90dWlTdGFjay5jCkBAIC0wLDAgKzEsNTU0IEBACisvKgorKiogVGhpcyBtb2R1bGUgY29udGFpbnMgZnVuY3Rpb25zIGZvciBkaXNwbGF5aW5nIHRoZSBsb2NhdG9yIGluZm9ybWF0aW9uIGluIHRoZSBsb2NhdG9yIHdpbmRvdy4KKyovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiYnJlYWtwb2ludC5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisKKyNpbmNsdWRlICJ0dWkuaCIKKyNpbmNsdWRlICJ0dWlEYXRhLmgiCisjaW5jbHVkZSAidHVpU3RhY2suaCIKKyNpbmNsdWRlICJ0dWlTb3VyY2VXaW4uaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFNUQVRJQyBMT0NBTCBGVU5DVElPTlMgRk9SV0FSRCBERUNMUyAgICAqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY2hhciAqX2dldEZ1bmNOYW1lRnJvbUZyYW1lIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKK3N0YXRpYyB2b2lkIF90dWlVcGRhdGVMb2NhdGlvbl9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFBVQkxJQyBGVU5DVElPTiAgICAgICAgICAgICAgICAgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisqKiB0dWlDbGVhckxvY2F0b3JEaXNwbGF5KCkKKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aUNsZWFyTG9jYXRvckRpc3BsYXkgKHZvaWQpCisjZWxzZQordHVpQ2xlYXJMb2NhdG9yRGlzcGxheSAoKQorI2VuZGlmCit7CisgIFR1aUdlbldpbkluZm9QdHIgbG9jYXRvciA9IGxvY2F0b3JXaW5JbmZvUHRyICgpOworICBpbnQgaTsKKworICBpZiAobG9jYXRvci0+aGFuZGxlICE9IChXSU5ET1cgKikgTlVMTCkKKyAgICB7CisgICAgICAvKiBObyBuZWVkIHRvIHdlcmFzZSwgc2luY2Ugd3JpdGluZyBhIGxpbmUgb2YKKyAgICAgICAgICogYmxhbmtzIHdoaWNoIHdlIGRvIGJlbG93LCBpcyBlcXVpdmFsZW50LgorICAgICAgICAgKi8KKyAgICAgIC8qIHdlcmFzZShsb2NhdG9yLT5oYW5kbGUpOyAqLworICAgICAgd21vdmUgKGxvY2F0b3ItPmhhbmRsZSwgMCwgMCk7CisgICAgICB3c3RhbmRvdXQgKGxvY2F0b3ItPmhhbmRsZSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbG9jYXRvci0+d2lkdGg7IGkrKykKKwl3YWRkY2ggKGxvY2F0b3ItPmhhbmRsZSwgJyAnKTsKKyAgICAgIHdzdGFuZGVuZCAobG9jYXRvci0+aGFuZGxlKTsKKyAgICAgIHR1aVJlZnJlc2hXaW4gKGxvY2F0b3IpOworICAgICAgd21vdmUgKGxvY2F0b3ItPmhhbmRsZSwgMCwgMCk7CisgICAgICBsb2NhdG9yLT5jb250ZW50SW5Vc2UgPSBGQUxTRTsKKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlDbGVhckxvY2F0b3JEaXNwbGF5ICovCisKKworLyoKKyoqIHR1aVNob3dMb2NhdG9yQ29udGVudCgpCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlTaG93TG9jYXRvckNvbnRlbnQgKHZvaWQpCisjZWxzZQordHVpU2hvd0xvY2F0b3JDb250ZW50ICgpCisjZW5kaWYKK3sKKyAgY2hhciAqc3RyaW5nOworICBUdWlHZW5XaW5JbmZvUHRyIGxvY2F0b3I7CisKKyAgbG9jYXRvciA9IGxvY2F0b3JXaW5JbmZvUHRyICgpOworCisgIGlmIChtX2dlbldpblB0ck5vdE51bGwgKGxvY2F0b3IpICYmIGxvY2F0b3ItPmhhbmRsZSAhPSAoV0lORE9XICopIE5VTEwpCisgICAgeworICAgICAgc3RyaW5nID0gZGlzcGxheWFibGVXaW5Db250ZW50QXQgKGxvY2F0b3IsIDApOworICAgICAgaWYgKHN0cmluZyAhPSAoY2hhciAqKSBOVUxMKQorCXsKKwkgIHdtb3ZlIChsb2NhdG9yLT5oYW5kbGUsIDAsIDApOworCSAgd3N0YW5kb3V0IChsb2NhdG9yLT5oYW5kbGUpOworCSAgd2FkZHN0ciAobG9jYXRvci0+aGFuZGxlLCBzdHJpbmcpOworCSAgd3N0YW5kZW5kIChsb2NhdG9yLT5oYW5kbGUpOworCSAgdHVpUmVmcmVzaFdpbiAobG9jYXRvcik7CisJICB3bW92ZSAobG9jYXRvci0+aGFuZGxlLCAwLCAwKTsKKwkgIGlmIChzdHJpbmcgIT0gbnVsbFN0ciAoKSkKKwkgICAgdHVpRnJlZSAoc3RyaW5nKTsKKwkgIGxvY2F0b3ItPmNvbnRlbnRJblVzZSA9IFRSVUU7CisJfQorICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIHR1aVNob3dMb2NhdG9yQ29udGVudCAqLworCisKKy8qCisqKiB0dWlTZXRMb2NhdG9ySW5mbygpLgorKiogICAgICAgIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgbG9jYXRvciwgd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpU2V0TG9jYXRvckluZm8gKAorCQkgICAgY2hhciAqZm5hbWUsCisJCSAgICBjaGFyICpwcm9jbmFtZSwKKwkJICAgIGludCBsaW5lTm8sCisJCSAgICBPcGFxdWUgYWRkciwKKwkJICAgIFR1aUxvY2F0b3JFbGVtZW50UHRyIGVsZW1lbnQpCisjZWxzZQordHVpU2V0TG9jYXRvckluZm8gKGZuYW1lLCBwcm9jbmFtZSwgbGluZU5vLCBhZGRyLCBlbGVtZW50KQorICAgICBjaGFyICpmbmFtZTsKKyAgICAgY2hhciAqcHJvY25hbWU7CisgICAgIGludCBsaW5lTm87CisgICAgIE9wYXF1ZSBhZGRyOworICAgICBUdWlMb2NhdG9yRWxlbWVudFB0ciBlbGVtZW50OworI2VuZGlmCit7CisjaWZkZWYgQ09NTUVOVAorICAvKiBmaXJzdCBmcmVlIHRoZSBvbGQgaW5mbyAqLworICBpZiAoZWxlbWVudC0+ZmlsZU5hbWUpCisgICAgdHVpRnJlZSAoZWxlbWVudC0+ZmlsZU5hbWUpOworICBpZiAoZWxlbWVudC0+cHJvY05hbWUpCisgICAgdHVpRnJlZSAoZWxlbWVudC0+cHJvY05hbWUpOworCisgIGlmIChmbmFtZSA9PSAoY2hhciAqKSBOVUxMKQorICAgIGVsZW1lbnQtPmZpbGVOYW1lID0gZm5hbWU7CisgIGVsc2UKKyAgICBlbGVtZW50LT5maWxlTmFtZSA9IHR1aVN0ckR1cCAoZm5hbWUpOworICBpZiAocHJvY25hbWUgPT0gKGNoYXIgKikgTlVMTCkKKyAgICBlbGVtZW50LT5wcm9jTmFtZSA9IHByb2NuYW1lOworICBlbHNlCisgICAgZWxlbWVudC0+cHJvY05hbWUgPSB0dWlTdHJEdXAgKHByb2NuYW1lKTsKKyNlbHNlCisgIGVsZW1lbnQtPmZpbGVOYW1lWzBdID0gKGNoYXIpIDA7CisgIGVsZW1lbnQtPnByb2NOYW1lWzBdID0gKGNoYXIpIDA7CisgIHN0cmNhdF90b19idWYgKGVsZW1lbnQtPmZpbGVOYW1lLCBNQVhfTE9DQVRPUl9FTEVNRU5UX0xFTiwgZm5hbWUpOworICBzdHJjYXRfdG9fYnVmIChlbGVtZW50LT5wcm9jTmFtZSwgTUFYX0xPQ0FUT1JfRUxFTUVOVF9MRU4sIHByb2NuYW1lKTsKKyNlbmRpZgorICBlbGVtZW50LT5saW5lTm8gPSBsaW5lTm87CisgIGVsZW1lbnQtPmFkZHIgPSAoT3BhcXVlKSBhZGRyOworCisgIHJldHVybjsKK30JCQkJLyogdHVpU2V0TG9jYXRvckluZm8gKi8KKworCisvKgorKiogdHVpVXBkYXRlTG9jYXRvckZpbGVuYW1lKCkuCisqKiAgICAgICAgVXBkYXRlIG9ubHkgdGhlIGZpbGVuYW1lIHBvcnRpb24gb2YgdGhlIGxvY2F0b3IuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlVcGRhdGVMb2NhdG9yRmlsZW5hbWUgKAorCQkJICAgY2hhciAqZmlsZU5hbWUpCisjZWxzZQordHVpVXBkYXRlTG9jYXRvckZpbGVuYW1lIChmaWxlTmFtZSkKKyAgICAgY2hhciAqZmlsZU5hbWU7CisjZW5kaWYKK3sKKyAgVHVpR2VuV2luSW5mb1B0ciBsb2NhdG9yID0gbG9jYXRvcldpbkluZm9QdHIgKCk7CisKKyAgaWYgKGxvY2F0b3ItPmNvbnRlbnRbMF0gPT0gKE9wYXF1ZSkgTlVMTCkKKyAgICB0dWlTZXRMb2NhdG9yQ29udGVudCAoKHN0cnVjdCBmcmFtZV9pbmZvICopIE5VTEwpOworICAoKFR1aVdpbkVsZW1lbnRQdHIpIGxvY2F0b3ItPmNvbnRlbnRbMF0pLT53aGljaEVsZW1lbnQubG9jYXRvci5maWxlTmFtZVswXSA9IChjaGFyKSAwOworICBzdHJjYXRfdG9fYnVmICgoKFR1aVdpbkVsZW1lbnRQdHIpIGxvY2F0b3ItPmNvbnRlbnRbMF0pLT53aGljaEVsZW1lbnQubG9jYXRvci5maWxlTmFtZSwKKwkJIE1BWF9MT0NBVE9SX0VMRU1FTlRfTEVOLAorCQkgZmlsZU5hbWUpOworCisgIHR1aVNob3dMb2NhdG9yQ29udGVudCAoKTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aVVwZGF0ZUxvY2F0b3JGaWxlbmFtZSAqLworCisKKy8qCisqKiB0dWlfdlVwZGF0ZUxvY2F0b3JGaWxlbmFtZSgpLgorKiogICAgICAgIFVwZGF0ZSBvbmx5IHRoZSBmaWxlbmFtZSBwb3J0aW9uIG9mIHRoZSBsb2NhdG9yIHdpdGggYXJncyBpbiBhIHZhX2xpc3QuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlfdlVwZGF0ZUxvY2F0b3JGaWxlbmFtZSAoCisJCQkgICAgIHZhX2xpc3QgYXJncykKKyNlbHNlCit0dWlfdlVwZGF0ZUxvY2F0b3JGaWxlbmFtZSAoYXJncykKKyAgICAgdmFfbGlzdCBhcmdzOworI2VuZGlmCit7CisgIGNoYXIgKmZpbGVOYW1lOworCisgIGZpbGVOYW1lID0gdmFfYXJnIChhcmdzLCBjaGFyICopOworICB0dWlVcGRhdGVMb2NhdG9yRmlsZW5hbWUgKGZpbGVOYW1lKTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aV92VXBkYXRlTG9jYXRvckZpbGVuYW1lICovCisKKworLyoKKyoqIHR1aVN3aXRjaEZpbGVuYW1lKCkuCisqKiAgIFVwZGF0ZSB0aGUgZmlsZW5hbWUgcG9ydGlvbiBvZiB0aGUgbG9jYXRvci4gQ2xlYXIgdGhlIG90aGVyIGluZm8gaW4gbG9jYXRvci4KKyoqIChlbHopCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlTd2l0Y2hGaWxlbmFtZSAoCisJCSAgICBjaGFyICpmaWxlTmFtZSkKKyNlbHNlCit0dWlTd2l0Y2hGaWxlbmFtZSAoZmlsZU5hbWUpCisgICAgIGNoYXIgKmZpbGVOYW1lOworI2VuZGlmCit7CisgIFR1aUdlbldpbkluZm9QdHIgbG9jYXRvciA9IGxvY2F0b3JXaW5JbmZvUHRyICgpOworCisgIGlmIChsb2NhdG9yLT5jb250ZW50WzBdID09IChPcGFxdWUpIE5VTEwpCisgICAgdHVpU2V0TG9jYXRvckNvbnRlbnQgKChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSBOVUxMKTsKKyAgKChUdWlXaW5FbGVtZW50UHRyKSBsb2NhdG9yLT5jb250ZW50WzBdKS0+d2hpY2hFbGVtZW50LmxvY2F0b3IuZmlsZU5hbWVbMF0gPSAoY2hhcikgMDsKKworICB0dWlTZXRMb2NhdG9ySW5mbyAoZmlsZU5hbWUsCisJCSAgICAgKGNoYXIgKikgTlVMTCwKKwkJICAgICAwLAorCQkgICAgIChPcGFxdWUpIE5VTEwsCisJICAgJigoVHVpV2luRWxlbWVudFB0cikgbG9jYXRvci0+Y29udGVudFswXSktPndoaWNoRWxlbWVudC5sb2NhdG9yKTsKKworICB0dWlTaG93TG9jYXRvckNvbnRlbnQgKCk7CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlTd2l0Y2hGaWxlbmFtZSAqLworCisKKy8qCisqKiB0dWlHZXRMb2NhdG9yRmlsZW5hbWUoKS4KKyoqICAgR2V0IHRoZSBmaWxlbmFtZSBwb3J0aW9uIG9mIHRoZSBsb2NhdG9yLgorKiogKGVseikKKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aUdldExvY2F0b3JGaWxlbmFtZSAoCisJCQlUdWlHZW5XaW5JbmZvUHRyIGxvY2F0b3IsCisJCQljaGFyICoqZmlsZW5hbWUpCisjZWxzZQordHVpR2V0TG9jYXRvckZpbGVuYW1lIChsb2NhdG9yLCBmaWxlbmFtZSkKKyAgICAgVHVpR2VuV2luSW5mb1B0ciBsb2NhdG9yOworICAgICBjaGFyICoqZmlsZW5hbWU7CisjZW5kaWYKK3sKKworICAvKiB0aGUgY3VycmVudCBmaWxlbmFtZSBjb3VsZCBiZSBub24ga25vd24sIGluIHdoaWNoIGNhc2UgdGhlIHhtYWxsb2Mgd291bGQKKyAgICAgYWxsb2NhdGUgbm8gbWVtb3J5LCBiZWNhdXNlIHRoZSBsZW5ndGggd291bGQgYmUgMCAqLworICBpZiAoKChUdWlXaW5FbGVtZW50UHRyKSBsb2NhdG9yLT5jb250ZW50WzBdKS0+d2hpY2hFbGVtZW50LmxvY2F0b3IuZmlsZU5hbWUpCisgICAgeworICAgICAgaW50IG5hbWVfbGVuZ3RoID0KKyAgICAgIHN0cmxlbiAoKChUdWlXaW5FbGVtZW50UHRyKSBsb2NhdG9yLT5jb250ZW50WzBdKS0+d2hpY2hFbGVtZW50LmxvY2F0b3IuZmlsZU5hbWUpOworCisgICAgICAoKmZpbGVuYW1lKSA9IChjaGFyICopIHhtYWxsb2MgKG5hbWVfbGVuZ3RoICsgMSk7CisgICAgICBzdHJjcHkgKCgqZmlsZW5hbWUpLAorCSAgICAgICgoVHVpV2luRWxlbWVudFB0cikgbG9jYXRvci0+Y29udGVudFswXSktPndoaWNoRWxlbWVudC5sb2NhdG9yLmZpbGVOYW1lKTsKKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlHZXRMb2NhdG9yRmlsZW5hbWUgKi8KKworCisvKgorKiogdHVpVXBkYXRlTG9jYXRvckluZm9Gcm9tRnJhbWUoKS4KKyoqICAgICAgICBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIGxvY2F0b3IsIHdpdGggdGhlIGluZm9ybWF0aW9uIGV4dHJhY3RlZCBmcm9tIGZyYW1lSW5mbworKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpVXBkYXRlTG9jYXRvckluZm9Gcm9tRnJhbWUgKAorCQkJCXN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZUluZm8sCisJCQkJVHVpTG9jYXRvckVsZW1lbnRQdHIgZWxlbWVudCkKKyNlbHNlCit0dWlVcGRhdGVMb2NhdG9ySW5mb0Zyb21GcmFtZSAoZnJhbWVJbmZvLCBlbGVtZW50KQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWVJbmZvOworICAgICBUdWlMb2NhdG9yRWxlbWVudFB0ciBlbGVtZW50OworI2VuZGlmCit7CisgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc3ltdGFiQW5kTGluZTsKKworICAvKiBub3cgZ2V0IHRoZSBuZXcgaW5mbyAqLworICBzeW10YWJBbmRMaW5lID0gZmluZF9wY19saW5lIChmcmFtZUluZm8tPnBjLAorCQkJICAgKGZyYW1lSW5mby0+bmV4dCAhPSAoc3RydWN0IGZyYW1lX2luZm8gKikgTlVMTCAmJgorCQkJICAgICFmcmFtZUluZm8tPm5leHQtPnNpZ25hbF9oYW5kbGVyX2NhbGxlciAmJgorCQkJICAgICFmcmFtZV9pbl9kdW1teSAoZnJhbWVJbmZvLT5uZXh0KSkpOworICBpZiAoc3ltdGFiQW5kTGluZS5zeW10YWIgJiYgc3ltdGFiQW5kTGluZS5zeW10YWItPmZpbGVuYW1lKQorICAgIHR1aVNldExvY2F0b3JJbmZvIChzeW10YWJBbmRMaW5lLnN5bXRhYi0+ZmlsZW5hbWUsCisJCSAgICAgICBfZ2V0RnVuY05hbWVGcm9tRnJhbWUgKGZyYW1lSW5mbyksCisJCSAgICAgICBzeW10YWJBbmRMaW5lLmxpbmUsCisJCSAgICAgICAoT3BhcXVlKSBmcmFtZUluZm8tPnBjLAorCQkgICAgICAgZWxlbWVudCk7CisgIGVsc2UKKyAgICB0dWlTZXRMb2NhdG9ySW5mbyAoKGNoYXIgKikgTlVMTCwKKwkJICAgICAgIF9nZXRGdW5jTmFtZUZyb21GcmFtZSAoZnJhbWVJbmZvKSwKKwkJICAgICAgIDAsCisJCSAgICAgICAoT3BhcXVlKSBmcmFtZUluZm8tPnBjLAorCQkgICAgICAgZWxlbWVudCk7CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlVcGRhdGVMb2NhdG9ySW5mb0Zyb21GcmFtZSAqLworCisKKy8qCisqKiB0dWlTZXRMb2NhdG9yQ29udGVudCgpLgorKiogICAgICAgIEZ1bmN0aW9uIHRvIHNldCB0aGUgY29udGVudCBvZiB0aGUgbG9jYXRvcgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpU2V0TG9jYXRvckNvbnRlbnQgKAorCQkgICAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lSW5mbykKKyNlbHNlCit0dWlTZXRMb2NhdG9yQ29udGVudCAoZnJhbWVJbmZvKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWVJbmZvOworI2VuZGlmCit7CisgIFR1aUdlbldpbkluZm9QdHIgbG9jYXRvciA9IGxvY2F0b3JXaW5JbmZvUHRyICgpOworICBUdWlXaW5FbGVtZW50UHRyIGVsZW1lbnQ7CisgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc3ltdGFiQW5kTGluZTsKKworICAvKiBBbGxvY2F0ZSB0aGUgZWxlbWVudCBpZiBuZWNlc3NhcnkgKi8KKyAgaWYgKGxvY2F0b3ItPmNvbnRlbnRTaXplIDw9IDApCisgICAgeworICAgICAgVHVpV2luQ29udGVudCBjb250ZW50UHRyOworCisgICAgICBpZiAoKGxvY2F0b3ItPmNvbnRlbnQgPSAoT3BhcXVlUHRyKSBhbGxvY0NvbnRlbnQgKDEsIGxvY2F0b3ItPnR5cGUpKSA9PSAoT3BhcXVlUHRyKSBOVUxMKQorCWVycm9yICgiVW5hYmxlIHRvIEFsbG9jYXRlIE1lbW9yeSB0byBEaXNwbGF5IExvY2F0aW9uLiIpOworICAgICAgbG9jYXRvci0+Y29udGVudFNpemUgPSAxOworICAgIH0KKworICBpZiAoZnJhbWVJbmZvICE9IChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSBOVUxMKQorICAgIHR1aVVwZGF0ZUxvY2F0b3JJbmZvRnJvbUZyYW1lIChmcmFtZUluZm8sCisJICAgJigoVHVpV2luRWxlbWVudFB0cikgbG9jYXRvci0+Y29udGVudFswXSktPndoaWNoRWxlbWVudC5sb2NhdG9yKTsKKyAgZWxzZQorICAgIHR1aVNldExvY2F0b3JJbmZvICgoY2hhciAqKSBOVUxMLAorCQkgICAgICAgKGNoYXIgKikgTlVMTCwKKwkJICAgICAgIDAsCisJCSAgICAgICAoT3BhcXVlKSBOVUxMLAorCSAgICYoKFR1aVdpbkVsZW1lbnRQdHIpIGxvY2F0b3ItPmNvbnRlbnRbMF0pLT53aGljaEVsZW1lbnQubG9jYXRvcik7CisgIHJldHVybjsKK30JCQkJLyogdHVpU2V0TG9jYXRvckNvbnRlbnQgKi8KKworCisvKgorKiogdHVpVXBkYXRlTG9jYXRvckRpc3BsYXkoKS4KKyoqICAgICAgICBGdW5jdGlvbiB0byB1cGRhdGUgdGhlIGxvY2F0b3IgZGlzcGxheQorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpVXBkYXRlTG9jYXRvckRpc3BsYXkgKAorCQkJICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWVJbmZvKQorI2Vsc2UKK3R1aVVwZGF0ZUxvY2F0b3JEaXNwbGF5IChmcmFtZUluZm8pCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZUluZm87CisjZW5kaWYKK3sKKyAgdHVpQ2xlYXJMb2NhdG9yRGlzcGxheSAoKTsKKyAgdHVpU2V0TG9jYXRvckNvbnRlbnQgKGZyYW1lSW5mbyk7CisgIHR1aVNob3dMb2NhdG9yQ29udGVudCAoKTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aVVwZGF0ZUxvY2F0b3JEaXNwbGF5ICovCisKKworLyoKKyoqIHR1aVNob3dGcmFtZUluZm8oKS4KKyoqICAgICAgICBGdW5jdGlvbiB0byBwcmludCB0aGUgZnJhbWUgaW5mb3JybWF0aW9uIGZvciB0aGUgVFVJLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpU2hvd0ZyYW1lSW5mbyAoCisJCSAgIHN0cnVjdCBmcmFtZV9pbmZvICpmaSkKKyNlbHNlCit0dWlTaG93RnJhbWVJbmZvIChmaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworI2VuZGlmCit7CisgIFR1aVdpbkluZm9QdHIgd2luSW5mbzsKKyAgcmVnaXN0ZXIgaW50IGk7CisKKyAgaWYgKGZpKQorICAgIHsKKyAgICAgIHJlZ2lzdGVyIGludCBzdGFydExpbmUsIGk7CisgICAgICByZWdpc3RlciBzdHJ1Y3Qgc3ltdGFiICpzOworICAgICAgQ09SRV9BRERSIGxvdzsKKyAgICAgIFR1aUdlbldpbkluZm9QdHIgbG9jYXRvciA9IGxvY2F0b3JXaW5JbmZvUHRyICgpOworICAgICAgaW50IHNvdXJjZUFscmVhZHlEaXNwbGF5ZWQ7CisKKworICAgICAgcyA9IGZpbmRfcGNfc3ltdGFiIChmaS0+cGMpOworICAgICAgc291cmNlQWxyZWFkeURpc3BsYXllZCA9IHR1aVNvdXJjZUlzRGlzcGxheWVkIChzLT5maWxlbmFtZSk7CisgICAgICB0dWlVcGRhdGVMb2NhdG9yRGlzcGxheSAoZmkpOworICAgICAgZm9yIChpID0gMDsgaSA8IChzb3VyY2VXaW5kb3dzICgpKS0+Y291bnQ7IGkrKykKKwl7CisJICB3aW5JbmZvID0gKFR1aVdpbkluZm9QdHIpIChzb3VyY2VXaW5kb3dzICgpKS0+bGlzdFtpXTsKKwkgIGlmICh3aW5JbmZvID09IHNyY1dpbikKKwkgICAgeworCSAgICAgIHN0YXJ0TGluZSA9CisJCSgoKFR1aVdpbkVsZW1lbnRQdHIpIGxvY2F0b3ItPmNvbnRlbnRbMF0pLT53aGljaEVsZW1lbnQubG9jYXRvci5saW5lTm8gLQorCQkgKHdpbkluZm8tPmdlbmVyaWMudmlld3BvcnRIZWlnaHQgLyAyKSkgKyAxOworCSAgICAgIGlmIChzdGFydExpbmUgPD0gMCkKKwkJc3RhcnRMaW5lID0gMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAoZmktPnBjLCAoY2hhciAqKikgTlVMTCwgJmxvdywgKENPUkVfQUREUikgTlVMTCkgPT0gMCkKKwkJZXJyb3IgKCJObyBmdW5jdGlvbiBjb250YWlucyBwcm9ncmFtIGNvdW50ZXIgZm9yIHNlbGVjdGVkIGZyYW1lLlxuIik7CisJICAgICAgZWxzZQorCQlsb3cgPSAoQ09SRV9BRERSKSB0dWlHZXRMb3dEaXNhc3NlbWJseUFkZHJlc3MgKChPcGFxdWUpIGxvdywgKE9wYXF1ZSkgZmktPnBjKTsKKwkgICAgfQorCisJICBpZiAod2luSW5mbyA9PSBzcmNXaW4pCisJICAgIHsKKwkgICAgICBpZiAoIShzb3VyY2VBbHJlYWR5RGlzcGxheWVkICYmIG1fdHVpTGluZURpc3BsYXllZFdpdGhpblRocmVzaG9sZCAoCisJCQkJCQkJCSAgICB3aW5JbmZvLAorCQkJCQkJCQkJCSAgKChUdWlXaW5FbGVtZW50UHRyKSBsb2NhdG9yLT5jb250ZW50WzBdKS0+d2hpY2hFbGVtZW50LmxvY2F0b3IubGluZU5vKSkpCisJCXR1aVVwZGF0ZVNvdXJjZVdpbmRvdyAod2luSW5mbywgcywgKE9wYXF1ZSkgc3RhcnRMaW5lLCBUUlVFKTsKKwkgICAgICBlbHNlCisJCXR1aVNldElzRXhlY1BvaW50QXQgKChPcGFxdWUpCisJCQkJICAgICAoKFR1aVdpbkVsZW1lbnRQdHIpIGxvY2F0b3ItPmNvbnRlbnRbMF0pLT53aGljaEVsZW1lbnQubG9jYXRvci5saW5lTm8sCisJCQkJICAgICB3aW5JbmZvKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKHdpbkluZm8gPT0gZGlzYXNzZW1XaW4pCisJCXsKKwkJICBpZiAoIW1fdHVpTGluZURpc3BsYXllZFdpdGhpblRocmVzaG9sZCAod2luSW5mbywKKwkJCQkJCQkgICgoVHVpV2luRWxlbWVudFB0cikgbG9jYXRvci0+Y29udGVudFswXSktPndoaWNoRWxlbWVudC5sb2NhdG9yLmFkZHIpKQorCQkgICAgdHVpVXBkYXRlU291cmNlV2luZG93ICh3aW5JbmZvLCBzLCAoT3BhcXVlKSBsb3csIFRSVUUpOworCQkgIGVsc2UKKwkJICAgIHR1aVNldElzRXhlY1BvaW50QXQgKChPcGFxdWUpCisJCQkJCSAoKFR1aVdpbkVsZW1lbnRQdHIpIGxvY2F0b3ItPmNvbnRlbnRbMF0pLT53aGljaEVsZW1lbnQubG9jYXRvci5hZGRyLAorCQkJCQkgd2luSW5mbyk7CisJCX0KKwkgICAgfQorCSAgdHVpVXBkYXRlRXhlY0luZm8gKHdpbkluZm8pOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB0dWlVcGRhdGVMb2NhdG9yRGlzcGxheSAoZmkpOworICAgICAgZm9yIChpID0gMDsgaSA8IChzb3VyY2VXaW5kb3dzICgpKS0+Y291bnQ7IGkrKykKKwl7CisJICB3aW5JbmZvID0gKFR1aVdpbkluZm9QdHIpIChzb3VyY2VXaW5kb3dzICgpKS0+bGlzdFtpXTsKKwkgIHR1aUNsZWFyU291cmNlQ29udGVudCAod2luSW5mbywgRU1QVFlfU09VUkNFX1BST01QVCk7CisJICB0dWlVcGRhdGVFeGVjSW5mbyAod2luSW5mbyk7CisJfQorICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIHR1aVNob3dGcmFtZUluZm8gKi8KKworCisvKgorKiogdHVpX3ZTaG93RnJhbWVJbmZvKCkuCisqKiAgICAgICAgRnVuY3Rpb24gdG8gcHJpbnQgdGhlIGZyYW1lIGluZm9ycm1hdGlvbiBmb3IgdGhlIFRVSSB3aXRoIGFyZ3MgaW4gYSB2YV9saXN0LgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpX3ZTaG93RnJhbWVJbmZvICgKKwkJICAgICB2YV9saXN0IGFyZ3MpCisjZWxzZQordHVpX3ZTaG93RnJhbWVJbmZvIChhcmdzKQorICAgICB2YV9saXN0IGFyZ3M7CisjZW5kaWYKK3sKKyAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworCisgIGZpID0gdmFfYXJnIChhcmdzLCBzdHJ1Y3QgZnJhbWVfaW5mbyAqKTsKKyAgdHVpU2hvd0ZyYW1lSW5mbyAoZmkpOworCisgIHJldHVybjsKK30JCQkJLyogdHVpX3ZTaG93RnJhbWVJbmZvICovCisKKworLyoKKyoqIF9pbml0aWFsaXplX3R1aVN0YWNrKCkuCisqKiAgICAgIEZ1bmN0aW9uIHRvIGluaXRpYWxpemUgZ2RiIGNvbW1hbmRzLCBmb3IgdHVpIHdpbmRvdyBzdGFjayBtYW5pcHVsYXRpb24uCisqLwordm9pZAorX2luaXRpYWxpemVfdHVpU3RhY2sgKCkKK3sKKyAgaWYgKHR1aV92ZXJzaW9uKQorICAgIHsKKyAgICAgIGFkZF9jb20gKCJ1cGRhdGUiLCBjbGFzc190dWksIF90dWlVcGRhdGVMb2NhdGlvbl9jb21tYW5kLAorCSAgICAgICAiVXBkYXRlIHRoZSBzb3VyY2Ugd2luZG93IGFuZCBsb2NhdG9yIHRvIGRpc3BsYXkgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIHBvaW50LlxuIik7CisgICAgfQorCisgIHJldHVybjsKK30JCQkJLyogX2luaXRpYWxpemVfdHVpU3RhY2sgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFNUQVRJQyBMT0NBTCBGVU5DVElPTlMgICAgICAgICAgICAgICAgICoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisqKiAgICBfZ2V0RnVuY05hbWVGcm9tRnJhbWUoKS4KKyovCitzdGF0aWMgY2hhciAqCisjaWZkZWYgX19TVERDX18KK19nZXRGdW5jTmFtZUZyb21GcmFtZSAoCisJCQlzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWVJbmZvKQorI2Vsc2UKK19nZXRGdW5jTmFtZUZyb21GcmFtZSAoZnJhbWVJbmZvKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWVJbmZvOworI2VuZGlmCit7CisgIGNoYXIgKmZ1bmNOYW1lID0gKGNoYXIgKikgTlVMTDsKKworICBmaW5kX3BjX3BhcnRpYWxfZnVuY3Rpb24gKGZyYW1lSW5mby0+cGMsCisJCQkgICAgJmZ1bmNOYW1lLAorCQkJICAgIChDT1JFX0FERFIgKikgTlVMTCwKKwkJCSAgICAoQ09SRV9BRERSICopIE5VTEwpOworICByZXR1cm4gZnVuY05hbWU7Cit9CQkJCS8qIF9nZXRGdW5jTmFtZUZyb21GcmFtZSAqLworCisKKy8qCisqKiBfdHVpVXBkYXRlTG9jYXRpb25fY29tbWFuZCgpLgorKiogICAgICAgIENvbW1hbmQgdG8gdXBkYXRlIHRoZSBkaXNwbGF5IHdpdGggdGhlIGN1cnJlbnQgZXhlY3V0aW9uIHBvaW50CisqLworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aVVwZGF0ZUxvY2F0aW9uX2NvbW1hbmQgKAorCQkJICAgICBjaGFyICphcmcsCisJCQkgICAgIGludCBmcm9tVFRZKQorI2Vsc2UKK190dWlVcGRhdGVMb2NhdGlvbl9jb21tYW5kIChhcmcsIGZyb21UVFkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21UVFk7CisjZW5kaWYKK3sKKyNpZm5kZWYgVFJZCisgIGV4dGVybiB2b2lkIGZyYW1lX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKyAgZnJhbWVfY29tbWFuZCAoIjAiLCBGQUxTRSk7CisjZWxzZQorICBzdHJ1Y3QgZnJhbWVfaW5mbyAqY3VyRnJhbWU7CisKKyAgLyogT2J0YWluIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBwb2ludCAqLworICBpZiAoKGN1ckZyYW1lID0gZ2V0X2N1cnJlbnRfZnJhbWUgKCkpICE9IChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKKyAgICAgIGludCBjdXJMZXZlbCA9IDA7CisKKyAgICAgIGZvciAoZnJhbWUgPSBnZXRfcHJldl9mcmFtZSAoY3VyTGV2ZWwpOworCSAgIChmcmFtZSAhPSAoc3RydWN0IGZyYW1lX2luZm8gKikgTlVMTCAmJiAoZnJhbWUgIT0gY3VyRnJhbWUpKTsKKwkgICBmcmFtZSA9IGdldF9wcmV2X2ZyYW1lIChmcmFtZSkpCisJY3VyTGV2ZWwrKzsKKworICAgICAgaWYgKGN1ckZyYW1lICE9IChzdHJ1Y3QgZnJhbWVfaW5mbyAqKSBOVUxMKQorCXByaW50X2ZyYW1lX2luZm8gKGZyYW1lLCBjdXJMZXZlbCwgMCwgMSk7CisgICAgfQorI2VuZGlmCisKKyAgcmV0dXJuOworfQkJCQkvKiBfdHVpVXBkYXRlTG9jYXRpb25fY29tbWFuZCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3R1aS90dWlTdGFjay5oIGIvZ2RiL3R1aS90dWlTdGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZTlhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdHVpL3R1aVN0YWNrLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfVFVJX1NUQUNLX0gKKyNkZWZpbmUgX1RVSV9TVEFDS19ICisvKgorKiogVGhpcyBoZWFkZXIgZmlsZSBzdXBwb3J0cworKi8KKworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlTZXRMb2NhdG9ySW5mbyBQQVJBTVMgKChjaGFyICosIGNoYXIgKiwgaW50LCBPcGFxdWUsIFR1aUxvY2F0b3JFbGVtZW50UHRyKSk7CitleHRlcm4gdm9pZCAgICAgICAgIHR1aVVwZGF0ZUxvY2F0b3JGaWxlbmFtZSBQQVJBTVMgKChjaGFyICopKTsKK2V4dGVybiB2b2lkICAgICAgICAgdHVpX3ZVcGRhdGVMb2NhdG9yRmlsZW5hbWUgUEFSQU1TICgodmFfbGlzdCkpOworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlVcGRhdGVMb2NhdG9ySW5mb0Zyb21GcmFtZSAKKyAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICosIFR1aUxvY2F0b3JFbGVtZW50UHRyKSk7CitleHRlcm4gdm9pZCAgICAgICAgIHR1aVVwZGF0ZUxvY2F0b3JEaXNwbGF5IFBBUkFNUyAoKHN0cnVjdCBmcmFtZV9pbmZvICopKTsKK2V4dGVybiB2b2lkICAgICAgICAgdHVpU2V0TG9jYXRvckNvbnRlbnQgUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlTaG93TG9jYXRvckNvbnRlbnQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlDbGVhckxvY2F0b3JDb250ZW50IFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgdHVpU3dpdGNoRmlsZW5hbWUgUEFSQU1TICgoY2hhciAqKSk7CitleHRlcm4gdm9pZCAgICAgICAgIHR1aVNob3dGcmFtZUluZm8gUEFSQU1TICgoc3RydWN0IGZyYW1lX2luZm8gKikpOworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlfdlNob3dGcmFtZUluZm8gUEFSQU1TICgodmFfbGlzdCkpOworZXh0ZXJuIHZvaWQgICAgICAgICB0dWlHZXRMb2NhdG9yRmlsZW5hbWUgUEFSQU1TICgoVHVpR2VuV2luSW5mb1B0ciwgY2hhciAqKikpOworCisKKyNlbmRpZiAvKl9UVUlfU1RBQ0tfSCovCmRpZmYgLS1naXQgYS9nZGIvdHVpL3R1aVdpbi5jIGIvZ2RiL3R1aS90dWlXaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWJiMGY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3R1aS90dWlXaW4uYwpAQCAtMCwwICsxLDE2NTAgQEAKKy8qCisqKiB0dWlXaW4uYworKiogICAgVGhpcyBtb2R1bGUgY29udGFpbnMgcHJvY2VkdXJlcyBmb3IgaGFuZGxpbmcgdHVpIHdpbmRvdyBmdW5jdGlvbnMKKyoqICAgIGxpa2UgcmVzaXplLCBzY3JvbGxpbmcsIHNjcm9sbGluZywgY2hhbmdpbmcgZm9jdXMsIGV0Yy4KKyoqCisqKiBBdXRob3I6IFN1c2FuIEIuIE1hY2NoaWEKKyovCisKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJjb21tYW5kLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiYnJlYWtwb2ludC5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisKKyNpbmNsdWRlICJ0dWkuaCIKKyNpbmNsdWRlICJ0dWlEYXRhLmgiCisjaW5jbHVkZSAidHVpR2VuZXJhbFdpbi5oIgorI2luY2x1ZGUgInR1aVN0YWNrLmgiCisjaW5jbHVkZSAidHVpU291cmNlV2luLmgiCisjaW5jbHVkZSAidHVpRGF0YVdpbi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRXh0ZXJuYWwgRGVjbGFyYXRpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiB2b2lkIGluaXRfcGFnZV9pbmZvICgpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogU3RhdGljIExvY2FsIERlY2xzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9tYWtlVmlzaWJsZVdpdGhOZXdIZWlnaHQgUEFSQU1TICgoVHVpV2luSW5mb1B0cikpOworc3RhdGljIHZvaWQgX21ha2VJbnZpc2libGVBbmRTZXROZXdIZWlnaHQgUEFSQU1TICgoVHVpV2luSW5mb1B0ciwgaW50KSk7CitzdGF0aWMgVHVpU3RhdHVzIF90dWlBZGp1c3RXaW5IZWlnaHRzIFBBUkFNUyAoKFR1aVdpbkluZm9QdHIsIGludCkpOworc3RhdGljIGludCBfbmV3SGVpZ2h0T2sgUEFSQU1TICgoVHVpV2luSW5mb1B0ciwgaW50KSk7CitzdGF0aWMgdm9pZCBfdHVpU2V0VGFiV2lkdGhfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworc3RhdGljIHZvaWQgX3R1aVJlZnJlc2hBbGxfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworc3RhdGljIHZvaWQgX3R1aVNldFdpbkhlaWdodF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBfdHVpWERCc2V0V2luSGVpZ2h0X2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIF90dWlBbGxXaW5kb3dzSW5mbyBQQVJBTVMgKChjaGFyICosIGludCkpOworc3RhdGljIHZvaWQgX3R1aVNldEZvY3VzX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIF90dWlTY3JvbGxGb3J3YXJkX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIF90dWlTY3JvbGxCYWNrd2FyZF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBfdHVpU2Nyb2xsTGVmdF9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CitzdGF0aWMgdm9pZCBfdHVpU2Nyb2xsUmlnaHRfY29tbWFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOworc3RhdGljIHZvaWQgX3BhcnNlU2Nyb2xsaW5nQXJncyBQQVJBTVMgKChjaGFyICosIFR1aVdpbkluZm9QdHIgKiwgaW50ICopKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBXSU5fSEVJR0hUX1VTQUdFICAgICAgIlVzYWdlOiB3aW5oZWlnaHQgPHdpbl9uYW1lPiBbKyB8IC1dIDwjbGluZXM+XG4iCisjZGVmaW5lIFhEQldJTl9IRUlHSFRfVVNBR0UgICAiVXNhZ2U6IHcgPCNsaW5lcz5cbiIKKyNkZWZpbmUgRk9DVVNfVVNBR0UgICAgICAgICAgICJVc2FnZTogZm9jdXMgezx3aW4+IHwgbmV4dCB8IHByZXZ9XG4iCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFBVQkxJQyBGVU5DVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyoqIF9pbml0aWFsaXplX3R1aVdpbigpLgorKiogICAgICAgIEZ1bmN0aW9uIHRvIGluaXRpYWxpemUgZ2RiIGNvbW1hbmRzLCBmb3IgdHVpIHdpbmRvdyBtYW5pcHVsYXRpb24uCisqLwordm9pZAorX2luaXRpYWxpemVfdHVpV2luICgpCit7CisgIGlmICh0dWlfdmVyc2lvbikKKyAgICB7CisgICAgICBhZGRfY29tICgicmVmcmVzaCIsIGNsYXNzX3R1aSwgX3R1aVJlZnJlc2hBbGxfY29tbWFuZCwKKwkgICAgICAgIlJlZnJlc2ggdGhlIHRlcm1pbmFsIGRpc3BsYXkuXG4iKTsKKyAgICAgIGlmICh4ZGJfY29tbWFuZHMpCisJYWRkX2NvbV9hbGlhcyAoIlUiLCAicmVmcmVzaCIsIGNsYXNzX3R1aSwgMCk7CisgICAgICBhZGRfY29tICgidGFic2V0IiwgY2xhc3NfdHVpLCBfdHVpU2V0VGFiV2lkdGhfY29tbWFuZCwKKwkgICAgICAgIlNldCB0aGUgd2lkdGggKGluIGNoYXJhY3RlcnMpIG9mIHRhYiBzdG9wcy5cblwKK1VzYWdlOiB0YWJzZXQgPG4+XG4iKTsKKyAgICAgIGFkZF9jb20gKCJ3aW5oZWlnaHQiLCBjbGFzc190dWksIF90dWlTZXRXaW5IZWlnaHRfY29tbWFuZCwKKwkgICAgICAgIlNldCB0aGUgaGVpZ2h0IG9mIGEgc3BlY2lmaWVkIHdpbmRvdy5cblwKK1VzYWdlOiB3aW5oZWlnaHQgPHdpbl9uYW1lPiBbKyB8IC1dIDwjbGluZXM+XG5cCitXaW5kb3cgbmFtZXMgYXJlOlxuXAorc3JjICA6IHRoZSBzb3VyY2Ugd2luZG93XG5cCitjbWQgIDogdGhlIGNvbW1hbmQgd2luZG93XG5cCithc20gIDogdGhlIGRpc2Fzc2VtYmx5IHdpbmRvd1xuXAorcmVncyA6IHRoZSByZWdpc3RlciBkaXNwbGF5XG4iKTsKKyAgICAgIGFkZF9jb21fYWxpYXMgKCJ3aCIsICJ3aW5oZWlnaHQiLCBjbGFzc190dWksIDApOworICAgICAgYWRkX2luZm8gKCJ3aW4iLCBfdHVpQWxsV2luZG93c0luZm8sCisJCSJMaXN0IG9mIGFsbCBkaXNwbGF5ZWQgd2luZG93cy5cbiIpOworICAgICAgYWRkX2NvbSAoImZvY3VzIiwgY2xhc3NfdHVpLCBfdHVpU2V0Rm9jdXNfY29tbWFuZCwKKwkgICAgICAgIlNldCBmb2N1cyB0byBuYW1lZCB3aW5kb3cgb3IgbmV4dC9wcmV2IHdpbmRvdy5cblwKK1VzYWdlOiBmb2N1cyB7PHdpbj4gfCBuZXh0IHwgcHJldn1cblwKK1ZhbGlkIFdpbmRvdyBuYW1lcyBhcmU6XG5cCitzcmMgIDogdGhlIHNvdXJjZSB3aW5kb3dcblwKK2FzbSAgOiB0aGUgZGlzYXNzZW1ibHkgd2luZG93XG5cCityZWdzIDogdGhlIHJlZ2lzdGVyIGRpc3BsYXlcblwKK2NtZCAgOiB0aGUgY29tbWFuZCB3aW5kb3dcbiIpOworICAgICAgYWRkX2NvbV9hbGlhcyAoImZzIiwgImZvY3VzIiwgY2xhc3NfdHVpLCAwKTsKKyAgICAgIGFkZF9jb20gKCIrIiwgY2xhc3NfdHVpLCBfdHVpU2Nyb2xsRm9yd2FyZF9jb21tYW5kLAorCSAgICAgICAiU2Nyb2xsIHdpbmRvdyBmb3J3YXJkLlxuVXNhZ2U6ICsgW3dpbl0gW25dXG4iKTsKKyAgICAgIGFkZF9jb20gKCItIiwgY2xhc3NfdHVpLCBfdHVpU2Nyb2xsQmFja3dhcmRfY29tbWFuZCwKKwkgICAgICAgIlNjcm9sbCB3aW5kb3cgYmFja3dhcmQuXG5Vc2FnZTogLSBbd2luXSBbbl1cbiIpOworICAgICAgYWRkX2NvbSAoIjwiLCBjbGFzc190dWksIF90dWlTY3JvbGxMZWZ0X2NvbW1hbmQsCisJICAgICAgICJTY3JvbGwgd2luZG93IGZvcndhcmQuXG5Vc2FnZTogPCBbd2luXSBbbl1cbiIpOworICAgICAgYWRkX2NvbSAoIj4iLCBjbGFzc190dWksIF90dWlTY3JvbGxSaWdodF9jb21tYW5kLAorCSAgICAgICAiU2Nyb2xsIHdpbmRvdyBiYWNrd2FyZC5cblVzYWdlOiA+IFt3aW5dIFtuXVxuIik7CisgICAgICBpZiAoeGRiX2NvbW1hbmRzKQorCWFkZF9jb20gKCJ3IiwgY2xhc3NfeGRiLCBfdHVpWERCc2V0V2luSGVpZ2h0X2NvbW1hbmQsCisJCSAiWERCIGNvbXBhdGliaWxpdHkgY29tbWFuZCBmb3Igc2V0dGluZyB0aGUgaGVpZ2h0IG9mIGEgY29tbWFuZCB3aW5kb3cuXG5cCitVc2FnZTogdyA8I2xpbmVzPlxuIik7CisgICAgfQorCisgIHJldHVybjsKK30JCQkJLyogX2ludGlhbGl6ZV90dWlXaW4gKi8KKworCisvKgorKiogdHVpQ2xlYXJXaW5Gb2N1c0Zyb20KKyoqICAgICAgICBDbGVhciB0aGUgbG9naWNhbCBmb2N1cyBmcm9tIHdpbkluZm8KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aUNsZWFyV2luRm9jdXNGcm9tICgKKwkJICAgICAgIFR1aVdpbkluZm9QdHIgd2luSW5mbykKKyNlbHNlCit0dWlDbGVhcldpbkZvY3VzRnJvbSAod2luSW5mbykKKyAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvOworI2VuZGlmCit7CisgIGlmIChtX3dpblB0ck5vdE51bGwgKHdpbkluZm8pKQorICAgIHsKKyAgICAgIGlmICh3aW5JbmZvLT5nZW5lcmljLnR5cGUgIT0gQ01EX1dJTikKKwl1bmhpZ2hsaWdodFdpbiAod2luSW5mbyk7CisgICAgICB0dWlTZXRXaW5XaXRoRm9jdXMgKChUdWlXaW5JbmZvUHRyKSBOVUxMKTsKKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiB0dWlDbGVhcldpbkZvY3VzRnJvbSAqLworCisKKy8qCisqKiB0dWlDbGVhcldpbkZvY3VzKCkuCisqKiAgICAgICAgQ2xlYXIgdGhlIHdpbmRvdyB0aGF0IGhhcyBmb2N1cy4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aUNsZWFyV2luRm9jdXMgKHZvaWQpCisjZWxzZQordHVpQ2xlYXJXaW5Gb2N1cyAoKQorI2VuZGlmCit7CisgIHR1aUNsZWFyV2luRm9jdXNGcm9tICh0dWlXaW5XaXRoRm9jdXMgKCkpOworCisgIHJldHVybjsKK30JCQkJLyogdHVpQ2xlYXJXaW5Gb2N1cyAqLworCisKKy8qCisqKiB0dWlTZXRXaW5Gb2N1c1RvCisqKiAgICAgICAgU2V0IHRoZSBsb2dpY2FsIGZvY3VzIHRvIHdpbkluZm8KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aVNldFdpbkZvY3VzVG8gKAorCQkgICBUdWlXaW5JbmZvUHRyIHdpbkluZm8pCisjZWxzZQordHVpU2V0V2luRm9jdXNUbyAod2luSW5mbykKKyAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvOworI2VuZGlmCit7CisgIGlmIChtX3dpblB0ck5vdE51bGwgKHdpbkluZm8pKQorICAgIHsKKyAgICAgIFR1aVdpbkluZm9QdHIgd2luV2l0aEZvY3VzID0gdHVpV2luV2l0aEZvY3VzICgpOworCisgICAgICBpZiAobV93aW5QdHJOb3ROdWxsICh3aW5XaXRoRm9jdXMpICYmCisJICB3aW5XaXRoRm9jdXMtPmdlbmVyaWMudHlwZSAhPSBDTURfV0lOKQorCXVuaGlnaGxpZ2h0V2luICh3aW5XaXRoRm9jdXMpOworICAgICAgdHVpU2V0V2luV2l0aEZvY3VzICh3aW5JbmZvKTsKKyAgICAgIGlmICh3aW5JbmZvLT5nZW5lcmljLnR5cGUgIT0gQ01EX1dJTikKKwloaWdobGlnaHRXaW4gKHdpbkluZm8pOworICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIHR1aVNldFdpbkZvY3VzVG8gKi8KKworCitjaGFyICoKKyNpZmRlZiBfX1NURENfXwordHVpU3RyRHVwICgKKwkgICAgY2hhciAqc3RyKQorI2Vsc2UKK3R1aVN0ckR1cCAoc3RyKQorICAgICBjaGFyICpzdHI7CisjZW5kaWYKK3sKKyAgY2hhciAqbmV3U3RyID0gKGNoYXIgKikgTlVMTDsKKworICBpZiAoc3RyICE9IChjaGFyICopIE5VTEwpCisgICAgeworICAgICAgbmV3U3RyID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzdHIpICsgMSk7CisgICAgICBzdHJjcHkgKG5ld1N0ciwgc3RyKTsKKyAgICB9CisKKyAgcmV0dXJuIG5ld1N0cjsKK30JCQkJLyogdHVpU3RyRHVwICovCisKKworLyoKKyoqIHR1aVNjcm9sbEZvcndhcmQoKS4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aVNjcm9sbEZvcndhcmQgKAorCQkgICBUdWlXaW5JbmZvUHRyIHdpblRvU2Nyb2xsLAorCQkgICBpbnQgbnVtVG9TY3JvbGwpCisjZWxzZQordHVpU2Nyb2xsRm9yd2FyZCAod2luVG9TY3JvbGwsIG51bVRvU2Nyb2xsKQorICAgICBUdWlXaW5JbmZvUHRyIHdpblRvU2Nyb2xsOworICAgICBpbnQgbnVtVG9TY3JvbGw7CisjZW5kaWYKK3sKKyAgaWYgKHdpblRvU2Nyb2xsICE9IGNtZFdpbikKKyAgICB7CisgICAgICBpbnQgX251bVRvU2Nyb2xsID0gbnVtVG9TY3JvbGw7CisKKyAgICAgIGlmIChudW1Ub1Njcm9sbCA9PSAwKQorCV9udW1Ub1Njcm9sbCA9IHdpblRvU2Nyb2xsLT5nZW5lcmljLmhlaWdodCAtIDM7CisgICAgICAvKgorICAgICAgICAqKiBJZiB3ZSBhcmUgc2Nyb2xsaW5nIHRoZSBzb3VyY2Ugb3IgZGlzYXNzZW1ibHkgd2luZG93LCBkbyBhCisgICAgICAgICoqICJwc3VlZG8iIHNjcm9sbCBzaW5jZSBub3QgYWxsIG9mIHRoZSBzb3VyY2UgaXMgaW4gbWVtb3J5LAorICAgICAgICAqKiBvbmx5IHdoYXQgaXMgaW4gdGhlIHZpZXdwb3J0LiAgSWYgd2luVG9TY3JvbGwgaXMgdGhlCisgICAgICAgICoqIGNvbW1hbmQgd2luZG93IGRvIG5vdGhpbmcgc2luY2UgdGhlIHRlcm0gc2hvdWxkIGhhbmRsZSBpdC4KKyAgICAgICAgKi8KKyAgICAgIGlmICh3aW5Ub1Njcm9sbCA9PSBzcmNXaW4pCisJdHVpVmVydGljYWxTb3VyY2VTY3JvbGwgKEZPUldBUkRfU0NST0xMLCBfbnVtVG9TY3JvbGwpOworICAgICAgZWxzZSBpZiAod2luVG9TY3JvbGwgPT0gZGlzYXNzZW1XaW4pCisJdHVpVmVydGljYWxEaXNhc3NlbVNjcm9sbCAoRk9SV0FSRF9TQ1JPTEwsIF9udW1Ub1Njcm9sbCk7CisgICAgICBlbHNlIGlmICh3aW5Ub1Njcm9sbCA9PSBkYXRhV2luKQorCXR1aVZlcnRpY2FsRGF0YVNjcm9sbCAoRk9SV0FSRF9TQ1JPTEwsIF9udW1Ub1Njcm9sbCk7CisgICAgfQorCisgIHJldHVybjsKK30JCQkJLyogdHVpU2Nyb2xsRm9yd2FyZCAqLworCisKKy8qCisqKiB0dWlTY3JvbGxCYWNrd2FyZCgpLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpU2Nyb2xsQmFja3dhcmQgKAorCQkgICAgVHVpV2luSW5mb1B0ciB3aW5Ub1Njcm9sbCwKKwkJICAgIGludCBudW1Ub1Njcm9sbCkKKyNlbHNlCit0dWlTY3JvbGxCYWNrd2FyZCAod2luVG9TY3JvbGwsIG51bVRvU2Nyb2xsKQorICAgICBUdWlXaW5JbmZvUHRyIHdpblRvU2Nyb2xsOworICAgICBpbnQgbnVtVG9TY3JvbGw7CisjZW5kaWYKK3sKKyAgaWYgKHdpblRvU2Nyb2xsICE9IGNtZFdpbikKKyAgICB7CisgICAgICBpbnQgX251bVRvU2Nyb2xsID0gbnVtVG9TY3JvbGw7CisKKyAgICAgIGlmIChudW1Ub1Njcm9sbCA9PSAwKQorCV9udW1Ub1Njcm9sbCA9IHdpblRvU2Nyb2xsLT5nZW5lcmljLmhlaWdodCAtIDM7CisgICAgICAvKgorICAgICAgICAqKiBJZiB3ZSBhcmUgc2Nyb2xsaW5nIHRoZSBzb3VyY2Ugb3IgZGlzYXNzZW1ibHkgd2luZG93LCBkbyBhCisgICAgICAgICoqICJwc3VlZG8iIHNjcm9sbCBzaW5jZSBub3QgYWxsIG9mIHRoZSBzb3VyY2UgaXMgaW4gbWVtb3J5LAorICAgICAgICAqKiBvbmx5IHdoYXQgaXMgaW4gdGhlIHZpZXdwb3J0LiAgSWYgd2luVG9TY3JvbGwgaXMgdGhlCisgICAgICAgICoqIGNvbW1hbmQgd2luZG93IGRvIG5vdGhpbmcgc2luY2UgdGhlIHRlcm0gc2hvdWxkIGhhbmRsZSBpdC4KKyAgICAgICAgKi8KKyAgICAgIGlmICh3aW5Ub1Njcm9sbCA9PSBzcmNXaW4pCisJdHVpVmVydGljYWxTb3VyY2VTY3JvbGwgKEJBQ0tXQVJEX1NDUk9MTCwgX251bVRvU2Nyb2xsKTsKKyAgICAgIGVsc2UgaWYgKHdpblRvU2Nyb2xsID09IGRpc2Fzc2VtV2luKQorCXR1aVZlcnRpY2FsRGlzYXNzZW1TY3JvbGwgKEJBQ0tXQVJEX1NDUk9MTCwgX251bVRvU2Nyb2xsKTsKKyAgICAgIGVsc2UgaWYgKHdpblRvU2Nyb2xsID09IGRhdGFXaW4pCisJdHVpVmVydGljYWxEYXRhU2Nyb2xsIChCQUNLV0FSRF9TQ1JPTEwsIF9udW1Ub1Njcm9sbCk7CisgICAgfQorICByZXR1cm47Cit9CQkJCS8qIHR1aVNjcm9sbEJhY2t3YXJkICovCisKKworLyoKKyoqIHR1aVNjcm9sbExlZnQoKS4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aVNjcm9sbExlZnQgKAorCQlUdWlXaW5JbmZvUHRyIHdpblRvU2Nyb2xsLAorCQlpbnQgbnVtVG9TY3JvbGwpCisjZWxzZQordHVpU2Nyb2xsTGVmdCAod2luVG9TY3JvbGwsIG51bVRvU2Nyb2xsKQorICAgICBUdWlXaW5JbmZvUHRyIHdpblRvU2Nyb2xsOworICAgICBpbnQgbnVtVG9TY3JvbGw7CisjZW5kaWYKK3sKKyAgaWYgKHdpblRvU2Nyb2xsICE9IGNtZFdpbikKKyAgICB7CisgICAgICBpbnQgX251bVRvU2Nyb2xsID0gbnVtVG9TY3JvbGw7CisKKyAgICAgIGlmIChfbnVtVG9TY3JvbGwgPT0gMCkKKwlfbnVtVG9TY3JvbGwgPSAxOworICAgICAgLyoKKyAgICAgICAgKiogSWYgd2UgYXJlIHNjcm9sbGluZyB0aGUgc291cmNlIG9yIGRpc2Fzc2VtYmx5IHdpbmRvdywgZG8gYQorICAgICAgICAqKiAicHN1ZWRvIiBzY3JvbGwgc2luY2Ugbm90IGFsbCBvZiB0aGUgc291cmNlIGlzIGluIG1lbW9yeSwKKyAgICAgICAgKiogb25seSB3aGF0IGlzIGluIHRoZSB2aWV3cG9ydC4gSWYgd2luVG9TY3JvbGwgaXMgdGhlCisgICAgICAgICoqIGNvbW1hbmQgd2luZG93IGRvIG5vdGhpbmcgc2luY2UgdGhlIHRlcm0gc2hvdWxkIGhhbmRsZSBpdC4KKyAgICAgICAgKi8KKyAgICAgIGlmICh3aW5Ub1Njcm9sbCA9PSBzcmNXaW4gfHwgd2luVG9TY3JvbGwgPT0gZGlzYXNzZW1XaW4pCisJdHVpSG9yaXpvbnRhbFNvdXJjZVNjcm9sbCAod2luVG9TY3JvbGwsIExFRlRfU0NST0xMLCBfbnVtVG9TY3JvbGwpOworICAgIH0KKyAgcmV0dXJuOworfQkJCQkvKiB0dWlTY3JvbGxMZWZ0ICovCisKKworLyoKKyoqIHR1aVNjcm9sbFJpZ2h0KCkuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlTY3JvbGxSaWdodCAoCisJCSBUdWlXaW5JbmZvUHRyIHdpblRvU2Nyb2xsLAorCQkgaW50IG51bVRvU2Nyb2xsKQorI2Vsc2UKK3R1aVNjcm9sbFJpZ2h0ICh3aW5Ub1Njcm9sbCwgbnVtVG9TY3JvbGwpCisgICAgIFR1aVdpbkluZm9QdHIgd2luVG9TY3JvbGw7CisgICAgIGludCBudW1Ub1Njcm9sbDsKKyNlbmRpZgoreworICBpZiAod2luVG9TY3JvbGwgIT0gY21kV2luKQorICAgIHsKKyAgICAgIGludCBfbnVtVG9TY3JvbGwgPSBudW1Ub1Njcm9sbDsKKworICAgICAgaWYgKF9udW1Ub1Njcm9sbCA9PSAwKQorCV9udW1Ub1Njcm9sbCA9IDE7CisgICAgICAvKgorICAgICAgICAqKiBJZiB3ZSBhcmUgc2Nyb2xsaW5nIHRoZSBzb3VyY2Ugb3IgZGlzYXNzZW1ibHkgd2luZG93LCBkbyBhCisgICAgICAgICoqICJwc3VlZG8iIHNjcm9sbCBzaW5jZSBub3QgYWxsIG9mIHRoZSBzb3VyY2UgaXMgaW4gbWVtb3J5LAorICAgICAgICAqKiBvbmx5IHdoYXQgaXMgaW4gdGhlIHZpZXdwb3J0LiBJZiB3aW5Ub1Njcm9sbCBpcyB0aGUKKyAgICAgICAgKiogY29tbWFuZCB3aW5kb3cgZG8gbm90aGluZyBzaW5jZSB0aGUgdGVybSBzaG91bGQgaGFuZGxlIGl0LgorICAgICAgICAqLworICAgICAgaWYgKHdpblRvU2Nyb2xsID09IHNyY1dpbiB8fCB3aW5Ub1Njcm9sbCA9PSBkaXNhc3NlbVdpbikKKwl0dWlIb3Jpem9udGFsU291cmNlU2Nyb2xsICh3aW5Ub1Njcm9sbCwgUklHSFRfU0NST0xMLCBfbnVtVG9TY3JvbGwpOworICAgIH0KKyAgcmV0dXJuOworfQkJCQkvKiB0dWlTY3JvbGxSaWdodCAqLworCisKKy8qCisqKiB0dWlfdlNjcm9sbCgpLgorKiogICAgU2Nyb2xsIGEgd2luZG93LiAgQXJndW1lbnRzIGFyZSBwYXNzZWQgdGhyb3VnaCBhIHZhX2xpc3QuCisqLwordm9pZAorI2lmZGVmIF9fU1REQ19fCit0dWlfdlNjcm9sbCAoCisJICAgICAgdmFfbGlzdCBhcmdzKQorI2Vsc2UKK3R1aV92U2Nyb2xsIChhcmdzKQorICAgICB2YV9saXN0IGFyZ3M7CisjZW5kaWYKK3sKKyAgVHVpU2Nyb2xsRGlyZWN0aW9uIGRpcmVjdGlvbiA9IHZhX2FyZyAoYXJncywgVHVpU2Nyb2xsRGlyZWN0aW9uKTsKKyAgVHVpV2luSW5mb1B0ciB3aW5Ub1Njcm9sbCA9IHZhX2FyZyAoYXJncywgVHVpV2luSW5mb1B0cik7CisgIGludCBudW1Ub1Njcm9sbCA9IHZhX2FyZyAoYXJncywgaW50KTsKKworICBzd2l0Y2ggKGRpcmVjdGlvbikKKyAgICB7CisgICAgY2FzZSBGT1JXQVJEX1NDUk9MTDoKKyAgICAgIHR1aVNjcm9sbEZvcndhcmQgKHdpblRvU2Nyb2xsLCBudW1Ub1Njcm9sbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJBQ0tXQVJEX1NDUk9MTDoKKyAgICAgIHR1aVNjcm9sbEJhY2t3YXJkICh3aW5Ub1Njcm9sbCwgbnVtVG9TY3JvbGwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMRUZUX1NDUk9MTDoKKyAgICAgIHR1aVNjcm9sbExlZnQgKHdpblRvU2Nyb2xsLCBudW1Ub1Njcm9sbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJJR0hUX1NDUk9MTDoKKyAgICAgIHR1aVNjcm9sbFJpZ2h0ICh3aW5Ub1Njcm9sbCwgbnVtVG9TY3JvbGwpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIHR1aV92U2Nyb2xsICovCisKKworLyoKKyoqIHR1aVJlZnJlc2hBbGwoKS4KKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aVJlZnJlc2hBbGwgKHZvaWQpCisjZWxzZQordHVpUmVmcmVzaEFsbCAoKQorI2VuZGlmCit7CisgIFR1aVdpblR5cGUgdHlwZTsKKworICByZWZyZXNoQWxsICh3aW5MaXN0KTsKKyAgZm9yICh0eXBlID0gU1JDX1dJTjsgdHlwZSA8IE1BWF9NQUpPUl9XSU5ET1dTOyB0eXBlKyspCisgICAgeworICAgICAgaWYgKHdpbkxpc3RbdHlwZV0tPmdlbmVyaWMuaXNWaXNpYmxlKQorCXsKKwkgIHN3aXRjaCAodHlwZSkKKwkgICAgeworCSAgICBjYXNlIFNSQ19XSU46CisJICAgIGNhc2UgRElTQVNTRU1fV0lOOgorCSAgICAgIHR1aUNsZWFyV2luICgmd2luTGlzdFt0eXBlXS0+Z2VuZXJpYyk7CisJICAgICAgaWYgKHdpbkxpc3RbdHlwZV0tPmRldGFpbC5zb3VyY2VJbmZvLmhhc0xvY2F0b3IpCisJCXR1aUNsZWFyTG9jYXRvckRpc3BsYXkgKCk7CisJICAgICAgdHVpU2hvd1NvdXJjZUNvbnRlbnQgKHdpbkxpc3RbdHlwZV0pOworCSAgICAgIGNoZWNrQW5kRGlzcGxheUhpZ2hsaWdodElmTmVlZGVkICh3aW5MaXN0W3R5cGVdKTsKKwkgICAgICB0dWlFcmFzZUV4ZWNJbmZvQ29udGVudCAod2luTGlzdFt0eXBlXSk7CisJICAgICAgdHVpVXBkYXRlRXhlY0luZm8gKHdpbkxpc3RbdHlwZV0pOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIERBVEFfV0lOOgorCSAgICAgIHR1aVJlZnJlc2hEYXRhV2luICgpOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKyAgdHVpQ2xlYXJMb2NhdG9yRGlzcGxheSAoKTsKKyAgdHVpU2hvd0xvY2F0b3JDb250ZW50ICgpOworCisgIHJldHVybjsKK30JCQkJLyogdHVpUmVmcmVzaEFsbCAqLworCisKKy8qCisqKiB0dWlSZXNpemVBbGwoKS4KKyoqICAgICAgUmVzaXplIGFsbCB0aGUgd2luZG93cyBiYXNlZCBvbiB0aGUgdGhlIHRlcm1pbmFsIHNpemUuICBUaGlzCisqKiAgICAgIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGZyb20gd2l0aGluIHRoZSByZWFkbGluZSBzaW53aW5jaCBoYW5kbGVyLgorKi8KK3ZvaWQKKyNpZmRlZiBfX1NURENfXwordHVpUmVzaXplQWxsICh2b2lkKQorI2Vsc2UKK3R1aVJlc2l6ZUFsbCAoKQorI2VuZGlmCit7CisgIGludCBoZWlnaHREaWZmLCB3aWR0aERpZmY7CisgIGV4dGVybiBpbnQgc2NyZWVuaGVpZ2h0LCBzY3JlZW53aWR0aDsJLyogaW4gcmVhZGxpbmUgKi8KKworICB3aWR0aERpZmYgPSBzY3JlZW53aWR0aCAtIHRlcm1XaWR0aCAoKTsKKyAgaGVpZ2h0RGlmZiA9IHNjcmVlbmhlaWdodCAtIHRlcm1IZWlnaHQgKCk7CisgIGlmIChoZWlnaHREaWZmIHx8IHdpZHRoRGlmZikKKyAgICB7CisgICAgICBUdWlMYXlvdXRUeXBlIGN1ckxheW91dCA9IGN1cnJlbnRMYXlvdXQgKCk7CisgICAgICBUdWlXaW5JbmZvUHRyIHdpbldpdGhGb2N1cyA9IHR1aVdpbldpdGhGb2N1cyAoKTsKKyAgICAgIFR1aVdpbkluZm9QdHIgZmlyc3RXaW4sIHNlY29uZFdpbjsKKyAgICAgIFR1aUdlbldpbkluZm9QdHIgbG9jYXRvciA9IGxvY2F0b3JXaW5JbmZvUHRyICgpOworICAgICAgVHVpV2luVHlwZSB3aW5UeXBlOworICAgICAgaW50IGksIG5ld0hlaWdodCwgc3BsaXREaWZmLCBjbWRTcGxpdERpZmYsIG51bVdpbnNEaXNwbGF5ZWQgPSAyOworCisgICAgICAvKiB0dXJuIGtleXBhZCBvZmYgd2hpbGUgd2UgcmVzaXplICovCisgICAgICBpZiAod2luV2l0aEZvY3VzICE9IGNtZFdpbikKKwlrZXlwYWQgKGNtZFdpbi0+Z2VuZXJpYy5oYW5kbGUsIEZBTFNFKTsKKyAgICAgIGluaXRfcGFnZV9pbmZvICgpOworICAgICAgc2V0VGVybUhlaWdodFRvIChzY3JlZW5oZWlnaHQpOworICAgICAgc2V0VGVybVdpZHRoVG8gKHNjcmVlbndpZHRoKTsKKyAgICAgIGlmIChjdXJMYXlvdXQgPT0gU1JDX0RJU0FTU0VNX0NPTU1BTkQgfHwKKwljdXJMYXlvdXQgPT0gU1JDX0RBVEFfQ09NTUFORCB8fCBjdXJMYXlvdXQgPT0gRElTQVNTRU1fREFUQV9DT01NQU5EKQorCW51bVdpbnNEaXNwbGF5ZWQrKzsKKyAgICAgIHNwbGl0RGlmZiA9IGhlaWdodERpZmYgLyBudW1XaW5zRGlzcGxheWVkOworICAgICAgY21kU3BsaXREaWZmID0gc3BsaXREaWZmOworICAgICAgaWYgKGhlaWdodERpZmYgJSBudW1XaW5zRGlzcGxheWVkKQorCXsKKwkgIGlmIChoZWlnaHREaWZmIDwgMCkKKwkgICAgY21kU3BsaXREaWZmLS07CisJICBlbHNlCisJICAgIGNtZFNwbGl0RGlmZisrOworCX0KKyAgICAgIC8qIG5vdyBhZGp1c3QgZWFjaCB3aW5kb3cgKi8KKyAgICAgIGNsZWFyICgpOworICAgICAgcmVmcmVzaCAoKTsKKyAgICAgIHN3aXRjaCAoY3VyTGF5b3V0KQorCXsKKwljYXNlIFNSQ19DT01NQU5EOgorCWNhc2UgRElTQVNTRU1fQ09NTUFORDoKKwkgIGZpcnN0V2luID0gKFR1aVdpbkluZm9QdHIpIChzb3VyY2VXaW5kb3dzICgpKS0+bGlzdFswXTsKKwkgIGZpcnN0V2luLT5nZW5lcmljLndpZHRoICs9IHdpZHRoRGlmZjsKKwkgIGxvY2F0b3ItPndpZHRoICs9IHdpZHRoRGlmZjsKKwkgIC8qIGNoZWNrIGZvciBpbnZhbGlkIGhlaWdodHMgKi8KKwkgIGlmIChoZWlnaHREaWZmID09IDApCisJICAgIG5ld0hlaWdodCA9IGZpcnN0V2luLT5nZW5lcmljLmhlaWdodDsKKwkgIGVsc2UgaWYgKChmaXJzdFdpbi0+Z2VuZXJpYy5oZWlnaHQgKyBzcGxpdERpZmYpID49CisJCSAgIChzY3JlZW5oZWlnaHQgLSBNSU5fQ01EX1dJTl9IRUlHSFQgLSAxKSkKKwkgICAgbmV3SGVpZ2h0ID0gc2NyZWVuaGVpZ2h0IC0gTUlOX0NNRF9XSU5fSEVJR0hUIC0gMTsKKwkgIGVsc2UgaWYgKChmaXJzdFdpbi0+Z2VuZXJpYy5oZWlnaHQgKyBzcGxpdERpZmYpIDw9IDApCisJICAgIG5ld0hlaWdodCA9IE1JTl9XSU5fSEVJR0hUOworCSAgZWxzZQorCSAgICBuZXdIZWlnaHQgPSBmaXJzdFdpbi0+Z2VuZXJpYy5oZWlnaHQgKyBzcGxpdERpZmY7CisKKwkgIF9tYWtlSW52aXNpYmxlQW5kU2V0TmV3SGVpZ2h0IChmaXJzdFdpbiwgbmV3SGVpZ2h0KTsKKwkgIGNtZFdpbi0+Z2VuZXJpYy5vcmlnaW4ueSA9IGxvY2F0b3ItPm9yaWdpbi55ICsgMTsKKwkgIGNtZFdpbi0+Z2VuZXJpYy53aWR0aCArPSB3aWR0aERpZmY7CisJICBuZXdIZWlnaHQgPSBzY3JlZW5oZWlnaHQgLSBjbWRXaW4tPmdlbmVyaWMub3JpZ2luLnk7CisJICBfbWFrZUludmlzaWJsZUFuZFNldE5ld0hlaWdodCAoY21kV2luLCBuZXdIZWlnaHQpOworCSAgX21ha2VWaXNpYmxlV2l0aE5ld0hlaWdodCAoZmlyc3RXaW4pOworCSAgX21ha2VWaXNpYmxlV2l0aE5ld0hlaWdodCAoY21kV2luKTsKKwkgIGlmIChmaXJzdFdpbi0+Z2VuZXJpYy5jb250ZW50U2l6ZSA8PSAwKQorCSAgICB0dWlFcmFzZVNvdXJjZUNvbnRlbnQgKGZpcnN0V2luLCBFTVBUWV9TT1VSQ0VfUFJPTVBUKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBpZiAoY3VyTGF5b3V0ID09IFNSQ19ESVNBU1NFTV9DT01NQU5EKQorCSAgICB7CisJICAgICAgZmlyc3RXaW4gPSBzcmNXaW47CisJICAgICAgZmlyc3RXaW4tPmdlbmVyaWMud2lkdGggKz0gd2lkdGhEaWZmOworCSAgICAgIHNlY29uZFdpbiA9IGRpc2Fzc2VtV2luOworCSAgICAgIHNlY29uZFdpbi0+Z2VuZXJpYy53aWR0aCArPSB3aWR0aERpZmY7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZpcnN0V2luID0gZGF0YVdpbjsKKwkgICAgICBmaXJzdFdpbi0+Z2VuZXJpYy53aWR0aCArPSB3aWR0aERpZmY7CisJICAgICAgc2Vjb25kV2luID0gKFR1aVdpbkluZm9QdHIpIChzb3VyY2VXaW5kb3dzICgpKS0+bGlzdFswXTsKKwkgICAgICBzZWNvbmRXaW4tPmdlbmVyaWMud2lkdGggKz0gd2lkdGhEaWZmOworCSAgICB9CisJICAvKiBDaGFuZ2UgdGhlIGZpcnN0IHdpbmRvdydzIGhlaWdodC93aWR0aCAqLworCSAgLyogY2hlY2sgZm9yIGludmFsaWQgaGVpZ2h0cyAqLworCSAgaWYgKGhlaWdodERpZmYgPT0gMCkKKwkgICAgbmV3SGVpZ2h0ID0gZmlyc3RXaW4tPmdlbmVyaWMuaGVpZ2h0OworCSAgZWxzZSBpZiAoKGZpcnN0V2luLT5nZW5lcmljLmhlaWdodCArCisJCSAgICBzZWNvbmRXaW4tPmdlbmVyaWMuaGVpZ2h0ICsgKHNwbGl0RGlmZiAqIDIpKSA+PQorCQkgICAoc2NyZWVuaGVpZ2h0IC0gTUlOX0NNRF9XSU5fSEVJR0hUIC0gMSkpCisJICAgIG5ld0hlaWdodCA9IChzY3JlZW5oZWlnaHQgLSBNSU5fQ01EX1dJTl9IRUlHSFQgLSAxKSAvIDI7CisJICBlbHNlIGlmICgoZmlyc3RXaW4tPmdlbmVyaWMuaGVpZ2h0ICsgc3BsaXREaWZmKSA8PSAwKQorCSAgICBuZXdIZWlnaHQgPSBNSU5fV0lOX0hFSUdIVDsKKwkgIGVsc2UKKwkgICAgbmV3SGVpZ2h0ID0gZmlyc3RXaW4tPmdlbmVyaWMuaGVpZ2h0ICsgc3BsaXREaWZmOworCSAgX21ha2VJbnZpc2libGVBbmRTZXROZXdIZWlnaHQgKGZpcnN0V2luLCBuZXdIZWlnaHQpOworCisJICBpZiAoZmlyc3RXaW4gPT0gZGF0YVdpbiAmJiB3aWR0aERpZmYgIT0gMCkKKwkgICAgZmlyc3RXaW4tPmRldGFpbC5kYXRhRGlzcGxheUluZm8ucmVnc0NvbHVtbkNvdW50ID0KKwkgICAgICB0dWlDYWxjdWxhdGVSZWdzQ29sdW1uQ291bnQgKAorCQkJICBmaXJzdFdpbi0+ZGV0YWlsLmRhdGFEaXNwbGF5SW5mby5yZWdzRGlzcGxheVR5cGUpOworCSAgbG9jYXRvci0+d2lkdGggKz0gd2lkdGhEaWZmOworCisJICAvKiBDaGFuZ2UgdGhlIHNlY29uZCB3aW5kb3cncyBoZWlnaHQvd2lkdGggKi8KKwkgIC8qIGNoZWNrIGZvciBpbnZhbGlkIGhlaWdodHMgKi8KKwkgIGlmIChoZWlnaHREaWZmID09IDApCisJICAgIG5ld0hlaWdodCA9IHNlY29uZFdpbi0+Z2VuZXJpYy5oZWlnaHQ7CisJICBlbHNlIGlmICgoZmlyc3RXaW4tPmdlbmVyaWMuaGVpZ2h0ICsKKwkJICAgIHNlY29uZFdpbi0+Z2VuZXJpYy5oZWlnaHQgKyAoc3BsaXREaWZmICogMikpID49CisJCSAgIChzY3JlZW5oZWlnaHQgLSBNSU5fQ01EX1dJTl9IRUlHSFQgLSAxKSkKKwkgICAgeworCSAgICAgIG5ld0hlaWdodCA9IHNjcmVlbmhlaWdodCAtIE1JTl9DTURfV0lOX0hFSUdIVCAtIDE7CisJICAgICAgaWYgKG5ld0hlaWdodCAlIDIpCisJCW5ld0hlaWdodCA9IChuZXdIZWlnaHQgLyAyKSArIDE7CisJICAgICAgZWxzZQorCQluZXdIZWlnaHQgLz0gMjsKKwkgICAgfQorCSAgZWxzZSBpZiAoKHNlY29uZFdpbi0+Z2VuZXJpYy5oZWlnaHQgKyBzcGxpdERpZmYpIDw9IDApCisJICAgIG5ld0hlaWdodCA9IE1JTl9XSU5fSEVJR0hUOworCSAgZWxzZQorCSAgICBuZXdIZWlnaHQgPSBzZWNvbmRXaW4tPmdlbmVyaWMuaGVpZ2h0ICsgc3BsaXREaWZmOworCSAgc2Vjb25kV2luLT5nZW5lcmljLm9yaWdpbi55ID0gZmlyc3RXaW4tPmdlbmVyaWMuaGVpZ2h0IC0gMTsKKwkgIF9tYWtlSW52aXNpYmxlQW5kU2V0TmV3SGVpZ2h0IChzZWNvbmRXaW4sIG5ld0hlaWdodCk7CisKKwkgIC8qIENoYW5nZSB0aGUgY29tbWFuZCB3aW5kb3cncyBoZWlnaHQvd2lkdGggKi8KKwkgIGNtZFdpbi0+Z2VuZXJpYy5vcmlnaW4ueSA9IGxvY2F0b3ItPm9yaWdpbi55ICsgMTsKKwkgIF9tYWtlSW52aXNpYmxlQW5kU2V0TmV3SGVpZ2h0ICgKKwkJCSAgICAgY21kV2luLCBjbWRXaW4tPmdlbmVyaWMuaGVpZ2h0ICsgY21kU3BsaXREaWZmKTsKKwkgIF9tYWtlVmlzaWJsZVdpdGhOZXdIZWlnaHQgKGZpcnN0V2luKTsKKwkgIF9tYWtlVmlzaWJsZVdpdGhOZXdIZWlnaHQgKHNlY29uZFdpbik7CisJICBfbWFrZVZpc2libGVXaXRoTmV3SGVpZ2h0IChjbWRXaW4pOworCSAgaWYgKGZpcnN0V2luLT5nZW5lcmljLmNvbnRlbnRTaXplIDw9IDApCisJICAgIHR1aUVyYXNlU291cmNlQ29udGVudCAoZmlyc3RXaW4sIEVNUFRZX1NPVVJDRV9QUk9NUFQpOworCSAgaWYgKHNlY29uZFdpbi0+Z2VuZXJpYy5jb250ZW50U2l6ZSA8PSAwKQorCSAgICB0dWlFcmFzZVNvdXJjZUNvbnRlbnQgKHNlY29uZFdpbiwgRU1QVFlfU09VUkNFX1BST01QVCk7CisJICBicmVhazsKKwl9CisgICAgICAvKgorICAgICAgICAqKiBOb3cgcmVtb3ZlIGFsbCBpbnZpc2libGUgd2luZG93cywgYW5kIHRoZWlyIGNvbnRlbnQgc28gdGhhdCB0aGV5IGdldAorICAgICAgICAqKiBjcmVhdGVkIGFnYWluIHdoZW4gY2FsbGVkIGZvciB3aXRoIHRoZSBuZXcgc2l6ZQorICAgICAgICAqLworICAgICAgZm9yICh3aW5UeXBlID0gU1JDX1dJTjsgKHdpblR5cGUgPCBNQVhfTUFKT1JfV0lORE9XUyk7IHdpblR5cGUrKykKKwl7CisJICBpZiAod2luVHlwZSAhPSBDTURfV0lOICYmIG1fd2luUHRyTm90TnVsbCAod2luTGlzdFt3aW5UeXBlXSkgJiYKKwkgICAgICAhd2luTGlzdFt3aW5UeXBlXS0+Z2VuZXJpYy5pc1Zpc2libGUpCisJICAgIHsKKwkgICAgICBmcmVlV2luZG93ICh3aW5MaXN0W3dpblR5cGVdKTsKKwkgICAgICB3aW5MaXN0W3dpblR5cGVdID0gKFR1aVdpbkluZm9QdHIpIE5VTEw7CisJICAgIH0KKwl9CisgICAgICB0dWlTZXRXaW5SZXNpemVkVG8gKFRSVUUpOworICAgICAgLyogdHVybiBrZXlwYWQgYmFjayBvbiwgdW5sZXNzIGZvY3VzIGlzIGluIHRoZSBjb21tYW5kIHdpbmRvdyAqLworICAgICAgaWYgKHdpbldpdGhGb2N1cyAhPSBjbWRXaW4pCisJa2V5cGFkIChjbWRXaW4tPmdlbmVyaWMuaGFuZGxlLCBUUlVFKTsKKyAgICB9CisgIHJldHVybjsKK30JCQkJLyogdHVpUmVzaXplQWxsICovCisKKworLyoKKyoqIHR1aVNpZ3dpbmNoSGFuZGxlcigpCisqKiAgICBTSUdXSU5DSCBzaWduYWwgaGFuZGxlciBmb3IgdGhlIHR1aS4gIFRoaXMgc2lnbmFsIGhhbmRsZXIgaXMKKyoqICAgIGFsd2F5cyBjYWxsZWQsIGV2ZW4gd2hlbiB0aGUgcmVhZGxpbmUgcGFja2FnZSBjbGVhcnMgc2lnbmFscworKiogICAgYmVjYXVzZSBpdCBpcyBzZXQgYXMgdGhlIG9sZF9zaWd3aW5jaCgpIChUVUkgb25seSkKKyovCit2b2lkCisjaWZkZWYgX19TVERDX18KK3R1aVNpZ3dpbmNoSGFuZGxlciAoCisJCSAgICAgaW50IHNpZ25hbCkKKyNlbHNlCit0dWlTaWd3aW5jaEhhbmRsZXIgKHNpZ25hbCkKKyAgICAgaW50IHNpZ25hbDsKKyNlbmRpZgoreworICAvKgorICAgICoqIFNheSB0aGF0IGEgcmVzaXplIHdhcyBkb25lIHNvIHRoYXQgdGhlIHJlYWRsaW5lIGNhbiBkbyBpdAorICAgICoqIGxhdGVyIHdoZW4gYXBwcm9wcmlhdGUuCisgICAgKi8KKyAgdHVpU2V0V2luUmVzaXplZFRvIChUUlVFKTsKKworICByZXR1cm47Cit9CQkJCS8qIHR1aVNpZ3dpbmNoSGFuZGxlciAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFNUQVRJQyBMT0NBTCBGVU5DVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qCisqKiBfdHVpU2Nyb2xsRm9yd2FyZF9jb21tYW5kKCkuCisqLworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aVNjcm9sbEZvcndhcmRfY29tbWFuZCAoCisJCQkgICAgY2hhciAqYXJnLAorCQkJICAgIGludCBmcm9tVFRZKQorI2Vsc2UKK190dWlTY3JvbGxGb3J3YXJkX2NvbW1hbmQgKGFyZywgZnJvbVRUWSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbVRUWTsKKyNlbmRpZgoreworICBpbnQgbnVtVG9TY3JvbGwgPSAxOworICBUdWlXaW5JbmZvUHRyIHdpblRvU2Nyb2xsOworCisgIGlmIChhcmcgPT0gKGNoYXIgKikgTlVMTCkKKyAgICBfcGFyc2VTY3JvbGxpbmdBcmdzIChhcmcsICZ3aW5Ub1Njcm9sbCwgKGludCAqKSBOVUxMKTsKKyAgZWxzZQorICAgIF9wYXJzZVNjcm9sbGluZ0FyZ3MgKGFyZywgJndpblRvU2Nyb2xsLCAmbnVtVG9TY3JvbGwpOworICB0dWlEbyAoKFR1aU9wYXF1ZUZ1bmNQdHIpIHR1aV92U2Nyb2xsLAorCSBGT1JXQVJEX1NDUk9MTCwKKwkgd2luVG9TY3JvbGwsCisJIG51bVRvU2Nyb2xsKTsKKworICByZXR1cm47Cit9CQkJCS8qIF90dWlTY3JvbGxGb3J3YXJkX2NvbW1hbmQgKi8KKworCisvKgorKiogX3R1aVNjcm9sbEJhY2t3YXJkX2NvbW1hbmQoKS4KKyovCitzdGF0aWMgdm9pZAorI2lmZGVmIF9fU1REQ19fCitfdHVpU2Nyb2xsQmFja3dhcmRfY29tbWFuZCAoCisJCQkgICAgIGNoYXIgKmFyZywKKwkJCSAgICAgaW50IGZyb21UVFkpCisjZWxzZQorX3R1aVNjcm9sbEJhY2t3YXJkX2NvbW1hbmQgKGFyZywgZnJvbVRUWSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbVRUWTsKKyNlbmRpZgoreworICBpbnQgbnVtVG9TY3JvbGwgPSAxOworICBUdWlXaW5JbmZvUHRyIHdpblRvU2Nyb2xsOworCisgIGlmIChhcmcgPT0gKGNoYXIgKikgTlVMTCkKKyAgICBfcGFyc2VTY3JvbGxpbmdBcmdzIChhcmcsICZ3aW5Ub1Njcm9sbCwgKGludCAqKSBOVUxMKTsKKyAgZWxzZQorICAgIF9wYXJzZVNjcm9sbGluZ0FyZ3MgKGFyZywgJndpblRvU2Nyb2xsLCAmbnVtVG9TY3JvbGwpOworICB0dWlEbyAoKFR1aU9wYXF1ZUZ1bmNQdHIpIHR1aV92U2Nyb2xsLAorCSBCQUNLV0FSRF9TQ1JPTEwsCisJIHdpblRvU2Nyb2xsLAorCSBudW1Ub1Njcm9sbCk7CisKKyAgcmV0dXJuOworfQkJCQkvKiBfdHVpU2Nyb2xsQmFja3dhcmRfY29tbWFuZCAqLworCisKKy8qCisqKiBfdHVpU2Nyb2xsTGVmdF9jb21tYW5kKCkuCisqLworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aVNjcm9sbExlZnRfY29tbWFuZCAoCisJCQkgY2hhciAqYXJnLAorCQkJIGludCBmcm9tVFRZKQorI2Vsc2UKK190dWlTY3JvbGxMZWZ0X2NvbW1hbmQgKGFyZywgZnJvbVRUWSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbVRUWTsKKyNlbmRpZgoreworICBpbnQgbnVtVG9TY3JvbGw7CisgIFR1aVdpbkluZm9QdHIgd2luVG9TY3JvbGw7CisKKyAgX3BhcnNlU2Nyb2xsaW5nQXJncyAoYXJnLCAmd2luVG9TY3JvbGwsICZudW1Ub1Njcm9sbCk7CisgIHR1aURvICgoVHVpT3BhcXVlRnVuY1B0cikgdHVpX3ZTY3JvbGwsCisJIExFRlRfU0NST0xMLAorCSB3aW5Ub1Njcm9sbCwKKwkgbnVtVG9TY3JvbGwpOworCisgIHJldHVybjsKK30JCQkJLyogX3R1aVNjcm9sbExlZnRfY29tbWFuZCAqLworCisKKy8qCisqKiBfdHVpU2Nyb2xsUmlnaHRfY29tbWFuZCgpLgorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK190dWlTY3JvbGxSaWdodF9jb21tYW5kICgKKwkJCSAgY2hhciAqYXJnLAorCQkJICBpbnQgZnJvbVRUWSkKKyNlbHNlCitfdHVpU2Nyb2xsUmlnaHRfY29tbWFuZCAoYXJnLCBmcm9tVFRZKQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tVFRZOworI2VuZGlmCit7CisgIGludCBudW1Ub1Njcm9sbDsKKyAgVHVpV2luSW5mb1B0ciB3aW5Ub1Njcm9sbDsKKworICBfcGFyc2VTY3JvbGxpbmdBcmdzIChhcmcsICZ3aW5Ub1Njcm9sbCwgJm51bVRvU2Nyb2xsKTsKKyAgdHVpRG8gKChUdWlPcGFxdWVGdW5jUHRyKSB0dWlfdlNjcm9sbCwKKwkgUklHSFRfU0NST0xMLAorCSB3aW5Ub1Njcm9sbCwKKwkgbnVtVG9TY3JvbGwpOworCisgIHJldHVybjsKK30JCQkJLyogX3R1aVNjcm9sbFJpZ2h0X2NvbW1hbmQgKi8KKworCisvKgorKiogX3R1aVNldEZvY3VzKCkuCisqKiAgICAgU2V0IGZvY3VzIHRvIHRoZSB3aW5kb3cgbmFtZWQgYnkgJ2FyZycKKyovCitzdGF0aWMgdm9pZAorI2lmZGVmIF9fU1REQ19fCitfdHVpU2V0Rm9jdXMgKAorCSAgICAgICBjaGFyICphcmcsCisJICAgICAgIGludCBmcm9tVFRZKQorI2Vsc2UKK190dWlTZXRGb2N1cyAoYXJnLCBmcm9tVFRZKQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tVFRZOworI2VuZGlmCit7CisgIGlmIChhcmcgIT0gKGNoYXIgKikgTlVMTCkKKyAgICB7CisgICAgICBjaGFyICpidWZQdHIgPSAoY2hhciAqKSB0dWlTdHJEdXAgKGFyZyk7CisgICAgICBpbnQgaTsKKyAgICAgIFR1aVdpbkluZm9QdHIgd2luSW5mbyA9IChUdWlXaW5JbmZvUHRyKSBOVUxMOworCisgICAgICBmb3IgKGkgPSAwOyAoaSA8IHN0cmxlbiAoYnVmUHRyKSk7IGkrKykKKwlidWZQdHJbaV0gPSB0b3VwcGVyIChhcmdbaV0pOworCisgICAgICBpZiAoc3Vic2V0Q29tcGFyZSAoYnVmUHRyLCAiTkVYVCIpKQorCXdpbkluZm8gPSB0dWlOZXh0V2luICh0dWlXaW5XaXRoRm9jdXMgKCkpOworICAgICAgZWxzZSBpZiAoc3Vic2V0Q29tcGFyZSAoYnVmUHRyLCAiUFJFViIpKQorCXdpbkluZm8gPSB0dWlQcmV2V2luICh0dWlXaW5XaXRoRm9jdXMgKCkpOworICAgICAgZWxzZQorCXdpbkluZm8gPSBwYXJ0aWFsV2luQnlOYW1lIChidWZQdHIpOworCisgICAgICBpZiAod2luSW5mbyA9PSAoVHVpV2luSW5mb1B0cikgTlVMTCB8fCAhd2luSW5mby0+Z2VuZXJpYy5pc1Zpc2libGUpCisJd2FybmluZyAoIkludmFsaWQgd2luZG93IHNwZWNpZmllZC4gXG5cCitUaGUgd2luZG93IG5hbWUgc3BlY2lmaWVkIG11c3QgYmUgdmFsaWQgYW5kIHZpc2libGUuXG4iKTsKKyAgICAgIGVsc2UKKwl7CisJICB0dWlTZXRXaW5Gb2N1c1RvICh3aW5JbmZvKTsKKwkgIGtleXBhZCAoY21kV2luLT5nZW5lcmljLmhhbmRsZSwgKHdpbkluZm8gIT0gY21kV2luKSk7CisJfQorCisgICAgICBpZiAoZGF0YVdpbi0+Z2VuZXJpYy5pc1Zpc2libGUpCisJdHVpUmVmcmVzaERhdGFXaW4gKCk7CisgICAgICB0dWlGcmVlIChidWZQdHIpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiRm9jdXMgc2V0IHRvICVzIHdpbmRvdy5cbiIsCisJCSAgICAgICB3aW5OYW1lICgoVHVpR2VuV2luSW5mb1B0cikgdHVpV2luV2l0aEZvY3VzICgpKSk7CisgICAgfQorICBlbHNlCisgICAgd2FybmluZyAoIkluY29ycmVjdCBOdW1iZXIgb2YgQXJndW1lbnRzLlxuJXMiLCBGT0NVU19VU0FHRSk7CisKKyAgcmV0dXJuOworfQkJCQkvKiBfdHVpU2V0Rm9jdXMgKi8KKworCisvKgorKiogX3R1aV92U2V0Rm9jdXMoKQorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK190dWlfdlNldEZvY3VzICgKKwkJIHZhX2xpc3QgYXJncykKKyNlbHNlCitfdHVpX3ZTZXRGb2N1cyAoYXJncykKKyAgICAgdmFfbGlzdCBhcmdzOworI2VuZGlmCit7CisgIGNoYXIgKmFyZyA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKKyAgaW50IGZyb21UVFkgPSB2YV9hcmcgKGFyZ3MsIGludCk7CisKKyAgX3R1aVNldEZvY3VzIChhcmcsIGZyb21UVFkpOworCisgIHJldHVybjsKK30JCQkJLyogdHVpX3ZTZXRGb2N1cyAqLworCisKKy8qCisqKiBfdHVpU2V0Rm9jdXNfY29tbWFuZCgpCisqLworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aVNldEZvY3VzX2NvbW1hbmQgKAorCQkgICAgICAgY2hhciAqYXJnLAorCQkgICAgICAgaW50IGZyb21UVFkpCisjZWxzZQorX3R1aVNldEZvY3VzX2NvbW1hbmQgKGFyZywgZnJvbVRUWSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbVRUWTsKKyNlbmRpZgoreworICB0dWlEbyAoKFR1aU9wYXF1ZUZ1bmNQdHIpIF90dWlfdlNldEZvY3VzLCBhcmcsIGZyb21UVFkpOworCisgIHJldHVybjsKK30JCQkJLyogdHVpX1NldEZvY3VzICovCisKKworLyoKKyoqIF90dWlBbGxXaW5kb3dzSW5mbygpLgorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK190dWlBbGxXaW5kb3dzSW5mbyAoCisJCSAgICAgY2hhciAqYXJnLAorCQkgICAgIGludCBmcm9tVFRZKQorI2Vsc2UKK190dWlBbGxXaW5kb3dzSW5mbyAoYXJnLCBmcm9tVFRZKQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tVFRZOworI2VuZGlmCit7CisgIFR1aVdpblR5cGUgdHlwZTsKKyAgVHVpV2luSW5mb1B0ciB3aW5XaXRoRm9jdXMgPSB0dWlXaW5XaXRoRm9jdXMgKCk7CisKKyAgZm9yICh0eXBlID0gU1JDX1dJTjsgKHR5cGUgPCBNQVhfTUFKT1JfV0lORE9XUyk7IHR5cGUrKykKKyAgICBpZiAod2luTGlzdFt0eXBlXS0+Z2VuZXJpYy5pc1Zpc2libGUpCisgICAgICB7CisJaWYgKHdpbldpdGhGb2N1cyA9PSB3aW5MaXN0W3R5cGVdKQorCSAgcHJpbnRmX2ZpbHRlcmVkICgiICAgICAgICAlc1x0KCVkIGxpbmVzKSAgPGhhcyBmb2N1cz5cbiIsCisJCQkgICB3aW5OYW1lICgmd2luTGlzdFt0eXBlXS0+Z2VuZXJpYyksCisJCQkgICB3aW5MaXN0W3R5cGVdLT5nZW5lcmljLmhlaWdodCk7CisJZWxzZQorCSAgcHJpbnRmX2ZpbHRlcmVkICgiICAgICAgICAlc1x0KCVkIGxpbmVzKVxuIiwKKwkJCSAgIHdpbk5hbWUgKCZ3aW5MaXN0W3R5cGVdLT5nZW5lcmljKSwKKwkJCSAgIHdpbkxpc3RbdHlwZV0tPmdlbmVyaWMuaGVpZ2h0KTsKKyAgICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIF90dWlBbGxXaW5kb3dzSW5mbyAqLworCisKKy8qCisqKiBfdHVpUmVmcmVzaEFsbF9jb21tYW5kKCkuCisqLworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aVJlZnJlc2hBbGxfY29tbWFuZCAoCisJCQkgY2hhciAqYXJnLAorCQkJIGludCBmcm9tVFRZKQorI2Vsc2UKK190dWlSZWZyZXNoQWxsX2NvbW1hbmQgKGFyZywgZnJvbVRUWSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbVRUWTsKKyNlbmRpZgoreworICB0dWlEbyAoKFR1aU9wYXF1ZUZ1bmNQdHIpIHR1aVJlZnJlc2hBbGwpOworfQorCisKKy8qCisqKiBfdHVpU2V0V2luVGFiV2lkdGhfY29tbWFuZCgpLgorKiogICAgICAgIFNldCB0aGUgaGVpZ2h0IG9mIHRoZSBzcGVjaWZpZWQgd2luZG93LgorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK190dWlTZXRUYWJXaWR0aF9jb21tYW5kICgKKwkJCSAgY2hhciAqYXJnLAorCQkJICBpbnQgZnJvbVRUWSkKKyNlbHNlCitfdHVpU2V0VGFiV2lkdGhfY29tbWFuZCAoYXJnLCBmcm9tVFRZKQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tVFRZOworI2VuZGlmCit7CisgIGlmIChhcmcgIT0gKGNoYXIgKikgTlVMTCkKKyAgICB7CisgICAgICBpbnQgdHM7CisKKyAgICAgIHRzID0gYXRvaSAoYXJnKTsKKyAgICAgIGlmICh0cyA+IDApCisJdHVpU2V0RGVmYXVsdFRhYkxlbiAodHMpOworICAgICAgZWxzZQorCXdhcm5pbmcgKCJUYWIgd2lkdGhzIGdyZWF0ZXIgdGhhbiAwIG11c3QgYmUgc3BlY2lmaWVkLlxuIik7CisgICAgfQorCisgIHJldHVybjsKK30JCQkJLyogX3R1aVNldFRhYldpZHRoX2NvbW1hbmQgKi8KKworCisvKgorKiogX3R1aVNldFdpbkhlaWdodCgpLgorKiogICAgICAgIFNldCB0aGUgaGVpZ2h0IG9mIHRoZSBzcGVjaWZpZWQgd2luZG93LgorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK190dWlTZXRXaW5IZWlnaHQgKAorCQkgICBjaGFyICphcmcsCisJCSAgIGludCBmcm9tVFRZKQorI2Vsc2UKK190dWlTZXRXaW5IZWlnaHQgKGFyZywgZnJvbVRUWSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbVRUWTsKKyNlbmRpZgoreworICBpZiAoYXJnICE9IChjaGFyICopIE5VTEwpCisgICAgeworICAgICAgY2hhciAqYnVmID0gdHVpU3RyRHVwIChhcmcpOworICAgICAgY2hhciAqYnVmUHRyID0gYnVmOworICAgICAgY2hhciAqd25hbWUgPSAoY2hhciAqKSBOVUxMOworICAgICAgaW50IG5ld0hlaWdodCwgaTsKKyAgICAgIFR1aVdpbkluZm9QdHIgd2luSW5mbzsKKworICAgICAgd25hbWUgPSBidWZQdHI7CisgICAgICBidWZQdHIgPSBzdHJjaHIgKGJ1ZlB0ciwgJyAnKTsKKyAgICAgIGlmIChidWZQdHIgIT0gKGNoYXIgKikgTlVMTCkKKwl7CisJICAqYnVmUHRyID0gKGNoYXIpIDA7CisKKwkgIC8qCisgICAgICAgICAgICAqKiBWYWxpZGF0ZSB0aGUgd2luZG93IG5hbWUKKyAgICAgICAgICAgICovCisJICBmb3IgKGkgPSAwOyBpIDwgc3RybGVuICh3bmFtZSk7IGkrKykKKwkgICAgd25hbWVbaV0gPSB0b3VwcGVyICh3bmFtZVtpXSk7CisJICB3aW5JbmZvID0gcGFydGlhbFdpbkJ5TmFtZSAod25hbWUpOworCisJICBpZiAod2luSW5mbyA9PSAoVHVpV2luSW5mb1B0cikgTlVMTCB8fCAhd2luSW5mby0+Z2VuZXJpYy5pc1Zpc2libGUpCisJICAgIHdhcm5pbmcgKCJJbnZhbGlkIHdpbmRvdyBzcGVjaWZpZWQuIFxuXAorVGhlIHdpbmRvdyBuYW1lIHNwZWNpZmllZCBtdXN0IGJlIHZhbGlkIGFuZCB2aXNpYmxlLlxuIik7CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBQcm9jZXNzIHRoZSBzaXplICovCisJICAgICAgd2hpbGUgKCooKytidWZQdHIpID09ICcgJykKKwkJOworCisJICAgICAgaWYgKCpidWZQdHIgIT0gKGNoYXIpIDApCisJCXsKKwkJICBpbnQgbmVnYXRlID0gRkFMU0U7CisJCSAgaW50IGZpeGVkU2l6ZSA9IFRSVUU7CisJCSAgaW50IGlucHV0Tm87OworCisJCSAgaWYgKCpidWZQdHIgPT0gJysnIHx8ICpidWZQdHIgPT0gJy0nKQorCQkgICAgeworCQkgICAgICBpZiAoKmJ1ZlB0ciA9PSAnLScpCisJCQluZWdhdGUgPSBUUlVFOworCQkgICAgICBmaXhlZFNpemUgPSBGQUxTRTsKKwkJICAgICAgYnVmUHRyKys7CisJCSAgICB9CisJCSAgaW5wdXRObyA9IGF0b2kgKGJ1ZlB0cik7CisJCSAgaWYgKGlucHV0Tm8gPiAwKQorCQkgICAgeworCQkgICAgICBpZiAobmVnYXRlKQorCQkJaW5wdXRObyAqPSAoLTEpOworCQkgICAgICBpZiAoZml4ZWRTaXplKQorCQkJbmV3SGVpZ2h0ID0gaW5wdXRObzsKKwkJICAgICAgZWxzZQorCQkJbmV3SGVpZ2h0ID0gd2luSW5mby0+Z2VuZXJpYy5oZWlnaHQgKyBpbnB1dE5vOworCQkgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgKiogTm93IGNoYW5nZSB0aGUgd2luZG93J3MgaGVpZ2h0LCBhbmQgYWRqdXN0IGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgKiogb3RoZXIgd2luZG93cyBhcm91bmQgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICovCisJCSAgICAgIGlmIChfdHVpQWRqdXN0V2luSGVpZ2h0cyAod2luSW5mbywKKwkJCQkJCW5ld0hlaWdodCkgPT0gVFVJX0ZBSUxVUkUpCisJCQl3YXJuaW5nICgiSW52YWxpZCB3aW5kb3cgaGVpZ2h0IHNwZWNpZmllZC5cbiVzIiwKKwkJCQkgV0lOX0hFSUdIVF9VU0FHRSk7CisJCSAgICAgIGVsc2UKKwkJCWluaXRfcGFnZV9pbmZvICgpOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHdhcm5pbmcgKCJJbnZhbGlkIHdpbmRvdyBoZWlnaHQgc3BlY2lmaWVkLlxuJXMiLAorCQkJICAgICBXSU5fSEVJR0hUX1VTQUdFKTsKKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZQorCXByaW50Zl9maWx0ZXJlZCAoV0lOX0hFSUdIVF9VU0FHRSk7CisKKyAgICAgIGlmIChidWYgIT0gKGNoYXIgKikgTlVMTCkKKwl0dWlGcmVlIChidWYpOworICAgIH0KKyAgZWxzZQorICAgIHByaW50Zl9maWx0ZXJlZCAoV0lOX0hFSUdIVF9VU0FHRSk7CisKKyAgcmV0dXJuOworfQkJCQkvKiBfdHVpU2V0V2luSGVpZ2h0ICovCisKKworLyoKKyoqIF90dWlfdlNldFdpbkhlaWdodCgpLgorKiogICAgICAgIFNldCB0aGUgaGVpZ2h0IG9mIHRoZSBzcGVjaWZpZWQgd2luZG93LCB3aXRoIHZhX2xpc3QuCisqLworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aV92U2V0V2luSGVpZ2h0ICgKKwkJICAgICB2YV9saXN0IGFyZ3MpCisjZWxzZQorX3R1aV92U2V0V2luSGVpZ2h0IChhcmdzKQorICAgICB2YV9saXN0IGFyZ3M7CisjZW5kaWYKK3sKKyAgY2hhciAqYXJnID0gdmFfYXJnIChhcmdzLCBjaGFyICopOworICBpbnQgZnJvbVRUWSA9IHZhX2FyZyAoYXJncywgaW50KTsKKworICBfdHVpU2V0V2luSGVpZ2h0IChhcmcsIGZyb21UVFkpOworCisgIHJldHVybjsKK30JCQkJLyogX3R1aV92U2V0V2luSGVpZ2h0ICovCisKKworLyoKKyoqIF90dWlTZXRXaW5IZWlnaHRfY29tbWFuZCgpLgorKiogICAgICAgIFNldCB0aGUgaGVpZ2h0IG9mIHRoZSBzcGVjaWZpZWQgd2luZG93LCB3aXRoIHZhX2xpc3QuCisqLworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aVNldFdpbkhlaWdodF9jb21tYW5kICgKKwkJCSAgIGNoYXIgKmFyZywKKwkJCSAgIGludCBmcm9tVFRZKQorI2Vsc2UKK190dWlTZXRXaW5IZWlnaHRfY29tbWFuZCAoYXJnLCBmcm9tVFRZKQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tVFRZOworI2VuZGlmCit7CisgIHR1aURvICgoVHVpT3BhcXVlRnVuY1B0cikgX3R1aV92U2V0V2luSGVpZ2h0LCBhcmcsIGZyb21UVFkpOworCisgIHJldHVybjsKK30JCQkJLyogX3R1aVNldFdpbkhlaWdodF9jb21tYW5kICovCisKKworLyoKKyoqIF90dWlYREJzZXRXaW5IZWlnaHQoKS4KKyoqICAgICAgICBYREIgQ29tcGF0aWJpbGl0eSBjb21tYW5kIGZvciBzZXR0aW5nIHRoZSB3aW5kb3cgaGVpZ2h0LiAgVGhpcyB3aWxsCisqKiAgICAgICAgaW5jcmVhc2Ugb3IgZGVjcmVhc2UgdGhlIGNvbW1hbmQgd2luZG93IGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LgorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK190dWlYREJzZXRXaW5IZWlnaHQgKAorCQkgICAgICBjaGFyICphcmcsCisJCSAgICAgIGludCBmcm9tVFRZKQorI2Vsc2UKK190dWlYREJzZXRXaW5IZWlnaHQgKGFyZywgZnJvbVRUWSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbVRUWTsKKyNlbmRpZgoreworICBpZiAoYXJnICE9IChjaGFyICopIE5VTEwpCisgICAgeworICAgICAgaW50IGlucHV0Tm8gPSBhdG9pIChhcmcpOworCisgICAgICBpZiAoaW5wdXRObyA+IDApCisJewkJCS8qIEFkZCAxIGZvciB0aGUgbG9jYXRvciAqLworCSAgaW50IG5ld0hlaWdodCA9IHRlcm1IZWlnaHQgKCkgLSAoaW5wdXRObyArIDEpOworCisJICBpZiAoIV9uZXdIZWlnaHRPayAod2luTGlzdFtDTURfV0lOXSwgbmV3SGVpZ2h0KSB8fAorCSAgICAgIF90dWlBZGp1c3RXaW5IZWlnaHRzICh3aW5MaXN0W0NNRF9XSU5dLAorCQkJCSAgICBuZXdIZWlnaHQpID09IFRVSV9GQUlMVVJFKQorCSAgICB3YXJuaW5nICgiSW52YWxpZCB3aW5kb3cgaGVpZ2h0IHNwZWNpZmllZC5cbiVzIiwKKwkJICAgICBYREJXSU5fSEVJR0hUX1VTQUdFKTsKKwl9CisgICAgICBlbHNlCisJd2FybmluZyAoIkludmFsaWQgd2luZG93IGhlaWdodCBzcGVjaWZpZWQuXG4lcyIsCisJCSBYREJXSU5fSEVJR0hUX1VTQUdFKTsKKyAgICB9CisgIGVsc2UKKyAgICB3YXJuaW5nICgiSW52YWxpZCB3aW5kb3cgaGVpZ2h0IHNwZWNpZmllZC5cbiVzIiwgWERCV0lOX0hFSUdIVF9VU0FHRSk7CisKKyAgcmV0dXJuOworfQkJCQkvKiBfdHVpWERCc2V0V2luSGVpZ2h0ICovCisKKworLyoKKyoqIF90dWlfdlhEQnNldFdpbkhlaWdodCgpLgorKiogICAgICAgIFNldCB0aGUgaGVpZ2h0IG9mIHRoZSBzcGVjaWZpZWQgd2luZG93LCB3aXRoIHZhX2xpc3QuCisqLworc3RhdGljIHZvaWQKKyNpZmRlZiBfX1NURENfXworX3R1aV92WERCc2V0V2luSGVpZ2h0ICgKKwkJCXZhX2xpc3QgYXJncykKKyNlbHNlCitfdHVpX3ZYREJzZXRXaW5IZWlnaHQgKGFyZ3MpCisgICAgIHZhX2xpc3QgYXJnczsKKyNlbmRpZgoreworICBjaGFyICphcmcgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7CisgIGludCBmcm9tVFRZID0gdmFfYXJnIChhcmdzLCBpbnQpOworCisgIF90dWlYREJzZXRXaW5IZWlnaHQgKGFyZywgZnJvbVRUWSk7CisKKyAgcmV0dXJuOworfQkJCQkvKiBfdHVpX3ZYREJzZXRXaW5IZWlnaHQgKi8KKworCisvKgorKiogX3R1aVNldFdpbkhlaWdodF9jb21tYW5kKCkuCisqKiAgICAgICAgU2V0IHRoZSBoZWlnaHQgb2YgdGhlIHNwZWNpZmllZCB3aW5kb3csIHdpdGggdmFfbGlzdC4KKyovCitzdGF0aWMgdm9pZAorI2lmZGVmIF9fU1REQ19fCitfdHVpWERCc2V0V2luSGVpZ2h0X2NvbW1hbmQgKAorCQkJICAgICAgY2hhciAqYXJnLAorCQkJICAgICAgaW50IGZyb21UVFkpCisjZWxzZQorX3R1aVhEQnNldFdpbkhlaWdodF9jb21tYW5kIChhcmcsIGZyb21UVFkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21UVFk7CisjZW5kaWYKK3sKKyAgdHVpRG8gKChUdWlPcGFxdWVGdW5jUHRyKSBfdHVpX3ZYREJzZXRXaW5IZWlnaHQsIGFyZywgZnJvbVRUWSk7CisKKyAgcmV0dXJuOworfQkJCQkvKiBfdHVpWERCc2V0V2luSGVpZ2h0X2NvbW1hbmQgKi8KKworCisvKgorKiogX3R1aUFkanVzdFdpbkhlaWdodHMoKS4KKyoqICAgICAgICBGdW5jdGlvbiB0byBhZGp1c3QgYWxsIHdpbmRvdyBoZWlnaHRzIGFyb3VuZCB0aGUgcHJpbWFyeQorKi8KK3N0YXRpYyBUdWlTdGF0dXMKKyNpZmRlZiBfX1NURENfXworX3R1aUFkanVzdFdpbkhlaWdodHMgKAorCQkgICAgICAgVHVpV2luSW5mb1B0ciBwcmltYXJ5V2luSW5mbywKKwkJICAgICAgIGludCBuZXdIZWlnaHQpCisjZWxzZQorX3R1aUFkanVzdFdpbkhlaWdodHMgKHByaW1hcnlXaW5JbmZvLCBuZXdIZWlnaHQpCisgICAgIFR1aVdpbkluZm9QdHIgcHJpbWFyeVdpbkluZm87CisgICAgIGludCBuZXdIZWlnaHQ7CisjZW5kaWYKK3sKKyAgVHVpU3RhdHVzIHN0YXR1cyA9IFRVSV9GQUlMVVJFOworCisgIGlmIChfbmV3SGVpZ2h0T2sgKHByaW1hcnlXaW5JbmZvLCBuZXdIZWlnaHQpKQorICAgIHsKKyAgICAgIHN0YXR1cyA9IFRVSV9TVUNDRVNTOworICAgICAgaWYgKG5ld0hlaWdodCAhPSBwcmltYXJ5V2luSW5mby0+Z2VuZXJpYy5oZWlnaHQpCisJeworCSAgaW50IGksIGRpZmY7CisJICBUdWlXaW5JbmZvUHRyIHdpbkluZm87CisJICBUdWlHZW5XaW5JbmZvUHRyIGxvY2F0b3IgPSBsb2NhdG9yV2luSW5mb1B0ciAoKTsKKwkgIFR1aUxheW91dFR5cGUgY3VyTGF5b3V0ID0gY3VycmVudExheW91dCAoKTsKKworCSAgZGlmZiA9IChuZXdIZWlnaHQgLSBwcmltYXJ5V2luSW5mby0+Z2VuZXJpYy5oZWlnaHQpICogKC0xKTsKKwkgIGlmIChjdXJMYXlvdXQgPT0gU1JDX0NPTU1BTkQgfHwgY3VyTGF5b3V0ID09IERJU0FTU0VNX0NPTU1BTkQpCisJICAgIHsKKwkgICAgICBUdWlXaW5JbmZvUHRyIHNyY1dpbkluZm87CisKKwkgICAgICBfbWFrZUludmlzaWJsZUFuZFNldE5ld0hlaWdodCAocHJpbWFyeVdpbkluZm8sIG5ld0hlaWdodCk7CisJICAgICAgaWYgKHByaW1hcnlXaW5JbmZvLT5nZW5lcmljLnR5cGUgPT0gQ01EX1dJTikKKwkJeworCQkgIHdpbkluZm8gPSAoVHVpV2luSW5mb1B0cikgKHNvdXJjZVdpbmRvd3MgKCkpLT5saXN0WzBdOworCQkgIHNyY1dpbkluZm8gPSB3aW5JbmZvOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgd2luSW5mbyA9IHdpbkxpc3RbQ01EX1dJTl07CisJCSAgc3JjV2luSW5mbyA9IHByaW1hcnlXaW5JbmZvOworCQl9CisJICAgICAgX21ha2VJbnZpc2libGVBbmRTZXROZXdIZWlnaHQgKHdpbkluZm8sCisJCQkJCSAgICAgd2luSW5mby0+Z2VuZXJpYy5oZWlnaHQgKyBkaWZmKTsKKwkgICAgICBjbWRXaW4tPmdlbmVyaWMub3JpZ2luLnkgPSBsb2NhdG9yLT5vcmlnaW4ueSArIDE7CisJICAgICAgX21ha2VWaXNpYmxlV2l0aE5ld0hlaWdodCAod2luSW5mbyk7CisJICAgICAgX21ha2VWaXNpYmxlV2l0aE5ld0hlaWdodCAocHJpbWFyeVdpbkluZm8pOworCSAgICAgIGlmIChzcmNXaW5JbmZvLT5nZW5lcmljLmNvbnRlbnRTaXplIDw9IDApCisJCXR1aUVyYXNlU291cmNlQ29udGVudCAoc3JjV2luSW5mbywgRU1QVFlfU09VUkNFX1BST01QVCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIFR1aVdpbkluZm9QdHIgZmlyc3RXaW4sIHNlY29uZFdpbjsKKworCSAgICAgIGlmIChjdXJMYXlvdXQgPT0gU1JDX0RJU0FTU0VNX0NPTU1BTkQpCisJCXsKKwkJICBmaXJzdFdpbiA9IHNyY1dpbjsKKwkJICBzZWNvbmRXaW4gPSBkaXNhc3NlbVdpbjsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGZpcnN0V2luID0gZGF0YVdpbjsKKwkJICBzZWNvbmRXaW4gPSAoVHVpV2luSW5mb1B0cikgKHNvdXJjZVdpbmRvd3MgKCkpLT5saXN0WzBdOworCQl9CisJICAgICAgaWYgKHByaW1hcnlXaW5JbmZvID09IGNtZFdpbikKKwkJewkJLyoKKyAgICAgICAgICAgICAgICAgICAgKiogU3BsaXQgdGhlIGNoYW5nZSBpbiBoZWlnaHQgYWNjcm9zcyB0aGUgMXN0ICYgMm5kIHdpbmRvd3MKKyAgICAgICAgICAgICAgICAgICAgKiogYWRqdXN0aW5nIHRoZW0gYXMgd2VsbC4KKyAgICAgICAgICAgICAgICAgICAgKi8KKwkJICBpbnQgZmlyc3RTcGxpdERpZmYgPSBkaWZmIC8gMjsJLyogc3VidHJhY3QgdGhlIGxvY2F0b3IgKi8KKwkJICBpbnQgc2Vjb25kU3BsaXREaWZmID0gZmlyc3RTcGxpdERpZmY7CisKKwkJICBpZiAoZGlmZiAlIDIpCisJCSAgICB7CisJCSAgICAgIGlmIChmaXJzdFdpbi0+Z2VuZXJpYy5oZWlnaHQgPgorCQkJICBzZWNvbmRXaW4tPmdlbmVyaWMuaGVpZ2h0KQorCQkJaWYgKGRpZmYgPCAwKQorCQkJICBmaXJzdFNwbGl0RGlmZi0tOworCQkJZWxzZQorCQkJICBmaXJzdFNwbGl0RGlmZisrOworCQkgICAgICBlbHNlCisJCQl7CisJCQkgIGlmIChkaWZmIDwgMCkKKwkJCSAgICBzZWNvbmRTcGxpdERpZmYtLTsKKwkJCSAgZWxzZQorCQkJICAgIHNlY29uZFNwbGl0RGlmZisrOworCQkJfQorCQkgICAgfQorCQkgIC8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBtaW5pbXVtIGhpZWdodHMgYXJlIGhvbm9yZWQgKi8KKwkJICB3aGlsZSAoKGZpcnN0V2luLT5nZW5lcmljLmhlaWdodCArIGZpcnN0U3BsaXREaWZmKSA8IDMpCisJCSAgICB7CisJCSAgICAgIGZpcnN0U3BsaXREaWZmKys7CisJCSAgICAgIHNlY29uZFNwbGl0RGlmZi0tOworCQkgICAgfQorCQkgIHdoaWxlICgoc2Vjb25kV2luLT5nZW5lcmljLmhlaWdodCArIHNlY29uZFNwbGl0RGlmZikgPCAzKQorCQkgICAgeworCQkgICAgICBzZWNvbmRTcGxpdERpZmYrKzsKKwkJICAgICAgZmlyc3RTcGxpdERpZmYtLTsKKwkJICAgIH0KKwkJICBfbWFrZUludmlzaWJsZUFuZFNldE5ld0hlaWdodCAoCisJCQkJCQkgIGZpcnN0V2luLAorCQkJCSBmaXJzdFdpbi0+Z2VuZXJpYy5oZWlnaHQgKyBmaXJzdFNwbGl0RGlmZik7CisJCSAgc2Vjb25kV2luLT5nZW5lcmljLm9yaWdpbi55ID0gZmlyc3RXaW4tPmdlbmVyaWMuaGVpZ2h0IC0gMTsKKwkJICBfbWFrZUludmlzaWJsZUFuZFNldE5ld0hlaWdodCAoCisJCSAgICBzZWNvbmRXaW4sIHNlY29uZFdpbi0+Z2VuZXJpYy5oZWlnaHQgKyBzZWNvbmRTcGxpdERpZmYpOworCQkgIGNtZFdpbi0+Z2VuZXJpYy5vcmlnaW4ueSA9IGxvY2F0b3ItPm9yaWdpbi55ICsgMTsKKwkJICBfbWFrZUludmlzaWJsZUFuZFNldE5ld0hlaWdodCAoY21kV2luLCBuZXdIZWlnaHQpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKChjbWRXaW4tPmdlbmVyaWMuaGVpZ2h0ICsgZGlmZikgPCAxKQorCQkgICAgewkJLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICoqIElmIHRoZXJlIGlzIG5vIHdheSB0byBpbmNyZWFzZSB0aGUgY29tbWFuZCB3aW5kb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICoqIHRha2UgcmVhbCBlc3RhdGUgZnJvbSB0aGUgMXN0IG9yIDJuZCB3aW5kb3cuCisgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkgICAgICBpZiAoKGNtZFdpbi0+Z2VuZXJpYy5oZWlnaHQgKyBkaWZmKSA8IDEpCisJCQl7CisJCQkgIGludCBpOworCQkJICBmb3IgKGkgPSBjbWRXaW4tPmdlbmVyaWMuaGVpZ2h0ICsgZGlmZjsKKwkJCSAgICAgICAoaSA8IDEpOyBpKyspCisJCQkgICAgaWYgKHByaW1hcnlXaW5JbmZvID09IGZpcnN0V2luKQorCQkJICAgICAgc2Vjb25kV2luLT5nZW5lcmljLmhlaWdodC0tOworCQkJICAgIGVsc2UKKwkJCSAgICAgIGZpcnN0V2luLT5nZW5lcmljLmhlaWdodC0tOworCQkJfQorCQkgICAgfQorCQkgIGlmIChwcmltYXJ5V2luSW5mbyA9PSBmaXJzdFdpbikKKwkJICAgIF9tYWtlSW52aXNpYmxlQW5kU2V0TmV3SGVpZ2h0IChmaXJzdFdpbiwgbmV3SGVpZ2h0KTsKKwkJICBlbHNlCisJCSAgICBfbWFrZUludmlzaWJsZUFuZFNldE5ld0hlaWdodCAoCisJCQkJCQkgICAgZmlyc3RXaW4sCisJCQkJCQkgIGZpcnN0V2luLT5nZW5lcmljLmhlaWdodCk7CisJCSAgc2Vjb25kV2luLT5nZW5lcmljLm9yaWdpbi55ID0gZmlyc3RXaW4tPmdlbmVyaWMuaGVpZ2h0IC0gMTsKKwkJICBpZiAocHJpbWFyeVdpbkluZm8gPT0gc2Vjb25kV2luKQorCQkgICAgX21ha2VJbnZpc2libGVBbmRTZXROZXdIZWlnaHQgKHNlY29uZFdpbiwgbmV3SGVpZ2h0KTsKKwkJICBlbHNlCisJCSAgICBfbWFrZUludmlzaWJsZUFuZFNldE5ld0hlaWdodCAoCisJCQkJICAgICAgc2Vjb25kV2luLCBzZWNvbmRXaW4tPmdlbmVyaWMuaGVpZ2h0KTsKKwkJICBjbWRXaW4tPmdlbmVyaWMub3JpZ2luLnkgPSBsb2NhdG9yLT5vcmlnaW4ueSArIDE7CisJCSAgaWYgKChjbWRXaW4tPmdlbmVyaWMuaGVpZ2h0ICsgZGlmZikgPCAxKQorCQkgICAgX21ha2VJbnZpc2libGVBbmRTZXROZXdIZWlnaHQgKGNtZFdpbiwgMSk7CisJCSAgZWxzZQorCQkgICAgX21ha2VJbnZpc2libGVBbmRTZXROZXdIZWlnaHQgKAorCQkJCSAgICAgY21kV2luLCBjbWRXaW4tPmdlbmVyaWMuaGVpZ2h0ICsgZGlmZik7CisJCX0KKwkgICAgICBfbWFrZVZpc2libGVXaXRoTmV3SGVpZ2h0IChjbWRXaW4pOworCSAgICAgIF9tYWtlVmlzaWJsZVdpdGhOZXdIZWlnaHQgKHNlY29uZFdpbik7CisJICAgICAgX21ha2VWaXNpYmxlV2l0aE5ld0hlaWdodCAoZmlyc3RXaW4pOworCSAgICAgIGlmIChmaXJzdFdpbi0+Z2VuZXJpYy5jb250ZW50U2l6ZSA8PSAwKQorCQl0dWlFcmFzZVNvdXJjZUNvbnRlbnQgKGZpcnN0V2luLCBFTVBUWV9TT1VSQ0VfUFJPTVBUKTsKKwkgICAgICBpZiAoc2Vjb25kV2luLT5nZW5lcmljLmNvbnRlbnRTaXplIDw9IDApCisJCXR1aUVyYXNlU291cmNlQ29udGVudCAoc2Vjb25kV2luLCBFTVBUWV9TT1VSQ0VfUFJPTVBUKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30JCQkJLyogX3R1aUFkanVzdFdpbkhlaWdodHMgKi8KKworCisvKgorKiogX21ha2VJbnZpc2libGVBbmRTZXROZXdIZWlnaHQoKS4KKyoqICAgICAgICBGdW5jdGlvbiBtYWtlIHRoZSB0YXJnZXQgd2luZG93IChhbmQgYXV4aWxsYXJ5IHdpbmRvd3MgYXNzb2NpYXRlZAorKiogICAgICAgIHdpdGggdGhlIHRhcmdlcikgaW52aXNpYmxlLCBhbmQgc2V0IHRoZSBuZXcgaGVpZ2h0IGFuZCBsb2NhdGlvbi4KKyovCitzdGF0aWMgdm9pZAorI2lmZGVmIF9fU1REQ19fCitfbWFrZUludmlzaWJsZUFuZFNldE5ld0hlaWdodCAoCisJCQkJVHVpV2luSW5mb1B0ciB3aW5JbmZvLAorCQkJCWludCBoZWlnaHQpCisjZWxzZQorX21ha2VJbnZpc2libGVBbmRTZXROZXdIZWlnaHQgKHdpbkluZm8sIGhlaWdodCkKKyAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvOworICAgICBpbnQgaGVpZ2h0OworI2VuZGlmCit7CisgIGludCBpOworICBzdHJ1Y3Qgc3ltdGFiICpzOworICBUdWlHZW5XaW5JbmZvUHRyIGdlbldpbkluZm87CisKKworICBtX2JlSW52aXNpYmxlICgmd2luSW5mby0+Z2VuZXJpYyk7CisgIHdpbkluZm8tPmdlbmVyaWMuaGVpZ2h0ID0gaGVpZ2h0OworICBpZiAoaGVpZ2h0ID4gMSkKKyAgICB3aW5JbmZvLT5nZW5lcmljLnZpZXdwb3J0SGVpZ2h0ID0gaGVpZ2h0IC0gMTsKKyAgZWxzZQorICAgIHdpbkluZm8tPmdlbmVyaWMudmlld3BvcnRIZWlnaHQgPSBoZWlnaHQ7CisgIGlmICh3aW5JbmZvICE9IGNtZFdpbikKKyAgICB3aW5JbmZvLT5nZW5lcmljLnZpZXdwb3J0SGVpZ2h0LS07CisKKyAgLyogTm93IGRlYWwgd2l0aCB0aGUgYXV4aWxsYXJ5IHdpbmRvd3MgYXNzb2NpYXRlZCB3aXRoIHdpbkluZm8gKi8KKyAgc3dpdGNoICh3aW5JbmZvLT5nZW5lcmljLnR5cGUpCisgICAgeworICAgIGNhc2UgU1JDX1dJTjoKKyAgICBjYXNlIERJU0FTU0VNX1dJTjoKKyAgICAgIGdlbldpbkluZm8gPSB3aW5JbmZvLT5kZXRhaWwuc291cmNlSW5mby5leGVjdXRpb25JbmZvOworICAgICAgbV9iZUludmlzaWJsZSAoZ2VuV2luSW5mbyk7CisgICAgICBnZW5XaW5JbmZvLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICBnZW5XaW5JbmZvLT5vcmlnaW4ueSA9IHdpbkluZm8tPmdlbmVyaWMub3JpZ2luLnk7CisgICAgICBpZiAoaGVpZ2h0ID4gMSkKKwlnZW5XaW5JbmZvLT52aWV3cG9ydEhlaWdodCA9IGhlaWdodCAtIDE7CisgICAgICBlbHNlCisJZ2VuV2luSW5mby0+dmlld3BvcnRIZWlnaHQgPSBoZWlnaHQ7CisgICAgICBpZiAod2luSW5mbyAhPSBjbWRXaW4pCisJZ2VuV2luSW5mby0+dmlld3BvcnRIZWlnaHQtLTsKKworICAgICAgaWYgKG1faGFzTG9jYXRvciAod2luSW5mbykpCisJeworCSAgZ2VuV2luSW5mbyA9IGxvY2F0b3JXaW5JbmZvUHRyICgpOworCSAgbV9iZUludmlzaWJsZSAoZ2VuV2luSW5mbyk7CisJICBnZW5XaW5JbmZvLT5vcmlnaW4ueSA9IHdpbkluZm8tPmdlbmVyaWMub3JpZ2luLnkgKyBoZWlnaHQ7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBEQVRBX1dJTjoKKyAgICAgIC8qIGRlbGV0ZSBhbGwgZGF0YSBpdGVtIHdpbmRvd3MgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCB3aW5JbmZvLT5nZW5lcmljLmNvbnRlbnRTaXplOyBpKyspCisJeworCSAgZ2VuV2luSW5mbyA9IChUdWlHZW5XaW5JbmZvUHRyKSAmICgoVHVpV2luRWxlbWVudFB0cikKKwkJICAgICAgd2luSW5mby0+Z2VuZXJpYy5jb250ZW50W2ldKS0+d2hpY2hFbGVtZW50LmRhdGFXaW5kb3c7CisJICB0dWlEZWx3aW4gKGdlbldpbkluZm8tPmhhbmRsZSk7CisJICBnZW5XaW5JbmZvLT5oYW5kbGUgPSAoV0lORE9XICopIE5VTEw7CisJfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIF9tYWtlSW52aXNpYmxlQW5kU2V0TmV3SGVpZ2h0ICovCisKKworLyoKKyoqIF9tYWtlVmlzaWJsZVdpdGhOZXdIZWlnaHQoKS4KKyoqICAgICAgICBGdW5jdGlvbiB0byBtYWtlIHRoZSB3aW5kb3dzIHdpdGggbmV3IGhlaWdodHMgdmlzaWJsZS4KKyoqICAgICAgICBUaGlzIG1lYW5zIHJlLWNyZWF0aW5nIHRoZSB3aW5kb3dzJyBjb250ZW50IHNpbmNlIHRoZSB3aW5kb3cKKyoqICAgICAgICBoYWQgdG8gYmUgZGVzdHJveWVkIHRvIGJlIG1hZGUgaW52aXNpYmxlLgorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK19tYWtlVmlzaWJsZVdpdGhOZXdIZWlnaHQgKAorCQkJICAgIFR1aVdpbkluZm9QdHIgd2luSW5mbykKKyNlbHNlCitfbWFrZVZpc2libGVXaXRoTmV3SGVpZ2h0ICh3aW5JbmZvKQorICAgICBUdWlXaW5JbmZvUHRyIHdpbkluZm87CisjZW5kaWYKK3sKKyAgaW50IGk7CisgIHN0cnVjdCBzeW10YWIgKnM7CisKKyAgbV9iZVZpc2libGUgKCZ3aW5JbmZvLT5nZW5lcmljKTsKKyAgY2hlY2tBbmREaXNwbGF5SGlnaGxpZ2h0SWZOZWVkZWQgKHdpbkluZm8pOworICBzd2l0Y2ggKHdpbkluZm8tPmdlbmVyaWMudHlwZSkKKyAgICB7CisgICAgY2FzZSBTUkNfV0lOOgorICAgIGNhc2UgRElTQVNTRU1fV0lOOgorICAgICAgZnJlZVdpbkNvbnRlbnQgKHdpbkluZm8tPmRldGFpbC5zb3VyY2VJbmZvLmV4ZWN1dGlvbkluZm8pOworICAgICAgbV9iZVZpc2libGUgKHdpbkluZm8tPmRldGFpbC5zb3VyY2VJbmZvLmV4ZWN1dGlvbkluZm8pOworICAgICAgaWYgKHdpbkluZm8tPmdlbmVyaWMuY29udGVudCAhPSAoT3BhcXVlUHRyKSBOVUxMKQorCXsKKwkgIFR1aUxpbmVPckFkZHJlc3MgbGluZU9yQWRkcjsKKworCSAgaWYgKHdpbkluZm8tPmdlbmVyaWMudHlwZSA9PSBTUkNfV0lOKQorCSAgICBsaW5lT3JBZGRyLmxpbmVObyA9CisJICAgICAgd2luSW5mby0+ZGV0YWlsLnNvdXJjZUluZm8uc3RhcnRMaW5lT3JBZGRyLmxpbmVObzsKKwkgIGVsc2UKKwkgICAgbGluZU9yQWRkci5hZGRyID0KKwkgICAgICB3aW5JbmZvLT5kZXRhaWwuc291cmNlSW5mby5zdGFydExpbmVPckFkZHIuYWRkcjsKKwkgIGZyZWVXaW5Db250ZW50ICgmd2luSW5mby0+Z2VuZXJpYyk7CisJICB0dWlVcGRhdGVTb3VyY2VXaW5kb3cgKHdpbkluZm8sCisJCQkJIGN1cnJlbnRfc291cmNlX3N5bXRhYiwKKwkJCQkgKCh3aW5JbmZvLT5nZW5lcmljLnR5cGUgPT0gU1JDX1dJTikgPworCQkJCSAgKE9wYXF1ZSkgbGluZU9yQWRkci5saW5lTm8gOgorCQkJCSAgbGluZU9yQWRkci5hZGRyKSwKKwkJCQkgVFJVRSk7CisJfQorICAgICAgZWxzZSBpZiAoc2VsZWN0ZWRfZnJhbWUgIT0gKHN0cnVjdCBmcmFtZV9pbmZvICopIE5VTEwpCisJeworCSAgT3BhcXVlIGxpbmUgPSAwOworCSAgZXh0ZXJuIGludCBjdXJyZW50X3NvdXJjZV9saW5lOworCisJICBzID0gZmluZF9wY19zeW10YWIgKHNlbGVjdGVkX2ZyYW1lLT5wYyk7CisJICBpZiAod2luSW5mby0+Z2VuZXJpYy50eXBlID09IFNSQ19XSU4pCisJICAgIGxpbmUgPSAoT3BhcXVlKSBjdXJyZW50X3NvdXJjZV9saW5lOworCSAgZWxzZQorCSAgICBsaW5lID0gKE9wYXF1ZSkgZmluZF9saW5lX3BjIChzLCBjdXJyZW50X3NvdXJjZV9saW5lKTsKKwkgIHR1aVVwZGF0ZVNvdXJjZVdpbmRvdyAod2luSW5mbywgcywgbGluZSwgVFJVRSk7CisJfQorICAgICAgaWYgKG1faGFzTG9jYXRvciAod2luSW5mbykpCisJeworCSAgbV9iZVZpc2libGUgKGxvY2F0b3JXaW5JbmZvUHRyICgpKTsKKwkgIHR1aUNsZWFyTG9jYXRvckRpc3BsYXkgKCk7CisJICB0dWlTaG93TG9jYXRvckNvbnRlbnQgKCk7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBEQVRBX1dJTjoKKyAgICAgIHR1aURpc3BsYXlBbGxEYXRhICgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTURfV0lOOgorICAgICAgd2luSW5mby0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1ckxpbmUgPSAwOworICAgICAgd2luSW5mby0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1cmNoID0gMDsKKyAgICAgIHdtb3ZlICh3aW5JbmZvLT5nZW5lcmljLmhhbmRsZSwKKwkgICAgIHdpbkluZm8tPmRldGFpbC5jb21tYW5kSW5mby5jdXJMaW5lLAorCSAgICAgd2luSW5mby0+ZGV0YWlsLmNvbW1hbmRJbmZvLmN1cmNoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuOworfQkJCQkvKiBfbWFrZVZpc2libGVXaXRoTmV3SGVpZ2h0ICovCisKKworc3RhdGljIGludAorI2lmZGVmIF9fU1REQ19fCitfbmV3SGVpZ2h0T2sgKAorCSAgICAgICBUdWlXaW5JbmZvUHRyIHByaW1hcnlXaW5JbmZvLAorCSAgICAgICBpbnQgbmV3SGVpZ2h0KQorI2Vsc2UKK19uZXdIZWlnaHRPayAocHJpbWFyeVdpbkluZm8sIG5ld0hlaWdodCkKKyAgICAgVHVpV2luSW5mb1B0ciBwcmltYXJ5V2luSW5mbzsKKyAgICAgaW50IG5ld0hlaWdodDsKKyNlbmRpZgoreworICBpbnQgb2sgPSAobmV3SGVpZ2h0IDwgdGVybUhlaWdodCAoKSk7CisKKyAgaWYgKG9rKQorICAgIHsKKyAgICAgIGludCBkaWZmLCBjdXJIZWlnaHQ7CisgICAgICBUdWlMYXlvdXRUeXBlIGN1ckxheW91dCA9IGN1cnJlbnRMYXlvdXQgKCk7CisKKyAgICAgIGRpZmYgPSAobmV3SGVpZ2h0IC0gcHJpbWFyeVdpbkluZm8tPmdlbmVyaWMuaGVpZ2h0KSAqICgtMSk7CisgICAgICBpZiAoY3VyTGF5b3V0ID09IFNSQ19DT01NQU5EIHx8IGN1ckxheW91dCA9PSBESVNBU1NFTV9DT01NQU5EKQorCXsKKwkgIG9rID0gKChwcmltYXJ5V2luSW5mby0+Z2VuZXJpYy50eXBlID09IENNRF9XSU4gJiYKKwkJIG5ld0hlaWdodCA8PSAodGVybUhlaWdodCAoKSAtIDQpICYmCisJCSBuZXdIZWlnaHQgPj0gTUlOX0NNRF9XSU5fSEVJR0hUKSB8fAorCQkocHJpbWFyeVdpbkluZm8tPmdlbmVyaWMudHlwZSAhPSBDTURfV0lOICYmCisJCSBuZXdIZWlnaHQgPD0gKHRlcm1IZWlnaHQgKCkgLSAyKSAmJgorCQkgbmV3SGVpZ2h0ID49IE1JTl9XSU5fSEVJR0hUKSk7CisJICBpZiAob2spCisJICAgIHsJCQkvKiBjaGVjayB0aGUgdG90YWwgaGVpZ2h0ICovCisJICAgICAgVHVpV2luSW5mb1B0ciB3aW5JbmZvOworCisJICAgICAgaWYgKHByaW1hcnlXaW5JbmZvID09IGNtZFdpbikKKwkJd2luSW5mbyA9IChUdWlXaW5JbmZvUHRyKSAoc291cmNlV2luZG93cyAoKSktPmxpc3RbMF07CisJICAgICAgZWxzZQorCQl3aW5JbmZvID0gY21kV2luOworCSAgICAgIG9rID0gKChuZXdIZWlnaHQgKworCQkgICAgICh3aW5JbmZvLT5nZW5lcmljLmhlaWdodCArIGRpZmYpKSA8PSB0ZXJtSGVpZ2h0ICgpKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBpbnQgY3VyVG90YWxIZWlnaHQsIHRvdGFsSGVpZ2h0LCBtaW5IZWlnaHQ7CisJICBUdWlXaW5JbmZvUHRyIGZpcnN0V2luLCBzZWNvbmRXaW47CisKKwkgIGlmIChjdXJMYXlvdXQgPT0gU1JDX0RJU0FTU0VNX0NPTU1BTkQpCisJICAgIHsKKwkgICAgICBmaXJzdFdpbiA9IHNyY1dpbjsKKwkgICAgICBzZWNvbmRXaW4gPSBkaXNhc3NlbVdpbjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZmlyc3RXaW4gPSBkYXRhV2luOworCSAgICAgIHNlY29uZFdpbiA9IChUdWlXaW5JbmZvUHRyKSAoc291cmNlV2luZG93cyAoKSktPmxpc3RbMF07CisJICAgIH0KKwkgIC8qCisgICAgICAgICAgICAqKiBXZSBjb3VsZCBzaW1wbHkgYWRkIGFsbCB0aGUgaGVpZ2h0cyB0byBvYnRhaW4gdGhlIHNhbWUgcmVzdWx0CisgICAgICAgICAgICAqKiBidXQgYmVsb3cgaXMgbW9yZSBleHBsaWNpdCBzaW5jZSB3ZSBzdWJ0cmFjdCAxIGZvciB0aGUKKyAgICAgICAgICAgICoqIGxpbmUgdGhhdCB0aGUgZmlyc3QgYW5kIHNlY29uZCB3aW5kb3dzIHNoYXJlLCBhbmQgYWRkIG9uZQorICAgICAgICAgICAgKiogZm9yIHRoZSBsb2NhdG9yLgorICAgICAgICAgICAgKi8KKwkgIGN1clRvdGFsSGVpZ2h0ID0KKwkgICAgKGZpcnN0V2luLT5nZW5lcmljLmhlaWdodCArIHNlY29uZFdpbi0+Z2VuZXJpYy5oZWlnaHQgLSAxKQorCSAgICArIGNtZFdpbi0+Z2VuZXJpYy5oZWlnaHQgKyAxIC8qbG9jYXRvciovIDsKKwkgIGlmIChwcmltYXJ5V2luSW5mbyA9PSBjbWRXaW4pCisJICAgIHsKKwkgICAgICAvKiBsb2NhdG9yIGluY2x1ZGVkIHNpbmNlIGZpcnN0ICYgc2Vjb25kIHdpbiBzaGFyZSBhIGxpbmUgKi8KKwkgICAgICBvayA9ICgoZmlyc3RXaW4tPmdlbmVyaWMuaGVpZ2h0ICsKKwkJICAgICBzZWNvbmRXaW4tPmdlbmVyaWMuaGVpZ2h0ICsgZGlmZikgPj0KKwkJICAgIChNSU5fV0lOX0hFSUdIVCAqIDIpICYmCisJCSAgICBuZXdIZWlnaHQgPj0gTUlOX0NNRF9XSU5fSEVJR0hUKTsKKwkgICAgICBpZiAob2spCisJCXsKKwkJICB0b3RhbEhlaWdodCA9IG5ld0hlaWdodCArIChmaXJzdFdpbi0+Z2VuZXJpYy5oZWlnaHQgKworCQkJCQkgIHNlY29uZFdpbi0+Z2VuZXJpYy5oZWlnaHQgKyBkaWZmKTsKKwkJICBtaW5IZWlnaHQgPSBNSU5fQ01EX1dJTl9IRUlHSFQ7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgbWluSGVpZ2h0ID0gTUlOX1dJTl9IRUlHSFQ7CisJICAgICAgLyoKKyAgICAgICAgICAgICAgICAqKiBGaXJzdCBzZWUgaWYgd2UgY2FuIGluY3JlYXNlL2RlY3JlYXNlIHRoZSBjb21tYW5kCisgICAgICAgICAgICAgICAgKiogd2luZG93LiAgQW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb21tYW5kIHdpbmRvdyBpcworICAgICAgICAgICAgICAgICoqIGF0IGxlYXN0IDEgbGluZQorICAgICAgICAgICAgICAgICovCisJICAgICAgb2sgPSAoKGNtZFdpbi0+Z2VuZXJpYy5oZWlnaHQgKyBkaWZmKSA+IDApOworCSAgICAgIGlmICghb2spCisJCXsJCS8qCisgICAgICAgICAgICAgICAgICAgICAqKiBMb29rcyBsaWtlIHdlIGhhdmUgdG8gaW5jcmVhc2UvZGVjcmVhc2Ugb25lIG9mCisgICAgICAgICAgICAgICAgICAgICAqKiB0aGUgb3RoZXIgd2luZG93cworICAgICAgICAgICAgICAgICAgICAgKi8KKwkJICBpZiAocHJpbWFyeVdpbkluZm8gPT0gZmlyc3RXaW4pCisJCSAgICBvayA9IChzZWNvbmRXaW4tPmdlbmVyaWMuaGVpZ2h0ICsgZGlmZikgPj0gbWluSGVpZ2h0OworCQkgIGVsc2UKKwkJICAgIG9rID0gKGZpcnN0V2luLT5nZW5lcmljLmhlaWdodCArIGRpZmYpID49IG1pbkhlaWdodDsKKwkJfQorCSAgICAgIGlmIChvaykKKwkJeworCQkgIGlmIChwcmltYXJ5V2luSW5mbyA9PSBmaXJzdFdpbikKKwkJICAgIHRvdGFsSGVpZ2h0ID0gbmV3SGVpZ2h0ICsKKwkJICAgICAgc2Vjb25kV2luLT5nZW5lcmljLmhlaWdodCArCisJCSAgICAgIGNtZFdpbi0+Z2VuZXJpYy5oZWlnaHQgKyBkaWZmOworCQkgIGVsc2UKKwkJICAgIHRvdGFsSGVpZ2h0ID0gbmV3SGVpZ2h0ICsKKwkJICAgICAgZmlyc3RXaW4tPmdlbmVyaWMuaGVpZ2h0ICsKKwkJICAgICAgY21kV2luLT5nZW5lcmljLmhlaWdodCArIGRpZmY7CisJCX0KKwkgICAgfQorCSAgLyoKKyAgICAgICAgICAgICoqIE5vdyBtYWtlIHN1cmUgdGhhdCB0aGUgcHJvcG9zZWQgdG90YWwgaGVpZ2h0IGRvZXNuJ3QgZXhjZWVkCisgICAgICAgICAgICAqKiB0aGUgb2xkIHRvdGFsIGhlaWdodC4KKyAgICAgICAgICAgICovCisJICBpZiAob2spCisJICAgIG9rID0gKG5ld0hlaWdodCA+PSBtaW5IZWlnaHQgJiYgdG90YWxIZWlnaHQgPD0gY3VyVG90YWxIZWlnaHQpOworCX0KKyAgICB9CisKKyAgcmV0dXJuIG9rOworfQkJCQkvKiBfbmV3SGVpZ2h0T2sgKi8KKworCisvKgorKiogX3BhcnNlU2Nyb2xsaW5nQXJncygpLgorKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgX19TVERDX18KK19wYXJzZVNjcm9sbGluZ0FyZ3MgKAorCQkgICAgICBjaGFyICphcmcsCisJCSAgICAgIFR1aVdpbkluZm9QdHIgKiB3aW5Ub1Njcm9sbCwKKwkJICAgICAgaW50ICpudW1Ub1Njcm9sbCkKKyNlbHNlCitfcGFyc2VTY3JvbGxpbmdBcmdzIChhcmcsIHdpblRvU2Nyb2xsLCBudW1Ub1Njcm9sbCkKKyAgICAgY2hhciAqYXJnOworICAgICBUdWlXaW5JbmZvUHRyICp3aW5Ub1Njcm9sbDsKKyAgICAgaW50ICpudW1Ub1Njcm9sbDsKKyNlbmRpZgoreworICBpZiAobnVtVG9TY3JvbGwpCisgICAgKm51bVRvU2Nyb2xsID0gMDsKKyAgKndpblRvU2Nyb2xsID0gdHVpV2luV2l0aEZvY3VzICgpOworCisgIC8qCisgICAgKiogRmlyc3Qgc2V0IHVwIHRoZSBkZWZhdWx0IHdpbmRvdyB0byBzY3JvbGwsIGluIGNhc2UgdGhlcmUgaXMgbm8KKyAgICAqKiB3aW5kb3cgbmFtZSBhcmcKKyAgICAqLworICBpZiAoYXJnICE9IChjaGFyICopIE5VTEwpCisgICAgeworICAgICAgY2hhciAqYnVmLCAqYnVmUHRyOworCisgICAgICAvKiBwcm9jZXNzIHRoZSBudW1iZXIgb2YgbGluZXMgdG8gc2Nyb2xsICovCisgICAgICBidWYgPSBidWZQdHIgPSB0dWlTdHJEdXAgKGFyZyk7CisgICAgICBpZiAoaXNkaWdpdCAoKmJ1ZlB0cikpCisJeworCSAgY2hhciAqbnVtU3RyOworCisJICBudW1TdHIgPSBidWZQdHI7CisJICBidWZQdHIgPSBzdHJjaHIgKGJ1ZlB0ciwgJyAnKTsKKwkgIGlmIChidWZQdHIgIT0gKGNoYXIgKikgTlVMTCkKKwkgICAgeworCSAgICAgICpidWZQdHIgPSAoY2hhcikgMDsKKwkgICAgICBpZiAobnVtVG9TY3JvbGwpCisJCSpudW1Ub1Njcm9sbCA9IGF0b2kgKG51bVN0cik7CisJICAgICAgYnVmUHRyKys7CisJICAgIH0KKwkgIGVsc2UgaWYgKG51bVRvU2Nyb2xsKQorCSAgICAqbnVtVG9TY3JvbGwgPSBhdG9pIChudW1TdHIpOworCX0KKworICAgICAgLyogcHJvY2VzcyB0aGUgd2luZG93IG5hbWUgaWYgb25lIGlzIHNwZWNpZmllZCAqLworICAgICAgaWYgKGJ1ZlB0ciAhPSAoY2hhciAqKSBOVUxMKQorCXsKKwkgIGNoYXIgKnduYW1lOworCSAgaW50IGk7CisKKwkgIGlmICgqYnVmUHRyID09ICcgJykKKwkgICAgd2hpbGUgKCooKytidWZQdHIpID09ICcgJykKKwkgICAgICA7CisKKwkgIGlmICgqYnVmUHRyICE9IChjaGFyKSAwKQorCSAgICB3bmFtZSA9IGJ1ZlB0cjsKKworCSAgLyogVmFsaWRhdGUgdGhlIHdpbmRvdyBuYW1lICovCisJICBmb3IgKGkgPSAwOyBpIDwgc3RybGVuICh3bmFtZSk7IGkrKykKKwkgICAgd25hbWVbaV0gPSB0b3VwcGVyICh3bmFtZVtpXSk7CisJICAqd2luVG9TY3JvbGwgPSBwYXJ0aWFsV2luQnlOYW1lICh3bmFtZSk7CisKKwkgIGlmICgqd2luVG9TY3JvbGwgPT0gKFR1aVdpbkluZm9QdHIpIE5VTEwgfHwKKwkgICAgICAhKCp3aW5Ub1Njcm9sbCktPmdlbmVyaWMuaXNWaXNpYmxlKQorCSAgICB3YXJuaW5nICgiSW52YWxpZCB3aW5kb3cgc3BlY2lmaWVkLiBcblwKK1RoZSB3aW5kb3cgbmFtZSBzcGVjaWZpZWQgbXVzdCBiZSB2YWxpZCBhbmQgdmlzaWJsZS5cbiIpOworCSAgZWxzZSBpZiAoKndpblRvU2Nyb2xsID09IGNtZFdpbikKKwkgICAgKndpblRvU2Nyb2xsID0gKFR1aVdpbkluZm9QdHIpIChzb3VyY2VXaW5kb3dzICgpKS0+bGlzdFswXTsKKwl9CisgICAgICB0dWlGcmVlIChidWYpOworICAgIH0KKworICByZXR1cm47Cit9CQkJCS8qIF9wYXJzZVNjcm9sbGluZ0FyZ3MgKi8KZGlmZiAtLWdpdCBhL2dkYi90dWkvdHVpV2luLmggYi9nZGIvdHVpL3R1aVdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiODQ1NWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdHVpL3R1aVdpbi5oCkBAIC0wLDAgKzEsMjggQEAKKyNpZm5kZWYgX1RVSV9XSU5fSAorI2RlZmluZSBfVFVJX1dJTl9ICisvKgorKiogVGhpcyBoZWFkZXIgZmlsZSBzdXBwb3J0cworKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBUWVBFIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogUFVCTElDIEZVTkNUSU9OIEVYVEVSTkFMIERFQ0xTICAgICAgICAqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgdHVpU2Nyb2xsRm9yd2FyZCBQQVJBTVMgKChUdWlXaW5JbmZvUHRyLCBpbnQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHR1aVNjcm9sbEJhY2t3YXJkIFBBUkFNUyAoKFR1aVdpbkluZm9QdHIsIGludCkpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgdHVpU2Nyb2xsTGVmdCBQQVJBTVMgKChUdWlXaW5JbmZvUHRyLCBpbnQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHR1aVNjcm9sbFJpZ2h0IFBBUkFNUyAoKFR1aVdpbkluZm9QdHIsIGludCkpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgdHVpX3ZTY3JvbGwgUEFSQU1TICgodmFfbGlzdCkpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgdHVpU2V0V2luRm9jdXNUbyBQQVJBTVMgKChUdWlXaW5JbmZvUHRyKSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICB0dWlDbGVhcldpbkZvY3VzRnJvbSBQQVJBTVMgKChUdWlXaW5JbmZvUHRyKSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICB0dWlDbGVhcldpbkZvY3VzIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHR1aVJlc2l6ZUFsbCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICB0dWlSZWZyZXNoQWxsIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHR1aVNpZ3dpbmNoSGFuZGxlciBQQVJBTVMgKChpbnQpKTsKKworI2VuZGlmIC8qX1RVSV9XSU5fSCovCmRpZmYgLS1naXQgYS9nZGIvdHlwZXByaW50LmMgYi9nZGIvdHlwZXByaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0ODc3YgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90eXBlcHJpbnQuYwpAQCAtMCwwICsxLDMyMSBAQAorLyogTGFuZ3VhZ2UgaW5kZXBlbmRlbnQgc3VwcG9ydCBmb3IgcHJpbnRpbmcgdHlwZXMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTg2LCA4OCwgODksIDkxLCA5MiwgOTMsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJvYnN0YWNrLmgiCisjaW5jbHVkZSAiYmZkLmgiCQkvKiBCaW5hcnkgRmlsZSBEZXNjcmlwdGlvbiAqLworI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1ZGUgImRlbWFuZ2xlLmgiCisKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKworLyogRm9yIHJlYWwtdHlwZSBwcmludGluZyBpbiB3aGF0aXNfZXhwKCkgKi8KK2V4dGVybiBpbnQgb2JqZWN0cHJpbnQ7CQkvKiBDb250cm9scyBsb29raW5nIHVwIGFuIG9iamVjdCdzIGRlcml2ZWQgdHlwZQorCQkJCSAgIHVzaW5nIHdoYXQgd2UgZmluZCBpbiBpdHMgdnRhYmxlcy4gICovCisKK3N0YXRpYyB2b2lkCitwdHlwZV9jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqCitwdHlwZV9ldmFsIFBBUkFNUyAoKHN0cnVjdCBleHByZXNzaW9uICopKTsKKworc3RhdGljIHZvaWQKK3doYXRpc19jb21tYW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCit3aGF0aXNfZXhwIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKKy8qIFByaW50IGEgZGVzY3JpcHRpb24gb2YgYSB0eXBlIFRZUEUgaW4gdGhlIGZvcm0gb2YgYSBkZWNsYXJhdGlvbiBvZiBhCisgICB2YXJpYWJsZSBuYW1lZCBWQVJTVFJJTkcuICAoVkFSU1RSSU5HIGlzIGRlbWFuZ2xlZCBpZiBuZWNlc3NhcnkuKQorICAgT3V0cHV0IGdvZXMgdG8gU1RSRUFNICh2aWEgc3RkaW8pLgorICAgSWYgU0hPVyBpcyBwb3NpdGl2ZSwgd2Ugc2hvdyB0aGUgY29udGVudHMgb2YgdGhlIG91dGVybW9zdCBsZXZlbAorICAgb2Ygc3RydWN0dXJlIGV2ZW4gaWYgdGhlcmUgaXMgYSB0eXBlIG5hbWUgdGhhdCBjb3VsZCBiZSB1c2VkIGluc3RlYWQuCisgICBJZiBTSE9XIGlzIG5lZ2F0aXZlLCB3ZSBuZXZlciBzaG93IHRoZSBkZXRhaWxzIG9mIGVsZW1lbnRzJyB0eXBlcy4gICovCisKK3ZvaWQKK3R5cGVfcHJpbnQgKHR5cGUsIHZhcnN0cmluZywgc3RyZWFtLCBzaG93KQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgY2hhciAqdmFyc3RyaW5nOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgc2hvdzsKK3sKKyAgTEFfUFJJTlRfVFlQRSAodHlwZSwgdmFyc3RyaW5nLCBzdHJlYW0sIHNob3csIDApOworfQorCisvKiBQcmludCB0eXBlIG9mIEVYUCwgb3IgbGFzdCB0aGluZyBpbiB2YWx1ZSBoaXN0b3J5IGlmIEVYUCA9PSBOVUxMLgorICAgc2hvdyBpcyBwYXNzZWQgdG8gdHlwZV9wcmludC4gICovCisKK3N0YXRpYyB2b2lkCit3aGF0aXNfZXhwIChleHAsIHNob3cpCisgICAgIGNoYXIgKmV4cDsKKyAgICAgaW50IHNob3c7Cit7CisgIHN0cnVjdCBleHByZXNzaW9uICpleHByOworICByZWdpc3RlciB2YWx1ZV9wdHIgdmFsOworICByZWdpc3RlciBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluID0gTlVMTDsKKyAgc3RydWN0IHR5cGUgKiByZWFsX3R5cGUgPSBOVUxMOworICBpbnQgZnVsbCA9IDA7CisgIGludCB0b3AgPSAtMTsKKyAgaW50IHVzaW5nX2VuYyA9IDA7CisKKyAgaWYgKGV4cCkKKyAgICB7CisgICAgICBleHByID0gcGFyc2VfZXhwcmVzc2lvbiAoZXhwKTsKKyAgICAgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlX2N1cnJlbnRfY29udGVudHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhwcik7CisgICAgICB2YWwgPSBldmFsdWF0ZV90eXBlIChleHByKTsKKyAgICB9CisgIGVsc2UKKyAgICB2YWwgPSBhY2Nlc3NfdmFsdWVfaGlzdG9yeSAoMCk7CisKKyAgcmVhbF90eXBlID0gdmFsdWVfcnR0aV90eXBlICh2YWwsICZmdWxsLCAmdG9wLCAmdXNpbmdfZW5jKTsKKworICBwcmludGZfZmlsdGVyZWQgKCJ0eXBlID0gIik7CisKKyAgaWYgKHJlYWxfdHlwZSAmJiBvYmplY3RwcmludCkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIvKiByZWFsIHR5cGUgPSAlcyVzICovXG4iLAorICAgICAgICAgICAgICAgICAgICAgVFlQRV9OQU1FIChyZWFsX3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgZnVsbCA/ICIiIDogIiAoaW5jb21wbGV0ZSBvYmplY3QpIik7CisgIC8qIEZJWE1FOiBtYXliZSBiZXR0ZXIgdG8gdXNlIHR5cGVfcHJpbnQgKHJlYWxfdHlwZSwgIiIsIGdkYl9zdGRvdXQsIC0xKTsgKi8KKworICB0eXBlX3ByaW50IChWQUxVRV9UWVBFICh2YWwpLCAiIiwgZ2RiX3N0ZG91dCwgc2hvdyk7CisgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisKKyAgaWYgKGV4cCkKKyAgICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCit3aGF0aXNfY29tbWFuZCAoZXhwLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIC8qIE1vc3Qgb2YgdGhlIHRpbWUgdXNlcnMgZG8gbm90IHdhbnQgdG8gc2VlIGFsbCB0aGUgZmllbGRzCisgICAgIGluIGEgc3RydWN0dXJlLiAgSWYgdGhleSBkbyB0aGV5IGNhbiB1c2UgdGhlICJwdHlwZSIgY29tbWFuZC4KKyAgICAgSGVuY2UgdGhlICItMSIgYmVsb3cuICAqLworICB3aGF0aXNfZXhwIChleHAsIC0xKTsKK30KKworLyogU2ltcGxlIHN1YnJvdXRpbmUgZm9yIHB0eXBlX2NvbW1hbmQuICAqLworCitzdGF0aWMgc3RydWN0IHR5cGUgKgorcHR5cGVfZXZhbCAoZXhwKQorICAgICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwOworeworICBpZiAoZXhwLT5lbHRzWzBdLm9wY29kZSA9PSBPUF9UWVBFKQorICAgIHsKKyAgICAgIHJldHVybiAoZXhwLT5lbHRzWzFdLnR5cGUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiAoTlVMTCk7CisgICAgfQorfQorCisvKiBUWVBFTkFNRSBpcyBlaXRoZXIgdGhlIG5hbWUgb2YgYSB0eXBlLCBvciBhbiBleHByZXNzaW9uLiAgKi8KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitwdHlwZV9jb21tYW5kICh0eXBlbmFtZSwgZnJvbV90dHkpCisgICAgIGNoYXIgKnR5cGVuYW1lOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCB0eXBlICp0eXBlOworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwcjsKKyAgcmVnaXN0ZXIgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKworICBpZiAodHlwZW5hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBQcmludCB0eXBlIG9mIGxhc3QgdGhpbmcgaW4gdmFsdWUgaGlzdG9yeS4gKi8KKyAgICAgIHdoYXRpc19leHAgKHR5cGVuYW1lLCAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBleHByID0gcGFyc2VfZXhwcmVzc2lvbiAodHlwZW5hbWUpOworICAgICAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIGZyZWVfY3VycmVudF9jb250ZW50cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHByKTsKKyAgICAgIHR5cGUgPSBwdHlwZV9ldmFsIChleHByKTsKKyAgICAgIGlmICh0eXBlICE9IE5VTEwpCisJeworCSAgLyogVXNlciBkaWQgInB0eXBlIDx0eXBlbmFtZT4iICovCisJICBwcmludGZfZmlsdGVyZWQgKCJ0eXBlID0gIik7CisJICB0eXBlX3ByaW50ICh0eXBlLCAiIiwgZ2RiX3N0ZG91dCwgMSk7CisJICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworCSAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFVzZXIgZGlkICJwdHlwZSA8c3ltYm9sbmFtZT4iICovCisJICBkb19jbGVhbnVwcyAob2xkX2NoYWluKTsKKwkgIHdoYXRpc19leHAgKHR5cGVuYW1lLCAxKTsKKwl9CisgICAgfQorfQorCisvKiBQcmludCBpbnRlZ3JhbCBzY2FsYXIgZGF0YSBWQUwsIG9mIHR5cGUgVFlQRSwgb250byBzdGRpbyBzdHJlYW0gU1RSRUFNLgorICAgVXNlZCB0byBwcmludCBkYXRhIGZyb20gdHlwZSBzdHJ1Y3R1cmVzIGluIGEgc3BlY2lmaWVkIHR5cGUuICBGb3IgZXhhbXBsZSwKKyAgIGFycmF5IGJvdW5kcyBtYXkgYmUgY2hhcmFjdGVycyBvciBib29sZWFucyBpbiBzb21lIGxhbmd1YWdlcywgYW5kIHRoaXMKKyAgIGFsbG93cyB0aGUgcmFuZ2VzIHRvIGJlIHByaW50ZWQgaW4gdGhlaXIgIm5hdHVyYWwiIGZvcm0gcmF0aGVyIHRoYW4gYXMKKyAgIGRlY2ltYWwgaW50ZWdlciB2YWx1ZXMuCisKKyAgIEZJWE1FOiAgVGhpcyBpcyBoZXJlIHNpbXBseSBiZWNhdXNlIG9ubHkgdGhlIHR5cGUgcHJpbnRpbmcgcm91dGluZXMKKyAgIGN1cnJlbnRseSB1c2UgaXQsIGFuZCBpdCB3YXNuJ3QgY2xlYXIgaWYgaXQgcmVhbGx5IGJlbG9uZ2VkIHNvbWV3aGVyZQorICAgZWxzZSAobGlrZSBwcmludGNtZC5jKS4gIFRoZXJlIGFyZSBhIGxvdCBvZiBvdGhlciBnZGIgcm91dGluZXMgdGhhdCBkbworICAgc29tZXRoaW5nIHNpbWlsYXIsIGJ1dCB0aGV5IGFyZSBnZW5lcmFsbHkgY29uY2VybmVkIHdpdGggcHJpbnRpbmcgdmFsdWVzCisgICB0aGF0IGNvbWUgZnJvbSB0aGUgaW5mZXJpb3IgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIgYW5kIHRhcmdldCBzaXplLiAqLworCit2b2lkCitwcmludF90eXBlX3NjYWxhciAodHlwZSwgdmFsLCBzdHJlYW0pCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBMT05HRVNUIHZhbDsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVkIGxlbjsKKworICBDSEVDS19UWVBFREVGICh0eXBlKTsKKworICBzd2l0Y2ggKFRZUEVfQ09ERSAodHlwZSkpCisgICAgeworCisgICAgY2FzZSBUWVBFX0NPREVfRU5VTToKKyAgICAgIGxlbiA9IFRZUEVfTkZJRUxEUyAodHlwZSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJeworCSAgaWYgKFRZUEVfRklFTERfQklUUE9TICh0eXBlLCBpKSA9PSB2YWwpCisJICAgIHsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGlmIChpIDwgbGVuKQorCXsKKwkgIGZwdXRzX2ZpbHRlcmVkIChUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIGkpLCBzdHJlYW0pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwcmludF9sb25nZXN0IChzdHJlYW0sICdkJywgMCwgdmFsKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX0lOVDoKKyAgICAgIHByaW50X2xvbmdlc3QgKHN0cmVhbSwgVFlQRV9VTlNJR05FRCAodHlwZSkgPyAndScgOiAnZCcsIDAsIHZhbCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFlQRV9DT0RFX0NIQVI6CisgICAgICBMQV9QUklOVF9DSEFSICgodW5zaWduZWQgY2hhcikgdmFsLCBzdHJlYW0pOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRZUEVfQ09ERV9CT09MOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCB2YWwgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUWVBFX0NPREVfUkFOR0U6CisgICAgICBwcmludF90eXBlX3NjYWxhciAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSksIHZhbCwgc3RyZWFtKTsKKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgVFlQRV9DT0RFX1VOREVGOgorICAgIGNhc2UgVFlQRV9DT0RFX1BUUjoKKyAgICBjYXNlIFRZUEVfQ09ERV9BUlJBWToKKyAgICBjYXNlIFRZUEVfQ09ERV9TVFJVQ1Q6CisgICAgY2FzZSBUWVBFX0NPREVfVU5JT046CisgICAgY2FzZSBUWVBFX0NPREVfRlVOQzoKKyAgICBjYXNlIFRZUEVfQ09ERV9GTFQ6CisgICAgY2FzZSBUWVBFX0NPREVfVk9JRDoKKyAgICBjYXNlIFRZUEVfQ09ERV9TRVQ6CisgICAgY2FzZSBUWVBFX0NPREVfU1RSSU5HOgorICAgIGNhc2UgVFlQRV9DT0RFX0VSUk9SOgorICAgIGNhc2UgVFlQRV9DT0RFX01FTUJFUjoKKyAgICBjYXNlIFRZUEVfQ09ERV9NRVRIT0Q6CisgICAgY2FzZSBUWVBFX0NPREVfUkVGOgorICAgICAgZXJyb3IgKCJpbnRlcm5hbCBlcnJvcjogdW5oYW5kbGVkIHR5cGUgaW4gcHJpbnRfdHlwZV9zY2FsYXIiKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yICgiSW52YWxpZCB0eXBlIGNvZGUgaW4gc3ltYm9sIHRhYmxlLiIpOworICAgIH0KKyAgZ2RiX2ZsdXNoIChzdHJlYW0pOworfQorCisjaWYgTUFJTlRFTkFOQ0VfQ01EUworCisvKiBEdW1wIGRldGFpbHMgb2YgYSB0eXBlIHNwZWNpZmllZCBlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KKyAgIFVzZXMgdGhlIHNhbWUgc29ydCBvZiB0eXBlIGxvb2t1cCBtZWNoYW5pc20gYXMgcHR5cGVfY29tbWFuZCgpCisgICBhbmQgd2hhdGlzX2NvbW1hbmQoKS4gKi8KKwordm9pZAorbWFpbnRlbmFuY2VfcHJpbnRfdHlwZSAodHlwZW5hbWUsIGZyb21fdHR5KQorICAgICBjaGFyICp0eXBlbmFtZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICByZWdpc3RlciB2YWx1ZV9wdHIgdmFsOworICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgcmVnaXN0ZXIgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKyAgc3RydWN0IGV4cHJlc3Npb24gKmV4cHI7CisKKyAgaWYgKHR5cGVuYW1lICE9IE5VTEwpCisgIHsKKyAgICBleHByID0gcGFyc2VfZXhwcmVzc2lvbiAodHlwZW5hbWUpOworICAgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSBmcmVlX2N1cnJlbnRfY29udGVudHMsICZleHByKTsKKyAgICBpZiAoZXhwciAtPiBlbHRzWzBdLm9wY29kZSA9PSBPUF9UWVBFKQorICAgICAgeworCS8qIFRoZSB1c2VyIGV4cHJlc3Npb24gbmFtZXMgYSB0eXBlIGRpcmVjdGx5LCBqdXN0IHVzZSB0aGF0IHR5cGUuICovCisJdHlwZSA9IGV4cHIgLT4gZWx0c1sxXS50eXBlOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwkvKiBUaGUgdXNlciBleHByZXNzaW9uIG1heSBuYW1lIGEgdHlwZSBpbmRpcmVjdGx5IGJ5IG5hbWluZyBhbgorCSAgIG9iamVjdCBvZiB0aGF0IHR5cGUuICBGaW5kIHRoYXQgaW5kaXJlY3RseSBuYW1lZCB0eXBlLiAqLworCXZhbCA9IGV2YWx1YXRlX3R5cGUgKGV4cHIpOworCXR5cGUgPSBWQUxVRV9UWVBFICh2YWwpOworICAgICAgfQorICAgIGlmICh0eXBlICE9IE5VTEwpCisgICAgICB7CisJcmVjdXJzaXZlX2R1bXBfdHlwZSAodHlwZSwgMCk7CisgICAgICB9CisgICAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisgIH0KK30KKworI2VuZGlmCS8qIE1BSU5URU5BTkNFX0NNRFMgKi8KKworDAordm9pZAorX2luaXRpYWxpemVfdHlwZXByaW50ICgpCit7CisKKyAgYWRkX2NvbSAoInB0eXBlIiwgY2xhc3NfdmFycywgcHR5cGVfY29tbWFuZCwKKwkgICAiUHJpbnQgZGVmaW5pdGlvbiBvZiB0eXBlIFRZUEUuXG5cCitBcmd1bWVudCBtYXkgYmUgYSB0eXBlIG5hbWUgZGVmaW5lZCBieSB0eXBlZGVmLCBvciBcInN0cnVjdCBTVFJVQ1QtVEFHXCJcblwKK29yIFwiY2xhc3MgQ0xBU1MtTkFNRVwiIG9yIFwidW5pb24gVU5JT04tVEFHXCIgb3IgXCJlbnVtIEVOVU0tVEFHXCIuXG5cCitUaGUgc2VsZWN0ZWQgc3RhY2sgZnJhbWUncyBsZXhpY2FsIGNvbnRleHQgaXMgdXNlZCB0byBsb29rIHVwIHRoZSBuYW1lLiIpOworCisgIGFkZF9jb20gKCJ3aGF0aXMiLCBjbGFzc192YXJzLCB3aGF0aXNfY29tbWFuZCwKKwkgICAiUHJpbnQgZGF0YSB0eXBlIG9mIGV4cHJlc3Npb24gRVhQLiIpOworCit9CmRpZmYgLS1naXQgYS9nZGIvdHlwZXByaW50LmggYi9nZGIvdHlwZXByaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU0ZDgxYQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi90eXBlcHJpbnQuaApAQCAtMCwwICsxLDI1IEBACisvKiBMYW5ndWFnZSBpbmRlcGVuZGVudCBzdXBwb3J0IGZvciBwcmludGluZyB0eXBlcyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODgsIDE5ODksIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKK3ZvaWQKK3ByaW50X3R5cGVfc2NhbGFyIFBBUkFNUyAoKHN0cnVjdCB0eXBlICp0eXBlLCBMT05HRVNULCBHREJfRklMRSAqKSk7CisKK3ZvaWQKK2NfdHlwZV9wcmludF92YXJzcGVjX3N1ZmZpeCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBHREJfRklMRSAqLCBpbnQsIGludCwgaW50KSk7CmRpZmYgLS1naXQgYS9nZGIvdWx0cmEzLW5hdC5jIGIvZ2RiL3VsdHJhMy1uYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjg0Y2RkCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3VsdHJhMy1uYXQuYwpAQCAtMCwwICsxLDMyOSBAQAorLyogTmF0aXZlLWRlcGVuZGVudCBjb2RlIGZvciBHREIsIGZvciBOWVUgVWx0cmEzIHJ1bm5pbmcgU3ltMSBPUy4KKyAgIENvcHlyaWdodCAoQykgMTk4OCwgMTk4OSwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIFdvb2QgKHdvb2RAbnl1LmVkdSkgYXQgTmV3IFlvcmsgVW5pdmVyc2l0eS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIERFQlVHCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4gIAorCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlICJnZGJfc3RhdC5oIgorCitzdGF0aWMgdm9pZCBmZXRjaF9jb3JlX3JlZ2lzdGVycyBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkLCBpbnQsIENPUkVfQUREUikpOworCisvKiBBc3N1bWVzIHN1cHBvcnQgZm9yIEFNRCdzIEJpbmFyeSBDb21wYXRpYmlsaXR5IFN0YW5kYXJkCisgICBmb3IgcHRyYWNlKCkuICBJZiB5b3UgZGVmaW5lIFVMVFJBMywgdGhlIHVsdHJhMyBleHRlbnNpb25zIHRvCisgICBwdHJhY2UoKSBhcmUgdXNlZCBhbGxvd2luZyB0aGUgcmVhZGluZyBvZiBtb3JlIHRoYW4gb25lIHJlZ2lzdGVyCisgICBhdCBhIHRpbWUuIAorCisgICBUaGlzIGZpbGUgYXNzdW1lcyBLRVJORUxfREVCVUdHSU5HIGlzIHR1cm5lZCBvZmYuICBUaGlzIG1lYW5zCisgICB0aGF0IGlmIHRoZSB1c2VyL2dkYiB0cmllcyB0byByZWFkIGdyNjQtZ3I5NSBvciBhbnkgb2YgdGhlIAorICAgcHJvdGVjdGVkIHNwZWNpYWwgcmVnaXN0ZXJzIHdlIHNpbGVudGx5IHJldHVybiAtMSAoc2VlIHRoZQorICAgQ0FOTk9UX1NUT1JFL0ZFVENIX1JFR0lTVEVSIG1hY3JvcykuICAqLworI2RlZmluZQlVTFRSQTMKKworI2lmICFkZWZpbmVkIChvZmZzZXRvZikKKyMgZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgKCh1bnNpZ25lZCBsb25nKSAmKChUWVBFICopMCktPk1FTUJFUikKKyNlbmRpZgorCitleHRlcm4gaW50IGVycm5vOworc3RydWN0IHB0cmFjZV91c2VyIHB0X3N0cnVjdDsKKworLyogR2V0IGFsbCBhdmFpbGFibGUgcmVnaXN0ZXJzIGZyb20gdGhlIGluZmVyaW9yLiAgUmVnaXN0ZXJzIHRoYXQgYXJlCisgKiBkZWZpbmVkIGluIFJFR0lTVEVSX05BTUVTLCBidXQgbm90IGF2YWlsYWJsZSB0byB0aGUgdXNlci9nZGIgYXJlCisgKiBzdXBwbGllZCBhcyAtMS4gIFRoaXMgbWF5IGluY2x1ZGUgZ3I2NC1ncjk1IGFuZCB0aGUgcHJvdGVjdGVkIHNwZWNpYWwKKyAqIHB1cnBvc2UgcmVnaXN0ZXJzLgorICovCisKK3ZvaWQKK2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAocmVnbm8pCisgIGludCByZWdubzsKK3sKKyAgcmVnaXN0ZXIgaW50IGksaixyZXRfdmFsPTA7CisgIGNoYXIgYnVmWzEyOF07CisKKyAgaWYgKHJlZ25vICE9IC0xKSB7CisgICAgZmV0Y2hfcmVnaXN0ZXIgKHJlZ25vKTsKKyAgICByZXR1cm47CisgIH0KKworLyogR2xvYmFsIFJlZ2lzdGVycyAqLworI2lmZGVmIFVMVFJBMworICBlcnJubyA9IDA7CisgIHB0cmFjZSAoUFRfUkVBRF9TVFJVQ1QsIGluZmVyaW9yX3BpZCwKKwkgIChQVFJBQ0VfQVJHM19UWVBFKSByZWdpc3Rlcl9hZGRyKEdSOTZfUkVHTlVNLDApLCAKKwkgIChpbnQpJnB0X3N0cnVjdC5wdF9nclswXSwgMzIqNCk7CisgIGlmIChlcnJubyAhPSAwKSB7CisgICAgICBwZXJyb3Jfd2l0aF9uYW1lICgicmVhZGluZyBnbG9iYWwgcmVnaXN0ZXJzIik7CisgICAgICByZXRfdmFsID0gLTE7CisgIH0gZWxzZSBmb3IgKHJlZ25vPUdSOTZfUkVHTlVNLCBqPTAgOyBqPDMyIDsgcmVnbm8rKywgaisrKSAgeworICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgJnB0X3N0cnVjdC5wdF9ncltqXSk7CisgIH0KKyNlbHNlCisgIGZvciAocmVnbm89R1I5Nl9SRUdOVU0gOyAhcmV0X3ZhbCAmJiByZWdubyA8IEdSOTZfUkVHTlVNKzMyIDsgcmVnbm8rKykKKyAgICBmZXRjaF9yZWdpc3RlcihyZWdubyk7CisjZW5kaWYKKworLyogTG9jYWwgUmVnaXN0ZXJzICovCisjaWZkZWYgVUxUUkEzCisgIGVycm5vID0gMDsKKyAgcHRyYWNlIChQVF9SRUFEX1NUUlVDVCwgaW5mZXJpb3JfcGlkLAorCSAgKFBUUkFDRV9BUkczX1RZUEUpIHJlZ2lzdGVyX2FkZHIoTFIwX1JFR05VTSwwKSwgCisJICAoaW50KSZwdF9zdHJ1Y3QucHRfbHJbMF0sIDEyOCo0KTsKKyAgaWYgKGVycm5vICE9IDApIHsKKyAgICAgIHBlcnJvcl93aXRoX25hbWUgKCJyZWFkaW5nIGxvY2FsIHJlZ2lzdGVycyIpOworICAgICAgcmV0X3ZhbCA9IC0xOworICB9IGVsc2UgZm9yIChyZWdubz1MUjBfUkVHTlVNLCBqPTAgOyBqPDEyOCA7IHJlZ25vKyssIGorKykgIHsKKyAgICAgIHN1cHBseV9yZWdpc3RlciAocmVnbm8sICZwdF9zdHJ1Y3QucHRfbHJbal0pOworICB9CisjZWxzZQorICBmb3IgKHJlZ25vPUxSMF9SRUdOVU0gOyAhcmV0X3ZhbCAmJiByZWdubyA8IExSMF9SRUdOVU0rMTI4IDsgcmVnbm8rKykKKyAgICBmZXRjaF9yZWdpc3RlcihyZWdubyk7CisjZW5kaWYKKworLyogU3BlY2lhbCBSZWdpc3RlcnMgKi8KKyAgZmV0Y2hfcmVnaXN0ZXIoR1IxX1JFR05VTSk7CisgIGZldGNoX3JlZ2lzdGVyKENQU19SRUdOVU0pOworICBmZXRjaF9yZWdpc3RlcihQQ19SRUdOVU0pOworICBmZXRjaF9yZWdpc3RlcihOUENfUkVHTlVNKTsKKyAgZmV0Y2hfcmVnaXN0ZXIoUEMyX1JFR05VTSk7CisgIGZldGNoX3JlZ2lzdGVyKElQQ19SRUdOVU0pOworICBmZXRjaF9yZWdpc3RlcihJUEFfUkVHTlVNKTsKKyAgZmV0Y2hfcmVnaXN0ZXIoSVBCX1JFR05VTSk7CisgIGZldGNoX3JlZ2lzdGVyKFFfUkVHTlVNKTsKKyAgZmV0Y2hfcmVnaXN0ZXIoQlBfUkVHTlVNKTsKKyAgZmV0Y2hfcmVnaXN0ZXIoRkNfUkVHTlVNKTsKKworLyogRmFrZSBhbnkgcmVnaXN0ZXJzIHRoYXQgYXJlIGluIFJFR0lTVEVSX05BTUVTLCBidXQgbm90IGF2YWlsYWJsZSB0byBnZGIgKi8gCisgIHJlZ2lzdGVyc19mZXRjaGVkKCk7Cit9CisKKy8qIFN0b3JlIG91ciByZWdpc3RlciB2YWx1ZXMgYmFjayBpbnRvIHRoZSBpbmZlcmlvci4KKyAqIElmIFJFR05PIGlzIC0xLCBkbyB0aGlzIGZvciBhbGwgcmVnaXN0ZXJzLgorICogT3RoZXJ3aXNlLCBSRUdOTyBzcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXIgKHNvIHdlIGNhbiBzYXZlIHRpbWUpLiAgCisgKiBOT1RFOiBBc3N1bWVzIEFNRCdzIGJpbmFyeSBjb21wYXRpYmlsaXR5IHN0YW5kYXJkLiAKKyAqLworCit2b2lkCitzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKHJlZ25vKQorICAgICBpbnQgcmVnbm87Cit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZWdhZGRyOworICBjaGFyIGJ1Zls4MF07CisKKyAgaWYgKHJlZ25vID49IDApCisgICAgeworICAgICAgaWYgKENBTk5PVF9TVE9SRV9SRUdJU1RFUihyZWdubykpIAorCXJldHVybjsKKyAgICAgIHJlZ2FkZHIgPSByZWdpc3Rlcl9hZGRyIChyZWdubywgMCk7CisgICAgICBlcnJubyA9IDA7CisgICAgICBwdHJhY2UgKFBUX1dSSVRFX1UsIGluZmVyaW9yX3BpZCwKKwkgICAgICAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnYWRkciwgcmVhZF9yZWdpc3RlcihyZWdubykpOworICAgICAgaWYgKGVycm5vICE9IDApCisJeworCSAgc3ByaW50ZiAoYnVmLCAid3JpdGluZyByZWdpc3RlciAlcyAoIyVkKSIsIFJFR0lTVEVSX05BTUUgKHJlZ25vKSwgcmVnbm8pOworCSAgcGVycm9yX3dpdGhfbmFtZSAoYnVmKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworI2lmZGVmIFVMVFJBMworICAgICAgcHRfc3RydWN0LnB0X2dyMSA9IHJlYWRfcmVnaXN0ZXIoR1IxX1JFR05VTSk7CisgICAgICBmb3IgKHJlZ25vID0gR1I5Nl9SRUdOVU07IHJlZ25vIDwgR1I5Nl9SRUdOVU0rMzI7IHJlZ25vKyspCisJcHRfc3RydWN0LnB0X2dyW3JlZ25vXSA9IHJlYWRfcmVnaXN0ZXIocmVnbm8pOworICAgICAgZm9yIChyZWdubyA9IExSMF9SRUdOVU07IHJlZ25vIDwgTFIwX1JFR05VTSsxMjg7IHJlZ25vKyspCisJcHRfc3RydWN0LnB0X2dyW3JlZ25vXSA9IHJlYWRfcmVnaXN0ZXIocmVnbm8pOworICAgICAgZXJybm8gPSAwOworICAgICAgcHRyYWNlIChQVF9XUklURV9TVFJVQ1QsIGluZmVyaW9yX3BpZCwKKwkgICAgICAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnaXN0ZXJfYWRkcihHUjFfUkVHTlVNLDApLCAKKwkgICAgICAoaW50KSZwdF9zdHJ1Y3QucHRfZ3IxLCgxKjMyKjEyOCkqNCk7CisgICAgICBpZiAoZXJybm8gIT0gMCkKKwl7CisJICAgc3ByaW50ZiAoYnVmLCAid3JpdGluZyBhbGwgbG9jYWwvZ2xvYmFsIHJlZ2lzdGVycyIpOworCSAgIHBlcnJvcl93aXRoX25hbWUgKGJ1Zik7CisJfQorICAgICAgcHRfc3RydWN0LnB0X3BzciA9IHJlYWRfcmVnaXN0ZXIoQ1BTX1JFR05VTSk7CisgICAgICBwdF9zdHJ1Y3QucHRfcGMwID0gcmVhZF9yZWdpc3RlcihOUENfUkVHTlVNKTsKKyAgICAgIHB0X3N0cnVjdC5wdF9wYzEgPSByZWFkX3JlZ2lzdGVyKFBDX1JFR05VTSk7CisgICAgICBwdF9zdHJ1Y3QucHRfcGMyID0gcmVhZF9yZWdpc3RlcihQQzJfUkVHTlVNKTsKKyAgICAgIHB0X3N0cnVjdC5wdF9pcGMgPSByZWFkX3JlZ2lzdGVyKElQQ19SRUdOVU0pOworICAgICAgcHRfc3RydWN0LnB0X2lwYSA9IHJlYWRfcmVnaXN0ZXIoSVBBX1JFR05VTSk7CisgICAgICBwdF9zdHJ1Y3QucHRfaXBiID0gcmVhZF9yZWdpc3RlcihJUEJfUkVHTlVNKTsKKyAgICAgIHB0X3N0cnVjdC5wdF9xICAgPSByZWFkX3JlZ2lzdGVyKFFfUkVHTlVNKTsKKyAgICAgIHB0X3N0cnVjdC5wdF9icCAgPSByZWFkX3JlZ2lzdGVyKEJQX1JFR05VTSk7CisgICAgICBwdF9zdHJ1Y3QucHRfZmMgID0gcmVhZF9yZWdpc3RlcihGQ19SRUdOVU0pOworICAgICAgZXJybm8gPSAwOworICAgICAgcHRyYWNlIChQVF9XUklURV9TVFJVQ1QsIGluZmVyaW9yX3BpZCwKKwkgICAgICAoUFRSQUNFX0FSRzNfVFlQRSkgcmVnaXN0ZXJfYWRkcihDUFNfUkVHTlVNLDApLCAKKwkgICAgICAoaW50KSZwdF9zdHJ1Y3QucHRfcHNyLCgxMCkqNCk7CisgICAgICBpZiAoZXJybm8gIT0gMCkKKwl7CisJICAgc3ByaW50ZiAoYnVmLCAid3JpdGluZyBhbGwgc3BlY2lhbCByZWdpc3RlcnMiKTsKKwkgICBwZXJyb3Jfd2l0aF9uYW1lIChidWYpOworCSAgIHJldHVybjsKKwl9CisjZWxzZQorICAgICAgc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzKEdSMV9SRUdOVU0pOworICAgICAgZm9yIChyZWdubz1HUjk2X1JFR05VTSA7IHJlZ25vPEdSOTZfUkVHTlVNKzMyIDsgcmVnbm8rKykKKwlzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMocmVnbm8pOworICAgICAgZm9yIChyZWdubz1MUjBfUkVHTlVNIDsgcmVnbm88TFIwX1JFR05VTSsxMjggOyByZWdubysrKQorCXN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyhyZWdubyk7CisgICAgICBzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMoQ1BTX1JFR05VTSk7CisgICAgICBzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMoUENfUkVHTlVNKTsKKyAgICAgIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyhOUENfUkVHTlVNKTsKKyAgICAgIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyhQQzJfUkVHTlVNKTsKKyAgICAgIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyhJUENfUkVHTlVNKTsKKyAgICAgIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyhJUEFfUkVHTlVNKTsKKyAgICAgIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyhJUEJfUkVHTlVNKTsKKyAgICAgIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyhRX1JFR05VTSk7CisgICAgICBzdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMoQlBfUkVHTlVNKTsKKyAgICAgIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyhGQ19SRUdOVU0pOworI2VuZGlmCS8qIFVMVFJBMyAqLworICAgIH0KK30KKworLyogCisgKiBGZXRjaCBhbiBpbmRpdmlkdWFsIHJlZ2lzdGVyIChhbmQgc3VwcGx5IGl0KS4KKyAqIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisgKiBOT1RFOiBBc3N1bWVzIEFNRCdzIEJpbmFyeSBDb21wYXRpYmlsaXR5IFN0YW5kYXJkIGZvciBwdHJhY2UoKS4KKyAqLworc3RhdGljIHZvaWQKK2ZldGNoX3JlZ2lzdGVyIChyZWdubykKKyAgICAgaW50IHJlZ25vOworeworICBjaGFyIGJ1ZlsxMjhdOworICBpbnQJdmFsOworCisgIGlmIChDQU5OT1RfRkVUQ0hfUkVHSVNURVIocmVnbm8pKSB7CisgICAgdmFsID0gLTE7CisgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgJnZhbCk7CisgIH0gZWxzZSB7CisgICAgZXJybm8gPSAwOworICAgIHZhbCA9IHB0cmFjZSAoUFRfUkVBRF9VLCBpbmZlcmlvcl9waWQsCisJCSAgKFBUUkFDRV9BUkczX1RZUEUpIHJlZ2lzdGVyX2FkZHIocmVnbm8sMCksIDApOworICAgIGlmIChlcnJubyAhPSAwKSB7CisgICAgICBzcHJpbnRmKGJ1ZiwicmVhZGluZyByZWdpc3RlciAlcyAoIyVkKSIsUkVHSVNURVJfTkFNRSAocmVnbm8pLCByZWdubyk7CisgICAgICBwZXJyb3Jfd2l0aF9uYW1lIChidWYpOworICAgIH0gZWxzZSB7CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCAmdmFsKTsKKyAgICB9CisgIH0KK30KKworCisvKiAKKyAqIFJlYWQgQU1EJ3MgQmluYXJ5IENvbXBhdGliaWx0eSBTdGFuZGFyZCBjb25mb3JtaW5nIGNvcmUgZmlsZS4KKyAqIHN0cnVjdCBwdHJhY2VfdXNlciBpcyB0aGUgZmlyc3QgdGhpbmcgaW4gdGhlIGNvcmUgZmlsZQorICovCisKK3N0YXRpYyB2b2lkCitmZXRjaF9jb3JlX3JlZ2lzdGVycyAoY29yZV9yZWdfc2VjdCwgY29yZV9yZWdfc2l6ZSwgd2hpY2gsIHJlZ19hZGRyKQorICAgICBjaGFyICpjb3JlX3JlZ19zZWN0OwkvKiBVbnVzZWQgaW4gdGhpcyB2ZXJzaW9uICovCisgICAgIHVuc2lnbmVkIGNvcmVfcmVnX3NpemU7CS8qIFVudXNlZCBpbiB0aGlzIHZlcnNpb24gKi8KKyAgICAgaW50IHdoaWNoOwkJCS8qIFVudXNlZCBpbiB0aGlzIHZlcnNpb24gKi8KKyAgICAgQ09SRV9BRERSIHJlZ19hZGRyOwkvKiBVbnVzZWQgaW4gdGhpcyB2ZXJzaW9uICovCit7CisgIHJlZ2lzdGVyIGludCByZWdubzsKKyAgaW50CXZhbDsKKyAgY2hhcglidWZbNF07CisKKyAgZm9yIChyZWdubyA9IDAgOyByZWdubyA8IE5VTV9SRUdTOyByZWdubysrKSB7CisgICAgaWYgKCFDQU5OT1RfRkVUQ0hfUkVHSVNURVIocmVnbm8pKSB7CisgICAgICB2YWwgPSBiZmRfc2VlayAoY29yZV9iZmQsIChmaWxlX3B0cikgcmVnaXN0ZXJfYWRkciAocmVnbm8sIDApLCBTRUVLX1NFVCk7CisgICAgICBpZiAodmFsIDwgMCB8fCAodmFsID0gYmZkX3JlYWQgKGJ1Ziwgc2l6ZW9mIGJ1ZiwgMSwgY29yZV9iZmQpKSA8IDApIHsKKyAgICAgICAgY2hhciAqIGJ1ZmZlciA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChSRUdJU1RFUl9OQU1FIChyZWdubykpICsgMzUpOworICAgICAgICBzdHJjcHkgKGJ1ZmZlciwgIlJlYWRpbmcgY29yZSByZWdpc3RlciAiKTsKKyAgICAgICAgc3RyY2F0IChidWZmZXIsIFJFR0lTVEVSX05BTUUgKHJlZ25vKSk7CisgICAgICAgIHBlcnJvcl93aXRoX25hbWUgKGJ1ZmZlcik7CisgICAgICB9CisgICAgICBzdXBwbHlfcmVnaXN0ZXIgKHJlZ25vLCBidWYpOworICAgIH0KKyAgfQorCisgIC8qIEZha2UgYW55IHJlZ2lzdGVycyB0aGF0IGFyZSBpbiBSRUdJU1RFUl9OQU1FUywgYnV0IG5vdCBhdmFpbGFibGUgdG8gZ2RiICovIAorICByZWdpc3RlcnNfZmV0Y2hlZCgpOworfQorCisKKy8qICAKKyAqIFRha2VzIGEgcmVnaXN0ZXIgbnVtYmVyIGFzIGRlZmluZWQgaW4gdG0uaCB2aWEgUkVHSVNURVJfTkFNRVMsIGFuZCBtYXBzCisgKiBpdCB0byBhbiBvZmZzZXQgaW4gYSBzdHJ1Y3QgcHRyYWNlX3VzZXIgZGVmaW5lZCBieSBBTUQncyBCQ1MuCisgKiBUaGF0IGlzLCBpdCBkZWZpbmVzIHRoZSBtYXBwaW5nIGJldHdlZW4gZ2RiIHJlZ2lzdGVyIG51bWJlcnMgYW5kIGl0ZW1zIGluCisgKiBhIHN0cnVjdCBwdHJhY2VfdXNlci4KKyAqIEEgcmVnaXN0ZXIgcHJvdGVjdGlvbiBzY2hlbWUgaXMgc2V0IHVwIGhlcmUuICBJZiBhIHJlZ2lzdGVyIG5vdAorICogYXZhaWxhYmxlIHRvIHRoZSB1c2VyIGlzIHNwZWNpZmllZCBpbiAncmVnbm8nLCB0aGVuIGFuIGFkZHJlc3MgdGhhdAorICogd2lsbCBjYXVzZSBwdHJhY2UoKSB0byBmYWlsIGlzIHJldHVybmVkLgorICovCitDT1JFX0FERFIKK3JlZ2lzdGVyX2FkZHIgKHJlZ25vLGJsb2NrZW5kKQorICAgICBpbnQJcmVnbm87CisgICAgIENPUkVfQUREUglibG9ja2VuZDsKK3sKKyAgaWYgKChyZWdubyA+PSBMUjBfUkVHTlVNKSAmJiAocmVnbm8gPCBMUjBfUkVHTlVNICsgMTI4KSkgeworICAgIHJldHVybihvZmZzZXRvZihzdHJ1Y3QgcHRyYWNlX3VzZXIscHRfbHJbcmVnbm8tTFIwX1JFR05VTV0pKTsKKyAgfSBlbHNlIGlmICgocmVnbm8gPj0gR1I5Nl9SRUdOVU0pICYmIChyZWdubyA8IEdSOTZfUkVHTlVNICsgMzIpKSB7CisgICAgcmV0dXJuKG9mZnNldG9mKHN0cnVjdCBwdHJhY2VfdXNlcixwdF9ncltyZWduby1HUjk2X1JFR05VTV0pKTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKHJlZ25vKSB7CisJY2FzZSBHUjFfUkVHTlVNOiByZXR1cm4ob2Zmc2V0b2Yoc3RydWN0IHB0cmFjZV91c2VyLHB0X2dyMSkpOworCWNhc2UgQ1BTX1JFR05VTTogcmV0dXJuKG9mZnNldG9mKHN0cnVjdCBwdHJhY2VfdXNlcixwdF9wc3IpKTsKKwljYXNlIE5QQ19SRUdOVU06IHJldHVybihvZmZzZXRvZihzdHJ1Y3QgcHRyYWNlX3VzZXIscHRfcGMwKSk7CisJY2FzZSBQQ19SRUdOVU06ICByZXR1cm4ob2Zmc2V0b2Yoc3RydWN0IHB0cmFjZV91c2VyLHB0X3BjMSkpOworCWNhc2UgUEMyX1JFR05VTTogcmV0dXJuKG9mZnNldG9mKHN0cnVjdCBwdHJhY2VfdXNlcixwdF9wYzIpKTsKKwljYXNlIElQQ19SRUdOVU06IHJldHVybihvZmZzZXRvZihzdHJ1Y3QgcHRyYWNlX3VzZXIscHRfaXBjKSk7CisJY2FzZSBJUEFfUkVHTlVNOiByZXR1cm4ob2Zmc2V0b2Yoc3RydWN0IHB0cmFjZV91c2VyLHB0X2lwYSkpOworCWNhc2UgSVBCX1JFR05VTTogcmV0dXJuKG9mZnNldG9mKHN0cnVjdCBwdHJhY2VfdXNlcixwdF9pcGIpKTsKKwljYXNlIFFfUkVHTlVNOiAgIHJldHVybihvZmZzZXRvZihzdHJ1Y3QgcHRyYWNlX3VzZXIscHRfcSkpOworCWNhc2UgQlBfUkVHTlVNOiAgcmV0dXJuKG9mZnNldG9mKHN0cnVjdCBwdHJhY2VfdXNlcixwdF9icCkpOworCWNhc2UgRkNfUkVHTlVNOiAgcmV0dXJuKG9mZnNldG9mKHN0cnVjdCBwdHJhY2VfdXNlcixwdF9mYykpOworCWRlZmF1bHQ6CisJICAgICBmcHJpbnRmX2ZpbHRlcmVkKGdkYl9zdGRlcnIsInJlZ2lzdGVyX2FkZHIoKTpCYWQgcmVnaXN0ZXIgJXMgKCVkKVxuIiwgCisJCQkgICAgICBSRUdJU1RFUl9OQU1FIChyZWdubyksIHJlZ25vKTsKKwkgICAgIHJldHVybigweGZmZmZmZmZmKTsJLyogU2hvdWxkIG1ha2UgcHRyYWNlKCkgZmFpbCAqLworICAgIH0KKyAgfQorfQorCisMCisvKiBSZWdpc3RlciB0aGF0IHdlIGFyZSBhYmxlIHRvIGhhbmRsZSB1bHRyYTMgY29yZSBmaWxlIGZvcm1hdHMuCisgICBGSVhNRTogaXMgdGhpcyByZWFsbHkgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXI/ICovCisKK3N0YXRpYyBzdHJ1Y3QgY29yZV9mbnMgdWx0cmEzX2NvcmVfZm5zID0KK3sKKyAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCisgIGZldGNoX2NvcmVfcmVnaXN0ZXJzLAorICBOVUxMCit9OworCit2b2lkCitfaW5pdGlhbGl6ZV9jb3JlX3VsdHJhMyAoKQoreworICBhZGRfY29yZV9mbnMgKCZ1bHRyYTNfY29yZV9mbnMpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3VsdHJhMy14ZGVwLmMgYi9nZGIvdWx0cmEzLXhkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2JhYjg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3VsdHJhMy14ZGVwLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qIEhvc3QtZGVwZW5kZW50IGNvZGUgZm9yIEdEQiwgZm9yIE5ZVSBVbHRyYTMgcnVubmluZyBTeW0xIE9TLgorICAgQ29weXJpZ2h0IChDKSAxOTg4LCAxOTg5LCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgV29vZCAod29vZEBueXUuZWR1KSBhdCBOZXcgWW9yayBVbml2ZXJzaXR5LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgREVCVUcKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxmY250bC5oPiAgCisKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisKKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgImdkYl9zdGF0LmgiCisKKy8qIEFzc29ydGVkIG9wZXJhdGluZyBzeXN0ZW0gY2lyY3VtdmVudGlvbnMgKi8KKworI2lmZGVmIFNZTTEKKworLyogRklYTUU6IEtsdWRnZSB0aGlzIGZvciBub3cuIEl0IHJlYWxseSBzaG91bGQgYmUgc3lzdGVtIGNhbGwuICovCitpbnQKK2dldHBhZ2VzaXplKCkKK3sgcmV0dXJuKDgxOTIpOyB9CisKKy8qIEZJWE1FOiBGYWtlIG91dCB0aGUgZmNudGwoKSBjYWxsLCB3aGljaCB3ZSBkb24ndCBoYXZlLiAgKi8KK2ZjbnRsKGZkLCBjbWQsIGFyZykKK2ludCBmZCwgY21kLCBhcmc7Cit7CisKKyAgc3dpdGNoIChjbWQpIHsKKwljYXNlIEZfR0VURkw6IHJldHVybihPX1JET05MWSk7CWJyZWFrOworCWRlZmF1bHQ6CQorCQlwcmludGZfdW5maWx0ZXJlZCgiVWx0cmEzJ3MgZmNudGwoKSBmYWlsaW5nLCBjbWQgPSAlZC5cbiIsY21kKTsKKwkJcmV0dXJuKC0xKTsKKyAgfQorfQorCisKKy8qIAorICogNC4yIFNpZ25hbCBzdXBwb3J0LCByZXF1aXJlcyBsaW5raW5nIHdpdGggbGliam9icy4KKyAqLworc3RhdGljIGludAlfU2lnTWFzazsKKyNkZWZpbmUgc2lnYml0KHMpICAgICAgICgxTCA8PCAoKHMpLTEpKQorCitpbml0X1NpZ01hc2soKQoreworCS8qIFRha2VuIGZyb20gdGhlIHN5bTEga2VybmVsIGluIG1hY2hkZXAuYzpzdGFydHVwKCkgKi8KKwlfU2lnTWFzayA9IHNpZ2JpdCAoU0lHVFNUUCkgfCBzaWdiaXQgKFNJR1RUT1UpIHwgc2lnYml0IChTSUdUVElOKSB8CisgICAgICAgICAgICAgICAgICAgICAgICBzaWdiaXQgKFNJR0NITEQpIHwgc2lnYml0IChTSUdUSU5UKTsKK30KKworc2lnbWFzayhzaWdubykKKwlpbnQgc2lnbm87Cit7CisJcmV0dXJuICgxIDw8IChzaWduby0xKSk7Cit9CisKK3NpZ3NldG1hc2soc2lnbWFzaykKK3Vuc2lnbmVkIGludCBzaWdtYXNrOworeworCWludCBpLCBtYXNrID0gMTsKKwlpbnQgbGFzdG1hc2sgPSBfU2lnTWFzazsKKworCWZvciAoaT0wIDsgaTxOU0lHIDsgaSsrKSB7CisJCWlmIChzaWdtYXNrICYgbWFzaykgeyAKKwkJCWlmICghKF9TaWdNYXNrICYgbWFzaykpIHsKKwkJCQlzaWdob2xkKGkrMSk7CisJCQkJX1NpZ01hc2sgfD0gbWFzazsKKwkJCX0KKwkJfSBlbHNlIGlmIChfU2lnTWFzayAmIG1hc2spIHsKKwkJCXNpZ3JlbHNlKGkrMSk7CisJCQlfU2lnTWFzayAmPSB+bWFzazsKKwkJfQorCQltYXNrIDw8PSAxOworCX0KKwlyZXR1cm4gKGxhc3RtYXNrKTsKK30KKworc2lnYmxvY2soc2lnbWFzaykKK3Vuc2lnbmVkIGludCBzaWdtYXNrOworeworCWludCBpLCBtYXNrID0gMTsKKwlpbnQgbGFzdG1hc2sgPSBfU2lnTWFzazsKKworCWZvciAoaT0wIDsgaTxOU0lHIDsgaSsrKSB7CisJCWlmICgoc2lnbWFzayAmIG1hc2spICYmICEoX1NpZ01hc2sgJiBtYXNrKSkgeworCQkJc2lnaG9sZChpKzEpOworCQkJX1NpZ01hc2sgfD0gbWFzazsKKwkJfQorCQltYXNrIDw8PSAxOworCX0KKwlyZXR1cm4gKGxhc3RtYXNrKTsKK30KKyNlbmRpZiAvKiBTWU0xICovCisKKworLyogSW5pdGlhbGl6YXRpb24gY29kZSBmb3IgdGhpcyBtb2R1bGUuICAqLworCit2b2lkCitfaW5pdGlhbGl6ZV91bHRyYTMgKCkKK3sKKyNpZmRlZiBTWU0xCisJaW5pdF9TaWdNYXNrKCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2dkYi91bWF4LXhkZXAuYyBiL2dkYi91bWF4LXhkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQ1MTllCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3VtYXgteGRlcC5jCkBAIC0wLDAgKzEsMTMzIEBACisvKiB1bWF4IGhvc3Qgc3R1ZmYuCisgICBDb3B5cmlnaHQgKEMpIDE5ODYsIDE5ODcsIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImluZmVyaW9yLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisjZGVmaW5lIFBUUkFDRV9BVFRBQ0ggUFRfQVRUQUNICisjZGVmaW5lIFBUUkFDRV9ERVRBQ0ggUFRfRlJFRVBST0MKKworI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSAiZ2RiX3N0YXQuaCIKKworLyogV29yayB3aXRoIGNvcmUgZHVtcCBhbmQgZXhlY3V0YWJsZSBmaWxlcywgZm9yIEdEQi4gCisgICBUaGlzIGNvZGUgd291bGQgYmUgaW4gY29yZWZpbGUuYyBpZiBpdCB3ZXJlbid0IG1hY2hpbmUtZGVwZW5kZW50LiAqLworCit2b2lkCitjb3JlX2ZpbGVfY29tbWFuZCAoZmlsZW5hbWUsIGZyb21fdHR5KQorICAgICBjaGFyICpmaWxlbmFtZTsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpbnQgdmFsOworICBleHRlcm4gY2hhciByZWdpc3RlcnNbXTsKKworICAvKiBEaXNjYXJkIGFsbCB2ZXN0aWdlcyBvZiBhbnkgcHJldmlvdXMgY29yZSBmaWxlCisgICAgIGFuZCBtYXJrIGRhdGEgYW5kIHN0YWNrIHNwYWNlcyBhcyBlbXB0eS4gICovCisKKyAgaWYgKGNvcmVmaWxlKQorICAgIGZyZWUgKGNvcmVmaWxlKTsKKyAgY29yZWZpbGUgPSAwOworCisgIGlmIChjb3JlY2hhbiA+PSAwKQorICAgIGNsb3NlIChjb3JlY2hhbik7CisgIGNvcmVjaGFuID0gLTE7CisKKyAgZGF0YV9zdGFydCA9IDA7CisgIGRhdGFfZW5kID0gMDsKKyAgc3RhY2tfc3RhcnQgPSBTVEFDS19FTkRfQUREUjsKKyAgc3RhY2tfZW5kID0gU1RBQ0tfRU5EX0FERFI7CisKKyAgLyogTm93LCBpZiBhIG5ldyBjb3JlIGZpbGUgd2FzIHNwZWNpZmllZCwgb3BlbiBpdCBhbmQgZGlnZXN0IGl0LiAgKi8KKworICBpZiAoZmlsZW5hbWUpCisgICAgeworICAgICAgZmlsZW5hbWUgPSB0aWxkZV9leHBhbmQgKGZpbGVuYW1lKTsKKyAgICAgIG1ha2VfY2xlYW51cCAoZnJlZSwgZmlsZW5hbWUpOworICAgICAgCisgICAgICBpZiAoaGF2ZV9pbmZlcmlvcl9wICgpKQorCWVycm9yICgiVG8gbG9vayBhdCBhIGNvcmUgZmlsZSwgeW91IG11c3Qga2lsbCB0aGUgcHJvZ3JhbSB3aXRoIFwia2lsbFwiLiIpOworICAgICAgY29yZWNoYW4gPSBvcGVuIChmaWxlbmFtZSwgT19SRE9OTFksIDApOworICAgICAgaWYgKGNvcmVjaGFuIDwgMCkKKwlwZXJyb3Jfd2l0aF9uYW1lIChmaWxlbmFtZSk7CisgICAgICAvKiA0LjItc3R5bGUgKGFuZCBwZXJoYXBzIGFsc28gc3lzVi1zdHlsZSkgY29yZSBkdW1wIGZpbGUuICAqLworICAgICAgeworCXN0cnVjdCBwdHJhY2VfdXNlciB1OworCWludCByZWdfb2Zmc2V0OworCisJdmFsID0gbXlyZWFkIChjb3JlY2hhbiwgJnUsIHNpemVvZiB1KTsKKwlpZiAodmFsIDwgMCkKKwkgIHBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKKwlkYXRhX3N0YXJ0ID0gZXhlY19kYXRhX3N0YXJ0OworCisJZGF0YV9lbmQgPSBkYXRhX3N0YXJ0ICsgdS5wdF9kc2l6ZTsKKwlzdGFja19zdGFydCA9IHN0YWNrX2VuZCAtIHUucHRfc3NpemU7CisJZGF0YV9vZmZzZXQgPSBzaXplb2YgdTsKKwlzdGFja19vZmZzZXQgPSBkYXRhX29mZnNldCArIHUucHRfZHNpemU7CisJcmVnX29mZnNldCA9IDA7CisKKwltZW1jcHkgKCZjb3JlX2FvdXRoZHIsICZ1LnB0X2FvdXRoZHIsIHNpemVvZiAoQU9VVEhEUikpOworCXByaW50Zl91bmZpbHRlcmVkICgiQ29yZSBmaWxlIGlzIGZyb20gXCIlc1wiLlxuIiwgdS5wdF9jb21tKTsKKwlpZiAodS5wdF9zaWduYWwgPiAwKQorCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBzaWduYWwgJWQsICVzLlxuIiwKKwkJICB1LnB0X3NpZ25hbCwgc2FmZV9zdHJzaWduYWwgKHUucHRfc2lnbmFsKSk7CisKKwkvKiBSZWFkIHRoZSByZWdpc3RlciB2YWx1ZXMgb3V0IG9mIHRoZSBjb3JlIGZpbGUgYW5kIHN0b3JlCisJICAgdGhlbSB3aGVyZSBgcmVhZF9yZWdpc3Rlcicgd2lsbCBmaW5kIHRoZW0uICAqLworCisJeworCSAgcmVnaXN0ZXIgaW50IHJlZ25vOworCisJICBmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCBOVU1fUkVHUzsgcmVnbm8rKykKKwkgICAgeworCSAgICAgIGNoYXIgYnVmW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisKKwkgICAgICB2YWwgPSBsc2VlayAoY29yZWNoYW4sIHJlZ2lzdGVyX2FkZHIgKHJlZ25vLCByZWdfb2Zmc2V0KSwgMCk7CisJICAgICAgaWYgKHZhbCA8IDApCisJCXBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKKworIAkgICAgICB2YWwgPSBteXJlYWQgKGNvcmVjaGFuLCBidWYsIHNpemVvZiBidWYpOworCSAgICAgIGlmICh2YWwgPCAwKQorCQlwZXJyb3Jfd2l0aF9uYW1lIChmaWxlbmFtZSk7CisJICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyZWdubywgYnVmKTsKKwkgICAgfQorCX0KKyAgICAgIH0KKyAgICAgIGlmIChmaWxlbmFtZVswXSA9PSAnLycpCisJY29yZWZpbGUgPSBzYXZlc3RyaW5nIChmaWxlbmFtZSwgc3RybGVuIChmaWxlbmFtZSkpOworICAgICAgZWxzZQorCXsKKwkgIGNvcmVmaWxlID0gY29uY2F0IChjdXJyZW50X2RpcmVjdG9yeSwgIi8iLCBmaWxlbmFtZSwgTlVMTCk7CisJfQorCisgICAgICBmbHVzaF9jYWNoZWRfZnJhbWVzICgpOworICAgICAgc2VsZWN0X2ZyYW1lIChnZXRfY3VycmVudF9mcmFtZSAoKSwgMCk7CisgICAgICB2YWxpZGF0ZV9maWxlcyAoKTsKKyAgICB9CisgIGVsc2UgaWYgKGZyb21fdHR5KQorICAgIHByaW50Zl91bmZpbHRlcmVkICgiTm8gY29yZSBmaWxlIG5vdy5cbiIpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3V0aWxzLmMgYi9nZGIvdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGI4MDFiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3V0aWxzLmMKQEAgLTAsMCArMSwyOTMyIEBACisvKiBHZW5lcmFsIHV0aWxpdHkgcm91dGluZXMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTg2LCA4OSwgOTAsIDkxLCA5MiwgOTUsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NVUlNFU19ICisjaW5jbHVkZSA8Y3Vyc2VzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1RFUk1fSAorI2luY2x1ZGUgPHRlcm0uaD4KKyNlbmRpZgorCisvKiBTdW5PUydzIGN1cnNlcy5oIGhhcyBhICcjZGVmaW5lIHJlZyByZWdpc3RlcicgaW4gaXQuICBUaGFuayB5b3UgU3VuLiAqLworI2lmZGVmIHJlZworI3VuZGVmIHJlZworI2VuZGlmCisKKyNpbmNsdWRlICJzaWduYWxzLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisjaW5jbHVkZSAic2VyaWFsLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAiZGVtYW5nbGUuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJhbm5vdGF0ZS5oIgorCisjaW5jbHVkZSA8cmVhZGxpbmUvcmVhZGxpbmUuaD4KKworLyogcmVhZGxpbmUgZGVmaW5lcyB0aGlzLiAgKi8KKyN1bmRlZiBzYXZlc3RyaW5nCisKK3ZvaWQgKCplcnJvcl9iZWdpbl9ob29rKSBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgdm9pZCB2ZnByaW50Zl9tYXliZV9maWx0ZXJlZCBQQVJBTVMgKChHREJfRklMRSAqLCBjb25zdCBjaGFyICosCisJCQkJCSAgICAgdmFfbGlzdCwgaW50KSk7CisKK3N0YXRpYyB2b2lkIGZwdXRzX21heWJlX2ZpbHRlcmVkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgR0RCX0ZJTEUgKiwgaW50KSk7CisKKyNpZiBkZWZpbmVkIChVU0VfTU1BTExPQykgJiYgIWRlZmluZWQgKE5PX01NQ0hFQ0spCitzdGF0aWMgdm9pZCBtYWxsb2NfYm90Y2ggUEFSQU1TICgodm9pZCkpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkCitmYXRhbF9kdW1wX2NvcmUgUEFSQU1TKChjaGFyICosIC4uLikpOworCitzdGF0aWMgdm9pZAorcHJvbXB0X2Zvcl9jb250aW51ZSBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyB2b2lkIAorc2V0X3dpZHRoX2NvbW1hbmQgUEFSQU1TICgoY2hhciAqLCBpbnQsIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICopKTsKKworc3RhdGljIHZvaWQKK3NldF93aWR0aCBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIElmIHRoaXMgZGVmaW5pdGlvbiBpc24ndCBvdmVycmlkZGVuIGJ5IHRoZSBoZWFkZXIgZmlsZXMsIGFzc3VtZQorICAgdGhhdCBpc2F0dHkgYW5kIGZpbGVubyBleGlzdCBvbiB0aGlzIHN5c3RlbS4gICovCisjaWZuZGVmIElTQVRUWQorI2RlZmluZSBJU0FUVFkoRlApCShpc2F0dHkgKGZpbGVubyAoRlApKSkKKyNlbmRpZgorCisjaWZuZGVmIEdEQl9GSUxFX0lTQVRUWQorI2RlZmluZSBHREJfRklMRV9JU0FUVFkoR0RCX0ZJTEVfUFRSKSAgIChnZGJfZmlsZV9pc2F0dHkoR0RCX0ZJTEVfUFRSKSkgICAKKyNlbmRpZgorCisvKiBDaGFpbiBvZiBjbGVhbnVwIGFjdGlvbnMgZXN0YWJsaXNoZWQgd2l0aCBtYWtlX2NsZWFudXAsCisgICB0byBiZSBleGVjdXRlZCBpZiBhbiBlcnJvciBoYXBwZW5zLiAgKi8KKworc3RhdGljIHN0cnVjdCBjbGVhbnVwICpjbGVhbnVwX2NoYWluOyAvKiBjbGVhbmVkIHVwIGFmdGVyIGEgZmFpbGVkIGNvbW1hbmQgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xlYW51cCAqZmluYWxfY2xlYW51cF9jaGFpbjsgLyogY2xlYW5lZCB1cCB3aGVuIGdkYiBleGl0cyAqLworc3RhdGljIHN0cnVjdCBjbGVhbnVwICpydW5fY2xlYW51cF9jaGFpbjsgLyogY2xlYW5lZCB1cCBvbiBlYWNoICdydW4nICovCisKKy8qIE5vbnplcm8gaWYgd2UgaGF2ZSBqb2IgY29udHJvbC4gKi8KKworaW50IGpvYl9jb250cm9sOworCisvKiBOb256ZXJvIG1lYW5zIGEgcXVpdCBoYXMgYmVlbiByZXF1ZXN0ZWQuICAqLworCitpbnQgcXVpdF9mbGFnOworCisvKiBOb256ZXJvIG1lYW5zIHF1aXQgaW1tZWRpYXRlbHkgaWYgQ29udHJvbC1DIGlzIHR5cGVkIG5vdywgcmF0aGVyCisgICB0aGFuIHdhaXRpbmcgdW50aWwgUVVJVCBpcyBleGVjdXRlZC4gIEJlIGNhcmVmdWwgaW4gc2V0dGluZyB0aGlzOworICAgY29kZSB3aGljaCBleGVjdXRlcyB3aXRoIGltbWVkaWF0ZV9xdWl0IHNldCBoYXMgdG8gYmUgdmVyeSBjYXJlZnVsCisgICBhYm91dCBiZWluZyBhYmxlIHRvIGRlYWwgd2l0aCBiZWluZyBpbnRlcnJ1cHRlZCBhdCBhbnkgdGltZS4gIEl0IGlzCisgICBhbG1vc3QgYWx3YXlzIGJldHRlciB0byB1c2UgUVVJVDsgdGhlIG9ubHkgZXhjZXB0aW9uIEkgY2FuIHRoaW5rIG9mCisgICBpcyBiZWluZyBhYmxlIHRvIHF1aXQgb3V0IG9mIGEgc3lzdGVtIGNhbGwgKHVzaW5nIEVJTlRSIGxvc2VzIGlmCisgICB0aGUgU0lHSU5UIGhhcHBlbnMgYmV0d2VlbiB0aGUgcHJldmlvdXMgUVVJVCBhbmQgdGhlIHN5c3RlbSBjYWxsKS4KKyAgIFRvIGltbWVkaWF0ZWx5IHF1aXQgaW4gdGhlIGNhc2UgaW4gd2hpY2ggYSBTSUdJTlQgaGFwcGVucyBiZXR3ZWVuCisgICB0aGUgcHJldmlvdXMgUVVJVCBhbmQgc2V0dGluZyBpbW1lZGlhdGVfcXVpdCAoZGVzaXJhYmxlIGFueXRpbWUgd2UKKyAgIGV4cGVjdCB0byBibG9jayksIGNhbGwgUVVJVCBhZnRlciBzZXR0aW5nIGltbWVkaWF0ZV9xdWl0LiAgKi8KKworaW50IGltbWVkaWF0ZV9xdWl0OworCisvKiBOb256ZXJvIG1lYW5zIHRoYXQgZW5jb2RlZCBDKysgbmFtZXMgc2hvdWxkIGJlIHByaW50ZWQgb3V0IGluIHRoZWlyCisgICBDKysgZm9ybSByYXRoZXIgdGhhbiByYXcuICAqLworCitpbnQgZGVtYW5nbGUgPSAxOworCisvKiBOb256ZXJvIG1lYW5zIHRoYXQgZW5jb2RlZCBDKysgbmFtZXMgc2hvdWxkIGJlIHByaW50ZWQgb3V0IGluIHRoZWlyCisgICBDKysgZm9ybSBldmVuIGluIGFzc2VtYmxlciBsYW5ndWFnZSBkaXNwbGF5cy4gIElmIHRoaXMgaXMgc2V0LCBidXQKKyAgIERFTUFOR0xFIGlzIHplcm8sIG5hbWVzIGFyZSBwcmludGVkIHJhdywgaS5lLiBERU1BTkdMRSBjb250cm9scy4gICovCisKK2ludCBhc21fZGVtYW5nbGUgPSAwOworCisvKiBOb256ZXJvIG1lYW5zIHRoYXQgc3RyaW5ncyB3aXRoIGNoYXJhY3RlciB2YWx1ZXMgPjB4N0Ygc2hvdWxkIGJlIHByaW50ZWQKKyAgIGFzIG9jdGFsIGVzY2FwZXMuICBaZXJvIG1lYW5zIGp1c3QgcHJpbnQgdGhlIHZhbHVlIChlLmcuIGl0J3MgYW4KKyAgIGludGVybmF0aW9uYWwgY2hhcmFjdGVyLCBhbmQgdGhlIHRlcm1pbmFsIG9yIHdpbmRvdyBjYW4gY29wZS4pICAqLworCitpbnQgc2V2ZW5iaXRfc3RyaW5ncyA9IDA7CisKKy8qIFN0cmluZyB0byBiZSBwcmludGVkIGJlZm9yZSBlcnJvciBtZXNzYWdlcywgaWYgYW55LiAgKi8KKworY2hhciAqZXJyb3JfcHJlX3ByaW50OworCisvKiBTdHJpbmcgdG8gYmUgcHJpbnRlZCBiZWZvcmUgcXVpdCBtZXNzYWdlcywgaWYgYW55LiAgKi8KKworY2hhciAqcXVpdF9wcmVfcHJpbnQ7CisKKy8qIFN0cmluZyB0byBiZSBwcmludGVkIGJlZm9yZSB3YXJuaW5nIG1lc3NhZ2VzLCBpZiBhbnkuICAqLworCitjaGFyICp3YXJuaW5nX3ByZV9wcmludCA9ICJcbndhcm5pbmc6ICI7CisKK2ludCBwYWdpbmF0aW9uX2VuYWJsZWQgPSAxOworCisMCisvKiBBZGQgYSBuZXcgY2xlYW51cCB0byB0aGUgY2xlYW51cF9jaGFpbiwKKyAgIGFuZCByZXR1cm4gdGhlIHByZXZpb3VzIGNoYWluIHBvaW50ZXIKKyAgIHRvIGJlIHBhc3NlZCBsYXRlciB0byBkb19jbGVhbnVwcyBvciBkaXNjYXJkX2NsZWFudXBzLgorICAgQXJncyBhcmUgRlVOQ1RJT04gdG8gY2xlYW4gdXAgd2l0aCwgYW5kIEFSRyB0byBwYXNzIHRvIGl0LiAgKi8KKworc3RydWN0IGNsZWFudXAgKgorbWFrZV9jbGVhbnVwIChmdW5jdGlvbiwgYXJnKQorICAgICB2b2lkICgqZnVuY3Rpb24pIFBBUkFNUyAoKFBUUikpOworICAgICBQVFIgYXJnOworeworICAgIHJldHVybiBtYWtlX215X2NsZWFudXAgKCZjbGVhbnVwX2NoYWluLCBmdW5jdGlvbiwgYXJnKTsKK30KKworc3RydWN0IGNsZWFudXAgKgorbWFrZV9maW5hbF9jbGVhbnVwIChmdW5jdGlvbiwgYXJnKQorICAgICB2b2lkICgqZnVuY3Rpb24pIFBBUkFNUyAoKFBUUikpOworICAgICBQVFIgYXJnOworeworICAgIHJldHVybiBtYWtlX215X2NsZWFudXAgKCZmaW5hbF9jbGVhbnVwX2NoYWluLCBmdW5jdGlvbiwgYXJnKTsKK30KK3N0cnVjdCBjbGVhbnVwICoKK21ha2VfcnVuX2NsZWFudXAgKGZ1bmN0aW9uLCBhcmcpCisgICAgIHZvaWQgKCpmdW5jdGlvbikgUEFSQU1TICgoUFRSKSk7CisgICAgIFBUUiBhcmc7Cit7CisgICAgcmV0dXJuIG1ha2VfbXlfY2xlYW51cCAoJnJ1bl9jbGVhbnVwX2NoYWluLCBmdW5jdGlvbiwgYXJnKTsKK30KK3N0cnVjdCBjbGVhbnVwICoKK21ha2VfbXlfY2xlYW51cCAocG15X2NoYWluLCBmdW5jdGlvbiwgYXJnKQorICAgICBzdHJ1Y3QgY2xlYW51cCAqKnBteV9jaGFpbjsKKyAgICAgdm9pZCAoKmZ1bmN0aW9uKSBQQVJBTVMgKChQVFIpKTsKKyAgICAgUFRSIGFyZzsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGNsZWFudXAgKm5ldworICAgID0gKHN0cnVjdCBjbGVhbnVwICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGNsZWFudXApKTsKKyAgcmVnaXN0ZXIgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbiA9ICpwbXlfY2hhaW47CisKKyAgbmV3LT5uZXh0ID0gKnBteV9jaGFpbjsKKyAgbmV3LT5mdW5jdGlvbiA9IGZ1bmN0aW9uOworICBuZXctPmFyZyA9IGFyZzsKKyAgKnBteV9jaGFpbiA9IG5ldzsKKworICByZXR1cm4gb2xkX2NoYWluOworfQorCisvKiBEaXNjYXJkIGNsZWFudXBzIGFuZCBkbyB0aGUgYWN0aW9ucyB0aGV5IGRlc2NyaWJlCisgICB1bnRpbCB3ZSBnZXQgYmFjayB0byB0aGUgcG9pbnQgT0xEX0NIQUlOIGluIHRoZSBjbGVhbnVwX2NoYWluLiAgKi8KKwordm9pZAorZG9fY2xlYW51cHMgKG9sZF9jaGFpbikKKyAgICAgcmVnaXN0ZXIgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKK3sKKyAgICBkb19teV9jbGVhbnVwcyAoJmNsZWFudXBfY2hhaW4sIG9sZF9jaGFpbik7Cit9CisKK3ZvaWQKK2RvX2ZpbmFsX2NsZWFudXBzIChvbGRfY2hhaW4pCisgICAgIHJlZ2lzdGVyIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47Cit7CisgICAgZG9fbXlfY2xlYW51cHMgKCZmaW5hbF9jbGVhbnVwX2NoYWluLCBvbGRfY2hhaW4pOworfQorCit2b2lkCitkb19ydW5fY2xlYW51cHMgKG9sZF9jaGFpbikKKyAgICAgcmVnaXN0ZXIgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKK3sKKyAgICBkb19teV9jbGVhbnVwcyAoJnJ1bl9jbGVhbnVwX2NoYWluLCBvbGRfY2hhaW4pOworfQorCit2b2lkCitkb19teV9jbGVhbnVwcyAocG15X2NoYWluLCBvbGRfY2hhaW4pCisgICAgIHJlZ2lzdGVyIHN0cnVjdCBjbGVhbnVwICoqcG15X2NoYWluOworICAgICByZWdpc3RlciBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworeworICByZWdpc3RlciBzdHJ1Y3QgY2xlYW51cCAqcHRyOworICB3aGlsZSAoKHB0ciA9ICpwbXlfY2hhaW4pICE9IG9sZF9jaGFpbikKKyAgICB7CisgICAgICAqcG15X2NoYWluID0gcHRyLT5uZXh0OwkvKiBEbyB0aGlzIGZpcnN0IGluY2FzZSByZWN1cnNpb24gKi8KKyAgICAgICgqcHRyLT5mdW5jdGlvbikgKHB0ci0+YXJnKTsKKyAgICAgIGZyZWUgKHB0cik7CisgICAgfQorfQorCisvKiBEaXNjYXJkIGNsZWFudXBzLCBub3QgZG9pbmcgdGhlIGFjdGlvbnMgdGhleSBkZXNjcmliZSwKKyAgIHVudGlsIHdlIGdldCBiYWNrIHRvIHRoZSBwb2ludCBPTERfQ0hBSU4gaW4gdGhlIGNsZWFudXBfY2hhaW4uICAqLworCit2b2lkCitkaXNjYXJkX2NsZWFudXBzIChvbGRfY2hhaW4pCisgICAgIHJlZ2lzdGVyIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW47Cit7CisgICAgZGlzY2FyZF9teV9jbGVhbnVwcyAoJmNsZWFudXBfY2hhaW4sIG9sZF9jaGFpbik7Cit9CisKK3ZvaWQKK2Rpc2NhcmRfZmluYWxfY2xlYW51cHMgKG9sZF9jaGFpbikKKyAgICAgcmVnaXN0ZXIgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKK3sKKyAgICBkaXNjYXJkX215X2NsZWFudXBzICgmZmluYWxfY2xlYW51cF9jaGFpbiwgb2xkX2NoYWluKTsKK30KKwordm9pZAorZGlzY2FyZF9teV9jbGVhbnVwcyAocG15X2NoYWluLCBvbGRfY2hhaW4pCisgICAgIHJlZ2lzdGVyIHN0cnVjdCBjbGVhbnVwICoqcG15X2NoYWluOworICAgICByZWdpc3RlciBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworeworICByZWdpc3RlciBzdHJ1Y3QgY2xlYW51cCAqcHRyOworICB3aGlsZSAoKHB0ciA9ICpwbXlfY2hhaW4pICE9IG9sZF9jaGFpbikKKyAgICB7CisgICAgICAqcG15X2NoYWluID0gcHRyLT5uZXh0OworICAgICAgZnJlZSAoKFBUUilwdHIpOworICAgIH0KK30KKworLyogU2V0IHRoZSBjbGVhbnVwX2NoYWluIHRvIDAsIGFuZCByZXR1cm4gdGhlIG9sZCBjbGVhbnVwIGNoYWluLiAgKi8KK3N0cnVjdCBjbGVhbnVwICoKK3NhdmVfY2xlYW51cHMgKCkKK3sKKyAgICByZXR1cm4gc2F2ZV9teV9jbGVhbnVwcyAoJmNsZWFudXBfY2hhaW4pOworfQorCitzdHJ1Y3QgY2xlYW51cCAqCitzYXZlX2ZpbmFsX2NsZWFudXBzICgpCit7CisgICAgcmV0dXJuIHNhdmVfbXlfY2xlYW51cHMgKCZmaW5hbF9jbGVhbnVwX2NoYWluKTsKK30KKworc3RydWN0IGNsZWFudXAgKgorc2F2ZV9teV9jbGVhbnVwcyAocG15X2NoYWluKQorICAgIHN0cnVjdCBjbGVhbnVwICoqcG15X2NoYWluOworeworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluID0gKnBteV9jaGFpbjsKKworICAqcG15X2NoYWluID0gMDsKKyAgcmV0dXJuIG9sZF9jaGFpbjsKK30KKworLyogUmVzdG9yZSB0aGUgY2xlYW51cCBjaGFpbiBmcm9tIGEgcHJldmlvdXNseSBzYXZlZCBjaGFpbi4gICovCit2b2lkCityZXN0b3JlX2NsZWFudXBzIChjaGFpbikKKyAgICAgc3RydWN0IGNsZWFudXAgKmNoYWluOworeworICAgIHJlc3RvcmVfbXlfY2xlYW51cHMgKCZjbGVhbnVwX2NoYWluLCBjaGFpbik7Cit9CisKK3ZvaWQKK3Jlc3RvcmVfZmluYWxfY2xlYW51cHMgKGNoYWluKQorICAgICBzdHJ1Y3QgY2xlYW51cCAqY2hhaW47Cit7CisgICAgcmVzdG9yZV9teV9jbGVhbnVwcyAoJmZpbmFsX2NsZWFudXBfY2hhaW4sIGNoYWluKTsKK30KKwordm9pZAorcmVzdG9yZV9teV9jbGVhbnVwcyAocG15X2NoYWluLCBjaGFpbikKKyAgICAgc3RydWN0IGNsZWFudXAgKipwbXlfY2hhaW47CisgICAgIHN0cnVjdCBjbGVhbnVwICpjaGFpbjsKK3sKKyAgKnBteV9jaGFpbiA9IGNoYWluOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgY2xlYW51cHMuCisgICBEbworCisgICAgIGZvbyA9IHhtYWxsb2MgKC4uLik7CisgICAgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAoZnJlZV9jdXJyZW50X2NvbnRlbnRzLCAmZm9vKTsKKworICAgdG8gYXJyYW5nZSB0byBmcmVlIHRoZSBvYmplY3QgdGh1cyBhbGxvY2F0ZWQuICAqLworCit2b2lkCitmcmVlX2N1cnJlbnRfY29udGVudHMgKGxvY2F0aW9uKQorICAgICBjaGFyICoqbG9jYXRpb247Cit7CisgIGZyZWUgKCpsb2NhdGlvbik7Cit9CisKKy8qIFByb3ZpZGUgYSBrbm93biBmdW5jdGlvbiB0aGF0IGRvZXMgbm90aGluZywgdG8gdXNlIGFzIGEgYmFzZSBmb3IKKyAgIGZvciBhIHBvc3NpYmx5IGxvbmcgY2hhaW4gb2YgY2xlYW51cHMuICBUaGlzIGlzIHVzZWZ1bCB3aGVyZSB3ZQorICAgdXNlIHRoZSBjbGVhbnVwIGNoYWluIGZvciBoYW5kbGluZyBub3JtYWwgY2xlYW51cHMgYXMgd2VsbCBhcyBkZWFsaW5nCisgICB3aXRoIGNsZWFudXBzIHRoYXQgbmVlZCB0byBiZSBkb25lIGFzIGEgcmVzdWx0IG9mIGEgY2FsbCB0byBlcnJvcigpLgorICAgSW4gc3VjaCBjYXNlcywgd2UgbWF5IG5vdCBiZSBjZXJ0YWluIHdoZXJlIHRoZSBmaXJzdCBjbGVhbnVwIGlzLCB1bmxlc3MKKyAgIHdlIGhhdmUgYSBkby1ub3RoaW5nIG9uZSB0byBhbHdheXMgdXNlIGFzIHRoZSBiYXNlLiAqLworCisvKiBBUkdTVVNFRCAqLwordm9pZAorbnVsbF9jbGVhbnVwIChhcmcpCisgICAgUFRSIGFyZzsKK3sKK30KKworDAorLyogUHJpbnQgYSB3YXJuaW5nIG1lc3NhZ2UuICBXYXkgdG8gdXNlIHRoaXMgaXMgdG8gY2FsbCB3YXJuaW5nX2JlZ2luLAorICAgb3V0cHV0IHRoZSB3YXJuaW5nIG1lc3NhZ2UgKHVzZSB1bmZpbHRlcmVkIG91dHB1dCB0byBnZGJfc3RkZXJyKSwKKyAgIGVuZGluZyBpbiBhIG5ld2xpbmUuICBUaGVyZSBpcyBub3QgY3VycmVudGx5IGEgd2FybmluZ19lbmQgdGhhdCB5b3UKKyAgIGNhbGwgYWZ0ZXJ3YXJkcywgYnV0IHN1Y2ggYSB0aGluZyBtaWdodCBiZSBhZGRlZCBpZiBpdCBpcyB1c2VmdWwKKyAgIGZvciBhIEdVSSB0byBzZXBhcmF0ZSB3YXJuaW5nIG1lc3NhZ2VzIGZyb20gb3RoZXIgb3V0cHV0LgorCisgICBGSVhNRTogV2h5IGRvIHdhcm5pbmdzIHVzZSB1bmZpbHRlcmVkIG91dHB1dCBhbmQgZXJyb3JzIGZpbHRlcmVkPworICAgSXMgdGhpcyBhbnl0aGluZyBvdGhlciB0aGFuIGEgaGlzdG9yaWNhbCBhY2NpZGVudD8gICovCisKK3ZvaWQKK3dhcm5pbmdfYmVnaW4gKCkKK3sKKyAgdGFyZ2V0X3Rlcm1pbmFsX291cnMgKCk7CisgIHdyYXBfaGVyZSgiIik7CQkJLyogRm9yY2Ugb3V0IGFueSBidWZmZXJlZCBvdXRwdXQgKi8KKyAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgaWYgKHdhcm5pbmdfcHJlX3ByaW50KQorICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgd2FybmluZ19wcmVfcHJpbnQpOworfQorCisvKiBQcmludCBhIHdhcm5pbmcgbWVzc2FnZS4KKyAgIFRoZSBmaXJzdCBhcmd1bWVudCBTVFJJTkcgaXMgdGhlIHdhcm5pbmcgbWVzc2FnZSwgdXNlZCBhcyBhIGZwcmludGYgc3RyaW5nLAorICAgYW5kIHRoZSByZW1haW5pbmcgYXJncyBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBpdC4KKyAgIFRoZSBwcmltYXJ5IGRpZmZlcmVuY2UgYmV0d2VlbiB3YXJuaW5ncyBhbmQgZXJyb3JzIGlzIHRoYXQgYSB3YXJuaW5nCisgICBkb2VzIG5vdCBmb3JjZSB0aGUgcmV0dXJuIHRvIGNvbW1hbmQgbGV2ZWwuICAqLworCisvKiBWQVJBUkdTICovCit2b2lkCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCit3YXJuaW5nIChjb25zdCBjaGFyICpzdHJpbmcsIC4uLikKKyNlbHNlCit3YXJuaW5nICh2YV9hbGlzdCkKKyAgICAgdmFfZGNsCisjZW5kaWYKK3sKKyAgdmFfbGlzdCBhcmdzOworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworICB2YV9zdGFydCAoYXJncywgc3RyaW5nKTsKKyNlbHNlCisgIGNoYXIgKnN0cmluZzsKKworICB2YV9zdGFydCAoYXJncyk7CisgIHN0cmluZyA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKKyNlbmRpZgorICBpZiAod2FybmluZ19ob29rKQorICAgICgqd2FybmluZ19ob29rKSAoc3RyaW5nLCBhcmdzKTsKKyAgZWxzZQorICB7CisgICAgd2FybmluZ19iZWdpbiAoKTsKKyAgICB2ZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCBzdHJpbmcsIGFyZ3MpOworICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlxuIik7CisgICAgdmFfZW5kIChhcmdzKTsKKyAgfQorfQorCisvKiBTdGFydCB0aGUgcHJpbnRpbmcgb2YgYW4gZXJyb3IgbWVzc2FnZS4gIFdheSB0byB1c2UgdGhpcyBpcyB0byBjYWxsCisgICB0aGlzLCBvdXRwdXQgdGhlIGVycm9yIG1lc3NhZ2UgKHVzZSBmaWx0ZXJlZCBvdXRwdXQgdG8gZ2RiX3N0ZGVycgorICAgKEZJWE1FOiBTb21lIGNhbGxlcnMsIGxpa2UgbWVtb3J5X2Vycm9yLCB1c2UgZ2RiX3N0ZG91dCkpLCBlbmRpbmcKKyAgIGluIGEgbmV3bGluZSwgYW5kIHRoZW4gY2FsbCByZXR1cm5fdG9fdG9wX2xldmVsIChSRVRVUk5fRVJST1IpLgorICAgZXJyb3IoKSBwcm92aWRlcyBhIGNvbnZlbmllbnQgd2F5IHRvIGRvIHRoaXMgZm9yIHRoZSBzcGVjaWFsIGNhc2UKKyAgIHRoYXQgdGhlIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGZvcm1hdHRlZCB3aXRoIGEgc2luZ2xlIHByaW50ZiBjYWxsLAorICAgYnV0IHRoaXMgaXMgbW9yZSBnZW5lcmFsLiAgKi8KK3ZvaWQKK2Vycm9yX2JlZ2luICgpCit7CisgIGlmIChlcnJvcl9iZWdpbl9ob29rKQorICAgIGVycm9yX2JlZ2luX2hvb2sgKCk7CisKKyAgdGFyZ2V0X3Rlcm1pbmFsX291cnMgKCk7CisgIHdyYXBfaGVyZSAoIiIpOwkJCS8qIEZvcmNlIG91dCBhbnkgYnVmZmVyZWQgb3V0cHV0ICovCisgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisKKyAgYW5ub3RhdGVfZXJyb3JfYmVnaW4gKCk7CisKKyAgaWYgKGVycm9yX3ByZV9wcmludCkKKyAgICBmcHJpbnRmX2ZpbHRlcmVkIChnZGJfc3RkZXJyLCBlcnJvcl9wcmVfcHJpbnQpOworfQorCisvKiBQcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm4gdG8gY29tbWFuZCBsZXZlbC4KKyAgIFRoZSBmaXJzdCBhcmd1bWVudCBTVFJJTkcgaXMgdGhlIGVycm9yIG1lc3NhZ2UsIHVzZWQgYXMgYSBmcHJpbnRmIHN0cmluZywKKyAgIGFuZCB0aGUgcmVtYWluaW5nIGFyZ3MgYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gaXQuICAqLworCisvKiBWQVJBUkdTICovCitOT1JFVFVSTiB2b2lkCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCitlcnJvciAoY29uc3QgY2hhciAqc3RyaW5nLCAuLi4pCisjZWxzZQorZXJyb3IgKHZhX2FsaXN0KQorICAgICB2YV9kY2wKKyNlbmRpZgoreworICB2YV9saXN0IGFyZ3M7CisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisgIHZhX3N0YXJ0IChhcmdzLCBzdHJpbmcpOworI2Vsc2UKKyAgdmFfc3RhcnQgKGFyZ3MpOworI2VuZGlmCisgIGlmIChlcnJvcl9ob29rKQorICAgICgqZXJyb3JfaG9vaykgKCk7CisgIGVsc2UgCisgICAgeworICAgICAgZXJyb3JfYmVnaW4gKCk7CisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisgICAgICB2ZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgc3RyaW5nLCBhcmdzKTsKKyNlbHNlCisgICAgICB7CisJY2hhciAqc3RyaW5nMTsKKworCXN0cmluZzEgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7CisJdmZwcmludGZfZmlsdGVyZWQgKGdkYl9zdGRlcnIsIHN0cmluZzEsIGFyZ3MpOworICAgICAgfQorI2VuZGlmCisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChnZGJfc3RkZXJyLCAiXG4iKTsKKyAgICAgIHZhX2VuZCAoYXJncyk7CisgICAgICByZXR1cm5fdG9fdG9wX2xldmVsIChSRVRVUk5fRVJST1IpOworICAgIH0KK30KKworCisvKiBQcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZCBleGl0IHJlcG9ydGluZyBmYWlsdXJlLgorICAgVGhpcyBpcyBmb3IgYSBlcnJvciB0aGF0IHdlIGNhbm5vdCBjb250aW51ZSBmcm9tLgorICAgVGhlIGFyZ3VtZW50cyBhcmUgcHJpbnRlZCBhIGxhIHByaW50Zi4KKworICAgVGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgZGVjbGFyZWQgdm9sYXRpbGUgKE5PUkVUVVJOKSBpbiBhbgorICAgQU5TSSBlbnZpcm9ubWVudCBiZWNhdXNlIGV4aXQoKSBpcyBub3QgZGVjbGFyZWQgdm9sYXRpbGUuICovCisKKy8qIFZBUkFSR1MgKi8KK05PUkVUVVJOIHZvaWQKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKK2ZhdGFsIChjaGFyICpzdHJpbmcsIC4uLikKKyNlbHNlCitmYXRhbCAodmFfYWxpc3QpCisgICAgIHZhX2RjbAorI2VuZGlmCit7CisgIHZhX2xpc3QgYXJnczsKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyAgdmFfc3RhcnQgKGFyZ3MsIHN0cmluZyk7CisjZWxzZQorICBjaGFyICpzdHJpbmc7CisgIHZhX3N0YXJ0IChhcmdzKTsKKyAgc3RyaW5nID0gdmFfYXJnIChhcmdzLCBjaGFyICopOworI2VuZGlmCisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlxuZ2RiOiAiKTsKKyAgdmZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgc3RyaW5nLCBhcmdzKTsKKyAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiXG4iKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgZXhpdCAoMSk7Cit9CisKKy8qIFByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQsIGR1bXBpbmcgY29yZS4KKyAgIFRoZSBhcmd1bWVudHMgYXJlIHByaW50ZWQgYSBsYSBwcmludGYgKCkuICAqLworCisvKiBWQVJBUkdTICovCitzdGF0aWMgdm9pZAorI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworZmF0YWxfZHVtcF9jb3JlIChjaGFyICpzdHJpbmcsIC4uLikKKyNlbHNlCitmYXRhbF9kdW1wX2NvcmUgKHZhX2FsaXN0KQorICAgICB2YV9kY2wKKyNlbmRpZgoreworICB2YV9saXN0IGFyZ3M7CisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisgIHZhX3N0YXJ0IChhcmdzLCBzdHJpbmcpOworI2Vsc2UKKyAgY2hhciAqc3RyaW5nOworCisgIHZhX3N0YXJ0IChhcmdzKTsKKyAgc3RyaW5nID0gdmFfYXJnIChhcmdzLCBjaGFyICopOworI2VuZGlmCisgIC8qICJpbnRlcm5hbCBlcnJvciIgaXMgYWx3YXlzIGNvcnJlY3QsIHNpbmNlIEdEQiBzaG91bGQgbmV2ZXIgZHVtcAorICAgICBjb3JlLCBubyBtYXR0ZXIgd2hhdCB0aGUgaW5wdXQuICAqLworICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJcbmdkYiBpbnRlcm5hbCBlcnJvcjogIik7CisgIHZmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsIHN0cmluZywgYXJncyk7CisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIlxuIik7CisgIHZhX2VuZCAoYXJncyk7CisKKyAgc2lnbmFsIChTSUdRVUlULCBTSUdfREZMKTsKKyAga2lsbCAoZ2V0cGlkICgpLCBTSUdRVUlUKTsKKyAgLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLCBidXQganVzdCBpbiBjYXNlLi4uICAqLworICBleGl0ICgxKTsKK30KKworLyogVGhlIHN0cmVycm9yKCkgZnVuY3Rpb24gY2FuIHJldHVybiBOVUxMIGZvciBlcnJubyB2YWx1ZXMgdGhhdCBhcmUKKyAgIG91dCBvZiByYW5nZS4gIFByb3ZpZGUgYSAic2FmZSIgdmVyc2lvbiB0aGF0IGFsd2F5cyByZXR1cm5zIGEKKyAgIHByaW50YWJsZSBzdHJpbmcuICovCisKK2NoYXIgKgorc2FmZV9zdHJlcnJvciAoZXJybnVtKQorICAgICBpbnQgZXJybnVtOworeworICBjaGFyICptc2c7CisgIHN0YXRpYyBjaGFyIGJ1ZlszMl07CisKKyAgaWYgKChtc2cgPSBzdHJlcnJvciAoZXJybnVtKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICBzcHJpbnRmIChidWYsICIodW5kb2N1bWVudGVkIGVycm5vICVkKSIsIGVycm51bSk7CisgICAgICBtc2cgPSBidWY7CisgICAgfQorICByZXR1cm4gKG1zZyk7Cit9CisKKy8qIFRoZSBzdHJzaWduYWwoKSBmdW5jdGlvbiBjYW4gcmV0dXJuIE5VTEwgZm9yIHNpZ25hbCB2YWx1ZXMgdGhhdCBhcmUKKyAgIG91dCBvZiByYW5nZS4gIFByb3ZpZGUgYSAic2FmZSIgdmVyc2lvbiB0aGF0IGFsd2F5cyByZXR1cm5zIGEKKyAgIHByaW50YWJsZSBzdHJpbmcuICovCisKK2NoYXIgKgorc2FmZV9zdHJzaWduYWwgKHNpZ25vKQorICAgICBpbnQgc2lnbm87Cit7CisgIGNoYXIgKm1zZzsKKyAgc3RhdGljIGNoYXIgYnVmWzMyXTsKKworICBpZiAoKG1zZyA9IHN0cnNpZ25hbCAoc2lnbm8pKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHNwcmludGYgKGJ1ZiwgIih1bmRvY3VtZW50ZWQgc2lnbmFsICVkKSIsIHNpZ25vKTsKKyAgICAgIG1zZyA9IGJ1ZjsKKyAgICB9CisgIHJldHVybiAobXNnKTsKK30KKworCisvKiBQcmludCB0aGUgc3lzdGVtIGVycm9yIG1lc3NhZ2UgZm9yIGVycm5vLCBhbmQgYWxzbyBtZW50aW9uIFNUUklORworICAgYXMgdGhlIGZpbGUgbmFtZSBmb3Igd2hpY2ggdGhlIGVycm9yIHdhcyBlbmNvdW50ZXJlZC4KKyAgIFRoZW4gcmV0dXJuIHRvIGNvbW1hbmQgbGV2ZWwuICAqLworCitOT1JFVFVSTiB2b2lkCitwZXJyb3Jfd2l0aF9uYW1lIChzdHJpbmcpCisgICAgIGNoYXIgKnN0cmluZzsKK3sKKyAgY2hhciAqZXJyOworICBjaGFyICpjb21iaW5lZDsKKworICBlcnIgPSBzYWZlX3N0cmVycm9yIChlcnJubyk7CisgIGNvbWJpbmVkID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGVycikgKyBzdHJsZW4gKHN0cmluZykgKyAzKTsKKyAgc3RyY3B5IChjb21iaW5lZCwgc3RyaW5nKTsKKyAgc3RyY2F0IChjb21iaW5lZCwgIjogIik7CisgIHN0cmNhdCAoY29tYmluZWQsIGVycik7CisKKyAgLyogSSB1bmRlcnN0YW5kIHNldHRpbmcgdGhlc2UgaXMgYSBtYXR0ZXIgb2YgdGFzdGUuICBTdGlsbCwgc29tZSBwZW9wbGUKKyAgICAgbWF5IGNsZWFyIGVycm5vIGJ1dCBub3Qga25vdyBhYm91dCBiZmRfZXJyb3IuICBEb2luZyB0aGlzIGhlcmUgaXMgbm90CisgICAgIHVucmVhc29uYWJsZS4gKi8KKyAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKKyAgZXJybm8gPSAwOworCisgIGVycm9yICgiJXMuIiwgY29tYmluZWQpOyAKK30KKworLyogUHJpbnQgdGhlIHN5c3RlbSBlcnJvciBtZXNzYWdlIGZvciBFUlJDT0RFLCBhbmQgYWxzbyBtZW50aW9uIFNUUklORworICAgYXMgdGhlIGZpbGUgbmFtZSBmb3Igd2hpY2ggdGhlIGVycm9yIHdhcyBlbmNvdW50ZXJlZC4gICovCisKK3ZvaWQKK3ByaW50X3N5c19lcnJtc2cgKHN0cmluZywgZXJyY29kZSkKKyAgICAgY2hhciAqc3RyaW5nOworICAgICBpbnQgZXJyY29kZTsKK3sKKyAgY2hhciAqZXJyOworICBjaGFyICpjb21iaW5lZDsKKworICBlcnIgPSBzYWZlX3N0cmVycm9yIChlcnJjb2RlKTsKKyAgY29tYmluZWQgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoZXJyKSArIHN0cmxlbiAoc3RyaW5nKSArIDMpOworICBzdHJjcHkgKGNvbWJpbmVkLCBzdHJpbmcpOworICBzdHJjYXQgKGNvbWJpbmVkLCAiOiAiKTsKKyAgc3RyY2F0IChjb21iaW5lZCwgZXJyKTsKKworICAvKiBXZSB3YW50IGFueXRoaW5nIHdoaWNoIHdhcyBwcmludGVkIG9uIHN0ZG91dCB0byBjb21lIG91dCBmaXJzdCwgYmVmb3JlCisgICAgIHRoaXMgbWVzc2FnZS4gICovCisgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIiVzLlxuIiwgY29tYmluZWQpOworfQorCisvKiBDb250cm9sIEMgZXZlbnR1YWxseSBjYXVzZXMgdGhpcyB0byBiZSBjYWxsZWQsIGF0IGEgY29udmVuaWVudCB0aW1lLiAgKi8KKwordm9pZAorcXVpdCAoKQoreworICBzZXJpYWxfdCBnZGJfc3Rkb3V0X3NlcmlhbCA9IHNlcmlhbF9mZG9wZW4gKDEpOworCisgIHRhcmdldF90ZXJtaW5hbF9vdXJzICgpOworCisgIC8qIFdlIHdhbnQgYWxsIG91dHB1dCB0byBhcHBlYXIgbm93LCBiZWZvcmUgd2UgcHJpbnQgIlF1aXQiLiAgV2UKKyAgICAgaGF2ZSAzIGxldmVscyBvZiBidWZmZXJpbmcgd2UgaGF2ZSB0byBmbHVzaCAoaXQncyBwb3NzaWJsZSB0aGF0CisgICAgIHNvbWUgb2YgdGhlc2Ugc2hvdWxkIGJlIGNoYW5nZWQgdG8gZmx1c2ggdGhlIGxvd2VyLWxldmVsIG9uZXMKKyAgICAgdG9vKTogICovCisKKyAgLyogMS4gIFRoZSBfZmlsdGVyZWQgYnVmZmVyLiAgKi8KKyAgd3JhcF9oZXJlICgoY2hhciAqKTApOworCisgIC8qIDIuICBUaGUgc3RkaW8gYnVmZmVyLiAgKi8KKyAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgZ2RiX2ZsdXNoIChnZGJfc3RkZXJyKTsKKworICAvKiAzLiAgVGhlIHN5c3RlbS1sZXZlbCBidWZmZXIuICAqLworICBTRVJJQUxfRFJBSU5fT1VUUFVUIChnZGJfc3Rkb3V0X3NlcmlhbCk7CisgIFNFUklBTF9VTl9GRE9QRU4gKGdkYl9zdGRvdXRfc2VyaWFsKTsKKworICBhbm5vdGF0ZV9lcnJvcl9iZWdpbiAoKTsKKworICAvKiBEb24ndCB1c2UgKl9maWx0ZXJlZDsgd2UgZG9uJ3Qgd2FudCB0byBwcm9tcHQgdGhlIHVzZXIgdG8gY29udGludWUuICAqLworICBpZiAocXVpdF9wcmVfcHJpbnQpCisgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCBxdWl0X3ByZV9wcmludCk7CisKKyAgaWYgKGpvYl9jb250cm9sCisgICAgICAvKiBJZiB0aGVyZSBpcyBubyB0ZXJtaW5hbCBzd2l0Y2hpbmcgZm9yIHRoaXMgdGFyZ2V0LCB0aGVuIHdlIGNhbid0CisJIHBvc3NpYmx5IGdldCBzY3Jld2VkIGJ5IHRoZSBsYWNrIG9mIGpvYiBjb250cm9sLiAgKi8KKyAgICAgIHx8IGN1cnJlbnRfdGFyZ2V0LnRvX3Rlcm1pbmFsX291cnMgPT0gTlVMTCkKKyAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJRdWl0XG4iKTsKKyAgZWxzZQorICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwKKwkgICAgICJRdWl0IChleHBlY3Qgc2lnbmFsIFNJR0lOVCB3aGVuIHRoZSBwcm9ncmFtIGlzIHJlc3VtZWQpXG4iKTsKKyAgcmV0dXJuX3RvX3RvcF9sZXZlbCAoUkVUVVJOX1FVSVQpOworfQorCisKKyNpZiBkZWZpbmVkKF9fR08zMl9fKQorCisvKiBJbiB0aGUgYWJzZW5jZSBvZiBzaWduYWxzLCBwb2xsIGtleWJvYXJkIGZvciBhIHF1aXQuCisgICBDYWxsZWQgZnJvbSAjZGVmaW5lIFFVSVQgcG9sbHF1aXQoKSBpbiB4bS1nbzMyLmguICovCisKK3ZvaWQKK25vdGljZV9xdWl0KCkKK3sKKyAgaWYgKGtiaGl0ICgpKQorICAgIHN3aXRjaCAoZ2V0a2V5ICgpKQorICAgICAgeworICAgICAgY2FzZSAxOgorCXF1aXRfZmxhZyA9IDE7CisJYnJlYWs7CisgICAgICBjYXNlIDI6CisJaW1tZWRpYXRlX3F1aXQgPSAyOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwkvKiBXZSBqdXN0IGlnbm9yZSBpdCAqLworCS8qIEZJWE1FISEgRG9uJ3QgdGhpbmsgdGhpcyBhY3R1YWxseSB3b3JrcyEgKi8KKwlmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJDVFJMLUEgdG8gcXVpdCwgQ1RSTC1CIHRvIHF1aXQgaGFyZGVyXG4iKTsKKwlicmVhazsKKyAgICAgIH0KK30KKworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgLyogc2hvdWxkIHRlc3QgZm9yIHdpbmdkYiBpbnN0ZWFkPyAqLworCisvKgorICogV2luZG93cyB0cmFuc2xhdGVzIGFsbCBrZXlib2FyZCBhbmQgbW91c2UgZXZlbnRzIAorICogaW50byBhIG1lc3NhZ2Ugd2hpY2ggaXMgYXBwZW5kZWQgdG8gdGhlIG1lc3NhZ2UgCisgKiBxdWV1ZSBmb3IgdGhlIHByb2Nlc3MuCisgKi8KKwordm9pZCBub3RpY2VfcXVpdCgpCit7CisgIGludCBrID0gd2luMzJwb2xscXVpdCgpOworICBpZiAoayA9PSAxKQorICAgIHF1aXRfZmxhZyA9IDE7CisgIGVsc2UgaWYgKGsgPT0gMikKKyAgICBpbW1lZGlhdGVfcXVpdCA9IDE7Cit9CisKKyNlbHNlIC8qICFkZWZpbmVkKF9fR08zMl9fKSAmJiAhZGVmaW5lZChfTVNDX1ZFUikgKi8KKwordm9pZCBub3RpY2VfcXVpdCgpCit7CisgIC8qIERvbmUgYnkgc2lnbmFscyAqLworfQorCisjZW5kaWYgLyogIWRlZmluZWQoX19HTzMyX18pICYmICFkZWZpbmVkKF9NU0NfVkVSKSAqLworCit2b2lkCitwb2xscXVpdCgpCit7CisgIG5vdGljZV9xdWl0ICgpOworICBpZiAocXVpdF9mbGFnIHx8IGltbWVkaWF0ZV9xdWl0KQorICAgIHF1aXQgKCk7Cit9CisKKy8qIENvbnRyb2wgQyBjb21lcyBoZXJlICovCisKK3ZvaWQKK3JlcXVlc3RfcXVpdCAoc2lnbm8pCisgICAgIGludCBzaWdubzsKK3sKKyAgcXVpdF9mbGFnID0gMTsKKyAgLyogUmVzdG9yZSB0aGUgc2lnbmFsIGhhbmRsZXIuICBIYXJtbGVzcyB3aXRoIEJTRC1zdHlsZSBzaWduYWxzLCBuZWVkZWQKKyAgICAgZm9yIFN5c3RlbSBWLXN0eWxlIHNpZ25hbHMuICBTbyBqdXN0IGFsd2F5cyBkbyBpdCwgcmF0aGVyIHRoYW4gd29ycnlpbmcKKyAgICAgYWJvdXQgVVNHIGRlZmluZXMgYW5kIHN0dWZmIGxpa2UgdGhhdC4gICovCisgIHNpZ25hbCAoc2lnbm8sIHJlcXVlc3RfcXVpdCk7CisKKyNpZmRlZiBSRVFVRVNUX1FVSVQKKyAgUkVRVUVTVF9RVUlUOworI2Vsc2UKKyAgaWYgKGltbWVkaWF0ZV9xdWl0KSAKKyAgICBxdWl0ICgpOworI2VuZGlmCit9CisKKwwKKy8qIE1lbW9yeSBtYW5hZ2VtZW50IHN0dWZmIChtYWxsb2MgZnJpZW5kcykuICAqLworCisvKiBNYWtlIGEgc3Vic3RpdHV0ZSBzaXplX3QgZm9yIG5vbi1BTlNJIGNvbXBpbGVycy4gKi8KKworI2lmbmRlZiBIQVZFX1NURERFRl9ICisjaWZuZGVmIHNpemVfdAorI2RlZmluZSBzaXplX3QgdW5zaWduZWQgaW50CisjZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKFVTRV9NTUFMTE9DKQorCitQVFIKK21tYWxsb2MgKG1kLCBzaXplKQorICAgICBQVFIgbWQ7CisgICAgIHNpemVfdCBzaXplOworeworICByZXR1cm4gbWFsbG9jIChzaXplKTsKK30KKworUFRSCittcmVhbGxvYyAobWQsIHB0ciwgc2l6ZSkKKyAgICAgUFRSIG1kOworICAgICBQVFIgcHRyOworICAgICBzaXplX3Qgc2l6ZTsKK3sKKyAgaWYgKHB0ciA9PSAwKQkJLyogR3VhcmQgYWdhaW5zdCBvbGQgcmVhbGxvYydzICovCisgICAgcmV0dXJuIG1hbGxvYyAoc2l6ZSk7CisgIGVsc2UKKyAgICByZXR1cm4gcmVhbGxvYyAocHRyLCBzaXplKTsKK30KKwordm9pZAorbWZyZWUgKG1kLCBwdHIpCisgICAgIFBUUiBtZDsKKyAgICAgUFRSIHB0cjsKK3sKKyAgZnJlZSAocHRyKTsKK30KKworI2VuZGlmCS8qIFVTRV9NTUFMTE9DICovCisKKyNpZiAhZGVmaW5lZCAoVVNFX01NQUxMT0MpIHx8IGRlZmluZWQgKE5PX01NQ0hFQ0spCisKK3ZvaWQKK2luaXRfbWFsbG9jIChtZCkKKyAgICAgUFRSIG1kOworeworfQorCisjZWxzZSAvKiBIYXZlIG1tYWxsb2MgYW5kIHdhbnQgY29ycnVwdGlvbiBjaGVja2luZyAqLworCitzdGF0aWMgdm9pZAorbWFsbG9jX2JvdGNoICgpCit7CisgIGZhdGFsX2R1bXBfY29yZSAoIk1lbW9yeSBjb3JydXB0aW9uIik7Cit9CisKKy8qIEF0dGVtcHQgdG8gaW5zdGFsbCBob29rcyBpbiBtbWFsbG9jL21yZWFsbG9jL21mcmVlIGZvciB0aGUgaGVhcCBzcGVjaWZpZWQKKyAgIGJ5IE1ELCB0byBkZXRlY3QgbWVtb3J5IGNvcnJ1cHRpb24uICBOb3RlIHRoYXQgTUQgbWF5IGJlIE5VTEwgdG8gc3BlY2lmeQorICAgdGhlIGRlZmF1bHQgaGVhcCB0aGF0IGdyb3dzIHZpYSBzYnJrLgorCisgICBOb3RlIHRoYXQgZm9yIGZyZXNobHkgY3JlYXRlZCByZWdpb25zLCB3ZSBtdXN0IGNhbGwgbW1jaGVja2YgcHJpb3IgdG8gYW55CisgICBtYWxsb2NzIGluIHRoZSByZWdpb24uICBPdGhlcndpc2UsIGFueSByZWdpb24gd2hpY2ggd2FzIGFsbG9jYXRlZCBwcmlvciB0bworICAgaW5zdGFsbGluZyB0aGUgY2hlY2tpbmcgaG9va3MsIHdoaWNoIGlzIGxhdGVyIHJlYWxsb2NhdGVkIG9yIGZyZWVkLCB3aWxsCisgICBmYWlsIHRoZSBjaGVja3MhICBUaGUgbW1jaGVjayBmdW5jdGlvbiBvbmx5IGFsbG93cyBpbml0aWFsIGhvb2tzIHRvIGJlCisgICBpbnN0YWxsZWQgYmVmb3JlIHRoZSBmaXJzdCBtbWFsbG9jLiAgSG93ZXZlciwgYW55dGltZSBhZnRlciB3ZSBoYXZlIGNhbGxlZAorICAgbW1jaGVjayB0aGUgZmlyc3QgdGltZSB0byBpbnN0YWxsIHRoZSBjaGVja2luZyBob29rcywgd2UgY2FuIGNhbGwgaXQgYWdhaW4KKyAgIHRvIHVwZGF0ZSB0aGUgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgbWVtb3J5IGNvcnJ1cHRpb24gaGFuZGxlci4KKworICAgUmV0dXJucyB6ZXJvIG9uIGZhaWx1cmUsIG5vbi16ZXJvIG9uIHN1Y2Nlc3MuICovCisKKyNpZm5kZWYgTU1DSEVDS19GT1JDRQorI2RlZmluZSBNTUNIRUNLX0ZPUkNFIDAKKyNlbmRpZgorCit2b2lkCitpbml0X21hbGxvYyAobWQpCisgICAgIFBUUiBtZDsKK3sKKyAgaWYgKCFtbWNoZWNrZiAobWQsIG1hbGxvY19ib3RjaCwgTU1DSEVDS19GT1JDRSkpCisgICAgeworICAgICAgLyogRG9uJ3QgdXNlIHdhcm5pbmcoKSwgd2hpY2ggcmVsaWVzIG9uIGN1cnJlbnRfdGFyZ2V0IGJlaW5nIHNldAorCSB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBkdW1teV90YXJnZXQsIHVudGlsIGFmdGVyCisJIGluaXRpYWxpemVfYWxsX2ZpbGVzKCkuICovCisKKyAgICAgIGZwcmludGZfdW5maWx0ZXJlZAorCShnZGJfc3RkZXJyLCAid2FybmluZzogZmFpbGVkIHRvIGluc3RhbGwgbWVtb3J5IGNvbnNpc3RlbmN5IGNoZWNrczsgIik7CisgICAgICBmcHJpbnRmX3VuZmlsdGVyZWQKKwkoZ2RiX3N0ZGVyciwgImNvbmZpZ3VyYXRpb24gc2hvdWxkIGRlZmluZSBOT19NTUNIRUNLIG9yIE1NQ0hFQ0tfRk9SQ0VcbiIpOworICAgIH0KKworICBtbXRyYWNlICgpOworfQorCisjZW5kaWYgLyogSGF2ZSBtbWFsbG9jIGFuZCB3YW50IGNvcnJ1cHRpb24gY2hlY2tpbmcgICovCisKKy8qIENhbGxlZCB3aGVuIGEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMsIHdpdGggdGhlIG51bWJlciBvZiBieXRlcyBvZgorICAgbWVtb3J5IHJlcXVlc3RlZCBpbiBTSVpFLiAqLworCitOT1JFVFVSTiB2b2lkCitub21lbSAoc2l6ZSkKKyAgICAgbG9uZyBzaXplOworeworICBpZiAoc2l6ZSA+IDApCisgICAgeworICAgICAgZmF0YWwgKCJ2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQ6IGNhbid0IGFsbG9jYXRlICVsZCBieXRlcy4iLCBzaXplKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmYXRhbCAoInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZC4iKTsKKyAgICB9Cit9CisKKy8qIExpa2UgbW1hbGxvYyBidXQgZ2V0IGVycm9yIGlmIG5vIHN0b3JhZ2UgYXZhaWxhYmxlLCBhbmQgcHJvdGVjdCBhZ2FpbnN0CisgICB0aGUgY2FsbGVyIHdhbnRpbmcgdG8gYWxsb2NhdGUgemVybyBieXRlcy4gIFdoZXRoZXIgdG8gcmV0dXJuIE5VTEwgZm9yCisgICBhIHplcm8gYnl0ZSByZXF1ZXN0LCBvciB0cmFuc2xhdGUgdGhlIHJlcXVlc3QgaW50byBhIHJlcXVlc3QgZm9yIG9uZQorICAgYnl0ZSBvZiB6ZXJvJ2Qgc3RvcmFnZSwgaXMgYSByZWxpZ2lvdXMgaXNzdWUuICovCisKK1BUUgoreG1tYWxsb2MgKG1kLCBzaXplKQorICAgICBQVFIgbWQ7CisgICAgIGxvbmcgc2l6ZTsKK3sKKyAgcmVnaXN0ZXIgUFRSIHZhbDsKKworICBpZiAoc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIHZhbCA9IE5VTEw7CisgICAgfQorICBlbHNlIGlmICgodmFsID0gbW1hbGxvYyAobWQsIHNpemUpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgIG5vbWVtIChzaXplKTsKKyAgICB9CisgIHJldHVybiAodmFsKTsKK30KKworLyogTGlrZSBtcmVhbGxvYyBidXQgZ2V0IGVycm9yIGlmIG5vIHN0b3JhZ2UgYXZhaWxhYmxlLiAgKi8KKworUFRSCit4bXJlYWxsb2MgKG1kLCBwdHIsIHNpemUpCisgICAgIFBUUiBtZDsKKyAgICAgUFRSIHB0cjsKKyAgICAgbG9uZyBzaXplOworeworICByZWdpc3RlciBQVFIgdmFsOworCisgIGlmIChwdHIgIT0gTlVMTCkKKyAgICB7CisgICAgICB2YWwgPSBtcmVhbGxvYyAobWQsIHB0ciwgc2l6ZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdmFsID0gbW1hbGxvYyAobWQsIHNpemUpOworICAgIH0KKyAgaWYgKHZhbCA9PSBOVUxMKQorICAgIHsKKyAgICAgIG5vbWVtIChzaXplKTsKKyAgICB9CisgIHJldHVybiAodmFsKTsKK30KKworLyogTGlrZSBtYWxsb2MgYnV0IGdldCBlcnJvciBpZiBubyBzdG9yYWdlIGF2YWlsYWJsZSwgYW5kIHByb3RlY3QgYWdhaW5zdAorICAgdGhlIGNhbGxlciB3YW50aW5nIHRvIGFsbG9jYXRlIHplcm8gYnl0ZXMuICAqLworCitQVFIKK3htYWxsb2MgKHNpemUpCisgICAgIHNpemVfdCBzaXplOworeworICByZXR1cm4gKHhtbWFsbG9jICgoUFRSKSBOVUxMLCBzaXplKSk7Cit9CisKKy8qIExpa2UgbXJlYWxsb2MgYnV0IGdldCBlcnJvciBpZiBubyBzdG9yYWdlIGF2YWlsYWJsZS4gICovCisKK1BUUgoreHJlYWxsb2MgKHB0ciwgc2l6ZSkKKyAgICAgUFRSIHB0cjsKKyAgICAgc2l6ZV90IHNpemU7Cit7CisgIHJldHVybiAoeG1yZWFsbG9jICgoUFRSKSBOVUxMLCBwdHIsIHNpemUpKTsKK30KKworDAorLyogTXkgcmVwbGFjZW1lbnQgZm9yIHRoZSByZWFkIHN5c3RlbSBjYWxsLgorICAgVXNlZCBsaWtlIGByZWFkJyBidXQga2VlcHMgZ29pbmcgaWYgYHJlYWQnIHJldHVybnMgdG9vIHNvb24uICAqLworCitpbnQKK215cmVhZCAoZGVzYywgYWRkciwgbGVuKQorICAgICBpbnQgZGVzYzsKKyAgICAgY2hhciAqYWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgcmVnaXN0ZXIgaW50IHZhbDsKKyAgaW50IG9yZ2xlbiA9IGxlbjsKKworICB3aGlsZSAobGVuID4gMCkKKyAgICB7CisgICAgICB2YWwgPSByZWFkIChkZXNjLCBhZGRyLCBsZW4pOworICAgICAgaWYgKHZhbCA8IDApCisJcmV0dXJuIHZhbDsKKyAgICAgIGlmICh2YWwgPT0gMCkKKwlyZXR1cm4gb3JnbGVuIC0gbGVuOworICAgICAgbGVuIC09IHZhbDsKKyAgICAgIGFkZHIgKz0gdmFsOworICAgIH0KKyAgcmV0dXJuIG9yZ2xlbjsKK30KKwwKKy8qIE1ha2UgYSBjb3B5IG9mIHRoZSBzdHJpbmcgYXQgUFRSIHdpdGggU0laRSBjaGFyYWN0ZXJzCisgICAoYW5kIGFkZCBhIG51bGwgY2hhcmFjdGVyIGF0IHRoZSBlbmQgaW4gdGhlIGNvcHkpLgorICAgVXNlcyBtYWxsb2MgdG8gZ2V0IHRoZSBzcGFjZS4gIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcHkuICAqLworCitjaGFyICoKK3NhdmVzdHJpbmcgKHB0ciwgc2l6ZSkKKyAgICAgY29uc3QgY2hhciAqcHRyOworICAgICBpbnQgc2l6ZTsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqcCA9IChjaGFyICopIHhtYWxsb2MgKHNpemUgKyAxKTsKKyAgbWVtY3B5IChwLCBwdHIsIHNpemUpOworICBwW3NpemVdID0gMDsKKyAgcmV0dXJuIHA7Cit9CisKK2NoYXIgKgorbXNhdmVzdHJpbmcgKG1kLCBwdHIsIHNpemUpCisgICAgIFBUUiBtZDsKKyAgICAgY29uc3QgY2hhciAqcHRyOworICAgICBpbnQgc2l6ZTsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqcCA9IChjaGFyICopIHhtbWFsbG9jIChtZCwgc2l6ZSArIDEpOworICBtZW1jcHkgKHAsIHB0ciwgc2l6ZSk7CisgIHBbc2l6ZV0gPSAwOworICByZXR1cm4gcDsKK30KKworLyogVGhlICJjb25zdCIgaXMgc28gaXQgY29tcGlsZXMgdW5kZXIgREdVWCAod2hpY2ggcHJvdG90eXBlcyBzdHJzYXZlCisgICBpbiA8c3RyaW5nLmg+LiAgRklYTUU6IFRoaXMgc2hvdWxkIGJlIG5hbWVkICJ4c3Ryc2F2ZSIsIHNob3VsZG4ndCBpdD8KKyAgIERvZXNuJ3QgcmVhbCBzdHJzYXZlIHJldHVybiBOVUxMIGlmIG91dCBvZiBtZW1vcnk/ICAqLworY2hhciAqCitzdHJzYXZlIChwdHIpCisgICAgIGNvbnN0IGNoYXIgKnB0cjsKK3sKKyAgcmV0dXJuIHNhdmVzdHJpbmcgKHB0ciwgc3RybGVuIChwdHIpKTsKK30KKworY2hhciAqCittc3Ryc2F2ZSAobWQsIHB0cikKKyAgICAgUFRSIG1kOworICAgICBjb25zdCBjaGFyICpwdHI7Cit7CisgIHJldHVybiAobXNhdmVzdHJpbmcgKG1kLCBwdHIsIHN0cmxlbiAocHRyKSkpOworfQorCit2b2lkCitwcmludF9zcGFjZXMgKG4sIGZpbGUpCisgICAgIHJlZ2lzdGVyIGludCBuOworICAgICByZWdpc3RlciBHREJfRklMRSAqZmlsZTsKK3sKKyAgaWYgKGZpbGUtPnRzX3N0cmVhbXR5cGUgPT0gYXN0cmluZykKKyAgICB7CisgICAgICBjaGFyICpwOworCisgICAgICBnZGJfZmlsZV9hZGp1c3Rfc3RyYnVmIChuLCBmaWxlKTsKKyAgICAgIHAgPSBmaWxlLT50c19zdHJidWYgKyBzdHJsZW4gKGZpbGUtPnRzX3N0cmJ1Zik7CisKKyAgICAgIG1lbXNldCAocCwgJyAnLCBuKTsKKyAgICAgIHBbbl0gPSAnXDAwMCc7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgd2hpbGUgKG4tLSA+IDApCisJZnB1dGMgKCcgJywgZmlsZS0+dHNfZmlsZXN0cmVhbSk7CisgICAgfQorfQorCisvKiBQcmludCBhIGhvc3QgYWRkcmVzcy4gICovCisKK3ZvaWQKK2dkYl9wcmludF9hZGRyZXNzIChhZGRyLCBzdHJlYW0pCisgICAgIFBUUiBhZGRyOworICAgICBHREJfRklMRSAqc3RyZWFtOworeworCisgIC8qIFdlIGNvdWxkIHVzZSB0aGUgJXAgY29udmVyc2lvbiBzcGVjaWZpZXIgdG8gZnByaW50ZiBpZiB3ZSBoYWQgYW55CisgICAgIHdheSBvZiBrbm93aW5nIHdoZXRoZXIgdGhpcyBob3N0IHN1cHBvcnRzIGl0LiAgQnV0IHRoZSBmb2xsb3dpbmcKKyAgICAgc2hvdWxkIHdvcmsgb24gdGhlIEFscGhhIGFuZCBvbiAzMiBiaXQgbWFjaGluZXMuICAqLworCisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpYWRkcik7Cit9CisKKy8qIEFzayB1c2VyIGEgeS1vci1uIHF1ZXN0aW9uIGFuZCByZXR1cm4gMSBpZmYgYW5zd2VyIGlzIHllcy4KKyAgIFRha2VzIHRocmVlIGFyZ3Mgd2hpY2ggYXJlIGdpdmVuIHRvIHByaW50ZiB0byBwcmludCB0aGUgcXVlc3Rpb24uCisgICBUaGUgZmlyc3QsIGEgY29udHJvbCBzdHJpbmcsIHNob3VsZCBlbmQgaW4gIj8gIi4KKyAgIEl0IHNob3VsZCBub3Qgc2F5IGhvdyB0byBhbnN3ZXIsIGJlY2F1c2Ugd2UgZG8gdGhhdC4gICovCisKKy8qIFZBUkFSR1MgKi8KK2ludAorI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworcXVlcnkgKGNoYXIgKmN0bHN0ciwgLi4uKQorI2Vsc2UKK3F1ZXJ5ICh2YV9hbGlzdCkKKyAgICAgdmFfZGNsCisjZW5kaWYKK3sKKyAgdmFfbGlzdCBhcmdzOworICByZWdpc3RlciBpbnQgYW5zd2VyOworICByZWdpc3RlciBpbnQgYW5zMjsKKyAgaW50IHJldHZhbDsKKworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworICB2YV9zdGFydCAoYXJncywgY3Rsc3RyKTsKKyNlbHNlCisgIGNoYXIgKmN0bHN0cjsKKyAgdmFfc3RhcnQgKGFyZ3MpOworICBjdGxzdHIgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7CisjZW5kaWYKKworICBpZiAocXVlcnlfaG9vaykKKyAgICB7CisgICAgICByZXR1cm4gcXVlcnlfaG9vayAoY3Rsc3RyLCBhcmdzKTsKKyAgICB9CisKKyAgLyogQXV0b21hdGljYWxseSBhbnN3ZXIgInllcyIgaWYgaW5wdXQgaXMgbm90IGZyb20gYSB0ZXJtaW5hbC4gICovCisgIGlmICghaW5wdXRfZnJvbV90ZXJtaW5hbF9wICgpKQorICAgIHJldHVybiAxOworI2lmZGVmIE1QVworICAvKiBGSVhNRSBBdXRvbWF0aWNhbGx5IGFuc3dlciAieWVzIiBpZiBjYWxsZWQgZnJvbSBNYWNHREIuICAqLworICBpZiAobWFjX2FwcCkKKyAgICByZXR1cm4gMTsKKyNlbmRpZiAvKiBNUFcgKi8KKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICB3cmFwX2hlcmUgKCIiKTsJCS8qIEZsdXNoIGFueSBidWZmZXJlZCBvdXRwdXQgKi8KKyAgICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisKKyAgICAgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKwlwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMycHJlLXF1ZXJ5XG4iKTsKKworICAgICAgdmZwcmludGZfZmlsdGVyZWQgKGdkYl9zdGRvdXQsIGN0bHN0ciwgYXJncyk7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCIoeSBvciBuKSAiKTsKKworICAgICAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorCXByaW50Zl9maWx0ZXJlZCAoIlxuXDAzMlwwMzJxdWVyeVxuIik7CisKKyNpZmRlZiBNUFcKKyAgICAgIC8qIElmIG5vdCBpbiBNYWNHREIsIG1vdmUgdG8gYSBuZXcgbGluZSBzbyB0aGUgZW50ZXJlZCBsaW5lIGRvZXNuJ3QKKwkgaGF2ZSBhIHByb21wdCBvbiB0aGUgZnJvbnQgb2YgaXQuICovCisgICAgICBpZiAoIW1hY19hcHApCisJZnB1dHNfdW5maWx0ZXJlZCAoIlxuIiwgZ2RiX3N0ZG91dCk7CisjZW5kaWYgLyogTVBXICovCisKKyAgICAgIHdyYXBfaGVyZSgiIik7CisgICAgICBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCisjaWYgZGVmaW5lZChUVUkpCisgICAgICBpZiAoIXR1aV92ZXJzaW9uIHx8IGNtZFdpbiA9PSB0dWlXaW5XaXRoRm9jdXMoKSkKKyNlbmRpZgorCWFuc3dlciA9IGZnZXRjIChzdGRpbik7CisjaWYgZGVmaW5lZChUVUkpCisgICAgICBlbHNlCisKKyAgICAgICAgYW5zd2VyID0gKHVuc2lnbmVkIGNoYXIpdHVpQnVmZmVyR2V0YygpOworCisjZW5kaWYKKyAgICAgIGNsZWFyZXJyIChzdGRpbik7CQkvKiBpbiBjYXNlIG9mIEMtZCAqLworICAgICAgaWYgKGFuc3dlciA9PSBFT0YpCS8qIEMtZCAqLworICAgICAgICB7CisJICByZXR2YWwgPSAxOworCSAgYnJlYWs7CisJfQorICAgICAgLyogRWF0IHJlc3Qgb2YgaW5wdXQgbGluZSwgdG8gRU9GIG9yIG5ld2xpbmUgKi8KKyAgICAgIGlmICgoYW5zd2VyICE9ICdcbicpIHx8ICh0dWlfdmVyc2lvbiAmJiBhbnN3ZXIgIT0gJ1xyJykpCisJZG8gCisJICB7CisjaWYgZGVmaW5lZChUVUkpCisJICAgIGlmICghdHVpX3ZlcnNpb24gfHwgY21kV2luID09IHR1aVdpbldpdGhGb2N1cygpKQorI2VuZGlmCisJICAgICAgYW5zMiA9IGZnZXRjIChzdGRpbik7CisjaWYgZGVmaW5lZChUVUkpCisJICAgIGVsc2UKKworICAgICAgICAgICAgICBhbnMyID0gKHVuc2lnbmVkIGNoYXIpdHVpQnVmZmVyR2V0YygpOyAKKyNlbmRpZgorCSAgICBjbGVhcmVyciAoc3RkaW4pOworCSAgfQorICAgICAgICB3aGlsZSAoYW5zMiAhPSBFT0YgJiYgYW5zMiAhPSAnXG4nICYmIGFuczIgIT0gJ1xyJyk7CisgICAgICBUVUlETygoKFR1aU9wYXF1ZUZ1bmNQdHIpdHVpX3ZTdGFydE5ld0xpbmVzLCAxKSk7CisKKyAgICAgIGlmIChhbnN3ZXIgPj0gJ2EnKQorCWFuc3dlciAtPSAwNDA7CisgICAgICBpZiAoYW5zd2VyID09ICdZJykKKwl7CisJICByZXR2YWwgPSAxOworCSAgYnJlYWs7CisJfQorICAgICAgaWYgKGFuc3dlciA9PSAnTicpCisJeworCSAgcmV0dmFsID0gMDsKKwkgIGJyZWFrOworCX0KKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlBsZWFzZSBhbnN3ZXIgeSBvciBuLlxuIik7CisgICAgfQorCisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCJcblwwMzJcMDMycG9zdC1xdWVyeVxuIik7CisgIHJldHVybiByZXR2YWw7Cit9CisKKwwKKy8qIFBhcnNlIGEgQyBlc2NhcGUgc2VxdWVuY2UuICBTVFJJTkdfUFRSIHBvaW50cyB0byBhIHZhcmlhYmxlCisgICBjb250YWluaW5nIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRvIHBhcnNlLiAgVGhhdCBwb2ludGVyCisgICBzaG91bGQgcG9pbnQgdG8gdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgXC4gIFRoYXQgcG9pbnRlcgorICAgaXMgdXBkYXRlZCBwYXN0IHRoZSBjaGFyYWN0ZXJzIHdlIHVzZS4gIFRoZSB2YWx1ZSBvZiB0aGUKKyAgIGVzY2FwZSBzZXF1ZW5jZSBpcyByZXR1cm5lZC4KKworICAgQSBuZWdhdGl2ZSB2YWx1ZSBtZWFucyB0aGUgc2VxdWVuY2UgXCBuZXdsaW5lIHdhcyBzZWVuLAorICAgd2hpY2ggaXMgc3VwcG9zZWQgdG8gYmUgZXF1aXZhbGVudCB0byBub3RoaW5nIGF0IGFsbC4KKworICAgSWYgXCBpcyBmb2xsb3dlZCBieSBhIG51bGwgY2hhcmFjdGVyLCB3ZSByZXR1cm4gYSBuZWdhdGl2ZQorICAgdmFsdWUgYW5kIGxlYXZlIHRoZSBzdHJpbmcgcG9pbnRlciBwb2ludGluZyBhdCB0aGUgbnVsbCBjaGFyYWN0ZXIuCisKKyAgIElmIFwgaXMgZm9sbG93ZWQgYnkgMDAwLCB3ZSByZXR1cm4gMCBhbmQgbGVhdmUgdGhlIHN0cmluZyBwb2ludGVyCisgICBhZnRlciB0aGUgemVyb3MuICBBIHZhbHVlIG9mIDAgZG9lcyBub3QgbWVhbiBlbmQgb2Ygc3RyaW5nLiAgKi8KKworaW50CitwYXJzZV9lc2NhcGUgKHN0cmluZ19wdHIpCisgICAgIGNoYXIgKipzdHJpbmdfcHRyOworeworICByZWdpc3RlciBpbnQgYyA9ICooKnN0cmluZ19wdHIpKys7CisgIHN3aXRjaCAoYykKKyAgICB7CisgICAgY2FzZSAnYSc6CisgICAgICByZXR1cm4gMDA3OwkJLyogQmVsbCAoYWxlcnQpIGNoYXIgKi8KKyAgICBjYXNlICdiJzoKKyAgICAgIHJldHVybiAnXGInOworICAgIGNhc2UgJ2UnOgkJCS8qIEVzY2FwZSBjaGFyYWN0ZXIgKi8KKyAgICAgIHJldHVybiAwMzM7CisgICAgY2FzZSAnZic6CisgICAgICByZXR1cm4gJ1xmJzsKKyAgICBjYXNlICduJzoKKyAgICAgIHJldHVybiAnXG4nOworICAgIGNhc2UgJ3InOgorICAgICAgcmV0dXJuICdccic7CisgICAgY2FzZSAndCc6CisgICAgICByZXR1cm4gJ1x0JzsKKyAgICBjYXNlICd2JzoKKyAgICAgIHJldHVybiAnXHYnOworICAgIGNhc2UgJ1xuJzoKKyAgICAgIHJldHVybiAtMjsKKyAgICBjYXNlIDA6CisgICAgICAoKnN0cmluZ19wdHIpLS07CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlICdeJzoKKyAgICAgIGMgPSAqKCpzdHJpbmdfcHRyKSsrOworICAgICAgaWYgKGMgPT0gJ1xcJykKKwljID0gcGFyc2VfZXNjYXBlIChzdHJpbmdfcHRyKTsKKyAgICAgIGlmIChjID09ICc/JykKKwlyZXR1cm4gMDE3NzsKKyAgICAgIHJldHVybiAoYyAmIDAyMDApIHwgKGMgJiAwMzcpOworICAgICAgCisgICAgY2FzZSAnMCc6CisgICAgY2FzZSAnMSc6CisgICAgY2FzZSAnMic6CisgICAgY2FzZSAnMyc6CisgICAgY2FzZSAnNCc6CisgICAgY2FzZSAnNSc6CisgICAgY2FzZSAnNic6CisgICAgY2FzZSAnNyc6CisgICAgICB7CisJcmVnaXN0ZXIgaW50IGkgPSBjIC0gJzAnOworCXJlZ2lzdGVyIGludCBjb3VudCA9IDA7CisJd2hpbGUgKCsrY291bnQgPCAzKQorCSAgeworCSAgICBpZiAoKGMgPSAqKCpzdHJpbmdfcHRyKSsrKSA+PSAnMCcgJiYgYyA8PSAnNycpCisJICAgICAgeworCQlpICo9IDg7CisJCWkgKz0gYyAtICcwJzsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCSgqc3RyaW5nX3B0ciktLTsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgfQorCXJldHVybiBpOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gYzsKKyAgICB9Cit9CisMCisvKiBQcmludCB0aGUgY2hhcmFjdGVyIEMgb24gU1RSRUFNIGFzIHBhcnQgb2YgdGhlIGNvbnRlbnRzIG9mIGEgbGl0ZXJhbAorICAgc3RyaW5nIHdob3NlIGRlbGltaXRlciBpcyBRVU9URVIuICBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIHNob3VsZCBvbmx5CisgICBiZSBjYWxsIGZvciBwcmludGluZyB0aGluZ3Mgd2hpY2ggYXJlIGluZGVwZW5kZW50IG9mIHRoZSBsYW5ndWFnZQorICAgb2YgdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQuICovCisKK3ZvaWQKK2dkYl9wcmludGNoYXIgKGMsIHN0cmVhbSwgcXVvdGVyKQorICAgICByZWdpc3RlciBpbnQgYzsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgaW50IHF1b3RlcjsKK3sKKworICBjICY9IDB4RkY7CQkJLyogQXZvaWQgc2lnbiBiaXQgZm9sbGllcyAqLworCisgIGlmICggICAgICAgICAgICAgIGMgPCAweDIwICB8fAkJLyogTG93IGNvbnRyb2wgY2hhcnMgKi8JCisgICAgICAoYyA+PSAweDdGICYmIGMgPCAweEEwKSB8fAkJLyogREVMLCBIaWdoIGNvbnRyb2xzICovCisgICAgICAoc2V2ZW5iaXRfc3RyaW5ncyAmJiBjID49IDB4ODApKSB7CS8qIGhpZ2ggb3JkZXIgYml0IHNldCAqLworICAgIHN3aXRjaCAoYykKKyAgICAgIHsKKyAgICAgIGNhc2UgJ1xuJzoKKwlmcHV0c19maWx0ZXJlZCAoIlxcbiIsIHN0cmVhbSk7CisJYnJlYWs7CisgICAgICBjYXNlICdcYic6CisJZnB1dHNfZmlsdGVyZWQgKCJcXGIiLCBzdHJlYW0pOworCWJyZWFrOworICAgICAgY2FzZSAnXHQnOgorCWZwdXRzX2ZpbHRlcmVkICgiXFx0Iiwgc3RyZWFtKTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ1xmJzoKKwlmcHV0c19maWx0ZXJlZCAoIlxcZiIsIHN0cmVhbSk7CisJYnJlYWs7CisgICAgICBjYXNlICdccic6CisJZnB1dHNfZmlsdGVyZWQgKCJcXHIiLCBzdHJlYW0pOworCWJyZWFrOworICAgICAgY2FzZSAnXDAzMyc6CisJZnB1dHNfZmlsdGVyZWQgKCJcXGUiLCBzdHJlYW0pOworCWJyZWFrOworICAgICAgY2FzZSAnXDAwNyc6CisJZnB1dHNfZmlsdGVyZWQgKCJcXGEiLCBzdHJlYW0pOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICJcXCUuM28iLCAodW5zaWduZWQgaW50KSBjKTsKKwlicmVhazsKKyAgICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoYyA9PSAnXFwnIHx8IGMgPT0gcXVvdGVyKQorICAgICAgZnB1dHNfZmlsdGVyZWQgKCJcXCIsIHN0cmVhbSk7CisgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJWMiLCBjKTsKKyAgfQorfQorCisKKworCitzdGF0aWMgY2hhciAqIGhleGxhdGUgPSAiMDEyMzQ1Njc4OWFiY2RlZiIgOworaW50IGZtdGhleChpbmJ1ZixvdXRidWZmLGxlbmd0aCxsaW5lbGVuZ3RoKQorICAgICB1bnNpZ25lZCBjaGFyICogaW5idWYgOworICAgICB1bnNpZ25lZCBjaGFyICogb3V0YnVmZjsKKyAgICAgaW50IGxlbmd0aDsKKyAgICAgaW50IGxpbmVsZW5ndGg7Cit7CisgIHVuc2lnbmVkIGNoYXIgYnl0ZSAsIG5pYiA7CisgIGludCBvdXRsZW5ndGggPSAwIDsKKworICB3aGlsZSAobGVuZ3RoKQorICAgIHsKKyAgICAgIGlmIChvdXRsZW5ndGggPj0gbGluZWxlbmd0aCkgYnJlYWsgOworICAgICAgYnl0ZSA9ICppbmJ1ZiA7CisgICAgICBpbmJ1ZisrIDsKKyAgICAgIG5pYiA9IGJ5dGUgPj4gNCA7CisgICAgICAqb3V0YnVmZisrID0gaGV4bGF0ZVtuaWJdIDsKKyAgICAgIG5pYiA9IGJ5dGUgJjB4MGYgOworICAgICAgKm91dGJ1ZmYrKyA9IGhleGxhdGVbbmliXSA7CisgICAgICAqb3V0YnVmZisrID0gJyAnIDsKKyAgICAgIGxlbmd0aC0tIDsKKyAgICAgIG91dGxlbmd0aCArPSAzIDsKKyAgICB9CisgICpvdXRidWZmID0gJ1wwJyA7IC8qIG51bGwgdGVybWluYXRlIG91ciBvdXRwdXQgbGluZSAqLworICByZXR1cm4gb3V0bGVuZ3RoIDsKK30KKworDAorLyogTnVtYmVyIG9mIGxpbmVzIHBlciBwYWdlIG9yIFVJTlRfTUFYIGlmIHBhZ2luZyBpcyBkaXNhYmxlZC4gICovCitzdGF0aWMgdW5zaWduZWQgaW50IGxpbmVzX3Blcl9wYWdlOworLyogTnVtYmVyIG9mIGNoYXJzIHBlciBsaW5lIG9yIFVOSVRfTUFYIGlzIGxpbmUgZm9sZGluZyBpcyBkaXNhYmxlZC4gICovCitzdGF0aWMgdW5zaWduZWQgaW50IGNoYXJzX3Blcl9saW5lOworLyogQ3VycmVudCBjb3VudCBvZiBsaW5lcyBwcmludGVkIG9uIHRoaXMgcGFnZSwgY2hhcnMgb24gdGhpcyBsaW5lLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGluZXNfcHJpbnRlZCwgY2hhcnNfcHJpbnRlZDsKKworLyogQnVmZmVyIGFuZCBzdGFydCBjb2x1bW4gb2YgYnVmZmVyZWQgdGV4dCwgZm9yIGRvaW5nIHNtYXJ0ZXIgd29yZC0KKyAgIHdyYXBwaW5nLiAgV2hlbiBzb21lb25lIGNhbGxzIHdyYXBfaGVyZSgpLCB3ZSBzdGFydCBidWZmZXJpbmcgb3V0cHV0CisgICB0aGF0IGNvbWVzIHRocm91Z2ggZnB1dHNfZmlsdGVyZWQoKS4gIElmIHdlIHNlZSBhIG5ld2xpbmUsIHdlIGp1c3QKKyAgIHNwaXQgaXQgb3V0IGFuZCBmb3JnZXQgYWJvdXQgdGhlIHdyYXBfaGVyZSgpLiAgSWYgd2Ugc2VlIGFub3RoZXIKKyAgIHdyYXBfaGVyZSgpLCB3ZSBzcGl0IGl0IG91dCBhbmQgcmVtZW1iZXIgdGhlIG5ld2VyIG9uZS4gIElmIHdlIHNlZQorICAgdGhlIGVuZCBvZiB0aGUgbGluZSwgd2Ugc3BpdCBvdXQgYSBuZXdsaW5lLCB0aGUgaW5kZW50LCBhbmQgdGhlbgorICAgdGhlIGJ1ZmZlcmVkIG91dHB1dC4gICovCisKKy8qIE1hbGxvYydkIGJ1ZmZlciB3aXRoIGNoYXJzX3Blcl9saW5lKzIgYnl0ZXMuICBDb250YWlucyBjaGFyYWN0ZXJzIHdoaWNoCisgICBhcmUgd2FpdGluZyB0byBiZSBvdXRwdXQgKHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4gY291bnRlZCBpbiBjaGFyc19wcmludGVkKS4KKyAgIFdoZW4gd3JhcF9idWZmZXJbMF0gaXMgbnVsbCwgdGhlIGJ1ZmZlciBpcyBlbXB0eS4gICovCitzdGF0aWMgY2hhciAqd3JhcF9idWZmZXI7CisKKy8qIFBvaW50ZXIgaW4gd3JhcF9idWZmZXIgdG8gdGhlIG5leHQgY2hhcmFjdGVyIHRvIGZpbGwuICAqLworc3RhdGljIGNoYXIgKndyYXBfcG9pbnRlcjsKKworLyogU3RyaW5nIHRvIGluZGVudCBieSBpZiB0aGUgd3JhcCBvY2N1cnMuICBNdXN0IG5vdCBiZSBOVUxMIGlmIHdyYXBfY29sdW1uCisgICBpcyBub24temVyby4gICovCitzdGF0aWMgY2hhciAqd3JhcF9pbmRlbnQ7CisKKy8qIENvbHVtbiBudW1iZXIgb24gdGhlIHNjcmVlbiB3aGVyZSB3cmFwX2J1ZmZlciBiZWdpbnMsIG9yIDAgaWYgd3JhcHBpbmcKKyAgIGlzIG5vdCBpbiBlZmZlY3QuICAqLworc3RhdGljIGludCB3cmFwX2NvbHVtbjsKKworDAorLyogSW5pYWxpemUgdGhlIGxpbmVzIGFuZCBjaGFycyBwZXIgcGFnZSAqLwordm9pZAoraW5pdF9wYWdlX2luZm8oKQoreworI2lmIGRlZmluZWQoVFVJKQorICBpZiAodHVpX3ZlcnNpb24gJiYgbV93aW5QdHJOb3ROdWxsKGNtZFdpbikpCisgICAgeworICAgICAgbGluZXNfcGVyX3BhZ2UgPSBjbWRXaW4tPmdlbmVyaWMuaGVpZ2h0OworICAgICAgY2hhcnNfcGVyX2xpbmUgPSBjbWRXaW4tPmdlbmVyaWMud2lkdGg7CisgICAgfQorICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAvKiBUaGVzZSBkZWZhdWx0cyB3aWxsIGJlIHVzZWQgaWYgd2UgYXJlIHVuYWJsZSB0byBnZXQgdGhlIGNvcnJlY3QKKyAgICAgICAgIHZhbHVlcyBmcm9tIHRlcm1jYXAuICAqLworI2lmIGRlZmluZWQoX19HTzMyX18pCisgICAgICBsaW5lc19wZXJfcGFnZSA9IFNjcmVlblJvd3MoKTsKKyAgICAgIGNoYXJzX3Blcl9saW5lID0gU2NyZWVuQ29scygpOworI2Vsc2UgIAorICAgICAgbGluZXNfcGVyX3BhZ2UgPSAyNDsKKyAgICAgIGNoYXJzX3Blcl9saW5lID0gODA7CisKKyNpZiAhZGVmaW5lZCAoTVBXKSAmJiAhZGVmaW5lZCAoX1dJTjMyKQorICAgICAgLyogTm8gdGVybWNhcCB1bmRlciBNUFcsIGFsdGhvdWdoIG1pZ2h0IGJlIGNvb2wgdG8gZG8gc29tZXRoaW5nCisgICAgICAgICBieSBsb29raW5nIGF0IHdvcmtzaGVldCBvciBjb25zb2xlIHdpbmRvdyBzaXplcy4gKi8KKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIHNjcmVlbiBoZWlnaHQgYW5kIHdpZHRoIGZyb20gdGVybWNhcC4gICovCisgICAgICB7CisgICAgICAgIGNoYXIgKnRlcm10eXBlID0gZ2V0ZW52ICgiVEVSTSIpOworCisgICAgICAgIC8qIFBvc2l0aXZlIG1lYW5zIHN1Y2Nlc3MsIG5vbnBvc2l0aXZlIG1lYW5zIGZhaWx1cmUuICAqLworICAgICAgICBpbnQgc3RhdHVzOworCisgICAgICAgIC8qIDIwNDggaXMgbGFyZ2UgZW5vdWdoIGZvciBhbGwga25vd24gdGVybWluYWxzLCBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgICAgIEdOVSB0ZXJtY2FwIG1hbnVhbC4gICovCisgICAgICAgIGNoYXIgdGVybV9idWZmZXJbMjA0OF07CisKKyAgICAgICAgaWYgKHRlcm10eXBlKQorICAgICAgICAgIHsKKwkgICAgc3RhdHVzID0gdGdldGVudCAodGVybV9idWZmZXIsIHRlcm10eXBlKTsKKwkgICAgaWYgKHN0YXR1cyA+IDApCisJICAgICAgeworCSAgICAgICAgaW50IHZhbDsKKwkJaW50IHJ1bm5pbmdfaW5fZW1hY3MgPSBnZXRlbnYgKCJFTUFDUyIpICE9IE5VTEw7CisJICAgIAorCSAgICAgICAgdmFsID0gdGdldG51bSAoImxpIik7CisJICAgICAgICBpZiAodmFsID49IDAgJiYgIXJ1bm5pbmdfaW5fZW1hY3MpCisJICAgICAgICAgIGxpbmVzX3Blcl9wYWdlID0gdmFsOworCSAgICAgICAgZWxzZQorCSAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGxpbmVzIHBlciBwYWdlIGlzIG5vdCBtZW50aW9uZWQKKwkJICAgICBpbiB0aGUgdGVybWluYWwgZGVzY3JpcHRpb24uICBUaGlzIHByb2JhYmx5IG1lYW5zCisJCSAgICAgdGhhdCBwYWdpbmcgaXMgbm90IHVzZWZ1bCAoZS5nLiBlbWFjcyBzaGVsbCB3aW5kb3cpLAorCQkgICAgIHNvIGRpc2FibGUgcGFnaW5nLiAgKi8KKwkgICAgICAgICAgbGluZXNfcGVyX3BhZ2UgPSBVSU5UX01BWDsKKwkgICAgCisJICAgICAgICB2YWwgPSB0Z2V0bnVtICgiY28iKTsKKwkgICAgICAgIGlmICh2YWwgPj0gMCkKKwkgICAgICAgICAgY2hhcnNfcGVyX2xpbmUgPSB2YWw7CisJICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZiAvKiBNUFcgKi8KKworI2lmIGRlZmluZWQoU0lHV0lOQ0gpICYmIGRlZmluZWQoU0lHV0lOQ0hfSEFORExFUikKKworICAgICAgLyogSWYgdGhlcmUgaXMgYSBiZXR0ZXIgd2F5IHRvIGRldGVybWluZSB0aGUgd2luZG93IHNpemUsIHVzZSBpdC4gKi8KKyAgICAgIFNJR1dJTkNIX0hBTkRMRVIgKFNJR1dJTkNIKTsKKyNlbmRpZgorI2VuZGlmCisgICAgICAvKiBJZiB0aGUgb3V0cHV0IGlzIG5vdCBhIHRlcm1pbmFsLCBkb24ndCBwYWdpbmF0ZSBpdC4gICovCisgICAgICBpZiAoIUdEQl9GSUxFX0lTQVRUWSAoZ2RiX3N0ZG91dCkpCisgICAgICAgIGxpbmVzX3Blcl9wYWdlID0gVUlOVF9NQVg7CisgIH0gLyogdGhlIGNvbW1hbmRfbGluZV92ZXJzaW9uICovCisgIHNldF93aWR0aCgpOworfQorCitzdGF0aWMgdm9pZAorc2V0X3dpZHRoKCkKK3sKKyAgaWYgKGNoYXJzX3Blcl9saW5lID09IDApCisgICAgaW5pdF9wYWdlX2luZm8oKTsKKworICBpZiAoIXdyYXBfYnVmZmVyKQorICAgIHsKKyAgICAgIHdyYXBfYnVmZmVyID0gKGNoYXIgKikgeG1hbGxvYyAoY2hhcnNfcGVyX2xpbmUgKyAyKTsKKyAgICAgIHdyYXBfYnVmZmVyWzBdID0gJ1wwJzsKKyAgICB9CisgIGVsc2UKKyAgICB3cmFwX2J1ZmZlciA9IChjaGFyICopIHhyZWFsbG9jICh3cmFwX2J1ZmZlciwgY2hhcnNfcGVyX2xpbmUgKyAyKTsKKyAgd3JhcF9wb2ludGVyID0gd3JhcF9idWZmZXI7ICAgLyogU3RhcnQgaXQgYXQgdGhlIGJlZ2lubmluZyAqLworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQgCitzZXRfd2lkdGhfY29tbWFuZCAoYXJncywgZnJvbV90dHksIGMpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKKyAgICAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7Cit7CisgIHNldF93aWR0aCAoKTsKK30KKworLyogV2FpdCwgc28gdGhlIHVzZXIgY2FuIHJlYWQgd2hhdCdzIG9uIHRoZSBzY3JlZW4uICBQcm9tcHQgdGhlIHVzZXIKKyAgIHRvIGNvbnRpbnVlIGJ5IHByZXNzaW5nIFJFVFVSTi4gICovCisKK3N0YXRpYyB2b2lkCitwcm9tcHRfZm9yX2NvbnRpbnVlICgpCit7CisgIGNoYXIgKmlnbm9yZTsKKyAgY2hhciBjb250X3Byb21wdFsxMjBdOworCisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfdW5maWx0ZXJlZCAoIlxuXDAzMlwwMzJwcmUtcHJvbXB0LWZvci1jb250aW51ZVxuIik7CisKKyAgc3RyY3B5IChjb250X3Byb21wdCwKKwkgICItLS1UeXBlIDxyZXR1cm4+IHRvIGNvbnRpbnVlLCBvciBxIDxyZXR1cm4+IHRvIHF1aXQtLS0iKTsKKyAgaWYgKGFubm90YXRpb25fbGV2ZWwgPiAxKQorICAgIHN0cmNhdCAoY29udF9wcm9tcHQsICJcblwwMzJcMDMycHJvbXB0LWZvci1jb250aW51ZVxuIik7CisKKyAgLyogV2UgbXVzdCBkbyB0aGlzICpiZWZvcmUqIHdlIGNhbGwgZ2RiX3JlYWRsaW5lLCBlbHNlIGl0IHdpbGwgZXZlbnR1YWxseQorICAgICBjYWxsIHVzIC0tIHRoaW5raW5nIHRoYXQgd2UncmUgdHJ5aW5nIHRvIHByaW50IGJleW9uZCB0aGUgZW5kIG9mIHRoZSAKKyAgICAgc2NyZWVuLiAgKi8KKyAgcmVpbml0aWFsaXplX21vcmVfZmlsdGVyICgpOworCisgIGltbWVkaWF0ZV9xdWl0Kys7CisgIC8qIE9uIGEgcmVhbCBvcGVyYXRpbmcgc3lzdGVtLCB0aGUgdXNlciBjYW4gcXVpdCB3aXRoIFNJR0lOVC4KKyAgICAgQnV0IG5vdCBvbiBHTzMyLgorCisgICAgICdxJyBpcyBwcm92aWRlZCBvbiBhbGwgc3lzdGVtcyBzbyB1c2VycyBkb24ndCBoYXZlIHRvIGNoYW5nZSBoYWJpdHMKKyAgICAgZnJvbSBzeXN0ZW0gdG8gc3lzdGVtLCBhbmQgYmVjYXVzZSB0ZWxsaW5nIHRoZW0gd2hhdCB0byBkbyBpbgorICAgICB0aGUgcHJvbXB0IGlzIG1vcmUgdXNlci1mcmllbmRseSB0aGFuIGV4cGVjdGluZyB0aGVtIHRvIHRoaW5rIG9mCisgICAgIFNJR0lOVC4gICovCisgIC8qIENhbGwgcmVhZGxpbmUsIG5vdCBnZGJfcmVhZGxpbmUsIGJlY2F1c2UgR08zMiByZWFkbGluZSBoYW5kbGVzIGNvbnRyb2wtQworICAgICB3aGVyZWFzIGNvbnRyb2wtQyB0byBnZGJfcmVhZGxpbmUgd2lsbCBjYXVzZSB0aGUgdXNlciB0byBnZXQgZHVtcGVkCisgICAgIG91dCB0byBET1MuICAqLworICBpZ25vcmUgPSByZWFkbGluZSAoY29udF9wcm9tcHQpOworCisgIGlmIChhbm5vdGF0aW9uX2xldmVsID4gMSkKKyAgICBwcmludGZfdW5maWx0ZXJlZCAoIlxuXDAzMlwwMzJwb3N0LXByb21wdC1mb3ItY29udGludWVcbiIpOworCisgIGlmIChpZ25vcmUpCisgICAgeworICAgICAgY2hhciAqcCA9IGlnbm9yZTsKKyAgICAgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKKwkrK3A7CisgICAgICBpZiAocFswXSA9PSAncScpCisJcmVxdWVzdF9xdWl0IChTSUdJTlQpOworICAgICAgZnJlZSAoaWdub3JlKTsKKyAgICB9CisgIGltbWVkaWF0ZV9xdWl0LS07CisKKyAgLyogTm93IHdlIGhhdmUgdG8gZG8gdGhpcyBhZ2Fpbiwgc28gdGhhdCBHREIgd2lsbCBrbm93IHRoYXQgaXQgZG9lc24ndAorICAgICBuZWVkIHRvIHNhdmUgdGhlIC0tLVR5cGUgPHJldHVybj4tLS0gbGluZSBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW4uICAqLworICByZWluaXRpYWxpemVfbW9yZV9maWx0ZXIgKCk7CisKKyAgZG9udF9yZXBlYXQgKCk7CQkvKiBGb3JnZXQgcHJldiBjbWQgLS0gQ1Igd29uJ3QgcmVwZWF0IGl0LiAqLworfQorCisvKiBSZWluaXRpYWxpemUgZmlsdGVyOyBpZS4gdGVsbCBpdCB0byByZXNldCB0byBvcmlnaW5hbCB2YWx1ZXMuICAqLworCit2b2lkCityZWluaXRpYWxpemVfbW9yZV9maWx0ZXIgKCkKK3sKKyAgbGluZXNfcHJpbnRlZCA9IDA7CisgIGNoYXJzX3ByaW50ZWQgPSAwOworfQorCisvKiBJbmRpY2F0ZSB0aGF0IGlmIHRoZSBuZXh0IHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgb3ZlcmZsb3dzIHRoZSBsaW5lLAorICAgYSBuZXdsaW5lIHNob3VsZCBiZSBpbnNlcnRlZCBoZXJlIHJhdGhlciB0aGFuIHdoZW4gaXQgaGl0cyB0aGUgZW5kLiAKKyAgIElmIElOREVOVCBpcyBub24tbnVsbCwgaXQgaXMgYSBzdHJpbmcgdG8gYmUgcHJpbnRlZCB0byBpbmRlbnQgdGhlCisgICB3cmFwcGVkIHBhcnQgb24gdGhlIG5leHQgbGluZS4gIElOREVOVCBtdXN0IHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsCisgICB0aGUgbmV4dCBjYWxsIHRvIHdyYXBfaGVyZSgpIG9yIHVudGlsIGEgbmV3bGluZSBpcyBwcmludGVkIHRocm91Z2gKKyAgIGZwdXRzX2ZpbHRlcmVkKCkuCisKKyAgIElmIHRoZSBsaW5lIGlzIGFscmVhZHkgb3ZlcmZ1bGwsIHdlIGltbWVkaWF0ZWx5IHByaW50IGEgbmV3bGluZSBhbmQKKyAgIHRoZSBpbmRlbnRhdGlvbiwgYW5kIGRpc2FibGUgZnVydGhlciB3cmFwcGluZy4KKworICAgSWYgd2UgZG9uJ3Qga25vdyB0aGUgd2lkdGggb2YgbGluZXMsIGJ1dCB3ZSBrbm93IHRoZSBwYWdlIGhlaWdodCwKKyAgIHdlIG11c3Qgbm90IHdyYXAgd29yZHMsIGJ1dCBzaG91bGQgc3RpbGwga2VlcCB0cmFjayBvZiBuZXdsaW5lcworICAgdGhhdCB3ZXJlIGV4cGxpY2l0bHkgcHJpbnRlZC4KKworICAgSU5ERU5UIHNob3VsZCBub3QgY29udGFpbiB0YWJzLCBhcyB0aGF0IHdpbGwgbWVzcyB1cCB0aGUgY2hhciBjb3VudAorICAgb24gdGhlIG5leHQgbGluZS4gIEZJWE1FLgorCisgICBUaGlzIHJvdXRpbmUgaXMgZ3VhcmFudGVlZCB0byBmb3JjZSBvdXQgYW55IG91dHB1dCB3aGljaCBoYXMgYmVlbgorICAgc3F1aXJyZWxlZCBhd2F5IGluIHRoZSB3cmFwX2J1ZmZlciwgc28gd3JhcF9oZXJlICgoY2hhciAqKTApIGNhbiBiZQorICAgdXNlZCB0byBmb3JjZSBvdXQgb3V0cHV0IGZyb20gdGhlIHdyYXBfYnVmZmVyLiAgKi8KKwordm9pZAord3JhcF9oZXJlKGluZGVudCkKKyAgICAgY2hhciAqaW5kZW50OworeworICAvKiBUaGlzIHNob3VsZCBoYXZlIGJlZW4gYWxsb2NhdGVkLCBidXQgYmUgcGFyYW5vaWQgYW55d2F5LiAqLworICBpZiAoIXdyYXBfYnVmZmVyKQorICAgIGFib3J0ICgpOworCisgIGlmICh3cmFwX2J1ZmZlclswXSkKKyAgICB7CisgICAgICAqd3JhcF9wb2ludGVyID0gJ1wwJzsKKyAgICAgIGZwdXRzX3VuZmlsdGVyZWQgKHdyYXBfYnVmZmVyLCBnZGJfc3Rkb3V0KTsKKyAgICB9CisgIHdyYXBfcG9pbnRlciA9IHdyYXBfYnVmZmVyOworICB3cmFwX2J1ZmZlclswXSA9ICdcMCc7CisgIGlmIChjaGFyc19wZXJfbGluZSA9PSBVSU5UX01BWCkJCS8qIE5vIGxpbmUgb3ZlcmZsb3cgY2hlY2tpbmcgKi8KKyAgICB7CisgICAgICB3cmFwX2NvbHVtbiA9IDA7CisgICAgfQorICBlbHNlIGlmIChjaGFyc19wcmludGVkID49IGNoYXJzX3Blcl9saW5lKQorICAgIHsKKyAgICAgIHB1dHNfZmlsdGVyZWQgKCJcbiIpOworICAgICAgaWYgKGluZGVudCAhPSBOVUxMKQorCXB1dHNfZmlsdGVyZWQgKGluZGVudCk7CisgICAgICB3cmFwX2NvbHVtbiA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgd3JhcF9jb2x1bW4gPSBjaGFyc19wcmludGVkOworICAgICAgaWYgKGluZGVudCA9PSBOVUxMKQorCXdyYXBfaW5kZW50ID0gIiI7CisgICAgICBlbHNlCisJd3JhcF9pbmRlbnQgPSBpbmRlbnQ7CisgICAgfQorfQorCisvKiBFbnN1cmUgdGhhdCB3aGF0ZXZlciBnZXRzIHByaW50ZWQgbmV4dCwgdXNpbmcgdGhlIGZpbHRlcmVkIG91dHB1dAorICAgY29tbWFuZHMsIHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLiAgSS5FLiBpZiB0aGVyZSBpcworICAgYW55IHBlbmRpbmcgb3V0cHV0IGZvciB0aGUgY3VycmVudCBsaW5lLCBmbHVzaCBpdCBhbmQgc3RhcnQgYSBuZXcKKyAgIGxpbmUuICBPdGhlcndpc2UgZG8gbm90aGluZy4gKi8KKwordm9pZAorYmVnaW5fbGluZSAoKQoreworICBpZiAoY2hhcnNfcHJpbnRlZCA+IDApCisgICAgeworICAgICAgcHV0c19maWx0ZXJlZCAoIlxuIik7CisgICAgfQorfQorCitpbnQgCitnZGJfZmlsZV9pc2F0dHkgKHN0cmVhbSkKKyAgICBHREJfRklMRSAqc3RyZWFtOworeworCisgIGlmIChzdHJlYW0tPnRzX3N0cmVhbXR5cGUgPT0gYWZpbGUpCisgICAgIHJldHVybiAoaXNhdHR5KGZpbGVubyhzdHJlYW0tPnRzX2ZpbGVzdHJlYW0pKSk7CisgIGVsc2UgcmV0dXJuIDA7Cit9CisKK0dEQl9GSUxFICoKK2dkYl9maWxlX2luaXRfYXN0cmluZyAobikKKyAgICBpbnQgbjsKK3sKKyAgR0RCX0ZJTEUgKnRtcHN0cmVhbTsKKworICB0bXBzdHJlYW0gPSB4bWFsbG9jIChzaXplb2YoR0RCX0ZJTEUpKTsKKyAgdG1wc3RyZWFtLT50c19zdHJlYW10eXBlID0gYXN0cmluZzsKKyAgdG1wc3RyZWFtLT50c19maWxlc3RyZWFtID0gTlVMTDsKKyAgaWYgKG4gPiAwKQorICAgIHsKKyAgICAgIHRtcHN0cmVhbS0+dHNfc3RyYnVmID0geG1hbGxvYyAoKG4gKyAxKSpzaXplb2YoY2hhcikpOworICAgICAgdG1wc3RyZWFtLT50c19zdHJidWZbMF0gPSAnXDAnOworICAgIH0KKyAgZWxzZQorICAgICB0bXBzdHJlYW0tPnRzX3N0cmJ1ZiA9IE5VTEw7CisgIHRtcHN0cmVhbS0+dHNfYnVmbGVuID0gbjsKKworICByZXR1cm4gdG1wc3RyZWFtOworfQorCit2b2lkCitnZGJfZmlsZV9kZWFsbG9jYXRlIChzdHJlYW1wdHIpCisgICAgR0RCX0ZJTEUgKipzdHJlYW1wdHI7Cit7CisgIEdEQl9GSUxFICp0bXBzdHJlYW07CisKKyAgdG1wc3RyZWFtID0gKnN0cmVhbXB0cjsKKyAgaWYgKCh0bXBzdHJlYW0tPnRzX3N0cmVhbXR5cGUgPT0gYXN0cmluZykgJiYKKyAgICAgICh0bXBzdHJlYW0tPnRzX3N0cmJ1ZiAhPSBOVUxMKSkgCisgICAgeworICAgICAgZnJlZSAodG1wc3RyZWFtLT50c19zdHJidWYpOworICAgIH0KKworICBmcmVlICh0bXBzdHJlYW0pOworICAqc3RyZWFtcHRyID0gTlVMTDsKK30KKyAKK2NoYXIgKgorZ2RiX2ZpbGVfZ2V0X3N0cmJ1ZiAoc3RyZWFtKQorICAgICBHREJfRklMRSAqc3RyZWFtOworeworICByZXR1cm4gKHN0cmVhbS0+dHNfc3RyYnVmKTsKK30KKworLyogYWRqdXN0IHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBieSB0aGUgYW1vdW50IG5lY2Vzc2FyeQorICAgdG8gYWNjb21vZGF0ZSBhcHBlbmRpbmcgYSBzdHJpbmcgb2YgbGVuZ3RoIE4gdG8gdGhlIGJ1ZmZlciBjb250ZW50cyAqLwordm9pZAorZ2RiX2ZpbGVfYWRqdXN0X3N0cmJ1ZiAobiwgc3RyZWFtKQorICAgICBpbnQgbjsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgaW50IG5vbl9udWxsX2NoYXJzOworICAKKyAgbm9uX251bGxfY2hhcnMgPSBzdHJsZW4oc3RyZWFtLT50c19zdHJidWYpOworIAorICBpZiAobiA+IChzdHJlYW0tPnRzX2J1ZmxlbiAtIG5vbl9udWxsX2NoYXJzIC0gMSkpIAorICAgIHsKKyAgICAgIHN0cmVhbS0+dHNfYnVmbGVuID0gbiArIG5vbl9udWxsX2NoYXJzICsgMTsKKyAgICAgIHN0cmVhbS0+dHNfc3RyYnVmID0geHJlYWxsb2MgKHN0cmVhbS0+dHNfc3RyYnVmLCBzdHJlYW0tPnRzX2J1Zmxlbik7CisgICAgfSAgCit9IAorCitHREJfRklMRSAqCitnZGJfZm9wZW4gKG5hbWUsIG1vZGUpCisgICAgIGNoYXIgKiBuYW1lOworICAgICBjaGFyICogbW9kZTsKK3sKKyAgaW50ICAgICAgIGdkYl9maWxlX3NpemU7CisgIEdEQl9GSUxFICp0bXA7CisKKyAgZ2RiX2ZpbGVfc2l6ZSA9IHNpemVvZihHREJfRklMRSk7CisgIHRtcCA9IChHREJfRklMRSAqKSB4bWFsbG9jIChnZGJfZmlsZV9zaXplKTsKKyAgdG1wLT50c19zdHJlYW10eXBlID0gYWZpbGU7CisgIHRtcC0+dHNfZmlsZXN0cmVhbSA9IGZvcGVuIChuYW1lLCBtb2RlKTsKKyAgdG1wLT50c19zdHJidWYgPSBOVUxMOworICB0bXAtPnRzX2J1ZmxlbiA9IDA7CisgIAorICByZXR1cm4gdG1wOworfQorCit2b2lkCitnZGJfZmx1c2ggKHN0cmVhbSkKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgaWYgKGZsdXNoX2hvb2sKKyAgICAgICYmIChzdHJlYW0gPT0gZ2RiX3N0ZG91dAorCSAgfHwgc3RyZWFtID09IGdkYl9zdGRlcnIpKQorICAgIHsKKyAgICAgIGZsdXNoX2hvb2sgKHN0cmVhbSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGZmbHVzaCAoc3RyZWFtLT50c19maWxlc3RyZWFtKTsKK30KKwordm9pZAorZ2RiX2ZjbG9zZShzdHJlYW1wdHIpCisgICAgIEdEQl9GSUxFICoqc3RyZWFtcHRyOworeworICBHREJfRklMRSAqdG1wc3RyZWFtOworCisgIHRtcHN0cmVhbSA9ICpzdHJlYW1wdHI7CisgIGZjbG9zZSAodG1wc3RyZWFtLT50c19maWxlc3RyZWFtKTsKKyAgZ2RiX2ZpbGVfZGVhbGxvY2F0ZSAoc3RyZWFtcHRyKTsKK30KKworLyogTGlrZSBmcHV0cyBidXQgaWYgRklMVEVSIGlzIHRydWUsIHBhdXNlIGFmdGVyIGV2ZXJ5IHNjcmVlbmZ1bC4KKworICAgUmVnYXJkbGVzcyBvZiBGSUxURVIgY2FuIHdyYXAgYXQgcG9pbnRzIG90aGVyIHRoYW4gdGhlIGZpbmFsCisgICBjaGFyYWN0ZXIgb2YgYSBsaW5lLgorCisgICBVbmxpa2UgZnB1dHMsIGZwdXRzX21heWJlX2ZpbHRlcmVkIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLgorICAgSXQgaXMgT0sgZm9yIExJTkVCVUZGRVIgdG8gYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSBqdXN0IGRvbid0IHByaW50CisgICBhbnl0aGluZy4KKworICAgTm90ZSB0aGF0IGEgbG9uZ2ptcCB0byB0b3AgbGV2ZWwgbWF5IG9jY3VyIGluIHRoaXMgcm91dGluZSAob25seSBpZgorICAgRklMVEVSIGlzIHRydWUpIChzaW5jZSBwcm9tcHRfZm9yX2NvbnRpbnVlIG1heSBkbyBzbykgc28gdGhpcworICAgcm91dGluZSBzaG91bGQgbm90IGJlIGNhbGxlZCB3aGVuIGNsZWFudXBzIGFyZSBub3QgaW4gcGxhY2UuICAqLworCitzdGF0aWMgdm9pZAorZnB1dHNfbWF5YmVfZmlsdGVyZWQgKGxpbmVidWZmZXIsIHN0cmVhbSwgZmlsdGVyKQorICAgICBjb25zdCBjaGFyICpsaW5lYnVmZmVyOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgZmlsdGVyOworeworICBjb25zdCBjaGFyICpsaW5lcHRyOworCisgIGlmIChsaW5lYnVmZmVyID09IDApCisgICAgcmV0dXJuOworCisgIC8qIERvbid0IGRvIGFueSBmaWx0ZXJpbmcgaWYgaXQgaXMgZGlzYWJsZWQuICAqLworICBpZiAoc3RyZWFtICE9IGdkYl9zdGRvdXQKKyAgIHx8IChsaW5lc19wZXJfcGFnZSA9PSBVSU5UX01BWCAmJiBjaGFyc19wZXJfbGluZSA9PSBVSU5UX01BWCkpCisgICAgeworICAgICAgZnB1dHNfdW5maWx0ZXJlZCAobGluZWJ1ZmZlciwgc3RyZWFtKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogR28gdGhyb3VnaCBhbmQgb3V0cHV0IGVhY2ggY2hhcmFjdGVyLiAgU2hvdyBsaW5lIGV4dGVuc2lvbgorICAgICB3aGVuIHRoaXMgaXMgbmVjZXNzYXJ5OyBwcm9tcHQgdXNlciBmb3IgbmV3IHBhZ2Ugd2hlbiB0aGlzIGlzCisgICAgIG5lY2Vzc2FyeS4gICovCisgIAorICBsaW5lcHRyID0gbGluZWJ1ZmZlcjsKKyAgd2hpbGUgKCpsaW5lcHRyKQorICAgIHsKKyAgICAgIC8qIFBvc3NpYmxlIG5ldyBwYWdlLiAgKi8KKyAgICAgIGlmIChmaWx0ZXIgJiYKKwkgIChsaW5lc19wcmludGVkID49IGxpbmVzX3Blcl9wYWdlIC0gMSkpCisJcHJvbXB0X2Zvcl9jb250aW51ZSAoKTsKKworICAgICAgd2hpbGUgKCpsaW5lcHRyICYmICpsaW5lcHRyICE9ICdcbicpCisJeworCSAgLyogUHJpbnQgYSBzaW5nbGUgbGluZS4gICovCisJICBpZiAoKmxpbmVwdHIgPT0gJ1x0JykKKwkgICAgeworCSAgICAgIGlmICh3cmFwX2NvbHVtbikKKwkJKndyYXBfcG9pbnRlcisrID0gJ1x0JzsKKwkgICAgICBlbHNlCisJCWZwdXRjX3VuZmlsdGVyZWQgKCdcdCcsIHN0cmVhbSk7CisJICAgICAgLyogU2hpZnRpbmcgcmlnaHQgYnkgMyBwcm9kdWNlcyB0aGUgbnVtYmVyIG9mIHRhYiBzdG9wcworCSAgICAgICAgIHdlIGhhdmUgYWxyZWFkeSBwYXNzZWQsIGFuZCB0aGVuIGFkZGluZyBvbmUgYW5kCisJCSBzaGlmdGluZyBsZWZ0IDMgYWR2YW5jZXMgdG8gdGhlIG5leHQgdGFiIHN0b3AuICAqLworCSAgICAgIGNoYXJzX3ByaW50ZWQgPSAoKGNoYXJzX3ByaW50ZWQgPj4gMykgKyAxKSA8PCAzOworCSAgICAgIGxpbmVwdHIrKzsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKHdyYXBfY29sdW1uKQorCQkqd3JhcF9wb2ludGVyKysgPSAqbGluZXB0cjsKKwkgICAgICBlbHNlCisJICAgICAgICBmcHV0Y191bmZpbHRlcmVkICgqbGluZXB0ciwgc3RyZWFtKTsKKwkgICAgICBjaGFyc19wcmludGVkKys7CisJICAgICAgbGluZXB0cisrOworCSAgICB9CisgICAgICAKKwkgIGlmIChjaGFyc19wcmludGVkID49IGNoYXJzX3Blcl9saW5lKQorCSAgICB7CisJICAgICAgdW5zaWduZWQgaW50IHNhdmVfY2hhcnMgPSBjaGFyc19wcmludGVkOworCisJICAgICAgY2hhcnNfcHJpbnRlZCA9IDA7CisJICAgICAgbGluZXNfcHJpbnRlZCsrOworCSAgICAgIC8qIElmIHdlIGFyZW4ndCBhY3R1YWxseSB3cmFwcGluZywgZG9uJ3Qgb3V0cHV0IG5ld2xpbmUgLS0KKwkJIGlmIGNoYXJzX3Blcl9saW5lIGlzIHJpZ2h0LCB3ZSBwcm9iYWJseSBqdXN0IG92ZXJmbG93ZWQKKwkJIGFueXdheTsgaWYgaXQncyB3cm9uZywgbGV0IHVzIGtlZXAgZ29pbmcuICAqLworCSAgICAgIGlmICh3cmFwX2NvbHVtbikKKwkJZnB1dGNfdW5maWx0ZXJlZCAoJ1xuJywgc3RyZWFtKTsKKworCSAgICAgIC8qIFBvc3NpYmxlIG5ldyBwYWdlLiAgKi8KKwkgICAgICBpZiAobGluZXNfcHJpbnRlZCA+PSBsaW5lc19wZXJfcGFnZSAtIDEpCisJCXByb21wdF9mb3JfY29udGludWUgKCk7CisKKwkgICAgICAvKiBOb3cgb3V0cHV0IGluZGVudGF0aW9uIGFuZCB3cmFwcGVkIHN0cmluZyAqLworCSAgICAgIGlmICh3cmFwX2NvbHVtbikKKwkJeworCQkgIGZwdXRzX3VuZmlsdGVyZWQgKHdyYXBfaW5kZW50LCBzdHJlYW0pOworCQkgICp3cmFwX3BvaW50ZXIgPSAnXDAnOwkvKiBOdWxsLXRlcm1pbmF0ZSBzYXZlZCBzdHVmZiAqLworCQkgIGZwdXRzX3VuZmlsdGVyZWQgKHdyYXBfYnVmZmVyLCBzdHJlYW0pOyAvKiBhbmQgZWplY3QgaXQgKi8KKwkJICAvKiBGSVhNRSwgdGhpcyBzdHJsZW4gaXMgd2hhdCBwcmV2ZW50cyB3cmFwX2luZGVudCBmcm9tCisJCSAgICAgY29udGFpbmluZyB0YWJzLiAgSG93ZXZlciwgaWYgd2UgcmVjdXJzZSB0byBwcmludCBpdAorCQkgICAgIGFuZCBjb3VudCBpdHMgY2hhcnMsIHdlIHJpc2sgdHJvdWJsZSBpZiB3cmFwX2luZGVudCBpcworCQkgICAgIGxvbmdlciB0aGFuICh0aGUgdXNlciBzZXR0YWJsZSkgY2hhcnNfcGVyX2xpbmUuIAorCQkgICAgIE5vdGUgYWxzbyB0aGF0IHRoaXMgY2FuIHNldCBjaGFyc19wcmludGVkID4gY2hhcnNfcGVyX2xpbmUKKwkJICAgICBpZiB3ZSBhcmUgcHJpbnRpbmcgYSBsb25nIHN0cmluZy4gICovCisJCSAgY2hhcnNfcHJpbnRlZCA9IHN0cmxlbiAod3JhcF9pbmRlbnQpCisJCQkJKyAoc2F2ZV9jaGFycyAtIHdyYXBfY29sdW1uKTsKKwkJICB3cmFwX3BvaW50ZXIgPSB3cmFwX2J1ZmZlcjsJLyogUmVzZXQgYnVmZmVyICovCisJCSAgd3JhcF9idWZmZXJbMF0gPSAnXDAnOworCQkgIHdyYXBfY29sdW1uID0gMDsJCS8qIEFuZCBkaXNhYmxlIGZhbmN5IHdyYXAgKi8KKyAJCX0KKwkgICAgfQorCX0KKworICAgICAgaWYgKCpsaW5lcHRyID09ICdcbicpCisJeworCSAgY2hhcnNfcHJpbnRlZCA9IDA7CisJICB3cmFwX2hlcmUgKChjaGFyICopMCk7ICAvKiBTcGl0IG91dCBjaGFycywgY2FuY2VsIGZ1cnRoZXIgd3JhcHMgKi8KKwkgIGxpbmVzX3ByaW50ZWQrKzsKKwkgIGZwdXRjX3VuZmlsdGVyZWQgKCdcbicsIHN0cmVhbSk7CisJICBsaW5lcHRyKys7CisJfQorICAgIH0KK30KKwordm9pZAorZnB1dHNfZmlsdGVyZWQgKGxpbmVidWZmZXIsIHN0cmVhbSkKKyAgICAgY29uc3QgY2hhciAqbGluZWJ1ZmZlcjsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgZnB1dHNfbWF5YmVfZmlsdGVyZWQgKGxpbmVidWZmZXIsIHN0cmVhbSwgMSk7Cit9CisKK2ludAorcHV0Y2hhcl91bmZpbHRlcmVkIChjKQorICAgICBpbnQgYzsKK3sKKyAgY2hhciBidWZbMl07CisKKyAgYnVmWzBdID0gYzsKKyAgYnVmWzFdID0gMDsKKyAgZnB1dHNfdW5maWx0ZXJlZCAoYnVmLCBnZGJfc3Rkb3V0KTsKKyAgcmV0dXJuIGM7Cit9CisKK2ludAorZnB1dGNfdW5maWx0ZXJlZCAoYywgc3RyZWFtKQorICAgICBpbnQgYzsKKyAgICAgR0RCX0ZJTEUgKiBzdHJlYW07Cit7CisgIGNoYXIgYnVmWzJdOworCisgIGJ1ZlswXSA9IGM7CisgIGJ1ZlsxXSA9IDA7CisgIGZwdXRzX3VuZmlsdGVyZWQgKGJ1Ziwgc3RyZWFtKTsKKyAgcmV0dXJuIGM7Cit9CisKK2ludAorZnB1dGNfZmlsdGVyZWQgKGMsIHN0cmVhbSkKKyAgICAgaW50IGM7CisgICAgIEdEQl9GSUxFICogc3RyZWFtOworeworICBjaGFyIGJ1ZlsyXTsKKworICBidWZbMF0gPSBjOworICBidWZbMV0gPSAwOworICBmcHV0c19maWx0ZXJlZCAoYnVmLCBzdHJlYW0pOworICByZXR1cm4gYzsKK30KKworLyogcHV0c19kZWJ1ZyBpcyBsaWtlIGZwdXRzX3VuZmlsdGVyZWQsIGV4Y2VwdCBpdCBwcmludHMgc3BlY2lhbAorICAgY2hhcmFjdGVycyBpbiBwcmludGFibGUgZmFzaGlvbi4gICovCisKK3ZvaWQKK3B1dHNfZGVidWcgKHByZWZpeCwgc3RyaW5nLCBzdWZmaXgpCisgICAgIGNoYXIgKnByZWZpeDsKKyAgICAgY2hhciAqc3RyaW5nOworICAgICBjaGFyICpzdWZmaXg7Cit7CisgIGludCBjaDsKKworICAvKiBQcmludCBwcmVmaXggYW5kIHN1ZmZpeCBhZnRlciBlYWNoIGxpbmUuICAqLworICBzdGF0aWMgaW50IG5ld19saW5lID0gMTsKKyAgc3RhdGljIGludCByZXR1cm5fcCA9IDA7CisgIHN0YXRpYyBjaGFyICpwcmV2X3ByZWZpeCA9ICIiOworICBzdGF0aWMgY2hhciAqcHJldl9zdWZmaXggPSAiIjsKKworICBpZiAoKnN0cmluZyA9PSAnXG4nKQorICAgIHJldHVybl9wID0gMDsKKworICAvKiBJZiB0aGUgcHJlZml4IGlzIGNoYW5naW5nLCBwcmludCB0aGUgcHJldmlvdXMgc3VmZml4LCBhIG5ldyBsaW5lLAorICAgICBhbmQgdGhlIG5ldyBwcmVmaXguICAqLworICBpZiAoKHJldHVybl9wIHx8IChzdHJjbXAocHJldl9wcmVmaXgsIHByZWZpeCkgIT0gMCkpICYmICFuZXdfbGluZSkKKyAgICB7CisgICAgICBmcHV0c191bmZpbHRlcmVkIChwcmV2X3N1ZmZpeCwgZ2RiX3N0ZGVycik7CisgICAgICBmcHV0c191bmZpbHRlcmVkICgiXG4iLCBnZGJfc3RkZXJyKTsKKyAgICAgIGZwdXRzX3VuZmlsdGVyZWQgKHByZWZpeCwgZ2RiX3N0ZGVycik7CisgICAgfQorCisgIC8qIFByaW50IHByZWZpeCBpZiB3ZSBwcmludGVkIGEgbmV3bGluZSBkdXJpbmcgdGhlIHByZXZpb3VzIGNhbGwuICAqLworICBpZiAobmV3X2xpbmUpCisgICAgeworICAgICAgbmV3X2xpbmUgPSAwOworICAgICAgZnB1dHNfdW5maWx0ZXJlZCAocHJlZml4LCBnZGJfc3RkZXJyKTsKKyAgICB9CisKKyAgcHJldl9wcmVmaXggPSBwcmVmaXg7CisgIHByZXZfc3VmZml4ID0gc3VmZml4OworCisgIC8qIE91dHB1dCBjaGFyYWN0ZXJzIGluIGEgcHJpbnRhYmxlIGZvcm1hdC4gICovCisgIHdoaWxlICgoY2ggPSAqc3RyaW5nKyspICE9ICdcMCcpCisgICAgeworICAgICAgc3dpdGNoIChjaCkKKyAgICAgICAgeworCWRlZmF1bHQ6CisJICBpZiAoaXNwcmludCAoY2gpKQorCSAgICBmcHV0Y191bmZpbHRlcmVkIChjaCwgZ2RiX3N0ZGVycik7CisKKwkgIGVsc2UKKwkgICAgZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3RkZXJyLCAiXFx4JTAyeCIsIGNoICYgMHhmZik7CisJICBicmVhazsKKworCWNhc2UgJ1xcJzogZnB1dHNfdW5maWx0ZXJlZCAoIlxcXFwiLCAgZ2RiX3N0ZGVycik7CWJyZWFrOworCWNhc2UgJ1xiJzogZnB1dHNfdW5maWx0ZXJlZCAoIlxcYiIsICAgZ2RiX3N0ZGVycik7CWJyZWFrOworCWNhc2UgJ1xmJzogZnB1dHNfdW5maWx0ZXJlZCAoIlxcZiIsICAgZ2RiX3N0ZGVycik7CWJyZWFrOworCWNhc2UgJ1xuJzogbmV3X2xpbmUgPSAxOworCQkgICBmcHV0c191bmZpbHRlcmVkICgiXFxuIiwgICBnZGJfc3RkZXJyKTsJYnJlYWs7CisJY2FzZSAnXHInOiBmcHV0c191bmZpbHRlcmVkICgiXFxyIiwgICBnZGJfc3RkZXJyKTsJYnJlYWs7CisJY2FzZSAnXHQnOiBmcHV0c191bmZpbHRlcmVkICgiXFx0IiwgICBnZGJfc3RkZXJyKTsJYnJlYWs7CisJY2FzZSAnXHYnOiBmcHV0c191bmZpbHRlcmVkICgiXFx2IiwgICBnZGJfc3RkZXJyKTsJYnJlYWs7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuX3AgPSBjaCA9PSAnXHInOworICAgIH0KKworICAvKiBQcmludCBzdWZmaXggaWYgd2UgcHJpbnRlZCBhIG5ld2xpbmUuICAqLworICBpZiAobmV3X2xpbmUpCisgICAgeworICAgICAgZnB1dHNfdW5maWx0ZXJlZCAoc3VmZml4LCBnZGJfc3RkZXJyKTsKKyAgICAgIGZwdXRzX3VuZmlsdGVyZWQgKCJcbiIsIGdkYl9zdGRlcnIpOworICAgIH0KK30KKworCisvKiBQcmludCBhIHZhcmlhYmxlIG51bWJlciBvZiBBUkdTIHVzaW5nIGZvcm1hdCBGT1JNQVQuICBJZiB0aGlzCisgICBpbmZvcm1hdGlvbiBpcyBnb2luZyB0byBwdXQgdGhlIGFtb3VudCB3cml0dGVuIChzaW5jZSB0aGUgbGFzdCBjYWxsCisgICB0byBSRUlOSVRJQUxJWkVfTU9SRV9GSUxURVIgb3IgdGhlIGxhc3QgcGFnZSBicmVhaykgb3ZlciB0aGUgcGFnZSBzaXplLAorICAgY2FsbCBwcm9tcHRfZm9yX2NvbnRpbnVlIHRvIGdldCB0aGUgdXNlcnMgcGVybWlzaW9uIHRvIGNvbnRpbnVlLgorCisgICBVbmxpa2UgZnByaW50ZiwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4KKworICAgV2UgaW1wbGVtZW50IHRocmVlIHZhcmlhbnRzLCB2ZnByaW50ZiAodGFrZXMgYSB2YXJhcmcgbGlzdCBhbmQgc3RyZWFtKSwKKyAgIGZwcmludGYgKHRha2VzIGEgc3RyZWFtIHRvIHdyaXRlIG9uKSwgYW5kIHByaW50ZiAodGhlIHVzdWFsKS4KKworICAgTm90ZSBhbHNvIHRoYXQgYSBsb25nam1wIHRvIHRvcCBsZXZlbCBtYXkgb2NjdXIgaW4gdGhpcyByb3V0aW5lCisgICAoc2luY2UgcHJvbXB0X2Zvcl9jb250aW51ZSBtYXkgZG8gc28pIHNvIHRoaXMgcm91dGluZSBzaG91bGQgbm90IGJlCisgICBjYWxsZWQgd2hlbiBjbGVhbnVwcyBhcmUgbm90IGluIHBsYWNlLiAgKi8KKworc3RhdGljIHZvaWQKK3ZmcHJpbnRmX21heWJlX2ZpbHRlcmVkIChzdHJlYW0sIGZvcm1hdCwgYXJncywgZmlsdGVyKQorICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBjb25zdCBjaGFyICpmb3JtYXQ7CisgICAgIHZhX2xpc3QgYXJnczsKKyAgICAgaW50IGZpbHRlcjsKK3sKKyAgY2hhciAqbGluZWJ1ZmZlcjsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jbGVhbnVwczsKKworICB2YXNwcmludGYgKCZsaW5lYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOworICBpZiAobGluZWJ1ZmZlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwdXRzX3VuZmlsdGVyZWQgKCJcbmdkYjogdmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkLlxuIiwgZ2RiX3N0ZGVycik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIG9sZF9jbGVhbnVwcyA9IG1ha2VfY2xlYW51cCAoZnJlZSwgbGluZWJ1ZmZlcik7CisgIGZwdXRzX21heWJlX2ZpbHRlcmVkIChsaW5lYnVmZmVyLCBzdHJlYW0sIGZpbHRlcik7CisgIGRvX2NsZWFudXBzIChvbGRfY2xlYW51cHMpOworfQorCisKK3ZvaWQKK3ZmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sIGZvcm1hdCwgYXJncykKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgY29uc3QgY2hhciAqZm9ybWF0OworICAgICB2YV9saXN0IGFyZ3M7Cit7CisgIHZmcHJpbnRmX21heWJlX2ZpbHRlcmVkIChzdHJlYW0sIGZvcm1hdCwgYXJncywgMSk7Cit9CisKK3ZvaWQKK3ZmcHJpbnRmX3VuZmlsdGVyZWQgKHN0cmVhbSwgZm9ybWF0LCBhcmdzKQorICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBjb25zdCBjaGFyICpmb3JtYXQ7CisgICAgIHZhX2xpc3QgYXJnczsKK3sKKyAgY2hhciAqbGluZWJ1ZmZlcjsKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jbGVhbnVwczsKKworICB2YXNwcmludGYgKCZsaW5lYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOworICBpZiAobGluZWJ1ZmZlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwdXRzX3VuZmlsdGVyZWQgKCJcbmdkYjogdmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkLlxuIiwgZ2RiX3N0ZGVycik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIG9sZF9jbGVhbnVwcyA9IG1ha2VfY2xlYW51cCAoZnJlZSwgbGluZWJ1ZmZlcik7CisgIGZwdXRzX3VuZmlsdGVyZWQgKGxpbmVidWZmZXIsIHN0cmVhbSk7CisgIGRvX2NsZWFudXBzIChvbGRfY2xlYW51cHMpOworfQorCit2b2lkCit2cHJpbnRmX2ZpbHRlcmVkIChmb3JtYXQsIGFyZ3MpCisgICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKKyAgICAgdmFfbGlzdCBhcmdzOworeworICB2ZnByaW50Zl9tYXliZV9maWx0ZXJlZCAoZ2RiX3N0ZG91dCwgZm9ybWF0LCBhcmdzLCAxKTsKK30KKwordm9pZAordnByaW50Zl91bmZpbHRlcmVkIChmb3JtYXQsIGFyZ3MpCisgICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKKyAgICAgdmFfbGlzdCBhcmdzOworeworICB2ZnByaW50Zl91bmZpbHRlcmVkIChnZGJfc3Rkb3V0LCBmb3JtYXQsIGFyZ3MpOworfQorCisvKiBWQVJBUkdTICovCit2b2lkCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCitmcHJpbnRmX2ZpbHRlcmVkIChHREJfRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKyNlbHNlCitmcHJpbnRmX2ZpbHRlcmVkICh2YV9hbGlzdCkKKyAgICAgdmFfZGNsCisjZW5kaWYKK3sKKyAgdmFfbGlzdCBhcmdzOworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyNlbHNlCisgIEdEQl9GSUxFICpzdHJlYW07CisgIGNoYXIgKmZvcm1hdDsKKworICB2YV9zdGFydCAoYXJncyk7CisgIHN0cmVhbSA9IHZhX2FyZyAoYXJncywgR0RCX0ZJTEUgKik7CisgIGZvcm1hdCA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKKyNlbmRpZgorICB2ZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworfQorCisvKiBWQVJBUkdTICovCit2b2lkCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCitmcHJpbnRmX3VuZmlsdGVyZWQgKEdEQl9GSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorI2Vsc2UKK2ZwcmludGZfdW5maWx0ZXJlZCAodmFfYWxpc3QpCisgICAgIHZhX2RjbAorI2VuZGlmCit7CisgIHZhX2xpc3QgYXJnczsKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisjZWxzZQorICBHREJfRklMRSAqc3RyZWFtOworICBjaGFyICpmb3JtYXQ7CisKKyAgdmFfc3RhcnQgKGFyZ3MpOworICBzdHJlYW0gPSB2YV9hcmcgKGFyZ3MsIEdEQl9GSUxFICopOworICBmb3JtYXQgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7CisjZW5kaWYKKyAgdmZwcmludGZfdW5maWx0ZXJlZCAoc3RyZWFtLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworfQorCisvKiBMaWtlIGZwcmludGZfZmlsdGVyZWQsIGJ1dCBwcmludHMgaXRzIHJlc3VsdCBpbmRlbnRlZC4KKyAgIENhbGxlZCBhcyBmcHJpbnRmaV9maWx0ZXJlZCAoc3BhY2VzLCBzdHJlYW0sIGZvcm1hdCwgLi4uKTsgICovCisKKy8qIFZBUkFSR1MgKi8KK3ZvaWQKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKK2ZwcmludGZpX2ZpbHRlcmVkIChpbnQgc3BhY2VzLCBHREJfRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKyNlbHNlCitmcHJpbnRmaV9maWx0ZXJlZCAodmFfYWxpc3QpCisgICAgIHZhX2RjbAorI2VuZGlmCit7CisgIHZhX2xpc3QgYXJnczsKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisjZWxzZQorICBpbnQgc3BhY2VzOworICBHREJfRklMRSAqc3RyZWFtOworICBjaGFyICpmb3JtYXQ7CisKKyAgdmFfc3RhcnQgKGFyZ3MpOworICBzcGFjZXMgPSB2YV9hcmcgKGFyZ3MsIGludCk7CisgIHN0cmVhbSA9IHZhX2FyZyAoYXJncywgR0RCX0ZJTEUgKik7CisgIGZvcm1hdCA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKKyNlbmRpZgorICBwcmludF9zcGFjZXNfZmlsdGVyZWQgKHNwYWNlcywgc3RyZWFtKTsKKworICB2ZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworfQorCisKKy8qIFZBUkFSR1MgKi8KK3ZvaWQKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKK3ByaW50Zl9maWx0ZXJlZCAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisjZWxzZQorcHJpbnRmX2ZpbHRlcmVkICh2YV9hbGlzdCkKKyAgICAgdmFfZGNsCisjZW5kaWYKK3sKKyAgdmFfbGlzdCBhcmdzOworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyNlbHNlCisgIGNoYXIgKmZvcm1hdDsKKworICB2YV9zdGFydCAoYXJncyk7CisgIGZvcm1hdCA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKKyNlbmRpZgorICB2ZnByaW50Zl9maWx0ZXJlZCAoZ2RiX3N0ZG91dCwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKK30KKworCisvKiBWQVJBUkdTICovCit2b2lkCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCitwcmludGZfdW5maWx0ZXJlZCAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisjZWxzZQorcHJpbnRmX3VuZmlsdGVyZWQgKHZhX2FsaXN0KQorICAgICB2YV9kY2wKKyNlbmRpZgoreworICB2YV9saXN0IGFyZ3M7CisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworI2Vsc2UKKyAgY2hhciAqZm9ybWF0OworCisgIHZhX3N0YXJ0IChhcmdzKTsKKyAgZm9ybWF0ID0gdmFfYXJnIChhcmdzLCBjaGFyICopOworI2VuZGlmCisgIHZmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRvdXQsIGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7Cit9CisKKy8qIExpa2UgcHJpbnRmX2ZpbHRlcmVkLCBidXQgcHJpbnRzIGl0J3MgcmVzdWx0IGluZGVudGVkLgorICAgQ2FsbGVkIGFzIHByaW50ZmlfZmlsdGVyZWQgKHNwYWNlcywgZm9ybWF0LCAuLi4pOyAgKi8KKworLyogVkFSQVJHUyAqLwordm9pZAorI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworcHJpbnRmaV9maWx0ZXJlZCAoaW50IHNwYWNlcywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisjZWxzZQorcHJpbnRmaV9maWx0ZXJlZCAodmFfYWxpc3QpCisgICAgIHZhX2RjbAorI2VuZGlmCit7CisgIHZhX2xpc3QgYXJnczsKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisjZWxzZQorICBpbnQgc3BhY2VzOworICBjaGFyICpmb3JtYXQ7CisKKyAgdmFfc3RhcnQgKGFyZ3MpOworICBzcGFjZXMgPSB2YV9hcmcgKGFyZ3MsIGludCk7CisgIGZvcm1hdCA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKKyNlbmRpZgorICBwcmludF9zcGFjZXNfZmlsdGVyZWQgKHNwYWNlcywgZ2RiX3N0ZG91dCk7CisgIHZmcHJpbnRmX2ZpbHRlcmVkIChnZGJfc3Rkb3V0LCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworfQorCisvKiBFYXN5IC0tIGJ1dCB3YXRjaCBvdXQhCisKKyAgIFRoaXMgcm91dGluZSBpcyAqbm90KiBhIHJlcGxhY2VtZW50IGZvciBwdXRzKCkhICBwdXRzKCkgYXBwZW5kcyBhIG5ld2xpbmUuCisgICBUaGlzIG9uZSBkb2Vzbid0LCBhbmQgaGFkIGJldHRlciBub3QhICAqLworCit2b2lkCitwdXRzX2ZpbHRlcmVkIChzdHJpbmcpCisgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKK3sKKyAgZnB1dHNfZmlsdGVyZWQgKHN0cmluZywgZ2RiX3N0ZG91dCk7Cit9CisKK3ZvaWQKK3B1dHNfdW5maWx0ZXJlZCAoc3RyaW5nKQorICAgICBjb25zdCBjaGFyICpzdHJpbmc7Cit7CisgIGZwdXRzX3VuZmlsdGVyZWQgKHN0cmluZywgZ2RiX3N0ZG91dCk7Cit9CisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gTiBzcGFjZXMgYW5kIGEgbnVsbC4gIFRoZSBwb2ludGVyIGlzIGdvb2QKKyAgIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gaGVyZS4gICovCitjaGFyICoKK25fc3BhY2VzIChuKQorICAgICBpbnQgbjsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqdDsKKyAgc3RhdGljIGNoYXIgKnNwYWNlczsKKyAgc3RhdGljIGludCBtYXhfc3BhY2VzOworCisgIGlmIChuID4gbWF4X3NwYWNlcykKKyAgICB7CisgICAgICBpZiAoc3BhY2VzKQorCWZyZWUgKHNwYWNlcyk7CisgICAgICBzcGFjZXMgPSAoY2hhciAqKSB4bWFsbG9jIChuKzEpOworICAgICAgZm9yICh0ID0gc3BhY2VzK247IHQgIT0gc3BhY2VzOykKKwkqLS10ID0gJyAnOworICAgICAgc3BhY2VzW25dID0gJ1wwJzsKKyAgICAgIG1heF9zcGFjZXMgPSBuOworICAgIH0KKworICByZXR1cm4gc3BhY2VzICsgbWF4X3NwYWNlcyAtIG47Cit9CisKKy8qIFByaW50IE4gc3BhY2VzLiAgKi8KK3ZvaWQKK3ByaW50X3NwYWNlc19maWx0ZXJlZCAobiwgc3RyZWFtKQorICAgICBpbnQgbjsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgZnB1dHNfZmlsdGVyZWQgKG5fc3BhY2VzIChuKSwgc3RyZWFtKTsKK30KKwwKKy8qIEMrKyBkZW1hbmdsZXIgc3R1ZmYuICAqLworCisvKiBmcHJpbnRmX3N5bWJvbF9maWx0ZXJlZCBhdHRlbXB0cyB0byBkZW1hbmdsZSBOQU1FLCBhIHN5bWJvbCBpbiBsYW5ndWFnZQorICAgTEFORywgdXNpbmcgZGVtYW5nbGluZyBhcmdzIEFSR19NT0RFLCBhbmQgcHJpbnQgaXQgZmlsdGVyZWQgdG8gU1RSRUFNLgorICAgSWYgdGhlIG5hbWUgaXMgbm90IG1hbmdsZWQsIG9yIHRoZSBsYW5ndWFnZSBmb3IgdGhlIG5hbWUgaXMgdW5rbm93biwgb3IKKyAgIGRlbWFuZ2xpbmcgaXMgb2ZmLCB0aGUgbmFtZSBpcyBwcmludGVkIGluIGl0cyAicmF3IiBmb3JtLiAqLworCit2b2lkCitmcHJpbnRmX3N5bWJvbF9maWx0ZXJlZCAoc3RyZWFtLCBuYW1lLCBsYW5nLCBhcmdfbW9kZSkKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgZW51bSBsYW5ndWFnZSBsYW5nOworICAgICBpbnQgYXJnX21vZGU7Cit7CisgIGNoYXIgKmRlbWFuZ2xlZDsKKworICBpZiAobmFtZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIElmIHVzZXIgd2FudHMgdG8gc2VlIHJhdyBvdXRwdXQsIG5vIHByb2JsZW0uICAqLworICAgICAgaWYgKCFkZW1hbmdsZSkKKwl7CisJICBmcHV0c19maWx0ZXJlZCAobmFtZSwgc3RyZWFtKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3dpdGNoIChsYW5nKQorCSAgICB7CisJICAgIGNhc2UgbGFuZ3VhZ2VfY3BsdXM6CisJICAgICAgZGVtYW5nbGVkID0gY3BsdXNfZGVtYW5nbGUgKG5hbWUsIGFyZ19tb2RlKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBsYW5ndWFnZV9qYXZhOgorCSAgICAgIGRlbWFuZ2xlZCA9IGNwbHVzX2RlbWFuZ2xlIChuYW1lLCBhcmdfbW9kZSB8IERNR0xfSkFWQSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgbGFuZ3VhZ2VfY2hpbGw6CisJICAgICAgZGVtYW5nbGVkID0gY2hpbGxfZGVtYW5nbGUgKG5hbWUpOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGRlbWFuZ2xlZCA9IE5VTEw7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGZwdXRzX2ZpbHRlcmVkIChkZW1hbmdsZWQgPyBkZW1hbmdsZWQgOiBuYW1lLCBzdHJlYW0pOworCSAgaWYgKGRlbWFuZ2xlZCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgZnJlZSAoZGVtYW5nbGVkKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qIERvIGEgc3RyY21wKCkgdHlwZSBvcGVyYXRpb24gb24gU1RSSU5HMSBhbmQgU1RSSU5HMiwgaWdub3JpbmcgYW55CisgICBkaWZmZXJlbmNlcyBpbiB3aGl0ZXNwYWNlLiAgUmV0dXJucyAwIGlmIHRoZXkgbWF0Y2gsIG5vbi16ZXJvIGlmIHRoZXkKKyAgIGRvbid0IChzbGlnaHRseSBkaWZmZXJlbnQgdGhhbiBzdHJjbXAoKSdzIHJhbmdlIG9mIHJldHVybiB2YWx1ZXMpLgorICAgCisgICBBcyBhbiBleHRyYSBoYWNrLCBzdHJpbmcxPT0iRk9PKEFSR1MpIiBtYXRjaGVzIHN0cmluZzI9PSJGT08iLgorICAgVGhpcyAiZmVhdHVyZSIgaXMgdXNlZnVsIHdoZW4gc2VhcmNoaW5nIGZvciBtYXRjaGluZyBDKysgZnVuY3Rpb24gbmFtZXMKKyAgIChzdWNoIGFzIGlmIHRoZSB1c2VyIHR5cGVzICdicmVhayBGT08nLCB3aGVyZSBGT08gaXMgYSBtYW5nbGVkIEMrKworICAgZnVuY3Rpb24pLiAqLworCitpbnQKK3N0cmNtcF9pdyAoc3RyaW5nMSwgc3RyaW5nMikKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nMTsKKyAgICAgY29uc3QgY2hhciAqc3RyaW5nMjsKK3sKKyAgd2hpbGUgKCgqc3RyaW5nMSAhPSAnXDAnKSAmJiAoKnN0cmluZzIgIT0gJ1wwJykpCisgICAgeworICAgICAgd2hpbGUgKGlzc3BhY2UgKCpzdHJpbmcxKSkKKwl7CisJICBzdHJpbmcxKys7CisJfQorICAgICAgd2hpbGUgKGlzc3BhY2UgKCpzdHJpbmcyKSkKKwl7CisJICBzdHJpbmcyKys7CisJfQorICAgICAgaWYgKCpzdHJpbmcxICE9ICpzdHJpbmcyKQorCXsKKwkgIGJyZWFrOworCX0KKyAgICAgIGlmICgqc3RyaW5nMSAhPSAnXDAnKQorCXsKKwkgIHN0cmluZzErKzsKKwkgIHN0cmluZzIrKzsKKwl9CisgICAgfQorICByZXR1cm4gKCpzdHJpbmcxICE9ICdcMCcgJiYgKnN0cmluZzEgIT0gJygnKSB8fCAoKnN0cmluZzIgIT0gJ1wwJyk7Cit9CisKKwwKKy8qCisqKiBzdWJzZXRDb21wYXJlKCkKKyoqICAgIEFuc3dlciB3aGV0aGVyIHN0cmluZ1RvQ29tcGFyZSBpcyBhIGZ1bGwgb3IgcGFydGlhbCBtYXRjaCB0bworKiogICAgdGVtcGxhdGVTdHJpbmcuICBUaGUgcGFydGlhbCBtYXRjaCBtdXN0IGJlIGluIHNlcXVlbmNlIHN0YXJ0aW5nCisqKiAgICBhdCBpbmRleCAwLgorKi8KK2ludAorI2lmZGVmIF9TVERDX18KK3N1YnNldENvbXBhcmUoCisgICAgY2hhciAqc3RyaW5nVG9Db21wYXJlLAorICAgIGNoYXIgKnRlbXBsYXRlU3RyaW5nKQorI2Vsc2UKK3N1YnNldENvbXBhcmUoc3RyaW5nVG9Db21wYXJlLCB0ZW1wbGF0ZVN0cmluZykKKyAgICBjaGFyICpzdHJpbmdUb0NvbXBhcmU7CisgICAgY2hhciAqdGVtcGxhdGVTdHJpbmc7CisjZW5kaWYKK3sKKyAgICBpbnQgICAgbWF0Y2ggPSAwOworCisgICAgaWYgKHRlbXBsYXRlU3RyaW5nICE9IChjaGFyICopTlVMTCAmJiBzdHJpbmdUb0NvbXBhcmUgIT0gKGNoYXIgKilOVUxMICYmCisJc3RybGVuKHN0cmluZ1RvQ29tcGFyZSkgPD0gc3RybGVuKHRlbXBsYXRlU3RyaW5nKSkKKyAgICAgIG1hdGNoID0gKHN0cm5jbXAodGVtcGxhdGVTdHJpbmcsCisJCSAgICAgICBzdHJpbmdUb0NvbXBhcmUsCisJCSAgICAgICBzdHJsZW4oc3RyaW5nVG9Db21wYXJlKSkgPT0gMCk7CisKKyAgICByZXR1cm4gbWF0Y2g7Cit9IC8qIHN1YnNldENvbXBhcmUgKi8KKworCit2b2lkIHBhZ2luYXRpb25fb25fY29tbWFuZChhcmcsIGZyb21fdHR5KQorICBjaGFyICphcmc7CisgIGludCBmcm9tX3R0eTsKK3sKKyAgcGFnaW5hdGlvbl9lbmFibGVkID0gMTsKK30KKwordm9pZCBwYWdpbmF0aW9uX29mZl9jb21tYW5kKGFyZywgZnJvbV90dHkpCisgIGNoYXIgKmFyZzsKKyAgaW50IGZyb21fdHR5OworeworICBwYWdpbmF0aW9uX2VuYWJsZWQgPSAwOworfQorCisMCit2b2lkCitpbml0aWFsaXplX3V0aWxzICgpCit7CisgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjOworCisgIGMgPSBhZGRfc2V0X2NtZCAoIndpZHRoIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX3VpbnRlZ2VyLCAKKwkJICAoY2hhciAqKSZjaGFyc19wZXJfbGluZSwKKwkJICAiU2V0IG51bWJlciBvZiBjaGFyYWN0ZXJzIGdkYiB0aGlua3MgYXJlIGluIGEgbGluZS4iLAorCQkgICZzZXRsaXN0KTsKKyAgYWRkX3Nob3dfZnJvbV9zZXQgKGMsICZzaG93bGlzdCk7CisgIGMtPmZ1bmN0aW9uLnNmdW5jID0gc2V0X3dpZHRoX2NvbW1hbmQ7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQKKyAgICAoYWRkX3NldF9jbWQgKCJoZWlnaHQiLCBjbGFzc19zdXBwb3J0LAorCQkgIHZhcl91aW50ZWdlciwgKGNoYXIgKikmbGluZXNfcGVyX3BhZ2UsCisJCSAgIlNldCBudW1iZXIgb2YgbGluZXMgZ2RiIHRoaW5rcyBhcmUgaW4gYSBwYWdlLiIsICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKKyAgCisgIGluaXRfcGFnZV9pbmZvICgpOworCisgIC8qIElmIHRoZSBvdXRwdXQgaXMgbm90IGEgdGVybWluYWwsIGRvbid0IHBhZ2luYXRlIGl0LiAgKi8KKyAgaWYgKCFHREJfRklMRV9JU0FUVFkgKGdkYl9zdGRvdXQpKQorICAgIGxpbmVzX3Blcl9wYWdlID0gVUlOVF9NQVg7CisKKyAgc2V0X3dpZHRoX2NvbW1hbmQgKChjaGFyICopTlVMTCwgMCwgYyk7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQKKyAgICAoYWRkX3NldF9jbWQgKCJkZW1hbmdsZSIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLCAKKwkJICAoY2hhciAqKSZkZW1hbmdsZSwKKwkJIlNldCBkZW1hbmdsaW5nIG9mIGVuY29kZWQgQysrIG5hbWVzIHdoZW4gZGlzcGxheWluZyBzeW1ib2xzLiIsCisJCSAgJnNldHByaW50bGlzdCksCisgICAgICZzaG93cHJpbnRsaXN0KTsKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoInBhZ2luYXRpb24iLCBjbGFzc19zdXBwb3J0LAorCQkgIHZhcl9ib29sZWFuLCAoY2hhciAqKSZwYWdpbmF0aW9uX2VuYWJsZWQsCisJCSAgIlNldCBzdGF0ZSBvZiBwYWdpbmF0aW9uLiIsICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKKyAgaWYgKHhkYl9jb21tYW5kcykKKyAgICB7CisgICAgICBhZGRfY29tKCJhbSIsIGNsYXNzX3N1cHBvcnQsIHBhZ2luYXRpb25fb25fY29tbWFuZCwgCisgICAgICAgICAgICAgICJFbmFibGUgcGFnaW5hdGlvbiIpOworICAgICAgYWRkX2NvbSgic20iLCBjbGFzc19zdXBwb3J0LCBwYWdpbmF0aW9uX29mZl9jb21tYW5kLCAKKyAgICAgICAgICAgICAgIkRpc2FibGUgcGFnaW5hdGlvbiIpOworICAgIH0KKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoInNldmVuYml0LXN0cmluZ3MiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwgCisJCSAgKGNoYXIgKikmc2V2ZW5iaXRfc3RyaW5ncywKKyAgICJTZXQgcHJpbnRpbmcgb2YgOC1iaXQgY2hhcmFjdGVycyBpbiBzdHJpbmdzIGFzIFxcbm5uLiIsCisJCSAgJnNldHByaW50bGlzdCksCisgICAgICZzaG93cHJpbnRsaXN0KTsKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoImFzbS1kZW1hbmdsZSIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLCAKKwkJICAoY2hhciAqKSZhc21fZGVtYW5nbGUsCisJIlNldCBkZW1hbmdsaW5nIG9mIEMrKyBuYW1lcyBpbiBkaXNhc3NlbWJseSBsaXN0aW5ncy4iLAorCQkgICZzZXRwcmludGxpc3QpLAorICAgICAmc2hvd3ByaW50bGlzdCk7Cit9CisKKy8qIE1hY2hpbmUgc3BlY2lmaWMgZnVuY3Rpb24gdG8gaGFuZGxlIFNJR1dJTkNIIHNpZ25hbC4gKi8KKworI2lmZGVmICBTSUdXSU5DSF9IQU5ETEVSX0JPRFkKKyAgICAgICAgU0lHV0lOQ0hfSEFORExFUl9CT0RZCisjZW5kaWYKKwwKKy8qIFN1cHBvcnQgZm9yIGNvbnZlcnRpbmcgdGFyZ2V0IGZwIG51bWJlcnMgaW50byBob3N0IERPVUJMRVNUIGZvcm1hdC4gICovCisKKy8qIFhYWCAtIFRoaXMgY29kZSBzaG91bGQgcmVhbGx5IGJlIGluIGxpYmliZXJ0eS9mbG9hdGZvcm1hdC5jLCBob3dldmVyCisgICBjb25maWd1cmF0aW9uIGlzc3VlcyB3aXRoIGxpYmliZXJ0eSBtYWRlIHRoaXMgdmVyeSBkaWZmaWN1bHQgdG8gZG8gaW4gdGhlCisgICBhdmFpbGFibGUgdGltZS4gICovCisKKyNpbmNsdWRlICJmbG9hdGZvcm1hdC5oIgorI2luY2x1ZGUgPG1hdGguaD4JCS8qIGxkZXhwICovCisKKy8qIFRoZSBvZGRzIHRoYXQgQ0hBUl9CSVQgd2lsbCBiZSBhbnl0aGluZyBidXQgOCBhcmUgbG93IGVub3VnaCB0aGF0IEknbSBub3QKKyAgIGdvaW5nIHRvIGJvdGhlciB3aXRoIHRyeWluZyB0byBtdWNrIGFyb3VuZCB3aXRoIHdoZXRoZXIgaXQgaXMgZGVmaW5lZCBpbgorICAgYSBzeXN0ZW0gaGVhZGVyLCB3aGF0IHdlIGRvIGlmIG5vdCwgZXRjLiAgKi8KKyNkZWZpbmUgRkxPQVRGT1JNQVRfQ0hBUl9CSVQgOAorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfZmllbGQgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLAorCQkJCQllbnVtIGZsb2F0Zm9ybWF0X2J5dGVvcmRlcnMsCisJCQkJCXVuc2lnbmVkIGludCwKKwkJCQkJdW5zaWduZWQgaW50LAorCQkJCQl1bnNpZ25lZCBpbnQpKTsKKworLyogRXh0cmFjdCBhIGZpZWxkIHdoaWNoIHN0YXJ0cyBhdCBTVEFSVCBhbmQgaXMgTEVOIGJ5dGVzIGxvbmcuICBEQVRBIGFuZAorICAgVE9UQUxfTEVOIGFyZSB0aGUgdGhpbmcgd2UgYXJlIGV4dHJhY3RpbmcgaXQgZnJvbSwgaW4gYnl0ZW9yZGVyIE9SREVSLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nCitnZXRfZmllbGQgKGRhdGEsIG9yZGVyLCB0b3RhbF9sZW4sIHN0YXJ0LCBsZW4pCisgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgIGVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyBvcmRlcjsKKyAgICAgdW5zaWduZWQgaW50IHRvdGFsX2xlbjsKKyAgICAgdW5zaWduZWQgaW50IHN0YXJ0OworICAgICB1bnNpZ25lZCBpbnQgbGVuOworeworICB1bnNpZ25lZCBsb25nIHJlc3VsdDsKKyAgdW5zaWduZWQgaW50IGN1cl9ieXRlOworICBpbnQgY3VyX2JpdHNoaWZ0OworCisgIC8qIFN0YXJ0IGF0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSBmaWVsZC4gICovCisgIGN1cl9ieXRlID0gKHN0YXJ0ICsgbGVuKSAvIEZMT0FURk9STUFUX0NIQVJfQklUOworICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlIHx8IG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZWJ5dGVfYmlnd29yZCkKKyAgICBjdXJfYnl0ZSA9ICh0b3RhbF9sZW4gLyBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSBjdXJfYnl0ZSAtIDE7CisgIGN1cl9iaXRzaGlmdCA9CisgICAgKChzdGFydCArIGxlbikgJSBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKKyAgcmVzdWx0ID0gKihkYXRhICsgY3VyX2J5dGUpID4+ICgtY3VyX2JpdHNoaWZ0KTsKKyAgY3VyX2JpdHNoaWZ0ICs9IEZMT0FURk9STUFUX0NIQVJfQklUOworICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlIHx8IG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZWJ5dGVfYmlnd29yZCkKKyAgICArK2N1cl9ieXRlOworICBlbHNlCisgICAgLS1jdXJfYnl0ZTsKKworICAvKiBNb3ZlIHRvd2FyZHMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgcGFydCBvZiB0aGUgZmllbGQuICAqLworICB3aGlsZSAoY3VyX2JpdHNoaWZ0IDwgbGVuKQorICAgIHsKKyAgICAgIGlmIChsZW4gLSBjdXJfYml0c2hpZnQgPCBGTE9BVEZPUk1BVF9DSEFSX0JJVCkKKwkvKiBUaGlzIGlzIHRoZSBsYXN0IGJ5dGU7IHplcm8gb3V0IHRoZSBiaXRzIHdoaWNoIGFyZSBub3QgcGFydCBvZgorCSAgIHRoaXMgZmllbGQuICAqLworCXJlc3VsdCB8PQorCSAgKCooZGF0YSArIGN1cl9ieXRlKSAmICgoMSA8PCAobGVuIC0gY3VyX2JpdHNoaWZ0KSkgLSAxKSkKKwkgICAgPDwgY3VyX2JpdHNoaWZ0OworICAgICAgZWxzZQorCXJlc3VsdCB8PSAqKGRhdGEgKyBjdXJfYnl0ZSkgPDwgY3VyX2JpdHNoaWZ0OworICAgICAgY3VyX2JpdHNoaWZ0ICs9IEZMT0FURk9STUFUX0NIQVJfQklUOworICAgICAgaWYgKG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZSB8fCBvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGVieXRlX2JpZ3dvcmQpCisJKytjdXJfYnl0ZTsKKyAgICAgIGVsc2UKKwktLWN1cl9ieXRlOworICAgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKyAgCisvKiBDb252ZXJ0IGZyb20gRk1UIHRvIGEgRE9VQkxFU1QuCisgICBGUk9NIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBleHRlbmRlZCBmbG9hdC4KKyAgIFN0b3JlIHRoZSBET1VCTEVTVCBpbiAqVE8uICAqLworCit2b2lkCitmbG9hdGZvcm1hdF90b19kb3VibGVzdCAoZm10LCBmcm9tLCB0bykKKyAgICAgY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICpmbXQ7CisgICAgIGNoYXIgKmZyb207CisgICAgIERPVUJMRVNUICp0bzsKK3sKKyAgdW5zaWduZWQgY2hhciAqdWZyb20gPSAodW5zaWduZWQgY2hhciAqKWZyb207CisgIERPVUJMRVNUIGR0bzsKKyAgbG9uZyBleHBvbmVudDsKKyAgdW5zaWduZWQgbG9uZyBtYW50OworICB1bnNpZ25lZCBpbnQgbWFudF9iaXRzLCBtYW50X29mZjsKKyAgaW50IG1hbnRfYml0c19sZWZ0OworICBpbnQgc3BlY2lhbF9leHBvbmVudDsJCS8qIEl0J3MgYSBOYU4sIGRlbm9ybSBvciB6ZXJvICovCisKKyAgLyogSWYgdGhlIG1hbnRpc3NhIGJpdHMgYXJlIG5vdCBjb250aWd1b3VzIGZyb20gb25lIGVuZCBvZiB0aGUKKyAgICAgbWFudGlzc2EgdG8gdGhlIG90aGVyLCB3ZSBuZWVkIHRvIG1ha2UgYSBwcml2YXRlIGNvcHkgb2YgdGhlCisgICAgIHNvdXJjZSBieXRlcyB0aGF0IGlzIGluIHRoZSByaWdodCBvcmRlciBzaW5jZSB0aGUgdW5wYWNraW5nCisgICAgIGFsZ29yaXRobSBhc3N1bWVzIHRoYXQgdGhlIGJpdHMgYXJlIGNvbnRpZ3VvdXMuCisKKyAgICAgU3dhcCB0aGUgYnl0ZXMgaW5kaXZpZHVhbGx5IHJhdGhlciB0aGFuIGFjY2Vzc2luZyB0aGVtIHRocm91Z2gKKyAgICAgImxvbmcgKiIgc2luY2Ugd2UgaGF2ZSBubyBndWFyYW50ZWUgdGhhdCB0aGV5IHN0YXJ0IG9uIGEgbG9uZworICAgICBhbGlnbm1lbnQsIGFuZCBhbHNvIHNpemVvZihsb25nKSBmb3IgdGhlIGhvc3QgY291bGQgYmUgZGlmZmVyZW50CisgICAgIHRoYW4gc2l6ZW9mKGxvbmcpIGZvciB0aGUgdGFyZ2V0LiAgRklYTUU6IEFzc3VtZXMgc2l6ZW9mKGxvbmcpCisgICAgIGZvciB0aGUgdGFyZ2V0IGlzIDQuICovCisKKyAgaWYgKGZtdCAtPiBieXRlb3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlYnl0ZV9iaWd3b3JkKQorICAgIHsKKyAgICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyICpuZXdmcm9tOworICAgICAgdW5zaWduZWQgY2hhciAqc3dhcGluLCAqc3dhcG91dDsKKyAgICAgIGludCBsb25nc3dhcHM7CisKKyAgICAgIGxvbmdzd2FwcyA9IGZtdCAtPiB0b3RhbHNpemUgLyBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKKyAgICAgIGxvbmdzd2FwcyA+Pj0gMzsKKyAgICAgIAorICAgICAgaWYgKG5ld2Zyb20gPT0gTlVMTCkKKwl7CisJICBuZXdmcm9tID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoZm10IC0+IHRvdGFsc2l6ZSk7CisJfQorICAgICAgc3dhcG91dCA9IG5ld2Zyb207CisgICAgICBzd2FwaW4gPSB1ZnJvbTsKKyAgICAgIHVmcm9tID0gbmV3ZnJvbTsKKyAgICAgIHdoaWxlIChsb25nc3dhcHMtLSA+IDApCisJeworCSAgLyogVGhpcyBpcyB1Z2x5LCBidXQgZWZmaWNpZW50ICovCisJICAqc3dhcG91dCsrID0gc3dhcGluWzRdOworCSAgKnN3YXBvdXQrKyA9IHN3YXBpbls1XTsKKwkgICpzd2Fwb3V0KysgPSBzd2FwaW5bNl07CisJICAqc3dhcG91dCsrID0gc3dhcGluWzddOworCSAgKnN3YXBvdXQrKyA9IHN3YXBpblswXTsKKwkgICpzd2Fwb3V0KysgPSBzd2FwaW5bMV07CisJICAqc3dhcG91dCsrID0gc3dhcGluWzJdOworCSAgKnN3YXBvdXQrKyA9IHN3YXBpblszXTsKKwkgIHN3YXBpbiArPSA4OworCX0KKyAgICB9CisKKyAgZXhwb25lbnQgPSBnZXRfZmllbGQgKHVmcm9tLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsCisJCQlmbXQtPmV4cF9zdGFydCwgZm10LT5leHBfbGVuKTsKKyAgLyogTm90ZSB0aGF0IGlmIGV4cG9uZW50IGluZGljYXRlcyBhIE5hTiwgd2UgY2FuJ3QgcmVhbGx5IGRvIGFueXRoaW5nIHVzZWZ1bAorICAgICAobm90IGtub3dpbmcgaWYgdGhlIGhvc3QgaGFzIE5hTidzLCBvciBob3cgdG8gYnVpbGQgb25lKS4gIFNvIGl0IHdpbGwKKyAgICAgZW5kIHVwIGFzIGFuIGluZmluaXR5IG9yIHNvbWV0aGluZyBjbG9zZTsgdGhhdCBpcyBPSy4gICovCisKKyAgbWFudF9iaXRzX2xlZnQgPSBmbXQtPm1hbl9sZW47CisgIG1hbnRfb2ZmID0gZm10LT5tYW5fc3RhcnQ7CisgIGR0byA9IDAuMDsKKworICBzcGVjaWFsX2V4cG9uZW50ID0gZXhwb25lbnQgPT0gMCB8fCBleHBvbmVudCA9PSBmbXQtPmV4cF9uYW47CisKKy8qIERvbid0IGJpYXMgemVybydzLCBkZW5vcm1zIG9yIE5hTnMuICAqLworICBpZiAoIXNwZWNpYWxfZXhwb25lbnQpCisgICAgZXhwb25lbnQgLT0gZm10LT5leHBfYmlhczsKKworICAvKiBCdWlsZCB0aGUgcmVzdWx0IGFsZ2VicmFpY2FsbHkuICBNaWdodCBnbyBpbmZpbml0ZSwgdW5kZXJmbG93LCBldGM7CisgICAgIHdobyBjYXJlcy4gKi8KKworLyogSWYgdGhpcyBmb3JtYXQgdXNlcyBhIGhpZGRlbiBiaXQsIGV4cGxpY2l0bHkgYWRkIGl0IGluIG5vdy4gIE90aGVyd2lzZSwKKyAgIGluY3JlbWVudCB0aGUgZXhwb25lbnQgYnkgb25lIHRvIGFjY291bnQgZm9yIHRoZSBpbnRlZ2VyIGJpdC4gICovCisKKyAgaWYgKCFzcGVjaWFsX2V4cG9uZW50KQorICAgIGlmIChmbXQtPmludGJpdCA9PSBmbG9hdGZvcm1hdF9pbnRiaXRfbm8pCisgICAgICBkdG8gPSBsZGV4cCAoMS4wLCBleHBvbmVudCk7CisgICAgZWxzZQorICAgICAgZXhwb25lbnQrKzsKKworICB3aGlsZSAobWFudF9iaXRzX2xlZnQgPiAwKQorICAgIHsKKyAgICAgIG1hbnRfYml0cyA9IG1pbiAobWFudF9iaXRzX2xlZnQsIDMyKTsKKworICAgICAgbWFudCA9IGdldF9maWVsZCAodWZyb20sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwKKwkJCSBtYW50X29mZiwgbWFudF9iaXRzKTsKKworICAgICAgZHRvICs9IGxkZXhwICgoZG91YmxlKW1hbnQsIGV4cG9uZW50IC0gbWFudF9iaXRzKTsKKyAgICAgIGV4cG9uZW50IC09IG1hbnRfYml0czsKKyAgICAgIG1hbnRfb2ZmICs9IG1hbnRfYml0czsKKyAgICAgIG1hbnRfYml0c19sZWZ0IC09IG1hbnRfYml0czsKKyAgICB9CisKKyAgLyogTmVnYXRlIGl0IGlmIG5lZ2F0aXZlLiAgKi8KKyAgaWYgKGdldF9maWVsZCAodWZyb20sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwgZm10LT5zaWduX3N0YXJ0LCAxKSkKKyAgICBkdG8gPSAtZHRvOworICAqdG8gPSBkdG87Cit9CisMCitzdGF0aWMgdm9pZCBwdXRfZmllbGQgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBlbnVtIGZsb2F0Zm9ybWF0X2J5dGVvcmRlcnMsCisJCQkgICAgICAgdW5zaWduZWQgaW50LAorCQkJICAgICAgIHVuc2lnbmVkIGludCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZykpOworCisvKiBTZXQgYSBmaWVsZCB3aGljaCBzdGFydHMgYXQgU1RBUlQgYW5kIGlzIExFTiBieXRlcyBsb25nLiAgREFUQSBhbmQKKyAgIFRPVEFMX0xFTiBhcmUgdGhlIHRoaW5nIHdlIGFyZSBleHRyYWN0aW5nIGl0IGZyb20sIGluIGJ5dGVvcmRlciBPUkRFUi4gICovCitzdGF0aWMgdm9pZAorcHV0X2ZpZWxkIChkYXRhLCBvcmRlciwgdG90YWxfbGVuLCBzdGFydCwgbGVuLCBzdHVmZl90b19wdXQpCisgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgIGVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyBvcmRlcjsKKyAgICAgdW5zaWduZWQgaW50IHRvdGFsX2xlbjsKKyAgICAgdW5zaWduZWQgaW50IHN0YXJ0OworICAgICB1bnNpZ25lZCBpbnQgbGVuOworICAgICB1bnNpZ25lZCBsb25nIHN0dWZmX3RvX3B1dDsKK3sKKyAgdW5zaWduZWQgaW50IGN1cl9ieXRlOworICBpbnQgY3VyX2JpdHNoaWZ0OworCisgIC8qIFN0YXJ0IGF0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSBmaWVsZC4gICovCisgIGN1cl9ieXRlID0gKHN0YXJ0ICsgbGVuKSAvIEZMT0FURk9STUFUX0NIQVJfQklUOworICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlIHx8IG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZWJ5dGVfYmlnd29yZCkKKyAgICBjdXJfYnl0ZSA9ICh0b3RhbF9sZW4gLyBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSBjdXJfYnl0ZSAtIDE7CisgIGN1cl9iaXRzaGlmdCA9CisgICAgKChzdGFydCArIGxlbikgJSBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKKyAgKihkYXRhICsgY3VyX2J5dGUpICY9CisgICAgfigoKDEgPDwgKChzdGFydCArIGxlbikgJSBGTE9BVEZPUk1BVF9DSEFSX0JJVCkpIC0gMSkgPDwgKC1jdXJfYml0c2hpZnQpKTsKKyAgKihkYXRhICsgY3VyX2J5dGUpIHw9CisgICAgKHN0dWZmX3RvX3B1dCAmICgoMSA8PCBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSAxKSkgPDwgKC1jdXJfYml0c2hpZnQpOworICBjdXJfYml0c2hpZnQgKz0gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7CisgIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUgfHwgb3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlYnl0ZV9iaWd3b3JkKQorICAgICsrY3VyX2J5dGU7CisgIGVsc2UKKyAgICAtLWN1cl9ieXRlOworCisgIC8qIE1vdmUgdG93YXJkcyB0aGUgbW9zdCBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSBmaWVsZC4gICovCisgIHdoaWxlIChjdXJfYml0c2hpZnQgPCBsZW4pCisgICAgeworICAgICAgaWYgKGxlbiAtIGN1cl9iaXRzaGlmdCA8IEZMT0FURk9STUFUX0NIQVJfQklUKQorCXsKKwkgIC8qIFRoaXMgaXMgdGhlIGxhc3QgYnl0ZS4gICovCisJICAqKGRhdGEgKyBjdXJfYnl0ZSkgJj0KKwkgICAgfigoMSA8PCAobGVuIC0gY3VyX2JpdHNoaWZ0KSkgLSAxKTsKKwkgICooZGF0YSArIGN1cl9ieXRlKSB8PSAoc3R1ZmZfdG9fcHV0ID4+IGN1cl9iaXRzaGlmdCk7CisJfQorICAgICAgZWxzZQorCSooZGF0YSArIGN1cl9ieXRlKSA9ICgoc3R1ZmZfdG9fcHV0ID4+IGN1cl9iaXRzaGlmdCkKKwkJCSAgICAgICYgKCgxIDw8IEZMT0FURk9STUFUX0NIQVJfQklUKSAtIDEpKTsKKyAgICAgIGN1cl9iaXRzaGlmdCArPSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKKyAgICAgIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUgfHwgb3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlYnl0ZV9iaWd3b3JkKQorCSsrY3VyX2J5dGU7CisgICAgICBlbHNlCisJLS1jdXJfYnl0ZTsKKyAgICB9Cit9CisKKyNpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCisvKiBSZXR1cm4gdGhlIGZyYWN0aW9uYWwgcGFydCBvZiBWQUxVRSwgYW5kIHB1dCB0aGUgZXhwb25lbnQgb2YgVkFMVUUgaW4gKkVQVFIuCisgICBUaGUgcmFuZ2Ugb2YgdGhlIHJldHVybmVkIHZhbHVlIGlzID49IDAuNSBhbmQgPCAxLjAuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgIGZyZXhwLCBidXQgb3BlcmF0ZXMgb24gdGhlIGxvbmcgZG91YmxlIGRhdGEgdHlwZS4gICovCisKK3N0YXRpYyBsb25nIGRvdWJsZSBsZGZyZXhwIFBBUkFNUyAoKGxvbmcgZG91YmxlIHZhbHVlLCBpbnQgKmVwdHIpKTsKKworc3RhdGljIGxvbmcgZG91YmxlCitsZGZyZXhwICh2YWx1ZSwgZXB0cikKKyAgICAgbG9uZyBkb3VibGUgdmFsdWU7CisgICAgIGludCAqZXB0cjsKK3sKKyAgbG9uZyBkb3VibGUgdG1wOworICBpbnQgZXhwOworCisgIC8qIFVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSBubyBwb3J0YWJsZSBmdW5jdGlvbnMgZm9yIGV4dHJhY3RpbmcgdGhlIGV4cG9uZW50CisgICAgIG9mIGEgbG9uZyBkb3VibGUsIHNvIHdlIGhhdmUgdG8gZG8gaXQgaXRlcmF0aXZlbHkgYnkgbXVsdGlwbHlpbmcgb3IgZGl2aWRpbmcKKyAgICAgYnkgdHdvIHVudGlsIHRoZSBmcmFjdGlvbiBpcyBiZXR3ZWVuIDAuNSBhbmQgMS4wLiAgKi8KKworICBpZiAodmFsdWUgPCAwLjBsKQorICAgIHZhbHVlID0gLXZhbHVlOworCisgIHRtcCA9IDEuMGw7CisgIGV4cCA9IDA7CisKKyAgaWYgKHZhbHVlID49IHRtcCkJCS8qIFZhbHVlID49IDEuMCAqLworICAgIHdoaWxlICh2YWx1ZSA+PSB0bXApCisgICAgICB7CisJdG1wICo9IDIuMGw7CisJZXhwKys7CisgICAgICB9CisgIGVsc2UgaWYgKHZhbHVlICE9IDAuMGwpCS8qIFZhbHVlIDwgMS4wICBhbmQgPiAwLjAgKi8KKyAgICB7CisgICAgICB3aGlsZSAodmFsdWUgPCB0bXApCisJeworCSAgdG1wIC89IDIuMGw7CisJICBleHAtLTsKKwl9CisgICAgICB0bXAgKj0gMi4wbDsKKyAgICAgIGV4cCsrOworICAgIH0KKworICAqZXB0ciA9IGV4cDsKKyAgcmV0dXJuIHZhbHVlL3RtcDsKK30KKyNlbmRpZiAvKiBIQVZFX0xPTkdfRE9VQkxFICovCisKKworLyogVGhlIGNvbnZlcnNlOiBjb252ZXJ0IHRoZSBET1VCTEVTVCAqRlJPTSB0byBhbiBleHRlbmRlZCBmbG9hdAorICAgYW5kIHN0b3JlIHdoZXJlIFRPIHBvaW50cy4gIE5laXRoZXIgRlJPTSBub3IgVE8gaGF2ZSBhbnkgYWxpZ25tZW50CisgICByZXN0cmljdGlvbnMuICAqLworCit2b2lkCitmbG9hdGZvcm1hdF9mcm9tX2RvdWJsZXN0IChmbXQsIGZyb20sIHRvKQorICAgICBDT05TVCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKmZtdDsKKyAgICAgRE9VQkxFU1QgKmZyb207CisgICAgIGNoYXIgKnRvOworeworICBET1VCTEVTVCBkZnJvbTsKKyAgaW50IGV4cG9uZW50OworICBET1VCTEVTVCBtYW50OworICB1bnNpZ25lZCBpbnQgbWFudF9iaXRzLCBtYW50X29mZjsKKyAgaW50IG1hbnRfYml0c19sZWZ0OworICB1bnNpZ25lZCBjaGFyICp1dG8gPSAodW5zaWduZWQgY2hhciAqKXRvOworCisgIG1lbWNweSAoJmRmcm9tLCBmcm9tLCBzaXplb2YgKGRmcm9tKSk7CisgIG1lbXNldCAodXRvLCAwLCBmbXQtPnRvdGFsc2l6ZSAvIEZMT0FURk9STUFUX0NIQVJfQklUKTsKKyAgaWYgKGRmcm9tID09IDApCisgICAgcmV0dXJuOwkJCS8qIFJlc3VsdCBpcyB6ZXJvICovCisgIGlmIChkZnJvbSAhPSBkZnJvbSkJCS8qIFJlc3VsdCBpcyBOYU4gKi8KKyAgICB7CisgICAgICAvKiBGcm9tIGlzIE5hTiAqLworICAgICAgcHV0X2ZpZWxkICh1dG8sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwgZm10LT5leHBfc3RhcnQsCisJCSBmbXQtPmV4cF9sZW4sIGZtdC0+ZXhwX25hbik7CisgICAgICAvKiBCZSBzdXJlIGl0J3Mgbm90IGluZmluaXR5LCBidXQgTmFOIHZhbHVlIGlzIGlycmVsICovCisgICAgICBwdXRfZmllbGQgKHV0bywgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLCBmbXQtPm1hbl9zdGFydCwKKwkJIDMyLCAxKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogSWYgbmVnYXRpdmUsIHNldCB0aGUgc2lnbiBiaXQuICAqLworICBpZiAoZGZyb20gPCAwKQorICAgIHsKKyAgICAgIHB1dF9maWVsZCAodXRvLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsIGZtdC0+c2lnbl9zdGFydCwgMSwgMSk7CisgICAgICBkZnJvbSA9IC1kZnJvbTsKKyAgICB9CisKKyAgaWYgKGRmcm9tICsgZGZyb20gPT0gZGZyb20gJiYgZGZyb20gIT0gMC4wKQkvKiBSZXN1bHQgaXMgSW5maW5pdHkgKi8KKyAgICB7CisgICAgICAvKiBJbmZpbml0eSBleHBvbmVudCBpcyBzYW1lIGFzIE5hTidzLiAgKi8KKyAgICAgIHB1dF9maWVsZCAodXRvLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsIGZtdC0+ZXhwX3N0YXJ0LAorCQkgZm10LT5leHBfbGVuLCBmbXQtPmV4cF9uYW4pOworICAgICAgLyogSW5maW5pdHkgbWFudGlzc2EgaXMgYWxsIHplcm9lcy4gICovCisgICAgICBwdXRfZmllbGQgKHV0bywgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLCBmbXQtPm1hbl9zdGFydCwKKwkJIGZtdC0+bWFuX2xlbiwgMCk7CisgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQorICBtYW50ID0gbGRmcmV4cCAoZGZyb20sICZleHBvbmVudCk7CisjZWxzZQorICBtYW50ID0gZnJleHAgKGRmcm9tLCAmZXhwb25lbnQpOworI2VuZGlmCisKKyAgcHV0X2ZpZWxkICh1dG8sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwgZm10LT5leHBfc3RhcnQsIGZtdC0+ZXhwX2xlbiwKKwkgICAgIGV4cG9uZW50ICsgZm10LT5leHBfYmlhcyAtIDEpOworCisgIG1hbnRfYml0c19sZWZ0ID0gZm10LT5tYW5fbGVuOworICBtYW50X29mZiA9IGZtdC0+bWFuX3N0YXJ0OworICB3aGlsZSAobWFudF9iaXRzX2xlZnQgPiAwKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbWFudF9sb25nOworICAgICAgbWFudF9iaXRzID0gbWFudF9iaXRzX2xlZnQgPCAzMiA/IG1hbnRfYml0c19sZWZ0IDogMzI7CisKKyAgICAgIG1hbnQgKj0gNDI5NDk2NzI5Ni4wOworICAgICAgbWFudF9sb25nID0gKHVuc2lnbmVkIGxvbmcpbWFudDsKKyAgICAgIG1hbnQgLT0gbWFudF9sb25nOworCisgICAgICAvKiBJZiB0aGUgaW50ZWdlciBiaXQgaXMgaW1wbGljaXQsIHRoZW4gd2UgbmVlZCB0byBkaXNjYXJkIGl0LgorCSBJZiB3ZSBhcmUgZGlzY2FyZGluZyBhIHplcm8sIHdlIHNob3VsZCBiZSAoYnV0IGFyZSBub3QpIGNyZWF0aW5nCisJIGEgZGVub3JtYWxpemVkCW51bWJlciB3aGljaCBtZWFucyBhZGp1c3RpbmcgdGhlIGV4cG9uZW50CisJIChJIHRoaW5rKS4gICovCisgICAgICBpZiAobWFudF9iaXRzX2xlZnQgPT0gZm10LT5tYW5fbGVuCisJICAmJiBmbXQtPmludGJpdCA9PSBmbG9hdGZvcm1hdF9pbnRiaXRfbm8pCisJeworCSAgbWFudF9sb25nIDw8PSAxOworCSAgbWFudF9iaXRzIC09IDE7CisJfQorCisgICAgICBpZiAobWFudF9iaXRzIDwgMzIpCisJeworCSAgLyogVGhlIGJpdHMgd2Ugd2FudCBhcmUgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgTUFOVF9CSVRTIGJpdHMgb2YKKwkgICAgIG1hbnRfbG9uZy4gIE1vdmUgdGhlbSB0byB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQuICAqLworCSAgbWFudF9sb25nID4+PSAzMiAtIG1hbnRfYml0czsKKwl9CisKKyAgICAgIHB1dF9maWVsZCAodXRvLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsCisJCSBtYW50X29mZiwgbWFudF9iaXRzLCBtYW50X2xvbmcpOworICAgICAgbWFudF9vZmYgKz0gbWFudF9iaXRzOworICAgICAgbWFudF9iaXRzX2xlZnQgLT0gbWFudF9iaXRzOworICAgIH0KKyAgaWYgKGZtdCAtPiBieXRlb3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlYnl0ZV9iaWd3b3JkKQorICAgIHsKKyAgICAgIGludCBjb3VudDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKnN3YXBsb3cgPSB1dG87CisgICAgICB1bnNpZ25lZCBjaGFyICpzd2FwaGlnaCA9IHV0byArIDQ7CisgICAgICB1bnNpZ25lZCBjaGFyIHRtcDsKKworICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgNDsgY291bnQrKykKKwl7CisJICB0bXAgPSAqc3dhcGxvdzsKKwkgICpzd2FwbG93KysgPSAqc3dhcGhpZ2g7CisJICAqc3dhcGhpZ2grKyA9IHRtcDsKKwl9CisgICAgfQorfQorCisvKiB0ZW1wb3Jhcnkgc3RvcmFnZSB1c2luZyBjaXJjdWxhciBidWZmZXIgKi8KKyNkZWZpbmUgTlVNQ0VMTFMgMTYKKyNkZWZpbmUgQ0VMTFNJWkUgMzIKK3N0YXRpYyBjaGFyKgorZ2V0X2NlbGwoKQoreworICBzdGF0aWMgY2hhciBidWZbTlVNQ0VMTFNdW0NFTExTSVpFXTsKKyAgc3RhdGljIGludCBjZWxsPTA7CisgIGlmICgrK2NlbGw+PU5VTUNFTExTKSBjZWxsPTA7CisgIHJldHVybiBidWZbY2VsbF07Cit9CisKKy8qIHByaW50IHJvdXRpbmVzIHRvIGhhbmRsZSB2YXJpYWJsZSBzaXplIHJlZ3MsIGV0Yy4KKworICAgRklYTUU6IE5vdGUgdGhhdCB0X2FkZHIgaXMgYSBiZmRfdm1hLCB3aGljaCBpcyBjdXJyZW50bHkgZWl0aGVyIGFuCisgICB1bnNpZ25lZCBsb25nIG9yIHVuc2lnbmVkIGxvbmcgbG9uZywgZGV0ZXJtaW5lZCBhdCBjb25maWd1cmUgdGltZS4KKyAgIElmIHRfYWRkciBpcyBhbiB1bnNpZ25lZCBsb25nIGxvbmcgYW5kIHNpemVvZiAodW5zaWduZWQgbG9uZyBsb25nKQorICAgaXMgZ3JlYXRlciB0aGFuIHNpemVvZiAodW5zaWduZWQgbG9uZyksIHRoZW4gSSBiZWxpZXZlIHRoaXMgY29kZSB3aWxsCisgICBwcm9iYWJseSBsb3NlLCBhdCBsZWFzdCBmb3IgbGl0dGxlIGVuZGlhbiBtYWNoaW5lcy4gIEkgYmVsaWV2ZSB0aGF0CisgICBpdCB3b3VsZCBhbHNvIGJlIGJldHRlciB0byBlbGltaW5hdGUgdGhlIHN3aXRjaCBvbiB0aGUgYWJzb2x1dGUgc2l6ZQorICAgb2YgdF9hZGRyIGFuZCByZXBsYWNlIGl0IHdpdGggYSBzZXF1ZW5jZSBvZiBpZiBzdGF0ZW1lbnRzIHRoYXQgY29tcGFyZQorICAgc2l6ZW9mIHRfYWRkciB3aXRoIHNpemVvZiB0aGUgdmFyaW91cyB0eXBlcyBhbmQgZG8gdGhlIHJpZ2h0IHRoaW5nLAorICAgd2hpY2ggaW5jbHVkZXMga25vd2luZyB3aGV0aGVyIG9yIG5vdCB0aGUgaG9zdCBzdXBwb3J0cyBsb25nIGxvbmcuCisgICAtZm5mCisKKyAqLworCitzdGF0aWMgaW50IHRoaXJ0eV90d28gPSAzMjsJLyogZWxpbWluYXRlIHdhcm5pbmcgZnJvbSBjb21waWxlciBvbiAzMi1iaXQgc3lzdGVtcyAqLworCitjaGFyKiAKK3BhZGRyKGFkZHIpCisgIHRfYWRkciBhZGRyOworeworICBjaGFyICpwYWRkcl9zdHI9Z2V0X2NlbGwoKTsKKyAgc3dpdGNoIChzaXplb2YodF9hZGRyKSkKKyAgICB7CisgICAgICBjYXNlIDg6CisgICAgICAgIHNwcmludGYgKHBhZGRyX3N0ciwgIiUwOGx4JTA4bHgiLAorCQkodW5zaWduZWQgbG9uZykgKGFkZHIgPj4gdGhpcnR5X3R3byksICh1bnNpZ25lZCBsb25nKSAoYWRkciAmIDB4ZmZmZmZmZmYpKTsKKwlicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgc3ByaW50ZiAocGFkZHJfc3RyLCAiJTA4bHgiLCAodW5zaWduZWQgbG9uZykgYWRkcik7CisJYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIHNwcmludGYgKHBhZGRyX3N0ciwgIiUwNHgiLCAodW5zaWduZWQgc2hvcnQpIChhZGRyICYgMHhmZmZmKSk7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBzcHJpbnRmIChwYWRkcl9zdHIsICIlbHgiLCAodW5zaWduZWQgbG9uZykgYWRkcik7CisgICAgfQorICByZXR1cm4gcGFkZHJfc3RyOworfQorCitjaGFyKiAKK3ByZWcocmVnKQorICB0X3JlZyByZWc7Cit7CisgIGNoYXIgKnByZWdfc3RyPWdldF9jZWxsKCk7CisgIHN3aXRjaCAoc2l6ZW9mKHRfcmVnKSkKKyAgICB7CisgICAgICBjYXNlIDg6CisgICAgICAgIHNwcmludGYgKHByZWdfc3RyLCAiJTA4bHglMDhseCIsCisJCSh1bnNpZ25lZCBsb25nKSAocmVnID4+IHRoaXJ0eV90d28pLCAodW5zaWduZWQgbG9uZykgKHJlZyAmIDB4ZmZmZmZmZmYpKTsKKwlicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgc3ByaW50ZiAocHJlZ19zdHIsICIlMDhseCIsICh1bnNpZ25lZCBsb25nKSByZWcpOworCWJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBzcHJpbnRmIChwcmVnX3N0ciwgIiUwNHgiLCAodW5zaWduZWQgc2hvcnQpIChyZWcgJiAweGZmZmYpKTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHNwcmludGYgKHByZWdfc3RyLCAiJWx4IiwgKHVuc2lnbmVkIGxvbmcpIHJlZyk7CisgICAgfQorICByZXR1cm4gcHJlZ19zdHI7Cit9CisKK2NoYXIqCitwYWRkcl9ueihhZGRyKQorICB0X2FkZHIgYWRkcjsKK3sKKyAgY2hhciAqcGFkZHJfc3RyPWdldF9jZWxsKCk7CisgIHN3aXRjaCAoc2l6ZW9mKHRfYWRkcikpCisgICAgeworICAgICAgY2FzZSA4OgorCXsKKwkgIHVuc2lnbmVkIGxvbmcgaGlnaCA9ICh1bnNpZ25lZCBsb25nKSAoYWRkciA+PiB0aGlydHlfdHdvKTsKKwkgIGlmIChoaWdoID09IDApCisJICAgIHNwcmludGYgKHBhZGRyX3N0ciwgIiVseCIsICh1bnNpZ25lZCBsb25nKSAoYWRkciAmIDB4ZmZmZmZmZmYpKTsKKwkgIGVsc2UKKwkgICAgc3ByaW50ZiAocGFkZHJfc3RyLCAiJWx4JTA4bHgiLAorCQkgICAgaGlnaCwgKHVuc2lnbmVkIGxvbmcpIChhZGRyICYgMHhmZmZmZmZmZikpOworCSAgYnJlYWs7CisJfQorICAgICAgY2FzZSA0OgorICAgICAgICBzcHJpbnRmIChwYWRkcl9zdHIsICIlbHgiLCAodW5zaWduZWQgbG9uZykgYWRkcik7CisJYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIHNwcmludGYgKHBhZGRyX3N0ciwgIiV4IiwgKHVuc2lnbmVkIHNob3J0KSAoYWRkciAmIDB4ZmZmZikpOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgc3ByaW50ZiAocGFkZHJfc3RyLCIlbHgiLCAodW5zaWduZWQgbG9uZykgYWRkcik7CisgICAgfQorICByZXR1cm4gcGFkZHJfc3RyOworfQorCitjaGFyKgorcHJlZ19ueihyZWcpCisgIHRfcmVnIHJlZzsKK3sKKyAgY2hhciAqcHJlZ19zdHI9Z2V0X2NlbGwoKTsKKyAgc3dpdGNoIChzaXplb2YodF9yZWcpKQorICAgIHsKKyAgICAgIGNhc2UgODoKKwl7CisJICB1bnNpZ25lZCBsb25nIGhpZ2ggPSAodW5zaWduZWQgbG9uZykgKHJlZyA+PiB0aGlydHlfdHdvKTsKKwkgIGlmIChoaWdoID09IDApCisJICAgIHNwcmludGYgKHByZWdfc3RyLCAiJWx4IiwgKHVuc2lnbmVkIGxvbmcpIChyZWcgJiAweGZmZmZmZmZmKSk7CisJICBlbHNlCisJICAgIHNwcmludGYgKHByZWdfc3RyLCAiJWx4JTA4bHgiLAorCQkgICAgaGlnaCwgKHVuc2lnbmVkIGxvbmcpIChyZWcgJiAweGZmZmZmZmZmKSk7CisJICBicmVhazsKKwl9CisgICAgICBjYXNlIDQ6CisgICAgICAgIHNwcmludGYgKHByZWdfc3RyLCAiJWx4IiwgKHVuc2lnbmVkIGxvbmcpIHJlZyk7CisJYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIHNwcmludGYgKHByZWdfc3RyLCAiJXgiLCAodW5zaWduZWQgc2hvcnQpIChyZWcgJiAweGZmZmYpKTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHNwcmludGYgKHByZWdfc3RyLCAiJWx4IiwgKHVuc2lnbmVkIGxvbmcpIHJlZyk7CisgICAgfQorICByZXR1cm4gcHJlZ19zdHI7Cit9CmRpZmYgLS1naXQgYS9nZGIvdjg1MC10ZGVwLmMgYi9nZGIvdjg1MC10ZGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4YTRiZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi92ODUwLXRkZXAuYwpAQCAtMCwwICsxLDg4NCBAQAorLyogVGFyZ2V0LWRlcGVuZGVudCBjb2RlIGZvciB0aGUgTkVDIFY4NTAgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTk2LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJvYnN0YWNrLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAidmFsdWUuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSAiZ2RiY29yZS5oIgorI2luY2x1ZGUgInN5bWZpbGUuaCIKKworCitzdGF0aWMgY2hhciAqdjg1MF9nZW5lcmljX3JlZ19uYW1lc1tdID0gUkVHSVNURVJfTkFNRVM7CisKK3N0YXRpYyBjaGFyICp2ODUwZV9yZWdfbmFtZXNbXSA9Cit7CisgICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsCisgICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIsCisgICJyMTYiLCAicjE3IiwgInIxOCIsICJyMTkiLCAicjIwIiwgInIyMSIsICJyMjIiLCAicjIzIiwKKyAgInIyNCIsICJyMjUiLCAicjI2IiwgInIyNyIsICJyMjgiLCAicjI5IiwgInIzMCIsICJyMzEiLAorICAiZWlwYyIsICJlaXBzdyIsICJmZXBjIiwgImZlcHN3IiwgImVjciIsICJwc3ciLCAic3I2IiwgInNyNyIsCisgICJzcjgiLCAic3I5IiwgInNyMTAiLCAic3IxMSIsICJzcjEyIiwgInNyMTMiLCAic3IxNCIsICJzcjE1IiwKKyAgImN0cGMiLCAiY3Rwc3ciLCAiZGJwYyIsICJkYnBzdyIsICJjdGJwIiwgInNyMjEiLCAic3IyMiIsICJzcjIzIiwKKyAgInNyMjQiLCAic3IyNSIsICJzcjI2IiwgInNyMjciLCAic3IyOCIsICJzcjI5IiwgInNyMzAiLCAic3IzMSIsCisgICJwYyIsICJmcCIKK307CisKK2NoYXIgKip2ODUwX3JlZ2lzdGVyX25hbWVzID0gdjg1MF9nZW5lcmljX3JlZ19uYW1lczsKKworc3RydWN0Cit7CisgIGNoYXIgKipyZWduYW1lczsKKyAgaW50IG1hY2g7Cit9IHY4NTBfcHJvY2Vzc29yX3R5cGVfdGFibGVbXSA9Cit7CisgIHsgdjg1MF9nZW5lcmljX3JlZ19uYW1lcywgYmZkX21hY2hfdjg1MCB9LAorICB7IHY4NTBlX3JlZ19uYW1lcywgYmZkX21hY2hfdjg1MGUgfSwKKyAgeyB2ODUwZV9yZWdfbmFtZXMsIGJmZF9tYWNoX3Y4NTBlYSB9LAorICB7IE5VTEwsIDAgfQorfTsKKworLyogSW5mbyBnbGVhbmVkIGZyb20gc2Nhbm5pbmcgYSBmdW5jdGlvbidzIHByb2xvZ3VlLiAgKi8KKworc3RydWN0IHBpZnNyCQkJLyogSW5mbyBhYm91dCBvbmUgc2F2ZWQgcmVnICovCit7CisgIGludCBmcmFtZXJlZzsJCQkvKiBGcmFtZSByZWcgKFNQIG9yIEZQKSAqLworICBpbnQgb2Zmc2V0OwkJCS8qIE9mZnNldCBmcm9tIGZyYW1lcmVnICovCisgIGludCBjdXJfZnJhbWVvZmZzZXQ7CQkvKiBDdXJyZW50IGZyYW1lb2Zmc2V0ICovCisgIGludCByZWc7CQkJLyogU2F2ZWQgcmVnaXN0ZXIgbnVtYmVyICovCit9OworCitzdHJ1Y3QgcHJvbG9ndWVfaW5mbworeworICBpbnQgZnJhbWVyZWc7CisgIGludCBmcmFtZW9mZnNldDsKKyAgaW50IHN0YXJ0X2Z1bmN0aW9uOworICBzdHJ1Y3QgcGlmc3IgKnBpZnNyczsKK307CisKK3N0YXRpYyBDT1JFX0FERFIgdjg1MF9zY2FuX3Byb2xvZ3VlIFBBUkFNUyAoKENPUkVfQUREUiBwYywgCisJCQkJCSAgICAgc3RydWN0IHByb2xvZ3VlX2luZm8gKmZzKSk7CisKKworLyogU2hvdWxkIGNhbGxfZnVuY3Rpb24gYWxsb2NhdGUgc3RhY2sgc3BhY2UgZm9yIGEgc3RydWN0IHJldHVybj8gICovCitpbnQKK3Y4NTBfdXNlX3N0cnVjdF9jb252ZW50aW9uIChnY2NfcCwgdHlwZSkKKyAgICAgaW50IGdjY19wOworICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgcmV0dXJuIChUWVBFX05GSUVMRFMgKHR5cGUpID4gMSB8fCBUWVBFX0xFTkdUSCAodHlwZSkgPiA0KTsKK30KKworDAorCisvKiBTdHJ1Y3R1cmUgZm9yIG1hcHBpbmcgYml0cyBpbiByZWdpc3RlciBsaXN0cyB0byByZWdpc3RlciBudW1iZXJzLiAqLworc3RydWN0IHJlZ19saXN0IAoreworICBsb25nIG1hc2s7CisgIGludCByZWdubzsKK307CisKKy8qIEhlbHBlciBmdW5jdGlvbiBmb3Igdjg1MF9zY2FuX3Byb2xvZ3VlIHRvIGhhbmRsZSBwcmVwYXJlIGluc3RydWN0aW9uLiAqLworCitzdGF0aWMgdm9pZAoraGFuZGxlX3ByZXBhcmUgKGludCBpbnNuLCBpbnQgaW5zbjIsIENPUkVfQUREUiAqY3VycmVudF9wY19wdHIsCisJCXN0cnVjdCBwcm9sb2d1ZV9pbmZvICpwaSwgc3RydWN0IHBpZnNyICoqcGlmc3JfcHRyKQorCit7CisgIENPUkVfQUREUiBjdXJyZW50X3BjID0gKmN1cnJlbnRfcGNfcHRyOworICBzdHJ1Y3QgcGlmc3IgKnBpZnNyID0gKnBpZnNyX3B0cjsKKyAgbG9uZyBuZXh0ID0gaW5zbjIgJiAweGZmZmY7CisgIGxvbmcgbGlzdDEyID0gKChpbnNuICYgMSkgPDwgMTYpICsgKG5leHQgJiAweGZmZTApOworICBsb25nIG9mZnNldCA9IChpbnNuICYgMHgzZSkgPDwgMTsKKyAgc3RhdGljIHN0cnVjdCByZWdfbGlzdCByZWdfdGFibGUgW10gPQorICB7CisgICAgeyAweDAwODAwLCAyMCB9LAkvKiByMjAgKi8KKyAgICB7IDB4MDA0MDAsIDIxIH0sCS8qIHIyMSAqLworICAgIHsgMHgwMDIwMCwgMjIgfSwJLyogcjIyICovCisgICAgeyAweDAwMTAwLCAyMyB9LAkvKiByMjMgKi8KKyAgICB7IDB4MDgwMDAsIDI0IH0sCS8qIHIyNCAqLworICAgIHsgMHgwNDAwMCwgMjUgfSwJLyogcjI1ICovCisgICAgeyAweDAyMDAwLCAyNiB9LAkvKiByMjYgKi8KKyAgICB7IDB4MDEwMDAsIDI3IH0sCS8qIHIyNyAqLworICAgIHsgMHgwMDA4MCwgMjggfSwJLyogcjI4ICovCisgICAgeyAweDAwMDQwLCAyOSB9LAkvKiByMjkgKi8KKyAgICB7IDB4MTAwMDAsIDMwIH0sCS8qIGVwICovCisgICAgeyAweDAwMDIwLCAzMSB9LAkvKiBscCAqLworICAgIHsgMCwgMCB9CQkvKiBlbmQgb2YgdGFibGUgKi8KKyAgfTsKKyAgaW50IGk7CisKKyAgaWYgKChuZXh0ICYgMHgxZikgPT0gMHgwYikJCS8qIHNraXAgaW1tMTYgYXJndW1lbnQgKi8KKyAgICBjdXJyZW50X3BjICs9IDI7CisgIGVsc2UgaWYgKChuZXh0ICYgMHgxZikgPT0gMHgxMykJLyogc2tpcCBpbW0xNiBhcmd1bWVudCAqLworICAgIGN1cnJlbnRfcGMgKz0gMjsKKyAgZWxzZSBpZiAoKG5leHQgJiAweDFmKSA9PSAweDFiKQkvKiBza2lwIGltbTMyIGFyZ3VtZW50ICovCisgICAgY3VycmVudF9wYyArPSA0OworCisgIC8qIENhbGN1bGF0ZSB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgc2F2ZWQgcmVnaXN0ZXJzLCBhbmQgYWRkIGl0CisgICAgIGl0IHRvIHRoZSBpbW1lZGlhdGUgdmFsdWUgdXNlZCB0byBhZGp1c3QgU1AuICovCisgIGZvciAoaSA9IDA7IHJlZ190YWJsZVtpXS5tYXNrICE9IDA7IGkrKykKKyAgICBpZiAobGlzdDEyICYgcmVnX3RhYmxlW2ldLm1hc2spCisgICAgICBvZmZzZXQgKz0gUkVHSVNURVJfUkFXX1NJWkUgKHJlZ3RhYmxlW2ldLnJlZ25vKTsKKyAgcGktPmZyYW1lb2Zmc2V0IC09IG9mZnNldDsKKworICAvKiBDYWxjdWxhdGUgdGhlIG9mZnNldHMgb2YgdGhlIHJlZ2lzdGVycyByZWxhdGl2ZSB0byB0aGUgdmFsdWUKKyAgICAgdGhlIFNQIHdpbGwgaGF2ZSBhZnRlciB0aGUgcmVnaXN0ZXJzIGhhdmUgYmVlbiBwdXNoZWQgYW5kIHRoZQorICAgICBpbW01IHZhbHVlIGhhcyBiZWVuIHN1YnRyYWN0ZWQgZnJvbSBpdC4gKi8KKyAgaWYgKHBpZnNyKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IHJlZ190YWJsZVtpXS5tYXNrICE9IDA7IGkrKykKKwl7CisJICBpZiAobGlzdDEyICYgcmVnX3RhYmxlW2ldLm1hc2spCisJICAgIHsKKwkgICAgICBpbnQgcmVnID0gcmVnX3RhYmxlW2ldLnJlZ25vOworCSAgICAgIG9mZnNldCAtPSBSRUdJU1RFUl9SQVdfU0laRSAocmVnKTsKKwkgICAgICBwaWZzci0+cmVnID0gcmVnOworCSAgICAgIHBpZnNyLT5vZmZzZXQgPSBvZmZzZXQ7CisJICAgICAgcGlmc3ItPmN1cl9mcmFtZW9mZnNldCA9IHBpLT5mcmFtZW9mZnNldDsKKyAgICAjaWZkZWYgREVCVUcKKwkgICAgICBwcmludGZfZmlsdGVyZWQgKCJcdFNhdmVkIHJlZ2lzdGVyIHIlZCwgb2Zmc2V0ICVkIiwgcmVnLCBwaWZzci0+b2Zmc2V0KTsKKyAgICAjZW5kaWYKKwkgICAgICBwaWZzcisrOworCSAgICB9CisJfQorICAgIH0KKyNpZmRlZiBERUJVRworICBwcmludGZfZmlsdGVyZWQgKCJcdGZvdW5kIGN0cmV0IGFmdGVyIHJlZ3NhdmUgZnVuYyIpOworI2VuZGlmCisKKyAgLyogU2V0IHJlc3VsdCBwYXJhbWV0ZXJzLiAqLworICAqY3VycmVudF9wY19wdHIgPSBjdXJyZW50X3BjOworICAqcGlmc3JfcHRyID0gcGlmc3I7Cit9CisKKworLyogSGVscGVyIGZ1bmN0aW9uIGZvciB2ODUwX3NjYW5fcHJvbG9ndWUgdG8gaGFuZGxlIHB1c2htL3B1c2hsIGluc3RydWN0aW9ucy4KKyAgIEZJWE1FOiB0aGUgU1IgYml0IG9mIHRoZSByZWdpc3RlciBsaXN0IGlzIG5vdCBzdXBwb3J0ZWQ7IG11c3QgY2hlY2sKKyAgIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXMgbm90IGV2ZXIgZ2VuZXJhdGUgdGhpcyBiaXQuICovCisKK3N0YXRpYyB2b2lkCitoYW5kbGVfcHVzaG0gKGludCBpbnNuLCBpbnQgaW5zbjIsIHN0cnVjdCBwcm9sb2d1ZV9pbmZvICpwaSwKKwkgICAgIHN0cnVjdCBwaWZzciAqKnBpZnNyX3B0cikKKworeworICBzdHJ1Y3QgcGlmc3IgKnBpZnNyID0gKnBpZnNyX3B0cjsKKyAgbG9uZyBsaXN0MTIgPSAoKGluc24gJiAweDBmKSA8PCAxNikgKyAoaW5zbjIgJiAweGZmZjApOworICBsb25nIG9mZnNldCA9IDA7CisgIHN0YXRpYyBzdHJ1Y3QgcmVnX2xpc3QgcHVzaG1sX3JlZ190YWJsZSBbXSA9CisgIHsKKyAgICB7IDB4ODAwMDAsIFBTX1JFR05VTSB9LAkvKiBQU1cgKi8KKyAgICB7IDB4NDAwMDAsIDEgfSwJCS8qIHIxICovCisgICAgeyAweDIwMDAwLCAyIH0sCQkvKiByMiAqLworICAgIHsgMHgxMDAwMCwgMyB9LAkJLyogcjMgKi8KKyAgICB7IDB4MDA4MDAsIDQgfSwJCS8qIHI0ICovCisgICAgeyAweDAwNDAwLCA1IH0sCQkvKiByNSAqLworICAgIHsgMHgwMDIwMCwgNiB9LAkJLyogcjYgKi8KKyAgICB7IDB4MDAxMDAsIDcgfSwJCS8qIHI3ICovCisgICAgeyAweDA4MDAwLCA4IH0sCQkvKiByOCAqLworICAgIHsgMHgwNDAwMCwgOSB9LAkJLyogcjkgKi8KKyAgICB7IDB4MDIwMDAsIDEwIH0sCQkvKiByMTAgKi8KKyAgICB7IDB4MDEwMDAsIDExIH0sCQkvKiByMTEgKi8KKyAgICB7IDB4MDAwODAsIDEyIH0sCQkvKiByMTIgKi8KKyAgICB7IDB4MDAwNDAsIDEzIH0sCQkvKiByMTMgKi8KKyAgICB7IDB4MDAwMjAsIDE0IH0sCQkvKiByMTQgKi8KKyAgICB7IDB4MDAwMTAsIDE1IH0sCQkvKiByMTUgKi8KKyAgICB7IDAsIDAgfQkJLyogZW5kIG9mIHRhYmxlICovCisgIH07CisgIHN0YXRpYyBzdHJ1Y3QgcmVnX2xpc3QgcHVzaG1oX3JlZ190YWJsZSBbXSA9CisgIHsKKyAgICB7IDB4ODAwMDAsIDE2IH0sCQkvKiByMTYgKi8KKyAgICB7IDB4NDAwMDAsIDE3IH0sCQkvKiByMTcgKi8KKyAgICB7IDB4MjAwMDAsIDE4IH0sCQkvKiByMTggKi8KKyAgICB7IDB4MTAwMDAsIDE5IH0sCQkvKiByMTkgKi8KKyAgICB7IDB4MDA4MDAsIDIwIH0sCQkvKiByMjAgKi8KKyAgICB7IDB4MDA0MDAsIDIxIH0sCQkvKiByMjEgKi8KKyAgICB7IDB4MDAyMDAsIDIyIH0sCQkvKiByMjIgKi8KKyAgICB7IDB4MDAxMDAsIDIzIH0sCQkvKiByMjMgKi8KKyAgICB7IDB4MDgwMDAsIDI0IH0sCQkvKiByMjQgKi8KKyAgICB7IDB4MDQwMDAsIDI1IH0sCQkvKiByMjUgKi8KKyAgICB7IDB4MDIwMDAsIDI2IH0sCQkvKiByMjYgKi8KKyAgICB7IDB4MDEwMDAsIDI3IH0sCQkvKiByMjcgKi8KKyAgICB7IDB4MDAwODAsIDI4IH0sCQkvKiByMjggKi8KKyAgICB7IDB4MDAwNDAsIDI5IH0sCQkvKiByMjkgKi8KKyAgICB7IDB4MDAwMTAsIDMwIH0sCQkvKiByMzAgKi8KKyAgICB7IDB4MDAwMjAsIDMxIH0sCQkvKiByMzEgKi8KKyAgICB7IDAsIDAgfQkJLyogZW5kIG9mIHRhYmxlICovCisgIH07CisgIHN0cnVjdCByZWdfbGlzdCAqcmVnX3RhYmxlOworICBpbnQgaTsKKworICAvKiBJcyB0aGlzIGEgcHVzaG1sIG9yIGEgcHVzaG1oPyAqLworICBpZiAoKGluc24yICYgNykgPT0gMSkKKyAgICByZWdfdGFibGUgPSBwdXNobWxfcmVnX3RhYmxlOworICBlbHNlCisgICAgcmVnX3RhYmxlID0gcHVzaG1oX3JlZ190YWJsZTsKKworICAvKiBDYWxjdWxhdGUgdGhlIHRvdGFsIHNpemUgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycywgYW5kIGFkZCBpdAorICAgICBpdCB0byB0aGUgaW1tZWRpYXRlIHZhbHVlIHVzZWQgdG8gYWRqdXN0IFNQLiAqLworICBmb3IgKGkgPSAwOyByZWdfdGFibGVbaV0ubWFzayAhPSAwOyBpKyspCisgICAgaWYgKGxpc3QxMiAmIHJlZ190YWJsZVtpXS5tYXNrKQorICAgICAgb2Zmc2V0ICs9IFJFR0lTVEVSX1JBV19TSVpFIChyZWd0YWJsZVtpXS5yZWdubyk7CisgIHBpLT5mcmFtZW9mZnNldCAtPSBvZmZzZXQ7CisKKyAgLyogQ2FsY3VsYXRlIHRoZSBvZmZzZXRzIG9mIHRoZSByZWdpc3RlcnMgcmVsYXRpdmUgdG8gdGhlIHZhbHVlCisgICAgIHRoZSBTUCB3aWxsIGhhdmUgYWZ0ZXIgdGhlIHJlZ2lzdGVycyBoYXZlIGJlZW4gcHVzaGVkIGFuZCB0aGUKKyAgICAgaW1tNSB2YWx1ZSBpcyBzdWJ0cmFjdGVkIGZyb20gaXQuICovCisgIGlmIChwaWZzcikKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyByZWdfdGFibGVbaV0ubWFzayAhPSAwOyBpKyspCisJeworCSAgaWYgKGxpc3QxMiAmIHJlZ190YWJsZVtpXS5tYXNrKQorCSAgICB7CisJICAgICAgaW50IHJlZyA9IHJlZ190YWJsZVtpXS5yZWdubzsKKwkgICAgICBvZmZzZXQgLT0gUkVHSVNURVJfUkFXX1NJWkUgKHJlZyk7CisJICAgICAgcGlmc3ItPnJlZyA9IHJlZzsKKwkgICAgICBwaWZzci0+b2Zmc2V0ID0gb2Zmc2V0OworCSAgICAgIHBpZnNyLT5jdXJfZnJhbWVvZmZzZXQgPSBwaS0+ZnJhbWVvZmZzZXQ7CisgICAgI2lmZGVmIERFQlVHCisJICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXHRTYXZlZCByZWdpc3RlciByJWQsIG9mZnNldCAlZCIsIHJlZywgcGlmc3ItPm9mZnNldCk7CisgICAgI2VuZGlmCisJICAgICAgcGlmc3IrKzsKKwkgICAgfQorCX0KKyAgICB9CisjaWZkZWYgREVCVUcKKyAgcHJpbnRmX2ZpbHRlcmVkICgiXHRmb3VuZCBjdHJldCBhZnRlciByZWdzYXZlIGZ1bmMiKTsKKyNlbmRpZgorCisgIC8qIFNldCByZXN1bHQgcGFyYW1ldGVycy4gKi8KKyAgKnBpZnNyX3B0ciA9IHBpZnNyOworfQorCisKKworDAorLyogRnVuY3Rpb246IHNjYW5fcHJvbG9ndWUKKyAgIFNjYW4gdGhlIHByb2xvZ3VlIG9mIHRoZSBmdW5jdGlvbiB0aGF0IGNvbnRhaW5zIFBDLCBhbmQgcmVjb3JkIHdoYXQKKyAgIHdlIGZpbmQgaW4gUEkuICBQSS0+ZnNyIG11c3QgYmUgemVyb2VkIGJ5IHRoZSBjYWxsZWQuICBSZXR1cm5zIHRoZQorICAgcGMgYWZ0ZXIgdGhlIHByb2xvZ3VlLiAgTm90ZSB0aGF0IHRoZSBhZGRyZXNzZXMgc2F2ZWQgaW4gcGktPmZzcgorICAgYXJlIGFjdHVhbGx5IGp1c3QgZnJhbWUgcmVsYXRpdmUgKG5lZ2F0aXZlIG9mZnNldHMgZnJvbSB0aGUgZnJhbWUKKyAgIHBvaW50ZXIpLiAgVGhpcyBpcyBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUKKyAgIGZyYW1lIHBvaW50ZXIgeWV0LiAgSW4gc29tZSBjaXJjdW1zdGFuY2VzLCB0aGUgZnJhbWUgcG9pbnRlciBjYW4ndAorICAgYmUgZGV0ZXJtaW5lZCB0aWxsIGFmdGVyIHdlIGhhdmUgc2Nhbm5lZCB0aGUgcHJvbG9ndWUuICAqLworCitzdGF0aWMgQ09SRV9BRERSCit2ODUwX3NjYW5fcHJvbG9ndWUgKHBjLCBwaSkKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBzdHJ1Y3QgcHJvbG9ndWVfaW5mbyAqcGk7Cit7CisgIENPUkVfQUREUiBmdW5jX2FkZHIsIHByb2xvZ3VlX2VuZCwgY3VycmVudF9wYzsKKyAgc3RydWN0IHBpZnNyICpwaWZzciwgKnBpZnNyX3RtcDsKKyAgaW50IGZwX3VzZWQ7CisgIGludCBlcF91c2VkOworICBpbnQgcmVnOworICBDT1JFX0FERFIgc2F2ZV9wYywgc2F2ZV9lbmQ7CisgIGludCByZWdzYXZlX2Z1bmNfcDsKKyAgaW50IHIxMl90bXA7CisKKyAgLyogRmlyc3QsIGZpZ3VyZSBvdXQgdGhlIGJvdW5kcyBvZiB0aGUgcHJvbG9ndWUgc28gdGhhdCB3ZSBjYW4gbGltaXQgdGhlCisgICAgIHNlYXJjaCB0byBzb21ldGhpbmcgcmVhc29uYWJsZS4gICovCisKKyAgaWYgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAocGMsIE5VTEwsICZmdW5jX2FkZHIsIE5VTEwpKQorICAgIHsKKyAgICAgIHN0cnVjdCBzeW10YWJfYW5kX2xpbmUgc2FsOworCisgICAgICBzYWwgPSBmaW5kX3BjX2xpbmUgKGZ1bmNfYWRkciwgMCk7CisKKyAgICAgIGlmIChmdW5jX2FkZHIgPT0gZW50cnlfcG9pbnRfYWRkcmVzcyAoKSkKKwlwaS0+c3RhcnRfZnVuY3Rpb24gPSAxOworICAgICAgZWxzZQorCXBpLT5zdGFydF9mdW5jdGlvbiA9IDA7CisKKyNpZiAwCisgICAgICBpZiAoc2FsLmxpbmUgPT0gMCkKKwlwcm9sb2d1ZV9lbmQgPSBwYzsKKyAgICAgIGVsc2UKKwlwcm9sb2d1ZV9lbmQgPSBzYWwuZW5kOworI2Vsc2UKKyAgICAgIHByb2xvZ3VlX2VuZCA9IHBjOworI2VuZGlmCisgICAgfQorICBlbHNlCisgICAgewkJCQkvKiBXZSdyZSBpbiB0aGUgYm9vbmRvY2tzICovCisgICAgICBmdW5jX2FkZHIgPSBwYyAtIDEwMDsKKyAgICAgIHByb2xvZ3VlX2VuZCA9IHBjOworICAgIH0KKworICBwcm9sb2d1ZV9lbmQgPSBtaW4gKHByb2xvZ3VlX2VuZCwgcGMpOworCisgIC8qIE5vdywgc2VhcmNoIHRoZSBwcm9sb2d1ZSBsb29raW5nIGZvciBpbnN0cnVjdGlvbnMgdGhhdCBzZXR1cCBmcCwgc2F2ZQorICAgICBycCwgYWRqdXN0IHNwIGFuZCBzdWNoLiAgV2UgYWxzbyByZWNvcmQgdGhlIGZyYW1lIG9mZnNldCBvZiBhbnkgc2F2ZWQKKyAgICAgcmVnaXN0ZXJzLiAqLyAKKworICBwaS0+ZnJhbWVvZmZzZXQgPSAwOworICBwaS0+ZnJhbWVyZWcgPSBTUF9SRUdOVU07CisgIGZwX3VzZWQgPSAwOworICBlcF91c2VkID0gMDsKKyAgcGlmc3IgPSBwaS0+cGlmc3JzOworICByZWdzYXZlX2Z1bmNfcCA9IDA7CisgIHNhdmVfcGMgPSAwOworICBzYXZlX2VuZCA9IDA7CisgIHIxMl90bXAgPSAwOworCisjaWZkZWYgREVCVUcKKyAgcHJpbnRmX2ZpbHRlcmVkICgiQ3VycmVudF9wYyA9IDB4JS44bHgsIHByb2xvZ3VlX2VuZCA9IDB4JS44bHhcbiIsCisJCSAgIChsb25nKWZ1bmNfYWRkciwgKGxvbmcpcHJvbG9ndWVfZW5kKTsKKyNlbmRpZgorCisgIGZvciAoY3VycmVudF9wYyA9IGZ1bmNfYWRkcjsgY3VycmVudF9wYyA8IHByb2xvZ3VlX2VuZDsgKQorICAgIHsKKyAgICAgIGludCBpbnNuLCBpbnNuMjsKKworI2lmZGVmIERFQlVHCisgICAgICBwcmludGZfZmlsdGVyZWQgKCIweCUuOGx4ICIsIChsb25nKWN1cnJlbnRfcGMpOworICAgICAgKCp0bV9wcmludF9pbnNuKSAoY3VycmVudF9wYywgJnRtX3ByaW50X2luc25faW5mbyk7CisjZW5kaWYKKworICAgICAgaW5zbiA9IHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKGN1cnJlbnRfcGMsIDIpOworICAgICAgY3VycmVudF9wYyArPSAyOworICAgICAgaWYgKChpbnNuICYgMHgwNzgwKSA+PSAweDA2MDApIC8qIEZvdXIgYnl0ZSBpbnN0cnVjdGlvbj8gKi8KKwl7CisJICBpbnNuMiA9IHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKGN1cnJlbnRfcGMsIDIpOworCSAgY3VycmVudF9wYyArPSAyOworCX0KKworICAgICAgaWYgKChpbnNuICYgMHhmZmMwKSA9PSAoKDEwIDw8IDExKSB8IDB4MDc4MCkgJiYgIXJlZ3NhdmVfZnVuY19wKQorCXsJCQkvKiBqYXJsIDxmdW5jPiwxMCAqLworCSAgbG9uZyBsb3dfZGlzcCA9IGluc24yICYgfiAobG9uZykgMTsKKwkgIGxvbmcgZGlzcCA9ICgoKCgoaW5zbiAmIDB4M2YpIDw8IDE2KSArIGxvd19kaXNwKQorCQkJJiB+IChsb25nKSAxKSBeIDB4MDAyMDAwMDApIC0gMHgwMDIwMDAwMDsKKworCSAgc2F2ZV9wYyA9IGN1cnJlbnRfcGM7CisJICBzYXZlX2VuZCA9IHByb2xvZ3VlX2VuZDsKKwkgIHJlZ3NhdmVfZnVuY19wID0gMTsKKwkgIGN1cnJlbnRfcGMgKz0gZGlzcCAtIDQ7CisJICBwcm9sb2d1ZV9lbmQgPSAoY3VycmVudF9wYworCQkJICArICgyICogMykJLyogbW92ZXMgdG8vZnJvbSBlcCAqLworCQkJICArIDQJCS8qIGFkZGkgPGNvbnN0PixzcCxzcCAqLworCQkJICArIDIJCS8qIGptcCBbcjEwXSAqLworCQkJICArICgyICogMTIpCS8qIHNzdC53IHRvIHNhdmUgcjIsIHIyMC1yMjksIHIzMSAqLworCQkJICArIDIwKTsJLyogc2xvcCBhcmVhICovCisKKyNpZmRlZiBERUJVRworCSAgcHJpbnRmX2ZpbHRlcmVkICgiXHRmb3VuZCBqYXJsIDxmdW5jPixyMTAsIGRpc3AgPSAlbGQsIGxvd19kaXNwID0gJWxkLCBuZXcgcGMgPSAweCUuOGx4XG4iLAorCQkJICAgZGlzcCwgbG93X2Rpc3AsIChsb25nKWN1cnJlbnRfcGMgKyAyKTsKKyNlbmRpZgorCSAgY29udGludWU7CisJfQorICAgICAgZWxzZSBpZiAoKGluc24gJiAweGZmYzApID09IDB4MDIwMCAmJiAhcmVnc2F2ZV9mdW5jX3ApCisJewkJCS8qIGNhbGx0IDxpbW02PiAqLworCSAgbG9uZyBjdGJwID0gcmVhZF9yZWdpc3RlciAoQ1RCUF9SRUdOVU0pOworCSAgbG9uZyBhZHIgPSBjdGJwICsgKChpbnNuICYgMHgzZikgPDwgMSk7CisKKwkgIHNhdmVfcGMgPSBjdXJyZW50X3BjOworCSAgc2F2ZV9lbmQgPSBwcm9sb2d1ZV9lbmQ7CisJICByZWdzYXZlX2Z1bmNfcCA9IDE7CisJICBjdXJyZW50X3BjID0gY3RicCArIChyZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyIChhZHIsIDIpICYgMHhmZmZmKTsKKwkgIHByb2xvZ3VlX2VuZCA9IChjdXJyZW50X3BjCisJCQkgICsgKDIgKiAzKQkvKiBwcmVwYXJlIGxpc3QyLGltbTUsc3AvaW1tICovCisJCQkgICsgNAkJLyogY3RyZXQgKi8KKwkJCSAgKyAyMCk7CS8qIHNsb3AgYXJlYSAqLworCisjaWZkZWYgREVCVUcKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlx0Zm91bmQgY2FsbHQsICBjdGJwID0gMHglLjhseCwgYWRyID0gJS44bHgsIG5ldyBwYyA9IDB4JS44bHhcbiIsCisJCQkgICBjdGJwLCBhZHIsIChsb25nKWN1cnJlbnRfcGMpOworI2VuZGlmCisJICBjb250aW51ZTsKKwl9CisgICAgICBlbHNlIGlmICgoaW5zbiAmIDB4ZmZjMCkgPT0gMHgwNzgwKQkvKiBwcmVwYXJlIGxpc3QyLGltbTUgKi8KKwl7CisJICBoYW5kbGVfcHJlcGFyZSAoaW5zbiwgaW5zbjIsICZjdXJyZW50X3BjLCBwaSwgJnBpZnNyKTsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIGVsc2UgaWYgKGluc24gPT0gMHgwN2UwICYmIHJlZ3NhdmVfZnVuY19wICYmIGluc24yID09IDB4MDE0NCkKKwl7CQkJLyogY3RyZXQgYWZ0ZXIgcHJvY2Vzc2luZyByZWdpc3RlciBzYXZlIGZ1bmN0aW9uICovCisJICBjdXJyZW50X3BjID0gc2F2ZV9wYzsKKwkgIHByb2xvZ3VlX2VuZCA9IHNhdmVfZW5kOworCSAgcmVnc2F2ZV9mdW5jX3AgPSAwOworI2lmZGVmIERFQlVHCisJICBwcmludGZfZmlsdGVyZWQgKCJcdGZvdW5kIGN0cmV0IGFmdGVyIHJlZ3NhdmUgZnVuYyIpOworI2VuZGlmCisJICBjb250aW51ZTsKKwl9CisgICAgICBlbHNlIGlmICgoaW5zbiAmIDB4ZmZmMCkgPT0gMHgwN2UwICYmIChpbnNuMiAmIDUpID09IDEpCisJewkJCS8qIHB1c2htbCwgcHVzaG1oICovCisJICBoYW5kbGVfcHVzaG0gKGluc24sIGluc24yLCBwaSwgJnBpZnNyKTsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIGVsc2UgaWYgKChpbnNuICYgMHhmZmUwKSA9PSAweDAwNjAgJiYgcmVnc2F2ZV9mdW5jX3ApCisJewkJCS8qIGptcCBhZnRlciBwcm9jZXNzaW5nIHJlZ2lzdGVyIHNhdmUgZnVuY3Rpb24gKi8KKwkgIGN1cnJlbnRfcGMgPSBzYXZlX3BjOworCSAgcHJvbG9ndWVfZW5kID0gc2F2ZV9lbmQ7CisJICByZWdzYXZlX2Z1bmNfcCA9IDA7CisjaWZkZWYgREVCVUcKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlx0Zm91bmQgam1wIGFmdGVyIHJlZ3NhdmUgZnVuYyIpOworI2VuZGlmCisJICBjb250aW51ZTsKKwl9CisgICAgICBlbHNlIGlmICgoaW5zbiAmIDB4MDdjMCkgPT0gMHgwNzgwCS8qIGphcmwgb3IganIgKi8KKwkgICAgICAgfHwgKGluc24gJiAweGZmZTApID09IDB4MDA2MAkvKiBqbXAgKi8KKwkgICAgICAgfHwgKGluc24gJiAweDA3ODApID09IDB4MDU4MCkJLyogYnJhbmNoICovCisJeworI2lmZGVmIERFQlVHCisJICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworI2VuZGlmCisJICBicmVhazsJCQkJLyogUmFuIGludG8gZW5kIG9mIHByb2xvZ3VlICovCisJfQorCisgICAgICBlbHNlIGlmICgoaW5zbiAmIDB4ZmZlMCkgPT0gKChTUF9SRUdOVU0gPDwgMTEpIHwgMHgwMjQwKSkJCS8qIGFkZCA8aW1tPixzcCAqLworCXBpLT5mcmFtZW9mZnNldCArPSAoKGluc24gJiAweDFmKSBeIDB4MTApIC0gMHgxMDsKKyAgICAgIGVsc2UgaWYgKGluc24gPT0gKChTUF9SRUdOVU0gPDwgMTEpIHwgMHgwNjAwIHwgU1BfUkVHTlVNKSkJLyogYWRkaSA8aW1tPixzcCxzcCAqLworCXBpLT5mcmFtZW9mZnNldCArPSBpbnNuMjsKKyAgICAgIGVsc2UgaWYgKGluc24gPT0gKChGUF9SQVdfUkVHTlVNIDw8IDExKSB8IDB4MDAwMCB8IFNQX1JFR05VTSkpCS8qIG1vdiBzcCxmcCAqLworCXsKKwkgIGZwX3VzZWQgPSAxOworCSAgcGktPmZyYW1lcmVnID0gRlBfUkFXX1JFR05VTTsKKwl9CisKKyAgICAgIGVsc2UgaWYgKGluc24gPT0gKChSMTJfUkVHTlVNIDw8IDExKSB8IDB4MDY0MCB8IFIwX1JFR05VTSkpCS8qIG1vdmhpIGhpKGNvbnN0KSxyMCxyMTIgKi8KKwlyMTJfdG1wID0gaW5zbjIgPDwgMTY7CisgICAgICBlbHNlIGlmIChpbnNuID09ICgoUjEyX1JFR05VTSA8PCAxMSkgfCAweDA2MjAgfCBSMTJfUkVHTlVNKSkJLyogbW92ZWEgbG8oY29uc3QpLHIxMixyMTIgKi8KKwlyMTJfdG1wICs9IGluc24yOworICAgICAgZWxzZSBpZiAoaW5zbiA9PSAoKFNQX1JFR05VTSA8PCAxMSkgfCAweDAxYzAgfCBSMTJfUkVHTlVNKSAmJiByMTJfdG1wKSAvKiBhZGQgcjEyLHNwICovCisJcGktPmZyYW1lb2Zmc2V0ID0gcjEyX3RtcDsKKyAgICAgIGVsc2UgaWYgKGluc24gPT0gKChFUF9SRUdOVU0gPDwgMTEpIHwgMHgwMDAwIHwgU1BfUkVHTlVNKSkJLyogbW92IHNwLGVwICovCisJZXBfdXNlZCA9IDE7CisgICAgICBlbHNlIGlmIChpbnNuID09ICgoRVBfUkVHTlVNIDw8IDExKSB8IDB4MDAwMCB8IFIxX1JFR05VTSkpCS8qIG1vdiByMSxlcCAqLworCWVwX3VzZWQgPSAwOworICAgICAgZWxzZSBpZiAoKChpbnNuICYgMHgwN2ZmKSA9PSAoMHgwNzYwIHwgU1BfUkVHTlVNKQkJCS8qIHN0LncgPHJlZz4sPG9mZnNldD5bc3BdICovCisJCXx8IChmcF91c2VkCisJCSAgICAmJiAoaW5zbiAmIDB4MDdmZikgPT0gKDB4MDc2MCB8IEZQX1JBV19SRUdOVU0pKSkJLyogc3QudyA8cmVnPiw8b2Zmc2V0PltmcF0gKi8KKwkgICAgICAgJiYgcGlmc3IKKwkgICAgICAgJiYgKCgocmVnID0gKGluc24gPj4gMTEpICYgMHgxZikgPj0gU0FWRTFfU1RBUlRfUkVHTlVNICYmIHJlZyA8PSBTQVZFMV9FTkRfUkVHTlVNKQorCQkgICB8fCAocmVnID49IFNBVkUyX1NUQVJUX1JFR05VTSAmJiByZWcgPD0gU0FWRTJfRU5EX1JFR05VTSkKKwkJICAgfHwgKHJlZyA+PSBTQVZFM19TVEFSVF9SRUdOVU0gJiYgcmVnIDw9IFNBVkUzX0VORF9SRUdOVU0pKSkKKwl7CisJICBwaWZzci0+cmVnID0gcmVnOworCSAgcGlmc3ItPm9mZnNldCA9IGluc24yICYgfjE7CisJICBwaWZzci0+Y3VyX2ZyYW1lb2Zmc2V0ID0gcGktPmZyYW1lb2Zmc2V0OworI2lmZGVmIERFQlVHCisJICBwcmludGZfZmlsdGVyZWQgKCJcdFNhdmVkIHJlZ2lzdGVyIHIlZCwgb2Zmc2V0ICVkIiwgcmVnLCBwaWZzci0+b2Zmc2V0KTsKKyNlbmRpZgorCSAgcGlmc3IrKzsKKwl9CisKKyAgICAgIGVsc2UgaWYgKGVwX3VzZWQJCQkJCQkvKiBzc3QudyA8cmVnPiw8b2Zmc2V0PltlcF0gKi8KKwkgICAgICAgJiYgKChpbnNuICYgMHgwNzgxKSA9PSAweDA1MDEpCisJICAgICAgICYmIHBpZnNyCisJICAgICAgICYmICgoKHJlZyA9IChpbnNuID4+IDExKSAmIDB4MWYpID49IFNBVkUxX1NUQVJUX1JFR05VTSAmJiByZWcgPD0gU0FWRTFfRU5EX1JFR05VTSkKKwkJICAgfHwgKHJlZyA+PSBTQVZFMl9TVEFSVF9SRUdOVU0gJiYgcmVnIDw9IFNBVkUyX0VORF9SRUdOVU0pCisJCSAgIHx8IChyZWcgPj0gU0FWRTNfU1RBUlRfUkVHTlVNICYmIHJlZyA8PSBTQVZFM19FTkRfUkVHTlVNKSkpCisJeworCSAgcGlmc3ItPnJlZyA9IHJlZzsKKwkgIHBpZnNyLT5vZmZzZXQgPSAoaW5zbiAmIDB4MDA3ZSkgPDwgMTsKKwkgIHBpZnNyLT5jdXJfZnJhbWVvZmZzZXQgPSBwaS0+ZnJhbWVvZmZzZXQ7CisjaWZkZWYgREVCVUcKKwkgIHByaW50Zl9maWx0ZXJlZCAoIlx0U2F2ZWQgcmVnaXN0ZXIgciVkLCBvZmZzZXQgJWQiLCByZWcsIHBpZnNyLT5vZmZzZXQpOworI2VuZGlmCisJICBwaWZzcisrOworCX0KKworI2lmZGVmIERFQlVHCisgICAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworI2VuZGlmCisgICAgfQorCisgIGlmIChwaWZzcikKKyAgICBwaWZzci0+ZnJhbWVyZWcgPSAwOwkvKiBUaWUgb2ZmIGxhc3QgZW50cnkgKi8KKworICAvKiBGaXggdXAgYW55IG9mZnNldHMgdG8gdGhlIGZpbmFsIG9mZnNldC4gIElmIGEgZnJhbWUgcG9pbnRlciB3YXMgY3JlYXRlZCwgdXNlIGl0CisgICAgIGluc3RlYWQgb2YgdGhlIHN0YWNrIHBvaW50ZXIuICAqLworICBmb3IgKHBpZnNyX3RtcCA9IHBpLT5waWZzcnM7IHBpZnNyX3RtcCAmJiBwaWZzcl90bXAgIT0gcGlmc3I7IHBpZnNyX3RtcCsrKQorICAgIHsKKyAgICAgIHBpZnNyX3RtcC0+b2Zmc2V0IC09IHBpLT5mcmFtZW9mZnNldCAtIHBpZnNyX3RtcC0+Y3VyX2ZyYW1lb2Zmc2V0OworICAgICAgcGlmc3JfdG1wLT5mcmFtZXJlZyA9IHBpLT5mcmFtZXJlZzsKKworI2lmZGVmIERFQlVHCisgICAgICBwcmludGZfZmlsdGVyZWQgKCJTYXZlZCByZWdpc3RlciByJWQsIG9mZnNldCA9ICVkLCBmcmFtZXJlZyA9IHIlZFxuIiwKKwkJICAgICAgIHBpZnNyX3RtcC0+cmVnLCBwaWZzcl90bXAtPm9mZnNldCwgcGlmc3JfdG1wLT5mcmFtZXJlZyk7CisjZW5kaWYKKyAgICB9CisKKyNpZmRlZiBERUJVRworICBwcmludGZfZmlsdGVyZWQgKCJGcmFtZXJlZyA9IHIlZCwgZnJhbWVvZmZzZXQgPSAlZFxuIiwgcGktPmZyYW1lcmVnLCBwaS0+ZnJhbWVvZmZzZXQpOworI2VuZGlmCisKKyAgcmV0dXJuIGN1cnJlbnRfcGM7Cit9CisKKy8qIEZ1bmN0aW9uOiBpbml0X2V4dHJhX2ZyYW1lX2luZm8KKyAgIFNldHVwIHRoZSBmcmFtZSdzIGZyYW1lIHBvaW50ZXIsIHBjLCBhbmQgZnJhbWUgYWRkcmVzc2VzIGZvciBzYXZlZAorICAgcmVnaXN0ZXJzLiAgTW9zdCBvZiB0aGUgd29yayBpcyBkb25lIGluIHNjYW5fcHJvbG9ndWUoKS4KKworICAgTm90ZSB0aGF0IHdoZW4gd2UgYXJlIGNhbGxlZCBmb3IgdGhlIGxhc3QgZnJhbWUgKGN1cnJlbnRseSBhY3RpdmUgZnJhbWUpLAorICAgdGhhdCBmaS0+cGMgYW5kIGZpLT5mcmFtZSB3aWxsIGFscmVhZHkgYmUgc2V0dXAuICBIb3dldmVyLCBmaS0+ZnJhbWUgd2lsbAorICAgYmUgdmFsaWQgb25seSBpZiB0aGlzIHJvdXRpbmUgdXNlcyBGUC4gIEZvciBwcmV2aW91cyBmcmFtZXMsIGZpLWZyYW1lIHdpbGwKKyAgIGFsd2F5cyBiZSBjb3JyZWN0IChzaW5jZSB0aGF0IGlzIGRlcml2ZWQgZnJvbSB2ODUwX2ZyYW1lX2NoYWluICgpKS4KKworICAgV2UgY2FuIGJlIGNhbGxlZCB3aXRoIHRoZSBQQyBpbiB0aGUgY2FsbCBkdW1teSB1bmRlciB0d28gY2lyY3Vtc3RhbmNlcy4KKyAgIEZpcnN0LCBkdXJpbmcgbm9ybWFsIGJhY2t0cmFjaW5nLCBzZWNvbmQsIHdoaWxlIGZpZ3VyaW5nIG91dCB0aGUgZnJhbWUKKyAgIHBvaW50ZXIganVzdCBwcmlvciB0byBjYWxsaW5nIHRoZSB0YXJnZXQgZnVuY3Rpb24gKHNlZSBydW5fc3RhY2tfZHVtbXkpLiAgKi8KKwordm9pZAordjg1MF9pbml0X2V4dHJhX2ZyYW1lX2luZm8gKGZpKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmk7Cit7CisgIHN0cnVjdCBwcm9sb2d1ZV9pbmZvIHBpOworICBzdHJ1Y3QgcGlmc3IgcGlmc3JzW05VTV9SRUdTICsgMV0sICpwaWZzcjsKKworICBpZiAoZmktPm5leHQpCisgICAgZmktPnBjID0gRlJBTUVfU0FWRURfUEMgKGZpLT5uZXh0KTsKKworICBtZW1zZXQgKGZpLT5mc3IucmVncywgJ1wwMDAnLCBzaXplb2YgZmktPmZzci5yZWdzKTsKKworICAvKiBUaGUgY2FsbCBkdW1teSBkb2Vzbid0IHNhdmUgYW55IHJlZ2lzdGVycyBvbiB0aGUgc3RhY2ssIHNvIHdlIGNhbiByZXR1cm4KKyAgICAgbm93LiAgKi8KKyAgaWYgKFBDX0lOX0NBTExfRFVNTVkgKGZpLT5wYywgZmktPmZyYW1lLCBmaS0+ZnJhbWUpKQorICAgICAgcmV0dXJuOworCisgIHBpLnBpZnNycyA9IHBpZnNyczsKKworICB2ODUwX3NjYW5fcHJvbG9ndWUgKGZpLT5wYywgJnBpKTsKKworICBpZiAoIWZpLT5uZXh0ICYmIHBpLmZyYW1lcmVnID09IFNQX1JFR05VTSkKKyAgICBmaS0+ZnJhbWUgPSByZWFkX3JlZ2lzdGVyIChwaS5mcmFtZXJlZykgLSBwaS5mcmFtZW9mZnNldDsKKworICBmb3IgKHBpZnNyID0gcGlmc3JzOyBwaWZzci0+ZnJhbWVyZWc7IHBpZnNyKyspCisgICAgeworICAgICAgZmktPmZzci5yZWdzW3BpZnNyLT5yZWddID0gcGlmc3ItPm9mZnNldCArIGZpLT5mcmFtZTsKKworICAgICAgaWYgKHBpZnNyLT5mcmFtZXJlZyA9PSBTUF9SRUdOVU0pCisJZmktPmZzci5yZWdzW3BpZnNyLT5yZWddICs9IHBpLmZyYW1lb2Zmc2V0OworICAgIH0KK30KKworLyogRnVuY3Rpb246IGZyYW1lX2NoYWluCisgICBGaWd1cmUgb3V0IHRoZSBmcmFtZSBwcmlvciB0byBGSS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgaW52b2x2ZXMKKyAgIHNjYW5uaW5nIHRoZSBwcm9sb2d1ZSBvZiB0aGUgY2FsbGVyLCB3aGljaCB3aWxsIGFsc28gYmUgZG9uZQorICAgc2hvcnRseSBieSB2ODUwX2luaXRfZXh0cmFfZnJhbWVfaW5mby4gIEZvciB0aGUgZHVtbXkgZnJhbWUsIHdlCisgICBqdXN0IHJldHVybiB0aGUgc3RhY2sgcG9pbnRlciB0aGF0IHdhcyBpbiB1c2UgYXQgdGhlIHRpbWUgdGhlCisgICBmdW5jdGlvbiBjYWxsIHdhcyBtYWRlLiAgKi8KKworQ09SRV9BRERSCit2ODUwX2ZyYW1lX2NoYWluIChmaSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZpOworeworICBzdHJ1Y3QgcHJvbG9ndWVfaW5mbyBwaTsKKyAgQ09SRV9BRERSIGNhbGxlcnNfcGMsIGZwOworCisgIC8qIEZpcnN0LCBmaW5kIG91dCB3aG8gY2FsbGVkIHVzICovCisgIGNhbGxlcnNfcGMgPSBGUkFNRV9TQVZFRF9QQyAoZmkpOworICAvKiBJZiBjYWxsZXIgaXMgYSBjYWxsLWR1bW15LCB0aGVuIG91ciBGUCBiZWFycyBubyByZWxhdGlvbiB0byBoaXMgRlAhICovCisgIGZwID0gdjg1MF9maW5kX2NhbGxlcnNfcmVnIChmaSwgRlBfUkFXX1JFR05VTSk7CisgIGlmIChQQ19JTl9DQUxMX0RVTU1ZKGNhbGxlcnNfcGMsIGZwLCBmcCkpCisgICAgcmV0dXJuIGZwOwkvKiBjYWxsZXIgaXMgY2FsbC1kdW1teTogcmV0dXJuIG9sZGVzdCB2YWx1ZSBvZiBGUCAqLworCisgIC8qIENhbGxlciBpcyBOT1QgYSBjYWxsLWR1bW15LCBzbyBldmVyeXRoaW5nIGVsc2Ugc2hvdWxkIGp1c3Qgd29yay4KKyAgICAgRXZlbiBpZiBUSElTIGZyYW1lIGlzIGEgY2FsbC1kdW1teSEgKi8KKyAgcGkucGlmc3JzID0gTlVMTDsKKworICB2ODUwX3NjYW5fcHJvbG9ndWUgKGNhbGxlcnNfcGMsICZwaSk7CisKKyAgaWYgKHBpLnN0YXJ0X2Z1bmN0aW9uKQorICAgIHJldHVybiAwOwkJCS8qIERvbid0IGNoYWluIGJleW9uZCB0aGUgc3RhcnQgZnVuY3Rpb24gKi8KKworICBpZiAocGkuZnJhbWVyZWcgPT0gRlBfUkFXX1JFR05VTSkKKyAgICByZXR1cm4gdjg1MF9maW5kX2NhbGxlcnNfcmVnIChmaSwgcGkuZnJhbWVyZWcpOworCisgIHJldHVybiBmaS0+ZnJhbWUgLSBwaS5mcmFtZW9mZnNldDsKK30KKworLyogRnVuY3Rpb246IGZpbmRfY2FsbGVyc19yZWcKKyAgIEZpbmQgUkVHTlVNIG9uIHRoZSBzdGFjay4gIE90aGVyd2lzZSwgaXQncyBpbiBhbiBhY3RpdmUgcmVnaXN0ZXIuCisgICBPbmUgdGhpbmcgd2UgbWlnaHQgd2FudCB0byBkbyBoZXJlIGlzIHRvIGNoZWNrIFJFR05VTSBhZ2FpbnN0IHRoZQorICAgY2xvYmJlciBtYXNrLCBhbmQgc29tZWhvdyBmbGFnIGl0IGFzIGludmFsaWQgaWYgaXQgaXNuJ3Qgc2F2ZWQgb24KKyAgIHRoZSBzdGFjayBzb21ld2hlcmUuICBUaGlzIHdvdWxkIHByb3ZpZGUgYSBncmFjZWZ1bCBmYWlsdXJlIG1vZGUKKyAgIHdoZW4gdHJ5aW5nIHRvIGdldCB0aGUgdmFsdWUgb2YgY2FsbGVyLXNhdmVzIHJlZ2lzdGVycyBmb3IgYW4gaW5uZXIKKyAgIGZyYW1lLiAgKi8KKworQ09SRV9BRERSCit2ODUwX2ZpbmRfY2FsbGVyc19yZWcgKGZpLCByZWdudW0pCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKKyAgICAgaW50IHJlZ251bTsKK3sKKyAgZm9yICg7IGZpOyBmaSA9IGZpLT5uZXh0KQorICAgIGlmIChQQ19JTl9DQUxMX0RVTU1ZIChmaS0+cGMsIGZpLT5mcmFtZSwgZmktPmZyYW1lKSkKKyAgICAgIHJldHVybiBnZW5lcmljX3JlYWRfcmVnaXN0ZXJfZHVtbXkgKGZpLT5wYywgZmktPmZyYW1lLCByZWdudW0pOworICAgIGVsc2UgaWYgKGZpLT5mc3IucmVnc1tyZWdudW1dICE9IDApCisgICAgICByZXR1cm4gcmVhZF9tZW1vcnlfdW5zaWduZWRfaW50ZWdlciAoZmktPmZzci5yZWdzW3JlZ251bV0sIAorCQkJCQkgICBSRUdJU1RFUl9SQVdfU0laRShyZWdudW0pKTsKKworICByZXR1cm4gcmVhZF9yZWdpc3RlciAocmVnbnVtKTsKK30KKworLyogRnVuY3Rpb246IHNraXBfcHJvbG9ndWUKKyAgIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgY29kZSBwYXN0IHRoZSBwcm9sb2d1ZSBvZiB0aGUgZnVuY3Rpb24uICAqLworCitDT1JFX0FERFIKK3Y4NTBfc2tpcF9wcm9sb2d1ZSAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgQ09SRV9BRERSIGZ1bmNfYWRkciwgZnVuY19lbmQ7CisKKyAgLyogU2VlIHdoYXQgdGhlIHN5bWJvbCB0YWJsZSBzYXlzICovCisKKyAgaWYgKGZpbmRfcGNfcGFydGlhbF9mdW5jdGlvbiAocGMsIE5VTEwsICZmdW5jX2FkZHIsICZmdW5jX2VuZCkpCisgICAgeworICAgICAgc3RydWN0IHN5bXRhYl9hbmRfbGluZSBzYWw7CisKKyAgICAgIHNhbCA9IGZpbmRfcGNfbGluZSAoZnVuY19hZGRyLCAwKTsKKworICAgICAgaWYgKHNhbC5saW5lICE9IDAgJiYgc2FsLmVuZCA8IGZ1bmNfZW5kKQorCXJldHVybiBzYWwuZW5kOworICAgICAgZWxzZQorCS8qIEVpdGhlciB0aGVyZSdzIG5vIGxpbmUgaW5mbywgb3IgdGhlIGxpbmUgYWZ0ZXIgdGhlIHByb2xvZ3VlIGlzIGFmdGVyCisJICAgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uICBJbiB0aGlzIGNhc2UsIHRoZXJlIHByb2JhYmx5IGlzbid0IGEKKwkgICBwcm9sb2d1ZS4gICovCisJcmV0dXJuIHBjOworICAgIH0KKworLyogV2UgY2FuJ3QgZmluZCB0aGUgc3RhcnQgb2YgdGhpcyBmdW5jdGlvbiwgc28gdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkby4gKi8KKyAgcmV0dXJuIHBjOworfQorCisvKiBGdW5jdGlvbjogcG9wX2ZyYW1lCisgICBUaGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgd2hlbiBlaXRoZXIgdGhlIHVzZXIgdXNlcyB0aGUgYHJldHVybicKKyAgIGNvbW1hbmQsIG9yIHRoZSBjYWxsIGR1bW15IGJyZWFrcG9pbnQgZ2V0cyBoaXQuICAqLworCit2b2lkCit2ODUwX3BvcF9mcmFtZSAoZnJhbWUpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgaW50IHJlZ251bTsKKworICBpZiAoUENfSU5fQ0FMTF9EVU1NWShmcmFtZS0+cGMsIGZyYW1lLT5mcmFtZSwgZnJhbWUtPmZyYW1lKSkKKyAgICBnZW5lcmljX3BvcF9kdW1teV9mcmFtZSAoKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHdyaXRlX3JlZ2lzdGVyIChQQ19SRUdOVU0sIEZSQU1FX1NBVkVEX1BDIChmcmFtZSkpOworCisgICAgICBmb3IgKHJlZ251bSA9IDA7IHJlZ251bSA8IE5VTV9SRUdTOyByZWdudW0rKykKKwlpZiAoZnJhbWUtPmZzci5yZWdzW3JlZ251bV0gIT0gMCkKKwkgIHdyaXRlX3JlZ2lzdGVyIChyZWdudW0sCisJCQkgIHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKGZyYW1lLT5mc3IucmVnc1tyZWdudW1dLAorCQkJCQkJCVJFR0lTVEVSX1JBV19TSVpFKHJlZ251bSkpKTsKKworICAgICAgd3JpdGVfcmVnaXN0ZXIgKFNQX1JFR05VTSwgRlJBTUVfRlAgKGZyYW1lKSk7CisgICAgfQorCisgIGZsdXNoX2NhY2hlZF9mcmFtZXMgKCk7Cit9CisKKy8qIEZ1bmN0aW9uOiBwdXNoX2FyZ3VtZW50cworICAgU2V0dXAgYXJndW1lbnRzIGFuZCBSUCBmb3IgYSBjYWxsIHRvIHRoZSB0YXJnZXQuICBGaXJzdCBmb3VyIGFyZ3MKKyAgIGdvIGluIFI2LT5SOSwgc3Vic2VxdWVudCBhcmdzIGdvIGludG8gc3AgKyAxNiAtPiBzcCArIC4uLiAgU3RydWN0cworICAgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuICA2NCBiaXQgcXVhbnRpdGllcyAoZG91YmxlcyBhbmQgbG9uZworICAgbG9uZ3MpIG1heSBiZSBzcGxpdCBiZXR3ZWVuIHRoZSByZWdzIGFuZCB0aGUgc3RhY2suICBXaGVuIGNhbGxpbmcgYQorICAgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc3RydWN0LCBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBpcyBwYXNzZWQKKyAgIGluIGFzIGEgc2VjcmV0IGZpcnN0IGFyZ3VtZW50IChhbHdheXMgaW4gUjYpLgorCisgICBTdGFjayBzcGFjZSBmb3IgdGhlIGFyZ3MgaGFzIE5PVCBiZWVuIGFsbG9jYXRlZDogdGhhdCBqb2IgaXMgdXAgdG8gdXMuCisgICAqLworCitDT1JFX0FERFIKK3Y4NTBfcHVzaF9hcmd1bWVudHMgKG5hcmdzLCBhcmdzLCBzcCwgc3RydWN0X3JldHVybiwgc3RydWN0X2FkZHIpCisgICAgIGludCBuYXJnczsKKyAgICAgdmFsdWVfcHRyICphcmdzOworICAgICBDT1JFX0FERFIgc3A7CisgICAgIHVuc2lnbmVkIGNoYXIgc3RydWN0X3JldHVybjsKKyAgICAgQ09SRV9BRERSIHN0cnVjdF9hZGRyOworeworICBpbnQgYXJncmVnOworICBpbnQgYXJnbnVtOworICBpbnQgbGVuID0gMDsKKyAgaW50IHN0YWNrX29mZnNldDsKKworICAvKiBGaXJzdCwganVzdCBmb3Igc2FmZXR5LCBtYWtlIHN1cmUgc3RhY2sgaXMgYWxpZ25lZCAqLworICBzcCAmPSB+MzsKKworICAvKiBOb3cgbWFrZSBzcGFjZSBvbiB0aGUgc3RhY2sgZm9yIHRoZSBhcmdzLiAqLworICBmb3IgKGFyZ251bSA9IDA7IGFyZ251bSA8IG5hcmdzOyBhcmdudW0rKykKKyAgICBsZW4gKz0gKChUWVBFX0xFTkdUSChWQUxVRV9UWVBFKGFyZ3NbYXJnbnVtXSkpICsgMykgJiB+Myk7CisgIHNwIC09IGxlbjsJLyogcG9zc2libHkgb3Zlci1hbGxvY2F0aW5nLCBidXQgaXQgd29ya3MuLi4gKi8KKwkJLyogKHlvdSBtaWdodCB0aGluayB3ZSBjb3VsZCBhbGxvY2F0ZSAxNiBieXRlcyAqLworCQkvKiBsZXNzLCBidXQgdGhlIEFCSSBzZWVtcyB0byB1c2UgaXQgYWxsISApICAqLworICBhcmdyZWcgPSBBUkcwX1JFR05VTTsKKworICAvKiB0aGUgc3RydWN0X3JldHVybiBwb2ludGVyIG9jY3VwaWVzIHRoZSBmaXJzdCBwYXJhbWV0ZXItcGFzc2luZyByZWcgKi8KKyAgaWYgKHN0cnVjdF9yZXR1cm4pCisgICAgICB3cml0ZV9yZWdpc3RlciAoYXJncmVnKyssIHN0cnVjdF9hZGRyKTsKKworICBzdGFja19vZmZzZXQgPSAxNjsKKyAgLyogVGhlIG9mZnNldCBvbnRvIHRoZSBzdGFjayBhdCB3aGljaCB3ZSB3aWxsIHN0YXJ0IGNvcHlpbmcgcGFyYW1ldGVycworICAgICAoYWZ0ZXIgdGhlIHJlZ2lzdGVycyBhcmUgdXNlZCB1cCkgYmVnaW5zIGF0IDE2IHJhdGhlciB0aGFuIGF0IHplcm8uCisgICAgIEkgZG9uJ3QgcmVhbGx5IGtub3cgd2h5LCB0aGF0J3MganVzdCB0aGUgd2F5IGl0IHNlZW1zIHRvIHdvcmsuICAqLworCisgIC8qIE5vdyBsb2FkIGFzIG1hbnkgYXMgcG9zc2libGUgb2YgdGhlIGZpcnN0IGFyZ3VtZW50cyBpbnRvCisgICAgIHJlZ2lzdGVycywgYW5kIHB1c2ggdGhlIHJlc3Qgb250byB0aGUgc3RhY2suICBUaGVyZSBhcmUgMTYgYnl0ZXMKKyAgICAgaW4gZm91ciByZWdpc3RlcnMgYXZhaWxhYmxlLiAgTG9vcCB0aHJ1IGFyZ3MgZnJvbSBmaXJzdCB0byBsYXN0LiAgKi8KKyAgZm9yIChhcmdudW0gPSAwOyBhcmdudW0gPCBuYXJnczsgYXJnbnVtKyspCisgICAgeworICAgICAgaW50IGxlbjsKKyAgICAgIGNoYXIgKnZhbDsKKyAgICAgIGNoYXIgdmFsYnVmW1JFR0lTVEVSX1JBV19TSVpFKEFSRzBfUkVHTlVNKV07CisKKyAgICAgIGlmIChUWVBFX0NPREUgKFZBTFVFX1RZUEUgKCphcmdzKSkgPT0gVFlQRV9DT0RFX1NUUlVDVAorCSAgJiYgVFlQRV9MRU5HVEggKFZBTFVFX1RZUEUgKCphcmdzKSkgPiA4KQorCXsKKwkgIHN0b3JlX2FkZHJlc3MgKHZhbGJ1ZiwgNCwgVkFMVUVfQUREUkVTUyAoKmFyZ3MpKTsKKwkgIGxlbiA9IDQ7CisJICB2YWwgPSB2YWxidWY7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGxlbiA9IFRZUEVfTEVOR1RIIChWQUxVRV9UWVBFICgqYXJncykpOworCSAgdmFsID0gKGNoYXIgKilWQUxVRV9DT05URU5UUyAoKmFyZ3MpOworCX0KKworICAgICAgd2hpbGUgKGxlbiA+IDApCisJaWYgIChhcmdyZWcgPD0gQVJHTEFTVF9SRUdOVU0pCisJICB7CisJICAgIENPUkVfQUREUiByZWd2YWw7CisKKwkgICAgcmVndmFsID0gZXh0cmFjdF9hZGRyZXNzICh2YWwsIFJFR0lTVEVSX1JBV19TSVpFIChhcmdyZWcpKTsKKwkgICAgd3JpdGVfcmVnaXN0ZXIgKGFyZ3JlZywgcmVndmFsKTsKKworCSAgICBsZW4gLT0gUkVHSVNURVJfUkFXX1NJWkUgKGFyZ3JlZyk7CisJICAgIHZhbCArPSBSRUdJU1RFUl9SQVdfU0laRSAoYXJncmVnKTsKKwkgICAgYXJncmVnKys7CisJICB9CisJZWxzZQorCSAgeworCSAgICB3cml0ZV9tZW1vcnkgKHNwICsgc3RhY2tfb2Zmc2V0LCB2YWwsIDQpOworCisJICAgIGxlbiAtPSA0OworCSAgICB2YWwgKz0gNDsKKwkgICAgc3RhY2tfb2Zmc2V0ICs9IDQ7CisJICB9CisgICAgICBhcmdzKys7CisgICAgfQorICByZXR1cm4gc3A7Cit9CisKKy8qIEZ1bmN0aW9uOiBwdXNoX3JldHVybl9hZGRyZXNzIChwYykKKyAgIFNldCB1cCB0aGUgcmV0dXJuIGFkZHJlc3MgZm9yIHRoZSBpbmZlcmlvciBmdW5jdGlvbiBjYWxsLgorICAgTmVlZGVkIGZvciB0YXJnZXRzIHdoZXJlIHdlIGRvbid0IGFjdHVhbGx5IGV4ZWN1dGUgYSBKU1IvQlNSIGluc3RydWN0aW9uICovCisgCitDT1JFX0FERFIKK3Y4NTBfcHVzaF9yZXR1cm5fYWRkcmVzcyAocGMsIHNwKQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIENPUkVfQUREUiBzcDsKK3sKKyAgd3JpdGVfcmVnaXN0ZXIgKFJQX1JFR05VTSwgQ0FMTF9EVU1NWV9BRERSRVNTICgpKTsKKyAgcmV0dXJuIHNwOworfQorIAorLyogRnVuY3Rpb246IGZyYW1lX3NhdmVkX3BjIAorICAgRmluZCB0aGUgY2FsbGVyIG9mIHRoaXMgZnJhbWUuICBXZSBkbyB0aGlzIGJ5IHNlZWluZyBpZiBSUF9SRUdOVU0KKyAgIGlzIHNhdmVkIGluIHRoZSBzdGFjayBhbnl3aGVyZSwgb3RoZXJ3aXNlIHdlIGdldCBpdCBmcm9tIHRoZQorICAgcmVnaXN0ZXJzLiAgSWYgdGhlIGlubmVyIGZyYW1lIGlzIGEgZHVtbXkgZnJhbWUsIHJldHVybiBpdHMgUEMKKyAgIGluc3RlYWQgb2YgUlAsIGJlY2F1c2UgdGhhdCdzIHdoZXJlICJjYWxsZXIiIG9mIHRoZSBkdW1teS1mcmFtZQorICAgd2lsbCBiZSBmb3VuZC4gICovCisKK0NPUkVfQUREUgordjg1MF9mcmFtZV9zYXZlZF9wYyAoZmkpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmaTsKK3sKKyAgaWYgKFBDX0lOX0NBTExfRFVNTVkoZmktPnBjLCBmaS0+ZnJhbWUsIGZpLT5mcmFtZSkpCisgICAgcmV0dXJuIGdlbmVyaWNfcmVhZF9yZWdpc3Rlcl9kdW1teShmaS0+cGMsIGZpLT5mcmFtZSwgUENfUkVHTlVNKTsKKyAgZWxzZQorICAgIHJldHVybiB2ODUwX2ZpbmRfY2FsbGVyc19yZWcgKGZpLCBSUF9SRUdOVU0pOworfQorCit2b2lkCitnZXRfc2F2ZWRfcmVnaXN0ZXIgKHJhd19idWZmZXIsIG9wdGltaXplZCwgYWRkcnAsIGZyYW1lLCByZWdudW0sIGx2YWwpCisgICAgIGNoYXIgKnJhd19idWZmZXI7CisgICAgIGludCAqb3B0aW1pemVkOworICAgICBDT1JFX0FERFIgKmFkZHJwOworICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWU7CisgICAgIGludCByZWdudW07CisgICAgIGVudW0gbHZhbF90eXBlICpsdmFsOworeworICBnZW5lcmljX2dldF9zYXZlZF9yZWdpc3RlciAocmF3X2J1ZmZlciwgb3B0aW1pemVkLCBhZGRycCwgCisJCQkgICAgICBmcmFtZSwgcmVnbnVtLCBsdmFsKTsKK30KKworCisvKiBGdW5jdGlvbjogZml4X2NhbGxfZHVtbXkKKyAgIFBva2VzIHRoZSBjYWxsZWUgZnVuY3Rpb24ncyBhZGRyZXNzIGludG8gdGhlIENBTExfRFVNTVkgYXNzZW1ibHkgc3R1Yi4KKyAgIEFzc3VtZXMgdGhhdCB0aGUgQ0FMTF9EVU1NWSBsb29rcyBsaWtlIHRoaXM6CisJamFybCA8b2Zmc2V0MjQ+LCByMzEKKwl0cmFwCisgICAqLworCitpbnQKK3Y4NTBfZml4X2NhbGxfZHVtbXkgKGR1bW15LCBzcCwgZnVuLCBuYXJncywgYXJncywgdHlwZSwgZ2NjX3ApCisgICAgIGNoYXIgKmR1bW15OworICAgICBDT1JFX0FERFIgc3A7CisgICAgIENPUkVfQUREUiBmdW47CisgICAgIGludCBuYXJnczsKKyAgICAgdmFsdWVfcHRyICphcmdzOworICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgaW50IGdjY19wOworeworICBsb25nIG9mZnNldDI0OworCisgIG9mZnNldDI0ID0gKGxvbmcpIGZ1biAtIChsb25nKSBlbnRyeV9wb2ludF9hZGRyZXNzICgpOworICBvZmZzZXQyNCAmPSAweDNmZmZmZjsKKyAgb2Zmc2V0MjQgfD0gMHhmZjgwMDAwMDsJLyogamFybCA8b2Zmc2V0MjQ+LCByMzEgKi8KKworICBzdG9yZV91bnNpZ25lZF9pbnRlZ2VyICgodW5zaWduZWQgaW50ICopJmR1bW15WzJdLCAyLCBvZmZzZXQyNCAmIDB4ZmZmZik7CisgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKCh1bnNpZ25lZCBpbnQgKikmZHVtbXlbMF0sIDIsIG9mZnNldDI0ID4+IDE2KTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIENoYW5nZSB0aGUgcmVnaXN0ZXIgbmFtZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbWFjaGluZSB0eXBlLiAqLworCitzdGF0aWMgaW50Cit2ODUwX3RhcmdldF9hcmNoaXRlY3R1cmVfaG9vayAoYXApCisgICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXA7Cit7CisgIGludCBpLCBqOworCisgIGlmIChhcC0+YXJjaCAhPSBiZmRfYXJjaF92ODUwKQorICAgIHJldHVybiAwOworCisgIGZvciAoaSA9IDA7IHY4NTBfcHJvY2Vzc29yX3R5cGVfdGFibGVbaV0ucmVnbmFtZXMgIT0gTlVMTDsgaSsrKQorICAgIHsKKyAgICAgIGlmICh2ODUwX3Byb2Nlc3Nvcl90eXBlX3RhYmxlW2ldLm1hY2ggPT0gYXAtPm1hY2gpCisJeworCSAgdjg1MF9yZWdpc3Rlcl9uYW1lcyA9IHY4NTBfcHJvY2Vzc29yX3R5cGVfdGFibGVbaV0ucmVnbmFtZXM7CisJICByZXR1cm4gMTsKKwl9CisgICAgfQorCisgIGZhdGFsICgiQXJjaGl0ZWN0dXJlIGAlcycgdW5yZWNvbml6ZWQiLCBhcC0+cHJpbnRhYmxlX25hbWUpOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV92ODUwX3RkZXAgKCkKK3sKKyAgdG1fcHJpbnRfaW5zbiA9IHByaW50X2luc25fdjg1MDsKKyAgdGFyZ2V0X2FyY2hpdGVjdHVyZV9ob29rID0gdjg1MF90YXJnZXRfYXJjaGl0ZWN0dXJlX2hvb2s7Cit9CmRpZmYgLS1naXQgYS9nZGIvdmFsYXJpdGguYyBiL2dkYi92YWxhcml0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhM2FhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdmFsYXJpdGguYwpAQCAtMCwwICsxLDEyNTkgQEAKKy8qIFBlcmZvcm0gYXJpdGhtZXRpYyBhbmQgb3RoZXIgb3BlcmF0aW9ucyBvbiB2YWx1ZXMsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk4NiwgODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJleHByZXNzaW9uLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJkZW1hbmdsZS5oIgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKworLyogRGVmaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBDIG9wZXJhdG9yICcvJyB0cnVuY2F0ZXMgdG93YXJkcyB6ZXJvIGZvcgorICAgZGlmZmVyZW50bHkgc2lnbmVkIG9wZXJhbmRzICh0cnVuY2F0aW9uIGRpcmVjdGlvbiBpcyB1bmRlZmluZWQgaW4gQykuICovCisKKyNpZm5kZWYgVFJVTkNBVElPTl9UT1dBUkRTX1pFUk8KKyNkZWZpbmUgVFJVTkNBVElPTl9UT1dBUkRTX1pFUk8gKCgtNSAvIDIpID09IC0yKQorI2VuZGlmCisKK3N0YXRpYyB2YWx1ZV9wdHIgdmFsdWVfc3Vic2NyaXB0ZWRfcnZhbHVlIFBBUkFNUyAoKHZhbHVlX3B0ciwgdmFsdWVfcHRyLCBpbnQpKTsKKwordm9pZCBfaW5pdGlhbGl6ZV92YWxhcml0aCBQQVJBTVMgKCh2b2lkKSk7CisKKwwKK3ZhbHVlX3B0cgordmFsdWVfYWRkIChhcmcxLCBhcmcyKQorICAgICB2YWx1ZV9wdHIgYXJnMSwgYXJnMjsKK3sKKyAgcmVnaXN0ZXIgdmFsdWVfcHRyIHZhbGludCwgdmFscHRyOworICByZWdpc3RlciBpbnQgbGVuOworICBzdHJ1Y3QgdHlwZSAqdHlwZTEsICp0eXBlMiwgKnZhbHB0cnR5cGU7CisKKyAgQ09FUkNFX05VTUJFUiAoYXJnMSk7CisgIENPRVJDRV9OVU1CRVIgKGFyZzIpOworICB0eXBlMSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZzEpKTsKKyAgdHlwZTIgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFIChhcmcyKSk7CisKKyAgaWYgKChUWVBFX0NPREUgKHR5cGUxKSA9PSBUWVBFX0NPREVfUFRSCisgICAgICAgfHwgVFlQRV9DT0RFICh0eXBlMikgPT0gVFlQRV9DT0RFX1BUUikKKyAgICAgICYmCisgICAgICAoVFlQRV9DT0RFICh0eXBlMSkgPT0gVFlQRV9DT0RFX0lOVAorICAgICAgIHx8IFRZUEVfQ09ERSAodHlwZTIpID09IFRZUEVfQ09ERV9JTlQpKQorICAgIC8qIEV4YWN0bHkgb25lIGFyZ3VtZW50IGlzIGEgcG9pbnRlciwgYW5kIG9uZSBpcyBhbiBpbnRlZ2VyLiAgKi8KKyAgICB7CisgICAgICB2YWx1ZV9wdHIgcmV0dmFsOworCisgICAgICBpZiAoVFlQRV9DT0RFICh0eXBlMSkgPT0gVFlQRV9DT0RFX1BUUikKKwl7CisJICB2YWxwdHIgPSBhcmcxOworCSAgdmFsaW50ID0gYXJnMjsKKwkgIHZhbHB0cnR5cGUgPSB0eXBlMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdmFscHRyID0gYXJnMjsKKwkgIHZhbGludCA9IGFyZzE7CisJICB2YWxwdHJ0eXBlID0gdHlwZTI7CisJfQorICAgICAgbGVuID0gVFlQRV9MRU5HVEggKGNoZWNrX3R5cGVkZWYgKFRZUEVfVEFSR0VUX1RZUEUgKHZhbHB0cnR5cGUpKSk7CisgICAgICBpZiAobGVuID09IDApCisJbGVuID0gMTsJCS8qIEZvciAodm9pZCAqKSAqLworICAgICAgcmV0dmFsID0gdmFsdWVfZnJvbV9sb25nZXN0ICh2YWxwdHJ0eXBlLAorCQkJCSAgIHZhbHVlX2FzX2xvbmcgKHZhbHB0cikKKwkJCQkgICArIChsZW4gKiB2YWx1ZV9hc19sb25nICh2YWxpbnQpKSk7CisgICAgICBWQUxVRV9CRkRfU0VDVElPTiAocmV0dmFsKSA9IFZBTFVFX0JGRF9TRUNUSU9OICh2YWxwdHIpOworICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgcmV0dXJuIHZhbHVlX2Jpbm9wIChhcmcxLCBhcmcyLCBCSU5PUF9BREQpOworfQorCit2YWx1ZV9wdHIKK3ZhbHVlX3N1YiAoYXJnMSwgYXJnMikKKyAgICAgdmFsdWVfcHRyIGFyZzEsIGFyZzI7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlMSwgKnR5cGUyOworICBDT0VSQ0VfTlVNQkVSIChhcmcxKTsKKyAgQ09FUkNFX05VTUJFUiAoYXJnMik7CisgIHR5cGUxID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnMSkpOworICB0eXBlMiA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZzIpKTsKKworICBpZiAoVFlQRV9DT0RFICh0eXBlMSkgPT0gVFlQRV9DT0RFX1BUUikKKyAgICB7CisgICAgICBpZiAoVFlQRV9DT0RFICh0eXBlMikgPT0gVFlQRV9DT0RFX0lOVCkKKwl7CisJICAvKiBwb2ludGVyIC0gaW50ZWdlci4gICovCisJICBMT05HRVNUIHN6ID0gVFlQRV9MRU5HVEggKGNoZWNrX3R5cGVkZWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUxKSkpOworCSAgcmV0dXJuIHZhbHVlX2Zyb21fbG9uZ2VzdAorCSAgICAoVkFMVUVfVFlQRSAoYXJnMSksCisJICAgICB2YWx1ZV9hc19sb25nIChhcmcxKSAtIChzeiAqIHZhbHVlX2FzX2xvbmcgKGFyZzIpKSk7CisJfQorICAgICAgZWxzZSBpZiAoVFlQRV9DT0RFICh0eXBlMikgPT0gVFlQRV9DT0RFX1BUUgorCSAgICAgICAmJiBUWVBFX0xFTkdUSCAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZTEpKQorCQkgID09IFRZUEVfTEVOR1RIIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlMikpKQorCXsKKwkgIC8qIHBvaW50ZXIgdG8gPHR5cGUgeD4gLSBwb2ludGVyIHRvIDx0eXBlIHg+LiAgKi8KKwkgIExPTkdFU1Qgc3ogPSBUWVBFX0xFTkdUSCAoY2hlY2tfdHlwZWRlZiAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZTEpKSk7CisJICByZXR1cm4gdmFsdWVfZnJvbV9sb25nZXN0CisJICAgIChidWlsdGluX3R5cGVfbG9uZywJCS8qIEZJWE1FIC0tIHNob3VsZCBiZSBwdHJkaWZmX3QgKi8KKwkgICAgICh2YWx1ZV9hc19sb25nIChhcmcxKSAtIHZhbHVlX2FzX2xvbmcgKGFyZzIpKSAvIHN6KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZXJyb3IgKCJcCitGaXJzdCBhcmd1bWVudCBvZiBgLScgaXMgYSBwb2ludGVyIGFuZCBzZWNvbmQgYXJndW1lbnQgaXMgbmVpdGhlclxuXAorYW4gaW50ZWdlciBub3IgYSBwb2ludGVyIG9mIHRoZSBzYW1lIHR5cGUuIik7CisJfQorICAgIH0KKworICByZXR1cm4gdmFsdWVfYmlub3AgKGFyZzEsIGFyZzIsIEJJTk9QX1NVQik7Cit9CisKKy8qIFJldHVybiB0aGUgdmFsdWUgb2YgQVJSQVlbSURYXS4KKyAgIFNlZSBjb21tZW50cyBpbiB2YWx1ZV9jb2VyY2VfYXJyYXkoKSBmb3IgcmF0aW9uYWxlIGZvciByZWFzb24gZm9yCisgICBkb2luZyBsb3dlciBib3VuZHMgYWRqdXN0bWVudCBoZXJlIHJhdGhlciB0aGFuIHRoZXJlLgorICAgRklYTUU6ICBQZXJoYXBzIHdlIHNob3VsZCB2YWxpZGF0ZSB0aGF0IHRoZSBpbmRleCBpcyB2YWxpZCBhbmQgaWYKKyAgIHZlcmJvc2l0eSBpcyBzZXQsIHdhcm4gYWJvdXQgaW52YWxpZCBpbmRpY2VzIChidXQgc3RpbGwgdXNlIHRoZW0pLiAqLworCit2YWx1ZV9wdHIKK3ZhbHVlX3N1YnNjcmlwdCAoYXJyYXksIGlkeCkKKyAgICAgdmFsdWVfcHRyIGFycmF5LCBpZHg7Cit7CisgIHZhbHVlX3B0ciBib3VuZDsKKyAgaW50IGNfc3R5bGUgPSBjdXJyZW50X2xhbmd1YWdlLT5jX3N0eWxlX2FycmF5czsKKyAgc3RydWN0IHR5cGUgKnRhcnJheTsKKworICBDT0VSQ0VfUkVGIChhcnJheSk7CisgIHRhcnJheSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFycmF5KSk7CisgIENPRVJDRV9WQVJZSU5HX0FSUkFZIChhcnJheSwgdGFycmF5KTsKKworICBpZiAoVFlQRV9DT0RFICh0YXJyYXkpID09IFRZUEVfQ09ERV9BUlJBWQorICAgICAgfHwgVFlQRV9DT0RFICh0YXJyYXkpID09IFRZUEVfQ09ERV9TVFJJTkcpCisgICAgeworICAgICAgc3RydWN0IHR5cGUgKnJhbmdlX3R5cGUgPSBUWVBFX0lOREVYX1RZUEUgKHRhcnJheSk7CisgICAgICBMT05HRVNUIGxvd2VyYm91bmQsIHVwcGVyYm91bmQ7CisgICAgICBnZXRfZGlzY3JldGVfYm91bmRzIChyYW5nZV90eXBlLCAmbG93ZXJib3VuZCwgJnVwcGVyYm91bmQpOworCisgICAgICBpZiAoVkFMVUVfTFZBTCAoYXJyYXkpICE9IGx2YWxfbWVtb3J5KQorCXJldHVybiB2YWx1ZV9zdWJzY3JpcHRlZF9ydmFsdWUgKGFycmF5LCBpZHgsIGxvd2VyYm91bmQpOworCisgICAgICBpZiAoY19zdHlsZSA9PSAwKQorCXsKKwkgIExPTkdFU1QgaW5kZXggPSB2YWx1ZV9hc19sb25nIChpZHgpOworCSAgaWYgKGluZGV4ID49IGxvd2VyYm91bmQgJiYgaW5kZXggPD0gdXBwZXJib3VuZCkKKwkgICAgcmV0dXJuIHZhbHVlX3N1YnNjcmlwdGVkX3J2YWx1ZSAoYXJyYXksIGlkeCwgbG93ZXJib3VuZCk7CisJICB3YXJuaW5nICgiYXJyYXkgb3Igc3RyaW5nIGluZGV4IG91dCBvZiByYW5nZSIpOworCSAgLyogZmFsbCBkb2luZyBDIHN0dWZmICovCisJICBjX3N0eWxlID0gMTsKKwl9CisKKyAgICAgIGlmIChsb3dlcmJvdW5kICE9IDApCisJeworCSAgYm91bmQgPSB2YWx1ZV9mcm9tX2xvbmdlc3QgKGJ1aWx0aW5fdHlwZV9pbnQsIChMT05HRVNUKSBsb3dlcmJvdW5kKTsKKwkgIGlkeCA9IHZhbHVlX3N1YiAoaWR4LCBib3VuZCk7CisJfQorCisgICAgICBhcnJheSA9IHZhbHVlX2NvZXJjZV9hcnJheSAoYXJyYXkpOworICAgIH0KKworICBpZiAoVFlQRV9DT0RFICh0YXJyYXkpID09IFRZUEVfQ09ERV9CSVRTVFJJTkcpCisgICAgeworICAgICAgc3RydWN0IHR5cGUgKnJhbmdlX3R5cGUgPSBUWVBFX0lOREVYX1RZUEUgKHRhcnJheSk7CisgICAgICBMT05HRVNUIGluZGV4ID0gdmFsdWVfYXNfbG9uZyAoaWR4KTsKKyAgICAgIHZhbHVlX3B0ciB2OworICAgICAgaW50IG9mZnNldCwgYnl0ZSwgYml0X2luZGV4OworICAgICAgTE9OR0VTVCBsb3dlcmJvdW5kLCB1cHBlcmJvdW5kOworICAgICAgZ2V0X2Rpc2NyZXRlX2JvdW5kcyAocmFuZ2VfdHlwZSwgJmxvd2VyYm91bmQsICZ1cHBlcmJvdW5kKTsKKyAgICAgIGlmIChpbmRleCA8IGxvd2VyYm91bmQgfHwgaW5kZXggPiB1cHBlcmJvdW5kKQorCWVycm9yICgiYml0c3RyaW5nIGluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgaW5kZXggLT0gbG93ZXJib3VuZDsKKyAgICAgIG9mZnNldCA9IGluZGV4IC8gVEFSR0VUX0NIQVJfQklUOworICAgICAgYnl0ZSA9ICooKGNoYXIqKVZBTFVFX0NPTlRFTlRTIChhcnJheSkgKyBvZmZzZXQpOworICAgICAgYml0X2luZGV4ID0gaW5kZXggJSBUQVJHRVRfQ0hBUl9CSVQ7CisgICAgICBieXRlID4+PSAoQklUU19CSUdfRU5ESUFOID8gVEFSR0VUX0NIQVJfQklUIC0gMSAtIGJpdF9pbmRleCA6IGJpdF9pbmRleCk7CisgICAgICB2ID0gdmFsdWVfZnJvbV9sb25nZXN0IChMQV9CT09MX1RZUEUsIGJ5dGUgJiAxKTsKKyAgICAgIFZBTFVFX0JJVFBPUyAodikgPSBiaXRfaW5kZXg7CisgICAgICBWQUxVRV9CSVRTSVpFICh2KSA9IDE7CisgICAgICBWQUxVRV9MVkFMICh2KSA9IFZBTFVFX0xWQUwgKGFycmF5KTsKKyAgICAgIGlmIChWQUxVRV9MVkFMIChhcnJheSkgPT0gbHZhbF9pbnRlcm5hbHZhcikKKwlWQUxVRV9MVkFMICh2KSA9IGx2YWxfaW50ZXJuYWx2YXJfY29tcG9uZW50OworICAgICAgVkFMVUVfQUREUkVTUyAodikgPSBWQUxVRV9BRERSRVNTIChhcnJheSk7CisgICAgICBWQUxVRV9PRkZTRVQgKHYpID0gb2Zmc2V0ICsgVkFMVUVfT0ZGU0VUIChhcnJheSk7CisgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgaWYgKGNfc3R5bGUpCisgICAgcmV0dXJuIHZhbHVlX2luZCAodmFsdWVfYWRkIChhcnJheSwgaWR4KSk7CisgIGVsc2UKKyAgICBlcnJvciAoIm5vdCBhbiBhcnJheSBvciBzdHJpbmciKTsKK30KKworLyogUmV0dXJuIHRoZSB2YWx1ZSBvZiBFWFBSW0lEWF0sIGV4cHIgYW4gYWdncmVnYXRlIHJ2YWx1ZQorICAgKGVnLCBhIHZlY3RvciByZWdpc3RlcikuICBUaGlzIHJvdXRpbmUgdXNlZCB0byBwcm9tb3RlIGZsb2F0cworICAgdG8gZG91YmxlcywgYnV0IG5vIGxvbmdlciBkb2VzLiAgKi8KKworc3RhdGljIHZhbHVlX3B0cgordmFsdWVfc3Vic2NyaXB0ZWRfcnZhbHVlIChhcnJheSwgaWR4LCBsb3dlcmJvdW5kKQorICAgICB2YWx1ZV9wdHIgYXJyYXksIGlkeDsKKyAgICAgaW50IGxvd2VyYm91bmQ7Cit7CisgIHN0cnVjdCB0eXBlICphcnJheV90eXBlID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJyYXkpKTsKKyAgc3RydWN0IHR5cGUgKmVsdF90eXBlID0gY2hlY2tfdHlwZWRlZiAoVFlQRV9UQVJHRVRfVFlQRSAoYXJyYXlfdHlwZSkpOworICB1bnNpZ25lZCBpbnQgZWx0X3NpemUgPSBUWVBFX0xFTkdUSCAoZWx0X3R5cGUpOworICBMT05HRVNUIGluZGV4ID0gdmFsdWVfYXNfbG9uZyAoaWR4KTsKKyAgdW5zaWduZWQgaW50IGVsdF9vZmZzID0gZWx0X3NpemUgKiBsb25nZXN0X3RvX2ludCAoaW5kZXggLSBsb3dlcmJvdW5kKTsKKyAgdmFsdWVfcHRyIHY7CisKKyAgaWYgKGluZGV4IDwgbG93ZXJib3VuZCB8fCBlbHRfb2ZmcyA+PSBUWVBFX0xFTkdUSCAoYXJyYXlfdHlwZSkpCisgICAgZXJyb3IgKCJubyBzdWNoIHZlY3RvciBlbGVtZW50Iik7CisKKyAgdiA9IGFsbG9jYXRlX3ZhbHVlIChlbHRfdHlwZSk7CisgIGlmIChWQUxVRV9MQVpZIChhcnJheSkpCisgICAgVkFMVUVfTEFaWSAodikgPSAxOworICBlbHNlCisgICAgbWVtY3B5IChWQUxVRV9DT05URU5UUyAodiksIFZBTFVFX0NPTlRFTlRTIChhcnJheSkgKyBlbHRfb2ZmcywgZWx0X3NpemUpOworCisgIGlmIChWQUxVRV9MVkFMIChhcnJheSkgPT0gbHZhbF9pbnRlcm5hbHZhcikKKyAgICBWQUxVRV9MVkFMICh2KSA9IGx2YWxfaW50ZXJuYWx2YXJfY29tcG9uZW50OworICBlbHNlCisgICAgVkFMVUVfTFZBTCAodikgPSBWQUxVRV9MVkFMIChhcnJheSk7CisgIFZBTFVFX0FERFJFU1MgKHYpID0gVkFMVUVfQUREUkVTUyAoYXJyYXkpOworICBWQUxVRV9PRkZTRVQgKHYpID0gVkFMVUVfT0ZGU0VUIChhcnJheSkgKyBlbHRfb2ZmczsKKyAgcmV0dXJuIHY7Cit9CisMCisvKiBDaGVjayB0byBzZWUgaWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgc3RydWN0dXJlLiAgVGhpcyBpcyBjYWxsZWQgc28KKyAgIHdlIGtub3cgd2hldGhlciB0byBnbyBhaGVhZCB3aXRoIHRoZSBub3JtYWwgYmlub3Agb3IgbG9vayBmb3IgYSAKKyAgIHVzZXIgZGVmaW5lZCBmdW5jdGlvbiBpbnN0ZWFkLgorCisgICBGb3Igbm93LCB3ZSBkbyBub3Qgb3ZlcmxvYWQgdGhlIGA9JyBvcGVyYXRvci4gICovCisKK2ludAorYmlub3BfdXNlcl9kZWZpbmVkX3AgKG9wLCBhcmcxLCBhcmcyKQorICAgICBlbnVtIGV4cF9vcGNvZGUgb3A7CisgICAgIHZhbHVlX3B0ciBhcmcxLCBhcmcyOworeworICBzdHJ1Y3QgdHlwZSAqdHlwZTEsICp0eXBlMjsKKyAgaWYgKG9wID09IEJJTk9QX0FTU0lHTiB8fCBvcCA9PSBCSU5PUF9DT05DQVQpCisgICAgcmV0dXJuIDA7CisgIHR5cGUxID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnMSkpOworICB0eXBlMiA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZzIpKTsKKyAgcmV0dXJuIChUWVBFX0NPREUgKHR5cGUxKSA9PSBUWVBFX0NPREVfU1RSVUNUCisJICB8fCBUWVBFX0NPREUgKHR5cGUyKSA9PSBUWVBFX0NPREVfU1RSVUNUCisJICB8fCAoVFlQRV9DT0RFICh0eXBlMSkgPT0gVFlQRV9DT0RFX1JFRgorCSAgICAgICYmIFRZUEVfQ09ERSAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZTEpKSA9PSBUWVBFX0NPREVfU1RSVUNUKQorCSAgfHwgKFRZUEVfQ09ERSAodHlwZTIpID09IFRZUEVfQ09ERV9SRUYKKwkgICAgICAmJiBUWVBFX0NPREUgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUyKSkgPT0gVFlQRV9DT0RFX1NUUlVDVCkpOworfQorCisvKiBDaGVjayB0byBzZWUgaWYgYXJndW1lbnQgaXMgYSBzdHJ1Y3R1cmUuICBUaGlzIGlzIGNhbGxlZCBzbworICAgd2Uga25vdyB3aGV0aGVyIHRvIGdvIGFoZWFkIHdpdGggdGhlIG5vcm1hbCB1bm9wIG9yIGxvb2sgZm9yIGEgCisgICB1c2VyIGRlZmluZWQgZnVuY3Rpb24gaW5zdGVhZC4KKworICAgRm9yIG5vdywgd2UgZG8gbm90IG92ZXJsb2FkIHRoZSBgJicgb3BlcmF0b3IuICAqLworCitpbnQgdW5vcF91c2VyX2RlZmluZWRfcCAob3AsIGFyZzEpCisgICAgIGVudW0gZXhwX29wY29kZSBvcDsKKyAgICAgdmFsdWVfcHRyIGFyZzE7Cit7CisgIHN0cnVjdCB0eXBlICp0eXBlMTsKKyAgaWYgKG9wID09IFVOT1BfQUREUikKKyAgICByZXR1cm4gMDsKKyAgdHlwZTEgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFIChhcmcxKSk7CisgIGZvciAoOzspCisgICAgeworICAgICAgaWYgKFRZUEVfQ09ERSAodHlwZTEpID09IFRZUEVfQ09ERV9TVFJVQ1QpCisJcmV0dXJuIDE7CisgICAgICBlbHNlIGlmIChUWVBFX0NPREUgKHR5cGUxKSA9PSBUWVBFX0NPREVfUkVGKQorCXR5cGUxID0gVFlQRV9UQVJHRVRfVFlQRSAodHlwZTEpOworICAgICAgZWxzZQorCXJldHVybiAwOworICAgIH0KK30KKworLyogV2Uga25vdyBlaXRoZXIgYXJnMSBvciBhcmcyIGlzIGEgc3RydWN0dXJlLCBzbyB0cnkgdG8gZmluZCB0aGUgcmlnaHQKKyAgIHVzZXIgZGVmaW5lZCBmdW5jdGlvbi4gIENyZWF0ZSBhbiBhcmd1bWVudCB2ZWN0b3IgdGhhdCBjYWxscyAKKyAgIGFyZzEub3BlcmF0b3IgQCAoYXJnMSxhcmcyKSBhbmQgcmV0dXJuIHRoYXQgdmFsdWUgKHdoZXJlICdAJyBpcyBhbnkKKyAgIGJpbmFyeSBvcGVyYXRvciB3aGljaCBpcyBsZWdhbCBmb3IgR05VIEMrKykuCisKKyAgIE9QIGlzIHRoZSBvcGVyYXRvcmUsIGFuZCBpZiBpdCBpcyBCSU5PUF9BU1NJR05fTU9ESUZZLCB0aGVuIE9USEVST1AKKyAgIGlzIHRoZSBvcGNvZGUgc2F5aW5nIGhvdyB0byBtb2RpZnkgaXQuICBPdGhlcndpc2UsIE9USEVST1AgaXMKKyAgIHVudXNlZC4gICovCisKK3ZhbHVlX3B0cgordmFsdWVfeF9iaW5vcCAoYXJnMSwgYXJnMiwgb3AsIG90aGVyb3AsIG5vc2lkZSkKKyAgICAgdmFsdWVfcHRyIGFyZzEsIGFyZzI7CisgICAgIGVudW0gZXhwX29wY29kZSBvcCwgb3RoZXJvcDsKKyAgICAgZW51bSBub3NpZGUgbm9zaWRlOworeworICB2YWx1ZV9wdHIgKiBhcmd2ZWM7CisgIGNoYXIgKnB0cjsKKyAgY2hhciB0c3RyWzEzXTsKKyAgaW50IHN0YXRpY19tZW1mdW5jcDsKKworICBDT0VSQ0VfUkVGIChhcmcxKTsKKyAgQ09FUkNFX1JFRiAoYXJnMik7CisgIENPRVJDRV9FTlVNIChhcmcxKTsKKyAgQ09FUkNFX0VOVU0gKGFyZzIpOworCisgIC8qIG5vdyB3ZSBrbm93IHRoYXQgd2hhdCB3ZSBoYXZlIHRvIGRvIGlzIGNvbnN0cnVjdCBvdXIKKyAgICAgYXJnIHZlY3RvciBhbmQgZmluZCB0aGUgcmlnaHQgZnVuY3Rpb24gdG8gY2FsbCBpdCB3aXRoLiAgKi8KKworICBpZiAoVFlQRV9DT0RFIChjaGVja190eXBlZGVmIChWQUxVRV9UWVBFIChhcmcxKSkpICE9IFRZUEVfQ09ERV9TVFJVQ1QpCisgICAgZXJyb3IgKCJDYW4ndCBkbyB0aGF0IGJpbmFyeSBvcCBvbiB0aGF0IHR5cGUiKTsgIC8qIEZJWE1FIGJlIGV4cGxpY2l0ICovCisKKyAgYXJndmVjID0gKHZhbHVlX3B0ciAqKSBhbGxvY2EgKHNpemVvZiAodmFsdWVfcHRyKSAqIDQpOworICBhcmd2ZWNbMV0gPSB2YWx1ZV9hZGRyIChhcmcxKTsKKyAgYXJndmVjWzJdID0gYXJnMjsKKyAgYXJndmVjWzNdID0gMDsKKworICAvKiBtYWtlIHRoZSByaWdodCBmdW5jdGlvbiBuYW1lIHVwICovICAKKyAgc3RyY3B5KHRzdHIsICJvcGVyYXRvcl9fIik7CisgIHB0ciA9IHRzdHIrODsKKyAgc3dpdGNoIChvcCkKKyAgICB7CisgICAgY2FzZSBCSU5PUF9BREQ6CQlzdHJjcHkocHRyLCIrIik7IGJyZWFrOworICAgIGNhc2UgQklOT1BfU1VCOgkJc3RyY3B5KHB0ciwiLSIpOyBicmVhazsKKyAgICBjYXNlIEJJTk9QX01VTDoJCXN0cmNweShwdHIsIioiKTsgYnJlYWs7CisgICAgY2FzZSBCSU5PUF9ESVY6CQlzdHJjcHkocHRyLCIvIik7IGJyZWFrOworICAgIGNhc2UgQklOT1BfUkVNOgkJc3RyY3B5KHB0ciwiJSIpOyBicmVhazsKKyAgICBjYXNlIEJJTk9QX0xTSDoJCXN0cmNweShwdHIsIjw8Iik7IGJyZWFrOworICAgIGNhc2UgQklOT1BfUlNIOgkJc3RyY3B5KHB0ciwiPj4iKTsgYnJlYWs7CisgICAgY2FzZSBCSU5PUF9CSVRXSVNFX0FORDoJc3RyY3B5KHB0ciwiJiIpOyBicmVhazsKKyAgICBjYXNlIEJJTk9QX0JJVFdJU0VfSU9SOglzdHJjcHkocHRyLCJ8Iik7IGJyZWFrOworICAgIGNhc2UgQklOT1BfQklUV0lTRV9YT1I6CXN0cmNweShwdHIsIl4iKTsgYnJlYWs7CisgICAgY2FzZSBCSU5PUF9MT0dJQ0FMX0FORDoJc3RyY3B5KHB0ciwiJiYiKTsgYnJlYWs7CisgICAgY2FzZSBCSU5PUF9MT0dJQ0FMX09SOglzdHJjcHkocHRyLCJ8fCIpOyBicmVhazsKKyAgICBjYXNlIEJJTk9QX01JTjoJCXN0cmNweShwdHIsIjw/Iik7IGJyZWFrOworICAgIGNhc2UgQklOT1BfTUFYOgkJc3RyY3B5KHB0ciwiPj8iKTsgYnJlYWs7CisgICAgY2FzZSBCSU5PUF9BU1NJR046CQlzdHJjcHkocHRyLCI9Iik7IGJyZWFrOworICAgIGNhc2UgQklOT1BfQVNTSUdOX01PRElGWToJCisgICAgICBzd2l0Y2ggKG90aGVyb3ApCisJeworCWNhc2UgQklOT1BfQUREOgkJc3RyY3B5KHB0ciwiKz0iKTsgYnJlYWs7CisJY2FzZSBCSU5PUF9TVUI6CQlzdHJjcHkocHRyLCItPSIpOyBicmVhazsKKwljYXNlIEJJTk9QX01VTDoJCXN0cmNweShwdHIsIio9Iik7IGJyZWFrOworCWNhc2UgQklOT1BfRElWOgkJc3RyY3B5KHB0ciwiLz0iKTsgYnJlYWs7CisJY2FzZSBCSU5PUF9SRU06CQlzdHJjcHkocHRyLCIlPSIpOyBicmVhazsKKwljYXNlIEJJTk9QX0JJVFdJU0VfQU5EOglzdHJjcHkocHRyLCImPSIpOyBicmVhazsKKwljYXNlIEJJTk9QX0JJVFdJU0VfSU9SOglzdHJjcHkocHRyLCJ8PSIpOyBicmVhazsKKwljYXNlIEJJTk9QX0JJVFdJU0VfWE9SOglzdHJjcHkocHRyLCJePSIpOyBicmVhazsKKwljYXNlIEJJTk9QX01PRDoJCS8qIGludmFsaWQgKi8KKwlkZWZhdWx0OgorCSAgZXJyb3IgKCJJbnZhbGlkIGJpbmFyeSBvcGVyYXRpb24gc3BlY2lmaWVkLiIpOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklOT1BfU1VCU0NSSVBUOiBzdHJjcHkocHRyLCJbXSIpOyBicmVhazsKKyAgICBjYXNlIEJJTk9QX0VRVUFMOgkgIHN0cmNweShwdHIsIj09Iik7IGJyZWFrOworICAgIGNhc2UgQklOT1BfTk9URVFVQUw6ICBzdHJjcHkocHRyLCIhPSIpOyBicmVhazsKKyAgICBjYXNlIEJJTk9QX0xFU1M6ICAgICAgc3RyY3B5KHB0ciwiPCIpOyBicmVhazsKKyAgICBjYXNlIEJJTk9QX0dUUjogICAgICAgc3RyY3B5KHB0ciwiPiIpOyBicmVhazsKKyAgICBjYXNlIEJJTk9QX0dFUTogICAgICAgc3RyY3B5KHB0ciwiPj0iKTsgYnJlYWs7CisgICAgY2FzZSBCSU5PUF9MRVE6ICAgICAgIHN0cmNweShwdHIsIjw9Iik7IGJyZWFrOworICAgIGNhc2UgQklOT1BfTU9EOgkgIC8qIGludmFsaWQgKi8KKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IgKCJJbnZhbGlkIGJpbmFyeSBvcGVyYXRpb24gc3BlY2lmaWVkLiIpOworICAgIH0KKworICBhcmd2ZWNbMF0gPSB2YWx1ZV9zdHJ1Y3RfZWx0ICgmYXJnMSwgYXJndmVjKzEsIHRzdHIsICZzdGF0aWNfbWVtZnVuY3AsICJzdHJ1Y3R1cmUiKTsKKyAgCisgIGlmIChhcmd2ZWNbMF0pCisgICAgeworICAgICAgaWYgKHN0YXRpY19tZW1mdW5jcCkKKwl7CisJICBhcmd2ZWNbMV0gPSBhcmd2ZWNbMF07CisJICBhcmd2ZWMrKzsKKwl9CisgICAgICBpZiAobm9zaWRlID09IEVWQUxfQVZPSURfU0lERV9FRkZFQ1RTKQorCXsKKwkgIHN0cnVjdCB0eXBlICpyZXR1cm5fdHlwZTsKKwkgIHJldHVybl90eXBlCisJICAgID0gVFlQRV9UQVJHRVRfVFlQRSAoY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJndmVjWzBdKSkpOworCSAgcmV0dXJuIHZhbHVlX3plcm8gKHJldHVybl90eXBlLCBWQUxVRV9MVkFMIChhcmcxKSk7CisJfQorICAgICAgcmV0dXJuIGNhbGxfZnVuY3Rpb25fYnlfaGFuZCAoYXJndmVjWzBdLCAyIC0gc3RhdGljX21lbWZ1bmNwLCBhcmd2ZWMgKyAxKTsKKyAgICB9CisgIGVycm9yICgibWVtYmVyIGZ1bmN0aW9uICVzIG5vdCBmb3VuZCIsIHRzdHIpOworI2lmZGVmIGxpbnQKKyAgcmV0dXJuIGNhbGxfZnVuY3Rpb25fYnlfaGFuZCAoYXJndmVjWzBdLCAyIC0gc3RhdGljX21lbWZ1bmNwLCBhcmd2ZWMgKyAxKTsKKyNlbmRpZgorfQorCisvKiBXZSBrbm93IHRoYXQgYXJnMSBpcyBhIHN0cnVjdHVyZSwgc28gdHJ5IHRvIGZpbmQgYSB1bmFyeSB1c2VyCisgICBkZWZpbmVkIG9wZXJhdG9yIHRoYXQgbWF0Y2hlcyB0aGUgb3BlcmF0b3IgaW4gcXVlc3Rpb24uICAKKyAgIENyZWF0ZSBhbiBhcmd1bWVudCB2ZWN0b3IgdGhhdCBjYWxscyBhcmcxLm9wZXJhdG9yIEAgKGFyZzEpCisgICBhbmQgcmV0dXJuIHRoYXQgdmFsdWUgKHdoZXJlICdAJyBpcyAoYWxtb3N0KSBhbnkgdW5hcnkgb3BlcmF0b3Igd2hpY2gKKyAgIGlzIGxlZ2FsIGZvciBHTlUgQysrKS4gICovCisKK3ZhbHVlX3B0cgordmFsdWVfeF91bm9wIChhcmcxLCBvcCwgbm9zaWRlKQorICAgICB2YWx1ZV9wdHIgYXJnMTsKKyAgICAgZW51bSBleHBfb3Bjb2RlIG9wOworICAgICBlbnVtIG5vc2lkZSBub3NpZGU7Cit7CisgIHZhbHVlX3B0ciAqIGFyZ3ZlYzsKKyAgY2hhciAqcHRyLCAqbWFuZ2xlX3B0cjsKKyAgY2hhciB0c3RyWzEzXSwgbWFuZ2xlX3RzdHJbMTNdOworICBpbnQgc3RhdGljX21lbWZ1bmNwOworCisgIENPRVJDRV9SRUYgKGFyZzEpOworICBDT0VSQ0VfRU5VTSAoYXJnMSk7CisKKyAgLyogbm93IHdlIGtub3cgdGhhdCB3aGF0IHdlIGhhdmUgdG8gZG8gaXMgY29uc3RydWN0IG91cgorICAgICBhcmcgdmVjdG9yIGFuZCBmaW5kIHRoZSByaWdodCBmdW5jdGlvbiB0byBjYWxsIGl0IHdpdGguICAqLworCisgIGlmIChUWVBFX0NPREUgKGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZzEpKSkgIT0gVFlQRV9DT0RFX1NUUlVDVCkKKyAgICBlcnJvciAoIkNhbid0IGRvIHRoYXQgdW5hcnkgb3Agb24gdGhhdCB0eXBlIik7ICAvKiBGSVhNRSBiZSBleHBsaWNpdCAqLworCisgIGFyZ3ZlYyA9ICh2YWx1ZV9wdHIgKikgYWxsb2NhIChzaXplb2YgKHZhbHVlX3B0cikgKiAzKTsKKyAgYXJndmVjWzFdID0gdmFsdWVfYWRkciAoYXJnMSk7CisgIGFyZ3ZlY1syXSA9IDA7CisKKyAgLyogbWFrZSB0aGUgcmlnaHQgZnVuY3Rpb24gbmFtZSB1cCAqLyAgCisgIHN0cmNweSh0c3RyLCJvcGVyYXRvcl9fIik7CisgIHB0ciA9IHRzdHIrODsKKyAgc3RyY3B5KG1hbmdsZV90c3RyLCAiX18iKTsKKyAgbWFuZ2xlX3B0ciA9IG1hbmdsZV90c3RyKzI7CisgIHN3aXRjaCAob3ApCisgICAgeworICAgIGNhc2UgVU5PUF9QUkVJTkNSRU1FTlQ6CXN0cmNweShwdHIsIisrIik7IGJyZWFrOworICAgIGNhc2UgVU5PUF9QUkVERUNSRU1FTlQ6CXN0cmNweShwdHIsIisrIik7IGJyZWFrOworICAgIGNhc2UgVU5PUF9QT1NUSU5DUkVNRU5UOglzdHJjcHkocHRyLCIrKyIpOyBicmVhazsKKyAgICBjYXNlIFVOT1BfUE9TVERFQ1JFTUVOVDoJc3RyY3B5KHB0ciwiKysiKTsgYnJlYWs7CisgICAgY2FzZSBVTk9QX0xPR0lDQUxfTk9UOglzdHJjcHkocHRyLCIhIik7IGJyZWFrOworICAgIGNhc2UgVU5PUF9DT01QTEVNRU5UOglzdHJjcHkocHRyLCJ+Iik7IGJyZWFrOworICAgIGNhc2UgVU5PUF9ORUc6CQlzdHJjcHkocHRyLCItIik7IGJyZWFrOworICAgIGNhc2UgVU5PUF9JTkQ6CQlzdHJjcHkocHRyLCIqIik7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciAoIkludmFsaWQgdW5hcnkgb3BlcmF0aW9uIHNwZWNpZmllZC4iKTsKKyAgICB9CisKKyAgYXJndmVjWzBdID0gdmFsdWVfc3RydWN0X2VsdCAoJmFyZzEsIGFyZ3ZlYysxLCB0c3RyLCAmc3RhdGljX21lbWZ1bmNwLCAic3RydWN0dXJlIik7CisKKyAgaWYgKGFyZ3ZlY1swXSkKKyAgICB7CisgICAgICBpZiAoc3RhdGljX21lbWZ1bmNwKQorCXsKKwkgIGFyZ3ZlY1sxXSA9IGFyZ3ZlY1swXTsKKwkgIGFyZ3ZlYysrOworCX0KKyAgICAgIGlmIChub3NpZGUgPT0gRVZBTF9BVk9JRF9TSURFX0VGRkVDVFMpCisJeworCSAgc3RydWN0IHR5cGUgKnJldHVybl90eXBlOworCSAgcmV0dXJuX3R5cGUKKwkgICAgPSBUWVBFX1RBUkdFVF9UWVBFIChjaGVja190eXBlZGVmIChWQUxVRV9UWVBFIChhcmd2ZWNbMF0pKSk7CisJICByZXR1cm4gdmFsdWVfemVybyAocmV0dXJuX3R5cGUsIFZBTFVFX0xWQUwgKGFyZzEpKTsKKwl9CisgICAgICByZXR1cm4gY2FsbF9mdW5jdGlvbl9ieV9oYW5kIChhcmd2ZWNbMF0sIDEgLSBzdGF0aWNfbWVtZnVuY3AsIGFyZ3ZlYyArIDEpOworICAgIH0KKyAgZXJyb3IgKCJtZW1iZXIgZnVuY3Rpb24gJXMgbm90IGZvdW5kIiwgdHN0cik7CisgIHJldHVybiAwOyAgLyogRm9yIGxpbnQgLS0gbmV2ZXIgcmVhY2hlZCAqLworfQorCisMCisvKiBDb25jYXRlbmF0ZSB0d28gdmFsdWVzIHdpdGggdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAoMSkJQm90aCB2YWx1ZXMgbXVzdCBiZSBlaXRoZXIgYml0c3RyaW5nIHZhbHVlcyBvciBjaGFyYWN0ZXIgc3RyaW5nCisJdmFsdWVzIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlIGNvbnNpc3RzIG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mCisJQVJHMSBmb2xsb3dlZCBieSBBUkcyLgorCisJb3IKKworCU9uZSB2YWx1ZSBtdXN0IGJlIGFuIGludGVnZXIgdmFsdWUgYW5kIHRoZSBvdGhlciB2YWx1ZSBtdXN0IGJlCisJZWl0aGVyIGEgYml0c3RyaW5nIHZhbHVlIG9yIGNoYXJhY3RlciBzdHJpbmcgdmFsdWUsIHdoaWNoIGlzCisJdG8gYmUgcmVwZWF0ZWQgYnkgdGhlIG51bWJlciBvZiB0aW1lcyBzcGVjaWZpZWQgYnkgdGhlIGludGVnZXIKKwl2YWx1ZS4KKworCisgICAgKDIpCUJvb2xlYW4gdmFsdWVzIGFyZSBhbHNvIGFsbG93ZWQgYW5kIGFyZSB0cmVhdGVkIGFzIGJpdCBzdHJpbmcKKyAgICAJdmFsdWVzIG9mIGxlbmd0aCAxLgorCisgICAgKDMpCUNoYXJhY3RlciB2YWx1ZXMgYXJlIGFsc28gYWxsb3dlZCBhbmQgYXJlIHRyZWF0ZWQgYXMgY2hhcmFjdGVyCisgICAgCXN0cmluZyB2YWx1ZXMgb2YgbGVuZ3RoIDEuCisqLworCit2YWx1ZV9wdHIKK3ZhbHVlX2NvbmNhdCAoYXJnMSwgYXJnMikKKyAgICAgdmFsdWVfcHRyIGFyZzEsIGFyZzI7Cit7CisgIHJlZ2lzdGVyIHZhbHVlX3B0ciBpbnZhbDEsIGludmFsMiwgb3V0dmFsOworICBpbnQgaW52YWwxbGVuLCBpbnZhbDJsZW47CisgIGludCBjb3VudCwgaWR4OworICBjaGFyICpwdHI7CisgIGNoYXIgaW5jaGFyOworICBzdHJ1Y3QgdHlwZSAqdHlwZTEgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFIChhcmcxKSk7CisgIHN0cnVjdCB0eXBlICp0eXBlMiA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZzIpKTsKKworICBDT0VSQ0VfVkFSWUlOR19BUlJBWSAoYXJnMSwgdHlwZTEpOworICBDT0VSQ0VfVkFSWUlOR19BUlJBWSAoYXJnMiwgdHlwZTIpOworCisgIC8qIEZpcnN0IGZpZ3VyZSBvdXQgaWYgd2UgYXJlIGRlYWxpbmcgd2l0aCB0d28gdmFsdWVzIHRvIGJlIGNvbmNhdGVuYXRlZAorICAgICBvciBhIHJlcGVhdCBjb3VudCBhbmQgYSB2YWx1ZSB0byBiZSByZXBlYXRlZC4gIElOVkFMMSBpcyBzZXQgdG8gdGhlCisgICAgIGZpcnN0IG9mIHR3byBjb25jYXRlbmF0ZWQgdmFsdWVzLCBvciB0aGUgcmVwZWF0IGNvdW50LiAgSU5WQUwyIGlzIHNldAorICAgICB0byB0aGUgc2Vjb25kIG9mIHRoZSB0d28gY29uY2F0ZW5hdGVkIHZhbHVlcyBvciB0aGUgdmFsdWUgdG8gYmUgCisgICAgIHJlcGVhdGVkLiAqLworCisgIGlmIChUWVBFX0NPREUgKHR5cGUyKSA9PSBUWVBFX0NPREVfSU5UKQorICAgIHsKKyAgICAgIHN0cnVjdCB0eXBlICp0bXAgPSB0eXBlMTsKKyAgICAgIHR5cGUxID0gdG1wOworICAgICAgdG1wID0gdHlwZTI7CisgICAgICBpbnZhbDEgPSBhcmcyOworICAgICAgaW52YWwyID0gYXJnMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnZhbDEgPSBhcmcxOworICAgICAgaW52YWwyID0gYXJnMjsKKyAgICB9CisKKyAgLyogTm93IHByb2Nlc3MgdGhlIGlucHV0IHZhbHVlcy4gKi8KKworICBpZiAoVFlQRV9DT0RFICh0eXBlMSkgPT0gVFlQRV9DT0RFX0lOVCkKKyAgICB7CisgICAgICAvKiBXZSBoYXZlIGEgcmVwZWF0IGNvdW50LiAgVmFsaWRhdGUgdGhlIHNlY29uZCB2YWx1ZSBhbmQgdGhlbgorCSBjb25zdHJ1Y3QgYSB2YWx1ZSByZXBlYXRlZCB0aGF0IG1hbnkgdGltZXMuICovCisgICAgICBpZiAoVFlQRV9DT0RFICh0eXBlMikgPT0gVFlQRV9DT0RFX1NUUklORworCSAgfHwgVFlQRV9DT0RFICh0eXBlMikgPT0gVFlQRV9DT0RFX0NIQVIpCisJeworCSAgY291bnQgPSBsb25nZXN0X3RvX2ludCAodmFsdWVfYXNfbG9uZyAoaW52YWwxKSk7CisJICBpbnZhbDJsZW4gPSBUWVBFX0xFTkdUSCAodHlwZTIpOworCSAgcHRyID0gKGNoYXIgKikgYWxsb2NhIChjb3VudCAqIGludmFsMmxlbik7CisJICBpZiAoVFlQRV9DT0RFICh0eXBlMikgPT0gVFlQRV9DT0RFX0NIQVIpCisJICAgIHsKKwkgICAgICBpbmNoYXIgPSAoY2hhcikgdW5wYWNrX2xvbmcgKHR5cGUyLAorCQkJCQkgICBWQUxVRV9DT05URU5UUyAoaW52YWwyKSk7CisJICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBjb3VudDsgaWR4KyspCisJCXsKKwkJICAqKHB0ciArIGlkeCkgPSBpbmNoYXI7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBjb3VudDsgaWR4KyspCisJCXsKKwkJICBtZW1jcHkgKHB0ciArIChpZHggKiBpbnZhbDJsZW4pLCBWQUxVRV9DT05URU5UUyAoaW52YWwyKSwKKwkJCSAgaW52YWwybGVuKTsKKwkJfQorCSAgICB9CisJICBvdXR2YWwgPSB2YWx1ZV9zdHJpbmcgKHB0ciwgY291bnQgKiBpbnZhbDJsZW4pOworCX0KKyAgICAgIGVsc2UgaWYgKFRZUEVfQ09ERSAodHlwZTIpID09IFRZUEVfQ09ERV9CSVRTVFJJTkcKKwkgICAgICAgfHwgVFlQRV9DT0RFICh0eXBlMikgPT0gVFlQRV9DT0RFX0JPT0wpCisJeworCSAgZXJyb3IgKCJ1bmltcGxlbWVudGVkIHN1cHBvcnQgZm9yIGJpdHN0cmluZy9ib29sZWFuIHJlcGVhdHMiKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZXJyb3IgKCJjYW4ndCByZXBlYXQgdmFsdWVzIG9mIHRoYXQgdHlwZSIpOworCX0KKyAgICB9CisgIGVsc2UgaWYgKFRZUEVfQ09ERSAodHlwZTEpID09IFRZUEVfQ09ERV9TVFJJTkcKKyAgICAgIHx8IFRZUEVfQ09ERSAodHlwZTEpID09IFRZUEVfQ09ERV9DSEFSKQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgdHdvIGNoYXJhY3RlciBzdHJpbmdzIHRvIGNvbmNhdGVuYXRlLiAqLworICAgICAgaWYgKFRZUEVfQ09ERSAodHlwZTIpICE9IFRZUEVfQ09ERV9TVFJJTkcKKwkgICYmIFRZUEVfQ09ERSAodHlwZTIpICE9IFRZUEVfQ09ERV9DSEFSKQorCXsKKwkgIGVycm9yICgiU3RyaW5ncyBjYW4gb25seSBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlciBzdHJpbmdzLiIpOworCX0KKyAgICAgIGludmFsMWxlbiA9IFRZUEVfTEVOR1RIICh0eXBlMSk7CisgICAgICBpbnZhbDJsZW4gPSBUWVBFX0xFTkdUSCAodHlwZTIpOworICAgICAgcHRyID0gKGNoYXIgKikgYWxsb2NhIChpbnZhbDFsZW4gKyBpbnZhbDJsZW4pOworICAgICAgaWYgKFRZUEVfQ09ERSAodHlwZTEpID09IFRZUEVfQ09ERV9DSEFSKQorCXsKKwkgICpwdHIgPSAoY2hhcikgdW5wYWNrX2xvbmcgKHR5cGUxLCBWQUxVRV9DT05URU5UUyAoaW52YWwxKSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1lbWNweSAocHRyLCBWQUxVRV9DT05URU5UUyAoaW52YWwxKSwgaW52YWwxbGVuKTsKKwl9CisgICAgICBpZiAoVFlQRV9DT0RFICh0eXBlMikgPT0gVFlQRV9DT0RFX0NIQVIpCisJeworCSAgKihwdHIgKyBpbnZhbDFsZW4pID0gCisJICAgIChjaGFyKSB1bnBhY2tfbG9uZyAodHlwZTIsIFZBTFVFX0NPTlRFTlRTIChpbnZhbDIpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbWVtY3B5IChwdHIgKyBpbnZhbDFsZW4sIFZBTFVFX0NPTlRFTlRTIChpbnZhbDIpLCBpbnZhbDJsZW4pOworCX0KKyAgICAgIG91dHZhbCA9IHZhbHVlX3N0cmluZyAocHRyLCBpbnZhbDFsZW4gKyBpbnZhbDJsZW4pOworICAgIH0KKyAgZWxzZSBpZiAoVFlQRV9DT0RFICh0eXBlMSkgPT0gVFlQRV9DT0RFX0JJVFNUUklORworCSAgIHx8IFRZUEVfQ09ERSAodHlwZTEpID09IFRZUEVfQ09ERV9CT09MKQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgdHdvIGJpdHN0cmluZ3MgdG8gY29uY2F0ZW5hdGUuICovCisgICAgICBpZiAoVFlQRV9DT0RFICh0eXBlMikgIT0gVFlQRV9DT0RFX0JJVFNUUklORworCSAgJiYgVFlQRV9DT0RFICh0eXBlMikgIT0gVFlQRV9DT0RFX0JPT0wpCisJeworCSAgZXJyb3IgKCJCaXRzdHJpbmdzIG9yIGJvb2xlYW5zIGNhbiBvbmx5IGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyIGJpdHN0cmluZ3Mgb3IgYm9vbGVhbnMuIik7CisJfQorICAgICAgZXJyb3IgKCJ1bmltcGxlbWVudGVkIHN1cHBvcnQgZm9yIGJpdHN0cmluZy9ib29sZWFuIGNvbmNhdGVuYXRpb24uIik7CisgICAgfSAgICAgIAorICBlbHNlCisgICAgeworICAgICAgLyogV2UgZG9uJ3Qga25vdyBob3cgdG8gY29uY2F0ZW5hdGUgdGhlc2Ugb3BlcmFuZHMuICovCisgICAgICBlcnJvciAoImlsbGVnYWwgb3BlcmFuZHMgZm9yIGNvbmNhdGVuYXRpb24uIik7CisgICAgfQorICByZXR1cm4gKG91dHZhbCk7Cit9CisKKwwKKworLyogUGVyZm9ybSBhIGJpbmFyeSBvcGVyYXRpb24gb24gdHdvIG9wZXJhbmRzIHdoaWNoIGhhdmUgcmVhc29uYWJsZQorICAgcmVwcmVzZW50YXRpb25zIGFzIGludGVnZXJzIG9yIGZsb2F0cy4gIFRoaXMgaW5jbHVkZXMgYm9vbGVhbnMsCisgICBjaGFyYWN0ZXJzLCBpbnRlZ2Vycywgb3IgZmxvYXRzLgorICAgRG9lcyBub3Qgc3VwcG9ydCBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24gb24gcG9pbnRlcnM7CisgICB1c2UgdmFsdWVfYWRkIG9yIHZhbHVlX3N1YiBpZiB5b3Ugd2FudCB0byBoYW5kbGUgdGhvc2UgcG9zc2liaWxpdGllcy4gICovCisKK3ZhbHVlX3B0cgordmFsdWVfYmlub3AgKGFyZzEsIGFyZzIsIG9wKQorICAgICB2YWx1ZV9wdHIgYXJnMSwgYXJnMjsKKyAgICAgZW51bSBleHBfb3Bjb2RlIG9wOworeworICByZWdpc3RlciB2YWx1ZV9wdHIgdmFsOworICBzdHJ1Y3QgdHlwZSAqdHlwZTEsICp0eXBlMjsKKworICBDT0VSQ0VfUkVGIChhcmcxKTsKKyAgQ09FUkNFX1JFRiAoYXJnMik7CisgIENPRVJDRV9FTlVNIChhcmcxKTsKKyAgQ09FUkNFX0VOVU0gKGFyZzIpOworICB0eXBlMSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZzEpKTsKKyAgdHlwZTIgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFIChhcmcyKSk7CisKKyAgaWYgKChUWVBFX0NPREUgKHR5cGUxKSAhPSBUWVBFX0NPREVfRkxUCisgICAgICAgJiYgVFlQRV9DT0RFICh0eXBlMSkgIT0gVFlQRV9DT0RFX0NIQVIKKyAgICAgICAmJiBUWVBFX0NPREUgKHR5cGUxKSAhPSBUWVBFX0NPREVfSU5UCisgICAgICAgJiYgVFlQRV9DT0RFICh0eXBlMSkgIT0gVFlQRV9DT0RFX0JPT0wKKyAgICAgICAmJiBUWVBFX0NPREUgKHR5cGUxKSAhPSBUWVBFX0NPREVfUkFOR0UpCisgICAgICB8fAorICAgICAgKFRZUEVfQ09ERSAodHlwZTIpICE9IFRZUEVfQ09ERV9GTFQKKyAgICAgICAmJiBUWVBFX0NPREUgKHR5cGUyKSAhPSBUWVBFX0NPREVfQ0hBUgorICAgICAgICYmIFRZUEVfQ09ERSAodHlwZTIpICE9IFRZUEVfQ09ERV9JTlQKKyAgICAgICAmJiBUWVBFX0NPREUgKHR5cGUyKSAhPSBUWVBFX0NPREVfQk9PTAorICAgICAgICYmIFRZUEVfQ09ERSAodHlwZTIpICE9IFRZUEVfQ09ERV9SQU5HRSkpCisgICAgZXJyb3IgKCJBcmd1bWVudCB0byBhcml0aG1ldGljIG9wZXJhdGlvbiBub3QgYSBudW1iZXIgb3IgYm9vbGVhbi4iKTsKKworICBpZiAoVFlQRV9DT0RFICh0eXBlMSkgPT0gVFlQRV9DT0RFX0ZMVAorICAgICAgfHwKKyAgICAgIFRZUEVfQ09ERSAodHlwZTIpID09IFRZUEVfQ09ERV9GTFQpCisgICAgeworICAgICAgLyogRklYTUUtaWYtcGlja3ktYWJvdXQtZmxvYXRpbmctYWNjdXJhY3k6IFNob3VsZCBiZSBkb2luZyB0aGlzCisJIGluIHRhcmdldCBmb3JtYXQuICByZWFsLmMgaW4gR0NDIHByb2JhYmx5IGhhcyB0aGUgbmVjZXNzYXJ5CisJIGNvZGUuICAqLworICAgICAgRE9VQkxFU1QgdjEsIHYyLCB2OworICAgICAgdjEgPSB2YWx1ZV9hc19kb3VibGUgKGFyZzEpOworICAgICAgdjIgPSB2YWx1ZV9hc19kb3VibGUgKGFyZzIpOworICAgICAgc3dpdGNoIChvcCkKKwl7CisJY2FzZSBCSU5PUF9BREQ6CisJICB2ID0gdjEgKyB2MjsKKwkgIGJyZWFrOworCisJY2FzZSBCSU5PUF9TVUI6CisJICB2ID0gdjEgLSB2MjsKKwkgIGJyZWFrOworCisJY2FzZSBCSU5PUF9NVUw6CisJICB2ID0gdjEgKiB2MjsKKwkgIGJyZWFrOworCisJY2FzZSBCSU5PUF9ESVY6CisJICB2ID0gdjEgLyB2MjsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIGVycm9yICgiSW50ZWdlci1vbmx5IG9wZXJhdGlvbiBvbiBmbG9hdGluZyBwb2ludCBudW1iZXIuIik7CisJfQorCisgICAgICAvKiBJZiBlaXRoZXIgYXJnIHdhcyBsb25nIGRvdWJsZSwgbWFrZSBzdXJlIHRoYXQgdmFsdWUgaXMgYWxzbyBsb25nCisJIGRvdWJsZS4gICovCisKKyAgICAgIGlmIChUWVBFX0xFTkdUSCh0eXBlMSkgKiA4ID4gVEFSR0VUX0RPVUJMRV9CSVQKKwkgIHx8IFRZUEVfTEVOR1RIKHR5cGUyKSAqIDggPiBUQVJHRVRfRE9VQkxFX0JJVCkKKwl2YWwgPSBhbGxvY2F0ZV92YWx1ZSAoYnVpbHRpbl90eXBlX2xvbmdfZG91YmxlKTsKKyAgICAgIGVsc2UKKwl2YWwgPSBhbGxvY2F0ZV92YWx1ZSAoYnVpbHRpbl90eXBlX2RvdWJsZSk7CisKKyAgICAgIHN0b3JlX2Zsb2F0aW5nIChWQUxVRV9DT05URU5UU19SQVcgKHZhbCksIFRZUEVfTEVOR1RIIChWQUxVRV9UWVBFICh2YWwpKSwKKwkJICAgICAgdik7CisgICAgfQorICBlbHNlIGlmIChUWVBFX0NPREUgKHR5cGUxKSA9PSBUWVBFX0NPREVfQk9PTAorCSAgICYmCisJICAgVFlQRV9DT0RFICh0eXBlMikgPT0gVFlQRV9DT0RFX0JPT0wpCisgICAgICB7CisJICBMT05HRVNUIHYxLCB2MiwgdjsKKwkgIHYxID0gdmFsdWVfYXNfbG9uZyAoYXJnMSk7CisJICB2MiA9IHZhbHVlX2FzX2xvbmcgKGFyZzIpOworCSAgCisJICBzd2l0Y2ggKG9wKQorCSAgICB7CisJICAgIGNhc2UgQklOT1BfQklUV0lTRV9BTkQ6CisJICAgICAgdiA9IHYxICYgdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQklOT1BfQklUV0lTRV9JT1I6CisJICAgICAgdiA9IHYxIHwgdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQklOT1BfQklUV0lTRV9YT1I6CisJICAgICAgdiA9IHYxIF4gdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGRlZmF1bHQ6CisJICAgICAgZXJyb3IgKCJJbnZhbGlkIG9wZXJhdGlvbiBvbiBib29sZWFucy4iKTsKKwkgICAgfQorCSAgCisJICB2YWwgPSBhbGxvY2F0ZV92YWx1ZSAodHlwZTEpOworCSAgc3RvcmVfc2lnbmVkX2ludGVnZXIgKFZBTFVFX0NPTlRFTlRTX1JBVyAodmFsKSwKKwkJCQlUWVBFX0xFTkdUSCAodHlwZTEpLAorCQkJCXYpOworICAgICAgfQorICBlbHNlCisgICAgLyogSW50ZWdyYWwgb3BlcmF0aW9ucyBoZXJlLiAgKi8KKyAgICAvKiBGSVhNRTogIEFsc28gbWl4ZWQgaW50ZWdyYWwvYm9vbGVhbnMsIHdpdGggcmVzdWx0IGFuIGludGVnZXIuICovCisgICAgLyogRklYTUU6IFRoaXMgaW1wbGVtZW50cyBBTlNJIEMgcnVsZXMgKGFsc28gY29ycmVjdCBmb3IgQysrKS4KKyAgICAgICBXaGF0IGFib3V0IEZPUlRSQU4gYW5kIGNoaWxsPyAgKi8KKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgcHJvbW90ZWRfbGVuMSA9IFRZUEVfTEVOR1RIICh0eXBlMSk7CisgICAgICB1bnNpZ25lZCBpbnQgcHJvbW90ZWRfbGVuMiA9IFRZUEVfTEVOR1RIICh0eXBlMik7CisgICAgICBpbnQgaXNfdW5zaWduZWQxID0gVFlQRV9VTlNJR05FRCAodHlwZTEpOworICAgICAgaW50IGlzX3Vuc2lnbmVkMiA9IFRZUEVfVU5TSUdORUQgKHR5cGUyKTsKKyAgICAgIHVuc2lnbmVkIGludCByZXN1bHRfbGVuOworICAgICAgaW50IHVuc2lnbmVkX29wZXJhdGlvbjsKKworICAgICAgLyogRGV0ZXJtaW5lIHR5cGUgbGVuZ3RoIGFuZCBzaWduZWRuZXNzIGFmdGVyIHByb21vdGlvbiBmb3IKKwkgYm90aCBvcGVyYW5kcy4gICovCisgICAgICBpZiAocHJvbW90ZWRfbGVuMSA8IFRZUEVfTEVOR1RIIChidWlsdGluX3R5cGVfaW50KSkKKwl7CisJICBpc191bnNpZ25lZDEgPSAwOworCSAgcHJvbW90ZWRfbGVuMSA9IFRZUEVfTEVOR1RIIChidWlsdGluX3R5cGVfaW50KTsKKwl9CisgICAgICBpZiAocHJvbW90ZWRfbGVuMiA8IFRZUEVfTEVOR1RIIChidWlsdGluX3R5cGVfaW50KSkKKwl7CisJICBpc191bnNpZ25lZDIgPSAwOworCSAgcHJvbW90ZWRfbGVuMiA9IFRZUEVfTEVOR1RIIChidWlsdGluX3R5cGVfaW50KTsKKwl9CisKKyAgICAgIC8qIERldGVybWluZSB0eXBlIGxlbmd0aCBvZiB0aGUgcmVzdWx0LCBhbmQgaWYgdGhlIG9wZXJhdGlvbiBzaG91bGQKKwkgYmUgZG9uZSB1bnNpZ25lZC4KKwkgVXNlIHRoZSBzaWduZWRuZXNzIG9mIHRoZSBvcGVyYW5kIHdpdGggdGhlIGdyZWF0ZXIgbGVuZ3RoLgorCSBJZiBib3RoIG9wZXJhbmRzIGFyZSBvZiBlcXVhbCBsZW5ndGgsIHVzZSB1bnNpZ25lZCBvcGVyYXRpb24KKwkgaWYgb25lIG9mIHRoZSBvcGVyYW5kcyBpcyB1bnNpZ25lZC4gICovCisgICAgICBpZiAocHJvbW90ZWRfbGVuMSA+IHByb21vdGVkX2xlbjIpCisJeworCSAgdW5zaWduZWRfb3BlcmF0aW9uID0gaXNfdW5zaWduZWQxOworCSAgcmVzdWx0X2xlbiA9IHByb21vdGVkX2xlbjE7CisJfQorICAgICAgZWxzZSBpZiAocHJvbW90ZWRfbGVuMiA+IHByb21vdGVkX2xlbjEpCisJeworCSAgdW5zaWduZWRfb3BlcmF0aW9uID0gaXNfdW5zaWduZWQyOworCSAgcmVzdWx0X2xlbiA9IHByb21vdGVkX2xlbjI7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHVuc2lnbmVkX29wZXJhdGlvbiA9IGlzX3Vuc2lnbmVkMSB8fCBpc191bnNpZ25lZDI7CisJICByZXN1bHRfbGVuID0gcHJvbW90ZWRfbGVuMTsKKwl9CisKKyAgICAgIGlmICh1bnNpZ25lZF9vcGVyYXRpb24pCisJeworCSAgVUxPTkdFU1QgdjEsIHYyLCB2OworCSAgdjEgPSAoVUxPTkdFU1QpIHZhbHVlX2FzX2xvbmcgKGFyZzEpOworCSAgdjIgPSAoVUxPTkdFU1QpIHZhbHVlX2FzX2xvbmcgKGFyZzIpOworCisJICAvKiBUcnVuY2F0ZSB2YWx1ZXMgdG8gdGhlIHR5cGUgbGVuZ3RoIG9mIHRoZSByZXN1bHQuICAqLworCSAgaWYgKHJlc3VsdF9sZW4gPCBzaXplb2YgKFVMT05HRVNUKSkKKwkgICAgeworCSAgICAgIHYxICY9ICgoTE9OR0VTVCkgMSA8PCBIT1NUX0NIQVJfQklUICogcmVzdWx0X2xlbikgLSAxOworCSAgICAgIHYyICY9ICgoTE9OR0VTVCkgMSA8PCBIT1NUX0NIQVJfQklUICogcmVzdWx0X2xlbikgLSAxOworCSAgICB9CisJICAKKwkgIHN3aXRjaCAob3ApCisJICAgIHsKKwkgICAgY2FzZSBCSU5PUF9BREQ6CisJICAgICAgdiA9IHYxICsgdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQklOT1BfU1VCOgorCSAgICAgIHYgPSB2MSAtIHYyOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIEJJTk9QX01VTDoKKwkgICAgICB2ID0gdjEgKiB2MjsKKwkgICAgICBicmVhazsKKwkgICAgICAKKwkgICAgY2FzZSBCSU5PUF9ESVY6CisJICAgICAgdiA9IHYxIC8gdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQklOT1BfUkVNOgorCSAgICAgIHYgPSB2MSAlIHYyOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIEJJTk9QX01PRDoKKwkgICAgICAvKiBLbnV0aCAxLjIuNCwgaW50ZWdlciBvbmx5LiAgTm90ZSB0aGF0IHVubGlrZSB0aGUgQyAnJScgb3AsCisJICAgICAgICAgdjEgbW9kIDAgaGFzIGEgZGVmaW5lZCB2YWx1ZSwgdjEuICovCisJICAgICAgLyogQ2hpbGwgc3BlY2lmaWVzIHRoYXQgdjIgbXVzdCBiZSA+IDAsIHNvIGNoZWNrIGZvciB0aGF0LiAqLworCSAgICAgIGlmIChjdXJyZW50X2xhbmd1YWdlIC0+IGxhX2xhbmd1YWdlID09IGxhbmd1YWdlX2NoaWxsCisJCSAgJiYgdmFsdWVfYXNfbG9uZyAoYXJnMikgPD0gMCkKKwkJeworCQkgIGVycm9yICgiU2Vjb25kIG9wZXJhbmQgb2YgTU9EIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7CisJCX0KKwkgICAgICBpZiAodjIgPT0gMCkKKwkJeworCQkgIHYgPSB2MTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHYgPSB2MS92MjsKKwkJICAvKiBOb3RlIGZsb29yKHYxL3YyKSA9PSB2MS92MiBmb3IgdW5zaWduZWQuICovCisJCSAgdiA9IHYxIC0gKHYyICogdik7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgICAKKwkgICAgY2FzZSBCSU5PUF9MU0g6CisJICAgICAgdiA9IHYxIDw8IHYyOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIEJJTk9QX1JTSDoKKwkgICAgICB2ID0gdjEgPj4gdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQklOT1BfQklUV0lTRV9BTkQ6CisJICAgICAgdiA9IHYxICYgdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQklOT1BfQklUV0lTRV9JT1I6CisJICAgICAgdiA9IHYxIHwgdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQklOT1BfQklUV0lTRV9YT1I6CisJICAgICAgdiA9IHYxIF4gdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQklOT1BfTE9HSUNBTF9BTkQ6CisJICAgICAgdiA9IHYxICYmIHYyOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIEJJTk9QX0xPR0lDQUxfT1I6CisJICAgICAgdiA9IHYxIHx8IHYyOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIEJJTk9QX01JTjoKKwkgICAgICB2ID0gdjEgPCB2MiA/IHYxIDogdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQklOT1BfTUFYOgorCSAgICAgIHYgPSB2MSA+IHYyID8gdjEgOiB2MjsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIEJJTk9QX0VRVUFMOgorCSAgICAgIHYgPSB2MSA9PSB2MjsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIEJJTk9QX0xFU1M6CisJICAgICAgdiA9IHYxIDwgdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGRlZmF1bHQ6CisJICAgICAgZXJyb3IgKCJJbnZhbGlkIGJpbmFyeSBvcGVyYXRpb24gb24gbnVtYmVycy4iKTsKKwkgICAgfQorCisJICAvKiBUaGlzIGlzIGEga2x1ZGdlIHRvIGdldCBhcm91bmQgdGhlIGZhY3QgdGhhdCB3ZSBkb24ndAorCSAgICAga25vdyBob3cgdG8gZGV0ZXJtaW5lIHRoZSByZXN1bHQgdHlwZSBmcm9tIHRoZSB0eXBlcyBvZgorCSAgICAgdGhlIG9wZXJhbmRzLiAgKEknbSBub3QgcmVhbGx5IHN1cmUgaG93IG11Y2ggd2UgZmVlbCB0aGUKKwkgICAgIG5lZWQgdG8gZHVwbGljYXRlIHRoZSBleGFjdCBydWxlcyBvZiB0aGUgY3VycmVudAorCSAgICAgbGFuZ3VhZ2UuICBUaGV5IGNhbiBnZXQgcmVhbGx5IGhhaXJ5LiAgQnV0IG5vdCB0byBkbyBzbworCSAgICAgbWFrZXMgaXQgaGFyZCB0byBkb2N1bWVudCBqdXN0IHdoYXQgd2UgKmRvKiBkbykuICAqLworCisJICAvKiBDYW4ndCBqdXN0IGNhbGwgaW5pdF90eXBlIGJlY2F1c2Ugd2Ugd291bGRuJ3Qga25vdyB3aGF0CisJICAgICBuYW1lIHRvIGdpdmUgdGhlIHR5cGUuICAqLworCSAgdmFsID0gYWxsb2NhdGVfdmFsdWUKKwkgICAgKHJlc3VsdF9sZW4gPiBUQVJHRVRfTE9OR19CSVQgLyBIT1NUX0NIQVJfQklUCisJICAgICA/IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9sb25nX2xvbmcKKwkgICAgIDogYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmcpOworCSAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoVkFMVUVfQ09OVEVOVFNfUkFXICh2YWwpLAorCQkJCSAgVFlQRV9MRU5HVEggKFZBTFVFX1RZUEUgKHZhbCkpLAorCQkJCSAgdik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIExPTkdFU1QgdjEsIHYyLCB2OworCSAgdjEgPSB2YWx1ZV9hc19sb25nIChhcmcxKTsKKwkgIHYyID0gdmFsdWVfYXNfbG9uZyAoYXJnMik7CisJICAKKwkgIHN3aXRjaCAob3ApCisJICAgIHsKKwkgICAgY2FzZSBCSU5PUF9BREQ6CisJICAgICAgdiA9IHYxICsgdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQklOT1BfU1VCOgorCSAgICAgIHYgPSB2MSAtIHYyOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIEJJTk9QX01VTDoKKwkgICAgICB2ID0gdjEgKiB2MjsKKwkgICAgICBicmVhazsKKwkgICAgICAKKwkgICAgY2FzZSBCSU5PUF9ESVY6CisJICAgICAgdiA9IHYxIC8gdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQklOT1BfUkVNOgorCSAgICAgIHYgPSB2MSAlIHYyOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIEJJTk9QX01PRDoKKwkgICAgICAvKiBLbnV0aCAxLjIuNCwgaW50ZWdlciBvbmx5LiAgTm90ZSB0aGF0IHVubGlrZSB0aGUgQyAnJScgb3AsCisJICAgICAgICAgWCBtb2QgMCBoYXMgYSBkZWZpbmVkIHZhbHVlLCBYLiAqLworCSAgICAgIC8qIENoaWxsIHNwZWNpZmllcyB0aGF0IHYyIG11c3QgYmUgPiAwLCBzbyBjaGVjayBmb3IgdGhhdC4gKi8KKwkgICAgICBpZiAoY3VycmVudF9sYW5ndWFnZSAtPiBsYV9sYW5ndWFnZSA9PSBsYW5ndWFnZV9jaGlsbAorCQkgICYmIHYyIDw9IDApCisJCXsKKwkJICBlcnJvciAoIlNlY29uZCBvcGVyYW5kIG9mIE1PRCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpOworCQl9CisJICAgICAgaWYgKHYyID09IDApCisJCXsKKwkJICB2ID0gdjE7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICB2ID0gdjEvdjI7CisJCSAgLyogQ29tcHV0ZSBmbG9vci4gKi8KKwkJICBpZiAoVFJVTkNBVElPTl9UT1dBUkRTX1pFUk8gJiYgKHYgPCAwKSAmJiAoKHYxICUgdjIpICE9IDApKQorCQkgICAgeworCQkgICAgICB2LS07CisJCSAgICB9CisJCSAgdiA9IHYxIC0gKHYyICogdik7CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgICAKKwkgICAgY2FzZSBCSU5PUF9MU0g6CisJICAgICAgdiA9IHYxIDw8IHYyOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIEJJTk9QX1JTSDoKKwkgICAgICB2ID0gdjEgPj4gdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQklOT1BfQklUV0lTRV9BTkQ6CisJICAgICAgdiA9IHYxICYgdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQklOT1BfQklUV0lTRV9JT1I6CisJICAgICAgdiA9IHYxIHwgdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQklOT1BfQklUV0lTRV9YT1I6CisJICAgICAgdiA9IHYxIF4gdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQklOT1BfTE9HSUNBTF9BTkQ6CisJICAgICAgdiA9IHYxICYmIHYyOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIEJJTk9QX0xPR0lDQUxfT1I6CisJICAgICAgdiA9IHYxIHx8IHYyOworCSAgICAgIGJyZWFrOworCSAgICAgIAorCSAgICBjYXNlIEJJTk9QX01JTjoKKwkgICAgICB2ID0gdjEgPCB2MiA/IHYxIDogdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGNhc2UgQklOT1BfTUFYOgorCSAgICAgIHYgPSB2MSA+IHYyID8gdjEgOiB2MjsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIEJJTk9QX0VRVUFMOgorCSAgICAgIHYgPSB2MSA9PSB2MjsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIEJJTk9QX0xFU1M6CisJICAgICAgdiA9IHYxIDwgdjI7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGRlZmF1bHQ6CisJICAgICAgZXJyb3IgKCJJbnZhbGlkIGJpbmFyeSBvcGVyYXRpb24gb24gbnVtYmVycy4iKTsKKwkgICAgfQorCisJICAvKiBUaGlzIGlzIGEga2x1ZGdlIHRvIGdldCBhcm91bmQgdGhlIGZhY3QgdGhhdCB3ZSBkb24ndAorCSAgICAga25vdyBob3cgdG8gZGV0ZXJtaW5lIHRoZSByZXN1bHQgdHlwZSBmcm9tIHRoZSB0eXBlcyBvZgorCSAgICAgdGhlIG9wZXJhbmRzLiAgKEknbSBub3QgcmVhbGx5IHN1cmUgaG93IG11Y2ggd2UgZmVlbCB0aGUKKwkgICAgIG5lZWQgdG8gZHVwbGljYXRlIHRoZSBleGFjdCBydWxlcyBvZiB0aGUgY3VycmVudAorCSAgICAgbGFuZ3VhZ2UuICBUaGV5IGNhbiBnZXQgcmVhbGx5IGhhaXJ5LiAgQnV0IG5vdCB0byBkbyBzbworCSAgICAgbWFrZXMgaXQgaGFyZCB0byBkb2N1bWVudCBqdXN0IHdoYXQgd2UgKmRvKiBkbykuICAqLworCisJICAvKiBDYW4ndCBqdXN0IGNhbGwgaW5pdF90eXBlIGJlY2F1c2Ugd2Ugd291bGRuJ3Qga25vdyB3aGF0CisJICAgICBuYW1lIHRvIGdpdmUgdGhlIHR5cGUuICAqLworCSAgdmFsID0gYWxsb2NhdGVfdmFsdWUKKwkgICAgKHJlc3VsdF9sZW4gPiBUQVJHRVRfTE9OR19CSVQgLyBIT1NUX0NIQVJfQklUCisJICAgICA/IGJ1aWx0aW5fdHlwZV9sb25nX2xvbmcKKwkgICAgIDogYnVpbHRpbl90eXBlX2xvbmcpOworCSAgc3RvcmVfc2lnbmVkX2ludGVnZXIgKFZBTFVFX0NPTlRFTlRTX1JBVyAodmFsKSwKKwkJCQlUWVBFX0xFTkdUSCAoVkFMVUVfVFlQRSAodmFsKSksCisJCQkJdik7CisJfQorICAgIH0KKworICByZXR1cm4gdmFsOworfQorDAorLyogU2ltdWxhdGUgdGhlIEMgb3BlcmF0b3IgISAtLSByZXR1cm4gMSBpZiBBUkcxIGNvbnRhaW5zIHplcm8uICAqLworCitpbnQKK3ZhbHVlX2xvZ2ljYWxfbm90IChhcmcxKQorICAgICB2YWx1ZV9wdHIgYXJnMTsKK3sKKyAgcmVnaXN0ZXIgaW50IGxlbjsKKyAgcmVnaXN0ZXIgY2hhciAqcDsKKyAgc3RydWN0IHR5cGUgKnR5cGUxOworCisgIENPRVJDRV9OVU1CRVIgKGFyZzEpOworICB0eXBlMSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZzEpKTsKKworICBpZiAoVFlQRV9DT0RFICh0eXBlMSkgPT0gVFlQRV9DT0RFX0ZMVCkKKyAgICByZXR1cm4gMCA9PSB2YWx1ZV9hc19kb3VibGUgKGFyZzEpOworCisgIGxlbiA9IFRZUEVfTEVOR1RIICh0eXBlMSk7CisgIHAgPSBWQUxVRV9DT05URU5UUyAoYXJnMSk7CisKKyAgd2hpbGUgKC0tbGVuID49IDApCisgICAgeworICAgICAgaWYgKCpwKyspCisJYnJlYWs7CisgICAgfQorCisgIHJldHVybiBsZW4gPCAwOworfQorCisvKiBTaW11bGF0ZSB0aGUgQyBvcGVyYXRvciA9PSBieSByZXR1cm5pbmcgYSAxCisgICBpZmYgQVJHMSBhbmQgQVJHMiBoYXZlIGVxdWFsIGNvbnRlbnRzLiAgKi8KKworaW50Cit2YWx1ZV9lcXVhbCAoYXJnMSwgYXJnMikKKyAgICAgcmVnaXN0ZXIgdmFsdWVfcHRyIGFyZzEsIGFyZzI7CisKK3sKKyAgcmVnaXN0ZXIgaW50IGxlbjsKKyAgcmVnaXN0ZXIgY2hhciAqcDEsICpwMjsKKyAgc3RydWN0IHR5cGUgKnR5cGUxLCAqdHlwZTI7CisgIGVudW0gdHlwZV9jb2RlIGNvZGUxOworICBlbnVtIHR5cGVfY29kZSBjb2RlMjsKKworICBDT0VSQ0VfTlVNQkVSIChhcmcxKTsKKyAgQ09FUkNFX05VTUJFUiAoYXJnMik7CisKKyAgdHlwZTEgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFIChhcmcxKSk7CisgIHR5cGUyID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnMikpOworICBjb2RlMSA9IFRZUEVfQ09ERSAodHlwZTEpOworICBjb2RlMiA9IFRZUEVfQ09ERSAodHlwZTIpOworCisgIGlmICgoY29kZTEgPT0gVFlQRV9DT0RFX0lOVCB8fCBjb2RlMSA9PSBUWVBFX0NPREVfQk9PTCkgJiYKKyAgICAgIChjb2RlMiA9PSBUWVBFX0NPREVfSU5UIHx8IGNvZGUyID09IFRZUEVfQ09ERV9CT09MKSkKKyAgICByZXR1cm4gbG9uZ2VzdF90b19pbnQgKHZhbHVlX2FzX2xvbmcgKHZhbHVlX2Jpbm9wIChhcmcxLCBhcmcyLAorCQkJCQkJICAgICAgIEJJTk9QX0VRVUFMKSkpOworICBlbHNlIGlmICgoY29kZTEgPT0gVFlQRV9DT0RFX0ZMVCB8fCBjb2RlMSA9PSBUWVBFX0NPREVfSU5UIHx8IGNvZGUxID09IFRZUEVfQ09ERV9CT09MKQorCSAgICYmIChjb2RlMiA9PSBUWVBFX0NPREVfRkxUIHx8IGNvZGUyID09IFRZUEVfQ09ERV9JTlQgfHwgY29kZTIgPT0gVFlQRV9DT0RFX0JPT0wpKQorICAgIHJldHVybiB2YWx1ZV9hc19kb3VibGUgKGFyZzEpID09IHZhbHVlX2FzX2RvdWJsZSAoYXJnMik7CisKKyAgLyogRklYTUU6IE5lZWQgdG8gcHJvbW90ZSB0byBlaXRoZXIgQ09SRV9BRERSIG9yIExPTkdFU1QsIHdoaWNoZXZlcgorICAgICBpcyBiaWdnZXIuICAqLworICBlbHNlIGlmIChjb2RlMSA9PSBUWVBFX0NPREVfUFRSICYmIChjb2RlMiA9PSBUWVBFX0NPREVfSU5UIHx8IGNvZGUyID09IFRZUEVfQ09ERV9CT09MKSkKKyAgICByZXR1cm4gdmFsdWVfYXNfcG9pbnRlciAoYXJnMSkgPT0gKENPUkVfQUREUikgdmFsdWVfYXNfbG9uZyAoYXJnMik7CisgIGVsc2UgaWYgKGNvZGUyID09IFRZUEVfQ09ERV9QVFIgJiYgKGNvZGUxID09IFRZUEVfQ09ERV9JTlQgfHwgY29kZTEgPT0gVFlQRV9DT0RFX0JPT0wpKQorICAgIHJldHVybiAoQ09SRV9BRERSKSB2YWx1ZV9hc19sb25nIChhcmcxKSA9PSB2YWx1ZV9hc19wb2ludGVyIChhcmcyKTsKKworICBlbHNlIGlmIChjb2RlMSA9PSBjb2RlMgorCSAgICYmICgobGVuID0gKGludCkgVFlQRV9MRU5HVEggKHR5cGUxKSkKKwkgICAgICAgPT0gKGludCkgVFlQRV9MRU5HVEggKHR5cGUyKSkpCisgICAgeworICAgICAgcDEgPSBWQUxVRV9DT05URU5UUyAoYXJnMSk7CisgICAgICBwMiA9IFZBTFVFX0NPTlRFTlRTIChhcmcyKTsKKyAgICAgIHdoaWxlICgtLWxlbiA+PSAwKQorCXsKKwkgIGlmICgqcDErKyAhPSAqcDIrKykKKwkgICAgYnJlYWs7CisJfQorICAgICAgcmV0dXJuIGxlbiA8IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZXJyb3IgKCJJbnZhbGlkIHR5cGUgY29tYmluYXRpb24gaW4gZXF1YWxpdHkgdGVzdC4iKTsKKyAgICAgIHJldHVybiAwOyAgLyogRm9yIGxpbnQgLS0gbmV2ZXIgcmVhY2hlZCAqLworICAgIH0KK30KKworLyogU2ltdWxhdGUgdGhlIEMgb3BlcmF0b3IgPCBieSByZXR1cm5pbmcgMQorICAgaWZmIEFSRzEncyBjb250ZW50cyBhcmUgbGVzcyB0aGFuIEFSRzIncy4gICovCisKK2ludAordmFsdWVfbGVzcyAoYXJnMSwgYXJnMikKKyAgICAgcmVnaXN0ZXIgdmFsdWVfcHRyIGFyZzEsIGFyZzI7Cit7CisgIHJlZ2lzdGVyIGVudW0gdHlwZV9jb2RlIGNvZGUxOworICByZWdpc3RlciBlbnVtIHR5cGVfY29kZSBjb2RlMjsKKyAgc3RydWN0IHR5cGUgKnR5cGUxLCAqdHlwZTI7CisKKyAgQ09FUkNFX05VTUJFUiAoYXJnMSk7CisgIENPRVJDRV9OVU1CRVIgKGFyZzIpOworCisgIHR5cGUxID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnMSkpOworICB0eXBlMiA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZzIpKTsKKyAgY29kZTEgPSBUWVBFX0NPREUgKHR5cGUxKTsKKyAgY29kZTIgPSBUWVBFX0NPREUgKHR5cGUyKTsKKworICBpZiAoKGNvZGUxID09IFRZUEVfQ09ERV9JTlQgfHwgY29kZTEgPT0gVFlQRV9DT0RFX0JPT0wpICYmCisgICAgICAoY29kZTIgPT0gVFlQRV9DT0RFX0lOVCB8fCBjb2RlMiA9PSBUWVBFX0NPREVfQk9PTCkpCisgICAgcmV0dXJuIGxvbmdlc3RfdG9faW50ICh2YWx1ZV9hc19sb25nICh2YWx1ZV9iaW5vcCAoYXJnMSwgYXJnMiwKKwkJCQkJCSAgICAgICBCSU5PUF9MRVNTKSkpOworICBlbHNlIGlmICgoY29kZTEgPT0gVFlQRV9DT0RFX0ZMVCB8fCBjb2RlMSA9PSBUWVBFX0NPREVfSU5UIHx8IGNvZGUxID09IFRZUEVfQ09ERV9CT09MKQorCSAgICYmIChjb2RlMiA9PSBUWVBFX0NPREVfRkxUIHx8IGNvZGUyID09IFRZUEVfQ09ERV9JTlQgfHwgY29kZTIgPT0gVFlQRV9DT0RFX0JPT0wpKQorICAgIHJldHVybiB2YWx1ZV9hc19kb3VibGUgKGFyZzEpIDwgdmFsdWVfYXNfZG91YmxlIChhcmcyKTsKKyAgZWxzZSBpZiAoY29kZTEgPT0gVFlQRV9DT0RFX1BUUiAmJiBjb2RlMiA9PSBUWVBFX0NPREVfUFRSKQorICAgIHJldHVybiB2YWx1ZV9hc19wb2ludGVyIChhcmcxKSA8IHZhbHVlX2FzX3BvaW50ZXIgKGFyZzIpOworCisgIC8qIEZJWE1FOiBOZWVkIHRvIHByb21vdGUgdG8gZWl0aGVyIENPUkVfQUREUiBvciBMT05HRVNULCB3aGljaGV2ZXIKKyAgICAgaXMgYmlnZ2VyLiAgKi8KKyAgZWxzZSBpZiAoY29kZTEgPT0gVFlQRV9DT0RFX1BUUiAmJiAoY29kZTIgPT0gVFlQRV9DT0RFX0lOVCB8fCBjb2RlMiA9PSBUWVBFX0NPREVfQk9PTCkpCisgICAgcmV0dXJuIHZhbHVlX2FzX3BvaW50ZXIgKGFyZzEpIDwgKENPUkVfQUREUikgdmFsdWVfYXNfbG9uZyAoYXJnMik7CisgIGVsc2UgaWYgKGNvZGUyID09IFRZUEVfQ09ERV9QVFIgJiYgKGNvZGUxID09IFRZUEVfQ09ERV9JTlQgfHwgY29kZTEgPT0gVFlQRV9DT0RFX0JPT0wpKQorICAgIHJldHVybiAoQ09SRV9BRERSKSB2YWx1ZV9hc19sb25nIChhcmcxKSA8IHZhbHVlX2FzX3BvaW50ZXIgKGFyZzIpOworCisgIGVsc2UKKyAgICB7CisgICAgICBlcnJvciAoIkludmFsaWQgdHlwZSBjb21iaW5hdGlvbiBpbiBvcmRlcmluZyBjb21wYXJpc29uLiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorDAorLyogVGhlIHVuYXJ5IG9wZXJhdG9ycyAtIGFuZCB+LiAgQm90aCBmcmVlIHRoZSBhcmd1bWVudCBBUkcxLiAgKi8KKwordmFsdWVfcHRyCit2YWx1ZV9uZWcgKGFyZzEpCisgICAgIHJlZ2lzdGVyIHZhbHVlX3B0ciBhcmcxOworeworICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKnJlc3VsdF90eXBlID0gVkFMVUVfVFlQRSAoYXJnMSk7CisKKyAgQ09FUkNFX1JFRiAoYXJnMSk7CisgIENPRVJDRV9FTlVNIChhcmcxKTsKKworICB0eXBlID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnMSkpOworCisgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9GTFQpCisgICAgcmV0dXJuIHZhbHVlX2Zyb21fZG91YmxlIChyZXN1bHRfdHlwZSwgLSB2YWx1ZV9hc19kb3VibGUgKGFyZzEpKTsKKyAgZWxzZSBpZiAoVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfSU5UIHx8IFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX0JPT0wpCisgICAgeworICAgICAgLyogUGVyZm9ybSBpbnRlZ3JhbCBwcm9tb3Rpb24gZm9yIEFOU0kgQy9DKysuCisJIEZJWE1FOiBXaGF0IGFib3V0IEZPUlRSQU4gYW5kIGNoaWxsID8gICovCisgICAgICBpZiAoVFlQRV9MRU5HVEggKHR5cGUpIDwgVFlQRV9MRU5HVEggKGJ1aWx0aW5fdHlwZV9pbnQpKQorCXJlc3VsdF90eXBlID0gYnVpbHRpbl90eXBlX2ludDsKKworICAgICAgcmV0dXJuIHZhbHVlX2Zyb21fbG9uZ2VzdCAocmVzdWx0X3R5cGUsIC0gdmFsdWVfYXNfbG9uZyAoYXJnMSkpOworICAgIH0KKyAgZWxzZSB7CisgICAgZXJyb3IgKCJBcmd1bWVudCB0byBuZWdhdGUgb3BlcmF0aW9uIG5vdCBhIG51bWJlci4iKTsKKyAgICByZXR1cm4gMDsgIC8qIEZvciBsaW50IC0tIG5ldmVyIHJlYWNoZWQgKi8KKyAgfQorfQorCit2YWx1ZV9wdHIKK3ZhbHVlX2NvbXBsZW1lbnQgKGFyZzEpCisgICAgIHJlZ2lzdGVyIHZhbHVlX3B0ciBhcmcxOworeworICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKnJlc3VsdF90eXBlID0gVkFMVUVfVFlQRSAoYXJnMSk7CisgIGludCB0eXBlY29kZTsgCisKKyAgQ09FUkNFX1JFRiAoYXJnMSk7CisgIENPRVJDRV9FTlVNIChhcmcxKTsKKworICB0eXBlID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnMSkpOworCisgIHR5cGVjb2RlID0gVFlQRV9DT0RFICh0eXBlKTsKKyAgaWYgKCh0eXBlY29kZSAhPSBUWVBFX0NPREVfSU5UKSAmJiAodHlwZWNvZGUgIT0gVFlQRV9DT0RFX0JPT0wpKQorICAgIGVycm9yICgiQXJndW1lbnQgdG8gY29tcGxlbWVudCBvcGVyYXRpb24gbm90IGFuIGludGVnZXIgb3IgYm9vbGVhbi4iKTsKKworICAvKiBQZXJmb3JtIGludGVncmFsIHByb21vdGlvbiBmb3IgQU5TSSBDL0MrKy4KKyAgICAgRklYTUU6IFdoYXQgYWJvdXQgRk9SVFJBTiA/ICAqLworICBpZiAoVFlQRV9MRU5HVEggKHR5cGUpIDwgVFlQRV9MRU5HVEggKGJ1aWx0aW5fdHlwZV9pbnQpKQorICAgIHJlc3VsdF90eXBlID0gYnVpbHRpbl90eXBlX2ludDsKKworICByZXR1cm4gdmFsdWVfZnJvbV9sb25nZXN0IChyZXN1bHRfdHlwZSwgfiB2YWx1ZV9hc19sb25nIChhcmcxKSk7Cit9CisMCisvKiBUaGUgSU5ERVgndGggYml0IG9mIFNFVCB2YWx1ZSB3aG9zZSBWQUxVRV9UWVBFIGlzIFRZUEUsCisgICBhbmQgd2hvc2UgVkFMVUVfQ09OVEVOVFMgaXMgdmFsYWRkci4KKyAgIFJldHVybiAtMSBpZiBvdXQgb2YgcmFuZ2UsIC0yIG90aGVyIGVycm9yLiAqLworCitpbnQKK3ZhbHVlX2JpdF9pbmRleCAodHlwZSwgdmFsYWRkciwgaW5kZXgpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBjaGFyICp2YWxhZGRyOworICAgICBpbnQgaW5kZXg7Cit7CisgIExPTkdFU1QgbG93X2JvdW5kLCBoaWdoX2JvdW5kOworICBMT05HRVNUIHdvcmQ7CisgIHVuc2lnbmVkIHJlbF9pbmRleDsKKyAgc3RydWN0IHR5cGUgKnJhbmdlID0gVFlQRV9GSUVMRF9UWVBFICh0eXBlLCAwKTsKKyAgaWYgKGdldF9kaXNjcmV0ZV9ib3VuZHMgKHJhbmdlLCAmbG93X2JvdW5kLCAmaGlnaF9ib3VuZCkgPCAwKQorICAgIHJldHVybiAtMjsKKyAgaWYgKGluZGV4IDwgbG93X2JvdW5kIHx8IGluZGV4ID4gaGlnaF9ib3VuZCkKKyAgICByZXR1cm4gLTE7CisgIHJlbF9pbmRleCA9IGluZGV4IC0gbG93X2JvdW5kOworICB3b3JkID0gdW5wYWNrX2xvbmcgKGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9jaGFyLAorCQkgICAgICB2YWxhZGRyICsgKHJlbF9pbmRleCAvIFRBUkdFVF9DSEFSX0JJVCkpOworICByZWxfaW5kZXggJT0gVEFSR0VUX0NIQVJfQklUOworICBpZiAoQklUU19CSUdfRU5ESUFOKQorICAgIHJlbF9pbmRleCA9IFRBUkdFVF9DSEFSX0JJVCAtIDEgLSByZWxfaW5kZXg7CisgIHJldHVybiAod29yZCA+PiByZWxfaW5kZXgpICYgMTsKK30KKwordmFsdWVfcHRyCit2YWx1ZV9pbiAoZWxlbWVudCwgc2V0KQorICAgICB2YWx1ZV9wdHIgZWxlbWVudCwgc2V0OworeworICBpbnQgbWVtYmVyOworICBzdHJ1Y3QgdHlwZSAqc2V0dHlwZSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKHNldCkpOworICBzdHJ1Y3QgdHlwZSAqZWx0eXBlID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoZWxlbWVudCkpOworICBpZiAoVFlQRV9DT0RFIChlbHR5cGUpID09IFRZUEVfQ09ERV9SQU5HRSkKKyAgICBlbHR5cGUgPSBUWVBFX1RBUkdFVF9UWVBFIChlbHR5cGUpOworICBpZiAoVFlQRV9DT0RFIChzZXR0eXBlKSAhPSBUWVBFX0NPREVfU0VUKQorICAgIGVycm9yICgiU2Vjb25kIGFyZ3VtZW50IG9mICdJTicgaGFzIHdyb25nIHR5cGUiKTsKKyAgaWYgKFRZUEVfQ09ERSAoZWx0eXBlKSAhPSBUWVBFX0NPREVfSU5UCisgICAgICAmJiBUWVBFX0NPREUgKGVsdHlwZSkgIT0gVFlQRV9DT0RFX0NIQVIKKyAgICAgICYmIFRZUEVfQ09ERSAoZWx0eXBlKSAhPSBUWVBFX0NPREVfRU5VTQorICAgICAgJiYgVFlQRV9DT0RFIChlbHR5cGUpICE9IFRZUEVfQ09ERV9CT09MKQorICAgIGVycm9yICgiRmlyc3QgYXJndW1lbnQgb2YgJ0lOJyBoYXMgd3JvbmcgdHlwZSIpOworICBtZW1iZXIgPSB2YWx1ZV9iaXRfaW5kZXggKHNldHR5cGUsIFZBTFVFX0NPTlRFTlRTIChzZXQpLAorCQkJICAgIHZhbHVlX2FzX2xvbmcgKGVsZW1lbnQpKTsKKyAgaWYgKG1lbWJlciA8IDApCisgICAgZXJyb3IgKCJGaXJzdCBhcmd1bWVudCBvZiAnSU4nIG5vdCBpbiByYW5nZSIpOworICByZXR1cm4gdmFsdWVfZnJvbV9sb25nZXN0IChMQV9CT09MX1RZUEUsIG1lbWJlcik7Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX3ZhbGFyaXRoICgpCit7Cit9CmRpZmYgLS1naXQgYS9nZGIvdmFsb3BzLmMgYi9nZGIvdmFsb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkMjM5NgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi92YWxvcHMuYwpAQCAtMCwwICsxLDM0NjEgQEAKKy8qIFBlcmZvcm0gbm9uLWFyaXRobWV0aWMgb3BlcmF0aW9ucyBvbiB2YWx1ZXMsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk4NiwgODcsIDg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgInZhbHVlLmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJpbmZlcmlvci5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJkZW1hbmdsZS5oIgorI2luY2x1ZGUgImxhbmd1YWdlLmgiCisjaW5jbHVkZSAiZ2RiY21kLmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKKworLyogRGVmYXVsdCB0byBjb2VyY2luZyBmbG9hdCB0byBkb3VibGUgaW4gZnVuY3Rpb24gY2FsbHMgb25seSB3aGVuIHRoZXJlIGlzCisgICBubyBwcm90b3R5cGUuICBPdGhlcndpc2Ugb24gdGFyZ2V0cyB3aGVyZSB0aGUgZGVidWcgaW5mb3JtYXRpb24gaXMgaW5jb3JyZWN0CisgICBmb3IgZWl0aGVyIHRoZSBwcm90b3R5cGUgb3Igbm9uLXByb3RvdHlwZSBjYXNlLCB3ZSBjYW4gZm9yY2UgaXQgYnkgZGVmaW5pbmcKKyAgIENPRVJDRV9GTE9BVF9UT19ET1VCTEUgaW4gdGhlIHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuICovCisKKyNpZm5kZWYgQ09FUkNFX0ZMT0FUX1RPX0RPVUJMRQorI2RlZmluZSBDT0VSQ0VfRkxPQVRfVE9fRE9VQkxFIChwYXJhbV90eXBlID09IE5VTEwpCisjZW5kaWYKKworLyogRmxhZyBpbmRpY2F0aW5nIEhQIGNvbXBpbGVycyB3ZXJlIHVzZWQ7IG5lZWRlZCB0byBjb3JyZWN0bHkgaGFuZGxlIHNvbWUKKyAgIHZhbHVlIG9wZXJhdGlvbnMgd2l0aCBIUCBhQ0MgY29kZS9ydW50aW1lLiAqLworZXh0ZXJuIGludCBocF9zb21fc29tX29iamVjdF9wcmVzZW50OworCisKKy8qIExvY2FsIGZ1bmN0aW9ucy4gICovCisKK3N0YXRpYyBpbnQgdHlwZWNtcCBQQVJBTVMgKChpbnQgc3RhdGljcCwgc3RydWN0IHR5cGUgKnQxW10sIHZhbHVlX3B0ciB0MltdKSk7CisKKyNpZmRlZiBDQUxMX0RVTU1ZCitzdGF0aWMgQ09SRV9BRERSIGZpbmRfZnVuY3Rpb25fYWRkciBQQVJBTVMgKCh2YWx1ZV9wdHIsIHN0cnVjdCB0eXBlICoqKSk7CitzdGF0aWMgdmFsdWVfcHRyIHZhbHVlX2FyZ19jb2VyY2UgUEFSQU1TICgodmFsdWVfcHRyLCBzdHJ1Y3QgdHlwZSAqLCBpbnQpKTsKKyNlbmRpZgorCisKKyNpZm5kZWYgUFVTSF9BUkdVTUVOVFMKK3N0YXRpYyBDT1JFX0FERFIgdmFsdWVfcHVzaCBQQVJBTVMgKChDT1JFX0FERFIsIHZhbHVlX3B0cikpOworI2VuZGlmCisKK3N0YXRpYyB2YWx1ZV9wdHIgc2VhcmNoX3N0cnVjdF9maWVsZCBQQVJBTVMgKChjaGFyICosIHZhbHVlX3B0ciwgaW50LAorCQkJCQkgICAgICBzdHJ1Y3QgdHlwZSAqLCBpbnQpKTsKKworc3RhdGljIHZhbHVlX3B0ciBzZWFyY2hfc3RydWN0X2ZpZWxkX2F1eCBQQVJBTVMgKChjaGFyICosIHZhbHVlX3B0ciwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdHlwZSAqLCBpbnQsIGludCAqLCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0eXBlICoqKSk7CisKK3N0YXRpYyB2YWx1ZV9wdHIgc2VhcmNoX3N0cnVjdF9tZXRob2QgUEFSQU1TICgoY2hhciAqLCB2YWx1ZV9wdHIgKiwKKwkJCQkJICAgICAgIHZhbHVlX3B0ciAqLAorCQkJCQkgICAgICAgaW50LCBpbnQgKiwgc3RydWN0IHR5cGUgKikpOworCitzdGF0aWMgaW50IGNoZWNrX2ZpZWxkX2luIFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIGNvbnN0IGNoYXIgKikpOworCitzdGF0aWMgQ09SRV9BRERSIGFsbG9jYXRlX3NwYWNlX2luX2luZmVyaW9yIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgdmFsdWVfcHRyIGNhc3RfaW50b19jb21wbGV4IFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIHZhbHVlX3B0cikpOworCit2b2lkIF9pbml0aWFsaXplX3ZhbG9wcyBQQVJBTVMgKCh2b2lkKSk7CisKKyNkZWZpbmUgVkFMVUVfU1VCU1RSSU5HX1NUQVJUKFZBTCkgVkFMVUVfRlJBTUUoVkFMKQorCisvKiBGbGFnIGZvciB3aGV0aGVyIHdlIHdhbnQgdG8gYWJhbmRvbiBmYWlsZWQgZXhwcmVzc2lvbiBldmFscyBieSBkZWZhdWx0LiAgKi8KKworI2lmIDAKK3N0YXRpYyBpbnQgYXV0b19hYmFuZG9uID0gMDsKKyNlbmRpZgorCitpbnQgb3ZlcmxvYWRfcmVzb2x1dGlvbiA9IDA7CisKKworDAorLyogRmluZCB0aGUgYWRkcmVzcyBvZiBmdW5jdGlvbiBuYW1lIE5BTUUgaW4gdGhlIGluZmVyaW9yLiAgKi8KKwordmFsdWVfcHRyCitmaW5kX2Z1bmN0aW9uX2luX2luZmVyaW9yIChuYW1lKQorICAgICBjaGFyICpuYW1lOworeworICByZWdpc3RlciBzdHJ1Y3Qgc3ltYm9sICpzeW07CisgIHN5bSA9IGxvb2t1cF9zeW1ib2wgKG5hbWUsIDAsIFZBUl9OQU1FU1BBQ0UsIDAsIE5VTEwpOworICBpZiAoc3ltICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKFNZTUJPTF9DTEFTUyAoc3ltKSAhPSBMT0NfQkxPQ0spCisJeworCSAgZXJyb3IgKCJcIiVzXCIgZXhpc3RzIGluIHRoaXMgcHJvZ3JhbSBidXQgaXMgbm90IGEgZnVuY3Rpb24uIiwKKwkJIG5hbWUpOworCX0KKyAgICAgIHJldHVybiB2YWx1ZV9vZl92YXJpYWJsZSAoc3ltLCBOVUxMKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2wobmFtZSwgTlVMTCwgTlVMTCk7CisgICAgICBpZiAobXN5bWJvbCAhPSBOVUxMKQorCXsKKwkgIHN0cnVjdCB0eXBlICp0eXBlOworCSAgTE9OR0VTVCBtYWRkcjsKKwkgIHR5cGUgPSBsb29rdXBfcG9pbnRlcl90eXBlIChidWlsdGluX3R5cGVfY2hhcik7CisJICB0eXBlID0gbG9va3VwX2Z1bmN0aW9uX3R5cGUgKHR5cGUpOworCSAgdHlwZSA9IGxvb2t1cF9wb2ludGVyX3R5cGUgKHR5cGUpOworCSAgbWFkZHIgPSAoTE9OR0VTVCkgU1lNQk9MX1ZBTFVFX0FERFJFU1MgKG1zeW1ib2wpOworCSAgcmV0dXJuIHZhbHVlX2Zyb21fbG9uZ2VzdCAodHlwZSwgbWFkZHIpOworCX0KKyAgICAgIGVsc2UKKwl7CisgICAgICAgICAgaWYgKCF0YXJnZXRfaGFzX2V4ZWN1dGlvbikKKwkgICAgZXJyb3IgKCJldmFsdWF0aW9uIG9mIHRoaXMgZXhwcmVzc2lvbiByZXF1aXJlcyB0aGUgdGFyZ2V0IHByb2dyYW0gdG8gYmUgYWN0aXZlIik7CisgICAgICAgICAgZWxzZQorCSAgICBlcnJvciAoImV2YWx1YXRpb24gb2YgdGhpcyBleHByZXNzaW9uIHJlcXVpcmVzIHRoZSBwcm9ncmFtIHRvIGhhdmUgYSBmdW5jdGlvbiBcIiVzXCIuIiwgbmFtZSk7CisJfQorICAgIH0KK30KKworLyogQWxsb2NhdGUgTkJZVEVTIG9mIHNwYWNlIGluIHRoZSBpbmZlcmlvciB1c2luZyB0aGUgaW5mZXJpb3IncyBtYWxsb2MKKyAgIGFuZCByZXR1cm4gYSB2YWx1ZSB0aGF0IGlzIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIHNwYWNlLiAqLworCit2YWx1ZV9wdHIKK3ZhbHVlX2FsbG9jYXRlX3NwYWNlX2luX2luZmVyaW9yIChsZW4pCisgICAgIGludCBsZW47Cit7CisgIHZhbHVlX3B0ciBibG9ja2xlbjsKKyAgcmVnaXN0ZXIgdmFsdWVfcHRyIHZhbCA9IGZpbmRfZnVuY3Rpb25faW5faW5mZXJpb3IgKCJtYWxsb2MiKTsKKworICBibG9ja2xlbiA9IHZhbHVlX2Zyb21fbG9uZ2VzdCAoYnVpbHRpbl90eXBlX2ludCwgKExPTkdFU1QpIGxlbik7CisgIHZhbCA9IGNhbGxfZnVuY3Rpb25fYnlfaGFuZCAodmFsLCAxLCAmYmxvY2tsZW4pOworICBpZiAodmFsdWVfbG9naWNhbF9ub3QgKHZhbCkpCisgICAgeworICAgICAgaWYgKCF0YXJnZXRfaGFzX2V4ZWN1dGlvbikKKyAgICAgICAgZXJyb3IgKCJObyBtZW1vcnkgYXZhaWxhYmxlIHRvIHByb2dyYW0gbm93OiB5b3UgbmVlZCB0byBzdGFydCB0aGUgdGFyZ2V0IGZpcnN0Iik7CisgICAgICBlbHNlIAorICAgICAgICBlcnJvciAoIk5vIG1lbW9yeSBhdmFpbGFibGUgdG8gcHJvZ3JhbTogY2FsbCB0byBtYWxsb2MgZmFpbGVkIik7CisgICAgfQorICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgQ09SRV9BRERSCithbGxvY2F0ZV9zcGFjZV9pbl9pbmZlcmlvciAobGVuKQorICAgICBpbnQgbGVuOworeworICByZXR1cm4gdmFsdWVfYXNfbG9uZyAodmFsdWVfYWxsb2NhdGVfc3BhY2VfaW5faW5mZXJpb3IgKGxlbikpOworfQorCisvKiBDYXN0IHZhbHVlIEFSRzIgdG8gdHlwZSBUWVBFIGFuZCByZXR1cm4gYXMgYSB2YWx1ZS4KKyAgIE1vcmUgZ2VuZXJhbCB0aGFuIGEgQyBjYXN0OiBhY2NlcHRzIGFueSB0d28gdHlwZXMgb2YgdGhlIHNhbWUgbGVuZ3RoLAorICAgYW5kIGlmIEFSRzIgaXMgYW4gbHZhbHVlIGl0IGNhbiBiZSBjYXN0IGludG8gYW55dGhpbmcgYXQgYWxsLiAgKi8KKy8qIEluIEMrKywgY2FzdHMgbWF5IGNoYW5nZSBwb2ludGVyIG9yIG9iamVjdCByZXByZXNlbnRhdGlvbnMuICAqLworCit2YWx1ZV9wdHIKK3ZhbHVlX2Nhc3QgKHR5cGUsIGFyZzIpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICByZWdpc3RlciB2YWx1ZV9wdHIgYXJnMjsKK3sKKyAgcmVnaXN0ZXIgZW51bSB0eXBlX2NvZGUgY29kZTE7CisgIHJlZ2lzdGVyIGVudW0gdHlwZV9jb2RlIGNvZGUyOworICByZWdpc3RlciBpbnQgc2NhbGFyOworICBzdHJ1Y3QgdHlwZSAqdHlwZTI7CisKKyAgaW50IGNvbnZlcnRfdG9fYm9vbGVhbiA9IDA7CisgIAorICBpZiAoVkFMVUVfVFlQRSAoYXJnMikgPT0gdHlwZSkKKyAgICByZXR1cm4gYXJnMjsKKworICBDSEVDS19UWVBFREVGICh0eXBlKTsKKyAgY29kZTEgPSBUWVBFX0NPREUgKHR5cGUpOworICBDT0VSQ0VfUkVGKGFyZzIpOworICB0eXBlMiA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZzIpKTsKKworICAvKiBBIGNhc3QgdG8gYW4gdW5kZXRlcm1pbmVkLWxlbmd0aCBhcnJheV90eXBlLCBzdWNoIGFzIChUWVBFIFtdKU9CSkVDVCwKKyAgICAgaXMgdHJlYXRlZCBsaWtlIGEgY2FzdCB0byAoVFlQRSBbTl0pT0JKRUNULAorICAgICB3aGVyZSBOIGlzIHNpemVvZihPQkpFQ1QpL3NpemVvZihUWVBFKS4gKi8KKyAgaWYgKGNvZGUxID09IFRZUEVfQ09ERV9BUlJBWSkKKyAgICB7CisgICAgICBzdHJ1Y3QgdHlwZSAqZWxlbWVudF90eXBlID0gVFlQRV9UQVJHRVRfVFlQRSAodHlwZSk7CisgICAgICB1bnNpZ25lZCBlbGVtZW50X2xlbmd0aCA9IFRZUEVfTEVOR1RIIChjaGVja190eXBlZGVmIChlbGVtZW50X3R5cGUpKTsKKyAgICAgIGlmIChlbGVtZW50X2xlbmd0aCA+IDAKKwkgICYmIFRZUEVfQVJSQVlfVVBQRVJfQk9VTkRfVFlQRSAodHlwZSkgPT0gQk9VTkRfQ0FOTk9UX0JFX0RFVEVSTUlORUQpCisJeworCSAgc3RydWN0IHR5cGUgKnJhbmdlX3R5cGUgPSBUWVBFX0lOREVYX1RZUEUgKHR5cGUpOworCSAgaW50IHZhbF9sZW5ndGggPSBUWVBFX0xFTkdUSCAodHlwZTIpOworCSAgTE9OR0VTVCBsb3dfYm91bmQsIGhpZ2hfYm91bmQsIG5ld19sZW5ndGg7CisJICBpZiAoZ2V0X2Rpc2NyZXRlX2JvdW5kcyAocmFuZ2VfdHlwZSwgJmxvd19ib3VuZCwgJmhpZ2hfYm91bmQpIDwgMCkKKwkgICAgbG93X2JvdW5kID0gMCwgaGlnaF9ib3VuZCA9IDA7CisJICBuZXdfbGVuZ3RoID0gdmFsX2xlbmd0aCAvIGVsZW1lbnRfbGVuZ3RoOworCSAgaWYgKHZhbF9sZW5ndGggJSBlbGVtZW50X2xlbmd0aCAhPSAwKQorCSAgICB3YXJuaW5nKCJhcnJheSBlbGVtZW50IHR5cGUgc2l6ZSBkb2VzIG5vdCBkaXZpZGUgb2JqZWN0IHNpemUgaW4gY2FzdCIpOworCSAgLyogRklYTUUtdHlwZS1hbGxvY2F0aW9uOiBuZWVkIGEgd2F5IHRvIGZyZWUgdGhpcyB0eXBlIHdoZW4gd2UgYXJlCisJICAgICBkb25lIHdpdGggaXQuICAqLworCSAgcmFuZ2VfdHlwZSA9IGNyZWF0ZV9yYW5nZV90eXBlICgoc3RydWN0IHR5cGUgKikgTlVMTCwKKwkJCQkJICBUWVBFX1RBUkdFVF9UWVBFIChyYW5nZV90eXBlKSwKKwkJCQkJICBsb3dfYm91bmQsCisJCQkJCSAgbmV3X2xlbmd0aCArIGxvd19ib3VuZCAtIDEpOworCSAgVkFMVUVfVFlQRSAoYXJnMikgPSBjcmVhdGVfYXJyYXlfdHlwZSAoKHN0cnVjdCB0eXBlICopIE5VTEwsCisJCQkJCQkgZWxlbWVudF90eXBlLCByYW5nZV90eXBlKTsKKwkgIHJldHVybiBhcmcyOworCX0KKyAgICB9CisKKyAgaWYgKGN1cnJlbnRfbGFuZ3VhZ2UtPmNfc3R5bGVfYXJyYXlzCisgICAgICAmJiBUWVBFX0NPREUgKHR5cGUyKSA9PSBUWVBFX0NPREVfQVJSQVkpCisgICAgYXJnMiA9IHZhbHVlX2NvZXJjZV9hcnJheSAoYXJnMik7CisKKyAgaWYgKFRZUEVfQ09ERSAodHlwZTIpID09IFRZUEVfQ09ERV9GVU5DKQorICAgIGFyZzIgPSB2YWx1ZV9jb2VyY2VfZnVuY3Rpb24gKGFyZzIpOworCisgIHR5cGUyID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnMikpOworICBDT0VSQ0VfVkFSWUlOR19BUlJBWSAoYXJnMiwgdHlwZTIpOworICBjb2RlMiA9IFRZUEVfQ09ERSAodHlwZTIpOworCisgIGlmIChjb2RlMSA9PSBUWVBFX0NPREVfQ09NUExFWCkKKyAgICByZXR1cm4gY2FzdF9pbnRvX2NvbXBsZXggKHR5cGUsIGFyZzIpOworICBpZiAoY29kZTEgPT0gVFlQRV9DT0RFX0JPT0wpCisgICAgeworICAgICAgY29kZTEgPSBUWVBFX0NPREVfSU5UOworICAgICAgY29udmVydF90b19ib29sZWFuID0gMTsKKyAgICB9CisgIGlmIChjb2RlMSA9PSBUWVBFX0NPREVfQ0hBUikKKyAgICBjb2RlMSA9IFRZUEVfQ09ERV9JTlQ7CisgIGlmIChjb2RlMiA9PSBUWVBFX0NPREVfQk9PTCB8fCBjb2RlMiA9PSBUWVBFX0NPREVfQ0hBUikKKyAgICBjb2RlMiA9IFRZUEVfQ09ERV9JTlQ7CisKKyAgc2NhbGFyID0gKGNvZGUyID09IFRZUEVfQ09ERV9JTlQgfHwgY29kZTIgPT0gVFlQRV9DT0RFX0ZMVAorCSAgICB8fCBjb2RlMiA9PSBUWVBFX0NPREVfRU5VTSB8fCBjb2RlMiA9PSBUWVBFX0NPREVfUkFOR0UpOworCisgIGlmICggICBjb2RlMSA9PSBUWVBFX0NPREVfU1RSVUNUCisgICAgICAmJiBjb2RlMiA9PSBUWVBFX0NPREVfU1RSVUNUCisgICAgICAmJiBUWVBFX05BTUUgKHR5cGUpICE9IDApCisgICAgeworICAgICAgLyogTG9vayBpbiB0aGUgdHlwZSBvZiB0aGUgc291cmNlIHRvIHNlZSBpZiBpdCBjb250YWlucyB0aGUKKwkgdHlwZSBvZiB0aGUgdGFyZ2V0IGFzIGEgc3VwZXJjbGFzcy4gIElmIHNvLCB3ZSdsbCBuZWVkIHRvCisJIG9mZnNldCB0aGUgb2JqZWN0IGluIGFkZGl0aW9uIHRvIGNoYW5naW5nIGl0cyB0eXBlLiAgKi8KKyAgICAgIHZhbHVlX3B0ciB2ID0gc2VhcmNoX3N0cnVjdF9maWVsZCAodHlwZV9uYW1lX25vX3RhZyAodHlwZSksCisJCQkJCSBhcmcyLCAwLCB0eXBlMiwgMSk7CisgICAgICBpZiAodikKKwl7CisJICBWQUxVRV9UWVBFICh2KSA9IHR5cGU7CisJICByZXR1cm4gdjsKKwl9CisgICAgfQorICBpZiAoY29kZTEgPT0gVFlQRV9DT0RFX0ZMVCAmJiBzY2FsYXIpCisgICAgcmV0dXJuIHZhbHVlX2Zyb21fZG91YmxlICh0eXBlLCB2YWx1ZV9hc19kb3VibGUgKGFyZzIpKTsKKyAgZWxzZSBpZiAoKGNvZGUxID09IFRZUEVfQ09ERV9JTlQgfHwgY29kZTEgPT0gVFlQRV9DT0RFX0VOVU0KKwkgICAgfHwgY29kZTEgPT0gVFlQRV9DT0RFX1JBTkdFKQorCSAgICYmIChzY2FsYXIgfHwgY29kZTIgPT0gVFlQRV9DT0RFX1BUUikpCisgICAgeworICAgICAgTE9OR0VTVCBsb25nZXN0OworICAgICAgCisgICAgICBpZiAoaHBfc29tX3NvbV9vYmplY3RfcHJlc2VudCAmJiAgLyogaWYgdGFyZ2V0IGNvbXBpbGVkIGJ5IEhQIGFDQyAqLyAKKyAgICAgICAgICAoY29kZTIgPT0gVFlQRV9DT0RFX1BUUikpCisgICAgICAgIHsKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgKiBwdHI7CisgICAgICAgICAgdmFsdWVfcHRyIHJldHZhbHA7CisgICAgICAgICAgCisgICAgICAgICAgc3dpdGNoIChUWVBFX0NPREUgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUyKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIFdpdGggSFAgYUNDLCBwb2ludGVycyB0byBkYXRhIG1lbWJlcnMgaGF2ZSBhIGJpYXMgKi8gCisgICAgICAgICAgICAgIGNhc2UgVFlQRV9DT0RFX01FTUJFUjoKKyAgICAgICAgICAgICAgICByZXR2YWxwID0gdmFsdWVfZnJvbV9sb25nZXN0ICh0eXBlLCB2YWx1ZV9hc19sb25nIChhcmcyKSk7CisgICAgICAgICAgICAgICAgcHRyID0gKHVuc2lnbmVkIGludCAqKSBWQUxVRV9DT05URU5UUyAocmV0dmFscCk7IC8qIGZvcmNlIGV2YWx1YXRpb24gKi8KKyAgICAgICAgICAgICAgICAqcHRyICY9IH4weDIwMDAwMDAwOyAvKiB6YXAgMjl0aCBiaXQgdG8gcmVtb3ZlIGJpYXMgKi8gCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbHA7CisKKyAgICAgICAgICAgICAgLyogV2hpbGUgcG9pbnRlcnMgdG8gbWV0aG9kcyBkb24ndCByZWFsbHkgcG9pbnQgdG8gYSBmdW5jdGlvbiAqLyAKKyAgICAgICAgICAgICAgY2FzZSBUWVBFX0NPREVfTUVUSE9EOgorICAgICAgICAgICAgICAgIGVycm9yICgiUG9pbnRlcnMgdG8gbWV0aG9kcyBub3Qgc3VwcG9ydGVkIHdpdGggSFAgYUNDIik7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsgLyogZmFsbCBvdXQgYW5kIGdvIHRvIG5vcm1hbCBoYW5kbGluZyAqLyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgbG9uZ2VzdCA9IHZhbHVlX2FzX2xvbmcgKGFyZzIpOworICAgICAgcmV0dXJuIHZhbHVlX2Zyb21fbG9uZ2VzdCAodHlwZSwgY29udmVydF90b19ib29sZWFuID8gKExPTkdFU1QpIChsb25nZXN0ID8gMSA6IDApIDogbG9uZ2VzdCk7CisgICAgfQorICBlbHNlIGlmIChUWVBFX0xFTkdUSCAodHlwZSkgPT0gVFlQRV9MRU5HVEggKHR5cGUyKSkKKyAgICB7CisgICAgICBpZiAoY29kZTEgPT0gVFlQRV9DT0RFX1BUUiAmJiBjb2RlMiA9PSBUWVBFX0NPREVfUFRSKQorCXsKKwkgIHN0cnVjdCB0eXBlICp0MSA9IGNoZWNrX3R5cGVkZWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKKwkgIHN0cnVjdCB0eXBlICp0MiA9IGNoZWNrX3R5cGVkZWYgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUyKSk7CisJICBpZiAoICAgVFlQRV9DT0RFICh0MSkgPT0gVFlQRV9DT0RFX1NUUlVDVAorCSAgICAgICYmIFRZUEVfQ09ERSAodDIpID09IFRZUEVfQ09ERV9TVFJVQ1QKKwkgICAgICAmJiAhdmFsdWVfbG9naWNhbF9ub3QgKGFyZzIpKQorCSAgICB7CisJICAgICAgdmFsdWVfcHRyIHY7CisKKwkgICAgICAvKiBMb29rIGluIHRoZSB0eXBlIG9mIHRoZSBzb3VyY2UgdG8gc2VlIGlmIGl0IGNvbnRhaW5zIHRoZQorCQkgdHlwZSBvZiB0aGUgdGFyZ2V0IGFzIGEgc3VwZXJjbGFzcy4gIElmIHNvLCB3ZSdsbCBuZWVkIHRvCisJCSBvZmZzZXQgdGhlIHBvaW50ZXIgcmF0aGVyIHRoYW4ganVzdCBjaGFuZ2UgaXRzIHR5cGUuICAqLworCSAgICAgIGlmIChUWVBFX05BTUUgKHQxKSAhPSBOVUxMKQorCQl7CisJCSAgdiA9IHNlYXJjaF9zdHJ1Y3RfZmllbGQgKHR5cGVfbmFtZV9ub190YWcgKHQxKSwKKwkJCQkJICAgdmFsdWVfaW5kIChhcmcyKSwgMCwgdDIsIDEpOworCQkgIGlmICh2KQorCQkgICAgeworCQkgICAgICB2ID0gdmFsdWVfYWRkciAodik7CisJCSAgICAgIFZBTFVFX1RZUEUgKHYpID0gdHlwZTsKKwkJICAgICAgcmV0dXJuIHY7CisJCSAgICB9CisJCX0KKworCSAgICAgIC8qIExvb2sgaW4gdGhlIHR5cGUgb2YgdGhlIHRhcmdldCB0byBzZWUgaWYgaXQgY29udGFpbnMgdGhlCisJCSB0eXBlIG9mIHRoZSBzb3VyY2UgYXMgYSBzdXBlcmNsYXNzLiAgSWYgc28sIHdlJ2xsIG5lZWQgdG8KKwkJIG9mZnNldCB0aGUgcG9pbnRlciByYXRoZXIgdGhhbiBqdXN0IGNoYW5nZSBpdHMgdHlwZS4KKwkJIEZJWE1FOiBUaGlzIGZhaWxzIHNpbGVudGx5IHdpdGggdmlydHVhbCBpbmhlcml0YW5jZS4gICovCisJICAgICAgaWYgKFRZUEVfTkFNRSAodDIpICE9IE5VTEwpCisJCXsKKwkJICB2ID0gc2VhcmNoX3N0cnVjdF9maWVsZCAodHlwZV9uYW1lX25vX3RhZyAodDIpLAorCQkJCQkgICB2YWx1ZV96ZXJvICh0MSwgbm90X2x2YWwpLCAwLCB0MSwgMSk7CisJCSAgaWYgKHYpCisJCSAgICB7CisJCSAgICAgIHZhbHVlX3B0ciB2MiA9IHZhbHVlX2luZCAoYXJnMik7CisJCSAgICAgIFZBTFVFX0FERFJFU1MgKHYyKSAtPSBWQUxVRV9BRERSRVNTICh2KQorCQkJCQkgICAgKyBWQUxVRV9PRkZTRVQgKHYpOworCQkgICAgICB2MiA9IHZhbHVlX2FkZHIgKHYyKTsKKwkJICAgICAgVkFMVUVfVFlQRSAodjIpID0gdHlwZTsKKwkJICAgICAgcmV0dXJuIHYyOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIC8qIE5vIHN1cGVyY2xhc3MgZm91bmQsIGp1c3QgZmFsbCB0aHJvdWdoIHRvIGNoYW5nZSBwdHIgdHlwZS4gICovCisJfQorICAgICAgVkFMVUVfVFlQRSAoYXJnMikgPSB0eXBlOworICAgICAgVkFMVUVfRU5DTE9TSU5HX1RZUEUgKGFyZzIpID0gdHlwZTsgIC8qIHBhaTogY2hrX3ZhbCAqLworICAgICAgVkFMVUVfUE9JTlRFRF9UT19PRkZTRVQgKGFyZzIpID0gMDsgIC8qIHBhaTogY2hrX3ZhbCAqLworICAgICAgcmV0dXJuIGFyZzI7CisgICAgfQorICBlbHNlIGlmIChjaGlsbF92YXJ5aW5nX3R5cGUgKHR5cGUpKQorICAgIHsKKyAgICAgIHN0cnVjdCB0eXBlICpyYW5nZTEsICpyYW5nZTIsICplbHR5cGUxLCAqZWx0eXBlMjsKKyAgICAgIHZhbHVlX3B0ciB2YWw7CisgICAgICBpbnQgY291bnQxLCBjb3VudDI7CisgICAgICBMT05HRVNUIGxvd19ib3VuZCwgaGlnaF9ib3VuZDsKKyAgICAgIGNoYXIgKnZhbGFkZHIsICp2YWxhZGRyX2RhdGE7CisgICAgICAvKiBGb3IgbGludCB3YXJuaW5nIGFib3V0IGVsdHlwZTIgcG9zc2libHkgdW5pbml0aWFsaXplZDogKi8KKyAgICAgIGVsdHlwZTIgPSBOVUxMOworICAgICAgaWYgKGNvZGUyID09IFRZUEVfQ09ERV9CSVRTVFJJTkcpCisJZXJyb3IgKCJub3QgaW1wbGVtZW50ZWQ6IGNvbnZlcnRpbmcgYml0c3RyaW5nIHRvIHZhcnlpbmcgdHlwZSIpOworICAgICAgaWYgKChjb2RlMiAhPSBUWVBFX0NPREVfQVJSQVkgJiYgY29kZTIgIT0gVFlQRV9DT0RFX1NUUklORykKKwkgIHx8IChlbHR5cGUxID0gY2hlY2tfdHlwZWRlZiAoVFlQRV9UQVJHRVRfVFlQRSAoVFlQRV9GSUVMRF9UWVBFICh0eXBlLCAxKSkpLAorCSAgICAgIGVsdHlwZTIgPSBjaGVja190eXBlZGVmIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlMikpLAorCSAgICAgIChUWVBFX0xFTkdUSCAoZWx0eXBlMSkgIT0gVFlQRV9MRU5HVEggKGVsdHlwZTIpCisJICAgICAgIC8qIHx8IFRZUEVfQ09ERSAoZWx0eXBlMSkgIT0gVFlQRV9DT0RFIChlbHR5cGUyKSAqLyApKSkKKwllcnJvciAoIkludmFsaWQgY29udmVyc2lvbiB0byB2YXJ5aW5nIHR5cGUiKTsKKyAgICAgIHJhbmdlMSA9IFRZUEVfRklFTERfVFlQRSAoVFlQRV9GSUVMRF9UWVBFICh0eXBlLCAxKSwgMCk7CisgICAgICByYW5nZTIgPSBUWVBFX0ZJRUxEX1RZUEUgKHR5cGUyLCAwKTsKKyAgICAgIGlmIChnZXRfZGlzY3JldGVfYm91bmRzIChyYW5nZTEsICZsb3dfYm91bmQsICZoaWdoX2JvdW5kKSA8IDApCisJY291bnQxID0gLTE7CisgICAgICBlbHNlCisJY291bnQxID0gaGlnaF9ib3VuZCAtIGxvd19ib3VuZCArIDE7CisgICAgICBpZiAoZ2V0X2Rpc2NyZXRlX2JvdW5kcyAocmFuZ2UyLCAmbG93X2JvdW5kLCAmaGlnaF9ib3VuZCkgPCAwKQorCWNvdW50MSA9IC0xLCBjb3VudDIgPSAwOyAgLyogVG8gZm9yY2UgZXJyb3IgYmVmb3JlICovCisgICAgICBlbHNlCisJY291bnQyID0gaGlnaF9ib3VuZCAtIGxvd19ib3VuZCArIDE7CisgICAgICBpZiAoY291bnQyID4gY291bnQxKQorCWVycm9yICgidGFyZ2V0IHZhcnlpbmcgdHlwZSBpcyB0b28gc21hbGwiKTsKKyAgICAgIHZhbCA9IGFsbG9jYXRlX3ZhbHVlICh0eXBlKTsKKyAgICAgIHZhbGFkZHIgPSBWQUxVRV9DT05URU5UU19SQVcgKHZhbCk7CisgICAgICB2YWxhZGRyX2RhdGEgPSB2YWxhZGRyICsgVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIDEpIC8gODsKKyAgICAgIC8qIFNldCB2YWwncyBfX3Zhcl9sZW5ndGggZmllbGQgdG8gY291bnQyLiAqLworICAgICAgc3RvcmVfc2lnbmVkX2ludGVnZXIgKHZhbGFkZHIsIFRZUEVfTEVOR1RIIChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIDApKSwKKwkJCSAgICBjb3VudDIpOworICAgICAgLyogU2V0IHRoZSBfX3Zhcl9kYXRhIGZpZWxkIHRvIGNvdW50MiBlbGVtZW50cyBjb3BpZWQgZnJvbSBhcmcyLiAqLworICAgICAgbWVtY3B5ICh2YWxhZGRyX2RhdGEsIFZBTFVFX0NPTlRFTlRTIChhcmcyKSwKKwkgICAgICBjb3VudDIgKiBUWVBFX0xFTkdUSCAoZWx0eXBlMikpOworICAgICAgLyogWmVybyB0aGUgcmVzdCBvZiB0aGUgX192YXJfZGF0YSBmaWVsZCBvZiB2YWwuICovCisgICAgICBtZW1zZXQgKHZhbGFkZHJfZGF0YSArIGNvdW50MiAqIFRZUEVfTEVOR1RIIChlbHR5cGUyKSwgJ1wwJywKKwkgICAgICAoY291bnQxIC0gY291bnQyKSAqIFRZUEVfTEVOR1RIIChlbHR5cGUyKSk7CisgICAgICByZXR1cm4gdmFsOworICAgIH0KKyAgZWxzZSBpZiAoVkFMVUVfTFZBTCAoYXJnMikgPT0gbHZhbF9tZW1vcnkpCisgICAgeworICAgICAgcmV0dXJuIHZhbHVlX2F0X2xhenkgKHR5cGUsIFZBTFVFX0FERFJFU1MgKGFyZzIpICsgVkFMVUVfT0ZGU0VUIChhcmcyKSwKKwkJCSAgICBWQUxVRV9CRkRfU0VDVElPTiAoYXJnMikpOworICAgIH0KKyAgZWxzZSBpZiAoY29kZTEgPT0gVFlQRV9DT0RFX1ZPSUQpCisgICAgeworICAgICAgcmV0dXJuIHZhbHVlX3plcm8gKGJ1aWx0aW5fdHlwZV92b2lkLCBub3RfbHZhbCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZXJyb3IgKCJJbnZhbGlkIGNhc3QuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qIENyZWF0ZSBhIHZhbHVlIG9mIHR5cGUgVFlQRSB0aGF0IGlzIHplcm8sIGFuZCByZXR1cm4gaXQuICAqLworCit2YWx1ZV9wdHIKK3ZhbHVlX3plcm8gKHR5cGUsIGx2KQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgZW51bSBsdmFsX3R5cGUgbHY7Cit7CisgIHJlZ2lzdGVyIHZhbHVlX3B0ciB2YWwgPSBhbGxvY2F0ZV92YWx1ZSAodHlwZSk7CisKKyAgbWVtc2V0IChWQUxVRV9DT05URU5UUyAodmFsKSwgMCwgVFlQRV9MRU5HVEggKGNoZWNrX3R5cGVkZWYgKHR5cGUpKSk7CisgIFZBTFVFX0xWQUwgKHZhbCkgPSBsdjsKKworICByZXR1cm4gdmFsOworfQorCisvKiBSZXR1cm4gYSB2YWx1ZSB3aXRoIHR5cGUgVFlQRSBsb2NhdGVkIGF0IEFERFIuICAKKworICAgQ2FsbCB2YWx1ZV9hdCBvbmx5IGlmIHRoZSBkYXRhIG5lZWRzIHRvIGJlIGZldGNoZWQgaW1tZWRpYXRlbHk7CisgICBpZiB3ZSBjYW4gYmUgJ2xhenknIGFuZCBkZWZlciB0aGUgZmV0Y2gsIHBlcmhhcHMgaW5kZWZpbmF0ZWx5LCBjYWxsCisgICB2YWx1ZV9hdF9sYXp5IGluc3RlYWQuICB2YWx1ZV9hdF9sYXp5IHNpbXBseSByZWNvcmRzIHRoZSBhZGRyZXNzIG9mCisgICB0aGUgZGF0YSBhbmQgc2V0cyB0aGUgbGF6eS1ldmFsdWF0aW9uLXJlcXVpcmVkIGZsYWcuICBUaGUgbGF6eSBmbGFnIAorICAgaXMgdGVzdGVkIGluIHRoZSBWQUxVRV9DT05URU5UUyBtYWNybywgd2hpY2ggaXMgdXNlZCBpZiBhbmQgd2hlbiAKKyAgIHRoZSBjb250ZW50cyBhcmUgYWN0dWFsbHkgcmVxdWlyZWQuIAorCisgICBOb3RlOiB2YWx1ZV9hdCBkb2VzICpOT1QqIGhhbmRsZSBlbWJlZGRlZCBvZmZzZXRzOyBwZXJmb3JtIHN1Y2gKKyAgIGFkanVzdG1lbnRzIGJlZm9yZSBvciBhZnRlciBjYWxsaW5nIGl0LiAqLworCit2YWx1ZV9wdHIKK3ZhbHVlX2F0ICh0eXBlLCBhZGRyLCBzZWN0KQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGFzZWN0aW9uICpzZWN0OworeworICByZWdpc3RlciB2YWx1ZV9wdHIgdmFsOworCisgIGlmIChUWVBFX0NPREUgKGNoZWNrX3R5cGVkZWYgKHR5cGUpKSA9PSBUWVBFX0NPREVfVk9JRCkKKyAgICBlcnJvciAoIkF0dGVtcHQgdG8gZGVyZWZlcmVuY2UgYSBnZW5lcmljIHBvaW50ZXIuIik7CisKKyAgdmFsID0gYWxsb2NhdGVfdmFsdWUgKHR5cGUpOworCisjaWZkZWYgR0RCX1RBUkdFVF9JU19EMTBWCisgIGlmIChUWVBFX0NPREUgKHR5cGUpID09IFRZUEVfQ09ERV9QVFIKKyAgICAgICYmIFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpCisgICAgICAmJiAoVFlQRV9DT0RFIChUWVBFX1RBUkdFVF9UWVBFICh0eXBlKSkgPT0gVFlQRV9DT0RFX0ZVTkMpKQorICAgIHsKKyAgICAgIC8qIHBvaW50ZXIgdG8gZnVuY3Rpb24gKi8KKyAgICAgIHVuc2lnbmVkIGxvbmcgbnVtOworICAgICAgdW5zaWduZWQgc2hvcnQgc251bTsKKyAgICAgIHNudW0gPSByZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyIChhZGRyLCAyKTsKKyAgICAgIG51bSA9IEQxMFZfTUFLRV9JQUREUihzbnVtKTsKKyAgICAgIHN0b3JlX2FkZHJlc3MgKCBWQUxVRV9DT05URU5UU19SQVcgKHZhbCksIDQsIG51bSk7CisgICAgfQorICBlbHNlIGlmIChUWVBFX0NPREUodHlwZSkgPT0gVFlQRV9DT0RFX1BUUikKKyAgICB7CisgICAgICAvKiBwb2ludGVyIHRvIGRhdGEgKi8KKyAgICAgIHVuc2lnbmVkIGxvbmcgbnVtOworICAgICAgdW5zaWduZWQgc2hvcnQgc251bTsKKyAgICAgIHNudW0gPSByZWFkX21lbW9yeV91bnNpZ25lZF9pbnRlZ2VyIChhZGRyLCAyKTsKKyAgICAgIG51bSA9IEQxMFZfTUFLRV9EQUREUihzbnVtKTsKKyAgICAgIHN0b3JlX2FkZHJlc3MgKCBWQUxVRV9DT05URU5UU19SQVcgKHZhbCksIDQsIG51bSk7IAorICAgIH0KKyAgZWxzZQorI2VuZGlmCisgICAgcmVhZF9tZW1vcnlfc2VjdGlvbiAoYWRkciwgVkFMVUVfQ09OVEVOVFNfQUxMX1JBVyAodmFsKSwgVFlQRV9MRU5HVEggKHR5cGUpLCBzZWN0KTsKKworICBWQUxVRV9MVkFMICh2YWwpID0gbHZhbF9tZW1vcnk7CisgIFZBTFVFX0FERFJFU1MgKHZhbCkgPSBhZGRyOworICBWQUxVRV9CRkRfU0VDVElPTiAodmFsKSA9IHNlY3Q7CisKKyAgcmV0dXJuIHZhbDsKK30KKworLyogUmV0dXJuIGEgbGF6eSB2YWx1ZSB3aXRoIHR5cGUgVFlQRSBsb2NhdGVkIGF0IEFERFIgKGNmLiB2YWx1ZV9hdCkuICAqLworCit2YWx1ZV9wdHIKK3ZhbHVlX2F0X2xhenkgKHR5cGUsIGFkZHIsIHNlY3QpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgYXNlY3Rpb24gKnNlY3Q7Cit7CisgIHJlZ2lzdGVyIHZhbHVlX3B0ciB2YWw7CisKKyAgaWYgKFRZUEVfQ09ERSAoY2hlY2tfdHlwZWRlZiAodHlwZSkpID09IFRZUEVfQ09ERV9WT0lEKQorICAgIGVycm9yICgiQXR0ZW1wdCB0byBkZXJlZmVyZW5jZSBhIGdlbmVyaWMgcG9pbnRlci4iKTsKKworICB2YWwgPSBhbGxvY2F0ZV92YWx1ZSAodHlwZSk7CisKKyAgVkFMVUVfTFZBTCAodmFsKSA9IGx2YWxfbWVtb3J5OworICBWQUxVRV9BRERSRVNTICh2YWwpID0gYWRkcjsKKyAgVkFMVUVfTEFaWSAodmFsKSA9IDE7CisgIFZBTFVFX0JGRF9TRUNUSU9OICh2YWwpID0gc2VjdDsKKworICByZXR1cm4gdmFsOworfQorCisvKiBDYWxsZWQgb25seSBmcm9tIHRoZSBWQUxVRV9DT05URU5UUyBhbmQgVkFMVUVfQ09OVEVOVFNfQUxMIG1hY3JvcywgCisgICBpZiB0aGUgY3VycmVudCBkYXRhIGZvciBhIHZhcmlhYmxlIG5lZWRzIHRvIGJlIGxvYWRlZCBpbnRvIAorICAgVkFMVUVfQ09OVEVOVFMoVkFMKS4gIEZldGNoZXMgdGhlIGRhdGEgZnJvbSB0aGUgdXNlcidzIHByb2Nlc3MsIGFuZCAKKyAgIGNsZWFycyB0aGUgbGF6eSBmbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlciBpcyB2YWxpZC4KKworICAgSWYgdGhlIHZhbHVlIGlzIHplcm8tbGVuZ3RoLCB3ZSBhdm9pZCBjYWxsaW5nIHJlYWRfbWVtb3J5LCB3aGljaCB3b3VsZAorICAgYWJvcnQuICBXZSBtYXJrIHRoZSB2YWx1ZSBhcyBmZXRjaGVkIGFueXdheSAtLSBhbGwgMCBieXRlcyBvZiBpdC4KKworICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgdmFsdWUgYmVjYXVzZSBpdCBpcyB1c2VkIGluIHRoZSBWQUxVRV9DT05URU5UUworICAgbWFjcm8gYXMgcGFydCBvZiBhbiBleHByZXNzaW9uLCB3aGVyZSBhIHZvaWQgd291bGQgbm90IHdvcmsuICBUaGUKKyAgIHZhbHVlIGlzIGlnbm9yZWQuICAqLworCitpbnQKK3ZhbHVlX2ZldGNoX2xhenkgKHZhbCkKKyAgICAgcmVnaXN0ZXIgdmFsdWVfcHRyIHZhbDsKK3sKKyAgQ09SRV9BRERSIGFkZHIgPSBWQUxVRV9BRERSRVNTICh2YWwpICsgVkFMVUVfT0ZGU0VUICh2YWwpOworICBpbnQgbGVuZ3RoID0gVFlQRV9MRU5HVEggKFZBTFVFX0VOQ0xPU0lOR19UWVBFICh2YWwpKTsKKworI2lmZGVmIEdEQl9UQVJHRVRfSVNfRDEwVgorICBzdHJ1Y3QgdHlwZSAqdHlwZSA9IFZBTFVFX1RZUEUodmFsKTsKKyAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1BUUgorICAgICAgJiYgVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkKKyAgICAgICYmIChUWVBFX0NPREUgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKSA9PSBUWVBFX0NPREVfRlVOQykpCisgICAgeworICAgICAgLyogcG9pbnRlciB0byBmdW5jdGlvbiAqLworICAgICAgdW5zaWduZWQgbG9uZyBudW07CisgICAgICB1bnNpZ25lZCBzaG9ydCBzbnVtOworICAgICAgc251bSA9IHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKGFkZHIsIDIpOworICAgICAgbnVtID0gRDEwVl9NQUtFX0lBRERSKHNudW0pOworICAgICAgc3RvcmVfYWRkcmVzcyAoIFZBTFVFX0NPTlRFTlRTX1JBVyAodmFsKSwgNCwgbnVtKTsKKyAgICB9CisgIGVsc2UgaWYgKFRZUEVfQ09ERSh0eXBlKSA9PSBUWVBFX0NPREVfUFRSKQorICAgIHsKKyAgICAgIC8qIHBvaW50ZXIgdG8gZGF0YSAqLworICAgICAgdW5zaWduZWQgbG9uZyBudW07CisgICAgICB1bnNpZ25lZCBzaG9ydCBzbnVtOworICAgICAgc251bSA9IHJlYWRfbWVtb3J5X3Vuc2lnbmVkX2ludGVnZXIgKGFkZHIsIDIpOworICAgICAgbnVtID0gRDEwVl9NQUtFX0RBRERSKHNudW0pOworICAgICAgc3RvcmVfYWRkcmVzcyAoIFZBTFVFX0NPTlRFTlRTX1JBVyAodmFsKSwgNCwgbnVtKTsgCisgICAgfQorICBlbHNlCisjZW5kaWYKKworICBpZiAobGVuZ3RoKQorICAgIHJlYWRfbWVtb3J5X3NlY3Rpb24gKGFkZHIsIFZBTFVFX0NPTlRFTlRTX0FMTF9SQVcgKHZhbCksIGxlbmd0aCwKKwkJCSBWQUxVRV9CRkRfU0VDVElPTiAodmFsKSk7CisgIFZBTFVFX0xBWlkgKHZhbCkgPSAwOworICByZXR1cm4gMDsKK30KKworCisvKiBTdG9yZSB0aGUgY29udGVudHMgb2YgRlJPTVZBTCBpbnRvIHRoZSBsb2NhdGlvbiBvZiBUT1ZBTC4KKyAgIFJldHVybiBhIG5ldyB2YWx1ZSB3aXRoIHRoZSBsb2NhdGlvbiBvZiBUT1ZBTCBhbmQgY29udGVudHMgb2YgRlJPTVZBTC4gICovCisKK3ZhbHVlX3B0cgordmFsdWVfYXNzaWduICh0b3ZhbCwgZnJvbXZhbCkKKyAgICAgcmVnaXN0ZXIgdmFsdWVfcHRyIHRvdmFsLCBmcm9tdmFsOworeworICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgcmVnaXN0ZXIgdmFsdWVfcHRyIHZhbDsKKyAgY2hhciByYXdfYnVmZmVyW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisgIGludCB1c2VfYnVmZmVyID0gMDsKKworICBpZiAoIXRvdmFsLT5tb2RpZmlhYmxlKQorICAgIGVycm9yICgiTGVmdCBvcGVyYW5kIG9mIGFzc2lnbm1lbnQgaXMgbm90IGEgbW9kaWZpYWJsZSBsdmFsdWUuIik7CisKKyAgQ09FUkNFX1JFRiAodG92YWwpOworCisgIHR5cGUgPSBWQUxVRV9UWVBFICh0b3ZhbCk7CisgIGlmIChWQUxVRV9MVkFMICh0b3ZhbCkgIT0gbHZhbF9pbnRlcm5hbHZhcikKKyAgICBmcm9tdmFsID0gdmFsdWVfY2FzdCAodHlwZSwgZnJvbXZhbCk7CisgIGVsc2UKKyAgICBDT0VSQ0VfQVJSQVkgKGZyb212YWwpOworICBDSEVDS19UWVBFREVGICh0eXBlKTsKKworICAvKiBJZiBUT1ZBTCBpcyBhIHNwZWNpYWwgbWFjaGluZSByZWdpc3RlciByZXF1aXJpbmcgY29udmVyc2lvbgorICAgICBvZiBwcm9ncmFtIHZhbHVlcyB0byBhIHNwZWNpYWwgcmF3IGZvcm1hdCwKKyAgICAgY29udmVydCBGUk9NVkFMJ3MgY29udGVudHMgbm93LCB3aXRoIHJlc3VsdCBpbiBgcmF3X2J1ZmZlcicsCisgICAgIGFuZCBzZXQgVVNFX0JVRkZFUiB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlLiAgKi8KKworI2lmZGVmIFJFR0lTVEVSX0NPTlZFUlRJQkxFCisgIGlmIChWQUxVRV9SRUdOTyAodG92YWwpID49IDAKKyAgICAgICYmIFJFR0lTVEVSX0NPTlZFUlRJQkxFIChWQUxVRV9SRUdOTyAodG92YWwpKSkKKyAgICB7CisgICAgICBpbnQgcmVnbm8gPSBWQUxVRV9SRUdOTyAodG92YWwpOworICAgICAgaWYgKFJFR0lTVEVSX0NPTlZFUlRJQkxFIChyZWdubykpCisJeworCSAgc3RydWN0IHR5cGUgKmZyb210eXBlID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoZnJvbXZhbCkpOworCSAgUkVHSVNURVJfQ09OVkVSVF9UT19SQVcgKGZyb210eXBlLCByZWdubywKKwkJCQkgICBWQUxVRV9DT05URU5UUyAoZnJvbXZhbCksIHJhd19idWZmZXIpOworCSAgdXNlX2J1ZmZlciA9IFJFR0lTVEVSX1JBV19TSVpFIChyZWdubyk7CisJfQorICAgIH0KKyNlbmRpZgorCisgIHN3aXRjaCAoVkFMVUVfTFZBTCAodG92YWwpKQorICAgIHsKKyAgICBjYXNlIGx2YWxfaW50ZXJuYWx2YXI6CisgICAgICBzZXRfaW50ZXJuYWx2YXIgKFZBTFVFX0lOVEVSTkFMVkFSICh0b3ZhbCksIGZyb212YWwpOworICAgICAgdmFsID0gdmFsdWVfY29weSAoVkFMVUVfSU5URVJOQUxWQVIgKHRvdmFsKS0+dmFsdWUpOworICAgICAgVkFMVUVfRU5DTE9TSU5HX1RZUEUgKHZhbCkgPSBWQUxVRV9FTkNMT1NJTkdfVFlQRSAoZnJvbXZhbCk7CisgICAgICBWQUxVRV9FTUJFRERFRF9PRkZTRVQgKHZhbCkgPSBWQUxVRV9FTUJFRERFRF9PRkZTRVQgKGZyb212YWwpOworICAgICAgVkFMVUVfUE9JTlRFRF9UT19PRkZTRVQgKHZhbCkgPSBWQUxVRV9QT0lOVEVEX1RPX09GRlNFVCAoZnJvbXZhbCk7CisgICAgICByZXR1cm4gdmFsOworCisgICAgY2FzZSBsdmFsX2ludGVybmFsdmFyX2NvbXBvbmVudDoKKyAgICAgIHNldF9pbnRlcm5hbHZhcl9jb21wb25lbnQgKFZBTFVFX0lOVEVSTkFMVkFSICh0b3ZhbCksCisJCQkJIFZBTFVFX09GRlNFVCAodG92YWwpLAorCQkJCSBWQUxVRV9CSVRQT1MgKHRvdmFsKSwKKwkJCQkgVkFMVUVfQklUU0laRSAodG92YWwpLAorCQkJCSBmcm9tdmFsKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBsdmFsX21lbW9yeToKKyAgICAgIHsKKwljaGFyICpkZXN0X2J1ZmZlcjsKKyAgICAgICAgQ09SRV9BRERSIGNoYW5nZWRfYWRkcjsKKyAgICAgICAgaW50IGNoYW5nZWRfbGVuOworCisgICAgICAgIGlmIChWQUxVRV9CSVRTSVpFICh0b3ZhbCkpCisgICAgICAgICAgeworCSAgICBjaGFyIGJ1ZmZlcltzaXplb2YgKExPTkdFU1QpXTsKKwkgICAgLyogV2UgYXNzdW1lIHRoYXQgdGhlIGFyZ3VtZW50IHRvIHJlYWRfbWVtb3J5IGlzIGluIHVuaXRzIG9mCisJICAgICAgIGhvc3QgY2hhcnMuICBGSVhNRTogIElzIHRoYXQgY29ycmVjdD8gICovCisJICAgIGNoYW5nZWRfbGVuID0gKFZBTFVFX0JJVFBPUyAodG92YWwpCisJCSAgICAgKyBWQUxVRV9CSVRTSVpFICh0b3ZhbCkKKwkJICAgICArIEhPU1RfQ0hBUl9CSVQgLSAxKQorCQkgICAgLyBIT1NUX0NIQVJfQklUOworCisJICAgIGlmIChjaGFuZ2VkX2xlbiA+IChpbnQpIHNpemVvZiAoTE9OR0VTVCkpCisJICAgICAgZXJyb3IgKCJDYW4ndCBoYW5kbGUgYml0ZmllbGRzIHdoaWNoIGRvbid0IGZpdCBpbiBhICVkIGJpdCB3b3JkLiIsCisJCSAgICAgc2l6ZW9mIChMT05HRVNUKSAqIEhPU1RfQ0hBUl9CSVQpOworCisJICAgIHJlYWRfbWVtb3J5IChWQUxVRV9BRERSRVNTICh0b3ZhbCkgKyBWQUxVRV9PRkZTRVQgKHRvdmFsKSwKKwkJCSBidWZmZXIsIGNoYW5nZWRfbGVuKTsKKwkgICAgbW9kaWZ5X2ZpZWxkIChidWZmZXIsIHZhbHVlX2FzX2xvbmcgKGZyb212YWwpLAorCQkJICBWQUxVRV9CSVRQT1MgKHRvdmFsKSwgVkFMVUVfQklUU0laRSAodG92YWwpKTsKKwkgICAgY2hhbmdlZF9hZGRyID0gVkFMVUVfQUREUkVTUyAodG92YWwpICsgVkFMVUVfT0ZGU0VUICh0b3ZhbCk7CisJICAgIGRlc3RfYnVmZmVyID0gYnVmZmVyOworCSAgfQorCWVsc2UgaWYgKHVzZV9idWZmZXIpCisJICB7CisJICAgIGNoYW5nZWRfYWRkciA9IFZBTFVFX0FERFJFU1MgKHRvdmFsKSArIFZBTFVFX09GRlNFVCAodG92YWwpOworCSAgICBjaGFuZ2VkX2xlbiA9IHVzZV9idWZmZXI7CisJICAgIGRlc3RfYnVmZmVyID0gcmF3X2J1ZmZlcjsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGNoYW5nZWRfYWRkciA9IFZBTFVFX0FERFJFU1MgKHRvdmFsKSArIFZBTFVFX09GRlNFVCAodG92YWwpOworCSAgICBjaGFuZ2VkX2xlbiA9IFRZUEVfTEVOR1RIICh0eXBlKTsKKwkgICAgZGVzdF9idWZmZXIgPSBWQUxVRV9DT05URU5UUyAoZnJvbXZhbCk7CisJICB9CisKKwl3cml0ZV9tZW1vcnkgKGNoYW5nZWRfYWRkciwgZGVzdF9idWZmZXIsIGNoYW5nZWRfbGVuKTsKKwlpZiAobWVtb3J5X2NoYW5nZWRfaG9vaykKKwkgIG1lbW9yeV9jaGFuZ2VkX2hvb2sgKGNoYW5nZWRfYWRkciwgY2hhbmdlZF9sZW4pOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGx2YWxfcmVnaXN0ZXI6CisgICAgICBpZiAoVkFMVUVfQklUU0laRSAodG92YWwpKQorCXsKKwkgIGNoYXIgYnVmZmVyW3NpemVvZiAoTE9OR0VTVCldOworICAgICAgICAgIGludCBsZW4gPSBSRUdJU1RFUl9SQVdfU0laRSAoVkFMVUVfUkVHTk8gKHRvdmFsKSk7CisKKwkgIGlmIChsZW4gPiAoaW50KSBzaXplb2YgKExPTkdFU1QpKQorCSAgICBlcnJvciAoIkNhbid0IGhhbmRsZSBiaXRmaWVsZHMgaW4gcmVnaXN0ZXJzIGxhcmdlciB0aGFuICVkIGJpdHMuIiwKKwkJICAgc2l6ZW9mIChMT05HRVNUKSAqIEhPU1RfQ0hBUl9CSVQpOworCisJICBpZiAoVkFMVUVfQklUUE9TICh0b3ZhbCkgKyBWQUxVRV9CSVRTSVpFICh0b3ZhbCkKKwkgICAgICA+IGxlbiAqIEhPU1RfQ0hBUl9CSVQpCisJICAgIC8qIEdldHRpbmcgdGhpcyByaWdodCB3b3VsZCBpbnZvbHZlIGJlaW5nIHZlcnkgY2FyZWZ1bCBhYm91dAorCSAgICAgICBieXRlIG9yZGVyLiAgKi8KKwkgICAgZXJyb3IgKCJcCitDYW4ndCBoYW5kbGUgYml0ZmllbGQgd2hpY2ggZG9lc24ndCBmaXQgaW4gYSBzaW5nbGUgcmVnaXN0ZXIuIik7CisKKyAgICAgICAgICByZWFkX3JlZ2lzdGVyX2J5dGVzIChWQUxVRV9BRERSRVNTICh0b3ZhbCkgKyBWQUxVRV9PRkZTRVQgKHRvdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGxlbik7CisgICAgICAgICAgbW9kaWZ5X2ZpZWxkIChidWZmZXIsIHZhbHVlX2FzX2xvbmcgKGZyb212YWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfQklUUE9TICh0b3ZhbCksIFZBTFVFX0JJVFNJWkUgKHRvdmFsKSk7CisgICAgICAgICAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKFZBTFVFX0FERFJFU1MgKHRvdmFsKSArIFZBTFVFX09GRlNFVCAodG92YWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGxlbik7CisJfQorICAgICAgZWxzZSBpZiAodXNlX2J1ZmZlcikKKwl3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoVkFMVUVfQUREUkVTUyAodG92YWwpICsgVkFMVUVfT0ZGU0VUICh0b3ZhbCksCisJCQkgICAgICByYXdfYnVmZmVyLCB1c2VfYnVmZmVyKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworCSAgLyogRG8gYW55IGNvbnZlcnNpb24gbmVjZXNzYXJ5IHdoZW4gc3RvcmluZyB0aGlzIHR5cGUgdG8gbW9yZQorCSAgICAgdGhhbiBvbmUgcmVnaXN0ZXIuICAqLworI2lmZGVmIFJFR0lTVEVSX0NPTlZFUlRfRlJPTV9UWVBFCisJICBtZW1jcHkgKHJhd19idWZmZXIsIFZBTFVFX0NPTlRFTlRTIChmcm9tdmFsKSwgVFlQRV9MRU5HVEggKHR5cGUpKTsKKwkgIFJFR0lTVEVSX0NPTlZFUlRfRlJPTV9UWVBFKFZBTFVFX1JFR05PICh0b3ZhbCksIHR5cGUsIHJhd19idWZmZXIpOworCSAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKFZBTFVFX0FERFJFU1MgKHRvdmFsKSArIFZBTFVFX09GRlNFVCAodG92YWwpLAorCQkJCXJhd19idWZmZXIsIFRZUEVfTEVOR1RIICh0eXBlKSk7CisjZWxzZQorCSAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKFZBTFVFX0FERFJFU1MgKHRvdmFsKSArIFZBTFVFX09GRlNFVCAodG92YWwpLAorCQkJICAgICAgICBWQUxVRV9DT05URU5UUyAoZnJvbXZhbCksIFRZUEVfTEVOR1RIICh0eXBlKSk7CisjZW5kaWYKKwl9CisgICAgICAvKiBBc3NpZ25pbmcgdG8gdGhlIHN0YWNrIHBvaW50ZXIsIGZyYW1lIHBvaW50ZXIsIGFuZCBvdGhlcgorCSAoYXJjaGl0ZWN0dXJlIGFuZCBjYWxsaW5nIGNvbnZlbnRpb24gc3BlY2lmaWMpIHJlZ2lzdGVycyBtYXkKKwkgY2F1c2UgdGhlIGZyYW1lIGNhY2hlIHRvIGJlIG91dCBvZiBkYXRlLiAgV2UganVzdCBkbyB0aGlzCisJIG9uIGFsbCBhc3NpZ25tZW50cyB0byByZWdpc3RlcnMgZm9yIHNpbXBsaWNpdHk7IEkgZG91YnQgdGhlIHNsb3dkb3duCisJIG1hdHRlcnMuICAqLworICAgICAgcmVpbml0X2ZyYW1lX2NhY2hlICgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGx2YWxfcmVnX2ZyYW1lX3JlbGF0aXZlOgorICAgICAgeworCS8qIHZhbHVlIGlzIHN0b3JlZCBpbiBhIHNlcmllcyBvZiByZWdpc3RlcnMgaW4gdGhlIGZyYW1lCisJICAgc3BlY2lmaWVkIGJ5IHRoZSBzdHJ1Y3R1cmUuICBDb3B5IHRoYXQgdmFsdWUgb3V0LCBtb2RpZnkKKwkgICBpdCwgYW5kIGNvcHkgaXQgYmFjayBpbi4gICovCisJaW50IGFtb3VudF90b19jb3B5ID0gKFZBTFVFX0JJVFNJWkUgKHRvdmFsKSA/IDEgOiBUWVBFX0xFTkdUSCAodHlwZSkpOworCWludCByZWdfc2l6ZSA9IFJFR0lTVEVSX1JBV19TSVpFIChWQUxVRV9GUkFNRV9SRUdOVU0gKHRvdmFsKSk7CisJaW50IGJ5dGVfb2Zmc2V0ID0gVkFMVUVfT0ZGU0VUICh0b3ZhbCkgJSByZWdfc2l6ZTsKKwlpbnQgcmVnX29mZnNldCA9IFZBTFVFX09GRlNFVCAodG92YWwpIC8gcmVnX3NpemU7CisJaW50IGFtb3VudF9jb3BpZWQ7CisKKwkvKiBNYWtlIHRoZSBidWZmZXIgbGFyZ2UgZW5vdWdoIGluIGFsbCBjYXNlcy4gICovCisJY2hhciAqYnVmZmVyID0gKGNoYXIgKikgYWxsb2NhIChhbW91bnRfdG9fY29weQorCQkJCQkrIHNpemVvZiAoTE9OR0VTVCkKKwkJCQkJKyBNQVhfUkVHSVNURVJfUkFXX1NJWkUpOworCisJaW50IHJlZ25vOworCXN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKKworCS8qIEZpZ3VyZSBvdXQgd2hpY2ggZnJhbWUgdGhpcyBpcyBpbiBjdXJyZW50bHkuICAqLworCWZvciAoZnJhbWUgPSBnZXRfY3VycmVudF9mcmFtZSAoKTsKKwkgICAgIGZyYW1lICYmIEZSQU1FX0ZQIChmcmFtZSkgIT0gVkFMVUVfRlJBTUUgKHRvdmFsKTsKKwkgICAgIGZyYW1lID0gZ2V0X3ByZXZfZnJhbWUgKGZyYW1lKSkKKwkgIDsKKworCWlmICghZnJhbWUpCisJICBlcnJvciAoIlZhbHVlIGJlaW5nIGFzc2lnbmVkIHRvIGlzIG5vIGxvbmdlciBhY3RpdmUuIik7CisKKwlhbW91bnRfdG9fY29weSArPSAocmVnX3NpemUgLSBhbW91bnRfdG9fY29weSAlIHJlZ19zaXplKTsKKworCS8qIENvcHkgaXQgb3V0LiAgKi8KKwlmb3IgKChyZWdubyA9IFZBTFVFX0ZSQU1FX1JFR05VTSAodG92YWwpICsgcmVnX29mZnNldCwKKwkgICAgICBhbW91bnRfY29waWVkID0gMCk7CisJICAgICBhbW91bnRfY29waWVkIDwgYW1vdW50X3RvX2NvcHk7CisJICAgICBhbW91bnRfY29waWVkICs9IHJlZ19zaXplLCByZWdubysrKQorCSAgeworCSAgICBnZXRfc2F2ZWRfcmVnaXN0ZXIgKGJ1ZmZlciArIGFtb3VudF9jb3BpZWQsCisJCQkJKGludCAqKU5VTEwsIChDT1JFX0FERFIgKilOVUxMLAorCQkJCWZyYW1lLCByZWdubywgKGVudW0gbHZhbF90eXBlICopTlVMTCk7CisJICB9CisKKwkvKiBNb2RpZnkgd2hhdCBuZWVkcyB0byBiZSBtb2RpZmllZC4gICovCisJaWYgKFZBTFVFX0JJVFNJWkUgKHRvdmFsKSkKKwkgIG1vZGlmeV9maWVsZCAoYnVmZmVyICsgYnl0ZV9vZmZzZXQsCisJCQl2YWx1ZV9hc19sb25nIChmcm9tdmFsKSwKKwkJCVZBTFVFX0JJVFBPUyAodG92YWwpLCBWQUxVRV9CSVRTSVpFICh0b3ZhbCkpOworCWVsc2UgaWYgKHVzZV9idWZmZXIpCisJICBtZW1jcHkgKGJ1ZmZlciArIGJ5dGVfb2Zmc2V0LCByYXdfYnVmZmVyLCB1c2VfYnVmZmVyKTsKKwllbHNlCisJICBtZW1jcHkgKGJ1ZmZlciArIGJ5dGVfb2Zmc2V0LCBWQUxVRV9DT05URU5UUyAoZnJvbXZhbCksCisJCSAgVFlQRV9MRU5HVEggKHR5cGUpKTsKKworCS8qIENvcHkgaXQgYmFjay4gICovCisJZm9yICgocmVnbm8gPSBWQUxVRV9GUkFNRV9SRUdOVU0gKHRvdmFsKSArIHJlZ19vZmZzZXQsCisJICAgICAgYW1vdW50X2NvcGllZCA9IDApOworCSAgICAgYW1vdW50X2NvcGllZCA8IGFtb3VudF90b19jb3B5OworCSAgICAgYW1vdW50X2NvcGllZCArPSByZWdfc2l6ZSwgcmVnbm8rKykKKwkgIHsKKwkgICAgZW51bSBsdmFsX3R5cGUgbHZhbDsKKwkgICAgQ09SRV9BRERSIGFkZHI7CisJICAgIGludCBvcHRpbTsKKworCSAgICAvKiBKdXN0IGZpbmQgb3V0IHdoZXJlIHRvIHB1dCBpdC4gICovCisJICAgIGdldF9zYXZlZF9yZWdpc3RlciAoKGNoYXIgKilOVUxMLAorCQkJICAgICAgICAmb3B0aW0sICZhZGRyLCBmcmFtZSwgcmVnbm8sICZsdmFsKTsKKwkgICAgCisJICAgIGlmIChvcHRpbSkKKwkgICAgICBlcnJvciAoIkF0dGVtcHQgdG8gYXNzaWduIHRvIGEgdmFsdWUgdGhhdCB3YXMgb3B0aW1pemVkIG91dC4iKTsKKwkgICAgaWYgKGx2YWwgPT0gbHZhbF9tZW1vcnkpCisJICAgICAgd3JpdGVfbWVtb3J5IChhZGRyLCBidWZmZXIgKyBhbW91bnRfY29waWVkLCByZWdfc2l6ZSk7CisJICAgIGVsc2UgaWYgKGx2YWwgPT0gbHZhbF9yZWdpc3RlcikKKwkgICAgICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoYWRkciwgYnVmZmVyICsgYW1vdW50X2NvcGllZCwgcmVnX3NpemUpOworCSAgICBlbHNlCisJICAgICAgZXJyb3IgKCJBdHRlbXB0IHRvIGFzc2lnbiB0byBhbiB1bm1vZGlmaWFibGUgdmFsdWUuIik7CisJICB9CisKKwlpZiAocmVnaXN0ZXJfY2hhbmdlZF9ob29rKQorCSAgcmVnaXN0ZXJfY2hhbmdlZF9ob29rICgtMSk7CisgICAgICB9CisgICAgICBicmVhazsKKwkKKworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciAoIkxlZnQgb3BlcmFuZCBvZiBhc3NpZ25tZW50IGlzIG5vdCBhbiBsdmFsdWUuIik7CisgICAgfQorCisgIC8qIElmIHRoZSBmaWVsZCBkb2VzIG5vdCBlbnRpcmVseSBmaWxsIGEgTE9OR0VTVCwgdGhlbiB6ZXJvIHRoZSBzaWduIGJpdHMuCisgICAgIElmIHRoZSBmaWVsZCBpcyBzaWduZWQsIGFuZCBpcyBuZWdhdGl2ZSwgdGhlbiBzaWduIGV4dGVuZC4gKi8KKyAgaWYgKChWQUxVRV9CSVRTSVpFICh0b3ZhbCkgPiAwKQorICAgICAgJiYgKFZBTFVFX0JJVFNJWkUgKHRvdmFsKSA8IDggKiAoaW50KSBzaXplb2YgKExPTkdFU1QpKSkKKyAgICB7CisgICAgICBMT05HRVNUIGZpZWxkdmFsID0gdmFsdWVfYXNfbG9uZyAoZnJvbXZhbCk7CisgICAgICBMT05HRVNUIHZhbG1hc2sgPSAoKChVTE9OR0VTVCkgMSkgPDwgVkFMVUVfQklUU0laRSAodG92YWwpKSAtIDE7CisKKyAgICAgIGZpZWxkdmFsICY9IHZhbG1hc2s7CisgICAgICBpZiAoIVRZUEVfVU5TSUdORUQgKHR5cGUpICYmIChmaWVsZHZhbCAmICh2YWxtYXNrIF4gKHZhbG1hc2sgPj4gMSkpKSkKKwlmaWVsZHZhbCB8PSB+dmFsbWFzazsKKworICAgICAgZnJvbXZhbCA9IHZhbHVlX2Zyb21fbG9uZ2VzdCAodHlwZSwgZmllbGR2YWwpOworICAgIH0KKworICB2YWwgPSB2YWx1ZV9jb3B5ICh0b3ZhbCk7CisgIG1lbWNweSAoVkFMVUVfQ09OVEVOVFNfUkFXICh2YWwpLCBWQUxVRV9DT05URU5UUyAoZnJvbXZhbCksCisJICBUWVBFX0xFTkdUSCAodHlwZSkpOworICBWQUxVRV9UWVBFICh2YWwpID0gdHlwZTsKKyAgVkFMVUVfRU5DTE9TSU5HX1RZUEUgKHZhbCkgPSBWQUxVRV9FTkNMT1NJTkdfVFlQRSAoZnJvbXZhbCk7CisgIFZBTFVFX0VNQkVEREVEX09GRlNFVCAodmFsKSA9IFZBTFVFX0VNQkVEREVEX09GRlNFVCAoZnJvbXZhbCk7CisgIFZBTFVFX1BPSU5URURfVE9fT0ZGU0VUICh2YWwpID0gVkFMVUVfUE9JTlRFRF9UT19PRkZTRVQgKGZyb212YWwpOworICAKKyAgcmV0dXJuIHZhbDsKK30KKworLyogRXh0ZW5kIGEgdmFsdWUgVkFMIHRvIENPVU5UIHJlcGV0aXRpb25zIG9mIGl0cyB0eXBlLiAgKi8KKwordmFsdWVfcHRyCit2YWx1ZV9yZXBlYXQgKGFyZzEsIGNvdW50KQorICAgICB2YWx1ZV9wdHIgYXJnMTsKKyAgICAgaW50IGNvdW50OworeworICByZWdpc3RlciB2YWx1ZV9wdHIgdmFsOworCisgIGlmIChWQUxVRV9MVkFMIChhcmcxKSAhPSBsdmFsX21lbW9yeSkKKyAgICBlcnJvciAoIk9ubHkgdmFsdWVzIGluIG1lbW9yeSBjYW4gYmUgZXh0ZW5kZWQgd2l0aCAnQCcuIik7CisgIGlmIChjb3VudCA8IDEpCisgICAgZXJyb3IgKCJJbnZhbGlkIG51bWJlciAlZCBvZiByZXBldGl0aW9ucy4iLCBjb3VudCk7CisKKyAgdmFsID0gYWxsb2NhdGVfcmVwZWF0X3ZhbHVlIChWQUxVRV9FTkNMT1NJTkdfVFlQRSAoYXJnMSksIGNvdW50KTsKKworICByZWFkX21lbW9yeSAoVkFMVUVfQUREUkVTUyAoYXJnMSkgKyBWQUxVRV9PRkZTRVQgKGFyZzEpLAorCSAgICAgICBWQUxVRV9DT05URU5UU19BTExfUkFXICh2YWwpLAorCSAgICAgICBUWVBFX0xFTkdUSCAoVkFMVUVfRU5DTE9TSU5HX1RZUEUgKHZhbCkpKTsKKyAgVkFMVUVfTFZBTCAodmFsKSA9IGx2YWxfbWVtb3J5OworICBWQUxVRV9BRERSRVNTICh2YWwpID0gVkFMVUVfQUREUkVTUyAoYXJnMSkgKyBWQUxVRV9PRkZTRVQgKGFyZzEpOworCisgIHJldHVybiB2YWw7Cit9CisKK3ZhbHVlX3B0cgordmFsdWVfb2ZfdmFyaWFibGUgKHZhciwgYikKKyAgICAgc3RydWN0IHN5bWJvbCAqdmFyOworICAgICBzdHJ1Y3QgYmxvY2sgKmI7Cit7CisgIHZhbHVlX3B0ciB2YWw7CisgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZSA9IE5VTEw7CisKKyAgaWYgKCFiKQorICAgIGZyYW1lID0gTlVMTDsJCS8qIFVzZSBzZWxlY3RlZCBmcmFtZS4gICovCisgIGVsc2UgaWYgKHN5bWJvbF9yZWFkX25lZWRzX2ZyYW1lICh2YXIpKQorICAgIHsKKyAgICAgIGZyYW1lID0gYmxvY2tfaW5uZXJtb3N0X2ZyYW1lIChiKTsKKyAgICAgIGlmICghZnJhbWUpCisgICAgICAgIHsKKwkgIGlmIChCTE9DS19GVU5DVElPTiAoYikKKwkgICAgICAmJiBTWU1CT0xfU09VUkNFX05BTUUgKEJMT0NLX0ZVTkNUSU9OIChiKSkpCisJICAgIGVycm9yICgiTm8gZnJhbWUgaXMgY3VycmVudGx5IGV4ZWN1dGluZyBpbiBibG9jayAlcy4iLAorCQkgICBTWU1CT0xfU09VUkNFX05BTUUgKEJMT0NLX0ZVTkNUSU9OIChiKSkpOworCSAgZWxzZQorCSAgICBlcnJvciAoIk5vIGZyYW1lIGlzIGN1cnJlbnRseSBleGVjdXRpbmcgaW4gc3BlY2lmaWVkIGJsb2NrIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgdmFsID0gcmVhZF92YXJfdmFsdWUgKHZhciwgZnJhbWUpOworICBpZiAoIXZhbCkKKyAgICBlcnJvciAoIkFkZHJlc3Mgb2Ygc3ltYm9sIFwiJXNcIiBpcyB1bmtub3duLiIsIFNZTUJPTF9TT1VSQ0VfTkFNRSAodmFyKSk7CisKKyAgcmV0dXJuIHZhbDsKK30KKworLyogR2l2ZW4gYSB2YWx1ZSB3aGljaCBpcyBhbiBhcnJheSwgcmV0dXJuIGEgdmFsdWUgd2hpY2ggaXMgYSBwb2ludGVyIHRvIGl0cworICAgZmlyc3QgZWxlbWVudCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgYXJyYXkgaGFzIGEgbm9uemVybyBsb3dlcgorICAgYm91bmQuCisKKyAgIEZJWE1FOiAgQSBwcmV2aW91cyBjb21tZW50IGhlcmUgaW5kaWNhdGVkIHRoYXQgdGhpcyByb3V0aW5lIHNob3VsZCBiZQorICAgc3Vic3RyYWN0aW5nIHRoZSBhcnJheSdzIGxvd2VyIGJvdW5kLiAgSXQncyBub3QgY2xlYXIgdG8gbWUgdGhhdCB0aGlzCisgICBpcyBjb3JyZWN0LiAgR2l2ZW4gYW4gYXJyYXkgc3Vic2NyaXB0aW5nIG9wZXJhdGlvbiwgaXQgd291bGQgY2VydGFpbmx5CisgICB3b3JrIHRvIGRvIHRoZSBhZGp1c3RtZW50IGhlcmUsIGVzc2VudGlhbGx5IGNvbXB1dGluZzoKKworICAgKCZhcnJheVswXSAtIChsb3dlcmJvdW5kICogc2l6ZW9mIGFycmF5WzBdKSkgKyAoaW5kZXggKiBzaXplb2YgYXJyYXlbMF0pCisKKyAgIEhvd2V2ZXIgSSBiZWxpZXZlIGEgbW9yZSBhcHByb3ByaWF0ZSBhbmQgbG9naWNhbCBwbGFjZSB0byBhY2NvdW50IGZvcgorICAgdGhlIGxvd2VyIGJvdW5kIGlzIHRvIGRvIHNvIGluIHZhbHVlX3N1YnNjcmlwdCwgZXNzZW50aWFsbHkgY29tcHV0aW5nOgorCisgICAoJmFycmF5WzBdICsgKChpbmRleCAtIGxvd2VyYm91bmQpICogc2l6ZW9mIGFycmF5WzBdKSkKKworICAgQXMgZnVydGhlciBldmlkZW5jZSBjb25zaWRlciB3aGF0IHdvdWxkIGhhcHBlbiB3aXRoIG9wZXJhdGlvbnMgb3RoZXIKKyAgIHRoYW4gYXJyYXkgc3Vic2NyaXB0aW5nLCB3aGVyZSB0aGUgY2FsbGVyIHdvdWxkIGdldCBiYWNrIGEgdmFsdWUgdGhhdAorICAgaGFkIGFuIGFkZHJlc3Mgc29tZXdoZXJlIGJlZm9yZSB0aGUgYWN0dWFsIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5LAorICAgYW5kIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG93ZXIgYm91bmQgd291bGQgYmUgbG9zdCBiZWNhdXNlIG9mCisgICB0aGUgY29lcmNpb24gdG8gcG9pbnRlciB0eXBlLgorICAgKi8KKwordmFsdWVfcHRyCit2YWx1ZV9jb2VyY2VfYXJyYXkgKGFyZzEpCisgICAgIHZhbHVlX3B0ciBhcmcxOworeworICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZzEpKTsKKworICBpZiAoVkFMVUVfTFZBTCAoYXJnMSkgIT0gbHZhbF9tZW1vcnkpCisgICAgZXJyb3IgKCJBdHRlbXB0IHRvIHRha2UgYWRkcmVzcyBvZiB2YWx1ZSBub3QgbG9jYXRlZCBpbiBtZW1vcnkuIik7CisKKyAgcmV0dXJuIHZhbHVlX2Zyb21fbG9uZ2VzdCAobG9va3VwX3BvaW50ZXJfdHlwZSAoVFlQRV9UQVJHRVRfVFlQRSAodHlwZSkpLAorCQkgICAgICAgKExPTkdFU1QpIChWQUxVRV9BRERSRVNTIChhcmcxKSArIFZBTFVFX09GRlNFVCAoYXJnMSkpKTsKK30KKworLyogR2l2ZW4gYSB2YWx1ZSB3aGljaCBpcyBhIGZ1bmN0aW9uLCByZXR1cm4gYSB2YWx1ZSB3aGljaCBpcyBhIHBvaW50ZXIKKyAgIHRvIGl0LiAgKi8KKwordmFsdWVfcHRyCit2YWx1ZV9jb2VyY2VfZnVuY3Rpb24gKGFyZzEpCisgICAgIHZhbHVlX3B0ciBhcmcxOworeworICB2YWx1ZV9wdHIgcmV0dmFsOworCisgIGlmIChWQUxVRV9MVkFMIChhcmcxKSAhPSBsdmFsX21lbW9yeSkKKyAgICBlcnJvciAoIkF0dGVtcHQgdG8gdGFrZSBhZGRyZXNzIG9mIHZhbHVlIG5vdCBsb2NhdGVkIGluIG1lbW9yeS4iKTsKKworICByZXR2YWwgPSB2YWx1ZV9mcm9tX2xvbmdlc3QgKGxvb2t1cF9wb2ludGVyX3R5cGUgKFZBTFVFX1RZUEUgKGFyZzEpKSwKKwkJCSAgICAgICAoTE9OR0VTVCkgKFZBTFVFX0FERFJFU1MgKGFyZzEpICsgVkFMVUVfT0ZGU0VUIChhcmcxKSkpOworICBWQUxVRV9CRkRfU0VDVElPTiAocmV0dmFsKSA9IFZBTFVFX0JGRF9TRUNUSU9OIChhcmcxKTsKKyAgcmV0dXJuIHJldHZhbDsKK30gIAorCisvKiBSZXR1cm4gYSBwb2ludGVyIHZhbHVlIGZvciB0aGUgb2JqZWN0IGZvciB3aGljaCBBUkcxIGlzIHRoZSBjb250ZW50cy4gICovCisKK3ZhbHVlX3B0cgordmFsdWVfYWRkciAoYXJnMSkKKyAgICAgdmFsdWVfcHRyIGFyZzE7Cit7CisgIHZhbHVlX3B0ciBhcmcyOworCisgIHN0cnVjdCB0eXBlICp0eXBlID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnMSkpOworICBpZiAoVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfUkVGKQorICAgIHsKKyAgICAgIC8qIENvcHkgdGhlIHZhbHVlLCBidXQgY2hhbmdlIHRoZSB0eXBlIGZyb20gKFQmKSB0byAoVCopLgorCSBXZSBrZWVwIHRoZSBzYW1lIGxvY2F0aW9uIGluZm9ybWF0aW9uLCB3aGljaCBpcyBlZmZpY2llbnQsCisJIGFuZCBhbGxvd3MgJigmWCkgdG8gZ2V0IHRoZSBsb2NhdGlvbiBjb250YWluaW5nIHRoZSByZWZlcmVuY2UuICovCisgICAgICBhcmcyID0gdmFsdWVfY29weSAoYXJnMSk7CisgICAgICBWQUxVRV9UWVBFIChhcmcyKSA9IGxvb2t1cF9wb2ludGVyX3R5cGUgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKKyAgICAgIHJldHVybiBhcmcyOworICAgIH0KKyAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX0ZVTkMpCisgICAgcmV0dXJuIHZhbHVlX2NvZXJjZV9mdW5jdGlvbiAoYXJnMSk7CisKKyAgaWYgKFZBTFVFX0xWQUwgKGFyZzEpICE9IGx2YWxfbWVtb3J5KQorICAgIGVycm9yICgiQXR0ZW1wdCB0byB0YWtlIGFkZHJlc3Mgb2YgdmFsdWUgbm90IGxvY2F0ZWQgaW4gbWVtb3J5LiIpOworCisgIC8qIEdldCB0YXJnZXQgbWVtb3J5IGFkZHJlc3MgKi8gIAorICBhcmcyID0gdmFsdWVfZnJvbV9sb25nZXN0IChsb29rdXBfcG9pbnRlcl90eXBlIChWQUxVRV9UWVBFIChhcmcxKSksCisJCQkgICAgICAgKExPTkdFU1QpIChWQUxVRV9BRERSRVNTIChhcmcxKSAKKwkJCQkJICArIFZBTFVFX09GRlNFVCAoYXJnMSkKKwkJCQkJICArIFZBTFVFX0VNQkVEREVEX09GRlNFVCAoYXJnMSkpKTsKKworICAvKiBUaGlzIG1heSBiZSBhIHBvaW50ZXIgdG8gYSBiYXNlIHN1Ym9iamVjdDsgc28gcmVtZW1iZXIgdGhlCisgICAgIGZ1bGwgZGVyaXZlZCBvYmplY3QncyB0eXBlIC4uLiAqLyAKKyAgVkFMVUVfRU5DTE9TSU5HX1RZUEUgKGFyZzIpID0gbG9va3VwX3BvaW50ZXJfdHlwZSAoVkFMVUVfRU5DTE9TSU5HX1RZUEUgKGFyZzEpKTsKKyAgLyogLi4uIGFuZCBhbHNvIHRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgc3Vib2JqZWN0IGluIHRoZSBmdWxsIG9iamVjdCAqLyAKKyAgVkFMVUVfUE9JTlRFRF9UT19PRkZTRVQgKGFyZzIpID0gVkFMVUVfRU1CRURERURfT0ZGU0VUIChhcmcxKTsgIAorICBWQUxVRV9CRkRfU0VDVElPTiAoYXJnMikgPSBWQUxVRV9CRkRfU0VDVElPTiAoYXJnMSk7CisgIHJldHVybiBhcmcyOworfQorCisvKiBHaXZlbiBhIHZhbHVlIG9mIGEgcG9pbnRlciB0eXBlLCBhcHBseSB0aGUgQyB1bmFyeSAqIG9wZXJhdG9yIHRvIGl0LiAgKi8KKwordmFsdWVfcHRyCit2YWx1ZV9pbmQgKGFyZzEpCisgICAgIHZhbHVlX3B0ciBhcmcxOworeworICBzdHJ1Y3QgdHlwZSAqYmFzZV90eXBlOworICB2YWx1ZV9wdHIgYXJnMjsKKyAgdmFsdWVfcHRyIHJlYWxfdmFsOworCisgIENPRVJDRV9BUlJBWSAoYXJnMSk7CisKKyAgYmFzZV90eXBlID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnMSkpOworCisgIGlmIChUWVBFX0NPREUgKGJhc2VfdHlwZSkgPT0gVFlQRV9DT0RFX01FTUJFUikKKyAgICBlcnJvciAoIm5vdCBpbXBsZW1lbnRlZDogbWVtYmVyIHR5cGVzIGluIHZhbHVlX2luZCIpOworCisgIC8qIEFsbG93ICogb24gYW4gaW50ZWdlciBzbyB3ZSBjYW4gY2FzdCBpdCB0byB3aGF0ZXZlciB3ZSB3YW50LgorICAgICBUaGlzIHJldHVybnMgYW4gaW50LCB3aGljaCBzZWVtcyBsaWtlIHRoZSBtb3N0IEMtbGlrZSB0aGluZworICAgICB0byBkby4gICJsb25nIGxvbmciIHZhcmlhYmxlcyBhcmUgcmFyZSBlbm91Z2ggdGhhdAorICAgICBCVUlMVElOX1RZUEVfTE9OR0VTVCB3b3VsZCBzZWVtIHRvIGJlIGEgbWlzdGFrZS4gICovCisgIGlmIChUWVBFX0NPREUgKGJhc2VfdHlwZSkgPT0gVFlQRV9DT0RFX0lOVCkKKyAgICByZXR1cm4gdmFsdWVfYXQgKGJ1aWx0aW5fdHlwZV9pbnQsCisJCSAgICAgKENPUkVfQUREUikgdmFsdWVfYXNfbG9uZyAoYXJnMSksCisJCSAgICAgVkFMVUVfQkZEX1NFQ1RJT04gKGFyZzEpKTsKKyAgZWxzZSBpZiAoVFlQRV9DT0RFIChiYXNlX3R5cGUpID09IFRZUEVfQ09ERV9QVFIpCisgICAgeworICAgICAgc3RydWN0IHR5cGUgKmVuY190eXBlOworICAgICAgLyogV2UgbWF5IGJlIHBvaW50aW5nIHRvIHNvbWV0aGluZyBlbWJlZGRlZCBpbiBhIGxhcmdlciBvYmplY3QgKi8KKyAgICAgIC8qIEdldCB0aGUgcmVhbCB0eXBlIG9mIHRoZSBlbmNsb3Npbmcgb2JqZWN0ICovIAorICAgICAgZW5jX3R5cGUgPSBjaGVja190eXBlZGVmIChWQUxVRV9FTkNMT1NJTkdfVFlQRSAoYXJnMSkpOworICAgICAgZW5jX3R5cGUgPSBUWVBFX1RBUkdFVF9UWVBFIChlbmNfdHlwZSk7CisgICAgICAvKiBSZXRyaWV2ZSB0aGUgZW5jbG9zaW5nIG9iamVjdCBwb2ludGVkIHRvICovIAorICAgICAgYXJnMiA9ICB2YWx1ZV9hdF9sYXp5IChlbmNfdHlwZSwgCisJCQkgICAgIHZhbHVlX2FzX3BvaW50ZXIgKGFyZzEpIC0gVkFMVUVfUE9JTlRFRF9UT19PRkZTRVQgKGFyZzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9CRkRfU0VDVElPTiAoYXJnMSkpOworICAgICAgLyogUmUtYWRqdXN0IHR5cGUgKi8gCisgICAgICBWQUxVRV9UWVBFIChhcmcyKSA9IFRZUEVfVEFSR0VUX1RZUEUgKGJhc2VfdHlwZSk7CisgICAgICAvKiBBZGQgZW1iZWRkaW5nIGluZm8gKi8KKyAgICAgIFZBTFVFX0VOQ0xPU0lOR19UWVBFIChhcmcyKSA9IGVuY190eXBlOworICAgICAgVkFMVUVfRU1CRURERURfT0ZGU0VUIChhcmcyKSA9IFZBTFVFX1BPSU5URURfVE9fT0ZGU0VUIChhcmcxKTsKKworICAgICAgLyogV2UgbWF5IGJlIHBvaW50aW5nIHRvIGFuIG9iamVjdCBvZiBzb21lIGRlcml2ZWQgdHlwZSAqLworICAgICAgYXJnMiA9IHZhbHVlX2Z1bGxfb2JqZWN0IChhcmcyLCBOVUxMLCAwLCAwLCAwKTsKKyAgICAgIHJldHVybiBhcmcyOworICAgIH0KKworICBlcnJvciAoIkF0dGVtcHQgdG8gdGFrZSBjb250ZW50cyBvZiBhIG5vbi1wb2ludGVyIHZhbHVlLiIpOworICByZXR1cm4gMDsgIC8qIEZvciBsaW50IC0tIG5ldmVyIHJlYWNoZWQgKi8KK30KKwwKKy8qIFB1c2hpbmcgc21hbGwgcGFydHMgb2Ygc3RhY2sgZnJhbWVzLiAgKi8KKworLyogUHVzaCBvbmUgd29yZCAodGhlIHNpemUgb2Ygb2JqZWN0IHRoYXQgYSByZWdpc3RlciBob2xkcykuICAqLworCitDT1JFX0FERFIKK3B1c2hfd29yZCAoc3AsIHdvcmQpCisgICAgIENPUkVfQUREUiBzcDsKKyAgICAgVUxPTkdFU1Qgd29yZDsKK3sKKyAgcmVnaXN0ZXIgaW50IGxlbiA9IFJFR0lTVEVSX1NJWkU7CisgIGNoYXIgYnVmZmVyW01BWF9SRUdJU1RFUl9SQVdfU0laRV07CisKKyAgc3RvcmVfdW5zaWduZWRfaW50ZWdlciAoYnVmZmVyLCBsZW4sIHdvcmQpOworICBpZiAoSU5ORVJfVEhBTiAoMSwgMikpCisgICAgeworICAgICAgLyogc3RhY2sgZ3Jvd3MgZG93bndhcmQgKi8KKyAgICAgIHNwIC09IGxlbjsKKyAgICAgIHdyaXRlX21lbW9yeSAoc3AsIGJ1ZmZlciwgbGVuKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBzdGFjayBncm93cyB1cHdhcmQgKi8KKyAgICAgIHdyaXRlX21lbW9yeSAoc3AsIGJ1ZmZlciwgbGVuKTsKKyAgICAgIHNwICs9IGxlbjsKKyAgICB9CisKKyAgcmV0dXJuIHNwOworfQorCisvKiBQdXNoIExFTiBieXRlcyB3aXRoIGRhdGEgYXQgQlVGRkVSLiAgKi8KKworQ09SRV9BRERSCitwdXNoX2J5dGVzIChzcCwgYnVmZmVyLCBsZW4pCisgICAgIENPUkVfQUREUiBzcDsKKyAgICAgY2hhciAqYnVmZmVyOworICAgICBpbnQgbGVuOworeworICBpZiAoSU5ORVJfVEhBTiAoMSwgMikpCisgICAgeworICAgICAgLyogc3RhY2sgZ3Jvd3MgZG93bndhcmQgKi8KKyAgICAgIHNwIC09IGxlbjsKKyAgICAgIHdyaXRlX21lbW9yeSAoc3AsIGJ1ZmZlciwgbGVuKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBzdGFjayBncm93cyB1cHdhcmQgKi8KKyAgICAgIHdyaXRlX21lbW9yeSAoc3AsIGJ1ZmZlciwgbGVuKTsKKyAgICAgIHNwICs9IGxlbjsKKyAgICB9CisKKyAgcmV0dXJuIHNwOworfQorCisvKiBQdXNoIG9udG8gdGhlIHN0YWNrIHRoZSBzcGVjaWZpZWQgdmFsdWUgVkFMVUUuICAqLworCisjaWZuZGVmIFBVU0hfQVJHVU1FTlRTCisKK3N0YXRpYyBDT1JFX0FERFIKK3ZhbHVlX3B1c2ggKHNwLCBhcmcpCisgICAgIHJlZ2lzdGVyIENPUkVfQUREUiBzcDsKKyAgICAgdmFsdWVfcHRyIGFyZzsKK3sKKyAgcmVnaXN0ZXIgaW50IGxlbiA9IFRZUEVfTEVOR1RIIChWQUxVRV9FTkNMT1NJTkdfVFlQRSAoYXJnKSk7CisKKyAgaWYgKElOTkVSX1RIQU4gKDEsIDIpKQorICAgIHsKKyAgICAgIC8qIHN0YWNrIGdyb3dzIGRvd253YXJkICovCisgICAgICBzcCAtPSBsZW47CisgICAgICB3cml0ZV9tZW1vcnkgKHNwLCBWQUxVRV9DT05URU5UU19BTEwgKGFyZyksIGxlbik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogc3RhY2sgZ3Jvd3MgdXB3YXJkICovCisgICAgICB3cml0ZV9tZW1vcnkgKHNwLCBWQUxVRV9DT05URU5UU19BTEwgKGFyZyksIGxlbik7CisgICAgICBzcCArPSBsZW47CisgICAgfQorCisgIHJldHVybiBzcDsKK30KKworI2VuZGlmCS8qICFQVVNIX0FSR1VNRU5UUyAqLworCisjaWZkZWYgQ0FMTF9EVU1NWQorLyogUGVyZm9ybSB0aGUgc3RhbmRhcmQgY29lcmNpb25zIHRoYXQgYXJlIHNwZWNpZmllZAorICAgZm9yIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gQyBmdW5jdGlvbnMuCisKKyAgIElmIFBBUkFNX1RZUEUgaXMgbm9uLU5VTEwsIGl0IGlzIHRoZSBleHBlY3RlZCBwYXJhbWV0ZXIgdHlwZS4KKyAgIElTX1BST1RPVFlQRUQgaXMgbm9uLXplcm8gaWYgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzIHByb3RvdHlwZWQuICAqLworCitzdGF0aWMgdmFsdWVfcHRyCit2YWx1ZV9hcmdfY29lcmNlIChhcmcsIHBhcmFtX3R5cGUsIGlzX3Byb3RvdHlwZWQpCisgICAgIHZhbHVlX3B0ciBhcmc7CisgICAgIHN0cnVjdCB0eXBlICpwYXJhbV90eXBlOworICAgICBpbnQgaXNfcHJvdG90eXBlZDsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKmFyZ190eXBlID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnKSk7CisgIHJlZ2lzdGVyIHN0cnVjdCB0eXBlICp0eXBlCisgICAgPSBwYXJhbV90eXBlID8gY2hlY2tfdHlwZWRlZiAocGFyYW1fdHlwZSkgOiBhcmdfdHlwZTsKKworICBzd2l0Y2ggKFRZUEVfQ09ERSAodHlwZSkpCisgICAgeworICAgIGNhc2UgVFlQRV9DT0RFX1JFRjoKKyAgICAgIGlmIChUWVBFX0NPREUgKGFyZ190eXBlKSAhPSBUWVBFX0NPREVfUkVGKQorCXsKKwkgIGFyZyA9IHZhbHVlX2FkZHIgKGFyZyk7CisJICBWQUxVRV9UWVBFIChhcmcpID0gcGFyYW1fdHlwZTsKKwkgIHJldHVybiBhcmc7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0NPREVfSU5UOgorICAgIGNhc2UgVFlQRV9DT0RFX0NIQVI6CisgICAgY2FzZSBUWVBFX0NPREVfQk9PTDoKKyAgICBjYXNlIFRZUEVfQ09ERV9FTlVNOgorICAgICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIHByb3RvdHlwZSwgY29lcmNlIHRvIGludGVnZXIgdHlwZSBpZiBuZWNlc3NhcnkuICAqLworICAgICAgaWYgKCFpc19wcm90b3R5cGVkKQorCXsKKwkgIGlmIChUWVBFX0xFTkdUSCAodHlwZSkgPCBUWVBFX0xFTkdUSCAoYnVpbHRpbl90eXBlX2ludCkpCisJICAgIHR5cGUgPSBidWlsdGluX3R5cGVfaW50OworCX0KKyAgICAgIC8qIEN1cnJlbnRseSBhbGwgdGFyZ2V0IEFCSXMgcmVxdWlyZSBhdCBsZWFzdCB0aGUgd2lkdGggb2YgYW4gaW50ZWdlcgorCSB0eXBlIGZvciBhbiBhcmd1bWVudC4gIFdlIG1heSBoYXZlIHRvIGNvbmRpdGlvbmFsaXplIHRoZSBmb2xsb3dpbmcKKwkgdHlwZSBjb2VyY2lvbiBmb3IgZnV0dXJlIHRhcmdldHMuICAqLworICAgICAgaWYgKFRZUEVfTEVOR1RIICh0eXBlKSA8IFRZUEVfTEVOR1RIIChidWlsdGluX3R5cGVfaW50KSkKKwl0eXBlID0gYnVpbHRpbl90eXBlX2ludDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9DT0RFX0ZMVDoKKyAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgYWx3YXlzIGNvbnZlcnQgZmxvYXRzIHRvIGRvdWJsZXMgaW4gdGhlCisJIG5vbi1wcm90b3R5cGVkIGNhc2UuICBBcyBtYW55IGRlYnVnZ2luZyBmb3JtYXRzIGluY2x1ZGUKKwkgbm8gaW5mb3JtYXRpb24gYWJvdXQgcHJvdG90eXBpbmcsIHdlIGhhdmUgdG8gbGl2ZSB3aXRoCisJIENPRVJDRV9GTE9BVF9UT19ET1VCTEUgZm9yIG5vdy4gICovCisgICAgICBpZiAoIWlzX3Byb3RvdHlwZWQgJiYgQ09FUkNFX0ZMT0FUX1RPX0RPVUJMRSkKKwl7CisJICBpZiAoVFlQRV9MRU5HVEggKHR5cGUpIDwgVFlQRV9MRU5HVEggKGJ1aWx0aW5fdHlwZV9kb3VibGUpKQorCSAgICB0eXBlID0gYnVpbHRpbl90eXBlX2RvdWJsZTsKKwkgIGVsc2UgaWYgKFRZUEVfTEVOR1RIICh0eXBlKSA+IFRZUEVfTEVOR1RIIChidWlsdGluX3R5cGVfZG91YmxlKSkKKwkgICAgdHlwZSA9IGJ1aWx0aW5fdHlwZV9sb25nX2RvdWJsZTsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfQ09ERV9GVU5DOgorICAgICAgdHlwZSA9IGxvb2t1cF9wb2ludGVyX3R5cGUgKHR5cGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0NPREVfQVJSQVk6CisgICAgICBpZiAoY3VycmVudF9sYW5ndWFnZS0+Y19zdHlsZV9hcnJheXMpCisJdHlwZSA9IGxvb2t1cF9wb2ludGVyX3R5cGUgKFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9DT0RFX1VOREVGOgorICAgIGNhc2UgVFlQRV9DT0RFX1BUUjoKKyAgICBjYXNlIFRZUEVfQ09ERV9TVFJVQ1Q6CisgICAgY2FzZSBUWVBFX0NPREVfVU5JT046CisgICAgY2FzZSBUWVBFX0NPREVfVk9JRDoKKyAgICBjYXNlIFRZUEVfQ09ERV9TRVQ6CisgICAgY2FzZSBUWVBFX0NPREVfUkFOR0U6CisgICAgY2FzZSBUWVBFX0NPREVfU1RSSU5HOgorICAgIGNhc2UgVFlQRV9DT0RFX0JJVFNUUklORzoKKyAgICBjYXNlIFRZUEVfQ09ERV9FUlJPUjoKKyAgICBjYXNlIFRZUEVfQ09ERV9NRU1CRVI6CisgICAgY2FzZSBUWVBFX0NPREVfTUVUSE9EOgorICAgIGNhc2UgVFlQRV9DT0RFX0NPTVBMRVg6CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gdmFsdWVfY2FzdCAodHlwZSwgYXJnKTsKK30KKworLyogRGV0ZXJtaW5lIGEgZnVuY3Rpb24ncyBhZGRyZXNzIGFuZCBpdHMgcmV0dXJuIHR5cGUgZnJvbSBpdHMgdmFsdWUuIAorICAgQ2FsbHMgZXJyb3IoKSBpZiB0aGUgZnVuY3Rpb24gaXMgbm90IHZhbGlkIGZvciBjYWxsaW5nLiAgKi8KKworc3RhdGljIENPUkVfQUREUgorZmluZF9mdW5jdGlvbl9hZGRyIChmdW5jdGlvbiwgcmV0dmFsX3R5cGUpCisgICAgIHZhbHVlX3B0ciBmdW5jdGlvbjsKKyAgICAgc3RydWN0IHR5cGUgKipyZXR2YWxfdHlwZTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKmZ0eXBlID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoZnVuY3Rpb24pKTsKKyAgcmVnaXN0ZXIgZW51bSB0eXBlX2NvZGUgY29kZSA9IFRZUEVfQ09ERSAoZnR5cGUpOworICBzdHJ1Y3QgdHlwZSAqdmFsdWVfdHlwZTsKKyAgQ09SRV9BRERSIGZ1bmFkZHI7CisKKyAgLyogSWYgaXQncyBhIG1lbWJlciBmdW5jdGlvbiwganVzdCBsb29rIGF0IHRoZSBmdW5jdGlvbgorICAgICBwYXJ0IG9mIGl0LiAgKi8KKworICAvKiBEZXRlcm1pbmUgYWRkcmVzcyB0byBjYWxsLiAgKi8KKyAgaWYgKGNvZGUgPT0gVFlQRV9DT0RFX0ZVTkMgfHwgY29kZSA9PSBUWVBFX0NPREVfTUVUSE9EKQorICAgIHsKKyAgICAgIGZ1bmFkZHIgPSBWQUxVRV9BRERSRVNTIChmdW5jdGlvbik7CisgICAgICB2YWx1ZV90eXBlID0gVFlQRV9UQVJHRVRfVFlQRSAoZnR5cGUpOworICAgIH0KKyAgZWxzZSBpZiAoY29kZSA9PSBUWVBFX0NPREVfUFRSKQorICAgIHsKKyAgICAgIGZ1bmFkZHIgPSB2YWx1ZV9hc19wb2ludGVyIChmdW5jdGlvbik7CisgICAgICBmdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFRZUEVfVEFSR0VUX1RZUEUgKGZ0eXBlKSk7CisgICAgICBpZiAoVFlQRV9DT0RFIChmdHlwZSkgPT0gVFlQRV9DT0RFX0ZVTkMKKwkgIHx8IFRZUEVfQ09ERSAoZnR5cGUpID09IFRZUEVfQ09ERV9NRVRIT0QpCisJeworI2lmZGVmIENPTlZFUlRfRlJPTV9GVU5DX1BUUl9BRERSCisJICAvKiBGSVhNRTogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHRoZSB1bnVzdWFsIGZ1bmN0aW9uCisJICAgICBwb2ludGVyIHJlcHJlc2VudGF0aW9uIG9uIHRoZSBSUy82MDAwLCBzZWUgY29tbWVudAorCSAgICAgaW4gY29uZmlnL3JzNjAwMC90bS1yczYwMDAuaCAgKi8KKwkgIGZ1bmFkZHIgPSBDT05WRVJUX0ZST01fRlVOQ19QVFJfQUREUiAoZnVuYWRkcik7CisjZW5kaWYKKwkgIHZhbHVlX3R5cGUgPSBUWVBFX1RBUkdFVF9UWVBFIChmdHlwZSk7CisJfQorICAgICAgZWxzZQorCXZhbHVlX3R5cGUgPSBidWlsdGluX3R5cGVfaW50OworICAgIH0KKyAgZWxzZSBpZiAoY29kZSA9PSBUWVBFX0NPREVfSU5UKQorICAgIHsKKyAgICAgIC8qIEhhbmRsZSB0aGUgY2FzZSBvZiBmdW5jdGlvbnMgbGFja2luZyBkZWJ1Z2dpbmcgaW5mby4KKwkgVGhlaXIgdmFsdWVzIGFyZSBjaGFyYWN0ZXJzIHNpbmNlIHRoZWlyIGFkZHJlc3NlcyBhcmUgY2hhciAqLworICAgICAgaWYgKFRZUEVfTEVOR1RIIChmdHlwZSkgPT0gMSkKKwlmdW5hZGRyID0gdmFsdWVfYXNfcG9pbnRlciAodmFsdWVfYWRkciAoZnVuY3Rpb24pKTsKKyAgICAgIGVsc2UKKwkvKiBIYW5kbGUgaW50ZWdlciB1c2VkIGFzIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbi4gICovCisJZnVuYWRkciA9IChDT1JFX0FERFIpIHZhbHVlX2FzX2xvbmcgKGZ1bmN0aW9uKTsKKworICAgICAgdmFsdWVfdHlwZSA9IGJ1aWx0aW5fdHlwZV9pbnQ7CisgICAgfQorICBlbHNlCisgICAgZXJyb3IgKCJJbnZhbGlkIGRhdGEgdHlwZSBmb3IgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLiIpOworCisgICpyZXR2YWxfdHlwZSA9IHZhbHVlX3R5cGU7CisgIHJldHVybiBmdW5hZGRyOworfQorCisvKiBBbGwgdGhpcyBzdHVmZiB3aXRoIGEgZHVtbXkgZnJhbWUgbWF5IHNlZW0gdW5uZWNlc3NhcmlseSBjb21wbGljYXRlZAorICAgKHdoeSBub3QganVzdCBzYXZlIHJlZ2lzdGVycyBpbiBHREI/KS4gIFRoZSBwdXJwb3NlIG9mIHB1c2hpbmcgYSBkdW1teQorICAgZnJhbWUgd2hpY2ggbG9va3MganVzdCBsaWtlIGEgcmVhbCBmcmFtZSBpcyBzbyB0aGF0IGlmIHlvdSBjYWxsIGEKKyAgIGZ1bmN0aW9uIGFuZCB0aGVuIGhpdCBhIGJyZWFrcG9pbnQgKGdldCBhIHNpZ25hbCwgZXRjKSwgImJhY2t0cmFjZSIKKyAgIHdpbGwgbG9vayByaWdodC4gIFdoZXRoZXIgdGhlIGJhY2t0cmFjZSBuZWVkcyB0byBhY3R1YWxseSBzaG93IHRoZQorICAgc3RhY2sgYXQgdGhlIHRpbWUgdGhlIGluZmVyaW9yIGZ1bmN0aW9uIHdhcyBjYWxsZWQgaXMgZGViYXRhYmxlLCBidXQKKyAgIGl0IGNlcnRhaW5seSBuZWVkcyB0byBub3QgZGlzcGxheSBnYXJiYWdlLiAgU28gaWYgeW91IGFyZSBjb250ZW1wbGF0aW5nCisgICBtYWtpbmcgZHVtbXkgZnJhbWVzIGJlIGRpZmZlcmVudCBmcm9tIG5vcm1hbCBmcmFtZXMsIGNvbnNpZGVyIHRoYXQuICAqLworCisvKiBQZXJmb3JtIGEgZnVuY3Rpb24gY2FsbCBpbiB0aGUgaW5mZXJpb3IuCisgICBBUkdTIGlzIGEgdmVjdG9yIG9mIHZhbHVlcyBvZiBhcmd1bWVudHMgKE5BUkdTIG9mIHRoZW0pLgorICAgRlVOQ1RJT04gaXMgYSB2YWx1ZSwgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4KKyAgIFJldHVybnMgYSB2YWx1ZSByZXByZXNlbnRpbmcgd2hhdCB0aGUgZnVuY3Rpb24gcmV0dXJuZWQuCisgICBNYXkgZmFpbCB0byByZXR1cm4sIGlmIGEgYnJlYWtwb2ludCBvciBzaWduYWwgaXMgaGl0CisgICBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uCisKKyAgIEFSR1MgaXMgbW9kaWZpZWQgdG8gY29udGFpbiBjb2VyY2VkIHZhbHVlcy4gKi8KKwordmFsdWVfcHRyCitjYWxsX2Z1bmN0aW9uX2J5X2hhbmQgKGZ1bmN0aW9uLCBuYXJncywgYXJncykKKyAgICAgdmFsdWVfcHRyIGZ1bmN0aW9uOworICAgICBpbnQgbmFyZ3M7CisgICAgIHZhbHVlX3B0ciAqYXJnczsKK3sKKyAgcmVnaXN0ZXIgQ09SRV9BRERSIHNwOworICByZWdpc3RlciBpbnQgaTsKKyAgQ09SRV9BRERSIHN0YXJ0X3NwOworICAvKiBDQUxMX0RVTU1ZIGlzIGFuIGFycmF5IG9mIHdvcmRzIChSRUdJU1RFUl9TSVpFKSwgYnV0IGVhY2ggd29yZAorICAgICBpcyBpbiBob3N0IGJ5dGUgb3JkZXIuICBCZWZvcmUgY2FsbGluZyBGSVhfQ0FMTF9EVU1NWSwgd2UgYnl0ZXN3YXAgaXQKKyAgICAgYW5kIHJlbW92ZSBhbnkgZXh0cmEgYnl0ZXMgd2hpY2ggbWlnaHQgZXhpc3QgYmVjYXVzZSBVTE9OR0VTVCBpcworICAgICBiaWdnZXIgdGhhbiBSRUdJU1RFUl9TSVpFLiAgCisKKyAgICAgTk9URTogVGhpcyBpcyBwcmV0dHkgd2llcmQsIGFzIHRoZSBjYWxsIGR1bW15IGlzIGFjdHVhbGx5IGEKKyAgICAgICAgICAgc2VxdWVuY2Ugb2YgaW5zdHJ1Y3Rpb25zLiAgQnV0IENJU0MgbWFjaGluZXMgd2lsbCBoYXZlCisgICAgICAgICAgIHRvIHBhY2sgdGhlIGluc3RydWN0aW9ucyBpbnRvIFJFR0lTVEVSX1NJWkUgdW5pdHMgKGFuZAorICAgICAgICAgICBzbyB3aWxsIFJJU0MgbWFjaGluZXMgZm9yIHdoaWNoIElOU1RSVUNUSU9OX1NJWkUgaXMgbm90CisgICAgICAgICAgIFJFR0lTVEVSX1NJWkUpLiAqLworCisgIHN0YXRpYyBVTE9OR0VTVCBkdW1teVtdID0gQ0FMTF9EVU1NWTsKKyAgY2hhciBkdW1teTFbUkVHSVNURVJfU0laRSAqIHNpemVvZiBkdW1teSAvIHNpemVvZiAoVUxPTkdFU1QpXTsKKyAgQ09SRV9BRERSIG9sZF9zcDsKKyAgc3RydWN0IHR5cGUgKnZhbHVlX3R5cGU7CisgIHVuc2lnbmVkIGNoYXIgc3RydWN0X3JldHVybjsKKyAgQ09SRV9BRERSIHN0cnVjdF9hZGRyID0gMDsKKyAgc3RydWN0IGluZmVyaW9yX3N0YXR1cyBpbmZfc3RhdHVzOworICBzdHJ1Y3QgY2xlYW51cCAqb2xkX2NoYWluOworICBDT1JFX0FERFIgZnVuYWRkcjsKKyAgaW50IHVzaW5nX2djYzsJLyogU2V0IHRvIHZlcnNpb24gb2YgZ2NjIGluIHVzZSwgb3IgemVybyBpZiBub3QgZ2NjICovCisgIENPUkVfQUREUiByZWFsX3BjOworICBzdHJ1Y3QgdHlwZSAqcGFyYW1fdHlwZSA9IE5VTEw7CisgIHN0cnVjdCB0eXBlICpmdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFNZTUJPTF9UWVBFIChmdW5jdGlvbikpOworCisgIGlmICghdGFyZ2V0X2hhc19leGVjdXRpb24pCisgICAgbm9wcm9jZXNzKCk7CisKKyAgc2F2ZV9pbmZlcmlvcl9zdGF0dXMgKCZpbmZfc3RhdHVzLCAxKTsKKyAgb2xkX2NoYWluID0gbWFrZV9jbGVhbnVwICgobWFrZV9jbGVhbnVwX2Z1bmMpIHJlc3RvcmVfaW5mZXJpb3Jfc3RhdHVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mX3N0YXR1cyk7CisKKyAgLyogUFVTSF9EVU1NWV9GUkFNRSBpcyByZXNwb25zaWJsZSBmb3Igc2F2aW5nIHRoZSBpbmZlcmlvciByZWdpc3RlcnMKKyAgICAgKGFuZCBQT1BfRlJBTUUgZm9yIHJlc3RvcmluZyB0aGVtKS4gIChBdCBsZWFzdCBvbiBtb3N0IG1hY2hpbmVzKQorICAgICB0aGV5IGFyZSBzYXZlZCBvbiB0aGUgc3RhY2sgaW4gdGhlIGluZmVyaW9yLiAgKi8KKyAgUFVTSF9EVU1NWV9GUkFNRTsKKworICBvbGRfc3AgPSBzcCA9IHJlYWRfc3AgKCk7CisKKyAgaWYgKElOTkVSX1RIQU4gKDEsIDIpKQorICAgIHsKKyAgICAgIC8qIFN0YWNrIGdyb3dzIGRvd24gKi8KKyAgICAgIHNwIC09IHNpemVvZiBkdW1teTE7CisgICAgICBzdGFydF9zcCA9IHNwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFN0YWNrIGdyb3dzIHVwICovCisgICAgICBzdGFydF9zcCA9IHNwOworICAgICAgc3AgKz0gc2l6ZW9mIGR1bW15MTsKKyAgICB9CisKKyAgZnVuYWRkciA9IGZpbmRfZnVuY3Rpb25fYWRkciAoZnVuY3Rpb24sICZ2YWx1ZV90eXBlKTsKKyAgQ0hFQ0tfVFlQRURFRiAodmFsdWVfdHlwZSk7CisKKyAgeworICAgIHN0cnVjdCBibG9jayAqYiA9IGJsb2NrX2Zvcl9wYyAoZnVuYWRkcik7CisgICAgLyogSWYgY29tcGlsZWQgd2l0aG91dCAtZywgYXNzdW1lIEdDQyAyLiAgKi8KKyAgICB1c2luZ19nY2MgPSAoYiA9PSBOVUxMID8gMiA6IEJMT0NLX0dDQ19DT01QSUxFRCAoYikpOworICB9CisKKyAgLyogQXJlIHdlIHJldHVybmluZyBhIHZhbHVlIHVzaW5nIGEgc3RydWN0dXJlIHJldHVybiBvciBhIG5vcm1hbAorICAgICB2YWx1ZSByZXR1cm4/ICovCisKKyAgc3RydWN0X3JldHVybiA9IHVzaW5nX3N0cnVjdF9yZXR1cm4gKGZ1bmN0aW9uLCBmdW5hZGRyLCB2YWx1ZV90eXBlLAorCQkJCSAgICAgICB1c2luZ19nY2MpOworCisgIC8qIENyZWF0ZSBhIGNhbGwgc2VxdWVuY2UgY3VzdG9taXplZCBmb3IgdGhpcyBmdW5jdGlvbgorICAgICBhbmQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGl0LiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IChpbnQpIChzaXplb2YgKGR1bW15KSAvIHNpemVvZiAoZHVtbXlbMF0pKTsgaSsrKQorICAgIHN0b3JlX3Vuc2lnbmVkX2ludGVnZXIgKCZkdW1teTFbaSAqIFJFR0lTVEVSX1NJWkVdLAorCQkJICAgIFJFR0lTVEVSX1NJWkUsCisJCQkgICAgKFVMT05HRVNUKWR1bW15W2ldKTsKKworI2lmZGVmIEdEQl9UQVJHRVRfSVNfSFBQQQorICByZWFsX3BjID0gRklYX0NBTExfRFVNTVkgKGR1bW15MSwgc3RhcnRfc3AsIGZ1bmFkZHIsIG5hcmdzLCBhcmdzLAorCQkJICAgIHZhbHVlX3R5cGUsIHVzaW5nX2djYyk7CisjZWxzZQorICBGSVhfQ0FMTF9EVU1NWSAoZHVtbXkxLCBzdGFydF9zcCwgZnVuYWRkciwgbmFyZ3MsIGFyZ3MsCisJCSAgdmFsdWVfdHlwZSwgdXNpbmdfZ2NjKTsKKyAgcmVhbF9wYyA9IHN0YXJ0X3NwOworI2VuZGlmCisKKyNpZiBDQUxMX0RVTU1ZX0xPQ0FUSU9OID09IE9OX1NUQUNLCisgIHdyaXRlX21lbW9yeSAoc3RhcnRfc3AsIChjaGFyICopZHVtbXkxLCBzaXplb2YgZHVtbXkxKTsKKyNlbmRpZiAvKiBPbiBzdGFjay4gICovCisKKyNpZiBDQUxMX0RVTU1ZX0xPQ0FUSU9OID09IEJFRk9SRV9URVhUX0VORAorICAvKiBDb252ZXggVW5peCBwcm9oaWJpdHMgZXhlY3V0aW5nIGluIHRoZSBzdGFjayBzZWdtZW50LiAqLworICAvKiBIb3BlIHRoZXJlIGlzIGVtcHR5IHJvb20gYXQgdGhlIHRvcCBvZiB0aGUgdGV4dCBzZWdtZW50LiAqLworICB7CisgICAgZXh0ZXJuIENPUkVfQUREUiB0ZXh0X2VuZDsKKyAgICBzdGF0aWMgY2hlY2tlZCA9IDA7CisgICAgaWYgKCFjaGVja2VkKQorICAgICAgZm9yIChzdGFydF9zcCA9IHRleHRfZW5kIC0gc2l6ZW9mIGR1bW15MTsgc3RhcnRfc3AgPCB0ZXh0X2VuZDsgKytzdGFydF9zcCkKKwlpZiAocmVhZF9tZW1vcnlfaW50ZWdlciAoc3RhcnRfc3AsIDEpICE9IDApCisJICBlcnJvciAoInRleHQgc2VnbWVudCBmdWxsIC0tIG5vIHBsYWNlIHRvIHB1dCBjYWxsIik7CisgICAgY2hlY2tlZCA9IDE7CisgICAgc3AgPSBvbGRfc3A7CisgICAgcmVhbF9wYyA9IHRleHRfZW5kIC0gc2l6ZW9mIGR1bW15MTsKKyAgICB3cml0ZV9tZW1vcnkgKHJlYWxfcGMsIChjaGFyICopZHVtbXkxLCBzaXplb2YgZHVtbXkxKTsKKyAgfQorI2VuZGlmIC8qIEJlZm9yZSB0ZXh0X2VuZC4gICovCisKKyNpZiBDQUxMX0RVTU1ZX0xPQ0FUSU9OID09IEFGVEVSX1RFWFRfRU5ECisgIHsKKyAgICBleHRlcm4gQ09SRV9BRERSIHRleHRfZW5kOworICAgIGludCBlcnJjb2RlOworICAgIHNwID0gb2xkX3NwOworICAgIHJlYWxfcGMgPSB0ZXh0X2VuZDsKKyAgICBlcnJjb2RlID0gdGFyZ2V0X3dyaXRlX21lbW9yeSAocmVhbF9wYywgKGNoYXIgKilkdW1teTEsIHNpemVvZiBkdW1teTEpOworICAgIGlmIChlcnJjb2RlICE9IDApCisgICAgICBlcnJvciAoIkNhbm5vdCB3cml0ZSB0ZXh0IHNlZ21lbnQgLS0gY2FsbF9mdW5jdGlvbiBmYWlsZWQiKTsKKyAgfQorI2VuZGlmIC8qIEFmdGVyIHRleHRfZW5kLiAgKi8KKworI2lmIENBTExfRFVNTVlfTE9DQVRJT04gPT0gQVRfRU5UUllfUE9JTlQKKyAgcmVhbF9wYyA9IGZ1bmFkZHI7CisjZW5kaWYgLyogQXQgZW50cnkgcG9pbnQuICAqLworCisjaWZkZWYgbGludAorICBzcCA9IG9sZF9zcDsJCS8qIEl0IHJlYWxseSBpcyB1c2VkLCBmb3Igc29tZSBpZmRlZidzLi4uICovCisjZW5kaWYKKworICBpZiAobmFyZ3MgPCBUWVBFX05GSUVMRFMgKGZ0eXBlKSkKKyAgICBlcnJvciAoInRvbyBmZXcgYXJndW1lbnRzIGluIGZ1bmN0aW9uIGNhbGwiKTsKKworICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIC8qIElmIHdlJ3JlIG9mZiB0aGUgZW5kIG9mIHRoZSBrbm93biBhcmd1bWVudHMsIGRvIHRoZSBzdGFuZGFyZAorCSBwcm9tb3Rpb25zLiAgRklYTUU6IGlmIHdlIGhhZCBhIHByb3RvdHlwZSwgdGhpcyBzaG91bGQgb25seQorCSBiZSBhbGxvd2VkIGlmIC4uLiB3ZXJlIHByZXNlbnQuICAqLworICAgICAgaWYgKGkgPj0gVFlQRV9ORklFTERTIChmdHlwZSkpCisJYXJnc1tpXSA9IHZhbHVlX2FyZ19jb2VyY2UgKGFyZ3NbaV0sIE5VTEwsIDApOworCisgICAgICBlbHNlIAorCXsKKwkgIGludCBpc19wcm90b3R5cGVkID0gVFlQRV9GTEFHUyAoZnR5cGUpICYgVFlQRV9GTEFHX1BST1RPVFlQRUQ7CisJICBwYXJhbV90eXBlID0gVFlQRV9GSUVMRF9UWVBFIChmdHlwZSwgaSk7CisKKwkgIGFyZ3NbaV0gPSB2YWx1ZV9hcmdfY29lcmNlIChhcmdzW2ldLCBwYXJhbV90eXBlLCBpc19wcm90b3R5cGVkKTsKKwl9CisKKyAgICAgIC8qZWx6OiB0aGlzIGNvZGUgaXMgdG8gaGFuZGxlIHRoZSBjYXNlIGluIHdoaWNoIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgCisJaGFzIGEgcG9pbnRlciB0byBmdW5jdGlvbiBhcyBwYXJhbWV0ZXIgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGFjdHVhbCBhcmd1bWVudCAKKwlpcyB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIGFuZCBub3QgYSBwb2ludGVyIHRvIGZ1bmN0aW9uIHZhcmlhYmxlLgorCUluIGFDQyBjb21waWxlZCBjb2RlLCB0aGUgY2FsbHMgdGhyb3VnaCBwb2ludGVycyB0byBmdW5jdGlvbnMgKGluIHRoZSBib2R5CisJb2YgdGhlIGZ1bmN0aW9uIGNhbGxlZCBieSBoYW5kKSBhcmUgbWFkZSB2aWEgJCRkeW5jYWxsX2V4dGVybmFsIHdoaWNoCisJcmVxdWlyZXMgc29tZSByZWdpc3RlcnMgc2V0dGluZywgdGhpcyBpcyB0YWtlbiBjYXJlIG9mIGlmIHdlIGNhbGwgCisJdmlhIGEgZnVuY3Rpb24gcG9pbnRlciB2YXJpYWJsZSwgYnV0IG5vdCB2aWEgYSBmdW5jdGlvbiBhZGRyZXNzLiAKKwlJbiBjYyB0aGlzIGlzIG5vdCBhIHByb2JsZW0uICovCisKKyAgICAgIGlmICh1c2luZ19nY2MgPT0gMCkKKwlpZiAocGFyYW1fdHlwZSkKKwkgIC8qIGlmIHRoaXMgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBmdW5jdGlvbiovCisJICBpZiAoVFlQRV9DT0RFIChwYXJhbV90eXBlKSA9PSBUWVBFX0NPREVfUFRSKQorCSAgICBpZiAoVFlQRV9DT0RFIChwYXJhbV90eXBlLT50YXJnZXRfdHlwZSkgPT0gVFlQRV9DT0RFX0ZVTkMpCisJICAgICAgLyogZWx6OiBGSVhNRSBoZXJlIHNob3VsZCBnbyB0aGUgdGVzdCBhYm91dCB0aGUgY29tcGlsZXIgdXNlZCAKKyAgICAgICAgICAgICAgICAgICAgdG8gY29tcGlsZSB0aGUgdGFyZ2V0LiBXZSB3YW50IHRvIGlzc3VlIHRoZSBlcnJvcgorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIG9ubHkgaWYgdGhlIGNvbXBpbGVyIHVzZWQgd2FzIEhQJ3MgYUNDLiAKKyAgICAgICAgICAgICAgICAgICAgSWYgd2UgdXNlZCBIUCdzIGNjLCB0aGVuIHRoZXJlIGlzIG5vIHByb2JsZW0gYW5kIG5vIG5lZWQgCisgICAgICAgICAgICAgICAgICAgIHRvIHJldHVybiBhdCB0aGlzIHBvaW50ICovCisJICAgICAgaWYgKHVzaW5nX2djYyA9PSAwKSAvKiAmJiBjb21waWxlciA9PSBhQ0MqLworCQkvKiBnbyBzZWUgaWYgdGhlIGFjdHVhbCBwYXJhbWV0ZXIgaXMgYSB2YXJpYWJsZSBvZiB0eXBlCisgICAgICAgICAgICAgICAgcG9pbnRlciB0byBmdW5jdGlvbiBvciBqdXN0IGEgZnVuY3Rpb24gKi8KKwkJaWYgKGFyZ3NbaV0tPmx2YWwgPT0gbm90X2x2YWwpCisJCSAgeworCQkgICAgY2hhciAqYXJnX25hbWU7CisJCSAgICBpZiAoZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uKChDT1JFX0FERFIpYXJnc1tpXS0+YWxpZ25lci5jb250ZW50c1swXSwgJmFyZ19uYW1lLCBOVUxMLCBOVUxMKSkKKwkJICAgICAgZXJyb3IoIlwKK1lvdSBjYW5ub3QgdXNlIGZ1bmN0aW9uIDwlcz4gYXMgYXJndW1lbnQuIFxuXAorWW91IG11c3QgdXNlIGEgcG9pbnRlciB0byBmdW5jdGlvbiB0eXBlIHZhcmlhYmxlLiBDb21tYW5kIGlnbm9yZWQuIiwgYXJnX25hbWUpOworCQkgIH0gICAKKyAgICB9CisKKyNpZiBkZWZpbmVkIChSRUdfU1RSVUNUX0hBU19BRERSKQorICB7CisgICAgLyogVGhpcyBpcyBhIG1hY2hpbmUgbGlrZSB0aGUgc3BhcmMsIHdoZXJlIHdlIG1heSBuZWVkIHRvIHBhc3MgYSBwb2ludGVyCisgICAgICAgdG8gdGhlIHN0cnVjdHVyZSwgbm90IHRoZSBzdHJ1Y3R1cmUgaXRzZWxmLiAgKi8KKyAgICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQorICAgICAgeworCXN0cnVjdCB0eXBlICphcmdfdHlwZSA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZ3NbaV0pKTsKKwlpZiAoKFRZUEVfQ09ERSAoYXJnX3R5cGUpID09IFRZUEVfQ09ERV9TVFJVQ1QKKwkgICAgIHx8IFRZUEVfQ09ERSAoYXJnX3R5cGUpID09IFRZUEVfQ09ERV9VTklPTgorCSAgICAgfHwgVFlQRV9DT0RFIChhcmdfdHlwZSkgPT0gVFlQRV9DT0RFX0FSUkFZCisJICAgICB8fCBUWVBFX0NPREUgKGFyZ190eXBlKSA9PSBUWVBFX0NPREVfU1RSSU5HCisJICAgICB8fCBUWVBFX0NPREUgKGFyZ190eXBlKSA9PSBUWVBFX0NPREVfQklUU1RSSU5HCisJICAgICB8fCBUWVBFX0NPREUgKGFyZ190eXBlKSA9PSBUWVBFX0NPREVfU0VUCisJICAgICB8fCAoVFlQRV9DT0RFIChhcmdfdHlwZSkgPT0gVFlQRV9DT0RFX0ZMVAorCQkgJiYgVFlQRV9MRU5HVEggKGFyZ190eXBlKSA+IDgpCisJICAgICApCisJICAmJiBSRUdfU1RSVUNUX0hBU19BRERSICh1c2luZ19nY2MsIGFyZ190eXBlKSkKKwkgIHsKKwkgICAgQ09SRV9BRERSIGFkZHI7CisJICAgIGludCBsZW47IC8qICA9IFRZUEVfTEVOR1RIIChhcmdfdHlwZSk7ICovIAorICAgICAgICAgICAgaW50IGFsaWduZWRfbGVuOworICAgICAgICAgICAgYXJnX3R5cGUgPSBjaGVja190eXBlZGVmIChWQUxVRV9FTkNMT1NJTkdfVFlQRSAoYXJnc1tpXSkpOyAKKyAgICAgICAgICAgIGxlbiA9IFRZUEVfTEVOR1RIIChhcmdfdHlwZSk7CisKKyNpZmRlZiBTVEFDS19BTElHTgorICAvKiBNVlMgMTEvMjIvOTY6IEkgdGhpbmsgYXQgbGVhc3Qgc29tZSBvZiB0aGlzIHN0YWNrX2FsaWduIGNvZGUgaXMKKyAgICAgcmVhbGx5IGJyb2tlbi4gIEJldHRlciB0byBsZXQgUFVTSF9BUkdVTUVOVFMgYWRqdXN0IHRoZSBzdGFjayBpbgorICAgICBhIHRhcmdldC1kZWZpbmVkIG1hbm5lci4gICovCisJICAgIGFsaWduZWRfbGVuID0gU1RBQ0tfQUxJR04gKGxlbik7CisjZWxzZQorCSAgICBhbGlnbmVkX2xlbiA9IGxlbjsKKyNlbmRpZgorCSAgICBpZiAoSU5ORVJfVEhBTiAoMSwgMikpCisJICAgICAgeworCQkvKiBzdGFjayBncm93cyBkb3dud2FyZCAqLworCQlzcCAtPSBhbGlnbmVkX2xlbjsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCS8qIFRoZSBzdGFjayBncm93cyB1cCwgc28gdGhlIGFkZHJlc3Mgb2YgdGhlIHRoaW5nIHdlIHB1c2gKKwkJICAgaXMgdGhlIHN0YWNrIHBvaW50ZXIgYmVmb3JlIHdlIHB1c2ggaXQuICAqLworCQlhZGRyID0gc3A7CisJICAgICAgfQorCSAgICAvKiBQdXNoIHRoZSBzdHJ1Y3R1cmUuICAqLworCSAgICB3cml0ZV9tZW1vcnkgKHNwLCBWQUxVRV9DT05URU5UU19BTEwgKGFyZ3NbaV0pLCBsZW4pOworCSAgICBpZiAoSU5ORVJfVEhBTiAoMSwgMikpCisJICAgICAgeworCQkvKiBUaGUgc3RhY2sgZ3Jvd3MgZG93biwgc28gdGhlIGFkZHJlc3Mgb2YgdGhlIHRoaW5nIHdlIHB1c2gKKwkJICAgaXMgdGhlIHN0YWNrIHBvaW50ZXIgYWZ0ZXIgd2UgcHVzaCBpdC4gICovCisJCWFkZHIgPSBzcDsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCS8qIHN0YWNrIGdyb3dzIHVwd2FyZCAqLworCQlzcCArPSBhbGlnbmVkX2xlbjsKKwkgICAgICB9CisJICAgIC8qIFRoZSB2YWx1ZSB3ZSdyZSBnb2luZyB0byBwYXNzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSB0aGluZworCSAgICAgICB3ZSBqdXN0IHB1c2hlZC4gICovCisJICAgIC8qYXJnc1tpXSA9IHZhbHVlX2Zyb21fbG9uZ2VzdCAobG9va3VwX3BvaW50ZXJfdHlwZSAodmFsdWVfdHlwZSksCisJCQkJCSAgKExPTkdFU1QpIGFkZHIpOyovCisJICAgIGFyZ3NbaV0gPSB2YWx1ZV9mcm9tX2xvbmdlc3QgKGxvb2t1cF9wb2ludGVyX3R5cGUgKGFyZ190eXBlKSwgCisJCQkJCSAgKExPTkdFU1QpIGFkZHIpOworCSAgfQorICAgICAgfQorICB9CisjZW5kaWYgLyogUkVHX1NUUlVDVF9IQVNfQUREUi4gICovCisKKyAgLyogUmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHJldHVybiBzdHJ1Y3R1cmUgdG8gYmUgd3JpdHRlbiBvbiB0aGUKKyAgICAgc3RhY2ssIGlmIG5lY2Vzc2FyeSAqLworCisgIGlmIChzdHJ1Y3RfcmV0dXJuKQorICAgIHsKKyAgICAgIGludCBsZW4gPSBUWVBFX0xFTkdUSCAodmFsdWVfdHlwZSk7CisjaWZkZWYgU1RBQ0tfQUxJR04KKyAgLyogTVZTIDExLzIyLzk2OiBJIHRoaW5rIGF0IGxlYXN0IHNvbWUgb2YgdGhpcyBzdGFja19hbGlnbiBjb2RlIGlzCisgICAgIHJlYWxseSBicm9rZW4uICBCZXR0ZXIgdG8gbGV0IFBVU0hfQVJHVU1FTlRTIGFkanVzdCB0aGUgc3RhY2sgaW4KKyAgICAgYSB0YXJnZXQtZGVmaW5lZCBtYW5uZXIuICAqLworICAgICAgbGVuID0gU1RBQ0tfQUxJR04gKGxlbik7CisjZW5kaWYKKyAgICAgIGlmIChJTk5FUl9USEFOICgxLCAyKSkKKwl7CisJICAvKiBzdGFjayBncm93cyBkb3dud2FyZCAqLworCSAgc3AgLT0gbGVuOworCSAgc3RydWN0X2FkZHIgPSBzcDsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogc3RhY2sgZ3Jvd3MgdXB3YXJkICovCisJICBzdHJ1Y3RfYWRkciA9IHNwOworCSAgc3AgKz0gbGVuOworCX0KKyAgICB9CisKKy8qIGVsejogb24gSFBQQSBubyBuZWVkIGZvciB0aGlzIGV4dHJhIGFsaWdubWVudCwgbWF5YmUgaXQgaXMgbmVlZGVkCisgICBvbiBvdGhlciBhcmNoaXRlY3R1cmVzLiBUaGlzIGlzIGJlY2F1c2UgYWxsIHRoZSBhbGlnbm1lbnQgaXMgdGFrZW4gY2FyZQorICAgb2YgaW4gdGhlIGFib3ZlIGNvZGUgKGlmZGVmIFJFR19TVFJVQ1RfSEFTX0FERFIpIGFuZCBpbiAKKyAgIGhwcGFfcHVzaF9hcmd1bWVudHMqLworI2lmbmRlZiBOT19FWFRSQV9BTElHTk1FTlRfTkVFREVECisKKyNpZiBkZWZpbmVkKFNUQUNLX0FMSUdOKQorICAvKiBNVlMgMTEvMjIvOTY6IEkgdGhpbmsgYXQgbGVhc3Qgc29tZSBvZiB0aGlzIHN0YWNrX2FsaWduIGNvZGUgaXMKKyAgICAgcmVhbGx5IGJyb2tlbi4gIEJldHRlciB0byBsZXQgUFVTSF9BUkdVTUVOVFMgYWRqdXN0IHRoZSBzdGFjayBpbgorICAgICBhIHRhcmdldC1kZWZpbmVkIG1hbm5lci4gICovCisgIGlmIChJTk5FUl9USEFOICgxLCAyKSkKKyAgICB7CisgICAgICAvKiBJZiBzdGFjayBncm93cyBkb3duLCB3ZSBtdXN0IGxlYXZlIGEgaG9sZSBhdCB0aGUgdG9wLiAqLworICAgICAgaW50IGxlbiA9IDA7CisKKyAgICAgIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCisJbGVuICs9IFRZUEVfTEVOR1RIIChWQUxVRV9FTkNMT1NJTkdfVFlQRSAoYXJnc1tpXSkpOworI2lmZGVmIENBTExfRFVNTVlfU1RBQ0tfQURKVVNUCisgICAgICBsZW4gKz0gQ0FMTF9EVU1NWV9TVEFDS19BREpVU1Q7CisjZW5kaWYKKyAgICAgIHNwIC09IFNUQUNLX0FMSUdOIChsZW4pIC0gbGVuOworICAgIH0KKyNlbmRpZiAvKiBTVEFDS19BTElHTiAqLworI2VuZGlmIC8qIE5PX0VYVFJBX0FMSUdOTUVOVF9ORUVERUQgKi8KKworI2lmZGVmIFBVU0hfQVJHVU1FTlRTCisgIFBVU0hfQVJHVU1FTlRTKG5hcmdzLCBhcmdzLCBzcCwgc3RydWN0X3JldHVybiwgc3RydWN0X2FkZHIpOworI2Vsc2UgLyogIVBVU0hfQVJHVU1FTlRTICovCisgIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgc3AgPSB2YWx1ZV9wdXNoIChzcCwgYXJnc1tpXSk7CisjZW5kaWYgLyogIVBVU0hfQVJHVU1FTlRTICovCisKKyNpZmRlZiBQVVNIX1JFVFVSTl9BRERSRVNTCS8qIGZvciB0YXJnZXRzIHRoYXQgdXNlIG5vIENBTExfRFVNTVkgKi8KKyAgLyogVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRhcmdldHMgbm93IHdoaWNoIGFjdHVhbGx5IGRvbid0IHdyaXRlIGFueQorICAgICBDQUxMX0RVTU1ZIGluc3RydWN0aW9ucyBpbnRvIHRoZSB0YXJnZXQsIGJ1dCBpbnN0ZWFkIGp1c3Qgc2F2ZSB0aGUKKyAgICAgbWFjaGluZSBzdGF0ZSwgcHVzaCB0aGUgYXJndW1lbnRzLCBhbmQganVtcCBkaXJlY3RseSB0byB0aGUgY2FsbGVlCisgICAgIGZ1bmN0aW9uLiAgU2luY2UgdGhpcyBkb2Vzbid0IGFjdHVhbGx5IGludm9sdmUgZXhlY3V0aW5nIGEgSlNSL0JTUgorICAgICBpbnN0cnVjdGlvbiwgdGhlIHJldHVybiBhZGRyZXNzIG11c3QgYmUgc2V0IHVwIGJ5IGhhbmQsIGVpdGhlciBieQorICAgICBwdXNoaW5nIG9udG8gdGhlIHN0YWNrIG9yIGNvcHlpbmcgaW50byBhIHJldHVybi1hZGRyZXNzIHJlZ2lzdGVyCisgICAgIGFzIGFwcHJvcHJpYXRlLiAgRm9ybWVybHkgdGhpcyBoYXMgYmVlbiBkb25lIGluIFBVU0hfQVJHVU1FTlRTLCAKKyAgICAgYnV0IHRoYXQncyBvdmVybG9hZGluZyBpdHMgZnVuY3Rpb25hbGl0eSBhIGJpdCwgc28gSSdtIG1ha2luZyBpdAorICAgICBleHBsaWNpdCB0byBkbyBpdCBoZXJlLiAgKi8KKyAgc3AgPSBQVVNIX1JFVFVSTl9BRERSRVNTKHJlYWxfcGMsIHNwKTsKKyNlbmRpZgkvKiBQVVNIX1JFVFVSTl9BRERSRVNTICovCisKKyNpZiBkZWZpbmVkKFNUQUNLX0FMSUdOKQorICBpZiAoISBJTk5FUl9USEFOICgxLCAyKSkKKyAgICB7CisgICAgICAvKiBJZiBzdGFjayBncm93cyB1cCwgd2UgbXVzdCBsZWF2ZSBhIGhvbGUgYXQgdGhlIGJvdHRvbSwgbm90ZQorCSB0aGF0IHNwIGFscmVhZHkgaGFzIGJlZW4gYWR2YW5jZWQgZm9yIHRoZSBhcmd1bWVudHMhICAqLworI2lmZGVmIENBTExfRFVNTVlfU1RBQ0tfQURKVVNUCisgICAgICBzcCArPSBDQUxMX0RVTU1ZX1NUQUNLX0FESlVTVDsKKyNlbmRpZgorICAgICAgc3AgPSBTVEFDS19BTElHTiAoc3ApOworICAgIH0KKyNlbmRpZiAvKiBTVEFDS19BTElHTiAqLworCisvKiBYWFggVGhpcyBzZWVtcyB3cm9uZy4gIEZvciBzdGFja3MgdGhhdCBncm93IGRvd24gd2Ugc2hvdWxkbid0IGRvCisgICBhbnl0aGluZyBoZXJlISAgKi8KKyAgLyogTVZTIDExLzIyLzk2OiBJIHRoaW5rIGF0IGxlYXN0IHNvbWUgb2YgdGhpcyBzdGFja19hbGlnbiBjb2RlIGlzCisgICAgIHJlYWxseSBicm9rZW4uICBCZXR0ZXIgdG8gbGV0IFBVU0hfQVJHVU1FTlRTIGFkanVzdCB0aGUgc3RhY2sgaW4KKyAgICAgYSB0YXJnZXQtZGVmaW5lZCBtYW5uZXIuICAqLworI2lmZGVmIENBTExfRFVNTVlfU1RBQ0tfQURKVVNUCisgIGlmIChJTk5FUl9USEFOICgxLCAyKSkKKyAgICB7CisgICAgICAvKiBzdGFjayBncm93cyBkb3dud2FyZCAqLworICAgICAgc3AgLT0gQ0FMTF9EVU1NWV9TVEFDS19BREpVU1Q7CisgICAgfQorI2VuZGlmIC8qIENBTExfRFVNTVlfU1RBQ0tfQURKVVNUICovCisKKyAgLyogU3RvcmUgdGhlIGFkZHJlc3MgYXQgd2hpY2ggdGhlIHN0cnVjdHVyZSBpcyBzdXBwb3NlZCB0byBiZQorICAgICB3cml0dGVuLiAgTm90ZSB0aGF0IHRoaXMgKGFuZCB0aGUgY29kZSB3aGljaCByZXNlcnZlZCB0aGUgc3BhY2UKKyAgICAgYWJvdmUpIGFzc3VtZXMgdGhhdCBnY2Mgd2FzIHVzZWQgdG8gY29tcGlsZSB0aGlzIGZ1bmN0aW9uLiAgU2luY2UKKyAgICAgaXQgZG9lc24ndCBjb3N0IHVzIGFueXRoaW5nIGJ1dCBzcGFjZSBhbmQgaWYgdGhlIGZ1bmN0aW9uIGlzIHBjYworICAgICBpdCB3aWxsIGlnbm9yZSB0aGlzIHZhbHVlLCB3ZSB3aWxsIG1ha2UgdGhhdCBhc3N1bXB0aW9uLgorCisgICAgIEFsc28gbm90ZSB0aGF0IG9uIHNvbWUgbWFjaGluZXMgKGxpa2UgdGhlIHNwYXJjKSBwY2MgdXNlcyBhIAorICAgICBjb252ZW50aW9uIGxpa2UgZ2NjJ3MuICAqLworCisgIGlmIChzdHJ1Y3RfcmV0dXJuKQorICAgIFNUT1JFX1NUUlVDVF9SRVRVUk4gKHN0cnVjdF9hZGRyLCBzcCk7CisKKyAgLyogV3JpdGUgdGhlIHN0YWNrIHBvaW50ZXIuICBUaGlzIGlzIGhlcmUgYmVjYXVzZSB0aGUgc3RhdGVtZW50cyBhYm92ZQorICAgICBtaWdodCBmb29sIHdpdGggaXQuICBPbiBTUEFSQywgdGhpcyB3cml0ZSBhbHNvIHN0b3JlcyB0aGUgcmVnaXN0ZXIKKyAgICAgd2luZG93IGludG8gdGhlIHJpZ2h0IHBsYWNlIGluIHRoZSBuZXcgc3RhY2sgZnJhbWUsIHdoaWNoIG90aGVyd2lzZQorICAgICB3b3VsZG4ndCBoYXBwZW4uICAoU2VlIHN0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyBpbiBzcGFyYy1uYXQuYy4pICAqLworICB3cml0ZV9zcCAoc3ApOworCisgIHsKKyAgICBjaGFyIHJldGJ1ZltSRUdJU1RFUl9CWVRFU107CisgICAgY2hhciAqbmFtZTsKKyAgICBzdHJ1Y3Qgc3ltYm9sICpzeW1ib2w7CisKKyAgICBuYW1lID0gTlVMTDsKKyAgICBzeW1ib2wgPSBmaW5kX3BjX2Z1bmN0aW9uIChmdW5hZGRyKTsKKyAgICBpZiAoc3ltYm9sKQorICAgICAgeworCW5hbWUgPSBTWU1CT0xfU09VUkNFX05BTUUgKHN5bWJvbCk7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCS8qIFRyeSB0aGUgbWluaW1hbCBzeW1ib2xzLiAgKi8KKwlzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2wgPSBsb29rdXBfbWluaW1hbF9zeW1ib2xfYnlfcGMgKGZ1bmFkZHIpOworCisJaWYgKG1zeW1ib2wpCisJICB7CisJICAgIG5hbWUgPSBTWU1CT0xfU09VUkNFX05BTUUgKG1zeW1ib2wpOworCSAgfQorICAgICAgfQorICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICB7CisJY2hhciBmb3JtYXRbODBdOworCXNwcmludGYgKGZvcm1hdCwgImF0ICVzIiwgbG9jYWxfaGV4X2Zvcm1hdCAoKSk7CisJbmFtZSA9IGFsbG9jYSAoODApOworCS8qIEZJWE1FLTMyeDY0OiBhc3N1bWVzIGZ1bmFkZHIgZml0cyBpbiBhIGxvbmcuICAqLworCXNwcmludGYgKG5hbWUsIGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcpIGZ1bmFkZHIpOworICAgICAgfQorCisgICAgLyogRXhlY3V0ZSB0aGUgc3RhY2sgZHVtbXkgcm91dGluZSwgY2FsbGluZyBGVU5DVElPTi4KKyAgICAgICBXaGVuIGl0IGlzIGRvbmUsIGRpc2NhcmQgdGhlIGVtcHR5IGZyYW1lCisgICAgICAgYWZ0ZXIgc3RvcmluZyB0aGUgY29udGVudHMgb2YgYWxsIHJlZ3MgaW50byByZXRidWYuICAqLworICAgIGlmIChydW5fc3RhY2tfZHVtbXkgKHJlYWxfcGMgKyBDQUxMX0RVTU1ZX1NUQVJUX09GRlNFVCwgcmV0YnVmKSkKKyAgICAgIHsKKwkvKiBXZSBzdG9wcGVkIHNvbWV3aGVyZSBiZXNpZGVzIHRoZSBjYWxsIGR1bW15LiAgKi8KKworCS8qIElmIHdlIGRpZCB0aGUgY2xlYW51cHMsIHdlIHdvdWxkIHByaW50IGEgc3B1cmlvdXMgZXJyb3IgbWVzc2FnZQorCSAgIChVbmFibGUgdG8gcmVzdG9yZSBwcmV2aW91c2x5IHNlbGVjdGVkIGZyYW1lKSwgd291bGQgd3JpdGUgdGhlCisJICAgcmVnaXN0ZXJzIGZyb20gdGhlIGluZl9zdGF0dXMgKHdoaWNoIGlzIHdyb25nKSwgYW5kIHdvdWxkIGRvIG90aGVyCisJICAgd3JvbmcgdGhpbmdzIChsaWtlIHNldCBzdG9wX2Jwc3RhdCB0byB0aGUgd3JvbmcgdGhpbmcpLiAgKi8KKwlkaXNjYXJkX2NsZWFudXBzIChvbGRfY2hhaW4pOworCS8qIFByZXZlbnQgbWVtb3J5IGxlYWsuICAqLworCWJwc3RhdF9jbGVhciAoJmluZl9zdGF0dXMuc3RvcF9icHN0YXQpOworCisJLyogVGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlIHVzZWQgdG8gc2F5ICJUaGUgZXhwcmVzc2lvbgorCSAgIHdoaWNoIGNvbnRhaW5lZCB0aGUgZnVuY3Rpb24gY2FsbCBoYXMgYmVlbiBkaXNjYXJkZWQuIiAgSXQKKwkgICBpcyBhIGhhcmQgY29uY2VwdCB0byBleHBsYWluIGluIGEgZmV3IHdvcmRzLiAgSWRlYWxseSwgR0RCCisJICAgd291bGQgYmUgYWJsZSB0byByZXN1bWUgZXZhbHVhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiB3aGVuCisJICAgdGhlIGZ1bmN0aW9uIGZpbmFsbHkgaXMgZG9uZSBleGVjdXRpbmcuICBQZXJoYXBzIHNvbWVkYXkKKwkgICB0aGlzIHdpbGwgYmUgaW1wbGVtZW50ZWQgKGl0IHdvdWxkIG5vdCBiZSBlYXN5KS4gICovCisKKwkvKiBGSVhNRTogSW5zZXJ0IGEgYnVuY2ggb2Ygd3JhcF9oZXJlOyBuYW1lIGNhbiBiZSB2ZXJ5IGxvbmcgaWYgaXQncworCSAgIGEgQysrIG5hbWUgd2l0aCBhcmd1bWVudHMgYW5kIHN0dWZmLiAgKi8KKwllcnJvciAoIlwKK1RoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkIHN0b3BwZWQgd2hpbGUgaW4gYSBmdW5jdGlvbiBjYWxsZWQgZnJvbSBHREIuXG5cCitXaGVuIHRoZSBmdW5jdGlvbiAoJXMpIGlzIGRvbmUgZXhlY3V0aW5nLCBHREIgd2lsbCBzaWxlbnRseVxuXAorc3RvcCAoaW5zdGVhZCBvZiBjb250aW51aW5nIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGNvbnRhaW5pbmdcblwKK3RoZSBmdW5jdGlvbiBjYWxsKS4iLCBuYW1lKTsKKyAgICAgIH0KKworICAgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworCisgICAgLyogRmlndXJlIG91dCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLiAgKi8KKy8qIGVsejogSSBkZWZpbmVkIHRoaXMgbmV3IG1hY3JvIGZvciB0aGUgaHBwYSBhcmNoaXRlY3R1cmUgb25seS4KKyAgIHRoaXMgZ2l2ZXMgdXMgYSB3YXkgdG8gZ2V0IHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24gZnJvbSB0aGUgc3RhY2ssCisgICBhdCB0aGUgc2FtZSBhZGRyZXNzIHdlIHRvbGQgdGhlIGZ1bmN0aW9uIHRvIHB1dCBpdC4KKyAgIFdlIGNhbm5vdCBhc3N1bWUgb24gdGhlIHBhIHRoYXQgcjI4IHN0aWxsIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSByZXR1cm5lZAorICAgc3RydWN0dXJlLiBVc3VhbGx5IHRoaXMgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgY2FsbGVlLgorICAgSSBkb24ndCBrbm93IGFib3V0IG90aGVyIGFyY2hpdGVjdHVyZXMsIHNvIEkgZGVmaW5lZCB0aGlzIG1hY3JvCisqLworCisjaWZkZWYgVkFMVUVfUkVUVVJORURfRlJPTV9TVEFDSworICAgIGlmIChzdHJ1Y3RfcmV0dXJuKQorICAgICAgcmV0dXJuICh2YWx1ZV9wdHIpIFZBTFVFX1JFVFVSTkVEX0ZST01fU1RBQ0sgKHZhbHVlX3R5cGUsIHN0cnVjdF9hZGRyKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHZhbHVlX2JlaW5nX3JldHVybmVkICh2YWx1ZV90eXBlLCByZXRidWYsIHN0cnVjdF9yZXR1cm4pOworICB9Cit9CisjZWxzZSAvKiBubyBDQUxMX0RVTU1ZLiAgKi8KK3ZhbHVlX3B0cgorY2FsbF9mdW5jdGlvbl9ieV9oYW5kIChmdW5jdGlvbiwgbmFyZ3MsIGFyZ3MpCisgICAgIHZhbHVlX3B0ciBmdW5jdGlvbjsKKyAgICAgaW50IG5hcmdzOworICAgICB2YWx1ZV9wdHIgKmFyZ3M7Cit7CisgIGVycm9yICgiQ2Fubm90IGludm9rZSBmdW5jdGlvbnMgb24gdGhpcyBtYWNoaW5lLiIpOworfQorI2VuZGlmIC8qIG5vIENBTExfRFVNTVkuICAqLworCisMCisvKiBDcmVhdGUgYSB2YWx1ZSBmb3IgYW4gYXJyYXkgYnkgYWxsb2NhdGluZyBzcGFjZSBpbiB0aGUgaW5mZXJpb3IsIGNvcHlpbmcKKyAgIHRoZSBkYXRhIGludG8gdGhhdCBzcGFjZSwgYW5kIHRoZW4gc2V0dGluZyB1cCBhbiBhcnJheSB2YWx1ZS4KKworICAgVGhlIGFycmF5IGJvdW5kcyBhcmUgc2V0IGZyb20gTE9XQk9VTkQgYW5kIEhJR0hCT1VORCwgYW5kIHRoZSBhcnJheSBpcworICAgcG9wdWxhdGVkIGZyb20gdGhlIHZhbHVlcyBwYXNzZWQgaW4gRUxFTVZFQy4KKworICAgVGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgYXJyYXkgaXMgaW5oZXJpdGVkIGZyb20gdGhlIHR5cGUgb2YgdGhlCisgICBmaXJzdCBlbGVtZW50LCBhbmQgYWxsIGVsZW1lbnRzIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplICh0aG91Z2ggd2UKKyAgIGRvbid0IGN1cnJlbnRseSBlbmZvcmNlIGFueSByZXN0cmljdGlvbiBvbiB0aGVpciB0eXBlcykuICovCisKK3ZhbHVlX3B0cgordmFsdWVfYXJyYXkgKGxvd2JvdW5kLCBoaWdoYm91bmQsIGVsZW12ZWMpCisgICAgIGludCBsb3dib3VuZDsKKyAgICAgaW50IGhpZ2hib3VuZDsKKyAgICAgdmFsdWVfcHRyICplbGVtdmVjOworeworICBpbnQgbmVsZW07CisgIGludCBpZHg7CisgIHVuc2lnbmVkIGludCB0eXBlbGVuZ3RoOworICB2YWx1ZV9wdHIgdmFsOworICBzdHJ1Y3QgdHlwZSAqcmFuZ2V0eXBlOworICBzdHJ1Y3QgdHlwZSAqYXJyYXl0eXBlOworICBDT1JFX0FERFIgYWRkcjsKKworICAvKiBWYWxpZGF0ZSB0aGF0IHRoZSBib3VuZHMgYXJlIHJlYXNvbmFibGUgYW5kIHRoYXQgZWFjaCBvZiB0aGUgZWxlbWVudHMKKyAgICAgaGF2ZSB0aGUgc2FtZSBzaXplLiAqLworCisgIG5lbGVtID0gaGlnaGJvdW5kIC0gbG93Ym91bmQgKyAxOworICBpZiAobmVsZW0gPD0gMCkKKyAgICB7CisgICAgICBlcnJvciAoImJhZCBhcnJheSBib3VuZHMgKCVkLCAlZCkiLCBsb3dib3VuZCwgaGlnaGJvdW5kKTsKKyAgICB9CisgIHR5cGVsZW5ndGggPSBUWVBFX0xFTkdUSCAoVkFMVUVfRU5DTE9TSU5HX1RZUEUgKGVsZW12ZWNbMF0pKTsKKyAgZm9yIChpZHggPSAxOyBpZHggPCBuZWxlbTsgaWR4KyspCisgICAgeworICAgICAgaWYgKFRZUEVfTEVOR1RIIChWQUxVRV9FTkNMT1NJTkdfVFlQRSAoZWxlbXZlY1tpZHhdKSkgIT0gdHlwZWxlbmd0aCkKKwl7CisJICBlcnJvciAoImFycmF5IGVsZW1lbnRzIG11c3QgYWxsIGJlIHRoZSBzYW1lIHNpemUiKTsKKwl9CisgICAgfQorCisgIHJhbmdldHlwZSA9IGNyZWF0ZV9yYW5nZV90eXBlICgoc3RydWN0IHR5cGUgKikgTlVMTCwgYnVpbHRpbl90eXBlX2ludCwKKwkJCQkgbG93Ym91bmQsIGhpZ2hib3VuZCk7CisgIGFycmF5dHlwZSA9IGNyZWF0ZV9hcnJheV90eXBlICgoc3RydWN0IHR5cGUgKikgTlVMTCwgCisJCQkJIFZBTFVFX0VOQ0xPU0lOR19UWVBFIChlbGVtdmVjWzBdKSwgcmFuZ2V0eXBlKTsKKworICBpZiAoIWN1cnJlbnRfbGFuZ3VhZ2UtPmNfc3R5bGVfYXJyYXlzKQorICAgIHsKKyAgICAgIHZhbCA9IGFsbG9jYXRlX3ZhbHVlIChhcnJheXR5cGUpOworICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBuZWxlbTsgaWR4KyspCisJeworCSAgbWVtY3B5IChWQUxVRV9DT05URU5UU19BTExfUkFXICh2YWwpICsgKGlkeCAqIHR5cGVsZW5ndGgpLAorCQkgIFZBTFVFX0NPTlRFTlRTX0FMTCAoZWxlbXZlY1tpZHhdKSwKKwkJICB0eXBlbGVuZ3RoKTsKKwl9CisgICAgICBWQUxVRV9CRkRfU0VDVElPTiAodmFsKSA9IFZBTFVFX0JGRF9TRUNUSU9OIChlbGVtdmVjWzBdKTsKKyAgICAgIHJldHVybiB2YWw7CisgICAgfQorCisgIC8qIEFsbG9jYXRlIHNwYWNlIHRvIHN0b3JlIHRoZSBhcnJheSBpbiB0aGUgaW5mZXJpb3IsIGFuZCB0aGVuIGluaXRpYWxpemUKKyAgICAgaXQgYnkgY29weWluZyBpbiBlYWNoIGVsZW1lbnQuICBGSVhNRTogIElzIGl0IHdvcnRoIGl0IHRvIGNyZWF0ZSBhCisgICAgIGxvY2FsIGJ1ZmZlciBpbiB3aGljaCB0byBjb2xsZWN0IGVhY2ggdmFsdWUgYW5kIHRoZW4gd3JpdGUgYWxsIHRoZQorICAgICBieXRlcyBpbiBvbmUgb3BlcmF0aW9uPyAqLworCisgIGFkZHIgPSBhbGxvY2F0ZV9zcGFjZV9pbl9pbmZlcmlvciAobmVsZW0gKiB0eXBlbGVuZ3RoKTsKKyAgZm9yIChpZHggPSAwOyBpZHggPCBuZWxlbTsgaWR4KyspCisgICAgeworICAgICAgd3JpdGVfbWVtb3J5IChhZGRyICsgKGlkeCAqIHR5cGVsZW5ndGgpLCBWQUxVRV9DT05URU5UU19BTEwgKGVsZW12ZWNbaWR4XSksCisJCSAgICB0eXBlbGVuZ3RoKTsKKyAgICB9CisKKyAgLyogQ3JlYXRlIHRoZSBhcnJheSB0eXBlIGFuZCBzZXQgdXAgYW4gYXJyYXkgdmFsdWUgdG8gYmUgZXZhbHVhdGVkIGxhemlseS4gKi8KKworICB2YWwgPSB2YWx1ZV9hdF9sYXp5IChhcnJheXR5cGUsIGFkZHIsIFZBTFVFX0JGRF9TRUNUSU9OIChlbGVtdmVjWzBdKSk7CisgIHJldHVybiAodmFsKTsKK30KKworLyogQ3JlYXRlIGEgdmFsdWUgZm9yIGEgc3RyaW5nIGNvbnN0YW50IGJ5IGFsbG9jYXRpbmcgc3BhY2UgaW4gdGhlIGluZmVyaW9yLAorICAgY29weWluZyB0aGUgZGF0YSBpbnRvIHRoYXQgc3BhY2UsIGFuZCByZXR1cm5pbmcgdGhlIGFkZHJlc3Mgd2l0aCB0eXBlCisgICBUWVBFX0NPREVfU1RSSU5HLiAgUFRSIHBvaW50cyB0byB0aGUgc3RyaW5nIGNvbnN0YW50IGRhdGE7IExFTiBpcyBudW1iZXIKKyAgIG9mIGNoYXJhY3RlcnMuCisgICBOb3RlIHRoYXQgc3RyaW5nIHR5cGVzIGFyZSBsaWtlIGFycmF5IG9mIGNoYXIgdHlwZXMgd2l0aCBhIGxvd2VyIGJvdW5kIG9mCisgICB6ZXJvIGFuZCBhbiB1cHBlciBib3VuZCBvZiBMRU4gLSAxLiAgQWxzbyBub3RlIHRoYXQgdGhlIHN0cmluZyBtYXkgY29udGFpbgorICAgZW1iZWRkZWQgbnVsbCBieXRlcy4gKi8KKwordmFsdWVfcHRyCit2YWx1ZV9zdHJpbmcgKHB0ciwgbGVuKQorICAgICBjaGFyICpwdHI7CisgICAgIGludCBsZW47Cit7CisgIHZhbHVlX3B0ciB2YWw7CisgIGludCBsb3dib3VuZCA9IGN1cnJlbnRfbGFuZ3VhZ2UtPnN0cmluZ19sb3dlcl9ib3VuZDsKKyAgc3RydWN0IHR5cGUgKnJhbmdldHlwZSA9IGNyZWF0ZV9yYW5nZV90eXBlICgoc3RydWN0IHR5cGUgKikgTlVMTCwKKwkJCQkJICAgICAgYnVpbHRpbl90eXBlX2ludCwKKwkJCQkJICAgICAgbG93Ym91bmQsIGxlbiArIGxvd2JvdW5kIC0gMSk7CisgIHN0cnVjdCB0eXBlICpzdHJpbmd0eXBlCisgICAgPSBjcmVhdGVfc3RyaW5nX3R5cGUgKChzdHJ1Y3QgdHlwZSAqKSBOVUxMLCByYW5nZXR5cGUpOworICBDT1JFX0FERFIgYWRkcjsKKworICBpZiAoY3VycmVudF9sYW5ndWFnZS0+Y19zdHlsZV9hcnJheXMgPT0gMCkKKyAgICB7CisgICAgICB2YWwgPSBhbGxvY2F0ZV92YWx1ZSAoc3RyaW5ndHlwZSk7CisgICAgICBtZW1jcHkgKFZBTFVFX0NPTlRFTlRTX1JBVyAodmFsKSwgcHRyLCBsZW4pOworICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKworICAvKiBBbGxvY2F0ZSBzcGFjZSB0byBzdG9yZSB0aGUgc3RyaW5nIGluIHRoZSBpbmZlcmlvciwgYW5kIHRoZW4KKyAgICAgY29weSBMRU4gYnl0ZXMgZnJvbSBQVFIgaW4gZ2RiIHRvIHRoYXQgYWRkcmVzcyBpbiB0aGUgaW5mZXJpb3IuICovCisKKyAgYWRkciA9IGFsbG9jYXRlX3NwYWNlX2luX2luZmVyaW9yIChsZW4pOworICB3cml0ZV9tZW1vcnkgKGFkZHIsIHB0ciwgbGVuKTsKKworICB2YWwgPSB2YWx1ZV9hdF9sYXp5IChzdHJpbmd0eXBlLCBhZGRyLCBOVUxMKTsKKyAgcmV0dXJuICh2YWwpOworfQorCit2YWx1ZV9wdHIKK3ZhbHVlX2JpdHN0cmluZyAocHRyLCBsZW4pCisgICAgIGNoYXIgKnB0cjsKKyAgICAgaW50IGxlbjsKK3sKKyAgdmFsdWVfcHRyIHZhbDsKKyAgc3RydWN0IHR5cGUgKmRvbWFpbl90eXBlID0gY3JlYXRlX3JhbmdlX3R5cGUgKE5VTEwsIGJ1aWx0aW5fdHlwZV9pbnQsCisJCQkJCQkwLCBsZW4gLSAxKTsKKyAgc3RydWN0IHR5cGUgKnR5cGUgPSBjcmVhdGVfc2V0X3R5cGUgKChzdHJ1Y3QgdHlwZSopIE5VTEwsIGRvbWFpbl90eXBlKTsKKyAgVFlQRV9DT0RFICh0eXBlKSA9IFRZUEVfQ09ERV9CSVRTVFJJTkc7CisgIHZhbCA9IGFsbG9jYXRlX3ZhbHVlICh0eXBlKTsKKyAgbWVtY3B5IChWQUxVRV9DT05URU5UU19SQVcgKHZhbCksIHB0ciwgVFlQRV9MRU5HVEggKHR5cGUpKTsKKyAgcmV0dXJuIHZhbDsKK30KKwwKKy8qIFNlZSBpZiB3ZSBjYW4gcGFzcyBhcmd1bWVudHMgaW4gVDIgdG8gYSBmdW5jdGlvbiB3aGljaCB0YWtlcyBhcmd1bWVudHMKKyAgIG9mIHR5cGVzIFQxLiAgQm90aCB0MSBhbmQgdDIgYXJlIE5VTEwtdGVybWluYXRlZCB2ZWN0b3JzLiAgSWYgc29tZQorICAgYXJndW1lbnRzIG5lZWQgY29lcmNpb24gb2Ygc29tZSBzb3J0LCB0aGVuIHRoZSBjb2VyY2VkIHZhbHVlcyBhcmUgd3JpdHRlbgorICAgaW50byBUMi4gIFJldHVybiB2YWx1ZSBpcyAwIGlmIHRoZSBhcmd1bWVudHMgY291bGQgYmUgbWF0Y2hlZCwgb3IgdGhlCisgICBwb3NpdGlvbiBhdCB3aGljaCB0aGV5IGRpZmZlciBpZiBub3QuCisKKyAgIFNUQVRJQ1AgaXMgbm9uemVybyBpZiB0aGUgVDEgYXJndW1lbnQgbGlzdCBjYW1lIGZyb20gYQorICAgc3RhdGljIG1lbWJlciBmdW5jdGlvbi4KKworICAgRm9yIG5vbi1zdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucywgd2UgaWdub3JlIHRoZSBmaXJzdCBhcmd1bWVudCwKKyAgIHdoaWNoIGlzIHRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZSB2YXJpYWJsZS4gIFRoaXMgaXMgYmVjYXVzZSB3ZSB3YW50CisgICB0byBoYW5kbGUgY2FsbHMgd2l0aCBvYmplY3RzIGZyb20gZGVyaXZlZCBjbGFzc2VzLiAgVGhpcyBpcyBub3QKKyAgIGVudGlyZWx5IGNvcnJlY3Q6IHdlIHNob3VsZCBhY3R1YWxseSBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCBhCisgICByZXF1ZXN0ZWQgb3BlcmF0aW9uIGlzIHR5cGUgc2VjdXJlLCBzaG91bGRuJ3Qgd2U/ICBGSVhNRS4gICovCisKK3N0YXRpYyBpbnQKK3R5cGVjbXAgKHN0YXRpY3AsIHQxLCB0MikKKyAgICAgaW50IHN0YXRpY3A7CisgICAgIHN0cnVjdCB0eXBlICp0MVtdOworICAgICB2YWx1ZV9wdHIgdDJbXTsKK3sKKyAgaW50IGk7CisKKyAgaWYgKHQyID09IDApCisgICAgcmV0dXJuIDE7CisgIGlmIChzdGF0aWNwICYmIHQxID09IDApCisgICAgcmV0dXJuIHQyWzFdICE9IDA7CisgIGlmICh0MSA9PSAwKQorICAgIHJldHVybiAxOworICBpZiAoVFlQRV9DT0RFICh0MVswXSkgPT0gVFlQRV9DT0RFX1ZPSUQpIHJldHVybiAwOworICBpZiAodDFbIXN0YXRpY3BdID09IDApIHJldHVybiAwOworICBmb3IgKGkgPSAhc3RhdGljcDsgdDFbaV0gJiYgVFlQRV9DT0RFICh0MVtpXSkgIT0gVFlQRV9DT0RFX1ZPSUQ7IGkrKykKKyAgICB7CisgICAgc3RydWN0IHR5cGUgKnR0MSwgKnR0MjsKKyAgICAgIGlmICghIHQyW2ldKQorCXJldHVybiBpKzE7CisgICAgICB0dDEgPSBjaGVja190eXBlZGVmICh0MVtpXSk7CisgICAgICB0dDIgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFKHQyW2ldKSk7CisgICAgICBpZiAoVFlQRV9DT0RFICh0dDEpID09IFRZUEVfQ09ERV9SRUYKKwkgIC8qIFdlIHNob3VsZCBiZSBkb2luZyBoYWlyeSBhcmd1bWVudCBtYXRjaGluZywgYXMgYmVsb3cuICAqLworCSAgJiYgKFRZUEVfQ09ERSAoY2hlY2tfdHlwZWRlZiAoVFlQRV9UQVJHRVRfVFlQRSAodHQxKSkpID09IFRZUEVfQ09ERSAodHQyKSkpCisJeworCSAgaWYgKFRZUEVfQ09ERSAodHQyKSA9PSBUWVBFX0NPREVfQVJSQVkpCisJICAgIHQyW2ldID0gdmFsdWVfY29lcmNlX2FycmF5ICh0MltpXSk7CisJICBlbHNlCisJICAgIHQyW2ldID0gdmFsdWVfYWRkciAodDJbaV0pOworCSAgY29udGludWU7CisJfQorCisgICAgICB3aGlsZSAoVFlQRV9DT0RFICh0dDEpID09IFRZUEVfQ09ERV9QVFIKKwkgICYmICggICBUWVBFX0NPREUgKHR0MikgPT0gVFlQRV9DT0RFX0FSUkFZCisJICAgICAgfHwgVFlQRV9DT0RFICh0dDIpID09IFRZUEVfQ09ERV9QVFIpKQorCXsKKwkgICB0dDEgPSBjaGVja190eXBlZGVmIChUWVBFX1RBUkdFVF9UWVBFKHR0MSkpOyAKKwkgICB0dDIgPSBjaGVja190eXBlZGVmIChUWVBFX1RBUkdFVF9UWVBFKHR0MikpOworCX0KKyAgICAgIGlmIChUWVBFX0NPREUodHQxKSA9PSBUWVBFX0NPREUodHQyKSkgY29udGludWU7CisgICAgICAvKiBBcnJheSB0byBwb2ludGVyIGlzIGEgYHRyaXZpYWwgY29udmVyc2lvbicgYWNjb3JkaW5nIHRvIHRoZSBBUk0uICAqLworCisgICAgICAvKiBXZSBzaG91bGQgYmUgZG9pbmcgbXVjaCBoYWlyaWVyIGFyZ3VtZW50IG1hdGNoaW5nIChzZWUgc2VjdGlvbiAxMy4yCisJIG9mIHRoZSBBUk0pLCBidXQgYXMgYSBxdWljayBrbHVkZ2UsIGp1c3QgY2hlY2sgZm9yIHRoZSBzYW1lIHR5cGUKKwkgY29kZS4gICovCisgICAgICBpZiAoVFlQRV9DT0RFICh0MVtpXSkgIT0gVFlQRV9DT0RFIChWQUxVRV9UWVBFICh0MltpXSkpKQorCXJldHVybiBpKzE7CisgICAgfQorICBpZiAoIXQxW2ldKSByZXR1cm4gMDsKKyAgcmV0dXJuIHQyW2ldID8gaSsxIDogMDsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgdmFsdWVfc3RydWN0X2VsdCB0byByZWN1cnNlIHRocm91Z2ggYmFzZWNsYXNzZXMuCisgICBMb29rIGZvciBhIGZpZWxkIE5BTUUgaW4gQVJHMS4gQWRqdXN0IHRoZSBhZGRyZXNzIG9mIEFSRzEgYnkgT0ZGU0VUIGJ5dGVzLAorICAgYW5kIHNlYXJjaCBpbiBpdCBhc3N1bWluZyBpdCBoYXMgKGNsYXNzKSB0eXBlIFRZUEUuCisgICBJZiBmb3VuZCwgcmV0dXJuIHZhbHVlLCBlbHNlIHJldHVybiBOVUxMLgorCisgICBJZiBMT09LSU5HX0ZPUl9CQVNFQ0xBU1MsIHRoZW4gaW5zdGVhZCBvZiBsb29raW5nIGZvciBzdHJ1Y3QgZmllbGRzLAorICAgbG9vayBmb3IgYSBiYXNlY2xhc3MgbmFtZWQgTkFNRS4gICovCisKK3N0YXRpYyB2YWx1ZV9wdHIKK3NlYXJjaF9zdHJ1Y3RfZmllbGQgKG5hbWUsIGFyZzEsIG9mZnNldCwgdHlwZSwgbG9va2luZ19mb3JfYmFzZWNsYXNzKQorICAgICBjaGFyICpuYW1lOworICAgICByZWdpc3RlciB2YWx1ZV9wdHIgYXJnMTsKKyAgICAgaW50IG9mZnNldDsKKyAgICAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGludCBsb29raW5nX2Zvcl9iYXNlY2xhc3M7Cit7CisgIGludCBpOworICBpbnQgbmJhc2VzID0gVFlQRV9OX0JBU0VDTEFTU0VTICh0eXBlKTsKKworICBDSEVDS19UWVBFREVGICh0eXBlKTsKKworICBpZiAoISBsb29raW5nX2Zvcl9iYXNlY2xhc3MpCisgICAgZm9yIChpID0gVFlQRV9ORklFTERTICh0eXBlKSAtIDE7IGkgPj0gbmJhc2VzOyBpLS0pCisgICAgICB7CisJY2hhciAqdF9maWVsZF9uYW1lID0gVFlQRV9GSUVMRF9OQU1FICh0eXBlLCBpKTsKKworCWlmICh0X2ZpZWxkX25hbWUgJiYgU1RSRVEgKHRfZmllbGRfbmFtZSwgbmFtZSkpCisJICB7CisJICAgIHZhbHVlX3B0ciB2OworCSAgICBpZiAoVFlQRV9GSUVMRF9TVEFUSUMgKHR5cGUsIGkpKQorCSAgICAgIHYgPSB2YWx1ZV9zdGF0aWNfZmllbGQgKHR5cGUsIGkpOworCSAgICBlbHNlCisJICAgICAgdiA9IHZhbHVlX3ByaW1pdGl2ZV9maWVsZCAoYXJnMSwgb2Zmc2V0LCBpLCB0eXBlKTsKKwkgICAgaWYgKHYgPT0gMCkKKwkgICAgICBlcnJvcigidGhlcmUgaXMgbm8gZmllbGQgbmFtZWQgJXMiLCBuYW1lKTsKKwkgICAgcmV0dXJuIHY7CisJICB9CisKKwlpZiAodF9maWVsZF9uYW1lCisJICAgICYmICh0X2ZpZWxkX25hbWVbMF0gPT0gJ1wwJworCQl8fCAoVFlQRV9DT0RFICh0eXBlKSA9PSBUWVBFX0NPREVfVU5JT04KKwkJICAgICYmIFNUUkVRICh0X2ZpZWxkX25hbWUsICJlbHNlIikpKSkKKwkgIHsKKwkgICAgc3RydWN0IHR5cGUgKmZpZWxkX3R5cGUgPSBUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpOworCSAgICBpZiAoVFlQRV9DT0RFIChmaWVsZF90eXBlKSA9PSBUWVBFX0NPREVfVU5JT04KKwkJfHwgVFlQRV9DT0RFIChmaWVsZF90eXBlKSA9PSBUWVBFX0NPREVfU1RSVUNUKQorCSAgICAgIHsKKwkJLyogTG9vayBmb3IgYSBtYXRjaCB0aHJvdWdoIHRoZSBmaWVsZHMgb2YgYW4gYW5vbnltb3VzIHVuaW9uLAorCQkgICBvciBhbm9ueW1vdXMgc3RydWN0LiAgQysrIHByb3ZpZGVzIGFub255bW91cyB1bmlvbnMuCisKKwkJICAgSW4gdGhlIEdOVSBDaGlsbCBpbXBsZW1lbnRhdGlvbiBvZiB2YXJpYW50IHJlY29yZCB0eXBlcywKKwkJICAgZWFjaCA8YWx0ZXJuYXRpdmUgZmllbGQ+IGhhcyBhbiAoYW5vbnltb3VzKSB1bmlvbiB0eXBlLAorCQkgICBlYWNoIG1lbWJlciBvZiB0aGUgdW5pb24gcmVwcmVzZW50cyBhIDx2YXJpYW50IGFsdGVybmF0aXZlPi4KKwkJICAgRWFjaCA8dmFyaWFudCBhbHRlcm5hdGl2ZT4gaXMgcmVwcmVzZW50ZWQgYXMgYSBzdHJ1Y3QsCisJCSAgIHdpdGggYSBtZW1iZXIgZm9yIGVhY2ggPHZhcmlhbnQgZmllbGQ+LiAgKi8KKwkJICAgCisJCXZhbHVlX3B0ciB2OworCQlpbnQgbmV3X29mZnNldCA9IG9mZnNldDsKKworCQkvKiBUaGlzIGlzIHByZXR0eSBncm9zcy4gIEluIEcrKywgdGhlIG9mZnNldCBpbiBhbiBhbm9ueW1vdXMKKwkJICAgdW5pb24gaXMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZW5jbG9zaW5nIHN0cnVjdC4KKwkJICAgSW4gdGhlIEdOVSBDaGlsbCBpbXBsZW1lbnRhdGlvbiBvZiB2YXJpYW50IHJlY29yZHMsCisJCSAgIHRoZSBiaXRwb3MgaXMgemVybyBpbiBhbiBhbm9ueW1vdXMgdW5pb24gZmllbGQsIHNvIHdlCisJCSAgIGhhdmUgdG8gYWRkIHRoZSBvZmZzZXQgb2YgdGhlIHVuaW9uIGhlcmUuICovCisJCWlmIChUWVBFX0NPREUgKGZpZWxkX3R5cGUpID09IFRZUEVfQ09ERV9TVFJVQ1QKKwkJICAgIHx8IChUWVBFX05GSUVMRFMgKGZpZWxkX3R5cGUpID4gMAorCQkJJiYgVFlQRV9GSUVMRF9CSVRQT1MgKGZpZWxkX3R5cGUsIDApID09IDApKQorCQkgIG5ld19vZmZzZXQgKz0gVFlQRV9GSUVMRF9CSVRQT1MgKHR5cGUsIGkpIC8gODsKKworCQl2ID0gc2VhcmNoX3N0cnVjdF9maWVsZCAobmFtZSwgYXJnMSwgbmV3X29mZnNldCwgZmllbGRfdHlwZSwKKwkJCQkJIGxvb2tpbmdfZm9yX2Jhc2VjbGFzcyk7CisJCWlmICh2KQorCQkgIHJldHVybiB2OworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworICBmb3IgKGkgPSAwOyAgaSA8IG5iYXNlczsgIGkrKykKKyAgICB7CisgICAgICB2YWx1ZV9wdHIgdjsKKyAgICAgIHN0cnVjdCB0eXBlICpiYXNldHlwZSA9IGNoZWNrX3R5cGVkZWYgKFRZUEVfQkFTRUNMQVNTICh0eXBlLCBpKSk7CisgICAgICAvKiBJZiB3ZSBhcmUgbG9va2luZyBmb3IgYmFzZWNsYXNzZXMsIHRoaXMgaXMgd2hhdCB3ZSBnZXQgd2hlbiB3ZQorCSBoaXQgdGhlbS4gIEJ1dCBpdCBjb3VsZCBoYXBwZW4gdGhhdCB0aGUgYmFzZSBwYXJ0J3MgbWVtYmVyIG5hbWUKKwkgaXMgbm90IHlldCBmaWxsZWQgaW4uICAqLworICAgICAgaW50IGZvdW5kX2Jhc2VjbGFzcyA9IChsb29raW5nX2Zvcl9iYXNlY2xhc3MKKwkJCSAgICAgJiYgVFlQRV9CQVNFQ0xBU1NfTkFNRSAodHlwZSwgaSkgIT0gTlVMTAorCQkJICAgICAmJiBTVFJFUSAobmFtZSwgVFlQRV9CQVNFQ0xBU1NfTkFNRSAodHlwZSwgaSkpKTsKKworICAgICAgaWYgKEJBU0VUWVBFX1ZJQV9WSVJUVUFMICh0eXBlLCBpKSkKKwl7CisJICBpbnQgYm9mZnNldDsKKwkgIHZhbHVlX3B0ciB2MiA9IGFsbG9jYXRlX3ZhbHVlIChiYXNldHlwZSk7CisKKwkgIGJvZmZzZXQgPSBiYXNlY2xhc3Nfb2Zmc2V0ICh0eXBlLCBpLAorCQkJCSAgICAgIFZBTFVFX0NPTlRFTlRTIChhcmcxKSArIG9mZnNldCwKKwkJCQkgICAgICBWQUxVRV9BRERSRVNTIChhcmcxKQorCQkJCQkrIFZBTFVFX09GRlNFVCAoYXJnMSkgKyBvZmZzZXQpOworCSAgaWYgKGJvZmZzZXQgPT0gLTEpCisJICAgIGVycm9yICgidmlydHVhbCBiYXNlY2xhc3MgYm90Y2giKTsKKworCSAgLyogVGhlIHZpcnR1YWwgYmFzZSBjbGFzcyBwb2ludGVyIG1pZ2h0IGhhdmUgYmVlbiBjbG9iYmVyZWQgYnkgdGhlCisJICAgICB1c2VyIHByb2dyYW0uIE1ha2Ugc3VyZSB0aGF0IGl0IHN0aWxsIHBvaW50cyB0byBhIHZhbGlkIG1lbW9yeQorCSAgICAgbG9jYXRpb24uICAqLworCisJICBib2Zmc2V0ICs9IG9mZnNldDsKKwkgIGlmIChib2Zmc2V0IDwgMCB8fCBib2Zmc2V0ID49IFRZUEVfTEVOR1RIICh0eXBlKSkKKwkgICAgeworCSAgICAgIENPUkVfQUREUiBiYXNlX2FkZHI7CisJCisJICAgICAgYmFzZV9hZGRyID0gVkFMVUVfQUREUkVTUyAoYXJnMSkgKyBWQUxVRV9PRkZTRVQgKGFyZzEpICsgYm9mZnNldDsKKwkgICAgICBpZiAodGFyZ2V0X3JlYWRfbWVtb3J5IChiYXNlX2FkZHIsIFZBTFVFX0NPTlRFTlRTX1JBVyAodjIpLAorCQkJCSAgICAgIFRZUEVfTEVOR1RIIChiYXNldHlwZSkpICE9IDApCisJCWVycm9yICgidmlydHVhbCBiYXNlY2xhc3MgYm90Y2giKTsKKwkgICAgICBWQUxVRV9MVkFMICh2MikgPSBsdmFsX21lbW9yeTsKKwkgICAgICBWQUxVRV9BRERSRVNTICh2MikgPSBiYXNlX2FkZHI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIFZBTFVFX0xWQUwgKHYyKSA9IFZBTFVFX0xWQUwgKGFyZzEpOworCSAgICAgIFZBTFVFX0FERFJFU1MgKHYyKSA9IFZBTFVFX0FERFJFU1MgKGFyZzEpOworCSAgICAgIFZBTFVFX09GRlNFVCAodjIpID0gVkFMVUVfT0ZGU0VUIChhcmcxKSArIGJvZmZzZXQ7CisJICAgICAgaWYgKFZBTFVFX0xBWlkgKGFyZzEpKQorCQlWQUxVRV9MQVpZICh2MikgPSAxOworCSAgICAgIGVsc2UKKwkJbWVtY3B5IChWQUxVRV9DT05URU5UU19SQVcgKHYyKSwKKwkJCVZBTFVFX0NPTlRFTlRTX1JBVyAoYXJnMSkgKyBib2Zmc2V0LAorCQkJVFlQRV9MRU5HVEggKGJhc2V0eXBlKSk7CisJICAgIH0KKworCSAgaWYgKGZvdW5kX2Jhc2VjbGFzcykKKwkgICAgcmV0dXJuIHYyOworCSAgdiA9IHNlYXJjaF9zdHJ1Y3RfZmllbGQgKG5hbWUsIHYyLCAwLCBUWVBFX0JBU0VDTEFTUyAodHlwZSwgaSksCisJCQkJICAgbG9va2luZ19mb3JfYmFzZWNsYXNzKTsKKwl9CisgICAgICBlbHNlIGlmIChmb3VuZF9iYXNlY2xhc3MpCisJdiA9IHZhbHVlX3ByaW1pdGl2ZV9maWVsZCAoYXJnMSwgb2Zmc2V0LCBpLCB0eXBlKTsKKyAgICAgIGVsc2UKKwl2ID0gc2VhcmNoX3N0cnVjdF9maWVsZCAobmFtZSwgYXJnMSwKKwkJCQkgb2Zmc2V0ICsgVFlQRV9CQVNFQ0xBU1NfQklUUE9TICh0eXBlLCBpKSAvIDgsCisJCQkJIGJhc2V0eXBlLCBsb29raW5nX2Zvcl9iYXNlY2xhc3MpOworICAgICAgaWYgKHYpIHJldHVybiB2OworICAgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKworLyogUmV0dXJuIHRoZSBvZmZzZXQgKGluIGJ5dGVzKSBvZiB0aGUgdmlydHVhbCBiYXNlIG9mIHR5cGUgQkFTRVRZUEUKKyAqIGluIGFuIG9iamVjdCBwb2ludGVkIHRvIGJ5IFZBTEFERFIgKG9uIHRoZSBob3N0KSwgYXNzdW1lZCB0byBiZSBvZgorICogdHlwZSBUWVBFLiAgT0ZGU0VUIGlzIG51bWJlciBvZiBieXRlcyBiZXlvbmQgc3RhcnQgb2YgQVJHIHRvIHN0YXJ0CisgKiBsb29raW5nIChpbiBjYXNlIFZBTEFERFIgaXMgdGhlIGNvbnRlbnRzIG9mIGFuIGVuY2xvc2luZyBvYmplY3QpLgorICoKKyAqIFRoaXMgcm91dGluZSByZWN1cnNlcyBvbiB0aGUgcHJpbWFyeSBiYXNlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIGJlY2F1c2UKKyAqIHRoZSB2aXJ0dWFsIGJhc2UgZW50cmllcyBvZiB0aGUgcHJpbWFyeSBiYXNlIGFwcGVhciBiZWZvcmUgdGhlIG90aGVyCisgKiB2aXJ0dWFsIGJhc2UgZW50cmllcy4KKyAqCisgKiBJZiB0aGUgdmlydHVhbCBiYXNlIGlzIG5vdCBmb3VuZCwgYSBuZWdhdGl2ZSBpbnRlZ2VyIGlzIHJldHVybmVkLgorICogVGhlIG1hZ25pdHVkZSBvZiB0aGUgbmVnYXRpdmUgaW50ZWdlciBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KKyAqIHRoZSB2aXJ0dWFsIHRhYmxlIHRvIHNraXAgb3ZlciAoZW50cmllcyBjb3JyZXNwb25kaW5nIHRvIHZhcmlvdXMKKyAqIGFuY2VzdHJhbCBjbGFzc2VzIGluIHRoZSBjaGFpbiBvZiBwcmltYXJ5IGJhc2VzKS4KKyAqCisgKiBJbXBvcnRhbnQ6IFRoaXMgYXNzdW1lcyB0aGUgSFAgLyBUYWxpZ2VudCBDKysgcnVudGltZQorICogY29udmVudGlvbnMuIFVzZSBiYXNlY2xhc3Nfb2Zmc2V0KCkgaW5zdGVhZCB0byBkZWFsIHdpdGggZysrCisgKiBjb252ZW50aW9ucy4gICovCisKK3ZvaWQKK2ZpbmRfcnRfdmJhc2Vfb2Zmc2V0KHR5cGUsIGJhc2V0eXBlLCB2YWxhZGRyLCBvZmZzZXQsIGJvZmZzZXRfcCwgc2tpcF9wKQorICBzdHJ1Y3QgdHlwZSAqIHR5cGU7CisgIHN0cnVjdCB0eXBlICogYmFzZXR5cGU7CisgIGNoYXIgKiB2YWxhZGRyOworICBpbnQgb2Zmc2V0OworICBpbnQgKiBib2Zmc2V0X3A7CisgIGludCAqIHNraXBfcDsKK3sKKyAgaW50IGJvZmZzZXQ7ICAgICAgICAgICAvKiBvZmZzZXQgb2YgdmlydHVhbCBiYXNlICovCisgIGludCBpbmRleDsgICAgICAgICAgICAgLyogZGlzcGxhY2VtZW50IHRvIHVzZSBpbiB2aXJ0dWFsIHRhYmxlICovCisgIGludCBza2lwOworICAKKyAgdmFsdWVfcHRyIHZwOyAgICAgIAorICBDT1JFX0FERFIgdnRibDsgICAgICAvKiB0aGUgdmlydHVhbCB0YWJsZSBwb2ludGVyICovCisgIHN0cnVjdCB0eXBlICogcGJjOyAgIC8qIHRoZSBwcmltYXJ5IGJhc2UgY2xhc3MgKi8KKworICAvKiBMb29rIGZvciB0aGUgdmlydHVhbCBiYXNlIHJlY3Vyc2l2ZWx5IGluIHRoZSBwcmltYXJ5IGJhc2UsIGZpcnN0LgorICAgKiBUaGlzIGlzIGJlY2F1c2UgdGhlIGRlcml2ZWQgY2xhc3Mgb2JqZWN0IGFuZCBpdHMgcHJpbWFyeSBiYXNlCisgICAqIHN1Ym9iamVjdCBzaGFyZSB0aGUgcHJpbWFyeSB2aXJ0dWFsIHRhYmxlLiAgKi8KKyAgCisgIGJvZmZzZXQgPSAwOworICBwYmMgPSBUWVBFX1BSSU1BUllfQkFTRSh0eXBlKTsKKyAgaWYgKHBiYykKKyAgICB7CisgICAgICBmaW5kX3J0X3ZiYXNlX29mZnNldCAocGJjLCBiYXNldHlwZSwgdmFsYWRkciwgb2Zmc2V0LCAmYm9mZnNldCwgJnNraXApOworICAgICAgaWYgKHNraXAgPCAwKQorICAgICAgICB7CisgICAgICAgICAgKmJvZmZzZXRfcCA9IGJvZmZzZXQ7CisgICAgICAgICAgKnNraXBfcCA9IC0xOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgZWxzZQorICAgIHNraXAgPSAwOworCisKKyAgLyogRmluZCB0aGUgaW5kZXggb2YgdGhlIHZpcnR1YWwgYmFzZSBhY2NvcmRpbmcgdG8gSFAvVGFsaWdlbnQKKyAgICAgcnVudGltZSBzcGVjLiAoRGVwdGgtZmlyc3QsIGxlZnQtdG8tcmlnaHQuKSAgKi8KKyAgaW5kZXggPSB2aXJ0dWFsX2Jhc2VfaW5kZXhfc2tpcF9wcmltYXJpZXMgKGJhc2V0eXBlLCB0eXBlKTsKKworICBpZiAoaW5kZXggPCAwKSB7CisgICAgKnNraXBfcCA9IHNraXAgKyB2aXJ0dWFsX2Jhc2VfbGlzdF9sZW5ndGhfc2tpcF9wcmltYXJpZXMgKHR5cGUpOworICAgICpib2Zmc2V0X3AgPSAwOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIHBhaTogRklYTUUgLS0gMzJ4NjQgcG9zc2libGUgcHJvYmxlbSAqLyAKKyAgLyogRmlyc3Qgd29yZCAoNCBieXRlcykgaW4gb2JqZWN0IGxheW91dCBpcyB0aGUgdnRhYmxlIHBvaW50ZXIgKi8KKyAgdnRibCA9ICogKENPUkVfQUREUiAqKSAodmFsYWRkciArIG9mZnNldCk7CisKKyAgLyogQmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBpcyBpbnZva2VkLCB0aGluZ3MgYXJlIHVzdWFsbHkgemVybydkIG91dC4gKi8gCisgIGlmICh2dGJsID09IDApCisgICAgZXJyb3IgKCJDb3VsZG4ndCBmaW5kIHZpcnR1YWwgdGFibGUgLS0gb2JqZWN0IG1heSBub3QgYmUgY29uc3RydWN0ZWQgeWV0LiIpOworCisKKyAgLyogRmluZCB2aXJ0dWFsIGJhc2UncyBvZmZzZXQgLS0ganVtcCBvdmVyIGVudHJpZXMgZm9yIHByaW1hcnkgYmFzZQorICAgKiBhbmNlc3RvcnMsIHRoZW4gdXNlIHRoZSBpbmRleCBjb21wdXRlZCBhYm92ZS4gIEJ1dCBhbHNvIGFkanVzdCBieQorICAgKiBIUF9BQ0NfVkJBU0VfU1RBUlQgZm9yIHRoZSB2dGFibGUgc2xvdHMgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUKKyAgICogdmlydHVhbCBiYXNlIGVudHJpZXMuICBPZmZzZXQgaXMgbmVnYXRpdmUgLS0gdmlydHVhbCBiYXNlIGVudHJpZXMKKyAgICogYXBwZWFyIF9iZWZvcmVfIHRoZSBhZGRyZXNzIHBvaW50IG9mIHRoZSB2aXJ0dWFsIHRhYmxlLiAqLworICAKKyAgLyogcGFpOiBGSVhNRSAtLSAzMng2NCBwcm9ibGVtLCBpZiB3b3JkID0gOCBieXRlcywgY2hhbmdlIG11bHRpcGxpZXIgCisgICAgICYgdXNlIGxvbmcgdHlwZSAqLyAKKworICAvKiBlcHN0ZWluIDogRklYTUUgLS0gYWRkZWQgcGFyYW0gZm9yIG92ZXJsYXkgc2VjdGlvbi4gTWF5IG5vdCBiZSBjb3JyZWN0ICovCisgICB2cCA9IHZhbHVlX2F0IChidWlsdGluX3R5cGVfaW50LCB2dGJsICsgNCAqICgtIHNraXAgLSBpbmRleCAtIEhQX0FDQ19WQkFTRV9TVEFSVCksIE5VTEwpOworICBib2Zmc2V0ID0gdmFsdWVfYXNfbG9uZyAodnApOworICAqc2tpcF9wID0gLTE7CisgICpib2Zmc2V0X3AgPSBib2Zmc2V0OworICByZXR1cm47Cit9CisKKworLyogSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgdmFsdWVfc3RydWN0X2VsdCB0byByZWN1cnNlIHRocm91Z2ggYmFzZWNsYXNzZXMuCisgICBMb29rIGZvciBhIGZpZWxkIE5BTUUgaW4gQVJHMS4gQWRqdXN0IHRoZSBhZGRyZXNzIG9mIEFSRzEgYnkgT0ZGU0VUIGJ5dGVzLAorICAgYW5kIHNlYXJjaCBpbiBpdCBhc3N1bWluZyBpdCBoYXMgKGNsYXNzKSB0eXBlIFRZUEUuCisgICBJZiBmb3VuZCwgcmV0dXJuIHZhbHVlLCBlbHNlIGlmIG5hbWUgbWF0Y2hlZCBhbmQgYXJncyBub3QgcmV0dXJuICh2YWx1ZSktMSwKKyAgIGVsc2UgcmV0dXJuIE5VTEwuICovCisKK3N0YXRpYyB2YWx1ZV9wdHIKK3NlYXJjaF9zdHJ1Y3RfbWV0aG9kIChuYW1lLCBhcmcxcCwgYXJncywgb2Zmc2V0LCBzdGF0aWNfbWVtZnVuY3AsIHR5cGUpCisgICAgIGNoYXIgKm5hbWU7CisgICAgIHJlZ2lzdGVyIHZhbHVlX3B0ciAqYXJnMXAsICphcmdzOworICAgICBpbnQgb2Zmc2V0LCAqc3RhdGljX21lbWZ1bmNwOworICAgICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgaW50IGk7CisgIHZhbHVlX3B0ciB2OworICBpbnQgbmFtZV9tYXRjaGVkID0gMDsKKyAgY2hhciBkZW1fb3BuYW1lWzY0XTsKKworICBDSEVDS19UWVBFREVGICh0eXBlKTsKKyAgZm9yIChpID0gVFlQRV9ORk5fRklFTERTICh0eXBlKSAtIDE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIGNoYXIgKnRfZmllbGRfbmFtZSA9IFRZUEVfRk5fRklFTERMSVNUX05BTUUgKHR5cGUsIGkpOworICAgICAgLyogRklYTUUhICBNYXkgbmVlZCB0byBjaGVjayBmb3IgQVJNIGRlbWFuZ2xpbmcgaGVyZSAqLworICAgICAgaWYgKHN0cm5jbXAodF9maWVsZF9uYW1lLCAiX18iLCAyKT09MCB8fAorCXN0cm5jbXAodF9maWVsZF9uYW1lLCAib3AiLCAyKT09MCB8fAorCXN0cm5jbXAodF9maWVsZF9uYW1lLCAidHlwZSIsIDQpPT0wICkKKwl7CisJICBpZiAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKHRfZmllbGRfbmFtZSwgZGVtX29wbmFtZSwgRE1HTF9BTlNJKSkKKwkgICAgdF9maWVsZF9uYW1lID0gZGVtX29wbmFtZTsKKwkgIGVsc2UgaWYgKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSh0X2ZpZWxkX25hbWUsIGRlbV9vcG5hbWUsIDApKQorCSAgICB0X2ZpZWxkX25hbWUgPSBkZW1fb3BuYW1lOyAKKwl9CisgICAgICBpZiAodF9maWVsZF9uYW1lICYmIFNUUkVRICh0X2ZpZWxkX25hbWUsIG5hbWUpKQorCXsKKwkgIGludCBqID0gVFlQRV9GTl9GSUVMRExJU1RfTEVOR1RIICh0eXBlLCBpKSAtIDE7CisJICBzdHJ1Y3QgZm5fZmllbGQgKmYgPSBUWVBFX0ZOX0ZJRUxETElTVDEgKHR5cGUsIGkpOworIAkgIG5hbWVfbWF0Y2hlZCA9IDE7IAorCisJICBpZiAoaiA+IDAgJiYgYXJncyA9PSAwKQorCSAgICBlcnJvciAoImNhbm5vdCByZXNvbHZlIG92ZXJsb2FkZWQgbWV0aG9kIGAlcyc6IG5vIGFyZ3VtZW50cyBzdXBwbGllZCIsIG5hbWUpOworCSAgd2hpbGUgKGogPj0gMCkKKwkgICAgeworCSAgICAgIGlmIChUWVBFX0ZOX0ZJRUxEX1NUVUIgKGYsIGopKQorCQljaGVja19zdHViX21ldGhvZCAodHlwZSwgaSwgaik7CisJICAgICAgaWYgKCF0eXBlY21wIChUWVBFX0ZOX0ZJRUxEX1NUQVRJQ19QIChmLCBqKSwKKwkJCSAgICBUWVBFX0ZOX0ZJRUxEX0FSR1MgKGYsIGopLCBhcmdzKSkKKwkJeworCQkgIGlmIChUWVBFX0ZOX0ZJRUxEX1ZJUlRVQUxfUCAoZiwgaikpCisJCSAgICByZXR1cm4gdmFsdWVfdmlydHVhbF9mbl9maWVsZCAoYXJnMXAsIGYsIGosIHR5cGUsIG9mZnNldCk7CisJCSAgaWYgKFRZUEVfRk5fRklFTERfU1RBVElDX1AgKGYsIGopICYmIHN0YXRpY19tZW1mdW5jcCkKKwkJICAgICpzdGF0aWNfbWVtZnVuY3AgPSAxOworCQkgIHYgPSB2YWx1ZV9mbl9maWVsZCAoYXJnMXAsIGYsIGosIHR5cGUsIG9mZnNldCk7CisJCSAgaWYgKHYgIT0gTlVMTCkgcmV0dXJuIHY7CisJCX0KKwkgICAgICBqLS07CisJICAgIH0KKwl9CisgICAgfQorCisgIGZvciAoaSA9IFRZUEVfTl9CQVNFQ0xBU1NFUyAodHlwZSkgLSAxOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBpbnQgYmFzZV9vZmZzZXQ7CisKKyAgICAgIGlmIChCQVNFVFlQRV9WSUFfVklSVFVBTCAodHlwZSwgaSkpCisJeworICAgICAgICAgaWYgKFRZUEVfSEFTX1ZUQUJMRSAodHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEhQIGFDQyBjb21waWxlZCB0eXBlLCBzZWFyY2ggZm9yIHZpcnR1YWwgYmFzZSBvZmZzZXQKKyAgICAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIEhQL1RhbGlnZW50IHJ1bnRpbWUgc3BlYy4gICovCisgICAgICAgICAgICAgIGludCBza2lwOworICAgICAgICAgICAgICBmaW5kX3J0X3ZiYXNlX29mZnNldCAodHlwZSwgVFlQRV9CQVNFQ0xBU1MgKHR5cGUsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfQ09OVEVOVFNfQUxMICgqYXJnMXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsgVkFMVUVfRU1CRURERURfT0ZGU0VUICgqYXJnMXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhc2Vfb2Zmc2V0LCAmc2tpcCk7CisgICAgICAgICAgICAgIGlmIChza2lwID49IDApCisgICAgICAgICAgICAgICAgZXJyb3IgKCJWaXJ0dWFsIGJhc2UgY2xhc3Mgb2Zmc2V0IG5vdCBmb3VuZCBpbiB2dGFibGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgeworICAgICAgICAgICAgIHN0cnVjdCB0eXBlICpiYXNlY2xhc3MgPSBjaGVja190eXBlZGVmIChUWVBFX0JBU0VDTEFTUyAodHlwZSwgaSkpOworCSAgICAgY2hhciAqYmFzZV92YWxhZGRyOworCisJICAgICAvKiBUaGUgdmlydHVhbCBiYXNlIGNsYXNzIHBvaW50ZXIgbWlnaHQgaGF2ZSBiZWVuIGNsb2JiZXJlZCBieSB0aGUKKwkgICAgICAgIHVzZXIgcHJvZ3JhbS4gTWFrZSBzdXJlIHRoYXQgaXQgc3RpbGwgcG9pbnRzIHRvIGEgdmFsaWQgbWVtb3J5CisJICAgICAgICBsb2NhdGlvbi4gICovCisKKwkgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBUWVBFX0xFTkdUSCAodHlwZSkpCisJICAgICAgIHsKKwkgICAgICAgICBiYXNlX3ZhbGFkZHIgPSAoY2hhciAqKSBhbGxvY2EgKFRZUEVfTEVOR1RIIChiYXNlY2xhc3MpKTsKKwkgICAgICAgICBpZiAodGFyZ2V0X3JlYWRfbWVtb3J5IChWQUxVRV9BRERSRVNTICgqYXJnMXApCisJCQkgCQkgKyBWQUxVRV9PRkZTRVQgKCphcmcxcCkgKyBvZmZzZXQsCisJCQkJICAgICAgICAgYmFzZV92YWxhZGRyLAorCQkJCSAgICAgICAgIFRZUEVfTEVOR1RIIChiYXNlY2xhc3MpKSAhPSAwKQorCQkgICBlcnJvciAoInZpcnR1YWwgYmFzZWNsYXNzIGJvdGNoIik7CisJICAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgICBiYXNlX3ZhbGFkZHIgPSBWQUxVRV9DT05URU5UUyAoKmFyZzFwKSArIG9mZnNldDsKKworCSAgICBiYXNlX29mZnNldCA9CisJICAgICAgIGJhc2VjbGFzc19vZmZzZXQgKHR5cGUsIGksIGJhc2VfdmFsYWRkciwKKwkJCSAgICAgICAgIFZBTFVFX0FERFJFU1MgKCphcmcxcCkKKwkJCQkgICArIFZBTFVFX09GRlNFVCAoKmFyZzFwKSArIG9mZnNldCk7CisJICAgIGlmIChiYXNlX29mZnNldCA9PSAtMSkKKwkgICAgICAgZXJyb3IgKCJ2aXJ0dWFsIGJhc2VjbGFzcyBib3RjaCIpOworCSAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorCXsKKwkgIGJhc2Vfb2Zmc2V0ID0gVFlQRV9CQVNFQ0xBU1NfQklUUE9TICh0eXBlLCBpKSAvIDg7CisgICAgICAgIH0KKyAgICAgIHYgPSBzZWFyY2hfc3RydWN0X21ldGhvZCAobmFtZSwgYXJnMXAsIGFyZ3MsIGJhc2Vfb2Zmc2V0ICsgb2Zmc2V0LAorCQkJCXN0YXRpY19tZW1mdW5jcCwgVFlQRV9CQVNFQ0xBU1MgKHR5cGUsIGkpKTsKKyAgICAgIGlmICh2ID09ICh2YWx1ZV9wdHIpIC0xKQorCXsKKwkgIG5hbWVfbWF0Y2hlZCA9IDE7CisJfQorICAgICAgZWxzZSBpZiAodikKKwl7CisvKiBGSVhNRS1ib3RobmVyOiAgV2h5IGlzIHRoaXMgY29tbWVudGVkIG91dD8gIFdoeSBpcyBpdCBoZXJlPyAgKi8KKy8qCSAgKmFyZzFwID0gYXJnMV90bXA7Ki8KKwkgIHJldHVybiB2OworICAgICAgICB9CisgICAgfQorICBpZiAobmFtZV9tYXRjaGVkKSByZXR1cm4gKHZhbHVlX3B0cikgLTE7CisgIGVsc2UgcmV0dXJuIE5VTEw7Cit9CisKKy8qIEdpdmVuICpBUkdQLCBhIHZhbHVlIG9mIHR5cGUgKHBvaW50ZXIgdG8gYSkqIHN0cnVjdHVyZS91bmlvbiwKKyAgIGV4dHJhY3QgdGhlIGNvbXBvbmVudCBuYW1lZCBOQU1FIGZyb20gdGhlIHVsdGltYXRlIHRhcmdldCBzdHJ1Y3R1cmUvdW5pb24KKyAgIGFuZCByZXR1cm4gaXQgYXMgYSB2YWx1ZSB3aXRoIGl0cyBhcHByb3ByaWF0ZSB0eXBlLgorICAgRVJSIGlzIHVzZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UgaWYgKkFSR1AncyB0eXBlIGlzIHdyb25nLgorCisgICBDKys6IEFSR1MgaXMgYSBsaXN0IG9mIGFyZ3VtZW50IHR5cGVzIHRvIGFpZCBpbiB0aGUgc2VsZWN0aW9uIG9mCisgICBhbiBhcHByb3ByaWF0ZSBtZXRob2QuIEFsc28sIGhhbmRsZSBkZXJpdmVkIHR5cGVzLgorCisgICBTVEFUSUNfTUVNRlVOQ1AsIGlmIG5vbi1OVUxMLCBwb2ludHMgdG8gYSBjYWxsZXItc3VwcGxpZWQgbG9jYXRpb24KKyAgIHdoZXJlIHRoZSB0cnV0aHZhbHVlIG9mIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIHRoYXQgd2FzIHJlc29sdmVkIHdhcworICAgYSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIG9yIG5vdCBpcyBzdG9yZWQuCisKKyAgIEVSUiBpcyBhbiBlcnJvciBtZXNzYWdlIHRvIGJlIHByaW50ZWQgaW4gY2FzZSB0aGUgZmllbGQgaXMgbm90IGZvdW5kLiAgKi8KKwordmFsdWVfcHRyCit2YWx1ZV9zdHJ1Y3RfZWx0IChhcmdwLCBhcmdzLCBuYW1lLCBzdGF0aWNfbWVtZnVuY3AsIGVycikKKyAgICAgcmVnaXN0ZXIgdmFsdWVfcHRyICphcmdwLCAqYXJnczsKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgaW50ICpzdGF0aWNfbWVtZnVuY3A7CisgICAgIGNoYXIgKmVycjsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKnQ7CisgIHZhbHVlX3B0ciB2OworCisgIENPRVJDRV9BUlJBWSAoKmFyZ3ApOworCisgIHQgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFICgqYXJncCkpOworCisgIC8qIEZvbGxvdyBwb2ludGVycyB1bnRpbCB3ZSBnZXQgdG8gYSBub24tcG9pbnRlci4gICovCisKKyAgd2hpbGUgKFRZUEVfQ09ERSAodCkgPT0gVFlQRV9DT0RFX1BUUiB8fCBUWVBFX0NPREUgKHQpID09IFRZUEVfQ09ERV9SRUYpCisgICAgeworICAgICAgKmFyZ3AgPSB2YWx1ZV9pbmQgKCphcmdwKTsKKyAgICAgIC8qIERvbid0IGNvZXJjZSBmbiBwb2ludGVyIHRvIGZuIGFuZCB0aGVuIGJhY2sgYWdhaW4hICAqLworICAgICAgaWYgKFRZUEVfQ09ERSAoVkFMVUVfVFlQRSAoKmFyZ3ApKSAhPSBUWVBFX0NPREVfRlVOQykKKwlDT0VSQ0VfQVJSQVkgKCphcmdwKTsKKyAgICAgIHQgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFICgqYXJncCkpOworICAgIH0KKworICBpZiAoVFlQRV9DT0RFICh0KSA9PSBUWVBFX0NPREVfTUVNQkVSKQorICAgIGVycm9yICgibm90IGltcGxlbWVudGVkOiBtZW1iZXIgdHlwZSBpbiB2YWx1ZV9zdHJ1Y3RfZWx0Iik7CisKKyAgaWYgKCAgIFRZUEVfQ09ERSAodCkgIT0gVFlQRV9DT0RFX1NUUlVDVAorICAgICAgJiYgVFlQRV9DT0RFICh0KSAhPSBUWVBFX0NPREVfVU5JT04pCisgICAgZXJyb3IgKCJBdHRlbXB0IHRvIGV4dHJhY3QgYSBjb21wb25lbnQgb2YgYSB2YWx1ZSB0aGF0IGlzIG5vdCBhICVzLiIsIGVycik7CisKKyAgLyogQXNzdW1lIGl0J3Mgbm90LCB1bmxlc3Mgd2Ugc2VlIHRoYXQgaXQgaXMuICAqLworICBpZiAoc3RhdGljX21lbWZ1bmNwKQorICAgICpzdGF0aWNfbWVtZnVuY3AgPTA7CisKKyAgaWYgKCFhcmdzKQorICAgIHsKKyAgICAgIC8qIGlmIHRoZXJlIGFyZSBubyBhcmd1bWVudHMgLi4uZG8gdGhpcy4uLiAgKi8KKworICAgICAgLyogVHJ5IGFzIGEgZmllbGQgZmlyc3QsIGJlY2F1c2UgaWYgd2Ugc3VjY2VlZCwgdGhlcmUKKwkgaXMgbGVzcyB3b3JrIHRvIGJlIGRvbmUuICAqLworICAgICAgdiA9IHNlYXJjaF9zdHJ1Y3RfZmllbGQgKG5hbWUsICphcmdwLCAwLCB0LCAwKTsKKyAgICAgIGlmICh2KQorCXJldHVybiB2OworCisgICAgICAvKiBDKys6IElmIGl0IHdhcyBub3QgZm91bmQgYXMgYSBkYXRhIGZpZWxkLCB0aGVuIHRyeSB0bworICAgICAgICAgcmV0dXJuIGl0IGFzIGEgcG9pbnRlciB0byBhIG1ldGhvZC4gICovCisKKyAgICAgIGlmIChkZXN0cnVjdG9yX25hbWVfcCAobmFtZSwgdCkpCisJZXJyb3IgKCJDYW5ub3QgZ2V0IHZhbHVlIG9mIGRlc3RydWN0b3IiKTsKKworICAgICAgdiA9IHNlYXJjaF9zdHJ1Y3RfbWV0aG9kIChuYW1lLCBhcmdwLCBhcmdzLCAwLCBzdGF0aWNfbWVtZnVuY3AsIHQpOworCisgICAgICBpZiAodiA9PSAodmFsdWVfcHRyKSAtMSkKKwllcnJvciAoIkNhbm5vdCB0YWtlIGFkZHJlc3Mgb2YgYSBtZXRob2QiKTsKKyAgICAgIGVsc2UgaWYgKHYgPT0gMCkKKwl7CisJICBpZiAoVFlQRV9ORk5fRklFTERTICh0KSkKKwkgICAgZXJyb3IgKCJUaGVyZSBpcyBubyBtZW1iZXIgb3IgbWV0aG9kIG5hbWVkICVzLiIsIG5hbWUpOworCSAgZWxzZQorCSAgICBlcnJvciAoIlRoZXJlIGlzIG5vIG1lbWJlciBuYW1lZCAlcy4iLCBuYW1lKTsKKwl9CisgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgaWYgKGRlc3RydWN0b3JfbmFtZV9wIChuYW1lLCB0KSkKKyAgICB7CisgICAgICBpZiAoIWFyZ3NbMV0pCisJeworCSAgLyogRGVzdHJ1Y3RvcnMgYXJlIGEgc3BlY2lhbCBjYXNlLiAgKi8KKwkgIGludCBtX2luZGV4LCBmX2luZGV4OworCisJICB2ID0gTlVMTDsKKwkgIGlmIChnZXRfZGVzdHJ1Y3Rvcl9mbl9maWVsZCAodCwgJm1faW5kZXgsICZmX2luZGV4KSkKKwkgICAgeworCSAgICAgIHYgPSB2YWx1ZV9mbl9maWVsZCAoTlVMTCwgVFlQRV9GTl9GSUVMRExJU1QxICh0LCBtX2luZGV4KSwKKwkJCQkgIGZfaW5kZXgsIE5VTEwsIDApOworCSAgICB9CisJICBpZiAodiA9PSBOVUxMKQorCSAgICBlcnJvciAoImNvdWxkIG5vdCBmaW5kIGRlc3RydWN0b3IgZnVuY3Rpb24gbmFtZWQgJXMuIiwgbmFtZSk7CisJICBlbHNlCisJICAgIHJldHVybiB2OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBlcnJvciAoImRlc3RydWN0b3Igc2hvdWxkIG5vdCBoYXZlIGFueSBhcmd1bWVudCIpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB2ID0gc2VhcmNoX3N0cnVjdF9tZXRob2QgKG5hbWUsIGFyZ3AsIGFyZ3MsIDAsIHN0YXRpY19tZW1mdW5jcCwgdCk7CisKKyAgaWYgKHYgPT0gKHZhbHVlX3B0cikgLTEpCisgICAgeworCWVycm9yKCJBcmd1bWVudCBsaXN0IG9mICVzIG1pc21hdGNoIHdpdGggY29tcG9uZW50IGluIHRoZSBzdHJ1Y3R1cmUuIiwgbmFtZSk7CisgICAgfQorICBlbHNlIGlmICh2ID09IDApCisgICAgeworICAgICAgLyogU2VlIGlmIHVzZXIgdHJpZWQgdG8gaW52b2tlIGRhdGEgYXMgZnVuY3Rpb24uICBJZiBzbywKKwkgaGFuZCBpdCBiYWNrLiAgSWYgaXQncyBub3QgY2FsbGFibGUgKGkuZS4sIGEgcG9pbnRlciB0byBmdW5jdGlvbiksCisJIGdkYiBzaG91bGQgZ2l2ZSBhbiBlcnJvci4gICovCisgICAgICB2ID0gc2VhcmNoX3N0cnVjdF9maWVsZCAobmFtZSwgKmFyZ3AsIDAsIHQsIDApOworICAgIH0KKworICBpZiAoIXYpCisgICAgZXJyb3IgKCJTdHJ1Y3R1cmUgaGFzIG5vIGNvbXBvbmVudCBuYW1lZCAlcy4iLCBuYW1lKTsKKyAgcmV0dXJuIHY7Cit9CisKKy8qIFNlYXJjaCB0aHJvdWdoIHRoZSBtZXRob2RzIG9mIGFuIG9iamVjdCAoYW5kIGl0cyBiYXNlcykKKyAqIHRvIGZpbmQgYSBzcGVjaWZpZWQgbWV0aG9kLiBSZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlCisgKiBmbl9maWVsZCBsaXN0IG9mIG92ZXJsb2FkZWQgaW5zdGFuY2VzLgorICogSGVscGVyIGZ1bmN0aW9uIGZvciB2YWx1ZV9maW5kX29sb2FkX2xpc3QuCisgKiBBUkdQIGlzIGEgcG9pbnRlciB0byBhIHBvaW50ZXIgdG8gYSB2YWx1ZSAodGhlIG9iamVjdCkKKyAqIE1FVEhPRCBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBtZXRob2QgbmFtZQorICogT0ZGU0VUIGlzIHRoZSBvZmZzZXQgd2l0aGluIHRoZSB2YWx1ZQorICogU1RBVElDX01FTUZVTkNQIGlzIHNldCBpZiB0aGUgbWV0aG9kIGlzIHN0YXRpYworICogVFlQRSBpcyB0aGUgYXNzdW1lZCB0eXBlIG9mIHRoZSBvYmplY3QKKyAqIE5VTV9GTlMgaXMgdGhlIG51bWJlciBvZiBvdmVybG9hZGVkIGluc3RhbmNlcworICogQkFTRVRZUEUgaXMgc2V0IHRvIHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUgc3Vib2JqZWN0IHdoZXJlIHRoZSBtZXRob2QgaXMgZm91bmQKKyAqIEJPRkZTRVQgaXMgdGhlIG9mZnNldCBvZiB0aGUgYmFzZSBzdWJvYmplY3Qgd2hlcmUgdGhlIG1ldGhvZCBpcyBmb3VuZCAqLworCitzdHJ1Y3QgZm5fZmllbGQgKgorZmluZF9tZXRob2RfbGlzdCAoYXJncCwgbWV0aG9kLCBvZmZzZXQsIHN0YXRpY19tZW1mdW5jcCwgdHlwZSwgbnVtX2ZucywgYmFzZXR5cGUsIGJvZmZzZXQpCisgIHZhbHVlX3B0ciAqYXJncDsKKyAgY2hhciAqIG1ldGhvZDsKKyAgaW50IG9mZnNldDsKKyAgaW50ICogc3RhdGljX21lbWZ1bmNwOworICBzdHJ1Y3QgdHlwZSAqIHR5cGU7CisgIGludCAqIG51bV9mbnM7CisgIHN0cnVjdCB0eXBlICoqIGJhc2V0eXBlOworICBpbnQgKiBib2Zmc2V0OworeworICBpbnQgaTsKKyAgc3RydWN0IGZuX2ZpZWxkICogZjsKKyAgQ0hFQ0tfVFlQRURFRiAodHlwZSk7CisKKyAgKm51bV9mbnMgPSAwOworCisgIC8qIEZpcnN0IGNoZWNrIGluIG9iamVjdCBpdHNlbGYgKi8gCisgIGZvciAoaSA9IFRZUEVfTkZOX0ZJRUxEUyAodHlwZSkgLTE7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgIC8qIHBhaTogRklYTUUgV2hhdCBhYm91dCBvcGVyYXRvcnMgYW5kIHR5cGUgY29udmVyc2lvbnM/ICovCisgICAgICBjaGFyICogZm5fZmllbGRfbmFtZSA9IFRZUEVfRk5fRklFTERMSVNUX05BTUUgKHR5cGUsIGkpOworICAgICAgaWYgKGZuX2ZpZWxkX25hbWUgJiYgU1RSRVEgKGZuX2ZpZWxkX25hbWUsIG1ldGhvZCkpCisgICAgICAgIHsKKyAgICAgICAgICAqbnVtX2ZucyA9IFRZUEVfRk5fRklFTERMSVNUX0xFTkdUSCAodHlwZSwgaSk7CisgICAgICAgICAgKmJhc2V0eXBlID0gdHlwZTsKKyAgICAgICAgICAqYm9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgICByZXR1cm4gVFlQRV9GTl9GSUVMRExJU1QxICh0eXBlLCBpKTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgIC8qIE5vdCBmb3VuZCBpbiBvYmplY3QsIGNoZWNrIGluIGJhc2Ugc3Vib2JqZWN0cyAqLworICBmb3IgKGkgPSBUWVBFX05fQkFTRUNMQVNTRVMgKHR5cGUpIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgeworICAgICAgaW50IGJhc2Vfb2Zmc2V0OworICAgICAgaWYgKEJBU0VUWVBFX1ZJQV9WSVJUVUFMICh0eXBlLCBpKSkKKwl7CisgICAgICAgICAgaWYgKFRZUEVfSEFTX1ZUQUJMRSAodHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIEhQIGFDQyBjb21waWxlZCB0eXBlLCBzZWFyY2ggZm9yIHZpcnR1YWwgYmFzZSBvZmZzZXQKKyAgICAgICAgICAgICAgICogYWNjb3JkaW5nIHRvIEhQL1RhbGlnZW50IHJ1bnRpbWUgc3BlYy4gICovCisgICAgICAgICAgICAgIGludCBza2lwOworICAgICAgICAgICAgICBmaW5kX3J0X3ZiYXNlX29mZnNldCAodHlwZSwgVFlQRV9CQVNFQ0xBU1MgKHR5cGUsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfQ09OVEVOVFNfQUxMICgqYXJncCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKyBWQUxVRV9FTUJFRERFRF9PRkZTRVQgKCphcmdwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYXNlX29mZnNldCwgJnNraXApOworICAgICAgICAgICAgICBpZiAoc2tpcCA+PSAwKQorICAgICAgICAgICAgICAgIGVycm9yICgiVmlydHVhbCBiYXNlIGNsYXNzIG9mZnNldCBub3QgZm91bmQgaW4gdnRhYmxlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBwcm9iYWJseSBnKysgcnVudGltZSBtb2RlbCAqLyAKKyAgICAgICAgICAgICAgYmFzZV9vZmZzZXQgPSBWQUxVRV9PRkZTRVQgKCphcmdwKSArIG9mZnNldDsKKyAgICAgICAgICAgICAgYmFzZV9vZmZzZXQgPQorICAgICAgICAgICAgICAgIGJhc2VjbGFzc19vZmZzZXQgKHR5cGUsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfQ09OVEVOVFMgKCphcmdwKSArIGJhc2Vfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX0FERFJFU1MgKCphcmdwKSArIGJhc2Vfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgaWYgKGJhc2Vfb2Zmc2V0ID09IC0xKQorICAgICAgICAgICAgICAgIGVycm9yICgidmlydHVhbCBiYXNlY2xhc3MgYm90Y2giKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSAvKiBub24tdmlydHVhbCBiYXNlLCBzaW1wbHkgdXNlIGJpdCBwb3NpdGlvbiBmcm9tIGRlYnVnIGluZm8gKi8KKwl7CisJICBiYXNlX29mZnNldCA9IFRZUEVfQkFTRUNMQVNTX0JJVFBPUyAodHlwZSwgaSkgLyA4OworICAgICAgICB9CisgICAgICBmID0gZmluZF9tZXRob2RfbGlzdCAoYXJncCwgbWV0aG9kLCBiYXNlX29mZnNldCArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfbWVtZnVuY3AsIFRZUEVfQkFTRUNMQVNTICh0eXBlLCBpKSwgbnVtX2ZucywgYmFzZXR5cGUsIGJvZmZzZXQpOworICAgICAgaWYgKGYpCisgICAgICAgIHJldHVybiBmOworICAgIH0KKyAgcmV0dXJuIE5VTEw7ICAKK30KKworLyogUmV0dXJuIHRoZSBsaXN0IG9mIG92ZXJsb2FkZWQgbWV0aG9kcyBvZiBhIHNwZWNpZmllZCBuYW1lLgorICogQVJHUCBpcyBhIHBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIGEgdmFsdWUgKHRoZSBvYmplY3QpCisgKiBNRVRIT0QgaXMgdGhlIG1ldGhvZCBuYW1lCisgKiBPRkZTRVQgaXMgdGhlIG9mZnNldCB3aXRoaW4gdGhlIHZhbHVlIGNvbnRlbnRzCisgKiBTVEFUSUNfTUVNRlVOQ1AgaXMgc2V0IGlmIHRoZSBtZXRob2QgaXMgc3RhdGljCisgKiBOVU1fRk5TIGlzIHRoZSBudW1iZXIgb2Ygb3ZlcmxvYWRlZCBpbnN0YW5jZXMKKyAqIEJBU0VUWVBFIGlzIHNldCB0byB0aGUgdHlwZSBvZiB0aGUgYmFzZSBzdWJvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBtZXRob2QKKyAqIEJPRkZTRVQgaXMgdGhlIG9mZnNldCBvZiB0aGUgYmFzZSBzdWJvYmplY3Qgd2hpY2ggZGVmaW5lcyB0aGUgbWV0aG9kICovCisKK3N0cnVjdCBmbl9maWVsZCAqCit2YWx1ZV9maW5kX29sb2FkX21ldGhvZF9saXN0IChhcmdwLCBtZXRob2QsIG9mZnNldCwgc3RhdGljX21lbWZ1bmNwLCBudW1fZm5zLCBiYXNldHlwZSwgYm9mZnNldCkKKyAgdmFsdWVfcHRyICphcmdwOworICBjaGFyICogbWV0aG9kOworICBpbnQgb2Zmc2V0OworICBpbnQgKiBzdGF0aWNfbWVtZnVuY3A7CisgIGludCAqIG51bV9mbnM7CisgIHN0cnVjdCB0eXBlICoqIGJhc2V0eXBlOworICBpbnQgKiBib2Zmc2V0OworeworICBzdHJ1Y3QgdHlwZSAqIHQ7CisgIHZhbHVlX3B0ciB2OworCisgIHQgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFICgqYXJncCkpOworCisgIC8qIGNvZGUgc25hcmZlZCBmcm9tIHZhbHVlX3N0cnVjdF9lbHQgKi8gCisgIHdoaWxlIChUWVBFX0NPREUgKHQpID09IFRZUEVfQ09ERV9QVFIgfHwgVFlQRV9DT0RFICh0KSA9PSBUWVBFX0NPREVfUkVGKQorICAgIHsKKyAgICAgICphcmdwID0gdmFsdWVfaW5kICgqYXJncCk7CisgICAgICAvKiBEb24ndCBjb2VyY2UgZm4gcG9pbnRlciB0byBmbiBhbmQgdGhlbiBiYWNrIGFnYWluISAgKi8KKyAgICAgIGlmIChUWVBFX0NPREUgKFZBTFVFX1RZUEUgKCphcmdwKSkgIT0gVFlQRV9DT0RFX0ZVTkMpCisJQ09FUkNFX0FSUkFZICgqYXJncCk7CisgICAgICB0ID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoKmFyZ3ApKTsKKyAgICB9CisgIAorICBpZiAoVFlQRV9DT0RFICh0KSA9PSBUWVBFX0NPREVfTUVNQkVSKQorICAgIGVycm9yICgiTm90IGltcGxlbWVudGVkOiBtZW1iZXIgdHlwZSBpbiB2YWx1ZV9maW5kX29sb2FkX2xpcyIpOworICAKKyAgaWYgKCAgIFRZUEVfQ09ERSAodCkgIT0gVFlQRV9DT0RFX1NUUlVDVAorICAgICAgICAgJiYgVFlQRV9DT0RFICh0KSAhPSBUWVBFX0NPREVfVU5JT04pCisgICAgZXJyb3IgKCJBdHRlbXB0IHRvIGV4dHJhY3QgYSBjb21wb25lbnQgb2YgYSB2YWx1ZSB0aGF0IGlzIG5vdCBhIHN0cnVjdCBvciB1bmlvbiIpOworICAKKyAgLyogQXNzdW1lIGl0J3Mgbm90IHN0YXRpYywgdW5sZXNzIHdlIHNlZSB0aGF0IGl0IGlzLiAgKi8KKyAgaWYgKHN0YXRpY19tZW1mdW5jcCkKKyAgICAqc3RhdGljX21lbWZ1bmNwID0wOworCisgIHJldHVybiBmaW5kX21ldGhvZF9saXN0IChhcmdwLCBtZXRob2QsIDAsIHN0YXRpY19tZW1mdW5jcCwgdCwgbnVtX2ZucywgYmFzZXR5cGUsIGJvZmZzZXQpOworICAKK30KKworLyogR2l2ZW4gYW4gYXJyYXkgb2YgYXJndW1lbnQgdHlwZXMgKEFSR1RZUEVTKSAod2hpY2ggaW5jbHVkZXMgYW4KKyAgIGVudHJ5IGZvciAidGhpcyIgaW4gdGhlIGNhc2Ugb2YgQysrIG1ldGhvZHMpLCB0aGUgbnVtYmVyIG9mCisgICBhcmd1bWVudHMgTkFSR1MsIHRoZSBOQU1FIG9mIGEgZnVuY3Rpb24gd2hldGhlciBpdCdzIGEgbWV0aG9kIG9yCisgICBub3QgKE1FVEhPRCksIGFuZCB0aGUgZGVncmVlIG9mIGxheG5lc3MgKExBWCkgaW4gY29uZm9ybWluZyB0bworICAgb3ZlcmxvYWQgcmVzb2x1dGlvbiBydWxlcyBpbiBBTlNJIEMrKywgZmluZCB0aGUgYmVzdCBmdW5jdGlvbiB0aGF0CisgICBtYXRjaGVzIG9uIHRoZSBhcmd1bWVudCB0eXBlcyBhY2NvcmRpbmcgdG8gdGhlIG92ZXJsb2FkIHJlc29sdXRpb24KKyAgIHJ1bGVzLgorCisgICBJbiB0aGUgY2FzZSBvZiBjbGFzcyBtZXRob2RzLCB0aGUgcGFyYW1ldGVyIE9CSiBpcyBhbiBvYmplY3QgdmFsdWUKKyAgIGluIHdoaWNoIHRvIHNlYXJjaCBmb3Igb3ZlcmxvYWRlZCBtZXRob2RzLgorCisgICBJbiB0aGUgY2FzZSBvZiBub24tbWV0aG9kIGZ1bmN0aW9ucywgdGhlIHBhcmFtZXRlciBGU1lNIGlzIGEgc3ltYm9sCisgICBjb3JyZXNwb25kaW5nIHRvIG9uZSBvZiB0aGUgb3ZlcmxvYWRlZCBmdW5jdGlvbnMuCisKKyAgIFJldHVybiB2YWx1ZSBpcyBhbiBpbnRlZ2VyOiAwIC0+IGdvb2QgbWF0Y2gsIDEwIC0+IGRlYnVnZ2VyIGFwcGxpZWQKKyAgIG5vbi1zdGFuZGFyZCBjb2VyY2lvbnMsIDEwMCAtPiBpbmNvbXBhdGlibGUuCisKKyAgIElmIGEgbWV0aG9kIGlzIGJlaW5nIHNlYXJjaGVkIGZvciwgVkFMUCB3aWxsIGhvbGQgdGhlIHZhbHVlLgorICAgSWYgYSBub24tbWV0aG9kIGlzIGJlaW5nIHNlYXJjaGVkIGZvciwgU1lNUCB3aWxsIGhvbGQgdGhlIHN5bWJvbCBmb3IgaXQuCisKKyAgIElmIGEgbWV0aG9kIGlzIGJlaW5nIHNlYXJjaGVkIGZvciwgYW5kIGl0IGlzIGEgc3RhdGljIG1ldGhvZCwKKyAgIHRoZW4gU1RBVElDUCB3aWxsIHBvaW50IHRvIGEgbm9uLXplcm8gdmFsdWUuCisKKyAgIE5vdGU6IFRoaXMgZnVuY3Rpb24gZG9lcyAqbm90KiBjaGVjayB0aGUgdmFsdWUgb2YKKyAgIG92ZXJsb2FkX3Jlc29sdXRpb24uICBDYWxsZXIgbXVzdCBjaGVjayBpdCB0byBzZWUgd2hldGhlciBvdmVybG9hZAorICAgcmVzb2x1dGlvbiBpcyBwZXJtaXR0ZWQuCisgICAqLworCitpbnQKK2ZpbmRfb3ZlcmxvYWRfbWF0Y2ggKGFyZ190eXBlcywgbmFyZ3MsIG5hbWUsIG1ldGhvZCwgbGF4LCBvYmosIGZzeW0sIHZhbHAsIHN5bXAsIHN0YXRpY3ApCisgIHN0cnVjdCB0eXBlICoqIGFyZ190eXBlczsKKyAgaW50IG5hcmdzOworICBjaGFyICogbmFtZTsKKyAgaW50IG1ldGhvZDsKKyAgaW50IGxheDsKKyAgdmFsdWVfcHRyIG9iajsKKyAgc3RydWN0IHN5bWJvbCAqIGZzeW07CisgIHZhbHVlX3B0ciAqIHZhbHA7CisgIHN0cnVjdCBzeW1ib2wgKiogc3ltcDsKKyAgaW50ICogc3RhdGljcDsKK3sKKyAgaW50IG5wYXJtczsKKyAgc3RydWN0IHR5cGUgKiogcGFybV90eXBlczsKKyAgaW50IGNoYW1wX25wYXJtcyA9IDA7CisgIAorICBzaG9ydCBvbG9hZF9jaGFtcCA9IC0xOyAgICAgICAgICAvKiBJbmRleCBvZiBiZXN0IG92ZXJsb2FkZWQgZnVuY3Rpb24gKi8KKyAgc2hvcnQgb2xvYWRfYW1iaWd1b3VzID0gMDsgICAgICAgLyogQ3VycmVudCBhbWJpZ3VpdHkgc3RhdGUgZm9yIG92ZXJsb2FkIHJlc29sdXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCA9PiBubyBhbWJpZ3VpdHksIDEgPT4gdHdvIGdvb2QgZnVuY3MsIDIgPT4gaW5jb21wYXJhYmxlIGZ1bmNzICovCisgIHNob3J0IG9sb2FkX2FtYmlnX2NoYW1wID0gLTE7ICAgIC8qIDJuZCBjb250ZW5kZXIgZm9yIGJlc3QgbWF0Y2ggKi8gCisgIHNob3J0IG9sb2FkX25vbl9zdGFuZGFyZCA9IDA7ICAgIC8qIGRpZCB3ZSBoYXZlIHRvIHVzZSBub24tc3RhbmRhcmQgY29udmVyc2lvbnM/ICovIAorICBzaG9ydCBvbG9hZF9pbmNvbXBhdGlibGUgPSAwOyAgICAvKiBhcmUgYXJncyBzdXBwbGllZCBpbmNvbXBhdGlibGUgd2l0aCBhbnkgZnVuY3Rpb24/ICovCisgIAorICBzdHJ1Y3QgYmFkbmVzc192ZWN0b3IgKiBidjsgICAgICAvKiBBIG1lYXN1cmUgb2YgaG93IGdvb2QgYW4gb3ZlcmxvYWRlZCBpbnN0YW5jZSBpcyAqLyAKKyAgc3RydWN0IGJhZG5lc3NfdmVjdG9yICogb2xvYWRfY2hhbXBfYnYgPSBOVUxMOyAvKiBUaGUgbWVhc3VyZSBmb3IgdGhlIGN1cnJlbnQgYmVzdCBtYXRjaCAqLyAKKyAgCisgIHZhbHVlX3B0ciB0ZW1wID0gb2JqOworICBzdHJ1Y3QgZm5fZmllbGQgKiBmbnNfcHRyID0gTlVMTDsgICAvKiBGb3IgbWV0aG9kcywgdGhlIGxpc3Qgb2Ygb3ZlcmxvYWRlZCBtZXRob2RzICovIAorICBzdHJ1Y3Qgc3ltYm9sICoqIG9sb2FkX3N5bXMgPSBOVUxMOyAvKiBGb3Igbm9uLW1ldGhvZHMsIHRoZSBsaXN0IG9mIG92ZXJsb2FkZWQgZnVuY3Rpb24gc3ltYm9scyAqLworICBpbnQgbnVtX2ZucyA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygb3ZlcmxvYWRlZCBpbnN0YW5jZXMgYmVpbmcgY29uc2lkZXJlZCAqLyAKKyAgc3RydWN0IHR5cGUgKiBiYXNldHlwZSA9IE5VTEw7ICAgCisgIGludCBib2Zmc2V0OworICByZWdpc3RlciBpbnQgamo7CisgIHJlZ2lzdGVyIGludCBpeDsKKworICBjaGFyICogb2JqX3R5cGVfbmFtZSA9IE5VTEw7CisgIGNoYXIgKiBmdW5jX25hbWUgPSBOVUxMOworCisgIC8qIEdldCB0aGUgbGlzdCBvZiBvdmVybG9hZGVkIG1ldGhvZHMgb3IgZnVuY3Rpb25zICovCisgIGlmIChtZXRob2QpCisgICAgeworICAgICAgb2JqX3R5cGVfbmFtZSA9IFRZUEVfTkFNRSAoVkFMVUVfVFlQRSAob2JqKSk7CisgICAgICAvKiBIYWNrOiBldmFsdWF0ZV9zdWJleHBfc3RhbmRhcmQgb2Z0ZW4gcGFzc2VzIGluIGEgcG9pbnRlcgorICAgICAgICAgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIG9iamVjdCBpdHNlbGYsIHNvIHRyeSBhZ2FpbiAqLworICAgICAgaWYgKCghb2JqX3R5cGVfbmFtZSB8fCAhKm9ial90eXBlX25hbWUpICYmCisgICAgICAgICAgKFRZUEVfQ09ERSAoVkFMVUVfVFlQRSAob2JqKSkgPT0gVFlQRV9DT0RFX1BUUikpCisgICAgICAgIG9ial90eXBlX25hbWUgPSBUWVBFX05BTUUgKFRZUEVfVEFSR0VUX1RZUEUgKFZBTFVFX1RZUEUgKG9iaikpKTsKKworICAgICAgZm5zX3B0ciA9IHZhbHVlX2ZpbmRfb2xvYWRfbWV0aG9kX2xpc3QgKCZ0ZW1wLCBuYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bV9mbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhc2V0eXBlLCAmYm9mZnNldCk7CisgICAgICBpZiAoIWZuc19wdHIgfHwgIW51bV9mbnMpCisgICAgICAgIGVycm9yICgiQ291bGRuJ3QgZmluZCBtZXRob2QgJXMlcyVzIiwKKyAgICAgICAgICAgICAgIG9ial90eXBlX25hbWUsCisgICAgICAgICAgICAgICAob2JqX3R5cGVfbmFtZSAmJiAqb2JqX3R5cGVfbmFtZSkgPyAiOjoiIDogIiIsCisgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgaSA9IC0xOworICAgICAgZnVuY19uYW1lID0gY3BsdXNfZGVtYW5nbGUgKFNZTUJPTF9OQU1FIChmc3ltKSwgRE1HTF9OT19PUFRTKTsKKworICAgICAgb2xvYWRfc3ltcyA9IG1ha2Vfc3ltYm9sX292ZXJsb2FkX2xpc3QgKGZzeW0pOworICAgICAgd2hpbGUgKG9sb2FkX3N5bXNbKytpXSkKKyAgICAgICAgbnVtX2ZucysrOworICAgICAgaWYgKCFudW1fZm5zKQorICAgICAgICBlcnJvciAoIkNvdWxkbid0IGZpbmQgZnVuY3Rpb24gJXMiLCBmdW5jX25hbWUpOworICAgIH0KKyAgCisgIG9sb2FkX2NoYW1wX2J2ID0gTlVMTDsKKworICAvKiBDb25zaWRlciBlYWNoIGNhbmRpZGF0ZSBpbiB0dXJuICovIAorICBmb3IgKGl4ID0gMDsgaXggPCBudW1fZm5zOyBpeCsrKQorICAgIHsKKyAgICAgIGludCBqajsKKworICAgICAgLyogTnVtYmVyIG9mIHBhcmFtZXRlcnMgZm9yIGN1cnJlbnQgY2FuZGlkYXRlICovIAorICAgICAgbnBhcm1zID0gbWV0aG9kID8gVFlQRV9ORklFTERTIChmbnNfcHRyW2l4XS50eXBlKQorICAgICAgICAgICAgICAgICAgICAgIDogVFlQRV9ORklFTERTIChTWU1CT0xfVFlQRSAob2xvYWRfc3ltc1tpeF0pKTsKKworICAgICAgLyogUHJlcGFyZSBhcnJheSBvZiBwYXJhbWV0ZXIgdHlwZXMgKi8gCisgICAgICBwYXJtX3R5cGVzID0gKHN0cnVjdCB0eXBlICoqKSB4bWFsbG9jIChucGFybXMgKiAoc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSkpOworICAgICAgZm9yIChqaiA9IDA7IGpqIDwgbnBhcm1zOyBqaisrKQorICAgICAgICBwYXJtX3R5cGVzW2pqXSA9IG1ldGhvZCA/IFRZUEVfRklFTERfVFlQRSAoZm5zX3B0cltpeF0udHlwZSwgamopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVFlQRV9GSUVMRF9UWVBFIChTWU1CT0xfVFlQRSAob2xvYWRfc3ltc1tpeF0pLCBqaik7CisKKyAgICAgIC8qIENvbXBhcmUgcGFyYW1ldGVyIHR5cGVzIHRvIHN1cHBsaWVkIGFyZ3VtZW50IHR5cGVzICovCisgICAgICBidiA9IHJhbmtfZnVuY3Rpb24gKHBhcm1fdHlwZXMsIG5wYXJtcywgYXJnX3R5cGVzLCBuYXJncyk7CisgICAgICAKKyAgICAgIGlmICghb2xvYWRfY2hhbXBfYnYpCisgICAgICAgIHsKKyAgICAgICAgICBvbG9hZF9jaGFtcF9idiA9IGJ2OworICAgICAgICAgIG9sb2FkX2NoYW1wID0gMDsKKyAgICAgICAgICBjaGFtcF9ucGFybXMgPSBucGFybXM7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgLyogU2VlIHdoZXRoZXIgY3VycmVudCBjYW5kaWRhdGUgaXMgYmV0dGVyIG9yIHdvcnNlIHRoYW4gcHJldmlvdXMgYmVzdCAqLyAKKyAgICAgICAgc3dpdGNoIChjb21wYXJlX2JhZG5lc3MgKGJ2LCBvbG9hZF9jaGFtcF9idikpCisgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICBvbG9hZF9hbWJpZ3VvdXMgPSAxOyAgICAvKiB0b3AgdHdvIGNvbnRlbmRlcnMgYXJlIGVxdWFsbHkgZ29vZCAqLyAKKyAgICAgICAgICAgICAgb2xvYWRfYW1iaWdfY2hhbXAgPSBpeDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgIG9sb2FkX2FtYmlndW91cyA9IDI7ICAgIC8qIGluY29tcGFyYWJsZSB0b3AgY29udGVuZGVycyAqLyAKKyAgICAgICAgICAgICAgb2xvYWRfYW1iaWdfY2hhbXAgPSBpeDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgIG9sb2FkX2NoYW1wX2J2ID0gYnY7ICAgIC8qIG5ldyBjaGFtcGlvbiwgcmVjb3JkIGRldGFpbHMgKi8gCisgICAgICAgICAgICAgIG9sb2FkX2FtYmlndW91cyA9IDA7CisgICAgICAgICAgICAgIG9sb2FkX2NoYW1wID0gaXg7CisgICAgICAgICAgICAgIG9sb2FkX2FtYmlnX2NoYW1wID0gLTE7CisgICAgICAgICAgICAgIGNoYW1wX25wYXJtcyA9IG5wYXJtczsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICBmcmVlIChwYXJtX3R5cGVzKTsKKyNpZmRlZiBERUJVR19PTE9BRAorICAgICAgaWYgKG1ldGhvZCkKKyAgICAgICAgcHJpbnRmKCJPdmVybG9hZGVkIG1ldGhvZCBpbnN0YW5jZSAlcywgIyBvZiBwYXJtcyAlZFxuIiwgZm5zX3B0cltpeF0ucGh5c25hbWUsIG5wYXJtcyk7CisgICAgICBlbHNlCisgICAgICAgIHByaW50ZigiT3ZlcmxvYWRlZCBmdW5jdGlvbiBpbnN0YW5jZSAlcyAjIG9mIHBhcm1zICVkXG4iLCBTWU1CT0xfREVNQU5HTEVEX05BTUUob2xvYWRfc3ltc1tpeF0pLG5wYXJtcyk7IAorICAgICAgZm9yIChqaiA9IDA7IGpqIDw9IG5hcmdzOyBqaisrKQorICAgICAgICBwcmludGYoIi4uLkJhZG5lc3MgQCAlZCA6ICVkXG4iLCBqaiwgYnYtPnJhbmtbampdKTsKKyAgICAgIHByaW50ZigiT3ZlcmxvYWQgcmVzb2x1dGlvbiBjaGFtcGlvbiBpcyAlZCwgYW1iaWd1b3VzPyAlZFxuIiwgb2xvYWRfY2hhbXAsIG9sb2FkX2FtYmlndW91cyk7CisjZW5kaWYKKyAgICB9IC8qIGVuZCBsb29wIG92ZXIgYWxsIGNhbmRpZGF0ZXMgKi8gCisKKyAgaWYgKG9sb2FkX2FtYmlndW91cykKKyAgICB7CisgICAgICBpZiAobWV0aG9kKQorICAgICAgICBlcnJvciAoIkNhbm5vdCByZXNvbHZlIG92ZXJsb2FkZWQgbWV0aG9kICVzJXMlcyB0byB1bmlxdWUgaW5zdGFuY2U7IGRpc2FtYmlndWF0ZSBieSBzcGVjaWZ5aW5nIGZ1bmN0aW9uIHNpZ25hdHVyZSIsCisgICAgICAgICAgICAgICBvYmpfdHlwZV9uYW1lLAorICAgICAgICAgICAgICAgKG9ial90eXBlX25hbWUgJiYgKm9ial90eXBlX25hbWUpID8gIjo6IiA6ICIiLAorICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICBlbHNlCisgICAgICAgIGVycm9yICgiQ2Fubm90IHJlc29sdmUgb3ZlcmxvYWRlZCBmdW5jdGlvbiAlcyB0byB1bmlxdWUgaW5zdGFuY2U7IGRpc2FtYmlndWF0ZSBieSBzcGVjaWZ5aW5nIGZ1bmN0aW9uIHNpZ25hdHVyZSIsCisgICAgICAgICAgICAgICBmdW5jX25hbWUpOworICAgIH0KKworICAvKiBDaGVjayBob3cgYmFkIHRoZSBiZXN0IG1hdGNoIGlzICovIAorICBmb3IgKGl4ID0gMTsgaXggPD0gbmFyZ3M7IGl4KyspCisgICAgeworICAgICAgc3dpdGNoIChvbG9hZF9jaGFtcF9idi0+cmFua1tpeF0pCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgb2xvYWRfbm9uX3N0YW5kYXJkID0gMTsgIC8qIG5vbi1zdGFuZGFyZCB0eXBlIGNvbnZlcnNpb25zIG5lZWRlZCAqLyAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMTAwOgorICAgICAgICAgICAgb2xvYWRfaW5jb21wYXRpYmxlID0gMTsgIC8qIHRydWx5IG1pc21hdGNoZWQgdHlwZXMgKi8gCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgaWYgKG9sb2FkX2luY29tcGF0aWJsZSkKKyAgICB7CisgICAgICBpZiAobWV0aG9kKQorICAgICAgICBlcnJvciAoIkNhbm5vdCByZXNvbHZlIG1ldGhvZCAlcyVzJXMgdG8gYW55IG92ZXJsb2FkZWQgaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgb2JqX3R5cGVfbmFtZSwKKyAgICAgICAgICAgICAgIChvYmpfdHlwZV9uYW1lICYmICpvYmpfdHlwZV9uYW1lKSA/ICI6OiIgOiAiIiwKKyAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgZWxzZQorICAgICAgICBlcnJvciAoIkNhbm5vdCByZXNvbHZlIGZ1bmN0aW9uICVzIHRvIGFueSBvdmVybG9hZGVkIGluc3RhbmNlIiwKKyAgICAgICAgICAgICAgIGZ1bmNfbmFtZSk7CisgICAgfQorICBlbHNlIGlmIChvbG9hZF9ub25fc3RhbmRhcmQpCisgICAgeworICAgICAgaWYgKG1ldGhvZCkKKyAgICAgICAgd2FybmluZyAoIlVzaW5nIG5vbi1zdGFuZGFyZCBjb252ZXJzaW9uIHRvIG1hdGNoIG1ldGhvZCAlcyVzJXMgdG8gc3VwcGxpZWQgYXJndW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgb2JqX3R5cGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgKG9ial90eXBlX25hbWUgJiYgKm9ial90eXBlX25hbWUpID8gIjo6IiA6ICIiLAorICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgIGVsc2UKKyAgICAgICAgd2FybmluZyAoIlVzaW5nIG5vbi1zdGFuZGFyZCBjb252ZXJzaW9uIHRvIG1hdGNoIGZ1bmN0aW9uICVzIHRvIHN1cHBsaWVkIGFyZ3VtZW50cyIsCisgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSk7CisgICAgfQorCisgIGlmIChtZXRob2QpCisgICAgeworICAgICAgaWYgKFRZUEVfRk5fRklFTERfVklSVFVBTF9QIChmbnNfcHRyLCBvbG9hZF9jaGFtcCkpCisgICAgICAgICp2YWxwID0gdmFsdWVfdmlydHVhbF9mbl9maWVsZCAoJnRlbXAsIGZuc19wdHIsIG9sb2FkX2NoYW1wLCBiYXNldHlwZSwgYm9mZnNldCk7CisgICAgICBlbHNlCisgICAgICAgICp2YWxwID0gdmFsdWVfZm5fZmllbGQgKCZ0ZW1wLCBmbnNfcHRyLCBvbG9hZF9jaGFtcCwgYmFzZXR5cGUsIGJvZmZzZXQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICpzeW1wID0gb2xvYWRfc3ltc1tvbG9hZF9jaGFtcF07CisgICAgICBmcmVlIChmdW5jX25hbWUpOworICAgIH0KKworICByZXR1cm4gb2xvYWRfaW5jb21wYXRpYmxlID8gMTAwIDogKG9sb2FkX25vbl9zdGFuZGFyZCA/IDEwIDogMCk7Cit9CisKKy8qIEMrKzogcmV0dXJuIDEgaXMgTkFNRSBpcyBhIGxlZ2l0aW1hdGUgbmFtZSBmb3IgdGhlIGRlc3RydWN0b3IKKyAgIG9mIHR5cGUgVFlQRS4gIElmIFRZUEUgZG9lcyBub3QgaGF2ZSBhIGRlc3RydWN0b3IsIG9yCisgICBpZiBOQU1FIGlzIGluYXBwcm9wcmlhdGUgZm9yIFRZUEUsIGFuIGVycm9yIGlzIHNpZ25hbGVkLiAgKi8KK2ludAorZGVzdHJ1Y3Rvcl9uYW1lX3AgKG5hbWUsIHR5cGUpCisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGNvbnN0IHN0cnVjdCB0eXBlICp0eXBlOworeworICAvKiBkZXN0cnVjdG9ycyBhcmUgYSBzcGVjaWFsIGNhc2UuICAqLworCisgIGlmIChuYW1lWzBdID09ICd+JykKKyAgICB7CisgICAgICBjaGFyICpkbmFtZSA9IHR5cGVfbmFtZV9ub190YWcgKHR5cGUpOworICAgICAgY2hhciAqY3AgPSBzdHJjaHIgKGRuYW1lLCAnPCcpOworICAgICAgdW5zaWduZWQgaW50IGxlbjsKKworICAgICAgLyogRG8gbm90IGNvbXBhcmUgdGhlIHRlbXBsYXRlIHBhcnQgZm9yIHRlbXBsYXRlIGNsYXNzZXMuICAqLworICAgICAgaWYgKGNwID09IE5VTEwpCisJbGVuID0gc3RybGVuIChkbmFtZSk7CisgICAgICBlbHNlCisJbGVuID0gY3AgLSBkbmFtZTsKKyAgICAgIGlmIChzdHJsZW4gKG5hbWUgKyAxKSAhPSBsZW4gfHwgIVNUUkVRTiAoZG5hbWUsIG5hbWUgKyAxLCBsZW4pKQorCWVycm9yICgibmFtZSBvZiBkZXN0cnVjdG9yIG11c3QgZXF1YWwgbmFtZSBvZiBjbGFzcyIpOworICAgICAgZWxzZQorCXJldHVybiAxOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiBmb3IgY2hlY2tfZmllbGQ6IEdpdmVuIFRZUEUsIGEgc3RydWN0dXJlL3VuaW9uLAorICAgcmV0dXJuIDEgaWYgdGhlIGNvbXBvbmVudCBuYW1lZCBOQU1FIGZyb20gdGhlIHVsdGltYXRlCisgICB0YXJnZXQgc3RydWN0dXJlL3VuaW9uIGlzIGRlZmluZWQsIG90aGVyd2lzZSwgcmV0dXJuIDAuICovCisKK3N0YXRpYyBpbnQKK2NoZWNrX2ZpZWxkX2luICh0eXBlLCBuYW1lKQorICAgICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKK3sKKyAgcmVnaXN0ZXIgaW50IGk7CisKKyAgZm9yIChpID0gVFlQRV9ORklFTERTICh0eXBlKSAtIDE7IGkgPj0gVFlQRV9OX0JBU0VDTEFTU0VTICh0eXBlKTsgaS0tKQorICAgIHsKKyAgICAgIGNoYXIgKnRfZmllbGRfbmFtZSA9IFRZUEVfRklFTERfTkFNRSAodHlwZSwgaSk7CisgICAgICBpZiAodF9maWVsZF9uYW1lICYmIFNUUkVRICh0X2ZpZWxkX25hbWUsIG5hbWUpKQorCXJldHVybiAxOworICAgIH0KKworICAvKiBDKys6IElmIGl0IHdhcyBub3QgZm91bmQgYXMgYSBkYXRhIGZpZWxkLCB0aGVuIHRyeSB0bworICAgICByZXR1cm4gaXQgYXMgYSBwb2ludGVyIHRvIGEgbWV0aG9kLiAgKi8KKworICAvKiBEZXN0cnVjdG9ycyBhcmUgYSBzcGVjaWFsIGNhc2UuICAqLworICBpZiAoZGVzdHJ1Y3Rvcl9uYW1lX3AgKG5hbWUsIHR5cGUpKQorICAgIHsKKyAgICAgIGludCBtX2luZGV4LCBmX2luZGV4OworCisgICAgICByZXR1cm4gZ2V0X2Rlc3RydWN0b3JfZm5fZmllbGQgKHR5cGUsICZtX2luZGV4LCAmZl9pbmRleCk7CisgICAgfQorCisgIGZvciAoaSA9IFRZUEVfTkZOX0ZJRUxEUyAodHlwZSkgLSAxOyBpID49IDA7IC0taSkKKyAgICB7CisgICAgICBpZiAoU1RSRVEgKFRZUEVfRk5fRklFTERMSVNUX05BTUUgKHR5cGUsIGkpLCBuYW1lKSkKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgZm9yIChpID0gVFlQRV9OX0JBU0VDTEFTU0VTICh0eXBlKSAtIDE7IGkgPj0gMDsgaS0tKQorICAgIGlmIChjaGVja19maWVsZF9pbiAoVFlQRV9CQVNFQ0xBU1MgKHR5cGUsIGkpLCBuYW1lKSkKKyAgICAgIHJldHVybiAxOworICAgICAgCisgIHJldHVybiAwOworfQorCisKKy8qIEMrKzogR2l2ZW4gQVJHMSwgYSB2YWx1ZSBvZiB0eXBlIChwb2ludGVyIHRvIGEpKiBzdHJ1Y3R1cmUvdW5pb24sCisgICByZXR1cm4gMSBpZiB0aGUgY29tcG9uZW50IG5hbWVkIE5BTUUgZnJvbSB0aGUgdWx0aW1hdGUKKyAgIHRhcmdldCBzdHJ1Y3R1cmUvdW5pb24gaXMgZGVmaW5lZCwgb3RoZXJ3aXNlLCByZXR1cm4gMC4gICovCisKK2ludAorY2hlY2tfZmllbGQgKGFyZzEsIG5hbWUpCisgICAgIHJlZ2lzdGVyIHZhbHVlX3B0ciBhcmcxOworICAgICBjb25zdCBjaGFyICpuYW1lOworeworICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdDsKKworICBDT0VSQ0VfQVJSQVkgKGFyZzEpOworCisgIHQgPSBWQUxVRV9UWVBFIChhcmcxKTsKKworICAvKiBGb2xsb3cgcG9pbnRlcnMgdW50aWwgd2UgZ2V0IHRvIGEgbm9uLXBvaW50ZXIuICAqLworCisgIGZvciAoOzspCisgICAgeworICAgICAgQ0hFQ0tfVFlQRURFRiAodCk7CisgICAgICBpZiAoVFlQRV9DT0RFICh0KSAhPSBUWVBFX0NPREVfUFRSICYmIFRZUEVfQ09ERSAodCkgIT0gVFlQRV9DT0RFX1JFRikKKwlicmVhazsKKyAgICAgIHQgPSBUWVBFX1RBUkdFVF9UWVBFICh0KTsKKyAgICB9CisKKyAgaWYgKFRZUEVfQ09ERSAodCkgPT0gVFlQRV9DT0RFX01FTUJFUikKKyAgICBlcnJvciAoIm5vdCBpbXBsZW1lbnRlZDogbWVtYmVyIHR5cGUgaW4gY2hlY2tfZmllbGQiKTsKKworICBpZiAoICAgVFlQRV9DT0RFICh0KSAhPSBUWVBFX0NPREVfU1RSVUNUCisgICAgICAmJiBUWVBFX0NPREUgKHQpICE9IFRZUEVfQ09ERV9VTklPTikKKyAgICBlcnJvciAoIkludGVybmFsIGVycm9yOiBgdGhpcycgaXMgbm90IGFuIGFnZ3JlZ2F0ZSIpOworCisgIHJldHVybiBjaGVja19maWVsZF9pbiAodCwgbmFtZSk7Cit9CisKKy8qIEMrKzogR2l2ZW4gYW4gYWdncmVnYXRlIHR5cGUgQ1VSVFlQRSwgYW5kIGEgbWVtYmVyIG5hbWUgTkFNRSwKKyAgIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGlzIG1lbWJlciBhcyBhICJwb2ludGVyIHRvIG1lbWJlciIKKyAgIHR5cGUuICBJZiBJTlRZUEUgaXMgbm9uLW51bGwsIHRoZW4gaXQgd2lsbCBiZSB0aGUgdHlwZQorICAgb2YgdGhlIG1lbWJlciB3ZSBhcmUgbG9va2luZyBmb3IuICBUaGlzIHdpbGwgaGVscCB1cyByZXNvbHZlCisgICAicG9pbnRlcnMgdG8gbWVtYmVyIGZ1bmN0aW9ucyIuICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQKKyAgIHRvIHJlc29sdmUgdXNlciBleHByZXNzaW9ucyBvZiB0aGUgZm9ybSAiRE9NQUlOOjpOQU1FIi4gICovCisKK3ZhbHVlX3B0cgordmFsdWVfc3RydWN0X2VsdF9mb3JfcmVmZXJlbmNlIChkb21haW4sIG9mZnNldCwgY3VydHlwZSwgbmFtZSwgaW50eXBlKQorICAgICBzdHJ1Y3QgdHlwZSAqZG9tYWluLCAqY3VydHlwZSwgKmludHlwZTsKKyAgICAgaW50IG9mZnNldDsKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKnQgPSBjdXJ0eXBlOworICByZWdpc3RlciBpbnQgaTsKKyAgdmFsdWVfcHRyIHY7CisKKyAgaWYgKCAgIFRZUEVfQ09ERSAodCkgIT0gVFlQRV9DT0RFX1NUUlVDVAorICAgICAgJiYgVFlQRV9DT0RFICh0KSAhPSBUWVBFX0NPREVfVU5JT04pCisgICAgZXJyb3IgKCJJbnRlcm5hbCBlcnJvcjogbm9uLWFnZ3JlZ2F0ZSB0eXBlIHRvIHZhbHVlX3N0cnVjdF9lbHRfZm9yX3JlZmVyZW5jZSIpOworCisgIGZvciAoaSA9IFRZUEVfTkZJRUxEUyAodCkgLSAxOyBpID49IFRZUEVfTl9CQVNFQ0xBU1NFUyAodCk7IGktLSkKKyAgICB7CisgICAgICBjaGFyICp0X2ZpZWxkX25hbWUgPSBUWVBFX0ZJRUxEX05BTUUgKHQsIGkpOworICAgICAgCisgICAgICBpZiAodF9maWVsZF9uYW1lICYmIFNUUkVRICh0X2ZpZWxkX25hbWUsIG5hbWUpKQorCXsKKwkgIGlmIChUWVBFX0ZJRUxEX1NUQVRJQyAodCwgaSkpCisJICAgIHsKKwkgICAgICB2ID0gdmFsdWVfc3RhdGljX2ZpZWxkICh0LCBpKTsKKwkgICAgICBpZiAodiA9PSBOVUxMKQorCQllcnJvciAoIkludGVybmFsIGVycm9yOiBjb3VsZCBub3QgZmluZCBzdGF0aWMgdmFyaWFibGUgJXMiLAorCQkgICAgICAgbmFtZSk7CisJICAgICAgcmV0dXJuIHY7CisJICAgIH0KKwkgIGlmIChUWVBFX0ZJRUxEX1BBQ0tFRCAodCwgaSkpCisJICAgIGVycm9yICgicG9pbnRlcnMgdG8gYml0ZmllbGQgbWVtYmVycyBub3QgYWxsb3dlZCIpOworCSAgCisJICByZXR1cm4gdmFsdWVfZnJvbV9sb25nZXN0CisJICAgIChsb29rdXBfcmVmZXJlbmNlX3R5cGUgKGxvb2t1cF9tZW1iZXJfdHlwZSAoVFlQRV9GSUVMRF9UWVBFICh0LCBpKSwKKwkJCQkJCQlkb21haW4pKSwKKwkgICAgIG9mZnNldCArIChMT05HRVNUKSAoVFlQRV9GSUVMRF9CSVRQT1MgKHQsIGkpID4+IDMpKTsKKwl9CisgICAgfQorCisgIC8qIEMrKzogSWYgaXQgd2FzIG5vdCBmb3VuZCBhcyBhIGRhdGEgZmllbGQsIHRoZW4gdHJ5IHRvCisgICAgIHJldHVybiBpdCBhcyBhIHBvaW50ZXIgdG8gYSBtZXRob2QuICAqLworCisgIC8qIERlc3RydWN0b3JzIGFyZSBhIHNwZWNpYWwgY2FzZS4gICovCisgIGlmIChkZXN0cnVjdG9yX25hbWVfcCAobmFtZSwgdCkpCisgICAgeworICAgICAgZXJyb3IgKCJtZW1iZXIgcG9pbnRlcnMgdG8gZGVzdHJ1Y3RvcnMgbm90IGltcGxlbWVudGVkIHlldCIpOworICAgIH0KKworICAvKiBQZXJmb3JtIGFsbCBuZWNlc3NhcnkgZGVyZWZlcmVuY2luZy4gICovCisgIHdoaWxlIChpbnR5cGUgJiYgVFlQRV9DT0RFIChpbnR5cGUpID09IFRZUEVfQ09ERV9QVFIpCisgICAgaW50eXBlID0gVFlQRV9UQVJHRVRfVFlQRSAoaW50eXBlKTsKKworICBmb3IgKGkgPSBUWVBFX05GTl9GSUVMRFMgKHQpIC0gMTsgaSA+PSAwOyAtLWkpCisgICAgeworICAgICAgY2hhciAqdF9maWVsZF9uYW1lID0gVFlQRV9GTl9GSUVMRExJU1RfTkFNRSAodCwgaSk7CisgICAgICBjaGFyIGRlbV9vcG5hbWVbNjRdOworCisgICAgICBpZiAoc3RybmNtcCh0X2ZpZWxkX25hbWUsICJfXyIsIDIpPT0wIHx8CisJc3RybmNtcCh0X2ZpZWxkX25hbWUsICJvcCIsIDIpPT0wIHx8CisJc3RybmNtcCh0X2ZpZWxkX25hbWUsICJ0eXBlIiwgNCk9PTAgKQorCXsKKwkgIGlmIChjcGx1c19kZW1hbmdsZV9vcG5hbWUodF9maWVsZF9uYW1lLCBkZW1fb3BuYW1lLCBETUdMX0FOU0kpKQorCSAgICB0X2ZpZWxkX25hbWUgPSBkZW1fb3BuYW1lOworCSAgZWxzZSBpZiAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKHRfZmllbGRfbmFtZSwgZGVtX29wbmFtZSwgMCkpCisJICAgIHRfZmllbGRfbmFtZSA9IGRlbV9vcG5hbWU7IAorCX0KKyAgICAgIGlmICh0X2ZpZWxkX25hbWUgJiYgU1RSRVEgKHRfZmllbGRfbmFtZSwgbmFtZSkpCisJeworCSAgaW50IGogPSBUWVBFX0ZOX0ZJRUxETElTVF9MRU5HVEggKHQsIGkpOworCSAgc3RydWN0IGZuX2ZpZWxkICpmID0gVFlQRV9GTl9GSUVMRExJU1QxICh0LCBpKTsKKwkgIAorCSAgaWYgKGludHlwZSA9PSAwICYmIGogPiAxKQorCSAgICBlcnJvciAoIm5vbi11bmlxdWUgbWVtYmVyIGAlcycgcmVxdWlyZXMgdHlwZSBpbnN0YW50aWF0aW9uIiwgbmFtZSk7CisJICBpZiAoaW50eXBlKQorCSAgICB7CisJICAgICAgd2hpbGUgKGotLSkKKwkJaWYgKFRZUEVfRk5fRklFTERfVFlQRSAoZiwgaikgPT0gaW50eXBlKQorCQkgIGJyZWFrOworCSAgICAgIGlmIChqIDwgMCkKKwkJZXJyb3IgKCJubyBtZW1iZXIgZnVuY3Rpb24gbWF0Y2hlcyB0aGF0IHR5cGUgaW5zdGFudGlhdGlvbiIpOworCSAgICB9CisJICBlbHNlCisJICAgIGogPSAwOworCSAgCisJICBpZiAoVFlQRV9GTl9GSUVMRF9TVFVCIChmLCBqKSkKKwkgICAgY2hlY2tfc3R1Yl9tZXRob2QgKHQsIGksIGopOworCSAgaWYgKFRZUEVfRk5fRklFTERfVklSVFVBTF9QIChmLCBqKSkKKwkgICAgeworCSAgICAgIHJldHVybiB2YWx1ZV9mcm9tX2xvbmdlc3QKKwkJKGxvb2t1cF9yZWZlcmVuY2VfdHlwZQorCQkgKGxvb2t1cF9tZW1iZXJfdHlwZSAoVFlQRV9GTl9GSUVMRF9UWVBFIChmLCBqKSwKKwkJCQkgICAgICBkb21haW4pKSwKKwkJIChMT05HRVNUKSBNRVRIT0RfUFRSX0ZST01fVk9GRlNFVCAoVFlQRV9GTl9GSUVMRF9WT0ZGU0VUIChmLCBqKSkpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzdHJ1Y3Qgc3ltYm9sICpzID0gbG9va3VwX3N5bWJvbCAoVFlQRV9GTl9GSUVMRF9QSFlTTkFNRSAoZiwgaiksCisJCQkJCQkwLCBWQVJfTkFNRVNQQUNFLCAwLCBOVUxMKTsKKwkgICAgICBpZiAocyA9PSBOVUxMKQorCQl7CisJCSAgdiA9IDA7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICB2ID0gcmVhZF92YXJfdmFsdWUgKHMsIDApOworI2lmIDAKKwkJICBWQUxVRV9UWVBFICh2KSA9IGxvb2t1cF9yZWZlcmVuY2VfdHlwZQorCQkgICAgKGxvb2t1cF9tZW1iZXJfdHlwZSAoVFlQRV9GTl9GSUVMRF9UWVBFIChmLCBqKSwKKwkJCQkJIGRvbWFpbikpOworI2VuZGlmCisJCX0KKwkgICAgICByZXR1cm4gdjsKKwkgICAgfQorCX0KKyAgICB9CisgIGZvciAoaSA9IFRZUEVfTl9CQVNFQ0xBU1NFUyAodCkgLSAxOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICB2YWx1ZV9wdHIgdjsKKyAgICAgIGludCBiYXNlX29mZnNldDsKKworICAgICAgaWYgKEJBU0VUWVBFX1ZJQV9WSVJUVUFMICh0LCBpKSkKKwliYXNlX29mZnNldCA9IDA7CisgICAgICBlbHNlCisJYmFzZV9vZmZzZXQgPSBUWVBFX0JBU0VDTEFTU19CSVRQT1MgKHQsIGkpIC8gODsKKyAgICAgIHYgPSB2YWx1ZV9zdHJ1Y3RfZWx0X2Zvcl9yZWZlcmVuY2UgKGRvbWFpbiwKKwkJCQkJICBvZmZzZXQgKyBiYXNlX29mZnNldCwKKwkJCQkJICBUWVBFX0JBU0VDTEFTUyAodCwgaSksCisJCQkJCSAgbmFtZSwKKwkJCQkJICBpbnR5cGUpOworICAgICAgaWYgKHYpCisJcmV0dXJuIHY7CisgICAgfQorICByZXR1cm4gMDsKK30KKworCisvKiBGaW5kIHRoZSByZWFsIHJ1bi10aW1lIHR5cGUgb2YgYSB2YWx1ZSB1c2luZyBSVFRJLgorICogViBpcyBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlLgorICogQSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgdHlwZSBlbnRyeSBvZiB0aGUgcnVuLXRpbWUgdHlwZQorICogaXMgcmV0dXJuZWVkLgorICogRlVMTCBpcyBhIGZsYWcgdGhhdCBpcyBzZXQgb25seSBpZiB0aGUgdmFsdWUgViBpbmNsdWRlcworICogdGhlIGVudGlyZSBjb250ZW50cyBvZiBhbiBvYmplY3Qgb2YgdGhlIFJUVEkgdHlwZS4KKyAqIFRPUCBpcyB0aGUgb2Zmc2V0IHRvIHRoZSB0b3Agb2YgdGhlIGVuY2xvc2luZyBvYmplY3Qgb2YKKyAqIHRoZSByZWFsIHJ1bi10aW1lIHR5cGUuICBUaGlzIG9mZnNldCBtYXkgYmUgZm9yIHRoZSBlbWJlZGRlZAorICogb2JqZWN0LCBvciBmb3IgdGhlIGVuY2xvc2luZyBvYmplY3Qgb2YgVi4KKyAqIFVTSU5HX0VOQyBpcyB0aGUgZmxhZyB0aGF0IGRpc3Rpbmd1aXNoZXMgdGhlIHR3byBjYXNlcy4KKyAqIElmIGl0IGlzIDEsIHRoZW4gdGhlIG9mZnNldCBpcyBmb3IgdGhlIGVuY2xvc2luZyBvYmplY3QsCisgKiBvdGhlcndpc2UgZm9yIHRoZSBlbWJlZGRlZCBvYmplY3QuCisgKiAKKyAqIFRoaXMgY3VycmVudGx5IHdvcmtzIG9ubHkgZm9yIFJUVEkgaW5mb3JtYXRpb24gZ2VuZXJhdGVkCisgKiBieSB0aGUgSFAgQU5TSSBDKysgY29tcGlsZXIgKGFDQykuICBnKysgdG9kYXkgKDE5OTctMDYtMTApCisgKiBkb2VzIG5vdCBhcHBlYXIgdG8gc3VwcG9ydCBSVFRJLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYQorICogTlVMTCB2YWx1ZSBmb3Igb2JqZWN0cyBpbiB0aGUgZysrIHJ1bnRpbWUgbW9kZWwuICovCisKK3N0cnVjdCB0eXBlICoKK3ZhbHVlX3J0dGlfdHlwZSAodiwgZnVsbCwgdG9wLCB1c2luZ19lbmMpCisgIHZhbHVlX3B0ciB2OworICBpbnQgKiBmdWxsOworICBpbnQgKiB0b3A7CisgIGludCAqIHVzaW5nX2VuYzsKK3sKKyAgc3RydWN0IHR5cGUgKiBrbm93bl90eXBlOworICBzdHJ1Y3QgdHlwZSAqIHJ0dGlfdHlwZTsKKyAgQ09SRV9BRERSIGNvcmVwdHI7CisgIHZhbHVlX3B0ciB2cDsKKyAgaW50IHVzaW5nX2VuY2xvc2luZyA9IDA7CisgIGxvbmcgdG9wX29mZnNldCA9IDA7CisgIGNoYXIgcnR0aV90eXBlX25hbWVbMjU2XTsKKworICBpZiAoZnVsbCkKKyAgICAqZnVsbCA9IDA7CisgIGlmICh0b3ApCisgICAgKnRvcCA9IC0xOworICBpZiAodXNpbmdfZW5jKQorICAgICp1c2luZ19lbmMgPSAwOworCisgIC8qIEdldCBkZWNsYXJlZCB0eXBlICovIAorICBrbm93bl90eXBlID0gVkFMVUVfVFlQRSAodik7CisgIENIRUNLX1RZUEVERUYgKGtub3duX3R5cGUpOworICAvKiBSVFRJIHdvcmtzIG9ubHkgb3IgY2xhc3Mgb2JqZWN0cyAqLyAKKyAgaWYgKFRZUEVfQ09ERSAoa25vd25fdHlwZSkgIT0gVFlQRV9DT0RFX0NMQVNTKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIElmIG5laXRoZXIgdGhlIGRlY2xhcmVkIHR5cGUgbm9yIHRoZSBlbmNsb3NpbmcgdHlwZSBvZiB0aGUKKyAgICogdmFsdWUgc3RydWN0dXJlIGhhcyBhIEhQIEFOU0kgQysrIHN0eWxlIHZpcnR1YWwgdGFibGUsCisgICAqIHdlIGNhbid0IGRvIGFueXRoaW5nLiAqLworICBpZiAoIVRZUEVfSEFTX1ZUQUJMRSAoa25vd25fdHlwZSkpCisgICAgeworICAgICAga25vd25fdHlwZSA9IFZBTFVFX0VOQ0xPU0lOR19UWVBFICh2KTsKKyAgICAgIENIRUNLX1RZUEVERUYgKGtub3duX3R5cGUpOworICAgICAgaWYgKChUWVBFX0NPREUgKGtub3duX3R5cGUpICE9IFRZUEVfQ09ERV9DTEFTUykgfHwKKyAgICAgICAgICAhVFlQRV9IQVNfVlRBQkxFIChrbm93bl90eXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7IC8qIE5vIFJUVEksIG9yIG5vdCBIUC1jb21waWxlZCB0eXBlcyAqLworICAgICAgQ0hFQ0tfVFlQRURFRiAoa25vd25fdHlwZSk7CisgICAgICB1c2luZ19lbmNsb3NpbmcgPSAxOworICAgIH0KKworICBpZiAodXNpbmdfZW5jbG9zaW5nICYmIHVzaW5nX2VuYykKKyAgICAqdXNpbmdfZW5jID0gMTsKKworICAvKiBGaXJzdCBnZXQgdGhlIHZpcnR1YWwgdGFibGUgYWRkcmVzcyAqLworICBjb3JlcHRyID0gKiAoQ09SRV9BRERSICopICgoVkFMVUVfQ09OVEVOVFNfQUxMICh2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBWQUxVRV9PRkZTRVQgKHYpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh1c2luZ19lbmNsb3NpbmcgPyAwIDogVkFMVUVfRU1CRURERURfT0ZGU0VUICh2KSkpOworICBpZiAoY29yZXB0ciA9PSAwKQorICAgIHJldHVybiBOVUxMOyAvKiByZXR1cm4gc2lsZW50bHkgLS0gbWF5YmUgY2FsbGVkIG9uIGdkYi1nZW5lcmF0ZWQgdmFsdWUgKi8KKworICAvKiBGZXRjaCB0aGUgdG9wIG9mZnNldCBvZiB0aGUgb2JqZWN0ICovIAorICAvKiBGSVhNRSBwb3NzaWJsZSAzMng2NCBwcm9ibGVtIHdpdGggcG9pbnRlciBzaXplICYgYXJpdGhtZXRpYyAqLworICB2cCA9IHZhbHVlX2F0IChidWlsdGluX3R5cGVfaW50LCAKKyAgICAgICAgICAgICAgICAgY29yZXB0ciArIDQgKiBIUF9BQ0NfVE9QX09GRlNFVF9PRkZTRVQsIAorICAgICAgICAgICAgICAgICBWQUxVRV9CRkRfU0VDVElPTiAodikpOworICB0b3Bfb2Zmc2V0ID0gdmFsdWVfYXNfbG9uZyAodnApOworICBpZiAodG9wKQorICAgICp0b3AgPSB0b3Bfb2Zmc2V0OworCisgIC8qIEZldGNoIHRoZSB0eXBlaW5mbyBwb2ludGVyICovCisgIC8qIEZJWE1FIHBvc3NpYmxlIDMyeDY0IHByb2JsZW0gd2l0aCBwb2ludGVyIHNpemUgJiBhcml0aG1ldGljICovCisgIHZwID0gdmFsdWVfYXQgKGJ1aWx0aW5fdHlwZV9pbnQsIGNvcmVwdHIgKyA0ICogSFBfQUNDX1RZUEVJTkZPX09GRlNFVCwgVkFMVUVfQkZEX1NFQ1RJT04gKHYpKTsKKyAgLyogSW5kaXJlY3QgdGhyb3VnaCB0aGUgdHlwZWluZm8gcG9pbnRlciBhbmQgcmV0cmlldmUgdGhlIHBvaW50ZXIKKyAgICogdG8gdGhlIHN0cmluZyBuYW1lICovCisgIGNvcmVwdHIgPSAqIChDT1JFX0FERFIgKikgKFZBTFVFX0NPTlRFTlRTICh2cCkpOworICBpZiAoIWNvcmVwdHIpCisgICAgZXJyb3IgKCJSZXRyaWV2ZWQgbnVsbCB0eXBlaW5mbyBwb2ludGVyIGluIHRyeWluZyB0byBkZXRlcm1pbmUgcnVuLXRpbWUgdHlwZSIpOworICB2cCA9IHZhbHVlX2F0IChidWlsdGluX3R5cGVfaW50LCBjb3JlcHRyICsgNCwgVkFMVUVfQkZEX1NFQ1RJT04gKHYpKTsgIC8qIDQgLT4gb2Zmc2V0IG9mIG5hbWUgZmllbGQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRklYTUUgcG9zc2libGUgMzJ4NjQgcHJvYmxlbSAqLworCisgIGNvcmVwdHIgPSAqIChDT1JFX0FERFIgKikgKFZBTFVFX0NPTlRFTlRTICh2cCkpOworCisgIHJlYWRfbWVtb3J5X3N0cmluZyAoY29yZXB0ciwgcnR0aV90eXBlX25hbWUsIDI1Nik7CisKKyAgaWYgKHN0cmxlbiAocnR0aV90eXBlX25hbWUpID09IDApCisgICAgZXJyb3IgKCJSZXRyaWV2ZWQgbnVsbCB0eXBlIG5hbWUgZnJvbSB0eXBlaW5mbyIpOworICAKKyAgLyogc2VhcmNoIGZvciB0eXBlICovCisgIHJ0dGlfdHlwZSA9IGxvb2t1cF90eXBlbmFtZSAocnR0aV90eXBlX25hbWUsIChzdHJ1Y3QgYmxvY2sgKikgMCwgMSk7CisgIAorICBpZiAoIXJ0dGlfdHlwZSkKKyAgICBlcnJvciAoIkNvdWxkIG5vdCBmaW5kIHJ1bi10aW1lIHR5cGU6IGludmFsaWQgdHlwZSBuYW1lICVzIGluIHR5cGVpbmZvPz8iLCBydHRpX3R5cGVfbmFtZSk7CisgIENIRUNLX1RZUEVERUYgKHJ0dGlfdHlwZSk7CisKKyNpZiAwIC8qIGRlYnVnZ2luZyovCisgIHByaW50ZigiUlRUSSB0eXBlIG5hbWUgJXMsIHRhZyAlcywgZnVsbD8gJWRcbiIsIFRZUEVfTkFNRSAocnR0aV90eXBlKSwgVFlQRV9UQUdfTkFNRSAocnR0aV90eXBlKSwgZnVsbCA/ICpmdWxsIDogLTEpOyAKKyNlbmRpZgorCisgIC8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSB0aGUgZW50aXJlIG9iamVjdCAqLworICBpZiAoZnVsbCAvKiBOb24tbnVsbCBwb2ludGVyIHBhc3NlZCAqLyAKKworICAgICAgJiYKKyAgICAgICAgICAgLyogRWl0aGVyIHdlIGNoZWNrZWQgb24gdGhlIHdob2xlIG9iamVjdCBpbiBoYW5kIGFuZCBmb3VuZCB0aGUKKyAgICAgICAgICAgICAgdG9wIG9mZnNldCB0byBiZSB6ZXJvICovCisgICAgICAoKCh0b3Bfb2Zmc2V0ID09IDApICYmICAgICAgICAgCisgICAgICAgdXNpbmdfZW5jbG9zaW5nICYmICAgICAKKyAgICAgICBUWVBFX0xFTkdUSCAoa25vd25fdHlwZSkgPT0gVFlQRV9MRU5HVEggKHJ0dGlfdHlwZSkpCisgICAgICB8fAorICAgICAgICAgICAvKiBPciB3ZSBjaGVja2VkIG9uIHRoZSBlbWJlZGRlZCBvYmplY3QgYW5kIHRvcCBvZmZzZXQgd2FzIHRoZQorICAgICAgICAgICAgICBzYW1lIGFzIHRoZSBlbWJlZGRlZCBvZmZzZXQgKi8KKyAgICAgICgodG9wX29mZnNldCA9PSBWQUxVRV9FTUJFRERFRF9PRkZTRVQgKHYpKSAmJgorICAgICAgICF1c2luZ19lbmNsb3NpbmcgJiYKKyAgICAgICBUWVBFX0xFTkdUSCAoVkFMVUVfRU5DTE9TSU5HX1RZUEUgKHYpKSA9PSBUWVBFX0xFTkdUSCAocnR0aV90eXBlKSkpKQorICAgIAorICAgICpmdWxsID0gMTsKKyAgCisgIHJldHVybiBydHRpX3R5cGU7Cit9CisKKy8qIEdpdmVuIGEgcG9pbnRlciB2YWx1ZSBWLCBmaW5kIHRoZSByZWFsIChSVFRJKSB0eXBlCisgICBvZiB0aGUgb2JqZWN0IGl0IHBvaW50cyB0by4KKyAgIE90aGVyIHBhcmFtZXRlcnMgRlVMTCwgVE9QLCBVU0lOR19FTkMgYXMgd2l0aCB2YWx1ZV9ydHRpX3R5cGUoKQorICAgYW5kIHJlZmVyIHRvIHRoZSB2YWx1ZXMgY29tcHV0ZWQgZm9yIHRoZSBvYmplY3QgcG9pbnRlZCB0by4gKi8KKworc3RydWN0IHR5cGUgKgordmFsdWVfcnR0aV90YXJnZXRfdHlwZSAodiwgZnVsbCwgdG9wLCB1c2luZ19lbmMpCisgIHZhbHVlX3B0ciB2OworICBpbnQgKiBmdWxsOworICBpbnQgKiB0b3A7CisgIGludCAqIHVzaW5nX2VuYzsKK3sKKyAgdmFsdWVfcHRyIHRhcmdldDsKKworICB0YXJnZXQgPSB2YWx1ZV9pbmQgKHYpOworCisgIHJldHVybiB2YWx1ZV9ydHRpX3R5cGUgKHRhcmdldCwgZnVsbCwgdG9wLCB1c2luZ19lbmMpOworfQorCisvKiBHaXZlbiBhIHZhbHVlIHBvaW50ZWQgdG8gYnkgQVJHUCwgY2hlY2sgaXRzIHJlYWwgcnVuLXRpbWUgdHlwZSwgYW5kCisgICBpZiB0aGF0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBlbmNsb3NpbmcgdHlwZSwgY3JlYXRlIGEgbmV3IHZhbHVlCisgICB1c2luZyB0aGUgcmVhbCBydW4tdGltZSB0eXBlIGFzIHRoZSBlbmNsb3NpbmcgdHlwZSAoYW5kIG9mIHRoZSBzYW1lCisgICB0eXBlIGFzIEFSR1ApIGFuZCByZXR1cm4gaXQsIHdpdGggdGhlIGVtYmVkZGVkIG9mZnNldCBhZGp1c3RlZCB0bworICAgYmUgdGhlIGNvcnJlY3Qgb2Zmc2V0IHRvIHRoZSBlbmNsb3NlZCBvYmplY3QKKyAgIFJUWVBFIGlzIHRoZSB0eXBlLCBhbmQgWEZVTEwsIFhUT1AsIGFuZCBYVVNJTkdfRU5DIGFyZSB0aGUgb3RoZXIKKyAgIHBhcmFtZXRlcnMsIGNvbXB1dGVkIGJ5IHZhbHVlX3J0dGlfdHlwZSgpLiBJZiB0aGVzZSBhcmUgYXZhaWxhYmxlLAorICAgdGhleSBjYW4gYmUgc3VwcGxpZWQgYW5kIGEgc2Vjb25kIGNhbGwgdG8gdmFsdWVfcnR0aV90eXBlKCkgaXMgYXZvaWRlZC4KKyAgIChQYXNzIFJUWVBFID09IE5VTEwgaWYgdGhleSdyZSBub3QgYXZhaWxhYmxlICovCisKK3ZhbHVlX3B0cgordmFsdWVfZnVsbF9vYmplY3QgKGFyZ3AsIHJ0eXBlLCB4ZnVsbCwgeHRvcCwgeHVzaW5nX2VuYykKKyAgdmFsdWVfcHRyIGFyZ3A7CisgIHN0cnVjdCB0eXBlICogcnR5cGU7CisgIGludCB4ZnVsbDsKKyAgaW50IHh0b3A7CisgIGludCB4dXNpbmdfZW5jOworICAKK3sKKyAgc3RydWN0IHR5cGUgKiByZWFsX3R5cGU7CisgIGludCBmdWxsID0gMDsKKyAgaW50IHRvcCA9IC0xOworICBpbnQgdXNpbmdfZW5jID0gMDsKKyAgdmFsdWVfcHRyIG5ld192YWw7CisKKyAgaWYgKHJ0eXBlKQorICAgIHsKKyAgICAgIHJlYWxfdHlwZSA9IHJ0eXBlOworICAgICAgZnVsbCA9IHhmdWxsOworICAgICAgdG9wID0geHRvcDsKKyAgICAgIHVzaW5nX2VuYyA9IHh1c2luZ19lbmM7CisgICAgfQorICBlbHNlCisgICAgcmVhbF90eXBlID0gdmFsdWVfcnR0aV90eXBlIChhcmdwLCAmZnVsbCwgJnRvcCwgJnVzaW5nX2VuYyk7CisKKyAgLyogSWYgbm8gUlRUSSBkYXRhLCBvciBpZiBvYmplY3QgaXMgYWxyZWFkeSBjb21wbGV0ZSwgZG8gbm90aGluZyAqLworICBpZiAoIXJlYWxfdHlwZSB8fCByZWFsX3R5cGUgPT0gVkFMVUVfRU5DTE9TSU5HX1RZUEUgKGFyZ3ApKQorICAgIHJldHVybiBhcmdwOworCisgIC8qIElmIHdlIGhhdmUgdGhlIGZ1bGwgb2JqZWN0LCBidXQgZm9yIHNvbWUgcmVhc29uIHRoZSBlbmNsb3NpbmcKKyAgICAgdHlwZSBpcyB3cm9uZywgc2V0IGl0ICovIC8qIHBhaTogRklYTUUgLS0gc291bmRzIGlmZnkgKi8KKyAgaWYgKGZ1bGwpCisgICAgeworICAgICAgVkFMVUVfRU5DTE9TSU5HX1RZUEUgKGFyZ3ApID0gcmVhbF90eXBlOworICAgICAgcmV0dXJuIGFyZ3A7CisgICAgfQorCisgIC8qIENoZWNrIGlmIG9iamVjdCBpcyBpbiBtZW1vcnkgKi8KKyAgaWYgKFZBTFVFX0xWQUwgKGFyZ3ApICE9IGx2YWxfbWVtb3J5KQorICAgIHsKKyAgICAgIHdhcm5pbmcgKCJDb3VsZG4ndCByZXRyaWV2ZSBjb21wbGV0ZSBvYmplY3Qgb2YgUlRUSSB0eXBlICVzOyBvYmplY3QgbWF5IGJlIGluIHJlZ2lzdGVyKHMpLiIsIFRZUEVfTkFNRSAocmVhbF90eXBlKSk7CisgICAgICAKKyAgICAgIHJldHVybiBhcmdwOworICAgIH0KKyAgCisgIC8qIEFsbCBvdGhlciBjYXNlcyAtLSByZXRyaWV2ZSB0aGUgY29tcGxldGUgb2JqZWN0ICovCisgIC8qIEdvIGJhY2sgYnkgdGhlIGNvbXB1dGVkIHRvcF9vZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvYmplY3QsCisgICAgIGFkanVzdGluZyBmb3IgdGhlIGVtYmVkZGVkIG9mZnNldCBvZiBhcmdwIGlmIHRoYXQncyB3aGF0IHZhbHVlX3J0dGlfdHlwZQorICAgICB1c2VkIGZvciBpdHMgY29tcHV0YXRpb24uICovCisgIG5ld192YWwgPSB2YWx1ZV9hdF9sYXp5IChyZWFsX3R5cGUsIFZBTFVFX0FERFJFU1MgKGFyZ3ApIC0gdG9wICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2luZ19lbmMgPyAwIDogVkFMVUVfRU1CRURERURfT0ZGU0VUIChhcmdwKSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfQkZEX1NFQ1RJT04gKGFyZ3ApKTsKKyAgVkFMVUVfVFlQRSAobmV3X3ZhbCkgPSBWQUxVRV9UWVBFIChhcmdwKTsKKyAgVkFMVUVfRU1CRURERURfT0ZGU0VUIChuZXdfdmFsKSA9IHVzaW5nX2VuYyA/IHRvcCArIFZBTFVFX0VNQkVEREVEX09GRlNFVCAoYXJncCkgOiB0b3A7CisgIHJldHVybiBuZXdfdmFsOworfQorCisKKworCisvKiBDKys6IHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGNsYXNzIGluc3RhbmNlIHZhcmlhYmxlLCBpZiBvbmUgZXhpc3RzLgorICAgRmxhZyBDT01QTEFJTiBzaWduYWxzIGFuIGVycm9yIGlmIHRoZSByZXF1ZXN0IGlzIG1hZGUgaW4gYW4KKyAgIGluYXBwcm9wcmlhdGUgY29udGV4dC4gICovCisKK3ZhbHVlX3B0cgordmFsdWVfb2ZfdGhpcyAoY29tcGxhaW4pCisgICAgIGludCBjb21wbGFpbjsKK3sKKyAgc3RydWN0IHN5bWJvbCAqZnVuYywgKnN5bTsKKyAgc3RydWN0IGJsb2NrICpiOworICBpbnQgaTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgZnVubnlfdGhpc1tdID0gInRoaXMiOworICB2YWx1ZV9wdHIgdGhpczsKKworICBpZiAoc2VsZWN0ZWRfZnJhbWUgPT0gMCkKKyAgICB7CisgICAgICBpZiAoY29tcGxhaW4pCisgICAgICAgIGVycm9yICgibm8gZnJhbWUgc2VsZWN0ZWQiKTsKKyAgICAgIGVsc2UgcmV0dXJuIDA7CisgICAgfQorCisgIGZ1bmMgPSBnZXRfZnJhbWVfZnVuY3Rpb24gKHNlbGVjdGVkX2ZyYW1lKTsKKyAgaWYgKCFmdW5jKQorICAgIHsKKyAgICAgIGlmIChjb21wbGFpbikKKwllcnJvciAoIm5vIGB0aGlzJyBpbiBuYW1lbGVzcyBjb250ZXh0Iik7CisgICAgICBlbHNlIHJldHVybiAwOworICAgIH0KKworICBiID0gU1lNQk9MX0JMT0NLX1ZBTFVFIChmdW5jKTsKKyAgaSA9IEJMT0NLX05TWU1TIChiKTsKKyAgaWYgKGkgPD0gMCkKKyAgICB7CisgICAgICBpZiAoY29tcGxhaW4pCisgICAgICAgIGVycm9yICgibm8gYXJncywgbm8gYHRoaXMnIik7CisgICAgICBlbHNlIHJldHVybiAwOworICAgIH0KKworICAvKiBDYWxsaW5nIGxvb2t1cF9ibG9ja19zeW1ib2wgaXMgbmVjZXNzYXJ5IHRvIGdldCB0aGUgTE9DX1JFR0lTVEVSCisgICAgIHN5bWJvbCBpbnN0ZWFkIG9mIHRoZSBMT0NfQVJHIG9uZSAoaWYgYm90aCBleGlzdCkuICAqLworICBzeW0gPSBsb29rdXBfYmxvY2tfc3ltYm9sIChiLCBmdW5ueV90aGlzLCBWQVJfTkFNRVNQQUNFKTsKKyAgaWYgKHN5bSA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChjb21wbGFpbikKKwllcnJvciAoImN1cnJlbnQgc3RhY2sgZnJhbWUgbm90IGluIG1ldGhvZCIpOworICAgICAgZWxzZQorCXJldHVybiBOVUxMOworICAgIH0KKworICB0aGlzID0gcmVhZF92YXJfdmFsdWUgKHN5bSwgc2VsZWN0ZWRfZnJhbWUpOworICBpZiAodGhpcyA9PSAwICYmIGNvbXBsYWluKQorICAgIGVycm9yICgiYHRoaXMnIGFyZ3VtZW50IGF0IHVua25vd24gYWRkcmVzcyIpOworICByZXR1cm4gdGhpczsKK30KKworLyogQ3JlYXRlIGEgc2xpY2UgKHN1Yi1zdHJpbmcsIHN1Yi1hcnJheSkgb2YgQVJSQVksIHRoYXQgaXMgTEVOR1RIIGVsZW1lbnRzCisgICBsb25nLCBzdGFydGluZyBhdCBMT1dCT1VORC4gIFRoZSByZXN1bHQgaGFzIHRoZSBzYW1lIGxvd2VyIGJvdW5kIGFzCisgICB0aGUgb3JpZ2luYWwgQVJSQVkuICAqLworCit2YWx1ZV9wdHIKK3ZhbHVlX3NsaWNlIChhcnJheSwgbG93Ym91bmQsIGxlbmd0aCkKKyAgICAgdmFsdWVfcHRyIGFycmF5OworICAgICBpbnQgbG93Ym91bmQsIGxlbmd0aDsKK3sKKyAgc3RydWN0IHR5cGUgKnNsaWNlX3JhbmdlX3R5cGUsICpzbGljZV90eXBlLCAqcmFuZ2VfdHlwZTsKKyAgTE9OR0VTVCBsb3dlcmJvdW5kLCB1cHBlcmJvdW5kLCBvZmZzZXQ7CisgIHZhbHVlX3B0ciBzbGljZTsKKyAgc3RydWN0IHR5cGUgKmFycmF5X3R5cGU7CisgIGFycmF5X3R5cGUgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFIChhcnJheSkpOworICBDT0VSQ0VfVkFSWUlOR19BUlJBWSAoYXJyYXksIGFycmF5X3R5cGUpOworICBpZiAoVFlQRV9DT0RFIChhcnJheV90eXBlKSAhPSBUWVBFX0NPREVfQVJSQVkKKyAgICAgICYmIFRZUEVfQ09ERSAoYXJyYXlfdHlwZSkgIT0gVFlQRV9DT0RFX1NUUklORworICAgICAgJiYgVFlQRV9DT0RFIChhcnJheV90eXBlKSAhPSBUWVBFX0NPREVfQklUU1RSSU5HKQorICAgIGVycm9yICgiY2Fubm90IHRha2Ugc2xpY2Ugb2Ygbm9uLWFycmF5Iik7CisgIHJhbmdlX3R5cGUgPSBUWVBFX0lOREVYX1RZUEUgKGFycmF5X3R5cGUpOworICBpZiAoZ2V0X2Rpc2NyZXRlX2JvdW5kcyAocmFuZ2VfdHlwZSwgJmxvd2VyYm91bmQsICZ1cHBlcmJvdW5kKSA8IDApCisgICAgZXJyb3IgKCJzbGljZSBmcm9tIGJhZCBhcnJheSBvciBiaXRzdHJpbmciKTsKKyAgaWYgKGxvd2JvdW5kIDwgbG93ZXJib3VuZCB8fCBsZW5ndGggPCAwCisgICAgICB8fCBsb3dib3VuZCArIGxlbmd0aCAtIDEgPiB1cHBlcmJvdW5kCisgICAgICAvKiBDaGlsbCBhbGxvd3MgemVyby1sZW5ndGggc3RyaW5ncyBidXQgbm90IGFycmF5cy4gKi8KKyAgICAgIHx8IChjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSA9PSBsYW5ndWFnZV9jaGlsbAorCSAgJiYgbGVuZ3RoID09IDAgJiYgVFlQRV9DT0RFIChhcnJheV90eXBlKSA9PSBUWVBFX0NPREVfQVJSQVkpKQorICAgIGVycm9yICgic2xpY2Ugb3V0IG9mIHJhbmdlIik7CisgIC8qIEZJWE1FLXR5cGUtYWxsb2NhdGlvbjogbmVlZCBhIHdheSB0byBmcmVlIHRoaXMgdHlwZSB3aGVuIHdlIGFyZQorICAgICBkb25lIHdpdGggaXQuICAqLworICBzbGljZV9yYW5nZV90eXBlID0gY3JlYXRlX3JhbmdlX3R5cGUgKChzdHJ1Y3QgdHlwZSopIE5VTEwsCisJCQkJCVRZUEVfVEFSR0VUX1RZUEUgKHJhbmdlX3R5cGUpLAorCQkJCQlsb3dib3VuZCwgbG93Ym91bmQgKyBsZW5ndGggLSAxKTsKKyAgaWYgKFRZUEVfQ09ERSAoYXJyYXlfdHlwZSkgPT0gVFlQRV9DT0RFX0JJVFNUUklORykKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIHNsaWNlX3R5cGUgPSBjcmVhdGVfc2V0X3R5cGUgKChzdHJ1Y3QgdHlwZSopIE5VTEwsIHNsaWNlX3JhbmdlX3R5cGUpOworICAgICAgVFlQRV9DT0RFIChzbGljZV90eXBlKSA9IFRZUEVfQ09ERV9CSVRTVFJJTkc7CisgICAgICBzbGljZSA9IHZhbHVlX3plcm8gKHNsaWNlX3R5cGUsIG5vdF9sdmFsKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKwl7CisJICBpbnQgZWxlbWVudCA9IHZhbHVlX2JpdF9pbmRleCAoYXJyYXlfdHlwZSwKKwkJCQkJIFZBTFVFX0NPTlRFTlRTIChhcnJheSksCisJCQkJCSBsb3dib3VuZCArIGkpOworCSAgaWYgKGVsZW1lbnQgPCAwKQorCSAgICBlcnJvciAoImludGVybmFsIGVycm9yIGFjY2Vzc2luZyBiaXRzdHJpbmciKTsKKwkgIGVsc2UgaWYgKGVsZW1lbnQgPiAwKQorCSAgICB7CisJICAgICAgaW50IGogPSBpICUgVEFSR0VUX0NIQVJfQklUOworCSAgICAgIGlmIChCSVRTX0JJR19FTkRJQU4pCisJCWogPSBUQVJHRVRfQ0hBUl9CSVQgLSAxIC0gajsKKwkgICAgICBWQUxVRV9DT05URU5UU19SQVcgKHNsaWNlKVtpIC8gVEFSR0VUX0NIQVJfQklUXSB8PSAoMSA8PCBqKTsKKwkgICAgfQorCX0KKyAgICAgIC8qIFdlIHNob3VsZCBzZXQgdGhlIGFkZHJlc3MsIGJpdHNzaXplLCBhbmQgYml0c3Bvcywgc28gdGhlIGNsaWNlCisJIGNhbiBiZSB1c2VkIG9uIHRoZSBMSFMsIGJ1dCB0aGF0IG1heSByZXF1aXJlIGV4dGVuc2lvbnMgdG8KKwkgdmFsdWVfYXNzaWduLiAgRm9yIG5vdywganVzdCBsZWF2ZSBhcyBhIG5vbl9sdmFsLiAgRklYTUUuICAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCB0eXBlICplbGVtZW50X3R5cGUgPSBUWVBFX1RBUkdFVF9UWVBFIChhcnJheV90eXBlKTsKKyAgICAgIG9mZnNldAorCT0gKGxvd2JvdW5kIC0gbG93ZXJib3VuZCkgKiBUWVBFX0xFTkdUSCAoY2hlY2tfdHlwZWRlZiAoZWxlbWVudF90eXBlKSk7CisgICAgICBzbGljZV90eXBlID0gY3JlYXRlX2FycmF5X3R5cGUgKChzdHJ1Y3QgdHlwZSopIE5VTEwsIGVsZW1lbnRfdHlwZSwKKwkJCQkgICAgICBzbGljZV9yYW5nZV90eXBlKTsKKyAgICAgIFRZUEVfQ09ERSAoc2xpY2VfdHlwZSkgPSBUWVBFX0NPREUgKGFycmF5X3R5cGUpOworICAgICAgc2xpY2UgPSBhbGxvY2F0ZV92YWx1ZSAoc2xpY2VfdHlwZSk7CisgICAgICBpZiAoVkFMVUVfTEFaWSAoYXJyYXkpKQorCVZBTFVFX0xBWlkgKHNsaWNlKSA9IDE7CisgICAgICBlbHNlCisJbWVtY3B5IChWQUxVRV9DT05URU5UUyAoc2xpY2UpLCBWQUxVRV9DT05URU5UUyAoYXJyYXkpICsgb2Zmc2V0LAorCQlUWVBFX0xFTkdUSCAoc2xpY2VfdHlwZSkpOworICAgICAgaWYgKFZBTFVFX0xWQUwgKGFycmF5KSA9PSBsdmFsX2ludGVybmFsdmFyKQorCVZBTFVFX0xWQUwgKHNsaWNlKSA9IGx2YWxfaW50ZXJuYWx2YXJfY29tcG9uZW50OworICAgICAgZWxzZQorCVZBTFVFX0xWQUwgKHNsaWNlKSA9IFZBTFVFX0xWQUwgKGFycmF5KTsKKyAgICAgIFZBTFVFX0FERFJFU1MgKHNsaWNlKSA9IFZBTFVFX0FERFJFU1MgKGFycmF5KTsKKyAgICAgIFZBTFVFX09GRlNFVCAoc2xpY2UpID0gVkFMVUVfT0ZGU0VUIChhcnJheSkgKyBvZmZzZXQ7CisgICAgfQorICByZXR1cm4gc2xpY2U7Cit9CisKKy8qIEFzc3VtaW5nIGNoaWxsX3ZhcnlpbmdfdHlwZSAoVkFSUkFZKSBpcyB0cnVlLCByZXR1cm4gYW4gZXF1aXZhbGVudAorICAgdmFsdWUgYXMgYSBmaXhlZC1sZW5ndGggYXJyYXkuICovCisKK3ZhbHVlX3B0cgordmFyeWluZ190b19zbGljZSAodmFycmF5KQorICAgICB2YWx1ZV9wdHIgdmFycmF5OworeworICBzdHJ1Y3QgdHlwZSAqdnR5cGUgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFICh2YXJyYXkpKTsKKyAgTE9OR0VTVCBsZW5ndGggPSB1bnBhY2tfbG9uZyAoVFlQRV9GSUVMRF9UWVBFICh2dHlwZSwgMCksCisJCQkJVkFMVUVfQ09OVEVOVFMgKHZhcnJheSkKKwkJCQkrIFRZUEVfRklFTERfQklUUE9TICh2dHlwZSwgMCkgLyA4KTsKKyAgcmV0dXJuIHZhbHVlX3NsaWNlICh2YWx1ZV9wcmltaXRpdmVfZmllbGQgKHZhcnJheSwgMCwgMSwgdnR5cGUpLCAwLCBsZW5ndGgpOworfQorCisvKiBDcmVhdGUgYSB2YWx1ZSBmb3IgYSBGT1JUUkFOIGNvbXBsZXggbnVtYmVyLiAgQ3VycmVudGx5IG1vc3Qgb2YgCisgICB0aGUgdGltZSB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gQ09NUExFWCoxNiAoaS5lLiBhIGNvbXBsZXggbnVtYmVyIAorICAgY29tcG9zZWQgb2YgMiBkb3VibGVzLiAgVGhpcyByZWFsbHkgc2hvdWxkIGJlIGEgc21hcnRlciByb3V0aW5lIAorICAgdGhhdCBmaWd1cmVzIG91dCBwcmVjaXNpb24gaW50ZWxpZ2VudGx5IGFzIG9wcG9zZWQgdG8gYXNzdW1pbmcgCisgICBkb3VibGVzLiBGSVhNRTogZm1iICovIAorCit2YWx1ZV9wdHIKK3ZhbHVlX2xpdGVyYWxfY29tcGxleCAoYXJnMSwgYXJnMiwgdHlwZSkKKyAgICAgdmFsdWVfcHRyIGFyZzE7CisgICAgIHZhbHVlX3B0ciBhcmcyOworICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgcmVnaXN0ZXIgdmFsdWVfcHRyIHZhbDsKKyAgc3RydWN0IHR5cGUgKnJlYWxfdHlwZSA9IFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpOworCisgIHZhbCA9IGFsbG9jYXRlX3ZhbHVlICh0eXBlKTsKKyAgYXJnMSA9IHZhbHVlX2Nhc3QgKHJlYWxfdHlwZSwgYXJnMSk7CisgIGFyZzIgPSB2YWx1ZV9jYXN0IChyZWFsX3R5cGUsIGFyZzIpOworCisgIG1lbWNweSAoVkFMVUVfQ09OVEVOVFNfUkFXICh2YWwpLAorCSAgVkFMVUVfQ09OVEVOVFMgKGFyZzEpLCBUWVBFX0xFTkdUSCAocmVhbF90eXBlKSk7CisgIG1lbWNweSAoVkFMVUVfQ09OVEVOVFNfUkFXICh2YWwpICsgVFlQRV9MRU5HVEggKHJlYWxfdHlwZSksCisJICBWQUxVRV9DT05URU5UUyAoYXJnMiksIFRZUEVfTEVOR1RIIChyZWFsX3R5cGUpKTsKKyAgcmV0dXJuIHZhbDsKK30KKworLyogQ2FzdCBhIHZhbHVlIGludG8gdGhlIGFwcHJvcHJpYXRlIGNvbXBsZXggZGF0YSB0eXBlLiAqLworCitzdGF0aWMgdmFsdWVfcHRyCitjYXN0X2ludG9fY29tcGxleCAodHlwZSwgdmFsKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgcmVnaXN0ZXIgdmFsdWVfcHRyIHZhbDsKK3sKKyAgc3RydWN0IHR5cGUgKnJlYWxfdHlwZSA9IFRZUEVfVEFSR0VUX1RZUEUgKHR5cGUpOworICBpZiAoVFlQRV9DT0RFIChWQUxVRV9UWVBFICh2YWwpKSA9PSBUWVBFX0NPREVfQ09NUExFWCkKKyAgICB7CisgICAgICBzdHJ1Y3QgdHlwZSAqdmFsX3JlYWxfdHlwZSA9IFRZUEVfVEFSR0VUX1RZUEUgKFZBTFVFX1RZUEUgKHZhbCkpOworICAgICAgdmFsdWVfcHRyIHJlX3ZhbCA9IGFsbG9jYXRlX3ZhbHVlICh2YWxfcmVhbF90eXBlKTsKKyAgICAgIHZhbHVlX3B0ciBpbV92YWwgPSBhbGxvY2F0ZV92YWx1ZSAodmFsX3JlYWxfdHlwZSk7CisKKyAgICAgIG1lbWNweSAoVkFMVUVfQ09OVEVOVFNfUkFXIChyZV92YWwpLAorCSAgICAgIFZBTFVFX0NPTlRFTlRTICh2YWwpLCBUWVBFX0xFTkdUSCAodmFsX3JlYWxfdHlwZSkpOworICAgICAgbWVtY3B5IChWQUxVRV9DT05URU5UU19SQVcgKGltX3ZhbCksCisJICAgICAgVkFMVUVfQ09OVEVOVFMgKHZhbCkgKyBUWVBFX0xFTkdUSCAodmFsX3JlYWxfdHlwZSksCisJICAgICAgIFRZUEVfTEVOR1RIICh2YWxfcmVhbF90eXBlKSk7CisKKyAgICAgIHJldHVybiB2YWx1ZV9saXRlcmFsX2NvbXBsZXggKHJlX3ZhbCwgaW1fdmFsLCB0eXBlKTsKKyAgICB9CisgIGVsc2UgaWYgKFRZUEVfQ09ERSAoVkFMVUVfVFlQRSAodmFsKSkgPT0gVFlQRV9DT0RFX0ZMVAorCSAgIHx8IFRZUEVfQ09ERSAoVkFMVUVfVFlQRSAodmFsKSkgPT0gVFlQRV9DT0RFX0lOVCkKKyAgICByZXR1cm4gdmFsdWVfbGl0ZXJhbF9jb21wbGV4ICh2YWwsIHZhbHVlX3plcm8gKHJlYWxfdHlwZSwgbm90X2x2YWwpLCB0eXBlKTsKKyAgZWxzZQorICAgIGVycm9yICgiY2Fubm90IGNhc3Qgbm9uLW51bWJlciB0byBjb21wbGV4Iik7Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX3ZhbG9wcyAoKQoreworI2lmIDAKKyAgYWRkX3Nob3dfZnJvbV9zZXQKKyAgICAoYWRkX3NldF9jbWQgKCJhYmFuZG9uIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sIChjaGFyICopJmF1dG9fYWJhbmRvbiwKKwkJICAiU2V0IGF1dG9tYXRpYyBhYmFuZG9ubWVudCBvZiBleHByZXNzaW9ucyB1cG9uIGZhaWx1cmUuIiwKKwkJICAmc2V0bGlzdCksCisgICAgICZzaG93bGlzdCk7CisjZW5kaWYKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoIm92ZXJsb2FkLXJlc29sdXRpb24iLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwgKGNoYXIgKikmb3ZlcmxvYWRfcmVzb2x1dGlvbiwKKwkJICAiU2V0IG92ZXJsb2FkIHJlc29sdXRpb24gaW4gZXZhbHVhdGluZyBDKysgZnVuY3Rpb25zLiIsCisJCSAgJnNldGxpc3QpLAorICAgICAmc2hvd2xpc3QpOworICBvdmVybG9hZF9yZXNvbHV0aW9uID0gMTsKKworfQpkaWZmIC0tZ2l0IGEvZ2RiL3ZhbHByaW50LmMgYi9nZGIvdmFscHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDlkYTliCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3ZhbHByaW50LmMKQEAgLTAsMCArMSwxNTY3IEBACisvKiBQcmludCB2YWx1ZXMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg4LCAxOTg5LCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk4CisgICAgICAgICAgICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJvYnN0YWNrLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJkZW1hbmdsZS5oIgorI2luY2x1ZGUgImFubm90YXRlLmgiCisjaW5jbHVkZSAidmFscHJpbnQuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgdm9pZCBwcmludF9oZXhfY2hhcnMgUEFSQU1TICgoR0RCX0ZJTEUgKiwgdW5zaWduZWQgY2hhciAqLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQpKTsKKworc3RhdGljIHZvaWQgc2hvd19wcmludCBQQVJBTVMgKChjaGFyICosIGludCkpOworCitzdGF0aWMgdm9pZCBzZXRfcHJpbnQgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgc2V0X3JhZGl4IFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHNob3dfcmFkaXggUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQgc2V0X2lucHV0X3JhZGl4IFBBUkFNUyAoKGNoYXIgKiwgaW50LCBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqKSk7CisKK3N0YXRpYyB2b2lkIHNldF9pbnB1dF9yYWRpeF8xIFBBUkFNUyAoKGludCwgdW5zaWduZWQpKTsKKworc3RhdGljIHZvaWQgc2V0X291dHB1dF9yYWRpeCBQQVJBTVMgKChjaGFyICosIGludCwgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKikpOworCitzdGF0aWMgdm9pZCBzZXRfb3V0cHV0X3JhZGl4XzEgUEFSQU1TICgoaW50LCB1bnNpZ25lZCkpOworCit2b2lkIF9pbml0aWFsaXplX3ZhbHByaW50IFBBUkFNUyAoKHZvaWQpKTsKKworLyogTWF4aW11bSBudW1iZXIgb2YgY2hhcnMgdG8gcHJpbnQgZm9yIGEgc3RyaW5nIHBvaW50ZXIgdmFsdWUgb3IgdmVjdG9yCisgICBjb250ZW50cywgb3IgVUlOVF9NQVggZm9yIG5vIGxpbWl0LiAgTm90ZSB0aGF0ICJzZXQgcHJpbnQgZWxlbWVudHMgMCIKKyAgIHN0b3JlcyBVSU5UX01BWCBpbiBwcmludF9tYXgsIHdoaWNoIGRpc3BsYXlzIGluIGEgc2hvdyBjb21tYW5kIGFzCisgICAidW5saW1pdGVkIi4gKi8KKwordW5zaWduZWQgaW50IHByaW50X21heDsKKyNkZWZpbmUgUFJJTlRfTUFYX0RFRkFVTFQgMjAwCS8qIFN0YXJ0IHByaW50X21heCBvZmYgYXQgdGhpcyB2YWx1ZS4gKi8KKworLyogRGVmYXVsdCBpbnB1dCBhbmQgb3V0cHV0IHJhZGl4ZXMsIGFuZCBvdXRwdXQgZm9ybWF0IGxldHRlci4gICovCisKK3Vuc2lnbmVkIGlucHV0X3JhZGl4ID0gMTA7Cit1bnNpZ25lZCBvdXRwdXRfcmFkaXggPSAxMDsKK2ludCBvdXRwdXRfZm9ybWF0ID0gMDsKKworLyogUHJpbnQgcmVwZWF0IGNvdW50cyBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIHRoaXMgbWFueSByZXBldGl0aW9ucyBvZiBhbgorICAgZWxlbWVudCBpbiBhbiBhcnJheS4gIFJlZmVyZW5jZWQgYnkgdGhlIGxvdyBsZXZlbCBsYW5ndWFnZSBkZXBlbmRlbnQKKyAgIHByaW50IHJvdXRpbmVzLiAqLworCit1bnNpZ25lZCBpbnQgcmVwZWF0X2NvdW50X3RocmVzaG9sZCA9IDEwOworCisvKiBJZiBub256ZXJvLCBzdG9wcyBwcmludGluZyBvZiBjaGFyIGFycmF5cyBhdCBmaXJzdCBudWxsLiAqLworCitpbnQgc3RvcF9wcmludF9hdF9udWxsOworCisvKiBDb250cm9scyBwcmV0dHkgcHJpbnRpbmcgb2Ygc3RydWN0dXJlcy4gKi8KKworaW50IHByZXR0eXByaW50X3N0cnVjdHM7CisKKy8qIENvbnRyb2xzIHByZXR0eSBwcmludGluZyBvZiBhcnJheXMuICAqLworCitpbnQgcHJldHR5cHJpbnRfYXJyYXlzOworCisvKiBJZiBub256ZXJvLCBjYXVzZXMgdW5pb25zIGluc2lkZSBzdHJ1Y3R1cmVzIG9yIG90aGVyIHVuaW9ucyB0byBiZQorICAgcHJpbnRlZC4gKi8KKworaW50IHVuaW9ucHJpbnQ7CQkJLyogQ29udHJvbHMgcHJpbnRpbmcgb2YgbmVzdGVkIHVuaW9ucy4gICovCisKKy8qIElmIG5vbnplcm8sIGNhdXNlcyBtYWNoaW5lIGFkZHJlc3NlcyB0byBiZSBwcmludGVkIGluIGNlcnRhaW4gY29udGV4dHMuICovCisKK2ludCBhZGRyZXNzcHJpbnQ7CQkvKiBDb250cm9scyBwcmludGluZyBvZiBtYWNoaW5lIGFkZHJlc3NlcyAqLworCisMCisvKiBQcmludCBkYXRhIG9mIHR5cGUgVFlQRSBsb2NhdGVkIGF0IFZBTEFERFIgKHdpdGhpbiBHREIpLCB3aGljaCBjYW1lIGZyb20KKyAgIHRoZSBpbmZlcmlvciBhdCBhZGRyZXNzIEFERFJFU1MsIG9udG8gc3RkaW8gc3RyZWFtIFNUUkVBTSBhY2NvcmRpbmcgdG8KKyAgIEZPUk1BVCAoYSBsZXR0ZXIsIG9yIDAgZm9yIG5hdHVyYWwgZm9ybWF0IHVzaW5nIFRZUEUpLgorCisgICBJZiBERVJFRl9SRUYgaXMgbm9uemVybywgdGhlbiBkZXJlZmVyZW5jZSByZWZlcmVuY2VzLCBvdGhlcndpc2UganVzdCBwcmludAorICAgdGhlbSBsaWtlIHBvaW50ZXJzLgorCisgICBUaGUgUFJFVFRZIHBhcmFtZXRlciBjb250cm9scyBwcmV0dHlwcmludGluZy4KKworICAgSWYgdGhlIGRhdGEgYXJlIGEgc3RyaW5nIHBvaW50ZXIsIHJldHVybnMgdGhlIG51bWJlciBvZiBzdHJpbmcgY2hhcmFjdGVycworICAgcHJpbnRlZC4KKworICAgRklYTUU6ICBUaGUgZGF0YSBhdCBWQUxBRERSIGlzIGluIHRhcmdldCBieXRlIG9yZGVyLiAgSWYgZ2RiIGlzIGV2ZXIKKyAgIGVuaGFuY2VkIHRvIGJlIGFibGUgdG8gZGVidWcgbW9yZSB0aGFuIHRoZSBzaW5nbGUgdGFyZ2V0IGl0IHdhcyBjb21waWxlZAorICAgZm9yIChzcGVjaWZpYyBDUFUgdHlwZSBhbmQgdGh1cyBzcGVjaWZpYyB0YXJnZXQgYnl0ZSBvcmRlcmluZyksIHRoZW4KKyAgIGVpdGhlciB0aGUgcHJpbnQgcm91dGluZXMgYXJlIGdvaW5nIHRvIGhhdmUgdG8gdGFrZSB0aGlzIGludG8gYWNjb3VudCwKKyAgIG9yIHRoZSBkYXRhIGlzIGdvaW5nIHRvIGhhdmUgdG8gYmUgcGFzc2VkIGludG8gaGVyZSBhbHJlYWR5IGNvbnZlcnRlZAorICAgdG8gdGhlIGhvc3QgYnl0ZSBvcmRlcmluZywgd2hpY2hldmVyIGlzIG1vcmUgY29udmVuaWVudC4gKi8KKworCitpbnQKK3ZhbF9wcmludCAodHlwZSwgdmFsYWRkciwgZW1iZWRkZWRfb2Zmc2V0LCBhZGRyZXNzLAorICAgICAgICAgICBzdHJlYW0sIGZvcm1hdCwgZGVyZWZfcmVmLCByZWN1cnNlLCBwcmV0dHkpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBjaGFyICp2YWxhZGRyOworICAgICBpbnQgZW1iZWRkZWRfb2Zmc2V0OworICAgICBDT1JFX0FERFIgYWRkcmVzczsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgaW50IGZvcm1hdDsKKyAgICAgaW50IGRlcmVmX3JlZjsKKyAgICAgaW50IHJlY3Vyc2U7CisgICAgIGVudW0gdmFsX3ByZXR0eXByaW50IHByZXR0eTsKK3sKKyAgc3RydWN0IHR5cGUgKnJlYWxfdHlwZSA9IGNoZWNrX3R5cGVkZWYgKHR5cGUpOworICBpZiAocHJldHR5ID09IFZhbF9wcmV0dHlfZGVmYXVsdCkKKyAgICB7CisgICAgICBwcmV0dHkgPSBwcmV0dHlwcmludF9zdHJ1Y3RzID8gVmFsX3ByZXR0eXByaW50IDogVmFsX25vX3ByZXR0eXByaW50OworICAgIH0KKyAgCisgIFFVSVQ7CisKKyAgLyogRW5zdXJlIHRoYXQgdGhlIHR5cGUgaXMgY29tcGxldGUgYW5kIG5vdCBqdXN0IGEgc3R1Yi4gIElmIHRoZSB0eXBlIGlzCisgICAgIG9ubHkgYSBzdHViIGFuZCB3ZSBjYW4ndCBmaW5kIGFuZCBzdWJzdGl0dXRlIGl0cyBjb21wbGV0ZSB0eXBlLCB0aGVuCisgICAgIHByaW50IGFwcHJvcHJpYXRlIHN0cmluZyBhbmQgcmV0dXJuLiAgKi8KKworICBpZiAoVFlQRV9GTEFHUyAocmVhbF90eXBlKSAmIFRZUEVfRkxBR19TVFVCKQorICAgIHsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIjxpbmNvbXBsZXRlIHR5cGU+Iik7CisgICAgICBnZGJfZmx1c2ggKHN0cmVhbSk7CisgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgCisgIHJldHVybiAoTEFfVkFMX1BSSU5UICh0eXBlLCB2YWxhZGRyLCBlbWJlZGRlZF9vZmZzZXQsIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIGZvcm1hdCwgZGVyZWZfcmVmLCByZWN1cnNlLCBwcmV0dHkpKTsKK30KKworLyogUHJpbnQgdGhlIHZhbHVlIFZBTCBpbiBDLWlzaCBzeW50YXggb24gc3RyZWFtIFNUUkVBTS4KKyAgIEZPUk1BVCBpcyBhIGZvcm1hdC1sZXR0ZXIsIG9yIDAgZm9yIHByaW50IGluIG5hdHVyYWwgZm9ybWF0IG9mIGRhdGEgdHlwZS4KKyAgIElmIHRoZSBvYmplY3QgcHJpbnRlZCBpcyBhIHN0cmluZyBwb2ludGVyLCByZXR1cm5zCisgICB0aGUgbnVtYmVyIG9mIHN0cmluZyBieXRlcyBwcmludGVkLiAgKi8KKworaW50Cit2YWx1ZV9wcmludCAodmFsLCBzdHJlYW0sIGZvcm1hdCwgcHJldHR5KQorICAgICB2YWx1ZV9wdHIgdmFsOworICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICBpbnQgZm9ybWF0OworICAgICBlbnVtIHZhbF9wcmV0dHlwcmludCBwcmV0dHk7Cit7CisgIGlmICh2YWwgPT0gMCkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCI8YWRkcmVzcyBvZiB2YWx1ZSB1bmtub3duPiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoVkFMVUVfT1BUSU1JWkVEX09VVCAodmFsKSkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCI8dmFsdWUgb3B0aW1pemVkIG91dD4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgcmV0dXJuIExBX1ZBTFVFX1BSSU5UICh2YWwsIHN0cmVhbSwgZm9ybWF0LCBwcmV0dHkpOworfQorCisvKiBDYWxsZWQgYnkgdmFyaW91cyA8bGFuZz5fdmFsX3ByaW50IHJvdXRpbmVzIHRvIHByaW50CisgICBUWVBFX0NPREVfSU5UJ3MuICBUWVBFIGlzIHRoZSB0eXBlLiAgVkFMQUREUiBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgIHZhbHVlLiAgU1RSRUFNIGlzIHdoZXJlIHRvIHByaW50IHRoZSB2YWx1ZS4gICovCisKK3ZvaWQKK3ZhbF9wcmludF90eXBlX2NvZGVfaW50ICh0eXBlLCB2YWxhZGRyLCBzdHJlYW0pCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBjaGFyICp2YWxhZGRyOworICAgICBHREJfRklMRSAqc3RyZWFtOworeworICBpZiAoVFlQRV9MRU5HVEggKHR5cGUpID4gc2l6ZW9mIChMT05HRVNUKSkKKyAgICB7CisgICAgICBMT05HRVNUIHZhbDsKKworICAgICAgaWYgKFRZUEVfVU5TSUdORUQgKHR5cGUpCisJICAmJiBleHRyYWN0X2xvbmdfdW5zaWduZWRfaW50ZWdlciAodmFsYWRkciwgVFlQRV9MRU5HVEggKHR5cGUpLAorCQkJCQkgICAgJnZhbCkpCisJeworCSAgcHJpbnRfbG9uZ2VzdCAoc3RyZWFtLCAndScsIDAsIHZhbCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFNpZ25lZCwgb3Igd2UgY291bGRuJ3QgdHVybiBhbiB1bnNpZ25lZCB2YWx1ZSBpbnRvIGEKKwkgICAgIExPTkdFU1QuICBGb3Igc2lnbmVkIHZhbHVlcywgb25lIGNvdWxkIGFzc3VtZSB0d28ncworCSAgICAgY29tcGxlbWVudCAoYSByZWFzb25hYmxlIGFzc3VtcHRpb24sIEkgdGhpbmspIGFuZCBkbworCSAgICAgYmV0dGVyIHRoYW4gdGhpcy4gICovCisJICBwcmludF9oZXhfY2hhcnMgKHN0cmVhbSwgKHVuc2lnbmVkIGNoYXIgKikgdmFsYWRkciwKKwkJCSAgIFRZUEVfTEVOR1RIICh0eXBlKSk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZmRlZiBQUklOVF9UWVBFTEVTU19JTlRFR0VSCisgICAgICBQUklOVF9UWVBFTEVTU19JTlRFR0VSIChzdHJlYW0sIHR5cGUsIHVucGFja19sb25nICh0eXBlLCB2YWxhZGRyKSk7CisjZWxzZQorICAgICAgcHJpbnRfbG9uZ2VzdCAoc3RyZWFtLCBUWVBFX1VOU0lHTkVEICh0eXBlKSA/ICd1JyA6ICdkJywgMCwKKwkJICAgICB1bnBhY2tfbG9uZyAodHlwZSwgdmFsYWRkcikpOworI2VuZGlmCisgICAgfQorfQorCisvKiBQcmludCBhIG51bWJlciBhY2NvcmRpbmcgdG8gRk9STUFUIHdoaWNoIGlzIG9uZSBvZiBkLHUseCxvLGIsaCx3LGcuCisgICBUaGUgcmFpc29uIGQnZXRyZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGNvbnNvbGlkYXRlIHByaW50aW5nIG9mIAorICAgTE9OR19MT05HJ3MgaW50byB0aGlzIG9uZSBmdW5jdGlvbi4gIFNvbWUgcGxhdGZvcm1zIGhhdmUgbG9uZyBsb25ncyBidXQKKyAgIGRvbid0IGhhdmUgYSBwcmludGYoKSB0aGF0IHN1cHBvcnRzICJsbCIgaW4gdGhlIGZvcm1hdCBzdHJpbmcuICBXZSBoYW5kbGUKKyAgIHRoZXNlIGJ5IHNlZWluZyBpZiB0aGUgbnVtYmVyIGlzIHJlcHJlc2VudGFibGUgYXMgZWl0aGVyIGEgc2lnbmVkIG9yCisgICB1bnNpZ25lZCBsb25nLCBkZXBlbmRpbmcgdXBvbiB3aGF0IGZvcm1hdCBpcyBkZXNpcmVkLCBhbmQgaWYgbm90IHdlIGp1c3QKKyAgIGJhaWwgb3V0IGFuZCBwcmludCB0aGUgbnVtYmVyIGluIGhleC4KKworICAgVGhlIGZvcm1hdCBjaGFycyBiLGgsdyxnIGFyZSBmcm9tIHByaW50X3NjYWxhcl9mb3JtYXR0ZWQoKS4gIElmIFVTRV9MT0NBTCwKKyAgIGZvcm1hdCBpdCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgKHRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIG1vc3QKKyAgIGludGVnZXJzIHdoaWNoIEdEQiBwcmludHMsIHRoZSBleGNlcHRpb24gaXMgdGhpbmdzIGxpa2UgcHJvdG9jb2xzIHdoZXJlCisgICB0aGUgZm9ybWF0IG9mIHRoZSBpbnRlZ2VyIGlzIGEgcHJvdG9jb2wgdGhpbmcsIG5vdCBhIHVzZXItdmlzaWJsZSB0aGluZykuCisgICAqLworCisjaWYgZGVmaW5lZCAoQ0NfSEFTX0xPTkdfTE9ORykgJiYgIWRlZmluZWQgKFBSSU5URl9IQVNfTE9OR19MT05HKQorc3RhdGljIHZvaWQKK3ByaW50X2RlY2ltYWwgKHN0cmVhbSwgc2lnbiwgdXNlX2xvY2FsLCB2YWxfdWxvbmcpCisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGNoYXIgKnNpZ247CisgICAgIGludCB1c2VfbG9jYWw7CisgICAgIFVMT05HRVNUIHZhbF91bG9uZzsKK3sKKyAgdW5zaWduZWQgbG9uZyB0ZW1wWzNdOworICBpbnQgaSA9IDA7CisgIGRvCisgICAgeworICAgICAgdGVtcFtpXSA9IHZhbF91bG9uZyAlICgxMDAwICogMTAwMCAqIDEwMDApOworICAgICAgdmFsX3Vsb25nIC89ICgxMDAwICogMTAwMCAqIDEwMDApOworICAgICAgaSsrOworICAgIH0KKyAgd2hpbGUgKHZhbF91bG9uZyAhPSAwICYmIGkgPCAoc2l6ZW9mICh0ZW1wKSAvIHNpemVvZiAodGVtcFswXSkpKTsKKyAgc3dpdGNoIChpKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlcyVsdSIsCisJCQlzaWduLCB0ZW1wWzBdKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiVzJWx1JTA5bHUiLAorCQkJc2lnbiwgdGVtcFsxXSwgdGVtcFswXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlcyVsdSUwOWx1JTA5bHUiLAorCQkJc2lnbiwgdGVtcFsyXSwgdGVtcFsxXSwgdGVtcFswXSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorICByZXR1cm47Cit9CisjZW5kaWYKKwordm9pZAorcHJpbnRfbG9uZ2VzdCAoc3RyZWFtLCBmb3JtYXQsIHVzZV9sb2NhbCwgdmFsX2xvbmcpCisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIGludCBmb3JtYXQ7CisgICAgIGludCB1c2VfbG9jYWw7CisgICAgIExPTkdFU1QgdmFsX2xvbmc7Cit7CisjaWYgZGVmaW5lZCAoQ0NfSEFTX0xPTkdfTE9ORykgJiYgIWRlZmluZWQgKFBSSU5URl9IQVNfTE9OR19MT05HKQorICBpZiAoc2l6ZW9mIChsb25nKSA8IHNpemVvZiAoTE9OR0VTVCkpCisgICAgeworICAgICAgc3dpdGNoIChmb3JtYXQpCisJeworCWNhc2UgJ2QnOgorCSAgeworCSAgICAvKiBQcmludCBhIHNpZ25lZCB2YWx1ZSwgdGhhdCBkb2Vzbid0IGZpdCBpbiBhIGxvbmcgKi8KKwkgICAgaWYgKChsb25nKSB2YWxfbG9uZyAhPSB2YWxfbG9uZykKKwkgICAgICB7CisJCWlmICh2YWxfbG9uZyA8IDApCisJCSAgcHJpbnRfZGVjaW1hbCAoc3RyZWFtLCAiLSIsIHVzZV9sb2NhbCwgLXZhbF9sb25nKTsKKwkJZWxzZQorCQkgIHByaW50X2RlY2ltYWwgKHN0cmVhbSwgIiIsIHVzZV9sb2NhbCwgdmFsX2xvbmcpOworCQlyZXR1cm47CisJICAgICAgfQorCSAgICBicmVhazsKKwkgIH0KKwljYXNlICd1JzoKKwkgIHsKKwkgICAgLyogUHJpbnQgYW4gdW5zaWduZWQgdmFsdWUsIHRoYXQgZG9lc24ndCBmaXQgaW4gYSBsb25nICovCisJICAgIGlmICgodW5zaWduZWQgbG9uZykgdmFsX2xvbmcgIT0gKFVMT05HRVNUKSB2YWxfbG9uZykKKwkgICAgICB7CisJCXByaW50X2RlY2ltYWwgKHN0cmVhbSwgIiIsIHVzZV9sb2NhbCwgdmFsX2xvbmcpOworCQlyZXR1cm47CisJICAgICAgfQorCSAgICBicmVhazsKKwkgIH0KKwljYXNlICd4JzoKKwljYXNlICdvJzoKKwljYXNlICdiJzoKKwljYXNlICdoJzoKKwljYXNlICd3JzoKKwljYXNlICdnJzoKKwkgIC8qIFByaW50IGFzIHVuc2lnbmVkIHZhbHVlLCBtdXN0IGZpdCBjb21wbGV0ZWx5IGluIHVuc2lnbmVkIGxvbmcgKi8KKwkgIHsKKwkgICAgdW5zaWduZWQgbG9uZyB0ZW1wID0gdmFsX2xvbmc7CisJICAgIGlmICh0ZW1wICE9IHZhbF9sb25nKQorCSAgICAgIHsKKwkJLyogVXJrLCBjYW4ndCByZXByZXNlbnQgdmFsdWUgaW4gbG9uZyBzbyBwcmludCBpbiBoZXguCisJCSAgIERvIHNoaWZ0IGluIHR3byBvcGVyYXRpb25zIHNvIHRoYXQgaWYgc2l6ZW9mIChsb25nKQorCQkgICA9PSBzaXplb2YgKExPTkdFU1QpIHdlIGNhbiBhdm9pZCB3YXJuaW5ncyBmcm9tCisJCSAgIHBpY2t5IGNvbXBpbGVycyBhYm91dCBzaGlmdHMgPj0gdGhlIHNpemUgb2YgdGhlCisJCSAgIHNoaWZ0ZWUgaW4gYml0cyAqLworCQl1bnNpZ25lZCBsb25nIHZib3QgPSAodW5zaWduZWQgbG9uZykgdmFsX2xvbmc7CisJCUxPTkdFU1QgdGVtcCA9ICh2YWxfbG9uZyA+PiAoc2l6ZW9mIChsb25nKSAqIEhPU1RfQ0hBUl9CSVQgLSAxKSk7CisJCXVuc2lnbmVkIGxvbmcgdnRvcCA9IHRlbXAgPj4gMTsKKwkJZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiMHglbHglMDhseCIsIHZ0b3AsIHZib3QpOworCQlyZXR1cm47CisJICAgICAgfQorCSAgICBicmVhazsKKwkgIH0KKwl9CisgICAgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChDQ19IQVNfTE9OR19MT05HKSAmJiBkZWZpbmVkIChQUklOVEZfSEFTX0xPTkdfTE9ORykKKyAgc3dpdGNoIChmb3JtYXQpCisgICAgeworICAgIGNhc2UgJ2QnOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLAorCQkJdXNlX2xvY2FsID8gbG9jYWxfZGVjaW1hbF9mb3JtYXRfY3VzdG9tICgibGwiKQorCQkJCSAgOiAiJWxsZCIsCisJCQl2YWxfbG9uZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlICd1JzoKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiVsbHUiLCB2YWxfbG9uZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlICd4JzoKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwKKwkJCXVzZV9sb2NhbCA/IGxvY2FsX2hleF9mb3JtYXRfY3VzdG9tICgibGwiKQorCQkJCSAgOiAiJWxseCIsCisJCQl2YWxfbG9uZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdvJzoKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwKKwkJCXVzZV9sb2NhbCA/IGxvY2FsX29jdGFsX2Zvcm1hdF9jdXN0b20gKCJsbCIpCisJCQkJICA6ICIlbGxvIiwKKwkJCXZhbF9sb25nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2InOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCBsb2NhbF9oZXhfZm9ybWF0X2N1c3RvbSAoIjAybGwiKSwgdmFsX2xvbmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnaCc6CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sIGxvY2FsX2hleF9mb3JtYXRfY3VzdG9tICgiMDRsbCIpLCB2YWxfbG9uZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlICd3JzoKKyAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgbG9jYWxfaGV4X2Zvcm1hdF9jdXN0b20gKCIwOGxsIiksIHZhbF9sb25nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2cnOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCBsb2NhbF9oZXhfZm9ybWF0X2N1c3RvbSAoIjAxNmxsIiksIHZhbF9sb25nKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisjZWxzZSAvKiAhQ0NfSEFTX0xPTkdfTE9ORyB8fCAhUFJJTlRGX0hBU19MT05HX0xPTkcqLworICAvKiBJbiB0aGUgZm9sbG93aW5nIGl0IGlzIGltcG9ydGFudCB0byBjb2VyY2UgKHZhbF9sb25nKSB0byBhIGxvbmcuIEl0IGRvZXMKKyAgICAgbm90aGluZyBpZiAhTE9OR19MT05HLCBidXQgaXQgd2lsbCBjaG9wIG9mZiB0aGUgdG9wIGhhbGYgKHdoaWNoIHdlIGtub3cKKyAgICAgd2UgY2FuIGlnbm9yZSkgaWYgdGhlIGhvc3Qgc3VwcG9ydHMgbG9uZyBsb25ncy4gICovCisKKyAgc3dpdGNoIChmb3JtYXQpCisgICAgeworICAgIGNhc2UgJ2QnOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLAorCQkJdXNlX2xvY2FsID8gbG9jYWxfZGVjaW1hbF9mb3JtYXRfY3VzdG9tICgibCIpCisJCQkJICA6ICIlbGQiLAorCQkJKGxvbmcpIHZhbF9sb25nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3UnOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJWx1IiwgKHVuc2lnbmVkIGxvbmcpIHZhbF9sb25nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3gnOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLAorCQkJdXNlX2xvY2FsID8gbG9jYWxfaGV4X2Zvcm1hdF9jdXN0b20gKCJsIikKKwkJCQkgIDogIiVseCIsCisJCQkodW5zaWduZWQgbG9uZykgdmFsX2xvbmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbyc6CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sCisJCQl1c2VfbG9jYWwgPyBsb2NhbF9vY3RhbF9mb3JtYXRfY3VzdG9tICgibCIpCisJCQkJICA6ICIlbG8iLAorCQkJKHVuc2lnbmVkIGxvbmcpIHZhbF9sb25nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2InOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCBsb2NhbF9oZXhfZm9ybWF0X2N1c3RvbSAoIjAybCIpLAorCQkJKHVuc2lnbmVkIGxvbmcpIHZhbF9sb25nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2gnOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCBsb2NhbF9oZXhfZm9ybWF0X2N1c3RvbSAoIjA0bCIpLAorCQkJKHVuc2lnbmVkIGxvbmcpIHZhbF9sb25nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3cnOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCBsb2NhbF9oZXhfZm9ybWF0X2N1c3RvbSAoIjA4bCIpLAorCQkJKHVuc2lnbmVkIGxvbmcpIHZhbF9sb25nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2cnOgorICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCBsb2NhbF9oZXhfZm9ybWF0X2N1c3RvbSAoIjAxNmwiKSwKKwkJCSh1bnNpZ25lZCBsb25nKSB2YWxfbG9uZyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorI2VuZGlmIC8qIENDX0hBU19MT05HX0xPTkcgfHwgUFJJTlRGX0hBU19MT05HX0xPTkcgKi8KK30KKwordm9pZAorc3RyY2F0X2xvbmdlc3QgKGZvcm1hdCwgdXNlX2xvY2FsLCB2YWxfbG9uZywgYnVmLCBidWZsZW4pCisgICAgIGludCBmb3JtYXQ7CisgICAgIGludCB1c2VfbG9jYWw7CisgICAgIExPTkdFU1QgdmFsX2xvbmc7CisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgaW50IGJ1ZmxlbjsJCS8qIGlnbm9yZWQsIGZvciBub3cgKi8KK3sKKyNpZiBkZWZpbmVkIChDQ19IQVNfTE9OR19MT05HKSAmJiAhZGVmaW5lZCAoUFJJTlRGX0hBU19MT05HX0xPTkcpCisgIGxvbmcgdnRvcCwgdmJvdDsKKworICB2dG9wID0gdmFsX2xvbmcgPj4gKHNpemVvZiAobG9uZykgKiBIT1NUX0NIQVJfQklUKTsKKyAgdmJvdCA9IChsb25nKSB2YWxfbG9uZzsKKworICBpZiAoKGZvcm1hdCA9PSAnZCcgJiYgKHZhbF9sb25nIDwgSU5UX01JTiB8fCB2YWxfbG9uZyA+IElOVF9NQVgpKQorICAgICAgfHwgKChmb3JtYXQgPT0gJ3UnIHx8IGZvcm1hdCA9PSAneCcpICYmICh1bnNpZ25lZCBsb25nIGxvbmcpdmFsX2xvbmcgPiBVSU5UX01BWCkpCisgICAgeworICAgICAgc3ByaW50ZiAoYnVmLCAiMHglbHglMDhseCIsIHZ0b3AsIHZib3QpOworICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgUFJJTlRGX0hBU19MT05HX0xPTkcKKyAgc3dpdGNoIChmb3JtYXQpCisgICAgeworICAgIGNhc2UgJ2QnOgorICAgICAgc3ByaW50ZiAoYnVmLAorCSAgICAgICAodXNlX2xvY2FsID8gbG9jYWxfZGVjaW1hbF9mb3JtYXRfY3VzdG9tICgibGwiKSA6ICIlbGxkIiksIAorCSAgICAgICB2YWxfbG9uZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlICd1JzoKKyAgICAgIHNwcmludGYgKGJ1ZiwgIiVsbHUiLCAgdmFsX2xvbmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAneCc6CisgICAgICBzcHJpbnRmIChidWYsCisJICAgICAgICh1c2VfbG9jYWwgPyBsb2NhbF9oZXhfZm9ybWF0X2N1c3RvbSAoImxsIikgOiAiJWxseCIpLCAKKwkJCQorCSAgICAgICB2YWxfbG9uZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdvJzoKKyAgICAgIHNwcmludGYgKGJ1ZiwKKwkgICAgICAgKHVzZV9sb2NhbCA/IGxvY2FsX29jdGFsX2Zvcm1hdF9jdXN0b20gKCJsbCIpIDogIiVsbG8iKSwgCisJICAgICAgIHZhbF9sb25nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2InOgorICAgICAgc3ByaW50ZiAoYnVmLCBsb2NhbF9oZXhfZm9ybWF0X2N1c3RvbSAoIjAybGwiKSwgIHZhbF9sb25nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2gnOgorICAgICAgc3ByaW50ZiAoYnVmLCBsb2NhbF9oZXhfZm9ybWF0X2N1c3RvbSAoIjA0bGwiKSwgIHZhbF9sb25nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ3cnOgorICAgICAgc3ByaW50ZiAoYnVmLCBsb2NhbF9oZXhfZm9ybWF0X2N1c3RvbSAoIjA4bGwiKSwgIHZhbF9sb25nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2cnOgorICAgICAgc3ByaW50ZiAoYnVmLCBsb2NhbF9oZXhfZm9ybWF0X2N1c3RvbSAoIjAxNmxsIiksICB2YWxfbG9uZyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorI2Vsc2UgLyogIVBSSU5URl9IQVNfTE9OR19MT05HICovCisgIC8qIEluIHRoZSBmb2xsb3dpbmcgaXQgaXMgaW1wb3J0YW50IHRvIGNvZXJjZSAodmFsX2xvbmcpIHRvIGEgbG9uZy4gSXQgZG9lcworICAgICBub3RoaW5nIGlmICFMT05HX0xPTkcsIGJ1dCBpdCB3aWxsIGNob3Agb2ZmIHRoZSB0b3AgaGFsZiAod2hpY2ggd2Uga25vdworICAgICB3ZSBjYW4gaWdub3JlKSBpZiB0aGUgaG9zdCBzdXBwb3J0cyBsb25nIGxvbmdzLiAgKi8KKworICBzd2l0Y2ggKGZvcm1hdCkKKyAgICB7CisgICAgY2FzZSAnZCc6CisgICAgICBzcHJpbnRmIChidWYsICh1c2VfbG9jYWwgPyBsb2NhbF9kZWNpbWFsX2Zvcm1hdF9jdXN0b20gKCJsIikgOiAiJWxkIiksIAorCQkJCQkJCQkgKChsb25nKSB2YWxfbG9uZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAndSc6CisgICAgICBzcHJpbnRmIChidWYsICIlbHUiLCAgKCh1bnNpZ25lZCBsb25nKSB2YWxfbG9uZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAneCc6CisgICAgICBzcHJpbnRmIChidWYsICh1c2VfbG9jYWwgPyBsb2NhbF9oZXhfZm9ybWF0X2N1c3RvbSAoImwiKSA6ICIlbHgiKSwgCisJICAgICAgICgobG9uZykgdmFsX2xvbmcpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ28nOgorICAgICAgc3ByaW50ZiAoYnVmLCAodXNlX2xvY2FsID8gbG9jYWxfb2N0YWxfZm9ybWF0X2N1c3RvbSAoImwiKSA6ICIlbG8iKSwgCisJICAgICAgICgobG9uZykgdmFsX2xvbmcpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2InOgorICAgICAgc3ByaW50ZiAoYnVmLCBsb2NhbF9oZXhfZm9ybWF0X2N1c3RvbSAoIjAybCIpLCAKKwkgICAgICAgKChsb25nKSB2YWxfbG9uZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnaCc6CisgICAgICBzcHJpbnRmIChidWYsIGxvY2FsX2hleF9mb3JtYXRfY3VzdG9tICgiMDRsIiksIAorCSAgICAgICAoKGxvbmcpIHZhbF9sb25nKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICd3JzoKKyAgICAgIHNwcmludGYgKGJ1ZiwgbG9jYWxfaGV4X2Zvcm1hdF9jdXN0b20gKCIwOGwiKSwgCisJICAgICAgICgobG9uZykgdmFsX2xvbmcpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2cnOgorICAgICAgc3ByaW50ZiAoYnVmLCBsb2NhbF9oZXhfZm9ybWF0X2N1c3RvbSAoIjAxNmwiKSwKKwkgICAgICAgKChsb25nKSB2YWxfbG9uZykpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KKyAgICAKKyNlbmRpZiAvKiAhUFJJTlRGX0hBU19MT05HX0xPTkcgKi8KK30KKworLyogVGhpcyB1c2VkIHRvIGJlIGEgbWFjcm8sIGJ1dCBJIGRvbid0IHRoaW5rIGl0IGlzIGNhbGxlZCBvZnRlbiBlbm91Z2gKKyAgIHRvIG1lcml0IHN1Y2ggdHJlYXRtZW50LiAgKi8KKy8qIENvbnZlcnQgYSBMT05HRVNUIHRvIGFuIGludC4gIFRoaXMgaXMgdXNlZCBpbiBjb250ZXh0cyAoZS5nLiBudW1iZXIgb2YKKyAgIGFyZ3VtZW50cyB0byBhIGZ1bmN0aW9uLCBudW1iZXIgaW4gYSB2YWx1ZSBoaXN0b3J5LCByZWdpc3RlciBudW1iZXIsIGV0Yy4pCisgICB3aGVyZSB0aGUgdmFsdWUgbXVzdCBub3QgYmUgbGFyZ2VyIHRoYW4gY2FuIGZpdCBpbiBhbiBpbnQuICAqLworCitpbnQKK2xvbmdlc3RfdG9faW50IChhcmcpCisgICAgIExPTkdFU1QgYXJnOworeworICAvKiBMZXQgdGhlIGNvbXBpbGVyIGRvIHRoZSB3b3JrICovCisgIGludCBydG52YWwgPSAoaW50KSBhcmc7CisKKyAgLyogQ2hlY2sgZm9yIG92ZXJmbG93cyBvciB1bmRlcmZsb3dzICovCisgIGlmIChzaXplb2YgKExPTkdFU1QpID4gc2l6ZW9mIChpbnQpKQorICAgIHsKKyAgICAgIGlmIChydG52YWwgIT0gYXJnKQorCXsKKwkgIGVycm9yICgiVmFsdWUgb3V0IG9mIHJhbmdlLiIpOworCX0KKyAgICB9CisgIHJldHVybiAocnRudmFsKTsKK30KKworLyogUHJpbnQgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSBvZiB0eXBlIFRZUEUsIHBvaW50ZWQgdG8gaW4gR0RCIGJ5IFZBTEFERFIsCisgICBvbiBTVFJFQU0uICAqLworCit2b2lkCitwcmludF9mbG9hdGluZyAodmFsYWRkciwgdHlwZSwgc3RyZWFtKQorICAgICBjaGFyICp2YWxhZGRyOworICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKK3sKKyAgRE9VQkxFU1QgZG91YjsKKyAgaW50IGludjsKKyAgdW5zaWduZWQgbGVuID0gVFlQRV9MRU5HVEggKHR5cGUpOworICAKKyNpZiBkZWZpbmVkIChJRUVFX0ZMT0FUKQorCisgIC8qIENoZWNrIGZvciBOYU4ncy4gIE5vdGUgdGhhdCB0aGlzIGNvZGUgZG9lcyBub3QgZGVwZW5kIG9uIHVzIGJlaW5nCisgICAgIG9uIGFuIElFRUUgY29uZm9ybWluZyBzeXN0ZW0uICBJdCBvbmx5IGRlcGVuZHMgb24gdGhlIHRhcmdldAorICAgICBtYWNoaW5lIHVzaW5nIElFRUUgcmVwcmVzZW50YXRpb24uICBUaGlzIG1lYW5zIChhKQorICAgICBjcm9zcy1kZWJ1Z2dpbmcgd29ya3MgcmlnaHQsIGFuZCAoMikgSUVFRV9GTE9BVCBjYW4gKGFuZCBzaG91bGQpCisgICAgIGJlIGRlZmluZWQgZm9yIHN5c3RlbXMgbGlrZSB0aGUgNjg4ODEsIHdoaWNoIHVzZXMgSUVFRQorICAgICByZXByZXNlbnRhdGlvbiwgYnV0IGlzIG5vdCBJRUVFIGNvbmZvcm1pbmcuICAqLworCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGxvdywgaGlnaDsKKyAgICAvKiBJcyB0aGUgc2lnbiBiaXQgMD8gICovCisgICAgaW50IG5vbm5lZ2F0aXZlOworICAgIC8qIElzIGl0IGlzIGEgTmFOIChpLmUuIHRoZSBleHBvbmVudCBpcyBhbGwgb25lcyBhbmQKKyAgICAgICB0aGUgZnJhY3Rpb24gaXMgbm9uemVybyk/ICAqLworICAgIGludCBpc19uYW47CisKKyAgICAvKiBGb3IgbGludCwgaW5pdGlhbGl6ZSB0aGVzZSB0d28gdmFyaWFibGVzIHRvIHN1cHByZXNzIHdhcm5pbmc6ICovCisgICAgbG93ID0gaGlnaCA9IG5vbm5lZ2F0aXZlID0gMDsKKyAgICBpZiAobGVuID09IDQpCisgICAgICB7CisJLyogSXQncyBzaW5nbGUgcHJlY2lzaW9uLiAgKi8KKwkvKiBBc3N1bWUgdGhhdCBmbG9hdGluZyBwb2ludCBieXRlIG9yZGVyIGlzIHRoZSBzYW1lIGFzCisJICAgaW50ZWdlciBieXRlIG9yZGVyLiAgKi8KKwlsb3cgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKHZhbGFkZHIsIDQpOworCW5vbm5lZ2F0aXZlID0gKChsb3cgJiAweDgwMDAwMDAwKSA9PSAwKTsKKwlpc19uYW4gPSAoKCgobG93ID4+IDIzKSAmIDB4RkYpID09IDB4RkYpIAorCQkgICYmIDAgIT0gKGxvdyAmIDB4N0ZGRkZGKSk7CisJbG93ICY9IDB4N2ZmZmZmOworCWhpZ2ggPSAwOworICAgICAgfQorICAgIGVsc2UgaWYgKGxlbiA9PSA4KQorICAgICAgeworCS8qIEl0J3MgZG91YmxlIHByZWNpc2lvbi4gIEdldCB0aGUgaGlnaCBhbmQgbG93IHdvcmRzLiAgKi8KKworCS8qIEFzc3VtZSB0aGF0IGZsb2F0aW5nIHBvaW50IGJ5dGUgb3JkZXIgaXMgdGhlIHNhbWUgYXMKKwkgICBpbnRlZ2VyIGJ5dGUgb3JkZXIuICAqLworCWlmIChUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQorCSAgeworCSAgICBsb3cgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKHZhbGFkZHIgKyA0LCA0KTsKKwkgICAgaGlnaCA9IGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAodmFsYWRkciwgNCk7CisJICB9CisJZWxzZQorCSAgeworCSAgICBsb3cgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKHZhbGFkZHIsIDQpOworCSAgICBoaWdoID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyICh2YWxhZGRyICsgNCwgNCk7CisJICB9CisJbm9ubmVnYXRpdmUgPSAoKGhpZ2ggJiAweDgwMDAwMDAwKSA9PSAwKTsKKwlpc19uYW4gPSAoKChoaWdoID4+IDIwKSAmIDB4N2ZmKSA9PSAweDdmZgorCQkgICYmICEgKCgoKGhpZ2ggJiAweGZmZmZmKSA9PSAwKSkgJiYgKGxvdyA9PSAwKSkpOworCWhpZ2ggJj0gMHhmZmZmZjsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICAvKiBFeHRlbmRlZC4gIFdlIGNhbid0IGRldGVjdCBOYU5zIGZvciBleHRlbmRlZHMgeWV0LiAgQWxzbyBub3RlCisJIHRoYXQgY3VycmVudGx5IGV4dGVuZGVkcyBnZXQgbnVrZWQgdG8gZG91YmxlIGluCisJIFJFR0lTVEVSX0NPTlZFUlRJQkxFLiAgKi8KKyAgICAgIGlzX25hbiA9IDA7CisKKyAgICBpZiAoaXNfbmFuKQorICAgICAgeworCS8qIFRoZSBtZWFuaW5nIG9mIHRoZSBzaWduIGFuZCBmcmFjdGlvbiBpcyBub3QgZGVmaW5lZCBieSBJRUVFLgorCSAgIEJ1dCB0aGUgdXNlciBtaWdodCBrbm93IHdoYXQgdGhleSBtZWFuLiAgRm9yIGV4YW1wbGUsIHRoZXkKKwkgICAoaW4gYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCBtYW5uZXIpIGRpc3Rpbmd1aXNoIGJldHdlZW4KKwkgICBzaWduYWxpbmcgYW5kIHF1aWV0IE5hTidzLiAgKi8KKwlpZiAoaGlnaCkKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIi1OYU4oMHglbHglLjhseCkiICsgbm9ubmVnYXRpdmUsCisJCQkgICAgaGlnaCwgbG93KTsKKwllbHNlCisJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICItTmFOKDB4JWx4KSIgKyBub25uZWdhdGl2ZSwgbG93KTsKKwlyZXR1cm47CisgICAgICB9CisgIH0KKyNlbmRpZiAvKiBJRUVFX0ZMT0FULiAgKi8KKworICBkb3ViID0gdW5wYWNrX2RvdWJsZSAodHlwZSwgdmFsYWRkciwgJmludik7CisgIGlmIChpbnYpCisgICAgeworICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiPGludmFsaWQgZmxvYXQgdmFsdWU+Iik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChsZW4gPCBzaXplb2YgKGRvdWJsZSkpCisgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJS45ZyIsIChkb3VibGUpIGRvdWIpOworICBlbHNlIGlmIChsZW4gPT0gc2l6ZW9mIChkb3VibGUpKQorICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiUuMTdnIiwgKGRvdWJsZSkgZG91Yik7CisgIGVsc2UKKyNpZmRlZiBQUklOVEZfSEFTX0xPTkdfRE9VQkxFCisgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJS4zNUxnIiwgZG91Yik7CisjZWxzZQorICAgIC8qIFRoaXMgYXQgbGVhc3Qgd2lucyB3aXRoIHZhbHVlcyB0aGF0IGFyZSByZXByZXNlbnRhYmxlIGFzIGRvdWJsZXMgKi8KKyAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlLjE3ZyIsIChkb3VibGUpIGRvdWIpOworI2VuZGlmCit9CisKK3ZvaWQgCitwcmludF9iaW5hcnlfY2hhcnMgKHN0cmVhbSwgdmFsYWRkciwgbGVuKQorICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICB1bnNpZ25lZCBjaGFyICp2YWxhZGRyOworICAgICB1bnNpZ25lZCBsZW47Cit7CisKKyNkZWZpbmUgQklUU19JTl9CWVRFUyA4CisKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgaW50ICAgICAgICAgICAgaTsKKyAgaW50ICAgICAgICAgICAgYjsKKworICAvKiBEZWNsYXJlZCAiaW50IiBzbyBpdCB3aWxsIGJlIHNpZ25lZC4KKyAgICogVGhpcyBlbnN1cmVzIHRoYXQgcmlnaHQgc2hpZnQgd2lsbCBzaGlmdCBpbiB6ZXJvcy4KKyAgICovCisgIGNvbnN0IGludCAgICAgIG1hc2sgPSAweDA4MDsKKworICAvKiBGSVhNRTogV2Ugc2hvdWxkIGJlIG5vdCBwcmludGluZyBsZWFkaW5nIHplcm9lcyBpbiBtb3N0IGNhc2VzLiAgKi8KKworICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sIGxvY2FsX2JpbmFyeV9mb3JtYXRfcHJlZml4ICgpKTsKKyAgaWYgKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pCisgICAgeworICAgICAgZm9yIChwID0gdmFsYWRkcjsKKwkgICBwIDwgdmFsYWRkciArIGxlbjsKKwkgICBwKyspCisJeworICAgICAgICAgIC8qIEV2ZXJ5IGJ5dGUgaGFzIDggYmluYXJ5IGNoYXJhY3RlcnM7IHBlZWwgb2ZmCisgICAgICAgICAgICogYW5kIHByaW50IGZyb20gdGhlIE1TQiBlbmQuCisgICAgICAgICAgICovCisgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IChCSVRTX0lOX0JZVEVTICogc2l6ZW9mKCAqcCApKTsgaSsrICkgeworICAgICAgICAgICAgICBpZiggKnAgJiAoIG1hc2sgPj4gaSApKQorICAgICAgICAgICAgICAgICAgYiA9IDE7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGIgPSAwOworCisgICAgIAkgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlMWQiLCBiKTsKKyAgICAgICAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAocCA9IHZhbGFkZHIgKyBsZW4gLSAxOworCSAgIHAgPj0gdmFsYWRkcjsKKwkgICBwLS0pCisJeworICAgICAgICAgIGZvciggaSA9IDA7IGkgPCAoQklUU19JTl9CWVRFUyAqIHNpemVvZiggKnAgKSk7IGkrKyApIHsKKyAgICAgICAgICAgICAgaWYoICpwICYgKCBtYXNrID4+IGkgKSkKKyAgICAgICAgICAgICAgICAgIGIgPSAxOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBiID0gMDsKKworICAgICAJICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJTFkIiwgYik7CisgICAgICAgICAgfQorCX0KKyAgICB9CisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgbG9jYWxfYmluYXJ5X2Zvcm1hdF9zdWZmaXggKCkpOworfQorCisvKiBWQUxBRERSIHBvaW50cyB0byBhbiBpbnRlZ2VyIG9mIExFTiBieXRlcy4KKyAqIFByaW50IGl0IGluIG9jdGFsIG9uIHN0cmVhbSBvciBmb3JtYXQgaXQgaW4gYnVmLgorICovCit2b2lkCitwcmludF9vY3RhbF9jaGFycyAoc3RyZWFtLCB2YWxhZGRyLCBsZW4pCisgICAgIEdEQl9GSUxFICpzdHJlYW07CisgICAgIHVuc2lnbmVkIGNoYXIgKnZhbGFkZHI7CisgICAgIHVuc2lnbmVkIGxlbjsKK3sKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgdW5zaWduZWQgY2hhciBvY3RhMSwgb2N0YTIsIG9jdGEzLCBjYXJyeTsKKyAgaW50ICAgICAgICAgICBjeWNsZTsKKyAgCisgIC8qIEZJWE1FOiBXZSBzaG91bGQgYmUgbm90IHByaW50aW5nIGxlYWRpbmcgemVyb2VzIGluIG1vc3QgY2FzZXMuICAqLworCisKKyAgLyogT2N0YWwgaXMgMyBiaXRzLCB3aGljaCBkb2Vzbid0IGZpdC4gIFl1ay4gIFNvIHdlIGhhdmUgdG8gdHJhY2sKKyAgICogdGhlIGV4dHJhIGJpdHMsIHdoaWNoIGN5Y2xlIGV2ZXJ5IHRocmVlIGJ5dGVzOgorICAgKgorICAgKiBCeXRlIHNpZGU6ICAgICAgIDAgICAgICAgICAgICAxICAgICAgICAgICAgIDIgICAgICAgICAgMworICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfAorICAgKiBiaXQgbnVtYmVyICAgMTIzIDQ1NiA3OCB8IDkgMDEyIDM0NSA2IHwgNzggOTAxIDIzNCB8IDU2NyA4OTAgMTIgfAorICAgKgorICAgKiBPY3RhbCBzaWRlOiAgIDAgICAxICAgY2FycnkgIDMgICA0ICBjYXJyeSAuLi4KKyAgICoKKyAgICogQ3ljbGUgbnVtYmVyOiAgICAwICAgICAgICAgICAgIDEgICAgICAgICAgICAyCisgICAqCisgICAqIEJ1dCBvZiBjb3Vyc2Ugd2UgYXJlIHByaW50aW5nIGZyb20gdGhlIGhpZ2ggc2lkZSwgc28gd2UgaGF2ZSB0bworICAgKiBmaWd1cmUgb3V0IHdoZXJlIGluIHRoZSBjeWNsZSB3ZSBhcmUgc28gdGhhdCB3ZSBlbmQgdXAgd2l0aCBubworICAgKiBsZWZ0IG92ZXIgYml0cyBhdCB0aGUgZW5kLgorICAgKi8KKyNkZWZpbmUgQklUU19JTl9PQ1RBTCAzCisjZGVmaW5lIEhJR0hfWkVSTyAgICAgMDM0MAorI2RlZmluZSBMT1dfWkVSTyAgICAgIDAwMTYKKyNkZWZpbmUgQ0FSUllfWkVSTyAgICAwMDAzCisjZGVmaW5lIEhJR0hfT05FICAgICAgMDIwMAorI2RlZmluZSBNSURfT05FICAgICAgIDAxNjAKKyNkZWZpbmUgTE9XX09ORSAgICAgICAwMDE2CisjZGVmaW5lIENBUlJZX09ORSAgICAgMDAwMQorI2RlZmluZSBISUdIX1RXTyAgICAgIDAzMDAKKyNkZWZpbmUgTUlEX1RXTyAgICAgICAwMDcwCisjZGVmaW5lIExPV19UV08gICAgICAgMDAwNworCisgIC8qIEZvciAzMiB3ZSBzdGFydCBpbiBjeWNsZSAyLCB3aXRoIHR3byBiaXRzIGFuZCBvbmUgYml0IGNhcnJ5OworICAgKiBmb3IgNjQgaW4gY3ljbGUgaW4gY3ljbGUgMSwgd2l0aCBvbmUgYml0IGFuZCBhIHR3byBiaXQgY2FycnkuCisgICAqLworICBjeWNsZSA9IChsZW4gKiBCSVRTX0lOX0JZVEVTKSAlIEJJVFNfSU5fT0NUQUw7CisgIGNhcnJ5ID0gMDsKKyAgCisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgbG9jYWxfb2N0YWxfZm9ybWF0X3ByZWZpeCAoKSk7CisgIGlmIChUQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQorICAgIHsKKyAgICAgIGZvciAocCA9IHZhbGFkZHI7CisJICAgcCA8IHZhbGFkZHIgKyBsZW47CisJICAgcCsrKQorCXsKKyAgICAgICAgICBzd2l0Y2ggKGN5Y2xlKSB7CisgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgLyogTm8gY2FycnkgaW4sIGNhcnJ5IG91dCB0d28gYml0cy4KKyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgIG9jdGExID0gKEhJR0hfWkVSTyAgJiAqcCkgPj4gNTsKKyAgICAgICAgICAgICAgICAgb2N0YTIgPSAoTE9XX1pFUk8gICAmICpwKSA+PiAyOworICAgICAgICAgICAgICAgICBjYXJyeSA9IChDQVJSWV9aRVJPICYgKnApOworICAgIAkgICAgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlbyIsIG9jdGExKTsKKyAgICAJICAgICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJW8iLCBvY3RhMik7CisgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgLyogQ2FycnkgaW4gdHdvIGJpdHMsIGNhcnJ5IG91dCBvbmUgYml0LgorICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgb2N0YTEgPSAoY2FycnkgPDwgMSkgfCAoKEhJR0hfT05FICYgKnApID4+IDcpOworICAgICAgICAgICAgICAgICBvY3RhMiA9IChNSURfT05FICAgJiAqcCkgPj4gNDsKKyAgICAgICAgICAgICAgICAgb2N0YTMgPSAoTE9XX09ORSAgICYgKnApID4+IDE7CisgICAgICAgICAgICAgICAgIGNhcnJ5ID0gKENBUlJZX09ORSAmICpwKTsKKyAgICAJICAgICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJW8iLCBvY3RhMSk7CisgICAgCSAgICAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiVvIiwgb2N0YTIpOworICAgIAkgICAgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlbyIsIG9jdGEzKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAvKiBDYXJyeSBpbiBvbmUgYml0LCBubyBjYXJyeSBvdXQuCisgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICBvY3RhMSA9IChjYXJyeSA8PCAyKSB8ICgoSElHSF9UV08gJiAqcCkgPj4gNik7CisgICAgICAgICAgICAgICAgIG9jdGEyID0gKE1JRF9UV08gJiAqcCkgPj4gMzsKKyAgICAgICAgICAgICAgICAgb2N0YTMgPSAoTE9XX1RXTyAmICpwKTsKKyAgICAgICAgICAgICAgICAgY2FycnkgPSAwOworICAgIAkgICAgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlbyIsIG9jdGExKTsKKyAgICAJICAgICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJW8iLCBvY3RhMik7CisgICAgCSAgICAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiVvIiwgb2N0YTMpOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgIGVycm9yKCAiSW50ZXJuYWwgZXJyb3IgaW4gb2N0YWwgY29udmVyc2lvbjsiICk7CisgICAgICAgICAgfQorCisgICAgICAgICAgY3ljbGUrKzsKKyAgICAgICAgICBjeWNsZSA9IGN5Y2xlICUgQklUU19JTl9PQ1RBTDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZm9yIChwID0gdmFsYWRkciArIGxlbiAtIDE7CisJICAgcCA+PSB2YWxhZGRyOworCSAgIHAtLSkKKwl7CisgICAgICAgICAgc3dpdGNoIChjeWNsZSkgeworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgIC8qIENhcnJ5IG91dCwgbm8gY2FycnkgaW4gKi8KKyAgICAgICAgICAgICAgICAgb2N0YTEgPSAoSElHSF9aRVJPICAmICpwKSA+PiA1OworICAgICAgICAgICAgICAgICBvY3RhMiA9IChMT1dfWkVSTyAgICYgKnApID4+IDI7CisgICAgICAgICAgICAgICAgIGNhcnJ5ID0gKENBUlJZX1pFUk8gJiAqcCk7CisgICAgCSAgICAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiVvIiwgb2N0YTEpOworICAgIAkgICAgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlbyIsIG9jdGEyKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAvKiBDYXJyeSBpbiwgY2Fycnkgb3V0ICovCisgICAgICAgICAgICAgICAgIG9jdGExID0gKGNhcnJ5IDw8IDEpIHwgKChISUdIX09ORSAmICpwKSA+PiA3KTsKKyAgICAgICAgICAgICAgICAgb2N0YTIgPSAoTUlEX09ORSAgICYgKnApID4+IDQ7CisgICAgICAgICAgICAgICAgIG9jdGEzID0gKExPV19PTkUgICAmICpwKSA+PiAxOworICAgICAgICAgICAgICAgICBjYXJyeSA9IChDQVJSWV9PTkUgJiAqcCk7CisgICAgCSAgICAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiVvIiwgb2N0YTEpOworICAgIAkgICAgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlbyIsIG9jdGEyKTsKKyAgICAJICAgICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJW8iLCBvY3RhMyk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgLyogQ2FycnkgaW4sIG5vIGNhcnJ5IG91dCAqLworICAgICAgICAgICAgICAgICBvY3RhMSA9IChjYXJyeSA8PCAyKSB8ICgoSElHSF9UV08gJiAqcCkgPj4gNik7CisgICAgICAgICAgICAgICAgIG9jdGEyID0gKE1JRF9UV08gJiAqcCkgPj4gMzsKKyAgICAgICAgICAgICAgICAgb2N0YTMgPSAoTE9XX1RXTyAmICpwKTsKKyAgICAgICAgICAgICAgICAgY2FycnkgPSAwOworICAgICAJICAgICAgICAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiJW8iLCBvY3RhMSk7CisgICAgCSAgICAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiVvIiwgb2N0YTIpOworICAgIAkgICAgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlbyIsIG9jdGEzKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICBlcnJvciggIkludGVybmFsIGVycm9yIGluIG9jdGFsIGNvbnZlcnNpb247IiApOworICAgICAgICAgIH0KKworICAgICAgICAgIGN5Y2xlKys7CisgICAgICAgICAgY3ljbGUgPSBjeWNsZSAlIEJJVFNfSU5fT0NUQUw7CisJfQorICAgIH0KKworICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sIGxvY2FsX29jdGFsX2Zvcm1hdF9zdWZmaXggKCkpOworfQorCisvKiBWQUxBRERSIHBvaW50cyB0byBhbiBpbnRlZ2VyIG9mIExFTiBieXRlcy4KKyAqIFByaW50IGl0IGluIGRlY2ltYWwgb24gc3RyZWFtIG9yIGZvcm1hdCBpdCBpbiBidWYuCisgKi8KK3ZvaWQKK3ByaW50X2RlY2ltYWxfY2hhcnMgKHN0cmVhbSwgdmFsYWRkciwgbGVuKQorICAgICBHREJfRklMRSAqc3RyZWFtOworICAgICB1bnNpZ25lZCBjaGFyICp2YWxhZGRyOworICAgICB1bnNpZ25lZCBsZW47Cit7CisjZGVmaW5lIFRFTiAgICAgICAgICAgICAxMAorI2RlZmluZSBUV09fVE9fRk9VUlRIICAgMTYKKyNkZWZpbmUgQ0FSUllfT1VUKCAgeCApICgoeCkgLyBURU4pICAvKiBleHRlbmQgY2hhciB0byBpbnQgKi8KKyNkZWZpbmUgQ0FSUllfTEVGVCggeCApICgoeCkgJSBURU4pCisjZGVmaW5lIFNISUZUKCB4ICkgICAgICAoKHgpIDw8IDQpCisjZGVmaW5lIFNUQVJUX1AgXAorICAgICAgICAoKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pID8gdmFsYWRkciA6IHZhbGFkZHIgKyBsZW4gLSAxKQorI2RlZmluZSBOT1RfRU5EX1AgXAorICAgICAgICAoKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pID8gKHAgPCB2YWxhZGRyICsgbGVuKSA6IChwID49IHZhbGFkZHIpKQorI2RlZmluZSBORVhUX1AgXAorICAgICAgICAoKFRBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pID8gcCsrIDogcC0tICkKKyNkZWZpbmUgTE9XX05JQkJMRSggIHggKSAoICh4KSAmIDB4MDBGKQorI2RlZmluZSBISUdIX05JQkJMRSggeCApICgoKHgpICYgMHgwRjApID4+IDQpCisKKyAgdW5zaWduZWQgY2hhciAqcDsKKyAgdW5zaWduZWQgY2hhciAqZGlnaXRzOworICBpbnQgICAgICAgICAgICBjYXJyeTsKKyAgaW50ICAgICAgICAgICAgZGVjaW1hbF9sZW47CisgIGludCAgICAgICAgICAgIGksIGosIGRlY2ltYWxfZGlnaXRzOworICBpbnQgICAgICAgICAgICBkdW1teTsKKyAgaW50ICAgICAgICAgICAgZmxpcDsKKyAgCisgIC8qIEJhc2UtdGVuIG51bWJlciBpcyBsZXNzIHRoYW4gdHdpY2UgYXMgbWFueSBkaWdpdHMKKyAgICogYXMgdGhlIGJhc2UgMTYgbnVtYmVyLCB3aGljaCBpcyAyIGRpZ2l0cyBwZXIgYnl0ZS4KKyAgICovCisgIGRlY2ltYWxfbGVuID0gbGVuICogMiAqIDI7CisgIGRpZ2l0cyA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyggZGVjaW1hbF9sZW4gKTsKKyAgaWYoIGRpZ2l0cyA9PSBOVUxMICkKKyAgICAgIGVycm9yKCAiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjb252ZXJzaW9uIHRvIGRlY2ltYWwuIiApOworCisgIGZvciggaSA9IDA7IGkgPCBkZWNpbWFsX2xlbjsgaSsrICkgeworICAgICAgZGlnaXRzW2ldID0gMDsKKyAgfQorCisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgbG9jYWxfZGVjaW1hbF9mb3JtYXRfcHJlZml4ICgpKTsKKworICAvKiBPaywgd2UgaGF2ZSBhbiB1bmtub3duIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHRvIGJlIHByaW50ZWQgaW4KKyAgICogZGVjaW1hbC4KKyAgICoKKyAgICogR2l2ZW4gYSBoZXggbnVtYmVyIChpbiBuaWJibGVzKSBhcyBYWVosIHdlIHN0YXJ0IGJ5IHRha2luZyBYIGFuZAorICAgKiBkZWNlbWFsaXppbmcgaXQgYXMgIngxIHgyIiBpbiB0d28gZGVjaW1hbCBuaWJibGVzLiAgVGhlbiB3ZSBtdWx0aXBseQorICAgKiB0aGUgbmliYmxlcyBieSAxNiwgYWRkIFkgYW5kIHJlLWRlY2ltYWxpemUuICBSZXBlYXQgd2l0aCBaLgorICAgKgorICAgKiBUaGUgdHJpY2sgaXMgdGhhdCAiZGlnaXRzIiBob2xkcyBhIGJhc2UtMTAgbnVtYmVyLCBidXQgc29tZXRpbWVzCisgICAqIHRoZSBpbmRpdmlkdWFsIGRpZ2l0cyBhcmUgPiAxMC4gCisgICAqCisgICAqIE91dGVyIGxvb3AgaXMgcGVyIG5pYmJsZSAoaGV4IGRpZ2l0KSBvZiBpbnB1dCwgZnJvbSBNU0QgZW5kIHRvCisgICAqIExTRCBlbmQuCisgICAqLworICBkZWNpbWFsX2RpZ2l0cyA9IDA7ICAvKiBOdW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMgc28gZmFyICovCisgIHAgPSBTVEFSVF9QOworICBmbGlwID0gMDsKKyAgd2hpbGUoIE5PVF9FTkRfUCApIHsKKyAgICAgIC8qCisgICAgICAgKiBNdWx0aXBseSBjdXJyZW50IGJhc2UtdGVuIG51bWJlciBieSAxNiBpbiBwbGFjZS4KKyAgICAgICAqIEVhY2ggZGlnaXQgd2FzIGJldHdlZW4gMCBhbmQgOSwgbm93IGlzIGJldHdlZW4KKyAgICAgICAqIDAgYW5kIDE0NC4KKyAgICAgICAqLworICAgICAgZm9yKCBqID0gMDsgaiA8IGRlY2ltYWxfZGlnaXRzOyBqKysgKSB7CisgICAgICAgICAgIGRpZ2l0c1tqXSA9IFNISUZUKCBkaWdpdHNbal0gKTsKKyAgICAgIH0KKyAgICAKKyAgICAgIC8qIFRha2UgdGhlIG5leHQgbmliYmxlIG9mZiB0aGUgaW5wdXQgYW5kIGFkZCBpdCB0byB3aGF0CisgICAgICAgKiB3ZSd2ZSBnb3QgaW4gdGhlIExTQiBwb3NpdGlvbi4gIEJvdHRvbSAnZGlnaXQnIGlzIG5vdworICAgICAgICogYmV0d2VlbiAwIGFuZCAxNTkuCisgICAgICAgKgorICAgICAgICogImZsaXAiIGlzIHVzZWQgdG8gcnVuIHRoaXMgbG9vcCB0d2ljZSBmb3IgZWFjaCBieXRlLgorICAgICAgICovCisgICAgICBpZiggZmxpcCA9PSAwICkgeworICAgICAgICAgIC8qIFRha2UgdG9wIG5pYmJsZS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBkaWdpdHNbMF0gKz0gSElHSF9OSUJCTEUoICpwICk7CisgICAgICAgICAgZmxpcCA9IDE7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgICAvKiBUYWtlIGxvdyBuaWJibGUgYW5kIGJ1bXAgb3VyIHBvaW50ZXIgInAiLgorICAgICAgICAgICAqLworICAgICAgICAgIGRpZ2l0c1swXSArPSBMT1dfTklCQkxFKCAqcCApOworICAgICAgICAgIE5FWFRfUDsKKyAgICAgICAgICBmbGlwID0gMDsKKyAgICAgIH0KKworICAgICAgLyogUmUtZGVjaW1hbGl6ZS4gIFdlIGhhdmUgdG8gZG8gdGhpcyBvZnRlbiBlbm91Z2gKKyAgICAgICAqIHRoYXQgd2UgZG9uJ3Qgb3ZlcmZsb3csIGJ1dCBvbmNlIHBlciBuaWJibGUgaXMKKyAgICAgICAqIG92ZXJraWxsLiAgRWFzaWVyIHRoaXMgd2F5LCB0aG91Z2guICBOb3RlIHRoYXQgdGhlCisgICAgICAgKiBjYXJyeSBpcyBvZnRlbiBsYXJnZXIgdGhhbiAxMCAoZS5nLiBtYXggaW5pdGlhbAorICAgICAgICogY2Fycnkgb3V0IG9mIGxvd2VzdCBuaWJibGUgaXMgMTUsIGNvdWxkIGJ1YmJsZSBhbGwKKyAgICAgICAqIHRoZSB3YXkgdXAgZ3JlYXRlciB0aGFuIDEwKS4gIFNvIHdlIGhhdmUgdG8gZG8KKyAgICAgICAqIHRoZSBjYXJyeWluZyBiZXlvbmQgdGhlIGxhc3QgY3VycmVudCBkaWdpdC4KKyAgICAgICAqLworICAgICAgY2FycnkgPSAwOworICAgICAgZm9yKCBqID0gMDsgaiA8IGRlY2ltYWxfbGVuIC0gMTsgaisrICkgeworICAgICAgICAgIGRpZ2l0c1tqXSArPSBjYXJyeTsKKworICAgICAgICAgIC8qICIvIiB3b24ndCBoYW5kbGUgYW4gdW5zaWduZWQgY2hhciB3aXRoCisgICAgICAgICAgICogYSB2YWx1ZSB0aGF0IGlmIHNpZ25lZCB3b3VsZCBiZSBuZWdhdGl2ZS4KKyAgICAgICAgICAgKiBTbyBleHRlbmQgdG8gbG9uZ3dvcmQgaW50IHZpYSAiZHVtbXkiLgorICAgICAgICAgICAqLworICAgICAgICAgIGR1bW15ICAgICA9IGRpZ2l0c1tqXTsKKyAgICAgICAgICBjYXJyeSAgICAgPSBDQVJSWV9PVVQoICBkdW1teSApOworICAgICAgICAgIGRpZ2l0c1tqXSA9IENBUlJZX0xFRlQoIGR1bW15ICk7CisKKyAgICAgICAgICBpZiggaiA+PSBkZWNpbWFsX2RpZ2l0cyAmJiBjYXJyeSA9PSAwICkgeworICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgKiBBbGwgaGlnaGVyIGRpZ2l0cyBhcmUgMCBhbmQgd2UKKyAgICAgICAgICAgICAgICogbm8gbG9uZ2VyIGhhdmUgYSBjYXJyeS4KKyAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICogTm90ZTogImoiIGlzIDAtYmFzZWQsICJkZWNpbWFsX2RpZ2l0cyIgaXMKKyAgICAgICAgICAgICAgICogICAgICAgMS1iYXNlZC4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGRlY2ltYWxfZGlnaXRzID0gaiArIDE7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgfQorCisgIC8qIE9rLCBub3cgImRpZ2l0cyIgaXMgdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24sIHdpdGgKKyAgICogdGhlICJkZWNpbWFsX2RpZ2l0cyIgYWN0dWFsIGRpZ2l0cy4gIFByaW50IQorICAgKi8KKyAgZm9yKCBpID0gZGVjaW1hbF9kaWdpdHMgLSAxOyBpID49IDA7IGktLSApIHsKKyAgICAgIGZwcmludGZfZmlsdGVyZWQoIHN0cmVhbSwgIiUxZCIsIGRpZ2l0c1tpXSApOworICB9CisgIGZyZWUoIGRpZ2l0cyApOworICAKKyAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCBsb2NhbF9kZWNpbWFsX2Zvcm1hdF9zdWZmaXggKCkpOworfQorCisvKiBWQUxBRERSIHBvaW50cyB0byBhbiBpbnRlZ2VyIG9mIExFTiBieXRlcy4gIFByaW50IGl0IGluIGhleCBvbiBzdHJlYW0uICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfaGV4X2NoYXJzIChzdHJlYW0sIHZhbGFkZHIsIGxlbikKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgdW5zaWduZWQgY2hhciAqdmFsYWRkcjsKKyAgICAgdW5zaWduZWQgbGVuOworeworICB1bnNpZ25lZCBjaGFyICpwOworCisgIC8qIEZJWE1FOiBXZSBzaG91bGQgYmUgbm90IHByaW50aW5nIGxlYWRpbmcgemVyb2VzIGluIG1vc3QgY2FzZXMuICAqLworCisgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgbG9jYWxfaGV4X2Zvcm1hdF9wcmVmaXggKCkpOworICBpZiAoVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKKyAgICB7CisgICAgICBmb3IgKHAgPSB2YWxhZGRyOworCSAgIHAgPCB2YWxhZGRyICsgbGVuOworCSAgIHArKykKKwl7CisJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIlMDJ4IiwgKnApOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKHAgPSB2YWxhZGRyICsgbGVuIC0gMTsKKwkgICBwID49IHZhbGFkZHI7CisJICAgcC0tKQorCXsKKwkgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIiUwMngiLCAqcCk7CisJfQorICAgIH0KKyAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCBsb2NhbF9oZXhfZm9ybWF0X3N1ZmZpeCAoKSk7Cit9CisKKy8qICBDYWxsZWQgYnkgdmFyaW91cyA8bGFuZz5fdmFsX3ByaW50IHJvdXRpbmVzIHRvIHByaW50IGVsZW1lbnRzIG9mIGFuCisgICAgYXJyYXkgaW4gdGhlIGZvcm0gIjxlbGVtMT4sIDxlbGVtMj4sIDxlbGVtMz4sIC4uLiIuCisKKyAgICAoRklYTUU/KSAgQXNzdW1lcyBhcnJheSBlbGVtZW50IHNlcGFyYXRvciBpcyBhIGNvbW1hLCB3aGljaCBpcyBjb3JyZWN0CisgICAgZm9yIGFsbCBsYW5ndWFnZXMgY3VycmVudGx5IGhhbmRsZWQuCisgICAgKEZJWE1FPykgIFNvbWUgbGFuZ3VhZ2VzIGhhdmUgYSBub3RhdGlvbiBmb3IgcmVwZWF0ZWQgYXJyYXkgZWxlbWVudHMsCisgICAgcGVyaGFwcyB3ZSBzaG91bGQgdHJ5IHRvIHVzZSB0aGF0IG5vdGF0aW9uIHdoZW4gYXBwcm9wcmlhdGUuCisgICAgKi8KKwordm9pZAordmFsX3ByaW50X2FycmF5X2VsZW1lbnRzICh0eXBlLCB2YWxhZGRyLCBhZGRyZXNzLCBzdHJlYW0sIGZvcm1hdCwgZGVyZWZfcmVmLAorCQkJICByZWN1cnNlLCBwcmV0dHksIGkpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBjaGFyICp2YWxhZGRyOworICAgICBDT1JFX0FERFIgYWRkcmVzczsKKyAgICAgR0RCX0ZJTEUgKnN0cmVhbTsKKyAgICAgaW50IGZvcm1hdDsKKyAgICAgaW50IGRlcmVmX3JlZjsKKyAgICAgaW50IHJlY3Vyc2U7CisgICAgIGVudW0gdmFsX3ByZXR0eXByaW50IHByZXR0eTsKKyAgICAgdW5zaWduZWQgaW50IGk7Cit7CisgIHVuc2lnbmVkIGludCB0aGluZ3NfcHJpbnRlZCA9IDA7CisgIHVuc2lnbmVkIGxlbjsKKyAgc3RydWN0IHR5cGUgKmVsdHR5cGU7CisgIHVuc2lnbmVkIGVsdGxlbjsKKyAgLyogUG9zaXRpb24gb2YgdGhlIGFycmF5IGVsZW1lbnQgd2UgYXJlIGV4YW1pbmluZyB0byBzZWUKKyAgICAgd2hldGhlciBpdCBpcyByZXBlYXRlZC4gICovCisgIHVuc2lnbmVkIGludCByZXAxOworICAvKiBOdW1iZXIgb2YgcmVwZXRpdGlvbnMgd2UgaGF2ZSBkZXRlY3RlZCBzbyBmYXIuICAqLworICB1bnNpZ25lZCBpbnQgcmVwczsKKyAgICAgIAorICBlbHR0eXBlID0gVFlQRV9UQVJHRVRfVFlQRSAodHlwZSk7CisgIGVsdGxlbiA9IFRZUEVfTEVOR1RIIChjaGVja190eXBlZGVmIChlbHR0eXBlKSk7CisgIGxlbiA9IFRZUEVfTEVOR1RIICh0eXBlKSAvIGVsdGxlbjsKKworICBhbm5vdGF0ZV9hcnJheV9zZWN0aW9uX2JlZ2luIChpLCBlbHR0eXBlKTsKKworICBmb3IgKDsgaSA8IGxlbiAmJiB0aGluZ3NfcHJpbnRlZCA8IHByaW50X21heDsgaSsrKQorICAgIHsKKyAgICAgIGlmIChpICE9IDApCisJeworCSAgaWYgKHByZXR0eXByaW50X2FycmF5cykKKwkgICAgeworCSAgICAgIGZwcmludGZfZmlsdGVyZWQgKHN0cmVhbSwgIixcbiIpOworCSAgICAgIHByaW50X3NwYWNlc19maWx0ZXJlZCAoMiArIDIgKiByZWN1cnNlLCBzdHJlYW0pOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIsICIpOworCSAgICB9CisJfQorICAgICAgd3JhcF9oZXJlIChuX3NwYWNlcyAoMiArIDIgKiByZWN1cnNlKSk7CisKKyAgICAgIHJlcDEgPSBpICsgMTsKKyAgICAgIHJlcHMgPSAxOworICAgICAgd2hpbGUgKChyZXAxIDwgbGVuKSAmJiAKKwkgICAgICFtZW1jbXAgKHZhbGFkZHIgKyBpICogZWx0bGVuLCB2YWxhZGRyICsgcmVwMSAqIGVsdGxlbiwgZWx0bGVuKSkKKwl7CisJICArK3JlcHM7CisJICArK3JlcDE7CisJfQorCisgICAgICBpZiAocmVwcyA+IHJlcGVhdF9jb3VudF90aHJlc2hvbGQpCisJeworCSAgdmFsX3ByaW50IChlbHR0eXBlLCB2YWxhZGRyICsgaSAqIGVsdGxlbiwgMCwgMCwgc3RyZWFtLCBmb3JtYXQsCisJCSAgICAgZGVyZWZfcmVmLCByZWN1cnNlICsgMSwgcHJldHR5KTsKKwkgIGFubm90YXRlX2VsdF9yZXAgKHJlcHMpOworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiIDxyZXBlYXRzICV1IHRpbWVzPiIsIHJlcHMpOworCSAgYW5ub3RhdGVfZWx0X3JlcF9lbmQgKCk7CisKKwkgIGkgPSByZXAxIC0gMTsKKwkgIHRoaW5nc19wcmludGVkICs9IHJlcGVhdF9jb3VudF90aHJlc2hvbGQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHZhbF9wcmludCAoZWx0dHlwZSwgdmFsYWRkciArIGkgKiBlbHRsZW4sIDAsIDAsIHN0cmVhbSwgZm9ybWF0LAorCQkgICAgIGRlcmVmX3JlZiwgcmVjdXJzZSArIDEsIHByZXR0eSk7CisJICBhbm5vdGF0ZV9lbHQgKCk7CisJICB0aGluZ3NfcHJpbnRlZCsrOworCX0KKyAgICB9CisgIGFubm90YXRlX2FycmF5X3NlY3Rpb25fZW5kICgpOworICBpZiAoaSA8IGxlbikKKyAgICB7CisgICAgICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIuLi4iKTsKKyAgICB9Cit9CisKKy8qICBQcmludCBhIHN0cmluZyBmcm9tIHRoZSBpbmZlcmlvciwgc3RhcnRpbmcgYXQgQUREUiBhbmQgcHJpbnRpbmcgdXAgdG8gTEVOCisgICAgY2hhcmFjdGVycywgb2YgV0lEVEggYnl0ZXMgYSBwaWVjZSwgdG8gU1RSRUFNLiAgSWYgTEVOIGlzIC0xLCBwcmludGluZworICAgIHN0b3BzIGF0IHRoZSBmaXJzdCBudWxsIGJ5dGUsIG90aGVyd2lzZSBwcmludGluZyBwcm9jZWVkcyAoaW5jbHVkaW5nIG51bGwKKyAgICBieXRlcykgdW50aWwgZWl0aGVyIHByaW50X21heCBvciBMRU4gY2hhcmFjdGVycyBoYXZlIGJlZW4gcHJpbnRlZCwKKyAgICB3aGljaGV2ZXIgaXMgc21hbGxlci4gKi8KKworLyogRklYTUU6IFVzZSB0YXJnZXRfcmVhZF9zdHJpbmcuICAqLworCitpbnQKK3ZhbF9wcmludF9zdHJpbmcgKGFkZHIsIGxlbiwgd2lkdGgsIHN0cmVhbSkKKyAgICBDT1JFX0FERFIgYWRkcjsKKyAgICBpbnQgbGVuOworICAgIGludCB3aWR0aDsKKyAgICBHREJfRklMRSAqc3RyZWFtOworeworICBpbnQgZm9yY2VfZWxsaXBzaXMgPSAwOwkvKiBGb3JjZSBlbGxpcHNpcyB0byBiZSBwcmludGVkIGlmIG5vbnplcm8uICovCisgIGludCBlcnJjb2RlOwkJCS8qIEVycm5vIHJldHVybmVkIGZyb20gYmFkIHJlYWRzLiAqLworICB1bnNpZ25lZCBpbnQgZmV0Y2hsaW1pdDsJLyogTWF4aW11bSBudW1iZXIgb2YgY2hhcnMgdG8gcHJpbnQuICovCisgIHVuc2lnbmVkIGludCBuZmV0Y2g7CQkvKiBDaGFycyB0byBmZXRjaCAvIGNoYXJzIGZldGNoZWQuICovCisgIHVuc2lnbmVkIGludCBjaHVua3NpemU7CS8qIFNpemUgb2YgZWFjaCBmZXRjaCwgaW4gY2hhcnMuICovCisgIGNoYXIgKmJ1ZmZlciA9IE5VTEw7CQkvKiBEeW5hbWljYWxseSBncm93YWJsZSBmZXRjaCBidWZmZXIuICovCisgIGNoYXIgKmJ1ZnB0cjsJCQkvKiBQb2ludGVyIHRvIG5leHQgYXZhaWxhYmxlIGJ5dGUgaW4gYnVmZmVyLiAqLworICBjaGFyICpsaW1pdDsJCQkvKiBGaXJzdCBsb2NhdGlvbiBwYXN0IGVuZCBvZiBmZXRjaCBidWZmZXIuICovCisgIHN0cnVjdCBjbGVhbnVwICpvbGRfY2hhaW4gPSBOVUxMOyAvKiBUb3Agb2YgdGhlIG9sZCBjbGVhbnVwIGNoYWluLiAqLworICBpbnQgZm91bmRfbnVsOwkJLyogTm9uLXplcm8gaWYgd2UgZm91bmQgdGhlIG51bCBjaGFyICovCisKKyAgLyogRmlyc3Qgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2UgYXJlCisgICAgIGdvaW5nIHRvIGF0dGVtcHQgdG8gZmV0Y2ggYW5kIHByaW50LiAgVGhpcyBpcyBhY3R1YWxseSBwcmV0dHkgc2ltcGxlLiAgSWYKKyAgICAgTEVOID49IHplcm8sIHRoZW4gdGhlIGxpbWl0IGlzIHRoZSBtaW5pbXVtIG9mIExFTiBhbmQgcHJpbnRfbWF4LiAgSWYKKyAgICAgTEVOIGlzIC0xLCB0aGVuIHRoZSBsaW1pdCBpcyBwcmludF9tYXguICBUaGlzIGlzIHRydWUgcmVnYXJkbGVzcyBvZgorICAgICB3aGV0aGVyIHByaW50X21heCBpcyB6ZXJvLCBVSU5UX01BWCAodW5saW1pdGVkKSwgb3Igc29tZXRoaW5nIGluIGJldHdlZW4sCisgICAgIGJlY2F1c2UgZmluZGluZyB0aGUgbnVsbCBieXRlIChvciBhdmFpbGFibGUgbWVtb3J5KSBpcyB3aGF0IGFjdHVhbGx5CisgICAgIGxpbWl0cyB0aGUgZmV0Y2guICovCisKKyAgZmV0Y2hsaW1pdCA9IChsZW4gPT0gLTEgPyBwcmludF9tYXggOiBtaW4gKGxlbiwgcHJpbnRfbWF4KSk7CisKKyAgLyogTm93IGRlY2lkZSBob3cgbGFyZ2Ugb2YgY2h1bmtzIHRvIHRyeSB0byByZWFkIGluIG9uZSBvcGVyYXRpb24uICBUaGlzCisgICAgIGlzIGFsc28gcHJldHR5IHNpbXBsZS4gIElmIExFTiA+PSB6ZXJvLCB0aGVuIHdlIHdhbnQgZmV0Y2hsaW1pdCBjaGFycywKKyAgICAgc28gd2UgbWlnaHQgYXMgd2VsbCByZWFkIHRoZW0gYWxsIGluIG9uZSBvcGVyYXRpb24uICBJZiBMRU4gaXMgLTEsIHdlCisgICAgIGFyZSBsb29raW5nIGZvciBhIG51bGwgdGVybWluYXRvciB0byBlbmQgdGhlIGZldGNoaW5nLCBzbyB3ZSBtaWdodCBhcworICAgICB3ZWxsIHJlYWQgaW4gYmxvY2tzIHRoYXQgYXJlIGxhcmdlIGVub3VnaCB0byBiZSBlZmZpY2llbnQsIGJ1dCBub3Qgc28KKyAgICAgbGFyZ2UgYXMgdG8gYmUgc2xvdyBpZiBmZXRjaGxpbWl0IGhhcHBlbnMgdG8gYmUgbGFyZ2UuICBTbyB3ZSBjaG9vc2UgdGhlCisgICAgIG1pbmltdW0gb2YgOCBhbmQgZmV0Y2hsaW1pdC4gIFdlIHVzZWQgdG8gdXNlIDIwMCBpbnN0ZWFkIG9mIDggYnV0CisgICAgIDIwMCBpcyB3YXkgdG9vIGJpZyBmb3IgcmVtb3RlIGRlYnVnZ2luZyBvdmVyIGEgc2VyaWFsIGxpbmUuICAqLworCisgIGNodW5rc2l6ZSA9IChsZW4gPT0gLTEgPyBtaW4gKDgsIGZldGNobGltaXQpIDogZmV0Y2hsaW1pdCk7CisKKyAgLyogTG9vcCB1bnRpbCB3ZSBlaXRoZXIgaGF2ZSBhbGwgdGhlIGNoYXJhY3RlcnMgdG8gcHJpbnQsIG9yIHdlIGVuY291bnRlcgorICAgICBzb21lIGVycm9yLCBzdWNoIGFzIGJ1bXBpbmcgaW50byB0aGUgZW5kIG9mIHRoZSBhZGRyZXNzIHNwYWNlLiAqLworCisgIGZvdW5kX251bCA9IDA7CisgIG9sZF9jaGFpbiA9IG1ha2VfY2xlYW51cCAobnVsbF9jbGVhbnVwLCAwKTsKKworICBpZiAobGVuID4gMCkKKyAgICB7CisgICAgICBidWZmZXIgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKiB3aWR0aCk7CisgICAgICBidWZwdHIgPSBidWZmZXI7CisgICAgICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKGZyZWUsIGJ1ZmZlcik7CisKKyAgICAgIG5mZXRjaCA9IHRhcmdldF9yZWFkX21lbW9yeV9wYXJ0aWFsIChhZGRyLCBidWZwdHIsIGxlbiAqIHdpZHRoLCAmZXJyY29kZSkKKwkvIHdpZHRoOworICAgICAgYWRkciArPSBuZmV0Y2ggKiB3aWR0aDsKKyAgICAgIGJ1ZnB0ciArPSBuZmV0Y2ggKiB3aWR0aDsKKyAgICB9CisgIGVsc2UgaWYgKGxlbiA9PSAtMSkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGJ1ZnNpemUgPSAwOworICAgICAgZG8KKwl7CisJICBRVUlUOworCSAgbmZldGNoID0gbWluIChjaHVua3NpemUsIGZldGNobGltaXQgLSBidWZzaXplKTsKKworCSAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorCSAgICBidWZmZXIgPSAoY2hhciAqKSB4bWFsbG9jIChuZmV0Y2ggKiB3aWR0aCk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBkaXNjYXJkX2NsZWFudXBzIChvbGRfY2hhaW4pOworCSAgICAgIGJ1ZmZlciA9IChjaGFyICopIHhyZWFsbG9jIChidWZmZXIsIChuZmV0Y2ggKyBidWZzaXplKSAqIHdpZHRoKTsKKwkgICAgfQorCisJICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKGZyZWUsIGJ1ZmZlcik7CisJICBidWZwdHIgPSBidWZmZXIgKyBidWZzaXplICogd2lkdGg7CisJICBidWZzaXplICs9IG5mZXRjaDsKKworCSAgLyogUmVhZCBhcyBtdWNoIGFzIHdlIGNhbi4gKi8KKwkgIG5mZXRjaCA9IHRhcmdldF9yZWFkX21lbW9yeV9wYXJ0aWFsIChhZGRyLCBidWZwdHIsIG5mZXRjaCAqIHdpZHRoLCAmZXJyY29kZSkKKwkJICAgLyB3aWR0aDsKKworCSAgLyogU2NhbiB0aGlzIGNodW5rIGZvciB0aGUgbnVsbCBieXRlIHRoYXQgdGVybWluYXRlcyB0aGUgc3RyaW5nCisJICAgICB0byBwcmludC4gIElmIGZvdW5kLCB3ZSBkb24ndCBuZWVkIHRvIGZldGNoIGFueSBtb3JlLiAgTm90ZQorCSAgICAgdGhhdCBidWZwdHIgaXMgZXhwbGljaXRseSBsZWZ0IHBvaW50aW5nIGF0IHRoZSBuZXh0IGNoYXJhY3RlcgorCSAgICAgYWZ0ZXIgdGhlIG51bGwgYnl0ZSwgb3IgYXQgdGhlIG5leHQgY2hhcmFjdGVyIGFmdGVyIHRoZSBlbmQgb2YKKwkgICAgIHRoZSBidWZmZXIuICovCisKKwkgIGxpbWl0ID0gYnVmcHRyICsgbmZldGNoICogd2lkdGg7CisJICB3aGlsZSAoYnVmcHRyIDwgbGltaXQpCisJICAgIHsKKwkgICAgICB1bnNpZ25lZCBsb25nIGM7CisKKwkgICAgICBjID0gZXh0cmFjdF91bnNpZ25lZF9pbnRlZ2VyIChidWZwdHIsIHdpZHRoKTsKKwkgICAgICBhZGRyICs9IHdpZHRoOworCSAgICAgIGJ1ZnB0ciArPSB3aWR0aDsKKwkgICAgICBpZiAoYyA9PSAwKQorCQl7CisJCSAgLyogV2UgZG9uJ3QgY2FyZSBhYm91dCBhbnkgZXJyb3Igd2hpY2ggaGFwcGVuZWQgYWZ0ZXIKKwkJICAgICB0aGUgTlVMTCB0ZXJtaW5hdG9yLiAgKi8KKwkJICBlcnJjb2RlID0gMDsKKwkJICBmb3VuZF9udWwgPSAxOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgd2hpbGUgKGVycmNvZGUgPT0gMAkJCQkgICAgICAvKiBubyBlcnJvciAqLworCSAgICYmIGJ1ZnB0ciAtIGJ1ZmZlciA8IGZldGNobGltaXQgKiB3aWR0aCAgIC8qIG5vIG92ZXJydW4gKi8KKwkgICAmJiAhZm91bmRfbnVsKTsJCQkgICAgICAvKiBoYXZlbid0IGZvdW5kIG51bCB5ZXQgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CQkJCS8qIGxlbmd0aCBvZiBzdHJpbmcgaXMgcmVhbGx5IDAhICovCisgICAgICBidWZmZXIgPSBidWZwdHIgPSBOVUxMOworICAgICAgZXJyY29kZSA9IDA7CisgICAgfQorCisgIC8qIGJ1ZnB0ciBhbmQgYWRkciBub3cgcG9pbnQgaW1tZWRpYXRlbHkgYmV5b25kIHRoZSBsYXN0IGJ5dGUgd2hpY2ggd2UKKyAgICAgY29uc2lkZXIgcGFydCBvZiB0aGUgc3RyaW5nIChpbmNsdWRpbmcgYSAnXDAnIHdoaWNoIGVuZHMgdGhlIHN0cmluZykuICAqLworCisgIC8qIFdlIG5vdyBoYXZlIGVpdGhlciBzdWNjZXNzZnVsbHkgZmlsbGVkIHRoZSBidWZmZXIgdG8gZmV0Y2hsaW1pdCwgb3IKKyAgICAgdGVybWluYXRlZCBlYXJseSBkdWUgdG8gYW4gZXJyb3Igb3IgZmluZGluZyBhIG51bGwgY2hhciB3aGVuIExFTiBpcyAtMS4gKi8KKworICBpZiAobGVuID09IC0xICYmICFmb3VuZF9udWwpCisgICAgeworICAgICAgY2hhciAqcGVla2J1ZjsKKworICAgICAgLyogV2UgZGlkbid0IGZpbmQgYSBudWxsIHRlcm1pbmF0b3Igd2Ugd2VyZSBsb29raW5nIGZvci4gIEF0dGVtcHQKKwkgdG8gcGVlayBhdCB0aGUgbmV4dCBjaGFyYWN0ZXIuICBJZiBub3Qgc3VjY2Vzc2Z1bCwgb3IgaXQgaXMgbm90CisJIGEgbnVsbCBieXRlLCB0aGVuIGZvcmNlIGVsbGlwc2lzIHRvIGJlIHByaW50ZWQuICAqLworCisgICAgICBwZWVrYnVmID0gKGNoYXIgKikgYWxsb2NhICh3aWR0aCk7CisKKyAgICAgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkgKGFkZHIsIHBlZWtidWYsIHdpZHRoKSA9PSAwCisJICAmJiBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKHBlZWtidWYsIHdpZHRoKSAhPSAwKQorCWZvcmNlX2VsbGlwc2lzID0gMTsKKyAgICB9CisgIGVsc2UgaWYgKChsZW4gPj0gMCAmJiBlcnJjb2RlICE9IDApIHx8IChsZW4gPiAoYnVmcHRyIC0gYnVmZmVyKS93aWR0aCkpCisgICAgeworICAgICAgLyogR2V0dGluZyBhbiBlcnJvciB3aGVuIHdlIGhhdmUgYSByZXF1ZXN0ZWQgbGVuZ3RoLCBvciBmZXRjaGluZyBsZXNzCisJIHRoYW4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFjdHVhbGx5IHJlcXVlc3RlZCwgYWx3YXlzIG1ha2UgdXMKKwkgcHJpbnQgZWxsaXBzaXMuICovCisgICAgICBmb3JjZV9lbGxpcHNpcyA9IDE7CisgICAgfQorCisgIFFVSVQ7CisKKyAgLyogSWYgd2UgZ2V0IGFuIGVycm9yIGJlZm9yZSBmZXRjaGluZyBhbnl0aGluZywgZG9uJ3QgcHJpbnQgYSBzdHJpbmcuCisgICAgIEJ1dCBpZiB3ZSBmZXRjaCBzb21ldGhpbmcgYW5kIHRoZW4gZ2V0IGFuIGVycm9yLCBwcmludCB0aGUgc3RyaW5nCisgICAgIGFuZCB0aGVuIHRoZSBlcnJvciBtZXNzYWdlLiAgKi8KKyAgaWYgKGVycmNvZGUgPT0gMCB8fCBidWZwdHIgPiBidWZmZXIpCisgICAgeworICAgICAgaWYgKGFkZHJlc3NwcmludCkKKwl7CisJICBmcHV0c19maWx0ZXJlZCAoIiAiLCBzdHJlYW0pOworCX0KKyAgICAgIExBX1BSSU5UX1NUUklORyAoc3RyZWFtLCBidWZmZXIsIChidWZwdHIgLSBidWZmZXIpL3dpZHRoLCB3aWR0aCwgZm9yY2VfZWxsaXBzaXMpOworICAgIH0KKworICBpZiAoZXJyY29kZSAhPSAwKQorICAgIHsKKyAgICAgIGlmIChlcnJjb2RlID09IEVJTykKKwl7CisJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIgPEFkZHJlc3MgIik7CisJICBwcmludF9hZGRyZXNzX251bWVyaWMgKGFkZHIsIDEsIHN0cmVhbSk7CisJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICIgb3V0IG9mIGJvdW5kcz4iKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZnByaW50Zl9maWx0ZXJlZCAoc3RyZWFtLCAiIDxFcnJvciByZWFkaW5nIGFkZHJlc3MgIik7CisJICBwcmludF9hZGRyZXNzX251bWVyaWMgKGFkZHIsIDEsIHN0cmVhbSk7CisJICBmcHJpbnRmX2ZpbHRlcmVkIChzdHJlYW0sICI6ICVzPiIsIHNhZmVfc3RyZXJyb3IgKGVycmNvZGUpKTsKKwl9CisgICAgfQorICBnZGJfZmx1c2ggKHN0cmVhbSk7CisgIGRvX2NsZWFudXBzIChvbGRfY2hhaW4pOworICByZXR1cm4gKChidWZwdHIgLSBidWZmZXIpL3dpZHRoKTsKK30KKworDAorLyogVmFsaWRhdGUgYW4gaW5wdXQgb3Igb3V0cHV0IHJhZGl4IHNldHRpbmcsIGFuZCBtYWtlIHN1cmUgdGhlIHVzZXIKKyAgIGtub3dzIHdoYXQgdGhleSByZWFsbHkgZGlkIGhlcmUuICBSYWRpeCBzZXR0aW5nIGlzIGNvbmZ1c2luZywgZS5nLgorICAgc2V0dGluZyB0aGUgaW5wdXQgcmFkaXggdG8gIjEwIiBuZXZlciBjaGFuZ2VzIGl0ISAgKi8KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitzZXRfaW5wdXRfcmFkaXggKGFyZ3MsIGZyb21fdHR5LCBjKQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7CisgICAgIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjOworeworICBzZXRfaW5wdXRfcmFkaXhfMSAoZnJvbV90dHksICoodW5zaWduZWQgKiljLT52YXIpOworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK3NldF9pbnB1dF9yYWRpeF8xIChmcm9tX3R0eSwgcmFkaXgpCisgICAgIGludCBmcm9tX3R0eTsKKyAgICAgdW5zaWduZWQgcmFkaXg7Cit7CisgIC8qIFdlIGRvbid0IGN1cnJlbnRseSBkaXNhbGxvdyBhbnkgaW5wdXQgcmFkaXggZXhjZXB0IDAgb3IgMSwgd2hpY2ggZG9uJ3QKKyAgICAgbWFrZSBhbnkgbWF0aGVtYXRpY2FsIHNlbnNlLiAgSW4gdGhlb3J5LCB3ZSBjYW4gZGVhbCB3aXRoIGFueSBpbnB1dAorICAgICByYWRpeCBncmVhdGVyIHRoYW4gMSwgZXZlbiBpZiB3ZSBkb24ndCBoYXZlIHVuaXF1ZSBkaWdpdHMgZm9yIGV2ZXJ5CisgICAgIHZhbHVlIGZyb20gMCB0byByYWRpeC0xLCBidXQgaW4gcHJhY3RpY2Ugd2UgbG9zZSBvbiBsYXJnZSByYWRpeCB2YWx1ZXMuCisgICAgIFdlIHNob3VsZCBlaXRoZXIgZml4IHRoZSBsb3NzYWdlIG9yIHJlc3RyaWN0IHRoZSByYWRpeCByYW5nZSBtb3JlLgorICAgICAoRklYTUUpLiAqLworCisgIGlmIChyYWRpeCA8IDIpCisgICAgeworICAgICAgZXJyb3IgKCJOb25zZW5zZSBpbnB1dCByYWRpeCBgYGRlY2ltYWwgJXUnJzsgaW5wdXQgcmFkaXggdW5jaGFuZ2VkLiIsCisJICAgICByYWRpeCk7CisgICAgfQorICBpbnB1dF9yYWRpeCA9IHJhZGl4OworICBpZiAoZnJvbV90dHkpCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiSW5wdXQgcmFkaXggbm93IHNldCB0byBkZWNpbWFsICV1LCBoZXggJXgsIG9jdGFsICVvLlxuIiwKKwkJICAgICAgIHJhZGl4LCByYWRpeCwgcmFkaXgpOworICAgIH0KK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCitzZXRfb3V0cHV0X3JhZGl4IChhcmdzLCBmcm9tX3R0eSwgYykKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworICAgICBzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqYzsKK3sKKyAgc2V0X291dHB1dF9yYWRpeF8xIChmcm9tX3R0eSwgKih1bnNpZ25lZCAqKWMtPnZhcik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfb3V0cHV0X3JhZGl4XzEgKGZyb21fdHR5LCByYWRpeCkKKyAgICAgaW50IGZyb21fdHR5OworICAgICB1bnNpZ25lZCByYWRpeDsKK3sKKyAgLyogVmFsaWRhdGUgdGhlIHJhZGl4IGFuZCBkaXNhbGxvdyBvbmVzIHRoYXQgd2UgYXJlbid0IHByZXBhcmVkIHRvCisgICAgIGhhbmRsZSBjb3JyZWN0bHksIGxlYXZpbmcgdGhlIHJhZGl4IHVuY2hhbmdlZC4gKi8KKyAgc3dpdGNoIChyYWRpeCkKKyAgICB7CisgICAgY2FzZSAxNjoKKyAgICAgIG91dHB1dF9mb3JtYXQgPSAneCc7CQkvKiBoZXggKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICBvdXRwdXRfZm9ybWF0ID0gMDsJCS8qIGRlY2ltYWwgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIG91dHB1dF9mb3JtYXQgPSAnbyc7CQkvKiBvY3RhbCAqLworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yICgiVW5zdXBwb3J0ZWQgb3V0cHV0IHJhZGl4IGBgZGVjaW1hbCAldScnOyBvdXRwdXQgcmFkaXggdW5jaGFuZ2VkLiIsCisJICAgICByYWRpeCk7CisgICAgfQorICBvdXRwdXRfcmFkaXggPSByYWRpeDsKKyAgaWYgKGZyb21fdHR5KQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIk91dHB1dCByYWRpeCBub3cgc2V0IHRvIGRlY2ltYWwgJXUsIGhleCAleCwgb2N0YWwgJW8uXG4iLAorCQkgICAgICAgcmFkaXgsIHJhZGl4LCByYWRpeCk7CisgICAgfQorfQorCisvKiBTZXQgYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCByYWRpeCBhdCBvbmNlLiAgVHJ5IHRvIHNldCB0aGUgb3V0cHV0IHJhZGl4CisgICBmaXJzdCwgc2luY2UgaXQgaGFzIHRoZSBtb3N0IHJlc3RyaWN0aXZlIHJhbmdlLiAgQW4gcmFkaXggdGhhdCBpcyB2YWxpZCBhcworICAgYW4gb3V0cHV0IHJhZGl4IGlzIGFsc28gdmFsaWQgYXMgYW4gaW5wdXQgcmFkaXguCisKKyAgIEl0IG1heSBiZSB1c2VmdWwgdG8gaGF2ZSBhbiB1bnVzdWFsIGlucHV0IHJhZGl4LiAgSWYgdGhlIHVzZXIgd2lzaGVzIHRvCisgICBzZXQgYW4gaW5wdXQgcmFkaXggdGhhdCBpcyBub3QgdmFsaWQgYXMgYW4gb3V0cHV0IHJhZGl4LCBoZSBuZWVkcyB0byB1c2UKKyAgIHRoZSAnc2V0IGlucHV0LXJhZGl4JyBjb21tYW5kLiAqLworCitzdGF0aWMgdm9pZAorc2V0X3JhZGl4IChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgdW5zaWduZWQgcmFkaXg7CisKKyAgcmFkaXggPSAoYXJnID09IE5VTEwpID8gMTAgOiBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIChhcmcpOworICBzZXRfb3V0cHV0X3JhZGl4XzEgKDAsIHJhZGl4KTsKKyAgc2V0X2lucHV0X3JhZGl4XzEgKDAsIHJhZGl4KTsKKyAgaWYgKGZyb21fdHR5KQorICAgIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIklucHV0IGFuZCBvdXRwdXQgcmFkaWNlcyBub3cgc2V0IHRvIGRlY2ltYWwgJXUsIGhleCAleCwgb2N0YWwgJW8uXG4iLAorCQkgICAgICAgcmFkaXgsIHJhZGl4LCByYWRpeCk7CisgICAgfQorfQorCisvKiBTaG93IGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgcmFkaWNlcy4gKi8KKworLypBUkdTVVNFRCovCitzdGF0aWMgdm9pZAorc2hvd19yYWRpeCAoYXJnLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGlmIChmcm9tX3R0eSkKKyAgICB7CisgICAgICBpZiAoaW5wdXRfcmFkaXggPT0gb3V0cHV0X3JhZGl4KQorCXsKKwkgIHByaW50Zl9maWx0ZXJlZCAoIklucHV0IGFuZCBvdXRwdXQgcmFkaWNlcyBzZXQgdG8gZGVjaW1hbCAldSwgaGV4ICV4LCBvY3RhbCAlby5cbiIsCisJCQkgICBpbnB1dF9yYWRpeCwgaW5wdXRfcmFkaXgsIGlucHV0X3JhZGl4KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcHJpbnRmX2ZpbHRlcmVkICgiSW5wdXQgcmFkaXggc2V0IHRvIGRlY2ltYWwgJXUsIGhleCAleCwgb2N0YWwgJW8uXG4iLAorCQkJICAgaW5wdXRfcmFkaXgsIGlucHV0X3JhZGl4LCBpbnB1dF9yYWRpeCk7CisJICBwcmludGZfZmlsdGVyZWQgKCJPdXRwdXQgcmFkaXggc2V0IHRvIGRlY2ltYWwgJXUsIGhleCAleCwgb2N0YWwgJW8uXG4iLAorCQkJICAgb3V0cHV0X3JhZGl4LCBvdXRwdXRfcmFkaXgsIG91dHB1dF9yYWRpeCk7CisJfQorICAgIH0KK30KKworDAorLypBUkdTVVNFRCovCitzdGF0aWMgdm9pZAorc2V0X3ByaW50IChhcmcsIGZyb21fdHR5KQorICAgICBjaGFyICphcmc7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcHJpbnRmX3VuZmlsdGVyZWQgKAorIlwic2V0IHByaW50XCIgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiBhIHByaW50IHN1YmNvbW1hbmQuXG4iKTsKKyAgaGVscF9saXN0IChzZXRwcmludGxpc3QsICJzZXQgcHJpbnQgIiwgLTEsIGdkYl9zdGRvdXQpOworfQorCisvKkFSR1NVU0VEKi8KK3N0YXRpYyB2b2lkCitzaG93X3ByaW50IChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBjbWRfc2hvd19saXN0IChzaG93cHJpbnRsaXN0LCBmcm9tX3R0eSwgIiIpOworfQorDAordm9pZAorX2luaXRpYWxpemVfdmFscHJpbnQgKCkKK3sKKyAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7CisKKyAgYWRkX3ByZWZpeF9jbWQgKCJwcmludCIsIG5vX2NsYXNzLCBzZXRfcHJpbnQsCisJCSAgIkdlbmVyaWMgY29tbWFuZCBmb3Igc2V0dGluZyBob3cgdGhpbmdzIHByaW50LiIsCisJCSAgJnNldHByaW50bGlzdCwgInNldCBwcmludCAiLCAwLCAmc2V0bGlzdCk7CisgIGFkZF9hbGlhc19jbWQgKCJwIiwgInByaW50Iiwgbm9fY2xhc3MsIDEsICZzZXRsaXN0KTsgCisgIC8qIHByZWZlciBzZXQgcHJpbnQgdG8gc2V0IHByb21wdCAqLyAKKyAgYWRkX2FsaWFzX2NtZCAoInByIiwgInByaW50Iiwgbm9fY2xhc3MsIDEsICZzZXRsaXN0KTsKKworICBhZGRfcHJlZml4X2NtZCAoInByaW50Iiwgbm9fY2xhc3MsIHNob3dfcHJpbnQsCisJCSAgIkdlbmVyaWMgY29tbWFuZCBmb3Igc2hvd2luZyBwcmludCBzZXR0aW5ncy4iLAorCQkgICZzaG93cHJpbnRsaXN0LCAic2hvdyBwcmludCAiLCAwLCAmc2hvd2xpc3QpOworICBhZGRfYWxpYXNfY21kICgicCIsICJwcmludCIsIG5vX2NsYXNzLCAxLCAmc2hvd2xpc3QpOyAKKyAgYWRkX2FsaWFzX2NtZCAoInByIiwgInByaW50Iiwgbm9fY2xhc3MsIDEsICZzaG93bGlzdCk7IAorCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgiZWxlbWVudHMiLCBub19jbGFzcywgdmFyX3VpbnRlZ2VyLCAoY2hhciAqKSZwcmludF9tYXgsCisJCSAgIlNldCBsaW1pdCBvbiBzdHJpbmcgY2hhcnMgb3IgYXJyYXkgZWxlbWVudHMgdG8gcHJpbnQuXG5cCitcInNldCBwcmludCBlbGVtZW50cyAwXCIgY2F1c2VzIHRoZXJlIHRvIGJlIG5vIGxpbWl0LiIsCisJCSAgJnNldHByaW50bGlzdCksCisgICAgICZzaG93cHJpbnRsaXN0KTsKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoIm51bGwtc3RvcCIsIG5vX2NsYXNzLCB2YXJfYm9vbGVhbiwKKwkJICAoY2hhciAqKSZzdG9wX3ByaW50X2F0X251bGwsCisJCSAgIlNldCBwcmludGluZyBvZiBjaGFyIGFycmF5cyB0byBzdG9wIGF0IGZpcnN0IG51bGwgY2hhci4iLAorCQkgICZzZXRwcmludGxpc3QpLAorICAgICAmc2hvd3ByaW50bGlzdCk7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQKKyAgICAoYWRkX3NldF9jbWQgKCJyZXBlYXRzIiwgbm9fY2xhc3MsIHZhcl91aW50ZWdlciwKKwkJICAoY2hhciAqKSZyZXBlYXRfY291bnRfdGhyZXNob2xkLAorCQkgICJTZXQgdGhyZXNob2xkIGZvciByZXBlYXRlZCBwcmludCBlbGVtZW50cy5cblwKK1wic2V0IHByaW50IHJlcGVhdHMgMFwiIGNhdXNlcyBhbGwgZWxlbWVudHMgdG8gYmUgaW5kaXZpZHVhbGx5IHByaW50ZWQuIiwKKwkJICAmc2V0cHJpbnRsaXN0KSwKKyAgICAgJnNob3dwcmludGxpc3QpOworCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgicHJldHR5IiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCisJCSAgKGNoYXIgKikmcHJldHR5cHJpbnRfc3RydWN0cywKKwkJICAiU2V0IHByZXR0eXByaW50aW5nIG9mIHN0cnVjdHVyZXMuIiwKKwkJICAmc2V0cHJpbnRsaXN0KSwKKyAgICAgJnNob3dwcmludGxpc3QpOworCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgidW5pb24iLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwgKGNoYXIgKikmdW5pb25wcmludCwKKwkJICAiU2V0IHByaW50aW5nIG9mIHVuaW9ucyBpbnRlcmlvciB0byBzdHJ1Y3R1cmVzLiIsCisJCSAgJnNldHByaW50bGlzdCksCisgICAgICZzaG93cHJpbnRsaXN0KTsKKyAgCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgiYXJyYXkiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKKwkJICAoY2hhciAqKSZwcmV0dHlwcmludF9hcnJheXMsCisJCSAgIlNldCBwcmV0dHlwcmludGluZyBvZiBhcnJheXMuIiwKKwkJICAmc2V0cHJpbnRsaXN0KSwKKyAgICAgJnNob3dwcmludGxpc3QpOworCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgiYWRkcmVzcyIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLCAoY2hhciAqKSZhZGRyZXNzcHJpbnQsCisJCSAgIlNldCBwcmludGluZyBvZiBhZGRyZXNzZXMuIiwKKwkJICAmc2V0cHJpbnRsaXN0KSwKKyAgICAgJnNob3dwcmludGxpc3QpOworCisgIGMgPSBhZGRfc2V0X2NtZCAoImlucHV0LXJhZGl4IiwgY2xhc3Nfc3VwcG9ydCwgdmFyX3VpbnRlZ2VyLAorCQkgICAoY2hhciAqKSZpbnB1dF9yYWRpeCwKKwkJICAiU2V0IGRlZmF1bHQgaW5wdXQgcmFkaXggZm9yIGVudGVyaW5nIG51bWJlcnMuIiwKKwkJICAmc2V0bGlzdCk7CisgIGFkZF9zaG93X2Zyb21fc2V0IChjLCAmc2hvd2xpc3QpOworICBjLT5mdW5jdGlvbi5zZnVuYyA9IHNldF9pbnB1dF9yYWRpeDsKKworICBjID0gYWRkX3NldF9jbWQgKCJvdXRwdXQtcmFkaXgiLCBjbGFzc19zdXBwb3J0LCB2YXJfdWludGVnZXIsCisJCSAgIChjaGFyICopJm91dHB1dF9yYWRpeCwKKwkJICAiU2V0IGRlZmF1bHQgb3V0cHV0IHJhZGl4IGZvciBwcmludGluZyBvZiB2YWx1ZXMuIiwKKwkJICAmc2V0bGlzdCk7CisgIGFkZF9zaG93X2Zyb21fc2V0IChjLCAmc2hvd2xpc3QpOworICBjLT5mdW5jdGlvbi5zZnVuYyA9IHNldF9vdXRwdXRfcmFkaXg7CisKKyAgLyogVGhlICJzZXQgcmFkaXgiIGFuZCAic2hvdyByYWRpeCIgY29tbWFuZHMgYXJlIHNwZWNpYWwgaW4gdGhhdCB0aGV5IGFyZQorICAgICBsaWtlIG5vcm1hbCBzZXQgYW5kIHNob3cgY29tbWFuZHMgYnV0IGFsbG93IHR3byBub3JtYWxseSBpbmRlcGVuZGVudAorICAgICB2YXJpYWJsZXMgdG8gYmUgZWl0aGVyIHNldCBvciBzaG93biB3aXRoIGEgc2luZ2xlIGNvbW1hbmQuICBTbyB0aGUKKyAgICAgdXN1YWwgYWRkX3NldF9jbWQoKSBhbmQgYWRkX3Nob3dfZnJvbV9zZXQoKSBjb21tYW5kcyBhcmVuJ3QgcmVhbGx5CisgICAgIGFwcHJvcHJpYXRlLiAqLworICBhZGRfY21kICgicmFkaXgiLCBjbGFzc19zdXBwb3J0LCBzZXRfcmFkaXgsCisJICAgIlNldCBkZWZhdWx0IGlucHV0IGFuZCBvdXRwdXQgbnVtYmVyIHJhZGljZXMuXG5cCitVc2UgJ3NldCBpbnB1dC1yYWRpeCcgb3IgJ3NldCBvdXRwdXQtcmFkaXgnIHRvIGluZGVwZW5kZW50bHkgc2V0IGVhY2guXG5cCitXaXRob3V0IGFuIGFyZ3VtZW50LCBzZXRzIGJvdGggcmFkaWNlcyBiYWNrIHRvIHRoZSBkZWZhdWx0IHZhbHVlIG9mIDEwLiIsCisJICAgJnNldGxpc3QpOworICBhZGRfY21kICgicmFkaXgiLCBjbGFzc19zdXBwb3J0LCBzaG93X3JhZGl4LAorCSAgICJTaG93IHRoZSBkZWZhdWx0IGlucHV0IGFuZCBvdXRwdXQgbnVtYmVyIHJhZGljZXMuXG5cCitVc2UgJ3Nob3cgaW5wdXQtcmFkaXgnIG9yICdzaG93IG91dHB1dC1yYWRpeCcgdG8gaW5kZXBlbmRlbnRseSBzaG93IGVhY2guIiwKKwkgICAmc2hvd2xpc3QpOworCisgIC8qIEdpdmUgcGVvcGxlIHRoZSBkZWZhdWx0cyB3aGljaCB0aGV5IGFyZSB1c2VkIHRvLiAgKi8KKyAgcHJldHR5cHJpbnRfc3RydWN0cyA9IDA7CisgIHByZXR0eXByaW50X2FycmF5cyA9IDA7CisgIHVuaW9ucHJpbnQgPSAxOworICBhZGRyZXNzcHJpbnQgPSAxOworICBwcmludF9tYXggPSBQUklOVF9NQVhfREVGQVVMVDsKK30KZGlmZiAtLWdpdCBhL2dkYi92YWxwcmludC5oIGIvZ2RiL3ZhbHByaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZlZGIxNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi92YWxwcmludC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIERlY2xhcmF0aW9ucyBmb3IgdmFsdWUgcHJpbnRpbmcgcm91dGluZXMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTg2LCAxOTg4LCAxOTg5LCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0CisgICAgICAgICAgICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCitleHRlcm4gaW50IHByZXR0eXByaW50X2FycmF5czsJLyogQ29udHJvbHMgcHJldHR5IHByaW50aW5nIG9mIGFycmF5cy4gICovCitleHRlcm4gaW50IHByZXR0eXByaW50X3N0cnVjdHM7CS8qIENvbnRyb2xzIHByZXR0eSBwcmludGluZyBvZiBzdHJ1Y3R1cmVzICovCitleHRlcm4gaW50IHByZXR0eXByaW50X2FycmF5czsJLyogQ29udHJvbHMgcHJldHR5IHByaW50aW5nIG9mIGFycmF5cy4gICovCisKK2V4dGVybiBpbnQgdnRibHByaW50OwkJLyogQ29udHJvbHMgcHJpbnRpbmcgb2YgdnRibCdzICovCitleHRlcm4gaW50IHVuaW9ucHJpbnQ7CQkvKiBDb250cm9scyBwcmludGluZyBvZiBuZXN0ZWQgdW5pb25zLiAgKi8KK2V4dGVybiBpbnQgYWRkcmVzc3ByaW50OwkvKiBDb250cm9scyBwcmV0dHkgcHJpbnRpbmcgb2YgYWRkcmVzc2VzLiAgKi8KK2V4dGVybiBpbnQgb2JqZWN0cHJpbnQ7CQkvKiBDb250cm9scyBsb29raW5nIHVwIGFuIG9iamVjdCdzIGRlcml2ZWQgdHlwZQorCQkJCSAgIHVzaW5nIHdoYXQgd2UgZmluZCBpbiBpdHMgdnRhYmxlcy4gICovCisKK2V4dGVybiB1bnNpZ25lZCBpbnQgcHJpbnRfbWF4OwkvKiBNYXggIyBvZiBjaGFycyBmb3Igc3RyaW5ncy92ZWN0b3JzICovCisKK2V4dGVybiBpbnQgb3V0cHV0X2Zvcm1hdDsKKworZXh0ZXJuIGludCBzdG9wX3ByaW50X2F0X251bGw7ICAvKiBTdG9wIHByaW50aW5nIGF0IG51bGwgY2hhcj8gKi8KKworZXh0ZXJuIHZvaWQKK3ZhbF9wcmludF9hcnJheV9lbGVtZW50cyBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBjaGFyICosIENPUkVfQUREUiwgR0RCX0ZJTEUgKiwKKwkJCQkgIGludCwgaW50LCBpbnQsIGVudW0gdmFsX3ByZXR0eXByaW50LAorCQkJCSAgdW5zaWduZWQgaW50KSk7CisKK2V4dGVybiB2b2lkCit2YWxfcHJpbnRfdHlwZV9jb2RlX2ludCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBjaGFyICosIEdEQl9GSUxFICopKTsKKworZXh0ZXJuIHZvaWQKK3ByaW50X2JpbmFyeV9jaGFycyBQQVJBTVMgKChHREJfRklMRSAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCkpOworIAorZXh0ZXJuIHZvaWQKK3ByaW50X29jdGFsX2NoYXJzIFBBUkFNUyAoKEdEQl9GSUxFICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50KSk7CisgCitleHRlcm4gdm9pZAorcHJpbnRfZGVjaW1hbF9jaGFycyBQQVJBTVMgKChHREJfRklMRSAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCkpOworCmRpZmYgLS1naXQgYS9nZGIvdmFsdWUuaCBiL2dkYi92YWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YzcwZGUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdmFsdWUuaApAQCAtMCwwICsxLDU2OCBAQAorLyogRGVmaW5pdGlvbnMgZm9yIHZhbHVlcyBvZiBDIGV4cHJlc3Npb25zLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5ODYsIDE5ODcsIDE5ODksIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCAoVkFMVUVfSCkKKyNkZWZpbmUgVkFMVUVfSCAxCisKKy8qCisgKiBUaGUgc3RydWN0dXJlIHdoaWNoIGRlZmluZXMgdGhlIHR5cGUgb2YgYSB2YWx1ZS4gIEl0IHNob3VsZCBuZXZlcgorICogYmUgcG9zc2libGUgZm9yIGEgcHJvZ3JhbSBsdmFsIHZhbHVlIHRvIHN1cnZpdmUgb3ZlciBhIGNhbGwgdG8gdGhlIGluZmVyaW9yCisgKiAoaWUgdG8gYmUgcHV0IGludG8gdGhlIGhpc3RvcnkgbGlzdCBvciBhbiBpbnRlcm5hbCB2YXJpYWJsZSkuCisgKi8KK2VudW0gbHZhbF90eXBlIHsKKyAgLyogTm90IGFuIGx2YWwuICAqLworICBub3RfbHZhbCwKKyAgLyogSW4gbWVtb3J5LiAgQ291bGQgYmUgYSBzYXZlZCByZWdpc3Rlci4gICovCisgIGx2YWxfbWVtb3J5LAorICAvKiBJbiBhIHJlZ2lzdGVyLiAgKi8KKyAgbHZhbF9yZWdpc3RlciwKKyAgLyogSW4gYSBnZGIgaW50ZXJuYWwgdmFyaWFibGUuICAqLworICBsdmFsX2ludGVybmFsdmFyLAorICAvKiBQYXJ0IG9mIGEgZ2RiIGludGVybmFsIHZhcmlhYmxlIChzdHJ1Y3R1cmUgZmllbGQpLiAgKi8KKyAgbHZhbF9pbnRlcm5hbHZhcl9jb21wb25lbnQsCisgIC8qIEluIGEgcmVnaXN0ZXIgc2VyaWVzIGluIGEgZnJhbWUgbm90IHRoZSBjdXJyZW50IG9uZSwgd2hpY2ggbWF5IGhhdmUgYmVlbgorICAgICBwYXJ0aWFsbHkgc2F2ZWQgb3Igc2F2ZWQgaW4gZGlmZmVyZW50IHBsYWNlcyAob3RoZXJ3aXNlIHdvdWxkIGJlCisgICAgIGx2YWxfcmVnaXN0ZXIgb3IgbHZhbF9tZW1vcnkpLiAgKi8KKyAgbHZhbF9yZWdfZnJhbWVfcmVsYXRpdmUKK307CisKK3N0cnVjdCB2YWx1ZQorICB7CisgICAgLyogVHlwZSBvZiB2YWx1ZTsgZWl0aGVyIG5vdCBhbiBsdmFsLCBvciBvbmUgb2YgdGhlIHZhcmlvdXMKKyAgICAgICBkaWZmZXJlbnQgcG9zc2libGUga2luZHMgb2YgbHZhbC4gICovCisgICAgZW51bSBsdmFsX3R5cGUgbHZhbDsKKyAgICAvKiBJcyBpdCBtb2RpZmlhYmxlPyAgT25seSByZWxldmFudCBpZiBsdmFsICE9IG5vdF9sdmFsLiAgKi8KKyAgICBpbnQgbW9kaWZpYWJsZTsKKyAgICAvKiBMb2NhdGlvbiBvZiB2YWx1ZSAoaWYgbHZhbCkuICAqLworICAgIHVuaW9uCisgICAgICB7CisJLyogQWRkcmVzcyBpbiBpbmZlcmlvciBvciBieXRlIG9mIHJlZ2lzdGVycyBzdHJ1Y3R1cmUuICAqLworCUNPUkVfQUREUiBhZGRyZXNzOworCS8qIFBvaW50ZXIgdG8gaW50ZXJuYWwgdmFyaWFibGUuICAqLworCXN0cnVjdCBpbnRlcm5hbHZhciAqaW50ZXJuYWx2YXI7CisJLyogTnVtYmVyIG9mIHJlZ2lzdGVyLiAgT25seSB1c2VkIHdpdGgKKwkgICBsdmFsX3JlZ19mcmFtZV9yZWxhdGl2ZS4gICovCisJaW50IHJlZ251bTsKKyAgICAgIH0gbG9jYXRpb247CisgICAgLyogRGVzY3JpYmVzIG9mZnNldCBvZiBhIHZhbHVlIHdpdGhpbiBsdmFsIG9mIGEgc3RydWN0dXJlIGluIGJ5dGVzLgorICAgICAgIFRoaXMgaXMgdXNlZCBpbiByZXRyaWV2aW5nIGNvbnRlbnRzIGZyb20gdGFyZ2V0IG1lbW9yeS4gW05vdGUgYWxzbworICAgICAgIHRoZSBtZW1iZXIgZW1iZWRkZWRfb2Zmc2V0IGJlbG93Ll0gKi8KKyAgICBpbnQgb2Zmc2V0OwkKKyAgICAvKiBPbmx5IHVzZWQgZm9yIGJpdGZpZWxkczsgbnVtYmVyIG9mIGJpdHMgY29udGFpbmVkIGluIHRoZW0uICAqLworICAgIGludCBiaXRzaXplOworICAgIC8qIE9ubHkgdXNlZCBmb3IgYml0ZmllbGRzOyBwb3NpdGlvbiBvZiBzdGFydCBvZiBmaWVsZC4KKyAgICAgICBGb3IgQklUU19CSUdfRU5ESUFOPTAgdGFyZ2V0cywgaXQgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBMU0IuCisgICAgICAgRm9yIEJJVFNfQklHX0VORElBTj0xIHRhcmdldHMsIGl0IGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgTVNCLiAqLworICAgIGludCBiaXRwb3M7CisgICAgLyogRnJhbWUgdmFsdWUgaXMgcmVsYXRpdmUgdG8uICBJbiBwcmFjdGljZSwgdGhpcyBhZGRyZXNzIGlzIG9ubHkKKyAgICAgICB1c2VkIGlmIHRoZSB2YWx1ZSBpcyBzdG9yZWQgaW4gc2V2ZXJhbCByZWdpc3RlcnMgaW4gb3RoZXIgdGhhbgorICAgICAgIHRoZSBjdXJyZW50IGZyYW1lLCBhbmQgdGhlc2UgcmVnaXN0ZXJzIGhhdmUgbm90IGFsbCBiZWVuIHNhdmVkCisgICAgICAgYXQgdGhlIHNhbWUgcGxhY2UgaW4gbWVtb3J5LiAgVGhpcyB3aWxsIGJlIGRlc2NyaWJlZCBpbiB0aGUKKyAgICAgICBsdmFsIGVudW0gYWJvdmUgYXMgImx2YWxfcmVnX2ZyYW1lX3JlbGF0aXZlIi4gICovCisgICAgQ09SRV9BRERSIGZyYW1lX2FkZHI7CisgICAgLyogVHlwZSBvZiB0aGUgdmFsdWUuICAqLworICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgIC8qIFR5cGUgb2YgdGhlIGVuY2xvc2luZyBvYmplY3QgaWYgdGhpcyBpcyBhbiBlbWJlZGRlZCBzdWJvYmplY3QuCisgICAgICAgVGhlIG1lbWJlciBlbWJlZGRlZF9vZmZzZXQgZ2l2ZXMgdGhlIHJlYWwgcG9zaXRpb24gb2YgdGhlIHN1Ym9iamVjdAorICAgICAgIGlmIHR5cGUgaXMgbm90IHRoZSBzYW1lIGFzIGVuY2xvc2luZ190eXBlLgorCisgICAgICAgSWYgdGhlIHR5cGUgZmllbGQgaXMgYSBwb2ludGVyIHR5cGUsIHRoZW4gZW5jbG9zaW5nX3R5cGUgaXMgCisgICAgICAgYSBwb2ludGVyIHR5cGUgcG9pbnRpbmcgdG8gdGhlIHJlYWwgKGVuY2xvc2luZykgdHlwZSBvZiB0aGUgdGFyZ2V0CisgICAgICAgb2JqZWN0LiAqLworICAgIHN0cnVjdCB0eXBlICplbmNsb3NpbmdfdHlwZTsKKyAgICAvKiBWYWx1ZXMgYXJlIHN0b3JlZCBpbiBhIGNoYWluLCBzbyB0aGF0IHRoZXkgY2FuIGJlIGRlbGV0ZWQKKyAgICAgICBlYXNpbHkgb3ZlciBjYWxscyB0byB0aGUgaW5mZXJpb3IuICBWYWx1ZXMgYXNzaWduZWQgdG8gaW50ZXJuYWwKKyAgICAgICB2YXJpYWJsZXMgb3IgcHV0IGludG8gdGhlIHZhbHVlIGhpc3RvcnkgYXJlIHRha2VuIG9mZiB0aGlzCisgICAgICAgbGlzdC4gICovCisgICAgc3RydWN0IHZhbHVlICpuZXh0OworCisgICAgLyogPz8/IFdoZW4gaXMgdGhpcyB1c2VkPyAgKi8KKyAgICB1bmlvbiB7CisgICAgICBDT1JFX0FERFIgbWVtYWRkcjsKKyAgICAgIGNoYXIgKm15YWRkcjsKKyAgICB9IHN1YnN0cmluZ19hZGRyOworCisgICAgLyogUmVnaXN0ZXIgbnVtYmVyIGlmIHRoZSB2YWx1ZSBpcyBmcm9tIGEgcmVnaXN0ZXIuICBJcyBub3Qga2VwdAorICAgICAgIGlmIHlvdSB0YWtlIGEgZmllbGQgb2YgYSBzdHJ1Y3R1cmUgdGhhdCBpcyBzdG9yZWQgaW4gYQorICAgICAgIHJlZ2lzdGVyLiAgU2hvdWxkbid0IGl0IGJlPyAgKi8KKyAgICBzaG9ydCByZWdubzsKKyAgICAvKiBJZiB6ZXJvLCBjb250ZW50cyBvZiB0aGlzIHZhbHVlIGFyZSBpbiB0aGUgY29udGVudHMgZmllbGQuCisgICAgICAgSWYgbm9uemVybywgY29udGVudHMgYXJlIGluIGluZmVyaW9yIG1lbW9yeSBhdCBhZGRyZXNzCisgICAgICAgaW4gdGhlIGxvY2F0aW9uLmFkZHJlc3MgZmllbGQgcGx1cyB0aGUgb2Zmc2V0IGZpZWxkCisgICAgICAgKGFuZCB0aGUgbHZhbCBmaWVsZCBzaG91bGQgYmUgbHZhbF9tZW1vcnkpLiAgKi8KKyAgICBjaGFyIGxhenk7CisgICAgLyogSWYgbm9uemVybywgdGhpcyBpcyB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZSB3aGljaCBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGV4aXN0IGluIHRoZSBwcm9ncmFtLiAgKi8KKyAgICBjaGFyIG9wdGltaXplZF9vdXQ7CisgICAgLyogSWYgdGhpcyB2YWx1ZSByZXByZXNlbnRzIGFuIG9iamVjdCB0aGF0IGlzIGVtYmVkZGVkIGluc2lkZSBhCisgICAgICAgbGFyZ2VyIG9iamVjdCAoZS5nLiwgYSBiYXNlIHN1Ym9iamVjdCBpbiBDKyspLCB0aGlzIGdpdmVzIHRoZQorICAgICAgIG9mZnNldCAoaW4gYnl0ZXMpIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBjb250ZW50cyBidWZmZXIgd2hlcmUKKyAgICAgICB0aGUgZW1iZWRkZWQgb2JqZWN0IGJlZ2lucy4gVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIHNvbWUgQysrCisgICAgICAgcnVudGltZSBpbXBsZW1lbnRhdGlvbnMgbGF5IG91dCBvYmplY3RzIChlc3BlY2lhbGx5IHZpcnR1YWwgYmFzZXMKKyAgICAgICB3aXRoIHBvc3NpYmx5IG5lZ2F0aXZlIG9mZnNldHMgdG8gYW5jZXN0b3JzKS4KKyAgICAgICBOb3RlOiBUaGlzIG1heSBiZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSEgQWxzbyBub3RlIHRoYXQgdGhpcyBvZmZzZXQKKyAgICAgICBpcyBub3QgdXNlZCB3aGVuIHJldHJpZXZpbmcgY29udGVudHMgZnJvbSB0YXJnZXQgbWVtb3J5OyB0aGUgZW50aXJlCisgICAgICAgZW5jbG9zaW5nIG9iamVjdCBoYXMgdG8gYmUgcmV0cmlldmVkIGFsd2F5cywgYW5kIHRoZSBvZmZzZXQgZm9yCisgICAgICAgdGhhdCBpcyBnaXZlbiBieSB0aGUgbWVtYmVyIG9mZnNldCBhYm92ZS4gKi8KKyAgICBpbnQgZW1iZWRkZWRfb2Zmc2V0OworICAgIC8qIElmIHRoaXMgdmFsdWUgcmVwcmVzZW50cyBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0IHRoYXQgaXMgZW1iZWRkZWQKKyAgICAgICBpbiBhbm90aGVyIG9iamVjdCwgdGhpcyBnaXZlcyB0aGUgZW1iZWRkZWRfb2Zmc2V0IG9mIHRoZSBvYmplY3QKKyAgICAgICB0aGF0IGlzIHBvaW50ZWQgdG8uICovCisgICAgaW50IHBvaW50ZWRfdG9fb2Zmc2V0OworICAgIC8qIFRoZSBCRkQgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyB2YWx1ZS4gICovCisgICAgYXNlY3Rpb24gKmJmZF9zZWN0aW9uOworICAgIC8qIEFjdHVhbCBjb250ZW50cyBvZiB0aGUgdmFsdWUuICBGb3IgdXNlIG9mIHRoaXMgdmFsdWU7IHNldHRpbmcKKyAgICAgICBpdCB1c2VzIHRoZSBzdHVmZiBhYm92ZS4gIE5vdCB2YWxpZCBpZiBsYXp5IGlzIG5vbnplcm8uCisgICAgICAgVGFyZ2V0IGJ5dGUtb3JkZXIuICBXZSBmb3JjZSBpdCB0byBiZSBhbGlnbmVkIHByb3Blcmx5IGZvciBhbnkKKyAgICAgICBwb3NzaWJsZSB2YWx1ZS4gIE5vdGUgdGhhdCBhIHZhbHVlIHRoZXJlZm9yZSBleHRlbmRzIGJleW9uZAorICAgICAgIHdoYXQgaXMgZGVjbGFyZWQgaGVyZS4gICovCisgICAgdW5pb24geworICAgICAgbG9uZyBjb250ZW50c1sxXTsKKyAgICAgIGRvdWJsZSBmb3JjZV9kb3VibGVfYWxpZ247CisgICAgICBMT05HRVNUIGZvcmNlX2xvbmdsb25nX2FsaWduOworICAgICAgY2hhciAqbGl0ZXJhbF9kYXRhOworICAgIH0gYWxpZ25lcjsKKyAgICAvKiBEbyBub3QgYWRkIGFueSBuZXcgbWVtYmVycyBoZXJlIC0tIGNvbnRlbnRzIGFib3ZlIHdpbGwgdHJhc2ggdGhlbSAqLworICB9OworCit0eXBlZGVmIHN0cnVjdCB2YWx1ZSAqdmFsdWVfcHRyOworCisjZGVmaW5lIFZBTFVFX1RZUEUodmFsKSAodmFsKS0+dHlwZQorI2RlZmluZSBWQUxVRV9FTkNMT1NJTkdfVFlQRSh2YWwpICh2YWwpLT5lbmNsb3NpbmdfdHlwZQorI2RlZmluZSBWQUxVRV9MQVpZKHZhbCkgKHZhbCktPmxhenkKKy8qIFZBTFVFX0NPTlRFTlRTIGFuZCBWQUxVRV9DT05URU5UU19SQVcgYm90aCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YKKyAgIHRoZSBnZGIgYnVmZmVyIHVzZWQgdG8gaG9sZCBhIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBsdmFsLiAgCisgICBWQUxVRV9DT05URU5UUyBpcyB1c2VkIHdoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgYXJlIG5lZWRlZCAtLQorICAgaXQgdXNlcyB2YWx1ZV9mZXRjaF9sYXp5KCkgdG8gbG9hZCB0aGUgYnVmZmVyIGZyb20gdGhlIHByb2Nlc3MgYmVpbmcgCisgICBkZWJ1Z2dlZCBpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIGxvYWRlZC4gIFZBTFVFX0NPTlRFTlRTX1JBVyBpcyAKKyAgIHVzZWQgd2hlbiBkYXRhIGlzIGJlaW5nIHN0b3JlZCBpbnRvIHRoZSBidWZmZXIsIG9yIHdoZW4gaXQgaXMgCisgICBjZXJ0YWluIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgYXJlIHZhbGlkLgorICAgTm90ZTogVGhlIGNvbnRlbnRzIHBvaW50ZXIgaXMgYWRqdXN0ZWQgYnkgdGhlIG9mZnNldCByZXF1aXJlZCB0bworICAgZ2V0IHRvIHRoZSByZWFsIHN1Ym9iamVjdCwgaWYgdGhlIHZhbHVlIGhhcHBlbnMgdG8gcmVwcmVzZW50CisgICBzb21ldGhpbmcgZW1iZWRkZWQgaW4gYSBsYXJnZXIgcnVuLXRpbWUgb2JqZWN0LiAqLworCisjZGVmaW5lIFZBTFVFX0NPTlRFTlRTX1JBVyh2YWwpICgoY2hhciAqKSAodmFsKS0+YWxpZ25lci5jb250ZW50cyArICh2YWwpLT5lbWJlZGRlZF9vZmZzZXQpCisjZGVmaW5lIFZBTFVFX0NPTlRFTlRTKHZhbCkgKCh2b2lkKShWQUxVRV9MQVpZKHZhbCkgJiYgdmFsdWVfZmV0Y2hfbGF6eSh2YWwpKSxcCisJCQkgICAgIFZBTFVFX0NPTlRFTlRTX1JBVyh2YWwpKQorCisvKiBUaGUgQUxMIHZhcmlhbnRzIG9mIHRoZSBhYm92ZSB0d28gbWFjcm9zIGRvIG5vdCBhZGp1c3QgdGhlIHJldHVybmVkCisgICBwb2ludGVyIGJ5IHRoZSBlbWJlZGRlZF9vZmZzZXQgdmFsdWUuICovCisgIAorI2RlZmluZSBWQUxVRV9DT05URU5UU19BTExfUkFXKHZhbCkgKChjaGFyICopICh2YWwpLT5hbGlnbmVyLmNvbnRlbnRzKQorI2RlZmluZSBWQUxVRV9DT05URU5UU19BTEwodmFsKSAoKHZvaWQpIChWQUxVRV9MQVpZKHZhbCkgJiYgdmFsdWVfZmV0Y2hfbGF6eSh2YWwpKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9DT05URU5UU19BTExfUkFXKHZhbCkpCisgIAorICAKK2V4dGVybiBpbnQgdmFsdWVfZmV0Y2hfbGF6eSBQQVJBTVMgKCh2YWx1ZV9wdHIgdmFsKSk7CisKKyNkZWZpbmUgVkFMVUVfTFZBTCh2YWwpICh2YWwpLT5sdmFsCisjZGVmaW5lIFZBTFVFX0FERFJFU1ModmFsKSAodmFsKS0+bG9jYXRpb24uYWRkcmVzcworI2RlZmluZSBWQUxVRV9JTlRFUk5BTFZBUih2YWwpICh2YWwpLT5sb2NhdGlvbi5pbnRlcm5hbHZhcgorI2RlZmluZSBWQUxVRV9GUkFNRV9SRUdOVU0odmFsKSAoKHZhbCktPmxvY2F0aW9uLnJlZ251bSkKKyNkZWZpbmUgVkFMVUVfRlJBTUUodmFsKSAoKHZhbCktPmZyYW1lX2FkZHIpCisjZGVmaW5lIFZBTFVFX09GRlNFVCh2YWwpICh2YWwpLT5vZmZzZXQKKyNkZWZpbmUgVkFMVUVfQklUU0laRSh2YWwpICh2YWwpLT5iaXRzaXplCisjZGVmaW5lIFZBTFVFX0JJVFBPUyh2YWwpICh2YWwpLT5iaXRwb3MKKyNkZWZpbmUgVkFMVUVfTkVYVCh2YWwpICh2YWwpLT5uZXh0CisjZGVmaW5lIFZBTFVFX1JFR05PKHZhbCkgKHZhbCktPnJlZ25vCisjZGVmaW5lIFZBTFVFX09QVElNSVpFRF9PVVQodmFsKSAoKHZhbCktPm9wdGltaXplZF9vdXQpCisjZGVmaW5lIFZBTFVFX0VNQkVEREVEX09GRlNFVCh2YWwpICgodmFsKS0+ZW1iZWRkZWRfb2Zmc2V0KQorI2RlZmluZSBWQUxVRV9QT0lOVEVEX1RPX09GRlNFVCh2YWwpICgodmFsKS0+cG9pbnRlZF90b19vZmZzZXQpCisjZGVmaW5lIFZBTFVFX0JGRF9TRUNUSU9OKHZhbCkgKCh2YWwpLT5iZmRfc2VjdGlvbikKKworLyogQ29udmVydCBhIFJFRiB0byB0aGUgb2JqZWN0IHJlZmVyZW5jZWQuICovCisKKyNkZWZpbmUgQ09FUkNFX1JFRihhcmcpICAgIFwKK2RvIHsgc3RydWN0IHR5cGUgKnZhbHVlX3R5cGVfYXJnX3RtcCA9IGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGFyZykpO1wKKyAgICAgaWYgKFRZUEVfQ09ERSAodmFsdWVfdHlwZV9hcmdfdG1wKSA9PSBUWVBFX0NPREVfUkVGKQkJXAorCSBhcmcgPSB2YWx1ZV9hdF9sYXp5IChUWVBFX1RBUkdFVF9UWVBFICh2YWx1ZV90eXBlX2FyZ190bXApLAlcCisJCQkgICAgICB1bnBhY2tfbG9uZyAoVkFMVUVfVFlQRSAoYXJnKSwJCVwKKwkJCQkJICAgVkFMVUVfQ09OVEVOVFMgKGFyZykpLCAgICAgICBcCisJCQkgICAgICBWQUxVRV9CRkRfU0VDVElPTiAoYXJnKSk7CQkJXAorICAgIH0gd2hpbGUgKDApCisKKy8qIElmIEFSRyBpcyBhbiBhcnJheSwgY29udmVydCBpdCB0byBhIHBvaW50ZXIuCisgICBJZiBBUkcgaXMgYW4gZW51bSwgY29udmVydCBpdCB0byBhbiBpbnRlZ2VyLgorICAgSWYgQVJHIGlzIGEgZnVuY3Rpb24sIGNvbnZlcnQgaXQgdG8gYSBmdW5jdGlvbiBwb2ludGVyLgorCisgICBSZWZlcmVuY2VzIGFyZSBkZXJlZmVyZW5jZWQuICAqLworCisjZGVmaW5lIENPRVJDRV9BUlJBWShhcmcpICAgIFwKK2RvIHsgQ09FUkNFX1JFRihhcmcpOwkJCQkJCQlcCisgIGlmIChjdXJyZW50X2xhbmd1YWdlLT5jX3N0eWxlX2FycmF5cwkJCQkJXAorICAgICAgJiYgVFlQRV9DT0RFIChWQUxVRV9UWVBFIChhcmcpKSA9PSBUWVBFX0NPREVfQVJSQVkpCQlcCisgICAgYXJnID0gdmFsdWVfY29lcmNlX2FycmF5IChhcmcpOwkJCQkJXAorICBpZiAoVFlQRV9DT0RFIChWQUxVRV9UWVBFIChhcmcpKSA9PSBUWVBFX0NPREVfRlVOQykgICAgICAgICAgICAgICAgICAgXAorICAgIGFyZyA9IHZhbHVlX2NvZXJjZV9mdW5jdGlvbiAoYXJnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDT0VSQ0VfTlVNQkVSKGFyZykgIFwKKyAgZG8geyBDT0VSQ0VfQVJSQVkoYXJnKTsgIENPRVJDRV9FTlVNKGFyZyk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgQ09FUkNFX1ZBUllJTkdfQVJSQVkoYXJnLCByZWFsX2FyZ190eXBlKQlcCit7IGlmIChjaGlsbF92YXJ5aW5nX3R5cGUgKHJlYWxfYXJnX3R5cGUpKSAgXAorICAgIGFyZyA9IHZhcnlpbmdfdG9fc2xpY2UgKGFyZyksIHJlYWxfYXJnX3R5cGUgPSBWQUxVRV9UWVBFIChhcmcpOyB9CisKKy8qIElmIEFSRyBpcyBhbiBlbnVtLCBjb252ZXJ0IGl0IHRvIGFuIGludGVnZXIuICAqLworCisjZGVmaW5lIENPRVJDRV9FTlVNKGFyZykgICB7IFwKKyAgaWYgKFRZUEVfQ09ERSAoY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnKSkpID09IFRZUEVfQ09ERV9FTlVNKQlcCisgICAgYXJnID0gdmFsdWVfY2FzdCAoYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2ludCwgYXJnKTsJCQlcCit9CisKKy8qIEludGVybmFsIHZhcmlhYmxlcyAodmFyaWFibGVzIGZvciBjb252ZW5pZW5jZSBvZiB1c2Ugb2YgZGVidWdnZXIpCisgICBhcmUgcmVjb3JkZWQgYXMgYSBjaGFpbiBvZiB0aGVzZSBzdHJ1Y3R1cmVzLiAgKi8KKworc3RydWN0IGludGVybmFsdmFyCit7CisgIHN0cnVjdCBpbnRlcm5hbHZhciAqbmV4dDsKKyAgY2hhciAqbmFtZTsKKyAgdmFsdWVfcHRyIHZhbHVlOworfTsKKworLyogUG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24uICBEZXBlbmRzIG9uIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uLiAqLworCisjZGVmaW5lIE1FVEhPRF9QVFJfSVNfVklSVFVBTChBRERSKSAgKChBRERSKSAmIDB4ODAwMDAwMDApCisjZGVmaW5lIE1FVEhPRF9QVFJfRlJPTV9WT0ZGU0VUKE9GRlNFVCkgKDB4ODAwMDAwMDAgKyAoT0ZGU0VUKSkKKyNkZWZpbmUgTUVUSE9EX1BUUl9UT19WT0ZGU0VUKEFERFIpICh+MHg4MDAwMDAwMCAmIChBRERSKSkKKworDAorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAiZXhwcmVzc2lvbi5oIgorCisjaWZkZWYgX19TVERDX18KK3N0cnVjdCBmcmFtZV9pbmZvOworc3RydWN0IGZuX2ZpZWxkOworI2VuZGlmCisKK2V4dGVybiB2b2lkCitwcmludF9hZGRyZXNzX2RlbWFuZ2xlIFBBUkFNUyAoKENPUkVfQUREUiwgR0RCX0ZJTEUgKiwgaW50KSk7CisKK2V4dGVybiBMT05HRVNUIHZhbHVlX2FzX2xvbmcgUEFSQU1TICgodmFsdWVfcHRyIHZhbCkpOworCitleHRlcm4gRE9VQkxFU1QgdmFsdWVfYXNfZG91YmxlIFBBUkFNUyAoKHZhbHVlX3B0ciB2YWwpKTsKKworZXh0ZXJuIENPUkVfQUREUiB2YWx1ZV9hc19wb2ludGVyIFBBUkFNUyAoKHZhbHVlX3B0ciB2YWwpKTsKKworZXh0ZXJuIExPTkdFU1QgdW5wYWNrX2xvbmcgUEFSQU1TICgoc3RydWN0IHR5cGUgKnR5cGUsIGNoYXIgKnZhbGFkZHIpKTsKKworZXh0ZXJuIERPVUJMRVNUIHVucGFja19kb3VibGUgUEFSQU1TICgoc3RydWN0IHR5cGUgKnR5cGUsIGNoYXIgKnZhbGFkZHIsCisJCQkJICAgICAgIGludCAqaW52cCkpOworCitleHRlcm4gQ09SRV9BRERSIHVucGFja19wb2ludGVyIFBBUkFNUyAoKHN0cnVjdCB0eXBlICp0eXBlLCBjaGFyICp2YWxhZGRyKSk7CisKK2V4dGVybiBMT05HRVNUIHVucGFja19maWVsZF9hc19sb25nIFBBUkFNUyAoKHN0cnVjdCB0eXBlICp0eXBlLCBjaGFyICp2YWxhZGRyLAorCQkJCQkgICAgIGludCBmaWVsZG5vKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfZnJvbV9sb25nZXN0IFBBUkFNUyAoKHN0cnVjdCB0eXBlICp0eXBlLCBMT05HRVNUIG51bSkpOworCitleHRlcm4gdmFsdWVfcHRyIHZhbHVlX2Zyb21fZG91YmxlIFBBUkFNUyAoKHN0cnVjdCB0eXBlICp0eXBlLCBET1VCTEVTVCBudW0pKTsKKworZXh0ZXJuIHZhbHVlX3B0ciB2YWx1ZV9hdCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqdHlwZSwgQ09SRV9BRERSIGFkZHIsIGFzZWN0aW9uICpzZWN0KSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfYXRfbGF6eSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqdHlwZSwgQ09SRV9BRERSIGFkZHIsIGFzZWN0aW9uICpzZWN0KSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfZnJvbV9yZWdpc3RlciBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqdHlwZSwgaW50IHJlZ251bSwKKwkJCQkJICBzdHJ1Y3QgZnJhbWVfaW5mbyAqIGZyYW1lKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfb2ZfdmFyaWFibGUgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqdmFyLAorCQkJCQkgICAgc3RydWN0IGJsb2NrICpiKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfb2ZfcmVnaXN0ZXIgUEFSQU1TICgoaW50IHJlZ251bSkpOworCitleHRlcm4gaW50IHN5bWJvbF9yZWFkX25lZWRzX2ZyYW1lIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKikpOworCitleHRlcm4gdmFsdWVfcHRyIHJlYWRfdmFyX3ZhbHVlIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKnZhciwKKwkJCQkJIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZSkpOworCitleHRlcm4gdmFsdWVfcHRyIGxvY2F0ZV92YXJfdmFsdWUgUEFSQU1TICgoc3RydWN0IHN5bWJvbCAqdmFyLAorCQkJCSAgICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWUpKTsKKworZXh0ZXJuIHZhbHVlX3B0ciBhbGxvY2F0ZV92YWx1ZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqdHlwZSkpOworCitleHRlcm4gdmFsdWVfcHRyIGFsbG9jYXRlX3JlcGVhdF92YWx1ZSBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqdHlwZSwgaW50IGNvdW50KSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfbWFyayBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkIHZhbHVlX2ZyZWVfdG9fbWFyayBQQVJBTVMgKCh2YWx1ZV9wdHIgbWFyaykpOworCitleHRlcm4gdmFsdWVfcHRyIHZhbHVlX3N0cmluZyBQQVJBTVMgKChjaGFyICpwdHIsIGludCBsZW4pKTsKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfYml0c3RyaW5nIFBBUkFNUyAoKGNoYXIgKnB0ciwgaW50IGxlbikpOworCitleHRlcm4gdmFsdWVfcHRyIHZhbHVlX2FycmF5IFBBUkFNUyAoKGludCBsb3dib3VuZCwgaW50IGhpZ2hib3VuZCwKKwkJCQkgICAgICB2YWx1ZV9wdHIgKmVsZW12ZWMpKTsKKworZXh0ZXJuIHZhbHVlX3B0ciB2YWx1ZV9jb25jYXQgUEFSQU1TICgodmFsdWVfcHRyIGFyZzEsIHZhbHVlX3B0ciBhcmcyKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfYmlub3AgUEFSQU1TICgodmFsdWVfcHRyIGFyZzEsIHZhbHVlX3B0ciBhcmcyLAorCQkJCSAgICAgIGVudW0gZXhwX29wY29kZSBvcCkpOworCitleHRlcm4gdmFsdWVfcHRyIHZhbHVlX2FkZCBQQVJBTVMgKCh2YWx1ZV9wdHIgYXJnMSwgdmFsdWVfcHRyIGFyZzIpKTsKKworZXh0ZXJuIHZhbHVlX3B0ciB2YWx1ZV9zdWIgUEFSQU1TICgodmFsdWVfcHRyIGFyZzEsIHZhbHVlX3B0ciBhcmcyKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfY29lcmNlX2FycmF5IFBBUkFNUyAoKHZhbHVlX3B0ciBhcmcxKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfY29lcmNlX2Z1bmN0aW9uIFBBUkFNUyAoKHZhbHVlX3B0ciBhcmcxKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfaW5kIFBBUkFNUyAoKHZhbHVlX3B0ciBhcmcxKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfYWRkciBQQVJBTVMgKCh2YWx1ZV9wdHIgYXJnMSkpOworCitleHRlcm4gdmFsdWVfcHRyIHZhbHVlX2Fzc2lnbiBQQVJBTVMgKCh2YWx1ZV9wdHIgdG92YWwsIHZhbHVlX3B0ciBmcm9tdmFsKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfbmVnIFBBUkFNUyAoKHZhbHVlX3B0ciBhcmcxKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfY29tcGxlbWVudCBQQVJBTVMgKCh2YWx1ZV9wdHIgYXJnMSkpOworCitleHRlcm4gdmFsdWVfcHRyIHZhbHVlX3N0cnVjdF9lbHQgUEFSQU1TICgodmFsdWVfcHRyICphcmdwLCB2YWx1ZV9wdHIgKmFyZ3MsCisJCQkJCSAgIGNoYXIgKm5hbWUsCisJCQkJCSAgIGludCAqc3RhdGljX21lbWZ1bmNwLCBjaGFyICplcnIpKTsKKworZXh0ZXJuIHZhbHVlX3B0ciB2YWx1ZV9zdHJ1Y3RfZWx0X2Zvcl9yZWZlcmVuY2UgUEFSQU1TICgoc3RydWN0IHR5cGUgKmRvbWFpbiwKKwkJCQkJCQkgaW50IG9mZnNldCwKKwkJCQkJCQkgc3RydWN0IHR5cGUgKmN1cnR5cGUsCisJCQkJCQkJIGNoYXIgKm5hbWUsCisJCQkJCQkJIHN0cnVjdCB0eXBlICppbnR5cGUpKTsKKworZXh0ZXJuIHZhbHVlX3B0ciB2YWx1ZV9zdGF0aWNfZmllbGQgUEFSQU1TICgoc3RydWN0IHR5cGUgKnR5cGUsIGludCBmaWVsZG5vKSk7CisKK2V4dGVybiBzdHJ1Y3QgZm5fZmllbGQgKgordmFsdWVfZmluZF9vbG9hZF9tZXRob2RfbGlzdCBQQVJBTVMgKCh2YWx1ZV9wdHIgKiwgY2hhciAqLCBpbnQsIGludCAqLCBpbnQgKiwgc3RydWN0IHR5cGUgKiosIGludCAqKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfZmllbGQgUEFSQU1TICgodmFsdWVfcHRyIGFyZzEsIGludCBmaWVsZG5vKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfcHJpbWl0aXZlX2ZpZWxkIFBBUkFNUyAoKHZhbHVlX3B0ciBhcmcxLCBpbnQgb2Zmc2V0LAorCQkJCQkJaW50IGZpZWxkbm8sCisJCQkJCQlzdHJ1Y3QgdHlwZSAqYXJnX3R5cGUpKTsKKworZXh0ZXJuIHN0cnVjdCB0eXBlICoKK3ZhbHVlX3J0dGlfdHlwZSBQQVJBTVMgKCh2YWx1ZV9wdHIsIGludCAqLCBpbnQgKiwgaW50ICopKTsKKworZXh0ZXJuIHN0cnVjdCB0eXBlICoKK3ZhbHVlX3J0dGlfdGFyZ2V0X3R5cGUgUEFSQU1TICgodmFsdWVfcHRyLCBpbnQgKiwgaW50ICosIGludCAqKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIKK3ZhbHVlX2Z1bGxfb2JqZWN0IFBBUkFNUyAoKHZhbHVlX3B0ciwgc3RydWN0IHR5cGUgKiwgaW50LCBpbnQsIGludCkpOworCitleHRlcm4gdmFsdWVfcHRyIHZhbHVlX2Nhc3QgUEFSQU1TICgoc3RydWN0IHR5cGUgKnR5cGUsIHZhbHVlX3B0ciBhcmcyKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfemVybyBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqdHlwZSwgZW51bSBsdmFsX3R5cGUgbHYpKTsKKworZXh0ZXJuIHZhbHVlX3B0ciB2YWx1ZV9yZXBlYXQgUEFSQU1TICgodmFsdWVfcHRyIGFyZzEsIGludCBjb3VudCkpOworCitleHRlcm4gdmFsdWVfcHRyIHZhbHVlX3N1YnNjcmlwdCBQQVJBTVMgKCh2YWx1ZV9wdHIgYXJyYXksIHZhbHVlX3B0ciBpZHgpKTsKKworZXh0ZXJuIHZhbHVlX3B0ciB2YWx1ZV9mcm9tX3Z0YWJsZV9pbmZvIFBBUkFNUyAoKHZhbHVlX3B0ciBhcmcsCisJCQkJCQkgc3RydWN0IHR5cGUgKnR5cGUpKTsKKworZXh0ZXJuIHZhbHVlX3B0ciB2YWx1ZV9iZWluZ19yZXR1cm5lZCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqdmFsdHlwZSwgCisJCQkJCSAgICAgICBjaGFyIHJldGJ1ZltSRUdJU1RFUl9CWVRFU10sCisJCQkJCSAgICAgICBpbnQgc3RydWN0X3JldHVybikpOworCitleHRlcm4gdmFsdWVfcHRyIHZhbHVlX2luIFBBUkFNUyAoKHZhbHVlX3B0ciBlbGVtZW50LCB2YWx1ZV9wdHIgc2V0KSk7CisKK2V4dGVybiBpbnQgdmFsdWVfYml0X2luZGV4IFBBUkFNUyAoKHN0cnVjdCB0eXBlICp0eXBlLCBjaGFyICphZGRyLCBpbnQgaW5kZXgpKTsKKworZXh0ZXJuIGludCB1c2luZ19zdHJ1Y3RfcmV0dXJuIFBBUkFNUyAoKHZhbHVlX3B0ciBmdW5jdGlvbiwgQ09SRV9BRERSIGZ1bmNhZGRyLAorCQkJCQlzdHJ1Y3QgdHlwZSAqdmFsdWVfdHlwZSwgaW50IGdjY19wKSk7CisKK2V4dGVybiB2b2lkIHNldF9yZXR1cm5fdmFsdWUgUEFSQU1TICgodmFsdWVfcHRyIHZhbCkpOworCitleHRlcm4gdmFsdWVfcHRyIGV2YWx1YXRlX2V4cHJlc3Npb24gUEFSQU1TICgoc3RydWN0IGV4cHJlc3Npb24gKmV4cCkpOworCitleHRlcm4gdmFsdWVfcHRyIGV2YWx1YXRlX3R5cGUgUEFSQU1TICgoc3RydWN0IGV4cHJlc3Npb24gKmV4cCkpOworCitleHRlcm4gdmFsdWVfcHRyIGV2YWx1YXRlX3N1YmV4cF93aXRoX2NvZXJjaW9uIFBBUkFNUyAoKHN0cnVjdCBleHByZXNzaW9uICosCisJCQkJCQkJaW50ICosIGVudW0gbm9zaWRlKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgcGFyc2VfYW5kX2V2YWwgUEFSQU1TICgoY2hhciAqZXhwKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgcGFyc2VfdG9fY29tbWFfYW5kX2V2YWwgUEFSQU1TICgoY2hhciAqKmV4cHApKTsKKworZXh0ZXJuIHN0cnVjdCB0eXBlICpwYXJzZV9hbmRfZXZhbF90eXBlIFBBUkFNUyAoKGNoYXIgKnAsIGludCBsZW5ndGgpKTsKKworZXh0ZXJuIENPUkVfQUREUiBwYXJzZV9hbmRfZXZhbF9hZGRyZXNzIFBBUkFNUyAoKGNoYXIgKmV4cCkpOworCitleHRlcm4gQ09SRV9BRERSIHBhcnNlX2FuZF9ldmFsX2FkZHJlc3NfMSBQQVJBTVMgKChjaGFyICoqZXhwcHRyKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgYWNjZXNzX3ZhbHVlX2hpc3RvcnkgUEFSQU1TICgoaW50IG51bSkpOworCitleHRlcm4gdmFsdWVfcHRyIHZhbHVlX29mX2ludGVybmFsdmFyIFBBUkFNUyAoKHN0cnVjdCBpbnRlcm5hbHZhciAqdmFyKSk7CisKK2V4dGVybiB2b2lkIHNldF9pbnRlcm5hbHZhciBQQVJBTVMgKChzdHJ1Y3QgaW50ZXJuYWx2YXIgKnZhciwgdmFsdWVfcHRyIHZhbCkpOworCitleHRlcm4gdm9pZCBzZXRfaW50ZXJuYWx2YXJfY29tcG9uZW50IFBBUkFNUyAoKHN0cnVjdCBpbnRlcm5hbHZhciAqdmFyLAorCQkJCQkgICAgICAgaW50IG9mZnNldCwKKwkJCQkJICAgICAgIGludCBiaXRwb3MsIGludCBiaXRzaXplLAorCQkJCQkgICAgICAgdmFsdWVfcHRyIG5ld3ZhbHVlKSk7CisKK2V4dGVybiBzdHJ1Y3QgaW50ZXJuYWx2YXIgKmxvb2t1cF9pbnRlcm5hbHZhciBQQVJBTVMgKChjaGFyICpuYW1lKSk7CisKK2V4dGVybiBpbnQgdmFsdWVfZXF1YWwgUEFSQU1TICgodmFsdWVfcHRyIGFyZzEsIHZhbHVlX3B0ciBhcmcyKSk7CisKK2V4dGVybiBpbnQgdmFsdWVfbGVzcyBQQVJBTVMgKCh2YWx1ZV9wdHIgYXJnMSwgdmFsdWVfcHRyIGFyZzIpKTsKKworZXh0ZXJuIGludCB2YWx1ZV9sb2dpY2FsX25vdCBQQVJBTVMgKCh2YWx1ZV9wdHIgYXJnMSkpOworCisvKiBDKysgKi8KKworZXh0ZXJuIHZhbHVlX3B0ciB2YWx1ZV9vZl90aGlzIFBBUkFNUyAoKGludCBjb21wbGFpbikpOworCitleHRlcm4gdmFsdWVfcHRyIHZhbHVlX3hfYmlub3AgUEFSQU1TICgodmFsdWVfcHRyIGFyZzEsIHZhbHVlX3B0ciBhcmcyLAorCQkJCQllbnVtIGV4cF9vcGNvZGUgb3AsCisJCQkJCWVudW0gZXhwX29wY29kZSBvdGhlcm9wLAorCQkJCQllbnVtIG5vc2lkZSBub3NpZGUpKTsKKworZXh0ZXJuIHZhbHVlX3B0ciB2YWx1ZV94X3Vub3AgUEFSQU1TICgodmFsdWVfcHRyIGFyZzEsIGVudW0gZXhwX29wY29kZSBvcCwKKwkJCQkgICAgICAgZW51bSBub3NpZGUgbm9zaWRlKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfZm5fZmllbGQgUEFSQU1TICgodmFsdWVfcHRyICphcmcxcCwgc3RydWN0IGZuX2ZpZWxkICpmLAorCQkJCQkgaW50IGosCisJCQkJCSBzdHJ1Y3QgdHlwZSogdHlwZSwgaW50IG9mZnNldCkpOworCitleHRlcm4gdmFsdWVfcHRyIHZhbHVlX3ZpcnR1YWxfZm5fZmllbGQgUEFSQU1TICgodmFsdWVfcHRyICphcmcxcCwKKwkJCQkJCSBzdHJ1Y3QgZm5fZmllbGQgKmYsIGludCBqLAorCQkJCQkJIHN0cnVjdCB0eXBlICp0eXBlLAorCQkJCQkJIGludCBvZmZzZXQpKTsKKworZXh0ZXJuIGludCBiaW5vcF91c2VyX2RlZmluZWRfcCBQQVJBTVMgKChlbnVtIGV4cF9vcGNvZGUgb3AsCisJCQkJCSB2YWx1ZV9wdHIgYXJnMSwgdmFsdWVfcHRyIGFyZzIpKTsKKworZXh0ZXJuIGludCB1bm9wX3VzZXJfZGVmaW5lZF9wIFBBUkFNUyAoKGVudW0gZXhwX29wY29kZSBvcCwgdmFsdWVfcHRyIGFyZzEpKTsKKworZXh0ZXJuIGludCBkZXN0cnVjdG9yX25hbWVfcCBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCB0eXBlICp0eXBlKSk7CisKKyNkZWZpbmUgdmFsdWVfZnJlZSh2YWwpIGZyZWUgKChQVFIpdmFsKQorCitleHRlcm4gdm9pZCBmcmVlX2FsbF92YWx1ZXMgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCByZWxlYXNlX3ZhbHVlIFBBUkFNUyAoKHZhbHVlX3B0ciB2YWwpKTsKKworZXh0ZXJuIGludCByZWNvcmRfbGF0ZXN0X3ZhbHVlIFBBUkFNUyAoKHZhbHVlX3B0ciB2YWwpKTsKKworZXh0ZXJuIHZvaWQgcmVnaXN0ZXJzX2NoYW5nZWQgUEFSQU1TICgodm9pZCkpOworCitleHRlcm4gdm9pZCByZWFkX3JlZ2lzdGVyX2J5dGVzIFBBUkFNUyAoKGludCByZWdieXRlLCBjaGFyICpteWFkZHIsIGludCBsZW4pKTsKKworZXh0ZXJuIHZvaWQgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgUEFSQU1TICgoaW50IHJlZ2J5dGUsIGNoYXIgKm15YWRkciwgaW50IGxlbikpOworCitleHRlcm4gdm9pZAorcmVhZF9yZWdpc3Rlcl9nZW4gUEFSQU1TICgoaW50IHJlZ25vLCBjaGFyICpteWFkZHIpKTsKKworZXh0ZXJuIENPUkVfQUREUgorcmVhZF9yZWdpc3RlciBQQVJBTVMgKChpbnQgcmVnbm8pKTsKKworZXh0ZXJuIENPUkVfQUREUgorcmVhZF9yZWdpc3Rlcl9waWQgUEFSQU1TICgoaW50IHJlZ25vLCBpbnQgcGlkKSk7CisKK2V4dGVybiB2b2lkCit3cml0ZV9yZWdpc3RlciBQQVJBTVMgKChpbnQgcmVnbm8sIExPTkdFU1QgdmFsKSk7CisKK2V4dGVybiB2b2lkCit3cml0ZV9yZWdpc3Rlcl9waWQgUEFSQU1TICgoaW50IHJlZ25vLCBDT1JFX0FERFIgdmFsLCBpbnQgcGlkKSk7CisKK2V4dGVybiB2b2lkCitzdXBwbHlfcmVnaXN0ZXIgUEFSQU1TICgoaW50IHJlZ25vLCBjaGFyICp2YWwpKTsKKworZXh0ZXJuIHZvaWQKK2dldF9zYXZlZF9yZWdpc3RlciBQQVJBTVMgKChjaGFyICpyYXdfYnVmZmVyLCBpbnQgKm9wdGltaXplZCwKKwkJCSAgICBDT1JFX0FERFIgKmFkZHJwLCBzdHJ1Y3QgZnJhbWVfaW5mbyAqZnJhbWUsCisJCQkgICAgaW50IHJlZ251bSwgZW51bSBsdmFsX3R5cGUgKmx2YWwpKTsKKworZXh0ZXJuIHZvaWQKK21vZGlmeV9maWVsZCBQQVJBTVMgKChjaGFyICphZGRyLCBMT05HRVNUIGZpZWxkdmFsLCBpbnQgYml0cG9zLCBpbnQgYml0c2l6ZSkpOworCitleHRlcm4gdm9pZAordHlwZV9wcmludCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqdHlwZSwgY2hhciAqdmFyc3RyaW5nLCBHREJfRklMRSAqc3RyZWFtLAorCQkgICAgaW50IHNob3cpKTsKKworZXh0ZXJuIGNoYXIgKmJhc2VjbGFzc19hZGRyIFBBUkFNUyAoKHN0cnVjdCB0eXBlICp0eXBlLCBpbnQgaW5kZXgsCisJCQkJICAgICBjaGFyICp2YWxhZGRyLAorCQkJCSAgICAgdmFsdWVfcHRyICp2YWx1ZXAsIGludCAqZXJycCkpOworCitleHRlcm4gdm9pZAorcHJpbnRfbG9uZ2VzdCBQQVJBTVMgKChHREJfRklMRSAqc3RyZWFtLCBpbnQgZm9ybWF0LCBpbnQgdXNlX2xvY2FsLAorCQkgICAgICAgTE9OR0VTVCB2YWwpKTsKKworZXh0ZXJuIHZvaWQKK3ByaW50X2Zsb2F0aW5nIFBBUkFNUyAoKGNoYXIgKnZhbGFkZHIsIHN0cnVjdCB0eXBlICp0eXBlLCBHREJfRklMRSAqc3RyZWFtKSk7CisKK2V4dGVybiBpbnQgdmFsdWVfcHJpbnQgUEFSQU1TICgodmFsdWVfcHRyIHZhbCwgR0RCX0ZJTEUgKnN0cmVhbSwgaW50IGZvcm1hdCwKKwkJCQllbnVtIHZhbF9wcmV0dHlwcmludCBwcmV0dHkpKTsKKworZXh0ZXJuIHZvaWQKK3ZhbHVlX3ByaW50X2FycmF5X2VsZW1lbnRzIFBBUkFNUyAoKHZhbHVlX3B0ciB2YWwsIEdEQl9GSUxFKiBzdHJlYW0sCisJCQkJICAgIGludCBmb3JtYXQsIGVudW0gdmFsX3ByZXR0eXByaW50IHByZXR0eSkpOworCitleHRlcm4gdmFsdWVfcHRyCit2YWx1ZV9yZWxlYXNlX3RvX21hcmsgUEFSQU1TICgodmFsdWVfcHRyIG1hcmspKTsKKworZXh0ZXJuIGludAordmFsX3ByaW50IFBBUkFNUyAoKHN0cnVjdCB0eXBlICp0eXBlLCBjaGFyICp2YWxhZGRyLCBpbnQgZW1iZWRkZWRfb2Zmc2V0LCBDT1JFX0FERFIgYWRkcmVzcywKKwkJICAgR0RCX0ZJTEUgKnN0cmVhbSwgaW50IGZvcm1hdCwgaW50IGRlcmVmX3JlZiwKKwkJICAgaW50IHJlY3Vyc2UsIGVudW0gdmFsX3ByZXR0eXByaW50IHByZXR0eSkpOworCitleHRlcm4gaW50Cit2YWxfcHJpbnRfc3RyaW5nIFBBUkFNUyAoKENPUkVfQUREUiBhZGRyLCBpbnQgbGVuLCBpbnQgd2lkdGgsIEdEQl9GSUxFICpzdHJlYW0pKTsKKworZXh0ZXJuIHZvaWQKK3ByaW50X3ZhcmlhYmxlX3ZhbHVlIFBBUkFNUyAoKHN0cnVjdCBzeW1ib2wgKnZhciwgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lLAorCQkJICAgICAgR0RCX0ZJTEUgKnN0cmVhbSkpOworCitleHRlcm4gaW50IGNoZWNrX2ZpZWxkIFBBUkFNUyAoKHZhbHVlX3B0ciwgY29uc3QgY2hhciAqKSk7CisKK2V4dGVybiB2b2lkCitjX3R5cGVkZWZfcHJpbnQgUEFSQU1TICgoc3RydWN0IHR5cGUgKnR5cGUsIHN0cnVjdCBzeW1ib2wgKm5ld3MsIEdEQl9GSUxFICpzdHJlYW0pKTsKKworZXh0ZXJuIGNoYXIgKgoraW50ZXJuYWx2YXJfbmFtZSBQQVJBTVMgKChzdHJ1Y3QgaW50ZXJuYWx2YXIgKnZhcikpOworCitleHRlcm4gdm9pZAorY2xlYXJfdmFsdWVfaGlzdG9yeSBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiB2b2lkCitjbGVhcl9pbnRlcm5hbHZhcnMgUEFSQU1TICgodm9pZCkpOworCisvKiBGcm9tIHZhbHVlcy5jICovCisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfY29weSBQQVJBTVMgKCh2YWx1ZV9wdHIpKTsKKworZXh0ZXJuIGludCBiYXNlY2xhc3Nfb2Zmc2V0IFBBUkFNUyAoKHN0cnVjdCB0eXBlICosIGludCwgY2hhciAqLCBDT1JFX0FERFIpKTsKKworLyogRnJvbSB2YWxvcHMuYyAqLworCitleHRlcm4gdmFsdWVfcHRyIHZhcnlpbmdfdG9fc2xpY2UgUEFSQU1TICgodmFsdWVfcHRyKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgdmFsdWVfc2xpY2UgUEFSQU1TICgodmFsdWVfcHRyLCBpbnQsIGludCkpOworCitleHRlcm4gdmFsdWVfcHRyIGNhbGxfZnVuY3Rpb25fYnlfaGFuZCBQQVJBTVMgKCh2YWx1ZV9wdHIsIGludCwgdmFsdWVfcHRyICopKTsKKworZXh0ZXJuIHZhbHVlX3B0ciB2YWx1ZV9saXRlcmFsX2NvbXBsZXggUEFSQU1TICgodmFsdWVfcHRyLCB2YWx1ZV9wdHIsIHN0cnVjdCB0eXBlKikpOworCitleHRlcm4gdm9pZCBmaW5kX3J0X3ZiYXNlX29mZnNldCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBzdHJ1Y3QgdHlwZSAqLCBjaGFyICosIGludCwgaW50ICosIGludCAqKSk7CisKK2V4dGVybiB2YWx1ZV9wdHIgZmluZF9mdW5jdGlvbl9pbl9pbmZlcmlvciBQQVJBTVMgKChjaGFyICopKTsKKworZXh0ZXJuIHZhbHVlX3B0ciB2YWx1ZV9hbGxvY2F0ZV9zcGFjZV9pbl9pbmZlcmlvciBQQVJBTVMgKChpbnQpKTsKKworI2VuZGlmCS8qICFkZWZpbmVkIChWQUxVRV9IKSAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3ZhbHVlcy5jIGIvZ2RiL3ZhbHVlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MDUzYjgKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdmFsdWVzLmMKQEAgLTAsMCArMSwxNjIzIEBACisvKiBMb3cgbGV2ZWwgcGFja2luZyBhbmQgdW5wYWNraW5nIG9mIHZhbHVlcyBmb3IgR0RCLCB0aGUgR05VIERlYnVnZ2VyLgorICAgQ29weXJpZ2h0IDE5ODYsIDg3LCA4OSwgOTEsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJ2YWx1ZS5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1ZGUgInNjbS1sYW5nLmgiCisjaW5jbHVkZSAiZGVtYW5nbGUuaCIKKworLyogUHJvdG90eXBlcyBmb3IgZXhwb3J0ZWQgZnVuY3Rpb25zLiAqLworCit2b2lkIF9pbml0aWFsaXplX3ZhbHVlcyBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gKi8KKworc3RhdGljIHZhbHVlX3B0ciB2YWx1ZV9oZWFkb2YgUEFSQU1TICgodmFsdWVfcHRyLCBzdHJ1Y3QgdHlwZSAqLAorCQkJCSAgICAgICBzdHJ1Y3QgdHlwZSAqKSk7CisKK3N0YXRpYyB2b2lkIHNob3dfdmFsdWVzIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkIHNob3dfY29udmVuaWVuY2UgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIGludCB2Yl9tYXRjaCBQQVJBTVMgKChzdHJ1Y3QgdHlwZSAqLCBpbnQsIHN0cnVjdCB0eXBlICopKTsKKworLyogVGhlIHZhbHVlLWhpc3RvcnkgcmVjb3JkcyBhbGwgdGhlIHZhbHVlcyBwcmludGVkCisgICBieSBwcmludCBjb21tYW5kcyBkdXJpbmcgdGhpcyBzZXNzaW9uLiAgRWFjaCBjaHVuaworICAgcmVjb3JkcyA2MCBjb25zZWN1dGl2ZSB2YWx1ZXMuICBUaGUgZmlyc3QgY2h1bmsgb24KKyAgIHRoZSBjaGFpbiByZWNvcmRzIHRoZSBtb3N0IHJlY2VudCB2YWx1ZXMuCisgICBUaGUgdG90YWwgbnVtYmVyIG9mIHZhbHVlcyBpcyBpbiB2YWx1ZV9oaXN0b3J5X2NvdW50LiAgKi8KKworI2RlZmluZSBWQUxVRV9ISVNUT1JZX0NIVU5LIDYwCisKK3N0cnVjdCB2YWx1ZV9oaXN0b3J5X2NodW5rCit7CisgIHN0cnVjdCB2YWx1ZV9oaXN0b3J5X2NodW5rICpuZXh0OworICB2YWx1ZV9wdHIgdmFsdWVzW1ZBTFVFX0hJU1RPUllfQ0hVTktdOworfTsKKworLyogQ2hhaW4gb2YgY2h1bmtzIG5vdyBpbiB1c2UuICAqLworCitzdGF0aWMgc3RydWN0IHZhbHVlX2hpc3RvcnlfY2h1bmsgKnZhbHVlX2hpc3RvcnlfY2hhaW47CisKK3N0YXRpYyBpbnQgdmFsdWVfaGlzdG9yeV9jb3VudDsJLyogQWJzIG51bWJlciBvZiBsYXN0IGVudHJ5IHN0b3JlZCAqLworDAorLyogTGlzdCBvZiBhbGwgdmFsdWUgb2JqZWN0cyBjdXJyZW50bHkgYWxsb2NhdGVkCisgICAoZXhjZXB0IGZvciB0aG9zZSByZWxlYXNlZCBieSBjYWxscyB0byByZWxlYXNlX3ZhbHVlKQorICAgVGhpcyBpcyBzbyB0aGV5IGNhbiBiZSBmcmVlZCBhZnRlciBlYWNoIGNvbW1hbmQuICAqLworCitzdGF0aWMgdmFsdWVfcHRyIGFsbF92YWx1ZXM7CisKKy8qIEFsbG9jYXRlIGEgIHZhbHVlICB0aGF0IGhhcyB0aGUgY29ycmVjdCBsZW5ndGggZm9yIHR5cGUgVFlQRS4gICovCisKK3ZhbHVlX3B0cgorYWxsb2NhdGVfdmFsdWUgKHR5cGUpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworeworICByZWdpc3RlciB2YWx1ZV9wdHIgdmFsOworICBzdHJ1Y3QgdHlwZSAqYXR5cGUgPSBjaGVja190eXBlZGVmICh0eXBlKTsKKworICB2YWwgPSAoc3RydWN0IHZhbHVlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHZhbHVlKSArIFRZUEVfTEVOR1RIIChhdHlwZSkpOworICBWQUxVRV9ORVhUICh2YWwpID0gYWxsX3ZhbHVlczsKKyAgYWxsX3ZhbHVlcyA9IHZhbDsKKyAgVkFMVUVfVFlQRSAodmFsKSA9IHR5cGU7CisgIFZBTFVFX0VOQ0xPU0lOR19UWVBFICh2YWwpID0gdHlwZTsKKyAgVkFMVUVfTFZBTCAodmFsKSA9IG5vdF9sdmFsOworICBWQUxVRV9BRERSRVNTICh2YWwpID0gMDsKKyAgVkFMVUVfRlJBTUUgKHZhbCkgPSAwOworICBWQUxVRV9PRkZTRVQgKHZhbCkgPSAwOworICBWQUxVRV9CSVRQT1MgKHZhbCkgPSAwOworICBWQUxVRV9CSVRTSVpFICh2YWwpID0gMDsKKyAgVkFMVUVfUkVHTk8gKHZhbCkgPSAtMTsKKyAgVkFMVUVfTEFaWSAodmFsKSA9IDA7CisgIFZBTFVFX09QVElNSVpFRF9PVVQgKHZhbCkgPSAwOworICBWQUxVRV9CRkRfU0VDVElPTiAodmFsKSA9IE5VTEw7CisgIFZBTFVFX0VNQkVEREVEX09GRlNFVCAodmFsKSA9IDA7CisgIFZBTFVFX1BPSU5URURfVE9fT0ZGU0VUICh2YWwpID0gMDsKKyAgdmFsLT5tb2RpZmlhYmxlID0gMTsKKyAgcmV0dXJuIHZhbDsKK30KKworLyogQWxsb2NhdGUgYSAgdmFsdWUgIHRoYXQgaGFzIHRoZSBjb3JyZWN0IGxlbmd0aAorICAgZm9yIENPVU5UIHJlcGV0aXRpb25zIHR5cGUgVFlQRS4gICovCisKK3ZhbHVlX3B0cgorYWxsb2NhdGVfcmVwZWF0X3ZhbHVlICh0eXBlLCBjb3VudCkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGludCBjb3VudDsKK3sKKyAgaW50IGxvd19ib3VuZCA9IGN1cnJlbnRfbGFuZ3VhZ2UtPnN0cmluZ19sb3dlcl9ib3VuZDsgLyogPz8/ICovCisgIC8qIEZJWE1FLXR5cGUtYWxsb2NhdGlvbjogbmVlZCBhIHdheSB0byBmcmVlIHRoaXMgdHlwZSB3aGVuIHdlIGFyZQorICAgICBkb25lIHdpdGggaXQuICAqLworICBzdHJ1Y3QgdHlwZSAqcmFuZ2VfdHlwZQorICAgID0gY3JlYXRlX3JhbmdlX3R5cGUgKChzdHJ1Y3QgdHlwZSAqKSBOVUxMLCBidWlsdGluX3R5cGVfaW50LAorCQkJIGxvd19ib3VuZCwgY291bnQgKyBsb3dfYm91bmQgLSAxKTsKKyAgLyogRklYTUUtdHlwZS1hbGxvY2F0aW9uOiBuZWVkIGEgd2F5IHRvIGZyZWUgdGhpcyB0eXBlIHdoZW4gd2UgYXJlCisgICAgIGRvbmUgd2l0aCBpdC4gICovCisgIHJldHVybiBhbGxvY2F0ZV92YWx1ZSAoY3JlYXRlX2FycmF5X3R5cGUgKChzdHJ1Y3QgdHlwZSAqKSBOVUxMLAorCQkJCQkgICAgdHlwZSwgcmFuZ2VfdHlwZSkpOworfQorCisvKiBSZXR1cm4gYSBtYXJrIGluIHRoZSB2YWx1ZSBjaGFpbi4gIEFsbCB2YWx1ZXMgYWxsb2NhdGVkIGFmdGVyIHRoZQorICAgbWFyayBpcyBvYnRhaW5lZCAoZXhjZXB0IGZvciB0aG9zZSByZWxlYXNlZCkgYXJlIHN1YmplY3QgdG8gYmVpbmcgZnJlZWQKKyAgIGlmIGEgc3Vic2VxdWVudCB2YWx1ZV9mcmVlX3RvX21hcmsgaXMgcGFzc2VkIHRoZSBtYXJrLiAgKi8KK3ZhbHVlX3B0cgordmFsdWVfbWFyayAoKQoreworICByZXR1cm4gYWxsX3ZhbHVlczsKK30KKworLyogRnJlZSBhbGwgdmFsdWVzIGFsbG9jYXRlZCBzaW5jZSBNQVJLIHdhcyBvYnRhaW5lZCBieSB2YWx1ZV9tYXJrCisgICAoZXhjZXB0IGZvciB0aG9zZSByZWxlYXNlZCkuICAqLwordm9pZAordmFsdWVfZnJlZV90b19tYXJrIChtYXJrKQorICAgICB2YWx1ZV9wdHIgbWFyazsKK3sKKyAgdmFsdWVfcHRyIHZhbCwgbmV4dDsKKworICBmb3IgKHZhbCA9IGFsbF92YWx1ZXM7IHZhbCAmJiB2YWwgIT0gbWFyazsgdmFsID0gbmV4dCkKKyAgICB7CisgICAgICBuZXh0ID0gVkFMVUVfTkVYVCAodmFsKTsKKyAgICAgIHZhbHVlX2ZyZWUgKHZhbCk7CisgICAgfQorICBhbGxfdmFsdWVzID0gdmFsOworfQorCisvKiBGcmVlIGFsbCB0aGUgdmFsdWVzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAoZXhjZXB0IGZvciB0aG9zZSByZWxlYXNlZCkuCisgICBDYWxsZWQgYWZ0ZXIgZWFjaCBjb21tYW5kLCBzdWNjZXNzZnVsIG9yIG5vdC4gICovCisKK3ZvaWQKK2ZyZWVfYWxsX3ZhbHVlcyAoKQoreworICByZWdpc3RlciB2YWx1ZV9wdHIgdmFsLCBuZXh0OworCisgIGZvciAodmFsID0gYWxsX3ZhbHVlczsgdmFsOyB2YWwgPSBuZXh0KQorICAgIHsKKyAgICAgIG5leHQgPSBWQUxVRV9ORVhUICh2YWwpOworICAgICAgdmFsdWVfZnJlZSAodmFsKTsKKyAgICB9CisKKyAgYWxsX3ZhbHVlcyA9IDA7Cit9CisKKy8qIFJlbW92ZSBWQUwgZnJvbSB0aGUgY2hhaW4gYWxsX3ZhbHVlcworICAgc28gaXQgd2lsbCBub3QgYmUgZnJlZWQgYXV0b21hdGljYWxseS4gICovCisKK3ZvaWQKK3JlbGVhc2VfdmFsdWUgKHZhbCkKKyAgICAgcmVnaXN0ZXIgdmFsdWVfcHRyIHZhbDsKK3sKKyAgcmVnaXN0ZXIgdmFsdWVfcHRyIHY7CisKKyAgaWYgKGFsbF92YWx1ZXMgPT0gdmFsKQorICAgIHsKKyAgICAgIGFsbF92YWx1ZXMgPSB2YWwtPm5leHQ7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGZvciAodiA9IGFsbF92YWx1ZXM7IHY7IHYgPSB2LT5uZXh0KQorICAgIHsKKyAgICAgIGlmICh2LT5uZXh0ID09IHZhbCkKKwl7CisJICB2LT5uZXh0ID0gdmFsLT5uZXh0OworCSAgYnJlYWs7CisJfQorICAgIH0KK30KKworLyogUmVsZWFzZSBhbGwgdmFsdWVzIHVwIHRvIG1hcmsgICovCit2YWx1ZV9wdHIKK3ZhbHVlX3JlbGVhc2VfdG9fbWFyayAobWFyaykKKyAgICAgdmFsdWVfcHRyIG1hcms7Cit7CisgIHZhbHVlX3B0ciB2YWwsIG5leHQ7CisKKyAgZm9yICh2YWwgPSBuZXh0ID0gYWxsX3ZhbHVlczsgbmV4dDsgbmV4dCA9IFZBTFVFX05FWFQgKG5leHQpKQorICAgIGlmIChWQUxVRV9ORVhUIChuZXh0KSA9PSBtYXJrKQorICAgICAgeworCWFsbF92YWx1ZXMgPSBWQUxVRV9ORVhUIChuZXh0KTsKKwlWQUxVRV9ORVhUIChuZXh0KSA9IDA7CisJcmV0dXJuIHZhbDsKKyAgICAgIH0KKyAgYWxsX3ZhbHVlcyA9IDA7CisgIHJldHVybiB2YWw7Cit9CisKKy8qIFJldHVybiBhIGNvcHkgb2YgdGhlIHZhbHVlIEFSRy4KKyAgIEl0IGNvbnRhaW5zIHRoZSBzYW1lIGNvbnRlbnRzLCBmb3Igc2FtZSBtZW1vcnkgYWRkcmVzcywKKyAgIGJ1dCBpdCdzIGEgZGlmZmVyZW50IGJsb2NrIG9mIHN0b3JhZ2UuICAqLworCit2YWx1ZV9wdHIKK3ZhbHVlX2NvcHkgKGFyZykKKyAgICAgdmFsdWVfcHRyIGFyZzsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKmVuY2xfdHlwZSA9IFZBTFVFX0VOQ0xPU0lOR19UWVBFIChhcmcpOworICByZWdpc3RlciB2YWx1ZV9wdHIgdmFsID0gYWxsb2NhdGVfdmFsdWUgKGVuY2xfdHlwZSk7CisgIFZBTFVFX1RZUEUgKHZhbCkgPSBWQUxVRV9UWVBFIChhcmcpOworICBWQUxVRV9MVkFMICh2YWwpID0gVkFMVUVfTFZBTCAoYXJnKTsKKyAgVkFMVUVfQUREUkVTUyAodmFsKSA9IFZBTFVFX0FERFJFU1MgKGFyZyk7CisgIFZBTFVFX09GRlNFVCAodmFsKSA9IFZBTFVFX09GRlNFVCAoYXJnKTsKKyAgVkFMVUVfQklUUE9TICh2YWwpID0gVkFMVUVfQklUUE9TIChhcmcpOworICBWQUxVRV9CSVRTSVpFICh2YWwpID0gVkFMVUVfQklUU0laRSAoYXJnKTsKKyAgVkFMVUVfRlJBTUUgKHZhbCkgPSBWQUxVRV9GUkFNRSAoYXJnKTsKKyAgVkFMVUVfUkVHTk8gKHZhbCkgPSBWQUxVRV9SRUdOTyAoYXJnKTsKKyAgVkFMVUVfTEFaWSAodmFsKSA9IFZBTFVFX0xBWlkgKGFyZyk7CisgIFZBTFVFX09QVElNSVpFRF9PVVQgKHZhbCkgPSBWQUxVRV9PUFRJTUlaRURfT1VUIChhcmcpOworICBWQUxVRV9FTUJFRERFRF9PRkZTRVQgKHZhbCkgPSBWQUxVRV9FTUJFRERFRF9PRkZTRVQgKGFyZyk7CisgIFZBTFVFX1BPSU5URURfVE9fT0ZGU0VUICh2YWwpID0gVkFMVUVfUE9JTlRFRF9UT19PRkZTRVQgKGFyZyk7CisgIFZBTFVFX0JGRF9TRUNUSU9OICh2YWwpID0gVkFMVUVfQkZEX1NFQ1RJT04gKGFyZyk7CisgIHZhbC0+bW9kaWZpYWJsZSA9IGFyZy0+bW9kaWZpYWJsZTsKKyAgaWYgKCFWQUxVRV9MQVpZICh2YWwpKQorICAgIHsKKyAgICAgIG1lbWNweSAoVkFMVUVfQ09OVEVOVFNfQUxMX1JBVyAodmFsKSwgVkFMVUVfQ09OVEVOVFNfQUxMX1JBVyAoYXJnKSwKKwkgICAgICBUWVBFX0xFTkdUSCAoVkFMVUVfRU5DTE9TSU5HX1RZUEUgKGFyZykpKTsKKworICAgIH0KKyAgcmV0dXJuIHZhbDsKK30KKwwKKy8qIEFjY2VzcyB0byB0aGUgdmFsdWUgaGlzdG9yeS4gICovCisKKy8qIFJlY29yZCBhIG5ldyB2YWx1ZSBpbiB0aGUgdmFsdWUgaGlzdG9yeS4KKyAgIFJldHVybnMgdGhlIGFic29sdXRlIGhpc3RvcnkgaW5kZXggb2YgdGhlIGVudHJ5LgorICAgUmVzdWx0IG9mIC0xIGluZGljYXRlcyB0aGUgdmFsdWUgd2FzIG5vdCBzYXZlZDsgb3RoZXJ3aXNlIGl0IGlzIHRoZQorICAgdmFsdWUgaGlzdG9yeSBpbmRleCBvZiB0aGlzIG5ldyBpdGVtLiAgKi8KKworaW50CityZWNvcmRfbGF0ZXN0X3ZhbHVlICh2YWwpCisgICAgIHZhbHVlX3B0ciB2YWw7Cit7CisgIGludCBpOworCisgIC8qIFdlIGRvbid0IHdhbnQgdGhpcyB2YWx1ZSB0byBoYXZlIGFueXRoaW5nIHRvIGRvIHdpdGggdGhlIGluZmVyaW9yIGFueW1vcmUuCisgICAgIEluIHBhcnRpY3VsYXIsICJzZXQgJDEgPSA1MCIgc2hvdWxkIG5vdCBhZmZlY3QgdGhlIHZhcmlhYmxlIGZyb20gd2hpY2gKKyAgICAgdGhlIHZhbHVlIHdhcyB0YWtlbiwgYW5kIGZhc3Qgd2F0Y2hwb2ludHMgc2hvdWxkIGJlIGFibGUgdG8gYXNzdW1lIHRoYXQKKyAgICAgYSB2YWx1ZSBvbiB0aGUgdmFsdWUgaGlzdG9yeSBuZXZlciBjaGFuZ2VzLiAgKi8KKyAgaWYgKFZBTFVFX0xBWlkgKHZhbCkpCisgICAgdmFsdWVfZmV0Y2hfbGF6eSAodmFsKTsKKyAgLyogV2UgcHJlc2VydmUgVkFMVUVfTFZBTCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBmaW5kIG91dCB3aGVyZSBpdCB3YXMgZmV0Y2hlZAorICAgICBmcm9tLiAgVGhpcyBpcyBhIGJpdCBkdWJpb3VzLCBiZWNhdXNlIHRoZW4gKiYkMSBkb2VzIG5vdCBqdXN0IHJldHVybiAkMQorICAgICBidXQgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhhdCBsb2NhdGlvbi4gIGMnZXN0IGxhIHZpZS4uLiAgKi8KKyAgdmFsLT5tb2RpZmlhYmxlID0gMDsKKyAgcmVsZWFzZV92YWx1ZSAodmFsKTsKKworICAvKiBIZXJlIHdlIHRyZWF0IHZhbHVlX2hpc3RvcnlfY291bnQgYXMgb3JpZ2luLXplcm8KKyAgICAgYW5kIGFwcGx5aW5nIHRvIHRoZSB2YWx1ZSBiZWluZyBzdG9yZWQgbm93LiAgKi8KKworICBpID0gdmFsdWVfaGlzdG9yeV9jb3VudCAlIFZBTFVFX0hJU1RPUllfQ0hVTks7CisgIGlmIChpID09IDApCisgICAgeworICAgICAgcmVnaXN0ZXIgc3RydWN0IHZhbHVlX2hpc3RvcnlfY2h1bmsgKm5ldworCT0gKHN0cnVjdCB2YWx1ZV9oaXN0b3J5X2NodW5rICopCisJICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCB2YWx1ZV9oaXN0b3J5X2NodW5rKSk7CisgICAgICBtZW1zZXQgKG5ldy0+dmFsdWVzLCAwLCBzaXplb2YgbmV3LT52YWx1ZXMpOworICAgICAgbmV3LT5uZXh0ID0gdmFsdWVfaGlzdG9yeV9jaGFpbjsKKyAgICAgIHZhbHVlX2hpc3RvcnlfY2hhaW4gPSBuZXc7CisgICAgfQorCisgIHZhbHVlX2hpc3RvcnlfY2hhaW4tPnZhbHVlc1tpXSA9IHZhbDsKKworICAvKiBOb3cgd2UgcmVnYXJkIHZhbHVlX2hpc3RvcnlfY291bnQgYXMgb3JpZ2luLW9uZQorICAgICBhbmQgYXBwbHlpbmcgdG8gdGhlIHZhbHVlIGp1c3Qgc3RvcmVkLiAgKi8KKworICByZXR1cm4gKyt2YWx1ZV9oaXN0b3J5X2NvdW50OworfQorCisvKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSB2YWx1ZSBpbiB0aGUgaGlzdG9yeSB3aXRoIHNlcXVlbmNlIG51bWJlciBOVU0uICAqLworCit2YWx1ZV9wdHIKK2FjY2Vzc192YWx1ZV9oaXN0b3J5IChudW0pCisgICAgIGludCBudW07Cit7CisgIHJlZ2lzdGVyIHN0cnVjdCB2YWx1ZV9oaXN0b3J5X2NodW5rICpjaHVuazsKKyAgcmVnaXN0ZXIgaW50IGk7CisgIHJlZ2lzdGVyIGludCBhYnNudW0gPSBudW07CisKKyAgaWYgKGFic251bSA8PSAwKQorICAgIGFic251bSArPSB2YWx1ZV9oaXN0b3J5X2NvdW50OworCisgIGlmIChhYnNudW0gPD0gMCkKKyAgICB7CisgICAgICBpZiAobnVtID09IDApCisJZXJyb3IgKCJUaGUgaGlzdG9yeSBpcyBlbXB0eS4iKTsKKyAgICAgIGVsc2UgaWYgKG51bSA9PSAxKQorCWVycm9yICgiVGhlcmUgaXMgb25seSBvbmUgdmFsdWUgaW4gdGhlIGhpc3RvcnkuIik7CisgICAgICBlbHNlCisJZXJyb3IgKCJIaXN0b3J5IGRvZXMgbm90IGdvIGJhY2sgdG8gJCQlZC4iLCAtbnVtKTsKKyAgICB9CisgIGlmIChhYnNudW0gPiB2YWx1ZV9oaXN0b3J5X2NvdW50KQorICAgIGVycm9yICgiSGlzdG9yeSBoYXMgbm90IHlldCByZWFjaGVkICQlZC4iLCBhYnNudW0pOworCisgIGFic251bS0tOworCisgIC8qIE5vdyBhYnNudW0gaXMgYWx3YXlzIGFic29sdXRlIGFuZCBvcmlnaW4gemVyby4gICovCisKKyAgY2h1bmsgPSB2YWx1ZV9oaXN0b3J5X2NoYWluOworICBmb3IgKGkgPSAodmFsdWVfaGlzdG9yeV9jb3VudCAtIDEpIC8gVkFMVUVfSElTVE9SWV9DSFVOSyAtIGFic251bSAvIFZBTFVFX0hJU1RPUllfQ0hVTks7CisgICAgICAgaSA+IDA7IGktLSkKKyAgICBjaHVuayA9IGNodW5rLT5uZXh0OworCisgIHJldHVybiB2YWx1ZV9jb3B5IChjaHVuay0+dmFsdWVzW2Fic251bSAlIFZBTFVFX0hJU1RPUllfQ0hVTktdKTsKK30KKworLyogQ2xlYXIgdGhlIHZhbHVlIGhpc3RvcnkgZW50aXJlbHkuCisgICBNdXN0IGJlIGRvbmUgd2hlbiBuZXcgc3ltYm9sIHRhYmxlcyBhcmUgbG9hZGVkLAorICAgYmVjYXVzZSB0aGUgdHlwZSBwb2ludGVycyBiZWNvbWUgaW52YWxpZC4gICovCisKK3ZvaWQKK2NsZWFyX3ZhbHVlX2hpc3RvcnkgKCkKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHZhbHVlX2hpc3RvcnlfY2h1bmsgKm5leHQ7CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciB2YWx1ZV9wdHIgdmFsOworCisgIHdoaWxlICh2YWx1ZV9oaXN0b3J5X2NoYWluKQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBWQUxVRV9ISVNUT1JZX0NIVU5LOyBpKyspCisJaWYgKCh2YWwgPSB2YWx1ZV9oaXN0b3J5X2NoYWluLT52YWx1ZXNbaV0pICE9IE5VTEwpCisJICBmcmVlICgoUFRSKXZhbCk7CisgICAgICBuZXh0ID0gdmFsdWVfaGlzdG9yeV9jaGFpbi0+bmV4dDsKKyAgICAgIGZyZWUgKChQVFIpdmFsdWVfaGlzdG9yeV9jaGFpbik7CisgICAgICB2YWx1ZV9oaXN0b3J5X2NoYWluID0gbmV4dDsKKyAgICB9CisgIHZhbHVlX2hpc3RvcnlfY291bnQgPSAwOworfQorCitzdGF0aWMgdm9pZAorc2hvd192YWx1ZXMgKG51bV9leHAsIGZyb21fdHR5KQorICAgICBjaGFyICpudW1fZXhwOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciB2YWx1ZV9wdHIgdmFsOworICBzdGF0aWMgaW50IG51bSA9IDE7CisKKyAgaWYgKG51bV9leHApCisgICAgeworCS8qICJpbmZvIGhpc3RvcnkgKyIgc2hvdWxkIHByaW50IGZyb20gdGhlIHN0b3JlZCBwb3NpdGlvbi4KKwkgICAiaW5mbyBoaXN0b3J5IDxleHA+IiBzaG91bGQgcHJpbnQgYXJvdW5kIHZhbHVlIG51bWJlciA8ZXhwPi4gICovCisgICAgICBpZiAobnVtX2V4cFswXSAhPSAnKycgfHwgbnVtX2V4cFsxXSAhPSAnXDAnKQorCW51bSA9IHBhcnNlX2FuZF9ldmFsX2FkZHJlc3MgKG51bV9leHApIC0gNTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiAiaW5mbyBoaXN0b3J5IiBtZWFucyBwcmludCB0aGUgbGFzdCAxMCB2YWx1ZXMuICAqLworICAgICAgbnVtID0gdmFsdWVfaGlzdG9yeV9jb3VudCAtIDk7CisgICAgfQorCisgIGlmIChudW0gPD0gMCkKKyAgICBudW0gPSAxOworCisgIGZvciAoaSA9IG51bTsgaSA8IG51bSArIDEwICYmIGkgPD0gdmFsdWVfaGlzdG9yeV9jb3VudDsgaSsrKQorICAgIHsKKyAgICAgIHZhbCA9IGFjY2Vzc192YWx1ZV9oaXN0b3J5IChpKTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIiQlZCA9ICIsIGkpOworICAgICAgdmFsdWVfcHJpbnQgKHZhbCwgZ2RiX3N0ZG91dCwgMCwgVmFsX3ByZXR0eV9kZWZhdWx0KTsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgICAgfQorCisgIC8qIFRoZSBuZXh0ICJpbmZvIGhpc3RvcnkgKyIgc2hvdWxkIHN0YXJ0IGFmdGVyIHdoYXQgd2UganVzdCBwcmludGVkLiAgKi8KKyAgbnVtICs9IDEwOworCisgIC8qIEhpdHRpbmcganVzdCByZXR1cm4gYWZ0ZXIgdGhpcyBjb21tYW5kIHNob3VsZCBkbyB0aGUgc2FtZSB0aGluZyBhcworICAgICAiaW5mbyBoaXN0b3J5ICsiLiAgSWYgbnVtX2V4cCBpcyBudWxsLCB0aGlzIGlzIHVubmVjZXNzYXJ5LCBzaW5jZQorICAgICAiaW5mbyBoaXN0b3J5ICsiIGlzIG5vdCB1c2VmdWwgYWZ0ZXIgImluZm8gaGlzdG9yeSIuICAqLworICBpZiAoZnJvbV90dHkgJiYgbnVtX2V4cCkKKyAgICB7CisgICAgICBudW1fZXhwWzBdID0gJysnOworICAgICAgbnVtX2V4cFsxXSA9ICdcMCc7CisgICAgfQorfQorDAorLyogSW50ZXJuYWwgdmFyaWFibGVzLiAgVGhlc2UgYXJlIHZhcmlhYmxlcyB3aXRoaW4gdGhlIGRlYnVnZ2VyCisgICB0aGF0IGhvbGQgdmFsdWVzIGFzc2lnbmVkIGJ5IGRlYnVnZ2VyIGNvbW1hbmRzLgorICAgVGhlIHVzZXIgcmVmZXJzIHRvIHRoZW0gd2l0aCBhICckJyBwcmVmaXgKKyAgIHRoYXQgZG9lcyBub3QgYXBwZWFyIGluIHRoZSB2YXJpYWJsZSBuYW1lcyBzdG9yZWQgaW50ZXJuYWxseS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJuYWx2YXIgKmludGVybmFsdmFyczsKKworLyogTG9vayB1cCBhbiBpbnRlcm5hbCB2YXJpYWJsZSB3aXRoIG5hbWUgTkFNRS4gIE5BTUUgc2hvdWxkIG5vdAorICAgbm9ybWFsbHkgaW5jbHVkZSBhIGRvbGxhciBzaWduLgorCisgICBJZiB0aGUgc3BlY2lmaWVkIGludGVybmFsIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LAorICAgb25lIGlzIGNyZWF0ZWQsIHdpdGggYSB2b2lkIHZhbHVlLiAgKi8KKworc3RydWN0IGludGVybmFsdmFyICoKK2xvb2t1cF9pbnRlcm5hbHZhciAobmFtZSkKKyAgICAgY2hhciAqbmFtZTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGludGVybmFsdmFyICp2YXI7CisKKyAgZm9yICh2YXIgPSBpbnRlcm5hbHZhcnM7IHZhcjsgdmFyID0gdmFyLT5uZXh0KQorICAgIGlmIChTVFJFUSAodmFyLT5uYW1lLCBuYW1lKSkKKyAgICAgIHJldHVybiB2YXI7CisKKyAgdmFyID0gKHN0cnVjdCBpbnRlcm5hbHZhciAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBpbnRlcm5hbHZhcikpOworICB2YXItPm5hbWUgPSBjb25jYXQgKG5hbWUsIE5VTEwpOworICB2YXItPnZhbHVlID0gYWxsb2NhdGVfdmFsdWUgKGJ1aWx0aW5fdHlwZV92b2lkKTsKKyAgcmVsZWFzZV92YWx1ZSAodmFyLT52YWx1ZSk7CisgIHZhci0+bmV4dCA9IGludGVybmFsdmFyczsKKyAgaW50ZXJuYWx2YXJzID0gdmFyOworICByZXR1cm4gdmFyOworfQorCit2YWx1ZV9wdHIKK3ZhbHVlX29mX2ludGVybmFsdmFyICh2YXIpCisgICAgIHN0cnVjdCBpbnRlcm5hbHZhciAqdmFyOworeworICByZWdpc3RlciB2YWx1ZV9wdHIgdmFsOworCisjaWZkZWYgSVNfVFJBUFBFRF9JTlRFUk5BTFZBUgorICBpZiAoSVNfVFJBUFBFRF9JTlRFUk5BTFZBUiAodmFyLT5uYW1lKSkKKyAgICByZXR1cm4gVkFMVUVfT0ZfVFJBUFBFRF9JTlRFUk5BTFZBUiAodmFyKTsKKyNlbmRpZiAKKworICB2YWwgPSB2YWx1ZV9jb3B5ICh2YXItPnZhbHVlKTsKKyAgaWYgKFZBTFVFX0xBWlkgKHZhbCkpCisgICAgdmFsdWVfZmV0Y2hfbGF6eSAodmFsKTsKKyAgVkFMVUVfTFZBTCAodmFsKSA9IGx2YWxfaW50ZXJuYWx2YXI7CisgIFZBTFVFX0lOVEVSTkFMVkFSICh2YWwpID0gdmFyOworICByZXR1cm4gdmFsOworfQorCit2b2lkCitzZXRfaW50ZXJuYWx2YXJfY29tcG9uZW50ICh2YXIsIG9mZnNldCwgYml0cG9zLCBiaXRzaXplLCBuZXd2YWwpCisgICAgIHN0cnVjdCBpbnRlcm5hbHZhciAqdmFyOworICAgICBpbnQgb2Zmc2V0LCBiaXRwb3MsIGJpdHNpemU7CisgICAgIHZhbHVlX3B0ciBuZXd2YWw7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKmFkZHIgPSBWQUxVRV9DT05URU5UUyAodmFyLT52YWx1ZSkgKyBvZmZzZXQ7CisKKyNpZmRlZiBJU19UUkFQUEVEX0lOVEVSTkFMVkFSCisgIGlmIChJU19UUkFQUEVEX0lOVEVSTkFMVkFSICh2YXItPm5hbWUpKQorICAgIFNFVF9UUkFQUEVEX0lOVEVSTkFMVkFSICh2YXIsIG5ld3ZhbCwgYml0cG9zLCBiaXRzaXplLCBvZmZzZXQpOworI2VuZGlmCisKKyAgaWYgKGJpdHNpemUpCisgICAgbW9kaWZ5X2ZpZWxkIChhZGRyLCB2YWx1ZV9hc19sb25nIChuZXd2YWwpLAorCQkgIGJpdHBvcywgYml0c2l6ZSk7CisgIGVsc2UKKyAgICBtZW1jcHkgKGFkZHIsIFZBTFVFX0NPTlRFTlRTIChuZXd2YWwpLCBUWVBFX0xFTkdUSCAoVkFMVUVfVFlQRSAobmV3dmFsKSkpOworfQorCit2b2lkCitzZXRfaW50ZXJuYWx2YXIgKHZhciwgdmFsKQorICAgICBzdHJ1Y3QgaW50ZXJuYWx2YXIgKnZhcjsKKyAgICAgdmFsdWVfcHRyIHZhbDsKK3sKKyAgdmFsdWVfcHRyIG5ld3ZhbDsKKworI2lmZGVmIElTX1RSQVBQRURfSU5URVJOQUxWQVIKKyAgaWYgKElTX1RSQVBQRURfSU5URVJOQUxWQVIgKHZhci0+bmFtZSkpCisgICAgU0VUX1RSQVBQRURfSU5URVJOQUxWQVIgKHZhciwgdmFsLCAwLCAwLCAwKTsKKyNlbmRpZgorCisgIG5ld3ZhbCA9IHZhbHVlX2NvcHkgKHZhbCk7CisgIG5ld3ZhbC0+bW9kaWZpYWJsZSA9IDE7CisKKyAgLyogRm9yY2UgdGhlIHZhbHVlIHRvIGJlIGZldGNoZWQgZnJvbSB0aGUgdGFyZ2V0IG5vdywgdG8gYXZvaWQgcHJvYmxlbXMKKyAgICAgbGF0ZXIgd2hlbiB0aGlzIGludGVybmFsdmFyIGlzIHJlZmVyZW5jZWQgYW5kIHRoZSB0YXJnZXQgaXMgZ29uZSBvcgorICAgICBoYXMgY2hhbmdlZC4gICovCisgIGlmIChWQUxVRV9MQVpZIChuZXd2YWwpKQorICAgIHZhbHVlX2ZldGNoX2xhenkgKG5ld3ZhbCk7CisKKyAgLyogQmVnaW4gY29kZSB3aGljaCBtdXN0IG5vdCBjYWxsIGVycm9yKCkuICBJZiB2YXItPnZhbHVlIHBvaW50cyB0bworICAgICBzb21ldGhpbmcgZnJlZSdkLCBhbiBlcnJvcigpIG9idmlvdXNseSBsZWF2ZXMgYSBkYW5nbGluZyBwb2ludGVyLgorICAgICBCdXQgd2UgYWxzbyBnZXQgYSBkYW5saW5nIHBvaW50ZXIgaWYgdmFyLT52YWx1ZSBwb2ludHMgdG8KKyAgICAgc29tZXRoaW5nIGluIHRoZSB2YWx1ZSBjaGFpbiAoaS5lLiwgYmVmb3JlIHJlbGVhc2VfdmFsdWUgaXMKKyAgICAgY2FsbGVkKSwgYmVjYXVzZSBhZnRlciB0aGUgZXJyb3IgZnJlZV9hbGxfdmFsdWVzIHdpbGwgZ2V0IGNhbGxlZCBiZWZvcmUKKyAgICAgbG9uZy4gICovCisgIGZyZWUgKChQVFIpdmFyLT52YWx1ZSk7CisgIHZhci0+dmFsdWUgPSBuZXd2YWw7CisgIHJlbGVhc2VfdmFsdWUgKG5ld3ZhbCk7CisgIC8qIEVuZCBjb2RlIHdoaWNoIG11c3Qgbm90IGNhbGwgZXJyb3IoKS4gICovCit9CisKK2NoYXIgKgoraW50ZXJuYWx2YXJfbmFtZSAodmFyKQorICAgICBzdHJ1Y3QgaW50ZXJuYWx2YXIgKnZhcjsKK3sKKyAgcmV0dXJuIHZhci0+bmFtZTsKK30KKworLyogRnJlZSBhbGwgaW50ZXJuYWx2YXJzLiAgRG9uZSB3aGVuIG5ldyBzeW10YWJzIGFyZSBsb2FkZWQsCisgICBiZWNhdXNlIHRoYXQgbWFrZXMgdGhlIHZhbHVlcyBpbnZhbGlkLiAgKi8KKwordm9pZAorY2xlYXJfaW50ZXJuYWx2YXJzICgpCit7CisgIHJlZ2lzdGVyIHN0cnVjdCBpbnRlcm5hbHZhciAqdmFyOworCisgIHdoaWxlIChpbnRlcm5hbHZhcnMpCisgICAgeworICAgICAgdmFyID0gaW50ZXJuYWx2YXJzOworICAgICAgaW50ZXJuYWx2YXJzID0gdmFyLT5uZXh0OworICAgICAgZnJlZSAoKFBUUil2YXItPm5hbWUpOworICAgICAgZnJlZSAoKFBUUil2YXItPnZhbHVlKTsKKyAgICAgIGZyZWUgKChQVFIpdmFyKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitzaG93X2NvbnZlbmllbmNlIChpZ25vcmUsIGZyb21fdHR5KQorICAgICBjaGFyICppZ25vcmU7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGludGVybmFsdmFyICp2YXI7CisgIGludCB2YXJzZWVuID0gMDsKKworICBmb3IgKHZhciA9IGludGVybmFsdmFyczsgdmFyOyB2YXIgPSB2YXItPm5leHQpCisgICAgeworI2lmZGVmIElTX1RSQVBQRURfSU5URVJOQUxWQVIKKyAgICAgIGlmIChJU19UUkFQUEVEX0lOVEVSTkFMVkFSICh2YXItPm5hbWUpKQorCWNvbnRpbnVlOworI2VuZGlmCisgICAgICBpZiAoIXZhcnNlZW4pCisJeworCSAgdmFyc2VlbiA9IDE7CisJfQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiJCVzID0gIiwgdmFyLT5uYW1lKTsKKyAgICAgIHZhbHVlX3ByaW50ICh2YXItPnZhbHVlLCBnZGJfc3Rkb3V0LCAwLCBWYWxfcHJldHR5X2RlZmF1bHQpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKyAgICB9CisgIGlmICghdmFyc2VlbikKKyAgICBwcmludGZfdW5maWx0ZXJlZCAoIk5vIGRlYnVnZ2VyIGNvbnZlbmllbmNlIHZhcmlhYmxlcyBub3cgZGVmaW5lZC5cblwKK0NvbnZlbmllbmNlIHZhcmlhYmxlcyBoYXZlIG5hbWVzIHN0YXJ0aW5nIHdpdGggXCIkXCI7XG5cCit1c2UgXCJzZXRcIiBhcyBpbiBcInNldCAkZm9vID0gNVwiIHRvIGRlZmluZSB0aGVtLlxuIik7Cit9CisMCisvKiBFeHRyYWN0IGEgdmFsdWUgYXMgYSBDIG51bWJlciAoZWl0aGVyIGxvbmcgb3IgZG91YmxlKS4KKyAgIEtub3dzIGhvdyB0byBjb252ZXJ0IGZpeGVkIHZhbHVlcyB0byBkb3VibGUsIG9yCisgICBmbG9hdGluZyB2YWx1ZXMgdG8gbG9uZy4KKyAgIERvZXMgbm90IGRlYWxsb2NhdGUgdGhlIHZhbHVlLiAgKi8KKworTE9OR0VTVAordmFsdWVfYXNfbG9uZyAodmFsKQorICAgICByZWdpc3RlciB2YWx1ZV9wdHIgdmFsOworeworICAvKiBUaGlzIGNvZXJjZXMgYXJyYXlzIGFuZCBmdW5jdGlvbnMsIHdoaWNoIGlzIG5lY2Vzc2FyeSAoZS5nLgorICAgICBpbiBkaXNhc3NlbWJsZV9jb21tYW5kKS4gIEl0IGFsc28gZGVyZWZlcmVuY2VzIHJlZmVyZW5jZXMsIHdoaWNoCisgICAgIEkgc3VzcGVjdCBpcyB0aGUgbW9zdCBsb2dpY2FsIHRoaW5nIHRvIGRvLiAgKi8KKyAgQ09FUkNFX0FSUkFZICh2YWwpOworICByZXR1cm4gdW5wYWNrX2xvbmcgKFZBTFVFX1RZUEUgKHZhbCksIFZBTFVFX0NPTlRFTlRTICh2YWwpKTsKK30KKworRE9VQkxFU1QKK3ZhbHVlX2FzX2RvdWJsZSAodmFsKQorICAgICByZWdpc3RlciB2YWx1ZV9wdHIgdmFsOworeworICBET1VCTEVTVCBmb287CisgIGludCBpbnY7CisgIAorICBmb28gPSB1bnBhY2tfZG91YmxlIChWQUxVRV9UWVBFICh2YWwpLCBWQUxVRV9DT05URU5UUyAodmFsKSwgJmludik7CisgIGlmIChpbnYpCisgICAgZXJyb3IgKCJJbnZhbGlkIGZsb2F0aW5nIHZhbHVlIGZvdW5kIGluIHByb2dyYW0uIik7CisgIHJldHVybiBmb287Cit9CisvKiBFeHRyYWN0IGEgdmFsdWUgYXMgYSBDIHBvaW50ZXIuCisgICBEb2VzIG5vdCBkZWFsbG9jYXRlIHRoZSB2YWx1ZS4gICovCitDT1JFX0FERFIKK3ZhbHVlX2FzX3BvaW50ZXIgKHZhbCkKKyAgICAgdmFsdWVfcHRyIHZhbDsKK3sKKyAgLyogQXNzdW1lIGEgQ09SRV9BRERSIGNhbiBmaXQgaW4gYSBMT05HRVNUIChmb3Igbm93KS4gIE5vdCBzdXJlCisgICAgIHdoZXRoZXIgd2Ugd2FudCB0aGlzIHRvIGJlIHRydWUgZXZlbnR1YWxseS4gICovCisjaWYgMAorICAvKiBBRERSX0JJVFNfUkVNT1ZFIGlzIHdyb25nIGlmIHdlIGFyZSBiZWluZyBjYWxsZWQgZm9yIGEKKyAgICAgbm9uLWFkZHJlc3MgKGUuZy4gYXJndW1lbnQgdG8gInNpZ25hbCIsICJpbmZvIGJyZWFrIiwgZXRjLiksIG9yCisgICAgIGZvciBwb2ludGVycyB0byBjaGFyLCBpbiB3aGljaCB0aGUgbG93IGJpdHMgKmFyZSogc2lnbmlmaWNhbnQuICAqLworICByZXR1cm4gQUREUl9CSVRTX1JFTU9WRSh2YWx1ZV9hc19sb25nICh2YWwpKTsKKyNlbHNlCisgIHJldHVybiB2YWx1ZV9hc19sb25nICh2YWwpOworI2VuZGlmCit9CisMCisvKiBVbnBhY2sgcmF3IGRhdGEgKGNvcGllZCBmcm9tIGRlYnVnZWUsIHRhcmdldCBieXRlIG9yZGVyKSBhdCBWQUxBRERSCisgICBhcyBhIGxvbmcsIG9yIGFzIGEgZG91YmxlLCBhc3N1bWluZyB0aGUgcmF3IGRhdGEgaXMgZGVzY3JpYmVkCisgICBieSB0eXBlIFRZUEUuICBLbm93cyBob3cgdG8gY29udmVydCBkaWZmZXJlbnQgc2l6ZXMgb2YgdmFsdWVzCisgICBhbmQgY2FuIGNvbnZlcnQgYmV0d2VlbiBmaXhlZCBhbmQgZmxvYXRpbmcgcG9pbnQuICBXZSBkb24ndCBhc3N1bWUKKyAgIGFueSBhbGlnbm1lbnQgZm9yIHRoZSByYXcgZGF0YS4gIFJldHVybiB2YWx1ZSBpcyBpbiBob3N0IGJ5dGUgb3JkZXIuCisKKyAgIElmIHlvdSB3YW50IGZ1bmN0aW9ucyBhbmQgYXJyYXlzIHRvIGJlIGNvZXJjZWQgdG8gcG9pbnRlcnMsIGFuZAorICAgcmVmZXJlbmNlcyB0byBiZSBkZXJlZmVyZW5jZWQsIGNhbGwgdmFsdWVfYXNfbG9uZygpIGluc3RlYWQuCisKKyAgIEMrKzogSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcm9udC1lbmQgaGFzIHRha2VuIGNhcmUgb2YKKyAgIGFsbCBtYXR0ZXJzIGNvbmNlcm5pbmcgcG9pbnRlcnMgdG8gbWVtYmVycy4gIEEgcG9pbnRlcgorICAgdG8gbWVtYmVyIHdoaWNoIHJlYWNoZXMgaGVyZSBpcyBjb25zaWRlcmVkIHRvIGJlIGVxdWl2YWxlbnQKKyAgIHRvIGFuIElOVCAob3Igc29tZSBzaXplKS4gIEFmdGVyIGFsbCwgaXQgaXMgb25seSBhbiBvZmZzZXQuICAqLworCitMT05HRVNUCit1bnBhY2tfbG9uZyAodHlwZSwgdmFsYWRkcikKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGNoYXIgKnZhbGFkZHI7Cit7CisgIHJlZ2lzdGVyIGVudW0gdHlwZV9jb2RlIGNvZGUgPSBUWVBFX0NPREUgKHR5cGUpOworICByZWdpc3RlciBpbnQgbGVuID0gVFlQRV9MRU5HVEggKHR5cGUpOworICByZWdpc3RlciBpbnQgbm9zaWduID0gVFlQRV9VTlNJR05FRCAodHlwZSk7CisKKyAgaWYgKGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2xhbmd1YWdlID09IGxhbmd1YWdlX3NjbQorICAgICAgJiYgaXNfc2NtdmFsdWVfdHlwZSAodHlwZSkpCisgICAgcmV0dXJuIHNjbV91bnBhY2sgKHR5cGUsIHZhbGFkZHIsIFRZUEVfQ09ERV9JTlQpOworCisgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgY2FzZSBUWVBFX0NPREVfVFlQRURFRjoKKyAgICAgIHJldHVybiB1bnBhY2tfbG9uZyAoY2hlY2tfdHlwZWRlZiAodHlwZSksIHZhbGFkZHIpOworICAgIGNhc2UgVFlQRV9DT0RFX0VOVU06CisgICAgY2FzZSBUWVBFX0NPREVfQk9PTDoKKyAgICBjYXNlIFRZUEVfQ09ERV9JTlQ6CisgICAgY2FzZSBUWVBFX0NPREVfQ0hBUjoKKyAgICBjYXNlIFRZUEVfQ09ERV9SQU5HRToKKyAgICAgIGlmIChub3NpZ24pCisJcmV0dXJuIGV4dHJhY3RfdW5zaWduZWRfaW50ZWdlciAodmFsYWRkciwgbGVuKTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gZXh0cmFjdF9zaWduZWRfaW50ZWdlciAodmFsYWRkciwgbGVuKTsKKworICAgIGNhc2UgVFlQRV9DT0RFX0ZMVDoKKyAgICAgIHJldHVybiBleHRyYWN0X2Zsb2F0aW5nICh2YWxhZGRyLCBsZW4pOworCisgICAgY2FzZSBUWVBFX0NPREVfUFRSOgorICAgIGNhc2UgVFlQRV9DT0RFX1JFRjoKKyAgICAgIC8qIEFzc3VtZSBhIENPUkVfQUREUiBjYW4gZml0IGluIGEgTE9OR0VTVCAoZm9yIG5vdykuICBOb3Qgc3VyZQorCSB3aGV0aGVyIHdlIHdhbnQgdGhpcyB0byBiZSB0cnVlIGV2ZW50dWFsbHkuICAqLworI2lmZGVmIEdEQl9UQVJHRVRfSVNfRDEwVgorICAgICAgaWYgKGxlbiA9PSAyKQorCSAgcmV0dXJuIEQxMFZfTUFLRV9EQUREUihleHRyYWN0X2FkZHJlc3MgKHZhbGFkZHIsIGxlbikpOworI2VuZGlmCisgICAgICByZXR1cm4gZXh0cmFjdF9hZGRyZXNzICh2YWxhZGRyLCBsZW4pOworCisgICAgY2FzZSBUWVBFX0NPREVfTUVNQkVSOgorICAgICAgZXJyb3IgKCJub3QgaW1wbGVtZW50ZWQ6IG1lbWJlciB0eXBlcyBpbiB1bnBhY2tfbG9uZyIpOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yICgiVmFsdWUgY2FuJ3QgYmUgY29udmVydGVkIHRvIGludGVnZXIuIik7CisgICAgfQorICByZXR1cm4gMDsgLyogUGxhY2F0ZSBsaW50LiAgKi8KK30KKworLyogUmV0dXJuIGEgZG91YmxlIHZhbHVlIGZyb20gdGhlIHNwZWNpZmllZCB0eXBlIGFuZCBhZGRyZXNzLgorICAgSU5WUCBwb2ludHMgdG8gYW4gaW50IHdoaWNoIGlzIHNldCB0byAwIGZvciB2YWxpZCB2YWx1ZSwKKyAgIDEgZm9yIGludmFsaWQgdmFsdWUgKGJhZCBmbG9hdCBmb3JtYXQpLiAgSW4gZWl0aGVyIGNhc2UsCisgICB0aGUgcmV0dXJuZWQgZG91YmxlIGlzIE9LIHRvIHVzZS4gIEFyZ3VtZW50IGlzIGluIHRhcmdldAorICAgZm9ybWF0LCByZXN1bHQgaXMgaW4gaG9zdCBmb3JtYXQuICAqLworCitET1VCTEVTVAordW5wYWNrX2RvdWJsZSAodHlwZSwgdmFsYWRkciwgaW52cCkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGNoYXIgKnZhbGFkZHI7CisgICAgIGludCAqaW52cDsKK3sKKyAgZW51bSB0eXBlX2NvZGUgY29kZTsKKyAgaW50IGxlbjsKKyAgaW50IG5vc2lnbjsKKworICAqaW52cCA9IDA7CQkJLyogQXNzdW1lIHZhbGlkLiAgICovCisgIENIRUNLX1RZUEVERUYgKHR5cGUpOworICBjb2RlID0gVFlQRV9DT0RFICh0eXBlKTsKKyAgbGVuID0gVFlQRV9MRU5HVEggKHR5cGUpOworICBub3NpZ24gPSBUWVBFX1VOU0lHTkVEICh0eXBlKTsKKyAgaWYgKGNvZGUgPT0gVFlQRV9DT0RFX0ZMVCkKKyAgICB7CisjaWZkZWYgSU5WQUxJRF9GTE9BVAorICAgICAgaWYgKElOVkFMSURfRkxPQVQgKHZhbGFkZHIsIGxlbikpCisJeworCSAgKmludnAgPSAxOworCSAgcmV0dXJuIDEuMjM0NTY3ODkxMDExMTIxMzE0OworCX0KKyNlbmRpZgorICAgICAgcmV0dXJuIGV4dHJhY3RfZmxvYXRpbmcgKHZhbGFkZHIsIGxlbik7CisgICAgfQorICBlbHNlIGlmIChub3NpZ24pCisgICAgeworICAgICAgLyogVW5zaWduZWQgLS0gYmUgc3VyZSB3ZSBjb21wZW5zYXRlIGZvciBzaWduZWQgTE9OR0VTVC4gICovCisjaWYgIWRlZmluZWQgKF9NU0NfVkVSKSB8fCAoX01TQ19WRVIgPiA5MDApCisgICAgICByZXR1cm4gKFVMT05HRVNUKSB1bnBhY2tfbG9uZyAodHlwZSwgdmFsYWRkcik7CisjZWxzZQorICAgICAgLyogRklYTUUhISEgbXN2YzIyIGRvZXNuJ3Qgc3VwcG9ydCB1bnNpZ25lZCBfX2ludDY0IC0+IGRvdWJsZSAqLworICAgICAgcmV0dXJuIChMT05HRVNUKSB1bnBhY2tfbG9uZyAodHlwZSwgdmFsYWRkcik7CisjZW5kaWYgLyogX01TQ19WRVIgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBTaWduZWQgLS0gd2UgYXJlIE9LIHdpdGggdW5wYWNrX2xvbmcuICAqLworICAgICAgcmV0dXJuIHVucGFja19sb25nICh0eXBlLCB2YWxhZGRyKTsKKyAgICB9Cit9CisKKy8qIFVucGFjayByYXcgZGF0YSAoY29waWVkIGZyb20gZGVidWdlZSwgdGFyZ2V0IGJ5dGUgb3JkZXIpIGF0IFZBTEFERFIKKyAgIGFzIGEgQ09SRV9BRERSLCBhc3N1bWluZyB0aGUgcmF3IGRhdGEgaXMgZGVzY3JpYmVkIGJ5IHR5cGUgVFlQRS4KKyAgIFdlIGRvbid0IGFzc3VtZSBhbnkgYWxpZ25tZW50IGZvciB0aGUgcmF3IGRhdGEuICBSZXR1cm4gdmFsdWUgaXMgaW4KKyAgIGhvc3QgYnl0ZSBvcmRlci4KKworICAgSWYgeW91IHdhbnQgZnVuY3Rpb25zIGFuZCBhcnJheXMgdG8gYmUgY29lcmNlZCB0byBwb2ludGVycywgYW5kCisgICByZWZlcmVuY2VzIHRvIGJlIGRlcmVmZXJlbmNlZCwgY2FsbCB2YWx1ZV9hc19wb2ludGVyKCkgaW5zdGVhZC4KKworICAgQysrOiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyb250LWVuZCBoYXMgdGFrZW4gY2FyZSBvZgorICAgYWxsIG1hdHRlcnMgY29uY2VybmluZyBwb2ludGVycyB0byBtZW1iZXJzLiAgQSBwb2ludGVyCisgICB0byBtZW1iZXIgd2hpY2ggcmVhY2hlcyBoZXJlIGlzIGNvbnNpZGVyZWQgdG8gYmUgZXF1aXZhbGVudAorICAgdG8gYW4gSU5UIChvciBzb21lIHNpemUpLiAgQWZ0ZXIgYWxsLCBpdCBpcyBvbmx5IGFuIG9mZnNldC4gICovCisKK0NPUkVfQUREUgordW5wYWNrX3BvaW50ZXIgKHR5cGUsIHZhbGFkZHIpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBjaGFyICp2YWxhZGRyOworeworICAvKiBBc3N1bWUgYSBDT1JFX0FERFIgY2FuIGZpdCBpbiBhIExPTkdFU1QgKGZvciBub3cpLiAgTm90IHN1cmUKKyAgICAgd2hldGhlciB3ZSB3YW50IHRoaXMgdG8gYmUgdHJ1ZSBldmVudHVhbGx5LiAgKi8KKyAgcmV0dXJuIHVucGFja19sb25nICh0eXBlLCB2YWxhZGRyKTsKK30KKwwKKy8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIEZJRUxETid0aCBmaWVsZCAod2hpY2ggbXVzdCBiZSBzdGF0aWMpIG9mIFRZUEUuICovCisKK3ZhbHVlX3B0cgordmFsdWVfc3RhdGljX2ZpZWxkICh0eXBlLCBmaWVsZG5vKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgaW50IGZpZWxkbm87Cit7CisgIENPUkVfQUREUiBhZGRyOworICBhc2VjdGlvbiAqc2VjdDsKKyAgaWYgKFRZUEVfRklFTERfU1RBVElDX0hBU19BRERSICh0eXBlLCBmaWVsZG5vKSkKKyAgICB7CisgICAgICBhZGRyID0gVFlQRV9GSUVMRF9TVEFUSUNfUEhZU0FERFIgKHR5cGUsIGZpZWxkbm8pOworICAgICAgc2VjdCA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciAqcGh5c19uYW1lID0gVFlQRV9GSUVMRF9TVEFUSUNfUEhZU05BTUUgKHR5cGUsIGZpZWxkbm8pOworICAgICAgc3RydWN0IHN5bWJvbCAqc3ltID0gbG9va3VwX3N5bWJvbCAocGh5c19uYW1lLCAwLCBWQVJfTkFNRVNQQUNFLCAwLCBOVUxMKTsKKyAgICAgIGlmIChzeW0gPT0gTlVMTCkKKwl7CisJICAvKiBXaXRoIHNvbWUgY29tcGlsZXJzLCBlLmcuIEhQIGFDQywgc3RhdGljIGRhdGEgbWVtYmVycyBhcmUgcmVwb3J0ZWQKKwkgICAgIGFzIG5vbi1kZWJ1Z2dhYmxlIHN5bWJvbHMgKi8gCisJICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKiBtc3ltID0gbG9va3VwX21pbmltYWxfc3ltYm9sIChwaHlzX25hbWUsIE5VTEwsIE5VTEwpOworCSAgaWYgKCFtc3ltKQorCSAgICByZXR1cm4gTlVMTDsKKwkgIGVsc2UKKwkgICAgeyAgICAgCisJICAgICAgYWRkciA9IFNZTUJPTF9WQUxVRV9BRERSRVNTIChtc3ltKTsKKwkgICAgICBzZWN0ID0gU1lNQk9MX0JGRF9TRUNUSU9OIChtc3ltKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBhZGRyID0gU1lNQk9MX1ZBTFVFX0FERFJFU1MgKHN5bSk7CisJICBzZWN0ID0gU1lNQk9MX0JGRF9TRUNUSU9OIChzeW0pOworCX0KKyAgICAgIFNFVF9GSUVMRF9QSFlTQUREUiAoVFlQRV9GSUVMRCAodHlwZSwgZmllbGRubyksIGFkZHIpOworICAgIH0KKyAgcmV0dXJuIHZhbHVlX2F0IChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGZpZWxkbm8pLCBhZGRyLCBzZWN0KTsKK30KKworLyogR2l2ZW4gYSB2YWx1ZSBBUkcxIChvZmZzZXQgYnkgT0ZGU0VUIGJ5dGVzKQorICAgb2YgYSBzdHJ1Y3Qgb3IgdW5pb24gdHlwZSBBUkdfVFlQRSwKKyAgIGV4dHJhY3QgYW5kIHJldHVybiB0aGUgdmFsdWUgb2Ygb25lIG9mIGl0cyAobm9uLXN0YXRpYykgZmllbGRzLgorICAgRklFTEROTyBzYXlzIHdoaWNoIGZpZWxkLiAqLworCit2YWx1ZV9wdHIKK3ZhbHVlX3ByaW1pdGl2ZV9maWVsZCAoYXJnMSwgb2Zmc2V0LCBmaWVsZG5vLCBhcmdfdHlwZSkKKyAgICAgcmVnaXN0ZXIgdmFsdWVfcHRyIGFyZzE7CisgICAgIGludCBvZmZzZXQ7CisgICAgIHJlZ2lzdGVyIGludCBmaWVsZG5vOworICAgICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqYXJnX3R5cGU7Cit7CisgIHJlZ2lzdGVyIHZhbHVlX3B0ciB2OworICByZWdpc3RlciBzdHJ1Y3QgdHlwZSAqdHlwZTsKKworICBDSEVDS19UWVBFREVGIChhcmdfdHlwZSk7CisgIHR5cGUgPSBUWVBFX0ZJRUxEX1RZUEUgKGFyZ190eXBlLCBmaWVsZG5vKTsKKworICAvKiBIYW5kbGUgcGFja2VkIGZpZWxkcyAqLworCisgIGlmIChUWVBFX0ZJRUxEX0JJVFNJWkUgKGFyZ190eXBlLCBmaWVsZG5vKSkKKyAgICB7CisgICAgICB2ID0gdmFsdWVfZnJvbV9sb25nZXN0ICh0eXBlLAorCQkJICAgICAgdW5wYWNrX2ZpZWxkX2FzX2xvbmcgKGFyZ190eXBlLAorCQkJCQkJICAgIFZBTFVFX0NPTlRFTlRTIChhcmcxKQorCQkJCQkJICAgICAgKyBvZmZzZXQsCisJCQkJCQkgICAgZmllbGRubykpOworICAgICAgVkFMVUVfQklUUE9TICh2KSA9IFRZUEVfRklFTERfQklUUE9TIChhcmdfdHlwZSwgZmllbGRubykgJSA4OworICAgICAgVkFMVUVfQklUU0laRSAodikgPSBUWVBFX0ZJRUxEX0JJVFNJWkUgKGFyZ190eXBlLCBmaWVsZG5vKTsKKyAgICB9CisgIGVsc2UgaWYgKGZpZWxkbm8gPCBUWVBFX05fQkFTRUNMQVNTRVMgKGFyZ190eXBlKSkKKyAgICB7CisgICAgICAvKiBUaGlzIGZpZWxkIGlzIGFjdHVhbGx5IGEgYmFzZSBzdWJvYmplY3QsIHNvIHByZXNlcnZlIHRoZQorICAgICAgICAgZW50aXJlIG9iamVjdCdzIGNvbnRlbnRzIGZvciBsYXRlciByZWZlcmVuY2VzIHRvIHZpcnR1YWwKKyAgICAgICAgIGJhc2VzLCBldGMuICAqLworICAgICAgdiA9IGFsbG9jYXRlX3ZhbHVlIChWQUxVRV9FTkNMT1NJTkdfVFlQRSAoYXJnMSkpOworICAgICAgVkFMVUVfVFlQRSAodikgPSBhcmdfdHlwZTsKKyAgICAgIGlmIChWQUxVRV9MQVpZIChhcmcxKSkKKwlWQUxVRV9MQVpZICh2KSA9IDE7CisgICAgICBlbHNlCisJbWVtY3B5IChWQUxVRV9DT05URU5UU19BTExfUkFXICh2KSwgVkFMVUVfQ09OVEVOVFNfQUxMX1JBVyAoYXJnMSksCisJCVRZUEVfTEVOR1RIIChWQUxVRV9FTkNMT1NJTkdfVFlQRSAoYXJnMSkpKTsKKyAgICAgIFZBTFVFX09GRlNFVCAodikgPSBWQUxVRV9PRkZTRVQgKGFyZzEpOworICAgICAgVkFMVUVfRU1CRURERURfT0ZGU0VUICh2KQorICAgICAgICA9IG9mZnNldCArIAorICAgICAgICAgIFZBTFVFX0VNQkVEREVEX09GRlNFVCAoYXJnMSkgKyAKKyAgICAgICAgICBUWVBFX0ZJRUxEX0JJVFBPUyAoYXJnX3R5cGUsIGZpZWxkbm8pIC8gODsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBQbGFpbiBvbGQgZGF0YSBtZW1iZXIgKi8KKyAgICAgIG9mZnNldCArPSBUWVBFX0ZJRUxEX0JJVFBPUyAoYXJnX3R5cGUsIGZpZWxkbm8pIC8gODsKKyAgICAgIHYgPSBhbGxvY2F0ZV92YWx1ZSAodHlwZSk7CisgICAgICBpZiAoVkFMVUVfTEFaWSAoYXJnMSkpCisJVkFMVUVfTEFaWSAodikgPSAxOworICAgICAgZWxzZQorCW1lbWNweSAoVkFMVUVfQ09OVEVOVFNfUkFXICh2KSwKKwkJVkFMVUVfQ09OVEVOVFNfUkFXIChhcmcxKSArIG9mZnNldCwKKwkJVFlQRV9MRU5HVEggKHR5cGUpKTsKKyAgICAgIFZBTFVFX09GRlNFVCAodikgPSBWQUxVRV9PRkZTRVQgKGFyZzEpICsgb2Zmc2V0OworICAgIH0KKyAgVkFMVUVfTFZBTCAodikgPSBWQUxVRV9MVkFMIChhcmcxKTsKKyAgaWYgKFZBTFVFX0xWQUwgKGFyZzEpID09IGx2YWxfaW50ZXJuYWx2YXIpCisgICAgVkFMVUVfTFZBTCAodikgPSBsdmFsX2ludGVybmFsdmFyX2NvbXBvbmVudDsKKyAgVkFMVUVfQUREUkVTUyAodikgPSBWQUxVRV9BRERSRVNTIChhcmcxKTsKKy8qICBWQUxVRV9PRkZTRVQgKHYpID0gVkFMVUVfT0ZGU0VUIChhcmcxKSArIG9mZnNldAorCQkgICAgICsgVFlQRV9GSUVMRF9CSVRQT1MgKGFyZ190eXBlLCBmaWVsZG5vKSAvIDg7ICovCisgIHJldHVybiB2OworfQorCisvKiBHaXZlbiBhIHZhbHVlIEFSRzEgb2YgYSBzdHJ1Y3Qgb3IgdW5pb24gdHlwZSwKKyAgIGV4dHJhY3QgYW5kIHJldHVybiB0aGUgdmFsdWUgb2Ygb25lIG9mIGl0cyAobm9uLXN0YXRpYykgZmllbGRzLgorICAgRklFTEROTyBzYXlzIHdoaWNoIGZpZWxkLiAqLworCit2YWx1ZV9wdHIKK3ZhbHVlX2ZpZWxkIChhcmcxLCBmaWVsZG5vKQorICAgICByZWdpc3RlciB2YWx1ZV9wdHIgYXJnMTsKKyAgICAgcmVnaXN0ZXIgaW50IGZpZWxkbm87Cit7CisgIHJldHVybiB2YWx1ZV9wcmltaXRpdmVfZmllbGQgKGFyZzEsIDAsIGZpZWxkbm8sIFZBTFVFX1RZUEUgKGFyZzEpKTsKK30KKworLyogUmV0dXJuIGEgbm9uLXZpcnR1YWwgZnVuY3Rpb24gYXMgYSB2YWx1ZS4KKyAgIEYgaXMgdGhlIGxpc3Qgb2YgbWVtYmVyIGZ1bmN0aW9ucyB3aGljaCBjb250YWlucyB0aGUgZGVzaXJlZCBtZXRob2QuCisgICBKIGlzIGFuIGluZGV4IGludG8gRiB3aGljaCBwcm92aWRlcyB0aGUgZGVzaXJlZCBtZXRob2QuICovCisKK3ZhbHVlX3B0cgordmFsdWVfZm5fZmllbGQgKGFyZzFwLCBmLCBqLCB0eXBlLCBvZmZzZXQpCisgICAgIHZhbHVlX3B0ciAqYXJnMXA7CisgICAgIHN0cnVjdCBmbl9maWVsZCAqZjsKKyAgICAgaW50IGo7CisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBpbnQgb2Zmc2V0OworeworICByZWdpc3RlciB2YWx1ZV9wdHIgdjsKKyAgcmVnaXN0ZXIgc3RydWN0IHR5cGUgKmZ0eXBlID0gVFlQRV9GTl9GSUVMRF9UWVBFIChmLCBqKTsKKyAgc3RydWN0IHN5bWJvbCAqc3ltOworCisgIHN5bSA9IGxvb2t1cF9zeW1ib2wgKFRZUEVfRk5fRklFTERfUEhZU05BTUUgKGYsIGopLAorCQkgICAgICAgMCwgVkFSX05BTUVTUEFDRSwgMCwgTlVMTCk7CisgIGlmICghIHN5bSkgCisJcmV0dXJuIE5VTEw7CisvKgorCWVycm9yICgiSW50ZXJuYWwgZXJyb3I6IGNvdWxkIG5vdCBmaW5kIHBoeXNpY2FsIG1ldGhvZCBuYW1lZCAlcyIsCisJCSAgICBUWVBFX0ZOX0ZJRUxEX1BIWVNOQU1FIChmLCBqKSk7CisqLworICAKKyAgdiA9IGFsbG9jYXRlX3ZhbHVlIChmdHlwZSk7CisgIFZBTFVFX0FERFJFU1MgKHYpID0gQkxPQ0tfU1RBUlQgKFNZTUJPTF9CTE9DS19WQUxVRSAoc3ltKSk7CisgIFZBTFVFX1RZUEUgKHYpID0gZnR5cGU7CisKKyAgaWYgKGFyZzFwKQorICAgeworICAgIGlmICh0eXBlICE9IFZBTFVFX1RZUEUgKCphcmcxcCkpCisgICAgICAqYXJnMXAgPSB2YWx1ZV9pbmQgKHZhbHVlX2Nhc3QgKGxvb2t1cF9wb2ludGVyX3R5cGUgKHR5cGUpLAorCQkJCSAgICAgIHZhbHVlX2FkZHIgKCphcmcxcCkpKTsKKworICAgIC8qIE1vdmUgdGhlIGB0aGlzJyBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgb2Zmc2V0LiAKKyAgICBWQUxVRV9PRkZTRVQgKCphcmcxcCkgKz0gb2Zmc2V0OworICAgICovCisgICAgfQorCisgIHJldHVybiB2OworfQorCisvKiBSZXR1cm4gYSB2aXJ0dWFsIGZ1bmN0aW9uIGFzIGEgdmFsdWUuCisgICBBUkcxIGlzIHRoZSBvYmplY3Qgd2hpY2ggcHJvdmlkZXMgdGhlIHZpcnR1YWwgZnVuY3Rpb24KKyAgIHRhYmxlIHBvaW50ZXIuICAqQVJHMVAgaXMgc2lkZS1lZmZlY3RlZCBpbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgICBGIGlzIHRoZSBsaXN0IG9mIG1lbWJlciBmdW5jdGlvbnMgd2hpY2ggY29udGFpbnMgdGhlIGRlc2lyZWQgdmlydHVhbAorICAgZnVuY3Rpb24uCisgICBKIGlzIGFuIGluZGV4IGludG8gRiB3aGljaCBwcm92aWRlcyB0aGUgZGVzaXJlZCB2aXJ0dWFsIGZ1bmN0aW9uLgorCisgICBUWVBFIGlzIHRoZSB0eXBlIGluIHdoaWNoIEYgaXMgbG9jYXRlZC4gICovCit2YWx1ZV9wdHIKK3ZhbHVlX3ZpcnR1YWxfZm5fZmllbGQgKGFyZzFwLCBmLCBqLCB0eXBlLCBvZmZzZXQpCisgICAgIHZhbHVlX3B0ciAqYXJnMXA7CisgICAgIHN0cnVjdCBmbl9maWVsZCAqZjsKKyAgICAgaW50IGo7CisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBpbnQgb2Zmc2V0OworeworICB2YWx1ZV9wdHIgYXJnMSA9ICphcmcxcDsKKyAgc3RydWN0IHR5cGUgKnR5cGUxID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoYXJnMSkpOworCisgIGlmIChUWVBFX0hBU19WVEFCTEUgKHR5cGUpKQorICAgIHsKKyAgICAgIC8qIERlYWwgd2l0aCBIUC9UYWxpZ2VudCBydW50aW1lIG1vZGVsIGZvciB2aXJ0dWFsIGZ1bmN0aW9ucyAqLworICAgICAgdmFsdWVfcHRyIHZwOworICAgICAgdmFsdWVfcHRyIGFyZ3A7ICAgICAgICAvKiBhcmcxIGNhc3QgdG8gYmFzZSAqLworICAgICAgQ09SRV9BRERSIHZmdW5jX2FkZHI7ICAvKiBhZGRyZXNzIG9mIHZpcnR1YWwgbWV0aG9kICovCisgICAgICBDT1JFX0FERFIgY29yZXB0cjsgICAgIC8qIHBvaW50ZXIgdG8gdGFyZ2V0IGFkZHJlc3MgKi8gCisgICAgICBpbnQgY2xhc3NfaW5kZXg7ICAgICAgIC8qIHdoaWNoIGNsYXNzIHNlZ21lbnQgcG9pbnRlciB0byB1c2UgKi8KKyAgICAgIHN0cnVjdCB0eXBlICogZnR5cGUgPSBUWVBFX0ZOX0ZJRUxEX1RZUEUgKGYsIGopOyAgIC8qIG1ldGhvZCB0eXBlICovCisKKyAgICAgIGFyZ3AgPSB2YWx1ZV9jYXN0ICh0eXBlLCAqYXJnMXApOworCisgICAgICBpZiAoVkFMVUVfQUREUkVTUyAoYXJncCkgPT0gMCkKKyAgICAgICAgZXJyb3IgKCJBZGRyZXNzIG9mIG9iamVjdCBpcyBudWxsOyBvYmplY3QgbWF5IG5vdCBoYXZlIGJlZW4gY3JlYXRlZC4iKTsKKyAgICAgIAorICAgICAgLyogcGFpOiBGSVhNRSAtLSAzMng2NCBwb3NzaWJsZSBwcm9ibGVtPyAqLworICAgICAgLyogRmlyc3Qgd29yZCAoNCBieXRlcykgaW4gb2JqZWN0IGxheW91dCBpcyB0aGUgdnRhYmxlIHBvaW50ZXIgKi8KKyAgICAgIGNvcmVwdHIgPSAqIChDT1JFX0FERFIgKikgKFZBTFVFX0NPTlRFTlRTIChhcmdwKSk7IC8qIHBhaTogKHRlbXApICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKyBvZmZzZXQgKyBWQUxVRV9FTUJFRERFRF9PRkZTRVQgKGFyZ3ApKTsgKi8gCisKKyAgICAgIGlmICghY29yZXB0cikKKyAgICAgICAgZXJyb3IgKCJWaXJ0dWFsIHRhYmxlIHBvaW50ZXIgaXMgbnVsbCBmb3Igb2JqZWN0OyBvYmplY3QgbWF5IG5vdCBoYXZlIGJlZW4gY3JlYXRlZC4iKTsKKyAgICAgIAorICAgICAgLyogcGFpLzE5OTctMDUtMDkKKyAgICAgICAqIEZJWE1FOiBUaGUgY29kZSBoZXJlIGN1cnJlbnRseSBoYW5kbGVzIG9ubHkKKyAgICAgICAqIHRoZSBub24tUlJCQyBjYXNlIG9mIHRoZSBUYWxpZ2VudC9IUCBydW50aW1lIHNwZWM7IHdoZW4gUlJCQworICAgICAgICogaXMgaW50cm9kdWNlZCwgdGhlIGNvbmRpdGlvbiBmb3IgdGhlICJpZiIgYmVsb3cgd2lsbCBoYXZlIHRvCisgICAgICAgKiBiZSBjaGFuZ2VkIHRvIGJlIGEgdGVzdCBmb3IgdGhlIFJSQkMgY2FzZS4gICovCisgICAgICAgCisgICAgICBpZiAoMSkKKyAgICAgICAgeworICAgICAgICAgIC8qIE5vbi1SUkJDIGNhc2U7IHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHBvaW50ZXJzIGFyZSBzdG9yZWQgYXQgZml4ZWQKKyAgICAgICAgICAgKiBvZmZzZXRzIGluIHRoZSB2aXJ0dWFsIHRhYmxlLiAqLworCisgICAgICAgICAgLyogUmV0cmlldmUgdGhlIG9mZnNldCBpbiB0aGUgdmlydHVhbCB0YWJsZSBmcm9tIHRoZSBkZWJ1ZworICAgICAgICAgICAqIGluZm8uICBUaGUgb2Zmc2V0IG9mIHRoZSB2ZnVuYydzIGVudHJ5IGlzIGluIHdvcmRzIGZyb20KKyAgICAgICAgICAgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB2dGFibGU7IGJ1dCBmaXJzdCB3ZSBoYXZlIHRvIGFkanVzdAorICAgICAgICAgICAqIGJ5IEhQX0FDQ19WRlVOQ19TVEFSVCB0byBhY2NvdW50IGZvciBvdGhlciBlbnRyaWVzICovCisgICAgICAgICAgCisgICAgICAgICAgLyogcGFpOiBGSVhNRTogMzJ4NjQgcHJvYmxlbSBoZXJlLCBhIHdvcmQgbWF5IGJlIDggYnl0ZXMgaW4KKyAgICAgICAgICAgKiB3aGljaCBjYXNlIHRoZSBtdWx0aXBsaWVyIHNob3VsZCBiZSA4IGFuZCB2YWx1ZXMgc2hvdWxkIGJlIGxvbmcgKi8KKyAgICAgICAgICB2cCA9IHZhbHVlX2F0IChidWlsdGluX3R5cGVfaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVwdHIgKyA0ICogKFRZUEVfRk5fRklFTERfVk9GRlNFVCAoZiwgaikgKyBIUF9BQ0NfVkZVTkNfU1RBUlQpLCBOVUxMKTsKKyAgICAgICAgICAKKyAgICAgICAgICBjb3JlcHRyID0gKiAoQ09SRV9BRERSICopIChWQUxVRV9DT05URU5UUyAodnApKTsKKyAgICAgICAgICAvKiBjb3JlcHRyIG5vdyBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGUgdmlydHVhbCBmdW5jdGlvbiAqLworICAgICAgICAgIC8qIChBY3R1YWxseSwgaXQgY29udGFpbnMgdGhlIHBvaW50ZXIgdG8gdGhlIHBsYWJlbCBmb3IgdGhlIGZ1bmN0aW9uLiAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBSUkJDIGNhc2U7IHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHBvaW50ZXJzIGFyZSBmb3VuZCBieSBkb3VibGUKKyAgICAgICAgICAgKiBpbmRpcmVjdGlvbiB0aHJvdWdoIHRoZSBjbGFzcyBzZWdtZW50IHRhYmxlcy4gKi8KKyAgICAgICAgICAKKyAgICAgICAgICAvKiBDaG9vc2UgY2xhc3Mgc2VnbWVudCBkZXBlbmRpbmcgb24gdHlwZSB3ZSB3ZXJlIHBhc3NlZCAqLyAKKyAgICAgICAgICBjbGFzc19pbmRleCA9IGNsYXNzX2luZGV4X2luX3ByaW1hcnlfbGlzdCAodHlwZSk7CisgICAgICAKKyAgICAgICAgICAvKiBGaW5kIGNsYXNzIHNlZ21lbnQgcG9pbnRlci4gIFRoZXNlIGFyZSBpbiB0aGUgdnRhYmxlIHNsb3RzIGFmdGVyCisgICAgICAgICAgICogc29tZSBvdGhlciBlbnRyaWVzLCBzbyBhZGp1c3QgYnkgSFBfQUNDX1ZGVU5DX1NUQVJUIGZvciB0aGF0LiAqLworICAgICAgICAgIC8qIHBhaTogRklYTUUgMzJ4NjQgcHJvYmxlbSBoZXJlLCBpZiB3b3JkcyBhcmUgOCBieXRlcyBsb25nCisgICAgICAgICAgICogdGhlIG11bHRpcGxpZXIgYmVsb3cgaGFzIHRvIGJlIDggYW5kIHZhbHVlIHNob3VsZCBiZSBsb25nLiAqLworICAgICAgICAgIHZwID0gdmFsdWVfYXQgKGJ1aWx0aW5fdHlwZV9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29yZXB0ciArIDQgKiAoSFBfQUNDX1ZGVU5DX1NUQVJUICsgY2xhc3NfaW5kZXgpLCBOVUxMKTsKKyAgICAgICAgICAvKiBJbmRpcmVjdCBvbmNlIG1vcmUsIG9mZnNldCBieSBmdW5jdGlvbiBpbmRleCAqLworICAgICAgICAgIC8qIHBhaTogRklYTUUgMzJ4NjQgcHJvYmxlbSBoZXJlLCBhZ2FpbiBtdWx0aXBsaWVyIGNvdWxkIGJlIDggYW5kIHZhbHVlIGxvbmcgKi8KKyAgICAgICAgICBjb3JlcHRyID0gKiAoQ09SRV9BRERSICopIChWQUxVRV9DT05URU5UUyAodnApICsgNCAqIFRZUEVfRk5fRklFTERfVk9GRlNFVCAoZiwgaikpOworICAgICAgICAgIHZwID0gdmFsdWVfYXQgKGJ1aWx0aW5fdHlwZV9pbnQsIGNvcmVwdHIsIE5VTEwpOworICAgICAgICAgIGNvcmVwdHIgPSAqIChDT1JFX0FERFIgKikgKFZBTFVFX0NPTlRFTlRTICh2cCkpOworICAgICAgICAgIAorICAgICAgICAgIC8qIGNvcmVwdHIgbm93IGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uICovCisgICAgICAgICAgLyogKEFjdHVhbGx5LCBpdCBjb250YWlucyB0aGUgcG9pbnRlciB0byB0aGUgcGxhYmVsIGZvciB0aGUgZnVuY3Rpb24uKSAqLworICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgIGlmICghY29yZXB0cikKKyAgICAgICAgZXJyb3IgKCJBZGRyZXNzIG9mIHZpcnR1YWwgZnVuY3Rpb24gaXMgbnVsbDsgZXJyb3IgaW4gdmlydHVhbCB0YWJsZT8iKTsKKworICAgICAgLyogV3JhcCB0aGlzIGFkZHIgaW4gYSB2YWx1ZSBhbmQgcmV0dXJuIHBvaW50ZXIgKi8gCisgICAgICB2cCA9IGFsbG9jYXRlX3ZhbHVlIChmdHlwZSk7CisgICAgICBWQUxVRV9UWVBFICh2cCkgPSBmdHlwZTsKKyAgICAgIFZBTFVFX0FERFJFU1MgKHZwKSA9IGNvcmVwdHI7CisgICAgICAKKyAgICAgIC8qIHBhaTogKHRlbXApIGRvIHdlIG5lZWQgdGhlIHZhbHVlX2luZCBzdHVmZiBpbiB2YWx1ZV9mbl9maWVsZD8gKi8KKyAgICAgIHJldHVybiB2cDsKKyAgICB9CisgIGVsc2UgIAorICAgIHsgLyogTm90IHVzaW5nIEhQL1RhbGlnZW50IHJ1bnRpbWUgY29udmVudGlvbnM7IHNvIHRyeSB0bworICAgICAgICogdXNlIGcrKyBjb252ZW50aW9ucyBmb3IgdmlydHVhbCB0YWJsZSAqLworICAgICAgCisgICAgICBzdHJ1Y3QgdHlwZSAqZW50cnlfdHlwZTsKKyAgICAgIC8qIEZpcnN0LCBnZXQgdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgcG9pbnRlci4gIFRoYXQgY29tZXMKKyAgICAgICAgIHdpdGggYSBzdHJhbmdlIHR5cGUsIHNvIGNhc3QgaXQgdG8gdHlwZSBgcG9pbnRlciB0byBsb25nJyAod2hpY2gKKyAgICAgICAgIHNob3VsZCBzZXJ2ZSBqdXN0IGZpbmUgYXMgYSBmdW5jdGlvbiB0eXBlKS4gIFRoZW4sIGluZGV4IGludG8KKyAgICAgICAgIHRoZSB0YWJsZSwgYW5kIGNvbnZlcnQgZmluYWwgdmFsdWUgdG8gYXBwcm9wcmlhdGUgZnVuY3Rpb24gdHlwZS4gICovCisgICAgICB2YWx1ZV9wdHIgZW50cnksIHZmbiwgdnRibDsKKyAgICAgIHZhbHVlX3B0ciB2aSA9IHZhbHVlX2Zyb21fbG9uZ2VzdCAoYnVpbHRpbl90eXBlX2ludCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMT05HRVNUKSBUWVBFX0ZOX0ZJRUxEX1ZPRkZTRVQgKGYsIGopKTsKKyAgICAgIHN0cnVjdCB0eXBlICpmY29udGV4dCA9IFRZUEVfRk5fRklFTERfRkNPTlRFWFQgKGYsIGopOworICAgICAgc3RydWN0IHR5cGUgKmNvbnRleHQ7CisgICAgICBpZiAoZmNvbnRleHQgPT0gTlVMTCkKKyAgICAgICAvKiBXZSBkb24ndCBoYXZlIGFuIGZjb250ZXh0IChlLmcuIHRoZSBwcm9ncmFtIHdhcyBjb21waWxlZCB3aXRoCisgICAgICAgICAgZysrIHZlcnNpb24gMSkuICBUcnkgdG8gZ2V0IHRoZSB2dGJsIGZyb20gdGhlIFRZUEVfVlBUUl9CQVNFVFlQRS4KKyAgICAgICAgICBUaGlzIHdvbid0IHdvcmsgcmlnaHQgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLCBidXQgYXQgbGVhc3Qgd2UKKyAgICAgICAgICBzaG91bGQgZG8gYXMgd2VsbCBhcyBHREIgMy54IGRpZC4gICovCisgICAgICAgIGZjb250ZXh0ID0gVFlQRV9WUFRSX0JBU0VUWVBFICh0eXBlKTsKKyAgICAgIGNvbnRleHQgPSBsb29rdXBfcG9pbnRlcl90eXBlIChmY29udGV4dCk7CisgICAgICAvKiBOb3cgY29udGV4dCBpcyBhIHBvaW50ZXIgdG8gdGhlIGJhc2V0eXBlIGNvbnRhaW5pbmcgdGhlIHZ0YmwuICAqLworICAgICAgaWYgKFRZUEVfVEFSR0VUX1RZUEUgKGNvbnRleHQpICE9IHR5cGUxKQorICAgICAgICB7CisJICB2YWx1ZV9wdHIgdG1wID0gdmFsdWVfY2FzdCAoY29udGV4dCwgdmFsdWVfYWRkciAoYXJnMSkpOworCSAgVkFMVUVfUE9JTlRFRF9UT19PRkZTRVQgKHRtcCkgPSAwOworICAgICAgICAgIGFyZzEgPSB2YWx1ZV9pbmQgKHRtcCk7CisgICAgICAgICAgdHlwZTEgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFIChhcmcxKSk7CisgICAgICAgIH0KKworICAgICAgY29udGV4dCA9IHR5cGUxOworICAgICAgLyogTm93IGNvbnRleHQgaXMgdGhlIGJhc2V0eXBlIGNvbnRhaW5pbmcgdGhlIHZ0YmwuICAqLworCisgICAgICAvKiBUaGlzIHR5cGUgbWF5IGhhdmUgYmVlbiBkZWZpbmVkIGJlZm9yZSBpdHMgdmlydHVhbCBmdW5jdGlvbiB0YWJsZQorICAgICAgICAgd2FzLiAgSWYgc28sIGZpbGwgaW4gdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgZW50cnkgZm9yIHRoZQorICAgICAgICAgdHlwZSBub3cuICAqLworICAgICAgaWYgKFRZUEVfVlBUUl9GSUVMRE5PIChjb250ZXh0KSA8IDApCisgICAgICAgIGZpbGxfaW5fdnB0cl9maWVsZG5vIChjb250ZXh0KTsKKworICAgICAgLyogVGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgaXMgbm93IGFuIGFycmF5IG9mIHN0cnVjdHVyZXMKKyAgICAgICAgIHdoaWNoIGhhdmUgdGhlIGZvcm0geyBpbnQxNiBvZmZzZXQsIGRlbHRhOyB2b2lkICpwZm47IH0uICAqLworICAgICAgdnRibCA9IHZhbHVlX3ByaW1pdGl2ZV9maWVsZCAoYXJnMSwgMCwgVFlQRV9WUFRSX0ZJRUxETk8gKGNvbnRleHQpLAorCQkJCSAgICBUWVBFX1ZQVFJfQkFTRVRZUEUgKGNvbnRleHQpKTsKKyAgICAgIAorICAgICAgLyogV2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBnKyssIHRoZSB2dGJsIGZpZWxkIHBvaW50ZWQgdG8gYW4gYXJyYXkKKwkgb2Ygc3RydWN0dXJlcy4gIE5vd2FkYXlzIGl0IHBvaW50cyBkaXJlY3RseSB0byB0aGUgc3RydWN0dXJlLiAqLworICAgICAgaWYgKFRZUEVfQ09ERSAoVkFMVUVfVFlQRSAodnRibCkpID09IFRZUEVfQ09ERV9QVFIKKwkgICYmIFRZUEVfQ09ERSAoVFlQRV9UQVJHRVRfVFlQRSAoVkFMVUVfVFlQRSAodnRibCkpKSA9PSBUWVBFX0NPREVfQVJSQVkpCisJeworCSAgLyogSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSB2dGJsIGZpZWxkIHBvaW50cyB0byBhbgorCSAgICAgYXJyYXkgb2Ygc3RydWN0dXJlcy4gKi8KKwkgIHZ0YmwgPSB2YWx1ZV9pbmQgKHZ0YmwpOworCisJICAvKiBJbmRleCBpbnRvIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLiAgVGhpcyBpcyBoYXJkLWNvZGVkIGJlY2F1c2UKKwkgICAgIGxvb2tpbmcgdXAgYSBmaWVsZCBpcyBub3QgY2hlYXAsIGFuZCBpdCBtYXkgYmUgaW1wb3J0YW50IHRvIHNhdmUKKwkgICAgIHRpbWUsIGUuZy4gaWYgdGhlIHVzZXIgaGFzIHNldCBhIGNvbmRpdGlvbmFsIGJyZWFrcG9pbnQgY2FsbGluZworCSAgICAgYSB2aXJ0dWFsIGZ1bmN0aW9uLiAgKi8KKwkgIGVudHJ5ID0gdmFsdWVfc3Vic2NyaXB0ICh2dGJsLCB2aSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgdnRibCBmaWVsZCBwb2ludHMgZGlyZWN0bHkgdG8gYSBzdHJ1Y3R1cmUuICovCisJICB2dGJsID0gdmFsdWVfYWRkICh2dGJsLCB2aSk7CisJICBlbnRyeSA9IHZhbHVlX2luZCAodnRibCk7CisJfQorCisgICAgICBlbnRyeV90eXBlID0gY2hlY2tfdHlwZWRlZiAoVkFMVUVfVFlQRSAoZW50cnkpKTsKKworICAgICAgaWYgKFRZUEVfQ09ERSAoZW50cnlfdHlwZSkgPT0gVFlQRV9DT0RFX1NUUlVDVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIE1vdmUgdGhlIGB0aGlzJyBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gKi8KKyAgICAgICAgICBWQUxVRV9PRkZTRVQgKGFyZzEpICs9IHZhbHVlX2FzX2xvbmcgKHZhbHVlX2ZpZWxkIChlbnRyeSwgMCkpOworCisgICAgICAgICAgaWYgKCEgVkFMVUVfTEFaWSAoYXJnMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFZBTFVFX0xBWlkgKGFyZzEpID0gMTsKKyAgICAgICAgICAgICAgdmFsdWVfZmV0Y2hfbGF6eSAoYXJnMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICB2Zm4gPSB2YWx1ZV9maWVsZCAoZW50cnksIDIpOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChUWVBFX0NPREUgKGVudHJ5X3R5cGUpID09IFRZUEVfQ09ERV9QVFIpCisgICAgICAgIHZmbiA9IGVudHJ5OworICAgICAgZWxzZQorICAgICAgICBlcnJvciAoIkknbSBjb25mdXNlZDogIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgaGFzIGJhZCB0eXBlIik7CisgICAgICAvKiBSZWluc3RhbnRpYXRlIHRoZSBmdW5jdGlvbiBwb2ludGVyIHdpdGggdGhlIGNvcnJlY3QgdHlwZS4gICovCisgICAgICBWQUxVRV9UWVBFICh2Zm4pID0gbG9va3VwX3BvaW50ZXJfdHlwZSAoVFlQRV9GTl9GSUVMRF9UWVBFIChmLCBqKSk7CisKKyAgICAgICphcmcxcCA9IGFyZzE7CisgICAgICByZXR1cm4gdmZuOworICAgIH0KK30KKworLyogQVJHIGlzIGEgcG9pbnRlciB0byBhbiBvYmplY3Qgd2Uga25vdyB0byBiZSBhdCBsZWFzdAorICAgYSBEVFlQRS4gIEJUWVBFIGlzIHRoZSBtb3N0IGRlcml2ZWQgYmFzZXR5cGUgdGhhdCBoYXMKKyAgIGFscmVhZHkgYmVlbiBzZWFyY2hlZCAoYW5kIG5lZWQgbm90IGJlIHNlYXJjaGVkIGFnYWluKS4KKyAgIEFmdGVyIGxvb2tpbmcgYXQgdGhlIHZ0YWJsZXMgYmV0d2VlbiBCVFlQRSBhbmQgRFRZUEUsCisgICByZXR1cm4gdGhlIG1vc3QgZGVyaXZlZCB0eXBlIHdlIGZpbmQuICBUaGUgY2FsbGVyIG11c3QKKyAgIGJlIHNhdGlzZmllZCB3aGVuIHRoZSByZXR1cm4gdmFsdWUgPT0gRFRZUEUuCisKKyAgIEZJWE1FLXRpZW1hbm46IHNob3VsZCB3b3JrIHdpdGggZG9zc2llciBlbnRyaWVzIGFzIHdlbGwuICAqLworCitzdGF0aWMgdmFsdWVfcHRyCit2YWx1ZV9oZWFkb2YgKGluX2FyZywgYnR5cGUsIGR0eXBlKQorICAgICB2YWx1ZV9wdHIgaW5fYXJnOworICAgICBzdHJ1Y3QgdHlwZSAqYnR5cGUsICpkdHlwZTsKK3sKKyAgLyogRmlyc3QgY29sbGVjdCB0aGUgdnRhYmxlcyB3ZSBtdXN0IGxvb2sgYXQgZm9yIHRoaXMgb2JqZWN0LiAgKi8KKyAgLyogRklYTUUtdGllbWFubjogcmlnaHQgbm93LCBqdXN0IGxvb2sgYXQgdG9wLW1vc3QgdnRhYmxlLiAgKi8KKyAgdmFsdWVfcHRyIGFyZywgdnRibCwgZW50cnksIGJlc3RfZW50cnkgPSAwOworICBpbnQgaSwgbmVsZW1zOworICBpbnQgb2Zmc2V0LCBiZXN0X29mZnNldCA9IDA7CisgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKyAgQ09SRV9BRERSIHBjX2Zvcl9zeW07CisgIGNoYXIgKmRlbWFuZ2xlZF9uYW1lOworICBzdHJ1Y3QgbWluaW1hbF9zeW1ib2wgKm1zeW1ib2w7CisKKyAgYnR5cGUgPSBUWVBFX1ZQVFJfQkFTRVRZUEUgKGR0eXBlKTsKKyAgQ0hFQ0tfVFlQRURFRiAoYnR5cGUpOworICBhcmcgPSBpbl9hcmc7CisgIGlmIChidHlwZSAhPSBkdHlwZSkKKyAgICBhcmcgPSB2YWx1ZV9jYXN0IChsb29rdXBfcG9pbnRlcl90eXBlIChidHlwZSksIGFyZyk7CisgIHZ0YmwgPSB2YWx1ZV9pbmQgKHZhbHVlX2ZpZWxkICh2YWx1ZV9pbmQgKGFyZyksIFRZUEVfVlBUUl9GSUVMRE5PIChidHlwZSkpKTsKKworICAvKiBDaGVjayB0aGF0IFZUQkwgbG9va3MgbGlrZSBpdCBwb2ludHMgdG8gYSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLiAgKi8KKyAgbXN5bWJvbCA9IGxvb2t1cF9taW5pbWFsX3N5bWJvbF9ieV9wYyAoVkFMVUVfQUREUkVTUyAodnRibCkpOworICBpZiAobXN5bWJvbCA9PSBOVUxMCisgICAgICB8fCAoZGVtYW5nbGVkX25hbWUgPSBTWU1CT0xfTkFNRSAobXN5bWJvbCkpID09IE5VTEwKKyAgICAgIHx8ICFWVEJMX1BSRUZJWF9QIChkZW1hbmdsZWRfbmFtZSkpCisgICAgeworICAgICAgLyogSWYgd2UgZXhwZWN0ZWQgdG8gZmluZCBhIHZ0YWJsZSwgYnV0IGRpZCBub3QsIGxldCB0aGUgdXNlcgorCSBrbm93IHRoYXQgd2UgYXJlbid0IGhhcHB5LCBidXQgZG9uJ3QgdGhyb3cgYW4gZXJyb3IuCisJIEZJWE1FOiB0aGVyZSBoYXMgdG8gYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMuICAqLworICAgICAgc3RydWN0IHR5cGUgKmVycm9yX3R5cGUgPSAoc3RydWN0IHR5cGUgKil4bWFsbG9jIChzaXplb2YgKHN0cnVjdCB0eXBlKSk7CisgICAgICBtZW1jcHkgKGVycm9yX3R5cGUsIFZBTFVFX1RZUEUgKGluX2FyZyksIHNpemVvZiAoc3RydWN0IHR5cGUpKTsKKyAgICAgIFRZUEVfTkFNRSAoZXJyb3JfdHlwZSkgPSBzYXZlc3RyaW5nICgic3VzcGljaW91cyAqIiwgc2l6ZW9mICgic3VzcGljaW91cyAqIikpOworICAgICAgVkFMVUVfVFlQRSAoaW5fYXJnKSA9IGVycm9yX3R5cGU7CisgICAgICByZXR1cm4gaW5fYXJnOworICAgIH0KKworICAvKiBOb3cgc2VhcmNoIHRocm91Z2ggdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUuICAqLworICBlbnRyeSA9IHZhbHVlX2luZCAodnRibCk7CisgIG5lbGVtcyA9IGxvbmdlc3RfdG9faW50ICh2YWx1ZV9hc19sb25nICh2YWx1ZV9maWVsZCAoZW50cnksIDIpKSk7CisgIGZvciAoaSA9IDE7IGkgPD0gbmVsZW1zOyBpKyspCisgICAgeworICAgICAgZW50cnkgPSB2YWx1ZV9zdWJzY3JpcHQgKHZ0YmwsIHZhbHVlX2Zyb21fbG9uZ2VzdCAoYnVpbHRpbl90eXBlX2ludCwgCisJCQkJCQkgICAgICAoTE9OR0VTVCkgaSkpOworICAgICAgLyogVGhpcyB3b24ndCB3b3JrIGlmIHdlJ3JlIHVzaW5nIHRodW5rcy4gKi8KKyAgICAgIGlmIChUWVBFX0NPREUgKGNoZWNrX3R5cGVkZWYgKFZBTFVFX1RZUEUgKGVudHJ5KSkpICE9IFRZUEVfQ09ERV9TVFJVQ1QpCisJYnJlYWs7CisgICAgICBvZmZzZXQgPSBsb25nZXN0X3RvX2ludCAodmFsdWVfYXNfbG9uZyAodmFsdWVfZmllbGQgKGVudHJ5LCAwKSkpOworICAgICAgLyogSWYgd2UgdXNlICc8PScgd2UgY2FuIGhhbmRsZSBzaW5nbGUgaW5oZXJpdGFuY2UKKyAgICAgICAqIHdoZXJlIGFsbCBvZmZzZXRzIGFyZSB6ZXJvIC0ganVzdCB1c2UgdGhlIGZpcnN0IGVudHJ5IGZvdW5kLiAqLworICAgICAgaWYgKG9mZnNldCA8PSBiZXN0X29mZnNldCkKKwl7CisJICBiZXN0X29mZnNldCA9IG9mZnNldDsKKwkgIGJlc3RfZW50cnkgPSBlbnRyeTsKKwl9CisgICAgfQorICAvKiBNb3ZlIHRoZSBwb2ludGVyIGFjY29yZGluZyB0byBCRVNUX0VOVFJZJ3Mgb2Zmc2V0LCBhbmQgZmlndXJlCisgICAgIG91dCB3aGF0IHR5cGUgd2Ugc2hvdWxkIHJldHVybiBhcyB0aGUgbmV3IHBvaW50ZXIuICAqLworICBpZiAoYmVzdF9lbnRyeSA9PSAwKQorICAgIHsKKyAgICAgIC8qIEFuIGFsdGVybmF0aXZlIG1ldGhvZCAod2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBuZWNlc3NhcnkpLgorICAgICAgICogQnV0IHdlIGxlYXZlIGl0IGluIGZvciBmdXR1cmUgdXNlLCB3aGVuIHdlIHdpbGwgaG9wZWZ1bGx5CisgICAgICAgKiBoYXZlIG9wdGltaXplcyB0aGUgdnRhYmxlIHRvIHVzZSB0aHVua3MgaW5zdGVhZCBvZiBvZmZzZXRzLiAqLworICAgICAgLyogVXNlIHRoZSBuYW1lIG9mIHZ0YWJsZSBpdHNlbGYgdG8gZXh0cmFjdCBhIGJhc2UgdHlwZS4gKi8KKyAgICAgIGRlbWFuZ2xlZF9uYW1lICs9IDQ7ICAvKiBTa2lwIF92dCQgcHJlZml4LiAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHBjX2Zvcl9zeW0gPSB2YWx1ZV9hc19wb2ludGVyICh2YWx1ZV9maWVsZCAoYmVzdF9lbnRyeSwgMikpOworICAgICAgc3ltID0gZmluZF9wY19mdW5jdGlvbiAocGNfZm9yX3N5bSk7CisgICAgICBkZW1hbmdsZWRfbmFtZSA9IGNwbHVzX2RlbWFuZ2xlIChTWU1CT0xfTkFNRSAoc3ltKSwgRE1HTF9BTlNJKTsKKyAgICAgICooc3RyY2hyIChkZW1hbmdsZWRfbmFtZSwgJzonKSkgPSAnXDAnOworICAgIH0KKyAgc3ltID0gbG9va3VwX3N5bWJvbCAoZGVtYW5nbGVkX25hbWUsIDAsIFZBUl9OQU1FU1BBQ0UsIDAsIDApOworICBpZiAoc3ltID09IE5VTEwpCisgICAgZXJyb3IgKCJjb3VsZCBub3QgZmluZCB0eXBlIGRlY2xhcmF0aW9uIGZvciBgJXMnIiwgZGVtYW5nbGVkX25hbWUpOworICBpZiAoYmVzdF9lbnRyeSkKKyAgICB7CisgICAgICBmcmVlIChkZW1hbmdsZWRfbmFtZSk7CisgICAgICBhcmcgPSB2YWx1ZV9hZGQgKHZhbHVlX2Nhc3QgKGJ1aWx0aW5fdHlwZV9pbnQsIGFyZyksCisJCSAgICAgICB2YWx1ZV9maWVsZCAoYmVzdF9lbnRyeSwgMCkpOworICAgIH0KKyAgZWxzZSBhcmcgPSBpbl9hcmc7CisgIFZBTFVFX1RZUEUgKGFyZykgPSBsb29rdXBfcG9pbnRlcl90eXBlIChTWU1CT0xfVFlQRSAoc3ltKSk7CisgIHJldHVybiBhcmc7Cit9CisKKy8qIEFSRyBpcyBhIHBvaW50ZXIgb2JqZWN0IG9mIHR5cGUgVFlQRS4gIElmIFRZUEUgaGFzIHZpcnR1YWwKKyAgIGZ1bmN0aW9uIHRhYmxlcywgcHJvYmUgQVJHJ3MgdGFibGVzIChpbmNsdWRpbmcgdGhlIHZ0YWJsZXMKKyAgIG9mIGl0cyBiYXNlY2xhc3NlcykgdG8gZmlndXJlIG91dCB0aGUgbW9zdCBkZXJpdmVkIHR5cGUgdGhhdCBBUkcKKyAgIGNvdWxkIGFjdHVhbGx5IGJlIGEgcG9pbnRlciB0by4gICovCisKK3ZhbHVlX3B0cgordmFsdWVfZnJvbV92dGFibGVfaW5mbyAoYXJnLCB0eXBlKQorICAgICB2YWx1ZV9wdHIgYXJnOworICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKK3sKKyAgLyogVGFrZSBjYXJlIG9mIHByZWxpbWluYXJpZXMuICAqLworICBpZiAoVFlQRV9WUFRSX0ZJRUxETk8gKHR5cGUpIDwgMCkKKyAgICBmaWxsX2luX3ZwdHJfZmllbGRubyAodHlwZSk7CisgIGlmIChUWVBFX1ZQVFJfRklFTEROTyAodHlwZSkgPCAwKQorICAgIHJldHVybiAwOworCisgIHJldHVybiB2YWx1ZV9oZWFkb2YgKGFyZywgMCwgdHlwZSk7Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIHRoZSBJTkRFWHRoIGZpZWxkIG9mIFRZUEUgaXMgYSB2aXJ0dWFsIGJhc2VjbGFzcworICAgcG9pbnRlciB3aGljaCBpcyBmb3IgdGhlIGJhc2UgY2xhc3Mgd2hvc2UgdHlwZSBpcyBCQVNFQ0xBU1MuICAqLworCitzdGF0aWMgaW50Cit2Yl9tYXRjaCAodHlwZSwgaW5kZXgsIGJhc2V0eXBlKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgaW50IGluZGV4OworICAgICBzdHJ1Y3QgdHlwZSAqYmFzZXR5cGU7Cit7CisgIHN0cnVjdCB0eXBlICpmaWVsZHR5cGU7CisgIGNoYXIgKm5hbWUgPSBUWVBFX0ZJRUxEX05BTUUgKHR5cGUsIGluZGV4KTsKKyAgY2hhciAqZmllbGRfY2xhc3NfbmFtZSA9IE5VTEw7CisKKyAgaWYgKCpuYW1lICE9ICdfJykKKyAgICByZXR1cm4gMDsKKyAgLyogZ2NjIDIuNCB1c2VzIF92YiQuICAqLworICBpZiAobmFtZVsxXSA9PSAndicgJiYgbmFtZVsyXSA9PSAnYicgJiYgaXNfY3BsdXNfbWFya2VyIChuYW1lWzNdKSkKKyAgICBmaWVsZF9jbGFzc19uYW1lID0gbmFtZSArIDQ7CisgIC8qIGdjYyAyLjUgd2lsbCB1c2UgX192Yl8uICAqLworICBpZiAobmFtZVsxXSA9PSAnXycgJiYgbmFtZVsyXSA9PSAndicgJiYgbmFtZVszXSA9PSAnYicgJiYgbmFtZVs0XSA9PSAnXycpCisgICAgZmllbGRfY2xhc3NfbmFtZSA9IG5hbWUgKyA1OworCisgIGlmIChmaWVsZF9jbGFzc19uYW1lID09IE5VTEwpCisgICAgLyogVGhpcyBmaWVsZCBpcyBub3QgYSB2aXJ0dWFsIGJhc2UgY2xhc3MgcG9pbnRlci4gICovCisgICAgcmV0dXJuIDA7CisKKyAgLyogSXQncyBhIHZpcnR1YWwgYmFzZWNsYXNzIHBvaW50ZXIsIG5vdyB3ZSBqdXN0IG5lZWQgdG8gZmluZCBvdXQgd2hldGhlcgorICAgICBpdCBpcyBmb3IgdGhpcyBiYXNlY2xhc3MuICAqLworICBmaWVsZHR5cGUgPSBUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGluZGV4KTsKKyAgaWYgKGZpZWxkdHlwZSA9PSBOVUxMCisgICAgICB8fCBUWVBFX0NPREUgKGZpZWxkdHlwZSkgIT0gVFlQRV9DT0RFX1BUUikKKyAgICAvKiAiQ2FuJ3QgaGFwcGVuIi4gICovCisgICAgcmV0dXJuIDA7CisKKyAgLyogV2hhdCB3ZSBjaGVjayBmb3IgaXMgdGhhdCBlaXRoZXIgdGhlIHR5cGVzIGFyZSBlcXVhbCAobmVlZGVkIGZvcgorICAgICBuYW1lbGVzcyB0eXBlcykgb3IgaGF2ZSB0aGUgc2FtZSBuYW1lLiAgVGhpcyBpcyB1Z2x5LCBhbmQgYSBtb3JlCisgICAgIGVsZWdhbnQgc29sdXRpb24gc2hvdWxkIGJlIGRldmlzZWQgKHdoaWNoIHdvdWxkIHByb2JhYmx5IGp1c3QgcHVzaAorICAgICB0aGUgdWdsaW5lc3MgaW50byBzeW1ib2wgcmVhZGluZyB1bmxlc3Mgd2UgY2hhbmdlIHRoZSBzdGFicyBmb3JtYXQpLiAgKi8KKyAgaWYgKFRZUEVfVEFSR0VUX1RZUEUgKGZpZWxkdHlwZSkgPT0gYmFzZXR5cGUpCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKFRZUEVfTkFNRSAoYmFzZXR5cGUpICE9IE5VTEwKKyAgICAgICYmIFRZUEVfTkFNRSAoVFlQRV9UQVJHRVRfVFlQRSAoZmllbGR0eXBlKSkgIT0gTlVMTAorICAgICAgJiYgU1RSRVEgKFRZUEVfTkFNRSAoYmFzZXR5cGUpLAorCQlUWVBFX05BTUUgKFRZUEVfVEFSR0VUX1RZUEUgKGZpZWxkdHlwZSkpKSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIENvbXB1dGUgdGhlIG9mZnNldCBvZiB0aGUgYmFzZWNsYXNzIHdoaWNoIGlzCisgICB0aGUgSU5ERVh0aCBiYXNlY2xhc3Mgb2YgY2xhc3MgVFlQRSwKKyAgIGZvciB2YWx1ZSBhdCBWQUxBRERSIChpbiBob3N0KSBhdCBBRERSRVNTIChpbiB0YXJnZXQpLgorICAgVGhlIHJlc3VsdCBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBiYXNlY2xhc3MgdmFsdWUgcmVsYXRpdmUKKyAgIHRvICh0aGUgYWRkcmVzcyBvZikoQVJHKSArIE9GRlNFVC4KKworICAgLTEgaXMgcmV0dXJuZWQgb24gZXJyb3IuICovCisKK2ludAorYmFzZWNsYXNzX29mZnNldCAodHlwZSwgaW5kZXgsIHZhbGFkZHIsIGFkZHJlc3MpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBpbnQgaW5kZXg7CisgICAgIGNoYXIgKnZhbGFkZHI7CisgICAgIENPUkVfQUREUiBhZGRyZXNzOworeworICBzdHJ1Y3QgdHlwZSAqYmFzZXR5cGUgPSBUWVBFX0JBU0VDTEFTUyAodHlwZSwgaW5kZXgpOworCisgIGlmIChCQVNFVFlQRV9WSUFfVklSVFVBTCAodHlwZSwgaW5kZXgpKQorICAgIHsKKyAgICAgIC8qIE11c3QgaHVudCBmb3IgdGhlIHBvaW50ZXIgdG8gdGhpcyB2aXJ0dWFsIGJhc2VjbGFzcy4gICovCisgICAgICByZWdpc3RlciBpbnQgaSwgbGVuID0gVFlQRV9ORklFTERTICh0eXBlKTsKKyAgICAgIHJlZ2lzdGVyIGludCBuX2Jhc2VjbGFzc2VzID0gVFlQRV9OX0JBU0VDTEFTU0VTICh0eXBlKTsKKworICAgICAgLyogRmlyc3QgbG9vayBmb3IgdGhlIHZpcnR1YWwgYmFzZWNsYXNzIHBvaW50ZXIKKwkgaW4gdGhlIGZpZWxkcy4gICovCisgICAgICBmb3IgKGkgPSBuX2Jhc2VjbGFzc2VzOyBpIDwgbGVuOyBpKyspCisJeworCSAgaWYgKHZiX21hdGNoICh0eXBlLCBpLCBiYXNldHlwZSkpCisJICAgIHsKKwkgICAgICBDT1JFX0FERFIgYWRkcgorCQk9IHVucGFja19wb2ludGVyIChUWVBFX0ZJRUxEX1RZUEUgKHR5cGUsIGkpLAorCQkJCSAgdmFsYWRkciArIChUWVBFX0ZJRUxEX0JJVFBPUyAodHlwZSwgaSkgLyA4KSk7CisKKwkgICAgICByZXR1cm4gYWRkciAtIChMT05HRVNUKSBhZGRyZXNzOworCSAgICB9CisJfQorICAgICAgLyogTm90IGluIHRoZSBmaWVsZHMsIHNvIHRyeSBsb29raW5nIHRocm91Z2ggdGhlIGJhc2VjbGFzc2VzLiAgKi8KKyAgICAgIGZvciAoaSA9IGluZGV4KzE7IGkgPCBuX2Jhc2VjbGFzc2VzOyBpKyspCisJeworCSAgaW50IGJvZmZzZXQgPQorCSAgICAgIGJhc2VjbGFzc19vZmZzZXQgKHR5cGUsIGksIHZhbGFkZHIsIGFkZHJlc3MpOworCSAgaWYgKGJvZmZzZXQpCisJICAgIHJldHVybiBib2Zmc2V0OworCX0KKyAgICAgIC8qIE5vdCBmb3VuZC4gICovCisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIC8qIEJhc2VjbGFzcyBpcyBlYXNpbHkgY29tcHV0ZWQuICAqLworICByZXR1cm4gVFlQRV9CQVNFQ0xBU1NfQklUUE9TICh0eXBlLCBpbmRleCkgLyA4OworfQorDAorLyogVW5wYWNrIGEgZmllbGQgRklFTEROTyBvZiB0aGUgc3BlY2lmaWVkIFRZUEUsIGZyb20gdGhlIGFub255bW91cyBvYmplY3QgYXQKKyAgIFZBTEFERFIuCisKKyAgIEV4dHJhY3RpbmcgYml0cyBkZXBlbmRzIG9uIGVuZGlhbm5lc3Mgb2YgdGhlIG1hY2hpbmUuICBDb21wdXRlIHRoZQorICAgbnVtYmVyIG9mIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgdG8gZGlzY2FyZC4gIEZvciBiaWcgZW5kaWFuIG1hY2hpbmVzLAorICAgd2UgY29tcHV0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGFub255bW91cyBvYmplY3QsIHN1YnRyYWN0CisgICBvZmYgdGhlIGJpdCBjb3VudCBmcm9tIHRoZSBNU0Igb2YgdGhlIG9iamVjdCB0byB0aGUgTVNCIG9mIHRoZQorICAgYml0ZmllbGQsIHRoZW4gdGhlIHNpemUgb2YgdGhlIGJpdGZpZWxkLCB3aGljaCBsZWF2ZXMgdGhlIExTQiBkaXNjYXJkCisgICBjb3VudC4gIEZvciBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzLCB0aGUgZGlzY2FyZCBjb3VudCBpcyBzaW1wbHkgdGhlCisgICBudW1iZXIgb2YgYml0cyBmcm9tIHRoZSBMU0Igb2YgdGhlIGFub255bW91cyBvYmplY3QgdG8gdGhlIExTQiBvZiB0aGUKKyAgIGJpdGZpZWxkLgorCisgICBJZiB0aGUgZmllbGQgaXMgc2lnbmVkLCB3ZSBhbHNvIGRvIHNpZ24gZXh0ZW5zaW9uLiAqLworCitMT05HRVNUCit1bnBhY2tfZmllbGRfYXNfbG9uZyAodHlwZSwgdmFsYWRkciwgZmllbGRubykKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGNoYXIgKnZhbGFkZHI7CisgICAgIGludCBmaWVsZG5vOworeworICBVTE9OR0VTVCB2YWw7CisgIFVMT05HRVNUIHZhbG1hc2s7CisgIGludCBiaXRwb3MgPSBUWVBFX0ZJRUxEX0JJVFBPUyAodHlwZSwgZmllbGRubyk7CisgIGludCBiaXRzaXplID0gVFlQRV9GSUVMRF9CSVRTSVpFICh0eXBlLCBmaWVsZG5vKTsKKyAgaW50IGxzYmNvdW50OworICBzdHJ1Y3QgdHlwZSAqZmllbGRfdHlwZTsKKworICB2YWwgPSBleHRyYWN0X3Vuc2lnbmVkX2ludGVnZXIgKHZhbGFkZHIgKyBiaXRwb3MgLyA4LCBzaXplb2YgKHZhbCkpOworICBmaWVsZF90eXBlID0gVFlQRV9GSUVMRF9UWVBFICh0eXBlLCBmaWVsZG5vKTsKKyAgQ0hFQ0tfVFlQRURFRiAoZmllbGRfdHlwZSk7CisKKyAgLyogRXh0cmFjdCBiaXRzLiAgU2VlIGNvbW1lbnQgYWJvdmUuICovCisKKyAgaWYgKEJJVFNfQklHX0VORElBTikKKyAgICBsc2Jjb3VudCA9IChzaXplb2YgdmFsICogOCAtIGJpdHBvcyAlIDggLSBiaXRzaXplKTsKKyAgZWxzZQorICAgIGxzYmNvdW50ID0gKGJpdHBvcyAlIDgpOworICB2YWwgPj49IGxzYmNvdW50OworCisgIC8qIElmIHRoZSBmaWVsZCBkb2VzIG5vdCBlbnRpcmVseSBmaWxsIGEgTE9OR0VTVCwgdGhlbiB6ZXJvIHRoZSBzaWduIGJpdHMuCisgICAgIElmIHRoZSBmaWVsZCBpcyBzaWduZWQsIGFuZCBpcyBuZWdhdGl2ZSwgdGhlbiBzaWduIGV4dGVuZC4gKi8KKworICBpZiAoKGJpdHNpemUgPiAwKSAmJiAoYml0c2l6ZSA8IDggKiAoaW50KSBzaXplb2YgKHZhbCkpKQorICAgIHsKKyAgICAgIHZhbG1hc2sgPSAoKChVTE9OR0VTVCkgMSkgPDwgYml0c2l6ZSkgLSAxOworICAgICAgdmFsICY9IHZhbG1hc2s7CisgICAgICBpZiAoIVRZUEVfVU5TSUdORUQgKGZpZWxkX3R5cGUpKQorCXsKKwkgIGlmICh2YWwgJiAodmFsbWFzayBeICh2YWxtYXNrID4+IDEpKSkKKwkgICAgeworCSAgICAgIHZhbCB8PSB+dmFsbWFzazsKKwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybiAodmFsKTsKK30KKworLyogTW9kaWZ5IHRoZSB2YWx1ZSBvZiBhIGJpdGZpZWxkLiAgQUREUiBwb2ludHMgdG8gYSBibG9jayBvZiBtZW1vcnkgaW4KKyAgIHRhcmdldCBieXRlIG9yZGVyOyB0aGUgYml0ZmllbGQgc3RhcnRzIGluIHRoZSBieXRlIHBvaW50ZWQgdG8uICBGSUVMRFZBTAorICAgaXMgdGhlIGRlc2lyZWQgdmFsdWUgb2YgdGhlIGZpZWxkLCBpbiBob3N0IGJ5dGUgb3JkZXIuICBCSVRQT1MgYW5kIEJJVFNJWkUKKyAgIGluZGljYXRlIHdoaWNoIGJpdHMgKGluIHRhcmdldCBiaXQgb3JkZXIpIGNvbXByaXNlIHRoZSBiaXRmaWVsZC4gICovCisKK3ZvaWQKK21vZGlmeV9maWVsZCAoYWRkciwgZmllbGR2YWwsIGJpdHBvcywgYml0c2l6ZSkKKyAgICAgY2hhciAqYWRkcjsKKyAgICAgTE9OR0VTVCBmaWVsZHZhbDsKKyAgICAgaW50IGJpdHBvcywgYml0c2l6ZTsKK3sKKyAgTE9OR0VTVCBvd29yZDsKKworICAvKiBJZiBhIG5lZ2F0aXZlIGZpZWxkdmFsIGZpdHMgaW4gdGhlIGZpZWxkIGluIHF1ZXN0aW9uLCBjaG9wCisgICAgIG9mZiB0aGUgc2lnbiBleHRlbnNpb24gYml0cy4gICovCisgIGlmIChiaXRzaXplIDwgKDggKiAoaW50KSBzaXplb2YgKGZpZWxkdmFsKSkKKyAgICAgICYmICh+ZmllbGR2YWwgJiB+KCgxIDw8IChiaXRzaXplIC0gMSkpIC0gMSkpID09IDApCisgICAgZmllbGR2YWwgPSBmaWVsZHZhbCAmICgoMSA8PCBiaXRzaXplKSAtIDEpOworCisgIC8qIFdhcm4gaWYgdmFsdWUgaXMgdG9vIGJpZyB0byBmaXQgaW4gdGhlIGZpZWxkIGluIHF1ZXN0aW9uLiAgKi8KKyAgaWYgKGJpdHNpemUgPCAoOCAqIChpbnQpIHNpemVvZiAoZmllbGR2YWwpKQorICAgICAgJiYgMCAhPSAoZmllbGR2YWwgJiB+KCgxPDxiaXRzaXplKS0xKSkpCisgICAgeworICAgICAgLyogRklYTUU6IHdvdWxkIGxpa2UgdG8gaW5jbHVkZSBmaWVsZHZhbCBpbiB0aGUgbWVzc2FnZSwgYnV0CisJIHdlIGRvbid0IGhhdmUgYSBzcHJpbnRmX2xvbmdlc3QuICAqLworICAgICAgd2FybmluZyAoIlZhbHVlIGRvZXMgbm90IGZpdCBpbiAlZCBiaXRzLiIsIGJpdHNpemUpOworCisgICAgICAvKiBUcnVuY2F0ZSBpdCwgb3RoZXJ3aXNlIGFkam9pbmluZyBmaWVsZHMgbWF5IGJlIGNvcnJ1cHRlZC4gICovCisgICAgICBmaWVsZHZhbCA9IGZpZWxkdmFsICYgKCgxIDw8IGJpdHNpemUpIC0gMSk7CisgICAgfQorCisgIG93b3JkID0gZXh0cmFjdF9zaWduZWRfaW50ZWdlciAoYWRkciwgc2l6ZW9mIG93b3JkKTsKKworICAvKiBTaGlmdGluZyBmb3IgYml0IGZpZWxkIGRlcGVuZHMgb24gZW5kaWFubmVzcyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuICAqLworICBpZiAoQklUU19CSUdfRU5ESUFOKQorICAgIGJpdHBvcyA9IHNpemVvZiAob3dvcmQpICogOCAtIGJpdHBvcyAtIGJpdHNpemU7CisKKyAgLyogTWFzayBvdXQgb2xkIHZhbHVlLCB3aGlsZSBhdm9pZGluZyBzaGlmdHMgPj0gc2l6ZSBvZiBvd29yZCAqLworICBpZiAoYml0c2l6ZSA8IDggKiAoaW50KSBzaXplb2YgKG93b3JkKSkKKyAgICBvd29yZCAmPSB+KCgoKChVTE9OR0VTVCkxKSA8PCBiaXRzaXplKSAtIDEpIDw8IGJpdHBvcyk7CisgIGVsc2UKKyAgICBvd29yZCAmPSB+KCh+KFVMT05HRVNUKTApIDw8IGJpdHBvcyk7CisgIG93b3JkIHw9IGZpZWxkdmFsIDw8IGJpdHBvczsKKworICBzdG9yZV9zaWduZWRfaW50ZWdlciAoYWRkciwgc2l6ZW9mIG93b3JkLCBvd29yZCk7Cit9CisMCisvKiBDb252ZXJ0IEMgbnVtYmVycyBpbnRvIG5ld2x5IGFsbG9jYXRlZCB2YWx1ZXMgKi8KKwordmFsdWVfcHRyCit2YWx1ZV9mcm9tX2xvbmdlc3QgKHR5cGUsIG51bSkKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIHJlZ2lzdGVyIExPTkdFU1QgbnVtOworeworICByZWdpc3RlciB2YWx1ZV9wdHIgdmFsID0gYWxsb2NhdGVfdmFsdWUgKHR5cGUpOworICByZWdpc3RlciBlbnVtIHR5cGVfY29kZSBjb2RlOworICByZWdpc3RlciBpbnQgbGVuOworIHJldHJ5OgorICBjb2RlID0gVFlQRV9DT0RFICh0eXBlKTsKKyAgbGVuID0gVFlQRV9MRU5HVEggKHR5cGUpOworCisgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgY2FzZSBUWVBFX0NPREVfVFlQRURFRjoKKyAgICAgIHR5cGUgPSBjaGVja190eXBlZGVmICh0eXBlKTsKKyAgICAgIGdvdG8gcmV0cnk7CisgICAgY2FzZSBUWVBFX0NPREVfSU5UOgorICAgIGNhc2UgVFlQRV9DT0RFX0NIQVI6CisgICAgY2FzZSBUWVBFX0NPREVfRU5VTToKKyAgICBjYXNlIFRZUEVfQ09ERV9CT09MOgorICAgIGNhc2UgVFlQRV9DT0RFX1JBTkdFOgorICAgICAgc3RvcmVfc2lnbmVkX2ludGVnZXIgKFZBTFVFX0NPTlRFTlRTX1JBVyAodmFsKSwgbGVuLCBudW0pOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIFRZUEVfQ09ERV9SRUY6CisgICAgY2FzZSBUWVBFX0NPREVfUFRSOgorICAgICAgLyogVGhpcyBhc3N1bWVzIHRoYXQgYWxsIHBvaW50ZXJzIG9mIGEgZ2l2ZW4gbGVuZ3RoCisJIGhhdmUgdGhlIHNhbWUgZm9ybS4gICovCisgICAgICBzdG9yZV9hZGRyZXNzIChWQUxVRV9DT05URU5UU19SQVcgKHZhbCksIGxlbiwgKENPUkVfQUREUikgbnVtKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yICgiVW5leHBlY3RlZCB0eXBlICglZCkgZW5jb3VudGVyZWQgZm9yIGludGVnZXIgY29uc3RhbnQuIiwgY29kZSk7CisgICAgfQorICByZXR1cm4gdmFsOworfQorCit2YWx1ZV9wdHIKK3ZhbHVlX2Zyb21fZG91YmxlICh0eXBlLCBudW0pCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBET1VCTEVTVCBudW07Cit7CisgIHJlZ2lzdGVyIHZhbHVlX3B0ciB2YWwgPSBhbGxvY2F0ZV92YWx1ZSAodHlwZSk7CisgIHN0cnVjdCB0eXBlICpiYXNlX3R5cGUgPSBjaGVja190eXBlZGVmICh0eXBlKTsKKyAgcmVnaXN0ZXIgZW51bSB0eXBlX2NvZGUgY29kZSA9IFRZUEVfQ09ERSAoYmFzZV90eXBlKTsKKyAgcmVnaXN0ZXIgaW50IGxlbiA9IFRZUEVfTEVOR1RIIChiYXNlX3R5cGUpOworCisgIGlmIChjb2RlID09IFRZUEVfQ09ERV9GTFQpCisgICAgeworICAgICAgc3RvcmVfZmxvYXRpbmcgKFZBTFVFX0NPTlRFTlRTX1JBVyAodmFsKSwgbGVuLCBudW0pOworICAgIH0KKyAgZWxzZQorICAgIGVycm9yICgiVW5leHBlY3RlZCB0eXBlIGVuY291bnRlcmVkIGZvciBmbG9hdGluZyBjb25zdGFudC4iKTsKKworICByZXR1cm4gdmFsOworfQorDAorLyogRGVhbCB3aXRoIHRoZSB2YWx1ZSB0aGF0IGlzICJhYm91dCB0byBiZSByZXR1cm5lZCIuICAqLworCisvKiBSZXR1cm4gdGhlIHZhbHVlIHRoYXQgYSBmdW5jdGlvbiByZXR1cm5pbmcgbm93CisgICB3b3VsZCBiZSByZXR1cm5pbmcgdG8gaXRzIGNhbGxlciwgYXNzdW1pbmcgaXRzIHR5cGUgaXMgVkFMVFlQRS4KKyAgIFJFVEJVRiBpcyB3aGVyZSB3ZSBsb29rIGZvciB3aGF0IG91Z2h0IHRvIGJlIHRoZSBjb250ZW50cworICAgb2YgdGhlIHJlZ2lzdGVycyAoaW4gcmF3IGZvcm0pLiAgVGhpcyBpcyBiZWNhdXNlIGl0IGlzIG9mdGVuCisgICBkZXNpcmFibGUgdG8gcmVzdG9yZSBvbGQgdmFsdWVzIHRvIHRob3NlIHJlZ2lzdGVycworICAgYWZ0ZXIgc2F2aW5nIHRoZSBjb250ZW50cyBvZiBpbnRlcmVzdCwgYW5kIHRoZW4gY2FsbAorICAgdGhpcyBmdW5jdGlvbiB1c2luZyB0aGUgc2F2ZWQgdmFsdWVzLgorICAgc3RydWN0X3JldHVybiBpcyBub24temVybyB3aGVuIHRoZSBmdW5jdGlvbiBpbiBxdWVzdGlvbiBpcworICAgdXNpbmcgdGhlIHN0cnVjdHVyZSByZXR1cm4gY29udmVudGlvbnMgb24gdGhlIG1hY2hpbmUgaW4gcXVlc3Rpb247CisgICAwIHdoZW4gaXQgaXMgdXNpbmcgdGhlIHZhbHVlIHJldHVybmluZyBjb252ZW50aW9ucyAodGhpcyBvZnRlbgorICAgbWVhbnMgcmV0dXJuaW5nIHBvaW50ZXIgdG8gd2hlcmUgc3RydWN0dXJlIGlzIHZzLiByZXR1cm5pbmcgdmFsdWUpLiAqLworCit2YWx1ZV9wdHIKK3ZhbHVlX2JlaW5nX3JldHVybmVkICh2YWx0eXBlLCByZXRidWYsIHN0cnVjdF9yZXR1cm4pCisgICAgIHJlZ2lzdGVyIHN0cnVjdCB0eXBlICp2YWx0eXBlOworICAgICBjaGFyIHJldGJ1ZltSRUdJU1RFUl9CWVRFU107CisgICAgIGludCBzdHJ1Y3RfcmV0dXJuOworICAgICAvKkFSR1NVU0VEKi8KK3sKKyAgcmVnaXN0ZXIgdmFsdWVfcHRyIHZhbDsKKyAgQ09SRV9BRERSIGFkZHI7CisKKyNpZiBkZWZpbmVkIChFWFRSQUNUX1NUUlVDVF9WQUxVRV9BRERSRVNTKQorICAvKiBJZiB0aGlzIGlzIG5vdCBkZWZpbmVkLCBqdXN0IHVzZSBFWFRSQUNUX1JFVFVSTl9WQUxVRSBpbnN0ZWFkLiAgKi8KKyAgaWYgKHN0cnVjdF9yZXR1cm4pIHsKKyAgICBhZGRyID0gRVhUUkFDVF9TVFJVQ1RfVkFMVUVfQUREUkVTUyAocmV0YnVmKTsKKyAgICBpZiAoIWFkZHIpCisgICAgICBlcnJvciAoIkZ1bmN0aW9uIHJldHVybiB2YWx1ZSB1bmtub3duIik7CisgICAgcmV0dXJuIHZhbHVlX2F0ICh2YWx0eXBlLCBhZGRyLCBOVUxMKTsKKyAgfQorI2VuZGlmCisKKyAgdmFsID0gYWxsb2NhdGVfdmFsdWUgKHZhbHR5cGUpOworICBDSEVDS19UWVBFREVGICh2YWx0eXBlKTsKKyAgRVhUUkFDVF9SRVRVUk5fVkFMVUUgKHZhbHR5cGUsIHJldGJ1ZiwgVkFMVUVfQ09OVEVOVFNfUkFXICh2YWwpKTsKKworICByZXR1cm4gdmFsOworfQorCisvKiBTaG91bGQgd2UgdXNlIEVYVFJBQ1RfU1RSVUNUX1ZBTFVFX0FERFJFU1MgaW5zdGVhZCBvZgorICAgRVhUUkFDVF9SRVRVUk5fVkFMVUU/ICBHQ0NfUCBpcyB0cnVlIGlmIGNvbXBpbGVkIHdpdGggZ2NjCisgICBhbmQgVFlQRSBpcyB0aGUgdHlwZSAod2hpY2ggaXMga25vd24gdG8gYmUgc3RydWN0LCB1bmlvbiBvciBhcnJheSkuCisKKyAgIE9uIG1vc3QgbWFjaGluZXMsIHRoZSBzdHJ1Y3QgY29udmVudGlvbiBpcyB1c2VkIHVubGVzcyB3ZSBhcmUKKyAgIHVzaW5nIGdjYyBhbmQgdGhlIHR5cGUgaXMgb2YgYSBzcGVjaWFsIHNpemUuICAqLworLyogQXMgb2YgYWJvdXQgMzEgTWFyIDkzLCBHQ0Mgd2FzIGNoYW5nZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZQorICAgbmF0aXZlIGNvbXBpbGVyLiAgR0NDIDIuMy4zIHdhcyB0aGUgbGFzdCByZWxlYXNlIHRoYXQgZGlkIGl0IHRoZQorICAgb2xkIHdheS4gIFNpbmNlIGdjYzJfY29tcGlsZWQgd2FzIG5vdCBjaGFuZ2VkLCB3ZSBoYXZlIG5vCisgICB3YXkgdG8gY29ycmVjdGx5IHdpbiBpbiBhbGwgY2FzZXMsIHNvIHdlIGp1c3QgZG8gdGhlIHJpZ2h0IHRoaW5nCisgICBmb3IgZ2NjMSBhbmQgZm9yIGdjYzIgYWZ0ZXIgdGhpcyBjaGFuZ2UuICBUaHVzIGl0IGxvc2VzIGZvciBnY2MKKyAgIDIuMC0yLjMuMy4gIFRoaXMgaXMgc29tZXdoYXQgdW5mb3J0dW5hdGUsIGJ1dCBjaGFuZ2luZyBnY2MyX2NvbXBpbGVkCisgICB3b3VsZCBjYXVzZSBtb3JlIGNoYW9zIHRoYW4gZGVhbGluZyB3aXRoIHNvbWUgc3RydWN0IHJldHVybnMgYmVpbmcKKyAgIGhhbmRsZWQgd3JvbmcuICAqLworCitpbnQKK2dlbmVyaWNfdXNlX3N0cnVjdF9jb252ZW50aW9uIChnY2NfcCwgdmFsdWVfdHlwZSkKKyAgICAgaW50IGdjY19wOworICAgICBzdHJ1Y3QgdHlwZSAqdmFsdWVfdHlwZTsKK3sgICAgIAorICByZXR1cm4gISgoZ2NjX3AgPT0gMSkKKwkgICAgJiYgKFRZUEVfTEVOR1RIICh2YWx1ZV90eXBlKSA9PSAxCisJCXx8IFRZUEVfTEVOR1RIICh2YWx1ZV90eXBlKSA9PSAyCisJCXx8IFRZUEVfTEVOR1RIICh2YWx1ZV90eXBlKSA9PSA0CisJCXx8IFRZUEVfTEVOR1RIICh2YWx1ZV90eXBlKSA9PSA4KSk7Cit9CisKKyNpZm5kZWYgVVNFX1NUUlVDVF9DT05WRU5USU9OCisjZGVmaW5lIFVTRV9TVFJVQ1RfQ09OVkVOVElPTihnY2NfcCx0eXBlKSBnZW5lcmljX3VzZV9zdHJ1Y3RfY29udmVudGlvbiAoZ2NjX3AsIHR5cGUpCisjZW5kaWYKKworLyogU29tZSBmdW5kYW1lbnRhbCB0eXBlcyAoc3VjaCBhcyBsb25nIGRvdWJsZSkgYXJlIHJldHVybmVkIG9uIHRoZSBzdGFjayBmb3IKKyAgIGNlcnRhaW4gYXJjaGl0ZWN0dXJlcy4gIFRoaXMgbWFjcm8gc2hvdWxkIHJldHVybiB0cnVlIGZvciBhbnkgdHlwZSBiZXNpZGVzCisgICBzdHJ1Y3QsIHVuaW9uIG9yIGFycmF5IHRoYXQgZ2V0cyByZXR1cm5lZCBvbiB0aGUgc3RhY2suICAqLworCisjaWZuZGVmIFJFVFVSTl9WQUxVRV9PTl9TVEFDSworI2RlZmluZSBSRVRVUk5fVkFMVUVfT05fU1RBQ0soVFlQRSkgMAorI2VuZGlmCisKKy8qIFJldHVybiB0cnVlIGlmIHRoZSBmdW5jdGlvbiBzcGVjaWZpZWQgaXMgdXNpbmcgdGhlIHN0cnVjdHVyZSByZXR1cm5pbmcKKyAgIGNvbnZlbnRpb24gb24gdGhpcyBtYWNoaW5lIHRvIHJldHVybiBhcmd1bWVudHMsIG9yIDAgaWYgaXQgaXMgdXNpbmcKKyAgIHRoZSB2YWx1ZSByZXR1cm5pbmcgY29udmVudGlvbi4gIEZVTkNUSU9OIGlzIHRoZSB2YWx1ZSByZXByZXNlbnRpbmcKKyAgIHRoZSBmdW5jdGlvbiwgRlVOQ0FERFIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uLCBhbmQgVkFMVUVfVFlQRQorICAgaXMgdGhlIHR5cGUgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLiAgR0NDX1AgaXMgbm9uemVybyBpZiBjb21waWxlZAorICAgd2l0aCBHQ0MuICAqLworCitpbnQKK3VzaW5nX3N0cnVjdF9yZXR1cm4gKGZ1bmN0aW9uLCBmdW5jYWRkciwgdmFsdWVfdHlwZSwgZ2NjX3ApCisgICAgIHZhbHVlX3B0ciBmdW5jdGlvbjsKKyAgICAgQ09SRV9BRERSIGZ1bmNhZGRyOworICAgICBzdHJ1Y3QgdHlwZSAqdmFsdWVfdHlwZTsKKyAgICAgaW50IGdjY19wOworICAgICAvKkFSR1NVU0VEKi8KK3sKKyAgcmVnaXN0ZXIgZW51bSB0eXBlX2NvZGUgY29kZSA9IFRZUEVfQ09ERSAodmFsdWVfdHlwZSk7CisKKyAgaWYgKGNvZGUgPT0gVFlQRV9DT0RFX0VSUk9SKQorICAgIGVycm9yICgiRnVuY3Rpb24gcmV0dXJuIHR5cGUgdW5rbm93bi4iKTsKKworICBpZiAoY29kZSA9PSBUWVBFX0NPREVfU1RSVUNUCisgICAgICB8fCBjb2RlID09IFRZUEVfQ09ERV9VTklPTgorICAgICAgfHwgY29kZSA9PSBUWVBFX0NPREVfQVJSQVkKKyAgICAgIHx8IFJFVFVSTl9WQUxVRV9PTl9TVEFDSyAodmFsdWVfdHlwZSkpCisgICAgcmV0dXJuIFVTRV9TVFJVQ1RfQ09OVkVOVElPTiAoZ2NjX3AsIHZhbHVlX3R5cGUpOworCisgIHJldHVybiAwOworfQorCisvKiBTdG9yZSBWQUwgc28gaXQgd2lsbCBiZSByZXR1cm5lZCBpZiBhIGZ1bmN0aW9uIHJldHVybnMgbm93LgorICAgRG9lcyBub3QgdmVyaWZ5IHRoYXQgVkFMJ3MgdHlwZSBtYXRjaGVzIHdoYXQgdGhlIGN1cnJlbnQKKyAgIGZ1bmN0aW9uIHdhbnRzIHRvIHJldHVybi4gICovCisKK3ZvaWQKK3NldF9yZXR1cm5fdmFsdWUgKHZhbCkKKyAgICAgdmFsdWVfcHRyIHZhbDsKK3sKKyAgc3RydWN0IHR5cGUgKnR5cGUgPSBjaGVja190eXBlZGVmIChWQUxVRV9UWVBFICh2YWwpKTsKKyAgcmVnaXN0ZXIgZW51bSB0eXBlX2NvZGUgY29kZSA9IFRZUEVfQ09ERSAodHlwZSk7CisKKyAgaWYgKGNvZGUgPT0gVFlQRV9DT0RFX0VSUk9SKQorICAgIGVycm9yICgiRnVuY3Rpb24gcmV0dXJuIHR5cGUgdW5rbm93bi4iKTsKKworICBpZiAoICAgY29kZSA9PSBUWVBFX0NPREVfU1RSVUNUCisgICAgICB8fCBjb2RlID09IFRZUEVfQ09ERV9VTklPTikJLyogRklYTUUsIGltcGxlbWVudCBzdHJ1Y3QgcmV0dXJuLiAgKi8KKyAgICBlcnJvciAoIkdEQiBkb2VzIG5vdCBzdXBwb3J0IHNwZWNpZnlpbmcgYSBzdHJ1Y3Qgb3IgdW5pb24gcmV0dXJuIHZhbHVlLiIpOworCisgIFNUT1JFX1JFVFVSTl9WQUxVRSAodHlwZSwgVkFMVUVfQ09OVEVOVFMgKHZhbCkpOworfQorDAordm9pZAorX2luaXRpYWxpemVfdmFsdWVzICgpCit7CisgIGFkZF9jbWQgKCJjb252ZW5pZW5jZSIsIG5vX2NsYXNzLCBzaG93X2NvbnZlbmllbmNlLAorCSAgICAiRGVidWdnZXIgY29udmVuaWVuY2UgKFwiJGZvb1wiKSB2YXJpYWJsZXMuXG5cCitUaGVzZSB2YXJpYWJsZXMgYXJlIGNyZWF0ZWQgd2hlbiB5b3UgYXNzaWduIHRoZW0gdmFsdWVzO1xuXAordGh1cywgXCJwcmludCAkZm9vPTFcIiBnaXZlcyBcIiRmb29cIiB0aGUgdmFsdWUgMS4gIFZhbHVlcyBtYXkgYmUgYW55IHR5cGUuXG5cblwKK0EgZmV3IGNvbnZlbmllbmNlIHZhcmlhYmxlcyBhcmUgZ2l2ZW4gdmFsdWVzIGF1dG9tYXRpY2FsbHk6XG5cCitcIiRfXCJob2xkcyB0aGUgbGFzdCBhZGRyZXNzIGV4YW1pbmVkIHdpdGggXCJ4XCIgb3IgXCJpbmZvIGxpbmVzXCIsXG5cCitcIiRfX1wiIGhvbGRzIHRoZSBjb250ZW50cyBvZiB0aGUgbGFzdCBhZGRyZXNzIGV4YW1pbmVkIHdpdGggXCJ4XCIuIiwKKwkgICAmc2hvd2xpc3QpOworCisgIGFkZF9jbWQgKCJ2YWx1ZXMiLCBub19jbGFzcywgc2hvd192YWx1ZXMsCisJICAgIkVsZW1lbnRzIG9mIHZhbHVlIGhpc3RvcnkgYXJvdW5kIGl0ZW0gbnVtYmVyIElEWCAob3IgbGFzdCB0ZW4pLiIsCisJICAgJnNob3dsaXN0KTsKK30KZGlmZiAtLWdpdCBhL2dkYi92YXgtdGRlcC5jIGIvZ2RiL3ZheC10ZGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3ODU3MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi92YXgtdGRlcC5jCkBAIC0wLDAgKzEsMjYzIEBACisvKiBQcmludCBWQVggaW5zdHJ1Y3Rpb25zIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk4NiwgMTk4OSwgMTk5MSwgMTk5MiwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgIm9wY29kZS92YXguaCIKKworLyogVmF4IGluc3RydWN0aW9ucyBhcmUgbmV2ZXIgbG9uZ2VyIHRoYW4gdGhpcy4gICovCisjZGVmaW5lIE1BWExFTiA2MgorCisvKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCisjZGVmaW5lIE5PUENPREVTIChzaXplb2Ygdm90c3RycyAvIHNpemVvZiB2b3RzdHJzWzBdKQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcHJpbnRfaW5zbl9hcmcgKCk7CisMCisvKiBQcmludCB0aGUgdmF4IGluc3RydWN0aW9uIGF0IGFkZHJlc3MgTUVNQUREUiBpbiBkZWJ1Z2dlZCBtZW1vcnksCisgICBmcm9tIGRpc2Fzc2VtYmxlciBpbmZvIElORk8uCisgICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLiAgKi8KKworc3RhdGljIGludAordmF4X3ByaW50X2luc24gKG1lbWFkZHIsIGluZm8pCisgICAgIENPUkVfQUREUiBtZW1hZGRyOworICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcltNQVhMRU5dOworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcDsKKyAgcmVnaXN0ZXIgY2hhciAqZDsKKworICBpbnQgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCBNQVhMRU4sIGluZm8pOworICBpZiAoc3RhdHVzICE9IDApCisgICAgeworICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBOT1BDT0RFUzsgaSsrKQorICAgIGlmICh2b3RzdHJzW2ldLmRldGFpbC5jb2RlID09IGJ1ZmZlclswXQorCXx8IHZvdHN0cnNbaV0uZGV0YWlsLmNvZGUgPT0gKih1bnNpZ25lZCBzaG9ydCAqKWJ1ZmZlcikKKyAgICAgIGJyZWFrOworCisgIC8qIEhhbmRsZSB1bmRlZmluZWQgaW5zdHJ1Y3Rpb25zLiAgKi8KKyAgaWYgKGkgPT0gTk9QQ09ERVMpCisgICAgeworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIwJW8iLCBidWZmZXJbMF0pOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCB2b3RzdHJzW2ldLm5hbWUpOworCisgIC8qIFBvaW50IGF0IGZpcnN0IGJ5dGUgb2YgYXJndW1lbnQgZGF0YSwKKyAgICAgYW5kIGF0IGRlc2NyaXB0b3IgZm9yIGZpcnN0IGFyZ3VtZW50LiAgKi8KKyAgcCA9IGJ1ZmZlciArIDEgKyAodm90c3Ryc1tpXS5kZXRhaWwuY29kZSA+PSAweDEwMCk7CisgIGQgPSB2b3RzdHJzW2ldLmRldGFpbC5hcmdzOworCisgIGlmICgqZCkKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKKworICB3aGlsZSAoKmQpCisgICAgeworICAgICAgcCA9IHByaW50X2luc25fYXJnIChkLCBwLCBtZW1hZGRyICsgKHAgLSBidWZmZXIpLCBpbmZvKTsKKyAgICAgIGQgKz0gMjsKKyAgICAgIGlmICgqZCkKKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKKyAgICB9CisgIHJldHVybiBwIC0gYnVmZmVyOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqCitwcmludF9pbnNuX2FyZyAoZCwgcCwgYWRkciwgaW5mbykKKyAgICAgY2hhciAqZDsKKyAgICAgcmVnaXN0ZXIgY2hhciAqcDsKKyAgICAgQ09SRV9BRERSIGFkZHI7CisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIHJlZ2lzdGVyIGludCByZWdudW0gPSAqcCAmIDB4ZjsKKyAgZmxvYXQgZmxvYXRsaXRidWY7CisKKyAgaWYgKCpkID09ICdiJykKKyAgICB7CisgICAgICBpZiAoZFsxXSA9PSAnYicpCisJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwgYWRkciArICpwKysgKyAxKTsKKyAgICAgIGVsc2UKKwl7CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBhZGRyICsgKihzaG9ydCAqKXAgKyAyKTsKKwkgIHAgKz0gMjsKKwl9CisgICAgfQorICBlbHNlCisgICAgc3dpdGNoICgoKnArKyA+PiA0KSAmIDB4ZikKKyAgICAgIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgIGNhc2UgMToKKyAgICAgIGNhc2UgMjoKKyAgICAgIGNhc2UgMzoJCQkvKiBMaXRlcmFsIG1vZGUgKi8KKwlpZiAoZFsxXSA9PSAnZCcgfHwgZFsxXSA9PSAnZicgfHwgZFsxXSA9PSAnZycgfHwgZFsxXSA9PSAnaCcpCisJICB7CisJICAgICooaW50ICopJmZsb2F0bGl0YnVmID0gMHg0MDAwICsgKChwWy0xXSAmIDB4M2YpIDw8IDQpOworCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlZiIsIGZsb2F0bGl0YnVmKTsKKwkgIH0KKwllbHNlCisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlZCIsIHBbLTFdICYgMHgzZik7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgNDoJCQkvKiBJbmRleGVkICovCisJcCA9IChjaGFyICopIHByaW50X2luc25fYXJnIChkLCBwLCBhZGRyICsgMSwgaW5mbyk7CisJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJbJXNdIiwgUkVHSVNURVJfTkFNRSAocmVnbnVtKSk7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgNToJCQkvKiBSZWdpc3RlciAqLworCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBSRUdJU1RFUl9OQU1FIChyZWdudW0pKTsKKwlicmVhazsKKworICAgICAgY2FzZSA3OgkJCS8qIEF1dG9kZWNyZW1lbnQgKi8KKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0iKTsKKyAgICAgIGNhc2UgNjoJCQkvKiBSZWdpc3RlciBkZWZlcnJlZCAqLworCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCVzKSIsIFJFR0lTVEVSX05BTUUgKHJlZ251bSkpOworCWJyZWFrOworCisgICAgICBjYXNlIDk6CQkJLyogQXV0b2luY3JlbWVudCBkZWZlcnJlZCAqLworCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCIpOworCWlmIChyZWdudW0gPT0gUENfUkVHTlVNKQorCSAgeworCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMiKTsKKwkgICAgaW5mby0+dGFyZ2V0ID0gKihsb25nICopcDsKKwkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChpbmZvLT50YXJnZXQsIGluZm8pOworCSAgICBwICs9IDQ7CisJICAgIGJyZWFrOworCSAgfQorICAgICAgY2FzZSA4OgkJCS8qIEF1dG9pbmNyZW1lbnQgKi8KKwlpZiAocmVnbnVtID09IFBDX1JFR05VTSkKKwkgIHsKKwkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjIik7CisJICAgIHN3aXRjaCAoZFsxXSkKKwkgICAgICB7CisJICAgICAgY2FzZSAnYic6CisJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCAqcCsrKTsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICd3JzoKKwkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsICooc2hvcnQgKilwKTsKKwkJcCArPSAyOworCQlicmVhazsKKworCSAgICAgIGNhc2UgJ2wnOgorCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgKihsb25nICopcCk7CisJCXAgKz0gNDsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICdxJzoKKwkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4JTA4eCIsCisJCQkJICAgICAgICgobG9uZyAqKXApWzFdLCAoKGxvbmcgKilwKVswXSk7CisJCXAgKz0gODsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICdvJzoKKwkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4JTA4eCUwOHglMDh4IiwKKwkJCQkgICAgICAgKChsb25nICopcClbM10sICgobG9uZyAqKXApWzJdLAorCQkJCSAgICAgICAoKGxvbmcgKilwKVsxXSwgKChsb25nICopcClbMF0pOworCQlwICs9IDE2OworCQlicmVhazsKKworCSAgICAgIGNhc2UgJ2YnOgorCQlpZiAoSU5WQUxJRF9GTE9BVCAocCwgNCkpCisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sCisJCQkJCSAiPDxpbnZhbGlkIGZsb2F0IDB4JXg+PiIsCisJCQkJCSAqKGludCAqKSBwKTsKKwkJZWxzZQorCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWYiLCAqKGZsb2F0ICopIHApOworCQlwICs9IDQ7CisJCWJyZWFrOworCisJICAgICAgY2FzZSAnZCc6CisJCWlmIChJTlZBTElEX0ZMT0FUIChwLCA4KSkKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwKKwkJCQkJICI8PGludmFsaWQgZmxvYXQgMHgleCUwOHg+PiIsCisJCQkJCSAoKGxvbmcgKilwKVsxXSwgKChsb25nICopcClbMF0pOworCQllbHNlCisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZiIsICooZG91YmxlICopIHApOworCQlwICs9IDg7CisJCWJyZWFrOworCisJICAgICAgY2FzZSAnZyc6CisJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZy1mbG9hdCIpOworCQlwICs9IDg7CisJCWJyZWFrOworCisJICAgICAgY2FzZSAnaCc6CisJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiaC1mbG9hdCIpOworCQlwICs9IDE2OworCQlicmVhazsKKworCSAgICAgIH0KKwkgIH0KKwllbHNlCisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiglcykrIiwgUkVHSVNURVJfTkFNRSAocmVnbnVtKSk7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgMTE6CQkJLyogQnl0ZSBkaXNwbGFjZW1lbnQgZGVmZXJyZWQgKi8KKwkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAiKTsKKyAgICAgIGNhc2UgMTA6CQkJLyogQnl0ZSBkaXNwbGFjZW1lbnQgKi8KKwlpZiAocmVnbnVtID09IFBDX1JFR05VTSkKKwkgIHsKKwkgICAgaW5mby0+dGFyZ2V0ID0gYWRkciArICpwICsgMjsKKwkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChpbmZvLT50YXJnZXQsIGluZm8pOworCSAgfQorCWVsc2UKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQoJXMpIiwgKnAsIFJFR0lTVEVSX05BTUUgKHJlZ251bSkpOworCXAgKz0gMTsKKwlicmVhazsKKworICAgICAgY2FzZSAxMzoJCQkvKiBXb3JkIGRpc3BsYWNlbWVudCBkZWZlcnJlZCAqLworCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCIpOworICAgICAgY2FzZSAxMjoJCQkvKiBXb3JkIGRpc3BsYWNlbWVudCAqLworCWlmIChyZWdudW0gPT0gUENfUkVHTlVNKQorCSAgeworCSAgICBpbmZvLT50YXJnZXQgPSBhZGRyICsgKihzaG9ydCAqKXAgKyAzOworCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7CisJICB9CisJZWxzZQorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCglcykiLAorCQkJCSAqKHNob3J0ICopcCwgUkVHSVNURVJfTkFNRSAocmVnbnVtKSk7CisJcCArPSAyOworCWJyZWFrOworCisgICAgICBjYXNlIDE1OgkJCS8qIExvbmcgZGlzcGxhY2VtZW50IGRlZmVycmVkICovCisJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJAIik7CisgICAgICBjYXNlIDE0OgkJCS8qIExvbmcgZGlzcGxhY2VtZW50ICovCisJaWYgKHJlZ251bSA9PSBQQ19SRUdOVU0pCisJICB7CisJICAgIGluZm8tPnRhcmdldCA9IGFkZHIgKyAqKHNob3J0ICopcCArIDU7CisJICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoaW5mby0+dGFyZ2V0LCBpbmZvKTsKKwkgIH0KKwllbHNlCisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkKCVzKSIsCisJCQkJICoobG9uZyAqKXAsIFJFR0lTVEVSX05BTUUgKHJlZ251bSkpOworCXAgKz0gNDsKKyAgICAgIH0KKworICByZXR1cm4gKHVuc2lnbmVkIGNoYXIgKikgcDsKK30KKwordm9pZAorX2luaXRpYWxpemVfdmF4X3RkZXAgKCkKK3sKKyAgdG1fcHJpbnRfaW5zbiA9IHZheF9wcmludF9pbnNuOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3Z4LXNoYXJlL1JFQURNRSBiL2dkYi92eC1zaGFyZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI0YjY2OAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi92eC1zaGFyZS9SRUFETUUKQEAgLTAsMCArMSw3IEBACitUaGUgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIHNoYXJlZCB3aXRoIFdpbmQgUml2ZXIgU3lzdGVtcycgVnhXb3JrcworZGVidWcgc3R1Yi4gIFRoaXMgc3R1YiBydW5zIGluIHRoZSByZWFsdGltZSBzeXN0ZW0sIGFzIGEgcHJvY2VzcywgYW5kCit3YWl0cyBmb3IgbmV0IGNvbm5lY3Rpb25zIGZyb20gR0RCJ3MgYW5kIERCWCdzIGFuZCBzdWNoLgorCitEbyBub3QgY2hhbmdlIHRoZXNlIGZpbGVzIHdpdGhvdXQgY29vcmRpbmF0aW5nIHdpdGggV2luZCBSaXZlciBTeXN0ZW1zCitpbiBBbGFtZWRhLCBDYWxpZm9ybmlhLiAgVGFsayB0byBwb3N0bWFzdGVyQHdycy5jb20gdG8gZmluZCBvdXQgd2hvIAorY3VycmVudGx5IG1haW50YWlucyBHREIgZm9yIHRoZW0uCmRpZmYgLS1naXQgYS9nZGIvdngtc2hhcmUvZGJnUnBjTGliLmggYi9nZGIvdngtc2hhcmUvZGJnUnBjTGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1OGU1NQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi92eC1zaGFyZS9kYmdScGNMaWIuaApAQCAtMCwwICsxLDMyIEBACisvKiAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgICBUaGlzIGNvZGUgd2FzIGRvbmF0ZWQgYnkgV2luZCBSaXZlciBTeXN0ZW1zLCBJbmMuCisKKyAgIGRiZ1JwY0xpYi5oIC0gaGVhZGVyIGZpbGUgZm9yIHJlbW90ZSBkZWJ1Z2dpbmcgdmlhIHJwYyAqLworCisvKgorbW9kaWZpY2F0aW9uIGhpc3RvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCiswMWIsMDRvY3Q5MCxtYWYgIGFkZGVkIFZYX0JPT1RfRklMRV9JTlEuCiswMWEsMDVqdW45MCxsbGsgIGV4dHJhY3RlZCBmcm9tIHhkcl9kYnguaC4KKyovCisKKyNpZm5kZWYgSU5DZGJ4UnBjTGliaAorI2RlZmluZSBJTkNkYnhScGNMaWJoCTEKKworI2RlZmluZSBQUk9DRVNTX1NUQVJUCQk1MAorI2RlZmluZSBQUk9DRVNTX1dBSVQJCTUxCisjZGVmaW5lIFZYX1NUQVRFX0lOUQkJNjAKKyNkZWZpbmUgVlhfTE9BRAkJCTYxCisjZGVmaW5lIFZYX1NZTUJPTF9JTlEJCTYyCisjZGVmaW5lIFZYX0JSRUFLX0FERAkJNjMKKyNkZWZpbmUgVlhfQlJFQUtfREVMRVRFCQk2NAorI2RlZmluZSBWWF9GUF9JTlFVSVJFCQk2NQorI2RlZmluZSBWWF9UQVNLX1NVU1BFTkQJCTY2CisjZGVmaW5lIFZYX0NBTExfRlVOQwkJNjcKKyNkZWZpbmUgVlhfQ09OVl9GUk9NXzY4ODgxCTY4CisjZGVmaW5lIFZYX0NPTlZfVE9fNjg4ODEJNjkKKyNkZWZpbmUgVlhfQk9PVF9GSUxFX0lOUQk3MAorI2RlZmluZQlWWF9TT1VSQ0VfU1RFUAkJNzEKKworI2VuZGlmIElOQ2RieFJwY0xpYmgKZGlmZiAtLWdpdCBhL2dkYi92eC1zaGFyZS9wdHJhY2UuaCBiL2dkYi92eC1zaGFyZS9wdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTM1NTRmCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Z4LXNoYXJlL3B0cmFjZS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCUAoIylwdHJhY2UuaCAxLjEgODYvMDcvMDcgU01JCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODUgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICovCisKKy8qCittb2RpZmljYXRpb24gaGlzdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAxYSwwNWp1bjkwLGxsayAgYm9ycm93ZWQuCisqLworCisjaWZuZGVmIF9QVFJBQ0VfCisjZGVmaW5lIF9QVFJBQ0VfCisKKy8qCisgKiBSZXF1ZXN0IHZhbHVlcyBmb3IgdGhlIHB0cmFjZSBzeXN0ZW0gY2FsbAorICovCitlbnVtIHB0cmFjZXJlcSB7CisJUFRSQUNFX1RSQUNFTUUgPSAwLAkJLyogMCwgYnkgdHJhY2VlIHRvIGJlZ2luIHRyYWNpbmcgKi8KKwlQVFJBQ0VfQ0hJTERET05FID0gMCwJCS8qIDAsIHRyYWNlZSBpcyBkb25lIHdpdGggaGlzIGhhbGYgKi8KKwlQVFJBQ0VfUEVFS1RFWFQsCQkvKiAxLCByZWFkIHdvcmQgZnJvbSB0ZXh0IHNlZ21lbnQgKi8KKwlQVFJBQ0VfUEVFS0RBVEEsCQkvKiAyLCByZWFkIHdvcmQgZnJvbSBkYXRhIHNlZ21lbnQgKi8KKwlQVFJBQ0VfUEVFS1VTRVIsCQkvKiAzLCByZWFkIHdvcmQgZnJvbSB1c2VyIHN0cnVjdCAqLworCVBUUkFDRV9QT0tFVEVYVCwJCS8qIDQsIHdyaXRlIHdvcmQgaW50byB0ZXh0IHNlZ21lbnQgKi8KKwlQVFJBQ0VfUE9LRURBVEEsCQkvKiA1LCB3cml0ZSB3b3JkIGludG8gZGF0YSBzZWdtZW50ICovCisJUFRSQUNFX1BPS0VVU0VSLAkJLyogNiwgd3JpdGUgd29yZCBpbnRvIHVzZXIgc3RydWN0ICovCisJUFRSQUNFX0NPTlQsCQkJLyogNywgY29udGludWUgcHJvY2VzcyAqLworCVBUUkFDRV9LSUxMLAkJCS8qIDgsIHRlcm1pbmF0ZSBwcm9jZXNzICovCisJUFRSQUNFX1NJTkdMRVNURVAsCQkvKiA5LCBzaW5nbGUgc3RlcCBwcm9jZXNzICovCisJUFRSQUNFX0FUVEFDSCwJCQkvKiAxMCwgYXR0YWNoIHRvIGFuIGV4aXN0aW5nIHByb2Nlc3MgKi8KKwlQVFJBQ0VfREVUQUNILAkJCS8qIDExLCBkZXRhY2ggZnJvbSBhIHByb2Nlc3MgKi8KKwlQVFJBQ0VfR0VUUkVHUywJCQkvKiAxMiwgZ2V0IGFsbCByZWdpc3RlcnMgKi8KKwlQVFJBQ0VfU0VUUkVHUywJCQkvKiAxMywgc2V0IGFsbCByZWdpc3RlcnMgKi8KKwlQVFJBQ0VfR0VURlBSRUdTLAkJLyogMTQsIGdldCBhbGwgZmxvYXRpbmcgcG9pbnQgcmVncyAqLworCVBUUkFDRV9TRVRGUFJFR1MsCQkvKiAxNSwgc2V0IGFsbCBmbG9hdGluZyBwb2ludCByZWdzICovCisJUFRSQUNFX1JFQUREQVRBLAkJLyogMTYsIHJlYWQgZGF0YSBzZWdtZW50ICovCisJUFRSQUNFX1dSSVRFREFUQSwJCS8qIDE3LCB3cml0ZSBkYXRhIHNlZ21lbnQgKi8KKwlQVFJBQ0VfUkVBRFRFWFQsCQkvKiAxOCwgcmVhZCB0ZXh0IHNlZ21lbnQgKi8KKwlQVFJBQ0VfV1JJVEVURVhULAkJLyogMTksIHdyaXRlIHRleHQgc2VnbWVudCAqLworCVBUUkFDRV9HRVRGUEFSRUdTLAkJLyogMjAsIGdldCBhbGwgZnBhIHJlZ3MgKi8KKwlQVFJBQ0VfU0VURlBBUkVHUwkJLyogMjEsIHNldCBhbGwgZnBhIHJlZ3MgKi8KK307CisjZW5kaWYgIV9QVFJBQ0UKZGlmZiAtLWdpdCBhL2dkYi92eC1zaGFyZS9yZWdQYWNrZXQuaCBiL2dkYi92eC1zaGFyZS9yZWdQYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTYwYzg0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Z4LXNoYXJlL3JlZ1BhY2tldC5oCkBAIC0wLDAgKzEsMTYwIEBACisvKiAgcmVnUGFja2V0LmggLSByZWdpc3RlciBwYWNrZXQgZGVmaW5pdGlvbnMgZm9yIHJkYiAqLworCisvKiBDb3B5cmlnaHQgMTk5Mi0xOTkzIFdpbmQgUml2ZXIgU3lzdGVtcywgSW5jLiAqLworCisvKgorbW9kaWZpY2F0aW9uIGhpc3RvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCiswMWQsMzBub3Y5MyxwYWQgIEFkZGVkIEFtMjlLIHRhcmdldCBkZWZpbml0aW9ucy4KKzAxYywxNGp1bjkzLG1hZiAgYWRkaXRpb25hbCBkZWZpbml0aW9ucyBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3Nlcy4KKwkJIGZpeGVkIHJldmVyc2FsIG9mIE1JUFNfUl9MTyBhbmQgTUlQU19SX0hJLgorMDFiLDA4ZmViOTMsc2N5ICBhZGRlZCBTUEFSQyB0YXJnZXQgZGVmaW5pdGlvbnMuIGNoYW5nZWQgdG8gV1JTIGNvZGUgY29udmV0aW9uLgorMDFhLDIwZmViOTIsal93ICBjcmVhdGVkLgorKi8KKworI2lmbmRlZiBfX0lOQ3JlZ1BhY2tldGgKKyNkZWZpbmUgX19JTkNyZWdQYWNrZXRoCisKKworLyogTUM2OEsgKi8KKworI2RlZmluZSBNQzY4S19HUkVHX1NJWkUJCTB4MDQJLyogc2l6ZSBvZiBnZW5lcmFsLXB1cnBvc2UgcmVnICovCisjZGVmaW5lIE1DNjhLX0dSRUdfUExFTgkJMHg0OAkvKiBzaXplIG9mIGdlbmVyYWwtcHVycG9zZSByZWcgYmxvY2sgKi8KKworLyogb2Zmc2V0cyBpbnRvIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlciBibG9jayAqLworCisjZGVmaW5lIE1DNjhLX1JfRDAJCTB4MDAJLyogZDA7IGQxIC0gZDcgZm9sbG93IGluIHNlcXVlbmNlICovCisjZGVmaW5lIE1DNjhLX1JfQTAJCTB4MjAJLyogYTA7IGExIC0gYTcgZm9sbG93IGluIHNlcXVlbmNlICovCisjZGVmaW5lIE1DNjhLX1JfU1IJCTB4NDAJLyogc3IgKHJlcHJlc2VudGVkIGFzIGEgNC1ieXRlIHZhbCkgKi8KKyNkZWZpbmUgTUM2OEtfUl9QQwkJMHg0NAkvKiBwYyAqLworCisjZGVmaW5lIE1DNjhLX0ZQUkVHX1NJWkUJMHgwYwkvKiBzaXplIG9mIGZsb2F0aW5nLXBvaW50IGRhdGEgcmVnICovCisjZGVmaW5lIE1DNjhLX0ZQUkVHX1BMRU4gIAkweDZjCS8qIHNpemUgb2YgZmxvYXRpbmctcG9pbnQgcmVnIGJsb2NrICovCisKKy8qIG9mZnNldHMgaW50byBmbG9hdGluZy1wb2ludCByZWdpc3RlciBibG9jayAqLworCisjZGVmaW5lIE1DNjhLX1JfRlAwCQkweDAwCS8qIGZwMDsgZnAxIC0gZnA3IGZvbGxvdyBpbiBzZXF1ZW5jZSAqLworI2RlZmluZSBNQzY4S19SX0ZQQ1IJCTB4NjAJLyogZnBjciAqLworI2RlZmluZSBNQzY4S19SX0ZQU1IJCTB4NjQJLyogZnBzciAqLworI2RlZmluZSBNQzY4S19SX0ZQSUFSCQkweDY4CS8qIGZwaWFyICovCisKKworLyogSTk2MCAqLworCisjZGVmaW5lIEk5NjBfR1JFR19TSVpFCQkweDA0CS8qIHNpemUgb2YgZ2VuZXJhbC1wdXJwb3NlIHJlZyAqLworI2RlZmluZSBJOTYwX0dSRUdfUExFTgkJMHg4YwkvKiBzaXplIG9mIGdlbmVyYWwtcHVycG9zZSByZWcgYmxvY2sgKi8KKworLyogb2Zmc2V0cyBpbnRvIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlciBibG9jayAqLworCisjZGVmaW5lIEk5NjBfUl9SMAkJMHgwMAkvKiByMDsgcjEgLSByMTUgZm9sbG93IGluIHNlcXVlbmNlICovCisjZGVmaW5lIEk5NjBfUl9HMAkJMHg0MAkvKiBnMDsgZzEgLSBnMTUgZm9sbG93IGluIHNlcXVlbmNlICovCisjZGVmaW5lIEk5NjBfUl9QQ1cJCTB4ODAJLyogcGN3ICovCisjZGVmaW5lIEk5NjBfUl9BQ1cJCTB4ODQJLyogYWN3ICovCisjZGVmaW5lIEk5NjBfUl9UQ1cJCTB4ODgJLyogdGN3ICovCisKKyNkZWZpbmUgSTk2MF9GUFJFR19TSVpFCQkweDEwCS8qIHNpemUgb2YgZmxvYXRpbmctcG9pbnQgcmVnICovCisjZGVmaW5lIEk5NjBfRlBSRUdfUExFTgkJMHgyOAkvKiBzaXplIG9mIGZsb2F0aW5nLXBvaW50IHJlZyBibG9jayAqLworCisvKiBvZmZzZXRzICBpbnRvIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIGJsb2NrICovCisKKyNkZWZpbmUgSTk2MF9SX0ZQMAkJMHgwMAkvKiBmcDA7IGZwMSAtIGZwMyBmb2xsb3cgaW4gc2VxdWVuY2UgKi8KKworCisvKiBTUEFSQyAqLworCisjZGVmaW5lIFNQQVJDX0dSRUdfU0laRSAJMHgwNAkvKiBzaXplIG9mIGdlbmVyYWwtcHVycG9zZSByZWcgKi8KKyNkZWZpbmUgU1BBUkNfR1JFR19QTEVOIAkweDk4CS8qIHNpemUgb2YgZ2VuZXJhbC1wdXJwb3NlIHJlZyBibG9jayAqLworCisvKiBvZmZzZXRzIGludG8gZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyIGJsb2NrICovCisKKyNkZWZpbmUgU1BBUkNfUl9HMAkJMHgwMAkvKiBnMDsgZzEgLSBnNyBmb2xsb3cgaW4gc2VxdWVuY2UgKi8KKyNkZWZpbmUgU1BBUkNfUl9PMAkJMHgyMAkvKiBvMDsgbzEgLSBvNyBmb2xsb3cgaW4gc2VxdWVuY2UgKi8KKyNkZWZpbmUgU1BBUkNfUl9MMAkJMHg0MAkvKiBsMDsgbDEgLSBsNyBmb2xsb3cgaW4gc2VxdWVuY2UgKi8KKyNkZWZpbmUgU1BBUkNfUl9JMAkJMHg2MAkvKiBpMDsgaTEgLSBpNyBmb2xsb3cgaW4gc2VxdWVuY2UgKi8KKyNkZWZpbmUgU1BBUkNfUl9ZCQkweDgwCS8qIHkgKi8KKyNkZWZpbmUgU1BBUkNfUl9QU1IJCTB4ODQJLyogcHNyICovCisjZGVmaW5lIFNQQVJDX1JfV0lNCQkweDg4CS8qIHdpbSAqLworI2RlZmluZSBTUEFSQ19SX1RCUgkJMHg4YwkvKiB0YnIgKi8KKyNkZWZpbmUgU1BBUkNfUl9QQwkJMHg5MAkvKiBwYyAqLworI2RlZmluZSBTUEFSQ19SX05QQwkJMHg5NAkvKiBucGMgKi8KKworI2RlZmluZSBTUEFSQ19GUFJFR19TSVpFIAkweDA0CS8qIHNpemUgb2YgZmxvYXRpbmctcG9pbnQgcmVnICovCisjZGVmaW5lIFNQQVJDX0ZQUkVHX1BMRU4gCTB4ODQJLyogc2l6ZSBvZiBmbG9hdGluZy1wb2ludCByZWcgYmxvY2sgKi8KKworLyogb2Zmc2V0cyBpbnRvIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIGJsb2NrICovCisKKyNkZWZpbmUgU1BBUkNfUl9GUDAJCTB4MDAJLyogZjA7IGYxIC0gZjMxIGZvbGxvdyBpbiBzZXF1ZW5jZSAqLworI2RlZmluZSBTUEFSQ19SX0ZTUgkJMHg4MAkvKiBmc3IgKi8KKworCisvKiBNSVBTICovCisKKyNkZWZpbmUgTUlQU19HUkVHX1NJWkUJCTB4MDQJLyogc2l6ZSBvZiBnZW5lcmFsLXB1cnBvc2UgcmVnICovCisjZGVmaW5lIE1JUFNfR1JFR19QTEVOCQkweDkwCS8qIHNpemUgb2YgZ2VuZXJhbC1wdXJwb3NlIHJlZyBibG9jayAqLworCisvKiBvZmZzZXRzIGludG8gZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyIGJsb2NrICovCisKKyNkZWZpbmUgTUlQU19SX0dQMAkJMHgwMAkvKiBncDAgKHplcm8pICovCisjZGVmaW5lIE1JUFNfUl9BVAkJMHgwNAkvKiBhdCAqLworI2RlZmluZSBNSVBTX1JfVjAJCTB4MDgJLyogdjAgKi8KKyNkZWZpbmUgTUlQU19SX1YxCQkweDBjCS8qIHYxICovCisjZGVmaW5lIE1JUFNfUl9BMAkJMHgxMAkvKiBhMCAqLworI2RlZmluZSBNSVBTX1JfQTEJCTB4MTQJLyogYTEgKi8KKyNkZWZpbmUgTUlQU19SX0EyCQkweDE4CS8qIGEyICovCisjZGVmaW5lIE1JUFNfUl9BMwkJMHgxYwkvKiBhMyAqLworI2RlZmluZSBNSVBTX1JfVDAJCTB4MjAJLyogdDAgKi8KKyNkZWZpbmUgTUlQU19SX1QxCQkweDI0CS8qIHQxICovCisjZGVmaW5lIE1JUFNfUl9UMgkJMHgyOAkvKiB0MiAqLworI2RlZmluZSBNSVBTX1JfVDMJCTB4MmMJLyogdDMgKi8KKyNkZWZpbmUgTUlQU19SX1Q0CQkweDMwCS8qIHQ0ICovCisjZGVmaW5lIE1JUFNfUl9UNQkJMHgzNAkvKiB0NSAqLworI2RlZmluZSBNSVBTX1JfVDYJCTB4MzgJLyogdDYgKi8KKyNkZWZpbmUgTUlQU19SX1Q3CQkweDNjCS8qIHQ3ICovCisjZGVmaW5lIE1JUFNfUl9TMAkJMHg0MAkvKiBzMCAqLworI2RlZmluZSBNSVBTX1JfUzEJCTB4NDQJLyogczEgKi8KKyNkZWZpbmUgTUlQU19SX1MyCQkweDQ4CS8qIHMyICovCisjZGVmaW5lIE1JUFNfUl9TMwkJMHg0YwkvKiBzMyAqLworI2RlZmluZSBNSVBTX1JfUzQJCTB4NTAJLyogczQgKi8KKyNkZWZpbmUgTUlQU19SX1M1CQkweDU0CS8qIHM1ICovCisjZGVmaW5lIE1JUFNfUl9TNgkJMHg1OAkvKiBzNiAqLworI2RlZmluZSBNSVBTX1JfUzcJCTB4NWMJLyogczcgKi8KKyNkZWZpbmUgTUlQU19SX1Q4CQkweDYwCS8qIHQ4ICovCisjZGVmaW5lIE1JUFNfUl9UOQkJMHg2NAkvKiB0OSAqLworI2RlZmluZSBNSVBTX1JfSzAJCTB4NjgJLyogazAgKi8KKyNkZWZpbmUgTUlQU19SX0sxCQkweDZjCS8qIGsxICovCisjZGVmaW5lIE1JUFNfUl9HUAkJMHg3MAkvKiBncCAqLworI2RlZmluZSBNSVBTX1JfU1AJCTB4NzQJLyogc3AgKi8KKyNkZWZpbmUgTUlQU19SX1M4CQkweDc4CS8qIHM4ICovCisjZGVmaW5lIE1JUFNfUl9MTwkJMHg4MAkvKiBsbyAqLworI2RlZmluZSBNSVBTX1JfSEkJCTB4ODQJLyogaGkgKi8KKyNkZWZpbmUgTUlQU19SX1NSCQkweDg4CS8qIHNyICovCisjZGVmaW5lIE1JUFNfUl9QQwkJMHg4YwkvKiBwYyAqLworCQorI2RlZmluZSBNSVBTX0ZQUkVHX1NJWkUJCTB4MDQJLyogc2l6ZSBvZiBmbG9hdGluZy1wb2ludCBkYXRhIHJlZyAqLworI2RlZmluZSBNSVBTX0ZQUkVHX1BMRU4JCTB4ODQJLyogc2l6ZSBvZiBmbG9hdGluZy1wb2ludCByZWcgYmxvY2sgKi8KKworLyogb2Zmc2V0cyBpbnRvIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIGJsb2NrICovCisKKyNkZWZpbmUgTUlQU19SX0ZQMAkJMHgwMAkvKiBmMDsgZjEgLSBmMzEgZm9sbG93IGluIHNlcXVlbmNlICovCisjZGVmaW5lIE1JUFNfUl9GUENTUgkJMHg4MCAJLyogb2Zmc2V0IG9mIGZwY3NyIGluIHJlZyBibG9jayAqLworCisKKy8qIEdlbmVyYWwgcmVnaXN0ZXJzIGZvciB0aGUgQW0yOWsgKi8KKworI2RlZmluZSBBTTI5S19HUkVHX1NJWkUgICAgICAgICAweDA0CisjZGVmaW5lIEFNMjlLX0dSRUdfUExFTiAgICAgICAgIDB4MmQ0CisKKyNkZWZpbmUgQU0yOUtfUl9HUjk2ICAgICAgICAgICAgMHgwCisjZGVmaW5lIEFNMjlLX1JfVkFCICAgICAgICAgICAgIDB4MjgwCisjZGVmaW5lIEFNMjlLX1JfSU5URSAgICAgICAgICAgIDB4MmJjCisjZGVmaW5lIEFNMjlLX1JfUlNQICAgICAgICAgICAgIDB4MmMwCisKKy8qIEZsb2F0aW5nIFBvaW50IHJlZ2lzdGVycyBmb3IgdGhlIEFtMjlrICovCisKKyNkZWZpbmUgQU0yOUtfRlBSRUdfU0laRSAgICAgICAgMHgwNAorI2RlZmluZSBBTTI5S19GUFJFR19QTEVOICAgICAgICAweDgKKworI2RlZmluZSBBTTI5S19SX0ZQRSAgICAgICAgICAgICAweDAKKyNkZWZpbmUgQU0yOUtfUl9GUFMgICAgICAgICAgICAgMHg0CisKKyNlbmRpZiAvKiBfX0lOQ3JlZ1BhY2tldGggKi8KZGlmZiAtLWdpdCBhL2dkYi92eC1zaGFyZS92eFR5cGVzLmggYi9nZGIvdngtc2hhcmUvdnhUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2Yjg0MTkKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdngtc2hhcmUvdnhUeXBlcy5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIHZ4VHlwZXMuaCAtIFZ4V29ya3MgdHlwZSBkZWZpbml0aW9uIGhlYWRlciAqLworCisvKiAgQ29weXJpZ2h0IDE5ODQsIDE5ODUsIDE5ODYsIDE5ODcsIDE5ODgsIDE5ODksIDE5OTAsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgICBUaGlzIGNvZGUgd2FzIGRvbmF0ZWQgYnkgV2luZCBSaXZlciBTeXN0ZW1zLCBJbmMuICovCisKKy8qCittb2RpZmljYXRpb24gaGlzdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAxYywwNW9jdDkwLHNobCAgYWRkZWQgY29weXJpZ2h0IG5vdGljZS4KKyAgICAgICAgICAgICAgICAgbWFkZSAjZW5kaWYgQU5TSSBzdHlsZS4KKzAxYiwxMGF1ZzkwLGRudyAgYWRkZWQgVk9JREZVTkNQVFIKKzAxYSwyOW1heTkwLGRlbCAgd3JpdHRlbi4KKyovCisKKyNpZm5kZWYgSU5DdnhUeXBlc2gKKyNkZWZpbmUgSU5DdnhUeXBlc2gKKworLyogVGhlIGZvbGxvd2luZyBzdHVmZiBtdXN0IE5PVCBiZSBpbmNsdWRlZCBpZiB0aGlzIGluY2x1ZGUgZmlsZSBpcyB1c2VkCisgKiBmcm9tIGFzc2VtYmx5IGxhbmd1YWdlLiAgSnVzdCAjZGVmaW5lIEFTTUxBTkdVQUdFIGJlZm9yZSB0aGUgaW5jbHVkZSwKKyAqIHRvIGdldCByaWQgb2YgaXQuCisgKi8KKworI2lmbmRlZiBBU01MQU5HVUFHRQorCisvKiB2eFdvcmtzIHR5cGVzICovCisKK3R5cGVkZWYJY2hhcgkJSU5UODsKK3R5cGVkZWYJc2hvcnQJCUlOVDE2OwordHlwZWRlZglpbnQJCUlOVDMyOworCit0eXBlZGVmCXVuc2lnbmVkIGNoYXIJVUlOVDg7Cit0eXBlZGVmCXVuc2lnbmVkIHNob3J0CVVJTlQxNjsKK3R5cGVkZWYJdW5zaWduZWQgaW50CVVJTlQzMjsKKwordHlwZWRlZgl1bnNpZ25lZCBjaGFyCVVDSEFSOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlVU0hPUlQ7Cit0eXBlZGVmCXVuc2lnbmVkIGludAlVSU5UOwordHlwZWRlZiB1bnNpZ25lZCBsb25nCVVMT05HOworCit0eXBlZGVmCWludAkJQk9PTDsKK3R5cGVkZWYJaW50CQlWT0lEOwordHlwZWRlZglpbnQJCVNUQVRVUzsJCit0eXBlZGVmIGludCAJCUFSR0lOVDsKKwordHlwZWRlZiBpbnQgCQkoKkZVTkNQVFIpICgpOwkgICAgLyogcHRyIHRvIGZ1bmN0aW9uIHJldHVybmluZyBpbnQgKi8KK3R5cGVkZWYgVk9JRCAJCSgqVk9JREZVTkNQVFIpICgpOyAgLyogcHRyIHRvIGZ1bmN0aW9uIHJldHVybmluZyBWT0lEICovCisKKworLyogaGlzdG9yaWNhbCBkZWZpbml0aW9ucyAtIG5vdyBvYnNvbGV0ZSAqLworCit0eXBlZGVmIGNoYXIJCVRJTlk7CQkvKiBvYnNvbGV0ZSAqLwordHlwZWRlZiBjaGFyCQlUQk9PTDsJCS8qIG9ic29sZXRlICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJVVRJTlk7CQkvKiBvYnNvbGV0ZSAqLworCisKKy8qIGFyY2hpdGVjdHVyZSBkZXBlbmRlbnQgdHlwZWRlZnMgKi8KKworI2lmZGVmCUNQVV9GQU1JTFkKKworI2lmCUNQVV9GQU1JTFk9PU1DNjgwWDAKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgSU5TVFI7CQkvKiB3b3JkLWFsaWduZWQgaW5zdHJ1Y3Rpb25zICovCisjZW5kaWYJLyogQ1BVX0ZBTUlMWT09TUM2ODBYMCAqLworCisjaWYJQ1BVX0ZBTUlMWT09U1BBUkMKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBJTlNUUjsJCS8qIDMyIGJpdCB3b3JkLWFsaWduZWQgaW5zdHJ1Y3Rpb25zICovCisjZW5kaWYJLyogQ1BVX0ZBTUlMWT09U1BBUkMgKi8KKworI2VuZGlmCQorCisjZW5kaWYJLyogQVNNTEFOR1VBR0UgKi8KKyNlbmRpZgkvKiBJTkN2eFR5cGVzaCAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3Z4LXNoYXJlL3Z4V29ya3MuaCBiL2dkYi92eC1zaGFyZS92eFdvcmtzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU5ODgzNwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi92eC1zaGFyZS92eFdvcmtzLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qIHZ4V29ya3MuaCAtIFZ4V29ya3Mgc3RhbmRhcmQgZGVmaW5pdGlvbnMgaGVhZGVyICovCisKKy8qICBDb3B5cmlnaHQgMTk4NCwgMTk4NSwgMTk4NiwgMTk4NywgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgIFRoaXMgY29kZSB3YXMgZG9uYXRlZCBieSBXaW5kIFJpdmVyIFN5c3RlbXMsIEluYy4gKi8KKworLyoKK21vZGlmaWNhdGlvbiBoaXN0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLQorMDF6LDA1b2N0OTAsc2hsICBhZGRlZCBjb3B5cmlnaHQgbm90aWNlLgorICAgICAgICAgICAgICAgICBtYWRlICNlbmRpZiBBTlNJIHN0eWxlLgorMDF5LDI4c2VwOTAsZGVsICBhZGRlZCBJOTYwIGRlZmluZXMuCiswMXgsMjltYXk5MCxkZWwJIG1vdmVkIHR5cGVzIHRvIHZ4VHlwZXMuaAorMDF3LDA5YXByOTAsamNmICBhZGRlZCB0aW1lb3V0IGRlZmluaXRpb25zLgorMDF2LDI0amFuOTAsZ2FlICBtb3ZlZCBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gZmxhZ3MgaGVyZSBmcm9tIG1ha2VmaWxlJ3MuCiswMXUsMDFzZXA4OCxtY2wgIGRlZmluaXRpb24gb2YgSU5TVFIgZGVwZW5kZW50IG9uIHByb2Nlc3NvciBmYW1pbHk7IGFkZGVkIFNQQVJDLgorCSAgICtnYWUgIGFkZGVkIE1DNjgwWDAgYW5kIGRlZmluZWQgQ1BVX0ZBTUlMWS4KKzAxdCwwOGFwcjg5LGRudyAgYWRkZWQgaWZkZWYgdG8gcHJldmVudCBpbmNsdXNpb24gb2YgdnhXb3Jrcy5oIG1vcmUgdGhhbiBvbmNlLgorMDFzLDIyanVuODgsZG53CSBtb3ZlZCBSRUFELCBXUklURSwgYW5kIFVQREFURSBiYWNrIGhlcmUgZnJvbSBpb0xpYi5oLgorMDFyLDIyYXByODgsZ2FlICBvb3BzISBmb3Jnb3Qgc29tZSAjZW5kaWYncyBpbiAwMXEuCiswMXEsMTJhcHI4OCxnYWUgIHJlbW92ZWQgUVVJQ0sgJiBXQUlUOyBhZGRlZCBTVERfe0lOLE9VVCxFUlJ9LgorCQkgZml4ZWQgI2RlZmluZSdzIG9mIEZBTFNFLCBUUlVFLCBldGMuCisJCSBtb3ZlZCBSRUFELCBXUklURSwgYW5kIFVQREFURSB0byBpb0xpYi5oLgorMDFwLDA0ZGVjODcsZG53ICBhZGRlZCB1bmRlZmluZSBvZiBNQzY4MDAwIHRvIGdldCBhcm91bmQgR3JlZW4gSGlsbHMgYnVnIHRoYXQKKwkJICAgcHJlLWRlZmluZXMgTUM2ODAwMC4KKzAxbywxMm5vdjg3LGVjcyAgYWRkZWQgdHlwZSBVTE9ORy4KKzAxbiwwOGZlYjg2LGRudyAgYWRkZWQgdHlwZXMgSU5TVFIsIFVJTlQsIFVTSE9SVC4KKzAxbSwxNG9jdDg1LHJkYyAgYWRkZWQgQlVTIHR5cGVzLgorMDFsLDE2anVsODUsamxmICBhZGRlZCBjb25kaXRpb25hbCBmb3IgTlVMTCBhbmQgRU9GLgorMDFrLDI0anVuODUscmRjICBpbnN0YWxsZWQgY29uZHRpb25hbCBjb21waWxlIHNvIHdlIGNhbiBpbmNsdWRlIGluCisJCSBhc3NlbWJseSBsYW5ndWFnZSBmaWxlcy4gIFNlZSBpbnN0cnVjdGlvbnMgYmVsb3cuCisJCSBBZGRlZCBTeXN0ZW0gdHlwZSBtYWNybyBhbmQgQ1BVIHR5cGUgbWFjcm8uCiswMWosMTNqdW44NSxkbncgIGNsZWFuZWQtdXAsIHJlbW92ZWQgbW9yZSBvYnNvbGV0ZSBzdHVmZiB0byB3cnMuaAorMDFpLDExc2VwODQsamxmICBjaGFuZ2VkIG5hbWUgZnJvbSB3cnMuaCB0byB2eFdvcmtzLmguICByZW1vdmVkIEdMT0JBTC4KKzAxaCwwM2p1bjg0LGRudyAgcmVtb3ZlZCBJR05PUkUgZGVjbGFyYXRpb24uCiswMWcsMDlhcHI4NCxqbGYgIGFkZGVkIE1FTUJFUl9TSVpFIG1hY3JvLgorMDFmLDE0ZGVjODMsZG53ICBhZGRlZCBNU0IsIExTQiBtYWNyb3MKKzAxZSwxN25vdjgzLGpsZiAgYWRkZWQgU1RBVFVTIHR5cGUsIGZvciByb3V0aW5lcyB3aGljaCByZXR1cm4gYSBzdGF0dXMuCiswMWQsMTNqdWw4MyxkbncgIGFkZGVkIE5FTEVNRU5UUyBtYWNybworMDFjLDE0TWF5ODMsZG53ICBhZGRlZCBPRkZTRVQgbWFjcm8KKzAxYiwxN0ZlYjgzLGRudyAgYWRkZWQgc3R1ZmYgZnJvbSBXaGl0ZXNtaXRocyBzdGQuaAorMDFhLDE1RmViODMsZG53ICB3cml0dGVuCisqLworCisjaWZuZGVmIElOQ3Z4V29ya3NoCisjZGVmaW5lIElOQ3Z4V29ya3NoCisKKyNpZgkhZGVmaW5lZChFT0YpIHx8IChFT0YhPSgtMSkpCisjZGVmaW5lIEVPRgkJKC0xKQorI2VuZGlmCQorCisjaWYJIWRlZmluZWQoRkFMU0UpIHx8IChGQUxTRSE9MCkKKyNkZWZpbmUgRkFMU0UJCTAKKyNlbmRpZgkKKworI2lmCSFkZWZpbmVkKFRSVUUpIHx8IChUUlVFIT0xKQorI2RlZmluZSBUUlVFCQkxCisjZW5kaWYJCisKKworI2RlZmluZSBOT05FCQkoLTEpCS8qIGZvciB0aW1lcyB3aGVuIE5VTEwgd29uJ3QgZG8gKi8KKyNkZWZpbmUgRU9TCQknXDAnCS8qIEMgc3RyaW5nIHRlcm1pbmF0b3IgKi8KKworCisvKiByZXR1cm4gc3RhdHVzIHZhbHVlcyAqLworCisjZGVmaW5lIE9LCQkwCisjZGVmaW5lIEVSUk9SCQkoLTEpCisKKy8qIHRpbWVvdXQgZGVmaW5lcyAqLworCisjZGVmaW5lIE5PX1dBSVQJCTAKKyNkZWZpbmUgV0FJVF9GT1JFVkVSCSgtMSkKKworLyogbG93LWxldmVsIEkvTyBpbnB1dCwgb3V0cHV0LCBlcnJvciBmZCdzICovCisKKyNkZWZpbmUJU1REX0lOCTAKKyNkZWZpbmUJU1REX09VVAkxCisjZGVmaW5lCVNURF9FUlIJMgorCisvKiBtb2RlcyAtIG11c3QgbWF0Y2ggT19SRE9OTFkvT19XUk9OTFkvT19SRFdSIGluIGlvTGliLmghICovCisKKyNkZWZpbmUgUkVBRAkJMAorI2RlZmluZSBXUklURQkJMQorI2RlZmluZSBVUERBVEUJCTIKKworLyogU1lTVEVNIHR5cGVzICovCisKKyNkZWZpbmUgVjcJCTEJLyogQVRUIHZlcnNpb24gNyAqLworI2RlZmluZSBTWVNfVgkJMgkvKiBBVFQgU3lzdGVtIDUgKi8KKyNkZWZpbmUgQlNEXzRfMgkJMwkvKiBCZXJrZWxleSBCU0QgNC4yICovCisKKy8qIENQVSB0eXBlcyAqLworCisvKiBUaGUgR3JlZW4gSGlsbHMgY29tcGlsZXIgcHJlLWRlZmluZXMgIk1DNjgwMDAiISEgKi8KKyNpZmRlZiBNQzY4MDAwCisjdW5kZWYgTUM2ODAwMAorI2VuZGlmCQorCisjZGVmaW5lIE1DNjgwMDAJCTEKKyNkZWZpbmUgTUM2ODAxMAkJMgorI2RlZmluZSBNQzY4MDIwCQkzCisjZGVmaW5lIE1DNjgwMzAJCTQKKyNkZWZpbmUgTUM2ODA0MAkJNQorI2RlZmluZSBNQzY4MFgwCQk5CisKKyNkZWZpbmUgU1BBUkMJCTEwCisKKyNpZm5kZWYgSTk2MAorI2RlZmluZQlJOTYwCQkyMAorI2VuZGlmCQorCisjZGVmaW5lCUk5NjBLQgkJMjEKKyNkZWZpbmUJSTk2MENBCQkyMgorCisjaWYJQ1BVPT1NQzY4MDAwIHx8IENQVT09TUM2ODAxMCB8fCBDUFU9PU1DNjgwMjAgfHwgQ1BVPT1NQzY4MDMwCisjZGVmaW5lCUNQVV9GQU1JTFkJTUM2ODBYMAorI2VuZGlmCS8qIENQVT09TUM2ODAwMCB8fCBDUFU9PU1DNjgwMTAgfHwgQ1BVPT1NQzY4MDIwIHx8IENQVT09TUM2ODAzMCAqLworCisjaWYJQ1BVPT1TUEFSQworI2RlZmluZQlDUFVfRkFNSUxZCVNQQVJDCisjZW5kaWYJLyogQ1BVPT1TUEFSQyAqLworCisjaWYgCUNQVT09STk2MEtCCisjZGVmaW5lCUNQVV9GQU1JTFkJSTk2MAorI2VuZGlmCS8qIAlDUFU9PUk5NjBLQiAqLworCisjaWYgCUNQVT09STk2MENBCisjZGVmaW5lCUNQVV9GQU1JTFkJSTk2MAorI2VuZGlmCS8qIAlDUFU9PUk5NjBDQSAqLworCisvKiBCVVMgdHlwZXMgKi8KKworI2RlZmluZSBWTUVfQlVTCQkxCisjZGVmaW5lIE1VTFRJX0JVUwkyCisKKy8qIG5ldHdvcmsgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCisKKyNkZWZpbmUJSU5FVAkJLyogaW5jbHVkZSBpbnRlcm5ldCBwcm90b2NvbHMgKi8KKyNkZWZpbmUJQlNECTQzCS8qIEJTRCA0LjMgLWxpa2UgT1MgKi8KKyNkZWZpbmUJQlNEREVCVUcJLyogdHVybiBvbiBkZWJ1ZyAqLworI2RlZmluZQlHQVRFV0FZCQkvKiB0YWJsZXMgdG8gYmUgaW5pdGlhbGl6ZWQgZm9yIGdhdGV3YXkgcm91dGluZyAqLworCisvKiBjb21tb24gbWFjcm9zICovCisKKyNkZWZpbmUgTVNCKHgpCSgoKHgpID4+IDgpICYgMHhmZikJLyogbW9zdCBzaWduaWYgYnl0ZSBvZiAyLWJ5dGUgaW50ZWdlciAqLworI2RlZmluZSBMU0IoeCkJKCh4KSAmIDB4ZmYpCQkvKiBsZWFzdCBzaWduaWYgYnl0ZSBvZiAyLWJ5dGUgaW50ZWdlciovCisKKyNkZWZpbmUgT0ZGU0VUKHN0cnVjdHVyZSwgbWVtYmVyKQkvKiBieXRlIG9mZnNldCBvZiBtZW1iZXIgaW4gc3RydWN0dXJlKi9cCisJCSgoaW50KSAmKCgoc3RydWN0dXJlICopIDApIC0+IG1lbWJlcikpCisKKyNkZWZpbmUgTUVNQkVSX1NJWkUoc3RydWN0dXJlLCBtZW1iZXIpCS8qIHNpemUgb2YgYSBtZW1iZXIgb2YgYSBzdHJ1Y3R1cmUgKi9cCisJCShzaXplb2YgKCgoc3RydWN0dXJlICopIDApIC0+IG1lbWJlcikpCisKKyNkZWZpbmUgTkVMRU1FTlRTKGFycmF5KQkJLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFuIGFycmF5ICovIFwKKwkJKHNpemVvZiAoYXJyYXkpIC8gc2l6ZW9mICgoYXJyYXkpIFswXSkpCisKKyNkZWZpbmUgRk9SRVZFUglmb3IgKDs7KQorCisvKiBzdG9yYWdlIGNsYXNzIHNwZWNpZmllciBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIEZBU1QJcmVnaXN0ZXIKKyNkZWZpbmUgSU1QT1JUCWV4dGVybgorI2RlZmluZSBMT0NBTAlzdGF0aWMKKworCisvKiBpbmNsdWRlIHR5cGVkZWZzIC0gbXVzdCBjb21lIGFmdGVyIENQVV9GQU1JTFkgZGVmaW5pdGlvbnMgYWJvdmUgKi8KKworI2luY2x1ZGUgInZ4VHlwZXMuaCIKKworI2VuZGlmCS8qIElOQ3Z4V29ya3NoICovCmRpZmYgLS1naXQgYS9nZGIvdngtc2hhcmUvd2FpdC5oIGIvZ2RiL3Z4LXNoYXJlL3dhaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjhkMWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Z4LXNoYXJlL3dhaXQuaApAQCAtMCwwICsxLDQ2IEBACisvKiB3YWl0LmggLSBoZWFkZXIgZmlsZSBmb3IgcmVtb3RlIHdhaXQgY2FsbCAqLworCisvKiAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgICBUaGlzIGNvZGUgd2FzIGRvbmF0ZWQgYnkgV2luZCBSaXZlciBTeXN0ZW1zLCBJbmMuICovCisKKy8qCittb2RpZmljYXRpb24gaGlzdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAxYSwwNWp1bjkwLGxsayAgYm9ycm93ZWQuCisqLworCisvKiBEZWZpbmUgaG93IHRvIGFjY2VzcyB0aGUgc3RydWN0dXJlIHRoYXQgdGhlIHdhaXQgc3lzdGVtIGNhbGwgc3RvcmVzLgorICAgT24gbWFueSBzeXN0ZW1zLCB0aGVyZSBpcyBhIHN0cnVjdHVyZSBkZWZpbmVkIGZvciB0aGlzLgorICAgQnV0IG9uIHZhbmlsbGEtaXNoIFVTRyBzeXN0ZW1zIHRoZXJlIGlzIG5vdC4gICovCisKKyNpZm5kZWYgSEFWRV9XQUlUX1NUUlVDVAorI2RlZmluZSBXQUlUVFlQRSBpbnQKKyNkZWZpbmUgV0lGU1RPUFBFRCh3KSAoKCh3KSYwMzc3KSA9PSAwMTc3KQorI2RlZmluZSBXSUZTSUdOQUxFRCh3KSAoKCh3KSYwMzc3KSAhPSAwMTc3ICYmICgodykmfjAzNzcpID09IDApCisjZGVmaW5lIFdJRkVYSVRFRCh3KSAoKCh3KSYwMzc3KSA9PSAwKQorI2RlZmluZSBXUkVUQ09ERSh3KSAoKHcpID4+IDgpCisjZGVmaW5lIFdTVE9QU0lHKHcpICgodykgPj4gOCkKKyNkZWZpbmUgV0NPUkVEVU1QKHcpICgoKHcpJjAyMDApICE9IDApCisjZGVmaW5lIFdURVJNU0lHKHcpICgodykgJiAwMTc3KQorI2RlZmluZSBXU0VURVhJVCh3LCBzdGF0dXMpICgodykgPSAoc3RhdHVzKSkKKyNkZWZpbmUgV1NFVFNUT1AodyxzaWcpICAoKHcpID0gKDAxNzcgfCAoKHNpZykgPDwgOCkpKQorI2Vsc2UKKyNpZiBGQUxTRQorI2lmbmRlZiBPUklHCisKKy8qIGRvbid0IGluY2x1ZGUgc3lzL3dhaXQuaCAqLworCisjZWxzZSBPUklHCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNlbmRpZiBPUklHCisjZW5kaWYgRkFMU0UKKyNkZWZpbmUgV0FJVFRZUEUgdW5pb24gd2FpdAorI2RlZmluZSBXUkVUQ09ERSh3KSAodykud19yZXRjb2RlCisjZGVmaW5lIFdTVE9QU0lHKHcpICh3KS53X3N0b3BzaWcKKyNkZWZpbmUgV0NPUkVEVU1QKHcpICh3KS53X2NvcmVkdW1wCisjZGVmaW5lIFdURVJNU0lHKHcpICh3KS53X3Rlcm1zaWcKKyNkZWZpbmUgV1NFVEVYSVQodywgc3RhdHVzKSAoKHcpLndfc3RhdHVzID0gKHN0YXR1cykpCisjZGVmaW5lIFdTRVRTVE9QKHcsc2lnKSAgXAorICAoKHcpLndfc3RvcHNpZyA9IChzaWcpLCAodykud19jb3JlZHVtcCA9IDAsICh3KS53X3Rlcm1zaWcgPSAwMTc3KQorI2VuZGlmCmRpZmYgLS1naXQgYS9nZGIvdngtc2hhcmUveGRyX2xkLmMgYi9nZGIvdngtc2hhcmUveGRyX2xkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY3OGMzNQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi92eC1zaGFyZS94ZHJfbGQuYwpAQCAtMCwwICsxLDg0IEBACisvKiB4ZHJfbGQuYyAgLSB4ZHIgcm91dGluZXMgZm9yIHJlbW90ZSBkYnggaW50ZXJmYWNlIHRvIFZ4V29ya3MgICovCisKKy8qICBDb3B5cmlnaHQgMTk4NCwgMTk4NSwgMTk4NiwgMTk4NywgMTk4OCwgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgIFRoaXMgY29kZSB3YXMgZG9uYXRlZCBieSBXaW5kIFJpdmVyIFN5c3RlbXMsIEluYy4gKi8KKworLyoKK21vZGlmaWNhdGlvbiBoaXN0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLQorMDFhLDA1anVuOTAsbGxrICBleHRyYWN0ZWQgZnJvbSB4ZHJfZGJ4LmMuCisqLworCisvKgorREVTQ1JJUFRJT04KK1RoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBlWHRlcm5hbCBEYXRhIFJlcHJlc2VudGF0aW9uIChYRFIpIHJvdXRpbmVzCitmb3Igb2JqZWN0IGZpbGVzIHRoYXQgYXJlIGRvd25sb2FkZWQgdG8gVnhXb3Jrcy4gIFRoZXkgYXJlIHVzZWQgYnkKK3JlbW90ZSBkZWJ1Z2dlcnMgdGhhdCB1c2UgUlBDIChzdWNoIGFzIGRieFdvcmtzIGFuZCB2eEdkYikuCisqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgInZ4V29ya3MuaCIKKyNpbmNsdWRlICJycGMvcnBjLmgiCisjaW5jbHVkZSAieGRyX2xkLmgiCisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCisKK2Jvb2xfdCB4ZHJfU3RyaW5nKCk7ICAgCS8qIHhkciByb3V0aW5lIGZvciBhcmd1bWVudCBsaXN0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogeGRyX1N0cmluZyAtIHhkciByb3V0aW5lIGZvciBzdHJpbmdzLgorKiAKKyogVXNlZCBieSB4ZHJfYXJnX2luZm8gdG8gaGFuZGxlIHRoZSBhY3R1YWwgYXJndW1lbnQKKyogc3RyaW5ncy4gIG5vcm1hbGx5IGNhbGxzIHhkcl9zdHJpbmcgLSBidXQgZG9lcyBzb21ldGhpbmcgCisqIHJlYXNvbmFibGUgZW5jb2RlIG9mIG51bGwgcG9pbnRlci4KKyovCisKK2Jvb2xfdCB4ZHJfU3RyaW5nICh4ZHJzLCBzdHJwKQorICAgIFhEUgkqeGRyczsKKyAgICBjaGFyICoqc3RycDsKKworICAgIHsKKyAgICBpZiAoKCpzdHJwID09IE5VTEwpICYgKHhkcnMtPnhfb3AgPT0gWERSX0VOQ09ERSkpIAorCXJldHVybihGQUxTRSk7CisgICAgZWxzZSAKKwlyZXR1cm4oeGRyX3N0cmluZyh4ZHJzLCBzdHJwLCBNQVhTVFJMRU4pKTsKKyAgICB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiB4ZHJfbGRmaWxlIC0geGRyIHJvdXRpbmUgZm9yIGEgc2luZ2xlIGVsZW1lbnQgaW4gdGhlIGxvYWQgdGFibGUgCisqLworCitib29sX3QgeGRyX2xkZmlsZSAoeGRycywgb2JqcCkKKyAgICBYRFIgKnhkcnM7CisgICAgbGRmaWxlICpvYmpwOworCisgICAgeworICAgIGlmICghIHhkcl9TdHJpbmcoeGRycywgJm9ianAtPm5hbWUpKSAKKwlyZXR1cm4oRkFMU0UpOworICAgIGlmICghIHhkcl9pbnQoeGRycywgJm9ianAtPnR4dF9hZGRyKSkgCisJcmV0dXJuKEZBTFNFKTsKKyAgICBpZiAoISB4ZHJfaW50KHhkcnMsICZvYmpwLT5kYXRhX2FkZHIpKSAKKwlyZXR1cm4oRkFMU0UpOworICAgIGlmICghIHhkcl9pbnQoeGRycywgJm9ianAtPmJzc19hZGRyKSkgCisJcmV0dXJuKEZBTFNFKTsKKworICAgIHJldHVybihUUlVFKTsKKyAgICB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiB4ZHJfbGR0YWJsIC0KKyoKKyogeGRyIHJvdXRpbmUgZm9yIGEgbGlzdCBvZiBmaWxlcyBhbmQgbG9hZCBhZGRyZXNzZXMgbG9hZGVkIGludG8gVnhXb3Jrcy4KKyovCisKK2Jvb2xfdCB4ZHJfbGR0YWJsICh4ZHJzLG9ianApCisgICAgWERSICp4ZHJzOworICAgIGxkdGFibCAqb2JqcDsKKworICAgIHsKKyAgICByZXR1cm4gKHhkcl9hcnJheSAoeGRycywgKGNoYXIgKiopICZvYmpwLT50YmxfZW50LCAoVUlOVCAqKSAmb2JqcC0+dGJsX3NpemUsIAorCSAgICBNQVhUQkxTWiwgc2l6ZW9mKGxkZmlsZSksIHhkcl9sZGZpbGUpKTsKKyAgICB9CmRpZmYgLS1naXQgYS9nZGIvdngtc2hhcmUveGRyX2xkLmggYi9nZGIvdngtc2hhcmUveGRyX2xkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg5OWMwZQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi92eC1zaGFyZS94ZHJfbGQuaApAQCAtMCwwICsxLDQ1IEBACisvKiB4ZHJfbGQuaCAtIHhkciBmb3IgYWRkaXRpb25hbCBkYnhXb3JrcyBzdHJ1Y3R1cmVzICovCisKKy8qICBDb3B5cmlnaHQgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgIFRoaXMgY29kZSB3YXMgZG9uYXRlZCBieSBXaW5kIFJpdmVyIFN5c3RlbXMsIEluYy4gKi8KKworLyoKK21vZGlmaWNhdGlvbiBoaXN0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLQorMDFhLDA1anVuOTAsbGxrICBleHRyYWN0ZWQgZnJvbSB4ZHJfZGJ4LmguCisqLworCisjaWZuZGVmIElOQ3hkcmxkaAorI2RlZmluZSBJTkN4ZHJsZGgKKworI2RlZmluZSBNQVhTVFJMRU4gMjU2CisjZGVmaW5lIE1BWFRCTFNaIDEwMAorCisvKgorICogc3RydWN0dXJlIHVzZWQgdG8gcGFzcyBiYWNrIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBzaW5nbGUgZmlsZQorICogbG9hZGVkIGluIFZ4V29ya3MKKyAqLworc3RydWN0IGxkZmlsZSB7CisJY2hhciAJKm5hbWU7CisJaW50IAl0eHRfYWRkcjsKKwlpbnQgCWRhdGFfYWRkcjsKKwlpbnQgCWJzc19hZGRyOworfTsKK3R5cGVkZWYgc3RydWN0IGxkZmlsZSBsZGZpbGU7CisKKy8qCisgKiBzdHJ1Y3R1cmUgdXNlZCB0byByZXR1cm4gYSBsaXN0IG9mIGFsbCBmaWxlcyBsb2FkZWQgb3ZlciB0byAKKyAqIFZ4V29ya3MuIChWWF9TVEFURV9JTlEgcmV0dXJuKQorICovCitzdHJ1Y3QgbGR0YWJsIHsKKwl1X2ludCB0Ymxfc2l6ZTsKKwlsZGZpbGUgKnRibF9lbnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbGR0YWJsIGxkdGFibDsKKworCitib29sX3QgeGRyX2xkZmlsZSgpOworYm9vbF90IHhkcl9sZHRhYmwoKTsKKworI2VuZGlmCUlOQ3hkcmxkaApkaWZmIC0tZ2l0IGEvZ2RiL3Z4LXNoYXJlL3hkcl9wdHJhY2UuYyBiL2dkYi92eC1zaGFyZS94ZHJfcHRyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmNDMyNAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi92eC1zaGFyZS94ZHJfcHRyYWNlLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qIHhkcl9wdHJhY2UuYyAgLSB4ZHIgcm91dGluZXMgZm9yIHJlbW90ZSBwdHJhY2UgY2FsbHMgKi8KKyAKKy8qICBDb3B5cmlnaHQgMTk4NCwgMTk4NSwgMTk4NiwgMTk4NywgMTk4OCwgMTk4OSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgIFRoaXMgY29kZSB3YXMgZG9uYXRlZCBieSBXaW5kIFJpdmVyIFN5c3RlbXMsIEluYy4gKi8KKworLyoKK21vZGlmaWNhdGlvbiBoaXN0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLQorMDFiLDI1bWF5OTEsbWFmICBub3cgdXNlcyBjb3VudGVkIGJ5dGVzIHN0cnVjdCB0byB0cmFuc2ZlciByZWdpc3RlcnMuCisJCSByZW1vdmVkIHhkcl9yZWdzX3B0ciAoKSwgeGRyX2ZwX3N0YXR1c19wdHIgKCksIGFuZAorCQkgICB4ZHJfZnBhX3JlZ3NfcHRyICgpLgorMDFhLDA1anVuOTAsbGxrICBleHRyYWN0ZWQgZnJvbSB4ZHJfcHRyYWNlLmgsIHZlcnNpb24gMDFjLgorKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJ2eFdvcmtzLmgiCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorI2luY2x1ZGUgInhkcl9wdHJhY2UuaCIKKworI2RlZmluZSBNQVhfTEVOIDMyMDAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiB4ZHJfY19ieXRlcyAtCisqCisqIHhkciByb3V0aW5lIGZvciBjb3VudGVkIGJ5dGVzICAKKyoKKyovCitib29sX3QgeGRyX2NfYnl0ZXMoeGRycyxvYmpwKQorICAgIFhEUiAqeGRyczsKKyAgICBDX2J5dGVzICpvYmpwOworICAgIHsKKyAgICByZXR1cm4oeGRyX2J5dGVzKHhkcnMsICZvYmpwLT5ieXRlcywgKHVfaW50ICopICZvYmpwLT5sZW4sIE1BWF9MRU4pKTsKKyAgICB9IC8qIHhkcl9jX2J5dGVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiB4ZHJfY19ieXRlc19wdHIgLQorKgorKiB4ZHIgcm91dGluZSBmb3IgY291bnRlZCBieXRlcyBicmFuY2ggb2YgcHRyYWNlX2luZm8KKyoKKyovCisKK0xPQ0FMIGJvb2xfdCB4ZHJfY19ieXRlc19wdHIoeGRycyxvYmpwKQorICAgIFhEUiAqeGRyczsKKyAgICBDX2J5dGVzICoqb2JqcDsKKyAgICB7CisgICAgcmV0dXJuKHhkcl9wb2ludGVyKHhkcnMsIChjaGFyICoqKSBvYmpwLCBzaXplb2YoQ19ieXRlcyksIHhkcl9jX2J5dGVzKSk7CisgICAgfSAvKiB4ZHJfY19ieXRlc19wdHIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIHhkcl9wdHJhY2VfaW5mbyAtCisqCisqIHhkciByb3V0aW5lIGZvciBkaXNjcmltaW5hdGVkIHVuaW9uIHB0cmFjZV9pbmZvCisqCisqLworCitib29sX3QgeGRyX3B0cmFjZV9pbmZvKHhkcnMsb2JqcCkKKyAgICBYRFIgKnhkcnM7CisgICAgUHRyYWNlX2luZm8gKm9ianA7CisgICAgeworICAgIHN0YXRpYyBzdHJ1Y3QgeGRyX2Rpc2NyaW0gY2hvaWNlc1tdID0gCisJeworCSAgICB7IChpbnQpIERBVEEsIHhkcl9jX2J5dGVzX3B0ciB9LAorCSAgICB7IF9fZG9udGNhcmVfXywgTlVMTCB9CisJfTsKKworICAgIHJldHVybih4ZHJfdW5pb24oeGRycywgKGVudW1fdCAqKSAmb2JqcC0+dHR5cGUsIAorCShjaGFyICopICZvYmpwLT5tb3JlX2RhdGEsIGNob2ljZXMsIHhkcl92b2lkKSk7CisgICAgfSAvKiB4ZHJfcHRyYWNlX2luZm8gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIHhkcl9ycHRyYWNlIC0gCisqCisqIHhkciByb3V0aW5lIGZvciByZW1vdGUgcHRyYWNlIGRhdGEgaW50byBzZXJ2ZXIKKyoKKyovCisKK2Jvb2xfdCB4ZHJfcnB0cmFjZSh4ZHJzLG9ianApCisgICAgWERSICp4ZHJzOworICAgIFJwdHJhY2UgKm9ianA7CisgICAgeworICAgIGlmICghIHhkcl9pbnQoeGRycywgJm9ianAtPnBpZCkpIAorCXJldHVybihGQUxTRSk7CisgICAgaWYgKCEgeGRyX2ludCh4ZHJzLCAmb2JqcC0+ZGF0YSkpIAorCXJldHVybihGQUxTRSk7CisgICAgaWYgKCEgeGRyX2ludCh4ZHJzLCAmb2JqcC0+YWRkcikpIAorCXJldHVybihGQUxTRSk7CisgICAgaWYgKCEgeGRyX3B0cmFjZV9pbmZvKHhkcnMsICZvYmpwLT5pbmZvKSkgCisJcmV0dXJuKEZBTFNFKTsKKworICAgIHJldHVybihUUlVFKTsKKyAgICB9IC8qIHhkcl9ycHRyYWNlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiB4ZHJfcHRyYWNlX3JldHVybiAtIAorKgorKiB4ZHIgcm91dGluZSBmb3IgcmVtb3RlIHB0cmFjZSBkYXRhIHJldHVybmVkIGJ5IHNlcnZlcgorKgorKi8KKworYm9vbF90IHhkcl9wdHJhY2VfcmV0dXJuKHhkcnMsIG9ianApCisgICAgWERSICp4ZHJzOworICAgIFB0cmFjZV9yZXR1cm4gKm9ianA7CisgICAgeworICAgIGlmICghIHhkcl9pbnQoeGRycywgJm9ianAtPnN0YXR1cykpIAorCXJldHVybihGQUxTRSk7CisgICAgaWYgKCEgeGRyX2ludCh4ZHJzLCAmb2JqcC0+ZXJybm9fbnVtKSkgCisJcmV0dXJuKEZBTFNFKTsKKyAgICBpZiAoISB4ZHJfcHRyYWNlX2luZm8oeGRycywgJm9ianAtPmluZm8pKSAKKwlyZXR1cm4oRkFMU0UpOworCisgICAgcmV0dXJuKFRSVUUpOworICAgIH0gLyogeGRyX3B0cmFjZV9yZXR1cm4gKi8JCmRpZmYgLS1naXQgYS9nZGIvdngtc2hhcmUveGRyX3B0cmFjZS5oIGIvZ2RiL3Z4LXNoYXJlL3hkcl9wdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjRlYjJiCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Z4LXNoYXJlL3hkcl9wdHJhY2UuaApAQCAtMCwwICsxLDcyIEBACisvKiB4ZHJfcHRyYWNlLmggLSB4ZHIgaGVhZGVyIGZvciByZW1vdGUgcHRyYWNlIHN0cnVjdHVyZXMgKi8KKworLyogIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICAgVGhpcyBjb2RlIHdhcyBkb25hdGVkIGJ5IFdpbmQgUml2ZXIgU3lzdGVtcywgSW5jLiAqLworCisvKgorbW9kaWZpY2F0aW9uIGhpc3RvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCiswMWIsMjVtYXk5MSxtYWYgIG5vdyB1c2VzIGNvdW50ZWQgYnl0ZXMgc3RydWN0IHRvIHRyYW5zZmVyIHJlZ2lzdGVyczsKKwkJICAgcmVtb3ZlZCByZWZlcmVuY2VzIHRvIG9sZCB4ZHJfcmVncyBmdW5jdGlvbnMuCisJCSByZW1vdmVkIGluY2x1ZGVzIG9mICJ4ZHJfcmVncy5oIiBhbmQgInJlZy5oIi4KKzAxYSwwNWp1bjkwLGxsayAgZXh0cmFjdGVkIGZyb20geGRyX3B0cmFjZS5oLgorKi8KKworCisvKgorICogIENvdW50ZWQgYnl0ZSBzdHJ1Y3R1cmUgdXNlZCBieSBSRUFEL1dSSVRFIFRFWFQvREFUQQorICogIGFuZCBHRVQvU0VUIFJFR1MvRlBSRUdTCisgKi8KK3N0cnVjdCBjX2J5dGVzIHsKKwl1X2ludAlsZW47CisJY2FkZHJfdAlieXRlczsKK307Cit0eXBlZGVmIHN0cnVjdCBjX2J5dGVzIENfYnl0ZXM7CisKKy8qCisgKiBlbnVtIGZvciBkaXNjcmltaW5hdGVkIHVuaW9uIHB0cmFjZV9pbmZvCisgKi8KK2VudW0gcHR5cGUgeworCU5PSU5GTyA9IDAsCQkvKiBubyBhZGRpdGlvbmFsIGluZm9tYXRpb24JKi8KKwlEQVRBID0gMQkJLyogY19ieXRlcyAqLworfTsKK3R5cGVkZWYgZW51bSBwdHlwZSBwdHlwZTsKKworLyoKKyAqIGRpc2NyaW1uYXRlZCB1bmlvbiBmb3IgcGFzc2luZyBhZGRpdGlvbmFsIGRhdGEgdG8gYmUgCisgKiB3cml0dGVuIHRvIHRoZSBkZWJ1Z2dlZCBwcm9jZXNzLgorICovCitzdHJ1Y3QgcHRyYWNlX2luZm8geworCXB0eXBlCXR0eXBlOworCWNhZGRyX3QJbW9yZV9kYXRhOwkKK307Cit0eXBlZGVmIHN0cnVjdCBwdHJhY2VfaW5mbyBQdHJhY2VfaW5mbzsKKworLyoKKyAqIHN0cnVjdHVyZSBwYXNzZWQgdG8gc2VydmVyIG9uIGFsbCByZW1vdGUgcHRyYWNlIGNhbGxzCisgKi8KK3N0cnVjdCBycHRyYWNlIHsKKwlpbnQgCXBpZDsKKwlpbnQgCWRhdGE7CisJaW50IAlhZGRyOwkvKiBGSVghIHRoaXMgcmVhbGx5IHNob3VsZCBiZSBjYWRkcl90IG9yIHNvbWV0aGluZyAqLworCVB0cmFjZV9pbmZvCWluZm87Cit9OwordHlwZWRlZiBzdHJ1Y3QgcnB0cmFjZSBScHRyYWNlOworCisvKgorICogc3RydWN0dXJlIHJldHVybmVkIGJ5IHNlcnZlciBvbiBhbGwgcmVtb3RlIHB0cmFjZSBjYWxscworICovCisvKiBUaGlzIHVzZWQgdG8gaGF2ZSBhIGZpZWxkIGNhbGxlZCBlcnJubywgYnV0IHRoYXQgZmFpbHMgb24gaG9zdHMgd2hpY2gKKyAgIGRlZmluZSBlcnJubyB0byBiZSBhIG1hY3JvLCBzbyBpdCB3YXMgY2hhbmdlZCB0byBlcnJub19udW0uICAqLworc3RydWN0IHB0cmFjZV9yZXR1cm4geworCWludCBzdGF0dXM7CisJaW50IGVycm5vX251bTsKKwlQdHJhY2VfaW5mbwlpbmZvOworfTsKK3R5cGVkZWYgc3RydWN0IHB0cmFjZV9yZXR1cm4gUHRyYWNlX3JldHVybjsKKworYm9vbF90IHhkcl9jX2J5dGVzKCk7Citib29sX3QgeGRyX3B0cmFjZV9pbmZvKCk7Citib29sX3QgeGRyX3JwdHJhY2UoKTsKK2Jvb2xfdCB4ZHJfcHRyYWNlX3JldHVybigpOwpkaWZmIC0tZ2l0IGEvZ2RiL3Z4LXNoYXJlL3hkcl9yZGIuYyBiL2dkYi92eC1zaGFyZS94ZHJfcmRiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyMGY3ZgotLS0gL2Rldi9udWxsCisrKyBiL2dkYi92eC1zaGFyZS94ZHJfcmRiLmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qIHhkcl9yZGIuYyAgLSB4ZHIgcm91dGluZXMgZm9yIFJlbW90ZSBEZWJ1ZyBpbnRlcmZhY2UgdG8gVnhXb3JrcyAgKi8KKworLyogQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgY29kZSB3YXMgZG9uYXRlZCBieSBXaW5kIFJpdmVyIFN5c3RlbXMsIEluYy4gKi8KKworLyoKK21vZGlmaWNhdGlvbiBoaXN0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLQorMDFhLDIxbWFyOTAsbGxrICBjcmVhdGVkIHVzaW5nIG1vZGlmaWNhdGlvbiAwMWQgb2YgeGRyX2RieC5jLgorKi8KKworLyoKK0RFU0NSSVBUSU9OCitUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgZVh0ZXJuYWwgRGF0YSBSZXByZXNlbnRhdGlvbiAoWERSKSByb3V0aW5lcworZm9yIHRoZSBSREIgaW50ZXJmYWNlIGZvciBWeFdvcmtzLgorKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJ2eFdvcmtzLmgiCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorI2luY2x1ZGUgInhkcl9yZGIuaCIKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KKworYm9vbF90Cit4ZHJfYXJnX3R5cGUoeGRycywgb2JqcCkKKyAgICAgICAgWERSICp4ZHJzOworICAgICAgICBhcmdfdHlwZSAqb2JqcDsKK3sKKyAgICAgICAgaWYgKCF4ZHJfZW51bSh4ZHJzLCAoZW51bV90ICopb2JqcCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKFRSVUUpOworfQorCitib29sX3QKK3hkcl9hcmdfdmFsdWUoeGRycywgb2JqcCkKKyAgICAgICAgWERSICp4ZHJzOworICAgICAgICBhcmdfdmFsdWUgKm9ianA7Cit7CisgICAgICAgIGlmICgheGRyX2FyZ190eXBlKHhkcnMsICZvYmpwLT50eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob2JqcC0+dHlwZSkgeworICAgICAgICBjYXNlIFRfQllURToKKyAgICAgICAgICAgICAgICBpZiAoIXhkcl9jaGFyKHhkcnMsICZvYmpwLT5hcmdfdmFsdWVfdS52X2J5dGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVF9XT1JEOgorICAgICAgICAgICAgICAgIGlmICgheGRyX3Nob3J0KHhkcnMsICZvYmpwLT5hcmdfdmFsdWVfdS52X3dvcmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVF9JTlQ6CisgICAgICAgICAgICAgICAgaWYgKCF4ZHJfaW50KHhkcnMsICZvYmpwLT5hcmdfdmFsdWVfdS52X2ludCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUX0ZMT0FUOgorICAgICAgICAgICAgICAgIGlmICgheGRyX2Zsb2F0KHhkcnMsICZvYmpwLT5hcmdfdmFsdWVfdS52X2ZwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRfRE9VQkxFOgorICAgICAgICAgICAgICAgIGlmICgheGRyX2RvdWJsZSh4ZHJzLCAmb2JqcC0+YXJnX3ZhbHVlX3Uudl9kcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUX1VOS05PV046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChUUlVFKTsKK30KKworYm9vbF90Cit4ZHJfZnVuY19jYWxsKHhkcnMsIG9ianApCisgICAgICAgIFhEUiAqeGRyczsKKyAgICAgICAgZnVuY19jYWxsICpvYmpwOworeworICAgICAgICBpZiAoIXhkcl9pbnQoeGRycywgJm9ianAtPmZ1bmNfYWRkcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXhkcl9hcnJheSh4ZHJzLCAoY2hhciAqKikmb2JqcC0+YXJncy5hcmdzX3ZhbCwgKHVfaW50ICopJm9ianAtPmFyZ3MuYXJnc19sZW4sIE1BWF9GVU5DX0FSR1MsIHNpemVvZihhcmdfdmFsdWUpLCB4ZHJfYXJnX3ZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoVFJVRSk7Cit9CisKK2Jvb2xfdAoreGRyX2FyZ19vbmUoeGRycywgb2JqcCkKKyAgICAgICAgWERSICp4ZHJzOworICAgICAgICBhcmdfb25lICpvYmpwOworeworICAgICAgICBpZiAoIXhkcl9zdHJpbmcoeGRycywgb2JqcCwgTUFYX0FSR19MRU4pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChUUlVFKTsKK30KKworCisKKworYm9vbF90Cit4ZHJfYXJnX2FycmF5KHhkcnMsIG9ianApCisgICAgICAgIFhEUiAqeGRyczsKKyAgICAgICAgYXJnX2FycmF5ICpvYmpwOworeworICAgICAgICBpZiAoIXhkcl9hcnJheSh4ZHJzLCAoY2hhciAqKikmb2JqcC0+YXJnX2FycmF5X3ZhbCwgKHVfaW50ICopJm9ianAtPmFyZ19hcnJheV9sZW4sIE1BWF9BUkdfQ05ULCBzaXplb2YoYXJnX29uZSksIHhkcl9hcmdfb25lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoVFJVRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogeGRyX0VWRU5UX1RZUEUgLQorKgorKi8KKworYm9vbF90IHhkcl9FVkVOVF9UWVBFKHhkcnMsIG9ianApCisgICAgWERSICp4ZHJzOworICAgIEVWRU5UX1RZUEUgKm9ianA7CisKKyAgICB7CisgICAgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKKwlyZXR1cm4gKEZBTFNFKTsKKyAgICByZXR1cm4gKFRSVUUpOworICAgIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiB4ZHJfUkRCX0VWRU5UIC0KKyoKKyovCisKK2Jvb2xfdCB4ZHJfUkRCX0VWRU5UICh4ZHJzLCBvYmpwKQorICAgIFhEUiAqeGRyczsKKyAgICBSREJfRVZFTlQgKm9ianA7CisKKyAgICB7CisgICAgaWYgKCF4ZHJfaW50ICh4ZHJzLCAmb2JqcC0+c3RhdHVzKSkKKwlyZXR1cm4gKEZBTFNFKTsKKyAgICBpZiAoIXhkcl9pbnQgKHhkcnMsICZvYmpwLT50YXNrSWQpKQorCXJldHVybiAoRkFMU0UpOworICAgIGlmICgheGRyX0VWRU5UX1RZUEUgKHhkcnMsICZvYmpwLT5ldmVudFR5cGUpKQorCXJldHVybiAoRkFMU0UpOworICAgIGlmICgheGRyX2ludCAoeGRycywgJm9ianAtPnNpZ1R5cGUpKQorCXJldHVybiAoRkFMU0UpOworICAgIHJldHVybiAoVFJVRSk7CisgICAgfSAgICAgICAgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogeGRyX1RBU0tfU1RBUlQgLQorKgorKi8KKworYm9vbF90Cit4ZHJfVEFTS19TVEFSVCAoeGRycywgb2JqcCkKKyAgICBYRFIgKnhkcnM7CisgICAgVEFTS19TVEFSVCAqb2JqcDsKKworICAgIHsKKyAgICBpZiAoIXhkcl9pbnQgKHhkcnMsICZvYmpwLT5zdGF0dXMpKQorCXJldHVybiAoRkFMU0UpOworICAgIGlmICgheGRyX2ludCAoeGRycywgJm9ianAtPnBpZCkpCisJcmV0dXJuIChGQUxTRSk7CisgICAgcmV0dXJuIChUUlVFKTsKKyAgICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiB4ZHJfU1lNQk9MX0FERFIgLQorKgorKi8KKworYm9vbF90Cit4ZHJfU1lNQk9MX0FERFIgKHhkcnMsIG9ianApCisgICAgWERSICp4ZHJzOworICAgIFNZTUJPTF9BRERSICpvYmpwOworCisgICAgeworICAgIGlmICgheGRyX2ludCAoeGRycywgJm9ianAtPnN0YXR1cykpCisJcmV0dXJuIChGQUxTRSk7CisgICAgaWYgKCF4ZHJfdV9pbnQgKHhkcnMsICZvYmpwLT5hZGRyKSkKKwlyZXR1cm4gKEZBTFNFKTsKKyAgICByZXR1cm4gKFRSVUUpOworICAgIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiB4ZHJfU09VUkNFX1NURVAgLQorKgorKi8KKworYm9vbF90Cit4ZHJfU09VUkNFX1NURVAgKHhkcnMsIG9ianApCisgICAgWERSICp4ZHJzOworICAgIFNPVVJDRV9TVEVQICpvYmpwOworCisgICAgeworICAgIGlmICgheGRyX2ludCAoeGRycywgJm9ianAtPnRhc2tJZCkpCisJcmV0dXJuIChGQUxTRSk7CisgICAgaWYgKCF4ZHJfdV9pbnQgKHhkcnMsICZvYmpwLT5zdGFydEFkZHIpKQorCXJldHVybiAoRkFMU0UpOworICAgIGlmICgheGRyX3VfaW50ICh4ZHJzLCAmb2JqcC0+ZW5kQWRkcikpCisJcmV0dXJuIChGQUxTRSk7CisgICAgcmV0dXJuIChUUlVFKTsKKyAgICB9CmRpZmYgLS1naXQgYS9nZGIvdngtc2hhcmUveGRyX3JkYi5oIGIvZ2RiL3Z4LXNoYXJlL3hkcl9yZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTg5NDUzCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Z4LXNoYXJlL3hkcl9yZGIuaApAQCAtMCwwICsxLDEzNyBAQAorLyogeGRyX3JkYi5oIC0geGRyIGZvciBhZGRpdGlvbmFsIHJkYiBzdHJ1Y3R1cmVzICovCisKKy8qIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGNvZGUgd2FzIGRvbmF0ZWQgYnkgV2luZCBSaXZlciBTeXN0ZW1zLCBJbmMuICovCisKKy8qCittb2RpZmljYXRpb24gaGlzdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAxYywyNW1heTkxLG1hZiAgcm9sbGVkIFJEQlZFUlMgZm9yIFZ4R0RCIDEuMCB2ZXJzaW9uLgorMDFiLDEyYXByOTEsbWFmICByb2xsZWQgUkRCVkVSUy4KKzAxYSwwOWphbjkxLG1hZiAgY3JlYXRlZCB1c2luZyB2MWEgb2YgeGRyX3JkYi5oIGZvciA0LjAuMiBWeFdvcmtzIDY4ay4KKwkJIGFkZGVkIHN0cnVjdCBTT1VSQ0VfU1RFUC4KKyovCisKKyNpZm5kZWYgSU5DeGRycmRiaAorI2RlZmluZSBJTkN4ZHJyZGJoCisKK2VudW0gYXJnX3R5cGUgeworICAgICAgICBUX1VOS05PV04gPSAwLAorICAgICAgICBUX0JZVEUgPSAxLAorICAgICAgICBUX1dPUkQgPSAyLAorICAgICAgICBUX0lOVCA9IDMsCisgICAgICAgIFRfRkxPQVQgPSA0LAorICAgICAgICBUX0RPVUJMRSA9IDUKK307Cit0eXBlZGVmIGVudW0gYXJnX3R5cGUgYXJnX3R5cGU7Citib29sX3QgeGRyX2FyZ190eXBlKCk7CisKKworc3RydWN0IGFyZ192YWx1ZSB7CisgICAgICAgIGFyZ190eXBlIHR5cGU7CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICBjaGFyIHZfYnl0ZTsKKyAgICAgICAgICAgICAgICBzaG9ydCB2X3dvcmQ7CisgICAgICAgICAgICAgICAgaW50IHZfaW50OworICAgICAgICAgICAgICAgIGZsb2F0IHZfZnA7CisgICAgICAgICAgICAgICAgZG91YmxlIHZfZHA7CisgICAgICAgIH0gYXJnX3ZhbHVlX3U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgYXJnX3ZhbHVlIGFyZ192YWx1ZTsKK2Jvb2xfdCB4ZHJfYXJnX3ZhbHVlKCk7CisKK3N0cnVjdCBmdW5jX2NhbGwgeworICAgICAgICBpbnQgZnVuY19hZGRyOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgIHVfaW50IGFyZ3NfbGVuOworICAgICAgICAgICAgICAgIGFyZ192YWx1ZSAqYXJnc192YWw7CisgICAgICAgIH0gYXJnczsKK307Cit0eXBlZGVmIHN0cnVjdCBmdW5jX2NhbGwgZnVuY19jYWxsOworYm9vbF90IHhkcl9mdW5jX2NhbGwoKTsKKworCit0eXBlZGVmIGNoYXIgKmFyZ19vbmU7Citib29sX3QgeGRyX2FyZ19vbmUoKTsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIHVfaW50IGFyZ19hcnJheV9sZW47CisgICAgICAgIGFyZ19vbmUgKmFyZ19hcnJheV92YWw7Cit9IGFyZ19hcnJheTsKK2Jvb2xfdCB4ZHJfYXJnX2FycmF5KCk7CisKKworLyoKKyAqIFN0cnVjdHVyZXMgdXNlZCB0byBwYXNzIHN0cnVjdHVyZXMgcmVxdWlyZWQgZm9yCisgKiBwcm9jZXNzIGNvbnRyb2wgYnV0IG5vdCBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBwdHJhY2UgaW50ZXJmYWNlCisgKi8KKworLyoKKyAqIGFyZ19pbmZvIGlzIHVzZWQgdG8gcGFzcyBhcmd1bWVudHMgaW50byBwcm9jZXNzIHN0YXJ0CisgKi8KK3N0cnVjdCBhcmdfaW5mbyB7CisJaW50IHJhcmdjOworCWNoYXIgKipyYXJndjsKK307Cit0eXBlZGVmIHN0cnVjdCBhcmdfaW5mbyBBcmdfaW5mbzsKKworCitlbnVtIEVWRU5UX1RZUEUgeworICAgICAgICBFVkVOVF9CUkVBSyA9IDAsCisgICAgICAgIEVWRU5UX1NUT1AgPSAxLAorICAgICAgICBFVkVOVF9FWElUID0gMiwKKyAgICAgICAgRVZFTlRfQlVTX0VSUiA9IDMsCisgICAgICAgIEVWRU5UX1NVU1BFTkQgPSA0LAorICAgICAgICBFVkVOVF9aRVJPX0RJViA9IDUsCisgICAgICAgIEVWRU5UX1NJR05BTCA9IDYsCisgICAgICAgIEVWRU5UX1NUQVJUID0gNworfTsKK3R5cGVkZWYgZW51bSBFVkVOVF9UWVBFIEVWRU5UX1RZUEU7CisKKworc3RydWN0IFJEQl9FVkVOVCB7CisJaW50IHN0YXR1czsKKwlpbnQgdGFza0lkOworICAgICAgICBFVkVOVF9UWVBFIGV2ZW50VHlwZTsKKyAgICAgICAgaW50IHNpZ1R5cGU7Cit9OwordHlwZWRlZiBzdHJ1Y3QgUkRCX0VWRU5UIFJEQl9FVkVOVDsKKworCitzdHJ1Y3QgVEFTS19TVEFSVCB7CisgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgIGludCBwaWQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgVEFTS19TVEFSVCBUQVNLX1NUQVJUOworCisKK3N0cnVjdCBTWU1CT0xfQUREUiB7CisgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgIHVfaW50IGFkZHI7Cit9OwordHlwZWRlZiBzdHJ1Y3QgU1lNQk9MX0FERFIgU1lNQk9MX0FERFI7CisKK3N0cnVjdCBTT1VSQ0VfU1RFUCB7CisJaW50IHRhc2tJZDsKKwl1X2ludCBzdGFydEFkZHI7CisJdV9pbnQgZW5kQWRkcjsKK307Cit0eXBlZGVmIHN0cnVjdCBTT1VSQ0VfU1RFUCBTT1VSQ0VfU1RFUDsKKworI2RlZmluZSBNQVhfQVJHX0NOVCAxMAorI2RlZmluZSBNQVhfRlVOQ19BUkdTIDEwMAorI2RlZmluZSBNQVhfQVJHX0xFTiAgIDEwMAorCisKK2Jvb2xfdCB4ZHJfYXJnX2luZm8oKTsKK2Jvb2xfdCB4ZHJfRVZFTlRfVFlQRSgpOworYm9vbF90IHhkcl9SREJfRVZFTlQoKTsKK2Jvb2xfdCB4ZHJfVEFTS19TVEFSVCgpOworYm9vbF90IHhkcl9TWU1CT0xfQUREUigpOworYm9vbF90IHhkcl9TT1VSQ0VfU1RFUCgpOworCisjZGVmaW5lIFJEQlBST0cgKHVfbG9uZykgMHg0NDQ0NDQ0NAorI2RlZmluZSBSREJWRVJTICh1X2xvbmcpIDMKKyNlbmRpZglJTkN4ZHJyZGJoCmRpZmYgLS1naXQgYS9nZGIvdzY1LXRkZXAuYyBiL2dkYi93NjUtdGRlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDY2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdzY1LXRkZXAuYwpAQCAtMCwwICsxLDI5NSBAQAorLyogVGFyZ2V0LW1hY2hpbmUgZGVwZW5kZW50IGNvZGUgZm9yIFdEQy02NTgxNiwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICAgQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4KKyAgIHNhY0BjeWdudXMuY29tCisgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgorI2luY2x1ZGUgIm9ic3RhY2suaCIKKyNpbmNsdWRlICJzeW10YWIuaCIKKyNpbmNsdWRlICJnZGJjbWQuaCIKKyNpbmNsdWRlICJnZGJ0eXBlcy5oIgorI2luY2x1ZGUgImRpcy1hc20uaCIKKyNpbmNsdWRlICJnZGJjb3JlLmgiCisKKy8qIFJldHVybiB0aGUgc2F2ZWQgUEMgZnJvbSB0aGlzIGZyYW1lLiAqLworCisKK0NPUkVfQUREUgordzY1X2ZyYW1lX3NhdmVkX3BjIChmcmFtZSkKKyAgICAgc3RydWN0IGZyYW1lX2luZm8gKmZyYW1lOworeworICByZXR1cm4gKHJlYWRfbWVtb3J5X2ludGVnZXIgKGZyYW1lLT5mcmFtZSArIDIsIDQpICYgMHhmZmZmZmYpOworfQorCitDT1JFX0FERFIKK3c2NV9hZGRyX2JpdHNfcmVtb3ZlIChhZGRyKQorICAgICBDT1JFX0FERFIgYWRkcjsKK3sKKyAgcmV0dXJuICgoYWRkcikgJiAweGZmZmZmZik7Cit9CisKK3JlYWRfbWVtb3J5X3BvaW50ZXIgKHgpCisgICAgIENPUkVfQUREUiB4OworeworICByZXR1cm4gcmVhZF9tZW1vcnlfaW50ZWdlciAoQUREUl9CSVRTX1JFTU9WRSAoeCksIDQpOworfQorCitpbml0X2ZyYW1lX3BjICgpCit7CisgIGFib3J0ICgpOworfQorCit2b2lkCit3NjVfcHVzaF9kdW1teV9mcmFtZSAoKQoreworICBhYm9ydCAoKTsKK30KKworLyogUHV0IGhlcmUgdGhlIGNvZGUgdG8gc3RvcmUsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywKKyAgIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4KKyAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbAorICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDoKKyAgIHRoZSBhZGRyZXNzIHdlIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4KKworICAgV2UgY2FjaGUgdGhlIHJlc3VsdCBvZiBkb2luZyB0aGlzIGluIHRoZSBmcmFtZV9jYWNoZV9vYnN0YWNrLCBzaW5jZQorICAgaXQgaXMgZmFpcmx5IGV4cGVuc2l2ZS4gICovCisKK3ZvaWQKK2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyAoZmlwLCBmc3JwKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmlwOworICAgICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqZnNycDsKK3sKKyAgaW50IGxvY2FsczsKKyAgQ09SRV9BRERSIHBjOworICBDT1JFX0FERFIgYWRyOworICBpbnQgaTsKKworICBtZW1zZXQgKGZzcnAsIDAsIHNpemVvZiAqZnNycCk7Cit9CisKK2ludAorc2F2ZWRfcGNfYWZ0ZXJfY2FsbCAoKQoreworICBpbnQgc3AgPSByZWFkX3JlZ2lzdGVyIChTUF9SRUdOVU0pOworICBpbnQgdmFsID0gcmVhZF9tZW1vcnlfaW50ZWdlciAoc3AgKyAxLCA0KTsKKyAgcmV0dXJuIEFERFJfQklUU19SRU1PVkUgKHZhbCk7Cit9CisKKworZXh0cmFjdF9yZXR1cm5fdmFsdWUgKHR5cGUsIHJlZ2J1ZiwgdmFsYnVmKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgY2hhciAqcmVnYnVmOworICAgICBjaGFyICp2YWxidWY7Cit7CisgIGludCBiOworICBpbnQgbGVuID0gVFlQRV9MRU5HVEggKHR5cGUpOworCisgIGZvciAoYiA9IDA7IGIgPCBsZW47IGIgKz0gMikKKyAgICB7CisgICAgICBpbnQgdG9kbyA9IGxlbiAtIGI7CisgICAgICBpZiAodG9kbyA+IDIpCisJdG9kbyA9IDI7CisgICAgICBtZW1jcHkgKHZhbGJ1ZiArIGIsIHJlZ2J1ZiArIGIsIHRvZG8pOworICAgIH0KK30KKwordm9pZAord3JpdGVfcmV0dXJuX3ZhbHVlICh0eXBlLCB2YWxidWYpCisgICAgIHN0cnVjdCB0eXBlICp0eXBlOworICAgICBjaGFyICp2YWxidWY7Cit7CisgIGludCByZWc7CisgIGludCBsZW47CisgIGZvciAobGVuID0gMDsgbGVuIDwgVFlQRV9MRU5HVEggKHR5cGUpOyBsZW4gKz0gMikKKyAgICB7CisgICAgICB3cml0ZV9yZWdpc3Rlcl9ieXRlcyAoUkVHSVNURVJfQllURSAobGVuIC8gMiArIDIpLCB2YWxidWYgKyBsZW4sIDIpOworICAgIH0KK30KKwordm9pZAorc3RvcmVfc3RydWN0X3JldHVybiAoYWRkciwgc3ApCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBDT1JFX0FERFIgc3A7Cit7CisgIHdyaXRlX3JlZ2lzdGVyICgyLCBhZGRyKTsKK30KKwordm9pZAordzY1X3BvcF9mcmFtZSAoKQoreworfQorCitpbml0X2V4dHJhX2ZyYW1lX2luZm8gKCkKK3sKK30KKworcG9wX2ZyYW1lICgpCit7Cit9CisKK3c2NV9mcmFtZV9jaGFpbiAodGhpc2ZyYW1lKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqdGhpc2ZyYW1lOworeworICByZXR1cm4gMHhmZmZmICYgcmVhZF9tZW1vcnlfaW50ZWdlciAoKHRoaXNmcmFtZSktPmZyYW1lLCAyKTsKK30KKworc3RhdGljIGludAorZ2IgKHgpCit7CisgIHJldHVybiByZWFkX21lbW9yeV9pbnRlZ2VyICh4LCAxKSAmIDB4ZmY7Cit9CisKK2V4dGVybiBDT1JFX0FERFIgCit3NjVfc2tpcF9wcm9sb2d1ZSAocGMpCisgICAgIENPUkVfQUREUiBwYzsKK3sKKyAgQ09SRV9BRERSIHRvb19mYXIgPSBwYyArIDIwOworCisgIC8qIGxvb2tpbmcgZm9yIGJpdHMgb2YgdGhlIHByb2xvZ3VlLCB3ZSBjYW4gZXhwZWN0IHRvCisgICAgIHNlZSB0aGlzIGluIGEgZnJhbWVmdWwgZnVuY3Rpb246CisKKyAgICAgc3RhY2sgYWRqdXN0OgorCisgICAgIDNCICAgICAgICAgICAgICAgICB0c2MKKyAgICAgMUEgICAgICAgICAgICAgICAgIGluYyBhCisgICAgIDE4ICAgICAgICAgICAgICAgICBjbGMKKyAgICAgNjlFMkZGICAgICAgICAgICAgIGFkYyAgICAgIzB4ZmZlMgorICAgICAzQSAgICAgICAgICAgICAgICAgZGVjIGEKKyAgICAgMUIgICAgICAgICAgICAgICAgIHRjcworICAgICAxQSAgICAgICAgICAgICAgICAgaW5jIGEKKworICAgICBsaW5rOgorCisgICAgIEE1MDAgICAgICAgICAgICAgICBsZGEgICAgIDxyMTUKKyAgICAgNDggICAgICAgICAgICAgICAgIHBoYQorICAgICAzQiAgICAgICAgICAgICAgICAgdHNjCisgICAgIDFhICAgICAgICAgICAgICAgICBpbmMgICAgIGEKKyAgICAgODUwMCAgICAgICAgICAgICAgIHN0YSAgICAgPHIxNQorCisgICAqLworCisjZGVmaW5lIFRTQyAgMHgzYgorI2RlZmluZSBUQ1MgIDB4MWIKKyNkZWZpbmUgSU5DQSAweDFhCisjZGVmaW5lIFBIQSAgMHg0OAorI2RlZmluZSBMREFESVIgMHhhNQorI2RlZmluZSBTVEFESVIgMHg4NQorCisgIC8qIFNraXAgYSBzdGFjayBhZGp1c3QgLSBhbnkgYXJlYSBiZXR3ZWVuIGEgdHNjIGFuZCB0Y3MgKi8KKyAgaWYgKGdiIChwYykgPT0gVFNDKQorICAgIHsKKyAgICAgIHdoaWxlIChwYyA8IHRvb19mYXIgJiYgZ2IgKHBjKSAhPSBUQ1MpCisJeworCSAgcGMrKzsKKwl9CisgICAgICBwYysrOworICAgICAgLyogU2tpcCBhIHN0dXBpZCBpbmMgYSAqLworICAgICAgaWYgKGdiIChwYykgPT0gSU5DQSkKKwlwYysrOworCisgICAgfQorICAvKiBTdGFjayBhZGp1c3QgY2FuIGFsc28gYmUgZG9uZSB3aXRoIG4gcGhhJ3MgKi8KKyAgd2hpbGUgKGdiIChwYykgPT0gUEhBKQorICAgIHBjKys7CisKKyAgLyogU2tpcCBhIGxpbmsgLSB0aGF0J3MgYSBsZC9waC90c2MvaW5jL3N0YSAqLworCisgIGlmIChnYiAocGMpID09IExEQURJUgorICAgICAgJiYgZ2IgKHBjICsgNSkgPT0gU1RBRElSCisgICAgICAmJiBnYiAocGMgKyAxKSA9PSBnYiAocGMgKyA2KQorICAgICAgJiYgZ2IgKHBjICsgMikgPT0gUEhBCisgICAgICAmJiBnYiAocGMgKyAzKSA9PSBUU0MKKyAgICAgICYmIGdiIChwYyArIDQpID09IElOQ0EpCisgICAgeworICAgICAgcGMgKz0gNzsKKyAgICB9CisKKyAgcmV0dXJuIHBjOworfQorCisKK3JlZ2lzdGVyX3Jhd19zaXplIChuKQoreworICByZXR1cm4gc2ltX3JlZ19zaXplIChuKTsKK30KKworCit2b2lkCitwcmludF9yZWdpc3Rlcl9ob29rIChyZWdubykKK3sKKyAgaWYgKHJlZ25vID09IFBfUkVHTlVNKQorICAgIHsKKyAgICAgIC8qIENDUiByZWdpc3RlciAqLworCisgICAgICBpbnQgQywgWiwgTiwgViwgSSwgRCwgWCwgTTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgYlsxXTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgbDsKKworICAgICAgcmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMgKHJlZ25vLCBiKTsKKyAgICAgIGwgPSBiWzBdOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcdCIpOworICAgICAgQyA9IChsICYgMHgxKSAhPSAwOworICAgICAgWiA9IChsICYgMHgyKSAhPSAwOworICAgICAgSSA9IChsICYgMHg0KSAhPSAwOworICAgICAgRCA9IChsICYgMHg4KSAhPSAwOworICAgICAgWCA9IChsICYgMHgxMCkgIT0gMDsKKyAgICAgIE0gPSAobCAmIDB4MjApICE9IDA7CisgICAgICBWID0gKGwgJiAweDQwKSAhPSAwOworICAgICAgTiA9IChsICYgMHg4MCkgIT0gMDsKKworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJOLSVkICIsIE4pOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJWLSVkICIsIFYpOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJNLSVkICIsIE0pOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJYLSVkICIsIFgpOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJELSVkICIsIEQpOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJJLSVkICIsIEkpOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJaLSVkICIsIFopOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJDLSVkICIsIEMpOworICAgICAgaWYgKChDIHwgWikgPT0gMCkKKwlwcmludGZfdW5maWx0ZXJlZCAoInU+ICIpOworICAgICAgaWYgKChDIHwgWikgPT0gMSkKKwlwcmludGZfdW5maWx0ZXJlZCAoInU8PSAiKTsKKyAgICAgIGlmICgoQyA9PSAwKSkKKwlwcmludGZfdW5maWx0ZXJlZCAoInU+PSAiKTsKKyAgICAgIGlmIChDID09IDEpCisJcHJpbnRmX3VuZmlsdGVyZWQgKCJ1PCAiKTsKKyAgICAgIGlmIChaID09IDApCisJcHJpbnRmX3VuZmlsdGVyZWQgKCIhPSAiKTsKKyAgICAgIGlmIChaID09IDEpCisJcHJpbnRmX3VuZmlsdGVyZWQgKCI9PSAiKTsKKyAgICAgIGlmICgoTiBeIFYpID09IDApCisJcHJpbnRmX3VuZmlsdGVyZWQgKCI+PSAiKTsKKyAgICAgIGlmICgoTiBeIFYpID09IDEpCisJcHJpbnRmX3VuZmlsdGVyZWQgKCI8ICIpOworICAgICAgaWYgKChaIHwgKE4gXiBWKSkgPT0gMCkKKwlwcmludGZfdW5maWx0ZXJlZCAoIj4gIik7CisgICAgICBpZiAoKFogfCAoTiBeIFYpKSA9PSAxKQorCXByaW50Zl91bmZpbHRlcmVkICgiPD0gIik7CisgICAgfQorfQorCit2b2lkCitfaW5pdGlhbGl6ZV93NjVfdGRlcCAoKQoreworICB0bV9wcmludF9pbnNuID0gcHJpbnRfaW5zbl93NjU7Cit9CmRpZmYgLS1naXQgYS9nZGIvdzg5ay1yb20uYyBiL2dkYi93ODlrLXJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMWEyNjUKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdzg5ay1yb20uYwpAQCAtMCwwICsxLDMxNyBAQAorLyogUmVtb3RlIHRhcmdldCBnbHVlIGZvciB0aGUgV2luQm9uZCBST00gbW9uaXRvciBydW5uaW5nIG9uIHRoZSAiQ291Z2FyIgorICAgVzg5ayBldmFsIGJvYXJkLgorCisgICBDb3B5cmlnaHQgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJ0YXJnZXQuaCIKKyNpbmNsdWRlICJtb25pdG9yLmgiCisjaW5jbHVkZSAic2VyaWFsLmgiCisjaW5jbHVkZSAieG1vZGVtLmgiCisKKworc3RhdGljIHZvaWQgdzg5a19vcGVuIFBBUkFNUyAoKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkpOworCisvKgorICogdGhpcyBhcnJheSBvZiByZWdpc3RlcnMgbmVlZCB0byBtYXRjaCB0aGUgaW5kZXhlcyB1c2VkIGJ5IEdEQi4gVGhlCisgKiB3aG9sZSByZWFzb24gdGhpcyBleGlzdHMgaXMgY2F1c2UgdGhlIHZhcmlvdXMgUk9NIG1vbml0b3JzIHVzZQorICogZGlmZmVyZW50IHN0cmluZ3MgdGhhbiBHREIgZG9lcywgYW5kIGRvZXNuJ3Qgc3VwcG9ydCBhbGwgdGhlCisgKiByZWdpc3RlcnMgZWl0aGVyLiBTbywgdHlwaW5nICJpbmZvIHJlZyBzcCIgYmVjb21lcyBhICJyMzAiLgorICovCisKK3N0YXRpYyBjaGFyICp3ODlrX3JlZ25hbWVzW05VTV9SRUdTXSA9Cit7CisgICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsCisgICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIsCisgICJyMTYiLCAicjE3IiwgInIxOCIsICJyMTkiLCAicjIwIiwgInIyMSIsICJyMjIiLCAicjIzIiwKKyAgInIyNCIsICJyMjUiLCAicjI2IiwgInIyNyIsICJyMjgiLCAicjI5IiwgInIzMCIsICJyMzEiLAorICAiU0FSIiwgIlBDIiwgTlVMTCwgTlVMTCwgTlVMTCwgIkVJRU0iLCAiSUlSIiwgIklWQSIsCisgICJJT1IiLCAiSVBTVyIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICJDQ1IiLCBOVUxMLCBOVUxMLCAiVFIwIiwgIlRSMSIsCit9OworCitzdGF0aWMgdm9pZAordzg5a19zdXBwbHlfcmVnaXN0ZXIgKHJlZ25hbWUsIHJlZ25hbWVsZW4sIHZhbCwgdmFsbGVuKQorICAgICBjaGFyICpyZWduYW1lOworICAgICBpbnQgcmVnbmFtZWxlbjsKKyAgICAgY2hhciAqdmFsOworICAgICBpbnQgdmFsbGVuOworeworICBpbnQgbnVtcmVnczsKKyAgaW50IHJlZ25vOworCisgIG51bXJlZ3MgPSAxOworICByZWdubyA9IC0xOworCisgIGlmIChyZWduYW1lbGVuID09IDIpCisgICAgc3dpdGNoIChyZWduYW1lWzBdKQorICAgICAgeworICAgICAgY2FzZSAncic6CisJbnVtcmVncyA9IDQ7CisJc3dpdGNoIChyZWduYW1lWzFdKQorCSAgeworCSAgY2FzZSAnMCc6CisJICAgIHJlZ25vID0gUjBfUkVHTlVNOworCSAgICBicmVhazsKKwkgIGNhc2UgJzQnOgorCSAgICByZWdubyA9IFIwX1JFR05VTSArIDQ7CisJICAgIGJyZWFrOworCSAgY2FzZSAnOCc6CisJICAgIHJlZ25vID0gUjBfUkVHTlVNICsgODsKKwkgICAgYnJlYWs7CisJICB9CisJYnJlYWs7CisgICAgICBjYXNlICdQJzoKKwlpZiAocmVnbmFtZVsxXSA9PSAnQycpCisJICByZWdubyA9IFBDX1JFR05VTTsKKwlicmVhazsKKyAgICAgIH0KKyAgZWxzZSBpZiAocmVnbmFtZWxlbiA9PSAzKQorICAgIHN3aXRjaCAocmVnbmFtZVswXSkKKyAgICAgIHsKKyAgICAgIGNhc2UgJ3InOgorCW51bXJlZ3MgPSA0OworCWlmIChyZWduYW1lWzFdID09ICcxJyAmJiByZWduYW1lWzJdID09ICcyJykKKwkgIHJlZ25vID0gUjBfUkVHTlVNICsgMTI7CisJZWxzZSBpZiAocmVnbmFtZVsxXSA9PSAnMScgJiYgcmVnbmFtZVsyXSA9PSAnNicpCisJICByZWdubyA9IFIwX1JFR05VTSArIDE2OworCWVsc2UgaWYgKHJlZ25hbWVbMV0gPT0gJzInICYmIHJlZ25hbWVbMl0gPT0gJzAnKQorCSAgcmVnbm8gPSBSMF9SRUdOVU0gKyAyMDsKKwllbHNlIGlmIChyZWduYW1lWzFdID09ICcyJyAmJiByZWduYW1lWzJdID09ICc0JykKKwkgIHJlZ25vID0gUjBfUkVHTlVNICsgMjQ7CisJZWxzZSBpZiAocmVnbmFtZVsxXSA9PSAnMicgJiYgcmVnbmFtZVsyXSA9PSAnOCcpCisJICByZWdubyA9IFIwX1JFR05VTSArIDI4OworCWJyZWFrOworICAgICAgY2FzZSAnUic6CisJaWYgKHJlZ25hbWVbMV0gPT0gJ0MnICYmIHJlZ25hbWVbMl0gPT0gJ1InKQorCSAgcmVnbm8gPSBSQ1JfUkVHTlVNOworCWJyZWFrOworICAgICAgY2FzZSAnQyc6CisJaWYgKHJlZ25hbWVbMV0gPT0gJ0MnICYmIHJlZ25hbWVbMl0gPT0gJ1InKQorCSAgcmVnbm8gPSBDQ1JfUkVHTlVNOworCWJyZWFrOworICAgICAgY2FzZSAnUyc6CisJaWYgKHJlZ25hbWVbMV0gPT0gJ0EnICYmIHJlZ25hbWVbMl0gPT0gJ1InKQorCSAgcmVnbm8gPSBTQVJfUkVHTlVNOworCWJyZWFrOworICAgICAgY2FzZSAnSSc6CisJaWYgKHJlZ25hbWVbMV0gPT0gJ0knICYmIHJlZ25hbWVbMl0gPT0gJ1InKQorCSAgcmVnbm8gPSBJSVJfUkVHTlVNOworCWVsc2UgaWYgKHJlZ25hbWVbMV0gPT0gJ08nICYmIHJlZ25hbWVbMl0gPT0gJ1InKQorCSAgcmVnbm8gPSBJT1JfUkVHTlVNOworCWJyZWFrOworICAgICAgY2FzZSAnVCc6CisJbnVtcmVncyA9IDQ7CisJaWYgKHJlZ25hbWVbMV0gPT0gJ1InKQorCSAgaWYgKHJlZ25hbWVbMl0gPT0gJzAnKQorCSAgICByZWdubyA9IFRSMF9SRUdOVU07CisJICBlbHNlIGlmIChyZWduYW1lWzJdID09ICc0JykKKwkgICAgcmVnbm8gPSBUUjBfUkVHTlVNICsgNDsKKwlicmVhazsKKyAgICAgIH0KKyAgZWxzZSBpZiAocmVnbmFtZWxlbiA9PSA0KQorICAgIHN3aXRjaCAocmVnbmFtZVswXSkKKyAgICAgIHsKKyAgICAgIGNhc2UgJ0UnOgorCWlmIChyZWduYW1lWzFdID09ICdJJykKKwkgIGlmIChyZWduYW1lWzJdID09ICdFJyAmJiByZWduYW1lWzNdID09ICdNJykKKwkgICAgcmVnbm8gPSBFSUVNX1JFR05VTTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ0knOgorCWlmIChyZWduYW1lWzFdID09ICdQJyAmJiByZWduYW1lWzJdID09ICdTJyAmJiByZWduYW1lWzNdID09ICdXJykKKwkgIHJlZ25vID0gSVBTV19SRUdOVU07CisJYnJlYWs7CisgICAgICB9CisgIGVsc2UgaWYgKHJlZ25hbWVsZW4gPT0gNSkKKyAgICBzd2l0Y2ggKHJlZ25hbWVbMF0pCisgICAgICB7CisgICAgICBjYXNlICdJJzoKKwlpZiAocmVnbmFtZVsxXSA9PSAnQScKKwkgICAgJiYgcmVnbmFtZVsyXSA9PSAnTycKKwkgICAgJiYgcmVnbmFtZVszXSA9PSAnUScKKwkgICAgJiYgcmVnbmFtZVs0XSA9PSAnQicpCisJICByZWdubyA9IFBDT1FfVEFJTF9SRUdOVU07CisJYnJlYWs7CisgICAgICB9CisKKyAgaWYgKHJlZ25vID49IDApCisgICAgd2hpbGUgKG51bXJlZ3MtLSA+IDApCisgICAgICB2YWwgPSBtb25pdG9yX3N1cHBseV9yZWdpc3RlciAocmVnbm8rKywgdmFsKTsKK30KKworc3RhdGljIGludCBoYXNobWFyayA9IDE7CS8qIGZsYWcgc2V0IGJ5ICJzZXQgaGFzaCIgKi8KKworZXh0ZXJuIHN0cnVjdCBtb25pdG9yX29wcyB3ODlrX2NtZHM7IC8qIGZ3ZCBkZWNsICovCisKK3N0YXRpYyB2b2lkCit3ODlrX2xvYWQgKGRlc2MsIGZpbGUsIGhhc2htYXJrKQorICAgICBzZXJpYWxfdCBkZXNjOworICAgICBjaGFyICpmaWxlOworICAgICBpbnQgaGFzaG1hcms7Cit7CisgIGJmZCAqYWJmZDsKKyAgYXNlY3Rpb24gKnM7CisgIGNoYXIgKmJ1ZmZlcjsKKyAgaW50IGk7CisKKyAgYnVmZmVyID0gYWxsb2NhIChYTU9ERU1fUEFDS0VUU0laRSk7CisKKyAgYWJmZCA9IGJmZF9vcGVuciAoZmlsZSwgMCk7CisgIGlmICghYWJmZCkKKyAgICB7CisgICAgICBwcmludGZfZmlsdGVyZWQgKCJVbmFibGUgdG8gb3BlbiBmaWxlICVzXG4iLCBmaWxlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpID09IDApCisgICAgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiRmlsZSBpcyBub3QgYW4gb2JqZWN0IGZpbGVcbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgCisgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKKyAgICBpZiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkKKyAgICAgIHsKKwliZmRfc2l6ZV90eXBlIHNlY3Rpb25fc2l6ZTsKKworCXByaW50Zl9maWx0ZXJlZCAoIiVzXHQ6IDB4JTR4IC4uIDB4JTR4ICAiLCBzLT5uYW1lLCBzLT52bWEsCisJCQkgcy0+dm1hICsgcy0+X3Jhd19zaXplKTsKKwlnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCisJbW9uaXRvcl9wcmludGYgKHc4OWtfY21kcy5sb2FkLCBzLT52bWEpOworCWlmICh3ODlrX2NtZHMubG9hZHJlc3ApCisJICBtb25pdG9yX2V4cGVjdCAodzg5a19jbWRzLmxvYWRyZXNwLCBOVUxMLCAwKTsKKworCXhtb2RlbV9pbml0X3hmZXIgKGRlc2MpOworCisJc2VjdGlvbl9zaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2VjdGlvbl9zaXplOyBpICs9IFhNT0RFTV9EQVRBU0laRSkKKwkgIHsKKwkgICAgaW50IG51bWJ5dGVzOworCisJICAgIG51bWJ5dGVzID0gbWluIChYTU9ERU1fREFUQVNJWkUsIHNlY3Rpb25fc2l6ZSAtIGkpOworCisJICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgcywgYnVmZmVyICsgWE1PREVNX0RBVEFPRkZTRVQsIGksCisJCQkJICAgICAgbnVtYnl0ZXMpOworCisJICAgIHhtb2RlbV9zZW5kX3BhY2tldCAoZGVzYywgYnVmZmVyLCBudW1ieXRlcywgaGFzaG1hcmspOworCisJICAgIGlmIChoYXNobWFyaykKKwkgICAgICB7CisJCXB1dGNoYXJfdW5maWx0ZXJlZCAoJyMnKTsKKwkJZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwkgICAgICB9CisJICB9CQkJLyogUGVyLXBhY2tldCAob3IgUy1yZWNvcmQpIGxvb3AgKi8KKworCXhtb2RlbV9maW5pc2hfeGZlciAoZGVzYyk7CisKKwltb25pdG9yX2V4cGVjdF9wcm9tcHQgKE5VTEwsIDApOworCisJcHV0Y2hhcl91bmZpbHRlcmVkICgnXG4nKTsKKyAgICAgIH0JCQkJLyogTG9hZGFibGUgc2VjdGlvbnMgKi8KKyAgCisgIGlmIChoYXNobWFyaykgCisgICAgcHV0Y2hhcl91bmZpbHRlcmVkICgnXG4nKTsKK30KKworLyoKKyAqIERlZmluZSB0aGUgbW9uaXRvciBjb21tYW5kIHN0cmluZ3MuIFNpbmNlIHRoZXNlIGFyZSBwYXNzZWQgZGlyZWN0bHkKKyAqIHRocm91Z2ggdG8gYSBwcmludGYgc3R5bGUgZnVuY3Rpb24sIHdlIG5lZWQgY2FuIGluY2x1ZGUgZm9ybWF0dGluZworICogc3RyaW5ncy4gV2UgYWxzbyBuZWVkIGEgQ1Igb3IgTEYgb24gdGhlIGVuZC4KKyAqLworCitzdGF0aWMgc3RydWN0IHRhcmdldF9vcHMgdzg5a19vcHM7CisKK3N0YXRpYyBjaGFyICp3ODlrX2luaXRzW10gPSB7IlxuIiwgTlVMTH07CisKK3N0YXRpYyBzdHJ1Y3QgbW9uaXRvcl9vcHMgdzg5a19jbWRzIDsKK3N0YXRpYyB2b2lkCitpbml0X3c4OWtfY21kcyh2b2lkKQoreworICB3ODlrX2NtZHMuZmxhZ3MgPSAgIE1PX0dFVE1FTV9ORUVEU19SQU5HRXxNT19GSUxMX1VTRVNfQUREUjsgLyogZmxhZ3MgKi8KKyAgdzg5a19jbWRzLmluaXQgPSAgIHc4OWtfaW5pdHM7CQkvKiBJbml0IHN0cmluZ3MgKi8KKyAgdzg5a19jbWRzLmNvbnQgPSAgICJnXG4iOwkJCS8qIGNvbnRpbnVlIGNvbW1hbmQgKi8KKyAgdzg5a19jbWRzLnN0ZXAgPSAgICJ0XG4iOwkJCS8qIHNpbmdsZSBzdGVwICovCisgIHc4OWtfY21kcy5zdG9wID0gICAiXDAwMyI7CQkJLyogSW50ZXJydXB0IGNoYXIgKF5DKSAqLworICB3ODlrX2NtZHMuc2V0X2JyZWFrID0gICAiYnAgJXhcbiI7CQkvKiBzZXQgYSBicmVha3BvaW50ICovCisgIHc4OWtfY21kcy5jbHJfYnJlYWsgPSAgICJiYyAleFxuIjsJCS8qIGNsZWFyIGEgYnJlYWtwb2ludCAqLworICB3ODlrX2NtZHMuY2xyX2FsbF9icmVhayA9ICAgImJjICpcbiI7CQkvKiBjbGVhciBhbGwgYnJlYWtwb2ludHMgKi8KKyAgdzg5a19jbWRzLmZpbGwgPSAgICJmICV4ICV4ICV4XG4iOwkJLyogbWVtb3J5IGZpbGwgY21kICovCisgIHc4OWtfY21kcy5zZXRtZW0uY21kYiA9ICAgICAiZWIgJXggJXhcbiI7CS8qIHNldG1lbS5jbWRiIChhZGRyLCB2YWx1ZSkgKi8KKyAgdzg5a19jbWRzLnNldG1lbS5jbWR3ID0gICAgICJlaCAleCAleFxuIjsJLyogc2V0bWVtLmNtZHcgKGFkZHIsIHZhbHVlKSAqLworICB3ODlrX2NtZHMuc2V0bWVtLmNtZGwgPSAgICAgImV3ICV4ICV4XG4iOwkvKiBzZXRtZW0uY21kbCAoYWRkciwgdmFsdWUpICovCisgIHc4OWtfY21kcy5zZXRtZW0uY21kbGwgPSAgICAgTlVMTDsJCS8qIHNldG1lbS5jbWRsbCAoYWRkciwgdmFsdWUpICovCisgIHc4OWtfY21kcy5zZXRtZW0ucmVzcF9kZWxpbSA9ICAgICBOVUxMOwkvKiBzZXRyZWcucmVzcF9kZWxpbSAqLworICB3ODlrX2NtZHMuc2V0bWVtLnRlcm0gPSAgICAgTlVMTDsJCS8qIHNldHJlZy50ZXJtICovCisgIHc4OWtfY21kcy5zZXRtZW0udGVybV9jbWQgPSAgICAgTlVMTDsJCS8qIHNldHJlZy50ZXJtX2NtZCAqLworICB3ODlrX2NtZHMuZ2V0bWVtLmNtZGIgPSAgICAgImRiICV4ICV4XG4iOy8qIGdldG1lbS5jbWRiIChzdGFydGFkZHIsIGVuZGFkZHIpICovCisgIHc4OWtfY21kcy5nZXRtZW0uY21kdyA9ICAgICAiZGggJXggJXhcbiI7LyogZ2V0bWVtLmNtZHcgKHN0YXJ0YWRkciwgZW5kYWRkcikgKi8KKyAgdzg5a19jbWRzLmdldG1lbS5jbWRsID0gICAgICJkdyAleCAleFxuIjsvKiBnZXRtZW0uY21kbCAoc3RhcnRhZGRyLCBlbmRhZGRyKSAqLworICB3ODlrX2NtZHMuZ2V0bWVtLmNtZGxsID0gICAgIE5VTEw7CSAgLyogZ2V0bWVtLmNtZGxsIChzdGFydGFkZHIsIGVuZGFkZHIpICovCisgIHc4OWtfY21kcy5nZXRtZW0ucmVzcF9kZWxpbSA9ICAgICAiICAiOwkvKiBnZXRtZW0ucmVzcF9kZWxpbSAqLworICB3ODlrX2NtZHMuZ2V0bWVtLnRlcm0gPSAgICAgTlVMTDsJCS8qIGdldG1lbS50ZXJtICovCisgIHc4OWtfY21kcy5nZXRtZW0udGVybV9jbWQgPSAgICAgTlVMTDsJCS8qIGdldG1lbS50ZXJtX2NtZCAqLworICB3ODlrX2NtZHMuc2V0cmVnLmNtZCA9ICAgICAiciAlcyAleFxuIjsJLyogc2V0cmVnLmNtZCAobmFtZSwgdmFsdWUpICovCisgIHc4OWtfY21kcy5zZXRyZWcucmVzcF9kZWxpbSA9ICAgICBOVUxMOwkvKiBzZXRyZWcucmVzcF9kZWxpbSAqLworICB3ODlrX2NtZHMuc2V0cmVnLnRlcm0gPSAgICAgTlVMTDsJCS8qIHNldHJlZy50ZXJtICovCisgIHc4OWtfY21kcy5zZXRyZWcudGVybV9jbWQgPSAgICAgTlVMTDsJCS8qIHNldHJlZy50ZXJtX2NtZCAqLworICB3ODlrX2NtZHMuZ2V0cmVnLmNtZCA9ICAgICAiciAlc1xuIjsJCS8qIGdldHJlZy5jbWQgKG5hbWUpICovCisgIHc4OWtfY21kcy5nZXRyZWcucmVzcF9kZWxpbSA9ICAgICAiXHIiOwkvKiBnZXRyZWcucmVzcF9kZWxpbSAqLworICB3ODlrX2NtZHMuZ2V0cmVnLnRlcm0gPSAgICAgTlVMTDsJCS8qIGdldHJlZy50ZXJtICovCisgIHc4OWtfY21kcy5nZXRyZWcudGVybV9jbWQgPSAgICAgTlVMTDsJCS8qIGdldHJlZy50ZXJtX2NtZCAqLworICB3ODlrX2NtZHMuZHVtcF9yZWdpc3RlcnMgPSAgICJyXG4iOwkJLyogZHVtcF9yZWdpc3RlcnMgKi8KKyAgdzg5a19jbWRzLnJlZ2lzdGVyX3BhdHRlcm4gPSAgICJcXChcXHcrXFwpXFwoICtbMC05YS1mQS1GXStcXGJcXCkrIjsKKyAgdzg5a19jbWRzLnN1cHBseV9yZWdpc3RlciA9ICAgdzg5a19zdXBwbHlfcmVnaXN0ZXI7CQkvKiBzdXBwbHlfcmVnaXN0ZXIgKi8KKyAgdzg5a19jbWRzLmxvYWRfcm91dGluZSA9ICAgdzg5a19sb2FkOwkJLyogbG9hZCByb3V0aW5lICovCisgIHc4OWtfY21kcy5sb2FkID0gICAidSAleFxuIjsJCQkvKiBkb3dubG9hZCBjb21tYW5kICovCisgIHc4OWtfY21kcy5sb2FkcmVzcCA9ICAgIlwwMjEiOwkJLyogbG9hZCByZXNwb25zZSAoXlEpICovCisgIHc4OWtfY21kcy5wcm9tcHQgPSAgICJST00+IjsJCQkvKiBtb25pdG9yIGNvbW1hbmQgcHJvbXB0ICovCisgIHc4OWtfY21kcy5saW5lX3Rlcm0gPSAgICJcbiI7CQkJLyogZW5kLW9mLWxpbmUgdGVybWluYXRvciAqLworICB3ODlrX2NtZHMuY21kX2VuZCA9ICAgTlVMTDsJCQkvKiBvcHRpb25hbCBjb21tYW5kIHRlcm1pbmF0b3IgKi8KKyAgdzg5a19jbWRzLnRhcmdldCA9ICAgJnc4OWtfb3BzOwkJLyogdGFyZ2V0IG9wZXJhdGlvbnMgKi8KKyAgdzg5a19jbWRzLnN0b3BiaXRzID0gICBTRVJJQUxfMV9TVE9QQklUUzsJLyogbnVtYmVyIG9mIHN0b3AgYml0cyAqLworICB3ODlrX2NtZHMucmVnbmFtZXMgPSAgIHc4OWtfcmVnbmFtZXM7CQkvKiByZWdpc3RlciBuYW1lcyAqLworICB3ODlrX2NtZHMubWFnaWMgPSAgIE1PTklUT1JfT1BTX01BR0lDCTsJLyogbWFnaWMgKi8KK30gLyogaW5pdF93ODlrX2NtZHMgKi8KKyAgICAKK3N0YXRpYyB2b2lkCit3ODlrX29wZW4oYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgbW9uaXRvcl9vcGVuIChhcmdzLCAmdzg5a19jbWRzLCBmcm9tX3R0eSk7Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX3c4OWsgKCkKK3sKKyAgaW5pdF93ODlrX2NtZHMoKSA7CisgIGluaXRfbW9uaXRvcl9vcHMgKCZ3ODlrX29wcyk7CisKKyAgdzg5a19vcHMudG9fc2hvcnRuYW1lID0gInc4OWsiOworICB3ODlrX29wcy50b19sb25nbmFtZSA9ICJXaW5Cb25kJ3MgZGVidWcgbW9uaXRvciBmb3IgdGhlIFc4OWsgRXZhbCBib2FyZCI7CisgIHc4OWtfb3BzLnRvX2RvYyA9ICJEZWJ1ZyBvbiBhIFdpbkJvbmQgVzg5SyBldmFsIGJvYXJkLlxuXAorU3BlY2lmeSB0aGUgc2VyaWFsIGRldmljZSBpdCBpcyBjb25uZWN0ZWQgdG8gKGUuZy4gL2Rldi90dHlhKS4iOworICB3ODlrX29wcy50b19vcGVuID0gdzg5a19vcGVuOworCisgIGFkZF90YXJnZXQgKCZ3ODlrX29wcyk7Cit9CmRpZmYgLS1naXQgYS9nZGIvd2luMzItbmF0LmMgYi9nZGIvd2luMzItbmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlOTZiZAotLS0gL2Rldi9udWxsCisrKyBiL2dkYi93aW4zMi1uYXQuYwpAQCAtMCwwICsxLDExMjIgQEAKKy8qIFRhcmdldC12ZWN0b3Igb3BlcmF0aW9ucyBmb3IgY29udHJvbGxpbmcgd2luMzIgY2hpbGQgcHJvY2Vzc2VzLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmUgbnRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqLworCisvKiBieSBTdGV2ZSBDaGFtYmVybGFpbiwgc2FjQGN5Z251cy5jb20gKi8KKworLyogV2UgYXNzdW1lIHdlJ3JlIGJlaW5nIGJ1aWx0IHdpdGggYW5kIHdpbGwgYmUgdXNlZCBmb3IgY3lnd2luLiAgKi8KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJmcmFtZS5oIgkJLyogcmVxdWlyZWQgYnkgaW5mZXJpb3IuaCAqLworI2luY2x1ZGUgImluZmVyaW9yLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAid2FpdC5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKyNpbmNsdWRlICJjb21tYW5kLmgiCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSAid2luZGVmcy5oIgorI2Vsc2UgLyogb3RoZXIgV0lOMzIgY29tcGlsZXIgKi8KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImJ1aWxkc3ltLmgiCisjaW5jbHVkZSAic3ltZmlsZS5oIgorI2luY2x1ZGUgIm9iamZpbGVzLmgiCisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorI2luY2x1ZGUgImdkYnRocmVhZC5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisvKiBUaGUgc3RyaW5nIHNlbnQgYnkgY3lnd2luIHdoZW4gaXQgcHJvY2Vzc2VzIGEgc2lnbmFsLgorICAgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGluIGEgY3lnd2luIGluY2x1ZGUgZmlsZS4gKi8KKyNkZWZpbmUgQ1lHV0lOX1NJR05BTF9TVFJJTkcgImN5Z3dpbjogc2lnbmFsIgorCisjZGVmaW5lIENIRUNLKHgpIAljaGVjayAoeCwgX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIERFQlVHX0VYRUMoeCkJaWYgKGRlYnVnX2V4ZWMpCQlwcmludGYgeAorI2RlZmluZSBERUJVR19FVkVOVFMoeCkJaWYgKGRlYnVnX2V2ZW50cykJcHJpbnRmIHgKKyNkZWZpbmUgREVCVUdfTUVNKHgpCWlmIChkZWJ1Z19tZW1vcnkpCXByaW50ZiB4CisjZGVmaW5lIERFQlVHX0VYQ0VQVCh4KQlpZiAoZGVidWdfZXhjZXB0aW9ucykJcHJpbnRmIHgKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworZXh0ZXJuIHN0cnVjdCB0YXJnZXRfb3BzIGNoaWxkX29wczsKKworc3RhdGljIHZvaWQgY2hpbGRfc3RvcCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgaW50IHdpbjMyX2NoaWxkX3RocmVhZF9hbGl2ZSBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIGludCBsYXN0X3NpZyA9IDA7CS8qIFNldCBpZiBhIHNpZ25hbCB3YXMgcmVjZWl2ZWQgZnJvbSB0aGUKKwkJCQkgICBkZWJ1Z2dlZCBwcm9jZXNzICovCisKKy8qIFRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgdXNlZCB0byB0cmFjayBpbmZvcm1hdGlvbiB0aGF0IGlzCisgICBub3QgYXZhaWxhYmxlIGluIGdkYidzIHRocmVhZCBzdHJ1Y3R1cmUuICovCit0eXBlZGVmIHN0cnVjdCB0aHJlYWRfaW5mb19zdHJ1Y3QKK3sKKyAgc3RydWN0IHRocmVhZF9pbmZvX3N0cnVjdCAqbmV4dDsKKyAgRFdPUkQgaWQ7CisgIEhBTkRMRSBoOworICBjaGFyICpuYW1lOworICBpbnQgc3VzcGVuZF9jb3VudDsKKyAgQ09OVEVYVCBjb250ZXh0OworfSB0aHJlYWRfaW5mbzsKKworc3RhdGljIHRocmVhZF9pbmZvIHRocmVhZF9oZWFkID0ge05VTEx9OworCisvKiBUaGUgcHJvY2VzcyBhbmQgdGhyZWFkIGhhbmRsZXMgZm9yIHRoZSBhYm92ZSBjb250ZXh0LiAqLworCitzdGF0aWMgREVCVUdfRVZFTlQgY3VycmVudF9ldmVudDsJLyogVGhlIGN1cnJlbnQgZGVidWcgZXZlbnQgZnJvbQorCQkJCQkgICBXYWl0Rm9yRGVidWdFdmVudCAqLworc3RhdGljIEhBTkRMRSBjdXJyZW50X3Byb2Nlc3NfaGFuZGxlOwkvKiBDdXJyZW50bHkgZXhlY3V0aW5nIHByb2Nlc3MgKi8KK3N0YXRpYyB0aHJlYWRfaW5mbyAqY3VycmVudF90aHJlYWQ7CS8qIEluZm8gb24gY3VycmVudGx5IHNlbGVjdGVkIHRocmVhZCAqLworc3RhdGljIERXT1JEIG1haW5fdGhyZWFkX2lkOwkJLyogVGhyZWFkIElEIG9mIHRoZSBtYWluIHRocmVhZCAqLworCisvKiBDb3VudHMgb2YgdGhpbmdzLiAqLworc3RhdGljIGludCBleGNlcHRpb25fY291bnQgPSAwOworc3RhdGljIGludCBldmVudF9jb3VudCA9IDA7CisKKy8qIFVzZXIgb3B0aW9ucy4gKi8KK3N0YXRpYyBpbnQgbmV3X2NvbnNvbGUgPSAwOworc3RhdGljIGludCBuZXdfZ3JvdXAgPSAwOworc3RhdGljIGludCBkZWJ1Z19leGVjID0gMDsJCS8qIHNob3cgZXhlY3V0aW9uICovCitzdGF0aWMgaW50IGRlYnVnX2V2ZW50cyA9IDA7CQkvKiBzaG93IGV2ZW50cyBmcm9tIGtlcm5lbCAqLworc3RhdGljIGludCBkZWJ1Z19tZW1vcnkgPSAwOwkJLyogc2hvdyB0YXJnZXQgbWVtb3J5IGFjY2Vzc2VzICovCitzdGF0aWMgaW50IGRlYnVnX2V4Y2VwdGlvbnMgPSAwOwkvKiBzaG93IHRhcmdldCBleGNlcHRpb25zICovCisKKy8qIFRoaXMgdmVjdG9yIG1hcHMgR0RCJ3MgaWRlYSBvZiBhIHJlZ2lzdGVyJ3MgbnVtYmVyIGludG8gYW4gYWRkcmVzcworICAgaW4gdGhlIHdpbjMyIGV4Y2VwdGlvbiBjb250ZXh0IHZlY3Rvci4KKworICAgSXQgYWxzbyBjb250YWlucyB0aGUgYml0IG1hc2sgbmVlZGVkIHRvIGxvYWQgdGhlIHJlZ2lzdGVyIGluIHF1ZXN0aW9uLgorCisgICBPbmUgZGF5IHdlIGNvdWxkIHJlYWQgYSByZWcsIHdlIGNvdWxkIGluc3BlY3QgdGhlIGNvbnRleHQgd2UKKyAgIGFscmVhZHkgaGF2ZSBsb2FkZWQsIGlmIGl0IGRvZXNuJ3QgaGF2ZSB0aGUgYml0IHNldCB0aGF0IHdlIG5lZWQsCisgICB3ZSByZWFkIHRoYXQgc2V0IG9mIHJlZ2lzdGVycyBpbiB1c2luZyBHZXRUaHJlYWRDb250ZXh0LiAgSWYgdGhlCisgICBjb250ZXh0IGFscmVhZHkgY29udGFpbnMgd2hhdCB3ZSBuZWVkLCB3ZSBqdXN0IHVucGFjayBpdC4gVGhlbiB0bworICAgd3JpdGUgYSByZWdpc3RlciwgZmlyc3Qgd2UgaGF2ZSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGV4dCBjb250YWlucworICAgdGhlIG90aGVyIHJlZ3Mgb2YgdGhlIGdyb3VwLCBhbmQgdGhlbiB3ZSBjb3B5IHRoZSBpbmZvIGluIGFuZCBzZXQKKyAgIG91dCBiaXQuICovCisKKyNkZWZpbmUgY29udGV4dF9vZmZzZXQoeCkgKChpbnQpJigoKENPTlRFWFQgKilOVUxMKS0+eCkpCitzdGF0aWMgY29uc3QgaW50IG1hcHBpbmdzW10gPQoreworICBjb250ZXh0X29mZnNldChFYXgpLAorICBjb250ZXh0X29mZnNldChFY3gpLAorICBjb250ZXh0X29mZnNldChFZHgpLAorICBjb250ZXh0X29mZnNldChFYngpLAorICBjb250ZXh0X29mZnNldChFc3ApLAorICBjb250ZXh0X29mZnNldChFYnApLAorICBjb250ZXh0X29mZnNldChFc2kpLAorICBjb250ZXh0X29mZnNldChFZGkpLAorICBjb250ZXh0X29mZnNldChFaXApLAorICBjb250ZXh0X29mZnNldChFRmxhZ3MpLAorICBjb250ZXh0X29mZnNldChTZWdDcyksCisgIGNvbnRleHRfb2Zmc2V0KFNlZ1NzKSwKKyAgY29udGV4dF9vZmZzZXQoU2VnRHMpLAorICBjb250ZXh0X29mZnNldChTZWdFcyksCisgIGNvbnRleHRfb2Zmc2V0KFNlZ0ZzKSwKKyAgY29udGV4dF9vZmZzZXQoU2VnR3MpLAorICBjb250ZXh0X29mZnNldChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzAgKiAxMF0pLAorICBjb250ZXh0X29mZnNldChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzEgKiAxMF0pLAorICBjb250ZXh0X29mZnNldChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzIgKiAxMF0pLAorICBjb250ZXh0X29mZnNldChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzMgKiAxMF0pLAorICBjb250ZXh0X29mZnNldChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzQgKiAxMF0pLAorICBjb250ZXh0X29mZnNldChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzUgKiAxMF0pLAorICBjb250ZXh0X29mZnNldChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzYgKiAxMF0pLAorICBjb250ZXh0X29mZnNldChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzcgKiAxMF0pLAorfTsKKworLyogVGhpcyB2ZWN0b3IgbWFwcyB0aGUgdGFyZ2V0J3MgaWRlYSBvZiBhbiBleGNlcHRpb24gKGV4dHJhY3RlZAorICAgZnJvbSB0aGUgREVCVUdfRVZFTlQgc3RydWN0dXJlKSB0byBHREIncyBpZGVhLiAqLworCitzdHJ1Y3QgeGxhdGVfZXhjZXB0aW9uCisgIHsKKyAgICBpbnQgdGhlbTsKKyAgICBlbnVtIHRhcmdldF9zaWduYWwgdXM7CisgIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGxhdGVfZXhjZXB0aW9uCisgIHhsYXRlW10gPQoreworICB7RVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT04sIFRBUkdFVF9TSUdOQUxfU0VHVn0sCisgIHtTVEFUVVNfU1RBQ0tfT1ZFUkZMT1csIFRBUkdFVF9TSUdOQUxfU0VHVn0sCisgIHtFWENFUFRJT05fQlJFQUtQT0lOVCwgVEFSR0VUX1NJR05BTF9UUkFQfSwKKyAge0RCR19DT05UUk9MX0MsIFRBUkdFVF9TSUdOQUxfSU5UfSwKKyAge0VYQ0VQVElPTl9TSU5HTEVfU1RFUCwgVEFSR0VUX1NJR05BTF9UUkFQfSwKKyAgey0xLCAtMX19OworCisvKiBGaW5kIGEgdGhyZWFkIHJlY29yZCBnaXZlbiBhIHRocmVhZCBpZC4KKyAgIElmIGdldF9jb250ZXh0IHRoZW4gYWxzbyByZXRyaWV2ZSB0aGUgY29udGV4dCBmb3IgdGhpcworICAgdGhyZWFkLiAqLworc3RhdGljIHRocmVhZF9pbmZvICoKK3RocmVhZF9yZWMgKERXT1JEIGlkLCBpbnQgZ2V0X2NvbnRleHQpCit7CisgIHRocmVhZF9pbmZvICp0aDsKKworICBmb3IgKHRoID0gJnRocmVhZF9oZWFkOyAodGggPSB0aC0+bmV4dCkgIT0gTlVMTDsgKQorICAgIGlmICh0aC0+aWQgPT0gaWQpCisgICAgICB7CisJaWYgKCF0aC0+c3VzcGVuZF9jb3VudCAmJiBnZXRfY29udGV4dCkKKwkgIHsKKwkgICAgaWYgKGdldF9jb250ZXh0ID4gMCkKKwkgICAgICB0aC0+c3VzcGVuZF9jb3VudCA9IFN1c3BlbmRUaHJlYWQgKHRoLT5oKSArIDE7CisJICAgIGVsc2UgaWYgKGdldF9jb250ZXh0IDwgMCkKKwkgICAgICB0aC0+c3VzcGVuZF9jb3VudCA9IC0xOworCisJICAgIHRoLT5jb250ZXh0LkNvbnRleHRGbGFncyA9IENPTlRFWFRfREVCVUdHRVI7CisJICAgIEdldFRocmVhZENvbnRleHQgKHRoLT5oLCAmdGgtPmNvbnRleHQpOworCSAgfQorCXJldHVybiB0aDsKKyAgICAgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyogQWRkIGEgdGhyZWFkIHRvIHRoZSB0aHJlYWQgbGlzdCAqLworc3RhdGljIHRocmVhZF9pbmZvICoKK2NoaWxkX2FkZF90aHJlYWQoRFdPUkQgaWQsIEhBTkRMRSBoKQoreworICB0aHJlYWRfaW5mbyAqdGg7CisKKyAgaWYgKCh0aCA9IHRocmVhZF9yZWMgKGlkLCBGQUxTRSkpKQorICAgIHJldHVybiB0aDsKKworICB0aCA9ICh0aHJlYWRfaW5mbyAqKSB4bWFsbG9jIChzaXplb2YgKCp0aCkpOworICBtZW1zZXQodGgsIDAsIHNpemVvZiAoKnRoKSk7CisgIHRoLT5pZCA9IGlkOworICB0aC0+aCA9IGg7CisgIHRoLT5uZXh0ID0gdGhyZWFkX2hlYWQubmV4dDsKKyAgdGhyZWFkX2hlYWQubmV4dCA9IHRoOworICBhZGRfdGhyZWFkIChpZCk7CisgIHJldHVybiB0aDsKK30KKworLyogQ2xlYXIgb3V0IGFueSBvbGQgdGhyZWFkIGxpc3QgYW5kIHJlaW50aWFsaXplIGl0IHRvIGEKKyAgIHByaXN0aW5lIHN0YXRlLiAqLworc3RhdGljIHZvaWQKK2NoaWxkX2luaXRfdGhyZWFkX2xpc3QgKCkKK3sKKyAgdGhyZWFkX2luZm8gKnRoID0gJnRocmVhZF9oZWFkOworCisgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGNoaWxkX2luaXRfdGhyZWFkX2xpc3RcbiIpKTsKKyAgaW5pdF90aHJlYWRfbGlzdCAoKTsKKyAgd2hpbGUgKHRoLT5uZXh0ICE9IE5VTEwpCisgICAgeworICAgICAgdGhyZWFkX2luZm8gKmhlcmUgPSB0aC0+bmV4dDsKKyAgICAgIHRoLT5uZXh0ID0gaGVyZS0+bmV4dDsKKyAgICAgICh2b2lkKSBDbG9zZUhhbmRsZSAoaGVyZS0+aCk7CisgICAgICBmcmVlIChoZXJlKTsKKyAgICB9Cit9CisKKy8qIERlbGV0ZSBhIHRocmVhZCBmcm9tIHRoZSBsaXN0IG9mIHRocmVhZHMgKi8KK3N0YXRpYyB2b2lkCitjaGlsZF9kZWxldGVfdGhyZWFkIChEV09SRCBpZCkKK3sKKyAgdGhyZWFkX2luZm8gKnRoOworCisgIGlmIChpbmZvX3ZlcmJvc2UpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJbRGVsZXRpbmcgJXNdXG4iLCB0YXJnZXRfcGlkX3RvX3N0ciAoaWQpKTsKKyAgZGVsZXRlX3RocmVhZCAoaWQpOworCisgIGZvciAodGggPSAmdGhyZWFkX2hlYWQ7CisgICAgICAgdGgtPm5leHQgIT0gTlVMTCAmJiB0aC0+bmV4dC0+aWQgIT0gaWQ7CisgICAgICAgdGggPSB0aC0+bmV4dCkKKyAgICBjb250aW51ZTsKKworICBpZiAodGgtPm5leHQgIT0gTlVMTCkKKyAgICB7CisgICAgICB0aHJlYWRfaW5mbyAqaGVyZSA9IHRoLT5uZXh0OworICAgICAgdGgtPm5leHQgPSBoZXJlLT5uZXh0OworICAgICAgQ2xvc2VIYW5kbGUgKGhlcmUtPmgpOworICAgICAgZnJlZSAoaGVyZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorY2hlY2sgKEJPT0wgb2ssIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQoreworICBpZiAoIW9rKQorICAgIHByaW50Zl9maWx0ZXJlZCAoImVycm9yIHJldHVybiAlczolZCB3YXMgJWRcbiIsIGZpbGUsIGxpbmUsIEdldExhc3RFcnJvciAoKSk7Cit9CisKK3N0YXRpYyB2b2lkCitkb19jaGlsZF9mZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKGludCByKQoreworICBpZiAociA+PSAwKQorICAgIHN1cHBseV9yZWdpc3RlciAociwgKChjaGFyICopICZjdXJyZW50X3RocmVhZC0+Y29udGV4dCkgKyBtYXBwaW5nc1tyXSk7CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKHIgPSAwOyByIDwgTlVNX1JFR1M7IHIrKykKKwlkb19jaGlsZF9mZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2NoaWxkX2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoaW50IHIpCit7CisgIGN1cnJlbnRfdGhyZWFkID0gdGhyZWFkX3JlYyAoaW5mZXJpb3JfcGlkLCBUUlVFKTsKKyAgZG9fY2hpbGRfZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChyKTsKK30KKworc3RhdGljIHZvaWQKK2RvX2NoaWxkX3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAoaW50IHIpCit7CisgIGlmIChyID49IDApCisgICAgcmVhZF9yZWdpc3Rlcl9nZW4gKHIsICgoY2hhciAqKSAmY3VycmVudF90aHJlYWQtPmNvbnRleHQpICsgbWFwcGluZ3Nbcl0pOworICBlbHNlCisgICAgeworICAgICAgZm9yIChyID0gMDsgciA8IE5VTV9SRUdTOyByKyspCisJZG9fY2hpbGRfc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChyKTsKKyAgICB9Cit9CisKKy8qIFN0b3JlIGEgbmV3IHJlZ2lzdGVyIHZhbHVlIGludG8gdGhlIGN1cnJlbnQgdGhyZWFkIGNvbnRleHQgKi8KK3N0YXRpYyB2b2lkCitjaGlsZF9zdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKGludCByKQoreworICBjdXJyZW50X3RocmVhZCA9IHRocmVhZF9yZWMgKGluZmVyaW9yX3BpZCwgVFJVRSk7CisgIGRvX2NoaWxkX3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAocik7Cit9CisKKy8qIFdhaXQgZm9yIGNoaWxkIHRvIGRvIHNvbWV0aGluZy4gIFJldHVybiBwaWQgb2YgY2hpbGQsIG9yIC0xIGluIGNhc2UKKyAgIG9mIGVycm9yOyBzdG9yZSBzdGF0dXMgdGhyb3VnaCBhcmd1bWVudCBwb2ludGVyIE9VUlNUQVRVUy4gICovCisKK3N0YXRpYyBpbnQKK2hhbmRsZV9sb2FkX2RsbCAoUFRSIGR1bW15KQoreworICBMT0FEX0RMTF9ERUJVR19JTkZPICogZXZlbnQgPSAmY3VycmVudF9ldmVudC51LkxvYWREbGw7CisgIERXT1JEIGRsbF9uYW1lX3B0cjsKKyAgRFdPUkQgZG9uZTsKKyAgY2hhciBkbGxfYnVmW01BWF9QQVRIICsgMV07CisgIGNoYXIgKnAsICpkbGxfbmFtZSA9IE5VTEwsICpkbGxfYmFzZW5hbWU7CisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICBNRU1PUllfQkFTSUNfSU5GT1JNQVRJT04gbWluZm87CisKKyAgZGxsX2J1ZlswXSA9IGRsbF9idWZbc2l6ZW9mKGRsbF9idWYpIC0gMV0gPSAnXDAnOworCisgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSBhdHRlbXB0cyB0byBmaW5kIHRoZSBuYW1lIG9mIHRoZSBkbGwgYnkgcmVhZGluZyB0aGUKKyAgICAgbmFtZSBmcm9tIHRoZSBwcm9jZXNzZXMgbWVtb3J5LiAgVW5mb3J0dW5hdGVseSBpdCBkb2Vzbid0IHdvcmsgcmlnaHQuCisgICAgIERvaW5nIHRoaXMgdGhlICJyaWdodCB3YXkiIGZvciBXaW5kb3dzIGlzIHZlcnkgZGlmZmljdWx0LiAgRklYTUUgKi8KKyNpZmRlZiBET0VTTlRfV09SSworICBtZW1zZXQgKCZtaW5mbywgMCwgc2l6ZW9mIG1pbmZvKTsKKyAgaWYgKFZpcnR1YWxRdWVyeUV4IChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLCAoTFBDVk9JRCkgZXZlbnQtPmxwQmFzZU9mRGxsLAorCQkgICAgICAmbWluZm8sIHNpemVvZihtaW5mbykpICYmIG1pbmZvLkJhc2VBZGRyZXNzKSB7CisgICAgICBEV09SRCBsZW47CisgICAgICBJTUFHRV9ET1NfSEVBREVSICpobW0wID0gKElNQUdFX0RPU19IRUFERVIgKikgbWluZm8uQmFzZUFkZHJlc3M7CisgICAgICBITU9EVUxFIGhtbSA9IChITU9EVUxFKSAoKChEV09SRCkgaG1tMCkgKyBobW0wLT5lX2xmYW5ldyk7CisKKyAgICAgIGlmICgobGVuID0gR2V0TW9kdWxlRmlsZU5hbWUgKGhtbSwgZGxsX2J1ZiwgTUFYX1BBVEgpKSkKKwl7CisJICBkbGxfbmFtZSA9IGRsbF9idWY7CisJICBkbGxfbmFtZVtsZW5dID0gJ1wwJzsKKwl9CisgIH0KKyNlbmRpZgorCisgIC8qIEF0dGVtcHQgdG8gcmVhZCB0aGUgbmFtZSBvZiB0aGUgZGxsIHRoYXQgd2FzIGRldGVjdGVkLgorICAgICBUaGlzIGlzIGRvY3VtZW50ZWQgdG8gd29yayBvbmx5IHdoZW4gYWN0aXZlbHkgZGVidWdnaW5nCisgICAgIGEgcHJvZ3JhbS4gIEl0IHdpbGwgbm90IHdvcmsgZm9yIGF0dGFjaGVkIHByb2Nlc3Nlcy4gKi8KKyAgaWYgKGRsbF9uYW1lID09IE5VTEwgfHwgKmRsbF9uYW1lID09ICdcMCcpCisgICAgeworICAgICAgaW50IHNpemUgPSBldmVudC0+ZlVuaWNvZGUgPyBzaXplb2YgKFdDSEFSKSA6IHNpemVvZiAoY2hhcik7CisgICAgICBpbnQgbGVuID0gMDsKKyAgICAgIGNoYXIgYlsyXTsKKworICAgICAgUmVhZFByb2Nlc3NNZW1vcnkgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsCisJCQkgKExQQ1ZPSUQpIGV2ZW50LT5scEltYWdlTmFtZSwKKwkJCSAoY2hhciAqKSAmZGxsX25hbWVfcHRyLAorCQkJIHNpemVvZiAoZGxsX25hbWVfcHRyKSwgJmRvbmUpOworCisgICAgICAvKiBTZWUgaWYgd2UgY291bGQgcmVhZCB0aGUgYWRkcmVzcyBvZiBhIHN0cmluZywgYW5kIHRoYXQgdGhlCisJIGFkZHJlc3MgaXNuJ3QgbnVsbC4gKi8KKworICAgICAgaWYgKGRvbmUgIT0gc2l6ZW9mIChkbGxfbmFtZV9wdHIpIHx8ICFkbGxfbmFtZV9wdHIpCisJcmV0dXJuIDE7CisKKyAgICAgIGRvCisJeworCSAgUmVhZFByb2Nlc3NNZW1vcnkgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsCisJCQkgICAgIChMUENWT0lEKSAoZGxsX25hbWVfcHRyICsgbGVuICogc2l6ZSksCisJCQkgICAgICZiLAorCQkJICAgICBzaXplLAorCQkJICAgICAmZG9uZSk7CisJICBsZW4rKzsKKwl9CisgICAgICB3aGlsZSAoKGJbMF0gIT0gMCB8fCBiW3NpemUgLSAxXSAhPSAwKSAmJiBkb25lID09IHNpemUpOworCisgICAgICBkbGxfbmFtZSA9IGFsbG9jYSAobGVuKTsKKworICAgICAgaWYgKGV2ZW50LT5mVW5pY29kZSkKKwl7CisJICBXQ0hBUiAqdW5pY29kZV9kbGxfbmFtZSA9IChXQ0hBUiAqKSBhbGxvY2EgKGxlbiAqIHNpemVvZiAoV0NIQVIpKTsKKwkgIFJlYWRQcm9jZXNzTWVtb3J5IChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLAorCQkJICAgICAoTFBDVk9JRCkgZGxsX25hbWVfcHRyLAorCQkJICAgICB1bmljb2RlX2RsbF9uYW1lLAorCQkJICAgICBsZW4gKiBzaXplb2YgKFdDSEFSKSwKKwkJCSAgICAgJmRvbmUpOworCisJICBXaWRlQ2hhclRvTXVsdGlCeXRlIChDUF9BQ1AsIDAsCisJCQkgICAgICAgdW5pY29kZV9kbGxfbmFtZSwgbGVuLAorCQkJICAgICAgIGRsbF9uYW1lLCBsZW4sIDAsIDApOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBSZWFkUHJvY2Vzc01lbW9yeSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwKKwkJCSAgICAgKExQQ1ZPSUQpIGRsbF9uYW1lX3B0ciwKKwkJCSAgICAgZGxsX25hbWUsCisJCQkgICAgIGxlbiwKKwkJCSAgICAgJmRvbmUpOworCX0KKyAgICB9CisKKyAgaWYgKCFkbGxfbmFtZSkKKyAgICByZXR1cm4gMTsKKworICB3aGlsZSAoKHAgPSBzdHJjaHIgKGRsbF9uYW1lLCAnXFwnKSkpCisgICAgKnAgPSAnLyc7CisKKyAgLyogRklYTUUhISBJdCB3b3VsZCBiZSBuaWNlIHRvIGRlZmluZSBvbmUgc3ltYm9sIHdoaWNoIHBvaW50ZWQgdG8gdGhlCisgICAgIGZyb250IG9mIHRoZSBkbGwgaWYgd2UgY2FuJ3QgZmluZCBhbnkgc3ltYm9scy4gKi8KKworICBpZiAoIShkbGxfYmFzZW5hbWUgPSBzdHJyY2hyKGRsbF9uYW1lLCAnLycpKSkKKyAgICBkbGxfYmFzZW5hbWUgPSBkbGxfbmFtZTsKKyAgZWxzZQorICAgIGRsbF9iYXNlbmFtZSsrOworCisgIEFMTF9PQkpGSUxFUyhvYmpmaWxlKQorICAgIHsKKyAgICAgIGNoYXIgKm9iamZpbGVfYmFzZW5hbWU7CisgICAgICBvYmpmaWxlX2Jhc2VuYW1lID0gc3RycmNocihvYmpmaWxlLT5uYW1lLCAnLycpOworCisgICAgICBpZiAob2JqZmlsZV9iYXNlbmFtZSAmJgorCSAgc3RyY21wKGRsbF9iYXNlbmFtZSwgb2JqZmlsZV9iYXNlbmFtZSArIDEpID09IDApCisJeworCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCIleDolcyAoc3ltYm9scyBwcmV2aW91c2x5IGxvYWRlZClcbiIsCisJCQkgICAgIGV2ZW50LT5scEJhc2VPZkRsbCwgZGxsX25hbWUpOworCSAgZ290byBvdXQ7CisJfQorICB9CisKKyAgLyogVGhlIHN5bWJvbHMgaW4gYSBkbGwgYXJlIG9mZnNldCBieSAweDEwMDAsIHdoaWNoIGlzIHRoZQorICAgICB0aGUgb2Zmc2V0IGZyb20gMCBvZiB0aGUgZmlyc3QgYnl0ZSBpbiBhbiBpbWFnZSAtIGJlY2F1c2UKKyAgICAgb2YgdGhlIGZpbGUgaGVhZGVyIGFuZCB0aGUgc2VjdGlvbiBhbGlnbm1lbnQuCisKKyAgICAgRklYTUU6IElzIHRoaXMgdGhlIHJlYWwgcmVhc29uIHRoYXQgd2UgbmVlZCB0aGUgMHgxMDAwID8gKi8KKworICBwcmludGZfdW5maWx0ZXJlZCAoIiV4OiVzIiwgZXZlbnQtPmxwQmFzZU9mRGxsLCBkbGxfbmFtZSk7CisgIHN5bWJvbF9maWxlX2FkZCAoZGxsX25hbWUsIDAsIChpbnQpIGV2ZW50LT5scEJhc2VPZkRsbCArIDB4MTAwMCwgMCwgMCwgMCwgMCwgMSk7CisgIHByaW50Zl91bmZpbHRlcmVkICgiXG4iKTsKKworb3V0OgorICByZXR1cm4gMTsKK30KKworLyogSGFuZGxlIERFQlVHX1NUUklORyBvdXRwdXQgZnJvbSBjaGlsZCBwcm9jZXNzLgorICAgQ3lnd2luIHByZXBlbmRzIGl0cyBtZXNzYWdlcyB3aXRoIGEgImN5Z3dpbjoiLiAgSW50ZXJwcmV0IHRoaXMgYXMKKyAgIGEgQ3lnd2luIHNpZ25hbC4gIE90aGVyd2lzZSBqdXN0IHByaW50IHRoZSBzdHJpbmcgYXMgYSB3YXJuaW5nLiAqLworc3RhdGljIGludAoraGFuZGxlX291dHB1dF9kZWJ1Z19zdHJpbmcgKHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqb3Vyc3RhdHVzKQoreworICBjaGFyICpzOworICBpbnQgZ290YXNpZyA9IEZBTFNFOworCisgIGlmICghdGFyZ2V0X3JlYWRfc3RyaW5nCisgICAgICAoKENPUkVfQUREUikgY3VycmVudF9ldmVudC51LkRlYnVnU3RyaW5nLmxwRGVidWdTdHJpbmdEYXRhLCAmcywgMTAyNCwgMCkKKyAgICAgIHx8ICFzIHx8ICEqcykKKyAgICByZXR1cm4gZ290YXNpZzsKKworICBpZiAoc3RybmNtcChzLCBDWUdXSU5fU0lHTkFMX1NUUklORywgc2l6ZW9mKENZR1dJTl9TSUdOQUxfU1RSSU5HKSAtIDEpKQorICAgIHsKKyAgICAgIHdhcm5pbmcgKHMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgKnA7CisgICAgICAvKmxhc3Rfc2lnID0gKi9zdHJ0b2wocyArIHNpemVvZihDWUdXSU5fU0lHTkFMX1NUUklORykgLSAxLCAmcCwgMCk7CisgICAgICBpZiAoZ290YXNpZyA9IChvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IHRhcmdldF9zaWduYWxfZnJvbV9ob3N0IChsYXN0X3NpZykpKQorCW91cnN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOworICAgIH0KKworICBmcmVlIChzKTsKKyAgcmV0dXJuIGdvdGFzaWc7Cit9CisKK3N0YXRpYyBpbnQKK2hhbmRsZV9leGNlcHRpb24gKHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyAqb3Vyc3RhdHVzKQoreworICBpbnQgaTsKKyAgaW50IGRvbmUgPSAwOworICB0aHJlYWRfaW5mbyAqdGg7CisKKyAgb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7CisKKyAgLyogUmVjb3JkIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHRocmVhZCAqLworICB0aCA9IHRocmVhZF9yZWMgKGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwgLTEpOworCisgIHN3aXRjaCAoY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQ29kZSkKKyAgICB7CisgICAgY2FzZSBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTjoKKyAgICAgIERFQlVHX0VYQ0VQVCAoKCJnZGI6IFRhcmdldCBleGNlcHRpb24gQUNDRVNTX1ZJT0xBVElPTiBhdCAweCUwOHhcbiIsCisJCSAgICAgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcykpOworICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1NFR1Y7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNUQVRVU19TVEFDS19PVkVSRkxPVzoKKyAgICAgIERFQlVHX0VYQ0VQVCAoKCJnZGI6IFRhcmdldCBleGNlcHRpb24gU1RBQ0tfT1ZFUkZMT1cgYXQgMHglMDh4XG4iLAorCQkgICAgIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MpKTsKKyAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9TRUdWOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFWENFUFRJT05fQlJFQUtQT0lOVDoKKyAgICAgIERFQlVHX0VYQ0VQVCAoKCJnZGI6IFRhcmdldCBleGNlcHRpb24gQlJFQUtQT0lOVCBhdCAweCUwOHhcbiIsCisJCSAgICAgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcykpOworICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1RSQVA7CisgICAgICBicmVhazsKKyAgICBjYXNlIERCR19DT05UUk9MX0M6CisgICAgICBERUJVR19FWENFUFQgKCgiZ2RiOiBUYXJnZXQgZXhjZXB0aW9uIENPTlRST0xfQyBhdCAweCUwOHhcbiIsCisJCSAgICAgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcykpOworICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX0lOVDsKKyAgICAgIC8qIFVzZXIgdHlwZWQgQ1RSTC1DLiAgQ29udGludWUgd2l0aCB0aGlzIHN0YXR1cyAqLworICAgICAgbGFzdF9zaWcgPSBTSUdJTlQ7CS8qIEZJWE1FIC0gc2hvdWxkIGNoZWNrIHBhc3Mgc3RhdGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRVhDRVBUSU9OX1NJTkdMRV9TVEVQOgorICAgICAgREVCVUdfRVhDRVBUICgoImdkYjogVGFyZ2V0IGV4Y2VwdGlvbiBTSU5HTEVfU1RFUCBhdCAweCUwOHhcbiIsCisJCSAgICAgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcykpOworICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1RSQVA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLyogVGhpcyBtYXkgYmUgYSBzdHJ1Y3R1cmVkIGV4Y2VwdGlvbiBoYW5kbGluZyBleGNlcHRpb24uICBJbgorCSB0aGF0IGNhc2UsIHdlIHdhbnQgdG8gbGV0IHRoZSBwcm9ncmFtIHRyeSB0byBoYW5kbGUgaXQsIGFuZAorCSBvbmx5IGJyZWFrIGlmIHdlIHNlZSB0aGUgZXhjZXB0aW9uIGEgc2Vjb25kIHRpbWUuICAqLworICAgICAgaWYgKGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uZHdGaXJzdENoYW5jZSkKKwlyZXR1cm4gMDsKKworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJnZGI6IHVua25vd24gdGFyZ2V0IGV4Y2VwdGlvbiAweCUwOHggYXQgMHglMDh4XG4iLAorCQkJIGN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9uUmVjb3JkLkV4Y2VwdGlvbkNvZGUsCisJCQkgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcyk7CisgICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVU5LTk9XTjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgZXhjZXB0aW9uX2NvdW50Kys7CisgIHJldHVybiAxOworfQorCisvKiBSZXN1bWUgYWxsIGFydGlmaWNpYWxseSBzdXNwZW5kZWQgdGhyZWFkcyBpZiB3ZSBhcmUgY29udGludWluZworICAgZXhlY3V0aW9uICovCitzdGF0aWMgQk9PTAorY2hpbGRfY29udGludWUgKERXT1JEIGNvbnRpbnVlX3N0YXR1cywgaW50IGlkKQoreworICBpbnQgaTsKKyAgdGhyZWFkX2luZm8gKnRoOworICBCT09MIHJlczsKKworICBERUJVR19FVkVOVFMgKCgiQ29udGludWVEZWJ1Z0V2ZW50IChjcGlkPSVkLCBjdGlkPSVkLCBEQkdfQ09OVElOVUUpO1xuIiwKKwkJIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCkpOworICBpZiAocmVzID0gQ29udGludWVEZWJ1Z0V2ZW50IChjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLAorCQkJCWN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKKwkJCSAgICAgICAgY29udGludWVfc3RhdHVzKSkKKyAgICBmb3IgKHRoID0gJnRocmVhZF9oZWFkOyAodGggPSB0aC0+bmV4dCkgIT0gTlVMTDsgKQorICAgICAgaWYgKCgoaWQgPT0gLTEpIHx8IChpZCA9PSB0aC0+aWQpKSAmJiB0aC0+c3VzcGVuZF9jb3VudCkKKwl7CisJICBmb3IgKGkgPSAwOyBpIDwgdGgtPnN1c3BlbmRfY291bnQ7IGkrKykKKwkgICAgKHZvaWQpIFJlc3VtZVRocmVhZCAodGgtPmgpOworCSAgdGgtPnN1c3BlbmRfY291bnQgPSAwOworCX0KKworICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50CitjaGlsZF93YWl0IChpbnQgcGlkLCBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKm91cnN0YXR1cykKK3sKKyAgLyogV2UgbG9vcCB3aGVuIHdlIGdldCBhIG5vbi1zdGFuZGFyZCBleGNlcHRpb24gcmF0aGVyIHRoYW4gcmV0dXJuCisgICAgIHdpdGggYSBTUFVSSU9VUyBiZWNhdXNlIHJlc3VtZSBjYW4gdHJ5IGFuZCBzdGVwIG9yIG1vZGlmeSB0aGluZ3MsCisgICAgIHdoaWNoIG5lZWRzIGEgY3VycmVudF90aHJlYWQtPmguICBCdXQgc29tZSBvZiB0aGVzZSBleGNlcHRpb25zIG1hcmsKKyAgICAgdGhlIGJpcnRoIG9yIGRlYXRoIG9mIHRocmVhZHMsIHdoaWNoIG1lYW4gdGhhdCB0aGUgY3VycmVudCB0aHJlYWQKKyAgICAgaXNuJ3QgbmVjZXNzYXJpbHkgd2hhdCB5b3UgdGhpbmsgaXQgaXMuICovCisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgRFdPUkQgY29udGludWVfc3RhdHVzOworICAgICAgQk9PTCB0ID0gV2FpdEZvckRlYnVnRXZlbnQgKCZjdXJyZW50X2V2ZW50LCBJTkZJTklURSk7CisgICAgICBjaGFyICpwOworICAgICAgdGhyZWFkX2luZm8gKnRoOworICAgICAgaW50IHNpZzsKKworICAgICAgZXZlbnRfY291bnQrKzsKKworICAgICAgY29udGludWVfc3RhdHVzID0gREJHX0NPTlRJTlVFOworCisgICAgICBzd2l0Y2ggKGN1cnJlbnRfZXZlbnQuZHdEZWJ1Z0V2ZW50Q29kZSkKKwl7CisJY2FzZSBDUkVBVEVfVEhSRUFEX0RFQlVHX0VWRU5UOgorCSAgREVCVUdfRVZFTlRTICgoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSV4IGNvZGU9JXMpXG4iLAorCQkJY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAorCQkJIkNSRUFURV9USFJFQURfREVCVUdfRVZFTlQiKSk7CisJICAvKiBSZWNvcmQgdGhlIGV4aXN0ZW5jZSBvZiB0aGlzIHRocmVhZCAqLworCSAgY2hpbGRfYWRkX3RocmVhZCAoY3VycmVudF9ldmVudC5kd1RocmVhZElkLAorCQkJICAgIGN1cnJlbnRfZXZlbnQudS5DcmVhdGVUaHJlYWQuaFRocmVhZCk7CisJICBpZiAoaW5mb192ZXJib3NlKQorCSAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiW05ldyAlc11cbiIsCisJCQkgICAgICAgdGFyZ2V0X3BpZF90b19zdHIgKGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCkpOworCSAgYnJlYWs7CisKKwljYXNlIEVYSVRfVEhSRUFEX0RFQlVHX0VWRU5UOgorCSAgREVCVUdfRVZFTlRTICgoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSVkIGNvZGU9JXMpXG4iLAorCQkJY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAorCQkJIkVYSVRfVEhSRUFEX0RFQlVHX0VWRU5UIikpOworCSAgY2hpbGRfZGVsZXRlX3RocmVhZCAoY3VycmVudF9ldmVudC5kd1RocmVhZElkKTsKKwkgIGJyZWFrOworCisJY2FzZSBDUkVBVEVfUFJPQ0VTU19ERUJVR19FVkVOVDoKKwkgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKKwkJCWN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKKwkJCSJDUkVBVEVfUFJPQ0VTU19ERUJVR19FVkVOVCIpKTsKKwkgIGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUgPSBjdXJyZW50X2V2ZW50LnUuQ3JlYXRlUHJvY2Vzc0luZm8uaFByb2Nlc3M7CisKKwkgIG1haW5fdGhyZWFkX2lkID0gaW5mZXJpb3JfcGlkID0gY3VycmVudF9ldmVudC5kd1RocmVhZElkOworCSAgLyogQWRkIHRoZSBtYWluIHRocmVhZCAqLworCSAgY3VycmVudF90aHJlYWQgPSBjaGlsZF9hZGRfdGhyZWFkIChpbmZlcmlvcl9waWQsCisJCQkJY3VycmVudF9ldmVudC51LkNyZWF0ZVByb2Nlc3NJbmZvLmhUaHJlYWQpOworCSAgYnJlYWs7CisKKwljYXNlIEVYSVRfUFJPQ0VTU19ERUJVR19FVkVOVDoKKwkgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKKwkJCWN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKKwkJCSJFWElUX1BST0NFU1NfREVCVUdfRVZFTlQiKSk7CisJICBvdXJzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfRVhJVEVEOworCSAgb3Vyc3RhdHVzLT52YWx1ZS5pbnRlZ2VyID0gY3VycmVudF9ldmVudC51LkV4aXRQcm9jZXNzLmR3RXhpdENvZGU7CisJICBDbG9zZUhhbmRsZSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSk7CisJICByZXR1cm4gY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZDsKKwkgIGJyZWFrOworCisJY2FzZSBMT0FEX0RMTF9ERUJVR19FVkVOVDoKKwkgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKKwkJCWN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKKwkJCSJMT0FEX0RMTF9ERUJVR19FVkVOVCIpKTsKKyAgICAgICAgICBjYXRjaF9lcnJvcnMgKGhhbmRsZV9sb2FkX2RsbCwgTlVMTCwgIiIsIFJFVFVSTl9NQVNLX0FMTCk7CisJICByZWdpc3RlcnNfY2hhbmdlZCgpOyAgICAgICAgICAvKiBtYXJrIGFsbCByZWdzIGludmFsaWQgKi8KKwkgIGJyZWFrOworCisJY2FzZSBVTkxPQURfRExMX0RFQlVHX0VWRU5UOgorCSAgREVCVUdfRVZFTlRTICgoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSVkIGNvZGU9JXMpXG4iLAorCQkJY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAorCQkJIlVOTE9BRF9ETExfREVCVUdfRVZFTlQiKSk7CisJICBicmVhazsJLyogRklYTUU6IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlICovCisKKwljYXNlIEVYQ0VQVElPTl9ERUJVR19FVkVOVDoKKwkgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKKwkJCWN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKKwkJCSJFWENFUFRJT05fREVCVUdfRVZFTlQiKSk7CisJICBpZiAoaGFuZGxlX2V4Y2VwdGlvbiAob3Vyc3RhdHVzKSkKKwkgICAgcmV0dXJuIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZDsKKwkgIGNvbnRpbnVlX3N0YXR1cyA9IERCR19FWENFUFRJT05fTk9UX0hBTkRMRUQ7CisJICBicmVhazsKKworCWNhc2UgT1VUUFVUX0RFQlVHX1NUUklOR19FVkVOVDogLyogbWVzc2FnZSBmcm9tIHRoZSBrZXJuZWwgKi8KKwkgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKKwkJCWN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKKwkJCSJPVVRQVVRfREVCVUdfU1RSSU5HX0VWRU5UIikpOworCSAgaWYgKGhhbmRsZV9vdXRwdXRfZGVidWdfc3RyaW5nIChvdXJzdGF0dXMpKQorCSAgICByZXR1cm4gbWFpbl90aHJlYWRfaWQ7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgcHJpbnRmX3VuZmlsdGVyZWQgKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZFxuIiwKKwkJCSAgICAgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwKKwkJCSAgICAgY3VycmVudF9ldmVudC5kd1RocmVhZElkKTsKKwkgIHByaW50Zl91bmZpbHRlcmVkICgiICAgICAgICAgICAgICAgICB1bmtub3duIGV2ZW50IGNvZGUgJWRcbiIsCisJCQkgICAgIGN1cnJlbnRfZXZlbnQuZHdEZWJ1Z0V2ZW50Q29kZSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIENIRUNLIChjaGlsZF9jb250aW51ZSAoY29udGludWVfc3RhdHVzLCAtMSkpOworICAgIH0KK30KKworLyogQXR0YWNoIHRvIHByb2Nlc3MgUElELCB0aGVuIGluaXRpYWxpemUgZm9yIGRlYnVnZ2luZyBpdC4gICovCisKK3N0YXRpYyB2b2lkCitjaGlsZF9hdHRhY2ggKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIEJPT0wgb2s7CisKKyAgaWYgKCFhcmdzKQorICAgIGVycm9yX25vX2FyZyAoInByb2Nlc3MtaWQgdG8gYXR0YWNoIik7CisKKyAgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCA9IHN0cnRvdWwgKGFyZ3MsIDAsIDApOworCisgIG9rID0gRGVidWdBY3RpdmVQcm9jZXNzIChjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkKTsKKworICBpZiAoIW9rKQorICAgIGVycm9yICgiQ2FuJ3QgYXR0YWNoIHRvIHByb2Nlc3MuIik7CisKKyAgZXhjZXB0aW9uX2NvdW50ID0gMDsKKyAgZXZlbnRfY291bnQgPSAwOworCisgIGlmIChmcm9tX3R0eSkKKyAgICB7CisgICAgICBjaGFyICpleGVjX2ZpbGUgPSAoY2hhciAqKSBnZXRfZXhlY19maWxlICgwKTsKKworICAgICAgaWYgKGV4ZWNfZmlsZSkKKwlwcmludGZfdW5maWx0ZXJlZCAoIkF0dGFjaGluZyB0byBwcm9ncmFtIGAlcycsICVzXG4iLCBleGVjX2ZpbGUsCisJCQkgICB0YXJnZXRfcGlkX3RvX3N0ciAoY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCkpOworICAgICAgZWxzZQorCXByaW50Zl91bmZpbHRlcmVkICgiQXR0YWNoaW5nIHRvICVzXG4iLAorCQkJICAgdGFyZ2V0X3BpZF90b19zdHIgKGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQpKTsKKworICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgICB9CisKKyAgcHVzaF90YXJnZXQgKCZjaGlsZF9vcHMpOworfQorCitzdGF0aWMgdm9pZAorY2hpbGRfZGV0YWNoIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICBpZiAoZnJvbV90dHkpCisgICAgeworICAgICAgY2hhciAqZXhlY19maWxlID0gZ2V0X2V4ZWNfZmlsZSAoMCk7CisgICAgICBpZiAoZXhlY19maWxlID09IDApCisJZXhlY19maWxlID0gIiI7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIkRldGFjaGluZyBmcm9tIHByb2dyYW06ICVzICVzXG4iLCBleGVjX2ZpbGUsCisJCQkgdGFyZ2V0X3BpZF90b19zdHIgKGluZmVyaW9yX3BpZCkpOworICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKyAgICB9CisgIGluZmVyaW9yX3BpZCA9IDA7CisgIHVucHVzaF90YXJnZXQgKCZjaGlsZF9vcHMpOworfQorCisvKiBQcmludCBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCB3ZSdyZSBhY2Nlc3NpbmcuICAqLworCitzdGF0aWMgdm9pZAorY2hpbGRfZmlsZXNfaW5mbyAoaWdub3JlKQorICAgICBzdHJ1Y3QgdGFyZ2V0X29wcyAqaWdub3JlOworeworICBwcmludGZfdW5maWx0ZXJlZCAoIlx0VXNpbmcgdGhlIHJ1bm5pbmcgaW1hZ2Ugb2YgJXMgJXMuXG4iLAorICAgICAgYXR0YWNoX2ZsYWcgPyAiYXR0YWNoZWQiIDogImNoaWxkIiwgdGFyZ2V0X3BpZF90b19zdHIgKGluZmVyaW9yX3BpZCkpOworfQorCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK2NoaWxkX29wZW4gKGFyZywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICBlcnJvciAoIlVzZSB0aGUgXCJydW5cIiBjb21tYW5kIHRvIHN0YXJ0IGEgVW5peCBjaGlsZCBwcm9jZXNzLiIpOworfQorCisvKiBTdGFydCBhbiBpbmZlcmlvciB3aW4zMiBjaGlsZCBwcm9jZXNzIGFuZCBzZXRzIGluZmVyaW9yX3BpZCB0byBpdHMgcGlkLgorICAgRVhFQ19GSUxFIGlzIHRoZSBmaWxlIHRvIHJ1bi4KKyAgIEFMTEFSR1MgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgYXJndW1lbnRzIHRvIHRoZSBwcm9ncmFtLgorICAgRU5WIGlzIHRoZSBlbnZpcm9ubWVudCB2ZWN0b3IgdG8gcGFzcy4gIEVycm9ycyByZXBvcnRlZCB3aXRoIGVycm9yKCkuICAqLworCitzdGF0aWMgdm9pZAorY2hpbGRfY3JlYXRlX2luZmVyaW9yIChleGVjX2ZpbGUsIGFsbGFyZ3MsIGVudikKKyAgICAgY2hhciAqZXhlY19maWxlOworICAgICBjaGFyICphbGxhcmdzOworICAgICBjaGFyICoqZW52OworeworICBjaGFyIHJlYWxfcGF0aFtNQVhQQVRITEVOXTsKKyAgY2hhciAqd2luZW52OworICBjaGFyICp0ZW1wOworICBpbnQgIGVudmxlbjsKKyAgaW50IGk7CisKKyAgU1RBUlRVUElORk8gc2k7CisgIFBST0NFU1NfSU5GT1JNQVRJT04gcGk7CisgIHN0cnVjdCB0YXJnZXRfd2FpdHN0YXR1cyBkdW1teTsKKyAgQk9PTCByZXQ7CisgIERXT1JEIGZsYWdzOworICBjaGFyICphcmdzOworCisgIGlmICghZXhlY19maWxlKQorICAgIHsKKyAgICAgIGVycm9yICgiTm8gZXhlY3V0YWJsZSBzcGVjaWZpZWQsIHVzZSBgdGFyZ2V0IGV4ZWMnLlxuIik7CisgICAgfQorCisgIG1lbXNldCAoJnNpLCAwLCBzaXplb2YgKHNpKSk7CisgIHNpLmNiID0gc2l6ZW9mIChzaSk7CisKKyAgY3lnd2luMzJfY29udl90b193aW4zMl9wYXRoIChleGVjX2ZpbGUsIHJlYWxfcGF0aCk7CisKKyAgZmxhZ3MgPSBERUJVR19PTkxZX1RISVNfUFJPQ0VTUzsKKworICBpZiAobmV3X2dyb3VwKQorICAgIGZsYWdzIHw9IENSRUFURV9ORVdfUFJPQ0VTU19HUk9VUDsKKworICBpZiAobmV3X2NvbnNvbGUpCisgICAgZmxhZ3MgfD0gQ1JFQVRFX05FV19DT05TT0xFOworCisgIGFyZ3MgPSBhbGxvY2EgKHN0cmxlbiAocmVhbF9wYXRoKSArIHN0cmxlbiAoYWxsYXJncykgKyAyKTsKKworICBzdHJjcHkgKGFyZ3MsIHJlYWxfcGF0aCk7CisKKyAgc3RyY2F0IChhcmdzLCAiICIpOworICBzdHJjYXQgKGFyZ3MsIGFsbGFyZ3MpOworCisgIC8qIFByZXBhcmUgdGhlIGVudmlyb25tZW50IHZhcnMgZm9yIENyZWF0ZVByb2Nlc3MuICAqLworICB7CisgICAgLyogVGhpcyBjb2RlIHVzZSB0byBhc3N1bWUgYWxsIGVudiB2YXJzIHdlcmUgZmlsZSBuYW1lcyBhbmQgd291bGQKKyAgICAgICB0cmFuc2xhdGUgdGhlbSBhbGwgdG8gd2luMzIgc3R5bGUuICBUaGF0IG9idmlvdXNseSBkb2Vzbid0IHdvcmsgaW4gdGhlCisgICAgICAgZ2VuZXJhbCBjYXNlLiAgVGhlIGN1cnJlbnQgcnVsZSBpcyB0aGF0IHdlIG9ubHkgdHJhbnNsYXRlIFBBVEguCisgICAgICAgV2UgbmVlZCB0byBoYW5kbGUgUEFUSCBiZWNhdXNlIHdlJ3JlIGFib3V0IHRvIGNhbGwgQ3JlYXRlUHJvY2VzcyBhbmQKKyAgICAgICBpdCB1c2VzIFBBVEggdG8gZmluZCBETEwncy4gIEZvcnR1bmF0ZWx5IFBBVEggaGFzIGEgd2VsbC1kZWZpbmVkIHZhbHVlCisgICAgICAgaW4gYm90aCBwb3NpeCBhbmQgd2luMzIgZW52aXJvbm1lbnRzLiAgY3lnd2luLmRsbCB3aWxsIGNoYW5nZSBpdCBiYWNrCisgICAgICAgdG8gcG9zaXggc3R5bGUgaWYgbmVjZXNzYXJ5LiAgKi8KKworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb252X3BhdGhfbmFtZXNbXSA9CisgICAgICB7CisJIlBBVEg9IiwKKwkwCisgICAgICB9OworCisgICAgLyogQ3JlYXRlUHJvY2VzcyB0YWtlcyB0aGUgZW52aXJvbm1lbnQgbGlzdCBhcyBhIG51bGwgdGVybWluYXRlZCBzZXQgb2YKKyAgICAgICBzdHJpbmdzIChpLmUuIHR3byBudWxscyB0ZXJtaW5hdGUgdGhlIGxpc3QpLiAgKi8KKworICAgIC8qIEdldCB0b3RhbCBzaXplIGZvciBlbnYgc3RyaW5ncy4gICovCisgICAgZm9yIChlbnZsZW4gPSAwLCBpID0gMDsgZW52W2ldICYmICplbnZbaV07IGkrKykKKyAgICAgIHsKKwlpbnQgaiwgbGVuOworCisJZm9yIChqID0gMDsgY29udl9wYXRoX25hbWVzW2pdOyBqKyspCisJICB7CisJICAgIGxlbiA9IHN0cmxlbiAoY29udl9wYXRoX25hbWVzW2pdKTsKKwkgICAgaWYgKHN0cm5jbXAgKGNvbnZfcGF0aF9uYW1lc1tqXSwgZW52W2ldLCBsZW4pID09IDApCisJICAgICAgeworCQlpZiAoY3lnd2luMzJfcG9zaXhfcGF0aF9saXN0X3AgKGVudltpXSArIGxlbikpCisJCSAgZW52bGVuICs9IGxlbgorCQkgICAgKyBjeWd3aW4zMl9wb3NpeF90b193aW4zMl9wYXRoX2xpc3RfYnVmX3NpemUgKGVudltpXSArIGxlbik7CisJCWVsc2UKKwkJICBlbnZsZW4gKz0gc3RybGVuIChlbnZbaV0pICsgMTsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgfQorCWlmIChjb252X3BhdGhfbmFtZXNbal0gPT0gTlVMTCkKKwkgIGVudmxlbiArPSBzdHJsZW4gKGVudltpXSkgKyAxOworICAgICAgfQorCisgICAgd2luZW52ID0gYWxsb2NhIChlbnZsZW4gKyAxKTsKKworICAgIC8qIENvcHkgZW52IHN0cmluZ3MgaW50byBuZXcgYnVmZmVyLiAgKi8KKyAgICBmb3IgKHRlbXAgPSB3aW5lbnYsIGkgPSAwOyBlbnZbaV0gJiYgKmVudltpXTsgaSsrKQorICAgICAgeworCWludCBqLCBsZW47CisKKwlmb3IgKGogPSAwOyBjb252X3BhdGhfbmFtZXNbal07IGorKykKKwkgIHsKKwkgICAgbGVuID0gc3RybGVuIChjb252X3BhdGhfbmFtZXNbal0pOworCSAgICBpZiAoc3RybmNtcCAoY29udl9wYXRoX25hbWVzW2pdLCBlbnZbaV0sIGxlbikgPT0gMCkKKwkgICAgICB7CisJCWlmIChjeWd3aW4zMl9wb3NpeF9wYXRoX2xpc3RfcCAoZW52W2ldICsgbGVuKSkKKwkJICB7CisJCSAgICBtZW1jcHkgKHRlbXAsIGVudltpXSwgbGVuKTsKKwkJICAgIGN5Z3dpbjMyX3Bvc2l4X3RvX3dpbjMyX3BhdGhfbGlzdCAoZW52W2ldICsgbGVuLCB0ZW1wICsgbGVuKTsKKwkJICB9CisJCWVsc2UKKwkJICBzdHJjcHkgKHRlbXAsIGVudltpXSk7CisJCWJyZWFrOworCSAgICAgIH0KKwkgIH0KKwlpZiAoY29udl9wYXRoX25hbWVzW2pdID09IE5VTEwpCisJICBzdHJjcHkgKHRlbXAsIGVudltpXSk7CisKKwl0ZW1wICs9IHN0cmxlbiAodGVtcCkgKyAxOworICAgICAgfQorCisgICAgLyogRmluYWwgbmlsIHN0cmluZyB0byB0ZXJtaW5hdGUgbmV3IGVudi4gICovCisgICAgKnRlbXAgPSAwOworICB9CisKKyAgcmV0ID0gQ3JlYXRlUHJvY2VzcyAoMCwKKwkJICAgICAgIGFyZ3MsIAkvKiBjb21tYW5kIGxpbmUgKi8KKwkJICAgICAgIE5VTEwsCS8qIFNlY3VyaXR5ICovCisJCSAgICAgICBOVUxMLAkvKiB0aHJlYWQgKi8KKwkJICAgICAgIFRSVUUsCS8qIGluaGVyaXQgaGFuZGxlcyAqLworCQkgICAgICAgZmxhZ3MsCS8qIHN0YXJ0IGZsYWdzICovCisJCSAgICAgICB3aW5lbnYsCisJCSAgICAgICBOVUxMLAkvKiBjdXJyZW50IGRpcmVjdG9yeSAqLworCQkgICAgICAgJnNpLAorCQkgICAgICAgJnBpKTsKKyAgaWYgKCFyZXQpCisgICAgZXJyb3IgKCJFcnJvciBjcmVhdGluZyBwcm9jZXNzICVzLCAoZXJyb3IgJWQpXG4iLCBleGVjX2ZpbGUsIEdldExhc3RFcnJvcigpKTsKKworICBleGNlcHRpb25fY291bnQgPSAwOworICBldmVudF9jb3VudCA9IDA7CisKKyAgY3VycmVudF9wcm9jZXNzX2hhbmRsZSA9IHBpLmhQcm9jZXNzOworICBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkID0gcGkuZHdQcm9jZXNzSWQ7CisgIG1lbXNldCAoJmN1cnJlbnRfZXZlbnQsIDAsIHNpemVvZiAoY3VycmVudF9ldmVudCkpOworICBpbmZlcmlvcl9waWQgPSBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQgPSBwaS5kd1RocmVhZElkOworICBwdXNoX3RhcmdldCAoJmNoaWxkX29wcyk7CisgIGNoaWxkX2luaXRfdGhyZWFkX2xpc3QgKCk7CisgIGluaXRfd2FpdF9mb3JfaW5mZXJpb3IgKCk7CisgIGNsZWFyX3Byb2NlZWRfc3RhdHVzICgpOworICB0YXJnZXRfdGVybWluYWxfaW5pdCAoKTsKKyAgdGFyZ2V0X3Rlcm1pbmFsX2luZmVyaW9yICgpOworCisgIC8qIElnbm9yZSB0aGUgZmlyc3QgdHJhcCAqLworICBjaGlsZF93YWl0IChpbmZlcmlvcl9waWQsICZkdW1teSk7CisKKyAgcHJvY2VlZCAoKENPUkVfQUREUikgLSAxLCBUQVJHRVRfU0lHTkFMXzAsIDApOworfQorCitzdGF0aWMgdm9pZAorY2hpbGRfbW91cm5faW5mZXJpb3IgKCkKK3sKKyAgKHZvaWQpIGNoaWxkX2NvbnRpbnVlIChEQkdfQ09OVElOVUUsIC0xKTsKKyAgdW5wdXNoX3RhcmdldCAoJmNoaWxkX29wcyk7CisgIGdlbmVyaWNfbW91cm5faW5mZXJpb3IgKCk7Cit9CisKKy8qIFNlbmQgYSBTSUdJTlQgdG8gdGhlIHByb2Nlc3MgZ3JvdXAuICBUaGlzIGFjdHMganVzdCBsaWtlIHRoZSB1c2VyIHR5cGVkIGEKKyAgIF5DIG9uIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbC4gKi8KKworc3RhdGljIHZvaWQKK2NoaWxkX3N0b3AgKCkKK3sKKyAgREVCVUdfRVZFTlRTICgoImdkYjogR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50IChDVFJMQ19FVkVOVCwgMClcbiIpKTsKKyAgQ0hFQ0sgKEdlbmVyYXRlQ29uc29sZUN0cmxFdmVudCAoQ1RSTF9DX0VWRU5ULCAwKSk7CisgIHJlZ2lzdGVyc19jaGFuZ2VkKCk7CQkvKiByZWZyZXNoIHJlZ2lzdGVyIHN0YXRlICovCit9CisKK2ludAorY2hpbGRfeGZlcl9tZW1vcnkgKENPUkVfQUREUiBtZW1hZGRyLCBjaGFyICpvdXIsIGludCBsZW4sCisJCSAgIGludCB3cml0ZSwgc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldCkKK3sKKyAgRFdPUkQgZG9uZTsKKyAgaWYgKHdyaXRlKQorICAgIHsKKyAgICAgIERFQlVHX01FTSAoKCJnZGI6IHdyaXRlIHRhcmdldCBtZW1vcnksICVkIGJ5dGVzIGF0IDB4JTA4eFxuIiwKKwkJICBsZW4sIG1lbWFkZHIpKTsKKyAgICAgIFdyaXRlUHJvY2Vzc01lbW9yeSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwgKExQVk9JRCkgbWVtYWRkciwgb3VyLAorCQkJICBsZW4sICZkb25lKTsKKyAgICAgIEZsdXNoSW5zdHJ1Y3Rpb25DYWNoZSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwgKExQQ1ZPSUQpIG1lbWFkZHIsIGxlbik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgREVCVUdfTUVNICgoImdkYjogcmVhZCB0YXJnZXQgbWVtb3J5LCAlZCBieXRlcyBhdCAweCUwOHhcbiIsCisJCSAgbGVuLCBtZW1hZGRyKSk7CisgICAgICBSZWFkUHJvY2Vzc01lbW9yeSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwgKExQQ1ZPSUQpIG1lbWFkZHIsIG91ciwgbGVuLAorCQkJICZkb25lKTsKKyAgICB9CisgIHJldHVybiBkb25lOworfQorCit2b2lkCitjaGlsZF9raWxsX2luZmVyaW9yICh2b2lkKQoreworICBDSEVDSyAoVGVybWluYXRlUHJvY2VzcyAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwgMCkpOworCisgIGZvciAoOzspCisgICAgeworICAgICAgaWYgKCFjaGlsZF9jb250aW51ZSAoREJHX0NPTlRJTlVFLCAtMSkpCisJYnJlYWs7CisgICAgICBpZiAoIVdhaXRGb3JEZWJ1Z0V2ZW50ICgmY3VycmVudF9ldmVudCwgSU5GSU5JVEUpKQorCWJyZWFrOworICAgICAgaWYgKGN1cnJlbnRfZXZlbnQuZHdEZWJ1Z0V2ZW50Q29kZSA9PSBFWElUX1BST0NFU1NfREVCVUdfRVZFTlQpCisJYnJlYWs7CisgICAgfQorCisgIENIRUNLIChDbG9zZUhhbmRsZSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSkpOworCisgIC8qIHRoaXMgbWF5IGZhaWwgaW4gYW4gYXR0YWNoZWQgcHJvY2VzcyBzbyBkb24ndCBjaGVjay4gKi8KKyAgKHZvaWQpIENsb3NlSGFuZGxlIChjdXJyZW50X3RocmVhZC0+aCk7CisgIHRhcmdldF9tb3Vybl9pbmZlcmlvcigpOwkvKiBvciBqdXN0IGNoaWxkX21vdXJuX2luZmVyaW9yPyAqLworfQorCit2b2lkCitjaGlsZF9yZXN1bWUgKGludCBwaWQsIGludCBzdGVwLCBlbnVtIHRhcmdldF9zaWduYWwgc2lnKQoreworICBpbnQgaTsKKyAgdGhyZWFkX2luZm8gKnRoOworICBEV09SRCBjb250aW51ZV9zdGF0dXMgPSBsYXN0X3NpZyA+IDAgJiYgbGFzdF9zaWcgPCBOU0lHID8KKwkJCSAgREJHX0VYQ0VQVElPTl9OT1RfSEFORExFRCA6IERCR19DT05USU5VRTsKKworICBERUJVR19FWEVDICgoImdkYjogY2hpbGRfcmVzdW1lIChwaWQ9JWQsIHN0ZXA9JWQsIHNpZz0lZCk7XG4iLAorCSAgICAgICBwaWQsIHN0ZXAsIHNpZykpOworCisgIC8qIEdldCBjb250ZXh0IGZvciBjdXJyZW50bHkgc2VsZWN0ZWQgdGhyZWFkICovCisgIHRoID0gdGhyZWFkX3JlYyAoY3VycmVudF9ldmVudC5kd1RocmVhZElkLCBGQUxTRSk7CisgIGlmIChzdGVwKQorICAgIHsKKyNpZmRlZiBpMzg2CisgICAgICAvKiBTaW5nbGUgc3RlcCBieSBzZXR0aW5nIHQgYml0ICovCisgICAgICBjaGlsZF9mZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKFBTX1JFR05VTSk7CisgICAgICB0aC0+Y29udGV4dC5FRmxhZ3MgfD0gRkxBR19UUkFDRV9CSVQ7CisjZW5kaWYKKyAgICB9CisKKyAgaWYgKHRoLT5jb250ZXh0LkNvbnRleHRGbGFncykKKyAgICB7CisgICAgICBDSEVDSyAoU2V0VGhyZWFkQ29udGV4dCAodGgtPmgsICZ0aC0+Y29udGV4dCkpOworICAgICAgdGgtPmNvbnRleHQuQ29udGV4dEZsYWdzID0gMDsKKyAgICB9CisKKyAgLyogQWxsb3cgY29udGludWluZyB3aXRoIHRoZSBzYW1lIHNpZ25hbCB0aGF0IGludGVycnVwdGVkIHVzLgorICAgICBPdGhlcndpc2UgY29tcGxhaW4uICovCisgIGlmIChzaWcgJiYgc2lnICE9IGxhc3Rfc2lnKQorICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgIkNhbid0IHNlbmQgc2lnbmFscyB0byB0aGUgY2hpbGQuICBzaWduYWwgJWRcbiIsIHNpZyk7CisKKyAgbGFzdF9zaWcgPSAwOworICBjaGlsZF9jb250aW51ZSAoY29udGludWVfc3RhdHVzLCBwaWQpOworfQorCitzdGF0aWMgdm9pZAorY2hpbGRfcHJlcGFyZV90b19zdG9yZSAoKQoreworICAvKiBEbyBub3RoaW5nLCBzaW5jZSB3ZSBjYW4gc3RvcmUgaW5kaXZpZHVhbCByZWdzICovCit9CisKK3N0YXRpYyBpbnQKK2NoaWxkX2Nhbl9ydW4gKCkKK3sKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitjaGlsZF9jbG9zZSAoKQoreworICBERUJVR19FVkVOVFMgKCgiZ2RiOiBjaGlsZF9jbG9zZSwgaW5mZXJpb3JfcGlkPSVkXG4iLCBpbmZlcmlvcl9waWQpKTsKK30KKworc3RydWN0IHRhcmdldF9vcHMgY2hpbGRfb3BzIDsKKworc3RhdGljIHZvaWQgCitpbml0X2NoaWxkX29wcyh2b2lkKQoreworICBjaGlsZF9vcHMudG9fc2hvcnRuYW1lID0gICAiY2hpbGQiOworICBjaGlsZF9vcHMudG9fbG9uZ25hbWUgPSAgICJXaW4zMiBjaGlsZCBwcm9jZXNzIjsKKyAgY2hpbGRfb3BzLnRvX2RvYyA9ICAgIldpbjMyIGNoaWxkIHByb2Nlc3MgKHN0YXJ0ZWQgYnkgdGhlIFwicnVuXCIgY29tbWFuZCkuIjsKKyAgY2hpbGRfb3BzLnRvX29wZW4gPSAgIGNoaWxkX29wZW47CisgIGNoaWxkX29wcy50b19jbG9zZSA9ICAgY2hpbGRfY2xvc2U7CisgIGNoaWxkX29wcy50b19hdHRhY2ggPSAgIGNoaWxkX2F0dGFjaDsKKyAgY2hpbGRfb3BzLnRvX2RldGFjaCA9ICAgY2hpbGRfZGV0YWNoOworICBjaGlsZF9vcHMudG9fcmVzdW1lID0gICBjaGlsZF9yZXN1bWU7CisgIGNoaWxkX29wcy50b193YWl0ICA9ICAgY2hpbGRfd2FpdDsKKyAgY2hpbGRfb3BzLnRvX2ZldGNoX3JlZ2lzdGVycyAgPSAgIGNoaWxkX2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVyczsKKyAgY2hpbGRfb3BzLnRvX3N0b3JlX3JlZ2lzdGVycyAgPSAgIGNoaWxkX3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVyczsKKyAgY2hpbGRfb3BzLnRvX3ByZXBhcmVfdG9fc3RvcmUgPSAgIGNoaWxkX3ByZXBhcmVfdG9fc3RvcmU7CisgIGNoaWxkX29wcy50b194ZmVyX21lbW9yeSAgPSAgIGNoaWxkX3hmZXJfbWVtb3J5OworICBjaGlsZF9vcHMudG9fZmlsZXNfaW5mbyAgPSAgIGNoaWxkX2ZpbGVzX2luZm87CisgIGNoaWxkX29wcy50b19pbnNlcnRfYnJlYWtwb2ludCA9ICAgbWVtb3J5X2luc2VydF9icmVha3BvaW50OworICBjaGlsZF9vcHMudG9fcmVtb3ZlX2JyZWFrcG9pbnQgPSAgIG1lbW9yeV9yZW1vdmVfYnJlYWtwb2ludDsKKyAgY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX2luaXQgID0gICB0ZXJtaW5hbF9pbml0X2luZmVyaW9yOworICBjaGlsZF9vcHMudG9fdGVybWluYWxfaW5mZXJpb3IgPSAgIHRlcm1pbmFsX2luZmVyaW9yOworICBjaGlsZF9vcHMudG9fdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0ID0gICB0ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQ7CisgIGNoaWxkX29wcy50b190ZXJtaW5hbF9vdXJzICA9ICAgdGVybWluYWxfb3VyczsKKyAgY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX2luZm8gID0gICBjaGlsZF90ZXJtaW5hbF9pbmZvOworICBjaGlsZF9vcHMudG9fa2lsbCAgPSAgIGNoaWxkX2tpbGxfaW5mZXJpb3I7CisgIGNoaWxkX29wcy50b19sb2FkICA9ICAgMDsKKyAgY2hpbGRfb3BzLnRvX2xvb2t1cF9zeW1ib2wgPSAgIDA7CisgIGNoaWxkX29wcy50b19jcmVhdGVfaW5mZXJpb3IgPSAgIGNoaWxkX2NyZWF0ZV9pbmZlcmlvcjsKKyAgY2hpbGRfb3BzLnRvX21vdXJuX2luZmVyaW9yID0gICBjaGlsZF9tb3Vybl9pbmZlcmlvcjsKKyAgY2hpbGRfb3BzLnRvX2Nhbl9ydW4gID0gICBjaGlsZF9jYW5fcnVuOworICBjaGlsZF9vcHMudG9fbm90aWNlX3NpZ25hbHMgPSAgIDA7CisgIGNoaWxkX29wcy50b190aHJlYWRfYWxpdmUgID0gICB3aW4zMl9jaGlsZF90aHJlYWRfYWxpdmU7CisgIGNoaWxkX29wcy50b19zdG9wICA9ICAgY2hpbGRfc3RvcDsKKyAgY2hpbGRfb3BzLnRvX3N0cmF0dW0gPSAgIHByb2Nlc3Nfc3RyYXR1bTsKKyAgY2hpbGRfb3BzLkRPTlRfVVNFID0gICAwOworICBjaGlsZF9vcHMudG9faGFzX2FsbF9tZW1vcnkgPSAgIDE7CisgIGNoaWxkX29wcy50b19oYXNfbWVtb3J5ID0gICAxOworICBjaGlsZF9vcHMudG9faGFzX3N0YWNrID0gICAxOworICBjaGlsZF9vcHMudG9faGFzX3JlZ2lzdGVycyA9ICAgMTsKKyAgY2hpbGRfb3BzLnRvX2hhc19leGVjdXRpb24gPSAgIDE7CisgIGNoaWxkX29wcy50b19zZWN0aW9ucyA9ICAgMDsKKyAgY2hpbGRfb3BzLnRvX3NlY3Rpb25zX2VuZCA9ICAgMDsKKyAgY2hpbGRfb3BzLnRvX21hZ2ljID0gICBPUFNfTUFHSUM7Cit9CisKK3ZvaWQKK19pbml0aWFsaXplX2luZnRhcmcgKCkKK3sKKyAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7CisgIGluaXRfY2hpbGRfb3BzKCkgOworCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgibmV3LWNvbnNvbGUiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKKwkJICAoY2hhciAqKSAmbmV3X2NvbnNvbGUsCisJCSAgIlNldCBjcmVhdGlvbiBvZiBuZXcgY29uc29sZSB3aGVuIGNyZWF0aW5nIGNoaWxkIHByb2Nlc3MuIiwKKwkJICAmc2V0bGlzdCksCisgICAgICZzaG93bGlzdCk7CisKKyAgYWRkX3Nob3dfZnJvbV9zZXQKKyAgICAoYWRkX3NldF9jbWQgKCJuZXctZ3JvdXAiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKKwkJICAoY2hhciAqKSAmbmV3X2dyb3VwLAorCQkgICJTZXQgY3JlYXRpb24gb2YgbmV3IGdyb3VwIHdoZW4gY3JlYXRpbmcgY2hpbGQgcHJvY2Vzcy4iLAorCQkgICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoImRlYnVnZXhlYyIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLAorCQkgIChjaGFyICopICZkZWJ1Z19leGVjLAorCQkgICJTZXQgd2hldGhlciB0byBkaXNwbGF5IGV4ZWN1dGlvbiBpbiBjaGlsZCBwcm9jZXNzLiIsCisJCSAgJnNldGxpc3QpLAorICAgICAmc2hvd2xpc3QpOworCisgIGFkZF9zaG93X2Zyb21fc2V0CisgICAgKGFkZF9zZXRfY21kICgiZGVidWdldmVudHMiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKKwkJICAoY2hhciAqKSAmZGVidWdfZXZlbnRzLAorCQkgICJTZXQgd2hldGhlciB0byBkaXNwbGF5IGtlcm5lbCBldmVudHMgaW4gY2hpbGQgcHJvY2Vzcy4iLAorCQkgICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoImRlYnVnbWVtb3J5IiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCisJCSAgKGNoYXIgKikgJmRlYnVnX21lbW9yeSwKKwkJICAiU2V0IHdoZXRoZXIgdG8gZGlzcGxheSBtZW1vcnkgYWNjZXNzZXMgaW4gY2hpbGQgcHJvY2Vzcy4iLAorCQkgICZzZXRsaXN0KSwKKyAgICAgJnNob3dsaXN0KTsKKworICBhZGRfc2hvd19mcm9tX3NldAorICAgIChhZGRfc2V0X2NtZCAoImRlYnVnZXhjZXB0aW9ucyIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLAorCQkgIChjaGFyICopICZkZWJ1Z19leGNlcHRpb25zLAorCQkgICJTZXQgd2hldGhlciB0byBkaXNwbGF5IGtlcm5lbCBleGNlcHRpb25zIGluIGNoaWxkIHByb2Nlc3MuIiwKKwkJICAmc2V0bGlzdCksCisgICAgICZzaG93bGlzdCk7CisKKyAgYWRkX3RhcmdldCAoJmNoaWxkX29wcyk7Cit9CisKKy8qIERldGVybWluZSBpZiB0aGUgdGhyZWFkIHJlZmVyZW5jZWQgYnkgInBpZCIgaXMgYWxpdmUKKyAgIGJ5ICJwb2xsaW5nIiBpdC4gIElmIFdhaXRGb3JTaW5nbGVPYmplY3QgcmV0dXJucyBXQUlUX09CSkVDVF8wCisgICBpdCBtZWFucyB0aGF0IHRoZSBwaWQgaGFzIGRpZWQuICBPdGhlcndpc2UgaXQgaXMgYXNzdW1lZCB0byBiZSBhbGl2ZS4gKi8KK3N0YXRpYyBpbnQKK3dpbjMyX2NoaWxkX3RocmVhZF9hbGl2ZSAoaW50IHBpZCkKK3sKKyAgcmV0dXJuIFdhaXRGb3JTaW5nbGVPYmplY3QodGhyZWFkX3JlYyAocGlkLCBGQUxTRSktPmgsIDApID09IFdBSVRfT0JKRUNUXzAgPworCSBGQUxTRSA6IFRSVUU7Cit9CisKKy8qIENvbnZlcnQgcGlkIHRvIHByaW50YWJsZSBmb3JtYXQuICovCitjaGFyICoKK2N5Z3dpbl9waWRfdG9fc3RyIChpbnQgcGlkKQoreworICBzdGF0aWMgY2hhciBidWZbODBdOworICBpZiAocGlkID09IGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQpCisgICAgc3ByaW50ZiAoYnVmLCAicHJvY2VzcyAlZCIsIHBpZCk7CisgIGVsc2UKKyAgICBzcHJpbnRmIChidWYsICJ0aHJlYWQgJWQuMHgleCIsIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIHBpZCk7CisgIHJldHVybiBidWY7Cit9CmRpZmYgLS1naXQgYS9nZGIveGNvZmZyZWFkLmMgYi9nZGIveGNvZmZyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNmOTM3MQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi94Y29mZnJlYWQuYwpAQCAtMCwwICsxLDI4MTEgQEAKKy8qIFJlYWQgQUlYIHhjb2ZmIHN5bWJvbCB0YWJsZXMgYW5kIGNvbnZlcnQgdG8gaW50ZXJuYWwgZm9ybWF0LCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5ODYsIDg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3CisgICAJICAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIERlcml2ZWQgZnJvbSBjb2ZmcmVhZC5jLCBkYnhyZWFkLmMsIGFuZCBhIGxvdCBvZiBoYWNraW5nLgorICAgQ29udHJpYnV0ZWQgYnkgSUJNIENvcnBvcmF0aW9uLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiYmZkLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaWZuZGVmCU5PX1NZU19GSUxFCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNlbmRpZgorI2luY2x1ZGUgImdkYl9zdGF0LmgiCisKKyNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliY29mZi5oIgkJLyogRklYTUUsIGludGVybmFsIGRhdGEgZnJvbSBCRkQgKi8KKyNpbmNsdWRlICJjb2ZmL3JzNjAwMC5oIgorCisjaW5jbHVkZSAic3ltdGFiLmgiCisjaW5jbHVkZSAiZ2RidHlwZXMuaCIKKyNpbmNsdWRlICJzeW1maWxlLmgiCisjaW5jbHVkZSAib2JqZmlsZXMuaCIKKyNpbmNsdWRlICJidWlsZHN5bS5oIgorI2luY2x1ZGUgInN0YWJzcmVhZC5oIgorI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgkJLyogTmVlZGVkIGluc2lkZSBwYXJ0aWFsLXN0YWIuaCAqLworI2luY2x1ZGUgImNvbXBsYWludHMuaCIKKworI2luY2x1ZGUgImdkYi1zdGFicy5oIgorCisvKiBGb3IgaW50ZXJmYWNlIHdpdGggc3RhYnNyZWFkLmMuICAqLworI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKKworLyogRm9yIGludGVyZmFjZSB3aXRoIHBhcnRpYWwtc3RhYi5oLiAgKi8KKyNkZWZpbmUgTl9VTkRGCTAJLyogVW5kZWZpbmVkIHN5bWJvbCAqLworI3VuZGVmIE5fQUJTCisjZGVmaW5lIE5fQUJTIDIKKyNkZWZpbmUgTl9URVhUIAk0CS8qIFRleHQgc3ltIC0tIGRlZmluZWQgYXQgb2Zmc2V0IGluIHRleHQgc2VnICovCisjZGVmaW5lIE5fREFUQSAJNgkvKiBEYXRhIHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiBkYXRhIHNlZyAqLworI2RlZmluZSBOX0JTUyAJOAkvKiBCU1MgIHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiB6ZXJvJ2Qgc2VnICovCisjZGVmaW5lCU5fQ09NTQkweDEyCS8qIENvbW1vbiBzeW1ib2wgKHZpc2libGUgYWZ0ZXIgc2hhcmVkIGxpYiBkeW5saW5rKSAqLworI2RlZmluZSBOX0ZOCTB4MWYJLyogRmlsZSBuYW1lIG9mIC5vIGZpbGUgKi8KKyNkZWZpbmUJTl9GTl9TRVEgMHgwQwkvKiBOX0ZOIGZyb20gU2VxdWVudCBjb21waWxlcnMgKHNpZ2gpICovCisvKiBOb3RlOiBOX0VYVCBjYW4gb25seSBiZSB1c2VmdWxseSBPUi1lZCB3aXRoIE5fVU5ERiwgTl9BQlMsIE5fVEVYVCwKKyAgIE5fREFUQSwgb3IgTl9CU1MuICBXaGVuIHRoZSBsb3ctb3JkZXIgYml0IG9mIG90aGVyIHR5cGVzIGlzIHNldCwKKyAgIChlLmcuIE5fV0FSTklORyB2ZXJzdXMgTl9GTiksIHRoZXkgYXJlIHR3byBkaWZmZXJlbnQgdHlwZXMuICAqLworI2RlZmluZSBOX0VYVCAJMQkvKiBFeHRlcm5hbCBzeW1ib2wgKGFzIG9wcG9zZWQgdG8gbG9jYWwtdG8tdGhpcy1maWxlKSAqLworI2RlZmluZSBOX0lORFIgMHgwYQorCisvKiBUaGUgZm9sbG93aW5nIHN5bWJvbHMgcmVmZXIgdG8gc2V0IGVsZW1lbnRzLgorICAgQWxsIHRoZSBOX1NFVFtBVERCXSBzeW1ib2xzIHdpdGggdGhlIHNhbWUgbmFtZSBmb3JtIG9uZSBzZXQuCisgICBTcGFjZSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBzZXQgaW4gdGhlIHRleHQgc2VjdGlvbiwgYW5kIGVhY2ggc2V0CisgICBlbGVtZW50cyB2YWx1ZSBpcyBzdG9yZWQgaW50byBvbmUgd29yZCBvZiB0aGUgc3BhY2UuCisgICBUaGUgZmlyc3Qgd29yZCBvZiB0aGUgc3BhY2UgaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2V0IChudW1iZXIgb2YgZWxlbWVudHMpLgorCisgICBUaGUgYWRkcmVzcyBvZiB0aGUgc2V0IGlzIG1hZGUgaW50byBhbiBOX1NFVFYgc3ltYm9sCisgICB3aG9zZSBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBzZXQuCisgICBUaGlzIHN5bWJvbCBhY3RzIGxpa2UgYSBOX0RBVEEgZ2xvYmFsIHN5bWJvbAorICAgaW4gdGhhdCBpdCBjYW4gc2F0aXNmeSB1bmRlZmluZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcy4gICovCisKKy8qIFRoZXNlIGFwcGVhciBhcyBpbnB1dCB0byBMRCwgaW4gYSAubyBmaWxlLiAgKi8KKyNkZWZpbmUJTl9TRVRBCTB4MTQJCS8qIEFic29sdXRlIHNldCBlbGVtZW50IHN5bWJvbCAqLworI2RlZmluZQlOX1NFVFQJMHgxNgkJLyogVGV4dCBzZXQgZWxlbWVudCBzeW1ib2wgKi8KKyNkZWZpbmUJTl9TRVRECTB4MTgJCS8qIERhdGEgc2V0IGVsZW1lbnQgc3ltYm9sICovCisjZGVmaW5lCU5fU0VUQgkweDFBCQkvKiBCc3Mgc2V0IGVsZW1lbnQgc3ltYm9sICovCisKKy8qIFRoaXMgaXMgb3V0cHV0IGZyb20gTEQuICAqLworI2RlZmluZSBOX1NFVFYJMHgxQwkJLyogUG9pbnRlciB0byBzZXQgdmVjdG9yIGluIGRhdGEgYXJlYS4gICovCisMCisvKiBXZSBwdXQgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlIGluIHRoZSByZWFkX3N5bXRhYl9wcml2YXRlIGZpZWxkCisgICBvZiB0aGUgcHN5bXRhYi4gICovCisKK3N0cnVjdCBzeW1sb2MgeworCisgIC8qIEZpcnN0IHN5bWJvbCBudW1iZXIgZm9yIHRoaXMgZmlsZS4gICovCisKKyAgaW50IGZpcnN0X3N5bW51bTsKKworICAvKiBOdW1iZXIgb2Ygc3ltYm9scyBpbiB0aGUgc2VjdGlvbiBvZiB0aGUgc3ltYm9sIHRhYmxlIGRldm90ZWQgdG8KKyAgICAgdGhpcyBmaWxlJ3Mgc3ltYm9scyAoYWN0dWFsbHksIHRoZSBzZWN0aW9uIGJyYWNrZXRlZCBtYXkgY29udGFpbgorICAgICBtb3JlIHRoYW4ganVzdCB0aGlzIGZpbGUncyBzeW1ib2xzKS4gIElmIG51bXN5bXMgaXMgMCwgdGhlIG9ubHkKKyAgICAgcmVhc29uIGZvciB0aGlzIHRoaW5nJ3MgZXhpc3RlbmNlIGlzIHRoZSBkZXBlbmRlbmN5IGxpc3QuICBOb3RoaW5nCisgICAgIGVsc2Ugd2lsbCBoYXBwZW4gd2hlbiBpdCBpcyByZWFkIGluLiAgKi8KKworICBpbnQgbnVtc3ltczsKKworICAvKiBQb3NpdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIHBzeW10YWIuICAqLworICB1bnNpZ25lZCBpbnQgbGluZW5vX29mZjsKK307CisKKy8qIFJlbWVtYmVyIHdoYXQgd2UgZGVkdWNlZCB0byBiZSB0aGUgc291cmNlIGxhbmd1YWdlIG9mIHRoaXMgcHN5bXRhYi4gKi8KKworc3RhdGljIGVudW0gbGFuZ3VhZ2UgcHN5bXRhYl9sYW5ndWFnZSA9IGxhbmd1YWdlX3Vua25vd247CisKKwwKKy8qIFNpbXBsaWZpZWQgaW50ZXJuYWwgdmVyc2lvbiBvZiBjb2ZmIHN5bWJvbCB0YWJsZSBpbmZvcm1hdGlvbiAqLworCitzdHJ1Y3QgY29mZl9zeW1ib2wgeworICBjaGFyICpjX25hbWU7CisgIGludCBjX3N5bW51bTsJCS8qIHN5bWJvbCBudW1iZXIgb2YgdGhpcyBlbnRyeSAqLworICBpbnQgY19uYXV4OwkJLyogMCBpZiBzeW1lbnQgb25seSwgMSBpZiBzeW1lbnQgKyBhdXhlbnQgKi8KKyAgbG9uZyBjX3ZhbHVlOworICB1bnNpZ25lZCBjaGFyIGNfc2NsYXNzOworICBpbnQgY19zZWNudW07CisgIHVuc2lnbmVkIGludCBjX3R5cGU7Cit9OworCisvKiBsYXN0IGZ1bmN0aW9uJ3Mgc2F2ZWQgY29mZiBzeW1ib2wgYGNzJyAqLworCitzdGF0aWMgc3RydWN0IGNvZmZfc3ltYm9sIGZjbl9jc19zYXZlZDsKKworc3RhdGljIGJmZCAqc3ltZmlsZV9iZmQ7CisKKy8qIENvcmUgYWRkcmVzcyBvZiBzdGFydCBhbmQgZW5kIG9mIHRleHQgb2YgY3VycmVudCBzb3VyY2UgZmlsZS4KKyAgIFRoaXMgaXMgY2FsY3VsYXRlZCBmcm9tIHRoZSBmaXJzdCBmdW5jdGlvbiBzZWVuIGFmdGVyIGEgQ19GSUxFCisgICBzeW1ib2wuICovCisKKworc3RhdGljIENPUkVfQUREUiBjdXJfc3JjX2VuZF9hZGRyOworCisvKiBDb3JlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUuICAqLworCitzdGF0aWMgQ09SRV9BRERSIGZpcnN0X29iamVjdF9maWxlX2VuZDsKKworLyogaW5pdGlhbCBzeW1ib2wtdGFibGUtZGVidWctc3RyaW5nIHZlY3RvciBsZW5ndGggKi8KKworI2RlZmluZQlJTklUSUFMX1NUQUJWRUNUT1JfTEVOR1RICTQwCisKKy8qIE5vbnplcm8gaWYgd2l0aGluIGEgZnVuY3Rpb24gKHNvIHN5bWJvbHMgc2hvdWxkIGJlIGxvY2FsLAorICAgaWYgbm90aGluZyBzYXlzIHNwZWNpZmljYWxseSkuICAqLworCitpbnQgd2l0aGluX2Z1bmN0aW9uOworCisvKiBTaXplIG9mIGEgQ09GRiBzeW1ib2wuICBJIHRoaW5rIGl0IGlzIGFsd2F5cyAxOCwgc28gSSdtIG5vdCBzdXJlCisgICB0aGVyZSBpcyBhbnkgcmVhc29uIG5vdCB0byBqdXN0IHVzZSBhICNkZWZpbmUsIGJ1dCBtaWdodCBhcyB3ZWxsCisgICBhc2sgQkZEIGZvciB0aGUgc2l6ZSBhbmQgc3RvcmUgaXQgaGVyZSwgSSBndWVzcy4gICovCisKK3N0YXRpYyB1bnNpZ25lZAlsb2NhbF9zeW1lc3o7CisKK3N0cnVjdCBjb2ZmX3N5bWZpbGVfaW5mbyB7CisgIGZpbGVfcHRyIG1pbl9saW5lbm9fb2Zmc2V0OwkJLyogV2hlcmUgaW4gZmlsZSBsb3dlc3QgbGluZSNzIGFyZSAqLworICBmaWxlX3B0ciBtYXhfbGluZW5vX29mZnNldDsJCS8qIDErbGFzdCBieXRlIG9mIGxpbmUjcyBpbiBmaWxlICovCisKKyAgLyogUG9pbnRlciB0byB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KKyAgY2hhciAqc3RydGJsOworCisgIC8qIFBvaW50ZXIgdG8gZGVidWcgc2VjdGlvbi4gICovCisgIGNoYXIgKmRlYnVnc2VjOworCisgIC8qIFBvaW50ZXIgdG8gdGhlIGEub3V0IHN5bWJvbCB0YWJsZS4gICovCisgIGNoYXIgKnN5bXRibDsKKworICAvKiBOdW1iZXIgb2Ygc3ltYm9scyBpbiBzeW10YmwuICAqLworICBpbnQgc3ltdGJsX251bV9zeW1zOworCisgIC8qIE9mZnNldCBpbiBkYXRhIHNlY3Rpb24gdG8gVE9DIGFuY2hvci4gICovCisgIENPUkVfQUREUiB0b2Nfb2Zmc2V0OworfTsKKworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgc3RvcmNsYXNzX2NvbXBsYWludCA9CisgIHsiVW5leHBlY3RlZCBzdG9yYWdlIGNsYXNzOiAlZCIsIDAsIDB9OworCitzdGF0aWMgc3RydWN0IGNvbXBsYWludCBiZl9ub3Rmb3VuZF9jb21wbGFpbnQgPQorICB7ImxpbmUgbnVtYmVycyBvZmYsIGAuYmYnIHN5bWJvbCBub3QgZm91bmQiLCAwLCAwfTsKKworc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgZWZfY29tcGxhaW50ID0gCisgIHsiTWlzbWF0Y2hlZCAuZWYgc3ltYm9sIGlnbm9yZWQgc3RhcnRpbmcgYXQgc3ltbnVtICVkIiwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IGViX2NvbXBsYWludCA9IAorICB7Ik1pc21hdGNoZWQgLmViIHN5bWJvbCBpZ25vcmVkIHN0YXJ0aW5nIGF0IHN5bW51bSAlZCIsIDAsIDB9OworCitzdGF0aWMgdm9pZAoreGNvZmZfaW5pdGlhbF9zY2FuIFBBUkFNUyAoKHN0cnVjdCBvYmpmaWxlICosIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKiwgaW50KSk7CisKK3N0YXRpYyB2b2lkCitzY2FuX3hjb2ZmX3N5bXRhYiBQQVJBTVMgKChzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIGNoYXIgKgoreGNvZmZfbmV4dF9zeW1ib2xfdGV4dCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCityZWNvcmRfaW5jbHVkZV9iZWdpbiBQQVJBTVMgKChzdHJ1Y3QgY29mZl9zeW1ib2wgKikpOworCitzdGF0aWMgdm9pZAorZW50ZXJfbGluZV9yYW5nZSBQQVJBTVMgKChzdHJ1Y3Qgc3ViZmlsZSAqLCB1bnNpZ25lZCwgdW5zaWduZWQsCisJCQkgIENPUkVfQUREUiwgQ09SRV9BRERSLCB1bnNpZ25lZCAqKSk7CisKK3N0YXRpYyB2b2lkCitpbml0X3N0cmluZ3RhYiBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIsIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQKK3hjb2ZmX3N5bWZpbGVfaW5pdCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCit4Y29mZl9uZXdfaW5pdCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyB2b2lkCit4Y29mZl9zeW1maWxlX2ZpbmlzaCBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqKSk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICoKK3hjb2ZmX3N5bWZpbGVfb2Zmc2V0cyBQQVJBTVMgKChzdHJ1Y3Qgb2JqZmlsZSAqLCBDT1JFX0FERFIpKTsKKworc3RhdGljIHZvaWQKK2ZpbmRfbGluZW5vcyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSKSk7CisKK3N0YXRpYyBjaGFyICoKK2NvZmZfZ2V0ZmlsZW5hbWUgUEFSQU1TICgodW5pb24gaW50ZXJuYWxfYXV4ZW50ICosIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RhdGljIHZvaWQKK3JlYWRfc3ltYm9sIFBBUkFNUyAoKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgaW50KSk7CisKK3N0YXRpYyBpbnQKK3JlYWRfc3ltYm9sX2xpbmVubyBQQVJBTVMgKChpbnQpKTsKKworc3RhdGljIGludAorcmVhZF9zeW1ib2xfbnZhbHVlIFBBUkFNUyAoKGludCkpOworCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqCitwcm9jZXNzX3hjb2ZmX3N5bWJvbCBQQVJBTVMgKChzdHJ1Y3QgY29mZl9zeW1ib2wgKiwgc3RydWN0IG9iamZpbGUgKikpOworCitzdGF0aWMgdm9pZAorcmVhZF94Y29mZl9zeW10YWIgUEFSQU1TICgoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKKworI2lmIDAKK3N0YXRpYyB2b2lkCithZGRfc3RhYl90b19saXN0IFBBUkFNUyAoKGNoYXIgKiwgc3RydWN0IHBlbmRpbmdfc3RhYnMgKiopKTsKKyNlbmRpZgorCitzdGF0aWMgaW50Citjb21wYXJlX2x0ZSBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOworCitzdGF0aWMgc3RydWN0IGxpbmV0YWJsZSAqCithcnJhbmdlX2xpbmV0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgbGluZXRhYmxlICopKTsKKworc3RhdGljIHZvaWQKK3JlY29yZF9pbmNsdWRlX2VuZCBQQVJBTVMgKChzdHJ1Y3QgY29mZl9zeW1ib2wgKikpOworCitzdGF0aWMgdm9pZAorcHJvY2Vzc19saW5lbm9zIFBBUkFNUyAoKENPUkVfQUREUiwgQ09SRV9BRERSKSk7CisKKwwKKy8qIFRyYW5zbGF0ZSBmcm9tIGEgQ09GRiBzZWN0aW9uIG51bWJlciAodGFyZ2V0X2luZGV4KSB0byBhIFNFQ1RfT0ZGXyoKKyAgIGNvZGUuICAqLworc3RhdGljIGludCBzZWNudW1fdG9fc2VjdGlvbiBQQVJBTVMgKChpbnQsIHN0cnVjdCBvYmpmaWxlICopKTsKK3N0YXRpYyBhc2VjdGlvbiAqIHNlY251bV90b19iZmRfc2VjdGlvbiBQQVJBTVMgKChpbnQsIHN0cnVjdCBvYmpmaWxlICopKTsKKworc3RydWN0IGZpbmRfdGFyZ19zZWNfYXJnIHsKKyAgaW50IHRhcmdfaW5kZXg7CisgIGludCAqcmVzdWx0cDsKKyAgYXNlY3Rpb24gKipiZmRfc2VjdDsKK307CisKK3N0YXRpYyB2b2lkIGZpbmRfdGFyZ19zZWMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHZvaWQgKikpOworCitzdGF0aWMgdm9pZCBmaW5kX3Rhcmdfc2VjIChhYmZkLCBzZWN0LCBvYmopCisgICAgIGJmZCAqYWJmZDsKKyAgICAgYXNlY3Rpb24gKnNlY3Q7CisgICAgIFBUUiBvYmo7Cit7CisgIHN0cnVjdCBmaW5kX3Rhcmdfc2VjX2FyZyAqYXJncyA9IChzdHJ1Y3QgZmluZF90YXJnX3NlY19hcmcgKilvYmo7CisgIGlmIChzZWN0LT50YXJnZXRfaW5kZXggPT0gYXJncy0+dGFyZ19pbmRleCkKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIHRoZSBzZWN0aW9uLiAgRmlndXJlIG91dCB3aGF0IFNFQ1RfT0ZGXyogY29kZSBpdCBpcy4gICovCisgICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWN0KSAmIFNFQ19DT0RFKQorCSphcmdzLT5yZXN1bHRwID0gU0VDVF9PRkZfVEVYVDsKKyAgICAgIGVsc2UgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdCkgJiBTRUNfTE9BRCkKKwkqYXJncy0+cmVzdWx0cCA9IFNFQ1RfT0ZGX0RBVEE7CisgICAgICBlbHNlCisJKmFyZ3MtPnJlc3VsdHAgPSBTRUNUX09GRl9CU1M7CisgICAgICAqYXJncy0+YmZkX3NlY3QgPSBzZWN0OworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSBzZWN0aW9uIG51bWJlciAoU0VDVF9PRkZfKikgdGhhdCBDUyBwb2ludHMgdG8uICAqLworc3RhdGljIGludAorc2VjbnVtX3RvX3NlY3Rpb24gKHNlY251bSwgb2JqZmlsZSkKKyAgICAgaW50IHNlY251bTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIGludCBvZmYgPSBTRUNUX09GRl9URVhUOworICBhc2VjdGlvbiAqc2VjdCA9IE5VTEw7CisgIHN0cnVjdCBmaW5kX3Rhcmdfc2VjX2FyZyBhcmdzOworICBhcmdzLnRhcmdfaW5kZXggPSBzZWNudW07CisgIGFyZ3MucmVzdWx0cCA9ICZvZmY7CisgIGFyZ3MuYmZkX3NlY3QgPSAmc2VjdDsKKyAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChvYmpmaWxlLT5vYmZkLCBmaW5kX3Rhcmdfc2VjLCAmYXJncyk7CisgIHJldHVybiBvZmY7Cit9CisKKy8qIFJldHVybiB0aGUgQkZEIHNlY3Rpb24gdGhhdCBDUyBwb2ludHMgdG8uICAqLworc3RhdGljIGFzZWN0aW9uICoKK3NlY251bV90b19iZmRfc2VjdGlvbiAoc2VjbnVtLCBvYmpmaWxlKQorICAgICBpbnQgc2VjbnVtOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaW50IG9mZiA9IFNFQ1RfT0ZGX1RFWFQ7CisgIGFzZWN0aW9uICpzZWN0ID0gTlVMTDsKKyAgc3RydWN0IGZpbmRfdGFyZ19zZWNfYXJnIGFyZ3M7CisgIGFyZ3MudGFyZ19pbmRleCA9IHNlY251bTsKKyAgYXJncy5yZXN1bHRwID0gJm9mZjsKKyAgYXJncy5iZmRfc2VjdCA9ICZzZWN0OworICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKG9iamZpbGUtPm9iZmQsIGZpbmRfdGFyZ19zZWMsICZhcmdzKTsKKyAgcmV0dXJuIHNlY3Q7Cit9CisMCisvKiBhZGQgYSBnaXZlbiBzdGFiIHN0cmluZyBpbnRvIGdpdmVuIHN0YWIgdmVjdG9yLiAqLworCisjaWYgMAorCitzdGF0aWMgdm9pZAorYWRkX3N0YWJfdG9fbGlzdCAoc3RhYm5hbWUsIHN0YWJ2ZWN0b3IpCitjaGFyICpzdGFibmFtZTsKK3N0cnVjdCBwZW5kaW5nX3N0YWJzICoqc3RhYnZlY3RvcjsKK3sKKyAgaWYgKCAqc3RhYnZlY3RvciA9PSBOVUxMKSB7CisgICAgKnN0YWJ2ZWN0b3IgPSAoc3RydWN0IHBlbmRpbmdfc3RhYnMgKikKKwl4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBwZW5kaW5nX3N0YWJzKSArIAorCQkJSU5JVElBTF9TVEFCVkVDVE9SX0xFTkdUSCAqIHNpemVvZiAoY2hhciopKTsKKyAgICAoKnN0YWJ2ZWN0b3IpLT5jb3VudCA9IDA7CisgICAgKCpzdGFidmVjdG9yKS0+bGVuZ3RoID0gSU5JVElBTF9TVEFCVkVDVE9SX0xFTkdUSDsKKyAgfQorICBlbHNlIGlmICgoKnN0YWJ2ZWN0b3IpLT5jb3VudCA+PSAoKnN0YWJ2ZWN0b3IpLT5sZW5ndGgpIHsKKyAgICAoKnN0YWJ2ZWN0b3IpLT5sZW5ndGggKz0gSU5JVElBTF9TVEFCVkVDVE9SX0xFTkdUSDsKKyAgICAqc3RhYnZlY3RvciA9IChzdHJ1Y3QgcGVuZGluZ19zdGFicyAqKQorCXhyZWFsbG9jICgoY2hhciAqKSAqc3RhYnZlY3Rvciwgc2l6ZW9mIChzdHJ1Y3QgcGVuZGluZ19zdGFicykgKyAKKwkoKnN0YWJ2ZWN0b3IpLT5sZW5ndGggKiBzaXplb2YgKGNoYXIqKSk7CisgIH0KKyAgKCpzdGFidmVjdG9yKS0+c3RhYiBbKCpzdGFidmVjdG9yKS0+Y291bnQrK10gPSBzdGFibmFtZTsKK30KKworI2VuZGlmCisKKwwKKy8qIExpbmVub3MgYXJlIHByb2Nlc3NlZCBvbiBhIGZpbGUtYnktZmlsZSBiYXNpcy4KKworICAgVHdvIHJlYXNvbnM6CisKKyAgICAxKSB4bGMgKElCTSdzIG5hdGl2ZSBjIGNvbXBpbGVyKSBwb3N0cG9uZXMgc3RhdGljIGZ1bmN0aW9uIGNvZGUKKyAgICAgICBlbWlzc2lvbiB0byB0aGUgZW5kIG9mIGEgY29tcGlsYXRpb24gdW5pdC4gVGhpcyB3YXkgaXQgY2FuCisgICAgICAgZGV0ZXJtaW5lIGlmIHRob3NlIGZ1bmN0aW9ucyAoc3RhdGljcykgYXJlIG5lZWRlZCBvciBub3QsIGFuZAorICAgICAgIGNhbiBkbyBzb21lIGdhcmJhZ2UgY29sbGVjdGlvbiAoSSB0aGluaykuIFRoaXMgbWFrZXMgbGluZQorICAgICAgIG51bWJlcnMgYW5kIGNvcnJlc3BvbmRpbmcgYWRkcmVzc2VzIHVub3JkZXJlZCwgYW5kIHdlIGVuZCB1cAorICAgICAgIHdpdGggYSBsaW5lIHRhYmxlIGxpa2U6CisgICAgICAgCisKKwkJbGluZW5vCWFkZHIKKyAgICAgICAgZm9vKCkJICAxMAkweDEwMAorCQkgIDIwCTB4MjAwCisJCSAgMzAJMHgzMDAKKworCWZvbzMoKQkgIDcwCTB4NDAwCisJCSAgODAJMHg1MDAKKwkJICA5MAkweDYwMAorCisJc3RhdGljIGZvbzIoKQorCQkgIDQwCTB4NzAwCisJCSAgNTAJMHg4MDAKKwkJICA2MAkweDkwMAkJCisKKwlhbmQgdGhhdCBicmVha3MgZ2RiJ3MgYmluYXJ5IHNlYXJjaCBvbiBsaW5lIG51bWJlcnMsIGlmIHRoZQorCWFib3ZlIHRhYmxlIGlzIG5vdCBzb3J0ZWQgb24gbGluZSBudW1iZXJzLiBBbmQgdGhhdCBzb3J0CisJc2hvdWxkIGJlIG9uIGZ1bmN0aW9uIGJhc2VkLCBzaW5jZSBnY2MgY2FuIGVtaXQgbGluZSBudW1iZXJzCisJbGlrZToKKwkKKwkJMTAJMHgxMDAJLSBmb3IgdGhlIGluaXQvdGVzdCBwYXJ0IG9mIGEgZm9yIHN0bXQuCisJCTIwCTB4MjAwCisJCTMwCTB4MzAwCisJCTEwCTB4NDAwCS0gZm9yIHRoZSBpbmNyZW1lbnQgcGFydCBvZiBhIGZvciBzdG10LgorCisJYXJyYW5nZV9saW5ldGFibGUoKSB3aWxsIGRvIHRoaXMgc29ydGluZy4JCQorCisgICAgIDIpCWFpeCBzeW1ib2wgdGFibGUgbWlnaHQgbG9vayBsaWtlOgorCisJCWNfZmlsZQkJLy8gYmVnaW5uaW5nIG9mIGEgbmV3IGZpbGUKKwkJLmJpCQkvLyBiZWdpbm5pbmcgb2YgaW5jbHVkZSBmaWxlCisJCS5laQkJLy8gZW5kIG9mIGluY2x1ZGUgZmlsZQorCQkuYmkKKwkJLmVpCisKKwliYXNpY2FsbHksIC5iaS8uZWkgcGFpcnMgZG8gbm90IG5lY2Vzc2FyaWx5IGVuY2Fwc3VsYXRlCisJdGhlaXIgc2NvcGUuIFRoZXkgbmVlZCB0byBiZSByZWNvcmRlZCwgYW5kIHByb2Nlc3NlZCBsYXRlcgorCW9uIHdoZW4gd2UgY29tZSB0aGUgZW5kIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LgorCUluY2x1ZGUgdGFibGUgKGluY2xUYWJsZSkgYW5kIHByb2Nlc3NfbGluZW5vcygpIGhhbmRsZQorCXRoYXQuICAqLworCisvKiBjb21wYXJlIGxpbmUgdGFibGUgZW50cnkgYWRkcmVzc2VzLiAqLworCitzdGF0aWMgaW50Citjb21wYXJlX2x0ZSAobHRlMXAsIGx0ZTJwKQorICAgICBjb25zdCB2b2lkICpsdGUxcDsKKyAgICAgY29uc3Qgdm9pZCAqbHRlMnA7Cit7CisgIHN0cnVjdCBsaW5ldGFibGVfZW50cnkgKmx0ZTEgPSAoc3RydWN0IGxpbmV0YWJsZV9lbnRyeSAqKSBsdGUxcDsKKyAgc3RydWN0IGxpbmV0YWJsZV9lbnRyeSAqbHRlMiA9IChzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5ICopIGx0ZTJwOworICByZXR1cm4gbHRlMS0+cGMgLSBsdGUyLT5wYzsKK30KKworLyogR2l2ZW4gYSBsaW5lIHRhYmxlIHdpdGggZnVuY3Rpb24gZW50cmllcyBhcmUgbWFya2VkLCBhcnJhbmdlIGl0cyBmdW5jdGlvbnMKKyAgIGluIGFzY2VuZGluZyBvcmRlciBhbmQgc3RyaXAgb2ZmIGZ1bmN0aW9uIGVudHJ5IG1hcmtlcnMgYW5kIHJldHVybiBpdCBpbgorICAgYSBuZXdseSBjcmVhdGVkIHRhYmxlLiBJZiB0aGUgb2xkIG9uZSBpcyBnb29kIGVub3VnaCwgcmV0dXJuIHRoZSBvbGQgb25lLiAqLworLyogRklYTUU6IEkgdGhpbmsgYWxsIHRoaXMgc3R1ZmYgY2FuIGJlIHJlcGxhY2VkIGJ5IGp1c3QgcGFzc2luZworICAgc29ydF9saW5ldmVjID0gMSB0byBlbmRfc3ltdGFiLiAgKi8KKworc3RhdGljIHN0cnVjdCBsaW5ldGFibGUgKgorYXJyYW5nZV9saW5ldGFibGUgKG9sZExpbmVUYikKKyAgICAgc3RydWN0IGxpbmV0YWJsZSAqb2xkTGluZVRiOwkJCS8qIG9sZCBsaW5ldGFibGUgKi8KK3sKKyAgaW50IGlpLCBqaiwgCisgICAgICBuZXdsaW5lLCAJCQkJCS8qIG5ldyBsaW5lIGNvdW50ICovCisgICAgICBmdW5jdGlvbl9jb3VudDsJCQkJLyogIyBvZiBmdW5jdGlvbnMgKi8KKworICBzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5ICpmZW50cnk7CQkvKiBmdW5jdGlvbiBlbnRyeSB2ZWN0b3IgKi8KKyAgaW50IGZlbnRyeV9zaXplOwkJCQkvKiAjIG9mIGZ1bmN0aW9uIGVudHJpZXMgKi8KKyAgc3RydWN0IGxpbmV0YWJsZSAqbmV3TGluZVRiOwkJCS8qIG5ldyBsaW5lIHRhYmxlICovCisKKyNkZWZpbmUgTlVNX09GX0ZVTkNUSU9OUyAyMAorCisgIGZlbnRyeV9zaXplID0gTlVNX09GX0ZVTkNUSU9OUzsKKyAgZmVudHJ5ID0gKHN0cnVjdCBsaW5ldGFibGVfZW50cnkqKQorICAgIHhtYWxsb2MgKGZlbnRyeV9zaXplICogc2l6ZW9mIChzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5KSk7CisKKyAgZm9yIChmdW5jdGlvbl9jb3VudD0wLCBpaT0wOyBpaSA8b2xkTGluZVRiLT5uaXRlbXM7ICsraWkpIHsKKworICAgIGlmIChvbGRMaW5lVGItPml0ZW1baWldLmxpbmUgPT0gMCkgewkvKiBmdW5jdGlvbiBlbnRyeSBmb3VuZC4gKi8KKworICAgICAgaWYgKGZ1bmN0aW9uX2NvdW50ID49IGZlbnRyeV9zaXplKSB7CS8qIG1ha2Ugc3VyZSB5b3UgaGF2ZSByb29tLiAqLworCWZlbnRyeV9zaXplICo9IDI7CisJZmVudHJ5ID0gKHN0cnVjdCBsaW5ldGFibGVfZW50cnkqKSAKKwkgIHhyZWFsbG9jIChmZW50cnksIGZlbnRyeV9zaXplICogc2l6ZW9mIChzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5KSk7CisgICAgICB9CisgICAgICBmZW50cnlbZnVuY3Rpb25fY291bnRdLmxpbmUgPSBpaTsKKyAgICAgIGZlbnRyeVtmdW5jdGlvbl9jb3VudF0ucGMgPSBvbGRMaW5lVGItPml0ZW1baWldLnBjOworICAgICAgKytmdW5jdGlvbl9jb3VudDsKKyAgICB9CisgIH0KKworICBpZiAoZnVuY3Rpb25fY291bnQgPT0gMCkgeworICAgIGZyZWUgKGZlbnRyeSk7CisgICAgcmV0dXJuIG9sZExpbmVUYjsKKyAgfQorICBlbHNlIGlmIChmdW5jdGlvbl9jb3VudCA+IDEpCisgICAgcXNvcnQgKGZlbnRyeSwgZnVuY3Rpb25fY291bnQsIHNpemVvZihzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5KSwgY29tcGFyZV9sdGUpOworCisgIC8qIGFsbG9jYXRlIGEgbmV3IGxpbmUgdGFibGUuICovCisgIG5ld0xpbmVUYiA9IChzdHJ1Y3QgbGluZXRhYmxlICopCisgICAgeG1hbGxvYworICAgICAgKHNpemVvZiAoc3RydWN0IGxpbmV0YWJsZSkgKyAKKyAgICAgICAob2xkTGluZVRiLT5uaXRlbXMgLSBmdW5jdGlvbl9jb3VudCkgKiBzaXplb2YgKHN0cnVjdCBsaW5ldGFibGVfZW50cnkpKTsKKworICAvKiBpZiBsaW5lIHRhYmxlIGRvZXMgbm90IHN0YXJ0IHdpdGggYSBmdW5jdGlvbiBiZWdpbm5pbmcsIGNvcHkgdXAgdW50aWwKKyAgICAgYSBmdW5jdGlvbiBiZWdpbi4gKi8KKworICBuZXdsaW5lID0gMDsKKyAgaWYgKG9sZExpbmVUYi0+aXRlbVswXS5saW5lICE9IDApCisgICAgZm9yIChuZXdsaW5lPTA7IAorCW5ld2xpbmUgPCBvbGRMaW5lVGItPm5pdGVtcyAmJiBvbGRMaW5lVGItPml0ZW1bbmV3bGluZV0ubGluZTsgKytuZXdsaW5lKQorICAgICAgbmV3TGluZVRiLT5pdGVtW25ld2xpbmVdID0gb2xkTGluZVRiLT5pdGVtW25ld2xpbmVdOworCisgIC8qIE5vdyBjb3B5IGZ1bmN0aW9uIGxpbmVzIG9uZSBieSBvbmUuICovCisKKyAgZm9yIChpaT0wOyBpaSA8IGZ1bmN0aW9uX2NvdW50OyArK2lpKSB7CisgICAgZm9yIChqaiA9IGZlbnRyeVtpaV0ubGluZSArIDE7CisJICAgICAgICAgamogPCBvbGRMaW5lVGItPm5pdGVtcyAmJiBvbGRMaW5lVGItPml0ZW1bampdLmxpbmUgIT0gMDsgCisJCQkJCQkJICsramosICsrbmV3bGluZSkKKyAgICAgIG5ld0xpbmVUYi0+aXRlbVtuZXdsaW5lXSA9IG9sZExpbmVUYi0+aXRlbVtqal07CisgIH0KKyAgZnJlZSAoZmVudHJ5KTsKKyAgbmV3TGluZVRiLT5uaXRlbXMgPSBvbGRMaW5lVGItPm5pdGVtcyAtIGZ1bmN0aW9uX2NvdW50OworICByZXR1cm4gbmV3TGluZVRiOyAgCit9ICAgICAKKworLyogaW5jbHVkZSBmaWxlIHN1cHBvcnQ6IENfQklOQ0wvQ19FSU5DTCBwYWlycyB3aWxsIGJlIGtlcHQgaW4gdGhlIAorICAgZm9sbG93aW5nIGBJbmNsdWRlQ2hhaW4nLiBBdCB0aGUgZW5kIG9mIGVhY2ggc3ltdGFiIChlbmRfc3ltdGFiKSwKKyAgIHdlIHdpbGwgZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBjcmVhdGUgYWRkaXRpb25hbCBzeW10YWIncyB0bworICAgcmVwcmVzZW50IGlmICh0aGUgaW5jbHVkZSBmaWxlcy4gKi8KKworCit0eXBlZGVmIHN0cnVjdCBfaW5jbFRhYmxlIHsKKyAgY2hhcgkJKm5hbWU7CQkJCS8qIGluY2x1ZGUgZmlsZW5hbWUgKi8KKworICAvKiBPZmZzZXRzIHRvIHRoZSBsaW5lIHRhYmxlLiAgZW5kIHBvaW50cyB0byB0aGUgbGFzdCBlbnRyeSB3aGljaCBpcworICAgICBwYXJ0IG9mIHRoaXMgaW5jbHVkZSBmaWxlLiAgKi8KKyAgaW50CQliZWdpbiwgZW5kOworICAKKyAgc3RydWN0IHN1YmZpbGUgKnN1YmZpbGU7CisgIHVuc2lnbmVkCWZ1blN0YXJ0TGluZTsJCQkvKiBzdGFydCBsaW5lICMgb2YgaXRzIGZ1bmN0aW9uICovCit9IEluY2xUYWJsZTsKKworI2RlZmluZQlJTklUSUFMX0lOQ0xVREVfVEFCTEVfTEVOR1RICTIwCitzdGF0aWMgSW5jbFRhYmxlICAqaW5jbFRhYmxlOwkJCS8qIGdsb2JhbCBpbmNsdWRlIHRhYmxlICovCitzdGF0aWMgaW50CSAgaW5jbEluZHg7CQkJLyogbGFzdCBlbnRyeSB0byB0YWJsZSAqLworc3RhdGljIGludAkgIGluY2xMZW5ndGg7CQkJLyogdGFibGUgbGVuZ3RoICovCitzdGF0aWMgaW50CSAgaW5jbERlcHRoOwkJCS8qIG5lc3RlZCBpbmNsdWRlIGRlcHRoICovCisKK3N0YXRpYyB2b2lkIGFsbG9jYXRlX2luY2x1ZGVfZW50cnkgUEFSQU1TICgodm9pZCkpOworCitzdGF0aWMgdm9pZAorcmVjb3JkX2luY2x1ZGVfYmVnaW4gKGNzKQorc3RydWN0IGNvZmZfc3ltYm9sICpjczsKK3sKKyAgaWYgKGluY2xEZXB0aCkKKyAgICB7CisgICAgICAvKiBJbiB4Y29mZiwgd2UgYXNzdW1lIGluY2x1ZGUgZmlsZXMgY2Fubm90IGJlIG5lc3RlZCAobm90IGluIC5jIGZpbGVzCisJIG9mIGNvdXJzZSwgYnV0IGluIGNvcnJlc3BvbmRpbmcgLnMgZmlsZXMuKS4gICovCisKKyAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiB3aXRoIG9sZCB2ZXJzaW9ucyBvZiBHQ0MuCisJIEdDQyAyLjMuMy05MzA0MjYgZG9lcyBub3QgZXhoaWJpdCB0aGlzIG9uIGEgdGVzdCBjYXNlIHdoaWNoCisJIGEgdXNlciBzYWlkIHByb2R1Y2VkIHRoZSBtZXNzYWdlIGZvciBoaW0uICAqLworICAgICAgc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgbXNnID0geyJOZXN0ZWQgQ19CSU5DTCBzeW1ib2xzIiwgMCwgMH07CisgICAgICBjb21wbGFpbiAoJm1zZyk7CisgICAgfQorICArK2luY2xEZXB0aDsKKworICBhbGxvY2F0ZV9pbmNsdWRlX2VudHJ5ICgpOworCisgIGluY2xUYWJsZSBbaW5jbEluZHhdLm5hbWUgID0gY3MtPmNfbmFtZTsKKyAgaW5jbFRhYmxlIFtpbmNsSW5keF0uYmVnaW4gPSBjcy0+Y192YWx1ZTsKK30KKworc3RhdGljIHZvaWQKK3JlY29yZF9pbmNsdWRlX2VuZCAoY3MpCitzdHJ1Y3QgY29mZl9zeW1ib2wgKmNzOworeworICBJbmNsVGFibGUgKnBUYmw7ICAKKworICBpZiAoaW5jbERlcHRoID09IDApCisgICAgeworICAgICAgc3RhdGljIHN0cnVjdCBjb21wbGFpbnQgbXNnID0geyJNaXNtYXRjaGVkIENfQklOQ0wvQ19FSU5DTCBwYWlyIiwgMCwgMH07CisgICAgICBjb21wbGFpbiAoJm1zZyk7CisgICAgfQorCisgIGFsbG9jYXRlX2luY2x1ZGVfZW50cnkgKCk7CisKKyAgcFRibCA9ICZpbmNsVGFibGUgW2luY2xJbmR4XTsKKyAgcFRibC0+ZW5kID0gY3MtPmNfdmFsdWU7CisKKyAgLS1pbmNsRGVwdGg7CisgICsraW5jbEluZHg7Cit9CisKK3N0YXRpYyB2b2lkCithbGxvY2F0ZV9pbmNsdWRlX2VudHJ5ICgpCit7CisgIGlmIChpbmNsVGFibGUgPT0gTlVMTCkKKyAgICB7CisgICAgICBpbmNsVGFibGUgPSAoSW5jbFRhYmxlICopIAorCXhtYWxsb2MgKHNpemVvZiAoSW5jbFRhYmxlKSAqIElOSVRJQUxfSU5DTFVERV9UQUJMRV9MRU5HVEgpOworICAgICAgbWVtc2V0IChpbmNsVGFibGUsCisJICAgICAgJ1wwJywgc2l6ZW9mIChJbmNsVGFibGUpICogSU5JVElBTF9JTkNMVURFX1RBQkxFX0xFTkdUSCk7CisgICAgICBpbmNsTGVuZ3RoID0gSU5JVElBTF9JTkNMVURFX1RBQkxFX0xFTkdUSDsKKyAgICAgIGluY2xJbmR4ID0gMDsKKyAgICB9CisgIGVsc2UgaWYgKGluY2xJbmR4ID49IGluY2xMZW5ndGgpCisgICAgeworICAgICAgaW5jbExlbmd0aCArPSBJTklUSUFMX0lOQ0xVREVfVEFCTEVfTEVOR1RIOworICAgICAgaW5jbFRhYmxlID0gKEluY2xUYWJsZSAqKSAKKwl4cmVhbGxvYyAoaW5jbFRhYmxlLCBzaXplb2YgKEluY2xUYWJsZSkgKiBpbmNsTGVuZ3RoKTsKKyAgICAgIG1lbXNldCAoaW5jbFRhYmxlICsgaW5jbExlbmd0aCAtIElOSVRJQUxfSU5DTFVERV9UQUJMRV9MRU5HVEgsIAorCSAgICAgICdcMCcsIHNpemVvZiAoSW5jbFRhYmxlKSpJTklUSUFMX0lOQ0xVREVfVEFCTEVfTEVOR1RIKTsKKyAgICB9Cit9CisKKy8qIEdsb2JhbCB2YXJpYWJsZSB0byBwYXNzIHRoZSBwc3ltdGFiIGRvd24gdG8gYWxsIHRoZSByb3V0aW5lcyBpbnZvbHZlZAorICAgaW4gcHN5bXRhYiB0byBzeW10YWIgcHJvY2Vzc2luZy4gICovCitzdGF0aWMgc3RydWN0IHBhcnRpYWxfc3ltdGFiICp0aGlzX3N5bXRhYl9wc3ltdGFiOworCisvKiBnaXZlbiB0aGUgc3RhcnQgYW5kIGVuZCBhZGRyZXNzZXMgb2YgYSBjb21waWxhdGlvbiB1bml0IChvciBhIGNzZWN0LAorICAgYXQgdGltZXMpIHByb2Nlc3MgaXRzIGxpbmVzIGFuZCBjcmVhdGUgYXBwcm9wcmlhdGUgbGluZSB2ZWN0b3JzLiAqLworCitzdGF0aWMgdm9pZAorcHJvY2Vzc19saW5lbm9zIChzdGFydCwgZW5kKQorICAgICBDT1JFX0FERFIgc3RhcnQsIGVuZDsKK3sKKyAgaW50IG9mZnNldCwgaWk7CisgIGZpbGVfcHRyIG1heF9vZmZzZXQgPQorICAgICgoc3RydWN0IGNvZmZfc3ltZmlsZV9pbmZvICopdGhpc19zeW10YWJfcHN5bXRhYi0+b2JqZmlsZS0+c3ltX3ByaXZhdGUpCisgICAgICAtPm1heF9saW5lbm9fb2Zmc2V0OworCisgIC8qIHN1YmZpbGUgc3RydWN0dXJlIGZvciB0aGUgbWFpbiBjb21waWxhdGlvbiB1bml0LiAgKi8KKyAgc3RydWN0IHN1YmZpbGUgbWFpbl9zdWJmaWxlOworCisgIC8qIEluIHRoZSBtYWluIHNvdXJjZSBmaWxlLCBhbnkgdGltZSB3ZSBzZWUgYSBmdW5jdGlvbiBlbnRyeSwgd2UKKyAgICAgcmVzZXQgdGhpcyB2YXJpYWJsZSB0byBmdW5jdGlvbidzIGFic29sdXRlIHN0YXJ0aW5nIGxpbmUgbnVtYmVyLgorICAgICBBbGwgdGhlIGZvbGxvd2luZyBsaW5lIG51bWJlcnMgaW4gdGhlIGZ1bmN0aW9uIGFyZSByZWxhdGl2ZSB0bworICAgICB0aGlzLCBhbmQgd2UgcmVjb3JkIGFic29sdXRlIGxpbmUgbnVtYmVycyBpbiByZWNvcmRfbGluZSgpLiAgKi8KKworICB1bnNpZ25lZCBpbnQgbWFpbl9zb3VyY2VfYmFzZWxpbmUgPSAwOworCisgIHVuc2lnbmVkICpmaXJzdExpbmU7CisKKyAgb2Zmc2V0ID0KKyAgICAoKHN0cnVjdCBzeW1sb2MgKil0aGlzX3N5bXRhYl9wc3ltdGFiLT5yZWFkX3N5bXRhYl9wcml2YXRlKS0+bGluZW5vX29mZjsKKyAgaWYgKG9mZnNldCA9PSAwKQorICAgIGdvdG8gcmV0dXJuX2FmdGVyX2NsZWFudXA7CisKKyAgbWVtc2V0ICgmbWFpbl9zdWJmaWxlLCAnXDAnLCBzaXplb2YgKG1haW5fc3ViZmlsZSkpOworCisgIGlmIChpbmNsSW5keCA9PSAwKQorICAgIC8qIEFsbCBzb3VyY2UgbGluZXMgd2VyZSBpbiB0aGUgbWFpbiBzb3VyY2UgZmlsZS4gTm9uZSBpbiBpbmNsdWRlIGZpbGVzLiAqLworCisgICAgZW50ZXJfbGluZV9yYW5nZSAoJm1haW5fc3ViZmlsZSwgb2Zmc2V0LCAwLCBzdGFydCwgZW5kLCAKKyAgICAJCQkJCQkmbWFpbl9zb3VyY2VfYmFzZWxpbmUpOworCisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGVyZSB3YXMgc291cmNlIHdpdGggbGluZSBudW1iZXJzIGluIGluY2x1ZGUgZmlsZXMuICAqLworICAgICAgbWFpbl9zb3VyY2VfYmFzZWxpbmUgPSAwOworICAgICAgZm9yIChpaT0wOyBpaSA8IGluY2xJbmR4OyArK2lpKQorCXsKKwkgIHN0cnVjdCBzdWJmaWxlICp0bXBTdWJmaWxlOworCisJICAvKiBJZiB0aGVyZSBpcyBtYWluIGZpbGUgc291cmNlIGJlZm9yZSBpbmNsdWRlIGZpbGUsIGVudGVyIGl0LiAgKi8KKwkgIGlmIChvZmZzZXQgPCBpbmNsVGFibGVbaWldLmJlZ2luKQorCSAgICB7CisJICAgICAgZW50ZXJfbGluZV9yYW5nZQorCQkoJm1haW5fc3ViZmlsZSwgb2Zmc2V0LCBpbmNsVGFibGVbaWldLmJlZ2luIC0gTElORVNaLAorCQkgc3RhcnQsIDAsICZtYWluX3NvdXJjZV9iYXNlbGluZSk7CisJICAgIH0KKworCSAgLyogSGF2ZSBhIG5ldyBzdWJmaWxlIGZvciB0aGUgaW5jbHVkZSBmaWxlLiAgKi8KKworCSAgdG1wU3ViZmlsZSA9IGluY2xUYWJsZVtpaV0uc3ViZmlsZSA9CisJICAgIChzdHJ1Y3Qgc3ViZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzdWJmaWxlKSk7CisKKwkgIG1lbXNldCAodG1wU3ViZmlsZSwgJ1wwJywgc2l6ZW9mIChzdHJ1Y3Qgc3ViZmlsZSkpOworCSAgZmlyc3RMaW5lID0gJihpbmNsVGFibGVbaWldLmZ1blN0YXJ0TGluZSk7CisKKwkgIC8qIEVudGVyIGluY2x1ZGUgZmlsZSdzIGxpbmVzIG5vdy4gICovCisJICBlbnRlcl9saW5lX3JhbmdlICh0bXBTdWJmaWxlLCBpbmNsVGFibGVbaWldLmJlZ2luLCAKKwkJCSAgICBpbmNsVGFibGVbaWldLmVuZCwgc3RhcnQsIDAsIGZpcnN0TGluZSk7CisKKwkgIGlmIChvZmZzZXQgPD0gaW5jbFRhYmxlW2lpXS5lbmQpCisJICAgIG9mZnNldCA9IGluY2xUYWJsZVtpaV0uZW5kICsgTElORVNaOworCX0KKworICAgICAgLyogQWxsIHRoZSBpbmNsdWRlIGZpbGVzJyBsaW5lIGhhdmUgYmVlbiBwcm9jZXNzZWQgYXQgdGhpcyBwb2ludC4gIE5vdywKKwkgZW50ZXIgcmVtYWluaW5nIGxpbmVzIG9mIHRoZSBtYWluIGZpbGUsIGlmIGFueSBsZWZ0LiAgKi8KKyAgICAgIGlmIChvZmZzZXQgPCBtYXhfb2Zmc2V0ICsgMSAtIExJTkVTWikKKwl7CisJICBlbnRlcl9saW5lX3JhbmdlICgmbWFpbl9zdWJmaWxlLCBvZmZzZXQsIDAsIHN0YXJ0LCBlbmQsIAorCQkJICAgICZtYWluX3NvdXJjZV9iYXNlbGluZSk7CisJfQorICAgIH0KKworICAvKiBQcm9jZXNzIG1haW4gZmlsZSdzIGxpbmUgbnVtYmVycy4gICovCisgIGlmIChtYWluX3N1YmZpbGUubGluZV92ZWN0b3IpCisgICAgeworICAgICAgc3RydWN0IGxpbmV0YWJsZSAqbGluZVRiLCAqbHY7CisKKyAgICAgIGx2ID0gbWFpbl9zdWJmaWxlLmxpbmVfdmVjdG9yOworCisgICAgICAvKiBMaW5lIG51bWJlcnMgYXJlIG5vdCBuZWNlc3NhcmlseSBvcmRlcmVkLiB4bGMgY29tcGlsYXRpb24gd2lsbAorCSBwdXQgc3RhdGljIGZ1bmN0aW9uIHRvIHRoZSBlbmQuICovCisKKyAgICAgIGxpbmVUYiA9IGFycmFuZ2VfbGluZXRhYmxlIChsdik7CisgICAgICBpZiAobHYgPT0gbGluZVRiKQorCXsKKwkgIGN1cnJlbnRfc3ViZmlsZS0+bGluZV92ZWN0b3IgPSAoc3RydWN0IGxpbmV0YWJsZSAqKQorCSAgICB4cmVhbGxvYyAobHYsIChzaXplb2YgKHN0cnVjdCBsaW5ldGFibGUpCisJCQkgICArIGx2LT5uaXRlbXMgKiBzaXplb2YgKHN0cnVjdCBsaW5ldGFibGVfZW50cnkpKSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGZyZWUgKGx2KTsKKwkgIGN1cnJlbnRfc3ViZmlsZS0+bGluZV92ZWN0b3IgPSBsaW5lVGI7CisJfQorCisgICAgICBjdXJyZW50X3N1YmZpbGUtPmxpbmVfdmVjdG9yX2xlbmd0aCA9IAorCWN1cnJlbnRfc3ViZmlsZS0+bGluZV92ZWN0b3ItPm5pdGVtczsKKyAgICB9CisKKyAgLyogTm93LCBwcm9jZXNzIGluY2x1ZGVkIGZpbGVzJyBsaW5lIG51bWJlcnMuICAqLworCisgIGZvciAoaWk9MDsgaWkgPCBpbmNsSW5keDsgKytpaSkKKyAgICB7CisgICAgICBpZiAoKGluY2xUYWJsZVtpaV0uc3ViZmlsZSktPmxpbmVfdmVjdG9yKSAvKiBVc2VsZXNzIGlmISEhIEZJWE1FbWdvICovCisJeworCSAgc3RydWN0IGxpbmV0YWJsZSAqbGluZVRiLCAqbHY7CisKKwkgIGx2ID0gKGluY2xUYWJsZVtpaV0uc3ViZmlsZSktPmxpbmVfdmVjdG9yOworCisJICAvKiBMaW5lIG51bWJlcnMgYXJlIG5vdCBuZWNlc3NhcmlseSBvcmRlcmVkLiB4bGMgY29tcGlsYXRpb24gd2lsbAorCSAgICAgcHV0IHN0YXRpYyBmdW5jdGlvbiB0byB0aGUgZW5kLiAqLworCisJICBsaW5lVGIgPSBhcnJhbmdlX2xpbmV0YWJsZSAobHYpOworCisJICBwdXNoX3N1YmZpbGUgKCk7CisKKwkgIC8qIEZvciB0aGUgc2FtZSBpbmNsdWRlIGZpbGUsIHdlIG1pZ2h0IHdhbnQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lCisJICAgICBzdWJmaWxlLiAgVGhpcyBoYXBwZW5zIGlmIHdlIGhhdmUgc29tZXRoaW5nIGxpa2U6CisKKyAgCQkuLi4uLi4KKwkgICAgICAgICNpbmNsdWRlICJmb28uaCIKKwkJLi4uLi4uCisJIAkjaW5jbHVkZSAiZm9vLmgiCisJCS4uLi4uLgorCisJICAgICB3aGlsZSBmb28uaCBpbmNsdWRpbmcgY29kZSBpbiBpdC4gKHN0dXBpZCBidXQgcG9zc2libGUpCisJICAgICBTaW5jZSBzdGFydF9zdWJmaWxlKCkgbG9va3MgYXQgdGhlIG5hbWUgYW5kIHVzZXMgYW4KKwkgICAgIGV4aXN0aW5nIG9uZSBpZiBmaW5kcywgd2UgbmVlZCB0byBwcm92aWRlIGEgZmFrZSBuYW1lIGFuZAorCSAgICAgZm9vbCBpdC4gICovCisKKyNpZiAwCisJICBzdGFydF9zdWJmaWxlIChpbmNsVGFibGVbaWldLm5hbWUsIChjaGFyKikwKTsKKyNlbHNlCisJICB7CisJICAgIC8qIFBpY2sgYSBmYWtlIG5hbWUgdGhhdCB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGlzCisJICAgICAgIG9uZSB3aGVuIHBhc3NlZCB0byBkZWR1Y2VfbGFuZ3VhZ2VfZnJvbV9maWxlbmFtZS4gIEtsdWRnZSBvbgorCSAgICAgICB0b3Agb2Yga2x1ZGdlLiAgKi8KKwkgICAgY2hhciAqZmFrZW5hbWUgPSBzdHJyY2hyIChpbmNsVGFibGVbaWldLm5hbWUsICcuJyk7CisJICAgIGlmIChmYWtlbmFtZSA9PSBOVUxMKQorCSAgICAgIGZha2VuYW1lID0gIiA/IjsKKwkgICAgc3RhcnRfc3ViZmlsZSAoZmFrZW5hbWUsIChjaGFyKikwKTsKKwkgICAgZnJlZSAoY3VycmVudF9zdWJmaWxlLT5uYW1lKTsKKwkgIH0KKwkgIGN1cnJlbnRfc3ViZmlsZS0+bmFtZSA9IHN0cmR1cCAoaW5jbFRhYmxlW2lpXS5uYW1lKTsKKyNlbmRpZgorCisJICBpZiAobHYgPT0gbGluZVRiKQorCSAgICB7CisJICAgICAgY3VycmVudF9zdWJmaWxlLT5saW5lX3ZlY3RvciA9CisJCShzdHJ1Y3QgbGluZXRhYmxlICopIHhyZWFsbG9jCisJCSAgKGx2LCAoc2l6ZW9mIChzdHJ1Y3QgbGluZXRhYmxlKQorCQkJKyBsdi0+bml0ZW1zICogc2l6ZW9mIChzdHJ1Y3QgbGluZXRhYmxlX2VudHJ5KSkpOworCisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZyZWUgKGx2KTsKKwkgICAgICBjdXJyZW50X3N1YmZpbGUtPmxpbmVfdmVjdG9yID0gbGluZVRiOworCSAgICB9CisKKwkgIGN1cnJlbnRfc3ViZmlsZS0+bGluZV92ZWN0b3JfbGVuZ3RoID0gCisJICAgIGN1cnJlbnRfc3ViZmlsZS0+bGluZV92ZWN0b3ItPm5pdGVtczsKKwkgIHN0YXJ0X3N1YmZpbGUgKHBvcF9zdWJmaWxlICgpLCAoY2hhciopMCk7CisJfQorICAgIH0KKworIHJldHVybl9hZnRlcl9jbGVhbnVwOgorCisgIC8qIFdlIGRvbid0IHdhbnQgdG8ga2VlcCBhbGxvYy9mcmVlJ2luZyB0aGUgZ2xvYmFsIGluY2x1ZGUgZmlsZSB0YWJsZS4gICovCisgIGluY2xJbmR4ID0gMDsKKworICAvKiBTdGFydCB3aXRoIGEgZnJlc2ggc3ViZmlsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBuZXh0IGZpbGUuICAqLworICBtZW1zZXQgKCZtYWluX3N1YmZpbGUsICdcMCcsIHNpemVvZiAoc3RydWN0IHN1YmZpbGUpKTsKK30KKwordm9pZAorYWl4X3Byb2Nlc3NfbGluZW5vcyAoKQoreworICAvKiBwcm9jZXNzIGxpbmUgbnVtYmVycyBhbmQgZW50ZXIgdGhlbSBpbnRvIGxpbmUgdmVjdG9yICovCisgIHByb2Nlc3NfbGluZW5vcyAobGFzdF9zb3VyY2Vfc3RhcnRfYWRkciwgY3VyX3NyY19lbmRfYWRkcik7Cit9CisKKworLyogRW50ZXIgYSBnaXZlbiByYW5nZSBvZiBsaW5lcyBpbnRvIHRoZSBsaW5lIHZlY3Rvci4KKyAgIGNhbiBiZSBjYWxsZWQgaW4gdGhlIGZvbGxvd2luZyB0d28gd2F5czoKKyAgICAgZW50ZXJfbGluZV9yYW5nZSAoc3ViZmlsZSwgYmVnaW5vZmZzZXQsIGVuZG9mZnNldCwgc3RhcnRhZGRyLCAwLCBmaXJzdExpbmUpICBvcgorICAgICBlbnRlcl9saW5lX3JhbmdlIChzdWJmaWxlLCBiZWdpbm9mZnNldCwgMCwgc3RhcnRhZGRyLCBlbmRhZGRyLCBmaXJzdExpbmUpCisKKyAgIGVuZG9mZnNldCBwb2ludHMgdG8gdGhlIGxhc3QgbGluZSB0YWJsZSBlbnRyeSB0aGF0IHdlIHNob3VsZCBwYXkKKyAgIGF0dGVudGlvbiB0by4gICovCisKK3N0YXRpYyB2b2lkCitlbnRlcl9saW5lX3JhbmdlIChzdWJmaWxlLCBiZWdpbm9mZnNldCwgZW5kb2Zmc2V0LCBzdGFydGFkZHIsIGVuZGFkZHIsCisJCSAgZmlyc3RMaW5lKQorICAgICBzdHJ1Y3Qgc3ViZmlsZSAqc3ViZmlsZTsKKyAgICAgdW5zaWduZWQgICBiZWdpbm9mZnNldCwgZW5kb2Zmc2V0OwkvKiBvZmZzZXRzIHRvIGxpbmUgdGFibGUgKi8KKyAgICAgQ09SRV9BRERSICBzdGFydGFkZHIsIGVuZGFkZHI7CisgICAgIHVuc2lnbmVkICAgKmZpcnN0TGluZTsKK3sKKyAgdW5zaWduZWQgaW50IGN1cm9mZnNldDsKKyAgQ09SRV9BRERSIGFkZHI7CisgIHN0cnVjdCBleHRlcm5hbF9saW5lbm8gZXh0X2xubm87CisgIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gaW50X2xubm87CisgIHVuc2lnbmVkIGludCBsaW1pdF9vZmZzZXQ7CisgIGJmZCAqYWJmZDsKKworICBpZiAoZW5kb2Zmc2V0ID09IDAgJiYgc3RhcnRhZGRyID09IDAgJiYgZW5kYWRkciA9PSAwKQorICAgIHJldHVybjsKKyAgY3Vyb2Zmc2V0ID0gYmVnaW5vZmZzZXQ7CisgIGxpbWl0X29mZnNldCA9CisgICAgKChzdHJ1Y3QgY29mZl9zeW1maWxlX2luZm8gKil0aGlzX3N5bXRhYl9wc3ltdGFiLT5vYmpmaWxlLT5zeW1fcHJpdmF0ZSkKKyAgICAgIC0+bWF4X2xpbmVub19vZmZzZXQ7CisKKyAgaWYgKGVuZG9mZnNldCAhPSAwKQorICAgIHsKKyAgICAgIGlmIChlbmRvZmZzZXQgPj0gbGltaXRfb2Zmc2V0KQorCXsKKwkgIHN0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IG1zZyA9CisJICAgIHsiQmFkIGxpbmUgdGFibGUgb2Zmc2V0IGluIENfRUlOQ0wgZGlyZWN0aXZlIiwgMCwgMH07CisJICBjb21wbGFpbiAoJm1zZyk7CisJICByZXR1cm47CisJfQorICAgICAgbGltaXRfb2Zmc2V0ID0gZW5kb2Zmc2V0OworICAgIH0KKyAgZWxzZQorICAgIGxpbWl0X29mZnNldCAtPSAxOworICBhYmZkID0gdGhpc19zeW10YWJfcHN5bXRhYi0+b2JqZmlsZS0+b2JmZDsKKworICB3aGlsZSAoY3Vyb2Zmc2V0IDw9IGxpbWl0X29mZnNldCkKKyAgICB7CisgICAgICBiZmRfc2VlayAoYWJmZCwgY3Vyb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICBiZmRfcmVhZCAoJmV4dF9sbm5vLCBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9saW5lbm8pLCAxLCBhYmZkKTsKKyAgICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luIChhYmZkLCAmZXh0X2xubm8sICZpbnRfbG5ubyk7CisKKyAgICAgIC8qIEZpbmQgdGhlIGFkZHJlc3MgdGhpcyBsaW5lIHJlcHJlc2VudHMuICAqLworICAgICAgYWRkciA9IChpbnRfbG5uby5sX2xubm8KKwkgICAgICA/IGludF9sbm5vLmxfYWRkci5sX3BhZGRyCisJICAgICAgOiByZWFkX3N5bWJvbF9udmFsdWUgKGludF9sbm5vLmxfYWRkci5sX3N5bW5keCkpOworICAgICAgYWRkciArPSBBTk9GRlNFVCAodGhpc19zeW10YWJfcHN5bXRhYi0+b2JqZmlsZS0+c2VjdGlvbl9vZmZzZXRzLAorCQkJU0VDVF9PRkZfVEVYVCk7CisKKyAgICAgIGlmIChhZGRyIDwgc3RhcnRhZGRyIHx8IChlbmRhZGRyICYmIGFkZHIgPj0gZW5kYWRkcikpCisJcmV0dXJuOworCisgICAgICBpZiAoaW50X2xubm8ubF9sbm5vID09IDApCisJeworCSAgKmZpcnN0TGluZSA9IHJlYWRfc3ltYm9sX2xpbmVubyAoaW50X2xubm8ubF9hZGRyLmxfc3ltbmR4KTsKKwkgIHJlY29yZF9saW5lIChzdWJmaWxlLCAwLCBhZGRyKTsKKwkgIC0tKCpmaXJzdExpbmUpOworCX0KKyAgICAgIGVsc2UKKwlyZWNvcmRfbGluZSAoc3ViZmlsZSwgKmZpcnN0TGluZSArIGludF9sbm5vLmxfbG5ubywgYWRkcik7CisgICAgICBjdXJvZmZzZXQgKz0gTElORVNaOworICAgIH0KK30KKworCisvKiBTYXZlIHRoZSB2aXRhbCBpbmZvcm1hdGlvbiBmb3IgdXNlIHdoZW4gY2xvc2luZyBvZmYgdGhlIGN1cnJlbnQgZmlsZS4KKyAgIE5BTUUgaXMgdGhlIGZpbGUgbmFtZSB0aGUgc3ltYm9scyBjYW1lIGZyb20sIFNUQVJUX0FERFIgaXMgdGhlIGZpcnN0CisgICB0ZXh0IGFkZHJlc3MgZm9yIHRoZSBmaWxlLCBhbmQgU0laRSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHRleHQuICAqLworCisjZGVmaW5lIGNvbXBsZXRlX3N5bXRhYihuYW1lLCBzdGFydF9hZGRyKSB7CVwKKyAgbGFzdF9zb3VyY2VfZmlsZSA9IHNhdmVzdHJpbmcgKG5hbWUsIHN0cmxlbiAobmFtZSkpOwlcCisgIGxhc3Rfc291cmNlX3N0YXJ0X2FkZHIgPSBzdGFydF9hZGRyOwkJCVwKK30KKworCisvKiBSZWZpbGwgdGhlIHN5bWJvbCB0YWJsZSBpbnB1dCBidWZmZXIKKyAgIGFuZCBzZXQgdGhlIHZhcmlhYmxlcyB0aGF0IGNvbnRyb2wgZmV0Y2hpbmcgZW50cmllcyBmcm9tIGl0LgorICAgUmVwb3J0cyBhbiBlcnJvciBpZiBubyBkYXRhIGF2YWlsYWJsZS4KKyAgIFRoaXMgZnVuY3Rpb24gY2FuIHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBzeW1ib2wgdGFibGUKKyAgIChpbnRvIHRoZSBzdHJpbmcgdGFibGUpIGJ1dCB0aGlzIGRvZXMgbm8gaGFybS4gICovCisKKy8qIFJlYWRpbmcgc3ltYm9sIHRhYmxlIGhhcyB0byBiZSBmYXN0ISBLZWVwIHRoZSBmb2xsb3dpbmdzIGFzIG1hY3JvcywgcmF0aGVyCisgICB0aGFuIGZ1bmN0aW9ucy4gKi8KKworI2RlZmluZQlSRUNPUkRfTUlOSU1BTF9TWU1CT0woTkFNRSwgQUREUiwgVFlQRSwgU0VDVElPTiwgT0JKRklMRSkgXAorewkJCQkJCVwKKyAgY2hhciAqbmFtZXN0cjsJCQkJXAorICBuYW1lc3RyID0gKE5BTUUpOyBcCisgIGlmIChuYW1lc3RyWzBdID09ICcuJykgKytuYW1lc3RyOyBcCisgIHByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9sX2FuZF9pbmZvIChuYW1lc3RyLCAoQUREUiksIChUWVBFKSwgXAorCQkJCSAgICAgICAoY2hhciAqKU5VTEwsIChTRUNUSU9OKSwgKGFzZWN0aW9uICopTlVMTCwgKE9CSkZJTEUpKTsgXAorICBtaXNjX2Z1bmNfcmVjb3JkZWQgPSAxOwkJCQkJXAorfQorCisKKy8qIHhjb2ZmIGhhcyBzdGF0aWMgYmxvY2tzIG1hcmtlZCBpbiBgLmJzJywgYC5lcycgcGFpcnMuIFRoZXkgY2Fubm90IGJlCisgICBuZXN0ZWQuIEF0IGFueSBnaXZlbiB0aW1lLCBhIHN5bWJvbCBjYW4gb25seSBiZSBpbiBvbmUgc3RhdGljIGJsb2NrLgorICAgVGhpcyBpcyB0aGUgYmFzZSBhZGRyZXNzIG9mIGN1cnJlbnQgc3RhdGljIGJsb2NrLCB6ZXJvIGlmIG5vbiBleGlzdHMuICovCisgICAKK3N0YXRpYyBpbnQgc3RhdGljX2Jsb2NrX2Jhc2UgPSAwOworCisvKiBTZWN0aW9uIG51bWJlciBmb3IgdGhlIGN1cnJlbnQgc3RhdGljIGJsb2NrLiAgKi8KKworc3RhdGljIGludCBzdGF0aWNfYmxvY2tfc2VjdGlvbiA9IC0xOworCisvKiB0cnVlIGlmIHNwYWNlIGZvciBzeW1ib2wgbmFtZSBoYXMgYmVlbiBhbGxvY2F0ZWQuICovCisKK3N0YXRpYyBpbnQgc3ltbmFtZV9hbGxvY2VkID0gMDsKKworLyogTmV4dCBzeW1ib2wgdG8gcmVhZC4gIFBvaW50ZXIgaW50byByYXcgc2VldGhpbmcgc3ltYm9sIHRhYmxlLiAgKi8KKworc3RhdGljIGNoYXIgKnJhd19zeW1ib2w7CisKKy8qIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHdoaWNoIHN0YWJzcmVhZC5jIGNhbGxzIHRvIGdldCBzeW1ib2wKKyAgIGNvbnRpbnVhdGlvbnMuICAqLworCitzdGF0aWMgY2hhciAqCit4Y29mZl9uZXh0X3N5bWJvbF90ZXh0IChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW1ib2w7CisgIHN0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IG1zZyA9CisgICAgeyJVbmV4cGVjdGVkIHN5bWJvbCBjb250aW51YXRpb24iLCAwLCAwfTsKKyAgY2hhciAqcmV0dmFsOworICAvKiBGSVhNRTogaXMgdGhpcyB0aGUgc2FtZSBhcyB0aGUgcGFzc2VkIGFyZz8gKi8KKyAgb2JqZmlsZSA9IHRoaXNfc3ltdGFiX3BzeW10YWItPm9iamZpbGU7CisKKyAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKG9iamZpbGUtPm9iZmQsIHJhd19zeW1ib2wsICZzeW1ib2wpOworICBpZiAoc3ltYm9sLm5femVyb2VzKQorICAgIHsKKyAgICAgIGNvbXBsYWluICgmbXNnKTsKKworICAgICAgLyogUmV0dXJuIHNvbWV0aGluZyB3aGljaCBwb2ludHMgdG8gJ1wwJyBhbmQgaG9wZSB0aGUgc3ltYm9sIHJlYWRpbmcKKwkgY29kZSBkb2VzIHNvbWV0aGluZyByZWFzb25hYmxlLiAgKi8KKyAgICAgIHJldHZhbCA9ICIiOworICAgIH0KKyAgZWxzZSBpZiAoc3ltYm9sLm5fc2NsYXNzICYgMHg4MCkKKyAgICB7CisgICAgICByZXR2YWwgPQorCSgoc3RydWN0IGNvZmZfc3ltZmlsZV9pbmZvICopb2JqZmlsZS0+c3ltX3ByaXZhdGUpLT5kZWJ1Z3NlYworCSAgKyBzeW1ib2wubl9vZmZzZXQ7CisgICAgICByYXdfc3ltYm9sICs9CisJY29mZl9kYXRhIChvYmpmaWxlLT5vYmZkKS0+bG9jYWxfc3ltZXN6OworICAgICAgKytzeW1udW07CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29tcGxhaW4gKCZtc2cpOworCisgICAgICAvKiBSZXR1cm4gc29tZXRoaW5nIHdoaWNoIHBvaW50cyB0byAnXDAnIGFuZCBob3BlIHRoZSBzeW1ib2wgcmVhZGluZworCSBjb2RlIGRvZXMgc29tZXRoaW5nIHJlYXNvbmFibGUuICAqLworICAgICAgcmV0dmFsID0gIiI7CisgICAgfQorICByZXR1cm4gcmV0dmFsOworfQorCisvKiBSZWFkIHN5bWJvbHMgZm9yIGEgZ2l2ZW4gcGFydGlhbCBzeW1ib2wgdGFibGUuICAqLworCitzdGF0aWMgdm9pZAorcmVhZF94Y29mZl9zeW10YWIgKHBzdCkKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICpwc3Q7Cit7CisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlID0gcHN0LT5vYmpmaWxlOworICBiZmQgKmFiZmQgPSBvYmpmaWxlLT5vYmZkOworICBjaGFyICpyYXdfYXV4cHRyOwkJLyogUG9pbnRlciB0byBmaXJzdCByYXcgYXV4IGVudHJ5IGZvciBzeW0gKi8KKyAgY2hhciAqc3RydGJsID0gKChzdHJ1Y3QgY29mZl9zeW1maWxlX2luZm8gKilvYmpmaWxlLT5zeW1fcHJpdmF0ZSktPnN0cnRibDsKKyAgY2hhciAqZGVidWdzZWMgPQorICAgICgoc3RydWN0IGNvZmZfc3ltZmlsZV9pbmZvICopb2JqZmlsZS0+c3ltX3ByaXZhdGUpLT5kZWJ1Z3NlYzsKKworICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWJvbFsxXTsKKyAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IG1haW5fYXV4OworICBzdHJ1Y3QgY29mZl9zeW1ib2wgY3NbMV07CisgIENPUkVfQUREUiBmaWxlX3N0YXJ0X2FkZHIgPSAwOworICBDT1JFX0FERFIgZmlsZV9lbmRfYWRkciA9IDA7CisKKyAgaW50IG5leHRfZmlsZV9zeW1udW0gPSAtMTsKKyAgdW5zaWduZWQgaW50IG1heF9zeW1udW07CisgIGludCBqdXN0X3N0YXJ0ZWQgPSAxOworICBpbnQgZGVwdGggPSAwOworICBpbnQgZmNuX3N0YXJ0X2FkZHIgPSAwOworCisgIHN0cnVjdCBjb2ZmX3N5bWJvbCBmY25fc3RhYl9zYXZlZDsKKworICAvKiBmY25fY3Nfc2F2ZWQgaXMgZ2xvYmFsIGJlY2F1c2UgcHJvY2Vzc194Y29mZl9zeW1ib2wgbmVlZHMgaXQuICovCisgIHVuaW9uIGludGVybmFsX2F1eGVudCBmY25fYXV4X3NhdmVkOworICBzdHJ1Y3QgY29udGV4dF9zdGFjayAqbmV3OworCisgIGNoYXIgKmZpbGVzdHJpbmcgPSAiIF9zdGFydF8gIjsJLyogTmFtZSBvZiB0aGUgY3VycmVudCBmaWxlLiAqLworCisgIGNoYXIgKmxhc3RfY3NlY3RfbmFtZTsJCS8qIGxhc3Qgc2VlbiBjc2VjdCdzIG5hbWUgYW5kIHZhbHVlICovCisgIENPUkVfQUREUiBsYXN0X2NzZWN0X3ZhbDsKKyAgaW50IGxhc3RfY3NlY3Rfc2VjOworCisgIHRoaXNfc3ltdGFiX3BzeW10YWIgPSBwc3Q7CisKKyAgLyogR2V0IHRoZSBhcHByb3ByaWF0ZSBDT0ZGICJjb25zdGFudHMiIHJlbGF0ZWQgdG8gdGhlIGZpbGUgd2UncmUKKyAgICAgaGFuZGxpbmcuICovCisgIGxvY2FsX3N5bWVzeiA9IGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX3N5bWVzejsKKworICBsYXN0X3NvdXJjZV9maWxlID0gTlVMTDsKKyAgbGFzdF9jc2VjdF9uYW1lID0gMDsKKyAgbGFzdF9jc2VjdF92YWwgPSAwOworCisgIHN0YXJ0X3N0YWJzICgpOworICBzdGFydF9zeW10YWIgKGZpbGVzdHJpbmcsIChjaGFyICopTlVMTCwgZmlsZV9zdGFydF9hZGRyKTsKKyAgcmVjb3JkX2RlYnVnZm9ybWF0ICgiWENPRkYiKTsKKyAgc3ltbnVtID0gKChzdHJ1Y3Qgc3ltbG9jICopcHN0LT5yZWFkX3N5bXRhYl9wcml2YXRlKS0+Zmlyc3Rfc3ltbnVtOworICBtYXhfc3ltbnVtID0KKyAgICBzeW1udW0gKyAoKHN0cnVjdCBzeW1sb2MgKilwc3QtPnJlYWRfc3ltdGFiX3ByaXZhdGUpLT5udW1zeW1zOworICBmaXJzdF9vYmplY3RfZmlsZV9lbmQgPSAwOworCisgIHJhd19zeW1ib2wgPQorICAgICgoc3RydWN0IGNvZmZfc3ltZmlsZV9pbmZvICopIG9iamZpbGUtPnN5bV9wcml2YXRlKS0+c3ltdGJsCisgICAgICArIHN5bW51bSAqIGxvY2FsX3N5bWVzejsKKworICB3aGlsZSAoc3ltbnVtIDwgbWF4X3N5bW51bSkKKyAgICB7CisKKyAgICAgIFFVSVQ7CQkJLyogbWFrZSB0aGlzIGNvbW1hbmQgaW50ZXJydXB0YWJsZS4gICovCisKKyAgICAgIC8qIFJFQURfT05FX1NZTUJPTCAoc3ltYm9sLCBjcywgc3ltbmFtZV9hbGxvY2VkKTsgKi8KKyAgICAgIC8qIHJlYWQgb25lIHN5bWJvbCBpbnRvIGBjcycgc3RydWN0dXJlLiBBZnRlciBwcm9jZXNzaW5nIHRoZQorCSB3aG9sZSBzeW1ib2wgdGFibGUsIG9ubHkgc3RyaW5nIHRhYmxlIHdpbGwgYmUga2VwdCBpbiBtZW1vcnksCisJIHN5bWJvbCB0YWJsZSBhbmQgZGVidWcgc2VjdGlvbiBvZiB4Y29mZiB3aWxsIGJlIGZyZWVkLiBUaHVzCisJIHdlIGNhbiBtYXJrIHN5bWJvbHMgd2l0aCBuYW1lcyBpbiBzdHJpbmcgdGFibGUgYXMKKwkgYGFsbG9jZWQnLiAqLworICAgICAgeworCWludCBpaTsKKworCS8qIFN3YXAgYW5kIGFsaWduIHRoZSBzeW1ib2wgaW50byBhIHJlYXNvbmFibGUgQyBzdHJ1Y3R1cmUuICAqLworCWJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCByYXdfc3ltYm9sLCBzeW1ib2wpOworCisJY3MtPmNfc3ltbnVtID0gc3ltbnVtOworCWNzLT5jX25hdXggPSBzeW1ib2wtPm5fbnVtYXV4OworCWlmIChzeW1ib2wtPm5femVyb2VzKQorCSAgeworCSAgICBzeW1uYW1lX2FsbG9jZWQgPSAwOworCSAgICAvKiBXZSBtdXN0IHVzZSB0aGUgb3JpZ2luYWwsIHVuc3dhcHBlZCwgbmFtZSBoZXJlIHNvIHRoZSBuYW1lIGZpZWxkCisJICAgICAgIHBvaW50ZWQgdG8gYnkgY3MtPmNfbmFtZSB3aWxsIHBlcnNpc3QgdGhyb3VnaG91dCB4Y29mZnJlYWQuICBJZgorCSAgICAgICB3ZSB1c2UgdGhlIG5ldyBmaWVsZCwgaXQgZ2V0cyBvdmVyd3JpdHRlbiBmb3IgZWFjaCBzeW1ib2wuICAqLworCSAgICBjcy0+Y19uYW1lID0gKChzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50ICopcmF3X3N5bWJvbCktPmUuZV9uYW1lOworCSAgICAvKiBJZiBpdCdzIGV4YWN0bHkgRV9TWU1OTUxFTiBjaGFyYWN0ZXJzIGxvbmcgaXQgaXNuJ3QKKwkgICAgICAgJ1wwJy10ZXJtaW5hdGVkLiAgKi8KKwkgICAgaWYgKGNzLT5jX25hbWVbRV9TWU1OTUxFTiAtIDFdICE9ICdcMCcpCisJICAgICAgeworCQljaGFyICpwOworCQlwID0gb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnN5bWJvbF9vYnN0YWNrLCBFX1NZTU5NTEVOICsgMSk7CisJCXN0cm5jcHkgKHAsIGNzLT5jX25hbWUsIEVfU1lNTk1MRU4pOworCQlwW0VfU1lNTk1MRU5dID0gJ1wwJzsKKwkJY3MtPmNfbmFtZSA9IHA7CisJCXN5bW5hbWVfYWxsb2NlZCA9IDE7CisJICAgICAgfQorCSAgfQorCWVsc2UgaWYgKHN5bWJvbC0+bl9zY2xhc3MgJiAweDgwKQorCSAgeworCSAgICBjcy0+Y19uYW1lID0gZGVidWdzZWMgKyBzeW1ib2wtPm5fb2Zmc2V0OworCSAgICBzeW1uYW1lX2FsbG9jZWQgPSAwOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgLyogaW4gc3RyaW5nIHRhYmxlICovCisJICAgIGNzLT5jX25hbWUgPSBzdHJ0YmwgKyAoaW50KXN5bWJvbC0+bl9vZmZzZXQ7CisJICAgIHN5bW5hbWVfYWxsb2NlZCA9IDE7CisJICB9CisJY3MtPmNfdmFsdWUgPSBzeW1ib2wtPm5fdmFsdWU7CisJY3MtPmNfc2NsYXNzID0gc3ltYm9sLT5uX3NjbGFzczsKKwljcy0+Y19zZWNudW0gPSBzeW1ib2wtPm5fc2NudW07CisJY3MtPmNfdHlwZSA9ICh1bnNpZ25lZClzeW1ib2wtPm5fdHlwZTsKKworCXJhd19zeW1ib2wgKz0gY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfc3ltZXN6OworCSsrc3ltbnVtOworCisJLyogU2F2ZSBhZGRyIG9mIGZpcnN0IGF1eCBlbnRyeS4gICovCisJcmF3X2F1eHB0ciA9IHJhd19zeW1ib2w7CisKKwkvKiBTa2lwIGFsbCB0aGUgYXV4ZW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzeW1ib2wuICAqLworCWZvciAoaWkgPSBzeW1ib2wtPm5fbnVtYXV4OyBpaTsgLS1paSkKKwkgIHsKKwkgICAgcmF3X3N5bWJvbCArPSBjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9hdXhlc3o7CisJICAgICsrc3ltbnVtOworCSAgfQorICAgICAgfQorCisgICAgICAvKiBpZiBzeW1ib2wgbmFtZSBzdGFydHMgd2l0aCAiLiQiIG9yICIkIiwgaWdub3JlIGl0LiAqLworICAgICAgaWYgKGNzLT5jX25hbWVbMF0gPT0gJyQnCisJICB8fCAoY3MtPmNfbmFtZVsxXSA9PSAnJCcgJiYgY3MtPmNfbmFtZVswXSA9PSAnLicpKQorCWNvbnRpbnVlOworCisgICAgICBpZiAoY3MtPmNfc3ltbnVtID09IG5leHRfZmlsZV9zeW1udW0gJiYgY3MtPmNfc2NsYXNzICE9IENfRklMRSkKKwl7CisJICBpZiAobGFzdF9zb3VyY2VfZmlsZSkKKwkgICAgeworCSAgICAgIHBzdC0+c3ltdGFiID0KKwkJZW5kX3N5bXRhYiAoY3VyX3NyY19lbmRfYWRkciwgb2JqZmlsZSwgU0VDVF9PRkZfVEVYVCk7CisJICAgICAgZW5kX3N0YWJzICgpOworCSAgICB9CisKKwkgIHN0YXJ0X3N0YWJzICgpOworCSAgc3RhcnRfc3ltdGFiICgiX2dsb2JhbHNfIiwgKGNoYXIgKilOVUxMLCAoQ09SRV9BRERSKTApOworCSAgcmVjb3JkX2RlYnVnZm9ybWF0ICgiWENPRkYiKTsKKwkgIGN1cl9zcmNfZW5kX2FkZHIgPSBmaXJzdF9vYmplY3RfZmlsZV9lbmQ7CisJICAvKiBkb25lIHdpdGggYWxsIGZpbGVzLCBldmVyeXRoaW5nIGZyb20gaGVyZSBvbiBpcyBnbG9iYWxzICovCisJfQorCisgICAgICAvKiBpZiBleHBsaWNpdGx5IHNwZWNpZmllZCBhcyBhIGZ1bmN0aW9uLCB0cmVhdCBpcyBhcyBvbmUuICovCisgICAgICBpZiAoSVNGQ04oY3MtPmNfdHlwZSkgJiYgY3MtPmNfc2NsYXNzICE9IENfVFBERUYpCisJeworCSAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGFiZmQsIHJhd19hdXhwdHIsIGNzLT5jX3R5cGUsIGNzLT5jX3NjbGFzcywKKwkJCQkwLCBjcy0+Y19uYXV4LCAmbWFpbl9hdXgpOworCSAgZ290byBmdW5jdGlvbl9lbnRyeV9wb2ludDsKKwl9CisKKyAgICAgIGlmICgoY3MtPmNfc2NsYXNzID09IENfRVhUIHx8IGNzLT5jX3NjbGFzcyA9PSBDX0hJREVYVCkKKwkgICYmIGNzLT5jX25hdXggPT0gMSkKKwl7CisJICAvKiBEZWFsaW5nIHdpdGggYSBzeW1ib2wgd2l0aCBhIGNzZWN0IGVudHJ5LiAgKi8KKworI2RlZmluZQlDU0VDVChQUCkgKChQUCktPnhfY3NlY3QpCisjZGVmaW5lCUNTRUNUX0xFTihQUCkgKENTRUNUKFBQKS54X3Njbmxlbi5sKQorI2RlZmluZQlDU0VDVF9BTElHTihQUCkgKFNNVFlQX0FMSUdOKENTRUNUKFBQKS54X3NtdHlwKSkKKyNkZWZpbmUJQ1NFQ1RfU01UWVAoUFApIChTTVRZUF9TTVRZUChDU0VDVChQUCkueF9zbXR5cCkpCisjZGVmaW5lCUNTRUNUX1NDTEFTKFBQKSAoQ1NFQ1QoUFApLnhfc21jbGFzKQorCisJICAvKiBDb252ZXJ0IHRoZSBhdXhlbnQgdG8gc29tZXRoaW5nIHdlIGNhbiBhY2Nlc3MuICAqLworCSAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGFiZmQsIHJhd19hdXhwdHIsIGNzLT5jX3R5cGUsIGNzLT5jX3NjbGFzcywKKwkJCQkwLCBjcy0+Y19uYXV4LCAmbWFpbl9hdXgpOworCisJICBzd2l0Y2ggKENTRUNUX1NNVFlQICgmbWFpbl9hdXgpKQorCSAgICB7CisKKwkgICAgY2FzZSBYVFlfRVI6CisJICAgICAgLyogSWdub3JlIGFsbCBleHRlcm5hbCByZWZlcmVuY2VzLiAgKi8KKwkgICAgICBjb250aW51ZTsKKworCSAgICBjYXNlIFhUWV9TRDoKKwkgICAgICAvKiBBIHNlY3Rpb24gZGVzY3JpcHRpb24uICAqLworCSAgICAgIHsKKwkJc3dpdGNoIChDU0VDVF9TQ0xBUyAoJm1haW5fYXV4KSkKKwkJICB7CisKKwkJICBjYXNlIFhNQ19QUjoKKwkJICAgIHsKKworCQkgICAgICAvKiBBIHByb2dyYW0gY3NlY3QgaXMgc2Vlbi4gIFdlIGhhdmUgdG8gYWxsb2NhdGUgb25lCisJCQkgc3ltYm9sIHRhYmxlIGZvciBlYWNoIHByb2dyYW0gY3NlY3QuICBOb3JtYWxseSBnZGIKKwkJCSBwcmVmZXJzIG9uZSBzeW10YWIgZm9yIGVhY2ggc291cmNlIGZpbGUuICBJbiBjYXNlCisJCQkgb2YgQUlYLCBvbmUgc291cmNlIGZpbGUgbWlnaHQgaW5jbHVkZSBtb3JlIHRoYW4gb25lCisJCQkgW1BSXSBjc2VjdCwgYW5kIHRoZXkgZG9uJ3QgaGF2ZSB0byBiZSBhZGphY2VudCBpbgorCQkJIHRlcm1zIG9mIHRoZSBzcGFjZSB0aGV5IG9jY3VweSBpbiBtZW1vcnkuIFRodXMsIG9uZQorCQkJIHNpbmdsZSBzb3VyY2UgZmlsZSBtaWdodCBnZXQgZnJhZ21lbnRlZCBpbiB0aGUKKwkJCSBtZW1vcnkgYW5kIGdkYidzIGZpbGUgc3RhcnQgYW5kIGVuZCBhZGRyZXNzCisJCQkgYXBwcm9hY2ggZG9lcyBub3Qgd29yayEgIEdDQyAoYW5kIEkgdGhpbmsgeGxjKSBzZWVtCisJCQkgdG8gcHV0IGFsbCB0aGUgY29kZSBpbiB0aGUgdW5uYW1lZCBwcm9ncmFtIGNzZWN0LiAgKi8KKworCQkgICAgICBpZiAobGFzdF9jc2VjdF9uYW1lKQorCQkJeworCQkJICBjb21wbGV0ZV9zeW10YWIgKGZpbGVzdHJpbmcsIGZpbGVfc3RhcnRfYWRkcik7CisJCQkgIGN1cl9zcmNfZW5kX2FkZHIgPSBmaWxlX2VuZF9hZGRyOworCQkJICBlbmRfc3ltdGFiIChmaWxlX2VuZF9hZGRyLCBvYmpmaWxlLCBTRUNUX09GRl9URVhUKTsKKwkJCSAgZW5kX3N0YWJzICgpOworCQkJICBzdGFydF9zdGFicyAoKTsKKwkJCSAgLyogR2l2ZSBhbGwgY3NlY3RzIGZvciB0aGlzIHNvdXJjZSBmaWxlIHRoZSBzYW1lCisJCQkgICAgIG5hbWUuICAqLworCQkJICBzdGFydF9zeW10YWIgKGZpbGVzdHJpbmcsIE5VTEwsIChDT1JFX0FERFIpMCk7CisJCQkgIHJlY29yZF9kZWJ1Z2Zvcm1hdCAoIlhDT0ZGIik7CisJCQl9CisKKwkJICAgICAgLyogSWYgdGhpcyBpcyB0aGUgdmVyeSBmaXJzdCBjc2VjdCBzZWVuLAorCQkJIGJhc2ljYWxseSBgX19zdGFydCcuICovCisJCSAgICAgIGlmIChqdXN0X3N0YXJ0ZWQpCisJCQl7CisJCQkgIGZpcnN0X29iamVjdF9maWxlX2VuZAorCQkJICAgID0gY3MtPmNfdmFsdWUgKyBDU0VDVF9MRU4gKCZtYWluX2F1eCk7CisJCQkgIGp1c3Rfc3RhcnRlZCA9IDA7CisJCQl9CisKKwkJICAgICAgZmlsZV9zdGFydF9hZGRyID0KKwkJCWNzLT5jX3ZhbHVlICsgQU5PRkZTRVQgKG9iamZpbGUtPnNlY3Rpb25fb2Zmc2V0cywKKwkJCQkJCVNFQ1RfT0ZGX1RFWFQpOworCQkgICAgICBmaWxlX2VuZF9hZGRyID0gZmlsZV9zdGFydF9hZGRyICsgQ1NFQ1RfTEVOICgmbWFpbl9hdXgpOworCisJCSAgICAgIGlmIChjcy0+Y19uYW1lICYmIGNzLT5jX25hbWVbMF0gPT0gJy4nKQorCQkJeworCQkJICBsYXN0X2NzZWN0X25hbWUgPSBjcy0+Y19uYW1lOworCQkJICBsYXN0X2NzZWN0X3ZhbCA9IGNzLT5jX3ZhbHVlOworCQkJICBsYXN0X2NzZWN0X3NlYyA9IHNlY251bV90b19zZWN0aW9uIChjcy0+Y19zZWNudW0sIG9iamZpbGUpOworCQkJfQorCQkgICAgfQorCQkgICAgY29udGludWU7CisKKwkJICAgIC8qIEFsbCBvdGhlciBzeW1ib2xzIGFyZSBwdXQgaW50byB0aGUgbWluaW1hbCBzeW1ib2wKKwkJICAgICAgIHRhYmxlIG9ubHkuICAqLworCisJCSAgY2FzZSBYTUNfUlc6CisJCSAgICBjb250aW51ZTsKKworCQkgIGNhc2UgWE1DX1RDMDoKKwkJICAgIGNvbnRpbnVlOworCisJCSAgY2FzZSBYTUNfVEM6CisJCSAgICBjb250aW51ZTsKKworCQkgIGRlZmF1bHQ6CisJCSAgICAvKiBJZ25vcmUgdGhlIHN5bWJvbC4gICovCisJCSAgICBjb250aW51ZTsKKwkJICB9CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgWFRZX0xEOgorCisJICAgICAgc3dpdGNoIChDU0VDVF9TQ0xBUyAoJm1haW5fYXV4KSkKKwkJeworCQljYXNlIFhNQ19QUjoKKwkJICAvKiBhIGZ1bmN0aW9uIGVudHJ5IHBvaW50LiAqLworCQlmdW5jdGlvbl9lbnRyeV9wb2ludDoKKworCQkgIGZjbl9zdGFydF9hZGRyID0gY3MtPmNfdmFsdWU7CisKKwkJICAvKiBzYXZlIHRoZSBmdW5jdGlvbiBoZWFkZXIgaW5mbywgd2hpY2ggd2lsbCBiZSB1c2VkCisJCSAgICAgd2hlbiBgLmJmJyBpcyBzZWVuLiAqLworCQkgIGZjbl9jc19zYXZlZCA9ICpjczsKKwkJICBmY25fYXV4X3NhdmVkID0gbWFpbl9hdXg7CisJCSAgY29udGludWU7CisKKwkJY2FzZSBYTUNfR0w6CisJCSAgLyogc2hhcmVkIGxpYnJhcnkgZnVuY3Rpb24gdHJhbXBvbGluZSBjb2RlIGVudHJ5IHBvaW50LiAqLworCQkgIGNvbnRpbnVlOworCisJCWNhc2UgWE1DX0RTOgorCQkgIC8qIFRoZSBzeW1ib2xzIG9mdGVuIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgZGVidWcgc3ltYm9scyBmb3IKKwkJICAgICBmdW5jdGlvbnMsIGFuZCBjb25mdXNlIGxvb2t1cF9zeW1ib2wuICAqLworCQkgIGNvbnRpbnVlOworCisJCWRlZmF1bHQ6CisJCSAgLyogeGxjIHB1dHMgZWFjaCB2YXJpYWJsZSBpbiBhIHNlcGFyYXRlIGNzZWN0LCBzbyB3ZSBnZXQKKwkJICAgICBhbiBYVFlfU0QgZm9yIGVhY2ggdmFyaWFibGUuICBCdXQgZ2NjIHB1dHMgc2V2ZXJhbAorCQkgICAgIHZhcmlhYmxlcyBpbiBhIGNzZWN0LCBzbyB0aGF0IGVhY2ggdmFyaWFibGUgb25seSBnZXRzCisJCSAgICAgYW4gWFRZX0xELiBUaGlzIHdpbGwgdHlwaWNhbGx5IGJlIFhNQ19SVzsgSSBzdXNwZWN0CisJCSAgICAgWE1DX1JPIGFuZCBYTUNfQlMgbWlnaHQgYmUgcG9zc2libGUgdG9vLgorCQkgICAgIFRoZXNlIHZhcmlhYmxlcyBhcmUgcHV0IGluIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZQorCQkgICAgIG9ubHkuICAqLworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBYVFlfQ006CisJICAgICAgLyogQ29tbW9uIHN5bWJvbHMgYXJlIHB1dCBpbnRvIHRoZSBtaW5pbWFsIHN5bWJvbCB0YWJsZSBvbmx5LiAgKi8KKwkgICAgICBjb250aW51ZTsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorCisgICAgICBzd2l0Y2ggKGNzLT5jX3NjbGFzcykKKwl7CisKKwljYXNlIENfRklMRToKKworCSAgLyogY192YWx1ZSBmaWVsZCBjb250YWlucyBzeW1udW0gb2YgbmV4dCAuZmlsZSBlbnRyeSBpbiB0YWJsZQorCSAgICAgb3Igc3ltbnVtIG9mIGZpcnN0IGdsb2JhbCBhZnRlciBsYXN0IC5maWxlLiAqLworCisJICBuZXh0X2ZpbGVfc3ltbnVtID0gY3MtPmNfdmFsdWU7CisKKwkgIC8qIENvbXBsZXRlIHN5bWJvbCB0YWJsZSBmb3IgbGFzdCBvYmplY3QgZmlsZSBjb250YWluaW5nCisJICAgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICovCisKKwkgIC8qIFdoZXRoZXIgb3Igbm90IHRoZXJlIHdhcyBhIGNzZWN0IGluIHRoZSBwcmV2aW91cyBmaWxlLCB3ZQorCSAgICAgaGF2ZSB0byBjYWxsIGBlbmRfc3RhYnMnIGFuZCBgc3RhcnRfc3RhYnMnIHRvIHJlc2V0CisJICAgICB0eXBlX3ZlY3RvciwgbGluZV92ZWN0b3IsIGV0Yy4gc3RydWN0dXJlcy4gICovCisKKwkgIGNvbXBsZXRlX3N5bXRhYiAoZmlsZXN0cmluZywgZmlsZV9zdGFydF9hZGRyKTsKKwkgIGN1cl9zcmNfZW5kX2FkZHIgPSBmaWxlX2VuZF9hZGRyOworCSAgZW5kX3N5bXRhYiAoZmlsZV9lbmRfYWRkciwgb2JqZmlsZSwgU0VDVF9PRkZfVEVYVCk7CisJICBlbmRfc3RhYnMgKCk7CisKKwkgIC8qIFhDT0ZGLCBhY2NvcmRpbmcgdG8gdGhlIEFJWCAzLjIgZG9jdW1lbnRhdGlvbiwgcHV0cyB0aGUgZmlsZW5hbWUKKwkgICAgIGluIGNzLT5jX25hbWUuICBCdXQgeGxjIDEuMy4wLjIgaGFzIGRlY2lkZWQgdG8gZG8gdGhpbmdzIHRoZQorCSAgICAgc3RhbmRhcmQgQ09GRiB3YXkgYW5kIHB1dCBpdCBpbiB0aGUgYXV4ZW50LiAgV2UgdXNlIHRoZSBhdXhlbnQgaWYKKwkgICAgIHRoZSBzeW1ib2wgaXMgIi5maWxlIiBhbmQgYW4gYXV4ZW50IGV4aXN0cywgb3RoZXJ3aXNlIHVzZSB0aGUgc3ltYm9sCisJICAgICBpdHNlbGYuICBTaW1wbGUgZW5vdWdoLiAgKi8KKwkgIGlmICghc3RyY21wIChjcy0+Y19uYW1lLCAiLmZpbGUiKSAmJiBjcy0+Y19uYXV4ID4gMCkKKwkgICAgeworCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCByYXdfYXV4cHRyLCBjcy0+Y190eXBlLCBjcy0+Y19zY2xhc3MsCisJCQkJICAgIDAsIGNzLT5jX25hdXgsICZtYWluX2F1eCk7CisJICAgICAgZmlsZXN0cmluZyA9IGNvZmZfZ2V0ZmlsZW5hbWUgKCZtYWluX2F1eCwgb2JqZmlsZSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgZmlsZXN0cmluZyA9IGNzLT5jX25hbWU7CisKKwkgIHN0YXJ0X3N0YWJzICgpOworCSAgc3RhcnRfc3ltdGFiIChmaWxlc3RyaW5nLCAoY2hhciAqKU5VTEwsIChDT1JFX0FERFIpMCk7CisJICByZWNvcmRfZGVidWdmb3JtYXQgKCJYQ09GRiIpOworCSAgbGFzdF9jc2VjdF9uYW1lID0gMDsKKworCSAgLyogcmVzZXQgZmlsZSBzdGFydCBhbmQgZW5kIGFkZHJlc3Nlcy4gQSBjb21waWxhdGlvbiB1bml0IHdpdGggbm8gdGV4dAorCSAgICAgKG9ubHkgZGF0YSkgc2hvdWxkIGhhdmUgemVybyBmaWxlIGJvdW5kYXJpZXMuICovCisJICBmaWxlX3N0YXJ0X2FkZHIgPSBmaWxlX2VuZF9hZGRyID0gMDsKKwkgIGJyZWFrOworCisJY2FzZSBDX0ZVTjoKKwkgIGZjbl9zdGFiX3NhdmVkID0gKmNzOworCSAgYnJlYWs7CisKKwljYXNlIENfRkNOOgorCSAgaWYgKFNUUkVRIChjcy0+Y19uYW1lLCAiLmJmIikpCisJICAgIHsKKwkgICAgICBDT1JFX0FERFIgb2ZmID0gQU5PRkZTRVQgKG9iamZpbGUtPnNlY3Rpb25fb2Zmc2V0cywKKwkJCQkJU0VDVF9PRkZfVEVYVCk7CisJICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGFiZmQsIHJhd19hdXhwdHIsIGNzLT5jX3R5cGUsIGNzLT5jX3NjbGFzcywKKwkJCQkgICAgMCwgY3MtPmNfbmF1eCwgJm1haW5fYXV4KTsKKworCSAgICAgIHdpdGhpbl9mdW5jdGlvbiA9IDE7CisKKwkgICAgICBuZXcgPSBwdXNoX2NvbnRleHQgKDAsIGZjbl9zdGFydF9hZGRyICsgb2ZmKTsKKworCSAgICAgIG5ldy0+bmFtZSA9IGRlZmluZV9zeW1ib2wgCisJCShmY25fY3Nfc2F2ZWQuY192YWx1ZSArIG9mZiwKKwkJIGZjbl9zdGFiX3NhdmVkLmNfbmFtZSwgMCwgMCwgb2JqZmlsZSk7CisJICAgICAgaWYgKG5ldy0+bmFtZSAhPSBOVUxMKQorCQlTWU1CT0xfU0VDVElPTiAobmV3LT5uYW1lKSA9IFNFQ1RfT0ZGX1RFWFQ7CisJICAgIH0KKwkgIGVsc2UgaWYgKFNUUkVRIChjcy0+Y19uYW1lLCAiLmVmIikpCisJICAgIHsKKworCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCByYXdfYXV4cHRyLCBjcy0+Y190eXBlLCBjcy0+Y19zY2xhc3MsCisJCQkJICAgIDAsIGNzLT5jX25hdXgsICZtYWluX2F1eCk7CisKKwkgICAgICAvKiBUaGUgdmFsdWUgb2YgLmVmIGlzIHRoZSBhZGRyZXNzIG9mIGVwaWxvZ3VlIGNvZGU7CisJCSBub3QgdXNlZnVsIGZvciBnZGIuICAqLworCSAgICAgIC8qIHsgbWFpbl9hdXgueF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8KKwkJIGNvbnRhaW5zIG51bWJlciBvZiBsaW5lcyB0byAnfScgKi8KKworCSAgICAgIGlmIChjb250ZXh0X3N0YWNrX2RlcHRoIDw9IDApCisJCXsJCS8qIFdlIGF0dGVtcHRlZCB0byBwb3AgYW4gZW1wdHkgY29udGV4dCBzdGFjayAqLworCQkgIGNvbXBsYWluICgmZWZfY29tcGxhaW50LCBjcy0+Y19zeW1udW0pOworCQkgIHdpdGhpbl9mdW5jdGlvbiA9IDA7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBuZXcgPSBwb3BfY29udGV4dCAoKTsKKwkgICAgICAvKiBTdGFjayBtdXN0IGJlIGVtcHR5IG5vdy4gICovCisJICAgICAgaWYgKGNvbnRleHRfc3RhY2tfZGVwdGggPiAwIHx8IG5ldyA9PSBOVUxMKQorCQl7CisJCSAgY29tcGxhaW4gKCZlZl9jb21wbGFpbnQsIGNzLT5jX3N5bW51bSk7CisJCSAgd2l0aGluX2Z1bmN0aW9uID0gMDsKKwkJICBicmVhazsKKwkJfQorCisJICAgICAgZmluaXNoX2Jsb2NrIChuZXctPm5hbWUsICZsb2NhbF9zeW1ib2xzLCBuZXctPm9sZF9ibG9ja3MsCisJCQkgICAgbmV3LT5zdGFydF9hZGRyLAorCQkJICAgIChmY25fY3Nfc2F2ZWQuY192YWx1ZQorCQkJICAgICArIGZjbl9hdXhfc2F2ZWQueF9zeW0ueF9taXNjLnhfZnNpemUKKwkJCSAgICAgKyBBTk9GRlNFVCAob2JqZmlsZS0+c2VjdGlvbl9vZmZzZXRzLAorCQkJCQkgU0VDVF9PRkZfVEVYVCkpLAorCQkJICAgIG9iamZpbGUpOworCSAgICAgIHdpdGhpbl9mdW5jdGlvbiA9IDA7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBDX0JTVEFUOgorCSAgLyogQmVnaW4gc3RhdGljIGJsb2NrLiAgKi8KKwkgIHsKKwkgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW1ib2w7CisKKwkgICAgcmVhZF9zeW1ib2wgKCZzeW1ib2wsIGNzLT5jX3ZhbHVlKTsKKwkgICAgc3RhdGljX2Jsb2NrX2Jhc2UgPSBzeW1ib2wubl92YWx1ZTsKKwkgICAgc3RhdGljX2Jsb2NrX3NlY3Rpb24gPQorCSAgICAgIHNlY251bV90b19zZWN0aW9uIChzeW1ib2wubl9zY251bSwgb2JqZmlsZSk7CisJICB9CisJICBicmVhazsKKworCWNhc2UgQ19FU1RBVDoKKwkgIC8qIEVuZCBvZiBzdGF0aWMgYmxvY2suICAqLworCSAgc3RhdGljX2Jsb2NrX2Jhc2UgPSAwOworCSAgc3RhdGljX2Jsb2NrX3NlY3Rpb24gPSAtMTsKKwkgIGJyZWFrOworCisJY2FzZSBDX0FSRzoKKwljYXNlIENfUkVHUEFSTToKKwljYXNlIENfUkVHOgorCWNhc2UgQ19UUERFRjoKKwljYXNlIENfU1RSVEFHOgorCWNhc2UgQ19VTlRBRzoKKwljYXNlIENfRU5UQUc6CisJICB7CisJICAgIHN0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IG1zZyA9CisJICAgICAgeyJVbnJlY29nbml6ZWQgc3RvcmFnZSBjbGFzcyAlZC4iLCAwLCAwfTsKKwkgICAgY29tcGxhaW4gKCZtc2csIGNzLT5jX3NjbGFzcyk7CisJICB9CisJICBicmVhazsKKworCWNhc2UgQ19MQUJFTDoKKwljYXNlIENfTlVMTDoKKwkgIC8qIElnbm9yZSB0aGVzZS4gICovCisJICBicmVhazsKKworCWNhc2UgQ19ISURFWFQ6CisJY2FzZSBDX1NUQVQ6CisJICBicmVhazsKKworCWNhc2UgQ19CSU5DTDoKKwkgIC8qIGJlZ2lubmluZyBvZiBpbmNsdWRlIGZpbGUgKi8KKwkgIC8qIEluIHhsYyBvdXRwdXQsIENfQklOQ0wvQ19FSU5DTCBwYWlyIGRvZXNuJ3Qgc2hvdyB1cCBpbiBzb3J0ZWQKKwkgICAgIG9yZGVyLiBUaHVzLCB3aGVuIHdlZSBzZWUgdGhlbSwgd2UgbWlnaHQgbm90IGtub3cgZW5vdWdoIGluZm8KKwkgICAgIHRvIHByb2Nlc3MgdGhlbS4gVGh1cywgd2UnbGwgYmUgc2F2aW5nIHRoZW0gaW50byBhIHRhYmxlIAorCSAgICAgKGluY2xUYWJsZSkgYW5kIHBvc3Rwb25lIHRoZWlyIHByb2Nlc3NpbmcuICovCisKKwkgIHJlY29yZF9pbmNsdWRlX2JlZ2luIChjcyk7CisJICBicmVhazsKKworCWNhc2UgQ19FSU5DTDoKKwkgIC8qIEVuZCBvZiBpbmNsdWRlIGZpbGUuICAqLworCSAgLyogU2VlIHRoZSBjb21tZW50IGFmdGVyIGNhc2UgQ19CSU5DTC4gICovCisJICByZWNvcmRfaW5jbHVkZV9lbmQgKGNzKTsKKwkgIGJyZWFrOworCisJY2FzZSBDX0JMT0NLOgorCSAgaWYgKFNUUkVRIChjcy0+Y19uYW1lLCAiLmJiIikpCisJICAgIHsKKwkgICAgICBkZXB0aCsrOworCSAgICAgIG5ldyA9IHB1c2hfY29udGV4dCAoZGVwdGgsCisJCQkJICAoY3MtPmNfdmFsdWUKKwkJCQkgICArIEFOT0ZGU0VUIChvYmpmaWxlLT5zZWN0aW9uX29mZnNldHMsCisJCQkJCSAgICAgICBTRUNUX09GRl9URVhUKSkpOworCSAgICB9CisJICBlbHNlIGlmIChTVFJFUSAoY3MtPmNfbmFtZSwgIi5lYiIpKQorCSAgICB7CisJICAgICAgaWYgKGNvbnRleHRfc3RhY2tfZGVwdGggPD0gMCkKKwkJewkJLyogV2UgYXR0ZW1wdGVkIHRvIHBvcCBhbiBlbXB0eSBjb250ZXh0IHN0YWNrICovCisJCSAgY29tcGxhaW4gKCZlYl9jb21wbGFpbnQsIGNzLT5jX3N5bW51bSk7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBuZXcgPSBwb3BfY29udGV4dCAoKTsKKwkgICAgICBpZiAoZGVwdGgtLSAhPSBuZXctPmRlcHRoKQorCQl7CisJCSAgY29tcGxhaW4gKCZlYl9jb21wbGFpbnQsIGNzLT5jX3N5bW51bSk7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBpZiAobG9jYWxfc3ltYm9scyAmJiBjb250ZXh0X3N0YWNrX2RlcHRoID4gMCkKKwkJeworCQkgIC8qIE1ha2UgYSBibG9jayBmb3IgdGhlIGxvY2FsIHN5bWJvbHMgd2l0aGluLiAgKi8KKwkJICBmaW5pc2hfYmxvY2sgKG5ldy0+bmFtZSwgJmxvY2FsX3N5bWJvbHMsIG5ldy0+b2xkX2Jsb2NrcywKKwkJCQluZXctPnN0YXJ0X2FkZHIsCisJCQkJKGNzLT5jX3ZhbHVlCisJCQkJICsgQU5PRkZTRVQgKG9iamZpbGUtPnNlY3Rpb25fb2Zmc2V0cywKKwkJCQkJICAgICBTRUNUX09GRl9URVhUKSksCisJCQkJb2JqZmlsZSk7CisJCX0KKwkgICAgICBsb2NhbF9zeW1ib2xzID0gbmV3LT5sb2NhbHM7CisJICAgIH0KKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIHByb2Nlc3NfeGNvZmZfc3ltYm9sIChjcywgb2JqZmlsZSk7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGlmIChsYXN0X3NvdXJjZV9maWxlKQorICAgIHsKKyAgICAgIHN0cnVjdCBzeW10YWIgKnM7CisKKyAgICAgIGNvbXBsZXRlX3N5bXRhYiAoZmlsZXN0cmluZywgZmlsZV9zdGFydF9hZGRyKTsKKyAgICAgIGN1cl9zcmNfZW5kX2FkZHIgPSBmaWxlX2VuZF9hZGRyOworICAgICAgcyA9IGVuZF9zeW10YWIgKGZpbGVfZW5kX2FkZHIsIG9iamZpbGUsIFNFQ1RfT0ZGX1RFWFQpOworICAgICAgLyogV2hlbiByZWFkaW5nIHN5bWJvbHMgZm9yIHRoZSBsYXN0IENfRklMRSBvZiB0aGUgb2JqZmlsZSwgdHJ5CisgICAgICAgICB0byBtYWtlIHN1cmUgdGhhdCB3ZSBzZXQgcHN0LT5zeW10YWIgdG8gdGhlIHN5bXRhYiBmb3IgdGhlCisgICAgICAgICBmaWxlLCBub3QgdG8gdGhlIF9nbG9iYWxzXyBzeW10YWIuICBJJ20gbm90IHN1cmUgd2hldGhlciB0aGlzCisgICAgICAgICBhY3R1YWxseSB3b3JrcyByaWdodCBvciB3aGVuL2lmIGl0IGNvbWVzIHVwLiAgKi8KKyAgICAgIGlmIChwc3QtPnN5bXRhYiA9PSBOVUxMKQorCXBzdC0+c3ltdGFiID0gczsKKyAgICAgIGVuZF9zdGFicyAoKTsKKyAgICB9Cit9CisKKyNkZWZpbmUJU1lNQk9MX0RVUChTWU1CT0wxLCBTWU1CT0wyKQlcCisgIChTWU1CT0wyKSA9IChzdHJ1Y3Qgc3ltYm9sICopCQlcCisgIAlvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssIHNpemVvZiAoc3RydWN0IHN5bWJvbCkpOyBcCisgICooU1lNQk9MMikgPSAqKFNZTUJPTDEpOworICAKKyAKKyNkZWZpbmUJU1lNTkFNRV9BTExPQyhOQU1FLCBBTExPQ0VEKQlcCisgIChBTExPQ0VEKSA/IChOQU1FKSA6IG9ic2F2ZXN0cmluZyAoKE5BTUUpLCBzdHJsZW4gKE5BTUUpLCAmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2spOworCisKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqZnVuY19zeW1ib2xfdHlwZTsKK3N0YXRpYyBzdHJ1Y3QgdHlwZSAqdmFyX3N5bWJvbF90eXBlOworCisvKiBwcm9jZXNzIG9uZSB4Y29mZiBzeW1ib2wuICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9sICoKK3Byb2Nlc3NfeGNvZmZfc3ltYm9sIChjcywgb2JqZmlsZSkKKyAgcmVnaXN0ZXIgc3RydWN0IGNvZmZfc3ltYm9sICpjczsKKyAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0cnVjdCBzeW1ib2wgb25lc3ltYm9sOworICByZWdpc3RlciBzdHJ1Y3Qgc3ltYm9sICpzeW0gPSAmb25lc3ltYm9sOworICBzdHJ1Y3Qgc3ltYm9sICpzeW0yID0gTlVMTDsKKyAgY2hhciAqbmFtZSwgKnBwOworCisgIGludCBzZWM7CisgIENPUkVfQUREUiBvZmY7CisKKyAgaWYgKGNzLT5jX3NlY251bSA8IDApCisgICAgeworICAgICAgLyogVGhlIHZhbHVlIGlzIGEgcmVnaXN0ZXIgbnVtYmVyLCBvZmZzZXQgd2l0aGluIGEgZnJhbWUsIGV0Yy4sCisJIGFuZCBkb2VzIG5vdCBnZXQgcmVsb2NhdGVkLiAgKi8KKyAgICAgIG9mZiA9IDA7CisgICAgICBzZWMgPSAtMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzZWMgPSBzZWNudW1fdG9fc2VjdGlvbiAoY3MtPmNfc2VjbnVtLCBvYmpmaWxlKTsKKyAgICAgIG9mZiA9IEFOT0ZGU0VUIChvYmpmaWxlLT5zZWN0aW9uX29mZnNldHMsIHNlYyk7CisgICAgfQorCisgIG5hbWUgPSBjcy0+Y19uYW1lOworICBpZiAobmFtZVswXSA9PSAnLicpCisgICAgKytuYW1lOworCisgIG1lbXNldCAoc3ltLCAnXDAnLCBzaXplb2YgKHN0cnVjdCBzeW1ib2wpKTsKKworICAvKiBkZWZhdWx0IGFzc3VtcHRpb25zICovCisgIFNZTUJPTF9WQUxVRSAoc3ltKSA9IGNzLT5jX3ZhbHVlICsgb2ZmOworICBTWU1CT0xfTkFNRVNQQUNFIChzeW0pID0gVkFSX05BTUVTUEFDRTsKKyAgU1lNQk9MX1NFQ1RJT04gKHN5bSkgPSBzZWNudW1fdG9fc2VjdGlvbiAoY3MtPmNfc2VjbnVtLCBvYmpmaWxlKTsKKworICBpZiAoSVNGQ04gKGNzLT5jX3R5cGUpKQorICAgIHsKKyAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIHdlIGRvbid0IGtub3cgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLiAgVGhpcworCSB3aWxsIGJlIHBhdGNoZWQgd2l0aCB0aGUgdHlwZSBmcm9tIGl0cyBzdGFiIGVudHJ5IGxhdGVyIG9uIGluCisJIHBhdGNoX2Jsb2NrX3N0YWJzICgpLCB1bmxlc3MgdGhlIGZpbGUgd2FzIGNvbXBpbGVkIHdpdGhvdXQgLWcuICAqLworCisgICAgICBTWU1CT0xfTkFNRSAoc3ltKSA9IFNZTU5BTUVfQUxMT0MgKG5hbWUsIHN5bW5hbWVfYWxsb2NlZCk7CisgICAgICBTWU1CT0xfVFlQRSAoc3ltKSA9IGZ1bmNfc3ltYm9sX3R5cGU7CisKKyAgICAgIFNZTUJPTF9DTEFTUyAoc3ltKSA9IExPQ19CTE9DSzsKKyAgICAgIFNZTUJPTF9EVVAgKHN5bSwgc3ltMik7CisKKyAgICAgIGlmIChjcy0+Y19zY2xhc3MgPT0gQ19FWFQpCisJYWRkX3N5bWJvbF90b19saXN0IChzeW0yLCAmZ2xvYmFsX3N5bWJvbHMpOworICAgICAgZWxzZSBpZiAoY3MtPmNfc2NsYXNzID09IENfSElERVhUIHx8IGNzLT5jX3NjbGFzcyA9PSBDX1NUQVQpCisJYWRkX3N5bWJvbF90b19saXN0IChzeW0yLCAmZmlsZV9zeW1ib2xzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBJbiBjYXNlIHdlIGNhbid0IGZpZ3VyZSBvdXQgdGhlIHR5cGUsIHByb3ZpZGUgZGVmYXVsdC4gKi8KKyAgICAgIFNZTUJPTF9UWVBFIChzeW0pID0gdmFyX3N5bWJvbF90eXBlOworCisgICAgICBzd2l0Y2ggKGNzLT5jX3NjbGFzcykKKwl7CisjaWYgMAorCS8qIFRoZSB2YWx1ZXMgb2YgZnVuY3Rpb25zIGFuZCBnbG9iYWwgc3ltYm9scyBhcmUgbm93IHJlc29sdmVkCisJICAgdmlhIHRoZSBnbG9iYWxfc3ltX2NoYWluIGluIHN0YWJzcmVhZC5jLiAgKi8KKwljYXNlIENfRlVOOgorCSAgaWYgKGZjbl9jc19zYXZlZC5jX3NjbGFzcyA9PSBDX0VYVCkKKwkgICAgYWRkX3N0YWJfdG9fbGlzdCAobmFtZSwgJmdsb2JhbF9zdGFicyk7CisJICBlbHNlCisJICAgIGFkZF9zdGFiX3RvX2xpc3QgKG5hbWUsICZmaWxlX3N0YWJzKTsKKwkgIGJyZWFrOworCisJY2FzZSBDX0dTWU06CisJICBhZGRfc3RhYl90b19saXN0IChuYW1lLCAmZ2xvYmFsX3N0YWJzKTsKKwkgIGJyZWFrOworI2VuZGlmCisKKwljYXNlIENfQkNPTU06CisJICBjb21tb25fYmxvY2tfc3RhcnQgKGNzLT5jX25hbWUsIG9iamZpbGUpOworCSAgYnJlYWs7CisKKwljYXNlIENfRUNPTU06CisJICBjb21tb25fYmxvY2tfZW5kIChvYmpmaWxlKTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIGNvbXBsYWluICgmc3RvcmNsYXNzX2NvbXBsYWludCwgY3MtPmNfc2NsYXNzKTsKKwkgIC8qIEZBTExUSFJPVUdIICovCisKKwljYXNlIENfREVDTDoKKwljYXNlIENfUFNZTToKKwljYXNlIENfUlBTWU06CisJY2FzZSBDX0VDT01MOgorCWNhc2UgQ19MU1lNOgorCWNhc2UgQ19SU1lNOgorCWNhc2UgQ19HU1lNOgorCisJICB7CisJICAgIHN5bSA9IGRlZmluZV9zeW1ib2wgKGNzLT5jX3ZhbHVlICsgb2ZmLCBjcy0+Y19uYW1lLCAwLCAwLCBvYmpmaWxlKTsKKwkgICAgaWYgKHN5bSAhPSBOVUxMKQorCSAgICAgIHsKKwkJU1lNQk9MX1NFQ1RJT04gKHN5bSkgPSBzZWM7CisJICAgICAgfQorCSAgICByZXR1cm4gc3ltOworCSAgfQorCisJY2FzZSBDX1NUU1lNOgorCisJICAvKiBGb3IgeGxjIChub3QgR0NDKSwgdGhlICdWJyBzeW1ib2wgZGVzY3JpcHRvciBpcyB1c2VkIGZvcgorCSAgICAgYWxsIHN0YXRpY3MgYW5kIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggZmlsZS1zY29wZSB2ZXJzdXMKKwkgICAgIGZ1bmN0aW9uLXNjb3BlIHVzaW5nIHdpdGhpbl9mdW5jdGlvbi4gIFdlIGRvIHRoaXMgYnkKKwkgICAgIGNoYW5naW5nIHRoZSBzdHJpbmcgd2UgcGFzcyB0byBkZWZpbmVfc3ltYm9sIHRvIHVzZSAnUycKKwkgICAgIHdoZXJlIHdlIG5lZWQgdG8sIHdoaWNoIGlzIG5vdCBuZWNlc3NhcmlseSBzdXBlci1jbGVhbiwKKwkgICAgIGJ1dCBzZWVtcyB3b3JrYWJsZSBlbm91Z2guICAqLworCisJICBpZiAoKm5hbWUgPT0gJzonIHx8IChwcCA9IChjaGFyICopIHN0cmNocihuYW1lLCAnOicpKSA9PSBOVUxMKQorCSAgICByZXR1cm4gTlVMTDsKKworCSAgKytwcDsKKwkgIGlmICgqcHAgPT0gJ1YnICYmICF3aXRoaW5fZnVuY3Rpb24pCisJICAgICpwcCA9ICdTJzsKKwkgIHN5bSA9IGRlZmluZV9zeW1ib2wgKChjcy0+Y192YWx1ZQorCQkJCSsgQU5PRkZTRVQgKG9iamZpbGUtPnNlY3Rpb25fb2Zmc2V0cywKKwkJCQkJICAgIHN0YXRpY19ibG9ja19zZWN0aW9uKSksCisJCQkgICAgICAgY3MtPmNfbmFtZSwgMCwgMCwgb2JqZmlsZSk7CisJICBpZiAoc3ltICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBTWU1CT0xfVkFMVUUgKHN5bSkgKz0gc3RhdGljX2Jsb2NrX2Jhc2U7CisJICAgICAgU1lNQk9MX1NFQ1RJT04gKHN5bSkgPSBzdGF0aWNfYmxvY2tfc2VjdGlvbjsKKwkgICAgfQorCSAgcmV0dXJuIHN5bTsKKworCX0KKyAgICB9CisgIHJldHVybiBzeW0yOworfQorCisvKiBFeHRyYWN0IHRoZSBmaWxlIG5hbWUgZnJvbSB0aGUgYXV4IGVudHJ5IG9mIGEgQ19GSUxFIHN5bWJvbC4KKyAgIFJlc3VsdCBpcyBpbiBzdGF0aWMgc3RvcmFnZSBhbmQgaXMgb25seSBnb29kIGZvciB0ZW1wb3JhcnkgdXNlLiAgKi8KKworc3RhdGljIGNoYXIgKgorY29mZl9nZXRmaWxlbmFtZSAoYXV4X2VudHJ5LCBvYmpmaWxlKQorICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eF9lbnRyeTsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIHN0YXRpYyBjaGFyIGJ1ZmZlcltCVUZTSVpdOworCisgIGlmIChhdXhfZW50cnktPnhfZmlsZS54X24ueF96ZXJvZXMgPT0gMCkKKyAgICBzdHJjcHkgKGJ1ZmZlciwKKwkgICAgKChzdHJ1Y3QgY29mZl9zeW1maWxlX2luZm8gKilvYmpmaWxlLT5zeW1fcHJpdmF0ZSktPnN0cnRibAorCSAgICArIGF1eF9lbnRyeS0+eF9maWxlLnhfbi54X29mZnNldCk7CisgIGVsc2UKKyAgICB7CisgICAgICBzdHJuY3B5IChidWZmZXIsIGF1eF9lbnRyeS0+eF9maWxlLnhfZm5hbWUsIEZJTE5NTEVOKTsKKyAgICAgIGJ1ZmZlcltGSUxOTUxFTl0gPSAnXDAnOworICAgIH0KKyAgcmV0dXJuIChidWZmZXIpOworfQorCisvKiBTZXQgKlNZTUJPTCB0byBzeW1ib2wgbnVtYmVyIHN5bW5vIGluIHN5bXRibC4gICovCitzdGF0aWMgdm9pZAorcmVhZF9zeW1ib2wgKHN5bWJvbCwgc3ltbm8pCisgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bWJvbDsKKyAgICAgaW50IHN5bW5vOworeworICBpbnQgbnN5bXMgPQorICAgICgoc3RydWN0IGNvZmZfc3ltZmlsZV9pbmZvICopdGhpc19zeW10YWJfcHN5bXRhYi0+b2JqZmlsZS0+c3ltX3ByaXZhdGUpCisgICAgICAtPnN5bXRibF9udW1fc3ltczsKKyAgY2hhciAqc3RibCA9IAorICAgICgoc3RydWN0IGNvZmZfc3ltZmlsZV9pbmZvICopdGhpc19zeW10YWJfcHN5bXRhYi0+b2JqZmlsZS0+c3ltX3ByaXZhdGUpCisgICAgICAtPnN5bXRibDsKKyAgaWYgKHN5bW5vIDwgMCB8fCBzeW1ubyA+PSBuc3ltcykKKyAgICB7CisgICAgICBzdGF0aWMgc3RydWN0IGNvbXBsYWludCBtc2cgPQorCXsiSW52YWxpZCBzeW1ib2wgb2Zmc2V0IiwgMCwgMH07CisgICAgICBjb21wbGFpbiAoJm1zZyk7CisgICAgICBzeW1ib2wtPm5fdmFsdWUgPSAwOworICAgICAgc3ltYm9sLT5uX3NjbnVtID0gLTE7CisgICAgICByZXR1cm47CisgICAgfQorICBiZmRfY29mZl9zd2FwX3N5bV9pbiAodGhpc19zeW10YWJfcHN5bXRhYi0+b2JqZmlsZS0+b2JmZCwKKwkJCXN0YmwgKyAoc3ltbm8qbG9jYWxfc3ltZXN6KSwKKwkJCXN5bWJvbCk7Cit9CisgIAorLyogR2V0IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gc3ltYm9sIG51bWJlciBzeW1ubyBpbiBzeW10YmwuICAqLworCitzdGF0aWMgaW50CityZWFkX3N5bWJvbF9udmFsdWUgKHN5bW5vKQorICAgICBpbnQgc3ltbm87Cit7CisgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltYm9sWzFdOworCisgIHJlYWRfc3ltYm9sIChzeW1ib2wsIHN5bW5vKTsKKyAgcmV0dXJuIHN5bWJvbC0+bl92YWx1ZTsgIAorfQorCisKKy8qIEZpbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gc3ltbm8sIHdoZXJlCisgICBzeW1ubyBpcyB0aGUgc3ltYm9sIHBvaW50ZWQgdG8gYnkgdGhlIGxpbmV0YWJsZS4gICovCisKK3N0YXRpYyBpbnQKK3JlYWRfc3ltYm9sX2xpbmVubyAoc3ltbm8pCisgICAgIGludCBzeW1ubzsKK3sKKyAgaW50IG5zeW1zID0KKyAgICAoKHN0cnVjdCBjb2ZmX3N5bWZpbGVfaW5mbyAqKXRoaXNfc3ltdGFiX3BzeW10YWItPm9iamZpbGUtPnN5bV9wcml2YXRlKQorICAgICAgLT5zeW10YmxfbnVtX3N5bXM7CisgIGNoYXIgKnN0YmwgPSAKKyAgICAoKHN0cnVjdCBjb2ZmX3N5bWZpbGVfaW5mbyAqKXRoaXNfc3ltdGFiX3BzeW10YWItPm9iamZpbGUtPnN5bV9wcml2YXRlKQorICAgICAgLT5zeW10Ymw7CisgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltYm9sWzFdOworICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgbWFpbl9hdXhbMV07CisKKyAgaWYgKHN5bW5vIDwgMCkKKyAgICB7CisgICAgICBjb21wbGFpbiAoJmJmX25vdGZvdW5kX2NvbXBsYWludCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogTm90ZSB0aGF0IGp1c3Qgc2VhcmNoaW5nIGZvciBhIHNob3J0IGRpc3RhbmNlIChlLmcuIDUwIHN5bWJvbHMpCisgICAgIGlzIG5vdCBlbm91Z2gsIGF0IGxlYXN0IGluIHRoZSBmb2xsb3dpbmcgY2FzZS4KKworICAgICAuZXh0ZXJuIGZvbworICAgICBbbWFueSAuc3RhYnggZW50cmllc10KKyAgICAgW2EgZmV3IGZ1bmN0aW9ucywgcmVmZXJyaW5nIHRvIGZvb10KKyAgICAgLmdsb2JsIGZvbworICAgICAuYmYKKworICAgICBXaGF0IGhhcHBlbnMgaGVyZSBpcyB0aGF0IHRoZSBhc3NlbWJsZXIgbW92ZXMgdGhlIC5zdGFieCBlbnRyaWVzCisgICAgIHRvIHJpZ2h0IGJlZm9yZSB0aGUgIi5iZiIgZm9yIGZvbywgYnV0IHRoZSBzeW1ib2wgZm9yICJmb28iIGlzIGJlZm9yZQorICAgICBhbGwgdGhlIHN0YWJ4IGVudHJpZXMuICBTZWUgUFIgZ2RiLzIyMjIuICAqLworCisgIC8qIE1haW50YWluaW5nIGEgdGFibGUgb2YgLmJmIGVudHJpZXMgbWlnaHQgYmUgcHJlZmVyYWJsZSB0byB0aGlzIHNlYXJjaC4KKyAgICAgSWYgSSB1bmRlcnN0YW5kIHRoaW5ncyBjb3JyZWN0bHkgaXQgd291bGQgbmVlZCB0byBiZSBkb25lIG9ubHkgZm9yCisgICAgIHRoZSBkdXJhdGlvbiBvZiBhIHNpbmdsZSBwc3ltdGFiIHRvIHN5bXRhYiBjb252ZXJzaW9uLiAgKi8KKyAgd2hpbGUgKHN5bW5vIDwgbnN5bXMpCisgICAgeworICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKHN5bWZpbGVfYmZkLAorCQkJICAgIHN0YmwgKyAoc3ltbm8gKiBsb2NhbF9zeW1lc3opLCBzeW1ib2wpOworICAgICAgaWYgKHN5bWJvbC0+bl9zY2xhc3MgPT0gQ19GQ04gJiYgU1RSRVEgKHN5bWJvbC0+bl9uYW1lLCAiLmJmIikpCisJZ290byBnb3RpdDsKKyAgICAgIHN5bW5vICs9IHN5bWJvbC0+bl9udW1hdXggKyAxOworICAgIH0KKworICBjb21wbGFpbiAoJmJmX25vdGZvdW5kX2NvbXBsYWludCk7CisgIHJldHVybiAwOworCitnb3RpdDoKKyAgLyogdGFrZSBhdXggZW50cnkgYW5kIHJldHVybiBpdHMgbGluZW5vICovCisgIHN5bW5vKys7CisgIGJmZF9jb2ZmX3N3YXBfYXV4X2luICh0aGlzX3N5bXRhYl9wc3ltdGFiLT5vYmpmaWxlLT5vYmZkLAorCQkJc3RibCArIHN5bW5vICogbG9jYWxfc3ltZXN6LAorCQkJc3ltYm9sLT5uX3R5cGUsIHN5bWJvbC0+bl9zY2xhc3MsCisJCQkwLCBzeW1ib2wtPm5fbnVtYXV4LCBtYWluX2F1eCk7CisKKyAgcmV0dXJuIG1haW5fYXV4LT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubzsKK30KKworLyogU3VwcG9ydCBmb3IgbGluZSBudW1iZXIgaGFuZGxpbmcgKi8KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGV2ZXJ5IHNlY3Rpb247IGl0IGZpbmRzIHRoZSBvdXRlciBsaW1pdHMKKyAqIG9mIHRoZSBsaW5lIHRhYmxlIChtaW5pbXVtIGFuZCBtYXhpbXVtIGZpbGUgb2Zmc2V0KSBzbyB0aGF0IHRoZQorICogbWFpbmxpbmUgY29kZSBjYW4gcmVhZCB0aGUgd2hvbGUgdGhpbmcgZm9yIGVmZmljaWVuY3kuCisgKi8KK3N0YXRpYyB2b2lkCitmaW5kX2xpbmVub3MgKGFiZmQsIGFzZWN0LCB2cGluZm8pCisgICAgIGJmZCAqYWJmZDsKKyAgICAgc2VjX3B0ciBhc2VjdDsKKyAgICAgUFRSIHZwaW5mbzsgCit7CisgIHN0cnVjdCBjb2ZmX3N5bWZpbGVfaW5mbyAqaW5mbzsKKyAgaW50IHNpemUsIGNvdW50OworICBmaWxlX3B0ciBvZmZzZXQsIG1heG9mZjsKKworICBjb3VudCA9IGFzZWN0LT5saW5lbm9fY291bnQ7CisKKyAgaWYgKCFTVFJFUSAoYXNlY3QtPm5hbWUsICIudGV4dCIpIHx8IGNvdW50ID09IDApCisgICAgcmV0dXJuOworCisgIHNpemUgPSBjb3VudCAqIGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX2xpbmVzejsKKyAgaW5mbyA9IChzdHJ1Y3QgY29mZl9zeW1maWxlX2luZm8gKil2cGluZm87CisgIG9mZnNldCA9IGFzZWN0LT5saW5lX2ZpbGVwb3M7CisgIG1heG9mZiA9IG9mZnNldCArIHNpemU7CisKKyAgaWYgKG9mZnNldCA8IGluZm8tPm1pbl9saW5lbm9fb2Zmc2V0IHx8IGluZm8tPm1pbl9saW5lbm9fb2Zmc2V0ID09IDApCisgICAgaW5mby0+bWluX2xpbmVub19vZmZzZXQgPSBvZmZzZXQ7CisKKyAgaWYgKG1heG9mZiA+IGluZm8tPm1heF9saW5lbm9fb2Zmc2V0KQorICAgIGluZm8tPm1heF9saW5lbm9fb2Zmc2V0ID0gbWF4b2ZmOworfQorDAorc3RhdGljIHZvaWQgeGNvZmZfcHN5bXRhYl90b19zeW10YWJfMSBQQVJBTVMgKChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworCitzdGF0aWMgdm9pZAoreGNvZmZfcHN5bXRhYl90b19zeW10YWJfMSAocHN0KQorICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdDsKK3sKKyAgc3RydWN0IGNsZWFudXAgKm9sZF9jaGFpbjsKKyAgaW50IGk7CisgIAorICBpZiAoIXBzdCkKKyAgICByZXR1cm47CisKKyAgaWYgKHBzdC0+cmVhZGluKQorICAgIHsKKyAgICAgIGZwcmludGZfdW5maWx0ZXJlZAorCShnZGJfc3RkZXJyLCAiUHN5bXRhYiBmb3IgJXMgYWxyZWFkeSByZWFkIGluLiAgU2hvdWxkbid0IGhhcHBlbi5cbiIsCisJIHBzdC0+ZmlsZW5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBSZWFkIGluIGFsbCBwYXJ0aWFsIHN5bXRhYnMgb24gd2hpY2ggdGhpcyBvbmUgaXMgZGVwZW5kZW50ICovCisgIGZvciAoaSA9IDA7IGkgPCBwc3QtPm51bWJlcl9vZl9kZXBlbmRlbmNpZXM7IGkrKykKKyAgICBpZiAoIXBzdC0+ZGVwZW5kZW5jaWVzW2ldLT5yZWFkaW4pCisgICAgICB7CisJLyogSW5mb3JtIGFib3V0IGFkZGl0aW9uYWwgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIHJlYWQgaW4uICAqLworCWlmIChpbmZvX3ZlcmJvc2UpCisJICB7CisJICAgIGZwdXRzX2ZpbHRlcmVkICgiICIsIGdkYl9zdGRvdXQpOworCSAgICB3cmFwX2hlcmUgKCIiKTsKKwkgICAgZnB1dHNfZmlsdGVyZWQgKCJhbmQgIiwgZ2RiX3N0ZG91dCk7CisJICAgIHdyYXBfaGVyZSAoIiIpOworCSAgICBwcmludGZfZmlsdGVyZWQgKCIlcy4uLiIsIHBzdC0+ZGVwZW5kZW5jaWVzW2ldLT5maWxlbmFtZSk7CisJICAgIHdyYXBfaGVyZSAoIiIpOwkJLyogRmx1c2ggb3V0cHV0ICovCisJICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisJICB9CisJeGNvZmZfcHN5bXRhYl90b19zeW10YWJfMSAocHN0LT5kZXBlbmRlbmNpZXNbaV0pOworICAgICAgfQorCisgIGlmICgoKHN0cnVjdCBzeW1sb2MgKilwc3QtPnJlYWRfc3ltdGFiX3ByaXZhdGUpLT5udW1zeW1zICE9IDApCisgICAgeworICAgICAgLyogSW5pdCBzdHVmZiBuZWNlc3NhcnkgZm9yIHJlYWRpbmcgaW4gc3ltYm9scy4gICovCisgICAgICBzdGFic3JlYWRfaW5pdCAoKTsKKyAgICAgIGJ1aWxkc3ltX2luaXQgKCk7CisgICAgICBvbGRfY2hhaW4gPSBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgcmVhbGx5X2ZyZWVfcGVuZGluZ3MsIDApOworCisgICAgICByZWFkX3hjb2ZmX3N5bXRhYiAocHN0KTsKKyAgICAgIHNvcnRfc3ltdGFiX3N5bXMgKHBzdC0+c3ltdGFiKTsKKworICAgICAgZG9fY2xlYW51cHMgKG9sZF9jaGFpbik7CisgICAgfQorCisgIHBzdC0+cmVhZGluID0gMTsKK30KKworc3RhdGljIHZvaWQgeGNvZmZfcHN5bXRhYl90b19zeW10YWIgUEFSQU1TICgoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKKworLyogUmVhZCBpbiBhbGwgb2YgdGhlIHN5bWJvbHMgZm9yIGEgZ2l2ZW4gcHN5bXRhYiBmb3IgcmVhbC4KKyAgIEJlIHZlcmJvc2UgYWJvdXQgaXQgaWYgdGhlIHVzZXIgd2FudHMgdGhhdC4gICovCisKK3N0YXRpYyB2b2lkCit4Y29mZl9wc3ltdGFiX3RvX3N5bXRhYiAocHN0KQorICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnBzdDsKK3sKKyAgYmZkICpzeW1fYmZkOworCisgIGlmICghcHN0KQorICAgIHJldHVybjsKKworICBpZiAocHN0LT5yZWFkaW4pCisgICAgeworICAgICAgZnByaW50Zl91bmZpbHRlcmVkCisJKGdkYl9zdGRlcnIsICJQc3ltdGFiIGZvciAlcyBhbHJlYWR5IHJlYWQgaW4uICBTaG91bGRuJ3QgaGFwcGVuLlxuIiwKKwkgcHN0LT5maWxlbmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICgoKHN0cnVjdCBzeW1sb2MgKilwc3QtPnJlYWRfc3ltdGFiX3ByaXZhdGUpLT5udW1zeW1zICE9IDAKKyAgICAgIHx8IHBzdC0+bnVtYmVyX29mX2RlcGVuZGVuY2llcykKKyAgICB7CisgICAgICAvKiBQcmludCB0aGUgbWVzc2FnZSBub3csIGJlZm9yZSByZWFkaW5nIHRoZSBzdHJpbmcgdGFibGUsCisJIHRvIGF2b2lkIGRpc2NvbmNlcnRpbmcgcGF1c2VzLiAgKi8KKyAgICAgIGlmIChpbmZvX3ZlcmJvc2UpCisJeworCSAgcHJpbnRmX2ZpbHRlcmVkICgiUmVhZGluZyBpbiBzeW1ib2xzIGZvciAlcy4uLiIsIHBzdC0+ZmlsZW5hbWUpOworCSAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKwl9CisKKyAgICAgIHN5bV9iZmQgPSBwc3QtPm9iamZpbGUtPm9iZmQ7CisKKyAgICAgIG5leHRfc3ltYm9sX3RleHRfZnVuYyA9IHhjb2ZmX25leHRfc3ltYm9sX3RleHQ7CisKKyAgICAgIHhjb2ZmX3BzeW10YWJfdG9fc3ltdGFiXzEgKHBzdCk7CisKKyAgICAgIC8qIE1hdGNoIHdpdGggZ2xvYmFsIHN5bWJvbHMuICBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBvbmNlLAorICAgICAgICAgYWZ0ZXIgYWxsIG9mIHRoZSBzeW10YWJzIGFuZCBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIHJlYWQgaW4uICAgKi8KKyAgICAgIHNjYW5fZmlsZV9nbG9iYWxzIChwc3QtPm9iamZpbGUpOworCisgICAgICAvKiBGaW5pc2ggdXAgdGhlIGRlYnVnIGVycm9yIG1lc3NhZ2UuICAqLworICAgICAgaWYgKGluZm9fdmVyYm9zZSkKKwlwcmludGZfZmlsdGVyZWQgKCJkb25lLlxuIik7CisgICAgfQorfQorDAorc3RhdGljIHZvaWQKK3hjb2ZmX25ld19pbml0IChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgc3RhYnNyZWFkX25ld19pbml0ICgpOworICBidWlsZHN5bV9uZXdfaW5pdCAoKTsKK30KKworLyogRG8gaW5pdGlhbGl6YXRpb24gaW4gcHJlcGFyYXRpb24gZm9yIHJlYWRpbmcgc3ltYm9scyBmcm9tIE9CSkZJTEUuCisgCisgICBXZSB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIHRoaXMgaXMgYW4gWENPRkYgb3IgWENPRkYtbGlrZSBmaWxlLgorICAgQkZEIGhhbmRsZXMgZmlndXJpbmcgb3V0IHRoZSBmb3JtYXQgb2YgdGhlIGZpbGUsIGFuZCBjb2RlIGluIHN5bWZpbGUuYworICAgdXNlcyBCRkQncyBkZXRlcm1pbmF0aW9uIHRvIHZlY3RvciB0byB1cy4gICovCisKK3N0YXRpYyB2b2lkCit4Y29mZl9zeW1maWxlX2luaXQgKG9iamZpbGUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworeworICAvKiBBbGxvY2F0ZSBzdHJ1Y3QgdG8ga2VlcCB0cmFjayBvZiB0aGUgc3ltZmlsZSAqLworICBvYmpmaWxlIC0+IHN5bV9wcml2YXRlID0geG1tYWxsb2MgKG9iamZpbGUgLT4gbWQsCisJCQkJICAgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3N5bWZpbGVfaW5mbykpOworCisgIC8qIFhDT0ZGIG9iamVjdHMgbWF5IGJlIHJlb3JkZXJlZCwgc28gc2V0IE9CSkZfUkVPUkRFUkVELiAgSWYgd2UKKyAgICAgZmluZCB0aGlzIGNhdXNlcyBhIHNpZ25pZmljYW50IHNsb3dkb3duIGluIGdkYiB0aGVuIHdlIGNvdWxkCisgICAgIHNldCBpdCBpbiB0aGUgZGVidWcgc3ltYm9sIHJlYWRlcnMgb25seSB3aGVuIG5lY2Vzc2FyeS4gICovCisgIG9iamZpbGUtPmZsYWdzIHw9IE9CSkZfUkVPUkRFUkVEOworCisgIGluaXRfZW50cnlfcG9pbnRfaW5mbyAob2JqZmlsZSk7Cit9CisKKy8qIFBlcmZvcm0gYW55IGxvY2FsIGNsZWFudXBzIHJlcXVpcmVkIHdoZW4gd2UgYXJlIGRvbmUgd2l0aCBhIHBhcnRpY3VsYXIKKyAgIG9iamZpbGUuICBJLkUsIHdlIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBkaXNjYXJkaW5nIGFsbCBzeW1ib2wgaW5mb3JtYXRpb24KKyAgIGZvciBhbiBvYmpmaWxlLCBmcmVlaW5nIHVwIGFsbCBtZW1vcnkgaGVsZCBmb3IgaXQsIGFuZCB1bmxpbmtpbmcgdGhlCisgICBvYmpmaWxlIHN0cnVjdCBmcm9tIHRoZSBnbG9iYWwgbGlzdCBvZiBrbm93biBvYmpmaWxlcy4gKi8KKworc3RhdGljIHZvaWQKK3hjb2ZmX3N5bWZpbGVfZmluaXNoIChvYmpmaWxlKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgaWYgKG9iamZpbGUgLT4gc3ltX3ByaXZhdGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBtZnJlZSAob2JqZmlsZSAtPiBtZCwgb2JqZmlsZSAtPiBzeW1fcHJpdmF0ZSk7CisgICAgfQorCisgIC8qIFN0YXJ0IHdpdGggYSBmcmVzaCBpbmNsdWRlIHRhYmxlIGZvciB0aGUgbmV4dCBvYmpmaWxlLiAgKi8KKyAgaWYgKGluY2xUYWJsZSkKKyAgICB7CisgICAgICBmcmVlIChpbmNsVGFibGUpOworICAgICAgaW5jbFRhYmxlID0gTlVMTDsKKyAgICB9CisgIGluY2xJbmR4ID0gaW5jbExlbmd0aCA9IGluY2xEZXB0aCA9IDA7Cit9CisKKworc3RhdGljIHZvaWQKK2luaXRfc3RyaW5ndGFiIChhYmZkLCBvZmZzZXQsIG9iamZpbGUpCisgICAgIGJmZCAqYWJmZDsKKyAgICAgZmlsZV9wdHIgb2Zmc2V0OworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgbG9uZyBsZW5ndGg7CisgIGludCB2YWw7CisgIHVuc2lnbmVkIGNoYXIgbGVuZ3RoYnVmWzRdOworICBjaGFyICpzdHJ0Ymw7CisKKyAgKChzdHJ1Y3QgY29mZl9zeW1maWxlX2luZm8gKilvYmpmaWxlLT5zeW1fcHJpdmF0ZSktPnN0cnRibCA9IE5VTEw7CisKKyAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSA8IDApCisgICAgZXJyb3IgKCJjYW5ub3Qgc2VlayB0byBzdHJpbmcgdGFibGUgaW4gJXM6ICVzIiwKKwkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCisgIHZhbCA9IGJmZF9yZWFkICgoY2hhciAqKWxlbmd0aGJ1ZiwgMSwgc2l6ZW9mIGxlbmd0aGJ1ZiwgYWJmZCk7CisgIGxlbmd0aCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgbGVuZ3RoYnVmKTsKKworICAvKiBJZiBubyBzdHJpbmcgdGFibGUgaXMgbmVlZGVkLCB0aGVuIHRoZSBmaWxlIG1heSBlbmQgaW1tZWRpYXRlbHkKKyAgICAgYWZ0ZXIgdGhlIHN5bWJvbHMuICBKdXN0IHJldHVybiB3aXRoIGBzdHJ0YmwnIHNldCB0byBOVUxMLiAgKi8KKworICBpZiAodmFsICE9IHNpemVvZiBsZW5ndGhidWYgfHwgbGVuZ3RoIDwgc2l6ZW9mIGxlbmd0aGJ1ZikKKyAgICByZXR1cm47CisKKyAgLyogQWxsb2NhdGUgc3RyaW5nIHRhYmxlIGZyb20gc3ltYm9sX29ic3RhY2suIFdlIHdpbGwgbmVlZCB0aGlzIHRhYmxlCisgICAgIGFzIGxvbmcgYXMgd2UgaGF2ZSBpdHMgc3ltYm9sIHRhYmxlIGFyb3VuZC4gKi8KKworICBzdHJ0YmwgPSAoY2hhciAqKSBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssIGxlbmd0aCk7CisgICgoc3RydWN0IGNvZmZfc3ltZmlsZV9pbmZvICopb2JqZmlsZS0+c3ltX3ByaXZhdGUpLT5zdHJ0YmwgPSBzdHJ0Ymw7CisKKyAgLyogQ29weSBsZW5ndGggYnVmZmVyLCB0aGUgZmlyc3QgYnl0ZSBpcyB1c3VhbGx5IHplcm8gYW5kIGlzCisgICAgIHVzZWQgZm9yIHN0YWJzIHdpdGggYSBuYW1lIGxlbmd0aCBvZiB6ZXJvLiAgKi8KKyAgbWVtY3B5IChzdHJ0YmwsIGxlbmd0aGJ1Ziwgc2l6ZW9mIGxlbmd0aGJ1Zik7CisgIGlmIChsZW5ndGggPT0gc2l6ZW9mIGxlbmd0aGJ1ZikKKyAgICByZXR1cm47CisKKyAgdmFsID0gYmZkX3JlYWQgKHN0cnRibCArIHNpemVvZiBsZW5ndGhidWYsIDEsIGxlbmd0aCAtIHNpemVvZiBsZW5ndGhidWYsCisJCSAgYWJmZCk7CisKKyAgaWYgKHZhbCAhPSBsZW5ndGggLSBzaXplb2YgbGVuZ3RoYnVmKQorICAgIGVycm9yICgiY2Fubm90IHJlYWQgc3RyaW5nIHRhYmxlIGZyb20gJXM6ICVzIiwKKwkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICBpZiAoc3RydGJsW2xlbmd0aCAtIDFdICE9ICdcMCcpCisgICAgZXJyb3IgKCJiYWQgc3ltYm9sIGZpbGU6IHN0cmluZyB0YWJsZSBkb2VzIG5vdCBlbmQgd2l0aCBudWxsIGNoYXJhY3RlciIpOworCisgIHJldHVybjsKK30KKwwKKy8qIElmIHdlIGhhdmUgbm90IHlldCBzZWVuIGEgZnVuY3Rpb24gZm9yIHRoaXMgcHN5bXRhYiwgdGhpcyBpcyAwLiAgSWYgd2UKKyAgIGhhdmUgc2VlbiBvbmUsIGl0IGlzIHRoZSBvZmZzZXQgaW4gdGhlIGxpbmUgbnVtYmVycyBvZiB0aGUgbGluZSBudW1iZXJzCisgICBmb3IgdGhlIHBzeW10YWIuICAqLworc3RhdGljIHVuc2lnbmVkIGludCBmaXJzdF9mdW5fbGluZV9vZmZzZXQ7CisKK3N0YXRpYyBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnhjb2ZmX3N0YXJ0X3BzeW10YWIKKyAgUEFSQU1TICgoc3RydWN0IG9iamZpbGUgKiwgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqLCBjaGFyICosIGludCwKKwkgICBzdHJ1Y3QgcGFydGlhbF9zeW1ib2wgKiosIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKikpOworCisvKiBBbGxvY2F0ZSBhbmQgcGFydGlhbGx5IGZpbGwgYSBwYXJ0aWFsIHN5bXRhYi4gIEl0IHdpbGwgYmUKKyAgIGNvbXBsZXRlbHkgZmlsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIHN5bWJvbCBsaXN0LgorCisgICBTWU1GSUxFX05BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbC1maWxlIHdlIGFyZSByZWFkaW5nIGZyb20sIGFuZCBBRERSCisgICBpcyB0aGUgYWRkcmVzcyByZWxhdGl2ZSB0byB3aGljaCBpdHMgc3ltYm9scyBhcmUgKGluY3JlbWVudGFsKSBvciAwCisgICAobm9ybWFsKS4gKi8KKworc3RhdGljIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqCit4Y29mZl9zdGFydF9wc3ltdGFiIChvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMsCisJCSAgICAgZmlsZW5hbWUsIGZpcnN0X3N5bW51bSwgZ2xvYmFsX3N5bXMsIHN0YXRpY19zeW1zKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworICAgICBjaGFyICpmaWxlbmFtZTsKKyAgICAgaW50IGZpcnN0X3N5bW51bTsKKyAgICAgc3RydWN0IHBhcnRpYWxfc3ltYm9sICoqZ2xvYmFsX3N5bXM7CisgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bWJvbCAqKnN0YXRpY19zeW1zOworeworICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKnJlc3VsdCA9CisgICAgc3RhcnRfcHN5bXRhYl9jb21tb24gKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywKKwkJCSAgZmlsZW5hbWUsCisJCQkgIC8qIFdlIGZpbGwgaW4gdGV4dGxvdyBsYXRlci4gICovCisJCQkgIDAsCisJCQkgIGdsb2JhbF9zeW1zLCBzdGF0aWNfc3ltcyk7CisKKyAgcmVzdWx0LT5yZWFkX3N5bXRhYl9wcml2YXRlID0gKGNoYXIgKikKKyAgICBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZSAtPiBwc3ltYm9sX29ic3RhY2ssIHNpemVvZiAoc3RydWN0IHN5bWxvYykpOworICAoKHN0cnVjdCBzeW1sb2MgKilyZXN1bHQtPnJlYWRfc3ltdGFiX3ByaXZhdGUpLT5maXJzdF9zeW1udW0gPSBmaXJzdF9zeW1udW07CisgIHJlc3VsdC0+cmVhZF9zeW10YWIgPSB4Y29mZl9wc3ltdGFiX3RvX3N5bXRhYjsKKworICAvKiBEZWR1Y2UgdGhlIHNvdXJjZSBsYW5ndWFnZSBmcm9tIHRoZSBmaWxlbmFtZSBmb3IgdGhpcyBwc3ltdGFiLiAqLworICBwc3ltdGFiX2xhbmd1YWdlID0gZGVkdWNlX2xhbmd1YWdlX2Zyb21fZmlsZW5hbWUgKGZpbGVuYW1lKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3RydWN0IHBhcnRpYWxfc3ltdGFiICp4Y29mZl9lbmRfcHN5bXRhYgorICBQQVJBTVMgKChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKiwgY2hhciAqKiwgaW50LCBpbnQsCisJICAgc3RydWN0IHBhcnRpYWxfc3ltdGFiICoqLCBpbnQsIGludCkpOworCisvKiBDbG9zZSBvZmYgdGhlIGN1cnJlbnQgdXNhZ2Ugb2YgUFNULiAgCisgICBSZXR1cm5zIFBTVCwgb3IgTlVMTCBpZiB0aGUgcGFydGlhbCBzeW10YWIgd2FzIGVtcHR5IGFuZCB0aHJvd24gYXdheS4KKworICAgQ0FQUElOR19TWU1CT0xfTlVNQkVSIGlzIHRoZSBlbmQgb2YgcHN0IChleGNsdXNpdmUpLgorCisgICBJTkNMVURFX0xJU1QsIE5VTV9JTkNMVURFUywgREVQRU5ERU5DWV9MSVNULCBhbmQgTlVNQkVSX0RFUEVOREVOQ0lFUworICAgYXJlIHRoZSBpbmZvcm1hdGlvbiBmb3IgaW5jbHVkZXMgYW5kIGRlcGVuZGVuY2llcy4gICovCisKK3N0YXRpYyBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKgoreGNvZmZfZW5kX3BzeW10YWIgKHBzdCwgaW5jbHVkZV9saXN0LCBudW1faW5jbHVkZXMsIGNhcHBpbmdfc3ltYm9sX251bWJlciwKKwkJICAgZGVwZW5kZW5jeV9saXN0LCBudW1iZXJfZGVwZW5kZW5jaWVzLCB0ZXh0bG93X25vdF9zZXQpCisgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN0OworICAgICBjaGFyICoqaW5jbHVkZV9saXN0OworICAgICBpbnQgbnVtX2luY2x1ZGVzOworICAgICBpbnQgY2FwcGluZ19zeW1ib2xfbnVtYmVyOworICAgICBzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKipkZXBlbmRlbmN5X2xpc3Q7CisgICAgIGludCBudW1iZXJfZGVwZW5kZW5jaWVzOworICAgICBpbnQgdGV4dGxvd19ub3Rfc2V0OworeworICBpbnQgaTsKKyAgc3RydWN0IG9iamZpbGUgKm9iamZpbGUgPSBwc3QgLT4gb2JqZmlsZTsKKworICBpZiAoY2FwcGluZ19zeW1ib2xfbnVtYmVyICE9IC0xKQorICAgICgoc3RydWN0IHN5bWxvYyAqKXBzdC0+cmVhZF9zeW10YWJfcHJpdmF0ZSktPm51bXN5bXMgPQorICAgICAgY2FwcGluZ19zeW1ib2xfbnVtYmVyCisJLSAoKHN0cnVjdCBzeW1sb2MgKilwc3QtPnJlYWRfc3ltdGFiX3ByaXZhdGUpLT5maXJzdF9zeW1udW07CisgICgoc3RydWN0IHN5bWxvYyAqKXBzdC0+cmVhZF9zeW10YWJfcHJpdmF0ZSktPmxpbmVub19vZmYgPQorICAgIGZpcnN0X2Z1bl9saW5lX29mZnNldDsKKyAgZmlyc3RfZnVuX2xpbmVfb2Zmc2V0ID0gMDsKKyAgcHN0LT5uX2dsb2JhbF9zeW1zID0KKyAgICBvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMubmV4dCAtIChvYmpmaWxlLT5nbG9iYWxfcHN5bWJvbHMubGlzdCArIHBzdC0+Z2xvYmFsc19vZmZzZXQpOworICBwc3QtPm5fc3RhdGljX3N5bXMgPQorICAgIG9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5uZXh0IC0gKG9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5saXN0ICsgcHN0LT5zdGF0aWNzX29mZnNldCk7CisKKyAgcHN0LT5udW1iZXJfb2ZfZGVwZW5kZW5jaWVzID0gbnVtYmVyX2RlcGVuZGVuY2llczsKKyAgaWYgKG51bWJlcl9kZXBlbmRlbmNpZXMpCisgICAgeworICAgICAgcHN0LT5kZXBlbmRlbmNpZXMgPSAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICoqKQorCW9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5wc3ltYm9sX29ic3RhY2ssCisJCSAgICAgICBudW1iZXJfZGVwZW5kZW5jaWVzICogc2l6ZW9mIChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKikpOworICAgICAgbWVtY3B5IChwc3QtPmRlcGVuZGVuY2llcywgZGVwZW5kZW5jeV9saXN0LAorCSAgICAgbnVtYmVyX2RlcGVuZGVuY2llcyAqIHNpemVvZiAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKKyAgICB9CisgIGVsc2UKKyAgICBwc3QtPmRlcGVuZGVuY2llcyA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9pbmNsdWRlczsgaSsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqc3VicHN0ID0KKwlhbGxvY2F0ZV9wc3ltdGFiIChpbmNsdWRlX2xpc3RbaV0sIG9iamZpbGUpOworCisgICAgICBzdWJwc3QtPnNlY3Rpb25fb2Zmc2V0cyA9IHBzdC0+c2VjdGlvbl9vZmZzZXRzOworICAgICAgc3VicHN0LT5yZWFkX3N5bXRhYl9wcml2YXRlID0KKwkgIChjaGFyICopIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5wc3ltYm9sX29ic3RhY2ssCisJCQkJICBzaXplb2YgKHN0cnVjdCBzeW1sb2MpKTsKKyAgICAgICgoc3RydWN0IHN5bWxvYyAqKXN1YnBzdC0+cmVhZF9zeW10YWJfcHJpdmF0ZSktPmZpcnN0X3N5bW51bSA9IDA7CisgICAgICAoKHN0cnVjdCBzeW1sb2MgKilzdWJwc3QtPnJlYWRfc3ltdGFiX3ByaXZhdGUpLT5udW1zeW1zID0gMDsKKyAgICAgIHN1YnBzdC0+dGV4dGxvdyA9IDA7CisgICAgICBzdWJwc3QtPnRleHRoaWdoID0gMDsKKworICAgICAgLyogV2UgY291bGQgc2F2ZSBzbGlnaHQgYml0cyBvZiBzcGFjZSBieSBvbmx5IG1ha2luZyBvbmUgb2YgdGhlc2UsCisJIHNoYXJlZCBieSB0aGUgZW50aXJlIHNldCBvZiBpbmNsdWRlIGZpbGVzLiAgRklYTUUtc29tZWRheS4gICovCisgICAgICBzdWJwc3QtPmRlcGVuZGVuY2llcyA9IChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKiopCisJb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnBzeW1ib2xfb2JzdGFjaywKKwkJICAgICAgIHNpemVvZiAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKKyAgICAgIHN1YnBzdC0+ZGVwZW5kZW5jaWVzWzBdID0gcHN0OworICAgICAgc3VicHN0LT5udW1iZXJfb2ZfZGVwZW5kZW5jaWVzID0gMTsKKworICAgICAgc3VicHN0LT5nbG9iYWxzX29mZnNldCA9CisJc3VicHN0LT5uX2dsb2JhbF9zeW1zID0KKwkgIHN1YnBzdC0+c3RhdGljc19vZmZzZXQgPQorCSAgICBzdWJwc3QtPm5fc3RhdGljX3N5bXMgPSAwOworCisgICAgICBzdWJwc3QtPnJlYWRpbiA9IDA7CisgICAgICBzdWJwc3QtPnN5bXRhYiA9IDA7CisgICAgICBzdWJwc3QtPnJlYWRfc3ltdGFiID0gcHN0LT5yZWFkX3N5bXRhYjsKKyAgICB9CisKKyAgc29ydF9wc3Rfc3ltYm9scyAocHN0KTsKKworICAvKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgcHN5bXRhYiBvciBzeW10YWIgZm9yIGEgZmlsZSBvZiB0aGlzIG5hbWUsCisgICAgIHJlbW92ZSBpdC4gIChJZiB0aGVyZSBpcyBhIHN5bXRhYiwgbW9yZSBkcmFzdGljIHRoaW5ncyBhbHNvCisgICAgIGhhcHBlbi4pICBUaGlzIGhhcHBlbnMgaW4gVnhXb3Jrcy4gICovCisgIGZyZWVfbmFtZWRfc3ltdGFicyAocHN0LT5maWxlbmFtZSk7CisKKyAgaWYgKG51bV9pbmNsdWRlcyA9PSAwCisgICAgICAmJiBudW1iZXJfZGVwZW5kZW5jaWVzID09IDAKKyAgICAgICYmIHBzdC0+bl9nbG9iYWxfc3ltcyA9PSAwCisgICAgICAmJiBwc3QtPm5fc3RhdGljX3N5bXMgPT0gMCkKKyAgICB7CisgICAgICAvKiBUaHJvdyBhd2F5IHRoaXMgcHN5bXRhYiwgaXQncyBlbXB0eS4gIFdlIGNhbid0IGRlYWxsb2NhdGUgaXQsIHNpbmNlCisJIGl0IGlzIG9uIHRoZSBvYnN0YWNrLCBidXQgd2UgY2FuIGZvcmdldCB0byBjaGFpbiBpdCBvbiB0aGUgbGlzdC4gICovCisgICAgICAvKiBFbXB0eSBwc3ltdGFicyBoYXBwZW4gYXMgYSByZXN1bHQgb2YgaGVhZGVyIGZpbGVzIHdoaWNoIGRvbid0IGhhdmUKKwkgYW55IHN5bWJvbHMgaW4gdGhlbS4gIFRoZXJlIGNhbiBiZSBhIGxvdCBvZiB0aGVtLiAgKi8KKworICAgICAgZGlzY2FyZF9wc3ltdGFiIChwc3QpOworCisgICAgICAvKiBJbmRpY2F0ZSB0aGF0IHBzeW10YWIgd2FzIHRocm93biBhd2F5LiAgKi8KKyAgICAgIHBzdCA9IChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKilOVUxMOworICAgIH0KKyAgcmV0dXJuIHBzdDsKK30KKworc3RhdGljIHZvaWQgc3dhcF9zeW0gUEFSQU1TICgoc3RydWN0IGludGVybmFsX3N5bWVudCAqLAorCQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICosIGNoYXIgKiosIGNoYXIgKiosCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKiwKKwkJCSAgICAgIHN0cnVjdCBvYmpmaWxlICopKTsKKworLyogU3dhcCByYXcgc3ltYm9sIGF0ICpSQVcgYW5kIHB1dCB0aGUgbmFtZSBpbiAqTkFNRSwgdGhlIHN5bWJvbCBpbgorICAgKlNZTUJPTCwgdGhlIGZpcnN0IGF1eGVudCBpbiAqQVVYLiAgQWR2YW5jZSAqUkFXIGFuZCAqU1lNTlVNUCBvdmVyCisgICB0aGUgc3ltYm9sIGFuZCBpdHMgYXV4ZW50cy4gICovCisKK3N0YXRpYyB2b2lkCitzd2FwX3N5bSAoc3ltYm9sLCBhdXgsIG5hbWUsIHJhdywgc3ltbnVtcCwgb2JqZmlsZSkKKyAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltYm9sOworICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eDsKKyAgICAgY2hhciAqKm5hbWU7CisgICAgIGNoYXIgKipyYXc7CisgICAgIHVuc2lnbmVkIGludCAqc3ltbnVtcDsKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChvYmpmaWxlLT5vYmZkLCAqcmF3LCBzeW1ib2wpOworICBpZiAoc3ltYm9sLT5uX3plcm9lcykKKyAgICB7CisgICAgICAvKiBJZiBpdCdzIGV4YWN0bHkgRV9TWU1OTUxFTiBjaGFyYWN0ZXJzIGxvbmcgaXQgaXNuJ3QKKwkgJ1wwJy10ZXJtaW5hdGVkLiAgKi8KKyAgICAgIGlmIChzeW1ib2wtPm5fbmFtZVtFX1NZTU5NTEVOIC0gMV0gIT0gJ1wwJykKKwl7CisJICAvKiBGSVhNRTogd2FzdGVzIG1lbW9yeSBmb3Igc3ltYm9scyB3aGljaCB3ZSBkb24ndCBlbmQgdXAgcHV0dGluZworCSAgICAgaW50byB0aGUgbWluaW1hbCBzeW1ib2xzLiAgKi8KKwkgIGNoYXIgKnA7CisJICBwID0gb2JzdGFja19hbGxvYyAoJm9iamZpbGUtPnBzeW1ib2xfb2JzdGFjaywgRV9TWU1OTUxFTiArIDEpOworCSAgc3RybmNweSAocCwgc3ltYm9sLT5uX25hbWUsIEVfU1lNTk1MRU4pOworCSAgcFtFX1NZTU5NTEVOXSA9ICdcMCc7CisJICAqbmFtZSA9IHA7CisJfQorICAgICAgZWxzZQorCS8qIFBvaW50IHRvIHRoZSB1bnN3YXBwZWQgbmFtZSBhcyB0aGF0IHBlcnNpc3RzIGFzIGxvbmcgYXMgdGhlCisJICAgb2JqZmlsZSBkb2VzLiAgKi8KKwkqbmFtZSA9ICgoc3RydWN0IGV4dGVybmFsX3N5bWVudCAqKSpyYXcpLT5lLmVfbmFtZTsKKyAgICB9CisgIGVsc2UgaWYgKHN5bWJvbC0+bl9zY2xhc3MgJiAweDgwKQorICAgIHsKKyAgICAgICpuYW1lID0gKChzdHJ1Y3QgY29mZl9zeW1maWxlX2luZm8gKilvYmpmaWxlLT5zeW1fcHJpdmF0ZSktPmRlYnVnc2VjCisJKyBzeW1ib2wtPm5fb2Zmc2V0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICpuYW1lID0gKChzdHJ1Y3QgY29mZl9zeW1maWxlX2luZm8gKilvYmpmaWxlLT5zeW1fcHJpdmF0ZSktPnN0cnRibAorCSsgc3ltYm9sLT5uX29mZnNldDsKKyAgICB9CisgICsrKnN5bW51bXA7CisgICpyYXcgKz0gY29mZl9kYXRhIChvYmpmaWxlLT5vYmZkKS0+bG9jYWxfc3ltZXN6OworICBpZiAoc3ltYm9sLT5uX251bWF1eCA+IDApCisgICAgeworICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKG9iamZpbGUtPm9iZmQsICpyYXcsIHN5bWJvbC0+bl90eXBlLAorCQkJICAgIHN5bWJvbC0+bl9zY2xhc3MsIDAsIHN5bWJvbC0+bl9udW1hdXgsIGF1eCk7CisKKyAgICAgICpzeW1udW1wICs9IHN5bWJvbC0+bl9udW1hdXg7CisgICAgICAqcmF3ICs9IGNvZmZfZGF0YSAob2JqZmlsZS0+b2JmZCktPmxvY2FsX3N5bWVzeiAqIHN5bWJvbC0+bl9udW1hdXg7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorc2Nhbl94Y29mZl9zeW10YWIgKHNlY3Rpb25fb2Zmc2V0cywgb2JqZmlsZSkKKyAgICAgc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqc2VjdGlvbl9vZmZzZXRzOworICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKK3sKKyAgQ09SRV9BRERSIHRvY19vZmZzZXQgPSAwOwkJLyogdG9jIG9mZnNldCB2YWx1ZSBpbiBkYXRhIHNlY3Rpb24uICovCisgIGNoYXIgKmZpbGVzdHJpbmcgPSBOVUxMOworCisgIGNoYXIgKm5hbWVzdHJpbmc7CisgIGludCBwYXN0X2ZpcnN0X3NvdXJjZV9maWxlID0gMDsKKyAgYmZkICphYmZkOworICBhc2VjdGlvbiAqYmZkX3NlY3Q7CisgIHVuc2lnbmVkIGludCBuc3ltczsKKworICAvKiBDdXJyZW50IHBhcnRpYWwgc3ltdGFiICovCisgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqcHN0OworCisgIC8qIExpc3Qgb2YgY3VycmVudCBwc3ltdGFiJ3MgaW5jbHVkZSBmaWxlcyAqLworICBjaGFyICoqcHN5bXRhYl9pbmNsdWRlX2xpc3Q7CisgIGludCBpbmNsdWRlc19hbGxvY2F0ZWQ7CisgIGludCBpbmNsdWRlc191c2VkOworCisgIC8qIEluZGV4IHdpdGhpbiBjdXJyZW50IHBzeW10YWIgZGVwZW5kZW5jeSBsaXN0ICovCisgIHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKmRlcGVuZGVuY3lfbGlzdDsKKyAgaW50IGRlcGVuZGVuY2llc191c2VkLCBkZXBlbmRlbmNpZXNfYWxsb2NhdGVkOworCisgIGNoYXIgKnNyYXdfc3ltYm9sOworICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWJvbDsKKyAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IG1haW5fYXV4OworICB1bnNpZ25lZCBpbnQgc3N5bW51bTsKKworICBjaGFyICpsYXN0X2NzZWN0X25hbWUgPSBOVUxMOwkJLyogbGFzdCBzZWVuIGNzZWN0J3MgbmFtZSBhbmQgdmFsdWUgKi8KKyAgQ09SRV9BRERSIGxhc3RfY3NlY3RfdmFsID0gMDsKKyAgaW50IGxhc3RfY3NlY3Rfc2VjID0gMDsKKyAgaW50ICBtaXNjX2Z1bmNfcmVjb3JkZWQgPSAwOwkJLyogdHJ1ZSBpZiBhbnkgbWlzYy4gZnVuY3Rpb24gKi8KKyAgaW50IHRleHRsb3dfbm90X3NldCA9IDE7CisKKyAgcHN0ID0gKHN0cnVjdCBwYXJ0aWFsX3N5bXRhYiAqKSAwOworCisgIGluY2x1ZGVzX2FsbG9jYXRlZCA9IDMwOworICBpbmNsdWRlc191c2VkID0gMDsKKyAgcHN5bXRhYl9pbmNsdWRlX2xpc3QgPSAoY2hhciAqKikgYWxsb2NhIChpbmNsdWRlc19hbGxvY2F0ZWQgKgorCQkJCQkgICBzaXplb2YgKGNoYXIgKikpOworCisgIGRlcGVuZGVuY2llc19hbGxvY2F0ZWQgPSAzMDsKKyAgZGVwZW5kZW5jaWVzX3VzZWQgPSAwOworICBkZXBlbmRlbmN5X2xpc3QgPQorICAgIChzdHJ1Y3QgcGFydGlhbF9zeW10YWIgKiopIGFsbG9jYSAoZGVwZW5kZW5jaWVzX2FsbG9jYXRlZCAqCisJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IHBhcnRpYWxfc3ltdGFiICopKTsKKworICBsYXN0X3NvdXJjZV9maWxlID0gTlVMTDsKKworICBhYmZkID0gb2JqZmlsZS0+b2JmZDsKKworICBzcmF3X3N5bWJvbCA9ICgoc3RydWN0IGNvZmZfc3ltZmlsZV9pbmZvICopb2JqZmlsZS0+c3ltX3ByaXZhdGUpLT5zeW10Ymw7CisgIG5zeW1zID0gKChzdHJ1Y3QgY29mZl9zeW1maWxlX2luZm8gKilvYmpmaWxlLT5zeW1fcHJpdmF0ZSktPnN5bXRibF9udW1fc3ltczsKKyAgc3N5bW51bSA9IDA7CisgIHdoaWxlIChzc3ltbnVtIDwgbnN5bXMpCisgICAgeworICAgICAgaW50IHNjbGFzcyA9ICgoc3RydWN0IGV4dGVybmFsX3N5bWVudCAqKXNyYXdfc3ltYm9sKS0+ZV9zY2xhc3NbMF0gJiAweGZmOworICAgICAgLyogVGhpcyBpcyB0aGUgdHlwZSB3ZSBwYXNzIHRvIHBhcnRpYWwtc3RhYi5oLiAgQSBsZXNzIGtsdWRneSBzb2x1dGlvbgorCSB3b3VsZCBiZSB0byBicmVhayBvdXQgcGFydGlhbC1zdGFiLmggaW50byBpdHMgdmFyaW91cyBwYXJ0cy0tc2h1ZmZsZQorCSBvZmYgdGhlIERCWFJFQURfT05MWSBzdHVmZiB0byBkYnhyZWFkLmMsIGFuZCBtYWtlIHNlcGFyYXRlCisJIHBzdGFiLW5vcm0uaCAoZm9yIG1vc3QgdHlwZXMpLCBwc3RhYi1zb2wuaCAoZm9yIE5fU09MKSwgZXRjLiAgKi8KKyAgICAgIGludCBzdHlwZTsKKworICAgICAgUVVJVDsKKworICAgICAgc3dpdGNoIChzY2xhc3MpCisJeworCWNhc2UgQ19FWFQ6CisJY2FzZSBDX0hJREVYVDoKKwkgIHsKKwkgICAgLyogVGhlIENTRUNUIGF1eGVudC0tYWx3YXlzIHRoZSBsYXN0IGF1eGVudC4gICovCisJICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBjc2VjdF9hdXg7CisJICAgIHVuc2lnbmVkIGludCBzeW1udW1fYmVmb3JlID0gc3N5bW51bTsKKworCSAgICBzd2FwX3N5bSAoJnN5bWJvbCwgJm1haW5fYXV4LCAmbmFtZXN0cmluZywgJnNyYXdfc3ltYm9sLAorCQkgICAgICAmc3N5bW51bSwgb2JqZmlsZSk7CisJICAgIGlmIChzeW1ib2wubl9udW1hdXggPiAxKQorCSAgICAgIHsKKwkJYmZkX2NvZmZfc3dhcF9hdXhfaW4KKwkJICAob2JqZmlsZS0+b2JmZCwKKwkJICAgc3Jhd19zeW1ib2wgLSBjb2ZmX2RhdGEoYWJmZCktPmxvY2FsX3N5bWVzeiwKKwkJICAgc3ltYm9sLm5fdHlwZSwKKwkJICAgc3ltYm9sLm5fc2NsYXNzLAorCQkgICBzeW1ib2wubl9udW1hdXggLSAxLAorCQkgICBzeW1ib2wubl9udW1hdXgsCisJCSAgICZjc2VjdF9hdXgpOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIGNzZWN0X2F1eCA9IG1haW5fYXV4OworCisJICAgIC8qIElmIHN5bWJvbCBuYW1lIHN0YXJ0cyB3aXRoICIuJCIgb3IgIiQiLCBpZ25vcmUgaXQuICAqLworCSAgICBpZiAobmFtZXN0cmluZ1swXSA9PSAnJCcKKwkJfHwgKG5hbWVzdHJpbmdbMF0gPT0gJy4nICYmIG5hbWVzdHJpbmdbMV0gPT0gJyQnKSkKKwkgICAgICBicmVhazsKKworCSAgICBzd2l0Y2ggKGNzZWN0X2F1eC54X2NzZWN0Lnhfc210eXAgJiAweDcpCisJICAgICAgeworCSAgICAgIGNhc2UgWFRZX1NEOgorCQlzd2l0Y2ggKGNzZWN0X2F1eC54X2NzZWN0Lnhfc21jbGFzKQorCQkgIHsKKwkJICBjYXNlIFhNQ19QUjoKKwkJICAgIGlmIChsYXN0X2NzZWN0X25hbWUpCisJCSAgICAgIHsKKwkJCS8qIElmIG5vIG1pc2MuIGZ1bmN0aW9uIHJlY29yZGVkIGluIHRoZSBsYXN0CisJCQkgICBzZWVuIGNzZWN0LCBlbnRlciBpdCBhcyBhIGZ1bmN0aW9uLiBUaGlzCisJCQkgICB3aWxsIHRha2UgY2FyZSBvZiBmdW5jdGlvbnMgbGlrZSBzdHJjbXAoKQorCQkJICAgY29tcGlsZWQgYnkgeGxjLiAgKi8KKworCQkJaWYgKCFtaXNjX2Z1bmNfcmVjb3JkZWQpCisJCQkgIHsKKwkJCSAgICBSRUNPUkRfTUlOSU1BTF9TWU1CT0wKKwkJCSAgICAgIChsYXN0X2NzZWN0X25hbWUsIGxhc3RfY3NlY3RfdmFsLAorCQkJICAgICAgIG1zdF90ZXh0LCBsYXN0X2NzZWN0X3NlYywKKwkJCSAgICAgICBvYmpmaWxlKTsKKwkJCSAgfQorCisJCQlpZiAocHN0ICE9IE5VTEwpCisJCQkgIHsKKwkJCSAgICAvKiBXZSBoYXZlIHRvIGFsbG9jYXRlIG9uZSBwc3ltdGFiIGZvcgorCQkJICAgICAgIGVhY2ggcHJvZ3JhbSBjc2VjdCwgYmVjYXVzZSB0aGVpciB0ZXh0CisJCQkgICAgICAgc2VjdGlvbnMgbmVlZCBub3QgYmUgYWRqYWNlbnQuICAqLworCQkJICAgIHhjb2ZmX2VuZF9wc3ltdGFiCisJCQkgICAgICAocHN0LCBwc3ltdGFiX2luY2x1ZGVfbGlzdCwgaW5jbHVkZXNfdXNlZCwKKwkJCSAgICAgICBzeW1udW1fYmVmb3JlLCBkZXBlbmRlbmN5X2xpc3QsCisJCQkgICAgICAgZGVwZW5kZW5jaWVzX3VzZWQsIHRleHRsb3dfbm90X3NldCk7CisJCQkgICAgaW5jbHVkZXNfdXNlZCA9IDA7CisJCQkgICAgZGVwZW5kZW5jaWVzX3VzZWQgPSAwOworCQkJICAgIC8qIEdpdmUgYWxsIHBzeW10YWJzIGZvciB0aGlzIHNvdXJjZSBmaWxlIHRoZSBzYW1lCisJCQkgICAgICAgbmFtZS4gICovCisJCQkgICAgcHN0ID0geGNvZmZfc3RhcnRfcHN5bXRhYgorCQkJICAgICAgKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywKKwkJCSAgICAgICBmaWxlc3RyaW5nLAorCQkJICAgICAgIHN5bW51bV9iZWZvcmUsCisJCQkgICAgICAgb2JqZmlsZS0+Z2xvYmFsX3BzeW1ib2xzLm5leHQsCisJCQkgICAgICAgb2JqZmlsZS0+c3RhdGljX3BzeW1ib2xzLm5leHQpOworCQkJICB9CisJCSAgICAgIH0KKwkJICAgIGlmIChuYW1lc3RyaW5nICYmIG5hbWVzdHJpbmdbMF0gPT0gJy4nKQorCQkgICAgICB7CisJCQlsYXN0X2NzZWN0X25hbWUgPSBuYW1lc3RyaW5nOworCQkJbGFzdF9jc2VjdF92YWwgPSBzeW1ib2wubl92YWx1ZTsKKwkJCWxhc3RfY3NlY3Rfc2VjID0KKwkJCSAgc2VjbnVtX3RvX3NlY3Rpb24gKHN5bWJvbC5uX3NjbnVtLCBvYmpmaWxlKTsKKwkJICAgICAgfQorCQkgICAgaWYgKHBzdCAhPSBOVUxMKQorCQkgICAgICB7CisJCQlDT1JFX0FERFIgaGlnaHZhbCA9CisJCQkgIHN5bWJvbC5uX3ZhbHVlICsgY3NlY3RfYXV4LnhfY3NlY3QueF9zY25sZW4ubDsKKwkJCWlmIChoaWdodmFsID4gcHN0LT50ZXh0aGlnaCkKKwkJCSAgcHN0LT50ZXh0aGlnaCA9IGhpZ2h2YWw7CisJCQlpZiAocHN0LT50ZXh0bG93ID09IDAgfHwgc3ltYm9sLm5fdmFsdWUgPCBwc3QtPnRleHRsb3cpCisJCQkgIHBzdC0+dGV4dGxvdyA9IHN5bWJvbC5uX3ZhbHVlOworCQkgICAgICB9CisJCSAgICBtaXNjX2Z1bmNfcmVjb3JkZWQgPSAwOworCQkgICAgYnJlYWs7CisKKwkJICBjYXNlIFhNQ19SVzoKKwkJICAgIC8qIERhdGEgdmFyaWFibGVzIGFyZSByZWNvcmRlZCBpbiB0aGUgbWluaW1hbCBzeW1ib2wKKwkJICAgICAgIHRhYmxlLCBleGNlcHQgZm9yIHNlY3Rpb24gc3ltYm9scy4gICovCisJCSAgICBpZiAoKm5hbWVzdHJpbmcgIT0gJy4nKQorCQkgICAgICBwcmltX3JlY29yZF9taW5pbWFsX3N5bWJvbF9hbmRfaW5mbworCQkJKG5hbWVzdHJpbmcsIHN5bWJvbC5uX3ZhbHVlLAorCQkJIHNjbGFzcyA9PSBDX0hJREVYVCA/IG1zdF9maWxlX2RhdGEgOiBtc3RfZGF0YSwKKwkJCSBOVUxMLCBzZWNudW1fdG9fc2VjdGlvbiAoc3ltYm9sLm5fc2NudW0sIG9iamZpbGUpLAorCQkJIE5VTEwsIG9iamZpbGUpOworCQkgICAgYnJlYWs7CisKKwkJICBjYXNlIFhNQ19UQzA6CisJCSAgICBpZiAodG9jX29mZnNldCkKKwkJICAgICAgd2FybmluZyAoIk1vcmUgdGhhbiBvbmUgWE1DX1RDMCBzeW1ib2wgZm91bmQuIik7CisJCSAgICB0b2Nfb2Zmc2V0ID0gc3ltYm9sLm5fdmFsdWU7CisKKwkJICAgIC8qIE1ha2UgVE9DIG9mZnNldCByZWxhdGl2ZSB0byBzdGFydCBhZGRyZXNzIG9mIHNlY3Rpb24uICAqLworCQkgICAgYmZkX3NlY3QgPSBzZWNudW1fdG9fYmZkX3NlY3Rpb24gKHN5bWJvbC5uX3NjbnVtLCBvYmpmaWxlKTsKKwkJICAgIGlmIChiZmRfc2VjdCkKKwkJICAgICAgdG9jX29mZnNldCAtPSBiZmRfc2VjdGlvbl92bWEgKG9iamZpbGUtPm9iZmQsIGJmZF9zZWN0KTsKKwkJICAgIGJyZWFrOworCisJCSAgY2FzZSBYTUNfVEM6CisJCSAgICAvKiBUaGVzZSBzeW1ib2xzIHRlbGwgdXMgd2hlcmUgdGhlIFRPQyBlbnRyeSBmb3IgYQorCQkgICAgICAgdmFyaWFibGUgaXMsIG5vdCB0aGUgdmFyaWFibGUgaXRzZWxmLiAgKi8KKwkJICAgIGJyZWFrOworCisJCSAgZGVmYXVsdDoKKwkJICAgIGJyZWFrOworCQkgIH0KKwkJYnJlYWs7CisKKwkgICAgICBjYXNlIFhUWV9MRDoKKwkJc3dpdGNoIChjc2VjdF9hdXgueF9jc2VjdC54X3NtY2xhcykKKwkJICB7CisJCSAgY2FzZSBYTUNfUFI6CisJCSAgICAvKiBBIGZ1bmN0aW9uIGVudHJ5IHBvaW50LiAgKi8KKworCQkgICAgaWYgKGZpcnN0X2Z1bl9saW5lX29mZnNldCA9PSAwICYmIHN5bWJvbC5uX251bWF1eCA+IDEpCisJCSAgICAgIGZpcnN0X2Z1bl9saW5lX29mZnNldCA9CisJCQltYWluX2F1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHI7CisJCSAgICBSRUNPUkRfTUlOSU1BTF9TWU1CT0wKKwkJICAgICAgKG5hbWVzdHJpbmcsIHN5bWJvbC5uX3ZhbHVlLAorCQkgICAgICAgc2NsYXNzID09IENfSElERVhUID8gbXN0X2ZpbGVfdGV4dCA6IG1zdF90ZXh0LAorCQkgICAgICAgc2VjbnVtX3RvX3NlY3Rpb24gKHN5bWJvbC5uX3NjbnVtLCBvYmpmaWxlKSwKKwkJICAgICAgIG9iamZpbGUpOworCQkgICAgYnJlYWs7CisKKwkJICBjYXNlIFhNQ19HTDoKKwkJICAgIC8qIHNoYXJlZCBsaWJyYXJ5IGZ1bmN0aW9uIHRyYW1wb2xpbmUgY29kZSBlbnRyeQorCQkgICAgICAgcG9pbnQuICovCisKKwkJICAgIC8qIHJlY29yZCB0cmFtcG9saW5lIGNvZGUgZW50cmllcyBhcworCQkgICAgICAgbXN0X3NvbGliX3RyYW1wb2xpbmUgc3ltYm9sLiAgV2hlbiB3ZSBsb29rdXAgbXN0CisJCSAgICAgICBzeW1ib2xzLCB3ZSB3aWxsIGNob29zZSBtc3RfdGV4dCBvdmVyCisJCSAgICAgICBtc3Rfc29saWJfdHJhbXBvbGluZS4gKi8KKwkJICAgIFJFQ09SRF9NSU5JTUFMX1NZTUJPTAorCQkgICAgICAobmFtZXN0cmluZywgc3ltYm9sLm5fdmFsdWUsCisJCSAgICAgICBtc3Rfc29saWJfdHJhbXBvbGluZSwKKwkJICAgICAgIHNlY251bV90b19zZWN0aW9uIChzeW1ib2wubl9zY251bSwgb2JqZmlsZSksCisJCSAgICAgICBvYmpmaWxlKTsKKwkJICAgIGJyZWFrOworCisJCSAgY2FzZSBYTUNfRFM6CisJCSAgICAvKiBUaGUgc3ltYm9scyBvZnRlbiBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzCisJCSAgICAgICBkZWJ1ZyBzeW1ib2xzIGZvciBmdW5jdGlvbnMsIGFuZCBjb25mdXNlCisJCSAgICAgICBsb29rdXBfc3ltYm9sLiAgKi8KKwkJICAgIGJyZWFrOworCisJCSAgZGVmYXVsdDoKKworCQkgICAgLyogeGxjIHB1dHMgZWFjaCB2YXJpYWJsZSBpbiBhIHNlcGFyYXRlIGNzZWN0LAorCQkgICAgICAgc28gd2UgZ2V0IGFuIFhUWV9TRCBmb3IgZWFjaCB2YXJpYWJsZS4gIEJ1dAorCQkgICAgICAgZ2NjIHB1dHMgc2V2ZXJhbCB2YXJpYWJsZXMgaW4gYSBjc2VjdCwgc28KKwkJICAgICAgIHRoYXQgZWFjaCB2YXJpYWJsZSBvbmx5IGdldHMgYW4gWFRZX0xELiAgV2UKKwkJICAgICAgIHN0aWxsIG5lZWQgdG8gcmVjb3JkIHRoZW0uICBUaGlzIHdpbGwKKwkJICAgICAgIHR5cGljYWxseSBiZSBYTUNfUlc7IEkgc3VzcGVjdCBYTUNfUk8gYW5kCisJCSAgICAgICBYTUNfQlMgbWlnaHQgYmUgcG9zc2libGUgdG9vLiAgKi8KKwkJICAgIGlmICgqbmFtZXN0cmluZyAhPSAnLicpCisJCSAgICAgIHByaW1fcmVjb3JkX21pbmltYWxfc3ltYm9sX2FuZF9pbmZvCisJCQkobmFtZXN0cmluZywgc3ltYm9sLm5fdmFsdWUsCisJCQkgc2NsYXNzID09IENfSElERVhUID8gbXN0X2ZpbGVfZGF0YSA6IG1zdF9kYXRhLAorCQkJIE5VTEwsIHNlY251bV90b19zZWN0aW9uIChzeW1ib2wubl9zY251bSwgb2JqZmlsZSksCisJCQkgTlVMTCwgb2JqZmlsZSk7CisJCSAgICBicmVhazsKKwkJICB9CisJCWJyZWFrOworCisJICAgICAgY2FzZSBYVFlfQ006CisJCXN3aXRjaCAoY3NlY3RfYXV4LnhfY3NlY3QueF9zbWNsYXMpCisJCSAgeworCQkgIGNhc2UgWE1DX1JXOgorCQkgIGNhc2UgWE1DX0JTOgorCQkgICAgLyogQ29tbW9uIHZhcmlhYmxlcyBhcmUgcmVjb3JkZWQgaW4gdGhlIG1pbmltYWwgc3ltYm9sCisJCSAgICAgICB0YWJsZSwgZXhjZXB0IGZvciBzZWN0aW9uIHN5bWJvbHMuICAqLworCQkgICAgaWYgKCpuYW1lc3RyaW5nICE9ICcuJykKKwkJICAgICAgcHJpbV9yZWNvcmRfbWluaW1hbF9zeW1ib2xfYW5kX2luZm8KKwkJCShuYW1lc3RyaW5nLCBzeW1ib2wubl92YWx1ZSwKKwkJCSBzY2xhc3MgPT0gQ19ISURFWFQgPyBtc3RfZmlsZV9ic3MgOiBtc3RfYnNzLAorCQkJIE5VTEwsIHNlY251bV90b19zZWN0aW9uIChzeW1ib2wubl9zY251bSwgb2JqZmlsZSksCisJCQkgTlVMTCwgb2JqZmlsZSk7CisJCSAgICBicmVhazsKKwkJICB9CisJCWJyZWFrOworCisJICAgICAgZGVmYXVsdDoKKwkJYnJlYWs7CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisJY2FzZSBDX0ZJTEU6CisJICB7CisJICAgIHVuc2lnbmVkIGludCBzeW1udW1fYmVmb3JlOworCisJICAgIHN5bW51bV9iZWZvcmUgPSBzc3ltbnVtOworCSAgICBzd2FwX3N5bSAoJnN5bWJvbCwgJm1haW5fYXV4LCAmbmFtZXN0cmluZywgJnNyYXdfc3ltYm9sLAorCQkgICAgICAmc3N5bW51bSwgb2JqZmlsZSk7CisKKwkgICAgLyogU2VlIGlmIHRoZSBsYXN0IGNzZWN0IG5lZWRzIHRvIGJlIHJlY29yZGVkLiAgKi8KKworCSAgICBpZiAobGFzdF9jc2VjdF9uYW1lICYmICFtaXNjX2Z1bmNfcmVjb3JkZWQpCisJICAgICAgeworCisJCS8qIElmIG5vIG1pc2MuIGZ1bmN0aW9uIHJlY29yZGVkIGluIHRoZSBsYXN0IHNlZW4gY3NlY3QsIGVudGVyCisJCSAgIGl0IGFzIGEgZnVuY3Rpb24uICBUaGlzIHdpbGwgdGFrZSBjYXJlIG9mIGZ1bmN0aW9ucyBsaWtlCisJCSAgIHN0cmNtcCgpIGNvbXBpbGVkIGJ5IHhsYy4gICovCisKKwkJUkVDT1JEX01JTklNQUxfU1lNQk9MCisJCSAgKGxhc3RfY3NlY3RfbmFtZSwgbGFzdF9jc2VjdF92YWwsCisJCSAgIG1zdF90ZXh0LCBsYXN0X2NzZWN0X3NlYywgb2JqZmlsZSk7CisJICAgICAgfQorCisJICAgIGlmIChwc3QpCisJICAgICAgeworCQl4Y29mZl9lbmRfcHN5bXRhYiAocHN0LCBwc3ltdGFiX2luY2x1ZGVfbGlzdCwgaW5jbHVkZXNfdXNlZCwKKwkJCQkgICBzeW1udW1fYmVmb3JlLCBkZXBlbmRlbmN5X2xpc3QsCisJCQkJICAgZGVwZW5kZW5jaWVzX3VzZWQsIHRleHRsb3dfbm90X3NldCk7CisJCWluY2x1ZGVzX3VzZWQgPSAwOworCQlkZXBlbmRlbmNpZXNfdXNlZCA9IDA7CisJICAgICAgfQorCSAgICBmaXJzdF9mdW5fbGluZV9vZmZzZXQgPSAwOworCisJICAgIC8qIFhDT0ZGLCBhY2NvcmRpbmcgdG8gdGhlIEFJWCAzLjIgZG9jdW1lbnRhdGlvbiwgcHV0cyB0aGUKKwkgICAgICAgZmlsZW5hbWUgaW4gY3MtPmNfbmFtZS4gIEJ1dCB4bGMgMS4zLjAuMiBoYXMgZGVjaWRlZCB0bworCSAgICAgICBkbyB0aGluZ3MgdGhlIHN0YW5kYXJkIENPRkYgd2F5IGFuZCBwdXQgaXQgaW4gdGhlIGF1eGVudC4KKwkgICAgICAgV2UgdXNlIHRoZSBhdXhlbnQgaWYgdGhlIHN5bWJvbCBpcyAiLmZpbGUiIGFuZCBhbiBhdXhlbnQKKwkgICAgICAgZXhpc3RzLCBvdGhlcndpc2UgdXNlIHRoZSBzeW1ib2wgaXRzZWxmLiAgKi8KKwkgICAgaWYgKCFzdHJjbXAgKG5hbWVzdHJpbmcsICIuZmlsZSIpICYmIHN5bWJvbC5uX251bWF1eCA+IDApCisJICAgICAgeworCQlmaWxlc3RyaW5nID0gY29mZl9nZXRmaWxlbmFtZSAoJm1haW5fYXV4LCBvYmpmaWxlKTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICBmaWxlc3RyaW5nID0gbmFtZXN0cmluZzsKKworCSAgICBwc3QgPSB4Y29mZl9zdGFydF9wc3ltdGFiIChvYmpmaWxlLCBzZWN0aW9uX29mZnNldHMsCisJCQkJICAgICAgIGZpbGVzdHJpbmcsCisJCQkJICAgICAgIHN5bW51bV9iZWZvcmUsCisJCQkJICAgICAgIG9iamZpbGUtPmdsb2JhbF9wc3ltYm9scy5uZXh0LAorCQkJCSAgICAgICBvYmpmaWxlLT5zdGF0aWNfcHN5bWJvbHMubmV4dCk7CisJICAgIGxhc3RfY3NlY3RfbmFtZSA9IE5VTEw7CisJICB9CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICB7CisJICAgIHN0YXRpYyBzdHJ1Y3QgY29tcGxhaW50IG1zZyA9CisJICAgICAgeyJTdG9yYWdlIGNsYXNzICVkIG5vdCByZWNvZ25pemVkIGR1cmluZyBzY2FuIiwgMCwgMH07CisJICAgIGNvbXBsYWluICgmbXNnLCBzY2xhc3MpOworCSAgfQorCSAgLyogRkFMTFRIUk9VR0ggKi8KKworCSAgLyogQ19GQ04gaXMgLmJmIGFuZCAuZWYgc3ltYm9scy4gIEkgdGhpbmsgaXQgaXMgc3VmZmljaWVudAorCSAgICAgdG8gaGFuZGxlIG9ubHkgdGhlIENfRlVOIGFuZCBDX0VYVC4gICovCisJY2FzZSBDX0ZDTjoKKworCWNhc2UgQ19CU1RBVDoKKwljYXNlIENfRVNUQVQ6CisJY2FzZSBDX0FSRzoKKwljYXNlIENfUkVHUEFSTToKKwljYXNlIENfUkVHOgorCWNhc2UgQ19UUERFRjoKKwljYXNlIENfU1RSVEFHOgorCWNhc2UgQ19VTlRBRzoKKwljYXNlIENfRU5UQUc6CisJY2FzZSBDX0xBQkVMOgorCWNhc2UgQ19OVUxMOgorCisJICAvKiBDX0VJTkNMIG1lYW5zIHdlIGFyZSBzd2l0Y2hpbmcgYmFjayB0byB0aGUgbWFpbiBmaWxlLiAgQnV0IHRoZXJlCisJICAgICBpcyBubyByZWFzb24gdG8gY2FyZTsgdGhlIG9ubHkgdGhpbmcgd2Ugd2FudCB0byBrbm93IGFib3V0CisJICAgICBpbmNsdWRlcyBpcyB0aGUgbmFtZXMgb2YgYWxsIHRoZSBpbmNsdWRlZCAoLmgpIGZpbGVzLiAgKi8KKwljYXNlIENfRUlOQ0w6CisKKwljYXNlIENfQkxPQ0s6CisKKwkgIC8qIEkgZG9uJ3QgdGhpbmsgQ19TVEFUIGlzIHVzZWQgaW4geGNvZmY7IENfSElERVhUIGFwcGVhcnMgdG8gYmUKKwkgICAgIHVzZWQgaW5zdGVhZC4gICovCisJY2FzZSBDX1NUQVQ6CisKKwkgIC8qIEkgZG9uJ3QgdGhpbmsgdGhlIG5hbWUgb2YgdGhlIGNvbW1vbiBibG9jayAoYXMgb3Bwb3NlZCB0byB0aGUKKwkgICAgIHZhcmlhYmxlcyB3aXRoaW4gaXQpIGlzIHNvbWV0aGluZyB3aGljaCBpcyB1c2VyIHZpc2libGUKKwkgICAgIGN1cnJlbnRseS4gICovCisJY2FzZSBDX0JDT01NOgorCWNhc2UgQ19FQ09NTToKKworCWNhc2UgQ19QU1lNOgorCWNhc2UgQ19SUFNZTToKKworCSAgLyogSSB0aGluayB3ZSBjYW4gaWdub3JlIENfTFNZTTsgdHlwZXMgb24geGNvZmYgc2VlbSB0byB1c2UgQ19ERUNMCisJICAgICBzbyBDX0xTWU0gd291bGQgYXBwZWFyIHRvIGJlIG9ubHkgZm9yIGxvY2Fscy4gICovCisJY2FzZSBDX0xTWU06CisKKwljYXNlIENfQVVUTzoKKwljYXNlIENfUlNZTToKKwkgIHsKKwkgICAgLyogV2UgcHJvYmFibHkgY291bGQgc2F2ZSBhIGZldyBpbnN0cnVjdGlvbnMgYnkgYXNzdW1pbmcgdGhhdAorCSAgICAgICBDX0xTWU0sIENfUFNZTSwgZXRjLiwgbmV2ZXIgaGF2ZSBhdXhlbnRzLiAgKi8KKwkgICAgaW50IG5hdXgxID0KKwkgICAgICAoKHN0cnVjdCBleHRlcm5hbF9zeW1lbnQgKilzcmF3X3N5bWJvbCktPmVfbnVtYXV4WzBdICsgMTsKKwkgICAgc3N5bW51bSArPSBuYXV4MTsKKwkgICAgc3Jhd19zeW1ib2wgKz0gc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50KSAqIG5hdXgxOworCSAgfQorCSAgYnJlYWs7CisKKwljYXNlIENfQklOQ0w6CisJICBzdHlwZSA9IE5fU09MOworCSAgZ290byBwc3RhYjsKKworCWNhc2UgQ19GVU46CisJICAvKiBUaGUgdmFsdWUgb2YgdGhlIENfRlVOIGlzIG5vdCB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gKGl0CisJICAgICBhcHBlYXJzIHRvIGJlIHRoZSBhZGRyZXNzIGJlZm9yZSBsaW5raW5nKSwgYnV0IGFzIGxvbmcgYXMgaXQKKwkgICAgIGlzIHNtYWxsZXIgdGhhbiB0aGUgYWN0dWFsIGFkZHJlc3MsIHRoZW4gZmluZF9wY19wYXJ0aWFsX2Z1bmN0aW9uCisJICAgICB3aWxsIHVzZSB0aGUgbWluaW1hbCBzeW1ib2xzIGluc3RlYWQuICBJIGhvcGUuICAqLworCisJY2FzZSBDX0dTWU06CisJY2FzZSBDX0VDT01MOgorCWNhc2UgQ19ERUNMOgorCWNhc2UgQ19TVFNZTToKKwkgIHN0eXBlID0gTl9MU1lNOworCXBzdGFiOjsKKwkgIHN3YXBfc3ltICgmc3ltYm9sLCAmbWFpbl9hdXgsICZuYW1lc3RyaW5nLCAmc3Jhd19zeW1ib2wsCisJCSAgICAmc3N5bW51bSwgb2JqZmlsZSk7CisjZGVmaW5lIENVUl9TWU1CT0xfVFlQRSBzdHlwZQorI2RlZmluZSBDVVJfU1lNQk9MX1ZBTFVFIHN5bWJvbC5uX3ZhbHVlCisKKy8qIFNUQVJUX1BTWU1UQUIgYW5kIEVORF9QU1lNVEFCIGFyZSBuZXZlciB1c2VkLCBiZWNhdXNlIHRoZXkgYXJlIG9ubHkKKyAgIGNhbGxlZCBmcm9tIERCWFJFQURfT05MWSBvciBOX1NPIGNvZGUuICBMaWtld2lzZSBmb3IgdGhlIHN5bW51bQorICAgdmFyaWFibGUuICAqLworI2RlZmluZSBTVEFSVF9QU1lNVEFCKG9maWxlLHNlY29mZixmbmFtZSxsb3csc3ltb2ZmLGdsb2JhbF9zeW1zLHN0YXRpY19zeW1zKSAwCisjZGVmaW5lIEVORF9QU1lNVEFCKHBzdCxpbGlzdCxuaW5jLGNfb2ZmLGNfdGV4dCxkZXBfbGlzdCxuX2RlcHMsdGV4dGxvd19ub3Rfc2V0KVwKKyAgZG8ge30gd2hpbGUgKDApCisvKiBXZSBoYXZlIGFscmVhZHkgc2V0IHRoZSBuYW1lc3RyaW5nLiAgKi8KKyNkZWZpbmUgU0VUX05BTUVTVFJJTkcoKSAvKiAqLworCisjaW5jbHVkZSAicGFydGlhbC1zdGFiLmgiCisJfQorICAgIH0KKworICBpZiAocHN0KQorICAgIHsKKyAgICAgIHhjb2ZmX2VuZF9wc3ltdGFiIChwc3QsIHBzeW10YWJfaW5jbHVkZV9saXN0LCBpbmNsdWRlc191c2VkLAorCQkJIHNzeW1udW0sIGRlcGVuZGVuY3lfbGlzdCwKKwkJCSBkZXBlbmRlbmNpZXNfdXNlZCwgdGV4dGxvd19ub3Rfc2V0KTsKKyAgICB9CisKKyAgLyogUmVjb3JkIHRoZSB0b2Mgb2Zmc2V0IHZhbHVlIG9mIHRoaXMgc3ltYm9sIHRhYmxlIGludG8gb2JqZmlsZSBzdHJ1Y3R1cmUuCisgICAgIElmIG5vIFhNQ19UQzAgaXMgZm91bmQsIHRvY19vZmZzZXQgc2hvdWxkIGJlIHplcm8uIEFub3RoZXIgcGxhY2UgdG8gb2J0YWluCisgICAgIHRoaXMgaW5mb3JtYXRpb24gd291bGQgYmUgZmlsZSBhdXhpbGlhcnkgaGVhZGVyLiAqLworCisgICgoc3RydWN0IGNvZmZfc3ltZmlsZV9pbmZvICopIG9iamZpbGUtPnN5bV9wcml2YXRlKS0+dG9jX29mZnNldCA9IHRvY19vZmZzZXQ7Cit9CisKKy8qIFJldHVybiB0aGUgdG9jIG9mZnNldCB2YWx1ZSBmb3IgYSBnaXZlbiBvYmpmaWxlLiAgKi8KKworQ09SRV9BRERSCitnZXRfdG9jX29mZnNldCAob2JqZmlsZSkKKyAgICAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Cit7CisgIGlmIChvYmpmaWxlKQorICAgIHJldHVybiAoKHN0cnVjdCBjb2ZmX3N5bWZpbGVfaW5mbyAqKSBvYmpmaWxlLT5zeW1fcHJpdmF0ZSktPnRvY19vZmZzZXQ7CisgIHJldHVybiAwOworfQorCisvKiBTY2FuIGFuZCBidWlsZCBwYXJ0aWFsIHN5bWJvbHMgZm9yIGEgc3ltYm9sIGZpbGUuCisgICBXZSBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYnkgYSBjYWxsIHRvIGRieF9zeW1maWxlX2luaXQsIHdoaWNoIAorICAgcHV0IGFsbCB0aGUgcmVsZXZhbnQgaW5mbyBpbnRvIGEgInN0cnVjdCBkYnhfc3ltZmlsZV9pbmZvIiwKKyAgIGh1bmcgb2ZmIHRoZSBvYmpmaWxlIHN0cnVjdHVyZS4KKworICAgU0VDVElPTl9PRkZTRVRTIGNvbnRhaW5zIG9mZnNldHMgcmVsYXRpdmUgdG8gd2hpY2ggdGhlIHN5bWJvbHMgaW4gdGhlCisgICB2YXJpb3VzIHNlY3Rpb25zIGFyZSAoZGVwZW5kaW5nIHdoZXJlIHRoZSBzZWN0aW9ucyB3ZXJlIGFjdHVhbGx5IGxvYWRlZCkuCisgICBNQUlOTElORSBpcyB0cnVlIGlmIHdlIGFyZSByZWFkaW5nIHRoZSBtYWluIHN5bWJvbAorICAgdGFibGUgKGFzIG9wcG9zZWQgdG8gYSBzaGFyZWQgbGliIG9yIGR5bmFtaWNhbGx5IGxvYWRlZCBmaWxlKS4gICovCisKK3N0YXRpYyB2b2lkCit4Y29mZl9pbml0aWFsX3NjYW4gKG9iamZpbGUsIHNlY3Rpb25fb2Zmc2V0cywgbWFpbmxpbmUpCisgICAgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAgICBzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzICpzZWN0aW9uX29mZnNldHM7CisgICAgIGludCBtYWlubGluZTsJLyogRklYTUUgY29tbWVudHMgYWJvdmUgKi8KK3sKKyAgYmZkICphYmZkOworICBpbnQgdmFsOworICBzdHJ1Y3QgY2xlYW51cCAqYmFja190bzsKKyAgaW50IG51bV9zeW1ib2xzOwkJCS8qICMgb2Ygc3ltYm9scyAqLworICBmaWxlX3B0ciBzeW10YWJfb2Zmc2V0OwkJLyogc3ltYm9sIHRhYmxlIGFuZCAqLworICBmaWxlX3B0ciBzdHJpbmd0YWJfb2Zmc2V0OwkJLyogc3RyaW5nIHRhYmxlIGZpbGUgb2Zmc2V0cyAqLworICBzdHJ1Y3QgY29mZl9zeW1maWxlX2luZm8gKmluZm87CisgIGNoYXIgKm5hbWU7CisgIHVuc2lnbmVkIGludCBzaXplOworCisgIGluZm8gPSAoc3RydWN0IGNvZmZfc3ltZmlsZV9pbmZvICopIG9iamZpbGUgLT4gc3ltX3ByaXZhdGU7CisgIHN5bWZpbGVfYmZkID0gYWJmZCA9IG9iamZpbGUtPm9iZmQ7CisgIG5hbWUgPSBvYmpmaWxlLT5uYW1lOworCisgIG51bV9zeW1ib2xzID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7CS8qICMgb2Ygc3ltYm9scyAqLworICBzeW10YWJfb2Zmc2V0ID0gb2JqX3N5bV9maWxlcG9zIChhYmZkKTsJLyogc3ltYm9sIHRhYmxlIGZpbGUgb2Zmc2V0ICovCisgIHN0cmluZ3RhYl9vZmZzZXQgPSBzeW10YWJfb2Zmc2V0ICsKKyAgICBudW1fc3ltYm9scyAqIGNvZmZfZGF0YShhYmZkKS0+bG9jYWxfc3ltZXN6OworCisgIGluZm8tPm1pbl9saW5lbm9fb2Zmc2V0ID0gMDsKKyAgaW5mby0+bWF4X2xpbmVub19vZmZzZXQgPSAwOworICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIGZpbmRfbGluZW5vcywgaW5mbyk7CisKKyAgaWYgKG51bV9zeW1ib2xzID4gMCkKKyAgICB7CisgICAgICAvKiBSZWFkIHRoZSBzdHJpbmcgdGFibGUuICAqLworICAgICAgaW5pdF9zdHJpbmd0YWIgKGFiZmQsIHN0cmluZ3RhYl9vZmZzZXQsIG9iamZpbGUpOworCisgICAgICAvKiBSZWFkIHRoZSAuZGVidWcgc2VjdGlvbiwgaWYgcHJlc2VudC4gICovCisgICAgICB7CisJc2VjX3B0ciBzZWNwOworCWJmZF9zaXplX3R5cGUgbGVuZ3RoOworCWNoYXIgKmRlYnVnc2VjID0gTlVMTDsKKworCXNlY3AgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kZWJ1ZyIpOworCWlmIChzZWNwKQorCSAgeworCSAgICBsZW5ndGggPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWNwKTsKKwkgICAgaWYgKGxlbmd0aCkKKwkgICAgICB7CisJCWRlYnVnc2VjID0KKwkJICAoY2hhciAqKSBvYnN0YWNrX2FsbG9jICgmb2JqZmlsZS0+c3ltYm9sX29ic3RhY2ssIGxlbmd0aCk7CisKKwkJaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3AsIGRlYnVnc2VjLAorCQkJCQkgICAgICAgKGZpbGVfcHRyKSAwLCBsZW5ndGgpKQorCQkgIHsKKwkJICAgIGVycm9yICgiRXJyb3IgcmVhZGluZyAuZGVidWcgc2VjdGlvbiBvZiBgJXMnOiAlcyIsCisJCQkgICBuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKwkoKHN0cnVjdCBjb2ZmX3N5bWZpbGVfaW5mbyAqKW9iamZpbGUtPnN5bV9wcml2YXRlKS0+ZGVidWdzZWMgPQorCSAgZGVidWdzZWM7CisgICAgICB9CisgICAgfQorCisgIC8qIFJlYWQgdGhlIHN5bWJvbHMuICBXZSBrZWVwIHRoZW0gaW4gY29yZSBiZWNhdXNlIHdlIHdpbGwgd2FudCB0bworICAgICBhY2Nlc3MgdGhlbSByYW5kb21seSBpbiByZWFkX3N5bWJvbCouICAqLworICB2YWwgPSBiZmRfc2VlayAoYWJmZCwgc3ltdGFiX29mZnNldCwgU0VFS19TRVQpOworICBpZiAodmFsIDwgMCkKKyAgICBlcnJvciAoIkVycm9yIHJlYWRpbmcgc3ltYm9scyBmcm9tICVzOiAlcyIsCisJICAgbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICBzaXplID0gY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfc3ltZXN6ICogbnVtX3N5bWJvbHM7CisgICgoc3RydWN0IGNvZmZfc3ltZmlsZV9pbmZvICopb2JqZmlsZS0+c3ltX3ByaXZhdGUpLT5zeW10YmwgPQorICAgIG9ic3RhY2tfYWxsb2MgKCZvYmpmaWxlLT5zeW1ib2xfb2JzdGFjaywgc2l6ZSk7CisgICgoc3RydWN0IGNvZmZfc3ltZmlsZV9pbmZvICopb2JqZmlsZS0+c3ltX3ByaXZhdGUpLT5zeW10YmxfbnVtX3N5bXMgPQorICAgIG51bV9zeW1ib2xzOworCisgIHZhbCA9IGJmZF9yZWFkICgoKHN0cnVjdCBjb2ZmX3N5bWZpbGVfaW5mbyAqKW9iamZpbGUtPnN5bV9wcml2YXRlKS0+c3ltdGJsLAorCQkgIHNpemUsIDEsIGFiZmQpOworICBpZiAodmFsICE9IHNpemUpCisgICAgcGVycm9yX3dpdGhfbmFtZSAoInJlYWRpbmcgc3ltYm9sIHRhYmxlIik7CisKKyAgLyogSWYgd2UgYXJlIHJlaW5pdGlhbGl6aW5nLCBvciBpZiB3ZSBoYXZlIG5ldmVyIGxvYWRlZCBzeW1zIHlldCwgaW5pdCAqLworICBpZiAobWFpbmxpbmUKKyAgICAgIHx8IG9iamZpbGUtPmdsb2JhbF9wc3ltYm9scy5zaXplID09IDAKKyAgICAgIHx8IG9iamZpbGUtPnN0YXRpY19wc3ltYm9scy5zaXplID09IDApCisgICAgLyogSSdtIG5vdCBzdXJlIGhvdyBob3cgZ29vZCBudW1fc3ltYm9scyBpczsgdGhlIHJ1bGUgb2YgdGh1bWIgaW4KKyAgICAgICBpbml0X3BzeW1ib2xfbGlzdCB3YXMgZGV2ZWxvcGVkIGZvciBhLm91dC4gIE9uIHRoZSBvbmUgaGFuZCwKKyAgICAgICBudW1fc3ltYm9scyBpbmNsdWRlcyBhdXhlbnRzLiAgT24gdGhlIG90aGVyIGhhbmQsIGl0IGRvZXNuJ3QKKyAgICAgICBpbmNsdWRlIE5fU0xJTkUuICAqLworICAgIGluaXRfcHN5bWJvbF9saXN0IChvYmpmaWxlLCBudW1fc3ltYm9scyk7CisKKyAgZnJlZV9wZW5kaW5nX2Jsb2NrcyAoKTsKKyAgYmFja190byA9IG1ha2VfY2xlYW51cCAoKG1ha2VfY2xlYW51cF9mdW5jKSByZWFsbHlfZnJlZV9wZW5kaW5ncywgMCk7CisKKyAgaW5pdF9taW5pbWFsX3N5bWJvbF9jb2xsZWN0aW9uICgpOworICBtYWtlX2NsZWFudXAgKChtYWtlX2NsZWFudXBfZnVuYykgZGlzY2FyZF9taW5pbWFsX3N5bWJvbHMsIDApOworCisgIC8qIE5vdyB0aGF0IHRoZSBzeW1ib2wgdGFibGUgZGF0YSBvZiB0aGUgZXhlY3V0YWJsZSBmaWxlIGFyZSBhbGwgaW4gY29yZSwKKyAgICAgcHJvY2VzcyB0aGVtIGFuZCBkZWZpbmUgc3ltYm9scyBhY2NvcmRpbmdseS4gICovCisKKyAgc2Nhbl94Y29mZl9zeW10YWIgKHNlY3Rpb25fb2Zmc2V0cywgb2JqZmlsZSk7CisKKyAgLyogSW5zdGFsbCBhbnkgbWluaW1hbCBzeW1ib2xzIHRoYXQgaGF2ZSBiZWVuIGNvbGxlY3RlZCBhcyB0aGUgY3VycmVudAorICAgICBtaW5pbWFsIHN5bWJvbHMgZm9yIHRoaXMgb2JqZmlsZS4gKi8KKworICBpbnN0YWxsX21pbmltYWxfc3ltYm9scyAob2JqZmlsZSk7CisKKyAgZG9fY2xlYW51cHMgKGJhY2tfdG8pOworfQorDAorc3RhdGljIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKgoreGNvZmZfc3ltZmlsZV9vZmZzZXRzIChvYmpmaWxlLCBhZGRyKQorICAgICBzdHJ1Y3Qgb2JqZmlsZSAqb2JqZmlsZTsKKyAgICAgQ09SRV9BRERSIGFkZHI7Cit7CisgIHN0cnVjdCBzZWN0aW9uX29mZnNldHMgKnNlY3Rpb25fb2Zmc2V0czsKKyAgaW50IGk7CisKKyAgb2JqZmlsZS0+bnVtX3NlY3Rpb25zID0gU0VDVF9PRkZfTUFYOworICBzZWN0aW9uX29mZnNldHMgPSAoc3RydWN0IHNlY3Rpb25fb2Zmc2V0cyAqKQorICAgIG9ic3RhY2tfYWxsb2MKKyAgICAgICgmb2JqZmlsZSAtPiBwc3ltYm9sX29ic3RhY2ssCisgICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc2VjdGlvbl9vZmZzZXRzKQorICAgICAgICsgc2l6ZW9mIChzZWN0aW9uX29mZnNldHMtPm9mZnNldHMpICogb2JqZmlsZS0+bnVtX3NlY3Rpb25zKTsKKworICAvKiBzeW1zX2Zyb21fb2JqZmlsZSBraW5kbHkgc3VidHJhY3RzIGZyb20gYWRkciB0aGUgYmZkX3NlY3Rpb25fdm1hCisgICAgIG9mIHRoZSAudGV4dCBzZWN0aW9uLiAgVGhpcyBzdHJpa2VzIG1lIGFzIHdyb25nLS13aGV0aGVyIHRoZQorICAgICBvZmZzZXQgdG8gYmUgYXBwbGllZCB0byBzeW1ib2wgcmVhZGluZyBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQKKyAgICAgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBkZXBlbmRzIG9uIHRoZSBzeW1ib2wgZm9ybWF0LiAgSW4gYW55CisgICAgIGV2ZW50LCB0aGlzIHdob2xlICJhZGRyIiBjb25jZXB0IGlzIHByZXR0eSBicm9rZW4gKGl0IGRvZXNuJ3QKKyAgICAgaGFuZGxlIGFueSBzZWN0aW9uIGJ1dCAudGV4dCBzZW5zaWJseSksIHNvIGp1c3QgaWdub3JlIHRoZSBhZGRyCisgICAgIHBhcmFtZXRlciBhbmQgdXNlIDAuICByczYwMDAtbmF0LmMgd2lsbCBzZXQgdGhlIGNvcnJlY3Qgc2VjdGlvbgorICAgICBvZmZzZXRzIHZpYSBvYmpmaWxlX3JlbG9jYXRlLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IG9iamZpbGUtPm51bV9zZWN0aW9uczsgKytpKQorICAgIEFOT0ZGU0VUIChzZWN0aW9uX29mZnNldHMsIGkpID0gMDsKKworICByZXR1cm4gc2VjdGlvbl9vZmZzZXRzOworfQorCisvKiBSZWdpc3RlciBvdXIgYWJpbGl0eSB0byBwYXJzZSBzeW1ib2xzIGZvciB4Y29mZiBCRkQgZmlsZXMuICAqLworCitzdGF0aWMgc3RydWN0IHN5bV9mbnMgeGNvZmZfc3ltX2ZucyA9Cit7CisKKyAgLyogQmVjYXVzZSB0aGUgYmZkIHVzZXMgY29mZl9mbGF2b3VyLCB3ZSBuZWVkIHRvIHNwZWNpYWxseSBrbHVkZ2UKKyAgICAgdGhlIGZsYXZvdXIuICBJdCBpcyBwb3NzaWJsZSB0aGF0IGNvZmYgYW5kIHhjb2ZmIHNob3VsZCBiZSBtZXJnZWQgYXMKKyAgICAgdGhleSBkbyBoYXZlIGZ1bmRhbWVudGFsIHNpbWlsYXJpdGllcyAoZm9yIGV4YW1wbGUsIHRoZSBleHRyYSBzdG9yYWdlCisgICAgIGNsYXNzZXMgdXNlZCBmb3Igc3RhYnMgY291bGQgcHJlc3VtYWJseSBiZSByZWNvZ25pemVkIGluIGFueSBDT0ZGIGZpbGUpLgorICAgICBIb3dldmVyLCBpbiBhZGRpdGlvbiB0byBvYnZpb3VzIHRoaW5ncyBsaWtlIGFsbCB0aGUgY3NlY3QgaGFpciwgdGhlcmUgYXJlCisgICAgIHNvbWUgc3VidGxlciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHhjb2ZmcmVhZC5jIGFuZCBjb2ZmcmVhZC5jLCBub3RhYmx5CisgICAgIHRoZSBmYWN0IHRoYXQgY29mZnJlYWQuYyBoYXMgbm8gbmVlZCB0byByZWFkIGluIGFsbCB0aGUgc3ltYm9scywgYnV0CisgICAgIHhjb2ZmcmVhZC5jIHJlYWRzIGFsbCB0aGUgc3ltYm9scyBhbmQgZG9lcyBpbiBmYWN0IHJhbmRvbWx5IGFjY2VzcyB0aGVtCisgICAgIChpbiBDX0JTVEFUIGFuZCBsaW5lIG51bWJlciBwcm9jZXNzaW5nKS4gICovCisKKyAgKGVudW0gYmZkX2ZsYXZvdXIpLTEsCisKKyAgeGNvZmZfbmV3X2luaXQsCS8qIHN5bV9uZXdfaW5pdDogaW5pdCBhbnl0aGluZyBnYmwgdG8gZW50aXJlIHN5bXRhYiAqLworICB4Y29mZl9zeW1maWxlX2luaXQsCS8qIHN5bV9pbml0OiByZWFkIGluaXRpYWwgaW5mbywgc2V0dXAgZm9yIHN5bV9yZWFkKCkgKi8KKyAgeGNvZmZfaW5pdGlhbF9zY2FuLAkvKiBzeW1fcmVhZDogcmVhZCBhIHN5bWJvbCBmaWxlIGludG8gc3ltdGFiICovCisgIHhjb2ZmX3N5bWZpbGVfZmluaXNoLCAvKiBzeW1fZmluaXNoOiBmaW5pc2hlZCB3aXRoIGZpbGUsIGNsZWFudXAgKi8KKyAgeGNvZmZfc3ltZmlsZV9vZmZzZXRzLCAvKiBzeW1fb2Zmc2V0czogeGxhdGUgb2Zmc2V0cyBleHQtPmludCBmb3JtICovCisgIE5VTEwJCQkvKiBuZXh0OiBwb2ludGVyIHRvIG5leHQgc3RydWN0IHN5bV9mbnMgKi8KK307CisKK3ZvaWQKK19pbml0aWFsaXplX3hjb2ZmcmVhZCAoKQoreworICBhZGRfc3ltdGFiX2ZucygmeGNvZmZfc3ltX2Zucyk7CisKKyAgZnVuY19zeW1ib2xfdHlwZSA9IGluaXRfdHlwZSAoVFlQRV9DT0RFX0ZVTkMsIDEsIDAsCisJCQkJIjxmdW5jdGlvbiwgbm8gZGVidWcgaW5mbz4iLCBOVUxMKTsKKyAgVFlQRV9UQVJHRVRfVFlQRSAoZnVuY19zeW1ib2xfdHlwZSkgPSBidWlsdGluX3R5cGVfaW50OworICB2YXJfc3ltYm9sX3R5cGUgPQorICAgIGluaXRfdHlwZSAoVFlQRV9DT0RFX0lOVCwgVEFSR0VUX0lOVF9CSVQgLyBIT1NUX0NIQVJfQklULCAwLAorCSAgICAgICAiPHZhcmlhYmxlLCBubyBkZWJ1ZyBpbmZvPiIsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvZ2RiL3hjb2Zmc29saWIuYyBiL2dkYi94Y29mZnNvbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkODA2NQotLS0gL2Rldi9udWxsCisrKyBiL2dkYi94Y29mZnNvbGliLmMKQEAgLTAsMCArMSwyMjAgQEAKKy8qIFNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgZm9yIFJTLzYwMDAgKHhjb2ZmKSBvYmplY3QgZmlsZXMsIGZvciBHREIuCisgICBDb3B5cmlnaHQgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgICBDb250cmlidXRlZCBieSBJQk0gQ29ycG9yYXRpb24uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmIDAKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvbGRyLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJ4Y29mZnNvbGliLmgiCisjaW5jbHVkZSAiaW5mZXJpb3IuaCIKKyNpbmNsdWRlICJjb21tYW5kLmgiCisKKy8qIEhvb2sgdG8gcmVsb2NhdGUgc3ltYm9scyBhdCBydW50aW1lLiAgSWYgZ2RiIGlzIGJ1aWxkIG5hdGl2ZWx5LCB0aGlzCisgICBob29rIGlzIGluaXRpYWxpemVkIGluIGJ5IHJzNjAwMC1uYXQuYy4gIElmIG5vdCwgaXQgaXMgY3VycmVudGx5IGxlZnQKKyAgIE5VTEwgYW5kIG5ldmVyIGNhbGxlZC4gKi8KKwordm9pZCAoKnhjb2ZmX3JlbG9jYXRlX3N5bXRhYl9ob29rKSBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKSA9IE5VTEw7CisKKyNpZmRlZiBTT0xJQl9TWU1CT0xTX01BTlVBTAorCitleHRlcm4gc3RydWN0IHN5bXRhYiAqY3VycmVudF9zb3VyY2Vfc3ltdGFiOworZXh0ZXJuIGludAkgICAgICBjdXJyZW50X3NvdXJjZV9saW5lOworCisvKiBUaGUgcmVhbCB3b3JrIG9mIGFkZGluZyBhIHNoYXJlZCBsaWJyYXJ5IGZpbGUgdG8gdGhlIHN5bXRhYiBhbmQKKyAgIHRoZSBzZWN0aW9uIGxpc3QuICAqLworCit2b2lkCitzb2xpYl9hZGQgKGFyZ19zdHJpbmcsIGZyb21fdHR5LCB0YXJnZXQpCisgICAgIGNoYXIgKmFyZ19zdHJpbmc7CisgICAgIGludCBmcm9tX3R0eTsKKyAgICAgc3RydWN0IHRhcmdldF9vcHMgKnRhcmdldDsKK3sJCisgIGNoYXIgKnZhbDsKKyAgc3RydWN0IHZtYXAgKnZwID0gdm1hcDsKKyAgc3RydWN0IG9iamZpbGUgKm9iajsKKyAgc3RydWN0IHN5bXRhYiAqc2F2ZWRfc3ltdGFiOworICBpbnQgc2F2ZWRfbGluZTsKKworICBpbnQgbG9hZGVkID0gMDsJCQkvKiB0cnVlIGlmIGFueSBzaGFyZWQgb2JqIGxvYWRlZCAqLworICBpbnQgbWF0Y2hlZCA9IDA7CQkJLyogdHJ1ZSBpZiBhbnkgc2hhcmVkIG9iaiBtYXRjaGVkICovCisKKyAgaWYgKGFyZ19zdHJpbmcgPT0gMCkKKyAgICAgIHJlX2NvbXAgKCIuIik7CisgIGVsc2UgaWYgKHZhbCA9IChjaGFyICopIHJlX2NvbXAgKGFyZ19zdHJpbmcpKSB7CisgICAgICBlcnJvciAoIkludmFsaWQgcmVnZXhwOiAlcyIsIHZhbCk7CisgIH0KKyAgaWYgKCF2cCB8fCAhdnAtPm54dCkKKyAgICByZXR1cm47CisKKyAgLyogc2F2ZSBjdXJyZW50IHN5bWJvbCB0YWJsZSBhbmQgbGluZSBudW1iZXIsIGluIGNhc2UgdGhleSBnZXQgY2hhbmdlZAorICAgICBpbiBzeW1ib2wgbG9hZGluZyBwcm9jZXNzLiAqLworIAorICBzYXZlZF9zeW10YWIgPSBjdXJyZW50X3NvdXJjZV9zeW10YWI7CisgIHNhdmVkX2xpbmUgPSBjdXJyZW50X3NvdXJjZV9saW5lOworCisgIC8qIHNraXAgb3ZlciB0aGUgZmlyc3Qgdm1hcCwgaXQgaXMgdGhlIG1haW4gcHJvZ3JhbSwgYWx3YXlzIGxvYWRlZC4gKi8KKyAgdnAgPSB2cC0+bnh0OworCisgIGZvciAoOyB2cDsgdnAgPSB2cC0+bnh0KSB7CisKKyAgICBpZiAocmVfZXhlYyAodnAtPm5hbWUpIHx8ICgqdnAtPm1lbWJlciAmJiByZV9leGVjICh2cC0+bWVtYmVyKSkpIHsKKworICAgICAgbWF0Y2hlZCA9IDE7CisKKyAgICAgIC8qIGlmIGFscmVhZHkgbG9hZGVkLCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IG9uZS4gKi8KKyAgICAgIGlmICh2cC0+bG9hZGVkKSB7CisJCisJcHJpbnRmX3VuZmlsdGVyZWQgKCIlcyVzJXMlczogYWxyZWFkeSBsb2FkZWQuXG4iLAorCSAgKnZwLT5tZW1iZXIgPyAiKCIgOiAiIiwKKwkgIHZwLT5tZW1iZXIsCisJICAqdnAtPm1lbWJlciA/ICIpICIgOiAiIiwKKwkgIHZwLT5uYW1lKTsKKwljb250aW51ZTsKKyAgICAgIH0KKworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJMb2FkaW5nICAlcyVzJXMlcy4uLiIsCisJICAqdnAtPm1lbWJlciA/ICIoIiA6ICIiLAorCSAgdnAtPm1lbWJlciwKKwkgICp2cC0+bWVtYmVyID8gIikgIiA6ICIiLAorCSAgdnAtPm5hbWUpOworICAgICAgZ2RiX2ZsdXNoIChnZGJfc3Rkb3V0KTsKKworICAgICAgLyogVGhpcyBpcyBncm9zcyBhbmQgZG9lc24ndCB3b3JrLiAgSWYgdGhpcyBjb2RlIGlzIHJlLWVuYWJsZWQsCisJIGp1c3Qgc3RpY2sgYSBvYmpmaWxlIG1lbWJlciBpbnRvIHRoZSBzdHJ1Y3Qgdm1hcDsgdGhhdCdzIHRoZQorCSB3YXkgc29saWIuYyAoZm9yIFN1bk9TL1NWUjQpIGRvZXMgaXQuICAqLworCW9iaiA9IGxvb2t1cF9vYmpmaWxlX2JmZCAodnAtPmJmZCk7CisJaWYgKCFvYmopIHsKKwkgIHdhcm5pbmcgKCJcbk9iaiBzdHJ1Y3R1cmUgZm9yIHRoZSBzaGFyZWQgb2JqZWN0IG5vdCBmb3VuZC4gTG9hZGluZyBmYWlsZWQuIik7CisJICBjb250aW51ZTsKKwl9CisKKwlzeW1zX2Zyb21fb2JqZmlsZSAob2JqLCAwLCAwLCAwKTsKKwluZXdfc3ltZmlsZV9vYmpmaWxlIChvYmosIDAsIDApOworCXZtYXBfc3ltdGFiICh2cCwgMCwgMCk7CisJcHJpbnRmX3VuZmlsdGVyZWQgKCJEb25lLlxuIik7CisJbG9hZGVkID0gdnAtPmxvYWRlZCA9IDE7CisgICAgfQorICB9CisgIC8qIGlmIGFueSBzaGFyZWQgb2JqZWN0IGlzIGxvYWRlZCwgdGhlbiBtaXNjX2Z1bmNfdmVjdG9yIG5lZWRzIHNvcnRpbmcuICovCisgIGlmIChsb2FkZWQpIHsKKyNpZiAwCisgICAgc29ydF9taXNjX2Z1bmN0aW9uX3ZlY3RvciAoKTsKKyNlbmRpZgorICAgIGN1cnJlbnRfc291cmNlX3N5bXRhYiA9IHNhdmVkX3N5bXRhYjsKKyAgICBjdXJyZW50X3NvdXJjZV9saW5lID0gc2F2ZWRfbGluZTsKKworICAgIC8qIEdldHRpbmcgbmV3IHN5bWJvbHMgbWlnaHQgY2hhbmdlIG91ciBvcGluaW9uIGFib3V0IHdoYXQgaXMgZnJhbWVsZXNzLgorICAgICAgIElzIHRoaXMgY29ycmVjdD8/IEZJWE1FLiAqLworLyogICAgcmVpbml0X2ZyYW1lX2NhY2hlKCk7ICovCisgIH0KKyAgZWxzZSBpZiAoIW1hdGNoZWQpCisgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJObyBtYXRjaGluZyBzaGFyZWQgb2JqZWN0IGZvdW5kLlxuIik7Cit9CisjZW5kaWYgLyogU09MSUJfU1lNQk9MU19NQU5VQUwgKi8KKworLyogUmV0dXJuIHRoZSBtb2R1bGUgbmFtZSBvZiBhIGdpdmVuIHRleHQgYWRkcmVzcy4gTm90ZSB0aGF0IHJldHVybmVkIGJ1ZmZlcgorICAgaXMgbm90IHBlcnNpc3RlbnQuICovCisKK2NoYXIgKgorcGNfbG9hZF9zZWdtZW50X25hbWUgKGFkZHIpCitDT1JFX0FERFIgYWRkcjsKK3sKKyAgIHN0YXRpYyBjaGFyIGJ1ZmZlciBbQlVGU0laXTsKKyAgIHN0cnVjdCB2bWFwICp2cCA9IHZtYXA7CisKKyAgIGJ1ZmZlciBbMF0gPSBidWZmZXIgWzFdID0gJ1wwJzsKKyAgIGZvciAoOyB2cDsgdnAgPSB2cC0+bnh0KQorICAgICBpZiAodnAtPnRzdGFydCA8PSBhZGRyICYmIGFkZHIgPCB2cC0+dGVuZCkgeworCWlmICgqdnAtPm1lbWJlcikgeworCSAgYnVmZmVyIFswXSA9ICcoJzsKKwkgIHN0cmNhdCAoJmJ1ZmZlclsxXSwgdnAtPm1lbWJlcik7CisJICBzdHJjYXQgKGJ1ZmZlciwgIikiKTsKKwl9CisJc3RyY2F0IChidWZmZXIsIHZwLT5uYW1lKTsKKwlyZXR1cm4gYnVmZmVyOworICAgICB9CisgICByZXR1cm4gIih1bmtub3duIGxvYWQgbW9kdWxlKSI7Cit9CisKK3N0YXRpYyB2b2lkIHNvbGliX2luZm8gUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKKworc3RhdGljIHZvaWQKK3NvbGliX2luZm8gKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHN0cnVjdCB2bWFwICp2cCA9IHZtYXA7CisKKyAgLyogQ2hlY2sgZm9yIG5ldyBzaGFyZWQgbGlicmFyaWVzIGxvYWRlZCB3aXRoIGxvYWQgKCkuICAqLworICBpZiAoeGNvZmZfcmVsb2NhdGVfc3ltdGFiX2hvb2sgIT0gTlVMTCkKKyAgICAoKnhjb2ZmX3JlbG9jYXRlX3N5bXRhYl9ob29rKSAoaW5mZXJpb3JfcGlkKTsKKworICBpZiAodnAgPT0gTlVMTCB8fCB2cC0+bnh0ID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJObyBzaGFyZWQgbGlicmFyaWVzIGxvYWRlZCBhdCB0aGlzIHRpbWUuXG4iKTsJCisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFNraXAgb3ZlciB0aGUgZmlyc3Qgdm1hcCwgaXQgaXMgdGhlIG1haW4gcHJvZ3JhbSwgYWx3YXlzIGxvYWRlZC4gICovCisgIHZwID0gdnAtPm54dDsKKworICBwcmludGZfdW5maWx0ZXJlZCAoIlwKK1RleHQgUmFuZ2UJCURhdGEgUmFuZ2UJCVN5bXMJU2hhcmVkIE9iamVjdCBMaWJyYXJ5XG4iKTsKKworICBmb3IgKDsgdnAgIT0gTlVMTDsgdnAgPSB2cC0+bnh0KQorICAgIHsKKyAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiMHglMDh4LTB4JTA4eAkweCUwOHgtMHglMDh4CSVzCSVzJXMlcyVzXG4iLAorCQkJIHZwLT50c3RhcnQsIHZwLT50ZW5kLAorCQkJIHZwLT5kc3RhcnQsIHZwLT5kZW5kLAorCQkJIHZwLT5sb2FkZWQgPyAiWWVzIiA6ICJObyAiLAorCQkJICp2cC0+bWVtYmVyID8gIigiIDogIiIsCisJCQkgdnAtPm1lbWJlciwKKwkJCSAqdnAtPm1lbWJlciA/ICIpICIgOiAiIiwKKwkJCSB2cC0+bmFtZSk7CisgICAgfQorfQorCit2b2lkCitzaGFyZWRsaWJyYXJ5X2NvbW1hbmQgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIGRvbnRfcmVwZWF0ICgpOworCisgIC8qIENoZWNrIGZvciBuZXcgc2hhcmVkIGxpYnJhcmllcyBsb2FkZWQgd2l0aCBsb2FkICgpLiAgKi8KKyAgaWYgKHhjb2ZmX3JlbG9jYXRlX3N5bXRhYl9ob29rICE9IE5VTEwpCisgICAgKCp4Y29mZl9yZWxvY2F0ZV9zeW10YWJfaG9vaykgKGluZmVyaW9yX3BpZCk7CisKKyNpZmRlZiBTT0xJQl9TWU1CT0xTX01BTlVBTAorICBzb2xpYl9hZGQgKGFyZ3MsIGZyb21fdHR5LCAoc3RydWN0IHRhcmdldF9vcHMgKikwKTsKKyNlbmRpZiAvKiBTT0xJQl9TWU1CT0xTX01BTlVBTCAqLworfQorCit2b2lkCitfaW5pdGlhbGl6ZV9zb2xpYigpCit7CisgIGFkZF9jb20gKCJzaGFyZWRsaWJyYXJ5IiwgY2xhc3NfZmlsZXMsIHNoYXJlZGxpYnJhcnlfY29tbWFuZCwKKwkgICAiTG9hZCBzaGFyZWQgb2JqZWN0IGxpYnJhcnkgc3ltYm9scyBmb3IgZmlsZXMgbWF0Y2hpbmcgUkVHRVhQLiIpOworICBhZGRfaW5mbyAoInNoYXJlZGxpYnJhcnkiLCBzb2xpYl9pbmZvLCAKKwkgICAgIlN0YXR1cyBvZiBsb2FkZWQgc2hhcmVkIG9iamVjdCBsaWJyYXJpZXMiKTsKK30KZGlmZiAtLWdpdCBhL2dkYi94Y29mZnNvbGliLmggYi9nZGIveGNvZmZzb2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDY5MWIKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIveGNvZmZzb2xpYi5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIERhdGEgc3RydWN0dXJlcyBmb3IgUlMvNjAwMCBzaGFyZWQgbGlicmFyaWVzLCBmb3IgR0RCLgorICAgQ29weXJpZ2h0IDE5OTEsIDE5OTIsIDE5OTQsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhlIHZtYXAgc3RydWN0IGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBvZgorICAgdGhlIHRhcmdldCB3ZSBhcmUgbWFuaXB1bGF0aW5nLiAgVGhlIGZpcnN0IGVudHJ5IGlzIGFsd2F5cyB0aGUgImV4ZWMiCisgICBmaWxlLiAgU3Vic2VxdWVudCBlbnRyaWVzIGNvcnJlc3BvbmQgdG8gb3RoZXIgb2JqZWN0cyB0aGF0IGFyZQorICAgbWFwcGVkIGludG8gdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgYSBwcm9jZXNzIGNyZWF0ZWQgZnJvbSB0aGUgImV4ZWMiIGZpbGUuCisgICBUaGVzZSBhcmUgZWl0aGVyIGluIHJlc3BvbnNlIHRvIGV4ZWMoKWluZyB0aGUgZmlsZSwgaW4gd2hpY2ggY2FzZSBhbGwKKyAgIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCwgb3IgYSAibG9hZCIgc3lzdGVtIGNhbGwsIGZvbGxvd2VkIGJ5IHRoZQorICAgdXNlcidzIGlzc3VhbmNlIG9mIGEgImxvYWQiIGNvbW1hbmQuICAqLworCitzdHJ1Y3Qgdm1hcCB7CisgIHN0cnVjdCB2bWFwICpueHQ7CS8qIHB0ciB0byBuZXh0IGluIGNoYWluCQkJKi8KKyAgYmZkICpiZmQ7CQkvKiBCRkQgZm9yIG1hcHBhYmxlIG9iamVjdCBsaWJyYXJ5CSovCisgIGNoYXIgKm5hbWU7CQkvKiBwdHIgdG8gb2JqZWN0IGZpbGUgbmFtZQkJKi8KKyAgY2hhciAqbWVtYmVyOwkJLyogcHRyIHRvIG1lbWJlciBuYW1lCQkJKi8KKyAgQ09SRV9BRERSIHRzdGFydDsJLyogdmlydHVhbCBhZGRyIHdoZXJlIG1lbWJlciBpcyBtYXBwZWQJKi8KKyAgQ09SRV9BRERSIHRlbmQ7CS8qIHZpcnR1YWwgdXBwZXIgYm91bmQgb2YgbWVtYmVyCSovCisgIENPUkVfQUREUiB0dm1hOwkvKiB2aXJ0dWFsIGFkZHIgb2YgdGV4dCBzZWN0aW9uIGluIG9iamVjdCBmaWxlICovCisgIENPUkVfQUREUiB0b2ZmczsJLyogb2Zmc2V0IG9mIHRleHQgc2VjdGlvbiBpbiBvYmplY3QgZmlsZSAqLworICBDT1JFX0FERFIgZHN0YXJ0OwkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgZGF0YSBzdGFydAkqLworICBDT1JFX0FERFIgZGVuZDsJLyogdmlydHVhbCBhZGRyZXNzIG9mIGRhdGEgZW5kCQkqLworICBDT1JFX0FERFIgZHZtYTsJLyogdmlydHVhbCBhZGRyIG9mIGRhdGEgc2VjdGlvbiBpbiBvYmplY3QgZmlsZSAqLworCisgIC8qIFRoaXMgaXMgTlVMTCBmb3IgdGhlIGV4ZWMtZmlsZS4gICovCisgIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOworICAKKyAgdW5zaWduZWQgIGxvYWRlZDoxOwkvKiBUcnVlIGlmIHN5bWJvbHMgYXJlIGxvYWRlZAkJKi8KKyAgdW5zaWduZWQgIHBhZGRpbmc6MTU7Cit9OworCisKK3N0cnVjdCB2bWFwX2FuZF9iZmQgeworICBiZmQgKnBiZmQ7CisgIHN0cnVjdCB2bWFwICpwdm1hcDsKK307CisKK2V4dGVybiBzdHJ1Y3Qgdm1hcCAqdm1hcDsKKworLyogSG9vayBmb3Igc3ltYm9sIHRhYmxlIHJlbG9jYXRpb24gYXQgcnVudGltZS4gKi8KKworZXh0ZXJuIHZvaWQgKCp4Y29mZl9yZWxvY2F0ZV9zeW10YWJfaG9vaykgUEFSQU1TICgodW5zaWduZWQgaW50KSk7CmRpZmYgLS1naXQgYS9nZGIveG1vZGVtLmMgYi9nZGIveG1vZGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQxM2I4NwotLS0gL2Rldi9udWxsCisrKyBiL2dkYi94bW9kZW0uYwpAQCAtMCwwICsxLDI4NCBAQAorLyogWE1PREVNIHN1cHBvcnQgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic2VyaWFsLmgiCisjaW5jbHVkZSAidGFyZ2V0LmgiCisjaW5jbHVkZSAieG1vZGVtLmgiCisKKy8qIFRoZXNlIGRlZmluaXRpb25zIGFyZSBmb3IgeG1vZGVtIHByb3RvY29sLiAqLworCisjZGVmaW5lIFNPSAkweDAxCisjZGVmaW5lIFNUWAkweDAyCisjZGVmaW5lIEFDSwkweDA2CisjZGVmaW5lIE5BSwkweDE1CisjZGVmaW5lIEVPVAkweDA0CisjZGVmaW5lIENBTkNFTAkweDE4CisKK3N0YXRpYyBpbnQgYmxrbnVtOwkJLyogWE1PREVNIGJsb2NrIG51bWJlciAqLworc3RhdGljIGludCBjcmNmbGFnOwkJLyogU2V6IHdlIGFyZSB1c2luZyBDUkMncyBpbnN0ZWFkIG9mIGNrc3VtcyAqLworCitzdGF0aWMgaW50CityZWFkY2hhciAoZGVzYywgdGltZW91dCkKKyAgICAgc2VyaWFsX3QgZGVzYzsKKyAgICAgaW50IHRpbWVvdXQ7Cit7CisgIGludCBjOworCisgIGMgPSBTRVJJQUxfUkVBRENIQVIgKGRlc2MsIHRpbWVvdXQpOworCisgIGlmIChyZW1vdGVfZGVidWcgPiAwKQorICAgIGZwdXRjX3VuZmlsdGVyZWQgKGMsIGdkYl9zdGRlcnIpOworCisgIGlmIChjID49IDApCisgICAgcmV0dXJuIGM7CisKKyAgaWYgKGMgPT0gU0VSSUFMX1RJTUVPVVQpCisgICAgZXJyb3IgKCJUaW1lb3V0IHJlYWRpbmcgZnJvbSByZW1vdGUgc3lzdGVtLiIpOworCisgIHBlcnJvcl93aXRoX25hbWUgKCJ4bW9kZW0uYzpyZWFkY2hhcigpIik7Cit9CisKKyNkZWZpbmUgQ1JDMTYgMHgxMDIxCQkvKiBHZW5lcmF0b3IgcG9seW5vbWlhbCAoWF4xNiArIFheMTIgKyBYXjUgKyAxKSAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgKmNyY3RhYjsKKworLyogQ2FsbCB0aGlzIHRvIGluaXQgdGhlIGZhc3QgQ1JDLTE2IGNhbGN1bGF0aW9uIHRhYmxlLiAgKi8KKworc3RhdGljIHZvaWQKK2NyY2luaXQgKCkKK3sKKyAgc3RhdGljIGludCBjcmN0YWJfaW5pdGVkID0gMDsKKyAgaW50IHZhbDsKKworICBpZiAoY3JjdGFiX2luaXRlZCA9PSAxKQorICAgIHJldHVybjsKKworICBjcmN0YWIgPSB4bWFsbG9jICgyNTYgKiBzaXplb2YgKHNob3J0KSk7CisKKyAgZm9yICh2YWwgPSAwOyB2YWwgPD0gMjU1OyB2YWwrKykKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIHVuc2lnbmVkIGludCBjcmM7CisKKyAgICAgIGNyYyA9IHZhbCA8PCA4OworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKQorCXsKKwkgIGNyYyA8PD0gMTsKKworCSAgaWYgKGNyYyAmIDB4MTAwMDApCisJICAgIGNyYyBePSBDUkMxNjsKKwl9CisKKyAgICAgIGNyY3RhYiBbdmFsXSA9IGNyYzsKKyAgICB9CisKKyAgY3JjdGFiX2luaXRlZCA9IDE7Cit9CisKKy8qIENhbGN1bGF0ZSBhIENSQy0xNiBmb3IgdGhlIExFTiBieXRlIG1lc3NhZ2UgcG9pbnRlZCBhdCBieSBQLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0Citkb2NyYyAocCwgbGVuKQorICAgICB1bnNpZ25lZCBjaGFyICpwOworICAgICBpbnQgbGVuOworeworICB1bnNpZ25lZCBzaG9ydCBjcmMgPSAwOworCisgIHdoaWxlIChsZW4tLSA+IDApCisgICAgY3JjID0gKGNyYyA8PCA4KSBeIGNyY3RhYiBbKGNyYyA+PiA4KSBeICpwKytdOworCisgIHJldHVybiBjcmM7Cit9CisKKy8qIFN0YXJ0IHVwIHRoZSB0cmFuc21pdCBwcm9jZXNzLiAgUmVzZXQgc3RhdGUgdmFyaWFibGVzLiAgV2FpdCBmb3IgcmVjZWl2ZXIgdG8KKyAgIHNlbmQgTkFLIG9yIENSQyByZXF1ZXN0LiAgKi8KKworaW50Cit4bW9kZW1faW5pdF94ZmVyIChkZXNjKQorICAgICBzZXJpYWxfdCBkZXNjOworeworICBpbnQgYzsKKyAgaW50IGk7CisKKyAgYmxrbnVtID0gMTsKKyAgY3JjZmxhZyA9IDA7CisgIGNyY2luaXQgKCk7CisKKyAgZm9yIChpID0gMTsgaSA8PSAxMDsgaSsrKQorICAgIHsKKyAgICAgIGMgPSByZWFkY2hhciAoZGVzYywgNik7CisKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSAnQyc6CisJICBjcmNmbGFnID0gMTsKKwljYXNlIE5BSzoKKwkgIHJldHVybiAwOworCWRlZmF1bHQ6CisJICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ4bW9kZW1faW5pdF94ZmVyOiBHb3QgdW5leHBlY3RlZCBjaGFyYWN0ZXIgJWMgKDAlbylcbiIsIGMsIGMpOworCSAgY29udGludWU7CisJY2FzZSBDQU5DRUw6CQkvKiB0YXJnZXQgYWJvcnRlZCBsb2FkICovCisJICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJHb3QgYSBDQU5DRUwgZnJvbSB0aGUgdGFyZ2V0LlxuIik7CisJICBjb250aW51ZTsKKwl9CisgICAgfQorICBlcnJvciAoInhtb2RlbV9pbml0X3hmZXI6ICBUb28gbWFueSB1bmV4cGVjdGVkIGNoYXJhY3RlcnMuIik7Cit9CisKKy8qIFRha2UgMTI4IGJ5dGVzIG9mIGRhdGEgYW5kIG1ha2UgYSBwYWNrZXQgb3V0IG9mIGl0LgorICoKKyAqCUVhY2ggcGFja2V0IGxvb2tzIGxpa2UgdGhpczoKKyAqCSstLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tKy0tLS0tKworICoJfCBTT0ggfCBTZXExLiB8IFNlcTIuIHwgZGF0YSB8IFNVTSB8CisgKgkrLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLSstLS0tLSsKKyAqCVNPSCAgPSAweDAxCisgKglTZXExID0gVGhlIHNlcXVlbmNlIG51bWJlci4KKyAqCVNlcTIgPSBUaGUgY29tcGxlbWVudCBvZiB0aGUgc2VxdWVuY2UgbnVtYmVyLgorICoJRGF0YSA9IEEgMTI4IGJ5dGVzIG9mIGRhdGEuCisgKglTVU0gID0gQWRkIHRoZSBjb250ZW50cyBvZiB0aGUgMTI4IGJ5dGVzIGFuZCB1c2UgdGhlIGxvdy1vcmRlcgorICoJICAgICAgIDggYml0cyBvZiB0aGUgcmVzdWx0LgorICoKKyAqIHNlbmRfeG1vZGVtX3BhY2tldCBmaWxscyBpbiB0aGUgWE1PREVNIGZpZWxkcyBvZiBQQUNLRVQgYW5kIHNlbmRzIGl0IHRvIHRoZQorICogcmVtb3RlIHN5c3RlbS4gIFBBQ0tFVCBtdXN0IGJlIFhNT0RFTV9QQUNLRVRTSVpFIGJ5dGVzIGxvbmcuICBUaGUgZGF0YSBtdXN0CisgKiBzdGFydCAzIGJ5dGVzIGFmdGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldCB0byBsZWF2ZSByb29tIGZvciB0aGUKKyAqIFhNT0RFTSBoZWFkZXIuICBMRU4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBwb3J0aW9uIG9mIHRoZSBwYWNrZXQgKGFuZAorICogbXVzdCBiZSA8PSAxMjggYnl0ZXMpLiAgSWYgaXQgaXMgPCAxMjggYnl0ZXMsIF5aIHBhZGRpbmcgd2lsbCBiZSBhZGRlZC4KKyAqLworCit2b2lkCit4bW9kZW1fc2VuZF9wYWNrZXQgKGRlc2MsIHBhY2tldCwgbGVuLCBoYXNobWFyaykKKyAgICAgc2VyaWFsX3QgZGVzYzsKKyAgICAgdW5zaWduZWQgY2hhciAqcGFja2V0OworICAgICBpbnQgbGVuOworICAgICBpbnQgaGFzaG1hcms7Cit7CisgIGludCBpOworICBpbnQgcmV0cmllczsKKyAgaW50IHBrdGxlbjsKKyAgaW50IGRhdGFzaXplOworICAKKyAgLyogYnVpbGQgdGhlIHBhY2tldCBoZWFkZXIgKi8KKworICBwYWNrZXRbMV0gPSBibGtudW07CisgIHBhY2tldFsyXSA9IH5ibGtudW07CisKKyAgYmxrbnVtKys7CisgIAorICBpZiAobGVuIDw9IFhNT0RFTV9EQVRBU0laRSkKKyAgICB7CisgICAgICBwYWNrZXRbMF0gPSBTT0g7CisgICAgICBkYXRhc2l6ZSA9IFhNT0RFTV9EQVRBU0laRTsKKyAgICB9CisgIGVsc2UgaWYgKGxlbiA8PSBYTU9ERU1fMUtEQVRBU0laRSkKKyAgICB7CisgICAgICBwYWNrZXRbMF0gPSBTVFg7CisgICAgICBkYXRhc2l6ZSA9IFhNT0RFTV8xS0RBVEFTSVpFOworICAgIH0KKyAgZWxzZQorICAgIGFib3J0ICgpOwkJCS8qIFBhY2tldCB3YXkgdG9vIGxhcmdlICovCisKKyAgLyogQWRkIF5aIHBhZGRpbmcgaWYgcGFja2V0IDwgMTI4IChvciAxMDI0KSBieXRlcyAqLworCisgIG1lbXNldCAocGFja2V0ICsgMyArIGxlbiwgJ1wwMjYnLCBkYXRhc2l6ZSAtIGxlbik7CisKKyAgaWYgKGNyY2ZsYWcpCisgICAgeworICAgICAgaW50IGNyYzsKKworICAgICAgY3JjID0gZG9jcmMgKHBhY2tldCArIDMsIGRhdGFzaXplKTsKKworICAgICAgcGFja2V0WzMgKyBkYXRhc2l6ZV0gPSBjcmMgPj4gODsKKyAgICAgIHBhY2tldFszICsgZGF0YXNpemUgKyAxXSA9IGNyYzsKKyAgICAgIHBrdGxlbiA9IGRhdGFzaXplICsgNTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgc3VtOworCisgICAgICBzdW0gPSAwOworICAgICAgZm9yIChpID0gMzsgaSA8IGRhdGFzaXplICsgMzsgaSsrKQorCXN1bSArPSBwYWNrZXRbaV07CisKKyAgICAgIHBhY2tldFszICsgZGF0YXNpemVdID0gc3VtOyAvKiBhZGQgdGhlIGNoZWNrc3VtICovCisgICAgICBwa3RsZW4gPSBkYXRhc2l6ZSArIDQ7CisgICAgfQorCisgIGZvciAocmV0cmllcyA9IDM7IHJldHJpZXMgPj0gMDsgcmV0cmllcy0tKQorICAgIHsKKyAgICAgIGludCBjOworCisgICAgICBTRVJJQUxfV1JJVEUgKGRlc2MsIHBhY2tldCwgcGt0bGVuKTsKKworICAgICAgYyA9IHJlYWRjaGFyIChkZXNjLCAzKTsKKyAgICAgIHN3aXRjaCAoYykKKwl7CisJY2FzZSBBQ0s6CisJICByZXR1cm47CisJY2FzZSBOQUs6CisJICBpZiAoIWhhc2htYXJrKQorCSAgICBjb250aW51ZTsKKwkgIHB1dGNoYXJfdW5maWx0ZXJlZCAoJy0nKTsKKwkgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7CisJICBjb250aW51ZTsKKwljYXNlIENBTkNFTDoKKwkgIGVycm9yICgieG1vZGVtX3NlbmRfcGFja2V0OiBUcmFuc2ZlciBhYm9ydGVkIGJ5IHJlY2VpdmVyLiIpOworCWRlZmF1bHQ6CisJICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJ4bW9kZW1fc2VuZF9wYWNrZXQ6IEdvdCB1bmV4cGVjdGVkIGNoYXJhY3RlciAlYyAoMCVvKVxuIiwgYywgYyk7CisJICBjb250aW51ZTsKKwl9CisgICAgfQorCisgIFNFUklBTF9XUklURSAoZGVzYywgIlwwMDQiLCAxKTsgLyogU2VuZCBhbiBFT1QgKi8KKworICBlcnJvciAoInhtb2RlbV9zZW5kX3BhY2tldDogIEV4Y2Vzc2l2ZSByZXRyaWVzLiIpOworfQorCisvKiBGaW5pc2ggb2ZmIHRoZSB0cmFuc2Zlci4gIFNlbmQgb3V0IHRoZSBFT1QsIGFuZCB3YWl0IGZvciBhbiBBQ0suICAqLworCit2b2lkCit4bW9kZW1fZmluaXNoX3hmZXIgKGRlc2MpCisgICAgIHNlcmlhbF90IGRlc2M7Cit7CisgIGludCByZXRyaWVzOworCisgIGZvciAocmV0cmllcyA9IDEwOyByZXRyaWVzID49IDA7IHJldHJpZXMtLSkKKyAgICB7CisgICAgICBpbnQgYzsKKworICAgICAgU0VSSUFMX1dSSVRFIChkZXNjLCAiXDAwNCIsIDEpOyAvKiBTZW5kIGFuIEVPVCAqLworCisgICAgICBjID0gcmVhZGNoYXIgKGRlc2MsIDMpOworICAgICAgc3dpdGNoIChjKQorCXsKKwljYXNlIEFDSzoKKwkgIHJldHVybjsKKwljYXNlIE5BSzoKKwkgIGNvbnRpbnVlOworCWNhc2UgQ0FOQ0VMOgorCSAgZXJyb3IgKCJ4bW9kZW1fZmluaXNoX3hmZXI6IFRyYW5zZmVyIGFib3J0ZWQgYnkgcmVjZWl2ZXIuIik7CisJZGVmYXVsdDoKKwkgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGVyciwgInhtb2RlbV9zZW5kX3BhY2tldDogR290IHVuZXhwZWN0ZWQgY2hhcmFjdGVyICVjICgwJW8pXG4iLCBjLCBjKTsKKwkgIGNvbnRpbnVlOworCX0KKyAgICB9CisKKyAgZXJyb3IgKCJ4bW9kZW1fZmluaXNoX3hmZXI6ICBFeGNlc3NpdmUgcmV0cmllcy4iKTsKK30KZGlmZiAtLWdpdCBhL2dkYi94bW9kZW0uaCBiL2dkYi94bW9kZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzAzNjEyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3htb2RlbS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIFhNT0RFTSBzdXBwb3J0IGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICBDb3B5cmlnaHQgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCitpbnQgeG1vZGVtX2luaXRfeGZlciBQQVJBTVMgKChzZXJpYWxfdCBkZXNjKSk7Cit2b2lkIHNlbmRfeG1vZGVtX3BhY2tldCBQQVJBTVMgKChzZXJpYWxfdCBkZXNjLCB1bnNpZ25lZCBjaGFyICpwYWNrZXQsIGludCBsZW4sCisJCQkJIGludCBoYXNobWFyaykpOwordm9pZCB4bW9kZW1fZmluaXNoX3hmZXIgUEFSQU1TICgoc2VyaWFsX3QgZGVzYykpOworCisjZGVmaW5lIFhNT0RFTV9EQVRBU0laRQkxMjgJLyogVGhlIGRhdGEgc2l6ZSBpcyBBTFdBWVMgMTI4ICovCisjZGVmaW5lIFhNT0RFTV8xS0RBVEFTSVpFIDEwMjQJLyogVW5sZXNzIGl0J3MgMTAyNCEhISAqLworI2RlZmluZSBYTU9ERU1fUEFDS0VUU0laRSAxMzMJLyogZGF0YSArIHBhY2tldCBoZWFkZXJzIGFuZCBjcmMgKi8KKyNkZWZpbmUgWE1PREVNXzFLUEFDS0VUU0laRSAxMDI0ICsgNSAvKiBkYXRhICsgcGFja2V0IGhlYWRlcnMgYW5kIGNyYyAqLworI2RlZmluZSBYTU9ERU1fREFUQU9GRlNFVCAzCS8qIE9mZnNldCB0byBzdGFydCBvZiBhY3R1YWwgZGF0YSAqLwpkaWZmIC0tZ2l0IGEvZ2RiL3o4ay10ZGVwLmMgYi9nZGIvejhrLXRkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjVjMWMyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3o4ay10ZGVwLmMKQEAgLTAsMCArMSw0NTMgQEAKKy8qIFRhcmdldC1tYWNoaW5lIGRlcGVuZGVudCBjb2RlIGZvciBaaWxvZyBaODAwMCwgZm9yIEdEQi4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCisgICAgICAgICAgICAgICAgc2FjQGN5Z251cy5jb20KKyAqLworCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAib2JzdGFjay5oIgorI2luY2x1ZGUgInN5bXRhYi5oIgorI2luY2x1ZGUgImdkYmNtZC5oIgorI2luY2x1ZGUgImdkYnR5cGVzLmgiCisjaW5jbHVkZSAiZGlzLWFzbS5oIgorI2luY2x1ZGUgImdkYmNvcmUuaCIKKworCisvKiBSZXR1cm4gdGhlIHNhdmVkIFBDIGZyb20gdGhpcyBmcmFtZS4KKworICAgSWYgdGhlIGZyYW1lIGhhcyBhIG1lbW9yeSBjb3B5IG9mIFNSUF9SRUdOVU0sIHVzZSB0aGF0LiAgSWYgbm90LAorICAganVzdCB1c2UgdGhlIHJlZ2lzdGVyIFNSUF9SRUdOVU0gaXRzZWxmLiAgKi8KKworQ09SRV9BRERSCitmcmFtZV9zYXZlZF9wYyAoZnJhbWUpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZTsKK3sKKyAgcmV0dXJuIHJlYWRfbWVtb3J5X3BvaW50ZXIgKGZyYW1lLT5mcmFtZSArIChCSUcgPyA0IDogMikpOworfQorCisjZGVmaW5lIElTX1BVU0hMKHgpIChCSUcgPyAoKHggJiAweGZmZjApID09IDB4OTFlMCk6KCh4ICYgMHhmZmYwKSA9PSAweDkxRjApKQorI2RlZmluZSBJU19QVVNIVyh4KSAoQklHID8gKCh4ICYgMHhmZmYwKSA9PSAweDkzZTApOigoeCAmIDB4ZmZmMCk9PTB4OTNmMCkpCisjZGVmaW5lIElTX01PVkVfRlAoeCkgKEJJRyA/IHggPT0gMHhhMWVhIDogeCA9PSAweGExZmEpCisjZGVmaW5lIElTX01PVl9TUF9GUCh4KSAoQklHID8geCA9PSAweDk0ZWEgOiB4ID09IDB4MGQ3NikKKyNkZWZpbmUgSVNfU1VCMl9TUCh4KSAoeD09MHgxYjg3KQorI2RlZmluZSBJU19NT1ZLX1I1KHgpICh4PT0weDc5MDUpCisjZGVmaW5lIElTX1NVQl9TUCh4KSAoKHggJiAweGZmZmYpID09IDB4MDIwZikKKyNkZWZpbmUgSVNfUFVTSF9GUCh4KSAoQklHID8gKHggPT0gMHg5M2VhKSA6ICh4ID09IDB4OTNmYSkpCisKKy8qIHdvcmsgb3V0IGhvdyBtdWNoIGxvY2FsIHNwYWNlIGlzIG9uIHRoZSBzdGFjayBhbmQKKyAgIHJldHVybiB0aGUgcGMgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IHB1c2ggKi8KKworc3RhdGljIENPUkVfQUREUgorc2tpcF9hZGp1c3QgKHBjLCBzaXplKQorICAgICBDT1JFX0FERFIgcGM7CisgICAgIGludCAqc2l6ZTsKK3sKKyAgKnNpemUgPSAwOworCisgIGlmIChJU19QVVNIX0ZQIChyZWFkX21lbW9yeV9zaG9ydCAocGMpKQorICAgICAgJiYgSVNfTU9WX1NQX0ZQIChyZWFkX21lbW9yeV9zaG9ydCAocGMgKyAyKSkpCisgICAgeworICAgICAgLyogVGhpcyBpcyBhIGZ1bmN0aW9uIHdpdGggYW4gZXhwbGljdCBmcmFtZSBwb2ludGVyICovCisgICAgICBwYyArPSA0OworICAgICAgKnNpemUgKz0gMjsJCS8qIHJlbWVtYmVyIHRoZSBmcmFtZSBwb2ludGVyICovCisgICAgfQorCisgIC8qIHJlbWVtYmVyIGFueSBzdGFjayBhZGp1c3RtZW50ICovCisgIGlmIChJU19TVUJfU1AgKHJlYWRfbWVtb3J5X3Nob3J0IChwYykpKQorICAgIHsKKyAgICAgICpzaXplICs9IHJlYWRfbWVtb3J5X3Nob3J0IChwYyArIDIpOworICAgICAgcGMgKz0gNDsKKyAgICB9CisgIHJldHVybiBwYzsKK30KKworc3RhdGljIENPUkVfQUREUiBleGFtaW5lX2ZyYW1lIFBBUkFNUyAoKENPUkVfQUREUiwgQ09SRV9BRERSICpyZWdzLCBDT1JFX0FERFIpKTsKK3N0YXRpYyBDT1JFX0FERFIKK2V4YW1pbmVfZnJhbWUgKHBjLCByZWdzLCBzcCkKKyAgICAgQ09SRV9BRERSIHBjOworICAgICBDT1JFX0FERFIgKnJlZ3M7CisgICAgIENPUkVfQUREUiBzcDsKK3sKKyAgaW50IHcgPSByZWFkX21lbW9yeV9zaG9ydCAocGMpOworICBpbnQgb2Zmc2V0ID0gMDsKKyAgaW50IHJlZ25vOworCisgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IE5VTV9SRUdTOyByZWdubysrKQorICAgIHJlZ3NbcmVnbm9dID0gMDsKKworICB3aGlsZSAoSVNfUFVTSFcgKHcpIHx8IElTX1BVU0hMICh3KSkKKyAgICB7CisgICAgICAvKiB3b3JrIG91dCB3aGljaCByZWdpc3RlciBpcyBiZWluZyBwdXNoZWQgdG8gd2hlcmUgKi8KKyAgICAgIGlmIChJU19QVVNITCAodykpCisJeworCSAgcmVnc1t3ICYgMHhmXSA9IG9mZnNldDsKKwkgIHJlZ3NbKHcgJiAweGYpICsgMV0gPSBvZmZzZXQgKyAyOworCSAgb2Zmc2V0ICs9IDQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHJlZ3NbdyAmIDB4Zl0gPSBvZmZzZXQ7CisJICBvZmZzZXQgKz0gMjsKKwl9CisgICAgICBwYyArPSAyOworICAgICAgdyA9IHJlYWRfbWVtb3J5X3Nob3J0IChwYyk7CisgICAgfQorCisgIGlmIChJU19NT1ZFX0ZQICh3KSkKKyAgICB7CisgICAgICAvKiBXZSBrbm93IHRoZSBmcCAqLworCisgICAgfQorICBlbHNlIGlmIChJU19TVUJfU1AgKHcpKQorICAgIHsKKyAgICAgIC8qIFN1YnRyYWN0aW5nIGEgdmFsdWUgZnJvbSB0aGUgc3AsIHNvIHdlcmUgaW4gYSBmdW5jdGlvbgorICAgICAgIHdoaWNoIG5lZWRzIHN0YWNrIHNwYWNlIGZvciBsb2NhbHMsIGJ1dCBoYXMgbm8gZnAuICBXZSBmYWtlIHVwCisgICAgICAgdGhlIHZhbHVlcyBhcyBpZiB3ZSBoYWQgYW4gZnAgKi8KKyAgICAgIHJlZ3NbRlBfUkVHTlVNXSA9IHNwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFRoaXMgb25lIGRpZG4ndCBoYXZlIGFuIGZwLCB3ZSdsbCBmYWtlIGl0IHVwICovCisgICAgICByZWdzW1NQX1JFR05VTV0gPSBzcDsKKyAgICB9CisgIC8qIHN0YWNrIHBvaW50ZXIgY29udGFpbnMgYWRkcmVzcyBvZiBuZXh0IGZyYW1lICovCisgIC8qICByZWdzW2ZwX3JlZ251bSgpXSA9IGZwOyovCisgIHJlZ3NbU1BfUkVHTlVNXSA9IHNwOworICByZXR1cm4gcGM7Cit9CisKK0NPUkVfQUREUgorejhrX3NraXBfcHJvbG9ndWUgKHN0YXJ0X3BjKQorICAgICBDT1JFX0FERFIgc3RhcnRfcGM7Cit7CisgIENPUkVfQUREUiBkdW1teVtOVU1fUkVHU107CisKKyAgcmV0dXJuIGV4YW1pbmVfZnJhbWUgKHN0YXJ0X3BjLCBkdW1teSwgMCk7Cit9CisKK0NPUkVfQUREUgorejhrX2FkZHJfYml0c19yZW1vdmUgKGFkZHIpCisgICAgIENPUkVfQUREUiBhZGRyOworeworICByZXR1cm4gKGFkZHIgJiBQVFJfTUFTSyk7Cit9CisKK2ludAorcmVhZF9tZW1vcnlfcG9pbnRlciAoeCkKKyAgICAgQ09SRV9BRERSIHg7Cit7CisgIHJldHVybiByZWFkX21lbW9yeV9pbnRlZ2VyIChBRERSX0JJVFNfUkVNT1ZFICh4KSwgQklHID8gNCA6IDIpOworfQorCitDT1JFX0FERFIKK2ZyYW1lX2NoYWluICh0aGlzZnJhbWUpCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICp0aGlzZnJhbWU7Cit7CisgIGlmICh0aGlzZnJhbWUtPnByZXYgPT0gMCkKKyAgICB7CisgICAgICAvKiBUaGlzIGlzIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBsZXQncyBnZXQgdGhlIHNwIGZvciByZWFsICovCisgICAgfQorICBpZiAoIWluc2lkZV9lbnRyeV9maWxlICh0aGlzZnJhbWUtPnBjKSkKKyAgICB7CisgICAgICByZXR1cm4gcmVhZF9tZW1vcnlfcG9pbnRlciAodGhpc2ZyYW1lLT5mcmFtZSk7CisgICAgfQorICByZXR1cm4gMDsKK30KKwordm9pZAoraW5pdF9mcmFtZV9wYyAoKQoreworICBhYm9ydCAoKTsKK30KKworLyogUHV0IGhlcmUgdGhlIGNvZGUgdG8gc3RvcmUsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywKKyAgIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4KKyAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbAorICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDoKKyAgIHRoZSBhZGRyZXNzIHdlIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4gICovCisKK3ZvaWQKK3o4a19mcmFtZV9pbml0X3NhdmVkX3JlZ3MgKGZyYW1lX2luZm8pCisgICAgIHN0cnVjdCBmcmFtZV9pbmZvICpmcmFtZV9pbmZvOworeworICBDT1JFX0FERFIgcGM7CisgIGludCB3OworCisgIGZyYW1lX3NhdmVkX3JlZ3NfemFsbG9jIChmcmFtZV9pbmZvKTsKKyAgcGMgPSBnZXRfcGNfZnVuY3Rpb25fc3RhcnQgKGZyYW1lX2luZm8tPnBjKTsKKworICAvKiB3YW5kZXIgZG93biB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtICovCisgIGV4YW1pbmVfZnJhbWUgKHBjLCBmcmFtZV9pbmZvLT5zYXZlZF9yZWdzLCBmcmFtZV9pbmZvLT5mcmFtZSk7CisKK30KKwordm9pZAorejhrX3B1c2hfZHVtbXlfZnJhbWUgKCkKK3sKKyAgYWJvcnQgKCk7Cit9CisKK2ludAorZ2RiX3ByaW50X2luc25fejhrIChtZW1hZGRyLCBpbmZvKQorICAgICBiZmRfdm1hIG1lbWFkZHI7CisgICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgIGlmIChCSUcpCisgICAgcmV0dXJuIHByaW50X2luc25fejgwMDEgKG1lbWFkZHIsIGluZm8pOworICBlbHNlCisgICAgcmV0dXJuIHByaW50X2luc25fejgwMDIgKG1lbWFkZHIsIGluZm8pOworfQorCisvKiBGZXRjaCB0aGUgaW5zdHJ1Y3Rpb24gYXQgQUREUiwgcmV0dXJuaW5nIDAgaWYgQUREUiBpcyBiZXlvbmQgTElNIG9yCisgICBpcyBub3QgdGhlIGFkZHJlc3Mgb2YgYSB2YWxpZCBpbnN0cnVjdGlvbiwgdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQKKyAgIGluc3RydWN0aW9uIGJleW9uZCBBRERSIG90aGVyd2lzZS4gICpQV09SRDEgcmVjZWl2ZXMgdGhlIGZpcnN0IHdvcmQKKyAgIG9mIHRoZSBpbnN0cnVjdGlvbi4qLworCitDT1JFX0FERFIKK05FWFRfUFJPTE9HVUVfSU5TTiAoYWRkciwgbGltLCBwd29yZDEpCisgICAgIENPUkVfQUREUiBhZGRyOworICAgICBDT1JFX0FERFIgbGltOworICAgICBzaG9ydCAqcHdvcmQxOworeworICBjaGFyIGJ1ZlsyXTsKKyAgaWYgKGFkZHIgPCBsaW0gKyA4KQorICAgIHsKKyAgICAgIHJlYWRfbWVtb3J5IChhZGRyLCBidWYsIDIpOworICAgICAgKnB3b3JkMSA9IGV4dHJhY3Rfc2lnbmVkX2ludGVnZXIgKGJ1ZiwgMik7CisKKyAgICAgIHJldHVybiBhZGRyICsgMjsKKyAgICB9CisgIHJldHVybiAwOworfQorCisjaWYgMAorLyogUHV0IGhlcmUgdGhlIGNvZGUgdG8gc3RvcmUsIGludG8gYSBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncywKKyAgIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNhdmVkIHJlZ2lzdGVycyBvZiBmcmFtZSBkZXNjcmliZWQgYnkgRlJBTUVfSU5GTy4KKyAgIFRoaXMgaW5jbHVkZXMgc3BlY2lhbCByZWdpc3RlcnMgc3VjaCBhcyBwYyBhbmQgZnAgc2F2ZWQgaW4gc3BlY2lhbAorICAgd2F5cyBpbiB0aGUgc3RhY2sgZnJhbWUuICBzcCBpcyBldmVuIG1vcmUgc3BlY2lhbDoKKyAgIHRoZSBhZGRyZXNzIHdlIHJldHVybiBmb3IgaXQgSVMgdGhlIHNwIGZvciB0aGUgbmV4dCBmcmFtZS4KKworICAgV2UgY2FjaGUgdGhlIHJlc3VsdCBvZiBkb2luZyB0aGlzIGluIHRoZSBmcmFtZV9jYWNoZV9vYnN0YWNrLCBzaW5jZQorICAgaXQgaXMgZmFpcmx5IGV4cGVuc2l2ZS4gICovCisKK3ZvaWQKK2ZyYW1lX2ZpbmRfc2F2ZWRfcmVncyAoZmlwLCBmc3JwKQorICAgICBzdHJ1Y3QgZnJhbWVfaW5mbyAqZmlwOworICAgICBzdHJ1Y3QgZnJhbWVfc2F2ZWRfcmVncyAqZnNycDsKK3sKKyAgaW50IGxvY2FsczsKKyAgQ09SRV9BRERSIHBjOworICBDT1JFX0FERFIgYWRyOworICBpbnQgaTsKKworICBtZW1zZXQgKGZzcnAsIDAsIHNpemVvZiAqZnNycCk7CisKKyAgcGMgPSBza2lwX2FkanVzdCAoZ2V0X3BjX2Z1bmN0aW9uX3N0YXJ0IChmaXAtPnBjKSwgJmxvY2Fscyk7CisKKyAgeworICAgIGFkciA9IEZSQU1FX0ZQIChmaXApIC0gbG9jYWxzOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICB7CisJaW50IHdvcmQgPSByZWFkX21lbW9yeV9zaG9ydCAocGMpOworCisJcGMgKz0gMjsKKwlpZiAoSVNfUFVTSEwgKHdvcmQpKQorCSAgeworCSAgICBmc3JwLT5yZWdzW3dvcmQgJiAweGZdID0gYWRyOworCSAgICBmc3JwLT5yZWdzWyh3b3JkICYgMHhmKSArIDFdID0gYWRyIC0gMjsKKwkgICAgYWRyIC09IDQ7CisJICB9CisJZWxzZSBpZiAoSVNfUFVTSFcgKHdvcmQpKQorCSAgeworCSAgICBmc3JwLT5yZWdzW3dvcmQgJiAweGZdID0gYWRyOworCSAgICBhZHIgLT0gMjsKKwkgIH0KKwllbHNlCisJICBicmVhazsKKyAgICAgIH0KKworICB9CisKKyAgZnNycC0+cmVnc1tQQ19SRUdOVU1dID0gZmlwLT5mcmFtZSArIDQ7CisgIGZzcnAtPnJlZ3NbRlBfUkVHTlVNXSA9IGZpcC0+ZnJhbWU7CisKK30KKyNlbmRpZgorCitpbnQKK3NhdmVkX3BjX2FmdGVyX2NhbGwgKCkKK3sKKyAgcmV0dXJuIEFERFJfQklUU19SRU1PVkUgCisgICAgKHJlYWRfbWVtb3J5X2ludGVnZXIgKHJlYWRfcmVnaXN0ZXIgKFNQX1JFR05VTSksIFBUUl9TSVpFKSk7Cit9CisKKwordm9pZAorZXh0cmFjdF9yZXR1cm5fdmFsdWUgKHR5cGUsIHJlZ2J1ZiwgdmFsYnVmKQorICAgICBzdHJ1Y3QgdHlwZSAqdHlwZTsKKyAgICAgY2hhciAqcmVnYnVmOworICAgICBjaGFyICp2YWxidWY7Cit7CisgIGludCBiOworICBpbnQgbGVuID0gVFlQRV9MRU5HVEggKHR5cGUpOworCisgIGZvciAoYiA9IDA7IGIgPCBsZW47IGIgKz0gMikKKyAgICB7CisgICAgICBpbnQgdG9kbyA9IGxlbiAtIGI7CisKKyAgICAgIGlmICh0b2RvID4gMikKKwl0b2RvID0gMjsKKyAgICAgIG1lbWNweSAodmFsYnVmICsgYiwgcmVnYnVmICsgYiwgdG9kbyk7CisgICAgfQorfQorCit2b2lkCit3cml0ZV9yZXR1cm5fdmFsdWUgKHR5cGUsIHZhbGJ1ZikKKyAgICAgc3RydWN0IHR5cGUgKnR5cGU7CisgICAgIGNoYXIgKnZhbGJ1ZjsKK3sKKyAgaW50IHJlZzsKKyAgaW50IGxlbjsKKworICBmb3IgKGxlbiA9IDA7IGxlbiA8IFRZUEVfTEVOR1RIICh0eXBlKTsgbGVuICs9IDIpCisgICAgd3JpdGVfcmVnaXN0ZXJfYnl0ZXMgKFJFR0lTVEVSX0JZVEUgKGxlbiAvIDIgICsgMiksIHZhbGJ1ZiArIGxlbiwgMik7Cit9CisKK3ZvaWQKK3N0b3JlX3N0cnVjdF9yZXR1cm4gKGFkZHIsIHNwKQorICAgICBDT1JFX0FERFIgYWRkcjsKKyAgICAgQ09SRV9BRERSIHNwOworeworICB3cml0ZV9yZWdpc3RlciAoMiwgYWRkcik7Cit9CisKKwordm9pZAorcHJpbnRfcmVnaXN0ZXJfaG9vayAocmVnbm8pCisgICAgIGludCByZWdubzsKK3sKKyAgaWYgKChyZWdubyAmIDEpID09IDAgJiYgcmVnbm8gPCAxNikKKyAgICB7CisgICAgICB1bnNpZ25lZCBzaG9ydCBsWzJdOworCisgICAgICByZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyAocmVnbm8sIChjaGFyICopIChsICsgMCkpOworICAgICAgcmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMgKHJlZ25vICsgMSwgKGNoYXIgKikgKGwgKyAxKSk7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIlx0Iik7CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIiUwNHglMDR4IiwgbFswXSwgbFsxXSk7CisgICAgfQorCisgIGlmICgocmVnbm8gJiAzKSA9PSAwICYmIHJlZ25vIDwgMTYpCisgICAgeworICAgICAgdW5zaWduZWQgc2hvcnQgbFs0XTsKKworICAgICAgcmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMgKHJlZ25vLCAoY2hhciAqKSAobCArIDApKTsKKyAgICAgIHJlYWRfcmVsYXRpdmVfcmVnaXN0ZXJfcmF3X2J5dGVzIChyZWdubyArIDEsIChjaGFyICopIChsICsgMSkpOworICAgICAgcmVhZF9yZWxhdGl2ZV9yZWdpc3Rlcl9yYXdfYnl0ZXMgKHJlZ25vICsgMiwgKGNoYXIgKikgKGwgKyAyKSk7CisgICAgICByZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyAocmVnbm8gKyAzLCAoY2hhciAqKSAobCArIDMpKTsKKworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcdCIpOworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCIlMDR4JTA0eCUwNHglMDR4IiwgbFswXSwgbFsxXSwgbFsyXSwgbFszXSk7CisgICAgfQorICBpZiAocmVnbm8gPT0gMTUpCisgICAgeworICAgICAgdW5zaWduZWQgc2hvcnQgcnZhbDsKKyAgICAgIGludCBpOworCisgICAgICByZWFkX3JlbGF0aXZlX3JlZ2lzdGVyX3Jhd19ieXRlcyAocmVnbm8sIChjaGFyICopICgmcnZhbCkpOworCisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIlxuIik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkgKz0gMikKKwl7CisJICBwcmludGZfdW5maWx0ZXJlZCAoIihzcCslZD0lMDR4KSIsIGksIHJlYWRfbWVtb3J5X3Nob3J0IChydmFsICsgaSkpOworCX0KKyAgICB9CisKK30KKwordm9pZAorejhrX3BvcF9mcmFtZSAoKQoreworfQorCitzdHJ1Y3QgY21kX2xpc3RfZWxlbWVudCAqc2V0bWVtb3J5bGlzdDsKKwordm9pZAorejhrX3NldF9wb2ludGVyX3NpemUgKG5ld3NpemUpCisgICAgIGludCBuZXdzaXplOworeworICBzdGF0aWMgaW50IG9sZHNpemUgPSAwOworCisgIGlmIChvbGRzaXplICE9IG5ld3NpemUpCisgICAgeworICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJwb2ludGVyIHNpemUgc2V0IHRvICVkIGJpdHNcbiIsIG5ld3NpemUpOworICAgICAgb2xkc2l6ZSA9IG5ld3NpemU7CisgICAgICBpZiAobmV3c2l6ZSA9PSAzMikKKwl7CisJICBCSUcgPSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBCSUcgPSAwOworCX0KKyAgICAgIF9pbml0aWFsaXplX2dkYnR5cGVzICgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3NlZ21lbnRlZF9jb21tYW5kIChhcmdzLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqYXJnczsKKyAgICAgaW50IGZyb21fdHR5OworeworICB6OGtfc2V0X3BvaW50ZXJfc2l6ZSAoMzIpOworfQorCitzdGF0aWMgdm9pZAordW5zZWdtZW50ZWRfY29tbWFuZCAoYXJncywgZnJvbV90dHkpCisgICAgIGNoYXIgKmFyZ3M7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgejhrX3NldF9wb2ludGVyX3NpemUgKDE2KTsKK30KKworc3RhdGljIHZvaWQKK3NldF9tZW1vcnkgKGFyZ3MsIGZyb21fdHR5KQorICAgICBjaGFyICphcmdzOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgIHByaW50Zl91bmZpbHRlcmVkICgiXCJzZXQgbWVtb3J5XCIgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiBhIG1lbW9yeSBzdWJjb21tYW5kLlxuIik7CisgIGhlbHBfbGlzdCAoc2V0bWVtb3J5bGlzdCwgInNldCBtZW1vcnkgIiwgLTEsIGdkYl9zdGRvdXQpOworfQorCit2b2lkCitfaW5pdGlhbGl6ZV96OGt0ZGVwICgpCit7CisgIHRtX3ByaW50X2luc24gPSBnZGJfcHJpbnRfaW5zbl96OGs7CisKKyAgYWRkX3ByZWZpeF9jbWQgKCJtZW1vcnkiLCBub19jbGFzcywgc2V0X21lbW9yeSwKKwkJICAic2V0IHRoZSBtZW1vcnkgbW9kZWwiLCAmc2V0bWVtb3J5bGlzdCwgInNldCBtZW1vcnkgIiwgMCwKKwkJICAmc2V0bGlzdCk7CisgIGFkZF9jbWQgKCJzZWdtZW50ZWQiLCBjbGFzc19zdXBwb3J0LCBzZWdtZW50ZWRfY29tbWFuZCwKKwkgICAiU2V0IHNlZ21lbnRlZCBtZW1vcnkgbW9kZWwuIiwgJnNldG1lbW9yeWxpc3QpOworICBhZGRfY21kICgidW5zZWdtZW50ZWQiLCBjbGFzc19zdXBwb3J0LCB1bnNlZ21lbnRlZF9jb21tYW5kLAorCSAgICJTZXQgdW5zZWdtZW50ZWQgbWVtb3J5IG1vZGVsLiIsICZzZXRtZW1vcnlsaXN0KTsKKworfQpkaWZmIC0tZ2l0IGEvbW1hbGxvYy9DT1BZSU5HLkxJQiBiL21tYWxsb2MvQ09QWUlORy5MSUIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2ODVhNQotLS0gL2Rldi9udWxsCisrKyBiL21tYWxsb2MvQ09QWUlORy5MSUIKQEAgLTAsMCArMSw0ODEgQEAKKwkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICAgICAgICAgICAgICAgICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCitbVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBHUEwuICBJdCBpcworIG51bWJlcmVkIDIgYmVjYXVzZSBpdCBnb2VzIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBvcmRpbmFyeSBHUEwuXQorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQorZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgorCisgIFRoaXMgbGljZW5zZSwgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCitzcGVjaWFsbHkgZGVzaWduYXRlZCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUsIGFuZCB0byBhbnkKK290aGVyIGxpYnJhcmllcyB3aG9zZSBhdXRob3JzIGRlY2lkZSB0byB1c2UgaXQuICBZb3UgY2FuIHVzZSBpdCBmb3IKK3lvdXIgbGlicmFyaWVzLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYKK3lvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcworb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoreW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQorY29kZS4gIElmIHlvdSBsaW5rIGEgcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCitjb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQord2l0aCB0aGUgbGlicmFyeSwgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCitpdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KKworICBPdXIgbWV0aG9kIG9mIHByb3RlY3RpbmcgeW91ciByaWdodHMgaGFzIHR3byBzdGVwczogKDEpIGNvcHlyaWdodAordGhlIGxpYnJhcnksIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwKK3Blcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgorCisgIEFsc28sIGZvciBlYWNoIGRpc3RyaWJ1dG9yJ3MgcHJvdGVjdGlvbiwgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitsaWJyYXJ5LiAgSWYgdGhlIGxpYnJhcnkgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsCit2ZXJzaW9uLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uCit0aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCisMCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgY29tcGFuaWVzIGRpc3RyaWJ1dGluZyBmcmVlCitzb2Z0d2FyZSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCB0aHVzIGluIGVmZmVjdAordHJhbnNmb3JtaW5nIHRoZSBwcm9ncmFtIGludG8gcHJvcHJpZXRhcnkgc29mdHdhcmUuICBUbyBwcmV2ZW50IHRoaXMsCit3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MKK2ZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aGljaCB3YXMgZGVzaWduZWQgZm9yIHV0aWxpdHkgcHJvZ3JhbXMuICBUaGlzCitsaWNlbnNlLCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluCitkZXNpZ25hdGVkIGxpYnJhcmllcy4gIFRoaXMgbGljZW5zZSBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkKK29uZTsgYmUgc3VyZSB0byByZWFkIGl0IGluIGZ1bGwsIGFuZCBkb24ndCBhc3N1bWUgdGhhdCBhbnl0aGluZyBpbiBpdCBpcwordGhlIHNhbWUgYXMgaW4gdGhlIG9yZGluYXJ5IGxpY2Vuc2UuCisKKyAgVGhlIHJlYXNvbiB3ZSBoYXZlIGEgc2VwYXJhdGUgcHVibGljIGxpY2Vuc2UgZm9yIHNvbWUgbGlicmFyaWVzIGlzIHRoYXQKK3RoZXkgYmx1ciB0aGUgZGlzdGluY3Rpb24gd2UgdXN1YWxseSBtYWtlIGJldHdlZW4gbW9kaWZ5aW5nIG9yIGFkZGluZyB0byBhCitwcm9ncmFtIGFuZCBzaW1wbHkgdXNpbmcgaXQuICBMaW5raW5nIGEgcHJvZ3JhbSB3aXRoIGEgbGlicmFyeSwgd2l0aG91dAorY2hhbmdpbmcgdGhlIGxpYnJhcnksIGlzIGluIHNvbWUgc2Vuc2Ugc2ltcGx5IHVzaW5nIHRoZSBsaWJyYXJ5LCBhbmQgaXMKK2FuYWxvZ291cyB0byBydW5uaW5nIGEgdXRpbGl0eSBwcm9ncmFtIG9yIGFwcGxpY2F0aW9uIHByb2dyYW0uICBIb3dldmVyLCBpbgorYSB0ZXh0dWFsIGFuZCBsZWdhbCBzZW5zZSwgdGhlIGxpbmtlZCBleGVjdXRhYmxlIGlzIGEgY29tYmluZWQgd29yaywgYQorZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeSwgYW5kIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCit0cmVhdHMgaXQgYXMgc3VjaC4KKworICBCZWNhdXNlIG9mIHRoaXMgYmx1cnJlZCBkaXN0aW5jdGlvbiwgdXNpbmcgdGhlIG9yZGluYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGZvciBsaWJyYXJpZXMgZGlkIG5vdCBlZmZlY3RpdmVseSBwcm9tb3RlIHNvZnR3YXJlCitzaGFyaW5nLCBiZWNhdXNlIG1vc3QgZGV2ZWxvcGVycyBkaWQgbm90IHVzZSB0aGUgbGlicmFyaWVzLiAgV2UKK2NvbmNsdWRlZCB0aGF0IHdlYWtlciBjb25kaXRpb25zIG1pZ2h0IHByb21vdGUgc2hhcmluZyBiZXR0ZXIuCisKKyAgSG93ZXZlciwgdW5yZXN0cmljdGVkIGxpbmtpbmcgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgd291bGQgZGVwcml2ZSB0aGUKK3VzZXJzIG9mIHRob3NlIHByb2dyYW1zIG9mIGFsbCBiZW5lZml0IGZyb20gdGhlIGZyZWUgc3RhdHVzIG9mIHRoZQorbGlicmFyaWVzIHRoZW1zZWx2ZXMuICBUaGlzIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0bworcGVybWl0IGRldmVsb3BlcnMgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgdG8gdXNlIGZyZWUgbGlicmFyaWVzLCB3aGlsZQorcHJlc2VydmluZyB5b3VyIGZyZWVkb20gYXMgYSB1c2VyIG9mIHN1Y2ggcHJvZ3JhbXMgdG8gY2hhbmdlIHRoZSBmcmVlCitsaWJyYXJpZXMgdGhhdCBhcmUgaW5jb3Jwb3JhdGVkIGluIHRoZW0uICAoV2UgaGF2ZSBub3Qgc2VlbiBob3cgdG8gYWNoaWV2ZQordGhpcyBhcyByZWdhcmRzIGNoYW5nZXMgaW4gaGVhZGVyIGZpbGVzLCBidXQgd2UgaGF2ZSBhY2hpZXZlZCBpdCBhcyByZWdhcmRzCitjaGFuZ2VzIGluIHRoZSBhY3R1YWwgZnVuY3Rpb25zIG9mIHRoZSBMaWJyYXJ5LikgIFRoZSBob3BlIGlzIHRoYXQgdGhpcword2lsbCBsZWFkIHRvIGZhc3RlciBkZXZlbG9wbWVudCBvZiBmcmVlIGxpYnJhcmllcy4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCisid29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQorZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGlsZSB0aGUgbGF0dGVyIG9ubHkKK3dvcmtzIHRvZ2V0aGVyIHdpdGggdGhlIGxpYnJhcnkuCisKKyAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIGxpYnJhcnkgdG8gYmUgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgcmF0aGVyIHRoYW4gYnkgdGhpcyBzcGVjaWFsIG9uZS4KKwwKKwkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgd2hpY2gKK2NvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvciBvdGhlciBhdXRob3JpemVkCitwYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpYnJhcnkKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4gIEVhY2ggbGljZW5zZWUgaXMKK2FkZHJlc3NlZCBhcyAieW91Ii4KKworICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCitwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKKyh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCisKKyAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKK3doaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCitjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQorcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAorc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcworaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKKworICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucworYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKK2ludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgorYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQorc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgord3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcworYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCisgIAorICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKK2NvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Cit5b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgorYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKK2FsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Cit3YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQorTGlicmFyeS4KKworICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAorYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQorZmVlLgorDAorICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCisgICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKKyAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCisgICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQorICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAorICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgorICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCisgICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgorCisgICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKKyAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCisgICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKKyAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAorICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCisgICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKKworVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQoraXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKK3dpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KK3RoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KK3RoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKK2luc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKK3RoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KK3RoZXNlIG5vdGljZXMuCisMCisgIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKK3RoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCitzdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgorCisgIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgordGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgorCisgIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCitkZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQordW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55CitpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCittdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKworICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKK3NvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bworZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQorTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgorbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKK3dvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKK3RoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQorY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Citjb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQorbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCitTZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KKworICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQordGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCitkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KK1doZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCitsaW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQordGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KKworICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQorc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCitmdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0CitmaWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCit3b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQorTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKKworICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQorZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCitBbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKK3doZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KKwwKKyAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbXBpbGUgb3IKK2xpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCit3b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawordW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAorbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCitlbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KKworICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKK0xpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQordGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yaworZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKK2NvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKK2RpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKK29mIHRoZXNlIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCisgICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCisgICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKKyAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAorICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAorICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCisgICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKKyAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAorICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQorICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCisgICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCisKKyAgICBiKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAorICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscworICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKKyAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCisKKyAgICBjKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQorICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KKworICAgIGQpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQorICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgorCisgIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQorTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKK3JlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAordGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseQorZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCitjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCit3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCit0aGUgZXhlY3V0YWJsZS4KKworICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQorcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQorYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAordXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQorZGlzdHJpYnV0ZS4KKwwKKyAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKK2ZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKK2xpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgordGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCitwZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKKyAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5CisgICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgICAgU2VjdGlvbnMgYWJvdmUuCisKKyAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAorICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCisgICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgorCisgIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCit0aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQorYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKK3JpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKK29yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKK3Rlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQorc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKwwKKyAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55CitwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCithbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKK2FuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAorc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCitleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgord3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Cit2ZXJzaW9ucyBvZiB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgorU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAorYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5CitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKKyJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKK2xpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorDAorICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCit3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcworY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKK2RlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKK29mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCithbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KK1dBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCitFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgorT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKK0tJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKK0xJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCitUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KK1dSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCitBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQorRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKK0xJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKK1JFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCitTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICitEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisgICAgIEFwcGVuZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0CitldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKK3JlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCisKKyAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcworc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQorImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKKyAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKZGlmZiAtLWdpdCBhL21tYWxsb2MvQ2hhbmdlTG9nIGIvbW1hbGxvYy9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjYTE1YQotLS0gL2Rldi9udWxsCisrKyBiL21tYWxsb2MvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNDI3IEBACisxOTk5LTAxLTA0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogUmVxdWlyZXMgYXV0b2NvbmYgMi4xMi4xIG9yIGhpZ2hlci4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKKzE5OTgtMDctMjQgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCSogbWNhbGxvYy5jOiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IGJlZm9yZSA8c3RyaW5nLmg+LiAgSFAvVVggMTEuMAorCW5lZWRzIHRoaXMuCisKK1RodSBBcHIgMjMgMTI6MTk6MjIgMTk5OCAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+CisKKyAgICAgICAgKiBtbWFsbG9jLmg6IEluY2x1ZGUgc3lzL3R5cGVzLmggYW5kIHN0ZGlvLmggI2lmbmRlZiBIQVZFX1NURERFRl9ILgorICAgICAgICAqIG1tcHJpdmF0ZS5oOiBEbyBub3QgaGFuZGxlIEhBVkVfU1REREVGX0ggaGVyZSwgc2luY2Ugd2UgaW5jbHVkZQorICAgICAgICBtbWFsbG9jLmguCisKK1R1ZSBNYXIgMjQgMTc6MDc6MDIgMTk5OCAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmh1bmEuY3lnbnVzLmNvLnVrPgorCisJKiBNYWtlZmlsZS5pbjogIEdldCBTSEVMTCBmcm9tIGNvbmZpZ3VyZS4KKwkqIGNvbmZpZ3VyZTogIFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjEyLjEgdG8gZml4IHNoZWxsIGlzc3VlcyBmb3IKKwlOVCBuYXRpdmUgYnVpbGRzLgorCitNb24gRmViICA3IDEzOjA2OjQ1IDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AbWFjcWVsLmJlPgorCisgICAgICAgICogbW1hbGxvYy9kZXRhY2guYzogRG8gbm90IGluY2x1ZGUgZmNudGwuaC4KKworVGh1IEF1ZyAyOCAxMzoxNTowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIG1yZWFsbG9jLmMgKHJlYWxsb2MpOiBTdG9yZSByZXN1bHQgaW4gbG9jYWwgdmFyaWFibGUgYmVmb3JlCisgCXJldHVybmluZyBpdC4gIE1ha2VzIGRlYnVnZ2luZyBtdWNoIGVhc2llciBhdCBuZWdsaWdpYmxlIGNvc3QuCisKK1R1ZSBGZWIgIDQgMTY6MzA6NTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBtdmFsbG9jLmMgKGNhY2hlX3BhZ2VzaXplKTogUmVuYW1lIGZyb20gcGFnZXNpemUsIHNvIHRoYXQgaWYgd2UKKwlhcmUgYnVpbGRpbmcgbW0ubywgaXQgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCB0aGUgdmFyaWFibGUgb2YgdGhlCisJc2FtZSBuYW1lIGluIG1tYXAtc3VwLmMuCisKK1NhdCBEZWMgMjggMTI6NDg6MzIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChtbS5vKTogTmV3IHRhcmdldCB0aGF0IGNvbWJpbmVzIGFsbCB0aGUgZnVuY3Rpb25zCisJaW50byBhIHNpbmdsZSBvYmplY3QgbW9kdWxlLiAgVGhpcyBhdm9pZHMgY2xpZW50IHByb2dyYW1zIHBpY2tpbmcKKyAJdXAgcGFydCBvZiB0aGUgYWxsb2NhdGlvbiByb3V0aW5lcyBmcm9tIG1tYWxsb2MgYW5kIHBhcnQgZnJvbSBsaWJjLAorIAl3aGljaCBjYW4gbGVhZCB0byB1bmRlZmluZWQgYmVoYXZpb3IuCisJKENGSUxFUyk6IEFkZCBtbS5jCisJKFRBUkdFVE9CSlMpOiBEZWZpbmUgdG8gYmUgZWl0aGVyIHRoZSBpbmRpdmlkdWFsIG9iamVjdHMgb3IgdGhlCisJc2luZ2xlIGNvbWJpbmVkIG9iamVjdC4KKwkoVEFSR0VUTElCKTogQ3JlYXRlIHRoZSBhcmNoaXZlIHVzaW5nIFRBUkdFVE9CSlMuCisJKiBtbS5jOiBOZXcgZmlsZSB0aGF0IHNpbXBseSAjaW5jbHVkZXMgdGhlIG90aGVyIHNvdXJjZSBDIGZpbGVzLgorCQorVGh1IE9jdCAgMyAxNTo0NToyMyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQorCisJKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IERlcGVuZCBvbiBkaXN0Y2xlYW4sIHJlbW92ZQorCWR1cGxpY2F0aW9uLgorCitUdWUgU2VwIDEwIDE3OjUyOjA2IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBtbWNoZWNrLmMgKGNoZWNraGRyKTogQWRkIHByb3RvdHlwZS4KKwkobWZyZWVfY2hlY2spOiBEaXR0by4KKwkobW1hbGxvY19jaGVjayk6IERpdHRvLgorCShtcmVhbGxvY19jaGVjayk6IERpdHRvLgorCSogbW10cmFjZS5jICh0cl9icmVhayk6IERpdHRvLgorCSh0cl9mcmVlaG9vayk6IERpdHRvLgorCSh0cl9tYWxsb2Nob29rKTogRGl0dG8uCisJKHRyX3JlYWxsb2Nob29rKTogRGl0dG8uCisJKiBzYnJrLXN1cC5jIChzYnJrX21vcmVjb3JlKTogRGl0dG8uCisKK1dlZCBTZXAgIDQgMTg6MDI6NDUgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlIGNvbmZpZ3VyZS5pbjogIERvbid0IGRlZmF1bHQgQ0MgdG8gY2MuICBJdCBjYXVzZXMgcHJvYmxlbXMKKwl3aGVuIHN0YXJ0aW5nIGEgY29tcGlsZSBpbiB0aGUgbW1hbGxvYyBkaXJlY3RvcnkuCisKK1dlZCBKdWwgMjQgMDA6NTM6MzQgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIG1tYWxsb2MuaCAobW1hbGxvY19maW5kYmFzZSk6IEFkZCBwcm90b3R5cGUuCisKK0ZyaSBKdWwgMTIgMTg6MzU6MzQgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIG1tYXAtc3VwLmMgKG1tYWxsb2NfZmluZGJhc2UpOiBDaGFuZ2UgdG8gbm90IHJlcXVpcmUgL2Rldi96ZXJvCisJaWYgTU1BUF9BTk9OWU1PVVMgaXMgYXZhaWxhYmxlLgorCitXZWQgSnVsIDEwIDIzOjUzOjQyIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBkZXRhY2guYyAobW1hbGxvY19kZXRhY2gpOiBGaXggYnVnIGluIGNvbXB1dGF0aW9uIG9mIG5lZ2F0aXZlCisJYnJrIHZhbHVlLgorCSogbW1jaGVjay5jIChtbWNoZWNrZik6IFJlbmFtZWQgZnJvbSBtbWNoZWNrIGFuZCBuZXcgRk9SQ0UgYXJndW1lbnQKKwlhZGRlZC4gIFJlcGxhY2VkIGhhY2sgdGhhdCBhbHdheXMgYWxsb3dlZCBjaGVja2luZyByb3V0aW5lcyB0byBiZQorIAlpbnN0YWxsZWQgYW5kIGVuZm9yY2UgcmVzdHJpY3Rpb24gdGhhdCB0aGV5IGhhdmUgdG8gYmUgaW5zdGFsbGVkCisJcHJpb3IgdG8gYWxsb2NhdGluZyBhbnkgbWVtb3J5IG9uIHRoZSB1c2VkIGhlYXAgb3IgdGhlIEZPUkNFIGFyZ3VtZW50CisJaGFzIHRvIGJlIG5vbi1OVUxMLgorCShtbWNoZWNrKTogTmV3IGZ1bmN0aW9uIHRoYXQgY2FsbHMgbW1jaGVja2Ygd2l0aCBGT1JDRSBzZXQgdG8gemVybywKKwlmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisJKiBtbWFsbG9jLmMgKG1hbGxvYyk6IFN0b3JlIHJlc3VsdCBpbiBsb2NhbCB2YXJpYWJsZSBiZWZvcmUKKwlyZXR1cm5pbmcgaXQuICBNYWtlcyBkZWJ1Z2dpbmcgbXVjaCBlYXNpZXIgYXQgbmVnbGlnaWJsZSBjb3N0LgorCSogbW1hbGxvYy5oIChtbWNoZWNrZik6IERlY2xhcmUuCisJKiBhdHRhY2guYyAocmV1c2UpOiBDYWxsIG1tY2hlY2tmIHJhdGhlciB0aGFuIG1tY2hlY2suCisJKiBtbWFwLXN1cC5jIChfX21tYWxsb2NfbW1hcF9tb3JlY29yZSk6IEltcHJvdmUgdG8gYWxsb3cgbW1hcAorCXRvIHNlbGVjdCBhIGJhc2UgbWFwcGluZyBhZGRyZXNzIGlmIG5vbmUgaXMgb3RoZXJ3aXNlIGdpdmVuLgorCShtbWFsbG9jX2ZpbmRiYXNlKTogTmV3IGZ1bmN0aW9uIHRoYXQgdXNlciBjYW4gY2FsbCB0byBmaW5kCisJYW4gYXZhaWxhYmxlIG1hcHBpbmcgYWRkcmVzcyBvZiBhIGdpdmVuIHNpemUuCisJCitUdWUgSnVuIDI1IDIyOjU0OjA2IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKwkqIE1ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyKToKKwlVc2UgYXV0b2NvbmYtc2V0IHZhbHVlcy4KKwkoZG9jZGlyKTogUmVtb3ZlZC4KKwkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworVHVlIE1heSAyOCAxMzo1MToyMiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCUZyb206IFRob21hcyBBIFBldGVyc29uIDx0YXBAc3JjLmhvbmV5d2VsbC5jb20+CisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogQXBwbHkgcGF0Y2ggdG8gaW5zdGFsbAorCW1tYWxsb2MuaW5mbyBmcm9tIHNyY2RpciBpZiBub3QgZm91bmQgaW4gYnVpbGQgZGlyLgorCitTdW4gQXByICA3IDIwOjU1OjMwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBydGwuY3lnbnVzLmNvbT4KKworCUZyb206IE1pbGVzIEJhZGVyICA8bWlsZXNAZ251LmFpLm1pdC5lZHU+CisJKiBjb25maWd1cmUuaW46IFVzZSBBQ19DSEVDS19UT09MIHRvIGZpbmQgQVIgJiBSQU5MSUIuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZi4KKwkqIE1ha2VmaWxlLmluOiBVc2UgQVIgc2V0IGJ5IGNvbmZpZ3VyZSBzdWJzdGl0dXRpb24uCisJCitGcmkgTWFyIDI5IDA5OjU3OjM2IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBtbWFsbG9jLmggKG1tdHJhY2UpOiBBZGQgcHJvdG90eXBlLgorCitTYXQgRmViICAzIDEyOjQxOjAwIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJRnJvbSBILkouIEx1IChoamxAZ251LmFpLm1pdC5lZHUpOgorCSogbXZhbGxvYy5jICh2YWxsb2MpOiBuZXcuCisJKiBtbWVtYWxpZ24uYzogQWxsb2NhdGUgKFNJWkUgKyBBTElHTk1FTlQgLSAxKSBhbmQgdGhlbiB0cmltCisJaWYgcG9zc2libGUuCisJKG1lbWFsaWduKTogZG9uJ3QgcHV0IHRoZSBub2RlIG9uIHRoZSBfYWxpZ25lZF9ibG9ja3MgbGlzdCBtb3JlCisgCXRoYW4gb25jZS4KKworTW9uIE5vdiAyMCAxMjowNDozMiAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKE9GSUxFUyk6IE1ha2Ugb2JqZWN0cyBkZXBlbmQgdXBvbiBNYWtlZmlsZSwKKwlzaW5jZSBNYWtlZmlsZSBzZXRzIERFRlMgd2hpY2ggY2FuIGRlZmluaXRlbHkgYWZmZWN0IGhvdworCW9iamVjdHMgYXJlIHRvIGJlIGNvbXBpbGVkLgorCitNb24gTm92ICA2IDE0OjEyOjEzIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKEFDX0NIRUNLX0hFQURFUlMpOiBhZGQgbGltaXRzLmguCisJKEFDX0hFQURFUl9TVERDKTogcmVtb3ZlLgorCisJKiBtbWFsbG9jLmg6IGRvY3VtZW50IG5lY2Vzc2l0eSBvZiBkZWZpbmluZyBzaXplX3QgYmVmb3JlCisJaW5jbHVkaW5nIG1tYWxsb2MuaC4KKworCSogbW1wcml2YXRlLmg6IGFkZCBjaGVjayBmb3IgbGltaXRzLmgsIHJlbW92ZSBkZWZpbml0aW9uIG9mCisJTlVMTCBhbmQgc2l6ZV90LgorCitTdW4gTm92ICA1IDAwOjI3OjM2IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IEFDX0NIRUNLX0hFQURFUlMsIG5vdCBBQ19DSEVDS19IRUFERVIuCisKK1N1biBOb3YgIDUgMDA6MTQ6MTMgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogYWRkIGNoZWNrIGZvciBzdGRkZWYuaAorCSogbW1hbGxvYy5oOiBpbmNsdWRlIHN0ZGRlZi5oIGlmIEhBVkVfU1REREVGX0ggaXMgZGVmaW5lZC4KKworU2F0IE5vdiAgNCAxOToxMDoxMyAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBhZGQgQUNfSEVBREVSX1NUREMgY2hlY2suCisKKwkqIG1tYWxsb2MuaDogY2hlY2sgaWYgU1REQ19IRUFERVJTIGluc3RlYWQgb2YgX19TVERDX18uCisKKwkqIG1tcHJpdmF0ZS5oOiBjaGVjayBpZiBTVERDX0hFQURFUlMgaW5zdGVhZCBvZiBfX1NURENfXy4KKworVHVlIE9jdCAyNCAxMzoxNzo0NCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIG1tcHJpdmF0ZS5oOiBSZW1vdmUgZGVjbGFyYXRpb25zIChQVFIsIGV0YykgdGhhdCBhcmUgYWxyZWFkeQorCXByb3ZpZGVkIGJ5IGFuc2lkZWNsLmgsIGluY2x1ZGUgbW1hbGxvYy5oIGVhcmxpZXIgaW4gZmlsZS4KKworVHVlIE9jdCAxMCAxMTowNDo0NyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEJJU09OKTogIFJlbW92ZSBtYWNyby4KKworV2VkIFNlcCAyMCAxMjo1MToxMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldCwgc3lub255bSBmb3IKKwlyZWFsY2xlYW4uICBBZGQgR05VIHN0YW5kYXJkIG1haW50YWluZXItY2xlYW4gZWNob3MuCisKK1RodSBBdWcgIDMgMTA6NDU6MzcgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIFVwZGF0ZSBhbGwgRlNGIGFkZHJlc3NlcyBleGNlcHQgdGhvc2UgaW4gQ09QWUlORyogZmlsZXMKKwlhbmQgc2hhciBhcmNoaXZlIG9mIG9yaWdpbmFsIEZTRiBmaWxlcy4KKworTW9uIEp1biAxMiAxMjoxMTo1NyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4sIHJlYWxjbGVhbik6IFJlbW92ZSBjb25maWcuY2FjaGUgYW5kCisJICBjb25maWcubG9nLgorCitXZWQgTWF5IDE3IDE3OjQ3OjQ0IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogQWRkZWQgY29uZmlnLnN0YXR1cyB0byBkZXBlbmRlbmN5IGxpc3QuCisJICAoY29uZmlnLnN0YXR1cyk6IE5ldyB0YXJnZXQuCisKK0ZyaSBNYXkgIDUgMTU6MTc6NTMgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBtbWFwLXN1cC5jOiBSZW1vdmVkIG11bm1hcCBwcm90b3R5cGUuICBTb21lIHN5c3RlbXMgaGF2ZSBhCisJICBzbGlnaHRseSBkaWZmZXJlbnQgcHJvdG90eXBlLgorCitXZWQgTWF5ICAzIDE3OjE4OjEzIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQ29udmVydGVkIHRvIHVzZSBhdXRvY29uZi4KKwkqIGNvbmZpZ3VyZTogTmV3IGZpbGUsIGdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuMy4KKwkqIGNvbmZpZy97bWgtZ28zMiwgbWgtaXJpeCwgbWgtbmNyMzAwMCwgbWgtc3Vub3M0LCAKKwkgIG1oLXN5c3Y0fTogUmVtb3ZlZC4KKworVGh1IE5vdiAgMyAyMzo1NToyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBOYW1lIGRlc3RpbmF0aW9uIGZpbGUgY29ycmVjdGx5LAorCXJhdGhlciB0aGFuIHVzaW5nIHVuZGVmaW5lZCBzaGVsbCB2YXJpYWJsZS4KKworRnJpIE9jdCAyOCAxNjo0Njo1OCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCisKKwkqIG1tcHJpdmF0ZS5oOiBOZXcgZmlsZSwgd2FzIG1tYWxsb2MuaC4KKwkobW1hbGxvYy5oKTogSW5jbHVkZS4KKwkqIG1tYWxsb2MuaDogUmVtb3ZlIGFsbCBidXQgZGVjbGFyYXRpb25zIG9mIG1tYWxsb2MgZnVuY3Rpb25zLgorCShhbnNpZGVjbC5oKTogSW5jbHVkZS4KKwkqIGF0dGFjaC5jLCBldCBhbDogSW5jbHVkZSBtbXByaXZhdGUuaCBpbnN0ZWFkIG9mIG1tYWxsb2MuaC4KKworV2VkIEF1ZyAyNCAxMjo1NTozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGlbMzRdODYgdG8gaVszNDVdODYuCisKK01vbiBBdWcgMjIgMTE6MzY6NDAgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogU2VwYXJhdGUgZnJvbSByZWFsY2xlYW4uCisJKHJlYWxjbGVhbik6IFJlbW92ZSBtbWFsbG9jLmluZm8uCisKK0ZyaSBNYXkgIDYgMTM6MDQ6MjUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKKworICAgICAgICAqIGNvbmZpZy9nbzMyLm1oOiBOZXcgZmlsZQorCSogY29uZmlndXJlLmluIChob3N0PT1nbzMyKTogIFVzZSBuZXcgZnJhZ21lbnQuCisKK1R1ZSBGZWIgIDggMDA6MzI6MjggMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBtbXRyYWNlLmMgKHRyX2ZyZWVob29rLCB0cl9tYWxsb2Nob29rLCB0cl9yZWFsbG9jaG9vayk6CisJQ2FzdCBhZGRyZXNzZXMgcHV0IG91dCB2aWEgZnByaW50ZiB0byB1bnNpZ25lZCBsb25nIGFuZCB1c2UgJWx4LgorCitUdWUgTm92IDE2IDIwOjMzOjE3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBDT1BZSU5HLkxJQjogTmV3IGZpbGUgKHN0YW5kYXJkIHZlcnNpb24gMiBMR1BMLCBhcyBhbHJlYWR5IGNpdGVkCisJYnkgdGhlIHNvdXJjZSBmaWxlcykuCisKK0ZyaSBOb3YgIDUgMTE6NDc6MzMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChpbmZvIGR2aSBpbnN0YWxsLWluZm8pOiBBY3R1YWxseSBtYWtlIHRoZSBtYW51YWwuCisKK01vbiBOb3YgIDEgMTQ6MjA6MjUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIG1tYWxsb2MudGV4aTogRml4IHR5cG8gKCJmb3IgZm9yIiAtPiAiZm9yIikuCisKK0ZyaSBKdWwgMTYgMTU6Mjc6MDggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQorCisJKiB0ZXN0MS5jOiBOZXcgZmlsZSB3aGljaCB0ZXN0cyBmb3IgYnVnIGZpeGVkIGJlbG93LgorCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogUHV0IGluIGNvbW1hbmRzIHRvIHJ1biBpdCAoYnV0IGNvbW1lbnRlZCBvdXQKKwliZWNhdXNlIGl0IHdvbid0IHdvcmsgZm9yIENhbmFkaWFuIGNyb3NzKS4KKworCSogbW1hbGxvYy5jIChtbWFsbG9jKTogV2hlbiBleHRlbmRpbmcgYSBmcmVlIGJsb2NrIGF0IHRoZSBlbmQgb2YgdGhlCisJaGVhcCwgY2hlY2sgd2hldGhlciB3aGljaCBibG9jayBpcyBhdCB0aGUgZW5kIGNoYW5nZWQuCisKKwkqIE1ha2VmaWxlLmluIChUQUdTKTogbWFrZSB3b3JrIHdoZW4gc3JjZGlyICE9IG9iamRpci4KKworVGh1IEp1bCAxNSAwNzo1Njo0NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogYXR0YWNoLmMsIGRldGFjaC5jOiBJbmNsdWRlIDxzeXMvdHlwZXMuaD4gYmVmb3JlIDxmY250bC5oPi4KKworV2VkIEp1biAzMCAxMTowMDo1MyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IEFkZCBtb3N0bHljbGVhbiBhbmQgcmVhbGNsZWFuIHRhcmdldHMuCisKK1dlZCBNYXIgMjQgMDE6NTg6MTIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhZGQgZHZpIGFuZCBpbnN0YWxsY2hlY2sgdGFyZ2V0cworCitGcmkgTWFyIDEyIDE4OjM1OjQzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgKi0qLXNvbGFyaXMyKiBpbnN0ZWFkIG9mICotKi1zb2xhcmlzKiAoYQorCW51bWJlciBvZiBwZW9wbGUgd2FudCB0byBjYWxsIFN1bk9TIDQuMS4yICJzb2xhcmlzMS4wIiBhbmQgZ2V0IGl0IHJpZ2h0KQorCitNb24gRmViIDIyIDE4OjA4OjUzIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogIEFkZC4KKworVHVlIEZlYiAxNiAwODowOToxNSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIGF0dGFjaC5jLCBkZXRhY2guYywga2V5cy5jLCBtbWFwLXN1cC5jLCBtbXRyYWNlLmMsCisJc2Jyay1zdXAuYzogIFVzZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBsaWtlIG90aGVyCisJZmlsZXMuCisKK1dlZCBOb3YgMTggMTk6MTg6NTkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIFJlZ3VsYXJpemUgbGlzdCBvZiBob3N0IGNvbmZpZ3MuCisKK0ZyaSBPY3QgMzAgMDA6NTk6NDYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIG1tYWxsb2MudGV4aTogIEFkZCBtaXNzaW5nIGRvdWJsZWQgQC4gIEJ1Z2ZpeCBieSBQYXVsIEVnZ2VydC4KKworRnJpIE9jdCAyMyAwMTo1MDo1MiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46ICBIYW5kbGUgc29sYXJpcyBzYW1lIGFzIHN5c3Y0LgorCitUaHUgT2N0ICAxIDIzOjM0OjIwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiB1c2UgY3B1LXZlbmRvci1vcyB0cmlwbGUgaW5zdGVhZCBvZiBuZXN0ZWQgY2FzZXMKKworU3VuIEF1ZyAyMyAxMTowOTo0NiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogc2Jyay1zdXAuYyAoX19tbWFsbG9jX2Jya19pbml0KTogIEVuc3VyZSBiYXNlIG9mIHNicmsnZCByZWdpb24KKwlpcyBhbGlnbmVkLiAgQnVnIHJlcG9ydGVkIGJ5IEFuZHJldyBIZXliZXkgKGF0aEBsY3MubWl0LmVkdSkuCisKK1dlZCBBdWcgMTkgMTQ6NDk6MjMgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCisKK01vbiBKdWwgMjAgMjE6MTU6NDQgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIG1yZWFsbG9jLmM6ICBNaW5vciBjb2RlIGZvcm1hdCBzdHlsZSBjaGFuZ2VzIGZvciBjb25zaXN0ZW5jeS4KKworRnJpIEp1bCAgMyAyMDoyNTozMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogYXR0YWNoLmMsIGRldGFjaC5jLCBtY2FsbG9jLmMsIG1tYWxsb2MuYywgbW10cmFjZS5jLCBtcmVhbGxvYy5jLAorCXNicmstc3VwLmM6ICBSZW1vdmUgIih2b2lkKSIgY2FzdHMgZnJvbSBmdW5jdGlvbiBjYWxscyB3aGVyZSB0aGUKKwlyZXR1cm4gdmFsdWUgaXMgaWdub3JlZCwgaW4gYWNjb3JkYW5jZSB3aXRoIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLgorCitUdWUgSnVuIDMwIDE2OjQ0OjQxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBtbWFsbG9jLmggKHN0cnVjdCBtZGVzYyk6ICBBZGQgRklYTUUgY29tbWVudHMgdG8gcG9pbnQgb3V0IHRoZQorCW5lZWQgdG8gc2F2ZSBzb21lIGRhdGEgb24gYSBwZXItcHJvY2VzcyBiYXNpcyBmb3IgbWFwcGVkIHJlZ2lvbnMKKwl0aGF0IGFyZSBzaGFyZWQuCisJKiBhdHRhY2guYyAocmV1c2UpOiAgVXBkYXRlIHRoZSBtb3JlY29yZSBmaWVsZCBmb3IgcmV1c2VkIG1hcHBlZAorCXJlZ2lvbnMgdG8gYmUgY29ycmVjdCBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKworTW9uIEp1biAyOSAxMDo0NToyNSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogbW10cmFjZS5jOiAgTGludC4KKworTW9uIEp1biAxNSAxMjoyMDoxNiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogbW1hbGxvYy5oIChzdHJ1Y3QgbWRlc2MpOiAgQ2hhbmdlIG1lbWJlciAiZXJybm8iIHRvCisJInNhdmVkX2Vycm5vIiB0byBhdm9pZCBwb3NzaWJsZSBjb25mbGljdCB3aXRoIEFOU0kgQyBlbnZpcm9ubWVudHMsCisJd2hlcmUgaXQgaXMgYWxsb3dlZCB0byBiZSBhIG1hY3JvLgorCSogY29uZmlnL21oLW5jcjMwMDAgKElOU1RBTEwpOiAgRG9uJ3QgdXNlIC91c3IvdWNiL2luc3RhbGwsCisJaXQgaXMgYnJva2VuIG9uIG5jciAzMDAwJ3MuCisJKiBjb25maWcvbWgtbmNyMzAwMCAoUkFOTElCKTogIFVzZSBSQU5MSUI9dHJ1ZS4KKworRnJpIEp1biAxMiAyMTozNDoyMSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogbW1hcC1zdXAuYzogIEF2b2lkIEFOU0kgQyAiZW1wdHkgdHJhbnNsYXRpb24gdW5pdCIgaWRpb2N5LgorCitUdWUgSnVuICA5IDE3OjI5OjA0IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb25maWcve21oLW5jcjMwMDAsIG1oLXN5c3Y0fTogIEFkZCBkZWZpbml0aW9uIGZvciBJTlNUQUxMIHVzaW5nCisJL3Vzci91Y2IvaW5zdGFsbC4KKworVGh1IEFwciAzMCAyMjozNjozMSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogc2Jyay1zdXAuYyAoc2Jya19tb3JlY29yZSk6ICBGaXggc2JyaygpIGVycm9yIHJldHVybiB0ZXN0LgorCitNb24gQXByIDIwIDIxOjAzOjMwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogcmV3b3JrIENGTEFHUyBzbyB0aGF0IHRoZXkgY2FuIGJlIHBhc3NlZCBmcm9tIHRoZQorCSAgY29tbWFuZCBsaW5lLiAgcmVtb3ZlIE1JTlVTX0cuICBEZWZhdWx0IENGTEFHUyB0byAtZy4KKworVGh1IEFwciAxNiAyMDowMDoyMSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogVE9ETzogIE5ldyBmaWxlLgorCSogYXR0YWNoLmMsIG1jYWxsb2MuYywgbWZyZWUuYywgbW1hbGxvYy5jLCBtbWFsbG9jLmgsIG1tYXAtc3VwLmMsCisJbW1jaGVjay5jLCBtdHJhY2UuYywgbXJlYWxsb2MuYywgbXZhbGxvYy5jLCBzYnJrLXN1cC5jOiAgTGludC4KKworRnJpIEFwciAxMCAyMjo1OToxNyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIG5ldyBuY3IzMDAwIGNvbmZpZy4KKwkqIGNvbmZpZy9taC1uY3IzMDAwOiAgTmV3IGNvbmZpZyBmaWxlLgorCSogTWFrZWZpbGUuaW4gKE1JTlVTX0cpOiAgQWRkIG1hY3JvIGFuZCBkZWZhdWx0IHRvIC1nLgorCitXZWQgQXByICA4IDA5OjM0OjUzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBtbWFsbG9jLmM6ICBNaW5vciBmaXggdG8gY29tbWVudC4KKwkqIG1tYWxsb2MudGV4aTogIFVwZGF0ZSB0byBtYXRjaCBhY3R1YWwgaW1wbGVtZW50YXRpb24KKwkqIG1tYWxsb2MuaCAobW9yZWNvcmUpOiAgQ2hhbmdlIHByb3RvdHlwZSdzIDJuZCBhcmcgdG8gaW50LgorCitUdWUgQXByICA3IDIyOjE2OjA5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBtbWFsbG9jLmggKHNpemVfdCwgQ0hBUl9CSVQpOiAgT25seSByZWRlZmluZSBpZiBub3QgYWxyZWFkeQorCWRlZmluZWQuCisKK01vbiBBcHIgIDYgMjA6NDk6MzMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIG1tYWxsb2MuaDogIFJlbW92ZSBpbmNsdWRlIG9mIDxzdGRsaWIuaD4uICBUaGlzIGFsc28gZ2V0cyByaWQKKwlvZiB0aGUgdWdseSBrbHVkZ2UgaW5zdGFsbGVkIG9uIDEtQXByLTkyLgorCitNb24gQXByICA2IDE2OjMzOjM3IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGRldGFjaC5jIChtbWFsbG9jX2RldGFjaCk6ICBBcmcgc2hvdWxkIGJlIFBUUiwgbm90IHZvaWQgKi4KKwlGaXhlcyBjb21wbGFpbnRzIGZyb20gbm9uIF9fU1REQ19fIHN5c3RlbXMuCisKK1dlZCBBcHIgIDEgMTE6NDc6MDIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIG1jYWxsb2MuYywgbWZyZWUuYywgbW1hbGxvYy5jLCBtcmVhbGxvYy5jOiAgTWlub3IgY29tbWVudAorCWNoYW5nZS4KKwkqIG1tYWxsb2MuaDogIEFkZCB1Z2x5IGtsdWRnZSB0byBiYW5kLWFpZCBvdmVyIHByb2JsZW1zIHdpdGgKKwlib2d1cyB2ZW5kb3IgPHN0ZGxpYi5oPiBmaWxlcy4KKworU3VuIE1hciAyOSAxMjo0MTozMSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogYXR0YWNoLmMsIG1tYWxsb2MuYywgbW1jaGVjay5jOiAgTGludC4KKworVGh1IE1hciAyNiAxNzowNjowNCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogYXR0YWNoLmMgKHJldXNlKTogIEV4cGxpY2l0bHkgZGlzY2FyZCByZXR1cm4gdmFsdWUgb2YgbW1jaGVjay4KKwkqIG1tY2hlY2suYyAobW1jaGVjayk6ICBEb2N1bWVudCByZXF1aXJlbWVudHMgZm9yIGluc3RhbGxpbmcKKwljb3JydXB0aW9uIGNoZWNraW5nIGhvb2tzIGFuZCBzZXQgdXAgdG8gZW5mb3JjZSByZXN0cmljdGlvbnMuCisKK1R1ZSBNYXIgMjQgMjM6NDE6MTAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taC1pcml4NDogbmV3IGZpbGUuCisKKwkqIE1ha2VmaWxlLmluOiBhZGRlZCBzdGFuZGFyZCB0YXJnZXRzLCBmaXhlZCBpbnN0YWxsIGRpcmVjdG9yaWVzLgorCitTYXQgTWFyIDE0IDE3OjM0OjU5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBJbml0aWFsIHJlbGVhc2UsIGluY29ycG9yYXRlZCBpbnRvIGdkYi4KKworCmRpZmYgLS1naXQgYS9tbWFsbG9jL01ha2VmaWxlLmluIGIvbW1hbGxvYy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWU5MWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbW1hbGxvYy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDIwOCBAQAorIyBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisjIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorIyBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKKyMgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisjIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjCisjIE1ha2VmaWxlIGZvciBtbWFsbG9jIGRpcmVjdG9yeQorIworCisjIERpcmVjdG9yeSBjb250YWluaW5nIHNvdXJjZSBmaWxlcy4gIERvbid0IGNsZWFuIHVwIHRoZSBzcGFjaW5nLAorIyB0aGlzIGV4YWN0IHN0cmluZyBpcyBtYXRjaGVkIGZvciBieSB0aGUgImNvbmZpZ3VyZSIgc2NyaXB0LgorCitWUEFUSCA9IEBzcmNkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorCitwcmVmaXggPQlAcHJlZml4QAorZXhlY19wcmVmaXggPQlAZXhlY19wcmVmaXhACisKK2JpbmRpciA9CUBiaW5kaXJACitsaWJkaXIgPQlAbGliZGlyQAorCitkYXRhZGlyID0JQGRhdGFkaXJACittYW5kaXIgPQlAbWFuZGlyQAorbWFuMWRpciA9CSQobWFuZGlyKS9tYW4xCittYW4yZGlyID0JJChtYW5kaXIpL21hbjIKK21hbjNkaXIgPQkkKG1hbmRpcikvbWFuMworbWFuNGRpciA9CSQobWFuZGlyKS9tYW40CittYW41ZGlyID0JJChtYW5kaXIpL21hbjUKK21hbjZkaXIgPQkkKG1hbmRpcikvbWFuNgorbWFuN2RpciA9CSQobWFuZGlyKS9tYW43CittYW44ZGlyID0JJChtYW5kaXIpL21hbjgKK21hbjlkaXIgPQkkKG1hbmRpcikvbWFuOQoraW5mb2RpciA9CUBpbmZvZGlyQAoraW5jbHVkZWRpciA9CUBpbmNsdWRlZGlyQAorCitTSEVMTCA9CQlAU0hFTExACisKK0lOU1RBTEwgPQlASU5TVEFMTEAKK0lOU1RBTExfUFJPR1JBTT1ASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9EQVRBID0JQElOU1RBTExfREFUQUAKKworQVIgPQkJQEFSQAorQVJfRkxBR1MgPQlxdgorQ0ZMQUdTID0JLWcKK01BS0VJTkZPID0JbWFrZWluZm8KK1JBTkxJQiA9CUBSQU5MSUJACitSTSA9CQlybQorCisjIHdoZXJlIHRvIGZpbmQgbWFrZWluZm8KK01BS0VJTkZPPW1ha2VpbmZvCisKK1NFVF9URVhJTlBVVFMgPSBURVhJTlBVVFM9JHtURVhJRElSfTouOiQoc3JjZGlyKTokKFJFQURMSU5FX0RJUik6JCRURVhJTlBVVFMKKworIyBUaGUgVGVYIGZvcm1hdHRlcgorVEVYID0gdGV4CisKK1RBUkdFVExJQiA9CWxpYm1tYWxsb2MuYQorCitDRklMRVMgPQltY2FsbG9jLmMgbWZyZWUuYyBtbWFsbG9jLmMgbW1jaGVjay5jIG1tZW1hbGlnbi5jIG1tc3RhdHMuYyBcCisJCW1tdHJhY2UuYyBtcmVhbGxvYy5jIG12YWxsb2MuYyBtbWFwLXN1cC5jIGF0dGFjaC5jIGRldGFjaC5jIFwKKwkJa2V5cy5jIHNicmstc3VwLmMgbW0uYworCitIRklMRVMgPQltbWFsbG9jLmgKKworT0ZJTEVTID0JbWNhbGxvYy5vIG1mcmVlLm8gbW1hbGxvYy5vIG1tY2hlY2subyBtbWVtYWxpZ24ubyBtbXN0YXRzLm8gXAorCQltbXRyYWNlLm8gbXJlYWxsb2MubyBtdmFsbG9jLm8gbW1hcC1zdXAubyBhdHRhY2gubyBkZXRhY2gubyBcCisJCWtleXMubyBzYnJrLXN1cC5vCisKK0RFRlMgPQkJQERFRlNACisKKyMgVGhlIGN1cnJlbnQgZGVmYXVsdCBpcyB0byBidWlsZCBhIHNpbmdsZSBvYmplY3QgbW9kdWxlIHdpdGggYWxsIHRoZSBtbWFsbG9jCisjIGZ1bmN0aW9ucy4gIFRvIGJ1aWxkIGEgbW9yZSB0cmFkaXRpb25hbCBsaWJyYXJ5LCBmbGlwIHRoaXMgbWFjcm8gZGVmaW5pdGlvbi4KKyNUQVJHRVRPQkpTID0JJChPRklMRVMpCitUQVJHRVRPQkpTID0JbW0ubworCisuYy5vOgorCQkkKENDKSAtYyAkKENGTEFHUykgJChERUZTKSAtSS4gLUkkKHNyY2RpcikvLi4vaW5jbHVkZSAkPAorCisjIERvIHdlIHdhbnQvbmVlZCBhbnkgY29uZmlnIG92ZXJyaWRlcz8KKyMJIAorCitTVEFHRVNUVUZGID0JJChUQVJHRVRMSUIpICoubworCithbGw6CQkkKFRBUkdFVExJQikKKworaW5mbzogbW1hbGxvYy5pbmZvCitkdmk6IG1tYWxsb2MuZHZpCitjbGVhbi1pbmZvOgoraW5zdGFsbGNoZWNrOgorCittbWFsbG9jLmluZm86IG1tYWxsb2MudGV4aQorCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAtbyAuL21tYWxsb2MuaW5mbyBtbWFsbG9jLnRleGkKKworIyBUaGlzIGZpbGUgZG9lc24ndCBuZWVkIHRleGluZGV4IGN1cnJlbnRseS4KK21tYWxsb2MuZHZpOiBtbWFsbG9jLnRleGkKKwkkKFNFVF9URVhJTlBVVFMpICQoVEVYKSBtbWFsbG9jLnRleGkKKwlybSAtZiBtbWFsbG9jLj8/IG1tYWxsb2MuPz9zIG1tYWxsb2MubG9nIG1tYWxsb2MuYXV4IG1tYWxsb2MudG9jCisKK2luc3RhbGwtaW5mbzogaW5mbworCWlmIHRlc3QgISAtZiBtbWFsbG9jLmluZm8gOyB0aGVuIGNkICQoc3JjZGlyKTsgZmk7IFwKKwkkKElOU1RBTExfREFUQSkgbW1hbGxvYy5pbmZvICQoaW5mb2RpcikvbW1hbGxvYy5pbmZvCisKK2NoZWNrOiB0ZXN0MS5jCisjCSQoQ0MpIC1nICQoc3JjZGlyKS90ZXN0MS5jIGxpYm1tYWxsb2MuYQorIyBUaGlzIGxvc2VzIGZvciBDYW5hZGlhbiBjcm9zcyAoYnVpbGRpbmcgbW1hbGxvYyB3aXRoIGEgY3Jvc3MtY29tcGlsZXIpLgorIyBUaGVyZSBpcyBwcm9iYWJseSBzb21lIGRlamFnbnUtaXNoIHNvbHV0aW9uIChzdWNoIGFzIHdoYXQgd2UgYXJlIGRvaW5nCisjIGZvciBnZGIsIHBlcmhhcHMpLgorIwkuL2Eub3V0CisKK2luc3RhbGw6CWFsbAorCQkkKElOU1RBTExfREFUQSkgJChUQVJHRVRMSUIpICQobGliZGlyKS8kKFRBUkdFVExJQikubgorCQkkKFJBTkxJQikgJChsaWJkaXIpLyQoVEFSR0VUTElCKS5uCisJCW12IC1mICQobGliZGlyKS8kKFRBUkdFVExJQikubiAkKGxpYmRpcikvJChUQVJHRVRMSUIpCisKKyQoVEFSR0VUTElCKToJJChUQVJHRVRPQkpTKQorCQkkKFJNKSAtcmYgJEAKKwkJJChBUikgJChBUl9GTEFHUykgJEAgJChUQVJHRVRPQkpTKQorCQkkKFJBTkxJQikgJEAKKworJChPRklMRVMpIDoJJChIRklMRVMpIE1ha2VmaWxlCisKK21tLm86CQkkKEhGSUxFUykgJChDRklMRVMpCisJCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKERFRlMpIC1JLiAtSSQoc3JjZGlyKS8uLi9pbmNsdWRlICQoc3JjZGlyKS9tbS5jCisKKy5hbHdheXMuOgorIyBEbyBub3RoaW5nLgorCisuUEhPTkVZOiBhbGwgZXRhZ3MgdGFncyBscyBjbGVhbiBzdGFnZTEgc3RhZ2UyIC5hbHdheXMuCisKK3N0YWdlMToJCWZvcmNlCisJCS1ta2RpciBzdGFnZTEKKwkJLW12IC1mICQoU1RBR0VTVFVGRikgc3RhZ2UxCisKK3N0YWdlMjoJCWZvcmNlCisJCS1ta2RpciBzdGFnZTIKKwkJLW12IC1mICQoU1RBR0VTVFVGRikgc3RhZ2UyCisKK3N0YWdlMzoJCWZvcmNlCisJCS1ta2RpciBzdGFnZTMKKwkJLW12IC1mICQoU1RBR0VTVFVGRikgc3RhZ2UzCisKK3N0YWdlNDoJCWZvcmNlCisJCS1ta2RpciBzdGFnZTQKKwkJLW12IC1mICQoU1RBR0VTVFVGRikgc3RhZ2U0CisKK2FnYWluc3Q9c3RhZ2UyCisKK2NvbXBhcmlzb246CWZvcmNlCisJCWZvciBpIGluICoubyA7IGRvIGNtcCAkJGkgJChhZ2FpbnN0KS8kJGkgfHwgZXhpdCAxIDsgZG9uZQorCitkZS1zdGFnZTE6CWZvcmNlCisJCS0oY2Qgc3RhZ2UxIDsgbXYgLWYgKiAuLikKKwkJLXJtZGlyIHN0YWdlMQorCitkZS1zdGFnZTI6CWZvcmNlCisJCS0oY2Qgc3RhZ2UyIDsgbXYgLWYgKiAuLikKKwkJLXJtZGlyIHN0YWdlMgorCitkZS1zdGFnZTM6CWZvcmNlCisJCS0oY2Qgc3RhZ2UzIDsgbXYgLWYgKiAuLikKKwkJLXJtZGlyIHN0YWdlMworCitkZS1zdGFnZTQ6CWZvcmNlCisJCS0oY2Qgc3RhZ2U0IDsgbXYgLWYgKiAuLikKKwkJLXJtZGlyIHN0YWdlNAorCitldGFncyB0YWdzOglUQUdTCisKK1RBR1M6CQkkKENGSUxFUykKKwlldGFncyBgZm9yIGkgaW4gJChIRklMRVMpICQoQ0ZJTEVTKTsgZG8gZWNobyAkKHNyY2RpcikvJCRpIDsgZG9uZWAKKworbHM6CisJCUBlY2hvIE1ha2VmaWxlICQoSEZJTEVTKSAkKENGSUxFUykKKworIyBOZWVkIHRvIGRlYWwgd2l0aCBwcm9maWxlZCBsaWJyYXJpZXMsIHRvby4KKworbW9zdGx5Y2xlYW4gY2xlYW46CisJCXJtIC1mICouYSAqLm8gY29yZSBlcnJzICp+IFwjKiBUQUdTICouRSBhLm91dCBlcnJvcnMgCisKK2Rpc3RjbGVhbjoJY2xlYW4gCisJCXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIGNvbmZpZy5zdGF0dXMKKwkJcm0gLWYgTWFrZWZpbGUgZGVwZW5kCisKK21haW50YWluZXItY2xlYW4gcmVhbGNsZWFuOiBkaXN0Y2xlYW4gY2xlYW4KKwkJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKKwkJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCQlybSAtZiBtbWFsbG9jLmluZm8KKworZm9yY2U6CisKK01ha2VmaWxlOglNYWtlZmlsZS5pbiBjb25maWcuc3RhdHVzCisJCSQoU0hFTEwpIGNvbmZpZy5zdGF0dXMKKworY29uZmlnLnN0YXR1czoJY29uZmlndXJlCisJCSQoU0hFTEwpIGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCmRpZmYgLS1naXQgYS9tbWFsbG9jL1RPRE8gYi9tbWFsbG9jL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxMjA0MwotLS0gL2Rldi9udWxsCisrKyBiL21tYWxsb2MvVE9ETwpAQCAtMCwwICsxLDE3IEBACitUaGluZ3MgdGhhdCBzdGlsbCBuZWVkIGF0dGVudGlvbjoKKworICAgKglNYWtlIGltcGxlbWVudGF0aW9uIGNoYW5nZXMgbmVjZXNzYXJ5IHRvIGFsbG93IG11bHRpcGxlIHByb2Nlc3NlcworCXRvIHVzZSB0aGUgbW1hbGxvYyBtYW5hZ2VkIHJlZ2lvbiBzaW11bHRhbmVvdXNseS4gIFRoaXMgcmVxdWlyZXMsCisJYXQgdGhlIG1pbmltdW0sIHNvbWUgc29ydCBvZiBjb29wZXJhdGl2ZSBsb2NraW5nIHRoYXQgZW5zdXJlcyB0aGF0CisJb25seSBvbmUgcHJvY2VzcyBhdCBhIHRpbWUgaXMgY2hhbmdpbmcgYW55IG9mIHRoZSBtbWFsbG9jIG1hbmFnZWQKKwlkYXRhIHN0cnVjdHVyZXMgKGl0cyBvayBmb3IgdGhlIG1tYWxsb2MgbWFuYWdlZCBkYXRhIHJlZ2lvbnMgdG8gYmUKKwljaGFuZ2VkIGF0IGFueSB0aW1lIHNpbmNlIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlaXIgY29udGVudHMpLgorCisgICAqCUluIG9yZGVyIHRvIHN1cHBvcnQgbXVsdGlwbGUgcHJvY2Vzc2VzIHVzaW5nIHRoZSBtbWFsbG9jIG1hbmFnZWQKKwlyZWdpb24sIHRoZSBtYWxsb2MgZGVzY3JpcHRvciBuZWVkcyB0byBiZSBicm9rZW4gaW50byB0d28gcGFydHMsCisJb25lIHBhcnQgd2hpY2ggaXMgc3BlY2lmaWMgdG8gdGhlIGdpdmVuIHByb2Nlc3MgYW5kIGlzIG1haW50YWluZWQKKwlzZXBhcmF0ZWx5IG9uIGEgcGVyIHByb2Nlc3MgYmFzaXMsIGFuZCBhbm90aGVyIHBhcnQgd2hpY2ggaXMgY29tbW9uCisJdG8gYWxsIHByb2Nlc3Nlcy4gIEFzIGFuIGV4YW1wbGUsIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgc3BlY2lmaWMKKwl0byBhIGdpdmVuIHByb2Nlc3MsIGFzIGFyZSB0aGUgbW9yZWNvcmUgYW5kIGFib3J0ZnVuYyBwb2ludGVycy4KKwlIb3dldmVyIG1hZ2ljW10sIHRoZSB2ZXJzaW9uIG51bWJlciwgdGhlIGZsYWdzIGZpZWxkLCBldGMgYXJlCisJY29tbW9uIHRvIGFsbCBwcm9jZXNzZXMuCmRpZmYgLS1naXQgYS9tbWFsbG9jL2F0dGFjaC5jIGIvbW1hbGxvYy9hdHRhY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGNmYTZlCi0tLSAvZGV2L251bGwKKysrIGIvbW1hbGxvYy9hdHRhY2guYwpAQCAtMCwwICsxLDIxOCBAQAorLyogSW5pdGlhbGl6YXRpb24gZm9yIGFjY2VzcyB0byBhIG1tYXAnZCBtYWxsb2MgbWFuYWdlZCByZWdpb24uCisgICBDb3B5cmlnaHQgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgQ29udHJpYnV0ZWQgYnkgRnJlZCBGaXNoIGF0IEN5Z251cyBTdXBwb3J0LiAgIGZuZkBjeWdudXMuY29tCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCitUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCitub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+IC8qIEFmdGVyIHN5cy90eXBlcy5oLCBhdCBsZWFzdCBmb3IgZHB4LzIuICAqLworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibW1wcml2YXRlLmgiCisKKyNpZm5kZWYgU0VFS19TRVQKKyNkZWZpbmUgU0VFS19TRVQgMAorI2VuZGlmCisKKworI2lmIGRlZmluZWQoSEFWRV9NTUFQKQorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucy9wcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMgKi8KKworc3RhdGljIHN0cnVjdCBtZGVzYyAqcmV1c2UgUEFSQU1TICgoaW50KSk7CisKKy8qIEluaXRpYWxpemUgYWNjZXNzIHRvIGEgbW1hbGxvYyBtYW5hZ2VkIHJlZ2lvbi4KKworICAgSWYgRkQgaXMgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IgZm9yIGFuIG9wZW4gZmlsZSB0aGVuIGRhdGEgZm9yIHRoZQorICAgbW1hbGxvYyBtYW5hZ2VkIHJlZ2lvbiBpcyBtYXBwZWQgdG8gdGhhdCBmaWxlLCBvdGhlcndpc2UgIi9kZXYvemVybyIKKyAgIGlzIHVzZWQgYW5kIHRoZSBkYXRhIHdpbGwgbm90IGV4aXN0IGluIGFueSBmaWxlc3lzdGVtIG9iamVjdC4KKworICAgSWYgdGhlIG9wZW4gZmlsZSBjb3JyZXNwb25kaW5nIHRvIEZEIGlzIGZyb20gYSBwcmV2aW91cyB1c2Ugb2YKKyAgIG1tYWxsb2MgYW5kIHBhc3NlcyBzb21lIGJhc2ljIHNhbml0eSBjaGVja3MgdG8gZW5zdXJlIHRoYXQgaXQgaXMKKyAgIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBtbWFsbG9jIHBhY2thZ2UsIHRoZW4gaXQncyBkYXRhIGlzCisgICBtYXBwZWQgaW4gYW5kIGlzIGltbWVkaWF0ZWx5IGFjY2Vzc2libGUgYXQgdGhlIHNhbWUgYWRkcmVzc2VzIGluCisgICB0aGUgY3VycmVudCBwcm9jZXNzIGFzIHRoZSBwcm9jZXNzIHRoYXQgY3JlYXRlZCB0aGUgZmlsZS4KKworICAgSWYgQkFTRUFERFIgaXMgbm90IE5VTEwsIHRoZSBtYXBwaW5nIGlzIGVzdGFibGlzaGVkIHN0YXJ0aW5nIGF0IHRoZQorICAgc3BlY2lmaWVkIGFkZHJlc3MgaW4gdGhlIHByb2Nlc3MgYWRkcmVzcyBzcGFjZS4gIElmIEJBU0VBRERSIGlzIE5VTEwsCisgICB0aGUgbW1hbGxvYyBwYWNrYWdlIGNob29zZXMgYSBzdWl0YWJsZSBhZGRyZXNzIGF0IHdoaWNoIHRvIHN0YXJ0IHRoZQorICAgbWFwcGVkIHJlZ2lvbiwgd2hpY2ggd2lsbCBiZSB0aGUgdmFsdWUgb2YgdGhlIHByZXZpb3VzIG1hcHBpbmcgaWYKKyAgIG9wZW5pbmcgYW4gZXhpc3RpbmcgZmlsZSB3aGljaCB3YXMgcHJldmlvdXNseSBidWlsdCBieSBtbWFsbG9jLCBvcgorICAgZm9yIG5ldyBmaWxlcyB3aWxsIGJlIGEgdmFsdWUgY2hvc2VuIGJ5IG1tYXAuCisKKyAgIFNwZWNpZnlpbmcgQkFTRUFERFIgcHJvdmlkZXMgbW9yZSBjb250cm9sIG92ZXIgd2hlcmUgdGhlIHJlZ2lvbnMKKyAgIHN0YXJ0IGFuZCBob3cgYmlnIHRoZXkgY2FuIGJlIGJlZm9yZSBidW1waW5nIGludG8gZXhpc3RpbmcgbWFwcGVkCisgICByZWdpb25zIG9yIGZ1dHVyZSBtYXBwZWQgcmVnaW9ucy4KKworICAgT24gc3VjY2VzcywgcmV0dXJucyBhICJtYWxsb2MgZGVzY3JpcHRvciIgd2hpY2ggaXMgdXNlZCBpbiBzdWJzZXF1ZW50CisgICBjYWxscyB0byBvdGhlciBtbWFsbG9jIHBhY2thZ2UgZnVuY3Rpb25zLiAgSXQgaXMgZXhwbGljaXRseSAidm9pZCAqIgorICAgKCJjaGFyICoiIGZvciBzeXN0ZW1zIHRoYXQgZG9uJ3QgZnVsbHkgc3VwcG9ydCB2b2lkKSBzbyB0aGF0IHVzZXJzCisgICBvZiB0aGUgcGFja2FnZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24KKyAgIGRldGFpbHMuCisKKyAgIE9uIGZhaWx1cmUgcmV0dXJucyBOVUxMLiAqLworCitQVFIKK21tYWxsb2NfYXR0YWNoIChmZCwgYmFzZWFkZHIpCisgIGludCBmZDsKKyAgUFRSIGJhc2VhZGRyOworeworICBzdHJ1Y3QgbWRlc2MgbXRlbXA7CisgIHN0cnVjdCBtZGVzYyAqbWRwOworICBQVFIgbWJhc2U7CisgIHN0cnVjdCBzdGF0IHNidWY7CisKKyAgLyogRmlyc3QgY2hlY2sgdG8gc2VlIGlmIEZEIGlzIGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLCBhbmQgaWYgc28sIHNlZQorICAgICBpZiB0aGUgZmlsZSBoYXMgYW55IGN1cnJlbnQgY29udGVudHMgKHNpemUgPiAwKS4gIElmIGl0IGRvZXMsIHRoZW4KKyAgICAgYXR0ZW1wdCB0byByZXVzZSB0aGUgZmlsZS4gIElmIHdlIGNhbid0IHJldXNlIHRoZSBmaWxlLCBlaXRoZXIKKyAgICAgYmVjYXVzZSBpdCBpc24ndCBhIHZhbGlkIG1tYWxsb2MgcHJvZHVjZWQgZmlsZSwgd2FzIHByb2R1Y2VkIGJ5IGFuCisgICAgIG9ic29sZXRlIHZlcnNpb24sIG9yIGFueSBvdGhlciByZWFzb24sIHRoZW4gd2UgZmFpbCB0byBhdHRhY2ggdG8KKyAgICAgdGhpcyBmaWxlLiAqLworCisgIGlmIChmZCA+PSAwKQorICAgIHsKKyAgICAgIGlmIChmc3RhdCAoZmQsICZzYnVmKSA8IDApCisJeworCSAgcmV0dXJuIChOVUxMKTsKKwl9CisgICAgICBlbHNlIGlmIChzYnVmLnN0X3NpemUgPiAwKQorCXsKKwkgIHJldHVybiAoKFBUUikgcmV1c2UgKGZkKSk7CisJfQorICAgIH0KKworICAvKiBXZSBzdGFydCBvZmYgd2l0aCB0aGUgbWFsbG9jIGRlc2NyaXB0b3IgYWxsb2NhdGVkIG9uIHRoZSBzdGFjaywgdW50aWwKKyAgICAgd2UgYnVpbGQgaXQgdXAgZW5vdWdoIHRvIGNhbGwgX21tYWxsb2NfbW1hcF9tb3JlY29yZSgpIHRvIGFsbG9jYXRlIHRoZQorICAgICBmaXJzdCBwYWdlIG9mIHRoZSByZWdpb24gYW5kIGNvcHkgaXQgdGhlcmUuICBFbnN1cmUgdGhhdCBpdCBpcyB6ZXJvJ2QgYW5kCisgICAgIHRoZW4gaW5pdGlhbGl6ZSB0aGUgZmllbGRzIHRoYXQgd2Uga25vdyB2YWx1ZXMgZm9yLiAqLworCisgIG1kcCA9ICZtdGVtcDsKKyAgbWVtc2V0ICgoY2hhciAqKSBtZHAsIDAsIHNpemVvZiAobXRlbXApKTsKKyAgc3RybmNweSAobWRwIC0+IG1hZ2ljLCBNTUFMTE9DX01BR0lDLCBNTUFMTE9DX01BR0lDX1NJWkUpOworICBtZHAgLT4gaGVhZGVyc2l6ZSA9IHNpemVvZiAobXRlbXApOworICBtZHAgLT4gdmVyc2lvbiA9IE1NQUxMT0NfVkVSU0lPTjsKKyAgbWRwIC0+IG1vcmVjb3JlID0gX19tbWFsbG9jX21tYXBfbW9yZWNvcmU7CisgIG1kcCAtPiBmZCA9IGZkOworICBtZHAgLT4gYmFzZSA9IG1kcCAtPiBicmVha3ZhbCA9IG1kcCAtPiB0b3AgPSBiYXNlYWRkcjsKKworICAvKiBJZiB3ZSBoYXZlIG5vdCBiZWVuIHBhc3NlZCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZQorICAgICB0byBtYXAgdG8sIHRoZW4gb3BlbiAvZGV2L3plcm8gYW5kIHVzZSB0aGF0IHRvIG1hcCB0by4gKi8KKworICBpZiAobWRwIC0+IGZkIDwgMCkKKyAgICB7CisgICAgICBpZiAoKG1kcCAtPiBmZCA9IG9wZW4gKCIvZGV2L3plcm8iLCBPX1JEV1IpKSA8IDApCisJeworCSAgcmV0dXJuIChOVUxMKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbWRwIC0+IGZsYWdzIHw9IE1NQUxMT0NfREVWWkVSTzsKKwl9CisgICAgfQorCisgIC8qICBOb3cgdHJ5IHRvIG1hcCBpbiB0aGUgZmlyc3QgcGFnZSwgY29weSB0aGUgbWFsbG9jIGRlc2NyaXB0b3Igc3RydWN0dXJlCisgICAgICB0aGVyZSwgYW5kIGFycmFuZ2UgdG8gcmV0dXJuIGEgcG9pbnRlciB0byB0aGlzIG5ldyBjb3B5LiAgSWYgdGhlIG1hcHBpbmcKKyAgICAgIGZhaWxzLCB0aGVuIGNsb3NlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaWYgaXQgd2FzIG9wZW5lZCBieSB1cywgYW5kIGFycmFuZ2UKKyAgICAgIHRvIHJldHVybiBhIE5VTEwuICovCisKKyAgaWYgKChtYmFzZSA9IG1kcCAtPiBtb3JlY29yZSAobWRwLCBzaXplb2YgKG10ZW1wKSkpICE9IE5VTEwpCisgICAgeworICAgICAgbWVtY3B5IChtYmFzZSwgbWRwLCBzaXplb2YgKG10ZW1wKSk7CisgICAgICBtZHAgPSAoc3RydWN0IG1kZXNjICopIG1iYXNlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChtZHAgLT4gZmxhZ3MgJiBNTUFMTE9DX0RFVlpFUk8pCisJeworCSAgY2xvc2UgKG1kcCAtPiBmZCk7CisJfQorICAgICAgbWRwID0gTlVMTDsKKyAgICB9CisKKyAgcmV0dXJuICgoUFRSKSBtZHApOworfQorCisvKiBHaXZlbiBhbiB2YWxpZCBmaWxlIGRlc2NyaXB0b3Igb24gYW4gb3BlbiBmaWxlLCB0ZXN0IHRvIHNlZSBpZiB0aGF0IGZpbGUKKyAgIGlzIGEgdmFsaWQgbW1hbGxvYyBwcm9kdWNlZCBmaWxlLCBhbmQgaWYgc28sIGF0dGVtcHQgdG8gcmVtYXAgaXQgaW50byB0aGUKKyAgIGN1cnJlbnQgcHJvY2VzcyBhdCB0aGUgc2FtZSBhZGRyZXNzIHRvIHdoaWNoIGl0IHdhcyBwcmV2aW91c2x5IG1hcHBlZC4KKworICAgTm90ZSB0aGF0IHdlIGhhdmUgdG8gdXBkYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IgbnVtYmVyIGluIHRoZSBtYWxsb2MtCisgICBkZXNjcmlwdG9yIHJlYWQgZnJvbSB0aGUgZmlsZSB0byBtYXRjaCB0aGUgY3VycmVudCB2YWxpZCBvbmUsIGJlZm9yZQorICAgdHJ5aW5nIHRvIG1hcCB0aGUgZmlsZSBpbiwgYW5kIGFnYWluIGFmdGVyIGEgc3VjY2Vzc2Z1bCBtYXBwaW5nIGFuZAorICAgYWZ0ZXIgd2UndmUgc3dpdGNoZWQgb3ZlciB0byB1c2luZyB0aGUgbWFwcGVkIGluIG1hbGxvYyBkZXNjcmlwdG9yIAorICAgcmF0aGVyIHRoYW4gdGhlIHRlbXBvcmFyeSBvbmUgb24gdGhlIHN0YWNrLgorCisgICBPbmNlIHdlJ3ZlIHN3aXRjaGVkIG92ZXIgdG8gdXNpbmcgdGhlIG1hcHBlZCBpbiBtYWxsb2MgZGVzY3JpcHRvciwgd2UKKyAgIGhhdmUgdG8gdXBkYXRlIHRoZSBwb2ludGVyIHRvIHRoZSBtb3JlY29yZSBmdW5jdGlvbiwgc2luY2UgaXQgYWxtb3N0CisgICBjZXJ0YWlubHkgd2lsbCBiZSBhdCBhIGRpZmZlcmVudCBhZGRyZXNzIGlmIHRoZSBwcm9jZXNzIHJldXNpbmcgdGhlCisgICBtYXBwZWQgcmVnaW9uIGlzIGZyb20gYSBkaWZmZXJlbnQgZXhlY3V0YWJsZS4KKworICAgQWxzbyBub3RlIHRoYXQgaWYgdGhlIGhlYXAgYmVpbmcgcmVtYXBwZWQgcHJldmlvdXNseSB1c2VkIHRoZSBtbWNoZWNrZigpCisgICByb3V0aW5lcywgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGhvb2tzIHNpbmNlIHRoZWlyIHRhcmdldCBmdW5jdGlvbnMKKyAgIHdpbGwgaGF2ZSBjZXJ0YWlubHkgbW92ZWQgaWYgdGhlIGV4ZWN1dGFibGUgaGFzIGNoYW5nZWQgaW4gYW55IHdheS4KKyAgIFdlIGRvIHRoaXMgYnkgY2FsbGluZyBtbWNoZWNrZigpIGludGVybmFsbHkuCisKKyAgIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBtYWxsb2MgZGVzY3JpcHRvciBpZiBzdWNjZXNzZnVsLCBvciBOVUxMIGlmCisgICB1bnN1Y2Nlc3NmdWwgZm9yIHNvbWUgcmVhc29uLiAqLworCitzdGF0aWMgc3RydWN0IG1kZXNjICoKK3JldXNlIChmZCkKKyAgaW50IGZkOworeworICBzdHJ1Y3QgbWRlc2MgbXRlbXA7CisgIHN0cnVjdCBtZGVzYyAqbWRwID0gTlVMTDsKKworICBpZiAoKGxzZWVrIChmZCwgMEwsIFNFRUtfU0VUKSA9PSAwKSAmJgorICAgICAgKHJlYWQgKGZkLCAoY2hhciAqKSAmbXRlbXAsIHNpemVvZiAobXRlbXApKSA9PSBzaXplb2YgKG10ZW1wKSkgJiYKKyAgICAgIChtdGVtcC5oZWFkZXJzaXplID09IHNpemVvZiAobXRlbXApKSAmJgorICAgICAgKHN0cmNtcCAobXRlbXAubWFnaWMsIE1NQUxMT0NfTUFHSUMpID09IDApICYmCisgICAgICAobXRlbXAudmVyc2lvbiA8PSBNTUFMTE9DX1ZFUlNJT04pKQorICAgIHsKKyAgICAgIG10ZW1wLmZkID0gZmQ7CisgICAgICBpZiAoX19tbWFsbG9jX3JlbWFwX2NvcmUgKCZtdGVtcCkgPT0gbXRlbXAuYmFzZSkKKwl7CisJICBtZHAgPSAoc3RydWN0IG1kZXNjICopIG10ZW1wLmJhc2U7CisJICBtZHAgLT4gZmQgPSBmZDsKKwkgIG1kcCAtPiBtb3JlY29yZSA9IF9fbW1hbGxvY19tbWFwX21vcmVjb3JlOworCSAgaWYgKG1kcCAtPiBtZnJlZV9ob29rICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBtbWNoZWNrZiAoKFBUUikgbWRwLCAodm9pZCAoKikgUEFSQU1TICgodm9pZCkpKSBOVUxMLCAxKTsKKwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybiAobWRwKTsKK30KKworI2Vsc2UJLyogIWRlZmluZWQgKEhBVkVfTU1BUCkgKi8KKworLyogRm9yIHN5c3RlbXMgd2l0aG91dCBtbWFwLCB0aGUgbGlicmFyeSBzdGlsbCBzdXBwbGllcyBhbiBlbnRyeSBwb2ludAorICAgdG8gbGluayB0bywgYnV0IHRyeWluZyB0byBpbml0aWFsaXplIGFjY2VzcyB0byBhbiBtbWFwJ2QgbWFuYWdlZCByZWdpb24KKyAgIGFsd2F5cyBmYWlscy4gKi8KKworLyogQVJHU1VTRUQgKi8KK1BUUgorbW1hbGxvY19hdHRhY2ggKGZkLCBiYXNlYWRkcikKKyAgaW50IGZkOworICBQVFIgYmFzZWFkZHI7Cit7CisgICByZXR1cm4gKE5VTEwpOworfQorCisjZW5kaWYJLyogZGVmaW5lZCAoSEFWRV9NTUFQKSAqLworCmRpZmYgLS1naXQgYS9tbWFsbG9jL2NvbmZpZ3VyZSBiL21tYWxsb2MvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU5MjYxOGMKLS0tIC9kZXYvbnVsbAorKysgYi9tbWFsbG9jL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDE2MjMgQEAKKyMhIC9iaW4vc2gKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2J1aWxkPU5PTkUKK2NhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2V4ZWNfcHJlZml4PU5PTkUKK2hvc3Q9Tk9ORQorbm9fY3JlYXRlPQorbm9ub3B0PU5PTkUKK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3RhcmdldD1OT05FCit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorc3ViZGlycz0KK01GTEFHUz0gTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT1tbWFsbG9jLmMKKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCithY19leGVleHQ9CithY19vYmpleHQ9bworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTI5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1NTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2MDg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjYzOTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjQ5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK21haW4oKXtyZXR1cm4oMCk7fQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY1MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCisgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKyAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubworICBlbHNlCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKKyAgZmkKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY3MzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Citjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY3ODogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6Njg3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjcwNjogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKK2lmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfY2NfZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3Njg6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KK2lmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKK2Vsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4MjU6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorCitob3N0X2FsaWFzPSRob3N0CitjYXNlICIkaG9zdF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKQorICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKKyAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaSA7OworICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKK2hvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4NDY6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKworYnVpbGRfYWxpYXM9JGJ1aWxkCitjYXNlICIkYnVpbGRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2J1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCitidWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2J1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAorYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKKworaWYgdGVzdCAkaG9zdCAhPSAkYnVpbGQ7IHRoZW4KKyAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KK2Vsc2UKKyAgYWNfdG9vbF9wcmVmaXg9CitmaQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXI7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODcyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCisgIGFjX2N2X3Byb2dfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQVI9IiR7YWNfdG9vbF9wcmVmaXh9YXIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX0FSIiAmJiBhY19jdl9wcm9nX0FSPSJhciIKK2ZpCitmaQorQVI9IiRhY19jdl9wcm9nX0FSIgoraWYgdGVzdCAtbiAiJEFSIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEFSIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkwMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCitpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTM0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgorZmkKK2ZpCitSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZWxzZQorICBSQU5MSUI9IjoiCitmaQorZmkKKworCitlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTY3OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0CisgICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCisgIENQUD0iJHtDQy1jY30gLUUiCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDk4MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6OTg4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5OTkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjEwMDU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwMTYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjEwMjI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9L2xpYi9jcHAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKKworZm9yIGFjX2hkciBpbiB1bmlzdGQuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwNTA6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDU1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDYwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwODk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwOTQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTExNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTE0MjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTE1MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKy8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgorICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6CisJbW1hcCBwcml2YXRlIG5vdCBmaXhlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKyAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCisgICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50CisgICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKKyAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKKyAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQorICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKKyAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0CisgICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KKworICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgorICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKKyAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQorICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLworI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCisjIGlmZGVmIEhBVkVfVU5JU1REX0gKKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBlbmRpZgorCisvKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLworIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQorIyBlbmRpZgorCisjIGlmZGVmIF9TQ19QQUdFU0laRQorIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCisjIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCisjICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICAgaWZkZWYgRVhFQ19QQUdFU0laRQorIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCisjICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICAgIGlmZGVmIE5CUEcKKyMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKKyMgICAgIGlmbmRlZiBDTFNJWkUKKyMgICAgICBkZWZpbmUgQ0xTSVpFIDEKKyMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLworIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KKyMgICAgIGlmZGVmIE5CUEMKKyMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCisjICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KKyMgICAgICBpZmRlZiBQQUdFU0laRQorIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQorIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCisjICAgICBlbmRpZiAvKiBubyBOQlBDICovCisjICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KKyMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLworIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKworI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQorI2Vsc2UKK2NoYXIgKm1hbGxvYygpOworI2VuZGlmCisKK2ludAorbWFpbigpCit7CisJY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7CisJaW50IGksIHBhZ2VzaXplOworCWludCBmZDsKKworCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKKworCS8qCisJICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgorCSAqLworCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJKihkYXRhICsgaSkgPSByYW5kKCk7CisJdW1hc2soMCk7CisJZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgxKTsKKwlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKwkJZXhpdCgxKTsKKwljbG9zZShmZCk7CisKKwkvKgorCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAorCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKKwkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgorCSAqLworCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7CisJaWYgKCFkYXRhMikKKwkJZXhpdCgxKTsKKwlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7CisJaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKKwkJCWV4aXQoMSk7CisKKwkvKgorCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCisJICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgorCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOworCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEzKQorCQlleGl0KDEpOworCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQorCQkJZXhpdCgxKTsKKwljbG9zZShmZCk7CisJdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKKwlleGl0KDApOworfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI5MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX01NQVAgMQorRU9GCisKK2ZpCisKK2ZvciBhY19oZHIgaW4gbGltaXRzLmggc3RkZGVmLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzE2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTMyMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTMyNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKwordHJhcCAnJyAxIDIgMTUKK2NhdCA+IGNvbmZjYWNoZSA8PFxFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgorIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAorIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCisjIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgorIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCisjIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgorIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCisjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworRU9GCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKyhzZXQpIDI+JjEgfAorICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjEgfCBncmVwIGFjX3NwYWNlYCBpbgorICAqYWNfc3BhY2U9XCAqKQorICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCisgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICBzZWQgLW4gXAorICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKKyAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKyAgICA7OworICAqKQorICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJworICAgIDs7CisgIGVzYWMgPj4gY29uZmNhY2hlCitpZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKyMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCitmaQorCit0cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBERUZTLgorIyBQcm90ZWN0IGFnYWluc3Qgc2hlbGwgZXhwYW5zaW9uIHdoaWxlIGV4ZWN1dGluZyBNYWtlZmlsZSBydWxlcy4KKyMgUHJvdGVjdCBhZ2FpbnN0IE1ha2VmaWxlIG1hY3JvIGV4cGFuc2lvbi4KK2NhdCA+IGNvbmZ0ZXN0LmRlZnMgPDxcRU9GCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUtRFwxPVwyJWcKK3MlWyAJYH4jJF4mKigpe31cXHw7JyI8Pj9dJVxcJiVnCitzJVxbJVxcJiVnCitzJVxdJVxcJiVnCitzJVwkJSQkJWcKK0VPRgorREVGUz1gc2VkIC1mIGNvbmZ0ZXN0LmRlZnMgY29uZmRlZnMuaCB8IHRyICdcMDEyJyAnICdgCitybSAtZiBjb25mdGVzdC5kZWZzCisKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCithY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KK3NlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Cisgcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKKyRhY192cHN1YgorJGV4dHJhc3ViCitzJUBTSEVMTEAlJFNIRUxMJWcKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBDQ0AlJENDJWcKK3MlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCitzJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZworcyVAaG9zdEAlJGhvc3QlZworcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZworcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCitzJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKK3MlQGhvc3Rfb3NAJSRob3N0X29zJWcKK3MlQGJ1aWxkQCUkYnVpbGQlZworcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCitzJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZworcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKK3MlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZworcyVAQVJAJSRBUiVnCitzJUBSQU5MSUJAJSRSQU5MSUIlZworcyVAQ1BQQCUkQ1BQJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KKyAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OworICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKK3MlQElOU1RBTExAJSRJTlNUQUxMJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworZXhpdCAwCitFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCitybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwordGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisKZGlmZiAtLWdpdCBhL21tYWxsb2MvY29uZmlndXJlLmluIGIvbW1hbGxvYy9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxMjY2MQotLS0gL2Rldi9udWxsCisrKyBiL21tYWxsb2MvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsMTMgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorQUNfUFJFUkVRKDIuMTIuMSlkbmwKK0FDX0lOSVQobW1hbGxvYy5jKQorCitBQ19QUk9HX0NDCitBQ19QUk9HX0lOU1RBTEwKK0FDX0NIRUNLX1RPT0woQVIsIGFyKQorQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgOikKKworQUNfRlVOQ19NTUFQCitBQ19DSEVDS19IRUFERVJTKGxpbWl0cy5oIHN0ZGRlZi5oKQorCitBQ19PVVRQVVQoTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9tbWFsbG9jL2RldGFjaC5jIGIvbW1hbGxvYy9kZXRhY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzgwNjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbW1hbGxvYy9kZXRhY2guYwpAQCAtMCwwICsxLDcxIEBACisvKiBGaW5pc2ggYWNjZXNzIHRvIGEgbW1hcCdkIG1hbGxvYyBtYW5hZ2VkIHJlZ2lvbi4KKyAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBDb250cmlidXRlZCBieSBGcmVkIEZpc2ggYXQgQ3lnbnVzIFN1cHBvcnQuICAgZm5mQGN5Z251cy5jb20KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKK1RoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCitMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKK25vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAibW1wcml2YXRlLmgiCisKKy8qIFRlcm1pbmF0ZSBhY2Nlc3MgdG8gYSBtbWFsbG9jIG1hbmFnZWQgcmVnaW9uIGJ5IHVubWFwcGluZyBhbGwgbWVtb3J5IHBhZ2VzCisgICBhc3NvY2lhdGVkIHdpdGggdGhlIHJlZ2lvbiwgYW5kIGNsb3NpbmcgdGhlIGZpbGUgZGVzY3JpcHRvciBpZiBpdCBpcyBvbmUKKyAgIHRoYXQgd2Ugb3BlbmVkLgorCisgICBSZXR1cm5zIE5VTEwgb24gc3VjY2Vzcy4KKworICAgUmV0dXJucyB0aGUgbWFsbG9jIGRlc2NyaXB0b3Igb24gZmFpbHVyZSwgd2hpY2ggY2FuIHN1YnNlcXVlbnRseSBiZSB1c2VkCisgICBmb3IgZnVydGhlciBhY3Rpb24sIHN1Y2ggYXMgb2J0YWluaW5nIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5hdHVyZSBvZgorICAgdGhlIGZhaWx1cmUgYnkgZXhhbWluaW5nIHRoZSBwcmVzZXJ2ZWQgZXJybm8gdmFsdWUuCisKKyAgIE5vdGUgdGhhdCB0aGUgbWFsbG9jIGRlc2NyaXB0b3IgdGhhdCB3ZSBhcmUgdXNpbmcgaXMgY3VycmVudGx5IGxvY2F0ZWQgaW4KKyAgIHJlZ2lvbiB3ZSBhcmUgYWJvdXQgdG8gdW5tYXAsIHNvIHdlIGZpcnN0IG1ha2UgYSBsb2NhbCBjb3B5IG9mIGl0IG9uIHRoZQorICAgc3RhY2sgYW5kIHVzZSB0aGUgY29weS4gKi8KKworUFRSCittbWFsbG9jX2RldGFjaCAobWQpCisgICAgIFBUUiBtZDsKK3sKKyAgc3RydWN0IG1kZXNjIG10ZW1wOworCisgIGlmIChtZCAhPSBOVUxMKQorICAgIHsKKworICAgICAgbXRlbXAgPSAqKHN0cnVjdCBtZGVzYyAqKSBtZDsKKyAgICAgIAorICAgICAgLyogTm93IHVubWFwIGFsbCB0aGUgcGFnZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVnaW9uIGJ5IGFza2luZyBmb3IgYQorCSBuZWdhdGl2ZSBpbmNyZW1lbnQgZXF1YWwgdG8gdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgcmVnaW9uLiAqLworICAgICAgCisgICAgICBpZiAoKG10ZW1wLm1vcmVjb3JlICgmbXRlbXAsIG10ZW1wLmJhc2UgLSBtdGVtcC5icmVha3ZhbCkpID09IE5VTEwpCisJeworCSAgLyogRGVhbGxvY2F0aW5nIGZhaWxlZC4gIFVwZGF0ZSB0aGUgb3JpZ2luYWwgbWFsbG9jIGRlc2NyaXB0b3IKKwkgICAgIHdpdGggYW55IGNoYW5nZXMgKi8KKwkgICooc3RydWN0IG1kZXNjICopIG1kID0gbXRlbXA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmIChtdGVtcC5mbGFncyAmIE1NQUxMT0NfREVWWkVSTykKKwkgICAgeworCSAgICAgIGNsb3NlIChtdGVtcC5mZCk7CisJICAgIH0KKwkgIG1kID0gTlVMTDsKKwl9CisgICAgfQorCisgIHJldHVybiAobWQpOworfQpkaWZmIC0tZ2l0IGEvbW1hbGxvYy9rZXlzLmMgYi9tbWFsbG9jL2tleXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWYwMGQxCi0tLSAvZGV2L251bGwKKysrIGIvbW1hbGxvYy9rZXlzLmMKQEAgLTAsMCArMSw2NiBAQAorLyogQWNjZXNzIGZvciBhcHBsaWNhdGlvbiBrZXlzIGluIG1tYXAnZCBtYWxsb2MgbWFuYWdlZCByZWdpb24uCisgICBDb3B5cmlnaHQgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgQ29udHJpYnV0ZWQgYnkgRnJlZCBGaXNoIGF0IEN5Z251cyBTdXBwb3J0LiAgIGZuZkBjeWdudXMuY29tCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCitUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCitub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYWNjZXNzIHRvIHNvbWUga2V5cyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBjYW4gdXNlIHRvCisgICBwcm92aWRlIHBlcnNpc3RlbnQgYWNjZXNzIHRvIGxvY2F0aW9ucyBpbiB0aGUgbWFwcGVkIG1lbW9yeSBzZWN0aW9uLgorICAgVGhlIGludGVudCBpcyB0aGF0IHRoZXNlIGtleXMgYXJlIHRvIGJlIHVzZWQgc3BhcmluZ2x5IGFzIHNvcnQgb2YKKyAgIHBlcnNpc3RlbnQgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCB0aGUgYXBwbGljYXRpb24gY2FuIHVzZSB0byByZWluaXRpYWxpemUKKyAgIGFjY2VzcyB0byBkYXRhIGluIHRoZSBtYXBwZWQgcmVnaW9uLgorCisgICBGb3IgdGhlIG1vbWVudCwgdGhlc2Uga2V5cyBhcmUgc2ltcGx5IHN0b3JlZCBpbiB0aGUgbWFsbG9jIGRlc2NyaXB0b3IKKyAgIGl0c2VsZiwgaW4gYW4gYXJyYXkgb2YgZml4ZWQgbGVuZ3RoLiAgVGhpcyBzaG91bGQgYmUgZml4ZWQgc28gdGhhdCB0aGVyZQorICAgY2FuIGJlIGFuIHVubGltaXRlZCBudW1iZXIgb2Yga2V5cywgcG9zc2libHkgdXNpbmcgYSBtdWx0aWxldmVsIGFjY2VzcworICAgc2NoZW1lIG9mIHNvbWUgc29ydC4gKi8KKworI2luY2x1ZGUgIm1tcHJpdmF0ZS5oIgorCitpbnQKK21tYWxsb2Nfc2V0a2V5IChtZCwga2V5bnVtLCBrZXkpCisgIFBUUiBtZDsgICAgIAorICBpbnQga2V5bnVtOworICBQVFIga2V5OworeworICBzdHJ1Y3QgbWRlc2MgKm1kcCA9IChzdHJ1Y3QgbWRlc2MgKikgbWQ7CisgIGludCByZXN1bHQgPSAwOworCisgIGlmICgobWRwICE9IE5VTEwpICYmIChrZXludW0gPj0gMCkgJiYgKGtleW51bSA8IE1NQUxMT0NfS0VZUykpCisgICAgeworICAgICAgbWRwIC0+IGtleXMgW2tleW51bV0gPSBrZXk7CisgICAgICByZXN1bHQrKzsKKyAgICB9CisgIHJldHVybiAocmVzdWx0KTsKK30KKworUFRSCittbWFsbG9jX2dldGtleSAobWQsIGtleW51bSkKKyAgUFRSIG1kOyAgICAgCisgIGludCBrZXludW07Cit7CisgIHN0cnVjdCBtZGVzYyAqbWRwID0gKHN0cnVjdCBtZGVzYyAqKSBtZDsKKyAgUFRSIGtleXZhbCA9IE5VTEw7CisKKyAgaWYgKChtZHAgIT0gTlVMTCkgJiYgKGtleW51bSA+PSAwKSAmJiAoa2V5bnVtIDwgTU1BTExPQ19LRVlTKSkKKyAgICB7CisgICAgICBrZXl2YWwgPSBtZHAgLT4ga2V5cyBba2V5bnVtXTsKKyAgICB9CisgIHJldHVybiAoa2V5dmFsKTsKK30KZGlmZiAtLWdpdCBhL21tYWxsb2MvbWNhbGxvYy5jIGIvbW1hbGxvYy9tY2FsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlmY2MwNwotLS0gL2Rldi9udWxsCisrKyBiL21tYWxsb2MvbWNhbGxvYy5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCitUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCitub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAgLyogR0NDIG9uIEhQL1VYIG5lZWRzIHRoaXMgYmVmb3JlIHN0cmluZy5oLiAqLworI2luY2x1ZGUgPHN0cmluZy5oPgkvKiBQcm90b3R5cGVzIGZvciBtZW1jcHksIG1lbW1vdmUsIG1lbXNldCwgZXRjICovCisKKyNpbmNsdWRlICJtbXByaXZhdGUuaCIKKworLyogQWxsb2NhdGUgYW4gYXJyYXkgb2YgTk1FTUIgZWxlbWVudHMgZWFjaCBTSVpFIGJ5dGVzIGxvbmcuCisgICBUaGUgZW50aXJlIGFycmF5IGlzIGluaXRpYWxpemVkIHRvIHplcm9zLiAgKi8KKworUFRSCittY2FsbG9jIChtZCwgbm1lbWIsIHNpemUpCisgIFBUUiBtZDsKKyAgcmVnaXN0ZXIgc2l6ZV90IG5tZW1iOworICByZWdpc3RlciBzaXplX3Qgc2l6ZTsKK3sKKyAgcmVnaXN0ZXIgUFRSIHJlc3VsdDsKKworICBpZiAoKHJlc3VsdCA9IG1tYWxsb2MgKG1kLCBubWVtYiAqIHNpemUpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIG1lbXNldCAocmVzdWx0LCAwLCBubWVtYiAqIHNpemUpOworICAgIH0KKyAgcmV0dXJuIChyZXN1bHQpOworfQorCisvKiBXaGVuIHVzaW5nIHRoaXMgcGFja2FnZSwgcHJvdmlkZSBhIHZlcnNpb24gb2YgbWFsbG9jL3JlYWxsb2MvZnJlZSBidWlsdAorICAgb24gdG9wIG9mIGl0LCBzbyB0aGF0IGlmIHdlIHVzZSB0aGUgZGVmYXVsdCBzYnJrKCkgcmVnaW9uIHdlIHdpbGwgbm90CisgICBjb2xsaWRlIHdpdGggYW5vdGhlciBtYWxsb2MgcGFja2FnZSB0cnlpbmcgdG8gZG8gdGhlIHNhbWUgdGhpbmcsIGlmCisgICB0aGUgYXBwbGljYXRpb24gY29udGFpbnMgYW55ICJoaWRkZW4iIGNhbGxzIHRvIG1hbGxvYy9yZWFsbG9jL2ZyZWUgKHN1Y2gKKyAgIGFzIGluc2lkZSBhIHN5c3RlbSBsaWJyYXJ5KS4gKi8KKworUFRSCitjYWxsb2MgKG5tZW1iLCBzaXplKQorICBzaXplX3Qgbm1lbWI7CisgIHNpemVfdCBzaXplOworeworICByZXR1cm4gKG1jYWxsb2MgKChQVFIpIE5VTEwsIG5tZW1iLCBzaXplKSk7Cit9CmRpZmYgLS1naXQgYS9tbWFsbG9jL21mcmVlLmMgYi9tbWFsbG9jL21mcmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwOWFjNgotLS0gL2Rldi9udWxsCisrKyBiL21tYWxsb2MvbWZyZWUuYwpAQCAtMCwwICsxLDI0NyBAQAorLyogRnJlZSBhIGJsb2NrIG9mIG1lbW9yeSBhbGxvY2F0ZWQgYnkgYG1tYWxsb2MnLgorICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgIFdyaXR0ZW4gTWF5IDE5ODkgYnkgTWlrZSBIYWVydGVsLgorICAgSGVhdmlseSBtb2RpZmllZCBNYXIgMTk5MiBieSBGcmVkIEZpc2guICAoZm5mQGN5Z251cy5jb20pCisKK1RoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCitMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKK25vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyAgIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgKEVtYWlsKSBhdCB0aGUgYWRkcmVzcyBtaWtlQGFpLm1pdC5lZHUsCisgICBvciAoVVMgbWFpbCkgYXMgTWlrZSBIYWVydGVsIGMvbyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICovCisKKyNpbmNsdWRlICJtbXByaXZhdGUuaCIKKworLyogUmV0dXJuIG1lbW9yeSB0byB0aGUgaGVhcC4KKyAgIExpa2UgYG1mcmVlJyBidXQgZG9uJ3QgY2FsbCBhIG1mcmVlX2hvb2sgaWYgdGhlcmUgaXMgb25lLiAgKi8KKwordm9pZAorX19tbWFsbG9jX2ZyZWUgKG1kcCwgcHRyKQorICBzdHJ1Y3QgbWRlc2MgKm1kcDsKKyAgUFRSIHB0cjsKK3sKKyAgaW50IHR5cGU7CisgIHNpemVfdCBibG9jaywgYmxvY2tzOworICByZWdpc3RlciBzaXplX3QgaTsKKyAgc3RydWN0IGxpc3QgKnByZXYsICpuZXh0OworCisgIGJsb2NrID0gQkxPQ0sgKHB0cik7CisKKyAgdHlwZSA9IG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS50eXBlOworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIC8qIEdldCBhcyBtYW55IHN0YXRpc3RpY3MgYXMgZWFybHkgYXMgd2UgY2FuLiAgKi8KKyAgICAgIG1kcCAtPiBoZWFwc3RhdHMuY2h1bmtzX3VzZWQtLTsKKyAgICAgIG1kcCAtPiBoZWFwc3RhdHMuYnl0ZXNfdXNlZCAtPQorCSAgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LmluZm8uc2l6ZSAqIEJMT0NLU0laRTsKKyAgICAgIG1kcCAtPiBoZWFwc3RhdHMuYnl0ZXNfZnJlZSArPQorCSAgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LmluZm8uc2l6ZSAqIEJMT0NLU0laRTsKKworICAgICAgLyogRmluZCB0aGUgZnJlZSBjbHVzdGVyIHByZXZpb3VzIHRvIHRoaXMgb25lIGluIHRoZSBmcmVlIGxpc3QuCisJIFN0YXJ0IHNlYXJjaGluZyBhdCB0aGUgbGFzdCBibG9jayByZWZlcmVuY2VkOyB0aGlzIG1heSBiZW5lZml0CisJIHByb2dyYW1zIHdpdGggbG9jYWxpdHkgb2YgYWxsb2NhdGlvbi4gICovCisgICAgICBpID0gbWRwIC0+IGhlYXBpbmRleDsKKyAgICAgIGlmIChpID4gYmxvY2spCisJeworCSAgd2hpbGUgKGkgPiBibG9jaykKKwkgICAgeworCSAgICAgIGkgPSBtZHAgLT4gaGVhcGluZm9baV0uZnJlZS5wcmV2OworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGRvCisJICAgIHsKKwkgICAgICBpID0gbWRwIC0+IGhlYXBpbmZvW2ldLmZyZWUubmV4dDsKKwkgICAgfQorCSAgd2hpbGUgKChpICE9IDApICYmIChpIDwgYmxvY2spKTsKKwkgIGkgPSBtZHAgLT4gaGVhcGluZm9baV0uZnJlZS5wcmV2OworCX0KKworICAgICAgLyogRGV0ZXJtaW5lIGhvdyB0byBsaW5rIHRoaXMgYmxvY2sgaW50byB0aGUgZnJlZSBsaXN0LiAgKi8KKyAgICAgIGlmIChibG9jayA9PSBpICsgbWRwIC0+IGhlYXBpbmZvW2ldLmZyZWUuc2l6ZSkKKwl7CisJICAvKiBDb2FsZXNjZSB0aGlzIGJsb2NrIHdpdGggaXRzIHByZWRlY2Vzc29yLiAgKi8KKwkgIG1kcCAtPiBoZWFwaW5mb1tpXS5mcmVlLnNpemUgKz0KKwkgICAgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LmluZm8uc2l6ZTsKKwkgIGJsb2NrID0gaTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogUmVhbGx5IGxpbmsgdGhpcyBibG9jayBiYWNrIGludG8gdGhlIGZyZWUgbGlzdC4gICovCisJICBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUuc2l6ZSA9CisJICAgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLnNpemU7CisJICBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUubmV4dCA9IG1kcCAtPiBoZWFwaW5mb1tpXS5mcmVlLm5leHQ7CisJICBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUucHJldiA9IGk7CisJICBtZHAgLT4gaGVhcGluZm9baV0uZnJlZS5uZXh0ID0gYmxvY2s7CisJICBtZHAgLT4gaGVhcGluZm9bbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLm5leHRdLmZyZWUucHJldiA9IGJsb2NrOworCSAgbWRwIC0+IGhlYXBzdGF0cy5jaHVua3NfZnJlZSsrOworCX0KKworICAgICAgLyogTm93IHRoYXQgdGhlIGJsb2NrIGlzIGxpbmtlZCBpbiwgc2VlIGlmIHdlIGNhbiBjb2FsZXNjZSBpdAorCSB3aXRoIGl0cyBzdWNjZXNzb3IgKGJ5IGRlbGV0aW5nIGl0cyBzdWNjZXNzb3IgZnJvbSB0aGUgbGlzdAorCSBhbmQgYWRkaW5nIGluIGl0cyBzaXplKS4gICovCisgICAgICBpZiAoYmxvY2sgKyBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUuc2l6ZSA9PQorCSAgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLm5leHQpCisJeworCSAgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLnNpemUKKwkgICAgKz0gbWRwIC0+IGhlYXBpbmZvW21kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5uZXh0XS5mcmVlLnNpemU7CisJICBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUubmV4dAorCSAgICA9IG1kcCAtPiBoZWFwaW5mb1ttZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUubmV4dF0uZnJlZS5uZXh0OworCSAgbWRwIC0+IGhlYXBpbmZvW21kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5uZXh0XS5mcmVlLnByZXYgPSBibG9jazsKKwkgIG1kcCAtPiBoZWFwc3RhdHMuY2h1bmtzX2ZyZWUtLTsKKwl9CisKKyAgICAgIC8qIE5vdyBzZWUgaWYgd2UgY2FuIHJldHVybiBzdHVmZiB0byB0aGUgc3lzdGVtLiAgKi8KKyAgICAgIGJsb2NrcyA9IG1kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5zaXplOworICAgICAgaWYgKGJsb2NrcyA+PSBGSU5BTF9GUkVFX0JMT0NLUyAmJiBibG9jayArIGJsb2NrcyA9PSBtZHAgLT4gaGVhcGxpbWl0CisJICAmJiBtZHAgLT4gbW9yZWNvcmUgKG1kcCwgMCkgPT0gQUREUkVTUyAoYmxvY2sgKyBibG9ja3MpKQorCXsKKwkgIHJlZ2lzdGVyIHNpemVfdCBieXRlcyA9IGJsb2NrcyAqIEJMT0NLU0laRTsKKwkgIG1kcCAtPiBoZWFwbGltaXQgLT0gYmxvY2tzOworCSAgbWRwIC0+IG1vcmVjb3JlIChtZHAsIC1ieXRlcyk7CisJICBtZHAgLT4gaGVhcGluZm9bbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLnByZXZdLmZyZWUubmV4dAorCSAgICA9IG1kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5uZXh0OworCSAgbWRwIC0+IGhlYXBpbmZvW21kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5uZXh0XS5mcmVlLnByZXYKKwkgICAgPSBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUucHJldjsKKwkgIGJsb2NrID0gbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLnByZXY7CisJICBtZHAgLT4gaGVhcHN0YXRzLmNodW5rc19mcmVlLS07CisJICBtZHAgLT4gaGVhcHN0YXRzLmJ5dGVzX2ZyZWUgLT0gYnl0ZXM7CisJfQorCisgICAgICAvKiBTZXQgdGhlIG5leHQgc2VhcmNoIHRvIGJlZ2luIGF0IHRoaXMgYmxvY2suICAqLworICAgICAgbWRwIC0+IGhlYXBpbmRleCA9IGJsb2NrOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgLyogRG8gc29tZSBvZiB0aGUgc3RhdGlzdGljcy4gICovCisgICAgICBtZHAgLT4gaGVhcHN0YXRzLmNodW5rc191c2VkLS07CisgICAgICBtZHAgLT4gaGVhcHN0YXRzLmJ5dGVzX3VzZWQgLT0gMSA8PCB0eXBlOworICAgICAgbWRwIC0+IGhlYXBzdGF0cy5jaHVua3NfZnJlZSsrOworICAgICAgbWRwIC0+IGhlYXBzdGF0cy5ieXRlc19mcmVlICs9IDEgPDwgdHlwZTsKKworICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBmcmVlIGZyYWdtZW50IGluIHRoaXMgYmxvY2suICAqLworICAgICAgcHJldiA9IChzdHJ1Y3QgbGlzdCAqKQorCSgoY2hhciAqKSBBRERSRVNTKGJsb2NrKSArCisJIChtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmJ1c3kuaW5mby5mcmFnLmZpcnN0IDw8IHR5cGUpKTsKKworICAgICAgaWYgKG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLmZyYWcubmZyZWUgPT0KKwkgIChCTE9DS1NJWkUgPj4gdHlwZSkgLSAxKQorCXsKKwkgIC8qIElmIGFsbCBmcmFnbWVudHMgb2YgdGhpcyBibG9jayBhcmUgZnJlZSwgcmVtb3ZlIHRoZW0KKwkgICAgIGZyb20gdGhlIGZyYWdtZW50IGxpc3QgYW5kIGZyZWUgdGhlIHdob2xlIGJsb2NrLiAgKi8KKwkgIG5leHQgPSBwcmV2OworCSAgZm9yIChpID0gMTsgaSA8IChzaXplX3QpIChCTE9DS1NJWkUgPj4gdHlwZSk7ICsraSkKKwkgICAgeworCSAgICAgIG5leHQgPSBuZXh0IC0+IG5leHQ7CisJICAgIH0KKwkgIHByZXYgLT4gcHJldiAtPiBuZXh0ID0gbmV4dDsKKwkgIGlmIChuZXh0ICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBuZXh0IC0+IHByZXYgPSBwcmV2IC0+IHByZXY7CisJICAgIH0KKwkgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS50eXBlID0gMDsKKwkgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLnNpemUgPSAxOworCisJICAvKiBLZWVwIHRoZSBzdGF0aXN0aWNzIGFjY3VyYXRlLiAgKi8KKwkgIG1kcCAtPiBoZWFwc3RhdHMuY2h1bmtzX3VzZWQrKzsKKwkgIG1kcCAtPiBoZWFwc3RhdHMuYnl0ZXNfdXNlZCArPSBCTE9DS1NJWkU7CisJICBtZHAgLT4gaGVhcHN0YXRzLmNodW5rc19mcmVlIC09IEJMT0NLU0laRSA+PiB0eXBlOworCSAgbWRwIC0+IGhlYXBzdGF0cy5ieXRlc19mcmVlIC09IEJMT0NLU0laRTsKKworCSAgbWZyZWUgKChQVFIpIG1kcCwgKFBUUikgQUREUkVTUyhibG9jaykpOworCX0KKyAgICAgIGVsc2UgaWYgKG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLmZyYWcubmZyZWUgIT0gMCkKKwl7CisJICAvKiBJZiBzb21lIGZyYWdtZW50cyBvZiB0aGlzIGJsb2NrIGFyZSBmcmVlLCBsaW5rIHRoaXMKKwkgICAgIGZyYWdtZW50IGludG8gdGhlIGZyYWdtZW50IGxpc3QgYWZ0ZXIgdGhlIGZpcnN0IGZyZWUKKwkgICAgIGZyYWdtZW50IG9mIHRoaXMgYmxvY2suICovCisJICBuZXh0ID0gKHN0cnVjdCBsaXN0ICopIHB0cjsKKwkgIG5leHQgLT4gbmV4dCA9IHByZXYgLT4gbmV4dDsKKwkgIG5leHQgLT4gcHJldiA9IHByZXY7CisJICBwcmV2IC0+IG5leHQgPSBuZXh0OworCSAgaWYgKG5leHQgLT4gbmV4dCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgbmV4dCAtPiBuZXh0IC0+IHByZXYgPSBuZXh0OworCSAgICB9CisJICArK21kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLmZyYWcubmZyZWU7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIE5vIGZyYWdtZW50cyBvZiB0aGlzIGJsb2NrIGFyZSBmcmVlLCBzbyBsaW5rIHRoaXMKKwkgICAgIGZyYWdtZW50IGludG8gdGhlIGZyYWdtZW50IGxpc3QgYW5kIGFubm91bmNlIHRoYXQKKwkgICAgIGl0IGlzIHRoZSBmaXJzdCBmcmVlIGZyYWdtZW50IG9mIHRoaXMgYmxvY2suICovCisJICBwcmV2ID0gKHN0cnVjdCBsaXN0ICopIHB0cjsKKwkgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLmZyYWcubmZyZWUgPSAxOworCSAgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LmluZm8uZnJhZy5maXJzdCA9CisJICAgIFJFU0lEVUFMIChwdHIsIEJMT0NLU0laRSkgPj4gdHlwZTsKKwkgIHByZXYgLT4gbmV4dCA9IG1kcCAtPiBmcmFnaGVhZFt0eXBlXS5uZXh0OworCSAgcHJldiAtPiBwcmV2ID0gJm1kcCAtPiBmcmFnaGVhZFt0eXBlXTsKKwkgIHByZXYgLT4gcHJldiAtPiBuZXh0ID0gcHJldjsKKwkgIGlmIChwcmV2IC0+IG5leHQgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIHByZXYgLT4gbmV4dCAtPiBwcmV2ID0gcHJldjsKKwkgICAgfQorCX0KKyAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogUmV0dXJuIG1lbW9yeSB0byB0aGUgaGVhcC4gICovCisKK3ZvaWQKK21mcmVlIChtZCwgcHRyKQorICBQVFIgbWQ7CisgIFBUUiBwdHI7Cit7CisgIHN0cnVjdCBtZGVzYyAqbWRwOworICByZWdpc3RlciBzdHJ1Y3QgYWxpZ25saXN0ICpsOworCisgIGlmIChwdHIgIT0gTlVMTCkKKyAgICB7CisgICAgICBtZHAgPSBNRF9UT19NRFAgKG1kKTsKKyAgICAgIGZvciAobCA9IG1kcCAtPiBhbGlnbmVkX2Jsb2NrczsgbCAhPSBOVUxMOyBsID0gbCAtPiBuZXh0KQorCXsKKwkgIGlmIChsIC0+IGFsaWduZWQgPT0gcHRyKQorCSAgICB7CisJICAgICAgbCAtPiBhbGlnbmVkID0gTlVMTDsgIC8qIE1hcmsgdGhlIHNsb3QgaW4gdGhlIGxpc3QgYXMgZnJlZS4gKi8KKwkgICAgICBwdHIgPSBsIC0+IGV4YWN0OworCSAgICAgIGJyZWFrOworCSAgICB9CisJfSAgICAgIAorICAgICAgaWYgKG1kcCAtPiBtZnJlZV9ob29rICE9IE5VTEwpCisJeworCSAgKCptZHAgLT4gbWZyZWVfaG9vaykgKG1kLCBwdHIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfX21tYWxsb2NfZnJlZSAobWRwLCBwdHIpOworCX0KKyAgICB9Cit9CisKKy8qIFdoZW4gdXNpbmcgdGhpcyBwYWNrYWdlLCBwcm92aWRlIGEgdmVyc2lvbiBvZiBtYWxsb2MvcmVhbGxvYy9mcmVlIGJ1aWx0CisgICBvbiB0b3Agb2YgaXQsIHNvIHRoYXQgaWYgd2UgdXNlIHRoZSBkZWZhdWx0IHNicmsoKSByZWdpb24gd2Ugd2lsbCBub3QKKyAgIGNvbGxpZGUgd2l0aCBhbm90aGVyIG1hbGxvYyBwYWNrYWdlIHRyeWluZyB0byBkbyB0aGUgc2FtZSB0aGluZywgaWYKKyAgIHRoZSBhcHBsaWNhdGlvbiBjb250YWlucyBhbnkgImhpZGRlbiIgY2FsbHMgdG8gbWFsbG9jL3JlYWxsb2MvZnJlZSAoc3VjaAorICAgYXMgaW5zaWRlIGEgc3lzdGVtIGxpYnJhcnkpLiAqLworCit2b2lkCitmcmVlIChwdHIpCisgIFBUUiBwdHI7Cit7CisgIG1mcmVlICgoUFRSKSBOVUxMLCBwdHIpOworfQpkaWZmIC0tZ2l0IGEvbW1hbGxvYy9tbS5jIGIvbW1hbGxvYy9tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NTVmMDkKLS0tIC9kZXYvbnVsbAorKysgYi9tbWFsbG9jL21tLmMKQEAgLTAsMCArMSwzNyBAQAorLyogQnVpbGQgdGhlIGVudGlyZSBtbWFsbG9jIGxpYnJhcnkgYXMgYSBzaW5nbGUgb2JqZWN0IG1vZHVsZS4gVGhpcworICAgYXZvaWRzIGhhdmluZyBjbGllbnRzIHBpY2sgdXAgcGFydCBvZiB0aGVpciBhbGxvY2F0aW9uIHJvdXRpbmVzCisgICBmcm9tIG1tYWxsb2MgYW5kIHBhcnQgZnJvbSBsaWJjLCB3aGljaCByZXN1bHRzIGluIHVuZGVmaW5lZAorICAgYmVoYXZpb3IuICBJdCBzaG91bGQgYWxzbyBzdGlsbCBiZSBwb3NzaWJsZSB0byBidWlsZCB0aGUgbGlicmFyeQorICAgYXMgYSBzdGFuZGFyZCBsaWJyYXJ5IHdpdGggbXVsdGlwbGUgb2JqZWN0cy4KKworICAgQ29weXJpZ2h0IDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKK1RoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCitMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKK25vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKyNpbmNsdWRlICJtY2FsbG9jLmMiCisjaW5jbHVkZSAibWZyZWUuYyIKKyNpbmNsdWRlICJtbWFsbG9jLmMiCisjaW5jbHVkZSAibW1jaGVjay5jIgorI2luY2x1ZGUgIm1tZW1hbGlnbi5jIgorI2luY2x1ZGUgIm1tc3RhdHMuYyIKKyNpbmNsdWRlICJtbXRyYWNlLmMiCisjaW5jbHVkZSAibXJlYWxsb2MuYyIKKyNpbmNsdWRlICJtdmFsbG9jLmMiCisjaW5jbHVkZSAibW1hcC1zdXAuYyIKKyNpbmNsdWRlICJhdHRhY2guYyIKKyNpbmNsdWRlICJkZXRhY2guYyIKKyNpbmNsdWRlICJrZXlzLmMiCisjaW5jbHVkZSAic2Jyay1zdXAuYyIKZGlmZiAtLWdpdCBhL21tYWxsb2MvbW1hbGxvYy5jIGIvbW1hbGxvYy9tbWFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M2MGZlMgotLS0gL2Rldi9udWxsCisrKyBiL21tYWxsb2MvbW1hbGxvYy5jCkBAIC0wLDAgKzEsMzM3IEBACisvKiBNZW1vcnkgYWxsb2NhdG9yIGBtYWxsb2MnLgorICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgIFdyaXR0ZW4gTWF5IDE5ODkgYnkgTWlrZSBIYWVydGVsLgorICAgSGVhdmlseSBtb2RpZmllZCBNYXIgMTk5MiBieSBGcmVkIEZpc2ggZm9yIG1tYXAnZCB2ZXJzaW9uLgorCitUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCitub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisgICBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIChFbWFpbCkgYXQgdGhlIGFkZHJlc3MgbWlrZUBhaS5taXQuZWR1LAorICAgb3IgKFVTIG1haWwpIGFzIE1pa2UgSGFlcnRlbCBjL28gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CS8qIFByb3RvdHlwZXMgZm9yIG1lbWNweSwgbWVtbW92ZSwgbWVtc2V0LCBldGMgKi8KKworI2luY2x1ZGUgIm1tcHJpdmF0ZS5oIgorCisvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBpbml0aWFsaXplIFBBUkFNUyAoKHN0cnVjdCBtZGVzYyAqKSk7CitzdGF0aWMgUFRSIG1vcmVjb3JlIFBBUkFNUyAoKHN0cnVjdCBtZGVzYyAqLCBzaXplX3QpKTsKK3N0YXRpYyBQVFIgYWxpZ24gUEFSQU1TICgoc3RydWN0IG1kZXNjICosIHNpemVfdCkpOworCisvKiBBbGlnbmVkIGFsbG9jYXRpb24uICAqLworCitzdGF0aWMgUFRSCithbGlnbiAobWRwLCBzaXplKQorICBzdHJ1Y3QgbWRlc2MgKm1kcDsKKyAgc2l6ZV90IHNpemU7Cit7CisgIFBUUiByZXN1bHQ7CisgIHVuc2lnbmVkIGxvbmcgaW50IGFkajsKKworICByZXN1bHQgPSBtZHAgLT4gbW9yZWNvcmUgKG1kcCwgc2l6ZSk7CisgIGFkaiA9IFJFU0lEVUFMIChyZXN1bHQsIEJMT0NLU0laRSk7CisgIGlmIChhZGogIT0gMCkKKyAgICB7CisgICAgICBhZGogPSBCTE9DS1NJWkUgLSBhZGo7CisgICAgICBtZHAgLT4gbW9yZWNvcmUgKG1kcCwgYWRqKTsKKyAgICAgIHJlc3VsdCA9IChjaGFyICopIHJlc3VsdCArIGFkajsKKyAgICB9CisgIHJldHVybiAocmVzdWx0KTsKK30KKworLyogU2V0IGV2ZXJ5dGhpbmcgdXAgYW5kIHJlbWVtYmVyIHRoYXQgd2UgaGF2ZS4gICovCisKK3N0YXRpYyBpbnQKK2luaXRpYWxpemUgKG1kcCkKKyAgc3RydWN0IG1kZXNjICptZHA7Cit7CisgIG1kcCAtPiBoZWFwc2l6ZSA9IEhFQVAgLyBCTE9DS1NJWkU7CisgIG1kcCAtPiBoZWFwaW5mbyA9IChtYWxsb2NfaW5mbyAqKSAKKyAgICBhbGlnbiAobWRwLCBtZHAgLT4gaGVhcHNpemUgKiBzaXplb2YgKG1hbGxvY19pbmZvKSk7CisgIGlmIChtZHAgLT4gaGVhcGluZm8gPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgbWVtc2V0ICgoUFRSKW1kcCAtPiBoZWFwaW5mbywgMCwgbWRwIC0+IGhlYXBzaXplICogc2l6ZW9mIChtYWxsb2NfaW5mbykpOworICBtZHAgLT4gaGVhcGluZm9bMF0uZnJlZS5zaXplID0gMDsKKyAgbWRwIC0+IGhlYXBpbmZvWzBdLmZyZWUubmV4dCA9IG1kcCAtPiBoZWFwaW5mb1swXS5mcmVlLnByZXYgPSAwOworICBtZHAgLT4gaGVhcGluZGV4ID0gMDsKKyAgbWRwIC0+IGhlYXBiYXNlID0gKGNoYXIgKikgbWRwIC0+IGhlYXBpbmZvOworICBtZHAgLT4gZmxhZ3MgfD0gTU1BTExPQ19JTklUSUFMSVpFRDsKKyAgcmV0dXJuICgxKTsKK30KKworLyogR2V0IG5lYXRseSBhbGlnbmVkIG1lbW9yeSwgaW5pdGlhbGl6aW5nIG9yCisgICBncm93aW5nIHRoZSBoZWFwIGluZm8gdGFibGUgYXMgbmVjZXNzYXJ5LiAqLworCitzdGF0aWMgUFRSCittb3JlY29yZSAobWRwLCBzaXplKQorICBzdHJ1Y3QgbWRlc2MgKm1kcDsKKyAgc2l6ZV90IHNpemU7Cit7CisgIFBUUiByZXN1bHQ7CisgIG1hbGxvY19pbmZvICpuZXdpbmZvLCAqb2xkaW5mbzsKKyAgc2l6ZV90IG5ld3NpemU7CisKKyAgcmVzdWx0ID0gYWxpZ24gKG1kcCwgc2l6ZSk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gKE5VTEwpOworICAgIH0KKworICAvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGdyb3cgdGhlIGluZm8gdGFibGUuICAqLworICBpZiAoKHNpemVfdCkgQkxPQ0sgKChjaGFyICopIHJlc3VsdCArIHNpemUpID4gbWRwIC0+IGhlYXBzaXplKQorICAgIHsKKyAgICAgIG5ld3NpemUgPSBtZHAgLT4gaGVhcHNpemU7CisgICAgICB3aGlsZSAoKHNpemVfdCkgQkxPQ0sgKChjaGFyICopIHJlc3VsdCArIHNpemUpID4gbmV3c2l6ZSkKKwl7CisJICBuZXdzaXplICo9IDI7CisJfQorICAgICAgbmV3aW5mbyA9IChtYWxsb2NfaW5mbyAqKSBhbGlnbiAobWRwLCBuZXdzaXplICogc2l6ZW9mIChtYWxsb2NfaW5mbykpOworICAgICAgaWYgKG5ld2luZm8gPT0gTlVMTCkKKwl7CisJICBtZHAgLT4gbW9yZWNvcmUgKG1kcCwgLXNpemUpOworCSAgcmV0dXJuIChOVUxMKTsKKwl9CisgICAgICBtZW1zZXQgKChQVFIpIG5ld2luZm8sIDAsIG5ld3NpemUgKiBzaXplb2YgKG1hbGxvY19pbmZvKSk7CisgICAgICBtZW1jcHkgKChQVFIpIG5ld2luZm8sIChQVFIpIG1kcCAtPiBoZWFwaW5mbywKKwkgICAgICBtZHAgLT4gaGVhcHNpemUgKiBzaXplb2YgKG1hbGxvY19pbmZvKSk7CisgICAgICBvbGRpbmZvID0gbWRwIC0+IGhlYXBpbmZvOworICAgICAgbmV3aW5mb1tCTE9DSyAob2xkaW5mbyldLmJ1c3kudHlwZSA9IDA7CisgICAgICBuZXdpbmZvW0JMT0NLIChvbGRpbmZvKV0uYnVzeS5pbmZvLnNpemUKKwk9IEJMT0NLSUZZIChtZHAgLT4gaGVhcHNpemUgKiBzaXplb2YgKG1hbGxvY19pbmZvKSk7CisgICAgICBtZHAgLT4gaGVhcGluZm8gPSBuZXdpbmZvOworICAgICAgX19tbWFsbG9jX2ZyZWUgKG1kcCwgKFBUUilvbGRpbmZvKTsKKyAgICAgIG1kcCAtPiBoZWFwc2l6ZSA9IG5ld3NpemU7CisgICAgfQorCisgIG1kcCAtPiBoZWFwbGltaXQgPSBCTE9DSyAoKGNoYXIgKikgcmVzdWx0ICsgc2l6ZSk7CisgIHJldHVybiAocmVzdWx0KTsKK30KKworLyogQWxsb2NhdGUgbWVtb3J5IGZyb20gdGhlIGhlYXAuICAqLworCitQVFIKK21tYWxsb2MgKG1kLCBzaXplKQorICBQVFIgbWQ7CisgIHNpemVfdCBzaXplOworeworICBzdHJ1Y3QgbWRlc2MgKm1kcDsKKyAgUFRSIHJlc3VsdDsKKyAgc2l6ZV90IGJsb2NrLCBibG9ja3MsIGxhc3RibG9ja3MsIHN0YXJ0OworICByZWdpc3RlciBzaXplX3QgaTsKKyAgc3RydWN0IGxpc3QgKm5leHQ7CisgIHJlZ2lzdGVyIHNpemVfdCBsb2c7CisKKyAgaWYgKHNpemUgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gKE5VTEwpOworICAgIH0KKworICBtZHAgPSBNRF9UT19NRFAgKG1kKTsKKyAgICAgIAorICBpZiAobWRwIC0+IG1tYWxsb2NfaG9vayAhPSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiAoKCptZHAgLT4gbW1hbGxvY19ob29rKSAobWQsIHNpemUpKTsKKyAgICB9CisKKyAgaWYgKCEobWRwIC0+IGZsYWdzICYgTU1BTExPQ19JTklUSUFMSVpFRCkpCisgICAgeworICAgICAgaWYgKCFpbml0aWFsaXplIChtZHApKQorCXsKKwkgIHJldHVybiAoTlVMTCk7CisJfQorICAgIH0KKworICBpZiAoc2l6ZSA8IHNpemVvZiAoc3RydWN0IGxpc3QpKQorICAgIHsKKyAgICAgIHNpemUgPSBzaXplb2YgKHN0cnVjdCBsaXN0KTsKKyAgICB9CisKKyAgLyogRGV0ZXJtaW5lIHRoZSBhbGxvY2F0aW9uIHBvbGljeSBiYXNlZCBvbiB0aGUgcmVxdWVzdCBzaXplLiAgKi8KKyAgaWYgKHNpemUgPD0gQkxPQ0tTSVpFIC8gMikKKyAgICB7CisgICAgICAvKiBTbWFsbCBhbGxvY2F0aW9uIHRvIHJlY2VpdmUgYSBmcmFnbWVudCBvZiBhIGJsb2NrLgorCSBEZXRlcm1pbmUgdGhlIGxvZ2FyaXRobSB0byBiYXNlIHR3byBvZiB0aGUgZnJhZ21lbnQgc2l6ZS4gKi8KKyAgICAgIGxvZyA9IDE7CisgICAgICAtLXNpemU7CisgICAgICB3aGlsZSAoKHNpemUgLz0gMikgIT0gMCkKKwl7CisJICArK2xvZzsKKwl9CisKKyAgICAgIC8qIExvb2sgaW4gdGhlIGZyYWdtZW50IGxpc3RzIGZvciBhCisJIGZyZWUgZnJhZ21lbnQgb2YgdGhlIGRlc2lyZWQgc2l6ZS4gKi8KKyAgICAgIG5leHQgPSBtZHAgLT4gZnJhZ2hlYWRbbG9nXS5uZXh0OworICAgICAgaWYgKG5leHQgIT0gTlVMTCkKKwl7CisJICAvKiBUaGVyZSBhcmUgZnJlZSBmcmFnbWVudHMgb2YgdGhpcyBzaXplLgorCSAgICAgUG9wIGEgZnJhZ21lbnQgb3V0IG9mIHRoZSBmcmFnbWVudCBsaXN0IGFuZCByZXR1cm4gaXQuCisJICAgICBVcGRhdGUgdGhlIGJsb2NrJ3MgbmZyZWUgYW5kIGZpcnN0IGNvdW50ZXJzLiAqLworCSAgcmVzdWx0ID0gKFBUUikgbmV4dDsKKwkgIG5leHQgLT4gcHJldiAtPiBuZXh0ID0gbmV4dCAtPiBuZXh0OworCSAgaWYgKG5leHQgLT4gbmV4dCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgbmV4dCAtPiBuZXh0IC0+IHByZXYgPSBuZXh0IC0+IHByZXY7CisJICAgIH0KKwkgIGJsb2NrID0gQkxPQ0sgKHJlc3VsdCk7CisJICBpZiAoLS1tZHAgLT4gaGVhcGluZm9bYmxvY2tdLmJ1c3kuaW5mby5mcmFnLm5mcmVlICE9IDApCisJICAgIHsKKwkgICAgICBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmJ1c3kuaW5mby5mcmFnLmZpcnN0ID0KKwkJUkVTSURVQUwgKG5leHQgLT4gbmV4dCwgQkxPQ0tTSVpFKSA+PiBsb2c7CisJICAgIH0KKworCSAgLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzLiAgKi8KKwkgIG1kcCAtPiBoZWFwc3RhdHMuY2h1bmtzX3VzZWQrKzsKKwkgIG1kcCAtPiBoZWFwc3RhdHMuYnl0ZXNfdXNlZCArPSAxIDw8IGxvZzsKKwkgIG1kcCAtPiBoZWFwc3RhdHMuY2h1bmtzX2ZyZWUtLTsKKwkgIG1kcCAtPiBoZWFwc3RhdHMuYnl0ZXNfZnJlZSAtPSAxIDw8IGxvZzsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogTm8gZnJlZSBmcmFnbWVudHMgb2YgdGhlIGRlc2lyZWQgc2l6ZSwgc28gZ2V0IGEgbmV3IGJsb2NrCisJICAgICBhbmQgYnJlYWsgaXQgaW50byBmcmFnbWVudHMsIHJldHVybmluZyB0aGUgZmlyc3QuICAqLworCSAgcmVzdWx0ID0gbW1hbGxvYyAobWQsIEJMT0NLU0laRSk7CisJICBpZiAocmVzdWx0ID09IE5VTEwpCisJICAgIHsKKwkgICAgICByZXR1cm4gKE5VTEwpOworCSAgICB9CisKKwkgIC8qIExpbmsgYWxsIGZyYWdtZW50cyBidXQgdGhlIGZpcnN0IGludG8gdGhlIGZyZWUgbGlzdC4gICovCisJICBmb3IgKGkgPSAxOyBpIDwgKHNpemVfdCkgKEJMT0NLU0laRSA+PiBsb2cpOyArK2kpCisJICAgIHsKKwkgICAgICBuZXh0ID0gKHN0cnVjdCBsaXN0ICopICgoY2hhciAqKSByZXN1bHQgKyAoaSA8PCBsb2cpKTsKKwkgICAgICBuZXh0IC0+IG5leHQgPSBtZHAgLT4gZnJhZ2hlYWRbbG9nXS5uZXh0OworCSAgICAgIG5leHQgLT4gcHJldiA9ICZtZHAgLT4gZnJhZ2hlYWRbbG9nXTsKKwkgICAgICBuZXh0IC0+IHByZXYgLT4gbmV4dCA9IG5leHQ7CisJICAgICAgaWYgKG5leHQgLT4gbmV4dCAhPSBOVUxMKQorCQl7CisJCSAgbmV4dCAtPiBuZXh0IC0+IHByZXYgPSBuZXh0OworCQl9CisJICAgIH0KKworCSAgLyogSW5pdGlhbGl6ZSB0aGUgbmZyZWUgYW5kIGZpcnN0IGNvdW50ZXJzIGZvciB0aGlzIGJsb2NrLiAgKi8KKwkgIGJsb2NrID0gQkxPQ0sgKHJlc3VsdCk7CisJICBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmJ1c3kudHlwZSA9IGxvZzsKKwkgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLmZyYWcubmZyZWUgPSBpIC0gMTsKKwkgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLmZyYWcuZmlyc3QgPSBpIC0gMTsKKworCSAgbWRwIC0+IGhlYXBzdGF0cy5jaHVua3NfZnJlZSArPSAoQkxPQ0tTSVpFID4+IGxvZykgLSAxOworCSAgbWRwIC0+IGhlYXBzdGF0cy5ieXRlc19mcmVlICs9IEJMT0NLU0laRSAtICgxIDw8IGxvZyk7CisgCSAgbWRwIC0+IGhlYXBzdGF0cy5ieXRlc191c2VkIC09IEJMT0NLU0laRSAtICgxIDw8IGxvZyk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIExhcmdlIGFsbG9jYXRpb24gdG8gcmVjZWl2ZSBvbmUgb3IgbW9yZSBibG9ja3MuCisJIFNlYXJjaCB0aGUgZnJlZSBsaXN0IGluIGEgY2lyY2xlIHN0YXJ0aW5nIGF0IHRoZSBsYXN0IHBsYWNlIHZpc2l0ZWQuCisJIElmIHdlIGxvb3AgY29tcGxldGVseSBhcm91bmQgd2l0aG91dCBmaW5kaW5nIGEgbGFyZ2UgZW5vdWdoCisJIHNwYWNlIHdlIHdpbGwgaGF2ZSB0byBnZXQgbW9yZSBtZW1vcnkgZnJvbSB0aGUgc3lzdGVtLiAgKi8KKyAgICAgIGJsb2NrcyA9IEJMT0NLSUZZKHNpemUpOworICAgICAgc3RhcnQgPSBibG9jayA9IE1BTExPQ19TRUFSQ0hfU1RBUlQ7CisgICAgICB3aGlsZSAobWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLnNpemUgPCBibG9ja3MpCisJeworCSAgYmxvY2sgPSBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUubmV4dDsKKwkgIGlmIChibG9jayA9PSBzdGFydCkKKwkgICAgeworCSAgICAgIC8qIE5lZWQgdG8gZ2V0IG1vcmUgZnJvbSB0aGUgc3lzdGVtLiAgQ2hlY2sgdG8gc2VlIGlmCisJCSB0aGUgbmV3IGNvcmUgd2lsbCBiZSBjb250aWd1b3VzIHdpdGggdGhlIGZpbmFsIGZyZWUKKwkJIGJsb2NrOyBpZiBzbyB3ZSBkb24ndCBuZWVkIHRvIGdldCBhcyBtdWNoLiAgKi8KKwkgICAgICBibG9jayA9IG1kcCAtPiBoZWFwaW5mb1swXS5mcmVlLnByZXY7CisJICAgICAgbGFzdGJsb2NrcyA9IG1kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5zaXplOworCSAgICAgIGlmIChtZHAgLT4gaGVhcGxpbWl0ICE9IDAgJiYKKwkJICBibG9jayArIGxhc3RibG9ja3MgPT0gbWRwIC0+IGhlYXBsaW1pdCAmJgorCQkgIG1kcCAtPiBtb3JlY29yZSAobWRwLCAwKSA9PSBBRERSRVNTKGJsb2NrICsgbGFzdGJsb2NrcykgJiYKKwkJICAobW9yZWNvcmUgKG1kcCwgKGJsb2NrcyAtIGxhc3RibG9ja3MpICogQkxPQ0tTSVpFKSkgIT0gTlVMTCkKKwkJeworCQkgIC8qIFdoaWNoIGJsb2NrIHdlIGFyZSBleHRlbmRpbmcgKHRoZSBgZmluYWwgZnJlZQorCQkgICAgIGJsb2NrJyByZWZlcnJlZCB0byBhYm92ZSkgbWlnaHQgaGF2ZSBjaGFuZ2VkLCBpZgorCQkgICAgIGl0IGdvdCBjb21iaW5lZCB3aXRoIGEgZnJlZWQgaW5mbyB0YWJsZS4gICovCisJCSAgYmxvY2sgPSBtZHAgLT4gaGVhcGluZm9bMF0uZnJlZS5wcmV2OworCisJCSAgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLnNpemUgKz0gKGJsb2NrcyAtIGxhc3RibG9ja3MpOworCQkgIG1kcCAtPiBoZWFwc3RhdHMuYnl0ZXNfZnJlZSArPQorCQkgICAgICAoYmxvY2tzIC0gbGFzdGJsb2NrcykgKiBCTE9DS1NJWkU7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICByZXN1bHQgPSBtb3JlY29yZShtZHAsIGJsb2NrcyAqIEJMT0NLU0laRSk7CisJICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorCQl7CisJCSAgcmV0dXJuIChOVUxMKTsKKwkJfQorCSAgICAgIGJsb2NrID0gQkxPQ0sgKHJlc3VsdCk7CisJICAgICAgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LnR5cGUgPSAwOworCSAgICAgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLnNpemUgPSBibG9ja3M7CisJICAgICAgbWRwIC0+IGhlYXBzdGF0cy5jaHVua3NfdXNlZCsrOworCSAgICAgIG1kcCAtPiBoZWFwc3RhdHMuYnl0ZXNfdXNlZCArPSBibG9ja3MgKiBCTE9DS1NJWkU7CisJICAgICAgcmV0dXJuIChyZXN1bHQpOworCSAgICB9CisJfQorCisgICAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgZm91bmQgYSBzdWl0YWJsZSBmcmVlIGxpc3QgZW50cnkuCisJIEZpZ3VyZSBvdXQgaG93IHRvIHJlbW92ZSB3aGF0IHdlIG5lZWQgZnJvbSB0aGUgbGlzdC4gKi8KKyAgICAgIHJlc3VsdCA9IEFERFJFU1MoYmxvY2spOworICAgICAgaWYgKG1kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5zaXplID4gYmxvY2tzKQorCXsKKwkgIC8qIFRoZSBibG9jayB3ZSBmb3VuZCBoYXMgYSBiaXQgbGVmdCBvdmVyLAorCSAgICAgc28gcmVsaW5rIHRoZSB0YWlsIGVuZCBiYWNrIGludG8gdGhlIGZyZWUgbGlzdC4gKi8KKwkgIG1kcCAtPiBoZWFwaW5mb1tibG9jayArIGJsb2Nrc10uZnJlZS5zaXplCisJICAgID0gbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLnNpemUgLSBibG9ja3M7CisJICBtZHAgLT4gaGVhcGluZm9bYmxvY2sgKyBibG9ja3NdLmZyZWUubmV4dAorCSAgICA9IG1kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5uZXh0OworCSAgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrICsgYmxvY2tzXS5mcmVlLnByZXYKKwkgICAgPSBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUucHJldjsKKwkgIG1kcCAtPiBoZWFwaW5mb1ttZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUucHJldl0uZnJlZS5uZXh0CisJICAgID0gbWRwIC0+IGhlYXBpbmZvW21kcCAtPiBoZWFwaW5mb1tibG9ja10uZnJlZS5uZXh0XS5mcmVlLnByZXYKKwkgICAgICA9IG1kcCAtPiBoZWFwaW5kZXggPSBibG9jayArIGJsb2NrczsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogVGhlIGJsb2NrIGV4YWN0bHkgbWF0Y2hlcyBvdXIgcmVxdWlyZW1lbnRzLAorCSAgICAgc28ganVzdCByZW1vdmUgaXQgZnJvbSB0aGUgbGlzdC4gKi8KKwkgIG1kcCAtPiBoZWFwaW5mb1ttZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUubmV4dF0uZnJlZS5wcmV2CisJICAgID0gbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLnByZXY7CisJICBtZHAgLT4gaGVhcGluZm9bbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5mcmVlLnByZXZdLmZyZWUubmV4dAorCSAgICA9IG1kcCAtPiBoZWFwaW5kZXggPSBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmZyZWUubmV4dDsKKwkgIG1kcCAtPiBoZWFwc3RhdHMuY2h1bmtzX2ZyZWUtLTsKKwl9CisKKyAgICAgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS50eXBlID0gMDsKKyAgICAgIG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS5pbmZvLnNpemUgPSBibG9ja3M7CisgICAgICBtZHAgLT4gaGVhcHN0YXRzLmNodW5rc191c2VkKys7CisgICAgICBtZHAgLT4gaGVhcHN0YXRzLmJ5dGVzX3VzZWQgKz0gYmxvY2tzICogQkxPQ0tTSVpFOworICAgICAgbWRwIC0+IGhlYXBzdGF0cy5ieXRlc19mcmVlIC09IGJsb2NrcyAqIEJMT0NLU0laRTsKKyAgICB9CisKKyAgcmV0dXJuIChyZXN1bHQpOworfQorCisvKiBXaGVuIHVzaW5nIHRoaXMgcGFja2FnZSwgcHJvdmlkZSBhIHZlcnNpb24gb2YgbWFsbG9jL3JlYWxsb2MvZnJlZSBidWlsdAorICAgb24gdG9wIG9mIGl0LCBzbyB0aGF0IGlmIHdlIHVzZSB0aGUgZGVmYXVsdCBzYnJrKCkgcmVnaW9uIHdlIHdpbGwgbm90CisgICBjb2xsaWRlIHdpdGggYW5vdGhlciBtYWxsb2MgcGFja2FnZSB0cnlpbmcgdG8gZG8gdGhlIHNhbWUgdGhpbmcsIGlmCisgICB0aGUgYXBwbGljYXRpb24gY29udGFpbnMgYW55ICJoaWRkZW4iIGNhbGxzIHRvIG1hbGxvYy9yZWFsbG9jL2ZyZWUgKHN1Y2gKKyAgIGFzIGluc2lkZSBhIHN5c3RlbSBsaWJyYXJ5KS4gKi8KKworUFRSCittYWxsb2MgKHNpemUpCisgIHNpemVfdCBzaXplOworeworICBQVFIgcmVzdWx0OworCisgIHJlc3VsdCA9IG1tYWxsb2MgKChQVFIpIE5VTEwsIHNpemUpOworICByZXR1cm4gKHJlc3VsdCk7Cit9CmRpZmYgLS1naXQgYS9tbWFsbG9jL21tYWxsb2MuaCBiL21tYWxsb2MvbW1hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MjU0N2UKLS0tIC9kZXYvbnVsbAorKysgYi9tbWFsbG9jL21tYWxsb2MuaApAQCAtMCwwICsxLDYyIEBACisjaWZuZGVmIE1NQUxMT0NfSAorI2RlZmluZSBNTUFMTE9DX0ggMQorCisjaWZkZWYgSEFWRV9TVERERUZfSAorIyAgaW5jbHVkZSA8c3RkZGVmLmg+CisjZWxzZQorIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAgLyogZm9yIHNpemVfdCAqLworIyAgaW5jbHVkZSA8c3RkaW8uaD4gICAgICAgLyogZm9yIE5VTEwgKi8KKyNlbmRpZgorCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyAKKy8qIEFsbG9jYXRlIFNJWkUgYnl0ZXMgb2YgbWVtb3J5LiAgKi8KKworZXh0ZXJuIFBUUiBtbWFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7CisKKy8qIFJlLWFsbG9jYXRlIHRoZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBibG9jayBpbiBQVFIsIG1ha2luZyB0aGUgbmV3IGJsb2NrCisgICBTSVpFIGJ5dGVzIGxvbmcuICAqLworCitleHRlcm4gUFRSIG1yZWFsbG9jIFBBUkFNUyAoKFBUUiwgUFRSLCBzaXplX3QpKTsKKworLyogQWxsb2NhdGUgTk1FTUIgZWxlbWVudHMgb2YgU0laRSBieXRlcyBlYWNoLCBhbGwgaW5pdGlhbGl6ZWQgdG8gMC4gICovCisKK2V4dGVybiBQVFIgbWNhbGxvYyBQQVJBTVMgKChQVFIsIHNpemVfdCwgc2l6ZV90KSk7CisKKy8qIEZyZWUgYSBibG9jayBhbGxvY2F0ZWQgYnkgYG1tYWxsb2MnLCBgbXJlYWxsb2MnIG9yIGBtY2FsbG9jJy4gICovCisKK2V4dGVybiB2b2lkIG1mcmVlIFBBUkFNUyAoKFBUUiwgUFRSKSk7CisKKy8qIEFsbG9jYXRlIFNJWkUgYnl0ZXMgYWxsb2NhdGVkIHRvIEFMSUdOTUVOVCBieXRlcy4gICovCisKK2V4dGVybiBQVFIgbW1lbWFsaWduIFBBUkFNUyAoKFBUUiwgc2l6ZV90LCBzaXplX3QpKTsKKworLyogQWxsb2NhdGUgU0laRSBieXRlcyBvbiBhIHBhZ2UgYm91bmRhcnkuICAqLworCitleHRlcm4gUFRSIG12YWxsb2MgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKKworLyogQWN0aXZhdGUgYSBzdGFuZGFyZCBjb2xsZWN0aW9uIG9mIGRlYnVnZ2luZyBob29rcy4gICovCisKK2V4dGVybiBpbnQgbW1jaGVjayBQQVJBTVMgKChQVFIsIHZvaWQgKCopICh2b2lkKSkpOworCitleHRlcm4gaW50IG1tY2hlY2tmIFBBUkFNUyAoKFBUUiwgdm9pZCAoKikgKHZvaWQpLCBpbnQpKTsKKworLyogUGljayB1cCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLiAoc2VlIEZJWE1FIGVsc2V3aGVyZSkgKi8KKworZXh0ZXJuIHN0cnVjdCBtc3RhdHMgbW1zdGF0cyBQQVJBTVMgKChQVFIpKTsKKworZXh0ZXJuIFBUUiBtbWFsbG9jX2F0dGFjaCBQQVJBTVMgKChpbnQsIFBUUikpOworCitleHRlcm4gUFRSIG1tYWxsb2NfZGV0YWNoIFBBUkFNUyAoKFBUUikpOworCitleHRlcm4gaW50IG1tYWxsb2Nfc2V0a2V5IFBBUkFNUyAoKFBUUiwgaW50LCBQVFIpKTsKKworZXh0ZXJuIFBUUiBtbWFsbG9jX2dldGtleSBQQVJBTVMgKChQVFIsIGludCkpOworCitleHRlcm4gaW50IG1tYWxsb2NfZXJybm8gUEFSQU1TICgoUFRSKSk7CisKK2V4dGVybiBpbnQgbW10cmFjZSBQQVJBTVMgKCh2b2lkKSk7CisKK2V4dGVybiBQVFIgbW1hbGxvY19maW5kYmFzZSBQQVJBTVMgKChpbnQpKTsKKworI2VuZGlmICAvKiBNTUFMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL21tYWxsb2MvbW1hbGxvYy50ZXhpIGIvbW1hbGxvYy9tbWFsbG9jLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzOGY2NQotLS0gL2Rldi9udWxsCisrKyBiL21tYWxsb2MvbW1hbGxvYy50ZXhpCkBAIC0wLDAgKzEsMjU4IEBACitcaW5wdXQgdGV4aW5mbyAgQGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIFRleGluZm8gLSotCitAc2V0ZmlsZW5hbWUgbW1hbGxvYy5pbmZvCisKK0BpZmluZm8KK0Bmb3JtYXQKK1NUQVJULUlORk8tRElSLUVOVFJZCisqIE1tYWxsb2M6IChtbWFsbG9jKS4JCVRoZSBHTlUgbWFwcGVkLW1hbGxvYyBwYWNrYWdlLgorRU5ELUlORk8tRElSLUVOVFJZCitAZW5kIGZvcm1hdAorCitUaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBHTlUgbW1hbGxvYyAobWFwcGVkLW1hbGxvYykgcGFja2FnZSwgd3JpdHRlbiBieQorZm5mQEBjeWdudXMuY29tLCBiYXNlZCBvbiBHTlUgbWFsbG9jIHdyaXR0ZW4gYnkgbWlrZUBAYWkubWl0LmVkdS4KKworQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisKK0BpZ25vcmUKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCityZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgorbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCisodGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCisKK0BlbmQgaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdCB0aGUKK2VudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAoraW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCitAZW5kIGlmaW5mbworQGlmdGV4CitAYyBAZmluYWxvdXQKK0BzZXRjaGFwdGVybmV3cGFnZSBvZGQKK0BzZXR0aXRsZSBNTUFMTE9DLCB0aGUgR05VIG1lbW9yeS1tYXBwZWQgbWFsbG9jIHBhY2thZ2UKK0B0aXRsZXBhZ2UKK0B0aXRsZSBtbWFsbG9jCitAc3VidGl0bGUgVGhlIEdOVSBtZW1vcnktbWFwcGVkIG1hbGxvYyBwYWNrYWdlCitAYXV0aG9yIEZyZWQgRmlzaAorQGF1dGhvciBDeWdudXMgU3VwcG9ydAorQGF1dGhvciBNaWtlIEhhZXJ0ZWwKK0BhdXRob3IgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitAcGFnZQorCitAdGV4CitcZGVmXCQjMSR7eyMxfX0gICUgS2x1Z2U6IGNvbGxlY3QgUkNTIHJldmlzaW9uIGluZm8gd2l0aG91dCAkLi4uJAorXHhkZWZcbWFudmVyc3tcJFJldmlzaW9uJH0gICUgRm9yIHVzZSBpbiBoZWFkZXJzLCBmb290ZXJzIHRvbwore1xwYXJza2lwPTBwdAorXGhmaWxsIEN5Z251cyBTdXBwb3J0XHBhcgorXGhmaWxsIGZuZlxAY3lnbnVzLmNvbVxwYXIKK1xoZmlsbCB7XGl0IE1NQUxMT0MsIHRoZSBHTlUgbWVtb3J5LW1hcHBlZCBtYWxsb2MgcGFja2FnZX0sIFxtYW52ZXJzXHBhcgorXGhmaWxsIFxUZVh7fWluZm8gXHRleGluZm92ZXJzaW9uXHBhcgorfQorQGVuZCB0ZXgKKworQHZza2lwIDBwdCBwbHVzIDFmaWxsbAorQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0Cit0aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKK3Blcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCitpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KK0BlbmQgdGl0bGVwYWdlCitAZW5kIGlmdGV4CisKK0BpZmluZm8KK0Bub2RlIFRvcCwgT3ZlcnZpZXcsIChkaXIpLCAoZGlyKQorQHRvcCBtbWFsbG9jCitUaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBHTlUgbWVtb3J5LW1hcHBlZCBtYWxsb2MgcGFja2FnZSBtbWFsbG9jLgorCitAbWVudQorKiBPdmVydmlldzo6ICAgICAgICAgICAgICAgICAgICBPdmVyYWxsIERlc2NyaXB0aW9uCisqIEltcGxlbWVudGF0aW9uOjogICAgICAgICAgICAgIEltcGxlbWVudGF0aW9uCisKKyAtLS0gVGhlIERldGFpbGVkIE5vZGUgTGlzdGluZyAtLS0KKworSW1wbGVtZW50YXRpb24KKworKiBDb21wYXRpYmlsaXR5OjogICAgICAgICAgICAgICBCYWNrd2FyZHMgQ29tcGF0aWJpbGl0eQorKiBGdW5jdGlvbnM6OiAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiBEZXNjcmlwdGlvbnMKK0BlbmQgbWVudQorCitAZW5kIGlmaW5mbworCitAbm9kZSBPdmVydmlldywgSW1wbGVtZW50YXRpb24sIFRvcCwgVG9wCitAY2hhcHRlciBPdmVyYWxsIERlc2NyaXB0aW9uCisKK1RoaXMgaXMgYSBoZWF2aWx5IG1vZGlmaWVkIHZlcnNpb24gb2YgR05VIEBjb2Rle21hbGxvY30uICBJdCB1c2VzCitAY29kZXttbWFwfSBhcyB0aGUgYmFzaWMgbWVjaGFuaXNtIGZvciBvYnRhaW5pbmcgbWVtb3J5IGZyb20gdGhlCitzeXN0ZW0sIHJhdGhlciB0aGFuIEBjb2Rle3Nicmt9LiAgVGhpcyBnaXZlcyBpdCBzZXZlcmFsIGFkdmFudGFnZXMgb3ZlciB0aGUKK21vcmUgdHJhZGl0aW9uYWwgbWFsbG9jOgorCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorU2V2ZXJhbCBkaWZmZXJlbnQgaGVhcHMgY2FuIGJlIHVzZWQsIGVhY2ggb2YgdGhlbSBncm93aW5nCitvciBzaGlua2luZyB1bmRlciBjb250cm9sIG9mIEBjb2Rle21tYXB9LCB3aXRoIHRoZSBAY29kZXttbWFsbG9jfSBmdW5jdGlvbnMKK3VzaW5nIGEgc3BlY2lmaWMgaGVhcCBvbiBhIGNhbGwgYnkgY2FsbCBiYXNpcy4KKworQGl0ZW0KK0J5IHVzaW5nIEBjb2Rle21tYXB9LCBpdCBpcyBlYXN5IHRvIGNyZWF0ZSBoZWFwcyB3aGljaCBhcmUgaW50ZW5kZWQgdG8KK2JlIHBlcnNpc3RlbnQgYW5kIGV4aXN0IGFzIGEgZmlsZXN5c3RlbSBvYmplY3QgYWZ0ZXIgdGhlIGNyZWF0aW5nCitwcm9jZXNzIGhhcyBnb25lIGF3YXkuCisKK0BpdGVtCitCZWNhdXNlIG11bHRpcGxlIGhlYXBzIGNhbiBiZSBtYW5hZ2VkLCBkYXRhIHVzZWQgZm9yIGEgCitzcGVjaWZpYyBwdXJwb3NlIGNhbiBiZSBhbGxvY2F0ZWQgaW50byBpdHMgb3duIGhlYXAsIG1ha2luZworaXQgZWFzaWVyIHRvIGFsbG93IGFwcGxpY2F0aW9ucyB0byBgYGR1bXAnJyBhbmQgYGByZXN0b3JlJycgaW5pdGlhbGl6ZWQKK21hbGxvYy1tYW5hZ2VkIG1lbW9yeSByZWdpb25zLiAgRm9yIGV4YW1wbGUsIHRoZSBgYHVuZXhlYycnIGhhY2sgcG9wdWxhcml6ZWQKK2J5IEdOVSBFbWFjcyBjb3VsZCBwb3RlbnRpYWxseSBnbyBhd2F5LgorQGVuZCBpdGVtaXplCisKK0Bub2RlIEltcGxlbWVudGF0aW9uLCAgLCBPdmVydmlldywgVG9wCitAY2hhcHRlciBJbXBsZW1lbnRhdGlvbgorCitUaGUgQGNvZGV7bW1hbGxvY30gZnVuY3Rpb25zIGNvbnRhaW4gbm8gaW50ZXJuYWwgc3RhdGljIHN0YXRlLiAgQWxsCitAY29kZXttbWFsbG9jfSBpbnRlcm5hbCBkYXRhIGlzIGFsbG9jYXRlZCBpbiB0aGUgbWFwcGVkIGluIHJlZ2lvbiwgYWxvbmcKK3dpdGggdGhlIHVzZXIgZGF0YSB0aGF0IGl0IG1hbmFnZXMuICBUaGlzIGFsbG93cyBpdCB0byBtYW5hZ2UgbXVsdGlwbGUKK3N1Y2ggcmVnaW9ucyBhbmQgdG8gYGBwaWNrIHVwIHdoZXJlIGl0IGxlZnQgb2ZmJycgd2hlbiBzdWNoIHJlZ2lvbnMgYXJlCitsYXRlciBkeW5hbWljYWxseSBtYXBwZWQgYmFjayBpbi4KKworSW4gc29tZSBzZW5zZSwgbWFsbG9jIGhhcyBiZWVuIGBgcHVyaWZpZWQnJyB0byBjb250YWluIG5vIGludGVybmFsIHN0YXRlCitpbmZvcm1hdGlvbiBhbmQgZ2VuZXJhbGl6ZWQgdG8gdXNlIG11bHRpcGxlIG1lbW9yeSByZWdpb25zIHJhdGhlciB0aGFuIGEKK3NpbmdsZSByZWdpb24gbWFuYWdlZCBieSBAY29kZXtzYnJrfS4gIEhvd2V2ZXIgdGhlIG5ldyByb3V0aW5lcyBub3cgbmVlZCBhbgorZXh0cmEgcGFyYW1ldGVyIHdoaWNoIGluZm9ybXMgQGNvZGV7bW1hbGxvY30gd2hpY2ggbWVtb3J5IHJlZ2lvbiBpdCBpcyBkZWFsaW5nCit3aXRoIChhbG9uZyB3aXRoIG90aGVyIGluZm9ybWF0aW9uKS4gIFRoaXMgcGFyYW1ldGVyIGlzIGNhbGxlZCB0aGUKK0BkZm57bWFsbG9jIGRlc2NyaXB0b3J9LgorCitUaGUgZnVuY3Rpb25zIGluaXRpYWxseSBwcm92aWRlZCBieSBAY29kZXttbWFsbG9jfSBhcmU6CisKK0BleGFtcGxlCit2b2lkICptbWFsbG9jX2F0dGFjaCAoaW50IGZkLCB2b2lkICpiYXNlYWRkcik7Cit2b2lkICptbWFsbG9jX2RldGFjaCAodm9pZCAqbWQpOworaW50IG1tYWxsb2NfZXJybm8gKHZvaWQgKm1kKTsKK2ludCBtbWFsbG9jX3NldGtleSAodm9pZCAqbWQsIGludCBrZXludW0sIHZvaWQgKmtleSk7Cit2b2lkICptbWFsbG9jX2dldGtleSAodm9pZCAqbWQsIGludCBrZXludW0pOworCit2b2lkICptbWFsbG9jICh2b2lkICptZCwgc2l6ZV90IHNpemUpOwordm9pZCAqbXJlYWxsb2MgKHZvaWQgKm1kLCB2b2lkICpwdHIsIHNpemVfdCBzaXplKTsKK3ZvaWQgKm12YWxsb2MgKHZvaWQgKm1kLCBzaXplX3Qgc2l6ZSk7Cit2b2lkIG1mcmVlICh2b2lkICptZCwgdm9pZCAqcHRyKTsKK0BlbmQgZXhhbXBsZQorCitAbWVudQorKiBDb21wYXRpYmlsaXR5OjogICAgICAgICAgICAgICBCYWNrd2FyZHMgQ29tcGF0aWJpbGl0eQorKiBGdW5jdGlvbnM6OiAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiBEZXNjcmlwdGlvbnMKK0BlbmQgbWVudQorCitAbm9kZSBDb21wYXRpYmlsaXR5LCBGdW5jdGlvbnMsIEltcGxlbWVudGF0aW9uLCBJbXBsZW1lbnRhdGlvbgorQHNlY3Rpb24gQmFja3dhcmRzIENvbXBhdGliaWxpdHkKKworVG8gYWxsb3cgYSBzaW5nbGUgbWFsbG9jIHBhY2thZ2UgdG8gYmUgdXNlZCBpbiBhIGdpdmVuIGFwcGxpY2F0aW9uLAorcHJvdmlzaW9uIGlzIG1hZGUgZm9yIHRoZSB0cmFkaXRpb25hbCBAY29kZXttYWxsb2N9LCBAY29kZXtyZWFsbG9jfSwgYW5kCitAY29kZXtmcmVlfSBmdW5jdGlvbnMgdG8gYmUgaW1wbGVtZW50ZWQgYXMgc3BlY2lhbCBjYXNlcyBvZiB0aGUKK0Bjb2Rle21tYWxsb2N9IGZ1bmN0aW9ucy4gIEluIHBhcnRpY3VsYXIsIGlmIGFueSBvZiB0aGUgZnVuY3Rpb25zIHRoYXQKK2V4cGVjdCBtYWxsb2MgZGVzY3JpcHRvcnMgYXJlIGNhbGxlZCB3aXRoIGEgQGNvZGV7TlVMTH0gcG9pbnRlciByYXRoZXIgdGhhbiBhCit2YWxpZCBtYWxsb2MgZGVzY3JpcHRvciwgdGhlbiB0aGV5IGRlZmF1bHQgdG8gdXNpbmcgYW4gQGNvZGV7c2Jya30gbWFuYWdlZAorcmVnaW9uLgorVGhlIEBjb2Rle21tYWxsb2N9IHBhY2thZ2UgcHJvdmlkZXMgY29tcGF0aWJsZSBAY29kZXttYWxsb2N9LCBAY29kZXtyZWFsbG9jfSwKK2FuZCBAY29kZXtmcmVlfSBmdW5jdGlvbnMgdXNpbmcgdGhpcyBtZWNoYW5pc20gaW50ZXJuYWxseS4KK0FwcGxpY2F0aW9ucyBjYW4gYXZvaWQgdGhpcyBleHRyYSBpbnRlcmZhY2UgbGF5ZXIgYnkgc2ltcGx5IGluY2x1ZGluZyB0aGUKK2ZvbGxvd2luZyBkZWZpbmVzOgorCitAZXhhbXBsZQorI2RlZmluZSBtYWxsb2Moc2l6ZSkJCW1tYWxsb2MgKCh2b2lkICopMCwgKHNpemUpKQorI2RlZmluZSByZWFsbG9jKHB0cixzaXplKQltcmVhbGxvYyAoKHZvaWQgKikwLCAocHRyKSwgKHNpemUpKTsKKyNkZWZpbmUgZnJlZShwdHIpCQltZnJlZSAoKHZvaWQgKikwLCAocHRyKSkKK0BlbmQgZXhhbXBsZQorCitAbm9pbmRlbnQKK29yIHJlcGxhY2UgdGhlIGV4aXN0aW5nIEBjb2Rle21hbGxvY30sIEBjb2Rle3JlYWxsb2N9LCBhbmQgQGNvZGV7ZnJlZX0KK2NhbGxzIHdpdGggdGhlIGFib3ZlIHBhdHRlcm5zIGlmIHVzaW5nIEBjb2RleyNkZWZpbmV9IGNhdXNlcyBwcm9ibGVtcy4KKworQG5vZGUgRnVuY3Rpb25zLCAgLCBDb21wYXRpYmlsaXR5LCBJbXBsZW1lbnRhdGlvbgorQHNlY3Rpb24gRnVuY3Rpb24gRGVzY3JpcHRpb25zCisKK1RoZXNlIGFyZSB0aGUgZGV0YWlscyBvbiB0aGUgZnVuY3Rpb25zIHRoYXQgbWFrZSB1cCB0aGUgQGNvZGV7bW1hbGxvY30KK3BhY2thZ2UuIAorCitAdGFibGUgQGNvZGUKK0BpdGVtIHZvaWQgKm1tYWxsb2NfYXR0YWNoIChpbnQgQHZhcntmZH0sIHZvaWQgKkB2YXJ7YmFzZWFkZHJ9KTsKK0luaXRpYWxpemUgYWNjZXNzIHRvIGEgQGNvZGV7bW1hbGxvY30gbWFuYWdlZCByZWdpb24uCisKK0lmIEB2YXJ7ZmR9IGlzIGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yIGZvciBhbiBvcGVuIGZpbGUsIHRoZW4gZGF0YSBmb3IgdGhlCitAY29kZXttbWFsbG9jfSBtYW5hZ2VkIHJlZ2lvbiBpcyBtYXBwZWQgdG8gdGhhdCBmaWxlLiAgIE90aGVyd2lzZQorQGZpbGV7L2Rldi96ZXJvfSBpcyB1c2VkIGFuZCB0aGUgZGF0YSB3aWxsIG5vdCBleGlzdCBpbiBhbnkgZmlsZXN5c3RlbSBvYmplY3QuCisKK0lmIHRoZSBvcGVuIGZpbGUgY29ycmVzcG9uZGluZyB0byBAdmFye2ZkfSBpcyBmcm9tIGEgcHJldmlvdXMgdXNlIG9mCitAY29kZXttbWFsbG9jfSBhbmQgcGFzc2VzIHNvbWUgYmFzaWMgc2FuaXR5IGNoZWNrcyB0byBlbnN1cmUgdGhhdCBpdCBpcworY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IEBjb2Rle21tYWxsb2N9IHBhY2thZ2UsIHRoZW4gaXRzIGRhdGEgaXMKK21hcHBlZCBpbiBhbmQgaXMgaW1tZWRpYXRlbHkgYWNjZXNzaWJsZSBhdCB0aGUgc2FtZSBhZGRyZXNzZXMgaW4KK3RoZSBjdXJyZW50IHByb2Nlc3MgYXMgdGhlIHByb2Nlc3MgdGhhdCBjcmVhdGVkIHRoZSBmaWxlLgorCitJZiBAdmFye2Jhc2VhZGRyfSBpcyBub3QgQGNvZGV7TlVMTH0sIHRoZSBtYXBwaW5nIGlzIGVzdGFibGlzaGVkCitzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgaW4gdGhlIHByb2Nlc3MgYWRkcmVzcyBzcGFjZS4gIElmCitAdmFye2Jhc2VhZGRyfSBpcyBAY29kZXtOVUxMfSwgdGhlIEBjb2Rle21tYWxsb2N9IHBhY2thZ2UgY2hvb3NlcyBhCitzdWl0YWJsZSBhZGRyZXNzIGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSBtYXBwZWQgcmVnaW9uLCB3aGljaCB3aWxsIGJlIHRoZQordmFsdWUgb2YgdGhlIHByZXZpb3VzIG1hcHBpbmcgaWYgb3BlbmluZyBhbiBleGlzdGluZyBmaWxlIHdoaWNoIHdhcworcHJldmlvdXNseSBidWlsdCBieSBAY29kZXttbWFsbG9jfSwgb3IgZm9yIG5ldyBmaWxlcyB3aWxsIGJlIGEgdmFsdWUKK2Nob3NlbiBieSBAY29kZXttbWFwfS4KKworU3BlY2lmeWluZyBAdmFye2Jhc2VhZGRyfSBwcm92aWRlcyBtb3JlIGNvbnRyb2wgb3ZlciB3aGVyZSB0aGUgcmVnaW9ucworc3RhcnQgYW5kIGhvdyBiaWcgdGhleSBjYW4gYmUgYmVmb3JlIGJ1bXBpbmcgaW50byBleGlzdGluZyBtYXBwZWQKK3JlZ2lvbnMgb3IgZnV0dXJlIG1hcHBlZCByZWdpb25zLgorCitPbiBzdWNjZXNzLCByZXR1cm5zIGEgbWFsbG9jIGRlc2NyaXB0b3Igd2hpY2ggaXMgdXNlZCBpbiBzdWJzZXF1ZW50CitjYWxscyB0byBvdGhlciBAY29kZXttbWFsbG9jfSBwYWNrYWdlIGZ1bmN0aW9ucy4gIEl0IGlzIGV4cGxpY2l0bHkKK0BzYW1we3ZvaWQgKn0gKEBzYW1we2NoYXIgKn0gZm9yIHN5c3RlbXMgdGhhdCBkb24ndCBmdWxseSBzdXBwb3J0CitAY29kZXt2b2lkfSkgc28gdGhhdCB1c2VycyBvZiB0aGUgcGFja2FnZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZQorYWN0dWFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCisKK09uIGZhaWx1cmUgcmV0dXJucyBAY29kZXtOVUxMfS4KKworQGl0ZW0gdm9pZCAqbW1hbGxvY19kZXRhY2ggKHZvaWQgKkB2YXJ7bWR9KTsKK1Rlcm1pbmF0ZSBhY2Nlc3MgdG8gYSBAY29kZXttbWFsbG9jfSBtYW5hZ2VkIHJlZ2lvbiBpZGVudGlmaWVkIGJ5IHRoZQorZGVzY3JpcHRvciBAdmFye21kfSwgYnkgY2xvc2luZyB0aGUgYmFzZSBmaWxlIGFuZCB1bm1hcHBpbmcgYWxsIG1lbW9yeQorcGFnZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWdpb24uIAorCitSZXR1cm5zIEBjb2Rle05VTEx9IG9uIHN1Y2Nlc3MuCisKK1JldHVybnMgdGhlIG1hbGxvYyBkZXNjcmlwdG9yIG9uIGZhaWx1cmUsIHdoaWNoIGNhbiBzdWJzZXF1ZW50bHkKK2JlIHVzZWQgZm9yIGZ1cnRoZXIgYWN0aW9uIChzdWNoIGFzIG9idGFpbmluZyBtb3JlIGluZm9ybWF0aW9uIGFib3V0Cit0aGUgbmF0dXJlIG9mIHRoZSBmYWlsdXJlKS4KKworQGl0ZW0gdm9pZCAqbW1hbGxvYyAodm9pZCAqQHZhcnttZH0sIHNpemVfdCBAdmFye3NpemV9KTsKK0dpdmVuIGFuIEBjb2Rle21tYWxsb2N9IGRlc2NyaXB0b3IgQHZhcnttZH0sIGFsbG9jYXRlIGFkZGl0aW9uYWwgbWVtb3J5IG9mCitAdmFye3NpemV9IGJ5dGVzIGluIHRoZSBhc3NvY2lhdGVkIG1hcHBlZCByZWdpb24uCisKK0BpdGVtICptcmVhbGxvYyAodm9pZCAqQHZhcnttZH0sIHZvaWQgKkB2YXJ7cHRyfSwgc2l6ZV90IEB2YXJ7c2l6ZX0pOworR2l2ZW4gYW4gQGNvZGV7bW1hbGxvY30gZGVzY3JpcHRvciBAdmFye21kfSBhbmQgYSBwb2ludGVyIHRvIG1lbW9yeQorcHJldmlvdXNseSBhbGxvY2F0ZWQgYnkgQGNvZGV7bW1hbGxvY30gaW4gQHZhcntwdHJ9LCByZWFsbG9jYXRlIHRoZQorbWVtb3J5IHRvIGJlIEB2YXJ7c2l6ZX0gYnl0ZXMgbG9uZywgcG9zc2libHkgbW92aW5nIHRoZSBleGlzdGluZworY29udGVudHMgb2YgbWVtb3J5IGlmIG5lY2Vzc2FyeS4KKwkKK0BpdGVtIHZvaWQgKm12YWxsb2MgKHZvaWQgKkB2YXJ7bWR9LCBzaXplX3QgQHZhcntzaXplfSk7CitMaWtlIEBjb2Rle21tYWxsb2N9IGJ1dCB0aGUgcmVzdWx0aW5nIG1lbW9yeSBpcyBhbGlnbmVkIG9uIGEgcGFnZSBib3VuZGFyeS4KKworQGl0ZW0gdm9pZCBtZnJlZSAodm9pZCAqQHZhcnttZH0sIHZvaWQgKkB2YXJ7cHRyfSk7CitHaXZlbiBhbiBAY29kZXttbWFsbG9jfSBkZXNjcmlwdG9yIEB2YXJ7bWR9IGFuZCBhIHBvaW50ZXIgdG8gbWVtb3J5IHByZXZpb3VzbHkKK2FsbG9jYXRlZCBieSBAY29kZXttbWFsbG9jfSBpbiBAdmFye3B0cn0sIGZyZWUgdGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1lbW9yeS4KKworQGl0ZW0gaW50IG1tYWxsb2NfZXJybm8gKHZvaWQgKkB2YXJ7bWR9KTsKK0dpdmVuIGEgQGNvZGV7bW1hbGxvY30gZGVzY3JpcHRvciwgaWYgdGhlIGxhc3QgQGNvZGV7bW1hbGxvY30gb3BlcmF0aW9uCitmYWlsZWQgZm9yIHNvbWUgcmVhc29uIGR1ZSB0byBhIHN5c3RlbSBjYWxsIGZhaWx1cmUsIHRoZW4KK3JldHVybnMgdGhlIGFzc29jaWF0ZWQgQGNvZGV7ZXJybm99LiAgUmV0dXJucyAwIG90aGVyd2lzZS4KKyhUaGlzIGZ1bmN0aW9uIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQpLgorQGVuZCB0YWJsZQorCitAYnllCmRpZmYgLS1naXQgYS9tbWFsbG9jL21tYXAtc3VwLmMgYi9tbWFsbG9jL21tYXAtc3VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3ODc4OQotLS0gL2Rldi9udWxsCisrKyBiL21tYWxsb2MvbW1hcC1zdXAuYwpAQCAtMCwwICsxLDIwNSBAQAorLyogU3VwcG9ydCBmb3IgYW4gc2Jyay1saWtlIGZ1bmN0aW9uIHRoYXQgdXNlcyBtbWFwLgorICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIENvbnRyaWJ1dGVkIGJ5IEZyZWQgRmlzaCBhdCBDeWdudXMgU3VwcG9ydC4gICBmbmZAY3lnbnVzLmNvbQorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCittb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKK0xpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0xpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgorbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCitCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZiBkZWZpbmVkKEhBVkVfTU1BUCkKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjaWZuZGVmIFNFRUtfU0VUCisjZGVmaW5lIFNFRUtfU0VUIDAKKyNlbmRpZgorCisjaW5jbHVkZSAibW1wcml2YXRlLmgiCisKKy8qIENhY2hlIHRoZSBwYWdlc2l6ZSBmb3IgdGhlIGN1cnJlbnQgaG9zdCBtYWNoaW5lLiAgTm90ZSB0aGF0IGlmIHRoZSBob3N0CisgICBkb2VzIG5vdCByZWFkaWx5IHByb3ZpZGUgYSBnZXRwYWdlc2l6ZSgpIGZ1bmN0aW9uLCB3ZSBuZWVkIHRvIGVtdWxhdGUgaXQKKyAgIGVsc2V3aGVyZSwgbm90IGNsdXR0ZXIgdXAgdGhpcyBmaWxlIHdpdGggbG90cyBvZiBrbHVnZXMgdG8gdHJ5IHRvIGZpZ3VyZQorICAgaXQgb3V0LiAqLworCitzdGF0aWMgc2l6ZV90IHBhZ2VzaXplOworZXh0ZXJuIGludCBnZXRwYWdlc2l6ZSBQQVJBTVMgKCh2b2lkKSk7CisKKyNkZWZpbmUgUEFHRV9BTElHTihhZGRyKSAoY2FkZHJfdCkgKCgobG9uZykoYWRkcikgKyBwYWdlc2l6ZSAtIDEpICYgXAorCQkJCSAgICB+KHBhZ2VzaXplIC0gMSkpCisKKy8qICBHZXQgY29yZSBmb3IgdGhlIG1lbW9yeSByZWdpb24gc3BlY2lmaWVkIGJ5IE1EUCwgdXNpbmcgU0laRSBhcyB0aGUKKyAgICBhbW91bnQgdG8gZWl0aGVyIGFkZCB0byBvciBzdWJ0cmFjdCBmcm9tIHRoZSBleGlzdGluZyByZWdpb24uICBXb3JrcworICAgIGxpa2Ugc2JyaygpLCBidXQgdXNpbmcgbW1hcCgpLiAqLworCitQVFIKK19fbW1hbGxvY19tbWFwX21vcmVjb3JlIChtZHAsIHNpemUpCisgIHN0cnVjdCBtZGVzYyAqbWRwOworICBpbnQgc2l6ZTsKK3sKKyAgUFRSIHJlc3VsdCA9IE5VTEw7CisgIG9mZl90IGZvZmZzZXQ7CS8qIEZpbGUgb2Zmc2V0IGF0IHdoaWNoIG5ldyBtYXBwaW5nIHdpbGwgc3RhcnQgKi8KKyAgc2l6ZV90IG1hcGJ5dGVzOwkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gbWFwICovCisgIGNhZGRyX3QgbW92ZXRvOwkvKiBBZGRyZXNzIHdoZXJlIHdlIHdpc2ggdG8gbW92ZSAiYnJlYWsgdmFsdWUiIHRvICovCisgIGNhZGRyX3QgbWFwdG87CS8qIEFkZHJlc3Mgd2UgYWN0dWFsbHkgbWFwcGVkIHRvICovCisgIGNoYXIgYnVmID0gMDsJCS8qIFNpbmdsZSBieXRlIHRvIHdyaXRlIHRvIGV4dGVuZCBtYXBwZWQgZmlsZSAqLworCisgIGlmIChwYWdlc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIHBhZ2VzaXplID0gZ2V0cGFnZXNpemUgKCk7CisgICAgfQorICBpZiAoc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIC8qIEp1c3QgcmV0dXJuIHRoZSBjdXJyZW50ICJicmVhayIgdmFsdWUuICovCisgICAgICByZXN1bHQgPSBtZHAgLT4gYnJlYWt2YWw7CisgICAgfQorICBlbHNlIGlmIChzaXplIDwgMCkKKyAgICB7CisgICAgICAvKiBXZSBhcmUgZGVhbGxvY2F0aW5nIG1lbW9yeS4gIElmIHRoZSBhbW91bnQgcmVxdWVzdGVkIHdvdWxkIGNhdXNlCisJIHVzIHRvIHRyeSB0byBkZWFsbG9jYXRlIGJhY2sgcGFzdCB0aGUgYmFzZSBvZiB0aGUgbW1hcCdkIHJlZ2lvbgorCSB0aGVuIGRvIG5vdGhpbmcsIGFuZCByZXR1cm4gTlVMTC4gIE90aGVyd2lzZSwgZGVhbGxvY2F0ZSB0aGUKKwkgbWVtb3J5IGFuZCByZXR1cm4gdGhlIG9sZCBicmVhayB2YWx1ZS4gKi8KKyAgICAgIGlmIChtZHAgLT4gYnJlYWt2YWwgKyBzaXplID49IG1kcCAtPiBiYXNlKQorCXsKKwkgIHJlc3VsdCA9IChQVFIpIG1kcCAtPiBicmVha3ZhbDsKKwkgIG1kcCAtPiBicmVha3ZhbCArPSBzaXplOworCSAgbW92ZXRvID0gUEFHRV9BTElHTiAobWRwIC0+IGJyZWFrdmFsKTsKKwkgIG11bm1hcCAobW92ZXRvLCAoc2l6ZV90KSAobWRwIC0+IHRvcCAtIG1vdmV0bykpOworCSAgbWRwIC0+IHRvcCA9IG1vdmV0bzsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogV2UgYXJlIGFsbG9jYXRpbmcgbWVtb3J5LiAgTWFrZSBzdXJlIHdlIGhhdmUgYW4gb3BlbiBmaWxlCisJIGRlc2NyaXB0b3IgYW5kIHRoZW4gZ28gb24gdG8gZ2V0IHRoZSBtZW1vcnkuICovCisgICAgICBpZiAobWRwIC0+IGZkIDwgMCkKKwl7CisJICByZXN1bHQgPSBOVUxMOworCX0KKyAgICAgIGVsc2UgaWYgKG1kcCAtPiBicmVha3ZhbCArIHNpemUgPiBtZHAgLT4gdG9wKQorCXsKKwkgIC8qIFRoZSByZXF1ZXN0IHdvdWxkIG1vdmUgdXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50bHkKKwkgICAgIG1hcHBlZCBtZW1vcnksIHNvIG1hcCBpbiBlbm91Z2ggbW9yZSBtZW1vcnkgdG8gc2F0aXNmeQorCSAgICAgdGhlIHJlcXVlc3QuICBUaGlzIG1lYW5zIHdlIGFsc28gaGF2ZSB0byBncm93IHRoZSBtYXBwZWQtdG8KKwkgICAgIGZpbGUgYnkgYW4gYXBwcm9wcmlhdGUgYW1vdW50LCBzaW5jZSBtbWFwIGNhbm5vdCBiZSB1c2VkCisJICAgICB0byBleHRlbmQgYSBmaWxlLiAqLworCSAgbW92ZXRvID0gUEFHRV9BTElHTiAobWRwIC0+IGJyZWFrdmFsICsgc2l6ZSk7CisJICBtYXBieXRlcyA9IG1vdmV0byAtIG1kcCAtPiB0b3A7CisJICBmb2Zmc2V0ID0gbWRwIC0+IHRvcCAtIG1kcCAtPiBiYXNlOworCSAgLyogRklYTUU6ICBUZXN0IHJlc3VsdHMgb2YgbHNlZWsoKSBhbmQgd3JpdGUoKSAqLworCSAgbHNlZWsgKG1kcCAtPiBmZCwgZm9mZnNldCArIG1hcGJ5dGVzIC0gMSwgU0VFS19TRVQpOworCSAgd3JpdGUgKG1kcCAtPiBmZCwgJmJ1ZiwgMSk7CisJICBpZiAobWRwIC0+IGJhc2UgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIExldCBtbWFwIHBpY2sgdGhlIG1hcCBzdGFydCBhZGRyZXNzICovCisJICAgICAgbWFwdG8gPSBtbWFwICgwLCBtYXBieXRlcywgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkJCSAgICBNQVBfU0hBUkVELCBtZHAgLT4gZmQsIGZvZmZzZXQpOworCSAgICAgIGlmIChtYXB0byAhPSAoY2FkZHJfdCkgLTEpCisJCXsKKwkJICBtZHAgLT4gYmFzZSA9IG1kcCAtPiBicmVha3ZhbCA9IG1hcHRvOworCQkgIG1kcCAtPiB0b3AgPSBtZHAgLT4gYmFzZSArIG1hcGJ5dGVzOworCQkgIHJlc3VsdCA9IChQVFIpIG1kcCAtPiBicmVha3ZhbDsKKwkJICBtZHAgLT4gYnJlYWt2YWwgKz0gc2l6ZTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBtYXB0byA9IG1tYXAgKG1kcCAtPiB0b3AsIG1hcGJ5dGVzLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCQkJICAgIE1BUF9TSEFSRUQgfCBNQVBfRklYRUQsIG1kcCAtPiBmZCwgZm9mZnNldCk7CisJICAgICAgaWYgKG1hcHRvID09IG1kcCAtPiB0b3ApCisJCXsKKwkJICBtZHAgLT4gdG9wID0gbW92ZXRvOworCQkgIHJlc3VsdCA9IChQVFIpIG1kcCAtPiBicmVha3ZhbDsKKwkJICBtZHAgLT4gYnJlYWt2YWwgKz0gc2l6ZTsKKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIHJlc3VsdCA9IChQVFIpIG1kcCAtPiBicmVha3ZhbDsKKwkgIG1kcCAtPiBicmVha3ZhbCArPSBzaXplOworCX0KKyAgICB9CisgIHJldHVybiAocmVzdWx0KTsKK30KKworUFRSCitfX21tYWxsb2NfcmVtYXBfY29yZSAobWRwKQorICBzdHJ1Y3QgbWRlc2MgKm1kcDsKK3sKKyAgY2FkZHJfdCBiYXNlOworCisgIC8qIEZJWE1FOiAgUXVpY2sgaGFjaywgbmVlZHMgZXJyb3IgY2hlY2tpbmcgYW5kIG90aGVyIGF0dGVudGlvbi4gKi8KKworICBiYXNlID0gbW1hcCAobWRwIC0+IGJhc2UsIG1kcCAtPiB0b3AgLSBtZHAgLT4gYmFzZSwKKwkgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCB8IE1BUF9GSVhFRCwKKwkgICAgICAgbWRwIC0+IGZkLCAwKTsKKyAgcmV0dXJuICgoUFRSKSBiYXNlKTsKK30KKworUFRSCittbWFsbG9jX2ZpbmRiYXNlIChzaXplKQorICBpbnQgc2l6ZTsKK3sKKyAgaW50IGZkOworICBpbnQgZmxhZ3M7CisgIGNhZGRyX3QgYmFzZSA9IE5VTEw7CisKKyNpZmRlZiBNQVBfQU5PTllNT1VTCisgIGZsYWdzID0gTUFQX1NIQVJFRCB8IE1BUF9BTk9OWU1PVVM7CisgIGZkID0gLTE7CisjZWxzZQorI2lmZGVmIE1BUF9GSUxFCisgIGZsYWdzID0gTUFQX1NIQVJFRCB8IE1BUF9GSUxFOworI2Vsc2UKKyAgZmxhZ3MgPSBNQVBfU0hBUkVEOworI2VuZGlmCisgIGZkID0gb3BlbiAoIi9kZXYvemVybyIsIE9fUkRXUik7CisgIGlmIChmZCAhPSAtMSkKKyAgICB7CisgICAgICByZXR1cm4gKChQVFIpIE5VTEwpOworICAgIH0KKyNlbmRpZgorICBiYXNlID0gbW1hcCAoMCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgZmxhZ3MsIGZkLCAwKTsKKyAgaWYgKGJhc2UgIT0gKGNhZGRyX3QpIC0xKQorICAgIHsKKyAgICAgIG11bm1hcCAoYmFzZSwgKHNpemVfdCkgc2l6ZSk7CisgICAgfQorICBpZiAoZmQgIT0gLTEpCisgICAgeworICAgICAgY2xvc2UgKGZkKTsKKyAgICB9CisgIGlmIChiYXNlID09IDApCisgICAgeworICAgICAgLyogRG9uJ3QgYWxsb3cgbWFwcGluZyBhdCBhZGRyZXNzIHplcm8uICBXZSB1c2UgdGhhdCB2YWx1ZQorCSB0byBzaWduYWwgYW4gZXJyb3IgcmV0dXJuLCBhbmQgYmVzaWRlcywgaXQgaXMgdXNlZnVsIHRvCisJIGNhdGNoIE5VTEwgcG9pbnRlcnMgaWYgaXQgaXMgdW5tYXBwZWQuICBJbnN0ZWFkIHN0YXJ0CisJIGF0IHRoZSBuZXh0IHBhZ2UgYm91bmRhcnkuICovCisgICAgICBiYXNlID0gKGNhZGRyX3QpIGdldHBhZ2VzaXplICgpOworICAgIH0KKyAgZWxzZSBpZiAoYmFzZSA9PSAoY2FkZHJfdCkgLTEpCisgICAgeworICAgICAgYmFzZSA9IE5VTEw7CisgICAgfQorICByZXR1cm4gKChQVFIpIGJhc2UpOworfQorCisjZWxzZQkvKiBkZWZpbmVkKEhBVkVfTU1BUCkgKi8KKy8qIFByZXZlbnQgImVtcHR5IHRyYW5zbGF0aW9uIHVuaXQiIHdhcm5pbmdzIGZyb20gdGhlIGlkaW90cyBhdCBYM0oxMS4gKi8KK3N0YXRpYyBjaGFyIGFuc2lfY19pZGlvdHMgPSA2OTsKKyNlbmRpZgkvKiBkZWZpbmVkKEhBVkVfTU1BUCkgKi8KZGlmZiAtLWdpdCBhL21tYWxsb2MvbW1jaGVjay5jIGIvbW1hbGxvYy9tbWNoZWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5MzZiMwotLS0gL2Rldi9udWxsCisrKyBiL21tYWxsb2MvbW1jaGVjay5jCkBAIC0wLDAgKzEsMjIzIEBACisvKiBTdGFuZGFyZCBkZWJ1Z2dpbmcgaG9va3MgZm9yIGBtbWFsbG9jJy4KKyAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICBXcml0dGVuIE1heSAxOTg5IGJ5IE1pa2UgSGFlcnRlbC4KKyAgIEhlYXZpbHkgbW9kaWZpZWQgTWFyIDE5OTIgYnkgRnJlZCBGaXNoIChmbmZAY3lnbnVzLmNvbSkKKworVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCittb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKK0xpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKK0xpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgorbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCitCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgKEVtYWlsKSBhdCB0aGUgYWRkcmVzcyBtaWtlQGFpLm1pdC5lZHUsCisgb3IgKFVTIG1haWwpIGFzIE1pa2UgSGFlcnRlbCBjL28gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAqLworCisjaW5jbHVkZSAibW1wcml2YXRlLmgiCisKKy8qIERlZmF1bHQgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHNvbWV0aGluZyBhd2Z1bCBoYXBwZW5zLiAgVGhlIGFwcGxpY2F0aW9uCisgICBjYW4gc3BlY2lmeSBhbiBhbHRlcm5hdGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGluc3RlYWQgKGFuZCBwcm9iYWJseSB3aWxsCisgICB3YW50IHRvKS4gKi8KKworZXh0ZXJuIHZvaWQgYWJvcnQgUEFSQU1TICgodm9pZCkpOworCisvKiBBcmJpdHJhcnkgbWFnaWNhbCBudW1iZXJzLiAgKi8KKworI2RlZmluZSBNQUdJQ1dPUkQJKHVuc2lnbmVkIGludCkgMHhmZWRhYmVlYgkvKiBBY3RpdmUgY2h1bmsgKi8KKyNkZWZpbmUgTUFHSUNXT1JERlJFRQkodW5zaWduZWQgaW50KSAweGRlYWRiZWVmCS8qIEluYWN0aXZlIGNodW5rICovCisjZGVmaW5lIE1BR0lDQllURQkoKGNoYXIpIDB4ZDcpCisKKy8qIEVhY2ggbWVtb3J5IGFsbG9jYXRpb24gaXMgYm91bmRlZCBieSBhIGhlYWRlciBzdHJ1Y3R1cmUgYW5kIGEgdHJhaWxlcgorICAgYnl0ZS4gIEkuRS4KKworCTxzaXplPjxtYWdpY3dvcmQ+PHVzZXIncyBhbGxvY2F0aW9uPjxtYWdpY2J5dGU+CisKKyAgIFRoZSBwb2ludGVyIHJldHVybmVkIHRvIHRoZSB1c2VyIHBvaW50cyB0byB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUKKyAgIHVzZXIncyBhbGxvY2F0aW9uIGFyZWEuICBUaGUgbWFnaWMgd29yZCBjYW4gYmUgdGVzdGVkIHRvIGRldGVjdAorICAgYnVmZmVyIHVuZGVycnVucyBhbmQgdGhlIG1hZ2ljIGJ5dGUgY2FuIGJlIHRlc3RlZCB0byBkZXRlY3Qgb3ZlcnJ1bnMuICovCisKK3N0cnVjdCBoZHIKKyAgeworICAgIHNpemVfdCBzaXplOwkJLyogRXhhY3Qgc2l6ZSByZXF1ZXN0ZWQgYnkgdXNlci4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgbWFnaWM7CS8qIE1hZ2ljIG51bWJlciB0byBjaGVjayBoZWFkZXIgaW50ZWdyaXR5LiAgKi8KKyAgfTsKKworc3RhdGljIHZvaWQgY2hlY2toZHIgUEFSQU1TICgoc3RydWN0IG1kZXNjICosIENPTlNUIHN0cnVjdCBoZHIgKikpOworc3RhdGljIHZvaWQgbWZyZWVfY2hlY2sgUEFSQU1TICgoUFRSLCBQVFIpKTsKK3N0YXRpYyBQVFIgbW1hbGxvY19jaGVjayBQQVJBTVMgKChQVFIsIHNpemVfdCkpOworc3RhdGljIFBUUiBtcmVhbGxvY19jaGVjayBQQVJBTVMgKChQVFIsIFBUUiwgc2l6ZV90KSk7CisKKy8qIENoZWNrIHRoZSBtYWdpY3dvcmQgYW5kIG1hZ2ljYnl0ZSwgYW5kIGlmIGVpdGhlciBpcyBjb3JydXB0ZWQgdGhlbgorICAgY2FsbCB0aGUgZW1lcmdlbmN5IGFib3J0IGZ1bmN0aW9uIHNwZWNpZmllZCBmb3IgdGhlIGhlYXAgaW4gdXNlLiAqLworCitzdGF0aWMgdm9pZAorY2hlY2toZHIgKG1kcCwgaGRyKQorICBzdHJ1Y3QgbWRlc2MgKm1kcDsKKyAgQ09OU1Qgc3RydWN0IGhkciAqaGRyOworeworICBpZiAoaGRyIC0+IG1hZ2ljICE9IE1BR0lDV09SRCB8fAorICAgICAgKChjaGFyICopICZoZHJbMV0pW2hkciAtPiBzaXplXSAhPSBNQUdJQ0JZVEUpCisgICAgeworICAgICAgKCptZHAgLT4gYWJvcnRmdW5jKSgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK21mcmVlX2NoZWNrIChtZCwgcHRyKQorICBQVFIgbWQ7CisgIFBUUiBwdHI7Cit7CisgIHN0cnVjdCBoZHIgKmhkciA9ICgoc3RydWN0IGhkciAqKSBwdHIpIC0gMTsKKyAgc3RydWN0IG1kZXNjICptZHA7CisKKyAgbWRwID0gTURfVE9fTURQIChtZCk7CisgIGNoZWNraGRyIChtZHAsIGhkcik7CisgIGhkciAtPiBtYWdpYyA9IE1BR0lDV09SREZSRUU7CisgIG1kcCAtPiBtZnJlZV9ob29rID0gTlVMTDsKKyAgbWZyZWUgKG1kLCAoUFRSKWhkcik7CisgIG1kcCAtPiBtZnJlZV9ob29rID0gbWZyZWVfY2hlY2s7Cit9CisKK3N0YXRpYyBQVFIKK21tYWxsb2NfY2hlY2sgKG1kLCBzaXplKQorICBQVFIgbWQ7CisgIHNpemVfdCBzaXplOworeworICBzdHJ1Y3QgaGRyICpoZHI7CisgIHN0cnVjdCBtZGVzYyAqbWRwOworICBzaXplX3QgbmJ5dGVzOworCisgIG1kcCA9IE1EX1RPX01EUCAobWQpOworICBtZHAgLT4gbW1hbGxvY19ob29rID0gTlVMTDsKKyAgbmJ5dGVzID0gc2l6ZW9mIChzdHJ1Y3QgaGRyKSArIHNpemUgKyAxOworICBoZHIgPSAoc3RydWN0IGhkciAqKSBtbWFsbG9jIChtZCwgbmJ5dGVzKTsKKyAgbWRwIC0+IG1tYWxsb2NfaG9vayA9IG1tYWxsb2NfY2hlY2s7CisgIGlmIChoZHIgIT0gTlVMTCkKKyAgICB7CisgICAgICBoZHIgLT4gc2l6ZSA9IHNpemU7CisgICAgICBoZHIgLT4gbWFnaWMgPSBNQUdJQ1dPUkQ7CisgICAgICBoZHIrKzsKKyAgICAgICooKGNoYXIgKikgaGRyICsgc2l6ZSkgPSBNQUdJQ0JZVEU7CisgICAgfQorICByZXR1cm4gKChQVFIpIGhkcik7Cit9CisKK3N0YXRpYyBQVFIKK21yZWFsbG9jX2NoZWNrIChtZCwgcHRyLCBzaXplKQorICBQVFIgbWQ7CisgIFBUUiBwdHI7CisgIHNpemVfdCBzaXplOworeworICBzdHJ1Y3QgaGRyICpoZHIgPSAoKHN0cnVjdCBoZHIgKikgcHRyKSAtIDE7CisgIHN0cnVjdCBtZGVzYyAqbWRwOworICBzaXplX3QgbmJ5dGVzOworCisgIG1kcCA9IE1EX1RPX01EUCAobWQpOworICBjaGVja2hkciAobWRwLCBoZHIpOworICBtZHAgLT4gbWZyZWVfaG9vayA9IE5VTEw7CisgIG1kcCAtPiBtbWFsbG9jX2hvb2sgPSBOVUxMOworICBtZHAgLT4gbXJlYWxsb2NfaG9vayA9IE5VTEw7CisgIG5ieXRlcyA9IHNpemVvZiAoc3RydWN0IGhkcikgKyBzaXplICsgMTsKKyAgaGRyID0gKHN0cnVjdCBoZHIgKikgbXJlYWxsb2MgKG1kLCAoUFRSKSBoZHIsIG5ieXRlcyk7CisgIG1kcCAtPiBtZnJlZV9ob29rID0gbWZyZWVfY2hlY2s7CisgIG1kcCAtPiBtbWFsbG9jX2hvb2sgPSBtbWFsbG9jX2NoZWNrOworICBtZHAgLT4gbXJlYWxsb2NfaG9vayA9IG1yZWFsbG9jX2NoZWNrOworICBpZiAoaGRyICE9IE5VTEwpCisgICAgeworICAgICAgaGRyIC0+IHNpemUgPSBzaXplOworICAgICAgaGRyKys7CisgICAgICAqKChjaGFyICopIGhkciArIHNpemUpID0gTUFHSUNCWVRFOworICAgIH0KKyAgcmV0dXJuICgoUFRSKSBoZHIpOworfQorCisvKiBUdXJuIG9uIGRlZmF1bHQgY2hlY2tpbmcgZm9yIG1tYWxsb2MvbXJlYWxsb2MvbWZyZWUsIGZvciB0aGUgaGVhcCBzcGVjaWZpZWQKKyAgIGJ5IE1ELiAgSWYgRlVOQyBpcyBub24tTlVMTCwgaXQgaXMgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0byBjYWxsCisgICB0byBhYm9ydCB3aGVuZXZlciBtZW1vcnkgY29ycnVwdGlvbiBpcyBkZXRlY3RlZC4gIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlCisgICBzdGFuZGFyZCBsaWJyYXJ5IGZ1bmN0aW9uIGFib3J0KCkuCisKKyAgIE5vdGUgdGhhdCB3ZSBkaXNhbGxvdyBpbnN0YWxsYXRpb24gb2YgaW5pdGlhbCBjaGVja2luZyBob29rcyBpZiBtbWFsbG9jCisgICBoYXMgYmVlbiBjYWxsZWQgYXQgYW55IHRpbWUgZm9yIHRoaXMgcGFydGljdWxhciBoZWFwLCBzaW5jZSBpZiBhbnkgcmVnaW9uCisgICB0aGF0IGlzIGFsbG9jYXRlZCBwcmlvciB0byBpbnN0YWxsYXRpb24gb2YgdGhlIGhvb2tzIGlzIHN1YnNlcXVlbnRseQorICAgcmVhbGxvY2F0ZWQgb3IgZnJlZWQgYWZ0ZXIgaW5zdGFsbGF0aW9uIG9mIHRoZSBob29rcywgaXQgaXMgZ3VhcmFudGVlZAorICAgdG8gdHJpZ2dlciBhIG1lbW9yeSBjb3JydXB0aW9uIGVycm9yLiAgV2UgZG8gdGhpcyBieSBjaGVja2luZyB0aGUgc3RhdGUKKyAgIG9mIHRoZSBNTUFMTE9DX0lOSVRJQUxJWkVEIGZsYWcuICBJZiB0aGUgRk9SQ0UgYXJndW1lbnQgaXMgbm9uLXplcm8sIHRoaXMKKyAgIGNoZWNraW5nIGlzIGRpc2FibGVkIGFuZCBpdCBpcyBhbGxvd2VkIHRvIGluc3RhbGwgdGhlIGNoZWNraW5nIGhvb2tzIGF0IGFueQorICAgdGltZS4gIFRoaXMgaXMgdXNlZnVsIG9uIHN5c3RlbXMgd2hlcmUgdGhlIEMgcnVudGltZSBtYWtlcyBvbmUgb3IgbW9yZQorICAgbWFsbG9jIGNhbGxzIGJlZm9yZSB0aGUgdXNlciBjb2RlIGhhZCBhIGNoYW5jZSB0byBjYWxsIG1tY2hlY2sgb3IgbW1jaGVja2YsCisgICBidXQgbmV2ZXIgY2FsbHMgZnJlZSB3aXRoIHRoZXNlIHZhbHVlcy4gIFRodXMgaWYgd2UgYXJlIGNlcnRhaW4gdGhhdCBvbmx5CisgICB2YWx1ZXMgb2J0YWluZWQgZnJvbSBtYWxsb2NzIGFmdGVyIGFuIG1tY2hlY2svbW1jaGVja2Ygd2lsbCBldmVyIGJlIHBhc3NlZAorICAgdG8gZnJlZSgpLCB3ZSBjYW4gZ28gYWhlYWQgYW5kIGZvcmNlIGluc3RhbGxhdGlvbiBvZiB0aGUgdXNlZnVsIGNoZWNraW5nCisgICBob29rcy4KKworICAgSG93ZXZlciwgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBhdCBhbnkgdGltZSBhZnRlciB0aGUgaW5pdGlhbCBjYWxsLAorICAgdG8gdXBkYXRlIHRoZSBmdW5jdGlvbiBwb2ludGVycyB0byB0aGUgY2hlY2tpbmcgcm91dGluZXMgYW5kIHRvIHRoZQorICAgdXNlciBkZWZpbmVkIGNvcnJ1cHRpb24gaGFuZGxlciByb3V0aW5lLCBhcyBsb25nIGFzIHRoZXNlIGZ1bmN0aW9uIHBvaW50ZXJzCisgICBoYXZlIGJlZW4gcHJldmlvdXNseSBleHRhYmxpc2hlZCBieSB0aGUgaW5pdGlhbCBjYWxsLiAgTm90ZSB0aGF0IHdlCisgICBkbyB0aGlzIGF1dG9tYXRpY2FsbHkgd2hlbiByZW1hcHBpbmcgYSBwcmV2aW91c2x5IHVzZWQgaGVhcCwgdG8gZW5zdXJlCisgICB0aGF0IHRoZSBob29rcyBnZXQgdXBkYXRlZCB0byB0aGUgY29ycmVjdCB2YWx1ZXMsIGFsdGhvdWdoIHRoZSBjb3JydXB0aW9uCisgICBoYW5kbGVyIHBvaW50ZXIgZ2V0cyBzZXQgYmFjayB0byB0aGUgZGVmYXVsdC4gIFRoZSBhcHBsaWNhdGlvbiBjYW4gdGhlbgorICAgY2FsbCBtbWNoZWNrIHRvIHVzZSBhIGRpZmZlcmVudCBjb3JydXB0aW9uIGhhbmRsZXIgaWYgZGVzaXJlZC4KKworICAgUmV0dXJucyBub24temVybyBpZiBjaGVja2luZyBpcyBzdWNjZXNzZnVsbHkgZW5hYmxlZCwgemVybyBvdGhlcndpc2UuICovCisKK2ludAorbW1jaGVja2YgKG1kLCBmdW5jLCBmb3JjZSkKKyAgUFRSIG1kOworICB2b2lkICgqZnVuYykgUEFSQU1TICgodm9pZCkpOworICBpbnQgZm9yY2U7Cit7CisgIHN0cnVjdCBtZGVzYyAqbWRwOworICBpbnQgcnRudmFsOworCisgIG1kcCA9IE1EX1RPX01EUCAobWQpOworCisgIC8qIFdlIGNhbiBzYWZlbHkgc2V0IG9yIHVwZGF0ZSB0aGUgYWJvcnQgZnVuY3Rpb24gYXQgYW55IHRpbWUsIHJlZ2FyZGxlc3MKKyAgICAgb2Ygd2hldGhlciBvciBub3Qgd2Ugc3VjY2Vzc2Z1bGx5IGRvIGFueXRoaW5nIGVsc2UuICovCisKKyAgbWRwIC0+IGFib3J0ZnVuYyA9IChmdW5jICE9IE5VTEwgPyBmdW5jIDogYWJvcnQpOworCisgIC8qIElmIHdlIGhhdmVuJ3QgeWV0IGNhbGxlZCBtbWFsbG9jIHRoZSBmaXJzdCB0aW1lIGZvciB0aGlzIGhlYXAsIG9yIGlmIHdlCisgICAgIGhhdmUgaG9va3MgdGhhdCB3ZXJlIHByZXZpb3VzbHkgaW5zdGFsbGVkLCB0aGVuIGFsbG93IHRoZSBob29rcyB0byBiZQorICAgICBpbml0aWFsaXplZCBvciB1cGRhdGVkLiAqLworCisgIGlmIChmb3JjZSB8fAorICAgICAgIShtZHAgLT4gZmxhZ3MgJiBNTUFMTE9DX0lOSVRJQUxJWkVEKSB8fAorICAgICAgKG1kcCAtPiBtZnJlZV9ob29rICE9IE5VTEwpKQorICAgIHsKKyAgICAgIG1kcCAtPiBtZnJlZV9ob29rID0gbWZyZWVfY2hlY2s7CisgICAgICBtZHAgLT4gbW1hbGxvY19ob29rID0gbW1hbGxvY19jaGVjazsKKyAgICAgIG1kcCAtPiBtcmVhbGxvY19ob29rID0gbXJlYWxsb2NfY2hlY2s7CisgICAgICBtZHAgLT4gZmxhZ3MgfD0gTU1BTExPQ19NTUNIRUNLX1VTRUQ7CisgICAgICBydG52YWwgPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJ0bnZhbCA9IDA7CisgICAgfQorCisgIHJldHVybiAocnRudmFsKTsKK30KKworLyogVGhpcyByb3V0aW5lIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5LCBpbiBjYXNlIHRoZXJlIGFyZQorICAgc3RpbGwgY2FsbGVycyB0byB0aGUgb3JpZ2luYWwgbW1jaGVjayBmdW5jdGlvbi4gKi8KKworaW50CittbWNoZWNrIChtZCwgZnVuYykKKyAgUFRSIG1kOworICB2b2lkICgqZnVuYykgUEFSQU1TICgodm9pZCkpOworeworICBpbnQgcnRudmFsOworCisgIHJ0bnZhbCA9IG1tY2hlY2tmIChtZCwgZnVuYywgMCk7CisgIHJldHVybiAocnRudmFsKTsKK30KZGlmZiAtLWdpdCBhL21tYWxsb2MvbW1lbWFsaWduLmMgYi9tbWFsbG9jL21tZW1hbGlnbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZGEwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9tbWFsbG9jL21tZW1hbGlnbi5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCitUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCitub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgIm1tcHJpdmF0ZS5oIgorCitQVFIKK21tZW1hbGlnbiAobWQsIGFsaWdubWVudCwgc2l6ZSkKKyAgUFRSIG1kOworICBzaXplX3QgYWxpZ25tZW50OworICBzaXplX3Qgc2l6ZTsKK3sKKyAgUFRSIHJlc3VsdDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgYWRqOworICBzdHJ1Y3QgYWxpZ25saXN0ICpsOworICBzdHJ1Y3QgbWRlc2MgKm1kcDsKKworICBpZiAoKHJlc3VsdCA9IG1tYWxsb2MgKG1kLCBzaXplICsgYWxpZ25tZW50IC0gMSkpICE9IE5VTEwpCisgICAgeworICAgICAgYWRqID0gUkVTSURVQUwgKHJlc3VsdCwgYWxpZ25tZW50KTsKKyAgICAgIGlmIChhZGogIT0gMCkKKwl7CisJICBtZHAgPSBNRF9UT19NRFAgKG1kKTsKKwkgIGZvciAobCA9IG1kcCAtPiBhbGlnbmVkX2Jsb2NrczsgbCAhPSBOVUxMOyBsID0gbCAtPiBuZXh0KQorCSAgICB7CisJICAgICAgaWYgKGwgLT4gYWxpZ25lZCA9PSBOVUxMKQorCQl7CisJCSAgLyogVGhpcyBzbG90IGlzIGZyZWUuICBVc2UgaXQuICAqLworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwkgIGlmIChsID09IE5VTEwpCisJICAgIHsKKwkgICAgICBsID0gKHN0cnVjdCBhbGlnbmxpc3QgKikgbW1hbGxvYyAobWQsIHNpemVvZiAoc3RydWN0IGFsaWdubGlzdCkpOworCSAgICAgIGlmIChsID09IE5VTEwpCisJCXsKKwkJICBtZnJlZSAobWQsIHJlc3VsdCk7CisJCSAgcmV0dXJuIChOVUxMKTsKKwkJfQorCSAgICAgIGwgLT4gbmV4dCA9IG1kcCAtPiBhbGlnbmVkX2Jsb2NrczsKKwkgICAgICBtZHAgLT4gYWxpZ25lZF9ibG9ja3MgPSBsOworCSAgICB9CisJICBsIC0+IGV4YWN0ID0gcmVzdWx0OworCSAgcmVzdWx0ID0gbCAtPiBhbGlnbmVkID0gKGNoYXIgKikgcmVzdWx0ICsgYWxpZ25tZW50IC0gYWRqOworCX0KKyAgICB9CisgIHJldHVybiAocmVzdWx0KTsKK30KZGlmZiAtLWdpdCBhL21tYWxsb2MvbW1wcml2YXRlLmggYi9tbWFsbG9jL21tcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NzYyNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tbWFsbG9jL21tcHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzQzIEBACisvKiBEZWNsYXJhdGlvbnMgZm9yIGBtbWFsbG9jJyBhbmQgZnJpZW5kcy4KKyAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICBXcml0dGVuIE1heSAxOTg5IGJ5IE1pa2UgSGFlcnRlbC4KKyAgIEhlYXZpbHkgbW9kaWZpZWQgTWFyIDE5OTIgYnkgRnJlZCBGaXNoLiAoZm5mQGN5Z251cy5jb20pCisKK1RoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCitMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKK25vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyAgIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgKEVtYWlsKSBhdCB0aGUgYWRkcmVzcyBtaWtlQGFpLm1pdC5lZHUsCisgICBvciAoVVMgbWFpbCkgYXMgTWlrZSBIYWVydGVsIGMvbyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICovCisKKworI2lmbmRlZiBfX01NUFJJVkFURV9ICisjZGVmaW5lIF9fTU1QUklWQVRFX0ggMQorCisjaW5jbHVkZSAibW1hbGxvYy5oIgorCisjaWZkZWYgSEFWRV9MSU1JVFNfSAorIyAgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyAgaWZuZGVmIENIQVJfQklUCisjICAgIGRlZmluZSBDSEFSX0JJVCA4CisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgTUlOCisjICBkZWZpbmUgTUlOKEEsIEIpICgoQSkgPCAoQikgPyAoQSkgOiAoQikpCisjZW5kaWYKKworI2RlZmluZSBNTUFMTE9DX01BR0lDCQkibW1hbGxvYyIJLyogTWFwcGVkIGZpbGUgbWFnaWMgbnVtYmVyICovCisjZGVmaW5lIE1NQUxMT0NfTUFHSUNfU0laRQk4CQkvKiBTaXplIG9mIG1hZ2ljIG51bWJlciBidWYgKi8KKyNkZWZpbmUgTU1BTExPQ19WRVJTSU9OCQkxCQkvKiBDdXJyZW50IG1tYWxsb2MgdmVyc2lvbiAqLworI2RlZmluZSBNTUFMTE9DX0tFWVMJCTE2CQkvKiBLZXlzIGZvciBhcHBsaWNhdGlvbiB1c2UgKi8KKworLyogVGhlIGFsbG9jYXRvciBkaXZpZGVzIHRoZSBoZWFwIGludG8gYmxvY2tzIG9mIGZpeGVkIHNpemU7IGxhcmdlCisgICByZXF1ZXN0cyByZWNlaXZlIG9uZSBvciBtb3JlIHdob2xlIGJsb2NrcywgYW5kIHNtYWxsIHJlcXVlc3RzCisgICByZWNlaXZlIGEgZnJhZ21lbnQgb2YgYSBibG9jay4gIEZyYWdtZW50IHNpemVzIGFyZSBwb3dlcnMgb2YgdHdvLAorICAgYW5kIGFsbCBmcmFnbWVudHMgb2YgYSBibG9jayBhcmUgdGhlIHNhbWUgc2l6ZS4gIFdoZW4gYWxsIHRoZQorICAgZnJhZ21lbnRzIGluIGEgYmxvY2sgaGF2ZSBiZWVuIGZyZWVkLCB0aGUgYmxvY2sgaXRzZWxmIGlzIGZyZWVkLiAgKi8KKworI2RlZmluZSBJTlRfQklUCQkoQ0hBUl9CSVQgKiBzaXplb2YoaW50KSkKKyNkZWZpbmUgQkxPQ0tMT0cJKElOVF9CSVQgPiAxNiA/IDEyIDogOSkKKyNkZWZpbmUgQkxPQ0tTSVpFCSgodW5zaWduZWQgaW50KSAxIDw8IEJMT0NLTE9HKQorI2RlZmluZSBCTE9DS0lGWShTSVpFKQkoKChTSVpFKSArIEJMT0NLU0laRSAtIDEpIC8gQkxPQ0tTSVpFKQorCisvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBwb2ludGVycyBpcyBhIHNpZ25lZCBpbnQuICBPbiBtYWNoaW5lcyB3aGVyZQorICAgdGhlIGRhdGEgYWRkcmVzc2VzIGhhdmUgdGhlIGhpZ2ggYml0IHNldCwgd2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUKKyAgIGRpZmZlcmVuY2UgYmVjb21lcyBhbiB1bnNpZ25lZCBpbnQgd2hlbiB3ZSBhcmUgdXNpbmcgdGhlIGFkZHJlc3MgYXMgYW4KKyAgIGludGVncmFsIHZhbHVlLiAgSW4gYWRkaXRpb24sIHdoZW4gdXNpbmcgd2l0aCB0aGUgJyUnIG9wZXJhdG9yLCB0aGUKKyAgIHNpZ24gb2YgdGhlIHJlc3VsdCBpcyBtYWNoaW5lIGRlcGVuZGVudCBmb3IgbmVnYXRpdmUgdmFsdWVzLCBzbyBmb3JjZQorICAgaXQgdG8gYmUgdHJlYXRlZCBhcyBhbiB1bnNpZ25lZCBpbnQuICovCisKKyNkZWZpbmUgQUREUjJVSU5UKGFkZHIpCSgodW5zaWduZWQgaW50KSAoKGNoYXIgKikgKGFkZHIpIC0gKGNoYXIgKikgTlVMTCkpCisjZGVmaW5lIFJFU0lEVUFMKGFkZHIsYnNpemUpICgodW5zaWduZWQgaW50KSAoQUREUjJVSU5UIChhZGRyKSAlIChic2l6ZSkpKQorCisvKiBEZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBtZW1vcnkgc3Bhbm5lZCBieSB0aGUgaW5pdGlhbCBoZWFwIHRhYmxlCisgICAobm90IGFuIGFic29sdXRlIGxpbWl0KS4gICovCisKKyNkZWZpbmUgSEVBUAkJKElOVF9CSVQgPiAxNiA/IDQxOTQzMDQgOiA2NTUzNikKKworLyogTnVtYmVyIG9mIGNvbnRpZ3VvdXMgZnJlZSBibG9ja3MgYWxsb3dlZCB0byBidWlsZCB1cCBhdCB0aGUgZW5kIG9mCisgICBtZW1vcnkgYmVmb3JlIHRoZXkgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgc3lzdGVtLiAgKi8KKworI2RlZmluZSBGSU5BTF9GUkVFX0JMT0NLUwk4CisKKy8qIFdoZXJlIHRvIHN0YXJ0IHNlYXJjaGluZyB0aGUgZnJlZSBsaXN0IHdoZW4gbG9va2luZyBmb3IgbmV3IG1lbW9yeS4KKyAgIFRoZSB0d28gcG9zc2libGUgdmFsdWVzIGFyZSAwIGFuZCBoZWFwaW5kZXguICBTdGFydGluZyBhdCAwIHNlZW1zCisgICB0byByZWR1Y2UgdG90YWwgbWVtb3J5IHVzYWdlLCB3aGlsZSBzdGFydGluZyBhdCBoZWFwaW5kZXggc2VlbXMgdG8KKyAgIHJ1biBmYXN0ZXIuICAqLworCisjZGVmaW5lIE1BTExPQ19TRUFSQ0hfU1RBUlQJbWRwIC0+IGhlYXBpbmRleAorCisvKiBBZGRyZXNzIHRvIGJsb2NrIG51bWJlciBhbmQgdmljZSB2ZXJzYS4gICovCisKKyNkZWZpbmUgQkxPQ0soQSkgKCgoY2hhciAqKSAoQSkgLSBtZHAgLT4gaGVhcGJhc2UpIC8gQkxPQ0tTSVpFICsgMSkKKworI2RlZmluZSBBRERSRVNTKEIpICgoUFRSKSAoKChCKSAtIDEpICogQkxPQ0tTSVpFICsgbWRwIC0+IGhlYXBiYXNlKSkKKworLyogRGF0YSBzdHJ1Y3R1cmUgZ2l2aW5nIHBlci1ibG9jayBpbmZvcm1hdGlvbi4gICovCisKK3R5cGVkZWYgdW5pb24KKyAgeworICAgIC8qIEhlYXAgaW5mb3JtYXRpb24gZm9yIGEgYnVzeSBibG9jay4gICovCisgICAgc3RydWN0CisgICAgICB7CisJLyogWmVybyBmb3IgYSBsYXJnZSBibG9jaywgb3IgcG9zaXRpdmUgZ2l2aW5nIHRoZQorCSAgIGxvZ2FyaXRobSB0byB0aGUgYmFzZSB0d28gb2YgdGhlIGZyYWdtZW50IHNpemUuICAqLworCWludCB0eXBlOworCXVuaW9uCisJICB7CisJICAgIHN0cnVjdAorCSAgICAgIHsKKwkJc2l6ZV90IG5mcmVlOwkvKiBGcmVlIGZyYWdtZW50cyBpbiBhIGZyYWdtZW50ZWQgYmxvY2suICAqLworCQlzaXplX3QgZmlyc3Q7CS8qIEZpcnN0IGZyZWUgZnJhZ21lbnQgb2YgdGhlIGJsb2NrLiAgKi8KKwkgICAgICB9IGZyYWc7CisJICAgIC8qIFNpemUgKGluIGJsb2Nrcykgb2YgYSBsYXJnZSBjbHVzdGVyLiAgKi8KKwkgICAgc2l6ZV90IHNpemU7CisJICB9IGluZm87CisgICAgICB9IGJ1c3k7CisgICAgLyogSGVhcCBpbmZvcm1hdGlvbiBmb3IgYSBmcmVlIGJsb2NrICh0aGF0IG1heSBiZSB0aGUgZmlyc3Qgb2YKKyAgICAgICBhIGZyZWUgY2x1c3RlcikuICAqLworICAgIHN0cnVjdAorICAgICAgeworCXNpemVfdCBzaXplOwkJLyogU2l6ZSAoaW4gYmxvY2tzKSBvZiBhIGZyZWUgY2x1c3Rlci4gICovCisJc2l6ZV90IG5leHQ7CQkvKiBJbmRleCBvZiBuZXh0IGZyZWUgY2x1c3Rlci4gICovCisJc2l6ZV90IHByZXY7CQkvKiBJbmRleCBvZiBwcmV2aW91cyBmcmVlIGNsdXN0ZXIuICAqLworICAgICAgfSBmcmVlOworICB9IG1hbGxvY19pbmZvOworCisvKiBMaXN0IG9mIGJsb2NrcyBhbGxvY2F0ZWQgd2l0aCBgbW1lbWFsaWduJyAob3IgYG12YWxsb2MnKS4gICovCisKK3N0cnVjdCBhbGlnbmxpc3QKKyAgeworICAgIHN0cnVjdCBhbGlnbmxpc3QgKm5leHQ7CisgICAgUFRSIGFsaWduZWQ7CQkvKiBUaGUgYWRkcmVzcyB0aGF0IG1tZW1hbGlnbmVkIHJldHVybmVkLiAgKi8KKyAgICBQVFIgZXhhY3Q7CQkJLyogVGhlIGFkZHJlc3MgdGhhdCBtYWxsb2MgcmV0dXJuZWQuICAqLworICB9OworCisvKiBEb3VibHkgbGlua2VkIGxpc3RzIG9mIGZyZWUgZnJhZ21lbnRzLiAgKi8KKworc3RydWN0IGxpc3QKKyAgeworICAgIHN0cnVjdCBsaXN0ICpuZXh0OworICAgIHN0cnVjdCBsaXN0ICpwcmV2OworICB9OworCisvKiBTdGF0aXN0aWNzIGF2YWlsYWJsZSB0byB0aGUgdXNlci4KKyAgIEZJWE1FOiAgQnkgZGVzaWduLCB0aGUgaW50ZXJuYWxzIG9mIHRoZSBtYWxsb2MgcGFja2FnZSBhcmUgbm8gbG9uZ2VyCisgICBleHBvcnRlZCB0byB0aGUgdXNlciB2aWEgYW4gaW5jbHVkZSBmaWxlLCBzbyBhY2Nlc3MgdG8gdGhpcyBkYXRhIG5lZWRzCisgICB0byBiZSB2aWEgc29tZSBvdGhlciBtZWNoYW5pc20sIHN1Y2ggYXMgbW1zdGF0Xzxzb21ldGhpbmc+IHdoZXJlIHRoZQorICAgcmV0dXJuIHZhbHVlIGlzIHRoZSA8c29tZXRoaW5nPiB0aGUgdXNlciBpcyBpbnRlcmVzdGVkIGluLiAqLworCitzdHJ1Y3QgbXN0YXRzCisgIHsKKyAgICBzaXplX3QgYnl0ZXNfdG90YWw7CQkvKiBUb3RhbCBzaXplIG9mIHRoZSBoZWFwLiAqLworICAgIHNpemVfdCBjaHVua3NfdXNlZDsJCS8qIENodW5rcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIuICovCisgICAgc2l6ZV90IGJ5dGVzX3VzZWQ7CQkvKiBCeXRlIHRvdGFsIG9mIHVzZXItYWxsb2NhdGVkIGNodW5rcy4gKi8KKyAgICBzaXplX3QgY2h1bmtzX2ZyZWU7CQkvKiBDaHVua3MgaW4gdGhlIGZyZWUgbGlzdC4gKi8KKyAgICBzaXplX3QgYnl0ZXNfZnJlZTsJCS8qIEJ5dGUgdG90YWwgb2YgY2h1bmtzIGluIHRoZSBmcmVlIGxpc3QuICovCisgIH07CisKKy8qIEludGVybmFsIHN0cnVjdHVyZSB0aGF0IGRlZmluZXMgdGhlIGZvcm1hdCBvZiB0aGUgbWFsbG9jLWRlc2NyaXB0b3IuCisgICBUaGlzIGdldHMgd3JpdHRlbiB0byB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24gdGhhdCBtbWFsbG9jIGlzCisgICBtYW5hZ2luZywgYW5kIHRodXMgYWxzbyBiZWNvbWVzIHRoZSBmaWxlIGhlYWRlciBmb3IgdGhlIG1hcHBlZCBmaWxlLAorICAgaWYgc3VjaCBhIGZpbGUgZXhpc3RzLiAqLworCitzdHJ1Y3QgbWRlc2MKK3sKKyAgLyogVGhlICJtYWdpYyBudW1iZXIiIGZvciBhbiBtbWFsbG9jIGZpbGUuICovCisKKyAgY2hhciBtYWdpY1tNTUFMTE9DX01BR0lDX1NJWkVdOworCisgIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoaXMgc3RydWN0dXJlLCB1c2VkIGFzIGEgc2FuaXR5IGNoZWNrIHdoZW4gcmV1c2luZworICAgICBhIHByZXZpb3VzbHkgY3JlYXRlZCBtYXBwZWQgZmlsZS4gKi8KKworICB1bnNpZ25lZCBpbnQgaGVhZGVyc2l6ZTsKKworICAvKiBUaGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIG1tYWxsb2MgcGFja2FnZSB0aGF0IGNyZWF0ZWQgdGhpcyBmaWxlLiAqLworCisgIHVuc2lnbmVkIGNoYXIgdmVyc2lvbjsKKworICAvKiBTb21lIGZsYWcgYml0cyB0byBrZWVwIHRyYWNrIG9mIHZhcmlvdXMgaW50ZXJuYWwgdGhpbmdzLiAqLworCisgIHVuc2lnbmVkIGludCBmbGFnczsKKworICAvKiBJZiBhIHN5c3RlbSBjYWxsIG1hZGUgYnkgdGhlIG1tYWxsb2MgcGFja2FnZSBmYWlscywgdGhlIGVycm5vIGlzCisgICAgIHByZXNlcnZlZCBmb3IgZnV0dXJlIGV4YW1pbmF0aW9uLiAqLworCisgIGludCBzYXZlZF9lcnJubzsKKworICAvKiBQb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgdG8gZ2V0IG1vcmUgY29yZSwgb3IgcmV0dXJuIGNvcmUKKyAgICAgdG8gdGhlIHN5c3RlbSwgZm9yIHJlcXVlc3RzIHVzaW5nIHRoaXMgbWFsbG9jIGRlc2NyaXB0b3IuICBGb3IgbWVtb3J5CisgICAgIG1hcHBlZCByZWdpb25zLCB0aGlzIGlzIHRoZSBtbWFwKCkgYmFzZWQgcm91dGluZS4gIFRoZXJlIG1heSBhbHNvIGJlCisgICAgIGEgc2luZ2xlIG1hbGxvYyBkZXNjcmlwdG9yIHRoYXQgcG9pbnRzIHRvIGFuIHNicmsoKSBiYXNlZCByb3V0aW5lCisgICAgIGZvciBzeXN0ZW1zIHdpdGhvdXQgbW1hcCgpIG9yIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBjYWxsIHRoZSBtbWFsbG9jKCkKKyAgICAgcGFja2FnZSB3aXRoIGEgTlVMTCBtYWxsb2MgZGVzY3JpcHRvci4KKworICAgICBGSVhNRTogIEZvciBtYXBwZWQgcmVnaW9ucyBzaGFyZWQgYnkgbW9yZSB0aGFuIG9uZSBwcm9jZXNzLCB0aGlzCisgICAgIG5lZWRzIHRvIGJlIG1haW50YWluZWQgb24gYSBwZXItcHJvY2VzcyBiYXNpcy4gKi8KKworICBQVFIgKCptb3JlY29yZSkgUEFSQU1TICgoc3RydWN0IG1kZXNjICosIGludCkpOworICAgICAKKyAgLyogUG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBjYXVzZXMgYW4gYWJvcnQgd2hlbiB0aGUgbWVtb3J5IGNoZWNraW5nCisgICAgIGZlYXR1cmVzIGFyZSBhY3RpdmF0ZWQuICBCeSBkZWZhdWx0IHRoaXMgaXMgc2V0IHRvIGFib3J0KCksIGJ1dCBjYW4KKyAgICAgYmUgc2V0IHRvIGFub3RoZXIgZnVuY3Rpb24gYnkgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIG1tYWxsb2MoKS4KKworICAgICBGSVhNRTogIEZvciBtYXBwZWQgcmVnaW9ucyBzaGFyZWQgYnkgbW9yZSB0aGFuIG9uZSBwcm9jZXNzLCB0aGlzCisgICAgIG5lZWRzIHRvIGJlIG1haW50YWluZWQgb24gYSBwZXItcHJvY2VzcyBiYXNpcy4gKi8KKworICB2b2lkICgqYWJvcnRmdW5jKSBQQVJBTVMgKCh2b2lkKSk7CisKKyAgLyogRGVidWdnaW5nIGhvb2sgZm9yIGZyZWUuCisKKyAgICAgRklYTUU6ICBGb3IgbWFwcGVkIHJlZ2lvbnMgc2hhcmVkIGJ5IG1vcmUgdGhhbiBvbmUgcHJvY2VzcywgdGhpcworICAgICBuZWVkcyB0byBiZSBtYWludGFpbmVkIG9uIGEgcGVyLXByb2Nlc3MgYmFzaXMuICovCisKKyAgdm9pZCAoKm1mcmVlX2hvb2spIFBBUkFNUyAoKFBUUiwgUFRSKSk7CisKKyAgLyogRGVidWdnaW5nIGhvb2sgZm9yIGBtYWxsb2MnLgorCisgICAgIEZJWE1FOiAgRm9yIG1hcHBlZCByZWdpb25zIHNoYXJlZCBieSBtb3JlIHRoYW4gb25lIHByb2Nlc3MsIHRoaXMKKyAgICAgbmVlZHMgdG8gYmUgbWFpbnRhaW5lZCBvbiBhIHBlci1wcm9jZXNzIGJhc2lzLiAqLworCisgIFBUUiAoKm1tYWxsb2NfaG9vaykgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKKworICAvKiBEZWJ1Z2dpbmcgaG9vayBmb3IgcmVhbGxvYy4KKworICAgICBGSVhNRTogIEZvciBtYXBwZWQgcmVnaW9ucyBzaGFyZWQgYnkgbW9yZSB0aGFuIG9uZSBwcm9jZXNzLCB0aGlzCisgICAgIG5lZWRzIHRvIGJlIG1haW50YWluZWQgb24gYSBwZXItcHJvY2VzcyBiYXNpcy4gKi8KKworICBQVFIgKCptcmVhbGxvY19ob29rKSBQQVJBTVMgKChQVFIsIFBUUiwgc2l6ZV90KSk7CisKKyAgLyogTnVtYmVyIG9mIGluZm8gZW50cmllcy4gICovCisKKyAgc2l6ZV90IGhlYXBzaXplOworCisgIC8qIFBvaW50ZXIgdG8gZmlyc3QgYmxvY2sgb2YgdGhlIGhlYXAgKGJhc2Ugb2YgdGhlIGZpcnN0IGJsb2NrKS4gICovCisKKyAgY2hhciAqaGVhcGJhc2U7CisKKyAgLyogQ3VycmVudCBzZWFyY2ggaW5kZXggZm9yIHRoZSBoZWFwIHRhYmxlLiAgKi8KKyAgLyogU2VhcmNoIGluZGV4IGluIHRoZSBpbmZvIHRhYmxlLiAgKi8KKworICBzaXplX3QgaGVhcGluZGV4OworCisgIC8qIExpbWl0IG9mIHZhbGlkIGluZm8gdGFibGUgaW5kaWNlcy4gICovCisKKyAgc2l6ZV90IGhlYXBsaW1pdDsKKworICAvKiBCbG9jayBpbmZvcm1hdGlvbiB0YWJsZS4KKyAgICAgQWxsb2NhdGVkIHdpdGggbWFsaWduL19fbW1hbGxvY19mcmVlIChub3QgbW1hbGxvYy9tZnJlZSkuICAqLworICAvKiBUYWJsZSBpbmRleGVkIGJ5IGJsb2NrIG51bWJlciBnaXZpbmcgcGVyLWJsb2NrIGluZm9ybWF0aW9uLiAgKi8KKworICBtYWxsb2NfaW5mbyAqaGVhcGluZm87CisKKyAgLyogSW5zdHJ1bWVudGF0aW9uLiAgKi8KKworICBzdHJ1Y3QgbXN0YXRzIGhlYXBzdGF0czsKKworICAvKiBGcmVlIGxpc3QgaGVhZGVycyBmb3IgZWFjaCBmcmFnbWVudCBzaXplLiAgKi8KKyAgLyogRnJlZSBsaXN0cyBmb3IgZWFjaCBmcmFnbWVudCBzaXplLiAgKi8KKworICBzdHJ1Y3QgbGlzdCBmcmFnaGVhZFtCTE9DS0xPR107CisKKyAgLyogTGlzdCBvZiBibG9ja3MgYWxsb2NhdGVkIGJ5IG1lbWFsaWduLiAgKi8KKworICBzdHJ1Y3QgYWxpZ25saXN0ICphbGlnbmVkX2Jsb2NrczsKKworICAvKiBUaGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgcmVnaW9uIGZvciB0aGlzIG1hbGxvYyBoZWFwLiAgVGhpcworICAgICBpcyB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGJvb2trZWVwaW5nIGRhdGEgZm9yIG1tYXAgYW5kIGZvciBtYWxsb2MKKyAgICAgYmVnaW5zLiAqLworCisgIGNoYXIgKmJhc2U7CisKKyAgLyogVGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIG1lbW9yeSByZWdpb24gZm9yIHRoaXMgbWFsbG9jIGhlYXAgd2hpY2gKKyAgICAgcmVwcmVzZW50cyB0aGUgZW5kIG9mIG1lbW9yeSBpbiB1c2UuICovCisKKyAgY2hhciAqYnJlYWt2YWw7CisKKyAgLyogVGhlIGVuZCBvZiB0aGUgY3VycmVudCBtZW1vcnkgcmVnaW9uIGZvciB0aGlzIG1hbGxvYyBoZWFwLiAgVGhpcyBpcworICAgICB0aGUgZmlyc3QgbG9jYXRpb24gcGFzdCB0aGUgZW5kIG9mIG1hcHBlZCBtZW1vcnkuICovCisKKyAgY2hhciAqdG9wOworCisgIC8qIE9wZW4gZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZSB0byB3aGljaCB0aGlzIG1hbGxvYyBoZWFwIGlzIG1hcHBlZC4KKyAgICAgVGhpcyB3aWxsIGFsd2F5cyBiZSBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciwgc2luY2UgL2Rldi96ZXJvIGlzIHVzZWQKKyAgICAgYnkgZGVmYXVsdCBpZiBubyBvcGVuIGZpbGUgaXMgc3VwcGxpZWQgYnkgdGhlIGNsaWVudC4gIEFsc28gbm90ZSB0aGF0CisgICAgIGl0IG1heSBjaGFuZ2UgZWFjaCB0aW1lIHRoZSByZWdpb24gaXMgbWFwcGVkIGFuZCB1bm1hcHBlZC4gKi8KKworICBpbnQgZmQ7CisKKyAgLyogQW4gYXJyYXkgb2Yga2V5cyB0byBkYXRhIHdpdGhpbiB0aGUgbWFwcGVkIHJlZ2lvbiwgZm9yIHVzZSBieSB0aGUKKyAgICAgYXBwbGljYXRpb24uICAqLworCisgIFBUUiBrZXlzW01NQUxMT0NfS0VZU107CisKK307CisKKy8qIEJpdHMgdG8gbG9vayBhdCBpbiB0aGUgbWFsbG9jIGRlc2NyaXB0b3IgZmxhZ3Mgd29yZCAqLworCisjZGVmaW5lIE1NQUxMT0NfREVWWkVSTwkJKDEgPDwgMCkJLyogSGF2ZSBtYXBwZWQgdG8gL2Rldi96ZXJvICovCisjZGVmaW5lIE1NQUxMT0NfSU5JVElBTElaRUQJKDEgPDwgMSkJLyogSW5pdGlhbGl6ZWQgbW1hbGxvYyAqLworI2RlZmluZSBNTUFMTE9DX01NQ0hFQ0tfVVNFRAkoMSA8PCAyKQkvKiBtbWNoZWNrZigpIGNhbGxlZCBhbHJlYWR5ICovCisKKy8qIEludGVybmFsIHZlcnNpb24gb2YgYG1mcmVlJyB1c2VkIGluIGBtb3JlY29yZScuICovCisKK2V4dGVybiB2b2lkIF9fbW1hbGxvY19mcmVlIFBBUkFNUyAoKHN0cnVjdCBtZGVzYyAqLCBQVFIpKTsKKworLyogSG9va3MgZm9yIGRlYnVnZ2luZyB2ZXJzaW9ucy4gICovCisKK2V4dGVybiB2b2lkICgqX19tZnJlZV9ob29rKSBQQVJBTVMgKChQVFIsIFBUUikpOworZXh0ZXJuIFBUUiAoKl9fbW1hbGxvY19ob29rKSBQQVJBTVMgKChQVFIsIHNpemVfdCkpOworZXh0ZXJuIFBUUiAoKl9fbXJlYWxsb2NfaG9vaykgUEFSQU1TICgoUFRSLCBQVFIsIHNpemVfdCkpOworCisvKiBBIGRlZmF1bHQgbWFsbG9jIGRlc2NyaXB0b3IgZm9yIHRoZSBzaW5nbGUgc2JyaygpIG1hbmFnZWQgcmVnaW9uLiAqLworCitleHRlcm4gc3RydWN0IG1kZXNjICpfX21tYWxsb2NfZGVmYXVsdF9tZHA7CisKKy8qIEluaXRpYWxpemUgdGhlIGZpcnN0IHVzZSBvZiB0aGUgZGVmYXVsdCBtYWxsb2MgZGVzY3JpcHRvciwgd2hpY2ggdXNlcworICAgYW4gc2JyaygpIHJlZ2lvbi4gKi8KKworZXh0ZXJuIHN0cnVjdCBtZGVzYyAqX19tbWFsbG9jX3NicmtfaW5pdCBQQVJBTVMgKCh2b2lkKSk7CisKKy8qIEdyb3cgb3Igc2hyaW5rIGEgY29udGlndW91cyBtYXBwZWQgcmVnaW9uIHVzaW5nIG1tYXAoKS4KKyAgIFdvcmtzIG11Y2ggbGlrZSBzYnJrKCkgKi8KKworI2lmIGRlZmluZWQoSEFWRV9NTUFQKQorCitleHRlcm4gUFRSIF9fbW1hbGxvY19tbWFwX21vcmVjb3JlIFBBUkFNUyAoKHN0cnVjdCBtZGVzYyAqLCBpbnQpKTsKKworI2VuZGlmCisKKy8qIFJlbWFwIGEgbW1hbGxvYyByZWdpb24gdGhhdCB3YXMgcHJldmlvdXNseSBtYXBwZWQuICovCisKK2V4dGVybiBQVFIgX19tbWFsbG9jX3JlbWFwX2NvcmUgUEFSQU1TICgoc3RydWN0IG1kZXNjICopKTsKKworLyogTWFjcm8gdG8gY29udmVydCBmcm9tIGEgdXNlciBzdXBwbGllZCBtYWxsb2MgZGVzY3JpcHRvciB0byBwb2ludGVyIHRvIHRoZQorICAgaW50ZXJuYWwgbWFsbG9jIGRlc2NyaXB0b3IuICBJZiB0aGUgdXNlciBzdXBwbGllZCBkZXNjcmlwdG9yIGlzIE5VTEwsIHRoZW4KKyAgIHVzZSB0aGUgZGVmYXVsdCBpbnRlcm5hbCB2ZXJzaW9uLCBpbml0aWFsaXppbmcgaXQgaWYgbmVjZXNzYXJ5LiAgT3RoZXJ3aXNlCisgICBqdXN0IGNhc3QgdGhlIHVzZXIgc3VwcGxpZWQgdmVyc2lvbiAod2hpY2ggaXMgdm9pZCAqKSB0byB0aGUgcHJvcGVyIHR5cGUKKyAgIChzdHJ1Y3QgbWRlc2MgKikuICovCisKKyNkZWZpbmUgTURfVE9fTURQKG1kKSBcCisgICgobWQpID09IE5VTEwgXAorICAgPyAoX19tbWFsbG9jX2RlZmF1bHRfbWRwID09IE5VTEwgXAorICAgICAgPyBfX21tYWxsb2Nfc2Jya19pbml0ICgpIFwKKyAgICAgIDogX19tbWFsbG9jX2RlZmF1bHRfbWRwKSBcCisgICA6IChzdHJ1Y3QgbWRlc2MgKikgKG1kKSkKKworI2VuZGlmICAvKiBfX01NUFJJVkFURV9IICovCmRpZmYgLS1naXQgYS9tbWFsbG9jL21tc3RhdHMuYyBiL21tYWxsb2MvbW1zdGF0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMTczMjMKLS0tIC9kZXYvbnVsbAorKysgYi9tbWFsbG9jL21tc3RhdHMuYwpAQCAtMCwwICsxLDQ2IEBACisvKiBBY2Nlc3MgdGhlIHN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBgbW1hbGxvYycuCisgICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgV3JpdHRlbiBNYXkgMTk4OSBieSBNaWtlIEhhZXJ0ZWwuCisgICBNb2RpZmllZCBNYXIgMTk5MiBieSBGcmVkIEZpc2guICAoZm5mQGN5Z251cy5jb20pCisKK1RoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCitMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKK25vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyAgIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgKEVtYWlsKSBhdCB0aGUgYWRkcmVzcyBtaWtlQGFpLm1pdC5lZHUsCisgICBvciAoVVMgbWFpbCkgYXMgTWlrZSBIYWVydGVsIGMvbyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICovCisKKyNpbmNsdWRlICJtbXByaXZhdGUuaCIKKworLyogRklYTUU6ICBTZWUgdGhlIGNvbW1lbnQgaW4gbW1wcml2YXRlLmggd2hlcmUgc3RydWN0IG1zdGF0cyBpcyBkZWZpbmVkLgorICAgTm9uZSBvZiB0aGUgaW50ZXJuYWwgbW1hbGxvYyBzdHJ1Y3R1cmVzIHNob3VsZCBiZSBleHRlcm5hbGx5IHZpc2libGUKKyAgIG91dHNpZGUgdGhlIGxpYnJhcnkuICovCisKK3N0cnVjdCBtc3RhdHMKK21tc3RhdHMgKG1kKQorICBQVFIgbWQ7Cit7CisgIHN0cnVjdCBtc3RhdHMgcmVzdWx0OworICBzdHJ1Y3QgbWRlc2MgKm1kcDsKKworICBtZHAgPSBNRF9UT19NRFAgKG1kKTsKKyAgcmVzdWx0LmJ5dGVzX3RvdGFsID0KKyAgICAgIChjaGFyICopIG1kcCAtPiBtb3JlY29yZSAobWRwLCAwKSAtIG1kcCAtPiBoZWFwYmFzZTsKKyAgcmVzdWx0LmNodW5rc191c2VkID0gbWRwIC0+IGhlYXBzdGF0cy5jaHVua3NfdXNlZDsKKyAgcmVzdWx0LmJ5dGVzX3VzZWQgPSBtZHAgLT4gaGVhcHN0YXRzLmJ5dGVzX3VzZWQ7CisgIHJlc3VsdC5jaHVua3NfZnJlZSA9IG1kcCAtPiBoZWFwc3RhdHMuY2h1bmtzX2ZyZWU7CisgIHJlc3VsdC5ieXRlc19mcmVlID0gbWRwIC0+IGhlYXBzdGF0cy5ieXRlc19mcmVlOworICByZXR1cm4gKHJlc3VsdCk7Cit9CmRpZmYgLS1naXQgYS9tbWFsbG9jL21tdHJhY2UuYXdrIGIvbW1hbGxvYy9tbXRyYWNlLmF3awpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzY4OWNlCi0tLSAvZGV2L251bGwKKysrIGIvbW1hbGxvYy9tbXRyYWNlLmF3awpAQCAtMCwwICsxLDM2IEBACisjCisjICBBd2sgcHJvZ3JhbSB0byBhbmFseXplIG10cmFjZS5jIG91dHB1dC4KKyMKKyQxID09ICIrIgl7IGlmIChhbGxvY2F0ZWRbJDJdICE9ICIiKQorCQkgICAgcHJpbnQgIisiLCAkMiwgIkFsbG9jIiwgTlIsICJkdXBsaWNhdGU6IiwgYWxsb2NhdGVkWyQyXTsKKwkJICBlbHNlCisJCSAgICBhbGxvY2F0ZWRbJDJdID0gJDM7CisJCX0KKyQxID09ICItIgl7IGlmIChhbGxvY2F0ZWRbJDJdICE9ICIiKSB7CisJCSAgICBhbGxvY2F0ZWRbJDJdID0gIiI7CisJCSAgICBpZiAoYWxsb2NhdGVkWyQyXSAhPSAiIikKKwkJCXByaW50ICJERUxFVEUgRkFJTEVEIiwgJDIsIGFsbG9jYXRlZFskMl07CisJCSAgfSBlbHNlCisJCSAgICBwcmludCAiLSIsICQyLCAiRnJlZSIsIE5SLCAid2FzIG5ldmVyIGFsbG9jJ2QiOworCQl9CiskMSA9PSAiPCIJeyBpZiAoYWxsb2NhdGVkWyQyXSAhPSAiIikKKwkJICAgIGFsbG9jYXRlZFskMl0gPSAiIjsKKwkJICBlbHNlCisJCSAgICBwcmludCAiLSIsICQyLCAiUmVhbGxvYyIsIE5SLCAid2FzIG5ldmVyIGFsbG9jJ2QiOworCQl9CiskMSA9PSAiPiIJeyBpZiAoYWxsb2NhdGVkWyQyXSAhPSAiIikKKwkJICAgIHByaW50ICIrIiwgJDIsICJSZWFsbG9jIiwgTlIsICJkdXBsaWNhdGU6IiwgYWxsb2NhdGVkWyQyXTsKKwkJICBlbHNlCisJCSAgICBhbGxvY2F0ZWRbJDJdID0gJDM7CisJCX0KKworIyBJZ25vcmUgIj0gU3RhcnQiCiskMSA9PSAiPSIJeyB9CisjIElnbm9yZSBmYWlsZWQgcmVhbGxvYyBhdHRlbXB0cyBmb3Igbm93CiskMSA9PSAiISIJeyB9CisKKworRU5ECQl7IGZvciAoeCBpbiBhbGxvY2F0ZWQpIAorCQkgICAgaWYgKGFsbG9jYXRlZFt4XSAhPSAiIikKKwkJICAgICAgcHJpbnQgIisiLCB4LCBhbGxvY2F0ZWRbeF07CisJCX0KZGlmZiAtLWdpdCBhL21tYWxsb2MvbW10cmFjZS5jIGIvbW1hbGxvYy9tbXRyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzYzg2MAotLS0gL2Rldi9udWxsCisrKyBiL21tYWxsb2MvbW10cmFjZS5jCkBAIC0wLDAgKzEsMTcxIEBACisvKiBNb3JlIGRlYnVnZ2luZyBob29rcyBmb3IgYG1tYWxsb2MnLgorICAgQ29weXJpZ2h0IDE5OTEsIDE5OTIsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgIFdyaXR0ZW4gQXByaWwgMiwgMTk5MSBieSBKb2huIEdpbG1vcmUgb2YgQ3lnbnVzIFN1cHBvcnQKKyAgIEJhc2VkIG9uIG1jaGVjay5jIGJ5IE1pa2UgSGFlcnRlbC4KKyAgIE1vZGlmaWVkIE1hciAxOTkyIGJ5IEZyZWQgRmlzaC4gIChmbmZAY3lnbnVzLmNvbSkKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKK1RoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCitMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKK25vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJtbXByaXZhdGUuaCIKKworc3RhdGljIHZvaWQgdHJfYnJlYWsgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgdHJfZnJlZWhvb2sgUEFSQU1TICgoUFRSLCBQVFIpKTsKK3N0YXRpYyBQVFIgdHJfbWFsbG9jaG9vayBQQVJBTVMgKChQVFIsIHNpemVfdCkpOworc3RhdGljIFBUUiB0cl9yZWFsbG9jaG9vayBQQVJBTVMgKChQVFIsIFBUUiwgc2l6ZV90KSk7CisKKyNpZm5kZWYJX19HTlVfTElCUkFSWV9fCitleHRlcm4gY2hhciAqZ2V0ZW52ICgpOworI2VuZGlmCisKK3N0YXRpYyBGSUxFICptYWxsc3RyZWFtOworCisjaWYgMAkvKiBGSVhNRTogIERpc2FibGVkIGZvciBub3cuICovCitzdGF0aWMgY2hhciBtYWxsZW52W10gPSAiTUFMTE9DX1RSQUNFIjsKK3N0YXRpYyBjaGFyIG1hbGxidWZbQlVGU0laXTsJLyogQnVmZmVyIGZvciB0aGUgb3V0cHV0LiAgKi8KKyNlbmRpZgorCisvKiBBZGRyZXNzIHRvIGJyZWFrcG9pbnQgb24gYWNjZXNzZXMgdG8uLi4gKi8KK3N0YXRpYyBQVFIgbWFsbHdhdGNoOworCisvKiBPbGQgaG9vayB2YWx1ZXMuICAqLworCitzdGF0aWMgdm9pZCAoKm9sZF9tZnJlZV9ob29rKSBQQVJBTVMgKChQVFIsIFBUUikpOworc3RhdGljIFBUUiAoKm9sZF9tbWFsbG9jX2hvb2spIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7CitzdGF0aWMgUFRSICgqb2xkX21yZWFsbG9jX2hvb2spIFBBUkFNUyAoKFBUUiwgUFRSLCBzaXplX3QpKTsKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgYmxvY2sgYmVpbmcgYWxsb2MnZCwgcmVhbGxvYydkLCBvcgorICAgZnJlZWQgaGFzIGFuIGFkZHJlc3MgbWF0Y2hpbmcgdGhlIHZhcmlhYmxlICJtYWxsd2F0Y2giLiAgSW4gYSBkZWJ1Z2dlciwKKyAgIHNldCAibWFsbHdhdGNoIiB0byB0aGUgYWRkcmVzcyBvZiBpbnRlcmVzdCwgdGhlbiBwdXQgYSBicmVha3BvaW50IG9uCisgICB0cl9icmVhay4gICovCisKK3N0YXRpYyB2b2lkCit0cl9icmVhayAoKQoreworfQorCitzdGF0aWMgdm9pZAordHJfZnJlZWhvb2sgKG1kLCBwdHIpCisgIFBUUiBtZDsKKyAgUFRSIHB0cjsKK3sKKyAgc3RydWN0IG1kZXNjICptZHA7CisKKyAgbWRwID0gTURfVE9fTURQIChtZCk7CisgIC8qIEJlIHN1cmUgdG8gcHJpbnQgaXQgZmlyc3QuICAqLworICBmcHJpbnRmIChtYWxsc3RyZWFtLCAiLSAlMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpIHB0cik7CisgIGlmIChwdHIgPT0gbWFsbHdhdGNoKQorICAgIHRyX2JyZWFrICgpOworICBtZHAgLT4gbWZyZWVfaG9vayA9IG9sZF9tZnJlZV9ob29rOworICBtZnJlZSAobWQsIHB0cik7CisgIG1kcCAtPiBtZnJlZV9ob29rID0gdHJfZnJlZWhvb2s7Cit9CisKK3N0YXRpYyBQVFIKK3RyX21hbGxvY2hvb2sgKG1kLCBzaXplKQorICBQVFIgbWQ7CisgIHNpemVfdCBzaXplOworeworICBQVFIgaGRyOworICBzdHJ1Y3QgbWRlc2MgKm1kcDsKKworICBtZHAgPSBNRF9UT19NRFAgKG1kKTsKKyAgbWRwIC0+IG1tYWxsb2NfaG9vayA9IG9sZF9tbWFsbG9jX2hvb2s7CisgIGhkciA9IChQVFIpIG1tYWxsb2MgKG1kLCBzaXplKTsKKyAgbWRwIC0+IG1tYWxsb2NfaG9vayA9IHRyX21hbGxvY2hvb2s7CisKKyAgLyogV2UgY291bGQgYmUgcHJpbnRpbmcgYSBOVUxMIGhlcmU7IHRoYXQncyBPSy4gICovCisgIGZwcmludGYgKG1hbGxzdHJlYW0sICIrICUwOGx4ICV4XG4iLCAodW5zaWduZWQgbG9uZykgaGRyLCBzaXplKTsKKworICBpZiAoaGRyID09IG1hbGx3YXRjaCkKKyAgICB0cl9icmVhayAoKTsKKworICByZXR1cm4gKGhkcik7Cit9CisKK3N0YXRpYyBQVFIKK3RyX3JlYWxsb2Nob29rIChtZCwgcHRyLCBzaXplKQorICBQVFIgbWQ7CisgIFBUUiBwdHI7CisgIHNpemVfdCBzaXplOworeworICBQVFIgaGRyOworICBzdHJ1Y3QgbWRlc2MgKm1kcDsKKworICBtZHAgPSBNRF9UT19NRFAgKG1kKTsKKworICBpZiAocHRyID09IG1hbGx3YXRjaCkKKyAgICB0cl9icmVhayAoKTsKKworICBtZHAgLT4gbWZyZWVfaG9vayA9IG9sZF9tZnJlZV9ob29rOworICBtZHAgLT4gbW1hbGxvY19ob29rID0gb2xkX21tYWxsb2NfaG9vazsKKyAgbWRwIC0+IG1yZWFsbG9jX2hvb2sgPSBvbGRfbXJlYWxsb2NfaG9vazsKKyAgaGRyID0gKFBUUikgbXJlYWxsb2MgKG1kLCBwdHIsIHNpemUpOworICBtZHAgLT4gbWZyZWVfaG9vayA9IHRyX2ZyZWVob29rOworICBtZHAgLT4gbW1hbGxvY19ob29rID0gdHJfbWFsbG9jaG9vazsKKyAgbWRwIC0+IG1yZWFsbG9jX2hvb2sgPSB0cl9yZWFsbG9jaG9vazsKKyAgaWYgKGhkciA9PSBOVUxMKQorICAgIC8qIEZhaWxlZCByZWFsbG9jLiAgKi8KKyAgICBmcHJpbnRmIChtYWxsc3RyZWFtLCAiISAlMDhseCAleFxuIiwgKHVuc2lnbmVkIGxvbmcpIHB0ciwgc2l6ZSk7CisgIGVsc2UKKyAgICBmcHJpbnRmIChtYWxsc3RyZWFtLCAiPCAlMDhseFxuPiAlMDhseCAleFxuIiwgKHVuc2lnbmVkIGxvbmcpIHB0ciwKKwkgICAgICh1bnNpZ25lZCBsb25nKSBoZHIsIHNpemUpOworCisgIGlmIChoZHIgPT0gbWFsbHdhdGNoKQorICAgIHRyX2JyZWFrICgpOworCisgIHJldHVybiBoZHI7Cit9CisKKy8qIFdlIGVuYWJsZSB0cmFjaW5nIGlmIGVpdGhlciB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTUFMTE9DX1RSQUNFCisgICBpcyBzZXQsIG9yIGlmIHRoZSB2YXJpYWJsZSBtYWxsd2F0Y2ggaGFzIGJlZW4gcGF0Y2hlZCB0byBhbiBhZGRyZXNzCisgICB0aGF0IHRoZSBkZWJ1Z2dpbmcgdXNlciB3YW50cyB1cyB0byBzdG9wIG9uLiAgV2hlbiBwYXRjaGluZyBtYWxsd2F0Y2gsCisgICBkb24ndCBmb3JnZXQgdG8gc2V0IGEgYnJlYWtwb2ludCBvbiB0cl9icmVhayEgICovCisKK2ludAorbW10cmFjZSAoKQoreworI2lmIDAJLyogRklYTUUhICBUaGlzIGlzIGRpc2FibGVkIGZvciBub3cgdW50aWwgd2UgZmlndXJlIG91dCBob3cgdG8KKwkgICBtYWludGFpbiBhIHN0YWNrIG9mIGhvb2tzIHBlciBoZWFwLCBzaW5jZSB3ZSBtaWdodCBoYXZlIG90aGVyCisJICAgaG9va3MgKHN1Y2ggYXMgc2V0IGJ5IG1tY2hlY2svbW1jaGVja2YpIGFjdGl2ZSBhbHNvLiAqLworICBjaGFyICptYWxsZmlsZTsKKworICBtYWxsZmlsZSA9IGdldGVudiAobWFsbGVudik7CisgIGlmIChtYWxsZmlsZSAgIT0gTlVMTCB8fCBtYWxsd2F0Y2ggIT0gTlVMTCkKKyAgICB7CisgICAgICBtYWxsc3RyZWFtID0gZm9wZW4gKG1hbGxmaWxlICE9IE5VTEwgPyBtYWxsZmlsZSA6ICIvZGV2L251bGwiLCAidyIpOworICAgICAgaWYgKG1hbGxzdHJlYW0gIT0gTlVMTCkKKwl7CisJICAvKiBCZSBzdXJlIGl0IGRvZXNuJ3QgbW1hbGxvYyBpdHMgYnVmZmVyISAgKi8KKwkgIHNldGJ1ZiAobWFsbHN0cmVhbSwgbWFsbGJ1Zik7CisJICBmcHJpbnRmIChtYWxsc3RyZWFtLCAiPSBTdGFydFxuIik7CisJICBvbGRfbWZyZWVfaG9vayA9IG1kcCAtPiBtZnJlZV9ob29rOworCSAgbWRwIC0+IG1mcmVlX2hvb2sgPSB0cl9mcmVlaG9vazsKKwkgIG9sZF9tbWFsbG9jX2hvb2sgPSBtZHAgLT4gbW1hbGxvY19ob29rOworCSAgbWRwIC0+IG1tYWxsb2NfaG9vayA9IHRyX21hbGxvY2hvb2s7CisJICBvbGRfbXJlYWxsb2NfaG9vayA9IG1kcCAtPiBtcmVhbGxvY19ob29rOworCSAgbWRwIC0+IG1yZWFsbG9jX2hvb2sgPSB0cl9yZWFsbG9jaG9vazsKKwl9CisgICAgfQorCisjZW5kaWYJLyogMCAqLworCisgIHJldHVybiAoMSk7Cit9CisKZGlmZiAtLWdpdCBhL21tYWxsb2MvbXJlYWxsb2MuYyBiL21tYWxsb2MvbXJlYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjAwNGFhCi0tLSAvZGV2L251bGwKKysrIGIvbW1hbGxvYy9tcmVhbGxvYy5jCkBAIC0wLDAgKzEsMTYzIEBACisvKiBDaGFuZ2UgdGhlIHNpemUgb2YgYSBibG9jayBhbGxvY2F0ZWQgYnkgYG1tYWxsb2MnLgorICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisJCSAgV3JpdHRlbiBNYXkgMTk4OSBieSBNaWtlIEhhZXJ0ZWwuCisKK1RoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCitMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKK25vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyAgIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgKEVtYWlsKSBhdCB0aGUgYWRkcmVzcyBtaWtlQGFpLm1pdC5lZHUsCisgICBvciAoVVMgbWFpbCkgYXMgTWlrZSBIYWVydGVsIGMvbyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4JLyogUHJvdG90eXBlcyBmb3IgbWVtY3B5LCBtZW1tb3ZlLCBtZW1zZXQsIGV0YyAqLworCisjaW5jbHVkZSAibW1wcml2YXRlLmgiCisKKy8qIFJlc2l6ZSB0aGUgZ2l2ZW4gcmVnaW9uIHRvIHRoZSBuZXcgc2l6ZSwgcmV0dXJuaW5nIGEgcG9pbnRlcgorICAgdG8gdGhlIChwb3NzaWJseSBtb3ZlZCkgcmVnaW9uLiAgVGhpcyBpcyBvcHRpbWl6ZWQgZm9yIHNwZWVkOworICAgc29tZSBiZW5jaG1hcmtzIHNlZW0gdG8gaW5kaWNhdGUgdGhhdCBncmVhdGVyIGNvbXBhY3RuZXNzIGlzCisgICBhY2hpZXZlZCBieSB1bmNvbmRpdGlvbmFsbHkgYWxsb2NhdGluZyBhbmQgY29weWluZyB0byBhCisgICBuZXcgcmVnaW9uLiAgVGhpcyBtb2R1bGUgaGFzIGluY2VzdHVvdXMga25vd2xlZGdlIG9mIHRoZQorICAgaW50ZXJuYWxzIG9mIGJvdGggbWZyZWUgYW5kIG1tYWxsb2MuICovCisKK1BUUgorbXJlYWxsb2MgKG1kLCBwdHIsIHNpemUpCisgIFBUUiBtZDsKKyAgUFRSIHB0cjsKKyAgc2l6ZV90IHNpemU7Cit7CisgIHN0cnVjdCBtZGVzYyAqbWRwOworICBQVFIgcmVzdWx0OworICBpbnQgdHlwZTsKKyAgc2l6ZV90IGJsb2NrLCBibG9ja3MsIG9sZGxpbWl0OworCisgIGlmIChzaXplID09IDApCisgICAgeworICAgICAgbWZyZWUgKG1kLCBwdHIpOworICAgICAgcmV0dXJuIChtbWFsbG9jIChtZCwgMCkpOworICAgIH0KKyAgZWxzZSBpZiAocHRyID09IE5VTEwpCisgICAgeworICAgICAgcmV0dXJuIChtbWFsbG9jIChtZCwgc2l6ZSkpOworICAgIH0KKworICBtZHAgPSBNRF9UT19NRFAgKG1kKTsKKworICBpZiAobWRwIC0+IG1yZWFsbG9jX2hvb2sgIT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gKCgqbWRwIC0+IG1yZWFsbG9jX2hvb2spIChtZCwgcHRyLCBzaXplKSk7CisgICAgfQorCisgIGJsb2NrID0gQkxPQ0sgKHB0cik7CisKKyAgdHlwZSA9IG1kcCAtPiBoZWFwaW5mb1tibG9ja10uYnVzeS50eXBlOworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIC8qIE1heWJlIHJlYWxsb2NhdGUgYSBsYXJnZSBibG9jayB0byBhIHNtYWxsIGZyYWdtZW50LiAgKi8KKyAgICAgIGlmIChzaXplIDw9IEJMT0NLU0laRSAvIDIpCisJeworCSAgcmVzdWx0ID0gbW1hbGxvYyAobWQsIHNpemUpOworCSAgaWYgKHJlc3VsdCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgbWVtY3B5IChyZXN1bHQsIHB0ciwgc2l6ZSk7CisJICAgICAgbWZyZWUgKG1kLCBwdHIpOworCSAgICAgIHJldHVybiAocmVzdWx0KTsKKwkgICAgfQorCX0KKworICAgICAgLyogVGhlIG5ldyBzaXplIGlzIGEgbGFyZ2UgYWxsb2NhdGlvbiBhcyB3ZWxsOworCSBzZWUgaWYgd2UgY2FuIGhvbGQgaXQgaW4gcGxhY2UuICovCisgICAgICBibG9ja3MgPSBCTE9DS0lGWSAoc2l6ZSk7CisgICAgICBpZiAoYmxvY2tzIDwgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LmluZm8uc2l6ZSkKKwl7CisJICAvKiBUaGUgbmV3IHNpemUgaXMgc21hbGxlcjsgcmV0dXJuIGV4Y2VzcyBtZW1vcnkgdG8gdGhlIGZyZWUgbGlzdC4gKi8KKwkgIG1kcCAtPiBoZWFwaW5mb1tibG9jayArIGJsb2Nrc10uYnVzeS50eXBlID0gMDsKKwkgIG1kcCAtPiBoZWFwaW5mb1tibG9jayArIGJsb2Nrc10uYnVzeS5pbmZvLnNpemUKKwkgICAgPSBtZHAgLT4gaGVhcGluZm9bYmxvY2tdLmJ1c3kuaW5mby5zaXplIC0gYmxvY2tzOworCSAgbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LmluZm8uc2l6ZSA9IGJsb2NrczsKKwkgIG1mcmVlIChtZCwgQUREUkVTUyAoYmxvY2sgKyBibG9ja3MpKTsKKwkgIHJlc3VsdCA9IHB0cjsKKwl9CisgICAgICBlbHNlIGlmIChibG9ja3MgPT0gbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LmluZm8uc2l6ZSkKKwl7CisJICAvKiBObyBzaXplIGNoYW5nZSBuZWNlc3NhcnkuICAqLworCSAgcmVzdWx0ID0gcHRyOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBXb24ndCBmaXQsIHNvIGFsbG9jYXRlIGEgbmV3IHJlZ2lvbiB0aGF0IHdpbGwuCisJICAgICBGcmVlIHRoZSBvbGQgcmVnaW9uIGZpcnN0IGluIGNhc2UgdGhlcmUgaXMgc3VmZmljaWVudAorCSAgICAgYWRqYWNlbnQgZnJlZSBzcGFjZSB0byBncm93IHdpdGhvdXQgbW92aW5nLiAqLworCSAgYmxvY2tzID0gbWRwIC0+IGhlYXBpbmZvW2Jsb2NrXS5idXN5LmluZm8uc2l6ZTsKKwkgIC8qIFByZXZlbnQgZnJlZSBmcm9tIGFjdHVhbGx5IHJldHVybmluZyBtZW1vcnkgdG8gdGhlIHN5c3RlbS4gICovCisJICBvbGRsaW1pdCA9IG1kcCAtPiBoZWFwbGltaXQ7CisJICBtZHAgLT4gaGVhcGxpbWl0ID0gMDsKKwkgIG1mcmVlIChtZCwgcHRyKTsKKwkgIG1kcCAtPiBoZWFwbGltaXQgPSBvbGRsaW1pdDsKKwkgIHJlc3VsdCA9IG1tYWxsb2MgKG1kLCBzaXplKTsKKwkgIGlmIChyZXN1bHQgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIG1tYWxsb2MgKG1kLCBibG9ja3MgKiBCTE9DS1NJWkUpOworCSAgICAgIHJldHVybiAoTlVMTCk7CisJICAgIH0KKwkgIGlmIChwdHIgIT0gcmVzdWx0KQorCSAgICB7CisJICAgICAgbWVtbW92ZSAocmVzdWx0LCBwdHIsIGJsb2NrcyAqIEJMT0NLU0laRSk7CisJICAgIH0KKwl9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBPbGQgc2l6ZSBpcyBhIGZyYWdtZW50OyB0eXBlIGlzIGxvZ2FyaXRobQorCSB0byBiYXNlIHR3byBvZiB0aGUgZnJhZ21lbnQgc2l6ZS4gICovCisgICAgICBpZiAoc2l6ZSA+IChzaXplX3QpICgxIDw8ICh0eXBlIC0gMSkpICYmIHNpemUgPD0gKHNpemVfdCkgKDEgPDwgdHlwZSkpCisJeworCSAgLyogVGhlIG5ldyBzaXplIGlzIHRoZSBzYW1lIGtpbmQgb2YgZnJhZ21lbnQuICAqLworCSAgcmVzdWx0ID0gcHRyOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBUaGUgbmV3IHNpemUgaXMgZGlmZmVyZW50OyBhbGxvY2F0ZSBhIG5ldyBzcGFjZSwKKwkgICAgIGFuZCBjb3B5IHRoZSBsZXNzZXIgb2YgdGhlIG5ldyBzaXplIGFuZCB0aGUgb2xkLiAqLworCSAgcmVzdWx0ID0gbW1hbGxvYyAobWQsIHNpemUpOworCSAgaWYgKHJlc3VsdCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgcmV0dXJuIChOVUxMKTsKKwkgICAgfQorCSAgbWVtY3B5IChyZXN1bHQsIHB0ciwgTUlOIChzaXplLCAoc2l6ZV90KSAxIDw8IHR5cGUpKTsKKwkgIG1mcmVlIChtZCwgcHRyKTsKKwl9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIChyZXN1bHQpOworfQorCisvKiBXaGVuIHVzaW5nIHRoaXMgcGFja2FnZSwgcHJvdmlkZSBhIHZlcnNpb24gb2YgbWFsbG9jL3JlYWxsb2MvZnJlZSBidWlsdAorICAgb24gdG9wIG9mIGl0LCBzbyB0aGF0IGlmIHdlIHVzZSB0aGUgZGVmYXVsdCBzYnJrKCkgcmVnaW9uIHdlIHdpbGwgbm90CisgICBjb2xsaWRlIHdpdGggYW5vdGhlciBtYWxsb2MgcGFja2FnZSB0cnlpbmcgdG8gZG8gdGhlIHNhbWUgdGhpbmcsIGlmCisgICB0aGUgYXBwbGljYXRpb24gY29udGFpbnMgYW55ICJoaWRkZW4iIGNhbGxzIHRvIG1hbGxvYy9yZWFsbG9jL2ZyZWUgKHN1Y2gKKyAgIGFzIGluc2lkZSBhIHN5c3RlbSBsaWJyYXJ5KS4gKi8KKworUFRSCityZWFsbG9jIChwdHIsIHNpemUpCisgIFBUUiBwdHI7CisgIHNpemVfdCBzaXplOworeworICBQVFIgcmVzdWx0OworCisgIHJlc3VsdCA9IG1yZWFsbG9jICgoUFRSKSBOVUxMLCBwdHIsIHNpemUpOworICByZXR1cm4gKHJlc3VsdCk7Cit9CmRpZmYgLS1naXQgYS9tbWFsbG9jL212YWxsb2MuYyBiL21tYWxsb2MvbXZhbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhY2VmNjcKLS0tIC9kZXYvbnVsbAorKysgYi9tbWFsbG9jL212YWxsb2MuYwpAQCAtMCwwICsxLDQ4IEBACisvKiBBbGxvY2F0ZSBtZW1vcnkgb24gYSBwYWdlIGJvdW5kYXJ5LgorICAgQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCitub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgIm1tcHJpdmF0ZS5oIgorCisvKiBDYWNoZSB0aGUgcGFnZXNpemUgZm9yIHRoZSBjdXJyZW50IGhvc3QgbWFjaGluZS4gIE5vdGUgdGhhdCBpZiB0aGUgaG9zdAorICAgZG9lcyBub3QgcmVhZGlseSBwcm92aWRlIGEgZ2V0cGFnZXNpemUoKSBmdW5jdGlvbiwgd2UgbmVlZCB0byBlbXVsYXRlIGl0CisgICBlbHNld2hlcmUsIG5vdCBjbHV0dGVyIHVwIHRoaXMgZmlsZSB3aXRoIGxvdHMgb2Yga2x1Z2VzIHRvIHRyeSB0byBmaWd1cmUKKyAgIGl0IG91dC4gKi8KKworc3RhdGljIHNpemVfdCBjYWNoZV9wYWdlc2l6ZTsKK2V4dGVybiBpbnQgZ2V0cGFnZXNpemUgUEFSQU1TICgodm9pZCkpOworCitQVFIKK212YWxsb2MgKG1kLCBzaXplKQorICBQVFIgbWQ7CisgIHNpemVfdCBzaXplOworeworICBpZiAoY2FjaGVfcGFnZXNpemUgPT0gMCkKKyAgICB7CisgICAgICBjYWNoZV9wYWdlc2l6ZSA9IGdldHBhZ2VzaXplICgpOworICAgIH0KKworICByZXR1cm4gKG1tZW1hbGlnbiAobWQsIGNhY2hlX3BhZ2VzaXplLCBzaXplKSk7Cit9CisKKworUFRSCit2YWxsb2MgKHNpemUpCisgIHNpemVfdCBzaXplOworeworICByZXR1cm4gbXZhbGxvYyAoKFBUUikgTlVMTCwgc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9tbWFsbG9jL3Nicmstc3VwLmMgYi9tbWFsbG9jL3Nicmstc3VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5MzE3NQotLS0gL2Rldi9udWxsCisrKyBiL21tYWxsb2Mvc2Jyay1zdXAuYwpAQCAtMCwwICsxLDk3IEBACisvKiBTdXBwb3J0IGZvciBzYnJrKCkgcmVnaW9ucy4KKyAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgRnJlZCBGaXNoIGF0IEN5Z251cyBTdXBwb3J0LiAgIGZuZkBjeWdudXMuY29tCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCitUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKK3B1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCitub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgkvKiBQcm90b3R5cGVzIGZvciBtZW1jcHksIG1lbW1vdmUsIG1lbXNldCwgZXRjICovCisKKyNpbmNsdWRlICJtbXByaXZhdGUuaCIKKworc3RhdGljIFBUUiBzYnJrX21vcmVjb3JlIFBBUkFNUyAoKHN0cnVjdCBtZGVzYyAqLCBpbnQpKTsKK2V4dGVybiBQVFIgc2JyayBQQVJBTVMgKChpbnQpKTsKKworLyogVGhlIG1tYWxsb2MoKSBwYWNrYWdlIGNhbiB1c2UgYSBzaW5nbGUgaW1wbGljaXQgbWFsbG9jIGRlc2NyaXB0b3IKKyAgIGZvciBtbWFsbG9jL21yZWFsbG9jL21mcmVlIG9wZXJhdGlvbnMgd2hpY2ggZG8gbm90IHN1cHBseSBhbiBleHBsaWNpdAorICAgZGVzY3JpcHRvci4gIEZvciB0aGVzZSBvcGVyYXRpb25zLCBzYnJrKCkgaXMgdXNlZCB0byBvYnRhaW4gbW9yZSBjb3JlCisgICBmcm9tIHRoZSBzeXN0ZW0sIG9yIHJldHVybiBjb3JlLiAgVGhpcyBhbGxvd3MgbW1hbGxvYygpIHRvIHByb3ZpZGUKKyAgIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG5vbi1tbWFwJ2QgdmVyc2lvbi4gKi8KKworc3RydWN0IG1kZXNjICpfX21tYWxsb2NfZGVmYXVsdF9tZHA7CisKKy8qIFVzZSBzYnJrKCkgdG8gZ2V0IG1vcmUgY29yZS4gKi8KKworc3RhdGljIFBUUgorc2Jya19tb3JlY29yZSAobWRwLCBzaXplKQorICBzdHJ1Y3QgbWRlc2MgKm1kcDsKKyAgaW50IHNpemU7Cit7CisgIFBUUiByZXN1bHQ7CisKKyAgaWYgKChyZXN1bHQgPSBzYnJrIChzaXplKSkgPT0gKFBUUikgLTEpCisgICAgeworICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtZHAgLT4gYnJlYWt2YWwgKz0gc2l6ZTsKKyAgICAgIG1kcCAtPiB0b3AgKz0gc2l6ZTsKKyAgICB9CisgIHJldHVybiAocmVzdWx0KTsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBtYWxsb2MgZGVzY3JpcHRvciBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lCisgICBhIHJlcXVlc3QgaGFzIGJlZW4gbWFkZSB0byB1c2UgdGhlIGRlZmF1bHQgc2JyaydkIHJlZ2lvbi4KKworICAgU2luY2Ugbm8gYWxpZ25tZW50IGd1YXJhbnRlZXMgYXJlIG1hZGUgYWJvdXQgdGhlIGluaXRpYWwgdmFsdWUgcmV0dXJuZWQKKyAgIGJ5IHNicmssIHRlc3QgdGhlIGluaXRpYWwgdmFsdWUgYW5kIChpZiBuZWNlc3NhcnkpIHNicmsgZW5vdWdoIGFkZGl0aW9uYWwKKyAgIG1lbW9yeSB0byBzdGFydCBvZmYgd2l0aCBhbGlnbm1lbnQgdG8gQkxPQ0tTSVpFLiAgV2UgYWN0dWFsbHkgb25seSBuZWVkCisgICBpdCBhbGlnbmVkIHRvIGFuIGFsaWdubWVudCBzdWl0YWJsZSBmb3IgYW55IG9iamVjdCwgc28gdGhpcyBpcyBvdmVya2lsbC4KKyAgIEJ1dCBhdCBtb3N0IGl0IHdhc3RlcyBqdXN0IHBhcnQgb2Ygb25lIEJMT0NLU0laRSBjaHVuayBvZiBtZW1vcnkgYW5kCisgICBtaW5pbWl6ZXMgcG9ydGFiaWxpdHkgcHJvYmxlbXMgYnkgYXZvaWRpbmcgdXMgaGF2aW5nIHRvIGZpZ3VyZSBvdXQKKyAgIHdoYXQgdGhlIGFjdHVhbCBtaW5pbWFsIGFsaWdubWVudCBpcy4gIFRoZSByZXN0IG9mIHRoZSBtYWxsb2MgY29kZQorICAgYXZvaWRzIHRoaXMgYXMgd2VsbCwgYnkgYWx3YXlzIGFsaWduaW5nIHRvIHRoZSBtaW5pbXVtIG9mIHRoZSByZXF1ZXN0ZWQKKyAgIHNpemUgcm91bmRlZCB1cCB0byBhIHBvd2VyIG9mIHR3bywgb3IgdG8gQkxPQ0tTSVpFLgorCisgICBOb3RlIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHVzZSBzb21lIG1lbW9yeSBzdGFydGluZyBhdCB0aGlzIGluaXRpYWwgc2JyaworICAgYWRkcmVzcyBmb3IgdGhlIHNicmsgcmVnaW9uIG1hbGxvYyBkZXNjcmlwdG9yLCB3aGljaCBpcyBhIHN0cnVjdCwgc28gdGhlCisgICBiYXNlIGFkZHJlc3MgbXVzdCBiZSBzdWl0YWJseSBhbGlnbmVkLiAqLworCitzdHJ1Y3QgbWRlc2MgKgorX19tbWFsbG9jX3NicmtfaW5pdCAoKQoreworICBQVFIgYmFzZTsKKyAgdW5zaWduZWQgaW50IGFkajsKKworICBiYXNlID0gc2JyayAoMCk7CisgIGFkaiA9IFJFU0lEVUFMIChiYXNlLCBCTE9DS1NJWkUpOworICBpZiAoYWRqICE9IDApCisgICAgeworICAgICAgc2JyayAoQkxPQ0tTSVpFIC0gYWRqKTsKKyAgICAgIGJhc2UgPSBzYnJrICgwKTsKKyAgICB9CisgIF9fbW1hbGxvY19kZWZhdWx0X21kcCA9IChzdHJ1Y3QgbWRlc2MgKikgc2JyayAoc2l6ZW9mIChzdHJ1Y3QgbWRlc2MpKTsKKyAgbWVtc2V0ICgoY2hhciAqKSBfX21tYWxsb2NfZGVmYXVsdF9tZHAsIDAsIHNpemVvZiAoc3RydWN0IG1kZXNjKSk7CisgIF9fbW1hbGxvY19kZWZhdWx0X21kcCAtPiBtb3JlY29yZSA9IHNicmtfbW9yZWNvcmU7CisgIF9fbW1hbGxvY19kZWZhdWx0X21kcCAtPiBiYXNlID0gYmFzZTsKKyAgX19tbWFsbG9jX2RlZmF1bHRfbWRwIC0+IGJyZWFrdmFsID0gX19tbWFsbG9jX2RlZmF1bHRfbWRwIC0+IHRvcCA9IHNicmsgKDApOworICBfX21tYWxsb2NfZGVmYXVsdF9tZHAgLT4gZmQgPSAtMTsKKyAgcmV0dXJuIChfX21tYWxsb2NfZGVmYXVsdF9tZHApOworfQorCisKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL0NoYW5nZUxvZyBiL3JlYWRsaW5lL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWVhMDlkCi0tLSAvZGV2L251bGwKKysrIGIvcmVhZGxpbmUvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsOTYxIEBACitUdWUgRmViICA5IDEwOjM4OjU3IDE5OTkgIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEbyBub3QgdXNlIHRoZSAuL3N1cHBvcnQgZGlyZWN0b3J5LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCitXZWQgSmFuICA2IDEyOjI0OjE5IDE5OTkgIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogVXNlIExPQ0FMX0NGTEFHUyByYXRoZXIgdGhhbiBDRkxBR1MgZm9yCisJc2VhcmNoaW5nIGxpYnRlcm1jYXAgZGlyZWN0b3J5LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCitUaHUgRGVjIDMxIDEyOjA3OjAxIDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogU2VhcmNoIGRldm8gbGlidGVybWNhcCBkaXJlY3RvcnkgZm9yIHRlcm1jYXAuaAorCXdoZW4gY29tcGlsaW5nIGZvciBjeWd3aW4uCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCisxOTk4LTEyLTMwICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBPbmx5IHRyeSB0byBjb3B5IGxpYnJlYWRsaW5lLmEgYW5kCisJbGliaGlzdG9yeS5hIGlmIHRoZXkgZXhpc3QuCisKK1R1ZSBEZWMgMjkgMjM6NDk6MjAgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KKworCSogY3Jvc3MtYnVpbGQvY3lnd2luLmNhY2hlOiBBZGQgYSBjb3VwbGUgbW9yZSBrbm93biBzZXR0aW5ncy4KKwkqIGNvbmZpZ3VyZS5pbjogRml4IHR5cG8uCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitUdWUgRGVjIDI5IDE4OjExOjI4IDE5OTggIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KKworCSogY3Jvc3MtYnVpbGQ6IG5ldyBkaXJlY3RvcnkuCisJCisJKiBjcm9zcy1idWlsZC9jeWd3aW4uY2FjaGU6IG5ldyBmaWxlLiBVc2VkIGZvciBDeWd3aW4gY3Jvc3MgYnVpbGRzLgorCisJKiBjb25maWd1cmUuaW46IGFkZGVkIHRlc3RzIGZvciBjcm9zcy1idWlsZCBmb3IgQ3lnd2luLgorCisxOTk4LTEyLTI0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBBZGQgQ1lHTlVTIExPQ0FMIGNvbW1lbnQuCisJKiBhY2NvbmZpZy5oOiBBZGQgbWlzc2luZyBkZWZpbmVzLgorCSogY29uZmlnLmguYm90OiBBZGQgbWlzc2luZyBjb250ZW50LgorCSogY29uZmlndXJlLCBjb25maWcuaC5pbjogUmVnZW5lcmF0ZWQuCisKK1dlZCBEZWMgMjMgMTY6MjE6NDEgMTk5OCAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogY29tbWVudCBvdXQgdGhlIHJ1bGUgdG8gcmVidWlsZCBjb25maWd1cmUgYnkgCisJcnVubmluZyBhdXRvY29uZi4gCisKK1R1ZSBEZWMgMjIgMTA6MDA6MzAgMTk5OCAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgorCisJKiBzaGVsbC5jIChzYXZlc3RyaW5nKTogaWZkZWYnZCBpdCBvdXQuIAorCisJKiBJbXBvcnRlZCBuZXcgdmVyc2lvbiBvZiBSZWFkbGluZSAyLjIuMS4gUmVtb3ZlZCBhbGwgdGhlIEN5Z251cworCWxvY2FsIGNoYW5nZXMuCisKKwlOZXcgZmlsZXM6IGFjY29uZmlnLmgsIGFjbG9jYWwubTQsIGFuc2lfc3RkbGliLmgsIGNhbGxiYWNrLmMsCisgCWNvbmZpZy5oLmluLCBjb25maWd1cmUsIGhpc3RleHBhbmQuYywgaGlzdGZpbGUuYywgaGlzdGxpYi5oLAorIAloaXN0c2VhcmNoLmMsIGlucHV0LmMsIGtpbGwuYywgbWFjcm8uYywgbmxzLmMsIHBvc2l4ZGlyLmgsCisgCXBvc2l4am1wLmgsIHBvc2l4c3RhdC5oLCBybGNvbmYuaCwgcmx0dHkuaCwgcmx3aW5zaXplLmgsIHNoZWxsLmMsCisgCXRjYXAuaCwgdGVybWluYWwuYywgdW5kby5jLCB1dGlsLmMsIHN1cHBvcnQgZGlyZWN0b3J5LgorCisJUmVtb3ZlZCBmaWxlczogc3lzZGVwKiwgY29uZmlnIGRpcmVjdG9yeS4KKwkKKworRnJpIERlYyAgNCAxNToyNTo0MSAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KKworCVRoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGUgYnkgSmltIEJsYW5keQorIAk8amltYkB6d2luZ2xpLmN5Z251cy5jb20+IGFuZCBEYXZpZCBUYXlsb3IKKyAJPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPiBhcyBwYXJ0IG9mIGEgcHJvamVjdCB0byBtZXJnZSBpbiBjaGFuZ2VzCisgCW1hZGUgYnkgSFA7IEhQIGRpZCBub3QgY3JlYXRlIENoYW5nZUxvZyBlbnRyaWVzLgorCisJKiBjb25maWcvbXAtZW5hYmxlLXR1aTogTmV3IGZpbGUuCisJKFRVSV9DRkxBR1MpOiBTZWFyY2ggZGV2bydzIGluY2x1ZGUgZGlyZWN0b3J5LCBhcyBsb25nIGFzIHdlJ3JlCisgCXRvdGFsbHkgcnVpbmluZyBtb2R1bGFyaXR5LgorCShJTkNMVURFX1NSQ0RJUik6IE5ldyB2YXIuCisJKEdEQl9UVUlfU1JDRElSKTogRml4IHN5bnRheCBlcnJvci4KKworCSogY29uZmlndXJlLmluOiBDaGVjayB0aGUgLS1lbmFibGUtdHVpIGZsYWc7IGlmIGl0J3Mgc2V0LCBpbmNsdWRlCisgCWEgbWFrZWZpbGUgZnJhZ21lbnQgdGhhdCAjZGVmaW5lcyBUVUkgYW5kIGFkZHMgdGhlIG5lZWRlZCAjaW5jbHVkZQorIAlkaXJlY3Rvcmllcy4KKwkoKi0qLWhwdXgqKTogTmV3IGhvc3Q7IHVzZSBzeXNkZXAtaHB1eC5oLgorCisJKiBNYWtlZmlsZS5pbiAoLmMubyk6IENoZWNrIHRoZSB2YXJpYWJsZSBzZXQgaW4gdGhlIG1ha2VmaWxlCisJZnJhZ21lbnQgYWJvdmUuCisKKwkqIGRpc3BsYXkuYyAodGVybV9nb3RvKTogZGVjbGFyZSBpdC4KKwkoaW5zZXJ0X3NvbWVfY2hhcnMpOiBzZXQgaXQuCisJKGRlbGV0ZV9jaGFycyk6IHNldCBpdC4KKworCSogcmVhZGxpbmUuYzogYWRkIHR1aSBpbmNsdWRlIGZpbGVzIHN1cnJvdW5kZWQgYnkgVFVJLgorCShybF9yZXNldCk6IG5ldyBmdW5jdGlvbiwgbW92ZSBzb21lIG9mIHJsX2Fib3J0IGZ1bmN0aW9uYWxpdHkgdG8KKyAJaGVyZS4KKwkocmxfYWJvcnQpOiBjYWxsIHJsX3Jlc2V0LgorCShybF9nZXRjKTogdHVpIGNoYW5nZXMuCisJKGluaXRfdGVybWluYWxfaW8pOiB0dWkgY2hhbmdlcy4KKworCSogcmVhZGxpbmUuaCAodHVpX3ZlcnNpb24sIGZwdXRjX3VuZmlsdGVyZWQsIGZwdXRzX3VuZmlsdGVyZWQsCisJdHVpX3RwdXRzKTogZGVjbGFyZSBpZiBUVUkgaXMgZGVmaW5lZC4KKworCSogcmx0dHkuYyAocHJlcGFyZV90ZXJtaW5hbF9zZXR0aW5ncyk6IGFkZGl0aW9uYWwgY29tbWVudC4KKworCSogc2lnbmFscy5jOiBhZGQgdHVpIGluY2x1ZGUgZmlsZXMgc3Vycm91bmRlZCBieSBUVUkuICBtb3ZlICNpZgorIAlhbmQgI2VuZGlmIHRvIGNvbHVtbiAxIHNvIEhQJ3MgY29tcGlsZXIgd2lsbCBhY2NlcHQgdGhlbS4gIFJlbW92ZQorIAlkZWNsYXJhdGlvbiBvZiB0dWlEb0FuZFJldHVyblRvVG9wIHNpbmNlIGl0J3MgZGVjbGFyZWQgaW4gdHVpLmguCisJKHJsX2hhbmRsZV9zaWd3aW5jaCk6IGNhbGwgdHVpRG9BbmRSZXR1cm5Ub1RvcCBpZiBUVUkgZGVmaW5lZC4KKyAgCShybF9oYW5kbGVfc2lnd2luY2hfb25fY2xlYXIpOiBkZWZpbmUgaWYgVFVJIGRlZmluZWQuCisJKHJsX3NldF9zaWduYWxzKTogaWYgVFVJLCBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24uCisJKHJsX2NsZWFyX3NpZ25hbHMpOiBpbnN0YWxsIHJsX2hhbmRsZV9zaWd3aW5jaF9vbl9jbGVhci4KKworCSogc3lzZGVwLWhwdXguaDogTmV3IGZpbGUuCisKK01vbiBOb3YgIDIgMTU6MjY6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworICAgICAgICAqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKi4KKworVHVlIEp1bCAyOCAwOTo0MzoyNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHN5c2RlcC1ocHV4MTEuaDogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW4gKCotKi0qLWhwdXgxMSopOiBVc2Ugc3lzZGVwLWhwdXgxMS5oLgorCitUaHUgSnVsIDIzIDE3OjQ4OjIxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmJhdDogUmVtb3ZlIG9ic29sZXRlIGZpbGUuCisJKiBleGFtcGxlcy9jb25maWd1cmUuYmF0OiBSZW1vdmUgb2Jzb2xldGUgZmlsZS4KKworV2VkIE1heSAxMyAxMzo0MTo1MyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIHN5c2RlcC02aXJpeC5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZ3VyZS5pbiAoKi0qLWlyaXg2Kik6IE5ldyBob3N0OyB1c2Ugc3lzZGVwLTZpcml4LmguCisKKwkqIE1ha2VmaWxlLmluIChpc2VhcmNoLm8sIHNlYXJjaC5vKTogRGVwZW5kIHVwb24gc3lzZGVwLmguCisJKE1ha2VmaWxlKTogRGVwZW5kIHVwb24gJChzcmNkaXIpL2NvbmZpZ3VyZS5pbi4KKworVGh1IEFwciAgOSAxMTo1OTozOCAxOTk4ICBJYW4gRGFsbCAoPElhbi5EYWxsQGRzdG8uZGVmZW5jZS5nb3YuYXU+CisKKwkqIGNvbmZpZ3VyZS5pbiAoaG9zdD09bmV0YnNkKTogSW5jbHVkZSBjb25maWcvbWgtYnNkNDQuCisJKiBjb25maWcvbWgtYnNkNDQ6IE5ldyBmaWxlLgorCitXZWQgRGVjICAzIDE2OjQ4OjIwIDE5OTcgIE1pY2hhZWwgU255ZGVyICAobXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20pCisKKwkqIHJsdHR5LmM6IGZpeCB0eXBvcy4KKworVHVlIE9jdCAgOCAwODo1OToyNCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiB0aWxkZS5jICh0aWxkZV93b3JkX2V4cGFuZCk6ICBfX01TRE9TX19fIC0+IF9fTVNET1NfXworCitTYXQgT2N0IDA1IDExOjI0OjM0IDE5OTYgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogcmxkZWZzLmg6IE9uIExpbnV4LCBpbmNsdWRlIDx0ZXJtaW9zLmg+IHRvIGZpeCBjb21waWxlIGVycm9yCisJaW4gPHRlcm1jYXAuaD4uCisKK1dlZCBTZXAgIDQgMTg6MDY6NTEgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogcmxkZWZzLmg6ICBFbmFibGUgSEFORExFX1NJR05BTFMgZm9yIGN5Z3dpbjMyLgorCitUaHUgQXVnIDI5IDE2OjU5OjQ1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLSopOiBSZWNvZ25pemUgaTY4NiBmb3IgcGVudGl1bSBwcm8uCisKK0ZyaSBBdWcgMTYgMTc6NDk6NTcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogY29tcGxldGUuYzogIEluY2x1ZGUgPHB3ZC5oPiBpZiBub3QgRE9TLCBhbmQgaWYgY3lnd2luMzIgb3Igbm90CisJd2luMzIuCisJKiBjb25maWd1cmUuaW46ICBBZGQgdGVzdCBmb3IgKi0qLWN5Z3dpbjMyKiB0byB1c2UgY29uZmlnL21oLXBvc2l4LgorCSogcmVhZGxpbmUuYzogIE1vdmUgZGVjbCBvZiB0Z2V0c3RyIHRvIHJsZGVmcy5oLgorCSogKF9ybF9zZXRfc2NyZWVuX3NpemUpOiAgUmVtb3ZlIHJlZHVuZGFudCBpZmRlZiBNSU5JTUFMcy4KKwkqIHJsZGVmcy5oOiAgRG9uJ3QgZG8gTUlOSU1BTCBmb3IgY3lnd2luMzIuICBDeWd3aW4zMiBub3cgdXNlcworCWZ1bGwtYmxvd24gcmVhZGxpbmUsIGV4Y2VwdCBmb3IgdGVybWNhcC4KKworU3VuIEF1ZyAxMSAyMTowNjoyNiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBybGRlZnMuYzogIEdldCByaWQgb2YgZGVmaW5lIG9mIFNJR0FMUk0gaWYgX1dJTjMyIG9yIF9fTVNET1NfXy4KKwkqIERvbid0IGRlZmluZSBTY3JlZW5Db2xzL1NjcmVlblJvd3MvLi4uIGlmIGN5Z3dpbjMyLgorCSogc3lzZGVwLW5vcm0uaDogIERvbid0IGluY2x1ZGUgPG1hbGxvYy5oPiBpZiBjeWd3aW4zMi4KKworU3VuIEF1ZyAxMSAxNDo1OTowOSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogcmxkZWZzLmg6ICBJZiBfX29zZl9faXMgZGVmaW5lZCwgaW5jbHVkZSA8dGVybWlvLmg+IGluc3RlYWQgb2YKKwk8c2d0dHkuaD4uCisKK0ZyaSBBdWcgIDkgMDg6NTQ6MjYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogYmluZC5jIGNvbXBsZXRlLmMgaGlzdG9yeS5jIHJlYWRsaW5lLmM6ICBEb24ndCBpbmNsdWRlIHN5cy9maWxlLmguCisJKiBjb21wbGV0ZS5jIGRpc3BsYXkuYyBwYXJlbnMuYyByZWFkbGluZS5jIHJsZGVmcy5oIHJsdHR5LmMKKwlzaWduYWxzLmMgdGlsZGUuYzogIENoYW5nZSByZWZzIHRvIF9NU0NfVkVSIGFuZCBfX1dJTjMyX18gdG8gX1dJTjMyLgorCSogc2lnbmFscy5jIChybF9zaWduYWxfaGFuZGxlcik6ICBJZmRlZiBvdXQga2lsbCBpZiBfV0lOMzIuCisJKiBzeXNkZXAtbm9ybS5oOiAgSWZkZWYgb3V0IGluY2x1ZGUgb2YgZGlyZW50LmggaWYgX1dJTjMyLgorCUluY2x1ZGUgbWFsbG9jLmggaWYgX1dJTjMyLgorCitUaHUgSnVsIDE4IDE1OjU5OjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogcmxkZWZzLmggKHN5cy91aW8uaCkgQmVmb3JlIHN5cy9zdHJlYW0uaCBpcyBpbmNsdWRlZCB1bmRlciBBSVgsCisJaW5jbHVkZSBzeXMvdWlvLmgsIHdoaWNoIHByZXZlbnRzIGFuIHVuZGVmaW5lZCBzdHJ1Y3R1cmUgdXNlZCBpbiBhCisJcHJvdG90eXBlIG1lc3NhZ2UgZnJvbSBiZWluZyBnZW5lcmF0ZWQuCisKK1R1ZSBKdW4gMjUgMjM6MDU6NTUgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKKworICAgICAgICAqIE1ha2VmaWxlLmluIChkYXRhZGlyKTogU2V0IHRvICQocHJlZml4KS9zaGFyZS4KKwkoZG9jZGlyKTogUmVtb3ZlZC4KKworU3VuIE1heSAyNiAxNToxNDo0MiAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCUZyb206IERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+CisKKwkqIHN5c2RlcC1saW51eC5oOiBOZXcgZmlsZS4KKwkqIGRpc3BsYXkuYzogQWRkIGluY2x1ZGUgb2YgInN5c2RlcC5oIiB0byBnZXQgSEFWRV9WQVJBUkdTX0guCisJKiBjb25maWd1cmUuaW46IENoYW5nZSBwYXR0ZXJuIGlbMzQ1XTg2LSotbGludXgqIGludG8gKi0qLWxpbnV4KiB0bworCXN1cHBvcnQgbm9uLXg4NiBiYXNlZCBMaW51eCBwbGF0Zm9ybXMuCisKK1N1biBBcHIgIDcgMjI6MDY6MTEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwlGcm9tOiBNaWxlcyBCYWRlciAgPG1pbGVzQGdudS5haS5taXQuZWR1PgorCSogY29uZmlnL21oLWdudTogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW4gKCotKi1nbnUqKTogTmV3IGhvc3QuCisKK1N1biBBcHIgIDcgMTM6MjE6NTEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwlGcm9tOiBSb2JlcnQgTGlwZSA8cm9iZXJ0bEBkZ2lpLmNvbT4KKwkqIGNvbmZpZ3VyZS5pbjogU0NPIE9wZW5TZXJ2ZXIgNSAoYS5rLmEgMy4ydjUqKSBpcyBtb3JlIGxpa2UKKwlTQ08gMy4ydjQgdGhhbiAzLjJ2Mi4KKworV2VkIEphbiAgMyAxODoyMjoxMCAxOTk2ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiByZWFkbGluZS5jLCBkaXNwbGF5LmMsIGNvbXBsZXRlLmM6IEFkZCBfTVNDX1ZFUiB0byBsaXN0IG9mCisJdGhpbmdzIHdoaWNoIGNhbid0IGRvIG1vc3QgdGhpbmdzLgorCitUaHUgTm92IDE2IDE1OjM5OjA1IDE5OTUgIEdlb2ZmcmV5IE5vZXIgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogY29tcGxldGUuYzogQ2hhbmdlIFdJTjMyIHRvIF9fV0lOMzJfXywgYWRkZWQgI2Vsc2UgcmV0dXJuIE5VTEwKKwl0byBlbmQgb2YgdGhhdCBkZWZpbmUuCisKK1R1ZSBPY3QgMzEgMTA6Mzg6NTggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogZGlzcGxheS5jLCBwYXJlbnMuYywgcmVhZGxpbmUuYywgcmxkZWZzLmg6IENoYW5nZSB1c2Ugb2YKKwlXSU4zMiB0byBfX1dJTjMyX18uCisKK1R1ZSBPY3QgMTAgMTE6MDc6MjMgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChCSVNPTik6IFJlbW92ZSBtYWNyby4KKworVHVlIE9jdCAxMCAwODo0OTowMCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBjb21wbGV0ZS5jIChmaWxlbmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uKTogRW5hYmxlIGZvcgorCXdpbjMyIHdoZW4gbm90IE1TQy4KKworU3VuIE9jdCAgOCAwNDoxNzoxOSAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCisKKwkqIGNvbmZpZ3VyZS5pbjogIEhhbmRsZSBwb3dlcnBjLWlibS1haXgqIGxpa2UgcnM2MDAwLWlibS1haXgqLgorCitTYXQgT2N0ICA3IDIwOjM2OjE2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBybHR0eS5jIChvdXRjaGFyKTogUmV0dXJuIGFuIGludCwgbGlrZSB0cHV0cyBleHBlY3RzLgorCSogc2lnbmFscy5jIChfcmxfb3V0cHV0X2NoYXJhY3Rlcl9mdW5jdGlvbik6IERpdHRvLgorCitGcmkgU2VwIDI5IDE1OjE5OjIzIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwlGaXhlcyBmb3Igd2hlbiB0aGUgaG9zdCBXSU4zMiwgYnV0IG5vdCBNU0MuCisJKiBjb21wbGV0ZS5jOiBTb21ldGltZXMgaGF2ZSBwd2QuaAorCSogcGFyZW5zLmM6IFdJTjMyIGhhcyBzaW1pbGFyIHJlc3RyaWN0aW9ucyB0byBfX0dPMzJfXy4KKwkqIHJlYWRsaW5lLmMgKF9fR08zMl9fKTogU29tZSBvZiB0aGlzIG1vdmVkIGludG8gcmxkZWZzLmgKKwkqIHNpZ25hbHMuYyAoX19HTzMyX18pOiBMaWtld2lzZS4KKwkqIHJsZGVmcy5oIChNU0RPU3x8V0lOMzIpIGJlY29tZXMgTVNET1N8fE1TQy4KKwkoV0lOMzImJiFXSU4zMik6IE5ldyBkZWZpbml0aW9ucy4KKworV2VkIFNlcCAyMCAxMjo1NzoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIHJlYWxjbGVhbi4KKworV2VkIE1hciAgMSAxMzozMzo0MyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHJsdHR5LmMgKG91dGNoYXIpOiBQcm92aWRlIHByb3RvdHlwZSBmb3Igb3V0Y2hhciwgdG8gc2lsZW5jZQorCXR5cGUgd2FybmluZ3MgaW4gcGFzc2luZyBvdXRjaGFyIHRvIHRwdXRzIG9uIHN5c3RlbXMgbGlrZSBMaW51eAorCXRoYXQgaGF2ZSBmdWxsIHByb3RvdHlwZXMuCisKKwkqIHNpZ25hbHMuYyAoX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24pOiBQcm92aWRlIHByb3RvdHlwZSB0bworCXNpbGVuY2UgdHlwZSB3YXJuaW5ncy4KKworU3VuIEphbiAxNSAxNDoxMDozNyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KKworCSogcmxkZWZzLmg6IERlZmluZSBNSU5JTUFMIGZvciBfX0dPMzJfXyBhbmQgV0lOMzIuCisJKiBjb21wbGV0ZS5jLCBkaXNwbGF5LmMsIHJlYWRsaW5lLmMsIHJsdHR5LmM6IFRlc3QgTUlOSU1BTAorCWluc3RlYWQgb2YgX19HTzMyX18uCisKK1dlZCBBdWcgMjQgMTM6MDQ6NDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IENoYW5nZSBpWzM0XTg2IHRvIGlbMzQ1XTg2LgorCitTYXQgSnVsIDE2IDEzOjI2OjMxIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluIChtODgqLWhhcnJpcy1jeHV4NyopOiBSZWNvZ25pemUuCisJKiBzeXNkZXAtY3h1eDcuaDogTmV3IGZpbGUuCisKK0ZyaSBKdWwgIDggMTM6MTg6MzMgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogcnR0dHkuYyAoY29udHJvbF9tZXRhX2tleV9vbik6IFJlbW92ZSBzdXBlcmZsdW91cyB0ZXN0aW5nIG9mCisJX19HTzMyX18uCisKK1RodSBKdW4gMzAgMTU6MjE6NTQgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogcmx0dHkuYyAoY29udHJvbF9tZXRhX2tleV9vbik6IERvbid0IGNvbXBpbGUgaWYgX19HTzMyX18gaXMKKwlkZWZpbmVkLgorCShybHR0eV9zZXRfZGVmYXVsdF9iaW5kaW5ncyk6IExpa2V3aXNlLgorCSogZGlzcGxheS5jIChpbnNlcnRfc29tZV9jaGFycywgZGVsZXRlX2NoYXJzKTogcm93X3N0YXJ0IHNob3VsZCBiZQorCWEgc2hvcnQuCisJKiBwYXJlbnMuYyAocmxfaW5zZXJ0X2Nsb3NlKTogTm8gRkRfU0VUIGlmIHVzaW5nIF9fR08zMl9fLgorCSogcmVhZGxpbmUuYyAocmxfZ2F0aGVyX3R5aSk6IFN0cmlwIG9mZiBzcHVyaW91cyBoaWdoIGJpdHMuCisKK1N1biBKdW4gMTIgMDM6NTE6NTIgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQorCisJKiBoaXN0b3J5LmM6ICBTd2FwIGluY2x1c2lvbiBvZiBybGRlZnMuaCBhbmQgY2hhcmRlZnMuaCB0byBhdm9pZAorCUNUUkwgbWFjcm8gcmVkZWZpbml0aW9uLgorCitNb24gTWF5ICA5IDE4OjI5OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKKworCSogcmVhZGxpbmUuYyAocmVhZGxpbmVfZGVmYXVsdF9iaW5kaW5ncyk6IERvbid0IGNvbXBpbGUgaWYKKwlfX0dPMzJfXyBpcyBkZWZpbmVkLgorCShfcmxfc2V0X3NjcmVlbl9zaXplKTogTGlrZXdpc2UuCisJKiBybHR0eS5jIChybHR0eV9zZXRfZGVmYXVsdF9iaW5kaW5ncyk6IExpa2V3aXNlLgorCShjb250cm9sX21ldGFfa2V5KTogTGlrZXdpc2UuCisJKiBkaXNwbGF5LmM6IElmIF9fR08zMl9fIGlzIGRlZmluZWQsIGluY2x1ZGUgPHN5cy9wYy5oPi4KKwkqIHBhcmVucy5jOiBJZiBfX0dPMzJfXyBpcyBkZWZpbmVkLCB1bmRlZmluZSBGRF9TRVQuCisJKiBzaWduYWxzLmM6IEluY2x1ZGUgU0lHV0lOQ0ggaGFuZGxpbmcgaW4gdGhlIHNldCBvZiB0aGluZ3Mgd2hpY2gKKwlpcyBub3QgZG9uZSBpZiBIQU5ETEVfU0lHTkFMUyBpcyBub3Qgc2V0LgorCitGcmkgTWF5ICA2IDEzOjM4OjM5IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCisKKyAgICAgICAgKiBjb25maWcvbWgtZ28zMjogTmV3IGZyYWdtZW50LgorCSogY29uZmlndXJlLmluIChob3N0PT1nbzMyKTogVXNlIGdvMzIgZnJhZ21lbnQuCisKK1dlZCBNYXkgIDQgMTQ6MzY6NTMgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogY2hhcmRlZnMuaCwgcmxkZWZzLmg6ICBNb3ZlIGRlY2xzIG9mIHN0cmluZyBmdW5jcyBmcm9tIGNoYXJkZWZzLmgKKwl0byBybGRlZnMuaCBzbyB0aGF0IHRoZXkgZG9uJ3QgcG9sbHV0ZSBhcHBzIHRoYXQgaW5jbHVkZQorCXJlYWRsaW5lLmguCisJKiBoaXN0b3J5LmM6ICBpbmNsdWRlIHJsZGVmcy5oIHRvIGdldCBkZWNscyBvZiBzdHJpbmcgZnVuY3MuCisKK1dlZCBNYXkgIDQgMTI6MTU6MTEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKHJzNjAwMC1idWxsLWJvc3gqKTogTmV3IGNvbmZpZ3VyYXRpb24sIFJTLzYwMDAKKwl2YXJpYW50LgorCitXZWQgQXByIDIwIDEwOjQzOjUyIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IFVzZSBtaC1wb3NpeCBmb3Igc3Vub3M0LjEqLgorCitXZWQgQXByIDEzIDIxOjI4OjQ0IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBybHR0eS5jIChzZXRfdHR5X3NldHRpbmdzKTogRG9uJ3Qgc2V0IHJlYWRsaW5lX2VjaG9pbmdfcC4KKwkocmxfZGVwcmVwX3Rlcm1pbmFsKSBbTkVXX1RUWV9EUklWRVJdOiBTZXQgcmVhZGxpbmVfZWNob2luZ19wLgorCitTdW4gTWFyIDEzIDA5OjEzOjEyIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogQWRkIFRBR1MgdGFyZ2V0LgorCitXZWQgTWFyICA5IDE4OjAxOjMxIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBpc2VhcmNoLmMsIHNlYXJjaC5jOiBJbmNsdWRlIHN5c2RlcC5oLgorCitUaHUgTWFyICAzIDE3OjQwOjAzIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IEZvciBJU0MsIHVzZSBtaC1zeXN2LCBub3QgbWgtaXNjLgorCitUaHUgRmViIDI0IDA0OjEzOjUzIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogTWVyZ2UgaW4gY2hhbmdlcyBmcm9tIGJhc2gtMS4xMy41LiBNZXJnZSBjaGFuZ2VzIGZyb20gZ2xvYi90aWxkZS5jCisJaW50byB0aWxkZS5jIGFuZCB1c2UgaXQuIEFkZCBzeXN0ZW0gZnVuY3Rpb24gZGVjbGFyYXRpb25zIHdoZXJlCisJbmVjZXNzYXJ5LiBDaGVjayBmb3IgX19HTzMyX18sIG5vdCBfR08zMl8gY29uc2lzdGVudGx5LgorCSogTWFrZWZpbGUuaW46ICBVcGRhdGUgZGVwZW5kZW5jaWVzLgorCSogcmx0dHkuYzogIEluY2x1ZGUgPHN5cy9maWxlLmg+IHRvIG1hdGNoIGluY2x1ZGUgZmlsZSBzZXR1cAorCWluIHJlYWRsaW5lLmMgZm9yIHJsZGVmcy5oLiBPdGhlcndpc2Ugd2UgZ2V0IGluY29uc2lzdGVudAorCVRUWV9EUklWRVIgZGVmaW5pdGlvbnMgaW4gcmVhZGxpbmUuYyBhbmQgcmx0dHkuYy4KKwkqIGJpbmQuYywgY29tcGxldGUuYzogIERvIG5vdCBpbmNsdWRlIDxzeXMvdHlwZXMuaD4sIGl0IGlzIGFscmVhZHkKKwlpbmNsdWRlZCB2aWEgc3lzZGVwLmgsIHdoaWNoIGNhdXNlcyBwcm9ibGVtcyBpZiA8c3lzL3R5cGVzLmg+IGhhcworCW5vIG11bHRpcGxlIGluY2x1c2lvbiBwcm90ZWN0aW9uLgorCSogcmVhZGxpbmUuYyAoX3JsX3NldF9zY3JlZW5fc2l6ZSk6ICBSZWVzdGFibGlzaCB0ZXN0IGZvcgorCVRJT0NHV0lOU1pfQlJPS0VOLgorCSogcmxkZWZzLmg6ICBEZWZpbmUgU19JU1JFRyBpZiBuZWNlc3NhcnkuCisKK0ZyaSBGZWIgMTggMDg6NTY6MzUgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBBZGQgc2VhcmNoLm8gcnVsZSBmb3IgU3VuIG1ha2UuCisKK1dlZCBGZWIgMTYgMTY6MzU6NDkgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCisKKwkqIHJsdHR5LmM6ICAjaWYgb3V0IHNvbWUgY29kZSBpZiBfX0dPMzJfXy4KKworVHVlIEZlYiAxNSAxNDowNzowOCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKKworCSogcmVhZGxpbmUuYyAoX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24pLCBkaXNwbGF5LmM6CisJUmV0dXJuIGludCwgbm90IHZvaWQsIHRvIGNvbmZvcm0gd2l0aCB0aGUgZXhwZWN0ZWQgYXJnIG9mIHRwdXRzLgorCSogcmVhZGxpbmUuYyAoaW5pdF90ZXJtaW5hbF9pbyk6ICB0Z2V0ZmxhZyBvbmx5IHRha2VzIDEgYXJnLgorCSogcmVhZGxpbmUuYyAoX3JsX3NhdmVzdHJpbmcpOiAgTmV3IGZ1bmN0aW9uLgorCSogY2hhcmRlZnMuaDogIFRvIGF2b2lkIGNvbmZsaWN0cyBhbmQvb3Igd2FybmluZ3MsIGRlZmluZQorCXNhdmVzdHJpbmcgYXMgYSBtYWNybyB3cmFwcGVyIGZvciBfcmxfc2F2ZXN0cmluZy4KKwkqIGRpc3BsYXkuYyAoZXh0ZXJuIHRlcm1feG4pOiAgSXQncyBhbiBpbnQgZmxhZywgbm90IGEgc3RyaW5nLgorCSogY2hhcnNkZWZzLmgsIHJsZGVmcy5oOiAgUmVtb3ZlIEhBVkVfU1RSSU5HX0gtcmVsYXRlZCBqdW5rLgorCitTYXQgRmViICA1IDA4OjMyOjMwIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogUmVtb3ZlIG9ic29sZXRlIHJ1bGVzIGZvciBoaXN0b3J5LmluZm8gYW5kCisJcmVhZGxpbmUuaW5mby4KKworVGh1IEphbiAyNyAxNzowNDowMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKKworCSogY2hhcmRlZnMuaDogT25seSBkZWNsYXJlIHN0cnJjaHIgaWYgaXQgaXMgbm90ICNkZWZpbmUnZC4KKworVHVlIEphbiAyNSAxMTozMDowNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogcmxkZWZzLmg6IEFjY2VwdCBfX2hwdXggYXMgd2VsbCBhcyBocHV4IGZvciBIUCBjb21waWxlciBpbiBBTlNJIG1vZGUuCisKK0ZyaSBKYW4gMjEgMTc6MzE6MjYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpc2EuY3lnbnVzLmNvbSkKKworCSogY2hhcmRlZnMuaCwgdGlsZGUuYzogSnVzdCBkZWNsYXJlIHN0cnJjaHIgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvCisJaW5jbHVkZSBhIHN5c3RlbSBoZWFkZXIuCisKK0ZyaSBKYW4gMjEgMTQ6NDA6NDMgMTk5NCAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4sIHJlYWxjbGVhbik6ICBFeHBhbmQgbG9jYWwtZGlzdGNsZWFuCisJaW5saW5lIGFmdGVyIGRvaW5nIHJlY3Vyc2lvbi4gIFlvdSBjYW4ndCByZWN1cnNlIGFmdGVyIHJlbW92aW5nCisJTWFrZWZpbGUuICBNYWtlIHRoZW0gZGVwZW5kIG9uIGxvY2FsLWNsZWFuLgorCSogTWFrZWZpbGUuaW4gKGxvY2FsLWRpc3RjbGVhbik6ICBSZW1vdmUgbm93IHN1cGVyZmx1b3VzIHRhcmdldC4KKworTW9uIEphbiAxNyAxMjo0MjowNyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQorCisJKiByZWFkbGluZS5jIChkb2luZ19hbl91bmRvKTogRGVsZXRlIHNlY29uZCBkZWNsYXJhdGlvbiwgc2luY2UgaXQKKwljb25mdXNlcyB0aGUgYWxwaGEtb3NmMSBuYXRpdmUgY29tcGlsZXIuCisKK1N1biBKYW4gMTYgMTI6MzM6MTEgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbXBsZXRlLmMsIGJpbmQuYzogSW5jbHVkZSA8c3lzL3N0YXQuaD4uCisJKiBjb21wbGV0ZS5jOiBEZWZpbmUgWF9PSyBpZiBub3QgZGVmaW5lZCBieSBhIHN5c3RlbSBoZWFkZXIuCisKKwkqIGNoYXJkZWZzLmg6IERvbid0IGRlY2xhcmUgeG1hbGxvYy4KKworCSoga2V5bWFwcy5oOiBJbmNsdWRlICJjaGFyZGVmcy5oIiBub3QgPHJlYWRsaW5lL2NoYXJkZWZzLmg+LgorCisJKiBNYWtlZmlsZS5pbiAoY2xlYW4gbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIHJlYWxjbGVhbik6IFJlY3Vyc2UKKwlpbnRvIHN1YmRpcmVjdG9yaWVzIGFzIHdlbGwgYXMgZG9pbmcgdGhpcyBkaXJlY3RvcnkuICBBZGQgY2xlYW4tZHZpCisJdGFyZ2V0LgorCitTYXQgSmFuIDE1IDE5OjM2OjEyIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQorCisJKiByZWFkbGluZS5jLCBkaXNwbGF5LmM6ICBQYXRjaGVzIHRvIGFsbG93IHVzZSBvZiBhbGwgODAKKwljb2x1bW5zIG9uIG1vc3QgdGVybWluYWxzICh0aG9zZSB3aXRoIGFtIGFuZCB4bikuCisKKwlNZXJnZSBpbiBjaGFuZ2VzIGZyb20gYmFzaC0xLjEzLiAgVGhlIG1vc3Qgb2J2aW91cyBvbmUgaXMKKwl0aGF0IHRoZSBmaWxlIHJlYWRsaW5lLmMgaGFzIGJlZW4gc3BsaXQgaW50byBtdWx0aXBsZSBmaWxlcy4KKwkqIGJpbmQuYywgY29tcGxldGUuYywgZGlzcGF5LmMsIGlzZWFyY2guYywgcGFyZW5zLmMsIHJsZGVmcy5oLAorCXJsdHR5LmMsIHNlYXJjaC5jIHNpZ25hbHMuYywgdGlsZGUuYywgdGlsZGUuaCwgeG1hbGxvYy5jOiAgTmV3IGZpbGVzLgorCitTYXQgRGVjIDExIDE2OjI5OjE3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiByZWFkbGluZS5jIChybF9nZXRjKTogSWYgR08zMiwgdHJpbSBoaWdoIGJpdCBmcm9tIGdldGtleSwKKwlvdGhlcndpc2UgZmFuY3kgUEMga2V5cyBjYXVzZSBncmllZi4KKworRnJpIE5vdiAgNSAxMTo0OTo0NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBBZGQgZG9jIHRvIGNvbmZpZ2RpcnMuCisJKiBNYWtlZmlsZS5pbiAoaW5mbyBkdmkgaW5zdGFsbC1pbmZvIGNsZWFuLWluZm8pOiBSZWN1cnNlIGludG8gZG9jLgorCitGcmkgT2N0IDIyIDA3OjU1OjA4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IEFkZCAqIHRvIGVuZCBvZiBhbGwgT1MgbmFtZXMuCisKK1R1ZSBPY3QgIDUgMTI6MzM6NTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIHJlYWRsaW5lLmM6IEFkZCBzdHVmZiBmb3IgSElVWCB0byBwbGFjZSB3aGVyZSB3ZSBkZXRlY3QgdGVybWlvCisJdnMuIHNndHR5ICh1Z2gsIGJ1dCBJIGRvbid0IHNlZSBhIHNpbXBsZSBiZXR0ZXIgd2F5KS4KKworV2VkIFNlcCAyOSAxMTowMjo1OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogcmVhZGxpbmUuYyAocGFyc2VyX2lmKTogRnJlZSB0bmFtZSB3aGVuIGRvbmUgd2l0aCBpdCAoY2hhbmdlCisJaW1wb3J0ZWQgZnJvbSBmcm9tIGJhc2gJMS4xMiByZWFkbGluZSkuCisKK1R1ZSBTZXAgIDcgMTc6MTU6MzcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAobTg4ay0qLXN5c3ZyNCopOiBDb21tZW50IG91dCBwcmV2aW91cyBjaGFuZ2UuCisKK0ZyaSBKdWwgIDIgMTE6MDU6MzQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKCotKi1yaXNjb3MqKTogTmV3IGVudHJ5OyB1c2UgbWgtc3lzdi4KKworV2VkIEp1biAyMyAxMzowMDoxMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBBZGQgY29tbWVudC4KKworTW9uIEp1biAxNCAxNDoyODo1NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZXJpYykKKworCSogY29uZmlndXJlLmluIChtODhrLSotc3lzdnI0Kik6IFVzZSBzeXNkZXAtbm9ybS5oLgorCitTdW4gSnVuIDEzIDEzOjA0OjA5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoe3JlYWwsZGlzdH1jbGVhbik6IFJlbW92ZSBzeXNkZXAuaC4KKworVGh1IEp1biAxMCAxMToyMjo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IEFkZCBtb3N0bHljbGVhbiwgZGlzdGNsZWFuLCBhbmQgcmVhbGNsZWFuIHRhcmdldHMuCisKK0ZyaSBNYXkgMjEgMTc6MDk6MjggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZy9taC1pc2M6IE5ldyBmaWxlLgorCSogY29uZmlndXJlLmluOiBVc2UgaXQuCisKK1NhdCBBcHIgMTcgMDA6NDA6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uIGF0IGNhbHZpbikKKworCSogcmVhZGxpbmUuYywgaGlzdG9yeS5jOiBEb24ndCBpbmNsdWRlIHN5cy90eXBlcy5oOyBzeXNkZXAuaCBkb2VzLgorCisJKiBjb25maWcvbWgtc3lzdjogRGVmaW5lIFRJT0NHV0lOU1pfQlJPS0VOLgorCXJlYWRsaW5lLmM6IENoZWNrIGl0LgorCitXZWQgTWFyIDI0IDAyOjA2OjE1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogYWRkIGluc3RhbGxjaGVjayAmIGR2aSB0YXJnZXRzCisKK0ZyaSBNYXIgMTIgMTg6MzY6NTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSAqLSotc29sYXJpczIqIGluc3RlYWQgb2YgKi0qLXNvbGFyaXMqIChhCisJbnVtYmVyIG9mIHBlb3BsZSB3YW50IHRvIGNhbGwgU3VuT1MgNC4xLjIgInNvbGFyaXMxLjAiCisJYW5kIGdldCBpdCByaWdodCkKKworVHVlIE1hciAgMiAyMToyNTozNiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogc3lzZGVwLXN5c3Y0Lmg6ICBOZXcgZmlsZSBmb3IgU1ZSNC4KKwkqIGNvbmZpZ3VyZS5pbiAoKi0qLXN5c3Y0Kik6ICBVc2Ugc3lzZGVwLXN5c3Y0LmguCisKKwkqIGNvbmZpZ3VyZS5pbiAoKi0qLXVsdHJpeDIpOiAgQWRkIHRyaXBsZXQgZnJvbSBNaWNoYWVsIFJlbmRlbGwKKwkobWljaGFlbEBtZXJjdXJ5LmNzLm11bi5jYSkKKworVHVlIERlYyAxNSAxMjozODoxNiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXNjbzMuMnY0Kik6IHVzZSBtaC1zY280LgorCSogY29uZmlnL21oLXNjbzQ6IE5ldyBmaWxlLCBsaWtlIG1oLXNjbyBidXQgd2l0aG91dCBkZWZpbmluZworCV9QT1NJWF9TT1VSQ0UuCisKK1dlZCBOb3YgMTEgMjE6MjA6MTQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIFJlZm9ybWF0IHRvIG9uZS1jYXNlLXBlci1saW5lLgorCUhhbmRsZSBTdW5PUyAzLjUsIGFzIHBlciBLYXJsIEJlcnJ5LCA8a2FybEBjbGF1ZGUuY3MudW1iLmVkdT4uCisKK1dlZCBOb3YgIDQgMTU6MzI6MzEgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogc3lzZGVwLW5vcm0uaDogIFJlbW92ZSBzb21lIGNydWQsIGluc3RhbGwgZGlyZSB3YXJuaW5nLgorCitUaHUgT2N0IDIyIDAxOjA4OjEzIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIE1ha2UgU0NPIHdvcmsgYWdhaW4uLi4KKworTW9uIE9jdCAxMiAxNTowNDowNyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIHJlYWRsaW5lLmMgKGluaXRfdGVybWluYWxfaW8pOiBpZiB0Z2V0ZW50IHJldHVybnMgMCwgdGhlCisJdGVybWluYWwgdHlwZSBpcyB1bmtub3duLgorCitUaHUgT2N0ICAxIDIzOjQ0OjE0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiB1c2UgY3B1LXZlbmRvci1vcyB0cmlwbGUgaW5zdGVhZCBvZiBuZXN0ZWQgY2FzZXMKKworV2VkIFNlcCAzMCAxMjo1ODo1NyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiByZWFkbGluZS5jIChybF9jb21wbGV0ZV9pbnRlcm5hbCk6ICBDYXN0IGFsbG9jYSB0byAoY2hhciAqKSB0bworCWF2b2lkIHdhcm5pbmcuCisKK0ZyaSBTZXAgMjUgMTI6NDU6MDUgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogcmVhZGxpbmUuYyAoY2xlYXJfdG9fZW9sLCBybF9nZW5lcmljX2JpbmQpOiAgTWFrZSBzdGF0aWMuCisJKHJsX2RpZ2l0X2xvb3ApOiAgQWRkIGFyZyB0byBjYWxsIHRvIHJsX21lc3NhZ2UoKS4KKwkqIHZpX21vZGUuYyAocmxfdmlfZmlyc3RfcHJpbnQpOiAgQWRkIGFyZyB0byBjYWxsIHRvCisJcmxfYmFja190b19pbmRlbnQoKS4KKworV2VkIEF1ZyAxOSAxNDo1OTowNyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcywgdXNlIGZ1bGwKKwlmaWxlIG5hbWUgZm9yIGluc3RhbGwgdGFyZ2V0LgorCitXZWQgQXVnIDEyIDE1OjUwOjU3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQorCisJKiByZWFkbGluZS5jIChsYXN0X3JlYWRsaW5lX2luaXRfZmlsZSk6ICBGaXggdHlwbyBtYWRlIGJ5IFN0ZXZlCisJQ2hhbWJlcmxhaW4vREogRGVsb3JpZS4gIFByb3BlciBjb250cm9sIGZpbGUgbmFtZSBpcyB+Ly5pbnB1dHJjLAorCW5vdCB+L2lucHV0cmMuCisKK1RodSBKdW4gMjUgMTY6MTU6MjcgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiAgTWFrZSBic2QgYmFzZWQgc3lzdGVtcyB1c2Ugc3lzZGVwLW9ic2QuaC4KKworVHVlIEp1biAyMyAyMzoyMjo1MyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKKworCSogY29uZmlnL21oLXBvc2l4OiAgTmV3IGZpbGUsIGZvciBQb3NpeC1jb21wbGlhbnQgc3lzdGVtcy4KKwkqIGNvbmZpZ3VyZS5pbjogIFVzZSBtaC1wb3NpeCBmb3IgTGludXggKGZyZWUgVW5peCBjbG9uZSkuCisKK1R1ZSBKdW4gMjMgMjE6NTk6MjAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIHN5c2RlcC1ub3JtLmggKGFsbG9jYSk6ICBQcm90ZWN0IGFnYWluc3QgcHJldmlvdXMgZGVmaW5pdGlvbiBhcworCWEgbWFjcm8gd2l0aCBhcmd1bWVudHMuCisKK0ZyaSBKdW4gMTkgMTU6NDg6NTQgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogc3lzZGVwLW9ic2QuaDogICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gdG8gbWFrZSB0aGlzIG1vcmUgS29zaGVyLgorCitGcmkgSnVuIDE5IDEyOjUzOjI4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWcvbWgtYXBvbGxvNjh2LCBtaC1zY28sIG1oLXN5c3YsIG1oLXN5c3Y0fTogUkFOTElCPXRydWUuCisKK01vbiBKdW4gMTUgMTM6NTA6MzQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IHVzZSBtaC1zeXN2NCBvbiBzb2xhcmlzMgorCitNb24gSnVuIDE1IDEyOjI4OjI0IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb25maWcvbWgtbmNyMzAwMCAoSU5TVEFMTCk6ICBEb24ndCB1c2UgL3Vzci91Y2IvaW5zdGFsbCwKKwlpdCBpcyBicm9rZW4gb24gbmNyIDMwMDAncy4KKwkqIGNvbmZpZy9taC1uY3IzMDAwIChSQU5MSUIpOiAgVXNlIFJBTkxJQj10cnVlLgorCitNb24gSnVuIDE1IDAxOjM1OjU1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiByZWFkbGluZS5jOiBNYWtlIG5ldyBTSUdOQUxTXyogbWFjcm9zIHRvIHBhcmFtZXRlcml6ZSB0aGUgCisJdWdseSBjaGFuZ2VzIGluIHNpZ25hbCBibG9ja2luZy4gIFVzZSB0aGVtIHRocm91Z2hvdXQsCisJcmVkdWNpbmcgI2lmZGVmIEhBVkVfUE9TSVhfU0lHTkFMUyBhbmQgSEFWRV9CU0RfU0lHTkFMUyBjbHV0dGVyCisJc2lnbmlmaWNhbnRseS4gIE1ha2UgYWxsIHN1Y2ggcGxhY2VzIHVzZSBQT1NJWCBpZiBhdmFpbGFibGUsCisJdG8gYXZvaWQgbG9zaW5nIHdpdGggcG9vciBgc2lnc2V0bWFzaycgZW11bGF0aW9uIGZyb20gbGliaWJlcnR5LgorCitTdW4gSnVuIDE0IDE1OjE5OjUxIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIHJlYWRsaW5lLmMgKGluc2VydF9zb21lX2NoYXJzKTogIFJldHVybiB2b2lkLgorCitUaHUgSnVuIDExIDAxOjI3OjQ1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiByZWFkbGluZS5jOiAgI3VuZGVmIFBDLCB3aGljaCBTb2xhcmlzMiBkZWZpbmVzIGluIHN5cy90eXBlcy5oLAorCWNsb2JiZXJpbmcgdGhlIHRlcm1jYXAgZ2xvYmFsIHZhcmlhYmxlIFBDLgorCitUdWUgSnVuICA5IDE3OjMwOjIzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQorCisJKiBjb25maWcve21oLW5jcjMwMDAsIG1oLXN5c3Y0fTogIENoYW5nZSBJTlNUQUxMIHRvIHVzZQorCS91c3IvdWNiL2luc3RhbGwuCisKK01vbiBKdW4gIDggMjM6MTA6MDcgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIHJlYWRsaW5lLmggKHJsX2NvbXBsZXRlcl9xdW90ZV9jaGFyYWN0ZXJzKTogIEFkZCBkZWNsYXJhdGlvbi4KKwkqIHJlYWRsaW5lLmMgKHJsX2NvbXBsZXRlcl9xdW90ZV9jaGFyYWN0ZXJzKTogIEFkZCBnbG9iYWwgdmFyLgorCSogcmVhZGxpbmUuYyAoc3RycGJyayk6ICBBZGQgcHJvdG90eXBlIGFuZCBmdW5jdGlvbi4KKwkqIHJlYWRsaW5lLmMgKHJsX2NvbXBsZXRlX2ludGVybmFsKTogIEFkZCBjb2RlIHRvIGhhbmRsZQorCWV4cGFuc2lvbiBvZiBxdW90ZWQgc3RyaW5ncy4KKworTW9uIE1heSAxMSAxMjozOTozMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogcmVhZGxpbmUuYzogIENhbid0IGluaXRpYWxpemUgRklMRSAqJ3Mgd2l0aCBzdGRpbiBhbmQgc3Rkb3V0LAorCWJlY2F1c2UgdGhleSBtaWdodCBub3QgYmUgY29uc3RhbnQuICBQYXRjaCBmcm9tIFRvbSBRdWlubiwKKwl0cnFAZGlub3lzb3MudGhwaHlzLm94LmFjLnVrLgorCitUdWUgQXByIDI4IDIxOjUyOjM0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiByZWFkbGluZS5oOiAgRGVjbGFyZSBybF9ldmVudF9ob29rICh3aGljaCBhbHJlYWR5IGV4aXN0ZWQpLgorCVN1Z2dlc3RlZCBieSBDaHJpc3RvcGggVGlldHogPHRpZXR6QHppLmdtZC5kYnAuZGU+LgorCitXZWQgQXByIDIyIDE4OjA4OjAxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiByZW1vdmUgc3ViZGlycyBkZWNsYXJhdGlvbi4gIFRoZSBvYnNvbGV0ZSBzZW1hbnRpYworCSAgZm9yIHN1YmRpcnMgaGFzIGJlZW4gdXN1cnBlZCBieSBwZXIncyBuZXcgbWVhbmluZy4KKworVHVlIEFwciAyMSAxMTo1NDoyMyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IHJld29yayBDRkxBR1Mgc28gdGhhdCB0aGV5IGNhbiBiZSBzZXQgb24gdGhlCisJICBjb21tYW5kIGxpbmUgdG8gbWFrZS4gIFJlbW92ZSBNSU5VU19HLiAgRGVmYXVsdCBDRkxBR1MgdG8gLWcuCisKK0ZyaSBBcHIgMTAgMjM6MDI6MjcgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogIFJlY29nbml6ZSBuZXcgbmNyMzAwMCBjb25maWcuCisJKiBjb25maWcvbWgtbmNyMzAwMDogIE5ldyBOQ1IgMzAwMCBjb25maWcgZmlsZS4KKworV2VkIE1hciAyNSAxMDo0NjozMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKKworCSogaGlzdG9yeS5jIChzdGlmbGVfaGlzdG9yeSk6ICBOZWdhdGl2ZSBhcmcgdHJlYXRlZCBhcyB6ZXJvLgorCitUdWUgTWFyIDI0IDIzOjQ2OjIwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQorCisJKiBjb25maWcvbWgtc3lzdjogSU5TVEFMTF9QUk9HIC0+IElOU1RBTEwuCisKK01vbiBGZWIgMTAgMDE6NDE6MzUgMTk5MiAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCisKKwkqIGhpc3RvcnkuYyAoaGlzdG9yeV9kb193cml0ZSkgQnVpbGQgYSBidWZmZXIgb2YgYWxsIG9mIHRoZSBsaW5lcworCXRvIHdyaXRlIGFuZCB3cml0ZSB0aGVtIGluIG9uZSBmZWxsIHN3b29wIChsb3dlciBvdmVyaGVhZCB0aGFuCisJY2FsbGluZyB3cml0ZSAoKSBmb3IgZWFjaCBsaW5lKS4gIFN1Z2dlc3RlZCBieSBQZXRlciBIby4KKworCSogdmlfbW9kZS5jIChybF92aV9zdWJzdCkgRG9uJ3QgZm9yZ2V0IHRvIGVuZCB0aGUgdW5kbyBncm91cC4KKworU2F0IE1hciAgNyAwMDoxNTozNiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiByZW1vdmUgRklYTUUncyBvbiBpbmZvIGFuZCBpbnN0YWxsLWluZm8gdGFyZ2V0cy4KKworRnJpIE1hciAgNiAyMjowMjowNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGFkZGVkIGNoZWNrIHRhcmdldC4KKworV2VkIEZlYiAyNiAxODowNDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0cmFjZXMgb2YgbmFtZXN1YmRpciwKKwkgIC1zdWJkaXJzLCAkKHN1YmRpciksICQodW5zdWJkaXIpLCBzb21lIHJjcyB0cmlnZ2Vycy4gIEZvcmNlZAorCSAgY29weXJpZ2h0cyB0byAnOTIsIGNoYW5nZWQgc29tZSBmcm9tIEN5Z251cyB0byBGU0YuCisKK0ZyaSBGZWIgMjEgMTQ6Mzc6MzIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIHJlYWRsaW5lLmMsIGV4YW1wbGVzL2ZpbGVtYW4uYzogcGF0Y2hlcyBmcm9tIERKIHRvIHN1cHBvcnQgRE9TCisKK1RodSBGZWIgMjAgMjM6MjM6MTYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKKworCSogcmVhZGxpbmUuYyAocmxfcmVhZF9pbml0X2ZpbGUpOiAgTWFrZSBzdXJlIHRoYXQgbnVsbCBmaWxlbmFtZSBpcworCW5vdCBwYXNzZWQgdG8gb3BlbigpIG9yIGVsc2Ugd2UgZW5kIHVwIG9wZW5pbmcgdGhlIGRpcmVjdG9yeSwgYW5kCisJcmVhZCBhIGJ1bmNoIG9mIGdhcmJhZ2UgaW50byBrZXltYXBbXS4KKworTW9uIEZlYiAxNyAxNzoxNTowOSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKKworCSogcmVhZGxpbmUuYyAocmVhZGxpbmVfZGVmYXVsdF9iaW5kaW5ncyk6ICBPbmx5IG1ha2UgdXNlIG9mIFZMTkVYVAorCXdoZW4gYm90aCBWTE5FWFQgYW5kIFRFUk1JT1NfVFRZX0RSSVZFUiBpcyBkZWZpbmVkLiAgT24gU1ZSNAorCTx0ZXJtaW8uaD4gaW5jbHVkZXMgPHRlcm1pb3MuaD4sIHNvIFZMTkVYVCBpcyBhbHdheXMgZGVmaW5lZC4KKworCSogc3lzZGVwLW5vcm0uaCAoX1BPU0lYX1ZFUlNJT04pOiAgRGVmaW5lIHRoaXMgZm9yIGFsbCBTVlI0CisJc3lzdGVtcyBzbyB0aGF0IDx0ZXJtaW9zLmg+IGdldHMgdXNlZCwgaW5zdGVhZCBvZiA8dGVybWlvLmg+LgorCitGcmkgRGVjIDIwIDEyOjA0OjMxIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46ICBDaGFuZ2Ugc3ZyNCByZWZlcmVuY2VzIHRvIHN5c3Y0LgorCitUdWUgRGVjIDEwIDA0OjA3OjIwIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgorCitGcmkgRGVjICA2IDIzOjIzOjE0IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IHJlbW92ZSBzcGFjZXMgZm9sbG93aW5nIGh5cGhlbnMsIGJzZCBtYWtlIGNhbid0CisJICBjb3BlLiBhZGRlZCBjbGVhbi1pbmZvLiAgYWRkZWQgc3RhbmRhcmRzLnRleHQgc3VwcG9ydC4gIERvbid0CisJICBrbm93IGhvdyB0byBtYWtlIGluZm8gYW55bW9yZS4KKworCSogY29uZmlndXJlLmluOiBjb21tb250YXJnZXRzIGlzIG5vIGxvbmdlciBhIHJlY29nbml6ZWQgaG9vaywgc28KKwkgIHJlbW92ZSBpdC4gIG5ldyBzdWJkaXIgY2FsbGVkIGRvYy4KKworVGh1IERlYyAgNSAyMjo0NjoxMCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKKwkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKKwkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCisKK0ZyaSBOb3YgMjIgMDk6MDI6MzIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCisKKwkqIHN5c2RlcC1vYnNkLmg6ICBSZW5hbWUgZnJvbSBzeXNkZXAtbmV3c29zLmguCisJKiBjb25maWd1cmUuaW46ICBVc2Ugc3lzZGVwLW9ic2QgZm9yIE1hY2ggYXMgd2VsbCBhcyBORVdzLgorCisJKiBzeXNkZXAtbm9ybS5oLCBzeXNkZXAtYWl4Lmg6ICBBZGQgPHN5cy90eXBlcy5oPiwgd2hpY2ggUE9TSVgKKwlyZXF1aXJlcyB0byBtYWtlIDxkaXJlbnQuaD4gd29yay4gIEltcHJvdmUgU3VuIGFsbG9jYSBkZWNsLgorCitUaHUgTm92IDIxIDE4OjQ4OjA4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogIENsZWFuIHVwIC4uL2dsb2IvdGlsZGUuYyAtPiB0aWxkZS5vIHBhdGguCisJQ2xlYW4gdXAgbWFrZWZpbGUgYSBiaXQgaW4gZ2VuZXJhbC4KKworVGh1IE5vdiAyMSAxNDo0MDoyOSAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4sIGNvbmZpZy9taC1zdnI0OiAgTWFrZSBTVlI0IHdvcmsuCisKKwkqIHJlYWRsaW5lLmM6ICBNb3ZlIGNvbmZpZyBzdHVmZiB0byBzeXNkZXAuaCwgdXNlIHR5cGVkZWYgZGlyZW50CisJY29uc2lzdGVudGx5LCByZW1vdmUgcmVmcyB0byBkX25hbWxlbiAoJiBEX05BTUxFTikgdG8gaW1wcm92ZQorCXBvcnRhYmlsaXR5LiAgQWxzbywgdXBkYXRlIGNvcHlyaWdodCBub3RpY2UuCisJcmVhZGxpbmUuaDogIHJlbW92ZSBjb25maWcgc3R1ZmYgdGhhdCBJIGFkZGVkIGVycm9uZW91c2x5IGluIHRoZQorCWZpcnN0IHBsYWNlLgorCisJKiBlbWFjc19rZXltYXAuYywgZnVubWFwLmMsIGhpc3RvcnkuYywga2V5bWFwcy5jLCB2aV9rZXltYXAuYywKKwl2aV9tb2RlLmM6ICBtb3ZlIGNvbmZpZyBzdHVmZiB0byBzeXNkZXAuaCwgdXBkYXRlIGNvcHlyaWdodCBub3RpY2VzLgorCitUdWUgTm92IDE5IDE1OjAyOjEzIDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCisKKwkqIGhpc3RvcnkuYzogICNpbmNsdWRlICJzeXNkZXAuaCIuCisKK1R1ZSBOb3YgMTkgMTA6NDk6MTcgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluLCBjb25maWcvaG0tc3lzdiwgY29uZmlnL2htLXNjbzogIENoYW5nZSBTWVNWIHRvCisJVVNHIHRvIG1hdGNoIGN1cnJlbnQgdXNhZ2UuCisKKwkqIHJlYWRsaW5lLmM6ICBBZGQgVVNHcjQgdG8gbGlzdCBvZiBkZWZpbmVkIHRoaW5ncyB0byBjaGVjayBmb3IKKwl0byB1c2UgPGRpcmVudC5oPiBzdHlsZSBkaXJlY3RvcnkgYWNjZXNzLgorCisJKiBjb25maWcvaG0tc3ZyNDogIE5ldyBmaWxlIGZvciBTeXN0ZW0gViBSZWxlYXNlIDQgKFVTR3I0KS4KKworTW9uIE5vdiAxOCAyMzo1OTo1MiAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQorCisJKiByZWFkbGluZS5jIChmaWxlbmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uKTogIHVzZSBzdHJ1Y3QgZGlyZW50CisJaW5zdGVhZAlvZiBzdHJ1Y3QgZGlyZWN0LgorCitGcmkgTm92ICAxIDA3OjAyOjEzIDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQorCisJKiByZWFkbGluZS5jIChybF90cmFuc2xhdGVfa2V5c2VxKSBNYWtlIEMtPyB0cmFuc2xhdGUgdG8gUlVCT1VUCisJdW5jb25kaXRpb25hbGx5LgorCitNb24gT2N0IDI4IDExOjM0OjUyIDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQorCisJKiByZWFkbGluZS5jOyBVc2UgUG9zaXggZGlyZWN0b3J5IHJvdXRpbmVzIGFuZCBtYWNyb3MuCisKKwkqIGZ1bm1hcC5jOyBBZGQgZW50cnkgZm9yIGNhbGwtbGFzdC1rYmQtbWFjcm8uCisKKwkqIHJlYWRsaW5lLmMgKHJsX3ByZXBfdGVybSk7IFVzZSBzeXN0ZW0gRU9GIGNoYXJhY3RlciBvbiBQT1NJWAorCXN5c3RlbXMgYWxzby4KKworVGh1IE9jdCAgMyAxNjoxOTo1MyAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKKworCSogcmVhZGxpbmUuYzsgTWFrZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gaGF2aW5nIGEgVEVSTUlPUyB0dHkKKwlkcml2ZXIsIGFuZCBoYXZpbmcgUE9TSVggc2lnbmFsIGhhbmRsaW5nLiAgWW91IG1pZ2h0IG9uZSB3aXRob3V0CisJdGhlIG90aGVyLiAgTmV3IGRlZmluZXMgdXNlZCBIQVZFX1BPU0lYX1NJR05BTFMsIGFuZAorCVRFUk1JT1NfVFRZX0RSSVZFUi4KKworVHVlIEp1bCAzMCAyMjozNzoyNiAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKKworCSogcmVhZGxpbmUuYzogcmxfZ2V0YyAoKSBJZiBhIGNhbGwgdG8gcmVhZCAoKSByZXR1cm5zIHdpdGhvdXQgYW4KKwllcnJvciwgYnV0IHdpdGggemVybyBjaGFyYWN0ZXJzLCB0aGUgZmlsZSBpcyBlbXB0eSwgc28gcmV0dXJuIEVPRi4KKworVGh1IEp1bCAxMSAyMDo1ODozOCAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKKworCSogcmVhZGxpbmUuYzogKHJsX2dldF9uZXh0X2hpc3RvcnksIHJsX2dldF9wcmV2aW91c19oaXN0b3J5KQorCVJlYWxsb2NhdGUgdGhlIGJ1ZmZlciBzcGFjZSBpZiB0aGUgbGluZSBiZWluZyBtb3ZlZCB0byBpcyBsb25nZXIKKwl0aGUgdGhlIGN1cnJlbnQgc3BhY2UgYWxsb2NhdGVkLiAgQW1hemluZyB0aGF0IG5vIG9uZSBoYXMgZm91bmQKKwl0aGlzIGJ1ZyB1bnRpbCBub3cuCisKK1N1biBKdWwgIDcgMDI6Mzc6MDUgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCisKKwkqIHJlYWRsaW5lLmM6KHJsX3BhcnNlX2FuZF9iaW5kKSBBbGxvdyBsZWFkaW5nIHdoaXRlc3BhY2UuCisJICBNYWtlIHN1cmUgVEVSTUlPIGFuZCBURVJNSU9TIHN5c3RlbXMgdHJlYXQgQ1IgYW5kIE5MCisJICBkaXNjdGluY3RseS4KKwkKK1R1ZSBKdW4gMjUgMDQ6MDk6MjcgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCisKKwkqIHJlYWRsaW5lLmM6IFJld29yayBwYXJzaW5nIGNvbmRpdGlvbmFscyB0byBwYXkgYXR0ZW50aW9uIHRvIHRoZQorCXByaW9yIHN0YXRlcyBvZiB0aGUgY29uZGl0aW9uYWwgc3RhY2suICBUaGlzIG1ha2VzICRpZiBzdGF0ZW1lbnRzCisJd29yayBjb3JyZWN0bHkuCisKK01vbiBKdW4gMjQgMjA6NDU6NTkgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCisKKwkqIHJlYWRsaW5lLmM6IHN1cHBvcnQgZm9yIGRpc3BsYXlpbmcga2V5IGJpbmRpbmcgaW5mb3JtYXRpb24KKwlpbmNsdWRlcyB0aGUgZnVuY3Rpb25zIHJsX2xpc3RfZnVubWFwX25hbWVzICgpLAorCWludm9raW5nX2tleXNlcXNfaW5fbWFwICgpLCBybF9pbnZva2luZ19rZXlzZXFzICgpLAorCXJsX2R1bXBfZnVuY3Rpb25zICgpLCBhbmQgcmxfZnVuY3Rpb25fZHVtcGVyICgpLgorCisJZnVubWFwLmM6IHN1cHBvcnQgZm9yIHNhbWUgaW5jbHVkZXMgcmxfZnVubWFwX25hbWVzICgpLgorCisJcmVhZGxpbmUuYywgZnVubWFwLmM6IG5vIGxvbmdlciBkZWZpbmUgU1RBVElDX01BTExPQy4gIEhvd2V2ZXIsCisJdXBkYXRlIGJvdGggdmVyc2lvbiBvZiB4cmVhbGxvYyAoKSB0byBoYW5kbGUgYSBudWxsIHBvaW50ZXIuCisKK1RodSBBcHIgMjUgMTI6MDM6NDkgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCisKKwkqIHZpX21vZGUuYyAocmxfdmlfZndvcmQsIGZXb3JkLCBldGMuICBBbGwgZnVuY3Rpb25zIHVzZQorCXRoZSBtYWNybyBgaXNpZGVudCgpJy4gIEZpeGVkIG1vdmVtZW50IGJ1ZyB3aGljaCBwcmV2ZW50cworCWNvbnRpbmlvdXMgbW92ZW1lbnQgdGhyb3VnaCB0aGUgdGV4dC4KKworRnJpIEp1bCAyNyAxNjo0NzowMSAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKKworCSogcmVhZGxpbmUuYyAocGFyc2VyX2lmKSBBbGxvdyAiJGlmIHRlcm09Zm9vIiBjb25zdHJ1Y3QuCisKK1dlZCBNYXkgMjMgMTY6MTA6MzMgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCisKKwkqIHJlYWRsaW5lLmMgKHJsX2Rpc3BhdGNoKSBDb3JyZWN0bHkgcmVtZW1iZXIgdGhlIGxhc3QgY29tbWFuZAorCWV4ZWN1dGVkLiAgRml4ZWQgdHlwbyBpbiB1c2VybmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uICgpLgorCitNb24gQXByICA5IDE5OjU1OjQ4IDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQorCisJKiByZWFkbGluZS5jOiB1c2VybmFtZV9jb21wbGV0aW9uX2Z1bmN0aW9uICgpOyBGb3IgdGV4dCBwYXNzZWQgaW4KKwl3aXRoIGEgbGVhZGluZyBgficsIHJlbWVtYmVyIHRoYXQgdGhpcyBjb3VsZCBiZSBhIGZpbGVuYW1lIChhZnRlcgorCWl0IGlzIGNvbXBsZXRlZCkuCisKK1RodSBBcHIgIDUgMTM6NDQ6MjQgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCisKKwkqIHJlYWRsaW5lLmM6IHJsX3NlYXJjaF9oaXN0b3J5ICgpOiBDb3JyZWN0bHkgaGFuZGxlIGNhc2Ugb2YgYW4KKwl1bmZvdW5kIHNlYXJjaCBzdHJpbmcsIGJ1dCBhIGdyYWNlZnVsIGV4aXQgKGFzIHdpdGggRVNDKS4KKworCSogcmVhZGxpbmUuYzogcmxfcmVzdGFydF9vdXRwdXQgKCk7ICBUaGUgQXBvbGxvIHBhc3NlcyB0aGUgYWRkcmVzcworCW9mIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gVElPQ1NUQVJULCBub3QgdGhlIGRlc2NyaXB0b3IgaXRzZWxmLgorCitUdWUgTWFyIDIwIDA1OjM4OjU1IDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQorCisJKiByZWFkbGluZS5jOiBybF9jb21wbGV0ZSAoKTsgc2Vjb25kIGNhbGwgaW4gYSByb3cgY2F1c2VzIHBvc3NpYmxlCisJY29tcGxldGlvbnMgdG8gYmUgbGlzdGVkLgorCisJKiByZWFkbGluZS5jOiBybF9yZWRpc3BsYXkgKCksIGFkZGVkIHByb21wdF90aGlzX2xpbmUgdmFyaWFibGUKKwl3aGljaCBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGNoYXJhY3RlciBmb2xsb3dpbmcgXG4gaW4gcHJvbXB0LgorCitTdW4gTWFyIDExIDA0OjMyOjAzIDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQorCisJKiBTaWduYWxzIGFyZSBub3cgc3VwcG9zZWRseSBoYW5kbGVkIGluc2lkZSBvZiBTWVNWIGNvbXBpbGF0aW9uLgorCitXZWQgSmFuIDE3IDE5OjI0OjA5IDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgc2JwaHkudWNzYi5lZHUpCisKKwkqIGhpc3RvcnkuYzogaGlzdG9yeV9leHBhbmQgKCk7IGZpeGVkIG92ZXJ3cml0aW5nIG1lbW9yeSBlcnJvciwKKwlhZGRlZCBuZWVkZWQgYXJndW1lbnQgdG8gY2FsbCB0byBnZXRfaGlzdG9yeV9ldmVudCAoKS4KKworVGh1IEphbiAxMSAxMDo1NDowNCAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IHNicGh5LnVjc2IuZWR1KQorCisJKiByZWFkbGluZS5jOiBhZGRlZCBtYXJrX21vZGlmaWVkX2xpbmVzIHRvIGNvbnRyb2wgdGhlCisJZGlzcGxheSBvZiBhbiBhc3RlcmlzayBvbiBtb2RpZmllZCBoaXN0b3J5IGxpbmVzLiAgQWxzbworCWFkZGVkIGEgdXNlciB2YXJpYWJsZSBjYWxsZWQgbWFyay1tb2RpZmllZC1saW5lcyB0byB0aGUKKwlgc2V0JyBjb21tYW5kLgorCitUaHUgSmFuICA0IDEwOjM4OjA1IDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgc2JwaHkudWNzYi5lZHUpCisKKwkqIHJlYWRsaW5lLmM6IHN0YXJ0X2luc2VydCAoKS4gIE9ubHkgdXNlIElDIGlmIHdlIGRvbid0IGhhdmUgYW4gaW0KKwljYXBhYmlsaXR5LgorCitGcmkgU2VwICA4IDA5OjAwOjQ1IDE5ODkgIEJyaWFuIEZveCAgKGJmb3ggYXQgYXVyZWwpCisKKwkqIHJlYWRsaW5lLmM6IHJsX3ByZXBfdGVybWluYWwgKCkuICBPbmx5IHR1cm4gb24gOHRoIGJpdAorCSAgYXMgbWV0YS1iaXQgaWZmIHRoZSB0ZXJtaW5hbCBpcyBub3QgdXNpbmcgcGFyaXR5LgorCitTdW4gU2VwICAzIDA4OjU3OjQwIDE5ODkgIEJyaWFuIEZveCAgKGJmb3ggYXQgYXVyZWwpCisKKwkqIHJlYWRsaW5lLmM6IHN0YXJ0X2luc2VydCAoKS4gIFVzZXMgbXVsdGlwbGUKKwkgIGluc2VydGlvbiBjYWxsIGluIGNhc2VzIHdoZXJlIHRoYXQgbWFrZXMgc2Vuc2UuCisKKwkgIHJsX2luc2VydCAoKS4gIFJlYWQgdHlwZS1haGVhZCBidWZmZXIgZm9yIGFkZGl0aW9uYWwKKwkgIGtleXMgdGhhdCBhcmUgYm91bmQgdG8gcmxfaW5zZXJ0LCBhbmQgaW5zZXJ0IHRoZW0KKwkgIGFsbCBhdCBvbmNlLiAgTWFrZSBpbnNlcnRpb24gb2Ygc2luZ2xlIGtleXMgZ2l2ZW4KKwkgIHdpdGggYW4gYXJndW1lbnQgbXVjaCBtb3JlIGVmZmljaWVudC4KKworVHVlIEF1ZyAgOCAxODoxMzo1NyAxOTg5ICBCcmlhbiBGb3ggIChiZm94IGF0IGF1cmVsKQorCisJKiByZWFkbGluZS5jOiBDaGFuZ2VkIGhhbmRsaW5nIG9mIEVPRi4gIHJlYWRsaW5lICgpIHJldHVybnMKKwkgKGNoYXIgKilFT0Ygb3IgY29uc2VkIHN0cmluZy4gIFRoZSBFT0YgY2hhcmFjdGVyIGlzIHJlYWQgZnJvbSB0aGUKKwkgdHR5LCBvciBpZiB0aGUgdHR5IGRvZXNuJ3QgaGF2ZSBvbmUsIGRlZmF1bHRzIHRvIEMtZC4KKworCSogcmVhZGxpbmUuYzogQWRkZWQgc3VwcG9ydCBmb3IgZXZlbnQgZHJpdmVuIHByb2dyYW1zLgorCSAgcmxfZXZlbnRfaG9vayBpcyB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIHlvdSB3YW50IGNhbGxlZAorCSAgd2hpbGUgUmVhZGxpbmUgaXMgd2FpdGluZyBmb3IgaW5wdXQuCisKKwkqIHJlYWRsaW5lLmM6IENsZWFudXAgdGltZS4gIEZ1bmN0aW9ucyB3aXRob3V0IHR5cGUgZGVjbGFyYXRpb25zCisJICBkbyBub3QgdXNlIHJldHVybiB3aXRoIGEgdmFsdWUuCisKKwkqIGhpc3RvcnkuYzogaGlzdG9yeV9leHBhbmQgKCkgaGFzIG5ldyB2YXJpYWJsZSB3aGljaCBpcyB0aGUKKwkgIGNoYXJhY3RlcnMgdG8gaWdub3JlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBoaXN0b3J5X2V4cGFuc2lvbl9jaGFyLgorCitTdW4gSnVsIDE2IDA4OjE0OjAwIDE5ODkgIEJyaWFuIEZveCAgKGJmb3ggYXQgYXVyZWwpCisKKwkqIHJsX3ByZXBfdGVybWluYWwgKCkKKwkgIEJTRCB2ZXJzaW9uIHR1cm5zIG9mZiBDLXMsIEMtcSwgQy15LCBDLXYuCisKKwkqIHJlYWRsaW5lLmMgLS0gcmxfcHJlcF90ZXJtaW5hbCAoKQorCSAgU1lTViB2ZXJzaW9uIGhhY2tzIHJlYWRsaW5lX2VjaG9pbmdfcC4KKwkgIEJTRCB2ZXJzaW9uIHR1cm5zIG9uIHBhc3Npbmcgb2YgdGhlIDh0aCBiaXQgZm9yIHRoZSBkdXJhdGlvbgorCSAgb2YgcmVhZGluZyB0aGUgbGluZS4KKworVHVlIEp1bCAxMSAwNjoyNTowMSAxOTg5ICBCcmlhbiBGb3ggIChiZm94IGF0IGF1cmVsKQorCisJKiByZWFkbGluZS5jOiBuZXcgdmFyaWFibGUgcmxfdGlsZGVfZXhwYW5kZXIuCisJICBJZiBub24tbnVsbCwgdGhpcyBjb250YWlucyB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIHRvIGNhbGwgaWYKKwkgIHRoZSBzdGFuZGFyZCBtZWFuaW5nIGZvciBleHBhbmRpbmcgYSB0aWxkZSBmYWlscy4gIFRoZSBmdW5jdGlvbiBpcworCSAgY2FsbGVkIHdpdGggdGhlIHRleHQgc2FucyB0aWxkZSAoYXMgaW4gImZvbyIpLCBhbmQgcmV0dXJucyBhCisJICBtYWxsb2MoKSdlZCBzdHJpbmcgd2hpY2ggaXMgdGhlIGV4cGFuc2lvbiwgb3IgYSBOVUxMIHBvaW50ZXIgaWYKKwkgIHRoZXJlIGlzIG5vIGV4cGFuc2lvbi4gCisKKwkqIHJlYWRsaW5lLmggLSBuZXcgZmlsZSBjaGFyZGVmcy5oCisJICBTZXBhcmF0ZXMgdGhpbmdzIHRoYXQgb25seSByZWFkbGluZS5jIG5lZWRzIGZyb20gdGhlIHN0YW5kYXJkCisJICBoZWFkZXIgZmlsZSBwdWJsaXNoaW5nIGludGVyZXN0aW5nIHRoaW5ncyBhYm91dCByZWFkbGluZS4KKworCSogcmVhZGxpbmUuYzoKKwkgIHJlYWRsaW5lX2RlZmF1bHRfYmluZGluZ3MgKCkgbm93IGxvb2tzIGF0IHRlcm1pbmFsIGNoYXJhcmFjdGVycworCSAgYW5kIGJpbmRzIHRob3NlIGFzIHdlbGwuCisKK1dlZCBKdW4gMjggMjA6MjA6NTEgMTk4OSAgQnJpYW4gRm94ICAoYmZveCBhdCBhdXJlbCkKKworCSogTWFkZSByZWFkbGluZSBhbmQgaGlzdG9yeSBpbnRvIGluZGVwZW5kZW50IGxpYnJhcmllcy4KKwpkaWZmIC0tZ2l0IGEvcmVhZGxpbmUvTUFOSUZFU1QuZG9jIGIvcmVhZGxpbmUvTUFOSUZFU1QuZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjdjYjMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFkbGluZS9NQU5JRkVTVC5kb2MKQEAgLTAsMCArMSwxNiBAQAorIworIyBNYXN0ZXIgTWFuaWZlc3QgZmlsZSBmb3IgZG9jdW1lbnRhdGlvbi1vbmx5IGRpc3RyaWJ1dGlvbgorIworZG9jCWQKK01BTklGRVNULmRvYwlmCitkb2MvcmVhZGxpbmUucHMJZgorZG9jL2hpc3RvcnkucHMJZgorZG9jL3JlYWRsaW5lLmR2aQlmCitkb2MvaGlzdG9yeS5kdmkJZgorZG9jL3JlYWRsaW5lLmluZm8JZgorZG9jL2hpc3RvcnkuaW5mbwlmCitkb2MvcmVhZGxpbmUuaHRtbAlmCitkb2MvcmVhZGxpbmVfdG9jLmh0bWwJZgorZG9jL2hpc3RvcnkuaHRtbAlmCitkb2MvaGlzdG9yeV90b2MuaHRtbAlmCitkb2MvcmVhZGxpbmUuMAlmCmRpZmYgLS1naXQgYS9yZWFkbGluZS9jb25maWcuaC5ib3QgYi9yZWFkbGluZS9jb25maWcuaC5ib3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdhNmRjNAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWRsaW5lL2NvbmZpZy5oLmJvdApAQCAtMCwwICsxLDIyIEBACisvKiBjb25maWcuaC5ib3QgKi8KKy8qIG1vZGlmeSBzZXR0aW5ncyBvciBtYWtlIG5ldyBvbmVzIGJhc2VkIG9uIHdoYXQgYXV0b2NvbmYgdGVsbHMgdXMuICovCisKKy8qIFVsdHJpeCBib3RjaGVzIHR5cGUtYWhlYWQgd2hlbiBzd2l0Y2hpbmcgZnJvbSBjYW5vbmljYWwgdG8KKyAgIG5vbi1jYW5vbmljYWwgbW9kZSwgYXQgbGVhc3QgdGhyb3VnaCB2ZXJzaW9uIDQuMyAqLworI2lmICFkZWZpbmVkIChIQVZFX1RFUk1JT1NfSCkgfHwgIWRlZmluZWQgKEhBVkVfVENHRVRBVFRSKSB8fCBkZWZpbmVkICh1bHRyaXgpCisjICBkZWZpbmUgVEVSTUlPU19NSVNTSU5HCisjZW5kaWYKKworI2lmIGRlZmluZWQgKFNUUkNPTExfQlJPS0VOKQorIyAgdW5kZWYgSEFWRV9TVFJDT0xMCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBkZWZpbmVkIChIQVZFX1NUREFSR19IKQorIyAgZGVmaW5lIFBSRUZFUl9TVERBUkcKKyMgIGRlZmluZSBVU0VfVkFSQVJHUworI2Vsc2UKKyMgIGlmIGRlZmluZWQgKEhBVkVfVkFSQVJHU19IKQorIyAgICBkZWZpbmUgUFJFRkVSX1ZBUkFSR1MKKyMgICAgZGVmaW5lIFVTRV9WQVJBUkdTCisjICBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9yZWFkbGluZS9jcm9zcy1idWlsZC9jeWd3aW4uY2FjaGUgYi9yZWFkbGluZS9jcm9zcy1idWlsZC9jeWd3aW4uY2FjaGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZiMDc1OQotLS0gL2Rldi9udWxsCisrKyBiL3JlYWRsaW5lL2Nyb3NzLWJ1aWxkL2N5Z3dpbi5jYWNoZQpAQCAtMCwwICsxLDQ1IEBACisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgZm9yIENZR1dJTjMyIHNvIHRoZXkgZG9uJ3QgbmVlZCB0byBiZSBkb25lIHdoZW4gY3Jvc3MtY29tcGlsaW5nLgorCisjIEFDX0ZVTkNfR0VUUEdSUCBzaG91bGQgYWxzbyBkZWZpbmUgR0VUUEdSUF9WT0lECithY19jdl9mdW5jX2dldHBncnBfdm9pZD0ke2FjX2N2X2Z1bmNfZ2V0cGdycF92b2lkPSd5ZXMnfQorIyBBQ19GVU5DX1NFVFZCVUZfUkVWRVJTRUQgc2hvdWxkIG5vdCBkZWZpbmUgYW55dGhpbmcgZWxzZQorYWNfY3ZfZnVuY19zZXR2YnVmX3JldmVyc2VkPSR7YWNfY3ZfZnVuY19zZXR2YnVmX3JldmVyc2VkPSdubyd9CisjIG9uIENZR1dJTjMyLCBzeXN0ZW0gY2FsbHMgZG8gbm90IHJlc3RhcnQKK2FjX2N2X3N5c19yZXN0YXJ0YWJsZV9zeXNjYWxscz0ke2FjX2N2X3N5c19yZXN0YXJ0YWJsZV9zeXNjYWxscz0nbm8nfQorYmFzaF9jdl9zeXNfcmVzdGFydGFibGVfc3lzY2FsbHM9JHtiYXNoX2N2X3N5c19yZXN0YXJ0YWJsZV9zeXNjYWxscz0nbm8nfQorCisjIHRoZXNlIG1heSBiZSBuZWNlc3NhcnksIGJ1dCB0aGV5IGFyZSBjdXJyZW50bHkgY29tbWVudGVkIG91dAorI2FjX2N2X2NfYmlnZW5kaWFuPSR7YWNfY3ZfY19iaWdlbmRpYW49J25vJ30KK2FjX2N2X3NpemVvZl9jaGFyX3A9JHthY19jdl9zaXplb2ZfY2hhcl9wPSc0J30KK2FjX2N2X3NpemVvZl9pbnQ9JHthY19jdl9zaXplb2ZfaW50PSc0J30KK2FjX2N2X3NpemVvZl9sb25nPSR7YWNfY3Zfc2l6ZW9mX2xvbmc9JzQnfQorCitiYXNoX2N2X2R1cDJfYnJva2VuPSR7YmFzaF9jdl9kdXAyX2Jyb2tlbj0nbm8nfQorYmFzaF9jdl9wZ3JwX3BpcGU9JHtiYXNoX2N2X3BncnBfcGlwZT0nbm8nfQorYmFzaF9jdl90eXBlX3JsaW1pdD0ke2Jhc2hfY3ZfdHlwZV9ybGltaXQ9J2xvbmcnfQorYmFzaF9jdl9kZWNsX3VuZGVyX3N5c19zaWdsaXN0PSR7YmFzaF9jdl9kZWNsX3VuZGVyX3N5c19zaWdsaXN0PSdubyd9CitiYXNoX2N2X3VuZGVyX3N5c19zaWdsaXN0PSR7YmFzaF9jdl91bmRlcl9zeXNfc2lnbGlzdD0nbm8nfQorYmFzaF9jdl9zeXNfc2lnbGlzdD0ke2Jhc2hfY3Zfc3lzX3NpZ2xpc3Q9J25vJ30KK2Jhc2hfY3Zfb3BlbmRpcl9ub3Rfcm9idXN0PSR7YmFzaF9jdl9vcGVuZGlyX25vdF9yb2J1c3Q9J25vJ30KK2Jhc2hfY3ZfZ2V0ZW52X3JlZGVmPSR7YmFzaF9jdl9nZXRlbnZfcmVkZWY9J3llcyd9CitiYXNoX2N2X3ByaW50Zl9kZWNsYXJlZD0ke2Jhc2hfY3ZfcHJpbnRmX2RlY2xhcmVkPSd5ZXMnfQorYmFzaF9jdl91bGltaXRfbWF4ZmRzPSR7YmFzaF9jdl91bGltaXRfbWF4ZmRzPSdubyd9CitiYXNoX2N2X2dldGN3ZF9jYWxsc19wb3Blbj0ke2Jhc2hfY3ZfZ2V0Y3dkX2NhbGxzX3BvcGVuPSdubyd9CitiYXNoX2N2X211c3RfcmVpbnN0YWxsX3NpZ2hhbmRsZXJzPSR7YmFzaF9jdl9tdXN0X3JlaW5zdGFsbF9zaWdoYW5kbGVycz0nbm8nfQorYmFzaF9jdl9qb2JfY29udHJvbF9taXNzaW5nPSR7YmFzaF9jdl9qb2JfY29udHJvbF9taXNzaW5nPSdwcmVzZW50J30KK2Jhc2hfY3Zfc3lzX25hbWVkX3BpcGVzPSR7YmFzaF9jdl9zeXNfbmFtZWRfcGlwZXM9J21pc3NpbmcnfQorYmFzaF9jdl9mdW5jX3NpZ3NldGptcD0ke2Jhc2hfY3ZfZnVuY19zaWdzZXRqbXA9J3ByZXNlbnQnfQorYmFzaF9jdl9tYWlsX2Rpcj0ke2Jhc2hfY3ZfbWFpbF9kaXI9J3Vua25vd24nfQorYmFzaF9jdl9mdW5jX3N0cmNvbGxfYnJva2VuPSR7YmFzaF9jdl9mdW5jX3N0cmNvbGxfYnJva2VuPSdubyd9CisKK2Jhc2hfY3ZfdHlwZV9pbnQzMl90PSR7YmFzaF9jdl90eXBlX2ludDMyX3Q9J2ludCd9CitiYXNoX2N2X3R5cGVfdV9pbnQzMl90PSR7YmFzaF9jdl90eXBlX3VfaW50MzJfdD0naW50J30KK2FjX2N2X2hlYWRlcl90ZXJtY2FwX2g9JHthY19jdl9oZWFkZXJfdGVybWNhcF9oPSd5ZXMnfQorYWNfY3ZfaGVhZGVyX3Rlcm1pb3NfaD0ke2FjX2N2X2hlYWRlcl90ZXJtaW9zX2g9J3llcyd9CitiYXNoX2N2X3Rlcm1jYXBfbGliPSR7YmFzaF9jdl90ZXJtY2FwX2xpYj0nLWx0ZXJtY2FwJ30KKworYmFzaF9jdl90aW9jZ3dpbnN6X2luX2lvY3RsPSR7YmFzaF9jdl90aW9jZ3dpbnN6X2luX2lvY3RsPSd5ZXMnfQorYWNfY3ZfbGliX3Rlcm1jYXBfdGdldGVudD0ke2FjX2N2X2xpYl90ZXJtY2FwX3RnZXRlbnQ9J3llcyd9CisKKyMgZW5kIG9mIGNyb3NzLWJ1aWxkL2N5Z3dpbjMyLmNhY2hlCmRpZmYgLS1naXQgYS9yZWFkbGluZS9kb2MvQ2hhbmdlTG9nIGIvcmVhZGxpbmUvZG9jL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDQ5YzVlCi0tLSAvZGV2L251bGwKKysrIGIvcmVhZGxpbmUvZG9jL0NoYW5nZUxvZwpAQCAtMCwwICsxLDI5IEBACitUdWUgRGVjIDIyIDEwOjA3OjU4IDE5OTggIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KKworCSogaHN1c2VyLnRleGluZm8gKEJhc2ggSGlzdG9yeSBCdWlsdGlucyk6IGNvbW1lbnQgb3V0IGJ0aW5kZXgKKwljb21tYW5kcy4KKworCSogSW1wb3J0IG9mIFJlYWRsaW5lIDIuMi4xLgorCQorCU5ldyBmaWxlczogcmVhZGxpbmUuMCwgcmVhZGxpbmUuMywgdGV4aTJkdmksIHRleGkyaHRtbC4KKworMTk5OC0xMi0xNyAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgorCisJKiBpbmMtaGlzdC50ZXhpOiBAbm9kZSBsaW5lICJVc2luZyBIaXN0b3J5IiB3YXMgd3JvbmcuCisKK1RodSBKdWwgIDkgMTc6MDM6MjYgMTk5OCAgRWRpdGggRXBzdGVpbiAgPGVlcHN0ZWluQHNvcGhpYS5jeWdudXMuY29tPgorCisJKiBpbmMtaGlzdC50ZXhpOiBvbmUgbGluZSBjaGFuZ2UuCisKK1dlZCBTZXAgMjAgMTI6NTc6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyBzeW5vbnltIGZvciByZWFsY2xlYW4uCisKK1R1ZSBGZWIgIDIgMTE6NDA6MDQgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IGNvbmZpZ3VyYWJsZSAoYW5kIHVzZWFibGUpIE1ha2VmaWxlIHRlbXBsYXRlCisgICAgICAgICogTWFrZWZpbGU6IHJlbW92ZWQsIHJlcGxhY2VkIHdpdGggY29uZmlndXJhYmxlIE1ha2VmaWxlLmluCisgICAgICAgICogdGV4aW5kZXguYyB0ZXhpbmZvLnRleDogcmVtb3ZlLCByZXBsYWNpbmcgdy9yZWZzIHRvIHRvb2xzCisJZWxzZXdoZXJlIGluIGRpc3RyaWJ1dGlvbiB0cmVlCisgICAgICAgICogY29uZmlndXJlLmluOiBwcm8gZm9ybWEgY29uZmlndXJlIHN0dWIKKwkqIENoYW5nZUxvZzogbmV3IGZpbGUKZGlmZiAtLWdpdCBhL3JlYWRsaW5lL2RvYy9pbmMtaGlzdC50ZXhpIGIvcmVhZGxpbmUvZG9jL2luYy1oaXN0LnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkZGU0MAotLS0gL2Rldi9udWxsCisrKyBiL3JlYWRsaW5lL2RvYy9pbmMtaGlzdC50ZXhpCkBAIC0wLDAgKzEsMTU5IEBACitAaWdub3JlCitUaGlzIGZpbGUgaXMgY29tcGxldGVseSBpZGVudGljYWwgdG8gaHN1c2VyLnRleGluZm8sIGV4Y2VwdCB0aGF0IGl0IGhhcyB0aGUKK3JlZmVyZW5jZSB0byB0aGUgcHJvZ3JhbW1pbmcgbWFudWFsIHJlbW92ZWQuICBUaGVyZSBhcmUgZGVmaW5hdGVseSBiZXR0ZXIgd2F5cwordG8gZG8gdGhpcyEKKworVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgdXNlciBpbnRlcmZhY2UgdG8gdGhlIEdOVSBIaXN0b3J5IGxpYnJhcnkuCisKK0NvcHlyaWdodCAoQykgMTk4OCwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0F1dGhvcmVkIGJ5IEJyaWFuIEZveC4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoaXMgbWFudWFsCitwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcmUgcHJlc2VydmVkIG9uCithbGwgY29waWVzLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZXggYW5kIHByaW50IHRoZQorcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24gbm90aWNlCitpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaCAodGhpcworcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdCB0aGUKK0dOVSBDb3B5cmlnaHQgc3RhdGVtZW50IGlzIGF2YWlsYWJsZSB0byB0aGUgZGlzdHJpYnV0ZWUsIGFuZCBwcm92aWRlZCB0aGF0Cit0aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKK3Blcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCitpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KK0BlbmQgaWdub3JlCisKK0Bub2RlIFVzaW5nIEhpc3RvcnkgSW50ZXJhY3RpdmVseQorQGFwcGVuZGl4IFVzaW5nIEhpc3RvcnkgSW50ZXJhY3RpdmVseQorCitUaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIGhvdyB0byB1c2UgdGhlIEdOVSBIaXN0b3J5IExpYnJhcnkgaW50ZXJhY3RpdmVseSwKK2Zyb20gYSB1c2VyJ3Mgc3RhbmRwb2ludC4KKworQG1lbnUKKyogSGlzdG9yeSBJbnRlcmFjdGlvbjo6CQlXaGF0IGl0IGZlZWxzIGxpa2UgdXNpbmcgSGlzdG9yeSBhcyBhIHVzZXIuCitAZW5kIG1lbnUKKworQG5vZGUgSGlzdG9yeSBJbnRlcmFjdGlvbgorQHNlY3Rpb24gSGlzdG9yeSBJbnRlcmFjdGlvbgorQGNpbmRleCBleHBhbnNpb24KKworVGhlIEhpc3RvcnkgbGlicmFyeSBwcm92aWRlcyBhIGhpc3RvcnkgZXhwYW5zaW9uIGZlYXR1cmUgc2ltaWxhcgordG8gdGhlIGhpc3RvcnkgZXhwYW5zaW9uIGluIEBjb2Rle2NzaH0uICBUaGUgZm9sbG93aW5nIHRleHQgZGVzY3JpYmVzIHRoZSAKK3N5bnRheCB5b3UgdXNlIHRvIG1hbmlwdWxhdGUgaGlzdG9yeSBpbmZvcm1hdGlvbi4KKworSGlzdG9yeSBleHBhbnNpb24gdGFrZXMgdHdvIHBhcnRzLiAgSW4gdGhlIGZpcnN0IHBhcnQsIGRldGVybWluZQord2hpY2ggbGluZSBmcm9tIHRoZSBwcmV2aW91cyBoaXN0b3J5IHdpbGwgYmUgdXNlZCBmb3Igc3Vic3RpdHV0aW9uLgorVGhpcyBsaW5lIGlzIGNhbGxlZCB0aGUgQGRmbntldmVudH0uCitJbiB0aGUgc2Vjb25kIHBhcnQsIHNlbGVjdCBwb3J0aW9ucyBvZiB0aGF0IGxpbmUgZm9yIGluY2x1c2lvbiBpbnRvIHRoZQorY3VycmVudCBsaW5lLiAgVGhlc2UgcG9ydGlvbnMgYXJlIGNhbGxlZCBAZGZue3dvcmRzfS4gIAorQHZhbHVle0dEQk59IGJyZWFrcyB0aGUgbGluZSBpbnRvIHdvcmRzIGluIHRoZSBzYW1lIAord2F5IHRoYXQgdGhlIEJhc2ggc2hlbGwgZG9lcywgc28gdGhhdCBzZXZlcmFsIEVuZ2xpc2ggKG9yIFVuaXgpIHdvcmRzCitzdXJyb3VuZGVkIGJ5IHF1b3RlcyBhcmUgY29uc2lkZXJlZCBvbmUgd29yZC4KKworQG1lbnUKKyogRXZlbnQgRGVzaWduYXRvcnM6OglIb3cgdG8gc3BlY2lmeSB3aGljaCBoaXN0b3J5IGxpbmUgdG8gdXNlLgorKiBXb3JkIERlc2lnbmF0b3JzOjoJU3BlY2lmeWluZyB3aGljaCB3b3JkcyBhcmUgb2YgaW50ZXJlc3QuCisqIE1vZGlmaWVyczo6CQlNb2RpZnlpbmcgdGhlIHJlc3VsdHMgb2Ygc3VzYnN0aXR1dGlvbi4KK0BlbmQgbWVudQorCitAbm9kZSBFdmVudCBEZXNpZ25hdG9ycworQHN1YnNlY3Rpb24gRXZlbnQgRGVzaWduYXRvcnMKK0BjaW5kZXggZXZlbnQgZGVzaWduYXRvcnMKKworQW4gQGRmbntldmVudCBkZXNpZ25hdG9yfSBpcyBhIHJlZmVyZW5jZSB0byBhIGNvbW1hbmQgbGluZSBlbnRyeSBpbiB0aGUKK2hpc3RvcnkgbGlzdC4KKworQHRhYmxlIEBhc2lzCisKK0BpdGVtIEBjb2RleyF9CitTdGFydCBhIGhpc3Rvcnkgc3Vic2l0aXR1dGlvbiwgZXhjZXB0IHdoZW4gZm9sbG93ZWQgYnkgYSBzcGFjZSwgdGFiLCBvcgordGhlIGVuZCBvZiB0aGUgbGluZS4uLiBAa2V5ez19IG9yIEBrZXl7KH0uCisKK0BpdGVtIEBjb2RleyEhfQorUmVmZXIgdG8gdGhlIHByZXZpb3VzIGNvbW1hbmQuICBUaGlzIGlzIGEgc3lub255bSBmb3IgQGNvZGV7IS0xfS4KKworQGl0ZW0gQGNvZGV7IW59CitSZWZlciB0byBjb21tYW5kIGxpbmUgQHZhcntufS4KKworQGl0ZW0gQGNvZGV7IS1ufQorUmVmZXIgdG8gdGhlIGNvbW1hbmQgbGluZSBAdmFye259IGxpbmVzIGJhY2suCisKK0BpdGVtIEBjb2RleyFzdHJpbmd9CitSZWZlciB0byB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCBzdGFydGluZyB3aXRoIEB2YXJ7c3RyaW5nfS4KKworQGl0ZW0gQGNvZGV7IT9zdHJpbmd9W0Bjb2Rlez99XQorUmVmZXIgdG8gdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQgY29udGFpbmluZyBAdmFye3N0cmluZ30uCisKK0BlbmQgdGFibGUKKworQG5vZGUgV29yZCBEZXNpZ25hdG9ycworQHN1YnNlY3Rpb24gV29yZCBEZXNpZ25hdG9ycworCitBIEBrZXl7On0gc2VwYXJhdGVzIHRoZSBldmVudCBkZXNpZ25hdG9yIGZyb20gdGhlIEBkZm57d29yZCBkZXNpZ25hdG9yfS4gIAorSXQgY2FuIGJlIG9taXR0ZWQgaWYgdGhlIHdvcmQgZGVzaWduYXRvciBiZWdpbnMgd2l0aCBhIEBrZXl7Xn0sIEBrZXl7JH0sCitAa2V5eyp9IG9yIEBrZXl7JX0uICBXb3JkcyBhcmUgbnVtYmVyZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLAord2l0aCB0aGUgZmlyc3Qgd29yZCBiZWluZyBkZW5vdGVkIGJ5IGEgMCAoemVybykuCisKK0B0YWJsZSBAY29kZQorCitAaXRlbSAwICh6ZXJvKQorVGhlIHplcm8ndGggd29yZC4gIEZvciBtYW55IGFwcGxpY2F0aW9ucywgdGhpcyBpcyB0aGUgY29tbWFuZCB3b3JkLgorCitAaXRlbSBuCitUaGUgQHZhcntufSd0aCB3b3JkLgorCitAaXRlbSBeCitUaGUgZmlyc3QgYXJndW1lbnQuICB0aGF0IGlzLCB3b3JkIDEuCisKK0BpdGVtICQKK1RoZSBsYXN0IGFyZ3VtZW50LgorCitAaXRlbSAlCitUaGUgd29yZCBtYXRjaGVkIGJ5IHRoZSBtb3N0IHJlY2VudCBAY29kZXs/c3RyaW5nP30gc2VhcmNoLgorCitAaXRlbSB4LXkKK0EgcmFuZ2Ugb2Ygd29yZHM7IEBjb2Rley1AdmFye3l9fSBBYmJyZXZpYXRlcyBAY29kZXswLUB2YXJ7eX19LgorCitAaXRlbSAqCitBbGwgb2YgdGhlIHdvcmRzLCBleGNlcHRpbmcgdGhlIHplcm8ndGguICBUaGlzIGlzIGEgc3lub255bSBmb3IgQGNvZGV7MS0kfS4KK0l0IGlzIG5vdCBhbiBlcnJvciB0byB1c2UgQGtleXsqfSBpZiB0aGVyZSBpcyBqdXN0IG9uZSB3b3JkIGluIHRoZSBldmVudC4KK1RoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgaW4gdGhhdCBjYXNlLgorCitAZW5kIHRhYmxlCisKK0Bub2RlIE1vZGlmaWVycworQHN1YnNlY3Rpb24gTW9kaWZpZXJzCisKK0FmdGVyIHRoZSBvcHRpb25hbCB3b3JkIGRlc2lnbmF0b3IsIHlvdSBjYW4gYWRkIGEgc2VxdWVuY2Ugb2Ygb25lIG9yIG1vcmUKK29mIHRoZSBmb2xsb3dpbmcgQGRmbnttb2RpZmllcnN9LCBlYWNoIHByZWNlZGVkIGJ5IGEgQGtleXs6fS4KKworQHRhYmxlIEBjb2RlCisKK0BpdGVtICMKK1RoZSBlbnRpcmUgY29tbWFuZCBsaW5lIHR5cGVkIHNvIGZhci4gIFRoaXMgbWVhbnMgdGhlIGN1cnJlbnQgY29tbWFuZCwKK25vdCB0aGUgcHJldmlvdXMgY29tbWFuZC4KK0BjCitAYyAgRklYTUU6ICBJZiBpdCBkb2Vzbid0IGJlbG9uZyBoZXJlLCBsZXQncyBwdXQgaXQgd2hlcmUgaXQgZG9lcy4gCitAYworQGMgIHNvIGl0IHRlY2huaWNhbGx5IGlzbid0IGEgd29yZCBkZXNpZ25hdG9yIGFuZCBkb2Vzbid0IGJlbG9uZyBpbiAKK0BjICB0aGlzIHNlY3Rpb24uCisKK0BpdGVtIGgKK1JlbW92ZSBhIHRyYWlsaW5nIHBhdGhuYW1lIGNvbXBvbmVudCwgbGVhdmluZyBvbmx5IHRoZSBoZWFkLgorCitAaXRlbSByCitSZW1vdmUgYSB0cmFpbGluZyBzdWZmaXggb2YgdGhlIGZvcm0gQHNhbXB7Ln1AdmFye3N1ZmZpeH0sIGxlYXZpbmcgdGhlIGJhc2VuYW1lLgorCitAaXRlbSBlCitSZW1vdmUgYWxsIGJ1dCB0aGUgc3VmZml4LgorCitAaXRlbSB0CitSZW1vdmUgYWxsIGxlYWRpbmcgIHBhdGhuYW1lICBjb21wb25lbnRzLCBsZWF2aW5nIHRoZSB0YWlsLgorCitAaXRlbSBwCitQcmludCB0aGUgbmV3IGNvbW1hbmQgYnV0IGRvIG5vdCBleGVjdXRlIGl0LgorQGVuZCB0YWJsZQpkaWZmIC0tZ2l0IGEvc2ltL0NoYW5nZUxvZyBiL3NpbS9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczNzA5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9DaGFuZ2VMb2cKQEAgLTAsMCArMSw0NjEgQEAKKzE5OTktMDMtMTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MsIFRBUkdFVF9GTEFHU19UT19QQVNTKTogUmVtb3ZlCisgCVJVTlRFU1QgaW5zdGVhZCBvZiBjb21tZW50aW5nIG91dCwgZml4ZXMgcG9ydGFiaWxpdHkgcHJvYmxlbS4KKworMTk5OS0wMi0xMCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHNwYXJjKik6IENvbmZpZ3VyZSBzcGFyYyBzdWJkaXIgaWYgLS13aXRoLWNnZW4gb3IKKwktLXdpdGgtY2dlbi1zaW0uCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKKzE5OTktMDItMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIFN0cm9uZ0FSTSB0YXJnZXQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKzE5OTktMDItMDIgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChzcGFyYyopOiBDb25maWd1cmUgc3BhcmMgc3ViZGlyIGlmIC0td2l0aC1jZ2VuLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCisxOTk5LTAxLTA0ICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogUmVxdWlyZSBhdXRvY29uZiAyLjEyLjEgb3IgaGlnaGVyLgorCisxOTk4LTEyLTA4ICBKYW1lcyBFIFdpbHNvbiAgPHdpbHNvbkB3aWxzb24tcGMuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChpOTYwLSotKik6IEFkZC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworV2VkIE5vdiAgNCAxOToxMTo0MyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgY2FzZSBmb3IgZnIzMC0qLSouCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitGcmkgU2VwIDI1IDEwOjEyOjE5IDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+CisKKwkqIHBwYy9NYWtlZmlsZS5pbjogQWRkIEVYRUVYVCB0byBpbnN0YWxsZWQgcG93ZXJwYy1lYWJpLXJ1biBwcm9ncmFtCisJdG8gYWxsb3cgc3VjY2Vzc2Z1bCBvcGVyYXRpb24gb24gV2luZG93cy4KKworVGh1IE1heSAyOCAxNDo1OTo0NiAxOTk4IEppbGxpYW4gWWUgPGppbGxpYW5AY3lnbnVzLmNvbT4KKworICAgICAgICAqIE1ha2VmaWxlLmluOiBUYWtlIFJVTlRFU1Qgb3V0IG9mIEZMQUdfVE9fUEFTUworICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IG1ha2UgY2hlY2sgY2FuIGJlIGludm9rZWQgcmVjdXJzaXZlbHkuCisKK1dlZCBBcHIgMjkgMTI6Mzg6NTMgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEJ1aWxkIHNpbXVsYXRvciBvbiBzcGFyY2xpdGUgYW5kIHNwYXJjODZ4IHRhcmdldHMuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKK1N1biBBcHIgMjYgMTU6MjE6MDEgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYXV0b2NvbmYtY29tbW9uIGF1dG9oZWFkZXItY29tbW9uKTogRG9uJ3QgcGFzcyAtbAorCXRvIGF1dG9jb25mIGFuZCBhdXRvaGVhZGVyLgorCitGcmkgQXByIDI0IDExOjE0OjEzIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGF1dG9jb25mLWNvbW1vbiBhdXRvaGVhZGVyLWNvbW1vbik6IFBhc3MgYC1sCisJLi4vY29tbW9uJyB0byBhdXRvY29uZiBhbmQgYXV0b2hlYWRlci4gIFVuY29uZGl0aW9uYWxseSBydW4KKwlhdXRvY29uZiBpbiBldmVyeSBzdWJkaXIuCisJKGF1dG9jb25mLWNoYW5nZWxvZyBhdXRvaGVhZGVyLWNoYW5nZWxvZyk6IFVuY29uZGl0aW9uYWxseSBydW4KKwljb21tYW5kcyBpbiBldmVyeSBzdWJkaXIuCisJKGF1dG9jb25mLWluc3RhbGwgYXV0b2hlYWRlci1pbnN0YWxsKTogTGlrZXdpc2UuCisKK1R1ZSBNYXIgMjQgMTc6MTI6NDMgMTk5OCAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmh1bmEuY3lnbnVzLmNvLnVrPgorCisJKiBNYWtlZmlsZS5pbjogIEdldCBTSEVMTCBmcm9tIGNvbmZpZ3VyZS4KKwkqIChGTEFHU19UT19QQVNTKTogIFBhc3MgZG93biBTSEVMTC4KKwkqIGNvbmZpZ3VyZTogIFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjEyLjEgdG8gZml4IHNoZWxsIGlzc3VlcyBmb3IKKwlOVCBuYXRpdmUgYnVpbGRzLgorCitUdWUgTWFyIDI0IDExOjoxODowMCAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGV4dHJhX3N1YmRpcnMpOiBFbmFibGUgaWdlbiBmb3IgbW4xMDMwMC4KKwkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCisKK1R1ZSBEZWMgIDIgMTA6MTA6NDIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChleHRyYV9zdWJkaXJzKTogQWRkIHN1cHBvcnQgZm9yIHRodW1iIHRhcmdldC4KKworCSogY29uZmlndXJlIChleHRyYV9zdWJkaXJzKTogQWRkIHN1cHBvcnQgZm9yIHRodW1iIHRhcmdldC4KKworV2VkIE9jdCAgOCAxMjozODo0OCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoZXh0cmFfc3ViZGlycyk6IEFkZCBJR0VOIGRpcmVjdG9yeSB3aGVuIE1JUFMKKyAJdGFyZ2V0LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCQorRnJpIFNlcCAxMiAxMzoxMDozMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoZXh0cmFfc3ViZGlycyk6IHY4NTBlYSBuZWVkcyBpZ2VuLgorCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKwkKK01vbiBTZXAgIDEgMTY6NDg6MjMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHRlc3RkaXIpOiBXaGVuIGEgdGVzdHN1aXRlIGRpcmVjdG9yeSwgYWRkIHRoYXQgdG8KKyAJdGhlIGxpc3Qgb2YgY29uZmRpcnMuCisKK1R1ZSBBdWcgMTkgMTE6MTc6NDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGV4dHJhX3N1YmRpcnMpOiBFbmFibGUgaWdlbiByZWFkeSBmb3IgVjg1MC4KKworVHVlIEF1ZyAyNiAxNToxNDo0OCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAodzY1LSotKiwgb25seV9pZl9lbmFibGVkKTogU2V0LgorCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKwkKK01vbiBBdWcgMjUgMTY6MjY6NTMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHNwYXJjKi0qLSosIG9ubHlfaWZfZW5hYmxlZCk6IFNldAorIAlvbmx5X2lmX2VuYWJsZWQ9eWVzLiAgQ2hlY2sgb25seV9pZl9lbmFibGVkIGJlZm9yZSBlbmFibGluZyBhCisgCXNpbXVsYXRvci4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkKK01vbiBBdWcgMTggMTA6NTY6NTkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChleHRyYV9zdWJkaXJzKTogQWRkIHY4NTBlIHRhcmdldC4KKworTW9uIEF1ZyAxOCAxMDo1Njo1OSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKGV4dHJhX3N1YmRpcnMpOiBBZGQgdjg1MGVhIHRhcmdldC4KKworRnJpIEp1bCAyNSAxMTo0MDo0NyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHNwYXJjKi0qLSopOiBEb24ndCBidWlsZCBlcmMzMi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworVGh1IEFwciAyNCAwMDo0NzoyMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG0zMnItKi0qKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworCSogTWFrZWZpbGUuaW4gKGF1dG9jb25mLWNvbW1vbiwgYXV0b2NvbmYtY2hhbmdlbG9nKTogQ2hhbmdlICQqIHRvICRALgorCitNb24gQXByIDIxIDIyOjU3OjU1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKC5OT0VYUE9SVCwgTUFLRU9WRVJSSURFUyk6IE1vdmVkIHRvIGVuZCwgQlNEIG1ha2UKKyAJdGhvdWdodCB0aGF0IC5OT0VYUE9SVCB3YXMgdGhlIGRlZmF1bHQgdGFyZ2V0LgorCitGcmkgQXByIDExIDE3OjE4OjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGNsZWFuIG1vc3RseWNsZWFuKTogUmVzdG9yZSB0YXJnZXRzIGFjY2lkZW50YWxseQorCWRlbGV0ZWQgaW4gZWFybGllciBjaGFuZ2UuCisKK1RodSBBcHIgIDMgMTI6MjA6MzIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChhdXRvaGVhZGVyLWNvbW1vbiwgYXV0b2hlYWRlci1jaGFuZ2Vsb2csCisgCWF1dG9oZWFkZXItaW5zdGFsbCk6IFBlcmZvcm0gYXV0b2hlYWRlciBpbiBhZGRpdGlvbiB0byBhdXRvY29uZi4KKworV2VkIEFwciAgMiAxNTowOTowNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYXV0b2NvbmYtaW5zdGFsbCk6IE5ldyB0YXJnZXQuCisJKGF1dG9jb25mLWNoYW5nZWxvZyk6IFRyeSBkaWZmZXJlbnQgd2F5IHRvIG9idGFpbiB1c2VyIG5hbWUuCisKK1dlZCBBcHIgIDIgMTQ6MjU6NTIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChhdXRvY29uZi1jaGFuZ2Vsb2cpOiBOZXcgdGFyZ2V0LCB1cGRhdGUKKyAJQ2hhbmdlTG9nIGZvciBhbGwgc3ViZGlyZWN0b3JpZXMgLSBub3JtYWxseSB1c2VkIGFmdGVyCisgCWF1dG9jb25mLWNvbW1vbiB0YXJnZXQuCisKK1dlZCBNYXIgMTkgMTQ6MjY6MjEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoZXh0cmFfc3ViZGlycyk6IEluY2x1ZGUgdGVzdHN1aXRlIGZvciBkMzB2LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCQorCSogTWFrZWZpbGUuaW4gKFJVTlRFU1QsIFJVTlRFU1RGTEFHUyk6IEJvcnJvdyB0ZXN0IHJ1bGVzIGZyb20KKyAJLi4vZ2RiL01ha2VmaWxlLmluCisJKGNoZWNrKTogTmV3IHJ1bGVzIC0gZHJpdmUgdGhlIHRlc3RzdWl0ZS4KKworTW9uIE1hciAgMyAxMzowMTowMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIG1uMTAyMDAgY29uZmlndXJlIGxpbmVzIGFjY2lkZW50YWxseQorCXJlbW92ZWQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitXZWQgRmViIDE5IDEwOjM0OjIwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY3JpdHRlcnMuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChleHRyYV9zdWJkaXJzKTogR2VuZXJhbGl6ZSBjb21tb24gc3ViIGRpcmVjdG9yeQorIAlpbnRvIGEgbGlzdC4KKwkoZXh0cmFfc3ViZGlycyk6IEZvciBkMzB2IGFkZCBpZ2VuIHRvIHRoZSBsaXN0IHRvIGJlIGJ1aWx0LgorCitTdW4gRmViIDE2IDE2OjM3OjQ3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY3JpdHRlcnMuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChkMzB2KTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJCitXZWQgRmViIDE5IDIzOjE3OjEzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlLmluOiBEb24ndCByZXF1aXJlIEdDQyB0byBidWlsZCB0aGUgbW4xMDIwMAorCXNpbXVsYXRvciBhbnltb3JlLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCitXZWQgRmViICA1IDEzOjI4OjEzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY29uZmlndXJlIGFueSBzdWJkaXJzIGlmIG5vIHNpbXVsYXRvcgorCWlzIGJlaW5nIGJ1aWx0LiAgRG9uJ3QgdXNlIGVyYzMyIGZvciBzcGFyYzY0LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworVHVlIEZlYiAgNCAxMzoxOTozOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYXV0b2NvbmYtY29tbW9uKTogTmV3IHRhcmdldC4KKwkqIGNvbmZpZ3VyZS5pbjogRG8gY29uZmlndXJlIGNvbW1vbi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK1RodSBKYW4gMjMgMTM6NTk6NTIgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlIGNvbmZpZ3VyZS5pbjogIERvbid0IGNvbmZpZ3VyZSBjb21tb24gYW55bW9yZS4gIEZpbGVzCisJZnJvbSBjb21tb24gYXJlIG5vdyBidWlsdCBpbiB0aGUgaW5kaXZpZHVhbCBzaW11YWx0b3IgZGlyZWN0b3JpZXMuCisJVGhpcyBmaXhlcyBwcm9ibGVtcyB3aXRoIHRoZSBXaW5HREIgYnVpbGQgcHJvY2VkdXJlLgorCitNb24gSmFuIDEzIDEzOjE2OjQyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlOiBFbmFibGUgdGhlIG1uMTAyMDAgc2ltdWxhdG9yLgorCitXZWQgTm92IDIwIDAxOjAwOjM2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoY29uZmlnZGlycyk6IEFkZCBjb21tb24uCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitGcmkgTm92ICAxIDA4OjAzOjMwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChwb3dlcnBjKi0qLWxpbnV4Kik6IFRyZWF0IGxpa2UgdGhlIG90aGVyIHBvd2VycGMKKwlzeXN0ZW0gViBiYXNlZCB0YXJnZXRzLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCitUaHUgT2N0IDE3IDEyOjUwOjA4IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtc2ltLXBvd2VycGMpOiBEZWxldGUuCisJKC0tZW5hYmxlLXNpbSk6IEFkZC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK0ZyaSBPY3QgMTEgMjE6MTM6NDMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW46IE9ubHkgYnVpbGQgdGhlIFY4NTAgc2ltdWxhdG9yIGlmCisJd2UgYXJlIHVzaW5nIGdjYy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworU3VuIFNlcCAgOCAxNzoyMjo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG8gYnVpbGQgZXJjMzIgZm9yIERPUyBhbmQgV2luZG93cyBob3N0cy4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworV2VkIFNlcCAgNCAxODoxMToyNyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiBlcmMzMi9NYWtlZmlsZS5pbjogIERvbid0IHNldCBzcmNyb290LiAgVGhpcyBzaG91bGQKKwliZSBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50LiAgUmVtb3ZlIElOU1RBTExfWEZPUk0gYW5kCisJSU5TVEFMTF9YRk9STTEuICBNYWtlIElOU1RBTEwgYmUgc2V0IGZyb20gY29uZmlndXJlLgorCitXZWQgU2VwICA0IDE1OjQ5OjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBPbmx5IGJ1aWxkIHRoZSBNSVBTIHNpbXVsYXRvciBpZiB3ZSBhcmUgdXNpbmcKKwlnY2MuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1dlZCBBdWcgMjggMTk6MDU6MjMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBjb25maWd1cmUuaW4gKHY4NTAtKi0qKTogQWRkZWQgVjg1MCBzaW11bGF0b3IuCisKK1RodSBBdWcgIDEgMTc6MDg6NDEgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoZDEwdi0qLSopOiBBZGRlZCBEMTBWIHNpbXVsYXRvci4KKworV2VkIEp1biAyNiAxMjozMzo1NyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQorCisJKiBNYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgaW5jbHVkZWRpciwKKwlJTlNUQUxMX1BST0dSQU0sIElOU1RBTExfREFUQSk6IFVzZSBhdXRvY29uZi1zZXQgdmFsdWVzLgorCShkb2NkaXIpOiBSZW1vdmVkLgorCSogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBhdXRvY29uZiAyLjUgb3IgaGlnaGVyLgorCShBQ19QUk9HX0lOU1RBTEwpOiBBZGRlZC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworTW9uIEp1biAyNCAxNDoxODoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogT25seSBjb25maWd1cmUgZXJjMzIgaWYgdXNpbmcgZ2NjLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCitUdWUgSnVuICA0IDA5OjI0OjIxIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChzaW1fdGFyZ2V0KTogQnVpbGQgUG93ZXJQQyBzaW11bGF0b3IgZm9yIHBvd2VycGMKKwlTeXN0ZW0gVi40LCBTb2xhcmlzLCBhbmQgRWxmIHRhcmdldHMuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjEwLgorCitXZWQgTWF5IDIyIDEyOjEwOjQ5IDE5OTYgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsPgorCisJKiBjb25maWd1cmUuaW46IE9ubHkgYnVpbHQgZXJjMzIgc2ltdWxhdG9yIG9uIFVuaXggaG9zdHMgYXMgaXQKKwl1c2VzIHBzZXVkbyB0dHlzLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuOC4KKworU3VuIE1heSAxOSAyMDoyMDo0MCAxOTk2ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgorCisJKiBlcmMzMjogU3BhcmMgc2ltdWxhdG9yIGZyb20gdGhlIEVTQS4KKworU3VuIEFwciAgNyAyMTowMDowOSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCUZyb206IE1pbGVzIEJhZGVyICA8bWlsZXNAZ251LmFpLm1pdC5lZHU+CisJKiBjb25maWd1cmUuaW46IFVzZSBBQ19DSEVDS19UT09MIHRvIGZpbmQgQVIgJiBSQU5MSUIuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgdXNpbmcgYXV0b2NvbmYuCisKK1RodSBGZWIgMjIgMTE6MzE6NTAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEZpeCB0eXBvLgorCitXZWQgRmViIDIxIDExOjU5OjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi43LgorCisJKiBNYWtlZmlsZS5pbiAoYWxsKTogU2ltcGxpZnkuCisJKGNsZWFuLCBtb3N0bHljbGVhbik6IFNVQkRJUlMgbWF5IGNvbnRhaW4gd2hpdGVzcGFjZTsgZml4IHRoZSBsb29wCisJYXMgaW4gdGhlIGFsbCB0YXJnZXQuCisJKGRpc3RjbGVhbiwgbWFpbnRhaW5lci1jbGVhbiwgcmVhbGNsZWFuKTogTGlrZXdpc2UuCisJKGluc3RhbGwpOiBMaWtld2lzZS4KKworVGh1IEZlYiAxNSAxODozNzowMCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGFsbCk6IFJlbW92ZSBleHRyYSAnXCcgY2hhciBmcm9tIHNoZWxsIHNjcmlwdC4KKworV2VkIEZlYiAxNCAxNjo0Mzo1OSAxOTk2ICBNaWtlIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChhbGwpOiBBdm9pZCBhIGZvciBsb29wIHdpdGggemVybyBlbGVtZW50cywgZXZlbiBpZgorCXRoZSBsb29wIHdpbGwgbm90IGJlIGV4ZWN1dGVkIGJlY2F1c2Ugb2YgYW4gaWYgc3RhdGVtZW50LgorCitXZWQgSmFuIDMxIDIxOjQ4OjM0IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEFkZCBtaXNzaW5nIHNlbWljb2xvbiBpbiAiZmkgXCIuCisKK1RodSBOb3YgIDkgMTY6MTA6NTYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQVIsIENDLCBDRkxBR1MsIENDX0ZPUl9CVUlMRCwgUkFOTElCKTogUGljayB1cAorCWRlZmF1bHRzIGZyb20gY29uZmlndXJlLgorCisJKiBjb25maWd1cmUuaW46IFBpY2sgdXAgQVIsIENDLCBDRkxBR1MsIENDX0ZPUl9CVUlMRCwgUkFOTElCIHVzaW5nCisJY29uZmlndXJlIGRlZmF1bHRzLgorCShwb3dlcnBjKi0qLWVhYmkqKTogQnVpbGQgc2ltdWxhdG9yIGZvciBhbGwgcG93ZXJwYyBlYWJpIHRhcmdldHMKKwlpZiBlaXRoZXIgLS1lbmFibGUtc2ltLXBvd2VycGMgaXMgdXNlZCwgb3IgdGhlIGhvc3QgY29tcGlsZXIgaXMKKwlHQ0MuCisKK1dlZCBOb3YgIDggMTU6NDY6NDkgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAcGFzYW5kYS5jeWdudXMuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5pbiAobWlwcyotKi0qKTogQWRkZWQgIm1pcHMiIHNpbXVsYXRvciB0YXJnZXQuCisJKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlZC4KKworVHVlIE9jdCAxMCAxMTowODoyMCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEJJU09OKTogUmVtb3ZlIG1hY3JvLgorCShGTEFHU19UT19QQVNTKTogUmVtb3ZlIEJJU09OLgorCitTdW4gT2N0ICA4IDA0OjI2OjI3IDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKKworCSogY29uZmlndXJlLmluOiAgRXhwbGljaXRseSBgZXhpdCAwJyBmb3IgYnJva2VuIHNoZWxscy4KKwkqIGNvbmZpZ3VyZTogIFJlYnVpbHQuCisKK0ZyaSBPY3QgIDYgMTI6MDM6MjcgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBjb21tb24vcnVuLmMgKG1haW4pOiBJbml0aWFsaXplIHRoZSBjYWxsYmFja3MuCisKK1dlZCBTZXAgMjAgMTM6MzQ6NTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyBzeW5vbnltIGZvciByZWFsY2xlYW4uCisKK0ZyaSBBdWcgMjUgMTE6NTM6NDMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHBvd2VycGMqLSotZWFiaXNpbSopOiBPbmx5IGJ1aWxkIHRoZSBzaW11bGF0b3IgaWYKKwl0aGUgdGFyZ2V0IGlzIHBvd2VycGMqLSotZWFiaXNpbSosIHNpbmNlIGl0IHJlcXVpcmVzIEdDQyB0byBidWlsZC4KKworTW9uIEF1ZyAyMSAxNzo1Mzo0OCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwY3ssbGV9LSotKik6IEFkZCBwc2ltIGZyb20gQW5kcmV3IENhZ25leQorCTxjYWduZXlAaGlnaGxhbmQuY29tLmF1Pi4KKwkqIGNvbmZpZ3VyZTogUmVnbmVyYXRlIGZyb20gY29uZmlndXJlLmluLgorCitUaHUgQXVnICAzIDEwOjQ1OjM3IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBVcGRhdGUgYWxsIEZTRiBhZGRyZXNzZXMgZXhjZXB0IHRob3NlIGluIENPUFlJTkcqIGZpbGVzLgorCitUaHUgSnVsIDIwIDE1OjE3OjI5IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX0JVSUxEKTogIERlZmluZSBkZWZhdWx0IGFuZCBhcnJhbmdlIHRvIHBhc3MKKwlzdWJtYWtlcyBlaXRoZXIgZGVmYXVsdCBvciBwYXNzZWQgaW4gdmFsdWUuCisKK1dlZCBKdWwgIDUgMTQ6MzI6NTQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoYWxsLCBjbGVhbiwgZGlzdGNsZWFuLCBtb3N0bHljbGVhbiwgcmVhbGNsZWFuLAorCSAgaW5zdGFsbCk6IENoYW5nZWQgdGFyZ2V0cyBzbyB0aGF0IHRoZXkgZGVzY2VuZCBhbGwKKwkgIHN1YmRpcmVjdG9yaWVzIGluICQoU1VCRElSUykuCisJICAoKi1hbGwsICotY2xlYW4sICotaW5zdGFsbCk6IFJlbW92ZWQgdGFyZ2V0cy4KKworCSogY29uZmlndXJlLmluOiBEb24ndCBib3RoZXIgd2l0aCB0YXJnZXQgbWFrZWZpbGUgZnJhZ21lbnRzLCB0aGV5CisJICBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KKwkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZWQuCisKKwkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IGNvbnZlcnRlZCB0byBhdXRvY29uZi4KKwkqIGNvbmZpZ3VyZTogTmV3IGZpbGUsIGdlbmVyYXRlZCB3aXRoIGF1dGNvbmYgMi40LgorCitXZWQgTWF5IDI0IDE0OjQ4OjQ2IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBTdXBwb3J0IEFSTS4KKwkqIGNvbmZpZ3VyZS5pbjogRGl0dG8uCisKK1N1biBKYW4gMTUgMTY6NTM6NDcgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+CisKKwkqIE1ha2VmaWxlLmluOiBTdXBwb3J0IFc2NS4KKwkqIGNvbmZpZ3VyZS5pbjogRGl0dG8uCisKK1N1biBNYXIgMTMgMDk6Mjc6NTAgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBBZGQgVEFHUyB0YXJnZXQuCisKK01vbiBTZXAgMTMgMTI6NDc6MTUgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoYWxsLXo4aywgaW5zdGFsbC16OGssIGNsZWFuLXo4aywgYWxsLWg4MzAwLAorCSAgaW5zdGFsbC1oODMwMCwgY2xlYW4taDgzMDAsIGFsbC1oODUwMCwgaW5zdGFsbC1oODUwMCwKKwkgIGNsZWFuLWg4NTAwLCBhbGwtc2gsIGluc3RhbGwtc2gsIGNsZWFuLXNoKTogZG8gbm90IGVjaG8KKwkgIHJlY3Vyc2lvbiBsaW5lcy4gCisKK1dlZCBKdW4gMzAgMTQ6MTI6MDUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiByZW1vdmUgZW5kaWFuLmggdHJhY2UgZnJvbSBoODUwMAorCitTdW4gSnVuIDEzIDEzOjA4OjU4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbjogQWRkIGRpc3RjbGVhbiwgcmVhbGNsZWFuLCBhbmQgbW9zdGx5Y2xlYW4gdGFyZ2V0cy4KKworRnJpIE1heSAyMSAxMToyMToxNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBtYWtlIGFsbCBvZiB0aGUgYWxsLSogdGFyZ2V0IChleGNlcHQgYWxsLW5vdGhpbmcpCisJZGVwZW5kIG9uIGVuZGlhbi5oLCBzbyB0aGF0IGlmIHdlJ3JlIG5vdCBidWlsZGluZyBhIHNpbXVsYXRvciwgd2UKKwlkb24ndCBidWlsdCBlbmRpYW4KKworRnJpIE1heSAyMSAxMDo1NTowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChjaGVjaywgaW5zdGFsbGNoZWNrKTogQWRkZWQgZHVtbXkgdGFyZ2V0cy4KKworTW9uIE1heSAgMyAyMTozOTo0MyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGVuZGlhbik6IEZpbmQgZW5kaWFuLmMgaW4gJChzcmNkaXIpLCBhbmQgYWxzbworCWV4cGxpY2l0bHkgbWFrZSBpdCwgc2luY2Ugc29tZSBtYWtlcyBhcHBhcmVudGx5IGRvbid0IHdvcmsgd2l0aAorCVZQQVRIIGFuZCAuYyB0byBleGVjdXRhYmxlIHJ1bGVzIChTdW5PUyBtYWtlIGZvciBleGFtcGxlKS4KKworTW9uIE1heSAgMyAwODoyOTowMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKGVuZGlhbik6IEFkZCBleHBsaWNpdCBydWxlIGZvciBicm9rZW4gbWFrZXMuCisKK01vbiBNYXIgMTUgMTU6NDc6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAoaW5mbywgaW5zdGFsbC1pbmZvKTogTmV3IHRhcmdldHMuCisJKERPX0lOU1RBTEwpOiBSZW5hbWVkIGZyb20gSU5TVEFMTCwgd2hpY2ggaXMgb3ZlcnJpZGRlbiBieSB0aGUgdG9wCisJbGV2ZWwgTWFrZWZpbGUuCisKK1dlZCBGZWIgMTAgMjA6MTI6MjcgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQG9rLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChlbmRpYW4uaCk6IGJ1aWxkIGVuZGlhbi5oIHZpYSBhIHRlbXBvcmFyeSBmaWxlIHNvCisJICB0aGF0IHdlIGRvbid0IGxlYXZlIGFuIGluY29tcGxldGUgZmlsZSBseWluZyBhcm91bmQgb24KKwkgIGludGVycnVwdGVkIGJ1aWxkcy4KKwkgIChjbGVhbik6IHJlbW92ZSBlbmRpYW4sIGUuaCwgYW5kIGVuZGlhbi5oLgorCitNb24gRmViICA4IDExOjQ2OjA2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBpZiB0YXJnZXQgaXNuJ3Qgc3VwcG9ydGVkLCBidWlsZCBhCisJaGFybWxlc3MgbWFrZWZpbGUuCisKKwpkaWZmIC0tZ2l0IGEvc2ltL01ha2VmaWxlLmluIGIvc2ltL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNTM3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwyNTQgQEAKKyMgICAgTWFrZWZpbGUgdGVtcGxhdGUgZm9yIENvbmZpZ3VyZSBmb3IgdGhlIHNpbSBsaWJyYXJ5LgorIyAgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTUsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisjIAorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKK1ZQQVRIID0gQHNyY2RpckAKK3NyY2RpciA9IEBzcmNkaXJACisKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKKworaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK2JpbmRpciA9IEBiaW5kaXJACitsaWJkaXIgPSBAbGliZGlyQAordG9vbGRpciA9ICQobGliZGlyKS8kKHRhcmdldF9hbGlhcykKKworZGF0YWRpciA9IEBkYXRhZGlyQAorbWFuZGlyID0gQG1hbmRpckAKK21hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQorbWFuMmRpciA9ICQobWFuZGlyKS9tYW4yCittYW4zZGlyID0gJChtYW5kaXIpL21hbjMKK21hbjRkaXIgPSAkKG1hbmRpcikvbWFuNAorbWFuNWRpciA9ICQobWFuZGlyKS9tYW41CittYW42ZGlyID0gJChtYW5kaXIpL21hbjYKK21hbjdkaXIgPSAkKG1hbmRpcikvbWFuNworbWFuOGRpciA9ICQobWFuZGlyKS9tYW44CittYW45ZGlyID0gJChtYW5kaXIpL21hbjkKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKKworU0hFTEwgPSBAU0hFTExACisKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorCitBUiA9IEBBUkAKK0FSX0ZMQUdTID0gcmMKK0NDID0gQENDQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACitNQUtFSU5GTyA9IG1ha2VpbmZvCitSQU5MSUIgPSBAUkFOTElCQAorCitTVUJESVJTID0gQHN1YmRpcnNACisKK0lOQ0RJUiA9ICQoc3JjZGlyKS8uLi9pbmNsdWRlCitDU0VBUkNIID0gLUkuIC1JJChzcmNkaXIpIC1JJChJTkNESVIpCitERVAgPSBta2RlcAorCisjIGNvbXBpbGVycyB0byB1c2UgdG8gY3JlYXRlIHByb2dyYW1zIHdoaWNoIG11c3QgYmUgcnVuIGluIHRoZSBidWlsZAorIyBlbnZpcm9ubWVudC4KK0NDX0ZPUl9CVUlMRCA9ICQoQ0MpCisKKyMjIyMgTWFrZWZpbGUgZnJhZ21lbnRzIGNvbWUgaW4gaGVyZS4KKyMgQHRhcmdldF9tYWtlZmlsZV9mcmFnQAorIyMjCisKK1JVTlRFU1QgPSBgaWYgWyAtZiAkJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCBdIDsgdGhlbiBcCisJCWVjaG8gJCR7c3JjZGlyfS8uLi9kZWphZ251L3J1bnRlc3QgOyBlbHNlIGVjaG8gcnVudGVzdDsgXAorCSAgIGZpYAorUlVOVEVTVEZMQUdTPQorCitGTEFHU19UT19QQVNTID0gXAorCSJwcmVmaXg9JChwcmVmaXgpIiBcCisJImV4ZWNfcHJlZml4PSQoZXhlY19wcmVmaXgpIiBcCisJImFnYWluc3Q9JChhZ2FpbnN0KSIgXAorCSJBUj0kKEFSKSIgXAorCSJBUl9GTEFHUz0kKEFSX0ZMQUdTKSIgXAorCSJDQz0kKENDKSIgXAorCSJDQ19GT1JfQlVJTEQ9JChDQ19GT1JfQlVJTEQpIiBcCisJIkNGTEFHUz0kKENGTEFHUykiIFwKKwkiUkFOTElCPSQoUkFOTElCKSIgXAorCSJNQUtFSU5GTz0kKE1BS0VJTkZPKSIgXAorCSJJTlNUQUxMPSQoSU5TVEFMTCkiIFwKKwkiSU5TVEFMTF9EQVRBPSQoSU5TVEFMTF9EQVRBKSIgXAorCSJJTlNUQUxMX1BST0dSQU09JChJTlNUQUxMX1BST0dSQU0pIiBcCisJIlJVTlRFU1RGTEFHUz0kKFJVTlRFU1RGTEFHUykiIFwKKwkiU0hFTEw9JChTSEVMTCkiCisKKyMgVGhlIHVzZSBvZiAkJCh4X0ZPUl9UQVJHRVQpIHJlZHVjZXMgdGhlIGNvbW1hbmQgbGluZSBsZW5ndGggYnkgbm90CisjIGR1cGxpY2F0aW5nIHRoZSBsZW5ndGh5IGRlZmluaXRpb24uCitUQVJHRVRfRkxBR1NfVE9fUEFTUyA9IFwKKwkicHJlZml4PSQocHJlZml4KSIgXAorCSJleGVjX3ByZWZpeD0kKGV4ZWNfcHJlZml4KSIgXAorCSJhZ2FpbnN0PSQoYWdhaW5zdCkiIFwKKwknQ0M9JCQoQ0NfRk9SX1RBUkdFVCknIFwKKwkiQ0NfRk9SX1RBUkdFVD0kKENDX0ZPUl9UQVJHRVQpIiBcCisJIkNGTEFHUz0kKENGTEFHUykiIFwKKwkiQ0hJTExGTEFHUz0kKENISUxMRkxBR1MpIiBcCisJJ0NISUxMPSQkKENISUxMX0ZPUl9UQVJHRVQpJyBcCisJIkNISUxMX0ZPUl9UQVJHRVQ9JChDSElMTF9GT1JfVEFSR0VUKSIgXAorCSJDSElMTF9MSUI9JChDSElMTF9MSUIpIiBcCisJJ0NYWD0kJChDWFhfRk9SX1RBUkdFVCknIFwKKwkiQ1hYX0ZPUl9UQVJHRVQ9JChDWFhfRk9SX1RBUkdFVCkiIFwKKwkiQ1hYRkxBR1M9JChDWFhGTEFHUykiIFwKKwkiSU5TVEFMTD0kKElOU1RBTEwpIiBcCisJIklOU1RBTExfUFJPR1JBTT0kKElOU1RBTExfUFJPR1JBTSkiIFwKKwkiSU5TVEFMTF9EQVRBPSQoSU5TVEFMTF9EQVRBKSIgXAorCSJNQUtFSU5GTz0kKE1BS0VJTkZPKSIgXAorCSJSVU5URVNURkxBR1M9JChSVU5URVNURkxBR1MpIgorCisKK2FsbDoKKwlAcm9vdG1lPWBwd2RgIDsgZXhwb3J0IHJvb3RtZSA7IFwKKwlmb3IgZGlyIGluIC4gYGVjaG8gJHtTVUJESVJTfSB8IHNlZCAncy90ZXN0c3VpdGUvLydgIDsgZG8gXAorCQlpZiBbICIkJGRpciIgPSAiLiIgXTsgdGhlbiBcCisJCQl0cnVlOyBcCisJCWVsaWYgWyAtZCAkJGRpciBdOyB0aGVuIFwKKwkJCShjZCAkJGRpcjsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpKTsgXAorCQllbHNlIHRydWU7IGZpOyBcCisJZG9uZQorCitjbGVhbiBtb3N0bHljbGVhbjoKKwlAcm9vdG1lPWBwd2RgIDsgZXhwb3J0IHJvb3RtZSA7IFwKKwlmb3IgZGlyIGluIC4gJHtTVUJESVJTfTsgZG8gXAorCQlpZiBbICIkJGRpciIgPSAiLiIgXTsgdGhlbiBcCisJCQl0cnVlOyBcCisJCWVsaWYgWyAtZCAkJGRpciBdOyB0aGVuIFwKKwkJCShjZCAkJGRpcjsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpICRAKTsgXAorCQllbHNlIHRydWU7IGZpOyBcCisJZG9uZQorCitkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW46CisJQHJvb3RtZT1gcHdkYCA7IGV4cG9ydCByb290bWUgOyBcCisJZm9yIGRpciBpbiAuICR7U1VCRElSU307IGRvIFwKKwkJaWYgWyAiJCRkaXIiID0gIi4iIF07IHRoZW4gXAorCQkJdHJ1ZTsgXAorCQllbGlmIFsgLWQgJCRkaXIgXTsgdGhlbiBcCisJCQkoY2QgJCRkaXI7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSAkQCk7IFwKKwkJZWxzZSB0cnVlOyBmaTsgXAorCWRvbmUKKwlybSAtZiBNYWtlZmlsZSBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBjb25maWcuc3RhdHVzCisKK2luc3RhbGw6CisJQHJvb3RtZT1gcHdkYCA7IGV4cG9ydCByb290bWUgOyBcCisJZm9yIGRpciBpbiAuICR7U1VCRElSU307IGRvIFwKKwkJaWYgWyAiJCRkaXIiID0gIi4iIF07IHRoZW4gXAorCQkJdHJ1ZTsgXAorCQllbGlmIFsgLWQgJCRkaXIgXTsgdGhlbiBcCisJCQkoY2QgJCRkaXI7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAorCQllbHNlIHRydWU7IGZpOyBcCisJZG9uZQorCitpbnN0YWxsY2hlY2s6CisJQGVjaG8gTm8gaW5zdGFsbGNoZWNrIHRhcmdldCBpcyBhdmFpbGFibGUgeWV0IGZvciB0aGUgR05VIHNpbXVsYXRvcnMuCisKK2luc3RhbGxjaGVjazoKKworIyBUaGUgY2hlY2sgdGFyZ2V0IGNhbiBub3QgdXNlIHN1YmRpcl9kbywgYmVjYXVzZSBzdWJkaXJfZG8gZG9lcyBub3QKKyMgdXNlIFRBUkdFVF9GTEFHU19UT19QQVNTLgorY2hlY2s6IGZvcmNlCisJQGlmIFsgLWYgdGVzdHN1aXRlL01ha2VmaWxlIF07IHRoZW4gXAorCSAgcm9vdG1lPWBwd2RgOyBleHBvcnQgcm9vdG1lOyBcCisJICByb290c3JjPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCByb290c3JjOyBcCisJICBjZCB0ZXN0c3VpdGU7IFwKKwkgICQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykgY2hlY2s7IFwKKwllbHNlIHRydWU7IGZpCisKKworCitpbmZvOgoraW5zdGFsbC1pbmZvOgorZHZpOgorCisjIyMgCisjIyMgCisKKy5OT0VYUE9SVDoKK01BS0VPVkVSUklERVM9CisKKy5QSE9OWTogY2hlY2sgaW5zdGFsbGNoZWNrCitjaGVjazoKK2luc3RhbGxjaGVjazoKKworVEFHUzoKKworZm9yY2U6CisKK01ha2VmaWxlOiBNYWtlZmlsZS5pbiBjb25maWcuc3RhdHVzCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKK2NvbmZpZy5zdGF0dXM6IGNvbmZpZ3VyZQorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKKworIyBVdGlsaXR5IHRvIHJ1biBhdXRvY29uZiBpbiBlYWNoIGRpcmVjdG9yeSB0aGF0IHVzZXMgdGhlIGNvbW1vbiBmcmFtZXdvcmsuCisjIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgaW52b2tlZCBpbiAkc3JjZGlyIGFzCisjICJtYWtlIC1mIE1ha2VmaWxlLmluIGF1dG9jb25mLWNvbW1vbiIuCisuUEhPTlk6IGF1dG9jb25mLWNvbW1vbgorYXV0b2NvbmYtY29tbW9uIGF1dG9oZWFkZXItY29tbW9uOgorCWZvciBkIGluICogOyBcCisJZG8gXAorCSAgICBpZiBbIC1kICQkZCAtYSAtZiAkJGQvY29uZmlndXJlLmluIF0gOyBcCisJICAgIHRoZW4gXAorCQkgZWNobyAiUnVubmluZyBhdXRvY29uZiBpbiAkJGQgLi4uIiA7IFwKKwkJIChjZCAkJGQgJiYgYXV0b2NvbmYpIDsgXAorCQkgaWYgWyAkQCA9IGF1dG9oZWFkZXItY29tbW9uIF0gOyBcCisJCSB0aGVuIFwKKwkJICAgZWNobyAiUnVubmluZyBhdXRvaGVhZGVyIGluICQkZCAuLi4iIDsgXAorCQkgICAoY2QgJCRkICYmIGF1dG9oZWFkZXIpIDsgXAorCQkgZmkgOyBcCisJICAgIGZpIDsgXAorCWRvbmUKKworYXV0b2NvbmYtY2hhbmdlbG9nIGF1dG9oZWFkZXItY2hhbmdlbG9nOgorCWlkPSJgaWQgfCBzZWQgLWUgJ3MvXlteKF0qKFwoW14pXSpcKS4qJCQvXDEvJ2AiIDsgXAorCW5hbWU9YGdyZXAgIl4kJGlkOiIgL2V0Yy9wYXNzd2QgfCBjdXQgLWYgNSAtZCAnOidgIDsgXAorCWhvc3Q9ImBob3N0bmFtZWAiIDsgXAorCWRhdGU9ImBkYXRlIHwgc2VkICdzLyBbXiBdKiBcKFswLTldKlwpJCQvIFwxLydgIiA7IFwKKwllY2hvICIkJGRhdGUgJCRuYW1lICQkaWRAJCRob3N0IiA7IFwKKwlmb3IgZCBpbiAqIDsgXAorCWRvIFwKKwkgICAgaWYgWyAtZCAkJGQgLWEgLWYgJCRkL2NvbmZpZ3VyZS5pbiBdIDsgXAorCSAgICB0aGVuIFwKKwkJIGVjaG8gIkNyZWF0aW5nIG5ldy1DaGFuZ2VMb2cgaW4gJCRkIC4uLiIgOyBcCisJCSAoIGVjaG8gIiQkZGF0ZSAgJCRuYW1lICA8JCRpZEAkJGhvc3Q+IiA7IFwKKwkJICAgZWNobyAiIiA7IFwKKwkJICAgZWNobyAiCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLiIgOyBcCisJCSAgIGlmIFsgJEAgPSBhdXRvaGVhZGVyLWNoYW5nZWxvZyBdIDsgXAorCQkgICB0aGVuIFwKKwkJICAgICBlY2hvICIJKiBjb25maWcuaW46IERpdHRvLiIgOyBcCisJCSAgIGZpIDsgXAorCQkgICBlY2hvICIiIDsgXAorCQkgICBjYXQgJCRkL0NoYW5nZUxvZyBcCisJCSApID4gJCRkL25ldy1DaGFuZ2VMb2cgOyBcCisJICAgIGZpIDsgXAorCWRvbmUKKworYXV0b2NvbmYtaW5zdGFsbCBhdXRvaGVhZGVyLWluc3RhbGw6CisJZm9yIGQgaW4gKiA7IFwKKwlkbyBcCisJICAgIGlmIFsgLWQgJCRkIC1hIC1mICQkZC9jb25maWd1cmUuaW4gXSA7IFwKKwkgICAgdGhlbiBcCisJCSBlY2hvICJNb3ZpbmcgJCRkL25ldy1DaGFuZ2VMb2cgdG8gJCRkL0NoYW5nZUxvZyAuLi4iIDsgXAorCQkgbXYgJCRkL25ldy1DaGFuZ2VMb2cgJCRkL0NoYW5nZUxvZyA7IFwKKwkgICAgZmkgOyBcCisJZG9uZQpkaWZmIC0tZ2l0IGEvc2ltL1JFQURNRS1IQUNLSU5HIGIvc2ltL1JFQURNRS1IQUNLSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZWZlYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vUkVBRE1FLUhBQ0tJTkcKQEAgLTAsMCArMSwyNTQgQEAKK1RoaXMgaXMgYSBsb29zZSBjb2xsZWN0aW9uIG9mIG5vdGVzIGZvciBwZW9wbGUgaGFja2luZyBvbiBzaW11bGF0b3JzLgorSWYgdGhpcyBkb2N1bWVudCBnZXRzIGJpZyBlbm91Z2ggaXQgY2FuIGJlIHByZXR0aWVkIHVwIHRoZW4uCisKK0NvbnRlbnRzCisKKy0gVGhlICJjb21tb24iIGRpcmVjdG9yeQorLSBDb21tb24gTWFrZWZpbGUgU3VwcG9ydAorLSBUQUdTIHN1cHBvcnQKKy0gR2VuZXJhdGluZyAiY29uZmlndXJlIiBmaWxlcworLSB0Y29uZmlnLmluCistIEMgTGFuZ3VhZ2UgQXNzdW1wdGlvbnMKKy0gImR1bXAiIGNvbW1hbmRzIHVuZGVyIGdkYgorDAorVGhlICJjb21tb24iIGRpcmVjdG9yeQorPT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgY29tbW9uIGRpcmVjdG9yeSBjb250YWluczoKKworLSBjb21tb24gZG9jdW1lbnRhdGlvbiBmaWxlcyAoZS5nLiBydW4uMSwgYW5kIG1heWJlIGluIHRpbWUgLnRleGkgZmlsZXMpCistIGNvbW1vbiBzb3VyY2UgZmlsZXMgKGUuZy4gcnVuLmMpCistIGNvbW1vbiBNYWtlZmlsZSBmcmFnbWVudCBhbmQgY29uZmlndXJ5IChlLmcuIE1ha2UtY29tbW9uLmluLCBhY2xvY2FsLm00KS4KKworSW4gYWRkaXRpb24gImNvbW1vbiIgY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIHN5c3RlbSBjYWxsIHN1cHBvcnQKKyhlLmcuIGNhbGxiYWNrLmMsIG5sdHZhbHMuZGVmKS4KKworRXZlbiB0aG91Z2ggbm8gZmlsZXMgYXJlIGJ1aWx0IGluIHRoaXMgZGlyZWN0b3J5LCBpdCBpcyBzdGlsbCBjb25maWd1cmVkCitzbyBzdXBwb3J0IGZvciByZWdlbmVyYXRpbmcgbmx0dmFscy5kZWYgaXMgcHJlc2VudC4KKwwKK0NvbW1vbiBNYWtlZmlsZSBTdXBwb3J0Cis9PT09PT09PT09PT09PT09PT09PT09PQorCitBIGNvbW1vbiBjb25maWd1cmF0aW9uIGZyYW1ld29yayBpcyBhdmFpbGFibGUgZm9yIHNpbXVsYXRvcnMgdGhhdCB3YW50Cit0byB1c2UgaXQuICBUaGUgY29tbW9uIGZyYW1ld29yayBleGlzdHMgdG8gcmVtb3ZlIGEgbG90IG9mIGR1cGxpY2F0aW9uCitpbiBjb25maWd1cmUuaW4gYW5kIE1ha2VmaWxlLmluLCBhbmQgaXQgYWxzbyBwcm92aWRlcyBhIGZvdW5kYXRpb24gZm9yCitlbmhhbmNpbmcgdGhlIHNpbXVsYXRvcnMgdW5pZm9ybWx5IChlLmcuIHRoZSBtb3JlIHRoZXkgc2hhcmUgaW4gY29tbW9uCit0aGUgZWFzaWVyIGEgZmVhdHVyZSBhZGRlZCB0byBvbmUgaXMgYWRkZWQgdG8gYWxsKS4KKworVGhlIGNvbmZpZ3VyZS5pbiBvZiBhIHNpbXVsYXRvciB1c2luZyB0aGUgY29tbW9uIGZyYW1ld29yayBzaG91bGQgbG9vayBsaWtlOgorCistLS0gc25pcCAtLS0KK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Lgorc2luY2x1ZGUoLi4vY29tbW9uL2FjbG9jYWwubTQpCitBQ19QUkVSRVEoMi41KWRubAorQUNfSU5JVChNYWtlZmlsZS5pbikKKworU0lNX0FDX0NPTU1PTgorCisuLi4gdGFyZ2V0IHNwZWNpZmljIGFkZGl0aW9ucyAuLi4KKworU0lNX0FDX09VVFBVVAorLS0tIHNuaXAgLS0tCisKK1NJTV9BQ19DT01NT046CisKKy0gaW52b2tlcyB0aGUgYXV0b2NvbmYgbWFjcm9zIG1vc3Qgb2Z0ZW4gdXNlZCBieSB0aGUgc2ltdWxhdG9ycworLSBkZWZpbmVzIC0tZW5hYmxlLy0td2l0aCBvcHRpb25zIHVzYWJsZSBieSBhbGwgc2ltdWxhdG9ycworLSBpbml0aWFsaXplcyBzaW1fbGlua19maWxlcy9zaW1fbGlua19saW5rcyBhcyB0aGUgc2V0IG9mIHN5bWJvbGljIGxpbmtzCisgIHRvIHNldCB1cAorCitTSU1fQUNfT1VUUFVUOgorCistIGNyZWF0ZXMgdGhlIHN5bWJvbGljIGxpbmtzIGRlZmluZWQgaW4gc2ltX2xpbmtfe2ZpbGVzLGxpbmtzfQorLSBjcmVhdGVzIGNvbmZpZy5oCistIGNyZWF0ZXMgdGhlIE1ha2VmaWxlCisKK1RoZSBNYWtlZmlsZS5pbiBvZiBhIHNpbXVsYXRvciB1c2luZyB0aGUgY29tbW9uIGZyYW1ld29yayBzaG91bGQgbG9vayBsaWtlOgorCistLS0gc25pcCAtLS0KKyMgTWFrZWZpbGUgZm9yIGJsYWggLi4uCisjIENvcHlyaWdodCBibGFoIC4uLgorCisjIyBDT01NT05fUFJFX0NPTkZJR19GUkFHCisKKyMgVGhlc2UgdmFyaWFibGVzIGFyZSBnaXZlbiBkZWZhdWx0IHZhbHVlcyBpbiBDT01NT05fUFJFX0NPTkZJR19GUkFHLgorIyBXZSBvdmVycmlkZSB0aGUgb25lcyB3ZSBuZWVkIHRvIGhlcmUuCisjIE5vdCBhbGwgb2YgdGhlc2UgbmVlZCB0byBiZSBtZW50aW9uZWQsIG9ubHkgdGhlIG5lY2Vzc2FyeSBvbmVzLgorIyBJbiBmYWN0IGl0IGlzIGJldHRlciB0byAqbm90KiBtZW50aW9uIG9uZXMgaWYgdGhlIHZhbHVlIGlzIHRoZSBkZWZhdWx0LgorCisjIExpc3Qgb2Ygb2JqZWN0IGZpbGVzLCBsZXNzIGNvbW1vbiBwYXJ0cy4KK1NJTV9PQkpTID0KKyMgTGlzdCBvZiBleHRyYSBkZXBlbmRlbmNpZXMuCisjIEdlbmVyYWxseSB0aGlzIGNvbnNpc3RzIG9mIHNpbXVsYXRvciBzcGVjaWZpYyBmaWxlcyBpbmNsdWRlZCBieSBzaW0tbWFpbi5oLgorU0lNX0VYVFJBX0RFUFMgPQorIyBMaXN0IG9mIGZsYWdzIHRvIGFsd2F5cyBwYXNzIHRvICQoQ0MpLgorU0lNX0VYVFJBX0NGTEFHUyA9CisjIExpc3Qgb2YgZXh0cmEgbGlicmFyaWVzIHRvIGxpbmsgd2l0aC4KK1NJTV9FWFRSQV9MSUJTID0KKyMgTGlzdCBvZiBleHRyYSBwcm9ncmFtIGRlcGVuZGVuY2llcy4KK1NJTV9FWFRSQV9MSUJERVBTID0KKyMgTGlzdCBvZiBtYWluIG9iamVjdCBmaWxlcyBmb3IgYHJ1bicuCitTSU1fUlVOX09CSlMgPSBydW4ubworIyBEZXBlbmRlbmN5IG9mIGBhbGwnIHRvIGJ1aWxkIGFueSBleHRyYSBmaWxlcy4KK1NJTV9FWFRSQV9BTEwgPQorIyBEZXBlbmRlbmN5IG9mIGBpbnN0YWxsJyB0byBpbnN0YWxsIGFueSBleHRyYSBmaWxlcy4KK1NJTV9FWFRSQV9JTlNUQUxMID0KKyMgRGVwZW5kZW5jeSBvZiBgY2xlYW4nIHRvIGNsZWFuIGFueSBleHRyYSBmaWxlcy4KK1NJTV9FWFRSQV9DTEVBTiA9CisKKyMjIENPTU1PTl9QT1NUX0NPTkZJR19GUkFHCisKKyMgUnVsZXMgbmVlZCB0byBidWlsZCAkKFNJTV9PQkpTKSwgcGx1cyB3aGF0ZXZlciBlbHNlIHRoZSB0YXJnZXQgd2FudHMuCisKKy4uLiB0YXJnZXQgc3BlY2lmaWMgcnVsZXMgLi4uCistLS0gc25pcCAtLS0KKworQ09NTU9OX3tQUkUsUE9TVH1fQ09ORklHX0ZSQUcgYXJlIG1hcmtlcnMgZm9yIFNJTV9BQ19PVVRQVVQgdG8gdGVsbCBpdAord2hlcmUgdG8gaW5zZXJ0IHRoZSB0d28gcGllY2VzIG9mIGNvbW1vbi9NYWtlLWNvbW1vbi5pbi4KK1RoZSByZXN1bHRpbmcgTWFrZWZpbGUgaXMgY3JlYXRlZCBieSBkb2luZyBhdXRvY29uZiBzdWJzdGl0aW9ucyBvbgorYm90aCB0aGUgdGFyZ2V0J3MgTWFrZWZpbGUuaW4gYW5kIE1ha2UtY29tbW9uLmluLCBhbmQgaW5zZXJ0aW5nCit0aGUgdHdvIHBpZWNlcyBvZiBNYWtlLWNvbW1vbi5pbiBpbnRvIHRoZSB0YXJnZXQncyBNYWtlZmlsZS5pbiBhdAorQ09NTU9OX3tQUkUsUE9TVH1fQ09ORklHX0ZSQUcuCisKK05vdGUgdGhhdCBTSU1fRVhUUkFfe0lOU1RBTEwsQ0xFQU59IGNvdWxkIGJlIHJlbW92ZWQgYW5kICI6OiIgdGFyZ2V0cworY291bGQgYmUgdXNlZCBpbnN0ZWFkLiAgSG93ZXZlciwgaXQncyBub3QgY2xlYXIgeWV0IHdoZXRoZXIgIjo6IiB0YXJnZXRzCithcmUgcG9ydGFibGUgZW5vdWdoLgorDAorVEFHUyBzdXBwb3J0Cis9PT09PT09PT09PT0KKworTWFueSBmaWxlcyBnZW5lcmF0ZSBwcm9ncmFtIHN5bWJvbHMgYXQgY29tcGlsZSB0aW1lLgorU3VjaCBzeW1ib2xzIGNhbid0IGJlIGZvdW5kIHdpdGggZ3JlcCBub3IgZG8gdGhleSBub3JtYWxseSBhcHBlYXIgaW4KK3RoZSBUQUdTIGZpbGUuICBUbyBnZXQgYXJvdW5kIHRoaXMsIHNvdXJjZSBmaWxlcyBjYW4gYWRkIHRoZSBjb21tZW50CisKKy8qIFRBR1M6IGZvbzEgZm9vMiAqLworCit3aGVyZSBmb28xLCBmb28yIGFyZSBwcm9ncmFtIHN5bWJvbHMuICBTeW1ib2xzIGZvdW5kIGluIHN1Y2ggY29tbWVudHMKK2FyZSBncmVwcGFibGUgYW5kIGFwcGVhciBpbiB0aGUgVEFHUyBmaWxlLgorDAorR2VuZXJhdGluZyAiY29uZmlndXJlIiBmaWxlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitGb3IgdGFyZ2V0cyB1c2luZyB0aGUgY29tbW9uIGZyYW1ld29yaywgImNvbmZpZ3VyZSIgY2FuIGJlIGdlbmVyYXRlZAorYnkgcnVubmluZyBgYXV0b2NvbmYnLgorCitUbyByZWdlbmVyYXRlIHRoZSBjb25maWd1cmUgZmlsZXMgZm9yIGFsbCB0YXJnZXRzIHVzaW5nIHRoZSBjb21tb24gZnJhbWV3b3JrOgorCisJJCAgY2QgZGV2by9zaW0KKwkkICBtYWtlIC1mIE1ha2VmaWxlLmluIFNIRUxMPS9iaW4vc2ggYXV0b2NvbmYtY29tbW9uCisKK1RvIGFkZCBhIGNoYW5nZS1sb2cgZW50cnkgdG8gdGhlIENoYW5nZUxvZyBmaWxlIGZvciBlYWNoIHVwZGF0ZWQKK2RpcmVjdG9yeSAoV0FSTklORyAtIGNoZWNrIHRoZSBtb2RpZmllZCBuZXctQ2hhbmdlTG9nIGZpbGVzIGJlZm9yZQorcmVuYW1pbmcpOgorCisJJCAgbWFrZSAtZiBNYWtlZmlsZS5pbiBTSEVMTD0vYmluL3NoIGF1dG9jb25mLWNoYW5nZWxvZworCSQgIG1vcmUgKi9uZXctQ2hhbmdlTG9nCisJJCAgbWFrZSAtZiBNYWtlZmlsZS5pbiBTSEVMTD0vYmluL3NoIGF1dG9jb25mLWluc3RhbGwKKworSW4gYSBzaW1pbGFyIHZlaW4sIGJvdGggdGhlIGNvbmZpZ3VyZSBhbmQgY29uZmlnLmluIGZpbGVzIGNhbiBiZQordXBkYXRlZCB1c2luZyB0aGUgc2VxdWVuY2U6CisKKwkkICBjZCBkZXZvL3NpbQorCSQgIG1ha2UgLWYgTWFrZWZpbGUuaW4gU0hFTEw9L2Jpbi9zaCBhdXRvaGVhZGVyLWNvbW1vbgorCSQgIG1ha2UgLWYgTWFrZWZpbGUuaW4gU0hFTEw9L2Jpbi9zaCBhdXRvaGVhZGVyLWNoYW5nZWxvZworCSQgIG1vcmUgKi9uZXctQ2hhbmdlTG9nCisJJCAgbWFrZSAtZiBNYWtlZmlsZS5pbiBTSEVMTD0vYmluL3NoIGF1dG9oZWFkZXItaW5zdGFsbAorDAordGNvbmZpZy5pbgorPT09PT09PT09PQorCitGaWxlIHRjb25maWcuaW4gZGVmaW5lcyBvbmUgb3IgbW9yZSB0YXJnZXQgY29uZmlndXJhdGlvbiBtYWNyb3MKKyhlLmcuIGEgdG0uaCBmaWxlKS4gIFRoZXJlIGFyZSB2ZXJ5IGZldyB0aGF0IG5lZWQgZGVmaW5pbmcuCitGb3IgYSBsaXN0IG9mIGFsbCBvZiB0aGVtLCBzZWUgY29tbW9uL3Rjb25maWcuaW4uCitJdCBjb250YWlucyB0aGVtIGFsbCwgY29tbWVudGVkIG91dC4KK1RoZSBpbnRlbnQgaXMgdGhhdCBhIG5ldyBwb3J0IGNhbiBqdXN0IGNvcHkgdGhpcyBmaWxlIGFuZAorZGVmaW5lIHRoZSBvbmVzIGl0IG5lZWRzLgorDAorQyBMYW5ndWFnZSBBc3N1bXB0aW9ucworPT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgcHJvZ3JhbW1lciBtYXkgYXNzdW1lIHRoYXQgdGhlIHNpbXVsYXRvciBpcyBiZWluZyBidWlsdCB1c2luZyBhbgorQU5TSSBDIGNvbXBpbGVyIHRoYXQgc3VwcG9ydHMgYSA2NCBiaXQgZGF0YSB0eXBlLiAgQ29uc2VxdWVudGx5OgorCisJbwlwcm90b3R5cGVzIGNhbiBiZSB1c2VkIChhbHRob3VnaCB1c2luZworCQlQQVJBTVMoKSBhbmQgSyZSIGRlY2xhcmF0aW9ucyB3b3VsZG4ndAorCQlnbyBhc3RyYXkpLgorCisJbwlJZiBzaW0tdHlwZXMuaCBpcyBpbmNsdWRlZCwgdGhlIHR3bworCQl0eXBlcyBzaWduZWQ2NCBhbmQgdW5zaWduZWQ2NCBhcmUKKwkJYXZhaWxhYmxlLgorCisJbwlUaGUgdHlwZSBgdW5zaWduZWQnIGlzIHZhbGlkLgorCitIb3dldmVyLCB0aGUgdXNlciBzaG91bGQgYmUgYXdhcmUgb2YgdGhlIGZvbGxvd2luZzoKKworCW8JR0NDJ3MgYDxudW1iZXI+TEwnIGlzIE5PVCBhY2NlcHRhYmxlLgorCQlNaWNyb3NvZnQtQyBkb2Vzbid0IHJlY29uaXplIGl0LgorCisJbwlNU0MncyBgPG51bWJlcj5pNjQnIGlzIE5PVCBhY2NlcHRhYmxlLgorCQlHQ0MgZG9lc24ndCByZWNvbml6ZSBpdC4KKworCW8JR0NDJ3MgYGxvbmcgbG9uZycgTVNDJ3MgYF9pbnQ2NCcgY2FuCisJCU5PVCBiZSB1c2VkIHRvIGRlZmluZSA2NCBiaXQgaW50ZWdlciBkYXRhCisJCXR5cGVzLgorCisJbwlBbiBlbXB0eSBhcnJheSAoZWcgaW50IGFbMF0pIGlzIG5vdCB2YWxpZC4KKworV2hlbiBidWlsZGluZyB3aXRoIEdDQyBpdCBpcyBlZmZlY3Rpdmx5IGEgcmVxdWlyZW1lbnQgdGhhdAorLS1lbmFibGUtYnVpbGQtd2FybmluZ3M9LC1XZXJyb3IgYmUgc3BlY2lmaWVkIGR1cmluZyBjb25maWd1cmF0aW9uLgorDAorImR1bXAiIGNvbW1hbmRzIHVuZGVyIGdkYgorPT09PT09PT09PT09PT09PT09PT09PT09PQorCitnZGJpbml0LmluIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKKworZGVmaW5lIGR1bXAKK3NldCBzaW1fZGVidWdfZHVtcCAoKQorZW5kCisKK1NpbXVsYXRvcnMgdGhhdCBkZWZpbmUgdGhlIHNpbV9kZWJ1Z19kdW1wIGZ1bmN0aW9uIGNhbiB0aGVuIGhhdmUgdGhlaXIKK2ludGVybmFsIHN0YXRlIHByZXR0eSBwcmludGVkIGZyb20gZ2RiLgorCitGSVhNRTogVGhpcyBjYW4gb2J2aW91c2x5IGJlIG1hZGUgbW9yZSBlbGFib3JhdGUuICBBcyBuZWVkZWQgaXQgd2lsbCBiZS4KKwwKK1JlYnVpbGRpbmcgbmx0dmFscy5kZWYKKz09PT09PT09PT09PT09PT09PT09PT0KKworQ2hlY2tvdXQgYSBjb3B5IG9mIHRoZSBTSU0gYW5kIExJQkdMT1NTIG1vZHVsZXMgKFVubGVzcyB5b3UndmUgYWxyZWFkeQorZ290IG9uZSB0byBoYW5kKToKKworCSQgIG1rZGlyIC90bXAvJCQKKwkkICBjZCAvdG1wLyQkCisJJCAgY3ZzIGNoZWNrb3V0IHNpbS1uby10ZXN0c3VpdGUgbGliZ2xvc3Mtbm8tdGVzdHN1aXRlIG5ld2xpYi1uby10ZXN0c3VpdGUKKworQ29uZmlndXJlIHRoaW5ncyBmb3IgYW4gYXJiaXRyYXJ5IHNpbXVsYXRvciB0YXJnZXQgKEkndmUgZDEwdiBmb3IKK2NvbnZlbmllbmNlKToKKworCSQgIG1rZGlyIC90bXAvJCQvYnVpbGQKKwkkICBjZCAvdG1wLyQkL2J1aWxkCisJJCAgL3RtcC8kJC9kZXZvL2NvbmZpZ3VyZSAtLXRhcmdldD1kMTB2LWVsZgorCitJbiB0aGUgc2ltL2NvbW1vbiBkaXJlY3RvcnkgcmVidWlsZCB0aGUgaGVhZGVyczoKKworCSQgIGNkIHNpbS9jb21tb24KKwkkICBtYWtlIGhlYWRlcnMKKworVG8gYWRkIGEgbmV3IHRhcmdldDoKKworCWRldm8vc2ltL2NvbW1vbi9nZW5ubHR2YWxzLnNoCisKKwkJQWRkIHlvdXIgbmV3IHByb2Nlc3NvciB0YXJnZXQgKHlvdSdsbCBuZWVkIHRvIGdydWIKKwkJYXJvdW5kIHRvIGZpbmQgd2hlcmUgeW91ciBzeXNjYWxsLmggbGl2ZXMpLgorCisJZGV2by9zaW0vPHByb2Nlc3Nvcj4vTWFrZWZpbGUuaW4KKworCQlBZGQgdGhlIGRlZmluaXRpb246CisKKwkJCWBgTkxfVEFSR0VUID0gLUROTF9UQVJHRVRfZDEwdicnCisKKwkJanVzdCBiZWZvcmUgdGhlIGxpbmUgQ09NTU9OX1BPU1RfQ09ORklHX0ZSQUcuCisKKwlkZXZvL3NpbS88cHJvY2Vzc29yPi8qLltjaF0KKworCQlJbmNsdWRlIHRhcmctdmFscy5oIGluc3RlYWQgb2Ygc3lzY2FsbC5oLgorCmRpZmYgLS1naXQgYS9zaW0vYXJtL0NPUFlJTkcgYi9zaW0vYXJtL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1NDliZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9hcm0vQ09QWUlORwpAQCAtMCwwICsxLDM0MCBAQAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9zaW0vYXJtL0NoYW5nZUxvZyBiL3NpbS9hcm0vQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNDkzNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vYXJtL0NoYW5nZUxvZwpAQCAtMCwwICsxLDQyNiBAQAorTW9uIFNlcCAxNCAwOTowMDowNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiB3cmFwcGVyLmMgKHNpbV9vcGVuKTogU2V0IGVuZGlhbm5lc3MgYWNjb3JkaW5nIHRvIEJGRCBvciBjb21tYW5kCisJbGluZSBzd2l0Y2guCisKKwkqIHRjb25maWcuaW46IERlZmluZSBTSU1fSEFWRV9CSUVORElBTi4KKworVGh1IEF1ZyAyNyAxMTowMDowNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBhcm1lbXUuYyAoTXVsdGlwbHk2NCk6IFRlc3QgZm9yIFJtIChyYXRoZXIgdGhhbiBScykgbm90IGJlaW5nCisJdGhlIHNhbWUgYXMgZWl0aGVyIFJkSGkgb3IgUmRMby4KKworVGh1IEp1bCAgMiAxMDoyNDozNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBhcm1vcy5jIChBUk11bF9PU0hhbmRsZVNXSTogQW5nZWxTV0lfUmVhc29uX1JlcG9ydEV4Y2VwdGlvbik6CisJU2V0IFJlZ1swXSBiYXNlZCBvbiByZWFzb24gZm9yIGZvciB0aGUgZXhjZXB0aW9uLgorCitUaHUgSnVuICA0IDE1OjIyOjAzIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBhcm1vcy5jIChTV0l3cml0ZTApOiBOZXcgZnVuY3Rpb24uCisJKFdyaXRlQ29tbWFuZExpbmVUbyk6IE5ldyBmdW5jdGlvbi4KKwkoU1dJb3Blbik6IE5ldyBmdW5jdGlvbi4KKwkoU1dJcmVhZCk6IE5ldyBmdW5jdGlvbi4KKwkoU1dJd3JpdGUpOiBOZXcgZnVuY3Rpb24uCisJKFNXSWZsZW4pOiBOZXcgZnVuY3Rpb24uCisJKEFSTXVsX09TSGFuZGxlU1dJKTogQ2FsbCBuZXcgZnVuY3Rpb25zIGluc3RlYWQgb2YgaGFuZGxpbmcJCisJdGhlc2UgaGVyZS4KKwkoQVJNdWxfT1NIYW5kbGVTV0kpOiBIYW5kbGUgQW5nZWwgU1dJcyBjb3JyZWN0bHkuCisJKCopOiBSZWZvcm1hdCBzcGFjaW5nIHRvIGJlIGEgYml0IG1vcmUgR05VbHkuCisJTW9zdCBjb2RlIHRha2VuIGZyb20gYSBwYXRjaCBieSBBbnRob255IFRob21wc29uIAorCShhdGhvbXBzb0BjYW1icmlkZ2UuYXJtLmNvbSkKKworVHVlIEp1biAgMiAxNToyMjoyMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBhcm1vcy5oOiBBZGQgQW5nZWwgU1dJIGFuZCBpdHMgcmVhc29uIGNvZGVzLgorCSogYXJtb3MuYyAoQVJNdWxfT1NIYW5kbGVTV0kpOiBJZ25vcmUgQW5nZWwgU1dJcyAoZm9yIG5vdykuCisKK01vbiBKdW4gIDEgMTc6MTQ6MTkgMTk5OCAgQW50aG9ueSBUaG9tcHNvbiAoYXRob21wc29AY2FtYnJpZGdlLmFybS5jb20pCisKKwkqIGFybW9zLmMgKEFSTXVsX09TSGFuZGxlU1dJOjpTV0lfT3Blbik6IEhhbmRsZSBzcGVjaWFsIGNhc2UKKwlvZiAiOnR0IiB0byBjYXRjaCBzdGRpbiBpbiBhZGRpdGlvbiB0byBzdGRvdXQuCisJKEFSTXVsX09TSGFuZGxlU1dJOjpTV0lfU2Vlayk6IFJldHVybiAwIG9yIDEgdG8gaW5kaWNhdGUgZmFpbHVyZQorCW9yIHN1Y2Nlc3Mgb2YgbHNlZWsoKS4KKworV2VkIE1heSAyMCAxNzozNjoyNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBhcm1vcy5jIChBUk11bF9PU0hhbmRsZVNXSSk6IFNwZWNpYWwgY2FzZSBjb2RlIHRvIGNhdGNoIGF0dGVtcHRzCisJdG8gb3BlbiBzdGRvdXQuCisKK1dlZCBBcHIgMjkgMTU6Mjk6NTUgMTk5OCAgSmVmZiBKb2huc3RvbiAgPGpqb2huc3RuQGN5Z251cy5jb20+CisKKwkqIGFybW9zLmMgKEFSTXVsX09TSGFuZGxlU1dJKTogQWRkZWQgY29kZSBmb3IgU1dJX0Nsb2NrLAorCVNXSV9GbGVuLCBhbmQgU1dJX1RpbWUuICBBbHNvIGZpeGVkIFNXSV9TZWVrIGNvZGUgdG8gb25seQorCXNlZWsgZnJvbSBvZmZzZXQgMCBhbmQgbm90IHRvIHVzZSBSMiBmb3Igd2hlbmNlIHNpbmNlIGl0IGlzCisJbm90IHBhc3NlZCBhcyBwYXJ0IG9mIHRoZSBTV0kgY2FsbC4KKworVHVlIEFwciAyOCAxODozMzozMSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1N1biBBcHIgMjYgMTU6MzE6NTUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1N1biBBcHIgMjYgMTU6MjA6MjYgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZ3VyZS5pbjogUmV2ZXJ0ZWQgY2hhbmdlIG9mIEFwciAyNDsgdXNlIHNpbmNsdWRlIGFnYWluLgorCitGcmkgQXByIDI0IDE0OjE2OjQwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitGcmkgQXByIDI0IDExOjIwOjE5IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEb24ndCBjYWxsIHNpbmNsdWRlLgorCitTYXQgQXByICA0IDIwOjM2OjI1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitGcmkgTWFyIDI3IDE2OjE1OjUyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgTWFyIDI1IDEyOjM1OjI5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgTWFyIDE4IDEyOjM4OjEyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgTWFyIDEwIDA5OjI2OjM4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGFybW9wdHMuaDogUmVtb3ZlIGRlZmluaXRpb24gb2YgTElUVExFTkQgLSBpdCBpcyBub3QgdXNlZC4KKworVHVlIEZlYiAxNyAxMjozNTo1NCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHdyYXBwZXIuYyAoc2ltX3N0b3JlX3JlZ2lzdGVyLCBzaW1fZmV0Y2hfcmVnaXN0ZXIpOiBQYXNzIGluCisgCWxlbmd0aCBwYXJhbWV0ZXIuIFJldHVybiAtMS4KKworU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIEphbiAxOSAyMjoyNjoyOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmE+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIERlYyAxNSAyMzoxNzoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1R1ZSBEZWMgIDkgMTE6MzA6NDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IFVwZGF0ZWQgd2l0aCBjaGFuZ2VzIGZyb20gYnJhbmNoLgorCSogYXJtZGVmcy5oOiAgIGRpdHRvCisJKiBhcm1lbXUuYzogICAgZGl0dG8gICB0aGVzZSBjaGFuZ2VzCisJKiBhcm1lbXUuaDogICAgZGl0dG8gICBhZGQgc3VwcG9ydCBmb3IKKwkqIGFybW9zLmM6ICAgICBkaXR0byAgIHRoZSBUaHVtYiBpbnN0cnVjdGlvbgorCSogYXJtc3VwcC5jOiAgIGRpdHRvICAgc2V0IGFuZCB0aGUgbmV3IHY0CisJKiBhcm12aXJ0LmM6ICAgZGl0dG8gICBhcmNoaXRlY3R1cmUuCisJKiB3cmFwcGVyLmM6ICAgZGl0dG8KKwkqIHRodW1iZW11LmM6ICBOZXcgZmlsZSBmcm9tIGJyYW5jaC4KKworCitUaHUgRGVjICA0IDA5OjIxOjA1IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVGh1IE9jdCAzMCAxMzo1NDowNiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBhcm1vcy5jIChBUk11bF9PU0hhbmRsZVNXSSk6IEFkZCBzdXBwb3J0IGZvciBHZXRFbnYgU1dJLiAgUGF0Y2gKKwlmcm9tIFRvbnkgVGhvbXBzb24gYXQgQVJNOiBhdGhvbXBzb0Bhcm0uY29tIAorCisJKiB3cmFwcGVyLmMgKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBBZGQgY29kZSB0byBjcmVhdGUgYW4gZXhlY3V0aW9uCisJZW52aXJvbm1lbnQuICBQYXRjaCBmcm9tIFRvbnkgVGhvbXBzb24gYXQgQVJNOiBhdGhvbXBzb0Bhcm0uY29tCisKK1dlZCBPY3QgMjIgMTQ6NDM6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiB3cmFwcGVyLmMgKHNpbV9sb2FkKTogUGFzcyBsbWFfcCBhbmQgc2ltX3dyaXRlIGFyZ3MgdG8KKyAJc2ltX2xvYWRfZmlsZS4KKworRnJpIE9jdCAgMyAwOToyODowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIFNlcCAyNCAxNzozODo1NyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVHVlIFNlcCAyMyAxMTowNDozOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIFNlcCAyMiAxMTo0NjoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworRnJpIFNlcCAxOSAxNzo0NToyNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIFNlcCAxNSAxNzozNjoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVGh1IFNlcCAgNCAxNzoyMToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmE+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIEF1ZyAyNyAxODoxMzoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1R1ZSBBdWcgMjYgMTA6Mzc6MjcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiB3cmFwcGVyLmMgKHNpbV9raWxsKTogRGVsZXRlLgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogQWRkIEFCRkQgYXJndW1lbnQuCisJKHNpbV9sb2FkKTogTW92ZSBzZXR0aW5nIG9mIFBDIGZyb20gaGVyZS4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFRvIGhlcmUuCisKK01vbiBBdWcgMjUgMTc6NTA6MjIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitNb24gQXVnIDI1IDE1OjM1OjQ1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogd3JhcHBlci5jIChzaW1fb3Blbik6IEFkZCBBQkZEIGFyZ3VtZW50LgorCitUdWUgTWF5IDIwIDEwOjEzOjI2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogd3JhcHBlci5jIChzaW1fb3Blbik6IEFkZCBjYWxsYmFjayBhcmd1bWVudC4KKwkoc2ltX3NldF9jYWxsYmFja3MpOiBEcm9wIFNJTV9ERVNDIGFyZ3VtZW50LgorCitUaHUgQXByIDI0IDAwOjM5OjUxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworRnJpIEFwciAxOCAxMzozMjoyMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHdyYXBwZXIuYyAoc2ltX3N0b3ApOiBTdHViIHNpbV9zdG9wIGZ1bmN0aW9uLgorCitUaHUgQXByIDE3IDE4OjMzOjAxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBhcm1pbml0LmMgKEFSTXVsX05ld1N0YXRlKTogUHJlaW5pdGlhbGl6ZSB0aGUgc3RhdGUgdG8KKwlhbGwgemVyby9OVUxMLgorCitUaHUgQXByIDE3IDAyOjM5OjAyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbG9hZC5vLgorCSogd3JhcHBlci5jIChzaW1fa2luZCxteW5hbWUpOiBOZXcgc3RhdGljIGxvY2Fscy4KKwkoc2ltX29wZW4pOiBTZXQgc2ltX2tpbmQsIG15bmFtZS4KKwkoc2ltX2xvYWQpOiBDYWxsIHNpbV9sb2FkX2ZpbGUgdG8gZG8gd29yay4gIFNldCBzdGFydCBhZGRyZXNzIGZyb20gYmZkLgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogUmV0dXJuIFNJTV9SQy4gIERlbGV0ZSBzdGFydF9hZGRyZXNzIGFyZy4KKworVGh1IEFwciAxNyAxMTo0ODoyNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHdyYXBwZXIuYyAoc2ltX3RyYWNlKTogVXBkYXRlIHNvIHRoYXQgaXQgbWF0Y2hlcyBwcm90b3R5cGUuCisKK01vbiBBcHIgIDcgMTU6NDU6MDIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK01vbiBBcHIgIDcgMTI6MDE6MTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChhcm1lbXUzMi5vKTogUmVwbGFjZSAkPCB3aXRoIGF1dG9jb25mIHJlY29tbWVuZGVkCisgCSQoc3JjZGlyKS8uLi4uCisJKGFybWVtdTI2Lm8pOiBEaXR0by4KKworV2VkIEFwciAgMiAxNTowNjoyOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiB3cmFwcGVyLmMgKHNpbV9vcGVuKTogTmV3IGFyZyBga2luZCcuCisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIEFwciAgMiAxNDo1MDo0NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIENPUFlJTkc6IFVwZGF0ZSBGU0YgYWRkcmVzcy4KKworV2VkIEFwciAgMiAxNDozNDoxOSAxOTk3IEFuZHJldyBDYWduZXkgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIE1hciAxOSAwMToxNDowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gTWFyIDE3IDE1OjEwOjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgorCitGcmkgTWFyIDE0IDEwOjM0OjExIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVGh1IE1hciAxMyAxMjozODo1NiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiB3cmFwcGVyLmMgKHNpbV9vcGVuKTogSGFzIHJlc3VsdCBub3cuCisJKHNpbV8qKTogTmV3IFNJTV9ERVNDIGFyZ3VtZW50LgorCitUdWUgRmViICA0IDEzOjIyOjIxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChAQ09NTU9OX01BS0VGSUxFX0ZSQUdAKTogVXNlCisJQ09NTU9OX3tQUkUsUE9TVH1fQ09ORklHX0ZSQUcgaW5zdGVhZC4KKwkqIGNvbmZpZ3VyZS5pbjogc2luY2x1ZGUgLi4vY29tbW9uL2FjbG9jYWwubTQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitUaHUgSmFuIDIzIDExOjQ2OjIzIDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4gTWFrZWZpbGUuaW46ICBVcGRhdGUgdG8gbmV3IGNvbmZpZ3VyZQorCXNjaGVtZSB3aGljaCBpcyBtb3JlIGNvbXBhdGlibGUgd2l0aCBXaW5HREIgYnVpbGRzLgorCSogY29uZmlndXJlLmluOiAgSW1wcm92ZSBjb21tZW50IG9uIGhvdyB0byBydW4gYXV0b2NvbmYuCisJKiBjb25maWd1cmU6ICBSZS1ydW4gYXV0b2NvbmYgdG8gZ2V0IG5ldyAuLi9jb21tb24vYWNsb2NhbC5tNC4KKwkqIE1ha2VmaWxlLmluOiAgVXNlIGF1dG9jb25mIHN1YnN0aXR1dGlvbiB0byBpbnN0YWxsIGNvbW1vbgorCW1ha2VmaWxlIGZyYWdtZW50LgorCitXZWQgTm92IDIwIDAxOjA1OjEwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHJ1bi5jOiBEZWxldGVkLCB1c2Ugb25lIGluIC4uL2NvbW1vbiBub3cuCisJKiBNYWtlZmlsZS5pbjogRGVsZXRlIGV2ZXJ5dGhpbmcgdGhhdCdzIGJlZW4gbW92ZWQgdG8KKwkuLi9jb21tb24vTWFrZS1jb21tb24uaW4uCisJKFNJTV9PQkpTKTogRGVmaW5lLgorCSogY29uZmlndXJlLmluOiBTaW1wbGlmeSB1c2luZyBtYWNyb3MgaW4gLi4vY29tbW9uL2FjbG9jYWwubTQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogY29uZmlnLmluOiBOZXcgZmlsZS4KKwkqIGFybW9zLmM6ICNpbmNsdWRlIGNvbmZpZy5oLgorCSogd3JhcHBlci5jIChtZW1fc2l6ZSk6IFZhbHVlIGlzIGluIGJ5dGVzIG5vdy4KKwkoc2ltX2NhbGxiYWNrKTogTmV3IGdsb2JhbC4KKwkoYXJtX3NpbV9zZXRfcHJvZmlsZXssX3NpemV9KTogRGVsZXRlLgorCShhcm1fc2ltX3NldF9tZW1fc2l6ZSk6IFJlbmFtZSB0byBzaW1fc2l6ZS4KKwkoc2ltX2RvX2NvbW1hbmQpOiBDYWxsIHByaW50Zl9maWx0ZXJlZCB2aWEgY2FsbGJhY2suCisJKHNpbV9zZXRfY2FsbGJhY2tzKTogUmVjb3JkIGNhbGxiYWNrLgorCitUaHUgT2N0ICAzIDE2OjEwOjI3IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKwkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgorCitXZWQgSnVuIDI2IDEyOjE3OjI0IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKyAgICAgICAgKiBNYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgaW5jbHVkZWRpciwKKyAgICAgICAgSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYtc2V0IHZhbHVlcy4KKyAgICAgICAgKGRvY2Rpcik6IFJlbW92ZWQuCisgICAgICAgICogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBhdXRvY29uZiAyLjUgb3IgaGlnaGVyLgorICAgICAgICAoQUNfUFJPR19JTlNUQUxMKTogQWRkZWQuCisgICAgICAgICogY29uZmlndXJlOiBSZWJ1aWx0LgorCitXZWQgRmViIDIxIDEyOjE0OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi43LgorCitGcmkgRGVjIDE1IDE2OjI3OjMwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogcnVuLmMgKG1haW4pOiBVc2UgbmV3IGJmZF9iaWdfZW5kaWFuIG1hY3JvLgorCitNb24gTm92IDIwIDE3OjQwOjM4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHJ1bi5jOiBJbmNsdWRlICJnZXRvcHQuaCIuCisJKHZlcmJvc2UpOiBEZWxldGUuCisJKHVzYWdlKTogTWFrZSBzdGF0aWMuCisJKG1haW4pOiBDYWxsIGFybV9zaW1fc2V0X3ZlcmJvc2l0eS4KKwlPbmx5IGxvYWQgc2VjdGlvbnMgbWFya2VkIFNFQ19MT0FELgorCSogd3JhcHBlci5jIChtZW1fc2l6ZSwgdmVyYm9zaXR5KTogTmV3IHN0YXRpYyBnbG9iYWwuCisJKGFybV9zaW1fc2V0X21lbV9zaXplKTogUmVuYW1lZCBmcm9tIHNpbV9zaXplLglDYWxsZXJzIHVwZGF0ZWQuCisJKGFybV9zaW1fc2V0X3Byb2ZpbGV7LF9zaXplfSk6IFJlbmFtZWQgZnJvbSBzaW1fZm9vLiAgQ2FsbGVycyB1cGRhdGVkLgorCQorRnJpIE5vdiAxNyAxOTozNToxMSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBhcm1kZWZzLmggKEFSTXVsX1N0YXRlKTogTmV3IG1lbWJlciBgdmVyYm9zZScuCisJKiBhcm1yZGkuYyAoQVJNdWxfQ29uc29sZVByaW50KTogQWRkIG1pc3NpbmcgdmFfZW5kLgorCSogcnVuLmMgKHZlcmJvc2UpOiBNYWtlIGdsb2JhbC4KKwkqIHdyYXBwZXIuYyAoaW5pdCk6IFNldCBzdGF0ZS0+dmVyYm9zZS4KKwkoQVJNdWxfQ29uc29sZVByaW50KTogRG9uJ3QgcHJpbnQgYW55dGhpbmcgaWYgIXZlcmJvc2UuCisKK0ZyaSBPY3QgMTMgMTU6MzA6MzAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogYXJtb3MuYzogI2luY2x1ZGUgZGJnX3JkaS5oLgorCShBUk11bF9PU0hhbmRsZVNXSSk6IEhhbmRsZSBTV0lfQnJlYWtwb2ludC4KKwkqIGFybW9zLmggKFNXSV9CcmVha3BvaW50KTogRGVmaW5lLgorCSogd3JhcHBlci5jOiAjaW5jbHVkZSBhcm1lbXUuaCwgZGJnX3JkaS5oLgorCShyYyk6IERlbGV0ZS4KKwkoc2ltX3Jlc3VtZSk6IFVzZSBzdGF0ZS0+RW5kQ29uZGl0aW9uIHRvIHJlY29yZCBzdG9wIHN0YXRlLgorCUNhbGwgRkxVU0hQSVBFIGJlZm9yZSByZXR1cm5pbmcuCisJKHNpbV9zdG9wX3JlYXNvbik6IERldGVybWluZSByZWFzb24gZnJvbSBzdGF0ZS0+RW5kQ29uZGl0aW9uLgorCitGcmkgT2N0IDEzIDE1OjA0OjA1IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIHdyYXBwZXIuYyAoc2ltX3NldF9jYWxsYmFja3MpOiBOZXcuCisKK1RodSBTZXAgMjggMTk6NDU6NTYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgorCisJKiBhcm1vcy5jIChBUk11bF9PU0hhbmRsZVNXSSk6IFJlc3VsdCBvZiByZWFkL3dyaXRlIGNhbGxzIGlzCisJbnVtYmVyIG9mIGJ5dGVzIG5vdCByZWFkL3dyaXR0ZW4gKG9yIC0xKS4KKworV2VkIFNlcCAyMCAxMzozNTo1NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIHJlYWxjbGVhbi4KKworRnJpIFNlcCAgOCAxNDoyNzoyMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIEFDX1BST0dfSU5TVEFMTC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogUmV2ZXJ0IHRvIHVzaW5nIGluc3RhbGwuc2guCisJKElOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogU2V0IHRvICQoSU5TVEFMTCkuCisJKElOU1RBTExfWEZPUk0sIElOU1RBTExfWEZPUk0xKTogUmVzdG9yZS4KKwkobW9zdGx5Y2xlYW4pOiBNYWtlIHRoZSBzYW1lIGFzIGNsZWFuLCBub3QgZGlzdGNsZWFuLgorCShjbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgorCShpbnN0YWxsKTogRG9uJ3QgaW5zdGFsbCBpbiAkKHRvb2xkaXIpLgorCitUaHUgU2VwICA3IDEyOjAwOjE3IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkoVHJ5IHRvKSBVcGRhdGUgdG8gbmV3IGJmZCBhdXRvY29uZiBzY2hlbWUuCisJKiBydW4uYzogRG9uJ3QgaW5jbHVkZSBzeXNkZXAuaC4KKwkqIE1ha2VmaWxlLmluIChJTlNUQUxMeyxfUFJPR1JBTSxfREFUQX0pOiBVc2UgYXV0b2NvbmYgY29tcHV0ZWQgdmFsdWUuCisJKENDLCBDRkxBR1MsIEFSLCBSQU5MSUIpOiBMaWtld2lzZS4KKwkoSERFRklORVMsIFRERUZJTkVTKTogRGVmaW5lLgorCShDQ19GT1JfQlVJTEQpOiBEZWxldGUuCisJKGhvc3RfbWFrZWZpbGVfZnJhZyk6IERlbGV0ZS4KKwkoTWFrZWZpbGUpOiBEb24ndCBkZXBlbmQgb24gZnJhZ3MuCisJKiBjb25maWd1cmUuaW4gKHN5c2RlcC5oKTogRG9uJ3QgY3JlYXRlIHN5bWxpbmsuCisJKGhvc3RfbWFrZWZpbGVfZnJhZywgZnJhZ3MpOiBEZWxldGVkLgorCShDQywgQ0ZMQUdTLCBBUiwgUkFOTElCLCBJTlNUQUxMKTogQ29tcHV0ZSB2YWx1ZXMuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitUaHUgQXVnICAzIDEwOjQ1OjM3IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBVcGRhdGUgYWxsIEZTRiBhZGRyZXNzZXMgZXhjZXB0IHRob3NlIGluIENPUFlJTkcqIGZpbGVzLgorCitXZWQgSnVsICA1IDE2OjE1OjU0IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogUmVtb3ZlIHJ1biwgbGlic2ltLmEuCisKKyAJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBjb252ZXJ0ZWQgdG8gYXV0b2NvbmYuCisJKiBjb25maWd1cmU6IE5ldyBmaWxlLCBnZW5lcmF0ZWQgd2l0aCBhdXRjb25mIDIuNC4KKworCSogYXJtLm10OiBSZW1vdmVkLgorCitGcmkgSnVuIDMwIDE2OjQ5OjQ3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogd3JhcHBlci5jIChzaW1fZG9fY29tbWFuZCk6IE5ldyBmdW5jdGlvbi4KKworVHVlIEp1biAxMyAxMDo1NzozMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBhcm1vcy5jIChBUk11bF9PU0hhbmRsZVNXSSk6IE5ldyB2ZXJzaW9uIHRvIHdvcmsgd2l0aAorCW5ld2xpYiBzaW1wbHkuCisKK1RodSBKdW4gIDggMTQ6Mzc6MTQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogcnVuLmMgKG1haW4pOiBHcmFiIHJldHVybiB2YWx1ZSBmcm9tIHJpZ2h0IHJlZ2lzdGVyLgorCitXZWQgTWF5IDI0IDE0OjM3OjMxIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIE5ldy4KKworCmRpZmYgLS1naXQgYS9zaW0vYXJtL01ha2VmaWxlLmluIGIvc2ltL2FybS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmFlMmFmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2FybS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDQ4IEBACisjICAgIE1ha2VmaWxlIHRlbXBsYXRlIGZvciBDb25maWd1cmUgZm9yIHRoZSBhcm0gc2ltIGxpYnJhcnkuCisjICAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworIyMgQ09NTU9OX1BSRV9DT05GSUdfRlJBRworCitTSU1fRVhUUkFfQ0ZMQUdTID0gLURNT0RFVAorCitTSU1fT0JKUyA9IGFybWNvcHJvLm8gYXJtZW11MjYubyBhcm1lbXUzMi5vIGFybWluaXQubyBhcm1vcy5vIGFybXN1cHAubyBcCisJYXJtdmlydC5vIGJhZy5vIHRodW1iZW11Lm8gd3JhcHBlci5vIHNpbS1sb2FkLm8KKworIyMgQ09NTU9OX1BPU1RfQ09ORklHX0ZSQUcKKworCithcm1vcy5vOiBhcm1vcy5jIGFybWRlZnMuaCBhcm1vcy5oIGFybWZwZS5oCisKK2FybWNvcHJvLm86IGFybWNvcHJvLmMgYXJtZGVmcy5oIAorCithcm1lbXUyNi5vOiBhcm1lbXUuYyBhcm1kZWZzLmggYXJtZW11LmggCisJJChDQykgLWMgJDwgLW8gYXJtZW11MjYubyAkKEFMTF9DRkxBR1MpCisKK2FybWVtdTMyLm86IGFybWVtdS5jIGFybWRlZnMuaCBhcm1lbXUuaAorCSQoQ0MpIC1jICQ8IC1vIGFybWVtdTMyLm8gLURNT0RFMzIgJChBTExfQ0ZMQUdTKQorCithcm1pbml0Lm86IGFybWluaXQuYyBhcm1kZWZzLmggYXJtZW11LmgKKworYXJtcmRpLm86IGFybXJkaS5jIGFybWRlZnMuaCBhcm1lbXUuaCBhcm1vcy5oIGRiZ19jcC5oIGRiZ19jb25mLmggZGJnX3JkaS5oIFwKKwlkYmdfaGlmLmggY29tbXVuaWNhdGUuaAorCithcm1zdXBwLm86IGFybXN1cHAuYyBhcm1kZWZzLmggYXJtZW11LmgKKwordGh1bWJlbXUubzogdGh1bWJlbXUuYyBhcm1kZWZzLmggYXJtZW11LmgKKworYmFnLm86IGJhZy5jIGJhZy5oCmRpZmYgLS1naXQgYS9zaW0vYXJtL1JFQURNRS5DeWdudXMgYi9zaW0vYXJtL1JFQURNRS5DeWdudXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRmYjc2NgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9hcm0vUkVBRE1FLkN5Z251cwpAQCAtMCwwICsxLDI3IEBACisKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBzdGFuZGFyZCByZWxlYXNlIG9mIHRoZSBBUk11bGF0b3IgZnJvbQorQWR2YW5jZWQgUklTQyBNYWNoaW5lcywgYW5kIHdhcyBmdHAnZCBmcm9tLgorCitmdHAuY2wuY2FtLmFjLnVrOi9hcm0vZ251CisKK0l0IGxpa2VzIHRvIHVzZSBUQ1AvSVAgYmV0d2VlbiB0aGUgc2ltdWxhdG9yIGFuZCB0aGUgaG9zdCwgd2hpY2ggaXMKK25pY2UsIGJ1dCBpcyBhIHBhaW4gdG8gdXNlIHVuZGVyIGFueXRoaW5nIG5vbi11bml4LgorCitJJ3ZlIGFkZGVkIGNyZWF0ZWQgYSBuZXcgTWFrZWZpbGUuaW4gKHRoZSBvcmlnaW5hbCBpbiBNYWtlZmlsZS5vcmlnKQordG8gYnVpbGQgYSB2ZXJzaW9uIG9mIHRoZSBzaW11bGF0b3Igd2l0aG91dCB0aGUgVENQL0lQIHN0dWZmLCBhbmQgYQord3JhcHBlci5jIHRvIGxpbmsgZGlyZWN0bHkgaW50byBnZGIgYW5kIHRoZSBydW4gY29tbWFuZC4KKworSXQgc2hvdWxkIGJlIHBvc3NpYmxlIChiYXJyaW5nIG1ham9yIGNoYW5nZXMgaW4gdGhlIGxheW91dCBvZgordGhlIGFybXVsYXRvcikgdG8gdXBncmFkZSB0aGUgc2ltdWxhdG9yIGJ5IGNvcHlpbmcgYWxsIHRoZSBmaWxlcworb3V0IG9mIGEgcmVsZWFzZSBpbnRvIHRoaXMgZGlyZWN0b3J5IGFuZCByZW5hbWluZyB0aGUgTWFrZWZpbGUuCisKKyhFeGNlcHQgdGhhdCBJIGNoYW5nZWQgYXJtb3MuYyB0byB3b3JrIG1vcmUgc2ltcGx5IHdpdGggb3VyCitzaW11bGF0b3IgcmlncykKKworU3RldmUKKworc2FjQGN5Z251cy5jb20KKworTW9uIE1heSAxNSAxMjowMzoyOCBQRFQgMTk5NQorCisKZGlmZiAtLWdpdCBhL3NpbS9hcm0vYWNjb25maWcuaCBiL3NpbS9hcm0vYWNjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWI4N2ExCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2FybS9hY2NvbmZpZy5oCkBAIC0wLDAgKzEsMTUgQEAKKworLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCisjdW5kZWYgRU5BQkxFX05MUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCisjdW5kZWYgSEFWRV9DQVRHRVRTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0dFVFRFWFQKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCisjdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwpkaWZmIC0tZ2l0IGEvc2ltL2FybS9hcm1jb3Byby5jIGIvc2ltL2FybS9hcm1jb3Byby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOTNhODYzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2FybS9hcm1jb3Byby5jCkBAIC0wLDAgKzEsMzU3IEBACisvKiAgYXJtY29wcm8uYyAtLSBjby1wcm9jZXNzb3IgaW50ZXJmYWNlOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLworCisjaW5jbHVkZSAiYXJtZGVmcy5oIgorCitleHRlcm4gdW5zaWduZWQgQVJNdWxfQ29Qcm9Jbml0KEFSTXVsX1N0YXRlICpzdGF0ZSkgOworZXh0ZXJuIHZvaWQgQVJNdWxfQ29Qcm9FeGl0KEFSTXVsX1N0YXRlICpzdGF0ZSkgOworZXh0ZXJuIHZvaWQgQVJNdWxfQ29Qcm9BdHRhY2goQVJNdWxfU3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk11bF9DUEluaXRzICppbml0LCBBUk11bF9DUEV4aXRzICpleGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNdWxfTERDcyAqbGRjLCBBUk11bF9TVENzICpzdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk11bF9NUkNzICptcmMsIEFSTXVsX01DUnMgKm1jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTXVsX0NEUHMgKmNkcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTXVsX0NQUmVhZHMgKnJlYWQsIEFSTXVsX0NQV3JpdGVzICp3cml0ZSkgOworZXh0ZXJuIHZvaWQgQVJNdWxfQ29Qcm9EZXRhY2goQVJNdWxfU3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBudW1iZXIpIDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdW1teSBDby1wcm9jZXNzb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1bnNpZ25lZCBOb0NvUHJvM1IoQVJNdWxfU3RhdGUgKnN0YXRlLHVuc2lnbmVkLEFSTXdvcmQpIDsKK3N0YXRpYyB1bnNpZ25lZCBOb0NvUHJvNFIoQVJNdWxfU3RhdGUgKnN0YXRlLHVuc2lnbmVkLEFSTXdvcmQsQVJNd29yZCkgOworc3RhdGljIHVuc2lnbmVkIE5vQ29Qcm80VyhBUk11bF9TdGF0ZSAqc3RhdGUsdW5zaWduZWQsQVJNd29yZCxBUk13b3JkICopIDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgRGVmaW5lIENvLVByb2Nlc3NvciBpbnN0cnVjdGlvbiBoYW5kbGVycyBoZXJlICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBIZXJlJ3MgQVJNdWxhdG9yJ3MgTU1VIGRlZmluaXRpb24uICBBIGZldyB0aGluZ3MgdG8gbm90ZToKKzEpIGl0IGhhcyBlaWdodCByZWdpc3RlcnMsIGJ1dCBvbmx5IHR3byBhcmUgZGVmaW5lZC4KKzIpIHlvdSBjYW4gb25seSBhY2Nlc3MgaXRzIHJlZ2lzdGVycyB3aXRoIE1DUiBhbmQgTVJDLgorMykgTU1VIFJlZ2lzdGVyIDAgKElEKSByZXR1cm5zIDB4NDE0NDAxMTAKKzQpIFJlZ2lzdGVyIDEgb25seSBoYXMgNCBiaXRzIGRlZmluZWQuICBCaXRzIDAgdG8gMyBhcmUgdW51c2VkLCBiaXQgNAorY29udHJvbHMgMzIvMjYgYml0IHByb2dyYW0gc3BhY2UsIGJpdCA1IGNvbnRyb2xzIDMyLzI2IGJpdCBkYXRhIHNwYWNlLAorYml0IDYgY29udHJvbHMgbGF0ZSBhYm9ydCB0aW1pbWcgYW5kIGJpdCA3IGNvbnRyb2xzIGJpZy9saXR0bGUgZW5kaWFuLgorKi8KKworc3RhdGljIEFSTXdvcmQgTU1VUmVnWzhdIDsKKworc3RhdGljIHVuc2lnbmVkIE1NVUluaXQoQVJNdWxfU3RhdGUgKnN0YXRlKQore01NVVJlZ1sxXSA9IHN0YXRlLT5wcm9nMzJTaWcgPDwgNCB8CisgICAgICAgICAgICAgc3RhdGUtPmRhdGEzMlNpZyA8PCA1IHwKKyAgICAgICAgICAgICBzdGF0ZS0+bGF0ZWFidFNpZyA8PCA2IHwKKyAgICAgICAgICAgICBzdGF0ZS0+YmlnZW5kU2lnIDw8IDcgOworIEFSTXVsX0NvbnNvbGVQcmludCAoc3RhdGUsICIsIE1NVSBwcmVzZW50IikgOworIHJldHVybihUUlVFKSA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBNTVVNUkMoQVJNdWxfU3RhdGUgKnN0YXRlLCB1bnNpZ25lZCB0eXBlLCBBUk13b3JkIGluc3RyLEFSTXdvcmQgKnZhbHVlKQore2ludCByZWcgPSBCSVRTKDE2LDE5KSAmIDcgOworCisgaWYgKHJlZyA9PSAwKQorICAgICp2YWx1ZSA9ICAweDQxNDQwMTEwIDsKKyBlbHNlCisgICAgKnZhbHVlID0gTU1VUmVnW3JlZ10gOworIHJldHVybihBUk11bF9ET05FKSA7CisgfQorCitzdGF0aWMgdW5zaWduZWQgTU1VTUNSKEFSTXVsX1N0YXRlICpzdGF0ZSwgdW5zaWduZWQgdHlwZSwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCB2YWx1ZSkKK3tpbnQgcmVnID0gQklUUygxNiwxOSkgJiA3IDsKKworIE1NVVJlZ1tyZWddID0gdmFsdWUgOworIGlmIChyZWcgPT0gMSkgeworICAgIHN0YXRlLT5wcm9nMzJTaWcgPSB2YWx1ZSA+PiA0ICYgMSA7CisgICAgc3RhdGUtPmRhdGEzMlNpZyA9IHZhbHVlID4+IDUgJiAxIDsKKyAgICBzdGF0ZS0+bGF0ZWFidFNpZyA9IHZhbHVlID4+IDYgJiAxIDsKKyAgICBzdGF0ZS0+YmlnZW5kU2lnID0gdmFsdWUgPj4gNyAmIDEgOworICAgIHN0YXRlLT5FbXVsYXRlID0gVFJVRSA7IC8qIGZvcmNlIEFSTXVsYXRvciB0byBub3RpY2UgdGhlc2Ugbm93ICEqLworICAgIH0KKyByZXR1cm4oQVJNdWxfRE9ORSkgOworIH0KKworCitzdGF0aWMgdW5zaWduZWQgTU1VUmVhZChBUk11bF9TdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIHJlZywgQVJNd29yZCAqdmFsdWUpCit7aWYgKHJlZyA9PSAwKQorICAgICp2YWx1ZSA9ICAweDQxNDQwMTEwIDsKKyBlbHNlIGlmIChyZWcgPCA4KQorICAgICp2YWx1ZSA9IE1NVVJlZ1tyZWddIDsKKyByZXR1cm4oVFJVRSkgOworIH0KKworc3RhdGljIHVuc2lnbmVkIE1NVVdyaXRlKEFSTXVsX1N0YXRlICpzdGF0ZSwgdW5zaWduZWQgcmVnLCBBUk13b3JkIHZhbHVlKQore2lmIChyZWcgPCA4KQorICAgIE1NVVJlZ1tyZWddID0gdmFsdWUgOworIGlmIChyZWcgPT0gMSkgeworICAgIHN0YXRlLT5wcm9nMzJTaWcgPSB2YWx1ZSA+PiA0ICYgMSA7CisgICAgc3RhdGUtPmRhdGEzMlNpZyA9IHZhbHVlID4+IDUgJiAxIDsKKyAgICBzdGF0ZS0+bGF0ZWFidFNpZyA9IHZhbHVlID4+IDYgJiAxIDsKKyAgICBzdGF0ZS0+YmlnZW5kU2lnID0gdmFsdWUgPj4gNyAmIDEgOworICAgIHN0YXRlLT5FbXVsYXRlID0gVFJVRSA7IC8qIGZvcmNlIEFSTXVsYXRvciB0byBub3RpY2UgdGhlc2Ugbm93ICEqLworICAgIH0KKyByZXR1cm4oVFJVRSkgOworIH0KKworCisvKiBXaGF0IGZvbGxvd3MgaXMgdGhlIFZhbGlkYXRpb24gU3VpdGUgQ29wcm9jZXNzb3IuICBJdCB1c2VzIHR3bworY28tcHJvY2Vzc29yIG51bWJlcnMgKDQgYW5kIDUpIGFuZCBoYXMgdGhlIGZvbGx3aW5nIGZ1bmN0aW9uYWxpdHkuCitTaXh0ZWVuIHJlZ2lzdGVycy4gIEJvdGggY28tcHJvY2Vzc29yIG51aW1iZXJzIGNhbiBiZSB1c2VkIGluIGFuIE1DUiBhbmQKK01SQyB0byBhY2Nlc3MgdGhlc2UgcmVnaXN0ZXJzLiAgQ1AgNCBjYW4gTERDIGFuZCBTVEMgdG8gYW5kIGZyb20gdGhlCityZWdpc3RlcnMuICBDUCA0IGFuZCBDUCA1IENEUCAwIHdpbGwgYnVzeSB3YWl0IGZvciB0aGUgbnVtYmVyIG9mIGN5Y2xlcworc3BlY2lmaWVkIGJ5IGEgQ1AgcmVnaXN0ZXIuICBDUCA1IENEUCAxIGlzc3VlcyBhIEZJUSBhZnRlciBhIG51bWJlciBvZgorY3ljbGVzIChzcGVjaWZpZWQgaW4gYSBDUCByZWdpc3RlciksIENEUCAyIGlzc3VlcyBhbiBJUlFXIGluIHRoZSBzYW1lCit3YXksIENEUCAzIGFuZCA0IHR1cm4gb2YgdGhlIEZJUSBhbmQgSVJRIHNvdXJjZSwgYW5kIENEUCA1IHN0b3JlcyBhIDMyCitiaXQgdGltZSB2YWx1ZSBpbiBhIENQIHJlZ2lzdGVyIChhY3R1YWxseSBpdCdzIHRoZSB0b3RhbCBudW1iZXIgb2YgTiwgUywKK0ksIEMgYW5kIEYgY3lsZXMpICovCisKK3N0YXRpYyBBUk13b3JkIFZhbFJlZ1sxNl0gOworCitzdGF0aWMgdW5zaWduZWQgVmFsTERDKEFSTXVsX1N0YXRlICpzdGF0ZSwgdW5zaWduZWQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNd29yZCBpbnN0ciwgQVJNd29yZCBkYXRhKQore3N0YXRpYyB1bnNpZ25lZCB3b3JkcyA7CisKKyBpZiAodHlwZSAhPSBBUk11bF9EQVRBKSB7CisgICAgd29yZHMgPSAwIDsKKyAgICByZXR1cm4oQVJNdWxfRE9ORSkgOworICAgIH0KKyBpZiAoQklUKDIyKSkgeyAvKiBpdCdzIGEgbG9uZyBhY2Nlc3MsIGdldCB0d28gd29yZHMgKi8KKyAgICBWYWxSZWdbQklUUygxMiwxNSldID0gZGF0YSA7CisgICAgaWYgKHdvcmRzKysgPT0gNCkKKyAgICAgICByZXR1cm4oQVJNdWxfRE9ORSkgOworICAgIGVsc2UKKyAgICAgICByZXR1cm4oQVJNdWxfSU5DKSA7CisgICAgfQorIGVsc2UgeyAvKiBnZXQganVzdCBvbmUgd29yZCAqLworICAgIFZhbFJlZ1tCSVRTKDEyLDE1KV0gPSBkYXRhIDsKKyAgICByZXR1cm4oQVJNdWxfRE9ORSkgOworICAgIH0KKyB9CisKK3N0YXRpYyB1bnNpZ25lZCBWYWxTVEMoQVJNdWxfU3RhdGUgKnN0YXRlLCB1bnNpZ25lZCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBUk13b3JkIGluc3RyLCBBUk13b3JkICpkYXRhKQore3N0YXRpYyB1bnNpZ25lZCB3b3JkcyA7CisKKyBpZiAodHlwZSAhPSBBUk11bF9EQVRBKSB7CisgICAgd29yZHMgPSAwIDsKKyAgICByZXR1cm4oQVJNdWxfRE9ORSkgOworICAgIH0KKyBpZiAoQklUKDIyKSkgeyAvKiBpdCdzIGEgbG9uZyBhY2Nlc3MsIGdldCB0d28gd29yZHMgKi8KKyAgICAqZGF0YSA9IFZhbFJlZ1tCSVRTKDEyLDE1KV0gOworICAgIGlmICh3b3JkcysrID09IDQpCisgICAgICAgcmV0dXJuKEFSTXVsX0RPTkUpIDsKKyAgICBlbHNlCisgICAgICAgcmV0dXJuKEFSTXVsX0lOQykgOworICAgICAgIH0KKyBlbHNlIHsgLyogZ2V0IGp1c3Qgb25lIHdvcmQgKi8KKyAgICAqZGF0YSA9IFZhbFJlZ1tCSVRTKDEyLDE1KV0gOworICAgIHJldHVybihBUk11bF9ET05FKSA7CisgICAgfQorIH0KKworc3RhdGljIHVuc2lnbmVkIFZhbE1SQyhBUk11bF9TdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIHR5cGUsIEFSTXdvcmQgaW5zdHIsQVJNd29yZCAqdmFsdWUpCit7CisgKnZhbHVlID0gVmFsUmVnW0JJVFMoMTYsMTkpXSA7CisgcmV0dXJuKEFSTXVsX0RPTkUpIDsKKyB9CisKK3N0YXRpYyB1bnNpZ25lZCBWYWxNQ1IoQVJNdWxfU3RhdGUgKnN0YXRlLCB1bnNpZ25lZCB0eXBlLCBBUk13b3JkIGluc3RyLCBBUk13b3JkIHZhbHVlKQoreworIFZhbFJlZ1tCSVRTKDE2LDE5KV0gPSB2YWx1ZSA7CisgcmV0dXJuKEFSTXVsX0RPTkUpIDsKKyB9CisKK3N0YXRpYyB1bnNpZ25lZCBWYWxDRFAoQVJNdWxfU3RhdGUgKnN0YXRlLCB1bnNpZ25lZCB0eXBlLCBBUk13b3JkIGluc3RyKQoreworIHN0YXRpYyB1bnNpZ25lZCBsb25nIGZpbmlzaCA9IDAgOworIEFSTXdvcmQgaG93bG9uZyA7CisKKyBob3dsb25nID0gVmFsUmVnW0JJVFMoMCwzKV0gOworIGlmIChCSVRTKDIwLDIzKT09MCkgeworICAgIGlmICh0eXBlID09IEFSTXVsX0ZJUlNUKSB7IC8qIEZpcnN0IGN5Y2xlIG9mIGEgYnVzeSB3YWl0ICovCisgICAgICAgZmluaXNoID0gQVJNdWxfVGltZShzdGF0ZSkgKyBob3dsb25nIDsKKyAgICAgICBpZiAoaG93bG9uZyA9PSAwKQorICAgICAgICAgIHJldHVybihBUk11bF9ET05FKSA7CisgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybihBUk11bF9CVVNZKSA7CisgICAgICAgfQorICAgIGVsc2UgaWYgKHR5cGUgPT0gQVJNdWxfQlVTWSkgeworICAgICAgIGlmIChBUk11bF9UaW1lKHN0YXRlKSA+PSBmaW5pc2gpCisgICAgICAgICAgcmV0dXJuKEFSTXVsX0RPTkUpIDsKKyAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuKEFSTXVsX0JVU1kpIDsKKyAgICAgICB9CisgICAgfQorIHJldHVybihBUk11bF9DQU5UKSA7CisgfQorCitzdGF0aWMgdW5zaWduZWQgRG9BRklRKEFSTXVsX1N0YXRlICpzdGF0ZSkKK3tzdGF0ZS0+TmZpcVNpZyA9IExPVyA7Cisgc3RhdGUtPkV4Y2VwdGlvbisrIDsKKyByZXR1cm4oMCkgOworfQorCitzdGF0aWMgdW5zaWduZWQgRG9BSVJRKEFSTXVsX1N0YXRlICpzdGF0ZSkKK3tzdGF0ZS0+TmlycVNpZyA9IExPVyA7Cisgc3RhdGUtPkV4Y2VwdGlvbisrIDsKKyByZXR1cm4oMCkgOworfQorCitzdGF0aWMgdW5zaWduZWQgSW50Q0RQKEFSTXVsX1N0YXRlICpzdGF0ZSwgdW5zaWduZWQgdHlwZSwgQVJNd29yZCBpbnN0cikKK3tzdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5pc2ggOworIEFSTXdvcmQgaG93bG9uZyA7CisKKyBob3dsb25nID0gVmFsUmVnW0JJVFMoMCwzKV0gOworIHN3aXRjaCgoaW50KUJJVFMoMjAsMjMpKSB7CisgICAgY2FzZSAwIDogaWYgKHR5cGUgPT0gQVJNdWxfRklSU1QpIHsgLyogRmlyc3QgY3ljbGUgb2YgYSBidXN5IHdhaXQgKi8KKyAgICAgICAgICAgICAgICBmaW5pc2ggPSBBUk11bF9UaW1lKHN0YXRlKSArIGhvd2xvbmcgOworICAgICAgICAgICAgICAgIGlmIChob3dsb25nID09IDApCisgICAgICAgICAgICAgICAgICAgcmV0dXJuKEFSTXVsX0RPTkUpIDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgcmV0dXJuKEFSTXVsX0JVU1kpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBBUk11bF9CVVNZKSB7CisgICAgICAgICAgICAgICAgaWYgKEFSTXVsX1RpbWUoc3RhdGUpID49IGZpbmlzaCkKKyAgICAgICAgICAgICAgICAgICByZXR1cm4oQVJNdWxfRE9ORSkgOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICByZXR1cm4oQVJNdWxfQlVTWSkgOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICByZXR1cm4oQVJNdWxfRE9ORSkgOworICAgIGNhc2UgMSA6IGlmIChob3dsb25nID09IDApCisgICAgICAgICAgICAgICAgQVJNdWxfQWJvcnQoc3RhdGUsQVJNdWxfRklRVikgOworICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBUk11bF9TY2hlZHVsZUV2ZW50KHN0YXRlLGhvd2xvbmcsRG9BRklRKSA7CisgICAgICAgICAgICAgcmV0dXJuKEFSTXVsX0RPTkUpIDsKKyAgICBjYXNlIDIgOiBpZiAoaG93bG9uZyA9PSAwKQorICAgICAgICAgICAgICAgIEFSTXVsX0Fib3J0KHN0YXRlLEFSTXVsX0lSUVYpIDsKKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQVJNdWxfU2NoZWR1bGVFdmVudChzdGF0ZSxob3dsb25nLERvQUlSUSkgOworICAgICAgICAgICAgIHJldHVybihBUk11bF9ET05FKSA7CisgICAgY2FzZSAzIDogc3RhdGUtPk5maXFTaWcgPSBISUdIIDsKKyAgICAgICAgICAgICBzdGF0ZS0+RXhjZXB0aW9uLS0gOworICAgICAgICAgICAgIHJldHVybihBUk11bF9ET05FKSA7CisgICAgY2FzZSA0IDogc3RhdGUtPk5pcnFTaWcgPSBISUdIIDsKKyAgICAgICAgICAgICBzdGF0ZS0+RXhjZXB0aW9uLS0gOworICAgICAgICAgICAgIHJldHVybihBUk11bF9ET05FKSA7CisgICAgY2FzZSA1IDogVmFsUmVnW0JJVFMoMCwzKV0gPSBBUk11bF9UaW1lKHN0YXRlKSA7CisgICAgICAgICAgICAgcmV0dXJuKEFSTXVsX0RPTkUpIDsKKyAgICB9CisgcmV0dXJuKEFSTXVsX0NBTlQpIDsKKyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgSW5zdGFsbCBjby1wcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gaGFuZGxlcnMgaW4gdGhpcyByb3V0aW5lICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5zaWduZWQgQVJNdWxfQ29Qcm9Jbml0KEFSTXVsX1N0YXRlICpzdGF0ZSkKK3tyZWdpc3RlciB1bnNpZ25lZCBpIDsKKworIGZvciAoaSA9IDAgOyBpIDwgMTYgOyBpKyspIC8qIGluaXRpYWxpc2UgdGhhbSBhbGwgZmlyc3QgKi8KKyAgICBBUk11bF9Db1Byb0RldGFjaChzdGF0ZSwgaSkgOworCisgLyogSW5zdGFsbCBDb1BybyBJbnN0cnVjdGlvbiBoYW5kbGVycyBoZXJlCisgICAgVGhlIGZvcm1hdCBpcworICAgIEFSTXVsX0NvUHJvQXR0YWNoKHN0YXRlLCBDUCBOdW1iZXIsIEluaXQgcm91dGluZSwgRXhpdCByb3V0aW5lCisgICAgICAgICAgICAgICAgICAgICAgTERDIHJvdXRpbmUsIFNUQyByb3V0aW5lLCBNUkMgcm91dGluZSwgTUNSIHJvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgQ0RQIHJvdXRpbmUsIFJlYWQgUmVnIHJvdXRpbmUsIFdyaXRlIFJlZyByb3V0aW5lKSA7CisgICAqLworCisgICAgQVJNdWxfQ29Qcm9BdHRhY2goc3RhdGUsIDQsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgVmFsTERDLCBWYWxTVEMsIFZhbE1SQywgVmFsTUNSLAorICAgICAgICAgICAgICAgICAgICAgIFZhbENEUCwgTlVMTCwgTlVMTCkgOworCisgICAgQVJNdWxfQ29Qcm9BdHRhY2goc3RhdGUsIDUsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgVmFsTVJDLCBWYWxNQ1IsCisgICAgICAgICAgICAgICAgICAgICAgSW50Q0RQLCBOVUxMLCBOVUxMKSA7CisKKyAgICBBUk11bF9Db1Byb0F0dGFjaChzdGF0ZSwgMTUsIE1NVUluaXQsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTU1VTVJDLCBNTVVNQ1IsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTU1VUmVhZCwgTU1VV3JpdGUpIDsKKworCisgICAgLyogTm8gaGFuZGxlcnMgYmVsb3cgaGVyZSAqLworCisgICAgZm9yIChpID0gMCA7IGkgPCAxNiA7IGkrKykgLyogQ2FsbCBhbGwgdGhlIGluaXRpYWxpc2F0aW9uIHJvdXRpbmVzICovCisgICAgICAgaWYgKHN0YXRlLT5DUEluaXRbaV0pCisgICAgICAgICAgKHN0YXRlLT5DUEluaXRbaV0pKHN0YXRlKSA7CisgICAgcmV0dXJuKFRSVUUpIDsKKyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgSW5zdGFsbCBjby1wcm9jZXNzb3IgZmluYWxpc2F0aW9uIHJvdXRpbmVzIGluIHRoaXMgcm91dGluZSAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBBUk11bF9Db1Byb0V4aXQoQVJNdWxfU3RhdGUgKnN0YXRlKQore3JlZ2lzdGVyIHVuc2lnbmVkIGkgOworCisgZm9yIChpID0gMCA7IGkgPCAxNiA7IGkrKykKKyAgICBpZiAoc3RhdGUtPkNQRXhpdFtpXSkKKyAgICAgICAoc3RhdGUtPkNQRXhpdFtpXSkoc3RhdGUpIDsKKyBmb3IgKGkgPSAwIDsgaSA8IDE2IDsgaSsrKSAvKiBEZXRhY2ggYWxsIGhhbmRsZXJzICovCisgICAgQVJNdWxfQ29Qcm9EZXRhY2goc3RhdGUsIGkpIDsKKyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICBSb3V0aW5lcyB0byBob29rIENvLXByb2Nlc3NvcnMgaW50byBBUk11bGF0b3IgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQVJNdWxfQ29Qcm9BdHRhY2goQVJNdWxfU3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEFSTXVsX0NQSW5pdHMgKmluaXQsICBBUk11bF9DUEV4aXRzICpleGl0LAorICAgICAgICAgICAgICAgICAgICAgICBBUk11bF9MRENzICpsZGMsICBBUk11bF9TVENzICpzdGMsCisgICAgICAgICAgICAgICAgICAgICAgIEFSTXVsX01SQ3MgKm1yYywgIEFSTXVsX01DUnMgKm1jciwgIEFSTXVsX0NEUHMgKmNkcCwKKyAgICAgICAgICAgICAgICAgICAgICAgQVJNdWxfQ1BSZWFkcyAqcmVhZCwgQVJNdWxfQ1BXcml0ZXMgKndyaXRlKQore2lmIChpbml0ICE9IE5VTEwpCisgICAgc3RhdGUtPkNQSW5pdFtudW1iZXJdID0gaW5pdCA7CisgaWYgKGV4aXQgIT0gTlVMTCkKKyAgICBzdGF0ZS0+Q1BFeGl0W251bWJlcl0gPSBleGl0IDsKKyBpZiAobGRjICE9IE5VTEwpCisgICAgc3RhdGUtPkxEQ1tudW1iZXJdID0gbGRjIDsKKyBpZiAoc3RjICE9IE5VTEwpCisgICAgc3RhdGUtPlNUQ1tudW1iZXJdID0gc3RjIDsKKyBpZiAobXJjICE9IE5VTEwpCisgICAgc3RhdGUtPk1SQ1tudW1iZXJdID0gbXJjIDsKKyBpZiAobWNyICE9IE5VTEwpCisgICAgc3RhdGUtPk1DUltudW1iZXJdID0gbWNyIDsKKyBpZiAoY2RwICE9IE5VTEwpCisgICAgc3RhdGUtPkNEUFtudW1iZXJdID0gY2RwIDsKKyBpZiAocmVhZCAhPSBOVUxMKQorICAgIHN0YXRlLT5DUFJlYWRbbnVtYmVyXSA9IHJlYWQgOworIGlmICh3cml0ZSAhPSBOVUxMKQorICAgIHN0YXRlLT5DUFdyaXRlW251bWJlcl0gPSB3cml0ZSA7Cit9CisKK3ZvaWQgQVJNdWxfQ29Qcm9EZXRhY2goQVJNdWxfU3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBudW1iZXIpCit7QVJNdWxfQ29Qcm9BdHRhY2goc3RhdGUsIG51bWJlciwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICBOb0NvUHJvNFIsIE5vQ29Qcm80VywgTm9Db1BybzRXLCBOb0NvUHJvNFIsCisgICAgICAgICAgICAgICAgICAgTm9Db1BybzNSLCBOVUxMLCBOVUxMKSA7Cisgc3RhdGUtPkNQSW5pdFtudW1iZXJdID0gTlVMTCA7Cisgc3RhdGUtPkNQRXhpdFtudW1iZXJdID0gTlVMTCA7Cisgc3RhdGUtPkNQUmVhZFtudW1iZXJdID0gTlVMTCA7Cisgc3RhdGUtPkNQV3JpdGVbbnVtYmVyXSA9IE5VTEwgOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgIFRoZXJlIGlzIG5vIENvUHJvIGFyb3VuZCwgc28gVW5kZWZpbmVkIEluc3RydWN0aW9uIHRyYXAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1bnNpZ25lZCBOb0NvUHJvM1IoQVJNdWxfU3RhdGUgKnN0YXRlLHVuc2lnbmVkIGEsQVJNd29yZCBiKQore3JldHVybihBUk11bF9DQU5UKSA7fQorCitzdGF0aWMgdW5zaWduZWQgTm9Db1BybzRSKEFSTXVsX1N0YXRlICpzdGF0ZSwgdW5zaWduZWQgYSxBUk13b3JkIGIsQVJNd29yZCBjKQore3JldHVybihBUk11bF9DQU5UKSA7fQorCitzdGF0aWMgdW5zaWduZWQgTm9Db1BybzRXKEFSTXVsX1N0YXRlICpzdGF0ZSwgdW5zaWduZWQgYSxBUk13b3JkIGIsQVJNd29yZCAqYykKK3tyZXR1cm4oQVJNdWxfQ0FOVCkgO30KZGlmZiAtLWdpdCBhL3NpbS9hcm0vYXJtZGVmcy5oIGIvc2ltL2FybS9hcm1kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxZjM1MgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9hcm0vYXJtZGVmcy5oCkBAIC0wLDAgKzEsMzUzIEBACisvKiAgYXJtZGVmcy5oIC0tIEFSTXVsYXRvciBjb21tb24gZGVmaW5pdGlvbnM6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgorICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIEZBTFNFIDAKKyNkZWZpbmUgVFJVRSAxCisjZGVmaW5lIExPVyAwCisjZGVmaW5lIEhJR0ggMQorI2RlZmluZSBMT1dISUdIIDEKKyNkZWZpbmUgSElHSExPVyAyCisKKyNpZm5kZWYgX19TVERDX18KK3R5cGVkZWYgY2hhciAqIFZvaWRTdGFyIDsKKyNlbmRpZgorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgQVJNd29yZCA7IC8qIG11c3QgYmUgMzIgYml0cyB3aWRlICovCisKK3R5cGVkZWYgc3RydWN0IEFSTXVsX1N0YXRlIEFSTXVsX1N0YXRlIDsKKwordHlwZWRlZiB1bnNpZ25lZCBBUk11bF9DUEluaXRzKEFSTXVsX1N0YXRlICpzdGF0ZSkgOwordHlwZWRlZiB1bnNpZ25lZCBBUk11bF9DUEV4aXRzKEFSTXVsX1N0YXRlICpzdGF0ZSkgOwordHlwZWRlZiB1bnNpZ25lZCBBUk11bF9MRENzKEFSTXVsX1N0YXRlICpzdGF0ZSx1bnNpZ25lZCB0eXBlLEFSTXdvcmQgaW5zdHIsQVJNd29yZCB2YWx1ZSkgOwordHlwZWRlZiB1bnNpZ25lZCBBUk11bF9TVENzKEFSTXVsX1N0YXRlICpzdGF0ZSx1bnNpZ25lZCB0eXBlLEFSTXdvcmQgaW5zdHIsQVJNd29yZCAqdmFsdWUpIDsKK3R5cGVkZWYgdW5zaWduZWQgQVJNdWxfTVJDcyhBUk11bF9TdGF0ZSAqc3RhdGUsdW5zaWduZWQgdHlwZSxBUk13b3JkIGluc3RyLEFSTXdvcmQgKnZhbHVlKSA7Cit0eXBlZGVmIHVuc2lnbmVkIEFSTXVsX01DUnMoQVJNdWxfU3RhdGUgKnN0YXRlLHVuc2lnbmVkIHR5cGUsQVJNd29yZCBpbnN0cixBUk13b3JkIHZhbHVlKSA7Cit0eXBlZGVmIHVuc2lnbmVkIEFSTXVsX0NEUHMoQVJNdWxfU3RhdGUgKnN0YXRlLHVuc2lnbmVkIHR5cGUsQVJNd29yZCBpbnN0cikgOwordHlwZWRlZiB1bnNpZ25lZCBBUk11bF9DUFJlYWRzKEFSTXVsX1N0YXRlICpzdGF0ZSx1bnNpZ25lZCByZWcsQVJNd29yZCAqdmFsdWUpIDsKK3R5cGVkZWYgdW5zaWduZWQgQVJNdWxfQ1BXcml0ZXMoQVJNdWxfU3RhdGUgKnN0YXRlLHVuc2lnbmVkIHJlZyxBUk13b3JkIHZhbHVlKSA7CisKK3N0cnVjdCBBUk11bF9TdGF0ZSB7CisgICBBUk13b3JkIEVtdWxhdGUgOyAvKiB0byBzdGFydCBhbmQgc3RvcCBlbXVsYXRpb24gKi8KKyAgIHVuc2lnbmVkIEVuZENvbmRpdGlvbiA7IC8qIHJlYXNvbiBmb3Igc3RvcHBpbmcgKi8KKyAgIHVuc2lnbmVkIEVycm9yQ29kZSA7IC8qIHR5cGUgb2YgaWxsZWdhbCBpbnN0cnVjdGlvbiAqLworICAgQVJNd29yZCBSZWdbMTZdIDsgLyogdGhlIGN1cnJlbnQgcmVnaXN0ZXIgZmlsZSAqLworICAgQVJNd29yZCBSZWdCYW5rWzddWzE2XSA7IC8qIGFsbCB0aGUgcmVnaXN0ZXJzICovCisgICBBUk13b3JkIENwc3IgOyAvKiB0aGUgY3VycmVudCBwc3IgKi8KKyAgIEFSTXdvcmQgU3Bzcls3XSA7IC8qIHRoZSBleGNlcHRpb24gcHNyJ3MgKi8KKyAgIEFSTXdvcmQgTkZsYWcsIFpGbGFnLCBDRmxhZywgVkZsYWcsIElGRmxhZ3MgOyAvKiBkdW1teSBmbGFncyBmb3Igc3BlZWQgKi8KKyNpZmRlZiBNT0RFVAorICAgQVJNd29yZCBURmxhZyA7IC8qIFRodW1iIHN0YXRlICovCisjZW5kaWYKKyAgIEFSTXdvcmQgQmFuayA7IC8qIHRoZSBjdXJyZW50IHJlZ2lzdGVyIGJhbmsgKi8KKyAgIEFSTXdvcmQgTW9kZSA7IC8qIHRoZSBjdXJyZW50IG1vZGUgKi8KKyAgIEFSTXdvcmQgaW5zdHIsIHBjLCB0ZW1wIDsgLyogc2F2ZWQgcmVnaXN0ZXIgc3RhdGUgKi8KKyAgIEFSTXdvcmQgbG9hZGVkLCBkZWNvZGVkIDsgLyogc2F2ZWQgcGlwZWxpbmUgc3RhdGUgKi8KKyAgIHVuc2lnbmVkIGxvbmcgTnVtU2N5Y2xlcywKKyAgICAgICAgICAgICAgICAgTnVtTmN5Y2xlcywKKyAgICAgICAgICAgICAgICAgTnVtSWN5Y2xlcywKKyAgICAgICAgICAgICAgICAgTnVtQ2N5Y2xlcywKKyAgICAgICAgICAgICAgICAgTnVtRmN5Y2xlcyA7IC8qIGVtdWxhdGVkIGN5Y2xlcyB1c2VkICovCisgICB1bnNpZ25lZCBsb25nIE51bUluc3RycyA7IC8qIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkICovCisgICB1bnNpZ25lZCBOZXh0SW5zdHIgOworICAgdW5zaWduZWQgVmVjdG9yQ2F0Y2ggOyAvKiBjYXVnaHQgZXhjZXB0aW9uIG1hc2sgKi8KKyAgIHVuc2lnbmVkIENhbGxEZWJ1ZyA7IC8qIHNldCB0byBjYWxsIHRoZSBkZWJ1Z2dlciAqLworICAgdW5zaWduZWQgQ2FuV2F0Y2ggOyAvKiBzZXQgYnkgbWVtb3J5IGludGVyZmFjZSBpZiBpdHMgd2lsbGluZyB0byBzdWZmZXIgdGhlCisJCQkgIG92ZXJoZWFkIG9mIGNoZWNraW5nIGZvciB3YXRjaHBvaW50cyBvbiBlYWNoIG1lbW9yeQorCQkJICBhY2Nlc3MgKi8KKyAgIHVuc2lnbmVkIE1lbVJlYWREZWJ1ZywgTWVtV3JpdGVEZWJ1ZyA7CisgICB1bnNpZ25lZCBsb25nIFN0b3BIYW5kbGUgOworCisgICB1bnNpZ25lZCBjaGFyICpNZW1EYXRhUHRyIDsgLyogYWRtaW4gZGF0YSAqLworICAgdW5zaWduZWQgY2hhciAqTWVtSW5QdHIgOyAvKiB0aGUgRGF0YSBJbiBidXMgKi8KKyAgIHVuc2lnbmVkIGNoYXIgKk1lbU91dFB0ciA7IC8qIHRoZSBEYXRhIE91dCBidXMgKHdoaWNoIHlvdSBtYXkgbm90IG5lZWQgKi8KKyAgIHVuc2lnbmVkIGNoYXIgKk1lbVNwYXJlUHRyIDsgLyogZXh0cmEgc3BhY2UgKi8KKyAgIEFSTXdvcmQgTWVtU2l6ZSA7CisKKyAgIHVuc2lnbmVkIGNoYXIgKk9TcHRyIDsgLyogT1MgSGFuZGxlICovCisgICBjaGFyICpDb21tYW5kTGluZSA7IC8qIENvbW1hbmQgTGluZSBmcm9tIEFSTXNkICovCisKKyAgIEFSTXVsX0NQSW5pdHMgKkNQSW5pdFsxNl0gOyAvKiBjb3Byb2Nlc3NvciBpbml0aWFsaXNlcnMgKi8KKyAgIEFSTXVsX0NQRXhpdHMgKkNQRXhpdFsxNl0gOyAvKiBjb3Byb2Nlc3NvciBmaW5hbGlzZXJzICovCisgICBBUk11bF9MRENzICpMRENbMTZdIDsgLyogTERDIGluc3RydWN0aW9uICovCisgICBBUk11bF9TVENzICpTVENbMTZdIDsgLyogU1RDIGluc3RydWN0aW9uICovCisgICBBUk11bF9NUkNzICpNUkNbMTZdIDsgLyogTVJDIGluc3RydWN0aW9uICovCisgICBBUk11bF9NQ1JzICpNQ1JbMTZdIDsgLyogTUNSIGluc3RydWN0aW9uICovCisgICBBUk11bF9DRFBzICpDRFBbMTZdIDsgLyogQ0RQIGluc3RydWN0aW9uICovCisgICBBUk11bF9DUFJlYWRzICpDUFJlYWRbMTZdIDsgLyogUmVhZCBDUCByZWdpc3RlciAqLworICAgQVJNdWxfQ1BXcml0ZXMgKkNQV3JpdGVbMTZdIDsgLyogV3JpdGUgQ1AgcmVnaXN0ZXIgKi8KKyAgIHVuc2lnbmVkIGNoYXIgKkNQRGF0YVsxNl0gOyAvKiBDb3Byb2Nlc3NvciBkYXRhICovCisgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpDUFJlZ1dvcmRzWzE2XSA7ICAvKiBtYXAgb2YgY29wcm9jZXNzb3IgcmVnaXN0ZXIgc2l6ZXMgKi8KKworICAgdW5zaWduZWQgRXZlbnRTZXQgOyAvKiB0aGUgbnVtYmVyIG9mIGV2ZW50cyBpbiB0aGUgcXVldWUgKi8KKyAgIHVuc2lnbmVkIGxvbmcgTm93IDsgLyogdGltZSB0byB0aGUgbmVhcmVzdCBjeWNsZSAqLworICAgc3RydWN0IEV2ZW50Tm9kZSAqKkV2ZW50UHRyIDsgLyogdGhlIGV2ZW50IGxpc3QgKi8KKworICAgdW5zaWduZWQgRXhjZXB0aW9uIDsgLyogZW5hYmxlIHRoZSBuZXh0IGZvdXIgdmFsdWVzICovCisgICB1bnNpZ25lZCBEZWJ1ZyA7IC8qIHNob3cgaW5zdHJ1Y3Rpb25zIGFzIHRoZXkgYXJlIGV4ZWN1dGVkICovCisgICB1bnNpZ25lZCBOcmVzZXRTaWcgOyAvKiByZXNldCB0aGUgcHJvY2Vzc29yICovCisgICB1bnNpZ25lZCBOZmlxU2lnIDsKKyAgIHVuc2lnbmVkIE5pcnFTaWcgOworCisgICB1bnNpZ25lZCBhYm9ydFNpZyA7CisgICB1bnNpZ25lZCBOdHJhbnNTaWcgOworICAgdW5zaWduZWQgYmlnZW5kU2lnIDsKKyAgIHVuc2lnbmVkIHByb2czMlNpZyA7CisgICB1bnNpZ25lZCBkYXRhMzJTaWcgOworICAgdW5zaWduZWQgbGF0ZWFidFNpZyA7CisgICBBUk13b3JkIFZlY3RvciA7IC8qIHN5bnRoZXNpemUgYWJvcnRzIGluIGN5Y2xlIG1vZGVzICovCisgICBBUk13b3JkIEFib3J0ZWQgOyAvKiBzdGlja3kgZmxhZyBmb3IgYWJvcnRzICovCisgICBBUk13b3JkIFJlc2V0ZWQgOyAvKiBzdGlja3kgZmxhZyBmb3IgUmVzZXQgKi8KKyAgIEFSTXdvcmQgSW50ZWQsIExhc3RJbnRlZCA7IC8qIHN0aWNreSBmbGFncyBmb3IgaW50ZXJydXB0cyAqLworICAgQVJNd29yZCBCYXNlIDsgLyogZXh0cmEgaGFuZCBmb3IgYmFzZSB3cml0ZWJhY2sgKi8KKyAgIEFSTXdvcmQgQWJvcnRBZGRyIDsgLyogdG8ga2VlcCB0cmFjayBvZiBQcmVmZXRjaCBhYm9ydHMgKi8KKworICAgY29uc3Qgc3RydWN0IERiZ19Ib3N0b3NJbnRlcmZhY2UgKmhvc3RpZjsKKworICAgaW50IHZlcmJvc2U7IC8qIG5vbi16ZXJvIG1lYW5zIHByaW50IHZhcmlvdXMgbWVzc2FnZXMgbGlrZSB0aGUgYmFubmVyICovCisgfSA7CisKKyNkZWZpbmUgUmVzZXRQaW4gTnJlc2V0U2lnCisjZGVmaW5lIEZJUVBpbiBOZmlxU2lnCisjZGVmaW5lIElSUVBpbiBOaXJxU2lnCisjZGVmaW5lIEFib3J0UGluIGFib3J0U2lnCisjZGVmaW5lIFRyYW5zUGluIE50cmFuc1NpZworI2RlZmluZSBCaWdFbmRQaW4gYmlnZW5kU2lnCisjZGVmaW5lIFByb2czMlBpbiBwcm9nMzJTaWcKKyNkZWZpbmUgRGF0YTMyUGluIGRhdGEzMlNpZworI2RlZmluZSBMYXRlQWJvcnRQaW4gbGF0ZWFidFNpZworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVzIG9mIEFSTSB3ZSBrbm93IGFib3V0ICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvKiBUaGUgYml0ZmxhZ3MgKi8KKyNkZWZpbmUgQVJNX0ZpeDI2X1Byb3AgICAweDAxCisjZGVmaW5lIEFSTV9OZXhlY19Qcm9wICAgMHgwMgorI2RlZmluZSBBUk1fRGVidWdfUHJvcCAgIDB4MTAKKyNkZWZpbmUgQVJNX0lzeW5jX1Byb3AgICBBUk1fRGVidWdfUHJvcAorI2RlZmluZSBBUk1fTG9ja19Qcm9wICAgIDB4MjAKKyAKKy8qIEFSTTIgZmFtaWx5ICovCisjZGVmaW5lIEFSTTIgICAgKEFSTV9GaXgyNl9Qcm9wKQorI2RlZmluZSBBUk0yYXMgIEFSTTIKKyNkZWZpbmUgQVJNNjEgICBBUk0yCisjZGVmaW5lIEFSTTMgICAgQVJNMgorCisjaWZkZWYgQVJNNjAJLyogcHJldmlvdXMgZGVmaW5pdGlvbiBpbiBhcm1vcHRzLmggKi8KKyN1bmRlZiBBUk02MAorI2VuZGlmCisKKy8qIEFSTTYgZmFtaWx5ICovCisjZGVmaW5lIEFSTTYgICAgKEFSTV9Mb2NrX1Byb3ApCisjZGVmaW5lIEFSTTYwICAgQVJNNgorI2RlZmluZSBBUk02MDAgIEFSTTYKKyNkZWZpbmUgQVJNNjEwICBBUk02CisjZGVmaW5lIEFSTTYyMCAgQVJNNgorIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICBNYWNyb3MgdG8gZXh0cmFjdCBpbnN0cnVjdGlvbiBmaWVsZHMgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQklUKG4pICggKEFSTXdvcmQpKGluc3RyPj4obikpJjEpICAgLyogYml0IG4gb2YgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgQklUUyhtLG4pICggKEFSTXdvcmQpKGluc3RyPDwoMzEtKG4pKSkgPj4gKCgzMS0obikpKyhtKSkgKSAvKiBiaXRzIG0gdG8gbiBvZiBpbnN0ciAqLworI2RlZmluZSBUT1BCSVRTKG4pIChpbnN0ciA+PiAobikpIC8qIGJpdHMgMzEgdG8gbiBvZiBpbnN0ciAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICBUaGUgaGFyZHdhcmUgdmVjdG9yIGFkZHJlc3NlcyAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQVJNUmVzZXRWIDBMCisjZGVmaW5lIEFSTVVuZGVmaW5lZEluc3RyViA0TAorI2RlZmluZSBBUk1TV0lWIDhMCisjZGVmaW5lIEFSTVByZWZldGNoQWJvcnRWIDEyTAorI2RlZmluZSBBUk1EYXRhQWJvcnRWIDE2TAorI2RlZmluZSBBUk1BZGRyRXhjZXB0blYgMjBMCisjZGVmaW5lIEFSTUlSUVYgMjRMCisjZGVmaW5lIEFSTUZJUVYgMjhMCisjZGVmaW5lIEFSTUVycm9yViAzMkwgLyogVGhpcyBpcyBhbiBvZmZzZXQsIG5vdCBhbiBhZGRyZXNzICEgKi8KKworI2RlZmluZSBBUk11bF9SZXNldFYgQVJNUmVzZXRWCisjZGVmaW5lIEFSTXVsX1VuZGVmaW5lZEluc3RyViBBUk1VbmRlZmluZWRJbnN0clYKKyNkZWZpbmUgQVJNdWxfU1dJViBBUk1TV0lWCisjZGVmaW5lIEFSTXVsX1ByZWZldGNoQWJvcnRWIEFSTVByZWZldGNoQWJvcnRWCisjZGVmaW5lIEFSTXVsX0RhdGFBYm9ydFYgQVJNRGF0YUFib3J0VgorI2RlZmluZSBBUk11bF9BZGRyRXhjZXB0blYgQVJNQWRkckV4Y2VwdG5WCisjZGVmaW5lIEFSTXVsX0lSUVYgQVJNSVJRVgorI2RlZmluZSBBUk11bF9GSVFWIEFSTUZJUVYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGUgYW5kIEJhbmsgQ29uc3RhbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFVTRVIyNk1PREUgMEwKKyNkZWZpbmUgRklRMjZNT0RFIDFMCisjZGVmaW5lIElSUTI2TU9ERSAyTAorI2RlZmluZSBTVkMyNk1PREUgM0wKKyNkZWZpbmUgVVNFUjMyTU9ERSAxNkwKKyNkZWZpbmUgRklRMzJNT0RFIDE3TAorI2RlZmluZSBJUlEzMk1PREUgMThMCisjZGVmaW5lIFNWQzMyTU9ERSAxOUwKKyNkZWZpbmUgQUJPUlQzMk1PREUgMjNMCisjZGVmaW5lIFVOREVGMzJNT0RFIDI3TAorCisjZGVmaW5lIEFSTTMyQklUTU9ERSAoc3RhdGUtPk1vZGUgPiAzKQorI2RlZmluZSBBUk0yNkJJVE1PREUgKHN0YXRlLT5Nb2RlIDw9IDMpCisjZGVmaW5lIEFSTU1PREUgKHN0YXRlLT5Nb2RlKQorI2RlZmluZSBBUk11bF9NT0RFQklUUyAweDFmTAorI2RlZmluZSBBUk11bF9NT0RFMzJCSVQgQVJNMzJCSVRNT0RFCisjZGVmaW5lIEFSTXVsX01PREUyNkJJVCBBUk0yNkJJVE1PREUKKworI2RlZmluZSBVU0VSQkFOSyAwCisjZGVmaW5lIEZJUUJBTksgMQorI2RlZmluZSBJUlFCQU5LIDIKKyNkZWZpbmUgU1ZDQkFOSyAzCisjZGVmaW5lIEFCT1JUQkFOSyA0CisjZGVmaW5lIFVOREVGQkFOSyA1CisjZGVmaW5lIERVTU1ZQkFOSyA2CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgRGVmaW5pdG9ucyBvZiB0aGluZ3MgaW4gdGhlIGVtdWxhdG9yICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIHZvaWQgQVJNdWxfRW11bGF0ZUluaXQodm9pZCkgOworZXh0ZXJuIEFSTXVsX1N0YXRlICpBUk11bF9OZXdTdGF0ZSh2b2lkKSA7CitleHRlcm4gdm9pZCBBUk11bF9SZXNldChBUk11bF9TdGF0ZSAqc3RhdGUpIDsKK2V4dGVybiBBUk13b3JkIEFSTXVsX0RvUHJvZyhBUk11bF9TdGF0ZSAqc3RhdGUpIDsKK2V4dGVybiBBUk13b3JkIEFSTXVsX0RvSW5zdHIoQVJNdWxfU3RhdGUgKnN0YXRlKSA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgIERlZmluaXRvbnMgb2YgdGhpbmdzIGZvciBldmVudCBoYW5kbGluZyAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIHZvaWQgQVJNdWxfU2NoZWR1bGVFdmVudChBUk11bF9TdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGxvbmcgZGVsYXksIHVuc2lnbmVkICgqZnVuYykoKSApIDsKK2V4dGVybiB2b2lkIEFSTXVsX0Vudm9rZUV2ZW50KEFSTXVsX1N0YXRlICpzdGF0ZSkgOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgQVJNdWxfVGltZShBUk11bF9TdGF0ZSAqc3RhdGUpIDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWZ1bCBzdXBwb3J0IHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gQVJNd29yZCBBUk11bF9HZXRSZWcoQVJNdWxfU3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBtb2RlLCB1bnNpZ25lZCByZWcpIDsKK2V4dGVybiB2b2lkIEFSTXVsX1NldFJlZyhBUk11bF9TdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIG1vZGUsIHVuc2lnbmVkIHJlZywgQVJNd29yZCB2YWx1ZSkgOworZXh0ZXJuIEFSTXdvcmQgQVJNdWxfR2V0UEMoQVJNdWxfU3RhdGUgKnN0YXRlKSA7CitleHRlcm4gQVJNd29yZCBBUk11bF9HZXROZXh0UEMoQVJNdWxfU3RhdGUgKnN0YXRlKSA7CitleHRlcm4gdm9pZCBBUk11bF9TZXRQQyhBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgdmFsdWUpIDsKK2V4dGVybiBBUk13b3JkIEFSTXVsX0dldFIxNShBUk11bF9TdGF0ZSAqc3RhdGUpIDsKK2V4dGVybiB2b2lkIEFSTXVsX1NldFIxNShBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgdmFsdWUpIDsKKworZXh0ZXJuIEFSTXdvcmQgQVJNdWxfR2V0Q1BTUihBUk11bF9TdGF0ZSAqc3RhdGUpIDsKK2V4dGVybiB2b2lkIEFSTXVsX1NldENQU1IoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIHZhbHVlKSA7CitleHRlcm4gQVJNd29yZCBBUk11bF9HZXRTUFNSKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBtb2RlKSA7CitleHRlcm4gdm9pZCBBUk11bF9TZXRTUFNSKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBtb2RlLCBBUk13b3JkIHZhbHVlKSA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgRGVmaW5pdG9ucyBvZiB0aGluZ3MgdG8gaGFuZGxlIGFib3J0cyAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIHZvaWQgQVJNdWxfQWJvcnQoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIGFkZHJlc3MpIDsKKyNkZWZpbmUgQVJNdWxfQUJPUlRXT1JEIDB4ZWZmZmZmZmYgLyogU1dJIC0xICovCisjZGVmaW5lIEFSTXVsX1BSRUZFVENIQUJPUlQoYWRkcmVzcykgaWYgKHN0YXRlLT5BYm9ydEFkZHIgPT0gMSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5BYm9ydEFkZHIgPSAoYWRkcmVzcyAmIH4zTCkKKyNkZWZpbmUgQVJNdWxfREFUQUFCT1JUKGFkZHJlc3MpIHN0YXRlLT5hYm9ydFNpZyA9IEhJR0ggOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+QWJvcnRlZCA9IEFSTXVsX0RhdGFBYm9ydFYgOworI2RlZmluZSBBUk11bF9DTEVBUkFCT1JUIHN0YXRlLT5hYm9ydFNpZyA9IExPVworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgRGVmaW5pdG9ucyBvZiB0aGluZ3MgaW4gdGhlIG1lbW9yeSBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiB1bnNpZ25lZCBBUk11bF9NZW1vcnlJbml0KEFSTXVsX1N0YXRlICpzdGF0ZSx1bnNpZ25lZCBsb25nIGluaXRtZW1zaXplKSA7CitleHRlcm4gdm9pZCBBUk11bF9NZW1vcnlFeGl0KEFSTXVsX1N0YXRlICpzdGF0ZSkgOworCitleHRlcm4gQVJNd29yZCBBUk11bF9Mb2FkSW5zdHJTKEFSTXVsX1N0YXRlICpzdGF0ZSxBUk13b3JkIGFkZHJlc3MsQVJNd29yZCBpc2l6ZSkgOworZXh0ZXJuIEFSTXdvcmQgQVJNdWxfTG9hZEluc3RyTihBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBhZGRyZXNzLEFSTXdvcmQgaXNpemUpIDsKK2V4dGVybiBBUk13b3JkIEFSTXVsX1JlTG9hZEluc3RyKEFSTXVsX1N0YXRlICpzdGF0ZSxBUk13b3JkIGFkZHJlc3MsQVJNd29yZCBpc2l6ZSkgOworCitleHRlcm4gQVJNd29yZCBBUk11bF9Mb2FkV29yZFMoQVJNdWxfU3RhdGUgKnN0YXRlLEFSTXdvcmQgYWRkcmVzcykgOworZXh0ZXJuIEFSTXdvcmQgQVJNdWxfTG9hZFdvcmROKEFSTXVsX1N0YXRlICpzdGF0ZSxBUk13b3JkIGFkZHJlc3MpIDsKK2V4dGVybiBBUk13b3JkIEFSTXVsX0xvYWRIYWxmV29yZChBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBhZGRyZXNzKSA7CitleHRlcm4gQVJNd29yZCBBUk11bF9Mb2FkQnl0ZShBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBhZGRyZXNzKSA7CisKK2V4dGVybiB2b2lkIEFSTXVsX1N0b3JlV29yZFMoQVJNdWxfU3RhdGUgKnN0YXRlLEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBkYXRhKSA7CitleHRlcm4gdm9pZCBBUk11bF9TdG9yZVdvcmROKEFSTXVsX1N0YXRlICpzdGF0ZSxBUk13b3JkIGFkZHJlc3MsIEFSTXdvcmQgZGF0YSkgOworZXh0ZXJuIHZvaWQgQVJNdWxfU3RvcmVIYWxmV29yZChBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIGRhdGEpIDsKK2V4dGVybiB2b2lkIEFSTXVsX1N0b3JlQnl0ZShBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIGRhdGEpIDsKKworZXh0ZXJuIEFSTXdvcmQgQVJNdWxfU3dhcFdvcmQoQVJNdWxfU3RhdGUgKnN0YXRlLEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBkYXRhKSA7CitleHRlcm4gQVJNd29yZCBBUk11bF9Td2FwQnl0ZShBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIGRhdGEpIDsKKworZXh0ZXJuIHZvaWQgQVJNdWxfSWN5Y2xlcyhBUk11bF9TdGF0ZSAqc3RhdGUsdW5zaWduZWQgbnVtYmVyLCBBUk13b3JkIGFkZHJlc3MpIDsKK2V4dGVybiB2b2lkIEFSTXVsX0NjeWNsZXMoQVJNdWxfU3RhdGUgKnN0YXRlLHVuc2lnbmVkIG51bWJlciwgQVJNd29yZCBhZGRyZXNzKSA7CisKK2V4dGVybiBBUk13b3JkIEFSTXVsX1JlYWRXb3JkKEFSTXVsX1N0YXRlICpzdGF0ZSxBUk13b3JkIGFkZHJlc3MpIDsKK2V4dGVybiBBUk13b3JkIEFSTXVsX1JlYWRCeXRlKEFSTXVsX1N0YXRlICpzdGF0ZSxBUk13b3JkIGFkZHJlc3MpIDsKK2V4dGVybiB2b2lkIEFSTXVsX1dyaXRlV29yZChBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIGRhdGEpIDsKK2V4dGVybiB2b2lkIEFSTXVsX1dyaXRlQnl0ZShBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIGRhdGEpIDsKKworZXh0ZXJuIEFSTXdvcmQgQVJNdWxfTWVtQWNjZXNzKEFSTXVsX1N0YXRlICpzdGF0ZSxBUk13b3JkLEFSTXdvcmQsQVJNd29yZCwKKyAgICAgICAgICAgICAgICAgIEFSTXdvcmQsQVJNd29yZCxBUk13b3JkLEFSTXdvcmQsQVJNd29yZCxBUk13b3JkLEFSTXdvcmQpIDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICBEZWZpbml0b25zIG9mIHRoaW5ncyBpbiB0aGUgY28tcHJvY2Vzc29yIGludGVyZmFjZSAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEFSTXVsX0ZJUlNUIDAKKyNkZWZpbmUgQVJNdWxfVFJBTlNGRVIgMQorI2RlZmluZSBBUk11bF9CVVNZIDIKKyNkZWZpbmUgQVJNdWxfREFUQSAzCisjZGVmaW5lIEFSTXVsX0lOVEVSUlVQVCA0CisjZGVmaW5lIEFSTXVsX0RPTkUgMAorI2RlZmluZSBBUk11bF9DQU5UIDEKKyNkZWZpbmUgQVJNdWxfSU5DIDMKKworZXh0ZXJuIHVuc2lnbmVkIEFSTXVsX0NvUHJvSW5pdChBUk11bF9TdGF0ZSAqc3RhdGUpIDsKK2V4dGVybiB2b2lkIEFSTXVsX0NvUHJvRXhpdChBUk11bF9TdGF0ZSAqc3RhdGUpIDsKK2V4dGVybiB2b2lkIEFSTXVsX0NvUHJvQXR0YWNoKEFSTXVsX1N0YXRlICpzdGF0ZSwgdW5zaWduZWQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNdWxfQ1BJbml0cyAqaW5pdCwgQVJNdWxfQ1BFeGl0cyAqZXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTXVsX0xEQ3MgKmxkYywgQVJNdWxfU1RDcyAqc3RjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNdWxfTVJDcyAqbXJjLCBBUk11bF9NQ1JzICptY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk11bF9DRFBzICpjZHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk11bF9DUFJlYWRzICpyZWFkLCBBUk11bF9DUFdyaXRlcyAqd3JpdGUpIDsKK2V4dGVybiB2b2lkIEFSTXVsX0NvUHJvRGV0YWNoKEFSTXVsX1N0YXRlICpzdGF0ZSwgdW5zaWduZWQgbnVtYmVyKSA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgRGVmaW5pdG9ucyBvZiB0aGluZ3MgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIHVuc2lnbmVkIEFSTXVsX09TSW5pdChBUk11bF9TdGF0ZSAqc3RhdGUpIDsKK2V4dGVybiB2b2lkIEFSTXVsX09TRXhpdChBUk11bF9TdGF0ZSAqc3RhdGUpIDsKK2V4dGVybiB1bnNpZ25lZCBBUk11bF9PU0hhbmRsZVNXSShBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBudW1iZXIpIDsKK2V4dGVybiBBUk13b3JkIEFSTXVsX09TTGFzdEVycm9yUChBUk11bF9TdGF0ZSAqc3RhdGUpIDsKKworZXh0ZXJuIEFSTXdvcmQgQVJNdWxfRGVidWcoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIHBjLCBBUk13b3JkIGluc3RyKSA7CitleHRlcm4gdW5zaWduZWQgQVJNdWxfT1NFeGNlcHRpb24oQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIHZlY3RvciwgQVJNd29yZCBwYykgOworZXh0ZXJuIGludCByZGlfbG9nIDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdC1kZXBlbmRlbnQgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgbWFjaW50b3NoCitwYXNjYWwgdm9pZCBTcGluQ3Vyc29yKHNob3J0IGluY3JlbWVudCk7ICAgICAgICAvKiBjb3BpZWQgZnJvbSBDdXJzb3JDdGwuaCAqLworIyBkZWZpbmUgSE9VUkdMQVNTICAgICAgICAgICBTcGluQ3Vyc29yKCAxICkKKyMgZGVmaW5lIEhPVVJHTEFTU19SQVRFICAgICAgMTAyMyAgIC8qIDJebiAtIDEgKi8KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zaW0vYXJtL2FybWVtdS5jIGIvc2ltL2FybS9hcm1lbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzFmMWM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2FybS9hcm1lbXUuYwpAQCAtMCwwICsxLDM0NTQgQEAKKy8qICBhcm1lbXUuYyAtLSBNYWluIGluc3RydWN0aW9uIGVtdWxhdGlvbjogIEFSTTcgSW5zdHJ1Y3Rpb24gRW11bGF0b3IuCisgICAgQ29weXJpZ2h0IChDKSAxOTk0IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTHRkLgorICAgIE1vZGlmaWNhdGlvbnMgdG8gYWRkIGFyY2guIHY0IHN1cHBvcnQgYnkgPGpzbWl0aEBjeWdudXMuY29tPi4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKyNpbmNsdWRlICJhcm1kZWZzLmgiCisjaW5jbHVkZSAiYXJtZW11LmgiCisKK3N0YXRpYyBBUk13b3JkIEdldERQUmVnUkhTKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBpbnN0cikgOworc3RhdGljIEFSTXdvcmQgR2V0RFBTUmVnUkhTKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBpbnN0cikgOworc3RhdGljIHZvaWQgV3JpdGVSMTUoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIHNyYykgOworc3RhdGljIHZvaWQgV3JpdGVTUjE1KEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBzcmMpIDsKK3N0YXRpYyBBUk13b3JkIEdldExTUmVnUkhTKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBpbnN0cikgOworc3RhdGljIEFSTXdvcmQgR2V0TFM3UkhTKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBpbnN0cikgOworc3RhdGljIHVuc2lnbmVkIExvYWRXb3JkKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCBhZGRyZXNzKSA7CitzdGF0aWMgdW5zaWduZWQgTG9hZEhhbGZXb3JkKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCBhZGRyZXNzLGludCBzaWduZXh0ZW5kKSA7CitzdGF0aWMgdW5zaWduZWQgTG9hZEJ5dGUoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIGluc3RyLCBBUk13b3JkIGFkZHJlc3MsaW50IHNpZ25leHRlbmQpIDsKK3N0YXRpYyB1bnNpZ25lZCBTdG9yZVdvcmQoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIGluc3RyLCBBUk13b3JkIGFkZHJlc3MpIDsKK3N0YXRpYyB1bnNpZ25lZCBTdG9yZUhhbGZXb3JkKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCBhZGRyZXNzKSA7CitzdGF0aWMgdW5zaWduZWQgU3RvcmVCeXRlKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCBhZGRyZXNzKSA7CitzdGF0aWMgdm9pZCBMb2FkTXVsdChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBpbnN0ciwgQVJNd29yZCBXQkJhc2UpIDsKK3N0YXRpYyB2b2lkIFN0b3JlTXVsdChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBpbnN0ciwgQVJNd29yZCBXQkJhc2UpIDsKK3N0YXRpYyB2b2lkIExvYWRTTXVsdChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBpbnN0ciwgQVJNd29yZCBXQkJhc2UpIDsKK3N0YXRpYyB2b2lkIFN0b3JlU011bHQoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIGFkZHJlc3MsIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgV0JCYXNlKSA7CitzdGF0aWMgdW5zaWduZWQgTXVsdGlwbHk2NChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgaW5zdHIsaW50IHNpZ25leHRlbmQsaW50IHNjYykgOworc3RhdGljIHVuc2lnbmVkIE11bHRpcGx5QWRkNjQoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIGluc3RyLGludCBzaWduZXh0ZW5kLGludCBzY2MpIDsKKworI2RlZmluZSBMVU5TSUdORUQgKDApICAgLyogdW5zaWduZWQgb3BlcmF0aW9uICovCisjZGVmaW5lIExTSUdORUQgICAoMSkgICAvKiBzaWduZWQgb3BlcmF0aW9uICovCisjZGVmaW5lIExERUZBVUxUICAoMCkgICAvKiBkZWZhdWx0IDogZG8gbm90aGluZyAqLworI2RlZmluZSBMU0NDICAgICAgKDEpICAgLyogc2V0IGNvbmRpdGlvbiBjb2RlcyBvbiByZXN1bHQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICBzaG9ydC1oYW5kIG1hY3JvcyBmb3IgTERSL1NUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBzdG9yZSBwb3N0IGRlY3JlbWVudCB3cml0ZWJhY2sgKi8KKyNkZWZpbmUgU0hET1dOV0IoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBsaHMgPSBMSFMgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChTdG9yZUhhbGZXb3JkKHN0YXRlLCBpbnN0ciwgbGhzKSkgICAgICAgICAgICAgICAgIFwKKyAgICAgTFNCYXNlID0gbGhzIC0gR2V0TFM3UkhTKHN0YXRlLCBpbnN0cikgOworCisvKiBzdG9yZSBwb3N0IGluY3JlbWVudCB3cml0ZWJhY2sgKi8KKyNkZWZpbmUgU0hVUFdCKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBsaHMgPSBMSFMgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChTdG9yZUhhbGZXb3JkKHN0YXRlLCBpbnN0ciwgbGhzKSkgICAgICAgICAgICAgICAgIFwKKyAgICAgTFNCYXNlID0gbGhzICsgR2V0TFM3UkhTKHN0YXRlLCBpbnN0cikgOworCisvKiBzdG9yZSBwcmUgZGVjcmVtZW50ICovCisjZGVmaW5lIFNIUFJFRE9XTigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHZvaWQpU3RvcmVIYWxmV29yZChzdGF0ZSwgaW5zdHIsIExIUyAtIEdldExTN1JIUyhzdGF0ZSwgaW5zdHIpKSA7CisKKy8qIHN0b3JlIHByZSBkZWNyZW1lbnQgd3JpdGViYWNrICovCisjZGVmaW5lIFNIUFJFRE9XTldCKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcCA9IExIUyAtIEdldExTN1JIUyhzdGF0ZSwgaW5zdHIpIDsgICAgICAgICAgICAgICAgXAorICBpZiAoU3RvcmVIYWxmV29yZChzdGF0ZSwgaW5zdHIsIHRlbXApKSAgICAgICAgICAgICAgICBcCisgICAgIExTQmFzZSA9IHRlbXAgOworCisvKiBzdG9yZSBwcmUgaW5jcmVtZW50ICovCisjZGVmaW5lIFNIUFJFVVAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHZvaWQpU3RvcmVIYWxmV29yZChzdGF0ZSwgaW5zdHIsIExIUyArIEdldExTN1JIUyhzdGF0ZSwgaW5zdHIpKSA7ICAKKworLyogc3RvcmUgcHJlIGluY3JlbWVudCB3cml0ZWJhY2sgKi8KKyNkZWZpbmUgU0hQUkVVUFdCKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wID0gTEhTICsgR2V0TFM3UkhTKHN0YXRlLCBpbnN0cikgOyAgICAgICAgICAgICAgICBcCisgIGlmIChTdG9yZUhhbGZXb3JkKHN0YXRlLCBpbnN0ciwgdGVtcCkpICAgICAgICAgICAgICAgIFwKKyAgICAgTFNCYXNlID0gdGVtcCA7CisKKy8qIGxvYWQgcG9zdCBkZWNyZW1lbnQgd3JpdGViYWNrICovCisjZGVmaW5lIExIUE9TVERPV04oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgZG9uZSA9IDEgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGxocyA9IExIUyA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3dpdGNoIChCSVRTKDUsNikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMTogLyogSCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoTG9hZEhhbGZXb3JkKHN0YXRlLGluc3RyLGxocyxMVU5TSUdORUQpKSAgICAgIFwKKyAgICAgICAgIExTQmFzZSA9IGxocyAtIEdldExTN1JIUyhzdGF0ZSxpbnN0cikgOyAgICAgICAgXAorICAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAyOiAvKiBTQiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChMb2FkQnl0ZShzdGF0ZSxpbnN0cixsaHMsTFNJR05FRCkpICAgICAgICAgICAgXAorICAgICAgICAgTFNCYXNlID0gbGhzIC0gR2V0TFM3UkhTKHN0YXRlLGluc3RyKSA7ICAgICAgICBcCisgICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDM6IC8qIFNIICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKExvYWRIYWxmV29yZChzdGF0ZSxpbnN0cixsaHMsTFNJR05FRCkpICAgICAgICBcCisgICAgICAgICBMU0Jhc2UgPSBsaHMgLSBHZXRMUzdSSFMoc3RhdGUsaW5zdHIpIDsgICAgICAgIFwKKyAgICAgIGJyZWFrIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMDogLyogU1dQIGhhbmRsZWQgZWxzZXdoZXJlICovICAgICAgICAgICAgICAgICBcCisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGRvbmUgPSAwIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGRvbmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8qIGxvYWQgcG9zdCBpbmNyZW1lbnQgd3JpdGViYWNrICovCisjZGVmaW5lIExIUE9TVFVQKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgZG9uZSA9IDEgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGxocyA9IExIUyA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3dpdGNoIChCSVRTKDUsNikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMTogLyogSCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoTG9hZEhhbGZXb3JkKHN0YXRlLGluc3RyLGxocyxMVU5TSUdORUQpKSAgICAgIFwKKyAgICAgICAgIExTQmFzZSA9IGxocyArIEdldExTN1JIUyhzdGF0ZSxpbnN0cikgOyAgICAgICAgXAorICAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAyOiAvKiBTQiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChMb2FkQnl0ZShzdGF0ZSxpbnN0cixsaHMsTFNJR05FRCkpICAgICAgICAgICAgXAorICAgICAgICAgTFNCYXNlID0gbGhzICsgR2V0TFM3UkhTKHN0YXRlLGluc3RyKSA7ICAgICAgICBcCisgICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDM6IC8qIFNIICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKExvYWRIYWxmV29yZChzdGF0ZSxpbnN0cixsaHMsTFNJR05FRCkpICAgICAgICBcCisgICAgICAgICBMU0Jhc2UgPSBsaHMgKyBHZXRMUzdSSFMoc3RhdGUsaW5zdHIpIDsgICAgICAgIFwKKyAgICAgIGJyZWFrIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMDogLyogU1dQIGhhbmRsZWQgZWxzZXdoZXJlICovICAgICAgICAgICAgICAgICBcCisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGRvbmUgPSAwIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGRvbmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8qIGxvYWQgcHJlIGRlY3JlbWVudCAqLworI2RlZmluZSBMSFBSRURPV04oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGRvbmUgPSAxIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wID0gTEhTIC0gR2V0TFM3UkhTKHN0YXRlLGluc3RyKSA7ICAgICAgICAgICAgICAgICBcCisgIHN3aXRjaCAoQklUUyg1LDYpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDE6IC8qIEggKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHZvaWQpTG9hZEhhbGZXb3JkKHN0YXRlLGluc3RyLHRlbXAsTFVOU0lHTkVEKSA7ICBcCisgICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDI6IC8qIFNCICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHZvaWQpTG9hZEJ5dGUoc3RhdGUsaW5zdHIsdGVtcCxMU0lHTkVEKSA7ICAgICAgICBcCisgICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDM6IC8qIFNIICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHZvaWQpTG9hZEhhbGZXb3JkKHN0YXRlLGluc3RyLHRlbXAsTFNJR05FRCkgOyAgICBcCisgICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDA6IC8qIFNXUCBoYW5kbGVkIGVsc2V3aGVyZSAqLyAgICAgICAgICAgICAgICAgXAorICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBkb25lID0gMCA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGJyZWFrIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChkb25lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvKiBsb2FkIHByZSBkZWNyZW1lbnQgd3JpdGViYWNrICovCisjZGVmaW5lIExIUFJFRE9XTldCKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgZG9uZSA9IDEgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXAgPSBMSFMgLSBHZXRMUzdSSFMoc3RhdGUsIGluc3RyKSA7ICAgICAgICAgICAgICAgIFwKKyAgc3dpdGNoIChCSVRTKDUsNikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMTogLyogSCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoTG9hZEhhbGZXb3JkKHN0YXRlLGluc3RyLHRlbXAsTFVOU0lHTkVEKSkgICAgIFwKKyAgICAgICAgIExTQmFzZSA9IHRlbXAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAyOiAvKiBTQiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChMb2FkQnl0ZShzdGF0ZSxpbnN0cix0ZW1wLExTSUdORUQpKSAgICAgICAgICAgXAorICAgICAgICAgTFNCYXNlID0gdGVtcCA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDM6IC8qIFNIICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKExvYWRIYWxmV29yZChzdGF0ZSxpbnN0cix0ZW1wLExTSUdORUQpKSAgICAgICBcCisgICAgICAgICBMU0Jhc2UgPSB0ZW1wIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGJyZWFrIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMDogLyogU1dQIGhhbmRsZWQgZWxzZXdoZXJlICovICAgICAgICAgICAgICAgICBcCisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGRvbmUgPSAwIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGRvbmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8qIGxvYWQgcHJlIGluY3JlbWVudCAqLworI2RlZmluZSBMSFBSRVVQKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGRvbmUgPSAxIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wID0gTEhTICsgR2V0TFM3UkhTKHN0YXRlLGluc3RyKSA7ICAgICAgICAgICAgICAgICBcCisgIHN3aXRjaCAoQklUUyg1LDYpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDE6IC8qIEggKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHZvaWQpTG9hZEhhbGZXb3JkKHN0YXRlLGluc3RyLHRlbXAsTFVOU0lHTkVEKSA7ICBcCisgICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDI6IC8qIFNCICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHZvaWQpTG9hZEJ5dGUoc3RhdGUsaW5zdHIsdGVtcCxMU0lHTkVEKSA7ICAgICAgICBcCisgICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDM6IC8qIFNIICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHZvaWQpTG9hZEhhbGZXb3JkKHN0YXRlLGluc3RyLHRlbXAsTFNJR05FRCkgOyAgICBcCisgICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDA6IC8qIFNXUCBoYW5kbGVkIGVsc2V3aGVyZSAqLyAgICAgICAgICAgICAgICAgXAorICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBkb25lID0gMCA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGJyZWFrIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChkb25lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvKiBsb2FkIHByZSBpbmNyZW1lbnQgd3JpdGViYWNrICovCisjZGVmaW5lIExIUFJFVVBXQigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgZG9uZSA9IDEgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXAgPSBMSFMgKyBHZXRMUzdSSFMoc3RhdGUsIGluc3RyKSA7ICAgICAgICAgICAgICAgIFwKKyAgc3dpdGNoIChCSVRTKDUsNikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMTogLyogSCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoTG9hZEhhbGZXb3JkKHN0YXRlLGluc3RyLHRlbXAsTFVOU0lHTkVEKSkgICAgIFwKKyAgICAgICAgIExTQmFzZSA9IHRlbXAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAyOiAvKiBTQiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChMb2FkQnl0ZShzdGF0ZSxpbnN0cix0ZW1wLExTSUdORUQpKSAgICAgICAgICAgXAorICAgICAgICAgTFNCYXNlID0gdGVtcCA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDM6IC8qIFNIICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKExvYWRIYWxmV29yZChzdGF0ZSxpbnN0cix0ZW1wLExTSUdORUQpKSAgICAgICBcCisgICAgICAgICBMU0Jhc2UgPSB0ZW1wIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGJyZWFrIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMDogLyogU1dQIGhhbmRsZWQgZWxzZXdoZXJlICovICAgICAgICAgICAgICAgICBcCisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGRvbmUgPSAwIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgYnJlYWsgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGRvbmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBicmVhayA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTVVMQVRJT04gb2YgQVJNNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIFBDIHBpcGVsaW5lIHZhbHVlIGRlcGVuZHMgb24gd2hldGhlciBBUk0gb3IgVGh1bWIgaW5zdHJ1Y3Rpb25zCisgICBhcmUgYmVpbmcgZXhlY3V0ZWQ6ICovCitBUk13b3JkIGlzaXplOworCisjaWZkZWYgTU9ERTMyCitBUk13b3JkIEFSTXVsX0VtdWxhdGUzMihyZWdpc3RlciBBUk11bF9TdGF0ZSAqc3RhdGUpCit7CisjZWxzZQorQVJNd29yZCBBUk11bF9FbXVsYXRlMjYocmVnaXN0ZXIgQVJNdWxfU3RhdGUgKnN0YXRlKQoreworI2VuZGlmCisgcmVnaXN0ZXIgQVJNd29yZCBpbnN0ciwgLyogdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgZGVzdCwgLyogYWxtb3N0IHRoZSBEZXN0QnVzICovCisgICAgICAgICAgICAgICAgIHRlbXAsIC8qIHViaXF1aXRvdXMgdGhpcmQgaGFuZCAqLworICAgICAgICAgICAgICAgICBwYyA7IC8qIHRoZSBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IGluc3RydWN0aW9uICovCisgQVJNd29yZCBsaHMsIHJocyA7IC8qIGFsbW9zdCB0aGUgQUJ1cyBhbmQgQkJ1cyAqLworIEFSTXdvcmQgZGVjb2RlZCwgbG9hZGVkIDsgLyogaW5zdHJ1Y3Rpb24gcGlwZWxpbmUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRlIHRoZSBuZXh0IGluc3RydWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgaWYgKHN0YXRlLT5OZXh0SW5zdHIgPCBQUklNRVBJUEUpIHsKKyAgICBkZWNvZGVkID0gc3RhdGUtPmRlY29kZWQgOworICAgIGxvYWRlZCA9IHN0YXRlLT5sb2FkZWQgOworICAgIHBjID0gc3RhdGUtPnBjIDsKKyAgICB9CisKKyBkbyB7IC8qIGp1c3Qga2VlcCBnb2luZyAqLworI2lmZGVmIE1PREVUCisgICAgaWYgKFRGTEFHKSB7CisgICAgIGlzaXplID0gMjsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgICBpc2l6ZSA9IDQ7CisgICAgc3dpdGNoIChzdGF0ZS0+TmV4dEluc3RyKSB7CisgICAgICAgY2FzZSBTRVEgOgorICAgICAgICAgIHN0YXRlLT5SZWdbMTVdICs9IGlzaXplIDsgLyogQWR2YW5jZSB0aGUgcGlwZWxpbmUsIGFuZCBhbiBTIGN5Y2xlICovCisgICAgICAgICAgcGMgKz0gaXNpemUgOworICAgICAgICAgIGluc3RyID0gZGVjb2RlZCA7CisgICAgICAgICAgZGVjb2RlZCA9IGxvYWRlZCA7CisgICAgICAgICAgbG9hZGVkID0gQVJNdWxfTG9hZEluc3RyUyhzdGF0ZSxwYysoaXNpemUgKiAyKSxpc2l6ZSkgOworICAgICAgICAgIGJyZWFrIDsKKworICAgICAgIGNhc2UgTk9OU0VRIDoKKyAgICAgICAgICBzdGF0ZS0+UmVnWzE1XSArPSBpc2l6ZSA7IC8qIEFkdmFuY2UgdGhlIHBpcGVsaW5lLCBhbmQgYW4gTiBjeWNsZSAqLworICAgICAgICAgIHBjICs9IGlzaXplIDsKKyAgICAgICAgICBpbnN0ciA9IGRlY29kZWQgOworICAgICAgICAgIGRlY29kZWQgPSBsb2FkZWQgOworICAgICAgICAgIGxvYWRlZCA9IEFSTXVsX0xvYWRJbnN0ck4oc3RhdGUscGMrKGlzaXplICogMiksaXNpemUpIDsKKyAgICAgICAgICBOT1JNQUxDWUNMRSA7CisgICAgICAgICAgYnJlYWsgOworCisgICAgICAgY2FzZSBQQ0lOQ0VEU0VRIDoKKyAgICAgICAgICBwYyArPSBpc2l6ZSA7IC8qIFByb2dyYW0gY291bnRlciBhZHZhbmNlZCwgYW5kIGFuIFMgY3ljbGUgKi8KKyAgICAgICAgICBpbnN0ciA9IGRlY29kZWQgOworICAgICAgICAgIGRlY29kZWQgPSBsb2FkZWQgOworICAgICAgICAgIGxvYWRlZCA9IEFSTXVsX0xvYWRJbnN0clMoc3RhdGUscGMrKGlzaXplICogMiksaXNpemUpIDsKKyAgICAgICAgICBOT1JNQUxDWUNMRSA7CisgICAgICAgICAgYnJlYWsgOworCisgICAgICAgY2FzZSBQQ0lOQ0VETk9OU0VRIDoKKyAgICAgICAgICBwYyArPSBpc2l6ZSA7IC8qIFByb2dyYW0gY291bnRlciBhZHZhbmNlZCwgYW5kIGFuIE4gY3ljbGUgKi8KKyAgICAgICAgICBpbnN0ciA9IGRlY29kZWQgOworICAgICAgICAgIGRlY29kZWQgPSBsb2FkZWQgOworICAgICAgICAgIGxvYWRlZCA9IEFSTXVsX0xvYWRJbnN0ck4oc3RhdGUscGMrKGlzaXplICogMiksaXNpemUpIDsKKyAgICAgICAgICBOT1JNQUxDWUNMRSA7CisgICAgICAgICAgYnJlYWsgOworCisgICAgICAgY2FzZSBSRVNVTUUgOiAvKiBUaGUgcHJvZ3JhbSBjb3VudGVyIGhhcyBiZWVuIGNoYW5nZWQgKi8KKyAgICAgICAgICBwYyA9IHN0YXRlLT5SZWdbMTVdIDsKKyNpZm5kZWYgTU9ERTMyCisgICAgICAgICAgcGMgPSBwYyAmIFIxNVBDQklUUyA7CisjZW5kaWYKKyAgICAgICAgICBzdGF0ZS0+UmVnWzE1XSA9IHBjICsgKGlzaXplICogMikgOworICAgICAgICAgIHN0YXRlLT5BYm9ydGVkID0gMCA7CisgICAgICAgICAgaW5zdHIgPSBBUk11bF9SZUxvYWRJbnN0cihzdGF0ZSxwYyxpc2l6ZSkgOworICAgICAgICAgIGRlY29kZWQgPSBBUk11bF9SZUxvYWRJbnN0cihzdGF0ZSxwYyArIGlzaXplLGlzaXplKSA7CisgICAgICAgICAgbG9hZGVkID0gQVJNdWxfUmVMb2FkSW5zdHIoc3RhdGUscGMgKyBpc2l6ZSAqIDIsaXNpemUpIDsKKyAgICAgICAgICBOT1JNQUxDWUNMRSA7CisgICAgICAgICAgYnJlYWsgOworCisgICAgICAgZGVmYXVsdCA6IC8qIFRoZSBwcm9ncmFtIGNvdW50ZXIgaGFzIGJlZW4gY2hhbmdlZCAqLworICAgICAgICAgIHBjID0gc3RhdGUtPlJlZ1sxNV0gOworI2lmbmRlZiBNT0RFMzIKKyAgICAgICAgICBwYyA9IHBjICYgUjE1UENCSVRTIDsKKyNlbmRpZgorICAgICAgICAgIHN0YXRlLT5SZWdbMTVdID0gcGMgKyAoaXNpemUgKiAyKSA7CisgICAgICAgICAgc3RhdGUtPkFib3J0ZWQgPSAwIDsKKyAgICAgICAgICBpbnN0ciA9IEFSTXVsX0xvYWRJbnN0ck4oc3RhdGUscGMsaXNpemUpIDsKKyAgICAgICAgICBkZWNvZGVkID0gQVJNdWxfTG9hZEluc3RyUyhzdGF0ZSxwYyArIChpc2l6ZSksaXNpemUpIDsKKyAgICAgICAgICBsb2FkZWQgPSBBUk11bF9Mb2FkSW5zdHJTKHN0YXRlLHBjICsgKGlzaXplICogMiksaXNpemUpIDsKKyAgICAgICAgICBOT1JNQUxDWUNMRSA7CisgICAgICAgICAgYnJlYWsgOworICAgICAgIH0KKyAgICBpZiAoc3RhdGUtPkV2ZW50U2V0KQorICAgICAgIEFSTXVsX0Vudm9rZUV2ZW50KHN0YXRlKSA7CisgICAgCisjaWYgMAorICAgIC8qIEVuYWJsZSB0aGlzIGZvciBhIGhlbHBmdWwgYml0IG9mIGRlYnVnZ2luZyB3aGVuIHRyYWNpbmcgaXMgbmVlZGVkLiAgKi8KKyAgICBmcHJpbnRmIChzdGRlcnIsICJwYzogJXgsIGluc3RyOiAleFxuIiwgcGMgJiB+MSwgaW5zdHIpOworICAgIGlmIChpbnN0ciA9PSAwKSBhYm9ydCAoKTsKKyNlbmRpZgorCisgICAgaWYgKHN0YXRlLT5FeGNlcHRpb24pIHsgLyogQW55IGV4Y2VwdGlvbnMgKi8KKyAgICAgICBpZiAoc3RhdGUtPk5yZXNldFNpZyA9PSBMT1cpIHsKKyAgICAgICAgICAgQVJNdWxfQWJvcnQoc3RhdGUsQVJNdWxfUmVzZXRWKSA7CisgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgfQorICAgICAgIGVsc2UgaWYgKCFzdGF0ZS0+TmZpcVNpZyAmJiAhRkZMQUcpIHsKKyAgICAgICAgICAgQVJNdWxfQWJvcnQoc3RhdGUsQVJNdWxfRklRVikgOworICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgIH0KKyAgICAgICBlbHNlIGlmICghc3RhdGUtPk5pcnFTaWcgJiYgIUlGTEFHKSB7CisgICAgICAgICAgQVJNdWxfQWJvcnQoc3RhdGUsQVJNdWxfSVJRVikgOworICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICB9CisgICAgICAgfQorCisgICAgaWYgKHN0YXRlLT5DYWxsRGVidWcgPiAwKSB7CisgICAgICAgaW5zdHIgPSBBUk11bF9EZWJ1ZyhzdGF0ZSxwYyxpbnN0cikgOworICAgICAgIGlmIChzdGF0ZS0+RW11bGF0ZSA8IE9OQ0UpIHsKKyAgICAgICAgICBzdGF0ZS0+TmV4dEluc3RyID0gUkVTVU1FIDsKKyAgICAgICAgICBicmVhayA7CisgICAgICAgICAgfQorICAgICAgIGlmIChzdGF0ZS0+RGVidWcpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiQXQgJTA4bHggSW5zdHIgJTA4bHggTW9kZSAlMDJseFxuIixwYyxpbnN0cixzdGF0ZS0+TW9kZSkgOworICAgICAgICAgICh2b2lkKWZnZXRjKHN0ZGluKSA7CisgICAgICAgICAgfQorICAgICAgIH0KKyAgICBlbHNlCisgICAgICAgaWYgKHN0YXRlLT5FbXVsYXRlIDwgT05DRSkgeworICAgICAgICAgIHN0YXRlLT5OZXh0SW5zdHIgPSBSRVNVTUUgOworICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICB9CisKKyAgICBzdGF0ZS0+TnVtSW5zdHJzKysgOworCisjaWZkZWYgTU9ERVQKKyAvKiBQcm92aWRlIFRodW1iIGluc3RydWN0aW9uIGRlY29kaW5nLiBJZiB0aGUgcHJvY2Vzc29yIGlzIGluIFRodW1iCisgICAgbW9kZSwgdGhlbiB3ZSBjYW4gc2ltcGx5IGRlY29kZSB0aGUgVGh1bWIgaW5zdHJ1Y3Rpb24sIGFuZCBtYXAgaXQKKyAgICB0byB0aGUgY29ycmVzcG9uZGluZyBBUk0gaW5zdHJ1Y3Rpb24gKGJ5IGRpcmVjdGx5IGxvYWRpbmcgdGhlCisgICAgaW5zdHIgdmFyaWFibGUsIGFuZCBsZXR0aW5nIHRoZSBub3JtYWwgQVJNIHNpbXVsYXRvcgorICAgIGV4ZWN1dGUpLiBUaGVyZSBhcmUgc29tZSBjYXZlYXRzIHRvIGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0CisgICAgcGlwZWxpbmVkIFBDIHZhbHVlIGlzIHVzZWQgd2hlbiBleGVjdXRpbmcgVGh1bWIgY29kZSwgYW5kIGFsc28gZm9yCisgICAgZGVhbGluZyB3aXRoIHRoZSBCTCBpbnN0cnVjdGlvbi4gKi8KKyAgICBpZiAoVEZMQUcpIHsgLyogY2hlY2sgaWYgaW4gVGh1bWIgbW9kZSAqLworICAgICAgQVJNd29yZCBuZXc7CisgICAgICBzd2l0Y2ggKEFSTXVsX1RodW1iRGVjb2RlKHN0YXRlLHBjLGluc3RyLCZuZXcpKSB7CisgICAgICAgIGNhc2UgdF91bmRlZmluZWQ6CisgICAgICAgICAgQVJNdWxfVW5kZWZJbnN0cihzdGF0ZSxpbnN0cik7IC8qIFRoaXMgaXMgYSBUaHVtYiBpbnN0cnVjdGlvbiAqLworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9icmFuY2g6IC8qIGFscmVhZHkgcHJvY2Vzc2VkICovCisgICAgICAgICAgZ290byBkb25leHQ7CisKKyAgICAgICAgY2FzZSB0X2RlY29kZWQ6IC8qIEFSTSBpbnN0cnVjdGlvbiBhdmFpbGFibGUgKi8KKyAgICAgICAgICBpbnN0ciA9IG5ldzsgLyogc28gY29udGludWUgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgKi8KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoZSBjb25kaXRpb24gY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICgodGVtcCA9IFRPUEJJVFMoMjgpKSA9PSBBTCkKKyAgICAgICBnb3RvIG1haW5zd2l0Y2ggOyAvKiB2aWxlIGRlZWQgaW4gdGhlIG5lZWQgZm9yIHNwZWVkICovCisKKyAgICBzd2l0Y2ggKChpbnQpVE9QQklUUygyOCkpIHsgLyogY2hlY2sgdGhlIGNvbmRpdGlvbiBjb2RlICovCisgICAgICAgY2FzZSBBTCA6IHRlbXA9VFJVRSA7CisgICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICBjYXNlIE5WIDogdGVtcD1GQUxTRSA7CisgICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICBjYXNlIEVRIDogdGVtcD1aRkxBRyA7CisgICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICBjYXNlIE5FIDogdGVtcD0hWkZMQUcgOworICAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgY2FzZSBWUyA6IHRlbXA9VkZMQUcgOworICAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgY2FzZSBWQyA6IHRlbXA9IVZGTEFHIDsKKyAgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgIGNhc2UgTUkgOiB0ZW1wPU5GTEFHIDsKKyAgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgIGNhc2UgUEwgOiB0ZW1wPSFORkxBRyA7CisgICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICBjYXNlIENTIDogdGVtcD1DRkxBRyA7CisgICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICBjYXNlIENDIDogdGVtcD0hQ0ZMQUcgOworICAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgY2FzZSBISSA6IHRlbXA9KENGTEFHICYmICFaRkxBRykgOworICAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgY2FzZSBMUyA6IHRlbXA9KCFDRkxBRyB8fCBaRkxBRykgOworICAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgY2FzZSBHRSA6IHRlbXA9KCghTkZMQUcgJiYgIVZGTEFHKSB8fCAoTkZMQUcgJiYgVkZMQUcpKSA7CisgICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICBjYXNlIExUIDogdGVtcD0oKE5GTEFHICYmICFWRkxBRykgfHwgKCFORkxBRyAmJiBWRkxBRykpIDsKKyAgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgIGNhc2UgR1QgOiB0ZW1wPSgoIU5GTEFHICYmICFWRkxBRyAmJiAhWkZMQUcpIHx8IChORkxBRyAmJiBWRkxBRyAmJiAhWkZMQUcpKSA7CisgICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICBjYXNlIExFIDogdGVtcD0oKE5GTEFHICYmICFWRkxBRykgfHwgKCFORkxBRyAmJiBWRkxBRykpIHx8IFpGTEFHIDsKKyAgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgIH0gLyogY2MgY2hlY2sgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICBBY3R1YWwgZXhlY3V0aW9uIG9mIGluc3RydWN0aW9ucyBiZWdpbnMgaGVyZSAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHRlbXApIHsgLyogaWYgdGhlIGNvbmRpdGlvbiBjb2RlcyBkb24ndCBtYXRjaCwgc3RvcCBoZXJlICovCittYWluc3dpdGNoOgorCisgICAgICAgc3dpdGNoICgoaW50KUJJVFMoMjAsMjcpKSB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICBEYXRhIFByb2Nlc3NpbmcgUmVnaXN0ZXIgUkhTIEluc3RydWN0aW9ucyAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgIGNhc2UgMHgwMCA6IC8qIEFORCByZWcgYW5kIE1VTCAqLworI2lmZGVmIE1PREVUCisgICAgICAgICAgICAgaWYgKEJJVFMoNCwxMSkgPT0gMHhCKSB7CisgICAgICAgICAgICAgICAvKiBTVFJIIHJlZ2lzdGVyIG9mZnNldCwgbm8gd3JpdGUtYmFjaywgZG93biwgcG9zdCBpbmRleGVkICovCisgICAgICAgICAgICAgICBTSERPV05XQigpIDsKKyAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAvKiBUT0RPOiBDSEVDSzogc2hvdWxkIDB4RCBhbmQgMHhGIGdlbmVyYXRlIHVuZGVmaW5lZCBpbnRydWN0aW9uIGFib3J0cz8gKi8KKyNlbmRpZgorICAgICAgICAgICAgIGlmIChCSVRTKDQsNykgPT0gOSkgeyAvKiBNVUwgKi8KKyAgICAgICAgICAgICAgICByaHMgPSBzdGF0ZS0+UmVnW01VTFJIU1JlZ10gOworICAgICAgICAgICAgICAgIGlmIChNVUxMSFNSZWcgPT0gTVVMREVTVFJlZykgeworICAgICAgICAgICAgICAgICAgIFVOREVGX01VTERlc3RFUU9wMSA7CisgICAgICAgICAgICAgICAgICAgc3RhdGUtPlJlZ1tNVUxERVNUUmVnXSA9IDAgOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChNVUxERVNUUmVnICE9IDE1KQorICAgICAgICAgICAgICAgICAgIHN0YXRlLT5SZWdbTVVMREVTVFJlZ10gPSBzdGF0ZS0+UmVnW01VTExIU1JlZ10gKiByaHMgOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgIFVOREVGX01VTFBDRGVzdCA7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoZGVzdCA9IDAsIHRlbXAgPSAwIDsgZGVzdCA8IDMyIDsgZGVzdCsrKQorICAgICAgICAgICAgICAgICAgIGlmIChyaHMgJiAoMUwgPDwgZGVzdCkpCisgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGRlc3QgOyAvKiBtdWx0IHRha2VzIHRoaXMgbWFueS8yIEkgY3ljbGVzICovCisgICAgICAgICAgICAgICAgQVJNdWxfSWN5Y2xlcyhzdGF0ZSxBUk11bF9NdWx0VGFibGVbdGVtcF0sMEwpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSB7IC8qIEFORCByZWcgKi8KKyAgICAgICAgICAgICAgICByaHMgPSBEUFJlZ1JIUyA7CisgICAgICAgICAgICAgICAgZGVzdCA9IExIUyAmIHJocyA7CisgICAgICAgICAgICAgICAgV1JJVEVERVNUKGRlc3QpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDAxIDogLyogQU5EUyByZWcgYW5kIE1VTFMgKi8KKyNpZmRlZiBNT0RFVAorICAgICAgICAgICAgIGlmICgoQklUUyg0LDExKSAmIDB4RjkpID09IDB4OSkgeworICAgICAgICAgICAgICAgLyogTERSIHJlZ2lzdGVyIG9mZnNldCwgbm8gd3JpdGUtYmFjaywgZG93biwgcG9zdCBpbmRleGVkICovCisgICAgICAgICAgICAgICBMSFBPU1RET1dOKCkgOworICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoIHRvIHJlc3Qgb2YgZGVjb2RpbmcgKi8KKyAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgIGlmIChCSVRTKDQsNykgPT0gOSkgeyAvKiBNVUxTICovCisgICAgICAgICAgICAgICAgcmhzID0gc3RhdGUtPlJlZ1tNVUxSSFNSZWddIDsKKyAgICAgICAgICAgICAgICBpZiAoTVVMTEhTUmVnID09IE1VTERFU1RSZWcpIHsKKyAgICAgICAgICAgICAgICAgICBVTkRFRl9NVUxEZXN0RVFPcDEgOworICAgICAgICAgICAgICAgICAgIHN0YXRlLT5SZWdbTVVMREVTVFJlZ10gPSAwIDsKKyAgICAgICAgICAgICAgICAgICBDTEVBUk4gOworICAgICAgICAgICAgICAgICAgIFNFVFogOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChNVUxERVNUUmVnICE9IDE1KSB7CisgICAgICAgICAgICAgICAgICAgZGVzdCA9IHN0YXRlLT5SZWdbTVVMTEhTUmVnXSAqIHJocyA7CisgICAgICAgICAgICAgICAgICAgQVJNdWxfTmVnWmVybyhzdGF0ZSxkZXN0KSA7CisgICAgICAgICAgICAgICAgICAgc3RhdGUtPlJlZ1tNVUxERVNUUmVnXSA9IGRlc3QgOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICBVTkRFRl9NVUxQQ0Rlc3QgOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGRlc3QgPSAwLCB0ZW1wID0gMCA7IGRlc3QgPCAzMiA7IGRlc3QrKykKKyAgICAgICAgICAgICAgICAgICBpZiAocmhzICYgKDFMIDw8IGRlc3QpKQorICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBkZXN0IDsgLyogbXVsdCB0YWtlcyB0aGlzIG1hbnkvMiBJIGN5Y2xlcyAqLworICAgICAgICAgICAgICAgIEFSTXVsX0ljeWNsZXMoc3RhdGUsQVJNdWxfTXVsdFRhYmxlW3RlbXBdLDBMKSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGVsc2UgeyAvKiBBTkRTIHJlZyAqLworICAgICAgICAgICAgICAgIHJocyA9IERQU1JlZ1JIUyA7CisgICAgICAgICAgICAgICAgZGVzdCA9IExIUyAmIHJocyA7CisgICAgICAgICAgICAgICAgV1JJVEVTREVTVChkZXN0KSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgwMiA6IC8qIEVPUiByZWcgYW5kIE1MQSAqLworI2lmZGVmIE1PREVUCisgICAgICAgICAgICAgaWYgKEJJVFMoNCwxMSkgPT0gMHhCKSB7CisgICAgICAgICAgICAgICAvKiBTVFJIIHJlZ2lzdGVyIG9mZnNldCwgd3JpdGUtYmFjaywgZG93biwgcG9zdCBpbmRleGVkICovCisgICAgICAgICAgICAgICBTSERPV05XQigpIDsKKyAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgIGlmIChCSVRTKDQsNykgPT0gOSkgeyAvKiBNTEEgKi8KKyAgICAgICAgICAgICAgICByaHMgPSBzdGF0ZS0+UmVnW01VTFJIU1JlZ10gOworICAgICAgICAgICAgICAgIGlmIChNVUxMSFNSZWcgPT0gTVVMREVTVFJlZykgeworICAgICAgICAgICAgICAgICAgIFVOREVGX01VTERlc3RFUU9wMSA7CisgICAgICAgICAgICAgICAgICAgc3RhdGUtPlJlZ1tNVUxERVNUUmVnXSA9IHN0YXRlLT5SZWdbTVVMQUNDUmVnXSA7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE1VTERFU1RSZWcgIT0gMTUpCisgICAgICAgICAgICAgICAgICAgc3RhdGUtPlJlZ1tNVUxERVNUUmVnXSA9IHN0YXRlLT5SZWdbTVVMTEhTUmVnXSAqIHJocyArIHN0YXRlLT5SZWdbTVVMQUNDUmVnXSA7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgVU5ERUZfTVVMUENEZXN0IDsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChkZXN0ID0gMCwgdGVtcCA9IDAgOyBkZXN0IDwgMzIgOyBkZXN0KyspCisgICAgICAgICAgICAgICAgICAgaWYgKHJocyAmICgxTCA8PCBkZXN0KSkKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gZGVzdCA7IC8qIG11bHQgdGFrZXMgdGhpcyBtYW55LzIgSSBjeWNsZXMgKi8KKyAgICAgICAgICAgICAgICBBUk11bF9JY3ljbGVzKHN0YXRlLEFSTXVsX011bHRUYWJsZVt0ZW1wXSwwTCkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByaHMgPSBEUFJlZ1JIUyA7CisgICAgICAgICAgICAgICAgZGVzdCA9IExIUyBeIHJocyA7CisgICAgICAgICAgICAgICAgV1JJVEVERVNUKGRlc3QpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDAzIDogLyogRU9SUyByZWcgYW5kIE1MQVMgKi8KKyNpZmRlZiBNT0RFVAorICAgICAgICAgICAgIGlmICgoQklUUyg0LDExKSAmIDB4RjkpID09IDB4OSkgeworICAgICAgICAgICAgICAgLyogTERSIHJlZ2lzdGVyIG9mZnNldCwgd3JpdGUtYmFjaywgZG93biwgcG9zdC1pbmRleGVkICovCisgICAgICAgICAgICAgICBMSFBPU1RET1dOKCkgOworICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoIHRvIHJlc3Qgb2YgdGhlIGRlY29kaW5nICovCisgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICBpZiAoQklUUyg0LDcpID09IDkpIHsgLyogTUxBUyAqLworICAgICAgICAgICAgICAgIHJocyA9IHN0YXRlLT5SZWdbTVVMUkhTUmVnXSA7CisgICAgICAgICAgICAgICAgaWYgKE1VTExIU1JlZyA9PSBNVUxERVNUUmVnKSB7CisgICAgICAgICAgICAgICAgICAgVU5ERUZfTVVMRGVzdEVRT3AxIDsKKyAgICAgICAgICAgICAgICAgICBkZXN0ID0gc3RhdGUtPlJlZ1tNVUxBQ0NSZWddIDsKKyAgICAgICAgICAgICAgICAgICBBUk11bF9OZWdaZXJvKHN0YXRlLGRlc3QpIDsKKyAgICAgICAgICAgICAgICAgICBzdGF0ZS0+UmVnW01VTERFU1RSZWddID0gZGVzdCA7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE1VTERFU1RSZWcgIT0gMTUpIHsKKyAgICAgICAgICAgICAgICAgICBkZXN0ID0gc3RhdGUtPlJlZ1tNVUxMSFNSZWddICogcmhzICsgc3RhdGUtPlJlZ1tNVUxBQ0NSZWddIDsKKyAgICAgICAgICAgICAgICAgICBBUk11bF9OZWdaZXJvKHN0YXRlLGRlc3QpIDsKKyAgICAgICAgICAgICAgICAgICBzdGF0ZS0+UmVnW01VTERFU1RSZWddID0gZGVzdCA7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgIFVOREVGX01VTFBDRGVzdCA7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoZGVzdCA9IDAsIHRlbXAgPSAwIDsgZGVzdCA8IDMyIDsgZGVzdCsrKQorICAgICAgICAgICAgICAgICAgIGlmIChyaHMgJiAoMUwgPDwgZGVzdCkpCisgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGRlc3QgOyAvKiBtdWx0IHRha2VzIHRoaXMgbWFueS8yIEkgY3ljbGVzICovCisgICAgICAgICAgICAgICAgQVJNdWxfSWN5Y2xlcyhzdGF0ZSxBUk11bF9NdWx0VGFibGVbdGVtcF0sMEwpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSB7IC8qIEVPUlMgUmVnICovCisgICAgICAgICAgICAgICAgcmhzID0gRFBTUmVnUkhTIDsKKyAgICAgICAgICAgICAgICBkZXN0ID0gTEhTIF4gcmhzIDsKKyAgICAgICAgICAgICAgICBXUklURVNERVNUKGRlc3QpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDA0IDogLyogU1VCIHJlZyAqLworI2lmZGVmIE1PREVUCisgICAgICAgICAgICAgaWYgKEJJVFMoNCw3KSA9PSAweEIpIHsKKyAgICAgICAgICAgICAgIC8qIFNUUkggaW1tZWRpYXRlIG9mZnNldCwgbm8gd3JpdGUtYmFjaywgZG93biwgcG9zdCBpbmRleGVkICovCisgICAgICAgICAgICAgICBTSERPV05XQigpIDsKKyAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgIHJocyA9IERQUmVnUkhTOworICAgICAgICAgICAgIGRlc3QgPSBMSFMgLSByaHMgOworICAgICAgICAgICAgIFdSSVRFREVTVChkZXN0KSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDA1IDogLyogU1VCUyByZWcgKi8KKyNpZmRlZiBNT0RFVAorICAgICAgICAgICAgIGlmICgoQklUUyg0LDcpICYgMHg5KSA9PSAweDkpIHsKKyAgICAgICAgICAgICAgIC8qIExEUiBpbW1lZGlhdGUgb2Zmc2V0LCBubyB3cml0ZS1iYWNrLCBkb3duLCBwb3N0IGluZGV4ZWQgKi8KKyAgICAgICAgICAgICAgIExIUE9TVERPV04oKSA7CisgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggdG8gdGhlIHJlc3Qgb2YgdGhlIGluc3RydWN0aW9uIGRlY29kaW5nICovCisgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIHJocyA9IERQUmVnUkhTIDsKKyAgICAgICAgICAgICBkZXN0ID0gbGhzIC0gcmhzIDsKKyAgICAgICAgICAgICBpZiAoKGxocyA+PSByaHMpIHx8ICgocmhzIHwgbGhzKSA+PiAzMSkpIHsKKyAgICAgICAgICAgICAgICBBUk11bF9TdWJDYXJyeShzdGF0ZSxsaHMscmhzLGRlc3QpIDsKKyAgICAgICAgICAgICAgICBBUk11bF9TdWJPdmVyZmxvdyhzdGF0ZSxsaHMscmhzLGRlc3QpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQ0xFQVJDIDsKKyAgICAgICAgICAgICAgICBDTEVBUlYgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBXUklURVNERVNUKGRlc3QpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4MDYgOiAvKiBSU0IgcmVnICovCisjaWZkZWYgTU9ERVQKKyAgICAgICAgICAgICBpZiAoQklUUyg0LDcpID09IDB4QikgeworICAgICAgICAgICAgICAgLyogU1RSSCBpbW1lZGlhdGUgb2Zmc2V0LCB3cml0ZS1iYWNrLCBkb3duLCBwb3N0IGluZGV4ZWQgKi8KKyAgICAgICAgICAgICAgIFNIRE9XTldCKCkgOworICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgcmhzID0gRFBSZWdSSFMgOworICAgICAgICAgICAgIGRlc3QgPSByaHMgLSBMSFMgOworICAgICAgICAgICAgIFdSSVRFREVTVChkZXN0KSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDA3IDogLyogUlNCUyByZWcgKi8KKyNpZmRlZiBNT0RFVAorICAgICAgICAgICAgIGlmICgoQklUUyg0LDcpICYgMHg5KSA9PSAweDkpIHsKKyAgICAgICAgICAgICAgIC8qIExEUiBpbW1lZGlhdGUgb2Zmc2V0LCB3cml0ZS1iYWNrLCBkb3duLCBwb3N0IGluZGV4ZWQgKi8KKyAgICAgICAgICAgICAgIExIUE9TVERPV04oKSA7CisgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggdG8gcmVtYWluZGVyIG9mIGluc3RydWN0aW9uIGRlY29kaW5nICovCisgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIHJocyA9IERQUmVnUkhTIDsKKyAgICAgICAgICAgICBkZXN0ID0gcmhzIC0gbGhzIDsKKyAgICAgICAgICAgICBpZiAoKHJocyA+PSBsaHMpIHx8ICgocmhzIHwgbGhzKSA+PiAzMSkpIHsKKyAgICAgICAgICAgICAgICBBUk11bF9TdWJDYXJyeShzdGF0ZSxyaHMsbGhzLGRlc3QpIDsKKyAgICAgICAgICAgICAgICBBUk11bF9TdWJPdmVyZmxvdyhzdGF0ZSxyaHMsbGhzLGRlc3QpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQ0xFQVJDIDsKKyAgICAgICAgICAgICAgICBDTEVBUlYgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBXUklURVNERVNUKGRlc3QpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4MDggOiAvKiBBREQgcmVnICovCisjaWZkZWYgTU9ERVQKKyAgICAgICAgICAgICBpZiAoQklUUyg0LDExKSA9PSAweEIpIHsKKyAgICAgICAgICAgICAgIC8qIFNUUkggcmVnaXN0ZXIgb2Zmc2V0LCBubyB3cml0ZS1iYWNrLCB1cCwgcG9zdCBpbmRleGVkICovCisgICAgICAgICAgICAgICBTSFVQV0IoKSA7CisgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBNT0RFVAorICAgICAgICAgICAgIGlmIChCSVRTKDQsNykgPT0gMHg5KSB7IC8qIE1VTEwgKi8KKyAgICAgICAgICAgICAgIC8qIDMyeDMyID0gNjQgKi8KKyAgICAgICAgICAgICAgIEFSTXVsX0ljeWNsZXMoc3RhdGUsTXVsdGlwbHk2NChzdGF0ZSxpbnN0cixMVU5TSUdORUQsTERFRkFVTFQpLDBMKSA7CisgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICByaHMgPSBEUFJlZ1JIUyA7CisgICAgICAgICAgICAgZGVzdCA9IExIUyArIHJocyA7CisgICAgICAgICAgICAgV1JJVEVERVNUKGRlc3QpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4MDkgOiAvKiBBRERTIHJlZyAqLworI2lmZGVmIE1PREVUCisgICAgICAgICAgICAgaWYgKChCSVRTKDQsMTEpICYgMHhGOSkgPT0gMHg5KSB7CisgICAgICAgICAgICAgICAvKiBMRFIgcmVnaXN0ZXIgb2Zmc2V0LCBubyB3cml0ZS1iYWNrLCB1cCwgcG9zdCBpbmRleGVkICovCisgICAgICAgICAgICAgICBMSFBPU1RVUCgpIDsKKyAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCB0byByZW1haW5pbmcgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgKi8KKyAgICAgICAgICAgICAgIH0KKyNlbmRpZgorI2lmZGVmIE1PREVUCisgICAgICAgICAgICAgaWYgKEJJVFMoNCw3KSA9PSAweDkpIHsgLyogTVVMTCAqLworICAgICAgICAgICAgICAgLyogMzJ4MzI9NjQgKi8KKyAgICAgICAgICAgICAgIEFSTXVsX0ljeWNsZXMoc3RhdGUsTXVsdGlwbHk2NChzdGF0ZSxpbnN0cixMVU5TSUdORUQsTFNDQyksMEwpIDsKKyAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgIGxocyA9IExIUyA7CisgICAgICAgICAgICAgcmhzID0gRFBSZWdSSFMgOworICAgICAgICAgICAgIGRlc3QgPSBsaHMgKyByaHMgOworICAgICAgICAgICAgIEFTU0lHTlooZGVzdD09MCkgOworICAgICAgICAgICAgIGlmICgobGhzIHwgcmhzKSA+PiAzMCkgeyAvKiBwb3NzaWJsZSBDLFYsTiB0byBzZXQgKi8KKyAgICAgICAgICAgICAgICBBU1NJR05OKE5FRyhkZXN0KSkgOworICAgICAgICAgICAgICAgIEFSTXVsX0FkZENhcnJ5KHN0YXRlLGxocyxyaHMsZGVzdCkgOworICAgICAgICAgICAgICAgIEFSTXVsX0FkZE92ZXJmbG93KHN0YXRlLGxocyxyaHMsZGVzdCkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTEVBUk4gOworICAgICAgICAgICAgICAgIENMRUFSQyA7CisgICAgICAgICAgICAgICAgQ0xFQVJWIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgV1JJVEVTREVTVChkZXN0KSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDBhIDogLyogQURDIHJlZyAqLworI2lmZGVmIE1PREVUCisgICAgICAgICAgICAgaWYgKEJJVFMoNCwxMSkgPT0gMHhCKSB7CisgICAgICAgICAgICAgICAvKiBTVFJIIHJlZ2lzdGVyIG9mZnNldCwgd3JpdGUtYmFjaywgdXAsIHBvc3QtaW5kZXhlZCAqLworICAgICAgICAgICAgICAgU0hVUFdCKCkgOworICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgTU9ERVQKKyAgICAgICAgICAgICBpZiAoQklUUyg0LDcpID09IDB4OSkgeyAvKiBNVUxMICovCisgICAgICAgICAgICAgICAvKiAzMngzMj02NCAqLworICAgICAgICAgICAgICAgQVJNdWxfSWN5Y2xlcyhzdGF0ZSxNdWx0aXBseUFkZDY0KHN0YXRlLGluc3RyLExVTlNJR05FRCxMREVGQVVMVCksMEwpIDsKKyAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgIHJocyA9IERQUmVnUkhTIDsKKyAgICAgICAgICAgICBkZXN0ID0gTEhTICsgcmhzICsgQ0ZMQUcgOworICAgICAgICAgICAgIFdSSVRFREVTVChkZXN0KSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDBiIDogLyogQURDUyByZWcgKi8KKyNpZmRlZiBNT0RFVAorICAgICAgICAgICAgIGlmICgoQklUUyg0LDExKSAmIDB4RjkpID09IDB4OSkgeworICAgICAgICAgICAgICAgLyogTERSIHJlZ2lzdGVyIG9mZnNldCwgd3JpdGUtYmFjaywgdXAsIHBvc3QgaW5kZXhlZCAqLworICAgICAgICAgICAgICAgTEhQT1NUVVAoKSA7CisgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggdG8gcmVtYWluaW5nIGluc3RydWN0aW9uIGRlY29kaW5nICovCisgICAgICAgICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBNT0RFVAorICAgICAgICAgICAgIGlmIChCSVRTKDQsNykgPT0gMHg5KSB7IC8qIE1VTEwgKi8KKyAgICAgICAgICAgICAgIC8qIDMyeDMyPTY0ICovCisgICAgICAgICAgICAgICBBUk11bF9JY3ljbGVzKHN0YXRlLE11bHRpcGx5QWRkNjQoc3RhdGUsaW5zdHIsTFVOU0lHTkVELExTQ0MpLDBMKSA7CisgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIHJocyA9IERQUmVnUkhTIDsKKyAgICAgICAgICAgICBkZXN0ID0gbGhzICsgcmhzICsgQ0ZMQUcgOworICAgICAgICAgICAgIEFTU0lHTlooZGVzdD09MCkgOworICAgICAgICAgICAgIGlmICgobGhzIHwgcmhzKSA+PiAzMCkgeyAvKiBwb3NzaWJsZSBDLFYsTiB0byBzZXQgKi8KKyAgICAgICAgICAgICAgICBBU1NJR05OKE5FRyhkZXN0KSkgOworICAgICAgICAgICAgICAgIEFSTXVsX0FkZENhcnJ5KHN0YXRlLGxocyxyaHMsZGVzdCkgOworICAgICAgICAgICAgICAgIEFSTXVsX0FkZE92ZXJmbG93KHN0YXRlLGxocyxyaHMsZGVzdCkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTEVBUk4gOworICAgICAgICAgICAgICAgIENMRUFSQyA7CisgICAgICAgICAgICAgICAgQ0xFQVJWIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgV1JJVEVTREVTVChkZXN0KSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDBjIDogLyogU0JDIHJlZyAqLworI2lmZGVmIE1PREVUCisgICAgICAgICAgICAgaWYgKEJJVFMoNCw3KSA9PSAweEIpIHsKKyAgICAgICAgICAgICAgIC8qIFNUUkggaW1tZWRpYXRlIG9mZnNldCwgbm8gd3JpdGUtYmFjaywgdXAgcG9zdCBpbmRleGVkICovCisgICAgICAgICAgICAgICBTSFVQV0IoKSA7CisgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBNT0RFVAorICAgICAgICAgICAgIGlmIChCSVRTKDQsNykgPT0gMHg5KSB7IC8qIE1VTEwgKi8KKyAgICAgICAgICAgICAgIC8qIDMyeDMyPTY0ICovCisgICAgICAgICAgICAgICBBUk11bF9JY3ljbGVzKHN0YXRlLE11bHRpcGx5NjQoc3RhdGUsaW5zdHIsTFNJR05FRCxMREVGQVVMVCksMEwpIDsKKyAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgIHJocyA9IERQUmVnUkhTIDsKKyAgICAgICAgICAgICBkZXN0ID0gTEhTIC0gcmhzIC0gIUNGTEFHIDsKKyAgICAgICAgICAgICBXUklURURFU1QoZGVzdCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgwZCA6IC8qIFNCQ1MgcmVnICovCisjaWZkZWYgTU9ERVQKKyAgICAgICAgICAgICBpZiAoKEJJVFMoNCw3KSAmIDB4OSkgPT0gMHg5KSB7CisgICAgICAgICAgICAgICAvKiBMRFIgaW1tZWRpYXRlIG9mZnNldCwgbm8gd3JpdGUtYmFjaywgdXAsIHBvc3QgaW5kZXhlZCAqLworICAgICAgICAgICAgICAgTEhQT1NUVVAoKSA7CisgICAgICAgICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBNT0RFVAorICAgICAgICAgICAgIGlmIChCSVRTKDQsNykgPT0gMHg5KSB7IC8qIE1VTEwgKi8KKyAgICAgICAgICAgICAgIC8qIDMyeDMyPTY0ICovCisgICAgICAgICAgICAgICBBUk11bF9JY3ljbGVzKHN0YXRlLE11bHRpcGx5NjQoc3RhdGUsaW5zdHIsTFNJR05FRCxMU0NDKSwwTCkgOworICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgbGhzID0gTEhTIDsKKyAgICAgICAgICAgICByaHMgPSBEUFJlZ1JIUyA7CisgICAgICAgICAgICAgZGVzdCA9IGxocyAtIHJocyAtICFDRkxBRyA7CisgICAgICAgICAgICAgaWYgKChsaHMgPj0gcmhzKSB8fCAoKHJocyB8IGxocykgPj4gMzEpKSB7CisgICAgICAgICAgICAgICAgQVJNdWxfU3ViQ2Fycnkoc3RhdGUsbGhzLHJocyxkZXN0KSA7CisgICAgICAgICAgICAgICAgQVJNdWxfU3ViT3ZlcmZsb3coc3RhdGUsbGhzLHJocyxkZXN0KSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIENMRUFSQyA7CisgICAgICAgICAgICAgICAgQ0xFQVJWIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgV1JJVEVTREVTVChkZXN0KSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDBlIDogLyogUlNDIHJlZyAqLworI2lmZGVmIE1PREVUCisgICAgICAgICAgICAgaWYgKEJJVFMoNCw3KSA9PSAweEIpIHsKKyAgICAgICAgICAgICAgIC8qIFNUUkggaW1tZWRpYXRlIG9mZnNldCwgd3JpdGUtYmFjaywgdXAsIHBvc3QgaW5kZXhlZCAqLworICAgICAgICAgICAgICAgU0hVUFdCKCkgOworICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgTU9ERVQKKyAgICAgICAgICAgICBpZiAoQklUUyg0LDcpID09IDB4OSkgeyAvKiBNVUxMICovCisgICAgICAgICAgICAgICAvKiAzMngzMj02NCAqLworICAgICAgICAgICAgICAgQVJNdWxfSWN5Y2xlcyhzdGF0ZSxNdWx0aXBseUFkZDY0KHN0YXRlLGluc3RyLExTSUdORUQsTERFRkFVTFQpLDBMKSA7CisgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICByaHMgPSBEUFJlZ1JIUyA7CisgICAgICAgICAgICAgZGVzdCA9IHJocyAtIExIUyAtICFDRkxBRyA7CisgICAgICAgICAgICAgV1JJVEVERVNUKGRlc3QpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4MGYgOiAvKiBSU0NTIHJlZyAqLworI2lmZGVmIE1PREVUCisgICAgICAgICAgICAgaWYgKChCSVRTKDQsNykgJiAweDkpID09IDB4OSkgeworICAgICAgICAgICAgICAgLyogTERSIGltbWVkaWF0ZSBvZmZzZXQsIHdyaXRlLWJhY2ssIHVwLCBwb3N0IGluZGV4ZWQgKi8KKyAgICAgICAgICAgICAgIExIUE9TVFVQKCkgOworICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoIHRvIHJlbWFpbmluZyBpbnN0cnVjdGlvbiBkZWNvZGluZyAqLworICAgICAgICAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgTU9ERVQKKyAgICAgICAgICAgICBpZiAoQklUUyg0LDcpID09IDB4OSkgeyAvKiBNVUxMICovCisgICAgICAgICAgICAgICAvKiAzMngzMj02NCAqLworICAgICAgICAgICAgICAgQVJNdWxfSWN5Y2xlcyhzdGF0ZSxNdWx0aXBseUFkZDY0KHN0YXRlLGluc3RyLExTSUdORUQsTFNDQyksMEwpIDsKKyAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgIGxocyA9IExIUyA7CisgICAgICAgICAgICAgcmhzID0gRFBSZWdSSFMgOworICAgICAgICAgICAgIGRlc3QgPSByaHMgLSBsaHMgLSAhQ0ZMQUcgOworICAgICAgICAgICAgIGlmICgocmhzID49IGxocykgfHwgKChyaHMgfCBsaHMpID4+IDMxKSkgeworICAgICAgICAgICAgICAgIEFSTXVsX1N1YkNhcnJ5KHN0YXRlLHJocyxsaHMsZGVzdCkgOworICAgICAgICAgICAgICAgIEFSTXVsX1N1Yk92ZXJmbG93KHN0YXRlLHJocyxsaHMsZGVzdCkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTEVBUkMgOworICAgICAgICAgICAgICAgIENMRUFSViA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIFdSSVRFU0RFU1QoZGVzdCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgxMCA6IC8qIFRTVCByZWcgYW5kIE1SUyBDUFNSIGFuZCBTV1Agd29yZCAqLworI2lmZGVmIE1PREVUCisgICAgICAgICAgICAgaWYgKEJJVFMoNCwxMSkgPT0gMHhCKSB7CisgICAgICAgICAgICAgICAvKiBTVFJIIHJlZ2lzdGVyIG9mZnNldCwgbm8gd3JpdGUtYmFjaywgZG93biwgcHJlIGluZGV4ZWQgKi8KKyAgICAgICAgICAgICAgIFNIUFJFRE9XTigpIDsKKyAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgIGlmIChCSVRTKDQsMTEpID09IDkpIHsgLyogU1dQICovCisgICAgICAgICAgICAgICAgVU5ERUZfU1dQUEMgOworICAgICAgICAgICAgICAgIHRlbXAgPSBMSFMgOworICAgICAgICAgICAgICAgIEJVU1VTRURJTkNQQ1MgOworI2lmbmRlZiBNT0RFMzIKKyAgICAgICAgICAgICAgICBpZiAoVkVDVE9SQUNDRVNTKHRlbXApIHx8IEFERFJFWENFUFQodGVtcCkpIHsKKyAgICAgICAgICAgICAgICAgICBJTlRFUk5BTEFCT1JUKHRlbXApIDsKKyAgICAgICAgICAgICAgICAgICAodm9pZClBUk11bF9Mb2FkV29yZE4oc3RhdGUsdGVtcCkgOworICAgICAgICAgICAgICAgICAgICh2b2lkKUFSTXVsX0xvYWRXb3JkTihzdGF0ZSx0ZW1wKSA7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgIGRlc3QgPSBBUk11bF9Td2FwV29yZChzdGF0ZSx0ZW1wLHN0YXRlLT5SZWdbUkhTUmVnXSkgOworICAgICAgICAgICAgICAgIGlmICh0ZW1wICYgMykKKyAgICAgICAgICAgICAgICAgICAgREVTVCA9IEFSTXVsX0FsaWduKHN0YXRlLHRlbXAsZGVzdCkgOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgREVTVCA9IGRlc3QgOworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+YWJvcnRTaWcgfHwgc3RhdGUtPkFib3J0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICBUQUtFQUJPUlQgOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSBpZiAoKEJJVFMoMCwxMSk9PTApICYmIChMSFNSZWc9PTE1KSkgeyAvKiBNUlMgQ1BTUiAqLworICAgICAgICAgICAgICAgIFVOREVGX01SU1BDIDsKKyAgICAgICAgICAgICAgICBERVNUID0gRUNDIHwgRUlOVCB8IEVNT0RFIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgVU5ERUZfVGVzdCA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgxMSA6IC8qIFRTVFAgcmVnICovCisjaWZkZWYgTU9ERVQKKyAgICAgICAgICAgICBpZiAoKEJJVFMoNCwxMSkgJiAweEY5KSA9PSAweDkpIHsKKyAgICAgICAgICAgICAgIC8qIExEUiByZWdpc3RlciBvZmZzZXQsIG5vIHdyaXRlLWJhY2ssIGRvd24sIHByZSBpbmRleGVkICovCisgICAgICAgICAgICAgICBMSFBSRURPV04oKSA7CisgICAgICAgICAgICAgICAvKiBjb250aW51ZSB3aXRoIHJlbWFpbmluZyBpbnN0cnVjdGlvbiBkZWNvZGUgKi8KKyAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgIGlmIChERVNUUmVnID09IDE1KSB7IC8qIFRTVFAgcmVnICovCisjaWZkZWYgTU9ERTMyCisgICAgICAgICAgICAgICAgc3RhdGUtPkNwc3IgPSBHRVRTUFNSKHN0YXRlLT5CYW5rKSA7CisgICAgICAgICAgICAgICAgQVJNdWxfQ1BTUkFsdGVyZWQoc3RhdGUpIDsKKyNlbHNlCisgICAgICAgICAgICAgICAgcmhzID0gRFBSZWdSSFMgOworICAgICAgICAgICAgICAgIHRlbXAgPSBMSFMgJiByaHMgOworICAgICAgICAgICAgICAgIFNFVFIxNVBTUih0ZW1wKSA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSB7IC8qIFRTVCByZWcgKi8KKyAgICAgICAgICAgICAgICByaHMgPSBEUFNSZWdSSFMgOworICAgICAgICAgICAgICAgIGRlc3QgPSBMSFMgJiByaHMgOworICAgICAgICAgICAgICAgIEFSTXVsX05lZ1plcm8oc3RhdGUsZGVzdCkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4MTIgOiAvKiBURVEgcmVnIGFuZCBNU1IgcmVnIHRvIENQU1IgKEFSTTYpICovCisjaWZkZWYgTU9ERVQKKyAgICAgICAgICAgICBpZiAoQklUUyg0LDExKSA9PSAweEIpIHsKKyAgICAgICAgICAgICAgIC8qIFNUUkggcmVnaXN0ZXIgb2Zmc2V0LCB3cml0ZS1iYWNrLCBkb3duLCBwcmUgaW5kZXhlZCAqLworICAgICAgICAgICAgICAgU0hQUkVET1dOV0IoKSA7CisgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBNT0RFVAorICAgICAgICAgICAgIGlmIChCSVRTKDQsMjcpPT0weDEyRkZGMSkgeyAvKiBCWCAqLworICAgICAgICAgICAgICAgLyogQnJhbmNoIHRvIHRoZSBhZGRyZXNzIGluIFJIU1JlZy4gSWYgYml0MCBvZgorICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gYWRkcmVzcyBpcyAxIHRoZW4gc3dpdGNoIHRvIFRodW1iIG1vZGU6ICovCisgICAgICAgICAgICAgICBBUk13b3JkIGFkZHIgPSBzdGF0ZS0+UmVnW1JIU1JlZ107CisJICAgICAgIAorCSAgICAgICAvKiBJZiB3ZSByZWFkIHRoZSBQQyB0aGVuIHRoZSBib3R0b20gYml0IGlzIGNsZWFyICovCisJICAgICAgIGlmIChSSFNSZWcgPT0gMTUpIGFkZHIgJj0gfjE7CisJICAgICAgIAorCSAgICAgICAvKiBFbmFibGUgdGhpcyBmb3IgYSBoZWxwZnVsIGJpdCBvZiBkZWJ1Z2dpbmcgd2hlbgorCQkgIEdEQiBpcyBub3QgeWV0IGZ1bGx5IHdvcmtpbmcuLi4gCisJICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkJYIGF0ICV4IHRvICV4IChnbyAlcylcbiIsCisJCQlzdGF0ZS0+UmVnWzE1XSwgYWRkciwgKGFkZHIgJiAxKSA/ICJ0aHVtYiI6ICJhcm0iICk7ICovCisKKyAgICAgICAgICAgICAgIGlmIChhZGRyICYgKDEgPDwgMCkpIHsgLyogVGh1bWIgYml0ICovCisgICAgICAgICAgICAgICAgIFNFVFQ7CisgICAgICAgICAgICAgICAgIHN0YXRlLT5SZWdbMTVdID0gYWRkciAmIDB4ZmZmZmZmZmU7CisgICAgICAgICAgICAgICAgIC8qIE5PVEU6IFRoZSBvdGhlciBDUFNSIGZsYWcgc2V0dGluZyBibG9ja3MgZG8gbm90CisgICAgICAgICAgICAgICAgICAgIHNlZW0gdG8gdXBkYXRlIHRoZSBzdGF0ZS0+Q3BzciBzdGF0ZSwgYnV0IGp1c3QgZG8KKyAgICAgICAgICAgICAgICAgICAgdGhlIGV4cGxpY2l0IGZsYWcuIFRoZSBjb3B5IGZyb20gdGhlIHNlcGVyYXRlCisgICAgICAgICAgICAgICAgICAgIGZsYWdzIHRvIHRoZSByZWdpc3RlciBtdXN0IGhhcHBlbiBsYXRlci4gKi8KKyAgICAgICAgICAgICAgICAgRkxVU0hQSVBFOworICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICBDTEVBUlQ7CisgICAgICAgICAgICAgICAgIHN0YXRlLT5SZWdbMTVdID0gYWRkciAmIDB4ZmZmZmZmZmM7CisgICAgICAgICAgICAgICAgIEZMVVNIUElQRTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgaWYgKERFU1RSZWc9PTE1ICYmIEJJVFMoMTcsMTgpPT0wKSB7IC8qIE1TUiByZWcgdG8gQ1BTUiAqLworICAgICAgICAgICAgICAgIFVOREVGX01TUlBDIDsKKyAgICAgICAgICAgICAgICB0ZW1wID0gRFBSZWdSSFMgOworICAgICAgICAgICAgICAgICAgIEFSTXVsX0ZpeENQU1Ioc3RhdGUsaW5zdHIsdGVtcCkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBVTkRFRl9UZXN0IDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDEzIDogLyogVEVRUCByZWcgKi8KKyNpZmRlZiBNT0RFVAorICAgICAgICAgICAgIGlmICgoQklUUyg0LDExKSAmIDB4RjkpID09IDB4OSkgeworICAgICAgICAgICAgICAgLyogTERSIHJlZ2lzdGVyIG9mZnNldCwgd3JpdGUtYmFjaywgZG93biwgcHJlIGluZGV4ZWQgKi8KKyAgICAgICAgICAgICAgIExIUFJFRE9XTldCKCkgOworICAgICAgICAgICAgICAgLyogY29udGludWUgd2l0aCByZW1haW5pbmcgaW5zdHJ1Y3Rpb24gZGVjb2RlICovCisgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICBpZiAoREVTVFJlZyA9PSAxNSkgeyAvKiBURVFQIHJlZyAqLworI2lmZGVmIE1PREUzMgorICAgICAgICAgICAgICAgIHN0YXRlLT5DcHNyID0gR0VUU1BTUihzdGF0ZS0+QmFuaykgOworICAgICAgICAgICAgICAgIEFSTXVsX0NQU1JBbHRlcmVkKHN0YXRlKSA7CisjZWxzZQorICAgICAgICAgICAgICAgIHJocyA9IERQUmVnUkhTIDsKKyAgICAgICAgICAgICAgICB0ZW1wID0gTEhTIF4gcmhzIDsKKyAgICAgICAgICAgICAgICBTRVRSMTVQU1IodGVtcCkgOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGVsc2UgeyAvKiBURVEgUmVnICovCisgICAgICAgICAgICAgICAgcmhzID0gRFBTUmVnUkhTIDsKKyAgICAgICAgICAgICAgICBkZXN0ID0gTEhTIF4gcmhzIDsKKyAgICAgICAgICAgICAgICBBUk11bF9OZWdaZXJvKHN0YXRlLGRlc3QpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDE0IDogLyogQ01QIHJlZyBhbmQgTVJTIFNQU1IgYW5kIFNXUCBieXRlICovCisjaWZkZWYgTU9ERVQKKyAgICAgICAgICAgICBpZiAoQklUUyg0LDcpID09IDB4QikgeworICAgICAgICAgICAgICAgLyogU1RSSCBpbW1lZGlhdGUgb2Zmc2V0LCBubyB3cml0ZS1iYWNrLCBkb3duLCBwcmUgaW5kZXhlZCAqLworICAgICAgICAgICAgICAgU0hQUkVET1dOKCkgOworICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgaWYgKEJJVFMoNCwxMSkgPT0gOSkgeyAvKiBTV1AgKi8KKyAgICAgICAgICAgICAgICBVTkRFRl9TV1BQQyA7CisgICAgICAgICAgICAgICAgdGVtcCA9IExIUyA7CisgICAgICAgICAgICAgICAgQlVTVVNFRElOQ1BDUyA7CisjaWZuZGVmIE1PREUzMgorICAgICAgICAgICAgICAgIGlmIChWRUNUT1JBQ0NFU1ModGVtcCkgfHwgQUREUkVYQ0VQVCh0ZW1wKSkgeworICAgICAgICAgICAgICAgICAgIElOVEVSTkFMQUJPUlQodGVtcCkgOworICAgICAgICAgICAgICAgICAgICh2b2lkKUFSTXVsX0xvYWRCeXRlKHN0YXRlLHRlbXApIDsKKyAgICAgICAgICAgICAgICAgICAodm9pZClBUk11bF9Mb2FkQnl0ZShzdGF0ZSx0ZW1wKSA7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgIERFU1QgPSBBUk11bF9Td2FwQnl0ZShzdGF0ZSx0ZW1wLHN0YXRlLT5SZWdbUkhTUmVnXSkgOworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+YWJvcnRTaWcgfHwgc3RhdGUtPkFib3J0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICBUQUtFQUJPUlQgOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSBpZiAoKEJJVFMoMCwxMSk9PTApICYmIChMSFNSZWc9PTE1KSkgeyAvKiBNUlMgU1BTUiAqLworICAgICAgICAgICAgICAgIFVOREVGX01SU1BDIDsKKyAgICAgICAgICAgICAgICBERVNUID0gR0VUU1BTUihzdGF0ZS0+QmFuaykgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBVTkRFRl9UZXN0IDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDE1IDogLyogQ01QUCByZWcgKi8KKyNpZmRlZiBNT0RFVAorICAgICAgICAgICAgIGlmICgoQklUUyg0LDcpICYgMHg5KSA9PSAweDkpIHsKKyAgICAgICAgICAgICAgIC8qIExEUiBpbW1lZGlhdGUgb2Zmc2V0LCBubyB3cml0ZS1iYWNrLCBkb3duLCBwcmUgaW5kZXhlZCAqLworICAgICAgICAgICAgICAgTEhQUkVET1dOKCkgOworICAgICAgICAgICAgICAgLyogY29udGludWUgd2l0aCByZW1haW5pbmcgaW5zdHJ1Y3Rpb24gZGVjb2RlICovCisgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICBpZiAoREVTVFJlZyA9PSAxNSkgeyAvKiBDTVBQIHJlZyAqLworI2lmZGVmIE1PREUzMgorICAgICAgICAgICAgICAgIHN0YXRlLT5DcHNyID0gR0VUU1BTUihzdGF0ZS0+QmFuaykgOworICAgICAgICAgICAgICAgIEFSTXVsX0NQU1JBbHRlcmVkKHN0YXRlKSA7CisjZWxzZQorICAgICAgICAgICAgICAgIHJocyA9IERQUmVnUkhTIDsKKyAgICAgICAgICAgICAgICB0ZW1wID0gTEhTIC0gcmhzIDsKKyAgICAgICAgICAgICAgICBTRVRSMTVQU1IodGVtcCkgOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGVsc2UgeyAvKiBDTVAgcmVnICovCisgICAgICAgICAgICAgICAgbGhzID0gTEhTIDsKKyAgICAgICAgICAgICAgICByaHMgPSBEUFJlZ1JIUyA7CisgICAgICAgICAgICAgICAgZGVzdCA9IGxocyAtIHJocyA7CisgICAgICAgICAgICAgICAgQVJNdWxfTmVnWmVybyhzdGF0ZSxkZXN0KSA7CisgICAgICAgICAgICAgICAgaWYgKChsaHMgPj0gcmhzKSB8fCAoKHJocyB8IGxocykgPj4gMzEpKSB7CisgICAgICAgICAgICAgICAgICAgQVJNdWxfU3ViQ2Fycnkoc3RhdGUsbGhzLHJocyxkZXN0KSA7CisgICAgICAgICAgICAgICAgICAgQVJNdWxfU3ViT3ZlcmZsb3coc3RhdGUsbGhzLHJocyxkZXN0KSA7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgIENMRUFSQyA7CisgICAgICAgICAgICAgICAgICAgQ0xFQVJWIDsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgxNiA6IC8qIENNTiByZWcgYW5kIE1TUiByZWcgdG8gU1BTUiAqLworI2lmZGVmIE1PREVUCisgICAgICAgICAgICAgaWYgKEJJVFMoNCw3KSA9PSAweEIpIHsKKyAgICAgICAgICAgICAgIC8qIFNUUkggaW1tZWRpYXRlIG9mZnNldCwgd3JpdGUtYmFjaywgZG93biwgcHJlIGluZGV4ZWQgKi8KKyAgICAgICAgICAgICAgIFNIUFJFRE9XTldCKCkgOworICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgaWYgKERFU1RSZWc9PTE1ICYmIEJJVFMoMTcsMTgpPT0wKSB7IC8qIE1TUiAqLworICAgICAgICAgICAgICAgIFVOREVGX01TUlBDIDsKKyAgICAgICAgICAgICAgICBBUk11bF9GaXhTUFNSKHN0YXRlLGluc3RyLERQUmVnUkhTKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgVU5ERUZfVGVzdCA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgxNyA6IC8qIENNTlAgcmVnICovCisjaWZkZWYgTU9ERVQKKyAgICAgICAgICAgICBpZiAoKEJJVFMoNCw3KSAmIDB4OSkgPT0gMHg5KSB7CisgICAgICAgICAgICAgICAvKiBMRFIgaW1tZWRpYXRlIG9mZnNldCwgd3JpdGUtYmFjaywgZG93biwgcHJlIGluZGV4ZWQgKi8KKyAgICAgICAgICAgICAgIExIUFJFRE9XTldCKCkgOworICAgICAgICAgICAgICAgLyogY29udGludWUgd2l0aCByZW1haW5pbmcgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgKi8KKyAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgIGlmIChERVNUUmVnID09IDE1KSB7CisjaWZkZWYgTU9ERTMyCisgICAgICAgICAgICAgICAgc3RhdGUtPkNwc3IgPSBHRVRTUFNSKHN0YXRlLT5CYW5rKSA7CisgICAgICAgICAgICAgICAgQVJNdWxfQ1BTUkFsdGVyZWQoc3RhdGUpIDsKKyNlbHNlCisgICAgICAgICAgICAgICAgcmhzID0gRFBSZWdSSFMgOworICAgICAgICAgICAgICAgIHRlbXAgPSBMSFMgKyByaHMgOworICAgICAgICAgICAgICAgIFNFVFIxNVBTUih0ZW1wKSA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGVsc2UgeyAvKiBDTU4gcmVnICovCisgICAgICAgICAgICAgICAgbGhzID0gTEhTIDsKKyAgICAgICAgICAgICAgICByaHMgPSBEUFJlZ1JIUyA7CisgICAgICAgICAgICAgICAgZGVzdCA9IGxocyArIHJocyA7CisgICAgICAgICAgICAgICAgQVNTSUdOWihkZXN0PT0wKSA7CisgICAgICAgICAgICAgICAgaWYgKChsaHMgfCByaHMpID4+IDMwKSB7IC8qIHBvc3NpYmxlIEMsVixOIHRvIHNldCAqLworICAgICAgICAgICAgICAgICAgIEFTU0lHTk4oTkVHKGRlc3QpKSA7CisgICAgICAgICAgICAgICAgICAgQVJNdWxfQWRkQ2Fycnkoc3RhdGUsbGhzLHJocyxkZXN0KSA7CisgICAgICAgICAgICAgICAgICAgQVJNdWxfQWRkT3ZlcmZsb3coc3RhdGUsbGhzLHJocyxkZXN0KSA7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgIENMRUFSTiA7CisgICAgICAgICAgICAgICAgICAgQ0xFQVJDIDsKKyAgICAgICAgICAgICAgICAgICBDTEVBUlYgOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDE4IDogLyogT1JSIHJlZyAqLworI2lmZGVmIE1PREVUCisgICAgICAgICAgICAgaWYgKEJJVFMoNCwxMSkgPT0gMHhCKSB7CisgICAgICAgICAgICAgICAvKiBTVFJIIHJlZ2lzdGVyIG9mZnNldCwgbm8gd3JpdGUtYmFjaywgdXAsIHByZSBpbmRleGVkICovCisgICAgICAgICAgICAgICBTSFBSRVVQKCkgOworICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgcmhzID0gRFBSZWdSSFMgOworICAgICAgICAgICAgIGRlc3QgPSBMSFMgfCByaHMgOworICAgICAgICAgICAgIFdSSVRFREVTVChkZXN0KSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDE5IDogLyogT1JSUyByZWcgKi8KKyNpZmRlZiBNT0RFVAorICAgICAgICAgICAgIGlmICgoQklUUyg0LDExKSAmIDB4RjkpID09IDB4OSkgeworICAgICAgICAgICAgICAgLyogTERSIHJlZ2lzdGVyIG9mZnNldCwgbm8gd3JpdGUtYmFjaywgdXAsIHByZSBpbmRleGVkICovCisgICAgICAgICAgICAgICBMSFBSRVVQKCkgOworICAgICAgICAgICAgICAgLyogY29udGludWUgd2l0aCByZW1haW5pbmcgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgKi8KKyAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgIHJocyA9IERQU1JlZ1JIUyA7CisgICAgICAgICAgICAgZGVzdCA9IExIUyB8IHJocyA7CisgICAgICAgICAgICAgV1JJVEVTREVTVChkZXN0KSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDFhIDogLyogTU9WIHJlZyAqLworI2lmZGVmIE1PREVUCisgICAgICAgICAgICAgaWYgKEJJVFMoNCwxMSkgPT0gMHhCKSB7CisgICAgICAgICAgICAgICAvKiBTVFJIIHJlZ2lzdGVyIG9mZnNldCwgd3JpdGUtYmFjaywgdXAsIHByZSBpbmRleGVkICovCisgICAgICAgICAgICAgICBTSFBSRVVQV0IoKSA7CisgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICBkZXN0ID0gRFBSZWdSSFMgOworICAgICAgICAgICAgIFdSSVRFREVTVChkZXN0KSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDFiIDogLyogTU9WUyByZWcgKi8KKyNpZmRlZiBNT0RFVAorICAgICAgICAgICAgIGlmICgoQklUUyg0LDExKSAmIDB4RjkpID09IDB4OSkgeworICAgICAgICAgICAgICAgLyogTERSIHJlZ2lzdGVyIG9mZnNldCwgd3JpdGUtYmFjaywgdXAsIHByZSBpbmRleGVkICovCisgICAgICAgICAgICAgICBMSFBSRVVQV0IoKSA7CisgICAgICAgICAgICAgICAvKiBjb250aW51ZSB3aXRoIHJlbWFpbmluZyBpbnN0cnVjdGlvbiBkZWNvZGluZyAqLworICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgZGVzdCA9IERQU1JlZ1JIUyA7CisgICAgICAgICAgICAgV1JJVEVTREVTVChkZXN0KSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDFjIDogLyogQklDIHJlZyAqLworI2lmZGVmIE1PREVUCisgICAgICAgICAgICAgaWYgKEJJVFMoNCw3KSA9PSAweEIpIHsKKyAgICAgICAgICAgICAgIC8qIFNUUkggaW1tZWRpYXRlIG9mZnNldCwgbm8gd3JpdGUtYmFjaywgdXAsIHByZSBpbmRleGVkICovCisgICAgICAgICAgICAgICBTSFBSRVVQKCkgOworICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgcmhzID0gRFBSZWdSSFMgOworICAgICAgICAgICAgIGRlc3QgPSBMSFMgJiB+cmhzIDsKKyAgICAgICAgICAgICBXUklURURFU1QoZGVzdCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgxZCA6IC8qIEJJQ1MgcmVnICovCisjaWZkZWYgTU9ERVQKKyAgICAgICAgICAgICBpZiAoKEJJVFMoNCw3KSAmIDB4OSkgPT0gMHg5KSB7CisgICAgICAgICAgICAgICAvKiBMRFIgaW1tZWRpYXRlIG9mZnNldCwgbm8gd3JpdGUtYmFjaywgdXAsIHByZSBpbmRleGVkICovCisgICAgICAgICAgICAgICBMSFBSRVVQKCkgOworICAgICAgICAgICAgICAgLyogY29udGludWUgd2l0aCBpbnN0cnVjdGlvbiBkZWNvZGluZyAqLworICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgcmhzID0gRFBTUmVnUkhTIDsKKyAgICAgICAgICAgICBkZXN0ID0gTEhTICYgfnJocyA7CisgICAgICAgICAgICAgV1JJVEVTREVTVChkZXN0KSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDFlIDogLyogTVZOIHJlZyAqLworI2lmZGVmIE1PREVUCisgICAgICAgICAgICAgaWYgKEJJVFMoNCw3KSA9PSAweEIpIHsKKyAgICAgICAgICAgICAgIC8qIFNUUkggaW1tZWRpYXRlIG9mZnNldCwgd3JpdGUtYmFjaywgdXAsIHByZSBpbmRleGVkICovCisgICAgICAgICAgICAgICBTSFBSRVVQV0IoKSA7CisgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICBkZXN0ID0gfkRQUmVnUkhTIDsKKyAgICAgICAgICAgICBXUklURURFU1QoZGVzdCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgxZiA6IC8qIE1WTlMgcmVnICovCisjaWZkZWYgTU9ERVQKKyAgICAgICAgICAgICBpZiAoKEJJVFMoNCw3KSAmIDB4OSkgPT0gMHg5KSB7CisgICAgICAgICAgICAgICAvKiBMRFIgaW1tZWRpYXRlIG9mZnNldCwgd3JpdGUtYmFjaywgdXAsIHByZSBpbmRleGVkICovCisgICAgICAgICAgICAgICBMSFBSRVVQV0IoKSA7CisgICAgICAgICAgICAgICAvKiBjb250aW51ZSBpbnN0cnVjdGlvbiBkZWNvZGluZyAqLworICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgZGVzdCA9IH5EUFNSZWdSSFMgOworICAgICAgICAgICAgIFdSSVRFU0RFU1QoZGVzdCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgRGF0YSBQcm9jZXNzaW5nIEltbWVkaWF0ZSBSSFMgSW5zdHJ1Y3Rpb25zICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgY2FzZSAweDIwIDogLyogQU5EIGltbWVkICovCisgICAgICAgICAgICAgZGVzdCA9IExIUyAmIERQSW1tUkhTIDsKKyAgICAgICAgICAgICBXUklURURFU1QoZGVzdCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgyMSA6IC8qIEFORFMgaW1tZWQgKi8KKyAgICAgICAgICAgICBEUFNJbW1SSFMgOworICAgICAgICAgICAgIGRlc3QgPSBMSFMgJiByaHMgOworICAgICAgICAgICAgIFdSSVRFU0RFU1QoZGVzdCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgyMiA6IC8qIEVPUiBpbW1lZCAqLworICAgICAgICAgICAgIGRlc3QgPSBMSFMgXiBEUEltbVJIUyA7CisgICAgICAgICAgICAgV1JJVEVERVNUKGRlc3QpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4MjMgOiAvKiBFT1JTIGltbWVkICovCisgICAgICAgICAgICAgRFBTSW1tUkhTIDsKKyAgICAgICAgICAgICBkZXN0ID0gTEhTIF4gcmhzIDsKKyAgICAgICAgICAgICBXUklURVNERVNUKGRlc3QpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4MjQgOiAvKiBTVUIgaW1tZWQgKi8KKyAgICAgICAgICAgICBkZXN0ID0gTEhTIC0gRFBJbW1SSFMgOworICAgICAgICAgICAgIFdSSVRFREVTVChkZXN0KSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDI1IDogLyogU1VCUyBpbW1lZCAqLworICAgICAgICAgICAgIGxocyA9IExIUyA7CisgICAgICAgICAgICAgcmhzID0gRFBJbW1SSFMgOworICAgICAgICAgICAgIGRlc3QgPSBsaHMgLSByaHMgOworICAgICAgICAgICAgIGlmICgobGhzID49IHJocykgfHwgKChyaHMgfCBsaHMpID4+IDMxKSkgeworICAgICAgICAgICAgICAgIEFSTXVsX1N1YkNhcnJ5KHN0YXRlLGxocyxyaHMsZGVzdCkgOworICAgICAgICAgICAgICAgIEFSTXVsX1N1Yk92ZXJmbG93KHN0YXRlLGxocyxyaHMsZGVzdCkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTEVBUkMgOworICAgICAgICAgICAgICAgIENMRUFSViA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIFdSSVRFU0RFU1QoZGVzdCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgyNiA6IC8qIFJTQiBpbW1lZCAqLworICAgICAgICAgICAgIGRlc3QgPSBEUEltbVJIUyAtIExIUyA7CisgICAgICAgICAgICAgV1JJVEVERVNUKGRlc3QpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4MjcgOiAvKiBSU0JTIGltbWVkICovCisgICAgICAgICAgICAgbGhzID0gTEhTIDsKKyAgICAgICAgICAgICByaHMgPSBEUEltbVJIUyA7CisgICAgICAgICAgICAgZGVzdCA9IHJocyAtIGxocyA7CisgICAgICAgICAgICAgaWYgKChyaHMgPj0gbGhzKSB8fCAoKHJocyB8IGxocykgPj4gMzEpKSB7CisgICAgICAgICAgICAgICAgQVJNdWxfU3ViQ2Fycnkoc3RhdGUscmhzLGxocyxkZXN0KSA7CisgICAgICAgICAgICAgICAgQVJNdWxfU3ViT3ZlcmZsb3coc3RhdGUscmhzLGxocyxkZXN0KSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIENMRUFSQyA7CisgICAgICAgICAgICAgICAgQ0xFQVJWIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgV1JJVEVTREVTVChkZXN0KSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDI4IDogLyogQUREIGltbWVkICovCisgICAgICAgICAgICAgZGVzdCA9IExIUyArIERQSW1tUkhTIDsKKyAgICAgICAgICAgICBXUklURURFU1QoZGVzdCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgyOSA6IC8qIEFERFMgaW1tZWQgKi8KKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIHJocyA9IERQSW1tUkhTIDsKKyAgICAgICAgICAgICBkZXN0ID0gbGhzICsgcmhzIDsKKyAgICAgICAgICAgICBBU1NJR05aKGRlc3Q9PTApIDsKKyAgICAgICAgICAgICBpZiAoKGxocyB8IHJocykgPj4gMzApIHsgLyogcG9zc2libGUgQyxWLE4gdG8gc2V0ICovCisgICAgICAgICAgICAgICAgQVNTSUdOTihORUcoZGVzdCkpIDsKKyAgICAgICAgICAgICAgICBBUk11bF9BZGRDYXJyeShzdGF0ZSxsaHMscmhzLGRlc3QpIDsKKyAgICAgICAgICAgICAgICBBUk11bF9BZGRPdmVyZmxvdyhzdGF0ZSxsaHMscmhzLGRlc3QpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQ0xFQVJOIDsKKyAgICAgICAgICAgICAgICBDTEVBUkMgOworICAgICAgICAgICAgICAgIENMRUFSViA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIFdSSVRFU0RFU1QoZGVzdCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgyYSA6IC8qIEFEQyBpbW1lZCAqLworICAgICAgICAgICAgIGRlc3QgPSBMSFMgKyBEUEltbVJIUyArIENGTEFHIDsKKyAgICAgICAgICAgICBXUklURURFU1QoZGVzdCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgyYiA6IC8qIEFEQ1MgaW1tZWQgKi8KKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIHJocyA9IERQSW1tUkhTIDsKKyAgICAgICAgICAgICBkZXN0ID0gbGhzICsgcmhzICsgQ0ZMQUcgOworICAgICAgICAgICAgIEFTU0lHTlooZGVzdD09MCkgOworICAgICAgICAgICAgIGlmICgobGhzIHwgcmhzKSA+PiAzMCkgeyAvKiBwb3NzaWJsZSBDLFYsTiB0byBzZXQgKi8KKyAgICAgICAgICAgICAgICBBU1NJR05OKE5FRyhkZXN0KSkgOworICAgICAgICAgICAgICAgIEFSTXVsX0FkZENhcnJ5KHN0YXRlLGxocyxyaHMsZGVzdCkgOworICAgICAgICAgICAgICAgIEFSTXVsX0FkZE92ZXJmbG93KHN0YXRlLGxocyxyaHMsZGVzdCkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTEVBUk4gOworICAgICAgICAgICAgICAgIENMRUFSQyA7CisgICAgICAgICAgICAgICAgQ0xFQVJWIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgV1JJVEVTREVTVChkZXN0KSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDJjIDogLyogU0JDIGltbWVkICovCisgICAgICAgICAgICAgZGVzdCA9IExIUyAtIERQSW1tUkhTIC0gIUNGTEFHIDsKKyAgICAgICAgICAgICBXUklURURFU1QoZGVzdCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgyZCA6IC8qIFNCQ1MgaW1tZWQgKi8KKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIHJocyA9IERQSW1tUkhTIDsKKyAgICAgICAgICAgICBkZXN0ID0gbGhzIC0gcmhzIC0gIUNGTEFHIDsKKyAgICAgICAgICAgICBpZiAoKGxocyA+PSByaHMpIHx8ICgocmhzIHwgbGhzKSA+PiAzMSkpIHsKKyAgICAgICAgICAgICAgICBBUk11bF9TdWJDYXJyeShzdGF0ZSxsaHMscmhzLGRlc3QpIDsKKyAgICAgICAgICAgICAgICBBUk11bF9TdWJPdmVyZmxvdyhzdGF0ZSxsaHMscmhzLGRlc3QpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQ0xFQVJDIDsKKyAgICAgICAgICAgICAgICBDTEVBUlYgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBXUklURVNERVNUKGRlc3QpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4MmUgOiAvKiBSU0MgaW1tZWQgKi8KKyAgICAgICAgICAgICBkZXN0ID0gRFBJbW1SSFMgLSBMSFMgLSAhQ0ZMQUcgOworICAgICAgICAgICAgIFdSSVRFREVTVChkZXN0KSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDJmIDogLyogUlNDUyBpbW1lZCAqLworICAgICAgICAgICAgIGxocyA9IExIUyA7CisgICAgICAgICAgICAgcmhzID0gRFBJbW1SSFMgOworICAgICAgICAgICAgIGRlc3QgPSByaHMgLSBsaHMgLSAhQ0ZMQUcgOworICAgICAgICAgICAgIGlmICgocmhzID49IGxocykgfHwgKChyaHMgfCBsaHMpID4+IDMxKSkgeworICAgICAgICAgICAgICAgIEFSTXVsX1N1YkNhcnJ5KHN0YXRlLHJocyxsaHMsZGVzdCkgOworICAgICAgICAgICAgICAgIEFSTXVsX1N1Yk92ZXJmbG93KHN0YXRlLHJocyxsaHMsZGVzdCkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBDTEVBUkMgOworICAgICAgICAgICAgICAgIENMRUFSViA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIFdSSVRFU0RFU1QoZGVzdCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgzMCA6IC8qIFRTVCBpbW1lZCAqLworICAgICAgICAgICAgIFVOREVGX1Rlc3QgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgzMSA6IC8qIFRTVFAgaW1tZWQgKi8KKyAgICAgICAgICAgICBpZiAoREVTVFJlZyA9PSAxNSkgeyAvKiBUU1RQIGltbWVkICovCisjaWZkZWYgTU9ERTMyCisgICAgICAgICAgICAgICAgc3RhdGUtPkNwc3IgPSBHRVRTUFNSKHN0YXRlLT5CYW5rKSA7CisgICAgICAgICAgICAgICAgQVJNdWxfQ1BTUkFsdGVyZWQoc3RhdGUpIDsKKyNlbHNlCisgICAgICAgICAgICAgICAgdGVtcCA9IExIUyAmIERQSW1tUkhTIDsKKyAgICAgICAgICAgICAgICBTRVRSMTVQU1IodGVtcCkgOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIERQU0ltbVJIUyA7IC8qIFRTVCBpbW1lZCAqLworICAgICAgICAgICAgICAgIGRlc3QgPSBMSFMgJiByaHMgOworICAgICAgICAgICAgICAgIEFSTXVsX05lZ1plcm8oc3RhdGUsZGVzdCkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4MzIgOiAvKiBURVEgaW1tZWQgYW5kIE1TUiBpbW1lZCB0byBDUFNSICovCisgICAgICAgICAgICAgaWYgKERFU1RSZWc9PTE1ICYmIEJJVFMoMTcsMTgpPT0wKSB7IC8qIE1TUiBpbW1lZCB0byBDUFNSICovCisgICAgICAgICAgICAgICAgQVJNdWxfRml4Q1BTUihzdGF0ZSxpbnN0cixEUEltbVJIUykgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBVTkRFRl9UZXN0IDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDMzIDogLyogVEVRUCBpbW1lZCAqLworICAgICAgICAgICAgIGlmIChERVNUUmVnID09IDE1KSB7IC8qIFRFUVAgaW1tZWQgKi8KKyNpZmRlZiBNT0RFMzIKKyAgICAgICAgICAgICAgICBzdGF0ZS0+Q3BzciA9IEdFVFNQU1Ioc3RhdGUtPkJhbmspIDsKKyAgICAgICAgICAgICAgICBBUk11bF9DUFNSQWx0ZXJlZChzdGF0ZSkgOworI2Vsc2UKKyAgICAgICAgICAgICAgICB0ZW1wID0gTEhTIF4gRFBJbW1SSFMgOworICAgICAgICAgICAgICAgIFNFVFIxNVBTUih0ZW1wKSA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgRFBTSW1tUkhTIDsgLyogVEVRIGltbWVkICovCisgICAgICAgICAgICAgICAgZGVzdCA9IExIUyBeIHJocyA7CisgICAgICAgICAgICAgICAgQVJNdWxfTmVnWmVybyhzdGF0ZSxkZXN0KSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgzNCA6IC8qIENNUCBpbW1lZCAqLworICAgICAgICAgICAgIFVOREVGX1Rlc3QgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgzNSA6IC8qIENNUFAgaW1tZWQgKi8KKyAgICAgICAgICAgICBpZiAoREVTVFJlZyA9PSAxNSkgeyAvKiBDTVBQIGltbWVkICovCisjaWZkZWYgTU9ERTMyCisgICAgICAgICAgICAgICAgc3RhdGUtPkNwc3IgPSBHRVRTUFNSKHN0YXRlLT5CYW5rKSA7CisgICAgICAgICAgICAgICAgQVJNdWxfQ1BTUkFsdGVyZWQoc3RhdGUpIDsKKyNlbHNlCisgICAgICAgICAgICAgICAgdGVtcCA9IExIUyAtIERQSW1tUkhTIDsKKyAgICAgICAgICAgICAgICBTRVRSMTVQU1IodGVtcCkgOworI2VuZGlmCisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsaHMgPSBMSFMgOyAvKiBDTVAgaW1tZWQgKi8KKyAgICAgICAgICAgICAgICByaHMgPSBEUEltbVJIUyA7CisgICAgICAgICAgICAgICAgZGVzdCA9IGxocyAtIHJocyA7CisgICAgICAgICAgICAgICAgQVJNdWxfTmVnWmVybyhzdGF0ZSxkZXN0KSA7CisgICAgICAgICAgICAgICAgaWYgKChsaHMgPj0gcmhzKSB8fCAoKHJocyB8IGxocykgPj4gMzEpKSB7CisgICAgICAgICAgICAgICAgICAgQVJNdWxfU3ViQ2Fycnkoc3RhdGUsbGhzLHJocyxkZXN0KSA7CisgICAgICAgICAgICAgICAgICAgQVJNdWxfU3ViT3ZlcmZsb3coc3RhdGUsbGhzLHJocyxkZXN0KSA7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgIENMRUFSQyA7CisgICAgICAgICAgICAgICAgICAgQ0xFQVJWIDsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgzNiA6IC8qIENNTiBpbW1lZCBhbmQgTVNSIGltbWVkIHRvIFNQU1IgKi8KKyAgICAgICAgICAgICBpZiAoREVTVFJlZz09MTUgJiYgQklUUygxNywxOCk9PTApIC8qIE1TUiAqLworICAgICAgICAgICAgICAgIEFSTXVsX0ZpeFNQU1Ioc3RhdGUsIGluc3RyLCBEUEltbVJIUykgOworICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFVOREVGX1Rlc3QgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4MzcgOiAvKiBDTU5QIGltbWVkICovCisgICAgICAgICAgICAgaWYgKERFU1RSZWcgPT0gMTUpIHsgLyogQ01OUCBpbW1lZCAqLworI2lmZGVmIE1PREUzMgorICAgICAgICAgICAgICAgIHN0YXRlLT5DcHNyID0gR0VUU1BTUihzdGF0ZS0+QmFuaykgOworICAgICAgICAgICAgICAgIEFSTXVsX0NQU1JBbHRlcmVkKHN0YXRlKSA7CisjZWxzZQorICAgICAgICAgICAgICAgIHRlbXAgPSBMSFMgKyBEUEltbVJIUyA7CisgICAgICAgICAgICAgICAgU0VUUjE1UFNSKHRlbXApIDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbGhzID0gTEhTIDsgLyogQ01OIGltbWVkICovCisgICAgICAgICAgICAgICAgcmhzID0gRFBJbW1SSFMgOworICAgICAgICAgICAgICAgIGRlc3QgPSBsaHMgKyByaHMgOworICAgICAgICAgICAgICAgIEFTU0lHTlooZGVzdD09MCkgOworICAgICAgICAgICAgICAgIGlmICgobGhzIHwgcmhzKSA+PiAzMCkgeyAvKiBwb3NzaWJsZSBDLFYsTiB0byBzZXQgKi8KKyAgICAgICAgICAgICAgICAgICBBU1NJR05OKE5FRyhkZXN0KSkgOworICAgICAgICAgICAgICAgICAgIEFSTXVsX0FkZENhcnJ5KHN0YXRlLGxocyxyaHMsZGVzdCkgOworICAgICAgICAgICAgICAgICAgIEFSTXVsX0FkZE92ZXJmbG93KHN0YXRlLGxocyxyaHMsZGVzdCkgOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICBDTEVBUk4gOworICAgICAgICAgICAgICAgICAgIENMRUFSQyA7CisgICAgICAgICAgICAgICAgICAgQ0xFQVJWIDsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgzOCA6IC8qIE9SUiBpbW1lZCAqLworICAgICAgICAgICAgIGRlc3QgPSBMSFMgfCBEUEltbVJIUyA7CisgICAgICAgICAgICAgV1JJVEVERVNUKGRlc3QpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4MzkgOiAvKiBPUlJTIGltbWVkICovCisgICAgICAgICAgICAgRFBTSW1tUkhTIDsKKyAgICAgICAgICAgICBkZXN0ID0gTEhTIHwgcmhzIDsKKyAgICAgICAgICAgICBXUklURVNERVNUKGRlc3QpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4M2EgOiAvKiBNT1YgaW1tZWQgKi8KKyAgICAgICAgICAgICBkZXN0ID0gRFBJbW1SSFMgOworICAgICAgICAgICAgIFdSSVRFREVTVChkZXN0KSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDNiIDogLyogTU9WUyBpbW1lZCAqLworICAgICAgICAgICAgIERQU0ltbVJIUyA7CisgICAgICAgICAgICAgV1JJVEVTREVTVChyaHMpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4M2MgOiAvKiBCSUMgaW1tZWQgKi8KKyAgICAgICAgICAgICBkZXN0ID0gTEhTICYgfkRQSW1tUkhTIDsKKyAgICAgICAgICAgICBXUklURURFU1QoZGVzdCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgzZCA6IC8qIEJJQ1MgaW1tZWQgKi8KKyAgICAgICAgICAgICBEUFNJbW1SSFMgOworICAgICAgICAgICAgIGRlc3QgPSBMSFMgJiB+cmhzIDsKKyAgICAgICAgICAgICBXUklURVNERVNUKGRlc3QpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4M2UgOiAvKiBNVk4gaW1tZWQgKi8KKyAgICAgICAgICAgICBkZXN0ID0gfkRQSW1tUkhTIDsKKyAgICAgICAgICAgICBXUklURURFU1QoZGVzdCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHgzZiA6IC8qIE1WTlMgaW1tZWQgKi8KKyAgICAgICAgICAgICBEUFNJbW1SSFMgOworICAgICAgICAgICAgIFdSSVRFU0RFU1QofnJocykgOworICAgICAgICAgICAgIGJyZWFrIDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgIFNpbmdsZSBEYXRhIFRyYW5zZmVyIEltbWVkaWF0ZSBSSFMgSW5zdHJ1Y3Rpb25zICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgY2FzZSAweDQwIDogLyogU3RvcmUgV29yZCwgTm8gV3JpdGVCYWNrLCBQb3N0IERlYywgSW1tZWQgKi8KKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIGlmIChTdG9yZVdvcmQoc3RhdGUsaW5zdHIsbGhzKSkKKyAgICAgICAgICAgICAgICBMU0Jhc2UgPSBsaHMgLSBMU0ltbVJIUyA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDQxIDogLyogTG9hZCBXb3JkLCBObyBXcml0ZUJhY2ssIFBvc3QgRGVjLCBJbW1lZCAqLworICAgICAgICAgICAgIGxocyA9IExIUyA7CisgICAgICAgICAgICAgaWYgKExvYWRXb3JkKHN0YXRlLGluc3RyLGxocykpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gbGhzIC0gTFNJbW1SSFMgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg0MiA6IC8qIFN0b3JlIFdvcmQsIFdyaXRlQmFjaywgUG9zdCBEZWMsIEltbWVkICovCisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYiA7CisgICAgICAgICAgICAgbGhzID0gTEhTIDsKKyAgICAgICAgICAgICB0ZW1wID0gbGhzIC0gTFNJbW1SSFMgOworICAgICAgICAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSBMT1cgOworICAgICAgICAgICAgIGlmIChTdG9yZVdvcmQoc3RhdGUsaW5zdHIsbGhzKSkKKyAgICAgICAgICAgICAgICBMU0Jhc2UgPSB0ZW1wIDsKKyAgICAgICAgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gKHN0YXRlLT5Nb2RlICYgMyk/SElHSDpMT1cgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg0MyA6IC8qIExvYWQgV29yZCwgV3JpdGVCYWNrLCBQb3N0IERlYywgSW1tZWQgKi8KKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDQmFzZVdiIDsKKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSBMT1cgOworICAgICAgICAgICAgIGlmIChMb2FkV29yZChzdGF0ZSxpbnN0cixsaHMpKQorICAgICAgICAgICAgICAgIExTQmFzZSA9IGxocyAtIExTSW1tUkhTIDsKKyAgICAgICAgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gKHN0YXRlLT5Nb2RlICYgMyk/SElHSDpMT1cgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg0NCA6IC8qIFN0b3JlIEJ5dGUsIE5vIFdyaXRlQmFjaywgUG9zdCBEZWMsIEltbWVkICovCisgICAgICAgICAgICAgbGhzID0gTEhTIDsKKyAgICAgICAgICAgICBpZiAoU3RvcmVCeXRlKHN0YXRlLGluc3RyLGxocykpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gbGhzIC0gTFNJbW1SSFMgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg0NSA6IC8qIExvYWQgQnl0ZSwgTm8gV3JpdGVCYWNrLCBQb3N0IERlYywgSW1tZWQgKi8KKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIGlmIChMb2FkQnl0ZShzdGF0ZSxpbnN0cixsaHMsTFVOU0lHTkVEKSkKKyAgICAgICAgICAgICAgICBMU0Jhc2UgPSBsaHMgLSBMU0ltbVJIUyA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDQ2IDogLyogU3RvcmUgQnl0ZSwgV3JpdGVCYWNrLCBQb3N0IERlYywgSW1tZWQgKi8KKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDQmFzZVdiIDsKKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSBMT1cgOworICAgICAgICAgICAgIGlmIChTdG9yZUJ5dGUoc3RhdGUsaW5zdHIsbGhzKSkKKyAgICAgICAgICAgICAgICBMU0Jhc2UgPSBsaHMgLSBMU0ltbVJIUyA7CisgICAgICAgICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IChzdGF0ZS0+TW9kZSAmIDMpP0hJR0g6TE9XIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4NDcgOiAvKiBMb2FkIEJ5dGUsIFdyaXRlQmFjaywgUG9zdCBEZWMsIEltbWVkICovCisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYiA7CisgICAgICAgICAgICAgbGhzID0gTEhTIDsKKyAgICAgICAgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gTE9XIDsKKyAgICAgICAgICAgICBpZiAoTG9hZEJ5dGUoc3RhdGUsaW5zdHIsbGhzLExVTlNJR05FRCkpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gbGhzIC0gTFNJbW1SSFMgOworICAgICAgICAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSAoc3RhdGUtPk1vZGUgJiAzKT9ISUdIOkxPVyA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDQ4IDogLyogU3RvcmUgV29yZCwgTm8gV3JpdGVCYWNrLCBQb3N0IEluYywgSW1tZWQgKi8KKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIGlmIChTdG9yZVdvcmQoc3RhdGUsaW5zdHIsbGhzKSkKKyAgICAgICAgICAgICAgICBMU0Jhc2UgPSBsaHMgKyBMU0ltbVJIUyA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDQ5IDogLyogTG9hZCBXb3JkLCBObyBXcml0ZUJhY2ssIFBvc3QgSW5jLCBJbW1lZCAqLworICAgICAgICAgICAgIGxocyA9IExIUyA7CisgICAgICAgICAgICAgaWYgKExvYWRXb3JkKHN0YXRlLGluc3RyLGxocykpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gbGhzICsgTFNJbW1SSFMgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg0YSA6IC8qIFN0b3JlIFdvcmQsIFdyaXRlQmFjaywgUG9zdCBJbmMsIEltbWVkICovCisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYiA7CisgICAgICAgICAgICAgbGhzID0gTEhTIDsKKyAgICAgICAgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gTE9XIDsKKyAgICAgICAgICAgICBpZiAoU3RvcmVXb3JkKHN0YXRlLGluc3RyLGxocykpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gbGhzICsgTFNJbW1SSFMgOworICAgICAgICAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSAoc3RhdGUtPk1vZGUgJiAzKT9ISUdIOkxPVyA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDRiIDogLyogTG9hZCBXb3JkLCBXcml0ZUJhY2ssIFBvc3QgSW5jLCBJbW1lZCAqLworICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENCYXNlV2IgOworICAgICAgICAgICAgIGxocyA9IExIUyA7CisgICAgICAgICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IExPVyA7CisgICAgICAgICAgICAgaWYgKExvYWRXb3JkKHN0YXRlLGluc3RyLGxocykpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gbGhzICsgTFNJbW1SSFMgOworICAgICAgICAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSAoc3RhdGUtPk1vZGUgJiAzKT9ISUdIOkxPVyA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDRjIDogLyogU3RvcmUgQnl0ZSwgTm8gV3JpdGVCYWNrLCBQb3N0IEluYywgSW1tZWQgKi8KKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIGlmIChTdG9yZUJ5dGUoc3RhdGUsaW5zdHIsbGhzKSkKKyAgICAgICAgICAgICAgICBMU0Jhc2UgPSBsaHMgKyBMU0ltbVJIUyA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDRkIDogLyogTG9hZCBCeXRlLCBObyBXcml0ZUJhY2ssIFBvc3QgSW5jLCBJbW1lZCAqLworICAgICAgICAgICAgIGxocyA9IExIUyA7CisgICAgICAgICAgICAgaWYgKExvYWRCeXRlKHN0YXRlLGluc3RyLGxocyxMVU5TSUdORUQpKQorICAgICAgICAgICAgICAgIExTQmFzZSA9IGxocyArIExTSW1tUkhTIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4NGUgOiAvKiBTdG9yZSBCeXRlLCBXcml0ZUJhY2ssIFBvc3QgSW5jLCBJbW1lZCAqLworICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENCYXNlV2IgOworICAgICAgICAgICAgIGxocyA9IExIUyA7CisgICAgICAgICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IExPVyA7CisgICAgICAgICAgICAgaWYgKFN0b3JlQnl0ZShzdGF0ZSxpbnN0cixsaHMpKQorICAgICAgICAgICAgICAgIExTQmFzZSA9IGxocyArIExTSW1tUkhTIDsKKyAgICAgICAgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gKHN0YXRlLT5Nb2RlICYgMyk/SElHSDpMT1cgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg0ZiA6IC8qIExvYWQgQnl0ZSwgV3JpdGVCYWNrLCBQb3N0IEluYywgSW1tZWQgKi8KKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDQmFzZVdiIDsKKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSBMT1cgOworICAgICAgICAgICAgIGlmIChMb2FkQnl0ZShzdGF0ZSxpbnN0cixsaHMsTFVOU0lHTkVEKSkKKyAgICAgICAgICAgICAgICBMU0Jhc2UgPSBsaHMgKyBMU0ltbVJIUyA7CisgICAgICAgICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IChzdGF0ZS0+TW9kZSAmIDMpP0hJR0g6TE9XIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKworICAgICAgICAgIGNhc2UgMHg1MCA6IC8qIFN0b3JlIFdvcmQsIE5vIFdyaXRlQmFjaywgUHJlIERlYywgSW1tZWQgKi8KKyAgICAgICAgICAgICAodm9pZClTdG9yZVdvcmQoc3RhdGUsaW5zdHIsTEhTIC0gTFNJbW1SSFMpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4NTEgOiAvKiBMb2FkIFdvcmQsIE5vIFdyaXRlQmFjaywgUHJlIERlYywgSW1tZWQgKi8KKyAgICAgICAgICAgICAodm9pZClMb2FkV29yZChzdGF0ZSxpbnN0cixMSFMgLSBMU0ltbVJIUykgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg1MiA6IC8qIFN0b3JlIFdvcmQsIFdyaXRlQmFjaywgUHJlIERlYywgSW1tZWQgKi8KKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDQmFzZVdiIDsKKyAgICAgICAgICAgICB0ZW1wID0gTEhTIC0gTFNJbW1SSFMgOworICAgICAgICAgICAgIGlmIChTdG9yZVdvcmQoc3RhdGUsaW5zdHIsdGVtcCkpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gdGVtcCA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDUzIDogLyogTG9hZCBXb3JkLCBXcml0ZUJhY2ssIFByZSBEZWMsIEltbWVkICovCisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYiA7CisgICAgICAgICAgICAgdGVtcCA9IExIUyAtIExTSW1tUkhTIDsKKyAgICAgICAgICAgICBpZiAoTG9hZFdvcmQoc3RhdGUsaW5zdHIsdGVtcCkpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gdGVtcCA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDU0IDogLyogU3RvcmUgQnl0ZSwgTm8gV3JpdGVCYWNrLCBQcmUgRGVjLCBJbW1lZCAqLworICAgICAgICAgICAgICh2b2lkKVN0b3JlQnl0ZShzdGF0ZSxpbnN0cixMSFMgLSBMU0ltbVJIUykgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg1NSA6IC8qIExvYWQgQnl0ZSwgTm8gV3JpdGVCYWNrLCBQcmUgRGVjLCBJbW1lZCAqLworICAgICAgICAgICAgICh2b2lkKUxvYWRCeXRlKHN0YXRlLGluc3RyLExIUyAtIExTSW1tUkhTLExVTlNJR05FRCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg1NiA6IC8qIFN0b3JlIEJ5dGUsIFdyaXRlQmFjaywgUHJlIERlYywgSW1tZWQgKi8KKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDQmFzZVdiIDsKKyAgICAgICAgICAgICB0ZW1wID0gTEhTIC0gTFNJbW1SSFMgOworICAgICAgICAgICAgIGlmIChTdG9yZUJ5dGUoc3RhdGUsaW5zdHIsdGVtcCkpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gdGVtcCA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDU3IDogLyogTG9hZCBCeXRlLCBXcml0ZUJhY2ssIFByZSBEZWMsIEltbWVkICovCisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYiA7CisgICAgICAgICAgICAgdGVtcCA9IExIUyAtIExTSW1tUkhTIDsKKyAgICAgICAgICAgICBpZiAoTG9hZEJ5dGUoc3RhdGUsaW5zdHIsdGVtcCxMVU5TSUdORUQpKQorICAgICAgICAgICAgICAgIExTQmFzZSA9IHRlbXAgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg1OCA6IC8qIFN0b3JlIFdvcmQsIE5vIFdyaXRlQmFjaywgUHJlIEluYywgSW1tZWQgKi8KKyAgICAgICAgICAgICAodm9pZClTdG9yZVdvcmQoc3RhdGUsaW5zdHIsTEhTICsgTFNJbW1SSFMpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4NTkgOiAvKiBMb2FkIFdvcmQsIE5vIFdyaXRlQmFjaywgUHJlIEluYywgSW1tZWQgKi8KKyAgICAgICAgICAgICAodm9pZClMb2FkV29yZChzdGF0ZSxpbnN0cixMSFMgKyBMU0ltbVJIUykgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg1YSA6IC8qIFN0b3JlIFdvcmQsIFdyaXRlQmFjaywgUHJlIEluYywgSW1tZWQgKi8KKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDQmFzZVdiIDsKKyAgICAgICAgICAgICB0ZW1wID0gTEhTICsgTFNJbW1SSFMgOworICAgICAgICAgICAgIGlmIChTdG9yZVdvcmQoc3RhdGUsaW5zdHIsdGVtcCkpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gdGVtcCA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDViIDogLyogTG9hZCBXb3JkLCBXcml0ZUJhY2ssIFByZSBJbmMsIEltbWVkICovCisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYiA7CisgICAgICAgICAgICAgdGVtcCA9IExIUyArIExTSW1tUkhTIDsKKyAgICAgICAgICAgICBpZiAoTG9hZFdvcmQoc3RhdGUsaW5zdHIsdGVtcCkpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gdGVtcCA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDVjIDogLyogU3RvcmUgQnl0ZSwgTm8gV3JpdGVCYWNrLCBQcmUgSW5jLCBJbW1lZCAqLworICAgICAgICAgICAgICh2b2lkKVN0b3JlQnl0ZShzdGF0ZSxpbnN0cixMSFMgKyBMU0ltbVJIUykgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg1ZCA6IC8qIExvYWQgQnl0ZSwgTm8gV3JpdGVCYWNrLCBQcmUgSW5jLCBJbW1lZCAqLworICAgICAgICAgICAgICh2b2lkKUxvYWRCeXRlKHN0YXRlLGluc3RyLExIUyArIExTSW1tUkhTLExVTlNJR05FRCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg1ZSA6IC8qIFN0b3JlIEJ5dGUsIFdyaXRlQmFjaywgUHJlIEluYywgSW1tZWQgKi8KKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDQmFzZVdiIDsKKyAgICAgICAgICAgICB0ZW1wID0gTEhTICsgTFNJbW1SSFMgOworICAgICAgICAgICAgIGlmIChTdG9yZUJ5dGUoc3RhdGUsaW5zdHIsdGVtcCkpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gdGVtcCA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDVmIDogLyogTG9hZCBCeXRlLCBXcml0ZUJhY2ssIFByZSBJbmMsIEltbWVkICovCisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYiA7CisgICAgICAgICAgICAgdGVtcCA9IExIUyArIExTSW1tUkhTIDsKKyAgICAgICAgICAgICBpZiAoTG9hZEJ5dGUoc3RhdGUsaW5zdHIsdGVtcCxMVU5TSUdORUQpKQorICAgICAgICAgICAgICAgIExTQmFzZSA9IHRlbXAgOworICAgICAgICAgICAgIGJyZWFrIDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgIFNpbmdsZSBEYXRhIFRyYW5zZmVyIFJlZ2lzdGVyIFJIUyBJbnN0cnVjdGlvbnMgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgY2FzZSAweDYwIDogLyogU3RvcmUgV29yZCwgTm8gV3JpdGVCYWNrLCBQb3N0IERlYywgUmVnICovCisgICAgICAgICAgICAgaWYgKEJJVCg0KSkgeworICAgICAgICAgICAgICAgIEFSTXVsX1VuZGVmSW5zdHIoc3RhdGUsaW5zdHIpIDsKKyAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDQmFzZVdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ09mZldiIDsKKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIGlmIChTdG9yZVdvcmQoc3RhdGUsaW5zdHIsbGhzKSkKKyAgICAgICAgICAgICAgICBMU0Jhc2UgPSBsaHMgLSBMU1JlZ1JIUyA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDYxIDogLyogTG9hZCBXb3JkLCBObyBXcml0ZUJhY2ssIFBvc3QgRGVjLCBSZWcgKi8KKyAgICAgICAgICAgICBpZiAoQklUKDQpKSB7CisgICAgICAgICAgICAgICAgQVJNdWxfVW5kZWZJbnN0cihzdGF0ZSxpbnN0cikgOworICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENCYXNlV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDT2ZmV2IgOworICAgICAgICAgICAgIGxocyA9IExIUyA7CisgICAgICAgICAgICAgaWYgKExvYWRXb3JkKHN0YXRlLGluc3RyLGxocykpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gbGhzIC0gTFNSZWdSSFMgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg2MiA6IC8qIFN0b3JlIFdvcmQsIFdyaXRlQmFjaywgUG9zdCBEZWMsIFJlZyAqLworICAgICAgICAgICAgIGlmIChCSVQoNCkpIHsKKyAgICAgICAgICAgICAgICBBUk11bF9VbmRlZkluc3RyKHN0YXRlLGluc3RyKSA7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFPZmZXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENPZmZXYiA7CisgICAgICAgICAgICAgbGhzID0gTEhTIDsKKyAgICAgICAgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gTE9XIDsKKyAgICAgICAgICAgICBpZiAoU3RvcmVXb3JkKHN0YXRlLGluc3RyLGxocykpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gbGhzIC0gTFNSZWdSSFMgOworICAgICAgICAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSAoc3RhdGUtPk1vZGUgJiAzKT9ISUdIOkxPVyA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDYzIDogLyogTG9hZCBXb3JkLCBXcml0ZUJhY2ssIFBvc3QgRGVjLCBSZWcgKi8KKyAgICAgICAgICAgICBpZiAoQklUKDQpKSB7CisgICAgICAgICAgICAgICAgQVJNdWxfVW5kZWZJbnN0cihzdGF0ZSxpbnN0cikgOworICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENCYXNlV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDT2ZmV2IgOworICAgICAgICAgICAgIGxocyA9IExIUyA7CisgICAgICAgICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IExPVyA7CisgICAgICAgICAgICAgaWYgKExvYWRXb3JkKHN0YXRlLGluc3RyLGxocykpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gbGhzIC0gTFNSZWdSSFMgOworICAgICAgICAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSAoc3RhdGUtPk1vZGUgJiAzKT9ISUdIOkxPVyA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDY0IDogLyogU3RvcmUgQnl0ZSwgTm8gV3JpdGVCYWNrLCBQb3N0IERlYywgUmVnICovCisgICAgICAgICAgICAgaWYgKEJJVCg0KSkgeworICAgICAgICAgICAgICAgIEFSTXVsX1VuZGVmSW5zdHIoc3RhdGUsaW5zdHIpIDsKKyAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDQmFzZVdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ09mZldiIDsKKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIGlmIChTdG9yZUJ5dGUoc3RhdGUsaW5zdHIsbGhzKSkKKyAgICAgICAgICAgICAgICBMU0Jhc2UgPSBsaHMgLSBMU1JlZ1JIUyA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDY1IDogLyogTG9hZCBCeXRlLCBObyBXcml0ZUJhY2ssIFBvc3QgRGVjLCBSZWcgKi8KKyAgICAgICAgICAgICBpZiAoQklUKDQpKSB7CisgICAgICAgICAgICAgICAgQVJNdWxfVW5kZWZJbnN0cihzdGF0ZSxpbnN0cikgOworICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENCYXNlV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDT2ZmV2IgOworICAgICAgICAgICAgIGxocyA9IExIUyA7CisgICAgICAgICAgICAgaWYgKExvYWRCeXRlKHN0YXRlLGluc3RyLGxocyxMVU5TSUdORUQpKQorICAgICAgICAgICAgICAgIExTQmFzZSA9IGxocyAtIExTUmVnUkhTIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4NjYgOiAvKiBTdG9yZSBCeXRlLCBXcml0ZUJhY2ssIFBvc3QgRGVjLCBSZWcgKi8KKyAgICAgICAgICAgICBpZiAoQklUKDQpKSB7CisgICAgICAgICAgICAgICAgQVJNdWxfVW5kZWZJbnN0cihzdGF0ZSxpbnN0cikgOworICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENCYXNlV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDT2ZmV2IgOworICAgICAgICAgICAgIGxocyA9IExIUyA7CisgICAgICAgICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IExPVyA7CisgICAgICAgICAgICAgaWYgKFN0b3JlQnl0ZShzdGF0ZSxpbnN0cixsaHMpKQorICAgICAgICAgICAgICAgIExTQmFzZSA9IGxocyAtIExTUmVnUkhTIDsKKyAgICAgICAgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gKHN0YXRlLT5Nb2RlICYgMyk/SElHSDpMT1cgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg2NyA6IC8qIExvYWQgQnl0ZSwgV3JpdGVCYWNrLCBQb3N0IERlYywgUmVnICovCisgICAgICAgICAgICAgaWYgKEJJVCg0KSkgeworICAgICAgICAgICAgICAgIEFSTXVsX1VuZGVmSW5zdHIoc3RhdGUsaW5zdHIpIDsKKyAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDQmFzZVdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ09mZldiIDsKKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSBMT1cgOworICAgICAgICAgICAgIGlmIChMb2FkQnl0ZShzdGF0ZSxpbnN0cixsaHMsTFVOU0lHTkVEKSkKKyAgICAgICAgICAgICAgICBMU0Jhc2UgPSBsaHMgLSBMU1JlZ1JIUyA7CisgICAgICAgICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IChzdGF0ZS0+TW9kZSAmIDMpP0hJR0g6TE9XIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4NjggOiAvKiBTdG9yZSBXb3JkLCBObyBXcml0ZUJhY2ssIFBvc3QgSW5jLCBSZWcgKi8KKyAgICAgICAgICAgICBpZiAoQklUKDQpKSB7CisgICAgICAgICAgICAgICAgQVJNdWxfVW5kZWZJbnN0cihzdGF0ZSxpbnN0cikgOworICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENCYXNlV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDT2ZmV2IgOworICAgICAgICAgICAgIGxocyA9IExIUyA7CisgICAgICAgICAgICAgaWYgKFN0b3JlV29yZChzdGF0ZSxpbnN0cixsaHMpKQorICAgICAgICAgICAgICAgIExTQmFzZSA9IGxocyArIExTUmVnUkhTIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4NjkgOiAvKiBMb2FkIFdvcmQsIE5vIFdyaXRlQmFjaywgUG9zdCBJbmMsIFJlZyAqLworICAgICAgICAgICAgIGlmIChCSVQoNCkpIHsKKyAgICAgICAgICAgICAgICBBUk11bF9VbmRlZkluc3RyKHN0YXRlLGluc3RyKSA7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFPZmZXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENPZmZXYiA7CisgICAgICAgICAgICAgbGhzID0gTEhTIDsKKyAgICAgICAgICAgICBpZiAoTG9hZFdvcmQoc3RhdGUsaW5zdHIsbGhzKSkKKyAgICAgICAgICAgICAgICBMU0Jhc2UgPSBsaHMgKyBMU1JlZ1JIUyA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDZhIDogLyogU3RvcmUgV29yZCwgV3JpdGVCYWNrLCBQb3N0IEluYywgUmVnICovCisgICAgICAgICAgICAgaWYgKEJJVCg0KSkgeworICAgICAgICAgICAgICAgIEFSTXVsX1VuZGVmSW5zdHIoc3RhdGUsaW5zdHIpIDsKKyAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDQmFzZVdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ09mZldiIDsKKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSBMT1cgOworICAgICAgICAgICAgIGlmIChTdG9yZVdvcmQoc3RhdGUsaW5zdHIsbGhzKSkKKyAgICAgICAgICAgICAgICBMU0Jhc2UgPSBsaHMgKyBMU1JlZ1JIUyA7CisgICAgICAgICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IChzdGF0ZS0+TW9kZSAmIDMpP0hJR0g6TE9XIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4NmIgOiAvKiBMb2FkIFdvcmQsIFdyaXRlQmFjaywgUG9zdCBJbmMsIFJlZyAqLworICAgICAgICAgICAgIGlmIChCSVQoNCkpIHsKKyAgICAgICAgICAgICAgICBBUk11bF9VbmRlZkluc3RyKHN0YXRlLGluc3RyKSA7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFPZmZXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENPZmZXYiA7CisgICAgICAgICAgICAgbGhzID0gTEhTIDsKKyAgICAgICAgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gTE9XIDsKKyAgICAgICAgICAgICBpZiAoTG9hZFdvcmQoc3RhdGUsaW5zdHIsbGhzKSkKKyAgICAgICAgICAgICAgICBMU0Jhc2UgPSBsaHMgKyBMU1JlZ1JIUyA7CisgICAgICAgICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IChzdGF0ZS0+TW9kZSAmIDMpP0hJR0g6TE9XIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4NmMgOiAvKiBTdG9yZSBCeXRlLCBObyBXcml0ZUJhY2ssIFBvc3QgSW5jLCBSZWcgKi8KKyAgICAgICAgICAgICBpZiAoQklUKDQpKSB7CisgICAgICAgICAgICAgICAgQVJNdWxfVW5kZWZJbnN0cihzdGF0ZSxpbnN0cikgOworICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENCYXNlV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDT2ZmV2IgOworICAgICAgICAgICAgIGxocyA9IExIUyA7CisgICAgICAgICAgICAgaWYgKFN0b3JlQnl0ZShzdGF0ZSxpbnN0cixsaHMpKQorICAgICAgICAgICAgICAgIExTQmFzZSA9IGxocyArIExTUmVnUkhTIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4NmQgOiAvKiBMb2FkIEJ5dGUsIE5vIFdyaXRlQmFjaywgUG9zdCBJbmMsIFJlZyAqLworICAgICAgICAgICAgIGlmIChCSVQoNCkpIHsKKyAgICAgICAgICAgICAgICBBUk11bF9VbmRlZkluc3RyKHN0YXRlLGluc3RyKSA7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFPZmZXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENPZmZXYiA7CisgICAgICAgICAgICAgbGhzID0gTEhTIDsKKyAgICAgICAgICAgICBpZiAoTG9hZEJ5dGUoc3RhdGUsaW5zdHIsbGhzLExVTlNJR05FRCkpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gbGhzICsgTFNSZWdSSFMgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg2ZSA6IC8qIFN0b3JlIEJ5dGUsIFdyaXRlQmFjaywgUG9zdCBJbmMsIFJlZyAqLworICAgICAgICAgICAgIGlmIChCSVQoNCkpIHsKKyAgICAgICAgICAgICAgICBBUk11bF9VbmRlZkluc3RyKHN0YXRlLGluc3RyKSA7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFPZmZXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENPZmZXYiA7CisgICAgICAgICAgICAgbGhzID0gTEhTIDsKKyAgICAgICAgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gTE9XIDsKKyAgICAgICAgICAgICBpZiAoU3RvcmVCeXRlKHN0YXRlLGluc3RyLGxocykpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gbGhzICsgTFNSZWdSSFMgOworICAgICAgICAgICAgIHN0YXRlLT5OdHJhbnNTaWcgPSAoc3RhdGUtPk1vZGUgJiAzKT9ISUdIOkxPVyA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDZmIDogLyogTG9hZCBCeXRlLCBXcml0ZUJhY2ssIFBvc3QgSW5jLCBSZWcgKi8KKyAgICAgICAgICAgICBpZiAoQklUKDQpKSB7CisgICAgICAgICAgICAgICAgQVJNdWxfVW5kZWZJbnN0cihzdGF0ZSxpbnN0cikgOworICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENCYXNlV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDT2ZmV2IgOworICAgICAgICAgICAgIGxocyA9IExIUyA7CisgICAgICAgICAgICAgc3RhdGUtPk50cmFuc1NpZyA9IExPVyA7CisgICAgICAgICAgICAgaWYgKExvYWRCeXRlKHN0YXRlLGluc3RyLGxocyxMVU5TSUdORUQpKQorICAgICAgICAgICAgICAgIExTQmFzZSA9IGxocyArIExTUmVnUkhTIDsKKyAgICAgICAgICAgICBzdGF0ZS0+TnRyYW5zU2lnID0gKHN0YXRlLT5Nb2RlICYgMyk/SElHSDpMT1cgOworICAgICAgICAgICAgIGJyZWFrIDsKKworCisgICAgICAgICAgY2FzZSAweDcwIDogLyogU3RvcmUgV29yZCwgTm8gV3JpdGVCYWNrLCBQcmUgRGVjLCBSZWcgKi8KKyAgICAgICAgICAgICBpZiAoQklUKDQpKSB7CisgICAgICAgICAgICAgICAgQVJNdWxfVW5kZWZJbnN0cihzdGF0ZSxpbnN0cikgOworICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgKHZvaWQpU3RvcmVXb3JkKHN0YXRlLGluc3RyLExIUyAtIExTUmVnUkhTKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDcxIDogLyogTG9hZCBXb3JkLCBObyBXcml0ZUJhY2ssIFByZSBEZWMsIFJlZyAqLworICAgICAgICAgICAgIGlmIChCSVQoNCkpIHsKKyAgICAgICAgICAgICAgICBBUk11bF9VbmRlZkluc3RyKHN0YXRlLGluc3RyKSA7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAodm9pZClMb2FkV29yZChzdGF0ZSxpbnN0cixMSFMgLSBMU1JlZ1JIUykgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg3MiA6IC8qIFN0b3JlIFdvcmQsIFdyaXRlQmFjaywgUHJlIERlYywgUmVnICovCisgICAgICAgICAgICAgaWYgKEJJVCg0KSkgeworICAgICAgICAgICAgICAgIEFSTXVsX1VuZGVmSW5zdHIoc3RhdGUsaW5zdHIpIDsKKyAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDQmFzZVdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ09mZldiIDsKKyAgICAgICAgICAgICB0ZW1wID0gTEhTIC0gTFNSZWdSSFMgOworICAgICAgICAgICAgIGlmIChTdG9yZVdvcmQoc3RhdGUsaW5zdHIsdGVtcCkpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gdGVtcCA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDczIDogLyogTG9hZCBXb3JkLCBXcml0ZUJhY2ssIFByZSBEZWMsIFJlZyAqLworICAgICAgICAgICAgIGlmIChCSVQoNCkpIHsKKyAgICAgICAgICAgICAgICBBUk11bF9VbmRlZkluc3RyKHN0YXRlLGluc3RyKSA7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFPZmZXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENPZmZXYiA7CisgICAgICAgICAgICAgdGVtcCA9IExIUyAtIExTUmVnUkhTIDsKKyAgICAgICAgICAgICBpZiAoTG9hZFdvcmQoc3RhdGUsaW5zdHIsdGVtcCkpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gdGVtcCA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDc0IDogLyogU3RvcmUgQnl0ZSwgTm8gV3JpdGVCYWNrLCBQcmUgRGVjLCBSZWcgKi8KKyAgICAgICAgICAgICBpZiAoQklUKDQpKSB7CisgICAgICAgICAgICAgICAgQVJNdWxfVW5kZWZJbnN0cihzdGF0ZSxpbnN0cikgOworICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgKHZvaWQpU3RvcmVCeXRlKHN0YXRlLGluc3RyLExIUyAtIExTUmVnUkhTKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDc1IDogLyogTG9hZCBCeXRlLCBObyBXcml0ZUJhY2ssIFByZSBEZWMsIFJlZyAqLworICAgICAgICAgICAgIGlmIChCSVQoNCkpIHsKKyAgICAgICAgICAgICAgICBBUk11bF9VbmRlZkluc3RyKHN0YXRlLGluc3RyKSA7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAodm9pZClMb2FkQnl0ZShzdGF0ZSxpbnN0cixMSFMgLSBMU1JlZ1JIUyxMVU5TSUdORUQpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4NzYgOiAvKiBTdG9yZSBCeXRlLCBXcml0ZUJhY2ssIFByZSBEZWMsIFJlZyAqLworICAgICAgICAgICAgIGlmIChCSVQoNCkpIHsKKyAgICAgICAgICAgICAgICBBUk11bF9VbmRlZkluc3RyKHN0YXRlLGluc3RyKSA7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFPZmZXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENPZmZXYiA7CisgICAgICAgICAgICAgdGVtcCA9IExIUyAtIExTUmVnUkhTIDsKKyAgICAgICAgICAgICBpZiAoU3RvcmVCeXRlKHN0YXRlLGluc3RyLHRlbXApKQorICAgICAgICAgICAgICAgIExTQmFzZSA9IHRlbXAgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg3NyA6IC8qIExvYWQgQnl0ZSwgV3JpdGVCYWNrLCBQcmUgRGVjLCBSZWcgKi8KKyAgICAgICAgICAgICBpZiAoQklUKDQpKSB7CisgICAgICAgICAgICAgICAgQVJNdWxfVW5kZWZJbnN0cihzdGF0ZSxpbnN0cikgOworICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENCYXNlV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDT2ZmV2IgOworICAgICAgICAgICAgIHRlbXAgPSBMSFMgLSBMU1JlZ1JIUyA7CisgICAgICAgICAgICAgaWYgKExvYWRCeXRlKHN0YXRlLGluc3RyLHRlbXAsTFVOU0lHTkVEKSkKKyAgICAgICAgICAgICAgICBMU0Jhc2UgPSB0ZW1wIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4NzggOiAvKiBTdG9yZSBXb3JkLCBObyBXcml0ZUJhY2ssIFByZSBJbmMsIFJlZyAqLworICAgICAgICAgICAgIGlmIChCSVQoNCkpIHsKKyAgICAgICAgICAgICAgICBBUk11bF9VbmRlZkluc3RyKHN0YXRlLGluc3RyKSA7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAodm9pZClTdG9yZVdvcmQoc3RhdGUsaW5zdHIsTEhTICsgTFNSZWdSSFMpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4NzkgOiAvKiBMb2FkIFdvcmQsIE5vIFdyaXRlQmFjaywgUHJlIEluYywgUmVnICovCisgICAgICAgICAgICAgaWYgKEJJVCg0KSkgeworICAgICAgICAgICAgICAgIEFSTXVsX1VuZGVmSW5zdHIoc3RhdGUsaW5zdHIpIDsKKyAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICh2b2lkKUxvYWRXb3JkKHN0YXRlLGluc3RyLExIUyArIExTUmVnUkhTKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDdhIDogLyogU3RvcmUgV29yZCwgV3JpdGVCYWNrLCBQcmUgSW5jLCBSZWcgKi8KKyAgICAgICAgICAgICBpZiAoQklUKDQpKSB7CisgICAgICAgICAgICAgICAgQVJNdWxfVW5kZWZJbnN0cihzdGF0ZSxpbnN0cikgOworICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRT2ZmV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUURlc3RXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENCYXNlV2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDT2ZmV2IgOworICAgICAgICAgICAgIHRlbXAgPSBMSFMgKyBMU1JlZ1JIUyA7CisgICAgICAgICAgICAgaWYgKFN0b3JlV29yZChzdGF0ZSxpbnN0cix0ZW1wKSkKKyAgICAgICAgICAgICAgICBMU0Jhc2UgPSB0ZW1wIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4N2IgOiAvKiBMb2FkIFdvcmQsIFdyaXRlQmFjaywgUHJlIEluYywgUmVnICovCisgICAgICAgICAgICAgaWYgKEJJVCg0KSkgeworICAgICAgICAgICAgICAgIEFSTXVsX1VuZGVmSW5zdHIoc3RhdGUsaW5zdHIpIDsKKyAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDQmFzZVdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ09mZldiIDsKKyAgICAgICAgICAgICB0ZW1wID0gTEhTICsgTFNSZWdSSFMgOworICAgICAgICAgICAgIGlmIChMb2FkV29yZChzdGF0ZSxpbnN0cix0ZW1wKSkKKyAgICAgICAgICAgICAgICBMU0Jhc2UgPSB0ZW1wIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4N2MgOiAvKiBTdG9yZSBCeXRlLCBObyBXcml0ZUJhY2ssIFByZSBJbmMsIFJlZyAqLworICAgICAgICAgICAgIGlmIChCSVQoNCkpIHsKKyAgICAgICAgICAgICAgICBBUk11bF9VbmRlZkluc3RyKHN0YXRlLGluc3RyKSA7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAodm9pZClTdG9yZUJ5dGUoc3RhdGUsaW5zdHIsTEhTICsgTFNSZWdSSFMpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4N2QgOiAvKiBMb2FkIEJ5dGUsIE5vIFdyaXRlQmFjaywgUHJlIEluYywgUmVnICovCisgICAgICAgICAgICAgaWYgKEJJVCg0KSkgeworICAgICAgICAgICAgICAgIEFSTXVsX1VuZGVmSW5zdHIoc3RhdGUsaW5zdHIpIDsKKyAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICh2b2lkKUxvYWRCeXRlKHN0YXRlLGluc3RyLExIUyArIExTUmVnUkhTLExVTlNJR05FRCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg3ZSA6IC8qIFN0b3JlIEJ5dGUsIFdyaXRlQmFjaywgUHJlIEluYywgUmVnICovCisgICAgICAgICAgICAgaWYgKEJJVCg0KSkgeworICAgICAgICAgICAgICAgIEFSTXVsX1VuZGVmSW5zdHIoc3RhdGUsaW5zdHIpIDsKKyAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIFVOREVGX0xTUkJhc2VFUU9mZldiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFEZXN0V2IgOworICAgICAgICAgICAgIFVOREVGX0xTUlBDQmFzZVdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ09mZldiIDsKKyAgICAgICAgICAgICB0ZW1wID0gTEhTICsgTFNSZWdSSFMgOworICAgICAgICAgICAgIGlmIChTdG9yZUJ5dGUoc3RhdGUsaW5zdHIsdGVtcCkpCisgICAgICAgICAgICAgICAgTFNCYXNlID0gdGVtcCA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDdmIDogLyogTG9hZCBCeXRlLCBXcml0ZUJhY2ssIFByZSBJbmMsIFJlZyAqLworICAgICAgICAgICAgIGlmIChCSVQoNCkpIHsKKyAgICAgICAgICAgICAgICBBUk11bF9VbmRlZkluc3RyKHN0YXRlLGluc3RyKSA7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBVTkRFRl9MU1JCYXNlRVFPZmZXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSQmFzZUVRRGVzdFdiIDsKKyAgICAgICAgICAgICBVTkRFRl9MU1JQQ0Jhc2VXYiA7CisgICAgICAgICAgICAgVU5ERUZfTFNSUENPZmZXYiA7CisgICAgICAgICAgICAgdGVtcCA9IExIUyArIExTUmVnUkhTIDsKKyAgICAgICAgICAgICBpZiAoTG9hZEJ5dGUoc3RhdGUsaW5zdHIsdGVtcCxMVU5TSUdORUQpKQorICAgICAgICAgICAgICAgIExTQmFzZSA9IHRlbXAgOworICAgICAgICAgICAgIGJyZWFrIDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgRGF0YSBUcmFuc2ZlciBJbnN0cnVjdGlvbnMgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgY2FzZSAweDgwIDogLyogU3RvcmUsIE5vIFdyaXRlQmFjaywgUG9zdCBEZWMgKi8KKyAgICAgICAgICAgICBTVE9SRU1VTFQoaW5zdHIsTFNCYXNlIC0gTFNNTnVtUmVncyArIDRMLDBMKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDgxIDogLyogTG9hZCwgTm8gV3JpdGVCYWNrLCBQb3N0IERlYyAqLworICAgICAgICAgICAgIExPQURNVUxUKGluc3RyLExTQmFzZSAtIExTTU51bVJlZ3MgKyA0TCwwTCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg4MiA6IC8qIFN0b3JlLCBXcml0ZUJhY2ssIFBvc3QgRGVjICovCisgICAgICAgICAgICAgdGVtcCA9IExTQmFzZSAtIExTTU51bVJlZ3MgOworICAgICAgICAgICAgIFNUT1JFTVVMVChpbnN0cix0ZW1wICsgNEwsdGVtcCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg4MyA6IC8qIExvYWQsIFdyaXRlQmFjaywgUG9zdCBEZWMgKi8KKyAgICAgICAgICAgICB0ZW1wID0gTFNCYXNlIC0gTFNNTnVtUmVncyA7CisgICAgICAgICAgICAgTE9BRE1VTFQoaW5zdHIsdGVtcCArIDRMLHRlbXApIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4ODQgOiAvKiBTdG9yZSwgRmxhZ3MsIE5vIFdyaXRlQmFjaywgUG9zdCBEZWMgKi8KKyAgICAgICAgICAgICBTVE9SRVNNVUxUKGluc3RyLExTQmFzZSAtIExTTU51bVJlZ3MgKyA0TCwwTCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg4NSA6IC8qIExvYWQsIEZsYWdzLCBObyBXcml0ZUJhY2ssIFBvc3QgRGVjICovCisgICAgICAgICAgICAgTE9BRFNNVUxUKGluc3RyLExTQmFzZSAtIExTTU51bVJlZ3MgKyA0TCwwTCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg4NiA6IC8qIFN0b3JlLCBGbGFncywgV3JpdGVCYWNrLCBQb3N0IERlYyAqLworICAgICAgICAgICAgIHRlbXAgPSBMU0Jhc2UgLSBMU01OdW1SZWdzIDsKKyAgICAgICAgICAgICBTVE9SRVNNVUxUKGluc3RyLHRlbXAgKyA0TCx0ZW1wKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDg3IDogLyogTG9hZCwgRmxhZ3MsIFdyaXRlQmFjaywgUG9zdCBEZWMgKi8KKyAgICAgICAgICAgICB0ZW1wID0gTFNCYXNlIC0gTFNNTnVtUmVncyA7CisgICAgICAgICAgICAgTE9BRFNNVUxUKGluc3RyLHRlbXAgKyA0TCx0ZW1wKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisKKyAgICAgICAgICBjYXNlIDB4ODggOiAvKiBTdG9yZSwgTm8gV3JpdGVCYWNrLCBQb3N0IEluYyAqLworICAgICAgICAgICAgIFNUT1JFTVVMVChpbnN0cixMU0Jhc2UsMEwpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4ODkgOiAvKiBMb2FkLCBObyBXcml0ZUJhY2ssIFBvc3QgSW5jICovCisgICAgICAgICAgICAgTE9BRE1VTFQoaW5zdHIsTFNCYXNlLDBMKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDhhIDogLyogU3RvcmUsIFdyaXRlQmFjaywgUG9zdCBJbmMgKi8KKyAgICAgICAgICAgICB0ZW1wID0gTFNCYXNlIDsKKyAgICAgICAgICAgICBTVE9SRU1VTFQoaW5zdHIsdGVtcCx0ZW1wICsgTFNNTnVtUmVncykgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg4YiA6IC8qIExvYWQsIFdyaXRlQmFjaywgUG9zdCBJbmMgKi8KKyAgICAgICAgICAgICB0ZW1wID0gTFNCYXNlIDsKKyAgICAgICAgICAgICBMT0FETVVMVChpbnN0cix0ZW1wLHRlbXAgKyBMU01OdW1SZWdzKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDhjIDogLyogU3RvcmUsIEZsYWdzLCBObyBXcml0ZUJhY2ssIFBvc3QgSW5jICovCisgICAgICAgICAgICAgU1RPUkVTTVVMVChpbnN0cixMU0Jhc2UsMEwpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4OGQgOiAvKiBMb2FkLCBGbGFncywgTm8gV3JpdGVCYWNrLCBQb3N0IEluYyAqLworICAgICAgICAgICAgIExPQURTTVVMVChpbnN0cixMU0Jhc2UsMEwpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4OGUgOiAvKiBTdG9yZSwgRmxhZ3MsIFdyaXRlQmFjaywgUG9zdCBJbmMgKi8KKyAgICAgICAgICAgICB0ZW1wID0gTFNCYXNlIDsKKyAgICAgICAgICAgICBTVE9SRVNNVUxUKGluc3RyLHRlbXAsdGVtcCArIExTTU51bVJlZ3MpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4OGYgOiAvKiBMb2FkLCBGbGFncywgV3JpdGVCYWNrLCBQb3N0IEluYyAqLworICAgICAgICAgICAgIHRlbXAgPSBMU0Jhc2UgOworICAgICAgICAgICAgIExPQURTTVVMVChpbnN0cix0ZW1wLHRlbXAgKyBMU01OdW1SZWdzKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisKKyAgICAgICAgICBjYXNlIDB4OTAgOiAvKiBTdG9yZSwgTm8gV3JpdGVCYWNrLCBQcmUgRGVjICovCisgICAgICAgICAgICAgU1RPUkVNVUxUKGluc3RyLExTQmFzZSAtIExTTU51bVJlZ3MsMEwpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4OTEgOiAvKiBMb2FkLCBObyBXcml0ZUJhY2ssIFByZSBEZWMgKi8KKyAgICAgICAgICAgICBMT0FETVVMVChpbnN0cixMU0Jhc2UgLSBMU01OdW1SZWdzLDBMKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDkyIDogLyogU3RvcmUsIFdyaXRlQmFjaywgUHJlIERlYyAqLworICAgICAgICAgICAgIHRlbXAgPSBMU0Jhc2UgLSBMU01OdW1SZWdzIDsKKyAgICAgICAgICAgICBTVE9SRU1VTFQoaW5zdHIsdGVtcCx0ZW1wKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDkzIDogLyogTG9hZCwgV3JpdGVCYWNrLCBQcmUgRGVjICovCisgICAgICAgICAgICAgdGVtcCA9IExTQmFzZSAtIExTTU51bVJlZ3MgOworICAgICAgICAgICAgIExPQURNVUxUKGluc3RyLHRlbXAsdGVtcCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg5NCA6IC8qIFN0b3JlLCBGbGFncywgTm8gV3JpdGVCYWNrLCBQcmUgRGVjICovCisgICAgICAgICAgICAgU1RPUkVTTVVMVChpbnN0cixMU0Jhc2UgLSBMU01OdW1SZWdzLDBMKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDk1IDogLyogTG9hZCwgRmxhZ3MsIE5vIFdyaXRlQmFjaywgUHJlIERlYyAqLworICAgICAgICAgICAgIExPQURTTVVMVChpbnN0cixMU0Jhc2UgLSBMU01OdW1SZWdzLDBMKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDk2IDogLyogU3RvcmUsIEZsYWdzLCBXcml0ZUJhY2ssIFByZSBEZWMgKi8KKyAgICAgICAgICAgICB0ZW1wID0gTFNCYXNlIC0gTFNNTnVtUmVncyA7CisgICAgICAgICAgICAgU1RPUkVTTVVMVChpbnN0cix0ZW1wLHRlbXApIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4OTcgOiAvKiBMb2FkLCBGbGFncywgV3JpdGVCYWNrLCBQcmUgRGVjICovCisgICAgICAgICAgICAgdGVtcCA9IExTQmFzZSAtIExTTU51bVJlZ3MgOworICAgICAgICAgICAgIExPQURTTVVMVChpbnN0cix0ZW1wLHRlbXApIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKworICAgICAgICAgIGNhc2UgMHg5OCA6IC8qIFN0b3JlLCBObyBXcml0ZUJhY2ssIFByZSBJbmMgKi8KKyAgICAgICAgICAgICBTVE9SRU1VTFQoaW5zdHIsTFNCYXNlICsgNEwsMEwpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4OTkgOiAvKiBMb2FkLCBObyBXcml0ZUJhY2ssIFByZSBJbmMgKi8KKyAgICAgICAgICAgICBMT0FETVVMVChpbnN0cixMU0Jhc2UgKyA0TCwwTCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg5YSA6IC8qIFN0b3JlLCBXcml0ZUJhY2ssIFByZSBJbmMgKi8KKyAgICAgICAgICAgICB0ZW1wID0gTFNCYXNlIDsKKyAgICAgICAgICAgICBTVE9SRU1VTFQoaW5zdHIsdGVtcCArIDRMLHRlbXAgKyBMU01OdW1SZWdzKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDliIDogLyogTG9hZCwgV3JpdGVCYWNrLCBQcmUgSW5jICovCisgICAgICAgICAgICAgdGVtcCA9IExTQmFzZSA7CisgICAgICAgICAgICAgTE9BRE1VTFQoaW5zdHIsdGVtcCArIDRMLHRlbXAgKyBMU01OdW1SZWdzKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDljIDogLyogU3RvcmUsIEZsYWdzLCBObyBXcml0ZUJhY2ssIFByZSBJbmMgKi8KKyAgICAgICAgICAgICBTVE9SRVNNVUxUKGluc3RyLExTQmFzZSArIDRMLDBMKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweDlkIDogLyogTG9hZCwgRmxhZ3MsIE5vIFdyaXRlQmFjaywgUHJlIEluYyAqLworICAgICAgICAgICAgIExPQURTTVVMVChpbnN0cixMU0Jhc2UgKyA0TCwwTCkgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHg5ZSA6IC8qIFN0b3JlLCBGbGFncywgV3JpdGVCYWNrLCBQcmUgSW5jICovCisgICAgICAgICAgICAgdGVtcCA9IExTQmFzZSA7CisgICAgICAgICAgICAgU1RPUkVTTVVMVChpbnN0cix0ZW1wICsgNEwsdGVtcCArIExTTU51bVJlZ3MpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4OWYgOiAvKiBMb2FkLCBGbGFncywgV3JpdGVCYWNrLCBQcmUgSW5jICovCisgICAgICAgICAgICAgdGVtcCA9IExTQmFzZSA7CisgICAgICAgICAgICAgTE9BRFNNVUxUKGluc3RyLHRlbXAgKyA0TCx0ZW1wICsgTFNNTnVtUmVncykgOworICAgICAgICAgICAgIGJyZWFrIDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQnJhbmNoIGZvcndhcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgY2FzZSAweGEwIDogY2FzZSAweGExIDogY2FzZSAweGEyIDogY2FzZSAweGEzIDoKKyAgICAgICAgICBjYXNlIDB4YTQgOiBjYXNlIDB4YTUgOiBjYXNlIDB4YTYgOiBjYXNlIDB4YTcgOgorICAgICAgICAgICAgIHN0YXRlLT5SZWdbMTVdID0gcGMgKyA4ICsgUE9TQlJBTkNIIDsKKyAgICAgICAgICAgICBGTFVTSFBJUEUgOworICAgICAgICAgICAgIGJyZWFrIDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICBCcmFuY2ggYmFja3dhcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgY2FzZSAweGE4IDogY2FzZSAweGE5IDogY2FzZSAweGFhIDogY2FzZSAweGFiIDoKKyAgICAgICAgICBjYXNlIDB4YWMgOiBjYXNlIDB4YWQgOiBjYXNlIDB4YWUgOiBjYXNlIDB4YWYgOgorICAgICAgICAgICAgIHN0YXRlLT5SZWdbMTVdID0gcGMgKyA4ICsgTkVHQlJBTkNIIDsKKyAgICAgICAgICAgICBGTFVTSFBJUEUgOworICAgICAgICAgICAgIGJyZWFrIDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgIEJyYW5jaCBhbmQgTGluayBmb3J3YXJkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgY2FzZSAweGIwIDogY2FzZSAweGIxIDogY2FzZSAweGIyIDogY2FzZSAweGIzIDoKKyAgICAgICAgICBjYXNlIDB4YjQgOiBjYXNlIDB4YjUgOiBjYXNlIDB4YjYgOiBjYXNlIDB4YjcgOgorI2lmZGVmIE1PREUzMgorICAgICAgICAgICAgIHN0YXRlLT5SZWdbMTRdID0gcGMgKyA0IDsgLyogcHV0IFBDIGludG8gTGluayAqLworI2Vsc2UKKyAgICAgICAgICAgICBzdGF0ZS0+UmVnWzE0XSA9IHBjICsgNCB8IEVDQyB8IEVSMTVJTlQgfCBFTU9ERSA7IC8qIHB1dCBQQyBpbnRvIExpbmsgKi8KKyNlbmRpZgorICAgICAgICAgICAgIHN0YXRlLT5SZWdbMTVdID0gcGMgKyA4ICsgUE9TQlJBTkNIIDsKKyAgICAgICAgICAgICBGTFVTSFBJUEUgOworICAgICAgICAgICAgIGJyZWFrIDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgIEJyYW5jaCBhbmQgTGluayBiYWNrd2FyZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgY2FzZSAweGI4IDogY2FzZSAweGI5IDogY2FzZSAweGJhIDogY2FzZSAweGJiIDoKKyAgICAgICAgICBjYXNlIDB4YmMgOiBjYXNlIDB4YmQgOiBjYXNlIDB4YmUgOiBjYXNlIDB4YmYgOgorI2lmZGVmIE1PREUzMgorICAgICAgICAgICAgIHN0YXRlLT5SZWdbMTRdID0gcGMgKyA0IDsgLyogcHV0IFBDIGludG8gTGluayAqLworI2Vsc2UKKyAgICAgICAgICAgICBzdGF0ZS0+UmVnWzE0XSA9IChwYyArIDQpIHwgRUNDIHwgRVIxNUlOVCB8IEVNT0RFIDsgLyogcHV0IFBDIGludG8gTGluayAqLworI2VuZGlmCisgICAgICAgICAgICAgc3RhdGUtPlJlZ1sxNV0gPSBwYyArIDggKyBORUdCUkFOQ0ggOworICAgICAgICAgICAgIEZMVVNIUElQRSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgIENvLVByb2Nlc3NvciBEYXRhIFRyYW5zZmVycyAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICBjYXNlIDB4YzAgOgorICAgICAgICAgIGNhc2UgMHhjNCA6IC8qIFN0b3JlICwgTm8gV3JpdGVCYWNrICwgUG9zdCBEZWMgKi8KKyAgICAgICAgICAgICBBUk11bF9TVEMoc3RhdGUsaW5zdHIsTEhTKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweGMxIDoKKyAgICAgICAgICBjYXNlIDB4YzUgOiAvKiBMb2FkICwgTm8gV3JpdGVCYWNrICwgUG9zdCBEZWMgKi8KKyAgICAgICAgICAgICBBUk11bF9MREMoc3RhdGUsaW5zdHIsTEhTKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweGMyIDoKKyAgICAgICAgICBjYXNlIDB4YzYgOiAvKiBTdG9yZSAsIFdyaXRlQmFjayAsIFBvc3QgRGVjICovCisgICAgICAgICAgICAgbGhzID0gTEhTIDsKKyAgICAgICAgICAgICBzdGF0ZS0+QmFzZSA9IGxocyAtIExTQ09mZiA7CisgICAgICAgICAgICAgQVJNdWxfU1RDKHN0YXRlLGluc3RyLGxocykgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHhjMyA6CisgICAgICAgICAgY2FzZSAweGM3IDogLyogTG9hZCAsIFdyaXRlQmFjayAsIFBvc3QgRGVjICovCisgICAgICAgICAgICAgbGhzID0gTEhTIDsKKyAgICAgICAgICAgICBzdGF0ZS0+QmFzZSA9IGxocyAtIExTQ09mZiA7CisgICAgICAgICAgICAgQVJNdWxfTERDKHN0YXRlLGluc3RyLGxocykgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHhjOCA6CisgICAgICAgICAgY2FzZSAweGNjIDogLyogU3RvcmUgLCBObyBXcml0ZUJhY2sgLCBQb3N0IEluYyAqLworICAgICAgICAgICAgIEFSTXVsX1NUQyhzdGF0ZSxpbnN0cixMSFMpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4YzkgOgorICAgICAgICAgIGNhc2UgMHhjZCA6IC8qIExvYWQgLCBObyBXcml0ZUJhY2sgLCBQb3N0IEluYyAqLworICAgICAgICAgICAgIEFSTXVsX0xEQyhzdGF0ZSxpbnN0cixMSFMpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4Y2EgOgorICAgICAgICAgIGNhc2UgMHhjZSA6IC8qIFN0b3JlICwgV3JpdGVCYWNrICwgUG9zdCBJbmMgKi8KKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIHN0YXRlLT5CYXNlID0gbGhzICsgTFNDT2ZmIDsKKyAgICAgICAgICAgICBBUk11bF9TVEMoc3RhdGUsaW5zdHIsTEhTKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweGNiIDoKKyAgICAgICAgICBjYXNlIDB4Y2YgOiAvKiBMb2FkICwgV3JpdGVCYWNrICwgUG9zdCBJbmMgKi8KKyAgICAgICAgICAgICBsaHMgPSBMSFMgOworICAgICAgICAgICAgIHN0YXRlLT5CYXNlID0gbGhzICsgTFNDT2ZmIDsKKyAgICAgICAgICAgICBBUk11bF9MREMoc3RhdGUsaW5zdHIsTEhTKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisKKyAgICAgICAgICBjYXNlIDB4ZDAgOgorICAgICAgICAgIGNhc2UgMHhkNCA6IC8qIFN0b3JlICwgTm8gV3JpdGVCYWNrICwgUHJlIERlYyAqLworICAgICAgICAgICAgIEFSTXVsX1NUQyhzdGF0ZSxpbnN0cixMSFMgLSBMU0NPZmYpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4ZDEgOgorICAgICAgICAgIGNhc2UgMHhkNSA6IC8qIExvYWQgLCBObyBXcml0ZUJhY2sgLCBQcmUgRGVjICovCisgICAgICAgICAgICAgQVJNdWxfTERDKHN0YXRlLGluc3RyLExIUyAtIExTQ09mZikgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHhkMiA6CisgICAgICAgICAgY2FzZSAweGQ2IDogLyogU3RvcmUgLCBXcml0ZUJhY2sgLCBQcmUgRGVjICovCisgICAgICAgICAgICAgbGhzID0gTEhTIC0gTFNDT2ZmIDsKKyAgICAgICAgICAgICBzdGF0ZS0+QmFzZSA9IGxocyA7CisgICAgICAgICAgICAgQVJNdWxfU1RDKHN0YXRlLGluc3RyLGxocykgOworICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgICAgIGNhc2UgMHhkMyA6CisgICAgICAgICAgY2FzZSAweGQ3IDogLyogTG9hZCAsIFdyaXRlQmFjayAsIFByZSBEZWMgKi8KKyAgICAgICAgICAgICBsaHMgPSBMSFMgLSBMU0NPZmYgOworICAgICAgICAgICAgIHN0YXRlLT5CYXNlID0gbGhzIDsKKyAgICAgICAgICAgICBBUk11bF9MREMoc3RhdGUsaW5zdHIsbGhzKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweGQ4IDoKKyAgICAgICAgICBjYXNlIDB4ZGMgOiAvKiBTdG9yZSAsIE5vIFdyaXRlQmFjayAsIFByZSBJbmMgKi8KKyAgICAgICAgICAgICBBUk11bF9TVEMoc3RhdGUsaW5zdHIsTEhTICsgTFNDT2ZmKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgY2FzZSAweGQ5IDoKKyAgICAgICAgICBjYXNlIDB4ZGQgOiAvKiBMb2FkICwgTm8gV3JpdGVCYWNrICwgUHJlIEluYyAqLworICAgICAgICAgICAgIEFSTXVsX0xEQyhzdGF0ZSxpbnN0cixMSFMgKyBMU0NPZmYpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4ZGEgOgorICAgICAgICAgIGNhc2UgMHhkZSA6IC8qIFN0b3JlICwgV3JpdGVCYWNrICwgUHJlIEluYyAqLworICAgICAgICAgICAgIGxocyA9IExIUyArIExTQ09mZiA7CisgICAgICAgICAgICAgc3RhdGUtPkJhc2UgPSBsaHMgOworICAgICAgICAgICAgIEFSTXVsX1NUQyhzdGF0ZSxpbnN0cixsaHMpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKyAgICAgICAgICBjYXNlIDB4ZGIgOgorICAgICAgICAgIGNhc2UgMHhkZiA6IC8qIExvYWQgLCBXcml0ZUJhY2sgLCBQcmUgSW5jICovCisgICAgICAgICAgICAgbGhzID0gTEhTICsgTFNDT2ZmIDsKKyAgICAgICAgICAgICBzdGF0ZS0+QmFzZSA9IGxocyA7CisgICAgICAgICAgICAgQVJNdWxfTERDKHN0YXRlLGluc3RyLGxocykgOworICAgICAgICAgICAgIGJyZWFrIDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICBDby1Qcm9jZXNzb3IgUmVnaXN0ZXIgVHJhbnNmZXJzIChNQ1IpIGFuZCBEYXRhIE9wcyAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgY2FzZSAweGUwIDogY2FzZSAweGUyIDogY2FzZSAweGU0IDogY2FzZSAweGU2IDoKKyAgICAgICAgICBjYXNlIDB4ZTggOiBjYXNlIDB4ZWEgOiBjYXNlIDB4ZWMgOiBjYXNlIDB4ZWUgOgorICAgICAgICAgICAgIGlmIChCSVQoNCkpIHsgLyogTUNSICovCisgICAgICAgICAgICAgICAgaWYgKERFU1RSZWcgPT0gMTUpIHsKKyAgICAgICAgICAgICAgICAgICBVTkRFRl9NQ1JQQyA7CisjaWZkZWYgTU9ERTMyCisgICAgICAgICAgICAgICAgICAgQVJNdWxfTUNSKHN0YXRlLGluc3RyLHN0YXRlLT5SZWdbMTVdICsgaXNpemUpIDsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgQVJNdWxfTUNSKHN0YXRlLGluc3RyLEVDQyB8IEVSMTVJTlQgfCBFTU9ERSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHN0YXRlLT5SZWdbMTVdICsgaXNpemUpICYgUjE1UENCSVRTKSApIDsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgQVJNdWxfTUNSKHN0YXRlLGluc3RyLERFU1QpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSAvKiBDRFAgUGFydCAxICovCisgICAgICAgICAgICAgICAgQVJNdWxfQ0RQKHN0YXRlLGluc3RyKSA7CisgICAgICAgICAgICAgYnJlYWsgOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgIENvLVByb2Nlc3NvciBSZWdpc3RlciBUcmFuc2ZlcnMgKE1SQykgYW5kIERhdGEgT3BzICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICBjYXNlIDB4ZTEgOiBjYXNlIDB4ZTMgOiBjYXNlIDB4ZTUgOiBjYXNlIDB4ZTcgOgorICAgICAgICAgIGNhc2UgMHhlOSA6IGNhc2UgMHhlYiA6IGNhc2UgMHhlZCA6IGNhc2UgMHhlZiA6CisgICAgICAgICAgICAgaWYgKEJJVCg0KSkgeyAvKiBNUkMgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gQVJNdWxfTVJDKHN0YXRlLGluc3RyKSA7CisgICAgICAgICAgICAgICAgaWYgKERFU1RSZWcgPT0gMTUpIHsKKyAgICAgICAgICAgICAgICAgICBBU1NJR05OKCh0ZW1wICYgTkJJVCkgIT0gMCkgOworICAgICAgICAgICAgICAgICAgIEFTU0lHTlooKHRlbXAgJiBaQklUKSAhPSAwKSA7CisgICAgICAgICAgICAgICAgICAgQVNTSUdOQygodGVtcCAmIENCSVQpICE9IDApIDsKKyAgICAgICAgICAgICAgICAgICBBU1NJR05WKCh0ZW1wICYgVkJJVCkgIT0gMCkgOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgREVTVCA9IHRlbXAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIC8qIENEUCBQYXJ0IDIgKi8KKyAgICAgICAgICAgICAgICBBUk11bF9DRFAoc3RhdGUsaW5zdHIpIDsKKyAgICAgICAgICAgICBicmVhayA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV0kgaW5zdHJ1Y3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgIGNhc2UgMHhmMCA6IGNhc2UgMHhmMSA6IGNhc2UgMHhmMiA6IGNhc2UgMHhmMyA6CisgICAgICAgICAgY2FzZSAweGY0IDogY2FzZSAweGY1IDogY2FzZSAweGY2IDogY2FzZSAweGY3IDoKKyAgICAgICAgICBjYXNlIDB4ZjggOiBjYXNlIDB4ZjkgOiBjYXNlIDB4ZmEgOiBjYXNlIDB4ZmIgOgorICAgICAgICAgIGNhc2UgMHhmYyA6IGNhc2UgMHhmZCA6IGNhc2UgMHhmZSA6IGNhc2UgMHhmZiA6CisgICAgICAgICAgICAgaWYgKGluc3RyID09IEFSTXVsX0FCT1JUV09SRCAmJiBzdGF0ZS0+QWJvcnRBZGRyID09IHBjKSB7IC8qIGEgcHJlZmV0Y2ggYWJvcnQgKi8KKyAgICAgICAgICAgICAgICBBUk11bF9BYm9ydChzdGF0ZSxBUk11bF9QcmVmZXRjaEFib3J0VikgOworICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAgaWYgKCFBUk11bF9PU0hhbmRsZVNXSShzdGF0ZSxCSVRTKDAsMjMpKSkgeworICAgICAgICAgICAgICAgIEFSTXVsX0Fib3J0KHN0YXRlLEFSTXVsX1NXSVYpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgIH0gLyogMjU2IHdheSBtYWluIHN3aXRjaCAqLworICAgICAgIH0gLyogaWYgdGVtcCAqLworCisjaWZkZWYgTU9ERVQKK2RvbmV4dDoKKyNlbmRpZgorCisgICAgaWYgKHN0YXRlLT5FbXVsYXRlID09IE9OQ0UpCisgICAgICAgIHN0YXRlLT5FbXVsYXRlID0gU1RPUDsKKyAgICBlbHNlIGlmIChzdGF0ZS0+RW11bGF0ZSAhPSBSVU4pCisgICAgICAgIGJyZWFrOworICAgIH0gd2hpbGUgKDEpIDsgLyogZG8gbG9vcCAqLworCisgc3RhdGUtPmRlY29kZWQgPSBkZWNvZGVkIDsKKyBzdGF0ZS0+bG9hZGVkID0gbG9hZGVkIDsKKyBzdGF0ZS0+cGMgPSBwYyA7CisgcmV0dXJuKHBjKSA7CisgfSAvKiBFbXVsYXRlIDI2LzMyIGluIGluc3RydWN0aW9uIGJhc2VkIG1vZGUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiBUaGlzIHJvdXRpbmUgZXZhbHVhdGVzIG1vc3QgRGF0YSBQcm9jZXNzaW5nIHJlZ2lzdGVyIFJIUydzIHdpdGggdGhlIFMgICAgICoKKyogYml0IGNsZWFyLiAgSXQgaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gdGhlIG1hY3JvIERQUmVnUkhTLCB3aGljaCAgICAqCisqIGZpbHRlcnMgdGhlIGNvbW1vbiBjYXNlIG9mIGFuIHVuc2hpZnRlZCByZWdpc3RlciB3aXRoIGluIGxpbmUgY29kZSAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIEFSTXdvcmQgR2V0RFBSZWdSSFMoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIGluc3RyKQore0FSTXdvcmQgc2hhbXQgLCBiYXNlIDsKKworIGJhc2UgPSBSSFNSZWcgOworIGlmIChCSVQoNCkpIHsgLyogc2hpZnQgYW1vdW50IGluIGEgcmVnaXN0ZXIgKi8KKyAgICBVTkRFRl9TaGlmdCA7CisgICAgSU5DUEMgOworI2lmbmRlZiBNT0RFMzIKKyAgICBpZiAoYmFzZSA9PSAxNSkKKyAgICAgICBiYXNlID0gRUNDIHwgRVIxNUlOVCB8IFIxNVBDIHwgRU1PREUgOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgIGJhc2UgPSBzdGF0ZS0+UmVnW2Jhc2VdIDsKKyAgICBBUk11bF9JY3ljbGVzKHN0YXRlLDEsMEwpIDsKKyAgICBzaGFtdCA9IHN0YXRlLT5SZWdbQklUUyg4LDExKV0gJiAweGZmIDsKKyAgICBzd2l0Y2ggKChpbnQpQklUUyg1LDYpKSB7CisgICAgICAgY2FzZSBMU0wgOiBpZiAoc2hhbXQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybihiYXNlKSA7CisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaGFtdCA+PSAzMikKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybigwKSA7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4oYmFzZSA8PCBzaGFtdCkgOworICAgICAgIGNhc2UgTFNSIDogaWYgKHNoYW10ID09IDApCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4oYmFzZSkgOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2hhbXQgPj0gMzIpCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCkgOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGJhc2UgPj4gc2hhbXQpIDsKKyAgICAgICBjYXNlIEFTUiA6IGlmIChzaGFtdCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGJhc2UpIDsKKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNoYW10ID49IDMyKQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKChBUk13b3JkKSgobG9uZyBpbnQpYmFzZSA+PiAzMUwpKSA7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4oKEFSTXdvcmQpKChsb25nIGludCliYXNlID4+IChpbnQpc2hhbXQpKSA7CisgICAgICAgY2FzZSBST1IgOiBzaGFtdCAmPSAweDFmIDsKKyAgICAgICAgICAgICAgICAgIGlmIChzaGFtdCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGJhc2UpIDsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybigoYmFzZSA8PCAoMzIgLSBzaGFtdCkpIHwgKGJhc2UgPj4gc2hhbXQpKSA7CisgICAgICAgfQorICAgIH0KKyBlbHNlIHsgLyogc2hpZnQgYW1vdW50IGlzIGEgY29uc3RhbnQgKi8KKyNpZm5kZWYgTU9ERTMyCisgICAgaWYgKGJhc2UgPT0gMTUpCisgICAgICAgYmFzZSA9IEVDQyB8IEVSMTVJTlQgfCBSMTVQQyB8IEVNT0RFIDsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICBiYXNlID0gc3RhdGUtPlJlZ1tiYXNlXSA7CisgICAgc2hhbXQgPSBCSVRTKDcsMTEpIDsKKyAgICBzd2l0Y2ggKChpbnQpQklUUyg1LDYpKSB7CisgICAgICAgY2FzZSBMU0wgOiByZXR1cm4oYmFzZTw8c2hhbXQpIDsKKyAgICAgICBjYXNlIExTUiA6IGlmIChzaGFtdCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApIDsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybihiYXNlID4+IHNoYW10KSA7CisgICAgICAgY2FzZSBBU1IgOiBpZiAoc2hhbXQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybigoQVJNd29yZCkoKGxvbmcgaW50KWJhc2UgPj4gMzFMKSkgOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKChBUk13b3JkKSgobG9uZyBpbnQpYmFzZSA+PiAoaW50KXNoYW10KSkgOworICAgICAgIGNhc2UgUk9SIDogaWYgKHNoYW10PT0wKSAvKiBpdHMgYW4gUlJYICovCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4oKGJhc2UgPj4gMSkgfCAoQ0ZMQUcgPDwgMzEpKSA7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4oKGJhc2UgPDwgKDMyIC0gc2hhbXQpKSB8IChiYXNlID4+IHNoYW10KSkgOworICAgICAgIH0KKyAgICB9CisgcmV0dXJuKDApIDsgLyoganVzdCB0byBzaHV0IHVwIGxpbnQgKi8KKyB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiBUaGlzIHJvdXRpbmUgZXZhbHVhdGVzIG1vc3QgTG9naWNhbCBEYXRhIFByb2Nlc3NpbmcgcmVnaXN0ZXIgUkhTJ3MgICAgICAgICoKKyogd2l0aCB0aGUgUyBiaXQgc2V0LiAgSXQgaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gdGhlIG1hY3JvICAgICAgICAgICAqCisqIERQU1JlZ1JIUywgd2hpY2ggZmlsdGVycyB0aGUgY29tbW9uIGNhc2Ugb2YgYW4gdW5zaGlmdGVkIHJlZ2lzdGVyICAgICAgICAgKgorKiB3aXRoIGluIGxpbmUgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBBUk13b3JkIEdldERQU1JlZ1JIUyhBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgaW5zdHIpCit7QVJNd29yZCBzaGFtdCAsIGJhc2UgOworCisgYmFzZSA9IFJIU1JlZyA7CisgaWYgKEJJVCg0KSkgeyAvKiBzaGlmdCBhbW91bnQgaW4gYSByZWdpc3RlciAqLworICAgIFVOREVGX1NoaWZ0IDsKKyAgICBJTkNQQyA7CisjaWZuZGVmIE1PREUzMgorICAgIGlmIChiYXNlID09IDE1KQorICAgICAgIGJhc2UgPSBFQ0MgfCBFUjE1SU5UIHwgUjE1UEMgfCBFTU9ERSA7CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgYmFzZSA9IHN0YXRlLT5SZWdbYmFzZV0gOworICAgIEFSTXVsX0ljeWNsZXMoc3RhdGUsMSwwTCkgOworICAgIHNoYW10ID0gc3RhdGUtPlJlZ1tCSVRTKDgsMTEpXSAmIDB4ZmYgOworICAgIHN3aXRjaCAoKGludClCSVRTKDUsNikpIHsKKyAgICAgICBjYXNlIExTTCA6IGlmIChzaGFtdCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGJhc2UpIDsKKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNoYW10ID09IDMyKSB7CisgICAgICAgICAgICAgICAgICAgICBBU1NJR05DKGJhc2UgJiAxKSA7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCkgOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2hhbXQgPiAzMikgeworICAgICAgICAgICAgICAgICAgICAgQ0xFQVJDIDsKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybigwKSA7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIEFTU0lHTkMoKGJhc2UgPj4gKDMyLXNoYW10KSkgJiAxKSA7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4oYmFzZSA8PCBzaGFtdCkgOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgIGNhc2UgTFNSIDogaWYgKHNoYW10ID09IDApCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4oYmFzZSkgOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2hhbXQgPT0gMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgIEFTU0lHTkMoYmFzZSA+PiAzMSkgOworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApIDsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNoYW10ID4gMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgIENMRUFSQyA7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCkgOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICBBU1NJR05DKChiYXNlID4+IChzaGFtdCAtIDEpKSAmIDEpIDsKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybihiYXNlID4+IHNoYW10KSA7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgY2FzZSBBU1IgOiBpZiAoc2hhbXQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybihiYXNlKSA7CisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaGFtdCA+PSAzMikgeworICAgICAgICAgICAgICAgICAgICAgQVNTSUdOQyhiYXNlID4+IDMxTCkgOworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKChBUk13b3JkKSgobG9uZyBpbnQpYmFzZSA+PiAzMUwpKSA7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIEFTU0lHTkMoKEFSTXdvcmQpKChsb25nIGludCliYXNlID4+IChpbnQpKHNoYW10LTEpKSAmIDEpIDsKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybigoQVJNd29yZCkoKGxvbmcgaW50KWJhc2UgPj4gKGludClzaGFtdCkpIDsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICBjYXNlIFJPUiA6IGlmIChzaGFtdCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGJhc2UpIDsKKyAgICAgICAgICAgICAgICAgIHNoYW10ICY9IDB4MWYgOworICAgICAgICAgICAgICAgICAgaWYgKHNoYW10ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgIEFTU0lHTkMoYmFzZSA+PiAzMSkgOworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGJhc2UpIDsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgQVNTSUdOQygoYmFzZSA+PiAoc2hhbXQtMSkpICYgMSkgOworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKChiYXNlIDw8ICgzMi1zaGFtdCkpIHwgKGJhc2UgPj4gc2hhbXQpKSA7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgfQorICAgIH0KKyBlbHNlIHsgLyogc2hpZnQgYW1vdW50IGlzIGEgY29uc3RhbnQgKi8KKyNpZm5kZWYgTU9ERTMyCisgICAgaWYgKGJhc2UgPT0gMTUpCisgICAgICAgYmFzZSA9IEVDQyB8IEVSMTVJTlQgfCBSMTVQQyB8IEVNT0RFIDsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICBiYXNlID0gc3RhdGUtPlJlZ1tiYXNlXSA7CisgICAgc2hhbXQgPSBCSVRTKDcsMTEpIDsKKyAgICBzd2l0Y2ggKChpbnQpQklUUyg1LDYpKSB7CisgICAgICAgY2FzZSBMU0wgOiBBU1NJR05DKChiYXNlID4+ICgzMi1zaGFtdCkpICYgMSkgOworICAgICAgICAgICAgICAgICAgcmV0dXJuKGJhc2UgPDwgc2hhbXQpIDsKKyAgICAgICBjYXNlIExTUiA6IGlmIChzaGFtdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICBBU1NJR05DKGJhc2UgPj4gMzEpIDsKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybigwKSA7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIEFTU0lHTkMoKGJhc2UgPj4gKHNoYW10IC0gMSkpICYgMSkgOworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGJhc2UgPj4gc2hhbXQpIDsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICBjYXNlIEFTUiA6IGlmIChzaGFtdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICBBU1NJR05DKGJhc2UgPj4gMzFMKSA7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4oKEFSTXdvcmQpKChsb25nIGludCliYXNlID4+IDMxTCkpIDsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgQVNTSUdOQygoQVJNd29yZCkoKGxvbmcgaW50KWJhc2UgPj4gKGludCkoc2hhbXQtMSkpICYgMSkgOworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKChBUk13b3JkKSgobG9uZyBpbnQpYmFzZSA+PiAoaW50KXNoYW10KSkgOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgIGNhc2UgUk9SIDogaWYgKHNoYW10ID09IDApIHsgLyogaXRzIGFuIFJSWCAqLworICAgICAgICAgICAgICAgICAgICAgc2hhbXQgPSBDRkxBRyA7CisgICAgICAgICAgICAgICAgICAgICBBU1NJR05DKGJhc2UgJiAxKSA7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4oKGJhc2UgPj4gMSkgfCAoc2hhbXQgPDwgMzEpKSA7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIEFTU0lHTkMoKGJhc2UgPj4gKHNoYW10IC0gMSkpICYgMSkgOworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKChiYXNlIDw8ICgzMi1zaGFtdCkpIHwgKGJhc2UgPj4gc2hhbXQpKSA7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgfQorICAgIH0KKyByZXR1cm4oMCkgOyAvKiBqdXN0IHRvIHNodXQgdXAgbGludCAqLworIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhpcyByb3V0aW5lIGhhbmRsZXMgd3JpdGVzIHRvIHJlZ2lzdGVyIDE1IHdoZW4gdGhlIFMgYml0IGlzIG5vdCBzZXQuICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBXcml0ZVIxNShBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgc3JjKQoreworICAvKiBUaGUgQVJNIGRvY3VtZW50YXRpb24gaW1wbGllcyAoYnV0IGRvZSBzbm90IHN0YXRlKSB0aGF0IHRoZSBib3R0b20gYml0IG9mIHRoZSBQQyBpcyBuZXZlciBzZXQgKi8KKyNpZmRlZiBNT0RFMzIKKyBzdGF0ZS0+UmVnWzE1XSA9IHNyYyAmIFBDQklUUyAmIH4gMHgxIDsKKyNlbHNlCisgc3RhdGUtPlJlZ1sxNV0gPSAoc3JjICYgUjE1UENCSVRTICYgfiAweDEpIHwgRUNDIHwgRVIxNUlOVCB8IEVNT0RFIDsKKyBBUk11bF9SMTVBbHRlcmVkKHN0YXRlKSA7CisjZW5kaWYKKyBGTFVTSFBJUEUgOworIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhpcyByb3V0aW5lIGhhbmRsZXMgd3JpdGVzIHRvIHJlZ2lzdGVyIDE1IHdoZW4gdGhlIFMgYml0IGlzIHNldC4gICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBXcml0ZVNSMTUoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIHNyYykKK3sKKyNpZmRlZiBNT0RFMzIKKyBzdGF0ZS0+UmVnWzE1XSA9IHNyYyAmIFBDQklUUyA7CisgaWYgKHN0YXRlLT5CYW5rID4gMCkgeworICAgIHN0YXRlLT5DcHNyID0gc3RhdGUtPlNwc3Jbc3RhdGUtPkJhbmtdIDsKKyAgICBBUk11bF9DUFNSQWx0ZXJlZChzdGF0ZSkgOworICAgIH0KKyNlbHNlCisgaWYgKHN0YXRlLT5CYW5rID09IFVTRVJCQU5LKQorICAgIHN0YXRlLT5SZWdbMTVdID0gKHNyYyAmIChDQ0JJVFMgfCBSMTVQQ0JJVFMpKSB8IEVSMTVJTlQgfCBFTU9ERSA7CisgZWxzZQorICAgIHN0YXRlLT5SZWdbMTVdID0gc3JjIDsKKyBBUk11bF9SMTVBbHRlcmVkKHN0YXRlKSA7CisjZW5kaWYKKyBGTFVTSFBJUEUgOworIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhpcyByb3V0aW5lIGV2YWx1YXRlcyBtb3N0IExvYWQgYW5kIFN0b3JlIHJlZ2lzdGVyIFJIUydzLiAgSXQgaXMgICAgICAgICAqCisqIGludGVuZGVkIHRvIGJlIGNhbGxlZCBmcm9tIHRoZSBtYWNybyBMU1JlZ1JIUywgd2hpY2ggZmlsdGVycyB0aGUgICAgICAgICAgKgorKiBjb21tb24gY2FzZSBvZiBhbiB1bnNoaWZ0ZWQgcmVnaXN0ZXIgd2l0aCBpbiBsaW5lIGNvZGUgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBBUk13b3JkIEdldExTUmVnUkhTKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBpbnN0cikKK3tBUk13b3JkIHNoYW10LCBiYXNlIDsKKworIGJhc2UgPSBSSFNSZWcgOworI2lmbmRlZiBNT0RFMzIKKyBpZiAoYmFzZSA9PSAxNSkKKyAgICBiYXNlID0gRUNDIHwgRVIxNUlOVCB8IFIxNVBDIHwgRU1PREUgOyAvKiBOb3cgZm9yYmlkZGVuLCBidXQgLi4uLiAqLworIGVsc2UKKyNlbmRpZgorICAgIGJhc2UgPSBzdGF0ZS0+UmVnW2Jhc2VdIDsKKworIHNoYW10ID0gQklUUyg3LDExKSA7Cisgc3dpdGNoICgoaW50KUJJVFMoNSw2KSkgeworICAgIGNhc2UgTFNMIDogcmV0dXJuKGJhc2UgPDwgc2hhbXQpIDsKKyAgICBjYXNlIExTUiA6IGlmIChzaGFtdCA9PSAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuKDApIDsKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHJldHVybihiYXNlID4+IHNoYW10KSA7CisgICAgY2FzZSBBU1IgOiBpZiAoc2hhbXQgPT0gMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybigoQVJNd29yZCkoKGxvbmcgaW50KWJhc2UgPj4gMzFMKSkgOworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgcmV0dXJuKChBUk13b3JkKSgobG9uZyBpbnQpYmFzZSA+PiAoaW50KXNoYW10KSkgOworICAgIGNhc2UgUk9SIDogaWYgKHNoYW10PT0wKSAvKiBpdHMgYW4gUlJYICovCisgICAgICAgICAgICAgICAgICByZXR1cm4oKGJhc2UgPj4gMSkgfCAoQ0ZMQUcgPDwgMzEpKSA7CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICByZXR1cm4oKGJhc2UgPDwgKDMyLXNoYW10KSkgfCAoYmFzZSA+PiBzaGFtdCkpIDsKKyAgICB9CisgcmV0dXJuKDApIDsgLyoganVzdCB0byBzaHV0IHVwIGxpbnQgKi8KKyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIFRoaXMgcm91dGluZSBldmFsdWF0ZXMgdGhlIEFSTTdUIGhhbGZ3b3JkIGFuZCBzaWduZWQgdHJhbnNmZXIgUkhTJ3MuICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIEFSTXdvcmQgR2V0TFM3UkhTKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBpbnN0cikKK3sKKyBpZiAoQklUKDIyKSA9PSAwKSB7IC8qIHJlZ2lzdGVyICovCisjaWZuZGVmIE1PREUzMgorICAgIGlmIChSSFNSZWcgPT0gMTUpCisgICAgICByZXR1cm4gRUNDIHwgRVIxNUlOVCB8IFIxNVBDIHwgRU1PREUgOyAvKiBOb3cgZm9yYmlkZGVuLCBidXQgLi4uICovCisjZW5kaWYKKyAgICByZXR1cm4gc3RhdGUtPlJlZ1tSSFNSZWddIDsKKyAgICB9CisKKyAvKiBlbHNlIGltbWVkaWF0ZSAqLworIHJldHVybiBCSVRTKDAsMykgfCAoQklUUyg4LDExKSA8PCA0KSA7CisgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHdvcmsgb2YgbG9hZGluZyBhIHdvcmQgZm9yIGEgTERSIGluc3RydWN0aW9uLiAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1bnNpZ25lZCBMb2FkV29yZChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgYWRkcmVzcykKK3sKKyBBUk13b3JkIGRlc3QgOworCisgQlVTVVNFRElOQ1BDUyA7CisjaWZuZGVmIE1PREUzMgorIGlmIChBRERSRVhDRVBUKGFkZHJlc3MpKSB7CisgICAgSU5URVJOQUxBQk9SVChhZGRyZXNzKSA7CisgICAgfQorI2VuZGlmCisgZGVzdCA9IEFSTXVsX0xvYWRXb3JkTihzdGF0ZSxhZGRyZXNzKSA7CisgaWYgKHN0YXRlLT5BYm9ydGVkKSB7CisgICAgVEFLRUFCT1JUIDsKKyAgICByZXR1cm4oc3RhdGUtPmxhdGVhYnRTaWcpIDsKKyAgICB9CisgaWYgKGFkZHJlc3MgJiAzKQorICAgIGRlc3QgPSBBUk11bF9BbGlnbihzdGF0ZSxhZGRyZXNzLGRlc3QpIDsKKyBXUklURURFU1QoZGVzdCkgOworIEFSTXVsX0ljeWNsZXMoc3RhdGUsMSwwTCkgOworCisgcmV0dXJuKERFU1RSZWcgIT0gTEhTUmVnKSA7Cit9CisKKyNpZmRlZiBNT0RFVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSB3b3JrIG9mIGxvYWRpbmcgYSBoYWxmd29yZC4gICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdW5zaWduZWQgTG9hZEhhbGZXb3JkKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCBhZGRyZXNzLGludCBzaWduZXh0ZW5kKQoreworIEFSTXdvcmQgZGVzdCA7CisKKyBCVVNVU0VESU5DUENTIDsKKyNpZm5kZWYgTU9ERTMyCisgaWYgKEFERFJFWENFUFQoYWRkcmVzcykpIHsKKyAgICBJTlRFUk5BTEFCT1JUKGFkZHJlc3MpIDsKKyAgICB9CisjZW5kaWYKKyBkZXN0ID0gQVJNdWxfTG9hZEhhbGZXb3JkKHN0YXRlLGFkZHJlc3MpIDsKKyBpZiAoc3RhdGUtPkFib3J0ZWQpIHsKKyAgICBUQUtFQUJPUlQgOworICAgIHJldHVybihzdGF0ZS0+bGF0ZWFidFNpZykgOworICAgIH0KKyBVTkRFRl9MU1JCUEMgOworIGlmIChzaWduZXh0ZW5kKQorICAgeworICAgICBpZiAoZGVzdCAmIDEgPDwgKDE2IC0gMSkpCisgICAgICAgICBkZXN0ID0gKGRlc3QgJiAoKDEgPDwgMTYpIC0gMSkpIC0gKDEgPDwgMTYpIDsKKyAgIH0KKyBXUklURURFU1QoZGVzdCkgOworIEFSTXVsX0ljeWNsZXMoc3RhdGUsMSwwTCkgOworIHJldHVybihERVNUUmVnICE9IExIU1JlZykgOworfQorI2VuZGlmIC8qIE1PREVUICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgd29yayBvZiBsb2FkaW5nIGEgYnl0ZSBmb3IgYSBMRFJCIGluc3RydWN0aW9uLiAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHVuc2lnbmVkIExvYWRCeXRlKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBpbnN0ciwgQVJNd29yZCBhZGRyZXNzLGludCBzaWduZXh0ZW5kKQoreworIEFSTXdvcmQgZGVzdCA7CisKKyBCVVNVU0VESU5DUENTIDsKKyNpZm5kZWYgTU9ERTMyCisgaWYgKEFERFJFWENFUFQoYWRkcmVzcykpIHsKKyAgICBJTlRFUk5BTEFCT1JUKGFkZHJlc3MpIDsKKyAgICB9CisjZW5kaWYKKyBkZXN0ID0gQVJNdWxfTG9hZEJ5dGUoc3RhdGUsYWRkcmVzcykgOworIGlmIChzdGF0ZS0+QWJvcnRlZCkgeworICAgIFRBS0VBQk9SVCA7CisgICAgcmV0dXJuKHN0YXRlLT5sYXRlYWJ0U2lnKSA7CisgICAgfQorIFVOREVGX0xTUkJQQyA7CisgaWYgKHNpZ25leHRlbmQpCisgICB7CisgICAgIGlmIChkZXN0ICYgMSA8PCAoOCAtIDEpKQorICAgICAgICAgZGVzdCA9IChkZXN0ICYgKCgxIDw8IDgpIC0gMSkpIC0gKDEgPDwgOCkgOworICAgfQorIFdSSVRFREVTVChkZXN0KSA7CisgQVJNdWxfSWN5Y2xlcyhzdGF0ZSwxLDBMKSA7CisgcmV0dXJuKERFU1RSZWcgIT0gTEhTUmVnKSA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgd29yayBvZiBzdG9yaW5nIGEgd29yZCBmcm9tIGEgU1RSIGluc3RydWN0aW9uLiAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHVuc2lnbmVkIFN0b3JlV29yZChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgYWRkcmVzcykKK3tCVVNVU0VESU5DUENOIDsKKyNpZm5kZWYgTU9ERTMyCisgaWYgKERFU1RSZWcgPT0gMTUpCisgICAgc3RhdGUtPlJlZ1sxNV0gPSBFQ0MgfCBFUjE1SU5UIHwgUjE1UEMgfCBFTU9ERSA7CisjZW5kaWYKKyNpZmRlZiBNT0RFMzIKKyBBUk11bF9TdG9yZVdvcmROKHN0YXRlLGFkZHJlc3MsREVTVCkgOworI2Vsc2UKKyBpZiAoVkVDVE9SQUNDRVNTKGFkZHJlc3MpIHx8IEFERFJFWENFUFQoYWRkcmVzcykpIHsKKyAgICBJTlRFUk5BTEFCT1JUKGFkZHJlc3MpIDsKKyAgICAodm9pZClBUk11bF9Mb2FkV29yZE4oc3RhdGUsYWRkcmVzcykgOworICAgIH0KKyBlbHNlCisgICAgQVJNdWxfU3RvcmVXb3JkTihzdGF0ZSxhZGRyZXNzLERFU1QpIDsKKyNlbmRpZgorIGlmIChzdGF0ZS0+QWJvcnRlZCkgeworICAgIFRBS0VBQk9SVCA7CisgICAgcmV0dXJuKHN0YXRlLT5sYXRlYWJ0U2lnKSA7CisgICAgfQorIHJldHVybihUUlVFKSA7Cit9CisKKyNpZmRlZiBNT0RFVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSB3b3JrIG9mIHN0b3JpbmcgYSBieXRlIGZvciBhIFNUUkggaW5zdHJ1Y3Rpb24uICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdW5zaWduZWQgU3RvcmVIYWxmV29yZChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgYWRkcmVzcykKK3tCVVNVU0VESU5DUENOIDsKKworI2lmbmRlZiBNT0RFMzIKKyBpZiAoREVTVFJlZyA9PSAxNSkKKyAgICBzdGF0ZS0+UmVnWzE1XSA9IEVDQyB8IEVSMTVJTlQgfCBSMTVQQyB8IEVNT0RFIDsKKyNlbmRpZgorCisjaWZkZWYgTU9ERTMyCisgQVJNdWxfU3RvcmVIYWxmV29yZChzdGF0ZSxhZGRyZXNzLERFU1QpOworI2Vsc2UKKyBpZiAoVkVDVE9SQUNDRVNTKGFkZHJlc3MpIHx8IEFERFJFWENFUFQoYWRkcmVzcykpIHsKKyAgICBJTlRFUk5BTEFCT1JUKGFkZHJlc3MpIDsKKyAgICAodm9pZClBUk11bF9Mb2FkSGFsZldvcmQoc3RhdGUsYWRkcmVzcykgOworICAgIH0KKyBlbHNlCisgICAgQVJNdWxfU3RvcmVIYWxmV29yZChzdGF0ZSxhZGRyZXNzLERFU1QpIDsKKyNlbmRpZgorCisgaWYgKHN0YXRlLT5BYm9ydGVkKSB7CisgICAgVEFLRUFCT1JUIDsKKyAgICByZXR1cm4oc3RhdGUtPmxhdGVhYnRTaWcpIDsKKyAgICB9CisKKyByZXR1cm4oVFJVRSkgOworfQorI2VuZGlmIC8qIE1PREVUICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgd29yayBvZiBzdG9yaW5nIGEgYnl0ZSBmb3IgYSBTVFJCIGluc3RydWN0aW9uLiAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHVuc2lnbmVkIFN0b3JlQnl0ZShBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgYWRkcmVzcykKK3tCVVNVU0VESU5DUENOIDsKKyNpZm5kZWYgTU9ERTMyCisgaWYgKERFU1RSZWcgPT0gMTUpCisgICAgc3RhdGUtPlJlZ1sxNV0gPSBFQ0MgfCBFUjE1SU5UIHwgUjE1UEMgfCBFTU9ERSA7CisjZW5kaWYKKyNpZmRlZiBNT0RFMzIKKyBBUk11bF9TdG9yZUJ5dGUoc3RhdGUsYWRkcmVzcyxERVNUKSA7CisjZWxzZQorIGlmIChWRUNUT1JBQ0NFU1MoYWRkcmVzcykgfHwgQUREUkVYQ0VQVChhZGRyZXNzKSkgeworICAgIElOVEVSTkFMQUJPUlQoYWRkcmVzcykgOworICAgICh2b2lkKUFSTXVsX0xvYWRCeXRlKHN0YXRlLGFkZHJlc3MpIDsKKyAgICB9CisgZWxzZQorICAgIEFSTXVsX1N0b3JlQnl0ZShzdGF0ZSxhZGRyZXNzLERFU1QpIDsKKyNlbmRpZgorIGlmIChzdGF0ZS0+QWJvcnRlZCkgeworICAgIFRBS0VBQk9SVCA7CisgICAgcmV0dXJuKHN0YXRlLT5sYXRlYWJ0U2lnKSA7CisgICAgfQorIFVOREVGX0xTUkJQQyA7CisgcmV0dXJuKFRSVUUpIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSB3b3JrIG9mIGxvYWRpbmcgdGhlIHJlZ2lzdGVycyBsaXN0ZWQgaW4gYW4gTERNICAgICAqCisqIGluc3RydWN0aW9uLCB3aGVuIHRoZSBTIGJpdCBpcyBjbGVhci4gIFRoZSBjb2RlIGhlcmUgaXMgYWx3YXlzIGluY3JlbWVudCAgKgorKiBhZnRlciwgaXQncyB1cCB0byB0aGUgY2FsbGVyIHRvIGdldCB0aGUgaW5wdXQgYWRkcmVzcyBjb3JyZWN0IGFuZCB0byAgICAgICoKKyogaGFuZGxlIGJhc2UgcmVnaXN0ZXIgbW9kaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBMb2FkTXVsdChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgaW5zdHIsCisgICAgICAgICAgICAgICAgICAgICBBUk13b3JkIGFkZHJlc3MsIEFSTXdvcmQgV0JCYXNlKQore0FSTXdvcmQgZGVzdCwgdGVtcCA7CisKKyBVTkRFRl9MU01Ob1JlZ3MgOworIFVOREVGX0xTTVBDQmFzZSA7CisgVU5ERUZfTFNNQmFzZUluTGlzdFdiIDsKKyBCVVNVU0VESU5DUENTIDsKKyNpZm5kZWYgTU9ERTMyCisgaWYgKEFERFJFWENFUFQoYWRkcmVzcykpIHsKKyAgICBJTlRFUk5BTEFCT1JUKGFkZHJlc3MpIDsKKyAgICB9CisjZW5kaWYKKyBpZiAoQklUKDIxKSAmJiBMSFNSZWcgIT0gMTUpCisgICAgTFNCYXNlID0gV0JCYXNlIDsKKworICAgIGZvciAodGVtcCA9IDAgOyAhQklUKHRlbXApIDsgdGVtcCsrKSA7IC8qIE4gY3ljbGUgZmlyc3QgKi8KKyAgICBkZXN0ID0gQVJNdWxfTG9hZFdvcmROKHN0YXRlLGFkZHJlc3MpIDsKKyAgICBpZiAoIXN0YXRlLT5hYm9ydFNpZyAmJiAhc3RhdGUtPkFib3J0ZWQpCisgICAgICAgc3RhdGUtPlJlZ1t0ZW1wKytdID0gZGVzdCA7CisgICAgZWxzZQorICAgICAgIGlmICghc3RhdGUtPkFib3J0ZWQpCisgICAgICAgICAgc3RhdGUtPkFib3J0ZWQgPSBBUk11bF9EYXRhQWJvcnRWIDsKKworICAgIGZvciAoOyB0ZW1wIDwgMTYgOyB0ZW1wKyspIC8qIFMgY3ljbGVzIGZyb20gaGVyZSBvbiAqLworICAgICAgIGlmIChCSVQodGVtcCkpIHsgLyogbG9hZCB0aGlzIHJlZ2lzdGVyICovCisgICAgICAgICAgYWRkcmVzcyArPSA0IDsKKyAgICAgICAgICBkZXN0ID0gQVJNdWxfTG9hZFdvcmRTKHN0YXRlLGFkZHJlc3MpIDsKKyAgICAgICAgICBpZiAoIXN0YXRlLT5hYm9ydFNpZyAmJiAhc3RhdGUtPkFib3J0ZWQpCisgICAgICAgICAgICAgc3RhdGUtPlJlZ1t0ZW1wXSA9IGRlc3QgOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBpZiAoIXN0YXRlLT5BYm9ydGVkKQorICAgICAgICAgICAgICAgIHN0YXRlLT5BYm9ydGVkID0gQVJNdWxfRGF0YUFib3J0ViA7CisgICAgICAgICAgfQorCisgaWYgKEJJVCgxNSkpIHsgLyogUEMgaXMgaW4gdGhlIHJlZyBsaXN0ICovCisjaWZkZWYgTU9ERTMyCisgICAgc3RhdGUtPlJlZ1sxNV0gPSBQQyA7CisjZW5kaWYKKyAgICBGTFVTSFBJUEUgOworICAgIH0KKworIEFSTXVsX0ljeWNsZXMoc3RhdGUsMSwwTCkgOyAvKiB0byB3cml0ZSBiYWNrIHRoZSBmaW5hbCByZWdpc3RlciAqLworCisgaWYgKHN0YXRlLT5BYm9ydGVkKSB7CisgICAgaWYgKEJJVCgyMSkgJiYgTEhTUmVnICE9IDE1KQorICAgICAgIExTQmFzZSA9IFdCQmFzZSA7CisgICAgVEFLRUFCT1JUIDsKKyAgICB9CisgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHdvcmsgb2YgbG9hZGluZyB0aGUgcmVnaXN0ZXJzIGxpc3RlZCBpbiBhbiBMRE0gICAgICoKKyogaW5zdHJ1Y3Rpb24sIHdoZW4gdGhlIFMgYml0IGlzIHNldC4gVGhlIGNvZGUgaGVyZSBpcyBhbHdheXMgaW5jcmVtZW50ICAgICAqCisqIGFmdGVyLCBpdCdzIHVwIHRvIHRoZSBjYWxsZXIgdG8gZ2V0IHRoZSBpbnB1dCBhZGRyZXNzIGNvcnJlY3QgYW5kIHRvICAgICAgKgorKiBoYW5kbGUgYmFzZSByZWdpc3RlciBtb2RpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIExvYWRTTXVsdChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgaW5zdHIsCisgICAgICAgICAgICAgICAgICAgICAgQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIFdCQmFzZSkKK3tBUk13b3JkIGRlc3QsIHRlbXAgOworCisgVU5ERUZfTFNNTm9SZWdzIDsKKyBVTkRFRl9MU01QQ0Jhc2UgOworIFVOREVGX0xTTUJhc2VJbkxpc3RXYiA7CisgQlVTVVNFRElOQ1BDUyA7CisjaWZuZGVmIE1PREUzMgorIGlmIChBRERSRVhDRVBUKGFkZHJlc3MpKSB7CisgICAgSU5URVJOQUxBQk9SVChhZGRyZXNzKSA7CisgICAgfQorI2VuZGlmCisKKyBpZiAoIUJJVCgxNSkgJiYgc3RhdGUtPkJhbmsgIT0gVVNFUkJBTkspIHsKKyAgICAodm9pZClBUk11bF9Td2l0Y2hNb2RlKHN0YXRlLHN0YXRlLT5Nb2RlLFVTRVIyNk1PREUpIDsgLyogdGVtcG9yYXJ5IHJlZyBiYW5rIHN3aXRjaCAqLworICAgIFVOREVGX0xTTVVzZXJCYW5rV2IgOworICAgIH0KKworIGlmIChCSVQoMjEpICYmIExIU1JlZyAhPSAxNSkKKyAgICBMU0Jhc2UgPSBXQkJhc2UgOworCisgICAgZm9yICh0ZW1wID0gMCA7ICFCSVQodGVtcCkgOyB0ZW1wKyspIDsgLyogTiBjeWNsZSBmaXJzdCAqLworICAgIGRlc3QgPSBBUk11bF9Mb2FkV29yZE4oc3RhdGUsYWRkcmVzcykgOworICAgIGlmICghc3RhdGUtPmFib3J0U2lnKQorICAgICAgIHN0YXRlLT5SZWdbdGVtcCsrXSA9IGRlc3QgOworICAgIGVsc2UKKyAgICAgICBpZiAoIXN0YXRlLT5BYm9ydGVkKQorICAgICAgICAgIHN0YXRlLT5BYm9ydGVkID0gQVJNdWxfRGF0YUFib3J0ViA7CisKKyAgICBmb3IgKDsgdGVtcCA8IDE2IDsgdGVtcCsrKSAvKiBTIGN5Y2xlcyBmcm9tIGhlcmUgb24gKi8KKyAgICAgICBpZiAoQklUKHRlbXApKSB7IC8qIGxvYWQgdGhpcyByZWdpc3RlciAqLworICAgICAgICAgIGFkZHJlc3MgKz0gNCA7CisgICAgICAgICAgZGVzdCA9IEFSTXVsX0xvYWRXb3JkUyhzdGF0ZSxhZGRyZXNzKSA7CisgICAgICAgICAgaWYgKCFzdGF0ZS0+YWJvcnRTaWcgfHwgc3RhdGUtPkFib3J0ZWQpCisgICAgICAgICAgICAgc3RhdGUtPlJlZ1t0ZW1wXSA9IGRlc3QgOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBpZiAoIXN0YXRlLT5BYm9ydGVkKQorICAgICAgICAgICAgICAgIHN0YXRlLT5BYm9ydGVkID0gQVJNdWxfRGF0YUFib3J0ViA7CisgICAgICAgICAgfQorCisgaWYgKEJJVCgxNSkpIHsgLyogUEMgaXMgaW4gdGhlIHJlZyBsaXN0ICovCisjaWZkZWYgTU9ERTMyCisgICAgaWYgKHN0YXRlLT5Nb2RlICE9IFVTRVIyNk1PREUgJiYgc3RhdGUtPk1vZGUgIT0gVVNFUjMyTU9ERSkgeworICAgICAgIHN0YXRlLT5DcHNyID0gR0VUU1BTUihzdGF0ZS0+QmFuaykgOworICAgICAgIEFSTXVsX0NQU1JBbHRlcmVkKHN0YXRlKSA7CisgICAgICAgfQorICAgIHN0YXRlLT5SZWdbMTVdID0gUEMgOworI2Vsc2UKKyAgICBpZiAoc3RhdGUtPk1vZGUgPT0gVVNFUjI2TU9ERSB8fCBzdGF0ZS0+TW9kZSA9PSBVU0VSMzJNT0RFKSB7IC8qIHByb3RlY3QgYml0cyBpbiB1c2VyIG1vZGUgKi8KKyAgICAgICBBU1NJR05OKChzdGF0ZS0+UmVnWzE1XSAmIE5CSVQpICE9IDApIDsKKyAgICAgICBBU1NJR05aKChzdGF0ZS0+UmVnWzE1XSAmIFpCSVQpICE9IDApIDsKKyAgICAgICBBU1NJR05DKChzdGF0ZS0+UmVnWzE1XSAmIENCSVQpICE9IDApIDsKKyAgICAgICBBU1NJR05WKChzdGF0ZS0+UmVnWzE1XSAmIFZCSVQpICE9IDApIDsKKyAgICAgICB9CisgICAgZWxzZQorICAgICAgIEFSTXVsX1IxNUFsdGVyZWQoc3RhdGUpIDsKKyNlbmRpZgorICAgIEZMVVNIUElQRSA7CisgICAgfQorCisgaWYgKCFCSVQoMTUpICYmIHN0YXRlLT5Nb2RlICE9IFVTRVIyNk1PREUgJiYgc3RhdGUtPk1vZGUgIT0gVVNFUjMyTU9ERSkKKyAgICAodm9pZClBUk11bF9Td2l0Y2hNb2RlKHN0YXRlLFVTRVIyNk1PREUsc3RhdGUtPk1vZGUpIDsgLyogcmVzdG9yZSB0aGUgY29ycmVjdCBiYW5rICovCisKKyBBUk11bF9JY3ljbGVzKHN0YXRlLDEsMEwpIDsgLyogdG8gd3JpdGUgYmFjayB0aGUgZmluYWwgcmVnaXN0ZXIgKi8KKworIGlmIChzdGF0ZS0+QWJvcnRlZCkgeworICAgIGlmIChCSVQoMjEpICYmIExIU1JlZyAhPSAxNSkKKyAgICAgICBMU0Jhc2UgPSBXQkJhc2UgOworICAgIFRBS0VBQk9SVCA7CisgICAgfQorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgd29yayBvZiBzdG9yaW5nIHRoZSByZWdpc3RlcnMgbGlzdGVkIGluIGFuIFNUTSAgICAgKgorKiBpbnN0cnVjdGlvbiwgd2hlbiB0aGUgUyBiaXQgaXMgY2xlYXIuICBUaGUgY29kZSBoZXJlIGlzIGFsd2F5cyBpbmNyZW1lbnQgICoKKyogYWZ0ZXIsIGl0J3MgdXAgdG8gdGhlIGNhbGxlciB0byBnZXQgdGhlIGlucHV0IGFkZHJlc3MgY29ycmVjdCBhbmQgdG8gICAgICAqCisqIGhhbmRsZSBiYXNlIHJlZ2lzdGVyIG1vZGlmaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgU3RvcmVNdWx0KEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBpbnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBBUk13b3JkIGFkZHJlc3MsIEFSTXdvcmQgV0JCYXNlKQore0FSTXdvcmQgdGVtcCA7CisKKyBVTkRFRl9MU01Ob1JlZ3MgOworIFVOREVGX0xTTVBDQmFzZSA7CisgVU5ERUZfTFNNQmFzZUluTGlzdFdiIDsKKyBpZiAoIVRGTEFHKSB7CisgICBCVVNVU0VESU5DUENOIDsgLyogTi1jeWNsZSwgaW5jcmVtZW50IHRoZSBQQyBhbmQgdXBkYXRlIHRoZSBOZXh0SW5zdHIgc3RhdGUgKi8KKyB9CisKKyNpZm5kZWYgTU9ERTMyCisgaWYgKFZFQ1RPUkFDQ0VTUyhhZGRyZXNzKSB8fCBBRERSRVhDRVBUKGFkZHJlc3MpKSB7CisgICAgSU5URVJOQUxBQk9SVChhZGRyZXNzKSA7CisgICAgfQorIGlmIChCSVQoMTUpKQorICAgIFBBVENIUjE1IDsKKyNlbmRpZgorCisgZm9yICh0ZW1wID0gMCA7ICFCSVQodGVtcCkgOyB0ZW1wKyspIDsgLyogTiBjeWNsZSBmaXJzdCAqLworI2lmZGVmIE1PREUzMgorIEFSTXVsX1N0b3JlV29yZE4oc3RhdGUsYWRkcmVzcyxzdGF0ZS0+UmVnW3RlbXArK10pIDsKKyNlbHNlCisgaWYgKHN0YXRlLT5BYm9ydGVkKSB7CisgICAgKHZvaWQpQVJNdWxfTG9hZFdvcmROKHN0YXRlLGFkZHJlc3MpIDsKKyAgICBmb3IgKCA7IHRlbXAgPCAxNiA7IHRlbXArKykgLyogRmFrZSB0aGUgU3RvcmVzIGFzIExvYWRzICovCisgICAgICAgaWYgKEJJVCh0ZW1wKSkgeyAvKiBzYXZlIHRoaXMgcmVnaXN0ZXIgKi8KKyAgICAgICAgICBhZGRyZXNzICs9IDQgOworICAgICAgICAgICh2b2lkKUFSTXVsX0xvYWRXb3JkUyhzdGF0ZSxhZGRyZXNzKSA7CisgICAgICAgICAgfQorICAgIGlmIChCSVQoMjEpICYmIExIU1JlZyAhPSAxNSkKKyAgICAgICBMU0Jhc2UgPSBXQkJhc2UgOworICAgIFRBS0VBQk9SVCA7CisgICAgcmV0dXJuIDsKKyAgICB9CisgZWxzZQorICAgIEFSTXVsX1N0b3JlV29yZE4oc3RhdGUsYWRkcmVzcyxzdGF0ZS0+UmVnW3RlbXArK10pIDsKKyNlbmRpZgorIGlmIChzdGF0ZS0+YWJvcnRTaWcgJiYgIXN0YXRlLT5BYm9ydGVkKQorICAgIHN0YXRlLT5BYm9ydGVkID0gQVJNdWxfRGF0YUFib3J0ViA7CisKKyBpZiAoQklUKDIxKSAmJiBMSFNSZWcgIT0gMTUpCisgICAgTFNCYXNlID0gV0JCYXNlIDsKKworIGZvciAoIDsgdGVtcCA8IDE2IDsgdGVtcCsrKSAvKiBTIGN5Y2xlcyBmcm9tIGhlcmUgb24gKi8KKyAgICBpZiAoQklUKHRlbXApKSB7IC8qIHNhdmUgdGhpcyByZWdpc3RlciAqLworICAgICAgIGFkZHJlc3MgKz0gNCA7CisgICAgICAgQVJNdWxfU3RvcmVXb3JkUyhzdGF0ZSxhZGRyZXNzLHN0YXRlLT5SZWdbdGVtcF0pIDsKKyAgICAgICBpZiAoc3RhdGUtPmFib3J0U2lnICYmICFzdGF0ZS0+QWJvcnRlZCkKKyAgICAgICAgICAgICBzdGF0ZS0+QWJvcnRlZCA9IEFSTXVsX0RhdGFBYm9ydFYgOworICAgICAgIH0KKyAgICBpZiAoc3RhdGUtPkFib3J0ZWQpIHsKKyAgICAgICBUQUtFQUJPUlQgOworICAgICAgIH0KKyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgd29yayBvZiBzdG9yaW5nIHRoZSByZWdpc3RlcnMgbGlzdGVkIGluIGFuIFNUTSAgICAgKgorKiBpbnN0cnVjdGlvbiB3aGVuIHRoZSBTIGJpdCBpcyBzZXQuICBUaGUgY29kZSBoZXJlIGlzIGFsd2F5cyBpbmNyZW1lbnQgICAgICoKKyogYWZ0ZXIsIGl0J3MgdXAgdG8gdGhlIGNhbGxlciB0byBnZXQgdGhlIGlucHV0IGFkZHJlc3MgY29ycmVjdCBhbmQgdG8gICAgICAqCisqIGhhbmRsZSBiYXNlIHJlZ2lzdGVyIG1vZGlmaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgU3RvcmVTTXVsdChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgaW5zdHIsCisgICAgICAgICAgICAgICAgICAgICAgIEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBXQkJhc2UpCit7QVJNd29yZCB0ZW1wIDsKKworIFVOREVGX0xTTU5vUmVncyA7CisgVU5ERUZfTFNNUENCYXNlIDsKKyBVTkRFRl9MU01CYXNlSW5MaXN0V2IgOworIEJVU1VTRURJTkNQQ04gOworI2lmbmRlZiBNT0RFMzIKKyBpZiAoVkVDVE9SQUNDRVNTKGFkZHJlc3MpIHx8IEFERFJFWENFUFQoYWRkcmVzcykpIHsKKyAgICBJTlRFUk5BTEFCT1JUKGFkZHJlc3MpIDsKKyAgICB9CisgaWYgKEJJVCgxNSkpCisgICAgUEFUQ0hSMTUgOworI2VuZGlmCisKKyBpZiAoc3RhdGUtPkJhbmsgIT0gVVNFUkJBTkspIHsKKyAgICAodm9pZClBUk11bF9Td2l0Y2hNb2RlKHN0YXRlLHN0YXRlLT5Nb2RlLFVTRVIyNk1PREUpIDsgLyogRm9yY2UgVXNlciBCYW5rICovCisgICAgVU5ERUZfTFNNVXNlckJhbmtXYiA7CisgICAgfQorCisgZm9yICh0ZW1wID0gMCA7ICFCSVQodGVtcCkgOyB0ZW1wKyspIDsgLyogTiBjeWNsZSBmaXJzdCAqLworI2lmZGVmIE1PREUzMgorIEFSTXVsX1N0b3JlV29yZE4oc3RhdGUsYWRkcmVzcyxzdGF0ZS0+UmVnW3RlbXArK10pIDsKKyNlbHNlCisgaWYgKHN0YXRlLT5BYm9ydGVkKSB7CisgICAgKHZvaWQpQVJNdWxfTG9hZFdvcmROKHN0YXRlLGFkZHJlc3MpIDsKKyAgICBmb3IgKCA7IHRlbXAgPCAxNiA7IHRlbXArKykgLyogRmFrZSB0aGUgU3RvcmVzIGFzIExvYWRzICovCisgICAgICAgaWYgKEJJVCh0ZW1wKSkgeyAvKiBzYXZlIHRoaXMgcmVnaXN0ZXIgKi8KKyAgICAgICAgICBhZGRyZXNzICs9IDQgOworICAgICAgICAgICh2b2lkKUFSTXVsX0xvYWRXb3JkUyhzdGF0ZSxhZGRyZXNzKSA7CisgICAgICAgICAgfQorICAgIGlmIChCSVQoMjEpICYmIExIU1JlZyAhPSAxNSkKKyAgICAgICBMU0Jhc2UgPSBXQkJhc2UgOworICAgIFRBS0VBQk9SVCA7CisgICAgcmV0dXJuIDsKKyAgICB9CisgZWxzZQorICAgIEFSTXVsX1N0b3JlV29yZE4oc3RhdGUsYWRkcmVzcyxzdGF0ZS0+UmVnW3RlbXArK10pIDsKKyNlbmRpZgorIGlmIChzdGF0ZS0+YWJvcnRTaWcgJiYgIXN0YXRlLT5BYm9ydGVkKQorICAgIHN0YXRlLT5BYm9ydGVkID0gQVJNdWxfRGF0YUFib3J0ViA7CisKKyBpZiAoQklUKDIxKSAmJiBMSFNSZWcgIT0gMTUpCisgICAgTFNCYXNlID0gV0JCYXNlIDsKKworIGZvciAoOyB0ZW1wIDwgMTYgOyB0ZW1wKyspIC8qIFMgY3ljbGVzIGZyb20gaGVyZSBvbiAqLworICAgIGlmIChCSVQodGVtcCkpIHsgLyogc2F2ZSB0aGlzIHJlZ2lzdGVyICovCisgICAgICAgYWRkcmVzcyArPSA0IDsKKyAgICAgICBBUk11bF9TdG9yZVdvcmRTKHN0YXRlLGFkZHJlc3Msc3RhdGUtPlJlZ1t0ZW1wXSkgOworICAgICAgIGlmIChzdGF0ZS0+YWJvcnRTaWcgJiYgIXN0YXRlLT5BYm9ydGVkKQorICAgICAgICAgICAgIHN0YXRlLT5BYm9ydGVkID0gQVJNdWxfRGF0YUFib3J0ViA7CisgICAgICAgfQorCisgaWYgKHN0YXRlLT5Nb2RlICE9IFVTRVIyNk1PREUgJiYgc3RhdGUtPk1vZGUgIT0gVVNFUjMyTU9ERSkKKyAgICAodm9pZClBUk11bF9Td2l0Y2hNb2RlKHN0YXRlLFVTRVIyNk1PREUsc3RhdGUtPk1vZGUpIDsgLyogcmVzdG9yZSB0aGUgY29ycmVjdCBiYW5rICovCisKKyBpZiAoc3RhdGUtPkFib3J0ZWQpIHsKKyAgICBUQUtFQUJPUlQgOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSB3b3JrIG9mIGFkZGluZyB0d28gMzJiaXQgdmFsdWVzIHRvZ2V0aGVyLCBhbmQgICAgICAqCisqIGNhbGN1bGF0aW5nIGlmIGEgY2FycnkgaGFzIG9jY3VycmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIEFSTXdvcmQgQWRkMzIoQVJNd29yZCBhMSxBUk13b3JkIGEyLGludCAqY2FycnkpCit7CisgIEFSTXdvcmQgcmVzdWx0ID0gKGExICsgYTIpOworICB1bnNpZ25lZCBpbnQgdXJlc3VsdCA9ICh1bnNpZ25lZCBpbnQpcmVzdWx0OworICB1bnNpZ25lZCBpbnQgdWExID0gKHVuc2lnbmVkIGludClhMTsKKworICAvKiBJZiAocmVzdWx0ID09IFJkTG8pIGFuZCAoc3RhdGUtPlJlZ1tuUmRMb10gPT0gMCksCisgICAgIG9yIChyZXN1bHQgPiBSZExvKSB0aGVuIHdlIGhhdmUgbm8gY2Fycnk6ICovCisgIGlmICgodXJlc3VsdCA9PSB1YTEpID8gKGEyICE9IDApIDogKHVyZXN1bHQgPCB1YTEpKQorICAgKmNhcnJ5ID0gMTsKKyAgZWxzZQorICAgKmNhcnJ5ID0gMDsKKworICByZXR1cm4ocmVzdWx0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSB3b3JrIG9mIG11bHRpcGx5aW5nIHR3byAzMmJpdCB2YWx1ZXMgdG8gZ2l2ZSBhICAgICAqCisqIDY0Yml0IHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHVuc2lnbmVkIE11bHRpcGx5NjQoQVJNdWxfU3RhdGUgKnN0YXRlLEFSTXdvcmQgaW5zdHIsaW50IG1zaWduZWQsaW50IHNjYykKK3sKKyAgaW50IG5SZEhpLCBuUmRMbywgblJzLCBuUm07IC8qIG9wZXJhbmQgcmVnaXN0ZXIgbnVtYmVycyAqLworICBBUk13b3JkIFJkSGksIFJkTG8sIFJtOworICBpbnQgc2NvdW50OyAvKiBjeWNsZSBjb3VudCAqLworCisgIG5SZEhpID0gQklUUygxNiwxOSk7CisgIG5SZExvID0gQklUUygxMiwxNSk7CisgIG5ScyA9IEJJVFMoOCwxMSk7CisgIG5SbSA9IEJJVFMoMCwzKTsKKworICAvKiBOZWVkZWQgdG8gY2FsY3VsYXRlIHRoZSBjeWNsZSBjb3VudDogKi8KKyAgUm0gPSBzdGF0ZS0+UmVnW25SbV07CisKKyAgLyogQ2hlY2sgZm9yIGlsbGVnYWwgb3BlcmFuZCBjb21iaW5hdGlvbnMgZmlyc3Q6ICovCisgIGlmICggICBuUmRIaSAhPSAxNQorICAgICAgJiYgblJkTG8gIT0gMTUKKyAgICAgICYmIG5ScyAgICE9IDE1CisgICAgICAmJiBuUm0gICAhPSAxNQorICAgICAgJiYgblJkSGkgIT0gblJkTG8KKyAgICAgICYmIG5SZEhpICE9IG5SbQorICAgICAgJiYgblJkTG8gIT0gblJtKQorICAgIHsKKyAgICAgIEFSTXdvcmQgbG8sIG1pZDEsIG1pZDIsIGhpOyAvKiBpbnRlcm1lZGlhdGUgcmVzdWx0cyAqLworICAgICAgaW50IGNhcnJ5OworICAgICAgQVJNd29yZCBScyA9IHN0YXRlLT5SZWdbIG5ScyBdOworICAgICAgaW50IHNpZ24gPSAwOworCisgICAgICBpZiAobXNpZ25lZCkKKwl7CisJICAvKiBDb21wdXRlIHNpZ24gb2YgcmVzdWx0IGFuZCBhZGp1c3Qgb3BlcmFuZHMgaWYgbmVjZXNzYXJ5LiAgKi8KKwkgIAorCSAgc2lnbiA9IChSbSBeIFJzKSAmIDB4ODAwMDAwMDA7CisJICAKKwkgIGlmICgoKHNpZ25lZCBsb25nKVJtKSA8IDApCisJICAgIFJtID0gLVJtOworCSAgCisJICBpZiAoKChzaWduZWQgbG9uZylScykgPCAwKQorCSAgICBScyA9IC1SczsKKwl9CisgICAgICAKKyAgICAgIC8qIFdlIGNhbiBzcGxpdCB0aGUgMzJ4MzIgaW50byBmb3VyIDE2eDE2IG9wZXJhdGlvbnMuIFRoaXMgZW5zdXJlcworCSB0aGF0IHdlIGRvIG5vdCBsb3NlIHByZWNpc2lvbiBvbiAzMmJpdCBvbmx5IGhvc3RzOiAqLworICAgICAgbG8gPSAgICgoUnMgJiAweEZGRkYpICogKFJtICYgMHhGRkZGKSk7CisgICAgICBtaWQxID0gKChScyAmIDB4RkZGRikgKiAoKFJtID4+IDE2KSAmIDB4RkZGRikpOworICAgICAgbWlkMiA9ICgoKFJzID4+IDE2KSAmIDB4RkZGRikgKiAoUm0gJiAweEZGRkYpKTsKKyAgICAgIGhpID0gICAoKChScyA+PiAxNikgJiAweEZGRkYpICogKChSbSA+PiAxNikgJiAweEZGRkYpKTsKKyAgICAgIAorICAgICAgLyogV2Ugbm93IG5lZWQgdG8gYWRkIGFsbCBvZiB0aGVzZSByZXN1bHRzIHRvZ2V0aGVyLCB0YWtpbmcgY2FyZQorCSB0byBwcm9wb2dhdGUgdGhlIGNhcnJpZXMgZnJvbSB0aGUgYWRkaXRpb25zOiAqLworICAgICAgUmRMbyA9IEFkZDMyKGxvLChtaWQxIDw8IDE2KSwmY2FycnkpOworICAgICAgUmRIaSA9IGNhcnJ5OworICAgICAgUmRMbyA9IEFkZDMyKFJkTG8sKG1pZDIgPDwgMTYpLCZjYXJyeSk7CisgICAgICBSZEhpICs9IChjYXJyeSArICgobWlkMSA+PiAxNikgJiAweEZGRkYpICsgKChtaWQyID4+IDE2KSAmIDB4RkZGRikgKyBoaSk7CisKKyAgICAgIGlmIChzaWduKQorCXsKKwkgIC8qIE5lZ2F0ZSByZXN1bHQgaWYgbmVjZXNzYXJ5LiAgKi8KKwkgIAorCSAgUmRMbyA9IH4gUmRMbzsKKwkgIFJkSGkgPSB+IFJkSGk7CisJICBpZiAoUmRMbyA9PSAweEZGRkZGRkZGKQorCSAgICB7CisJICAgICAgUmRMbyA9IDA7CisJICAgICAgUmRIaSArPSAxOworCSAgICB9CisJICBlbHNlCisJICAgIFJkTG8gKz0gMTsKKwl9CisgICAgICAKKyAgICAgIHN0YXRlLT5SZWdbblJkTG9dID0gUmRMbzsKKyAgICAgIHN0YXRlLT5SZWdbblJkSGldID0gUmRIaTsKKyAgICAgIAorICAgIH0gLyogZWxzZSB1bmRlZmluZWQgcmVzdWx0ICovCisgIGVsc2UgZnByaW50ZiAoc3RkZXJyLCAiTVVMVElQTFk2NCAtIElOVkFMSUQgQVJHVU1FTlRTXG4iKTsKKyAgCisgIGlmIChzY2MpCisgICAgeworICAgICAgaWYgKChSZEhpID09IDApICYmIChSZExvID09IDApKQorCUFSTXVsX05lZ1plcm8oc3RhdGUsUmRIaSk7IC8qIHplcm8gdmFsdWUgKi8KKyAgICAgIGVsc2UKKwlBUk11bF9OZWdaZXJvKHN0YXRlLHNjYyk7IC8qIG5vbi16ZXJvIHZhbHVlICovCisgICAgfQorICAKKyAgLyogVGhlIGN5Y2xlIGNvdW50IGRlcGVuZHMgb24gd2hldGhlciB0aGUgaW5zdHJ1Y3Rpb24gaXMgYSBzaWduZWQgb3IKKyAgICAgdW5zaWduZWQgbXVsdGlwbHksIGFuZCB3aGF0IGJpdHMgYXJlIGNsZWFyIGluIHRoZSBtdWx0aXBsaWVyOiAqLworICBpZiAobXNpZ25lZCAmJiAoUm0gJiAoKHVuc2lnbmVkKTEgPDwgMzEpKSkKKyAgICBSbSA9IH5SbTsgLyogaW52ZXJ0IHRoZSBiaXRzIHRvIG1ha2UgdGhlIGNoZWNrIGFnYWluc3QgemVybyAqLworICAKKyAgaWYgKChSbSAmIDB4RkZGRkZGMDApID09IDApCisgICAgc2NvdW50ID0gMSA7CisgIGVsc2UgaWYgKChSbSAmIDB4RkZGRjAwMDApID09IDApCisgICAgc2NvdW50ID0gMiA7CisgIGVsc2UgaWYgKChSbSAmIDB4RkYwMDAwMDApID09IDApCisgICAgc2NvdW50ID0gMyA7CisgIGVsc2UKKyAgICBzY291bnQgPSA0IDsKKyAgCisgIHJldHVybiAyICsgc2NvdW50IDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSB3b3JrIG9mIG11bHRpcGx5aW5nIHR3byAzMmJpdCB2YWx1ZXMgYW5kIGFkZGluZyAgICAqCisqIGEgNjRiaXQgdmFsdWUgdG8gZ2l2ZSBhIDY0Yml0IHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHVuc2lnbmVkIE11bHRpcGx5QWRkNjQoQVJNdWxfU3RhdGUgKnN0YXRlLEFSTXdvcmQgaW5zdHIsaW50IG1zaWduZWQsaW50IHNjYykKK3sKKyAgdW5zaWduZWQgc2NvdW50OworICBBUk13b3JkIFJkTG8sIFJkSGk7CisgIGludCBuUmRIaSwgblJkTG87CisgIGludCBjYXJyeSA9IDA7CisKKyAgblJkSGkgPSBCSVRTKDE2LDE5KTsKKyAgblJkTG8gPSBCSVRTKDEyLDE1KTsKKworICBSZEhpID0gc3RhdGUtPlJlZ1tuUmRIaV0gOworICBSZExvID0gc3RhdGUtPlJlZ1tuUmRMb10gOworCisgIHNjb3VudCA9IE11bHRpcGx5NjQoc3RhdGUsaW5zdHIsbXNpZ25lZCxMREVGQVVMVCk7CisKKyAgUmRMbyA9IEFkZDMyKFJkTG8sc3RhdGUtPlJlZ1tuUmRMb10sJmNhcnJ5KTsKKyAgUmRIaSA9IChSZEhpICsgc3RhdGUtPlJlZ1tuUmRIaV0pICsgY2Fycnk7CisKKyAgc3RhdGUtPlJlZ1tuUmRMb10gPSBSZExvOworICBzdGF0ZS0+UmVnW25SZEhpXSA9IFJkSGk7CisKKyAgaWYgKHNjYykgeworICAgIGlmICgoUmRIaSA9PSAwKSAmJiAoUmRMbyA9PSAwKSkKKyAgICAgQVJNdWxfTmVnWmVybyhzdGF0ZSxSZEhpKTsgLyogemVybyB2YWx1ZSAqLworICAgIGVsc2UKKyAgICAgQVJNdWxfTmVnWmVybyhzdGF0ZSxzY2MpOyAvKiBub24temVybyB2YWx1ZSAqLworICB9CisKKyAgcmV0dXJuIHNjb3VudCArIDE7IC8qIGV4dHJhIGN5Y2xlIGZvciBhZGRpdGlvbiAqLworfQpkaWZmIC0tZ2l0IGEvc2ltL2FybS9hcm1lbXUuaCBiL3NpbS9hcm0vYXJtZW11LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0MGI4YwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9hcm0vYXJtZW11LmgKQEAgLTAsMCArMSw0MjUgQEAKKy8qICBhcm1lbXUuaCAtLSBBUk11bGF0b3IgZW11bGF0aW9uIG1hY3JvczogIEFSTTYgSW5zdHJ1Y3Rpb24gRW11bGF0b3IuCisgICAgQ29weXJpZ2h0IChDKSAxOTk0IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTHRkLgorIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KKworZXh0ZXJuIEFSTXdvcmQgaXNpemU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uIGNvZGUgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBFUSAwCisjZGVmaW5lIE5FIDEKKyNkZWZpbmUgQ1MgMgorI2RlZmluZSBDQyAzCisjZGVmaW5lIE1JIDQKKyNkZWZpbmUgUEwgNQorI2RlZmluZSBWUyA2CisjZGVmaW5lIFZDIDcKKyNkZWZpbmUgSEkgOAorI2RlZmluZSBMUyA5CisjZGVmaW5lIEdFIDEwCisjZGVmaW5lIExUIDExCisjZGVmaW5lIEdUIDEyCisjZGVmaW5lIExFIDEzCisjZGVmaW5lIEFMIDE0CisjZGVmaW5lIE5WIDE1CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoaWZ0IE9wY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMU0wgMAorI2RlZmluZSBMU1IgMQorI2RlZmluZSBBU1IgMgorI2RlZmluZSBST1IgMworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgIE1hY3JvcyB0byB0d2lkZGxlIHRoZSBzdGF0dXMgZmxhZ3MgYW5kIG1vZGUgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTkJJVCAoKHVuc2lnbmVkKTFMIDw8IDMxKQorI2RlZmluZSBaQklUICgxTCA8PCAzMCkKKyNkZWZpbmUgQ0JJVCAoMUwgPDwgMjkpCisjZGVmaW5lIFZCSVQgKDFMIDw8IDI4KQorI2RlZmluZSBJQklUICgxTCA8PCA3KQorI2RlZmluZSBGQklUICgxTCA8PCA2KQorI2RlZmluZSBJRkJJVFMgKDNMIDw8IDYpCisjZGVmaW5lIFIxNUlCSVQgKDFMIDw8IDI3KQorI2RlZmluZSBSMTVGQklUICgxTCA8PCAyNikKKyNkZWZpbmUgUjE1SUZCSVRTICgzTCA8PCAyNikKKworI2RlZmluZSBQT1MoaSkgKCAofihpKSkgPj4gMzEgKQorI2RlZmluZSBORUcoaSkgKCAoaSkgPj4gMzEgKQorCisjaWZkZWYgTU9ERVQgLyogVGh1bWIgc3VwcG9ydCAqLworLyogPz8/IFRoaXMgYml0IGlzIGFjdHVhbGx5IGluIHRoZSBsb3cgb3JkZXIgYml0IG9mIHRoZSBQQyBpbiB0aGUgaGFyZHdhcmUuCisgICBJdCBpc24ndCBjbGVhciBpZiB0aGUgc2ltdWxhdG9yIG5lZWRzIHRvIG1vZGVsIHRoYXQgb3Igbm90LiAgKi8KKyNkZWZpbmUgVEJJVCAoMUwgPDwgNSkKKyNkZWZpbmUgVEZMQUcgc3RhdGUtPlRGbGFnCisjZGVmaW5lIFNFVFQgc3RhdGUtPlRGbGFnID0gMQorI2RlZmluZSBDTEVBUlQgc3RhdGUtPlRGbGFnID0gMAorI2RlZmluZSBBU1NJR05UKHJlcykgc3RhdGUtPlRGbGFnID0gcmVzCisjZW5kaWYKKworI2RlZmluZSBORkxBRyBzdGF0ZS0+TkZsYWcKKyNkZWZpbmUgU0VUTiBzdGF0ZS0+TkZsYWcgPSAxCisjZGVmaW5lIENMRUFSTiBzdGF0ZS0+TkZsYWcgPSAwCisjZGVmaW5lIEFTU0lHTk4ocmVzKSBzdGF0ZS0+TkZsYWcgPSByZXMKKworI2RlZmluZSBaRkxBRyBzdGF0ZS0+WkZsYWcKKyNkZWZpbmUgU0VUWiBzdGF0ZS0+WkZsYWcgPSAxCisjZGVmaW5lIENMRUFSWiBzdGF0ZS0+WkZsYWcgPSAwCisjZGVmaW5lIEFTU0lHTloocmVzKSBzdGF0ZS0+WkZsYWcgPSByZXMKKworI2RlZmluZSBDRkxBRyBzdGF0ZS0+Q0ZsYWcKKyNkZWZpbmUgU0VUQyBzdGF0ZS0+Q0ZsYWcgPSAxCisjZGVmaW5lIENMRUFSQyBzdGF0ZS0+Q0ZsYWcgPSAwCisjZGVmaW5lIEFTU0lHTkMocmVzKSBzdGF0ZS0+Q0ZsYWcgPSByZXMKKworI2RlZmluZSBWRkxBRyBzdGF0ZS0+VkZsYWcKKyNkZWZpbmUgU0VUViBzdGF0ZS0+VkZsYWcgPSAxCisjZGVmaW5lIENMRUFSViBzdGF0ZS0+VkZsYWcgPSAwCisjZGVmaW5lIEFTU0lHTlYocmVzKSBzdGF0ZS0+VkZsYWcgPSByZXMKKworI2RlZmluZSBJRkxBRyAoc3RhdGUtPklGRmxhZ3MgPj4gMSkKKyNkZWZpbmUgRkZMQUcgKHN0YXRlLT5JRkZsYWdzICYgMSkKKyNkZWZpbmUgSUZGTEFHUyBzdGF0ZS0+SUZGbGFncworI2RlZmluZSBBU1NJR05JTlQocmVzKSBzdGF0ZS0+SUZGbGFncyA9ICgoKHJlcykgPj4gNikgJiAzKQorI2RlZmluZSBBU1NJR05SMTVJTlQocmVzKSBzdGF0ZS0+SUZGbGFncyA9ICgoKHJlcykgPj4gMjYpICYgMykgOworCisjZGVmaW5lIENDQklUUyAoMHhmMDAwMDAwMEwpCisjZGVmaW5lIElOVEJJVFMgKDB4YzBMKQorCisjaWYgZGVmaW5lZCBNT0RFVCAmJiBkZWZpbmVkIE1PREUzMgorI2RlZmluZSBQQ0JJVFMgKDB4ZmZmZmZmZmZMKQorI2Vsc2UKKyNkZWZpbmUgUENCSVRTICgweGZmZmZmZmZjTCkKKyNlbmRpZgorCisjZGVmaW5lIE1PREVCSVRTICgweDFmTCkKKyNkZWZpbmUgUjE1SU5UQklUUyAoM0wgPDwgMjYpCisKKyNpZiBkZWZpbmVkIE1PREVUICYmIGRlZmluZWQgTU9ERTMyCisjZGVmaW5lIFIxNVBDQklUUyAoMHgwM2ZmZmZmZkwpCisjZWxzZQorI2RlZmluZSBSMTVQQ0JJVFMgKDB4MDNmZmZmZmNMKQorI2VuZGlmCisKKyNkZWZpbmUgUjE1UENNT0RFQklUUyAoMHgwM2ZmZmZmZkwpCisjZGVmaW5lIFIxNU1PREVCSVRTICgweDNMKQorCisjaWZkZWYgTU9ERTMyCisjZGVmaW5lIFBDTUFTSyBQQ0JJVFMKKyNkZWZpbmUgUENXUkFQKHBjKSAocGMpCisjZWxzZQorI2RlZmluZSBQQ01BU0sgUjE1UENCSVRTCisjZGVmaW5lIFBDV1JBUChwYykgKChwYykgJiBSMTVQQ0JJVFMpCisjZW5kaWYKKworI2RlZmluZSBQQyAoc3RhdGUtPlJlZ1sxNV0gJiBQQ01BU0spCisjZGVmaW5lIFIxNUNDSU5UTU9ERSAoc3RhdGUtPlJlZ1sxNV0gJiAoQ0NCSVRTIHwgUjE1SU5UQklUUyB8IFIxNU1PREVCSVRTKSkKKyNkZWZpbmUgUjE1SU5UIChzdGF0ZS0+UmVnWzE1XSAmIFIxNUlOVEJJVFMpCisjZGVmaW5lIFIxNUlOVFBDIChzdGF0ZS0+UmVnWzE1XSAmIChSMTVJTlRCSVRTIHwgUjE1UENCSVRTKSkKKyNkZWZpbmUgUjE1SU5UUENNT0RFIChzdGF0ZS0+UmVnWzE1XSAmIChSMTVJTlRCSVRTIHwgUjE1UENCSVRTIHwgUjE1TU9ERUJJVFMpKQorI2RlZmluZSBSMTVJTlRNT0RFIChzdGF0ZS0+UmVnWzE1XSAmIChSMTVJTlRCSVRTIHwgUjE1TU9ERUJJVFMpKQorI2RlZmluZSBSMTVQQyAoc3RhdGUtPlJlZ1sxNV0gJiBSMTVQQ0JJVFMpCisjZGVmaW5lIFIxNVBDTU9ERSAoc3RhdGUtPlJlZ1sxNV0gJiAoUjE1UENCSVRTIHwgUjE1TU9ERUJJVFMpKQorI2RlZmluZSBSMTVNT0RFIChzdGF0ZS0+UmVnWzE1XSAmIFIxNU1PREVCSVRTKQorCisjZGVmaW5lIEVDQyAoKE5GTEFHIDw8IDMxKSB8IChaRkxBRyA8PCAzMCkgfCAoQ0ZMQUcgPDwgMjkpIHwgKFZGTEFHIDw8IDI4KSkKKyNkZWZpbmUgRUlOVCAoSUZGTEFHUyA8PCA2KQorI2RlZmluZSBFUjE1SU5UIChJRkZMQUdTIDw8IDI2KQorI2RlZmluZSBFTU9ERSAoc3RhdGUtPk1vZGUpCisKKyNpZmRlZiBNT0RFVAorI2RlZmluZSBDUFNSIChFQ0MgfCBFSU5UIHwgRU1PREUgfCAoVEZMQUcgPDwgNSkpCisjZWxzZQorI2RlZmluZSBDUFNSIChFQ0MgfCBFSU5UIHwgRU1PREUpCisjZW5kaWYKKworI2lmZGVmIE1PREUzMgorI2RlZmluZSBQQVRDSFIxNQorI2Vsc2UKKyNkZWZpbmUgUEFUQ0hSMTUgc3RhdGUtPlJlZ1sxNV0gPSBFQ0MgfCBFUjE1SU5UIHwgRU1PREUgfCBSMTVQQworI2VuZGlmCisKKyNkZWZpbmUgR0VUU1BTUihiYW5rKSBiYW5rPjA/c3RhdGUtPlNwc3JbYmFua106RUNDIHwgRUlOVCB8IEVNT0RFIDsKKyNkZWZpbmUgU0VUUFNSKGQscykgZCA9IChzKSAmIChBUk13b3JkKShDQ0JJVFMgfCBJTlRCSVRTIHwgTU9ERUJJVFMpCisjZGVmaW5lIFNFVElOVE1PREUoZCxzKSBkID0gKChkKSAmIENDQklUUykgfCAoKHMpICYgKElOVEJJVFMgfCBNT0RFQklUUykpCisjZGVmaW5lIFNFVENDKGQscykgZCA9ICgoZCkgJiAoSU5UQklUUyB8IE1PREVCSVRTKSkgfCAoKHMpICYgQ0NCSVRTKQorI2RlZmluZSBTRVRSMTVQU1IocykgaWYgKHN0YXRlLT5Nb2RlID09IFVTRVIyNk1PREUpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPlJlZ1sxNV0gPSAoKHMpICYgQ0NCSVRTKSB8IFIxNVBDIHwgRVIxNUlOVCB8IEVNT0RFIDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVNTSUdOTigoc3RhdGUtPlJlZ1sxNV0gJiBOQklUKSAhPSAwKSA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0lHTlooKHN0YXRlLT5SZWdbMTVdICYgWkJJVCkgIT0gMCkgOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBBU1NJR05DKChzdGF0ZS0+UmVnWzE1XSAmIENCSVQpICE9IDApIDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgQVNTSUdOVigoc3RhdGUtPlJlZ1sxNV0gJiBWQklUKSAhPSAwKSA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5SZWdbMTVdID0gUjE1UEMgfCAocykgJiAoQ0NCSVRTIHwgUjE1SU5UQklUUyB8IFIxNU1PREVCSVRTKSA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFSTXVsX1IxNUFsdGVyZWQoc3RhdGUpIDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgfQorI2RlZmluZSBTRVRBQk9SVChpLG0pIHN0YXRlLT5DcHNyID0gRUNDIHwgRUlOVCB8IChpKSB8IChtKQorCisjaWZuZGVmIE1PREUzMgorI2RlZmluZSBWRUNUT1JTIDB4MjAKKyNkZWZpbmUgTEVHQUxBRERSIDB4MDNmZmZmZmYKKyNkZWZpbmUgVkVDVE9SQUNDRVNTKGFkZHJlc3MpIChhZGRyZXNzIDwgVkVDVE9SUyAmJiBBUk11bF9NT0RFMjZCSVQgJiYgc3RhdGUtPnByb2czMlNpZykKKyNkZWZpbmUgQUREUkVYQ0VQVChhZGRyZXNzKSAoYWRkcmVzcyA+IExFR0FMQUREUiAmJiAhc3RhdGUtPmRhdGEzMlNpZykKKyNlbmRpZgorCisjZGVmaW5lIElOVEVSTkFMQUJPUlQoYWRkcmVzcykgaWYgKGFkZHJlc3MgPCBWRUNUT1JTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPkFib3J0ZWQgPSBBUk11bF9EYXRhQWJvcnRWIDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5BYm9ydGVkID0gQVJNdWxfQWRkckV4Y2VwdG5WIDsKKworI2lmZGVmIE1PREUzMgorI2RlZmluZSBUQUtFQUJPUlQgQVJNdWxfQWJvcnQoc3RhdGUsQVJNdWxfRGF0YUFib3J0VikKKyNlbHNlCisjZGVmaW5lIFRBS0VBQk9SVCBpZiAoc3RhdGUtPkFib3J0ZWQgPT0gQVJNdWxfQWRkckV4Y2VwdG5WKSBcCisgICAgICAgICAgICAgICAgICAgICBBUk11bF9BYm9ydChzdGF0ZSxBUk11bF9BZGRyRXhjZXB0blYpIDsgXAorICAgICAgICAgICAgICAgICAgZWxzZSBcCisgICAgICAgICAgICAgICAgICAgICBBUk11bF9BYm9ydChzdGF0ZSxBUk11bF9EYXRhQWJvcnRWKQorI2VuZGlmCisjZGVmaW5lIENQVEFLRUFCT1JUIGlmICghc3RhdGUtPkFib3J0ZWQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgQVJNdWxfQWJvcnQoc3RhdGUsQVJNdWxfVW5kZWZpbmVkSW5zdHJWKSA7IFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUtPkFib3J0ZWQgPT0gQVJNdWxfQWRkckV4Y2VwdG5WKSBcCisgICAgICAgICAgICAgICAgICAgICAgIEFSTXVsX0Fib3J0KHN0YXRlLEFSTXVsX0FkZHJFeGNlcHRuVikgOyBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgICAgICAgICAgICBBUk11bF9BYm9ydChzdGF0ZSxBUk11bF9EYXRhQWJvcnRWKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgRGlmZmVyZW50IHdheXMgdG8gc3RhcnQgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTRVEgMAorI2RlZmluZSBOT05TRVEgMQorI2RlZmluZSBQQ0lOQ0VEU0VRIDIKKyNkZWZpbmUgUENJTkNFRE5PTlNFUSAzCisjZGVmaW5lIFBSSU1FUElQRSA0CisjZGVmaW5lIFJFU1VNRSA4CisKKyNkZWZpbmUgTk9STUFMQ1lDTEUgc3RhdGUtPk5leHRJbnN0ciA9IDAKKyNkZWZpbmUgQlVTVVNFRE4gc3RhdGUtPk5leHRJbnN0ciB8PSAxIC8qIHRoZSBuZXh0IGZldGNoIHdpbGwgYmUgYW4gTiBjeWNsZSAqLworI2RlZmluZSBCVVNVU0VESU5DUENTIHN0YXRlLT5SZWdbMTVdICs9IGlzaXplIDsgLyogYSBzdGFuZGFyZCBQQyBpbmMgYW5kIGFuIFMgY3ljbGUgKi8gXAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5OZXh0SW5zdHIgPSAoc3RhdGUtPk5leHRJbnN0ciAmIDB4ZmYpIHwgMgorI2RlZmluZSBCVVNVU0VESU5DUENOIHN0YXRlLT5SZWdbMTVdICs9IGlzaXplIDsgLyogYSBzdGFuZGFyZCBQQyBpbmMgYW5kIGFuIE4gY3ljbGUgKi8gXAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5OZXh0SW5zdHIgfD0gMworI2RlZmluZSBJTkNQQyBzdGF0ZS0+UmVnWzE1XSArPSBpc2l6ZSA7IC8qIGEgc3RhbmRhcmQgUEMgaW5jICovIFwKKyAgICAgICAgICAgICAgc3RhdGUtPk5leHRJbnN0ciB8PSAyCisjZGVmaW5lIEZMVVNIUElQRSBzdGF0ZS0+TmV4dEluc3RyIHw9IFBSSU1FUElQRQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ljbGUgYmFzZWQgZW11bGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgT1VUUFVUQ1AoaSxhLGIpCisjZGVmaW5lIE5DWUNMRQorI2RlZmluZSBTQ1lDTEUKKyNkZWZpbmUgSUNZQ0xFCisjZGVmaW5lIENDWUNMRQorI2RlZmluZSBORVhUQ1lDTEUoYykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgIFN0YXRlcyBvZiB0aGUgY3ljbGUgYmFzZWQgc3RhdGUgbWFjaGluZSAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICBNYWNyb3MgdG8gZXh0cmFjdCBwYXJ0cyBvZiBpbnN0cnVjdGlvbnMgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBERVNUUmVnIChCSVRTKDEyLDE1KSkKKyNkZWZpbmUgTEhTUmVnIChCSVRTKDE2LDE5KSkKKyNkZWZpbmUgUkhTUmVnIChCSVRTKDAsMykpCisKKyNkZWZpbmUgREVTVCAoc3RhdGUtPlJlZ1tERVNUUmVnXSkKKworI2lmZGVmIE1PREUzMgorI2lmZGVmIE1PREVUCisjZGVmaW5lIExIUyAoKExIU1JlZyA9PSAxNSkgPyAoc3RhdGUtPlJlZ1sxNV0gJiAweEZGRkZGRkZDKTogKHN0YXRlLT5SZWdbTEhTUmVnXSkpCisjZWxzZQorI2RlZmluZSBMSFMgKHN0YXRlLT5SZWdbTEhTUmVnXSkKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgTEhTICgoTEhTUmVnID09IDE1KSA/IFIxNVBDIDogKHN0YXRlLT5SZWdbTEhTUmVnXSkgKQorI2VuZGlmCisKKyNkZWZpbmUgTVVMREVTVFJlZyAoQklUUygxNiwxOSkpCisjZGVmaW5lIE1VTExIU1JlZyAoQklUUygwLDMpKQorI2RlZmluZSBNVUxSSFNSZWcgKEJJVFMoOCwxMSkpCisjZGVmaW5lIE1VTEFDQ1JlZyAoQklUUygxMiwxNSkpCisKKyNkZWZpbmUgRFBJbW1SSFMgKEFSTXVsX0ltbWVkVGFibGVbQklUUygwLDExKV0pCisjZGVmaW5lIERQU0ltbVJIUyB0ZW1wID0gQklUUygwLDExKSA7IFwKKyAgICAgICAgICAgICAgICAgIHJocyA9IEFSTXVsX0ltbWVkVGFibGVbdGVtcF0gOyBcCisgICAgICAgICAgICAgICAgICBpZiAodGVtcCA+IDI1NSkgLyogdGhlcmUgd2FzIGEgc2hpZnQgKi8gXAorICAgICAgICAgICAgICAgICAgICAgQVNTSUdOQyhyaHMgPj4gMzEpIDsKKworI2lmZGVmIE1PREUzMgorI2RlZmluZSBEUFJlZ1JIUyAoKEJJVFMoNCwxMSk9PTApID8gc3RhdGUtPlJlZ1tSSFNSZWddIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdldERQUmVnUkhTKHN0YXRlLCBpbnN0cikpCisjZGVmaW5lIERQU1JlZ1JIUyAoKEJJVFMoNCwxMSk9PTApID8gc3RhdGUtPlJlZ1tSSFNSZWddIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZXREUFNSZWdSSFMoc3RhdGUsIGluc3RyKSkKKyNlbHNlCisjZGVmaW5lIERQUmVnUkhTICgoQklUUygwLDExKTwxNSkgPyBzdGF0ZS0+UmVnW1JIU1JlZ10gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogR2V0RFBSZWdSSFMoc3RhdGUsIGluc3RyKSkKKyNkZWZpbmUgRFBTUmVnUkhTICgoQklUUygwLDExKTwxNSkgPyBzdGF0ZS0+UmVnW1JIU1JlZ10gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdldERQU1JlZ1JIUyhzdGF0ZSwgaW5zdHIpKQorI2VuZGlmCisKKyNkZWZpbmUgTFNCYXNlIHN0YXRlLT5SZWdbTEhTUmVnXQorI2RlZmluZSBMU0ltbVJIUyAoQklUUygwLDExKSkKKworI2lmZGVmIE1PREUzMgorI2RlZmluZSBMU1JlZ1JIUyAoKEJJVFMoNCwxMSk9PTApID8gc3RhdGUtPlJlZ1tSSFNSZWddIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdldExTUmVnUkhTKHN0YXRlLCBpbnN0cikpCisjZWxzZQorI2RlZmluZSBMU1JlZ1JIUyAoKEJJVFMoMCwxMSk8MTUpID8gc3RhdGUtPlJlZ1tSSFNSZWddIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdldExTUmVnUkhTKHN0YXRlLCBpbnN0cikpCisjZW5kaWYKKworI2RlZmluZSBMU01OdW1SZWdzICgoQVJNd29yZClBUk11bF9CaXRMaXN0W0JJVFMoMCw3KV0gKyBcCisgICAgICAgICAgICAgICAgICAgIChBUk13b3JkKUFSTXVsX0JpdExpc3RbQklUUyg4LDE1KV0gKQorI2RlZmluZSBMU01CYXNlRmlyc3QgKChMSFNSZWcgPT0gMCAmJiBCSVQoMCkpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoQklUKExIU1JlZykgJiYgQklUUygwLExIU1JlZy0xKSA9PSAwKSkKKworI2RlZmluZSBTV0FQU1JDIChzdGF0ZS0+UmVnW1JIU1JlZ10pCisKKyNkZWZpbmUgTFNDT2ZmIChCSVRTKDAsNykgPDwgMikKKyNkZWZpbmUgQ1BOdW0gQklUUyg4LDExKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgTWFjcm8gdG8gcm90YXRlIG4gcmlnaHQgYnkgYiBiaXRzICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUk9UQVRFUihuLGIpICgoKG4pPj4oYikpfCgobik8PCgzMi0oYikpKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgIE1hY3JvcyB0byBzdG9yZSByZXN1bHRzIG9mIGluc3RydWN0aW9ucyAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFdSSVRFREVTVChkKSBpZiAoREVTVFJlZz09MTUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlUjE1KHN0YXRlLCBkKSA7IFwKKyAgICAgICAgICAgICAgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBERVNUID0gZAorCisjZGVmaW5lIFdSSVRFU0RFU1QoZCkgaWYgKERFU1RSZWcgPT0gMTUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZVNSMTUoc3RhdGUsIGQpIDsgXAorICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgREVTVCA9IGQgOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgQVJNdWxfTmVnWmVybyhzdGF0ZSwgZCkgOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjZGVmaW5lIEJZVEVUT0JVUyhkYXRhKSAoKGRhdGEgJiAweGZmKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoZGF0YSAmIDB4ZmYpIDw8IDgpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKChkYXRhICYgMHhmZikgPDwgMTYpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgKChkYXRhICYgMHhmZikgPDwgMjQpKQorI2RlZmluZSBCVVNUT0JZVEUoYWRkcmVzcyxkYXRhKSBcCisgICAgICAgICAgIGlmIChzdGF0ZS0+YmlnZW5kU2lnKSBcCisgICAgICAgICAgICAgIHRlbXAgPSAoZGF0YSA+PiAoKChhZGRyZXNzIF4gMykgJiAzKSA8PCAzKSkgJiAweGZmIDsgXAorICAgICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgICAgdGVtcCA9IChkYXRhID4+ICgoYWRkcmVzcyAmIDMpIDw8IDMpKSAmIDB4ZmYKKworI2RlZmluZSBMT0FETVVMVChpbnN0cixhZGRyZXNzLHdiKSBMb2FkTXVsdChzdGF0ZSxpbnN0cixhZGRyZXNzLHdiKQorI2RlZmluZSBMT0FEU01VTFQoaW5zdHIsYWRkcmVzcyx3YikgTG9hZFNNdWx0KHN0YXRlLGluc3RyLGFkZHJlc3Msd2IpCisjZGVmaW5lIFNUT1JFTVVMVChpbnN0cixhZGRyZXNzLHdiKSBTdG9yZU11bHQoc3RhdGUsaW5zdHIsYWRkcmVzcyx3YikKKyNkZWZpbmUgU1RPUkVTTVVMVChpbnN0cixhZGRyZXNzLHdiKSBTdG9yZVNNdWx0KHN0YXRlLGluc3RyLGFkZHJlc3Msd2IpCisKKyNkZWZpbmUgUE9TQlJBTkNIICgoaW5zdHIgJiAweDdmZmZmZikgPDwgMikKKyNkZWZpbmUgTkVHQlJBTkNIICgweGZmMDAwMDAwIHwgKChpbnN0ciAmIDB4ZmZmZmZmKSA8PCAyKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBmb3IgRW11bGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFNUT1AgICAgICAgICAgICAwIC8qIHN0b3AgKi8KKyNkZWZpbmUgQ0hBTkdFTU9ERSAgICAgIDEgLyogY2hhbmdlIG1vZGUgKi8KKyNkZWZpbmUgT05DRSAgICAgICAgICAgIDIgLyogZXhlY3V0ZSBqdXN0IG9uZSBpbnRlcmF0aW9uICovCisjZGVmaW5lIFJVTiAgICAgICAgICAgICAzIC8qIGNvbnRpbnVvdXMgZXhlY3V0aW9uICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgIFN0dWZmIHRoYXQgaXMgc2hhcmVkIGFjcm9zcyBtb2RlcyAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIEFSTXdvcmQgQVJNdWxfRW11bGF0ZTI2KEFSTXVsX1N0YXRlICpzdGF0ZSkgOworZXh0ZXJuIEFSTXdvcmQgQVJNdWxfRW11bGF0ZTMyKEFSTXVsX1N0YXRlICpzdGF0ZSkgOworZXh0ZXJuIHVuc2lnbmVkIEFSTXVsX011bHRUYWJsZVtdIDsgLyogTnVtYmVyIG9mIEkgY3ljbGVzIGZvciBhIG11bHQgKi8KK2V4dGVybiBBUk13b3JkIEFSTXVsX0ltbWVkVGFibGVbXSA7IC8qIGltbWVkaWF0ZSBEUCBMSFMgdmFsdWVzICovCitleHRlcm4gY2hhciBBUk11bF9CaXRMaXN0W10gOyAvKiBudW1iZXIgb2YgYml0cyBpbiBhIGJ5dGUgdGFibGUgKi8KK2V4dGVybiB2b2lkIEFSTXVsX0Fib3J0MjYoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkKSA7CitleHRlcm4gdm9pZCBBUk11bF9BYm9ydDMyKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCkgOworZXh0ZXJuIHVuc2lnbmVkIEFSTXVsX050aFJlZyhBUk13b3JkIGluc3RyLHVuc2lnbmVkIG51bWJlcikgOworZXh0ZXJuIHZvaWQgQVJNdWxfTVNSQ3BzcihBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgcmhzKSA7CitleHRlcm4gdm9pZCBBUk11bF9OZWdaZXJvKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCByZXN1bHQpIDsKK2V4dGVybiB2b2lkIEFSTXVsX0FkZENhcnJ5KEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBhLCBBUk13b3JkIGIsIEFSTXdvcmQgcmVzdWx0KSA7CitleHRlcm4gdm9pZCBBUk11bF9BZGRPdmVyZmxvdyhBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgYSwgQVJNd29yZCBiLCBBUk13b3JkIHJlc3VsdCkgOworZXh0ZXJuIHZvaWQgQVJNdWxfU3ViQ2FycnkoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIGEsIEFSTXdvcmQgYiwgQVJNd29yZCByZXN1bHQpIDsKK2V4dGVybiB2b2lkIEFSTXVsX1N1Yk92ZXJmbG93KEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBhLCBBUk13b3JkIGIsIEFSTXdvcmQgcmVzdWx0KSA7CitleHRlcm4gdm9pZCBBUk11bF9DUFNSQWx0ZXJlZChBUk11bF9TdGF0ZSAqc3RhdGUpIDsKK2V4dGVybiB2b2lkIEFSTXVsX1IxNUFsdGVyZWQoQVJNdWxfU3RhdGUgKnN0YXRlKSA7CitleHRlcm4gQVJNd29yZCBBUk11bF9Td2l0Y2hNb2RlKEFSTXVsX1N0YXRlICpzdGF0ZSxBUk13b3JkIG9sZG1vZGUsIEFSTXdvcmQgbmV3bW9kZSkgOworZXh0ZXJuIHVuc2lnbmVkIEFSTXVsX050aFJlZyhBUk13b3JkIGluc3RyLCB1bnNpZ25lZCBudW1iZXIpIDsKK2V4dGVybiB2b2lkIEFSTXVsX0xEQyhBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBpbnN0cixBUk13b3JkIGFkZHJlc3MpIDsKK2V4dGVybiB2b2lkIEFSTXVsX1NUQyhBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBpbnN0cixBUk13b3JkIGFkZHJlc3MpIDsKK2V4dGVybiB2b2lkIEFSTXVsX01DUihBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBpbnN0ciwgQVJNd29yZCBzb3VyY2UpIDsKK2V4dGVybiBBUk13b3JkIEFSTXVsX01SQyhBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBpbnN0cikgOworZXh0ZXJuIHZvaWQgQVJNdWxfQ0RQKEFSTXVsX1N0YXRlICpzdGF0ZSxBUk13b3JkIGluc3RyKSA7CitleHRlcm4gdW5zaWduZWQgSW50UGVuZGluZyhBUk11bF9TdGF0ZSAqc3RhdGUpIDsKK2V4dGVybiBBUk13b3JkIEFSTXVsX0FsaWduKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIGRhdGEpIDsKKyNkZWZpbmUgRVZFTlRMSVNUU0laRSAxMDI0TAorCisvKiBUaHVtYiBzdXBwb3J0OiAqLworCit0eXBlZGVmIGVudW0geworICB0X3VuZGVmaW5lZCwgIC8qIHVuZGVmaW5lZCBUaHVtYiBpbnN0cnVjdGlvbiAqLworICB0X2RlY29kZWQsICAgIC8qIGluc3RydWN0aW9uIGRlY29kZWQgdG8gQVJNIGVxdWl2YWxlbnQgKi8KKyAgdF9icmFuY2ggICAgICAvKiBUaHVtYiBicmFuY2ggKGFscmVhZHkgcHJvY2Vzc2VkKSAqLworfSB0ZHN0YXRlOworCitleHRlcm4gdGRzdGF0ZSBBUk11bF9UaHVtYkRlY29kZShBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBwYyxBUk13b3JkIHRpbnN0ciwgQVJNd29yZCAqYWluc3RyKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgTWFjcm9zIHRvIHNjcnV0aW5pemUgaW5zdHJ1Y3Rpb25zICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNkZWZpbmUgVU5ERUZfVGVzdAorI2RlZmluZSBVTkRFRl9TaGlmdAorI2RlZmluZSBVTkRFRl9NU1JQQworI2RlZmluZSBVTkRFRl9NUlNQQworI2RlZmluZSBVTkRFRl9NVUxQQ0Rlc3QKKyNkZWZpbmUgVU5ERUZfTVVMRGVzdEVRT3AxCisjZGVmaW5lIFVOREVGX0xTUkJQQworI2RlZmluZSBVTkRFRl9MU1JCYXNlRVFPZmZXYgorI2RlZmluZSBVTkRFRl9MU1JCYXNlRVFEZXN0V2IKKyNkZWZpbmUgVU5ERUZfTFNSUENCYXNlV2IKKyNkZWZpbmUgVU5ERUZfTFNSUENPZmZXYgorI2RlZmluZSBVTkRFRl9MU01Ob1JlZ3MKKyNkZWZpbmUgVU5ERUZfTFNNUENCYXNlCisjZGVmaW5lIFVOREVGX0xTTVVzZXJCYW5rV2IKKyNkZWZpbmUgVU5ERUZfTFNNQmFzZUluTGlzdFdiCisjZGVmaW5lIFVOREVGX1NXUFBDCisjZGVmaW5lIFVOREVGX0NvUHJvSFMKKyNkZWZpbmUgVU5ERUZfTUNSUEMKKyNkZWZpbmUgVU5ERUZfTFNDUENCYXNlV2IKKyNkZWZpbmUgVU5ERUZfVW5kZWZOb3RCb3VuY2VkCisjZGVmaW5lIFVOREVGX1Nob3J0SW50CisjZGVmaW5lIFVOREVGX0lsbGVnYWxNb2RlCisjZGVmaW5lIFVOREVGX1Byb2czMlNpZ0NoYW5nZQorI2RlZmluZSBVTkRFRl9EYXRhMzJTaWdDaGFuZ2UKKwpkaWZmIC0tZ2l0IGEvc2ltL2FybS9hcm1mcGUuaCBiL3NpbS9hcm0vYXJtZnBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEwYWYxNgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9hcm0vYXJtZnBlLmgKQEAgLTAsMCArMSwxMzUxIEBACisvKiAgYXJtZnBlLmggLS0gQVJNdWxhdG9yIHByZS1jb21waWxlZCBGUEU6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgorICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKy8qIEFycmF5IGNvbnRhaW5pbmcgdGhlIEZsb2F0aW5nIFBvaW50IEVtdWFsdG9yIChGUEUpLiAqLworCisKK3Vuc2lnbmVkIGxvbmcgZnBlY29kZVtdID0geworMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDA3MDAwMCwweDAwMDAwMDAwLDB4ZTkyZDQwMGUsMHhlYjAwMTNlZiwKKzB4ZTI4ZjAwZDQsMHhlMWEwMDEyMCwweGUzODAwNGVhLDB4ZTNhMDEwMDQsCisweGU1OTEyMDAwLDB4ZTI0ZjMwMjgsMHhlMTUwMDAwMiwweDE1ODMyMDAwLAorMHgxNTgxMDAwMCwweGUzYTAwMDAxLDB4ZThiZDgwMGUsMHhlMjhkOTA0MCwKKzB4ZTFhMGEwMGUsMHhlMjRmNzA0OCwweGU1OTdiMDAwLDB4ZTIwYjc0ZWUsCisweGUxNGY4MDAwLDB4ZTIwODgwNDAsMHhlMzg4ODA5YiwweGUxMjFmMDA4LAorMHhlMzU3MDRlYSwweDAwNGJiMDA3LDB4MDFhMGIxMGIsMHgwMjhiZjAwYywKKzB4ZTIwYjczM2IsMHhlMzU3MDMzOSwweDAxYTBiYTBiLDB4MDFhMGJhMmIsCisweDA1OWJiMDBjLDB4MDI0OTgwMGMsMHgwODg4MGUwMCwweDA5MTlmZjgwLAorMHhlMjRmNzA5NCwweGUxYTBmMDA3LDB4ZTE0ZjgwMDAsMHhlMjA4ODA0MCwKKzB4ZTM4ODgwOTMsMHhlMTIxZjAwOCwweGU4ZGQ3ZmZmLDB4ZTFhMDAwMDAsCisweGUyOGRkMDNjLDB4ZThmZDgwMDAsMHhlMTRmODAwMCwweGUyMDg4MDQwLAorMHhlMzg4ODA5MywweGUxMjFmMDA4LDB4ZThiZDFmZmYsMHhlMjhkZDAwYywKKzB4ZTFiMGYwMGUsMHhlMTRmODAwMCwweGUyMDg4MDQwLDB4ZTM4ODgwOTMsCisweGUxMjFmMDA4LDB4ZTI4ZGQwMWMsMHhlOGJkMWY4MCwweGUyOGRkMDBjLAorMHhlMWIwZjAwZSwweDAwMDAyMTAwLDB4ZTkwZDQwMDcsMHhlMTRmMDAwMCwKKzB4ZTI0ZDEwMTAsMHhlMTBmMjAwMCwweGUyMDIyMGMwLDB4ZTM4MjIwMDMsCisweGUxMjFmMDAyLDB4ZTE2OWYwMDAsMHhlODkxNDAwNywweGUyNGRkMDQwLAorMHhlOGNkN2ZmZiwweGUyNGZjZjZiLDB4ZTU4ZGUwM2MsMHhlMjRlYTAwNCwKKzB4ZTE0ZjkwMDAsMHhlMjA5OTBjMCwweGUzODk5MDAzLDB4ZTEyMWYwMDksCisweGU0YmE5MDA4LDB4ZTIwOTg3ZmUsMHhlMjE5NzAxMCwweGUwMDc3YWE5LAorMHhlMDI4OGEwNywweDAyMDk3NDAyLDB4MDAwNzc1MDksMHgwMDg4ODAwNywKKzB4ZTIwOTdjMGYsMHhlMzM3MGMwMSwweDAyMDk3MzNlLDB4MDMzNzAzM2EsCisweDAwOGZmOGE4LDB4ZWEwMDAwOWYsMHhlYTAwMDNiNywweGVhMDAwM2I2LAorMHhlYTAwMDMwNywweGVhMDAwMzA2LDB4ZWEwMDAzYjMsMHhlYTAwMDNiMiwKKzB4ZWEwMDAzMDMsMHhlYTAwMDMwMiwweGVhMDAwM2MzLDB4ZWEwMDAzYzIsCisweGVhMDAwMzBkLDB4ZWEwMDAzMGMsMHhlYTAwMDNiZiwweGVhMDAwM2JlLAorMHhlYTAwMDMwOSwweGVhMDAwMzA4LDB4ZWEwMDAzY2YsMHhlYTAwMDNjZSwKKzB4ZWEwMDAzMTQsMHhlYTAwMDMxMywweGVhMDAwM2NiLDB4ZWEwMDAzY2EsCisweGVhMDAwMzEwLDB4ZWEwMDAzMGYsMHhlYTAwMDNkYiwweGVhMDAwM2RhLAorMHhlYTAwMDMxYSwweGVhMDAwMzE5LDB4ZWEwMDAzZDcsMHhlYTAwMDNkNiwKKzB4ZWEwMDAzMTYsMHhlYTAwMDMxNSwweGVhMDAwM2U3LDB4ZWEwMDAzZTYsCisweGVhMDAwMzIxLDB4ZWEwMDAzMjAsMHhlYTAwMDNmNywweGVhMDAwM2Y2LAorMHhlYTAwMDMyYiwweGVhMDAwMzJhLDB4ZWEwMDA0NDksMHhlYTAwMDQ0OCwKKzB4ZWEwMDAzMzUsMHhlYTAwMDMzNCwweGVhMDAwNDU5LDB4ZWEwMDA0NTgsCisweGVhMDAwMzQwLDB4ZWEwMDAzM2YsMHhlYTAwMDQ2OSwweGVhMDAwNDY4LAorMHhlYTAwMDM0YiwweGVhMDAwMzRhLDB4ZWEwMDA0NzksMHhlYTAwMDQ3OCwKKzB4ZWEwMDAzNTUsMHhlYTAwMDM1NCwweGVhMDAwNDg5LDB4ZWEwMDA0ODgsCisweGVhMDAwMzVmLDB4ZWEwMDAzNWUsMHhlYTAwMDQ5OSwweGVhMDAwNDk4LAorMHhlYTAwMDM2YSwweGVhMDAwMzY5LDB4ZWEwMDBhYzgsMHhlYTAwMGFjNSwKKzB4ZWEwMDBjM2QsMHhlYTAwMGMzYSwweGVhMDAwYjdiLDB4ZWEwMDBiNzgsCisweGVhMDAwYjc5LDB4ZWEwMDBiNzYsMHhlYTAwMGQzNCwweGVhMDAwZDMxLAorMHhlYTAwMGQwOCwweGVhMDAwZDA1LDB4ZWEwMDBlMzQsMHhlYTAwMGUzMSwKKzB4ZWEwMDBlMWMsMHhlYTAwMGUxOSwweGVhMDAwZWNmLDB4ZWEwMDBlY2MsCisweGVhMDAwYzJkLDB4ZWEwMDBjMmEsMHhlYTAwMGQyOCwweGVhMDAwZDI1LAorMHhlYTAwMGNmYywweGVhMDAwY2Y5LDB4ZWEwMDEyM2QsMHhlYTAwMTIzYSwKKzB4ZWFmZmZmNTUsMHhlYWZmZmY1NCwweGVhZmZmZjUzLDB4ZWFmZmZmNTIsCisweGVhZmZmZjUxLDB4ZWFmZmZmNTAsMHhlYTAwMDdiOCwweGVhMDAwN2VjLAorMHhlYTAwMDczYywweGVhMDAwNzNiLDB4ZWEwMDA4MDYsMHhlYTAwMDgwNSwKKzB4ZWEwMDA4MGYsMHhlYTAwMDgwZSwweGVhZmZmZjQ3LDB4ZWFmZmZmNDYsCisweGVhZmZmZjQ1LDB4ZWFmZmZmNDQsMHhlYWZmZmY0MywweGVhZmZmZjQyLAorMHhlYWZmZmY0MSwweGVhZmZmZjQwLDB4ZWFmZmZmM2YsMHhlYWZmZmYzZSwKKzB4ZWEwMDA4NmYsMHhlYTAwMDg2ZSwweGVhZmZmZjNiLDB4ZWFmZmZmM2EsCisweGVhMDAwODZiLDB4ZWEwMDA4NmEsMHhlYWZmZmYzNywweGVhZmZmZjM2LAorMHhlYTAwMDdmZiwweGVhMDAwN2ZlLDB4ZWFmZmZmMzMsMHhlYWZmZmYzMiwKKzB4ZWEwMDA3ZmIsMHhlYTAwMDdmYSwweGVhMDAwOTE0LDB4ZWEwMDA4ZjMsCisweGVhMDAwOTFmLDB4ZWEwMDA4ZmIsMHhlYTAwMDkyYiwweGVhMDAwOTA0LAorMHhlYTAwMDlkYywweGVhMDAwOWQ5LDB4ZWEwMDA5ZmQsMHhlYTAwMDlmYSwKKzB4ZWEwMDBlZjgsMHhlYTAwMGVmNSwweGVhMDAwZWY2LDB4ZWEwMDBlZjMsCisweGVhMDAwZjlkLDB4ZWEwMDBmOWEsMHhlYTAwMTExZSwweGVhMDAxMTFiLAorMHhlYTAwMTExYywweGVhMDAxMTE5LDB4ZWEwMDEwNGUsMHhlYTAwMTA0YiwKKzB4ZWEwMDExNDcsMHhlYTAwMTE0NCwweGVhMDAxMTQ1LDB4ZWEwMDExNDIsCisweGVhMDAxMjVhLDB4ZWEwMDEyNTcsMHhlYWZmZmYxMywweGVhZmZmZjEyLAorMHhlYWZmZmYxMSwweGVhZmZmZjEwLDB4ZTMxOTBjMGUsMHgxYWZmZmYwZSwKKzB4ZTMxOTBjMDEsMHgxMzE5MDMwMiwweDBhZmZmZjBiLDB4ZTI4ZmIwMTYsCisweGU3OWI3ZDI3LDB4ZTE0ZmIwMDAsMHhlMWEwYmUyYiwweGUyOGJiMDEwLAorMHhlMTE3MGIzNywweDBhZmZmZjUxLDB4ZWFmZmZmMjksMHg4MDAwZjBmMCwKKzB4ODAwMDBmMGYsMHg4MDAwY2NjYywweDgwMDAzMzMzLDB4ODAwMGZmMDAsCisweDgwMDAwMGZmLDB4ODAwMGFhYWEsMHg4MDAwNTU1NSwweDgwMDBjZmNmLAorMHg4MDAwMzAzMCwweDgwMDA1NWFhLDB4ODAwMGFhNTUsMHg4MDAwNWZhZiwKKzB4ODAwMGEwNTAsMHg4MDAwMDAwMCwweDgwMDBmZmZmLDB4ZTEzMDAwMDcsCisweDVhMDAwMDAyLDB4ZWEwMDAwNGEsMHhlMzEwMDEwMiwweDFhMDAwMDQ4LAorMHhlMDUzNDAwYiwweDRhMDAwMDJkLDB4ZTI3NDUwMjAsMHhkYTAwMDAxYiwKKzB4ZTA5MjI0M2EsMHgyMDgyMjUxOCwweDMwOTIyNTE4LDB4ZTBiMTE0MzgsCisweGUxYTA0NTFhLDB4MmEwMDAwMDYsMHhlMDkyMmZhNCwweGUyYjExMDAwLAorMHgzMWIwZjAwZSwweGUzYTAxMTAyLDB4ZTI4MzMwMDEsMHhlMWEwNDBhNCwKKzB4ZTFiMGYwMGUsMHhlMjgzMzAwMSwweGUxYTA0MGE0LDB4ZTE4NDRmODIsCisweGUxYTAyMGEyLDB4ZTE4MjJmODEsMHhlMWEwMTA2MSwweGUwOTIyZmE0LAorMHhlMmExMTAwMCwweGUxYjBmMDBlLDB4ZTFhMDQ1MzgsMHhlMDkyMmZhNCwKKzB4ZTJiMTEwMDAsMHgyM2EwMTEwMiwweDIyODMzMDAxLDB4ZTFiMGYwMGUsCisweGUyNTQ1MDQwLDB4YWFmZmZmZjcsMHhlMjQ0NDAyMCwweGUyNjQ1MDIwLAorMHhlMDkyMjQzOCwweGUyYjExMDAwLDB4ZTFhMDQ1MTgsMHhlMTg0NDQzYSwKKzB4MmFmZmZmZTcsMHhlMDkyMmZhNCwweGUyYjExMDAwLDB4MzFiMGYwMGUsCisweGUzYTAxMTAyLDB4ZTI4MzMwMDEsMHhlMWEwNDBhNCwweGUxYjBmMDBlLAorMHhlMjY0NDAwMCwweGUxYTAzMDBiLDB4ZTFhMDUwMDEsMHhlMWEwMTAwOCwKKzB4ZTFhMDgwMDUsMHhlMWEwNTAwMiwweGUxYTAyMDBhLDB4ZTFhMGEwMDUsCisweGUyNzQ1MDIwLDB4ZGFmZmZmZTUsMHhlMDkyMjQzYSwweDIwODIyNTE4LAorMHgzMDkyMjUxOCwweGUwYjExNDM4LDB4ZTFhMDQ1MWEsMHgyYWZmZmZkMCwKKzB4ZTA5MjJmYTQsMHhlMmIxMTAwMCwweDMxYjBmMDBlLDB4ZTNhMDExMDIsCisweGUyODMzMDAxLDB4ZTFhMDQwYTQsMHhlMWIwZjAwZSwweGUzMTAwMTAyLAorMHgxYWZmZmZiNiwweGUwNTM2MDBiLDB4NGEwMDAwM2QsMHgwMTUxMDAwOCwKKzB4MDE1MjAwMGEsMHgwYTAwMDA0ZiwweDNhMDAwMDM5LDB4ZTNhMDQwMDAsCisweGUyNzY1MDIwLDB4ZGEwMDAwMWEsMHhlMDU0NDUxYSwweGUwZDIyNjNhLAorMHgzMDQyMjUxOCwweDIwNTIyNTE4LDB4ZTBkMTE2MzgsMHg1YTAwMDAwMiwKKzB4ZTA5MjJmYTQsMHhlMmExMTAwMCwweGUxYjBmMDBlLDB4ZTA5NDQwMDQsCisweGUwYjIyMDAyLDB4ZTBiMTEwMDEsMHhlMjQzMzAwMSwweDVhZmZmZmZhLAorMHhlMDkyMmZhNCwweGUyYjExMDAwLDB4MzFiMGYwMGUsMHhlM2EwMTEwMiwKKzB4ZTI4MzMwMDEsMHhlMWEwNDBhNCwweGUxYjBmMDBlLDB4ZTA1NDQ1MzgsCisweDQxYjBmMDBlLDB4ZTJkMjIwMDAsMHhlMmQxMTAwMCwweDQxYjBmMDBlLAorMHhlYWZmZmZlZCwweGUzYTA0MDAwLDB4ZTI1NjUwNDAsMHhhYWZmZmZmNiwKKzB4ZTI0NjYwMjAsMHhlMjY2NTAyMCwweGUwNTQ3NTFhLDB4ZTBkNDQ2M2EsCisweDMwNDQ0NTE4LDB4MjA1NDQ1MTgsMHhlMGQyMjYzOCwweGUyZDExMDAwLAorMHg1YTAwMDAwMiwweGUwOTIyZmE0LDB4ZTJhMTEwMDAsMHhlMWIwZjAwZSwKKzB4ZTA5NzcwMDcsMHhlMGI0NDAwNCwweGUwYjIyMDAyLDB4ZTBiMTEwMDEsCisweGUyNDMzMDAxLDB4NWFmZmZmZjksMHhlMDkyMmZhNCwweGUyYjExMDAwLAorMHgzMWIwZjAwZSwweGUzYTAxMTAyLDB4ZTI4MzMwMDEsMHhlMWEwNDBhNCwKKzB4ZTFiMGYwMGUsMHhlMjY2NjAwMCwweGUyMjAwMTAyLDB4ZTFhMDMwMGIsCisweGUxYTA1MDAxLDB4ZTFhMDEwMDgsMHhlMWEwODAwNSwweGUxYTA1MDAyLAorMHhlMWEwMjAwYSwweGUxYTBhMDA1LDB4ZTNhMDQwMDAsMHhlMjc2NTAyMCwKKzB4ZGFmZmZmZDcsMHhlMDU0NDUxYSwweGUwZDIyNjNhLDB4MzA0MjI1MTgsCisweDIwNTIyNTE4LDB4ZTBkMTE2MzgsMHg1YWZmZmZiZiwweGUwOTIyZmE0LAorMHhlMmExMTAwMCwweGUxYjBmMDBlLDB4ZTNhMDMwMDAsMHhlM2EwMjAwMCwKKzB4ZTNhMDEwMDAsMHhlM2EwNDAwMCwweGUxYjBmMDBlLDB4ZTFhMDcwMDAsCisweGUxYTA4MDAxLDB4ZTFhMGEwMDIsMHhlMWEwYjAwMywweGUwMjAwMDA3LAorMHhlMTkxNDAwMiwweDExOTg0MDBhLDB4MGFmZmZmZjIsMHhlM2IwNTRmZiwKKzB4ZTBhMzMwMGIsMHhlMTg1YjQyNSwweGUwNDMzOTJiLDB4ZTkyYzQyMDksCisweGUxYTA0ODIxLDB4ZTFjMTUwMGIsMHhlMWEwNjgyMiwweGUxYzI3MDBiLAorMHhlMWM4OTAwYiwweGUxYTA4ODI4LDB4ZTFjYWIwMGIsMHhlMWEwYTgyYSwKKzB4ZTAwMzBiOTYsMHhlMDAyMGI5NCwweGUwMDEwOTk0LDB4ZTAwMDBhOTcsCisweGUwOTMzMDAwLDB4ZTAwMDBhOTUsMHhlMGIyMjAwMCwweGUwMDAwODk1LAorMHhlMGIxMTAwMCwweDMzYTBlMDAwLDB4MjNhMGUwMDEsMHhlMDAwMDk5NiwKKzB4ZTA5MjIwMDAsMHhlMmIxMTAwMCwweGUyYWVlMDAwLDB4ZTAwMDA4OTcsCisweGUwOTIyMDAwLDB4ZTJiMTEwMDAsMHhlMmFlZTAwMCwweGUxOGVlODAzLAorMHhlMWEwMzgyMywweGUxODMzODAyLDB4ZTFhMDI4MjIsMHhlMTgyMjgwMSwKKzB4ZTFhMDE4MjEsMHhlMTgxMTgwZSwweGUzY2VlMGZmLDB4ZTAwMDBiOTUsCisweGUwMGIwYjk3LDB4ZTA5ZWIwMGIsMHhlMGIzMzAwMCwweGUwMDAwODk2LAorMHhlMGIyMjAwMCwweGUwMDAwODk0LDB4ZTBhMTEwMDAsMHhlMDAwMGE5NCwKKzB4ZTAwYTBhOTYsMHhlMDlhYTAwMywweGUwYjIyMDAwLDB4ZTJhMTEwMDAsCisweGUwMDAwOTk3LDB4ZTA5YTQwMDAsMHhlMDAwMDk5NSwweGUwYjIyMDAwLAorMHhlMmIxMTAwMCwweGU4YmM0MjA5LDB4NGEwMDAwMDUsMHhlMDliYjAwYiwKKzB4ZTBiNDQwMDQsMHhlMGIyMjAwMiwweGUwYjExMDAxLDB4ZTI0MzMwMDEsCisweDVhZmZmZmY5LDB4ZTA5MjJmYTQsMHhlMmIxMTAwMCwweDMxYjBmMDBlLAorMHhlM2EwMTEwMiwweGUyODMzMDAxLDB4ZTFhMDQwYTQsMHhlMWIwZjAwZSwKKzB4ZTFhMDcwMDAsMHhlMWEwODAwMSwweGUxYTBhMDAyLDB4ZTFhMGIwMDMsCisweGUzYTAwMDAwLDB4ZTNhMDExMDIsMHhlM2IwMjEwMCwweGUyZTIzOTAxLAorMHhlMDIwMDAwNywweGUxOTE0MDAyLDB4MTE5ODQwMGEsMHgwYWZmZmY5ZCwKKzB4ZTA0MzMwMGIsMHhlMjgzMzkwMSwweGUyNDMzMDAxLDB4ZTNhMGIwMDAsCisweGUwNTI1MDBhLDB4ZTBkMTQwMDgsMHgyM2EwMTAwMywweDJhMDAwMDBjLAorMHhlMWEwNTAwMiwweGUxYTA0MDAxLDB4ZTNhMDEwMDEsMHhlMjQzMzAwMSwKKzB4ZTA5NTUwMDUsMHhlMGI0NDAwNCwweGUyYWJiMDAwLDB4ZTA1NTcwMGEsCisweGUwZDQ2MDA4LDB4MzFiMGIwYWIsMHgyMWEwNTAwNywweDIxYTA0MDA2LAorMHhlMGExMTAwMSwweGUwOTU1MDA1LDB4ZTBiNDQwMDQsMHhlMmFiYjAwMCwKKzB4ZTA1NTcwMGEsMHhlMGQ0NjAwOCwweDMxYjBiMGFiLDB4MjFhMDUwMDcsCisweDIxYTA0MDA2LDB4ZTBhMTEwMDEsMHhlMDk1NTAwNSwweGUwYjQ0MDA0LAorMHhlMmFiYjAwMCwweGUwNTU3MDBhLDB4ZTBkNDYwMDgsMHgzMWIwYjBhYiwKKzB4MjFhMDUwMDcsMHgyMWEwNDAwNiwweGUwYTExMDAxLDB4ZTA5NTUwMDUsCisweGUwYjQ0MDA0LDB4ZTJhYmIwMDAsMHhlMDU1NzAwYSwweGUwZDQ2MDA4LAorMHgzMWIwYjBhYiwweDIxYTA1MDA3LDB4MjFhMDQwMDYsMHhlMGIxMTAwMSwKKzB4M2FmZmZmZGEsMHhlMTk0MjAwNSwweDAxYjBmMDBlLDB4ZTNhMDIwMDEsCisweGUwOTU1MDA1LDB4ZTBiNDQwMDQsMHhlMmFiYjAwMCwweGUwNTU3MDBhLAorMHhlMGQ0NjAwOCwweDMxYjBiMGFiLDB4MjFhMDUwMDcsMHgyMWEwNDAwNiwKKzB4ZTBhMjIwMDIsMHhlMDk1NTAwNSwweGUwYjQ0MDA0LDB4ZTJhYmIwMDAsCisweGUwNTU3MDBhLDB4ZTBkNDYwMDgsMHgzMWIwYjBhYiwweDIxYTA1MDA3LAorMHgyMWEwNDAwNiwweGUwYTIyMDAyLDB4ZTA5NTUwMDUsMHhlMGI0NDAwNCwKKzB4ZTJhYmIwMDAsMHhlMDU1NzAwYSwweGUwZDQ2MDA4LDB4MzFiMGIwYWIsCisweDIxYTA1MDA3LDB4MjFhMDQwMDYsMHhlMGEyMjAwMiwweGUwOTU1MDA1LAorMHhlMGI0NDAwNCwweGUyYWJiMDAwLDB4ZTA1NTcwMGEsMHhlMGQ0NjAwOCwKKzB4MzFiMGIwYWIsMHgyMWEwNTAwNywweDIxYTA0MDA2LDB4ZTBiMjIwMDIsCisweDNhZmZmZmRhLDB4ZTA5NTUwMDUsMHhlMGI0NDAwNCwweDJhMDAwMDAxLAorMHhlMTU0MDAwOCwweDAxNTUwMDBhLDB4ZTJiMjIwMDAsMHhlMmIxMTAwMCwKKzB4MzFiMGYwMGUsMHhlMmEzMzAwMCwweGUzYTAxMTAyLDB4ZTFiMGYwMGUsCisweGUxYjA0ODgzLDB4MGFmZmZmMzcsMHhlMjgzMzkwMSwweGUyNDMzMDAxLAorMHhlMWIwMzBhMywweGUxYTA1MDAyLDB4MzI0MTQxMDIsMHgyMjQxNDEwMSwKKzB4MzNhMDcyMDEsMHgyM2EwNzIwMiwweGUzYTAxMTAyLDB4ZTA5NTUwMDUsCisweGUwYjQ0MDA0LDB4ZTAyMTYwMDcsMHgzMTU0MDAwNiwweDIwNDQ0MDA2LAorMHgyMDIxMTA4NywweGUxYjA3MGU3LDB4NWFmZmZmZjcsMHhlMTk0MjAwNSwKKzB4MDFiMGYwMGUsMHhlM2EwMjAwMCwweGUwOTU1MDA1LDB4ZTBiNDQwMDQsCisweGUwYTAwMDAwLDB4ZTAyMjYwMDcsMHhlMDU1YTAwNiwweGUwZDQ4MDAxLAorMHgzMWIwMDBhMCwweDIxYTA1MDBhLDB4MjFhMDQwMDgsMHgyMDIyMjA4NywKKzB4MjAyMTFmYTcsMHhlMWIwNzBhNywweDFhZmZmZmYyLDB4ZTA5NTUwMDUsCisweGUwYjQ0MDA0LDB4ZTBiNzAwMDcsMHhlMGQ1YTAwMiwweGUwZDQ4MDAxLAorMHgzMWIwMDBhMCwweDIxYTA1MDBhLDB4MjFhMDQwMDgsMHgyMjIyMjAwMSwKKzB4MjNhMDcxMDIsMHhlM2EwMDAwMCwweGUwOTc3MDA3LDB4ZTBiNTUwMDUsCisweGUwYjQ0MDA0LDB4MmEwMDAwMDIsMHhlMTU0MDAwMSwweDAxNTUwMDAyLAorMHgwMzU3MDEwMSwweGUyYjIyMDAwLDB4ZTJiMTEwMDAsMHhlMmEzMzAwMCwKKzB4MjNhMDExMDIsMHhlMWIwZjAwZSwweGUxYjA3MDA0LDB4NDI2NDQwMDAsCisweGUzYTBiOTAxLDB4ZTNhMGEwMDAsMHhlMWEwODAwNCwweGUxYjA0ODI4LAorMHgwMWEwODgwOCwweDEyOGJiMDEwLDB4ZTFiMDRjMjgsMHgwMWEwODQwOCwKKzB4MTI4YmIwMDgsMHhlMWIwNGUyOCwweDAxYTA4MjA4LDB4MTI4YmIwMDQsCisweGUxYjA0ZjI4LDB4MDFhMDgxMDgsMHgxMjhiYjAwMiwweGUxYjA0ZmE4LAorMHgwMWEwODA4OCwweDAyNGJiMDAxLDB4ZTFiMGYwMGUsMHhlMWEwNzAwMCwKKzB4ZTFhMGIwMDMsMHhlMjRiNDBmZSwweGUyNTQ0YzNmLDB4ZGEwMDAwMTEsCisweGUyNzQ1MDIwLDB4NGEwMDAwMDMsMHhlM2EwYTAwMCwweGUxYTA4NTMxLAorMHhlMWEwODUxOCwweGUxYjBmMDBlLDB4ZTFhMDgwMDEsMHhlMWEwYTAwMiwKKzB4ZTI3NDUwNDAsMHg0MWIwZjAwZSwweGUxYTBhNTNhLDB4ZTFhMGE1MWEsCisweGUxYjBmMDBlLDB4MDNhMDQwMDEsMHgwM2EwODEwMiwweGUzYTBhMDAwLAorMHgwMjhiYjAwMSwweDAxYjBmMDBlLDB4ZTNhMDQwMDAsMHhlM2EwODAwMCwKKzB4ZTNhMGEwMDAsMHhlM2EwYjAwMCwweGUxYjBmMDBlLDB4ZTFhMDcwMDAsCisweGUxYTBiMDAzLDB4ZTI0YjQwZmUsMHhlMjU0NGMzZiwweGRhZmZmZmYwLAorMHhlMjc0NTAyMCwweDRhMDAwMDA3LDB4ZTNhMGEwMDAsMHhlMWIwNDUzMSwKKzB4ZTJhNDQwMDAsMHhlMWIwODUxNCwweDMxYjBmMDBlLDB4ZTFhMDgwNjgsCisweGUyOGJiMDAxLDB4ZTFiMGYwMGUsMHhlMWEwODAwMSwweGUxYTBhMDAyLAorMHhlMjc0NTA0MCwweGUzZTA0MDAwLDB4NDFiMGYwMGUsMHhlMWIwYTUzYSwKKzB4ZTJhYWEwMDAsMHhlMWIwYTUxYSwweGUyYjg4MDAwLDB4MzFiMGYwMGUsCisweGUxYTBhMGFhLDB4ZTE4YWFmODgsMHhlMWEwODA2OCwweGUyOGJiMDAxLAorMHhlMWIwZjAwZSwweGUzOGVlMTAxLDB4ZTI0MzQwZmUsMHhlMjU0NGMzZiwKKzB4ZGEwMDAwMzIsMHhlMjc0NTAyMCwweDRhMDAwMDE4LDB4ZTFhMDg0MTEsCisweDAxYTA4MDAyLDB4MTFhMGEwMDIsMHgwM2EwYTAwMCwweGUzYTAyMDAwLAorMHhlMWEwMTUzMSwweGUyMTk0MDYwLDB4MWEwMDAwMDcsMHhlMTlhYTA4OCwKKzB4MDAwODhmODEsMHhlMDkxMWZhOCwweDMxYjAxNTExLDB4MzFiMGYwMGUsCisweGUxYTAxMDYxLDB4ZTI4MzMwMDEsMHhlMWIwZjAwZSwweGUzNTQwMDYwLAorMHgxMTk4YTAwYSwweDBhMDAwMDAzLDB4ZTAzMDRkMDQsMHg1YTAwMDAwMSwKKzB4ZTI5MTEwMDEsMHhlYWZmZmZmMywweGUxYTAxNTExLDB4ZTFiMGYwMGUsCisweGUyNzQ1MDQwLDB4ZDFiMGYwMGUsMHhlMjQ0NDAyMCwweGUxYTA4NDEyLAorMHhlMWIwMjUzMiwweGUyMTk0MDYwLDB4MWEwMDAwMGEsMHhlMWIwYTA4OCwKKzB4MDAwODhmODIsMHhlMDgyMmZhOCwweGUxYjAyNTEyLDB4ZTJiMTEwMDAsCisweDMxYjBmMDBlLDB4ZTFhMDIwYTIsMHhlMTgyMmY4MSwweGUxYTAxMDYxLAorMHhlMjgzMzAwMSwweGUxYjBmMDBlLDB4ZTM1NDAwNjAsMHgxMzU4MDAwMCwKKzB4MGFmZmZmZjQsMHhlMDMwNGQwNCwweDQyODIyMDAxLDB4ZWFmZmZmZjEsCisweDBhMDAwMDExLDB4ZTIxOTQwNjAsMHgxYTAwMDAwNiwweGUxOTE4MDAyLAorMHgwMWIwZjAwZSwweGUzYTAxMDAwLDB4ZTNhMDIwMDAsMHhlM2EwMzAwMCwKKzB4ZTNhMDQwMDgsMHhlMWEwZjAwZSwweGUxOTE4MDAyLDB4MTM1NDAwNjAsCisweDBhZmZmZmY1LDB4ZTAzMDRkMDQsMHg1YWZmZmZmMywweGUzYTAxMTAyLAorMHhlM2IwMjEwMCwweGUyZTIzOTAxLDB4ZTFiMGYwMGUsMHhlMjE5NDA2MCwKKzB4MWFmZmZmZjQsMHhlMTkyNDA4MSwweDFhZmZmZmY3LDB4ZWFmZmZmZWEsCisweGUxYTA0MDAwLDB4ZTFhMDAwMDcsMHhlMWEwNzAwNCwweGUxYTA0MDAxLAorMHhlMWEwMTAwOCwweGUxYTA4MDA0LDB4ZTFhMDQwMDIsMHhlMWEwMjAwYSwKKzB4ZTFhMGEwMDQsMHhlMWEwNDAwMywweGUxYTAzMDBiLDB4ZTFhMGIwMDQsCisweGUxYjBmMDBlLDB4ZTIwOWJhMDcsMHhlMDhjNTQyYiwweGUyMDk3ODBmLAorMHhlNzlkYTcyNywweGUyMTk4MGZmLDB4ZTA0YTgxMDgsMHgxNzhkODcyNywKKzB4ZTIxOTk5MDIsMHhlMzg5OTkwMSwweGUxYTA5Nzg5LDB4ZTRiYTYwMDQsCisweDE0YmE3MDA0LDB4ZTg4NTAzYzAsMHhlYWZmZmNhZSwweGUyMDliYTA3LAorMHhlMDhjNTQyYiwweGUyMDk3ODBmLDB4ZTc5ZGE3MjcsMHhlMjE5ODBmZiwKKzB4ZTA0YTgxMDgsMHgxNzhkODcyNywweGUyMTk5OTAyLDB4ZTM4OTk5MDUsCisweGUxYTA5Nzg5LDB4ZTRiYTYwMDQsMHhlNGJhNzAwNCwweGU0YmE4MDAwLAorMHhlODg1MDNjMCwweGVhZmZmYzlmLDB4ZTIwOWJhMDcsMHhlMDhjNTQyYiwKKzB4ZTIwOTc4MGYsMHhlNzlkYTcyNywweGUyMTk4MGZmLDB4ZTA4YTgxMDgsCisweDE3OGQ4NzI3LDB4ZTIxOTk5MDIsMHhlMzg5OTkwMSwweGUxYTA5Nzg5LAorMHhlNGJhNjAwNCwweDE0YmE3MDA0LDB4ZTg4NTAzYzAsMHhlYWZmZmM5MSwKKzB4ZTIwOWJhMDcsMHhlMDhjNTQyYiwweGUyMDk3ODBmLDB4ZTc5ZGE3MjcsCisweGUyMTk4MGZmLDB4ZTA4YTgxMDgsMHgxNzhkODcyNywweGUyMTk5OTAyLAorMHhlMzg5OTkwNSwweGUxYTA5Nzg5LDB4ZTRiYTYwMDQsMHhlNGJhNzAwNCwKKzB4ZTRiYTgwMDAsMHhlODg1MDNjMCwweGVhZmZmYzgyLDB4ZTIwOWJhMDcsCisweGUwOGNjNDJiLDB4ZTIwOTc4MGYsMHhlMzM3MDgwZiwweDE3OWRhNzI3LAorMHhlMjE5ODBmZiwweGUwNGFhMTA4LDB4ZTIxOTk5MDIsMHhlMzg5OTkwMSwKKzB4ZTFhMGI3ODksMHhlNGJhODAwNCwweDE0YmE5MDA0LDB4ZTg4YzBmMDAsCisweGVhZmZmYzgzLDB4ZTIwOWJhMDcsMHhlMDhjNTQyYiwweGUyMDk3ODBmLAorMHhlNzlkYTcyNywweGUyMTk4MGZmLDB4ZTA0YWExMDgsMHgxNzhkYTcyNywKKzB4ZTIxOTk5MDIsMHhlMzg5OTkwMSwweGUxYTA5Nzg5LDB4ZTRiYTYwMDQsCisweDE0YmE3MDA0LDB4ZTg4NTAzYzAsMHhlYWZmZmM2NiwweGUyMDliYTA3LAorMHhlMDhjYzQyYiwweGUyMDk3ODBmLDB4ZTMzNzA4MGYsMHgxNzlkYTcyNywKKzB4ZTIxOTgwZmYsMHhlMDRhYTEwOCwweGUyMTk5OTAyLDB4ZTM4OTk5MDUsCisweGUxYTBiNzg5LDB4ZTRiYTgwMDQsMHhlNGJhOTAwNCwweGU0YmFhMDAwLAorMHhlODhjMGYwMCwweGVhZmZmYzY2LDB4ZTIwOWJhMDcsMHhlMDhjNTQyYiwKKzB4ZTIwOTc4MGYsMHhlNzlkYTcyNywweGUyMTk4MGZmLDB4ZTA0YWExMDgsCisweDE3OGRhNzI3LDB4ZTIxOTk5MDIsMHhlMzg5OTkwNSwweGUxYTA5Nzg5LAorMHhlNGJhNjAwNCwweGU0YmE3MDA0LDB4ZTRiYTgwMDAsMHhlODg1MDNjMCwKKzB4ZWFmZmZjNDgsMHhlMjA5YmEwNywweGUwOGNjNDJiLDB4ZTIwOTc4MGYsCisweGUzMzcwODBmLDB4MTc5ZGE3MjcsMHhlMjE5ODBmZiwweGUwOGFhMTA4LAorMHhlMjE5OTkwMiwweGUzODk5OTAxLDB4ZTFhMGI3ODksMHhlNGJhODAwNCwKKzB4MTRiYTkwMDQsMHhlODhjMGYwMCwweGVhZmZmYzQ5LDB4ZTIwOWJhMDcsCisweGUwOGM1NDJiLDB4ZTIwOTc4MGYsMHhlNzlkYTcyNywweGUyMTk4MGZmLAorMHhlMDhhYTEwOCwweDE3OGRhNzI3LDB4ZTIxOTk5MDIsMHhlMzg5OTkwMSwKKzB4ZTFhMDk3ODksMHhlNGJhNjAwNCwweDE0YmE3MDA0LDB4ZTg4NTAzYzAsCisweGVhZmZmYzJjLDB4ZTIwOWJhMDcsMHhlMDhjYzQyYiwweGUyMDk3ODBmLAorMHhlMzM3MDgwZiwweDE3OWRhNzI3LDB4ZTIxOTgwZmYsMHhlMDhhYTEwOCwKKzB4ZTIxOTk5MDIsMHhlMzg5OTkwNSwweGUxYTBiNzg5LDB4ZTRiYTgwMDQsCisweGU0YmE5MDA0LDB4ZTRiYWEwMDAsMHhlODhjMGYwMCwweGVhZmZmYzJjLAorMHhlMjA5YmEwNywweGUwOGM1NDJiLDB4ZTIwOTc4MGYsMHhlNzlkYTcyNywKKzB4ZTIxOTgwZmYsMHhlMDhhYTEwOCwweDE3OGRhNzI3LDB4ZTIxOTk5MDIsCisweGUzODk5OTA1LDB4ZTFhMDk3ODksMHhlNGJhNjAwNCwweGU0YmE3MDA0LAorMHhlNGJhODAwMCwweGU4ODUwM2MwLDB4ZWFmZmZjMGUsMHhlMjA5NWEwNywKKzB4ZTA4YzU0MjUsMHhlODk1MDAwZiwweGUzYTA0MDAyLDB4ZTAwNDQ3MjksCisweGUzODQ0MDAxLDB4ZTEzNDBlYTMsMHhlMTg0NGQyMywweGUyOGY3MDA0LAorMHhlMjhmNWY2ZiwweDEwODVmMTA0LDB4ZTIwOTc4MGYsMHhlNzlkYTcyNywKKzB4ZTIxOTgwZmYsMHhlMDRhODEwOCwweDE3OGQ4NzI3LDB4ZTRhYTAwMDQsCisweGUzMTMwMTAxLDB4MTRhYTEwMDAsMHhlYWZmZmJmYSwweGUyMDk1YTA3LAorMHhlMDhjNTQyNSwweGU4OTUwMDBmLDB4ZTNhMDQwMDIsMHhlMDA0NDcyOSwKKzB4ZTM4NDQwMDUsMHhlMTM0MGVhMywweGUxODQ0ZDIzLDB4ZTI4ZjcwMDQsCisweGUyOGY1ZjViLDB4MTA4NWYxMDQsMHhlMjA5NzgwZiwweGU3OWRhNzI3LAorMHhlMjE5ODBmZiwweGUwNGE4MTA4LDB4MTc4ZDg3MjcsMHhlNGFhMDAwNCwKKzB4ZTRhYTEwMDQsMHhlNGFhMjAwMCwweGVhZmZmYmU2LDB4ZTIwOTVhMDcsCisweGUwOGM1NDI1LDB4ZTg5NTAwMGYsMHhlM2EwNDAwMiwweGUwMDQ0NzI5LAorMHhlMzg0NDAwMSwweGUxMzQwZWEzLDB4ZTE4NDRkMjMsMHhlMjhmNzAwNCwKKzB4ZTI4ZjVmNDcsMHgxMDg1ZjEwNCwweGUyMDk3ODBmLDB4ZTc5ZGE3MjcsCisweGUyMTk4MGZmLDB4ZTA4YTgxMDgsMHgxNzhkODcyNywweGU0YWEwMDA0LAorMHhlMzEzMDEwMSwweDE0YWExMDAwLDB4ZWFmZmZiZDIsMHhlMjA5NWEwNywKKzB4ZTA4YzU0MjUsMHhlODk1MDAwZiwweGUzYTA0MDAyLDB4ZTAwNDQ3MjksCisweGUzODQ0MDA1LDB4ZTEzNDBlYTMsMHhlMTg0NGQyMywweGUyOGY3MDA0LAorMHhlMjhmNTBjYywweDEwODVmMTA0LDB4ZTIwOTc4MGYsMHhlNzlkYTcyNywKKzB4ZTIxOTgwZmYsMHhlMDhhODEwOCwweDE3OGQ4NzI3LDB4ZTRhYTAwMDQsCisweGU0YWExMDA0LDB4ZTRhYTIwMDAsMHhlYWZmZmJiZSwweGUyMDk1YTA3LAorMHhlMDhjNTQyNSwweGU4OTUwMDBmLDB4ZTNhMDQwMDIsMHhlMDA0NDcyOSwKKzB4ZTM4NDQwMDEsMHhlMTM0MGVhMywweGUxODQ0ZDIzLDB4ZTI4ZjcwMDQsCisweGUyOGY1MDdjLDB4MTA4NWYxMDQsMHhlMjA5NzgwZiwweGUzMzcwODBmLAorMHgxNzlkYTcyNywweGUyMTk4MGZmLDB4ZTA0YWExMDgsMHhlNGFhMDAwNCwKKzB4ZTMxMzAxMDEsMHgxNGFhMTAwMCwweGVhZmZmYmIyLDB4ZTIwOTVhMDcsCisweGUwOGM1NDI1LDB4ZTg5NTAwMGYsMHhlM2EwNDAwMiwweGUwMDQ0NzI5LAorMHhlMzg0NDAwMSwweGUxMzQwZWEzLDB4ZTE4NDRkMjMsMHhlMjhmNzAwNCwKKzB4ZTI4ZjUwMmMsMHgxMDg1ZjEwNCwweGUyMDk3ODBmLDB4ZTc5ZGE3MjcsCisweGUyMTk4MGZmLDB4ZTA0YWExMDgsMHgxNzhkYTcyNywweGU0YWEwMDA0LAorMHhlMzEzMDEwMSwweDE0YWExMDAwLDB4ZWFmZmZiOTYsMHhlMDhmZjEwNCwKKzB4ZWIwMDAzNmIsMHhlMWEwZjAwNywweGVhMDAwMGI2LDB4ZWIwMDAzNjgsCisweGVhMDAwMGVhLDB4ZWIwMDAzNjYsMHhlYTAwMDEyMywweGViMDAwMzY0LAorMHhlYTAwMDFjYSwweGVhMDAwMTI0LDB4ZTFhMGYwMDcsMHhlYjAwMDM2MCwKKzB4ZWEwMDAxMzQsMHhlYjAwMDM1ZSwweGVhMDAwMTRiLDB4ZWIwMDAzNWMsCisweGVhMDAwMWJkLDB4ZWIwMDAzNWEsMHhlYjAwMDM1OSwweGViMDAwMzU4LAorMHhlYjAwMDM1NywweGViMDAwMzU2LDB4ZWIwMDAzNTUsMHhlYjAwMDM1NCwKKzB4ZWIwMDAzNTMsMHhlYTAwMDE1NiwweGVhMDAwMTZmLDB4ZWIwMDAzNTAsCisweGUxYTBmMDA3LDB4ZWIwMDAzNGUsMHhlYTAwMDE4YywweGViMDAwMzRjLAorMHhlYTAwMDFhZCwweGViMDAwMzRhLDB4ZWIwMDAzNDksMHhlYjAwMDM0OCwKKzB4ZWIwMDAzNDcsMHhlYjAwMDM0NiwweGViMDAwMzQ1LDB4ZWIwMDAzNDQsCisweGViMDAwMzQzLDB4ZWEwMDAxOWYsMHhlYTAwMDA4ZCwweGViMDAwMzQwLAorMHhlYTAwMDBjMSwweGViMDAwMzNlLDB4ZTFhMGYwMDcsMHhlYjAwMDMzYywKKzB4ZWEwMDAxOWQsMHhlYjAwMDMzYSwweGViMDAwMzM5LDB4ZWIwMDAzMzgsCisweGViMDAwMzM3LDB4ZWIwMDAzMzYsMHhlYjAwMDMzNSwweGViMDAwMzM0LAorMHhlYjAwMDMzMywweGVhMDAwMjRmLDB4ZWEwMDAyNGUsMHhlYjAwMDMzMCwKKzB4ZWEwMDAyNGMsMHhlYjAwMDMyZSwweGVhMDAwMjRhLDB4ZWIwMDAzMmMsCisweGUxYTBmMDA3LDB4ZTIwOTVhMDcsMHhlMDhjNTQyNSwweGU4OTUwMDBmLAorMHhlM2EwNDAwMiwweGUwMDQ0NzI5LDB4ZTM4NDQwMDUsMHhlMTM0MGVhMywKKzB4ZTE4NDRkMjMsMHhlMjhmNzAwNCwweGUyNGY1ZjRiLDB4MTA4NWYxMDQsCisweGUyMDk3ODBmLDB4ZTMzNzA4MGYsMHgxNzlkYTcyNywweGUyMTk4MGZmLAorMHhlMDRhYTEwOCwweGU0YWEwMDA0LDB4ZTRhYTEwMDQsMHhlNGFhMjAwNCwKKzB4ZWFmZmZiNDgsMHhlMjA5NWEwNywweGUwOGM1NDI1LDB4ZTg5NTAwMGYsCisweGUzYTA0MDAyLDB4ZTAwNDQ3MjksMHhlMzg0NDAwNSwweGUxMzQwZWEzLAorMHhlMTg0NGQyMywweGUyOGY3MDA0LDB4ZTI0ZjVmNWYsMHgxMDg1ZjEwNCwKKzB4ZTIwOTc4MGYsMHhlNzlkYTcyNywweGUyMTk4MGZmLDB4ZTA0YWExMDgsCisweDE3OGRhNzI3LDB4ZTRhYTAwMDQsMHhlNGFhMTAwNCwweGU0YWEyMDAwLAorMHhlYWZmZmIyYywweGUyMDk1YTA3LDB4ZTA4YzU0MjUsMHhlODk1MDAwZiwKKzB4ZTNhMDQwMDIsMHhlMDA0NDcyOSwweGUzODQ0MDAxLDB4ZTEzNDBlYTMsCisweGUxODQ0ZDIzLDB4ZTI4ZjcwMDQsMHhlMjRmNWY3MywweDEwODVmMTA0LAorMHhlMjA5NzgwZiwweGUzMzcwODBmLDB4MTc5ZGE3MjcsMHhlMjE5ODBmZiwKKzB4ZTA4YWExMDgsMHhlNGFhMDAwNCwweGUzMTMwMTAxLDB4MTRhYTEwMDAsCisweGVhZmZmYjIwLDB4ZTIwOTVhMDcsMHhlMDhjNTQyNSwweGU4OTUwMDBmLAorMHhlM2EwNDAwMiwweGUwMDQ0NzI5LDB4ZTM4NDQwMDEsMHhlMTM0MGVhMywKKzB4ZTE4NDRkMjMsMHhlMjhmNzAwNCwweGUyNGY1Zjg3LDB4MTA4NWYxMDQsCisweGUyMDk3ODBmLDB4ZTc5ZGE3MjcsMHhlMjE5ODBmZiwweGUwOGFhMTA4LAorMHgxNzhkYTcyNywweGU0YWEwMDA0LDB4ZTMxMzAxMDEsMHgxNGFhMTAwMCwKKzB4ZWFmZmZiMDQsMHhlMjA5NWEwNywweGUwOGM1NDI1LDB4ZTg5NTAwMGYsCisweGUzYTA0MDAyLDB4ZTAwNDQ3MjksMHhlMzg0NDAwNSwweGUxMzQwZWEzLAorMHhlMTg0NGQyMywweGUyOGY3MDA0LDB4ZTI0ZjVmOWIsMHgxMDg1ZjEwNCwKKzB4ZTIwOTc4MGYsMHhlMzM3MDgwZiwweDE3OWRhNzI3LDB4ZTIxOTgwZmYsCisweGUwOGFhMTA4LDB4ZTRhYTAwMDQsMHhlNGFhMTAwNCwweGU0YWEyMDA0LAorMHhlYWZmZmFmOCwweGUyMDk1YTA3LDB4ZTA4YzU0MjUsMHhlODk1MDAwZiwKKzB4ZTNhMDQwMDIsMHhlMDA0NDcyOSwweGUzODQ0MDA1LDB4ZTEzNDBlYTMsCisweGUxODQ0ZDIzLDB4ZTI4ZjcwMDQsMHhlMjRmNWZhZiwweDEwODVmMTA0LAorMHhlMjA5NzgwZiwweGU3OWRhNzI3LDB4ZTIxOTgwZmYsMHhlMDhhYTEwOCwKKzB4MTc4ZGE3MjcsMHhlNGFhMDAwNCwweGU0YWExMDA0LDB4ZTRhYTIwMDAsCisweGVhZmZmYWRjLDB4ZTNjMDMxMDIsMHhlMjAwMDEwMiwweGUxYjA1ODgzLAorMHgxMjk1NTgwMiwweDBhMDAwMDBlLDB4ZTMzMjAwMDAsMHgwMTkyMmM4MSwKKzB4ZTIwMTIwODAsMHgwMDAyMjBhMSwweGUwOTExMDAyLDB4MzFhMDEwODEsCisweGUyYTMzMDAwLDB4ZTI1MzNkZmUsMHg5YTAwMDAxYywweGUzNTMwMGZmLAorMHgzMTgwMGI4MywweDMxODAwNGExLDB4MzNhMDMyMDIsMHgzMWEwZjAwNywKKzB4ZWEwMDAwMDgsMHhlMWIwNGMwMywweGUxODAwMGE0LDB4ZTNhMDMyMDIsCisweDEzYzExMTAyLDB4MTE4MDA0MjEsMHgxMWEwZjAwNywweGUxOTIyMDAxLAorMHgwMWEwZjAwNywweGVhMDAwMDE1LDB4ZTM4MDA0N2YsMHhlMzgwMDUwMiwKKzB4ZTNhMDMyMDIsMHhlM2EwNDAwNCwweGU1OWM1MDgwLDB4ZTE4NTUwMDQsCisweGU1OGM1MDgwLDB4ZTExNDA4MjUsMHgxMWEwMDAwNCwweDFhMDAwZThhLAorMHhlMzU0MDAwNCwweDExYTBmMDA3LDB4ZTNhMDQwMTAsMHhlYWZmZmZmNSwKKzB4ZTM3MzAwMTcsMHhkYTAwMDAwNSwweGUxYTAxNTIxLDB4ZTM4MTE1MDEsCisweGUyNjMzMDAwLDB4ZTE4MDAzMzEsMHhlM2EwMzIwMiwweGUxYTBmMDA3LAorMHhlM2EwMzIwMiwweGUzYTA0MDA4LDB4ZWFmZmZmZWEsMHhlM2MwMzEwMiwKKzB4ZTIwMDAxMDIsMHhlMWIwNTg4MywweDEyOTU1ODAyLDB4MGEwMDAwMTIsCisweGUxYjA0YjAyLDB4ZTIwMjRiMDEsMHgwMDA0NDBhMiwweGUwOTIyMDA0LAorMHhlMmIxMTAwMCwweGUyYTMzMDAwLDB4ZTA5MjIwMDIsMHhlMGExMTAwMSwKKzB4ZTI1MzNiMGYsMHg5YTAwMDAxOSwweGUyODM0MDAxLDB4ZTM1NDBiMDIsCisweDMxODAwYTAzLDB4MzE4MDA2MjEsMHgzMWEwMWEwMSwweDMxODExNjIyLAorMHgzM2EwMzIwNiwweDMxYTBmMDA3LDB4ZWEwMDAwMGEsMHhlMWIwNGE4MywKKzB4ZTE4MDAwYTQsMHhlM2EwMzIwNiwweDEzYzExMTAyLDB4MTE4MDA1YTEsCisweDExYTAxYTgxLDB4MTE4MTE1YTIsMHgxMWEwZjAwNywweGUxOTIyMDAxLAorMHgwMWEwZjAwNywweGVhMDAwMDE0LDB4ZTM4MDA0N2YsMHhlMzgwMDYwZiwKKzB4ZTNhMDEwMDAsMHhlM2EwMzIwNiwweGUzYTA0MDA0LDB4ZWFmZmZmYzEsCisweGUzNzMwMDM0LDB4ZGEwMDAwMGMsMHhlMWEwMjZhMiwweGUxODIyOTgxLAorMHhlMWEwMTZhMSwweGUzODExNzAyLDB4ZTI2MzMwMDAsMHhlMjUzNDAyMCwKKzB4MjFhMDE0MzEsMHgzMjYzNDAyMCwweDMxODAwMzMxLDB4MzFhMDE0MTEsCisweDMxODExMzMyLDB4ZTNhMDMyMDYsMHhlMWEwZjAwNywweGUzYTAxMDAwLAorMHhlM2EwMzIwNiwweGUzYTA0MDA4LDB4ZWFmZmZmYWUsMHhlMjAwMDEwMiwKKzB4ZTE4MDAwMDMsMHhlM2EwMzIwYSwweGUxYTBmMDA3LDB4ZTNhMDIwMDAsCisweGUxYTAzMDgwLDB4ZTFiMDNjMjMsMHgxMzMzMDBmZiwweDExYTAxNDAwLAorMHgxMzgxMTEwMiwweDEyODMzZGZlLDB4MTFhMGYwMDcsMHhlMTkzMzM4MywKKzB4MTFhMDE0MDAsMHgxM2MxMTEwMiwweDExYTBmMDA3LDB4ZTFiMDE0ODAsCisweDAxYTBmMDA3LDB4ZTNhMDNkZmUsMHg1MjQzMzAwMSwweDUxYjAxMDgxLAorMHg1YWZmZmZmYywweGUxYTBmMDA3LDB4ZTFhMDFlODAsMHhlM2MwMzEwMiwKKzB4ZTIwMDAxMDIsMHhlMTgwMDFhMywweGUzYTAzMjA2LDB4ZTIxMDI2ZmYsCisweDEzMzIwNmZmLDB4MTI4MDAzMGUsMHgxMWEwZjAwNywweGUxODAwMTgyLAorMHhlMzMyMDAwMCwweDExYTBmMDA3LDB4ZTE5MTI2MDAsMHgwMWEwZjAwNywKKzB4ZTFhMDFhMjEsMHhlMTkxMTYwMCwweGUyMDAwMTAyLDB4ZTM4MDAzMGUsCisweDUyNDAwNjAxLDB4NTFiMDEwODEsMHg1YWZmZmZmYywweGUxYTAxMDgxLAorMHhlMTgwMDYyMSwweGUxYTAxYTAxLDB4ZTFhMGYwMDcsMHhlM2EwMjAwMCwKKzB4ZTFhMDMwODAsMHhlMWIwM2MyMywweDEzMzMwMGZmLDB4ZTFhMDE0MDAsCisweDEzODExMTAyLDB4MTI4MzNkZmUsMHhlMjAwMDEwMiwweGUxODAwMDAzLAorMHhlM2EwMzIwYSwweDExYTBmMDA3LDB4ZTE4MDAzODAsMHhlMzEwMDBmZiwKKzB4MTNjMTExMDIsMHgxMWEwZjAwNywweGUxYjAxMDgxLDB4MDFhMGYwMDcsCisweGUzODAwZGZlLDB4NTI0MDAwMDEsMHg1MWIwMTA4MSwweDVhZmZmZmZjLAorMHhlMWEwZjAwNywweGUxYTAzMDgwLDB4ZTFiMDNhYTMsMHgxMjgzNDAwMSwKKzB4MTMzNDBiMDIsMHhlMWEwMjU4MSwweGUxYTAxYWExLDB4ZTE4MTE1ODAsCisweDEzODExMTAyLDB4MTI4MzNiMGYsMHgxMWEwZjAwNywweGUxOTMzMjAzLAorMHgxMWEwZjAwNywweGUwOTIyMDAyLDB4ZTBhMTEwMDEsMHhlMTkyNDAwMSwKKzB4MDFhMGYwMDcsMHhlM2EwM2IwZiwweGUxYjAxMDAxLDB4NTI0MzMwMDEsCisweGUzYTA0MDAwLDB4NTE4NDRmYTIsMHg1MTg0NDA4MSwweDUxYTAyMDgyLAorMHg1MWIwMTAwNCwweDVhZmZmZmY4LDB4ZTFhMGYwMDcsMHhlMWEwMzA4MCwKKzB4ZTFiMDNhYTMsMHgxMjgzNDAwMSwweDEzMzQwYjAyLDB4MGEwMDAwMGYsCisweGUxYjA0MjAxLDB4ZTFhMDFhMjEsMHhlMTgxMTYwMCwweGUyMDE0YzAxLAorMHgwMDA0NDBhMSwweGUwOTExMDA0LDB4ZTJhMzMwMDAsMHhlMjAwMDEwMiwKKzB4ZTI1MzNkMGUsMHg5YWZmZmY0OSwweGUzNTMwMGZmLDB4MzE4MDBiODMsCisweDMxODAwNGExLDB4MzNhMDMyMDIsMHgzMWEwZjAwNywweGVhZmZmZjM1LAorMHhlMTgxMjYwMCwweGUxYTAxYTIxLDB4ZTE4MTE2MDAsMHhlMjAwMDEwMiwKKzB4ZTFiMDRjMDMsMHhlMTgwMDBhNCwweGUzYTAzMjAyLDB4MTE4MDA0YTEsCisweDExYTBmMDA3LDB4ZTMzMjAwMDAsMHgwMWEwZjAwNywweGVhZmZmZjNmLAorMHhlMWEwMzA4MCwweGUxYjAzYWEzLDB4MTI4MzQwMDEsMHgxMzM0MGIwMiwKKzB4ZTFhMDI1ODEsMHhlMWEwMWFhMSwweGUxODExNTgwLDB4MTM4MTExMDIsCisweDEyODMzYjBmLDB4ZTIwMDAxMDIsMHhlMTgwMDAwMywweGUzYTAzMjBhLAorMHgxMWEwZjAwNywweGUxODAwMjAwLDB4ZTMxMDAwZmYsMHgxMWEwZjAwNywKKzB4ZTA5MjIwMDIsMHhlMGExMTAwMSwweGUxOTI0MDAxLDB4MDFhMGYwMDcsCisweGUzODAwYjBmLDB4ZTFiMDEwMDEsMHg1MjQwMDAwMSwweGUzYTA0MDAwLAorMHg1MTg0NGZhMiwweDUxODQ0MDgxLDB4NTFhMDIwODIsMHg1MWIwMTAwNCwKKzB4NWFmZmZmZjgsMHhlMWEwZjAwNywweGUzYzAzMTAyLDB4ZTFhMGYwMDcsCisweDlhMjA5YTg0LDB4ZmJjZmY3OTksMHgwMDAwM2ZmZCwweGU5MmMwMDgwLAorMHhlMjhmNzAwNCwweGUzYzQ0MDA3LDB4ZWFmZmZlMmIsMHhlOGJjMDA4MCwKKzB4ZTFiMDU4ODMsMHgxMjk1NTgwMiwweDBhMDAwMDk5LDB4ZTNhMDU5MDEsCisweGUyNDU1MDAxLDB4ZTE1MzAwMDUsMHgzYTAwMDAwNiwweGUyODU1MDAzLAorMHhlMTUzMDAwNSwweDAzNTEwMjBhLDB4MzNhMDQwMDAsMHgzM2EwNTAwMCwKKzB4MzkyYzRmZjAsMHgzYTAwMDAyMSwweGU5MmM0ZmNmLDB4ZTNhMDA5MDIsCisweGUyNDA0MDAzLDB4ZTA2NDQwODMsMHhlYmZmZmM0NiwweGUyNGJiMDAxLAorMHhlMjRmNDA3OCwweGU4OTQwMDBlLDB4ZWJmZmZiNGIsMHhlM2EwNDkwMSwKKzB4ZTI0NDQwMDIsMHhlMDQzNDAwNCwweGUyNjQ0MDIwLDB4ZTFhMDk0MzEsCisweGUxNTEwNDE5LDB4MDM1MjAwMDAsMHgxMjEwYjEwMiwweDEyODk5MDAxLAorMHhlMjAwYjEwMiwweGU4YmMwMDBmLDB4ZTkyYzBhMDAsMHhlYjAwMDBiZiwKKzB4ZTU5YzQwMDQsMHhlMWIwNDAwNCwweDViZmZmYjkwLDB4NGJmZmZiM2EsCisweGUzYTA1OTAxLDB4ZTI0NTUwMDEsMHhlMTUzMDAwNSwweDNhMDAwMDUxLAorMHhlMjg1NTAwMywweGUxNTMwMDA1LDB4MDM1MTAyMGEsMHgyYTAwMDA0MCwKKzB4ZTNhMDQ5MDEsMHhlMjg0NDAwMiwweGUwNTQ0MDAzLDB4ZTI2NDUwMjAsCisweGUxYTAzNTEyLDB4MTFhMDI0MzIsMHgxMTgyMjUxMSwweDExYTAxNDMxLAorMHhlMWEwNGUyMSwweGUzYTA3MDAzLDB4ZTNjMTEyMGYsMHhlMDkzMzAwMywKKzB4ZTBiMjIwMDIsMHhlMGExMTAwMSwweGUxYTA4MTAxLDB4ZTE4ODhmMjIsCisweGUxYTBhMTAyLDB4ZTE4YWFmMjMsMHhlMDkyMjAwYSwweGUwYTExMDA4LAorMHhlMjU3NzAwMSwweDExYTA0MjA0LDB4MTE4NDRlMjEsMHgxYWZmZmZmMSwKKzB4ZTE5MTUwMDIsMHgwM2EwNjAwMCwweDBhMDAwMDE5LDB4ZTNhMDcwMGYsCisweGUxYTA1MjA1LDB4ZTE4NTVlMjYsMHhlMWEwNjIwNiwweGUxODY2ZTIxLAorMHhlM2MxMTIwZiwweGUwOTIyMDAyLDB4ZTBhMTEwMDEsMHhlMWEwODEwMSwKKzB4ZTE4ODhmMjIsMHhlMDkyMjEwMiwweGUwYTExMDA4LDB4ZTI1NzcwMDEsCisweDFhZmZmZmYyLDB4ZTFhMDUyMDUsMHhlMTg1NWUyNiwweGUxYTA2MjA2LAorMHhlMTg2NmUyMSwweGUxYjAxMjgxLDB4M2EwMDAwMDUsMHhlMjg2NjAwMSwKKzB4ZTE5MTEwMDIsMHgwM2M2NjAwMSwweGUyMDYxMDBmLDB4ZTM1MTAwMGEsCisweDAyNDY2MDAxLDB4ZThiYzAwMDgsMHhlYjAwMDAyMywweGUyMDAwMTAyLAorMHhlMTgwMDIyMSwweGU4YmMwMDgwLDB4ZTE4MDAwYTcsMHhlMTgwMDAwNCwKKzB4ZTFhMDEwMDUsMHhlMWEwMjAwNiwweGUzYTAzMjBlLDB4ZThiYzRmYzAsCisweGUxYTBmMDA3LDB4ZThiYzAwMzAsMHhlMzE1MDEwMiwweDEyNjQ0MDAwLAorMHhlMjg0NDAwMSwweGUyMTQ1MTAyLDB4MTI2NDQwMDAsMHhlOTJjMDAzMCwKKzB4ZTNhMDc5MDEsMHhlM2EwODIwYSwweGUzYTBhMDAwLDB4ZTI4N2IwMDIsCisweGViZmZmYjNhLDB4ZWFmZmZmYjEsMHhlOGJjMDAzMCwweGUzMTUwMTAyLAorMHgxMjY0NDAwMCwweGUyNDQ0MDAxLDB4ZTIxNDUxMDIsMHgxMjY0NDAwMCwKKzB4ZTkyYzAwMzAsMHhlM2EwNzkwMSwweGUzYTA4MjBhLDB4ZTNhMGEwMDAsCisweGUyODdiMDAyLDB4ZWJmZmZhZDgsMHhlYWZmZmZhNCwweGUxYTAyMDAzLAorMHhlM2EwMzAxMCwweGUwOTIyMDAyLDB4MzM1MjAyMGEsMHgyMjQyMjIwYSwKKzB4ZTBiMzMwMDMsMHgzYWZmZmZmYSwweGUxYTAxNjIyLDB4ZTM1MzAwNjQsCisweGEyNDMzMDY0LDB4YTI4MTEyMDEsMHhhYWZmZmZmYiwweGUzNTMwMDBhLAorMHhhMjQzMzAwYSwweGEyODExNDAxLDB4YWFmZmZmZmIsMHhlMTgxMWEwMywKKzB4ZTFiMGYwMGUsMHhlMzUzMDAwMCwweDFhMDAwMDBhLDB4ZTE5MTUwMDIsCisweDAzYTAzMjBlLDB4MDNhMDAwMDAsMHgwMWEwZjAwNywweGUzMTEwMTAyLAorMHgxYWZmZmY1ZCwweGUwOTIyMDAyLDB4ZTBiMTEwMDEsMHhlMjQzMzAwMSwKKzB4NWFmZmZmZmIsMHhlYWZmZmY1OCwweGUyMDAwMTAyLDB4ZTE4MDA2MDMsCisweGUzODAwMzAyLDB4ZTE4MDA5YTEsMHhlMWEwMTY4MSwweGUxODExOWEyLAorMHhlMWEwMjY4MiwweGUzYTAzMjBlLDB4ZTFhMGYwMDcsMHg5MzkyZWU4ZSwKKzB4OTIxZDVkMDcsMHgwMDAwM2ZjMywweGUxOTE1MDAyLDB4MDFiMDVhMDAsCisweDEyMDA1NDBmLDB4MTM1NTA0MGYsMHgwYTAwMDBhYywweGU5MmM0ZmQwLAorMHhlM2EwNzAwMCwweGUzYTA2MDAwLDB4ZTFhMDRhMDAsMHhlM2EwNTAwMywKKzB4ZWIwMDAwOWEsMHhlMWEwNDAwMSwweGUzYTA1MDA4LDB4ZWIwMDAwOTcsCisweGUxYTA0MDAyLDB4ZTNhMDUwMDgsMHhlYjAwMDA5NCwweGUxYTAyMDA3LAorMHhlMWIwMTAwNiwweGUzYTAzMDNlLDB4ZTI4MzM5MDEsMHg0YTAwMDAwMywKKzB4ZTA5MjIwMDIsMHhlMGIxMTAwMSwweGUyNDMzMDAxLDB4NWFmZmZmZmIsCisweGUzYTA2MDAwLDB4ZTNhMDcwMDAsMHhlMWEwNDIwMCwweGUzYTA1MDA0LAorMHhlYjAwMDA4NiwweGUxYTA5MDA3LDB4ZWIwMDAwMGMsMHhlMzEwMDEwMSwKKzB4MWJmZmZhZGUsMHgwYmZmZmE4OCwweGUyNGY3MGE0LDB4ZTg5NzBkMDAsCisweGViZmZmYTg1LDB4ZThiYzRmZDAsMHhlMjkzNTAwMSwweGRhMDAwMDkwLAorMHhlMWIwNTdhNSwweDFhMDAwMGE3LDB4ZTIwNDQwMDcsMHhlYWZmZmQ0NiwKKzB4ZTM1OTAwMTQsMHhkMjhmODA4NCwweGQwODg5MjA5LDB4ZDg5OTBkODAsCisweGQxYjBmMDBlLDB4ZTkyYzQwMGYsMHhlM2EwMTEwMiwweGUzYTAyMDAwLAorMHhlM2EwMDkwMSwweGUyNDAzMDAxLDB4ZTM1OTAwMDAsMHgwYTAwMDAxMSwKKzB4ZTkyYzAwMGYsMHhlMjgzMzAwMywweGUzYjAxMjBhLDB4M2JmZmZhNmEsCisweGUxYjA5MGE5LDB4M2FmZmZmZmMsMHhlOGJjMGQ4MCwweDE5MmMwMDBmLAorMHhlYmZmZmE2OSwweDBhMDAwMDA3LDB4ZThiYzBkODAsMHhlOTJjMDAwZiwKKzB4ZTFhMDAwMDcsMHhlMWEwMTAwOCwweGUxYTAyMDBhLDB4ZTFhMDMwMGIsCisweGViZmZmYTYxLDB4ZWFmZmZmZjEsMHhlMWEwNzAwMCwweGUxYTA4MDAxLAorMHhlMWEwYTAwMiwweGUxYTBiMDAzLDB4ZThiYzQwMGYsMHhlMWIwZjAwZSwKKzB4MDAwMDAwMDAsMHg4MDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDNmZmYsCisweDAwMDAwMDAwLDB4YTAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA0MDAyLAorMHgwMDAwMDAwMCwweGM4MDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwNDAwNSwKKzB4MDAwMDAwMDAsMHhmYTAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDQwMDgsCisweDAwMDAwMDAwLDB4OWM0MDAwMDAsMHgwMDAwMDAwMCwweDAwMDA0MDBjLAorMHgwMDAwMDAwMCwweGMzNTAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwNDAwZiwKKzB4MDAwMDAwMDAsMHhmNDI0MDAwMCwweDAwMDAwMDAwLDB4MDAwMDQwMTIsCisweDAwMDAwMDAwLDB4OTg5NjgwMDAsMHgwMDAwMDAwMCwweDAwMDA0MDE2LAorMHgwMDAwMDAwMCwweGJlYmMyMDAwLDB4MDAwMDAwMDAsMHgwMDAwNDAxOSwKKzB4MDAwMDAwMDAsMHhlZTZiMjgwMCwweDAwMDAwMDAwLDB4MDAwMDQwMWMsCisweDAwMDAwMDAwLDB4OTUwMmY5MDAsMHgwMDAwMDAwMCwweDAwMDA0MDIwLAorMHgwMDAwMDAwMCwweGJhNDNiNzQwLDB4MDAwMDAwMDAsMHgwMDAwNDAyMywKKzB4MDAwMDAwMDAsMHhlOGQ0YTUxMCwweDAwMDAwMDAwLDB4MDAwMDQwMjYsCisweDAwMDAwMDAwLDB4OTE4NGU3MmEsMHgwMDAwMDAwMCwweDAwMDA0MDJhLAorMHgwMDAwMDAwMCwweGI1ZTYyMGY0LDB4ODAwMDAwMDAsMHgwMDAwNDAyZCwKKzB4MDAwMDAwMDAsMHhlMzVmYTkzMSwweGEwMDAwMDAwLDB4MDAwMDQwMzAsCisweDAwMDAwMDAwLDB4OGUxYmM5YmYsMHgwNDAwMDAwMCwweDAwMDA0MDM0LAorMHgwMDAwMDAwMCwweGIxYTJiYzJlLDB4YzUwMDAwMDAsMHgwMDAwNDAzNywKKzB4MDAwMDAwMDAsMHhkZTBiNmIzYSwweDc2NDAwMDAwLDB4MDAwMDQwM2EsCisweDAwMDAwMDAwLDB4OGFjNzIzMDQsMHg4OWU4MDAwMCwweDAwMDA0MDNlLAorMHgwMDAwMDAwMCwweGFkNzhlYmM1LDB4YWM2MjAwMDAsMHgwMDAwNDA0MSwKKzB4ZTA5NzcwMDcsMHhlMGE2NjAwNiwweGUwOTc4MTA3LDB4ZTBhNmFmMjcsCisweGUwOGE2MTA2LDB4ZTFhMDcwMDgsMHhlMDk3N2UyNCwweGUyYTY2MDAwLAorMHhlMWEwNDIwNCwweGUyNTU1MDAxLDB4MWFmZmZmZjQsMHhlMWIwZjAwZSwKKzB4ZTFhMDMyODAsMHhlMWEwMzhhMywweGUxYTAyNmEyLDB4ZTE4MjI5ODEsCisweGUxYTAxNmExLDB4ZTE4MTE5ODAsMHhlM2MxMTEwMiwweGUyMDQ0MDA3LAorMHhlYWZmZmNiOSwweGUyMTQ0MDA3LDB4MTM1NDAwMDUsMHgwYTAwMDAwMywKKzB4ZTIwMDAxMDIsMHhlMzU0MDAwMSwweDBhZmZmZGEwLDB4ZWFmZmZkZGEsCisweGUyNjMzMDAwLDB4ZTM1MzAwNDAsMHhhYTAwMDAwOCwweGUyNzM1MDIwLAorMHg0MjQzNTAyMCwweDQxYTAyNTMxLDB4NTFhMDIzMzIsMHg1MTgyMjUxMSwKKzB4ZTFhMDEzMzEsMHhlM2EwMzAwMCwweGUyMDQ0MDA3LDB4ZWFmZmZjYTYsCisweGUyMDAwMTAyLDB4ZTNhMDEwMDAsMHhlM2EwMjAwMCwweGUxYTAzZTg0LAorMHhlM2EwNDAwOCwweGVhZmZmZDdiLDB4ZTIxNDQwMDcsMHgwYTAwMDAwMywKKzB4ZTNhMDAwMDAsMHhlMzU0MDAwMywweDBhZmZmZGFlLDB4YmFmZmZkNzEsCisweGUzYTAxMDAwLDB4ZTNiMDIxMDAsMHhlMmUyMzkwMiwweGUyMDAwMTAyLAorMHhlMTgwMDAwMywweGUzNTQwMDAwLDB4MTNhMDMyMGEsMHhlM2EwNDAwNCwKKzB4ZWFmZmZkNmMsMHhlYWZmZmZmZSwweGUyMDlhYTBmLDB4ZTMxOTAwMDgsCisweDFhMDAwMDY5LDB4ZTIwOTUwMDcsMHhlMDhjNTIwNSwweGU4OTUwMDBmLAorMHhlMWIwNGQyMywweGUyOGY3MDAwLDB4MWFmZmZjODcsMHhlMWIwNDg4MywKKzB4MTI5NDQ4MDIsMHgwYTAwMDAyYiwweDVhMDAwMDM5LDB4ZTM1NDA4M2UsCisweGUyMDQ0OGZmLDB4NGEwMDAwNDksMHhlMWEwNDhhNCwweGUyMTk5MDYwLAorMHgxYTAwMDAwZSwweGUyODQ2MDAyLDB4ZTE5MjI2MTEsMHhlM2EwMjEwMSwKKzB4ZTAwMTI0MzIsMHgwMDAyMjBhMSwweGUyNjQ0MDFmLDB4ZTFhMDE0MzEsCisweGUzMzIwMDAwLDB4MTI4MTEwMDEsMHhlMzEwMDEwMiwweDEyNjExMDAwLAorMHhlMDMxMjAwMCwweDRhMDAwMDQ5LDB4ZTc4ZDE1MmEsMHhlYWZmZjgwNSwKKzB4ZTM1OTAwNjAsMHgxYTAwMDAwNSwweGUyNjQ0MDFmLDB4ZTFhMDE0MzEsCisweGUzMTAwMTAyLDB4MTI2MTEwMDAsMHhlNzhkMTUyYSwweGVhZmZmN2ZkLAorMHhlMDMwN2QwOSwweDVhZmZmZmY3LDB4ZTI4NDYwMDEsMHhlMTkyMjYxMSwKKzB4MGFmZmZmZjQsMHhlMjY0NDAxZiwweGUxYTAxNDMxLDB4ZTI4MTEwMDEsCisweGUzMTAwMTAyLDB4MTI2MTEwMDAsMHhlMDMxMjAwMCwweDRhMDAwMDMzLAorMHhlNzhkMTUyYSwweGVhZmZmN2VmLDB4ZTMxMzAwZmYsMHgxYTAwMDAwMywKKzB4ZTE5MjEwMDEsMHgxYTAwMDAwNiwweGU3OGQxNTJhLDB4ZWFmZmY3ZTksCisweGUxOTIxMDAxLDB4MGEwMDAwMjksMHhlMjhmNzBiYywweGUzYTA0MDAxLAorMHhlYWZmZmQyOCwweGUwMjk3MGE5LDB4ZTMxNzAwMjAsMHgwYTAwMDAxMCwKKzB4ZWEwMDAwMDMsMHhlMjE5OTA2MCwweDBhMDAwMDA4LDB4ZTM1OTAwNjAsCisweDBhMDAwMDBiLDB4ZTAzMDdkMDksMHg1YTAwMDAwOSwweGUzYTAxMDAxLAorMHhlMzEwMDEwMiwweDEyNjExMDAwLDB4ZTc4ZDE1MmEsMHhlYWZmZjdkNSwKKzB4ZTI5NDc4MDIsMHg1YTAwMDAwMiwweGUzNTEwMTAyLDB4MDM1MjAwMDAsCisweDhhZmZmZmY1LDB4ZTNhMDEwMDAsMHhlNzhkMTUyYSwweGVhMDAwMDE2LAorMHhlMzU0MDgzZSwweDAzNTEwMTAyLDB4ZTIwMDAxMDIsMHgwMzUwMDEwMiwKKzB4MWEwMDAwMGEsMHhlMzUyMDAwMCwweDBhZmZmZmFlLDB4ZTIxOTkwNjAsCisweDBhMDAwMDA0LDB4ZTM1OTAwNjAsMHgwYWZmZmZhYSwweGUwMzA3ZDA5LAorMHg1YWZmZmZhOCwweGVhMDAwMDAxLDB4ZTM1MjAxMDIsMHg5YWZmZmZhNSwKKzB4ZTI4ZjcwMTQsMHhlM2EwNDAwMSwweGVhZmZmY2ZlLDB4ZTIwOTEwMDcsCisweGUzNTEwMDA2LDB4YWEwMDAwMDEsMHhlNzhkMTUyYSwweGVhZmZmN2I1LAorMHhlMjgxMTAwMywweGUzNTEwMDBhLDB4MTNhMDEwMDEsMHhlMjA5OTA2MCwKKzB4MTM1OTAwMjAsMHgxYWZmZmZkZSwweGU3OGQxNTJhLDB4ZWFmZmY3YWQsCisweGUzMTkwMDgwLDB4MWEwMDAwMzQsMHhlMjA5N2EwZiwweGU3OWQ4NTI3LAorMHhlMjA5YjgwNywweGUwOGNiNjJiLDB4ZTFiMDcwMDgsMHg0MjY4ODAwMCwKKzB4ZTNhMGEwOWUsMHhlMjhhYWRmZSwweDAzYTBhMDFmLDB4ZTFiMGM4MjgsCisweDAxYTA4ODA4LDB4MDI0YWEwMTAsMHhlMWIwY2MyOCwweDAxYTA4NDA4LAorMHgwMjRhYTAwOCwweGUxYjBjZTI4LDB4MDFhMDgyMDgsMHgwMjRhYTAwNCwKKzB4ZTFiMGNmMjgsMHgwMWEwODEwOCwweDAyNGFhMDAyLDB4ZTFiMGNmYTgsCisweDAxYTA4MDg4LDB4MDI0YWEwMDEsMHhlMWIwY2MwOCwweDFhMDAwMDAyLAorMHhlM2EwOTAwMCwweGU4OGIwNzgwLDB4ZWFmZmY3OWQsMHhlMjE5OTA2MCwKKzB4MWEwMDAwMDgsMHhlMWIwYzA4YywweGUyMDhjMDgwLDB4MDAwY2MwYTgsCisweGUwOTg4MDBjLDB4ZTJhYWEwMDAsMHgyM2EwODEwMiwweGUzYzg4MGZmLAorMHhlODhiMDc4MCwweGVhZmZmNzkyLDB4ZTIzOTkwNjAsMHgwYWZmZmZmYSwKKzB4ZTAyN2NjODksMHhlMjBjYzEwMiwweGUwOTg4YmFjLDB4ZTJhYWEwMDAsCisweDIzYTA4MTAyLDB4ZTNhMDkwMDAsMHhlM2M4ODBmZiwweGU4OGIwNzgwLAorMHhlYWZmZjc4NywweGUzMTkwMDgwLDB4MWFmZmY3NWYsMHhlMjA5N2EwZiwKKzB4ZTc5ZDg1MjcsMHhlMjA5YjgwNywweGUwOGNiNjJiLDB4ZTFiMDcwMDgsCisweDQyNjg4MDAwLDB4ZTNhMGEwOWUsMHhlMjhhYWRmZSwweDAzYTBhMDFmLAorMHhlMWIwOTgyOCwweDAxYTA4ODA4LDB4MDI0YWEwMTAsMHhlMWIwOWMyOCwKKzB4MDFhMDg0MDgsMHgwMjRhYTAwOCwweGUxYjA5ZTI4LDB4MDFhMDgyMDgsCisweDAyNGFhMDA0LDB4ZTFiMDlmMjgsMHgwMWEwODEwOCwweDAyNGFhMDAyLAorMHhlMWIwOWZhOCwweDAxYTA4MDg4LDB4MDI0YWEwMDEsMHhlM2EwOTAwMCwKKzB4ZTg4YjA3ODAsMHhlYWZmZjc2YSwweGUyMDk3YTBmLDB4ZTc5ZGE1MjcsCisweGUzY2E4MDFmLDB4ZTNkODg4MWYsMHgxYTAwMDAwMiwweGUzOGFhMDAwLAorMHhlNThjYTA4MCwweGVhZmZmNzYyLDB4ZTI0ZjcwMGMsMHhlM2EwNDAwMSwKKzB4ZWFmZmZjOTQsMHhlMjA5N2EwZiwweGU1OWNhMDgwLDB4ZTc4ZGE1MjcsCisweGVhZmZmNzRjLDB4ZTFiMDhlMDksMHg0YTAwMDAzNywweGUwOGM4YzI4LAorMHhlODk4MDAwZiwweGUxYjA0ZDIzLDB4ZTI4ZjcwMDAsMHgxYWZmZmJhZSwKKzB4ZTIwOTc4MDcsMHhlMWEwYjAwMywweGUxYTBhMDAyLDB4ZTAyMDg1MDksCisweGUxYTA5MDAxLDB4ZTA4Y2M2MjcsMHhlODljMDAwZiwweGUxYjA0ZDIzLAorMHhlMjhmNzAwMCwweDFhZmZmYmE0LDB4MTg4YzAwMGYsMHhlM2EwNDgwMywKKzB4ZTA5NDU4ODMsMHgzMDk0NTg4YiwweDJhMDAwMDE1LDB4ZTAzMDUwMDgsCisweDRhMDAwMDA5LDB4ZTE1MzAwMGIsMHgwMTUxMDAwOSwweDAxNTIwMDBhLAorMHhlMTBmNzAwMCwweGUyMDc3MjA2LDB4MzM4NzcxMDIsMHgxMzEwMDEwMiwKKzB4MTIyNzcyMGEsMHhlMTY4ZjAwNywweGVhZmZmNzJhLDB4ZTE5YjQwMDMsCisweDAxOWE0MDAyLDB4MDE5OTQwMDEsMHgwYTAwMDAwMywweGUzMTAwMTAyLAorMHgxMzY4ZjEwMiwweDAzNjhmMjAyLDB4ZWFmZmY3MjIsMHhlMzY4ZjIwNiwKKzB4ZWFmZmY3MjAsMHhlMDk0NTg4MywweDNhMDAwMDAxLDB4ZTE5MTUwMDIsCisweDFhMDAwMDAzLDB4ZTA5NDU4OGIsMHgzYWZmZmZlMywweGUxOTk1MDBhLAorMHgwYWZmZmZlMSwweGUzNjhmMjAxLDB4ZTI0ZmMwYzAsMHhlMjRjY2MyNCwKKzB4ZTI0ZjcwMzgsMHhlM2EwNDAwMSwweGVhZmZmYzU2LDB4ZTIwOTc4MDcsCisweGUyMDk1NjAyLDB4ZTI0ZjYwNzQsMHhlMDg2NmMyOCwweGU4OTYwZjAwLAorMHhlMDI4ODUwNSwweGVhZmZmZmNhLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4ODAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDNmZmYsMHgwMDAwMDAwMCwweDgwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDA0MDAwLDB4MDAwMDAwMDAsMHhjMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwNDAwMCwweDAwMDAwMDAwLDB4ODAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDQwMDEsMHgwMDAwMDAwMCwweGEwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDA0MDAxLDB4MDAwMDAwMDAsMHg4MDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwM2ZmZSwweDAwMDAwMDAwLDB4YTAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDQwMDIsMHhlMjA5NzgwNywweGUyMDk1NjAyLAorMHhlMjRmNmUxMSwweGUwODY2YzI4LDB4ZTg5NjBmMDAsMHhlMDI4ODUwNSwKKzB4ZWEwMDAwMGIsMHhlMWIwOGUwOSwweDRhZmZmZmY2LDB4ZTA4YzhjMjgsCisweGU4OTgwMDBmLDB4ZTFiMDRkMjMsMHhlMjhmNzAwMCwweDFhZmZmYjQ2LAorMHhlMjA5NzgwNywweGUxYTBiMDAzLDB4ZTFhMGEwMDIsMHhlMDIwODUwOSwKKzB4ZTFhMDkwMDEsMHhlMDhjYzYyNywweGU4OWMwMDBmLDB4ZTFiMDRkMjMsCisweGUyOGY3MDAwLDB4MWFmZmZiM2MsMHgxODhjMDAwZiwweGUzYTA0ODAzLAorMHhlMDk0NTg4MywweDMwOTQ1ODhiLDB4MmEwMDAwMGIsMHhlMDMwNTAwOCwKKzB4NGFmZmZmYTEsMHhlMTUzMDAwYiwweDAxNTEwMDA5LDB4MDE1MjAwMGEsCisweGUxMGY3MDAwLDB4ZTIwNzcyMDYsMHgzMzg3NzEwMiwweDEzMTAwMTAyLAorMHgxMjI3NzIwYSwweGUxNjhmMDA3LDB4ZWFmZmY2YzIsMHhlMDk0NTg4MywKKzB4M2EwMDAwMDEsMHhlMTkxNTAwMiwweDFhMDAwMDAzLDB4ZTA5NDU4OGIsCisweDNhZmZmZmVkLDB4ZTE5OTUwMGEsMHgwYWZmZmZlYiwweGUzNjhmMjAxLAorMHhlYWZmZjZiOCwweGUyMDk5MDYwLDB4ZTM1OTAwMjAsMHgwM2EwNzIwOSwKKzB4MGEwMDAwMDYsMHhlM2EwMDAwMCwweGUwOGNiNDJhLDB4ZTI4ZjcwOGMsCisweGUyODc3YzA1LDB4ZWEwMDAwZGUsMHhlMzU3MDIwZSwweDBhZmZmZmY0LAorMHhlMjRmOGMwMiwweGUwODg3YzI3LDB4ZTA4Y2I0MmEsMHhlODk3MDc4MCwKKzB4ZTg4YjA3ODAsMHhlYWZmZjZiNiwweGUyNGY4Zjg1LDB4ZTA4ODdjMjcsCisweGUwOGNiNDJhLDB4ZTg5NzA3MDAsMHhlM2EwNzEwMiwweGU4OGIwNzgwLAorMHhlYWZmZjZhZiwweGUyNGY3ZTIzLDB4ZTA4NzhjMjgsMHhlODk4MGQwMCwKKzB4ZTNhMDQwMDAsMHhlYTAwMDFmMywweGUyNGY3ZjkxLDB4ZTA4NzhjMjgsCisweGU4OTgwZDAwLDB4ZTNhMDQwMDAsMHhlYTAwMDJhNSwweGUzNTgwMTAyLAorMHgwYTAwMDQwZiwweGUyNGY3ZTI2LDB4ZTA4NzhjMjgsMHhlODk4MGQwMCwKKzB4ZWEwMDAzNWYsMHhlMzU4MDEwMiwweDBhMDAwNTBmLDB4ZTI0ZjdmOWUsCisweGUwODc4YzI4LDB4ZTg5ODBkMDAsMHhlYTAwMDQ1NiwweGUyNGY3ZmEzLAorMHhlMDg3NmMyNiwweGU4OTYwMDBmLDB4ZWEwMDA0NjMsMHhlMzU4MDEwMiwKKzB4MGEwMDA1YjMsMHhlMjRmN2UyYSwweGUwODc4YzI4LDB4ZTg5ODBkMDAsCisweGVhMDAwNTQ2LDB4ZTI0ZjdmYWQsMHhlMDg3NmMyNiwweGU4OTYwMDBmLAorMHhlYTAwMDU0OSwweGUyNGY4ZmIxLDB4ZTA4ODhjMjcsMHhlMDhjYjQyYSwKKzB4ZTg5ODAwMGYsMHhlMzU3MDIwOSwweDlhMDAwMThlLDB4ZWEwMDAxNDMsCisweGUyNGY4ZTJlLDB4ZTA4ODhjMjcsMHhlODk4MDAwZiwweGVhMDAwNjNhLAorMHhlMjRmOGUyZiwweGUwODg4YzI3LDB4ZTg5ODAwMGYsMHhlYTAwMDZkZCwKKzB4ZTI0ZjhjMDMsMHhlMDg4OGMyNywweGU4OTgwMDBmLDB4ZWEwMDA3OTAsCisweGUyNGY4ZTMxLDB4ZTA4ODhjMjcsMHhlODk4MDAwZiwweGVhMDAwODU4LAorMHhlMzU3MDEwMiwweDEzNTcwMjA5LDB4MTM1NzAyMGUsMHgxYTAwMDhmZSwKKzB4ZTI0ZjhlMzMsMHhlMDg4OGMyNywweGU4OTgwMDBmLDB4ZWEwMDA4ODAsCisweGUyNGY4ZDBkLDB4ZTA4ODhjMjcsMHhlODk4MDAwZiwweGVhMDAwOTkyLAorMHhlMjRmN2UzNSwweGUwODc2YzI2LDB4ZTg5NjAwMGYsMHhlYTAwMDkzNywKKzB4ZTI0ZjdmZDcsMHhlMDg3OGMyOCwweGU4OTgwZDAwLDB4ZWEwMDA1YjYsCisweGUzMTkwMDgwLDB4MWFmZmY2MzgsMHhlMWIwN2UwOSwweGUyMDlhYTA3LAorMHg0YWZmZmY5ZSwweGUwOGM3YzI3LDB4ZTA4Y2I0MmEsMHhlODk3MDc4MCwKKzB4ZTg4YjA3ODAsMHhlYWZmZjY1NiwweGUzMTkwMDgwLDB4MWFmZmY2MmUsCisweGUxYjA3ZTA5LDB4ZTIwOWFhMDcsMHg0YWZmZmY5YSwweGUwOGM3YzI3LAorMHhlMDhjYjQyYSwweGU4OTcwNzgwLDB4ZTIyNzcxMDIsMHhlODhiMDc4MCwKKzB4ZWFmZmY2NGIsMHhlMzE5MDA4MCwweDFhZmZmNjIzLDB4ZTFiMDdlMDksCisweGUyMDlhYTA3LDB4NGFmZmZmODksMHhlMDhjN2MyNywweGUwOGNiNDJhLAorMHhlODk3MDc4MCwweGUzYzc3MTAyLDB4ZTg4YjA3ODAsMHhlYWZmZjY0MCwKKzB4ZTFiMDdlMDksMHhlMjA5YWEwNywweDRhZmZmZjgwLDB4ZTA4YzdjMjcsCisweGUwOGNhNDJhLDB4ZTg5NzAwMGYsMHhlMjA5ODA4MCwweGUzODg4MDQwLAorMHhlMTU4MGJhMywweDIxYjA0MTgzLDB4M2EwMDAwMWQsMHhlODhhMDAwZiwKKzB4ZWFmZmY2MmMsMHhlMWIwN2UwOSwweGUyMDlhYTA3LDB4NGFmZmZmNzksCisweGUwOGM3YzI3LDB4ZTA4Y2E0MmEsMHhlODk3MDAwZiwweGUyMjAwMTAyLAorMHhlMjA5ODA4MCwweGUzODg4MDQwLDB4ZTE1ODBiYTMsMHgyMWIwNDE4MywKKzB4M2EwMDAwMGYsMHhlODhhMDAwZiwweGVhZmZmNjFlLDB4ZTFiMDdlMDksCisweGUyMDlhYTA3LDB4NGFmZmZmNjUsMHhlMDhjN2MyNywweGUwOGNhNDJhLAorMHhlODk3MDAwZiwweGUzYzAwMTAyLDB4ZTIwOTgwODAsMHhlMzg4ODA0MCwKKzB4ZTE1ODBiYTMsMHgyMWIwNDE4MywweDNhMDAwMDAxLDB4ZTg4YTAwMGYsCisweGVhZmZmNjEwLDB4ZTFhMDQzMjgsMHhlMTg0NGQyMywweGUyNGY3MDE4LAorMHhlMzU0MDAxOSwweDBhMDAwMDZiLDB4YzNjMDMxMDIsMHhlMzE0MDAwMiwKKzB4MWEwMDAwMzQsMHhlMWIwNTg4MywweDEyOTU1ODAyLDB4MGEwMDAwMWMsCisweGUyMTk1MDYwLDB4MWEwMDAwMGMsMHhlMTkyNWM4MSwweGUyMDEyMDgwLAorMHgwMDAyMjBhMSwweGUwOTExMDAyLDB4MjNhMDExMDIsMHhlMmEzMzAwMCwKKzB4ZTNhMDIwMDAsMHhlM2MxMTBmZiwweGUyNTM1ZGZlLDB4OWEwMDAwMWEsCisweGUzNTUwMGZmLDB4MzFhMGYwMDcsMHhlYTAwMDAxMiwweGUzNTUwMDYwLAorMHgxMTkyMmMwMSwweDEwMzA1ZDA1LDB4NWFmZmZmZjQsMHhlMjkxMWMwMSwKKzB4MjNhMDExMDIsMHhlMmEzMzAwMCwweGUzYTAyMDAwLDB4ZTNjMTEwZmYsCisweGUyNTM1ZGZlLDB4OWEwMDAwMGMsMHhlMzU1MDBmZiwweDMxYTBmMDA3LAorMHhlYTAwMDAwNCwweGUzMTMwMGZmLDB4MTFhMGYwMDcsMHhlMTkyMjAwMSwKKzB4MDFhMGYwMDcsMHhlYTAwMDAwYSwweGUzYTAzMGZmLDB4ZTM4MzNjN2YsCisweGUzYTAxMDAwLDB4ZTNhMDQwMDQsMHhlYWZmZmIxYSwweGUzNzUwMDE3LAorMHhkYTAwMDAwMywweGUyNjU1MDA5LDB4ZTFhMDE1MzEsMHhlMWEwMTUxMSwKKzB4ZTFhMGYwMDcsMHhlM2EwMzAwMCwweGUzYTAyMDAwLDB4ZTNhMDEwMDAsCisweGUzYTA0MDA4LDB4ZWFmZmZiMGYsMHhlMWIwNTg4MywweDEyOTU1ODAyLAorMHgwYTAwMDAyMiwweGUyMTk1MDYwLDB4MWEwMDAwMGYsMHhlMWIwNGIwMiwKKzB4ZTIwMjRiMDEsMHgwMDA0NDBhMiwweGUwOTIyMDA0LDB4ZTJiMTEwMDAsCisweGUyYTMzMDAwLDB4MjNhMDExMDIsMHhlMWEwMjVhMiwweGUxYTAyNTgyLAorMHhlMjUzNWIwZiwweDlhMDAwMDFhLDB4ZTI4NTQwMDEsMHhlMzU0MGIwMiwKKzB4MzFhMGYwMDcsMHhlM2EwMjAwMCwweGVhZmZmZmRhLDB4ZTM1NTAwNjAsCisweDExYjA0YTgyLDB4MTAzMDVkMDUsMHg1YWZmZmZmMiwweGUyOTIyYjAyLAorMHhlMmIxMTAwMCwweDIzYTAxMTAyLDB4ZTJhMzMwMDAsMHhlMWEwMjVhMiwKKzB4ZTFhMDI1ODIsMHhlMjUzNWIwZiwweDlhMDAwMDA5LDB4ZTI4NTQwMDEsCisweGUzNTQwYjAyLDB4MzFhMGYwMDcsMHhlM2EwMjAwMCwweGVhZmZmZmM5LAorMHhlMzEzMDBmZiwweDExYTBmMDA3LDB4ZTE5MjIwMDEsMHgwMWEwZjAwNywKKzB4ZWFmZmZmY2YsMHhlMzc1MDAzNCwweGRhZmZmZmNkLDB4ZTI2NTUwMGMsCisweGUyNTU0MDIwLDB4MjFhMDI0MzEsMHgzMWEwMjUzMiwweDIxYTAxNDEyLAorMHhlMWEwMjUxMiwweGUxYTBmMDA3LDB4ZTFhMDMwODAsMHhlMWIwM2FhMywKKzB4MTI4MzQwMDEsMHgxMzM0MGIwMiwweDBhMDAwMDIzLDB4ZTI4MzNiMGYsCisweGUyMTk1MDYwLDB4MWEwMDAwMGYsMHhlMWIwNDIwMSwweGUxYTAxYWExLAorMHhlMTgxMTU4MCwweGUzODExMTAyLDB4ZTIwMTQwODAsMHgwMDA0NDBhMSwKKzB4ZTA5MTEwMDQsMHgyM2EwMTEwMiwweGUyYTMzMDAwLDB4ZTNjMTEwZmYsCisweGUzYTAyMDAwLDB4ZTI1MzVkZmUsMHg5YWZmZmZhYiwweGUzNTUwMGZmLAorMHgzMWEwZjAwNywweGVhZmZmZmEzLDB4ZTFiMDQxODEsMHhlMWEwMWFhMSwKKzB4ZTE4MTE1ODAsMHhlMzgxMTEwMiwweDEzNTUwMDYwLDB4MTAzMDVkMDUsCisweDVhZmZmZmYxLDB4ZTI5MTFjMDEsMHgyM2EwMTEwMiwweGUyYTMzMDAwLAorMHhlM2EwMjAwMCwweGUzYzExMGZmLDB4ZTI1MzVkZmUsMHg5YWZmZmY5YSwKKzB4ZTM1NTAwZmYsMHgzMWEwZjAwNywweGVhZmZmZjkyLDB4ZTE4MzMyMDMsCisweGUxOTEyNjAwLDB4MDFhMGYwMDcsMHhlMWEwMjU4MSwweGUxYTAxYWExLAorMHhlMTgxMTU4MCwweGUzMTMwMGZmLDB4MTFhMGYwMDcsMHhlYWZmZmY5NCwKKzB4ZTMxOTAwODAsMHgxYWZmZjU0YywweGUxYjA3ZTA5LDB4ZTIwOWFhMDcsCisweDRhZmZmZWIwLDB4ZTA4YzdjMjcsMHhlMDhjYjQyYSwweGU4OTcwMDBmLAorMHhlMWIwNGQyMywweGUyOGY3MDAwLDB4MWFmZmY5YzMsMHhlMWEwNDg4MywKKzB4ZTI5NDQ4MDIsMHgwYTAwMDAwYiwweGU5MmM0MDAwLDB4ZWJmZmY4M2MsCisweGU4YmM0MDAwLDB4ZTI4ZjcwMTQsMHgxYWZmZmE5NiwweGUxODk4NjI5LAorMHhlMzE4MDA4MCwweDBhZmZmZjRlLDB4ZTMxOTAwODAsMHgxYWZmZmY4MSwKKzB4ZTg4YjAwMGYsMHhlYWZmZjU1MywweGUxOTI4MDAxLDB4MGEwMDAwMDMsCisweGUzODExMTAxLDB4ZTI0ZjcwMWMsMHhlM2EwNDAwMSwweGVhZmZmYTg5LAorMHhlM2EwMjAwMCwweGUyNGY3MDJjLDB4ZWFmZmZmNjYsMHhlMzE5MDA4MCwKKzB4MWFmZmY1MjksMHhlMWIwN2UwOSwweGUyMDlhYTA3LDB4NGFmZmZlYzAsCisweGUwOGM4YzI3LDB4ZTA4Y2I0MmEsMHhlODk4MDAwZiwweGUxYjA0ZDIzLAorMHhlMjhmNzAwMCwweDFhZmZmOWEwLDB4MTg4ODAwMGYsMHhlMWIwNDg4MywKKzB4MTI5NDQ4MDIsMHgwYTAwMDA2MywweGUzMTAwMTAyLDB4MWEwMDAwNTksCisweGUyODMzOTAxLDB4ZTI0MzMwMDEsMHhlMWIwMzBhMywweGUxYTA1MDAyLAorMHgzMjQxNDEwMiwweDIyNDE0MTAxLDB4MzNhMDcyMDEsMHgyM2EwNzIwMiwKKzB4ZTNhMDExMDIsMHhlMDk1NTAwNSwweGUwYjQ0MDA0LDB4ZTAyMTYwMDcsCisweDMxNTQwMDA2LDB4MjA0NDQwMDYsMHgyMDIxMTA4NywweGUxYjA3MGU3LAorMHg1YWZmZmZmNywweGUxOTQyMDA1LDB4MTE4OTI2MjksMHgxMjEyMjA4MCwKKzB4MDNhMDcwMDAsMHgwYTAwMDAxOCwweGUzYTAyMDAwLDB4ZTA5NTUwMDUsCisweGUwYjQ0MDA0LDB4ZTBhMDAwMDAsMHhlMDIyNjAwNywweGUwNTVhMDA2LAorMHhlMGQ0ODAwMSwweDMxYjAwMGEwLDB4MjFhMDUwMGEsMHgyMWEwNDAwOCwKKzB4MjAyMjIwODcsMHgyMDIxMWZhNywweGUxYjA3MGE3LDB4MWFmZmZmZjIsCisweGUwOTU1MDA1LDB4ZTBiNDQwMDQsMHhlMGI3MDAwNywweGUwZDVhMDAyLAorMHhlMGQ0ODAwMSwweDMxYjAwMGEwLDB4MjFhMDUwMGEsMHgyMWEwNDAwOCwKKzB4MjIyMjIwMDEsMHgyM2EwNzEwMiwweGUzYTAwMDAwLDB4ZTMxOTA3MDIsCisweDFhMDAwMDA4LDB4ZTE5NTQwMDQsMHgwMTk0NDAwNywweDEzODIyMDAxLAorMHhlMjhmNzA0NCwweGUzNTMwMDAwLDB4ZGFmZmZmMjksMHhlMzE5MDA4MCwKKzB4MGFmZmZlZjcsMHhlYWZmZmYyYiwweGUyMTk2MDYwLDB4MWEwMDAwMTUsCisweGUwOTc3MDA3LDB4ZTBiNTUwMDUsMHhlMGI0NDAwNCwweDJhMDAwMDAyLAorMHhlMTU0MDAwMSwweDAxNTUwMDAyLDB4MDM1NzAxMDEsMHhlMmIyMjAwMCwKKzB4ZTJiMTEwMDAsMHhlMmEzMzAwMCwweDIzYTAxMTAyLDB4ZTU5YzUwODAsCisweGUzMTUwMDEwLDB4MGEwMDAwMDEsMHhlODhiMDAwZiwweGVhZmZmNGVkLAorMHhlMzg1NTAxMCwweGU1OGM1MDgwLDB4ZTMxNTA2MDEsMHgwYWZmZmZmOSwKKzB4ZTNhMDAwMTAsMHhlYTAwMDhiNCwweGUxOTQ1MDA1LDB4MDE5NTUwMDcsCisweDEzNTYwMDYwLDB4MGFmZmZmZjAsMHhlMTMwMGM4NiwweDRhZmZmZmVlLAorMHhlMjkyMjAwMSwweGVhZmZmZmU5LDB4ZTNhMDE0YzUsMHhlM2EwMjAwMCwKKzB4ZTNhMDMwZmYsMHhlMTgzMzM4MywweGUzODExMTAxLDB4ZTI0ZjcwNWMsCisweGUzYTA0MDAxLDB4ZWFmZmZhMTMsMHhlMzUzMDAwMCwweDFhMDAwMDA4LAorMHhlMTkxNDAwMiwweDBhZmZmZmUzLDB4ZTFiMDEwMDEsMHg0YWZmZmY5NSwKKzB4ZTA5MjIwMDIsMHhlMGIxMTAwMSwweGUyNDMzMDAxLDB4NWFmZmZmZmIsCisweGVhZmZmZjkwLDB4ZTE5MTQwMDIsMHgxYWZmZmZlZSwweGUzMTAwMTAyLAorMHgwYWZmZmZkNSwweGVhZmZmZmU3LDB4ZTMxOTAwODAsMHgxYWZmZjRhNiwKKzB4ZTFiMDhlMDksMHg0YWZmZmUxYSwweGUwOGM4YzI4LDB4ZTg5ODAwMGYsCisweGUxYjA0ZDIzLDB4MGEwMDAwMGIsMHhlMjhmNzAyNCwweGUzNTQwMDA4LAorMHgxYWZmZjkxZCwweGUzYTAyMDAwLDB4ZTFhMDMwODAsMHhlMWIwM2MyMywKKzB4MTMzMzAwZmYsMHgxMWEwMTQwMCwweDEzODExMTAyLDB4MTI4MzNkZmUsCisweDBhZmZmYTRkLDB4ZTg4ODAwMGYsMHhlMWEwYjAwMywweGUxYTBhMDAyLAorMHhlMWEwODAwMSwweGUyMDA0MTAyLDB4ZTIwOTY4MDcsMHhlMDhjNjYyNiwKKzB4ZTg5NjAwMGYsMHhlMTM0MDAwMCwweDRhMDAwMGI2LDB4ZTFiMDRkMjMsCisweDBhMDAwMDBiLDB4ZTI4ZjcwMjQsMHhlMzU0MDAwOCwweDFhZmZmOTA2LAorMHhlM2EwMjAwMCwweGUxYTAzMDgwLDB4ZTFiMDNjMjMsMHgxMzMzMDBmZiwKKzB4MTFhMDE0MDAsMHgxMzgxMTEwMiwweDEyODMzZGZlLDB4MGFmZmZhMzYsCisweGU4ODYwMDBmLDB4ZTNhMDY4MDIsMHhlMDk2NTg4MywweDMwOTY1ODhiLAorMHgyYTAwMDA2MSwweGUwNTM0MDBiLDB4NGEwMDAwNDYsMHhlMjc0NTAyMCwKKzB4ZGEwMDAwMGUsMHhlMDkyMjQzYSwweDIwODIyNTE4LDB4MzA5MjI1MTgsCisweGUwYjExNDM4LDB4ZTFhMDg1MWEsMHhlMWEwYTA4OCwweDJhMDAwMDExLAorMHhlMzE5MDcwMiwweDFhMDAwMDFkLDB4ZTE5YWEwMDgsMHgxMzgyMjAwMSwKKzB4ZTI4ZjcwOTAsMHhlMzE5MDA4MCwweDBhZmZmZTdkLDB4ZWFmZmZlYjEsCisweGUzNTQwMDQwLDB4YzE4YWEwMDgsMHhjM2EwODAwMCwweGFhMDAwMDBiLAorMHhlMjQ0NDAyMCwweGUyNjQ1MDIwLDB4ZTA5MjI0MzgsMHhlMmIxMTAwMCwKKzB4ZTFhMDg1MTgsMHhlMThhYTA4OCwweGUyYTMzMDAwLDB4MjE4YWEwMDgsCisweDIxYTA4ZjgyLDB4MjFhMDIwYTIsMHgyMTgyMmY4MSwweDIxYTAxMDYxLAorMHhlMzE5MDcwMiwweDFhMDAwMDA1LDB4ZTE5YWEwMDgsMHgxMzgyMjAwMSwKKzB4ZTI4ZjcwMzAsMHhlMzE5MDA4MCwweDBhZmZmZTY1LDB4ZWFmZmZlOTksCisweGUyMTk3MDYwLDB4MWEwMDAwMTQsMHhlMTlhYTA4OCwweDAwMDg4ZjgyLAorMHhlMDkyMmZhOCwweGUyYjExMDAwLDB4ZTJhMzMwMDAsMHgyM2EwMTEwMiwKKzB4ZTA5NjU4ODMsMHgwYTAwMDAzYiwweGU1OWM1MDgwLDB4ZTMxNTAwMTAsCisweDBhMDAwMDAzLDB4ZTIwOTlhMDcsMHhlMDhjOTQyOSwweGU4ODkwMDBmLAorMHhlYWZmZjQ1YywweGUzODU1MDEwLDB4ZTU4YzUwODAsMHhlMzE1MDYwMSwKKzB4MGFmZmZmZjcsMHhlM2EwMDAxMCwweGVhMDAwODIzLDB4ZTE5YWEwMDgsCisweDEzNTcwMDYwLDB4MGFmZmZmZWYsMHhlMTMwMGM4NywweDRhZmZmZmVkLAorMHhlMjkyMjAwMSwweGVhZmZmZmU2LDB4ZTI2NDQwMDAsMHhlMWEwMzAwYiwKKzB4ZTFhMDUwMDEsMHhlMWEwMTAwOCwweGUxYTA4MDA1LDB4ZTFhMDUwMDIsCisweGUxYTAyMDBhLDB4ZTFhMGEwMDUsMHhlMjc0NTAyMCwweGRhZmZmZmJmLAorMHhlMDkyMjQzYSwweDIwODIyNTE4LDB4MzA5MjI1MTgsMHhlMGIxMTQzOCwKKzB4ZTFhMDg1MWEsMHhlMWEwYTA4OCwweDJhZmZmZmMyLDB4ZTMxOTA3MDIsCisweDFhZmZmZmNlLDB4ZTE5YWEwMDgsMHgxMzgyMjAwMSwweGUyNGY3MGFjLAorMHhlMzE5MDA4MCwweDBhZmZmZTJlLDB4ZWFmZmZlNjIsMHhlMDk2NTg4MywKKzB4MWEwMDAwMDEsMHhlMTkyNTAwMSwweDFhMDAwMDA2LDB4ZTA5NjU4OGIsCisweDFhZmZmZmNjLDB4ZTFhMDMwMGIsMHhlMWEwMTAwOCwweGUxYTAyMDBhLAorMHhlMTkxNTAwMiwweDBhZmZmZmM3LDB4ZTM4MTExMDEsMHhlMjRmNzBlYywKKzB4ZTNhMDQwMDEsMHhlYWZmZjk2MywweGUzYTAzMGZmLDB4ZTE4MzMzODMsCisweGUzYTAyMDAwLDB4ZTNhMDEwMDAsMHhlMjRmN2Y0MiwweGUzYTA0MDA0LAorMHhlYWZmZjk1YywweGUxYjA0ZDIzLDB4MGEwMDAwMGIsMHhlMjhmNzAyNCwKKzB4ZTM1NDAwMDgsMHgxYWZmZjg3YywweGUzYTAyMDAwLDB4ZTFhMDMwODAsCisweGUxYjAzYzIzLDB4MTMzMzAwZmYsMHgxMWEwMTQwMCwweDEzODExMTAyLAorMHgxMjgzM2RmZSwweDBhZmZmOWFjLDB4ZTg4NjAwMGYsMHhlMDIwMDU4OSwKKzB4ZWFmZmZmNzMsMHhlMzE5MDA4MCwweDFhZmZmM2VmLDB4ZTFiMDhlMDksCisweDRhZmZmZDY4LDB4ZTA4YzhjMjgsMHhlODk4MDAwZiwweGUxYjA0ZDIzLAorMHgwYTAwMDAwYiwweGUyOGY3MDI0LDB4ZTM1NDAwMDgsMHgxYWZmZjg2NiwKKzB4ZTNhMDIwMDAsMHhlMWEwMzA4MCwweGUxYjAzYzIzLDB4MTMzMzAwZmYsCisweDExYTAxNDAwLDB4MTM4MTExMDIsMHgxMjgzM2RmZSwweDBhZmZmOTk2LAorMHhlODg4MDAwZiwweGUxYTBiMDAzLDB4ZTFhMGEwMDIsMHhlMWEwODAwMSwKKzB4ZTIwMDQxMDIsMHhlMjA5NjgwNywweGUwOGM2NjI2LDB4ZTg5NjAwMGYsCisweGUxMzQwMDAwLDB4NGFmZmZmZDIsMHhlMWIwNGQyMywweDBhMDAwMDBiLAorMHhlMjhmNzAyNCwweGUzNTQwMDA4LDB4MWFmZmY4NGYsMHhlM2EwMjAwMCwKKzB4ZTFhMDMwODAsMHhlMWIwM2MyMywweDEzMzMwMGZmLDB4MTFhMDE0MDAsCisweDEzODExMTAyLDB4MTI4MzNkZmUsMHgwYWZmZjk3ZiwweGU4ODYwMDBmLAorMHhlMDIwMDU4OSwweGUzYTA2ODAyLDB4ZTA5NjU4ODMsMHgzMDk2NTg4YiwKKzB4MmEwMDAwNmIsMHhlMDUzNDAwYiwweDAxNTEwMDA4LDB4MDE1MjAwMGEsCisweDBhMDAwMDc4LDB4M2EwMDAwNGMsMHhlM2EwNzAwMCwweGUyNzQ1MDIwLAorMHhkYTAwMDAxNSwweGUwNTc2NTFhLDB4ZTBkMjI0M2EsMHgzMDQyMjUxOCwKKzB4MjA1MjI1MTgsMHhlMGQxMTQzOCwweDVhMDAwMDFiLDB4ZTMxOTA3MDIsCisweDFhMDAwMDI5LDB4ZTE5NzcwMDYsMHgxMzgyMjAwMSwweGUyOGY3MGMwLAorMHhlMzE5MDA4MCwweDBhZmZmZGMyLDB4ZWFmZmZkZjYsMHgxM2EwNjEwMiwKKzB4ZTNhMDcwMDEsMHhlMTk4NTAwYSwweDBhMDAwMDI5LDB4ZTI1MjIwMDEsCisweGUyZDExMDAwLDB4NWEwMDAwMGMsMHhlYTAwMDAxMSwweGUzYTA2MDAwLAorMHhlMzU0MDA0MCwweGFhZmZmZmY0LDB4ZTI0NDQwMjAsMHhlMjY0NTAyMCwKKzB4ZTA1Nzc1MWEsMHhlMGQ2NjQzYSwweDMwNDY2NTE4LDB4MjA1NjY1MTgsCisweGUwZDIyNDM4LDB4ZTJkMTEwMDAsMHg0YTAwMDAwNSwweGUwOTc3MDA3LAorMHhlMGI2NjAwNiwweGUwYjIyMDAyLDB4ZTBiMTEwMDEsMHhlMjQzMzAwMSwKKzB4NWFmZmZmZjksMHhlMzE5MDcwMiwweDFhMDAwMDA3LDB4ZTM1MzAwMDAsCisweGRhMDAwMDRjLDB4ZTE5NzcwMDYsMHgxMzgyMjAwMSwweGUyOGY3MDMwLAorMHhlMzE5MDA4MCwweDBhZmZmZDllLDB4ZWFmZmZkZDIsMHhlMjE5NTA2MCwKKzB4MWEwMDAwMGUsMHhlMTk3NzA4NiwweDAwMDY2ZjgyLDB4ZTA5MjJmYTYsCisweGUyYjExMDAwLDB4ZTJhMzMwMDAsMHgyM2EwMTEwMiwweGUxYjAzMDAzLAorMHg0YTAwMDA0MiwweGU1OWM1MDgwLDB4ZTMxNTAwMTAsMHgwYWZmZmYzYywKKzB4ZTIwOTlhMDcsMHhlMDhjOTQyOSwweGU4ODkwMDBmLDB4ZWFmZmYzOTUsCisweGUxOTc3MDA2LDB4MTM1NTAwNjAsMHgwYWZmZmZmMywweGUxMzAwYzg1LAorMHg0YWZmZmZmMSwweGUyOTIyMDAxLDB4ZWFmZmZmZWMsMHhlMjY0NDAwMCwKKzB4ZTIyMDAxMDIsMHhlMWEwMzAwYiwweGUxYTA1MDAxLDB4ZTFhMDEwMDgsCisweGUxYTA4MDA1LDB4ZTFhMDUwMDIsMHhlMWEwMjAwYSwweGUxYTBhMDA1LAorMHhlM2EwNzAwMCwweGUyNzQ1MDIwLDB4ZGFmZmZmYmYsMHhlMDU3NjUxYSwKKzB4ZTBkMjI0M2EsMHgzMDQyMjUxOCwweDIwNTIyNTE4LDB4ZTBkMTE0MzgsCisweDVhZmZmZmM1LDB4ZTMxOTA3MDIsMHgxYWZmZmZkMywweGUxOTc3MDA2LAorMHgxMzgyMjAwMSwweGUyNGY3MDk4LDB4ZTMxOTAwODAsMHgwYWZmZmQ2YywKKzB4ZWFmZmZkYTAsMHhlMDk2NTg4MywweDFhMDAwMDA1LDB4ZTE5MjUwMDEsCisweDFhZmZmZjQ0LDB4ZTE1MzAwMGIsMHgwMTk4NTAwYSwweDAzYTAxNGMxLAorMHgwYWZmZmY0MCwweGUwOTY1ODhiLDB4MWFmZmZmY2QsMHhlMjIwMDEwMiwKKzB4ZTFhMDMwMGIsMHhlMWEwMTAwOCwweGUxYTAyMDBhLDB4ZTE5MTUwMDIsCisweDBhZmZmZmM3LDB4ZWFmZmZmMzcsMHhlM2EwMzAwMCwweGUzYTAyMDAwLAorMHhlM2EwMTAwMCwweGVhZmZmZmMyLDB4ZTNhMDMwMDAsMHhlM2EwMjAwMCwKKzB4ZTNhMDEwMDAsMHhlMjRmN2Y0MiwweGUzYTA0MDA4LDB4ZWFmZmY4OTUsCisweGUyNjMzMDAwLDB4ZTI3MzQwMjAsMHg0MjQzNTAyMCwweDQxYTAyNTMxLAorMHg1MWEwMjMzMiwweDUxODIyNDExLDB4ZTFhMDEzMzEsMHhlM2EwMzAwMCwKKzB4ZWFmZmZmYjMsMHhlMzE5MDA4MCwweDFhZmZmMzJmLDB4ZTFiMDhlMDksCisweDRhZmZmY2FkLDB4ZTA4YzhjMjgsMHhlODk4MDAwZiwweGUxYjA0ZDIzLAorMHgwYTAwMDAwYiwweGUyOGY3MDI0LDB4ZTM1NDAwMDgsMHgxYWZmZjdhNiwKKzB4ZTNhMDIwMDAsMHhlMWEwMzA4MCwweGUxYjAzYzIzLDB4MTMzMzAwZmYsCisweDExYTAxNDAwLDB4MTM4MTExMDIsMHgxMjgzM2RmZSwweDBhZmZmOGQ2LAorMHhlODg4MDAwZiwweGUyMDAwMTAyLDB4ZTE4M2IwMDAsMHhlMWEwYTAwMiwKKzB4ZTFhMDgwMDEsMHhlMjA5NjgwNywweGUwOGM2NjI2LDB4ZTg5NjAwMGYsCisweGUxYjA0ZDIzLDB4MGEwMDAwMGIsMHhlMjhmNzAyNCwweGUzNTQwMDA4LAorMHgxYWZmZjc5MSwweGUzYTAyMDAwLDB4ZTFhMDMwODAsMHhlMWIwM2MyMywKKzB4MTMzMzAwZmYsMHgxMWEwMTQwMCwweDEzODExMTAyLDB4MTI4MzNkZmUsCisweDBhZmZmOGMxLDB4ZTg4NjAwMGYsMHhlMDIwMDAwYiwweGUzY2JiMTAyLAorMHhlM2EwNjgwMiwweGUzNTMwMDAwLDB4MTM1YjAwMDAsMHgwYTAwMDA4YywKKzB4ZTA5NjU4ODMsMHgzMDk2NTg4YiwweDJhZmZmZWU3LDB4ZTNiMDU0ZmYsCisweGUwYTMzMDBiLDB4ZTE4NWI0MjUsMHhlMDQzMzkyYiwweGUxOWE0MDg4LAorMHgxMTkyNDA4MSwweDBhMDAwMDY0LDB4ZTkyYzQyMDksMHhlMWEwNDgyMSwKKzB4ZTFjMTUwMGIsMHhlMWEwNjgyMiwweGUxYzI3MDBiLDB4ZTFjODkwMGIsCisweGUxYTA4ODI4LDB4ZTFjYWIwMGIsMHhlMWEwYTgyYSwweGUwMDMwYjk2LAorMHhlMDAyMGI5NCwweGUwMDEwOTk0LDB4ZTAwMDBhOTcsMHhlMDkzMzAwMCwKKzB4ZTAwMDBhOTUsMHhlMGIyMjAwMCwweGUwMDAwODk1LDB4ZTBiMTEwMDAsCisweDMzYTBlMDAwLDB4MjNhMGUwMDEsMHhlMDAwMDk5NiwweGUwOTIyMDAwLAorMHhlMmIxMTAwMCwweGUyYWVlMDAwLDB4ZTAwMDA4OTcsMHhlMDkyMjAwMCwKKzB4ZTJiMTEwMDAsMHhlMmFlZTAwMCwweGUxOGVlODAzLDB4ZTFhMDM4MjMsCisweGUxODMzODAyLDB4ZTFhMDI4MjIsMHhlMTgyMjgwMSwweGUxYTAxODIxLAorMHhlMTgxMTgwZSwweGUzY2VlMGZmLDB4ZTAwMDBiOTUsMHhlMDBiMGI5NywKKzB4ZTA5ZWIwMGIsMHhlMGIzMzAwMCwweGUwMDAwODk2LDB4ZTBiMjIwMDAsCisweGUwMDAwODk0LDB4ZTBhMTEwMDAsMHhlMDAwMGE5NCwweGUwMGEwYTk2LAorMHhlMDlhYTAwMywweGUwYjIyMDAwLDB4ZTJhMTEwMDAsMHhlMDAwMDk5NywKKzB4ZTA5YWEwMDAsMHhlMDAwMDk5NSwweGUwYjIyMDAwLDB4ZTJiMTEwMDAsCisweGU4YmM0MjA5LDB4NWEwMDAwMDksMHhlMzE5MDcwMiwweDFhMDAwMDE3LAorMHhlMTliYjAwYSwweDEzODIyMDAxLDB4ZTM1MzAwMDAsMHhkYWZmZmY3OSwKKzB4ZTI4ZjcwNzgsMHhlMzE5MDA4MCwweDBhZmZmY2NkLDB4ZWFmZmZkMDEsCisweGUwOWJiMDBiLDB4ZTBiYWEwMGEsMHhlMGIyMjAwMiwweGUwYjExMDAxLAorMHhlMjQzMzAwMSwweDVhZmZmZmY5LDB4ZTMxOTA3MDIsMHgxYTAwMDAwNywKKzB4ZTM1MzAwMDAsMHhkYWZmZmY2YiwweGUxOWJiMDBhLDB4MTM4MjIwMDEsCisweGUyOGY3MDM4LDB4ZTMxOTAwODAsMHgwYWZmZmNiZCwweGVhZmZmY2YxLAorMHhlMjE5NTA2MCwweDFhMDAwMDFjLDB4ZTE5YmIwOGEsMHgwMDBhYWY4MiwKKzB4ZTA5MjJmYWEsMHhlMmIxMTAwMCwweGUyYTMzMDAwLDB4MjNhMDExMDIsCisweGUyOTM0MDAxLDB4ZGEwMDAwMWIsMHhlMWIwNDdhNCwweDFhZmZmZTkxLAorMHhlNTljNTA4MCwweGUzMTUwMDEwLDB4MGFmZmZlNTksMHhlMjA5OWEwNywKKzB4ZTA4Yzk0MjksMHhlODg5MDAwZiwweGVhZmZmMmIyLDB4ZTE5YTQwODgsCisweDExYTAyMDBhLDB4MTFhMDEwMDgsMHhlMjQzMzAwMSwweGUzMTkwNzAyLAorMHgxYWZmZmZlZSwweGUzNTMwMDAwLDB4ZGFmZmZmNGEsMHhlMjRmNzA0NCwKKzB4ZTMxOTAwODAsMHgwYWZmZmM5ZSwweGVhZmZmY2QyLDB4ZTE5YmIwMGEsCisweDEzNTUwMDYwLDB4MGFmZmZmZTUsMHhlMTMwMGM4NSwweDRhZmZmZmUzLAorMHhlMjkyMjAwMSwweGVhZmZmZmRlLDB4ZTI2MzMwMDAsMHhlMzUzMDA0MCwKKzB4YWFmZmZmM2MsMHhlMjczNDAyMCwweDQyNDM1MDIwLDB4NDFhMDI1MzEsCisweDUxYTAyMzMyLDB4NTE4MjI0MTEsMHhlMWEwMTMzMSwweGUzYTAzMDAwLAorMHhlYWZmZmZkYSwweGUzNTMwMDAwLDB4MWEwMDAwMDMsMHhlMTkxNTAwMiwKKzB4MGEwMDAwMGMsMHhlMzViMDAwMCwweDFhZmZmZjZjLDB4ZTE5ODUwMGEsCisweDFhZmZmZjZhLDB4ZTA5NjU4ODMsMHgzM2EwMzAwMCwweDMzYTAyMDAwLAorMHgzM2EwMTAwMCwweDNhZmZmZmNkLDB4ZTE5MTUwMDIsMHgxYWZmZmU1OSwKKzB4ZTNhMDE0YzIsMHhlYWZmZmU1NywweGUwOTY1ODhiLDB4M2FmZmZmYzcsCisweGUxOTg1MDBhLDB4MWFmZmZlNDgsMHhlMWEwMzAwYiwweGVhZmZmZmY3LAorMHhlMzE5MDA4MCwweDFhZmZmMjVjLDB4ZTIwOTY4MDcsMHhlMDhjNjYyNiwKKzB4ZTg5NjAwMGYsMHhlMWIwNGQyMywweDBhMDAwMDBiLDB4ZTI4ZjcwMjQsCisweGUzNTQwMDA4LDB4MWFmZmY2ZDQsMHhlM2EwMjAwMCwweGUxYTAzMDgwLAorMHhlMWIwM2MyMywweDEzMzMwMGZmLDB4MTFhMDE0MDAsMHgxMzgxMTEwMiwKKzB4MTI4MzNkZmUsMHgwYWZmZjgwNCwweGU4ODYwMDBmLDB4ZTIwMDAxMDIsCisweGUxODNiMDAwLDB4ZTFhMGEwMDIsMHhlMWEwODAwMSwweGUxYjA2ZTA5LAorMHg0YWZmZmJkMSwweGUwOGM2YzI2LDB4ZTg5NjAwMGYsMHhlMWIwNGQyMywKKzB4MGEwMDAwMzUsMHhlMjhmNzAyNCwweGUzNTQwMDA4LDB4MWFmZmY2YmUsCisweGUzYTAyMDAwLDB4ZTFhMDMwODAsMHhlMWIwM2MyMywweDEzMzMwMGZmLAorMHgxMWEwMTQwMCwweDEzODExMTAyLDB4MTI4MzNkZmUsMHgwYWZmZjdlZSwKKzB4ZTg4NjAwMGYsMHhlYTAwMDAyOCwweGUzMTkwMDgwLDB4MWFmZmYyMzIsCisweGUxYjA4ZTA5LDB4NGFmZmZiYjYsMHhlMDhjOGMyOCwweGU4OTgwMDBmLAorMHhlMWIwNGQyMywweDBhMDAwMDBiLDB4ZTI4ZjcwMjQsMHhlMzU0MDAwOCwKKzB4MWFmZmY2YTksMHhlM2EwMjAwMCwweGUxYTAzMDgwLDB4ZTFiMDNjMjMsCisweDEzMzMwMGZmLDB4MTFhMDE0MDAsMHgxMzgxMTEwMiwweDEyODMzZGZlLAorMHgwYWZmZjdkOSwweGU4ODgwMDBmLDB4ZTIwMDAxMDIsMHhlMTgzYjAwMCwKKzB4ZTFhMGEwMDIsMHhlMWEwODAwMSwweGUyMDk2ODA3LDB4ZTA4YzY2MjYsCisweGU4OTYwMDBmLDB4ZTFiMDRkMjMsMHgwYTAwMDAwYiwweGUyOGY3MDI0LAorMHhlMzU0MDAwOCwweDFhZmZmNjk0LDB4ZTNhMDIwMDAsMHhlMWEwMzA4MCwKKzB4ZTFiMDNjMjMsMHgxMzMzMDBmZiwweDExYTAxNDAwLDB4MTM4MTExMDIsCisweDEyODMzZGZlLDB4MGFmZmY3YzQsMHhlODg2MDAwZiwweGUwMjAwMDBiLAorMHhlM2NiYjEwMiwweGUxYjA0ODgzLDB4MTFiMDU4OGIsMHgxMjk0NDgwMiwKKzB4MTI5NTU4MDIsMHgwYTAwMDA4MiwweGUwNDMzMDBiLDB4ZTI4MzM5MDEsCisweGUyNDMzMDAxLDB4ZTNhMGIwMDAsMHhlMDUyNTAwYSwweGUwZDE0MDA4LAorMHgyM2EwMTAwMywweDJhMDAwMDBjLDB4ZTFhMDUwMDIsMHhlMWEwNDAwMSwKKzB4ZTNhMDEwMDEsMHhlMjQzMzAwMSwweGUwOTU1MDA1LDB4ZTBiNDQwMDQsCisweGUyYWJiMDAwLDB4ZTA1NTcwMGEsMHhlMGQ0NjAwOCwweDMxYjBiMGFiLAorMHgyMWEwNTAwNywweDIxYTA0MDA2LDB4ZTBhMTEwMDEsMHhlMDk1NTAwNSwKKzB4ZTBiNDQwMDQsMHhlMmFiYjAwMCwweGUwNTU3MDBhLDB4ZTBkNDYwMDgsCisweDMxYjBiMGFiLDB4MjFhMDUwMDcsMHgyMWEwNDAwNiwweGUwYTExMDAxLAorMHhlMDk1NTAwNSwweGUwYjQ0MDA0LDB4ZTJhYmIwMDAsMHhlMDU1NzAwYSwKKzB4ZTBkNDYwMDgsMHgzMWIwYjBhYiwweDIxYTA1MDA3LDB4MjFhMDQwMDYsCisweGUwYTExMDAxLDB4ZTA5NTUwMDUsMHhlMGI0NDAwNCwweGUyYWJiMDAwLAorMHhlMDU1NzAwYSwweGUwZDQ2MDA4LDB4MzFiMGIwYWIsMHgyMWEwNTAwNywKKzB4MjFhMDQwMDYsMHhlMGIxMTAwMSwweDNhZmZmZmRhLDB4ZTE5NDIwMDUsCisweDExODkyNjI5LDB4MTIxMjIwODAsMHgwYTAwMDAyNSwweGUzYTAyMDAxLAorMHhlMDk1NTAwNSwweGUwYjQ0MDA0LDB4ZTJhYmIwMDAsMHhlMDU1NzAwYSwKKzB4ZTBkNDYwMDgsMHgzMWIwYjBhYiwweDIxYTA1MDA3LDB4MjFhMDQwMDYsCisweGUwYTIyMDAyLDB4ZTA5NTUwMDUsMHhlMGI0NDAwNCwweGUyYWJiMDAwLAorMHhlMDU1NzAwYSwweGUwZDQ2MDA4LDB4MzFiMGIwYWIsMHgyMWEwNTAwNywKKzB4MjFhMDQwMDYsMHhlMGEyMjAwMiwweGUwOTU1MDA1LDB4ZTBiNDQwMDQsCisweGUyYWJiMDAwLDB4ZTA1NTcwMGEsMHhlMGQ0NjAwOCwweDMxYjBiMGFiLAorMHgyMWEwNTAwNywweDIxYTA0MDA2LDB4ZTBhMjIwMDIsMHhlMDk1NTAwNSwKKzB4ZTBiNDQwMDQsMHhlMmFiYjAwMCwweGUwNTU3MDBhLDB4ZTBkNDYwMDgsCisweDMxYjBiMGFiLDB4MjFhMDUwMDcsMHgyMWEwNDAwNiwweGUwYjIyMDAyLAorMHgzYWZmZmZkYSwweGUzMTkwNzAyLDB4MWEwMDAwMDcsMHhlMTk1NDAwNCwKKzB4MTM4MjIwMDEsMHhlMzUzMDAwMCwweGRhZmZmZTYyLDB4ZTI4ZjcwNDgsCisweGUzMTkwMDgwLDB4MGFmZmZiYjYsMHhlYWZmZmJlYSwweGUyMTk3MDYwLAorMHgxYTAwMDAxNCwweGUwOTU1MDA1LDB4ZTBiNDQwMDQsMHgyYTAwMDAwMiwKKzB4ZTE1NDAwMDgsMHgwMTU1MDAwYSwweDAxMTUwMGEyLDB4ZTJiMjIwMDAsCisweGUyYjExMDAwLDB4ZTJhMzMwMDAsMHgyM2EwMTEwMiwweGUyOTM0MDAxLAorMHhkYWZmZmYxMCwweGUxYjA0N2E0LDB4MWFmZmZkODYsMHhlNTljNTA4MCwKKzB4ZTMxNTAwMTAsMHgwYWZmZmQ0ZSwweGUyMDk5YTA3LDB4ZTA4Yzk0MjksCisweGU4ODkwMDBmLDB4ZWFmZmYxYTcsMHhlMTk0NTAwNSwweDEzNTcwMDYwLAorMHgwYWZmZmZmMSwweGUxMzAwYzg3LDB4NGFmZmZmZWYsMHhlMjkyMjAwMSwKKzB4ZWFmZmZmZWEsMHhlMWIwNDg4MywweDFhMDAwMDEzLDB4ZTE5MTUwMDIsCisweDFhMDAwMDBkLDB4ZTFiMDU4OGIsMHgwMTk4NjAwYSwweDAzYTAxNGMzLAorMHgwM2EwMzBmZiwweDAxODMzMzgzLDB4MGFmZmZkNmEsMHhlMjk1NTgwMiwKKzB4MWFmZmZmZTgsMHhlMTk4NjAwYSwweDBhZmZmZmU2LDB4ZTFhMDEwMDgsCisweGUxYTAyMDBhLDB4ZTFhMDMwMGIsMHhlYWZmZmQ2MiwweGUwOTIyMDAyLAorMHhlMGIxMTAwMSwweGUyNDMzMDAxLDB4NWFmZmZmZmIsMHhlMWIwNTg4YiwKKzB4MWEwMDAwMTAsMHhlMTk4NjAwYSwweDFhMDAwMDBhLDB4ZTI5NDQ4MDIsCisweDFhMDAwMDAxLDB4ZTE5MTYwMDIsMHgxYWZmZmQ1NiwweGUzYTAxMDAwLAorMHhlM2EwMjAwMCwweGUzYTAzMGZmLDB4ZTE4MzMzODMsMHhlMjRmNzBiYywKKzB4ZTNhMDQwMDIsMHhlYWZmZjZiNywweGUwOWFhMDBhLDB4ZTBiODgwMDgsCisweGUyNGJiMDAxLDB4NWFmZmZmZmIsMHhlMjk1NjgwMiwweDEyOTQ2ODAyLAorMHgxYWZmZmY1MCwweGUyOTQ2ODAyLDB4MWEwMDAwMDYsMHhlMTkxNjAwMiwKKzB4MWFmZmZkNDQsMHhlMjk1NjgwMiwweDFhZmZmZmJmLDB4ZTE5ODYwMGEsCisweDAzYTAxMzMxLDB4MGFmZmZkM2YsMHhlMTk4NjAwYSwweDBhZmZmZTA5LAorMHhlMWEwMTAwOCwweGUxYTAyMDBhLDB4ZTFhMDMwMGIsMHhlYWZmZmQzOSwKKzB4ZTMxOTAwODAsMHgxYWZmZjE0NCwweGUyMDk2ODA3LDB4ZTA4YzY2MjYsCisweGU4OTYwMDBmLDB4ZTFiMDRkMjMsMHhlMjhmNzAwMCwweDFhZmZmNWJlLAorMHgxODg2MDAwZiwweGUyMDAwMTAyLDB4ZTE4M2IwMDAsMHhlMWEwYTAwMiwKKzB4ZTFhMDgwMDEsMHhlMWIwNmUwOSwweDRhZmZmYWNkLDB4ZTA4YzZjMjYsCisweGU4OTYwMDBmLDB4ZTFiMDRkMjMsMHhlMjhmNzAwMCwweDFhZmZmNWIyLAorMHgxODg2MDAwZiwweGVhMDAwMDE0LDB4ZTMxOTAwODAsMHgxYWZmZjEyZSwKKzB4ZTFiMDhlMDksMHg0YWZmZmFiYywweGUwOGM4YzI4LDB4ZTg5ODAwMGYsCisweGUxYjA0ZDIzLDB4ZTI4ZjcwMDAsMHgxYWZmZjVhNywweDE4ODgwMDBmLAorMHhlMjAwMDEwMiwweGUxODNiMDAwLDB4ZTFhMGEwMDIsMHhlMWEwODAwMSwKKzB4ZTIwOTY4MDcsMHhlMDhjNjYyNiwweGU4OTYwMDBmLDB4ZTFiMDRkMjMsCisweGUyOGY3MDAwLDB4MWFmZmY1OWMsMHgxODg2MDAwZiwweGUxYTA3MDBiLAorMHhlM2NiYjEwMiwweGUxYjA0ODgzLDB4MTI5NDQ4MDIsMHgxMWIwNTg4YiwKKzB4MTI5NTU4MDIsMHgwYTAwMDA0ZSwweGU5MmM0MjAwLDB4NWEwMDAwMzUsCisweGUyNGI0YzNmLDB4ZTI0NDQwZmUsMHhlMzU0MDAxMCwweGNhMDAwMDJhLAorMHhlMTlhNTQxOCwweDFhMDAwMDJmLDB4ZTI2NDkwMjAsMHhlMWEwOTkzOCwKKzB4ZTAwMDBmODksMHhlOTJjMDA4MCwweGUzYTA4MTAyLDB4ZTNhMGEwMDAsCisweGUzYTA3OTAxLDB4ZTI1N2IwMDEsMHhlOTJjMGQ4MCwweDNiZmZmMmI2LAorMHhlMWIwOTBhOSwweDNhZmZmZmZjLDB4ZThiYzBkODAsMHgxOTJjMDAwZiwKKzB4ZWJmZmYyYjUsMHhlMjgzNDAwMSwweDBhMDAwMDA5LDB4ZTM1NDA5MDIsCisweGFhMDAwMDEwLDB4ZThiYzBkODAsMHhlOTJjMDAwZiwweGUxYTAwMDA3LAorMHhlMWEwMTAwOCwweGUxYTAyMDBhLDB4ZTFhMDMwMGIsMHhlYmZmZjJhYSwKKzB4ZWFmZmZmZWUsMHhlOGJjMDA4MCwweGUzMTcwMTAyLDB4MWJmZmYyZjMsCisweGU4YmM0MjAwLDB4ZTI5MzQwMDEsMHhkYWZmZmU2YSwweGUxYjA0N2E0LAorMHgxYWZmZmNlMCwweGVhMDAwMGNiLDB4ZTI4Y2MwMTAsMHhlOGJjNDI4MCwKKzB4ZTMxNzAxMDIsMHgxYWZmZmRhMywweGVhZmZmY2RhLDB4ZTM1NDAwNDAsCisweDJhMDAwMDEyLDB4ZTI1NDUwMjAsMHgyMWIwNjUxYSwweDBhMDAwMDEwLAorMHhlMTlhNjQxOCwweDBhMDAwMDBlLDB4ZTMxMDAxMDIsMHgxYTAwMDAwZSwKKzB4ZTkyYzAwMDEsMHhlM2EwMDAwMCwweGU5MmMwZDgwLDB4ZTNjOTk2MDEsCisweGViMDAwMGUxLDB4ZThiYzBkODAsMHhlYmZmZjI4YiwweGViMDAwMTY2LAorMHhlOGJjNDIwMSwweDBhMDAwMGIzLDB4ZTI4ZjdlMmYsMHhlYWZmZjYyOSwKKzB4MTNiMDUxMDAsMHgzM2EwMDAwMCwweGVhZmZmZmYwLDB4ZThiYzQyMDAsCisweGUzYTAxNGM3LDB4ZTNhMDIwMDAsMHhlM2EwMzBmZiwweGUxODMzMzgzLAorMHhlYWZmZmNiOCwweGUzNTQwMDAwLDB4MWEwMDAwMWUsMHhlMzUzMDAwMCwKKzB4MGEwMDAwMDIsMHhlMTkxNjAwMiwweDFhZmZmY2IyLDB4ZWEwMDAwMDEsCisweGUxOTE2MDAyLDB4MWEwMDAwMTAsMHhlMWIwNTg4YiwweDFhMDAwMDA2LAorMHhlMTk4NjAwYSwweDAzYTAxMTAyLDB4MDNhMDIwMDAsMHgwM2EwMDAwMCwKKzB4MDNhMDM5MDEsMHgwMjQzMzAwMSwweGVhMDAwMDk2LDB4ZTI5NTU4MDIsCisweDFhMDAwMDk0LDB4ZTE5ODYwMGEsMHgwYTAwMDA5MiwweGUxYTAxMDA4LAorMHhlMWEwMjAwYSwweGUxYTAzMDBiLDB4ZWFmZmZjOWUsMHhlMDkyMjAwMiwKKzB4ZTBiMTEwMDEsMHhlMjQzMzAwMSwweDVhZmZmZmZiLDB4ZTFiMDU4OGIsCisweDEyOTU1ODAyLDB4MWFmZmZmOGYsMHhlMzViMDAwMCwweDBhMDAwMDA4LAorMHhlMWEwMTAwOCwweGUxYTAyMDBhLDB4ZTFhMDAwMDcsMHhlMWEwMzAwYiwKKzB4ZTE5ODYwMGEsMHgxYWZmZmM4ZiwweGUzMTAwMTAyLDB4MTNhMDMwMDAsCisweGVhMDAwMDdjLDB4ZTE5ODYwMGEsMHgwYWZmZmZkZCwweGUwOWFhMDBhLAorMHhlMGI4ODAwOCwweGUyNGJiMDAxLDB4NWFmZmZmZmIsMHhlOTJjNDIwMCwKKzB4ZWFmZmZmYjQsMHhlMzE5MDA4MCwweDFhZmZmMDhmLDB4ZTFiMDhlMDksCisweDRhZmZmYTRlLDB4ZTA4YzhjMjgsMHhlODk4MDAwZiwweGUxYjA0ZDIzLAorMHhlMjhmNzAwMCwweDFhZmZmNTA4LDB4MTg4ODAwMGYsMHhlMjAwMDEwMiwKKzB4ZTE4M2IwMDAsMHhlMWEwYTAwMiwweGUxYTA4MDAxLDB4ZTIwOTY4MDcsCisweGUwOGM2NjI2LDB4ZTg5NjAwMGYsMHhlMWIwNGQyMywweGUyOGY3MDAwLAorMHgxYWZmZjRmZCwweDE4ODYwMDBmLDB4ZTFhMDcwMGIsMHhlM2NiYjEwMiwKKzB4ZTFiMDQ4ODMsMHgxMjk0NDgwMiwweDExYjA1ODhiLDB4MTI5NTU4MDIsCisweDBhMDAwMDBhLDB4ZTkyYzQwMGYsMHhlOTJjMGQ4MCwweGViZmZmMjdmLAorMHhlYmZmZjM2ZiwweGU4YmMwZDgwLDB4ZWJmZmYyMjcsMHhlMjIwMDEwMiwKKzB4ZThiYzBkODAsMHhlYmZmZjE3OCwweGU4YmM0MDAwLDB4ZWEwMDAwNGQsCisweGUxYjA0ODgzLDB4MWEwMDAwMTAsMHhlMTkxNTAwMiwweDFhMDAwMDBhLAorMHhlMWIwNTg4YiwweDAxOTg2MDBhLDB4MGEwMDAwMTMsMHhlMjk1NTgwMiwKKzB4MWEwMDAwMTUsMHhlMTk4NjAwYSwweDBhMDAwMDEzLDB4ZTFhMDEwMDgsCisweGUxYTAyMDBhLDB4ZTFhMDMwMGIsMHhlYWZmZmM0ZSwweGUwOTIyMDAyLAorMHhlMGIxMTAwMSwweGUyNDMzMDAxLDB4NWFmZmZmZmIsMHhlMWIwNTg4YiwKKzB4MWEwMDAwMTIsMHhlMTk4NjAwYSwweDFhMDAwMDBjLDB4ZTI5NDQ4MDIsCisweDFhMDAwMDAxLDB4ZTE5MTYwMDIsMHgxYWZmZmM0MiwweGUzYTAxMzMzLAorMHhlM2IwMjEwMCwweGUyZTIzOTAyLDB4ZWFmZmZjM2UsMHhlM2EwMDAwMCwKKzB4ZTNhMDEwMDAsMHhlM2EwMjAwMCwweGUzYTAzMDAwLDB4ZWEwMDAwMjksCisweGUwOWFhMDBhLDB4ZTBiODgwMDgsMHhlMjRiYjAwMSwweDVhZmZmZmZiLAorMHhlMjk1NjgwMiwweDEyOTQ2ODAyLDB4MWFmZmZmYzksMHhlMjk0NjgwMiwKKzB4MWEwMDAwMDgsMHhlMTkxNjAwMiwweDFhZmZmYzJlLDB4MDNhMDEzMzMsCisweGUyOTU2ODAyLDB4MWFmZmZjMmIsMHhlMTk4NjAwYSwweDExYTAxMDA4LAorMHgxMWEwMjAwYSwweGVhZmZmYzI3LDB4ZTE5ODYwMGEsMHgwYTAwMDAxNSwKKzB4ZTFhMDEwMDgsMHhlMWEwMjAwYSwweGUxYTAzMDBiLDB4ZWFmZmZjMjEsCisweGUzMTkwMDgwLDB4MWFmZmYwMmMsMHhlMWIwN2UwOSwweDRhZmZmOWNiLAorMHhlMDhjOGMyNywweGU4OTgwMDBmLDB4ZTFiMDRkMjMsMHhlMjhmNzAwMCwKKzB4MWFmZmY0YTUsMHgxODg4MDAwZiwweGUxYjA0ODgzLDB4MTI5NDQ4MDIsCisweDBhMDAwMDFkLDB4ZTMxMDAxMDIsMHgxYTAwMDAxNiwweGU5MmM0MDAwLAorMHhlYjAwMDAyOSwweGU4YmM0MDAwLDB4ZTMxOTA3MDIsMHgxYTAwMDAwNSwKKzB4ZTI4ZjcwMTgsMHhlMzUzMDAwMCwweGRhZmZmYTVkLDB4ZTMxOTAwODAsCisweDBhZmZmYTJiLDB4ZWFmZmZhNWYsMHhlMzUzMDAwMCwweGJhMDAwMDA2LAorMHhlNTljNTA4MCwweGUzMTUwMDEwLDB4MGFmZmZiZDEsMHhlMjA5OWEwNywKKzB4ZTA4Yzk0MjksMHhlODg5MDAwZiwweGVhZmZmMDJhLDB4ZTM3MzAwNDAsCisweGNhZmZmY2NlLDB4ZWFmZmZhNGUsMHhlM2EwMTRjNiwweGUzYTAyMDAwLAorMHhlM2EwMzBmZiwweGUxODMzMzgzLDB4ZWFmZmZiZjYsMHhlMzUzMDAwMCwKKzB4MWEwMDAwMDgsMHhlMTkxNDAwMiwweDBhZmZmZmY2LDB4ZTFiMDEwMDEsCisweDRhZmZmZmRiLDB4ZTA5MjIwMDIsMHhlMGIxMTAwMSwweGUyNDMzMDAxLAorMHg1YWZmZmZmYiwweGVhZmZmZmQ2LDB4ZTE5MTQwMDIsMHgxYWZmZmJlOSwKKzB4ZTMxMDAxMDIsMHgwYWZmZmZlMSwweGVhZmZmZmVhLDB4ZTI4ZjRmNTIsCisweGU4OTQwNTAwLDB4ZTE1MTAwMDgsMHgwMTUyMDAwYSwweGUxYTBhMGEyLAorMHhlMThhYWY4MSwweGUxYTA4MGExLDB4ZTM4ODgxMDIsMHhlM2EwYjBmZSwKKzB4ZTE4YmIzMGIsMHhlMDQzNDAwYiwweDkyNDQ0MDAxLDB4ZTkyYzQyMTAsCisweGUxYTAzMDBiLDB4OGEwMDAwMDUsMHhlM2M4ODEwMSwweGUwOTIyMDAyLAorMHhlMGIxMTAwMSwweGUyNDMzMDAxLDB4NWEwMDAwMDMsMHhlYTAwMDAwOCwKKzB4ZTNhMDAxMDIsMHhlMjcyMjAwMCwweGUyZjExMDAwLDB4MDM1MjAwMDAsCisweDBhMDAwMDM1LDB4ZTA5MjIwMDIsMHhlMGIxMTAwMSwweGUyNDMzMDAxLAorMHg1YWZmZmZmOSwweGUzYTA3MDAwLDB4ZWJmZmYxZTAsMHhlOTJjMDAwZiwKKzB4ZWJmZmYxODUsMHhlOTJjMDAwZiwweGUyOGY5MGM0LDB4ZThiOTBkMDAsCisweGViZmZmMTI1LDB4ZTg5YzBkODAsMHhlYmZmZjE4MywweGU4YjkwZDAwLAorMHhlYmZmZjBkOCwweGU4OWMwZDgwLDB4ZWJmZmYxN2YsMHhlOGI5MGQwMCwKKzB4ZWJmZmYxMWQsMHhlODljMGQ4MCwweGU5MmMwMDBmLDB4ZTNhMDAxMDIsCisweGU4YjkwMDBlLDB4ZWJmZmYxNzgsMHhlOGI5MGQwMCwweGViZmZmMGNkLAorMHhlMjhjNDAxMCwweGU4OTQwZDgwLDB4ZWJmZmYxNzMsMHhlOGI5MGQwMCwKKzB4ZWJmZmYxMTEsMHhlOGJjMGQ4MCwweGViZmZmMWM0LDB4ZThiYzBkODAsCisweGViZmZmMTZkLDB4ZTg5YzBkODAsMHhlYmZmZjE2YiwweGU4YmMwZDgwLAorMHhlYmZmZjBiZCwweGU4YmMwMDEwLDB4ZWJmZmYyNWUsMHhlOTJjMDAwZiwKKzB4ZTNhMDAwMDAsMHhlOGI5MDAwZSwweGViZmZmMTYzLDB4ZThiYzBkODAsCisweGViZmZmMGI1LDB4ZThiYzAyMDAsMHhlMzE5MDYwMSwweGUyOGY3MDc0LAorMHgxODk3MGQwMCwweDFiZmZmMTVjLDB4ZThiYzgwMDAsMHhlM2EwMDAwMCwKKzB4ZTNhMDMwMDAsMHhlMjhmOTA1MCwweGVhZmZmZmVkLDB4YjUwNGYzMzMsCisweGY5ZGU2NDg0LDB4OGVhYzAyNWIsMHgzZTcwNzZiYiwweDAwMDA0MDA0LAorMHg5YzA0MWZkMCwweGE5MzNlZjYwLDB4MDAwMDQwMDcsMHhjMDVmZjRlMCwKKzB4NmM4M2JiOTYsMHgwMDAwNDAwOCwweGNhMjBhZDlhLDB4YjVlOTQ2ZTksCisweDAwMDAzZmZlLDB4ODMxMjUxMDAsMHhiNTdmNjUwOSwweDAwMDA0MDAzLAorMHg4MDNmZjg5NSwweDlkYWNkMjI4LDB4MDAwMDQwMDUsMHhiMTcyMTdmNywKKzB4ZDFjZjc5YWMsMHgwMDAwM2ZmZSwweGRlNWJkOGE5LDB4MzcyODcxOTUsCisweDAwMDAzZmZkLDB4ZTMxOTAwODAsMHgxYWZmZWY4MywweGUxYjA3ZTA5LAorMHg0YWZmZjkyNiwweGUwOGM4YzI3LDB4ZTg5ODAwMGYsMHhlMWIwNGQyMywKKzB4ZTI4ZjcwMDAsMHgxYWZmZjNmYywweDE4ODgwMDBmLDB4ZTFhMDQ4ODMsCisweGUyOTQ0ODAyLDB4MGEwMDAwMDUsMHhlOTJjNDAwMCwweGViMDAwMDBhLAorMHhlOGJjNDAwMCwweDBhZmZmZjU3LDB4ZTI0ZjdkMGEsMHhlYWZmZjRjZCwKKzB4ZTE5MTQwMDIsMHgxYWZmZmI2MywweGUzMTAwMTAyLDB4MGFmZmZmNWIsCisweGUzYTAwMDAwLDB4ZTNhMDMwMDAsMHhlYWZmZmY1OCwweGUyOGY0ZjZlLAorMHhlMzEwMDEwMiwweDEyOGY0ZjcyLDB4ZThiNDBkMDAsMHhlMTUzMDAwYiwKKzB4MDE1MTAwMDgsMHgwMTUyMDAwYSwweDhhMDAwMDVkLDB4ZTg5NDBkMDAsCisweGUxNTMwMDBiLDB4MDE1MTAwMDgsMHgwMTUyMDAwYSwweDNhMDAwMDUyLAorMHhlOTJjNDIxZiwweGUyOGY5ZTFiLDB4ZTNhMDcwMDAsMHhlOGI5MGQwMCwKKzB4ZWJmZmYxMTEsMHhlYmZmZjIzOCwweGUzMTcwMTAyLDB4MTI2NDQwMDAsCisweGU1OGM0MDEwLDB4ZTkyYzBkODAsMHhlM2EwMDAwMCwweGU4YjkwMDBlLAorMHhlYmZmZjEwOSwweGU4YmMwZDgwLDB4ZTkyYzAwMGYsMHhlOGI5MDAwZSwKKzB4ZTNhMDAxMDIsMHhlYmZmZjEwNCwweGU5MmMwMDBmLDB4ZTI4YzQwMjAsCisweGU4OTQwMDBmLDB4ZWJmZmYyMGMsMHhlMzE3MDEwMiwweDBiZmZmMDllLAorMHgxYmZmZjA1NCwweGUxYTA0MDBjLDB4ZTkyYzAwMGYsMHhlODk0MDAwZiwKKzB4ZWJmZmYwNGQsMHhlOGJjMGQ4MCwweGViZmZmMDRiLDB4ZTI4Y2MwMTAsCisweGU4YmMwZDgwLDB4ZWJmZmYwNDgsMHhlODhjMDAwZiwweGViZmZmMGVlLAorMHhlOTJjMDAwZiwweGUzYTA3MDAwLDB4ZThiOTBkMDAsMHhlYmZmZjBlZSwKKzB4ZThiOTBkMDAsMHhlYmZmZjA0MywweGU4OWMwZDgwLDB4ZWJmZmYwZWEsCisweGU4YjkwZDAwLDB4ZWJmZmYwM2YsMHhlODljMGQ4MCwweGViZmZmMGU2LAorMHhlOGI5MGQwMCwweGViZmZmMDNiLDB4ZTg5YzBkODAsMHhlOTJjMDAwZiwKKzB4ZTNhMDAwMDAsMHhlOGI5MDAwZSwweGViZmZmMGRmLDB4ZThiOTBkMDAsCisweGViZmZmMDM0LDB4ZTI4YzcwMTAsMHhlODk3MGQ4MCwweGViZmZmMGRhLAorMHhlOGI5MGQwMCwweGViZmZmMDJmLDB4ZTI4YzcwMjAsMHhlODk3MGQ4MCwKKzB4ZWJmZmYwZDUsMHhlOGJjMGQ4MCwweGU5MmMwMDBmLDB4ZTIyMDAxMDIsCisweGViZmZmMDI1LDB4ZTFhMDcwMDAsMHhlMWEwODAwMSwweGUxYTBhMDAyLAorMHhlMWEwYjAwMywweGU4YmMwMDBmLDB4ZWJmZmYxMjAsMHhlOGI5MGQwMCwKKzB4ZWJmZmYwMjAsMHhlMjhjYzAyMCwweGU4YmM0MjEwLDB4ZTI4NDQwMDEsCisweGUwODMzMDA0LDB4ZTNiMDQwMDAsMHhlMWEwZjAwZSwweGUzYjAwMDAwLAorMHhlM2EwMTEwMiwweGUzYTAyMDAwLDB4ZTNhMDM5MDEsMHhlMjQzMzAwMSwKKzB4ZTFhMGYwMGUsMHhlMzEwMDEwMiwweGUzYTAwMDAwLDB4ZTNhMDEwMDAsCisweGUzYTAyMDAwLDB4MTNhMDMwMDAsMHgxM2EwNDAwOCwweDAzYTAzMGZmLAorMHgwMTgzMzM4MywweDAzYjA0MDA0LDB4ZTFhMGYwMGUsMHhiMTcyMTdmNywKKzB4ZDFjZjc5YWIsMHgwMDAwNDAwYywweDgwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAzZmJlLDB4YjIxZGZlN2YsMHgwOWUyYmFhOSwweDAwMDA0MDBjLAorMHg4MDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDNmYmUsMHhiOGFhM2IyOSwKKzB4NWMxN2YwYmMsMHgwMDAwM2ZmZiwweGRlODA4MmUzLDB4MDg2NTQzNjIsCisweDAwMDAzZmYyLDB4YjE4MDAwMDAsMHgwMDAwMDAwMCwweDAwMDAzZmZlLAorMHhjOTliMTg2NywweDI4MjJhOTNlLDB4MDAwMDNmZWEsMHhhNTc4NjJlMSwKKzB4NDZhNmZiMzksMHgwMDAwM2ZmNCwweGU4Yjk0MjhlLDB4ZmVjZmY1OTIsCisweDAwMDAzZmZhLDB4ODAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAzZmZlLAorMHg4NDVhMjE1NywweDM0OTBmMTA2LDB4MDAwMDNmZjAsMHhmODNhNWY5MSwKKzB4NTA5NTJjOTksMHgwMDAwM2ZmNywweDgwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAzZmZkLDB4ODAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAzZmZlLAorMHhlMzE5MDA4MCwweDFhZmZlZWNjLDB4ZTFiMDdlMDksMHg0YWZmZjg3MywKKzB4ZTA4YzhjMjcsMHhlODk4MDAwZiwweGUxYjA0ZDIzLDB4ZTI4ZjcwMDAsCisweDFhZmZmMzQ1LDB4MTg4ODAwMGYsMHhlMWEwNDg4MywweGUyOTQ0ODAyLAorMHgwYTAwMDAwNiwweGU5MmM0MDAwLDB4ZWIwMDAwMDcsMHhlOGJjNDAwMCwKKzB4MGFmZmZlYTAsMHhlMjRmNzA1YywweGUyNDc3YzA1LDB4ZWFmZmY0MTUsCisweGUxOTE0MDAyLDB4MDNhMDEzMzIsMHhlYWZmZmFhYSwweGUyOGY0ZjhmLAorMHhlOGI0MGQwMCwweGUxNTMwMDBiLDB4MDE1MTAwMDgsMHgwMTUyMDAwYSwKKzB4OGEwMDAwNmMsMHhlMWIwMTAwMSwweDVhMDAwMDYzLDB4ZTkyYzQyMWYsCisweGUzMTkwNjAxLDB4ZTI4ZjllMjIsMHhlM2EwNzAwMCwweGU4YjkwZDAwLAorMHhlYmZmZjA2MSwweGViZmZmMTg4LDB4MWIwMDAwNmQsMHhlNThjNDAxMCwKKzB4ZTkyYzBkODAsMHhlM2EwMDAwMCwweGU4YjkwMDBlLDB4ZWJmZmYwNWEsCisweGU4YmMwZDgwLDB4ZTkyYzAwMGYsMHhlOGI5MDAwZSwweGUzYTAwMTAyLAorMHhlYmZmZjA1NSwweGU5MmMwMDBmLDB4ZTI4YzQwMjAsMHhlODk0MDAwZiwKKzB4ZWJmZmYxNWQsMHhlMzE3MDEwMiwweDBiZmZlZmVmLDB4MWJmZmVmYTUsCisweGUxYTA0MDBjLDB4ZTkyYzAwMGYsMHhlODk0MDAwZiwweGViZmZlZjllLAorMHhlOGJjMGQ4MCwweGViZmZlZjljLDB4ZTI4Y2MwMTAsMHhlOGJjMGQ4MCwKKzB4ZWJmZmVmOTksMHhlM2EwNGMzZiwweGUzODQ0MGRmLDB4ZTE1MzAwMDQsCisweGJhMDAwMDM3LDB4ZTg4YzAwMGYsMHhlYmZmZjAzYiwweGU5MmMwMDBmLAorMHhlM2EwNzAwMCwweGU4YjkwZDAwLDB4ZWJmZmYwM2IsMHhlOGI5MGQwMCwKKzB4ZWJmZmVmZDksMHhlODljMGQ4MCwweGViZmZmMDM3LDB4ZThiOTBkMDAsCisweGViZmZlZjhjLDB4ZTg5YzBkODAsMHhlYmZmZjAzMywweGU4YjkwZDAwLAorMHhlYmZmZWZkMSwweGU4OWMwZDgwLDB4ZWJmZmYwMmYsMHhlOGI5MGQwMCwKKzB4ZWJmZmVmODQsMHhlODljMGQ4MCwweGU5MmMwMDBmLDB4ZTNhMDAxMDIsCisweGU4YjkwMDBlLDB4ZWJmZmYwMjgsMHhlOGI5MGQwMCwweGViZmZlZjdkLAorMHhlMjhjNzAxMCwweGU4OTcwZDgwLDB4ZWJmZmYwMjMsMHhlOGI5MGQwMCwKKzB4ZWJmZmVmYzEsMHhlMjhjNzAxMCwweGU4OTcwZDgwLDB4ZWJmZmYwMWUsCisweGUyOGM3MDIwLDB4ZTg5NzBkODAsMHhlYmZmZjAxYiwweGUyOGM3MDIwLAorMHhlODk3MGQ4MCwweGViZmZlZjZjLDB4ZThiYzBkODAsMHhlMjhjYzAyMCwKKzB4ZThiYzAwMTAsMHhlMzE0MDAwMSwweDEyMjAwMTAyLDB4MWJmZmYxYTcsCisweGUyOWI0OTAyLDB4NGEwMDAwMTgsMHhlMzViMDAwMCwweDAxOTg0MDBhLAorMHgwYTAwMDAxNSwweGViZmZmMDYxLDB4ZThiYzQyMDAsMHhlM2IwNDAwMCwKKzB4ZTFhMGYwMGUsMHhlMjRjYzAxMCwweGUzYTA3MDAwLDB4ZTNhMDgxMDIsCisweGUzYjBhMTAwLDB4ZTJlYWI5MDEsMHhlYWZmZmZlYiwweGUxOTE0MDAyLAorMHgwYWZmZmY5OSwweGUyNDMzMDAxLDB4ZTA5MjIwMDIsMHhlMGIxMTAwMSwKKzB4NWFmZmZmZmIsMHhlYWZmZmY5NCwweGUzYTAxMzMyLDB4ZTNiMDIxMDAsCisweGUyZjIzOTAyLDB4ZTNhMDQwMDEsMHhlMWEwZjAwZSwweGUzYTAxMDAwLAorMHhlM2IwMjEwMCwweGUyZjMzOTAyLDB4ZTNhMDQwMDQsMHhlOGJjNDIwMCwKKzB4ZTFhMGYwMGUsMHhlMjg0NDAwMSwweGUzNWIwMDAwLDB4MDNhMDgxMDIsCisweGUzYTA2OTAxLDB4MDI0NmIwMDIsMHgwMWEwZjAwZSwweGUyNDY2MDAyLAorMHhlMDRiNjAwNiwweGUzYTA1MTAyLDB4ZTE1MzAwMGIsMHgwMTUxMDAwOCwKKzB4MDE1MjAwMGEsMHgyMDg4ODYzNSwweDIxYTBmMDBlLDB4ZTA1ODg2MzUsCisweDUxYTA4MDg4LDB4NTI0YmIwMDEsMHhlMjQ0NDAwMSwweGUxYTBmMDBlLAorMHhjOTBmZGFhMiwweDAwMDAwMDAwLDB4MDAwMDQwMWQsMHhhMmY5ODM2ZSwKKzB4NGU0NDE1MmEsMHgwMDAwM2ZmZSwweDk1Nzc3YTVjLDB4ZjcyY2VjZTYsCisweDAwMDAzZmVkLDB4YzkxMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAzZmZmLAorMHg4NWJiYTc4MywweGIzYzc0OGE5LDB4MDAwMDNmZWEsMHhhMzdiMjRjOCwKKzB4NGE0MjA5MmUsMHgwMDAwM2ZmMywweGQyM2NmNTBiLDB4ZjEwYWNhODQsCisweDAwMDAzZmY5LDB4ZWVmNTgyM2YsMHhkZWNlYTk2OSwweDAwMDAzZmZkLAorMHg4MDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDNmZmYsMHg5NWQ1Yjk3NSwKKzB4MTYzOTFkYTgsMHgwMDAwM2ZlZiwweGUwNzQxNTMxLDB4ZGQ1NmY2NTAsCisweDAwMDAzZmY2LDB4ODg5NWFmMmEsMHg2ODQ3ZmNkNSwweDAwMDAzZmZjLAorMHhlMzE5MDA4MCwweDFhZmZlZTAwLDB4ZTFiMDdlMDksMHg0YWZmZjdhYiwKKzB4ZTA4YzhjMjcsMHhlODk4MDAwZiwweGUxYjA0ZDIzLDB4ZTI4ZjcwMDAsCisweDFhZmZmMjc5LDB4MTg4ODAwMGYsMHhlMWEwNDg4MywweGUyOTQ0ODAyLAorMHgwYTAwMDAxNSwweGUxYzAwNTg5LDB4ZTkyYzQwMDAsMHhlMTkxNDAwMiwKKzB4MTI0MzMwMDEsMHhlYmZmZmYzOCwweDFhMDAwMDEyLDB4ZTkyYzAwMGYsCisweGViZmZlZmExLDB4ZTNhMDgxMDIsMHhlM2IwYTEwMCwweGUyZWFiOTAxLAorMHhlYmZmZWVmOCwweGUxYTA3MDAwLDB4ZTFhMDgwMDEsMHhlMWEwYTAwMiwKKzB4ZTFhMGIwMDMsMHhlOGJjMDAwZiwweGViZmZlZmYwLDB4ZTE5MTQwMDIsCisweDEyODMzMDAxLDB4ZThiYzQwMDAsMHhlYWZmZmRjMiwweGUxOTE0MDAyLAorMHgwM2EwMTRjOSwweGVhZmZmOWNmLDB4ZThiYzQwMDAsMHhlMzU0MDAwNCwKKzB4MDNhMDMwMDAsMHgwM2EwMDAwMCwweDBhZmZmZGJhLDB4ZTNhMDE0YzksCisweGUzYjAyMTAwLDB4ZTJlMjM5MDIsMHhlYWZmZjljNiwweGUzMTkwMDgwLAorMHgxYWZmZWRkMSwweGUxYjA3ZTA5LDB4NGFmZmY3ODAsMHhlMDhjOGMyNywKKzB4ZTg5ODAwMGYsMHhlMWIwNGQyMywweGUyOGY3MDAwLDB4MWFmZmYyNGEsCisweDE4ODgwMDBmLDB4ZTFiMDQ4ODMsMHgwYTAwMDA2YiwweDUyOTQ0ODAyLAorMHg0YTAwMDA3MiwweGU5MmM0MjAxLDB4ZTNhMDAwMDAsMHhlM2EwNTkwMSwKKzB4ZTI0NTUwMDIsMHhlMTUzMDAwNSwweGFhMDAwMDA5LDB4ZTIwOTQ1MDEsCisweGU5MmMwMDEwLDB4ZTNhMDQ5MDEsMHhlMjQ0NDAyMSwweGUxNTMwMDA0LAorMHhiYTAwMDA0OSwweGU5MmMwMDBmLDB4ZWJmZmVmNmIsMHhlOTJjMDAwZiwKKzB4ZWEwMDAwMTIsMHhlMjA5NDUwMSwweGUyMjQ0NTAxLDB4ZTkyYzAwMTAsCisweGUzYTAwMTAyLDB4ZTNhMDgxMDIsMHhlM2IwYTEwMCwweGUyZWFiOTAxLAorMHhlYmZmZWViYywweGUxOTE0MDAyLDB4MGEwMDAwM2IsMHhlMjQzMzAwMSwKKzB4ZTI0Y2MwMTAsMHhlOTJjMDAwZiwweGViZmZmMDFjLDB4ZTIyMDAxMDIsCisweGUyODMzMDAxLDB4ZTI4YzQwMTAsMHhlODg0MDAwZiwweGU4OWMwMDBmLAorMHhlMjhmOWY1OSwweGU4YjkwZDAwLDB4ZWJmZmVlZjcsMHhlODljMGQ4MCwKKzB4ZWJmZmVmNTUsMHhlOGI5MGQwMCwweGViZmZlZWFhLDB4ZTg5YzBkODAsCisweGViZmZlZjUxLDB4ZThiOTBkMDAsMHhlYmZmZWVlZiwweGU4OWMwZDgwLAorMHhlYmZmZWY0ZCwweGU4YjkwZDAwLDB4ZWJmZmVlYTIsMHhlODljMGQ4MCwKKzB4ZWJmZmVmNDksMHhlOGI5MGQwMCwweGViZmZlZWU3LDB4ZTg5YzBkODAsCisweGU5MmMwMDBmLDB4ZTNhMDAxMDIsMHhlOGI5MDAwZSwweGViZmZlZjQyLAorMHhlOGI5MGQwMCwweGViZmZlZTk3LDB4ZTI4YzcwMTAsMHhlODk3MGQ4MCwKKzB4ZWJmZmVmM2QsMHhlOGI5MGQwMCwweGViZmZlZWRiLDB4ZTI4YzcwMTAsCisweGU4OTcwZDgwLDB4ZWJmZmVmMzgsMHhlOGI5MGQwMCwweGViZmZlZThkLAorMHhlMjhjNzAxMCwweGU4OTcwZDgwLDB4ZWJmZmVmMzMsMHhlOGI5MGQwMCwKKzB4ZWJmZmVlZDEsMHhlMjhjNzAxMCwweGU4OTcwZDgwLDB4ZWJmZmVmMmUsCisweGU4YmMwZDgwLDB4ZTI4Y2MwMTAsMHhlYmZmZWY4MCwweGU4OWMwZDgwLAorMHhlYmZmZWYyOSwweGU4YmMwZDgwLDB4ZWJmZmVlN2IsMHhlOGJjMDIzMCwKKzB4ZTMxOTA1MDEsMHgwYTAwMDAwOCwweGUzMTUwMTAyLDB4MDI4ZjVjMDEsCisweDEyOGY1ZjQ2LDB4ZTA4NTU5MjQsMHgwMjIwMDEwMiwweGU4OTUwZDAwLAorMHhlYmZmZWU3NCwweGU4YmM0MDAwLDB4ZWFmZmZkNDYsMHhlMzE1MDEwMiwKKzB4ZTI4ZjUwZGMsMHhlMDg1NTkyNCwweGU4OTUwZDAwLDB4ZWJmZmVlNmQsCisweDEyMjAwMTAyLDB4ZThiYzQwMDAsMHhlYWZmZmQzZSwweGUxOTE1MDAyLAorMHgwYWZmZmY5MywweGUxYjAxMDAxLDB4NGFmZmZmOTEsMHhlMjQzMzAwMSwKKzB4ZTA5MjIwMDIsMHhlMGIxMTAwMSwweDVhZmZmZmZiLDB4ZWFmZmZmOGMsCisweGUyZjM1OTAxLDB4MDE5MjUwODEsMHgwYWZmZmY4OSwweGUyOTQ0ODAyLAorMHgxYTAwMDAwMSwweGUxOTE0MDAyLDB4MWFmZmY5M2UsMHhlM2EwMTRjYSwKKzB4ZTNiMDIxMDAsMHhlMmUyMzkwMiwweGVhZmZmOTNhLDB4YmU5NzQzNzcsCisweGNjMzBmOWU2LDB4MDAwMDQwMDMsMHg5NmYzZTRiMiwweGM4ZTM3Y2JjLAorMHgwMDAwNDAwNiwweGJlZWU3N2UyLDB4YjU0MjNjZjMsMHgwMDAwNDAwNywKKzB4ZDA5Mjc4ODAsMHhmNWMyMTcwYiwweDAwMDA0MDA3LDB4YTQzNjAxZjEsCisweDVjM2U2MTk2LDB4MDAwMDQwMDYsMHhiMjVkZWRhZiwweDMwZjMyNDJjLAorMHgwMDAwM2ZmZSwweGEyNzBiYjI3LDB4NjFjOTM5NTcsMHgwMDAwNDAwMiwKKzB4OWVjMTY1NGQsMHgzNmQ0ZjgyMCwweDAwMDA0MDA0LDB4ZTRkNTM5YjAsCisweDU2YTQ1MWFkLDB4MDAwMDQwMDQsMHhkYWYyYWQ0MSwweGQwNTMxMWM0LAorMHgwMDAwNDAwMywweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHhjOTBmZGFhMiwweDIxNjhjMjM1LDB4MDAwMDNmZmYsCisweGM5MGZkYWEyLDB4MjE2OGMyMzUsMHgwMDAwNDAwMCwweDAwMDAwMDAwLAorMHhjOTBmZGFhMiwweDIxNjhjMjM1LDB4MDAwMDNmZmYsMHhlMzE5MDA4MCwKKzB4MWFmZmVkMTksMHhlMjA5NjgwNywweGUwOGM2NjI2LDB4ZTg5NjAwMGYsCisweGUxYjA0ZDIzLDB4ZTI4ZjcwMDAsMHgxYWZmZjE5MywweDE4ODYwMDBmLAorMHhlMjAwMDEwMiwweGUxODNiMDAwLDB4ZTFhMGEwMDIsMHhlMWEwODAwMSwKKzB4ZTFiMDZlMDksMHg0YWZmZjZjOSwweGUwOGM2YzI2LDB4ZTg5NjAwMGYsCisweGUxYjA0ZDIzLDB4ZTI4ZjcwMDAsMHgxYWZmZjE4NywweDE4ODYwMDBmLAorMHhlMWEwNzAwYiwweGUzY2JiMTAyLDB4ZTFiMDQ4ODMsMHgxMjk0NDgwMiwKKzB4MTFiMDU4OGIsMHgxMjk1NTgwMiwweDE5MmM0MjgxLDB4MWJmZmVmMGIsCisweDFhMDAwMDRlLDB4ZTFiMDQ4ODMsMHgxYTAwMDAxMCwweGUxOTE1MDAyLAorMHgxYTAwMDAwYSwweGUxYjA1ODhiLDB4MDE5ODYwMGEsMHgwYTAwMDAxZiwKKzB4ZTI5NTU4MDIsMHgxYTAwMDAxNiwweGUxOTg2MDBhLDB4MGEwMDAwMTQsCisweGUxYTAxMDA4LDB4ZTFhMDIwMGEsMHhlMWEwMzAwYiwweGVhZmZmOGUxLAorMHhlMDkyMjAwMiwweGUwYjExMDAxLDB4ZTI0MzMwMDEsMHg1YWZmZmZmYiwKKzB4ZTFiMDU4OGIsMHgxYTAwMDAxOSwweGUxOTg2MDBhLDB4MWEwMDAwMTMsCisweGUyOTQ0ODAyLDB4MWEwMDAwMDEsMHhlMTkxNjAwMiwweDFhZmZmOGQ1LAorMHhlMWEwNDAwMCwweGUxYTA1MDA3LDB4ZTI4ZjBmYmQsMHhlODkwMDAwZSwKKzB4ZWEwMDAwOGMsMHhlMWEwNDAwMCwweGUxYTA1MDA3LDB4ZTNhMDAwMDAsCisweGUzYTAxMDAwLDB4ZTNhMDIwMDAsMHhlM2EwMzAwMCwweGVhMDAwMDdkLAorMHhlM2EwMTRjYiwweGUzYjAyMTAwLDB4ZTJlMjM5MDIsMHhlYWZmZjhjNSwKKzB4ZTA5YWEwMGEsMHhlMGI4ODAwOCwweGUyNGJiMDAxLDB4NWFmZmZmZmIsCisweGUyOTU2ODAyLDB4MTI5NDY4MDIsMHgxYWZmZmZjYSwweGUyOTQ2ODAyLAorMHgxYTAwMDAwNiwweGUxOTE2MDAyLDB4MWFmZmY4YmEsMHhlMjk1NjgwMiwKKzB4MWFmZmZmZTIsMHhlMTk4NjAwYSwweDAzYTAxNGNiLDB4MGFmZmY4YjUsCisweGUxOTg2MDBhLDB4MGFmZmZmZTIsMHhlMWEwMTAwOCwweGUxYTAyMDBhLAorMHhlMWEwMzAwYiwweGVhZmZmOGFmLDB4ZTMxOTAwODAsMHgxYWZmZWNiYSwKKzB4ZTFiMDdlMDksMHg0YWZmZjY3MSwweGUwOGM4YzI3LDB4ZTg5ODAwMGYsCisweGUxYjA0ZDIzLDB4ZTI4ZjcwMDAsMHgxYWZmZjEzMywweDE4ODgwMDBmLAorMHhlMWIwNDg4MywweDEyOTQ0ODAyLDB4MGEwMDAwNjAsMHhlOTJjNDI4MSwKKzB4ZTNiMDAxMDAsMHhlMmYzNDkwMSwweGRiZmZlZWIwLDB4ZDNhMDQwMDIsCisweGMzYTA0MDAwLDB4ZTI4ZjlkMDYsMHhlOGI5MGQwMCwweGUxNTMwMDBiLAorMHgwMTUxMDAwOCwweDAxNTIwMDBhLDB4YzI4NDQwMDEsMHhlOTJjMDAxMCwKKzB4ZGEwMDAwMGQsMHhlOTJjMDAwZiwweGU4OTkwZDAwLDB4ZWJmZmVkYWQsCisweGU4YmMwZDgwLDB4ZTkyYzAwMGYsMHhlM2EwMDAwMCwweGU4YjkwMDBlLAorMHhlYmZmZWU1MSwweGUzYTA4MTAyLDB4ZTNiMGExMDAsMHhlMmVhYjkwMSwKKzB4ZWJmZmVkZWQsMHhlOGJjMGQ4MCwweGViZmZlZWEwLDB4ZTNhMDQ5MDEsCisweGUyNDQ0MDIxLDB4ZTE1MzAwMDQsMHhiYTAwMDAyYywweGU5MmMwMDBmLAorMHhlYmZmZWU0MSwweGU5MmMwMDBmLDB4ZTI4ZjlmNDksMHhlOGI5MGQwMCwKKzB4ZWJmZmVkOTgsMHhlODljMGQ4MCwweGViZmZlZTNmLDB4ZThiOTBkMDAsCisweGViZmZlZDk0LDB4ZTg5YzBkODAsMHhlYmZmZWUzYiwweGU4YjkwZDAwLAorMHhlYmZmZWQ5MCwweGU4OWMwZDgwLDB4ZWJmZmVlMzcsMHhlOGI5MGQwMCwKKzB4ZWJmZmVkOGMsMHhlODljMGQ4MCwweGU5MmMwMDBmLDB4ZTNhMDAxMDIsCisweGU4YjkwMDBlLDB4ZWJmZmVlMzAsMHhlOGI5MGQwMCwweGViZmZlZGNlLAorMHhlMjhjNzAxMCwweGU4OTcwZDgwLDB4ZWJmZmVlMmIsMHhlOGI5MGQwMCwKKzB4ZWJmZmVkYzksMHhlMjhjNzAxMCwweGU4OTcwZDgwLDB4ZWJmZmVlMjYsCisweGU4YjkwZDAwLDB4ZWJmZmVkYzQsMHhlMjhjNzAxMCwweGU4OTcwZDgwLAorMHhlYmZmZWUyMSwweGU4YmMwZDgwLDB4ZTI4Y2MwMTAsMHhlYmZmZWU3MywKKzB4ZTg5YzBkODAsMHhlYmZmZWUxYywweGU4YmMwZDgwLDB4ZWJmZmVkNmUsCisweGUyOGY5MGRjLDB4ZThiYzAwMTAsMHhlMDIwMGYwNCwweGUwODk5MjA0LAorMHhlODk5MGQwMCwweGViZmZlZDZiLDB4ZThiYzQyMzAsMHhlMzE5MDYwMSwKKzB4MTAyMDAwMDQsMHgxYWZmZmMzYiwweGUzMTUwMTAyLDB4MGEwMDAwMDUsCisweGU5MmM0MDEwLDB4ZTIyMDAxMDIsMHhlMjRmN2QwZCwweGU4OTcwZDAwLAorMHhlYmZmZWQ2MCwweGU4YmM0MDEwLDB4ZTAyMDAwMDQsMHhlYWZmZmMzMSwKKzB4ZTM1MzAwMDAsMHgwYWZmZmMyZiwweGUxOTE0MDAyLDB4MWFmZmY4M2QsCisweGUyOGYwMDljLDB4ZTg5MDAwMGUsMHhlYWZmZmMyYSwweDg5MzBhMmY0LAorMHhmNjZhYjE4YSwweDAwMDAzZmZkLDB4ZGRiM2Q3NDIsMHhjMjY1NTM5ZSwKKzB4MDAwMDNmZmYsMHhmMDYyNGYwYSwweDU2Mzg4MzEwLDB4MDAwMDQwMDIsCisweGVlNTA1MTkwLDB4NmQxZWI0ZTgsMHgwMDAwNDAwNCwweGFjNTA5MDIwLAorMHg1YjZkMjQzYiwweDAwMDA0MDA1LDB4YTQ0M2U1ZTYsMHgyNGFkNGI5MCwKKzB4MDAwMDQwMDQsMHhkNjZiZDZjZCwweDhjM2RlOTM0LDB4MDAwMDNmZmUsCisweDg3ZTlmYWU0LDB4NmI1MzFhMjksMHgwMDAwNDAwMiwweGE0MGJmZGNmLAorMHgxNWU2NTY5MSwweDAwMDA0MDAzLDB4ZGIwNTMyODgsMHgzMGU3MGViNCwKKzB4MDAwMDQwMDIsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4ODYwYTkxYzEsMHg2YjliMmMyMywweDAwMDAzZmZlLAorMHgwMDAwMDAwMCwweGM5MGZkYWEyLDB4MjE2OGMyMzUsMHgwMDAwM2ZmZiwKKzB4MDAwMDAwMDAsMHg4NjBhOTFjMSwweDZiOWIyYzIzLDB4MDAwMDNmZmYsCisweGU5MmQ1MDAxLDB4ZTI0ZmMwNWMsMHhlMjRjY2M1MCwweGUzYTAwODA3LAorMHhlNThjMDA4MCwweGU4YmQ5MDAxLDB4ZTFhMDAwMDAsMHhlMzEwMDAwMSwKKzB4MTI4ZjBlMTUsMHgxYTAwMDAwYSwweGUzMTAwMDA0LDB4MTI4ZjBmNDcsCisweDFhMDAwMDA3LDB4ZTMxMDAwMDIsMHgxMjhmMDBlMCwweDFhMDAwMDA0LAorMHhlMzEwMDAwOCwweDEyOGYwMGE4LDB4MWEwMDAwMDEsMHhlMjhmMDA3MCwKKzB4ZWFmZmZmZmYsMHhlMjhmMTAxYywweGUxNGZiMDAwLDB4ZThiZDA3ZjgsCisweGU4YTEwN2Y4LDB4ZThiZDA3ZjgsMHhlMjRhYTAwNCwweGU4YTEwZmY4LAorMHhlMjhmMTAwMCwweGVmMDAwMDcxLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDIyNzgsCisweGZmZmZmZmZmLDB4ODAwMDAyMDQsMHg2MTZmNmM0NiwweDY3NmU2OTc0LAorMHg2OTZmNTAyMCwweDQ1MjA3NDZlLDB4NzA2NTYzNzgsMHg2ZTZmNjk3NCwKKzB4NDkyMDNhMjAsMHg2MTc4NjU2ZSwweDUyMjA3NDYzLDB4NmM3NTczNjUsCisweDAwMDAwMDc0LDB4ODAwMDAyMDMsMHg2MTZmNmM0NiwweDY3NmU2OTc0LAorMHg2OTZmNTAyMCwweDQ1MjA3NDZlLDB4NzA2NTYzNzgsMHg2ZTZmNjk3NCwKKzB4NTUyMDNhMjAsMHg3MjY1NjQ2ZSwweDc3NmY2YzY2LDB4MDAwMDAwMDAsCisweDgwMDAwMjAyLDB4NjE2ZjZjNDYsMHg2NzZlNjk3NCwweDY5NmY1MDIwLAorMHg0NTIwNzQ2ZSwweDcwNjU2Mzc4LDB4NmU2ZjY5NzQsMHg0NDIwM2EyMCwKKzB4NjQ2OTc2NjksMHg3OTQyMjA2NSwweDcyNjU1YTIwLDB4MDAwMDAwNmYsCisweDgwMDAwMjAxLDB4NjE2ZjZjNDYsMHg2NzZlNjk3NCwweDY5NmY1MDIwLAorMHg0NTIwNzQ2ZSwweDcwNjU2Mzc4LDB4NmU2ZjY5NzQsMHg0ZjIwM2EyMCwKKzB4NjY3MjY1NzYsMHgwMDc3NmY2YywweDgwMDAwMjAwLDB4NjE2ZjZjNDYsCisweDY3NmU2OTc0LDB4Njk2ZjUwMjAsMHg0NTIwNzQ2ZSwweDcwNjU2Mzc4LAorMHg2ZTZmNjk3NCwweDQ5MjAzYTIwLDB4NmM2MTc2NmUsMHg0ZjIwNjQ2OSwKKzB4NjE3MjY1NzAsMHg2ZTZmNjk3NCwweDAwMDAwMDAwLDB4ZmVmZWZlZmYsMH0gOworCit1bnNpZ25lZCBsb25nIGZwZXNpemUgPSAweDAwMDA1MzAwIDsKZGlmZiAtLWdpdCBhL3NpbS9hcm0vYXJtaW5pdC5jIGIvc2ltL2FybS9hcm1pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmN2IxYwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9hcm0vYXJtaW5pdC5jCkBAIC0wLDAgKzEsMjk0IEBACisvKiAgYXJtaW5pdC5jIC0tIEFSTXVsYXRvciBpbml0aWFsaXphdGlvbjogIEFSTTYgSW5zdHJ1Y3Rpb24gRW11bGF0b3IuCisgICAgQ29weXJpZ2h0IChDKSAxOTk0IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTHRkLgorIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KKworI2luY2x1ZGUgImFybWRlZnMuaCIKKyNpbmNsdWRlICJhcm1lbXUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgIERlZmluaXRpb25zIGZvciB0aGUgZW11bGF0b3IgYXJjaGl0ZWN0dXJlICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFSTXVsX0VtdWxhdGVJbml0KHZvaWQpIDsKK0FSTXVsX1N0YXRlICpBUk11bF9OZXdTdGF0ZSh2b2lkKSA7Cit2b2lkIEFSTXVsX1Jlc2V0KEFSTXVsX1N0YXRlICpzdGF0ZSkgOworQVJNd29yZCBBUk11bF9Eb0N5Y2xlKEFSTXVsX1N0YXRlICpzdGF0ZSkgOwordW5zaWduZWQgQVJNdWxfRG9Db1BybyhBUk11bF9TdGF0ZSAqc3RhdGUpIDsKK0FSTXdvcmQgQVJNdWxfRG9Qcm9nKEFSTXVsX1N0YXRlICpzdGF0ZSkgOworQVJNd29yZCBBUk11bF9Eb0luc3RyKEFSTXVsX1N0YXRlICpzdGF0ZSkgOwordm9pZCBBUk11bF9BYm9ydChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgYWRkcmVzcykgOworCit1bnNpZ25lZCBBUk11bF9NdWx0VGFibGVbMzJdID0gezEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTMsMTQsMTQsMTUsMTUsMTYsMTYsMTZ9IDsKK0FSTXdvcmQgQVJNdWxfSW1tZWRUYWJsZVs0MDk2XSA7IC8qIGltbWVkaWF0ZSBEUCBMSFMgdmFsdWVzICovCitjaGFyIEFSTXVsX0JpdExpc3RbMjU2XSA7IC8qIG51bWJlciBvZiBiaXRzIGluIGEgYnl0ZSB0YWJsZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgIENhbGwgdGhpcyByb3V0aW5lIG9uY2UgdG8gc2V0IHVwIHRoZSBlbXVsYXRvcidzIHRhYmxlcy4gICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQVJNdWxfRW11bGF0ZUluaXQodm9pZCkKK3t1bnNpZ25lZCBsb25nIGksIGogOworCisgZm9yIChpID0gMCA7IGkgPCA0MDk2IDsgaSsrKSB7IC8qIHRoZSB2YWx1ZXMgb2YgMTIgYml0IGRwIHJocydzICovCisgICAgQVJNdWxfSW1tZWRUYWJsZVtpXSA9IFJPVEFURVIoaSAmIDB4ZmZMLChpID4+IDdMKSAmIDB4MWVMKSA7CisgICAgfQorCisgZm9yIChpID0gMCA7IGkgPCAyNTYgOyBBUk11bF9CaXRMaXN0W2krK10gPSAwICkgOyAvKiBob3cgbWFueSBiaXRzIGluIExTTSAqLworIGZvciAoaiA9IDEgOyBqIDwgMjU2IDsgaiA8PD0gMSkKKyAgICBmb3IgKGkgPSAwIDsgaSA8IDI1NiA7IGkrKykKKyAgICAgICBpZiAoKGkgJiBqKSA+IDAgKQorICAgICAgICAgIEFSTXVsX0JpdExpc3RbaV0rKyA7CisKKyAgZm9yIChpID0gMCA7IGkgPCAyNTYgOyBpKyspCisgICAgQVJNdWxfQml0TGlzdFtpXSAqPSA0IDsgLyogeW91IGFsd2F5cyBuZWVkIDQgdGltZXMgdGhlc2UgdmFsdWVzICovCisgICAgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgUmV0dXJucyBhIG5ldyBpbnN0YW50aWF0aW9uIG9mIHRoZSBBUk11bGF0b3IncyBzdGF0ZSAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQVJNdWxfU3RhdGUgKkFSTXVsX05ld1N0YXRlKHZvaWQpCit7QVJNdWxfU3RhdGUgKnN0YXRlIDsKKyB1bnNpZ25lZCBpLCBqIDsKKworIHN0YXRlID0gKEFSTXVsX1N0YXRlICopbWFsbG9jKHNpemVvZihBUk11bF9TdGF0ZSkpIDsKKyBtZW1zZXQgKHN0YXRlLCAwLCBzaXplb2YgKEFSTXVsX1N0YXRlKSk7CisKKyBzdGF0ZS0+RW11bGF0ZSA9IFJVTiA7CisgZm9yIChpID0gMCA7IGkgPCAxNiA7IGkrKykgeworICAgIHN0YXRlLT5SZWdbaV0gPSAwIDsKKyAgICBmb3IgKGogPSAwIDsgaiA8IDcgOyBqKyspCisgICAgICAgc3RhdGUtPlJlZ0Jhbmtbal1baV0gPSAwIDsKKyAgICB9CisgZm9yIChpID0gMCA7IGkgPCA3IDsgaSsrKQorICAgIHN0YXRlLT5TcHNyW2ldID0gMCA7Cisgc3RhdGUtPk1vZGUgPSAwIDsKKworIHN0YXRlLT5DYWxsRGVidWcgPSBGQUxTRSA7Cisgc3RhdGUtPkRlYnVnID0gRkFMU0UgOworIHN0YXRlLT5WZWN0b3JDYXRjaCA9IDAgOworIHN0YXRlLT5BYm9ydGVkID0gRkFMU0UgOworIHN0YXRlLT5SZXNldGVkID0gRkFMU0UgOworIHN0YXRlLT5JbnRlZCA9IDMgOworIHN0YXRlLT5MYXN0SW50ZWQgPSAzIDsKKworIHN0YXRlLT5NZW1EYXRhUHRyID0gTlVMTCA7Cisgc3RhdGUtPk1lbUluUHRyID0gTlVMTCA7Cisgc3RhdGUtPk1lbU91dFB0ciA9IE5VTEwgOworIHN0YXRlLT5NZW1TcGFyZVB0ciA9IE5VTEwgOworIHN0YXRlLT5NZW1TaXplID0gMCA7CisKKyBzdGF0ZS0+T1NwdHIgPSBOVUxMIDsKKyBzdGF0ZS0+Q29tbWFuZExpbmUgPSBOVUxMIDsKKworIHN0YXRlLT5FdmVudFNldCA9IDAgOworIHN0YXRlLT5Ob3cgPSAwIDsKKyBzdGF0ZS0+RXZlbnRQdHIgPSAoc3RydWN0IEV2ZW50Tm9kZSAqKiltYWxsb2MoKHVuc2lnbmVkKUVWRU5UTElTVFNJWkUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IEV2ZW50Tm9kZSAqKSkgOworIGZvciAoaSA9IDAgOyBpIDwgRVZFTlRMSVNUU0laRSA7IGkrKykKKyAgICAqKHN0YXRlLT5FdmVudFB0ciArIGkpID0gTlVMTCA7CisKKyNpZmRlZiBBUk02MQorIHN0YXRlLT5wcm9nMzJTaWcgPSBMT1cgOworIHN0YXRlLT5kYXRhMzJTaWcgPSBMT1cgOworI2Vsc2UKKyBzdGF0ZS0+cHJvZzMyU2lnID0gSElHSCA7Cisgc3RhdGUtPmRhdGEzMlNpZyA9IEhJR0ggOworI2VuZGlmCisKKyBzdGF0ZS0+bGF0ZWFidFNpZyA9IExPVyA7Cisgc3RhdGUtPmJpZ2VuZFNpZyA9IExPVyA7CisKKyBBUk11bF9SZXNldChzdGF0ZSkgOworIHJldHVybihzdGF0ZSkgOworIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgQ2FsbCB0aGlzIHJvdXRpbmUgdG8gc2V0IEFSTXVsYXRvciB0byBtb2RlbCBhIGNlcnRhaW4gcHJvY2Vzc29yICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAordm9pZCBBUk11bF9TZWxlY3RQcm9jZXNzb3IoQVJNdWxfU3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBwcm9jZXNzb3IpIHsKKyAgaWYgKHByb2Nlc3NvciAmIEFSTV9GaXgyNl9Qcm9wKSB7CisgICAgc3RhdGUtPnByb2czMlNpZyA9IExPVzsKKyAgICBzdGF0ZS0+ZGF0YTMyU2lnID0gTE9XOworICB9ZWxzZXsKKyAgICBzdGF0ZS0+cHJvZzMyU2lnID0gSElHSDsKKyAgICBzdGF0ZS0+ZGF0YTMyU2lnID0gSElHSDsKKyAgfQorIAorICBzdGF0ZS0+bGF0ZWFidFNpZyA9IExPVzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogQ2FsbCB0aGlzIHJvdXRpbmUgdG8gc2V0IHVwIHRoZSBpbml0aWFsIG1hY2hpbmUgc3RhdGUgKG9yIHBlcmZvcm0gYSBSRVNFVCAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFSTXVsX1Jlc2V0KEFSTXVsX1N0YXRlICpzdGF0ZSkKK3tzdGF0ZS0+TmV4dEluc3RyID0gMCA7CisgaWYgKHN0YXRlLT5wcm9nMzJTaWcpIHsKKyAgICBzdGF0ZS0+UmVnWzE1XSA9IDAgOworICAgIHN0YXRlLT5DcHNyID0gSU5UQklUUyB8IFNWQzMyTU9ERSA7CisgICAgfQorIGVsc2UgeworICAgIHN0YXRlLT5SZWdbMTVdID0gUjE1SU5UQklUUyB8IFNWQzI2TU9ERSA7CisgICAgc3RhdGUtPkNwc3IgPSBJTlRCSVRTIHwgU1ZDMjZNT0RFIDsKKyAgICB9CisgQVJNdWxfQ1BTUkFsdGVyZWQoc3RhdGUpIDsKKyBzdGF0ZS0+QmFuayA9IFNWQ0JBTksgOworIEZMVVNIUElQRSA7CisKKyBzdGF0ZS0+RW5kQ29uZGl0aW9uID0gMCA7Cisgc3RhdGUtPkVycm9yQ29kZSA9IDAgOworCisgc3RhdGUtPkV4Y2VwdGlvbiA9IEZBTFNFIDsKKyBzdGF0ZS0+TnJlc2V0U2lnID0gSElHSCA7Cisgc3RhdGUtPk5maXFTaWcgPSBISUdIIDsKKyBzdGF0ZS0+TmlycVNpZyA9IEhJR0ggOworIHN0YXRlLT5OdHJhbnNTaWcgPSAoc3RhdGUtPk1vZGUgJiAzKT9ISUdIOkxPVyA7Cisgc3RhdGUtPmFib3J0U2lnID0gTE9XIDsKKyBzdGF0ZS0+QWJvcnRBZGRyID0gMSA7CisKKyBzdGF0ZS0+TnVtSW5zdHJzID0gMCA7Cisgc3RhdGUtPk51bU5jeWNsZXMgPSAwIDsKKyBzdGF0ZS0+TnVtU2N5Y2xlcyA9IDAgOworIHN0YXRlLT5OdW1JY3ljbGVzID0gMCA7Cisgc3RhdGUtPk51bUNjeWNsZXMgPSAwIDsKKyBzdGF0ZS0+TnVtRmN5Y2xlcyA9IDAgOworI2lmZGVmIEFTSU0gICAgCisgICh2b2lkKUFSTXVsX01lbW9yeUluaXQoKSA7CisgIEFSTXVsX09TSW5pdChzdGF0ZSkgOworI2VuZGlmICAKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiBFbXVsYXRlIHRoZSBleGVjdXRpb24gb2YgYW4gZW50aXJlIHByb2dyYW0uICBTdGFydCB0aGUgY29ycmVjdCBlbXVsYXRvciAgICoKKyogKEVtdWxhdGUyNiBmb3IgYSAyNiBiaXQgQVJNIGFuZCBFbXVsYXRlMzIgZm9yIGEgMzIgYml0IEFSTSksIHJldHVybiB0aGUgICAqCisqIGFkZHJlc3Mgb2YgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gdGhhdCBpcyBleGVjdXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQVJNd29yZCBBUk11bF9Eb1Byb2coQVJNdWxfU3RhdGUgKnN0YXRlKQore0FSTXdvcmQgcGMgPSAwIDsKKworIHN0YXRlLT5FbXVsYXRlID0gUlVOIDsKKyB3aGlsZSAoc3RhdGUtPkVtdWxhdGUgIT0gU1RPUCkgeworICAgIHN0YXRlLT5FbXVsYXRlID0gUlVOIDsKKyAgICBpZiAoc3RhdGUtPnByb2czMlNpZyAmJiBBUk11bF9NT0RFMzJCSVQpCisgICAgICAgcGMgPSBBUk11bF9FbXVsYXRlMzIoc3RhdGUpIDsKKyAgICBlbHNlCisgICAgICAgcGMgPSBBUk11bF9FbXVsYXRlMjYoc3RhdGUpIDsKKyAgICB9CisgcmV0dXJuKHBjKSA7CisgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiBFbXVsYXRlIHRoZSBleGVjdXRpb24gb2Ygb25lIGluc3RydWN0aW9uLiAgU3RhcnQgdGhlIGNvcnJlY3QgZW11bGF0b3IgICAgICoKKyogKEVtdWxhdGUyNiBmb3IgYSAyNiBiaXQgQVJNIGFuZCBFbXVsYXRlMzIgZm9yIGEgMzIgYml0IEFSTSksIHJldHVybiB0aGUgICAqCisqIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIHRoYXQgaXMgZXhlY3V0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQVJNd29yZCBBUk11bF9Eb0luc3RyKEFSTXVsX1N0YXRlICpzdGF0ZSkKK3tBUk13b3JkIHBjID0gMCA7CisKKyBzdGF0ZS0+RW11bGF0ZSA9IE9OQ0UgOworIGlmIChzdGF0ZS0+cHJvZzMyU2lnICYmIEFSTXVsX01PREUzMkJJVCkKKyAgICBwYyA9IEFSTXVsX0VtdWxhdGUzMihzdGF0ZSkgOworIGVsc2UKKyAgICBwYyA9IEFSTXVsX0VtdWxhdGUyNihzdGF0ZSkgOworCisgcmV0dXJuKHBjKSA7CisgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiBUaGlzIHJvdXRpbmUgY2F1c2VzIGFuIEFib3J0IHRvIG9jY3VyLCBpbmNsdWRpbmcgc2VsZWN0aW5nIHRoZSBjb3JyZWN0ICAgICoKKyogbW9kZSwgcmVnaXN0ZXIgYmFuaywgYW5kIHRoZSBzYXZpbmcgb2YgcmVnaXN0ZXJzLiAgQ2FsbCB3aXRoIHRoZSAgICAgICAgICAqCisqIGFwcHJvcHJpYXRlIHZlY3RvcidzIG1lbW9yeSBhZGRyZXNzICgwLDQsOCAuLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBBUk11bF9BYm9ydChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgdmVjdG9yKQore0FSTXdvcmQgdGVtcCA7CisKKyBzdGF0ZS0+QWJvcnRlZCA9IEZBTFNFIDsKKworIGlmIChBUk11bF9PU0V4Y2VwdGlvbihzdGF0ZSx2ZWN0b3IsQVJNdWxfR2V0UEMoc3RhdGUpKSkKKyAgICByZXR1cm4gOworCisgaWYgKHN0YXRlLT5wcm9nMzJTaWcpCisgICAgaWYgKEFSTXVsX01PREUyNkJJVCkKKyAgICAgICB0ZW1wID0gUjE1UEMgOworICAgIGVsc2UKKyAgICAgICB0ZW1wID0gc3RhdGUtPlJlZ1sxNV0gOworIGVsc2UKKyAgICB0ZW1wID0gUjE1UEMgfCBFQ0MgfCBFUjE1SU5UIHwgRU1PREUgOworCisgc3dpdGNoICh2ZWN0b3IpIHsKKyAgICBjYXNlIEFSTXVsX1Jlc2V0ViA6IC8qIFJFU0VUICovCisgICAgICAgc3RhdGUtPlNwc3JbU1ZDQkFOS10gPSBDUFNSIDsKKyAgICAgICBTRVRBQk9SVChJTlRCSVRTLHN0YXRlLT5wcm9nMzJTaWc/U1ZDMzJNT0RFOlNWQzI2TU9ERSkgOworICAgICAgIEFSTXVsX0NQU1JBbHRlcmVkKHN0YXRlKSA7CisgICAgICAgc3RhdGUtPlJlZ1sxNF0gPSB0ZW1wIDsKKyAgICAgICBicmVhayA7CisgICAgY2FzZSBBUk11bF9VbmRlZmluZWRJbnN0clYgOiAvKiBVbmRlZmluZWQgSW5zdHJ1Y3Rpb24gKi8KKyAgICAgICBzdGF0ZS0+U3BzcltzdGF0ZS0+cHJvZzMyU2lnP1VOREVGQkFOSzpTVkNCQU5LXSA9IENQU1IgOworICAgICAgIFNFVEFCT1JUKElCSVQsc3RhdGUtPnByb2czMlNpZz9VTkRFRjMyTU9ERTpTVkMyNk1PREUpIDsKKyAgICAgICBBUk11bF9DUFNSQWx0ZXJlZChzdGF0ZSkgOworICAgICAgIHN0YXRlLT5SZWdbMTRdID0gdGVtcCAtIDQgOworICAgICAgIGJyZWFrIDsKKyAgICBjYXNlIEFSTXVsX1NXSVYgOiAvKiBTb2Z0d2FyZSBJbnRlcnJ1cHQgKi8KKyAgICAgICBzdGF0ZS0+U3BzcltTVkNCQU5LXSA9IENQU1IgOworICAgICAgIFNFVEFCT1JUKElCSVQsc3RhdGUtPnByb2czMlNpZz9TVkMzMk1PREU6U1ZDMjZNT0RFKSA7CisgICAgICAgQVJNdWxfQ1BTUkFsdGVyZWQoc3RhdGUpIDsKKyAgICAgICBzdGF0ZS0+UmVnWzE0XSA9IHRlbXAgLSA0IDsKKyAgICAgICBicmVhayA7CisgICAgY2FzZSBBUk11bF9QcmVmZXRjaEFib3J0ViA6IC8qIFByZWZldGNoIEFib3J0ICovCisgICAgICAgc3RhdGUtPkFib3J0QWRkciA9IDEgOworICAgICAgIHN0YXRlLT5TcHNyW3N0YXRlLT5wcm9nMzJTaWc/QUJPUlRCQU5LOlNWQ0JBTktdID0gQ1BTUiA7CisgICAgICAgU0VUQUJPUlQoSUJJVCxzdGF0ZS0+cHJvZzMyU2lnP0FCT1JUMzJNT0RFOlNWQzI2TU9ERSkgOworICAgICAgIEFSTXVsX0NQU1JBbHRlcmVkKHN0YXRlKSA7CisgICAgICAgc3RhdGUtPlJlZ1sxNF0gPSB0ZW1wIC0gNCA7CisgICAgICAgYnJlYWsgOworICAgIGNhc2UgQVJNdWxfRGF0YUFib3J0ViA6IC8qIERhdGEgQWJvcnQgKi8KKyAgICAgICBzdGF0ZS0+U3BzcltzdGF0ZS0+cHJvZzMyU2lnP0FCT1JUQkFOSzpTVkNCQU5LXSA9IENQU1IgOworICAgICAgIFNFVEFCT1JUKElCSVQsc3RhdGUtPnByb2czMlNpZz9BQk9SVDMyTU9ERTpTVkMyNk1PREUpIDsKKyAgICAgICBBUk11bF9DUFNSQWx0ZXJlZChzdGF0ZSkgOworICAgICAgIHN0YXRlLT5SZWdbMTRdID0gdGVtcCAtIDQgOyAvKiB0aGUgUEMgbXVzdCBoYXZlIGJlZW4gaW5jcmVtZW50ZWQgKi8KKyAgICAgICBicmVhayA7CisgICAgY2FzZSBBUk11bF9BZGRyRXhjZXB0blYgOiAvKiBBZGRyZXNzIEV4Y2VwdGlvbiAqLworICAgICAgIHN0YXRlLT5TcHNyW1NWQ0JBTktdID0gQ1BTUiA7CisgICAgICAgU0VUQUJPUlQoSUJJVCxTVkMyNk1PREUpIDsKKyAgICAgICBBUk11bF9DUFNSQWx0ZXJlZChzdGF0ZSkgOworICAgICAgIHN0YXRlLT5SZWdbMTRdID0gdGVtcCAtIDQgOworICAgICAgIGJyZWFrIDsKKyAgICBjYXNlIEFSTXVsX0lSUVYgOiAvKiBJUlEgKi8KKyAgICAgICBzdGF0ZS0+U3BzcltJUlFCQU5LXSA9IENQU1IgOworICAgICAgIFNFVEFCT1JUKElCSVQsc3RhdGUtPnByb2czMlNpZz9JUlEzMk1PREU6SVJRMjZNT0RFKSA7CisgICAgICAgQVJNdWxfQ1BTUkFsdGVyZWQoc3RhdGUpIDsKKyAgICAgICBzdGF0ZS0+UmVnWzE0XSA9IHRlbXAgLSA0IDsKKyAgICAgICBicmVhayA7CisgICAgY2FzZSBBUk11bF9GSVFWIDogLyogRklRICovCisgICAgICAgc3RhdGUtPlNwc3JbRklRQkFOS10gPSBDUFNSIDsKKyAgICAgICBTRVRBQk9SVChJTlRCSVRTLHN0YXRlLT5wcm9nMzJTaWc/RklRMzJNT0RFOkZJUTI2TU9ERSkgOworICAgICAgIEFSTXVsX0NQU1JBbHRlcmVkKHN0YXRlKSA7CisgICAgICAgc3RhdGUtPlJlZ1sxNF0gPSB0ZW1wIC0gNCA7CisgICAgICAgYnJlYWsgOworICAgIH0KKyBpZiAoQVJNdWxfTU9ERTMyQklUKQorICAgIEFSTXVsX1NldFIxNShzdGF0ZSx2ZWN0b3IpIDsKKyBlbHNlCisgICAgQVJNdWxfU2V0UjE1KHN0YXRlLFIxNUNDSU5UTU9ERSB8IHZlY3RvcikgOworfQpkaWZmIC0tZ2l0IGEvc2ltL2FybS9hcm1vcHRzLmggYi9zaW0vYXJtL2FybW9wdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2I1Y2I3Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2FybS9hcm1vcHRzLmgKQEAgLTAsMCArMSwyMyBAQAorLyogIGFybW9wdHMuaCAtLSBBUk11bGF0b3IgY29uZmlndXJhdGlvbiBvcHRpb25zOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLworCisvKiBEZWZpbmUgb25lIG9mIEFSTTYwIG9yIEFSTTYxICovCisjaWZuZGVmIEFSTTYwCisjaWZuZGVmIEFSTTYxCisjZGVmaW5lIEFSTTYwCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2FybS9hcm1vcy5jIGIvc2ltL2FybS9hcm1vcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDZkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vYXJtL2FybW9zLmMKQEAgLTAsMCArMSwxMTM2IEBACisvKiAgYXJtb3MuYyAtLSBBUk11bGF0b3IgT1MgaW50ZXJmYWNlOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgYSBtb2RlbCBvZiBEZW1vbiwgQVJNIEx0ZCdzIERlYnVnIE1vbml0b3IsCitpbmNsdWRpbmcgYWxsIHRoZSBTV0kncyByZXF1aXJlZCB0byBzdXBwb3J0IHRoZSBDIGxpYnJhcnkuIFRoZSBjb2RlIGluCitpdCBpcyBub3QgcmVhbGx5IGZvciB0aGUgZmFpbnQtaGVhcnRlZCAoZXNwZWNpYWxseSB0aGUgYWJvcnQgaGFuZGxpbmcKK2NvZGUpLCBidXQgaXQgaXMgYSBjb21wbGV0ZSBleGFtcGxlLiBEZWZpbmluZyBOT09TIHdpbGwgZGlzYWJsZSBhbGwgdGhlCitmdW4sIGFuZCBkZWZpbmlnbiBWQUlMREFURSB3aWxsIGRlZmluZSBTV0kgMSB0byBlbnRlciBTVkMgbW9kZSwgYW5kIFNXSQorMHgxMSB0byBoYWx0IHRoZSBlbXVsYXRvci4gKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2lmbmRlZiBPX1JET05MWQorI2RlZmluZSBPX1JET05MWSAwCisjZW5kaWYKKyNpZm5kZWYgT19XUk9OTFkKKyNkZWZpbmUgT19XUk9OTFkgMQorI2VuZGlmCisjaWZuZGVmIE9fUkRXUgorI2RlZmluZSBPX1JEV1IgICAyCisjZW5kaWYKKyNpZm5kZWYgT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkgMAorI2VuZGlmCisKKyNpZmRlZiBfX1NURENfXworI2RlZmluZSB1bmxpbmsocykgcmVtb3ZlKHMpCisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4JLyogRm9yIFNFRUtfU0VUIGV0YyAqLworI2VuZGlmCisKKyNpZmRlZiBfX3Jpc2NvcworZXh0ZXJuIGludCBfZmlzYXR0eShGSUxFICopOworI2RlZmluZSBpc2F0dHlfKGYpIF9maXNhdHR5KGYpCisjZWxzZQorI2lmZGVmIF9fWlRDX18KKyNpbmNsdWRlIDxpby5oPgorI2RlZmluZSBpc2F0dHlfKGYpIGlzYXR0eSgoZiktPl9maWxlKQorI2Vsc2UKKyNpZmRlZiBtYWNpbnRvc2gKKyNpbmNsdWRlIDxpb2N0bC5oPgorI2RlZmluZSBpc2F0dHlfKGYpICh+aW9jdGwgKChmKS0+X2ZpbGUsIEZJT0lOVEVSQUNUSVZFLCBOVUxMKSkKKyNlbHNlCisjZGVmaW5lIGlzYXR0eV8oZikgaXNhdHR5IChmaWxlbm8gKGYpKQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAiYXJtZGVmcy5oIgorI2luY2x1ZGUgImFybW9zLmgiCisjaWZuZGVmIE5PT1MKKyNpZm5kZWYgVkFMSURBVEUKKy8qICNpZm5kZWYgQVNJTSAqLworI2luY2x1ZGUgImFybWZwZS5oIgorLyogI2VuZGlmICovCisjZW5kaWYKKyNlbmRpZgorCisvKiBGb3IgUkRJRXJyb3JfQnJlYWtwb2ludFJlYWNoZWQuICAqLworI2luY2x1ZGUgImRiZ19yZGkuaCIKKworZXh0ZXJuIHVuc2lnbmVkIEFSTXVsX09TSW5pdChBUk11bF9TdGF0ZSAqc3RhdGUpIDsKK2V4dGVybiB2b2lkIEFSTXVsX09TRXhpdChBUk11bF9TdGF0ZSAqc3RhdGUpIDsKK2V4dGVybiB1bnNpZ25lZCBBUk11bF9PU0hhbmRsZVNXSShBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBudW1iZXIpIDsKK2V4dGVybiB1bnNpZ25lZCBBUk11bF9PU0V4Y2VwdGlvbihBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgdmVjdG9yLCBBUk13b3JkIHBjKSA7CitleHRlcm4gQVJNd29yZCBBUk11bF9PU0xhc3RFcnJvclAoQVJNdWxfU3RhdGUgKnN0YXRlKSA7CitleHRlcm4gQVJNd29yZCBBUk11bF9EZWJ1ZyhBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgcGMsIEFSTXdvcmQgaW5zdHIpIDsKKworI2RlZmluZSBCVUZGRVJTSVpFIDQwOTYKKyNpZm5kZWYgRk9QRU5fTUFYCisjZGVmaW5lIEZPUEVOX01BWCA2NAorI2VuZGlmCisjZGVmaW5lIFVOSVFVRVRFTVBTIDI1NgorCisjaWZuZGVmIE5PT1MKK3N0YXRpYyB2b2lkIFVud2luZERhdGFBYm9ydChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgYWRkcik7CitzdGF0aWMgdm9pZCBnZXRzdHJpbmcoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIGZyb20sIGNoYXIgKnRvKSA7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgIE9TIHByaXZhdGUgSW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgT1NibG9jayB7CisgICBBUk13b3JkIFRpbWUwIDsKKyAgIEFSTXdvcmQgRXJyb3JQIDsKKyAgIEFSTXdvcmQgRXJyb3JObyA7CisgICBGSUxFICpGaWxlVGFibGVbRk9QRU5fTUFYXSA7CisgICBjaGFyIEZpbGVGbGFnc1tGT1BFTl9NQVhdIDsKKyAgIGNoYXIgKnRlbXBuYW1lc1tVTklRVUVURU1QU10gOworICAgfSA7CisKKyNkZWZpbmUgTk9PUCAwCisjZGVmaW5lIEJJTkFSWSAxCisjZGVmaW5lIFJFQURPUCAyCisjZGVmaW5lIFdSSVRFT1AgNAorCisjaWZkZWYgbWFjaW50b3NoCisjZGVmaW5lIEZJWENSTEYodCxjKSAoKHQgJiBCSU5BUlkpID8gXAorICAgICAgICAgICAgICAgICAgICAgIGMgOiBcCisgICAgICAgICAgICAgICAgICAgICAgKChjID09ICdcbicgfHwgYyA9PSAnXHInICkgPyAoYyBeIDcpIDogYykgXAorICAgICAgICAgICAgICAgICAgICAgKQorI2Vsc2UgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIEZJWENSTEYodCxjKSBjIAorI2VuZGlmCisKK3N0YXRpYyBBUk13b3JkIHNvZnR2ZWN0b3Jjb2RlW10gPQoreyAgIC8qIGJhc2ljOiBzd2kgdGlkeWV4Y2VwdGlvbiArIGV2ZW50OyBtb3YgcGMsIGxyOworICAgICAgICAgICAgICBsZG1pYSByMTEse3IxMSxwY307IHN3aSBnZW5lcmF0ZWV4Y2VwdGlvbiArIGV2ZW50CisgICAgICovCisgIDB4ZWYwMDAwOTAsIDB4ZTFhMGUwMGYsIDB4ZTg5Yjg4MDAsIDB4ZWYwMDAwODAsIC8qUmVzZXQqLworICAweGVmMDAwMDkxLCAweGUxYTBlMDBmLCAweGU4OWI4ODAwLCAweGVmMDAwMDgxLCAvKlVuZGVmKi8KKyAgMHhlZjAwMDA5MiwgMHhlMWEwZTAwZiwgMHhlODliODgwMCwgMHhlZjAwMDA4MiwgLypTV0kgICovCisgIDB4ZWYwMDAwOTMsIDB4ZTFhMGUwMGYsIDB4ZTg5Yjg4MDAsIDB4ZWYwMDAwODMsIC8qUHJlZmV0Y2ggYWJvcnQqLworICAweGVmMDAwMDk0LCAweGUxYTBlMDBmLCAweGU4OWI4ODAwLCAweGVmMDAwMDg0LCAvKkRhdGEgYWJvcnQqLworICAweGVmMDAwMDk1LCAweGUxYTBlMDBmLCAweGU4OWI4ODAwLCAweGVmMDAwMDg1LCAvKkFkZHJlc3MgZXhjZXB0aW9uKi8KKyAgMHhlZjAwMDA5NiwgMHhlMWEwZTAwZiwgMHhlODliODgwMCwgMHhlZjAwMDA4NiwgLypJUlEqLworICAweGVmMDAwMDk3LCAweGUxYTBlMDBmLCAweGU4OWI4ODAwLCAweGVmMDAwMDg3LCAvKkZJUSovCisgIDB4ZWYwMDAwOTgsIDB4ZTFhMGUwMGYsIDB4ZTg5Yjg4MDAsIDB4ZWYwMDAwODgsIC8qRXJyb3IqLworICAweGUxYTBmMDBlIC8qIGRlZmF1bHQgaGFuZGxlciAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICBUaW1lIGZvciB0aGUgT3BlcmF0aW5nIFN5c3RlbSB0byBpbml0aWFsaXNlIGl0c2VsZi4gICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bnNpZ25lZCAKK0FSTXVsX09TSW5pdCAoQVJNdWxfU3RhdGUgKnN0YXRlKQoreworI2lmbmRlZiBOT09TCisjaWZuZGVmIFZBTElEQVRFCisgQVJNd29yZCBpbnN0ciwgaSAsIGogOworIHN0cnVjdCBPU2Jsb2NrKiBPU3B0ciA9IChzdHJ1Y3QgT1NibG9jayopc3RhdGUtPk9TcHRyOworCisgaWYgKHN0YXRlLT5PU3B0ciA9PSBOVUxMKSB7CisgICAgc3RhdGUtPk9TcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBPU2Jsb2NrKSk7CisgICAgaWYgKHN0YXRlLT5PU3B0ciA9PSBOVUxMKSB7CisgICAgICAgcGVycm9yKCJPUyBNZW1vcnkiKTsKKyAgICAgICBleGl0KDE1KTsKKyAgICAgICB9CisgICAgfQorIE9TcHRyID0gKHN0cnVjdCBPU2Jsb2NrKilzdGF0ZS0+T1NwdHI7CisgT1NwdHItPkVycm9yUCA9IDA7Cisgc3RhdGUtPlJlZ1sxM10gPSBBRERSU1VQRVJTVEFDSzsgIC8qIHNldCB1cCBhIHN0YWNrIGZvciB0aGUgY3VycmVudCBtb2RlICovCisgQVJNdWxfU2V0UmVnKHN0YXRlLFNWQzMyTU9ERSwxMyxBRERSU1VQRVJTVEFDSyk7IC8qIGFuZCBmb3Igc3VwZXJ2aXNvciBtb2RlICovCisgQVJNdWxfU2V0UmVnKHN0YXRlLEFCT1JUMzJNT0RFLDEzLEFERFJTVVBFUlNUQUNLKTsgLyogYW5kIGZvciBhYm9ydCAzMiBtb2RlICovCisgQVJNdWxfU2V0UmVnKHN0YXRlLFVOREVGMzJNT0RFLDEzLEFERFJTVVBFUlNUQUNLKTsgLyogYW5kIGZvciB1bmRlZiAzMiBtb2RlICovCisgaW5zdHIgPSAweGU1OWZmMDAwIHwgKEFERFJTT0ZUVkVDVE9SUyAtIDgpOyAvKiBsb2FkIHBjIGZyb20gc29mdCB2ZWN0b3IgKi8KKyBmb3IgKGkgPSBBUk11bF9SZXNldFYgOyBpIDw9IEFSTUZJUVYgOyBpICs9IDQpCisgICAgQVJNdWxfV3JpdGVXb3JkKHN0YXRlLCBpLCBpbnN0cik7ICAgIC8qIHdyaXRlIGhhcmR3YXJlIHZlY3RvcnMgKi8KKyBmb3IgKGkgPSBBUk11bF9SZXNldFYgOyBpIDw9IEFSTUZJUVYgKyA0IDsgaSArPSA0KSB7CisgICAgQVJNdWxfV3JpdGVXb3JkKHN0YXRlLCBBRERSU09GVFZFQ1RPUlMgKyBpLCBTT0ZUVkVDVE9SQ09ERSArIGkgKiA0KTsKKyAgICBBUk11bF9Xcml0ZVdvcmQoc3RhdGUsIEFERFJTT0ZIQU5ETEVSUyArIDIqaSArIDRMLCBTT0ZUVkVDVE9SQ09ERSArIHNpemVvZihzb2Z0dmVjdG9yY29kZSkgLSA0TCk7CisgICAgfQorIGZvciAoaSA9IDAgOyBpIDwgc2l6ZW9mKHNvZnR2ZWN0b3Jjb2RlKSA7IGkgKz0gNCkKKyAgICBBUk11bF9Xcml0ZVdvcmQoc3RhdGUsIFNPRlRWRUNUT1JDT0RFICsgaSwgc29mdHZlY3RvcmNvZGVbaS80XSk7CisgZm9yIChpID0gMCA7IGkgPCBGT1BFTl9NQVggOyBpKyspCisgICAgT1NwdHItPkZpbGVUYWJsZVtpXSA9IE5VTEwgOworIGZvciAoaSA9IDAgOyBpIDwgVU5JUVVFVEVNUFMgOyBpKyspCisgICAgT1NwdHItPnRlbXBuYW1lc1tpXSA9IE5VTEwgOworIEFSTXVsX0NvbnNvbGVQcmludCAoc3RhdGUsICIsIERlbW9uIDEuMDEiKTsKKworLyogI2lmbmRlZiBBU0lNICovCisKKyAvKiBpbnN0YWxsIGZwZSAqLworIGZvciAoaSA9IDAgOyBpIDwgZnBlc2l6ZSA7IGkrPTQpIC8qIGNvcHkgdGhlIGNvZGUgKi8KKyAgICBBUk11bF9Xcml0ZVdvcmQoc3RhdGUsRlBFU1RBUlQgKyBpLGZwZWNvZGVbaSA+PiAyXSkgOworIGZvciAoaSA9IEZQRVNUQVJUICsgZnBlc2l6ZSA7IDsgaS09NCkgeyAvKiByZXZlcnNlIHRoZSBlcnJvciBzdHJpbmdzICovCisgICAgaWYgKChqID0gQVJNdWxfUmVhZFdvcmQoc3RhdGUsaSkpID09IDB4ZmZmZmZmZmYpCisgICAgICAgYnJlYWsgOworICAgIGlmIChzdGF0ZS0+YmlnZW5kU2lnICYmIGogPCAweDgwMDAwMDAwKSB7IC8qIGl0J3MgcGFydCBvZiB0aGUgc3RyaW5nIHNvIHN3YXAgaXQgKi8KKyAgICAgICBqID0gKChqID4+IDB4MTgpICYgMHgwMDAwMDBmZikgfAorICAgICAgICAgICAoKGogPj4gMHgwOCkgJiAweDAwMDBmZjAwKSB8CisgICAgICAgICAgICgoaiA8PCAweDA4KSAmIDB4MDBmZjAwMDApIHwKKyAgICAgICAgICAgKChqIDw8IDB4MTgpICYgMHhmZjAwMDAwMCkgOworICAgICAgIEFSTXVsX1dyaXRlV29yZChzdGF0ZSxpLGopIDsKKyAgICAgICB9CisgICAgfQorIEFSTXVsX1dyaXRlV29yZChzdGF0ZSxGUEVPTERWRUNULEFSTXVsX1JlYWRXb3JkKHN0YXRlLDQpKSA7IC8qIGNvcHkgb2xkIGlsbGVnYWwgaW5zdHIgdmVjdG9yICovCisgQVJNdWxfV3JpdGVXb3JkKHN0YXRlLDQsRlBFTkVXVkVDVChBUk11bF9SZWFkV29yZChzdGF0ZSxpLTQpKSkgOyAvKiBpbnN0YWxsIG5ldyB2ZWN0b3IgKi8KKyBBUk11bF9Db25zb2xlUHJpbnQgKHN0YXRlLCAiLCBGUEUiKSA7CisKKy8qICNlbmRpZiAvKiBBU0lNICovCisjZW5kaWYgLyogVkFMSURBVEUgKi8KKyNlbmRpZiAvKiBOT09TICovCisKKyByZXR1cm4oVFJVRSkgOworfQorCit2b2lkIAorQVJNdWxfT1NFeGl0IChBUk11bF9TdGF0ZSAqc3RhdGUpCit7CisgZnJlZSgoY2hhciAqKXN0YXRlLT5PU3B0cik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICBSZXR1cm4gdGhlIGxhc3QgT3BlcmF0aW5nIFN5c3RlbSBFcnJvci4gICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitBUk13b3JkIAorQVJNdWxfT1NMYXN0RXJyb3JQIChBUk11bF9TdGF0ZSAqc3RhdGUpCit7CisgIHJldHVybiAoKHN0cnVjdCBPU2Jsb2NrICopc3RhdGUtPk9TcHRyKS0+RXJyb3JQOworfQorCisjaWYgMSAgLyogQ1lHTlVTIExPQ0FMICovCisvKiBUaGlzIGlzIHRoZSBjeWdudXMgd2F5IG9mIGRvaW5nIGl0LCB3aGljaCBtYWtlcyBpdCBzaW1wbGUgdG8gZG8gb3VyIHRlc3RzICovCisKK3N0YXRpYyBpbnQgdHJhbnNsYXRlX29wZW5fbW9kZVtdID0KK3sKKyAgT19SRE9OTFksICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiciIgICAqLworICBPX1JET05MWStPX0JJTkFSWSwgICAgICAgICAgICAgICAgIC8qICJyYiIgICovCisgIE9fUkRXUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogInIrIiAgKi8KKyAgT19SRFdSICArT19CSU5BUlksICAgICAgICAgICAgICAgICAvKiAicitiIiAqLworICBPX1dST05MWSAgICAgICAgICtPX0NSRUFUK09fVFJVTkMsIC8qICJ3IiAgICovCisgIE9fV1JPTkxZK09fQklOQVJZK09fQ1JFQVQrT19UUlVOQywgLyogIndiIiAgKi8KKyAgT19SRFdSICAgICAgICAgICArT19DUkVBVCtPX1RSVU5DLCAvKiAidysiICAqLworICBPX1JEV1IgICtPX0JJTkFSWStPX0NSRUFUK09fVFJVTkMsIC8qICJ3K2IiICovCisgIE9fV1JPTkxZICAgICAgICAgK09fQVBQRU5EK09fQ1JFQVQsLyogImEiICAgKi8KKyAgT19XUk9OTFkrT19CSU5BUlkrT19BUFBFTkQrT19DUkVBVCwvKiAiYWIiICAqLworICBPX1JEV1IgICAgICAgICAgICtPX0FQUEVORCtPX0NSRUFULC8qICJhKyIgICovCisgIE9fUkRXUiAgK09fQklOQVJZK09fQVBQRU5EK09fQ1JFQVQgLyogImErYiIgKi8KK307CisKK3N0YXRpYyB2b2lkIAorU1dJV3JpdGUwIChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgYWRkcikKK3sKKyAgQVJNd29yZCB0ZW1wOworICBzdHJ1Y3QgT1NibG9jayogT1NwdHIgPSAoc3RydWN0IE9TYmxvY2sqKSBzdGF0ZS0+T1NwdHI7CisKKyAgd2hpbGUgKCh0ZW1wID0gQVJNdWxfUmVhZEJ5dGUgKHN0YXRlLCBhZGRyKyspKSAhPSAwKQorICAgICh2b2lkKSBmcHV0YyAoKGNoYXIpIHRlbXAsIHN0ZGVycik7CisKKyAgT1NwdHItPkVycm9yTm8gPSBlcnJubzsKK30KKworc3RhdGljIHZvaWQgCitXcml0ZUNvbW1hbmRMaW5lVG8gKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBhZGRyKQoreworICBBUk13b3JkIHRlbXA7CisgIGNoYXIgKmNwdHIgPSBzdGF0ZS0+Q29tbWFuZExpbmU7CisgIGlmIChjcHRyID09IE5VTEwpCisgICAgY3B0ciA9ICJcMCI7CisgIGRvIHsKKyAgICB0ZW1wID0gKEFSTXdvcmQpICpjcHRyKys7CisgICAgQVJNdWxfV3JpdGVCeXRlIChzdGF0ZSwgYWRkcisrLCB0ZW1wKTsKKyAgfSB3aGlsZSAodGVtcCAhPSAwKTsKK30KKworc3RhdGljIHZvaWQgCitTV0lvcGVuIChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgbmFtZSwgQVJNd29yZCBTV0lmbGFncykKK3sKKyAgc3RydWN0IE9TYmxvY2sqIE9TcHRyID0gKHN0cnVjdCBPU2Jsb2NrKilzdGF0ZS0+T1NwdHI7CisgIGNoYXIgZHVtbXlbMjAwMF07CisgIGludCBmbGFnczsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgCisgICAgICAgZHVtbXlbaV0gPSBBUk11bF9SZWFkQnl0ZSAoc3RhdGUsIG5hbWUgKyBpKTsKKyAgICAgICBpKyspCisgICAgOworCisgIC8qIE5vdyB3ZSBuZWVkIHRvIGRlY29kZSB0aGUgRGVtb24gb3BlbiBtb2RlICovCisgIGZsYWdzID0gdHJhbnNsYXRlX29wZW5fbW9kZVtTV0lmbGFnc107CisKKyAgLyogRmlsZW5hbWUgIjp0dCIgaXMgc3BlY2lhbDogaXQgZGVub3RlcyBzdGRpbi9vdXQgKi8KKyAgaWYgKHN0cmNtcCAoZHVtbXksICI6dHQiKSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChmbGFncyA9PSBPX1JET05MWSkgLyogb3BlbmluZyB0dHkgInIiICovCisJc3RhdGUtPlJlZ1swXSA9IDA7ICAvKiBzdGRpbiAqLworICAgICAgZWxzZSAKKwlzdGF0ZS0+UmVnWzBdID0gMTsgLyogc3Rkb3V0ICovCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc3RhdGUtPlJlZ1swXSA9IChpbnQpIG9wZW4gKGR1bW15LCBmbGFncyk7CisgICAgICBPU3B0ci0+RXJyb3JObyA9IGVycm5vOworICAgIH0KK30KKworc3RhdGljIHZvaWQgCitTV0lyZWFkIChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgZiwgQVJNd29yZCBwdHIsIEFSTXdvcmQgbGVuKQoreworICBzdHJ1Y3QgT1NibG9jayogT1NwdHIgPSAoc3RydWN0IE9TYmxvY2sqKSBzdGF0ZS0+T1NwdHI7CisgIGludCByZXM7CisgIGludCBpOworICBjaGFyICpsb2NhbCA9IG1hbGxvYyAobGVuKTsKKworICByZXMgPSByZWFkIChmLCBsb2NhbCwgbGVuKTsKKyAgaWYgKHJlcyA+IDApCisgICAgZm9yIChpID0gMDsgaSA8IHJlczsgaSsrKSAKKyAgICAgIEFSTXVsX1dyaXRlQnl0ZSAoc3RhdGUsIHB0ciArIGksIGxvY2FsW2ldKTsKKyAgZnJlZSAobG9jYWwpOworICBzdGF0ZS0+UmVnWzBdID0gcmVzID09IC0xID8gLTEgOiBsZW4gLSByZXM7CisgIE9TcHRyLT5FcnJvck5vID0gZXJybm87Cit9CisKK3N0YXRpYyB2b2lkIAorU1dJd3JpdGUgKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBmLCBBUk13b3JkIHB0ciwgQVJNd29yZCBsZW4pCit7CisgIHN0cnVjdCBPU2Jsb2NrKiBPU3B0ciA9IChzdHJ1Y3QgT1NibG9jayopIHN0YXRlLT5PU3B0cjsKKyAgaW50IHJlczsKKyAgaW50IGk7CisgIGNoYXIgKmxvY2FsID0gbWFsbG9jIChsZW4pOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgCisgICAgeworICAgICAgbG9jYWxbaV0gPSBBUk11bF9SZWFkQnl0ZSAoc3RhdGUsIHB0ciArIGkpOworICAgIH0KKyAgcmVzID0gd3JpdGUgKGYsIGxvY2FsLCBsZW4pOworICBzdGF0ZS0+UmVnWzBdID0gcmVzID09IC0xID8gLTEgOiBsZW4gLSByZXM7CisgIGZyZWUgKGxvY2FsKTsKKyAgT1NwdHItPkVycm9yTm8gPSBlcnJubzsKK30KKworc3RhdGljIHZvaWQgCitTV0lmbGVuIChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgZmgpCit7CisgIHN0cnVjdCBPU2Jsb2NrKiBPU3B0ciA9IChzdHJ1Y3QgT1NibG9jayopIHN0YXRlLT5PU3B0cjsKKyAgQVJNd29yZCBhZGRyOworCisgIGlmIChmaCA9PSAwIHx8IGZoID4gRk9QRU5fTUFYKQorICAgIHsKKyAgICAgIE9TcHRyLT5FcnJvck5vID0gRUJBREY7CisgICAgICBzdGF0ZS0+UmVnWzBdID0gLTFMOworICAgICAgcmV0dXJuOworICAgIH0KKworICBhZGRyID0gbHNlZWsgKGZoLCAwLCBTRUVLX0NVUik7CisgIGlmIChhZGRyIDwgMCkKKyAgICBzdGF0ZS0+UmVnWzBdID0gLTFMOworICBlbHNlCisgICAgeworICAgICAgc3RhdGUtPlJlZ1swXSA9IGxzZWVrIChmaCwgMEwsIFNFRUtfRU5EKTsKKyAgICAgICh2b2lkKSBsc2VlayAoZmgsIGFkZHIsIFNFRUtfU0VUKTsKKyAgICB9CisKKyAgT1NwdHItPkVycm9yTm8gPSBlcnJubzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhlIGVtdWxhdG9yIGNhbGxzIHRoaXMgcm91dGluZSB3aGVuIGEgU1dJIGluc3RydWN0aW9uIGlzIGVuY3VudGVyZWQuIFRoZSAqCisqIHBhcmFtZXRlciBwYXNzZWQgaXMgdGhlIFNXSSBudW1iZXIgKGxvd2VyIDI0IGJpdHMgb2YgdGhlIGluc3RydWN0aW9uKS4gICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5zaWduZWQgCitBUk11bF9PU0hhbmRsZVNXSSAoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIG51bWJlcikKK3sKKyAgQVJNd29yZCBhZGRyLCB0ZW1wLCBmaWxkZXM7CisgIGNoYXIgYnVmZmVyW0JVRkZFUlNJWkVdLCAqY3B0cjsKKyAgRklMRSAqZnB0cjsKKyAgc3RydWN0IE9TYmxvY2sqIE9TcHRyID0gKHN0cnVjdCBPU2Jsb2NrKilzdGF0ZS0+T1NwdHI7CisKKyAgc3dpdGNoIChudW1iZXIpCisgICAgeworICAgIGNhc2UgU1dJX1JlYWQ6CisJU1dJcmVhZCAoc3RhdGUsIHN0YXRlLT5SZWdbMF0sIHN0YXRlLT5SZWdbMV0sIHN0YXRlLT5SZWdbMl0pOworCXJldHVybiBUUlVFOyAKKworICAgIGNhc2UgU1dJX1dyaXRlOgorCVNXSXdyaXRlIChzdGF0ZSwgc3RhdGUtPlJlZ1swXSwgc3RhdGUtPlJlZ1sxXSwgc3RhdGUtPlJlZ1syXSk7CisJcmV0dXJuIFRSVUU7ICAgICAKKworICAgIGNhc2UgU1dJX09wZW46CisJU1dJb3BlbiAoc3RhdGUsIHN0YXRlLT5SZWdbMF0sc3RhdGUtPlJlZ1sxXSk7CisJcmV0dXJuIFRSVUU7CisKKyAgICBjYXNlIFNXSV9DbG9jayA6CisgICAgICAgLyogcmV0dXJuIG51bWJlciBvZiBjZW50aS1zZWNvbmRzLi4uICovCisgICAgICAgc3RhdGUtPlJlZ1swXSA9CisjaWZkZWYgQ0xPQ0tTX1BFUl9TRUMKKyAgICAgICAgICAoQ0xPQ0tTX1BFUl9TRUMgPj0gMTAwKQorICAgICAgICAgICAgID8gKEFSTXdvcmQpIChjbG9jaygpIC8gKENMT0NLU19QRVJfU0VDIC8gMTAwKSkKKyAgICAgICAgICAgICA6IChBUk13b3JkKSAoKGNsb2NrKCkgKiAxMDApIC8gQ0xPQ0tTX1BFUl9TRUMpIDsKKyNlbHNlCisgICAgIC8qIHByZXN1bWUgdW5peC4uLiBjbG9jaygpIHJldHVybnMgbWljcm9zZWNvbmRzICovCisgICAgICAgICAgKEFSTXdvcmQpIChjbG9jaygpIC8gMTAwMDApIDsKKyNlbmRpZgorICAgICAgIE9TcHRyLT5FcnJvck5vID0gZXJybm8gOworICAgICAgIHJldHVybihUUlVFKSA7CisKKyAgICBjYXNlIFNXSV9UaW1lIDoKKyAgICAgICBzdGF0ZS0+UmVnWzBdID0gKEFSTXdvcmQpdGltZShOVUxMKSA7CisgICAgICAgT1NwdHItPkVycm9yTm8gPSBlcnJubyA7CisgICAgICAgcmV0dXJuKFRSVUUpIDsKKyAgIAorICAgIGNhc2UgU1dJX0Nsb3NlOgorICAgICAgc3RhdGUtPlJlZ1swXSA9IGNsb3NlIChzdGF0ZS0+UmVnWzBdKTsKKyAgICAgIE9TcHRyLT5FcnJvck5vID0gZXJybm87CisgICAgICByZXR1cm4gVFJVRTsKKworICAgIGNhc2UgU1dJX0ZsZW4gOgorICAgICAgU1dJZmxlbiAoc3RhdGUsIHN0YXRlLT5SZWdbMF0pOworICAgICAgcmV0dXJuKFRSVUUpIDsKKworICAgIGNhc2UgU1dJX0V4aXQ6CisgICAgICBzdGF0ZS0+RW11bGF0ZSA9IEZBTFNFIDsKKyAgICAgIHJldHVybiBUUlVFOworCisgICAgY2FzZSBTV0lfU2VlazoKKyAgICAgIHsKKwkvKiBXZSBtdXN0IHJldHVybiBub24temVybyBmb3IgZmFpbHVyZSAqLworCXN0YXRlLT5SZWdbMF0gPSAtMSA+PSBsc2VlayAoc3RhdGUtPlJlZ1swXSwKKwkJCQkgICAgc3RhdGUtPlJlZ1sxXSwKKwkJCQkgICAgU0VFS19TRVQpOworCU9TcHRyLT5FcnJvck5vID0gZXJybm87CisJcmV0dXJuIFRSVUU7CisgICAgICB9CisKKyAgICBjYXNlIFNXSV9Xcml0ZUMgOgorICAgICAgKHZvaWQpZnB1dGMoKGludClzdGF0ZS0+UmVnWzBdLHN0ZGVycikgOworICAgICAgT1NwdHItPkVycm9yTm8gPSBlcnJubyA7CisgICAgICByZXR1cm4oVFJVRSkgOworCisgICAgY2FzZSBTV0lfV3JpdGUwIDoKKyAgICAgIFNXSVdyaXRlMCAoc3RhdGUsIHN0YXRlLT5SZWdbMF0pOworICAgICAgcmV0dXJuKFRSVUUpIDsKKworICAgIGNhc2UgU1dJX0dldEVycm5vIDoKKyAgICAgIHN0YXRlLT5SZWdbMF0gPSBPU3B0ci0+RXJyb3JObyA7CisgICAgICByZXR1cm4oVFJVRSkgOworCisgICAgY2FzZSBTV0lfQnJlYWtwb2ludCA6CisgICAgICBzdGF0ZS0+RW5kQ29uZGl0aW9uID0gUkRJRXJyb3JfQnJlYWtwb2ludFJlYWNoZWQgOworICAgICAgc3RhdGUtPkVtdWxhdGUgPSBGQUxTRSA7CisgICAgICByZXR1cm4oVFJVRSkgOworCisgICAgY2FzZSBTV0lfR2V0RW52IDoKKyAgICAgICBzdGF0ZS0+UmVnWzBdID0gQUREUkNNRExJTkUgOworICAgICAgIGlmIChzdGF0ZS0+TWVtU2l6ZSkKKyAgICAgICAgICBzdGF0ZS0+UmVnWzFdID0gc3RhdGUtPk1lbVNpemUgOworICAgICAgIGVsc2UKKyAgICAgICAgICBzdGF0ZS0+UmVnWzFdID0gQUREUlVTRVJTVEFDSyA7CisKKyAgICAgICBXcml0ZUNvbW1hbmRMaW5lVG8gKHN0YXRlLCBzdGF0ZS0+UmVnWzBdKTsKKyAgICAgICByZXR1cm4oVFJVRSkgOworCisgICAgICAgLyogSGFuZGxlIEFuZ2VsIFNXSXMgYXMgd2VsbCBhcyBEZW1vbiBvbmVzICovCisgICAgY2FzZSBBbmdlbFNXSV9BUk06CisgICAgY2FzZSBBbmdlbFNXSV9UaHVtYjoKKyAgICAgIC8qIFIxIGlzIGFsbW9zdCBhbHdheXMgYSBwYXJhbWV0ZXIgYmxvY2sgKi8KKyAgICAgIGFkZHIgPSBzdGF0ZS0+UmVnWzFdOworICAgICAgLyogUjAgaXMgYSByZWFzb24gY29kZSAqLworICAgICAgc3dpdGNoIChzdGF0ZS0+UmVnWzBdKQorCXsKKwkgIC8qIFVuaW1wbGVtZW50ZWQgcmVhc29uIGNvZGVzICovCisJY2FzZSBBbmdlbFNXSV9SZWFzb25fUmVhZEM6CisJY2FzZSBBbmdlbFNXSV9SZWFzb25fSXNUVFk6CisJY2FzZSBBbmdlbFNXSV9SZWFzb25fVG1wTmFtOgorCWNhc2UgQW5nZWxTV0lfUmVhc29uX1JlbW92ZToKKwljYXNlIEFuZ2VsU1dJX1JlYXNvbl9SZW5hbWU6CisJY2FzZSBBbmdlbFNXSV9SZWFzb25fU3lzdGVtOgorCWNhc2UgQW5nZWxTV0lfUmVhc29uX0VudGVyU1ZDOgorCWRlZmF1bHQ6CisJICBzdGF0ZS0+RW11bGF0ZSA9IEZBTFNFOworCSAgcmV0dXJuKEZBTFNFKTsKKworCWNhc2UgQW5nZWxTV0lfUmVhc29uX0Nsb2NrOgorICAgICAgIC8qIHJldHVybiBudW1iZXIgb2YgY2VudGktc2Vjb25kcy4uLiAqLworCSAgc3RhdGUtPlJlZ1swXSA9CisjaWZkZWYgQ0xPQ0tTX1BFUl9TRUMKKwkgICAgKENMT0NLU19QRVJfU0VDID49IDEwMCkKKwkgICAgPyAoQVJNd29yZCkgKGNsb2NrKCkgLyAoQ0xPQ0tTX1BFUl9TRUMgLyAxMDApKQorCSAgICA6IChBUk13b3JkKSAoKGNsb2NrKCkgKiAxMDApIC8gQ0xPQ0tTX1BFUl9TRUMpIDsKKyNlbHNlCisJICAvKiBwcmVzdW1lIHVuaXguLi4gY2xvY2soKSByZXR1cm5zIG1pY3Jvc2Vjb25kcyAqLworICAgICAgICAgIChBUk13b3JkKSAoY2xvY2soKSAvIDEwMDAwKSA7CisjZW5kaWYKKwkgIE9TcHRyLT5FcnJvck5vID0gZXJybm87CisJICByZXR1cm4gKFRSVUUpOworCisJY2FzZSBBbmdlbFNXSV9SZWFzb25fVGltZToKKwkgIHN0YXRlLT5SZWdbMF0gPSAoQVJNd29yZCkgdGltZSAoTlVMTCk7CisJICBPU3B0ci0+RXJyb3JObyA9IGVycm5vOworCSAgcmV0dXJuIChUUlVFKTsKKworCWNhc2UgQW5nZWxTV0lfUmVhc29uX1dyaXRlQzoKKwkgICh2b2lkKSBmcHV0YyAoKGludCkgQVJNdWxfUmVhZEJ5dGUgKHN0YXRlLGFkZHIpLCBzdGRlcnIpOworCSAgT1NwdHItPkVycm9yTm8gPSBlcnJubzsKKwkgIHJldHVybiAoVFJVRSk7CisKKwljYXNlIEFuZ2VsU1dJX1JlYXNvbl9Xcml0ZTA6CisJICBTV0lXcml0ZTAgKHN0YXRlLCBhZGRyKTsKKwkgIHJldHVybiAoVFJVRSk7CisKKwljYXNlIEFuZ2VsU1dJX1JlYXNvbl9DbG9zZToKKwkgIHN0YXRlLT5SZWdbMF0gPSBjbG9zZSAoQVJNdWxfUmVhZFdvcmQgKHN0YXRlLCBhZGRyKSk7CisJICBPU3B0ci0+RXJyb3JObyA9IGVycm5vOworCSAgcmV0dXJuIChUUlVFKTsKKworCWNhc2UgQW5nZWxTV0lfUmVhc29uX1NlZWs6CisJICBzdGF0ZS0+UmVnWzBdID0gLTEgPj0gbHNlZWsgKEFSTXVsX1JlYWRXb3JkKHN0YXRlLGFkZHIpLAorCQkJCSAgICAgICBBUk11bF9SZWFkV29yZChzdGF0ZSxhZGRyKzQpLAorCQkJCSAgICAgICBTRUVLX1NFVCk7CisJICBPU3B0ci0+RXJyb3JObyA9IGVycm5vOworCSAgcmV0dXJuIChUUlVFKTsKKworCWNhc2UgQW5nZWxTV0lfUmVhc29uX0ZMZW46CisJICBTV0lmbGVuIChzdGF0ZSwgQVJNdWxfUmVhZFdvcmQgKHN0YXRlLCBhZGRyKSk7CisJICByZXR1cm4gKFRSVUUpOworCisgICAgIAljYXNlIEFuZ2VsU1dJX1JlYXNvbl9HZXRDbWRMaW5lOgorCSAgV3JpdGVDb21tYW5kTGluZVRvIChzdGF0ZSwgQVJNdWxfUmVhZFdvcmQgKHN0YXRlLCBhZGRyKSk7CisJICByZXR1cm4gKFRSVUUpOworCisJY2FzZSBBbmdlbFNXSV9SZWFzb25fSGVhcEluZm86CisJICAvKiBSMSBpcyBhIHBvaW50ZXIgdG8gYSBwb2ludGVyICovCisJICBhZGRyID0gQVJNdWxfUmVhZFdvcmQgKHN0YXRlLCBhZGRyKTsKKworCSAgLyogUGljayB1cCB0aGUgcmlnaHQgbWVtb3J5IGxpbWl0ICovCisJICBpZiAoc3RhdGUtPk1lbVNpemUpCisJICAgIHRlbXAgPSBzdGF0ZS0+TWVtU2l6ZTsKKwkgIGVsc2UKKwkgICAgdGVtcCA9IEFERFJVU0VSU1RBQ0s7CisKKwkgIEFSTXVsX1dyaXRlV29yZCAoc3RhdGUsIGFkZHIsIDApOyAgICAgICAvKiBIZWFwIGJhc2UgKi8KKwkgIEFSTXVsX1dyaXRlV29yZCAoc3RhdGUsIGFkZHIrNCwgdGVtcCk7ICAgIC8qIEhlYXAgbGltaXQgKi8KKwkgIEFSTXVsX1dyaXRlV29yZCAoc3RhdGUsIGFkZHIrOCwgdGVtcCk7ICAgIC8qIFN0YWNrIGJhc2UgKi8KKwkgIEFSTXVsX1dyaXRlV29yZCAoc3RhdGUsIGFkZHIrMTIsIHRlbXApOyAgIC8qIFN0YWNrIGxpbWl0ICovCisJICByZXR1cm4gKFRSVUUpOworCisJY2FzZSBBbmdlbFNXSV9SZWFzb25fUmVwb3J0RXhjZXB0aW9uOgorCSAgaWYgKHN0YXRlLT5SZWdbMV0gPT0gQURQX1N0b3BwZWRfQXBwbGljYXRpb25FeGl0KQorCSAgICBzdGF0ZS0+UmVnWzBdID0gMDsKKwkgIGVsc2UKKwkgICAgc3RhdGUtPlJlZ1swXSA9IC0xOworCSAgc3RhdGUtPkVtdWxhdGUgPSBGQUxTRSA7ICAgICAgCisJICByZXR1cm4gKFRSVUUpOworCisJY2FzZSBBRFBfU3RvcHBlZF9BcHBsaWNhdGlvbkV4aXQ6CisJICBzdGF0ZS0+UmVnWzBdID0gMDsKKwkgIHN0YXRlLT5FbXVsYXRlID0gRkFMU0UgOyAgICAgIAorCSAgcmV0dXJuIChUUlVFKTsKKwkgIAorCWNhc2UgQURQX1N0b3BwZWRfUnVuVGltZUVycm9yOgorCSAgc3RhdGUtPlJlZ1swXSA9IC0xOworCSAgc3RhdGUtPkVtdWxhdGUgPSBGQUxTRSA7ICAgICAgCisJICByZXR1cm4gKFRSVUUpOworCisJY2FzZSBBbmdlbFNXSV9SZWFzb25fRXJybm86CisJICBzdGF0ZS0+UmVnWzBdID0gT1NwdHItPkVycm9yTm87CisJICByZXR1cm4gKFRSVUUpOworCisJY2FzZSBBbmdlbFNXSV9SZWFzb25fT3BlbjoKKwkgIFNXSW9wZW4oc3RhdGUsCisJCSAgQVJNdWxfUmVhZFdvcmQoc3RhdGUsIGFkZHIpLAorCQkgIEFSTXVsX1JlYWRXb3JkKHN0YXRlLCBhZGRyKzQpKTsKKwkgIHJldHVybiBUUlVFOworCisJY2FzZSBBbmdlbFNXSV9SZWFzb25fUmVhZDoKKwkgIFNXSXJlYWQoc3RhdGUsCisJCSAgQVJNdWxfUmVhZFdvcmQoc3RhdGUsIGFkZHIpLAorCQkgIEFSTXVsX1JlYWRXb3JkKHN0YXRlLCBhZGRyKzQpLAorCQkgIEFSTXVsX1JlYWRXb3JkKHN0YXRlLCBhZGRyKzgpKTsKKwkgIHJldHVybiBUUlVFOworCisJY2FzZSBBbmdlbFNXSV9SZWFzb25fV3JpdGU6CisJICBTV0l3cml0ZShzdGF0ZSwKKwkJICBBUk11bF9SZWFkV29yZChzdGF0ZSwgYWRkciksCisJCSAgQVJNdWxfUmVhZFdvcmQoc3RhdGUsIGFkZHIrNCksCisJCSAgQVJNdWxfUmVhZFdvcmQoc3RhdGUsIGFkZHIrOCkpOworCSAgcmV0dXJuIFRSVUU7CisJfQorCisgICAgZGVmYXVsdCA6CisgICAgICBzdGF0ZS0+RW11bGF0ZSA9IEZBTFNFIDsgICAgICAKKyAgICAgIHJldHVybihGQUxTRSkgOworICAgIH0KK30KKworI2Vsc2UgIC8qIENZR05VUyBMT0NBTDogI2lmIDEgKi8KKwordW5zaWduZWQgCitBUk11bF9PU0hhbmRsZVNXSSAoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIG51bWJlcikKK3sKKyNpZmRlZiBOT09TCisgcmV0dXJuKEZBTFNFKSA7CisjZWxzZQorI2lmZGVmIFZBTElEQVRFCisgc3dpdGNoIChudW1iZXIpIHsKKyAgICBjYXNlIDB4MTEgOgorICAgICAgIHN0YXRlLT5FbXVsYXRlID0gRkFMU0UgOworICAgICAgIHJldHVybihUUlVFKSA7CisgICAgY2FzZSAweDAxIDoKKyAgICAgICBpZiAoQVJNMzJCSVRNT0RFKQorICAgICAgICAgIEFSTXVsX1NldENQU1Ioc3RhdGUsIChBUk11bF9HZXRDUFNSKHN0YXRlKSAmIDB4ZmZmZmZmYzApIHwgMHgxMykgOworICAgICAgIGVsc2UKKyAgICAgICAgICBBUk11bF9TZXRDUFNSKHN0YXRlLCAoQVJNdWxfR2V0Q1BTUihzdGF0ZSkgJiAweGZmZmZmZmMwKSB8IDB4MykgOworICAgICAgIHJldHVybihUUlVFKSA7CisgICAgZGVmYXVsdCA6CisgICAgICAgcmV0dXJuKEZBTFNFKSA7CisgICAgfQorI2Vsc2UKKyBBUk13b3JkIGFkZHIsIHRlbXAgOworIGNoYXIgYnVmZmVyW0JVRkZFUlNJWkVdLCAqY3B0ciA7CisgRklMRSAqZnB0ciA7Cisgc3RydWN0IE9TYmxvY2sqIE9TcHRyID0gKHN0cnVjdCBPU2Jsb2NrKilzdGF0ZS0+T1NwdHIgOworCisgc3dpdGNoIChudW1iZXIpIHsKKyAgICBjYXNlIFNXSV9Xcml0ZUMgOgorICAgICAgICh2b2lkKWZwdXRjKChpbnQpc3RhdGUtPlJlZ1swXSxzdGRlcnIpIDsKKyAgICAgICBPU3B0ci0+RXJyb3JObyA9IGVycm5vIDsKKyAgICAgICByZXR1cm4oVFJVRSkgOworCisgICAgY2FzZSBTV0lfV3JpdGUwIDoKKyAgICAgICBhZGRyID0gc3RhdGUtPlJlZ1swXSA7CisgICAgICAgd2hpbGUgKCh0ZW1wID0gQVJNdWxfUmVhZEJ5dGUoc3RhdGUsYWRkcisrKSkgIT0gMCkKKyAgICAgICAgICBmcHV0YygoY2hhcil0ZW1wLHN0ZGVycikgOworICAgICAgIE9TcHRyLT5FcnJvck5vID0gZXJybm8gOworICAgICAgIHJldHVybihUUlVFKSA7CisKKyAgICBjYXNlIFNXSV9SZWFkQyA6CisgICAgICAgc3RhdGUtPlJlZ1swXSA9IChBUk13b3JkKWZnZXRjKHN0ZGluKSA7CisgICAgICAgT1NwdHItPkVycm9yTm8gPSBlcnJubyA7CisgICAgICAgcmV0dXJuKFRSVUUpIDsKKworICAgIGNhc2UgU1dJX0NMSSA6CisgICAgICAgYWRkciA9IHN0YXRlLT5SZWdbMF0gOworICAgICAgIGdldHN0cmluZyhzdGF0ZSxzdGF0ZS0+UmVnWzBdLGJ1ZmZlcikgOworICAgICAgIHN0YXRlLT5SZWdbMF0gPSAoQVJNd29yZClzeXN0ZW0oYnVmZmVyKSA7CisgICAgICAgT1NwdHItPkVycm9yTm8gPSBlcnJubyA7CisgICAgICAgcmV0dXJuKFRSVUUpIDsKKworICAgIGNhc2UgU1dJX0dldEVudiA6CisgICAgICAgc3RhdGUtPlJlZ1swXSA9IEFERFJDTURMSU5FIDsKKyAgICAgICBpZiAoc3RhdGUtPk1lbVNpemUpCisgICAgICAgICAgc3RhdGUtPlJlZ1sxXSA9IHN0YXRlLT5NZW1TaXplIDsKKyAgICAgICBlbHNlCisgICAgICAgICAgc3RhdGUtPlJlZ1sxXSA9IEFERFJVU0VSU1RBQ0sgOworCisgICAgICAgYWRkciA9IHN0YXRlLT5SZWdbMF0gOworICAgICAgIGNwdHIgPSBzdGF0ZS0+Q29tbWFuZExpbmUgOworICAgICAgIGlmIChjcHRyID09IE5VTEwpCisgICAgICAgICAgY3B0ciA9ICJcMCIgOworICAgICAgIGRvIHsKKyAgICAgICAgICB0ZW1wID0gKEFSTXdvcmQpKmNwdHIrKyA7CisgICAgICAgICAgQVJNdWxfV3JpdGVCeXRlKHN0YXRlLGFkZHIrKyx0ZW1wKSA7CisgICAgICAgICAgfSB3aGlsZSAodGVtcCAhPSAwKSA7CisgICAgICAgcmV0dXJuKFRSVUUpIDsKKworICAgIGNhc2UgU1dJX0V4aXQgOgorI2lmZGVmIEFTSU0KKyAgICAgICBzaW1rZXJuZWwxX2Fib3J0X3J1bigpIDsKKyNlbHNlCisgICAgICAgc3RhdGUtPkVtdWxhdGUgPSBGQUxTRSA7CisjZW5kaWYKKyAgICAgICByZXR1cm4oVFJVRSkgOworCisgICAgY2FzZSBTV0lfRW50ZXJPUyA6CisgICAgICAgaWYgKEFSTTMyQklUTU9ERSkKKyAgICAgICAgICBBUk11bF9TZXRDUFNSKHN0YXRlLCAoQVJNdWxfR2V0Q1BTUihzdGF0ZSkgJiAweGZmZmZmZmMwKSB8IDB4MTMpIDsKKyAgICAgICBlbHNlCisgICAgICAgICAgQVJNdWxfU2V0Q1BTUihzdGF0ZSwgKEFSTXVsX0dldENQU1Ioc3RhdGUpICYgMHhmZmZmZmZjMCkgfCAweDMpIDsKKyAgICAgICByZXR1cm4oVFJVRSkgOworCisgICAgY2FzZSBTV0lfR2V0RXJybm8gOgorICAgICAgIHN0YXRlLT5SZWdbMF0gPSBPU3B0ci0+RXJyb3JObyA7CisgICAgICAgcmV0dXJuKFRSVUUpIDsKKworICAgIGNhc2UgU1dJX0Nsb2NrIDoKKyAgICAgICAvKiByZXR1cm4gbXViZXIgb2YgY2VudGktc2Vjb25kcy4uLiAqLworICAgICAgIHN0YXRlLT5SZWdbMF0gPQorI2lmZGVmIENMT0NLU19QRVJfU0VDCisgICAgICAgICAgKENMT0NLU19QRVJfU0VDID49IDEwMCkKKyAgICAgICAgICAgICA/IChBUk13b3JkKSAoY2xvY2soKSAvIChDTE9DS1NfUEVSX1NFQyAvIDEwMCkpCisgICAgICAgICAgICAgOiAoQVJNd29yZCkgKChjbG9jaygpICogMTAwKSAvIENMT0NLU19QRVJfU0VDKSA7CisjZWxzZQorICAgICAvKiBwcmVzdW1lIHVuaXguLi4gY2xvY2soKSByZXR1cm5zIG1pY3Jvc2Vjb25kcyAqLworICAgICAgICAgIChBUk13b3JkKSAoY2xvY2soKSAvIDEwMDAwKSA7CisjZW5kaWYKKyAgICAgICBPU3B0ci0+RXJyb3JObyA9IGVycm5vIDsKKyAgICAgICByZXR1cm4oVFJVRSkgOworCisgICAgY2FzZSBTV0lfVGltZSA6CisgICAgICAgc3RhdGUtPlJlZ1swXSA9IChBUk13b3JkKXRpbWUoTlVMTCkgOworICAgICAgIE9TcHRyLT5FcnJvck5vID0gZXJybm8gOworICAgICAgIHJldHVybihUUlVFKSA7CisKKyAgICBjYXNlIFNXSV9SZW1vdmUgOgorICAgICAgIGdldHN0cmluZyhzdGF0ZSxzdGF0ZS0+UmVnWzBdLGJ1ZmZlcikgOworICAgICAgIHN0YXRlLT5SZWdbMF0gPSB1bmxpbmsoYnVmZmVyKSA7CisgICAgICAgT1NwdHItPkVycm9yTm8gPSBlcnJubyA7CisgICAgICAgcmV0dXJuKFRSVUUpIDsKKworICAgIGNhc2UgU1dJX1JlbmFtZSA6IHsKKyAgICAgICBjaGFyIGJ1ZmZlcjJbQlVGRkVSU0laRV0gOworCisgICAgICAgZ2V0c3RyaW5nKHN0YXRlLHN0YXRlLT5SZWdbMF0sYnVmZmVyKSA7CisgICAgICAgZ2V0c3RyaW5nKHN0YXRlLHN0YXRlLT5SZWdbMV0sYnVmZmVyMikgOworICAgICAgIHN0YXRlLT5SZWdbMF0gPSByZW5hbWUoYnVmZmVyLGJ1ZmZlcjIpIDsKKyAgICAgICBPU3B0ci0+RXJyb3JObyA9IGVycm5vIDsKKyAgICAgICByZXR1cm4oVFJVRSkgOworICAgICAgIH0KKworICAgIGNhc2UgU1dJX09wZW4gOiB7CisjaWYgMAorICAgICAgLyogSXQgc2VlbXMgdG8gbWUgdGhhdCB0aGVzZSBhcmUgaW4gdGhlIHdyb25nIG9yZGVyCisJIHNhY0BjeWdudXMuY29tLCBzbyBJJ3ZlIHJlZG9uZSBpdCB0byB1c2UgdGhlCisJIGZsYWdzIGluc3RlYWQsIHdpdGggdGhlIGZ1bmN0aW9uYWxpdHkgd2hpY2ggd2FzIGFscmVhZHkKKwkgdGhlcmUgLS0gYWhoLCBwZXJoYXBzIHRoZSBUUlVOQyBiaXQgaXMgaW4gYSBkaWZmZXJlbnQKKwkgcGxhY2Ugb24gdGhlIG9yaWdpbmFsIGhvc3QgPyovCisgICAgICAgc3RhdGljIGNoYXIqIGZtb2RlW10gPSB7InIiLCJyYiIsInIrIiwicitiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidyIsIndiIiwidysiLCJ3K2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIiwiYWIiLCJhKyIsImErYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInIiLCJyIiwiciIsInIifSAvKiBsYXN0IDQgYXJlIGlsbGVnYWwgKi8gOworI2VuZGlmCisKKyAgICAgICB1bnNpZ25lZCB0eXBlIDsKKworICAgICAgIHR5cGUgPSAodW5zaWduZWQpKHN0YXRlLT5SZWdbMV0gJiAzTCkgOworICAgICAgIGdldHN0cmluZyhzdGF0ZSxzdGF0ZS0+UmVnWzBdLGJ1ZmZlcikgOworICAgICAgIGlmIChzdHJjbXAoYnVmZmVyLCI6dHQiKT09MCAmJiAodHlwZSA9PSBPX1JET05MWSApKSAvKiBvcGVuaW5nIHR0eSAiciIgKi8KKyAgICAgICAgICBmcHRyID0gc3RkaW4gOworICAgICAgIGVsc2UgaWYgKHN0cmNtcChidWZmZXIsIjp0dCIpPT0wICYmICh0eXBlID09IE9fV1JPTkxZKSkgLyogb3BlbmluZyB0dHkgInciICovCisgICAgICAgICAgZnB0ciA9IHN0ZGVyciA7CisgICAgICAgZWxzZQorCSB7CisJICAgc3dpdGNoICh0eXBlKSAKKwkgICAgIHsKKwkgICAgIGNhc2UgT19SRE9OTFk6CisJICAgICAgIGZwdHIgPSBmb3BlbihidWZmZXIsInIiKSA7CisJICAgICAgIGJyZWFrOworCSAgICAgY2FzZSBPX1dST05MWToKKwkgICAgICAgZnB0ciA9IGZvcGVuKGJ1ZmZlciwidyIpIDsKKwkgICAgICAgYnJlYWs7CisJICAgICBjYXNlIE9fUkRXUjoKKwkgICAgICAgZnB0ciA9IGZvcGVuKGJ1ZmZlciwicnciKSA7CisJICAgICAgIGJyZWFrOworCSAgICAgfQorCSB9CisKKyAgICAgICBzdGF0ZS0+UmVnWzBdID0gMCA7CisgICAgICAgaWYgKGZwdHIgIT0gTlVMTCkgeworICAgICAgICAgIGZvciAodGVtcCA9IDAgOyB0ZW1wIDwgRk9QRU5fTUFYIDsgdGVtcCsrKQorICAgICAgICAgICAgIGlmIChPU3B0ci0+RmlsZVRhYmxlW3RlbXBdID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBPU3B0ci0+RmlsZVRhYmxlW3RlbXBdID0gZnB0ciA7CisgICAgICAgICAgICAgICAgT1NwdHItPkZpbGVGbGFnc1t0ZW1wXSA9IHR5cGUgJiAxIDsgLyogcHJlc2VydmUgdGhlIGJpbmFyeSBiaXQgKi8KKyAgICAgICAgICAgICAgICBzdGF0ZS0+UmVnWzBdID0gKEFSTXdvcmQpKHRlbXAgKyAxKSA7CisgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3RhdGUtPlJlZ1swXSA9PSAwKQorICAgICAgICAgICAgIE9TcHRyLT5FcnJvck5vID0gRU1GSUxFIDsgLyogdG9vIG1hbnkgb3BlbiBmaWxlcyAqLworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBPU3B0ci0+RXJyb3JObyA9IGVycm5vIDsKKyAgICAgICAgICB9CisgICAgICAgZWxzZQorICAgICAgICAgT1NwdHItPkVycm9yTm8gPSBlcnJubyA7CisgICAgICAgcmV0dXJuKFRSVUUpIDsKKyAgICAgICB9CisKKyAgICBjYXNlIFNXSV9DbG9zZSA6CisgICAgICAgdGVtcCA9IHN0YXRlLT5SZWdbMF0gOworICAgICAgIGlmICh0ZW1wID09IDAgfHwgdGVtcCA+IEZPUEVOX01BWCB8fCBPU3B0ci0+RmlsZVRhYmxlW3RlbXAgLSAxXSA9PSAwKSB7CisgICAgICAgICAgT1NwdHItPkVycm9yTm8gPSBFQkFERiA7CisgICAgICAgICAgc3RhdGUtPlJlZ1swXSA9IC0xTCA7CisgICAgICAgICAgcmV0dXJuKFRSVUUpIDsKKyAgICAgICAgICB9CisgICAgICAgdGVtcC0tIDsKKyAgICAgICBmcHRyID0gT1NwdHItPkZpbGVUYWJsZVt0ZW1wXSA7CisgICAgICAgaWYgKGZwdHIgPT0gc3RkaW4gfHwgZnB0ciA9PSBzdGRlcnIpCisgICAgICAgICAgc3RhdGUtPlJlZ1swXSA9IDAgOworICAgICAgIGVsc2UKKyAgICAgICAgICBzdGF0ZS0+UmVnWzBdID0gZmNsb3NlKGZwdHIpIDsKKyAgICAgICBPU3B0ci0+RmlsZVRhYmxlW3RlbXBdID0gTlVMTCA7CisgICAgICAgT1NwdHItPkVycm9yTm8gPSBlcnJubyA7CisgICAgICAgcmV0dXJuKFRSVUUpIDsKKworICAgIGNhc2UgU1dJX1dyaXRlIDogeworICAgICAgIHVuc2lnbmVkIHNpemUsIHVwdG8sIHR5cGUgOworICAgICAgIGNoYXIgY2ggOworCisgICAgICAgdGVtcCA9IHN0YXRlLT5SZWdbMF0gOworICAgICAgIGlmICh0ZW1wID09IDAgfHwgdGVtcCA+IEZPUEVOX01BWCB8fCBPU3B0ci0+RmlsZVRhYmxlW3RlbXAgLSAxXSA9PSAwKSB7CisgICAgICAgICAgT1NwdHItPkVycm9yTm8gPSBFQkFERiA7CisgICAgICAgICAgc3RhdGUtPlJlZ1swXSA9IC0xTCA7CisgICAgICAgICAgcmV0dXJuKFRSVUUpIDsKKyAgICAgICAgICB9CisgICAgICAgdGVtcC0tIDsKKyAgICAgICBmcHRyID0gT1NwdHItPkZpbGVUYWJsZVt0ZW1wXSA7CisgICAgICAgdHlwZSA9IE9TcHRyLT5GaWxlRmxhZ3NbdGVtcF0gOworICAgICAgIGFkZHIgPSBzdGF0ZS0+UmVnWzFdIDsKKyAgICAgICBzaXplID0gKHVuc2lnbmVkKXN0YXRlLT5SZWdbMl0gOworCisgICAgICAgaWYgKHR5cGUgJiBSRUFET1ApCisgICAgICAgICAgZnNlZWsoZnB0ciwwTCxTRUVLX0NVUikgOworICAgICAgIE9TcHRyLT5GaWxlRmxhZ3NbdGVtcF0gPSAodHlwZSAmIEJJTkFSWSkgfCBXUklURU9QIDsgOworICAgICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICAgIGlmIChzaXplID49IEJVRkZFUlNJWkUpCisgICAgICAgICAgICAgdXB0byA9IEJVRkZFUlNJWkUgOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICB1cHRvID0gc2l6ZSA7CisgICAgICAgICAgZm9yIChjcHRyID0gYnVmZmVyIDsgKGNwdHIgLSBidWZmZXIpIDwgdXB0byA7IGNwdHIrKykgeworICAgICAgICAgICAgIGNoID0gKGNoYXIpQVJNdWxfUmVhZEJ5dGUoc3RhdGUsKEFSTXdvcmQpYWRkcisrKSA7CisgICAgICAgICAgICAgKmNwdHIgPSBGSVhDUkxGKHR5cGUsY2gpIDsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgdGVtcCA9IGZ3cml0ZShidWZmZXIsMSx1cHRvLGZwdHIpIDsKKyAgICAgICAgICBpZiAodGVtcCA8IHVwdG8pIHsKKyAgICAgICAgICAgICBzdGF0ZS0+UmVnWzBdID0gKEFSTXdvcmQpKHNpemUgLSB0ZW1wKSA7CisgICAgICAgICAgICAgT1NwdHItPkVycm9yTm8gPSBlcnJubyA7CisgICAgICAgICAgICAgcmV0dXJuKFRSVUUpIDsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgc2l6ZSAtPSB1cHRvIDsKKyAgICAgICAgICB9CisgICAgICAgc3RhdGUtPlJlZ1swXSA9IDAgOworICAgICAgIE9TcHRyLT5FcnJvck5vID0gZXJybm8gOworICAgICAgIHJldHVybihUUlVFKSA7CisgICAgICAgfQorCisgICAgY2FzZSBTV0lfUmVhZCA6IHsKKyAgICAgICB1bnNpZ25lZCBzaXplLCB1cHRvLCB0eXBlIDsKKyAgICAgICBjaGFyIGNoIDsKKworICAgICAgIHRlbXAgPSBzdGF0ZS0+UmVnWzBdIDsKKyAgICAgICBpZiAodGVtcCA9PSAwIHx8IHRlbXAgPiBGT1BFTl9NQVggfHwgT1NwdHItPkZpbGVUYWJsZVt0ZW1wIC0gMV0gPT0gMCkgeworICAgICAgICAgIE9TcHRyLT5FcnJvck5vID0gRUJBREYgOworICAgICAgICAgIHN0YXRlLT5SZWdbMF0gPSAtMUwgOworICAgICAgICAgIHJldHVybihUUlVFKSA7CisgICAgICAgICAgfQorICAgICAgIHRlbXAtLSA7CisgICAgICAgZnB0ciA9IE9TcHRyLT5GaWxlVGFibGVbdGVtcF0gOworICAgICAgIGFkZHIgPSBzdGF0ZS0+UmVnWzFdIDsKKyAgICAgICBzaXplID0gKHVuc2lnbmVkKXN0YXRlLT5SZWdbMl0gOworICAgICAgIHR5cGUgPSBPU3B0ci0+RmlsZUZsYWdzW3RlbXBdIDsKKworICAgICAgIGlmICh0eXBlICYgV1JJVEVPUCkKKyAgICAgICAgICBmc2VlayhmcHRyLDBMLFNFRUtfQ1VSKSA7CisgICAgICAgT1NwdHItPkZpbGVGbGFnc1t0ZW1wXSA9ICh0eXBlICYgQklOQVJZKSB8IFJFQURPUCA7IDsKKyAgICAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgICBpZiAoaXNhdHR5XyhmcHRyKSkgeworICAgICAgICAgICAgIHVwdG8gPSAoc2l6ZSA+PSBCVUZGRVJTSVpFKT9CVUZGRVJTSVpFOnNpemUgKyAxIDsKKyAgICAgICAgICAgICBpZiAoZmdldHMoYnVmZmVyLCB1cHRvLCBmcHRyKSAhPSAwKQorICAgICAgICAgICAgICAgdGVtcCA9IHN0cmxlbihidWZmZXIpIDsKKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB0ZW1wID0gMCA7CisgICAgICAgICAgICAgdXB0by0tIDsgLyogMSBjaGFyIHVzZWQgZm9yIHRlcm1pbmF0aW5nIG51bGwgKi8KKyAgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgdXB0byA9IChzaXplPj1CVUZGRVJTSVpFKT9CVUZGRVJTSVpFOnNpemUgOworICAgICAgICAgICAgIHRlbXAgPSBmcmVhZChidWZmZXIsMSx1cHRvLGZwdHIpIDsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgZm9yIChjcHRyID0gYnVmZmVyIDsgKGNwdHIgLSBidWZmZXIpIDwgdGVtcCA7IGNwdHIrKykgeworICAgICAgICAgICAgIGNoID0gKmNwdHIgOworICAgICAgICAgICAgIEFSTXVsX1dyaXRlQnl0ZShzdGF0ZSwoQVJNd29yZClhZGRyKyssRklYQ1JMRih0eXBlLGNoKSkgOworICAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAodGVtcCA8IHVwdG8pIHsKKyAgICAgICAgICAgICBzdGF0ZS0+UmVnWzBdID0gKEFSTXdvcmQpKHNpemUgLSB0ZW1wKSA7CisgICAgICAgICAgICAgT1NwdHItPkVycm9yTm8gPSBlcnJubyA7CisgICAgICAgICAgICAgcmV0dXJuKFRSVUUpIDsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgc2l6ZSAtPSB1cHRvIDsKKyAgICAgICAgICB9CisgICAgICAgc3RhdGUtPlJlZ1swXSA9IDAgOworICAgICAgIE9TcHRyLT5FcnJvck5vID0gZXJybm8gOworICAgICAgIHJldHVybihUUlVFKSA7CisgICAgICAgfQorCisgICAgY2FzZSBTV0lfU2VlayA6CisgICAgICAgaWYgKHN0YXRlLT5SZWdbMF0gPT0gMCB8fCBzdGF0ZS0+UmVnWzBdID4gRk9QRU5fTUFYCisgICAgICAgICAgIHx8IE9TcHRyLT5GaWxlVGFibGVbc3RhdGUtPlJlZ1swXSAtIDFdID09IDApIHsKKyAgICAgICAgICBPU3B0ci0+RXJyb3JObyA9IEVCQURGIDsKKyAgICAgICAgICBzdGF0ZS0+UmVnWzBdID0gLTFMIDsKKyAgICAgICAgICByZXR1cm4oVFJVRSkgOworICAgICAgICAgIH0KKyAgICAgICBmcHRyID0gT1NwdHItPkZpbGVUYWJsZVtzdGF0ZS0+UmVnWzBdIC0gMV0gOworICAgICAgIHN0YXRlLT5SZWdbMF0gPSBmc2VlayhmcHRyLChsb25nKXN0YXRlLT5SZWdbMV0sU0VFS19TRVQpIDsKKyAgICAgICBPU3B0ci0+RXJyb3JObyA9IGVycm5vIDsKKyAgICAgICByZXR1cm4oVFJVRSkgOworCisgICAgY2FzZSBTV0lfRmxlbiA6CisgICAgICAgaWYgKHN0YXRlLT5SZWdbMF0gPT0gMCB8fCBzdGF0ZS0+UmVnWzBdID4gRk9QRU5fTUFYCisgICAgICAgICAgIHx8IE9TcHRyLT5GaWxlVGFibGVbc3RhdGUtPlJlZ1swXSAtIDFdID09IDApIHsKKyAgICAgICAgICBPU3B0ci0+RXJyb3JObyA9IEVCQURGIDsKKyAgICAgICAgICBzdGF0ZS0+UmVnWzBdID0gLTFMIDsKKyAgICAgICAgICByZXR1cm4oVFJVRSkgOworICAgICAgICAgIH0KKyAgICAgICBmcHRyID0gT1NwdHItPkZpbGVUYWJsZVtzdGF0ZS0+UmVnWzBdIC0gMV0gOworICAgICAgIGFkZHIgPSAoQVJNd29yZClmdGVsbChmcHRyKSA7CisgICAgICAgaWYgKGZzZWVrKGZwdHIsMEwsU0VFS19FTkQpIDwgMCkKKyAgICAgICAgICBzdGF0ZS0+UmVnWzBdID0gLTEgOworICAgICAgIGVsc2UgeworICAgICAgICAgIHN0YXRlLT5SZWdbMF0gPSAoQVJNd29yZClmdGVsbChmcHRyKSA7CisgICAgICAgICAgKHZvaWQpZnNlZWsoZnB0cixhZGRyLFNFRUtfU0VUKSA7CisgICAgICAgICAgfQorICAgICAgIE9TcHRyLT5FcnJvck5vID0gZXJybm8gOworICAgICAgIHJldHVybihUUlVFKSA7CisKKyAgICBjYXNlIFNXSV9Jc1RUWSA6CisgICAgICAgaWYgKHN0YXRlLT5SZWdbMF0gPT0gMCB8fCBzdGF0ZS0+UmVnWzBdID4gRk9QRU5fTUFYCisgICAgICAgICAgIHx8IE9TcHRyLT5GaWxlVGFibGVbc3RhdGUtPlJlZ1swXSAtIDFdID09IDApIHsKKyAgICAgICAgICBPU3B0ci0+RXJyb3JObyA9IEVCQURGIDsKKyAgICAgICAgICBzdGF0ZS0+UmVnWzBdID0gLTFMIDsKKyAgICAgICAgICByZXR1cm4oVFJVRSkgOworICAgICAgICAgIH0KKyAgICAgICBmcHRyID0gT1NwdHItPkZpbGVUYWJsZVtzdGF0ZS0+UmVnWzBdIC0gMV0gOworICAgICAgIHN0YXRlLT5SZWdbMF0gPSBpc2F0dHlfKGZwdHIpIDsKKyAgICAgICBPU3B0ci0+RXJyb3JObyA9IGVycm5vIDsKKyAgICAgICByZXR1cm4oVFJVRSkgOworCisgICAgY2FzZSBTV0lfVG1wTmFtIDp7CisgICAgICAgQVJNd29yZCBzaXplIDsKKworICAgICAgIGFkZHIgPSBzdGF0ZS0+UmVnWzBdIDsKKyAgICAgICB0ZW1wID0gc3RhdGUtPlJlZ1sxXSAmIDB4ZmYgOworICAgICAgIHNpemUgPSBzdGF0ZS0+UmVnWzJdIDsKKyAgICAgICBpZiAoT1NwdHItPnRlbXBuYW1lc1t0ZW1wXSA9PSBOVUxMKSB7CisgICAgICAgICAgaWYgKChPU3B0ci0+dGVtcG5hbWVzW3RlbXBdID0gbWFsbG9jKExfdG1wbmFtKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgIHN0YXRlLT5SZWdbMF0gPSAwIDsKKyAgICAgICAgICAgICByZXR1cm4oVFJVRSkgOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAodm9pZCl0bXBuYW0oT1NwdHItPnRlbXBuYW1lc1t0ZW1wXSkgOworICAgICAgICAgIH0KKyAgICAgICBjcHRyID0gT1NwdHItPnRlbXBuYW1lc1t0ZW1wXSA7CisgICAgICAgaWYgKHN0cmxlbihjcHRyKSA+IHN0YXRlLT5SZWdbMl0pCisgICAgICAgICAgc3RhdGUtPlJlZ1swXSA9IDAgOworICAgICAgIGVsc2UKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgQVJNdWxfV3JpdGVCeXRlKHN0YXRlLGFkZHIrKywqY3B0cikgOworICAgICAgICAgICAgIH0gd2hpbGUgKCpjcHRyKysgIT0gMCkgOworICAgICAgIE9TcHRyLT5FcnJvck5vID0gZXJybm8gOworICAgICAgIHJldHVybihUUlVFKSA7CisgICAgICAgfQorCisgICAgY2FzZSBTV0lfSW5zdGFsbEhhbmRsZXI6CisgICAgICAgeyAgQVJNd29yZCBoYW5kbGVycCA9IEFERFJTT0ZIQU5ETEVSUyArIHN0YXRlLT5SZWdbMF0gKiA4OworICAgICAgICAgIEFSTXdvcmQgb2xkcjEgPSBBUk11bF9SZWFkV29yZChzdGF0ZSwgaGFuZGxlcnApLAorICAgICAgICAgICAgICAgICAgb2xkcjIgPSBBUk11bF9SZWFkV29yZChzdGF0ZSwgaGFuZGxlcnAgKyA0KTsKKyAgICAgICAgICBBUk11bF9Xcml0ZVdvcmQoc3RhdGUsIGhhbmRsZXJwLCBzdGF0ZS0+UmVnWzFdKTsKKyAgICAgICAgICBBUk11bF9Xcml0ZVdvcmQoc3RhdGUsIGhhbmRsZXJwICsgNCwgc3RhdGUtPlJlZ1syXSk7CisgICAgICAgICAgc3RhdGUtPlJlZ1sxXSA9IG9sZHIxOworICAgICAgICAgIHN0YXRlLT5SZWdbMl0gPSBvbGRyMjsKKyAgICAgICAgICByZXR1cm4oVFJVRSk7CisgICAgICAgfQorCisgICAgY2FzZSBTV0lfR2VuZXJhdGVFcnJvcjoKKyAgICAgICBBUk11bF9BYm9ydChzdGF0ZSwgQVJNU1dJVikgOworICAgICAgIGlmIChzdGF0ZS0+RW11bGF0ZSkKKyAgICAgICAgICBBUk11bF9TZXRSMTUoc3RhdGUsIEFSTXVsX1JlYWRXb3JkKHN0YXRlLCBBRERSU09GVFZFQ1RPUlMgKyBBUk1FcnJvclYpKTsKKyAgICAgICByZXR1cm4oVFJVRSk7CisKKy8qIFNXSSdzIDB4OXggdW53aW5kIHRoZSBzdGF0ZSBvZiB0aGUgQ1BVIGFmdGVyIGFuIGFib3J0IG9mIHR5cGUgeCAqLworCisgICAgY2FzZSAweDkwOiAvKiBCcmFuY2ggdGhyb3VnaCB6ZXJvICovCisgICAgICAgeyAgQVJNd29yZCBvbGRwc3IgPSBBUk11bF9HZXRDUFNSKHN0YXRlKSA7CisgICAgICAgICAgQVJNdWxfU2V0Q1BTUihzdGF0ZSwgKG9sZHBzciAmIDB4ZmZmZmZmYzApIHwgMHgxMykgOworICAgICAgICAgIEFSTXVsX1NldFNQU1Ioc3RhdGUsIFNWQzMyTU9ERSwgb2xkcHNyKSA7CisgICAgICAgICAgc3RhdGUtPlJlZ1sxNF0gPSAwOworICAgICAgICAgIGdvdG8gVGlkeUNvbW1vbjsKKyAgICAgICB9CisKKyAgICBjYXNlIDB4OTg6IC8qIEVycm9yICovCisgICAgICAgeyAgQVJNd29yZCBlcnJvcnAgPSBzdGF0ZS0+UmVnWzBdLAorICAgICAgICAgICAgICAgICAgcmVncCA9IHN0YXRlLT5SZWdbMV07CisgICAgICAgICAgdW5zaWduZWQgaTsKKyAgICAgICAgICBBUk13b3JkIGVycm9ycHNyID0gQVJNdWxfUmVhZFdvcmQoc3RhdGUsIHJlZ3AgKyAxNio0KTsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykKKyAgICAgICAgICAgIEFSTXVsX1NldFJlZyhzdGF0ZSxlcnJvcnBzcixpLEFSTXVsX1JlYWRXb3JkKHN0YXRlLCByZWdwICsgaSo0TCkpIDsKKyAgICAgICAgICBzdGF0ZS0+UmVnWzE0XSA9IEFSTXVsX1JlYWRXb3JkKHN0YXRlLCByZWdwICsgMTUqNEwpOworICAgICAgICAgIHN0YXRlLT5SZWdbMTBdID0gZXJyb3JwOworICAgICAgICAgIEFSTXVsX1NldFNQU1Ioc3RhdGUsc3RhdGUtPk1vZGUsZXJyb3Jwc3IpIDsKKyAgICAgICAgICBPU3B0ci0+RXJyb3JQID0gZXJyb3JwOworICAgICAgICAgIGdvdG8gVGlkeUNvbW1vbjsKKyAgICAgICB9CisKKyAgICBjYXNlIDB4OTQ6IC8qIERhdGEgYWJvcnQgKi8KKyAgICAgICB7ICBBUk13b3JkIGFkZHIgPSBzdGF0ZS0+UmVnWzE0XSAtIDg7CisgICAgICAgICAgQVJNd29yZCBjcHNyID0gQVJNdWxfR2V0Q1BTUihzdGF0ZSkgOworICAgICAgICAgIGlmIChBUk0yNkJJVE1PREUpCisgICAgICAgICAgICAgYWRkciA9IGFkZHIgJiAweDNmZmZmZmMgOworICAgICAgICAgIEFSTXVsX1NldENQU1Ioc3RhdGUsQVJNdWxfR2V0U1BTUihzdGF0ZSxjcHNyKSkgOworICAgICAgICAgIFVud2luZERhdGFBYm9ydChzdGF0ZSwgYWRkcik7CisgICAgICAgICAgaWYgKGFkZHIgPj0gRlBFU1RBUlQgJiYgYWRkciA8IEZQRUVORCkgeyAvKiBpbiB0aGUgRlBFICovCisgICAgICAgICAgICAgQVJNd29yZCBzcCwgc3BzciA7CisgICAgICAgICAgICAgdW5zaWduZWQgaSA7CisKKyAgICAgICAgICAgICBzcCA9IHN0YXRlLT5SZWdbMTNdIDsKKyAgICAgICAgICAgICBzdGF0ZS0+UmVnWzEzXSArPSA2NCA7IC8qIGZpeCB0aGUgYWJvcnRpbmcgbW9kZSBzcCAqLworICAgICAgICAgICAgIHN0YXRlLT5SZWdbMTRdID0gQVJNdWxfUmVhZFdvcmQoc3RhdGUsc3AgKyA2MCkgOyAvKiBhbmQgaXRzIGxyICovCisgICAgICAgICAgICAgc3BzciA9IEFSTXVsX0dldFNQU1Ioc3RhdGUsc3RhdGUtPk1vZGUpIDsKKyAgICAgICAgICAgICBzdGF0ZS0+TW9kZSA9IEFSTXVsX1N3aXRjaE1vZGUoc3RhdGUsIHN0YXRlLT5Nb2RlLCBzcHNyKTsKKyAgICAgICAgICAgICBmb3IgKGkgPSAwIDsgaSA8IDE1IDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQVJNdWxfU2V0UmVnKHN0YXRlLHNwc3IsaSxBUk11bF9SZWFkV29yZChzdGF0ZSxzcCkpIDsKKyAgICAgICAgICAgICAgICBzcCArPSA0IDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgQVJNdWxfU2V0Q1BTUihzdGF0ZSxjcHNyKSA7CisgICAgICAgICAgICAgc3RhdGUtPlJlZ1sxNF0gPSBBUk11bF9SZWFkV29yZChzdGF0ZSxzcCkgKyA0IDsgLyogYm90Y2ggaXQgKi8KKyAgICAgICAgICAgICBBUk11bF9TZXRTUFNSKHN0YXRlLHN0YXRlLT5Nb2RlLHNwc3IpIDsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIEFSTXVsX1NldENQU1Ioc3RhdGUsY3BzcikgOworCisgICAgICAgICAgLyogYW5kIGZhbGwgdGhyb3VnaCB0byBjb3JyZWN0IHIxNCAqLworICAgICAgIH0KKyAgICBjYXNlIDB4OTU6IC8qIEFkZHJlc3MgRXhjZXB0aW9uICovCisgICAgICAgc3RhdGUtPlJlZ1sxNF0gLT0gNDsKKyAgICBjYXNlIDB4OTE6IC8qIFVuZGVmaW5lZCBpbnN0cnVjdGlvbiAqLworICAgIGNhc2UgMHg5MjogLyogU1dJICovCisgICAgY2FzZSAweDkzOiAvKiBQcmVmZXRjaCBhYm9ydCAqLworICAgIGNhc2UgMHg5NjogLyogSVJRICovCisgICAgY2FzZSAweDk3OiAvKiBGSVEgKi8KKyAgICAgICBzdGF0ZS0+UmVnWzE0XSAtPSA0OworICAgIFRpZHlDb21tb246CisgICAgICAgaWYgKHN0YXRlLT5WZWN0b3JDYXRjaCAmICgxIDw8IChudW1iZXIgLSAweDkwKSkpIHsKKyAgICAgICAgICBBUk11bF9TZXRSMTUoc3RhdGUsIHN0YXRlLT5SZWdbMTRdICsgOCkgOyAvKiB0aGUgOCBpcyB0aGUgcGlwZWxpbmluZyB0aGUgdGhlIFJESSB3aWxsIHVuZG8gKi8KKyAgICAgICAgICBBUk11bF9TZXRDUFNSKHN0YXRlLEFSTXVsX0dldFNQU1Ioc3RhdGUsQVJNdWxfR2V0Q1BTUihzdGF0ZSkpKSA7CisgICAgICAgICAgaWYgKG51bWJlciA9PSAweDkwKQorICAgICAgICAgICAgIHN0YXRlLT5FbmRDb25kaXRpb24gPSAxMCA7IC8qIEJyYW5jaCB0aHJvdWdoIFplcm8gRXJyb3IgKi8KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgc3RhdGUtPkVuZENvbmRpdGlvbiA9ICh1bnNpZ25lZCludW1iZXIgLSAweDhmOworICAgICAgICAgIHN0YXRlLT5FbXVsYXRlID0gRkFMU0UgOworICAgICAgICAgIH0KKyAgICAgICBlbHNlIHsKKyAgICAgICAgICBBUk13b3JkIHNwID0gc3RhdGUtPlJlZ1sxM107CisgICAgICAgICAgQVJNdWxfV3JpdGVXb3JkKHN0YXRlLCBzcCAtIDQsIHN0YXRlLT5SZWdbMTRdKTsKKyAgICAgICAgICBBUk11bF9Xcml0ZVdvcmQoc3RhdGUsIHNwIC0gOCwgc3RhdGUtPlJlZ1sxMl0pOworICAgICAgICAgIEFSTXVsX1dyaXRlV29yZChzdGF0ZSwgc3AgLSAxMiwgc3RhdGUtPlJlZ1sxMV0pOworICAgICAgICAgIEFSTXVsX1dyaXRlV29yZChzdGF0ZSwgc3AgLSAxNiwgc3RhdGUtPlJlZ1sxMF0pOworICAgICAgICAgIHN0YXRlLT5SZWdbMTNdID0gc3AgLSAxNjsKKyAgICAgICAgICBzdGF0ZS0+UmVnWzExXSA9IEFERFJTT0ZIQU5ETEVSUyArIDggKiAobnVtYmVyIC0gMHg5MCk7CisgICAgICAgICAgfQorICAgICAgIHJldHVybihUUlVFKTsKKworLyogU1dJJ3MgMHg4eCBwYXNzIGFuIGFib3J0IG9mIHR5cGUgeCB0byB0aGUgZGVidWdnZXIgaWYgYSBoYW5kbGVyIHJldHVybnMgKi8KKworICAgIGNhc2UgMHg4MDogY2FzZSAweDgxOiBjYXNlIDB4ODI6IGNhc2UgMHg4MzoKKyAgICBjYXNlIDB4ODQ6IGNhc2UgMHg4NTogY2FzZSAweDg2OiBjYXNlIDB4ODc6IGNhc2UgMHg4ODoKKyAgICAgICB7ICBBUk13b3JkIHNwID0gc3RhdGUtPlJlZ1sxM107CisgICAgICAgICAgc3RhdGUtPlJlZ1sxMF0gPSBBUk11bF9SZWFkV29yZChzdGF0ZSwgc3ApOworICAgICAgICAgIHN0YXRlLT5SZWdbMTFdID0gQVJNdWxfUmVhZFdvcmQoc3RhdGUsIHNwICsgNCk7CisgICAgICAgICAgc3RhdGUtPlJlZ1sxMl0gPSBBUk11bF9SZWFkV29yZChzdGF0ZSwgc3AgKyA4KTsKKyAgICAgICAgICBzdGF0ZS0+UmVnWzE0XSA9IEFSTXVsX1JlYWRXb3JkKHN0YXRlLCBzcCArIDEyKTsKKyAgICAgICAgICBzdGF0ZS0+UmVnWzEzXSA9IHNwICsgMTY7CisgICAgICAgICAgQVJNdWxfU2V0UjE1KHN0YXRlLCBzdGF0ZS0+UmVnWzE0XSArIDgpIDsgLyogdGhlIDggaXMgdGhlIHBpcGVsaW5pbmcgdGhlIHRoZSBSREkgd2lsbCB1bmRvICovCisgICAgICAgICAgQVJNdWxfU2V0Q1BTUihzdGF0ZSxBUk11bF9HZXRTUFNSKHN0YXRlLEFSTXVsX0dldENQU1Ioc3RhdGUpKSkgOworICAgICAgICAgIGlmIChudW1iZXIgPT0gMHg4MCkKKyAgICAgICAgICAgICBzdGF0ZS0+RW5kQ29uZGl0aW9uID0gMTAgOyAvKiBCcmFuY2ggdGhyb3VnaCBaZXJvIEVycm9yICovCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIHN0YXRlLT5FbmRDb25kaXRpb24gPSAodW5zaWduZWQpbnVtYmVyIC0gMHg3ZjsKKyAgICAgICAgICBzdGF0ZS0+RW11bGF0ZSA9IEZBTFNFIDsKKyAgICAgICAgICByZXR1cm4oVFJVRSk7CisgICAgICAgfQorCisgICAgZGVmYXVsdCA6CisgICAgICAgICAgc3RhdGUtPkVtdWxhdGUgPSBGQUxTRSA7ICAgICAgCisgICAgICAgcmV0dXJuKEZBTFNFKSA7CisgICAgfQorI2VuZGlmCisjZW5kaWYKKyB9CisjZW5kaWYgIC8qIENZR05VUyBMT0NBTDogI2lmIDEgKi8KKworI2lmbmRlZiBOT09TCisjaWZuZGVmIEFTSU0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhlIGVtdWxhdG9yIGNhbGxzIHRoaXMgcm91dGluZSB3aGVuIGFuIEV4Y2VwdGlvbiBvY2N1cnMuICBUaGUgc2Vjb25kICAgICAqCisqIHBhcmFtZXRlciBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsZXZhbnQgZXhjZXB0aW9uIHZlY3Rvci4gIFJldHVybmluZyAgICAgKgorKiBGQUxTRSBmcm9tIHRoaXMgcm91dGluZSBjYXVzZXMgdGhlIHRyYXAgdG8gYmUgdGFrZW4sIFRSVUUgY2F1c2VzIGl0IHRvICAgICoKKyogYmUgaWdub3JlZCAoc28gc2V0IHN0YXRlLT5FbXVsYXRlIHRvIEZBTFNFISkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bnNpZ25lZCAKK0FSTXVsX09TRXhjZXB0aW9uIChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgdmVjdG9yLCBBUk13b3JkIHBjKQoreyAvKiBkb24ndCB1c2UgdGhpcyBoZXJlICovCisgcmV0dXJuKEZBTFNFKSA7Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbndpbmQgYSBkYXRhIGFib3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIAorVW53aW5kRGF0YUFib3J0IChBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgYWRkcikKK3sKKyAgQVJNd29yZCBpbnN0ciA9IEFSTXVsX1JlYWRXb3JkKHN0YXRlLCBhZGRyKTsKKyAgQVJNd29yZCBybiA9IEJJVFMoMTYsIDE5KTsKKyAgQVJNd29yZCBpdHlwZSA9IEJJVFMoMjQsIDI3KTsKKyAgQVJNd29yZCBvZmZzZXQ7CisgIGlmIChybiA9PSAxNSkgcmV0dXJuOworICBpZiAoaXR5cGUgPT0gOCB8fCBpdHlwZSA9PSA5KSB7CisgICAgLyogTERNIG9yIFNUTSAqLworICAgIHVuc2lnbmVkIGxvbmcgcmVncyA9IEJJVFMoMCwgMTUpOworICAgIG9mZnNldCA9IDA7CisgICAgaWYgKCFCSVQoMjEpKSByZXR1cm47IC8qIG5vIHdiICovCisgICAgZm9yICg7IHJlZ3MgIT0gMDsgb2Zmc2V0KyspCisgICAgICByZWdzIF49IChyZWdzICYgLXJlZ3MpOworICAgIGlmIChvZmZzZXQgPT0gMCkgb2Zmc2V0ID0gMTY7CisgIH0gZWxzZSBpZiAoaXR5cGUgPT0gMTIgfHwgICAgICAgICAgICAgIC8qIHBvc3QtaW5kZXhlZCBDUERUICovCisgICAgICAgICAgICAgKGl0eXBlID09IDEzICYmIEJJVCgyMSkpKSB7IC8qIHByZV9pbmRleGVkIENQRFQgd2l0aCBXQiAqLworICAgIG9mZnNldCA9IEJJVFMoMCwgNyk7CisgIH0gZWxzZQorICAgIHJldHVybjsKKworICBpZiAoQklUKDIzKSkKKyAgICBzdGF0ZS0+UmVnW3JuXSAtPSBvZmZzZXQgKiA0OworICBlbHNlCisgICAgc3RhdGUtPlJlZ1tybl0gKz0gb2Zmc2V0ICogNDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgIENvcHkgYSBzdHJpbmcgZnJvbSB0aGUgZGVidWdnZWUncyBtZW1vcnkgdG8gdGhlIGhvc3QncyAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCAKK2dldHN0cmluZyAoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIGZyb20sIGNoYXIgKnRvKQoreworICBkbyAKKyAgICB7CisgICAgICAqdG8gPSAoY2hhcikgQVJNdWxfUmVhZEJ5dGUgKHN0YXRlLCBmcm9tKyspOworICAgIH0gd2hpbGUgKCp0bysrICE9ICdcMCcpOworfQorCisjZW5kaWYgLyogTk9PUyAqLwpkaWZmIC0tZ2l0IGEvc2ltL2FybS9hcm1vcy5oIGIvc2ltL2FybS9hcm1vcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMWYwNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vYXJtL2FybW9zLmgKQEAgLTAsMCArMSw5NSBAQAorLyogIGFybW9zLmggLS0gQVJNdWxhdG9yIE9TIGRlZmluaXRpb25zOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIGluaXRpYWwgbGF5b3V0IG9mIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQUREUlNVUEVSU1RBQ0sgICAgICAgICAgMHg4MDBMICAgLyogc3VwZXJ2aXNvciBzdGFjayBzcGFjZSAqLworI2RlZmluZSBBRERSVVNFUlNUQUNLICAgICAgICAgICAweDgwMDAwTCAvKiBkZWZhdWx0IHVzZXIgc3RhY2sgc3RhcnQgKi8KKyNkZWZpbmUgQUREUlNPRlRWRUNUT1JTICAgICAgICAgMHg4NDBMICAgLyogc29mdCB2ZWN0b3JzIGFyZSBoZXJlICovCisjZGVmaW5lIEFERFJDTURMSU5FICAgICAgICAgICAgIDB4ZjAwTCAgIC8qIGNvbW1hbmQgbGluZSBpcyBoZXJlIGFmdGVyIGEgU1dJIEdldEVudiAqLworI2RlZmluZSBBRERSU09GSEFORExFUlMgICAgICAgICAweGFkMEwgICAvKiBhZGRyZXNzIGFuZCB3b3Jrc3BhY2UgZm9yIGluc3RhbGxlZCBoYW5kbGVycyAqLworI2RlZmluZSBTT0ZUVkVDVE9SQ09ERSAgICAgICAgICAweGI4MEwgICAvKiBkZWZhdWx0IGhhbmRsZXJzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXSSBudW1iZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTV0lfV3JpdGVDICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgU1dJX1dyaXRlMCAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIFNXSV9SZWFkQyAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBTV0lfQ0xJICAgICAgICAgICAgICAgICAgICAweDUKKyNkZWZpbmUgU1dJX0dldEVudiAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBTV0lfRXhpdCAgICAgICAgICAgICAgICAgICAweDExCisjZGVmaW5lIFNXSV9FbnRlck9TICAgICAgICAgICAgICAgIDB4MTYKKworI2RlZmluZSBTV0lfR2V0RXJybm8gICAgICAgICAgICAgICAweDYwCisjZGVmaW5lIFNXSV9DbG9jayAgICAgICAgICAgICAgICAgIDB4NjEKKyNkZWZpbmUgU1dJX1RpbWUgICAgICAgICAgICAgICAgICAgMHg2MworI2RlZmluZSBTV0lfUmVtb3ZlICAgICAgICAgICAgICAgICAweDY0CisjZGVmaW5lIFNXSV9SZW5hbWUgICAgICAgICAgICAgICAgIDB4NjUKKyNkZWZpbmUgU1dJX09wZW4gICAgICAgICAgICAgICAgICAgMHg2NgorCisjZGVmaW5lIFNXSV9DbG9zZSAgICAgICAgICAgICAgICAgIDB4NjgKKyNkZWZpbmUgU1dJX1dyaXRlICAgICAgICAgICAgICAgICAgMHg2OQorI2RlZmluZSBTV0lfUmVhZCAgICAgICAgICAgICAgICAgICAweDZhCisjZGVmaW5lIFNXSV9TZWVrICAgICAgICAgICAgICAgICAgIDB4NmIKKyNkZWZpbmUgU1dJX0ZsZW4gICAgICAgICAgICAgICAgICAgMHg2YworCisjZGVmaW5lIFNXSV9Jc1RUWSAgICAgICAgICAgICAgICAgIDB4NmUKKyNkZWZpbmUgU1dJX1RtcE5hbSAgICAgICAgICAgICAgICAgMHg2ZgorI2RlZmluZSBTV0lfSW5zdGFsbEhhbmRsZXIgICAgICAgICAweDcwCisjZGVmaW5lIFNXSV9HZW5lcmF0ZUVycm9yICAgICAgICAgIDB4NzEKKworI2RlZmluZSBTV0lfQnJlYWtwb2ludCAgICAgICAgICAgICAweDE4MDAwMCAvKiBzZWUgZ2RiJ3MgdG0tYXJtLmggKi8KKworI2RlZmluZSBBbmdlbFNXSV9BUk0JCSAgIDB4MTIzNDU2CisjZGVmaW5lIEFuZ2VsU1dJX1RodW1iCQkgICAweEFCCisKKy8qIFRoZSByZWFzb24gY29kZXM6ICovCisjZGVmaW5lIEFuZ2VsU1dJX1JlYXNvbl9PcGVuCQkoMHgwMSkKKyNkZWZpbmUgQW5nZWxTV0lfUmVhc29uX0Nsb3NlCQkoMHgwMikKKyNkZWZpbmUgQW5nZWxTV0lfUmVhc29uX1dyaXRlQwkJKDB4MDMpCisjZGVmaW5lIEFuZ2VsU1dJX1JlYXNvbl9Xcml0ZTAJCSgweDA0KQorI2RlZmluZSBBbmdlbFNXSV9SZWFzb25fV3JpdGUJCSgweDA1KQorI2RlZmluZSBBbmdlbFNXSV9SZWFzb25fUmVhZAkJKDB4MDYpCisjZGVmaW5lIEFuZ2VsU1dJX1JlYXNvbl9SZWFkQwkJKDB4MDcpCisjZGVmaW5lIEFuZ2VsU1dJX1JlYXNvbl9Jc1RUWQkJKDB4MDkpCisjZGVmaW5lIEFuZ2VsU1dJX1JlYXNvbl9TZWVrCQkoMHgwQSkKKyNkZWZpbmUgQW5nZWxTV0lfUmVhc29uX0ZMZW4JCSgweDBDKQorI2RlZmluZSBBbmdlbFNXSV9SZWFzb25fVG1wTmFtCQkoMHgwRCkKKyNkZWZpbmUgQW5nZWxTV0lfUmVhc29uX1JlbW92ZQkJKDB4MEUpCisjZGVmaW5lIEFuZ2VsU1dJX1JlYXNvbl9SZW5hbWUJCSgweDBGKQorI2RlZmluZSBBbmdlbFNXSV9SZWFzb25fQ2xvY2sJCSgweDEwKQorI2RlZmluZSBBbmdlbFNXSV9SZWFzb25fVGltZQkJKDB4MTEpCisjZGVmaW5lIEFuZ2VsU1dJX1JlYXNvbl9TeXN0ZW0JCSgweDEyKQorI2RlZmluZSBBbmdlbFNXSV9SZWFzb25fRXJybm8JCSgweDEzKQorI2RlZmluZSBBbmdlbFNXSV9SZWFzb25fR2V0Q21kTGluZSAJKDB4MTUpCisjZGVmaW5lIEFuZ2VsU1dJX1JlYXNvbl9IZWFwSW5mbyAJKDB4MTYpCisjZGVmaW5lIEFuZ2VsU1dJX1JlYXNvbl9FbnRlclNWQyAJKDB4MTcpCisjZGVmaW5lIEFuZ2VsU1dJX1JlYXNvbl9SZXBvcnRFeGNlcHRpb24gKDB4MTgpCisjZGVmaW5lIEFEUF9TdG9wcGVkX0FwcGxpY2F0aW9uRXhpdCAJKCgyIDw8IDE2KSArIDM4KQorI2RlZmluZSBBRFBfU3RvcHBlZF9SdW5UaW1lRXJyb3IgCSgoMiA8PCAxNikgKyAzNCkKKworI2RlZmluZSBGUEVTVEFSVCAweDIwMDBMCisjZGVmaW5lIEZQRUVORCAweDgwMDBMCisjZGVmaW5lIEZQRU9MRFZFQ1QgRlBFU1RBUlQgKyAweDEwMEwgKyA4TCAqIDE2TCArIDRMIC8qIHN0YWNrICsgOCByZWdzICsgZnBzciAqLworI2RlZmluZSBGUEVORVdWRUNUKGFkZHIpIDB4ZWEwMDAwMDBMICsgKChhZGRyKSA+PiAyKSAtIDNMIC8qIGJyYW5jaCBmcm9tIDQgdG8gMHgyNDAwICovCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGZwZWNvZGVbXSA7CitleHRlcm4gdW5zaWduZWQgbG9uZyBmcGVzaXplIDsKZGlmZiAtLWdpdCBhL3NpbS9hcm0vYXJtcmRpLmMgYi9zaW0vYXJtL2FybXJkaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OGM3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vYXJtL2FybXJkaS5jCkBAIC0wLDAgKzEsMTA0NCBAQAorLyogIGFybXJkaS5jIC0tIEFSTXVsYXRvciBSREkgaW50ZXJmYWNlOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJhcm1kZWZzLmgiCisjaW5jbHVkZSAiYXJtZW11LmgiCisjaW5jbHVkZSAiYXJtb3MuaCIKKyNpbmNsdWRlICJkYmdfY3AuaCIKKyNpbmNsdWRlICJkYmdfY29uZi5oIgorI2luY2x1ZGUgImRiZ19yZGkuaCIKKyNpbmNsdWRlICJkYmdfaGlmLmgiCisjaW5jbHVkZSAiY29tbXVuaWNhdGUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFdhdGNoX0FueVJlYWQgKFJESVdhdGNoX0J5dGVSZWFkK1JESVdhdGNoX0hhbGZSZWFkK1JESVdhdGNoX1dvcmRSZWFkKQorI2RlZmluZSBXYXRjaF9BbnlXcml0ZSAoUkRJV2F0Y2hfQnl0ZVdyaXRlK1JESVdhdGNoX0hhbGZXcml0ZStSRElXYXRjaF9Xb3JkV3JpdGUpCisKK3N0YXRpYyB1bnNpZ25lZCBGUFJlZ3NBZGRyIDsgLyogbGFzdCBrbm93biBhZGRyZXNzIG9mIEZQRSByZWdzICovCisjZGVmaW5lIEZQRVNUQVJUIDB4MjAwMEwKKyNkZWZpbmUgRlBFRU5EICAgMHg4MDAwTAorCisjZGVmaW5lIElHTk9SRShkKSAoZCA9IGQpCisjaWZkZWYgUkRJX1ZFUkJPU0UKKyNkZWZpbmUgVHJhY2VQcmludChzKSBcCisgaWYgKHJkaV9sb2cgJiAxKSBBUk11bF9EZWJ1Z1ByaW50IHMKKyNlbHNlCisjZGVmaW5lIFRyYWNlUHJpbnQocykKKyNlbmRpZgorCitzdGF0aWMgQVJNdWxfU3RhdGUgKnN0YXRlID0gTlVMTCA7CitzdGF0aWMgdW5zaWduZWQgQnJlYWtzU2V0IDsgLyogVGhlIG51bWJlciBvZiBicmVha3BvaW50cyBzZXQgKi8KKworc3RhdGljIGludCByZGlfbG9nID0gMCA7IC8qIGRlYnVnZ2luZyAgPyAqLworCisjZGVmaW5lIExPV0VTVF9SRElfTEVWRUwgMAorI2RlZmluZSBISUdIRVNUX1JESV9MRVZFTCAxCitzdGF0aWMgaW50IE1ZcmRpX2xldmVsID0gTE9XRVNUX1JESV9MRVZFTDsKKwordHlwZWRlZiBzdHJ1Y3QgQnJlYWtOb2RlIEJyZWFrTm9kZTsKK3R5cGVkZWYgc3RydWN0IFdhdGNoTm9kZSBXYXRjaE5vZGU7CisKK3N0cnVjdCBCcmVha05vZGUgeyAvKiBBIGJyZWFrcG9pbnQgbGlzdCBub2RlICovCisgICBCcmVha05vZGUgKm5leHQgOworICAgQVJNd29yZCBhZGRyZXNzIDsgLyogVGhlIGFkZHJlc3Mgb2YgdGhpcyBicmVha3BvaW50ICovCisgICB1bnNpZ25lZCB0eXBlIDsgLyogVGhlIHR5cGUgb2YgY29tcGFyaXNvbiAqLworICAgQVJNd29yZCBib3VuZCA7IC8qIFRoZSBvdGhlciBhZGRyZXNzIGZvciBhIHJhbmdlICovCisgICBBUk13b3JkIGluc3Q7CisgICB9OworCitzdHJ1Y3QgV2F0Y2hOb2RlIHsgLyogQSB3YXRjaHBvaW50IGxpc3Qgbm9kZSAqLworICAgV2F0Y2hOb2RlICpuZXh0IDsKKyAgIEFSTXdvcmQgYWRkcmVzcyA7IC8qIFRoZSBhZGRyZXNzIG9mIHRoaXMgd2F0Y2hwb2ludCAqLworICAgdW5zaWduZWQgdHlwZSA7IC8qIFRoZSB0eXBlIG9mIGNvbXBhcmlzb24gKi8KKyAgIHVuc2lnbmVkIGRhdGF0eXBlIDsgLyogVGhlIHR5cGUgb2YgYWNjZXNzIHRvIHdhdGNoIGZvciAqLworICAgQVJNd29yZCBib3VuZCA7IC8qIFRoZSBvdGhlciBhZGRyZXNzIGZvciBhIHJhbmdlICovCisgICB9OworCitCcmVha05vZGUgKkJyZWFrTGlzdCA9IE5VTEwgOworV2F0Y2hOb2RlICpXYXRjaExpc3QgPSBOVUxMIDsKKwordm9pZCBBUk11bF9EZWJ1Z1ByaW50X2koY29uc3QgRGJnX0hvc3Rvc0ludGVyZmFjZSAqaG9zdGlmLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgIGhvc3RpZi0+ZGJncHJpbnQoaG9zdGlmLT5kYmdhcmcsIGZvcm1hdCwgYXApOworICB2YV9lbmQoYXApOworfQorCit2b2lkIEFSTXVsX0RlYnVnUHJpbnQoQVJNdWxfU3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgIGlmKCEocmRpX2xvZyAmIDgpKQorICAgIHN0YXRlLT5ob3N0aWYtPmRiZ3ByaW50KHN0YXRlLT5ob3N0aWYtPmRiZ2FyZywgZm9ybWF0LCBhcCk7CisgIHZhX2VuZChhcCk7Cit9CisKKyNkZWZpbmUgQ09OU09MRV9QUklOVF9NQVhfTEVOIDEyOAorCit2b2lkIEFSTXVsX0NvbnNvbGVQcmludChBUk11bF9TdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFwOworICBpbnQgY2g7CisgIGNoYXIgKnN0ciwgYnVmW0NPTlNPTEVfUFJJTlRfTUFYX0xFTl07CisgIGludCBpLCBqOworICBBUk13b3JkIGp1bms7CisKKyAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgIHZzcHJpbnRmKGJ1ZiwgZm9ybWF0LCBhcCk7CisKKyAgZm9yIChpID0gMDsgYnVmW2ldIDtpKyspOyAgLyogVGhlIHN0cmluZyBpcyBpIGNoYXJzIGxvbmcgKi8KKyAgCisgIHN0ciA9IGJ1ZjsKKyAgd2hpbGUgKGkgPj0gMzIpIHsKKyAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCBSRFBfT1NPcCk7IAorICAgIE1Zd3JpdGVfd29yZChraWRtdW1bMV0sIFNXSV9Xcml0ZTApOworICAgIE1Zd3JpdGVfY2hhcihraWRtdW1bMV0sIE9TX1NlbmRTdHJpbmcpOworICAgIE1Zd3JpdGVfY2hhcihraWRtdW1bMV0sIDMyKTsgLyogU2VuZCBzdHJpbmcgMzJieXRlcyBhdCBhIHRpbWUgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgMzI7IGorKywgc3RyKyspCisgICAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCAqc3RyKTsKKyAgICB3YWl0X2Zvcl9vc3JlcGx5KCZqdW5rKTsKKyAgICBpIC09IDMyOworICB9CisgIAorICBpZiAoaSA+IDApIHsKKyAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCBSRFBfT1NPcCk7CisgICAgTVl3cml0ZV93b3JkKGtpZG11bVsxXSwgU1dJX1dyaXRlMCk7CisgICAgTVl3cml0ZV9jaGFyKGtpZG11bVsxXSwgT1NfU2VuZFN0cmluZyk7CisgICAgTVl3cml0ZV9jaGFyKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOyAvKiBTZW5kIHJlbWFpbmRlciBvZiBzdHJpbmcgICovCisgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKywgc3RyKyspCisgICAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCAqc3RyKTsKKyAgICB3YWl0X2Zvcl9vc3JlcGx5KCZqdW5rKTsKKyAgfQorCisgIHZhX2VuZCAoYXApOworICByZXR1cm47CisKKy8qICAgc3RyID0gYnVmOyAqLworLyogICB3aGlsZSAoKGNoPSpzdHIrKykgIT0gMCkgKi8KKy8qICAgICBzdGF0ZS0+aG9zdGlmLT53cml0ZWMoc3RhdGUtPmhvc3RpZi0+aG9zdG9zYXJnLCBjaCk7ICovCit9CisKK3ZvaWQgQVJNdWxfRGVidWdQYXVzZShBUk11bF9TdGF0ZSAqc3RhdGUpCit7CisgIGlmKCEocmRpX2xvZyAmIDgpKQorICBzdGF0ZS0+aG9zdGlmLT5kYmdwYXVzZShzdGF0ZS0+aG9zdGlmLT5kYmdhcmcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJESV9vcGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIEluaXRGYWlsKGludCBleGl0Y29kZSwgY2hhciBjb25zdCAqd2hpY2gpIHsKKyAgQVJNdWxfQ29uc29sZVByaW50KHN0YXRlLCAiJXMgaW50ZXJmYWNlIGZhaWxlZCB0byBpbml0aWFsaXNlLiBFeGl0aW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoKTsKKyAgZXhpdChleGl0Y29kZSk7Cit9CisKK3N0YXRpYyB2b2lkIFJESUluaXQodW5zaWduZWQgdHlwZSkKK3tpZiAodHlwZSA9PSAwKSB7IC8qIGNvbGQgc3RhcnQgKi8KKyAgICBzdGF0ZS0+Q2FsbERlYnVnID0gc3RhdGUtPk1lbVJlYWREZWJ1ZyA9IHN0YXRlLT5NZW1Xcml0ZURlYnVnID0gMCA7CisgICAgQnJlYWtzU2V0ID0gMCA7CisgICAgfQorIH0KKworI2RlZmluZSBVTktOT1dOUFJPQyAwCisKK3R5cGVkZWYgc3RydWN0IHsgY2hhciBuYW1lWzE2XTsgdW5zaWduZWQgdmFsOyB9IFByb2Nlc3NvcjsKKworUHJvY2Vzc29yIGNvbnN0IHBfYXJtMiAgID0geyJBUk0yIiwgICAgQVJNMn07CitQcm9jZXNzb3IgY29uc3QgcF9hcm0yYXMgPSB7IkFSTTJBUyIsICBBUk0yYXN9OworUHJvY2Vzc29yIGNvbnN0IHBfYXJtNjEgID0geyJBUk02MSIsICAgQVJNNjF9OworUHJvY2Vzc29yIGNvbnN0IHBfYXJtMyAgID0geyJBUk0zIiwgICAgQVJNM307CitQcm9jZXNzb3IgY29uc3QgcF9hcm02ICAgPSB7IkFSTTYiLCAgICBBUk02fTsKK1Byb2Nlc3NvciBjb25zdCBwX2FybTYwICA9IHsiQVJNNjAiLCAgIEFSTTYwfTsKK1Byb2Nlc3NvciBjb25zdCBwX2FybTYwMCA9IHsiQVJNNjAwIiwgIEFSTTYwMH07CitQcm9jZXNzb3IgY29uc3QgcF9hcm02MTAgPSB7IkFSTTYxMCIsICBBUk02MTB9OworUHJvY2Vzc29yIGNvbnN0IHBfYXJtNjIwID0geyJBUk02MjAiLCAgQVJNNjIwfTsKK1Byb2Nlc3NvciBjb25zdCBwX3Vua25vd249IHsiIiwgICAgICBVTktOT1dOUFJPQ307CisKK1Byb2Nlc3NvciBjb25zdCAqY29uc3QgcHJvY2Vzc29yc1tdID0geworICAmcF9hcm02LCAgLyogZGVmYXVsdDogbXVzdCBjb21lIGZpcnN0ICovCisgICZwX2FybTIsCisgICZwX2FybTJhcywKKyAgJnBfYXJtNjEsCisgICZwX2FybTMsCisgICZwX2FybTYwLAorICAmcF9hcm02MDAsCisgICZwX2FybTYxMCwKKyAgJnBfYXJtNjIwLAorICAmcF91bmtub3duCit9OworCit0eXBlZGVmIHN0cnVjdCBQcm9jZXNzb3JDb25maWcgUHJvY2Vzc29yQ29uZmlnOworc3RydWN0IFByb2Nlc3NvckNvbmZpZyB7CisgIGxvbmcgaWRbMl07CisgIFByb2Nlc3NvckNvbmZpZyBjb25zdCAqc2VsZjsKKyAgbG9uZyBjb3VudDsKKyAgUHJvY2Vzc29yIGNvbnN0ICogY29uc3QgKnByb2Nlc3NvcnM7Cit9OworCitQcm9jZXNzb3JDb25maWcgY29uc3QgcHJvY2Vzc29yY29uZmlnID0geworICB7ICgoKCgoKGxvbmcpJ3gnIDw8IDgpIHwgJyAnKSA8PCA4KSB8ICdjJykgPDwgOCkgfCAncCcsCisgICAgKCgoKCgobG9uZykndScgPDwgOCkgfCAncycpIDw8IDgpIHwgJyAnKSA8PCA4KSB8ICd4JworICB9LAorICAmcHJvY2Vzc29yY29uZmlnLAorICAxNiwKKyAgcHJvY2Vzc29ycworfTsKKworc3RhdGljIGludCBSRElfb3Blbih1bnNpZ25lZCB0eXBlLCBjb25zdCBEYmdfQ29uZmlnQmxvY2sgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRGJnX0hvc3Rvc0ludGVyZmFjZSAqaG9zdGlmLAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgRGJnX01DU3RhdGUgKmRiZ19zdGF0ZSkKKy8qIEluaXRpYWxpc2UgZXZlcnl0aGluZyAqLwore2ludCB2aXJnaW4gPSAoc3RhdGUgPT0gTlVMTCk7CisgSUdOT1JFKGRiZ19zdGF0ZSk7CisKKyNpZmRlZiBSRElfVkVSQk9TRQorIGlmIChyZGlfbG9nICYgMSkgeworICAgIGlmICh2aXJnaW4pCisgICAgICAgQVJNdWxfRGVidWdQcmludF9pKGhvc3RpZiwgIlJESV9vcGVuOiB0eXBlID0gJWRcbiIsdHlwZSkgOworICAgIGVsc2UKKyAgICAgICBBUk11bF9EZWJ1Z1ByaW50KHN0YXRlLCAiUkRJX29wZW46IHR5cGUgPSAlZFxuIix0eXBlKSA7CisgfQorI2VuZGlmCisKKyBpZiAodHlwZSAmIDEpIHsgLyogV2FybSBzdGFydCAqLworICAgIEFSTXVsX1Jlc2V0KHN0YXRlKSA7CisgICAgUkRJSW5pdCgxKSA7CisgICAgfQorIGVsc2UgeworICAgaWYgKHZpcmdpbikgeworICAgICBBUk11bF9FbXVsYXRlSW5pdCgpOworICAgICBzdGF0ZSA9IEFSTXVsX05ld1N0YXRlKCk7CisgICAgIHN0YXRlLT5ob3N0aWYgPSBob3N0aWY7CisgICAgIHsgaW50IHJlcSA9IGNvbmZpZy0+cHJvY2Vzc29yOworICAgICAgIHVuc2lnbmVkIHByb2Nlc3NvciA9IHByb2Nlc3NvcnNbcmVxXS0+dmFsOworICAgICAgIEFSTXVsX1NlbGVjdFByb2Nlc3NvcihzdGF0ZSwgcHJvY2Vzc29yKTsKKyAgICAgICBBUk11bF9SZXNldChzdGF0ZSk7CisgICAgICAgQVJNdWxfQ29uc29sZVByaW50KHN0YXRlLCAiQVJNdWxhdG9yIFYxLjUwLCAlcyIsIHByb2Nlc3NvcnNbcmVxXS0+bmFtZSk7CisgICAgIH0KKyAgICAgaWYgKEFSTXVsX01lbW9yeUluaXQoc3RhdGUsY29uZmlnLT5tZW1vcnlzaXplKSA9PSBGQUxTRSkKKyAgICAgICBJbml0RmFpbCgxLCAiTWVtb3J5Iik7CisgICAgIGlmIChjb25maWctPmJ5dGVzZXggIT0gUkRJU2V4X0RvbnRDYXJlKQorICAgICAgIHN0YXRlLT5iaWdlbmRTaWcgPSBjb25maWctPmJ5dGVzZXggOworICAgICBpZiAoQVJNdWxfQ29Qcm9Jbml0KHN0YXRlKSA9PSBGQUxTRSkKKyAgICAgICBJbml0RmFpbCgyLCAiQ28tUHJvY2Vzc29yIik7CisgICAgIGlmIChBUk11bF9PU0luaXQoc3RhdGUpID09IEZBTFNFKQorICAgICAgIEluaXRGYWlsKDMsICJPcGVyYXRpbmcgU3lzdGVtIik7CisgICB9CisgICBBUk11bF9SZXNldChzdGF0ZSkgOworICAgUkRJSW5pdCgwKSA7CisgICB9CisgIGlmICh0eXBlICYgMikgeyAvKiBSZXNldCB0aGUgY29tbXMgbGluayAqLworICAgIC8qIHdoYXQgY29tbXMgbGluayA/ICovCisgIH0KKyAgaWYgKHZpcmdpbiAmJiAodHlwZSAmIDEpID09IDApIC8qIENvbGQgc3RhcnQgKi8KKyAgICBBUk11bF9Db25zb2xlUHJpbnQoc3RhdGUsICIsICVzIGVuZGlhbi5cbiIsCisJCSAgICAgICBzdGF0ZS0+YmlnZW5kU2lnID8gIkJpZyIgOiAiTGl0dGxlIik7CisKKyAgaWYgKGNvbmZpZy0+Ynl0ZXNleCA9PSBSRElTZXhfRG9udENhcmUpCisgICAgcmV0dXJuKHN0YXRlLT5iaWdlbmRTaWcgPyBSRElFcnJvcl9CaWdFbmRpYW4gOiBSRElFcnJvcl9MaXR0bGVFbmRpYW4pOworICBlbHNlCisgICAgcmV0dXJuKFJESUVycm9yX05vRXJyb3IpIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJESV9jbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IFJESV9jbG9zZSh2b2lkKQoreworIFRyYWNlUHJpbnQoKHN0YXRlLCAiUkRJX2Nsb3NlXG4iKSk7CisgQVJNdWxfT1NFeGl0KHN0YXRlKSA7CisgQVJNdWxfQ29Qcm9FeGl0KHN0YXRlKSA7CisgQVJNdWxfTWVtb3J5RXhpdChzdGF0ZSkgOworIHJldHVybihSRElFcnJvcl9Ob0Vycm9yKSA7CisgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJESV9yZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgUkRJX3JlYWQoQVJNd29yZCBzb3VyY2UsIHZvaWQgKmRlc3QsIHVuc2lnbmVkICpuYnl0ZXMpCit7dW5zaWduZWQgaSA7CisgY2hhciAqbWVtcHRyID0gKGNoYXIgKilkZXN0IDsKKworIFRyYWNlUHJpbnQoKHN0YXRlLCAiUkRJX3JlYWQ6IHNvdXJjZT0lLjhseCBkZXN0PSVwIG5ieXRlcz0lLjh4XG4iLAorICAgICAgICAgICAgIHNvdXJjZSwgZGVzdCwgKm5ieXRlcykpOworCisgZm9yIChpPTAgOyBpIDwgKm5ieXRlcyA7IGkrKykKKyAgICAqbWVtcHRyKysgPSAoY2hhcilBUk11bF9SZWFkQnl0ZShzdGF0ZSxzb3VyY2UrKykgOworIGlmIChzdGF0ZS0+YWJvcnRTaWcpIHsKKyAgICBzdGF0ZS0+YWJvcnRTaWcgPSBMT1cgOworICAgIHJldHVybihSRElFcnJvcl9EYXRhQWJvcnQpIDsKKyAgICB9CisgcmV0dXJuKFJESUVycm9yX05vRXJyb3IpIDsKKyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJESV93cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBSRElfd3JpdGUoY29uc3Qgdm9pZCAqc291cmNlLCBBUk13b3JkIGRlc3QsIHVuc2lnbmVkICpuYnl0ZXMpCit7dW5zaWduZWQgaSA7CisgY2hhciAqbWVtcHRyID0gKGNoYXIgKilzb3VyY2UgOworCisgVHJhY2VQcmludCgoc3RhdGUsICJSRElfd3JpdGU6IHNvdXJjZT0lcCBkZXN0PSUuOGx4IG5ieXRlcz0lLjh4XG4iLAorICAgICAgICAgICAgc291cmNlLCBkZXN0LCAqbmJ5dGVzKSk7CisKKyBmb3IgKGk9MCA7IGkgPCAqbmJ5dGVzIDsgaSsrKQorICAgIEFSTXVsX1dyaXRlQnl0ZShzdGF0ZSwoQVJNd29yZClkZXN0KyssKEFSTXdvcmQpKm1lbXB0cisrKSA7CisKKyBpZiAoc3RhdGUtPmFib3J0U2lnKSB7CisgICAgc3RhdGUtPmFib3J0U2lnID0gTE9XIDsKKyAgICByZXR1cm4oUkRJRXJyb3JfRGF0YUFib3J0KSA7CisgICAgfQorIHJldHVybihSRElFcnJvcl9Ob0Vycm9yKSA7CisgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRJX0NQVXJlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgUkRJX0NQVXJlYWQodW5zaWduZWQgbW9kZSwgdW5zaWduZWQgbG9uZyBtYXNrLCBBUk13b3JkIGJ1ZmZlcltdKQore3Vuc2lnbmVkIGkgLCB1cHRvIDsKKworIGlmIChtb2RlID09IFJESU1vZGVfQ3VycikKKyAgICBtb2RlID0gKHVuc2lnbmVkKShBUk11bF9HZXRDUFNSKHN0YXRlKSAmIE1PREVCSVRTKSA7CisKKyBmb3IgKHVwdG8gPSAwLCBpID0gMCA7IGkgPCAxNSA7IGkrKykKKyAgICBpZiAobWFzayAmICgxTCA8PCBpKSl7CisgICAgICAgYnVmZmVyW3VwdG8rK10gPSBBUk11bF9HZXRSZWcoc3RhdGUsbW9kZSxpKSA7CisgICAgfQorCisgaWYgKG1hc2sgJiBSRElSZWdfUjE1KSB7CisgICAgYnVmZmVyW3VwdG8rK10gPSBBUk11bF9HZXRSMTUoc3RhdGUpIDsKKyB9CisKKyBpZiAobWFzayAmIFJESVJlZ19QQykgeworICAgIGJ1ZmZlclt1cHRvKytdID0gQVJNdWxfR2V0UEMoc3RhdGUpIDsKKyB9CisKKyBpZiAobWFzayAmIFJESVJlZ19DUFNSKQorICAgIGJ1ZmZlclt1cHRvKytdID0gQVJNdWxfR2V0Q1BTUihzdGF0ZSkgOworCisgaWYgKG1hc2sgJiBSRElSZWdfU1BTUikKKyAgICBidWZmZXJbdXB0bysrXSA9IEFSTXVsX0dldFNQU1Ioc3RhdGUsbW9kZSkgOworCisgVHJhY2VQcmludCgoc3RhdGUsICJSRElfQ1BVcmVhZDogbW9kZT0lLjh4IG1hc2s9JS44bHgiLCBtb2RlLCBtYXNrKSk7CisjaWZkZWYgUkRJX1ZFUkJPU0UKKyBpZiAocmRpX2xvZyAmIDEpIHsKKyAgICBmb3IgKHVwdG8gPSAwLCBpID0gMCA7IGkgPD0gMjAgOyBpKyspCisgICAgICAgaWYgKG1hc2sgJiAoMUwgPDwgaSkpIHsKKyAgICAgICAgICBBUk11bF9EZWJ1Z1ByaW50KHN0YXRlLCAiJWMlLjhseCIsdXB0byU0PT0wPydcbic6JyAnLGJ1ZmZlclt1cHRvXSkgOworICAgICAgICAgIHVwdG8rKyA7CisgICAgICAgICAgfQorICAgIEFSTXVsX0RlYnVnUHJpbnQoc3RhdGUsICJcbiIpIDsKKyAgICB9CisjZW5kaWYKKworIHJldHVybihSRElFcnJvcl9Ob0Vycm9yKSA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJESV9DUFV3cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBSRElfQ1BVd3JpdGUodW5zaWduZWQgbW9kZSwgdW5zaWduZWQgbG9uZyBtYXNrLCBBUk13b3JkIGNvbnN0IGJ1ZmZlcltdKQore2ludCBpLCB1cHRvOworCisKKyBUcmFjZVByaW50KChzdGF0ZSwgIlJESV9DUFV3cml0ZTogbW9kZT0lLjh4IG1hc2s9JS44bHgiLCBtb2RlLCBtYXNrKSk7CisjaWZkZWYgUkRJX1ZFUkJPU0UKKyBpZiAocmRpX2xvZyAmIDEpIHsKKyAgICBmb3IgKHVwdG8gPSAwLCBpID0gMCA7IGkgPD0gMjAgOyBpKyspCisgICAgICAgaWYgKG1hc2sgJiAoMUwgPDwgaSkpIHsKKyAgICAgICAgICBBUk11bF9EZWJ1Z1ByaW50KHN0YXRlLCAiJWMlLjhseCIsdXB0byU0PT0wPydcbic6JyAnLGJ1ZmZlclt1cHRvXSkgOworICAgICAgICAgIHVwdG8rKyA7CisgICAgICAgICAgfQorICAgIEFSTXVsX0RlYnVnUHJpbnQoc3RhdGUsICJcbiIpIDsKKyAgICB9CisjZW5kaWYKKworIGlmIChtb2RlID09IFJESU1vZGVfQ3VycikKKyAgICBtb2RlID0gKHVuc2lnbmVkKShBUk11bF9HZXRDUFNSKHN0YXRlKSAmIE1PREVCSVRTKSA7CisKKyBmb3IgKHVwdG8gPSAwLCBpID0gMCA7IGkgPCAxNSA7IGkrKykKKyAgICBpZiAobWFzayAmICgxTCA8PCBpKSkKKyAgICAgICBBUk11bF9TZXRSZWcoc3RhdGUsbW9kZSxpLGJ1ZmZlclt1cHRvKytdKSA7CisKKyBpZiAobWFzayAmIFJESVJlZ19SMTUpCisgICAgQVJNdWxfU2V0UjE1KHN0YXRlLGJ1ZmZlclt1cHRvKytdKSA7CisKKyBpZiAobWFzayAmIFJESVJlZ19QQykgeworCisgICBBUk11bF9TZXRQQyhzdGF0ZSxidWZmZXJbdXB0bysrXSkgOworIH0KKyBpZiAobWFzayAmIFJESVJlZ19DUFNSKQorICAgIEFSTXVsX1NldENQU1Ioc3RhdGUsYnVmZmVyW3VwdG8rK10pIDsKKworIGlmIChtYXNrICYgUkRJUmVnX1NQU1IpCisgICAgQVJNdWxfU2V0U1BTUihzdGF0ZSxtb2RlLGJ1ZmZlclt1cHRvKytdKSA7CisKKyByZXR1cm4oUkRJRXJyb3JfTm9FcnJvcikgOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRJX0NQcmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgUkRJX0NQcmVhZCh1bnNpZ25lZCBDUG51bSwgdW5zaWduZWQgbG9uZyBtYXNrLCBBUk13b3JkIGJ1ZmZlcltdKQore0FSTXdvcmQgZnByZWdzYWRkciwgd29yZFs0XSA7CisgCisgdW5zaWduZWQgciwgdyA7CisgdW5zaWduZWQgdXB0byA7CisKKyBpZiAoQ1BudW0gIT0gMSAmJiBDUG51bSAhPSAyKSB7CisgICAgdW5zaWduZWQgY2hhciBjb25zdCAqcm1hcCA9IHN0YXRlLT5DUFJlZ1dvcmRzW0NQbnVtXTsKKyAgICBpZiAocm1hcCA9PSBOVUxMKQorICAgICAgIHJldHVybihSRElFcnJvcl9Vbmtub3duQ29Qcm8pIDsKKyAgICBmb3IgKHVwdG8gPSAwLCByID0gMCA7IHIgPCBybWFwWy0xXSA7IHIrKykKKyAgICAgICBpZiAobWFzayAmICgxTCA8PCByKSkgeworICAgICAgICAgICh2b2lkKXN0YXRlLT5DUFJlYWRbQ1BudW1dKHN0YXRlLCByLCAmYnVmZmVyW3VwdG9dKTsKKyAgICAgICAgICB1cHRvICs9IHJtYXBbcl07CisgICAgICAgfQorICAgIFRyYWNlUHJpbnQoKHN0YXRlLCAiUkRJX0NQcmVhZDogQ1BudW09JWQgbWFzaz0lLjhseCIsIENQbnVtLCBtYXNrKSk7CisjaWZkZWYgUkRJX1ZFUkJPU0UKKyAgICBpZiAocmRpX2xvZyAmIDEpIHsKKyAgICAgICB3ID0gMDsKKyAgICAgICBmb3IgKHVwdG8gPSAwLCByID0gMDsgciA8IHJtYXBbLTFdOyByKyspCisgICAgICAgICAgaWYgKG1hc2sgJiAoMUwgPDwgcikpIHsKKyAgICAgICAgICAgICBpbnQgd29yZHMgPSBybWFwW3JdOworICAgICAgICAgICAgIEFSTXVsX0RlYnVnUHJpbnQoc3RhdGUsICIlYyUyZCIsICh3ID49IDQgPyAodyA9IDAsICdcbicpIDogJyAnKSwgcik7CisgICAgICAgICAgICAgd2hpbGUgKC0td29yZHMgPj0gMCkgeworICAgICAgICAgICAgICAgIEFSTXVsX0RlYnVnUHJpbnQoc3RhdGUsICIgJS44bHgiLCBidWZmZXJbdXB0bysrXSk7CisgICAgICAgICAgICAgICAgdysrOworICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgQVJNdWxfRGVidWdQcmludChzdGF0ZSwgIlxuIikgOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOworIH0KKworI2lmZGVmIE5PRlBFCisgcmV0dXJuIFJESUVycm9yX1Vua25vd25Db1BybzsKKworI2Vsc2UKKyBpZiAoRlBSZWdzQWRkciA9PSAwKSB7CisgICBmcHJlZ3NhZGRyID0gQVJNdWxfUmVhZFdvcmQoc3RhdGUsIDRMKSA7CisgICBpZiAoKGZwcmVnc2FkZHIgJiAweGZmODAwMDAwKSAhPSAweGVhMDAwMDAwKSAvKiBNdXN0IGJlIGEgZm9yd2FyZCBicmFuY2ggKi8KKyAgICAgcmV0dXJuIFJESUVycm9yX1Vua25vd25Db1BybzsKKyAgIGZwcmVnc2FkZHIgPSAoKGZwcmVnc2FkZHIgJiAweGZmZmZmZikgPDwgMikgKyA4IDsgLyogYWRkcmVzcyBpbiBfX2ZwX2RlY29kZSAtIDQgKi8KKyAgIGlmICgoZnByZWdzYWRkciA8IEZQRVNUQVJUKSB8fCAoZnByZWdzYWRkciA+PSBGUEVFTkQpKQorICAgICByZXR1cm4gUkRJRXJyb3JfVW5rbm93bkNvUHJvOworICAgZnByZWdzYWRkciA9IEFSTXVsX1JlYWRXb3JkKHN0YXRlLCBmcHJlZ3NhZGRyKSA7IC8qIHBvaW50ZXIgdG8gZnAgcmVnaXN0ZXJzICovCisgICBGUFJlZ3NBZGRyID0gZnByZWdzYWRkciA7CisgfQorIGVsc2UKKyAgZnByZWdzYWRkciA9IEZQUmVnc0FkZHIgOworCisgaWYgKGZwcmVnc2FkZHIgPT0gMCkgcmV0dXJuIFJESUVycm9yX1Vua25vd25Db1BybzsKKyBmb3IgKHVwdG8gPSAwLCByID0gMCA7IHIgPCA4IDsgcisrKQorICAgIGlmIChtYXNrICYgKDFMIDw8IHIpKSB7CisgICAgICAgZm9yICh3ID0gMCA7IHcgPCA0IDsgdysrKQorICAgICAgICAgIHdvcmRbd10gPSBBUk11bF9SZWFkV29yZChzdGF0ZSxmcHJlZ3NhZGRyICsgKEFSTXdvcmQpciAqIDE2ICsgKEFSTXdvcmQpdyAqIDQpIDsKKyAgICAgICBzd2l0Y2ggKChpbnQpKHdvcmRbM10gPj4gMjkpKSB7CisJIGNhc2UgMCA6CisJIGNhc2UgMiA6CisgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgY2FzZSA2IDogLyogaXRzIHVucGFja2VkLCBjb252ZXJ0IHRvIGV4dGVuZGVkICovCisgICAgICAgICAgIGJ1ZmZlclt1cHRvKytdID0gMiA7IC8qIG1hcmsgYXMgZXh0ZW5kZWQgKi8KKyAgICAgICAgICAgYnVmZmVyW3VwdG8rK10gPSAod29yZFszXSAmIDB4N2ZmZikgfCAod29yZFswXSAmIDB4ODAwMDAwMDApIDsgLyogZXhwIGFuZCBzaWduICovCisgICAgICAgICAgIGJ1ZmZlclt1cHRvKytdID0gd29yZFsxXSA7IC8qIG1hbnRpc3NhIDEgKi8KKyAgICAgICAgICAgYnVmZmVyW3VwdG8rK10gPSB3b3JkWzJdIDsgLyogbWFudGlzc2EgMiAqLworICAgICAgICAgICBicmVhayA7CisgICAgICAgICBjYXNlIDEgOiAvKiBwYWNrZWQgc2luZ2xlICovCisgICAgICAgICAgIGJ1ZmZlclt1cHRvKytdID0gMCA7IC8qIG1hcmsgYXMgc2luZ2xlICovCisgICAgICAgICAgIGJ1ZmZlclt1cHRvKytdID0gd29yZFswXSA7IC8qIHNpZ24sIGV4cCBhbmQgbWFudGlzc2EgKi8KKyAgICAgICAgICAgYnVmZmVyW3VwdG8rK10gPSB3b3JkWzFdIDsgLyogcGFkZGluZyAqLworICAgICAgICAgICBidWZmZXJbdXB0bysrXSA9IHdvcmRbMl0gOyAvKiBwYWRkaW5nICovCisgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgIGNhc2UgMyA6IC8qIHBhY2tlZCBkb3VibGUgKi8KKyAgICAgICAgICAgYnVmZmVyW3VwdG8rK10gPSAxIDsgLyogbWFyayBhcyBkb3VibGUgKi8KKyAgICAgICAgICAgYnVmZmVyW3VwdG8rK10gPSB3b3JkWzBdIDsgLyogc2lnbiwgZXhwIGFuZCBtYW50aXNzYTEgKi8KKyAgICAgICAgICAgYnVmZmVyW3VwdG8rK10gPSB3b3JkWzFdIDsgLyogbWFudGlzc2EgMiAqLworICAgICAgICAgICBidWZmZXJbdXB0bysrXSA9IHdvcmRbMl0gOyAvKiBwYWRkaW5nICovCisgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgIGNhc2UgNSA6IC8qIHBhY2tlZCBleHRlbmRlZCAqLworICAgICAgICAgICBidWZmZXJbdXB0bysrXSA9IDIgOyAvKiBtYXJrIGFzIGV4dGVuZGVkICovCisgICAgICAgICAgIGJ1ZmZlclt1cHRvKytdID0gd29yZFswXSA7IC8qIHNpZ24gYW5kIGV4cCAqLworICAgICAgICAgICBidWZmZXJbdXB0bysrXSA9IHdvcmRbMV0gOyAvKiBtYW50aXNzYSAxICovCisgICAgICAgICAgIGJ1ZmZlclt1cHRvKytdID0gd29yZFsyXSA7IC8qIG1hbnRpc3NhIDIgKi8KKyAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgY2FzZSA3IDogLyogcGFja2VkIGRlY2ltYWwgKi8KKyAgICAgICAgICAgYnVmZmVyW3VwdG8rK10gPSAzIDsgLyogbWFyayBhcyBwYWNrZWQgZGVjaW1hbCAqLworICAgICAgICAgICBidWZmZXJbdXB0bysrXSA9IHdvcmRbMF0gOyAvKiBzaWduLCBleHAgYW5kIG1hbnRpc3NhMSAqLworICAgICAgICAgICBidWZmZXJbdXB0bysrXSA9IHdvcmRbMV0gOyAvKiBtYW50aXNzYSAyICovCisgICAgICAgICAgIGJ1ZmZlclt1cHRvKytdID0gd29yZFsyXSA7IC8qIG1hbnRpc3NhIDMgKi8KKyAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgfQorICAgIH0KKyBpZiAobWFzayAmICgxTCA8PCByKSkKKyAgICBidWZmZXJbdXB0bysrXSA9IEFSTXVsX1JlYWRXb3JkKHN0YXRlLGZwcmVnc2FkZHIgKyAxMjgpIDsgLyogZnBzciAqLworIGlmIChtYXNrICYgKDFMIDw8IChyKzEpICkpCisgICAgYnVmZmVyW3VwdG8rK10gPSAwIDsgLyogZnBjciAqLworCisgVHJhY2VQcmludCgoc3RhdGUsICJSRElfQ1ByZWFkOiBDUG51bT0lZCBtYXNrPSUuOGx4XG4iLCBDUG51bSwgbWFzaykpOworI2lmZGVmIFJESV9WRVJCT1NFCisgaWYgKHJkaV9sb2cgJiAxKSB7CisgICAgZm9yICh1cHRvID0gMCwgciA9IDAgOyByIDwgOSA7IHIrKykKKyAgICAgICBpZiAobWFzayAmICgxTCA8PCByKSkgeworICAgICAgICAgIGlmIChyICE9IDgpIHsKKyAgICAgICAgICAgICBBUk11bF9EZWJ1Z1ByaW50KHN0YXRlLCAiJTA4bHggIixidWZmZXJbdXB0bysrXSkgOworICAgICAgICAgICAgIEFSTXVsX0RlYnVnUHJpbnQoc3RhdGUsICIlMDhseCAiLGJ1ZmZlclt1cHRvKytdKSA7CisgICAgICAgICAgICAgQVJNdWxfRGVidWdQcmludChzdGF0ZSwgIiUwOGx4ICIsYnVmZmVyW3VwdG8rK10pIDsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgQVJNdWxfRGVidWdQcmludChzdGF0ZSwgIiUwOGx4XG4iLGJ1ZmZlclt1cHRvKytdKSA7CisgICAgICAgICAgfQorICAgIEFSTXVsX0RlYnVnUHJpbnQoc3RhdGUsICJcbiIpIDsKKyAgICB9CisjZW5kaWYKKyByZXR1cm4oUkRJRXJyb3JfTm9FcnJvcikgOworI2VuZGlmIC8qIE5PRlBFICovCisgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRElfQ1B3cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgUkRJX0NQd3JpdGUodW5zaWduZWQgQ1BudW0sIHVuc2lnbmVkIGxvbmcgbWFzaywgQVJNd29yZCBjb25zdCBidWZmZXJbXSkKK3t1bnNpZ25lZCByIDsKKyB1bnNpZ25lZCB1cHRvIDsKKyBBUk13b3JkIGZwcmVnc2FkZHI7CisKKyBpZiAoQ1BudW0gIT0gMSAmJiBDUG51bSAhPSAyKSB7CisgICAgdW5zaWduZWQgY2hhciBjb25zdCAqcm1hcCA9IHN0YXRlLT5DUFJlZ1dvcmRzW0NQbnVtXTsKKyAgICBpZiAocm1hcCA9PSBOVUxMKQorICAgICAgIHJldHVybihSRElFcnJvcl9Vbmtub3duQ29Qcm8pIDsKKyAgICBUcmFjZVByaW50KChzdGF0ZSwgIlJESV9DUHdyaXRlOiBDUG51bT0lZCBtYXNrPSUuOGx4IiwgQ1BudW0sIG1hc2spKTsKKyNpZmRlZiBSRElfVkVSQk9TRQorICAgIGlmIChyZGlfbG9nICYgMSkgeworICAgICAgIGludCB3ID0gMDsKKyAgICAgICBmb3IgKHVwdG8gPSAwLCByID0gMDsgciA8IHJtYXBbLTFdOyByKyspCisgICAgICAgICAgaWYgKG1hc2sgJiAoMUwgPDwgcikpIHsKKyAgICAgICAgICAgICBpbnQgd29yZHMgPSBybWFwW3JdOworICAgICAgICAgICAgIEFSTXVsX0RlYnVnUHJpbnQoc3RhdGUsICIlYyUyZCIsICh3ID49IDQgPyAodyA9IDAsICdcbicpIDogJyAnKSwgcik7CisgICAgICAgICAgICAgd2hpbGUgKC0td29yZHMgPj0gMCkgeworICAgICAgICAgICAgICAgIEFSTXVsX0RlYnVnUHJpbnQoc3RhdGUsICIgJS44bHgiLCBidWZmZXJbdXB0bysrXSk7CisgICAgICAgICAgICAgICAgdysrOworICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgQVJNdWxfRGVidWdQcmludChzdGF0ZSwgIlxuIikgOworICAgIH0KKyNlbmRpZgorICAgIGZvciAodXB0byA9IDAsIHIgPSAwOyByIDwgcm1hcFstMV07IHIrKykKKyAgICAgICBpZiAobWFzayAmICgxTCA8PCByKSkgeworICAgICAgICAgICh2b2lkKXN0YXRlLT5DUFdyaXRlW0NQbnVtXShzdGF0ZSwgciwgJmJ1ZmZlclt1cHRvXSk7CisgICAgICAgICAgdXB0byArPSBybWFwW3JdOworICAgICAgIH0KKyAgICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKKyB9CisKKyNpZmRlZiBOT0ZQRQorIHJldHVybiBSRElFcnJvcl9Vbmtub3duQ29Qcm87CisKKyNlbHNlCisgVHJhY2VQcmludCgoc3RhdGUsICJSRElfQ1B3cml0ZTogQ1BudW09JWQgbWFzaz0lLjhseCIsIENQbnVtLCBtYXNrKSk7CisjaWZkZWYgUkRJX1ZFUkJPU0UKKyBpZiAocmRpX2xvZyAmIDEpIHsKKyAgICBmb3IgKHVwdG8gPSAwLCByID0gMCA7IHIgPCA5IDsgcisrKQorICAgICAgIGlmIChtYXNrICYgKDFMIDw8IHIpKSB7CisgICAgICAgICAgaWYgKHIgIT0gOCkgeworICAgICAgICAgICAgIEFSTXVsX0RlYnVnUHJpbnQoc3RhdGUsICIlMDhseCAiLGJ1ZmZlclt1cHRvKytdKSA7CisgICAgICAgICAgICAgQVJNdWxfRGVidWdQcmludChzdGF0ZSwgIiUwOGx4ICIsYnVmZmVyW3VwdG8rK10pIDsKKyAgICAgICAgICAgICBBUk11bF9EZWJ1Z1ByaW50KHN0YXRlLCAiJTA4bHggIixidWZmZXJbdXB0bysrXSkgOworICAgICAgICAgICAgIH0KKyAgICAgICAgICBBUk11bF9EZWJ1Z1ByaW50KHN0YXRlLCAiJTA4bHhcbiIsYnVmZmVyW3VwdG8rK10pIDsKKyAgICAgICAgICB9CisgICBBUk11bF9EZWJ1Z1ByaW50KHN0YXRlLCAiXG4iKSA7CisgICB9CisjZW5kaWYKKworIGlmIChGUFJlZ3NBZGRyID09IDApIHsKKyAgIGZwcmVnc2FkZHIgPSBBUk11bF9SZWFkV29yZChzdGF0ZSwgNEwpIDsKKyAgIGlmICgoZnByZWdzYWRkciAmIDB4ZmY4MDAwMDApICE9IDB4ZWEwMDAwMDApIC8qIE11c3QgYmUgYSBmb3J3YXJkIGJyYW5jaCAqLworICAgICByZXR1cm4gUkRJRXJyb3JfVW5rbm93bkNvUHJvOworICAgZnByZWdzYWRkciA9ICgoZnByZWdzYWRkciAmIDB4ZmZmZmZmKSA8PCAyKSArIDggOyAvKiBhZGRyZXNzIGluIF9fZnBfZGVjb2RlIC0gNCAqLworICAgaWYgKChmcHJlZ3NhZGRyIDwgRlBFU1RBUlQpIHx8IChmcHJlZ3NhZGRyID49IEZQRUVORCkpCisgICAgIHJldHVybiBSRElFcnJvcl9Vbmtub3duQ29Qcm87CisgICBmcHJlZ3NhZGRyID0gQVJNdWxfUmVhZFdvcmQoc3RhdGUsIGZwcmVnc2FkZHIpIDsgLyogcG9pbnRlciB0byBmcCByZWdpc3RlcnMgKi8KKyAgIEZQUmVnc0FkZHIgPSBmcHJlZ3NhZGRyIDsKKyB9CisgZWxzZQorICBmcHJlZ3NhZGRyID0gRlBSZWdzQWRkciA7CisKKyBpZiAoZnByZWdzYWRkciA9PSAwKSByZXR1cm4gUkRJRXJyb3JfVW5rbm93bkNvUHJvOworIGZvciAodXB0byA9IDAsIHIgPSAwIDsgciA8IDggOyByKyspCisgICAgaWYgKG1hc2sgJiAoMUwgPDwgcikpIHsKKyAgICAgIEFSTXVsX1dyaXRlV29yZChzdGF0ZSxmcHJlZ3NhZGRyICsgKEFSTXdvcmQpciAqIDE2LGJ1ZmZlclt1cHRvKzFdKSA7CisgICAgICBBUk11bF9Xcml0ZVdvcmQoc3RhdGUsZnByZWdzYWRkciArIChBUk13b3JkKXIgKiAxNiArIDQsYnVmZmVyW3VwdG8rMl0pIDsKKyAgICAgIEFSTXVsX1dyaXRlV29yZChzdGF0ZSxmcHJlZ3NhZGRyICsgKEFSTXdvcmQpciAqIDE2ICsgOCxidWZmZXJbdXB0byszXSkgOworICAgICAgQVJNdWxfV3JpdGVXb3JkKHN0YXRlLGZwcmVnc2FkZHIgKyAoQVJNd29yZClyICogMTYgKyAxMiwoYnVmZmVyW3VwdG9dICogMiArIDEpIDw8IDI5KSA7IC8qIG1hcmsgdHlwZSAqLworICAgICAgdXB0byArPSA0IDsKKyAgICB9CisgaWYgKG1hc2sgJiAoMUwgPDwgcikpCisgICAgQVJNdWxfV3JpdGVXb3JkKHN0YXRlLGZwcmVnc2FkZHIgKyAxMjgsYnVmZmVyW3VwdG8rK10pIDsgLyogZnBzciAqLworIHJldHVybihSRElFcnJvcl9Ob0Vycm9yKSA7CisjZW5kaWYgLyogTk9GUEUgKi8KK30KKworc3RhdGljIHZvaWQgZGVsZXRlYnJlYWtub2RlKEJyZWFrTm9kZSAqKnByZXZwKSB7CisgIEJyZWFrTm9kZSAqcCA9ICpwcmV2cDsKKyAgKnByZXZwID0gcC0+bmV4dDsKKyAgQVJNdWxfV3JpdGVXb3JkKHN0YXRlLCBwLT5hZGRyZXNzLCBwLT5pbnN0KTsKKyAgZnJlZSgoY2hhciAqKXApOworICBCcmVha3NTZXQtLSA7CisgIHN0YXRlLT5DYWxsRGVidWctLSA7Cit9CisKK3N0YXRpYyBpbnQgcmVtb3ZlYnJlYWsoQVJNd29yZCBhZGRyZXNzLCB1bnNpZ25lZCB0eXBlKQoreyBCcmVha05vZGUgKnAsICoqcHJldnAgPSAmQnJlYWtMaXN0OworICBmb3IgKDsgKHAgPSAqcHJldnApICE9IE5VTEwgOyBwcmV2cCA9ICZwLT5uZXh0KQorICAgIGlmIChwLT5hZGRyZXNzID09IGFkZHJlc3MgJiYgcC0+dHlwZSA9PSB0eXBlKSB7CisgICAgICBkZWxldGVicmVha25vZGUocHJldnApOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKKy8qIFRoaXMgcm91dGluZSBpbnN0YWxscyBhIGJyZWFrcG9pbnQgaW50byB0aGUgYnJlYWtwb2ludCB0YWJsZSAqLworCitzdGF0aWMgQnJlYWtOb2RlICppbnN0YWxsYnJlYWsoQVJNd29yZCBhZGRyZXNzLCB1bnNpZ25lZCB0eXBlLCBBUk13b3JkIGJvdW5kKQoreyBCcmVha05vZGUgKnAgPSAoQnJlYWtOb2RlICopbWFsbG9jKHNpemVvZihCcmVha05vZGUpKTsKKyAgcC0+bmV4dCA9IEJyZWFrTGlzdDsKKyAgQnJlYWtMaXN0ID0gcDsKKyAgcC0+YWRkcmVzcyA9IGFkZHJlc3M7CisgIHAtPnR5cGUgPSB0eXBlOworICBwLT5ib3VuZCA9IGJvdW5kOworICBwLT5pbnN0ID0gQVJNdWxfUmVhZFdvcmQoc3RhdGUsIGFkZHJlc3MpOworICBBUk11bF9Xcml0ZVdvcmQoc3RhdGUsIGFkZHJlc3MsIDB4ZWUwMDAwMDBMKTsKKyAgcmV0dXJuIHA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJESV9zZXRicmVhayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBSRElfc2V0YnJlYWsoQVJNd29yZCBhZGRyZXNzLCB1bnNpZ25lZCB0eXBlLCBBUk13b3JkIGJvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRIYW5kbGUgKmhhbmRsZSkKK3sgQnJlYWtOb2RlICpwOworICBUcmFjZVByaW50KChzdGF0ZSwgIlJESV9zZXRicmVhazogYWRkcmVzcz0lLjhseCB0eXBlPSVkIGJvdW5kPSUuOGx4XG4iLAorICAgICAgICAgICAgIGFkZHJlc3MsIHR5cGUsIGJvdW5kKSk7CisKKyAgcmVtb3ZlYnJlYWsoYWRkcmVzcywgdHlwZSk7CisgIHAgPSBpbnN0YWxsYnJlYWsoYWRkcmVzcywgdHlwZSwgYm91bmQpOworICBCcmVha3NTZXQrKyA7CisgIHN0YXRlLT5DYWxsRGVidWcrKyA7CisgICpoYW5kbGUgPSAoUG9pbnRIYW5kbGUpcDsKKyAgVHJhY2VQcmludCgoc3RhdGUsICIgcmV0dXJucyAlLjhseFxuIiwgKmhhbmRsZSkpOworICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRJX2NsZWFyYnJlYWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IFJESV9jbGVhcmJyZWFrKFBvaW50SGFuZGxlIGhhbmRsZSkKK3sgVHJhY2VQcmludCgoc3RhdGUsICJSRElfY2xlYXJicmVhazogYWRkcmVzcz0lLjhseFxuIiwgaGFuZGxlKSk7CisgIHsgQnJlYWtOb2RlICpwLCAqKnByZXZwID0gJkJyZWFrTGlzdDsKKyAgICBmb3IgKDsgKHAgPSAqcHJldnApICE9IE5VTEw7IHByZXZwID0gJnAtPm5leHQpCisgICAgICBpZiAocCA9PSAoQnJlYWtOb2RlICopaGFuZGxlKSBicmVhazsKKyAgICBpZiAocCA9PSBOVUxMKSByZXR1cm4gUkRJRXJyb3JfTm9TdWNoUG9pbnQ7CisgICAgZGVsZXRlYnJlYWtub2RlKHByZXZwKTsKKyAgICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgIEludGVybmFsIGZ1bmN0aW9ucyBmb3IgYnJlYWtwb2ludCB0YWJsZSBtYW5pcHVsYXRpb24gICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGRlbGV0ZXdhdGNobm9kZShXYXRjaE5vZGUgKipwcmV2cCkKK3sgV2F0Y2hOb2RlICpwID0gKnByZXZwOworICBpZiAocC0+ZGF0YXR5cGUgJiBXYXRjaF9BbnlSZWFkKSBzdGF0ZS0+TWVtUmVhZERlYnVnLS07CisgIGlmIChwLT5kYXRhdHlwZSAmIFdhdGNoX0FueVdyaXRlKSBzdGF0ZS0+TWVtV3JpdGVEZWJ1Zy0tOworICAqcHJldnAgPSBwLT5uZXh0OworICBmcmVlKChjaGFyICopcCk7Cit9CisKK2ludCByZW1vdmV3YXRjaChBUk13b3JkIGFkZHJlc3MsIHVuc2lnbmVkIHR5cGUpCit7IFdhdGNoTm9kZSAqcCwgKipwcmV2cCA9ICZXYXRjaExpc3Q7CisgIGZvciAoOyAocCA9ICpwcmV2cCkgIT0gTlVMTCA7IHByZXZwID0gJnAtPm5leHQpCisgICAgaWYgKHAtPmFkZHJlc3MgPT0gYWRkcmVzcyAmJiBwLT50eXBlID09IHR5cGUpIHsgLyogZm91bmQgYSBtYXRjaCAqLworICAgICAgIGRlbGV0ZXdhdGNobm9kZShwcmV2cCk7CisgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICByZXR1cm4gRkFMU0U7IC8qIG5ldmVyIGZvdW5kIGEgbWF0Y2ggKi8KK30KKworc3RhdGljIFdhdGNoTm9kZSAqaW5zdGFsbHdhdGNoKEFSTXdvcmQgYWRkcmVzcywgdW5zaWduZWQgdHlwZSwgdW5zaWduZWQgZGF0YXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNd29yZCBib3VuZCkKK3sgV2F0Y2hOb2RlICpwID0gKFdhdGNoTm9kZSAqKW1hbGxvYyhzaXplb2YoV2F0Y2hOb2RlKSk7CisgIHAtPm5leHQgPSBXYXRjaExpc3Q7CisgIFdhdGNoTGlzdCA9IHA7CisgIHAtPmFkZHJlc3MgPSBhZGRyZXNzOworICBwLT50eXBlID0gdHlwZTsKKyAgcC0+ZGF0YXR5cGUgPSBkYXRhdHlwZTsKKyAgcC0+Ym91bmQgPSBib3VuZDsKKyAgcmV0dXJuIHA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJESV9zZXR3YXRjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBSRElfc2V0d2F0Y2goQVJNd29yZCBhZGRyZXNzLCB1bnNpZ25lZCB0eXBlLCB1bnNpZ25lZCBkYXRhdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFSTXdvcmQgYm91bmQsIFBvaW50SGFuZGxlICpoYW5kbGUpCit7IFdhdGNoTm9kZSAqcDsKKyAgVHJhY2VQcmludCgoc3RhdGUsICJSRElfc2V0d2F0Y2g6IGFkZHJlc3M9JS44bHggdHlwZT0lZCBkYXRhdHlwZT0lZCBib3VuZD0lLjhseCIsCisgICAgICAgICAgICAgIGFkZHJlc3MsIHR5cGUsIGRhdGF0eXBlLCBib3VuZCkpOworCisgIGlmICghc3RhdGUtPkNhbldhdGNoKSByZXR1cm4gUkRJRXJyb3JfVW5pbXBsZW1lbnRlZE1lc3NhZ2U7CisKKyAgcmVtb3Zld2F0Y2goYWRkcmVzcywgdHlwZSk7CisgIHAgPSBpbnN0YWxsd2F0Y2goYWRkcmVzcywgdHlwZSwgZGF0YXR5cGUsIGJvdW5kKTsKKyAgaWYgKGRhdGF0eXBlICYgV2F0Y2hfQW55UmVhZCkgc3RhdGUtPk1lbVJlYWREZWJ1ZysrOworICBpZiAoZGF0YXR5cGUgJiBXYXRjaF9BbnlXcml0ZSkgc3RhdGUtPk1lbVdyaXRlRGVidWcrKzsKKyAgKmhhbmRsZSA9IChQb2ludEhhbmRsZSlwOworICBUcmFjZVByaW50KChzdGF0ZSwgIiByZXR1cm5zICUuOGx4XG4iLCAqaGFuZGxlKSk7CisgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRElfY2xlYXJ3YXRjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgUkRJX2NsZWFyd2F0Y2goUG9pbnRIYW5kbGUgaGFuZGxlKQoreyBUcmFjZVByaW50KChzdGF0ZSwgIlJESV9jbGVhcndhdGNoOiBhZGRyZXNzPSUuOGx4XG4iLCBoYW5kbGUpKTsKKyAgeyBXYXRjaE5vZGUgKnAsICoqcHJldnAgPSAmV2F0Y2hMaXN0OworICAgIGZvciAoOyAocCA9ICpwcmV2cCkgIT0gTlVMTDsgcHJldnAgPSAmcC0+bmV4dCkKKyAgICAgIGlmIChwID09IChXYXRjaE5vZGUgKiloYW5kbGUpIGJyZWFrOworICAgIGlmIChwID09IE5VTEwpIHJldHVybiBSRElFcnJvcl9Ob1N1Y2hQb2ludDsKKyAgICBkZWxldGV3YXRjaG5vZGUocHJldnApOworICAgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJESV9leGVjdXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBSRElfZXhlY3V0ZShQb2ludEhhbmRsZSAqaGFuZGxlKQoreworICBUcmFjZVByaW50KChzdGF0ZSwgIlJESV9leGVjdXRlXG4iKSk7CisgIGlmIChyZGlfbG9nICYgNCkgeworICAgIHN0YXRlLT5DYWxsRGVidWcrKyA7CisgICAgc3RhdGUtPkRlYnVnID0gVFJVRSA7CisgIH0KKyAgc3RhdGUtPkVuZENvbmRpdGlvbiA9IFJESUVycm9yX05vRXJyb3IgOworICBzdGF0ZS0+U3RvcEhhbmRsZSA9IDA7CisKKyAgQVJNdWxfRG9Qcm9nKHN0YXRlKTsKKworICAqaGFuZGxlID0gc3RhdGUtPlN0b3BIYW5kbGU7CisgIHN0YXRlLT5SZWdbMTVdIC09IDggOyAvKiB1bmRvIHRoZSBwaXBlbGluZSAqLworICBpZiAocmRpX2xvZyAmIDQpIHsKKyAgICBzdGF0ZS0+Q2FsbERlYnVnLS0gOworICAgIHN0YXRlLT5EZWJ1ZyA9IEZBTFNFIDsKKyAgfQorICByZXR1cm4oc3RhdGUtPkVuZENvbmRpdGlvbikgOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRJX3N0ZXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgUkRJX3N0ZXAodW5zaWduZWQgbmluc3RyLCBQb2ludEhhbmRsZSAqaGFuZGxlKQoreworCisgIFRyYWNlUHJpbnQoKHN0YXRlLCAiUkRJX3N0ZXBcbiIpKTsKKyAgaWYgKG5pbnN0ciAhPSAxKSByZXR1cm4gUkRJRXJyb3JfVW5pbXBsZW1lbnRlZE1lc3NhZ2U7CisgIGlmIChyZGlfbG9nICYgNCkgeworICAgIHN0YXRlLT5DYWxsRGVidWcrKyA7CisgICAgc3RhdGUtPkRlYnVnID0gVFJVRSA7CisgIH0KKyAgc3RhdGUtPkVuZENvbmRpdGlvbiA9IFJESUVycm9yX05vRXJyb3IgOworICBzdGF0ZS0+U3RvcEhhbmRsZSA9IDA7CisgIEFSTXVsX0RvSW5zdHIoc3RhdGUpIDsKKyAgKmhhbmRsZSA9IHN0YXRlLT5TdG9wSGFuZGxlOworICBzdGF0ZS0+UmVnWzE1XSAtPSA4IDsgLyogdW5kbyB0aGUgcGlwZWxpbmUgKi8KKyAgaWYgKHJkaV9sb2cgJiA0KSB7CisgICAgc3RhdGUtPkNhbGxEZWJ1Zy0tIDsKKyAgICBzdGF0ZS0+RGVidWcgPSBGQUxTRSA7CisgIH0KKyAgcmV0dXJuKHN0YXRlLT5FbmRDb25kaXRpb24pIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRJX2luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IFJESV9pbmZvKHVuc2lnbmVkIHR5cGUsIEFSTXdvcmQgKmFyZzEsIEFSTXdvcmQgKmFyZzIpCit7CisgIHN3aXRjaCAodHlwZSkgeworICBjYXNlIFJESUluZm9fVGFyZ2V0OgorICAgIFRyYWNlUHJpbnQoKHN0YXRlLCAiUkRJX0luZm9fVGFyZ2V0XG4iKSk7CisgICAgLyogRW11bGF0b3IsIHNwZWVkIDEwKio1IElQUyAqLworICAgICphcmcxID0gNSB8IEhJR0hFU1RfUkRJX0xFVkVMIDw8IDUgfCBMT1dFU1RfUkRJX0xFVkVMIDw8IDg7CisgICAgKmFyZzIgPSAxMjk4MjI0NDM0OworICAgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOworCisgIGNhc2UgUkRJSW5mb19Qb2ludHM6CisgIHsgQVJNd29yZCBuID0gUkRJUG9pbnRDYXBhYmlsaXR5X0NvbXBhcmlzb24gfCBSRElQb2ludENhcGFiaWxpdHlfUmFuZ2UgfAorICAgICAgICAgICAgICAgIFJESVBvaW50Q2FwYWJpbGl0eV9NYXNrIHwgUkRJUG9pbnRDYXBhYmlsaXR5X1N0YXR1czsKKyAgICBUcmFjZVByaW50KChzdGF0ZSwgIlJESV9JbmZvX1BvaW50c1xuIikpOworICAgIGlmIChzdGF0ZS0+Q2FuV2F0Y2gpIG4gfD0gKFdhdGNoX0FueVJlYWQrV2F0Y2hfQW55V3JpdGUpIDw8IDI7CisgICAgKmFyZzEgPSBuOworICAgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOworICB9CisKKyAgY2FzZSBSRElJbmZvX1N0ZXA6CisgICAgVHJhY2VQcmludCgoc3RhdGUsICJSRElfSW5mb19TdGVwXG4iKSk7CisgICAgKmFyZzEgPSAgUkRJU3RlcF9TaW5nbGU7CisgICAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7CisKKyAgY2FzZSBSRElJbmZvX01NVToKKyAgICBUcmFjZVByaW50KChzdGF0ZSwgIlJESV9JbmZvX01NVVxuIikpOworICAgICphcmcxID0gMTMxMzgyMDIyOSA7CisgICAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7CisKKyAgY2FzZSBSRElTaWduYWxfU3RvcDoKKyAgICBUcmFjZVByaW50KChzdGF0ZSwgIlJESVNpZ25hbF9TdG9wXG4iKSk7CisgICAgc3RhdGUtPkNhbGxEZWJ1ZysrIDsKKyAgICBzdGF0ZS0+RW5kQ29uZGl0aW9uID0gUkRJRXJyb3JfVXNlckludGVycnVwdCA7CisgICAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7CisKKyAgY2FzZSBSRElWZWN0b3JfQ2F0Y2g6CisgICAgVHJhY2VQcmludCgoc3RhdGUsICJSRElWZWN0b3JfQ2F0Y2ggJS44bHhcbiIsICphcmcxKSk7CisgICAgc3RhdGUtPlZlY3RvckNhdGNoID0gKHVuc2lnbmVkKSphcmcxIDsKKyAgICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKKworICBjYXNlIFJESVNldF9DbWRsaW5lOgorICAgIFRyYWNlUHJpbnQoKHN0YXRlLCAiUkRJX1NldF9DbWRsaW5lICVzXG4iLCAoY2hhciAqKWFyZzEpKTsKKyAgICBzdGF0ZS0+Q29tbWFuZExpbmUgPSAoY2hhciAqKW1hbGxvYygodW5zaWduZWQpc3RybGVuKChjaGFyICopYXJnMSkrMSkgOworICAgICh2b2lkKXN0cmNweShzdGF0ZS0+Q29tbWFuZExpbmUsKGNoYXIgKilhcmcxKSA7CisgICAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7CisKKyAgY2FzZSBSRElDeWNsZXM6CisgICAgVHJhY2VQcmludCgoc3RhdGUsICJSRElfSW5mb19DeWNsZXNcbiIpKTsKKyAgICBhcmcxWzBdID0gMDsKKyAgICBhcmcxWzFdID0gc3RhdGUtPk51bUluc3RyczsKKyAgICBhcmcxWzJdID0gMDsKKyAgICBhcmcxWzNdID0gc3RhdGUtPk51bVNjeWNsZXM7CisgICAgYXJnMVs0XSA9IDA7CisgICAgYXJnMVs1XSA9IHN0YXRlLT5OdW1OY3ljbGVzOworICAgIGFyZzFbNl0gPSAwOworICAgIGFyZzFbN10gPSBzdGF0ZS0+TnVtSWN5Y2xlczsKKyAgICBhcmcxWzhdID0gMDsKKyAgICBhcmcxWzldID0gc3RhdGUtPk51bUNjeWNsZXM7CisgICAgYXJnMVsxMF0gPSAwOworICAgIGFyZzFbMTFdID0gc3RhdGUtPk51bUZjeWNsZXM7CisgICAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7CisKKyAgY2FzZSBSRElFcnJvclA6CisgICAgKmFyZzEgPSBBUk11bF9PU0xhc3RFcnJvclAoc3RhdGUpOworICAgIFRyYWNlUHJpbnQoKHN0YXRlLCAiUkRJX0Vycm9yUCByZXR1cm5zICVsZFxuIiwgKmFyZzEpKTsKKyAgICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKKworICBjYXNlIFJESUluZm9fRGVzY3JpYmVDb1BybzoKKyAgeyBpbnQgY3BudW0gPSAqKGludCAqKWFyZzE7CisgICAgc3RydWN0IERiZ19Db1Byb0Rlc2MgKmNwZCA9IChzdHJ1Y3QgRGJnX0NvUHJvRGVzYyAqKWFyZzI7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciBjb25zdCAqbWFwID0gc3RhdGUtPkNQUmVnV29yZHNbY3BudW1dOworICAgIGlmIChtYXAgPT0gTlVMTCkgcmV0dXJuIFJESUVycm9yX1Vua25vd25Db1BybzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3BkLT5lbnRyaWVzOyBpKyspIHsKKyAgICAgIHVuc2lnbmVkIHIsIHcgPSBjcGQtPnJlZ2Rlc2NbaV0ubmJ5dGVzIC8gc2l6ZW9mKEFSTXdvcmQpOworICAgICAgZm9yIChyID0gY3BkLT5yZWdkZXNjW2ldLnJtaW47IHIgPD0gY3BkLT5yZWdkZXNjW2ldLnJtYXg7IHIrKykKKyAgICAgICAgaWYgKG1hcFtyXSAhPSB3KSByZXR1cm4gUkRJRXJyb3JfQmFkQ29Qcm9TdGF0ZTsKKyAgICB9CisgICAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7CisgIH0KKworICBjYXNlIFJESUluZm9fUmVxdWVzdENvUHJvRGVzYzoKKyAgeyBpbnQgY3BudW0gPSAqKGludCAqKWFyZzE7CisgICAgc3RydWN0IERiZ19Db1Byb0Rlc2MgKmNwZCA9IChzdHJ1Y3QgRGJnX0NvUHJvRGVzYyAqKWFyZzI7CisgICAgaW50IGkgPSAtMSwgbGFzdHcgPSAtMSwgcjsKKyAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICptYXA7CisgICAgaWYgKCh1bnNpZ25lZCljcG51bSA+PSAxNikgcmV0dXJuIFJESUVycm9yX1Vua25vd25Db1BybzsKKyAgICBtYXAgPSBzdGF0ZS0+Q1BSZWdXb3Jkc1tjcG51bV07CisgICAgaWYgKG1hcCA9PSBOVUxMKSByZXR1cm4gUkRJRXJyb3JfVW5rbm93bkNvUHJvOworICAgIGZvciAociA9IDA7IHIgPCBtYXBbLTFdOyByKyspIHsKKyAgICAgIGludCB3b3JkcyA9IG1hcFtyXTsKKyAgICAgIGlmICh3b3JkcyA9PSBsYXN0dykKKyAgICAgICAgY3BkLT5yZWdkZXNjW2ldLnJtYXggPSByOworICAgICAgZWxzZSB7CisgICAgICAgIGlmICgrK2kgPj0gY3BkLT5lbnRyaWVzKSByZXR1cm4gUkRJRXJyb3JfQnVmZmVyRnVsbDsKKyAgICAgICAgY3BkLT5yZWdkZXNjW2ldLnJtYXggPSBjcGQtPnJlZ2Rlc2NbaV0ucm1pbiA9IHI7CisgICAgICAgIGNwZC0+cmVnZGVzY1tpXS5uYnl0ZXMgPSB3b3JkcyAqIHNpemVvZihBUk13b3JkKTsKKyAgICAgICAgY3BkLT5yZWdkZXNjW2ldLmFjY2VzcyA9IERiZ19BY2Nlc3NfUmVhZGFibGUrRGJnX0FjY2Vzc19Xcml0YWJsZTsKKyAgICAgIH0KKyAgICB9CisgICAgY3BkLT5lbnRyaWVzID0gaSsxOworICAgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOworICB9CisKKyAgY2FzZSBSRElJbmZvX0xvZzoKKyAgICAqYXJnMSA9IChBUk13b3JkKXJkaV9sb2c7CisgICAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7CisKKyAgY2FzZSBSRElJbmZvX1NldExvZzoKKyAgICByZGlfbG9nID0gKGludCkqYXJnMTsKKyAgICByZXR1cm4gUkRJRXJyb3JfTm9FcnJvcjsKKworICBjYXNlIFJESUluZm9fQ29Qcm86CisgICAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7CisKKyAgY2FzZSBSRElQb2ludFN0YXR1c19XYXRjaDoKKyAgICB7IFdhdGNoTm9kZSAqcCwgKmhhbmRsZSA9IChXYXRjaE5vZGUgKikqYXJnMTsKKyAgICAgIGZvciAocCA9IFdhdGNoTGlzdDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKKyAgICAgICAgaWYgKHAgPT0gaGFuZGxlKSB7CisgICAgICAgICAgKmFyZzEgPSAtMTsKKyAgICAgICAgICAqYXJnMiA9IDE7CisgICAgICAgICAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7CisgICAgICAgIH0KKyAgICAgIHJldHVybiBSRElFcnJvcl9Ob1N1Y2hQb2ludDsKKyAgICB9CisKKyAgY2FzZSBSRElQb2ludFN0YXR1c19CcmVhazoKKyAgICB7IEJyZWFrTm9kZSAqcCwgKmhhbmRsZSA9IChCcmVha05vZGUgKikqYXJnMTsKKyAgICAgIGZvciAocCA9IEJyZWFrTGlzdDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKKyAgICAgICAgaWYgKHAgPT0gaGFuZGxlKSB7CisgICAgICAgICAgKmFyZzEgPSAtMTsKKyAgICAgICAgICAqYXJnMiA9IDE7CisgICAgICAgICAgcmV0dXJuIFJESUVycm9yX05vRXJyb3I7CisgICAgICAgIH0KKyAgICAgIHJldHVybiBSRElFcnJvcl9Ob1N1Y2hQb2ludDsKKyAgICB9CisKKyAgY2FzZSBSRElTZXRfUkRJTGV2ZWw6CisgICAgaWYgKCphcmcxIDwgTE9XRVNUX1JESV9MRVZFTCB8fCAqYXJnMSA+IEhJR0hFU1RfUkRJX0xFVkVMKQorICAgICAgcmV0dXJuIFJESUVycm9yX0luY29tcGF0aWJsZVJESUxldmVsczsKKyAgICBNWXJkaV9sZXZlbCA9ICphcmcxOworICAgIHJldHVybiBSRElFcnJvcl9Ob0Vycm9yOworCisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIFJESUVycm9yX1VuaW1wbGVtZW50ZWRNZXNzYWdlOworCisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhlIGVtdWxhdG9yIGNhbGxzIHRoaXMgcm91dGluZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IGN5Y2xlIHdoZW4gdGhlICAqCisqIENhbGxEZWJ1ZyBmbGFnIGlzIHNldC4gIFRoZSBzZWNvbmQgcGFyYW1ldGVyIHBhc3NlZCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgKgorKiBjdXJyZW50bHkgZXhlY3V0aW5nIGluc3RydWN0aW9uIChpLmUgUHJvZ3JhbSBDb3VudGVyIC0gOCksIHRoZSB0aGlyZCAgICAgICoKKyogcGFyYW1ldGVyIGlzIHRoZSBpbnN0cnVjdGlvbiBiZWluZyBleGVjdXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitBUk13b3JkIEFSTXVsX0RlYnVnKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBwYywgQVJNd29yZCBpbnN0cikKK3sKKworICBpZiAoc3RhdGUtPkVuZENvbmRpdGlvbiA9PSBSRElFcnJvcl9Vc2VySW50ZXJydXB0KSB7CisgICAgVHJhY2VQcmludCgoc3RhdGUsICJVc2VyIGludGVycnVwdCBhdCAlLjhseFxuIiwgcGMpKTsKKyAgICBzdGF0ZS0+Q2FsbERlYnVnLS07CisgICAgc3RhdGUtPkVtdWxhdGUgPSBTVE9QOworICB9IGVsc2UgeworICAgIEJyZWFrTm9kZSAqcCA9IEJyZWFrTGlzdDsKKyAgICBmb3IgKDsgcCAhPSBOVUxMIDsgcCA9IHAtPm5leHQpIHsKKyAgICAgIHN3aXRjaCAocC0+dHlwZSkgeworICAgICAgY2FzZSBSRElQb2ludF9FUTogaWYgKHBjID09IHAtPmFkZHJlc3MpIGJyZWFrOyBjb250aW51ZTsKKyAgICAgIGNhc2UgUkRJUG9pbnRfR1Q6IGlmIChwYyA+ICBwLT5hZGRyZXNzKSBicmVhazsgY29udGludWU7CisgICAgICBjYXNlIFJESVBvaW50X0dFOiBpZiAocGMgPj0gcC0+YWRkcmVzcykgYnJlYWs7IGNvbnRpbnVlOworICAgICAgY2FzZSBSRElQb2ludF9MVDogaWYgKHBjIDwgIHAtPmFkZHJlc3MpIGJyZWFrOyBjb250aW51ZTsKKyAgICAgIGNhc2UgUkRJUG9pbnRfTEU6IGlmIChwYyA8PSBwLT5hZGRyZXNzKSBicmVhazsgY29udGludWU7CisgICAgICBjYXNlIFJESVBvaW50X0lOOiBpZiAocC0+YWRkcmVzcyA8PSBwYyAmJiBwYyA8IHAtPmFkZHJlc3MrcC0+Ym91bmQpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICBjYXNlIFJESVBvaW50X09VVDppZiAocC0+YWRkcmVzcyA+IHBjIHx8IHBjID49IHAtPmFkZHJlc3MrcC0+Ym91bmQpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICBjYXNlIFJESVBvaW50X01BU0s6aWYgKChwYyAmIHAtPmJvdW5kKSA9PSBwLT5hZGRyZXNzKSBicmVhazsgY29udGludWU7CisgICAgICB9CisgICAgICAvKiBmb3VuZCBhIG1hdGNoICovCisgICAgICBUcmFjZVByaW50KChzdGF0ZSwgIkJyZWFrcG9pbnQgcmVhY2hlZCBhdCAlLjhseFxuIiwgcGMpKTsKKyAgICAgIHN0YXRlLT5FbmRDb25kaXRpb24gPSBSRElFcnJvcl9CcmVha3BvaW50UmVhY2hlZCA7CisgICAgICBzdGF0ZS0+RW11bGF0ZSA9IFNUT1A7CisgICAgICBzdGF0ZS0+U3RvcEhhbmRsZSA9IChBUk13b3JkKXA7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGluc3RyOworfQorCit2b2lkIEFSTXVsX0NoZWNrV2F0Y2goQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIGFkZHIsIGludCBhY2Nlc3MpCit7IFdhdGNoTm9kZSAqcDsKKyAgZm9yIChwID0gV2F0Y2hMaXN0OyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQorICAgIGlmIChwLT5kYXRhdHlwZSAmIGFjY2VzcykgeworICAgICAgc3dpdGNoIChwLT50eXBlKSB7CisgICAgICBjYXNlIFJESVBvaW50X0VROiBpZiAoYWRkciA9PSBwLT5hZGRyZXNzKSBicmVhazsgY29udGludWU7CisgICAgICBjYXNlIFJESVBvaW50X0dUOiBpZiAoYWRkciA+ICBwLT5hZGRyZXNzKSBicmVhazsgY29udGludWU7CisgICAgICBjYXNlIFJESVBvaW50X0dFOiBpZiAoYWRkciA+PSBwLT5hZGRyZXNzKSBicmVhazsgY29udGludWU7CisgICAgICBjYXNlIFJESVBvaW50X0xUOiBpZiAoYWRkciA8ICBwLT5hZGRyZXNzKSBicmVhazsgY29udGludWU7CisgICAgICBjYXNlIFJESVBvaW50X0xFOiBpZiAoYWRkciA8PSBwLT5hZGRyZXNzKSBicmVhazsgY29udGludWU7CisgICAgICBjYXNlIFJESVBvaW50X0lOOiBpZiAocC0+YWRkcmVzcyA8PSBhZGRyICYmIGFkZHIgPCBwLT5hZGRyZXNzK3AtPmJvdW5kKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgY2FzZSBSRElQb2ludF9PVVQ6aWYgKHAtPmFkZHJlc3MgPiBhZGRyIHx8IGFkZHIgPj0gcC0+YWRkcmVzcytwLT5ib3VuZCkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgIGNhc2UgUkRJUG9pbnRfTUFTSzppZiAoKGFkZHIgJiBwLT5ib3VuZCkgPT0gcC0+YWRkcmVzcykgYnJlYWs7IGNvbnRpbnVlOworICAgICAgfQorICAgICAgLyogZm91bmQgYSBtYXRjaCAqLworICAgICAgVHJhY2VQcmludCgoc3RhdGUsICJXYXRjaHBvaW50IGF0ICUuOGx4IGFjY2Vzc2VkXG4iLCBhZGRyKSk7CisgICAgICBzdGF0ZS0+RW5kQ29uZGl0aW9uID0gUkRJRXJyb3JfV2F0Y2hwb2ludEFjY2Vzc2VkOworICAgICAgc3RhdGUtPkVtdWxhdGUgPSBTVE9QOworICAgICAgc3RhdGUtPlN0b3BIYW5kbGUgPSAoQVJNd29yZClwOworICAgICAgcmV0dXJuOworICAgfQorfQorCitzdGF0aWMgUkRJX05hbWVMaXN0IGNvbnN0ICpSRElfY3B1bmFtZXMoKSB7CisgIHJldHVybiAoUkRJX05hbWVMaXN0IGNvbnN0ICopJnByb2Nlc3NvcmNvbmZpZy5jb3VudDsKK30KKworY29uc3Qgc3RydWN0IFJESVByb2NWZWMgYXJtdWxfcmRpID0geworICAgICJBUk1VTCIsCisgICAgUkRJX29wZW4sCisgICAgUkRJX2Nsb3NlLAorICAgIFJESV9yZWFkLAorICAgIFJESV93cml0ZSwKKyAgICBSRElfQ1BVcmVhZCwKKyAgICBSRElfQ1BVd3JpdGUsCisgICAgUkRJX0NQcmVhZCwKKyAgICBSRElfQ1B3cml0ZSwKKyAgICBSRElfc2V0YnJlYWssCisgICAgUkRJX2NsZWFyYnJlYWssCisgICAgUkRJX3NldHdhdGNoLAorICAgIFJESV9jbGVhcndhdGNoLAorICAgIFJESV9leGVjdXRlLAorICAgIFJESV9zdGVwLAorICAgIFJESV9pbmZvLAorCisgICAgMCwgLypwb2ludGlucSovCisgICAgMCwgLyphZGRjb25maWcqLworICAgIDAsIC8qbG9hZGNvbmZpZ2RhdGEqLworICAgIDAsIC8qc2VsZWN0Y29uZmlnKi8KKyAgICAwLCAvKmRyaXZlcm5hbWVzKi8KKworICAgIFJESV9jcHVuYW1lcworfTsKKwpkaWZmIC0tZ2l0IGEvc2ltL2FybS9hcm1zdXBwLmMgYi9zaW0vYXJtL2FybXN1cHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2VkZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2FybS9hcm1zdXBwLmMKQEAgLTAsMCArMSw3MTIgQEAKKy8qICBhcm1zdXBwLmMgLS0gQVJNdWxhdG9yIHN1cHBvcnQgY29kZTogIEFSTTYgSW5zdHJ1Y3Rpb24gRW11bGF0b3IuCisgICAgQ29weXJpZ2h0IChDKSAxOTk0IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTHRkLgorIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KKworI2luY2x1ZGUgImFybWRlZnMuaCIKKyNpbmNsdWRlICJhcm1lbXUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgIERlZmluaXRpb25zIGZvciB0aGUgc3VwcG9ydCByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitBUk13b3JkIEFSTXVsX0dldFJlZyhBUk11bF9TdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIG1vZGUsIHVuc2lnbmVkIHJlZykgOwordm9pZCBBUk11bF9TZXRSZWcoQVJNdWxfU3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBtb2RlLCB1bnNpZ25lZCByZWcsIEFSTXdvcmQgdmFsdWUpIDsKK0FSTXdvcmQgQVJNdWxfR2V0UEMoQVJNdWxfU3RhdGUgKnN0YXRlKSA7CitBUk13b3JkIEFSTXVsX0dldE5leHRQQyhBUk11bF9TdGF0ZSAqc3RhdGUpIDsKK3ZvaWQgQVJNdWxfU2V0UEMoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIHZhbHVlKSA7CitBUk13b3JkIEFSTXVsX0dldFIxNShBUk11bF9TdGF0ZSAqc3RhdGUpIDsKK3ZvaWQgQVJNdWxfU2V0UjE1KEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCB2YWx1ZSkgOworCitBUk13b3JkIEFSTXVsX0dldENQU1IoQVJNdWxfU3RhdGUgKnN0YXRlKSA7Cit2b2lkIEFSTXVsX1NldENQU1IoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIHZhbHVlKSA7Cit2b2lkIEFSTXVsX0ZpeENQU1IoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIGluc3RyLCBBUk13b3JkIHJocykgOworQVJNd29yZCBBUk11bF9HZXRTUFNSKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBtb2RlKSA7Cit2b2lkIEFSTXVsX1NldFNQU1IoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIG1vZGUsIEFSTXdvcmQgdmFsdWUpIDsKK3ZvaWQgQVJNdWxfRml4U1BTUihBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgcmhzKSA7CisKK3ZvaWQgQVJNdWxfQ1BTUkFsdGVyZWQoQVJNdWxfU3RhdGUgKnN0YXRlKSA7Cit2b2lkIEFSTXVsX1IxNUFsdGVyZWQoQVJNdWxfU3RhdGUgKnN0YXRlKSA7CisKK0FSTXdvcmQgQVJNdWxfU3dpdGNoTW9kZShBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBvbGRtb2RlLCBBUk13b3JkIG5ld21vZGUpIDsKK3N0YXRpYyBBUk13b3JkIE1vZGVUb0JhbmsoQVJNdWxfU3RhdGUgKnN0YXRlLEFSTXdvcmQgbW9kZSkgOworCit1bnNpZ25lZCBBUk11bF9OdGhSZWcoQVJNd29yZCBpbnN0ciwgdW5zaWduZWQgbnVtYmVyKSA7CisKK3ZvaWQgQVJNdWxfTmVnWmVybyhBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgcmVzdWx0KSA7Cit2b2lkIEFSTXVsX0FkZENhcnJ5KEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBhLCBBUk13b3JkIGIsIEFSTXdvcmQgcmVzdWx0KSA7Cit2b2lkIEFSTXVsX0FkZE92ZXJmbG93KEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBhLCBBUk13b3JkIGIsIEFSTXdvcmQgcmVzdWx0KSA7Cit2b2lkIEFSTXVsX1N1YkNhcnJ5KEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBhLCBBUk13b3JkIGIsIEFSTXdvcmQgcmVzdWx0KSA7Cit2b2lkIEFSTXVsX1N1Yk92ZXJmbG93KEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBhLCBBUk13b3JkIGIsIEFSTXdvcmQgcmVzdWx0KSA7CisKK3ZvaWQgQVJNdWxfTERDKEFSTXVsX1N0YXRlICpzdGF0ZSxBUk13b3JkIGluc3RyLEFSTXdvcmQgYWRkcmVzcykgOwordm9pZCBBUk11bF9TVEMoQVJNdWxfU3RhdGUgKnN0YXRlLEFSTXdvcmQgaW5zdHIsQVJNd29yZCBhZGRyZXNzKSA7Cit2b2lkIEFSTXVsX01DUihBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBpbnN0ciwgQVJNd29yZCBzb3VyY2UpIDsKK0FSTXdvcmQgQVJNdWxfTVJDKEFSTXVsX1N0YXRlICpzdGF0ZSxBUk13b3JkIGluc3RyKSA7Cit2b2lkIEFSTXVsX0NEUChBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBpbnN0cikgOwordm9pZCBBUk11bF9VbmRlZkluc3RyKEFSTXVsX1N0YXRlICpzdGF0ZSxBUk13b3JkIGluc3RyKSA7Cit1bnNpZ25lZCBJbnRQZW5kaW5nKEFSTXVsX1N0YXRlICpzdGF0ZSkgOworCitBUk13b3JkIEFSTXVsX0FsaWduKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIGRhdGEpIDsKKwordm9pZCBBUk11bF9TY2hlZHVsZUV2ZW50KEFSTXVsX1N0YXRlICpzdGF0ZSwgdW5zaWduZWQgbG9uZyBkZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAoKndoYXQpKCkpIDsKK3ZvaWQgQVJNdWxfRW52b2tlRXZlbnQoQVJNdWxfU3RhdGUgKnN0YXRlKSA7Cit1bnNpZ25lZCBsb25nIEFSTXVsX1RpbWUoQVJNdWxfU3RhdGUgKnN0YXRlKSA7CitzdGF0aWMgdm9pZCBFbnZva2VMaXN0KEFSTXVsX1N0YXRlICpzdGF0ZSwgdW5zaWduZWQgbG9uZyBmcm9tLCB1bnNpZ25lZCBsb25nIHRvKSA7CisKK3N0cnVjdCBFdmVudE5vZGUgeyAvKiBBbiBldmVudCBsaXN0IG5vZGUgKi8KKyAgICAgIHVuc2lnbmVkICgqZnVuYykoKSA7IC8qIFRoZSBmdW5jdGlvbiB0byBjYWxsICovCisgICAgICBzdHJ1Y3QgRXZlbnROb2RlICpuZXh0IDsKKyAgICAgIH0gOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgdmFsdWUgb2YgYSByZWdpc3RlciBmcm9tIGEgbW9kZS4gICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0FSTXdvcmQgQVJNdWxfR2V0UmVnKEFSTXVsX1N0YXRlICpzdGF0ZSwgdW5zaWduZWQgbW9kZSwgdW5zaWduZWQgcmVnKQore21vZGUgJj0gTU9ERUJJVFMgOworIGlmIChtb2RlICE9IHN0YXRlLT5Nb2RlKQorICAgIHJldHVybihzdGF0ZS0+UmVnQmFua1tNb2RlVG9CYW5rKHN0YXRlLChBUk13b3JkKW1vZGUpXVtyZWddKSA7CisgZWxzZQorICAgIHJldHVybihzdGF0ZS0+UmVnW3JlZ10pIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhpcyByb3V0aW5lIHNldHMgdGhlIHZhbHVlIG9mIGEgcmVnaXN0ZXIgZm9yIGEgbW9kZS4gICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFSTXVsX1NldFJlZyhBUk11bF9TdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIG1vZGUsIHVuc2lnbmVkIHJlZywgQVJNd29yZCB2YWx1ZSkKK3ttb2RlICY9IE1PREVCSVRTIDsKKyBpZiAobW9kZSAhPSBzdGF0ZS0+TW9kZSkKKyAgICBzdGF0ZS0+UmVnQmFua1tNb2RlVG9CYW5rKHN0YXRlLChBUk13b3JkKW1vZGUpXVtyZWddID0gdmFsdWUgOworIGVsc2UKKyAgICBzdGF0ZS0+UmVnW3JlZ10gPSB2YWx1ZSA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgUEMsIG1vZGUgaW5kZXBlbmRlbnRseS4gICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQVJNd29yZCBBUk11bF9HZXRQQyhBUk11bF9TdGF0ZSAqc3RhdGUpCit7aWYgKHN0YXRlLT5Nb2RlID4gU1ZDMjZNT0RFKQorICAgIHJldHVybihzdGF0ZS0+UmVnWzE1XSkgOworIGVsc2UKKyAgICByZXR1cm4oUjE1UEMpIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBQQywgbW9kZSBpbmRlcGVuZGVudGx5LiAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitBUk13b3JkIEFSTXVsX0dldE5leHRQQyhBUk11bF9TdGF0ZSAqc3RhdGUpCit7aWYgKHN0YXRlLT5Nb2RlID4gU1ZDMjZNT0RFKQorICAgIHJldHVybihzdGF0ZS0+UmVnWzE1XSArIGlzaXplKSA7CisgZWxzZQorICAgIHJldHVybigoc3RhdGUtPlJlZ1sxNV0gKyBpc2l6ZSkgJiBSMTVQQ0JJVFMpIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhpcyByb3V0aW5lIHNldHMgdGhlIHZhbHVlIG9mIHRoZSBQQy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFSTXVsX1NldFBDKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCB2YWx1ZSkKK3tpZiAoQVJNdWxfTU9ERTMyQklUKQorICAgIHN0YXRlLT5SZWdbMTVdID0gdmFsdWUgJiBQQ0JJVFMgOworIGVsc2UKKyAgICBzdGF0ZS0+UmVnWzE1XSA9IFIxNUNDSU5UTU9ERSB8ICh2YWx1ZSAmIFIxNVBDQklUUykgOworIEZMVVNIUElQRSA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSB2YWx1ZSBvZiByZWdpc3RlciAxNSwgbW9kZSBpbmRlcGVuZGVudGx5LiAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQVJNd29yZCBBUk11bF9HZXRSMTUoQVJNdWxfU3RhdGUgKnN0YXRlKQore2lmIChzdGF0ZS0+TW9kZSA+IFNWQzI2TU9ERSkKKyAgICByZXR1cm4oc3RhdGUtPlJlZ1sxNV0pIDsKKyBlbHNlCisgICAgcmV0dXJuKFIxNVBDIHwgRUNDIHwgRVIxNUlOVCB8IEVNT0RFKSA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIFRoaXMgcm91dGluZSBzZXRzIHRoZSB2YWx1ZSBvZiBSZWdpc3RlciAxNS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBBUk11bF9TZXRSMTUoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIHZhbHVlKQoreworIGlmIChBUk11bF9NT0RFMzJCSVQpCisgICAgc3RhdGUtPlJlZ1sxNV0gPSB2YWx1ZSAmIFBDQklUUyA7CisgZWxzZSB7CisgICAgc3RhdGUtPlJlZ1sxNV0gPSB2YWx1ZSA7CisgICAgQVJNdWxfUjE1QWx0ZXJlZChzdGF0ZSkgOworICAgIH0KKyBGTFVTSFBJUEUgOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIENQU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0FSTXdvcmQgQVJNdWxfR2V0Q1BTUihBUk11bF9TdGF0ZSAqc3RhdGUpCit7CisgcmV0dXJuKENQU1IpIDsKKyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIFRoaXMgcm91dGluZSBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgQ1BTUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBBUk11bF9TZXRDUFNSKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCB2YWx1ZSkKK3tzdGF0ZS0+Q3BzciA9IENQU1IgOworIFNFVFBTUihzdGF0ZS0+Q3Bzcix2YWx1ZSkgOworIEFSTXVsX0NQU1JBbHRlcmVkKHN0YXRlKSA7CisgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiBUaGlzIHJvdXRpbmUgZG9lcyBhbGwgdGhlIG5hc3R5IGJpdHMgaW52b2x2ZWQgaW4gYSB3cml0ZSB0byB0aGUgQ1BTUiwgICAgICoKKyogaW5jbHVkaW5nIHVwZGF0aW5nIHRoZSByZWdpc3RlciBiYW5rLCBnaXZlbiBhIE1TUiBpbnN0cnVjdGlvbi4gICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQVJNdWxfRml4Q1BTUihBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgcmhzKQore3N0YXRlLT5DcHNyID0gQ1BTUiA7CisgaWYgKHN0YXRlLT5CYW5rPT1VU0VSQkFOSykgeyAvKiBPbmx5IHdyaXRlIGZsYWdzIGluIHVzZXIgbW9kZSAqLworICAgIGlmIChCSVQoMTkpKSB7CisgICAgICAgU0VUQ0Moc3RhdGUtPkNwc3IscmhzKSA7CisgICAgICAgfQorICAgIH0KKyBlbHNlIHsgLyogTm90IGEgdXNlciBtb2RlICovCisgICAgaWYgKEJJVFMoMTYsMTkpPT05KSBTRVRQU1Ioc3RhdGUtPkNwc3IscmhzKSA7CisgICAgZWxzZSBpZiAoQklUKDE2KSkgU0VUSU5UTU9ERShzdGF0ZS0+Q3BzcixyaHMpIDsKKyAgICBlbHNlIGlmIChCSVQoMTkpKSBTRVRDQyhzdGF0ZS0+Q3BzcixyaHMpIDsKKyAgICB9CisgQVJNdWxfQ1BTUkFsdGVyZWQoc3RhdGUpIDsKKyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIEdldCBhbiBTUFNSIGZyb20gdGhlIHNwZWNpZmllZCBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQVJNd29yZCBBUk11bF9HZXRTUFNSKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBtb2RlKQore0FSTXdvcmQgYmFuayA9IE1vZGVUb0Jhbmsoc3RhdGUsbW9kZSAmIE1PREVCSVRTKSA7CisgaWYgKGJhbmsgPT0gVVNFUkJBTksgfHwgYmFuayA9PSBEVU1NWUJBTkspCisgICAgcmV0dXJuKENQU1IpIDsKKyBlbHNlCisgICAgcmV0dXJuKHN0YXRlLT5TcHNyW2JhbmtdKSA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIFRoaXMgcm91dGluZSBkb2VzIGEgd3JpdGUgdG8gYW4gU1BTUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBBUk11bF9TZXRTUFNSKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBtb2RlLCBBUk13b3JkIHZhbHVlKQore0FSTXdvcmQgYmFuayA9IE1vZGVUb0Jhbmsoc3RhdGUsbW9kZSAmIE1PREVCSVRTKSA7CisgaWYgKGJhbmsgIT0gVVNFUkJBTksgJiYgYmFuayAhPURVTU1ZQkFOSykKKyAgICBzdGF0ZS0+U3BzcltiYW5rXSA9IHZhbHVlIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhpcyByb3V0aW5lIGRvZXMgYSB3cml0ZSB0byB0aGUgY3VycmVudCBTUFNSLCBnaXZlbiBhbiBNU1IgaW5zdHJ1Y3Rpb24gICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFSTXVsX0ZpeFNQU1IoQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIGluc3RyLCBBUk13b3JkIHJocykKK3tpZiAoc3RhdGUtPkJhbmsgIT0gVVNFUkJBTksgJiYgc3RhdGUtPkJhbmsgIT1EVU1NWUJBTkspIHsKKyAgICBpZiAoQklUUygxNiwxOSk9PTkpIFNFVFBTUihzdGF0ZS0+U3BzcltzdGF0ZS0+QmFua10scmhzKSA7CisgICAgZWxzZSBpZiAoQklUKDE2KSkgU0VUSU5UTU9ERShzdGF0ZS0+U3BzcltzdGF0ZS0+QmFua10scmhzKSA7CisgICAgZWxzZSBpZiAoQklUKDE5KSkgU0VUQ0Moc3RhdGUtPlNwc3Jbc3RhdGUtPkJhbmtdLHJocykgOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhpcyByb3V0aW5lIHVwZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBlbXVsYXRvciBhZnRlciB0aGUgQ3BzciBoYXMgYmVlbiAgICAqCisqIGNoYW5nZWQuICBCb3RoIHRoZSBwcm9jZXNzb3IgZmxhZ3MgYW5kIHJlZ2lzdGVyIGJhbmsgYXJlIHVwZGF0ZWQuICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBBUk11bF9DUFNSQWx0ZXJlZChBUk11bF9TdGF0ZSAqc3RhdGUpCit7QVJNd29yZCBvbGRtb2RlIDsKKworIGlmIChzdGF0ZS0+cHJvZzMyU2lnID09IExPVykKKyAgICBzdGF0ZS0+Q3BzciAmPSAoQ0NCSVRTIHwgSU5UQklUUyB8IFIxNU1PREVCSVRTKSA7Cisgb2xkbW9kZSA9IHN0YXRlLT5Nb2RlIDsKKyBpZiAoc3RhdGUtPk1vZGUgIT0gKHN0YXRlLT5DcHNyICYgTU9ERUJJVFMpKSB7CisgICAgc3RhdGUtPk1vZGUgPSBBUk11bF9Td2l0Y2hNb2RlKHN0YXRlLHN0YXRlLT5Nb2RlLHN0YXRlLT5DcHNyICYgTU9ERUJJVFMpIDsKKyAgICBzdGF0ZS0+TnRyYW5zU2lnID0gKHN0YXRlLT5Nb2RlICYgMyk/SElHSDpMT1cgOworICAgIH0KKworIEFTU0lHTklOVChzdGF0ZS0+Q3BzciAmIElOVEJJVFMpIDsKKyBBU1NJR05OKChzdGF0ZS0+Q3BzciAmIE5CSVQpICE9IDApIDsKKyBBU1NJR05aKChzdGF0ZS0+Q3BzciAmIFpCSVQpICE9IDApIDsKKyBBU1NJR05DKChzdGF0ZS0+Q3BzciAmIENCSVQpICE9IDApIDsKKyBBU1NJR05WKChzdGF0ZS0+Q3BzciAmIFZCSVQpICE9IDApIDsKKyNpZmRlZiBNT0RFVAorIEFTU0lHTlQoKHN0YXRlLT5DcHNyICYgVEJJVCkgIT0gMCk7CisjZW5kaWYKKworIGlmIChvbGRtb2RlID4gU1ZDMjZNT0RFKSB7CisgICAgaWYgKHN0YXRlLT5Nb2RlIDw9IFNWQzI2TU9ERSkgeworICAgICAgIHN0YXRlLT5FbXVsYXRlID0gQ0hBTkdFTU9ERSA7CisgICAgICAgc3RhdGUtPlJlZ1sxNV0gPSBFQ0MgfCBFUjE1SU5UIHwgRU1PREUgfCBSMTVQQyA7CisgICAgICAgfQorICAgIH0KKyBlbHNlIHsKKyAgICBpZiAoc3RhdGUtPk1vZGUgPiBTVkMyNk1PREUpIHsKKyAgICAgICBzdGF0ZS0+RW11bGF0ZSA9IENIQU5HRU1PREUgOworICAgICAgIHN0YXRlLT5SZWdbMTVdID0gUjE1UEMgOworICAgICAgIH0KKyAgICBlbHNlCisgICAgICAgc3RhdGUtPlJlZ1sxNV0gPSBFQ0MgfCBFUjE1SU5UIHwgRU1PREUgfCBSMTVQQyA7CisgICAgfQorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIFRoaXMgcm91dGluZSB1cGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgZW11bGF0b3IgYWZ0ZXIgcmVnaXN0ZXIgMTUgaGFzICAgICAgKgorKiBiZWVuIGNoYW5nZWQuICBCb3RoIHRoZSBwcm9jZXNzb3IgZmxhZ3MgYW5kIHJlZ2lzdGVyIGJhbmsgYXJlIHVwZGF0ZWQuICAgICoKKyogVGhpcyByb3V0aW5lIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIGEgMjYgYml0IG1vZGUuICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFSTXVsX1IxNUFsdGVyZWQoQVJNdWxfU3RhdGUgKnN0YXRlKQoreworIGlmIChzdGF0ZS0+TW9kZSAhPSBSMTVNT0RFKSB7CisgICAgc3RhdGUtPk1vZGUgPSBBUk11bF9Td2l0Y2hNb2RlKHN0YXRlLHN0YXRlLT5Nb2RlLFIxNU1PREUpIDsKKyAgICBzdGF0ZS0+TnRyYW5zU2lnID0gKHN0YXRlLT5Nb2RlICYgMyk/SElHSDpMT1cgOworICAgIH0KKyBpZiAoc3RhdGUtPk1vZGUgPiBTVkMyNk1PREUpCisgICAgc3RhdGUtPkVtdWxhdGUgPSBDSEFOR0VNT0RFIDsKKyBBU1NJR05SMTVJTlQoUjE1SU5UKSA7CisgQVNTSUdOTigoc3RhdGUtPlJlZ1sxNV0gJiBOQklUKSAhPSAwKSA7CisgQVNTSUdOWigoc3RhdGUtPlJlZ1sxNV0gJiBaQklUKSAhPSAwKSA7CisgQVNTSUdOQygoc3RhdGUtPlJlZ1sxNV0gJiBDQklUKSAhPSAwKSA7CisgQVNTSUdOVigoc3RhdGUtPlJlZ1sxNV0gJiBWQklUKSAhPSAwKSA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIFRoaXMgcm91dGluZSBjb250cm9scyB0aGUgc2F2aW5nIGFuZCByZXN0b3Jpbmcgb2YgcmVnaXN0ZXJzIGFjcm9zcyBtb2RlICAgKgorKiBjaGFuZ2VzLiAgVGhlIHJlZ2JhbmsgbWF0cml4IGlzIGxhcmdlbHkgdW51c2VkLCBvbmx5IHJvd3MgMTMgYW5kIDE0IGFyZSAgICoKKyogdXNlZCBhY3Jvc3MgYWxsIG1vZGVzLCA4IHRvIDE0IGFyZSB1c2VkIGZvciBGSVEsIGFsbCBvdGhlcnMgdXNlIHRoZSBVU0VSICAqCisqIGNvbHVtbi4gIEl0J3MgZWFzaWVyIHRoaXMgd2F5LiAgb2xkIGFuZCBuZXcgcGFyYW1ldGVyIGFyZSBtb2RlcyBudW1iZXJzLiAgKgorKiBOb3RpY2UgdGhlIHNpZGUgZWZmZWN0IG9mIGNoYW5naW5nIHRoZSBCYW5rIHZhcmlhYmxlLiAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0FSTXdvcmQgQVJNdWxfU3dpdGNoTW9kZShBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBvbGRtb2RlLCBBUk13b3JkIG5ld21vZGUpCit7dW5zaWduZWQgaSA7CisKKyBvbGRtb2RlID0gTW9kZVRvQmFuayhzdGF0ZSxvbGRtb2RlKSA7Cisgc3RhdGUtPkJhbmsgPSBNb2RlVG9CYW5rKHN0YXRlLG5ld21vZGUpIDsKKyBpZiAob2xkbW9kZSAhPSBzdGF0ZS0+QmFuaykgeyAvKiByZWFsbHkgbmVlZCB0byBkbyBpdCAqLworICAgIHN3aXRjaCAob2xkbW9kZSkgeyAvKiBzYXZlIGF3YXkgdGhlIG9sZCByZWdpc3RlcnMgKi8KKyAgICAgICBjYXNlIFVTRVJCQU5LICA6CisgICAgICAgY2FzZSBJUlFCQU5LICAgOgorICAgICAgIGNhc2UgU1ZDQkFOSyAgIDoKKyAgICAgICBjYXNlIEFCT1JUQkFOSyA6CisgICAgICAgY2FzZSBVTkRFRkJBTksgOiBpZiAoc3RhdGUtPkJhbmsgPT0gRklRQkFOSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDggOyBpIDwgMTMgOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+UmVnQmFua1tVU0VSQkFOS11baV0gPSBzdGF0ZS0+UmVnW2ldIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5SZWdCYW5rW29sZG1vZGVdWzEzXSA9IHN0YXRlLT5SZWdbMTNdIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5SZWdCYW5rW29sZG1vZGVdWzE0XSA9IHN0YXRlLT5SZWdbMTRdIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICBjYXNlIEZJUUJBTksgICA6IGZvciAoaSA9IDggOyBpIDwgMTUgOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+UmVnQmFua1tGSVFCQU5LXVtpXSA9IHN0YXRlLT5SZWdbaV0gOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgIGNhc2UgRFVNTVlCQU5LIDogZm9yIChpID0gOCA7IGkgPCAxNSA7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5SZWdCYW5rW0RVTU1ZQkFOS11baV0gPSAwIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDsKKworICAgICAgIH0KKyAgICBzd2l0Y2ggKHN0YXRlLT5CYW5rKSB7IC8qIHJlc3RvcmUgdGhlIG5ldyByZWdpc3RlcnMgKi8KKyAgICAgICBjYXNlIFVTRVJCQU5LICA6CisgICAgICAgY2FzZSBJUlFCQU5LICAgOgorICAgICAgIGNhc2UgU1ZDQkFOSyAgIDoKKyAgICAgICBjYXNlIEFCT1JUQkFOSyA6CisgICAgICAgY2FzZSBVTkRFRkJBTksgOiBpZiAob2xkbW9kZSA9PSBGSVFCQU5LKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gOCA7IGkgPCAxMyA7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5SZWdbaV0gPSBzdGF0ZS0+UmVnQmFua1tVU0VSQkFOS11baV0gOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPlJlZ1sxM10gPSBzdGF0ZS0+UmVnQmFua1tzdGF0ZS0+QmFua11bMTNdIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5SZWdbMTRdID0gc3RhdGUtPlJlZ0Jhbmtbc3RhdGUtPkJhbmtdWzE0XSA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgY2FzZSBGSVFCQU5LICA6IGZvciAoaSA9IDggOyBpIDwgMTUgOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+UmVnW2ldID0gc3RhdGUtPlJlZ0JhbmtbRklRQkFOS11baV0gOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgIGNhc2UgRFVNTVlCQU5LIDogZm9yIChpID0gOCA7IGkgPCAxNSA7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5SZWdbaV0gPSAwIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICB9IC8qIHN3aXRjaCAqLworICAgIH0gLyogaWYgKi8KKyAgICByZXR1cm4obmV3bW9kZSkgOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiBHaXZlbiBhIHByb2Nlc3NvciBtb2RlLCB0aGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgcmVnaXN0ZXIgYmFuayB0aGF0ICAgICAgICoKKyogd2lsbCBiZSBhY2Nlc3NlZCBpbiB0aGF0IG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgQVJNd29yZCBNb2RlVG9CYW5rKEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBtb2RlKQore3N0YXRpYyBBUk13b3JkIGJhbmtvZm1vZGVbXSA9IHtVU0VSQkFOSywgIEZJUUJBTkssICAgSVJRQkFOSywgICBTVkNCQU5LLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVU1NWUJBTkssIERVTU1ZQkFOSywgRFVNTVlCQU5LLCBEVU1NWUJBTkssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERVTU1ZQkFOSywgRFVNTVlCQU5LLCBEVU1NWUJBTkssIERVTU1ZQkFOSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFVNTVlCQU5LLCBEVU1NWUJBTkssIERVTU1ZQkFOSywgRFVNTVlCQU5LLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VSQkFOSywgIEZJUUJBTkssICAgSVJRQkFOSywgICBTVkNCQU5LLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVU1NWUJBTkssIERVTU1ZQkFOSywgRFVNTVlCQU5LLCBBQk9SVEJBTkssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERVTU1ZQkFOSywgRFVNTVlCQU5LLCBEVU1NWUJBTkssIFVOREVGQkFOSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDsKKworIGlmIChtb2RlID4gVU5ERUYzMk1PREUpCisgICAgcmV0dXJuKERVTU1ZQkFOSykgOworIGVsc2UKKyAgICByZXR1cm4oYmFua29mbW9kZVttb2RlXSkgOworIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogUmV0dXJucyB0aGUgcmVnaXN0ZXIgbnVtYmVyIG9mIHRoZSBudGggcmVnaXN0ZXIgaW4gYSByZWcgbGlzdC4gICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bnNpZ25lZCBBUk11bF9OdGhSZWcoQVJNd29yZCBpbnN0ciwgdW5zaWduZWQgbnVtYmVyKQore3Vuc2lnbmVkIGJpdCwgdXB0byA7CisKKyBmb3IgKGJpdCA9IDAsIHVwdG8gPSAwIDsgdXB0byA8PSBudW1iZXIgOyBiaXQrKykKKyAgICBpZiAoQklUKGJpdCkpIHVwdG8rKyA7CisgcmV0dXJuKGJpdCAtIDEpIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogQXNzaWducyB0aGUgTiBhbmQgWiBmbGFncyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHJlc3VsdCAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFSTXVsX05lZ1plcm8oQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIHJlc3VsdCkKK3sKKyBpZiAoTkVHKHJlc3VsdCkpIHsgU0VUTiA7IENMRUFSWiA7IH0KKyBlbHNlIGlmIChyZXN1bHQgPT0gMCkgeyBDTEVBUk4gOyBTRVRaIDsgfQorIGVsc2UgeyBDTEVBUk4gOyBDTEVBUlogOyB9IDsKKyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIEFzc2lnbnMgdGhlIEMgZmxhZyBhZnRlciBhbiBhZGRpdGlvbiBvZiBhIGFuZCBiIHRvIGdpdmUgcmVzdWx0ICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBBUk11bF9BZGRDYXJyeShBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgYSxBUk13b3JkIGIsQVJNd29yZCByZXN1bHQpCit7CisgQVNTSUdOQyggKE5FRyhhKSAmJiBORUcoYikpIHx8CisgICAgICAgICAgKE5FRyhhKSAmJiBQT1MocmVzdWx0KSkgfHwKKyAgICAgICAgICAoTkVHKGIpICYmIFBPUyhyZXN1bHQpKSApIDsKKyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIEFzc2lnbnMgdGhlIFYgZmxhZyBhZnRlciBhbiBhZGRpdGlvbiBvZiBhIGFuZCBiIHRvIGdpdmUgcmVzdWx0ICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBBUk11bF9BZGRPdmVyZmxvdyhBUk11bF9TdGF0ZSAqc3RhdGUsIEFSTXdvcmQgYSxBUk13b3JkIGIsQVJNd29yZCByZXN1bHQpCit7CisgQVNTSUdOViggKE5FRyhhKSAmJiBORUcoYikgJiYgUE9TKHJlc3VsdCkpIHx8CisgICAgICAgICAgKFBPUyhhKSAmJiBQT1MoYikgJiYgTkVHKHJlc3VsdCkpICkgOworIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogQXNzaWducyB0aGUgQyBmbGFnIGFmdGVyIGFuIHN1YnRyYWN0aW9uIG9mIGEgYW5kIGIgdG8gZ2l2ZSByZXN1bHQgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFSTXVsX1N1YkNhcnJ5KEFSTXVsX1N0YXRlICpzdGF0ZSwgQVJNd29yZCBhLEFSTXdvcmQgYixBUk13b3JkIHJlc3VsdCkKK3sKK0FTU0lHTkMoIChORUcoYSkgJiYgUE9TKGIpKSB8fAorICAgICAgICAgKE5FRyhhKSAmJiBQT1MocmVzdWx0KSkgfHwKKyAgICAgICAgIChQT1MoYikgJiYgUE9TKHJlc3VsdCkpICkgOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiBBc3NpZ25zIHRoZSBWIGZsYWcgYWZ0ZXIgYW4gc3VidHJhY3Rpb24gb2YgYSBhbmQgYiB0byBnaXZlIHJlc3VsdCAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQVJNdWxfU3ViT3ZlcmZsb3coQVJNdWxfU3RhdGUgKnN0YXRlLEFSTXdvcmQgYSxBUk13b3JkIGIsQVJNd29yZCByZXN1bHQpCit7CitBU1NJR05WKCAoTkVHKGEpICYmIFBPUyhiKSAmJiBQT1MocmVzdWx0KSkgfHwKKyAgICAgICAgIChQT1MoYSkgJiYgTkVHKGIpICYmIE5FRyhyZXN1bHQpKSApIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSB3b3JrIG9mIGdlbmVyYXRpbmcgdGhlIGFkZHJlc3NlcyB1c2VkIGluIGFuICAgICAgICAqCisqIExEQyBpbnN0cnVjdGlvbi4gIFRoZSBjb2RlIGhlcmUgaXMgYWx3YXlzIHBvc3QtaW5kZXhlZCwgaXQncyB1cCB0byB0aGUgICAgKgorKiBjYWxsZXIgdG8gZ2V0IHRoZSBpbnB1dCBhZGRyZXNzIGNvcnJlY3QgYW5kIHRvIGhhbmRsZSBiYXNlIHJlZ2lzdGVyICAgICAgICoKKyogbW9kaWZpY2F0aW9uLiBJdCBhbHNvIGhhbmRsZXMgdGhlIEJ1c3ktV2FpdGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFSTXVsX0xEQyhBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBpbnN0cixBUk13b3JkIGFkZHJlc3MpCit7dW5zaWduZWQgY3BhYiA7CisgQVJNd29yZCBkYXRhIDsKKworIFVOREVGX0xTQ1BDQmFzZVdiIDsKKyBpZiAoQUREUkVYQ0VQVChhZGRyZXNzKSkgeworICAgIElOVEVSTkFMQUJPUlQoYWRkcmVzcykgOworICAgIH0KKyBjcGFiID0gKHN0YXRlLT5MRENbQ1BOdW1dKShzdGF0ZSxBUk11bF9GSVJTVCxpbnN0ciwwKSA7Cisgd2hpbGUgKGNwYWIgPT0gQVJNdWxfQlVTWSkgeworICAgIEFSTXVsX0ljeWNsZXMoc3RhdGUsMSwwKSA7CisgICAgaWYgKEludFBlbmRpbmcoc3RhdGUpKSB7CisgICAgICAgY3BhYiA9IChzdGF0ZS0+TERDW0NQTnVtXSkoc3RhdGUsQVJNdWxfSU5URVJSVVBULGluc3RyLDApIDsKKyAgICAgICByZXR1cm4gOworICAgICAgIH0KKyAgICBlbHNlCisgICAgICAgY3BhYiA9IChzdGF0ZS0+TERDW0NQTnVtXSkoc3RhdGUsQVJNdWxfQlVTWSxpbnN0ciwwKSA7CisgICAgfQorIGlmIChjcGFiID09IEFSTXVsX0NBTlQpIHsKKyAgICBDUFRBS0VBQk9SVCA7CisgICAgcmV0dXJuIDsKKyAgICB9CisgY3BhYiA9IChzdGF0ZS0+TERDW0NQTnVtXSkoc3RhdGUsQVJNdWxfVFJBTlNGRVIsaW5zdHIsMCkgOworIGRhdGEgPSBBUk11bF9Mb2FkV29yZE4oc3RhdGUsYWRkcmVzcykgOworIEJVU1VTRURJTkNQQ04gOworIGlmIChCSVQoMjEpKQorICAgIExTQmFzZSA9IHN0YXRlLT5CYXNlIDsKKyBjcGFiID0gKHN0YXRlLT5MRENbQ1BOdW1dKShzdGF0ZSxBUk11bF9EQVRBLGluc3RyLGRhdGEpIDsKKyB3aGlsZSAoY3BhYiA9PSBBUk11bF9JTkMpIHsKKyAgICBhZGRyZXNzICs9IDQgOworICAgIGRhdGEgPSBBUk11bF9Mb2FkV29yZE4oc3RhdGUsYWRkcmVzcykgOworICAgIGNwYWIgPSAoc3RhdGUtPkxEQ1tDUE51bV0pKHN0YXRlLEFSTXVsX0RBVEEsaW5zdHIsZGF0YSkgOworICAgIH0KKyBpZiAoc3RhdGUtPmFib3J0U2lnIHx8IHN0YXRlLT5BYm9ydGVkKSB7CisgICAgVEFLRUFCT1JUIDsKKyAgICB9CisgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHdvcmsgb2YgZ2VuZXJhdGluZyB0aGUgYWRkcmVzc2VzIHVzZWQgaW4gYW4gICAgICAgICoKKyogU1RDIGluc3RydWN0aW9uLiAgVGhlIGNvZGUgaGVyZSBpcyBhbHdheXMgcG9zdC1pbmRleGVkLCBpdCdzIHVwIHRvIHRoZSAgICAqCisqIGNhbGxlciB0byBnZXQgdGhlIGlucHV0IGFkZHJlc3MgY29ycmVjdCBhbmQgdG8gaGFuZGxlIGJhc2UgcmVnaXN0ZXIgICAgICAgKgorKiBtb2RpZmljYXRpb24uIEl0IGFsc28gaGFuZGxlcyB0aGUgQnVzeS1XYWl0aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQVJNdWxfU1RDKEFSTXVsX1N0YXRlICpzdGF0ZSxBUk13b3JkIGluc3RyLEFSTXdvcmQgYWRkcmVzcykKK3t1bnNpZ25lZCBjcGFiIDsKKyBBUk13b3JkIGRhdGEgOworCisgVU5ERUZfTFNDUENCYXNlV2IgOworIGlmIChBRERSRVhDRVBUKGFkZHJlc3MpIHx8IFZFQ1RPUkFDQ0VTUyhhZGRyZXNzKSkgeworICAgIElOVEVSTkFMQUJPUlQoYWRkcmVzcykgOworICAgIH0KKyBjcGFiID0gKHN0YXRlLT5TVENbQ1BOdW1dKShzdGF0ZSxBUk11bF9GSVJTVCxpbnN0ciwmZGF0YSkgOworIHdoaWxlIChjcGFiID09IEFSTXVsX0JVU1kpIHsKKyAgICBBUk11bF9JY3ljbGVzKHN0YXRlLDEsMCkgOworICAgIGlmIChJbnRQZW5kaW5nKHN0YXRlKSkgeworICAgICAgIGNwYWIgPSAoc3RhdGUtPlNUQ1tDUE51bV0pKHN0YXRlLEFSTXVsX0lOVEVSUlVQVCxpbnN0ciwwKSA7CisgICAgICAgcmV0dXJuIDsKKyAgICAgICB9CisgICAgZWxzZQorICAgICAgIGNwYWIgPSAoc3RhdGUtPlNUQ1tDUE51bV0pKHN0YXRlLEFSTXVsX0JVU1ksaW5zdHIsJmRhdGEpIDsKKyAgICB9CisgaWYgKGNwYWIgPT0gQVJNdWxfQ0FOVCkgeworICAgIENQVEFLRUFCT1JUIDsKKyAgICByZXR1cm4gOworICAgIH0KKyNpZm5kZWYgTU9ERTMyCisgaWYgKEFERFJFWENFUFQoYWRkcmVzcykgfHwgVkVDVE9SQUNDRVNTKGFkZHJlc3MpKSB7CisgICAgSU5URVJOQUxBQk9SVChhZGRyZXNzKSA7CisgICAgfQorI2VuZGlmCisgQlVTVVNFRElOQ1BDTiA7CisgaWYgKEJJVCgyMSkpCisgICAgTFNCYXNlID0gc3RhdGUtPkJhc2UgOworIGNwYWIgPSAoc3RhdGUtPlNUQ1tDUE51bV0pKHN0YXRlLEFSTXVsX0RBVEEsaW5zdHIsJmRhdGEpIDsKKyBBUk11bF9TdG9yZVdvcmROKHN0YXRlLGFkZHJlc3MsZGF0YSkgOworIHdoaWxlIChjcGFiID09IEFSTXVsX0lOQykgeworICAgIGFkZHJlc3MgKz0gNCA7CisgICAgY3BhYiA9IChzdGF0ZS0+U1RDW0NQTnVtXSkoc3RhdGUsQVJNdWxfREFUQSxpbnN0ciwmZGF0YSkgOworICAgIEFSTXVsX1N0b3JlV29yZE4oc3RhdGUsYWRkcmVzcyxkYXRhKSA7CisgICAgfQorIGlmIChzdGF0ZS0+YWJvcnRTaWcgfHwgc3RhdGUtPkFib3J0ZWQpIHsKKyAgICBUQUtFQUJPUlQgOworICAgIH0KKyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIEJ1c3ktV2FpdGluZyBmb3IgYW4gTUNSIGluc3RydWN0aW9uLiAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBBUk11bF9NQ1IoQVJNdWxfU3RhdGUgKnN0YXRlLEFSTXdvcmQgaW5zdHIsIEFSTXdvcmQgc291cmNlKQore3Vuc2lnbmVkIGNwYWIgOworCisgY3BhYiA9IChzdGF0ZS0+TUNSW0NQTnVtXSkoc3RhdGUsQVJNdWxfRklSU1QsaW5zdHIsc291cmNlKSA7Cisgd2hpbGUgKGNwYWIgPT0gQVJNdWxfQlVTWSkgeworICAgIEFSTXVsX0ljeWNsZXMoc3RhdGUsMSwwKSA7CisgICAgaWYgKEludFBlbmRpbmcoc3RhdGUpKSB7CisgICAgICAgY3BhYiA9IChzdGF0ZS0+TUNSW0NQTnVtXSkoc3RhdGUsQVJNdWxfSU5URVJSVVBULGluc3RyLDApIDsKKyAgICAgICByZXR1cm4gOworICAgICAgIH0KKyAgICBlbHNlCisgICAgICAgY3BhYiA9IChzdGF0ZS0+TUNSW0NQTnVtXSkoc3RhdGUsQVJNdWxfQlVTWSxpbnN0cixzb3VyY2UpIDsKKyAgICB9CisgaWYgKGNwYWIgPT0gQVJNdWxfQ0FOVCkKKyAgICBBUk11bF9BYm9ydChzdGF0ZSxBUk11bF9VbmRlZmluZWRJbnN0clYpIDsKKyBlbHNlIHsKKyAgICBCVVNVU0VESU5DUENOIDsKKyAgICBBUk11bF9DY3ljbGVzKHN0YXRlLDEsMCkgOworICAgIH0KKyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIEJ1c3ktV2FpdGluZyBmb3IgYW4gTVJDIGluc3RydWN0aW9uLiAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQVJNd29yZCBBUk11bF9NUkMoQVJNdWxfU3RhdGUgKnN0YXRlLEFSTXdvcmQgaW5zdHIpCit7dW5zaWduZWQgY3BhYiA7CisgQVJNd29yZCByZXN1bHQgPSAwIDsKKworIGNwYWIgPSAoc3RhdGUtPk1SQ1tDUE51bV0pKHN0YXRlLEFSTXVsX0ZJUlNULGluc3RyLCZyZXN1bHQpIDsKKyB3aGlsZSAoY3BhYiA9PSBBUk11bF9CVVNZKSB7CisgICAgQVJNdWxfSWN5Y2xlcyhzdGF0ZSwxLDApIDsKKyAgICBpZiAoSW50UGVuZGluZyhzdGF0ZSkpIHsKKyAgICAgICBjcGFiID0gKHN0YXRlLT5NUkNbQ1BOdW1dKShzdGF0ZSxBUk11bF9JTlRFUlJVUFQsaW5zdHIsMCkgOworICAgICAgIHJldHVybigwKSA7CisgICAgICAgfQorICAgIGVsc2UKKyAgICAgICBjcGFiID0gKHN0YXRlLT5NUkNbQ1BOdW1dKShzdGF0ZSxBUk11bF9CVVNZLGluc3RyLCZyZXN1bHQpIDsKKyAgICB9CisgaWYgKGNwYWIgPT0gQVJNdWxfQ0FOVCkgeworICAgIEFSTXVsX0Fib3J0KHN0YXRlLEFSTXVsX1VuZGVmaW5lZEluc3RyVikgOworICAgIHJlc3VsdCA9IEVDQyA7IC8qIFBhcmVudCB3aWxsIGRlc3Ryb3kgdGhlIGZsYWdzIG90aGVyd2lzZSAqLworICAgIH0KKyBlbHNlIHsKKyAgICBCVVNVU0VESU5DUENOIDsKKyAgICBBUk11bF9DY3ljbGVzKHN0YXRlLDEsMCkgOworICAgIEFSTXVsX0ljeWNsZXMoc3RhdGUsMSwwKSA7CisgICAgfQorIHJldHVybihyZXN1bHQpIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgQnVzeS1XYWl0aW5nIGZvciBhbiBDRFAgaW5zdHJ1Y3Rpb24uICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFSTXVsX0NEUChBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBpbnN0cikKK3t1bnNpZ25lZCBjcGFiIDsKKworIGNwYWIgPSAoc3RhdGUtPkNEUFtDUE51bV0pKHN0YXRlLEFSTXVsX0ZJUlNULGluc3RyKSA7Cisgd2hpbGUgKGNwYWIgPT0gQVJNdWxfQlVTWSkgeworICAgIEFSTXVsX0ljeWNsZXMoc3RhdGUsMSwwKSA7CisgICAgaWYgKEludFBlbmRpbmcoc3RhdGUpKSB7CisgICAgICAgY3BhYiA9IChzdGF0ZS0+Q0RQW0NQTnVtXSkoc3RhdGUsQVJNdWxfSU5URVJSVVBULGluc3RyKSA7CisgICAgICAgcmV0dXJuIDsKKyAgICAgICB9CisgICAgZWxzZQorICAgICAgIGNwYWIgPSAoc3RhdGUtPkNEUFtDUE51bV0pKHN0YXRlLEFSTXVsX0JVU1ksaW5zdHIpIDsKKyAgICB9CisgaWYgKGNwYWIgPT0gQVJNdWxfQ0FOVCkKKyAgICBBUk11bF9BYm9ydChzdGF0ZSxBUk11bF9VbmRlZmluZWRJbnN0clYpIDsKKyBlbHNlCisgICAgQlVTVVNFRE4gOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBVbmRlZmluZWQgaW5zdHJ1Y3Rpb25zLCBhcyBDUCBpc250cnVjdGlvbiAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQVJNdWxfVW5kZWZJbnN0cihBUk11bF9TdGF0ZSAqc3RhdGUsQVJNd29yZCBpbnN0cikKK3sKKyBBUk11bF9BYm9ydChzdGF0ZSxBUk11bF9VbmRlZmluZWRJbnN0clYpIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgIFJldHVybiBUUlVFIGlmIGFuIGludGVycnVwdCBpcyBwZW5kaW5nLCBGQUxTRSBvdGhlcndpc2UuICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bnNpZ25lZCBJbnRQZW5kaW5nKEFSTXVsX1N0YXRlICpzdGF0ZSkKK3sKKyBpZiAoc3RhdGUtPkV4Y2VwdGlvbikgeyAvKiBBbnkgZXhjZXB0aW9ucyAqLworICAgIGlmIChzdGF0ZS0+TnJlc2V0U2lnID09IExPVykgeworICAgICAgIEFSTXVsX0Fib3J0KHN0YXRlLEFSTXVsX1Jlc2V0VikgOworICAgICAgIHJldHVybihUUlVFKSA7CisgICAgICAgfQorICAgIGVsc2UgaWYgKCFzdGF0ZS0+TmZpcVNpZyAmJiAhRkZMQUcpIHsKKyAgICAgICBBUk11bF9BYm9ydChzdGF0ZSxBUk11bF9GSVFWKSA7CisgICAgICAgcmV0dXJuKFRSVUUpIDsKKyAgICAgICB9CisgICAgZWxzZSBpZiAoIXN0YXRlLT5OaXJxU2lnICYmICFJRkxBRykgeworICAgICAgIEFSTXVsX0Fib3J0KHN0YXRlLEFSTXVsX0lSUVYpIDsKKyAgICAgICByZXR1cm4oVFJVRSkgOworICAgICAgIH0KKyAgICB9CisgcmV0dXJuKEZBTFNFKSA7CisgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgIEFsaWduIGEgd29yZCBhY2Nlc3MgdG8gYSBub24gd29yZCBib3VuZGFyeSAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0FSTXdvcmQgQVJNdWxfQWxpZ24oQVJNdWxfU3RhdGUgKnN0YXRlLCBBUk13b3JkIGFkZHJlc3MsIEFSTXdvcmQgZGF0YSkKK3svKiB0aGlzIGNvZGUgYXNzdW1lcyB0aGUgYWRkcmVzcyBpcyByZWFsbHkgdW5hbGlnbmVkLAorICAgIGFzIGEgc2hpZnQgYnkgMzIgaXMgdW5kZWZpbmVkIGluIEMgKi8KKworIGFkZHJlc3MgPSAoYWRkcmVzcyAmIDMpIDw8IDMgOyAvKiBnZXQgdGhlIHdvcmQgYWRkcmVzcyAqLworIHJldHVybiggKCBkYXRhID4+IGFkZHJlc3MpIHwgKGRhdGEgPDwgKDMyIC0gYWRkcmVzcykpICkgOyAvKiByb3QgcmlnaHQgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gY2FsbCBhbm90aGVyIHJvdXRpbmUgYWZ0ZXIgYSBjZXJ0YWluIG51bWJlciBvZiAgICAqCisqIGN5Y2xlcyBoYXZlIGJlZW4gZXhlY3V0ZWQuIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIG51bWJlciBvZiBjeWNsZXMgICAgKgorKiBkZWxheSBiZWZvcmUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgICAgICoKKyogdG8gdGhlIGZ1bmN0aW9uLiBBIGRlbGF5IG9mIHplcm8gZG9lc24ndCB3b3JrLCBqdXN0IGNhbGwgdGhlIGZ1bmN0aW9uLiAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFSTXVsX1NjaGVkdWxlRXZlbnQoQVJNdWxfU3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBsb25nIGRlbGF5LCB1bnNpZ25lZCAoKndoYXQpKCkpCit7dW5zaWduZWQgbG9uZyB3aGVuIDsKKyBzdHJ1Y3QgRXZlbnROb2RlICpldmVudCA7CisKKyBpZiAoc3RhdGUtPkV2ZW50U2V0KysgPT0gMCkKKyAgICBzdGF0ZS0+Tm93ID0gQVJNdWxfVGltZShzdGF0ZSkgOworIHdoZW4gPSAoc3RhdGUtPk5vdyArIGRlbGF5KSAlIEVWRU5UTElTVFNJWkUgOworIGV2ZW50ID0gKHN0cnVjdCBFdmVudE5vZGUgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBFdmVudE5vZGUpKSA7CisgZXZlbnQtPmZ1bmMgPSB3aGF0IDsKKyBldmVudC0+bmV4dCA9ICooc3RhdGUtPkV2ZW50UHRyICsgd2hlbikgOworICooc3RhdGUtPkV2ZW50UHRyICsgd2hlbikgPSBldmVudCA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeSBjeWNsZSwgdG8gZW52b2tlICAgICAgICAgKgorKiBzY2hlZHVsZWQgZXZlbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQVJNdWxfRW52b2tlRXZlbnQoQVJNdWxfU3RhdGUgKnN0YXRlKQore3N0YXRpYyB1bnNpZ25lZCBsb25nIHRoZW4gOworCisgdGhlbiA9IHN0YXRlLT5Ob3cgOworIHN0YXRlLT5Ob3cgPSBBUk11bF9UaW1lKHN0YXRlKSAlIEVWRU5UTElTVFNJWkUgOworIGlmICh0aGVuIDwgc3RhdGUtPk5vdykgLyogc2NoZWR1bGUgZXZlbnRzICovCisgICAgRW52b2tlTGlzdChzdGF0ZSx0aGVuLHN0YXRlLT5Ob3cpIDsKKyBlbHNlIGlmICh0aGVuID4gc3RhdGUtPk5vdykgeyAvKiBuZWVkIHRvIHdyYXAgYXJvdW5kIHRoZSBsaXN0ICovCisgICAgRW52b2tlTGlzdChzdGF0ZSx0aGVuLEVWRU5UTElTVFNJWkUtMUwpIDsKKyAgICBFbnZva2VMaXN0KHN0YXRlLDBMLHN0YXRlLT5Ob3cpIDsKKyAgICB9CisgfQorCitzdGF0aWMgdm9pZCBFbnZva2VMaXN0KEFSTXVsX1N0YXRlICpzdGF0ZSwgdW5zaWduZWQgbG9uZyBmcm9tLCB1bnNpZ25lZCBsb25nIHRvKQorLyogZW52b2tlcyBhbGwgdGhlIGVudHJpZXMgaW4gYSByYW5nZSAqLwore3N0cnVjdCBFdmVudE5vZGUgKmFuZXZlbnQgOworCisgZm9yICg7IGZyb20gPD0gdG8gOyBmcm9tKyspIHsKKyAgICBhbmV2ZW50ID0gKihzdGF0ZS0+RXZlbnRQdHIgKyBmcm9tKSA7CisgICAgd2hpbGUgKGFuZXZlbnQpIHsKKyAgICAgICAoYW5ldmVudC0+ZnVuYykoc3RhdGUpIDsKKyAgICAgICBzdGF0ZS0+RXZlbnRTZXQtLSA7CisgICAgICAgYW5ldmVudCA9IGFuZXZlbnQtPm5leHQgOworICAgICAgIH0KKyAgICAqKHN0YXRlLT5FdmVudFB0ciArIGZyb20pID0gTlVMTCA7CisgICAgfQorIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogVGhpcyByb3V0aW5lIGlzIHJldHVybnMgdGhlIG51bWJlciBvZiBjbG9jayB0aWNrcyBzaW5jZSB0aGUgbGFzdCByZXNldC4gICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bnNpZ25lZCBsb25nIEFSTXVsX1RpbWUoQVJNdWxfU3RhdGUgKnN0YXRlKQore3JldHVybihzdGF0ZS0+TnVtU2N5Y2xlcyArIHN0YXRlLT5OdW1OY3ljbGVzICsKKyAgICAgICAgc3RhdGUtPk51bUljeWNsZXMgKyBzdGF0ZS0+TnVtQ2N5Y2xlcyArIHN0YXRlLT5OdW1GY3ljbGVzKSA7Cit9CmRpZmYgLS1naXQgYS9zaW0vYXJtL2FybXZpcnQuYyBiL3NpbS9hcm0vYXJtdmlydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZWJlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vYXJtL2FybXZpcnQuYwpAQCAtMCwwICsxLDQ5MSBAQAorLyogIGFybXZpcnQuYyAtLSBBUk11bGF0b3IgdmlydHVhbCBtZW1vcnkgaW50ZXJhY2U6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgorICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyBhIGNvbXBsZXRlIEFSTXVsYXRvciBtZW1vcnkgbW9kZWwsIG1vZGVsbGluZyBhCisidmlydHVhbCBtZW1vcnkiIHN5c3RlbS4gQSBtdWNoIHNpbXBsZXIgbW9kZWwgY2FuIGJlIGZvdW5kIGluIGFybWZhc3QuYywKK2FuZCB0aGF0IG1vZGVsIGdvZXMgZmFzdGVyIHRvbywgYnV0IGhhcyBhIGZpeGVkIGFtb3VudCBvZiBtZW1vcnkuIFRoaXMKK21vZGVsJ3MgbWVtb3J5IGhhcyA2NEsgcGFnZXMsIGFsbG9jYXRlZCBvbiBkZW1hbmQgZnJvbSBhIDY0SyBlbnRyeSBwYWdlCit0YWJsZS4gVGhlIHJvdXRpbmVzIFB1dFdvcmQgYW5kIEdldFdvcmQgaW1wbGVtZW50IHRoaXMuIFBhZ2VzIGFyZSBuZXZlcgorZnJlZWQgYXMgdGhleSBtaWdodCBiZSBuZWVkZWQgYWdhaW4uIEEgc2luZ2xlIGFyZWEgb2YgbWVtb3J5IG1heSBiZQorZGVmaW5lZCB0byBnZW5lcmF0ZSBhYm9ydHMuICovCisKKyNpbmNsdWRlICJhcm1vcHRzLmgiCisjaW5jbHVkZSAiYXJtZGVmcy5oIgorCisjaWZkZWYgVkFMSURBVEUgLyogZm9yIHJ1bm5pbmcgdGhlIHZhbGlkYXRlIHN1aXRlICovCisjZGVmaW5lIFRVQkUgNDggKiAxMDI0ICogMTAyNCAvKiB3cml0ZSBhIGNoYXIgb24gdGhlIHNjcmVlbiAqLworI2RlZmluZSBBQk9SVFMgMQorI2VuZGlmCisKKyNkZWZpbmUgQUJPUlRTCisKKyNpZmRlZiBBQk9SVFMgLyogdGhlIG1lbW9yeSBzeXN0ZW0gd2lsbCBhYm9ydCAqLworLyogRm9yIHRoZSBvbGQgdGVzdCBzdWl0ZSBBYm9ydCBiZXR3ZWVuIDMyIEtieXRlcyBhbmQgMzIgTWJ5dGVzCisgICBGb3IgdGhlIG5ldyB0ZXN0IHN1aXRlIEFib3J0IGJldHdlZW4gOCBNYnl0ZXMgYW5kIDI2IE1ieXRlcyAqLworLyogI2RlZmluZSBMT1dBQk9SVCAzMiAqIDEwMjQKKyNkZWZpbmUgSElHSEFCT1JUIDMyICogMTAyNCAqIDEwMjQgKi8KKyNkZWZpbmUgTE9XQUJPUlQgOCAqIDEwMjQgKiAxMDI0CisjZGVmaW5lIEhJR0hBQk9SVCAyNiAqIDEwMjQgKiAxMDI0CisKKyNlbmRpZgorCisjZGVmaW5lIE5VTVBBR0VTIDY0ICogMTAyNAorI2RlZmluZSBQQUdFU0laRSA2NCAqIDEwMjQKKyNkZWZpbmUgUEFHRUJJVFMgMTYKKyNkZWZpbmUgT0ZGU0VUQklUUyAweGZmZmYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgIEdldCBhIFdvcmQgZnJvbSBWaXJ0dWFsIE1lbW9yeSwgbWF5YmUgYWxsb2NhdGluZyB0aGUgcGFnZSAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgQVJNd29yZAorR2V0V29yZCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhZGRyZXNzKQoreworICBBUk13b3JkICAgIHBhZ2U7CisgIEFSTXdvcmQgICAgb2Zmc2V0OworICBBUk13b3JkICoqIHBhZ2V0YWJsZTsKKyAgQVJNd29yZCAqICBwYWdlcHRyOworCisgIHBhZ2UgICAgICA9IGFkZHJlc3MgPj4gUEFHRUJJVFM7CisgIG9mZnNldCAgICA9IChhZGRyZXNzICYgT0ZGU0VUQklUUykgPj4gMjsKKyAgcGFnZXRhYmxlID0gKEFSTXdvcmQgKiopIHN0YXRlLT5NZW1EYXRhUHRyOworICBwYWdlcHRyICAgPSAqKHBhZ2V0YWJsZSArIHBhZ2UpOworICAKKyAgaWYgKHBhZ2VwdHIgPT0gTlVMTCkKKyAgICB7CisgICAgICBwYWdlcHRyID0gKEFSTXdvcmQgKikgbWFsbG9jIChQQUdFU0laRSk7CisgICAgICAKKyAgICAgIGlmIChwYWdlcHRyID09IE5VTEwpCisJeworCSAgcGVycm9yICgiQVJNdWxhdG9yIGNhbid0IGFsbG9jYXRlIFZNIHBhZ2UiKTsKKwkgIGV4aXQgKDEyKTsKKwl9CisgICAgICAKKyAgICAgICoocGFnZXRhYmxlICsgcGFnZSkgPSBwYWdlcHRyOworICAgIH0KKyAgCisgIHJldHVybiAqKHBhZ2VwdHIgKyBvZmZzZXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgUHV0IGEgV29yZCBpbnRvIFZpcnR1YWwgTWVtb3J5LCBtYXliZSBhbGxvY2F0aW5nIHRoZSBwYWdlICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitQdXRXb3JkIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MsIEFSTXdvcmQgZGF0YSkKK3sKKyAgQVJNd29yZCAgICBwYWdlOworICBBUk13b3JkICAgIG9mZnNldDsKKyAgQVJNd29yZCAqKiBwYWdldGFibGU7CisgIEFSTXdvcmQgKiAgcGFnZXB0cjsKKyAgCisgIHBhZ2UgICAgICA9IGFkZHJlc3MgPj4gUEFHRUJJVFM7CisgIG9mZnNldCAgICA9IChhZGRyZXNzICYgT0ZGU0VUQklUUykgPj4gMjsKKyAgcGFnZXRhYmxlID0gKEFSTXdvcmQgKiopc3RhdGUtPk1lbURhdGFQdHI7CisgIHBhZ2VwdHIgICA9ICoocGFnZXRhYmxlICsgcGFnZSk7CisgIAorICBpZiAocGFnZXB0ciA9PSBOVUxMKQorICAgIHsKKyAgICAgIHBhZ2VwdHIgPSAoQVJNd29yZCAqKSBtYWxsb2MgKFBBR0VTSVpFKTsKKyAgICAgIGlmIChwYWdlcHRyID09IE5VTEwpCisJeworCSAgcGVycm9yICgiQVJNdWxhdG9yIGNhbid0IGFsbG9jYXRlIFZNIHBhZ2UiKTsKKwkgIGV4aXQoMTMpOworCX0KKyAgICAgIAorICAgICAgKihwYWdldGFibGUgKyBwYWdlKSA9IHBhZ2VwdHI7CisgICAgfQorICAKKyAgKihwYWdlcHRyICsgb2Zmc2V0KSA9IGRhdGE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgIEluaXRpYWxpc2UgdGhlIG1lbW9yeSBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5zaWduZWQKK0FSTXVsX01lbW9yeUluaXQgKEFSTXVsX1N0YXRlICogc3RhdGUsIHVuc2lnbmVkIGxvbmcgaW5pdG1lbXNpemUpCit7CisgIEFSTXdvcmQgKiogcGFnZXRhYmxlOworICB1bnNpZ25lZCAgIHBhZ2U7CisKKyAgaWYgKGluaXRtZW1zaXplKQorICAgIHN0YXRlLT5NZW1TaXplID0gaW5pdG1lbXNpemU7CisgIAorICBwYWdldGFibGUgPSAoQVJNd29yZCAqKikgbWFsbG9jIChzaXplb2YgKEFSTXdvcmQpICogTlVNUEFHRVMpOworICAKKyAgaWYgKHBhZ2V0YWJsZSA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgCisgIGZvciAocGFnZSA9IDAgOyBwYWdlIDwgTlVNUEFHRVMgOyBwYWdlKyspCisgICAgKihwYWdldGFibGUgKyBwYWdlKSA9IE5VTEw7CisgIAorICBzdGF0ZS0+TWVtRGF0YVB0ciA9ICh1bnNpZ25lZCBjaGFyICopcGFnZXRhYmxlOworCisgIEFSTXVsX0NvbnNvbGVQcmludCAoc3RhdGUsICIsIDQgR2IgbWVtb3J5Iik7CisgIAorIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgdGhlIG1lbW9yeSBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK0FSTXVsX01lbW9yeUV4aXQgKEFSTXVsX1N0YXRlICogc3RhdGUpCit7CisgIEFSTXdvcmQgICAgcGFnZTsKKyAgQVJNd29yZCAqKiBwYWdldGFibGU7CisgIEFSTXdvcmQgKiAgcGFnZXB0cjsKKworICBwYWdldGFibGUgPSAoQVJNd29yZCAqKilzdGF0ZS0+TWVtRGF0YVB0cjsKKyAgZm9yIChwYWdlID0gMCA7IHBhZ2UgPCBOVU1QQUdFUyA7IHBhZ2UrKykKKyAgICB7CisgICAgICBwYWdlcHRyID0gKihwYWdldGFibGUgKyBwYWdlKTsKKyAgICAgIGlmIChwYWdlcHRyICE9IE5VTEwpCisJZnJlZSAoKGNoYXIgKilwYWdlcHRyKTsKKyAgICB9CisgIGZyZWUgKChjaGFyICopcGFnZXRhYmxlKTsKKyAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICBSZUxvYWQgSW5zdHJ1Y3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQVJNd29yZAorQVJNdWxfUmVMb2FkSW5zdHIgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBpc2l6ZSkKK3sKKyNpZmRlZiBBQk9SVFMKKyAgaWYgKGFkZHJlc3MgPj0gTE9XQUJPUlQgJiYgYWRkcmVzcyA8IEhJR0hBQk9SVCkgCisgICAgeworICAgICAgQVJNdWxfUFJFRkVUQ0hBQk9SVCAoYWRkcmVzcyk7CisgICAgICByZXR1cm4gQVJNdWxfQUJPUlRXT1JEOworICAgIH0KKyBlbHNlCisgICB7CisgICAgIEFSTXVsX0NMRUFSQUJPUlQ7CisgICB9CisjZW5kaWYKKworIGlmICgoaXNpemUgPT0gMikgJiYgKGFkZHJlc3MgJiAweDIpKQorICAgeworICAgICAvKiBXZSByZXR1cm4gdGhlIG5leHQgdHdvIGhhbGZ3b3JkczogKi8KKyAgICAgQVJNd29yZCBsbyA9IEdldFdvcmQgKHN0YXRlLCBhZGRyZXNzKTsKKyAgICAgQVJNd29yZCBoaSA9IEdldFdvcmQgKHN0YXRlLCBhZGRyZXNzICsgNCk7CisKKyAgICAgaWYgKHN0YXRlLT5iaWdlbmRTaWcgPT0gSElHSCkKKyAgICAgICByZXR1cm4gKGxvIDw8IDE2KSB8IChoaSA+PiAxNik7CisgICAgIGVsc2UKKyAgICAgICByZXR1cm4gKChoaSAmIDB4RkZGRikgPDwgMTYpIHwgKGxvID4+IDE2KTsKKyAgIH0KKworICByZXR1cm4gR2V0V29yZCAoc3RhdGUsIGFkZHJlc3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICBMb2FkIEluc3RydWN0aW9uLCBTZXF1ZW50aWFsIEN5Y2xlICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0FSTXdvcmQKK0FSTXVsX0xvYWRJbnN0clMgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBpc2l6ZSkKK3sKKyAgc3RhdGUtPk51bVNjeWNsZXMgKys7CisKKyNpZmRlZiBIT1VSR0xBU1MKKyAgaWYgKCggc3RhdGUtPk51bVNjeWNsZXMgJiBIT1VSR0xBU1NfUkFURSApID09IDApCisgICAgeworICAgICAgSE9VUkdMQVNTOworICAgIH0KKyNlbmRpZgorCisgIHJldHVybiBBUk11bF9SZUxvYWRJbnN0ciAoc3RhdGUsIGFkZHJlc3MsIGlzaXplKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgIExvYWQgSW5zdHJ1Y3Rpb24sIE5vbiBTZXF1ZW50aWFsIEN5Y2xlICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitBUk13b3JkCitBUk11bF9Mb2FkSW5zdHJOIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MsIEFSTXdvcmQgaXNpemUpCit7CisgIHN0YXRlLT5OdW1OY3ljbGVzICsrOworCisgIHJldHVybiBBUk11bF9SZUxvYWRJbnN0ciAoc3RhdGUsIGFkZHJlc3MsIGlzaXplKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgUmVhZCBXb3JkIChidXQgZG9uJ3QgdGVsbCBhbnlvbmUhKSAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitBUk13b3JkCitBUk11bF9SZWFkV29yZCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhZGRyZXNzKQoreworI2lmZGVmIEFCT1JUUworICBpZiAoYWRkcmVzcyA+PSBMT1dBQk9SVCAmJiBhZGRyZXNzIDwgSElHSEFCT1JUKQorICAgIHsKKyAgICAgIEFSTXVsX0RBVEFBQk9SVCAoYWRkcmVzcyk7CisgICAgICByZXR1cm4gQVJNdWxfQUJPUlRXT1JEOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEFSTXVsX0NMRUFSQUJPUlQ7CisgICAgfQorI2VuZGlmCisKKyAgcmV0dXJuIEdldFdvcmQgKHN0YXRlLCBhZGRyZXNzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICBMb2FkIFdvcmQsIFNlcXVlbnRpYWwgQ3ljbGUgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitBUk13b3JkCitBUk11bF9Mb2FkV29yZFMgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcykKK3sKKyAgc3RhdGUtPk51bVNjeWNsZXMgKys7CisKKyAgcmV0dXJuIEFSTXVsX1JlYWRXb3JkIChzdGF0ZSwgYWRkcmVzcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgIExvYWQgV29yZCwgTm9uIFNlcXVlbnRpYWwgQ3ljbGUgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQVJNd29yZAorQVJNdWxfTG9hZFdvcmROIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MpCit7CisgIHN0YXRlLT5OdW1OY3ljbGVzICsrOworICAKKyAgcmV0dXJuIEFSTXVsX1JlYWRXb3JkIChzdGF0ZSwgYWRkcmVzcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgTG9hZCBIYWxmd29yZCwgKE5vbiBTZXF1ZW50aWFsIEN5Y2xlKSAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQVJNd29yZAorQVJNdWxfTG9hZEhhbGZXb3JkIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MpCit7CisgIEFSTXdvcmQgdGVtcCwgb2Zmc2V0OworCisgIHN0YXRlLT5OdW1OY3ljbGVzICsrOworCisgIHRlbXAgICA9IEFSTXVsX1JlYWRXb3JkIChzdGF0ZSwgYWRkcmVzcyk7CisgIG9mZnNldCA9ICgoKEFSTXdvcmQpc3RhdGUtPmJpZ2VuZFNpZyAqIDIpIF4gKGFkZHJlc3MgJiAyKSkgPDwgMzsgLyogYml0IG9mZnNldCBpbnRvIHRoZSB3b3JkICovCisKKyAgcmV0dXJuICh0ZW1wID4+IG9mZnNldCkgJiAweGZmZmY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgIFJlYWQgQnl0ZSAoYnV0IGRvbid0IHRlbGwgYW55b25lISkgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQVJNd29yZAorQVJNdWxfUmVhZEJ5dGUgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcykKK3sKKyAgQVJNd29yZCB0ZW1wLCBvZmZzZXQ7CisKKyB0ZW1wICAgPSBBUk11bF9SZWFkV29yZCAoc3RhdGUsIGFkZHJlc3MpOworIG9mZnNldCA9ICgoKEFSTXdvcmQpc3RhdGUtPmJpZ2VuZFNpZyAqIDMpIF4gKGFkZHJlc3MgJiAzKSkgPDwgMzsgLyogYml0IG9mZnNldCBpbnRvIHRoZSB3b3JkICovCisKKyByZXR1cm4gKHRlbXAgPj4gb2Zmc2V0ICYgMHhmZkwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgIExvYWQgQnl0ZSwgKE5vbiBTZXF1ZW50aWFsIEN5Y2xlKSAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0FSTXdvcmQKK0FSTXVsX0xvYWRCeXRlIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MpCit7CisgIHN0YXRlLT5OdW1OY3ljbGVzICsrOworCisgIHJldHVybiBBUk11bF9SZWFkQnl0ZSAoc3RhdGUsIGFkZHJlc3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgIFdyaXRlIFdvcmQgKGJ1dCBkb24ndCB0ZWxsIGFueW9uZSEpICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK0FSTXVsX1dyaXRlV29yZCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIGRhdGEpCit7CisjaWZkZWYgQUJPUlRTCisgIGlmIChhZGRyZXNzID49IExPV0FCT1JUICYmIGFkZHJlc3MgPCBISUdIQUJPUlQpCisgICAgeworICAgICAgQVJNdWxfREFUQUFCT1JUIChhZGRyZXNzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBBUk11bF9DTEVBUkFCT1JUOworICAgIH0KKyNlbmRpZgorCisgIFB1dFdvcmQgKHN0YXRlLCBhZGRyZXNzLCBkYXRhKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgIFN0b3JlIFdvcmQsIFNlcXVlbnRpYWwgQ3ljbGUgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCitBUk11bF9TdG9yZVdvcmRTIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MsIEFSTXdvcmQgZGF0YSkKK3sKKyAgc3RhdGUtPk51bVNjeWNsZXMgKys7CisKKyAgQVJNdWxfV3JpdGVXb3JkIChzdGF0ZSwgYWRkcmVzcywgZGF0YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICBTdG9yZSBXb3JkLCBOb24gU2VxdWVudGlhbCBDeWNsZSAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK0FSTXVsX1N0b3JlV29yZE4gKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBkYXRhKQoreworICBzdGF0ZS0+TnVtTmN5Y2xlcyArKzsKKworICBBUk11bF9Xcml0ZVdvcmQgKHN0YXRlLCBhZGRyZXNzLCBkYXRhKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgIFN0b3JlIEhhbGZXb3JkLCAoTm9uIFNlcXVlbnRpYWwgQ3ljbGUpICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCitBUk11bF9TdG9yZUhhbGZXb3JkIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIGFkZHJlc3MsIEFSTXdvcmQgZGF0YSkKK3sKKyAgQVJNd29yZCB0ZW1wLCBvZmZzZXQ7CisKKyAgc3RhdGUtPk51bU5jeWNsZXMgKys7CisgCisjaWZkZWYgVkFMSURBVEUKKyAgaWYgKGFkZHJlc3MgPT0gVFVCRSkKKyAgICB7CisgICAgICBpZiAoZGF0YSA9PSA0KQorCXN0YXRlLT5FbXVsYXRlID0gRkFMU0U7CisgICAgICBlbHNlCisJKHZvaWQpIHB1dGMgKChjaGFyKWRhdGEsIHN0ZGVycik7IC8qIFdyaXRlIENoYXIgKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICB0ZW1wICAgPSBBUk11bF9SZWFkV29yZCAoc3RhdGUsIGFkZHJlc3MpOworICBvZmZzZXQgPSAoKChBUk13b3JkKXN0YXRlLT5iaWdlbmRTaWcgKiAyKSBeIChhZGRyZXNzICYgMikpIDw8IDM7IC8qIGJpdCBvZmZzZXQgaW50byB0aGUgd29yZCAqLworIAorICBQdXRXb3JkIChzdGF0ZSwgYWRkcmVzcywgKHRlbXAgJiB+KDB4ZmZmZkwgPDwgb2Zmc2V0KSkgfCAoKGRhdGEgJiAweGZmZmZMKSA8PCBvZmZzZXQpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICBXcml0ZSBCeXRlIChidXQgZG9uJ3QgdGVsbCBhbnlvbmUhKSAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCitBUk11bF9Xcml0ZUJ5dGUgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBkYXRhKQoreworICBBUk13b3JkIHRlbXAsIG9mZnNldDsKKworICB0ZW1wICAgPSBBUk11bF9SZWFkV29yZCAoc3RhdGUsIGFkZHJlc3MpOworICBvZmZzZXQgPSAoKChBUk13b3JkKXN0YXRlLT5iaWdlbmRTaWcgKiAzKSBeIChhZGRyZXNzICYgMykpIDw8IDM7IC8qIGJpdCBvZmZzZXQgaW50byB0aGUgd29yZCAqLworICAKKyAgUHV0V29yZCAoc3RhdGUsIGFkZHJlc3MsICh0ZW1wICYgfigweGZmTCA8PCBvZmZzZXQpKSB8ICgoZGF0YSAmIDB4ZmZMKSA8PCBvZmZzZXQpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgIFN0b3JlIEJ5dGUsIChOb24gU2VxdWVudGlhbCBDeWNsZSkgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCitBUk11bF9TdG9yZUJ5dGUgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBkYXRhKQoreworICBzdGF0ZS0+TnVtTmN5Y2xlcyArKzsKKworI2lmZGVmIFZBTElEQVRFCisgIGlmIChhZGRyZXNzID09IFRVQkUpCisgICAgeworICAgICAgaWYgKGRhdGEgPT0gNCkKKwlzdGF0ZS0+RW11bGF0ZSA9IEZBTFNFOworICAgICAgZWxzZQorCSh2b2lkKSBwdXRjICgoY2hhcilkYXRhLHN0ZGVycik7IC8qIFdyaXRlIENoYXIgKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICBBUk11bF9Xcml0ZUJ5dGUgKHN0YXRlLCBhZGRyZXNzLCBkYXRhKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgU3dhcCBXb3JkLCAoVHdvIE5vbiBTZXF1ZW50aWFsIEN5Y2xlcykgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitBUk13b3JkCitBUk11bF9Td2FwV29yZCAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgQVJNd29yZCBhZGRyZXNzLCBBUk13b3JkIGRhdGEpCit7CisgIEFSTXdvcmQgdGVtcDsKKworICBzdGF0ZS0+TnVtTmN5Y2xlcyArKzsKKworICB0ZW1wID0gQVJNdWxfUmVhZFdvcmQgKHN0YXRlLCBhZGRyZXNzKTsKKyAgCisgIHN0YXRlLT5OdW1OY3ljbGVzICsrOworICAKKyAgUHV0V29yZCAoc3RhdGUsIGFkZHJlc3MsIGRhdGEpOworICAKKyAgcmV0dXJuIHRlbXA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgIFN3YXAgQnl0ZSwgKFR3byBOb24gU2VxdWVudGlhbCBDeWNsZXMpICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQVJNd29yZAorQVJNdWxfU3dhcEJ5dGUgKEFSTXVsX1N0YXRlICogc3RhdGUsIEFSTXdvcmQgYWRkcmVzcywgQVJNd29yZCBkYXRhKQoreworICBBUk13b3JkIHRlbXA7CisKKyAgdGVtcCA9IEFSTXVsX0xvYWRCeXRlIChzdGF0ZSwgYWRkcmVzcyk7CisgIEFSTXVsX1N0b3JlQnl0ZSAoc3RhdGUsIGFkZHJlc3MsIGRhdGEpOworICAKKyAgcmV0dXJuIHRlbXA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudCBJIEN5Y2xlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorQVJNdWxfSWN5Y2xlcyAoQVJNdWxfU3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgbnVtYmVyLCBBUk13b3JkIGFkZHJlc3MpCit7CisgIHN0YXRlLT5OdW1JY3ljbGVzICs9IG51bWJlcjsKKyAgQVJNdWxfQ0xFQVJBQk9SVDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50IEMgQ3ljbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCitBUk11bF9DY3ljbGVzIChBUk11bF9TdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCBudW1iZXIsIEFSTXdvcmQgYWRkcmVzcykKK3sKKyAgc3RhdGUtPk51bUNjeWNsZXMgKz0gbnVtYmVyOworICBBUk11bF9DTEVBUkFCT1JUOworfQorCisKKwpkaWZmIC0tZ2l0IGEvc2ltL2FybS9iYWcuYyBiL3NpbS9hcm0vYmFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRiOTY2MQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9hcm0vYmFnLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qICBiYWcuYyAtLSBBUk11bGF0b3Igc3VwcG9ydCBjb2RlOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBiYWcuYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPZmZlcnMgYSBkYXRhIHN0cnVjdHVyZSBmb3Igc3RvcmluZyBhbmQgZ2V0dGluZyBwYWlycyBvZiBudW1iZXIuICovCisvKiBUaGUgbnVtYmVycyBhcmUgc3RvcmVkIHRvZ2V0aGVyLCBwdXQgb25lIGNhbiBiZSBsb29rZWQgdXAgYnkgICAgICovCisvKiBxdW90aW5nIHRoZSBvdGhlci4gIElmIGEgbmV3IHBhaXIgaXMgZW50ZXJlZCBhbmQgb25lIG9mIHRoZSAgICAgICovCisvKiBudW1iZXJzIGlzIGEgcmVwZWF0IG9mIGEgcHJldmlvdXMgcGFpciwgdGhlbiB0aGUgcHJldmlvcyBwYWlyICAgICovCisvKiBpcyBkZWxldGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiYWcuaCIKKworI2RlZmluZSBIQVNIX1RBQkxFX1NJWkUgMjU2CisjZGVmaW5lIGhhc2goeCkgKCgoeCkmMHhmZileKCgoeCk+PjgpJjB4ZmYpXigoKHgpPj4xNikmMHhmZileKCgoeCk+PjI0KSYweGZmKSkKKwordHlwZWRlZiBzdHJ1Y3QgaGFzaGVudHJ5IHsKKyAgc3RydWN0IGhhc2hlbnRyeSAqbmV4dDsKKyAgaW50IGZpcnN0OworICBpbnQgc2Vjb25kOworfSBIYXNoZW50cnk7CisKK0hhc2hlbnRyeSAqbG9va3VwYnlmaXJzdFtIQVNIX1RBQkxFX1NJWkVdOworSGFzaGVudHJ5ICpsb29rdXBieXNlY29uZFtIQVNIX1RBQkxFX1NJWkVdOworCit2b2lkIGFkZHRvbGlzdChIYXNoZW50cnkgKiphZGQsIGxvbmcgZmlyc3QsIGxvbmcgc2Vjb25kKSB7CisgIHdoaWxlICgqYWRkKSBhZGQgPSAmKCgqYWRkKS0+bmV4dCk7CisgIC8qIE1hbGxvYyB3aWxsIG5ldmVyIGZhaWw/IDpvKCAqLworICAoKmFkZCkgPSAoSGFzaGVudHJ5ICopIG1hbGxvYyhzaXplb2YoSGFzaGVudHJ5KSk7CisgICgqYWRkKS0+bmV4dCA9IChIYXNoZW50cnkgKikgMDsKKyAgKCphZGQpLT5maXJzdCA9IGZpcnN0OworICAoKmFkZCktPnNlY29uZCA9IHNlY29uZDsKK30KKwordm9pZCBraWxsd2hvbGVsaXN0KEhhc2hlbnRyeSAqcCkgeworICBIYXNoZW50cnkgKnE7CisKKyAgd2hpbGUgKHApIHsKKyAgICBxID0gcDsKKyAgICBwID0gcC0+bmV4dDsKKyAgICBmcmVlKHEpOworICB9Cit9CisKK3ZvaWQgcmVtb3ZlZnJvbWxpc3QoSGFzaGVudHJ5ICoqcCwgbG9uZyBmaXJzdCwgbG9uZyBzZWNvbmQpIHsKKyAgSGFzaGVudHJ5ICpxOworCisgIHdoaWxlICgqcCkgeworICAgIGlmICgoKnApLT5maXJzdCA9PSBmaXJzdCkgeworICAgICAgcSA9ICgqcCktPm5leHQ7CisgICAgICBmcmVlKCpwKTsKKyAgICAgICpwID0gcTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgcCA9ICYoKCpwKS0+bmV4dCk7CisgIH0KK30KKwordm9pZCBCQUdfcHV0cGFpcihsb25nIGZpcnN0LCBsb25nIHNlY29uZCkgeworICBsb25nIGp1bms7CisKKyAgaWYgKEJBR19nZXRmaXJzdCgmanVuaywgc2Vjb25kKSAhPSBOT19TVUNIX1BBSVIpCisgICAgQkFHX2tpbGxwYWlyX2J5c2Vjb25kKHNlY29uZCk7CisgIGFkZHRvbGlzdCgmbG9va3VwYnlmaXJzdFtoYXNoKGZpcnN0KV0sIGZpcnN0LCBzZWNvbmQpOworICBhZGR0b2xpc3QoJmxvb2t1cGJ5c2Vjb25kW2hhc2goc2Vjb25kKV0sIGZpcnN0LCBzZWNvbmQpOworfQorCitCYWdfZXJyb3IgQkFHX2dldGZpcnN0KGxvbmcgKmZpcnN0LCBsb25nIHNlY29uZCkgeworICBIYXNoZW50cnkgKmxvb2s7CisKKyAgbG9vayA9IGxvb2t1cGJ5c2Vjb25kW2hhc2goc2Vjb25kKV07CisgIHdoaWxlKGxvb2spIGlmIChsb29rLT5zZWNvbmQgPT0gc2Vjb25kKSB7CisgICAgKmZpcnN0ID0gbG9vay0+Zmlyc3Q7CisgICAgcmV0dXJuIE5PX0VSUk9SOworICB9CisgIHJldHVybiBOT19TVUNIX1BBSVI7Cit9CisKK0JhZ19lcnJvciBCQUdfZ2V0c2Vjb25kKGxvbmcgZmlyc3QsIGxvbmcgKnNlY29uZCkgeworICBIYXNoZW50cnkgKmxvb2s7CisKKyAgbG9vayA9IGxvb2t1cGJ5Zmlyc3RbaGFzaChmaXJzdCldOworICB3aGlsZShsb29rKSB7CisgICAgaWYgKGxvb2stPmZpcnN0ID09IGZpcnN0KSB7CisgICAgICAqc2Vjb25kID0gbG9vay0+c2Vjb25kOworICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBsb29rID0gbG9vay0+bmV4dDsKKyAgfQorICByZXR1cm4gTk9fU1VDSF9QQUlSOworfQorCitCYWdfZXJyb3IgQkFHX2tpbGxwYWlyX2J5Zmlyc3QobG9uZyBmaXJzdCkgeworICBsb25nIHNlY29uZDsKKworICBpZiAoQkFHX2dldHNlY29uZChmaXJzdCwgJnNlY29uZCkgPT0gTk9fU1VDSF9QQUlSKQorICAgIHJldHVybiBOT19TVUNIX1BBSVI7CisgIHJlbW92ZWZyb21saXN0KCZsb29rdXBieWZpcnN0W2hhc2goZmlyc3QpXSwgZmlyc3QsIHNlY29uZCk7CisgIHJlbW92ZWZyb21saXN0KCZsb29rdXBieXNlY29uZFtoYXNoKHNlY29uZCldLCBmaXJzdCwgc2Vjb25kKTsKKyAgcmV0dXJuIE5PX0VSUk9SOworfQorCitCYWdfZXJyb3IgQkFHX2tpbGxwYWlyX2J5c2Vjb25kKGxvbmcgc2Vjb25kKSB7CisgIGxvbmcgZmlyc3Q7CisgIAorICBpZiAoQkFHX2dldGZpcnN0KCZmaXJzdCwgc2Vjb25kKSA9PSBOT19TVUNIX1BBSVIpCisgICAgcmV0dXJuIE5PX1NVQ0hfUEFJUjsKKyAgcmVtb3ZlZnJvbWxpc3QoJmxvb2t1cGJ5Zmlyc3RbaGFzaChmaXJzdCldLCBmaXJzdCwgc2Vjb25kKTsKKyAgcmVtb3ZlZnJvbWxpc3QoJmxvb2t1cGJ5c2Vjb25kW2hhc2goc2Vjb25kKV0sIGZpcnN0LCBzZWNvbmQpOworICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQkFHX25ld2JhZygpIHsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAga2lsbHdob2xlbGlzdChsb29rdXBieWZpcnN0W2ldKTsKKyAgICBraWxsd2hvbGVsaXN0KGxvb2t1cGJ5c2Vjb25kW2ldKTsKKyAgICBsb29rdXBieWZpcnN0W2ldID0gbG9va3VwYnlzZWNvbmRbaV0gPSAoSGFzaGVudHJ5ICopIDA7CisgIH0KK30KKyAgCisKKworCisKZGlmZiAtLWdpdCBhL3NpbS9hcm0vYmFnLmggYi9zaW0vYXJtL2JhZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MTRlOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vYXJtL2JhZy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qICBiYWcuaCAtLSBBUk11bGF0b3Igc3VwcG9ydCBjb2RlOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBiYWcuaDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBIZWFkZXIgZmlsZSBmb3IgYmFnLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPZmZlcnMgYSBkYXRhIHN0cnVjdHVyZSBmb3Igc3RvcmluZyBhbmQgZ2V0dGluZyBwYWlycyBvZiBudW1iZXIuICovCisvKiBUaGUgbnVtYmVycyBhcmUgc3RvcmVkIHRvZ2V0aGVyLCBwdXQgb25lIGNhbiBiZSBsb29rZWQgdXAgYnkgICAgICovCisvKiBxdW90aW5nIHRoZSBvdGhlci4gIElmIGEgbmV3IHBhaXIgaXMgZW50ZXJlZCBhbmQgb25lIG9mIHRoZSAgICAgICovCisvKiBudW1iZXJzIGlzIGEgcmVwZWF0IG9mIGEgcHJldmlvdXMgcGFpciwgdGhlbiB0aGUgcHJldmlvcyBwYWlyICAgICovCisvKiBpcyBkZWxldGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgZW51bSB7CisgIE5PX0VSUk9SLAorICBERUxFVEVEX09MRF9QQUlSLAorICBOT19TVUNIX1BBSVIsCit9IEJhZ19lcnJvcjsKKwordm9pZCBCQUdfcHV0cGFpcihsb25nIGZpcnN0LCBsb25nIHNlY29uZCk7CisKK3ZvaWQgQkFHX25ld2JhZyh2b2lkKTsKK0JhZ19lcnJvciBCQUdfa2lsbHBhaXJfYnlmaXJzdChsb25nIGZpcnN0KTsKK0JhZ19lcnJvciBCQUdfa2lsbHBhaXJfYnlzZWNvbmQobG9uZyBzZWNvbmQpOworCitCYWdfZXJyb3IgQkFHX2dldGZpcnN0KGxvbmcgKmZpcnN0LCBsb25nIHNlY29uZCk7CitCYWdfZXJyb3IgQkFHX2dldHNlY29uZChsb25nIGZpcnN0LCBsb25nICpzZWNvbmQpOworCmRpZmYgLS1naXQgYS9zaW0vYXJtL2NvbW11bmljYXRlLmMgYi9zaW0vYXJtL2NvbW11bmljYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlZTJmMwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9hcm0vY29tbXVuaWNhdGUuYwpAQCAtMCwwICsxLDIyMSBAQAorLyogIGNvbW11bmljYXRlLmMgLS0gQVJNdWxhdG9yIFJEUCBjb21tcyBjb2RlOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbnMgdG8gcmVhZCBhbmQgd3JpdGUgY2hhcmFjdGVycyBvciBncm91cHMgb2YgY2hhcmFjdGVycyAgICAgICAgICovCisvKiBkb3duIHNvY2tldHMgb3IgcGlwZXMuICBUaG9zZSB0aGF0IHJldHVybiBhIHZhbHVlIHJldHVybiAtMSBvbiBmYWlsdXJlICovCisvKiBhbmQgMCBvbiBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlICJhcm1kZWZzLmgiCisKKy8qIFRoZSBzb2NrZXQgdG8gdGhlIGRlYnVnZ2VyICovCitpbnQgZGVidWdzb2NrOworCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyAqLworZXh0ZXJuIGludCBuZmRzOworCisvKiBUaGUgc29ja2V0IGhhbmRsZSAqLworZXh0ZXJuIGludCBzb2NrZXRoYW5kbGU7CisKKy8qIFJlYWQgYW5kIFdyaXRlIHJvdXRpbmVzIGRvd24gYSBwaXBlIG9yIHNvY2tldCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJlYWQgYW4gaW5kaXZpZHVhbCBjaGFyYWN0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQWxsIG90aGVyIHJlYWQgZnVuY3Rpb25zIHJlbHkgb24gdGhpcyBvbmUuICAgICAgICAgICAgICAgICAgICovCisvKiBJdCB3YWl0cyAxNSBzZWNvbmRzIHVudGlsIHRoZXJlIGlzIGEgY2hhcmFjdGVyIGF2YWlsYWJsZTogaWYgKi8KKy8qIG5vIGNoYXJhY3RlciBpcyBhdmFpbGFibGUsIHRoZW4gaXQgdGltZW91dHMgYW5kIHJldHVybnMgLTEuICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgTVlyZWFkX2NoYXIoaW50IHNvY2ssIHVuc2lnbmVkIGNoYXIgKmMpIHsKKyAgaW50IGk7CisgIGZkX3NldCByZWFkZmRzOworICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0PSB7MTUsIDB9OworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gaXNhOworCisgcmV0cnk6CisKKyAgRkRfWkVSTygmcmVhZGZkcyk7CisgIEZEX1NFVChzb2NrLCAmcmVhZGZkcyk7CisgIAorICBpID0gc2VsZWN0KG5mZHMsICZyZWFkZmRzLAorCSAgICAgKGZkX3NldCAqKSAwLAorCSAgICAgKGZkX3NldCAqKSAwLAorCSAgICAgJnRpbWVvdXQpOworCisgIGlmIChpIDwgMCkgeworICAgIHBlcnJvcigic2VsZWN0Iik7CisgICAgZXhpdCgxKTsKKyAgfQorICAKKyAgaWYgKCFpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJyZWFkOiBUaW1lb3V0XG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgCisgIGlmICgoaSA9IHJlYWQoc29jaywgYywgMSkpIDwgMSkgeworICAgIGlmICghaSAmJiBzb2NrID09IGRlYnVnc29jaykgeworICAgICAgZnByaW50ZihzdGRlcnIsICJDb25uZWN0aW9uIHdpdGggZGVidWdnZXIgc2V2ZXJlZC5cbiIpOworICAgICAgLyogVGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IGZvciBhIGRldGFjaGVkIGFybXVsYXRvciwgYnV0CisJIHRoZSBhcm11bGF0b3IgY2Fubm90IGJlIGNvbGQgc3RhcnRlZCBhIHNlY29uZCB0aW1lLCBzbworCSB0aGlzIGlzIHByb2JhYmx5IHByZWZlcmFibGUgdG8gbG9ja2luZyB1cC4gICovCisgICAgICByZXR1cm4gLTE7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhaXRpbmcgZm9yIGNvbm5lY3Rpb24gZnJvbSBkZWJ1Z2dlci4uLiIpOworICAgICAgZGVidWdzb2NrID0gYWNjZXB0KHNvY2tldGhhbmRsZSwgJmlzYSwgJmkpOworICAgICAgaWYgKGRlYnVnc29jayA8IDApIHsgLyogTm93IHdlIGFyZSBpbiBzZXJpb3VzIHRyb3VibGUuLi4gKi8KKwlwZXJyb3IoImFjY2VwdCIpOworCXJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoc3RkZXJyLCAiIGRvbmUuXG5Db25uZWN0aW9uIEVzdGFibGlzaGVkLlxuIik7CisgICAgICBzb2NrID0gZGVidWdzb2NrOworICAgICAgZ290byByZXRyeTsKKyAgICB9CisgICAgcGVycm9yKCJyZWFkIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIAorI2lmZGVmIERFQlVHCisgIGlmIChzb2NrID09IGRlYnVnc29jaykgZnByaW50ZihzdGRlcnIsICI8JTAyeCAiLCAqYyk7CisjZW5kaWYKKyAgCisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJlYWQgYW4gaW5kaXZpZHVhbCBjaGFyYWN0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSXQgd2FpdHMgdW50aWwgdGhlcmUgaXMgYSBjaGFyYWN0ZXIgYXZhaWxhYmxlLiBSZXR1cm5zIC0xIGlmICovCisvKiBhbiBlcnJvciBvY2N1cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IE1ZcmVhZF9jaGFyd2FpdChpbnQgc29jaywgdW5zaWduZWQgY2hhciAqYykgeworICBpbnQgaTsKKyAgZmRfc2V0IHJlYWRmZHM7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBpc2E7CisKKyByZXRyeToKKyAgCisgIEZEX1pFUk8oJnJlYWRmZHMpOworICBGRF9TRVQoc29jaywgJnJlYWRmZHMpOworICAKKyAgaSA9IHNlbGVjdChuZmRzLCAmcmVhZGZkcywKKwkgICAgIChmZF9zZXQgKikgMCwKKwkgICAgIChmZF9zZXQgKikgMCwKKwkgICAgIChzdHJ1Y3QgdGltZXZhbCAqKSAwKTsKKworICBpZiAoaSA8IDApIHsKKyAgICBwZXJyb3IoInNlbGVjdCIpOworICAgIGV4aXQoLTEpOworICB9CisgIAorICBpZiAoKGkgPSByZWFkKHNvY2ssIGMsIDEpKSA8IDEpIHsKKyAgICBpZiAoIWkgJiYgc29jayA9PSBkZWJ1Z3NvY2spIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiQ29ubmVjdGlvbiB3aXRoIGRlYnVnZ2VyIHNldmVyZWQuXG4iKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FpdGluZyBmb3IgY29ubmVjdGlvbiBmcm9tIGRlYnVnZ2VyLi4uIik7CisgICAgICBkZWJ1Z3NvY2sgPSBhY2NlcHQoc29ja2V0aGFuZGxlLCAmaXNhLCAmaSk7CisgICAgICBpZiAoZGVidWdzb2NrIDwgMCkgeyAvKiBOb3cgd2UgYXJlIGluIHNlcmlvdXMgdHJvdWJsZS4uLiAqLworCXBlcnJvcigiYWNjZXB0Iik7CisJcmV0dXJuIC0xOworICAgICAgfQorICAgICAgZnByaW50ZihzdGRlcnIsICIgZG9uZS5cbkNvbm5lY3Rpb24gRXN0YWJsaXNoZWQuXG4iKTsKKyAgICAgIHNvY2sgPSBkZWJ1Z3NvY2s7CisgICAgICBnb3RvIHJldHJ5OworICAgIH0KKyAgICBwZXJyb3IoInJlYWQiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgCisjaWZkZWYgREVCVUcKKyAgaWYgKHNvY2sgPT0gZGVidWdzb2NrKSBmcHJpbnRmKHN0ZGVyciwgIjwlMDJ4ICIsICpjKTsKKyNlbmRpZgorICAKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgTVl3cml0ZV9jaGFyKGludCBzb2NrLCB1bnNpZ25lZCBjaGFyIGMpIHsKKworICBpZiAod3JpdGUoc29jaywgJmMsIDEpIDwgMSkKKyAgICBwZXJyb3IoIndyaXRlIik7CisjaWZkZWYgREVCVUcKKyAgaWYgKHNvY2sgPT0gZGVidWdzb2NrKSBmcHJpbnRmKHN0ZGVyciwgIj4lMDJ4ICIsIGMpOyAgCisjZW5kaWYKK30KKworaW50IE1ZcmVhZF93b3JkKGludCBzb2NrLCBBUk13b3JkICpoZXJlKSB7CisgIHVuc2lnbmVkIGNoYXIgYSwgYiwgYywgZDsKKyAgCisgIGlmIChNWXJlYWRfY2hhcihzb2NrLCAmYSkgPCAwKSByZXR1cm4gLTE7CisgIGlmIChNWXJlYWRfY2hhcihzb2NrLCAmYikgPCAwKSByZXR1cm4gLTE7CisgIGlmIChNWXJlYWRfY2hhcihzb2NrLCAmYykgPCAwKSByZXR1cm4gLTE7CisgIGlmIChNWXJlYWRfY2hhcihzb2NrLCAmZCkgPCAwKSByZXR1cm4gLTE7CisgICpoZXJlID0gYSB8IGIgPDwgOCB8IGMgPDwgMTYgfCBkIDw8IDI0OworICByZXR1cm4gMDsKK30KKwordm9pZCBNWXdyaXRlX3dvcmQoaW50IHNvY2ssIEFSTXdvcmQgaSkgeworICBNWXdyaXRlX2NoYXIoc29jaywgaSAmIDB4ZmYpOworICBNWXdyaXRlX2NoYXIoc29jaywgKGkgJiAweGZmMDApID4+IDgpOworICBNWXdyaXRlX2NoYXIoc29jaywgKGkgJiAweGZmMDAwMCkgPj4gMTYpOworICBNWXdyaXRlX2NoYXIoc29jaywgKGkgJiAweGZmMDAwMDAwKSA+PiAyNCk7Cit9CisKK3ZvaWQgTVl3cml0ZV9zdHJpbmcoaW50IHNvY2ssIGNoYXIgKnMpIHsKKyAgaW50IGk7ICAKKyAgZm9yIChpID0gMDsgTVl3cml0ZV9jaGFyKHNvY2ssIHNbaV0pLCBzW2ldOyBpKyspOworfQorCitpbnQgTVlyZWFkX0ZQd29yZChpbnQgc29jaywgY2hhciAqcHV0aW5oZXJlKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICBpZiAoTVlyZWFkX2NoYXIoc29jaywgJnB1dGluaGVyZVtpXSkgPCAwKSByZXR1cm4gLTE7CisgIHJldHVybiAwOworfQorCit2b2lkIE1Zd3JpdGVfRlB3b3JkKGludCBzb2NrLCBjaGFyICpmcm9taGVyZSkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgTVl3cml0ZV9jaGFyKHNvY2ssIGZyb21oZXJlW2ldKTsKK30KKworLyogVGFrZXMgbiBieXRlcyBmcm9tIHNvdXJjZSBhbmQgdGhvc2UgbiBieXRlcyAqLworLyogZG93biB0byBkZXN0ICovCitpbnQgcGFzc29uKGludCBzb3VyY2UsIGludCBkZXN0LCBpbnQgbikgeworICBjaGFyICpwOworICBpbnQgaTsKKyAgCisgIHAgPSAoY2hhciAqKSBtYWxsb2Mobik7CisgIGlmICghcCkgeworICAgIHBlcnJvcigiT3V0IG9mIG1lbW9yeVxuIik7CisgICAgZXhpdCgxKTsKKyAgfQorICBpZiAobikgeworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICBpZiAoTVlyZWFkX2NoYXIoc291cmNlLCAmcFtpXSkgPCAwKSByZXR1cm4gLTE7CisgICAgCisjaWZkZWYgREVCVUcKKyAgICBpZiAoZGVzdCA9PSBkZWJ1Z3NvY2spIAorICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgZnByaW50ZihzdGRlcnIsICIpJTAyeCAiLCAodW5zaWduZWQgY2hhcikgcFtpXSk7CisjZW5kaWYKKyAgICAKKyAgICB3cml0ZShkZXN0LCBwLCBuKTsKKyAgfQorICBmcmVlKHApOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NpbS9hcm0vY29tbXVuaWNhdGUuaCBiL3NpbS9hcm0vY29tbXVuaWNhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjMwZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2FybS9jb21tdW5pY2F0ZS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qICBjb21tdW5pY2F0ZS5oIC0tIEFSTXVsYXRvciBjb21tcyBzdXBwb3J0IGRlZm5zOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLworCitpbnQgTVlyZWFkX2NoYXIoaW50IHNvY2ssIHVuc2lnbmVkIGNoYXIgKmMpOwordm9pZCBNWXdyaXRlX2NoYXIoaW50IHNvY2ssIHVuc2lnbmVkIGNoYXIgYyk7CitpbnQgTVlyZWFkX3dvcmQoaW50IHNvY2ssIEFSTXdvcmQgKmhlcmUpOwordm9pZCBNWXdyaXRlX3dvcmQoaW50IHNvY2ssIEFSTXdvcmQgaSk7Cit2b2lkIE1Zd3JpdGVfc3RyaW5nKGludCBzb2NrLCBjaGFyICpzKTsKK2ludCBNWXJlYWRfRlB3b3JkKGludCBzb2NrLCBjaGFyICpwdXRpbmhlcmUpOwordm9pZCBNWXdyaXRlX0ZQd29yZChpbnQgc29jaywgY2hhciAqZnJvbWhlcmUpOworaW50IHBhc3NvbihpbnQgc291cmNlLCBpbnQgZGVzdCwgaW50IG4pOworCitpbnQgd2FpdF9mb3Jfb3NyZXBseShBUk13b3JkICpyZXBseSk7ICAvKiBmcm9tIGtpZC5jICovCisKKyNkZWZpbmUgT1NfU2VuZE5vdGhpbmcgMHgwCisjZGVmaW5lIE9TX1NlbmRDaGFyIDB4MQorI2RlZmluZSBPU19TZW5kV29yZCAweDIKKyNkZWZpbmUgT1NfU2VuZFN0cmluZyAweDMKKworLyogVGhlIHBpcGVzIGJldHdlZW4gdGhlIHR3byBwcm9jZXNzZXMgKi8KK2V4dGVybiBpbnQgbXVta2lkWzJdOworZXh0ZXJuIGludCBraWRtdW1bMl07CisKZGlmZiAtLWdpdCBhL3NpbS9hcm0vY29uZmlnLmluIGIvc2ltL2FybS9jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY4N2EyYgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9hcm0vY29uZmlnLmluCkBAIC0wLDAgKzEsMTU4IEBACisvKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KKyN1bmRlZiBDX0FMTE9DQQorCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCisjdW5kZWYgY29uc3QKKworLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgorICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KKyN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KKyN1bmRlZiBIQVZFX0FMTE9DQQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KKyN1bmRlZiBIQVZFX0FMTE9DQV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KKyN1bmRlZiBIQVZFX01NQVAKKworLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KKyN1bmRlZiBpbmxpbmUKKworLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBvZmZfdAorCisvKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KKyN1bmRlZiBfUE9TSVhfU09VUkNFCisKKy8qIERlZmluZSBhcyB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIChpbnQgb3Igdm9pZCkuICAqLworI3VuZGVmIFJFVFNJR1RZUEUKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgc2l6ZV90CisKKy8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQorICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCisgICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCisgU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcworIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcworIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCisgKi8KKyN1bmRlZiBTVEFDS19ESVJFQ1RJT04KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KKyN1bmRlZiBTVERDX0hFQURFUlMKKworLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCisjdW5kZWYgRU5BQkxFX05MUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCisjdW5kZWYgSEFWRV9HRVRURVhUCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLworI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX3NldGZwdWN3IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fU0VURlBVQ1cKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfRENHRVRURVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0dFVENXRAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cnVzYWdlIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0dFVFJVU0FHRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9NVU5NQVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfUFVURU5WCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NFVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRMT0NBTEUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzaWdhY3Rpb24gZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0lHQUNUSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDSFIKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0aW1lIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1RJTUUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9BUkdaX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfRkNOVExfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmcHVfY29udHJvbC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9GUFVfQ09OVFJPTF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9MSU1JVFNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTE9DQUxFX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX01BTExPQ19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX05MX1RZUEVTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NUUklOR1NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Jlc291cmNlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19USU1FX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9USU1FX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9WQUxVRVNfSApkaWZmIC0tZ2l0IGEvc2ltL2FybS9jb25maWd1cmUgYi9zaW0vYXJtL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNjQ2ZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2FybS9jb25maWd1cmUKQEAgLTAsMCArMSwzODkyIEBACisjISAvYmluL3NoCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3NpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisjIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKKyMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KKworIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMworCisKKworCisKKyMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKKworCisjIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKKworCisjIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIEN5Z3dpbjMyLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgQ1lHV0lOMzIgdG8gInllcyIuCisjIE90aGVyd2lzZSBzZXQgaXQgdG8gIm5vIi4KKworCisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgV2luMzIsIHdpdGhvdXQgdXNpbmcKKyMgQUNfQ0FOT05JQ0FMXyouICBJZiBzbywgc2V0IG91dHB1dCB2YXJpYWJsZSBFWEVFWFQgdG8gIi5leGUiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICIiLgorCisKKworCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCisgICAgZXhpdCAwIDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Li9jb25maWcubG9nCisKK2VjaG8gIlwKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorIiAxPiY1CisKKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCithY19jb25maWd1cmVfYXJncz0KK2ZvciBhY19hcmcKK2RvCisgIGNhc2UgIiRhY19hcmciIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBlc2FjCitkb25lCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKyMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCisjIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCitpZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID4gY29uZmRlZnMuaAorCisjIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0CisjIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCithY19leGVleHQ9CithY19vYmpleHQ9bworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2Nzc6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBDUFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKKyAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KKyAgQ1BQPSIke0NDLWNjfSAtRSIKKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjkyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2OTg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDcwOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NzE1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3MjYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjczMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0vbGliL2NwcAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCisgIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgorZWxzZQorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCitlY2hvICIkYWNfdCIiJENQUCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3NTc6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQorc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKK2FsbDoKKwlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJworRU9GCisjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KK2V2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAoraWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKK2Vsc2UKKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KK2ZpCitybSAtZiBjb25mdGVzdG1ha2UKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIFNFVF9NQUtFPQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc4NDogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQoraWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCisgIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKK3RoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCitFT0YKKworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENDPSIkQ0MgLXBvc2l4IgorICBlbHNlCisgICAgQ0M9IiRDQyAtWHAiCisgIGZpCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBJU0M9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODA1OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4MTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjgxODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4MzUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODUzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICA6CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDg3NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQoraWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKK2V4aXQgKDApOyB9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4ODU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgOgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTA5OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDkxNCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwordHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OworLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK2NoYXIgY29uc3QgKmNvbnN0ICpjY3A7CitjaGFyICoqcDsKKy8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCitzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CitzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKKy8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KKyAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQorICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KK2NvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKK2NjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKy8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCisrK2NjcDsKK3AgPSAoY2hhcioqKSBjY3A7CitjY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKK3sgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgKnQ7CisgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7CisKKyAgKnQrKyA9IDA7Cit9Cit7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLworICBpbnQgeFtdID0gezI1LCAxN307CisgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICsrZm9vOworfQoreyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOworICBpcHRyIHAgPSAwOworICArK3A7Cit9Cit7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKKyAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OworICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Cit9Cit7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLworICBjb25zdCBpbnQgZm9vID0gMTA7Cit9CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5NjM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgY29uc3QgCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTg0OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX2N2X2NfaW5saW5lPW5vCitmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDk5MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworfSAkYWNfa3cgZm9vKCkgeworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk5ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitmaQorcm0gLWYgY29uZnRlc3QqCitkb25lCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKK2Nhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KKyAgaW5saW5lIHwgeWVzKSA7OworICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGlubGluZSAKK0VPRgorIDs7CisgICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCitFT0YKKyA7OworZXNhYworCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwMjQ6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwMjkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgb2ZmX3QgbG9uZworRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwNTc6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA2MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAic2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZAorRU9GCisKK2ZpCisKKyMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCisjIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwOTI6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDk3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhbGxvY2EuaD4KK2ludCBtYWluKCkgeworY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTI1OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExMzAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZWxzZQorIyBpZmRlZiBfTVNDX1ZFUgorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgZWxzZQorIyAgaWYgSEFWRV9BTExPQ0FfSAorIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KK2NoYXIgKmFsbG9jYSAoKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0EgMQorRU9GCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KKyAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKKyAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCisgICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAorICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KKyAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIENfQUxMT0NBIDEKK0VPRgorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExOTA6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTk1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKK3dlYmVjcmF5CisjZWxzZQord2Vub3RiZWNyYXkKKyNlbmRpZgorCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9vc19jcmF5PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCitmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIyMDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTIyNSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjQ4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCitFT0YKKworICBicmVhaworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2RvbmUKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyNzU6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjgzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK2ZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCit7CisgIHN0YXRpYyBjaGFyICphZGRyID0gMDsKKyAgYXV0byBjaGFyIGR1bW15OworICBpZiAoYWRkciA9PSAwKQorICAgIHsKKyAgICAgIGFkZHIgPSAmZHVtbXk7CisgICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKK30KK21haW4gKCkKK3sKKyAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQorZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KK0VPRgorCitmaQorCitmb3IgYWNfaGRyIGluIHVuaXN0ZC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTMyNzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzMzIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTM2NjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM3MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzk0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDE5OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNDI3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCisgICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKKwltbWFwIHByaXZhdGUgbm90IGZpeGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisJbW1hcCBzaGFyZWQgbm90IGZpeGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKKyAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKKyAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQorICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQorICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCisgICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQorICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKKyAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgorCisgICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCisgICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgorICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCisgICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisvKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCisjaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKyMgaWZkZWYgSEFWRV9VTklTVERfSAorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGVuZGlmCisKKy8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCisjIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisjIGVuZGlmCisKKyMgaWZkZWYgX1NDX1BBR0VTSVpFCisjICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKKyMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKyMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCisjICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKKyMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgICAgaWZkZWYgTkJQRworIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQorIyAgICAgaWZuZGVmIENMU0laRQorIyAgICAgIGRlZmluZSBDTFNJWkUgMQorIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCisjICAgIGVsc2UgLyogbm8gTkJQRyAqLworIyAgICAgaWZkZWYgTkJQQworIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKKyMgICAgIGVsc2UgLyogbm8gTkJQQyAqLworIyAgICAgIGlmZGVmIFBBR0VTSVpFCisjICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCisjICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KKyMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KKyMgICAgZW5kaWYgLyogbm8gTkJQRyAqLworIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCisjICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLworCisjZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9CisjZWxzZQorY2hhciAqbWFsbG9jKCk7CisjZW5kaWYKKworaW50CittYWluKCkKK3sKKwljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKKwlpbnQgaSwgcGFnZXNpemU7CisJaW50IGZkOworCisJcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOworCisJLyoKKwkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCisJICovCisJZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKKwl1bWFzaygwKTsKKwlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKworCS8qCisJICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCisJICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAorCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCisJICovCisJZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEyKQorCQlleGl0KDEpOworCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKKwlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQorCQkJZXhpdCgxKTsKKworCS8qCisJICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKKwkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCisJICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCisJICovCisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7CisJZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YTMpCisJCWV4aXQoMSk7CisJaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCisJCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOworCWV4aXQoMCk7Cit9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTY3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTU1BUCAxCitFT0YKKworZmkKKworCisjIGF1dG9jb25mLmluZm8gc2F5cyB0aGlzIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgQUNfSU5JVC4KKworCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCithY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKK2FjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisKKyMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgorIyBUaGUgaW5wdXRzIGFyZToKKyMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAorIworIyBUaGUgcnVsZXMgYXJlOgorIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKKyMgICAgc2FtZSB0aW1lLgorIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KKyMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAorIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KKyMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KKyMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCisKKyMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KKyMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KK2Nhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgorTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OworKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCisKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgoraWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2NDA6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorCitob3N0X2FsaWFzPSRob3N0CitjYXNlICIkaG9zdF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKQorICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKKyAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaSA7OworICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKK2hvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY2MTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKwordGFyZ2V0X2FsaWFzPSR0YXJnZXQKK2Nhc2UgIiR0YXJnZXRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKwordGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAordGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK3RhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCit0YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY3OTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorCitidWlsZF9hbGlhcz0kYnVpbGQKK2Nhc2UgIiRidWlsZF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKK2J1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitidWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgorCit0ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCisgIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKKyAgICBOT05FTk9ORXMseCx4LCAmJgorICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCisKK2lmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQorZWxzZQorICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCisgIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKK3MsXFwsXFxcXCxnOyBzLFwkLCQkLGcKK0VPRl9TRUQKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKKyAgcm0gLWYgY29uZnRlc3RzZWQKK2ZpCit0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KK3Rlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKworIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgordGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3MjM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3NTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODAyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorIDs7CisgICAgZXNhYworICBmaQorICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODMzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxODQzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK21haW4oKXtyZXR1cm4oMCk7fQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4NDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcworICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCisgIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KKyAgZWxzZQorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCisgIGZpCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODY3OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1CitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTg3MjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg4MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2N2X3Byb2dfZ2NjPXllcworZWxzZQorICBhY19jdl9wcm9nX2djYz1ubworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKKworaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorCithY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKK2FjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTAwOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYworaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19nPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQorCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5NDM6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisKKyMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KK2lmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisgIENDX0ZPUl9CVUlMRD0nJChDQyknCitlbHNlCisgIENDX0ZPUl9CVUlMRD1nY2MKK2ZpCisKKworCisKK0FSPSR7QVItYXJ9CisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjAwOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKK2ZpCitmaQorUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworQUxMX0xJTkdVQVM9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAordW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDQzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjA0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjA1MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAorX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwODM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIwODggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjExMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCisgICAgIGZvciBhY19mdW5jIGluIHN0cGNweQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjE0MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjE0NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmaQorICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KKyAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1RQQ1BZIDEKK0VPRgorCisgICBmaQorCisgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyMDI6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjIwNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bG9jYWxlLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiBMQ19NRVNTQUdFUworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgorICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQorRU9GCisKKyAgICBmaQorICBmaQorICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjM1OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCisgIFVTRV9OTFM9JGVuYWJsZXZhbAorZWxzZQorICBVU0VfTkxTPXllcworZmkKKworICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgorICAgIAorCisgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KKworICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEVOQUJMRV9OTFMgMQorRU9GCisKKyAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyNTU6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKK2Vsc2UKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubworZmkKKworICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2CisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KKwlubHNfY3ZfaGVhZGVyX2xpYmd0PQorCUNBVE9CSkVYVD1OT05FCisKKwlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjI3NDogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjI3OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjg0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjMwMTogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzA2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzEzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKwkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMjk6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQorYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1saW50bCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzM3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgYmluZHRleHRkb21haW4oKTsKKworaW50IG1haW4oKSB7CitiaW5kdGV4dGRvbWFpbigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjM2NDogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzY5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM3NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0dFVFRFWFQgMQorRU9GCisKKwkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0MDQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisJICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgorCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0Mzg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI0NDMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ2NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQ5MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjUyODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNTYwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CitleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CisJCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9LmdtbworCQkgICBEQVRBRElSTkFNRT1zaGFyZQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9Lm1vCisJCSAgIERBVEFESVJOQU1FPWxpYgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCQlJTlNUT0JKRVhUPS5tbworCSAgICAgIGZpCisJICAgIGZpCisJCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisJICAgICAgICAKKyAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KKwkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCisgICAgICAgIGZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjYwMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KKwlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2MzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2Njk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KKwkgIDogOworCWVsc2UKKwkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCisgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKKyAgICBkb25lCisKKyAgICAgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgIAorCisgICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCisgICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCisgICAgICAgTElOR1VBUz0KKyAgICAgZWxzZQorICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3NTk6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQorICAgICAgIE5FV19MSU5HVUFTPQorICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbworICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgorICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7CisgICAgICAgICBlc2FjCisgICAgICAgZG9uZQorICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCisgICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2CisgICAgIGZpCisKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCisgICAgIGZpCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKKyAgIGVsc2UKKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAorLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgorICAgZmkKKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgorICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KKwkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3ODc6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI3OTIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc5NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIG1zZ2Zvcm1hdD1saW51eAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK21zZ2Zvcm1hdD14b3BlbgorZmkKKworCisJICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCisgICAgICBmaQorICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCisJICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICAKKyAgIAorCisgICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCisgICAKKworICAgICAgbD0KKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgCisKKyMgQ2hlY2sgZm9yIGNvbW1vbiBoZWFkZXJzLgorIyBGSVhNRTogU2VlbXMgdG8gbWUgdGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgZm9yIGkzODYtd2luZG93cyBob3N0cy4KKyMgQXQgb25lIHBvaW50IHRoZXJlIHdlcmUgaGFyZGNvZGVkIEFDX0RFRklORSdzIGlmICR7aG9zdH0gPSBpMzg2LSotd2luZG93cyouCitmb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB1bmlzdGQuaCB0aW1lLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyODY2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjg3MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg3NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19oZHIgaW4gc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5MDY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTExICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTE2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2hkciBpbiBmY250bC5oIGZwdV9jb250cm9sLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTQ2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjk1MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHJ1c2FnZSB0aW1lIHNpZ2FjdGlvbiBfX3NldGZwdWN3CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTg1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTkwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworIyBDaGVjayBmb3Igc29ja2V0IGxpYnJhcmllcworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMwNDA6IGNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nYmluZCB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxzb2NrZXQgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzA0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGJpbmQoKTsKKworaW50IG1haW4oKSB7CitiaW5kKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDU5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHNvY2tldCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9saWIgMQorRU9GCisKKyAgTElCUz0iLWxzb2NrZXQgJExJQlMiCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzA4NzogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQorYWNfbGliX3Zhcj1gZWNobyBuc2wnXydnZXRob3N0YnluYW1lIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbG5zbCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDk1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZ2V0aG9zdGJ5bmFtZSgpOworCitpbnQgbWFpbigpIHsKK2dldGhvc3RieW5hbWUoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbnNsIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2xpYiAxCitFT0YKKworICBMSUJTPSItbG5zbCAkTElCUyIKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0CisKKworCitVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlNQUlOVD0iIiBVU0VfTUFJTlRBSU5FUl9NT0RFPXllcyA7OworICBubykJTUFJTlQ9IiMiIDs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLW1haW50YWluZXItbW9kZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IE1BSU5UPSIjIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQorZmkKK2Vsc2UKKyAgTUFJTlQ9IiMiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSAtRFVTRV9CU1dBUD0xIjs7CisgIG5vKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0wIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1ic3dhcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ic3dhcD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9ic3dhcD0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY2ZsYWdzIG9yIC0tZGlzYWJsZS1zaW0tY2ZsYWdzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jZmxhZ3MiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQkgc2ltX2NmbGFncz0iLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIjs7CisgIHRyYWNlKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJQbGVhc2UgdXNlIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpbnN0ZWFkLiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2NmbGFncz0iIjs7CisgIG5vKQkgc2ltX2NmbGFncz0iIjs7CisgICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2NmbGFncz0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVidWcgb3IgLS1kaXNhYmxlLXNpbS1kZWJ1ZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWJ1ZyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpIHNpbV9kZWJ1Zz0iLURERUJVRz03IC1EV0lUSF9ERUJVRz03Ijs7CisgIG5vKSAgc2ltX2RlYnVnPSItRERFQlVHPTAgLURXSVRIX0RFQlVHPTAiOzsKKyAgKikgICBzaW1fZGVidWc9Ii1EREVCVUc9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfREVCVUc9Jygke2VuYWJsZXZhbH0pJyI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWJ1ZyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIGRlYnVnID0gJHNpbV9kZWJ1ZyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2RlYnVnPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zdGRpbyBvciAtLWRpc2FibGUtc2ltLXN0ZGlvIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zdGRpbytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N0ZGlvIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7CisgIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zdGRpbyIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGlvPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkaW8iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHN0ZGlvIGZsYWdzID0gJHNpbV9zdGRpbyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3N0ZGlvPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS10cmFjZSBvciAtLWRpc2FibGUtc2ltLXRyYWNlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV90cmFjZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3RyYWNlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3RyYWNlPSItRFRSQUNFPTEgLURXSVRIX1RSQUNFPS0xIjs7CisgIG5vKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MCAtRFdJVEhfVFJBQ0U9MCI7OworICBbLTAtOV0qKQorCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fdHJhY2U9IiIKKwlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKwkgIGlmIHRlc3QgeCIkc2ltX3RyYWNlIiA9IHg7IHRoZW4KKwkgICAgc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9JyhUUkFDRV8keCIKKwkgIGVsc2UKKwkgICAgc2ltX3RyYWNlPSIke3NpbV90cmFjZX18VFJBQ0VfJHgiCisJICBmaQorCWRvbmUKKwlzaW1fdHJhY2U9IiRzaW1fdHJhY2UpJyIgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSB0cmFjZSA9ICRzaW1fdHJhY2UiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV90cmFjZT0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcHJvZmlsZSBvciAtLWRpc2FibGUtc2ltLXByb2ZpbGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3Byb2ZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9wcm9maWxlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7CisgIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OworICBbLTAtOV0qKQorCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fcHJvZmlsZT0iIgorCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbworCSAgaWYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgPSB4OyB0aGVuCisJICAgIHNpbV9wcm9maWxlPSItRFdJVEhfUFJPRklMRT0nKFBST0ZJTEVfJHgiCisJICBlbHNlCisJICAgIHNpbV9wcm9maWxlPSIke3NpbV9wcm9maWxlfXxQUk9GSUxFXyR4IgorCSAgZmkKKwlkb25lCisJc2ltX3Byb2ZpbGU9IiRzaW1fcHJvZmlsZSknIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9wcm9maWxlIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gcHJvZmlsZSA9ICRzaW1fcHJvZmlsZSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3Byb2ZpbGU9IiIKK2ZpCisKKworCitlY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMyODI6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMjg3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBzaWduYWwKKyN1bmRlZiBzaWduYWwKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7CisjZWxzZQordm9pZCAoKnNpZ25hbCAoKSkgKCk7CisjZW5kaWYKKworaW50IG1haW4oKSB7CitpbnQgaTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzA0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpZ25hbD1pbnQKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCitFT0YKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzMyNDogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkQ1lHV0lOMzIiID0geWVzOyB0aGVuCithbV9jdl9leGVleHQ9LmV4ZQorZWxzZQorY2F0ID4gYW1fY190ZXN0LmMgPDwgJ0VPRicKK2ludCBtYWluKCkgeworLyogTm90aGluZyBuZWVkZWQgaGVyZSAqLworfQorRU9GCiske0NDLWNjfSAtbyBhbV9jX3Rlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgYW1fY190ZXN0LmMgJExJQlMgMT4mNQorYW1fY3ZfZXhlZXh0PWBscyBhbV9jX3Rlc3QuKiB8IGdyZXAgLXYgYW1fY190ZXN0LmMgfCBzZWQgLWUgcy9hbV9jX3Rlc3QvL2AKK3JtIC1mIGFtX2NfdGVzdCoKK2ZpCisKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iID0geCAmJiBhbV9jdl9leGVleHQ9bm8KK2ZpCitFWEVFWFQ9IiIKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthbV9jdl9leGVleHR9CitlY2hvICIkYWNfdCIiJHthbV9jdl9leGVleHR9IiAxPiY2CisKKworc2ltX2xpbmtfZmlsZXM9CitzaW1fbGlua19saW5rcz0KKworc2ltX2xpbmtfbGlua3M9dGNvbmZpZy5oCitpZiB0ZXN0IC1mICR7c3JjZGlyfS90Y29uZmlnLmluCit0aGVuCisgIHNpbV9saW5rX2ZpbGVzPXRjb25maWcuaW4KK2Vsc2UKKyAgc2ltX2xpbmtfZmlsZXM9Li4vY29tbW9uL3Rjb25maWcuaW4KK2ZpCisKKyMgdGFyZy12YWxzLmRlZiBwb2ludHMgdG8gdGhlIGxpYmMgbWFjcm8gZGVzY3JpcHRpb24gZmlsZS4KK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyotKi0qKSBUQVJHX1ZBTFNfREVGPS4uL2NvbW1vbi9ubHR2YWxzLmRlZiA7OworZXNhYworc2ltX2xpbmtfZmlsZXM9IiR7c2ltX2xpbmtfZmlsZXN9ICR7VEFSR19WQUxTX0RFRn0iCitzaW1fbGlua19saW5rcz0iJHtzaW1fbGlua19saW5rc30gdGFyZy12YWxzLmRlZiIKKworCisKK2ZvciBhY19oZHIgaW4gdW5pc3RkLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMzcyOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzM3NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MzM4MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworCisKK3RyYXAgJycgMSAyIDE1CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxIHwgZ3JlcCBhY19zcGFjZWAgaW4KKyAgKmFjX3NwYWNlPVwgKikKKyAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgc2VkIC1uIFwKKyAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCisgICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCisgICAgOzsKKyAgKikKKyAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKyAgICA7OworICBlc2FjID4+IGNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCisjIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KKyMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJworZmkKKwordHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorCitERUZTPS1ESEFWRV9DT05GSUdfSAorCisjIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKworZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUworcm0gLWYgJENPTkZJR19TVEFUVVMKK2NhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisjISAvYmluL3NoCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAorIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMKKyMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCisjCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKK2ZvciBhY19vcHRpb24KK2RvCisgIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCisgICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQorICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiIKKyAgICBleGl0IDAgOzsKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCisgICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7CisgIGVzYWMKK2RvbmUKKworYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKK2FjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgorCit0cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlLnNpbTpNYWtlZmlsZS5pbiBNYWtlLWNvbW1vbi5zaW06Li4vY29tbW9uL01ha2UtY29tbW9uLmluIC5nZGJpbml0Oi4uL2NvbW1vbi9nZGJpbml0LmluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KK3NlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Cisgcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKKyRhY192cHN1YgorJGV4dHJhc3ViCitzJUBzaW1fZW52aXJvbm1lbnRAJSRzaW1fZW52aXJvbm1lbnQlZworcyVAc2ltX2FsaWdubWVudEAlJHNpbV9hbGlnbm1lbnQlZworcyVAc2ltX2Fzc2VydEAlJHNpbV9hc3NlcnQlZworcyVAc2ltX2JpdHNpemVAJSRzaW1fYml0c2l6ZSVnCitzJUBzaW1fZW5kaWFuQCUkc2ltX2VuZGlhbiVnCitzJUBzaW1faG9zdGVuZGlhbkAlJHNpbV9ob3N0ZW5kaWFuJWcKK3MlQHNpbV9mbG9hdEAlJHNpbV9mbG9hdCVnCitzJUBzaW1fc2NhY2hlQCUkc2ltX3NjYWNoZSVnCitzJUBzaW1fZGVmYXVsdF9tb2RlbEAlJHNpbV9kZWZhdWx0X21vZGVsJWcKK3MlQHNpbV9od19jZmxhZ3NAJSRzaW1faHdfY2ZsYWdzJWcKK3MlQHNpbV9od19vYmpzQCUkc2ltX2h3X29ianMlZworcyVAc2ltX2h3QCUkc2ltX2h3JWcKK3MlQHNpbV9pbmxpbmVAJSRzaW1faW5saW5lJWcKK3MlQHNpbV9wYWNrYWdlc0AlJHNpbV9wYWNrYWdlcyVnCitzJUBzaW1fcmVncGFybUAlJHNpbV9yZWdwYXJtJWcKK3MlQHNpbV9yZXNlcnZlZF9iaXRzQCUkc2ltX3Jlc2VydmVkX2JpdHMlZworcyVAc2ltX3NtcEAlJHNpbV9zbXAlZworcyVAc2ltX3N0ZGNhbGxAJSRzaW1fc3RkY2FsbCVnCitzJUBzaW1feG9yX2VuZGlhbkAlJHNpbV94b3JfZW5kaWFuJWcKK3MlQGJ1aWxkX3dhcm5pbmdzQCUkYnVpbGRfd2FybmluZ3MlZworcyVAU0hFTExAJSRTSEVMTCVnCitzJUBDRkxBR1NAJSRDRkxBR1MlZworcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCitzJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKK3MlQERFRlNAJSRERUZTJWcKK3MlQExERkxBR1NAJSRMREZMQUdTJWcKK3MlQExJQlNAJSRMSUJTJWcKK3MlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworcyVAcHJlZml4QCUkcHJlZml4JWcKK3MlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKK3MlQGJpbmRpckAlJGJpbmRpciVnCitzJUBzYmluZGlyQCUkc2JpbmRpciVnCitzJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCitzJUBkYXRhZGlyQCUkZGF0YWRpciVnCitzJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCitzJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKK3MlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKK3MlQGxpYmRpckAlJGxpYmRpciVnCitzJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCitzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCitzJUBpbmZvZGlyQCUkaW5mb2RpciVnCitzJUBtYW5kaXJAJSRtYW5kaXIlZworcyVAaG9zdEAlJGhvc3QlZworcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZworcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCitzJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKK3MlQGhvc3Rfb3NAJSRob3N0X29zJWcKK3MlQHRhcmdldEAlJHRhcmdldCVnCitzJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZworcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZworcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZworcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKK3MlQGJ1aWxkQCUkYnVpbGQlZworcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCitzJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZworcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKK3MlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZworcyVAQ0NAJSRDQyVnCitzJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZworcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKK3MlQENDX0ZPUl9CVUlMREAlJENDX0ZPUl9CVUlMRCVnCitzJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKK3MlQEFSQCUkQVIlZworcyVAUkFOTElCQCUkUkFOTElCJWcKK3MlQFNFVF9NQUtFQCUkU0VUX01BS0UlZworcyVAQ1BQQCUkQ1BQJWcKK3MlQEFMTE9DQUAlJEFMTE9DQSVnCitzJUBVU0VfTkxTQCUkVVNFX05MUyVnCitzJUBNU0dGTVRAJSRNU0dGTVQlZworcyVAR01TR0ZNVEAlJEdNU0dGTVQlZworcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCitzJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKK3MlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZworcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKK3MlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZworcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCitzJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCitzJUBJTlRMREVQU0AlJElOVExERVBTJWcKK3MlQElOVExMSUJTQCUkSU5UTExJQlMlZworcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCitzJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCitzJUBQT1NVQkAlJFBPU1VCJWcKK3MlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKK3MlQEdUX05PQCUkR1RfTk8lZworcyVAR1RfWUVTQCUkR1RfWUVTJWcKK3MlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKK3MlQGxAJSRsJWcKK3MlQE1BSU5UQCUkTUFJTlQlZworcyVAc2ltX2Jzd2FwQCUkc2ltX2Jzd2FwJWcKK3MlQHNpbV9jZmxhZ3NAJSRzaW1fY2ZsYWdzJWcKK3MlQHNpbV9kZWJ1Z0AlJHNpbV9kZWJ1ZyVnCitzJUBzaW1fc3RkaW9AJSRzaW1fc3RkaW8lZworcyVAc2ltX3RyYWNlQCUkc2ltX3RyYWNlJWcKK3MlQHNpbV9wcm9maWxlQCUkc2ltX3Byb2ZpbGUlZworcyVARVhFRVhUQCUkRVhFRVhUJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlLnNpbTpNYWtlZmlsZS5pbiBNYWtlLWNvbW1vbi5zaW06Li4vY29tbW9uL01ha2UtY29tbW9uLmluIC5nZGJpbml0Oi4uL2NvbW1vbi9nZGJpbml0LmluIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KKyAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OworICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKK3MlQElOU1RBTExAJSRJTlNUQUxMJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCisjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgorIworIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCithY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKK2FjX2RDPSdcMycKK2FjX2REPSclZycKKyMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJworYWNfdUM9JyAnCithY191RD0nXDQlZycKKyMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX2VCPSckJVwxI1wyZGVmaW5lXDMnCithY19lQz0nICcKK2FjX2VEPSclZycKKworaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisgIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZpCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICRhY19maWxlCisKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCisKK0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcworIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6CisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgorcm0gLWYgY29uZnRlc3QudmFscworY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgorcy9bXFwmJV0vXFwmL2cKK3MlW1xcJGBdJVxcJiVnCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAorcyVhY19kJWFjX3UlZ3AKK3MlYWNfdSVhY19lJWdwCitFT0YKK3NlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKK3JtIC1mIGNvbmZ0ZXN0LmhkcgorCisjIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCisjIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCisjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KK2NhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgorcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKK0VPRgorCisjIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KKyMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCisKK3JtIC1mIGNvbmZ0ZXN0LnRhaWwKK3doaWxlIDoKK2RvCisgIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKKyAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgorICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCisgICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgorICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKKyAgZWNobyAnQ0VPRgorICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAorICBybSAtZiBjb25mdGVzdC5pbgorICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KKycgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKKyAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCitkb25lCitybSAtZiBjb25mdGVzdC52YWxzCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCisgIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAorICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAorICBybSAtZiBjb25mdGVzdC5pbgorICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKKyAgICBybSAtZiBjb25mdGVzdC5oCisgIGVsc2UKKyAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGZpCisgICAgcm0gLWYgJGFjX2ZpbGUKKyAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCisgIGZpCitmaTsgZG9uZQorCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCithY19zb3VyY2VzPSIkc2ltX2xpbmtfZmlsZXMiCithY19kZXN0cz0iJHNpbV9saW5rX2xpbmtzIgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK3NyY2Rpcj0kYWNfZ2l2ZW5fc3JjZGlyCit3aGlsZSB0ZXN0IC1uICIkYWNfc291cmNlcyI7IGRvCisgIHNldCAkYWNfZGVzdHM7IGFjX2Rlc3Q9JDE7IHNoaWZ0OyBhY19kZXN0cz0kKgorICBzZXQgJGFjX3NvdXJjZXM7IGFjX3NvdXJjZT0kMTsgc2hpZnQ7IGFjX3NvdXJjZXM9JCoKKworICBlY2hvICJsaW5raW5nICRzcmNkaXIvJGFjX3NvdXJjZSB0byAkYWNfZGVzdCIKKworICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfc291cmNlOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkc3JjZGlyLyRhY19zb3VyY2U6IEZpbGUgbm90IGZvdW5kIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKKyAgcm0gLWYgJGFjX2Rlc3QKKworICAjIE1ha2UgcmVsYXRpdmUgc3ltbGlua3MuCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kZXN0X2Rpcj1gZWNobyAkYWNfZGVzdHxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gIiRhY19kZXN0IiAmJiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBkZXN0IGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGVzdF9kaXIiICYmIG1rZGlyICIkYWNfZGVzdF9kaXIiCisgICAgYWNfZGVzdF9kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2Rlc3RfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kZXN0X2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGVzdF9kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGVzdF9kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRzcmNkaXIiIGluCisgIFsvJF0qKSBhY19yZWxfc291cmNlPSIkc3JjZGlyLyRhY19zb3VyY2UiIDs7CisgICopIGFjX3JlbF9zb3VyY2U9IiRhY19kb3RzJHNyY2Rpci8kYWNfc291cmNlIiA7OworICBlc2FjCisKKyAgIyBNYWtlIGEgc3ltbGluayBpZiBwb3NzaWJsZTsgb3RoZXJ3aXNlIHRyeSBhIGhhcmQgbGluay4KKyAgaWYgbG4gLXMgJGFjX3JlbF9zb3VyY2UgJGFjX2Rlc3QgMj4vZGV2L251bGwgfHwKKyAgICBsbiAkc3JjZGlyLyRhY19zb3VyY2UgJGFjX2Rlc3Q7IHRoZW4gOgorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGxpbmsgJGFjX2Rlc3QgdG8gJHNyY2Rpci8kYWNfc291cmNlIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2RvbmUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorY2FzZSAieCRDT05GSUdfRklMRVMiIGluCisgeE1ha2VmaWxlKikKKyAgIGVjaG8gIk1lcmdpbmcgTWFrZWZpbGUuc2ltK01ha2UtY29tbW9uLnNpbSBpbnRvIE1ha2VmaWxlIC4uLiIKKyAgIHJtIC1mIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAgTWFrZWZpbGUKKyAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUFJFXy8sL14jIyBFbmQgQ09NTU9OX1BSRV8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0xLnRtcAorICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QT1NUXy8sL14jIyBFbmQgQ09NTU9OX1BPU1RfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMi50bXAKKyAgIHNlZCAtZSAnL14jIyBDT01NT05fUFJFXy8gciBNYWtlc2ltMS50bXAnIFwKKwktZSAnL14jIyBDT01NT05fUE9TVF8vIHIgTWFrZXNpbTIudG1wJyBcCisJPE1ha2VmaWxlLnNpbSA+TWFrZWZpbGUKKyAgIHJtIC1mIE1ha2VmaWxlLnNpbSBNYWtlLWNvbW1vbi5zaW0gTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcAorICAgOzsKKyBlc2FjCisgY2FzZSAieCRDT05GSUdfSEVBREVSUyIgaW4geGNvbmZpZy5oOmNvbmZpZy5pbikgZWNobyA+IHN0YW1wLWggOzsgZXNhYworCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKworCmRpZmYgLS1naXQgYS9zaW0vYXJtL2NvbmZpZ3VyZS5pbiBiL3NpbS9hcm0vY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzM2IwYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vYXJtL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDEwIEBACitkbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK3NpbmNsdWRlKC4uL2NvbW1vbi9hY2xvY2FsLm00KQorQUNfUFJFUkVRKDIuNSlkbmwKK0FDX0lOSVQoTWFrZWZpbGUuaW4pCisKK1NJTV9BQ19DT01NT04KKworQUNfQ0hFQ0tfSEVBREVSUyh1bmlzdGQuaCkKKworU0lNX0FDX09VVFBVVApkaWZmIC0tZ2l0IGEvc2ltL2FybS9kYmdfY29uZi5oIGIvc2ltL2FybS9kYmdfY29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZTQ4NmYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vYXJtL2RiZ19jb25mLmgKQEAgLTAsMCArMSw0OCBAQAorLyogIGRiZ19jb25mLmggLS0gQVJNdWxhdG9yIGRlYnVnIGludGVyZmFjZTogIEFSTTYgSW5zdHJ1Y3Rpb24gRW11bGF0b3IuCisgICAgQ29weXJpZ2h0IChDKSAxOTk0IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTHRkLgorIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KKworI2lmbmRlZiBEYmdfQ29uZl9faAorCisjZGVmaW5lIERiZ19Db25mX19oCisKK3R5cGVkZWYgc3RydWN0IERiZ19Db25maWdCbG9jayB7CisgICAgaW50IGJ5dGVzZXg7CisgICAgbG9uZyBtZW1vcnlzaXplOworICAgIGludCBzZXJpYWxwb3J0OyAgICAgICAgLyopIHJlbW90ZSBjb25uZWN0aW9uIHBhcmFtZXRlcnMgKi8KKyAgICBpbnQgc2VyaWFsbGluZXNwZWVkOyAgIC8qKSAoc2VyaWFsIGNvbm5lY3Rpb24pICovCisgICAgaW50IHBhcmFsbGVscG9ydDsgICAgICAvKikgZGl0dG8gKi8KKyAgICBpbnQgcGFyYWxsZWxsaW5lc3BlZWQ7IC8qKSAocGFyYWxsZWwgY29ubmVjdGlvbikgKi8KKyAgICBpbnQgcHJvY2Vzc29yOyAgICAgICAgIC8qIHByb2Nlc3NvciB0aGUgYXJtdWxhdG9yIGlzIHRvIGVtdWxhdGUgKGVnIEFSTTYwKSAqLworICAgIGludCByZGl0eXBlOyAgICAgICAgICAgLyogYXJtdWxhdG9yIC8gcmVtb3RlIHByb2Nlc3NvciAqLworICAgIGludCBkcml2ZXJ0eXBlOyAgICAgICAgLyogcGFyYWxsZWwgLyBzZXJpYWwgLyBldGMgKi8KKyAgICBjaGFyIGNvbnN0ICpjb25maWd0b2xvYWQ7CisgICAgaW50IGZsYWdzOworfSBEYmdfQ29uZmlnQmxvY2s7CisKKyNkZWZpbmUgRGJnX0NvbmZpZ0ZsYWdfUmVzZXQgMQorCit0eXBlZGVmIHN0cnVjdCBEYmdfSG9zdG9zSW50ZXJmYWNlIERiZ19Ib3N0b3NJbnRlcmZhY2U7CisvKiBUaGlzIHN0cnVjdHVyZSBhbGxvd3MgYWNjZXNzIGJ5IHRoZSAoaG9zdC1pbmRlcGVuZGVudCkgQy1saWJyYXJ5IHN1cHBvcnQKKyAgIG1vZHVsZSBvZiBhcm11bGF0b3Igb3IgcGlzZCAoYXJtb3MuYykgdG8gaG9zdC1kZXBlbmRlbnQgZnVuY3Rpb25zIGZvcgorICAgd2hpY2ggdGhlcmUgaXMgbm8gaG9zdC1pbmRlcGVuZGVudCBpbnRlcmZhY2UuICBJdHMgY29udGVudHMgYXJlIHVua25vd24KKyAgIHRvIHRoZSBkZWJ1Z2dlciB0b29sYm94LgorICAgVGhlIGFzc3VtcHRpb24gaXMgdGhhdCwgaW4gYSB3aW5kb3dlZCBzeXN0ZW0sIGZwdXRjKHN0ZGVycikgZm9yIGV4YW1wbGUKKyAgIG1heSBub3QgYWNoaWV2ZSB0aGUgZGVzaXJlZCBlZmZlY3Qgb2YgdGhlIGNoYXJhY3RlciBhcHBlYXJpbmcgaW4gc29tZQorICAgd2luZG93LgorICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2FybS9kYmdfY3AuaCBiL3NpbS9hcm0vZGJnX2NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYyZjkzZAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9hcm0vZGJnX2NwLmgKQEAgLTAsMCArMSw2MiBAQAorLyogIGRiZ19jcC5oIC0tIEFSTXVsYXRvciBkZWJ1ZyBpbnRlcmZhY2U6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgorICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKyNpZm5kZWYgRGJnX0NQX19oCisKKyNkZWZpbmUgRGJnX0NQX19oCisKKyNkZWZpbmUgRGJnX0FjY2Vzc19SZWFkYWJsZSAgMQorI2RlZmluZSBEYmdfQWNjZXNzX1dyaXRhYmxlICAyCisjZGVmaW5lIERiZ19BY2Nlc3NfQ1BEVCAgICAgIDQgLyogZWxzZSBDUFJUICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBzaG9ydCBybWluLCBybWF4OworICAgIC8qIGEgc2luZ2xlIGRlc2NyaXB0aW9uIGNhbiBiZSB1c2VkIGZvciBhIHJhbmdlIG9mIHJlZ2lzdGVycyB3aXRoCisgICAgICAgdGhlIHNhbWUgcHJvcGVydGllcyAqYWNjZXNzZWQgdmlhIENQRFQgaW5zdHJ1Y3Rpb25zKgorICAgICAqLworICAgIHVuc2lnbmVkIGNoYXIgbmJ5dGVzOyAgIC8qIHNpemUgb2YgcmVnaXN0ZXIgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGFjY2VzczsgICAvKiBzZWUgYWJvdmUgKEFjY2Vzc194eHgpICovCisgICAgdW5pb24geworICAgICAgIHN0cnVjdCB7IC8qIENQRFQgaW5zdHJ1Y3Rpb25zIGRvIG5vdCBhbGxvdyB0aGUgY29wcm9jZXNzb3IgbXVjaCBmcmVlZG9tOgorICAgICAgICAgICAgICAgICAgIG9ubHkgYml0IDIyICgnTicpIGFuZCAxMi0xNSAoJ0NSZCcpIGFyZSBmcmVlIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICBjb3Byb2Nlc3NvciB0byB1c2UgYXMgaXQgc2VlcyBmaXQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBuYml0OworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcmRiaXRzOworICAgICAgICAgICAgICB9IGNwZHQ7CisgICAgICAgc3RydWN0IHsgLyogQ1BSVCBpbnN0cnVjdGlvbnMgaGF2ZSBtdWNoIG1vcmUgbGF0aXR1ZGUuICBUaGUgYml0cyBmaXhlZAorICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBBUk0gYXJlICAyNC4uMzEgKGNvbmRpdGlvbiBtYXNrICYgb3Bjb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCAoZGlyZWN0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4Li4xNSAoY3BudW0sIGFybSByZWdpc3RlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAoQ1BSVCBub3QgQ1BETykKKyAgICAgICAgICAgICAgICAgICBsZWF2aW5nIDE0IGJpdHMgZnJlZSB0byB0aGUgY29wcm9jZXNzb3IgKGZvcnR1bmF0ZWx5CisgICAgICAgICAgICAgICAgICAgZmFsbGluZyB3aXRoaW4gdHdvIGJ5dGVzKS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHJlYWRfYjAsIHJlYWRfYjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9iMCwgd3JpdGVfYjE7CisgICAgICAgICAgICAgIH0gY3BydDsKKyAgICB9IGFjY2Vzc2luc3Q7Cit9IERiZ19Db1Byb1JlZ0Rlc2M7CisKK3N0cnVjdCBEYmdfQ29Qcm9EZXNjIHsKKyAgICBpbnQgZW50cmllczsKKyAgICBEYmdfQ29Qcm9SZWdEZXNjIHJlZ2Rlc2NbMS8qIHJlYWxseSBuZW50cmllcyAqL107Cit9OworCisjZGVmaW5lIERiZ19Db1Byb0Rlc2NfU2l6ZShuKSAoc2l6ZW9mKHN0cnVjdCBEYmdfQ29Qcm9EZXNjKSArIChuLTEpKnNpemVvZihEYmdfQ29Qcm9SZWdEZXNjKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vYXJtL2RiZ19oaWYuaCBiL3NpbS9hcm0vZGJnX2hpZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyN2I3NTkKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vYXJtL2RiZ19oaWYuaApAQCAtMCwwICsxLDQ3IEBACisvKiAgZGJnX2hpZi5oIC0tIEFSTXVsYXRvciBkZWJ1ZyBpbnRlcmZhY2U6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgorICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKyNpZmRlZiBfX1NURENfXworIyAgaW5jbHVkZSA8c3RkYXJnLmg+CisjZWxzZQorIyAgaW5jbHVkZSA8dmFyYXJncy5oPgorI2VuZGlmCisKK3R5cGVkZWYgdm9pZCBIaWZfRGJnUHJpbnQodm9pZCAqYXJnLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApOwordHlwZWRlZiB2b2lkIEhpZl9EYmdQYXVzZSh2b2lkICphcmcpOworCit0eXBlZGVmIHZvaWQgSGlmX1dyaXRlQyh2b2lkICphcmcsIGludCBjKTsKK3R5cGVkZWYgaW50IEhpZl9SZWFkQyh2b2lkICphcmcpOwordHlwZWRlZiBpbnQgSGlmX1dyaXRlKHZvaWQgKmFyZywgY2hhciBjb25zdCAqYnVmZmVyLCBpbnQgbGVuKTsKK3R5cGVkZWYgY2hhciAqSGlmX0dldFModm9pZCAqYXJnLCBjaGFyICpidWZmZXIsIGludCBsZW4pOworCit0eXBlZGVmIHZvaWQgSGlmX1JESVJlc2V0UHJvYyh2b2lkICphcmcpOworCitzdHJ1Y3QgRGJnX0hvc3Rvc0ludGVyZmFjZSB7CisgICAgSGlmX0RiZ1ByaW50ICpkYmdwcmludDsKKyAgICBIaWZfRGJnUGF1c2UgKmRiZ3BhdXNlOworICAgIHZvaWQgKmRiZ2FyZzsKKworICAgIEhpZl9Xcml0ZUMgKndyaXRlYzsKKyAgICBIaWZfUmVhZEMgKnJlYWRjOworICAgIEhpZl9Xcml0ZSAqd3JpdGU7CisgICAgSGlmX0dldFMgKmdldHM7CisgICAgdm9pZCAqaG9zdG9zYXJnOworCisgICAgSGlmX1JESVJlc2V0UHJvYyAqcmVzZXQ7CisgICAgdm9pZCAqcmVzZXRhcmc7Cit9OwpkaWZmIC0tZ2l0IGEvc2ltL2FybS9kYmdfcmRpLmggYi9zaW0vYXJtL2RiZ19yZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWY0MWU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2FybS9kYmdfcmRpLmgKQEAgLTAsMCArMSwzMjMgQEAKKy8qICBkYmdfcmRpLmggLS0gQVJNdWxhdG9yIFJESSBpbnRlcmZhY2U6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgorICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKyNpZm5kZWYgZGJnX3JkaV9faAorI2RlZmluZSBkYmdfcmRpX19oCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgQ29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBSRElFcnJvcl9Ob0Vycm9yICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBSRElFcnJvcl9SZXNldCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkRJRXJyb3JfVW5kZWZpbmVkSW5zdHJ1Y3Rpb24gICAyCisjZGVmaW5lIFJESUVycm9yX1NvZnR3YXJlSW50ZXJydXB0ICAgICAgMworI2RlZmluZSBSRElFcnJvcl9QcmVmZXRjaEFib3J0ICAgICAgICAgIDQKKyNkZWZpbmUgUkRJRXJyb3JfRGF0YUFib3J0ICAgICAgICAgICAgICA1CisjZGVmaW5lIFJESUVycm9yX0FkZHJlc3NFeGNlcHRpb24gICAgICAgNgorI2RlZmluZSBSRElFcnJvcl9JUlEgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgUkRJRXJyb3JfRklRICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFJESUVycm9yX0Vycm9yICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBSRElFcnJvcl9CcmFuY2hUaHJvdWdoMCAgICAgICAgIDEwCisKKyNkZWZpbmUgUkRJRXJyb3JfTm90SW5pdGlhbGlzZWQgICAgICAgICAxMjgKKyNkZWZpbmUgUkRJRXJyb3JfVW5hYmxlVG9Jbml0aWFsaXNlICAgICAxMjkKKyNkZWZpbmUgUkRJRXJyb3JfV3JvbmdCeXRlU2V4ICAgICAgICAgICAxMzAKKyNkZWZpbmUgUkRJRXJyb3JfVW5hYmxlVG9UZXJtaW5hdGUgICAgICAxMzEKKyNkZWZpbmUgUkRJRXJyb3JfQmFkSW5zdHJ1Y3Rpb24gICAgICAgICAxMzIKKyNkZWZpbmUgUkRJRXJyb3JfSWxsZWdhbEluc3RydWN0aW9uICAgICAxMzMKKyNkZWZpbmUgUkRJRXJyb3JfQmFkQ1BVU3RhdGVTZXR0aW5nICAgICAxMzQKKyNkZWZpbmUgUkRJRXJyb3JfVW5rbm93bkNvUHJvICAgICAgICAgICAxMzUKKyNkZWZpbmUgUkRJRXJyb3JfVW5rbm93bkNvUHJvU3RhdGUgICAgICAxMzYKKyNkZWZpbmUgUkRJRXJyb3JfQmFkQ29Qcm9TdGF0ZSAgICAgICAgICAxMzcKKyNkZWZpbmUgUkRJRXJyb3JfQmFkUG9pbnRUeXBlICAgICAgICAgICAxMzgKKyNkZWZpbmUgUkRJRXJyb3JfVW5pbXBsZW1lbnRlZFR5cGUgICAgICAxMzkKKyNkZWZpbmUgUkRJRXJyb3JfQmFkUG9pbnRTaXplICAgICAgICAgICAxNDAKKyNkZWZpbmUgUkRJRXJyb3JfVW5pbXBsZW1lbnRlZFNpemUgICAgICAxNDEKKyNkZWZpbmUgUkRJRXJyb3JfTm9Nb3JlUG9pbnRzICAgICAgICAgICAxNDIKKyNkZWZpbmUgUkRJRXJyb3JfQnJlYWtwb2ludFJlYWNoZWQgICAgICAxNDMKKyNkZWZpbmUgUkRJRXJyb3JfV2F0Y2hwb2ludEFjY2Vzc2VkICAgICAxNDQKKyNkZWZpbmUgUkRJRXJyb3JfTm9TdWNoUG9pbnQgICAgICAgICAgICAxNDUKKyNkZWZpbmUgUkRJRXJyb3JfUHJvZ3JhbUZpbmlzaGVkSW5TdGVwICAxNDYKKyNkZWZpbmUgUkRJRXJyb3JfVXNlckludGVycnVwdCAgICAgICAgICAxNDcKKyNkZWZpbmUgUkRJRXJyb3JfQ2FudFNldFBvaW50ICAgICAgICAgICAxNDgKKyNkZWZpbmUgUkRJRXJyb3JfSW5jb21wYXRpYmxlUkRJTGV2ZWxzICAxNDkKKworI2RlZmluZSBSRElFcnJvcl9DYW50TG9hZENvbmZpZyAgICAgICAgIDE1MAorI2RlZmluZSBSRElFcnJvcl9CYWRDb25maWdEYXRhICAgICAgICAgIDE1MQorI2RlZmluZSBSRElFcnJvcl9Ob1N1Y2hDb25maWcgICAgICAgICAgIDE1MgorI2RlZmluZSBSRElFcnJvcl9CdWZmZXJGdWxsICAgICAgICAgICAgIDE1MworI2RlZmluZSBSRElFcnJvcl9PdXRPZlN0b3JlICAgICAgICAgICAgIDE1NAorI2RlZmluZSBSRElFcnJvcl9Ob3RJbkRvd25sb2FkICAgICAgICAgIDE1NQorI2RlZmluZSBSRElFcnJvcl9Qb2ludEluVXNlICAgICAgICAgICAgIDE1NgorI2RlZmluZSBSRElFcnJvcl9CYWRJbWFnZUZvcm1hdCAgICAgICAgIDE1NworI2RlZmluZSBSRElFcnJvcl9UYXJnZXRSdW5uaW5nICAgICAgICAgIDE1OAorCisjZGVmaW5lIFJESUVycm9yX0xpdHRsZUVuZGlhbiAgICAgICAgICAgMjQwCisjZGVmaW5lIFJESUVycm9yX0JpZ0VuZGlhbiAgICAgICAgICAgICAgMjQxCisjZGVmaW5lIFJESUVycm9yX1NvZnRJbml0aWFsaXNlRXJyb3IgICAgMjQyCisKKyNkZWZpbmUgUkRJRXJyb3JfSW5zdWZmaWNpZW50UHJpdmlsZWdlICAyNTMKKyNkZWZpbmUgUkRJRXJyb3JfVW5pbXBsZW1lbnRlZE1lc3NhZ2UgICAyNTQKKyNkZWZpbmUgUkRJRXJyb3JfVW5kZWZpbmVkTWVzc2FnZSAgICAgICAyNTUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgIFJEUCBNZXNzYWdlIE51bWJlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFJEUF9TdGFydCAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKTB4MAorI2RlZmluZSBSRFBfRW5kICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikweDEKKyNkZWZpbmUgUkRQX1JlYWQgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpMHgyCisjZGVmaW5lIFJEUF9Xcml0ZSAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKTB4MworI2RlZmluZSBSRFBfQ1BVcmVhZCAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikweDQKKyNkZWZpbmUgUkRQX0NQVXdyaXRlICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpMHg1CisjZGVmaW5lIFJEUF9DUHJlYWQgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKTB4NgorI2RlZmluZSBSRFBfQ1B3cml0ZSAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikweDcKKyNkZWZpbmUgUkRQX1NldEJyZWFrICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpMHhhCisjZGVmaW5lIFJEUF9DbGVhckJyZWFrICAgICAgICAgICh1bnNpZ25lZCBjaGFyKTB4YgorI2RlZmluZSBSRFBfU2V0V2F0Y2ggICAgICAgICAgICAodW5zaWduZWQgY2hhcikweGMKKyNkZWZpbmUgUkRQX0NsZWFyV2F0Y2ggICAgICAgICAgKHVuc2lnbmVkIGNoYXIpMHhkCisjZGVmaW5lIFJEUF9FeGVjdXRlICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKTB4MTAKKyNkZWZpbmUgUkRQX1N0ZXAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpMHgxMQorI2RlZmluZSBSRFBfSW5mbyAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikweDEyCisjZGVmaW5lIFJEUF9PU09wUmVwbHkgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKTB4MTMKKworI2RlZmluZSBSRFBfQWRkQ29uZmlnICAgICAgICAgICAodW5zaWduZWQgY2hhcikweDE0CisjZGVmaW5lIFJEUF9Mb2FkQ29uZmlnRGF0YSAgICAgICh1bnNpZ25lZCBjaGFyKTB4MTUKKyNkZWZpbmUgUkRQX1NlbGVjdENvbmZpZyAgICAgICAgKHVuc2lnbmVkIGNoYXIpMHgxNgorI2RlZmluZSBSRFBfTG9hZEFnZW50ICAgICAgICAgICAodW5zaWduZWQgY2hhcikweDE3CisKKyNkZWZpbmUgUkRQX1N0b3BwZWQgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpMHgyMAorI2RlZmluZSBSRFBfT1NPcCAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikweDIxCisjZGVmaW5lIFJEUF9GYXRhbCAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKTB4NWUKKyNkZWZpbmUgUkRQX1JldHVybiAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpMHg1ZgorI2RlZmluZSBSRFBfUmVzZXQgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikweDdmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyIFJESSB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBSRElTZXhfTGl0dGxlICAgICAgICAgICAwIC8qIHRoZSBieXRlIHNleCBvZiB0aGUgZGVidWdnZWUgKi8KKyNkZWZpbmUgUkRJU2V4X0JpZyAgICAgICAgICAgICAgMQorI2RlZmluZSBSRElTZXhfRG9udENhcmUgICAgICAgICAyCisKKyNkZWZpbmUgUkRJUG9pbnRfRVEgICAgICAgICAgICAgMCAvKiB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGJyZWFrL3dhdGNocG9pbnRzICovCisjZGVmaW5lIFJESVBvaW50X0dUICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkRJUG9pbnRfR0UgICAgICAgICAgICAgMgorI2RlZmluZSBSRElQb2ludF9MVCAgICAgICAgICAgICAzCisjZGVmaW5lIFJESVBvaW50X0xFICAgICAgICAgICAgIDQKKyNkZWZpbmUgUkRJUG9pbnRfSU4gICAgICAgICAgICAgNQorI2RlZmluZSBSRElQb2ludF9PVVQgICAgICAgICAgICA2CisjZGVmaW5lIFJESVBvaW50X01BU0sgICAgICAgICAgIDcKKworI2RlZmluZSBSRElQb2ludF9JbnF1aXJ5ICAgICAgICA2NCAgLyogT1JSZWQgd2l0aCBwb2ludCB0eXBlIGluIGV4dGVuZGVkIFJEUCAqLworI2RlZmluZSBSRElQb2ludF9IYW5kbGUgICAgICAgICAxMjggLyogbWVzc2FnZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJESVdhdGNoX0J5dGVSZWFkICAgICAgIDEgLyogdHlwZXMgb2YgZGF0YSBhY2Nlc3NlcyB0byB3YXRjaCBmb3IgKi8KKyNkZWZpbmUgUkRJV2F0Y2hfSGFsZlJlYWQgICAgICAgMgorI2RlZmluZSBSRElXYXRjaF9Xb3JkUmVhZCAgICAgICA0CisjZGVmaW5lIFJESVdhdGNoX0J5dGVXcml0ZSAgICAgIDgKKyNkZWZpbmUgUkRJV2F0Y2hfSGFsZldyaXRlICAgICAgMTYKKyNkZWZpbmUgUkRJV2F0Y2hfV29yZFdyaXRlICAgICAgMzIKKworI2RlZmluZSBSRElSZWdfUjE1ICAgICAgICAgICAgICAoMUwgPDwgMTUpIC8qIG1hc2sgdmFsdWVzIGZvciBDUFUgKi8KKyNkZWZpbmUgUkRJUmVnX1BDICAgICAgICAgICAgICAgKDFMIDw8IDE2KQorI2RlZmluZSBSRElSZWdfQ1BTUiAgICAgICAgICAgICAoMUwgPDwgMTcpCisjZGVmaW5lIFJESVJlZ19TUFNSICAgICAgICAgICAgICgxTCA8PCAxOCkKKyNkZWZpbmUgUkRJTnVtQ1BVUmVncyAgICAgICAgICAgMTkKKworI2RlZmluZSBSRElOdW1DUFJlZ3MgICAgICAgICAgICAxMCAvKiBjdXJyZW50IG1heGltdW0gKi8KKworI2RlZmluZSBSRElNb2RlX0N1cnIgICAgICAgICAgICAyNTUKKworLyogQml0cyBzZXQgaW4gcmV0dXJuIHZhbHVlIGZyb20gUkRJSW5mb19UYXJnZXQgKi8KKyNkZWZpbmUgUkRJVGFyZ2V0X0xvZ1NwZWVkICAgICAgICAgICAgICAweDBmCisjZGVmaW5lIFJESVRhcmdldF9IVyAgICAgICAgICAgICAgICAgICAgMHgxMCAgICAgIC8qIGVsc2UgZW11bGF0b3IgKi8KKyNkZWZpbmUgUkRJVGFyZ2V0X0FnZW50TWF4TGV2ZWwgICAgICAgICAweGUwCisjZGVmaW5lIFJESVRhcmdldF9BZ2VudExldmVsU2hpZnQgICAgICAgNQorI2RlZmluZSBSRElUYXJnZXRfRGVidWdnZXJNaW5MZXZlbCAgICAgIDB4NzAwCisjZGVmaW5lIFJESVRhcmdldF9EZWJ1Z2dlckxldmVsU2hpZnQgICAgOAorI2RlZmluZSBSRElUYXJnZXRfQ2FuUmVsb2FkQWdlbnQgICAgICAgIDB4ODAwCisjZGVmaW5lIFJESVRhcmdldF9DYW5JbnF1aXJlTG9hZFNpemUgICAgMHgxMDAwCisKKy8qIEJpdHMgc2V0IGluIHJldHVybiB2YWx1ZSBmcm9tIFJESUluZm9fU3RlcCAqLworI2RlZmluZSBSRElTdGVwX011bHRpcGxlICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkRJU3RlcF9QQ0NoYW5nZSAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFJESVN0ZXBfU2luZ2xlICAgICAgICAgICAgICAgICAgNAorCisvKiBCaXRzIHNldCBpbiByZXR1cm4gdmFsdWUgZnJvbSBSRElJbmZvX1BvaW50cyAqLworI2RlZmluZSBSRElQb2ludENhcGFiaWxpdHlfQ29tcGFyaXNvbiAgIDEKKyNkZWZpbmUgUkRJUG9pbnRDYXBhYmlsaXR5X1JhbmdlICAgICAgICAyCisvKiA0IHRvIDEyOCBhcmUgUkRJV2F0Y2hfeHh7UmVhZCxXcml0ZX0gbGVmdC1zaGlmdGVkIGJ5IHR3byAqLworI2RlZmluZSBSRElQb2ludENhcGFiaWxpdHlfTWFzayAgICAgICAgIDI1NgorI2RlZmluZSBSRElQb2ludENhcGFiaWxpdHlfU3RhdHVzICAgICAgIDUxMiAvKiBQb2ludCBzdGF0dXMgZW5xdWlyaWVzIGF2YWlsYWJsZSAqLworCisvKiBSRElfSW5mbyBzdWJjb2RlcyAqLworI2RlZmluZSBSRElJbmZvX1RhcmdldCAgICAgICAgICAwCisjZGVmaW5lIFJESUluZm9fUG9pbnRzICAgICAgICAgIDEKKyNkZWZpbmUgUkRJSW5mb19TdGVwICAgICAgICAgICAgMgorI2RlZmluZSBSRElJbmZvX01NVSAgICAgICAgICAgICAzCisjZGVmaW5lIFJESUluZm9fRG93bkxvYWQgICAgICAgIDQgICAvKiBJbnF1aXJlcyB3aGV0aGVyIGNvbmZpZ3VyYXRpb24gZG93bmxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzZWxlY3Rpb24gaXMgYXZhaWxhYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJESUluZm9fU2VtaUhvc3RpbmcgICAgIDUgICAvKiBJbnF1aXJlcyB3aGV0aGVyIFJESVNlbWlIb3N0aW5nXyogUkRJX0luZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxzIGFyZSBhdmFpbGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkRJSW5mb19Db1BybyAgICAgICAgICAgNiAgIC8qIElucXVpcmVzIHdoZXRoZXIgQ29Qcm8gUkRJX0luZm8gY2FsbHMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkRJSW5mb19JY2VicmVha2VyICAgICAgNworCisvKiBUaGUgbmV4dCB0d28gYXJlIG9ubHkgdG8gYmUgdXNlZCBpZiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgUkRJSW5mb19Qb2ludHMgKi8KKy8qIGhhcyBSRElQb2ludENhcGFiaWxpdHlfU3RhdHVzIHNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSRElQb2ludFN0YXR1c19XYXRjaCAgICAweDgwCisjZGVmaW5lIFJESVBvaW50U3RhdHVzX0JyZWFrICAgIDB4ODEKKworI2RlZmluZSBSRElTaWduYWxfU3RvcCAgICAgICAgICAweDEwMAorCisjZGVmaW5lIFJESVZlY3Rvcl9DYXRjaCAgICAgICAgIDB4MTgwCisKKy8qIFRoZSBuZXh0IGZvdXIgYXJlIG9ubHkgdG8gYmUgdXNlZCBpZiBSRElJbmZvX1NlbWlob3N0aW5nIHJldHVybmVkIG5vIGVycm9yICovCisjZGVmaW5lIFJESVNlbWlIb3N0aW5nX1NldFN0YXRlIDB4MTgxCisjZGVmaW5lIFJESVNlbWlIb3N0aW5nX0dldFN0YXRlIDB4MTgyCisjZGVmaW5lIFJESVNlbWlIb3N0aW5nX1NldFZlY3RvciAweDE4MworI2RlZmluZSBSRElTZW1pSG9zdGluZ19HZXRWZWN0b3IgMHgxODQKKworLyogVGhlIG5leHQgdHdvIGFyZSBvbmx5IHRvIGJlIHVzZWQgaWYgUkRJSW5mb19JY2VicmVha2VyIHJldHVybmVkIG5vIGVycm9yICovCisjZGVmaW5lIFJESUljZWJyZWFrZXJfR2V0TG9ja3MgIDB4MTg1CisjZGVmaW5lIFJESUljZWJyZWFrZXJfU2V0TG9ja3MgIDB4MTg2CisKKy8qIE9ubHkgaWYgUkRJSW5mb19UYXJnZXQgcmV0dXJuZWQgUkRJVGFyZ2V0X0NhbklucXVpcmVMb2FkU2l6ZSAqLworI2RlZmluZSBSRElJbmZvX0dldExvYWRTaXplICAgICAweDE4NworCisjZGVmaW5lIFJESUN5Y2xlcyAgICAgICAgICAgICAgIDB4MjAwCisjZGVmaW5lIFJESUN5Y2xlc19TaXplICAgICAgICAgIDQ4CisjZGVmaW5lIFJESUVycm9yUCAgICAgICAgICAgICAgIDB4MjAxCisKKyNkZWZpbmUgUkRJU2V0X0NtZGxpbmUgICAgICAgICAgMHgzMDAKKyNkZWZpbmUgUkRJU2V0X1JESUxldmVsICAgICAgICAgMHgzMDEKKyNkZWZpbmUgUkRJU2V0X1RocmVhZCAgICAgICAgICAgMHgzMDIKKworLyogVGhlIG5leHQgdHdvIGFyZSBvbmx5IHRvIGJlIHVzZWQgaWYgUkRJSW5mb19Db1BybyByZXR1cm5lZCBubyBlcnJvciAqLworI2RlZmluZSBSRElJbmZvX0Rlc2NyaWJlQ29Qcm8gICAweDQwMAorI2RlZmluZSBSRElJbmZvX1JlcXVlc3RDb1Byb0Rlc2MgMHg0MDEKKworI2RlZmluZSBSRElJbmZvX0xvZyAgICAgICAgICAgICAweDgwMAorI2RlZmluZSBSRElJbmZvX1NldExvZyAgICAgICAgICAweDgwMQorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgUG9pbnRIYW5kbGU7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgVGhyZWFkSGFuZGxlOworI2RlZmluZSBSRElOb1BvaW50SGFuZGxlICAgICAgICAoKFBvaW50SGFuZGxlKS0xTCkKKyNkZWZpbmUgUkRJTm9IYW5kbGUgICAgICAgICAgICAgKChUaHJlYWRIYW5kbGUpLTFMKQorCitzdHJ1Y3QgRGJnX0NvbmZpZ0Jsb2NrOworc3RydWN0IERiZ19Ib3N0b3NJbnRlcmZhY2U7CitzdHJ1Y3QgRGJnX01DU3RhdGU7Cit0eXBlZGVmIGludCByZGlfb3Blbl9wcm9jKHVuc2lnbmVkIHR5cGUsIHN0cnVjdCBEYmdfQ29uZmlnQmxvY2sgY29uc3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IERiZ19Ib3N0b3NJbnRlcmZhY2UgY29uc3QgKmksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBEYmdfTUNTdGF0ZSAqZGJnX3N0YXRlKTsKK3R5cGVkZWYgaW50IHJkaV9jbG9zZV9wcm9jKHZvaWQpOwordHlwZWRlZiBpbnQgcmRpX3JlYWRfcHJvYyhBUk13b3JkIHNvdXJjZSwgdm9pZCAqZGVzdCwgdW5zaWduZWQgKm5ieXRlcyk7Cit0eXBlZGVmIGludCByZGlfd3JpdGVfcHJvYyhjb25zdCB2b2lkICpzb3VyY2UsIEFSTXdvcmQgZGVzdCwgdW5zaWduZWQgKm5ieXRlcyk7Cit0eXBlZGVmIGludCByZGlfQ1BVcmVhZF9wcm9jKHVuc2lnbmVkIG1vZGUsIHVuc2lnbmVkIGxvbmcgbWFzaywgQVJNd29yZCAqc3RhdGUpOwordHlwZWRlZiBpbnQgcmRpX0NQVXdyaXRlX3Byb2ModW5zaWduZWQgbW9kZSwgdW5zaWduZWQgbG9uZyBtYXNrLCBBUk13b3JkIGNvbnN0ICpzdGF0ZSk7Cit0eXBlZGVmIGludCByZGlfQ1ByZWFkX3Byb2ModW5zaWduZWQgQ1BudW0sIHVuc2lnbmVkIGxvbmcgbWFzaywgQVJNd29yZCAqc3RhdGUpOwordHlwZWRlZiBpbnQgcmRpX0NQd3JpdGVfcHJvYyh1bnNpZ25lZCBDUG51bSwgdW5zaWduZWQgbG9uZyBtYXNrLCBBUk13b3JkIGNvbnN0ICpzdGF0ZSk7Cit0eXBlZGVmIGludCByZGlfc2V0YnJlYWtfcHJvYyhBUk13b3JkIGFkZHJlc3MsIHVuc2lnbmVkIHR5cGUsIEFSTXdvcmQgYm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludEhhbmRsZSAqaGFuZGxlKTsKK3R5cGVkZWYgaW50IHJkaV9jbGVhcmJyZWFrX3Byb2MoUG9pbnRIYW5kbGUgaGFuZGxlKTsKK3R5cGVkZWYgaW50IHJkaV9zZXR3YXRjaF9wcm9jKEFSTXdvcmQgYWRkcmVzcywgdW5zaWduZWQgdHlwZSwgdW5zaWduZWQgZGF0YXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk13b3JkIGJvdW5kLCBQb2ludEhhbmRsZSAqaGFuZGxlKTsKK3R5cGVkZWYgaW50IHJkaV9jbGVhcndhdGNoX3Byb2MoUG9pbnRIYW5kbGUgaGFuZGxlKTsKK3R5cGVkZWYgaW50IHJkaV9leGVjdXRlX3Byb2MoUG9pbnRIYW5kbGUgKmhhbmRsZSk7Cit0eXBlZGVmIGludCByZGlfc3RlcF9wcm9jKHVuc2lnbmVkIG5pbnN0ciwgUG9pbnRIYW5kbGUgKmhhbmRsZSk7Cit0eXBlZGVmIGludCByZGlfaW5mb19wcm9jKHVuc2lnbmVkIHR5cGUsIEFSTXdvcmQgKmFyZzEsIEFSTXdvcmQgKmFyZzIpOwordHlwZWRlZiBpbnQgcmRpX3BvaW50aW5xX3Byb2MoQVJNd29yZCAqYWRkcmVzcywgdW5zaWduZWQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGRhdGF0eXBlLCBBUk13b3JkICpib3VuZCk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgUkRJX0NvbmZpZ0NQVSwKKyAgICBSRElfQ29uZmlnU3lzdGVtCit9IFJESV9Db25maWdBc3BlY3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgUkRJX01hdGNoQW55LAorICAgIFJESV9NYXRjaEV4YWN0bHksCisgICAgUkRJX01hdGNoTm9FYXJsaWVyCit9IFJESV9Db25maWdNYXRjaFR5cGU7CisKK3R5cGVkZWYgaW50IHJkaV9hZGRjb25maWdfcHJvYyh1bnNpZ25lZCBsb25nIG5ieXRlcyk7Cit0eXBlZGVmIGludCByZGlfbG9hZGNvbmZpZ2RhdGFfcHJvYyh1bnNpZ25lZCBsb25nIG5ieXRlcywgY2hhciBjb25zdCAqZGF0YSk7Cit0eXBlZGVmIGludCByZGlfc2VsZWN0Y29uZmlnX3Byb2MoUkRJX0NvbmZpZ0FzcGVjdCBhc3BlY3QsIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRJX0NvbmZpZ01hdGNoVHlwZSBtYXRjaHR5cGUsIHVuc2lnbmVkIHZlcnNpb25yZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKnZlcnNpb25wKTsKKwordHlwZWRlZiBjaGFyICpnZXRidWZmZXJwcm9jKHZvaWQgKmdldGJhcmcsIHVuc2lnbmVkIGxvbmcgKnNpemVwKTsKK3R5cGVkZWYgaW50IHJkaV9sb2FkYWdlbnRwcm9jKEFSTXdvcmQgZGVzdCwgdW5zaWduZWQgbG9uZyBzaXplLCBnZXRidWZmZXJwcm9jICpnZXRiLCB2b2lkICpnZXRiYXJnKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBpdGVtbWF4OworICAgIGNoYXIgY29uc3QgKiBjb25zdCAqbmFtZXM7Cit9IFJESV9OYW1lTGlzdDsKKwordHlwZWRlZiBSRElfTmFtZUxpc3QgY29uc3QgKnJkaV9uYW1lbGlzdHByb2Modm9pZCk7CisKK3R5cGVkZWYgaW50IHJkaV9lcnJtZXNzcHJvYyhjaGFyICpidWYsIGludCBidWZsZW4sIGludCBlcnJubyk7CisKK3N0cnVjdCBSRElQcm9jVmVjIHsKKyAgICBjaGFyIHJkaXR5cGVuYW1lWzEyXTsKKworICAgIHJkaV9vcGVuX3Byb2MgICAgICAgKm9wZW47CisgICAgcmRpX2Nsb3NlX3Byb2MgICAgICAqY2xvc2U7CisgICAgcmRpX3JlYWRfcHJvYyAgICAgICAqcmVhZDsKKyAgICByZGlfd3JpdGVfcHJvYyAgICAgICp3cml0ZTsKKyAgICByZGlfQ1BVcmVhZF9wcm9jICAgICpDUFVyZWFkOworICAgIHJkaV9DUFV3cml0ZV9wcm9jICAgKkNQVXdyaXRlOworICAgIHJkaV9DUHJlYWRfcHJvYyAgICAgKkNQcmVhZDsKKyAgICByZGlfQ1B3cml0ZV9wcm9jICAgICpDUHdyaXRlOworICAgIHJkaV9zZXRicmVha19wcm9jICAgKnNldGJyZWFrOworICAgIHJkaV9jbGVhcmJyZWFrX3Byb2MgKmNsZWFyYnJlYWs7CisgICAgcmRpX3NldHdhdGNoX3Byb2MgICAqc2V0d2F0Y2g7CisgICAgcmRpX2NsZWFyd2F0Y2hfcHJvYyAqY2xlYXJ3YXRjaDsKKyAgICByZGlfZXhlY3V0ZV9wcm9jICAgICpleGVjdXRlOworICAgIHJkaV9zdGVwX3Byb2MgICAgICAgKnN0ZXA7CisgICAgcmRpX2luZm9fcHJvYyAgICAgICAqaW5mbzsKKyAgICAvKiBWMiBSREkgKi8KKyAgICByZGlfcG9pbnRpbnFfcHJvYyAgICpwb2ludGlucXVpcnk7CisKKyAgICAvKiBUaGVzZSB0aHJlZSB1c2VhYmxlIG9ubHkgaWYgUkRJSW5mb19Eb3duTG9hZCByZXR1cm5zIG5vIGVycm9yICovCisgICAgcmRpX2FkZGNvbmZpZ19wcm9jICAqYWRkY29uZmlnOworICAgIHJkaV9sb2FkY29uZmlnZGF0YV9wcm9jICpsb2FkY29uZmlnZGF0YTsKKyAgICByZGlfc2VsZWN0Y29uZmlnX3Byb2MgKnNlbGVjdGNvbmZpZzsKKworICAgIHJkaV9uYW1lbGlzdHByb2MgICAgKmRyaXZlcm5hbWVzOworICAgIHJkaV9uYW1lbGlzdHByb2MgICAgKmNwdW5hbWVzOworCisgICAgcmRpX2Vycm1lc3Nwcm9jICAgICAqZXJybWVzczsKKworICAgIC8qIE9ubHkgaWYgUkRJSW5mb19UYXJnZXQgcmV0dXJucyBhIHZhbHVlIHdpdGggUkRJVGFyZ2V0X0xvYWRBZ2VudCBzZXQgKi8KKyAgICByZGlfbG9hZGFnZW50cHJvYyAgICpsb2FkYWdlbnQ7Cit9OworCisjZW5kaWYKKworCisKKworCisKZGlmZiAtLWdpdCBhL3NpbS9hcm0vZ2RiaG9zdC5jIGIvc2ltL2FybS9nZGJob3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5Mzg0MgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9hcm0vZ2RiaG9zdC5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiAgZ2RiaG9zdC5jIC0tIEFSTXVsYXRvciBSRFAgdG8gZ2RiIGNvbW1zIGNvZGU6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgorICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9ucyB0aGF0IGNvbW11bmljYXRlIGluZm8gYmFjayB0byB0aGUgZGVidWdnZXIuLi4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAiYXJtZGVmcy5oIgorI2luY2x1ZGUgImNvbW11bmljYXRlLmgiCisjaW5jbHVkZSAiZGJnX3JkaS5oIgorI2luY2x1ZGUgImFybW9zLmgiCisKKyNkZWZpbmUgT1NfU2VuZE5vdGhpbmcgMHgwCisjZGVmaW5lIE9TX1NlbmRDaGFyIDB4MQorI2RlZmluZSBPU19TZW5kV29yZCAweDIKKyNkZWZpbmUgT1NfU2VuZFN0cmluZyAweDMKKworLyogRGVmaW5lZCBpbiBraWQuYyAqLworZXh0ZXJuIGludCB3YWl0X2Zvcl9vc3JlcGx5KEFSTXdvcmQgKnJlcGx5KTsKKworLyogQSBwaXBlIGZvciBoYW5kbGluZyBTV0kgcmV0dXJuIHZhbHVlcyB0aGF0IGdvZXMgc3RyYWlnaHQgZnJvbSB0aGUgKi8KKy8qIHBhcmVudCB0byB0aGUgQVJNdWxhdG9yIGhvc3QgaW50ZXJmYWNlLCBieXBhc3NpbmcgdGhlIGNoaWxkcyBSRFAgKi8KKy8qIHRvIFJESSBpbnRlcnByZXRlciAqLworaW50IERlYnVnZ2VyQVJNdWxbMl07CisKKy8qIFRoZSBwaXBlcyBiZXR3ZWVuIHRoZSB0d28gcHJvY2Vzc2VzICovCitpbnQgbXVta2lkWzJdOworaW50IGtpZG11bVsyXTsKKwordm9pZCBteXByaW50ICh2b2lkICphcmcsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKyNpZmRlZiBERUJVRworICBmcHJpbnRmIChzdGRlcnIsICJIb3N0OiBteXByaW50XG4iKTsKKyNlbmRpZgorICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFwKTsKK30KKworCisvKiBXYWl0cyBmb3IgYSBrZXlwcmVzcyBvbiB0aGUgZGVidWdnZXJzJyBrZXlib2FyZCAqLwordm9pZCBteXBhdXNlICh2b2lkICphcmcpCit7CisjaWZkZWYgREVCVUcKKyAgZnByaW50ZiAoc3RkZXJyLCAiSG9zdDogbXlwYXVzZVxuIik7CisjZW5kaWYKK30gIC8qIEkgZG8gbG92ZSBleGNpdGluZyBmdW5jdGlvbnMgKi8KKwordm9pZCBteXdyaXRlYyh2b2lkICphcmcsIGludCBjKQoreworI2lmZGVmIERFQlVHCisgIGZwcmludGYoc3RkZXJyLCAiTXl3cml0ZSA6ICVjXG4iLCBjKTsKKyNlbmRpZgorICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCBSRFBfT1NPcCk7ICAgICAvKiBPUyBPcGVyYXRpb24gUmVxdWVzdCBNZXNzYWdlICovCisgIE1Zd3JpdGVfd29yZChraWRtdW1bMV0sIFNXSV9Xcml0ZUMpOyAgIC8qIFByaW50Li4uICovCisgIE1Zd3JpdGVfY2hhcihraWRtdW1bMV0sIE9TX1NlbmRDaGFyKTsgIC8qICAuLi5hIHNpbmdsZSBjaGFyYWN0ZXIgKi8gCisgIE1Zd3JpdGVfY2hhcihraWRtdW1bMV0sICh1bnNpZ25lZCBjaGFyKSBjKTsKKyAgCisgIHdhaXRfZm9yX29zcmVwbHkoKEFSTXdvcmQgKikgMCk7Cit9CisKK2ludCBteXJlYWRjKHZvaWQgKmFyZykKK3sKKyAgY2hhciBjOworICBBUk13b3JkIHg7CisgIAorI2lmZGVmIERFQlVHCisgIGZwcmludGYoc3RkZXJyLCAiSG9zdDogbXlyZWFkY1xuIik7CisjZW5kaWYKKyAgTVl3cml0ZV9jaGFyKGtpZG11bVsxXSwgUkRQX09TT3ApOyAgLyogT1MgT3BlcmF0aW9uIFJlcXVlc3QgTWVzc2FnZSAqLworICBNWXdyaXRlX3dvcmQoa2lkbXVtWzFdLCBTV0lfUmVhZEMpOyAvKiBSZWFkLi4uICovCisgIE1Zd3JpdGVfY2hhcihraWRtdW1bMV0sIE9TX1NlbmROb3RoaW5nKTsKKyAgCisgIGMgPSB3YWl0X2Zvcl9vc3JlcGx5KCZ4KTsKKyAgcmV0dXJuICh4KTsKK30KKworCitpbnQgbXl3cml0ZSh2b2lkICphcmcsIGNoYXIgY29uc3QgKmJ1ZmZlciwgaW50IGxlbikKK3sKKyNpZmRlZiBERUJVRworICBmcHJpbnRmKHN0ZGVyciwgIkhvc3Q6IG15d3JpdGVcbiIpOworI2VuZGlmCisgIHJldHVybiAwOworfQorCitjaGFyICpteWdldHModm9pZCAqYXJnLCBjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisjaWZkZWYgREVCVUcKKyAgZnByaW50ZihzdGRlcnIsICJIb3N0OiBteWdldHNcbiIpOworI2VuZGlmCisgIHJldHVybiBidWZmZXI7Cit9CmRpZmYgLS1naXQgYS9zaW0vYXJtL2dkYmhvc3QuaCBiL3NpbS9hcm0vZ2RiaG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYmZkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vYXJtL2dkYmhvc3QuaApAQCAtMCwwICsxLDIzIEBACisvKiAgZ2RiaG9zdC5oIC0tIEFSTXVsYXRvciB0byBnZGIgaW50ZXJmYWNlOiAgQVJNNiBJbnN0cnVjdGlvbiBFbXVsYXRvci4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQgQWR2YW5jZWQgUklTQyBNYWNoaW5lcyBMdGQuCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLworCit2b2lkIG15cHJpbnQodm9pZCAqYXJnLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApOwordm9pZCBteXBhdXNlKHZvaWQgKmFyZyk7Cit2b2lkIG15d3JpdGVjKHZvaWQgKmFyZywgaW50IGMpOworaW50IG15cmVhZGModm9pZCAqYXJnKTsKK2ludCBteXdyaXRlKHZvaWQgKmFyZywgY2hhciBjb25zdCAqYnVmZmVyLCBpbnQgbGVuKTsKK2NoYXIgKm15Z2V0cyh2b2lkICphcmcsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbik7CmRpZmYgLS1naXQgYS9zaW0vYXJtL2tpZC5jIGIvc2ltL2FybS9raWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGUzZjM1OAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9hcm0va2lkLmMKQEAgLTAsMCArMSw1MTAgQEAKKy8qICBraWQuYyAtLSBBUk11bGF0b3IgUkRQL1JESSBpbnRlcmZhY2U6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgorICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoZSBjaGlsZCBwcm9jZXNzIGNvbnRpbnVlcyBoZXJlLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEl0IHdhaXRzIG9uIGEgcGlwZSBmcm9tIHRoZSBwYXJlbnQgYW5kIHRyYW5zbGF0ZXMgdGhlIFJEUCAgICAgKi8KKy8qIG1lc3NhZ2VzIGludG8gUkRJIGNhbGxzIHRvIHRoZSBBUk11bGF0b3IgcGFzc2luZyBSRFAgcmVwbGllcyAgKi8KKy8qIGJhY2sgdXAgYSBwaXBlIHRvIHRoZSBwYXJlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSAiYXJtZGVmcy5oIgorI2luY2x1ZGUgImRiZ19jb25mLmgiCisjaW5jbHVkZSAiZGJnX2hpZi5oIgorI2luY2x1ZGUgImRiZ19yZGkuaCIKKyNpbmNsdWRlICJnZGJob3N0LmgiCisjaW5jbHVkZSAiY29tbXVuaWNhdGUuaCIKKworLyogVGhlIHBpcGVzIGJldHdlZW4gdGhlIHR3byBwcm9jZXNzZXMgKi8KK2V4dGVybiBpbnQgbXVta2lkWzJdOworZXh0ZXJuIGludCBraWRtdW1bMl07CisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzICovCitleHRlcm4gaW50IG5mZHM7CisKKy8qIFRoZSBtYWNoaW5lIG5hbWUgKi8KKyNkZWZpbmUgTUFYSE9TVE5BTUVMRU5HVEggNjQKK2V4dGVybiBjaGFyIGxvY2FsaG9zdFtNQVhIT1NUTkFNRUxFTkdUSCArIDFdOworCisvKiBUaGUgc29ja2V0IG51bWJlciAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBzb2NrZXRudW1iZXI7CisKKy8qIFJESSBpbnRlcmZhY2UgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgUkRJUHJvY1ZlYyBhcm11bF9yZGk7CisKK3N0YXRpYyBpbnQgTVlyZHBfbGV2ZWwgPSAwOworCitzdGF0aWMgaW50IHJkaV9zdGF0ZSA9IDA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNpZ25hbCBoYW5kbGVyIHRoYXQgdGVybWluYXRlcyBleGNlY3V0aW9uIGluIHRoZSBBUk11bGF0b3IgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQga2lkX2hhbmRsZXNpZ25hbChpbnQgc2lnKSB7CisjaWZkZWYgREVCVUcKKyAgZnByaW50ZihzdGRlcnIsICJUZXJtaW5hdGUgQVJNdWxhdG9yIGV4Y2VjdXRpb25cbiIpOworI2VuZGlmCisgIGlmIChzaWcgIT0gU0lHVVNSMSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiVW5zdXBwb3J0ZWQgc2lnbmFsLlxuIik7CisgICAgcmV0dXJuOworICB9CisgIGFybXVsX3JkaS5pbmZvKFJESVNpZ25hbF9TdG9wLCAodW5zaWduZWQgbG9uZyAqKSAwLCAodW5zaWduZWQgbG9uZyAqKSAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogV2FpdHMgb24gYSBwaXBlIGZyb20gdGhlIHNvY2tldCBkZW1vbiBmb3IgUkRQIGFuZCAgICAgICAgICAgICAgICAqLworLyogYWN0cyBhcyBhbiBSRFAgdG8gUkRJIGludGVycHJldGVyIG9uIHRoZSBmcm9udCBvZiB0aGUgQVJNdWxhdG9yLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBraWQoKSB7CisgIGNoYXIgKnAsICpxOworICBpbnQgaSwgaiwgazsKKyAgbG9uZyBvdXRvZnRoZWJhZzsKKyAgdW5zaWduZWQgY2hhciBjLCBkLCBtZXNzYWdlOworICBBUk13b3JkIHgsIHksIHo7CisgIHN0cnVjdCBzaWdhY3Rpb24gYWN0aW9uOworICBQb2ludEhhbmRsZSBwb2ludDsKKyAgRGJnX0NvbmZpZ0Jsb2NrIGNvbmZpZzsKKyAgRGJnX0hvc3Rvc0ludGVyZmFjZSBob3N0aWY7CisgIHN0cnVjdCBEYmdfTUNTdGF0ZSAqTUNTdGF0ZTsKKyAgY2hhciBjb21tYW5kX2xpbmVbMjU2XTsKKyAgc3RydWN0IGZkX3NldCByZWFkZmRzOworICAKKyAgLyogU2V0dXAgYSBzaWduYWwgaGFuZGxlciBmb3IgU0lHVVNSMSAqLworICBhY3Rpb24uc2FfaGFuZGxlciA9IGtpZF9oYW5kbGVzaWduYWw7CisgIGFjdGlvbi5zYV9tYXNrID0gMDsKKyAgYWN0aW9uLnNhX2ZsYWdzID0gMDsKKyAgCisgIHNpZ2FjdGlvbihTSUdVU1IxLCAmYWN0aW9uLCAoc3RydWN0IHNpZ2FjdGlvbiAqKSAwKTsKKyAgCisgIHdoaWxlICgxKQorICB7CisgICAgLyogV2FpdCBmb3IgZXZlciAqLworICAgIEZEX1pFUk8oJnJlYWRmZHMpOworICAgIEZEX1NFVChtdW1raWRbMF0sICZyZWFkZmRzKTsKKyAgICAKKyAgICBpID0gc2VsZWN0KG5mZHMsICZyZWFkZmRzLAorCSAgICAgICAoZmRfc2V0ICopIDAsCisJICAgICAgIChmZF9zZXQgKikgMCwKKwkgICAgICAgKHN0cnVjdCB0aW1ldmFsICopIDApOworICAgIAorICAgIGlmIChpIDwgMCkgeworICAgICAgcGVycm9yKCJzZWxlY3QiKTsKKyAgICB9CisgICAgCisgICAgaWYgKHJlYWQobXVta2lkWzBdLCAmbWVzc2FnZSwgMSkgPCAxKSB7CisgICAgICBwZXJyb3IoInJlYWQiKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1lc3NhZ2UpIHsKKyAgICBjYXNlIFJEUF9TdGFydCA6CisgICAgICAvKiBPcGVuIGFuZC9vciBJbml0aWFsaXNlICovCisgICAgICBCQUdfbmV3YmFnKCk7CisKKyAgICAgIE1ZcmVhZF9jaGFyKG11bWtpZFswXSwgJmMpOyAvKiB0eXBlICovCisgICAgICBNWXJlYWRfd29yZChtdW1raWRbMF0sICZ4KTsgLyogbWVtb3J5c2l6ZSAqLworICAgICAgaWYgKGMgJiAweDIpIE1ZcmVhZF9jaGFyKG11bWtpZFswXSwgJmQpOyAvKiBzcGVlZCAqLworICAgICAgY29uZmlnLnByb2Nlc3NvciA9IDA7CisgICAgICBjb25maWcubWVtb3J5c2l6ZSA9IHg7CisgICAgICBjb25maWcuYnl0ZXNleCA9IChjICYgMHg0KSA/IFJESVNleF9CaWcgOiBSRElTZXhfTGl0dGxlOworICAgICAgaWYgKGMgJiAweDgpIGNvbmZpZy5ieXRlc2V4ID0gUkRJU2V4X0RvbnRDYXJlOworCisgICAgICBob3N0aWYuZGJncHJpbnQgPSBteXByaW50OworICAgICAgaG9zdGlmLmRiZ3BhdXNlID0gbXlwYXVzZTsKKyAgICAgIGhvc3RpZi5kYmdhcmcgPSBzdGRvdXQ7CisgICAgICBob3N0aWYud3JpdGVjID0gbXl3cml0ZWM7CisgICAgICBob3N0aWYucmVhZGMgPSBteXJlYWRjOworICAgICAgaG9zdGlmLndyaXRlID0gbXl3cml0ZTsKKyAgICAgIGhvc3RpZi5nZXRzID0gbXlnZXRzOworICAgICAgaG9zdGlmLnJlc2V0ID0gbXlwYXVzZTsgLyogZG8gbm90aGluZyAqLworICAgICAgaG9zdGlmLnJlc2V0YXJnID0gIkRvIEkgbG92ZSByZXNldHRpbmcgb3Igd2hhdCFcbiI7CisKKyAgICAgIGlmIChyZGlfc3RhdGUpCisgICAgICB7CisJLyogd2UgaGF2ZSByZXN0YXJ0ZWQsIHNvIGtpbGwgb2ZmIHRoZSBleGlzdGluZyBydW4uICAqLworCS8qIGFybXVsX3JkaS5jbG9zZSgpOyAqLworICAgICAgfQorICAgICAgaSA9IGFybXVsX3JkaS5vcGVuKGMgJiAweDMsICZjb25maWcsICZob3N0aWYsIE1DU3RhdGUpOworICAgICAgcmRpX3N0YXRlID0gMTsKKworICAgICAgTVl3cml0ZV9jaGFyKGtpZG11bVsxXSwgUkRQX1JldHVybik7CisgICAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaSk7CisKKyAgICAgIHggPSB+MHg0OworICAgICAgYXJtdWxfcmRpLmluZm8oUkRJVmVjdG9yX0NhdGNoLCAmeCwgMCk7CisKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRFBfRW5kIDoKKyAgICAgIC8qIENsb3NlIGFuZCBGaW5hbGlzZSAqLworICAgICAgaSA9IGFybXVsX3JkaS5jbG9zZSgpOworICAgICAgcmRpX3N0YXRlID0gMDsKKyAgICAgIE1Zd3JpdGVfY2hhcihraWRtdW1bMV0sIFJEUF9SZXR1cm4pOworICAgICAgTVl3cml0ZV9jaGFyKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJEUF9SZWFkIDoKKyAgICAgIC8qIFJlYWQgTWVtb3J5IEFkZHJlc3MgKi8gICAgICAKKyAgICAgIE1ZcmVhZF93b3JkKG11bWtpZFswXSwgJngpOyAvKiBhZGRyZXNzICovCisgICAgICBNWXJlYWRfd29yZChtdW1raWRbMF0sICZ5KTsgLyogbmJ5dGVzICovCisgICAgICBwID0gKGNoYXIgKikgbWFsbG9jKHkpOworICAgICAgaSA9IGFybXVsX3JkaS5yZWFkKHgsIHAsICh1bnNpZ25lZCAqKSAmeSk7CisgICAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKKyAgICAgIGZvciAoayA9IDA7IGsgPCB5OyBrKyspCisJTVl3cml0ZV9jaGFyKGtpZG11bVsxXSwgcFtrXSk7CisgICAgICBmcmVlKHApOworICAgICAgTVl3cml0ZV9jaGFyKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOworICAgICAgaWYgKGkpCisJTVl3cml0ZV93b3JkKGtpZG11bVsxXSwgeSk7IC8qIG51bWJlciBvZiBieXRlcyBzZW50IHdpdGhvdXQgZXJyb3IgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRFBfV3JpdGUgOgorICAgICAgLyogV3JpdGUgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICAgIE1ZcmVhZF93b3JkKG11bWtpZFswXSwgJngpOyAvKiBhZGRyZXNzICovCisgICAgICBNWXJlYWRfd29yZChtdW1raWRbMF0sICZ5KTsgLyogbmJ5dGVzICovCisgICAgICBwID0gKGNoYXIgKikgbWFsbG9jKHkpOworICAgICAgZm9yIChrID0gMDsgayA8IHk7IGsrKykKKwlNWXJlYWRfY2hhcihtdW1raWRbMF0sICZwW2tdKTsKKyAgICAgIGkgPSBhcm11bF9yZGkud3JpdGUocCwgeCwgKHVuc2lnbmVkICopICZ5KTsKKyAgICAgIGZyZWUocCk7CisgICAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKKyAgICAgIE1Zd3JpdGVfY2hhcihraWRtdW1bMV0sICh1bnNpZ25lZCBjaGFyKSBpKTsKKyAgICAgIGlmIChpKQorCU1Zd3JpdGVfd29yZChraWRtdW1bMV0sIHkpOyAvKiBudW1iZXIgb2YgYnl0ZXMgc2VudCB3aXRob3V0IGVycm9yICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgUkRQX0NQVXJlYWQgOgorICAgICAgLyogUmVhZCBDUFUgU3RhdGUgKi8KKyAgICAgIE1ZcmVhZF9jaGFyKG11bWtpZFswXSwgJmMpOyAvKiBtb2RlICovCisgICAgICBNWXJlYWRfd29yZChtdW1raWRbMF0sICZ4KTsgLyogbWFzayAqLworICAgICAgcCA9IChjaGFyICopIG1hbGxvYyg0ICogUkRJTnVtQ1BVUmVncyk7CisgICAgICBpID0gYXJtdWxfcmRpLkNQVXJlYWQoYywgeCwgKEFSTXdvcmQgKikgcCk7CisgICAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKKyAgICAgIGZvciAoayA9IDEsIGogPSAwOyBrICE9IDB4ODAwMDAwMDA7IGsgKj0gMikKKwlpZiAoayAmIHgpIE1Zd3JpdGVfd29yZChraWRtdW1bMV0sICgoQVJNd29yZCAqKSBwKVtqKytdKTsKKyAgICAgIGZyZWUocCk7CisgICAgICBpZiAoaSkgTVl3cml0ZV9jaGFyKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGopOworICAgICAgTVl3cml0ZV9jaGFyKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJEUF9DUFV3cml0ZSA6CisgICAgICAvKiBXcml0ZSBDUFUgU3RhdGUgKi8KKyAgICAgIE1ZcmVhZF9jaGFyKG11bWtpZFswXSwgJmMpOyAvKiBtb2RlICovCisgICAgICBNWXJlYWRfd29yZChtdW1raWRbMF0sICZ4KTsgLyogbWFzayAqLworCisgICAgICBwID0gKGNoYXIgKikgbWFsbG9jKDQgKiBSRElOdW1DUFVSZWdzKTsKKyAgICAgIGZvciAoayA9IDEsIGogPSAwOyBrICE9IDB4ODAwMDAwMDA7IGsgKj0gMikKKwlpZiAoayAmIHgpIE1ZcmVhZF93b3JkKG11bWtpZFswXSwgJigoKEFSTXdvcmQgKikgcClbaisrXSkpOworICAgICAgaSA9IGFybXVsX3JkaS5DUFV3cml0ZShjLCB4LCAoQVJNd29yZCAqKSBwKTsKKyAgICAgIE1Zd3JpdGVfY2hhcihraWRtdW1bMV0sIFJEUF9SZXR1cm4pOworICAgICAgTVl3cml0ZV9jaGFyKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOworICAgICAgZnJlZShwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRFBfQ1ByZWFkIDoKKyAgICAgIC8qIFJlYWQgQ28tUHJvY2Vzc29yIFN0YXRlICovCisgICAgICBNWXJlYWRfY2hhcihtdW1raWRbMF0sICZjKTsgLyogQ1BudW0gKi8KKyAgICAgIE1ZcmVhZF93b3JkKG11bWtpZFswXSwgJngpOyAvKiBtYXNrICovCisgICAgICBwID0gcSA9IChjaGFyICopIG1hbGxvYygxNiAqIFJESU51bUNQUmVncyk7CisgICAgICBpID0gYXJtdWxfcmRpLkNQcmVhZChjLCB4LCAoQVJNd29yZCAqKSBwKTsKKyAgICAgIE1Zd3JpdGVfY2hhcihraWRtdW1bMV0sIFJEUF9SZXR1cm4pOworICAgICAgZm9yIChrID0gMSwgaiA9IDA7IGsgIT0gMHg4MDAwMDAwMDsgayAqPSAyLCBqKyspCisJaWYgKGsgJiB4KSB7CisJICBpZiAoKGMgPT0gMSB8fCBjID09IDIpICYmIGsgPD0gMTI4KSB7CisJICAgIE1Zd3JpdGVfRlB3b3JkKGtpZG11bVsxXSwgcSk7CisJICAgIHEgKz0gMTY7CisJICB9CisJICBlbHNlIHsKKwkgICAgTVl3cml0ZV93b3JkKGtpZG11bVsxXSwgKnEpOworCSAgICBxICs9IDQ7CisJICB9CisJfQorICAgICAgZnJlZShwKTsKKyAgICAgIGlmIChpKSBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaik7CisgICAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkRQX0NQd3JpdGUgOgorICAgICAgLyogV3JpdGUgQ28tUHJvY2Vzc29yIFN0YXRlICovCisgICAgICBNWXJlYWRfY2hhcihtdW1raWRbMF0sICZjKTsgLyogQ1BudW0gKi8KKyAgICAgIE1ZcmVhZF93b3JkKG11bWtpZFswXSwgJngpOyAvKiBtYXNrICovCisgICAgICBwID0gcSA9IChjaGFyICopIG1hbGxvYygxNiAqIFJESU51bUNQVVJlZ3MpOworICAgICAgZm9yIChrID0gMSwgaiA9IDA7IGsgIT0gMHg4MDAwMDAwMDsgayAqPSAyLCBqKyspCisJaWYgKGsgJiB4KSB7CisJICBpZiAoKGMgPT0gMSB8fCBjID09IDIpICYmIGsgPD0gMTI4KSB7CisJICAgIE1ZcmVhZF9GUHdvcmQoa2lkbXVtWzFdLCBxKTsKKwkgICAgcSArPSAxNjsKKwkgIH0KKwkgIGVsc2UgeworCSAgICBNWXJlYWRfd29yZChtdW1raWRbMF0sIChBUk13b3JkICopIHEpOworCSAgICBxICs9IDQ7CisJICB9CisJfQorICAgICAgaSA9IGFybXVsX3JkaS5DUHdyaXRlKGMsIHgsIChBUk13b3JkICopIHApOworICAgICAgTVl3cml0ZV9jaGFyKGtpZG11bVsxXSwgUkRQX1JldHVybik7CisgICAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaSk7CisgICAgICBmcmVlKHApOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIFJEUF9TZXRCcmVhayA6CisgICAgICAvKiBTZXQgQnJlYWtwb2ludCAqLworICAgICAgTVlyZWFkX3dvcmQobXVta2lkWzBdLCAmeCk7IC8qIGFkZHJlc3MgKi8KKyAgICAgIE1ZcmVhZF9jaGFyKG11bWtpZFswXSwgJmMpOyAvKiB0eXBlICovCisgICAgICBpZiAoKGMgJiAweGYpID49IDUpIE1ZcmVhZF93b3JkKG11bWtpZFswXSwgJnkpOyAvKiBib3VuZCAqLworICAgICAgaSA9IGFybXVsX3JkaS5zZXRicmVhayh4LCBjLCB5LCAmcG9pbnQpOworICAgICAgaWYgKCFNWXJkcF9sZXZlbCkgQkFHX3B1dHBhaXIoKGxvbmcpIHgsIChsb25nKSBwb2ludCk7CisgICAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKKyAgICAgIGlmIChNWXJkcF9sZXZlbCkgTVl3cml0ZV93b3JkKGtpZG11bVsxXSwgcG9pbnQpOworICAgICAgTVl3cml0ZV9jaGFyKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOyAgICAgIAorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJEUF9DbGVhckJyZWFrIDoKKyAgICAgIC8qIENsZWFyIEJyZWFrcG9pbnQgKi8KKyAgICAgIE1ZcmVhZF93b3JkKG11bWtpZFswXSwgJnBvaW50KTsgLyogUG9pbnRIYW5kbGUgKi8KKyAgICAgIGlmICghTVlyZHBfbGV2ZWwpIHsKKwlCQUdfZ2V0c2Vjb25kKChsb25nKSBwb2ludCwgJm91dG9mdGhlYmFnKTsgLyogc3dhcCBwb2ludGhhbmRsZSBmb3IgYWRkcmVzcyAqLworCUJBR19raWxscGFpcl9ieWZpcnN0KG91dG9mdGhlYmFnKTsKKwlwb2ludCA9IG91dG9mdGhlYmFnOworICAgICAgfQorICAgICAgaSA9IGFybXVsX3JkaS5jbGVhcmJyZWFrKHBvaW50KTsKKyAgICAgIE1Zd3JpdGVfY2hhcihraWRtdW1bMV0sIFJEUF9SZXR1cm4pOworICAgICAgTVl3cml0ZV9jaGFyKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJEUF9TZXRXYXRjaCA6CisgICAgICAvKiBTZXQgV2F0Y2hwb2ludCAqLworICAgICAgTVlyZWFkX3dvcmQobXVta2lkWzBdLCAmeCk7IC8qIGFkZHJlc3MgKi8KKyAgICAgIE1ZcmVhZF9jaGFyKG11bWtpZFswXSwgJmMpOyAvKiB0eXBlICovCisgICAgICBNWXJlYWRfY2hhcihtdW1raWRbMF0sICZkKTsgLyogZGF0YXR5cGUgKi8KKyAgICAgIGlmICgoYyAmIDB4ZikgPj0gNSkgTVlyZWFkX3dvcmQobXVta2lkWzBdLCAmeSk7IC8qIGJvdW5kICovCisgICAgICBpID0gYXJtdWxfcmRpLnNldHdhdGNoKHgsIGMsIGQsIHksICZwb2ludCk7CisgICAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKKyAgICAgIE1Zd3JpdGVfd29yZChraWRtdW1bMV0sIHBvaW50KTsKKyAgICAgIE1Zd3JpdGVfY2hhcihraWRtdW1bMV0sICh1bnNpZ25lZCBjaGFyKSBpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRFBfQ2xlYXJXYXRjaCA6CisgICAgICAvKiBDbGVhciBXYXRjaHBvaW50ICovCisgICAgICBNWXJlYWRfd29yZChtdW1raWRbMF0sICZwb2ludCk7IC8qIFBvaW50SGFuZGxlICovCisgICAgICBpID0gYXJtdWxfcmRpLmNsZWFyd2F0Y2gocG9pbnQpOworICAgICAgTVl3cml0ZV9jaGFyKGtpZG11bVsxXSwgUkRQX1JldHVybik7CisgICAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkRQX0V4ZWN1dGUgOgorICAgICAgLyogRXhjZWN1dGUgKi8KKyAgICAgIAorICAgICAgTVlyZWFkX2NoYXIobXVta2lkWzBdLCAmYyk7IC8qIHJldHVybiAqLworCisjaWZkZWYgREVCVUcKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiU3RhcnRpbmcgZXhlY3V0aW9uXG4iKTsKKyNlbmRpZgorICAgICAgaSA9IGFybXVsX3JkaS5leGVjdXRlKCZwb2ludCk7CisjaWZkZWYgREVCVUcKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiQ29tcGxldGVkIGV4ZWN1dGlvblxuIik7CisjZW5kaWYKKyAgICAgIE1Zd3JpdGVfY2hhcihraWRtdW1bMV0sIFJEUF9SZXR1cm4pOworICAgICAgaWYgKGMgJiAweDgwKSBNWXdyaXRlX3dvcmQoa2lkbXVtWzFdLCBwb2ludCk7CisgICAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkRQX1N0ZXAgOgorICAgICAgLyogU3RlcCAqLworICAgICAgTVlyZWFkX2NoYXIobXVta2lkWzBdLCAmYyk7IC8qIHJldHVybiAqLworICAgICAgTVlyZWFkX3dvcmQobXVta2lkWzBdLCAmeCk7IC8qIG5pbnN0ciAqLworICAgICAgcG9pbnQgPSAweDg3NjU0MzIxOworICAgICAgaSA9IGFybXVsX3JkaS5zdGVwKHgsICZwb2ludCk7CisgICAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKKyAgICAgIGlmIChjICYgMHg4MCkgTVl3cml0ZV93b3JkKGtpZG11bVsxXSwgcG9pbnQpOworICAgICAgTVl3cml0ZV9jaGFyKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJEUF9JbmZvOgorICAgICAgLyogSW5mbyAqLworICAgICAgTVlyZWFkX3dvcmQgKG11bWtpZFswXSwgJngpOworICAgICAgc3dpdGNoICh4KQorCXsKKwljYXNlIFJESUluZm9fVGFyZ2V0OgorCSAgaSA9IGFybXVsX3JkaS5pbmZvIChSRElJbmZvX1RhcmdldCwgJnksICZ6KTsKKwkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKKwkgIE1Zd3JpdGVfd29yZCAoa2lkbXVtWzFdLCB5KTsgLyogTG9hZHMgb2YgaW5mby4uLiAqLworCSAgTVl3cml0ZV93b3JkIChraWRtdW1bMV0sIHopOyAvKiBNb2RlbCAqLworCSAgTVl3cml0ZV9jaGFyIChraWRtdW1bMV0sICh1bnNpZ25lZCBjaGFyKSBpKTsKKwkgIGJyZWFrOworCisJY2FzZSBSRElTZXRfUkRJTGV2ZWw6CisJICBNWXJlYWRfd29yZCAobXVta2lkWzBdLCAmeCk7IC8qIGFyZzEsIGRlYnVnIGxldmVsICovCisJICBpID0gYXJtdWxfcmRpLmluZm8gKFJESVNldF9SRElMZXZlbCwgJngsIDApOworCSAgaWYgKGkgPT0gUkRJRXJyb3JfTm9FcnJvcikKKwkgICAgTVlyZHBfbGV2ZWwgPSB4OworCSAgTVl3cml0ZV9jaGFyIChraWRtdW1bMV0sIFJEUF9SZXR1cm4pOworCSAgTVl3cml0ZV9jaGFyIChraWRtdW1bMV0sICh1bnNpZ25lZCBjaGFyKSBpKTsKKwkgIGJyZWFrOworCisJY2FzZSBSRElTZXRfQ21kbGluZToKKwkgIGZvciAocCA9IGNvbW1hbmRfbGluZTsgTVlyZWFkX2NoYXIgKG11bWtpZFswXSwgcCksICpwOyBwKyspCisJICAgIDsgLyogU3RyaW5nICovCisJICBpID0gYXJtdWxfcmRpLmluZm8gKFJESVNldF9DbWRsaW5lLAorCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgKikgY29tbWFuZF9saW5lLCAwKTsKKwkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKKwkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaSk7CisJICBicmVhazsKKworCWNhc2UgUkRJSW5mb19TdGVwOgorCSAgaSA9IGFybXVsX3JkaS5pbmZvIChSRElJbmZvX1N0ZXAsICZ4LCAwKTsKKwkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKKwkgIE1Zd3JpdGVfd29yZCAoa2lkbXVtWzFdLCB4KTsKKwkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaSk7CisJICBicmVhazsKKworCWNhc2UgUkRJVmVjdG9yX0NhdGNoOgorCSAgTVlyZWFkX3dvcmQgKG11bWtpZFswXSwgJngpOworCSAgaSA9IGFybXVsX3JkaS5pbmZvIChSRElWZWN0b3JfQ2F0Y2gsICZ4LCAwKTsKKwkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKKwkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBpKTsKKwkgIGJyZWFrOworCisJY2FzZSBSRElJbmZvX1BvaW50czoKKwkgIGkgPSBhcm11bF9yZGkuaW5mbyAoUkRJSW5mb19Qb2ludHMsICZ4LCAwKTsKKwkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKKwkgIE1Zd3JpdGVfd29yZCAoa2lkbXVtWzFdLCB4KTsKKwkgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCAodW5zaWduZWQgY2hhcikgaSk7CisJICBicmVhazsKKworCWRlZmF1bHQ6CisJICBmcHJpbnRmIChzdGRlcnIsICJVbnN1cHBvcnRlZCBpbmZvIGNvZGUgJWRcbiIsIHgpOworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJEUF9PU09wUmVwbHk6CisgICAgICAvKiBPUyBPcGVyYXRpb24gUmVwbHkgKi8KKyAgICAgIE1Zd3JpdGVfY2hhciAoa2lkbXVtWzFdLCBSRFBfRmF0YWwpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJEUF9SZXNldDoKKyAgICAgIC8qIFJlc2V0ICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykKKwlNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCBSRFBfUmVzZXQpOworICAgICAgcCA9IChjaGFyICopIG1hbGxvYyhNQVhIT1NUTkFNRUxFTkdUSCArIDUgKyAyMCk7CisgICAgICBzcHJpbnRmKHAsICJSdW5uaW5nIG9uICVzOiVkXG4iLCBsb2NhbGhvc3QsIHNvY2tldG51bWJlcik7CisgICAgICBNWXdyaXRlX3N0cmluZyhraWRtdW1bMV0sIHApOworICAgICAgZnJlZShwKTsKKyAgICAgIAorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIk9oIGRlYXI6IFNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcgOi0oXG4iKTsKKyAgICAgIC8qIEhtbS4uIGJhZCBSRFAgb3BlcmF0aW9uICovCisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworCisvKiBIYW5kbGVzIG1lbW9yeSByZWFkIG9wZXJhdGlvbnMgdW50aWwgYW4gT1MgT3BlcmF0aW9uIFJlcGx5IE1lc3NhZ2UgaXMgKi8KKy8qIGVuY291bnRlcmQuIEl0IHRoZW4gcmV0dXJucyB0aGUgYnl0ZSBpbmZvIHZhbHVlICgwLCAxLCBvciAyKSBhbmQgZmlsbHMgICovCisvKiBpbiAncHV0aW5yMCcgd2l0aCB0aGUgZGF0YSBpZiBhcHByb3ByaWF0ZS4gKi8KK2ludCB3YWl0X2Zvcl9vc3JlcGx5KEFSTXdvcmQgKnJlcGx5KQoreworICBjaGFyICpwLCAqcTsKKyAgaW50IGksIGosIGs7CisgIHVuc2lnbmVkIGNoYXIgYywgZCwgbWVzc2FnZTsKKyAgQVJNd29yZCB4LCB5LCB6OworICBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdGlvbjsKKyAgUG9pbnRIYW5kbGUgcG9pbnQ7CisgIERiZ19Db25maWdCbG9jayBjb25maWc7CisgIERiZ19Ib3N0b3NJbnRlcmZhY2UgaG9zdGlmOworICBzdHJ1Y3QgRGJnX01DU3RhdGUgKk1DU3RhdGU7CisgIGNoYXIgY29tbWFuZF9saW5lWzI1Nl07CisgIHN0cnVjdCBmZF9zZXQgcmVhZGZkczsKKyAgCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZihzdGRlcnIsICJ3YWl0X2Zvcl9vc3JlcGx5ICgpLlxuIik7CisjZW5kaWYKKworICAvKiBTZXR1cCBhIHNpZ25hbCBoYW5kbGVyIGZvciBTSUdVU1IxICovCisgIGFjdGlvbi5zYV9oYW5kbGVyID0ga2lkX2hhbmRsZXNpZ25hbDsKKyAgYWN0aW9uLnNhX21hc2sgPSAwOworICBhY3Rpb24uc2FfZmxhZ3MgPSAwOworICAKKyAgc2lnYWN0aW9uKFNJR1VTUjEsICZhY3Rpb24sIChzdHJ1Y3Qgc2lnYWN0aW9uICopIDApOworICAKKyAgd2hpbGUgKDEpCisgIHsKKyAgICAvKiBXYWl0IGZvciBldmVyICovCisgICAgRkRfWkVSTygmcmVhZGZkcyk7CisgICAgRkRfU0VUKG11bWtpZFswXSwgJnJlYWRmZHMpOworICAgIAorICAgIGkgPSBzZWxlY3QobmZkcywgJnJlYWRmZHMsCisJICAgICAgIChmZF9zZXQgKikgMCwKKwkgICAgICAgKGZkX3NldCAqKSAwLAorCSAgICAgICAoc3RydWN0IHRpbWV2YWwgKikgMCk7CisgICAgCisgICAgaWYgKGkgPCAwKSB7CisgICAgICBwZXJyb3IoInNlbGVjdCIpOworICAgIH0KKyAgICAKKyAgICBpZiAocmVhZChtdW1raWRbMF0sICZtZXNzYWdlLCAxKSA8IDEpIHsKKyAgICAgIHBlcnJvcigicmVhZCIpOworICAgIH0KKyAgICAKKyAgICBzd2l0Y2ggKG1lc3NhZ2UpIHsKKyAgICBjYXNlIFJEUF9SZWFkIDoKKyAgICAgIC8qIFJlYWQgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICAgIE1ZcmVhZF93b3JkKG11bWtpZFswXSwgJngpOyAvKiBhZGRyZXNzICovCisgICAgICBNWXJlYWRfd29yZChtdW1raWRbMF0sICZ5KTsgLyogbmJ5dGVzICovCisgICAgICBwID0gKGNoYXIgKikgbWFsbG9jKHkpOworICAgICAgaSA9IGFybXVsX3JkaS5yZWFkKHgsIHAsICh1bnNpZ25lZCAqKSAmeSk7CisgICAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKKyAgICAgIGZvciAoayA9IDA7IGsgPCB5OyBrKyspCisJTVl3cml0ZV9jaGFyKGtpZG11bVsxXSwgcFtrXSk7CisgICAgICBmcmVlKHApOworICAgICAgTVl3cml0ZV9jaGFyKGtpZG11bVsxXSwgKHVuc2lnbmVkIGNoYXIpIGkpOworICAgICAgaWYgKGkpCisJTVl3cml0ZV93b3JkKGtpZG11bVsxXSwgeSk7IC8qIG51bWJlciBvZiBieXRlcyBzZW50IHdpdGhvdXQgZXJyb3IgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRFBfV3JpdGUgOgorICAgICAgLyogV3JpdGUgTWVtb3J5IEFkZHJlc3MgKi8KKyAgICAgIE1ZcmVhZF93b3JkKG11bWtpZFswXSwgJngpOyAvKiBhZGRyZXNzICovCisgICAgICBNWXJlYWRfd29yZChtdW1raWRbMF0sICZ5KTsgLyogbmJ5dGVzICovCisgICAgICBwID0gKGNoYXIgKikgbWFsbG9jKHkpOworICAgICAgZm9yIChrID0gMDsgayA8IHk7IGsrKykKKwlNWXJlYWRfY2hhcihtdW1raWRbMF0sICZwW2tdKTsKKyAgICAgIGkgPSBhcm11bF9yZGkud3JpdGUocCwgeCwgKHVuc2lnbmVkICopICZ5KTsKKyAgICAgIGZyZWUocCk7CisgICAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCBSRFBfUmV0dXJuKTsKKyAgICAgIE1Zd3JpdGVfY2hhcihraWRtdW1bMV0sICh1bnNpZ25lZCBjaGFyKSBpKTsKKyAgICAgIGlmIChpKQorCU1Zd3JpdGVfd29yZChraWRtdW1bMV0sIHkpOyAvKiBudW1iZXIgb2YgYnl0ZXMgc2VudCB3aXRob3V0IGVycm9yICovCisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgUkRQX09TT3BSZXBseSA6CisgICAgICAvKiBPUyBPcGVyYXRpb24gUmVwbHkgKi8KKyAgICAgIE1ZcmVhZF9jaGFyKG11bWtpZFswXSwgJmMpOworICAgICAgaWYgKGMgPT0gMSkgTVlyZWFkX2NoYXIobXVta2lkWzBdLCAoY2hhciAqKSByZXBseSk7CisgICAgICBpZiAoYyA9PSAyKSBNWXJlYWRfd29yZChtdW1raWRbMF0sIHJlcGx5KTsKKyAgICAgIHJldHVybiBjOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBkZWZhdWx0IDoKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiSEVMUCEgVW5hY2NvdW50ZWQtZm9yIG1lc3NhZ2UgZHVyaW5nIE9TIHJlcXVlc3QuIFxuIik7CisgICAgICBNWXdyaXRlX2NoYXIoa2lkbXVtWzFdLCBSRFBfRmF0YWwpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc2ltL2FybS9tYWluLmMgYi9zaW0vYXJtL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDEyYjI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2FybS9tYWluLmMKQEAgLTAsMCArMSwxODMgQEAKKy8qICBtYWluLmMgLS0gdG9wIGxldmVsIG9mIEFSTXVsYXRvcjogIEFSTTYgSW5zdHJ1Y3Rpb24gRW11bGF0b3IuCisgICAgQ29weXJpZ2h0IChDKSAxOTk0IEFkdmFuY2VkIFJJU0MgTWFjaGluZXMgTHRkLgorIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGb3JrcyB0aGUgQVJNdWxhdG9yIGFuZCBoYW5ncyBvbiBhIHNvY2tldCBwYXNzaW5nIG9uIFJEUCBtZXNzYWdlcyAgKi8KKy8qIGRvd24gYSBwaXBlIHRvIHRoZSBBUk11bGF0b3Igd2hpY2ggdHJhbnNsYXRlcyB0aGVtIGludG8gUkRJIGNhbGxzLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImFybWRlZnMuaCIKKyNpbmNsdWRlICJkYmdfcmRpLmgiCisjaW5jbHVkZSAiZGJnX2NvbmYuaCIKKworI2RlZmluZSBNQVhIT1NUTkFNRUxFTkdUSCA2NAorCisvKiBSZWFkIGFuZCB3cml0ZSByb3V0aW5lcyBkb3duIHNvY2tldHMgYW5kIHBpcGVzICovCisKK3ZvaWQgTVlyZWFkX2NoYXJzKGludCBzb2NrLCB2b2lkICpwLCBpbnQgbik7Cit1bnNpZ25lZCBjaGFyIE1ZcmVhZF9jaGFyKGludCBzb2NrKTsKK0FSTXdvcmQgTVlyZWFkX3dvcmQoaW50IHNvY2spOwordm9pZCBNWXJlYWRfRlB3b3JkKGludCBzb2NrLCBjaGFyICpwdXRpbmhlcmUpOworCit2b2lkIE1Zd3JpdGVfd29yZChpbnQgc29jaywgQVJNd29yZCBpKTsKK3ZvaWQgTVl3cml0ZV9zdHJpbmcoaW50IHNvY2ssIGNoYXIgKnMpOwordm9pZCBNWXdyaXRlX0ZQd29yZChpbnQgc29jaywgY2hhciAqZnJvbWhlcmUpOwordm9pZCBNWXdyaXRlX2NoYXIoaW50IHNvY2ssIHVuc2lnbmVkIGNoYXIgYyk7CisKK3ZvaWQgcGFzc29uKGludCBzb3VyY2UsIGludCBkZXN0LCBpbnQgbik7CisKKworLyogTW90aGVyIGFuZCBjaGlsZCBwcm9jZXNzZXMgKi8KK3ZvaWQgcGFyZW50ICh2b2lkKTsKK3ZvaWQga2lkKHZvaWQpOworCisvKiBUaGUgY2hpbGQgcHJvY2VzcyBpZC4gKi8KK3BpZF90IGNoaWxkOworCisvKiBUaGUgc29ja2V0IHRvIHRoZSBkZWJ1Z2dlciAqLworaW50IGRlYnVnc29jazsKKworLyogVGhlIHBpcGVzIGJldHdlZW4gdGhlIHR3byBwcm9jZXNzZXMgKi8KK2ludCBtdW1raWRbMl07CitpbnQga2lkbXVtWzJdOworCisvKiBBIHBpcGUgZm9yIGhhbmRsaW5nIFNXSSByZXR1cm4gdmFsdWVzIHRoYXQgZ29lcyBzdHJhaWdodCBmcm9tIHRoZSAqLworLyogcGFyZW50IHRvIHRoZSBBUk11bGF0b3IgaG9zdCBpbnRlcmZhY2UsIGJ5cGFzc2luZyB0aGUgY2hpbGRzIFJEUCAqLworLyogdG8gUkRJIGludGVycHJldGVyICovCitpbnQgRGVidWdnZXJBUk11bFsyXTsKKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgKi8KK2ludCBuZmRzOworCisvKiBUaGUgc29ja2V0IGhhbmRsZSAqLworaW50IHNvY2tldGhhbmRsZTsKKworLyogVGhlIG1hY2hpbmUgbmFtZSAqLworY2hhciBsb2NhbGhvc3RbTUFYSE9TVE5BTUVMRU5HVEggKyAxXTsKKworLyogVGhlIHNvY2tldCBudW1iZXIgKi8KK3Vuc2lnbmVkIGludCBzb2NrZXRudW1iZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRha2VzIG9uZSBhcmd1bWVudDogdGhlIHNvY2tldCBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE9wZW5zIGEgc29ja2V0IHRvIHRoZSBkZWJ1Z2dlciwgYW5kIG9uY2Ugb3BlbmVkIHNwYXducyB0aGUgKi8KKy8qIEFSTXVsYXRvciBhbmQgc2V0cyB1cCBhIGNvdXBsZSBvZiBwaXBlcy4gICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyAgaW50IGk7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBkZXZpbCwgaXNhOworICBzdHJ1Y3QgaG9zdGVudCAqaHA7CisKKworICBpZiAoYXJnYyA9PSAxKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJObyBzb2NrZXQgbnVtYmVyXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHNzY2FuZihhcmd2WzFdLCAiJWQiLCAmc29ja2V0bnVtYmVyKTsKKyAgaWYgKCFzb2NrZXRudW1iZXIgfHwgc29ja2V0bnVtYmVyID4gMHhmZmZmKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHNvY2tldCBudW1iZXI6ICVkXG4iLCBzb2NrZXRudW1iZXIpOworICAgIHJldHVybiAxOworICB9CisKKyAgZ2V0aG9zdG5hbWUobG9jYWxob3N0LCBNQVhIT1NUTkFNRUxFTkdUSCk7CisgIGhwID0gZ2V0aG9zdGJ5bmFtZShsb2NhbGhvc3QpOworICBpZiAoIWhwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZ2V0IGxvY2FsIGhvc3QgaW5mb1xuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvKiBPcGVuIGEgc29ja2V0ICovCisgIHNvY2tldGhhbmRsZSA9IHNvY2tldChocC0+aF9hZGRydHlwZSwgU09DS19TVFJFQU0sIDApOworICBpZiAoc29ja2V0aGFuZGxlIDwgMCkgeworICAgIHBlcnJvcigic29ja2V0Iik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBkZXZpbC5zaW5fZmFtaWx5ID0gaHAtPmhfYWRkcnR5cGU7CisgIGRldmlsLnNpbl9wb3J0ID0gaHRvbnMoc29ja2V0bnVtYmVyKTsKKyAgZGV2aWwuc2luX2FkZHIuc19hZGRyID0gMDsKKyAgZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKGRldmlsLnNpbl96ZXJvKTsgaSsrKSBkZXZpbC5zaW5femVyb1tpXSA9ICdcMDAwJzsKKyAgbWVtY3B5KCZkZXZpbC5zaW5fYWRkciwgaHAtPmhfYWRkcl9saXN0WzBdLCBocC0+aF9sZW5ndGgpOworCisgIGlmIChiaW5kKHNvY2tldGhhbmRsZSwgJmRldmlsLCBzaXplb2YoZGV2aWwpKSA8IDApIHsKKyAgICBwZXJyb3IoImJpbmQiKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8qIE1heSBvbmx5IGFjY2VwdCBvbmUgZGVidWdnZXIgYXQgb25jZSAqLworCisgIGlmIChsaXN0ZW4oc29ja2V0aGFuZGxlLCAwKSkgeworICAgIHBlcnJvcigibGlzdGVuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBmcHJpbnRmKHN0ZGVyciwgIldhaXRpbmcgZm9yIGNvbm5lY3Rpb24gZnJvbSBkZWJ1Z2dlci4uLiIpOworCisgIGRlYnVnc29jayA9IGFjY2VwdChzb2NrZXRoYW5kbGUsICZpc2EsICZpKTsKKyAgaWYgKGRlYnVnc29jayA8IDApIHsKKyAgICBwZXJyb3IoImFjY2VwdCIpOworICAgIHJldHVybiAxOworICB9CisgIAorICBmcHJpbnRmKHN0ZGVyciwgIiBkb25lLlxuQ29ubmVjdGlvbiBFc3RhYmxpc2hlZC5cbiIpOworCisgIG5mZHMgPSBnZXRkdGFibGVzaXplKCk7CisKKyAgaWYgKHBpcGUobXVta2lkKSkgeworICAgIHBlcnJvcigicGlwZSIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChwaXBlKGtpZG11bSkpIHsKKyAgICBwZXJyb3IoInBpcGUiKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAKKyAgaWYgKHBpcGUoRGVidWdnZXJBUk11bCkpIHsKKyAgICBwZXJyb3IoInBpcGUiKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAKKyNpZmRlZiBERUJVRworICAgICAgZnByaW50ZihzdGRlcnIsICJDcmVhdGVkIHBpcGVzIG9rXG4iKTsKKyNlbmRpZgorCisgIGNoaWxkID0gZm9yaygpOworCisjaWZkZWYgREVCVUcKKyAgZnByaW50ZihzdGRlcnIsICJmb3JrKCkgb2tcbiIpOworI2VuZGlmCisKKyAgaWYgKGNoaWxkID09ICAwKSBraWQgKCk7CisgIGlmIChjaGlsZCAhPSAtMSkgcGFyZW50ICgpOworCisgIHBlcnJvcigiZm9yayIpOworICByZXR1cm4gMTsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvc2ltL2FybS9wYXJlbnQuYyBiL3NpbS9hcm0vcGFyZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkYTY0MwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9hcm0vcGFyZW50LmMKQEAgLTAsMCArMSw0ODMgQEAKKy8qICBwYXJlbnQuYyAtLSBBUk11bGF0b3IgUkRQIGNvbW1zIGNvZGU6ICBBUk02IEluc3RydWN0aW9uIEVtdWxhdG9yLgorICAgIENvcHlyaWdodCAoQykgMTk5NCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzIEx0ZC4KKyAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoZSBQYXJlbnQgcHJvY2VzcyBjb250aW51ZXMgaGVyZS4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEl0IHdhaXRzIG9uIHRoZSBzb2NrZXQgYW5kIHBhc3NlcyBvbiBSRFAgbWVzc2FnZXMgZG93biBhIHBpcGUgKi8KKy8qIHRvIHRoZSBBUk11bGF0b3IgUkRQIHRvIFJESSBpbnRlcnByZXRlci4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAidGltZS5oIgorI2luY2x1ZGUgImFybWRlZnMuaCIKKyNpbmNsdWRlICJkYmdfcmRpLmgiCisjaW5jbHVkZSAiY29tbXVuaWNhdGUuaCIKKworLyogVGhlIHNvY2tldCB0byB0aGUgZGVidWdnZXIgKi8KK2V4dGVybiBpbnQgZGVidWdzb2NrOworCisvKiBUaGUgcGlwZXMgYmV0d2VlbiB0aGUgdHdvIHByb2Nlc3NlcyAqLworZXh0ZXJuIGludCBtdW1raWRbMl07CitleHRlcm4gaW50IGtpZG11bVsyXTsKKworLyogQSBwaXBlIGZvciBoYW5kbGluZyBTV0kgcmV0dXJuIHZhbHVlcyB0aGF0IGdvZXMgc3RyYWlnaHQgZnJvbSB0aGUgKi8KKy8qIHBhcmVudCB0byB0aGUgQVJNdWxhdG9yIGhvc3QgaW50ZXJmYWNlLCBieXBhc3NpbmcgdGhlIGNoaWxkJ3MgUkRQICovCisvKiB0byBSREkgaW50ZXJwcmV0ZXIgKi8KK2V4dGVybiBpbnQgRGVidWdnZXJBUk11bFsyXTsKKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgKi8KK2V4dGVybiBpbnQgbmZkczsKKworLyogVGhlIGNoaWxkIHByb2Nlc3MgaWQuICovCitleHRlcm4gcGlkX3QgY2hpbGQ7CisKK3ZvaWQKK3BhcmVudCAoKQoreworICBpbnQgaSwgaiwgazsKKyAgdW5zaWduZWQgY2hhciBtZXNzYWdlLCBDUG51bSwgZXhyZXR1cm47CisgIEFSTXdvcmQgbWFzaywgbmJ5dGVzLCBtZXNzYWdldHlwZTsKKyAgdW5zaWduZWQgY2hhciBjLCBkOworICBBUk13b3JkIHgsIHk7CisgIGludCB2aXJnaW4gPSAxOworICBzdHJ1Y3QgZmRfc2V0IHJlYWRmZHM7CisKKyNpZmRlZiBERUJVRworICBmcHJpbnRmIChzdGRlcnIsICJwYXJlbnQgKCkuLi5cbiIpOworI2VuZGlmCisgIAorIHBhbmljX2Vycm9yOgorCisgIGlmICghdmlyZ2luKQorICAgIHsKKyNpZmRlZiBERUJVRworICAgICAgZnByaW50ZihzdGRlcnIsICJBcmdoaCEgV2hhdCBpcyBnb2luZyBvbj9cbiIpOworI2VuZGlmCisgICAgICBraWxsIChjaGlsZCwgU0lHSFVQKTsKKyAgICAgIE1Zd3JpdGVfY2hhcihkZWJ1Z3NvY2ssIFJEUF9SZXNldCk7CisgICAgfQorICAKKyAgdmlyZ2luID0gMDsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgCisgICAgLyogV2FpdCBlaXRoZXIgZm9yIHRoZSBBUk11bGF0b3Igb3IgdGhlIGRlYnVnZ2VyICovCisgICAgCisgICAgRkRfWkVSTyAoJnJlYWRmZHMpOworICAgIEZEX1NFVCAoa2lkbXVtWzBdLCAmcmVhZGZkcyk7IC8qIFdhaXQgZm9yIG1lc3NhZ2VzIGZyb20gQVJNdWxhdG9yICovCisgICAgRkRfU0VUIChkZWJ1Z3NvY2ssICZyZWFkZmRzKTsgLyogV2FpdCBmb3IgbWVzc2FnZXMgZnJvbSBkZWJ1Z2dlciAqLworCisjaWZkZWYgREVCVUcKKyAgICBmcHJpbnRmIChzdGRlcnIsICJXYWl0aW5nIGZvciBBUk11bGF0b3Igb3IgZGVidWdnZXIuLi4gIik7CisjZW5kaWYgICAgCisKKyAgICB3aGlsZSAoKGkgPSBzZWxlY3QgKG5mZHMsICZyZWFkZmRzLCAoZmRfc2V0ICopIDAsIChmZF9zZXQgKikgMCwgMCkpIDwgMCkKKyAgICAgIHsKKwlwZXJyb3IgKCJzZWxlY3QiKTsKKyAgICAgIH0KKworI2lmZGVmIERFQlVHCisgICAgZnByaW50ZihzdGRlcnIsICIoJWQvMikiLCBpKTsKKyNlbmRpZgorICAgIAorICAgIGlmIChGRF9JU1NFVCAoZGVidWdzb2NrLCAmcmVhZGZkcykpIHsKKyNpZmRlZiBERUJVRworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLT5kZWJ1Z2dlclxuIik7CisjZW5kaWYgICAgICAKKyAgICAgIAorICAgICAgLyogSW5zaWRlIHRoaXMgcmF0aGVyIGxhcmdlIGlmIHN0YXRlbWVudCB3aXRoIHNpbXBseSBwYXNzIG9uIGEgY29tcGxldGUgCisJIG1lc3NhZ2UgdG8gdGhlIEFSTXVsYXRvci4gIFRoZSByZWFzb24gd2UgbmVlZCB0byBwYXNzIG1lc3NhZ2VzIG9uIG9uZQorCSBhdCBhIHRpbWUgaXMgdGhhdCB3ZSBoYXZlIHRvIGtub3cgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBhbiBPU09wUmVwbHkKKwkgb3IgYW4gaW5mbyhzdG9wKSwgc28gdGhhdCB3ZSBjYW4gdGFrZSBkaWZmZXJlbnQgYWN0aW9uIGluIHRob3NlCisJIGNhc2VzLiAqLworCisgICAgICBpZiAoTVlyZWFkX2NoYXIgKGRlYnVnc29jaywgJm1lc3NhZ2UpKQorCWdvdG8gcGFuaWNfZXJyb3I7CisgICAgICAKKyAgICAgIHN3aXRjaCAobWVzc2FnZSkKKwl7CisJY2FzZSBSRFBfU3RhcnQ6CisJICAvKiBPcGVuIGFuZC9vciBJbml0aWFsaXNlICovCisjaWZkZWYgREVCVUcKKwkgIGZwcmludGYgKHN0ZGVyciwgIlJEUCBPcGVuXG4iKTsKKyNlbmRpZgorCSAgaWYgKE1ZcmVhZF9jaGFyKGRlYnVnc29jaywgJmMpKSAvKiB0eXBlICovCisJICAgIGdvdG8gcGFuaWNfZXJyb3I7CisKKwkgIGlmIChNWXJlYWRfd29yZChkZWJ1Z3NvY2ssICZ4KSkgIC8qIG1lbW9yeSBzaXplICovCisJICAgIGdvdG8gcGFuaWNfZXJyb3I7CisKKwkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKKwkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBjKTsKKwkgIE1Zd3JpdGVfd29yZCAobXVta2lkWzFdLCB4KTsKKwkgIGlmIChjICYgMHgyKQorCSAgICB7CisJICAgICAgcGFzc29uIChkZWJ1Z3NvY2ssIG11bWtpZFsxXSwgMSk7IC8qIHNwZWVkICovCisJICAgIH0KKwkgIGJyZWFrOworCQorCWNhc2UgUkRQX0VuZDoKKwkgIC8qIENsb3NlIGFuZCBGaW5hbGlzZSAqLworI2lmZGVmIERFQlVHCisJICBmcHJpbnRmKHN0ZGVyciwgIlJEUCBDbG9zZVxuIik7CisjZW5kaWYKKwkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKKwkgIGJyZWFrOworCQorCWNhc2UgUkRQX1JlYWQ6CisJICAvKiBSZWFkIE1lbW9yeSBBZGRyZXNzICovICAgCisjaWZkZWYgREVCVUcKKwkgIGZwcmludGYgKHN0ZGVyciwgIlJEUCBSZWFkIE1lbW9yeVxuIik7CisjZW5kaWYKKwkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKKwkgIGlmIChwYXNzb24gKGRlYnVnc29jaywgbXVta2lkWzFdLCA0KSkKKwkgICAgZ290byBwYW5pY19lcnJvcjsgLyogYWRkcmVzcyAqLworCSAgaWYgKE1ZcmVhZF93b3JkKGRlYnVnc29jaywgJm5ieXRlcykpCisJICAgIGdvdG8gcGFuaWNfZXJyb3I7IC8qIG5ieXRlcyAqLworCSAgTVl3cml0ZV93b3JkIChtdW1raWRbMV0sIG5ieXRlcyk7CisJICBicmVhazsKKwkKKwljYXNlIFJEUF9Xcml0ZSA6CisJICAvKiBXcml0ZSBNZW1vcnkgQWRkcmVzcyAqLworI2lmZGVmIERFQlVHCisJICBmcHJpbnRmIChzdGRlcnIsICJSRFAgV3JpdGUgTWVtb3J5XG4iKTsKKyNlbmRpZgorCSAgaWYgKE1ZcmVhZF93b3JkIChkZWJ1Z3NvY2ssICZ4KSkKKwkgICAgZ290byBwYW5pY19lcnJvcjsgLyogYWRkcmVzcyAqLworCisJICBpZiAoTVlyZWFkX3dvcmQgKGRlYnVnc29jaywgJnkpKQorCSAgICBnb3RvIHBhbmljX2Vycm9yOyAvKiBuYnl0ZXMgKi8KKworCSAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOworCSAgTVl3cml0ZV93b3JkIChtdW1raWRbMV0sIHgpOworCSAgTVl3cml0ZV93b3JkIChtdW1raWRbMV0sIHkpOworCSAgcGFzc29uIChkZWJ1Z3NvY2ssIG11bWtpZFsxXSwgeSk7ICAvKiBhY3R1YWwgZGF0YSAqLworCSAgYnJlYWs7CisJCisJY2FzZSBSRFBfQ1BVcmVhZDoKKwkgIC8qIFJlYWQgQ1BVIFN0YXRlICovCisjaWZkZWYgREVCVUcKKwkgIGZwcmludGYgKHN0ZGVyciwgIlJEUCBSZWFkIENQVVxuIik7CisjZW5kaWYKKwkgIGlmIChNWXJlYWRfY2hhcihkZWJ1Z3NvY2ssICZjKSkKKwkgICAgZ290byBwYW5pY19lcnJvcjsgLyogbW9kZSAqLworCisJICBpZiAoTVlyZWFkX3dvcmQgKGRlYnVnc29jaywgJm1hc2spKQorCSAgICBnb3RvIHBhbmljX2Vycm9yOyAvKiBtYXNrICovCisKKwkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKKwkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBjKTsKKwkgIE1Zd3JpdGVfd29yZCAobXVta2lkWzFdLCBtYXNrKTsKKwkgIGJyZWFrOworCisJY2FzZSBSRFBfQ1BVd3JpdGUgOgorCSAgLyogV3JpdGUgQ1BVIFN0YXRlICovCisjaWZkZWYgREVCVUcKKwkgIGZwcmludGYgKHN0ZGVyciwgIlJEUCBXcml0ZSBDUFVcbiIpOworI2VuZGlmCisJICBpZiAoTVlyZWFkX2NoYXIgKGRlYnVnc29jaywgJmMpKQorCSAgICBnb3RvIHBhbmljX2Vycm9yOyAvKiBtb2RlICovCisKKwkgIGlmIChNWXJlYWRfd29yZCAoZGVidWdzb2NrLCAmeCkpCisJICAgIGdvdG8gcGFuaWNfZXJyb3I7IC8qIG1hc2sgKi8KKworCSAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOworCSAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIGMpOworCSAgTVl3cml0ZV93b3JkIChtdW1raWRbMV0sIHgpOworCSAgZm9yIChrID0gMSwgaiA9IDA7IGsgIT0gMHg4MDAwMDAwMDsgayAqPSAyLCBqKyspCisJICAgIGlmICgoayAmIHgpIAorCQkmJiBwYXNzb24oZGVidWdzb2NrLCBtdW1raWRbMV0sIDQpKQorCSAgICAgIGdvdG8gcGFuaWNfZXJyb3I7CisJICBicmVhazsKKworCWNhc2UgUkRQX0NQcmVhZDoKKwkgIC8qIFJlYWQgQ28tUHJvY2Vzc29yIFN0YXRlICovCisjaWZkZWYgREVCVUcKKwkgIGZwcmludGYgKHN0ZGVyciwgIlJEUCBSZWFkIENQIHN0YXRlXG4iKTsKKyNlbmRpZgorCSAgaWYgKE1ZcmVhZF9jaGFyIChkZWJ1Z3NvY2ssICZDUG51bSkpCisJICAgIGdvdG8gcGFuaWNfZXJyb3I7CisKKwkgIGlmIChNWXJlYWRfd29yZCAoZGVidWdzb2NrLCAmbWFzaykpCisJICAgIGdvdG8gcGFuaWNfZXJyb3I7CisKKwkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKKwkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBDUG51bSk7CisJICBNWXdyaXRlX3dvcmQgKG11bWtpZFsxXSwgbWFzayk7CisJICBicmVhazsKKwkKKwljYXNlIFJEUF9DUHdyaXRlOgorCSAgLyogV3JpdGUgQ28tUHJvY2Vzc29yIFN0YXRlICovCisjaWZkZWYgREVCVUcKKwkgIGZwcmludGYoc3RkZXJyLCAiUkRQIFdyaXRlIENQIHN0YXRlXG4iKTsKKyNlbmRpZgorCSAgaWYgKE1ZcmVhZF9jaGFyIChkZWJ1Z3NvY2ssICZDUG51bSkpCisJICAgIGdvdG8gcGFuaWNfZXJyb3I7CisKKwkgIGlmIChNWXJlYWRfd29yZCAoZGVidWdzb2NrLCAmbWFzaykpCisJICAgIGdvdG8gcGFuaWNfZXJyb3I7CisKKwkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKKwkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBjKTsKKwkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCB4KTsKKwkgIGZvciAoayA9IDEsIGogPSAwOyBrICE9IDB4ODAwMDAwMDA7IGsgKj0gMiwgaisrKQorCSAgICBpZiAoayAmIHgpCisJICAgICAgeworCQlpZiAoKGMgPT0gMSB8fCBjID09IDIpICYmIGsgPD0gMTI4KQorCQkgIHsKKwkJICAgIC8qIEZQIHJlZ2lzdGVyID0gMTIgYnl0ZXMgKyA0IGJ5dGVzIGZvcm1hdCAqLworCQkgICAgaWYgKHBhc3NvbihkZWJ1Z3NvY2ssIG11bWtpZFsxXSwgMTYpKQorCQkgICAgICBnb3RvIHBhbmljX2Vycm9yOworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIC8qIE5vcm1hbCByZWdpc3RlciA9IDQgYnl0ZXMgKi8KKwkJICAgIGlmIChwYXNzb24oZGVidWdzb2NrLCBtdW1raWRbMV0sIDQpKQorCQkgICAgICBnb3RvIHBhbmljX2Vycm9yOyAKKwkJICB9CisJICAgICAgfQorCSAgYnJlYWs7CisJCisJY2FzZSBSRFBfU2V0QnJlYWs6CisJICAvKiBTZXQgQnJlYWtwb2ludCAqLworI2lmZGVmIERFQlVHCisJICBmcHJpbnRmIChzdGRlcnIsICJSRFAgU2V0IEJyZWFrcG9pbnRcbiIpOworI2VuZGlmCisJICBpZiAoTVlyZWFkX3dvcmQgKGRlYnVnc29jaywgJngpKQorCSAgICBnb3RvIHBhbmljX2Vycm9yOyAvKiBhZGRyZXNzICovCisKKwkgIGlmIChNWXJlYWRfY2hhciAoZGVidWdzb2NrLCAmYykpCisJICAgIGdvdG8gcGFuaWNfZXJyb3I7IC8qIHR5cGUgKi8KKworCSAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOworCSAgTVl3cml0ZV93b3JkIChtdW1raWRbMV0sIHgpOworCSAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIGMpOworCSAgaWYgKCgoYyAmIDB4ZikgPj0gNSkKKwkgICAgICAmJiBwYXNzb24oZGVidWdzb2NrLCBtdW1raWRbMV0sIDQpKQorCSAgICBnb3RvIHBhbmljX2Vycm9yOyAvKiBib3VuZCAqLworCSAgYnJlYWs7CisKKwljYXNlIFJEUF9DbGVhckJyZWFrOgorCSAgLyogQ2xlYXIgQnJlYWtwb2ludCAqLworI2lmZGVmIERFQlVHCisJICBmcHJpbnRmIChzdGRlcnIsICJSRFAgQ2xlYXIgQnJlYWtwb2ludFxuIik7CisjZW5kaWYKKwkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKKwkgIGlmIChwYXNzb24gKGRlYnVnc29jaywgbXVta2lkWzFdLCA0KSkKKwkgICAgZ290byBwYW5pY19lcnJvcjsgLyogcG9pbnQgKi8KKwkgIGJyZWFrOworCQorCWNhc2UgUkRQX1NldFdhdGNoOgorCSAgLyogU2V0IFdhdGNocG9pbnQgKi8KKyNpZmRlZiBERUJVRworCSAgZnByaW50ZiAoc3RkZXJyLCAiUkRQIFNldCBXYXRjaHBvaW50XG4iKTsKKyNlbmRpZgorCSAgaWYgKE1ZcmVhZF93b3JkIChkZWJ1Z3NvY2ssICZ4KSkKKwkgICAgZ290byBwYW5pY19lcnJvcjsgLyogYWRkcmVzcyAqLworCisJICBpZiAoTVlyZWFkX2NoYXIoZGVidWdzb2NrLCAmYykpCisJICAgIGdvdG8gcGFuaWNfZXJyb3I7IC8qIHR5cGUgKi8KKworCSAgaWYgKE1ZcmVhZF9jaGFyIChkZWJ1Z3NvY2ssICZkKSkKKwkgICAgZ290byBwYW5pY19lcnJvcjsgLyogZGF0YXR5cGUgKi8KKworCSAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOworCSAgTVl3cml0ZV93b3JkIChtdW1raWRbMV0sIHgpOworCSAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIGMpOworCSAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIGQpOworCSAgaWYgKCgoYyAmIDB4ZikgPj0gNSkKKwkgICAgICAmJiBwYXNzb24oZGVidWdzb2NrLCBtdW1raWRbMV0sIDQpKQorCSAgICBnb3RvIHBhbmljX2Vycm9yOyAvKiBib3VuZCAqLworCSAgYnJlYWs7CisJCisJY2FzZSBSRFBfQ2xlYXJXYXRjaDoKKwkgIC8qIENsZWFyIFdhdGNocG9pbnQgKi8KKyNpZmRlZiBERUJVRworCSAgZnByaW50ZiAoc3RkZXJyLCAiUkRQIENsZWFyIFdhdGNocG9pbnRcbiIpOworI2VuZGlmCisJICBNWXdyaXRlX2NoYXIgKG11bWtpZFsxXSwgbWVzc2FnZSk7CisJICBpZiAocGFzc29uIChkZWJ1Z3NvY2ssIG11bWtpZFsxXSwgNCkpCisJICAgIGdvdG8gcGFuaWNfZXJyb3I7IC8qIHBvaW50ICovCisJICBicmVhazsKKworCWNhc2UgUkRQX0V4ZWN1dGU6CisJICAvKiBFeGNlY3V0ZSAqLworI2lmZGVmIERFQlVHCisJICBmcHJpbnRmIChzdGRlcnIsICJSRFAgRXhlY3V0ZVxuIik7CisjZW5kaWYKKwkKKwkgIC8qIExFQVZFIFRISVMgT05FICdUSUwgTEFURVIuLi4gKi8KKwkgIC8qIE5FRUQgVE8gV09SSyBUSElOR1MgT1VUICovCisJCisJICAvKiBOTyBBU0NZTkNIUk9VUyBSVU5OSU5HICovCisJCisJICBpZiAoTVlyZWFkX2NoYXIoZGVidWdzb2NrLCAmYykpCisJICAgIGdvdG8gcGFuaWNfZXJyb3I7IC8qIHJldHVybiAqLworCisJICAvKiBSZW1lbWJlciBpbmNhc2UgYml0IDcgaXMgc2V0IGFuZCB3ZSBoYXZlIHRvIHNlbmQgYmFjayBhIHdvcmQgKi8KKwkgIGV4cmV0dXJuID0gYzsKKwkKKwkgIE1Zd3JpdGVfY2hhcihtdW1raWRbMV0sIG1lc3NhZ2UpOworCSAgTVl3cml0ZV9jaGFyKG11bWtpZFsxXSwgYyk7CisJICBicmVhazsKKwkKKwljYXNlIFJEUF9TdGVwOgorCSAgLyogU3RlcCAqLworI2lmZGVmIERFQlVHCisJICBmcHJpbnRmIChzdGRlcnIsICJSRFAgU3RlcFxuIik7CisjZW5kaWYKKworCSAgaWYgKE1ZcmVhZF9jaGFyKGRlYnVnc29jaywgJmMpKQorCSAgICBnb3RvIHBhbmljX2Vycm9yOyAvKiByZXR1cm4gKi8KKworCSAgaWYgKE1ZcmVhZF93b3JkKGRlYnVnc29jaywgJngpKQorCSAgICBnb3RvIHBhbmljX2Vycm9yOyAvKiBuaW5zdHIgKi8KKworCSAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOworCSAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIGMpOworCSAgTVl3cml0ZV93b3JkIChtdW1raWRbMV0sIHgpOworCSAgYnJlYWs7CisJCisJY2FzZSBSRFBfSW5mbzoKKwkgIC8qIEluZm8gKi8KKyNpZmRlZiBERUJVRworCSAgZnByaW50ZiAoc3RkZXJyLCAiUkRQIEluZm9cbiIpOworI2VuZGlmCisJICAvKiBJTkZPIFRBUkdFVCwgU0VUIFJESSBMRVZFTCAqLworCSAgaWYgKE1ZcmVhZF93b3JkIChkZWJ1Z3NvY2ssICZtZXNzYWdldHlwZSkpCisJICAgIGdvdG8gcGFuaWNfZXJyb3I7IC8qIGluZm8gKi8KKworCSAgc3dpdGNoIChtZXNzYWdldHlwZSkKKwkgICAgeworCSAgICBjYXNlIFJESUluZm9fVGFyZ2V0OgorCSAgICAgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKKwkgICAgICBNWXdyaXRlX3dvcmQgKG11bWtpZFsxXSwgbWVzc2FnZXR5cGUpOworCSAgICAgIGJyZWFrOworCSAgICAKKwkgICAgY2FzZSBSRElTZXRfUkRJTGV2ZWw6CisJICAgICAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOworCSAgICAgIE1Zd3JpdGVfd29yZCAobXVta2lkWzFdLCBtZXNzYWdldHlwZSk7CisJICAgICAgaWYgKHBhc3NvbiAoZGVidWdzb2NrLCBtdW1raWRbMV0sIDEpKQorCQlnb3RvIHBhbmljX2Vycm9yOyAvKiBhcmd1bWVudCAqLworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgUkRJU2V0X0NtZGxpbmU6CisJICAgICAgLyogR290IHRvIHBhc3Mgb24gYSBzdHJpbmcgYXJndW1lbnQgKi8KKwkgICAgICBNWXdyaXRlX2NoYXIgKG11bWtpZFsxXSwgbWVzc2FnZSk7CisJICAgICAgTVl3cml0ZV93b3JkIChtdW1raWRbMV0sIG1lc3NhZ2V0eXBlKTsKKwkgICAgICBkbworCQl7CisJCSAgaWYgKE1ZcmVhZF9jaGFyIChkZWJ1Z3NvY2ssICZjKSkKKwkJICAgIGdvdG8gcGFuaWNfZXJyb3I7CisKKwkJICBNWXdyaXRlX2NoYXIgKG11bWtpZFsxXSwgYyk7CisJCX0gd2hpbGUgKGMpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgUkRJU2lnbmFsX1N0b3A6CisJICAgICAga2lsbCAoY2hpbGQsIFNJR1VTUjEpOworCSAgICAgIE1Zd3JpdGVfY2hhciAoZGVidWdzb2NrLCBSRFBfUmV0dXJuKTsKKwkgICAgICBNWXdyaXRlX2NoYXIgKGRlYnVnc29jaywgUkRJRXJyb3JfVXNlckludGVycnVwdCk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBSRElWZWN0b3JfQ2F0Y2g6CisJICAgICAgTVlyZWFkX3dvcmQgKGRlYnVnc29jaywgJngpOworCSAgICAgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKKwkgICAgICBNWXdyaXRlX3dvcmQgKG11bWtpZFsxXSwgbWVzc2FnZXR5cGUpOworCSAgICAgIE1Zd3JpdGVfd29yZCAobXVta2lkWzFdLCB4KTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIFJESUluZm9fU3RlcDoKKwkgICAgICBNWXdyaXRlX2NoYXIgKG11bWtpZFsxXSwgbWVzc2FnZSk7CisJICAgICAgTVl3cml0ZV93b3JkIChtdW1raWRbMV0sIG1lc3NhZ2V0eXBlKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIFJESUluZm9fUG9pbnRzOgorCSAgICAgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKKwkgICAgICBNWXdyaXRlX3dvcmQgKG11bWtpZFsxXSwgbWVzc2FnZXR5cGUpOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5yZWNvZ25pemVkIFJESUluZm8gcmVxdWVzdCAlZFxuIiwKKwkJICAgICAgIG1lc3NhZ2V0eXBlKTsKKwkgICAgICBnb3RvIHBhbmljX2Vycm9yOworCSAgICB9CisJICBicmVhazsKKwkKKwljYXNlIFJEUF9PU09wUmVwbHk6CisJICAvKiBPUyBPcGVyYXRpb24gUmVwbHkgKi8KKyNpZmRlZiBERUJVRworCSAgZnByaW50ZiAoc3RkZXJyLCAiUkRQIE9TIFJlcGx5XG4iKTsKKyNlbmRpZgorCSAgTVl3cml0ZV9jaGFyIChtdW1raWRbMV0sIG1lc3NhZ2UpOworCSAgaWYgKE1ZcmVhZF9jaGFyIChkZWJ1Z3NvY2ssICZtZXNzYWdlKSkKKwkgICAgZ290byBwYW5pY19lcnJvcjsKKwkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKKwkgIHN3aXRjaChtZXNzYWdlKQorCSAgICB7CisJICAgIGNhc2UgMDogLyogcmV0dXJuIHZhbHVlIGkuZS4gbm90aGluZyBlbHNlLiovCisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAxOiAvKiByZXR1cm5zIGEgYnl0ZS4uLiAqLworCSAgICAgIGlmIChNWXJlYWRfY2hhcihkZWJ1Z3NvY2ssICZjKSkKKwkJZ290byBwYW5pY19lcnJvcjsKKworCSAgICAgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBjKTsKKwkgICAgICBicmVhazsJICAKKworCSAgICBjYXNlIDI6IC8qIHJldHVybnMgYSB3b3JkLi4uICovCisJICAgICAgaWYgKE1ZcmVhZF93b3JkKGRlYnVnc29jaywgJngpKQorCQlnb3RvIHBhbmljX2Vycm9yOworCisJICAgICAgTVl3cml0ZV93b3JkIChtdW1raWRbMV0sIHgpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBicmVhazsKKwkKKwljYXNlIFJEUF9SZXNldDoKKwkgIC8qIFJlc2V0ICovCisjaWZkZWYgREVCVUcKKwkgIGZwcmludGYgKHN0ZGVyciwgIlJEUCBSZXNldFxuIik7CisjZW5kaWYKKwkgIE1Zd3JpdGVfY2hhciAobXVta2lkWzFdLCBtZXNzYWdlKTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIC8qIEhtbS4uIGJhZCBSRFAgb3BlcmF0aW9uICovCisJICBmcHJpbnRmIChzdGRlcnIsICJSRFAgQmFkIFJEUCByZXF1ZXN0ICglZClcbiIsIG1lc3NhZ2UpOworCSAgTVl3cml0ZV9jaGFyIChkZWJ1Z3NvY2ssIFJEUF9SZXR1cm4pOworCSAgTVl3cml0ZV9jaGFyIChkZWJ1Z3NvY2ssIFJESUVycm9yX1VuaW1wbGVtZW50ZWRNZXNzYWdlKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgICAgCisgICAgaWYgKEZEX0lTU0VUIChraWRtdW1bMF0sICZyZWFkZmRzKSkKKyAgICAgIHsKKyNpZmRlZiBERUJVRworCWZwcmludGYgKHN0ZGVyciwgIi0+QVJNdWxhdG9yXG4iKTsKKyNlbmRpZiAgICAgIAorCS8qIEFueXRoaW5nIHdlIGdldCBmcm9tIHRoZSBBUk11bGF0b3IgaGFzIHRvIGdvIHRvIHRoZSBkZWJ1Z2dlci4uLiAqLworCS8qIEl0IGlzIHRoYXQgc2ltcGxlISAqLworICAgICAgCisJcGFzc29uIChraWRtdW1bMF0sIGRlYnVnc29jaywgMSk7CisgICAgICB9CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2ltL2FybS90Y29uZmlnLmluIGIvc2ltL2FybS90Y29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZjcwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vYXJtL3Rjb25maWcuaW4KQEAgLTAsMCArMSwxNyBAQAorLyogQVJNIHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuICAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHN1cHBvcnRzIHByb2ZpbGluZy4KKyAgIFNlZSB0aGUgbWlwcyBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCisgICBUaGlzIGVuYWJsZXMgdGhlIGAtcCBmb28nIGFuZCBgLXMgYmFyJyBvcHRpb25zLgorICAgVGhlIHRhcmdldCBpcyByZXF1aXJlZCB0byBwcm92aWRlIHNpbV9zZXRfcHJvZmlsZXssX3NpemV9LiAgKi8KKy8qICNkZWZpbmUgU0lNX0hBVkVfUFJPRklMRSAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHVzZXMgYW4gaW5zdHJ1Y3Rpb24gY2FjaGUuCisgICBTZWUgdGhlIGg4LzMwMCBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCisgICBUaGlzIGVuYWJsZXMgdGhlIGAtYyBzaXplJyBvcHRpb24gdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBjYWNoZS4KKyAgIFRoZSB0YXJnZXQgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzaW1fc2V0X3NpbWNhY2hlX3NpemUuICAqLworLyogI2RlZmluZSBTSU1fSEFWRV9TSU1DQUNIRSAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB0aGUgdGFyZ2V0IGNwdSBpcyBiaS1lbmRpYW4KKyAgIGFuZCB0aGUgc2ltdWxhdG9yIHN1cHBvcnRzIGl0LiAgKi8KKyNkZWZpbmUgU0lNX0hBVkVfQklFTkRJQU4KZGlmZiAtLWdpdCBhL3NpbS9hcm0vdGh1bWJlbXUuYyBiL3NpbS9hcm0vdGh1bWJlbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWY2ZTBjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2FybS90aHVtYmVtdS5jCkBAIC0wLDAgKzEsNDU1IEBACisvKiAgdGh1bWJlbXUuYyAtLSBUaHVtYiBpbnN0cnVjdGlvbiBlbXVsYXRpb24uCisgICAgQ29weXJpZ2h0IChDKSAxOTk2LCBDeWdudXMgU29mdHdhcmUgVGVjaG5vbG9naWVzIEx0ZC4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KKworLyogV2UgY2FuIHByb3ZpZGUgc2ltcGxlIFRodW1iIHNpbXVsYXRpb24gYnkgZGVjb2RpbmcgdGhlIFRodW1iCitpbnN0cnVjdGlvbiBpbnRvIGl0cyBjb3JyZXNwb25kaW5nIEFSTSBpbnN0cnVjdGlvbiwgYW5kIHVzaW5nIHRoZQorZXhpc3RpbmcgQVJNIHNpbXVsYXRvci4gICovCisKKyNpZm5kZWYgTU9ERVQgLyogcmVxdWlyZWQgZm9yIHRoZSBUaHVtYiBpbnN0cnVjdGlvbiBzdXBwb3J0ICovCisjaWYgMQorI2Vycm9yICJNT0RFVCBuZWVkcyB0byBiZSBkZWZpbmVkIGZvciB0aGUgVGh1bWIgd29ybGQgdG8gd29yayIKKyNlbHNlCisjZGVmaW5lIE1PREVUICgxKQorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgImFybWRlZnMuaCIKKyNpbmNsdWRlICJhcm1lbXUuaCIKKworLyogRGVjb2RlIGEgMTZiaXQgVGh1bWIgaW5zdHJ1Y3Rpb24uICBUaGUgaW5zdHJ1Y3Rpb24gaXMgaW4gdGhlIGxvdworICAgMTYtYml0cyBvZiB0aGUgdGluc3RyIGZpZWxkLCB3aXRoIHRoZSBmb2xsb3dpbmcgVGh1bWIgaW5zdHJ1Y3Rpb24KKyAgIGhlbGQgaW4gdGhlIGhpZ2ggMTYtYml0cy4gIFBhc3NpbmcgaW4gdHdvIFRodW1iIGluc3RydWN0aW9ucyBhbGxvd3MKKyAgIGVhc2llciBzaW11bGF0aW9uIG9mIHRoZSBzcGVjaWFsIGR1YWwgQkwgaW5zdHJ1Y3Rpb24uICAqLworCit0ZHN0YXRlCitBUk11bF9UaHVtYkRlY29kZSAoc3RhdGUscGMsdGluc3RyLGFpbnN0cikKKyAgICAgQVJNdWxfU3RhdGUgKnN0YXRlOworICAgICBBUk13b3JkIHBjOworICAgICBBUk13b3JkIHRpbnN0cjsKKyAgICAgQVJNd29yZCAqYWluc3RyOworeworICB0ZHN0YXRlIHZhbGlkID0gdF9kZWNvZGVkOyAvKiBkZWZhdWx0IGFzc3VtZXMgYSB2YWxpZCBpbnN0cnVjdGlvbiAqLworICBBUk13b3JkIG5leHRfaW5zdHI7CisgIAorICBpZiAoc3RhdGUtPmJpZ2VuZFNpZykKKyAgICB7CisgICAgICBuZXh0X2luc3RyID0gdGluc3RyICYgMHhGRkZGOworICAgICAgdGluc3RyID4+PSAxNjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBuZXh0X2luc3RyID0gdGluc3RyID4+IDE2OworICAgICAgdGluc3RyICY9IDB4RkZGRjsKKyAgICB9CisgIAorI2lmIDEgLyogZGVidWdnaW5nIHRvIGNhdGNoIG5vbiB1cGRhdGVzICovCisgICphaW5zdHIgPSAweERFQURDMERFOworI2VuZGlmCisKKyAgc3dpdGNoICgodGluc3RyICYgMHhGODAwKSA+PiAxMSkKKyAgICB7CisgICAgY2FzZSAwOiAvKiBMU0wgKi8KKyAgICBjYXNlIDE6IC8qIExTUiAqLworICAgIGNhc2UgMjogLyogQVNSICovCisgICAgICAvKiBGb3JtYXQgMSAqLworICAgICAgKmFpbnN0ciA9IDB4RTFCMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlIG9wY29kZSAqLworICAgICAgICAgICAgICAgIHwgKCh0aW5zdHIgJiAweDE4MDApID4+ICgxMSAtIDUpKSAgICAgICAvKiBzaGlmdCB0eXBlICovCisgICAgICAgICAgICAgICAgfCAoKHRpbnN0ciAmIDB4MDdDMCkgPDwgKDcgLSA2KSkgICAgICAgIC8qIGltbTUgKi8KKyAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgMHgwMDM4KSA+PiAzKSAgICAgICAgICAgICAgLyogUnMgKi8KKyAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgMHgwMDA3KSA8PCAxMik7ICAgICAgICAgICAgLyogUmQgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzogLyogQUREL1NVQiAqLworICAgICAgLyogRm9ybWF0IDIgKi8KKyAgICAgIHsKKyAgICAgICAgQVJNd29yZCBzdWJzZXRbNF0gPSB7CisgICAgICAgICAgMHhFMDkwMDAwMCwgICAvKiBBRERTIFJkLFJzLFJuICAgICovCisgICAgICAgICAgMHhFMDUwMDAwMCwgICAvKiBTVUJTIFJkLFJzLFJuICAgICovCisgICAgICAgICAgMHhFMjkwMDAwMCwgICAvKiBBRERTIFJkLFJzLCNpbW0zICovCisgICAgICAgICAgMHhFMjUwMDAwMCAgICAvKiBTVUJTIFJkLFJzLCNpbW0zICovCisgICAgICAgIH07CisgICAgICAgIC8qIEl0IGlzIHF1aWNrZXIgaW5kZXhpbmcgaW50byBhIHRhYmxlLCB0aGFuIHBlcmZvcm1pbmcgc3dpdGNoCisgICAgICAgICAgIG9yIGNvbmRpdGlvbmFsczogKi8KKyAgICAgICAgKmFpbnN0ciA9IHN1YnNldFsodGluc3RyICYgMHgwNjAwKSA+PiA5XSAgICAgICAgLyogYmFzZSBvcGNvZGUgKi8KKyAgICAgICAgICAgICAgICAgIHwgKCh0aW5zdHIgJiAweDAxQzApID4+IDYpICAgICAgICAgICAgLyogUm4gb3IgaW1tMyAqLworICAgICAgICAgICAgICAgICAgfCAoKHRpbnN0ciAmIDB4MDAzOCkgPDwgKDE2IC0gMykpICAgICAvKiBScyAqLworICAgICAgICAgICAgICAgICAgfCAoKHRpbnN0ciAmIDB4MDAwNykgPDwgKDEyIC0gMCkpOyAgICAvKiBSZCAqLworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSA0OiAvKiBNT1YgKi8KKyAgICBjYXNlIDU6IC8qIENNUCAqLworICAgIGNhc2UgNjogLyogQUREICovCisgICAgY2FzZSA3OiAvKiBTVUIgKi8KKyAgICAgIC8qIEZvcm1hdCAzICovCisgICAgICB7CisgICAgICAgIEFSTXdvcmQgc3Vic2V0WzRdID0geworICAgICAgICAgIDB4RTNCMDAwMDAsICAgLyogTU9WUyBSZCwjaW1tOCAgICAqLworICAgICAgICAgIDB4RTM1MDAwMDAsICAgLyogQ01QICBSZCwjaW1tOCAgICAqLworICAgICAgICAgIDB4RTI5MDAwMDAsICAgLyogQUREUyBSZCxSZCwjaW1tOCAqLworICAgICAgICAgIDB4RTI1MDAwMDAsICAgLyogU1VCUyBSZCxSZCwjaW1tOCAqLworICAgICAgICB9OworICAgICAgICAqYWluc3RyID0gc3Vic2V0Wyh0aW5zdHIgJiAweDE4MDApID4+IDExXSAgICAgICAvKiBiYXNlIG9wY29kZSAqLworICAgICAgICAgICAgICAgICAgfCAoKHRpbnN0ciAmIDB4MDBGRikgPj4gMCkgICAgICAgICAgICAvKiBpbW04ICovCisgICAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgMHgwNzAwKSA8PCAoMTYgLSA4KSkgICAgIC8qIFJuICovCisgICAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgMHgwNzAwKSA8PCAoMTIgLSA4KSk7ICAgIC8qIFJkICovCisgICAgICB9CisgICAgICBicmVhayA7CisgICAgY2FzZSA4OiAvKiBBcml0aG1ldGljIGFuZCBoaWdoIHJlZ2lzdGVyIHRyYW5zZmVycyAqLworICAgICAgLyogVE9ETzogU2luY2UgdGhlIHN1YnNldHMgZm9yIGJvdGggRm9ybWF0IDQgYW5kIEZvcm1hdCA1CisgICAgICAgICBpbnN0cnVjdGlvbnMgYXJlIG1hZGUgdXAgb2YgZGlmZmVyZW50IEFSTSBlbmNvZGluZ3MsIHdlIGNvdWxkCisgICAgICAgICBzYXZlIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uYWwsIGFuZCBqdXN0IGhhdmUgb25lIGxhcmdlCisgICAgICAgICBzdWJzZXQuICovCisgICAgICBpZiAoKHRpbnN0ciAmICgxIDw8IDEwKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIEZvcm1hdCA0ICovCisgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIEFSTXdvcmQgb3Bjb2RlOworICAgICAgICAgICAgZW51bSB7dF9ub3JtLHRfc2hpZnQsdF9uZWcsdF9tdWx9IG90eXBlOworICAgICAgICAgIH0gc3Vic2V0WzE2XSA9IHsKKyAgICAgICAgICAgIHsweEUwMTAwMDAwLCB0X25vcm19LCAgLyogQU5EUyBSZCxSZCxScyAgICAgKi8KKyAgICAgICAgICAgIHsweEUwMzAwMDAwLCB0X25vcm19LCAgLyogRU9SUyBSZCxSZCxScyAgICAgKi8KKyAgICAgICAgICAgIHsweEUxQjAwMDEwLCB0X3NoaWZ0fSwgLyogTU9WUyBSZCxSZCxMU0wgUnMgKi8KKyAgICAgICAgICAgIHsweEUxQjAwMDMwLCB0X3NoaWZ0fSwgLyogTU9WUyBSZCxSZCxMU1IgUnMgKi8KKyAgICAgICAgICAgIHsweEUxQjAwMDUwLCB0X3NoaWZ0fSwgLyogTU9WUyBSZCxSZCxBU1IgUnMgKi8KKyAgICAgICAgICAgIHsweEUwQjAwMDAwLCB0X25vcm19LCAgLyogQURDUyBSZCxSZCxScyAgICAgKi8KKyAgICAgICAgICAgIHsweEUwRDAwMDAwLCB0X25vcm19LCAgLyogU0JDUyBSZCxSZCxScyAgICAgKi8KKyAgICAgICAgICAgIHsweEUxQjAwMDcwLCB0X3NoaWZ0fSwgLyogTU9WUyBSZCxSZCxST1IgUnMgKi8KKyAgICAgICAgICAgIHsweEUxMTAwMDAwLCB0X25vcm19LCAgLyogVFNUICBSZCxScyAgICAgICAgKi8KKyAgICAgICAgICAgIHsweEUyNzAwMDAwLCB0X25lZ30sICAgLyogUlNCUyBSZCxScywjMCAgICAgKi8KKyAgICAgICAgICAgIHsweEUxNTAwMDAwLCB0X25vcm19LCAgLyogQ01QICBSZCxScyAgICAgICAgKi8KKyAgICAgICAgICAgIHsweEUxNzAwMDAwLCB0X25vcm19LCAgLyogQ01OICBSZCxScyAgICAgICAgKi8KKyAgICAgICAgICAgIHsweEUxOTAwMDAwLCB0X25vcm19LCAgLyogT1JSUyBSZCxSZCxScyAgICAgKi8KKyAgICAgICAgICAgIHsweEUwMTAwMDkwLCB0X211bH0sICAgLyogTVVMUyBSZCxSZCxScyAgICAgKi8KKyAgICAgICAgICAgIHsweEUxRDAwMDAwLCB0X25vcm19LCAgLyogQklDUyBSZCxSZCxScyAgICAgKi8KKyAgICAgICAgICAgIHsweEUxRjAwMDAwLCB0X25vcm19ICAgLyogTVZOUyBSZCxScyAgICAgICAgKi8KKyAgICAgICAgICB9OworICAgICAgICAgICphaW5zdHIgPSBzdWJzZXRbKHRpbnN0ciAmIDB4MDNDMCk+PjZdLm9wY29kZTsgLyogYmFzZSAqLworICAgICAgICAgIHN3aXRjaCAoc3Vic2V0Wyh0aW5zdHIgJiAweDAzQzApPj42XS5vdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgdF9ub3JtOgorICAgICAgICAgICAgICAqYWluc3RyIHw9ICgodGluc3RyICYgMHgwMDA3KSA8PCAxNikgICAgICAvKiBSbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCh0aW5zdHIgJiAweDAwMDcpIDw8IDEyKSAgICAvKiBSZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCh0aW5zdHIgJiAweDAwMzgpID4+IDMpOyAgICAvKiBScyAqLworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9zaGlmdDoKKyAgICAgICAgICAgICAgKmFpbnN0ciB8PSAoKHRpbnN0ciAmIDB4MDAwNykgPDwgMTIpICAgICAgICAgLyogUmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgMHgwMDA3KSA+PiAwKSAgICAgICAgLyogUm0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgMHgwMDM4KSA8PCAoOCAtIDMpKTsgLyogUnMgKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfbmVnOgorICAgICAgICAgICAgICAqYWluc3RyIHw9ICgodGluc3RyICYgMHgwMDA3KSA8PCAxMikgICAgICAgICAgLyogUmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgMHgwMDM4KSA8PCAoMTYgLSAzKSk7IC8qIFJuICovCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X211bDoKKyAgICAgICAgICAgICAgKmFpbnN0ciB8PSAoKHRpbnN0ciAmIDB4MDAwNykgPDwgMTYpICAgLyogUmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgMHgwMDA3KSA8PCA4KSAgLyogUnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgMHgwMDM4KSA+PiAzKTsgLyogUm0gKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIEZvcm1hdCA1ICovCisgICAgICAgICAgQVJNd29yZCBSZCA9ICgodGluc3RyICYgMHgwMDA3KSA+PiAwKTsKKyAgICAgICAgICBBUk13b3JkIFJzID0gKCh0aW5zdHIgJiAweDAwMzgpID4+IDMpOworICAgICAgICAgIGlmICh0aW5zdHIgJiAoMSA8PCA3KSkKKyAgICAgICAgICAgIFJkICs9IDg7CisgICAgICAgICAgaWYgKHRpbnN0ciAmICgxIDw8IDYpKQorICAgICAgICAgICAgUnMgKz0gODsKKyAgICAgICAgICBzd2l0Y2ggKCh0aW5zdHIgJiAweDAzQzApID4+IDYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDB4MTogLyogQUREIFJkLFJkLEhzICovCisgICAgICAgICAgICBjYXNlIDB4MjogLyogQUREIEhkLEhkLFJzICovCisgICAgICAgICAgICBjYXNlIDB4MzogLyogQUREIEhkLEhkLEhzICovCisgICAgICAgICAgICAgICphaW5zdHIgPSAweEUwODAwMDAwICAgICAgLyogYmFzZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgfCAoUmQgPDwgMTYpICAgIC8qIFJuICovCisgICAgICAgICAgICAgICAgICAgICAgICB8IChSZCA8PCAxMikgICAgLyogUmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKFJzIDw8IDApOyAgICAvKiBSbSAqLworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg1OiAvKiBDTVAgUmQsSHMgKi8KKyAgICAgICAgICAgIGNhc2UgMHg2OiAvKiBDTVAgSGQsUnMgKi8KKyAgICAgICAgICAgIGNhc2UgMHg3OiAvKiBDTVAgSGQsSHMgKi8KKyAgICAgICAgICAgICAgKmFpbnN0ciA9IDB4RTE1MDAwMDAgICAgICAvKiBiYXNlICovCisgICAgICAgICAgICAgICAgICAgICAgICB8IChSZCA8PCAxNikgICAgLyogUm4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKFJkIDw8IDEyKSAgICAvKiBSZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgfCAoUnMgPDwgMCk7ICAgIC8qIFJtICovCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDk6IC8qIE1PViBSZCxIcyAqLworICAgICAgICAgICAgY2FzZSAweEE6IC8qIE1PViBIZCxScyAqLworICAgICAgICAgICAgY2FzZSAweEI6IC8qIE1PViBIZCxIcyAqLworICAgICAgICAgICAgICAqYWluc3RyID0gMHhFMUEwMDAwMCAgICAgIC8qIGJhc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKFJkIDw8IDE2KSAgICAvKiBSbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgfCAoUmQgPDwgMTIpICAgIC8qIFJkICovCisgICAgICAgICAgICAgICAgICAgICAgICB8IChScyA8PCAwKTsgICAgLyogUm0gKi8KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4QzogLyogQlggUnMgKi8KKyAgICAgICAgICAgIGNhc2UgMHhEOiAvKiBCWCBIcyAqLworICAgICAgICAgICAgICAqYWluc3RyID0gMHhFMTJGRkYxMCAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlICovCisgICAgICAgICAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgMHgwMDc4KSA+PiAzKTsgICAgIC8qIFJkICovCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDA6IC8qIFVOREVGSU5FRCAqLworICAgICAgICAgICAgY2FzZSAweDQ6IC8qIFVOREVGSU5FRCAqLworICAgICAgICAgICAgY2FzZSAweDg6IC8qIFVOREVGSU5FRCAqLworICAgICAgICAgICAgY2FzZSAweEU6IC8qIFVOREVGSU5FRCAqLworICAgICAgICAgICAgY2FzZSAweEY6IC8qIFVOREVGSU5FRCAqLworICAgICAgICAgICAgICB2YWxpZCA9IHRfdW5kZWZpbmVkOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSA5OiAvKiBMRFIgUmQsW1BDLCNpbW04XSAqLworICAgICAgLyogRm9ybWF0IDYgKi8KKyAgICAgICphaW5zdHIgPSAweEU1OUYwMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSAqLworICAgICAgICAgICAgICAgIHwgKCh0aW5zdHIgJiAweDA3MDApIDw8ICgxMiAtIDgpKSAgICAgICAvKiBSZCAqLworICAgICAgICAgICAgICAgIHwgKCh0aW5zdHIgJiAweDAwRkYpIDw8ICgyIC0gMCkpOyAgICAgICAvKiBvZmY4ICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDEwOgorICAgIGNhc2UgMTE6CisgICAgICAvKiBUT0RPOiBGb3JtYXQgNyBhbmQgRm9ybWF0IDggcGVyZm9ybSB0aGUgc2FtZSBBUk0gZW5jb2RpbmcsIHNvCisgICAgICAgICB0aGUgZm9sbG93aW5nIGNvdWxkIGJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIHN1YnNldCwgc2F2aW5nIG9uCisgICAgICAgICB0aGUgZm9sbG93aW5nIGJvb2xlYW46ICovCisgICAgICBpZiAoKHRpbnN0ciAmICgxIDw8IDkpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogRm9ybWF0IDcgKi8KKyAgICAgICAgICBBUk13b3JkIHN1YnNldFs0XSA9IHsKKyAgICAgICAgICAgIDB4RTc4MDAwMDAsIC8qIFNUUiAgUmQsW1JiLFJvXSAqLworICAgICAgICAgICAgMHhFN0MwMDAwMCwgLyogU1RSQiBSZCxbUmIsUm9dICovCisgICAgICAgICAgICAweEU3OTAwMDAwLCAvKiBMRFIgIFJkLFtSYixSb10gKi8KKyAgICAgICAgICAgIDB4RTdEMDAwMDAgIC8qIExEUkIgUmQsW1JiLFJvXSAqLworICAgICAgICAgIH07CisgICAgICAgICAgKmFpbnN0ciA9IHN1YnNldFsodGluc3RyICYgMHgwQzAwKSA+PiAxMF0gICAgIC8qIGJhc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgfCAoKHRpbnN0ciAmIDB4MDAwNykgPDwgKDEyIC0gMCkpICAgLyogUmQgKi8KKyAgICAgICAgICAgICAgICAgICAgfCAoKHRpbnN0ciAmIDB4MDAzOCkgPDwgKDE2IC0gMykpICAgLyogUmIgKi8KKyAgICAgICAgICAgICAgICAgICAgfCAoKHRpbnN0ciAmIDB4MDFDMCkgPj4gNik7ICAgICAgICAgLyogUm8gKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogRm9ybWF0IDggKi8KKyAgICAgICAgICBBUk13b3JkIHN1YnNldFs0XSA9IHsKKyAgICAgICAgICAgIDB4RTE4MDAwQjAsIC8qIFNUUkggIFJkLFtSYixSb10gKi8KKyAgICAgICAgICAgIDB4RTE5MDAwRDAsIC8qIExEUlNCIFJkLFtSYixSb10gKi8KKyAgICAgICAgICAgIDB4RTE5MDAwQjAsIC8qIExEUkggIFJkLFtSYixSb10gKi8KKyAgICAgICAgICAgIDB4RTE5MDAwRjAgIC8qIExEUlNIIFJkLFtSYixSb10gKi8KKyAgICAgICAgICB9OworICAgICAgICAgICphaW5zdHIgPSBzdWJzZXRbKHRpbnN0ciAmIDB4MEMwMCkgPj4gMTBdICAgICAvKiBiYXNlICovCisgICAgICAgICAgICAgICAgICAgIHwgKCh0aW5zdHIgJiAweDAwMDcpIDw8ICgxMiAtIDApKSAgIC8qIFJkICovCisgICAgICAgICAgICAgICAgICAgIHwgKCh0aW5zdHIgJiAweDAwMzgpIDw8ICgxNiAtIDMpKSAgIC8qIFJiICovCisgICAgICAgICAgICAgICAgICAgIHwgKCh0aW5zdHIgJiAweDAxQzApID4+IDYpOyAgICAgICAgIC8qIFJvICovCisgICAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI6IC8qIFNUUiBSZCxbUmIsI2ltbTVdICovCisgICAgY2FzZSAxMzogLyogTERSIFJkLFtSYiwjaW1tNV0gKi8KKyAgICBjYXNlIDE0OiAvKiBTVFJCIFJkLFtSYiwjaW1tNV0gKi8KKyAgICBjYXNlIDE1OiAvKiBMRFJCIFJkLFtSYiwjaW1tNV0gKi8KKyAgICAgIC8qIEZvcm1hdCA5ICovCisgICAgICB7CisgICAgICAgIEFSTXdvcmQgc3Vic2V0WzRdID0geworICAgICAgICAgIDB4RTU4MDAwMDAsIC8qIFNUUiAgUmQsW1JiLCNpbW01XSAqLworICAgICAgICAgIDB4RTU5MDAwMDAsIC8qIExEUiAgUmQsW1JiLCNpbW01XSAqLworICAgICAgICAgIDB4RTVDMDAwMDAsIC8qIFNUUkIgUmQsW1JiLCNpbW01XSAqLworICAgICAgICAgIDB4RTVEMDAwMDAgIC8qIExEUkIgUmQsW1JiLCNpbW01XSAqLworICAgICAgICB9OworICAgICAgICAvKiBUaGUgb2Zmc2V0IHJhbmdlIGRlZmVuZHMgb24gd2hldGhlciB3ZSBhcmUgdHJhbnNmZXJyaW5nIGEKKyAgICAgICAgICAgYnl0ZSBvciB3b3JkIHZhbHVlOiAqLworICAgICAgICAqYWluc3RyID0gc3Vic2V0Wyh0aW5zdHIgJiAweDE4MDApID4+IDExXSAgICAgICAvKiBiYXNlICovCisgICAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgMHgwMDA3KSA8PCAoMTIgLSAwKSkgICAgIC8qIFJkICovCisgICAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgMHgwMDM4KSA8PCAoMTYgLSAzKSkgICAgIC8qIFJiICovCisgICAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgMHgwN0MwKSA+PgorICAgICAgICAgICAgICAgICAgICAgKDYgLSAoKHRpbnN0ciAmICgxIDw8IDEyKSkgPyAwIDogMikpKTsgICAgIC8qIG9mZjUgKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6IC8qIFNUUkggUmQsW1JiLCNpbW01XSAqLworICAgIGNhc2UgMTc6IC8qIExEUkggUmQsW1JiLCNpbW01XSAqLworICAgICAgLyogRm9ybWF0IDEwICovCisgICAgICAqYWluc3RyID0gKCh0aW5zdHIgJiAoMSA8PCAxMSkpICAgICAgICAgICAgICAgICAgIC8qIGJhc2UgKi8KKyAgICAgICAgICAgICAgICAgPyAweEUxRDAwMEIwICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTERSSCAqLworICAgICAgICAgICAgICAgICA6IDB4RTFDMDAwQjApICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTVFJIICovCisgICAgICAgICAgICAgICAgfCAoKHRpbnN0ciAmIDB4MDAwNykgPDwgKDEyIC0gMCkpICAgICAgIC8qIFJkICovCisgICAgICAgICAgICAgICAgfCAoKHRpbnN0ciAmIDB4MDAzOCkgPDwgKDE2IC0gMykpICAgICAgIC8qIFJiICovCisgICAgICAgICAgICAgICAgfCAoKHRpbnN0ciAmIDB4MDFDMCkgPj4gKDYgLSAxKSkJLyogb2ZmNSwgbG93IG5pYmJsZSAqLworCQl8ICgodGluc3RyICYgMHgwNjAwKSA+PiAoOSAtIDgpKTsJLyogb2ZmNSwgaGlnaCBuaWJibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTg6IC8qIFNUUiBSZCxbU1AsI2ltbThdICovCisgICAgY2FzZSAxOTogLyogTERSIFJkLFtTUCwjaW1tOF0gKi8KKyAgICAgIC8qIEZvcm1hdCAxMSAqLworICAgICAgKmFpbnN0ciA9ICgodGluc3RyICYgKDEgPDwgMTEpKSAgICAgICAgICAgICAgICAgICAvKiBiYXNlICovCisgICAgICAgICAgICAgICAgID8gMHhFNTlEMDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExEUiAqLworICAgICAgICAgICAgICAgICA6IDB4RTU4RDAwMDApICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTVFIgKi8KKyAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgMHgwNzAwKSA8PCAoMTIgLSA4KSkgICAgICAgLyogUmQgKi8KKyAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgMHgwMEZGKSA8PCAyKTsgICAgICAgICAgICAgLyogb2ZmOCAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMDogLyogQUREIFJkLFBDLCNpbW04ICovCisgICAgY2FzZSAyMTogLyogQUREIFJkLFNQLCNpbW04ICovCisgICAgICAvKiBGb3JtYXQgMTIgKi8KKyAgICAgIGlmICgodGluc3RyICYgKDEgPDwgMTEpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogTk9URTogVGhlIFBDIHZhbHVlIHVzZWQgaGVyZSBzaG91bGQgYnkgd29yZCBhbGlnbmVkICovCisJICAvKiBXZSBlbmNvZGUgc2hpZnQtbGVmdC1ieS0yIGluIHRoZSByb3RhdGUgaW1tZWRpYXRlIGZpZWxkLAorCSAgICAgc28gbm8gc2hpZnQgb2Ygb2ZmOCBpcyBuZWVkZWQuICAqLworICAgICAgICAgICphaW5zdHIgPSAweEUyOEYwRjAwICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlICovCisgICAgICAgICAgICAgICAgICAgIHwgKCh0aW5zdHIgJiAweDA3MDApIDw8ICgxMiAtIDgpKSAgIC8qIFJkICovCisgICAgICAgICAgICAgICAgICAgIHwgKHRpbnN0ciAmIDB4MDBGRik7ICAgICAgICAgICAgICAgIC8qIG9mZjggKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisJICAvKiBXZSBlbmNvZGUgc2hpZnQtbGVmdC1ieS0yIGluIHRoZSByb3RhdGUgaW1tZWRpYXRlIGZpZWxkLAorCSAgICAgc28gbm8gc2hpZnQgb2Ygb2ZmOCBpcyBuZWVkZWQuICAqLworICAgICAgICAgICphaW5zdHIgPSAweEUyOEQwRjAwICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNlICovCisgICAgICAgICAgICAgICAgICAgIHwgKCh0aW5zdHIgJiAweDA3MDApIDw8ICgxMiAtIDgpKSAgIC8qIFJkICovCisgICAgICAgICAgICAgICAgICAgIHwgKHRpbnN0ciAmIDB4MDBGRik7ICAgICAgICAgICAgICAgIC8qIG9mZjggKi8KKyAgICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjoKKyAgICBjYXNlIDIzOgorICAgICAgaWYgKCh0aW5zdHIgJiAweDBGMDApID09IDB4MDAwMCkKKyAgICAgICAgeworICAgICAgICAgIC8qIEZvcm1hdCAxMyAqLworICAgICAgICAgIC8qIE5PVEU6IFRoZSBpbnN0cnVjdGlvbiBjb250YWlucyBhIHNoaWZ0IGxlZnQgb2YgMgorICAgICAgICAgICAgIGVxdWl2YWxlbnQgKGltcGxlbWVudGVkIGFzIFJPUiAjMzApOiAqLworICAgICAgICAgICphaW5zdHIgPSAoKHRpbnN0ciAmICgxIDw8IDcpKSAgICAgICAgLyogYmFzZSAqLworICAgICAgICAgICAgICAgICAgICAgPyAweEUyNERERjAwICAgICAgICAgICAgICAgLyogU1VCICovCisgICAgICAgICAgICAgICAgICAgICA6IDB4RTI4RERGMDApICAgICAgICAgICAgICAvKiBBREQgKi8KKyAgICAgICAgICAgICAgICAgICAgfCAodGluc3RyICYgMHgwMDdGKTsgICAgICAgIC8qIG9mZjcgKi8KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogRm9ybWF0IDE0ICovCisgICAgICAgICAgQVJNd29yZCBzdWJzZXRbNF0gPSB7CisgICAgICAgICAgICAweEU5MkQwMDAwLCAvKiBTVE1EQiBzcCEse3JsaXN0fSAgICAqLworICAgICAgICAgICAgMHhFOTJENDAwMCwgLyogU1RNREIgc3AhLHtybGlzdCxscn0gKi8KKyAgICAgICAgICAgIDB4RThCRDAwMDAsIC8qIExETUlBIHNwISx7cmxpc3R9ICAgICovCisgICAgICAgICAgICAweEU4QkQ4MDAwICAvKiBMRE1JQSBzcCEse3JsaXN0LHBjfSAqLworICAgICAgICAgIH07CisgICAgICAgICAgKmFpbnN0ciA9IHN1YnNldFsoKHRpbnN0ciAmICgxIDw8IDExKSkgPj4gMTApCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgKDEgPDwgOCkpID4+IDgpXSAgICAgICAgLyogYmFzZSAqLworICAgICAgICAgICAgICAgICAgICB8ICh0aW5zdHIgJiAweDAwRkYpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hc2s4ICovCisgICAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ6IC8qIFNUTUlBICovCisgICAgY2FzZSAyNTogLyogTERNSUEgKi8KKyAgICAgIC8qIEZvcm1hdCAxNSAqLworICAgICAgKmFpbnN0ciA9ICgodGluc3RyICYgKDEgPDwgMTEpKSAgICAgICAgICAgICAgICAgICAvKiBiYXNlICovCisgICAgICAgICAgICAgICAgID8gMHhFOEIwMDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExETUlBICovCisgICAgICAgICAgICAgICAgIDogMHhFOEEwMDAwMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNUTUlBICovCisgICAgICAgICAgICAgICAgfCAoKHRpbnN0ciAmIDB4MDcwMCkgPDwgKDE2IC0gOCkpICAgICAgIC8qIFJiICovCisgICAgICAgICAgICAgICAgfCAodGluc3RyICYgMHgwMEZGKTsgICAgICAgICAgICAgICAgICAgIC8qIG1hc2s4ICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDI2OiAvKiBCY2MgKi8KKyAgICBjYXNlIDI3OiAvKiBCY2MvU1dJICovCisgICAgICBpZiAoKHRpbnN0ciAmIDB4MEYwMCkgPT0gMHgwRjAwKQorICAgICAgICB7CisgICAgICAgICAgLyogRm9ybWF0IDE3IDogU1dJICovCisgICAgICAgICAgKmFpbnN0ciA9IDB4RUYwMDAwMDA7CisJICAvKiBCcmVha3BvaW50IG11c3QgYmUgaGFuZGxlZCBzcGVjaWFsbHkuICAqLworCSAgaWYgKCh0aW5zdHIgJiAweDAwRkYpID09IDB4MTgpCisJICAgICphaW5zdHIgfD0gKCh0aW5zdHIgJiAweDAwRkYpIDw8IDE2KTsKKwkgIGVsc2UKKwkgICAgKmFpbnN0ciB8PSAodGluc3RyICYgMHgwMEZGKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoKHRpbnN0ciAmIDB4MEYwMCkgIT0gMHgwRTAwKQorICAgICAgICB7CisgICAgICAgICAgLyogRm9ybWF0IDE2ICovCisgICAgICAgICAgaW50IGRvaXQgPSBGQUxTRTsKKyAgICAgICAgICAvKiBUT0RPOiBTaW5jZSB3ZSBhcmUgZG9pbmcgYSBzd2l0Y2ggaGVyZSwgd2UgY291bGQganVzdCBhZGQKKyAgICAgICAgICAgICB0aGUgU1dJIGFuZCB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gY2hlY2tzIGludG8gdGhpcworICAgICAgICAgICAgIHN3aXRjaCB0byBzYW1lIG9uIGEgY291cGxlIG9mIGNvbmRpdGlvbmFsczogKi8KKyAgICAgICAgICBzd2l0Y2ggKCh0aW5zdHIgJiAweDBGMDApID4+IDgpIHsKKyAgICAgICAgICAgIGNhc2UgRVEgOiBkb2l0PVpGTEFHIDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICBjYXNlIE5FIDogZG9pdD0hWkZMQUcgOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgIGNhc2UgVlMgOiBkb2l0PVZGTEFHIDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICBjYXNlIFZDIDogZG9pdD0hVkZMQUcgOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgIGNhc2UgTUkgOiBkb2l0PU5GTEFHIDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICBjYXNlIFBMIDogZG9pdD0hTkZMQUcgOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgIGNhc2UgQ1MgOiBkb2l0PUNGTEFHIDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICBjYXNlIENDIDogZG9pdD0hQ0ZMQUcgOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDsKKyAgICAgICAgICAgIGNhc2UgSEkgOiBkb2l0PShDRkxBRyAmJiAhWkZMQUcpIDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICBjYXNlIExTIDogZG9pdD0oIUNGTEFHIHx8IFpGTEFHKSA7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgY2FzZSBHRSA6IGRvaXQ9KCghTkZMQUcgJiYgIVZGTEFHKSB8fCAoTkZMQUcgJiYgVkZMQUcpKSA7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgY2FzZSBMVCA6IGRvaXQ9KChORkxBRyAmJiAhVkZMQUcpIHx8ICghTkZMQUcgJiYgVkZMQUcpKSA7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgOworICAgICAgICAgICAgY2FzZSBHVCA6IGRvaXQ9KCghTkZMQUcgJiYgIVZGTEFHICYmICFaRkxBRykgfHwgKE5GTEFHICYmIFZGTEFHICYmICFaRkxBRykpIDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgICBjYXNlIExFIDogZG9pdD0oKE5GTEFHICYmICFWRkxBRykgfHwgKCFORkxBRyAmJiBWRkxBRykpIHx8IFpGTEFHIDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChkb2l0KSB7CisgICAgICAgICAgICBzdGF0ZS0+UmVnWzE1XSA9IHBjICsgNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoKHRpbnN0ciAmIDB4N0YpIDw8IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCh0aW5zdHIgJiAoMSA8PCA3KSkgPyAweEZGRkZGRjAwIDogMCkpOworICAgICAgICAgICAgRkxVU0hQSVBFOworICAgICAgICAgIH0KKyAgICAgICAgICB2YWxpZCA9IHRfYnJhbmNoOworICAgICAgICB9CisgICAgICBlbHNlIC8qIFVOREVGSU5FRCA6IGNjPTExMTAoQUwpIHVzZXMgZGlmZmVyZW50IGZvcm1hdCAqLworICAgICAgICB2YWxpZCA9IHRfdW5kZWZpbmVkOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyODogLyogQiAqLworICAgICAgLyogRm9ybWF0IDE4ICovCisgICAgICBzdGF0ZS0+UmVnWzE1XSA9IHBjICsgNAorICAgICAgICAgICAgICAgICAgICAgICArICgoKHRpbnN0ciAmIDB4M0ZGKSA8PCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgKDEgPDwgMTApKSA/IDB4RkZGRkY4MDAgOiAwKSk7CisgICAgICBGTFVTSFBJUEU7CisgICAgICB2YWxpZCA9IHRfYnJhbmNoOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOTogLyogVU5ERUZJTkVEICovCisgICAgICB2YWxpZCA9IHRfdW5kZWZpbmVkOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMDogLyogQkwgaW5zdHJ1Y3Rpb24gMSAqLworICAgICAgLyogRm9ybWF0IDE5ICovCisgICAgICAvKiBUaGVyZSBpcyBubyBzaW5nbGUgQVJNIGluc3RydWN0aW9uIGVxdWl2YWxlbnQgZm9yIHRoaXMgVGh1bWIKKyAgICAgICAgIGluc3RydWN0aW9uLiBUbyBrZWVwIHRoZSBzaW11bGF0aW9uIHNpbXBsZSAoZnJvbSB0aGUgdXNlcgorICAgICAgICAgcGVyc3BlY3RpdmUpIHdlIGNoZWNrIGlmIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24gaXMgdGhlCisgICAgICAgICBzZWNvbmQgaGFsZiBvZiB0aGlzIEJMLCBhbmQgaWYgaXQgaXMgd2Ugc2ltdWxhdGUgaXQKKyAgICAgICAgIGltbWVkaWF0ZWx5LiAqLworICAgICAgc3RhdGUtPlJlZ1sxNF0gPSBzdGF0ZS0+UmVnWzE1XSBcCisgICAgICAgICAgICAgICAgICAgICAgICsgKCgodGluc3RyICYgMHgwN0ZGKSA8PCAxMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgodGluc3RyICYgKDEgPDwgMTApKSA/IDB4RkY4MDAwMDAgOiAwKSk7CisgICAgICB2YWxpZCA9IHRfYnJhbmNoOyAvKiBpbi1jYXNlIHdlIGRvbid0IGhhdmUgdGhlIDJuZCBoYWxmICovCisgICAgICB0aW5zdHIgPSBuZXh0X2luc3RyOyAvKiBtb3ZlIHRoZSBpbnN0cnVjdGlvbiBkb3duICovCisgICAgICBpZiAoKCh0aW5zdHIgJiAweEY4MDApID4+IDExKSAhPSAzMSkKKwlicmVhazsgLyogZXhpdCwgc2luY2Ugbm90IGNvcnJlY3QgaW5zdHJ1Y3Rpb24gKi8KKyAgICAgIC8qIGVsc2Ugd2UgZmFsbCB0aHJvdWdoIHRvIHByb2Nlc3MgdGhlIHNlY29uZCBoYWxmIG9mIHRoZSBCTCAqLworICAgICAgcGMgKz0gMjsgLyogcG9pbnQgdGhlIHBjIGF0IHRoZSAybmQgaGFsZiAqLworICAgIGNhc2UgMzE6IC8qIEJMIGluc3RydWN0aW9uIDIgKi8KKyAgICAgIC8qIEZvcm1hdCAxOSAqLworICAgICAgLyogVGhlcmUgaXMgbm8gc2luZ2xlIEFSTSBpbnN0cnVjdGlvbiBlcXVpdmFsZW50IGZvciB0aGlzCisgICAgICAgICBpbnN0cnVjdGlvbi4gQWxzbywgaXQgc2hvdWxkIG9ubHkgZXZlciBiZSBtYXRjaGVkIHdpdGggdGhlCisgICAgICAgICBmbXQxOSAiQkwgaW5zdHJ1Y3Rpb24gMSIgaW5zdHJ1Y3Rpb24uIEhvd2V2ZXIsIHdlIGRvIGFsbG93CisgICAgICAgICB0aGUgc2ltdWxhdGlvbiBvZiBpdCBvbiBpdHMgb3duLCB3aXRoIHVuZGVmaW5lZCByZXN1bHRzIGlmCisgICAgICAgICByMTQgaXMgbm90IHN1aXRhYmx5IGluaXRpYWxpc2VkLiovCisgICAgICB7CisgICAgICAgIEFSTXdvcmQgdG1wID0gKHBjICsgMik7CisgICAgICAgIHN0YXRlLT5SZWdbMTVdID0gKHN0YXRlLT5SZWdbMTRdICsgKCh0aW5zdHIgJiAweDA3RkYpIDw8IDEpKTsKKyAgICAgICAgc3RhdGUtPlJlZ1sxNF0gPSAodG1wIHwgMSk7CisgICAgICAgIHZhbGlkID0gdF9icmFuY2g7CisgICAgICAgIEZMVVNIUElQRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gdmFsaWQ7Cit9CmRpZmYgLS1naXQgYS9zaW0vYXJtL3dyYXBwZXIuYyBiL3NpbS9hcm0vd3JhcHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMzgwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vYXJtL3dyYXBwZXIuYwpAQCAtMCwwICsxLDQ2NyBAQAorLyogcnVuIGZyb250IGVuZCBzdXBwb3J0IGZvciBhcm0KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgQVJNIFNJTS4KKworR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgc2ltdWxhdG9yIGFuZCBydW4uYyBhbmQgZ2RiCisgICAod2hlbiB0aGUgc2ltdWxhdG9yIGlzIGxpbmtlZCB3aXRoIGdkYikuCisgICBBbGwgc2ltdWxhdG9yIGludGVyYWN0aW9uIHNob3VsZCBnbyB0aHJvdWdoIHRoaXMgZmlsZS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGJmZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAicmVtb3RlLXNpbS5oIgorI2luY2x1ZGUgImFybWRlZnMuaCIKKyNpbmNsdWRlICJhcm1lbXUuaCIKKyNpbmNsdWRlICJkYmdfcmRpLmgiCisKK2hvc3RfY2FsbGJhY2sgKnNpbV9jYWxsYmFjazsKKworc3RhdGljIHN0cnVjdCBBUk11bF9TdGF0ZSAqc3RhdGU7CisKKy8qIFdobyBpcyB1c2luZyB0aGUgc2ltdWxhdG9yLiAgKi8KK3N0YXRpYyBTSU1fT1BFTl9LSU5EIHNpbV9raW5kOworCisvKiBhcmd2WzBdICovCitzdGF0aWMgY2hhciAqbXluYW1lOworCisvKiBNZW1vcnkgc2l6ZSBpbiBieXRlcy4gICovCitzdGF0aWMgaW50IG1lbV9zaXplID0gKDEgPDwgMjEpOworCisvKiBOb24temVybyB0byBkaXNwbGF5IHN0YXJ0IHVwIGJhbm5lciwgYW5kIG1heWJlIG90aGVyIHRoaW5ncy4gICovCitzdGF0aWMgaW50IHZlcmJvc2l0eTsKKworLyogTm9uLXplcm8gdG8gc2V0IGJpZyBlbmRpYW4gbW9kZS4gICovCitzdGF0aWMgaW50IGJpZ19lbmRpYW47CisKK3N0YXRpYyB2b2lkIAoraW5pdCAoKQoreworICBzdGF0aWMgaW50IGRvbmU7CisKKyAgaWYgKCFkb25lKQorICAgIHsKKyAgICAgIEFSTXVsX0VtdWxhdGVJbml0KCk7CisgICAgICBzdGF0ZSA9IEFSTXVsX05ld1N0YXRlICgpOworICAgICAgc3RhdGUtPmJpZ2VuZFNpZyA9IChiaWdfZW5kaWFuID8gSElHSCA6IExPVyk7CisgICAgICBBUk11bF9NZW1vcnlJbml0KHN0YXRlLCBtZW1fc2l6ZSk7CisgICAgICBBUk11bF9PU0luaXQoc3RhdGUpOworICAgICAgQVJNdWxfQ29Qcm9Jbml0KHN0YXRlKTsgCisgICAgICBzdGF0ZS0+dmVyYm9zZSA9IHZlcmJvc2l0eTsKKyAgICAgIGRvbmUgPSAxOworICAgIH0KK30KKworLyogU2V0IHZlcmJvc2l0eSBsZXZlbCBvZiBzaW11bGF0b3IuCisgICBUaGlzIGlzIG5vdCBpbnRlbmRlZCB0byBwcm9kdWNlIGRldGFpbGVkIHRyYWNpbmcgb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLgorICAgSnVzdCBzdW1tYXJpZXMuICAqLworLyogRklYTUU6IGNvbW1vbi9ydW4uYyBkb2Vzbid0IGRvIHRoaXMgeWV0LiAgKi8KKwordm9pZAorc2ltX3NldF92ZXJib3NlICh2KQorICAgICBpbnQgdjsKK3sKKyAgdmVyYm9zaXR5ID0gdjsKK30KKworLyogU2V0IHRoZSBtZW1vcnkgc2l6ZSB0byBTSVpFIGJ5dGVzLgorICAgTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBzaW11bGF0b3IuICAqLyAgIAorLyogRklYTUU6IFJlbmFtZSB0byBzaW1fc2V0X21lbV9zaXplLiAgKi8KKwordm9pZCAKK3NpbV9zaXplIChzaXplKQorICAgICBpbnQgc2l6ZTsKK3sKKyAgbWVtX3NpemUgPSBzaXplOworfQorCit2b2lkIAorQVJNdWxfQ29uc29sZVByaW50IChBUk11bF9TdGF0ZSAqIHN0YXRlLCBjb25zdCBjaGFyICpmb3JtYXQsLi4uKQoreworICB2YV9saXN0IGFwOworCisgIGlmIChzdGF0ZS0+dmVyYm9zZSkKKyAgICB7CisgICAgICB2YV9zdGFydCAoYXAsIGZvcm1hdCk7CisgICAgICB2cHJpbnRmIChmb3JtYXQsIGFwKTsKKyAgICAgIHZhX2VuZCAoYXApOworICAgIH0KK30KKworQVJNd29yZCAKK0FSTXVsX0RlYnVnIChBUk11bF9TdGF0ZSAqIHN0YXRlLCBBUk13b3JkIHBjLCBBUk13b3JkIGluc3RyKQoreworCit9CisKK2ludAorc2ltX3dyaXRlIChzZCwgYWRkciwgYnVmZmVyLCBzaXplKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgU0lNX0FERFIgYWRkcjsKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICAgICBpbnQgc2l6ZTsKK3sKKyAgaW50IGk7CisgIGluaXQgKCk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgeworICAgICAgQVJNdWxfV3JpdGVCeXRlIChzdGF0ZSwgYWRkcitpLCBidWZmZXJbaV0pOworICAgIH0KKyAgcmV0dXJuIHNpemU7Cit9CisKK2ludAorc2ltX3JlYWQgKHNkLCBhZGRyLCBidWZmZXIsIHNpemUpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBTSU1fQUREUiBhZGRyOworICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgICAgIGludCBzaXplOworeworICBpbnQgaTsKKyAgaW5pdCAoKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICB7CisgICAgICBidWZmZXJbaV0gPSBBUk11bF9SZWFkQnl0ZSAoc3RhdGUsIGFkZHIgKyBpKTsKKyAgICB9CisgIHJldHVybiBzaXplOworfQorCitpbnQKK3NpbV90cmFjZSAoc2QpCisgICAgIFNJTV9ERVNDIHNkOworeworICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLCAiVGhpcyBzaW11bGF0b3IgZG9lcyBub3Qgc3VwcG9ydCB0cmFjaW5nXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludAorc2ltX3N0b3AgKHNkKQorICAgICBTSU1fREVTQyBzZDsKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3NpbV9yZXN1bWUgKHNkLCBzdGVwLCBzaWdnbmFsKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgaW50IHN0ZXAsIHNpZ2duYWw7Cit7CisgIHN0YXRlLT5FbmRDb25kaXRpb24gPSAwOworCisgIGlmIChzdGVwKQorICAgIHsKKyAgICAgIHN0YXRlLT5SZWdbMTVdID0gQVJNdWxfRG9JbnN0ciAoc3RhdGUpOworICAgICAgaWYgKHN0YXRlLT5FbmRDb25kaXRpb24gPT0gMCkKKwlzdGF0ZS0+RW5kQ29uZGl0aW9uID0gUkRJRXJyb3JfQnJlYWtwb2ludFJlYWNoZWQ7CisgICAgfQorICBlbHNlCisgICAgeworI2lmIDEgLyogSkdTICovCisgICAgICBzdGF0ZS0+TmV4dEluc3RyID0gUkVTVU1FOyAvKiB0cmVhdCBhcyBQQyBjaGFuZ2UgKi8KKyNlbmRpZgorICAgICAgc3RhdGUtPlJlZ1sxNV0gPSBBUk11bF9Eb1Byb2cgKHN0YXRlKTsKKyAgICB9CisKKyAgRkxVU0hQSVBFOworfQorCitTSU1fUkMKK3NpbV9jcmVhdGVfaW5mZXJpb3IgKHNkLCBhYmZkLCBhcmd2LCBlbnYpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKKyAgICAgY2hhciAqKmFyZ3Y7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGludCBhcmd2bGVuPTA7CisgIGNoYXIgKiphcmc7CisKKyAgaWYgKGFiZmQgIT0gTlVMTCkKKyAgICBBUk11bF9TZXRQQyAoc3RhdGUsIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkpOworICBlbHNlCisgICAgQVJNdWxfU2V0UEMgKHN0YXRlLCAwKTsgLyogPz8/ICovCisKKyNpZiAxIC8qIEpHUyAqLworICAvKiBXZSBleHBsaWNpdGx5IHNlbGVjdCBhIHByb2Nlc3NvciBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgdGhlIEFSTQorICAgICAzMmJpdCBtb2RlLCBhbmQgdGhlbiB3ZSBmb3JjZSB0aGUgc2ltdWxhdGVkIENQVSBpbnRvIHRoZSAzMmJpdAorICAgICBVc2VyIG1vZGU6ICovCisgIEFSTXVsX1NlbGVjdFByb2Nlc3NvcihzdGF0ZSwgQVJNNjAwKTsKKyAgQVJNdWxfU2V0Q1BTUihzdGF0ZSwgVVNFUjMyTU9ERSk7CisjZW5kaWYKKworICBpZiAoYXJndiAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qCisgICAgICAqKiBTZXQgdXAgdGhlIGNvbW1hbmQgbGluZSAoYnkgbGFib3Jpb3VzbHkgc3RyaW5naW5nIHRvZ2V0aGVyIHRoZQorICAgICAgKiogZW52aXJvbm1lbnQgY2FyZWZ1bGx5IHBpY2tlZCBhcGFydCBieSBvdXIgY2FsbGVyLi4uKQorICAgICAgKi8KKyAgICAgIC8qIEZyZWUgYW55IG9sZCBzdHVmZiAqLworICAgICAgaWYgKHN0YXRlLT5Db21tYW5kTGluZSAhPSBOVUxMKQorCXsKKwkgIGZyZWUoc3RhdGUtPkNvbW1hbmRMaW5lKTsKKwkgIHN0YXRlLT5Db21tYW5kTGluZSA9IE5VTEw7CisJfQorICAgICAgCisgICAgICAvKiBTZWUgaG93IG11Y2ggd2UgbmVlZCAqLworICAgICAgZm9yIChhcmcgPSBhcmd2OyAqYXJnICE9IE5VTEw7IGFyZysrKQorCWFyZ3ZsZW4gKz0gc3RybGVuKCphcmcpKzE7CisgICAgICAKKyAgICAgIC8qIGFsbG9jYXRlIGl0Li4uICovCisgICAgICBzdGF0ZS0+Q29tbWFuZExpbmUgPSBtYWxsb2MoYXJndmxlbisxKTsKKyAgICAgIGlmIChzdGF0ZS0+Q29tbWFuZExpbmUgIT0gTlVMTCkKKwl7CisJICBhcmcgPSBhcmd2OworCSAgc3RhdGUtPkNvbW1hbmRMaW5lWzBdPSdcMCc7CisJICBmb3IgKGFyZyA9IGFyZ3Y7ICphcmcgIT0gTlVMTDsgYXJnKyspCisJICAgIHsKKwkgICAgICBzdHJjYXQoc3RhdGUtPkNvbW1hbmRMaW5lLCAqYXJnKTsKKwkgICAgICBzdHJjYXQoc3RhdGUtPkNvbW1hbmRMaW5lLCAiICIpOworCSAgICB9CisJfQorICAgIH0KKworICBpZiAoZW52ICE9IE5VTEwpCisgICAgeworICAgICAgLyogTm93IHNlZSBpZiB0aGVyZSdzIGEgTUVNU0laRSBzcGVjIGluIHRoZSBlbnZpcm9ubWVudCAqLworICAgICAgd2hpbGUgKCplbnYpCisJeworCSAgaWYgKHN0cm5jbXAoKmVudiwgIk1FTVNJWkU9Iiwgc2l6ZW9mKCJNRU1TSVpFPSIpLTEpPT0wKQorCSAgICB7CisJICAgICAgdW5zaWduZWQgbG9uZyB0b3Bfb2ZfbWVtb3J5OworCSAgICAgIGNoYXIgKmVuZF9vZl9udW07CisJICAgICAgCisJICAgICAgLyogU2V0IHVwIG1lbW9yeSBsaW1pdCAqLworCSAgICAgIHN0YXRlLT5NZW1TaXplID0gc3RydG91bCgqZW52ICsgc2l6ZW9mKCJNRU1TSVpFPSIpLTEsICZlbmRfb2ZfbnVtLCAwKTsKKwkgICAgfQorCSAgZW52Kys7CisJfQorICAgIH0KKworICByZXR1cm4gU0lNX1JDX09LOworfQorCit2b2lkCitzaW1faW5mbyAoc2QsIHZlcmJvc2UpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgdmVyYm9zZTsKK3sKK30KKworCitzdGF0aWMgaW50IAorZnJvbW1lbSAoc3RhdGUsIG1lbW9yeSkKKyAgICAgc3RydWN0IEFSTXVsX1N0YXRlICpzdGF0ZTsKKyAgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OworeworICBpZiAoc3RhdGUtPmJpZ2VuZFNpZyA9PSBISUdIKQorICAgIHsKKyAgICAgIHJldHVybiAobWVtb3J5WzBdIDw8IDI0KQorCXwgKG1lbW9yeVsxXSA8PCAxNikKKwl8IChtZW1vcnlbMl0gPDwgOCkKKwl8IChtZW1vcnlbM10gPDwgMCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIChtZW1vcnlbM10gPDwgMjQpCisJfCAobWVtb3J5WzJdIDw8IDE2KQorCXwgKG1lbW9yeVsxXSA8PCA4KQorCXwgKG1lbW9yeVswXSA8PCAwKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3RvbWVtIChzdGF0ZSwgbWVtb3J5LCAgdmFsKQorICAgICBzdHJ1Y3QgQVJNdWxfU3RhdGUgKnN0YXRlOworICAgICB1bnNpZ25lZCBjaGFyICptZW1vcnk7CisgICAgIGludCB2YWw7Cit7CisgIGlmIChzdGF0ZS0+YmlnZW5kU2lnID09IEhJR0gpCisgICAgeworICAgICAgbWVtb3J5WzBdID0gdmFsID4+IDI0OworICAgICAgbWVtb3J5WzFdID0gdmFsID4+IDE2OworICAgICAgbWVtb3J5WzJdID0gdmFsID4+IDg7CisgICAgICBtZW1vcnlbM10gPSB2YWwgPj4gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtZW1vcnlbM10gPSB2YWwgPj4gMjQ7CisgICAgICBtZW1vcnlbMl0gPSB2YWwgPj4gMTY7CisgICAgICBtZW1vcnlbMV0gPSB2YWwgPj4gODsKKyAgICAgIG1lbW9yeVswXSA9IHZhbCA+PiAwOworICAgIH0KK30KKworaW50CitzaW1fc3RvcmVfcmVnaXN0ZXIgKHNkLCBybiwgbWVtb3J5LCBsZW5ndGgpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgcm47CisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgaW5pdCAoKTsKKyAgQVJNdWxfU2V0UmVnKHN0YXRlLCBzdGF0ZS0+TW9kZSwgcm4sIGZyb21tZW0gKHN0YXRlLCBtZW1vcnkpKTsKKyAgcmV0dXJuIC0xOworfQorCitpbnQKK3NpbV9mZXRjaF9yZWdpc3RlciAoc2QsIHJuLCBtZW1vcnksIGxlbmd0aCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCBybjsKKyAgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OworICAgICBpbnQgbGVuZ3RoOworeworICBBUk13b3JkIHJlZ3ZhbDsKKworICBpbml0ICgpOworICBpZiAocm4gPCAxNikKKyAgICByZWd2YWwgPSBBUk11bF9HZXRSZWcoc3RhdGUsIHN0YXRlLT5Nb2RlLCBybik7CisgIGVsc2UgaWYgKHJuID09IDI1KQkvKiBGSVhNRTogdXNlIFBTX1JFR05VTSBmcm9tIGdkYi9jb25maWcvYXJtL3RtLWFybS5oICovCisgICAgcmVndmFsID0gQVJNdWxfR2V0Q1BTUihzdGF0ZSk7CisgIGVsc2UKKyAgICByZWd2YWwgPSAwOwkJLyogRklYTUU6IHNob3VsZCByZXBvcnQgYW4gZXJyb3IgKi8KKyAgdG9tZW0gKHN0YXRlLCBtZW1vcnksIHJlZ3ZhbCk7CisgIHJldHVybiAtMTsKK30KKworU0lNX0RFU0MKK3NpbV9vcGVuIChraW5kLCBwdHIsIGFiZmQsIGFyZ3YpCisgICAgIFNJTV9PUEVOX0tJTkQga2luZDsKKyAgICAgaG9zdF9jYWxsYmFjayAqcHRyOworICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIHNpbV9raW5kID0ga2luZDsKKyAgbXluYW1lID0gYXJndlswXTsKKyAgc2ltX2NhbGxiYWNrID0gcHRyOworICAKKyAgLyogRGVjaWRlIHVwb24gdGhlIGVuZGlhbi1uZXNzIG9mIHRoZSBwcm9jZXNzb3IuCisgICAgIElmIHdlIGNhbiwgZ2V0IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiZmQgaXRzZWxmLgorICAgICBPdGhlcndpc2UgbG9vayB0byBzZWUgaWYgd2UgaGF2ZSBiZWVuIGdpdmVuIGEgY29tbWFuZAorICAgICBsaW5lIHN3aXRjaCB0aGF0IHRlbGxzIHVzLiAgT3RoZXJ3aXNlIGRlZmF1bHQgdG8gbGl0dGxlIGVuZGlhbi4gICovCisgIGlmIChhYmZkICE9IE5VTEwpCisgICAgYmlnX2VuZGlhbiA9IGJmZF9iaWdfZW5kaWFuIChhYmZkKTsKKyAgZWxzZSBpZiAoYXJndlsxXSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICAvKiBTY2FuIGZvciBlbmRpYW4tbmVzcyBzd2l0Y2guICAqLworICAgICAgZm9yIChpID0gMDsgKGFyZ3ZbaV0gIT0gTlVMTCkgJiYgKGFyZ3ZbaV1bMF0gIT0gMCk7IGkrKykKKyAgICAgIGlmIChhcmd2W2ldWzBdID09ICctJyAmJiBhcmd2W2ldWzFdID09ICdFJykKKyAgICAgICAgeworICAgICAgICAgIGNoYXIgYzsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAoKGMgPSBhcmd2W2ldWzJdKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgIGMgPSBhcmd2W2ldWzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgc3dpdGNoIChjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICBzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZAorICAgICAgICAgICAgICAgIChzaW1fY2FsbGJhY2ssICJObyBhcmd1bWVudCB0byAtRSBvcHRpb24gcHJvdmlkZWRcbiIpOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgICAgYmlnX2VuZGlhbiA9IDE7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICdsJzoKKyAgICAgICAgICAgIGNhc2UgJ0wnOgorICAgICAgICAgICAgICBiaWdfZW5kaWFuID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkCisgICAgICAgICAgICAgICAgKHNpbV9jYWxsYmFjaywgIlVucmVjb2duaXNlZCBhcmd1bWVudCB0byAtRSBvcHRpb25cbiIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICByZXR1cm4gKFNJTV9ERVNDKSAxOworfQorCit2b2lkCitzaW1fY2xvc2UgKHNkLCBxdWl0dGluZykKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCBxdWl0dGluZzsKK3sKKyAgLyogbm90aGluZyB0byBkbyAqLworfQorCitTSU1fUkMKK3NpbV9sb2FkIChzZCwgcHJvZywgYWJmZCwgZnJvbV90dHkpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBjaGFyICpwcm9nOworICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZXh0ZXJuIGJmZCAqc2ltX2xvYWRfZmlsZSAoKTsgLyogPz8/IERvbid0IGtub3cgd2hlcmUgdGhpcyBzaG91bGQgbGl2ZS4gICovCisgIGJmZCAqcHJvZ19iZmQ7CisKKyAgcHJvZ19iZmQgPSBzaW1fbG9hZF9maWxlIChzZCwgbXluYW1lLCBzaW1fY2FsbGJhY2ssIHByb2csIGFiZmQsCisJCQkgICAgc2ltX2tpbmQgPT0gU0lNX09QRU5fREVCVUcsCisJCQkgICAgMCwgc2ltX3dyaXRlKTsKKyAgaWYgKHByb2dfYmZkID09IE5VTEwpCisgICAgcmV0dXJuIFNJTV9SQ19GQUlMOworICBBUk11bF9TZXRQQyAoc3RhdGUsIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAocHJvZ19iZmQpKTsKKyAgaWYgKGFiZmQgPT0gTlVMTCkKKyAgICBiZmRfY2xvc2UgKHByb2dfYmZkKTsKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKwordm9pZAorc2ltX3N0b3BfcmVhc29uIChzZCwgcmVhc29uLCBzaWdyYykKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGVudW0gc2ltX3N0b3AgKnJlYXNvbjsKKyAgICAgaW50ICpzaWdyYzsKK3sKKyAgaWYgKHN0YXRlLT5FbmRDb25kaXRpb24gPT0gMCkKKyAgICB7CisgICAgICAqcmVhc29uID0gc2ltX2V4aXRlZDsKKyAgICAgICpzaWdyYyA9IHN0YXRlLT5SZWdbMF0gJiAyNTU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgKnJlYXNvbiA9IHNpbV9zdG9wcGVkOworICAgICAgaWYgKHN0YXRlLT5FbmRDb25kaXRpb24gPT0gUkRJRXJyb3JfQnJlYWtwb2ludFJlYWNoZWQpCisJKnNpZ3JjID0gU0lHVFJBUDsKKyAgICAgIGVsc2UKKwkqc2lncmMgPSAwOworICAgIH0KK30KKwordm9pZAorc2ltX2RvX2NvbW1hbmQgKHNkLCBjbWQpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBjaGFyICpjbWQ7Cit7CisgICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssICJUaGlzIHNpbXVsYXRvciBkb2VzIG5vdCBhY2NlcHQgYW55IGNvbW1hbmRzLlxuIik7Cit9CisKKwordm9pZAorc2ltX3NldF9jYWxsYmFja3MgKHB0cikKKyAgICAgaG9zdF9jYWxsYmFjayAqcHRyOworeworICBzaW1fY2FsbGJhY2sgPSBwdHI7Cit9CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL0NoYW5nZUxvZyBiL3NpbS9jb21tb24vQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZTA3MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL0NoYW5nZUxvZwpAQCAtMCwwICsxLDQwMDUgQEAKKzE5OTktMDItMDkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogTWFrZS1jb21tb24uaW4gKENHRU5fUkVBRF9TQ00pOiBSZW5hbWVkIGZyb20gQ0dFTl9NQUlOX1NDTS4KKwkoQ0dFTl9ERVNDX1NDTSk6IE5ldyB2YXJpYWJsZS4KKwkoY2dlbi1kZXNjKTogTmV3IHJ1bGUuCisJKiBjZ2VuLWNwdS5oIChDR0VOX0RJU0FTU0VNQkxFUik6IE5ldyB0eXBlLgorCShDR0VOX0NQVSk6IE1lbWJlciBvcGNvZGUgcmVuYW1lZCB0byBjcHVfZGVzYy4KKwlOZXcgbWVtYmVycyBnZXRfaWRhdGEsZGlzYXNzZW1ibGVyLgorCSogY2dlbi1kZWZzLmggKENHRU5fSU5TTl9WSVJUVUFMX1ApOiBDR0VOX0lOU05fQVRUUiByZW5hbWVkIHRvCisJQ0dFTl9JTlNOX0FUVFJfVkFMVUUuCisJKENHRU5fU1RBVEUpOiBEZWxldGUgbWVtYmVyIG9wY29kZV90YWJsZS4KKwkoc2ltX2Rpc2Fzc2VtYmxlX2luc24pOiBEZWxldGUgZGVjbC4KKwkqIGNnZW4tZW5naW5lLmggKHN0cnVjdCBpbnNuX3NlbSk6IE1vdmVkIHRvIGhlcmUgZnJvbSA8Y3B1Pi1kZWNvZGUuYy4KKwkoc3RydWN0IGlkZXNjKTogTW92ZWQgdG8gaGVyZSBmcm9tIDxjcHU+LWRlY29kZS5oLgorCSogY2dlbi1ydW4uYyAocHJpbWVfY3B1KTogQ2FsbCBwcmVwYXJlX3J1biBjYWxsYmFjay4KKwkqIGNnZW4tdHJhY2UuaCAoU0ZJTEUpOiBOZXcgdHlwZS4KKwkoc2ltX2Rpc2FzbV9zcHJpbnRmKTogRGVjbGFyZS4KKwkoc2ltX2Rpc2FzbV9yZWFkX21lbW9yeSxzaW1fZGlzYXNtX3BlcnJvcl9tZW1vcnkpOiBEZWNsYXJlLgorCShzaW1fY2dlbl9kaXNhc3NlbWJsZV9pbnNuKTogRGVjbGFyZS4KKwkqIGNnZW4tdHJhY2UuYzogSW5jbHVkZSBlcnJuby5oLGRpcy1hc20uaC4gIERvbid0IGluY2x1ZGUgY3B1LW9wYy5oLgorCShpbnNuX2ZpZWxkcyk6IERlbGV0ZS4KKwkodHJhY2VfaW5zbl9maW5pKTogU1RBVEVfT1BDT0RFX1RBQkxFIChzZCkgcmVwbGFjZWQgd2l0aAorCUNQVV9DUFVfREVTQyAoY3B1KS4KKwkodHJhY2VfaW5zbik6IENhbGwgQ1BVX0RJU0FTU0VNQkxFUiBob29rLgorCShzaW1fZGlzYXNtX3NwcmludGYpOiBOZXcgZnVuY3Rpb24uCisJKHNpbV9kaXNhc21fcmVhZF9tZW1vcnkpOiBOZXcgZnVuY3Rpb24uCisJKHNpbV9kaXNhc21fcGVycm9yX21lbW9yeSk6IE5ldyBmdW5jdGlvbi4KKwkoc2ltX2NnZW5fZGlzYXNzZW1ibGVfaW5zbik6IE5ldyBmdW5jdGlvbi4KKwkqIGNnZW4tdXRpbHMuYzogRG9uJ3QgaW5jbHVkZSBjcHUtb3BjLmguCisJKHZpcnR1YWxfaW5zbl9lbnRyaWVzKTogTmV3IHN0YXRpYyBsb2NhbC4KKwkoY2dlbl92aXJ0dWFsX2luc25fdGFibGUpOiBSZW5hbWVkIGZyb20gY2dlbl92aXJ0dWFsX29wY29kZV90YWJsZS4KKwkoY2dlbl9pbnNuX25hbWUpOiBSZXdyaXRlLgorCShkaXNhc21fc3ByaW50ZixzaW1fZGlzYXNzZW1ibGVfaW5zbik6IE1vdmVkIHRvIGNnZW4tdHJhY2UuYy4KKwkqIGNnZW4uc2ggKGRlc2MpOiBOZXcgZmlsZSBnZW5lcmF0b3IgaGFuZGxlci4KKwkqIGdlbm1sb29wLnNoOiAtcGFyYWxsZWwgY2hhbmdlZCB0byAtcGFyYWxsZWwtcmVhZC8tcGFyYWxsZWwtd3JpdGUuCisJRGVmaW5lIFdJVEhfUEFSQUxMRUxfUkVBRC9XSVRIX1BBUkFMTEVMX1dSSVRFIGFwcHJvcHJpYXRlbHkuCisJRG9uJ3QgaW5jbHVkZSBjcHUtb3BjLmgsY3B1LXNpbS5oLgorCSogc2ltLW1vZGVsLmMgKG1vZGVsX3NldCk6IERlbGV0ZSBTSU1fREVTQyBhcmcuCisJKHNpbV9tb2RlbF9zZXQpOiBVcGRhdGUuCisJKiBzaW0tbW9kZWwuaCAoTUFDSCk6IE5ldyBtZW1iZXIgcHJlcGFyZV9ydW4uCisKKzE5OTktMDEtMjggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIHNpbS1tZW1vcHQuYyAobWVtb3J5X29wdGlvbl9oYW5kbGVyKTogQXZvaWQgbWVtc2V0KCkgY2FsbHMKKwlpZiByZWR1bmRhbnQgd2l0aCBhbGxvY2F0b3IgZnVuY3Rpb25zLgorCitXZWQgSmFuIDI3IDE3OjE5OjA5IDE5OTkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNnZW4tZW5naW5lLmggKEVYVFJBQ1RfTFNCMF97SU5ULFVJTlR9KTogRml4LgorCisJKiBzaW0tcHJvZmlsZS5oOiBNYWtlIGxpa2Ugc2ltLXRyYWNlLmguCisJKFBST0ZJTEVfVVNFRlVMX01BU0spOiBOZXcgbWFjcm8uCisJKiBzaW0tcHJvZmlsZS5jIChwcm9maWxlX29wdGlvbnMpOiBNYWtlIGxpa2UgdHJhY2Vfb3B0aW9ucywgYWxsb3cKKwlvcHRpb25hbCBvbnxvZmYgYXJnIHdoZXJlIGFwcGxpY2FibGUuCisJKHNldF9wcm9maWxlX29wdGlvbl9tYXNrKTogTmV3IGZ1bmN0aW9uLgorCShzaW1fcHJvZmlsZV9zZXRfb3B0aW9uKTogTmV3IGZ1bmN0aW9uLgorCShwcm9maWxlX29wdGlvbl9oYW5kbGVyKTogU2ltcGxpZnkuCisJSGF2ZSAtcCBvbmx5IGVuYWJsZSBzZWxlY3RlZCB0aGluZ3MsIG5vdCBldmVyeXRoaW5nLgorCUFkZCBtaXNzaW5nIGJyZWFrIHRvIE9QVElPTl9QUk9GSUxFX1BDX1JBTkdFLgorCSogY2dlbi1zY2FjaGUuYyAoc2NhY2hlX29wdGlvbnMpOiBBbGxvdyBvcHRpb25hbCBvbnxvZmYgYXJnIHRvCisJLS1wcm9maWxlLXNjYWNoZS4KKwkoc2NhY2hlX29wdGlvbl9oYW5kbGVyKTogVXNlIHNpbV9wcm9maWxlX3NldF9vcHRpb24uCisKKzE5OTktMDEtMjYgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIHNpbS1tZW1vcHQuYyAobWVtb3J5X29wdGlvbnMpOiBBZGQgTUVNT1JZX0ZJTEwgb3B0aW9uLgorCShtZW1vcnlfb3B0aW9uX2hhbmRsZXIpOiBJbXBsZW1lbnQgTUVNT1JZX0ZJTEwgb3B0aW9uLiAgTWFrZQorIAlNRU1PUllfQ0xFQVIgYW4gYWxpYXMgZm9yIE1FTU9SWV9GSUxMPTAuCisJKHBhcnNlX3Vsb25nX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgorCShkb19tZW1vcHRfYWRkKTogQWxsb2NhdGUgYWxsIGJ1ZmZlcnMuICBPcHRpb25hbGx5IGZpbGwgdGhlbS4KKworMTk5OS0wMS0xNSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KKworCSogaHctZXZlbnRzLmMgKGh3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlKTogX3Z0cmFjZWYgdGFrZXMgYQorCXZhX2xpc3QsIG5vdCBhbiBpbnRlZ2VyLgorCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3NjaGVkdWxlKTogTGlrZXdpc2UuCisKKwkqIHNpbS10eXBlcy5oIChVTlNJR05FRDMyLCBVTlNJR05FRDY0KTogUHJvcGVybHkgY2FzdCB0byAKKwl0aGUgYXBwcm9wcmlhdGUgdHlwZS4KKworMTk5OS0wMS0xNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBjZ2VuLWRlZnMuaCAoUENBRERSLENJQSk6IERlZmluZSBpbiB0ZXJtcyBvZiBJQUREUi4KKwkoc2ltX2Rpc2Fzc2VtYmxlX2luc24pOiBVcGRhdGUgcHJvdG90eXBlLgorCShzaW1fZW5naW5lX2ludmFsaWRfaW5zbik6IERpdHRvLgorCSogY2dlbi1lbmdpbmUuaCAoU0VNQU5USUNfRk4pOiBBZGQgIVdJVEhfU0NBQ0hFIHZlcnNpb24uCisJKFNFTV9CUkFOQ0hfSU5JVCk6IFBDQUREUi0+SUFERFIuCisJKFNFTV9OQlJBTkNIX0ZJTkkpOiBOZXcgbWFjcm8gZm9yICFXSVRIX1NDQUNIRSBjYXNlLgorCSogY2dlbi1zY2FjaGUuYyAoc2NhY2hlX2xvb2t1cCxzY2FjaGVfbG9va3VwX29yX2FsbG9jKTogUENBRERSLT5JQUREUi4KKwkqIGNnZW4tc2NhY2hlLmggKCopOiBEaXR0by4KKwkqIGNnZW4tdHJhY2UuYyAoKik6IERpdHRvLgorCSogY2dlbi10cmFjZS5oICgqKTogRGl0dG8uCisJKiBjZ2VuLXV0aWxzLmMgKCopOiBEaXR0by4KKwkqIGNnZW4tdHlwZXMuaCAoaW50ZWdlciBtb2Rlcyk6IFVzZSBzaWduZWROTi91bnNpZ25lZE5OIHR5cGVzLgorCShpbnNuX3QpOiBEZWxldGUuCisJKiBnZW5tbG9vcC5zaCAoQGNwdUBfZmlsbF9hcmdidWYpOiBBZGQgIVdJVEhfU0NBQ0hFIHN1cHBvcnQuCisJKHNpbXBsZSBlbmdpbmUgZnJhbWV3b3JrKTogUmV3cml0ZS4KKwkqIHNpbS1tb2R1bGUuYyAobW9kdWxlcyk6IEluc3RhbGwgbW9kZWwgbW9kdWxlIHNvb25lciAoYW5kIGluCisJcGFydGljdWxhciBiZWZvcmUgdGhlIHByb2ZpbGUgbW9kdWxlKS4KKworMTk5OS0wMS0xMiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBzaW0tbW9kZWwuaCAoc2ltX21hY2hfbG9va3VwX2JmZF9uYW1lKTogQWRkIHByb3RvdHlwZS4KKwkqIHNpbS1tb2RlbC5jIChzaW1fbWFjaF9sb29rdXBfYmZkX25hbWUpOiBOZXcgZnVuY3Rpb24uCisJKHNpbV9tb2RlbF9pbml0KTogQ2FsbCBpdC4KKworCSogY2dlbi10cmFjZS5jICh0cmFjZV9pbnNuKTogUGFzcyBwYyB0byB0cmFjZV9wcmVmaXggZm9yIHZpcnR1YWwgaW5zbnMuCisKKzE5OTktMDEtMDUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogTWFrZS1jb21tb24uaW4gKENHRU5fSU5DTFVERV9ERVBTKTogQWRkIGNnZW4tZGVmcy5oLCBjZ2VuLWVuZ2luZS5oLgorCShDR0VOX01BSU5fU0NNKTogQWRkIHJ0eC1mdW5jcy5zY20uCisJKGNnZW4tYXJjaCk6IFBhc3MgJChtYWNoKSB0byBjZ2VuLnNoLgorCSogY2dlbi1lbmdpbmUuaCAoU0VNX0JSQU5DSF9GSU5JKTogTmV3IGFyZyBwY3ZhciwgYWxsIHVzZXMgdXBkYXRlZC4KKwkoU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QpOiBOZXcgbWFjcm8uCisJKFNFTV9CUkFOQ0hfSU5JVCk6IEFkZCB0YWtlbl9wLgorCShUQVJHRVRfU0VNX0JSQU5DSF9GSU5JKTogUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb24uCisJKFNFTV9CUkFOQ0hfRklOSSk6IFVzZSBpdC4KKwkoU0VNX0lOU04pOiBVcGRhdGUuCisJKiBjZ2VuLXJ1bi5jIChzaW1fcmVzdW1lKTogSGFuZGxlIHRyYWNpbmcgb2YgbGFzdCBpbnNuLgorCSogY2dlbi1zY2FjaGUuaCAoV0lUSF9TQ0FDSEUpOiBEZWZpbmUgYXMgMCBpZiBub3QgZGVmaW5lZC4KKwkqIGNnZW4tdHJhY2UuYyAoY3VycmVudF9hYnVmKTogTmV3IHN0YXRpYyBnbG9iYWwuCisJKHRyYWNlX2luc25faW5pdCk6IEluaXRpYWxpemUgaXQuCisJKHRyYWNlX2luc25fZmluaSk6IFVzZSBpdC4KKwkodHJhY2VfaW5zbik6IFNldCBpdC4KKwkqIGNnZW4uc2ggKGFyY2ggY2FzZSk6IFBhc3MgLW0gJHttYWNofSB0byBjZ2VuLgorCSogZ2VubWxvb3Auc2ggKEBjcHVAX2VtaXRfYmVmb3JlKTogT25seSBkZWZpbmUgaWYgV0lUSF9TQ0FDSEVfUEJCLgorCShAY3B1QF9lbWl0X2FmdGVyKTogRGl0dG8uCisJKHNpbXBsZSBAY3B1QF9lbmdpbmVfcnVuX2Z1bGwpOiBOZXcgbG9jYWwgYHBjJy4gIEluaXRpYWxpemUgc2VtYW50aWMKKwlsYWJlbHMgaWYgV0lUSF9TRU1fU1dJVENIX0ZVTEwuCisJKiBzaW0tbW9kZWwuYzogSW5jbHVkZSBiZmQuaC4KKwkoc2ltX21vZGVsX2luaXQpOiBOZXcgZnVuY3Rpb24uCisJKHNpbV9tb2RlbF9pbnN0YWxsKTogUmVjb3JkIGluaXQgZm4uCisJKiBzaW0tbW9kZWwuaCAoTUFDSCk6IE5ldyBtZW1iZXIgYmZkX25hbWUuCisJKiBzaW0tbW9kdWxlLmMgKG1vZHVsZXMpOiBJbml0aWFsaXplIG1vZGVsIGJlZm9yZSBzY2FjaGUuCisKKzE5OTgtMTItMjQgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGR2LXNvY2tzZXIuYyAoREVGQVVMVF9USU1FT1VUKTogSW5jcmVhc2UgdG8gMSBtcy4KKwkKKwkqIG5ydW4uYyAobWFpbik6IFJlbWFpbiBpbiBzaW11bGF0aW9uIGxvb3AgZm9yIHRyYXBzIGFuZAorIAlleGNlcHRpb25zIHdoZW4gaW4gb3BlcmF0aW5nIGVudmlyb25tZW50IG1vZGUuCisJKHVpX2xvb3BfaG9vayk6IE5ldyBzdHViIGhvb2sgZm9yIHN0YW5kYWxvbmUgdXNlLgorCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3Byb2Nlc3MpOiBDYWxsIHVpX2xvb3BfaG9vaworCXBlcmlvZGljYWxseSBvbiBDWUdXSU4gaG9zdC4KKworCSogc2ltLXJlYXNvbi5jIChzaW1fc3RvcF9yZWFzb24pOiBSZXR1cm4gaG9zdCBzaWduYWwgbnVtYmVycworCXRvIGdkYiBvbiBzaW1fc3RvcHBlZCBhbmQgc2ltX3NpZ25hbGxlZCBjYXNlcy4KKwkqIHNpbS1lbmdpbmUuYyAoc2ltX2VuZ2luZV9oYWx0KTogQ2FsbCBTSU1fQ1BVX0VYQ0VQVElPTl9TVVNQRU5ECisgCWhvb2sganVzdCBiZWZvcmUgbG9uZ2ptcC4KKwkqIHNpbS1yZXN1bWUuYyAoc2ltX3Jlc3VtZSk6IENhbGwgU0lNX0NQVV9FWENFUFRJT05fUkVTVU1FCisgCWhvb2sganVzdCBiZWZvcmUgc2ltX2VuZ2luZV9ydW4uCisKKwkqIHNpbS1uLWNvcmUuaCAoc2ltX2NvcmVfdHJhY2VfTSk6IEFsbGF5IGNvbnN0IHdhcm5pbmcuCisJKiBzaW0tdHJhY2UuaCAodHJhY2VfZ2VuZXJpYyk6IERpdHRvLgorCSogc2ltLXRyYWNlLmMgKHRyYWNlX2dlbmVyaWMpOiBEaXR0by4KKwkKKzE5OTgtMTItMTQgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogTWFrZS1jb21tb24uaW4gKFNJTV9NQUlOX0RFUFMpOiBOZXcgdmFyLgorCShDR0VOX01BSU5fQ1BVX0RFUFMpOiBOZXcgdmFyLgorCSogYWNsb2NhbC5tNDogQWRkIC0tZW5hYmxlLWNnZW4tbWFpbnQgb3B0aW9uLgorCSogY2dlbi1tZW0uaCAoR0VUTUVNKik6IE5ldyBhcmcgYHBjJy4gIFBhc3MgdG8gc2ltX2NvcmUgcm91dGluZS4KKwkoU0VUTUVNKik6IERpdHRvLgorCShHRVRJTUVNKik6IFBhc3MgcGMgdmFsdWUgdG8gc2ltX2NvcmUgcm91dGluZS4KKworRnJpIERlYyAxMSAxNjo1ODozNiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGh3LWhhbmRsZXMuYyAoaHdfaGFuZGxlX2FkZF9paGFuZGxlLCBod19oYW5kbGVfYWRkX3BoYW5kbGUpOgorIAlDb21wYXJlIHdpdGggWkVSTyBub3QgTlVMTC4KKworVGh1IERlYyAxMCAxNDoxNDozOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGh3LXByb3BlcnRpZXMuYywgaHctaW5zdGFuY2VzLmMsIGh3LXRyZWUuYzogSW5jbHVkZQorIAkic2ltLWFzc2VydC5oIi4KKworMTk5OC0xMi0wOSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBzaW0tYXJhbmdlLmM6IEluY2x1ZGUgbGliaWJlcnR5LmgsIGFuZCBzdGRsaWIuaCBpZiBwcmVzZW50LgorCSogc2ltLXRyYWNlLmM6IEluY2x1ZGUgc3RkbGliLmggaWYgcHJlc2VudC4KKwkqIGR2LXNvY2tzZXIuYzogSW5jbHVkZSB1bmlzdGQuaCBpZiBwcmVzZW50LgorCShkdl9zb2Nrc2VyX2luaXQpOiBBZGQgbWlzc2luZyBhcmcgdG8gY2FsbCB0byBzaW1faW9fZXByaW50Zi4KKwkqIGNnZW4tc2NhY2hlLmMgKHNjYWNoZV9mbHVzaCk6IERlbGV0ZSB1bnVzZWQgbG9jYWxzIGksc2MuCisKKzE5OTgtMTItMDggIEphbWVzIEUgV2lsc29uICA8d2lsc29uQHdpbHNvbi1wYy5jeWdudXMuY29tPgorCisJKiBnZW5ubHR2YWxzLnNoOiBBZGQgaTk2MC4KKwkqIG5sdHZhbHMuZGVmOiBSZWJ1aWxkLgorCisxOTk4LTEyLTA0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGNnZW4tZGVmcy5oOiBOZXcgZmlsZSwgb2xkIGNnZW4tc2ltLmguCisJKiBjZ2VuLXNpbS5oOiBTaW1wbGUgaGVhZGVyIHRoYXQgaW5jbHVkZXMgb3RoZXJzLgorCSogc2ltLWFyYW5nZS5jOiBOZXcgZmlsZS4KKwkqIHNpbS1hcmFuZ2UuaDogTmV3IGZpbGUuCisJKiBzaW0tYmFzaWNzLmg6IEluY2x1ZGUgaXQuCisJKiBNYWtlLWNvbW1vbi5pbiAoU0lNX05FV19DT01NT05fT0JKUyk6IEFkZCBzaW0tYXJhbmdlLm8uCisJKHNpbS1hcmFuZ2Uubyk6IEFkZCBydWxlIGZvci4KKwkqIHNpbS1jcHUuaCAoc2ltX2NwdV9tc2dfcHJlZml4KTogQWRkIHByb3RvdHlwZS4KKwkoc2ltX2lvX2VwcmludGZfY3B1KTogQWRkIHByb3RvdHlwZS4KKwkqIHNpbS1pbmxpbmUuaCAoSEFWRV9JTkxJTkUpOiBEZWZpbmUgaWYgR05VQy4KKwkoSU5MSU5FMik6IE5ldyBtYWNyby4KKwkoRVhURVJOX0lOTElORSk6IE5ldyBtYWNyby4KKwkqIHNpbS1tb2R1bGUuYyAoc2ltX3Bvc3RfYXJndl9pbml0KTogSW5pdGlhbGl6ZSBjcHUgYmFja2xpbmsKKwliZWZvcmUgY2FsbGluZyBtb2R1bGUgaW5pdCBmbnMuCisJKiBzaW0tcHJvZmlsZS5jIChPUFRJT05fUFJPRklMRV8qKTogTW92ZSBpbnRvIGVudW0uCisJKHByb2ZpbGVfaW5pdCk6IE5ldyBmdW5jdGlvbi4KKwkocHJvZmlsZV9vcHRpb25zKTogTmV3IG9wdGlvbiAtLXByb2ZpbGUtcmFuZ2UuCisJKHByb2ZpbGVfb3B0aW9uX2hhbmRsZXIpOiBIYW5kbGUgLS1wcm9maWxlLXJhbmdlLgorCShwcm9maWxlX3ByaW50X2luc24pOiBRdWFsaWZ5IGFkZHJlc3MgcmFuZ2Ugc3BlY2lmaWMgc2VjdGlvbiB0aXRsZXMuCisJKHByb2ZpbGVfcHJpbnRfYWRkcl9yYW5nZXMpOiBOZXcgZnVuY3Rpb24uCisJKHByb2ZpbGVfaW5mbyk6IFByaW50IGFkZHJlc3MgcmFuZ2VzIGlmIHNwZWNpZmllZC4KKwkocHJvZmlsZV9pbnN0YWxsKTogU2V0IHByb2ZpbGVfaW5pdCBpbml0IGZuLgorCSogc2ltLXByb2ZpbGUuaCAoUFJPRklMRV9EQVRBKTogTmV3IG1lbWJlciBgcmFuZ2UnLgorCSogc2ltLXRyYWNlLmMgKHRyYWNlX2luaXQpOiBOZXcgZnVuY3Rpb24uCisJKHRyYWNlX29wdGlvbnMpOiBOZXcgb3B0aW9uIC0tdHJhY2UtcmFuZ2UuCisJKHRyYWNlX29wdGlvbl9oYW5kbGVyKTogSGFuZGxlIC0tdHJhY2UtcmFuZ2UuCisJKHRyYWNlX2luc3RhbGwpOiBTZXQgdHJhY2VfaW5pdCBpbml0IGZuLgorCSogc2ltLXRyYWNlLmggKFRSQUNFX0RBVEEpOiBOZXcgbWVtYmVyIGByYW5nZScuCisJKiBzaW0tdXRpbHMuYyAoc2ltX2NwdV9tc2dfcHJlZml4KTogTmV3IGZ1bmN0aW9uLgorCShzaW1faW9fZXByaW50Zl9jcHUpOiBOZXcgZnVuY3Rpb24uCisJKiBjZ2VuLWVuZ2luZS5oIChQQ19JTl9UUkFDRV9SQU5HRV9QKTogTmV3IG1hY3JvLgorCShQQ19JTl9QUk9GSUxFX1JBTkdFX1ApOiBOZXcgbWFjcm8uCisJKiBjZ2VuLXRyYWNlLmMgKHRyYWNlX2luc25faW5pdCk6IFNldCBjdXJyZW50X2luc24gdG8gTlVMTC4KKwkodHJhY2VfaW5zbl9maW5pKTogTmV3IGFyZyBhYnVmLiAgQWxsIGNhbGxlcnMgdXBkYXRlZC4KKwlFeGl0IGVhcmx5IGlmIHRyYWNlX2luc24gbm90IGNhbGxlZC4gIENoZWNrIEFSR0JVRl9QUk9GSUxFX1AgYmVmb3JlCisJcHJpbnRpbmcgY3ljbGUgY291bnRzLgorCSogY2dlbi10cmFjZS5oICh0cmFjZV9pbnNuX2ZpbmkpOiBVcGRhdGUgcHJvdG90eXBlLgorCShUUkFDRV9SRVNVTFRfUCk6IE5ldyBtYWNyby4KKwkoVFJBQ0VfSU5TTl9JTklULFRSQUNFX0lOU05fRklOSSk6IE5ldyBhcmcgYWJ1Zi4gIEFsbCBjYWxsZXJzIHVwZGF0ZWQuCisJKFRSQUNFX0lOU04pOiBDaGVjayBBUkdCVUZfVFJBQ0VfUC4KKwkoVFJBQ0VfRVhUUkFDVCxUUkFDRV9SRVNVTFQpOiBOZXcgYXJnIGFidWYuICBBbGwgY2FsbGVycyB1cGRhdGVkLgorCSogY2dlbi10eXBlcy5oIChTSU1fSU5MSU5FKTogRGVsZXRlLgorCShTSU1fSEFWRV9NT0RFTCxTSU1fSEFWRV9BRERSX1JBTkdFKTogRGVmaW5lLgorCSogY2dlbi11dGlscy5jOiBEb24ndCBpbmNsdWRlIGNnZW4tZW5naW5lLmgKKwkqIGdlbm1sb29wLnNoIChAY3B1QF9maWxsX2FyZ2J1Zik6IE5ldyBmdW5jdGlvbi4KKwkoQGNwdUBfZmlsbF9hcmdidWZfdHApOiBOZXcgZnVuY3Rpb24uCisJKEBjcHVAX2VtaXRfYmVmb3JlLEBjcHVAX2VtaXRfYWZ0ZXIpOiBOZXcgZnVuY3Rpb25zLgorCShAY3B1QF9wYmJfYmVnaW4pOiBQcmVmaXggY3RpX3NjLGluc25fY291bnQgd2l0aCAnXycuCisJKFNFVF9DVElfVlBDLFNFVF9JTlNOX0NPVU5UKTogVXBkYXRlLgorCShAY3B1QF9wYmJfYmVmb3JlKTogQ2hlY2sgQVJHQlVGX1BST0ZJTEVfUCBiZWZvcmUgY2FsbGluZworCWRvaW5nIHByb2ZpbGluZy4gIFVwZGF0ZSBjYWxsIHRvIFRSQUNFX0lOU05fSU5JVCxUUkFDRV9JTlNOX0ZJTkkuCisJKEBjcHVAX3BiYl9hZnRlcik6IENoZWNrIEFSR0JVRl9QUk9GSUxFX1AgYmVmb3JlIGNhbGxpbmcKKwlkb2luZyBwcm9maWxpbmcuIFVwZGF0ZSBjYWxsIHRvIFRSQUNFX0lOU05fRklOSS4KKworCSogc2ltLW1lbW9wdC5jIChzaW1fbWVtb3J5X3VuaW5zdGFsbCk6IFJlc3VsdCB0eXBlIGlzIGB2b2lkJy4KKworMTk5OC0xMi0wMyAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogc2ltLW1lbW9wdC5jIChzaW1fbWVtb3J5X3VuaW5zdGFsbCk6IERlYWxsb2NhdGUgYWxsIG1lbW9yeQorIAlyZWdpb25zLgorCisxOTk4LTEyLTAxICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIHNpbS1pbmxpbmUuYyAoU0lNX0lOTElORV9QKTogRml4IHR5cG8uCisKKzE5OTgtMTEtMzAgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogY2dlbi11dGlscy5jIChjZ2VuX3ZpcnR1YWxfb3Bjb2RlX3RhYmxlKTogVXBkYXRlLgorCitUdWUgTm92IDI0IDE4OjQwOjAzIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZ2Vubmx0dmFscy5zaDogQWRkIHY4NTAgYW5kIGQxMHYuIFNvcnQgYWxwaGFiZXRpY2FsbHkuCisJKiBubHR2YWxzLmRlZjogUmUtZ2VuZXJhdGUuCisKK01vbiBOb3YgMjMgMTM6Mjg6MzggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tY29yZS5jIChyZXZlcnNlX24sIHNpbV9jb3JlX3VuaW5zdGFsbCwgc2ltX2NvcmVfaW5pdCwKKyAJc2ltX2NvcmVfbWFwX2F0dGFjaCwgc2ltX2NvcmVfbWFwX2RldGFjaCwgbmV4dF9ldmVudF9xdWV1ZSwKKyAJbmV3X3NpbV9jb3JlX21hcHBpbmcpOiBPbmx5IGRlZmluZSB3aGVuIEVYVEVSTl9TSU1fQ09SRV9QLCBwYWNpZnkKKyAJR0NDLgorCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3VuaW5zdGFsbCwgc2ltX2V2ZW50c19zdXNwZW5kLAorIAlzaW1fZXZlbnRzX3Jlc3VtZSwgc2ltX2V2ZW50c196YWxsb2MsIGluc2VydF9zaW1fZXZlbnQpOiBEaXR0by4KKworMTk5OC0xMS0yMiAgRG91ZyBFdmFucyAgPGRldmFuc0B0b2Jvci50by5jeWdudXMuY29tPgorCisJKiBnZW5tbG9vcC5zaCAoJHtjcHV9X3BiYl9jaGFpbik6IFdhdGNoIGZvciBDdHJsLUMncy4KKwkoJHtjcHV9X3BiYl9jdGlfY2hhaW4pOiBEaXR0by4KKworMTk5OC0xMS0xOCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBNYWtlLWNvbW1vbi5pbiAoY2dlbi11dGlscy5vKTogRGVwZW5kIG9uIGNnZW4tZW5naW5lLmguCisJKENHRU5fQVJDSF9TQ00pOiBOZXcgdmFyaWFibGUuCisJKiBjZ2VuLWVuZ2luZS5oIChFWFRSQUNUX1tNTF1TQjBfe0lOVCxVSU5UfSk6IE5ldyBtYWNyb3MuCisJKEVYVFJBQ1RfSU5ULEVYVFJBQ1RfVUlOVCk6IE5ldyBtYWNyb3MuCisJKFNFTV9TRU1fQVJHKTogTmV3IG1hY3JvLgorCShTRU1fTkVYVF9WUEMpOiBOZXcgYXJnIGBwYycuCisJKiBjZ2VuLXNpbS5oIChFWFRSQUNUX1NJR05FRCxFWFRSQUNUX1VOU0lHTkVEKTogRGVsZXRlLgorCShzaW1fZGlzYXNzZW1ibGVfaW5zbik6IFVwZGF0ZSBwcm90b3R5cGUuCisJKiBjZ2VuLXRyYWNlLmMgKGN1cnJlbnRfaW5zbixpbnNuX2ZpZWxkcyk6IE5ldyBzdGF0aWMgbG9jYWxzLgorCSh0cmFjZV9pbnNuKTogU2V0IHRoZW0uCisJKiBjZ2VuLXV0aWxzLnNjbTogI2luY2x1ZGUgY2dlbi1lbmdpbmUuaC4KKwkoc2ltX2Rpc2Fzc2VtYmxlX2luc24pOiBOZXcgYXJnIGluc25fZmllbGRzLgorCUhhbmRsZSB2YXJpYWJsZSBsZW5ndGggaW5zbnMuCisJKiBnZW5tbG9vcC5zaDogT25seSBlbWl0IHBiYiBkZWNscyBpZiAtcGJiLgorCSgke2NwdX1fc2NhY2hlX2xvb2t1cCk6IE5ldyBhcmcgYHZwYycuCisJKHNjYWNoZSBzdXBwb3J0KTogRmV0Y2ggcGMgYmVmb3JlIGVudGVyaW5nIGxvb3AuCisKKwkqIGdlbm5sdHZhbHMuc2g6IEFkZCBmcjMwIHN1cHBvcnQuCisJKiBubHR2YWxzLmRlZjogUmVidWlsZC4KKworV2VkIE5vdiAxOCAxMDoyMjoyMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS10eXBlcy5oOiBSZS1kbyB0eXBlIHN5c3RlbSBzbyB0aGF0IEdDQydzIGF0dHJpYnV0ZSBhbmQgbW9kZQorIAlhcmUgdXNlZCB0byBzcGVjaWZ5IHR5cGVzLiAgSGFuZGxlIGNhc2Ugb2YgQUxQSEEuCisKKzE5OTgtMTEtMTMgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGVsYXN0aWMub3JnPgorCQorCSogYWNsb2NhbC5tNDogQWRkIHRlc3RzIGZvciBkbG9wZW4gZmFtaWx5LgorCSogY29uZmlnLmluOiBSZWdlbmVyYXRlZC4KKwkKK1dlZCBOb3YgMTEgMTQ6MDI6MjUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc2ltLWhsb2FkLmMgKHNpbV9sb2FkKTogUGFzcyBgcHJvZ19uYW1lJyB0byBzaW1fbG9hZF9maWxlLCBub3QgTlVMTC4KKworV2VkIE5vdiAgNCAyMzo1MToxOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogZ2VubWxvb3Auc2ggKGVuZy5oaW4pOiBSZW5hbWUgSEFWRV9QQVJBTExFTF9FWEVDIHRvCisJSEFWRV9QQVJBTExFTF9JTlNOUywgZGVmaW5lIGFzIDAgb3IgMS4gIEVtaXQgZGVjbHMgb2YgZm5zIGluIG1sb29wLmNpbi4KKwkqIGNnZW4tZW5naW5lLmg6IFR5cGVkZWZzIG9mIElBRERSLENJQSxTRU1fQVJHLFNFTV9QQyBtb3ZlZCAuLi4KKwkqIGNnZW4tc2ltLmg6IC4uLiB0byBoZXJlLgorCitXZWQgT2N0IDI4IDEyOjAwOjU3IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNCAoZW5hYmxlLWJ1aWxkLXdhcm5pbmdzKTogUmVwbGFjZQorIAllbmFibGUtc2ltLXdhcm5pbmdzLiBFeHRlbmQgPUxJU1Qgc3ludGF4IHNvIHRoYXQgcHJlcGVuZCBhbmQKKyAJYXBwZW5kIG9mIG9wdGlvbnMgaXMgcG9zc2libGUuICBEcm9wIC1XZXJyb3IsIGFkZAorIAktV3N0cmljdC1wcm90b3R5cGVzIGZvciBHREIgY29tcGF0aWJpbGl0eS4KKwkqIE1ha2UtY29tbW9uLmluIChTSU1fV0FSTklOR1MpOiBVcGRhdGUuCisKK01vbiBPY3QgMTkgMTM6NTY6MzIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIE1ha2UtY29tbW9uLmluIChDR0VOX0lOQ0xVREVfREVQUyk6IERlZmluZS4KKwkoc2ltLWNvcmUubyk6IERlbGV0ZSBkdXBsaWNhdGUgZGVwZW5kZW5jZSBvbiAkKFNJTV9FWFRSQV9ERVBTKS4KKwkoc2ltLWNwdS5vLHNpbS1lbmRpYW4ubyxzaW0taHcubyk6IERpdHRvLgorCShjZ2VuLXJ1bi5vLGNnZW4tc2NhY2hlLm8sY2dlbi10cmFjZS5vLGNnZW4tdXRpbHMubyk6IERlbGV0ZQorCWV4cGxpY2l0IGNnZW4gaGVhZGVyIGRlcGVuZGVuY2llcywgcmVxdWlyZSBTSU1fRVhUUkFfREVQUyB0byBpbmNsdWRlCisJQ0dFTl9JTkNMVURFX0RFUFMuCisJKiBjZ2VuLWNwdS5oOiBOZXcgZmlsZS4KKwkqIGNnZW4tZW5naW5lLmg6IE5ldyBmaWxlLgorCSogY2dlbi1zY2FjaGUuaDogTmV3IGZpbGUuCisJKiBjZ2VuLXNpbS5oOiBEZWxldGUgcG9ydGlvbnMgbW92ZWQgdG8gbmV3IGZpbGVzLgorCSogZ2VubWxvb3Auc2g6IEdlbmVyYXRlIHR3byBmaWxlcyBlbmcuaGluLG1sb29wLmNpbiBleHBsaWNpdGx5LAorCXJhdGhlciB0aGFuIHNlbmRpbmcgcmVzdWx0IHRvIHN0ZG91dC4KKworRnJpIE9jdCAgOSAxNDoyMDoyMiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogTWFrZS1jb21tb24uaW4gKHNpbS1yZWcubyk6IE5ldyBydWxlLgorCShjZ2VuLXJ1bi5vKTogTmV3IHJ1bGUuCisJKiBjZ2VuLW9wcy5oOiBEZWxldGUgbWFueSBCSSBtYWNyb3MuICBDaGFuZ2UgYWxsIFVCSSAtPiBCSS4KKwkqIGNnZW4tcnVuLmMgKHByaW1lX2NwdSk6IE5ldyBmdW5jdGlvbi4KKwkqIGNnZW4tc2NhY2hlLmM6IEFkZCBwc2V1ZG8tYmFzaWMtYmxvY2sgKHBiYikgc2NhY2hpbmcgc3VwcG9ydC4KKwkoc2NhY2hlX29wdGlvbl9oYW5kbGVyLCBjYXNlIE9QVElPTl9QUk9GSUxFX1NDQUNIRSk6IEhhbmRsZSBleHBsaWNpdGx5CisJbWVudGlvbmVkIGNwdS4KKwkoc2NhY2hlX2ZsdXNoX2NwdSxzY2FjaGVfbG9va3VwLHNjYWNoZV9sb29rdXBfb3JfYWxsb2MpOiBOZXcgZm5zLgorCSogY2dlbi1zaW0uaCAoQ0dFTl9JTlNOX1ZJUlRVQUxfVFlQRSk6IE5ldyBlbnVtLgorCShDR0VOX0lOU05fVklSVFVBTF9QKTogTmV3IG1hY3JvLgorCShTRU1fUEMpOiBOZXcgdHlwZWRlZi4KKwkoU0VNQU5USUNfRk4pOiBDaGFuZ2UgdHlwZSBvZiByZXN1bHQgdG8gU0VNX1BDLgorCShTRU1fU0VUX0ZVTExfQ09ERSxTRU1fU0VUX0ZBU1RfQ09ERSxTRU1fU0VUX0NPREUpOiBOZXcgbWFjcm9zLgorCShJREVTQ19DVElfUCxJREVTQ19TS0lQX1ApOiBOZXcgbWFjcm9zLgorCShTQ0FDSEVfTUFQKTogTmV3IHR5cGVkZWYuCisJKENQVV9TQ0FDSEUpOiBBZGQgcGJiIHN1cHBvcnQuCisJKHNjYWNlX2xvb2t1cCxzY2FjaGVfbG9va3VwX29yX2FsbG9jLHNjYWNoZV9mbHVzaF9jcHUpOiBEZWNsYXJlLgorCShTRU1fQlJBTkNIX0lOSVRfRVhUUkFDVCxTRU1fQlJBTkNIX0lOSVQsU0VNX0JSQU5DSF9GSU5JKTogTmV3IG1hY3Jvcy4KKwkoQ0dFTl9DUFUpOiBOZXcgbWVtYmVycyBydW5uaW5nX3AsaW5zbl9jb3VudCx7ZmFzdCxmdWxsfV9lbmdpbmVfZm4sCisJbWF4X3NsaWNlX2luc25zLgorCShJTlNOX05BTUUpOiBEZWxldGUuCisJKGNnZW5faW5zbl9uYW1lKTogRGVjbGFyZS4KKwkoc2ltX2VuZ2luZV9pbnZhbGlkX2luc24pOiBSZW5hbWVkIGZyb20gc2ltX2VuZ2luZV9pbGxlZ2FsX2luc24uCisJKiBjZ2VuLXRyYWNlLmMgKHRyYWNlX2J1Zik6IFNocmluayBmcm9tIDEwMjQgdG8gMjU2IGJ5dGVzLgorCShmaXJzdF9pbnNuX3ApOiBNYWtlIHN0YXRpYy4KKwkodHJhY2VfaW5zbik6IEhhbmRsZSB2aXJ0dWFsIGluc25zIHNwZWNpYWxseS4KKwkoY2dlbl90cmFjZV9wcmludGYpOiBFbnN1cmUgd2UgaGF2ZW4ndCBvdmVyZmxvd2VkIHRoZSBidWZmZXIuCisJKiBjZ2VuLXR5cGVzLmggKFVCSSk6IERlbGV0ZS4KKwkoTU9ERV9UWVBFKTogTmV3IGVudW0uCisJKEhPU1RJTlQsSE9TVFVJTlQsSE9TVFBUUik6IERlbGV0ZS4KKwkqIGNnZW4tdXRpbHMuYyAobW9kZV9uYW1lcyk6IERlbGV0ZSBVQkkuICBBZGQgSU5ULFVJTlQsUFRSLgorCShjZ2VuX3ZpcnR1YWxfb3Bjb2RlX3RhYmxlKTogTmV3IGdsb2JhbC4KKwkoY2dlbl9pbnNuX25hbWUpOiBOZXcgZnVuY3Rpb24uCisJKHNpbV9kaXNhc3NlbWJsZV9pbnNuKTogSWdub3JlIHZpcnR1YWwgaW5zbnMuCisJKiBnZW5tbG9vcC5zaDogRGVsZXRlIHRvcCBsZXZlbCBsb29wIGdlbmVyYXRpb24uICBBZGQgcGJiIHN1cHBvcnQuCisJKiBzaW0tY3B1LmggKENQVV9JTlNOX05BTUVfRk4pOiBOZXcgdHlwZWRlZi4KKwkoc2ltX2NwdV9iYXNlKTogTmV3IG1lbWJlcnMgbWF4X2luc25zLGluc25fbmFtZSxtb2RlbF9kYXRhLgorCShDUFVfUENfR0VULENQVV9QQ19TRVQpOiBOZXcgbWFjcm9zLgorCShzaW1fcGNfZ2V0LHNpbV9wY19zZXQpOiBEZWNsYXJlLgorCSogc2ltLW1vZGVsLmMgKG1vZGVsX3NldCk6IENhbGwgbW9kZWwgaW5pdCBmbi4KKwkqIHNpbS1tb2RlbC5oIChNT0RFTF9GTik6IE5ldyB0eXBlZGVmLgorCShJTlNOX1RJTUlORyk6IE5ldyBtZW1iZXIgbW9kZWxfZm4uCisJKE1PREVMKTogTmV3IG1lbWJlcnMgbnVtLGluaXQuCisJKiBzaW0tcHJvZmlsZS5jIChzaW1fcHJvZmlsZV9wcmludF9iYXIpOiBSZW5hbWVkIGZyb20gcHJpbnRfYmFyLgorCUFsbCBjYWxsZXJzIHVwZGF0ZWQuCisJKHByb2ZpbGVfaW5zbl9pbml0KTogTmV3IGZuLgorCShwcm9maWxlX3ByaW50X2luc24pOiBVcGRhdGUsIElOU05fTkFNRSAtPiBDUFVfSU5TTl9OQU1FLgorCUV4aXQgZWFybHkgaWYgaW5zbiBwcm9maWxpbmcgbm90IHN1cHBvcnRlZC4KKwkocHJvZmlsZV9wcmludF9tZW1vcnkpOiBVcGRhdGUsIE1BWF9NT0RFUyAtPiBNT0RFX1RBUkdFVF9NQVguCisJKHByb2ZpbGVfaW5zdGFsbCk6IFJlY29yZCBwcm9maWxlX2luc25faW5pdCBhcyBpbml0IGZuLgorCShwcm9maWxlX3VuaW5zdGFsbCk6IEZyZWUgUFJPRklMRV9JTlNOX0NPVU5UIGlmIG5vbi1udWxsLgorCSogc2ltLXByb2ZpbGUuaDogVXBkYXRlLCBNQVhfTU9ERVMgLT4gTU9ERV9UQVJHRVRfTUFYLgorCShQUk9GSUxFX0RBVEEpOiBEZWxldGUgbWVtYmVyIGV4ZWNfdGltZS4KKwlDaGFuZ2UgaW5zbl9jb3VudCB0byBwb2ludGVyIHRvIGFycmF5LCByYXRoZXIgdGhhbiB0aGUgYXJyYXkuCisJKHNpbV9wcm9maWxlX3ByaW50X2Jhcik6IERlY2xhcmUuCisKK1dlZCBPY3QgIDcgMTY6NTY6NDIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIGNnZW4tcnVuLmM6IE5ldyBmaWxlLgorCSogc2ltLXJlZy5jOiBOZXcgZmlsZS4KKworTW9uIFNlcCAxNCAxMDo1ODoxOSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00OiBBZGQgY2hlY2tzIGZvciAtbHNvY2tldCBhbmQgLWxuc2wuCisKKwkqIGR2LXNvY2tzZXIuYyAoZHZfc29ja3Nlcl9pbml0KTogVXNlIFNPX1JFVVNFQUREUiB0bworCWFsbG93IGxvY2FsIHBvcnQgcmV1c2Ugb24gbGlzdGVuaW5nIHNvY2tldC4KKworVHVlIFNlcCAgMSAxNTozNjo1MiAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBzaW0tY29uZmlnLmg6IFJlbW92ZSByZWZlcmVuY2UgdG8gbGludXgga2VybmVsIGhlYWRlci4KKworVHVlIEF1ZyAyNSAxMjo0NToyNyAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBkdi1zb2Nrc2VyLmMgKHNvY2tzZXJfYWRkcik6IE1ha2UgdmFyaWFibGUgbm9uLXN0YXRpYy4KKworTW9uIEF1ZyAyNCAxMTo0NzozNyAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgorCisJKiBzaW0taHcue2MsaH0gKHNpbV9od19wYXJzZSk6IFJldHVybiBzdHJ1Y3QgaHcgcG9pbnRlci4KKworVHVlIEF1ZyAxMSAxODoxMjoxOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzaW0tZXZlbnRzLmMgKHNpbV9ldmVudHNfZWxhcHNlZF90aW1lKTogRml4IGNhbGN1bGF0aW9uLgorCitUdWUgQXVnICA0IDIwOjM2OjQ2IDE5OTggIEplZmYgSG9sY29tYiAgPGplZmZoQGN5Z251cy5jb20+CisKKwkqIE1ha2UtY29tbW9uLmluIChpbnN0YWxsLWNvbW1vbik6IEFkZCAkKEVYRUVYVCkgd2hlbiBpbnN0YWxsaW5nCisJcnVuLgorCitNb24gQXVnICAzIDExOjQ2OjAxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBjZ2VuLXNpbS5oIChjZ2VuX3N0YXRlKTogTmV3IG1lbWJlciBvcGNvZGVfdGFibGUuCisJKiBjZ2VuLXV0aWxzLmMgKHNpbV9kaXNhc3NlbWJsZV9pbnNuKTogVXNlIGl0LgorCitGcmkgSnVsIDI0IDEwOjE0OjE4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNnZW4tbWVtLmggKERFQ0xBUkVfU0VUVCk6IEZpeCByZXR1cm4gdHlwZS4KKwkqIGNnZW4tc2ltLmggKHNpbV9lbmdpbmVfaWxsZWdhbF9pbnNuKTogRGVjbGFyZS4KKwkqIGNnZW4tc2NhY2hlLmM6IEluY2x1ZGUgc3RkbGliLmguCisJKiBjZ2VuLXRyYWNlLmMgKHRyYWNlX2V4dHJhY3QpOiBVc2UgJWx4IGZvciBQQ0FERFIuCisJKiBzaW0tbW9kZWwuYyAobW9kZWxfb3B0aW9uX2hhbmRsZXIpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGBuJy4KKworVHVlIEp1bCAyMSAxNjoyNzo0MyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogY2dlbi11dGlscy5jOiBJbmNsdWRlIGJmZC5oLgorCShzaW1fZGlzYXNzZW1ibGVfaW5zbik6IFVwZGF0ZSBjYWxsIHRvIENHRU5fRVhUUkFDVF9GTi4KKworV2VkIEp1bCAgOCAxODoyNDoxMCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNpbS1iaXRzLmggKEVYVEVORDI0KTogRml4IHR5cG8uCisKK1dlZCBKdWwgIDggMTc6NDE6NDcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tZXZlbnRzLmMgKEVUUkFDRV9QKTogTmV3IG1hY3JvLgorCShzdHJ1Y3QgX3NpbV9ldmVudCk6IEFkZCBtZW1iZXIgdHJhY2UuCisJKHNpbV9ldmVudHNfZnJlZSk6IFJlY2xhaW0gdHJhY2UgbWVzc2FnZS4KKworCSogc2ltLWV2ZW50cy5jLCBzaW0tZXZlbnRzLmggKHNpbV9ldmVudHNfc2NoZWR1bGVfdnRyYWNlZiwKKyAJc2ltX2V2ZW50c19zY2hlZHVsZV90cmFjZWYpOiBOZXcgZnVuY3Rpb25zLCBpbmNsdWRlIHByaW50ZiB0cmFjZQorIAlpbmZvcm1hdGlvbiBpbiBhcmd1bWVudCBsaXN0LiAgSWYgdHJhY2luZywgc3RvcmUgYXNwcmludGYnZCB0cmFjZQorIAltZXNzYWdlIGluIHNpbV9ldmVudC4KKworCSogaHctZXZlbnRzLmMsIGh3LWV2ZW50cy5oIChod19ldmVudF9xdWV1ZV9zY2hlZHVsZV90cmFjZWYsCisgCWh3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlX3Z0cmFjZWYpOiBOZXcgZnVuY3Rpb25zLCBtaW1pYworIAlzaW1fZXZlbnRfdHJhY2VmLgorCitNb24gSnVsICA2IDE1OjUxOjE0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltLWJpdHMuaCAoRVhURU5EMjQpOiBEZWZpbmUuCisKK1RodSBKdWwgIDIgMTc6MTM6MjUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIGNnZW4tc2ltLmggKENQVV9TQ0FDSEUpOiBNYWtlIHNpemUgdW5zaWduZWQuCisJKENQVV9TQ0FDSEVfSEFTSF9NQVNLKTogTmV3IG1hY3JvLgorCShTQ0FDSEVfSEFTSF9QQyk6IFJld3JpdGUuCisJKiBnZW5tbG9vcC5zaCAoZW5naW5lX3Jlc3VtZV97ZnVsbCxmYXN0fSk6IE1vdmUgc29tZSBvZiBoYXNoCisJY29tcHV0YXRpb24gb3V0IG9mIG1haW4gbG9vcC4KKworV2VkIEp1bCAgMSAxNjo0NDoxMiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogTWFrZS1jb21tb24uaW4gKFNDSEVNRSxTQ0hFTUVGTEFHUyk6IERlbGV0ZS4KKwkoQ0dFTkRJUixDR0VOKTogTmV3IHZhcmlhYmxlcy4KKwkoQ0dFTl9WRVJCT1NFKTogUmVuYW1lZCB0byBDR0VORkxBR1MuCisJKGNnZW4tYXJjaCxjZ2VuLWNwdSxjZ2VuLWRlY29kZSk6IFVwZGF0ZS4KKwkoQ0dFTl9DUFVfV1JJVEUpOiBOZXcgdmFyaWFibGUuCisJKENHRU5fQ1BVX1NFTVNXKTogLVcgLT4gLVguCisJKENHRU5fRkxBR1NfVE9fUEFTUyk6IERlbGV0ZSBTQ0hFTUUuICBBZGQgQ0dFTixDR0VORkxBR1MuCisJKiBjZ2VuLnNoOiBEZWxldGUgYXJncyBzY2hlbWUsc2NoZW1lZmxhZ3MuICBOZXcgYXJnIGNnZW4uCisKKwkqIGNnZW4tc2ltLmggKFJFQ09SRF9JQUREUik6IERlbGV0ZS4KKwkqIGNnZW4tdHlwZXMuaCAoSE9TVElOVCxIT1NUVUlOVCxIT1NUUFRSKTogTmV3IHR5cGVzLgorCSogZ2VubWxvb3Auc2ggKGVuZ2luZV9yZXN1bWVfe2Z1bGwsZmFzdH0pOiBEZWxldGUgaWNvdW50LgorCitXZWQgSnVuIDE3IDEyOjI1OjA4IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogZ2Vubmx0dmFscy5kZWYgKG1uMTAyMDApOiBBZGQgZW50cnkuCisJKiBubHR2YWxzLmRlZjogUmVnZW5lcmF0ZSB3aXRoIE1OMTAyMDAgYWRkaXRpb25zLgorCitXZWQgSnVuIDE3IDEzOjE4OjI4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWlubGluZS5oIChFWFRFUk5fKik6IFJlcGxhY2Ugd2l0aCBFWFRFUk5fKl9QLiBDb3JyZWN0CisgCWRvY3VtZW50YXRpb24gb24gaG93IGl0IHdvcmtzLgorCisJKiBzaW0tY29yZS5oLCBzaW0tY29yZS5jIChzaW1fY29yZV9pbnN0YWxsLCBzaW1fY29yZV9hdHRhY2gsCisgCXNpbV9jb3JlX2RldGFjaCwgc2ltX2NvcmVfcmVhZF9idWZmZXIsIHNpbV9jb3JlX3dyaXRlX2J1ZmZlciwKKyAJc2ltX2NvcmVfc2V0X3hvciwgc2ltX2NvcmVfeG9yX3JlYWRfYnVmZmVyLAorIAlzaW1fY29yZV94b3Jfd3JpdGVfYnVmZmVyKTogVXBkYXRlLgorCisJKiBzaW0tZXZlbnRzLmgsIHNpbS1ldmVudHMuYyAoc2ltX2V2ZW50c19pbnN0YWxsLAorIAlzaW1fZXZlbnRzX3dhdGNoX2Nsb2NrLCBzaW1fZXZlbnRzX3NjaGVkdWxlX2FmdGVyX3NpZ25hbCwKKyAJc2ltX2V2ZW50c19zY2hlZHVsZSwgc2ltX2V2ZW50c193YXRjaF9zaW0sIHNpbV9ldmVudHNfd2F0Y2hfY29yZSwKKyAJc2ltX2V2ZW50c19kZXNjaGVkdWxlKTogVXBkYXRlLgorCisJKiBzaW0tZnB1LmgsIHNpbS1mcHUuYyAoc2ltX2ZwdV96ZXJvLCBzaW1fZnB1X29uZSwgc2ltX2ZwdV90d28sCisgCXNpbV9mcHVfbWF4MzIsIHNpbV9mcHVfbWF4NjQpOiBVcGRhdGUuCisKK1NhdCBKdW4gMTMgMDc6NDU6MzggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BmYWxsaXMuY3lnbnVzLmNvbT4KKworCSogY2dlbi10cmFjZS5jICh0cmFjZV9pbnNuX2ZpbmkpOiBSZWRvIGN5Y2xlIGhhbmRsaW5nLgorCSogc2ltLXByb2ZpbGUuaCAoUFJPRklMRV9EQVRBKTogUmVuYW1lIGN5Y2xlIGhhbmRsaW5nIG1lbWJlcnMuCisJKiBzaW0tcHJvZmlsZS5jIChwcm9maWxlX3ByaW50X21vZGVsKTogVXBkYXRlLgorCitGcmkgSnVuIDEyIDE4OjM1OjA3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBnZW5ubHR2YWxzLmRlZiAobTMycik6IFVzZSBjb21tb24gc3lzY2FsbC5oIG5vdy4KKwkobW4xMDMwMCk6IEFkZCBlbnRyeS4KKwkqIG5sdHZhbHMuZGVmOiBSZWdlbmVyYXRlLgorCisJKiBzaW0tZW5naW5lLmMgKHNpbV9lbmdpbmVfZ2V0X3J1bl9zdGF0ZSk6IE5ldyBmdW5jdGlvbi4KKwkqIHNpbS1lbmdpbmUuaCAoc2ltX2VuZ2luZV9nZXRfcnVuX3N0YXRlKTogRGVjbGFyZSBpdC4KKworVGh1IEp1biAxMSAwMDo1MDowMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogc2ltLWNvcmUuaCAoU0lNX0NPUkVfU0lHTkFMX0ZOKTogTmV3IHR5cGVkZWYuCisJKiBzaW0tY29yZS5jIChzaW1fY29yZV9zaWduYWwpOiBNYWtlIGV4dGVybiwgYWx3YXlzIGRlZmluZS4KKworV2VkIEp1biAxMCAxNjowMjoyOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogTWFrZS1jb21tb24uaW4gKENHRU5fRkxBR1NfVE9fUEFTUyk6IE5ldyB2YXJpYWJsZS4KKwkqIGNnZW4tb3BzLmggKEFORElGKTogTmV3IG1hY3JvLgorCShBTkRJRltCUUhTRF1JKTogRGVsZXRlLgorCitUaHUgSnVuICA0IDEzOjUzOjU0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaHctZXZlbnRzLmMgKGNyZWF0ZV9od19ldmVudCwgZGVsZXRlX2h3X2V2ZW50KTogRGVsZXRlLgorCShod19ldmVudF9xdWV1ZV9zY2hlZHVsZSwgaHdfZXZlbnRfcXVldWVfZGVzY2hlZHVsZSwKKyAJYm91bmNlX2h3X2V2ZW50KTogRml4IGh3LWV2ZW50IG1lbW9yeSBjb3JydXB0aW9ucyBmb3VuZCBieSBKb3ljZQorIAlKYW5jenluLgorCisJKiBody1hbGxvYy5oIChIV19OWkFMTE9DKTogRGVmaW5lLgorCisJKiBNYWtlLWNvbW1vbi5pbiAodGVzdC1ody1ldmVudHMpOiBBZGQgdGFyZ2V0IGZvciB0ZXN0aW5nIHRoZQorIAlody1ldmVudCBjb2RlLgorCitNb24gTWF5IDI1IDIxOjExOjI2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogTWFrZS1jb21tb24uaW4gKFNJTV9DT01NT05fSFdfT0JKUyk6IEFkZCBody1oYW5kbGVzLm8gYW5kCisgCWh3LWluc3RhbmNlcy5vLgorCWh3LWhhbmRsZXMuYywgaHctaW5zdGFuY2VzLmMsIGh3LWhhbmRsZXMuaCwgaHctaW5zdGFuY2VzLmg6IE5ldworIAlmaWxlcy4KKwkqIGh3LW1haW4uaDogSW5jbHVkZSBody1oYW5kbGVzLmgsIGh3LWluc3RhbmNlcy5oLgorCSogaHctYmFzZS5oICh7Y3JlYXRlLGRlbGV0ZX1faHdfe2hhbmRsZXMsaW5zdGFuY2VzfV9kYXRhKTogRGVjbGFyZQorCSogaHctYmFzZS5jIChod19jcmVhdGUsIGh3X2RlbGV0ZSk6IENhbGwgc2FtZS4KKwkKK01vbiBNYXkgMjUgMTg6NTU6MzUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBkdi1jb3JlLmM6IEluY2x1ZGUgaHctbWFpbi5oIGFuZCBzaW0tbWFpbi5oLgorCSogZHYtcGFsLmM6IEluY2x1ZGUgaHctbWFpbi5oIGFuZCBzaW0taW8uaC4KKwkqIGR2LWdsdWUuYzogSW5jbHVkZSBody1tYWluLmguCisKKwkqIGh3LW1haW4uaDogTmV3IGZpbGUuICBNb3ZlIGxpc3Qgb2YgaW5jbHVkZXMgdG8gaGVyZS4KKwkqIGh3LWJhc2UuaDogRnJvbSBoZXJlLgorCSogTWFrZS1jb21tb24uaW4gKGh3X2Jhc2VfaGVhZGVycyk6IFJlbmFtZSB0byBod19tYWluX2hlYWRlcnMuCisJKGh3LSoubywgZHYtKi5vKTogVXBkYXRlLgorCSogaHctdHJlZS5jLCBody1iYXNlLmMsIGh3LXByb3BlcnRpZXMuYywgaHctcG9ydHMuYywgaHctZGV2aWNlLmMsCisgCWh3LWV2ZW50cy5jLCBody1hbGxvYy5jLCBzaW0taHcuYzogSW5jbHVkZSBody1tYWluLmggaW5zdGVhZCBvZgorIAlzaW0tbWFpbi5oLgorCisJKiBody1iYXNlLmggKGRvX2h3X2F0dGFjaF9yZWdzLCBkb19od19wb2xsX3JlYWRfbWV0aG9kLAorIAlkb19od19wb2xsX3JlYWQpOiBNb3ZlIGRlY2xhcmF0aW9ucyBmcm9tIGhlcmUuCisJKiBody1tYWluLmg6IFRvIGhlcmUuCisJCisJKiBody1iYXNlLmggKHN0cnVjdCBod19kZXZpY2VfZGVzY3JpcHRvciwgaHdfZmluaXNoX2NhbGxiYWNrKToKKyAJTW92ZSBmcm9tIGhlcmUuCisJKiBody1tYWluLmggKHN0cnVjdCBod19kZXNjcmlwdG9yLCBod19maW5pc2hfbWV0aG9kKTogVG8gaGVyZSwKKyAJcmVuYW1lLgorCSogTWFrZS1jb21tb24uaW4gKGh3LWNvbmZpZy5oKTogVXBkYXRlCisJKiBody1iYXNlLmMsIGR2LXBhbC5jLCBkdi1nbHVlLmM6IFVwZGF0ZQorCisJKiBkdi1nbHVlLmMsIGh3LWRldmljZS5oLCBody1iYXNlLmgsIGh3LXBvcnRzLmM6IFJlbmFtZQorIAlgKl9jYWxsYmFjaycgdG8gYCpfbWV0aG9kLgorCitNb24gTWF5IDI1IDE4OjQxOjE4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaHctYmFzZS5oIChzZXRfKik6IE1vdmUgc2V0IG1ldGhvZCBtYWNyb3MgZnJvbSBoZXJlLgorCSogaHctZGV2aWNlLmg6IFRvIGhlcmUuCisKK01vbiBNYXkgMjUgMTg6MjE6MzggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBody1iYXNlLmggKGNyZWF0ZV9od19wcm9wZXJ0eV9kYXRhLCBkZWxldGVfaHdfcHJvcGVydHlfZGF0YSk6CisgCURlY2xhcmUuCisKKwkqIGh3LWJhc2UuYyAoaHdfY3JlYXRlLCBod19kZWxldGUpOiBDYWxsCisJKiBody1wcm9wZXJ0aWVzLmMgKGNyZWF0ZV9od19wcm9wZXJ0eV9kYXRhLAorIAlkZWxldGVfaHdfcHJvcGVydHlfZGF0YSk6IERlZmluZS4KKwkKK01vbiBNYXkgMjUgMTc6NDA6NDYgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBody1kZXZpY2UuYywgaHctcHJvcGVydGllcy5jOiBJbmNsdWRlIGh3LWJhc2UuaAorCisJKiBody1hbGxvYy5oLCBody1hbGxvYy5jOiBOZXcgZmlsZXMuIE1vdmUgYWxsb2MgY29kZSB0byBoZXJlLgorCSogaHctZGV2aWNlLmM6IEZyb20gaGVyZS4KKwkqIGh3LWJhc2UuaDogSW5jbHVkZSAiaHctZXZlbnRzLmgiLgorCisJKiBody1iYXNlLmggKGNyZWF0ZV9od19hbGxvY19kYXRhLCBkZWxldGVfaHdfYWxsb2NfZGF0YSk6IERlY2xhcmUuCisJKiBody1iYXNlLmMgKGh3X2NyZWF0ZSwgaHdfZGVsZXRlKTogQ2FsbC4KKwkqIGh3LWFsbG9jLmMgKGNyZWF0ZV9od19hbGxvY19kYXRhLCBkZWxldGVfaHdfYWxsb2NfZGF0YSk6IERlZmluZS4KKworCSogTWFrZS1jb21tb24uaW4gKFNJTV9ORVdfQ09NTU9OX09CSlMpOiBBZGQgaHctYWxsb2Muby4KKwkoaHctYWxsb2Mubyk6IE5ldyB0YXJnZXQuCisJCitNb24gTWF5IDI1IDE3OjE0OjI3IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaHctZXZlbnRzLmgsIGh3LWV2ZW50cy5jOiBOZXcgZmlsZXMuICBNb3ZlIGV2ZW50IGNvZGUgdG8gaGVyZS4KKyAgCSogc2ltLWh3LmM6IEZyb20gaGVyZS4KKwkqIGh3LWJhc2UuaDogSW5jbHVkZSAiaHctZXZlbnRzLmgiLgorCSogTWFrZS1jb21tb24uaW4gKFNJTV9ORVdfQ09NTU9OX09CSlMpOiBBZGQgaHctZXZlbnRzLm8uCisJKGh3LWV2ZW50cy5vKTogTmV3IHRhcmdldC4KKworCSogaHctZGV2aWNlLmggKHN0cnVjdCBodyk6IEFkZCBzdHJ1Y3QgaHdfZXZlbnRfZGF0YSBldmVudHNfb2ZfaHcuCisJKiBody1ldmVudHMuaCAoc3RydWN0IGh3X2V2ZW50KTogUmVwbGFjZSB0eXBlZGVmIGh3X2V2ZW50LgorCQorCSogaHctYmFzZS5oIChjcmVhdGVfaHdfZXZlbnRfZGF0YSwgZGVsZXRlX2h3X2V2ZW50X2RhdGEpOiBEZWNsYXJlLgorCSogaHctYmFzZS5jIChod19jcmVhdGUsIGh3X2RlbGV0ZSk6IENhbGwuCisJKiBody1ldmVudHMuYyAoY3JlYXRlX2h3X2V2ZW50X2RhdGEsIGRlbGV0ZV9od19ldmVudF9kYXRhKTogRGVmaW5lLgorCisJKiBkdi1wYWwuYzogVXBkYXRlLgorCitNb24gTWF5IDI1IDE2OjU1OjE2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaHctYmFzZS5jIChwYW5pY19od19wb3J0X2V2ZW50LCBlbXB0eV9od19wb3J0cyk6IE1vdmUgZnJvbSBoZXJlLgorICAJKiBody1wb3J0cy5jOiBUbyBoZXJlLgorCQorCSogaHctYmFzZS5oLCBody1wb3J0cy5jIChjcmVhdGVfaHdfcG9ydF9kYXRhLAorIAlkZWxldGVfaHdfcG9ydF9kYXRhKTogTmV3IGZ1bmN0aW9ucy4KKwkqIGh3LWJhc2UuYyAoaHdfZGVsZXRlLCBod19jcmVhdGUpOiBDYWxsIHNhbWUuCisJCisJKiBody1iYXNlLmggKHNldF9od19wb3J0cywgc2V0X2h3X3BvcnRfZXZlbnQpOiBNb3ZlIHNldCBmdW5jdGlvbnMKKyAJZnJvbSBoZXJlLgorICAJKiBody1wb3J0cy5oOiBUbyBoZXJlLgorCitNb24gTWF5IDI1IDE2OjQyOjQ4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaHctZGV2aWNlLmMgKGh3X2lvY3RsKSwgaHctZGV2aWNlLmggKGh3X2lvY3RsX2NhbGxiYWNrKTogRHJvcAorIAlQUk9DRVNTT1IgYW5kIENJQSBhcmd1bWVudHMuCisKK0ZyaSBNYXkgMjIgMTI6MTY6MjcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00IChTSU1fQUNfT1BUSU9OX0hXKTogQWRkIGVuYWJsZSAvIGRpc2FibGUgYXJndW1lbnQuCisgIAlNb3ZlIGNvbW1vbiBvYmplY3QgZmlsZXMgZnJvbSBoZXJlLgorCSogTWFrZS1jb21tb24uaW4gKFNJTV9DT01NT05fSFdfT0JKUyk6IFRvIGhlcmUuCisJCitUaHUgTWF5IDIxIDE3OjU3OjE2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWh3LmM6IEluY2x1ZGUgY3R5cGUuaC4KKwkoZG9faHdfcG9sbF9yZWFkKTogRG8gbm90IGFzc3VtZSBFQUdBSU4uCisKK1dlZCBNYXkgMjAgMDQ6Mzc6NTcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIGNnZW4tdHJhY2UuYyAoZmlyc3RfaW5zbl9wKTogTmV3IHN0YXRpYyBsb2NhbC4KKwkodHJhY2VfaW5zbl9pbml0KTogU2V0IGl0LgorCSh0cmFjZV9pbnNuX2ZpbmkpOiBVc2UgVFJBQ0VfUFJFRklYLgorCSh0cmFjZV9pbnNuKTogUmV3cml0ZSB0byB1c2UgdHJhY2VfcHJlZml4LgorCSogc2ltLXRyYWNlLmMgKHRyYWNlX3ByZWZpeCk6IERvbid0IHByaW50IGZpbGVuYW1lIGFyZyBpZiBOVUxMLgorCUFkanVzdCB3aWR0aCBhY2NvcmRpbmdseS4KKworCSogc2ltLXByb2ZpbGUuaCAoUFJPRklMRV9EQVRBKTogTmV3IG1lbWJlciBwcm9maWxlX2FueV9wLgorCShQUk9GSUxFX0FOWV9QLFBST0ZJTEVfSU5TTl9QLFBST0ZJTEVfTUVNT1JZKTogTmV3IG1hY3Jvcy4KKwkoUFJPRklMRV9TQ0FDSEVfUCxQUk9GSUxFX1BDX1AsUFJPRklMRV9DT1JFX1ApOiBOZXcgbWFjcm9zLgorCShQUk9GSUxFX0NPVU5UX0lOU04sUFJPRklMRV9DT1VOVF9SRUFELFBST0ZJTEVfQ09VTlRfV1JJVEUpOiBTaW1wbGlmeS4KKwkoUFJPRklMRV9DT1VOVF9DT1JFKTogU2ltcGxpZnkuCisJKiBzaW0tcHJvZmlsZS5jIChwcm9maWxlX29wdGlvbl9oYW5kbGVyKTogQ29tcHV0ZSBwcm9maWxlX2FueV9wLgorCitUdWUgTWF5IDE5IDIzOjU1OjMwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBjZ2VuLW9wcy5oIChBRERDRlNJKTogRml4IHR5cG8uCisKK1NhdCBNYXkgMTYgMTI6NDQ6NTIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIGNnZW4tc2ltLmggKENHRU5fQ1BVKTogTmV3IG1lbWJlcnMgaWRlc2Nfe3JlYWQsc2VtfV9pbml0X3AuCisJKiBnZW5tbG9vcC5zaDogVXNlIHRoZW0gcmF0aGVyIHRoYW4gc3RhdGljIGxvY2Fscy4KKworCSogc2ltLWVuZ2luZS5jIChzaW1fZW5naW5lX3NldF9ydW5fc3RhdGUpOiBOZXcgZnVuY3Rpb24uCisJKiBzaW0tZW5naW5lLmggKHNpbV9lbmdpbmVfc2V0X3J1bl9zdGF0ZSk6IERlY2xhcmUuCisJKiBnZW5tbG9vcC5zaCAocGVuZGluZ19yZWFzb24scGVuZGluZ19zaWdyYyk6IE5ldyBzdGF0aWMgbG9jYWxzLgorCShAY3B1QF9lbmdpbmVfc3RvcCk6IE5ldyBhcmdzIHJlYXNvbixzaWdyYy4gIEFsbCBjYWxsZXJzIHVwZGF0ZWQuCisJKGVuZ2luZV9yZXN1bWUpOiBSZW9yZ2FuaXplLiAgQWxsb3cgc3luY2hyb25vdXMgZXhpdCBmcm9tIG1haW4gbG9vcC4KKworRnJpIE1heSAxNSAxNjowNjowNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogY2dlbi10cmFjZS5jICh0cmFjZV9pbnNuX2luaXQpOiBOZXcgYXJnIGZpcnN0X3AuIAorCUFsbCBjYWxsZXJzIHVwZGF0ZWQuCisJKHRyYWNlX2luc25fZmluaSk6IE5ldyBhcmcgbGFzdF9wLiAgQWxsIGNhbGxlcnMgdXBkYXRlZC4KKwkqIGNnZW4tdHJhY2UuaCAodHJhY2VfaW5zbl9pbml0LHRyYWNlX2luc25fZmluaSk6IFVwZGF0ZS4KKwkoVFJBQ0VfSU5TTl9JTklULFRSQUNFX0lOU05fRklOSSk6IFVwZGF0ZS4KKwkqIGdlbm1sb29wLnNoIChlbmdpbmVfcmVzdW1lKTogVXBkYXRlLgorCitGcmkgTWF5IDE1IDE1OjU5OjAwIDE5OTggIEpveWNlIEphbmN6eW4gIDxqYW5jenluQGN5Z251cy5jb20+CisKKwkqIE1ha2UtY29tbW9uLmluIChpbnN0YWxsLWNvbW1vbik6IFJ1biByYW5saWIgb24gaW5zdGFsbGVkIGNvcHkgb2YKKwlsaWJzaW0uYS4KKworRnJpIE1heSAxNSAxNTowMzowMCAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgorCisJKiBNYWtlLWNvbW1vbi5pbiAoaW5zdGFsbC1jb21tb24pOiBSZW5hbWUgYW5kIGluc3RhbGwgbGlic2ltLmEuCisKK1R1ZSBNYXkgMTIgMTU6MjM6NTcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0taW8uYyAodW5pc3RkLmgpOiBJbmNsdWRlLgorCitXZWQgTWF5ICA2IDE2OjA0OjE4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBNYWtlLWNvbW1vbiAoc2ltX21haW5faGVhZGVycyk6IFNvcnQuCisJKGNnZW4tKi5vKTogQWRkIGNnZW4tc2ltLmggZGVwZW5kZW5jeS4KKworCSogY2dlbi1zY2FjaGUuYyAoc2NhY2hlX2luaXQpOiBPbmx5IGFsbG9jYXRlIHNwYWNlIGlmIHNjYWNoZSBlbGVtZW50CisJc2l6ZSBpcyBub24temVyby4KKwkoc2NhY2hlX2ZsdXNoLHNjYWNoZV9wcmludF9wcm9maWxlKTogQ2hlY2sgaWYgc2NhY2hlIGluIHVzZSBmaXJzdC4KKworCSogY2dlbi1zaW0uaCAoSURFU0MpOiBQcm92aWRlIGZvcndhcmQgZGVjbGFyYXRpb24uCisJKERFQ09ERSk6IERlbGV0ZS4KKwkoQ0dFTl9DUFUpOiBBbHdheXMgZGVmaW5lIHNjYWNoZSBtZW1iZXIuICBOZXcgbWVtYmVycyBpZGVzYyxvcGNvZGUuCisJKGNnZW5fY3B1X21heF9leHRyYV9ieXRlcyk6IERlY2xhcmUuCisJKiBjZ2VuLXV0aWxzLmMgKGNnZW5fY3B1X21heF9leHRyYV9ieXRlcyk6IE5ldyBmdW5jdGlvbi4KKworCSogY2dlbi5zaDogcy9AYXJjaEAvJHthcmNofS8gZm9yIGNwdSBmaWxlcy4KKworCSogc2ltLWNwdS5oOiBOZXcgZmlsZS4gIHNpbV9jcHVfYmFzZSBtb3ZlZCBoZXJlLgorCU1vdmUgc2ltX2NwdV9sb29rdXAgZGVjbCBoZXJlLgorCSogc2ltLWJhc2UuaDogI2luY2x1ZGUgInNpbS1jcHUuaCIuCisJKiBzaW0tY3B1LmM6IE5ldyBmaWxlLgorCSogTWFrZS1jb21tb24gKHNpbV9tYWluX2hlYWRlcnMpOiBBZGQgc2ltLWNwdS5oLgorCShzaW0tY3B1Lm8pOiBBZGQgcnVsZSBmb3IuCisKKwkqIHNpbS1tb2RlbC5jIChzZXRfbW9kZWwpOiBEZWxldGUuCisJKHNpbV9tb2RlbF9zZXQsbW9kZWxfc2V0KTogTmV3IGZ1bmN0aW9ucy4KKwkoc2ltX21vZGVsX2luc3RhbGwpOiBSZW5hbWVkIGZyb20gbW9kZWxfaW5zdGFsbC4KKwlEb24ndCBzZXQgZGVmYXVsdCBtb2RlbCBoZXJlLgorCShtb2RlbF9vcHRpb25faGFuZGxlcik6IFJld3JpdGUgLS1tb2RlbCBwcm9jZXNzaW5nLgorCShzaW1fbW9kZWxfbG9va3VwLHNpbV9tYWNoX2xvb2t1cCk6IE5ldyBmdW5jdGlvbnMuCisJKiBzaW0tbW9kZWwuaCAoTUFYX01PREVMUyxNQVhfSU5TTlMpOiBEZWxldGUuCisJKGluc25fdGltaW5nKTogRGVsZXRlLgorCShJTlNOX1RJTUlORyk6IE5ldyBtZW1iZXIgYG51bScuCisJKElNUF9QUk9QRVJUSUVTKTogQWx3YXlzIGRlZmluZSBzY2FjaGVfZWxtX3NpemUgbWVtYmVyLgorCShNQUNIKTogTmV3IG1lbWJlciBpbml0X2NwdS4KKwkoc2ltX21hY2hzKTogUmVuYW1lZCBmcm9tIG1hY2hzLgorCShzaW1fbW9kZWxfaW5zdGFsbCk6IFJlbmFtZWQgZnJvbSBtb2RlbF9pbnN0YWxsLgorCShzaW1fbW9kZWxfc2V0LHNpbV9tb2RlbF9sb29rdXAsc2ltX21hY2hfbG9va3VwKTogRGVjbGFyZS4KKwkqIHNpbS1tb2R1bGUuYyAobW9kdWxlcyk6IFVwZGF0ZS4KKworCSogc2ltLXByb2ZpbGUuYyAocHJvZmlsZV9wcmludF9pbnNuKTogQWRkIGNwdSBhcmcgdG8gSU5TTl9OQU1FIG1hY3JvLgorCisJKiBzaW0taW8uYzogI2luY2x1ZGUgPGVycm5vLmg+LgorCitXZWQgTWF5ICA2IDEyOjM5OjE1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZHYtcGFsLmMgKHN0cnVjdCBod19wYWxfZGV2aWNlKTogQWRkIHJlYWRlci4KKyAJKGh3X3BhbF9maW5pc2gpOiBJbml0aWFsaXplIHJlYWRlci4KKwkoc2Nhbl9od19wYWwpOiBVc2UgcmVhZGVyLgorCisJKiBody1iYXNlLmgsIHNpbS1ody5jIChkb19od19wb2xsX3JlYWQpOiBOZXcgZnVuY3Rpb24uCisJKEhXX0lPX0VPRiwgSFdfSU9fTk9UX1JFQURZKTogRGVmaW5lLgorCSogZHYtcGFsLmM6IFVzZS4KKworCSogc2ltLWlvLmgsIHNpbS1pby5jIChzaW1faW9fcG9sbF9yZWFkKTogTmV3IGZ1bmN0aW9uLiAgQ29weSBmcm9tCisgCS4uL3BwYy9tYWluLmMgc2ltX2lvX3JlYWRfc3RkaW4uCisKK0ZyaSBNYXkgIDEgMTI6MTE6MDIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBody10cmVlLmggKGh3X3RyZWVfcHJpbnQpOiBQYXJhbWF0ZXJpemUgd2l0aCBwcmludCBhbmQgZmlsZQorIAlhcmd1bWVudHMuCisJKiBody10cmVlLmM6IFVwZGF0ZS4KKwkKKwkqIGh3LWJhc2UuaCAoaHdfcG9ydF9ldmVudF9jYWxsYmFjayk6IERlbGV0ZSBDUFUvQ0lBIGFyZ3MuCisJKiBody1kZXZpY2UuaCAoaHdfaW9fcmVhZF9idWZmZXIsIGh3X2lvX3dyaXRlX2J1ZmZlcik6IERlbGV0ZQorIAlDUFUvQ0lBIGFyZ3MuCisJKiBody1wb3J0cy5oIChod19wb3J0X2V2ZW50KTogRGl0dG8uCisJKiBody1wb3J0cy5jIChod19wb3J0X2V2ZW50KTogVXBkYXRlLgorCSogaHctYmFzZS5jIChwYW5pY19od19pb19yZWFkX2J1ZmZlciwgcGFuaWNfaHdfaW9fd3JpdGVfYnVmZmVyKToKKyAJVXBkYXRlLgorCSogZHYtcGFsLmMgKGh3X3BhbF9pb19yZWFkX2J1ZmZlciwgaHdfcGFsX2lvX3dyaXRlX2J1ZmZlcik6CisgCVVwZGF0ZS4KKwkoaHdfcGFsX2lvX3dyaXRlX2J1ZmZlcik6IENhbGwgaHdfaGFsdCBub3Qgc2ltX2VuZ2luZV9oYWx0LgorCShkb19jb3VudGVyX2V2ZW50KTogVXBkYXRlLgorCSogZHYtZ2x1ZS5jIChod19nbHVlX2lvX3JlYWRfYnVmZmVyKTogVXBkYXRlLgorCShod19nbHVlX3BvcnRfZXZlbnQpOiBVcGRhdGUuCisKKwkqIGh3LWRldmljZS5oIChTSU1fREVTQyk6IFJlcGxhY2Ugd2l0aCBzdHJ1Y3Qgc2ltX3N0YXRlLgorCSogaHctYmFzZS5oIChod19jcmVhdGUpOiBEaXR0by4KKwkqIGh3LWJhc2UuYyAoaHdfY3JlYXRlKTogRGl0dG8uCisJCisJKiBody1kZXZpY2UuYyAoaHdfYWJvcnQsIGh3X3RyYWNlLCBod19od19ldmVudF9xdWV1ZV9zY2hlZHVsZSwKKyAJaHdfZXZlbnRfcXVldWVfZGVzY2hlZHVsZSwgaHdfZXZlbnRfcXVldWVfdGltZSk6IERlbGV0ZSwgbW92ZWQKKyAJZnJvbSBoZXJlIHRvLgorCSogc2ltLWh3LmM6IEhlcmUuCisJKiBody1kZXZpY2UuaCAoaHdfc3lzdGVtX2NwdSk6IERlY2xhcmUuCisJKiBzaW0taHcuYyAoaHdfc3lzdGVtX2NwdSk6IE5ldyBmdW5jdGlvbi4KKworCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfbWFwX2F0dGFjaCwgc2ltX2NvcmVfYXR0YWNoKTogQ2FsbAorIAlzaW1faHdfYWJvcnQgbm90IGh3X2Fib3J0LgorCShzaW0taHcuaCk6IEluY2x1ZGUuCisJKHNpbV9jb3JlX3JlYWRfYnVmZmVyLCBzaW1fY29yZV93cml0ZV9idWZmZXIpOiBDYWxsCisgCXNpbV9od19pb19yZWFkX2J1ZmZlciBhbmQgc2ltX2h3X2lvX3dyaXRlX2J1ZmZlci4gRG8gbm90IHBhc3MgQ1BVCisgCWFyZ3VtZW50LgorCShzaW1fY29yZV9zZXRfeG9yKTogRG8gbm90IHBhc3MgQ1BVIHdoZW4gYWJvcnRpbmcuCisKKwkqIHNpbS1uLWNvcmUuaCAoc2ltX2NvcmVfcmVhZF9hbGlnbmVkX04sCisgCXNpbV9jb3JlX3dyaXRlX2FsaWduZWRfTik6IENhbGwgc2ltX2h3X2Fib3J0IG5vdCBod19hYm9ydC4KKwkoc2ltX2NvcmVfcmVhZF9hbGlnbmVkX04sIHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfTik6IENhbGwKKyAJc2ltX2NwdV9od19pb19yZWFkX2J1ZmZlciBhbmQgc2ltX2NwdV9od19pb193cml0ZV9idWZmZXIuIERvZXMgbm90CisgCXJldHVybiBsZW5ndGguCisKKwkqIHNpbS1ody5oOiBEZWNsYXJlIHNpbV9od19pb197cmVhZCx3cml0ZX1fYnVmZmVyLiBEZWNsYXJlCisgCXNpbV9od19wcmludC4KKwkqIHNpbS1ody5jIChzaW1faHdfaW9fcmVhZF9idWZmZXIsIHNpbV9od19pb193cml0ZV9idWZmZXIsCisgCXNpbV9jcHVfaHdfaW9fcmVhZF9idWZmZXIsIHNpbV9jcHVfaHdfaW9fd3JpdGVfYnVmZmVyKTogTmV3CisgCWZ1bmN0aW9ucy4KKwkoc2ltX2h3X3ByaW50KTogTmV3IGZ1bmN0aW9uLgorCisJKiBzaW0tZW5naW5lLmggKHNpbV9lbmdpbmVfdmFib3J0KTogRGVjbGFyZS4KKwkqIHNpbS1lbmdpbmUuYyAoc2ltX2VuZ2luZV92YWJvcnQpOiBOZXcgZnVuY3Rpb24uCisKK1dlZCBBcHIgMjkgMjM6NTg6NTIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tdHJhY2UuYyAocHJpbnRfZGF0YSk6IEZvciBmbG9hdGluZy1wb2ludCBudW1iZXJzIHRyYWNlIHJhdworIAloZXggdmFsdWUuCisJKHRyYWNlX3Jlc3VsdF9mcDIpOiBOZXcgZnVuY3Rpb24uCisJKiBzaW0tdHJhY2UuaCAodHJhY2VfcmVzdWx0X2ZwMik6IE5ldyBkZWNsYXJhdGlvbi4KKwkoVFJBQ0VfRlBfUkVTVUxUMik6IE5ldyBtYWNyby4KKworVHVlIEFwciAyOCAxODoyODo1OCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisgICAgICAgICogY29tbW9uL2FjbG9jYWwubTQ6IGNhbGwgQU1fRVhFRVhUIGluIFNJTV9BQ19DT01NT04sIGRlZmluZQorICAgICAgICBBTV9DWUdXSU4zMiBhbmQgQU1fRVhFRVhULgorICAgICAgICAqIGNvbW1vbi9NYWtlLWNvbW1vbi5pbjogc2V0IEVYRUVYVCwgYWRkIG1pc3NpbmcgRVhFRVhUcworICAgICAgICB0byBydW4gYW5kIGluc3RhbGwtY29tbW9uIHJ1bGVzLgorICAgICAgICAqIGNvbW1vbi9jb25maWd1cmU6IHJlZ2VuZXJhdGUKKworU2F0IEFwciAyNSAxNzo0NTowMSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS10eXBlcy5oIChjZWxsX3dvcmQpOiBOZXcgdHlwZS4KKwkobmF0dXJhbF9jZWxsKTogRGVsZXRlIHR5cGUuCisKK1N1biBBcHIgMjYgMTU6MzE6NTUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1N1biBBcHIgMjYgMTU6MjU6MDcgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBhY2NvbmZpZy5oIChORUVEX0RFQ0xBUkFUSU9OX1BSSU5URik6IFJlbW92ZWQuCisKK0ZyaSBBcHIgMjQgMTQ6MTY6NDAgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK0ZyaSBBcHIgMjQgMTE6Mzg6MDggMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KKwkqIE1ha2UtY29tbW9uLmluICh0b3BfYnVpbGRkaXIpOiBOZXcgbWFjcm8uCisJKElOVExfTElCKTogUmVtb3ZlZC4KKwkoSU5UTExJQlMpOiBOZXcgbWFjcm8uCisJKElOVExERVBTKTogTGlrZXdpc2UuCisJKExJQkRFUFMpOiBVc2UgSU5UTERFUFMuCisJKEVYVFJBX0xJQlMpOiBVc2UgSU5UTExJQlMuCisJKiBhY2xvY2FsLm00IChTSU1fQUNfQ09NTU9OKTogQ2FsbCBDWV9HTlVfR0VUVEVYVC4KKwkoQ1lfV0lUSF9OTFMsIENZX0dOVV9HRVRURVhULCBBTV9QQVRIX1BST0dfV0lUSF9URVNULAorCUFNX0xDX01FU1NBR0VTKTogTmV3IG1hY3JvcyBmcm9tIEdOVSBnZXR0ZXh0LgorCitGcmkgQXByIDI0IDE5OjU3OjU5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWNvbmZpZy5oOiBEaXNjYXJkIGxlYWRpbmcgXyBmcm9tIG1hY3Jvcy4KKwkqIHNpbS10eXBlcy5oOiBEaXR0by4KKworV2VkIEFwciAyMiAxNDoxNDoxOSAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogTWFrZS1jb21tb24uaW4gKENTRUFSQ0gpOiBBZGQgLUkgdG8gaW50bCBkaXJlY3Rvcmllcy4KKwkoSU5UTF9MSUIpOiBQb2ludCB0byBsaWJpbnRsLmEuCisJKExJQkRFUFMpOiBBZGQgJChJTlRMX0xJQikuCisJKEVYVFJBX0xJQlMpOiBEaXR0by4KKworVHVlIEFwciAyMSAxMjo0NDoyNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjZ2VuLXR5cGVzLmggKEdFVEhJREksTUFLRURJKTogVHdlYWsuCisKKwkqIGNnZW4tb3BzLmggKEFERENGU0kpOiBGaXguCisJKFNVQkNGU0kpOiBUd2Vhay4KKworVHVlIEFwciAyMSAxMzoxODo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS10eXBlcy5oIChzaWduZWRfYWRkcmVzcywgdW5zaWduZWRfYWRkcmVzcyk6IERlZmluZS4KKworTW9uIEFwciAyMCAyMTo0Nzo1NCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1mcHUuYyAoc2ltX2ZwdV8yZCk6IERvbid0IHJldHVybiBhbiBTTmFOLCBjb252ZXJ0IGl0IGludG8gYQorIAlRTmFOLgorCitUaHUgQXByIDE2IDEwOjMwOjE0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWZwdS5jLCBzaW0tZnB1LmggKHNpbV9mcHVfZnJhY3Rpb250bywgc2ltX2ZwdV90b2ZyYWN0aW9uKToKKyAJTmV3IGZ1bmN0aW9ucywgcGFjayAvIHVucGFjayBzaW1fZnB1IHN0cnVjdCB1c2luZyByYXcgdmFsdWVzLgorCShzaW1fZnB1X2lzKTogRGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG5lZ2F0aXZlIGFuZCBwb3NpdGl2ZQorIAlpbmZpbml0eS4KKworVHVlIEFwciAxNCAxODo0OTozMSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1iaXRzLmggKEVYVEVORDQpOiBEZWZpbmUuCisJKEVYVEVORDQsIEVYVEVORDE1LCBFWFRFTkQxMSk6IERpdHRvLgorCQorVHVlIEFwciAxNCAxNjozMTozNSAxOTk4ICBKb2huIE1ldHpsZXIgIDxqbWV0emxlckBjeWdudXMuY29tPgorCisJKiBzaW0tbWVtb3B0LmMgKHBhcnNlX2FkZHIpOiBTdW5vcyA0LjUgZG9lcyBub3QgaGF2ZSBzdHJ0b2wKKyAJZGVjbGFyZWQgc28gd2UgbmVlZCB0aGlzIGNhc3QgdG8gcHJldmVudCBsb25nIGxvbmcgYWRkcmVzc2VzCisJZnJvbSBiZWluZyBtaXNjb25maWd1cmVzLiBSZXN1bHRzIGluIGFjY2VzcyB0byB1bm1hcHBlZCBtZW1vcnkuCisKK1R1ZSBBcHIgMTQgMTM6MTk6MTQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZS1jb21tb24uaW4gKFJVTlRFU1RGTEFHUyk6IERlZmluZS4KKwkoY2hlY2spOiBQYXNzIFJVTlRFU1RGTEFHUyB0byByZWN1cnNpdmUgbWFrZS4KKworVHVlIEFwciAxNCAxNTowOToxOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1pbmZvLmMgKHNpbV9pbmZvKTogQmUgdmVyYm9zZSB3aGVuIGVpdGhlciBWRVJCT1NFIG9yCisgCVNUQVRFX1ZFUkJPU0VfUC4KKworU2F0IEFwciAgNCAyMzoyNDoxNyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGFjbG9jYWwubTQgKHNpbS1pbmxpbmUpOiBCeSBkZWZhdWx0LCBkaXNhYmxlIHNpbS1pbmxpbmUgd2hlbgorIAljcm9zcyBjb21waWxpbmcuCisKK1NhdCBBcHIgIDQgMjA6MzY6MjUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00IChzaW0tY2ZsYWdzKTogQWRkIC1mb21pdC1mcmFtZS1wb2ludGVyIHRvIGRlZmF1bHRzLgorCShzaW0taW5saW5lKTogVXBkYXRlIHRvIG1hdGNoIHNpbS1pbmxpbmUuW2hjXQorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCisJKiBNYWtlLWNvbW1vbi5pbiAoc2ltX21haW5faGVhZGVycyk6IEFkZCBzaW0taW5saW5lLmgKKworCSogc2ltLWJpdHMuaCAoc2ltLWJpdHMuYyk6IEluY2x1ZGUgd2hlbiBIX1JFVkVBTFNfTU9EVUxFX1AuCisgCXNlbGVjdGVkLgorCSogc2ltLWVuZGlhbi5oIChzaW0tZW5kaWFuLmMpOiBEaXR0by4KKwkKKwkqIHNpbS1ldmVudHMuaCAoX1NJTV9FVkVOVFNfSF8pOiBSZXBsYWNlIHdpdGggU0lNX0VWRU5UU19ILgorCShzaW1fZXZlbnRzX3NldF90cmFjZSk6IERlbGV0ZSB1bnVzZWQgcHJvdG90eXBlLgorCQorCSogc2ltLWNvcmUuaCAoX1NJTV9DT1JFX0hfKTogUmVwbGFjZSB3aXRoIFNJTV9DT1JFX0guCisJKiBzaW0tY29yZS5jIChfU0lNX0NPUkVfQ18pOiBEaXR0byBmb3IgU0lNX0NPUkVfQy4KKworCSogc2ltLWZwdS5oIChzaW0tZnB1LmMpOiBJbmNsdWRlIHdoZW4gSF9SRVZFQUxTX01PRFVMRV9QLgorCShzaW1fZnB1X3RvMjMyaSwgc2ltX2ZwdV90bzIzMnUsIHNpbV9mcHVfaTIzMnRvLCBzaW1fZnB1X3UyMzJ0byk6CisgCUNvbW1lbnQgb3V0LCBub3QgeWV0IGltcGxlbWVudGVkIGluIHNpbS1mcHUuYy4KKwkoc2ltX2ZwdV96ZXJvLCBzaW1fZnB1X29uZSwgc2ltX2ZwdV90d28sIHNpbV9mcHVfcW5hbiwKKyAJc2ltX2ZwdV9tYXgzMiwgc2ltX2ZwdV9tYXg2NCk6IE1hcmsgYXMgRVhURVJOX1NJTV9GUFUuCisJCisJKiBzaW0taW5saW5lLmg6IFJld3JpdGUgZGVzY3JpcHRpb24uCisJKEhfUkVWRUFMU19NT0RVTEVfUCwgQ19SRVZFQUxTX01PRFVMRV9QKTogRGVmaW5lLgorCShTSU1fTUFJTl9JTkxJTkUpOiBBZGQgaW5saW5lIG9wdGlvbi4KKwkKKwkqIHNpbS1pbmxpbmUuYyAoc2VtYW50aWNzLmMsIGlkZWNvZGUuYywgZW5naW5lLmMsIC4uLik6IERvIG5vdAorIAlpbmNsdWRlIGdlbmVyYXRlZCBmaWxlcy4gSGFuZGxlZCBieSBnZW5lcmF0b3IgZGlyZWN0bHkuCisJCitTYXQgQXByICA0IDAxOjA3OjA2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLXRyYWNlLmMgKHNldF90cmFjZV9vcHRpb25fbWFzayk6IEtlZXAgVFJBQ0VfQU5ZX1AKKwl1cC10by1kYXRlLgorCisJKiBzaW0tdHJhY2UuaCAoVFJBQ0VfQU5ZX1ApOiBEZWZpbmUuCisJKHN0cnVjdCBfdHJhY2VfZGF0YSk6IEFkZCB0cmFjZV9hbnlfcC4KKworTW9uIE1hciAzMCAxNzoxMTo1NSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHJ1bi5jIChtYWluKTogSGFuZGxlIGFsbCBhbHRlcm5hdGl2ZXMgb2YgZW51bSBzaW1fc3RvcC4KKwkobWFpbik6IERlbGV0ZSB1bnVzZWQgYGFzZWN0aW9uICpzJy4KKworRnJpIE1hciAyNyAxNjoxNTo1MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGh3LXRyZWUuaCwgaHctdHJlZS5jIChod190cmVlX3ZwYXJzZSk6IE5ldyBmdW5jdGlvbgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKKwkqIHNpbS1ody5jOiBOZXcgZmlsZS4KKwkqIHNpbS1ody5oIChzaW1faHdfcGFyc2UpOiBEZWNsYXJlIGZ1bmN0aW9uLgorCShody10cmVlLmgpOiBEbyBub3QgaW5jbHVkZS4KKwkKKwkqIHNpbS1iYXNlLmggKFNUQVRFX0hXKTogRGVmaW5lLgorCShzdHJ1Y3Qgc2ltX3N0YXRlX2Jhc2UpOiBBZGQgbWVtYmVyIHN0cnVjdCAqaHcuCisKKwkqIHNpbS1tb2R1bGUuYyAoc2ltLWh3LmgpOiBJbmNsdWRlLgorCShtb2R1bGVzKTogQWRkIHNpbV9od19pbnN0YWxsLgorCQorCSogYWNsb2NhbC5tNCAoc2ltX2h3X29iaik6IEFkZCBzaW0taHcubworCitGcmkgTWFyIDI3IDE0OjU1OjA2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWJhc2UuaCAoQ1BVX0lOREVYKTogRGVmaW5lLgorCisJKiBzaW0tdXRpbHMuYyAoc2ltX3N0YXRlX2FsbG9jKTogSW5pdGlhbGl6ZS4KKwkqIHNpbS1tb2R1bGUuYyAoc2ltX3Bvc3RfYXJndl9pbml0KTogRGl0dG8uCisKK1RodSBNYXIgMjYgMTA6MDc6NTcgMTk5OCAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmh1bmEuY3lnbnVzLmNvLnVrPgorCisJKiBhY2xvY2FsLm00IChzaW1faHdfb2JqKTogIEZpeCBzZWQgZXhwcmVzc2lvbiB0byBnZW5lcmF0ZQorCXByb3Blcmx5IGZvcm1hdHRlZCBsaXN0cy4KKworVGh1IE1hciAyNiAxMDozNzoyMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGR2LXBhbC5jIChlbnVtIGh3X3BhbF9hZGRyZXNzX21hc2spOiBGcm9tIFN0dSBHcm9zc21hbiwgd2FzCisgCTB4MmYgbmVlZHMgdG8gYmUgMHgzZi4KKworVGh1IE1hciAyNiAwOToxMDo1NiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGh3LXRyZWUuYyAoaHdfdHJlZV9maW5kX3Byb3BlcnR5KTogUmV0dXJuIE5VTEwgd2hlbiBkZXZpY2UgaXMKKyAJbm90IGZvdW5kLgorCShod190cmVlX2ZpbmRfKl9wcm9wZXJ0eSk6IENsZWFuIHVwIGVycm9yIG1lc3NhZ2Ugd2hlbiBwcm9wZXJ0eSBpcworIAlub3QgZm91bmQuCisKKwkqIGR2LXBhbC5jIChod19wYWxfaW9fcmVhZF9idWZmZXIpOiBDaGVjayB0aGUgc21wIHByb3BlcnR5IGlzCisgCXByZXNlbnQgYmVmb3JlIGxvb2tpbmcgZm9yIGl0LgorCitXZWQgTWFyIDI1IDE2OjE3OjM4IDE5OTggIElhbiBDYXJtaWNoYWVsICA8aWFuY2FybUBjeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00IChBQ19DSEVDS19IRUFERVJTKTogQWRkIGNoZWNrIGZvciBmcHVfY29udHJvbC5oLiAgCisJKEFDX0NIRUNLX0ZVTkNTKTogQWRkIGNoZWNrIGZvciBfX3NldGZwdWN3LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworV2VkIE1hciAyNSAwOToxODozNCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGR2LXBhbC5jIChod19wYWxfY291bnRkb3duLCBod19wYWxfY291bnRkb3duX3ZhbHVlLAorIAlod19wYWxfdGltZXIsIGh3X3BhbF90aW1lcl92YWx1ZSk6IERlZmluZS4KKwkoaHdfcGFsX2lvX3JlYWRfYnVmZmVyLCBod19wYWxfaW9fd3JpdGVfYnVmZmVyKTogQWRkIHRpbWVyIHN1cHBvcnQKKwkoZG9fY291bnRlcl9ldmVudCwgZG9fY291bnRlcl9yZWFkLCBkb19jb3VudGVyX3ZhbHVlLAorIAlkb19jb3VudGVyX3dyaXRlKTogbmV3IGZ1bmN0aW9ucy4KKworVHVlIE1hciAyNCAxMjoyNDoyNCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGh3LXRyZWUuYyAoaHdfcHJpbnRmKTogU2VuZCB0cmVlIGR1bXAgdG8gc3RkZXJyLCBzYW1lIGFzIG90aGVyCisgCXRyYWNlIG91dHB1dC4KKworCSogaHctYmFzZS5jIChod19jcmVhdGUpOiBTdG9wIHNlYXJjaGluZyBmb3IgYSBkZXZpY2Ugd2hlbiBvbmUgaXMKKyAJZm91bmQuCisKK1dlZCBNYXIgMjUgMTI6MzU6MjkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK01vbiBNYXIgMjMgMTA6MjU6MDggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00IChTSU1fQUNfT1BUSU9OX0hBUkRXQVJFKTogQWRkIHNlY29uZCBhcmd1bWVudCwKKyAJYXBwZW5kcyBleHRyYSBkZXZpY2VzLgorCShTSU1fQUNfT1BUSU9OX0hBUkRXQVJFKTogU3Vic3R1dGUgc2ltX2h3LCBhIG5vbi1kdXBsaWNhdGUgbGlzdCBvZgorIAl0aGUgZGV2aWNlIG5hbWVzLgorCQorCSogTWFrZS1jb21tb24uaW4gKGh3LWNvbmZpZy5oKTogTmV3IHRhcmdldCwgY3JlYXRlIGh3LWNvbmZpZy5oCisgCWZpbGUuCisJKFNJTV9IVyk6IERlZmluaXRpb24gZnJvbSBAc2ltX2h3QC4KKwkoaHctYmFzZS5vKTogRGVwZW5kIG9uIGh3LWNvbmZpZy5oCisKK1R1ZSBNYXIgMjQgMTc6NDE6MzUgMTk5OCAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmh1bmEuY3lnbnVzLmNvLnVrPgorCisJKiBNYWtlLWNvbW1vbi5pbjogIEdldCBTSEVMTCBmcm9tIGNvbmZpZ3VyZS4KKwkqIChzdGFtcC10dmFscyBzaW0taW5saW5lLmMpOiAgVXNlICQoU0hFTEwpIHdoZW4gaW52b2tpbmcKKwltb3ZlLWlmLWNoYW5nZS4gIEZpeGVzIE5UIG5hdGl2ZSBidWlsZCBwcm9ibGVtLgorCSogTWFrZWZpbGUuaW4gKG5sdHZhbHMuZGVmKTogICBVc2UgJChTSEVMTCkgd2hlbiBpbnZva2luZworCW1vdmUtaWYtY2hhbmdlLiAgRml4ZXMgTlQgbmF0aXZlIGJ1aWxkIHByb2JsZW0uCisJKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi4xMi4xIHRvIGZpeCBzaGVsbCBpc3N1ZXMgZm9yCisJTlQgbmF0aXZlIGJ1aWxkcy4KKwkKK1N1biBNYXIgMjIgMTY6NTQ6NDAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBody1kZXZpY2UuaCwgaHctZGV2aWNlLmMgKGh3X3N0cmR1cCk6IE5ldyBmdW5jdGlvbi4KKworCSogaHctYmFzZS5jIChod19jcmVhdGUpOiBVc2UgaHdfc3RyZHVwIHdoZW4gc2F2aW5nIGEgY29weSBvZiB0aGUKKyAJc3RyaW5ncyBuYW1lLCBmYW1pbHkgYW5kIGFyZ3MuCisJKGZ1bGxfbmFtZV9vZl9odyk6IFVzZSBod19zdHJkdXAgd2hlbiByZXR1cm5pbmcgdGhlIGZ1bGwgcGF0aC4KKworCSogaHctcHJvcGVydGllcy5jOiBDbGVhbiB1cCBwcm9wZXJ0eSBub3QgZm91bmQgLyB3cm9uZyB0eXBlIGVycm9yCisgCW1lc3NhZ2VzLgorCQorCSogaHctdHJlZS5jIChod190cmVlX3BhcnNlKTogRmluaXNoIGEgZGV2aWNlcyBpbml0aWFsaXphdGlvbgorIAliZWZvcmUgYXR0YWNoaW5nIGFueSBwb3J0cy4KKworCSogaHctYmFzZS5jIChody1jb25maWcuKTogSW5jbHVkZS4gIFJlcGxhY2UgaGFyZHdpcmVkIHRhYmxlLgorCisJKiBkdi1nbHVlLmM6IENvcHkgb3ZlciAuLi9wcGMvaHdfZ2x1ZS5jLiAgVXBkYXRlIHRvIG5ldyBmcmFtZXdvcmsuCisKKwkqIE1ha2UtY29tbW9uLmluOiBBZGQgcnVsZSBmb3IgZHYtZ2x1ZS5vLgorCitTdW4gTWFyIDIyIDE2OjQ1OjU0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaHctYmFzZS5jIChod19maW5pc2gpOiBNb3ZlIHNldHRpbmcgb2YgdHJhY2UgbGV2ZWwgdG8gaGVyZS4KKwkoaHdfY3JlYXRlKTogRnJvbSBoZXJlLgorCisJKiBody1iYXNlLmgsIGh3LWJhc2UuYyAoZG9faHdfYXR0YWNoX3JlZ3MpOiBDb3B5IGZ1bmN0aW9uIGZyb20KKyAJLi4vcHBjL2RldmljZV90YWJsZS5jLgorCisJKiBkdi1wYWwuYyAoaHdfcGFsX2ZpbmlzaCk6IEF0dGFjaCBQQUwgZGV2aWNlIHRvIHBhcmVudCBidXMuCisKKwkqIGh3LXRyZWUuYyAocHJpbnRfcHJvcGVydGllcyk6IFN1cHJlc3MgcGF0aCB3aGVuIHByaW50aW5nCisgCXByb3BlcnRpZXMgb2Ygcm9vdCBub2RlLgorCitTdW4gTWFyIDIyIDE2OjIxOjE1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaHctZGV2aWNlLmggKEhXX1RSQUNFKTogRGVmaW5lLgorCShod190cmFjZSk6IERlY2xhcmUuCisJKiBody1kZXZpY2UuYyAoaHdfdHJhY2UpOiBJbXBsZW1lbnQgZnVuY3Rpb24uCisKKwkqIGh3LWJhc2UuYyAoaHdfY3JlYXRlKTogU2V0IGh3IHRyYWNlIGxldmVsIGZyb20gInRyYWNlPyIKKyAJcHJvcGVydHkuCisKKwkqIGR2LWNvcmUuYyAoZHZfY29yZV9hdHRhY2hfYWRkcmVzc19jYWxsYmFjayk6IEFkZCB0cmFjZS4KKworCSogZHYtcGFsLmM6IFJlcGxhY2UgRFRSQUNFIHdpdGggSFdfVFJBQ0UuCisKK1N1biBNYXIgMjIgMTU6MjM6MzUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBody1kZXZpY2UuaCAoSFdfWkFMTE9DLCBIV19NQUxMT0MpOiBOZXcgbWFjcm9zLgorCShod19hbGxvY19kYXRhKTogRGVsY2FyZS4KKwkoc3RydWN0IGh3KTogQWRkIG1lbWJlciBhbGxvY19vZl9ody4KKwkKKwkqIGh3LWRldmljZS5jIChod196YWxsb2MsIGh3X21hbGxvYywgaHdfZnJlZSwgaHdfZnJlZV9hbGwpOiBOZXcKKyAJZnVuY3Rpb25zLiBBc3NvY2F0ZSBtZW1vcnkgd2l0aCBhIGRldmljZS4KKwkoc3RkbGliLmgpOiBJbmNsdWRlLgorCQorCSogaHctYmFzZS5oIChzZXRfaHdfZGVsZXRlKTogRGVmaW5lLgorCShod19kZWxldGVfY2FsbGJhY2spOiBEZWNsYXJlLgorCShod19kZWxldGUpOiBEZWNsYXJlLgorCisJKiBody1iYXNlLmMgKGh3X2RlbGV0ZSk6IEltcGxlbWVudCBmdW5jdGlvbi4KKwkoc3RydWN0IGh3X2Jhc2VfZGF0YSk6IEFkZCBtZW1iZXIgdG9fZGVsZXRlLgorCShpZ25vcmVfaHdfZGVsZXRlKTogTmV3IGZ1bmN0aW9uLCBkb2VzIG5vdGhpbmcuCisJKGh3X2NyZWF0ZSk6IFNldCB0aGUgaHdfZGVsZXRlIG1ldGhvZC4KKwkoaHdfY3JlYXRlKTogQWxsb2NhdGUgdGhlIGJhc2UgdHlwZSB1c2luZyBIV19aQUxMT0MgYmVmb3JlIHNldHRpbmcKKyAJYW55IG1ldGhvZHMuCisKKwkqIGh3LXRyZWUuaCwgaHctdHJlZS5jIChod190cmVlX2RlbGV0ZSk6IE5ldyBmdW5jdGlvbi4KKwkKKwkqIGh3LXByb3BlcnRpZXMuYzogUmVwbGFjZSB6YWxsb2MvemZyZWUgd2l0aCBod196YWxsb2MvaHdfZnJlZS4KKwkKKwkqIGh3LXBvcnRzLmM6IFJlcGxhY2UgemFsbG9jL3pmcmVlIHdpdGggaHdfemFsbG9jL2h3X2ZyZWUuCisJKGF0dGFjaF9od19wb3J0X2VkZ2UpOiBBZGQgc3RydWN0IGh3IGFyZ3VtZW50CisKKwkqIGR2LXBhbC5jIChod19wYWxfZmluaXNoKTogUmVwbGFjZSB6YWxsb2MvemZyZWUgd2l0aAorIAlod196YWxsb2MvaHdfZnJlZS4KKworU3VuIE1hciAyMiAxNTowOTo1MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGh3LWRldmljZS5oIChod19hdHRhY2hfYWRkcmVzc19jYWxsYmFjaywKKyAJaHdfZGV0YWNoX2FkZHJlc3NfY2FsbGJhY2spOiBBdHRhY2ggdG8gYSBzaW5nbGUgc3BhY2Ugbm90IGEgc3BhY2UKKyAJbWFzay4gQ2xhcmlmeSBpbnRlcnByZXRhdGlvbiBvZiBTUEFDRTpBRERSIHBhcmFtZXRlcnMuCisKKwkqIGh3LWJhc2UuYyAocGFzc3Rocm91Z2hfaHdfYXR0YWNoX2FkZHJlc3MsCisgCXBhc3N0aHJvdWdoX2h3X2RldGFjaF9hZGRyZXNzKTogVXBkYXRlLgorCSogZHYtY29yZS5jIChkdl9jb3JlX2F0dGFjaF9hZGRyZXNzX2NhbGxiYWNrKTogRGl0dG8uCisJKiBkdi1wYWwuYyAoaHdfcGFsX2F0dGFjaF9hZGRyZXNzKTogRGl0dG8uCisKK1RodSBNYXIgMTkgMDA6NDE6MDAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tb3B0aW9ucy5oOiBEb2N1bWVudCBhZGRpdGlvbmFsIENQVSBhcmcgdG8gT1BUSU9OX0hBTkRMRVIuCisKK1dlZCBNYXIgMTggMTQ6MTM6MDIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBNYWtlLWNvbW1vbi5pbiAoU0lNX0hXX09CSlMsIFNJTV9IV19TUkMsIFNJTV9EVl9PQkpTKTogRGVmaW5lLgorCShody1iYXNlX2gsIGh3LWRldmljZV9oLCBody1oYW5kbGVzX2gsIGh3LWluc3RhbmNlc19oLCBod19wb3J0c19oLAorIAlody1wcm9wZXJ0aWVzX2gsIGh3LXRyZWVfaCk6IERlZmluZSwgcG9pbnQgYXQgY29ycmVzcG9uZGluZworIAloZWFkZXIuCisJKGh3X2Jhc2VfaGVhZGVycyk6IERlZmluZSBsaXN0IG9mIGhlYWRlcnMgaW5jbHVkZWQgYnkgaHctYmFzZS5oCisJKGh3LWJhc2UubywgaHctZGV2aWNlLm8sIGh3LWluc3RhbmNlcy5vLCBody1oYW5kbGVzLm8sIGh3LXBvcnRzLm8sCisgCWh3LXByb3BlcnRpZXMubywgaHctdHJlZS5vKTogU3BlY2lmeSBkZXBlbmRlbmNpZXMuCisJKGR2LWNvcmUubywgZHYtcGFsLm8pOiBEaXR0by4KKworCSogc2ltLWh3Lmg6IE5ldyBmaWxlLgorCisJKiBody1kZXZpY2UuaCwgaHctZGV2aWNlLmMsIGh3LXByb3BlcnRpZXMuaCwgaHctcHJvcGVydGllcy5jLAorIAlody1wb3J0cy5oLCBody1wb3J0cy5jOiBOZXcgZmlsZXMuIENvcGllZCBmcm9tIC4uL3BwYy9kZXZpY2UuW2NoXS4KKwkKKwkqIGh3LXRyZWUuaCwgaHctdHJlZS5jOiBOZXcgZmlsZXMuIENvcGllZCBmcm9tIC4uL3BwYy90cmVlLltoY10uCisKKwkqIGh3LWJhc2UuaCwgaHctYmFzZS5jOiBuZXcgZmlsZXMuICBDb3BpZWQgZnJvbQorIAkuLi9wcGMvZGV2aWNlX3RhYmxlLltoY10uCisKKwkqIGR2LWNvcmUuYywgZHYtcGFsLmM6IE5ldyBmaWxlcy4gQ29waWVkIGZyb20KKyAJLi4vcHBjL2h3X3tjb3JlLHBhbH0uYworCQorCSogc2ltLWJhc2ljcy5oIChzdHJ1Y3QgaHcpOiBEZWNsYXJlLgorCShlbnVtIHBvcnRfZGlyZWN0aW9uLCBlbnVtIG9iamVjdF9kaXNwb3NpdGlvbik6IERlY2xhcmUuCisKK1dlZCBNYXIgMTggMTI6Mzg6MTIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00IChTSU1fQUNfT1BUSU9OX0hBUkRXQVJFKTogU2V0IHNpbV9od19vYmosIHNpbV9kdl9vYmosCisgCXNpbV9kdl9zcmMgaW4gTWFrZWZpbGUuIFRha2UgbGlzdCBvZiBkZXZpY2VzIGFzIHBhcmFtZXRlciB0byBtNAorIAltYWNyby4uCisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIE1hciAxNiAxMjozNzozMyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS10cmFjZS5oLCBzaW0tdHJhY2UuYyAodHJhY2VfcHJlZml4KTogUGFzcyBpbiBzaW1fY2lhIHNvIHRoYXQKKyAJdHJhY2VfcHJlZml4IGNhbiBhYm9ydCBjbGVhbmx5LgorCitTYXQgTWFyIDE0IDE4OjM2OjEyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBkdi1zb2Nrc2VyLmMsIGR2LXNvY2tzZXIuaDogTmV3IGZpbGVzLgorCSogTWFrZS1jb21tb24uaW4gKGR2LXNvY2tzZXIubyk6IEFkZCBydWxlIGZvci4KKwkqIGFjbG9jYWwubTQ6IENoZWNrIGZvciBmY250bC5oLgorCSogY29uZmlnLmg6IEFkZCBIQVZFX0ZDTlRMX0guCisKKwkqIHNpbS1icmVhay5jIChyZW1vdmVfYnJlYWtwb2ludCk6IEZpeCB0aGlua28uCisKKwkqIHNpbS1obG9hZC5jIChzaW1fbG9hZCk6IFByb3ZpZGUgZGVmYXVsdCB2YWx1ZSBvZiBTSU1fSEFORExFU19MTUEuCisJVXNlIFNJTV9IQU5ETEVTX0xNQSBmb3IgbG1hX3AgYXJnIHRvIHNpbV9sb2FkX2ZpbGUuCisKKzE5OTgtMDMtMTMgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBzaW0tYmFzZS5oIChzdHJ1Y3Qgc2ltX3N0YXRlX2Jhc2UpOiBBZGQgcHJvZ19zeW1zIGFuZAorCWRlZmluZSBtYWNybyBTVEFURV9QUk9HX1NZTVMuCisJKiBzaW0tdHJhY2UuYyAodHJhY2VfcHJlZml4KTogQWRkIHZhcmlhYmxlcyBhYmZkLCBzeW1zaXplLAorCXN5bWJvbF9jb3VudCwgYW5kIGFzeW1ib2xzLiAgQ2FsbCBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAorCWFuZCBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiwgdG8gZ2V0IHN5bWJvbCB0YWJsZSBvbiBmaXJzdCB1c2UKKwlhbmQgcHJlc2VydmUgaXQgdmlhIFNUQVRFX1BST0dfU1lNUyBmb3IgZnV0dXJlIGNhbGxzIHRvCisJYmZkX2ZpbmRfbmVhcmVzdF9saW5lLgorCitXZWQgTWFyIDExIDE0OjAyOjQ3IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWNvcmUuaCwgc2ltLWNvcmUuYyAoc2ltX2NvcmVfbWFwX3RvX3N0cik6IERlbGV0ZS4KKworCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfYXR0YWNoKTogSGFuZGxlIGEgZ2VuZXJpYyBudW1iZXIgb2YgbWFwcyAtCisgCXVwIHRvIG5yX21hcHMsIG5vdCBqdXN0IGFjY2Vzc18qIG1hcHMuCisKKwkqIHNpbS1wcm9maWxlLmggKHN0cnVjdCBQUk9GSUxFX0RBVEEpOiBUcmFjayBucl9tYXBzIGRpZmZlcmVudAorIAltYXBzLgorCisJKiBzaW0tcHJvZmlsZS5jIChwcm9maWxlX3ByaW50X2NvcmUpOiBNYWtlIG1hcCB1bnNpZ25lZC4gIEl0ZXJhdGUKKyAJb3ZlciBucl9tYXBzIG5vdCBzaW1fY29yZV9ucl9tYXBzLgorCisJKiBzaW0tZXZlbnRzLmgsIHNpbS1ldmVudHMuYyAoc2ltX2V2ZW50c193YXRjaF9jb3JlKTogQ2hhbmdlCisgCWNvcmVfbWFwIGFyZ3VtZW50IHRvIHVuc2lnbmVkLgorCShzdHJ1Y3QgX3NpbV9jb3JlKTogRGl0dG8gZm9yIHN0cnVjdCBtZW1iZXIgY29yZV9tYXAuCisKKwkqIHNpbS1jb3JlLmggKG5yX3NpbV9jb3JlX21hcHMsIHNpbV9jb3JlXypfbWFwKTogRGVsZXRlCisKKwkqIHNpbS1iYXNpY3MuaCAoYWNjZXNzX2lvLCBhY2Nlc3NfKl9pbyk6IERlZmluZS4KKwkobWFwX3JlYWQsIG1hcF93cml0ZSwgbWFwX2V4ZWMsIG1hcF9pbyk6IERlZmluZS4KKworCSogc2ltLWNvcmUuYywgc2ltLWNvcmUuaCAoc2ltX2NvcmVfYXR0YWNoKTogUmVwbGFjZSBhcmd1bWVudAorIAlhdHRhY2ggd2l0aCBtb3JlIGdlbmVyaWMgbWFwbWFzay4KKwkoc2ltX2NvcmVfe3JlYWQsd3JpdGV9XyopOiBDaGFuZ2UgbWFwIGFyZ3VtZW50IHRvIHVuc2lnbmVkLgorCQorCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfdW5pbnN0YWxsLCBzaW1fY29yZV9hdHRhY2gsCisgCXNpbV9jb3JlX2RldGFjaCk6IEl0ZXJhdGUgb3ZlciBucl9tYXBzIGluc3RlYWQgb2YKKyAJc2ltX2NvcmVfbnJfbWFwcy4KKworCSogc2ltLWJyZWFrLmMgKGluc2VydF9icmVha3BvaW50KTogV3JpdGUgYnJlYWtwb2ludHMgdG8gZXhlY19tYXAKKyAJaW5zdGVhZCBvZiB0aGUgd3JpdGVfbWFwLgorCShyZW1vdmVfYnJlYWtwb2ludCk6IERpdHRvLgorCisJKiBnZW5tbG9vcC5zaCAoZW5naW5lX3Jlc3VtZV9mdWxsKTogUmVwbGFjZSBzaW1fY29yZV8qX21hcAorIAl3aXRoIHJlYWRfbWFwLCB3cml0ZV9tYXAsIGV4ZWNfbWFwIHJlc3AuCisKKwkqIGNnZW4tbWVtLmggKERFQ0xBUkVfR0VUTUVNLCBERUNMQVJFX1NFVE1FTSwgREVDTEFSRV9HRVRJTUVNKToKKyAJRGl0dG8uCisKKwkqIGNnZW4tdXRpbHMuYyAoc2ltX2Rpc2Fzc2VtYmxlX2luc24pOiBEaXR0by4KKworCSogc2ltLWhydy5jIChzaW1fd3JpdGUsIHNpbV93cml0ZSk6IERpdHRvLgorCisJKiBzaW0tdXRpbHMuaCwgc2ltLXV0aWxzLmMgKGFjY2Vzc190b19zdHIsIG1hcF90b19zdHIsCisgCXRyYW5zZmVyX3RvX3N0cik6IE5ldyBmdW5jdGlvbnMuCisKK01vbiBNYXIgIDkgMTI6NTA6NTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIHNpbS1iYXNlLmggKHNpbV9zdGF0ZV9iYXNlKTogTmV3IG1lbWJlciBlbnZpcm9ubWVudC4KKwkoU1RBVEVfRU5WSVJPTk1FTlQpOiBOZXcgbWFjcm8uCisJKiBzaW0tY29uZmlnLmMgKGN1cnJlbnRfZW52aXJvbm1lbnQpOiBEZWxldGUuCisJKHNpbV9jb25maWdfZGVmYXVsdCk6IE5ldyBmdW5jdGlvbi4KKwkoc2ltX2NvbmZpZyk6IFNldCBTVEFURV9FTlZJUk9OTUVOVCwgbm90IGN1cnJlbnRfZW52aXJvbm1lbnQuCisJKiBzaW0tY29uZmlnLmggKGN1cnJlbnRfZW52aXJvbm1lbnQsQ1VSUkVOVF9FTlZJUk9OTUVOVCk6IERlbGV0ZS4KKwkoc2ltX2NvbmZpZ19kZWZhdWx0KTogQWRkIHByb3RvdHlwZS4KKwkqIHNpbS1tb2R1bGUuYyAoc2ltX3ByZV9hcmd2X2luaXQpOiBDYWxsIHNpbV9jb25maWdfZGVmYXVsdC4KKwkqIHNpbS1vcHRpb25zLmMgKHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyLCBjYXNlIE9QVElPTl9FTlZJUk9OTUVOVCk6CisJU2V0IFNUQVRFX0VOVklST05NRU5ULCBub3QgY3VycmVudF9lbnZpcm9ubWVudC4KKworTW9uIE1hciAgOSAxMTo1OTowMyAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+CisKKwkqIHNpbS1mcHUuYyAoTlJfR1VBUkRTNjQpOiBDaGFuZ2UgTlJfUEFEMzIgdG8gTlJfUEFENjQuCisKK1R1ZSBNYXIgIDMgMTA6NTM6MDUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tdHlwZXMuaCAoU0lHTkVEMzIsIFNJR05FRDY0KTogUGFjaWZ5IEdDQy4KKworCSogc2ltLWFsdS5oIChBTFU2NF9CRUdJTik6IE1ha2UgYWx1NjRfciB1bnNpZ25lZC4KKworTW9uIE1hciAgMiAxMDoyMDowNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogTWFrZS1jb21tb24uaW4gKFRBR1MpOiBNYWtlIHNtYXJ0ZXIuCisJKiBNYWtlZmlsZS5pbiAoVEFHUyk6IERpdHRvLgorCitGcmkgRmViIDI3IDE5OjA5OjU3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNpbS1tb2R1bGUuYyAoKik6IEZpeCB0eXBvcyBpbiBhc3NlcnRpb24gdGVzdHMuCisKK1NhdCBGZWIgMjggMTM6NTQ6MTAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tbW9kdWxlLmMgKHNpbV9wcmVfYXJndl9pbml0KTogU3RyaW5nIHBhc3NlZCB0byBhc3ByaW50ZgorIAljYW4ndCBiZSBjb25zdGFudC4KKyAgCQorCSogc2ltLW9wdGlvbnMuYyAoc2ltX3BhcnNlX2FyZ3MpOiBEaXR0by4KKwkoc2ltX2FyZ3NfY29tbWFuZCk6IFJldHVybiBPSywgaW5zdGVhZCBvZiBub3RoaW5nLCBmb3IgYW4gZW1wdHkKKyAJY29tbWFuZC4KKworRnJpIEZlYiAyNyAxMzoyOToxMyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1wcm9maWxlLmMgKHByb2ZpbGVfaW5mbyk6IFJlbmFtZSBmcm9tIHByb2ZpbGVfcHJpbnQuIERyb3AKKyAJbWlzYyBhbmQgbWlzY19jcHUgY2FsbGJhY2sgYXJndW1lbnRzLiAgVXNlCisgCVBST0ZJTEVfSU5GT19DUFVfQ0FMTEJBQ0sgYW5kIFNUQVRFX1BST0ZJTEVfSU5GT19DQUxMQkFDSyBpbnN0ZWFkLgorCShwcm9maWxlX2luc3RhbGwpOiBJbnN0YWxsIHByb2ZpbGVfaW5mbyBmdW5jdGlvbi4KKworCSogc2ltLXByb2ZpbGUuaCAoUFJPRklMRV9JTkZPX0NQVV9DQUxMQkFDSywKKyAJU1RBVEVfUFJPRklMRV9JTkZPX0NBTExCQUNLKTogRGVmaW5lLgorCShzdHJ1Y3QgUFJPRklMRV9EQVRBKTogQWRkIGZpZWxkIGluZm9fY3B1X2NhbGxiYWNrLgorCShwcm9maWxlX3ByaW50KTogRGVsZXRlIGZ1bmN0aW9uLgorCisJKiBzaW0tYmFzZS5oIChTVEFURV9NT0RVTEVTKTogRGVmaW5lLiAgUmVwbGFjZSBpbmRpdmlkdWFsCisgCVNUQVRFXypfTElTVCB3aXRoIHNpbmdsZSBzdHJ1Y3QgbW9kdWxlX2xpc3QuCisKKwkqIHNpbS1tb2R1bGUuaCAoTU9EVUxFX0lORk9fRk4sIE1PRFVMRV9JTkZPX0xJU1QpOiBEZWNsYXJlLgorCShzdHJ1Y3QgbW9kdWxlX2xpc3QpOiBEZWNsYXJlLgorCQorCSogc2ltLW1vZHVsZS5oLCBzaW0tbW9kdWxlLmMgKHNpbV9tb2R1bGVfYWRkX2luZm9fZm4sCisgCXNpbV9tb2R1bGVfaW5mbyk6IE5ldyBmdW5jdGlvbnMuCisJKHNpbV9tb2R1bGVfaW5zdGFsbCk6IENsZWFuIHVwIG1vZHVsZSBkYXRhIHN0cnVjdHVyZXMuCisKKwkqIHNpbS1pbmZvLmMgKHNpbV9pbmZvKTogTmV3IGZpbGUuIE5ldyBmdW5jdGlvbi4gQ2FsbAorIAlzaW1fbW9kdWxlX2luZm8uCisKKwkqIE1ha2UtY29tbW9uLmluIChzaW0taW5mby5vKTogRGVmaW5lIHJ1bGUuCisJKFNJTV9ORVdfQ09NTU9OX09CSlMpOiBBZGQgc2ltLWluZm8uby4KKworCitGcmkgRmViIDI3IDE4OjI2OjE2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNpbS1iYXNlLmggKHNpbV9jcHVfYmFzZSk6IE5ldyBtZW1iZXJzIG5hbWUsIG9wdGlvbnMuCisJKHNpbV9jcHVfbG9va3VwKTogQWRkIHByb3RvdHlwZS4KKwkqIHNpbS1tb2R1bGUuYyAoc2ltX3ByZV9hcmd2X2luaXQpOiBQcm92aWRlIGRlZmF1bHQgbmFtZXMgZm9yIGNwdXMuCisJKiBzaW0tb3B0aW9ucy5oIChERUNMQVJFX09QVElPTl9IQU5ETEVSKTogTmV3IGFyZ3VtZW50IGBjcHUnLgorCShzaW1fYWRkX29wdGlvbl90YWJsZSk6IFVwZGF0ZSBwcm90b3R5cGUuCisJKiBzaW0tb3B0aW9ucy5jIChzaW1fYWRkX29wdGlvbl90YWJsZSk6IE5ldyBhcmd1bWVudCBgY3B1Jy4KKwkoc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIsc3RhbmRhcmRfaW5zdGFsbCk6IFVwZGF0ZS4KKwkoc2ltX3BhcnNlX2FyZ3MpOiBIYW5kbGUgY3B1IHNwZWNpZmljIG9wdGlvbnMuCisJKHByaW50X2hlbHApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCShzaW1fcHJpbnRfaGVscCk6IENhbGwgaXQuICBQcmludCBjcHUgc3BlY2lmaWMgb3B0aW9ucy4KKwkoZmluZF9tYXRjaCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHNpbV9hcmdzX2NvbW1hbmQpOiBDYWxsIGl0LiAgSGFuZGxlIGNwdSBzcGVjaWZpYyBvcHRpb25zLgorCSogc2ltLXV0aWxzLmMgKHNpbV9jcHVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgorCSogc2ltLW1lbW9wdC5jIChtZW1vcnlfb3B0aW9uX2hhbmRsZXIpOiBVcGRhdGUuCisJKHNpbV9tZW1vcHRfaW5zdGFsbCk6IFVwZGF0ZS4KKwkqIHNpbS1tb2RlbC5jIChtb2RlbF9vcHRpb25faGFuZGxlcik6IFVwZGF0ZS4KKwkobW9kZWxfaW5zdGFsbCk6IFVwZGF0ZS4KKwkqIHNpbS1wcm9maWxlLmMgKHByb2ZpbGVfb3B0aW9uX2hhbmRsZXIpOiBVcGRhdGUuCisJKHByb2ZpbGVfaW5zdGFsbCk6IFVwZGF0ZS4KKwkqIHNpbS10cmFjZS5jICh0cmFjZV9vcHRpb25faGFuZGxlcik6IFVwZGF0ZS4KKwkodHJhY2VfaW5zdGFsbCk6IFVwZGF0ZS4KKwkqIHNpbS13YXRjaC5jICh3YXRjaHBvaW50X29wdGlvbl9oYW5kbGVyKTogVXBkYXRlLgorCShzaW1fd2F0Y2hwb2ludF9pbnN0YWxsKTogVXBkYXRlLgorCSogY2dlbi1zY2FjaGUuYyAoc2NhY2hlX29wdGlvbl9oYW5kbGVyKTogVXBkYXRlLgorCShzY2FjaGVfaW5zdGFsbCk6IFVwZGF0ZS4KKworV2VkIEZlYiAyNSAxMTowMDoyNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlLWNvbW1vbi5pbiAoY2hlY2spOiBSdW4gYG1ha2UgY2hlY2snIGluIHRlc3RzdWl0ZSBkaXIuCisKK1dlZCBGZWIgMjUgMTQ6NDA6MjQgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tdHJhY2UuYyAodHJhY2VfcmVzdWx0MCk6IE5ldyBmdW5jdGlvbi4KKworCSogc2ltLXRyYWNlLmggKFRSQUNFX0ZQXyosIFRSQUNFX0ZQVV8qKTogUmVuYW1lIFRSQUNFX0ZQVV8qCisgCW1hY3JvJ3MgdG8gVFJBQ0VfRlBfKi4gVFJBQ0VfRlBVXyogc2hvdWxkIGJlIGRlZmluZWQgYW5kIHVzZWQgd2hlbgorIAl0cmFjaW5nIHNpbV9mcHUgdmFyaWFibGVzLgorCShUUkFDRV9BTFVfUkVTVUxUMCk6IERlZmluZS4KKwkoVFJBQ0VfRlBfUkVTVUxUX1dPUkQpOiBEZWZpbmUuCisJKFRSQUNFX0ZQX0lOUFVUX1dPUkQxKTogRGVmaW5lLgorCisJKiBzaW0tZnB1LmMsIHNpbS1mcHUuaCAoc2ltX2ZwdV9tYXgzMiwgc2ltX2ZwdV9tYXg2NCwgc2ltX2ZwdV9vbmUsCisgCXNpbV9mcHVfdHdvKTogTmV3IGNvbnN0YW50cy4KKwkoc2ltX2ZwdV9vcDEsIHNpbV9mcHVfb3AyKTogTmV3IHR5cGVzLgorCShzdHJ1Y3QgX3NpbV9mcHUpOiBEZWxldGUgbWVtYmVyIHJlc3VsdC4gIFJlLW9yZGVyIG90aGVyIG1lbWJlcnMuCisJKHNpbV9mcHVfc2lnbiwgc2ltX2ZwdV9leHApOiBOZXcgZnVuY3Rpb25zLgorCShzaW1fZnB1X21heCwgc2ltX2ZwdV9taW4pOiBuZXcgZnVuY3Rpb25zLgorCShFWFBNQVgzMiwgRVhQTUFYNjQsIE5SX1BBRDMyLCBOUl9QQUQ2NCwgTlJfR1VBUkRTMzIsIE5SX0dVQVJEUzY0LAorIAlOT1JNQUxfRVhQTUFYMzIsIE5PUk1BTF9FWFBNQVg2NCk6IERlZmluZS4KKwkKK1R1ZSBGZWIgMjQgMjI6NDU6MzkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIHNpbS1wcm9maWxlLmMgKHByb2ZpbGVfcHJpbnQpOiBEZWxldGUgZHVwbGljYXRlIHRlc3Qgb2YKKwlQUk9GSUxFX0lOU05fSURYLgorCShwcm9maWxlX3ByaW50X3BjKTogRXhpdCBlYXJseSBpZiBkYXRhIGNvbGxlY3Rpb24gbm90IHNldCB1cC4KKwkocHJvZmlsZV9wcmludF9jb3JlKTogU2ltcGxpZnkgYnkgY2FsbGluZyBzaW1fY29yZV9tYXBfdG9fc3RyLgorCSogc2ltLWNvcmUuaCAoc2ltX2NvcmVfbWFwX3RvX3N0cik6IERlY2xhcmUuCisJKiBzaW0tY29yZS5jIChzaW1fY29yZV9tYXBfdG9fc3RyKTogTWFrZSBub24tc3RhdGljLgorCisJKiBnZW5tbG9vcC5zaCAoZW5naW5lX3Jlc3VtZSk6IFVwZGF0ZSBpbnNuX2NvdW50IGJlZm9yZSBleGl0aW5nLgorCShlbmdpbmVfcmVzdW1lX2Z1bGwpOiBLZWVwIGFjY3VyYXRlIGNvcmUgcHJvZmlsZSBkYXRhLgorCisJKiBjZ2VuLXV0aWxzLmMgKHNpbV9kaXNhc3NlbWJsZV9pbnNuKTogRG9uJ3QgdXNlCisJc2ltX2NvcmVfcmVhZF9hbGlnbmVkX04sIGl0IG1lc3NlcyB1cCBwcm9maWxpbmcgcmVzdWx0cy4KKworTW9uIEZlYiAyMyAyMDo0NTo1NyAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIG5sdHZhbHMuZGVmOiBSZWdlbmVyYXRlIHdpdGggTU4xMDMwMCBhZGRpdGlvbnMuCisKK1R1ZSBGZWIgMjQgMTM6MTg6NDIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tdHJhY2UuaCAoVFJBQ0VfQUxVX1JFU1VMVDIpOiBEZWZpbmUuCisJCisJKiBzaW0tdHJhY2UuaCwgc2ltLXRyYWNlLmMgKHRyYWNlX3Jlc3VsdF93b3JkMiwKKyAJdHJhY2VfaW5wdXRfd29yZDQsIHRyYWNlX3Jlc3VsdF93b3JkNCk6IE5ldyBmdW5jdGlvbi4KKworTW9uIEZlYiAyMyAxMzowODozNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjZ2VuLXNpbS5oIChTRU1fTkVYVF9QQyk6IE5ldyBhcmcgYGxlbicuCisKKwkqIHNpbS14Y2F0Lmg6IERlbGV0ZS4KKwkqIGNnZW4tbWVtLmg6IERlbGV0ZSBpbmNsdXNpb24gb2Ygc2ltLXhjYXQuaC4KKwkqIGNnZW4tc2ltLmg6IERpdHRvLgorCSogc2ltLWFsdS5oOiBSZXBsYWNlIHNpbS14Y2F0Lmggd2l0aCBzeW1jYXQuaC4KKwkqIHNpbS1uLWJpdHMuaDogRGl0dG8uCisJKiBzaW0tbi1jb3JlLmg6IERpdHRvLgorCSogc2ltLW4tZW5kaWFuLmg6IERpdHRvLgorCitNb24gRmViIDIzIDEzOjE5OjU4IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBzeXNjYWxsLmMgKGNiX3N5c2NhbGwpOiBIYW5kbGUgc2hvcnQgcmVhZHMsIGFuZCBFT0YuCisKK1R1ZSBGZWIgMjQgMDA6Mjk6NTcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tdHJhY2UuYyAocHJpbnRfZGF0YSk6IGNhc2UgdHJhY2VfZm10X2ZwIG1pc3NpbmcgYnJlYWsuICBVc2UKKyAJc2ltX2ZwdSB0byBzYWZlbHkgcHJpbnQgZnBfd29yZCB2YWx1ZXMuCisJKHByaW50X2RhdGEpOiBBZGQgdHJhY2VfZm10X2Jvb2wgYW5kIHRyYWNlX2ZtdF9hZGRyLgorCSh0cmFjZV9yZXN1bHRfYm9vbDEsIHRyYWNlX3Jlc3VsdF9hZGRyMSk6IE5ldyBmdW5jdGlvbnMuCisJKHRyYWNlX2lucHV0X2Jvb2wxLCB0cmFjZV9pbnB1dF9hZGRyMSk6IE5ldyBmdW5jdGlvbnMuCisKKwkqIHNpbS10cmFjZS5oIChUUkFDRV9GUFVfKik6IERlZmluZS4KKworTW9uIEZlYiAyMyAxMzoyNDo1NCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1mcHUuaCAoZW51bSBzaW1fZnB1X2NsYXNzKTogQWRkIHNpbV9mcHVfY2xhc3NfZGVub3JtLgorCShzaW1fZnB1X2ZwdG8sIHNpbV9mcHVfdG9mcCk6IERlZmluZS4KKworRnJpIEZlYiAyMCAxODowODo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1mcHUuYyAoc2ltX2ZwdV9jbXApOiBOZXcgZnVuY3Rpb24uCisKK1dlZCBGZWIgMTggMTY6Mjk6MjEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY2dlbi11dGlscy5oIChzaW1fZGlzYXNzZW1ibGVfaW5zbik6IFVzZSBDR0VOX0lOU05fQklUU0laRQorCWluc3RlYWQgb2YgYWJ1Zi0+bGVuZ3RoLgorCSogc2ltLXRyYWNlLmMgKHRyYWNlX29wdGlvbnMpOiBIYXZlIC10IG9ubHkgdHJhY2UgYSBmZXcgdXNlZnVsIHRoaW5ncy4KKwkoc2V0X3RyYWNlX29wdGlvbl9tYXNrKTogUmVuYW1lZCBmcm9tIHNldF90cmFjZV9vcHRpb25zLgorCShzZXRfdHJhY2Vfb3B0aW9uKTogTmV3IGZ1bmN0aW9uLgorCSh0cmFjZV9vcHRpb25faGFuZGxlcik6IFVwZGF0ZSBjYWxscyB0byBzZXRfdHJhY2Vfb3B0aW9ueyxfbWFza30uCisJKiBzaW0tdHJhY2UuaCAoVFJBQ0VfVVNFRlVMX01BU0spOiBOZXcgbWFjcm8uCisKK1dlZCBGZWIgMTggMTI6NDI6MTUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tYmFzaWNzLmg6IERlY2xhcmUgc3RydWN0IF9zaW1fZnB1LgorCitUdWUgRmViIDE3IDE2OjI3OjQ2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLXRyYWNlLmggKFRSQUNFX0FMVV9JTlBVVCosIFRSQUNFX0FMVV9SRVNVTFQpOiBEZWZpbmUuCisJKHRyYWNlX3ByZWZpeCwgdHJhY2VfaW5wdXQqLCB0cmFjZV9yZXN1bHQqKTogRGVjbGFyZS4KKwkodHJhY2Vfb25lX2luc24pOiBDaGFuZ2UgZGVjbGFyYXRpb24sIGFzc3VtZSB0cmFjZV9wcmVmaXggY2FsbGVkLgorCSh0cmFjZV9nZW5lcmljKTogTGlrZSB0cmFjZV9vbmVfaW5zbi4KKwkoVFJBQ0VfQUxVX0lEWCwgVFJBQ0VfKl9JRFgpOiBDaGFuZ2UgI2RlZmluZSdzIHRvIGVudW0uCisJKFRSQUNFX2FsdSwgVFJBQ0VfW2Etel0qKTogVXBkYXRlLgorCQorCSogc2ltLXRyYWNlLmMgKHRyYWNlX3ByZWZpeCwgdHJhY2VfaW5wdXQqLCB0cmFjZV9yZXN1bHQqLAorIAl0cmFjZV9pbnNuLCBzYXZlX2RhdGEsIHRyYWNlX2lkeF90b19zdHIsIHByaW50X2RhdGEpOiBOZXcKKyAJZnVuY3Rpb25zLgorCSh0cmFjZV9vbmVfaW5zbik6IFJld3JpdGUuCisJKHRyYWNlX2dlbmVyaWMpOiBOZXcgZnVuY3Rpb24uCisJCitUdWUgRmViIDE3IDE3OjI3OjMwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBNYWtlLWNvbW1vbi5pbiAoQ0dFTl9NQUlOX1NDTSk6IFVwZGF0ZS4KKwkqIGFjbG9jYWwubTQgKFVTRV9NQUlOVEFJTkVSX01PREUpOiBOZXcgdmFyaWFibGUuCisKKwkqIGNnZW4tc2ltLmggKFNFTUFOVElDX0NBQ0hFX0ZOKTogRGVsZXRlLgorCShTRU1BTlRJQ19GTik6IFJld3JpdGUgZGVjbGFyYXRpb24uCisJKERFQ09ERSk6IFVwZGF0ZSB0eXBlIG9mIHNlbWFudGljX2Zhc3QgbWVtYmVyLgorCSh7RVgsU0VNfV9GTl9OQU1FKTogSGF2ZSBvbmx5IG9uZSB2ZXJzaW9uLgorCSogY2dlbi5zaDogU3VwcG9ydCBidWlsZGluZyBjcHUuYy4KKwkqIHNpbS1iYXNlLmggKHNpbV9zdGF0ZV9iYXNlKTogRGVsZXRlIGNvbmRpdGlvbmFscyBzdXJyb3VuZGluZworCW1lbWJlciBzY2FjaGVfc2l6ZS4KKworVHVlIEZlYiAxMCAxODozMTo0OSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1sb2FkLmMgKHNpbV9sb2FkX2ZpbGUpOiBQcmludCBMTUEvVk1BIGFjY29yZGluZyB0byB2YWx1ZQorIAl1c2VkLgorCitUdWUgRmViIDEwIDE0OjU2OjIzIDE5OTggIElhbiBDYXJtaWNoYWVsICA8aWFuY2FybUBjeWdudXMuY29tPgorCisJKiBzaW0tY29yZS5jOiBBZGQgbWlzc2luZyBwcm90b3R5cGVzIGZvciBXSVRIX0RFVklDRVMuCisJQWRkIG1pc3NpbmcgcGFyYW1ldGVycyB0byBkZXZpY2VfaW8gY2FsbHMuCisJKiBzaW0tY29yZS5oOiBBZGQgbWlzc2luZyBwYXJhbWV0ZXJzIHRvIGRldmljZV9pbyBjYWxscy4KKworTW9uIEZlYiAgOSAxNDo0ODozNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjZ2VuLXNpbS5oIChERUNPREUpOiBBbHdheXMgdXNlIHN3aXRjaCBmb3IgYHJlYWQnIGZvciBub3cuCisJKFBBUkVYRUMpOiBSZW5hbWVkIGZyb20gUEFSQUxMRUxfRVhFQy4gIEFsbCB1c2VzIHVwZGF0ZWQuCisJKFNFTUFOVElDeyxfQ0FDSEV9X0ZOKTogRml4IHJldHVybiB0eXBlLgorCSogY2dlbi5zaCAoZGVjb2RlKTogQWRkIHMvQGFyY2hALyRhcmNoLy4KKwkqIGdlbm1sb29wLnNoIChAY3B1QF9lbmdpbmVfcnVuKTogRGVsZXRlIGBjdXJyZW50X3N0YXRlJy4KKwkoZW5naW5lX3Jlc3VtZSk6IExpa2V3aXNlLiAgTWFrZSBgZW5naW5lJyB2b2xhdGlsZS4gIFNhdmUgY29weQorCW9mIGNwdSBwb2ludGVyIGluIHZvbGF0aWxlIG9iamVjdC4gIEluaXRpYWxpemUgcmVhZCBzd2l0Y2ggaWYKKwktcGFyYWxsZWwuCisKK1RodSBGZWIgIDUgMTM6Mjc6MDQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIGNnZW4tc2ltLmggKEVYX0ZOX05BTUUpOiBfZXhjXyAtPiBfZXhfLgorCShTRU1fSU5TTik6IE5ldyBtYWNyby4KKworVHVlIEZlYiAgMyAxNjozMTo1NiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1ydW4uYyAoc2ltX2VuZ2luZV9ydW4pOiBBc3N1bWUgSU1FTSBpcyAzMiBiaXQuCisKK1N1biBGZWIgIDEgMTY6NDc6NTEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1N1biBGZWIgIDEgMTY6MTY6NTcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tdHlwZXMuaCAoZnBfd29yZCk6IE5ldyB0eXBlLCBkZWZpbmUgYWNjb3JkaW5nIHRvCisgCVdJVEhfVEFSR0VUX0ZMT0FUSU5HX1BPSU5UX0JJVFNJWkUuCisKKwkqIGFjbG9jYWwubTQgKGRlZmF1bHRfc2ltX2Zsb2F0aW5nX3BvaW50X2JpdHNpemUpOiBBZGQKKyAJY29uZmlndXJhdGlvbiBvZiBzaXplIG9mIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycy4KKworU3VuIEZlYiAgMSAxNDowMjozMSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1wcm9maWxlLmMgKHByb2ZpbGVfcHJpbnQpOiBPbmx5IHByaW50IENQVSA8Tj4gaWYgb3RoZXIKKyAJb3V0cHV0IGlzIGdvaW5nIHRvIGFwcGVhci4KKworU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworU2F0IEphbiAzMSAxODowMzo1NSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS10eXBlcy5oIChhZGRyZXNzX3dvcmQpOiBUeXBlZGVmIGFjY29yZGluZyB0bworIAlXSVRIX1RBUkdFVF9BRERSRVNTX0JJVFNJWkUuCisJKHNpZ25lZF9jZWxsLCB1bnNpZ25lZF9jZWxsLCBuYXR1cmFsX2NlbGwpOiBEaXR0byB1c2luZworIAlXSVRIX1RBUkdFVF9DRUxMX0JJVFNJWkUuCisJCisJKiBzaW0tY29uZmlnLmggKFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRSk6IERlZmluZS4KKwkoV0lUSF9UQVJHRVRfQ0VMTF9CSVRTSVpFKTogRGVmaW5lLgorCShXSVRIX0hPU1RfV09SRF9CSVRTSVpFKTogRGVsZXRlLgorCisJKiBzaW0tY29uZmlnLmMgKHByaW50X3NpbV9jb25maWcpOiBVcGRhdGUuCisKKwkqIGFjbG9jYWwubTQgKFNJTV9BQ19PUFRJT05fQklUU0laRSk6IEFkZCBzdXBwb3J0IGZvcgorIAljb25maWd1cmF0aW9uIG9mIGFkZHJlc3MgYW5kIE9wZW5GaXJtd2FyZSBjZWxsIHNpemVzLgorCitGcmkgSmFuIDMwIDA5OjM2OjMzIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWVuZ2luZS5oIChzaW1fZW5naW5lX3J1bik6IEFkZCBhcmd1bWVudCBucl9jcHVzLgorCSogc2ltLXJ1bi5jIChzaW1fZW5naW5lX3J1bik6IFVwZGF0ZS4KKwkKKwkqIHNpbS1lbmdpbmUuaCAoU0lNX0VOR0lORV9IQUxUX0hPT0spOiBVc2UgU0VUX0NQVV9DSUEgaW5zdGVhZCBvZgorIAlDUFVfQ0lBLgorICAJKiBzaW0tcnVuLmMgKHNpbV9lbmdpbmVfcnVuKTogRGl0dG8uCisKKwkqIHNpbS1yZXN1bWUuYyAoc2ltX3Jlc3VtZSk6IE9idGFpbiBucl9jcHVzIGZyb20gc2ltX2VuZ2luZS4KKwkoc2ltX3Jlc3VtZSk6IFBhc3MgbnJfY3B1cyB0byBzaW1fZW5naW5lX3J1bi4KKworCSogc2ltLWVuZ2luZS5oIChzdHJ1Y3QgX3NpbV9lbmdpbmUpOiBBZGQgbWVtYmVyIG5yX2NwdXMuCisJCisJKiBzaW0tZW5naW5lLmMgKHNpbV9lbmdpbmVfaW5pdCk6IEhhcmR3aXJlIG5yX2NwdXMgdG8KKyAJTUFYX05SX1BST0NFU1NPUlMuCisJKHNpbV9lbmdpbmVfbnJfY3B1cykgc2ltLWVuZ2luZS5jLCBzaW0tZW5naW5lLmg6IE5ldyBmdW5jdGlvbgorCQorVGh1IEphbiAyOSAxMjoxMzowMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjZ2VuLnNoOiBQb3J0YWJseSByZWFkIHBhcm1zIHBhc3QgJDkuCisKK0ZyaSBKYW4gMjMgMTQ6MjA6NTQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIE1ha2UtY29tbW9uLmluIChzdGFtcC10dmFscyk6IE5ldyBydWxlLgorCSh0YXJnLXZhbHMuaCx0YXJnLW1hcC5jKTogRGVwZW5kIG9uIGl0LgorCShjbGVhbik6IFJlbW92ZSBzdGFtcC10dmFscy4KKworVHVlIEphbiAyMCAyMTozNToxMyAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogc2ltLXV0aWxzLmMgKHNpbV9zdGF0ZV9hbGxvYyk6ICNpZiAwIHZhcmlhYmxlIHRoYXQgaXMgb25seSB1c2VkCisJaW4gY29kZSBhbHNvICNpZiAwJ2VkLgorCitNb24gSmFuIDE5IDIyOjI2OjI5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogYWNsb2NhbC5tNDogUmVjb2duaXplIC0tZW5hYmxlLW1haW50YWluZXItbW9kZS4KKworTW9uIEphbiAxOSAxMjo0NTo0NSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogY2dlbi1zY2FjaGUuaDogRGVsZXRlZC4KKwkqIE1ha2UtY29tbW9uLmluIChjZ2VuLXJ1bi5vLGNnZW4tc2NhY2hlLm8pOiBEZWxldGUgY2dlbi1zY2FjaGUuaCBkZXAuCisJKENHRU5fQ1BVX1NDTSk6IEFkZCBzaW0tbW9kZWwuc2NtLgorCSogY2dlbi1zY2FjaGUuYzogT25seSBjb21waWxlIGNvbnRlbnRzIGlmIFdJVEhfU0NBQ0hFLgorCShzY2FjaGVfaW5pdCk6IFVzZSBydW50aW1lIGNvbXB1dGVkIHNpemUgb2YgU0NBQ0hFLgorCShzY2FjaGVfZmx1c2gpOiBMaWtld2lzZS4KKwkqIGNnZW4tbWVtLmggKEdFVElNRU1VW1FIU0RdSSk6IERlY2xhcmUuCisJKFtHU11FVFR7UUksVVFJLEhJLFVISSxTSSxVU0ksREksVURJfSk6IERlY2xhcmUuCisJKiBjZ2VuLXNpbS5oOiBTY2FjaGUgc3VwcG9ydCBtb3ZlZCBoZXJlLgorCShQQyk6IFJlZG8gZGVmaW5pdGlvbi4KKwkoQVJHQlVGLFNDQUNIRSxQQVJBTExFTF9FWEVDKTogUHJvdmlkZSBmb3J3YXJkIGRlY2xzLgorCShERUNPREUpOiBBZGQgcGFyYWxsZWwgZXhlY3V0aW9uIHN1cHBvcnQuCisJT25seSBpbmNsdWRlIHNlbWFudGljIGxhYmVsIG1lbWJlcnMgaWYgdXNpbmcgc3dpdGNoLgorCShTV0lUQ0gsQ0FTRSxCUkVBSyxERUZBVUxULEVORFNXSVRDSCk6IFBvcnRhYmxlIGNvbXB1dGVkIGdvdG8gc3VwcG9ydC4KKwkoQ0dFTl9DUFUpOiBEZWxldGUgbWVtYmVycyBleGVjX3N0YXRlLCBoYWx0X3NpZ3JjLCBoYWx0X2ptcF9idWYuCisJKElBRERSLENJQSxTRU1fQVJHLEVYX0ZOX05BTUUsU0VNX0ZOX05BTUUsUkVDT1JEX0lBRERSLFNFTV9BUkdCVUYsCisJU0VNX05FWFRfUEMsU0VNX0JSQU5DSF9WSUFfe0NBQ0hFLEFERFJ9LFNFTV9ORVdfUENfQUREUik6IE1vdmVkIGhlcmUKKwlmcm9tIGNnZW4tdHlwZXMuaC4KKwkoZW5naW5lX3tzdG9wLHJ1bixyZXN1bWUsaGFsdCxzaWduYWx9KTogRGVsZXRlIGRlY2xzLgorCSogY2dlbi10eXBlcy5oIChDR0VOX3tYQ0FUMyxDQVQzfSk6IERlbGV0ZS4KKwkoYXJnYnVmLHNjYWNoZSk6IERlbGV0ZSBmb3J3YXJkIGRlY2xzLgorCShTVEFURSk6IERlbGV0ZSBkZWNsLgorCSogY2dlbi11dGlscy5jOiBEb24ndCBpbmNsdWRlIGRlY29kZS5oLCBtZW0tb3BzLmgsIHNlbS1vcHMuaC4KKwlJbmNsdWRlIGNnZW4tbWVtLmgsIGNnZW4tb3BzLmguCisJKGVuZ2luZV9oYWx0LGVuZ2luZV9zaWduYWwpOiBEZWxldGUuCisJKHtleCxleGMsc2VtLHNlbWN9X2lsbGVnYWwpOiBEZWxldGUuCisJKHNpbV9kaXNhc3NlbWJsZV9pbnNuKTogUmVzdWx0IG9mIGV4dHJhY3QgZm4gaXMgaW4gYml0cy4KKwkqIGdlbm1sb29wLnNoOiBSZXdyaXRlLgorCisJKiBjZ2VuLXRyYWNlLmMgKHRyYWNlX2luc24pOiBTZXQgcHJpbnRlZF9yZXN1bHRfcD0wIGlmIG5vdCB0cmFjaW5nCisJbGluZSBudW1iZXJzLgorCisJKiBzaW0tYmFzZS5oIChzaW1fc3RhdGVfYmFzZSk6IERlbGV0ZSBtZW1iZXIgYG1vZGVsJy4KKwkoc2ltX2NwdV9iYXNlKTogQWRkIG1lbWJlciBgbW9kZWwnLgorCSogc2ltLW1vZGVsLmggKElNUF9QUk9QRVJUSUVTKTogTmV3IHR5cGUuCisJKE1BQ0gpOiBOZXcgbWVtYmVycyBpbXBfcHJvcHMsIG1vZGVscy4KKwkobW9kZWxzKTogRGVsZXRlIGRlY2wuCisJKiBzaW0tbW9kZWwuYyAoc2V0X21vZGVsKTogVXBkYXRlLgorCSogc2ltLXByb2ZpbGUuYyAocHJvZmlsZV9wcmludF9tb2RlbCk6IFVwZGF0ZS4KKworCSogc2ltLXV0aWxzLmMgKHNpbV9zdGF0ZV9hbGxvYyk6IERlbGV0ZSBzZXR0aW5nIG9mIGNwdSBiYWNrbGluayBoZXJlLgorCitGcmkgSmFuIDE2IDEyOjMzOjA5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNnZW4tdHJhY2UuYyAodHJhY2VfaW5zbik6IENhbGwgQ0dFTl9JTlNOX01ORU1PTklDKCkgcmF0aGVyIHRoYW4KKwlDR0VOX0lOU05fU1lOVEFYKCkuCisKK01vbiBEZWMgMTUgMjM6MTc6MTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitNb24gRGVjIDE1IDIzOjE2OjAzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNCAoQVIpOiBDaGVjayBmb3Igc2lnYWN0aW9uLgorCitUaHUgRGVjICA0IDA5OjIxOjA1IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2UtY29tbW9uLmluIChzaW0tY29yZS5vKTogRGVwZW5kIG9uICQoc2ltX21haW5faGVhZGVycykuCisKKwkqIHNpbS1jb25maWcuaCAoV0lUSF9UUkVFX1BST1BFUlRJRVMpOiBEZWZpbmUgYXMgMC4KKwkqIHNpbS1jb25maWcuYyAoc2ltX2NvbmZpZyk6IFJlcGxhY2UgV0lUSF9ERVZJQ0VTIHdpdGgKKwlXSVRIX1RSRUVfUFJPUEVSVElFUy4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgRGVjICAzIDE3OjU2OjAyIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2UtY29tbW9uLmluIChTSU1fRU5WSVJPTk1FTlQpOiBOZXcgdmFyaWFibGUuCisJKENPTkZJR19DRkxBR1MpOiBBZGQgaXQuCisJKiBhY2xvY2FsLm00IChTSU1fQUNfT1BUSU9OX0VOVklST05NRU5UKTogSGFuZGxlCisJLS1lbmFibGUtc2ltLWVudmlyb25tZW50IG9wdGlvbi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBzaW0tY29uZmlnLmggKGVudmlyb25tZW50IHN1cHBvcnQpOiBSZXdyaXRlLgorCSogc2ltLWNvbmZpZy5jIChjdXJyZW50X2Vudmlyb25tZW50KTogRGVmaW5lIGFzIGVudW0sIHVuY29uZGl0aW9uYWxseS4KKwkoY3VycmVudF9hbGlnbm1lbnQpOiBEZWZpbmUgdW5jb25kaXRpb25hbGx5LgorCShjb25maWdfZW52aXJvbm1lbnRfdG9fYSk6IFVwZGF0ZS4KKwkoY29uZmlnX2FsaWdubWVudF90b19hKTogRml4IHR5cGUgb2YgYXJndW1lbnQuICBEZWZpbmUgdW5jb25kaXRpb25hbGx5LgorCShzaW1fY29uZmlnKTogSGFuZGxlIGVudmlyb25tZW50IGFuZCBhbGlnbm1lbnQgZGV0ZXJtaW5hdGlvbgorCXVuY29uZGl0aW9uYWxseS4gIERlbGV0ZSBzYW5pdHkgY2hlY2tzIG9mIGN1cnJlbnRfZW52aXJvbm1lbnQsCisJdW5uZWNlc3NhcnkuCisJKHByaW50X3NpbV9jb25maWcpOiBVcGRhdGUuCisJKiBzaW0tb3B0aW9ucy5jIChTVEFOREFSRF9PUFRJT05TIGVudW0pOiBBZGQgT1BUSU9OX0VOVklST05NRU5ULgorCShzdGFuZGFyZF9vcHRpb25zKTogQWRkIC0tZW52aXJvbm1lbnQuCisJKHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyKTogTGlrZXdpc2UuCisKK0ZyaSBOb3YgMjggMTI6MjE6MjUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tYWx1Lmg6IEFkZCBub3RlcyBvbiBjYXJyeSB2cyBib3Jyb3cgZm9yIHN1YnRyYWN0aW9uLgorCShBTFV7LDgsMTYsMzIsNjR9QUREKTogUmVkZWZpbmUgQUREIG1hY3JvIGFzIGFkZCBvdmVyZmxvd2luZy4KKwkoQUxVeyw4LDE2LDMyLDY0fUFEREMpOiBEZWZpbmUgLSBhZGQgY2FycnlpbmcuCisJKEFMVXssOCwxNiwzMiw2NH1TVUIpOiBSZWRlZmluZSBTVUIgbWFjcm8gYXMgc3VidHJhY3Qgb3ZlcmZsb3dpbmcuCisJKEFMVXssOCwxNiwzMiw2NH1TVUJCKTogRGVmaW5lIC0gc3VidHJhY3QgYm9ycm93aW5nLgorCShBTFV7LDgsMTYsMzIsNjR9U1VCQyk6IERlZmluZSAtIHRyYWN0IGNhcnJ5aW5nLgorCShBTFV7LDgsMTYsMzIsNjR9QUREX0NBLCBBTFV7LDgsMTYsMzIsNjR9QUREQ19DKTogUmVwbGFjZSBzaW5nbGUKKyAJYXJndW1lbnQgQUREX0NBIG1hY3JvIHdpdGggdHdvIGFyZ3VtZW50IEFERENfQyAtIGFkZCBjYXJyeWluZyB3aXRoCisgCWNhcnJ5IGluLgorCShBTFV7LDgsMTYsMzIsNjR9U1VCX0NBLCBBTFV7LDgsMTYsMzIsNjR9U1VCQ19YKTogUmVwbGFjZSBzaW5nbGUKKyAJYXJndW1lbnQgU1VCX0NBIG1hY3JvIHdpdGggdHdvIGFyZ3VtZW50IFNVQkNfWCAtIHN1YnRyYWN0CisgCWNhcnJ5aW5nLCBleHRlbmRlZC4KKwkoQUxVeyw4LDE2LDMyLDY0fVNVQkJfQik6IERlZmluZSAtIHN1YnRyYWN0IGJvcnJvd2luZyB3aXRoCisgCWJvcnJvdy1pbi4KKwkoQUxVeyw4LDE2LDMyLDY0fU5FR0MsIEFMVXssOCwxNiwzMiw2NH1ORUdCKTogRGVmaW5lLgorCitTdW4gTm92IDMwIDE3OjQwOjU3IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBzaW0taW8uYyAoc2ltX2lvX3tzeXNjYWxscyxnZXRzdHJpbmd9KTogRGVsZXRlLiAgTm8gbG9uZ2VyIHVzZWQuCisJKiBzaW0taW8uaCAoc2ltX2lvX3N5c2NhbGxzKTogRGVsZXRlLgorCitGcmkgTm92IDI4IDIwOjEwOjA5IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBzeXNjYWxsLmMgKGNiX3N5c2NhbGwpOiBBZGQgbWlzc2luZyBlbHNlLCBzbyB3cml0ZSB0byBzdGRvdXQKKwlpc24ndCBkb3VibGVkLgorCisJKiBzaW0tYWx1LmggKEFMVXssOCwxNiwzMiw2NH1fU0VUX0NBUlJZKTogUHJvdmlkZSBtYWNyb3MgdG8gaW1wb3J0CisJdGhlIGNhcnJ5IGJpdCBmcm9tIHRoZSBDUFUncyBwc3cuCisKK0ZyaSBOb3YgMjggMTE6MTU6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZ2Vubmx0dmFscy5zaDogUmVkbyBzeXNjYWxsIHN1cHBvcnQuCisJKiBubHR2YWxzLmRlZjogUmVnZW5lcmF0ZWQuCisKK1dlZCBOb3YgMjYgMTY6NDk6MzggMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIHN5c2NhbGwuYyAoY2Jfc3lzY2FsbCk6IElmIHdyaXRpbmcgdG8gc3Rkb3V0IG9yIHN0ZGVyciwgZmx1c2gKKwl0aGUgc3RyZWFtIGltbWVkaWF0ZWx5LgorCitXZWQgTm92IDI2IDEyOjMyOjExIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWlvLmMgKHNpbV9pb19nZXRzdHJpbmcpOiBEZWxldGUgdW51c2VkIGxlbjIuCisJKHNpbV9pb19zeXNjYWxscyk6IERpdHRvIGZvciBzeXNfZXJybm8uCisKK1dlZCBOb3YgMjYgMTE6MTg6NDAgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc3lzY2FsbC5jIChjYl9zeXNjYWxsKTogVGVzdCBDQl9TWVNDQUxMIHN0cnVjdCBtYWdpYyBudW1iZXIuCisKKwkqIE1ha2UtY29tbW9uLmluIChydW4ubyk6IERlcGVuZCBvbiByZW1vdGUtc2ltLmguCisJKG5ydW4ubyxzaW0taGxvYWQubyxzaW0taHJ3Lm8pOiBMaWtld2lzZS4KKwkoc2ltLWlvLm8sc2ltLXJlYXNvbi5vLHNpbS1yZXN1bWUubyk6IExpa2V3aXNlLgorCitUdWUgTm92IDI1IDIwOjEyOjQ2IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBzaW0taW8uYyAoc2ltX2lvX3N5c2NhbGxzKTogRGlzYWJsZSBsc2Vlay4KKworVHVlIE5vdiAyNSAwMDoxMjozOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogZ2Vubmx0dmFscy5zaDogR2VuZXJhdGUgc3lzY2FsbCB2YWx1ZXMgZm9yIGQzMHYuCisKKwkqIGdlbm5sdHZhbHMuc2g6IFVzZSBsaWJnbG9zcy9zeXNjYWxsLmggZm9yIHNwYXJjLgorCSogbmx0dmFscy5kZWY6IFJlZ2VuZXJhdGUuCisKKwkqIGNhbGxiYWNrLmMgKG9zX3N0YXQpOiBNYWtlIDNyZCBhcmcgYSBob3N0IHN0cnVjdCBzdGF0IHB0ci4KKwkob3NfZnN0YXQpOiBMaWtld2lzZS4gIFZhbGlkYXRlIGZkIGFyZ3VtZW50LgorCShjYl9ob3N0X3RvX3RhcmdldF9zdGF0KTogRGVsZXRlIGJpZ19wIGFyZy4gIElmIEhTIGFyZyBpcyBOVUxMLAorCWp1c3QgY29tcHV0ZSB0YXJnZXQgc3RhdCBzdHJ1Y3QgbGVuZ3RoLgorCSogc3lzY2FsbC5jOiAjaW5jbHVkZSAibGliaWJlcnR5LmgiLCA8c3lzL3R5cGVzLmg+LCA8c3lzL3N0YXQuaD4uCisJKEVOT1NZUyxFTkFNRVRPT0xPTkcpOiBQcm92aWRlIGRlZmluaXRpb25zIGlmIG1pc3NpbmcuCisJKGdldF9zdHJpbmcpOiBSZXR1cm4gaG9zdCBlcnJubyB2YWx1ZXMgc28gdGhleSBjYW4gYmUgcHJvcGVybHkKKwl0cmFuc2xhdGVkIGxhdGVyLgorCShjYl9zeXNjYWxsKTogTGlrZXdpc2UuCisJKGNiX3N5c2NhbGwsIGNhc2VzIG9wZW4sdW5saW5rKTogVXNlIGdldF9wYXRoIGluc3RlYWQgb2YgZ2V0X3N0cmluZy4KKwkoY2Jfc3lzY2FsbCwgY2FzZSByZWFkKTogVXNlIHJlYWRfc3RkaW4gZm9yIGZpbGUgZGVzY3JpcHRvciAwLgorCShjYl9zeXNjYWxsLCBjYXNlIHdyaXRlKTogVXNlIHdyaXRlX3N0ZGVyciBmb3IgZmlsZSBkZXNjcmlwdG9yIDIuCisJKGNiX3N5c2NhbGwpOiBBZGQgY2FzZXMgZm9yIGxzZWVrLCB1bmxpbmssIHN0YXQsIGZzdGF0LCB0aW1lLgorCShnZXRfcGF0aCk6IE5ldyBmdW5jdGlvbi4KKworTW9uIE5vdiAyNCAxODo1NjowNyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogc2ltLWlvLmMgKHNpbV9pb19zeXNjYWxscyk6IE5ldyBmdW5jdGlvbiB0byBwcm92aWRlIHN5c3RlbSBjYWxsCisJZW11bGF0aW9uLiAgUHJvdmlkZSBleGl0LCBvcGVuLCBjbG9zZSwgcmVhZCwgd3JpdGUsIGxzZWVrLCBhbmQKKwl1bmxpbmsuCisJKHNpbV9pb19nZXRzdHJpbmcpOiBOZXcgZnVuY3Rpb24gdG8gcmV0dXJuIGEgc3RyaW5nIGZyb20gYQorCXNpbXVsYXRlZCBtZW1vcnkgbG9jYXRpb24uCisKKwkqIHNpbS1pby5oIChzaW1faW9fc3lzY2FsbHMpOiBBZGQgZGVjbGFyYXRpb24uCisKK01vbiBOb3YgMjQgMTI6MDk6NTkgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3NpZ25hbCk6IEZpeCBzcGVsbGluZyBlcnJvciBpbiBtZXNzYWdlLgorCisJKiBzaW0taHJ3LmMgKHNpbV9yZWFkKTogVXNlIHJlYWQgbWFwLCBub3Qgd3JpdGUgbWFwLgorCisJKiBNYWtlLWNvbW1vbi5pbiAoYWxsKTogQWRkIC5nZGJpbml0LgorCSogZ2RiaW5pdC5pbjogQWRkIGR1bXAgY29tbWFuZC4KKworCSogc2ltLW1vZGVsLmMgKG1vZGVsX29wdGlvbnMpOiBVc2UgJ1wwJyBmb3IgYHNob3J0b3B0Jy4KKworCSogc2ltLXRyYWNlLmMgKHRyYWNlX29wdGlvbl9oYW5kbGVyKTogU2V0IHN0YXRlIHRyYWNlIGZpbGUKKwlmb3IgLS10cmFjZS1maWxlIGluIGFkZGl0aW9uIHRvIGNwdSdzIHZhbHVlcy4KKwkodHJhY2VfdnByaW50Zik6IElmIGNwdSA9PSBOVUxMLCB0cnkgc3RhdGUncyB0cmFjZSBmaWxlLgorCSh0cmFjZV9vcHRpb25zKTogUmVvcmdhbml6ZSB0YWJsZSwgcmV3b3JkIHNvbWUgZGVzY3JpcHRpb25zLgorCitTdW4gTm92IDIzIDEwOjU3OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWZwdS5jIChzaW1fZnB1X2Ficywgc2ltX2ZwdV9uZWcsIHNpbV9mcHVfaW52KSwgc2ltLWZwdS5oOgorIAlOZXcgZnVuY3Rpb25zLgorCitTYXQgTm92IDIyIDE5OjE2OjU0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLXJlYXNvbi5jIChzaW1fc3RvcF9yZWFzb24pOiBGb3Igc2ltX3NpZ25hbGxlZCwgcmV0dXJuIHRoZQorIAlzaWduYWwgdW50cmFuc2xhdGVkLCBkb2N1bWVudCBwcm9ibGVtIHdpdGggdGhpcy4KKworCSogbnJ1bi5jIChtYWluKTogQ2hlY2sgZm9yIGEgcHJvZyBuYW1lIG9mIGAqc3RlcCcuICBJZiBwcmVzZW50LAorIAlzdGVwIHRoZSBzaW11bGF0b3IgaW5zdGVhZCBvZiBhbGxvd2luZyBpdCB0byBydW4gZnJlZS4KKworCSogc2ltLXNpZ25hbC5jIChTSUdRVUlUKTogRGVmaW5lIG9uIF9NU0NfVkVSIGhvc3RzLgorCisJKiBNYWtlLWNvbW1vbi5pbiAoc2ltX21haW5faGVhZGVycyk6IEFkZCBzaW0tc2lnbmFsLmguCisKK0ZyaSBOb3YgMjEgMDk6MzI6MzIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tc2lnbmFsLmMgKHNpbV9zaWduYWxfdG9faG9zdCk6IFJldHVybiAwIGZvciBTSU1fU0lHTk9ORS4KKworVGh1IE5vdiAyMCAyMDozNToyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1zaWduYWwuaDogU3RhcnQgc2ltdWxhdG9yIHNpZ25hbHMgYXQgNjQgc28gdGhhdCBob3N0IHNpZ25hbAorIAludW1iZXJzIGNhbiBiZSBkZXRlY3RlZCBhbmQgcmVwb3J0ZWQuCisKKwkqIHNpbS1zaWduYWwuaCAoU0lNX1NJR0ZQRSksIHNpbS1zaWduYWwuaDogQWRkIHNpZ25hbC4KKworV2VkIE5vdiAxOSAxMjowMjo0MSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogY2FsbGJhY2suYyAoY2JfaG9zdF90b190YXJnZXRfc3RhdCk6IEZpeCByZXR1cm4gdmFsdWVzLgorCisJKiBjZ2VuLXNpbS5oIChlbnVtX3NpZ25hbF90eXBlKTogRGVsZXRlLgorCShlbmdpbmVfc2lnbmFsKTogVXBkYXRlIHByb3RvdHlwZS4KKwkqIGNnZW4tdXRpbHMuYzogRG9uJ3QgaW5jbHVkZSA8c2lnbmFsLmg+LgorCShzaW1fc2lnbmFsX3RvX2hvc3QpOiBEZWxldGUsIGxpdmVzIGluIHNpbS1zaWduYWwuYyBub3cuCisJKGVuZ2luZV9zaWduYWwpOiBVcGRhdGUuCisKKwkqIHNpbS11dGlscy5jIChzaW1fc3RhdGVfYWxsb2MpOiBDYWxsIFNJTV9TVEFURV9BTExPQyBpZiBkZWZpbmVkLgorCShzaW1fc3RhdGVfZnJlZSk6IENhbGwgU0lNX1NUQVRFX0ZSRUUgaWYgZGVmaW5lZC4KKworCSogc2ltLW1vZHVsZS5jIChzaW1fbW9kdWxlX2luc3RhbGwpOiBEb24ndCBsZWF2ZSBhbnkgbW9kdWxlcworCWluc3RhbGxlZCBpZiBvbmUgZmFpbHMgdG8gaW5zdGFsbC4KKworV2VkIE5vdiAxOSAxMzoyNTo0OCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogc2ltLW9wdGlvbnMuYzogRG9uJ3QgaW5jbHVkZSAuLi9saWJpYmVydHkvYWxsb2NhLWNvbmYuaCBhbnkKKwltb3JlLCBzaW5jZSBhbGxvY2EgaXMgbm90IHVzZWQgaW4gdGhpcyBmaWxlLgorCisJKiBzaW0tYWx1LmggKEFMVXszMiw2NH1fKik6IFJld3JpdGUgMzIgYW5kIDY0IGJpdCBBTFUgc3VwcG9ydCB0bworCWNvcnJlY3RseSBzZXQgdGhlIGNhcnJ5IGFuZCBvdmVyZmxvdyBiaXRzIGZvciB0aG9zZSB0eXBlcy4KKwkoQUxVezgsMTYsMzIsNjR9X3tBREQsU1VCfV9DQSk6IFRha2UgVkFMIGFyZ3VtZW50IHRvIGFkZCBhbG9uZworCXdpdGggY2FycnksIHNvIGNhcnJ5IGlzIGNvcnJlY3QgYWZ0ZXIgZG9pbmcgYm90aCBhZGRzLgorCShBTFUqKTogU3BhY2Ugb3V0ICdcJyB0byBtYWtlIGl0IGVhc2llciB0byByZWFkLgorCitUdWUgTm92IDE4IDE1OjUzOjQ1IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3NpZ25hbCk6IFVzZSBzaW1fc3RvcHBlZCBpbnN0ZWFkIG9mCisJc2ltX3NpZ25hbGxlZC4KKworCSogc2ltLXNpZ25hbC5jLCBzaW0tc2lnbmFsLmg6IE5ldyBmaWxlcy4KKwkqIE1ha2UtY29tbW9uLmluIChzaW0tc2lnbmFsLm8pOiBBZGQgcnVsZSBmb3IuCisJKFNJTV9ORVdfQ09NTU9OX09CSlMpOiBBZGQgc2ltLXNpZ25hbC5vLgorCSogc2ltLWFib3J0LmM6IERvbid0IGluY2x1ZGUgPHNpZ25hbC5oPi4KKwkqIHNpbS1iYXNpY3MuaDogI2luY2x1ZGUgInNpbS1zaWduYWwuaCIuCisJKiBzaW0tYnJlYWsuYzogRG9uJ3QgaW5jbHVkZSA8c2lnbmFsLmg+LgorCShzaW1faGFuZGxlX2JyZWFrcG9pbnQpOiBSZXBsYWNlIFNJR1RSQVAgd2l0aCBTSU1fU0lHVFJBUC4KKwkqIHNpbS1jb3JlLmM6IERvbid0IGluY2x1ZGUgPHNpZ25hbC5oPi4KKwkoU0lHQlVTKTogRGVsZXRlIGRlZmluaXRpb24uCisJKHNpbV9jb3JlX3NpZ25hbCk6IFJlcGxhY2UgU0lHU0VHVixTSUdCVVMgd2l0aCBTSU1fU0lHU0VHVixTSU1fU0lHQlVTLgorCSogc2ltLWVuZ2luZS5jOiBEb24ndCBpbmNsdWRlIDxzaWduYWwuaD4uCisJKHNpbV9lbmdpbmVfYWJvcnQpOiBSZXBsYWNlIFNJR0FCUlQgd2l0aCBTSU1fU0lHQUJSVC4KKwkqIHNpbS1yZWFzb24uYyAoc2ltX3N0b3BfcmVhc29uKTogQ2FsbCBzaW1fc2lnbmFsX3RvX2hvc3QuCisJKiBzaW0tcmVzdW1lLmM6IERvbid0IGluY2x1ZGUgPHNpZ25hbC5oPi4KKwkoU0lHVFJBUCk6IERlbGV0ZSBkZWZpbml0aW9uLgorCShoYXNfc3RlcHBlZCk6IFJlcGxhY2UgU0lHVFJBUCB3aXRoIFNJTV9TSUdUUkFQLgorCSogc2ltLXN0b3AuYzogRG9uJ3QgaW5jbHVkZSA8c2lnbmFsLmg+LgorCShjb250cm9sX2Nfc2ltdWxhdGlvbik6IFJlcGxhY2UgU0lHSU5UIHdpdGggU0lNX1NJR0lOVC4KKwkqIHNpbS13YXRjaC5jOiBEb24ndCBpbmNsdWRlIDxzaWduYWwuaD4uCisJKGhhbmRsZV93YXRjaHBvaW50KTogUmVwbGFjZSBTSUdJTlQgd2l0aCBTSU1fU0lHSU5ULgorCisJKiBNYWtlLWNvbW1vbi5pbiAoU0lNX05FV19DT01NT05fT0JKUyk6IE5ldyB2YXJpYWJsZS4KKworCSogc2ltLWJhc2UuaCAoQ0lBX0FERFIpOiBQcm92aWRlIGRlZmF1bHQgZGVmaW5pdGlvbi4KKwkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3NpZ25hbCk6IFVzZSBDSUFfQUREUiB0byBmZXRjaCB2YWx1ZS4KKwkqIHNpbS1icmVhay5jIChzaW1faGFuZGxlX2JyZWFrcG9pbnQpOiBMaWtld2lzZS4KKworTW9uIE5vdiAxNyAxNDoxNTozMSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogTWFrZS1jb21tb24uaW4gKHNyY2NvbSk6IE5ldyB2YXJpYWJsZS4KKworCSogTWFrZS1jb21tb24uaW4gKERFUCwgQ09NTU9OX0RFUF9DRkxBR1MpOiBEZWZpbmUuCisJKExJQl9PQkpTKTogQWRkIHN5c2NhbGwuby4KKwkoZ2VudG1hcCk6IFBhc3MgJChOTF9UQVJHRVQpIHRvICQoQ0MpLgorCShzeXNjYWxsLm8pOiBBZGQgcnVsZSBmb3IuCisJKHNpbV9tYWluX2hlYWRlcnMpOiBBZGQgJChTSU1fRVhUUkFfREVQUykuCisJKHNpbS1iaXRzLm8pOiBEZXBlbmQgb24gJChzaW0tbi1iaXRzX2gpLgorCShzaW0tbG9hZC5vKTogRGVwZW5kIG9uIGNhbGxiYWNrLmguCisKKwkqIE1ha2UtY29tbW9uLmluIChjZ2VuLSoubyk6IFVwZGF0ZSBkZXBlbmRlbmNpZXMsIG1lbS1vcHMuaCByZW5hbWVkIHRvCisJY2dlbi1tZW0uaCwgc2VtLW9wcy5oIHJlbmFtZWQgdG8gY2dlbi1vcHMuaC4KKwkqIGNnZW4tbWVtLmgsIGNnZW4tb3BzLmg6IE5ldyBmaWxlcy4KKworCSogYWNsb2NhbC5tNCAoLS1lbmFibGUtc2ltLXNjYWNoZSk6IFBhc3MgLURXSVRIX1NDQUNIRT0wIGZvciAiPW5vIi4KKworCSogTWFrZWZpbGUuaW4gKG5sdHZhbHMuZGVmKTogRGVwZW5kIG9uIGdlbm5sdHZhbHMuc2guCisJUmV3cml0ZSBidWlsZCBydWxlLgorCSogY2FsbGJhY2suYzogI2luY2x1ZGUgc3RyaW5nLmggb3Igc3RyaW5ncy5oLgorCSNpbmNsdWRlIHN5cy90eXBlcy5oIGFuZCBzeXMvc3RhdC5oLgorCShjYl9pbml0X3N5c2NhbGxfbWFwLGNiX2luaXRfZXJybm9fbWFwLGNiX2luaXRfb3Blbl9tYXApOiBEZWNsYXJlLgorCShvc19nZXRfZXJybm8sb3Nfb3Blbik6IFVwZGF0ZS4KKwkob3Nfc3RhdCxvc19mc3RhdCk6IE5ldyBmdW5jdGlvbnMuCisJKG9zX2luaXQpOiBJbml0aWFsaXplIHN5c2NhbGxfbWFwLCBlcnJub19tYXAsIG9wZW5fbWFwLgorCShkZWZhdWx0X2NhbGxiYWNrKTogQWRkIGVudHJpZXMgZm9yIG9zX3N0YXQsIG9zX2ZzdGF0LCBzeXNjYWxsX21hcCwKKwllcnJub19tYXAsIG9wZW5fbWFwLCBzaWduYWxfbWFwLCBzdGF0X21hcC4KKwkoY2JfcmVhZF90YXJnZXRfc3lzY2FsbF9tYXBzKTogTmV3IGZ1bmN0aW9uLgorCShjYl90YXJnZXRfdG9faG9zdF9zeXNjYWxsKTogTmV3IGZ1bmN0aW9uLgorCShjYl9ob3N0X3RvX3RhcmdldF9lcnJubyk6IFJlbmFtZWQgZnJvbSBob3N0X3RvX3RhcmdldF9lcnJuby4KKwkoY2JfdGFyZ2V0X3RvX2hvc3Rfb3Blbik6IFJlbmFtZWQgZnJvbSB0YXJnZXRfdG9faG9zdF9vcGVuLgorCShzdG9yZSk6IE5ldyBmdW5jdGlvbi4KKwkoY2JfaG9zdF90b190YXJnZXRfc3RhdCk6IE5ldyBmdW5jdGlvbi4KKwkqIHN5c2NhbGwuYzogTmV3IGZpbGUuCisJKiBnZW50bWFwLmMgKHN5c190ZGVmcyk6IE5ldyBnbG9iYWwuCisJKGdlbl90YXJnX3ZhbHNfaCk6IE91dHB1dCB0YXJnZXQgc3lzY2FsbCBudW1iZXJzLgorCShnZW5fdGFyZ19tYXBfYyk6IFVwZGF0ZS4gIE91dHB1dCB0YXJnZXQgc3lzY2FsbCB0cmFuc2xhdGlvbiBtYXAuCisJKiBnZW50dmFscy5zaDogTmV3IGZpcnN0IGFyZ3VtZW50IGB0YXJnZXQnLiAgUHJlZmFjZSB0YWJsZSB3aXRoCisJI2lmZGVmIE5MX1RBUkdFVF8kdGFyZ2V0IGlmIG5vbi1udWxsIHRhcmdldCBwYXNzZWQuCisJKiBnZW5ubHR2YWxzLnNoOiBOZXcgZmlsZS4KKwkqIG5sdHZhbHMuZGVmOiBSZWdlbmVyYXRlZC4KKworRnJpIE5vdiAxNCAxMTozMzozNCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1uLWNvcmUuaCAoc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfTik6IFJldHVybiBzdGF0aWMKKyAJc2ltX2NvcmVfZHVtbXlfTS4KKwkoc2ltX2NvcmVfZHVtbXlfTSk6IERlY2xhcmUuCisJCitXZWQgTm92IDEyIDE4OjE2OjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfc2lnbmFsKTogUHJpbnQgdGhlIGFkZHJlc3Mgb2YgdGhlCisgCWluc3RydWN0aW9uLgorCitUaHUgTm92IDEzIDExOjQ5OjQxIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBzaW0tYmFzZS5oIChzaW1fc3RhdGVfYmFzZSk6IE1vdmUgYG1hZ2ljJyB0byBlbmQgb2Ygc3RydWN0LgorCisJKiBzaW0tYmFzZS5oIChzaW1fc3RhdGVfYmFzZSk6IEFkZCBtZW1iZXIgdHJhY2VfZGF0YS4KKwkoU1RBVEVfVFJBQ0VfREFUQSk6IE5ldyBtYWNyby4KKwkqIHNpbS10cmFjZS5oIChUUkFDRV9ERUJVR19JRFgsVFJBQ0VfZGVidWcpOiBOZXcgbWFjcm9zLgorCSh7V0lUSF8sfVRSQUNFX0RFQlVHX1ApOiBOZXcgbWFjcm9zLgorCShTVEFURV9UUkFDRV9GTEFHUyxTVFJBQ0VfUCxTVFJBQ0VfREVCVUdfUCk6IE5ldyBtYWNyb3MuCisJKF9zaW1fY3B1KTogRGVsZXRlIGZvcndhcmQgcmVmZXJlbmNlLgorCShkZWJ1Z19wcmludGYpOiBVcGRhdGUuCisJKiBzaW0tdHJhY2UuYyAoT1BUSU9OX1RSQUNFX0RFQlVHKTogRGVmaW5lLgorCSh0cmFjZV9vcHRpb25zKTogQWRkIC0tdHJhY2UtZGVidWcuCisJKHNldF90cmFjZV9vcHRpb25zKTogSGFuZGxlIGl0LgorCSh0cmFjZV9vcHRpb25faGFuZGxlcik6IExpa2V3aXNlLgorCSh0cmFjZV9pbnN0YWxsKTogSW5pdCBzdGF0ZSB0cmFjZV9kYXRhIHN0cnVjdC4KKwkodHJhY2VfdW5pbnN0YWxsKTogQ2xvc2Ugc3RhdGUgdHJhY2UgZmlsZS4KKwkqIHNpbS1ldmVudHMuYyAoRVRSQUNFKTogT25seSBwcmludCBzb3VyY2UgZmlsZSBhbmQgbGluZSBudW1iZXIgaWYKKwktLXRyYWNlLWRlYnVnLgorCSogc2ltLW4tY29yZS5oIChzaW1fY29yZV90cmFjZV9NKTogTGlrZXdpc2UuCisKKwkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3NpZ25hbCk6IEFkZCBtaXNzaW5nICJcbiIgaW4gbWVzc2FnZS4KKworMTk5Ny0xMS0xMyAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgorCisJKiBzaW0tbi1jb3JlLmggKHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkX04pOiBpbGxlZ2FsIGVtcHR5CisJaW5pdGlhbGl6ZXIuCisJKiBzaW0tdHlwZXMuaCAodW5zaWduZWQxMjgsc2lnbmVkMTI4KTogZml4IHR5cG8gZm9yIE1TVkMuCisKK1dlZCBOb3YgMTIgMTI6MTg6MDggMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNCAoU0lNX0FDX09QVElPTl9TQ0FDSEUpOiBGaXggdHlwby4KKworCSogTWFrZS1jb21tb24uaW4gKEJVSUxUX1NSQ19GUk9NX0NPTU1PTik6IFJlbW92ZSBmaWxlcyBubyBsb25nZXIKKwlidWlsdCB0aGlzIHdheS4KKwkoc2ltLWNvbmZpZy5vKTogUmVtb3ZlIG5vbi1leGlzdGVudCAkKHNpbS1uY29uZmlnX2gpIGRlcGVuZGVuY3kuCisJKGNsZWFuKTogRG9uJ3QgZGVsZXRlICQoQlVJTFRfU1JDX0ZST01fQ09NTU9OKSBpZiBidWlsZGluZyBpbgorCXNvdXJjZSB0cmVlLgorCitUdWUgTm92IDExIDEzOjI4OjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3Byb2Nlc3MpOiBSZS1jb21wdXRlIHRoZSB0aW1lIC0KKyAJdXBkYXRlX3RpbWVfZnJvbV9ldmVudCAtIGFzIGVhY2ggZXZlbnQgaXMgcHJvY2Vzc2VkLiBSZXZlcnNlcworIAlwcmV2aW91cyBjaGFuZ2UuCisKK0ZyaSBOb3YgIDcgMDA6Mzc6MzYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjYWxsYmFjay5jIChvc19wb2xsX3F1aXQpOiBSZXBsYWNlIF9XSU4zMiB3aXRoIF9NU0NfVkVSLgorCitGcmkgTm92ICA3IDAwOjM3OjM2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3Byb2Nlc3MpOiBEZWxldGUgcmVkdW5kYW50IGNhbGwgdG8KKyAJdXBkYXRlX3RpbWVfZnJvbV9ldmVudC4KKwkoc2ltX2V2ZW50c19zbGlwKTogQWx3YXlzIGRlY3JlbWVudCB0aW1lX2Zyb21fZXZlbnQuCisJKHNpbV9ldmVudHNfdGljaywgc2ltX2V2ZW50c19kZXNjaGVkdWxlLCB1cGRhdGVfdGltZV9mcm9tX2V2ZW50KToKKyAJRGVsZXRlIGFzc2VydGlvbiB0aGF0IHRpbWVfZnJvbV9ldmVudCA+PTAgd2hlbiB3b3JrIGluIHF1ZXVlLCBubworIAlsb25nZXIgYXBwbGljYWJsZS4KKworVGh1IE5vdiAgNiAxMjowNjo0NiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1vcHRpb25zLmMgKFNUQU5EQVJEX09QVElPTlMpOiBDaGFuZ2UgT1BUSU9OXyogdG8gYW4gZW51bS4KKwkoc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIpOiBVcGRhdGUuCisKKwkqIHNpbS1vcHRpb25zLmg6IENsYXJpZnkgZG9jdW1lbnRhdGlvbi4KKyAJKE9QVElPTl9MT05HX09OTFlfUCk6IERlbGV0ZSBkZWZpbml0aW9uLgorCShPUFRJT05fVkFMSURfUCk6IERlZmluZS4KKwkKKwkqIHNpbS1vcHRpb25zLmMgKHNpbV9wcmludF9oZWxwKTogQWxsb3cgc2hvcnQgb25seSBvcHRpb25zLgorCShzaW1fcGFyc2VfYXJncyk6IERpdHRvLgorCShzaW1fYXJnc19jb21tYW5kKTogU2tpcCBzaG9ydCBvbmx5IG9wdGlvbnMuCisJKHNpbV9wYXJzZV9hcmdzKTogQWxsb2NhdGUgc3BhY2UgZm9yIE5VTV9PUFRTIG5vdCBqdXN0IDI1Ni4gTWFrZQorIAlzZXBhcmF0ZSBlbnRyaWVzIGZvciBzaG9ydCBhbmQgbG9uZyBvcHRpb25zIGluIHRoZSBIQU5ETEVSUyBhbmQKKyAJT1JJR19WQUwgdGFibGVzLgorCShzaW1fcGFyc2VfYXJncyk6IERpc2FibGUgYXJndW1lbnQgcGVybXV0YXRpb24uCisKK1dlZCBOb3YgIDUgMTM6NDA6MzEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tY29yZS5oIChERUNMQVJFX1NJTV9DT1JFX1dSSVRFX04uIERFQ0xBUkVfU0lNX0NPUkVfUkVBRF9OKToKKyAJQWRkIGFyZ3VtZW50IE0sIHNpemUgb2YgZGF0YSB0eXBlLgorCShzaW1fY29yZV9yZWFkX21pc2FsaWduZWRfMywgc2ltX2NvcmVfd3JpdGVfbWlzYWxpZ25lZF8zKToKKyAJRGVjbGFyZSwgZGl0dG8gZm9yIDUsIDYgJiA3IGJ5dGUgdHJhbnNmZXJzLgorCShzaW1fY29yZV93cml0ZV91bmFsaWduZWRfMSwgc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkXzEpOiBEZWZpbmUKKyAJYXMgYWxpZ25lZCB2YXJpYW50LgorCQorCSogc2ltLW4tY29yZS5oIChzaW1fY29yZV90cmFjZV9NKTogUmVuYW1lIGZyb20KKyAJc2ltX2NvcmVfdHJhY2VfTi4gQWRkIG5yX2J5dGVzIGFyZ3VtZW50LiBSZXBsYWNlIHRyYW5zZmVyIGFyZ3VtZW50CisgCXdpdGggdHJhbnNmZXIgdHlwZS4gUHJpbnQgdHJhbnNmZXIgZGlyZWN0aW9uLiAgSGFuZGxlIDEgYW5kIDIgYnl0ZQorIAl0cmFuc2ZlcnMuCisJKHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkX04sIHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF9OKTogVHJhY2UKKyAJdW5hbGlnbmVkIGFjY2Vzc2VzLgorCSh1bnNpZ25lZF9NLCBUMkhfTSwgSDJUX00pOiBSZW5hbWUgZnJvbSB1bnNpZ25lZF9OLCBUMkhfTiwgSDJUX04uCisgIAlVcGRhdGUgYWxsIGZ1bmN0aW9ucy4KKworCSogc2ltLWNvcmUuYzogR2VuZXJhdGUgZnVuY3Rpb25zIHN0YXJ0aW5nIHdpdGggMTYgbm90IDEuCisJKHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkXzMpOiBHZW5lcmF0ZS4gRGl0dG8gZm9yIDMgYnl0ZSB3cml0ZSBhbmQKKyAJYWxsIDUsIDYgJiA3IGJ5dGUgdHJhbnNmZXJzLgorCisJKiBzaW0tbi1jb3JlLmggKHNpbV9jb3JlX3JlYWRfbWlzYWxpZ25lZF9OLAorIAlzaW1fY29yZV93cml0ZV9taXNhbGlnbmVkX04pOiBJbXBsZW1lbnQuCisKK01vbiBOb3YgIDMgMTU6MDM6MDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tZW5kaWFuLmggKFUxNl84KTogSW1wbGVtZW50CisKKwkqIHNpbS1lbmRpYW4uYyAoc2ltX2VuZGlhbl9zcGxpdF8xNiwgc2ltX2VuZGlhbl9qb2luXzE2KTogTmV3IGZ1bmN0aW9ucworCisJKiBzaW0tZW5kaWFuLmggKFZMOF8xNiwgVkg4XzE2KTogSW1wbGVtZW50LgorCisJKiBzaW0tbWVtb3B0LmMgKG1lbW9yeV9vcHRpb25faGFuZGxlcik6IFR5cGVjYXN0IDY0Yml0IHZhbHVlIHRvCisgCWxvbmcgaW4gcHJpbnRmLgorCShtZW1vcnlfb3B0aW9uX2hhbmRsZXIpOiBPbmx5IHphbGxvYyBtb2R1bG8gYnl0ZXMgd2hlbiBub24temVyby4KKwkobWVtb3J5X29wdGlvbl9oYW5kbGVyKTogU2tpcCBjb21tYSBpbiBhbGlhcyBhZGRyZXNzIGxpc3QKKworRnJpIE9jdCAzMSAxMzowMzozMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1tZW1vcHQuYyAoZG9fbWVtb3B0X2FkZCwgZG9fbWVtb3B0X2RlbGV0ZSk6IEFkZCBsZXZlbCBhbmQKKyAJc3BhY2UgcGFyYW1zLgorCShwYXJzZV9zaXplLCBwYXJzZV9hZGRyKTogTmV3IGZ1bmN0aW9ucworCShtZW1vcnlfb3B0aW9uX2hhbmRsZXIsIG1lbW9yeV9vcHRpb25zKTogUGFyc2UgYWRkcmVzcyAmIHNpemUKKyAJdXNpbmcgbmV3IGZ1bmN0aW9ucy4gUGFzcyBsZXZlbCwgc3BhY2UsIG1vZHVsbyB0byBkb19tZW1vcHRfYWRkICYKKyAJZG9fbWVtb3B0X2RlbC4KKworCSogc2ltLW1lbW9wdC5oIChzdHJ1Y3QgX3NpbV9tZW1vcHQpOiBBZGQgbGV2ZWwgJiBzcGFjZSBmaWVsZHMuCisKKwkqIHNpbS1jb3JlLmggKHNpbV9jb3JlX2FycmFjaCwgc2ltX2NvcmVfZGV0YWNoKTogUmVwbGFjZQorIAlgYXR0YWNoX3R5cGUgYXR0YWNoJyBhcmd1bWVudCB3aXRoIGB1bnNpZ25lZCBsZXZlbCcgYXJndW1lbnQuCisgIAlEb2N1bWVudC4KKworCSogc2ltLWNvcmUuYyAobmV3X3NpbV9jb3JlX21hcHBpbmcsIHNpbV9jb3JlX21hcF9hdHRhY2gsCisgCXNpbV9jb3JlX2F0dGFjaCk6IFJlcGxhY2UgYXJndW1lbnQgYXR0YWNoIHdpdGggbGV2ZWwuICBVcGRhdGUKKyAJdmVyaWZpY2F0aW9uIG9mIGFyZ3VtZW50cy4KKwkoc2ltX2NvcmVfbWFwX2RldGFjaCwgc2ltX2NvcmVfZGV0YWNoKTogUmVwbGFjZSBhcmd1bWVudCBhdHRhY2gKKyAJd2l0aCBsZXZlbC4KKworCSogc2ltLWJhc2ljcy5oIChlbnVtIF9hdHRhY2hfdHlwZSk6IERlbGV0ZS4KKworVGh1IE9jdCAzMCAxMzo0NTowMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogc2ltLWNvcmUuaCAoc2ltX2NvcmVfd3JpdGVfOCk6IERlZmluZS4KKworVHVlIE9jdCAyOCAxMjoyOToyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1iaXRzLmg6IERvY3VtZW50IFJPVG4gbWFjcm8uCisKKwkqIHNpbS1lbmRpYW4uaCAoSDJUKTogSGFuZGxlIDE2IGJ5dGUgdmFyaWFibGVzLgorCisJKiBzaW0tbi1jb3JlLmggKHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkX04pOiBSZXR1cm4gYSBkdW1teSB3aGVuIGFuCisgCWVycm9yLgorCisJKiBzaW0tY29yZS5jOiBEbyBub3QgZ2VuZXJhdGUgc2ltX2NvcmVfKl93b3JkLgorCisJKiBzaW0tbi1jb3JlLmggKHNpbV9jb3JlX3RyYWNlX04pOiBBZGQgbGluZV9uciBhcmd1bWVudC4KKwkoc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF9OLCBzaW1fY29yZV9yZWFkX2FsaWduZWRfTik6IFVwZGF0ZS4KKworCSogc2ltLWNvcmUuaCAoc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfd29yZCwKKyAJc2ltX2NvcmVfcmVhZF9hbGlnbmVkX3dvcmQsIHNpbV9jb3JlX3JlYWRfd29yZCwKKyAJc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkX3dvcmQsIHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfd29yZCwKKyAJc2ltX2NvcmVfd3JpdGVfd29yZCk6IENoYW5nZSB0byBtYWNyb3MgdGhhdCBtYXAgb250byBzaW1fY29yZV8qX04uCisKK01vbiBPY3QgMjcgMTE6MjU6MTAgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc2ltLW4tZW5kaWFuLmg6IEFkZCBUQUdTIGVudHJ5cyBmb3IgMTYgYnl0ZSB2ZXJzaW9ucy4KKworCSogc2ltLWVuZGlhbi5oOiBEaXNhYmxlIDE2IGJ5dGUgc3VwcG9ydC4KKworTW9uIE9jdCAyNyAxMjowMDo0OCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1lbmRpYW4uYyAoX1NXQVBfMTYpOiBEZWZpbmUuICBHZW5lcmF0ZSAxMjYgYml0IHN3YXAgY29kZS4KKworCSogc2ltLW4tY29yZS5oIChzaW1fY29yZV90cmFjZV9OKTogTmV3IGZ1bmN0aW9uLgorCShzaW1fY29yZV9yZWFkX2FsaWduZWRfTiwgc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF9OKTogVXNlLAorCShzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF9OKTogRG8gbm90IHJldHlybiBib2d1cyB2YWx1ZSB3ZGVuIGVycm9yLgorCisJKiBzaW0tZW5kaWFuLmg6ICBBZGQgMTI4IGJpdCB2YXJpYW50LgorCisJKiBzaW0tY29yZS5oLCBzaW0tY29yZS5jOiBBZGQgMTI4IGJpdCB2YXJpYW50LgorCisJKiBzaW0tdHlwZXMuaDogQWRkIHNpZ25lZDEyOCBhbmQgdW5zaWduZWQxMjggdHlwZXMgdXNpbmcgYSBzdHJ1Y3QuCisKK0ZyaSBPY3QgMjQgMTE6MzM6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tZXZlbnRzLmMgKHNpbV9ldmVudHNfcHJvY2Vzcyk6IENsZWFyIGV2ZW50cy0+d29ya19wZW5kaW5nLgorCShzaW1fZXZlbnRzX3RpY2tuLCBzaW1fZXZlbnRzX3RpY2spOiBBY2N1bXVsYXRlLCBpbnN0ZWFkIG9mCisgCXNldHRpbmcsIG5yX3RpY2tzX3RvX3Byb2Nlc3MuCisJKHNpbV9ldmVudHNfcHJlcHJvY2Vzcyk6IEFsbG93IG5yX3RpY2tzX3RvX3Byb2Nlc3MgdG8gYmUgbm9uLXplcm8KKyAJd2hlbiB0aGUgZXZlbnQgcXVldWUgaXNuJ3QgbmV4dC4KKworCSogc2ltLWV2ZW50cy5oLCBzaW0tZXZlbnRzLmMgKHNpbV9ldmVudHNfc2xpcCk6IE5ldyBmdW5jdGlvbi4KKworV2VkIE9jdCAyMiAxNDoxODozOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1obG9hZC5jIChzaW1fbG9hZCk6IFBhc3MgbG1hX3A9PTAgYW5kIGRvX2xvYWQ9c2ltX2xvYWQuCisKKwkqIHNpbS11dGlscy5oLCBzaW0tbG9hZC5jIChzaW1fbG9hZF9maWxlKTogQWRkIGxtYV9wIGFuZCBkb19sb2FkCisgCWFyZ3VtZW50cy4KKworVHVlIE9jdCAyMSAxODozNzo1NyAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBucnVuLmMgKG1haW4pOiBSZW1vdmUgdXNlbGVzcyB0ZXN0IG9mIG5hbWUgIT0gTlVMTC4KKwlFeGl0IGlmIGJmZF9vcGVuciBmYWlscy4gIENhbGwgYmZkX2NoZWNrX2Zvcm1hdCBhZnRlciBiZmRfb3BlbnIuCisKK1R1ZSBPY3QgMjEgMTA6NDI6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tZnB1LmMgKEVYUE1BWCk6IFR5cGUgaXMgdW5zaWduZWQuCisJKE1JTl9JTlQsIE1BWF9JTlQpOiBUeXBlIGlzIHNpZ25lZDY0LgorCShpMmZwdSk6IFR5cGUgb2YgdmFsIGlzIHNpZ25lZDY0LgorCitUdWUgT2N0IDIxIDEwOjQyOjM4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLXByb2ZpbGUuaCAoUFJPRklMRV9QQ19CVUNLRVRfU0laRSk6IFRyZWF0IGEgc2hpZnQgb2YgemVybyBhcworIAlhIGJ1Y2tldCBzaXplIG9mIHplcm8uCisKKwkqIHNpbS1wcm9maWxlLmMgKE9QVElPTl9QUk9GSUxFX1BDX0dSQU5VTEFSSVRZLAorIAlPUFRJT05fUFJPRklMRV9QQyk6IERlZmluZS4KKwkocHJvZmlsZV9vcHRpb25faGFuZGxlcik6IEFkZCBzdXBwb3J0IGZvciAtLXByb2ZpbGUtcGMgYW5kCisgCS0tcHJvZmlsZS1wYy1ncmFudWxhcml0eSBvcHRpb25zLgorCShwcm9maWxlX3BjX2luaXQpOiBXaGVuIHBvc3NpYmxlLCBjb21wdXRlIG5yIGJ1Y2tldHMgZnJvbSBidWNrZXQKKyAJc2l6ZS4KKworCSogc2ltLXByb2ZpbGUuYyAocHJvZmlsZV9wY19pbml0KTogQWxpZ24gdGhlIHByb2ZpbGUtcGMgZW5kCisgCWFkZHJlc3Mgd2l0aCB0aGUgcHJvZmlsZS1wYyBidWNrZXQgc2l6ZS4KKworCSogc2ltLXByb2ZpbGUuaCAoUFJPRklMRV9QQ19OUl9CVUNLRVRTKTogUmVuYW1lIFBST0ZJTEVfUENfU0laRSB0bworIAlzb21ldGhpbmcgbGVzcyBhbWJpZ3VvdXMuCisJKFBST0ZJTEVfUENfQlVDS0VUX1NJWkUpOiBEaXR0byBmb3IgUFJPRklMRV9QQ19TQU1QTEVfU0laRS4KKworCSogc2ltLXByb2ZpbGUuYyAocHJvZmlsZV9wY19jbGVhbnVwKTogTmV3IGZ1bmN0aW9uLiBNb3ZlCisgCXByb2ZpbGVfcGNfdW5pbnN0YWxsIGNvZGUgdG8gaGVyZS4KKwkocHJvZmlsZV9wY191bmluc3RhbGwpOiBDYWxsLgorCShwcm9maWxlX3BjX2luaXQpOiBDYWxsLgorCitNb24gT2N0IDIwIDE3OjIzOjU4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLXByb2ZpbGUuYyAocHJvZmlsZV9wcmludF9wYyk6IER1bXAgcGMgcHJvZmlsZSB0byBkbW9uLm91dAorIAlmaWxlIHVzaW5nIEJTRCBncHJvZiBmb3JtYXQuCisKKwkqIHNpbS1iaXRzLmggKExTQklULCBNU0JJVCwgQklUKTogRm9yY2UgcmVzdWx0IHRvIHR5cGUKKyAJdW5zaWduZWRfd29yZC4KKwkoTFNCSVQ4LCBMU0JJVDE2LCBMU0JJVDMyLCBMU0JJVDY0LCBNU0JJVDgsIE1TQklUMTYsIE1TQklUMzIsCisgCU1TQklUNjQpOiBGb3JjZSByZXN1bHQgdG8gdW5zaWduZWROLgorCitUaHUgT2N0IDE2IDExOjM4OjU2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWFsdS5oIChBTFUxNl9CRUdJTiwgQUxVMzJfQkVHSU4sIEFMVTY0X0JFR0lOKTogRHJvcCBvcGVuaW5nCisgCWJyYWNlIGZyb20gbWFjcm8uCisJKEFMVThfQkVHSU4sIEFMVThfU0VULCBBTFU4X0FERCwgQUxVOF9TVUIsIEFMVThfTkVHQVRFKTogRGVmaW5lLgorCShBTFUxNl9BREQsIEFMVTE2X1NVQiwgQUxVMTZfTkVHQVRFKTogU2ltcGxpZnkgYXJyaXRobWV0aWMuCisJKEFMVTMyX0FERCwgQUxVMzJfU1VCLCBBTFUzMl9ORUdBVEUpOiBTaW1wbGlmeSBhcnJpdGhtZXRpYy4KKwkoQUxVNjRfQURELCBBTFU2NF9TVUIsIEFMVTY0X05FR0FURSk6IFNpbXBsaWZ5IGFycml0aG1ldGljLgorCitXZWQgT2N0IDE1IDA5OjI0OjE5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWNvcmUuaCAoc3RydWN0IF9zaW1fY29yZV9tYXBwaW5nKTogQ2hhbmdlIGZyZWVfYnVmZmVyIHRvCisgCXR5cGUgdm9pZCouCisKKwkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3VuaW5zdGFsbCwgbmV3X3NpbV9jb3JlX21hcHBpbmcsCisgCXNpbV9jb3JlX21hcF9hdHRhY2gsIHNpbV9jb3JlX21hcF9kZXRhY2gpOiBDaGFuZ2UgZnJlZV9idWZmZXIgdG8KKyAJdHlwZSB2b2lkKi4KKwkoc2ltX2NvcmVfYXR0YWNoKTogUmVuYW1lIGJ1ZmZlcl9mcmVlZCB0byBmcmVlX2J1ZmZlciwgdHlwZQorIAl2b2lkKi4gRW5zdXJlIHRoYXQgYWxsb2NhdGVkIGJ1ZmZlciBpcyBhbGxpZ25lZCBhY2NvcmRpbmcgdG8KKyAJcmVnaW9uJ3MgYWRkcmVzcy4KKworTW9uIE9jdCAxMyAxMTozNDo1MCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1hbHUuaCAoQUxVNjRfSEFEX09WRVJGTE9XKTogRGVmaW5lLgorCShBTFU2NF9TVUIpOiBEZWZpbmUuCisKKwkqIE1ha2UtY29tbW9uLmluIChhbGwpOiBCdWlsZCBTSU1fRVhUUkFfQUxMIGZpcnN0LgorCSguZ2RiaW5pdCk6IFJlbW92ZSBkZXBlbmRlbmNpZXMsIGdlbmVyYXRlIG9uY2UgcGVyIGJ1aWxkLgorCitUdWUgT2N0IDE0IDE5OjIwOjA5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLW4tY29yZS5oIChzaW1fY29yZV9yZWFkX2FsaWduZWRfTiwKKyAJc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF9OKTogTWFrZSB4YWRkciBwYXJhbSB0eXBlIGFkZHJlc3Nfd29yZCBub3QKKyAJdW5zaWduZWRfd29yZC4KKworRnJpIE9jdCAgMyAwOTo0OToxOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1mcHUuaCwgc2ltLWZwdS5jOiBSZXdyaXRlLiAgQ2hhbmdlIHNpbV9mcHUgb2JqZWN0IHRvIGFuCisgCXVucGFja2VkIGZsb2F0aW5nIHBvaW50IHN0cnVjdC4gIFBhc3Mgc2ltX2ZwdSBvYmplY3QgYnkgcmVmZXJlbmNlLgorCUFkZCBwcmVsaW1pbmFyeSBzdXBwb3J0IGZvciByb3VuZGluZyBtb2Rlcy4KKwkKK0ZyaSBPY3QgIDMgMDk6Mjg6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1RodSBPY3QgIDIgMTk6NDM6NTIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00IChzaW0tYml0c2l6ZSk6IEZpeCB0eXBvLCBXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgbm90CisgCVdJVEhfVEFSR0VUX0JJVFNJWkUuCisKK1RodSBTZXAgMjUgMjM6MjA6MjAgMTk5NyAgRmVsaXggTGVlICA8ZmxlZUB5aW4uY3lnbnVzLmNvbT4KKworICAgICAgICAqIHNpbS1wcm9maWxlLmMgKHByb2ZpbGVfcHJpbnRfY29yZSk6IGxhYmVsIG5lZWRzIGVtcHR5IHN0YXRlbWVudC4KKworVGh1IFNlcCAyNSAxMToyMDo0NyAxOTk3ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBiYWJ5bG9uLTUuY3lnbnVzLmNvbT4KKworCSogc2ltLWJyZWFrLmMgKHNpbV9zZXRfYnJlYWtwb2ludCBzaW1fY2xlYXJfYnJlYWtwb2ludCk6ICBVc2UgWkFMTE9DCisJYW5kIHpmcmVlIGluc3RlYWQgb2YgeG1hbGxvYyBhbmQgZnJlZS4gIFByZXZlbnRzIHdhcm5pbmdzLgorCitXZWQgU2VwIDI0IDE3OjM4OjU3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgU2VwIDI0IDE3OjIzOjMxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogTWFrZS1jb21tb24uaW4gKFNJTV9CSVRTSVpFKTogQXNzaWduIGZyb20gY29uZmlndXJlZCB2YWx1ZS4KKwkoQ09ORklHX0NGTEFHUyk6IEFkZCBTSU1fQklUU0laRS4KKworCSogYWNsb2NhbC5tNCAoLS1lbmFibGUtc2ltLWJpdHNpemUpOiBEZXZlbG9wZXIgb3B0aW9uIGZvcgorIAljb250cm9saW5nIHRoZSBiaXRzaXplL21zYiBvZiB0aGUgdGFyZ2V0LgorCitXZWQgU2VwIDI0IDE3OjQxOjQwIDE5OTcgIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgorCisJKiBNYWtlLWNvbW1vbi5pbjogIE5ldyBmaWxlcyBzaW0tYnJlYWsuYywgc2ltLWJyZWFrLmguCisJKiBzaW0tYmFzZS5oOiAgQWRkIHBvaW50IHRvIGJyZWFrcG9pbnQgbGlzdCB0byBzaW1fc3RhdGVfYmFzZS4KKwkqIHNpbS1icmVhay5jIHNpbS1icmVhay5oOiAgTmV3IG1vZHVsZXMgdGhhdCBpbXBsZW1lbnQgaW50cmluc2ljCisJYnJlYWtwb2ludCBzdXBwb3J0LgorCSogc2ltLW1vZHVsZS5jOiAgQWRkIGJyZWFrcG9pbnQgbW9kdWxlLgorCQorVHVlIFNlcCAyMyAwMDoyNjozOSAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQHlpbi5jeWdudXMuY29tPgorCisJKiBzaW0tZXZlbnRzLmMgKFNJTV9FVkVOVFNfUE9MTF9SQVRFKTogcG9sbCBtb3JlIG9mdGVuIHRoYW4gb25jZQorIAlhbiBob3VyLgorCSogc2ltLW4tY29yZS5oIChXSVRIX1hPUl9FTkRJQU4pOiBNU1ZDIGJhcmZzIG9uCisJaWYgKDApIHsgMSAlIDA7IH0KKwkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3hvcl93cml0ZV9idWZmZXIpOiBXSVRIX1hPUl9FTkRJQU4gKyAxLgorCShTSUdCVVMpIGRlZmluZSBmb3IgV2luZG93cy4KKwkqIHNpbS10cmFjZS5jICh0cmFjZV9wcmludGYsZGVidWdfcHJpbnRmKTogYWRkZWQgQUxNT1NUX1NUREMuCisJKiBzaW0tcmVzdW1lLmM6IGRlZmluZSBTSUdUUkFQIGZvciB3aW5kb3dzLgorCSogc2ltLXhjYXQuaDogdXNlIHRva2VuIHBhc3RpbmcgaWYgQUxNT1NUX1NUREMuCisKK1R1ZSBTZXAgMjMgMTE6MDQ6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBNYWtlLWNvbW1vbi5pbiAoU0lNX1NDQUNIRSwgU0lNX0RFRkFVTFRfTU9ERUwpOiBBc3NpZ24KKyAJY29uZmlndXJlZCB2YWx1ZXMuCisgCShDT05GSUdfQ0ZMQUdTKTogQWRkIHNhbWUuCisJCitNb24gU2VwIDIyIDE3OjIwOjI3IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KKworCSogc2ltLXR5cGVzLmggKFNJR05FRDY0KTogIyNpNjQgd2hlbiBfTVNDX1ZFUiwgbm90IF9XSU4zMi4KKwkoU0lHTkVEMzIpOiB1c2UgIyNpMzIuCisKK1R1ZSBTZXAgMjMgMTE6MDQ6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1R1ZSBTZXAgMjMgMTA6MDc6NDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00IChzaW0tZW5kaWFuKTogU2ltcGxpZnkgbG9naWMgZGV0ZXJtaW5pbmcgW2RlZmF1bHRdCisgCWVuZGlhbiBvZiB0YXJnZXQuCisKKwkqIE1ha2UtY29tbW9uLmluIChTSU1fV0FSTklOR1MsIFNJTV9BTElHTk1FTlQsIFNJTV9FTkRJQU4sCisgCVNJTV9IT1NURU5ESUFOLCBTSU1fUkVTRVJWRURfQklUUywgU0lNX0FTU0VSVCwgU0lNX0ZMT0FULAorIAlTSU1fSEFSRFdBUkUsIFNJTV9JTkxJTkUsIFNJTV9QQUNLQUdFUywgU0lNX1JFR1BBUk0sIFNJTV9TTVAsCisgCVNJTV9TVERDQUxMLCBTSU1fWE9SX0VORElBTik6IEFzc2lnbiBjb25maWd1cmVkIHZhbHVlcy4KKwkoQ09ORklHX0NGTEFHUyk6IEFkZCBzYW1lLgorCisJKiBhY2xvY2FsLm00OiBQZXJmb3JtIEFDX1NVQlNUIG9uIG9wdGlvbmFsIG9wdGlvbnMuCisKK01vbiBTZXAgMjIgMTE6NDY6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tY29uZmlnLmggKFdJVEhfREVGQVVMVF9BTElHTk1FTlQpOiBEb24ndCBoYXJkd2lyZSBhbnkgYWxpZ25tZW50LgorCisJKiBzaW0tb3B0aW9ucy5jIChzdGFuZGFyZF9vcHRpb25faGFuZGxlcik6IFR5cG8gaW4gd2FybmluZyBtZXNzYWdlLgorCisJKiBzaW0tYmFzZS5oIChTVEFURV9NT0RFTCk6IE1ha2UgY29uZGl0aW9uYWwgb24gU0lNX0hBVkVfTU9ERUwuCisKKwkqIHNpbS1wcm9maWxlLmMgKHByb2ZpbGVfcHJpbnRfaW5zbik6IENoZWNrIDAgLi4gTUFYX0lOU04gZm9yIGFueQorIAlpbnNuIGNvdW50LiAgTWFrZSBjb3VudCBjb25kaXRpb25hbCBvbiB0aGVyZSBiZWluZyBhIHZhbGlkCisgCUlOU05fTkFNRS4KKwkocHJvZmlsZV9wY19pbml0KTogTWFrZSBkZWZhdWx0IFBDIHByb2ZpbGUgZnJlcXVlbmN5IGFuIGFyYml0cmFyeQorIAkyNTYuCisKKwkqIHNpbS1iYXNlLmg6IERpdHRvLgorCisJKiBzaW0tcHJvZmlsZS5oIChXSVRIX1BST0ZJTEVfTU9ERUxfUCk6IE9ubHkgZW5hYmxlIG1vZGVsaW5nIHdoZW4KKyAJU0lNX0hBVkVfTU9ERUwuCisKKwkqIHNpbS1tb2RlbC5oIChzdHJ1Y3QgTUFDSCk6IERlcHJlY2lhdGUsIHRvIGJlIHJlcGxhY2VkIGJ5IGJmZAorCWFyY2h1cmUgc3RydWN0LgorCitNb24gU2VwIDIyIDExOjQ2OjIwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gU2VwIDIyIDExOjQ1OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNCAoc2ltX2FsaWdubWVudCk6IFNpbXBsaWZ5IGxvZ2ljIGZvciBzZWxlY3RpbmcgdGhlCisgCWNvbmZpZ3VyZWQgYWxpZ25tZW50LgorCitGcmkgU2VwIDE5IDE3OjQ1OjI1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitGcmkgU2VwIDE5IDE3OjI2OjE0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWNvbmZpZy5jIChzaW1fY29uZmlnKTogQ2hlY2sgZm9yIGRlZmF1bHQgYWxpZ25tZW50LgorCisJKiBzaW0tb3B0aW9ucy5jIChzdGFuZGFyZF9vcHRpb25faGFuZGxlcik6IEFkZCBhbGlnbm1lbnQgb3B0aW9uLgorCisJKiBhY2xvY2FsLm00IChzaW1fYWxpZ25tZW50KTogQWxsb3cgY29uZmlndXJhdGlvbiBvZiBoYXJkd2lyZWQgYW5kCisgCWRlZmF1bHQgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBvbiBtZW1vcnkgYWNjZXNzZXMuCisJCitGcmkgU2VwIDE5IDExOjUxOjM1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltLWxvYWQuYyAoc2ltX2xvYWRfZmlsZSk6IFJldHVybiBmYWlsdXJlIGlmIHRoZSBleGVjdXRhYmxlCisJaGFkIG5vIGxvYWRhYmxlIHNlY3Rpb25zLgorCitXZWQgU2VwIDE3IDEzOjMzOjI4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWV2ZW50cy5jIChFVFJBQ0UpOiBVc2UgdHJhY2VfcHJpbnRmIG5vdCBzaW1faW9fcHJpbnRmIGZvcgorIAl0cmFjZSBvdXRwdXQuCisKKwkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3NpZ25hbCk6IFdoZW4gYmFkIGFjY2VzcyBoYWx0IHNpbXVsYXRvcgorIAlTSUdTRUdWIC8gU0lHQlVTIGluc3RlYWQgb2YgYWJvcnRpbmcuCisJKHNpZ25hbC5oKTogSW5jbHVkZS4KKwkKKwkqIHNpbS13YXRjaC5jIChzaW1fd2F0Y2hwb2ludF9pbnN0YWxsKTogSGFuZGxlciBmb3Igd2F0Y2hwb2ludAorIAlvcHRpb25zIHdhcyBtaXNzaW5nLgorCisJKiBzaW0tYml0cy5oIChNT1ZFRCk6IERlZmluZQorCitXZWQgU2VwIDE3IDEwOjMzOjI4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWFsdS5oIChBTFUzMl9IQURfT1ZFUkZMT1cpOiBQYWNpZnkgR0NDLCBVc2UgTVNCSVQgaW5zdGVhZCBvZgorIAlCSVQuCisKKwkqIHNpbS1iaXRzLmggKExTQklULCBNU0JJVCk6IENoZWNrIGZvciBvdmVyZmxvdyBvZiBzaGlmdCB2YWx1ZS4KKworCSogc2ltLWJpdHMuYzogQWRkIDggYml0IHZlcnNpb25zIG9mIGJpdCBtYWNyb3MuCisKKwkqIHNpbS1iaXRzLmg6IERpdHRvLgorCitUdWUgU2VwIDE2IDE2OjE1OjE2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWJpdHMuYyAoTFNTRVhULCBNU1NFWFQpOiBSZXBsYWNlIFNFWFQuCisJKExTSU5TRVJURUQsIE1TSU5TRVJURUQpOiBEaXR0byBmb3IgSU5TRVJURUQuCisJCisJKiBzaW0tbi1iaXRzLmggKE1TU0VYVG4sIExTU0VYVG4pOiBSZXBsYWNlIFNFWFRuLgorCShMU0lOU0VSVERuLCBNU0lOU0VSVEVETik6IERpdHRvIGZvciBJTlNFUlRFRG4uCisJCisJKiBzaW0tYml0cy5oIChTRVhUKik6IERlZmluZSBhcyBNU0VYVC9MU0VYVC4KKwkoSU5TRVJURUQqKTogRGl0dG8gZm9yIExTSU5TRVJURUQvTVNJTlNFUlRFRC4KKwkKK01vbiBTZXAgMTUgMTc6MzY6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00IChTSU1fQUNfQ09NTU9OKTogQWRkIG9wdGlvbmFsIGNvbmZpZy5oIGZpbGUgYXJndW1lbnQuCisJY29uZmlndXJlLmluOiBPdXRwdXQgdG8gY2NvbmZpZy5oIGluc3RlYWQgb2YgY29uZmlnLmguCisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIFNlcCAxNSAxNTozOToyOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS11dGlscy5jIChzaW1fYW5hbHl6ZV9wcm9ncmFtKTogU2V0IFNUQVRFX0FSQ0hJVEVDVFVSRSBmcm9tCisgCUJGRCBpZiBrbm93bi4KKworVHVlIFNlcCAgOSAyMTo0Njo0NiAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIGNhbGxiYWNrLmMgKG9zX3dyaXRlKTogZGl2ZXJ0IHN0ZG91dCBhbmQgc3RkZXJyIHRvIHRoZWlyCisgCXJlc3BlY3RpdmUgaG9va3MuCisKK1RodSBTZXAgMTEgMTA6MDg6NDggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tcHJvZmlsZS5jIChwcm9maWxlX3ByaW50X3NwZWVkKTogQ2FsbAorIAlzaW1fZXZlbnRzX2VsYXBzZWRfdGltZSBpbnN0ZWFkIG9mIFBST0ZJTEVfRVhFQ19USU1FIGZvciBtb21lbnQuCisKKwkqIHNpbS1ldmVudHMuYyAoc2ltX2V2ZW50c19lbGFwc2VkX3RpbWUpOiBOZXcgZnVuY3Rpb24gcmV0dXJuIG5yCisgCWhvc3QgTVMgY29uc3VtZWQgYnkgdGhlIHNpbXVsYXRvci4KKwkoc2ltX3dhdGNoX3ZhbGlkKTogVXNlLgorCisJKiBzaW0tbW9kdWxlLmMgKG1vZHVsZXMpOiBJbnN0YWxsIHNpbV9ldmVudHMgdmVyeSB2ZXJ5IGVhcmx5LgorCisJKiBzaW0tcHJvZmlsZS5jIChwcm9maWxlX3ByaW50KTogQ2FsbCBwcm9maWxlX3ByaW50X3BjLgorCShwcmludF9iYXIpOgorCShwcm9maWxlX3BjX2luaXQpOiBOZXcgZnVuY3Rpb24sIHNldCB1cCBwcm9jZXNzb3IgZm9yIFBDCisgCXByb2ZpbGluZy4KKwkocHJvZmlsZV9wcmludF9wYyk6IE5ldyBmdW5jdGlvbiwgcHJpbnQgYSBQQyBwcm9maWxlLgorCShwcm9maWxlX3BjX2V2ZW50KTogTmV3IGZ1bmN0aW9uLCBzYW1wbGUgUEMuCisKKwkqIHNpbS1wcm9maWxlLmggKFBST0ZJTEVfUENfQ09VTlQsIFBST0ZJTEVfUENfU1RBUlQsCisgCVBST0ZJTEVfUENfRU5ELCBQUk9GSUxFX1BDX1NISUZULCBQUk9GSUxFX1BDX1NBTVBMRV9TSVpFKTogQWRkIHRvCisgCXByb2ZpbGUgc3RydWN0LgorCisJKiBzaW0tb3B0aW9ucy5jIChzaW1fcHJpbnRfaGVscCk6IFBhY2lmeSBHQ0MuCisKKwkqIHNpbS1uLWNvcmUuaCAoc2ltX2NvcmVfcmVhZF9hbGlnbmVkX04sCisgCXNpbV9jb3JlX3dyaXRlX2FsaWduZWRfTik6IEFkZCB1bi1jb25kaXRpb25hbCBwcm9maWxlIGNhbGwuCisJKHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkX04sIHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF9OKTogQWRkCisgCXByb2ZpbGUgY2FsbCB3aGVuIGFsaWduZWQgcmVhZC93cml0ZSBpc24ndCB1c2VkLgorCisJKiBzaW0tYmFzZS5oOiBJbmNsdWRlIHNpbS1wcm9maWxlLCBzaW0tbW9kZWwgYWZ0ZXIgc2ltLWNvcmUgJgorIAlzaW0tZXZlbnRzIGFsbG93IHNpbS1jb3JlIHRvIGRlZmluZSB1c2VmdWwgdmFsdWVzLgorCisJKiBzaW0tcHJvZmlsZS5jIChPUFRJT05fUFJPRklMRV9DT1JFKTogRGVmaW5lLgorCShwcm9maWxlX29wdGlvbl9oYW5kbGVyLCBwcm9maWxlX29wdGlvbnMpOiBBZGQgc3VwcG9ydCBmb3IKKyAJLS1wcm9maWxlLWNvcmUgb3B0aW9uLgorCShwcmludF9iYXIpOiBJbmNsdWRlIHdoZW4gY29yZSBwcm9maWxpbmcuCisJKHByb2ZpbGVfcHJpbnRfY29yZSk6IE5ldyBmdW5jdGlvbiwgcHJpbnQgY29yZSBwcm9maWxlLgorCisJKiBzaW0tY29uZmlnLmMgKHByaW50X3NpbV9jb25maWcpOiBQcmludCBwcm9maWxlIHN0YXR1cy4KKworCSogc2ltLXByb2ZpbGUuaCAoUFJPRklMRV9ORVhUX0lEWCwgUFJPRklMRV9jb3JlLAorIAlXSVRIX1BST0ZJTEVfUENfUCk6IERlZmluZS4KKwkoUFJPRklMRV9DT1JFX0NPVU5UKTogQ291bnQgZWFjaCBjb3JlLW1hcC9zaXplIHNlcGFyYXRseS4KKwkoUFJPRklMRV9DT1VOVF9DT1JFKTogRGVmaW5lLgorCitUaHUgU2VwIDExIDA4OjQ0OjUyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLXdhdGNoLmMgKGhhbmRsZV93YXRjaHBvaW50KTogUGFzcyBhIGNoYXIqKiBpbmRleCBpbnRvIHRoZQorIAlpbnRlcnJ1cHRfbmFtZXMgYXJyYXkgYXMgdGhlIGRhdGEuCisJKHNpbS13YXRjaC5oKTogRG9jdW1lbnQuCisKK1dlZCBTZXAgMTAgMTY6MTU6MjIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tb3B0aW9ucy5jIChzaW1fcHJpbnRfaGVscCk6IFdoZW4gdGhlIGRvYyBzdHJpbmcgaXMgdG8gbG9uZworIAl3b3JkIHdyYXAgaXQuCisKKwkqIHNpbS13YXRjaC5jIChzaW1fd2F0Y2hwb2ludF9pbnN0YWxsKTogVXNlIG9wdGlvbi5kb2NfbmFtZSBzbworIAl0aGF0IG9ubHkgdGhlIGZpcnN0IGZldyB0aGUgd2F0Y2ggb3B0aW9ucyBhcmUgbGlzdGVkLiAgR2VuZXJhdGUKKyAJbWVhbmdpbmZ1bCB1c2FnZSBtZXNzYWdlcy4KKworCSogc2ltLW9wdGlvbnMuaCAoc3RydWN0IE9QVElPTik6IENsYXJpZnkgdXNlIG9mIGRvY19uYW1lIGZpZWxkCisJCitXZWQgU2VwIDEwIDEzOjIzOjI0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLW9wdGlvbnMuYyAoT1BUSU9OX0FSQ0hJVEVDVFVSRV9JTkZPKTogTmV3IG9wdGlvbi4KKwkoc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIpOiBIYW5kbGUgLS1hcmNoaXRlY3R1cmUtaW5mby4KKworVHVlIFNlcCAgOSAyMTo0Njo0NiAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIHNpbS1jb3JlLmggKHNpbV9jcHVfY29yZSk6IFtXSVRIX1hPUl9FTkRJQU4gKyAxXSwgdG8gYXZvaWQKKwlpbGxlZ2FsIHplcm8tc2l6ZWQgYXJyYXkuCisJKiBzaW0tY29yZS5jIChzaW1fY29yZV94b3JfcmVhZF9idWZmZXIpOiBzYW1lLgorCitUdWUgU2VwICA5IDExOjIwOjM1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIG5sdHZhbHMuZGVmOiBSZWdlbmVyYXRlLgorCitUdWUgU2VwICA5IDAyOjEwOjM2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWZwdS5jIChEUF9GUkFDSElHSDIpOiBEZWZpbmUgTEwgdXNpbmcgU0lHTkVENjQuCisKK01vbiBTZXAgIDggMTI6MjI6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tYml0cy5jIChNQVNLRUQpOiBEZWxldGUuCisJKEVYVFJBQ1RFRCk6IERlbGV0ZS4KKwkoTFNFWFRSQUNURUQsIE1TRVhUUkFDVEVEKTogTmV3IGZ1bmN0aW9ucy4KKworCSogc2ltLW4tYml0cy5oIChNQVNLRURuKTogRGVsZXRlLCBkZWZpbmUgYXMgTVNNQVNLRUQgb3IgTFNNQVNLRUQuCisJKE1TTUFTS0VEbiwgTFNNQVNLRURuKTogQWRkIGxhc3QgYXJndW1lbnQuCisJKE1TTUFTSyopOiBEaXR0by4KKwkKKwkqIHNpbS1iaXRzLmggKEVYVEVORDgsIEVYVEVORDE2KTogRGVmaW5lLgorCShFWFRSQUNURUQ2NCk6IERlZmluZSBhcyA2NCBiaXQgZXh0cmFjdCwgbm90IDMyIGJpdC4KKworCSogc2ltLXJ1bi5jIChzaW1fZW5naW5lX3J1bik6IFVzZSBDUFVfQ0lBIG1hY3JvLgorCisJKiBzaW0tZW5naW5lLmggKFNJTV9FTkdJTkVfSEFMVF9IT09LKTogVXNlIENQVV9DSUEgdG8gZ2V0IGF0CisgCWN1cnJlbnQgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4KKworCSogc2ltLWlubGluZS5oICgqX0VOR0lORSk6IERlZmluZS4KKworRnJpIFNlcCAgNSAwODozOTowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX2F0dGFjaCk6IEZpeCBjaGVja3Mgb2YgbW9kdWxvL21hc2suCisKKwkqIHNpbS13YXRjaC5jIChkZWxldGVfd2F0Y2hwb2ludCk6IERlbGV0ZSBieSBpZGVudCBhbmQgdHlwZS4KKwkod2F0Y2hfb3B0aW9uX2hhbmRsZXIpOiBDYWxsIGRlbGV0ZV93YXRjaHBvaW50IHdpdGggaWRlbnQgb3IgdHlwZS4KKwkoc2ltX3dhdGNocG9pbnRfaW5zdGFsbCk6IENyZWF0ZSBpbnRlcnJ1cHQgc3BlY2lmaWMgd2F0Y2hwb2ludAorIAljb21tYW5kcyBvbiB0aGUgZmx5LgorCShkb193YXRjaHBvaW50X2NyZWF0ZSk6IE5ldyBmdW5jdGlvbiwgY3JlYXRlIGEgd2F0Y2ggcG9pbnQgdXNpbmcKKyAJdHlwZS9pbnQtbnIgaW5mbyBlbmNvZGVkIGluIHRoZSBvcHRpb24gbnIuCisJKGRvX3dhdGNocG9pbnRfaW5mbyk6IE5ldyBmdW5jdGlvbi4gIExpc3QgYWN0aXZlIHdhdGNocG9pbnRzLgorCisJKiBzaW0td2F0Y2guaDogQ2hhbmdlIGRhdGEgc3RydWN0dXJlIHRvIGEgbGlzdC4KKworCSogc2ltLW1lbW9wdC5jIChtZW1vcnlfb3B0aW9uX2hhbmRsZXIpOiBSZXF1aXJlIGV4cGxpY2l0ICJhbGwiCisgCWJlZm9yZSBkZWxldGluZyBhbGwgbWVtb3J5IHJlZ2lvbnMuCisKKwkqIHNpbS11dGlscy5jIChzaW1fZG9fY29tbWFuZGYpOiBOZXcgZnVuY3Rpb24sIHByaW50ZiB2ZXJzaW9uIG9mCisgCXNpbV9kb19jb21tYW5kLgorCisJKiBzaW0tYmFzaWNzLmggKGFzcHJpbnRmLCB2YXNwcmludGYpOiBIYWNrLCBkZWZpbmUgZm9yIENZR1dJTjMyLiAKKwkKKwkqIHNpbS1hbHUuaCAoQUxVNjRfQUREKTogVXNlIGV4cGxpY2l0IE1TRVhUUkFDVEVENjQsIGRvIG5vdCBhc3N1bWUKKyAJYml0IGVuZGlhbm5lc3MuCisJKFNJR05FRDY0LCBVTlNJR05FRDY0KTogRGVsZXRlLgorCShBTFU2NF9BREQpOiBEb24ndCByZWx5IG9uIGJpdCBlbmRpYW5uZXNzLgorCShBTFU2NF9CRUdJTik6IERlZmluZS4KKworCSogc2ltLW4tYml0cy5oIChNU0VYVFJBQ1RFRG4sIExTRVhUUkFDVEVEKTogTmV3IGZ1bmN0aW9ucy4KKwkoRVhUUkFDVEVEbik6IERlbGV0ZSwgZGVmaW5lIGFzIGVpdGhlciBMU0VYVFJBQ1RFRCBvciBNU0VYVFJBQ1RFRC4KKworCSogc2ltLXR5cGVzLmggKFNJR05FRDY0LCBVTlNJR05FRDY0KTogTmV3IG1hY3JvcywgYXR0YWNoIHJlbGV2YW50CisgCXN1ZmZpeCAtIHU2NCwgTEwgLSB0byA2NCBiaXQgY29uc3RhbnRzLgorCitUaHUgU2VwICA0IDA5OjI3OjU0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWNvbmZpZy5jIChzaW1fY29uZmlnKTogQWRkIGFzc2VydCBmb3IgU0lNX01BR0lDX05VTUJFUi4KKworCSogc2ltLXV0aWxzLmggKE5aQUxMT0MpOiBEZWZpbmUgLSB6YWxsb2MgKiBOLgorCisJKiBzaW0taHJ3LmMgKHNpbV9yZWFkLCBzaW1fd3JpdGUpOiBOZXcgZmlsZS4gIFByb3ZpZGUgZ2VuZXJpYworIAlpbXBsZW1lbnRhdGlvbiBvZiByZWFkL3dyaXRlIGZ1bmN0aW9ucy4KKworCSogTWFrZS1jb21tb24uaW4gKHNpbS1ocncubyk6IE5ldyB0YXJnZXQuCisKKwkqIHNpbS1iYXNlLmggKFNUQVRFX01FTU9QVF9QKTogRGVsZXRlLCBzaW11bGF0b3JzIF9hbHdheXNfIGFkZAorIAltZW1vcnkuCisKKwkqIHNpbS1tZW1vcHQuYyAobWVtb3J5X29wdGlvbl9oYW5kbGVyKTogSW1wbGVtZW50IG1lbW9yeS1zaXplCisgCWNvbW1hbmQuIEltcGxlbWVudCBtZW1vcnktYWxpYXMgY29tbWFuZC4gIExldCBtZW1vcnktZGVsZXRlIGRlbGV0ZQorIAlhbGwgbWVtb3J5IHJlZ2lvbnMuCisJKGFkZF9tZW1vcHQpOiBOZXcgZnVuY3Rpb24uICBBZGQgYSBtZW1vcnkgcmVnaW9uLgorCShkb19tZW1vcHRfZGVsZXRlKTogTmV3IGZ1bmN0aW9uLiBEZWxldGUgYSBtZW1vcnkgcmVnaW9uLgorCisJKiBzaW0tdXRpbHMuYyAoc2ltX2VsYXBzZWRfdGltZV9nZXQpOiBOZXZlciByZXR1cm4gemVyby4KKworCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfZGV0YWNoKTogTmV3IGZ1bmN0aW9uLgorCShzaW1fY29yZV9tYXBfZGV0YWNoKTogTmV3IGZ1bmN0aW9uLiBQZXJmb3JtIHRoZSBhY3R1YWwgZGV0YWNoLgorCShzaW1fY29yZV9pbml0KTogTW92ZSBpbml0aWFsaXphdGlvbiBjb2RlIGZyb20gaGVyZS4KKwkoc2ltX2NvcmVfaW5zdGFsbCk6IFRvIGhlcmUuCisJKHNpbV9jb3JlX3VuaW5zdGFsbCk6IEFuZCBoZXJlLgorCisJKiBzaW0tbW9kdWxlLmM6IEFkZCBtZW1vcHQgbW9kdWxlLgorCisJKiBzaW0tYmFzZS5oIChTVEFURV9NRU1PUFQsIFNUQVRFX01FTU9QVF9QKTogQWRkIG1lbW9wdCB0bworIAlzaW11bGF0b3IgYmFzZSB0eXBlLgorCisJKiBNYWtlLWNvbW1vbi5pbiAoc2ltX21haW5faGVhZGVycyk6IEFkZCBzaW0tbWVtb3B0LmgKKwkoc2ltLW1lbW9wdC5vKTogTmV3IHRhcmdldC4KKworCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfaW5zdGFsbCk6IEFkZCBjb3JlX29wdGlvbnMgdG8gdGhlIG9wdGlvbgorIAl0YWJsZS4KKworCSogc2ltLXdhdGNoLmMgKHdhdGNoX29wdGlvbnMpOiBNYWtlIC0tZGVsZXRlLXdhdGNoIGEgc3lub255bSBmb3IKKyAJLS13YXRjaC1kZWxldGUuCisKKwkqIHNpbS1jb25maWcuaCAoV0lUSF9NT0RVTE9fTUVNT1JZKTogRGVmaW5lIGFzIDAuICBVcGRhdGUKKyAJY29tbWVudHMuCisKKwkqIHNpbS1jb3JlLmggKHN0cnVjdCBfc2ltX2NvcmVfbWFwcGluZyk6IENoYW5nZSBucl9ieXRlcyB0byB0eXBlCisgCWFkZHJlc3Nfd29yZCwgYWRkIG1hc2sgbWVtYmVyLgorCQorCSogc2ltLWNvcmUuaCwgc2ltLWNvcmUuYyAoc2ltX2NvcmVfYXR0YWNoKTogTWFrZSBucl9ieXRlcyBvZiB0eXBlCisgCWFkZHJlc3Nfd29yZCwgYWxsb3cgZm9yIDY0Yml0IHRhcmdldHMgaW4gMzJiaXQgaG9zdC4gQWRkIG1vZHVsbworIAlhcmd1bWVudC4KKwkoc2ltX2NvcmVfbWFwX2F0dGFjaCk6IERpdHRvLgorCShuZXdfc2ltX2NvcmVfbWFwcGluZyk6IERpdHRvLgorCShzaW1fY29yZV90cmFuc2xhdGUpOiBNYXNrIGFkZHJlc3Mgd2hlbiBtb2R1bG8gbWVtb3J5LgorCitXZWQgU2VwICAzIDE3OjMyOjU0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgorCisJKiBzaW0taGxvYWQuYyAoc2ltX2xvYWQpOiBBZGQgYXNzZXJ0IGZvciBTSU1fTUFHSUNfTlVNQkVSLgorCisJKiBnZGJpbml0LmluOiBOZXcgZmlsZS4KKwkqIGFjbG9jYWwubTQgKFNJTV9BQ19PVVRQVVQpOiBCdWlsZCAuZ2RiaW5pdC4KKwkqIE1ha2UtY29tbW9uLmluIChkaXN0Y2xlYW4pOiBEZWxldGUgLmdkYmluaXQuCisJKC5nZGJpbml0KTogQWRkIHJ1bGUgZm9yLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCisJKiBNYWtlLWNvbW1vbi5pbiAoY2dlbi1ydW4ubyk6IEFkZCBydWxlIGZvci4KKworV2VkIFNlcCAgMyAxMDowODoyMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1yZXN1bWUuYyAoc2ltX3Jlc3VtZSk6IFN1c3BlbmQvcmVzdW1lIHRoZSBzaW11bGF0b3IuCisKKwkqIHNpbS1ldmVudHMuYyAoc2ltX3dhdGNoX3ZhbGlkKTogQ29tcHV0ZSB0b3RhbCBlbGFwc2VkIHRpbWUgZnJvbQorIAlib3RoIHJlc3VtZWQgYW5kIHByZXZpb3VzIGVsYXBzZWQgdGltZS4KKwkoc2ltX2V2ZW50c19pbml0KTogU2V0IGluaXRpYWxfd2FsbGNsb2NrIGFuZCBjdXJyZW50X3dhbGxjbG9jayB0bworIAl6ZXJvLgorCShzaW1fZXZlbnRzX2luc3RhbGwpOiBJbnN0YWxsIHNpbV9ldmVudHNfc3VzcGVuZCBhbmQKKyAJc2ltX2V2ZW50c19yZXN1bWUuCisJKHNpbV9ldmVudHNfd2F0Y2hfY2xvY2spOiBBbGxvdyBmb3Igc3VzcGVuZGVkIHNpbXVsYXRvciB3aGVuCisgCWNvbXB1dGluZyB0aGUgdGltZSBvZiB0aGUgY2xvY2sgZXZlbnQuCisKKwkqIHNpbS1ldmVudHMuaCAoc3RydWN0IF9zaW1fZXZlbnQpOiBBZGQgcmVzdW1lX3dhbGxjbG9jaywgcmVuYW1lCisgCWluaXRpYWxfd2FsbGNsb2NrIHRvIGVsYXBzZWRfd2FsbGNsb2NrLCBzZXQgYm90aCB0byB6ZXJvLgorCShzaW1fZXZlbnRzX2luaXQsIHNpbV9ldmVudHNfdW5pbnN0YWxsKTogRGVsZXRlIHByb3RvdHlwZXMuCisKKwkqIHNpbS1tb2R1bGUuaCAoTU9EVUxFX1NVU1BFTkRfRk4sIE1PRFVMRV9SRVNVTUVfRk4pOiBEZWZpbmUgdHlwZXMuCisJCisJKiBzaW0tbW9kdWxlLmMoc2ltX21vZHVsZV9yZXN1bWUsIHNpbV9tb2R1bGVfc3VzcGVuZCk6IE5ldworIAlmdW5jdGlvbnMuCisKK1dlZCBTZXAgIDMgMTA6MDg6MjEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tY29yZS5jIChzaW1fY29yZV9tYXBfYXR0YWNoKTogQ2xhcmlmeSBtZW1vcnkgb3ZlcmxhcCBlcnJvcgorIAltZXNzYWdlLgorCitUdWUgU2VwICAyIDE0OjU3OjA2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChUQUdTKTogQWRkIHN1cHBvcnQgZm9yICIvKiBUQUdTOiBmb28gKi8iIG1hcmtlci4KKwkqIE1ha2UtY29tbW9uLmluIChUQUdTKTogTGlrZXdpc2UuCisJKiBzaW0tbi1iaXRzLmg6IEFkZCBUQUdTIGNvbW1lbnRzIGZvciBhbGwgZnVuY3Rpb25zLgorCSogc2ltLW4tY29yZS5oOiBMaWtld2lzZS4KKwkqIHNpbS1uLWVuZGlhbi5oOiBMaWtld2lzZS4KKworTW9uIFNlcCAgMSAxMDo1MDoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS11dGlscy5jIChzaW1fc3RhdGVfYWxsb2MpOiBTZXQgQ1BVIGJhY2tsaW5rcywgY2FsbGJhY2sgYW5kCisgCWtpbmQuCisgIAkKKwkqIHNpbS1iYXNlLmggKHNpbV9zdGF0ZV9hbGxvYyk6IEFkZCBjYWxsYmFjayBhbmQga2luZCBhcmd1bWVudHMuCisJCisJKiBzaW0tYmFzZS5oIChJTlZBTElEX0lOU1RSVUNUSU9OX0FERFJFU1MpOiBBZGQgZGVmYXVsdAorIAlkZWZpbml0aW9uLgorCitTYXQgQXVnIDMwIDA5OjQ3OjIxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWZwdS5jIChEUF9HQVJETVNCLCAuLi4pOiBNYWtlIHVuc2lnbmVkLgorCShEUF9GUkFDSElHSCwgRFBfRlJBQ0hJR0gyLCAuLik6IFVzZSBNU01BU0sgdG8gYXZvaWQgTEwuCisKK0ZyaSBBdWcgMjkgMTM6Mzc6NDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tY29yZS5jIChzaW1fY29yZV9tYXBfYXR0YWNoKTogQ2FzdCBhdHRhY2ggZW51bSB0byBpbnQuCisJKHNpbV9jb3JlX3hvcl9yZWFkX2J1ZmZlciwgc2ltX2NvcmVfeG9yX3dyaXRlX2J1ZmZlcik6IE1ha2UKKyAJbnJfdHJhbnNmZXJlZCBhbmQgbnJfdGhpc190cmFuc2ZlciB1bnNpZ25lZC4KKworCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3RpY2tuKTogTiBpcyBzaWduZWQsIGFzIGxpbWl0ZWQgdG8KKyAJTUFYSU5ULgorCisJKiBzaW0tbi1lbmRpYW4uaCAob2Zmc2V0X04pOiBDaGFuZ2Ugc2l6ZSB0byB1bnNpZ25lZC4KKworCSogY2FsbGJhY2suYyAob3NfcG9sbF9xdWl0KTogQWRkIHByb3RvdHlwZXMgZm9yIGtiaGl0IGFuZCBnZXRrZXkuCisKK0ZyaSBBdWcgMjkgMTA6MTA6NTMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tdXRpbHMuYyAoc2ltX2NvcHlfYXJndik6IERlbGV0ZSwgcmVwbGFjZWQgYnkgZHVwYXJndi4KKworCSogc2ltLW9wdGlvbnMuYyAoc2ltX3BhcnNlX2FyZ3MpOiBVc2UgZHVwYXJndi4KKworVGh1IEF1ZyAyOCAxMDozNjozNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzaW0tb3B0aW9ucy5jIChzdGFuZGFyZF9vcHRpb25faGFuZGxlcik6IFVzZSB4c3RyZHVwLCBub3Qgc3RyZHVwLgorCitUaHUgQXVnIDI4IDEyOjA5OjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWJhc2UuaCAoU1RBVEVfQVJDSElURUNUVVJFLCBTVEFURV9UQVJHRVQpOiBBZGQgdG8gc2ltdWxhdG9yCisgCWJhc2UgdHlwZS4KKworCSogc2ltLW9wdGlvbnMuYyAoc3RhbmRhcmRfb3B0aW9ucyk6IEFkZCAtLWFyY2hpdGVjdHVyZT1NQUNISU5FIGFuZAorIAktLXRhcmdldD1UQVJHRVQgb3B0aW9ucy4KKwkoT1BUSU9OX0FSQ0hJVEVDVFVSRSwgT1BUSU9OX1RBUkdFVCk6IERlZmluZS4KKwkoc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIpOiBIYW5kbGUgYXJjaGl0ZWN0dXJlIGFuZCB0YXJnZXQgb3B0aW9ucy4KKwkoYmZkLmgpOiBJbmNsdWRlLgorCQorCSogc2ltLXV0aWxzLmMgKHNpbV9hbmFseXplX3Byb2dyYW0pOiBQYXNzIFNUQVRFX1RBUkdFVCB0bworIAliZmRfb3BlbnIuCisJKHNpbV9hbmFseXplX3Byb2dyYW0pOiBTZXQgcHJvZ19iZmQgYXJjaGl0ZWN0dXJlIGZyb20KKyAJU1RBVEVfQVJDSElURUNUVVJFIGlmIGtub3duLgorCitXZWQgQXVnIDI3IDE4OjEzOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworV2VkIEF1ZyAyNyAxODoxMTozMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGFjbG9jYWwubTQgKGVuYWJsZS1zaW0td2FybmluZ3MpOiBSZW1vdmUgY29tbWVudCBzdGF0aW5nCisgCXRoYXQgb3B0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGNlcnRhaW4gZmlsZXMuCisKK1dlZCBBdWcgMjcgMTU6MTM6MDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tYml0cy5oIChMU0JJVDgsIExTQklUMTYsIExTQklUMzIsIExTQklUNjQsIExTQklULCBNU0JJVDgsCisgCU1TQklUMTYsIE1TQklUMzIsIE1TQklUNjQsIE1TQklUKTogTmV3IG1hY3JvcyAtIHNpbmdsZSBiaXQgYXMKKyAJb2Zmc2V0IGZyb20gTVNCL0xTQi4KKworCSogc2ltLWVuZGlhbi5oIChBMV84LCBBMl84LCBBNF84LCBBMV80LCBBMl80LCBBMV8yKTogTmV3IG1hY3JvLAorIAlhY2Nlc3MgYWRkcmVzcyBvZiBzdWIgd29yZCBxdWFudGl0eSBvZiBhIGhvc3RzIDE2LCAzMiwgNjQgYml0IHdvcmQKKyAJdHlwZS4KKwkoVjFfMiwgVjFfNCwgVjJfNCwgVjFfOCwgVjJfOCwgVjRfOCk6IERpdHRvIGZvciB2YWx1ZXMuCisJKFU4XzEsIFU4XzIsIFU4XzQsIFU0XzEsIFU0XzIsIFUyXzEpOiBEaXR0byBmb3Igc2V0IG9mIHZhbHVlcy4KKwkoVjJfSDEsIFYyX0wxLCBWNF9IMiwgVjRfTDIsIFY4X0w0LCBWOF9INCk6IEdpdmVuIE4gYnl0ZSBhcmd1bWVudCwKKyAJcmV0dXJuIE4qMiBieXRlIHZhbHVlIHdpdGggYXJndW1lbnQgaW4gSGkvTG8gd29yZC4gIFJlbmFtZWQgZnJvbQorIAlWMV9IMiwgVjFfTDIsIFYyX0g0LCBWMl9MNCwgVjRfSDgsIFY0X0w4LgorIAkKKwkqIHNpbS1hbHUuaCAoQUxVMzJfSEFEX09WRVJGTE9XKTogVXNlIDY0IGJpdCBtYXNrIG5vdCAzMmJpdC4KKwkoQUxVMTZfSEFEX0NBUlJZLCBBTFUzMl9IQURfQ0FSUlksIEFMVTE2X0hBRF9PVkVSRkxPVyk6IFVzZSBNU0JJVAorIAlzbyB0aGF0IGJpdCBvZmZzZXQgaXMgZXhwbGljaXQuCisKK1dlZCBBdWcgMjcgMTE6NTU6MzUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tdXRpbHMuYyAoc2ltX2FuYWx5emVfcHJvZ3JhbSk6IEFkZCBwcm9nX25hbWUgYXJndW1lbnQuCisgIAlVcGRhdGUgU1RBVEVfUFJPR19CRkQgd2hlbiBuZWVkZWQgd2l0aCBhIGR1cCdkIGNvcHkgb2YgdGhlCisgCXByb2dyYW0uCisKKwkqIHNpbS1jb25maWcuYyAoc2ltX2NvbmZpZyk6IERlbGV0ZSBBQkZEIGFyZ3VtZW50LCB1c2UKKyAJU1RBVEVfUFJPR19CRkQgZGlyZWN0bHkuCisKK1R1ZSBBdWcgMjYgMTI6NTU6MjYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBydW4uYyAobWFpbik6IFBhc3MgdGhlIG9wZW4gQUJGRCB0byBzaW1fY3JlYXRlX2luZmVyaW9yLgorCQorCSogbnJ1bi5jIChtYWluKTogRGV0ZXJtaW5lIHByb2dfYmZkLiAgUGFzcyB0byBzaW1fY3JlYXRlX2luZmVyaW9yCisgCWFuZCBzaW1fbG9hZC4KKwkoYmZkLmgpOiBJbmNsdWRlLgorCQorCSogc2ltLWhsb2FkLmMgKHNpbV9sb2FkKTogTmV3IGZpbGUuIEltcGxlbWVudCBnZW5lcmljIHNpbV9sb2FkIGZvcgorIAloYXJkd2FyZSBvbmx5IHNpbXVsYXRvciB0YXJnZXRzLgorCisJKiBNYWtlLWNvbW1vbi5pbiAoc2ltLWhsb2FkLm8pOiBBZGQgcnVsZS4KKworV2VkIEF1ZyAyNyAwOTo1MTo0MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS11dGlscy5jIChzaW1fY29weV9hcmd2KTogUmV3cml0ZSB0byBtYXRjaCBtYWxsb2Mgc3RyYXRlZ3kKKyAJdXNlZCBieSBjb3B5YXJndiBhbmQgZnJlZWFyZ3YuCisKKwkqIHNpbS1vcHRpb25zLmMgKHNpbV9wYXJzZV9hcmdzKTogU2F2ZSBhIGNvcHkgb2YgUFJPRy1BUkdTIGluCisgCVNUQVRFX1BST0dfQVJHViwgbm90IGp1c3QgYSBwb2ludGVyLgorCitNb24gQXVnIDI1IDE3OjUwOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworTW9uIEF1ZyAyNSAxMjoxMTowNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGFjbG9jYWwubTQgKHNpbS1lbmRpYW4pOiBBZGQgc2Vjb25kIGFyZ3VtZW50IHRvCisgCVNJTV9BQ19PUFRJT05fRU5ESUFOLiAgRmlyc3QgaXMgaGFyZHdpcmVkIGVuZGlhbiwgc2Vjb25kIGlzCisgCWRlZmF1bHQgZW5kaWFuIHdoZW4gbm90IGhhcmR3aXJlZC4KKworCSogc2ltLWNvbmZpZy5oIChXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVIpOiBOZXcgbWFjcm8sIGlmIGFsbAorIAllbHNlIGZhaWxlcyB2YWx1ZSBmb3IgdGFyZ2V0IGJ5dGUgb3JkZXIuCisKKwkqIHNpbS1jb25maWcuYyAoc2ltX2NvbmZpZyk6IEFkZCBhYmZkIGFyZ3VtZW50cy4gU2V0CisgCVNUQVRFX1BST0dfQkZEIGFjY29yZGluZ2x5LiAgRGV0ZXJtaW5lIHByZWZlcmVkX3RhcmdldF9ieXRlX29yZGVyCisgCWZyb20gc2FtZS4KKwkoc2ltX2NvbmZpZyk6IFJldHVybiBTSU1fUkMsIGRvbid0IGFib3J0LgorCShiZmQuaCk6IEluY2x1ZGUuCisJCisJKiBydW4uYyAobWFpbik6IFVwZGF0ZSBjYWxsIHRvIHNpbV9vcGVuIC0gYWRkIEFCRkQgYXJndW1lbnQuCisgIAkqIG5ydW4uYyAobWFpbik6IEFkZCBOVUxMIEFCRkQgYXJndW1lbnQuCisKK1RodSBBdWcgMTQgMTI6NDg6NTcgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY2FsbGJhY2suYyAob3NfcG9sbF9xdWl0KTogTWFrZSBzdGF0aWMuCisJQ2FsbCBzaW1fY2JfZXByaW50Ziwgbm90IHAtPmVwcmludGYuCisJKHNpbV9jYl9wcmludGYsIHNpbV9jYl9lcHJpbnRmKTogTmV3IGZ1bmN0aW9ucy4KKwkqIHNpbS11dGlscy5oIChzaW1fY2JfcHJpbnRmLCBzaW1fY2JfZXByaW50Zik6IERlY2xhcmUuCisKKwkqIHNpbS1iYXNpY3MuaCAoemFsbG9jLHpmcmVlLHNpbV9hZGRfY29tbWFzLFNJTV9FTEFQU0VEX1RJTUUsCisJc2ltX2VsYXBzZWRfdGltZV9nZXQsc2ltX2VsYXBzZWRfdGltZV9zaW5jZSk6IE1vdmUgZGVjbHMgdG8KKwlzaW0tdXRpbHMuaC4gI2luY2x1ZGUgc2ltLXV0aWxzLmguCisJKiBzaW0tdXRpbHMuaDogQWJvdmUgZGVjbHMgbW92ZWQgaGVyZS4KKwkoc2ltX2FuYWx5emVfcHJvZ3JhbSxzaW1fbG9hZF9maWxlKTogVXNlIGBzdHJ1Y3QgX2JmZCcsIG5vdCBgYmZkJy4KKworCSogc2ltLXdhdGNoLmMgKGFjdGlvbl93YXRjaHBvaW50KTogRml4IHRoaW5rb3MuCisKK1RodSBKdWwgMjQgMDg6NDg6MDUgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogc2ltLXR5cGVzLmg6ICBGaXggZGVmcyBvZiA2NCBiaXQgZGF0YSB0eXBlcyBmb3IgTVNWQy4KKworVHVlIEp1bCAyMiAxMDozNTozNyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzaW0tbi1jb3JlLmggKHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF9OKTogQWRkIG1pc3NpbmcgYnJlYWsKKwl0byBGT1JDRURfQUxJR05NRU5UIGNhc2UuCisKK1RodSBKdW4gIDUgMTM6NDg6MzcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjYWxsYmFjay5jICh0YXJnZXRfdG9faG9zdF9vcGVuKTogSGFuZGxlIGhvc3RzIHdpdGggT19CSU5BUlkuCisKK1RodSBKdW4gIDUgMDg6NDc6MTAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBNYWtlLWNvbW1vbi5pbiAobGlic2ltLmEpOiBGaXggdHlwby4KKworVGh1IEp1biAgNSAxMzo0ODozNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIG5ydW4uYyAobWFpbik6IFZlcmlmeSB0aGUgc3RydWN0dXJlIHJldHVybmVkIGJlZm9yZSB1c2luZyBpdC4KKworV2VkIEp1biAgNCAxMTo0NDowNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1jb25maWcuaCAoV0lUSF9FTkdJTkUpOiBFbmFibGUgdGhlIHNpbS1lbmdpbmUgbW9kdWxlIGJ5CisgCWRlZmF1bHQuCisKKwkqIHNpbS1lbmdpbmUuYyAoc2ltX2VuZ2luZV9pbnN0YWxsKTogTmV3IGZ1bmN0aW9uLiAgSW5zdGFsbCB0aGUKKyAJZW5naW5lIGluaXQgZnVuY3Rpb25zLgorCShzaW1fZW5naW5lX2luaXQpOiBbUmVdaW5pdGlhbGl6ZSB0aGUgc2ltdWxhdG9yIGVuZ2luZS4KKwkKKwkqIHNpbS1tb2R1bGUuYzogQWRkIHNpbV9lbmdpbmUgdG8gbGlzdCBvZiBtb2R1bGVzIHRoYXQgYWx3YXlzCisgCWluc3RhbGwuCisKK1R1ZSBKdW4gIDMgMDQ6NTI6MDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0td2F0Y2guYyAoc2NoZWR1bGVfd2F0Y2hwb2ludCk6IFVzZSBzaW1fdW5zY2hlZHVsZV93YXRjaHBvaW50CisgCXRvIHJlbW92ZSB0aGUgb2xkIHdhdGNocG9pbnQsIG5vdCBkZWxldGVfd2F0Y2hwb2ludC4KKwkod2F0Y2hfb3B0aW9uX2hhbmRsZXIpOiBBY3Rpb24gdGhlIGNvcnJlY3Qgd2F0Y2hwb2ludCwgbm90IGp1c3QKKyAJY3ljbGVzLgorCitXZWQgTWF5IDI4IDE0OjQ3OjQxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLW4tY29yZS5oIChzaW1fY29yZV93cml0ZV9hbGlnbmVkX04pOiBGb3IgOGJ5dGUgcmVhZHMsIG91dHB1dAorIAlib3RoIGxvdyBhbmQgaGlnaCB3b3JkLgorCShzaW1fY29yZV93cml0ZV9hbGlnbmVkX04pOiBEaXR0by4KKwkKKwkqIHNpbS10cmFjZS5jIChzZXRfdHJhY2Vfb3B0aW9ucyk6IERlbGV0ZSBjb2RlIGV4cGxpY2l0bHkgc2V0dGluZworIAljb3JlLT50cmFjZS4KKworCSogc2ltLW9wdGlvbnMuYyAoc2ltX3ByaW50X2hlbHApOiBDYWxsIHRoZSBsaXN0IGNvbW1hbmRzIGlmIG5vdCBhCisgCXN0YW5kYWxvbmUgc2ltdWxhdG9yLgorCShzaW1fcHJpbnRfaGVscCk6IEFkdmlzZSB0aGF0IHNvbWUgb3B0aW9ucyBtYXkgbm90IGJlIGFwcGxpY2FibGUuCisJCisJKiBzaW0tdHJhY2UuYyAoc2V0X3RyYWNlX29wdGlvbnMpOiBBc3N1bWUgY29yZSBwcmVzZW50LgorCisJKiBzaW0tZXZlbnRzLmMgKHNpbV9ldmVudHNfc2NoZWR1bGVfYWZ0ZXJfc2lnbmFsKTogT3ZlcmZsb3cgc2lnbmFsCisgCWJ1ZmZlciB3aGVuIGZ1bGwgbm90IGFsbW9zdCBmdWxsLgorCitUdWUgTWF5IDI3IDE0OjMyOjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3Byb2Nlc3MpOiBEb24ndCBibGF0IHRoZSBldmVudCBxdWV1ZQorIAl3aGVuIHByb2Nlc3Npbmcgd2F0Y2hwb2ludHMuCisKKwkqIHNpbS13YXRjaC5oOiBNYWtlIGFyZyB1bnNpZ25lZCBsb25nIC0gc3RvcCBzaWduIGV4dGVuc2lvbi4KKworCSogc2ltLWV2ZW50cy5jIChzaW1fd2F0Y2hfdmFsaWQpOiByZXdyaXRlIHNvIGRlYnVnYWJsZS4KKworCSogc2ltLWNvbmZpZy5oIChXSVRIX1hPUl9FTkRJQU4pOiBEZWZhdWx0IHRvIHplcm8uCisKKwkqIHNpbS13YXRjaC5jIChzY2hlZHVsZV93YXRjaHBvaW50KTogQWRkIGlzX3dpdGhpbiBvcHRpb24gc28gdGhhdAorIAlpbmVxdWFsaXR5IHRlc3QgaXMgcG9zc2libGUuCisJKGhhbmRsZV93YXRjaHBvaW50KTogUmUtcGFzcyBpc193aXRoaW4gYXJnLgorCSh3YXRjaF9vcHRpb25faGFuZGxlcik6IFdoZW4gYCEnIHByZWZpeCB0byBwYy13YXRjaHBvaW50IGFyZyBwYXNzCisgCTAgdG8gc2NoZWR1bGVfd2F0Y2hwb2ludCdzIGlzX3dpdGhpbiBhcmcuCisJKHNpbV93YXRjaHBvaW50X2luaXQpOiBSZS1wYXNzIGlzX3dpdGhpbiBhcmcuCisKKwkqIHNpbS1vcHRpb25zLmMgKHNpbV9wcmludF9oZWxwKTogQWRkIGlzX2NvbW1hbmQgYXJndW1lbnQuICBEb24ndAorIAlpbmNsdWRlIC0tIHByZWZpeCB3aGVuIGNhbGxlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgaW50ZXJwcmV0ZXIuCisKKwkqIHNpbS13YXRjaC5jIChzY2hlZHVsZV93YXRjaHBvaW50KTogUGFzcyB0cnVlIGlzX3dpdGhpbiBhcmd1bWVudC4KKworCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3dhdGNoX3NpbSk6IEFkZCBpc193aXRoaW4gYXJndW1lbnQsCisgCXplcm8gaW5kaWNhdGVzIHRoYXQgdGhlIHRlc3Qgc2hvdWxkIGJlIHJldmVyc2VkLgorCShzaW1fZXZlbnRzX3dhdGNoX2NvcmUpOiBEaXR0by4KKwkoV0FUQ0hfQ09SRSk6IENvbXBhcmUgcmFuZ2UgYWdhaW5zdCBpc193aXRoaW4uCisJKFdBVENIX1NJTSk6IERpdHRvLgorCitUdWUgTWF5IDI3IDEyOjQ4OjAzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjIuY3lnbnVzLmNvbT4KKworCSogc2ltLWV2ZW50cy5jIChXQVRDSF9DT1JFKTogUGFzcyBOVUxMIGNwdSBhcmd1bWVudCB0bworIAlzaW1fY29yZV9yZWFkX2J1ZmZlci4gIENoZWNrIG5yLWJ5dGVzIHRyYW5zZmVyZWQuCisKKwkqIHNpbS1jb3JlLmggKHNpbV9jb3JlX2NvbW1vbik6IERlZmluZSBhIG5ldyBzdHJ1Y3QgdGhhdCBjb250YWlucworIAl0aGUgY29tbW9uIGRhdGEuICB0byBzZCBhbmQgY3B1IHN0cnVjdHVyZXMuCisJKiBzaW0tY29yZS5jIChzaW1fY29yZV9hdHRhY2gpOiBVcGRhdGUuCisJKHNpbV9jb3JlX2luaXQpOiBVcGRhdGUuIFJlbWVtYmVyIHRvIGNvcHkgaW5pdGlhbGl6ZWQgZGF0YSB0byBlYWNoCisgCWNwdS4KKwkoc2ltX2NvcmVfZmluZF9tYXBwaW5nKTogRGl0dG8uCisKKwkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3JlYWRfYnVmZmVyKTogQWRkIGNwdSBhcmd1bWVudC4KKwkoc2ltX2NvcmVfd3JpdGVfYnVmZmVyKTogRGl0dG8uCisKKwkqIHNpbS1uLWNvcmUuaCAoc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfTik6IFdoZW4gbWlzLWFsaWduZWQKKyAJdHJhbnNmZXIgdXNlIHhvciB2ZXJzaW9uIG9mIHJlYWQgYnVmZmVyLgorCShzaW1fY29yZV93cml0ZV91bmFsaWduZWRfTik6IERpdHRvIGZvciB3cml0ZS4KKwkKKwkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3hvcl9yZWFkX2J1ZmZlcik6IE5ldyBmdW5jdGlvbiBpbXBsZW1lbnQKKyAJeG9yLWVuZGlhbiBkYXRhIHJlYWQgYnJlYWtpbmcgdHJhbnNmZXIgdXAgaW50byB4b3ItZW5kaWFuIHNpemVkCisgCWJsb2Nrcy4KKwkoc2ltX2NvcmVfeG9yX3dyaXRlX2J1ZmZlcik6IERpdHRvIGZvciB3cml0ZS4KKwkocmV2ZXJzZV9uKTogUmV2ZXJzZSBvcmRlciBvZiBhcmJpdHJhcnkgbnVtYmVyIG9mIGJ5dGVzIGluIGJ1ZmZlcgorIAktIG5lZWRlZCBmb3IgeG9yLWVuZGlhbiB0cmFuc2ZlcnMuCisKK0ZyaSBNYXkgMjMgMTQ6MjQ6MzEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0taW5saW5lLmg6IFJldmlldyBkZXNjcmlwdGlvbi4KKwkKKwkqIHNpbS1jb3JlLmgsIHNpbS1jb3JlLmM6IFJlZHVjZSBudW1iZXIgb2YgZnVuY3Rpb25zIGJlaW5nIGlubGluZWQKKyAJdG8ganVzdCB0aG9zZSBpbnZvbHZlZCBpbiBkYXRhIHRyYW5zZmVycyBhbmQgY29uZmlndXJhdGlvbi4KKwkKKwkqIHNpbS14Y2F0LmggKFhTVFJJTkcpOiBOZXcgbWFjcm8sIG1hcCBtYWNybyBkZWZpbml0aW9uIG9udG8KKyAJc3RyaW5nLgorCSogc2ltLW4tY29yZS5oIChzaW1fY29yZV9yZWFkX2FsaWduZWRfTik6IFVzZS4KKwkoc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfTik6IERpdHRvLgorCShzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF9OKTogRGl0dG8uLgorCShzaW1fY29yZV93cml0ZV91bmFsaWduZWRfTik6IERpdHRvLgorCQorCSogc2ltLWNvcmUuaDogQWRkIHhvciBlbmRpYW4gYml0bWFwIHRvIG1haW4gc3RydWN0dXJlLiAgKgorCQorIAlzaW0tbi1jb3JlLmggKHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfTik6IEFkZCBzdXBvcnQgZm9yIHhvcgorIAllbmRpYW4uCisJKHNpbV9jb3JlX3JlYWRfYWxpZ25lZF9OKTogRGl0dG8uCisKKwkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3NldF94b3JfZW5kaWFuKTogTmV3IGZ1bmN0aW9uLgorCShzaW1fY29yZV9hdHRhY2gpOiBEb24ndCBvdmVyd3JpdGUgdGhlIHBlci1jcHUgeG9yIG1hcCB3aGVuCisgCWNsb25pbmcgdGhlIGdsb2JhbCBjb3JlLgorCitGcmkgTWF5IDIzIDEwOjUzOjEzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWVuZ2luZS5oOiBVcGRhdGUgYmVsb3cgc28gdGhhdCBpdCBpcyB1c2luZyBhbiBlbnVtZXJhdGVkCisgCXR5cGUuCisKK1RodSBNYXkgMjIgMDk6MTI6MTYgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIHNpbS1lbmdpbmUuYyAoc2ltX2VuZ2luZV9yZXN0YXJ0KTogCisJKiBzaW0tcmVzdW1lLmMgKHNpbV9yZXN1bWUpOiBDaGFuZ2UgbG9uZ2ptcCBwYXJhbS9zZXRqbXAgCisgCXJldHVybiB2YWx1ZSB1c2VkIGZvciBzaW11bGF0b3IgcmVzdGFydCBmcm9tIDAgdG8gMi4KKworV2VkIE1heSAyMSAwODo0NzozMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNnZW4tc2NhY2hlLmMgKHNjYWNoZV9vcHRpb25faGFuZGxlcik6IEFkZCBpc19jb21tYW5kIGFyZy4KKworCSogc2ltLW1vZGVsLmMgKG1vZGVsX29wdGlvbl9oYW5kbGVyKTogQWRkIGlzX2NvbW1hbmQgYXJndW1lbnQuCisKKwkqIHNpbS1wcm9maWxlLmMgKHByb2ZpbGVfb3B0aW9uX2hhbmRsZXIpOiBBZGQgaXNfY29tbWFuZCBhcmcuCisKKwkqIHNpbS1ldmVudHMuYyAoc2ltX3dhdGNoX3ZhbGlkKTogVXNlIHViNjQsIGxiNjQgd2hlbiA2NGJpdCB2YWx1ZQorIAlpbnZvbHZlZC4KKworCSogc2ltLW1vZHVsZS5jIChzaW1fbW9kdWxlX2FkZF9pbml0X2ZuKTogQ2FsbCBpbml0IGZuIGluIHRoZSBzYW1lCisgCW9yZGVyIHRoYXQgdGhleSBhcmUgcmVnaXN0ZXJlZC4KKworCSogc2ltLW9wdGlvbnMuaCAoT1BUSU9OX0hBTkRMRVIpOiBBZGQgYXJndW1lbnQgdG8gZGlmZmVyZW50aWF0ZQorIAliZXR3ZWVuIG9wdGlvbiBhbmQgY29tbWFuZCBsaW5lIHByb2Nlc3NpbmcuCisKKwkqIHNpbS1vcHRpb25zLmM6IEluY2x1ZGUgc3RkbGliLmgsIGN0eXBlLmguCisKKwkqIE1ha2UtY29tbW9uLmluIChzaW0td2F0Y2gubyk6IEFkZCBydWxlLgorCShzaW1fbWFpbl9oZWFkZXJzKTogQXNzdW1lIHNpbS1hc3NlcnQuaCBpbmNsdWRlZC4KKwkoc2ltLSoubyk6IFNpbXBsaWZ5IG1ha2UgcnVsZS4KKwkKKwkqIHNpbS1tb2R1bGUuYzogQWRkIHNpbV93YXRjaF9pbnN0YWxsIHRvIG1vZHVsZSBsaXN0LgorCitUdWUgTWF5IDIwIDE0OjE1OjIzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWJhc2UuaCAoU1RBVEVfTE9BREVEX1ApOiBOZXcgcHJlZGljYXRlLiBTZXQgb25jZSBldmVyeXRoaW5nCisgCWhhcyBiZWVuIGxvYWRlZC4KKworCSogc2ltLXRyYWNlLmMgKHRyYWNlX2luc3RhbGwpOiBDaGVjayBtYWdpYy4gSW5jbHVkZSBzaW0tYXNzZXJ0LmguCisJKiBzaW0tZXZlbnRzLmMgKHNpbV9ldmVudHNfaW5zdGFsbCk6IERpdHRvLgorCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfaW5zdGFsbCk6IERpdHRvLgorCSogc2ltLW1vZGVsLmMgKG1vZGVsX2luc3RhbGwpOiBEaXR0by4KKwkqIHNpbS1vcHRpb25zLmMgKHN0YW5kYXJkX2luc3RhbGwpOiBEaXR0by4KKwkqIHNpbS1wcm9maWxlLmMgKHByb2ZpbGVfaW5zdGFsbCk6IERpdHRvLgorCSogc2ltLXJlYXNvbi5jIChzaW1fc3RvcF9yZWFzb24pOiBEaXR0by4KKwkqIHNpbS1ydW4uYyAoc2ltX2VuZ2luZV9ydW4pOiBEaXR0by4KKwkqIHNpbS11dGlscy5jIChzaW1fYW5hbHl6ZV9wcm9ncmFtKTogRGl0dG8uCisKKwkqIHNpbS1tb2R1bGUuYyAobW9kdWxlcyk6IE1ha2UgcHJvZmlsZV9pbnN0YWxsIGFuZCB0cmFjZV9pbnN0YWxsCisgCW9wdGlvbmFsLgorCisJKiBzaW0tYmFzZS5oIChTVEFURV9NRU1fQkFTRSk6IERlZmluZSBmb3IgZmxhdCBtZW1vcnkgc3lzdGVtcy4KKworCSogc2ltLW9wdGlvbnMuYyAoc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIpOiBTZXQgdGhlIGJ5dGUgb3JkZXIuCisKKwkqIHNpbS1ldmVudHMuYyAoc2ltX2V2ZW50c19wcm9jZXNzKTogQWxsb3cgbXVsdGkgdGljayBwcm9jZXNzaW5nLgorCShzaW1fZXZlbnRzX3RpY2tuKTogTmV3IGZ1bmN0aW9uIC0gbXVsdGkgY3ljbGUgdGljay4KKwkKKwkqIHNpbS1ldmVudHMuaCAoc2ltX2V2ZW50c190aWNrbiwgc2ltX2V2ZW50c190aW1ld2FycCk6IEFkZAorIAlwcm90b3R5cGVzLiAgVW5kZXIgZGV2ZWxvcG1lbnQuCisJKHNpbV9ldmVudHMpOiBSZXBsYWNlIHByb2Nlc3Npbmcgd2l0aCBucl90aWNrc190b19wcm9jZXNzLgorCitUdWUgTWF5IDIwIDA5OjM5OjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogbnJ1bi5jIChtYWluKTogUGFzcyBjYWxsYmFja3MgdG8gc2ltX29wZW4gaW5zdGVhZCBvZiB1c2luZworIAlzaW1fc2V0X2NhbGxiYWNrcy4KKworCSogcnVuLmMgKG1haW4pOiBEaXR0by4KKworTW9uIE1heSAxOSAxMjowNzoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1ldmVudHMuYyAoc2ltX2V2ZW50c196YWxsb2MpOiBTaWduYWwgc2F2ZSBtZW1vcnkgYWxsb2NhdG9yIC0KKyAJc3RvcCB0ayBpbnRlcnJ1cHRpbmcgbWFsbG9jIGNhbGxzLgorCShzaW1fZXZlbnRzX3phbGxvYyk6IENvbnZlcnNlLgorCisJKiBNYWtlLWNvbW1vbi5pbiAoc2ltX21haW5faGVhZGVycyk6IEFkZCBzaW0tZXZlbnRzLmguCisKKwkqIHNpbS1ldmVudHMuYyAoc2ltX2V2ZW50c19zY2hlZHVsZV9hZnRlcl9zaWduYWwpOiBDaGFuZ2UgcmV0dXJuCisgCXR5cGUgdG8gdm9pZCAtIHNpZ25hbCBldmVudHMgYXJlIHN0cmljdGx5IGludGVybmFsLgorCShzaW1fZXZlbnRzX2luaXQpOiBBbGxvY2F0ZSBhIGZpbml0ZSBidWZmZXIgZm9yIHNpZ25hbCBldmVudHMuCisJKHNpbV9ldmVudHNfc2NoZWR1bGVfYWZ0ZXJfc2lnbmFsKTogRW50ZXIgc2lnbmFsIGV2ZW50cyBpbnRvIHRoZQorIAlzaWduYWwgYnVmZmVyLgorCisJKiBzaW0tZW5naW5lLmMgKHNpbV9lbmdpbmVfaGFsdCk6IENoZWNrIFNJTV9ERVNDIG1hZ2ljLgorCShzaW1fZW5naW5lX3Jlc3RhcnQpOiBEaXR0by4KKwkoc2ltX2VuZ2luZV9hYm9ydCk6IERpdHRvLgorCSogc2ltLXN0b3AuYyAoc2ltX3N0b3ApOiBEaXR0by4KKwkoY29udHJvbF9jX3NpbXVsYXRpb24pOiBEaXR0by4KKwkqIHNpbS1yZXN1bWUuYyAoc2ltX3Jlc3VtZSk6IERpdHRvLgorCShoYXNfc3RlcHBlZCk6IERpdHRvLgorCSogc2ltLWFib3J0LmMgKHNpbV9lbmdpbmVfYWJvcnQpOiBEaXR0by4KKworCSogc2ltLWJhc2ljcy5oICh0cmFuc2Zlcl90eXBlKTogTmV3IHR5cGUuCisKKwkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX3NpZ25hbCk6IE5ldyBmdW5jdGlvbi4gUHJpbnQgY29yZSBzaWduYWwKKyAJaW5mb3JtYXRpb24uCisJKHNpbV9jb3JlX2ZpbmRfbWFwcGluZyk6IEFkZCB0cmFuc2ZlciBhcmd1bWVudC4KKworCSogc2ltLW4tY29yZS5oIChzaW1fY29yZV97d3JpdGUsd3JpdGV9X3VuYWxpZ25lZF9OKTogQ2FsbAorIAlTSU1fQ09SRV9TSUdOQUwgaWYgYSByZWNvdmVyYWJsZSBhYm9ydC4KKwkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX2ZpbmRfbWFwcGluZyk6IERpdHRvLgorCitGcmkgTWF5IDE2IDE1OjEzOjIxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfZmluZF9tYXBwaW5nKTogUmVwbGFjZSBjYWxscyB0bworIAlzaW1faW9fZXJyb3IgdG8gbW9yZSByZXNpbGlhbnQgc2ltX2VuZ2luZV9hYm9ydC4KKworCSogc2ltLW4tY29yZS5oIChzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF9OKTogRGl0dG8uCisJKHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF9OKTogRGl0dG8uCisKK1R1ZSBNYXkgMTMgMTM6NTA6MDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tbW9kdWxlLmM6IEFkZCBzaW1fZXZlbnRzX2luc3RhbGwgdG8gbGlzdC4KKwkKKwkqIHNpbS1ldmVudHMuYyAoc2ltX2V2ZW50c19pbnN0YWxsLCBzaW1fZXZlbnRzX3VuaW5zdGFsbCk6IENsb25zZQorIAlmcm9tIHNpbV9jb3JlXyouCisJKHNpbV9ldmVudHNfaW5pdCk6IE5vdyByZXR1cm5zIFNJR19SQy4KKworCSogc2ltLXJ1bi5jOiBOZXcgZmlsZS4gR2VuZXJpYyBzaW1fZW5naW5lX3J1bi4KKwkqIHNpbS1yZWFzb24uYzogTmV3IGZpbGUuIEdlbmVyaWMgc2ltX3N0b3BfcmVhc29uLgorCSogc2ltLXN0b3AuYzogTmV3IGZpbGUuIEdlbmVyaWMgc2ltX3N0b3AuCisJKiBzaW0tcmVzdW1lLmM6IE5ldyBmaWxlLiBHZW5lcmljIHNpbV9yZXN1bWUuCisJCisJKiBNYWtlLWNvbW1vbi5pbiAoc2ltLWVuZ2luZS5vKTogQWRkIHJ1bGUuCisJKHNpbS1ydW4ubywgc2ltLXJlYXNvbi5vLCBzaW0tc3RvcC5vLCBzaW0tcmVzdW1lLm8pOiBEaXR0by4KKwkKKwkqIHNpbS1lbmdpbmUuaCwgc2ltLWVuZ2luZS5jOiBOZXcgZmlsZS4gUHJvdmlkZSBnZW5lcmljCisgCWltcGxlbWVudGF0aW9uIG9mIHNpbV9lbmdpbmVfaGFsdCwgc2ltX2VuZ2luZV9lcnJvci4gZXQuYWwuCisKKwkqIHNpbS1iYXNlLmggKHNpbV9zdGF0ZV9iYXNlKTogQWRkIG1lbWJlciBoYWx0LgorCShzaW0tZW5naW5lLmgpOiBJbmNsdWRlLgorCisJKiBzaW0tZXZlbnRzLmggKHNpbV9ldmVudF9oYW5kbGVyKTogQWx3YXlzIHBhc3MgU0lNX0RFU0MgdG8gZXZlbnQKKyAJaGFuZGxlcnMuCisJKiBzaW0tZXZlbnRzLmMgKHNpbV9ldmVudHNfcG9sbCk6IFVwZGF0ZSBldmVudCBoYW5kbGVyLgorCitUdWUgTWF5IDEzIDA5OjU3OjQ5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjIuY3lnbnVzLmNvbT4KKworCSogc2ltLWV2ZW50cy5oLCBzaW0tZXZlbnRzLmMgKHNpbV9ldmVudHNfd2F0Y2hfY2xvY2spOiBOZXcKKyAJZnVuY3Rpb24uCisJKHNpbV9ldmVudHNfd2F0Y2hfc2ltKTogTmV3IGZ1bmN0aW9uLgorCShzaW1fZXZlbnRzX3dhdGNoX2NvcmUpOiBOZXcgZnVuY3Rpb24uCisJKHNpbV93YXRjaF92YWxpZCk6IE5ldyBmdW5jdGlvbi4KKwkoc2ltX2V2ZW50c19wcmVwcm9jZXNzKTogTmV3IGZ1bmN0aW9uLgorCShzaW1fZXZlbnRzX3Byb2Nlc3MpOiBQcm9jZXNzIHRoZSB3YXRjaHBvaW50cyBhcyB3ZWxsIGFzIHRoZSB0aW1lcgorIAlxdWV1ZS4KKwkoc2ltX2V2ZW50c190aWNrKTogQ2hlY2sgV09SS19QRU5ESU5HIGluc3RlYWQgb2YgdGhlIGhvbGQgcXVldWUuCisJKHNpbV9ldmVudHNfZGVzY2hlZHVsZSk6IENoZWNrIGFsbCB0aGUgcXVldWVzIHdoZW4gcmVtb3ZpbmcgYW4KKyAJZXZlbnQuCisJKHNpbV9ldmVudHNfaW5pdCk6IERpdHRvIGZvciBjbGVhbmluZy4KKworTW9uIE1heSAxOSAxMjowNzoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1mcHUuYyAoaXNfdWZwdV9udW1iZXIpOiBDb21tZW50IG91dCAtIGN1cnJlbnRseSB1bnVzZWQuCisKK01vbiBNYXkgMTkgMTE6MjM6MDMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjYWxsYmFjay5jIChvc19vcGVuKTogVHlwZSBvZiBhcmcgZmxhZ3MgaXMgaW50LgorCitGcmkgTWF5IDE2IDIyOjI2OjQzIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBzaW0tZnB1LmMgKHNpbV9mcHVfaXNfe2VxLG5lLGx0LGxlLGd0LGdlfSk6IENvbXBhcmUgSW5maW5pdGllcworCWp1c3QgbGlrZSBub3JtYWwgbnVtYmVycyBhcyBwZXIgSUVFRSBydWxlcy4KKworV2VkIE1heSAxNCAyMToyMDozOCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogY2FsbGJhY2suYyAob3NfY2xvc2UpOiBNYXJrIHRoZSBkZXNjcmlwdG9yIGFzIGJlaW5nCisJYXZhaWxhYmxlIGlmIHRoZSBjbG9zZSBzdWNjZWVkZWQuCisJKG9zX29wZW4pOiBQYXNzIDA2NDQgYXMgdGhlIG1vZGUgb2YgdGhlIGZpbGUgYmVpbmcgY3JlYXRlZC4KKworVGh1IE1heSAxNSAxMDo1ODo1MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1mcHUuYyAocGFja19mcHUsIHVucGFja19mcHUpOiBOZXcgZnVuY3Rpb25zIC0gZGVjb2RlIGEKKyAJZmxvYXQuCisKKwkqIHNpbS1pbmxpbmUuYyAoU0lNX0lOTElORV9DKTogUmVuYW1lIGZyb20gX1NJTV9JTkxJTkVfQ18uCisJKiBzaW0tbG5saW5lLmg6IFVwZGF0ZS4KKworCSogc2ltLWZwdS5oLCBzaW0tZnB1LmMgKHNpbV9mcHVfW2l1XXszMiw2NH10byk6IE5ldyBpbnQyZnAKKyAJY29udmVyc2lvbiBmdW5jdGlvbnMuCisJKHNpbV9mcHVfdG97MzIsNjR9W2l1XSk6IE5ldyBmcDJpbnQgZnVuY3Rpb25zLgorCQorCSogc2ltLWZwdS5oLCBzaW0tZnB1LmMgKHNpbV9mcHVfaXNfe2x0LGxlLGVxLG5lLGdlLGd0fSk6IE5ldyBmcAorIAljb21wYXJlIGZ1bmN0aW9ucy4gIFJlcGxhY2luZy4KKwkoc2ltX2ZwdV9jbXApOiBUaGlzLiBEZWxldGUuCisJCitNb24gTWF5IDEyIDE0OjQ5OjA1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfZmluZF9tYXBwaW5nKTogQ2FsbCBlbmdpbmVfZXJyb3Igbm90CisgCXNpbV9pb19lcnJvciB3aGVuIHBvc3NpYmxlLgorCitNb24gTWF5IDEyIDA4OjU1OjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjIuY3lnbnVzLmNvbT4KKworCSogc2ltLWVuZGlhbi5oIChWMV9IMik6IEFkZCBtYWNybydzIHRvIGluc2VydCBhIHdvcmQgaW50byBhCisgCWhpZ2gvbG93IGRvdWJsZSB3b3JkLgorCisJKiBzaW0tdHJhY2UuaDogUmVtb3ZlIGRlZmluaXRpb24gb2YgYXR0cmlidXRlIC0gZGVmaW5lZCBpbgorIAlzaW1fYmFzaWNzLmguCisKK01vbiBNYXkgMTIgMDg6NTU6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tb3B0aW9ucy5oIChzdHJ1Y3QgT1BUSU9OKTogQWRkIGRvY19vcHQgYXMgdGhlIGRvY3VtZW50aW5nCisgCW5hbWUgb2YgdGhlIG9wdGlvbiAtIG9yIGZhbWlseSBvZiBvcHRpb25zLgorCisJKiBzaW0tb3B0aW9ucy5jIChzaW1fYXJnc19jb21tYW5kKTogTWF0Y2ggY29tbWFuZCBgYS1iIGMnIHdpdGgKKyAJb3B0aW9uIGAtLWEtYi1jJyBmcm9tIG9wdGlvbiB0YWJsZS4KKworVGh1IE1heSAgOCAxMjo0MDowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1vcHRpb25zLmMgKHNpbV9wcmludF9oZWxwKTogRm9yIG9wdGlvbmFsIGFyZ3VtZW50cywgd3JhcAorIAl0aGVtIGluIFtdLgorCisJKiBzaW0tdHJhY2UuYyAoc2V0X3RyYWNlX29wdGlvbnMpOiBOZXcgZnVuY3Rpb24sIGhhbmRsZSBvcHRpb25hbAorIAlhcmd1bWVudCBhbmQgbXVsdGlwbGUgYXNzaWdubWVudC4KKwkodHJhY2Vfb3B0aW9uX2hhbmRsZXIpOiBVcGRhdGUuCisKKwkqIHNpbS10cmFjZS5jICh0cmFjZV9vcHRpb25faGFuZGxlcik6IFRyYWNlIGJyYW5jaCBhbmQgbm90IGZwdQorIAl3aGVuIGJyYW5jaCB0cmFjaW5nIHNlbGVjdGVkLgorCitXZWQgTWF5ICA3IDE1OjE5OjU4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLXRyYWNlLmMgKHRyYWNlX29uZV9pbnNuKTogTWFrZSBhIHZhLWFyZ3MgZnVuY3Rpb24uCisKKwkqIHNpbS10cmFjZS5jICh0cmFjZV92cHJpbnRmKTogTmV3IGZ1bmN0aW9uLCB2YS1hcmcgdmVyc2lvbiBvZgorIAl0cmFjZV9wcmludGYuCisKK1R1ZSBNYXkgIDYgMTY6Mzg6MTYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc2ltLXRyYWNlLmMgKHRyYWNlX3VuaW5zdGFsbCk6IERvbid0IGNsb3NlIGEgZmlsZSB0d2ljZS4KKwkqIHNpbS1wcm9maWxlLmMgKHByb2ZpbGVfdW5pbnN0YWxsKTogTGlrZXdpc2UuCisKK1R1ZSBNYXkgIDYgMDY6MTQ6MDEgMTk5NyAgTWlrZSBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIHNpbS10cmFjZS5jICh0b3BsZXZlbCk6IEluY2x1ZGUgYmZkLmguCisJKHRyYWNlX29wdGlvbnMpOiBOb3RlIHRoYXQgLS10cmFjZS1saW5lbnVtIGFsc28gdHVybnMgb24KKwktLXRyYWNlLWluc24uICBBZGQgLS10cmFjZS17YnJhbmNoLHNlbWFudGljc30uCisJKHRyYWNlX29wdGlvbl9oYW5kbGVyKTogSWYgLS10cmFjZS1saW5lbnVtLCBhbHNvIHR1cm4gb24KKwktLXRyYWNlLWluc24uICBBZGQgLS10cmFjZS1icmFuY2ggc3VwcG9ydC4gIElmIC0tdHJhY2Utc2VtYW50aWNzLAorCXR1cm4gb24gQUxVLCBGUFUsIGJyYW5jaCwgYW5kIG1lbW9yeSB0cmFjaW5nLgorCSh0cmFjZV9vbmVfaW5zbik6IE5ldyBmdW5jdGlvbiB0byB0cmFjZSBhbiBpbnN0cnVjdGlvbi4gIFN1cHBvcnQKKwktLXRyYWNlLWxpbmVudW0uCisJKE9QVElPTl9UUkFDRV8qKTogVXNlIGFuIGVudW0sIHJhdGhlciB0aGFuIGxvdHMgb2YgZGVmaW5lcy4KKworCSogc2ltLXRyYWNlLmggKFRSQUNFX3tTRU1BTlRJQ1MsQlJBTkNIfV9JRFgpOiBBZGQgbmV3IG1hY3Jvcy4KKwkoTUFYX1RSQUNFX1ZBTFVFUyk6IFVzZSAzMiwgbm90IDEyIGJ5IGRlZmF1bHQuCisJKFRSQUNFX2JyYW5jaCk6IEFkZCBuZXcgbWFzay4KKwkoVFJBQ0VfKl9QKTogRGVmaW5lIGFsbCBwb3NzaWJsZSB0cmFjZV9wIG1hY3Jvcy4KKwkodHJhY2Vfb25lX2luc24pOiBEZWNsYXJlIGZ1bmN0aW9uLgorCitNb24gTWF5ICA1IDE0OjA4OjM0IDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBzaW0tdHJhY2UuaCAoX19hdHRyaWJ1dGVfXyk6IERlZmluZSBhcyBub3RoaW5nIGlmIG5vdCBHTlUgQyBvcgorCUdOVSBDIGRvZXNuJ3Qgc3VwcG9ydCBfX2F0dHJpYnV0ZXNfXy4KKwkoe3RyYWNlLGRlYnVnfV9wcmludGYpOiBBZGQgYXR0cmlidXRlJ3Mgc28gLVdmb3JtYXQgY2FuIGNoZWNrIHRoZQorCWZvcm1hdCBzdHJpbmdzLgorCitNb24gTWF5ICA1IDExOjE2OjEyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWNvbmZpZy5oIChGT1JDRURfQUxJR05NRU5UKTogTmV3IGFsaWdubWVudCBvcHRpb24gLQorIAlhZGRyZXNzZXMgYXJlIG1hc2tlZCBmb3JjaW5nIHRoZW0gdG8gYmUgY29ycmVjdGx5IGFsaWduZWQuCisJKFdJVEhfQUxJR05NRU5UKTogTWFrZSBOT05TVFJJQ1RfQUxJR05NRU5UIHRoZSBkZWZhdWx0LgorCSogc2ltLWNvbmZpZy5jIChjb25maWdfYWxpZ25tZW50X3RvX2EpOiBVcGRhdGUuCisKKwkqIHNpbS1jb3JlLmggKHNpbV9jcHVfY29yZSk6IE5ldyBkYXRhIHR5cGUgY29udGFpbnMgY3B1IHNwZWNpZmljCisgCWNvcmUgZGF0YS4KKwkqIHNpbS1iYXNlLmggKENQVV9DT1JFKTogQWRkIGNwdSBzcGVjaWZpYyBjb3JlIGRhdGEgdG8gY3B1IGJhc2UKKyAJdHlwZS4KKwkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX2F0dGFjaCk6IEFkZCBDUFUgYXJndW1lbnQuICBSZWFkeSBmb3IKKyAJcHJvY2Vzc29yIHNwZWNpZmljIGNvcmUgbWFwcy4KKwkoc2ltX2NvcmVfbWFwX2F0dGFjaCk6IENvcHkgdGhlIGNvcmUgbWFwIGRhdGEgdG8gZWFjaCBvZiB0aGUKKyAJcHJvY2Vzc29yIHNwZWNpZmljIGNvcmUgZGF0YSBzdHJ1Y3R1cmVzLgorCSogc2ltLWNvcmUuYyAoc2ltX2NvcmVfZmluZF9tYXBwaW5nKTogVXBkYXRlLgorCisJKiBzaW0tbi1jb3JlLmggKHNpbV9jb3JlX3JlYWRfTiwgc2ltX2NvcmVfd3JpdGVfTik6IFJlbmFtZS4KKwkoc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF9OLCBzaW1fY29yZV93cml0ZV9hbGlnbmVkX04pOiBOZXcgbmFtZXMuCisJKHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF9OLCBzaW1fY29yZV93cml0ZV91bmFsaWduZWRfTik6IE5ldworIAlhbHRlcm5hdGl2ZXMgdGhhdCBoYW5kbGUgdW5hbGlnbmVkIGFkZHJlc3Nlcy4KKwkoc2ltX2NvcmVfe3JlYWQsd3JpdGV9X3ssdW59YWxpZ25lZF9OKTogRHJvcCBTSU1fREVTQyBhcmcsIHJlcGxhY2UKKyAJd2l0aCBqdXN0IENQVSBhcmcuCisJKiBjZ2VuLXV0aWxzLmMgKHNpbV9kaXNhc3NlbWJsZV9pbnNuKTogVXBkYXRlLgorCitNb24gTWF5ICA1IDEzOjE5OjE2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLXRyYWNlLmggKFRSQUNFX0ZQVV9JRFgpOiBBZGQgRmxvYXRpbmctcG9pbnQgc3BlY2lmaWMKKyAJdHJhY2luZy4KKworCSogc2ltLWZwdS5oLCBzaW0tZnB1LmM6IE5ldyBmaWxlcyAtIHByb3RvdHlwZSBmb3IgZ2VuZXJpYyB0YXJnZXQKKyAJZnB1IHN1cHBvcnQuCisKKwkqIHNpbS1pbmxpbmUuaCwgc2ltLWlubGluZS5jOiBBZGQgc3VwcG9ydCBmb3IgU0lNX0ZQVS4KKworRnJpIE1heSAgMiAxNzo1OTo0MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX21hcF90b19zdHIpOiBOZXcgZnVuY3Rpb24gYXNjaWkgZXF1aXZhbGVudAorIAl0byBtYXAgdHlwZS4KKwkKKwkqIHNpbS1uLWNvcmUuaCAoc2ltX2NvcmVfcmVhZF9OLCBzaW1fY29yZV93cml0ZV9OKTogVXNlIGluIHRyYWNlCisgCXN0YXRlbWVudC4KKworRnJpIE1heSAgMiAxNzoyODowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIyLmN5Z251cy5jb20+CisKKwkqIGNnZW4tdHJhY2UuYzogUHJlcGVuZCBhZGRpdGlvbmFsIHRyYWNlX3ByaW50ZiBhcmd1bWVudC4KKworCSogY2dlbi11dGlscy5jIChzaW1fZGlzYXNzZW1ibGVfaW5zbik6IEFkZCBhZGRpdGlvbmFsIGNvcmUKKyAJYXJndW1lbnRzLgorCitGcmkgTWF5ICAyIDExOjQwOjIzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogbnJ1bi5jIChtYWluKTogQ2F0Y2gvcmVwb3J0IGVycm9yZW5vdXMgc2ltdWxhdG9yIHN0YXRlcy4KKworCSogc2ltLW1vZHVsZS5jOiAjaW5jbHVkZSAibGliaWJlcnR5LmgiIHNvIHRoYXQgeG1hbGxvYyBpcyBkZWZpbmVkLgorICAJKiBzaW0tdHJhY2UuYzogI2luY2x1ZGUgc3RyaW5nLmgvc3RyaW5ncy5oIHNvIHRoYXQgbWVtc2V0IGlzCisgCWRlZmluZWQuCisJKiBzaW0tdXRpbHMuYzogRGl0dG8uCisJKiBzaW0tcHJvZmlsZS5jOiBEaXR0by4gQW5kIHN0ZGxpYi5oLgorCShwcmludF9iYXIpOiBPbmx5IGRlZmluZSB3aGVuIHVzZWQgYnkgaW5zdHJ1Y3Rpb24gb3IgbWVtb3J5IHByb2ZpbGVyLgorCisJKiBzaW0tb3B0aW9ucy5jIChzdGFuZGFyZF9vcHRpb25faGFuZGxlcik6IE1ha2UgdWwgbW9yZSBsb2NhbC4KKwkKKwkqIHNpbS1sb2FkLmMgKHNpbV9sb2FkX2ZpbGUpOiBNYWtlIHRoZSBuYW1lIGNvbnN0YW50LgorCShzaW1fbG9hZF9maWxlKTogUGFzc2lmeSBnY2MuCisKKwkqIHNpbS11dGlscy5oOiBOZXcgZmlsZSwgcHJlLWRlY2xhcmUgdXRpbGl0ZXMgaW4gY29ycmVzcG9uZGluZyAuYworIAlmaWxlLgorCSogc2ltLXV0aWxzLmMsIHNpbS1sb2FkLmM6IEluY2x1ZGUgc2ltLXV0aWxzLmguCisJCisJKiBzaW0tYmFzZS5oIChzaW1fY3B1KTogUHJlIGRlZmluZSBoZXJlIHNvIGF2YWlsYWJsZSB0byBhbGwuCisKKwkqIHNpbS1jb3JlLmggKERFQ0xBUkVfU0lNX0NPUkVfV1JJVEVfTiwgREVDTEFSRV9TSU1fQ09SRV9SRUFEX04pOgorIAlSZXN0b3JlIHRoZSBzaW1fY3B1IGFuZCBpbnN0cnVjdGlvbl9hZGRyZXNzIGFyZ3VtZW50cyBzbyB0aGF0IGZ1bGwKKyAJaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIHRvIHRoZSBhYm9ydCBmdW5jdGlvbi4KKwkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX2ZpbmRfbWFwcGluZywgc2ltX2NvcmVfd3JpdGVfYnVmZmVyKTogRGl0dG8uCisJKiBzaW0tbi1jb3JlLmggKHNpbV9jb3JlX3dyaXRlX04sIHNpbV9jb3JlX3JlYWRfTik6IFVwZGF0ZS4KKworCSogc2ltLXRyYWNlLmgsIHNpbS10cmFjZS5jICh0cmFjZV9vcHRpb25faGFuZGxlcik6IEFkZCBpbnRlcmltCisgCXRyYWNpbmcgc3VwcG9ydCBmb3Igc2ltLWV2ZW50cyBhbmQgc2ltLWNvcmUuCisJKHRyYWNlX29wdGlvbl9oYW5kbGVyKTogQ29udmVydCAjaWYgdG8gaWYgd2hlcmUgcG9zc2libGUgc28gYWx3YXlzCisgCWNvbXBpbGVkL2NoZWNrZWQgYnkgQyBjb21waWxlci4KKwkqIHNpbS1uLWNvcmUuaCAoc2ltX2NvcmVfd3JpdGVfTiwgc2ltX2NvcmVfcmVhZF9OKTogVXBkYXRlLgorCQorCSogc2ltLWJhc2UuaDogQWRqdXN0IGNvbW1lbnQgZG9jdW1lbnRpbmcgaG93IHRvIGRlZmluZSB0aGUgY3B1CisgCXN0cnVjdHVyZS4KKwkoc2ltX3N0YXRlX2Jhc2UpOiBBZGQgc2ltX2NvcmUgYW5kIHNpbV9ldmVudHMgdG8gc2ltdWxhdG9yIGJhc2UKKyAJb2JqZWN0LgorCisJKiBzaW0tdHJhY2UuaCwgc2ltLXRyYWNlLmMgKHRyYWNlX3ByaW50Zik6IEFkZCBTSU1fREVTQyBhcmd1bWVudC4KKwkqIHNpbS1jb3JlLmMgKHNpbV9jb3JlX2luaXQsIHNpbV9jb3JlX2F0dGFjaCwKKyAJc2ltX2NvcmVfZmluZF9tYXBwaW5nKTogVXBkYXRlLgorCSogc2ltLWV2ZW50cy5jIChFVFJBQ0UsIHNpbV9ldmVudHNfaW5pdCwgc2ltX2V2ZW50c190aW1lLAorIAl1cGRhdGVfdGltZV9mcm9tX2V2ZW50LCBpbnNlcnRfc2ltX2V2ZW50LAorIAlzaW1fZXZlbnRzX3NjaGVkdWxlX2FmdGVyX3NpZ25hbCwgc2ltX2V2ZW50c19kZXNjaGVkdWxlLAorIAlzaW1fZXZlbnRzX3RpY2spOiBEaXR0by4KKwkKKwkqIHNpbS1iYXNpY3MuaCAoc2ltLW1vZHVsZS5oLCBzaW0tdHJhY2UuaCwgc2ltLXByb2ZpbGUuaCwKKyAJc2ltLW1vZGVsLmgpOiBNb3ZlICNpbmNsdWRlcyBmcm9tIGhlcmUuCisJKiBzaW0tYmFzZS5oOiBUbyBoZXJlLgorCShzaW0tY29yZS5oLCBzaW0tZXZlbnRzLmgsIHNpbS1pby5oKTogSW5jbHVkZSBhbHNvCisJCitXZWQgQXByIDMwIDE1OjM3OjU0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY2FsbGJhY2suYyAoZGVmYXVsdF9jYWxsYmFjayk6IE1pc3NpbmcgaW5pdGlhbGlzZXJzLgorCitUaHUgTWF5ICAxIDEwOjQwOjQ3IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNpbS11dGlscy5jIChzaW1fYWRkX2NvbW1hcyk6IE5ldyBmdW5jdGlvbi4KKwkqIHNpbS1iYXNpY3MuaCAoc2ltX2FkZF9jb21tYXMpOiBBZGQgcHJvdG90eXBlLgorCSogY2dlbi1zY2FjaGUuYyAoc2NhY2hlX3ByaW50X3Byb2ZpbGUpOiBQcmludCBjb21tYXMgaW4gbnVtYmVycy4KKwkqIHNpbS1wcm9maWxlLmMgKENPTU1BUyk6IE5ldyBtYWNyby4KKwkocHJpbnRfKik6IFVzZSBpdCB0byBwcmludCBjb21tYXMgaW4gbnVtYmVycy4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworCSogY2dlbi1zaW0uaCAoc2ltX3NpZ25hbF90eXBlKTogQWRkIFNJTV9TSUdJTlQuCisJKGNnZW5fc3RhdGUpOiBOZXcgbWVtYmVyIHJ1bl9mYXN0X3AuCisJKGNnZW5faW5pdCk6IEFkZCBwcm90b3R5cGUuCisJKHNpbV9kaXNhc3NlbWJsZV9pbnNuKTogTmV3IGFyZyBgY3B1Jy4KKwkqIGNnZW4tdHJhY2UuYyAodHJhY2VfaW5zbik6IFVwZGF0ZSBjYWxsIHRvIHNpbV9kaXNhc3NlbWJsZV9pbnNuLgorCSogY2dlbi11dGlscy5jIChjZ2VuX2luaXQpOiBOZXcgZnVuY3Rpb24uCisJKHNpbV9kaXNhc3NlbWJsZV9pbnNuKTogTmV3IGFyZyBgY3B1Jy4gIFJld3JpdGUgZmV0Y2hpbmcgb2YgaW5zbi4KKwkqIGdlbm1sb29wLnNoOiBDYWxsIGVuZ2luZV9oYWx0IGlmIGxvb3AgZXhpdHMuCisKKwkqIE1ha2VmaWxlLmluIChzaW0tb3B0aW9uc19oKTogRGVmaW5lLgorCShzaW0te21vZHVsZSxvcHRpb25zLHRyYWNlLHByb2ZpbGUsdXRpbHN9Lm8pOiBDbGVhbiB1cCBkZXBlbmRlbmNpZXMuCisJKHNpbS1tb2RlbC5vKTogQWRkIG5ldyBydWxlLgorCShjZ2VuLXtzY2FjaGUsdHJhY2UsdXRpbHN9Lm8pOiBBZGQgbmV3IHJ1bGVzLgorCSogYWNsb2NhbC5tNCAoU0lNX0FDX09QVElPTl97U0NBQ0hFLERFRkFVTFRfTU9ERUx9KTogQWRkLgorCSogY2dlbi1zY2FjaGUuYyAoc2NhY2hlX3ByaW50X3Byb2ZpbGUpOiBDaGFuZ2UgYHNkJyBhcmcgdG8gYGNwdScuCisJSW5kZW50IG91dHB1dCBieSAyIHNwYWNlcy4KKwkqIGNnZW4tc2NhY2hlLmggKHNjYWNoZV9wcmludF9wcm9maWxlKTogVXBkYXRlLgorCSogY2dlbi10cmFjZS5jICh0cmFjZV9pbnNuX2ZpbmkpOiBJbmRlbnQgb3V0cHV0IGJ5IDIgc3BhY2VzLgorCVVzZSB0cmFjZV9wcmludGYsIG5vdCBmcHJpbnRmLgorCSh0cmFjZV9leHRyYWN0KTogVXNlIHRyYWNlX3ByaW50Ziwgbm90IGNnZW5fdHJhY2VfcHJpbnRmLgorCSogZ2VubWxvb3Auc2ggKCFGQVNUIGNhc2UpOiBJbmNyZW1lbnQgYGluc25fY291bnQnLgorCSogc2ltLWJhc2UuaCAoc2ltX3N0YXRlX2Jhc2UpOiBPbmx5IGluY2x1ZGUgc2NhY2hlX3NpemUgaWYgV0lUSF9TQ0FDSEUuCisJKHNpbV9jcHVfYmFzZSk6IFJlbmFtZSBtZW1iZXIgYHNkJyB0byBgc3RhdGUnIHRvIGJlIGNvbnNpc3RlbnQgd2l0aAorCWFjY2VzcyBtYWNybydzIG5hbWUuCisJKiBzaW0tY29yZS5jIChzaW1fY29yZV9pbml0KTogVXNlIEVYVEVSTl9TSU1fQ09SRSB0byBkZWZpbmUgaXQuCisJQ2hhbmdlIHJldHVybiB0eXBlIHRvIFNJTV9SQy4KKwkoc2ltX2NvcmVfe2luc3RhbGwsdW5pbnN0YWxsfSk6IE5ldyBmdW5jdGlvbnMuCisJKiBzaW0tY29yZS5oIChzaW1fY29yZV97aW5zdGFsbCx1bmluc3RhbGx9KTogRGVjbGFyZS4KKwkoc2ltX2NvcmVfaW5pdCk6IFVzZSBFWFRFUk5fU0lNX0NPUkUgdG8gZGVmaW5lIGl0LgorCUNoYW5nZSByZXR1cm4gdHlwZSB0byBTSU1fUkMuCisJKiBzaW0tbW9kZWwuaCAobW9kZWxzLG1hY2hzLG1vZGVsX2luc3RhbGwpOiBEZWNsYXJlLgorCSogc2ltLW1vZHVsZS5jIChtb2R1bGVzKTogQWRkIHNjYWNoZV9pbnN0YWxsLCBtb2RlbF9pbnN0YWxsLgorCShzaW1fcG9zdF9hcmd2X2luaXQpOiBTZXQgY3B1LT5zdGF0ZSBiYWNrbGlua3MuCisJKiBzaW0tb3B0aW9ucy5jIChzdGFuZGFyZF9vcHRpb25zKTogRGVsZXRlIC0tc2ltY2FjaGUtc2l6ZSwtLW1heC1pbnNucy4KKwkoc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIpOiBMaWtld2lzZS4KKwkqIHNpbS1wcm9maWxlLmMgKFBST0ZJTEVfe0hJU1RPR1JBTSxMQUJFTH1fV0lEVEgpOiBNb3ZlIHRvCisJc2ltLXByb2ZpbGUuaC4KKwkoKik6IEFzc3VtZSBBTlNJIEMuCisJKHByb2ZpbGVfb3B0aW9ucyk6IERlbGV0ZSAtLXByb2ZpbGUtc2ltY2FjaGUuCisJKHByb2ZpbGVfb3B0aW9uX2hhbmRsZXIpOiBMaWtld2lzZS4KKwkocHJvZmlsZV9wcmludF9pbnNuKTogQ2hhbmdlIGBzZCcgYXJnIHRvIGBjcHUnLiAgSW5kZW50IG91dHB1dCAyCisJc3BhY2VzLgorCShwcm9maWxlX3ByaW50X3ttZW1vcnksbW9kZWx9KTogTGlrZXdpc2UuCisJKHByb2ZpbGVfcHJpbnRfc2ltY2FjaGUpOiBEZWxldGUuCisJKHByb2ZpbGVfcHJpbnRfc3BlZWQpOiBOZXcgZnVuY3Rpb24uCisJKHByb2ZpbGVfcHJpbnQpOiBSZXdyaXRlLgorCSogc2ltLXByb2ZpbGUuaCAoUFJPRklMRV9zY2FjaGUpOiBSZW5hbWVkIGZyb20gUFJPRklMRV9zaW1jYWNoZS4KKwkoV0lUSF9QUk9GSUxFX1NDQUNIRV9QKTogUmVuYW1lZCBmcm9tIFdJVEhfUFJPRklMRV9TSU1DQUNIRV9QLgorCShQUk9GSUxFX0RBVEEpOiBEZWxldGUgbWVtYmVycyBzaW1jYWNoZV97aGl0cyxtaXNzZXN9LgorCShQUk9GSUxFX0NPVU5UX1NJTUNBQ0hFX3tISVQsTUlTU30pOiBEZWxldGUuCisJKFBST0ZJTEVfe0NBTExCQUNLLENQVV9DQUxMQkFDS30pOiBOZXcgdHlwZXMuCisJKHByb2ZpbGVfcHJpbnQpOiBVcGRhdGUgcHJvdG90eXBlLgorCitXZWQgQXByIDMwIDExOjM0OjE0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNnZW4tc2NhY2hlLltjaF0sIGNnZW4tc2ltLmg6IE5ldyBmaWxlcy4KKwkqIGNnZW4tdHJhY2UuW2NoXSwgY2dlbi10eXBlcy5oLCBjZ2VuLXV0aWxzLmMsIGdlbm1sb29wLnNoOiBOZXcgZmlsZXMuCisJKiBzaW0tbW9kZWwuYzogTmV3IGZpbGUuCisKKwkqIE1ha2UtY29tbW9uLmluIChjbGVhbiB0YXJnZXRzKTogVW5kbyBwYXRjaCBvZiBBcHIuIDIyLgorCitGcmkgQXByIDI1IDE1OjI4OjMyIDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBzaW0tbi1iaXRzLmggKHNpZ25lZCk6IElmIHdlIGhhdmUgYSBzdGFuZGFyZCBjb21waWxlciwgdW5kZWYKKwlzaWduZWQsIHNvIHRoYXQgc2lnbmVkTiBpcyBkZWZpbmVkIGNvcnJlY3RseS4KKworVGh1IEFwciAyNCAwMDowMDowNyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzaW0tbW9kdWxlLmgsIHNpbS1tb2RlbC5oLCBzaW0tcHJvZmlsZS5oOiBOZXcgZmlsZXMuCisJKiBzaW0tbW9kdWxlLmMsIHNpbS1wcm9maWxlLmM6IE5ldyBmaWxlcy4KKwkqIE1ha2UtY29tbW9uLmluIChTSU1fUFJPRklMRSk6IERlZmluZQorCShDT05GSUdfQ0ZMQUdTKTogQWRkICQoU0lNX1BST0ZJTEUpLgorCShzaW1fbWFpbl9oZWFkZXJzKTogQWRkIHNpbS1tb2R1bGUuaCwgc2ltLW1vZGVsLmgsIHNpbS1wcm9maWxlLmguCisJKHNpbV9tb2R1bGUubyxzaW0tcHJvZmlsZS5vKTogQWRkIHJ1bGVzIGZvci4KKwkqIGFjbG9jYWwubTQgKC0tZW5hYmxlLXNpbS10cmFjZSk6IEFsbG93IHN5bWJvbGljIGFyZ3VtZW50cy4KKwkoLS1lbmFibGUtc2ltLXByb2ZpbGUpOiBBZGQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogc2ltLWJhc2UuaCAoc2ltX3N0YXRlX2Jhc2UpOiBOZXcgbWVtYmVycyBpbml0X2xpc3QsIHVuaW5zdGFsbF9saXN0LAorCW1vZGVsLiAgTW92ZSB0cmFjZSBhbmQgcHJvZmlsZSBzdXBwb3J0IHRvIHNpbS17dHJhY2UscHJvZmlsZX0uaC4KKyAJTmV3IG1lbWJlcnMgdHJhY2VfZGF0YSwgcHJvZmlsZV9kYXRhLgorCSogc2ltLWJhc2ljcy5oOiAjaW5jbHVkZSBzaW0tbW9kdWxlLmgsIHNpbS1tb2RlbC5oLCBzaW0tcHJvZmlsZS5oLgorCSogc2ltLWNvbmZpZy5oOiBQcm92aWRlIGRlZmF1bHQgZGVmaW5pdGlvbiBvZiBXSVRIX1BST0ZJTEUuCisJKFdJVEhfVFJBQ0UpOiBDaGFuZ2UgZGVmYXVsdCB0byAtMS4KKwkoTUFYX05SX1BST0NFU1NPUlMpOiBBbHdheXMgZGVmaW5lLgorCSogc2ltLW9wdGlvbnMuYzogTW92ZSB0cmFjZSBhbmQgcHJvZmlsZSBzdXBwb3J0IHRvCisJc2ltLXt0cmFjZSxwcm9maWxlfS5oLgorCShzaW1fcHJlX2FyZ3ZfaW5pdCk6IE1vdmVkIHRvIHNpbS1tb2RlbC5jLgorCShzdGFuZGFyZF9pbnN0YWxsKTogTmV3IGZ1bmN0aW9uLgorCSogc2ltLW9wdGlvbnMuaCAoc2ltX3ByZV9hcmd2X2luaXQpOiBNb3ZlIGRlY2wgdG8gc2ltLW1vZGVsLmMuCisJKHN0YW5kYXJkX2luc3RhbGwpOiBEZWNsYXJlLgorCSogc2ltLXRyYWNlLmM6IFRyYWNpbmcgb3B0aW9uIGhhbmRsaW5nIG1vdmVkIGhlcmUgZnJvbSBzaW0tb3B0aW9ucy5jLgorCSh0cmFjZV9pbnN0YWxsLCB0cmFjZV91bmluc3RhbGwpOiBOZXcgZnVuY3Rpb25zLgorCSh0cmFjZV9wcmludGYpOiBVcGRhdGUgcmVmZXJlbmNlIHRvIFRSQUNFX0ZJTEUuCisJKiBzaW0tdHJhY2UuaCAoVFJBQ0VfRk9PX0lEWCk6IE1vdmVkIGhlcmUgZnJvbSBzaW0tYmFzZS5oLgorCShUUkFDRV9mb28pOiBCaXQgbWFza3MgZm9yIHN5bWJvbGljIGFyZ3VtZW50cyB0byAtLWVuYWJsZS1zaW0tdHJhY2UuCisJKFdJVEhfVFJBQ0VfRk9PX1ApOiBEZWZpbmUuCisJKHRyYWNlX2luc3RhbGwpOiBEZWNsYXJlLgorCShUUkFDRV9EQVRBKTogTmV3IHN0cnVjdC4KKworV2VkIEFwciAyMyAxNzoyMzoxNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBydW4uYzogVW5kbyBsYXN0IGV4ZWNfYmZkIHBhdGNoLgorCShtYWluKTogT25seSBwYXNzIC1FIGlmZGVmIFNJTV9IQVZFX0JJRU5ESUFOLgorCitXZWQgQXByIDIzIDE3OjU0OjI3IDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBydW4uYyAoZXhlY19iZmQpOiBBZGQgYmFjayBpbi4KKwkobWFpbik6IFNldCBleGVjX2JmZC4KKworVHVlIEFwciAyMiAxNDo0Mzo0NiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzaW0tbG9hZC5jIChzaW1fbG9hZF9maWxlKTogI2luY2x1ZGUgPHN0ZGlvLmg+IGZvciBOVUxMLgorCitXZWQgQXByIDIzIDAyOjU1OjU0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWV2ZW50cy5jIChpbnNlcnRfc2ltX2V2ZW50KTogQ2FsbCBzaW1faW9fZXJyb3IgaW5zdGVhZCBvZgorIAlsZXNzIHdlbGwgZGVmaW5lZCBlbmdpbmVfZXJyb3IuCisJKiBzaW0tY29yZS5jOiBEaXR0by4KKworVHVlIEFwciAyMiAwODo0ODoxNiAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBNYWtlLWNvbW1vbi5pbjogIENoYW5nZSBjbGVhbiB0YXJnZXRzIHRvIHVzZSA6OiBzbyB0aGF0IG90aGVyCisJTWFrZWZpbGVzIGNhbiBoYXZlIHRoZWlyIG93biBjbGVhbiB0YXJnZXRzLgorCSogc2ltLWxvYWQuYyAoeHByaW50ZiBlcHJpbnRmKTogIFVzZSBBTlNJX1BST1RPVFlQRVMgaW5zdGVhZCBvZgorCV9fU1REQ19fIHRvIGNvbnRyb2wgdXNlIG9mIHN0ZGFyZyB2cy4gdmFyYXJncyBzeW50YXguICBTb21lCisJc3lzdGVtcyBjYW4ndCB1c2UgX19TVERDX18sIGJ1dCByZXF1aXJlIHN0ZGFyZy4KKworRnJpIEFwciAxOCAxMToxNDo0MyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzaW0tb3B0aW9ucy5jIChzdGFuZGFyZF9vcHRpb25zKTogQWRkIC0tZW5kaWFuLgorCShzdGFuZGFyZF9vcHRpb25faGFuZGxlcik6IExpa2V3aXNlLgorCisJKiBucnVuLmM6ICNpbmNsdWRlIDxzaWduYWwuaD4uCisgCShtYWluLCBjbnRybF9jKTogV3JhcCBjYWxscyB0byBzaW1fcmVzdW1lIGluIGEgU0lHSU5UCisgCWhhbmRsZXIgdGhhdCBjYWxscyBzaW1fc3RvcCAoKS4KKworRnJpIEFwciAxOCAxMzoxMTozNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHJ1bi5jIChtYWluLCBjbnRybF9jKTogV3JhcCBjYWxscyB0byBzaW1fcmVzdW1lIGluIGEgU0lHSU5UCisgCWhhbmRsZXIgdGhhdCBjYWxscyBzaW1fc3RvcCAoKS4gIFNpbXVsYXRvcnMgbWF5IHN0aWxsIGJlCisgCWVzdGFibGlzaGluZyB0aGVpciBvd24gaGFuZGxlci4KKworCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3BvbGwpOiBSZW5hbWUgZnJvbQorIAlzaW1fZXZlbnRzX2F0X2xhcmdlX2ludC4gIFBvbGwgSU8uCisKKwkqIHNpbS1pby5jIChzaW1faW9fcG9sbF9xdWl0KTogTmV3IGZ1bmN0aW9uIC0gcGFzcyBvbiBhIHBvbGxpbmcKKyAJcmVxdWVzdC4KKworCSogY2FsbGJhY2suYyAob3NfcG9sbF9xdWl0KTogTmV3IGZ1bmN0aW9uIHBvbGwgZm9yIHF1aXQgc2lnbmFsCisJd2hlcmUgbmVlZGVkLgorCShkZWZhdWx0X2NhbGxiYWNrKTogSW5jbHVkZSBtYWdpYyBudW1iZXIuCisKK1RodSBBcHIgMTcgMDI6MjU6MTEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNDogQ2hlY2sgZm9yIGhlYWRlcnMgdGltZS5oLCBzeXMvdGltZS5oLCBzeXMvcmVzb3VyY2UuaC4KKwlDaGVjayBmb3IgZnVuY3Rpb25zIGdldHJ1c2FnZSwgdGltZS4KKwkqIHNpbS1iYXNpY3MuaCAoU0lNX0VMQVBTRURfVElNRSk6IE5ldyB0eXBlZGVmLgorCShzaW1fZWxhcHNlZF90aW1lX2dldCwgc2ltX2VsYXBzZWRfdGltZV9zaW5jZSk6IEFkZCBwcm90b3R5cGVzLgorCSogc2ltLXV0aWxzLmM6ICNpbmNsdWRlIHRpbWUuaCwgc3lzL3RpbWUuaCwgc3lzL3Jlc291cmNlLmggaWYgYWJsZS4KKwkoc2ltX2VsYXBzZWRfdGltZV9nZXQsIHNpbV9lbGFwc2VkX3RpbWVfc2luY2UpOiBOZXcgZnVuY3Rpb25zLgorCisJKiBzaW0tdXRpbHMuYyAoc2ltX2NvcHlfYXJndiwgc2ltX2FuYWx5emVfcHJvZ3JhbSk6IE5ldyBmdW5jdGlvbnMuCisKKwkqIHNpbS1vcHRpb25zLmMsIHNpbS1vcHRpb25zLmg6IE5ldyBmaWxlcy4KKwkqIHNpbS1jb25maWcuaCAoV0lUSF9ERUJVRyk6IFByb3ZpZGUgZGVmYXVsdCB2YWx1ZSBvZiB6ZXJvLgorCSogTWFrZS1jb21tb24uaW4gKG5ydW4ubyk6IEFkZCBydWxlcyBmb3IuCisJKiBucnVuLmM6IE5ldyBmaWxlLgorCisJKiBydW4uYyAobWFpbik6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBzaW1fb3Blbi4KKworCSogTWFrZS1jb21tb24uaW4gKHNpbS1vcHRpb25zLm8sIHNpbS1sb2FkLm8sIHNpbS10cmFjZS5vKTogQWRkIHJ1bGVzLgorCShzaW1fbWFpbl9oZWFkZXJzKTogQWRkIHNpbS10cmFjZS5oLgorCSogcnVuLmMgKGV4ZWNfYmZkLCB0YXJnZXRfYnl0ZV9vcmRlcik6IERlbGV0ZS4KKwkobWFpbik6IFBhc3MgLUUgPGVuZGlhbj4gdG8gc2ltX29wZW4uICBEZWxldGUgY29kZSB0byBsb2FkIHNlY3Rpb25zLAorCWNhbGwgc2ltX2xvYWQgaW5zdGVhZC4gIENoZWNrIHJldHVybiBjb2RlIG9mIHNpbV9jcmVhdGVfaW5mZXJpb3IuCisJKiBzaW0tYmFzZS5oIChDVVJSRU5UX1NUQVRFKTogRGVmaW5lLgorCShzaW1fc3RhdGVfYmFzZSk6IE1ha2UgdHlwZWRlZi4gIE5ldyBtZW1iZXJzIG9wdGlvbnMsIHByb2dfYXJndiwKKwlwcm9nX2JmZCwgdGV4dF97c2VjdGlvbixzdGFydCxlbmR9LCBzdGFydF9hZGRyLCBzaW1jYWNoZV9zaXplLAorCW1lbV9zaXplLCBtZW1vcnkgWysgY29ycmVzcG9uZGluZyBhY2Nlc3MgbWFjcm9zXS4KKwkoc2ltX2NwdV9iYXNlKTogTmV3IHR5cGVkZWYuCisJKiBzaW0tdHJhY2UuaDogTmV3IGZpbGUuCisJKiBzaW0tdHJhY2UuYzogTmV3IGZpbGUuCisJKiBzaW0tYmFzaWNzLmg6ICNpbmNsdWRlIGl0LgorCSogc2ltLWxvYWQuYzogTmV3IGZpbGUuCisKK1R1ZSBBcHIgMTUgMTU6MTA6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlLWNvbW1vbi5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCisJKElOU1RBTExfWEZPUk0sIElOU1RBTExfWEZPUk0xKTogUmVtb3ZlLgorCShpbnN0YWxsLWNvbW1vbik6IERlcGVuZCB1cG9uIGluc3RhbGxkaXJzLiAgVXNlCisJJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSBkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcKKwkkKElOU1RBTExfWEZPUk0pLgorCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCisJKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCisJKElOU1RBTExfWEZPUk0sIElOU1RBTExfWEZPUk0xKTogUmVtb3ZlLgorCShpbnN0YWxsLW1hbik6IERlcGVuZCB1cG9uIGluc3RhbGxkaXJzLiAgVXNlCisJJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSBkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcKKwkkKElOU1RBTExfWEZPUk0pLgorCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCisKK1R1ZSBBcHIgMTUgMTU6MDg6MTIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tYXNzZXJ0LmggKFNJTV9BU1NFUlQsIEFTU0VSVCk6IEFsbG93IHRoZXNlIG1hY3JvcyB0bworCWJlIG92ZXJyaWRlbi4KKworV2VkIEFwciAgOSAxNjowNjo0NCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogc2ltLWJhc2ljcy5oOiBPbmx5IGJyaW5nIGluIGNvbmZpZy5oIGFuZCB0Y29uZmlnLmggaWYKKyAJSEFWRV9DT05GSUdfSC4KKworTW9uIEFwciAgNyAxMTozOTo0NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogc2ltLWNvbmZpZy5oIChXSVRIX1RBUkdFVF9XT1JEX01TQik6IE5ldyBNYWNyby4gRGVmaW5lIHRoZSBiaXQKKyAJbnVtYmVyaW5nIGNvbnZlbnRpb24gb2YgdGhlIHRhcmdldC4KKwkqIHNpbS1jb25maWcuYyAocHJpbnRfc2ltX2NvbmZpZyk6IFByaW50IFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRQorIAlhbmQgV0lUSF9UQVJHRVRfV09SRF9NU0IuCisJKHNpbV9jb25maWcpOiBXaGVuIHBvc3NpYmxlLCBjaGVjayBmb3IgY29uc2lzdGVuY3kgd2l0aCBiaXRzaXplCisgCWFuZCBtc2IuCisKKwkqIHNpbS1iaXRzLmg6IEFsbG93IE1TQiB0byBiZSBvdGhlciB0aGFuIHplcm8uCisJKiBzaW0tYml0cy5jOiBEaXR0by4KKwkqIHNpbS1uLWJpdHMuaDogRGl0dG8uCisJCisJKiBzaW0tYml0cy5oIChNU01BU0sqKTogTmV3IG1hY3JvcyAtIGNvbnZlcmNlIHRvIExTTUFTSyouCisJKiBzaW0tbi1iaXRzLmggKE1TTUFTS0VEbik6IERpdHRvLgorCitNb24gQXByIDE0IDE2OjI5OjIxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBDaGFuZ2UgaW5zdGFsbC5zaCB0byBpbnN0YWxsLXNoLgorCitNb24gQXByICA3IDEwOjQ2OjM4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNpbS1iYXNlLmggKHNpbV9zdGF0ZV9iYXNlKTogTW92ZSBgbWFnaWMnIHRvIGVuZCBvZiBzdHJ1Y3QuCisKK01vbiBBcHIgIDcgMTU6NTM6MjEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIHJ1bi5jIChtYWluKTogQ2hlY2sgdGhhdCBhIHByb2dyYW0gdG8gcnVuIHdhcyBzcGVjaWZpZWQuCisKK01vbiBBcHIgIDcgMTU6NDU6MDIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGFjbG9jYWwubTQgKEFDX1RZUEVfU0lHTkFMKTogQWRkIGNoZWNrLgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitXZWQgQXByICAyIDE1OjA2OjI4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNpbS1lbmRpYW4uaDogTW92ZSBob3N0IHtMSVRUTEUsQklHfV9FTkRJQU4gc3VwcG9ydCBmcm9tIGhlcmUsCisJKiBzaW0tY29uZmlnLmg6IFRvIGhlcmUuCisKKwkqIE1ha2UtY29tbW9uLmluIChTSU1fRVhUUkFfREVQUyk6IE5ldyBjb25maWcgdmFyLgorCShzaW1fbWFpbl9oZWFkZXJzKTogRGVmaW5lLgorCShzaW0tKi5vKTogRGVwZW5kIG9uICQoU0lNX0VYVFJBX0RFUFMpLgorCShCVUlMVF9TUkNfRlJPTV9DT01NT04pOiBNb3ZlIGhlcmUgZnJvbSAuLi9kMzB2L01ha2VmaWxlLmluLgorCShjbGVhbik6IFVzZSBpdC4KKwkoc2ltLXV0aWxzLm8pOiBBZGQgcnVsZSBmb3IuCisJKiBzaW0tdXRpbHMubzogTmV3IGZpbGUuCisJKiBzaW0tYmFzaWNzLmg6ICNpbmNsdWRlIHNpbS1iYXNlLmguCisJKHphbGxvYyk6IE1ha2UgYXJndW1lbnQgdW5zaWduZWQgbG9uZy4KKwkqIHNpbS1iYXNlLmg6IE5ldyBmaWxlLgorCSogc2ltLWlubGluZS5oIChTSU1fSU8gc3VwcG9ydCk6IERlbGV0ZS4KKwkqIHNpbS1pby5oOiBEZWxldGUgaW5saW5lIHN1cHBvcnQuCisJKiBzaW0taW8uYzogTGlrZXdpc2UuICBzaW0tc3RhdGUuaCByZW5hbWVkIHRvIHNpbS1tYWluLmguCisJKiBzaW0tY29uZmlnLmM6IHNpbS1zdGF0ZS5oIHJlbmFtZWQgdG8gc2ltLW1haW4uaC4KKwkqIHNpbS1jb3JlLmM6IExpa2V3aXNlLgorCSogc2ltLWV2ZW50cy5jOiBMaWtld2lzZS4KKworCSogcnVuLmMgKG1haW4pOiBQYXNzIFNJTV9PUEVOX1NUQU5EQUxPTkUgdG8gc2ltX29wZW4uCisKKwkqIGFjbG9jYWwubTQ6IENoZWNrIGZvciBzdGRsaWIuaCwgc3RyaW5nLmgsIHN0cmluZ3MuaCwgdW5pc3RkLmguCisJKHNpbS1kZWJ1Zyk6IEFsbG93IGFyZ3VtZW50cy4gIERlZmluZSBXSVRIX0RFQlVHIGluIGFkZGl0aW9uIHRvCisJLURERUJVRy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIEFwciAgMiAxNDozNDoxOSAxOTk3IEFuZHJldyBDYWduZXkgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIEFwciAgMiAxMTowODoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogc2ltLWNvbmZpZy5oIChXSVRIX0FMSUdOTUVOVCwgV0lUSF9GTE9BVElOR19QT0lOVCwKKyAJV0lUSF9YT1JfRU5ESUFOLCBXSVRIX1NNUCwgV0lUSF9SRVNFUlZFRF9CSVRTKTogQXNzdW1lIHRoYXQgdGhlc2UKKyAJYXJlIGRlZmluZWQgYnkgdGhlIGNvbmZpZ3VyZS4KKworCSogYWNsb2NhbC5tNCAoc2ltLXN0ZGlvKTogQWRkIG9wdGlvbiBzdGRpbyBmcm9tIC4uL3BwYyBjb25maWd1cmUuCisJCisJKiBhY2xvY2FsLm00IChmbG9hdGluZy1wb2ludCwgeG9yLWVuZGlhbiwgYWxpZ25tZW50LCBzbXAsCisgCXJlc2VydmVkLWJpdHMpOiBBbHdheXMgZGVmaW5lLgorCQorCSogc2ltLWNvbmZpZy5oLCBzaW0tY29uZmlnLmMgKHNpbV9jb25maWcpOiBOZXcgZnVuY3Rpb24gLSBhbmQgbmV3CisgCWZpbGUgLSBjby1vcmRpbmF0ZSB0aGUgc2V0dGluZy9jaGVja2luZyBvZiB0aGUgY29tbW9uIHNpbXVsYXRvcgorIAljb25maWd1cmF0aW9uIG9wdGlvbnMuCisKKwkqIE1ha2UtY29tbW9uLmluIChzaW0tY29uZmlnLm8pOiBBZGQgcnVsZS4KKworRnJpIE1hciAyOCAxNTozMjowMCAxOTk3ICBNaWtlIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY2FsbGJhY2suYyAob3NfeyxlfXZwcmludGZfZmlsdGVyZWQpOiBDaGFuZ2Ugc3RkYXJnIHR5cGUgdG8KKwl2YV9saXN0IGZyb20gdm9pZCAqLCBzaW5jZSB2YV9saXN0IG1pZ2h0IG5vdCBiZSBhIHBvaW50ZXIgdHlwZS4KKworTW9uIE1hciAyNCAxNToyNzoxMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogc2ltLW4tZW5kaWFuLmggKG9mZnNldF9OKTogQ29ycmVjdCBhc3NlcnRpb24gLSB3b3JkIGFuZCBzdWIgd29yZAorIAlpbiB3cm9uZyBvcmRlci4KKwkob2Zmc2V0X04pOiBDb3JyZWN0IGNvbXB1dGF0aW9uIG9mIExFIG9mZnNldC4KKworCSogc2ltLWlvLmMgKHNpbV9pb19lcnJvcik6IEluY2x1ZGUgYSBuZXcgbGluZSB3aGVuIHJlcG9ydGluZworIAllcnJvcnMuCisKKwkqIHNpbS1hc3NlcnQuaCAoU0lNX0ZJTFRFUl9QQVRIKTogT3V0IGJ5IG9uZSB3aGVuIGxvY2F0aW5nIGxhc3QKKyAJYC8nLgorCitUaHUgTWFyIDIwIDIyOjMxOjA2IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogcnVuLmM6IEluY2x1ZGUgYWxsb2NhLWNvbmYuaC4KKworCSogY2FsbGJhY2suYyAob3NfZXZwcmludGZfZmlsdGVyZWQpOiBGaXggdHlwby4KKworRnJpIE1hciAyMSAxMzozNjoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogcnVuLmMgKHN0cmluZy5oLCBzdHJpbmdzLmgsIHN0ZGxpYi5oKTogSW5jbHVkZS4KKworCSogc2ltLWV2ZW50cy5jIChzaW1fZXZlbnRzX3RpY2spOiBSZWNlbnQgY2xlYW51cCBmYWlsZWQgdG8gcmV0dXJuCisgCTAgd2hlbiBub3RoaW5nIHBlbmRpbmcuCisKKwkqIHJ1bi5jIChzaW1fc2l6ZSwgc2ltX3RyYWNlKTogUGxpY2F0ZSBHQ0MgLSB0aGVzZSB0d28gZnVuY3Rpb25zCisgCXdpbGwgc29vbiBiZSBnb2luZyBhd2F5LgorCShnZXRvcHQpOiBQbGljYXRlIEdDQy4KKworCSogc2ltLWVuZGlhbi5jIChzaW0taW8uaCk6IFBsaWNhdGUgR0NDLgorCSogc2ltLWJpdHMuYyAoc2ltLWlvLmgpOiBEaXR0by4KKwkqIHNpbS1uLWJpdHMuaCAoUk9Ubik6IERpdHRvLgorCisJKiBzaW0taW8uYyAoc2ltX2lvX2Vycm9yKTogQ29ycmVjdCBjaGVjayBmb3IgTlVMTC4KKworCSogc2ltLWFzc2VydC5oIChTSU1fRklMVEVSX1BBVEgpOiBTZXBhcmF0ZSBvdXQgdGhlIGNvZGUgZmlsdGVyaW5nCisgCXRoZSBfX0ZJTEVfXy4KKwkqIHNpbS1ldmVudHMuYzogVXNlIFNJTV9GSUxURVJfUEFUSCB0byBmaWx0ZXIgb3V0IHRoZSBmaWxlbmFtZQorIAlwYXRoLgorCitXZWQgTWFyIDE5IDAxOjEyOjA2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00IChTSU1fQUNfT1BUSU9OXyo6IE1vdmUgc28gdGhhdCB0aGV5IGFyZSBvdXRzaWRlIG9mCisgCVNJTV9BQ19DT01NT04gLSBTSU1fQUNfQ09NTU9OIHdhcyBnb2JsaW5nIGFyZ3VtZW50cy4KKworVHVlIE1hciAxOCAyMDo0ODoxMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogc2ltLWFsdS5oOiBJbmNsdWRlIHNpbS14Y2F0LmguCisJCitUdWUgTWFyIDE4IDEzOjU4OjE4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBNYWtlLWNvbW1vbi5pbiAoc2ltLWJpdHMuYywgc2ltLWNvcmUuYywgc2ltLWVuZGlhbi5jLAorIAlzaW0tZXZlbnRzLmMsIHNpbS1pbmxpbmUuYywgc2ltLWlvLmMpOiBEZWZpbmUgcnVsZXMgZm9yIGJ1aWxkaW5nCisgCXRoZXNlLgorCisJKiBzaW0tZXZlbnRzLmMgKHNpbV9ldmVudHNfYXRfbGFyZ2VfaW50KTogTmV3IGZ1bmN0aW9uLiAgSnVzdAorIAlzY2hlZHVsZXMgYW4gZXZlbnQgZXZlcnkgbGFyZ2UtaW50IHRpY2tzLgorCShzaW1fZXZlbnRzX2luaXQpOiBDYWxsLgorCShzaW1fZXZlbnRzX3RpY2ssIHNpbV9ldmVudHNfcHJvY2Vzcyk6IE1vdmUgYXN5bmMgaGFuZGluZyB0bworIAlzaW1fZXZlbnRzX3Byb2Nlc3MuICBNb3ZlIHRpbWVyIGRlY3JlbWVudCBzbyB0aGF0IGl0IG9jY3VyZXMgYWZ0ZXIKKyAJZXZlbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQuCisJCisJKiBzaW0tYmFzaWNzLmggKHN0cnVjdCBfZW5naW5lKTogUmVtb3ZlIGRlY2xhcmF0aW9uLgorCisJKiBzaW0tZXZlbnRzLmgsIHNpbS1ldmVudHMuYzogUmVuYW1lIHR5cGUgdG8gc2ltX2V2ZW50cy4gIFByZWZpeAorIAlldmVyeXRoaW5nIHdpdGggc2FtZS4gIFJlbmFtZSBnbG9iYWwgc3RydWN0IHRvIFNJTV9ERVNDLgorCSogc2ltLWNvcmUuaCwgc2ltLWNvcmUuYywgc2ltLW4tY29yZS5jOiBEaXR0byBmb3Igc2ltX2NvcmUuCisJKiBzaW0taW8uaCwgc2ltLWlvLmM6IERpdHRvLgorCQorCSogc2ltLWFzc2VydC5oOiBOZXcgZmlsZS4gT3B0aW9uYWwgYXNzZXJ0aW9uIGNoZWNraW5nIG1hY3Jvcy4KKwkqIHNpbS1pby5jIChzaW1faW9fZXJyb3IpOiBNYWtlIGp1c3QgdGhpcyBmdW5jdGlvbiB0b2xlcmFudCB0bworIAludWxsIHBvaW50ZXJzLgorCQorCSogc2ltLXhjYXQuaDogTmV3IGZpbGUuIERlZmluZSBjb25jYXRlbmF0ZSBtYWNyb3MuCisJKiBzaW0tYmFzaWNzLmggKFhDT05DQVQqKTogTW92ZSB0byBzaW0teGNhdC5oLgorCSogc2ltLW4tY29yZS5oLCBzaW0tbi1iaXRzLmgsIHNpbS1uLWVuZGlhbi5oOiBFeHBsaWNpdGx5IGluY2x1ZGUKKyAJY29uY2F0IG1hY3Jvcy4KKwkKKworVHVlIE1hciAxOCAxMjo0NDo1NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogc2ltLWJpdHMuaCAoTFNNQVNLKTogTmV3IG1hY3JvLiBDcmVhdGUgbWFzayBvZiBMUyBiaXRzLgorCitNb24gTWFyIDE3IDE4OjEwOjA1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBzaW0taW5saW5lLmg6IEFkZCBkZWZpbml0aW9ucyBmb3Igc2ltLXR5cGVzLgorCShBTExfQllfTU9EVUxFKTogTmV3IG1hY3JvLCBlbmNhcHN1bGF0ZSBmdWxsIGlubGluaW5nIGJ5IHRoZQorIAltb2R1bGUuCisKK01vbiBNYXIgMTcgMTU6Mzg6MjcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisJCisJKiBzaW0tZXZlbnRzLmg6IFJlbW92ZSBkZWZ1bmN0IHJlZmVyZW5jZSB0byBjYWxsYmFjayBzdHJ1Y3QuCisKK01vbiBNYXIgMTcgMTU6MTA6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCisKK01vbiBNYXIgMTcgMTU6MDQ6NDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIE1ha2UtY29tbW9uLmluIChDU0VBUkNIKTogRG8gbm90IGluY2x1ZGUgdGhlIGdkYiBkaXJlY3RvcnkgaW4KKyAJdGhlIHNlYXJjaCBwYXRoLgorCitNb24gTWFyIDE3IDEzOjE2OjI2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBNYWtlLWNvbW1vbi5pbiAoU0lNX0VORElBTiwgU0lNX0hPU1RFTkRJQU4sIFNJTV9JTkxJTkUsCisgCVNJTV9XQVJOSU5HKTogRHJvcCwgcmVxdWlyaW5nIHRoZSBzaW11bGF0b3Igc3BlY2lmaWMgTWFrZWZpbGUuaW4KKyAJdG8gZXhwbGljaXRseSBpbmNvcnBvcmF0ZSB0aGVzZS4KKworCSogYWNsb2NhbC5tNCAoLS1lbmFibGUtc2ltLWFsaWdubWVudCk7IE5ldyBvcHRpb24uIFN0cm9uZ2x5CisgCXNwZWNpZnkgdGhlIGFsaWdubWVudCByZXN0cmljdGlvbnMgb2YgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgLQorIAl3aXRob3V0IHRoaXMgb3B0aW9uIGFsbCBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSBhY2NvbW9kYXRlZC4KKyAJKC0tZW5hYmxlLXNpbS1hc3NlcnQpOiBOZXcgb3B0aW9uLiAgQ29uZGl0aW9uYWxseSBjb21waWxlIGluCisgCWFzc2VydGlvbiBzdGF0ZW1lbnRzLgorCSgtLWVuYWJsZS1zaW0tZmxvYXQpOiBOZXcgb3B0aW9uLiBTdHJvbmdseSBzcGVjaWZ5IHRoZSB0YXJnZXQncworIAlmbG9hdGluZyBwb2ludCBzdXBwb3J0LgorCSgtLWVuYWJsZS1zaW0taGFyZHdhcmUpOiBOZXcgb3B0aW9uLiAgU3BlY2lmeSB0aGUgaGFyZHdhcmUgZGV2aWNlcworIAlpbmNsdWRlZCBpbiB0aGUgc2ltdWxhdGlvbi4KKwkoLS1lbmFibGUtc2ltLXBhY2thZ2VzKTogTmV3IG9wdGlvbi4gIFNwZWNpZnkgdGhlIGhhcmR3YXJlCisgCXBhY2thZ2VzIGluY2x1ZGVkIGluIHRoZSBzaW11bGF0aW9uLgorCSgtLWVuYWJsZS1zaW0tcmVncGFybSk6IE5ldyBvcHRpb24uICBTcGVjaWZ5IHRoYXQgcGFyYW1ldGVycyBiZQorIAlwYXNzZWQgaW4gcmVnaXN0ZXJzIGluc3RlYWQgb2Ygb24gdGhlIHN0YWNrLgorCSgtLWVuYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cyk6IE5ldyBvcHRpb24uIFNwZWNpZnkgdGhhdCByZXNlcnZlZAorIAliaXRzIHdpdGhpbiBhbiBpbnN0cnVjdGlvbiBhcmUgYXJlIGNvcnJlY3RseSBzZXQuCisJKC0tZW5hYmxlLXNpbS1zbXApOiBOZXcgb3B0aW9uLiBTcGVjaWZ5IHRoZSBsZXZlbCBvZiBTTVAgc3VwcG9ydAorIAl0byBiZSBpbmNsdWRlZCBpbiB0aGUgc2ltdWxhdG9yLgorCSgtLWVuYWJsZS1zaW0tc3RkY2FsbCk6IE5ldyBvcHRpb24uICBTcGVjaWZ5IGFuIGFsdGVybmF0aXZlCisgCWZ1bmN0aW9uIGNhbGwgY29udmVudGlvbi4KKwkoLS1lbmFibGUtc2ltLXhvci1lbmRpYW4pOiBOZXcgb3B0aW9uLiAgQ29uZmlndXJlIHhvci1lbmRpYW4KKyAJc3VwcG9ydCB1c2VkIGJ5IHNvbWUgdGFyZ2V0cyB0byBpbXBsZW1lbnQgYmktZW5kaWFuIHN1cHBvcnQuCisJCitGcmkgTWFyIDE0IDE5OjUxOjIxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00ICgtLWVuYWJsZS1zaW0taG9zdGVuZGlhbik6IE5ldyBvcHRpb24uICBBbGxvdyB0aGUKKyAJaG9zdCBlbmRpYW5uZXNzIHRvIGJlIG92ZXJyaWRkZW4uCisJKC0tZW5hYmxlLXNpbS1lbmRpYW4pOiBBbGxvdyB0aGUgdGFyZ2V0IHBsYXRmb3JtJ3MgYnl0ZSBvcmRlcgorCXRvIGJlIG92ZXJyaWRkZW4uCisJKC0tZW5hYmxlLXNpbS1pbmxpbmUpOiBDb250cm9sIHRoZSBpbmxpbmluZyBvZiBjb21tb24gY29tcG9uZW50cy4KKwkoLS1lbmFibGUtc2ltLWJzd2FwKTogRm9yIGNvbXBhdGliaWxpdHksIGFsc28gZGVmaW5lIFdJVEhfQlNXQVAuCisJKC0tZW5hYmxlLXNpbS13YXJuaW5ncyk6IEVuYWJsZSBhZGRpdGlvbmFsIEdDQyBjb21waWxlciBjaGVja3MuCisJKiBNYWtlLWNvbW1vbi5pbiAoU0lNX0VORElBTiwgU0lNX0hPU1RFTkRJQU4sIFNJTV9JTkxJTkUsCisJU0lNX1dBUk5JTkdTKTogQWRkLgorCQorCSogc2ltLW4tY29yZS5oLCBzaW0tbi1iaXRzLmgsIHNpbS1uLWVuZGlhbi5oOiBSZW5hbWUgZnJvbQorIAlzaW0tKi1uLmggc28gdGhhdCB0aGUgbmFtZXMgYXJlIHVuaXEgb24gZG9zIG1hY2hpbmVzCisJKiBzaW0tY29yZS5jLCBzaW0tYml0cy5jLCBzaW0tZW5kaWFuLmM6IFVwZGF0ZS4KKwkKK1RodSBNYXIgMTMgMTI6MzI6NDIgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogcnVuLmM6ICNpbmNsdWRlICJsaWJpYmVydHkuaCIuCisJKG1haW4pOiBOZXcgbG9jYWxzIHNkLG5vX2FyZ3Msc2ltX2FyZ3YuCisJUnVuIGJ1aWxkYXJndiBvbiAtYSBvcHRpb24uICBQYXNzIGFyZ3YgdG8gc2ltX29wZW4sIGFyZ3ZbMF0KKwlpcyBwcm9ncmFtIG5hbWUuICBVcGRhdGUgY2FsbCB0byBzaW1fc2V0X2NhbGxiYWNrcy4KKwlSZWNvcmQgcmVzdWx0IG9mIHNpbV9vcGVuLCBwYXNzIHRvIG90aGVyIHNpbV9mb28gcm91dGluZXMuCisKK1RodSBNYXIgMTMgMTA6MjQ6MDUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNhbGxiYWNrLmMgKG9zX3ByaW50Zl9maWx0ZXJlZCk6IERvIG5vdCBjYWxsIGV4aXQoMSkgb3IgcHJpbnQgYQorCWZpbmFsIG5ld2xpbmUuCisKK1RodSBNYXIgIDYgMTU6NTA6MjggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGNhbGxiYWNrLmM6IEFkZCBvc19mbHVzaF9zdGRvdXQgYW5kIHZwcmludGZfZmlsdGVyZWQgY2FsbGJhY2tzLgorICAJUm91dGUgc3Rkb3V0IHRocm91Z2ggYnVmZmVyZWQgSU8uCisKKwkqIGNhbGxiYWNrLmM6IEFkZCBvc19mbHVzaF9zdGRlcnIsIG9zX3dyaXRlX3N0ZGVyciwKKyAJb3NfZXZwcmludGZfZmlsdGVyZWQgZnVuY3Rpb25zIHRvIHJvdXRlIGVycm9yIG91dHB1dCB0aHJvdWdoCisgCXN0ZGVyci4KKwkKKwkqIHNpbS1pby5oLCBzaW0taW8uYyAoc2ltX2lvX2ZsdXNoX3N0ZGVyciwgc2ltX2lvX2ZsdXNoX3N0ZG91dCk6CisgCUNvcnJlY3QgcmV0dXJuIHR5cGUgLSBzaG91bGQgYmUgdm9pZC4KKworRnJpIE1hciAgNyAyMDoxNDozNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogc2ltLWJhc2ljcy5oOiBDbGVhbiB1cC4gIE1hbnkgbWFjcm8ncyBtb3ZlZCB0byBzaW0taW5saW5lLmguCisKKwkqIHNpbS1jb25maWcuaDogRGl0dG8uICBGb3Igc29tZSBvcHRpb25zIC0gZWcgV0lUSF9ERVZJQ0VTIC0gZG8KKyAJbm90IHByb3ZpZGUgYSBkZWZhdWx0IHZhbHVlIGFzIHVuZGVmaW5lZCBpbmRpY2F0ZXMgZGlzYWJsZSBjb2RlLgorCitUaHUgTWFyICA2IDE1OjUwOjI4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBzaW0tY29yZS5oLCBzaW0tY29yZS1uLmgsIHNpbS1jb3JlLmM6IEJvcnJvdyBjb2RlIGZyb20gcHBjCisgCWRpcmVjdG9yeS4KKwkqIHNpbS1ldmVudHMuaCwgc2ltLWV2ZW50cy5jOiBEaXR0by4KKwkqIHNpbS1pby5oLCBzaW0taW8uYzogRGl0dG8uCisJCitUdWUgTWFyICA0IDA5OjM1OjU2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCQorCSogc2ltLWFsdS5oIChBTFVfU1VCX0NBLCBBTFUqX1NVQl9DQSk6IE5ldyBhbHUgb3BlcmF0aW9uLgorCisJKiBzaW0tYml0cy5oLCBzaW0tYml0cy1uLmgsIHNpbS1iaXRzLmMgKExTTUFTS0VEKik6IE5ldyBtYWNybydzCisgCWV4dHJhY3QgdGhlIHRhaWwgb3IgbGVhc3Qgc2lnbmlmaWFudCBiaXRzIGZyb20gYW4gaW50ZWdlciBvZiB0aGUKKyAJc3BlY2lmaWVkIHNpemUuCisJCisJKiBzaW0tYml0cy5oLCBzaW0tYml0cy5jOiBDbGVhbiB1cCBjb25kaXRpb25hbGx5IGNvbXBpbGVkICNpZgorIAlXSVRIX1RBUkdFVF9CSVRTSVpFIHNvIHRoYXQgdGhlIGNvbXBpbGF0aW9uIHdpbGwgZmFpbCB3aGVuIGFuCisgCXVuc3VwcG9ydGVkIGJpdHNpemUgdmFsdWUgaXMgZGVmaW5lZC4KKworCShJTlNFUlRFRCopOiBDb252ZXJ0IHRvIGZ1bmN0aW9ucy4KKwkoRVhUUkFDVEVEKik6IERpdHRvLgorCQorCShTSUdOX0VYVEVORCwgU0VYVCk6IENoYW5nZSB0byBtb3JlIHRlcnNlIG5hbWUuCisJCitUdWUgTWFyICA0IDA5OjM1OjU2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBzaW0taW5saW5lLmg6IEFsbG93IGV4cGxpY2l0IGNvbnRyb2wgb3ZlciB3aGljaCAuYyBmaWxlcyB3aWxsIGJlCisgCWluY2x1ZGVkIGJ5IHRoZWlyIGhlYWRlci4KKworCSogc2ltLWlubGluZS5oOiBBbGxvdyBleHBsaWNpdCBjb250cm9sIG92ZXIgd2hpY2ggLmMgZmlsZXMgdXNlIHRoZQorIAlhbHRlcm5hdGl2ZSAtIFJFR1BBUk0gLSBwYXJhbWV0ZXIgcGFzc2luZyBtZWNoYW5pc20uCisJCisJKiBzaW0taW5saW5lLmgsIHNpbS1pbmxpbmUuYzogRG9uJ3QgYXR0ZW1wdCB0byBpbmNsdWRlIGFueSBvZgorIAlpY2FjaGUuYywgaWRlY29kZS5jLCBzZW1hbnRpY3MuYyBvciBzdXBwb3J0LmMuICBUaG9zZSBuYW1lcyBhcmUKKyAJbm90IGdlbmVyYWxseSBhcHBsaWNhYmxlLgorCQorVGh1IEZlYiAyNyAxMDoxNzoyMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogc2ltLWJpdHMuYywgc2ltLWJpdHMtbi5oIChuZXcpOiBTcGxpdCBzaW0tYml0cy5jIGludG8gdHdvIHBhcnRzCisgCWluIGEgZmFzaGlvbiBzaW1pbGFyIHRvIHNpbS1lbmRpYW4tbi4KKworCSogc2ltLWVuZGlhbi5oOiAoSF93b3JkLCBMX3dvcmQsIEFMXyosIFZMXyopOiBFeHRlbmQgdG8gaW5jbHVkZQorIAlib3RoIHZhbHVlIGFuZCBhZGRyZXNzIG1hY3JvJ3MuCisKK1R1ZSBGZWIgMjUgMTg6NTE6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIHNpbS1hbHUuaCAoQUxVMTZfQkVHSU4sIEFMVTE2X1NFVCwgLi4uKTogRmlsbCBpbi4KKworCSogc2ltLWVuZGlhbi5oIChMX3dvcmQsIEhfd29yZCk6IFJlcGxhY2UgTVMyV180LCBMUzJXXzQgd2l0aCBtb3JlCisgCWdlbmVyaWMgTF93b3JkLCBIX3dvcmQgbWFjcm8ncy4KKworVGh1IEZlYiAyMCAxODozNjo1NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGNyaXR0ZXJzLmN5Z251cy5jb20+CisKKwkqIHNpbS1iYXNpY3MuaDogQm9ycm93IGNvZGUgZnJvbSBwcGMgZGlyZWN0b3J5LgorCSogc2ltLWJpdHMuYzogRGl0dG8uCisJKiBzaW0tYml0cy5oOiBEaXR0by4KKwkqIHNpbS1jb25maWcuaDogRGl0dG8uCisJKiBzaW0tZW5kaWFuLW4uaDogRGl0dG8uCisJKiBzaW0tZW5kaWFuLmM6IERpdHRvLgorCSogc2ltLWVuZGlhbi5oOiBEaXR0by4KKwkqIHNpbS1pbmxpbmUuYzogRGl0dG8uCisJKiBzaW0taW5saW5lLmg6IERpdHRvLgorCSogc2ltLXR5cGVzLmg6IERpdHRvLgorCitXZWQgRmViIDE5IDEyOjQwOjUwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY3JpdHRlcnMuY3lnbnVzLmNvbT4KKworCSogc2ltLWFsdS5oIChBTFVfU0VUMTYsIEFMVV9TRVQzMiwgQUxVX1NFVDY0LCBldGMpOiBNYWtlIGF2YWlsYWJsZQorIAlhbGwgdGhlIEFMVSBzaXplIGFsdGVybmF0aXZlcyBhbmQgdGhlbiBhdXRvLWNvbmZpZ3VyZSBhIGRlZmF1bHQuCisJCisJKiBzaW0tYWx1Lmg6IENvcHkgcHBjL2lkZWNvZGVfZXhwcmVzc2lvbi5oLgorCitNb24gRmViIDE3IDEwOjQ0OjE4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY3JpdHRlcnMuY3lnbnVzLmNvbT4KKworCSogYml0cy5oLCBiaXRzLmMgKFNJR05fRVhURU5EMzIsIFNJR05fRVhURU5ENjQpOiBOZXcgZnVuY3Rpb25zLAorIAlzaWduIGV4dGVuZCBhIGJpdCB3aXRoaW4gYSB2YWx1ZS4KKworCSogc2ltLWVuZGlhbi5oLCBzaW0tZW5kaWFuLW4uaCAob2Zmc2V0X04pOiBOZXcgZnVuY3Rpb25zIC0gcmV0dXJuCisgCWEgcG9pbnRlciBpbnRvIHRoZSBtaWRkbGUgb2YgYSBob3N0IHdvcmQuCisJKiBzaW0tZW5kaWFuLmggKE1TMldfNCwgTFMyV180KTogVXNlIHRoaXMgZnVuY3Rpb24uCisJCitUdWUgRmViIDExIDEzOjQ2OjQ5IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY2FsbGJhY2suYzogSWYgSEFWRV9DT05GSUdfSCBpcyBkZWZpbmVkLCBpbmNsdWRlIGNvbmZpZy5oIGZyb20KKwlhdXRvY29uZi4gIElmIEhBVkVfVU5JU1REX0ggaXMgZGVmaW5lZCwgaW5jbHVkZSB1bmlzdGQuaCB0byBnZXQKKwlhcHByb3ByaWF0ZSBkZWZpbml0aW9ucyBvZiByZWFkLCB3cml0ZSwgZXRjLiAgQWRkIHByb3RvdHlwZSBmb3IKKwlzeXN0ZW0uCisKK1R1ZSBGZWIgIDQgMTM6MjQ6NDQgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGxpYmNvbW1vbi5hKTogRGVsZXRlLgorCShjYWxsYmFjay5vLHRhcmctbWFwLm8pOiBEZWxldGUsIG1vdmVkIHRvIE1ha2UtY29tbW9uLmluLgorCShnZW50bWFwLHRhcmctdmFscy5oLHRhcmctbWFwLmMpOiBMaWtld2lzZS4KKwkocnVuLWF1dG9jb25mKTogRGVsZXRlLgorCSogYWNsb2NhbC5tNCAoU0lNX0FDX09VVFBVVCk6IFJlZG8gY3JlYXRpb24gb2YgTWFrZWZpbGUuCisJKGNvbW1vbiBtYWtlZmlsZSBmcmFnbWVudCk6IE1vdmVkIGJhY2sgaW50byAuLi4KKwkqIE1ha2UtY29tbW9uLmluOiBSZXN1cnJlY3QuCisJKiBjb25maWd1cmUuaW4gKEFDX0xJTktfRklMRVMpOiBEZWxldGUsIHVubmVjZXNzYXJ5IG5vdy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK0ZyaSBKYW4gMzEgMDc6MTY6NDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNCAoU0lNX0FDX0NPTU1PTik6IE1vdmUgQ09NTU9OX01BS0VGSUxFX0ZSQUcgZnJvbSBoZXJlLgorCShTSU1fQUNfT1VUUFVUKTogVG8gaGVyZS4KKworRnJpIEphbiAyNCAxMDozNzoxNyAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBhY2xvY2FsLm00IChDT01NT05fTUFLRUZJTEVfRlJBRyk6ICBRdW90ZSBhIGNvdXBsZSBvZiAkJ3MgaW4KKwljb21tZW50cyBhbmQgc2luZ2xlIHF1b3Rlcy4gIEZpeGVzIGEgcHJvYmxlbSBmb3VuZCBvbiBocHV4LgorCitUaHUgSmFuIDIzIDEzOjM1OjAzIDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGFjbG9jYWwubTQ6ICBSZW1vdmUgTWFrZS1jb21tb24uaW4gZnJvbSBkZXBlbmRlbmNpZXMuCisJKiAoZGlzdGNsZWFuKTogIFJlbW92ZSB0YXJnLXZhbHMuZGVmLgorCisJKiBhY2xvY2FsLm00IChTSU1fQUNfQ09NTU9OKTogIE1vdmUgY29udGVudHMgb2YgTWFrZS1jb21tb24uaW4KKwlpbnRvIGhlcmUuICBNYWtlcyBpbnNlcnRpb24gaW50byBtYWtlZmlsZXMgZWFzaWVyLiAgQWxzbywgY2hhbmdlCisJdGhlIHdheSB0aGF0IGNhbGxiYWNrLm8sIGdlbnRtYXAsIHRhcmctdmFscy5oLCB0YXJnLW1hcC5jLAorCXRhcmctbWFwLm8sIGFuZCBydW4gYXJlIGJ1aWx0LiAgVGhleSBhcmUgbm93IGJ1aWx0IGluIHRoZQorCWluZGl2aWR1YWwgc2ltdWxhdG9yIGRpcmVjdG9yaWVzLCB0YWtpbmcgc291cmNlcyBmcm9tIC4uL2NvbW1vbiBhcworCW5lY2Vzc2FyeS4gIFRoaXMgcmVwbGFjZXMgdGhlIG1lcmdpbmcgb2YgbGliY29tbW9uLmEgaW50bworCWxpbnNpbS5hLCB3aGljaCB3YXMgcHJvYmxlbWF0aWMgZm9yIHRoZSBXaW5HREIgYnVpbGQgcHJvY2Vzcy4KKwkqIHJ1bi5jOiAgSW5jbHVkZSBjb25maWcuaCBmcm9tIC4gaW5zdGVhZCBvZiAuLi9jb21tb24uCisJKiBNYWtlLWNvbW1vbi5pbjogIFJlbW92ZS4gIEl0J3Mgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4KKworTW9uIERlYyAxNiAxNTowMjozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2UtY29tbW9uLmluIChBTExfQ0xBR1MpOiBQdXQgQ0ZMQUdTIGF0IHRoZSBlbmQuCisJKC5jLm8pOiBQdXQgJChBTExfQ0ZMQUdTKSBiZWZvcmUgdGhlIGZpbGUgYmVpbmcgY29tcGlsZWQuCisKK1dlZCBEZWMgMTEgMTE6MzA6NTggMTk5NiAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgorCisJKiBydW4uYyAobWFpbik6IFNldCB0YXJnZXRfYnl0ZV9vcmRlciBiZWZvcmUgY2FsbCB0byBzaW1fb3Blbi4KKworU3VuIERlYyAgOCAxODoyMjowNiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjYWxsYmFjay5jOiAjaW5jbHVkZSA8c3RkbGliLmg+CisJKG9zX2Vycm9yKTogTmV3IGZ1bmN0aW9uLgorCShkZWZhdWx0X2NhbGxiYWNrKTogQWRkIG9zX2Vycm9yLgorCitNb24gTm92IDI1IDE5OjQ0OjM1IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2UtY29tbW9uLmluIChNYWtlZmlsZSk6IFNldCBDT05GSUdfSEVBREVSUz0iIi4KKwkqIGFjbG9jYWwubTQ6IE1hcmsgdGhlIGZhY3QgdGhhdCAtLWVuYWJsZS1zaW0tYnN3YXAgaXNuJ3QgaG9zdAorCXNwZWNpZmljLgorCShTSU1fQUNfT1VUUFVUKTogRG9uJ3QgYnVpbGQgTWFrZWZpbGUgaWYgQ09ORklHX0ZJTEVTPSIiLgorCitXZWQgTm92IDIwIDAxOjExOjA0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHJ1bi5jOiAjaW5jbHVkZSAuLi9jb21tb24vY29uZmlnLmgsIHRjb25maWcuaC4KKwkobXluYW1lKTogTmV3IHN0YXRpYyBnbG9iYWwuCisJKG1haW4pOiBSZWNvZ25pemUgbmV3IG9wdGlvbnMgLWEsIC1jLiAgQWxzbyByZWNvZ25pemUgLWggaWYgaDgvMzAwLgorCU9ubHkgcHJvY2VzcyAtYyBpZmRlZiBTSU1fSEFWRV9TSU1DQUNIRS4KKwlPbmx5IHByb2Nlc3MgLXAvLXMgaWZkZWYgU0lNX0hBVkVfUFJPRklMRS4KKwlQYXJzZSBwcm9ncmFtIG5hbWUgZnJvbSBhcmd2WzBdIGFuZCB1c2UgaW4gZXJyb3IgbWVzc2FnZXMuCisJUGFzcyBzaW1fYXJncyB0byBzaW1fb3Blbi4gIFBhc3MgcHJvZ19hcmdzIHRvIHNpbV9jcmVhdGVfaW5mZXJpb3IuCisJQWRkIHN1cHBvcnQgZm9yIGluY29tcGxldGUgaDgvMzAwIHRlcm1pbmF0aW9uIGluZGljYXRvcnMuCisJKHVzYWdlKTogTWFrZSBtb3JlIHZlcmJvc2UuCisJKiBhY2xvY2FsLm00LGNvbmZpZy5pbix0Y29uZmlnLmluLGNvbmZpZ3VyZS5pbixjb25maWd1cmU6IE5ldyBmaWxlcy4KKwkqIE1ha2VmaWxlLmluLE1ha2UtY29tbW9uLmluLGNhbGxiYWNrLmM6IE5ldyBmaWxlcy4KKwkqIG5sdHZhbHMuZGVmLGdlbnRtYXAuYyxnZW50dmFscy5zaDogTmV3IGZpbGVzLgorCitUdWUgTm92IDEyIDEzOjM0OjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4gICAKKworCSogcnVuLmM6IEluY2x1ZGUgc3RkYXJnLmggaWYgX19TVERDX18uCisKK1R1ZSBPY3QgMTUgMTE6MTY6MzEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBydW4uYyAobWFpbik6IERvbid0IHByaW50IG91dCBhbnl0aGluZyBpZiB0aGUgc2lnbmFsCisJbnVtYmVyIGlzIHplcm8gKGllIG5vIHNpZ25hbCkuCisKK1R1ZSBPY3QgMTUgMTE6MjA6NDQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBydW4uYyAobWFpbik6IFByaW50IG91dCBpZiB0aGUgcHJvZ3JhbSByYWlzZWQgYSBzaWduYWwuCisKK1dlZCBTZXAgMTggMDk6NTI6MTQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBydW4uYyAoZXhlY19iZmQpOiBSZW5hbWUgZnJvbSBzaW1fYmZkLCB0byB1c2UgdGhlIGdkYiBuYW1lLgorCShtYWluKTogRGl0dG8uCisKK1R1ZSBTZXAgMTcgMTE6MDQ6NTAgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgorCisJKiBydW4uYyAobWFpbik6IEV4cGxpY2l0bHkgY2FzdCBtYWxsb2MoKSBwYXJhbWV0ZXIuCisKK1RodSBTZXAgMTIgMTE6Mjc6MjEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBydW4uYyAoc2ltX2JmZCk6IE5ldyBnbG9iYWwgdG8gaG9sZCB0aGUgYmZkIHBvaW50ZXIgZm9yIHRoZQorCWV4ZWN1dGFibGUuCisJKG1haW4pOiBJbml0aWFsaXplIHNpbV9iZmQuCisKK0ZyaSBEZWMgMTUgMTY6Mjc6NDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBydW4uYyAobWFpbik6IFVzZSBuZXcgYmZkX2JpZ19lbmRpYW4gbWFjcm8uCisKK1dlZCBOb3YgIDggMTU6NDk6NDkgMTk5NSAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAcGFzYW5kYS5jeWdudXMuY28udWs+CisKKwkqIHJ1bi5jIChtYWluKTogUmVtb3ZlZCBTSCBzcGVjaWZpYyBjb21tZW50cywgc28gc291cmNlIGlzCisgCWdlbmVyaWMuIEFsc28gdXBkYXRlZCB0byBvbmx5IGxvYWQgcmVsZXZhbnQgc2VjdGlvbnMuIE1vdmVkCisgCXNpbV9vcGVuKCkgdG8gYWZ0ZXIgY2FsbGJhY2sgYXR0YWNoICh0byBtYXRjaCBHREIpLgorCisgIAkqIHJ1bi4xOiBSZW1vdmVkIFNIIHNwZWNpZmljIGNvbW1lbnRzLgorCitTYXQgT2N0IDIxIDEyOjMxOjAxIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KKworCSogcnVuLmMgKG1haW4pOiBBbHdheXMgcmV0dXJuIHNpZ3JjIGF0IGVuZC4KKworVHVlIE9jdCAxMCAxMjowMzoxMyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIHJ1bi5jIChtYWluKTogUHJpbnQgZXJyb3IgZGlhZ25vc3RpYyBhbmQgZXhpdCBpZiBiZmRfb3BlbnIoKSBvcgorCWJmZF9jaGVja19mb3JtYXQoKSBmYWlscy4KKworVGh1IFNlcCAyOCAxNTo0MDozNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBydW4uYywgcnVuLjE6IEZyb20gc2ggZGlyZWN0b3J5LgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiBiL3NpbS9jb21tb24vTWFrZS1jb21tb24uaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiNGY2OQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vTWFrZS1jb21tb24uaW4KQEAgLTAsMCArMSw2NDIgQEAKKyMgTWFrZWZpbGUgZnJhZ21lbnQgZm9yIGNvbW1vbiBwYXJ0cyBvZiBhbGwgc2ltdWxhdG9ycy4KKyMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMgVGhpcyBNYWtlZmlsZSBmcmFnbWVudCBjb25zaXN0cyBvZiB0d28gc2VwYXJhdGUgcGFydHMuCisjIFRoZXkgYXJlIG1lcmdlZCBpbnRvIHRoZSBmaW5hbCBNYWtlZmlsZSBhdCBwb2ludHMgZGVub3RlZCBieQorIyAiIyMgQ09NTU9OX1BSRV9DT05GSUdfRlJBRyIgYW5kICIjIyBDT01NT05fUE9TVF9DT05GSUdfRlJBRyIuCisjCisjIFRoZSB0YXJnZXQgTWFrZWZpbGUgc2hvdWxkIGxvb2sgbGlrZToKKyMKKyM+IyBDb3B5cmlnaHQgYmxhaCBibGFoCisjPgorIz4jIyBDT01NT05fUFJFX0NPTkZJR19GUkFHCisjPgorIz4jIEFueSBvdmVycmlkZXMgbmVjZXNzYXJ5IGZvciB0aGUgU0lNX0ZPTyBjb25maWcgdmFycy4KKyM+U0lNX0ZPTyA9IC4uLgorIz4KKyM+IyMgQ09NTU9OX1BPU1RfQ09ORklHX0ZSQUcKKyM+CisjPiMgUnVsZXMgdG8gYnVpbGQgdGFyZ2V0IHNwZWNpZmljIC5vJ3MuCisKKyMjIENPTU1PTl9QUkVfQ09ORklHX0ZSQUcKKworVlBBVEggPSBAc3JjZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3NyY2NvbSA9ICQoc3JjZGlyKS8uLi9jb21tb24KK3NyY3Jvb3QgPSAkKHNyY2RpcikvLi4vLi4KKworcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorCitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorYmluZGlyID0gQGJpbmRpckAKKworbGliZGlyID0gQGxpYmRpckAKK3Rvb2xkaXIgPSAkKGxpYmRpcikvJCh0YXJnZXRfYWxpYXMpCisKK2RhdGFkaXIgPSBAZGF0YWRpckAKK21hbmRpciA9IEBtYW5kaXJACittYW4xZGlyID0gJChtYW5kaXIpL21hbjEKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKKworIyBUaGlzIGNhbiBiZSByZWZlcmVuY2VkIGJ5IHRoZSBnZXR0ZXh0IGNvbmZpZ3VyYXRpb24gY29kZS4KK3RvcF9idWlsZGRpciA9IC4uCisKK0VYRUVYVCA9IEBFWEVFWFRACitTSEVMTCA9IEBTSEVMTEAKKworSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACisKK0NDID0gQENDQAorQ0NfRk9SX0JVSUxEID0gQENDX0ZPUl9CVUlMREAKK0NGTEFHUyA9IEBDRkxBR1NACitTSU1fQlNXQVAgPSBAc2ltX2Jzd2FwQAorU0lNX0NGTEFHUyA9IEBzaW1fY2ZsYWdzQAorU0lNX0RFQlVHID0gQHNpbV9kZWJ1Z0AKK1NJTV9UUkFDRSA9IEBzaW1fdHJhY2VACitTSU1fUFJPRklMRSA9IEBzaW1fcHJvZmlsZUAKKworU0lNX0FTU0VSVCA9IEBzaW1fYXNzZXJ0QAorU0lNX0FMSUdOTUVOVCA9IEBzaW1fYWxpZ25tZW50QAorU0lNX0JJVFNJWkUgPSBAc2ltX2JpdHNpemVACitTSU1fREVGQVVMVF9NT0RFTCA9IEBzaW1fZGVmYXVsdF9tb2RlbEAKK1NJTV9FTkRJQU4gPSBAc2ltX2VuZGlhbkAKK1NJTV9FTlZJUk9OTUVOVCA9IEBzaW1fZW52aXJvbm1lbnRACitTSU1fRkxPQVQgPSBAc2ltX2Zsb2F0QAorU0lNX0hXX0NGTEFHUyA9IEBzaW1faHdfY2ZsYWdzQAorU0lNX0hXX09CSlMgPSBAc2ltX2h3X29ianNACitTSU1fSFcgPSBAc2ltX2h3QAorU0lNX0hPU1RFTkRJQU4gPSBAc2ltX2hvc3RlbmRpYW5ACitTSU1fSU5MSU5FID0gQHNpbV9pbmxpbmVACitTSU1fUEFDS0FHRVMgPSBAc2ltX3BhY2thZ2VzQAorU0lNX1JFR1BBUk0gPSBAc2ltX3JlZ3Bhcm1ACitTSU1fUkVTRVJWRURfQklUUyA9IEBzaW1fcmVzZXJ2ZWRfYml0c0AKK1NJTV9TQ0FDSEUgPSBAc2ltX3NjYWNoZUAKK1NJTV9TTVAgPSBAc2ltX3NtcEAKK1NJTV9TVERDQUxMID0gQHNpbV9zdGRjYWxsQAorU0lNX1dBUk5JTkdTID0gQGJ1aWxkX3dhcm5pbmdzQAorU0lNX1hPUl9FTkRJQU4gPSBAc2ltX3hvcl9lbmRpYW5ACisKK0hERUZJTkVTID0gQEhERUZJTkVTQAorVERFRklORVMgPQorCitBUiA9IEBBUkAKK0FSX0ZMQUdTID0gcmMKK1JBTkxJQiA9IEBSQU5MSUJACitNQUtFSU5GTyA9IG1ha2VpbmZvCisKK0RFUCA9ICQoc3Jjcm9vdCkvbWtkZXAKKworIyBFYWNoIHNpbXVsYXRvcidzIE1ha2VmaWxlLmluIGRlZmluZXMgb25lIG9yIG1vcmUgb2YgdGhlc2UgdmFyaWFibGVzCisjIHRvIG92ZXJyaWRlIG91ciBzZXR0aW5ncyBhcyBuZWNlc3NhcnkuICBUaGVyZSBpcyBubyBuZWVkIHRvIGRlZmluZSB0aGVzZQorIyBpbiB0aGUgc2ltdWxhdG9yJ3MgTWFrZWZpbGUuaW4gaWYgb25lIGlzIHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlLiAgSW4gZmFjdAorIyBpdCdzIHByZWZlcmFibGUgbm90IHRvLgorCisjIExpc3Qgb2Ygb2JqZWN0IGZpbGVzLCBsZXNzIGNvbW1vbiBwYXJ0cy4KK1NJTV9PQkpTID0KKyMgTGlzdCBvZiBleHRyYSBkZXBlbmRlbmNpZXMuCisjIEdlbmVyYWxseSB0aGlzIGNvbnNpc3RzIG9mIHNpbXVsYXRvciBzcGVjaWZpYyBmaWxlcyBpbmNsdWRlZCBieSBzaW0tbWFpbi5oLgorU0lNX0VYVFJBX0RFUFMgPQorIyBMaXN0IG9mIGZsYWdzIHRvIGFsd2F5cyBwYXNzIHRvICQoQ0MpLgorU0lNX0VYVFJBX0NGTEFHUyA9CisjIExpc3Qgb2YgZXh0cmEgbGlicmFyaWVzIHRvIGxpbmsgd2l0aC4KK1NJTV9FWFRSQV9MSUJTID0KKyMgTGlzdCBvZiBleHRyYSBwcm9ncmFtIGRlcGVuZGVuY2llcy4KK1NJTV9FWFRSQV9MSUJERVBTID0KKyMgTGlzdCBvZiBtYWluIG9iamVjdCBmaWxlcyBmb3IgYHJ1bicuCitTSU1fUlVOX09CSlMgPSBydW4ubworIyBEZXBlbmRlbmN5IG9mIGBhbGwnIHRvIGJ1aWxkIGFueSBleHRyYSBmaWxlcy4KK1NJTV9FWFRSQV9BTEwgPQorIyBEZXBlbmRlbmN5IG9mIGBpbnN0YWxsJyB0byBpbnN0YWxsIGFueSBleHRyYSBmaWxlcy4KK1NJTV9FWFRSQV9JTlNUQUxMID0KKyMgRGVwZW5kZW5jeSBvZiBgY2xlYW4nIHRvIGNsZWFuIGFueSBleHRyYSBmaWxlcy4KK1NJTV9FWFRSQV9DTEVBTiA9CisKKyMgRXZlcnkgdGltZSBhIG5ldyBnZW5lcmFsIHB1cnBvc2Ugc291cmNlIGZpbGUgd2FzIGFkZGVkIGV2ZXJ5IHRhcmdldCdzCisjIE1ha2VmaWxlLmluIG5lZWRlZCB0byBiZSB1cGRhdGVkIHRvIGluY2x1ZGUgdGhlIGZpbGUgaW4gU0lNX09CSlMuCisjIFRoaXMgZG9lc24ndCBzY2FsZS4KKyMgVGhpcyB2YXJpYWJsZSBzcGVjaWZpZXMgYWxsIHRoZSBnZW5lcmljIHN0dWZmIGNvbW1vbiB0byB0aGUgbmV3ZXIgc2ltdWxhdG9ycy4KKyMgVGhpbmdzIGxpa2Ugc2ltLXJlYXNvbi5vIGNhbid0IGdvIGhlcmUgYXMgdGhlIGNwdSBtYXkgcHJvdmlkZSBpdHMgb3duCisjICh0aG91Z2ggaG9wZWZ1bGx5IGluIHRpbWUgdGhhdCB3b24ndCBiZSBzbykuICBUaGluZ3MgbGlrZSBzaW0tYml0cy5vIGNhbiBnbworIyBoZXJlLiAgU29tZSBmaWxlcyBhcmUgdXNlZCBieSBhbGwgc2ltdWxhdG9ycyAoZS5nLiBjYWxsYmFjay5vKS4KKyMgVGhvc2UgZmlsZXMgYXJlIHNwZWNpZmllZCBpbiBMSUJfT0JKUyBiZWxvdy4KKworU0lNX0NPTU1PTl9IV19PQkpTID0gXAorCWh3LWFsbG9jLm8gXAorCWh3LWJhc2UubyBcCisJaHctZGV2aWNlLm8gXAorCWh3LWV2ZW50cy5vIFwKKwlody1oYW5kbGVzLm8gXAorCWh3LWluc3RhbmNlcy5vIFwKKwlody1wb3J0cy5vIFwKKwlody1wcm9wZXJ0aWVzLm8gXAorCWh3LXRyZWUubyBcCisJc2ltLWh3Lm8gXAorCitTSU1fTkVXX0NPTU1PTl9PQkpTID0gXAorCXNpbS1hcmFuZ2UubyBcCisJc2ltLWJpdHMubyBcCisJc2ltLWJyZWFrLm8gXAorCXNpbS1jb25maWcubyBcCisJc2ltLWNvcmUubyBcCisJc2ltLWVuZGlhbi5vIFwKKwlzaW0tZXZlbnRzLm8gXAorCXNpbS1mcHUubyBcCisJc2ltLWlvLm8gXAorCXNpbS1pbmZvLm8gXAorCXNpbS1sb2FkLm8gXAorCXNpbS1tZW1vcHQubyBcCisJc2ltLW1vZHVsZS5vIFwKKwlzaW0tb3B0aW9ucy5vIFwKKwlzaW0tcHJvZmlsZS5vIFwKKwlzaW0tc2lnbmFsLm8gXAorCXNpbS10cmFjZS5vIFwKKwlzaW0tdXRpbHMubyBcCisJc2ltLXdhdGNoLm8gXAorCVwKKwkkKFNJTV9IV19PQkpTKSBcCisKKyMgQWRkIHRoaXMgdG8gU0lNX0VYVFJBX0RFUFMuCitDR0VOX0lOQ0xVREVfREVQUyA9IFwKKwkkKHNyY2NvbSkvY2dlbi1jcHUuaCBcCisJJChzcmNjb20pL2NnZW4tZGVmcy5oIFwKKwkkKHNyY2NvbSkvY2dlbi1lbmdpbmUuaCBcCisJJChzcmNjb20pL2NnZW4tc2NhY2hlLmggXAorCSQoc3JjY29tKS9jZ2VuLXNpbS5oIFwKKwkkKHNyY2NvbSkvY2dlbi10cmFjZS5oIFwKKwkkKHNyY2NvbSkvY2dlbi10eXBlcy5oIFwKKwkkKHNyY2RpcikvLi4vLi4vaW5jbHVkZS9vcGNvZGUvY2dlbi5oCisKKyMjIEVuZCBDT01NT05fUFJFX0NPTkZJR19GUkFHCisKKyMjIENPTU1PTl9QT1NUX0NPTkZJR19GUkFHCisKK0NPTkZJR19DRkxBR1MgPSBcCisJQERFRlNAIFwKKwkkKFNJTV9DRkxBR1MpIFwKKwkkKFNJTV9ERUJVRykgXAorCSQoU0lNX0RFRkFVTFRfTU9ERUwpIFwKKwkkKFNJTV9UUkFDRSkgXAorCSQoU0lNX1BST0ZJTEUpIFwKKwkkKFNJTV9CU1dBUCkgXAorCSQoU0lNX0FTU0VSVCkgXAorCSQoU0lNX0FMSUdOTUVOVCkgXAorCSQoU0lNX0JJVFNJWkUpIFwKKwkkKFNJTV9FTkRJQU4pIFwKKwkkKFNJTV9FTlZJUk9OTUVOVCkgXAorCSQoU0lNX0ZMT0FUKSBcCisJJChTSU1fSFdfQ0ZMQUdTKSBcCisJJChTSU1fSE9TVEVORElBTikgXAorCSQoU0lNX0lOTElORSkgXAorCSQoU0lNX1BBQ0tBR0VTKSBcCisJJChTSU1fUkVHUEFSTSkgXAorCSQoU0lNX1JFU0VSVkVEX0JJVFMpIFwKKwkkKFNJTV9TQ0FDSEUpIFwKKwkkKFNJTV9TTVApIFwKKwkkKFNJTV9TVERDQUxMKSBcCisJJChTSU1fV0FSTklOR1MpIFwKKwkkKFNJTV9YT1JfRU5ESUFOKSBcCisJJChTSU1fSEFSRFdBUkUpIFwKKwkkKFNJTV9FWFRSQV9DRkxBR1MpIFwKKwkkKEhERUZJTkVTKSAkKFRERUZJTkVTKQorQ1NFQVJDSCA9IC1JLiAtSSQoc3JjZGlyKSAtSS4uL2NvbW1vbiAtSSQoc3JjY29tKSBcCisgIC1JLi4vLi4vaW5jbHVkZSAtSSQoc3Jjcm9vdCkvaW5jbHVkZSBcCisgIC1JLi4vLi4vYmZkIC1JJChzcmNyb290KS9iZmQgXAorICAtSS4uLy4uL29wY29kZXMgLUkkKHNyY3Jvb3QpL29wY29kZXMgXAorICAtSS4uLy4uL2ludGwgLUkkKHNyY3Jvb3QpL2ludGwKK0FMTF9DRkxBR1MgPSAkKENPTkZJR19DRkxBR1MpICQoQ1NFQVJDSCkgJChDRkxBR1MpCitCVUlMRF9DRkxBR1MgPSAtZyAtTyAkKENTRUFSQ0gpCisKK0NPTU1PTl9ERVBfQ0ZMQUdTID0gJChDT05GSUdfQ0ZMQUdTKSAkKENTRUFSQ0gpCisKK0xJQklCRVJUWV9MSUIgPSAuLi8uLi9saWJpYmVydHkvbGliaWJlcnR5LmEKK0JGRF9MSUIgPSAuLi8uLi9iZmQvbGliYmZkLmEKK09QQ09ERVNfTElCID0gLi4vLi4vb3Bjb2Rlcy9saWJvcGNvZGVzLmEKK0lOVExMSUJTID0gQElOVExMSUJTQAorSU5UTERFUFMgPSBASU5UTERFUFNACitDT05GSUdfTElCUyA9IEBMSUJTQAorTElCREVQUyA9ICQoQkZEX0xJQikgJChPUENPREVTX0xJQikgJChJTlRMTElCUykgJChMSUJJQkVSVFlfTElCKSBcCisJJChTSU1fRVhUUkFfTElCREVQUykKK0VYVFJBX0xJQlMgPSAkKEJGRF9MSUIpICQoT1BDT0RFU19MSUIpICQoSU5UTExJQlMpICQoTElCSUJFUlRZX0xJQikgXAorCSQoQ09ORklHX0xJQlMpICQoU0lNX0VYVFJBX0xJQlMpCisKK0xJQl9PQkpTID0gY2FsbGJhY2subyBzeXNjYWxsLm8gdGFyZy1tYXAubyAkKFNJTV9PQkpTKQorCitSVU5URVNURkxBR1MgPQorCithbGw6ICQoU0lNX0VYVFJBX0FMTCkgbGlic2ltLmEgcnVuIC5nZGJpbml0CisKK2xpYnNpbS5hOiAkKExJQl9PQkpTKQorCXJtIC1mIGxpYnNpbS5hCisJJChBUikgJChBUl9GTEFHUykgbGlic2ltLmEgJChMSUJfT0JKUykKKwkkKFJBTkxJQikgbGlic2ltLmEKKworcnVuOiAkKFNJTV9SVU5fT0JKUykgbGlic2ltLmEgJChMSUJERVBTKQorCSQoQ0MpICQoQUxMX0NGTEFHUykgLW8gcnVuJChFWEVFWFQpIFwKKwkgICQoU0lNX1JVTl9PQkpTKSBsaWJzaW0uYSAkKEVYVFJBX0xJQlMpCisKK3J1bi5vOiAkKHNyY2NvbSkvcnVuLmMgY29uZmlnLmggdGNvbmZpZy5oIFwKKwkgICQoc3Jjcm9vdCkvaW5jbHVkZS9yZW1vdGUtc2ltLmggJChzcmNyb290KS9pbmNsdWRlL2NhbGxiYWNrLmgKKwkkKENDKSAtYyAkKHNyY2NvbSkvcnVuLmMgJChBTExfQ0ZMQUdTKQorCisjIEZJWE1FOiBJZGVhbGx5LCBjYWxsYmFjay5vIGFuZCBmcmllbmRzIGxpdmUgaW4gYSBsaWJyYXJ5IG91dHNpZGUgb2YKKyMgYm90aCB0aGUgZ2RiIGFuZCBzaW11bGF0b3Igc291cmNlIHRyZWVzIChlLmcuIGRldm8vcmVtb3RlLiAgTm90CisjIGRldm8vbGlicmVtb3RlIGJlY2F1c2UgdGhpcyBkaXJlY3Rvcnkgd291bGQgY29udGFpbiBtb3JlIHRoYW4ganVzdAorIyBhIGxpYnJhcnkpLgorCitjYWxsYmFjay5vOiAkKHNyY2NvbSkvY2FsbGJhY2suYyBjb25maWcuaCB0Y29uZmlnLmggXAorCSAgJChzcmNyb290KS9pbmNsdWRlL2NhbGxiYWNrLmggdGFyZy12YWxzLmgKKwkkKENDKSAtYyAkKHNyY2NvbSkvY2FsbGJhY2suYyAkKEFMTF9DRkxBR1MpCisKK3N5c2NhbGwubzogJChzcmNjb20pL3N5c2NhbGwuYyBjb25maWcuaCB0Y29uZmlnLmggXAorCSAgJChzcmNyb290KS9pbmNsdWRlL2NhbGxiYWNrLmggdGFyZy12YWxzLmgKKwkkKENDKSAtYyAkKHNyY2NvbSkvc3lzY2FsbC5jICQoQUxMX0NGTEFHUykKKwordGFyZy1tYXAubzogdGFyZy1tYXAuYyB0YXJnLXZhbHMuaAorCitnZW50bWFwOiBNYWtlZmlsZSAkKHNyY2NvbSkvZ2VudG1hcC5jIHRhcmctdmFscy5kZWYKKwkkKENDX0ZPUl9CVUlMRCkgJChzcmNjb20pL2dlbnRtYXAuYyAtbyBnZW50bWFwICQoQlVJTERfQ0ZMQUdTKSAkKE5MX1RBUkdFVCkKKwordGFyZy12YWxzLmggdGFyZy1tYXAuYzogc3RhbXAtdHZhbHMKK3N0YW1wLXR2YWxzOiBnZW50bWFwCisJcm0gLWYgdG1wLXR2YWxzLmggdG1wLXRtYXAuYworCS4vZ2VudG1hcCAtaCA+dG1wLXR2YWxzLmgKKwkkKFNIRUxMKSAkKHNyY3Jvb3QpL21vdmUtaWYtY2hhbmdlIHRtcC10dmFscy5oIHRhcmctdmFscy5oCisJLi9nZW50bWFwIC1jID50bXAtdG1hcC5jCisJJChTSEVMTCkgJChzcmNyb290KS9tb3ZlLWlmLWNoYW5nZSB0bXAtdG1hcC5jIHRhcmctbWFwLmMKKwl0b3VjaCBzdGFtcC10dmFscworCisjCisjIFJ1bGVzIGZvciBidWlsZGluZyBzaW0tKiBjb21wb25lbnRzLiAgVHJpZ2dlcmVkIGJ5IGxpc3RpbmcgdGhlIGNvcnJlc3BvbmRpbmcKKyMgLm8gZmlsZSBpbiB0aGUgbGlzdCBvZiBzaW11bGF0b3IgdGFyZ2V0cy4KKyMKKworc2ltX21haW5faGVhZGVycyA9IFwKKwlzaW0tbWFpbi5oIFwKKwkkKHNyY2NvbSkvc2ltLWFzc2VydC5oIFwKKwkkKHNyY2NvbSkvc2ltLWJhc2UuaCBcCisJJChzcmNjb20pL3NpbS1iYXNpY3MuaCBcCisJJChzcmNjb20pL3NpbS1jb25maWcuaCBcCisJJChzcmNjb20pL3NpbS1jcHUuaCBcCisJJChzcmNjb20pL3NpbS1lbmdpbmUuaCBcCisJJChzcmNjb20pL3NpbS1ldmVudHMuaCBcCisJJChzcmNjb20pL3NpbS1pbmxpbmUuaCBcCisJJChzcmNjb20pL3NpbS1tZW1vcHQuaCBcCisJJChzcmNjb20pL3NpbS1tb2RlbC5oIFwKKwkkKHNyY2NvbSkvc2ltLW1vZHVsZS5oIFwKKwkkKHNyY2NvbSkvc2ltLXByb2ZpbGUuaCBcCisJJChzcmNjb20pL3NpbS1zaWduYWwuaCBcCisJJChzcmNjb20pL3NpbS10cmFjZS5oIFwKKwkkKHNyY2NvbSkvc2ltLXdhdGNoLmggXAorCXRjb25maWcuaCBcCisJJChTSU1fRVhUUkFfREVQUykKKworIyBFeHBvcnRlZCB2ZXJzaW9uIG9mIHNpbV9tYWluX2hlYWRlcnMuCitTSU1fTUFJTl9ERVBTID0gXAorCSQoc2ltX21haW5faGVhZGVycykKKworc2ltLWFzc2VydF9oID0gJChzcmNjb20pL3NpbS1hc3NlcnQuaAorc2ltLWVuZGlhbl9oID0gJChzcmNjb20pL3NpbS1lbmRpYW4uaAorc2ltLW4tZW5kaWFuX2ggPSAkKHNyY2NvbSkvc2ltLW4tZW5kaWFuLmgKK3NpbS1hcmFuZ2VfaCA9ICQoc3JjY29tKS9zaW0tYXJhbmdlLmgKK3NpbS1iaXRzX2ggPSAkKHNyY2NvbSkvc2ltLWJpdHMuaAorc2ltLWNvbmZpZ19oID0gJChzcmNjb20pL3NpbS1jb25maWcuaAorc2ltLW4tYml0c19oID0gJChzcmNjb20pL3NpbS1uLWJpdHMuaAorc2ltLWNvcmVfaCA9ICQoc3JjY29tKS9zaW0tY29yZS5oCitzaW0tbi1jb3JlX2ggPSAkKHNyY2NvbSkvc2ltLW4tY29yZS5oCitzaW0tZW5naW5lX2ggPSAkKHNyY2NvbSkvc2ltLWVuZ2luZS5oCitzaW0tZXZlbnRzX2ggPSAkKHNyY2NvbSkvc2ltLWV2ZW50cy5oCitzaW0tZnB1X2ggPSAkKHNyY2NvbSkvc2ltLWZwdS5oCitzaW0taW9faCA9ICQoc3JjY29tKS9zaW0taW8uaAorc2ltLW9wdGlvbnNfaCA9ICQoc3JjY29tKS9zaW0tb3B0aW9ucy5oCitzaW0tYnJlYWtfaCA9ICQoc3JjY29tKS9zaW0tYnJlYWsuaAorc2ltLXNpZ25hbF9oID0gJChzcmNjb20pL3NpbS1zaWduYWwuaAorCitody1hbGxvY19oID0gJChzcmNjb20pL2h3LWFsbG9jLmgKK2h3LWJhc2VfaCA9ICQoc3JjY29tKS9ody1iYXNlLmgKK2h3LWRldmljZV9oID0gJChzcmNjb20pL2h3LWRldmljZS5oCitody1ldmVudHNfaCA9ICQoc3JjY29tKS9ody1ldmVudHMuaAoraHctaGFuZGxlc19oID0gJChzcmNjb20pL2h3LWhhbmRsZXMuaAoraHctaW5zdGFuY2VzX2ggPSAkKHNyY2NvbSkvaHctaW5zdGFuY2VzLmgKK2h3LXBvcnRzX2ggPSAkKHNyY2NvbSkvaHctcG9ydHMuaAoraHctcHJvcGVydGllc19oID0gJChzcmNjb20pL2h3LXByb3BlcnRpZXMuaAoraHctdHJlZV9oID0gJChzcmNjb20pL2h3LXRyZWUuaAorCitod19tYWluX2hlYWRlcnMgPSBcCisJJChzcmNjb20pL2h3LW1haW4uaCBcCisJJChody1hbGxvY19oKSBcCisJJChody1iYXNlX2gpIFwKKwkkKGh3LWRldmljZV9oKSBcCisJJChody1ldmVudHNfaCkgXAorCSQoaHctaW5zdGFuY2VzX2gpIFwKKwkkKGh3LWhhbmRsZXNfaCkgXAorCSQoaHctcG9ydHNfaCkgXAorCSQoaHctcHJvcGVydGllc19oKSBcCisKKyMgRklYTUU6IElmIHRoaXMgY29tcGxpY2F0ZWQgd2F5IG9mIGJ1aWxkaW5nIC5vIGZpbGVzIGZyb20gLi4vY29tbW9uIGlzCisjIG5lY2Vzc2FyeSwgdGhlIHJlYXNvbiBzaG91bGQgYmUgZG9jdW1lbnRlZCBoZXJlLgorCitCVUlMVF9TUkNfRlJPTV9DT01NT049IFwKKwlzaW0taW5saW5lLmMKKworc2ltLWFib3J0Lm86ICQoc3JjY29tKS9zaW0tYWJvcnQuYyBcCisJICAkKFNJTV9FWFRSQV9ERVBTKQorCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0tYWJvcnQuYyAkKEFMTF9DRkxBR1MpCisKK3NpbS1hcmFuZ2UubzogJChzcmNjb20pL3NpbS1hcmFuZ2UuYyAkKHNpbS1hcmFuZ2VfaCkgJChTSU1fRVhUUkFfREVQUykKKwkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLWFyYW5nZS5jICQoQUxMX0NGTEFHUykKKworc2ltLWJpdHMubzogJChzcmNjb20pL3NpbS1iaXRzLmMgJChzaW0tYml0c19oKSAkKHNpbS1uLWJpdHNfaCkgXAorCSAgJChTSU1fRVhUUkFfREVQUykKKwkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLWJpdHMuYyAkKEFMTF9DRkxBR1MpCisKK3NpbS1jb25maWcubzogJChzcmNjb20pL3NpbS1jb25maWcuYyAkKHNpbS1jb25maWdfaCkgXAorCSAgJChTSU1fRVhUUkFfREVQUykKKwkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLWNvbmZpZy5jICQoQUxMX0NGTEFHUykKKworc2ltLWNvcmUubzogJChzcmNjb20pL3NpbS1jb3JlLmMgJChzaW1fbWFpbl9oZWFkZXJzKSBcCisJICAkKHNpbS1jb3JlX2gpICQoc2ltLW4tY29yZV9oKQorCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0tY29yZS5jICQoQUxMX0NGTEFHUykKKworc2ltLWNwdS5vOiAkKHNyY2NvbSkvc2ltLWNwdS5jICQoc2ltX21haW5faGVhZGVycykKKwkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLWNwdS5jICQoQUxMX0NGTEFHUykKKworc2ltLWVuZGlhbi5vOiAkKHNyY2NvbSkvc2ltLWVuZGlhbi5jICQoc2ltLWVuZGlhbl9oKSAkKHNpbS1uLWVuZGlhbl9oKQorCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0tZW5kaWFuLmMgJChBTExfQ0ZMQUdTKQorCitzaW0tZW5naW5lLm86ICQoc3JjY29tKS9zaW0tZW5naW5lLmMgJChzaW1fbWFpbl9oZWFkZXJzKSAkKHNpbS1lbmdpbmVfaCkKKwkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLWVuZ2luZS5jICQoQUxMX0NGTEFHUykKKworc2ltLWV2ZW50cy5vOiAkKHNyY2NvbSkvc2ltLWV2ZW50cy5jICQoc2ltLWV2ZW50c19oKSBcCisJICAkKFNJTV9FWFRSQV9ERVBTKQorCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0tZXZlbnRzLmMgJChBTExfQ0ZMQUdTKQorCitzaW0tZnB1Lm86ICQoc3JjY29tKS9zaW0tZnB1LmMgJChzaW0tZnB1X2gpIFwKKwkgICQoU0lNX0VYVFJBX0RFUFMpCisJJChDQykgLWMgJChzcmNjb20pL3NpbS1mcHUuYyAkKEFMTF9DRkxBR1MpCisKKworc2ltLWhsb2FkLm86ICQoc3JjY29tKS9zaW0taGxvYWQuYyAkKHNpbS1hc3NlcnRfaCkgXAorCSAgJChzcmNyb290KS9pbmNsdWRlL3JlbW90ZS1zaW0uaCBcCisJICAkKFNJTV9FWFRSQV9ERVBTKQorCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0taGxvYWQuYyAkKEFMTF9DRkxBR1MpCisKK3NpbS1ocncubzogJChzcmNjb20pL3NpbS1ocncuYyAkKHNpbS1hc3NlcnRfaCkgJChzaW1fY29yZV9oKSBcCisJICAkKHNyY3Jvb3QpL2luY2x1ZGUvcmVtb3RlLXNpbS5oIFwKKwkgICQoU0lNX0VYVFJBX0RFUFMpCisJJChDQykgLWMgJChzcmNjb20pL3NpbS1ocncuYyAkKEFMTF9DRkxBR1MpCisKK3NpbS1ody5vOiAkKHNyY2NvbSkvc2ltLWh3LmMgJChzaW1fbWFpbl9oZWFkZXJzKQorCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0taHcuYyAkKEFMTF9DRkxBR1MpCisKK3NpbS1pbmZvLm86ICQoc3JjY29tKS9zaW0taW5mby5jICQoc2ltLWFzc2VydF9oKSBcCisJICAkKHNyY3Jvb3QpL2luY2x1ZGUvcmVtb3RlLXNpbS5oIFwKKwkgICQoU0lNX0VYVFJBX0RFUFMpCisJJChDQykgLWMgJChzcmNjb20pL3NpbS1pbmZvLmMgJChBTExfQ0ZMQUdTKQorCitzaW0taW5saW5lLmM6ICQoc3JjY29tKS9zaW0taW5saW5lLmMKKwlybSAtZiAkQCB0bXAtJEAKKwllY2hvICIjIDEgXCIkKHNyY2NvbSkvJEBcIiIgPiB0bXAtJEAKKwljYXQgJChzcmNjb20pLyRAID4+IHRtcC0kQAorCSQoU0hFTEwpICQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtJEAgJEAKKworc2ltLWlvLm86ICQoc3JjY29tKS9zaW0taW8uYyAkKHNpbV9tYWluX2hlYWRlcnMpICQoc2ltLWlvX2gpIFwKKwkgICQoc3Jjcm9vdCkvaW5jbHVkZS9yZW1vdGUtc2ltLmgKKwkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLWlvLmMgJChBTExfQ0ZMQUdTKQorCitzaW0tbWVtb3B0Lm86ICQoc3JjY29tKS9zaW0tbWVtb3B0LmMgJChzaW1fbWFpbl9oZWFkZXJzKSBcCisJICAkKHNpbS1pb19oKQorCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0tbWVtb3B0LmMgJChBTExfQ0ZMQUdTKQorCitzaW0tbW9kdWxlLm86ICQoc3JjY29tKS9zaW0tbW9kdWxlLmMgJChzaW1fbWFpbl9oZWFkZXJzKSBcCisJICAkKHNpbS1pb19oKQorCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0tbW9kdWxlLmMgJChBTExfQ0ZMQUdTKQorCitzaW0tb3B0aW9ucy5vOiAkKHNyY2NvbSkvc2ltLW9wdGlvbnMuYyAkKHNpbV9tYWluX2hlYWRlcnMpIFwKKwkgICQoc2ltLW9wdGlvbnNfaCkgJChzaW0taW9faCkKKwkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLW9wdGlvbnMuYyAkKEFMTF9DRkxBR1MpCisKK3NpbS1yZWFzb24ubzogJChzcmNjb20pL3NpbS1yZWFzb24uYyAkKHNpbV9tYWluX2hlYWRlcnMpIFwKKwkgICQoc3Jjcm9vdCkvaW5jbHVkZS9yZW1vdGUtc2ltLmgKKwkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLXJlYXNvbi5jICQoQUxMX0NGTEFHUykKKworc2ltLXJlZy5vOiAkKHNyY2NvbSkvc2ltLXJlZy5jICQoc2ltX21haW5faGVhZGVycykgXAorCSAgJChzcmNyb290KS9pbmNsdWRlL3JlbW90ZS1zaW0uaAorCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0tcmVnLmMgJChBTExfQ0ZMQUdTKQorCitzaW0tcmVzdW1lLm86ICQoc3JjY29tKS9zaW0tcmVzdW1lLmMgJChzaW1fbWFpbl9oZWFkZXJzKSBcCisJICAkKHNyY3Jvb3QpL2luY2x1ZGUvcmVtb3RlLXNpbS5oCisJJChDQykgLWMgJChzcmNjb20pL3NpbS1yZXN1bWUuYyAkKEFMTF9DRkxBR1MpCisKK3NpbS1ydW4ubzogJChzcmNjb20pL3NpbS1ydW4uYyAkKHNpbV9tYWluX2hlYWRlcnMpCisJJChDQykgLWMgJChzcmNjb20pL3NpbS1ydW4uYyAkKEFMTF9DRkxBR1MpCisKK3NpbS1zaWduYWwubzogJChzcmNjb20pL3NpbS1zaWduYWwuYyAkKHNpbV9tYWluX2hlYWRlcnMpICQoc2ltLXNpZ25hbF9oKQorCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0tc2lnbmFsLmMgJChBTExfQ0ZMQUdTKQorCitzaW0tc3RvcC5vOiAkKHNyY2NvbSkvc2ltLXN0b3AuYyAkKHNpbV9tYWluX2hlYWRlcnMpCisJJChDQykgLWMgJChzcmNjb20pL3NpbS1zdG9wLmMgJChBTExfQ0ZMQUdTKQorCitzaW0tdHJhY2UubzogJChzcmNjb20pL3NpbS10cmFjZS5jICQoc2ltX21haW5faGVhZGVycykgXAorCSAgJChzaW0tb3B0aW9uc19oKSAkKHNpbS1pb19oKQorCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0tdHJhY2UuYyAkKEFMTF9DRkxBR1MpCisKK3NpbS1wcm9maWxlLm86ICQoc3JjY29tKS9zaW0tcHJvZmlsZS5jICQoc2ltX21haW5faGVhZGVycykgXAorCSAgJChzaW0tb3B0aW9uc19oKSAkKHNpbS1pb19oKQorCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0tcHJvZmlsZS5jICQoQUxMX0NGTEFHUykKKworc2ltLW1vZGVsLm86ICQoc3JjY29tKS9zaW0tbW9kZWwuYyAkKHNpbV9tYWluX2hlYWRlcnMpIFwKKwkgICQoc2ltLWlvX2gpCisJJChDQykgLWMgJChzcmNjb20pL3NpbS1tb2RlbC5jICQoQUxMX0NGTEFHUykKKworc2ltLXV0aWxzLm86ICQoc3JjY29tKS9zaW0tdXRpbHMuYyAkKHNpbV9tYWluX2hlYWRlcnMpCisJJChDQykgLWMgJChzcmNjb20pL3NpbS11dGlscy5jICQoQUxMX0NGTEFHUykKKworc2ltLXdhdGNoLm86ICQoc3JjY29tKS9zaW0td2F0Y2guYyAkKHNpbV9tYWluX2hlYWRlcnMpCisJJChDQykgLWMgJChzcmNjb20pL3NpbS13YXRjaC5jICQoQUxMX0NGTEFHUykKKworc2ltLWxvYWQubzogJChzcmNjb20pL3NpbS1sb2FkLmMgJChzcmNyb290KS9pbmNsdWRlL2NhbGxiYWNrLmgKKwkkKENDKSAtYyAkKHNyY2NvbSkvc2ltLWxvYWQuYyAkKEFMTF9DRkxBR1MpCisKK3NpbS1icmVhay5vOiAkKHNyY2NvbSkvc2ltLWJyZWFrLmMgJChzaW1fbWFpbl9oZWFkZXJzKSBcCisJICAkKHNpbV9icmVha19oKQorCSQoQ0MpIC1jICQoc3JjY29tKS9zaW0tYnJlYWsuYyAkKEFMTF9DRkxBR1MpCisKKworIyBGSVhNRSBUaGlzIGlzIG9uZSB2ZXJ5IHNpbXBsZS1taW5kZWQgd2F5IG9mIGdlbmVyYXRpbmcgdGhlIGZpbGUgaHctY29uZmlnLmgKK2h3LWNvbmZpZy5oOiBNYWtlZmlsZS5pbiAkKHNyY2NvbSkvTWFrZS1jb21tb24uaW4gY29uZmlnLnN0YXR1cyBNYWtlZmlsZQorCXJtIC1mIHRtcC1ody5oCisJZWNobyAiLyogZ2VuZXJhdGVkIGJ5IE1ha2VmaWxlICovIiA+IHRtcC1ody5oCisJZm9yIGh3IGluICQoU0lNX0hXKSA7IGRvIFwKKwkgIGVjaG8gImV4dGVybiBjb25zdCBzdHJ1Y3QgaHdfZGVzY3JpcHRvciBkdl8kJHtod31fZGVzY3JpcHRvcltdOyIgOyBcCisJZG9uZSA+PiB0bXAtaHcuaAorCWVjaG8gImNvbnN0IHN0cnVjdCBod19kZXNjcmlwdG9yICpod19kZXNjcmlwdG9yc1tdID0geyIgPj4gdG1wLWh3LmgKKwlmb3IgaHcgaW4gJChTSU1fSFcpIDsgZG8gXAorCSAgZWNobyAiICBkdl8kJHtod31fZGVzY3JpcHRvciwiIDsgXAorCWRvbmUgPj4gdG1wLWh3LmgKKwllY2hvICIgIE5VTEwsIiA+PiB0bXAtaHcuaAorCWVjaG8gIn07IiA+PiB0bXAtaHcuaAorCW12IHRtcC1ody5oIGh3LWNvbmZpZy5oCisKK2h3LWFsbG9jLm86ICQoc3JjY29tKS9ody1hbGxvYy5jICQoaHdfbWFpbl9oZWFkZXJzKQorCSQoQ0MpIC1jICQoc3JjY29tKS9ody1hbGxvYy5jICQoQUxMX0NGTEFHUykKKworaHctYmFzZS5vOiAkKHNyY2NvbSkvaHctYmFzZS5jICQoaHdfbWFpbl9oZWFkZXJzKSBody1jb25maWcuaAorCSQoQ0MpIC1jICQoc3JjY29tKS9ody1iYXNlLmMgJChBTExfQ0ZMQUdTKQorCitody1kZXZpY2UubzogJChzcmNjb20pL2h3LWRldmljZS5jICQoaHdfbWFpbl9oZWFkZXJzKQorCSQoQ0MpIC1jICQoc3JjY29tKS9ody1kZXZpY2UuYyAkKEFMTF9DRkxBR1MpCisKK2h3LWV2ZW50cy5vOiAkKHNyY2NvbSkvaHctZXZlbnRzLmMgJChod19tYWluX2hlYWRlcnMpICQoc2ltX21haW5faGVhZGVycykKKwkkKENDKSAtYyAkKHNyY2NvbSkvaHctZXZlbnRzLmMgJChBTExfQ0ZMQUdTKQorCit0ZXN0LWh3LWV2ZW50czogJChzcmNjb20pL2h3LWV2ZW50cy5jIGxpYnNpbS5hCisJJChDQykgJChBTExfQ0ZMQUdTKSAtRE1BSU4gLW8gdGVzdC1ody1ldmVudHMkKEVYRUVYVCkgXAorCQkkKHNyY2NvbSkvaHctZXZlbnRzLmMgbGlic2ltLmEgJChFWFRSQV9MSUJTKQorCitody1pbnN0YW5jZXMubzogJChzcmNjb20pL2h3LWluc3RhbmNlcy5jICQoaHdfbWFpbl9oZWFkZXJzKQorCSQoQ0MpIC1jICQoc3JjY29tKS9ody1pbnN0YW5jZXMuYyAkKEFMTF9DRkxBR1MpCisKK2h3LWhhbmRsZXMubzogJChzcmNjb20pL2h3LWhhbmRsZXMuYyAkKGh3X21haW5faGVhZGVycykKKwkkKENDKSAtYyAkKHNyY2NvbSkvaHctaGFuZGxlcy5jICQoQUxMX0NGTEFHUykKKworaHctcG9ydHMubzogJChzcmNjb20pL2h3LXBvcnRzLmMgJChod19tYWluX2hlYWRlcnMpCisJJChDQykgLWMgJChzcmNjb20pL2h3LXBvcnRzLmMgJChBTExfQ0ZMQUdTKQorCitody1wcm9wZXJ0aWVzLm86ICQoc3JjY29tKS9ody1wcm9wZXJ0aWVzLmMgJChod19tYWluX2hlYWRlcnMpCisJJChDQykgLWMgJChzcmNjb20pL2h3LXByb3BlcnRpZXMuYyAkKEFMTF9DRkxBR1MpCisKK2h3LXRyZWUubzogJChzcmNjb20pL2h3LXRyZWUuYyAkKGh3X21haW5faGVhZGVycykgJChody10cmVlX2gpCisJJChDQykgLWMgJChzcmNjb20pL2h3LXRyZWUuYyAkKEFMTF9DRkxBR1MpCisKKyMgRGV2aWNlcy4KKworZHYtY29yZS5vOiAkKHNyY2NvbSkvZHYtY29yZS5jICQoaHdfbWFpbl9oZWFkZXJzKSAkKHNpbV9tYWluX2hlYWRlcnMpCisJJChDQykgLWMgJChzcmNjb20pL2R2LWNvcmUuYyAkKEFMTF9DRkxBR1MpCisKK2R2LWdsdWUubzogJChzcmNjb20pL2R2LWdsdWUuYyAkKGh3X21haW5faGVhZGVycykgJChzaW1fbWFpbl9oZWFkZXJzKQorCSQoQ0MpIC1jICQoc3JjY29tKS9kdi1nbHVlLmMgJChBTExfQ0ZMQUdTKQorCitkdi1wYWwubzogJChzcmNjb20pL2R2LXBhbC5jICQoaHdfbWFpbl9oZWFkZXJzKSAkKHNpbV9tYWluX2hlYWRlcnMpCisJJChDQykgLWMgJChzcmNjb20pL2R2LXBhbC5jICQoQUxMX0NGTEFHUykKKworZHYtc29ja3Nlci5vOiAkKHNyY2NvbSkvZHYtc29ja3Nlci5oICQoc2ltX21haW5faGVhZGVycykKKwkkKENDKSAtYyAkKHNyY2NvbSkvZHYtc29ja3Nlci5jICQoQUxMX0NGTEFHUykKKworCitucnVuLm86ICQoc3JjY29tKS9ucnVuLmMgY29uZmlnLmggdGNvbmZpZy5oIFwKKwkgICQoc3Jjcm9vdCkvaW5jbHVkZS9yZW1vdGUtc2ltLmggJChzcmNyb290KS9pbmNsdWRlL2NhbGxiYWNrLmggXAorCSAgJChzaW1fbWFpbl9oZWFkZXJzKQorCSQoQ0MpIC1jICQoc3JjY29tKS9ucnVuLmMgJChBTExfQ0ZMQUdTKQorCisjIENHRU4gc3VwcG9ydC4KKworIyBGb3IgdXNlIGluIE1ha2VmaWxlLmluIGZvciBjcHUtc3BlY2lmaWMgZmlsZXMuCitDR0VOX01BSU5fQ1BVX0RFUFMgPSBcCisJJChTSU1fTUFJTl9ERVBTKSBcCisJJChDR0VOX0lOQ0xVREVfREVQUykgXAorCSQoc3JjY29tKS9jZ2VuLW9wcy5oIFwKKwkkKHNyY2NvbSkvY2dlbi1tZW0uaAorCitjZ2VuLXJ1bi5vOiAkKHNyY2NvbSkvY2dlbi1ydW4uYyAkKHNpbV9tYWluX2hlYWRlcnMpCisJJChDQykgLWMgJChzcmNjb20pL2NnZW4tcnVuLmMgJChBTExfQ0ZMQUdTKQorCitjZ2VuLXNjYWNoZS5vOiAkKHNyY2NvbSkvY2dlbi1zY2FjaGUuYyAkKHNpbV9tYWluX2hlYWRlcnMpCisJJChDQykgLWMgJChzcmNjb20pL2NnZW4tc2NhY2hlLmMgJChBTExfQ0ZMQUdTKQorCitjZ2VuLXRyYWNlLm86ICQoc3JjY29tKS9jZ2VuLXRyYWNlLmMgJChzaW1fbWFpbl9oZWFkZXJzKQorCSQoQ0MpIC1jICQoc3JjY29tKS9jZ2VuLXRyYWNlLmMgJChBTExfQ0ZMQUdTKQorCitjZ2VuLXV0aWxzLm86ICQoc3JjY29tKS9jZ2VuLXV0aWxzLmMgJChzaW1fbWFpbl9oZWFkZXJzKSBcCisJICAkKHNyY2NvbSkvY2dlbi1tZW0uaCAkKHNyY2NvbSkvY2dlbi1vcHMuaCAkKHNyY2NvbSkvY2dlbi1lbmdpbmUuaAorCSQoQ0MpIC1jICQoc3JjY29tKS9jZ2VuLXV0aWxzLmMgJChBTExfQ0ZMQUdTKQorCisjIFN1cHBvcnQgdGFyZ2V0cy4KKworaW5zdGFsbDogaW5zdGFsbC1jb21tb24gJChTSU1fRVhUUkFfSU5TVEFMTCkKKworaW5zdGFsbC1jb21tb246IGluc3RhbGxkaXJzCisJbj1gZWNobyBydW4gfCBzZWQgJyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknYDsgXAorCSQoSU5TVEFMTF9QUk9HUkFNKSBydW4kKEVYRUVYVCkgJChiaW5kaXIpLyQkbiQoRVhFRVhUKQorCW49YGVjaG8gbGlic2ltLmEgfCBzZWQgcy9saWJzaW0uYS9saWIkKHRhcmdldF9hbGlhcyktc2ltLmEvYDsgXAorCSQoSU5TVEFMTF9EQVRBKSBsaWJzaW0uYSAkKGxpYmRpcikvJCRuIDsgXAorCSggY2QgJChsaWJkaXIpIDsgJChSQU5MSUIpICQkbiApCisKK2luc3RhbGxkaXJzOgorCSQoU0hFTEwpICQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzICQoYmluZGlyKQorCitjaGVjazoKKwljZCAuLi90ZXN0c3VpdGUgJiYgJChNQUtFKSBjaGVjayBSVU5URVNURkxBR1M9IiQoUlVOVEVTVEZMQUdTKSIKKworaW5mbzoKK2NsZWFuLWluZm86CitpbnN0YWxsLWluZm86CisKKy5OT0VYUE9SVDoKK01BS0VPVkVSUklERVM9CisKK3RhZ3MgZXRhZ3M6IFRBR1MKKworIyBNYWNyb3MgbGlrZSBFWFRFUk5fU0lNX0NPUkUgY29uZnVzZSB0YWdzLgorIyBBbmQgdGhlIHNpbS1uLWZvby5oIGZpbGVzIGNyZWF0ZSBmdW5jdGlvbnMgdGhhdCBjYW4ndCBiZSBmb3VuZCBlaXRoZXIuCitUQUdTOiBmb3JjZQorCWNkICQoc3JjZGlyKSAmJiBcCisJZXRhZ3MgLS1yZWdleCAnL15cKFthLXpfXStcKSAoL1wxLycgLS1yZWdleCAnL15cL1sqXSBUQUdTOiAuKi8nIFwKKwkJKi5bY2hdIC4uL2NvbW1vbi8qLltjaF0KKworY2xlYW46ICQoU0lNX0VYVFJBX0NMRUFOKQorCXJtIC1mICouW29hXSAqfiBjb3JlCisJcm0gLWYgcnVuIGxpYnNpbS5hCisJcm0gLWYgZ2VudG1hcCB0YXJnLW1hcC5jIHRhcmctdmFscy5oIHN0YW1wLXR2YWxzCisJaWYgWyAhIC1mIE1ha2UtY29tbW9uLmluIF0gOyB0aGVuIFwKKwkJcm0gLWYgJChCVUlMVF9TUkNfRlJPTV9DT01NT04pIDsgXAorCWZpCisJcm0gLWYgdG1wLW1sb29wLmhpbiB0bXAtbWxvb3AuaCB0bXAtbWxvb3AuY2luIHRtcC1tbG9vcC5jCisKK2Rpc3RjbGVhbiBtb3N0bHljbGVhbiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogY2xlYW4KKwlybSAtZiBUQUdTCisJcm0gLWYgTWFrZWZpbGUgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgY29uZmlnLnN0YXR1cyAuZ2RiaW5pdAorCXJtIC1mIHRjb25maWcuaCBjb25maWcuaCBzdGFtcC1oCisJcm0gLWYgdGFyZy12YWxzLmRlZgorCisuYy5vOgorCSQoQ0MpIC1jICQoQUxMX0NGTEFHUykgJDwKKworIyBEdW1teSB0YXJnZXQgdG8gZm9yY2UgZXhlY3V0aW9uIG9mIGRlcGVuZGVudCB0YXJnZXRzLgorZm9yY2U6CisKK01ha2VmaWxlOiBNYWtlZmlsZS5pbiAkKHNyY2NvbSkvTWFrZS1jb21tb24uaW4gY29uZmlnLnN0YXR1cworCUNPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworY29uZmlnLnN0YXR1czogY29uZmlndXJlCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjaworCitjb25maWcuaDogc3RhbXAtaCA7IEB0cnVlCitzdGFtcC1oOiBjb25maWcuaW4gY29uZmlnLnN0YXR1cworCUNPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCisuZ2RiaW5pdDogIyBjb25maWcuc3RhdHVzICQoc3JjY29tKS9nZGJpbml0LmluCisJQ09ORklHX0ZJTEVTPSRAOi4uL2NvbW1vbi9nZGJpbml0LmluIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworCisjIyBFbmQgQ09NTU9OX1BPU1RfQ09ORklHX0ZSQUcKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vTWFrZWZpbGUuaW4gYi9zaW0vY29tbW9uL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkN2M1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTM5IEBACisjICAgIE1ha2VmaWxlIHRlbXBsYXRlIGZvciBDb25maWd1cmUgZm9yIHNpbXVsYXRvciBjb21tb24gZGlyZWN0b3J5CisjICAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworZGVmYXVsdDogYWxsCisKK1ZQQVRIID0gQHNyY2RpckAKK3NyY2RpciA9IEBzcmNkaXJACitzcmNyb290ID0gJChzcmNkaXIpLy4uLy4uCisKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKKworaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK2JpbmRpciA9IEBiaW5kaXJACisKK2xpYmRpciA9IEBsaWJkaXJACit0b29sZGlyID0gJChsaWJkaXIpLyQodGFyZ2V0X2FsaWFzKQorCitkYXRhZGlyID0gQGRhdGFkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCitpbmZvZGlyID0gQGluZm9kaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACisKK1NIRUxMID0gL2Jpbi9zaAorCitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKKworQ0MgPSBAQ0NACitDQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAorQ0ZMQUdTID0gQENGTEFHU0AKK1NJTV9DRkxBR1MgPSBAc2ltX2NmbGFnc0AKKworIyBUaGVzZSBhcmUgdXNlZCB0byByZWJ1aWxkIG5sdHZhbHMuZGVmLgorQ1BQX0ZPUl9UQVJHRVQgPSBAQ1BQX0ZPUl9UQVJHRVRACitUQVJHRVRfU1VCRElSID0gQFRBUkdFVF9TVUJESVJACisKK0hERUZJTkVTID0gQEhERUZJTkVTQAorVERFRklORVMgPQorCitDT05GSUdfQ0ZMQUdTID0gQERFRlNAICQoU0lNX0NGTEFHUykgJChIREVGSU5FUykgJChUREVGSU5FUykKK0NTRUFSQ0ggPSAtSS4gLUkkKHNyY2RpcikgLUkkKHNyY3Jvb3QpL2luY2x1ZGUKK0FMTF9DRkxBR1MgPSAkKENGTEFHUykgJChDT05GSUdfQ0ZMQUdTKSAkKENTRUFSQ0gpCitCVUlMRF9DRkxBR1MgPSAtZyAtTyAkKENTRUFSQ0gpCisKK0FSID0gQEFSQAorQVJfRkxBR1MgPSByYworUkFOTElCID0gQFJBTkxJQkAKK01BS0VJTkZPID0gbWFrZWluZm8KKworLk5PRVhQT1JUOgorTUFLRU9WRVJSSURFUz0KKworYWxsOgorCisjIEdlbmVyYXRlIFRBUkdfVkFMU19IIGZvciBuZXdsaWIvbGliZ2xvc3MgdXNpbmcgZGV2byBhbmQgYnVpbGQgdHJlZS4KKyMgVGhpcyBmaWxlIGlzIHNoaXBwZWQgd2l0aCBkaXN0cmlidXRpb25zIHNvIHdlIGJ1aWxkIGluIHRoZSBzb3VyY2UgZGlyLgorIyBUaGlzIGlzIGJ1aWx0IGluIHNyY2RpciBzbyBwdXR0aW5nIGRlcGVuZGVuY2llcyBoZXJlIGlzIHJpc2t5LgorIyBVc2UgYG1ha2UgaGVhZGVycycgdG8gcmVidWlsZC4KK2hlYWRlcnM6IG5sdHZhbHMuZGVmCisuUEhPTlk6IGhlYWRlcnMKKworIyBOb3RlOiBJZiBnZGIgcmVsZWFzZXMgYmVnaW4gdG8gY29udGFpbiB0YXJnZXQgaGVhZGVyIGZpbGVzLCBnZW5lcmF0ZQorIyB0YXJnLXZhbHMuZGVmIGF0IGJ1aWxkIHRpbWUuCisKK25sdHZhbHMuZGVmOiBNYWtlZmlsZSBnZW5ubHR2YWxzLnNoIGdlbnR2YWxzLnNoCisJcm9vdG1lPWBwd2RgIDsgXAorCWNkICQoc3JjZGlyKSA7IFwKKwlybSAtZiBubHR2YWxzLm5ldyA7IFwKKwkkKFNIRUxMKSAkKHNyY2RpcikvZ2Vubmx0dmFscy5zaCAkKFNIRUxMKSAkKHNyY3Jvb3QpICIkKENQUF9GT1JfVEFSR0VUKSIgPiBubHR2YWxzLm5ldyA7IFwKKwkkKFNIRUxMKSAkKHNyY3Jvb3QpL21vdmUtaWYtY2hhbmdlIG5sdHZhbHMubmV3IG5sdHZhbHMuZGVmCisKKy5jLm86CisJJChDQykgLWMgJDwgJChBTExfQ0ZMQUdTKQorCitjaGVjazoKKworaW5mbzoKK2NsZWFuLWluZm86CitpbnN0YWxsLWluZm86CisKK3RhZ3MgZXRhZ3M6IFRBR1MKKworIyBNYWNyb3MgbGlrZSBFWFRFUk5fU0lNX0NPUkUgY29uZnVzZSB0YWdzLgorIyBBbmQgdGhlIHNpbS1uLWZvby5oIGZpbGVzIGNyZWF0ZSBmdW5jdGlvbnMgdGhhdCBjYW4ndCBiZSBmb3VuZCBlaXRoZXIuCitUQUdTOiBmb3JjZQorCWNkICQoc3JjZGlyKSAmJiBcCisJZXRhZ3MgLS1yZWdleCAnL15cKFthLXpfXStcKSAoL1wxLycgLS1yZWdleCAnL15cL1sqXSBUQUdTOiAuKi8nIFwKKwkJKi5bY2hdCisKK2NsZWFuOgorCXJtIC1mICouW29hXSAqfiBjb3JlCisJcm0gLWYgJChBTEwpCisKK2Rpc3RjbGVhbiBtb3N0bHljbGVhbiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogY2xlYW4KKwlybSAtZiBUQUdTCisJcm0gLWYgTWFrZWZpbGUgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgY29uZmlnLnN0YXR1cworCXJtIC1mIGNvbmZpZy5oIHN0YW1wLWgKKworIyBEdW1teSB0YXJnZXQgdG8gZm9yY2UgZXhlY3V0aW9uIG9mIGRlcGVuZGVudCB0YXJnZXRzLgorZm9yY2U6CisKKyMgQ29weSB0aGUgZmlsZXMgaW50byBkaXJlY3RvcmllcyB3aGVyZSB0aGV5IHdpbGwgYmUgcnVuLgoraW5zdGFsbDoKKworaW5zdGFsbC1tYW46IGluc3RhbGxkaXJzCisJbj1gZWNobyBydW4gfCBzZWQgJyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknYDsgXAorCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvcnVuLjEgJChtYW4xZGlyKS8kJG4uMQorCitpbnN0YWxsZGlyczoKKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyAkKG1hbjFkaXIpCisKK01ha2VmaWxlOiBNYWtlZmlsZS5pbiBjb25maWcuc3RhdHVzCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKK2NvbmZpZy5zdGF0dXM6IGNvbmZpZ3VyZQorCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKKworY29uZmlnLmg6IHN0YW1wLWggOyBAdHJ1ZQorc3RhbXAtaDogY29uZmlnLmluIGNvbmZpZy5zdGF0dXMKKwlDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vYWNjb25maWcuaCBiL3NpbS9jb21tb24vYWNjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWI4N2ExCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9hY2NvbmZpZy5oCkBAIC0wLDAgKzEsMTUgQEAKKworLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCisjdW5kZWYgRU5BQkxFX05MUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCisjdW5kZWYgSEFWRV9DQVRHRVRTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0dFVFRFWFQKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCisjdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9hY2xvY2FsLm00IGIvc2ltL2NvbW1vbi9hY2xvY2FsLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYjU5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL2FjbG9jYWwubTQKQEAgLTAsMCArMSwxMjU5IEBACisjIFRoaXMgZmlsZSBjb250YWlucyBjb21tb24gY29kZSB1c2VkIGJ5IGFsbCBzaW11bGF0b3JzLgorIworIyBTSU1fQUNfQ09NTU9OIGludm9rZXMgQUMgbWFjcm9zIHVzZWQgYnkgYWxsIHNpbXVsYXRvcnMgYW5kIGJ5IHRoZSBjb21tb24KKyMgZGlyZWN0b3J5LiAgSXQgaXMgaW50ZW5kZWQgdG8gYmUgaW52b2tlZCBiZWZvcmUgYW55IHRhcmdldCBzcGVjaWZpYyBzdHVmZi4KKyMgU0lNX0FDX09VVFBVVCBpcyBhIGNvdmVyIGZ1bmN0aW9uIHRvIEFDX09VVFBVVCB0byBnZW5lcmF0ZSB0aGUgTWFrZWZpbGUuCisjIEl0IGlzIGludGVuZGVkIHRvIGJlIGludm9rZWQgbGFzdC4KKyMKKyMgVGhlIHNpbXVsYXRvcidzIGNvbmZpZ3VyZS5pbiBzaG91bGQgbG9vayBsaWtlOgorIworIyBkbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KKyMgc2luY2x1ZGUoLi4vY29tbW9uL2FjbG9jYWwubTQpCisjIEFDX1BSRVJFUSgyLjUpZG5sCisjIEFDX0lOSVQoTWFrZWZpbGUuaW4pCisjCisjIFNJTV9BQ19DT01NT04KKyMKKyMgLi4uIHRhcmdldCBzcGVjaWZpYyBzdHVmZiAuLi4KKyMKKyMgU0lNX0FDX09VVFBVVAorCitBQ19ERUZVTihTSU1fQUNfQ09NTU9OLAorWworIyBhdXRvY29uZi5pbmZvIHNheXMgdGhpcyBzaG91bGQgYmUgY2FsbGVkIHJpZ2h0IGFmdGVyIEFDX0lOSVQuCitBQ19DT05GSUdfSEVBREVSKGlmZWxzZShbJDFdLCxjb25maWcuaCxbJDFdKTpjb25maWcuaW4pCisKK0FDX0NPTkZJR19BVVhfRElSKGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4pCitBQ19DQU5PTklDQUxfU1lTVEVNCitBQ19BUkdfUFJPR1JBTQorQUNfUFJPR19DQworQUNfUFJPR19JTlNUQUxMCisKKyMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KK2lmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisgIENDX0ZPUl9CVUlMRD0nJChDQyknCitlbHNlCisgIENDX0ZPUl9CVUlMRD1nY2MKK2ZpCitBQ19TVUJTVChDQ19GT1JfQlVJTEQpCisKK0FDX1NVQlNUKENGTEFHUykKK0FDX1NVQlNUKEhERUZJTkVTKQorQVI9JHtBUi1hcn0KK0FDX1NVQlNUKEFSKQorQUNfUFJPR19SQU5MSUIKKworZG5sIFdlIGRvbid0IHVzZSBnZXR0ZXh0LCBidXQgYmZkIGRvZXMuICBTbyB3ZSBkbyB0aGUgYXBwcm9wcmlhdGUgY2hlY2tzCitkbmwgdG8gc2VlIGlmIHRoZXJlIGFyZSBpbnRsIGxpYnJhcmllcyB3ZSBzaG91bGQgbGluayBhZ2FpbnN0LgorQUxMX0xJTkdVQVM9CitDWV9HTlVfR0VUVEVYVAorCisjIENoZWNrIGZvciBjb21tb24gaGVhZGVycy4KKyMgRklYTUU6IFNlZW1zIHRvIG1lIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIGZvciBpMzg2LXdpbmRvd3MgaG9zdHMuCisjIEF0IG9uZSBwb2ludCB0aGVyZSB3ZXJlIGhhcmRjb2RlZCBBQ19ERUZJTkUncyBpZiAke2hvc3R9ID0gaTM4Ni0qLXdpbmRvd3MqLgorQUNfQ0hFQ0tfSEVBREVSUyhzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdW5pc3RkLmggdGltZS5oKQorQUNfQ0hFQ0tfSEVBREVSUyhzeXMvdGltZS5oIHN5cy9yZXNvdXJjZS5oKQorQUNfQ0hFQ0tfSEVBREVSUyhmY250bC5oIGZwdV9jb250cm9sLmgpCitBQ19DSEVDS19IRUFERVJTKGRsZmNuLmggZXJybm8uaCBzeXMvc3RhdC5oKQorQUNfQ0hFQ0tfRlVOQ1MoZ2V0cnVzYWdlIHRpbWUgc2lnYWN0aW9uIF9fc2V0ZnB1Y3cpCisKKyMgQ2hlY2sgZm9yIHNvY2tldCBsaWJyYXJpZXMKK0FDX0NIRUNLX0xJQihzb2NrZXQsIGJpbmQpCitBQ19DSEVDS19MSUIobnNsLCBnZXRob3N0YnluYW1lKQorCisuICR7c3JjZGlyfS8uLi8uLi9iZmQvY29uZmlndXJlLmhvc3QKKworZG5sIFN0YW5kYXJkIChhbmQgb3B0aW9uYWwpIHNpbXVsYXRvciBvcHRpb25zLgorZG5sIEV2ZW50dWFsbHkgYWxsIHNpbXVsYXRvcnMgd2lsbCBzdXBwb3J0IHRoZXNlLgorZG5sIERvIG5vdCBhZGQgYW55IGhlcmUgdGhhdCBjYW5ub3QgYmUgc3VwcG9ydGVkIGJ5IGFsbCBzaW11bGF0b3JzLgorZG5sIERvIG5vdCBhZGQgc2ltaWxhciBidXQgZGlmZmVyZW50IG9wdGlvbnMgdG8gYSBwYXJ0aWN1bGFyIHNpbXVsYXRvciwKK2RubCBhbGwgc2hhbGwgZXZlbnR1YWxseSBiZWhhdmUgdGhlIHNhbWUgd2F5LgorCisKK2RubCBXZSBkb24ndCB1c2UgYXV0b21ha2UsIGJ1dCB3ZSBzdGlsbCB3YW50IHRvIHN1cHBvcnQKK2RubCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUuCitVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCitBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKK1sgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQkJRW5hYmxlIGRldmVsb3BlciBmdW5jdGlvbmFsaXR5Ll0sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCU1BSU5UPSIiIFVTRV9NQUlOVEFJTkVSX01PREU9eWVzIDs7CisgIG5vKQlNQUlOVD0iIyIgOzsKKyAgKikJQUNfTVNHX0VSUk9SKCItLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZG9lcyBub3QgdGFrZSBhIHZhbHVlIik7IE1BSU5UPSIjIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQorZmldLFtNQUlOVD0iIyJdKWRubAorQUNfU1VCU1QoTUFJTlQpCisKKworZG5sIFRoaXMgaXMgYSBnZW5lcmljIG9wdGlvbiB0byBlbmFibGUgc3BlY2lhbCBieXRlIHN3YXBwaW5nCitkbmwgaW5zbnMgb24gKmFueSogY3B1LgorQUNfQVJHX0VOQUJMRShzaW0tYnN3YXAsCitbICAtLWVuYWJsZS1zaW0tYnN3YXAJCQlVc2UgSG9zdCBzcGVjaWZpYyBCU1dBUCBpbnN0cnVjdGlvbi5dLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0xIC1EVVNFX0JTV0FQPTEiOzsKKyAgbm8pCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTAiOzsKKyAgKikJQUNfTVNHX0VSUk9SKCItLWVuYWJsZS1zaW0tYnN3YXAgZG9lcyBub3QgdGFrZSBhIHZhbHVlIik7IHNpbV9ic3dhcD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKK2ZpXSxbc2ltX2Jzd2FwPSIiXSlkbmwKK0FDX1NVQlNUKHNpbV9ic3dhcCkKKworCitBQ19BUkdfRU5BQkxFKHNpbS1jZmxhZ3MsCitbICAtLWVuYWJsZS1zaW0tY2ZsYWdzPW9wdHMJCUV4dHJhIENGTEFHUyBmb3IgdXNlIGluIGJ1aWxkaW5nIHNpbXVsYXRvcl0sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCSBzaW1fY2ZsYWdzPSItTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIiOzsKKyAgdHJhY2UpIEFDX01TR19FUlJPUigiUGxlYXNlIHVzZSAtLWVuYWJsZS1zaW0tZGVidWcgaW5zdGVhZC4iKTsgc2ltX2NmbGFncz0iIjs7CisgIG5vKQkgc2ltX2NmbGFncz0iIjs7CisgICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQorZmldLFtzaW1fY2ZsYWdzPSIiXSlkbmwKK0FDX1NVQlNUKHNpbV9jZmxhZ3MpCisKKworZG5sIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpcyBmb3IgZGV2ZWxvcGVycyBvZiB0aGUgc2ltdWxhdG9yCitkbmwgdGhlIGFsbG93YWJsZSB2YWx1ZXMgYXJlIHdvcmstaW4tcHJvZ3Jlc3MKK0FDX0FSR19FTkFCTEUoc2ltLWRlYnVnLAorWyAgLS1lbmFibGUtc2ltLWRlYnVnPW9wdHMJCUVuYWJsZSBkZWJ1Z2dpbmcgZmxhZ3NdLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKSBzaW1fZGVidWc9Ii1EREVCVUc9NyAtRFdJVEhfREVCVUc9NyI7OworICBubykgIHNpbV9kZWJ1Zz0iLURERUJVRz0wIC1EV0lUSF9ERUJVRz0wIjs7CisgICopICAgc2ltX2RlYnVnPSItRERFQlVHPScoJHtlbmFibGV2YWx9KScgLURXSVRIX0RFQlVHPScoJHtlbmFibGV2YWx9KSciOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVidWciICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBkZWJ1ZyA9ICRzaW1fZGVidWciIDY+JjEKK2ZpXSxbc2ltX2RlYnVnPSIiXSlkbmwKK0FDX1NVQlNUKHNpbV9kZWJ1ZykKKworCitkbmwgLS1lbmFibGUtc2ltLXN0ZGlvIGlzIGZvciB1c2VycyBvZiB0aGUgc2ltdWxhdG9yCitkbmwgSXQgZGV0ZXJtaW5lcyBpZiBJTyBmcm9tIHRoZSBwcm9ncmFtIGlzIHJvdXRlZCB0aHJvdWdoIFNURElPIChidWZmZXJlZCkKK0FDX0FSR19FTkFCTEUoc2ltLXN0ZGlvLAorWyAgLS1lbmFibGUtc2ltLXN0ZGlvCQkJU3BlY2lmeSB3aGV0aGVyIHRvIHVzZSBzdGRpbyBmb3IgY29uc29sZSBpbnB1dC9vdXRwdXQuXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7CisgIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OworICAqKQlBQ19NU0dfRVJST1IoIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLXN0ZGlvIik7IHNpbV9zdGRpbz0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3N0ZGlvIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzdGRpbyBmbGFncyA9ICRzaW1fc3RkaW8iIDY+JjEKK2ZpXSxbc2ltX3N0ZGlvPSIiXSlkbmwKK0FDX1NVQlNUKHNpbV9zdGRpbykKKworCitkbmwgLS1lbmFibGUtc2ltLXRyYWNlIGlzIGZvciB1c2VycyBvZiB0aGUgc2ltdWxhdG9yCitkbmwgVGhlIGFyZ3VtZW50IGlzIGVpdGhlciBhIGJpdG1hc2sgb2YgdGhpbmdzIHRvIGVuYWJsZSBbZXhhY3RseSB3aGF0IGlzCitkbmwgdXAgdG8gdGhlIHNpbXVsYXRvcl0sIG9yIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbmFtZXMgb2YgdHJhY2luZworZG5sIGVsZW1lbnRzIHRvIGVuYWJsZS4gIFRoZSBsYXR0ZXIgaXMgb25seSBzdXBwb3J0ZWQgb24gc2ltdWxhdG9ycyB0aGF0CitkbmwgdXNlIFdJVEhfVFJBQ0UuCitBQ19BUkdfRU5BQkxFKHNpbS10cmFjZSwKK1sgIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFnc10sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV90cmFjZT0iLURUUkFDRT0xIC1EV0lUSF9UUkFDRT0tMSI7OworICBubykJc2ltX3RyYWNlPSItRFRSQUNFPTAgLURXSVRIX1RSQUNFPTAiOzsKKyAgW1stMC05XV0qKQorCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFtbYS16XV0qKQorCXNpbV90cmFjZT0iIgorCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbworCSAgaWYgdGVzdCB4IiRzaW1fdHJhY2UiID0geDsgdGhlbgorCSAgICBzaW1fdHJhY2U9Ii1EV0lUSF9UUkFDRT0nKFRSQUNFXyR4IgorCSAgZWxzZQorCSAgICBzaW1fdHJhY2U9IiR7c2ltX3RyYWNlfXxUUkFDRV8keCIKKwkgIGZpCisJZG9uZQorCXNpbV90cmFjZT0iJHNpbV90cmFjZSknIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV90cmFjZSIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIHRyYWNlID0gJHNpbV90cmFjZSIgNj4mMQorZmldLFtzaW1fdHJhY2U9IiJdKWRubAorQUNfU1VCU1Qoc2ltX3RyYWNlKQorCisKK2RubCAtLWVuYWJsZS1zaW0tcHJvZmlsZQorZG5sIFRoZSBhcmd1bWVudCBpcyBlaXRoZXIgYSBiaXRtYXNrIG9mIHRoaW5ncyB0byBlbmFibGUgW2V4YWN0bHkgd2hhdCBpcworZG5sIHVwIHRvIHRoZSBzaW11bGF0b3JdLCBvciBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG5hbWVzIG9mIHByb2ZpbGluZworZG5sIGVsZW1lbnRzIHRvIGVuYWJsZS4gIFRoZSBsYXR0ZXIgaXMgb25seSBzdXBwb3J0ZWQgb24gc2ltdWxhdG9ycyB0aGF0CitkbmwgdXNlIFdJVEhfUFJPRklMRS4KK0FDX0FSR19FTkFCTEUoc2ltLXByb2ZpbGUsCitbICAtLWVuYWJsZS1zaW0tcHJvZmlsZT1vcHRzCQlFbmFibGUgcHJvZmlsaW5nIGZsYWdzXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7CisgIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OworICBbWy0wLTldXSopCisJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9QUk9GSUxFPScoJHtlbmFibGV2YWx9KSciOzsKKyAgW1thLXpdXSopCisJc2ltX3Byb2ZpbGU9IiIKKwlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKwkgIGlmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiID0geDsgdGhlbgorCSAgICBzaW1fcHJvZmlsZT0iLURXSVRIX1BST0ZJTEU9JyhQUk9GSUxFXyR4IgorCSAgZWxzZQorCSAgICBzaW1fcHJvZmlsZT0iJHtzaW1fcHJvZmlsZX18UFJPRklMRV8keCIKKwkgIGZpCisJZG9uZQorCXNpbV9wcm9maWxlPSIkc2ltX3Byb2ZpbGUpJyIgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIHByb2ZpbGUgPSAkc2ltX3Byb2ZpbGUiIDY+JjEKK2ZpXSxbc2ltX3Byb2ZpbGU9IiJdKWRubAorQUNfU1VCU1Qoc2ltX3Byb2ZpbGUpCisKKworZG5sIFR5cGVzIHVzZWQgYnkgY29tbW9uIGNvZGUKK0FDX1RZUEVfU0lHTkFMCisKK2RubCBEZXRlY3QgZXhlIGV4dGVuc2lvbgorQU1fRVhFRVhUCisKK2RubCBUaGVzZSBhcmUgYXZhaWxhYmxlIHRvIGFwcGVuZCB0byBhcyBkZXNpcmVkLgorc2ltX2xpbmtfZmlsZXM9CitzaW1fbGlua19saW5rcz0KKworZG5sIENyZWF0ZSB0Y29uZmlnLmggZWl0aGVyIGZyb20gc2ltdWxhdG9yJ3MgdGNvbmZpZy5pbiBvciBkZWZhdWx0IG9uZQorZG5sIGluIGNvbW1vbi4KK3NpbV9saW5rX2xpbmtzPXRjb25maWcuaAoraWYgdGVzdCAtZiAke3NyY2Rpcn0vdGNvbmZpZy5pbgordGhlbgorICBzaW1fbGlua19maWxlcz10Y29uZmlnLmluCitlbHNlCisgIHNpbV9saW5rX2ZpbGVzPS4uL2NvbW1vbi90Y29uZmlnLmluCitmaQorCisjIHRhcmctdmFscy5kZWYgcG9pbnRzIHRvIHRoZSBsaWJjIG1hY3JvIGRlc2NyaXB0aW9uIGZpbGUuCitjYXNlICIke3RhcmdldH0iIGluCisqLSotKikgVEFSR19WQUxTX0RFRj0uLi9jb21tb24vbmx0dmFscy5kZWYgOzsKK2VzYWMKK3NpbV9saW5rX2ZpbGVzPSIke3NpbV9saW5rX2ZpbGVzfSAke1RBUkdfVkFMU19ERUZ9Igorc2ltX2xpbmtfbGlua3M9IiR7c2ltX2xpbmtfbGlua3N9IHRhcmctdmFscy5kZWYiCisKK10pIGRubCBFbmQgb2YgU0lNX0FDX0NPTU1PTgorCisKK2RubCBBZGRpdGlvbmFsIFNJTSBvcHRpb25zIHRoYXQgY2FuIChvcHRpb25hbGx5KSBiZSBjb25maWd1cmVkCitkbmwgRm9yIG9wdGlvbmFsIHNpbXVsYXRvciBvcHRpb25zLCBhIG1hY3JvIFNJTV9BQ19PUFRJT05fKiBpcyBkZWZpbmVkLgorZG5sIFNpbXVsYXRvcnMgdGhhdCB3aXNoIHRvIHVzZSB0aGUgcmVsZXZhbnQgb3B0aW9uIHNwZWNpZnkgdGhlIG1hY3JvCitkbmwgaW4gdGhlIHNpbXVsYXRvciBzcGVjaWZpYyBjb25maWd1cmUuaW4gZmlsZSBiZXR3ZWVuIHRoZSBTSU1fQUNfQ09NTU9OCitkbmwgYW5kIFNJTV9BQ19PVVRQVVQgbGluZXMuCisKKworZG5sIFNwZWNpZnkgdGhlIHJ1bm5pbmcgZW52aXJvbm1lbnQuCitkbmwgSWYgdGhlIHNpbXVsYXRvciBpbnZva2VzIHRoaXMgaW4gaXRzIGNvbmZpZ3VyZS5pbiB0aGVuIHdpdGhvdXQgdGhpcyBvcHRpb24KK2RubCB0aGUgZGVmYXVsdCBpcyB0aGUgdXNlciBlbnZpcm9ubWVudCBhbmQgYWxsIGFyZSBydW50aW1lIHNlbGVjdGFibGUuCitkbmwgSWYgdGhlIHNpbXVsYXRvciBkb2Vzbid0IGludm9rZSB0aGlzLCBvbmx5IHRoZSB1c2VyIGVudmlyb25tZW50IGlzCitkbmwgc3VwcG9ydGVkLgorZG5sID8/PyBVbnRpbCB0aGVyZSBpcyBkZW1vbnN0cmFibGUgdmFsdWUgaW4gZG9pbmcgc29tZXRoaW5nIG1vcmUgY29tcGxpY2F0ZWQsCitkbmwgbGV0J3Mgbm90LgorQUNfREVGVU4oU0lNX0FDX09QVElPTl9FTlZJUk9OTUVOVCwKK1sKK0FDX0FSR19FTkFCTEUoc2ltLWVudmlyb25tZW50LAorWyAgLS1lbmFibGUtc2ltLWVudmlyb25tZW50PWVudmlyb25tZW50CVNwZWNpZnkgbWl4ZWQsIHVzZXIsIHZpcnR1YWwgb3Igb3BlcmF0aW5nIGVudmlyb25tZW50Ll0sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICBhbGwgfCBBTEwpICAgICAgICAgICAgIHNpbV9lbnZpcm9ubWVudD0iLURXSVRIX0VOVklST05NRU5UPUFMTF9FTlZJUk9OTUVOVCI7OworICB1c2VyIHwgVVNFUikgICAgICAgICAgIHNpbV9lbnZpcm9ubWVudD0iLURXSVRIX0VOVklST05NRU5UPVVTRVJfRU5WSVJPTk1FTlQiOzsKKyAgdmlydHVhbCB8IFZJUlRVQUwpICAgICBzaW1fZW52aXJvbm1lbnQ9Ii1EV0lUSF9FTlZJUk9OTUVOVD1WSVJUVUFMX0VOVklST05NRU5UIjs7CisgIG9wZXJhdGluZyB8IE9QRVJBVElORykgc2ltX2Vudmlyb25tZW50PSItRFdJVEhfRU5WSVJPTk1FTlQ9T1BFUkFUSU5HX0VOVklST05NRU5UIjs7CisgICopICAgQUNfTVNHX0VSUk9SKCJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1lbnZpcm9ubWVudCIpOworICAgICAgIHNpbV9lbnZpcm9ubWVudD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Vudmlyb25tZW50IiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gZW52aXJvbm1lbnQgPSAkc2ltX2Vudmlyb25tZW50IiA2PiYxCitmaV0sCitbc2ltX2Vudmlyb25tZW50PSItRFdJVEhfRU5WSVJPTk1FTlQ9QUxMX0VOVklST05NRU5UIl0pZG5sCitdKQorQUNfU1VCU1Qoc2ltX2Vudmlyb25tZW50KQorCisKK2RubCBTcGVjaWZ5IHRoZSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIG9mIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgorZG5sIFdpdGhvdXQgdGhpcyBvcHRpb24gYWxsIHBvc3NpYmxlIGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIGFjY29tbW9kYXRlZC4KK2RubCBhcmdbMV0gaXMgaGFyZHdpcmVkIHRhcmdldCBhbGlnbm1lbnQKK2RubCBhcmdbMl0gaXMgZGVmYXVsdCB0YXJnZXQgYWxpZ25tZW50CitBQ19ERUZVTihTSU1fQUNfT1BUSU9OX0FMSUdOTUVOVCwKK3dpcmVfYWxpZ25tZW50PSJbJDFdIgorZGVmYXVsdF9hbGlnbm1lbnQ9IlskMl0iCitbCitBQ19BUkdfRU5BQkxFKHNpbS1hbGlnbm1lbnQsCitbICAtLWVuYWJsZS1zaW0tYWxpZ25tZW50PWFsaWduCQlTcGVjaWZ5IHN0cmljdCwgIG5vbnN0cmljdCBvciBmb3JjZWQgYWxpZ25tZW50IG9mIG1lbW9yeSBhY2Nlc3Nlcy5dLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgc3RyaWN0IHwgU1RSSUNUKSAgICAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPVNUUklDVF9BTElHTk1FTlQiOzsKKyAgbm9uc3RyaWN0IHwgTk9OU1RSSUNUKSBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPU5PTlNUUklDVF9BTElHTk1FTlQiOzsKKyAgZm9yY2VkIHwgRk9SQ0VEKSAgICAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPUZPUkNFRF9BTElHTk1FTlQiOzsKKyAgeWVzKSBpZiB0ZXN0IHgiJHdpcmVfYWxpZ25tZW50IiAhPSB4OyB0aGVuCisJIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9JHt3aXJlX2FsaWdubWVudH0iCisgICAgICAgZWxzZQorICAgICAgICAgaWYgdGVzdCB4IiRkZWZhdWx0X2FsaWdubWVudCIgIT0geDsgdGhlbgorICAgICAgICAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPSR7ZGVmYXVsdF9hbGlnbm1lbnR9IgorICAgICAgICAgZWxzZQorCSAgIGVjaG8gIk5vIGhhcmQtd2lyZWQgYWxpZ25tZW50IGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgorCSAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9MCIKKyAgICAgICAgIGZpCisgICAgICAgZmk7OworICBubykgIGlmIHRlc3QgeCIkZGVmYXVsdF9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKwkgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPSR7ZGVmYXVsdF9hbGlnbm1lbnR9IgorICAgICAgIGVsc2UKKyAgICAgICAgIGlmIHRlc3QgeCIkd2lyZV9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKwkgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9JHt3aXJlX2FsaWdubWVudH0iCisgICAgICAgICBlbHNlCisgICAgICAgICAgIGVjaG8gIk5vIGRlZmF1bHQgYWxpZ25tZW50IGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgorICAgICAgICAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9MCIKKyAgICAgICAgIGZpCisgICAgICAgZmk7OworICAqKSAgIEFDX01TR19FUlJPUigiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tYWxpZ25tZW50Iik7IHNpbV9hbGlnbm1lbnQ9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9hbGlnbm1lbnQiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGFsaWdubWVudCBmbGFncyA9ICRzaW1fYWxpZ25tZW50IiA2PiYxCitmaV0sCitbaWYgdGVzdCB4IiRkZWZhdWx0X2FsaWdubWVudCIgIT0geDsgdGhlbgorICBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCitlbHNlCisgIGlmIHRlc3QgeCIkd2lyZV9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKyAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgorICBlbHNlCisgICAgc2ltX2FsaWdubWVudD0KKyAgZmkKK2ZpXSlkbmwKK10pZG5sCitBQ19TVUJTVChzaW1fYWxpZ25tZW50KQorCisKK2RubCBDb25kaXRpb25hbGx5IGNvbXBpbGUgaW4gYXNzZXJ0aW9uIHN0YXRlbWVudHMuCitBQ19ERUZVTihTSU1fQUNfT1BUSU9OX0FTU0VSVCwKK1sKK0FDX0FSR19FTkFCTEUoc2ltLWFzc2VydCwKK1sgIC0tZW5hYmxlLXNpbS1hc3NlcnQJCQlTcGVjaWZ5IHdoZXRoZXIgdG8gcGVyZm9ybSByYW5kb20gYXNzZXJ0aW9ucy5dLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fYXNzZXJ0PSItRFdJVEhfQVNTRVJUPTEiOzsKKyAgbm8pCXNpbV9hc3NlcnQ9Ii1EV0lUSF9BU1NFUlQ9MCI7OworICAqKQlBQ19NU0dfRVJST1IoIi0tZW5hYmxlLXNpbS1hc3NlcnQgZG9lcyBub3QgdGFrZSBhIHZhbHVlIik7IHNpbV9hc3NlcnQ9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9hc3NlcnQiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGFzc2VydCBmbGFncyA9ICRzaW1fYXNzZXJ0IiA2PiYxCitmaV0sW3NpbV9hc3NlcnQ9IiJdKWRubAorXSkKK0FDX1NVQlNUKHNpbV9hc3NlcnQpCisKKworCitkbmwgLS1lbmFibGUtc2ltLWJpdHNpemUgaXMgZm9yIGRldmVsb3BlcnMgb2YgdGhlIHNpbXVsYXRvcgorZG5sIEl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIEJJVFMgaW4gdGhlIHRhcmdldC4KK2RubCBhcmdbMV0gaXMgdGhlIG51bWJlciBvZiBiaXRzIGluIGEgd29yZAorZG5sIGFyZ1syXSBpcyB0aGUgbnVtYmVyIGFzc2lnbmVkIHRvIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdAorZG5sIGFyZ1szXSBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYW4gYWRkcmVzcworZG5sIGFyZ1s0XSBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYW4gT3BlbkZpcm13YXJlIGNlbGwuCitkbmwgRklYTUU6IHRoaXMgaW5mb3JtYXRpb24gc2hvdWxkIGJlIG9idGFpbmVkIGZyb20gYmZkL2FyY2h1cmUKK0FDX0RFRlVOKFNJTV9BQ19PUFRJT05fQklUU0laRSwKK3dpcmVfd29yZF9iaXRzaXplPSJbJDFdIgord2lyZV93b3JkX21zYj0iWyQyXSIKK3dpcmVfYWRkcmVzc19iaXRzaXplPSJbJDNdIgord2lyZV9jZWxsX2JpdHNpemU9IlskNF0iCitbQUNfQVJHX0VOQUJMRShzaW0tYml0c2l6ZSwKK1sgIC0tZW5hYmxlLXNpbS1iaXRzaXplPU4JCVNwZWNpZnkgdGFyZ2V0IGJpdHNpemUgKDMyIG9yIDY0KS5dLAorW3NpbV9iaXRzaXplPQorY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICA2NCw2MyB8IDY0LDYzLCogKSBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9NjQgLURXSVRIX1RBUkdFVF9XT1JEX01TQj02MyI7OworICAzMiwzMSB8IDMyLDMxLCogKSBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9MzIgLURXSVRIX1RBUkdFVF9XT1JEX01TQj0zMSI7OworICA2NCwwIHwgNjQsMCwqICkgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTMyIC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MCI7OworICAzMiwwIHwgNjQsMCwqICkgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTMyIC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MCI7OworICAzMikgaWYgdGVzdCB4IiR3aXJlX3dvcmRfbXNiIiAhPSB4IC1hIHgiJHdpcmVfd29yZF9tc2IiICE9IHgwOyB0aGVuCisgICAgICAgIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT0zMiAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTMxIgorICAgICAgZWxzZQorICAgICAgICBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9MzIgLURXSVRIX1RBUkdFVF9XT1JEX01TQj0wIgorICAgICAgZmkgOzsKKyAgNjQpIGlmIHRlc3QgeCIkd2lyZV93b3JkX21zYiIgIT0geCAtYSB4IiR3aXJlX3dvcmRfbXNiIiAhPSB4MDsgdGhlbgorICAgICAgICBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9NjQgLURXSVRIX1RBUkdFVF9XT1JEX01TQj02MyIKKyAgICAgIGVsc2UKKyAgICAgICAgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTY0IC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MCIKKyAgICAgIGZpIDs7CisgICopICBBQ19NU0dfRVJST1IoIi0tZW5hYmxlLXNpbS1iaXRzaXplIHdhcyBnaXZlbiAkZW5hYmxldmFsLiAgRXhwZWN0ZWQgMzIgb3IgNjQiKSA7OworZXNhYworIyBhZGRyZXNzIGJpdHNpemUKK3RtcD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy9eW1swLTldXSosKltbMC05XV0qLCovLyJgCitjYXNlIHgiJHt0bXB9IiBpbgorICB4ICkgOzsKKyAgeDMyIHwgeDMyLCogKSBzaW1fYml0c2l6ZT0iJHtzaW1fYml0c2l6ZX0gLURXSVRIX1RBUkdFVF9BRERSRVNTX0JJVFNJWkU9MzIiIDs7CisgIHg2NCB8IHg2NCwqICkgc2ltX2JpdHNpemU9IiR7c2ltX2JpdHNpemV9IC1EV0lUSF9UQVJHRVRfQUREUkVTU19CSVRTSVpFPTY0IiA7OworICAqICkgQUNfTVNHX0VSUk9SKCItLWVuYWJsZS1zaW0tYml0c2l6ZSB3YXMgZ2l2ZW4gYWRkcmVzcyBzaXplICRlbmFibGV2YWwuICBFeHBlY3RlZCAzMiBvciA2NCIpIDs7Citlc2FjCisjIGNlbGwgYml0c2l6ZQordG1wPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzL15bWzAtOV1dKiwqW1swLTkqXV0qLCpbWzAtOV1dKiwqLy8iYAorY2FzZSB4IiR7dG1wfSIgaW4KKyAgeCApIDs7CisgIHgzMiB8IHgzMiwqICkgc2ltX2JpdHNpemU9IiR7c2ltX2JpdHNpemV9IC1EV0lUSF9UQVJHRVRfQ0VMTF9CSVRTSVpFPTMyIiA7OworICB4NjQgfCB4NjQsKiApIHNpbV9iaXRzaXplPSIke3NpbV9iaXRzaXplfSAtRFdJVEhfVEFSR0VUX0NFTExfQklUU0laRT02NCIgOzsKKyAgKiApIEFDX01TR19FUlJPUigiLS1lbmFibGUtc2ltLWJpdHNpemUgd2FzIGdpdmVuIGNlbGwgc2l6ZSAkZW5hYmxldmFsLiAgRXhwZWN0ZWQgMzIgb3IgNjQiKSA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9iaXRzaXplIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBiaXRzaXplIGZsYWdzID0gJHNpbV9iaXRzaXplIiA2PiYxCitmaV0sCitbc2ltX2JpdHNpemU9IiIKK2lmIHRlc3QgeCIkd2lyZV93b3JkX2JpdHNpemUiICE9IHg7IHRoZW4KKyAgc2ltX2JpdHNpemU9IiRzaW1fYml0c2l6ZSAtRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT0kd2lyZV93b3JkX2JpdHNpemUiCitmaQoraWYgdGVzdCB4IiR3aXJlX3dvcmRfbXNiIiAhPSB4OyB0aGVuCisgIHNpbV9iaXRzaXplPSIkc2ltX2JpdHNpemUgLURXSVRIX1RBUkdFVF9XT1JEX01TQj0kd2lyZV93b3JkX21zYiIKK2ZpCitpZiB0ZXN0IHgiJHdpcmVfYWRkcmVzc19iaXRzaXplIiAhPSB4OyB0aGVuCisgIHNpbV9iaXRzaXplPSIkc2ltX2JpdHNpemUgLURXSVRIX1RBUkdFVF9BRERSRVNTX0JJVFNJWkU9JHdpcmVfYWRkcmVzc19iaXRzaXplIgorZmkKK2lmIHRlc3QgeCIkd2lyZV9jZWxsX2JpdHNpemUiICE9IHg7IHRoZW4KKyAgc2ltX2JpdHNpemU9IiRzaW1fYml0c2l6ZSAtRFdJVEhfVEFSR0VUX0NFTExfQklUU0laRT0kd2lyZV9jZWxsX2JpdHNpemUiCitmaV0pZG5sCitdKQorQUNfU1VCU1Qoc2ltX2JpdHNpemUpCisKKworCitkbmwgLS1lbmFibGUtc2ltLWVuZGlhbj17eWVzLG5vLGJpZyxsaXR0bGV9IGlzIGZvciBzaW11bGF0b3JzCitkbmwgdGhhdCBzdXBwb3J0IGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuIHRhcmdldHMuCitkbmwgYXJnWzFdIGlzIGhhcmR3aXJlZCB0YXJnZXQgZW5kaWFubmVzcy4KK2RubCBhcmdbMl0gaXMgZGVmYXVsdCB0YXJnZXQgZW5kaWFubmVzcy4KK0FDX0RFRlVOKFNJTV9BQ19PUFRJT05fRU5ESUFOLAorWword2lyZV9lbmRpYW49IlskMV0iCitkZWZhdWx0X2VuZGlhbj0iWyQyXSIKK0FDX0FSR19FTkFCTEUoc2ltLWVuZGlhbiwKK1sgIC0tZW5hYmxlLXNpbS1lbmRpYW49ZW5kaWFuCQlTcGVjaWZ5IHRhcmdldCBieXRlIGVuZGlhbiBvcmllbnRhdGlvbi5dLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgYip8QiopIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj1CSUdfRU5ESUFOIjs7CisgIGwqfEwqKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiI7OworICB5ZXMpCSBpZiB0ZXN0IHgiJHdpcmVfZW5kaWFuIiAhPSB4OyB0aGVuCisJICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPSR7d2lyZV9lbmRpYW59IgorCSBlbHNlCisgICAgICAgICAgIGlmIHRlc3QgeCIkZGVmYXVsdF9lbmRpYW4iICE9IHg7IHRoZW4KKwkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0ke2RlZmF1bHRfZW5kaWFufSIKKwkgICBlbHNlCisJICAgICBlY2hvICJObyBoYXJkLXdpcmVkIGVuZGlhbiBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKKwkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0wIgorCSAgIGZpCisJIGZpOzsKKyAgbm8pCSBpZiB0ZXN0IHgiJGRlZmF1bHRfZW5kaWFuIiAhPSB4OyB0aGVuCisJICAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9JHtkZWZhdWx0X2VuZGlhbn0iCisJIGVsc2UKKwkgICBpZiB0ZXN0IHgiJHdpcmVfZW5kaWFuIiAhPSB4OyB0aGVuCisJICAgICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0ke3dpcmVfZW5kaWFufSIKKwkgICBlbHNlCisJICAgICBlY2hvICJObyBkZWZhdWx0IGVuZGlhbiBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKKwkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPTAiCisJICAgZmkKKwkgZmk7OworICAqKQkgQUNfTVNHX0VSUk9SKCJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1lbmRpYW4iKTsgc2ltX2VuZGlhbj0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2VuZGlhbiIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgZW5kaWFuIGZsYWdzID0gJHNpbV9lbmRpYW4iIDY+JjEKK2ZpXSwKK1tpZiB0ZXN0IHgiJGRlZmF1bHRfZW5kaWFuIiAhPSB4OyB0aGVuCisgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPSR7ZGVmYXVsdF9lbmRpYW59IgorZWxzZQorICBpZiB0ZXN0IHgiJHdpcmVfZW5kaWFuIiAhPSB4OyB0aGVuCisgICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPSR7d2lyZV9lbmRpYW59IgorICBlbHNlCisgICAgc2ltX2VuZGlhbj0KKyAgZmkKK2ZpXSlkbmwKK10pCitBQ19TVUJTVChzaW1fZW5kaWFuKQorCisKK2RubCAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbiBpcyBmb3IgdXNlcnMgb2YgdGhlIHNpbXVsYXRvciB3aGVuCitkbmwgdGhleSBmaW5kIHRoYXQgQUNfQ19CSUdFTkRJQU4gZG9lcyBub3QgZnVuY3Rpb24gY29ycmVjdGx5CitkbmwgKGZvciBpbnN0YW5jZSBpbiBhIGNhbmFkaWFuIGNyb3NzKQorQUNfREVGVU4oU0lNX0FDX09QVElPTl9IT1NURU5ESUFOLAorWworQUNfQVJHX0VOQUJMRShzaW0taG9zdGVuZGlhbiwKK1sgIC0tZW5hYmxlLXNpbS1ob3N0ZW5kaWFuPWVuZAkJU3BlY2lmeSBob3N0IGJ5dGUgZW5kaWFuIG9yaWVudGF0aW9uLl0sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICBubykJIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPTAiOzsKKyAgYip8QiopIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUJJR19FTkRJQU4iOzsKKyAgbCp8TCopIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iOzsKKyAgKikJIEFDX01TR19FUlJPUigiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbiIpOyBzaW1faG9zdGVuZGlhbj0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2hvc3RlbmRpYW4iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGhvc3RlbmRpYW4gZmxhZ3MgPSAkc2ltX2hvc3RlbmRpYW4iIDY+JjEKK2ZpXSxbCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICBBQ19DX0JJR0VORElBTgorICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHllczsgdGhlbgorICAgIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUJJR19FTkRJQU4iCisgIGVsc2UKKyAgICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIgorICBmaQorZWxzZQorICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj0wIgorZmldKWRubAorXSkKK0FDX1NVQlNUKHNpbV9ob3N0ZW5kaWFuKQorCisKK2RubCAtLWVuYWJsZS1zaW0tZmxvYXQgaXMgZm9yIGRldmVsb3BlcnMgb2YgdGhlIHNpbXVsYXRvcgorZG5sIEl0IHNwZWNpZmllcyB0aGUgcHJlc2VuY2Ugb2YgaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQKK2RubCBBbmQgb3B0aW9uYWxseSB0aGUgYml0c2l6ZSBvZiB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCitkbmwgYXJnWzFdIHNwZWNpZmllcyB0aGUgcHJlc2VuY2UgKG9yIGFic2VuY2UpIG9mIGZsb2F0aW5nIHBvaW50IGhhcmR3YXJlCitkbmwgYXJnWzJdIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYSBmbG9hdGluZyBwb2ludCByZWdpc3RlcgorQUNfREVGVU4oU0lNX0FDX09QVElPTl9GTE9BVCwKK1sKK2RlZmF1bHRfc2ltX2Zsb2F0PSJbJDFdIgorZGVmYXVsdF9zaW1fZmxvYXRfYml0c2l6ZT0iWyQyXSIKK0FDX0FSR19FTkFCTEUoc2ltLWZsb2F0LAorWyAgLS1lbmFibGUtc2ltLWZsb2F0CQkJU3BlY2lmeSB0aGF0IHRoZSB0YXJnZXQgcHJvY2Vzc29yIGhhcyBmbG9hdGluZyBwb2ludCBoYXJkd2FyZS5dLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzIHwgaGFyZCkJc2ltX2Zsb2F0PSItRFdJVEhfRkxPQVRJTkdfUE9JTlQ9SEFSRF9GTE9BVElOR19QT0lOVCI7OworICBubyB8IHNvZnQpCXNpbV9mbG9hdD0iLURXSVRIX0ZMT0FUSU5HX1BPSU5UPVNPRlRfRkxPQVRJTkdfUE9JTlQiOzsKKyAgMzIpICAgICAgICAgICBzaW1fZmxvYXQ9Ii1EV0lUSF9GTE9BVElOR19QT0lOVD1IQVJEX0ZMT0FUSU5HX1BPSU5UIC1EV0lUSF9UQVJHRVRfRkxPQVRJTkdfUE9JTlRfQklUU0laRT0zMiI7OworICA2NCkgICAgICAgICAgIHNpbV9mbG9hdD0iLURXSVRIX0ZMT0FUSU5HX1BPSU5UPUhBUkRfRkxPQVRJTkdfUE9JTlQgLURXSVRIX1RBUkdFVF9GTE9BVElOR19QT0lOVF9CSVRTSVpFPTY0Ijs7CisgICopCQlBQ19NU0dfRVJST1IoIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWZsb2F0Iik7IHNpbV9mbG9hdD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Zsb2F0IiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBmbG9hdCBmbGFncyA9ICRzaW1fZmxvYXQiIDY+JjEKK2ZpXSxbCitzaW1fZmxvYXQ9CitpZiB0ZXN0IHgiJHtkZWZhdWx0X3NpbV9mbG9hdH0iICE9IHgiIjsgdGhlbgorICBzaW1fZmxvYXQ9Ii1EV0lUSF9GTE9BVElOR19QT0lOVD0ke2RlZmF1bHRfc2ltX2Zsb2F0fSIKK2ZpCitpZiB0ZXN0IHgiJHtkZWZhdWx0X3NpbV9mbG9hdF9iaXRzaXplfSIgIT0geCIiOyB0aGVuCisgIHNpbV9mbG9hdD0iJHNpbV9mbG9hdCAtRFdJVEhfVEFSR0VUX0ZMT0FUSU5HX1BPSU5UX0JJVFNJWkU9JHtkZWZhdWx0X3NpbV9mbG9hdF9iaXRzaXplfSIKK2ZpCitdKWRubAorXSkKK0FDX1NVQlNUKHNpbV9mbG9hdCkKKworCitkbmwgVGhlIGFyZ3VtZW50IGlzIHRoZSBkZWZhdWx0IGNhY2hlIHNpemUgaWYgbm9uZSBpcyBzcGVjaWZpZWQuCitBQ19ERUZVTihTSU1fQUNfT1BUSU9OX1NDQUNIRSwKK1sKK2RlZmF1bHRfc2ltX3NjYWNoZT0iaWZlbHNlKFskMV0sLDAsWyQxXSkiCitBQ19BUkdfRU5BQkxFKHNpbS1zY2FjaGUsCitbICAtLWVuYWJsZS1zaW0tc2NhY2hlPXNpemUJCVNwZWNpZnkgc2ltdWxhdG9yIGV4ZWN1dGlvbiBjYWNoZSBzaXplLl0sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9zY2FjaGU9Ii1EV0lUSF9TQ0FDSEU9JHtkZWZhdWx0X3NpbV9zY2FjaGV9Ijs7CisgIG5vKQlzaW1fc2NhY2hlPSItRFdJVEhfU0NBQ0hFPTAiIDs7CisgIFtbMC05XV0qKSBzaW1fY2FjaGU9JHtlbmFibGV2YWx9OzsKKyAgKikJQUNfTVNHX0VSUk9SKCJCYWQgdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLXNjYWNoZSIpOworCXNpbV9zY2FjaGU9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zY2FjaGUiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNjYWNoZSBzaXplID0gJHNpbV9zY2FjaGUiIDY+JjEKK2ZpXSxbc2ltX3NjYWNoZT0iLURXSVRIX1NDQUNIRT0ke2RlZmF1bHRfc2ltX3NjYWNoZX0iXSkKK10pCitBQ19TVUJTVChzaW1fc2NhY2hlKQorCisKK2RubCBUaGUgYXJndW1lbnQgaXMgdGhlIGRlZmF1bHQgbW9kZWwgaWYgbm9uZSBpcyBzcGVjaWZpZWQuCitBQ19ERUZVTihTSU1fQUNfT1BUSU9OX0RFRkFVTFRfTU9ERUwsCitbCitkZWZhdWx0X3NpbV9kZWZhdWx0X21vZGVsPSJpZmVsc2UoWyQxXSwsMCxbJDFdKSIKK0FDX0FSR19FTkFCTEUoc2ltLWRlZmF1bHQtbW9kZWwsCitbICAtLWVuYWJsZS1zaW0tZGVmYXVsdC1tb2RlbD1tb2RlbAlTcGVjaWZ5IGRlZmF1bHQgbW9kZWwgdG8gc2ltdWxhdGUuXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllc3xubykgQUNfTVNHX0VSUk9SKCJNaXNzaW5nIGFyZ3VtZW50IHRvIC0tZW5hYmxlLXNpbS1kZWZhdWx0LW1vZGVsIik7OworICAqKQlzaW1fZGVmYXVsdF9tb2RlbD0iLURXSVRIX0RFRkFVTFRfTU9ERUw9J1wiJHtlbmFibGV2YWx9XCInIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2RlZmF1bHRfbW9kZWwiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGRlZmF1bHQgbW9kZWwgPSAkc2ltX2RlZmF1bHRfbW9kZWwiIDY+JjEKK2ZpXSxbc2ltX2RlZmF1bHRfbW9kZWw9Ii1EV0lUSF9ERUZBVUxUX01PREVMPSdcIiR7ZGVmYXVsdF9zaW1fZGVmYXVsdF9tb2RlbH1cIiciXSkKK10pCitBQ19TVUJTVChzaW1fZGVmYXVsdF9tb2RlbCkKKworCitkbmwgLS1lbmFibGUtc2ltLWhhcmR3YXJlIGlzIGZvciB1c2VycyBvZiB0aGUgc2ltdWxhdG9yCitkbmwgYXJnWzFdIEVuYWJsZSBzaW0taHcgYnkgZGVmYXVsdD8gKCJ5ZXMiIG9yICJubyIpCitkbmwgYXJnWzJdIGlzIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZGV2aWNlcyB0aGF0IG92ZXJyaWRlIHRoZSBkZWZhdWx0cworZG5sIGFyZ1szXSBpcyBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGV4dHJhIHRhcmdldCBzcGVjaWZpYyBkZXZpY2VzLgorQUNfREVGVU4oU0lNX0FDX09QVElPTl9IQVJEV0FSRSwKK1sKK2lmIHRlc3QgeCJbJDFdIiA9IHgieWVzIjsgdGhlbgorICBzaW1faHdfcD15ZXMKK2Vsc2UKKyAgc2ltX2h3X3A9bm8KK2ZpCitpZiB0ZXN0ICJbJDJdIjsgdGhlbgorICBoYXJkd2FyZT0iY29yZSBwYWwgZ2x1ZSIKK2Vsc2UKKyAgaGFyZHdhcmU9ImNvcmUgcGFsIGdsdWUgWyQzXSIKK2ZpCitzaW1faHdfY2ZsYWdzPSItRFdJVEhfSFc9MSIKK3NpbV9odz0iJGhhcmR3YXJlIgorc2ltX2h3X29ianM9IlwkKFNJTV9DT01NT05fSFdfT0JKUykgYGVjaG8gJHNpbV9odyB8IHNlZCAtZSAncy9cKFtbXiBdXVtbXiBdXSpcKS9kdi1cMS5vL2cnYCIKK0FDX0FSR19FTkFCTEUoc2ltLWhhcmR3YXJlLAorWyAgLS1lbmFibGUtc2ltLWhhcmR3YXJlPUxJU1QJCVNwZWNpZnkgdGhlIGhhcmR3YXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBidWlsZC5dLAorWworY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9od19wPXllczs7CisgIG5vKQlzaW1faHdfcD1ubzs7CisgICwqKSAgIHNpbV9od19wPXllczsgaGFyZHdhcmU9IiR7aGFyZHdhcmV9IGBlY2hvICR7ZW5hYmxldmFsfSB8IHNlZCAtZSAncy8sLyAvJ2AiOzsKKyAgKiwpICAgc2ltX2h3X3A9eWVzOyBoYXJkd2FyZT0iYGVjaG8gJHtlbmFibGV2YWx9IHwgc2VkIC1lICdzLywvIC8nYCAke2hhcmR3YXJlfSI7OworICAqKQlzaW1faHdfcD15ZXM7IGhhcmR3YXJlPSJgZWNobyAke2VuYWJsZXZhbH0gfCBzZWQgLWUgJ3MvLC8gLydgIicnOzsKK2VzYWMKK2lmIHRlc3QgIiRzaW1faHdfcCIgIT0geWVzOyB0aGVuCisgIHNpbV9od19vYmpzPQorICBzaW1faHdfY2ZsYWdzPSItRFdJVEhfSFc9MCIKKyAgc2ltX2h3PQorZWxzZQorICBzaW1faHdfY2ZsYWdzPSItRFdJVEhfSFc9MSIKKyAgIyByZW1vdmUgZHVwbGljYXRlcworICBzaW1faHc9IiIKKyAgc2ltX2h3X29ianM9IlwkKFNJTV9DT01NT05fSFdfT0JKUykiCisgIGZvciBpIGluIHggJGhhcmR3YXJlIDsgZG8KKyAgICBjYXNlICIgJGYgIiBpbgorICAgICAgeCkgOzsKKyAgICAgICoiICRpICIqKSA7OworICAgICAgKikgc2ltX2h3PSIkc2ltX2h3ICRpIiA7IHNpbV9od19vYmpzPSIkc2ltX2h3X29ianMgZHYtJGkubyI7OworICAgIGVzYWMKKyAgZG9uZQorZmkKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCAiJHNpbV9od19wIiA9ICJ5ZXMiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgaGFyZHdhcmUgdG8gJHNpbV9od19jZmxhZ3MsICRzaW1faHcsICRzaW1faHdfb2JqcyIKK2ZpXSxbCitpZiB0ZXN0ICIkc2ltX2h3X3AiICE9IHllczsgdGhlbgorICBzaW1faHdfb2Jqcz0KKyAgc2ltX2h3X2NmbGFncz0iLURXSVRIX0hXPTAiCisgIHNpbV9odz0KK2ZpCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgaGFyZHdhcmUgdG8gJHNpbV9od19jZmxhZ3MsICRzaW1faHcsICRzaW1faHdfb2JqcyIKK2ZpXSlkbmwKK10pCitBQ19TVUJTVChzaW1faHdfY2ZsYWdzKQorQUNfU1VCU1Qoc2ltX2h3X29ianMpCitBQ19TVUJTVChzaW1faHcpCisKKworZG5sIC0tZW5hYmxlLXNpbS1pbmxpbmUgaXMgZm9yIHVzZXJzIHRoYXQgd2lzaCB0byByYW1wIHVwIHRoZSBzaW11bGF0b3IncworZG5sIHBlcmZvcm1hbmNlIGJ5IGlubGluaW5nIGZ1bmN0aW9ucy4KK2RubCBHdWFyYW50ZWUgdGhhdCB1bmNvbmZpZ3VyZWQgc2ltdWxhdG9ycyBkbyBub3QgZG8gYW55IGlubGluaW5nCitzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCitBQ19ERUZVTihTSU1fQUNfT1BUSU9OX0lOTElORSwKK1sKK2RlZmF1bHRfc2ltX2lubGluZT0iaWZlbHNlKFskMV0sLCwtRERFRkFVTFRfSU5MSU5FPVskMV0pIgorQUNfQVJHX0VOQUJMRShzaW0taW5saW5lLAorWyAgLS1lbmFibGUtc2ltLWlubGluZT1pbmxpbmVzCQlTcGVjaWZ5IHdoaWNoIGZ1bmN0aW9ucyBzaG91bGQgYmUgaW5saW5lZC5dLAorW3NpbV9pbmxpbmU9IiIKK2Nhc2UgIiRlbmFibGV2YWwiIGluCisgIG5vKQkJc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIjs7CisgIDApCQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiOzsKKyAgeWVzIHwgMikJc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT1BTExfQ19JTkxJTkUiOzsKKyAgMSkJCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9SU5MSU5FX0xPQ0FMUyI7OworICAqKSBmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKyAgICAgICBuZXdfZmxhZz0iIgorICAgICAgIGNhc2UgIiR4IiBpbgorCSAqX0lOTElORT0qKQluZXdfZmxhZz0iLUQkeCI7OworCSAqPSopCQluZXdfZmxhZz1gZWNobyAiJHgiIHwgc2VkIC1lICJzLz0vX0lOTElORT0vIiAtZSAicy9eLy1ELyJgOzsKKwkgKl9JTkxJTkUpCW5ld19mbGFnPSItRCR4PUFMTF9DX0lOTElORSI7OworCSAqKQkJbmV3X2ZsYWc9Ii1EJHgiIl9JTkxJTkU9QUxMX0NfSU5MSU5FIjs7CisgICAgICAgZXNhYworICAgICAgIGlmIHRlc3QgeCIkc2ltX2lubGluZSIgPSB4IiI7IHRoZW4KKwkgc2ltX2lubGluZT0iJG5ld19mbGFnIgorICAgICAgIGVsc2UKKwkgc2ltX2lubGluZT0iJHNpbV9pbmxpbmUgJG5ld19mbGFnIgorICAgICAgIGZpCisgICAgIGRvbmU7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9pbmxpbmUiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGlubGluZSBmbGFncyA9ICRzaW1faW5saW5lIiA2PiYxCitmaV0sWworaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KKyAgaWYgdGVzdCB4IiRHQ0MiICE9ICJ4IiAtYSB4IiR7ZGVmYXVsdF9zaW1faW5saW5lfSIgIT0gIngiIDsgdGhlbgorICAgIHNpbV9pbmxpbmU9IiR7ZGVmYXVsdF9zaW1faW5saW5lfSIKKyAgICBpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCisgICAgICBlY2hvICJTZXR0aW5nIGlubGluZSBmbGFncyA9ICRzaW1faW5saW5lIiA2PiYxCisgICAgZmkKKyAgZWxzZQorICAgIHNpbV9pbmxpbmU9IiIKKyAgZmkKK2Vsc2UKKyAgc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIgorZmldKWRubAorXSkKK0FDX1NVQlNUKHNpbV9pbmxpbmUpCisKKworQUNfREVGVU4oU0lNX0FDX09QVElPTl9QQUNLQUdFUywKK1sKK0FDX0FSR19FTkFCTEUoc2ltLXBhY2thZ2VzLAorWyAgLS1lbmFibGUtc2ltLXBhY2thZ2VzPWxpc3QJCVNwZWNpZnkgdGhlIHBhY2thZ2VzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBidWlsZC5dLAorW3BhY2thZ2VzPWRpc2tsYWJlbAorY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCTs7CisgIG5vKQlBQ19NU0dfRVJST1IoIkxpc3Qgb2YgcGFja2FnZXMgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIC0tZW5hYmxlLXNpbS1wYWNrYWdlcyIpOyBwYWNrYWdlcz0iIjs7CisgICwqKSAgIHBhY2thZ2VzPSIke3BhY2thZ2VzfSR7ZW5hYmxldmFsfSI7OworICAqLCkgICBwYWNrYWdlcz0iJHtlbmFibGV2YWx9JHtwYWNrYWdlc30iOzsKKyAgKikJcGFja2FnZXM9IiR7ZW5hYmxldmFsfSInJzs7Citlc2FjCitzaW1fcGtfc3JjPWBlY2hvICRwYWNrYWdlcyB8IHNlZCAtZSAncy8sLy5jIHBrXy9nJyAtZSAncy9eL3BrXy8nIC1lICdzLyQvLmMvJ2AKK3NpbV9wa19vYmo9YGVjaG8gJHNpbV9wa19zcmMgfCBzZWQgLWUgJ3MvXC5jLy5vL2cnYAoraWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHBhY2thZ2VzIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBwYWNrYWdlcyB0byAkc2ltX3BrX3NyYywgJHNpbV9wa19vYmoiCitmaV0sW3BhY2thZ2VzPWRpc2tsYWJlbAorc2ltX3BrX3NyYz1gZWNobyAkcGFja2FnZXMgfCBzZWQgLWUgJ3MvLC8uYyBwa18vZycgLWUgJ3MvXi9wa18vJyAtZSAncy8kLy5jLydgCitzaW1fcGtfb2JqPWBlY2hvICRzaW1fcGtfc3JjIHwgc2VkIC1lICdzL1wuYy8uby9nJ2AKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBwYWNrYWdlcyB0byAkc2ltX3BrX3NyYywgJHNpbV9wa19vYmoiCitmaV0pZG5sCitdKQorQUNfU1VCU1Qoc2ltX3BhY2thZ2VzKQorCisKK0FDX0RFRlVOKFNJTV9BQ19PUFRJT05fUkVHUEFSTSwKK1sKK0FDX0FSR19FTkFCTEUoc2ltLXJlZ3Bhcm0sCitbICAtLWVuYWJsZS1zaW0tcmVncGFybT1uci1wYXJtCQlQYXNzIHBhcmFtZXRlcnMgaW4gcmVnaXN0ZXJzIGluc3RlYWQgb2Ygb24gdGhlIHN0YWNrIC0geDg2L0dDQyBzcGVjaWZpYy5dLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgMCp8MSp8Mip8Myp8NCp8NSp8Nip8Nyp8OCp8OSopIHNpbV9yZWdwYXJtPSItRFdJVEhfUkVHUEFSTT0ke2VuYWJsZXZhbH0iOzsKKyAgbm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbV9yZWdwYXJtPSIiIDs7CisgIHllcykgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1fcmVncGFybT0iLURXSVRIX1JFR1BBUk09MyI7OworICAqKSAgIEFDX01TR19FUlJPUigiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0tcmVncGFybSIpOyBzaW1fcmVncGFybT0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3JlZ3Bhcm0iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHJlZ3Bhcm0gZmxhZ3MgPSAkc2ltX3JlZ3Bhcm0iIDY+JjEKK2ZpXSxbc2ltX3JlZ3Bhcm09IiJdKWRubAorXSkKK0FDX1NVQlNUKHNpbV9yZWdwYXJtKQorCisKK0FDX0RFRlVOKFNJTV9BQ19PUFRJT05fUkVTRVJWRURfQklUUywKK1sKK2RlZmF1bHRfc2ltX3Jlc2VydmVkX2JpdHM9ImlmZWxzZShbJDFdLCwxLFskMV0pIgorQUNfQVJHX0VOQUJMRShzaW0tcmVzZXJ2ZWQtYml0cywKK1sgIC0tZW5hYmxlLXNpbS1yZXNlcnZlZC1iaXRzCQlTcGVjaWZ5IHdoZXRoZXIgdG8gY2hlY2sgcmVzZXJ2ZWQgYml0cyBpbiBpbnN0cnVjdGlvbi5dLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fcmVzZXJ2ZWRfYml0cz0iLURXSVRIX1JFU0VSVkVEX0JJVFM9MSI7OworICBubykJc2ltX3Jlc2VydmVkX2JpdHM9Ii1EV0lUSF9SRVNFUlZFRF9CSVRTPTAiOzsKKyAgKikJQUNfTVNHX0VSUk9SKCItLWVuYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cyBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiKTsgc2ltX3Jlc2VydmVkX2JpdHM9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9yZXNlcnZlZF9iaXRzIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyByZXNlcnZlZCBmbGFncyA9ICRzaW1fcmVzZXJ2ZWRfYml0cyIgNj4mMQorZmldLFtzaW1fcmVzZXJ2ZWRfYml0cz0iLURXSVRIX1JFU0VSVkVEX0JJVFM9JHtkZWZhdWx0X3NpbV9yZXNlcnZlZF9iaXRzfSJdKWRubAorXSkKK0FDX1NVQlNUKHNpbV9yZXNlcnZlZF9iaXRzKQorCisKK0FDX0RFRlVOKFNJTV9BQ19PUFRJT05fU01QLAorWworZGVmYXVsdF9zaW1fc21wPSJpZmVsc2UoWyQxXSwsNSxbJDFdKSIKK0FDX0FSR19FTkFCTEUoc2ltLXNtcCwKK1sgIC0tZW5hYmxlLXNpbS1zbXA9bgkJCVNwZWNpZnkgbnVtYmVyIG9mIHByb2Nlc3NvcnMgdG8gY29uZmlndXJlIGZvciAoZGVmYXVsdCAke2RlZmF1bHRfc2ltX3NtcH0pLl0sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9zbXA9Ii1EV0lUSF9TTVA9NSIgOyBzaW1faWdlbl9zbXA9Ii1OIDUiOzsKKyAgbm8pCXNpbV9zbXA9Ii1EV0lUSF9TTVA9MCIgOyBzaW1faWdlbl9zbXA9Ii1OIDAiOzsKKyAgKikJc2ltX3NtcD0iLURXSVRIX1NNUD0kZW5hYmxldmFsIiA7IHNpbV9pZ2VuX3NtcD0iLU4gJGVuYWJsZXZhbCI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zbXAiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNtcCBmbGFncyA9ICRzaW1fc21wIiA2PiYxCitmaV0sW3NpbV9zbXA9Ii1EV0lUSF9TTVA9JHtkZWZhdWx0X3NpbV9zbXB9IiA7IHNpbV9pZ2VuX3NtcD0iLU4gJHtkZWZhdWx0X3NpbV9zbXB9IgoraWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNtcCBmbGFncyA9ICRzaW1fc21wIiA2PiYxCitmaV0pZG5sCitdKQorQUNfU1VCU1Qoc2ltX3NtcCkKKworCitBQ19ERUZVTihTSU1fQUNfT1BUSU9OX1NURENBTEwsCitbCitBQ19BUkdfRU5BQkxFKHNpbS1zdGRjYWxsLAorWyAgLS1lbmFibGUtc2ltLXN0ZGNhbGw9dHlwZQkJVXNlIGFuIGFsdGVybmF0aXZlIGZ1bmN0aW9uIGNhbGwvcmV0dXJuIG1lY2hhbmlzbSAtIHg4Ni9HQ0Mgc3BlY2lmaWMuXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIG5vKQkJc2ltX3N0ZGNhbGw9IiIgOzsKKyAgc3RkKikJCXNpbV9zdGRjYWxsPSItRFdJVEhfU1REQ0FMTD0xIjs7CisgIHllcykJCXNpbV9zdGRjYWxsPSItRFdJVEhfU1REQ0FMTD0xIjs7CisgICopICAgQUNfTVNHX0VSUk9SKCJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1zdGRjYWxsIik7IHNpbV9zdGRjYWxsPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkY2FsbCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgZnVuY3Rpb24gY2FsbCBmbGFncyA9ICRzaW1fc3RkY2FsbCIgNj4mMQorZmldLFtzaW1fc3RkY2FsbD0iIl0pZG5sCitdKQorQUNfU1VCU1Qoc2ltX3N0ZGNhbGwpCisKKworQUNfREVGVU4oU0lNX0FDX09QVElPTl9YT1JfRU5ESUFOLAorWworZGVmYXVsdF9zaW1feG9yX2VuZGlhbj0iaWZlbHNlKFskMV0sLDgsWyQxXSkiCitBQ19BUkdfRU5BQkxFKHNpbS14b3ItZW5kaWFuLAorWyAgLS1lbmFibGUtc2ltLXhvci1lbmRpYW49bgkJU3BlY2lmeSBudW1iZXIgYnl0ZXMgaW52b2x2ZWQgaW4gWE9SIGJpLWVuZGlhbiBtb2RlIChkZWZhdWx0ICR7ZGVmYXVsdF9zaW1feG9yX2VuZGlhbn0pLl0sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV94b3JfZW5kaWFuPSItRFdJVEhfWE9SX0VORElBTj04Ijs7CisgIG5vKQlzaW1feG9yX2VuZGlhbj0iLURXSVRIX1hPUl9FTkRJQU49MCI7OworICAqKQlzaW1feG9yX2VuZGlhbj0iLURXSVRIX1hPUl9FTkRJQU49JGVuYWJsZXZhbCI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV94b3JfZW5kaWFuIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyB4b3ItZW5kaWFuIGZsYWcgPSAkc2ltX3hvcl9lbmRpYW4iIDY+JjEKK2ZpXSxbc2ltX3hvcl9lbmRpYW49Ii1EV0lUSF9YT1JfRU5ESUFOPSR7ZGVmYXVsdF9zaW1feG9yX2VuZGlhbn0iXSlkbmwKK10pCitBQ19TVUJTVChzaW1feG9yX2VuZGlhbikKKworCitkbmwgLS1lbmFibGUtYnVpbGQtd2FybmluZ3MgaXMgZm9yIGRldmVsb3BlcnMgb2YgdGhlIHNpbXVsYXRvci4KK2RubCBpdCBlbmFibGVzIGV4dHJhIEdDQyBzcGVjaWZpYyB3YXJuaW5ncy4KK0FDX0RFRlVOKFNJTV9BQ19PUFRJT05fV0FSTklOR1MsCitbCitBQ19BUkdfRU5BQkxFKGJ1aWxkLXdhcm5pbmdzLAorWyAgLS1lbmFibGUtYnVpbGQtd2FybmluZ3NbPUxJU1RdCQlFbmFibGUgYnVpbGQtdGltZSBjb21waWxlciB3YXJuaW5nc10sCitbYnVpbGRfd2FybmluZ3M9Ii1XYWxsIC1XcG9pbnRlci1hcml0aCAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMiCitjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJOzsKKyAgbm8pCWJ1aWxkX3dhcm5pbmdzPSItdyI7OworICAsKikgICB0PWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImAKKwlidWlsZF93YXJuaW5ncz0iJHtidWlsZF93YXJuaW5nc30gJHt0fSI7OworICAqLCkgICB0PWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImAKKwlidWlsZF93YXJuaW5ncz0iJHt0fSAke2J1aWxkX3dhcm5pbmdzfSI7OworICAqKQlidWlsZF93YXJuaW5ncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRidWlsZF93YXJuaW5ncyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgd2FybmluZyBmbGFncyA9ICRidWlsZF93YXJuaW5ncyIgNj4mMQorZmldLFtidWlsZF93YXJuaW5ncz0iIl0pZG5sCitdKQorQUNfU1VCU1QoYnVpbGRfd2FybmluZ3MpCisKKworZG5sIEdlbmVyYXRlIHRoZSBNYWtlZmlsZSBpbiBhIHRhcmdldCBzcGVjaWZpYyBkaXJlY3RvcnkuCitkbmwgU3Vic3RpdHV0aW9ucyBhcmVuJ3QgcGVyZm9ybWVkIG9uIHRoZSBmaWxlIGluIEFDX1NVQlNUX0ZJTEUsCitkbmwgc28gdGhpcyBpcyBhIGNvdmVyIG1hY3JvIHRvIHR1Y2sgdGhlIGRldGFpbHMgYXdheSBvZiBob3cgd2UgY29wZS4KK2RubCBXZSBjb3BlIGJ5IGhhdmluZyBhdXRvY29uZiBnZW5lcmF0ZSB0d28gZmlsZXMgYW5kIHRoZW4gbWVyZ2UgdGhlbSBpbnRvCitkbmwgb25lIGFmdGVyd2FyZHMuICBUaGUgdHdvIHBpZWNlcyBvZiB0aGUgY29tbW9uIGZyYWdtZW50IGFyZSBpbnNlcnRlZCBpbnRvCitkbmwgdGhlIHRhcmdldCdzIGZyYWdtZW50IGF0IHRoZSBhcHByb3ByaWF0ZSBwb2ludHMuCisKK0FDX0RFRlVOKFNJTV9BQ19PVVRQVVQsCitbCitBQ19MSU5LX0ZJTEVTKCRzaW1fbGlua19maWxlcywgJHNpbV9saW5rX2xpbmtzKQorQUNfT1VUUFVUKE1ha2VmaWxlLnNpbTpNYWtlZmlsZS5pbiBNYWtlLWNvbW1vbi5zaW06Li4vY29tbW9uL01ha2UtY29tbW9uLmluIC5nZGJpbml0Oi4uL2NvbW1vbi9nZGJpbml0LmluLAorW2Nhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgorIHhNYWtlZmlsZSopCisgICBlY2hvICJNZXJnaW5nIE1ha2VmaWxlLnNpbStNYWtlLWNvbW1vbi5zaW0gaW50byBNYWtlZmlsZSAuLi4iCisgICBybSAtZiBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wIE1ha2VmaWxlCisgICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BSRV8vLC9eIyMgRW5kIENPTU1PTl9QUkVfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMS50bXAKKyAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUE9TVF8vLC9eIyMgRW5kIENPTU1PTl9QT1NUXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTIudG1wCisgICBzZWQgLWUgJy9eIyMgQ09NTU9OX1BSRV8vIHIgTWFrZXNpbTEudG1wJyBcCisJLWUgJy9eIyMgQ09NTU9OX1BPU1RfLyByIE1ha2VzaW0yLnRtcCcgXAorCTxNYWtlZmlsZS5zaW0gPk1ha2VmaWxlCisgICBybSAtZiBNYWtlZmlsZS5zaW0gTWFrZS1jb21tb24uc2ltIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAKKyAgIDs7CisgZXNhYworIGNhc2UgIngkQ09ORklHX0hFQURFUlMiIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWMKK10pCitdKQorCisjIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKKyMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KKworIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMworCitBQ19ERUZVTihDWV9XSVRIX05MUywKKyAgW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkXSkKKyAgICBkbmwgRGVmYXVsdCBpcyBlbmFibGVkIE5MUworICAgIEFDX0FSR19FTkFCTEUobmxzLAorICAgICAgWyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydF0sCisgICAgICBVU0VfTkxTPSRlbmFibGV2YWwsIFVTRV9OTFM9eWVzKQorICAgIEFDX01TR19SRVNVTFQoJFVTRV9OTFMpCisgICAgQUNfU1VCU1QoVVNFX05MUykKKworICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCisKKyAgICBkbmwgSWYgd2UgdXNlIE5MUyBmaWd1cmUgb3V0IHdoYXQgbWV0aG9kCisgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgICAgIEFDX0RFRklORShFTkFCTEVfTkxTKQorICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKKyAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCisgICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKKyAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKKyAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKKyAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKKyAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQorICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KKwlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KKwlubHNfY3ZfaGVhZGVyX2ludGw9CisJbmxzX2N2X2hlYWRlcl9saWJndD0KKwlDQVRPQkpFWFQ9Tk9ORQorCisJQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKKwkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAorCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAorCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCisJICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCisJICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCisJCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKKwkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAorCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAorCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQorCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQpCisJICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKKwkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKKwkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCisJCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKKwkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCisJCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAorCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKKwkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKKwkJICBbQ0FUT0JKRVhUPS5nbW8KKwkJICAgREFUQURJUk5BTUU9c2hhcmVdLAorCQkgIFtDQVRPQkpFWFQ9Lm1vCisJCSAgIERBVEFESVJOQU1FPWxpYl0pCisJCUlOU1RPQkpFWFQ9Lm1vCisJICAgICAgZmkKKwkgICAgZmkKKwldKQorCisJZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCisgICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCisKKyAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KKwkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KKwkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KKwkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCisgICAgICAgIGZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgorICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgorICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAorCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCisgICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQorICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKKwkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKKyAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQorCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgICAgICBDQVRPQkpFWFQ9LmdtbworICAgICAgICBJTlNUT0JKRVhUPS5tbworICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQorCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCisJSU5UTExJQlM9JElOVExERVBTCisJTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCisgICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKKyAgICAgIGZpCisKKyAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KKyAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCisJZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQorCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCisJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgorCSAgOiA7CisJZWxzZQorCSAgQUNfTVNHX1JFU1VMVCgKKwkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCisJICBYR0VUVEVYVD0iOiIKKwlmaQorICAgICAgZmkKKworICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCisgICAgICBQT1NVQj1wbworICAgIGVsc2UKKyAgICAgIERBVEFESVJOQU1FPXNoYXJlCisgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCisgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgIGZpCisKKyAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCisgICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KKyAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCisgICAgICBVU0VfTkxTPXllcworICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgZmkKKworICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCisgICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncworICAgIGRubCBpbiBjb25maWd1cmUuaW4uCisgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCisgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKKyAgICBkb25lCisKKyAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KKyAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKKyAgICBBQ19TVUJTVChDQVRBTE9HUykKKyAgICBBQ19TVUJTVChDQVRPQkpFWFQpCisgICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCisgICAgQUNfU1VCU1QoR01PRklMRVMpCisgICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKKyAgICBBQ19TVUJTVChJTlRMREVQUykKKyAgICBBQ19TVUJTVChJTlRMTElCUykKKyAgICBBQ19TVUJTVChJTlRMT0JKUykKKyAgICBBQ19TVUJTVChQT0ZJTEVTKQorICAgIEFDX1NVQlNUKFBPU1VCKQorICBdKQorCitBQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKKyAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAorICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAorICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAorICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCisgICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKKyAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCisKKyAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKK3VuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKKyAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKK19fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKKworICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgorICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCisgICBmaQorICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KKyAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZKQorICAgZmkKKworICAgQU1fTENfTUVTU0FHRVMKKyAgIENZX1dJVEhfTkxTCisKKyAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KKyAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KKyAgICAgICBMSU5HVUFTPQorICAgICBlbHNlCisgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCisgICAgICAgTkVXX0xJTkdVQVM9CisgICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCisgICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCisgICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKKyAgICAgICAgIGVzYWMKKyAgICAgICBkb25lCisgICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKKyAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQorICAgICBmaQorCisgICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgorICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCisgICAgIGZpCisgICBmaQorCisgICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQorICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCisgICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCisgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKKyAgIGVsc2UKKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAorLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgorICAgZmkKKyAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCisKKyAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKKyAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgorICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKKyAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgorCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKKworCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKKyAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgorCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKKyAgICAgIGZpCisgICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgorICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCisJICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKKyAgIGZpCisKKyAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCisgICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0CisgICBkbmwgcGFja2FnZXMuCisgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KKyAgICAgR1RfTk89IiNOTyMiCisgICAgIEdUX1lFUz0KKyAgIGVsc2UKKyAgICAgR1RfTk89CisgICAgIEdUX1lFUz0iI1lFUyMiCisgICBmaQorICAgQUNfU1VCU1QoR1RfTk8pCisgICBBQ19TVUJTVChHVF9ZRVMpCisKKyAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKKyAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCisKKyAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgorICAgbD0KKyAgIEFDX1NVQlNUKGwpCisKKyAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCisgICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKKyAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgorICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCisgICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCisgICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgorCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgorCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCisJIGVsc2UKKwkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgorCSBmaQorICAgICAgZWxzZQorCSBwb3NyY3ByZWZpeD0iLi4vIgorICAgICAgZmkKKyAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCisgICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKKwkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKKyAgIGZpCisgIF0pCisKKyMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKK2RubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKK2RubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKK0FDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCitbIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgorQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQorQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCitbY2FzZSAiWyRdJDEiIGluCisgIC8qKQorICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiBbJDNdOyB0aGVuCisJYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKK2RubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgoraWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKK10pZG5sCisgIDs7Citlc2FjXSlkbmwKKyQxPSIkYWNfY3ZfcGF0aF8kMSIKK2lmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKFskXSQxKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK0FDX1NVQlNUKCQxKWRubAorXSkKKworIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCitBQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKKyAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCisgICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKKyAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKKyAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KKyAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTKQorICAgIGZpCisgIGZpXSkKKworIyBDaGVjayB0byBzZWUgaWYgd2UncmUgcnVubmluZyB1bmRlciBDeWd3aW4zMiwgd2l0aG91dCB1c2luZworIyBBQ19DQU5PTklDQUxfKi4gIElmIHNvLCBzZXQgb3V0cHV0IHZhcmlhYmxlIENZR1dJTjMyIHRvICJ5ZXMiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICJubyIuCisKK2RubCBBTV9DWUdXSU4zMigpCitkbmwgWW91IG1pZ2h0IHRoaW5rIHdlIGNhbiBkbyB0aGlzIGJ5IGNoZWNraW5nIGZvciBhIGN5Z3dpbjMyLXNwZWNpZmljCitkbmwgY3BwIGRlZmluZS4KK0FDX0RFRlVOKEFNX0NZR1dJTjMyLAorW0FDX0NBQ0hFX0NIRUNLKGZvciBDeWd3aW4zMiBlbnZpcm9ubWVudCwgYW1fY3ZfY3lnd2luMzIsCitbQUNfVFJZX0NPTVBJTEUoLFtpbnQgbWFpbiAoKSB7IHJldHVybiBfX0NZR1dJTjMyX187IH1dLAorYW1fY3ZfY3lnd2luMzI9eWVzLCBhbV9jdl9jeWd3aW4zMj1ubykKK3JtIC1mIGNvbmZ0ZXN0Kl0pCitDWUdXSU4zMj0KK3Rlc3QgIiRhbV9jdl9jeWd3aW4zMiIgPSB5ZXMgJiYgQ1lHV0lOMzI9eWVzXSkKKworIyBDaGVjayB0byBzZWUgaWYgd2UncmUgcnVubmluZyB1bmRlciBXaW4zMiwgd2l0aG91dCB1c2luZworIyBBQ19DQU5PTklDQUxfKi4gIElmIHNvLCBzZXQgb3V0cHV0IHZhcmlhYmxlIEVYRUVYVCB0byAiLmV4ZSIuCisjIE90aGVyd2lzZSBzZXQgaXQgdG8gIiIuCisKK2RubCBBTV9FWEVFWFQoKQorZG5sIFRoaXMga25vd3Mgd2UgYWRkIC5leGUgaWYgd2UncmUgYnVpbGRpbmcgaW4gdGhlIEN5Z3dpbjMyCitkbmwgZW52aXJvbm1lbnQuIEJ1dCBpZiB3ZSdyZSBub3QsIHRoZW4gaXQgY29tcGlsZXMgYSB0ZXN0IHByb2dyYW0KK2RubCB0byBzZWUgaWYgdGhlcmUgaXMgYSBzdWZmaXggZm9yIGV4ZWN1dGFibGVzLgorQUNfREVGVU4oQU1fRVhFRVhULAorZG5sIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKUFDX1JFUVVJUkUoW0FNX0NZR1dJTjMyXSkKK0FDX01TR19DSEVDS0lORyhbZm9yIGV4ZWN1dGFibGUgc3VmZml4XSkKK1tBQ19DQUNIRV9WQUwoYW1fY3ZfZXhlZXh0LAorW2lmIHRlc3QgIiRDWUdXSU4zMiIgPSB5ZXM7IHRoZW4KK2FtX2N2X2V4ZWV4dD0uZXhlCitlbHNlCitjYXQgPiBhbV9jX3Rlc3QuYyA8PCAnRU9GJworaW50IG1haW4oKSB7CisvKiBOb3RoaW5nIG5lZWRlZCBoZXJlICovCit9CitFT0YKKyR7Q0MtY2N9IC1vIGFtX2NfdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBhbV9jX3Rlc3QuYyAkTElCUyAxPiY1CithbV9jdl9leGVleHQ9YGxzIGFtX2NfdGVzdC4qIHwgZ3JlcCAtdiBhbV9jX3Rlc3QuYyB8IHNlZCAtZSBzL2FtX2NfdGVzdC8vYAorcm0gLWYgYW1fY190ZXN0Kl0pCit0ZXN0IHgiJHthbV9jdl9leGVleHR9IiA9IHggJiYgYW1fY3ZfZXhlZXh0PW5vCitmaQorRVhFRVhUPSIiCit0ZXN0IHgiJHthbV9jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YW1fY3ZfZXhlZXh0fQorQUNfTVNHX1JFU1VMVCgke2FtX2N2X2V4ZWV4dH0pCitBQ19TVUJTVChFWEVFWFQpXSkKKworCitkbmwgLS1lbmFibGUtY2dlbi1tYWludCBzdXBwb3J0CitBQ19ERUZVTihTSU1fQUNfT1BUSU9OX0NHRU5fTUFJTlQsCitbCitjZ2VuX21haW50PW5vCitkbmwgRGVmYXVsdCBpcyB0byB1c2Ugb25lIGluIGJ1aWxkIHRyZWUuCitjZ2VuPS4uLy4uL2NnZW4vY2dlbgorY2dlbmRpcj0nJChzcmNkaXIpLy4uLy4uL2NnZW4nCitkbmwgSGF2aW5nIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSB0YWtlIGFyZ3VtZW50cyBpcyBhbm90aGVyIHdheSB0byBnby4KK2RubCA/Pz8gT25lIGNhbiBhcmd1ZSAtLXdpdGggaXMgbW9yZSBhcHByb3ByaWF0ZSBpZiBvbmUgd2FudHMgdG8gc3BlY2lmeQorZG5sIGEgZGlyZWN0b3J5IG5hbWUsIGJ1dCB3aGF0IHdlJ3JlIGRvaW5nIGhlcmUgaXMgYW4gZW5hYmxlL2Rpc2FibGUga2luZAorZG5sIG9mIHRoaW5nIGFuZCBzcGVjaWZ5aW5nIGJvdGggLS1lbmFibGUgYW5kIC0td2l0aCBpcyBrbHVua3kuCitkbmwgSWYgeW91IHJlZWVseSB3YW50IHRoaXMgdG8gYmUgLS13aXRoLCBnbyBhaGVhZCBhbmQgY2hhbmdlIGl0LgorQUNfQVJHX0VOQUJMRShjZ2VuLW1haW50LAorWyAgLS1lbmFibGUtY2dlbi1tYWludFs9RElSXSAgICBidWlsZCBjZ2VuIGdlbmVyYXRlZCBmaWxlc10sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCWNnZW5fbWFpbnQ9eWVzIDs7CisgIG5vKQljZ2VuX21haW50PW5vIDs7CisgICopCisJIyBhcmd1bWVudCBpcyBjZ2VuIGluc3RhbGwgZGlyZWN0b3J5IChub3QgaW1wbGVtZW50ZWQgeWV0KS4KKwkjIEhhdmluZyBhIGBzaGFyZScgZGlyZWN0b3J5IG1pZ2h0IGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSAuc2NtLAorCSMgLmNwdSwgZXRjLiBmaWxlcy4KKwljZ2VuZGlyPSR7Y2dlbl9tYWludH0vbGliL2NnZW4KKwljZ2VuPSR7Y2dlbmRpcn0vYmluL2NnZW4KKwk7OworZXNhY10pZG5sCitkbmwgQU1fQ09ORElUSU9OQUwoQ0dFTl9NQUlOVCwgdGVzdCB4JHtjZ2VuX21haW50fSAhPSB4bm8pCitpZiB0ZXN0IHgke2NnZW5fbWFpbnR9ICE9IHhubyA7IHRoZW4KKyAgQ0dFTl9NQUlOVD0nJworZWxzZQorICBDR0VOX01BSU5UPScjJworZmkKK0FDX1NVQlNUKENHRU5fTUFJTlQpCitBQ19TVUJTVChjZ2VuZGlyKQorQUNfU1VCU1QoY2dlbikKK10pCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2NhbGxiYWNrLmMgYi9zaW0vY29tbW9uL2NhbGxiYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThhMjhjNAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vY2FsbGJhY2suYwpAQCAtMCwwICsxLDgxMCBAQAorLyogUmVtb3RlIHRhcmdldCBjYWxsYmFjayByb3V0aW5lcy4KKyAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBwcm92aWRlcyBhIHN0YW5kYXJkIHdheSBmb3IgdGFyZ2V0cyB0byB0YWxrIHRvIHRoZSBob3N0IE9TCisgICBsZXZlbC4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2Vsc2UKKyNpbmNsdWRlIDx2YXJhcmdzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgInRhcmctdmFscy5oIgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKy8qID8/PyBzaW1fY2JfcHJpbnRmIHNob3VsZCBiZSBjYl9wcmludGYsIGJ1dCB1bnRpbCB0aGUgY2FsbGJhY2sgc3VwcG9ydCBpcworICAgYnJva2VuIG91dCBvZiB0aGUgc2ltdWxhdG9yIGRpcmVjdG9yeSwgdGhlc2UgYXJlIGhlcmUgdG8gbm90IHJlcXVpcmUKKyAgIHNpbS11dGlscy5oLiAgKi8KK3ZvaWQgc2ltX2NiX3ByaW50ZiBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgLi4uKSk7Cit2b2lkIHNpbV9jYl9lcHJpbnRmIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKKworZXh0ZXJuIENCX1RBUkdFVF9ERUZTX01BUCBjYl9pbml0X3N5c2NhbGxfbWFwW107CitleHRlcm4gQ0JfVEFSR0VUX0RFRlNfTUFQIGNiX2luaXRfZXJybm9fbWFwW107CitleHRlcm4gQ0JfVEFSR0VUX0RFRlNfTUFQIGNiX2luaXRfb3Blbl9tYXBbXTsKKworZXh0ZXJuIGludCBzeXN0ZW0gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CisKK3N0YXRpYyBpbnQgb3NfaW5pdCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKK3N0YXRpYyBpbnQgb3Nfc2h1dGRvd24gUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7CitzdGF0aWMgaW50IG9zX3VubGluayBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKikpOworc3RhdGljIGxvbmcgb3NfdGltZSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGxvbmcgKikpOworc3RhdGljIGludCBvc19zeXN0ZW0gUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBpbnQgb3NfcmVuYW1lIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBpbnQgb3Nfd3JpdGVfc3Rkb3V0IFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIG9zX2ZsdXNoX3N0ZG91dCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKK3N0YXRpYyBpbnQgb3Nfd3JpdGVfc3RkZXJyIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKK3N0YXRpYyB2b2lkIG9zX2ZsdXNoX3N0ZGVyciBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKK3N0YXRpYyBpbnQgb3Nfd3JpdGUgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50KSk7CitzdGF0aWMgaW50IG9zX3JlYWRfc3RkaW4gUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjaGFyICosIGludCkpOworc3RhdGljIGludCBvc19yZWFkIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50LCBjaGFyICosIGludCkpOworc3RhdGljIGludCBvc19vcGVuIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKK3N0YXRpYyBpbnQgb3NfbHNlZWsgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQsIGxvbmcsIGludCkpOworc3RhdGljIGludCBvc19pc2F0dHkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKK3N0YXRpYyBpbnQgb3NfZ2V0X2Vycm5vIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKikpOworc3RhdGljIGludCBvc19jbG9zZSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOworc3RhdGljIHZvaWQgb3NfdnByaW50Zl9maWx0ZXJlZCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworc3RhdGljIHZvaWQgb3NfZXZwcmludGZfZmlsdGVyZWQgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKK3N0YXRpYyB2b2lkIG9zX2Vycm9yIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKK3N0YXRpYyBpbnQgZmRtYXAgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKK3N0YXRpYyBpbnQgZmRiYWQgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKK3N0YXRpYyBpbnQgd3JhcCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOworCisvKiBTZXQgdGhlIGNhbGxiYWNrIGNvcHkgb2YgZXJybm8gZnJvbSB3aGF0IHdlIHNlZSBub3cuICAqLworCitzdGF0aWMgaW50IAord3JhcCAocCwgdmFsKQorICAgICBob3N0X2NhbGxiYWNrICpwOworICAgICBpbnQgdmFsOworeworICBwLT5sYXN0X2Vycm5vID0gZXJybm87CisgIHJldHVybiB2YWw7Cit9CisKKy8qIE1ha2Ugc3VyZSB0aGUgRkQgcHJvdmlkZWQgaXMgb2suICBJZiBub3QsIHJldHVybiBub24temVybworICAgYW5kIHNldCBlcnJuby4gKi8KKworc3RhdGljIGludCAKK2ZkYmFkIChwLCBmZCkKKyAgICAgaG9zdF9jYWxsYmFjayAqcDsKKyAgICAgaW50IGZkOworeworICBpZiAoZmQgPCAwIHx8IGZkID4gTUFYX0NBTExCQUNLX0ZEUyB8fCAhcC0+ZmRvcGVuW2ZkXSkKKyAgICB7CisgICAgICBwLT5sYXN0X2Vycm5vID0gRUlOVkFMOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgCitmZG1hcCAocCwgZmQpCisgICAgIGhvc3RfY2FsbGJhY2sgKnA7CisgICAgIGludCBmZDsKK3sKKyAgcmV0dXJuIHAtPmZkbWFwW2ZkXTsKK30KKworc3RhdGljIGludCAKK29zX2Nsb3NlIChwLCBmZCkKKyAgICAgaG9zdF9jYWxsYmFjayAqcDsKKyAgICAgaW50IGZkOworeworICBpbnQgcmVzdWx0OworCisgIHJlc3VsdCA9IGZkYmFkIChwLCBmZCk7CisgIGlmIChyZXN1bHQpCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgcmVzdWx0ID0gd3JhcCAocCwgY2xvc2UgKGZkbWFwIChwLCBmZCkpKTsKKyAgaWYgKHJlc3VsdCA9PSAwICYmICFwLT5hbHdheXNvcGVuW2ZkXSkKKyAgICBwLT5mZG9wZW5bZmRdID0gMDsKKworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIHRha2VuIGZyb20gZ2RiL3V0aWwuYzpub3RpY2VfcXVpdCgpIC0gc2hvdWxkIGJlIGluIGEgbGlicmFyeSAqLworCisKKyNpZiBkZWZpbmVkKF9fR08zMl9fKSB8fCBkZWZpbmVkIChfTVNDX1ZFUikKK3N0YXRpYyBpbnQKK29zX3BvbGxfcXVpdCAocCkKKyAgICAgaG9zdF9jYWxsYmFjayAqcDsKK3sKKyNpZiBkZWZpbmVkKF9fR08zMl9fKQorICBpbnQga2JoaXQgKCk7CisgIGludCBnZXRrZXkgKCk7CisgIGlmIChrYmhpdCAoKSkKKyAgICB7CisgICAgICBpbnQgayA9IGdldGtleSAoKTsKKyAgICAgIGlmIChrID09IDEpCisJeworCSAgcmV0dXJuIDE7CisJfQorICAgICAgZWxzZSBpZiAoayA9PSAyKQorCXsKKwkgIHJldHVybiAxOworCX0KKyAgICAgIGVsc2UgCisJeworCSAgc2ltX2NiX2VwcmludGYgKHAsICJDVFJMLUEgdG8gcXVpdCwgQ1RSTC1CIHRvIHF1aXQgaGFyZGVyXG4iKTsKKwl9CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZCAoX01TQ19WRVIpCisgIC8qIE5CIC0gdGhpcyB3aWxsIG5vdCBjb21waWxlISAqLworICBpbnQgayA9IHdpbjMycG9sbHF1aXQoKTsKKyAgaWYgKGsgPT0gMSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZSBpZiAoayA9PSAyKQorICAgIHJldHVybiAxOworI2VuZGlmCisgIHJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgb3NfcG9sbF9xdWl0IDAKKyNlbmRpZiAvKiBkZWZpbmVkKF9fR08zMl9fKSB8fCBkZWZpbmVkKF9NU0NfVkVSKSAqLworCitzdGF0aWMgaW50IAorb3NfZ2V0X2Vycm5vIChwKQorICAgICBob3N0X2NhbGxiYWNrICpwOworeworICByZXR1cm4gY2JfaG9zdF90b190YXJnZXRfZXJybm8gKHAsIHAtPmxhc3RfZXJybm8pOworfQorCisKK3N0YXRpYyBpbnQgCitvc19pc2F0dHkgKHAsIGZkKQorICAgICBob3N0X2NhbGxiYWNrICpwOworICAgICBpbnQgZmQ7Cit7CisgIGludCByZXN1bHQ7CisKKyAgcmVzdWx0ID0gZmRiYWQgKHAsIGZkKTsKKyAgaWYgKHJlc3VsdCkKKyAgICByZXR1cm4gcmVzdWx0OworICByZXN1bHQgPSB3cmFwIChwLCBpc2F0dHkgKGZkbWFwIChwLCBmZCkpKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IAorb3NfbHNlZWsgKHAsIGZkLCBvZmYsIHdheSkKKyAgICAgaG9zdF9jYWxsYmFjayAqcDsKKyAgICAgaW50IGZkOworICAgICBsb25nIG9mZjsKKyAgICAgaW50IHdheTsKK3sKKyAgaW50IHJlc3VsdDsKKworICByZXN1bHQgPSBmZGJhZCAocCwgZmQpOworICBpZiAocmVzdWx0KQorICAgIHJldHVybiByZXN1bHQ7CisgIHJlc3VsdCA9IGxzZWVrIChmZG1hcCAocCwgZmQpLCBvZmYsIHdheSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgCitvc19vcGVuIChwLCBuYW1lLCBmbGFncykKKyAgICAgaG9zdF9jYWxsYmFjayAqcDsKKyAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgaW50IGZsYWdzOworeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9DQUxMQkFDS19GRFM7IGkrKykKKyAgICB7CisgICAgICBpZiAoIXAtPmZkb3BlbltpXSkKKwl7CisJICBpbnQgZiA9IG9wZW4gKG5hbWUsIGNiX3RhcmdldF90b19ob3N0X29wZW4gKHAsIGZsYWdzKSwgMDY0NCk7CisJICBpZiAoZiA8IDApCisJICAgIHsKKwkgICAgICBwLT5sYXN0X2Vycm5vID0gZXJybm87CisJICAgICAgcmV0dXJuIGY7CisJICAgIH0KKwkgIHAtPmZkb3BlbltpXSA9IDE7CisJICBwLT5mZG1hcFtpXSA9IGY7CisJICByZXR1cm4gaTsKKwl9CisgICAgfQorICBwLT5sYXN0X2Vycm5vID0gRU1GSUxFOworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgCitvc19yZWFkIChwLCBmZCwgYnVmLCBsZW4pCisgICAgIGhvc3RfY2FsbGJhY2sgKnA7CisgICAgIGludCBmZDsKKyAgICAgY2hhciAqYnVmOworICAgICBpbnQgbGVuOworeworICBpbnQgcmVzdWx0OworCisgIHJlc3VsdCA9IGZkYmFkIChwLCBmZCk7CisgIGlmIChyZXN1bHQpCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgcmVzdWx0ID0gd3JhcCAocCwgcmVhZCAoZmRtYXAgKHAsIGZkKSwgYnVmLCBsZW4pKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCAKK29zX3JlYWRfc3RkaW4gKHAsIGJ1ZiwgbGVuKQorICAgICBob3N0X2NhbGxiYWNrICpwOworICAgICBjaGFyICpidWY7CisgICAgIGludCBsZW47Cit7CisgIHJldHVybiB3cmFwIChwLCByZWFkICgwLCBidWYsIGxlbikpOworfQorCitzdGF0aWMgaW50IAorb3Nfd3JpdGUgKHAsIGZkLCBidWYsIGxlbikKKyAgICAgaG9zdF9jYWxsYmFjayAqcDsKKyAgICAgaW50IGZkOworICAgICBjb25zdCBjaGFyICpidWY7CisgICAgIGludCBsZW47Cit7CisgIGludCByZXN1bHQ7CisgIGludCByZWFsX2ZkOworCisgIHJlc3VsdCA9IGZkYmFkIChwLCBmZCk7CisgIGlmIChyZXN1bHQpCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgcmVhbF9mZCA9IGZkbWFwIChwLCBmZCk7CisgIHN3aXRjaCAocmVhbF9mZCkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJlc3VsdCA9IHdyYXAgKHAsIHdyaXRlIChyZWFsX2ZkLCBidWYsIGxlbikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgcmVzdWx0ID0gcC0+d3JpdGVfc3Rkb3V0IChwLCBidWYsIGxlbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICByZXN1bHQgPSBwLT53cml0ZV9zdGRlcnIgKHAsIGJ1ZiwgbGVuKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCAKK29zX3dyaXRlX3N0ZG91dCAocCwgYnVmLCBsZW4pCisgICAgIGhvc3RfY2FsbGJhY2sgKnA7CisgICAgIGNvbnN0IGNoYXIgKmJ1ZjsKKyAgICAgaW50IGxlbjsKK3sKKyAgcmV0dXJuIGZ3cml0ZSAoYnVmLCAxLCBsZW4sIHN0ZG91dCk7Cit9CisKK3N0YXRpYyB2b2lkCitvc19mbHVzaF9zdGRvdXQgKHApCisgICAgIGhvc3RfY2FsbGJhY2sgKnA7Cit7CisgIGZmbHVzaCAoc3Rkb3V0KTsKK30KKworc3RhdGljIGludCAKK29zX3dyaXRlX3N0ZGVyciAocCwgYnVmLCBsZW4pCisgICAgIGhvc3RfY2FsbGJhY2sgKnA7CisgICAgIGNvbnN0IGNoYXIgKmJ1ZjsKKyAgICAgaW50IGxlbjsKK3sKKyAgcmV0dXJuIGZ3cml0ZSAoYnVmLCAxLCBsZW4sIHN0ZGVycik7Cit9CisKK3N0YXRpYyB2b2lkCitvc19mbHVzaF9zdGRlcnIgKHApCisgICAgIGhvc3RfY2FsbGJhY2sgKnA7Cit7CisgIGZmbHVzaCAoc3RkZXJyKTsKK30KKworc3RhdGljIGludCAKK29zX3JlbmFtZSAocCwgZjEsIGYyKQorICAgICBob3N0X2NhbGxiYWNrICpwOworICAgICBjb25zdCBjaGFyICpmMTsKKyAgICAgY29uc3QgY2hhciAqZjI7Cit7CisgIHJldHVybiB3cmFwIChwLCByZW5hbWUgKGYxLCBmMikpOworfQorCisKK3N0YXRpYyBpbnQKK29zX3N5c3RlbSAocCwgcykKKyAgICAgaG9zdF9jYWxsYmFjayAqcDsKKyAgICAgY29uc3QgY2hhciAqczsKK3sKKyAgcmV0dXJuIHdyYXAgKHAsIHN5c3RlbSAocykpOworfQorCitzdGF0aWMgbG9uZyAKK29zX3RpbWUgKHAsIHQpCisgICAgIGhvc3RfY2FsbGJhY2sgKnA7CisgICAgIGxvbmcgKnQ7Cit7CisgIHJldHVybiB3cmFwIChwLCB0aW1lICh0KSk7Cit9CisKKworc3RhdGljIGludCAKK29zX3VubGluayAocCwgZjEpCisgICAgIGhvc3RfY2FsbGJhY2sgKnA7CisgICAgIGNvbnN0IGNoYXIgKmYxOworeworICByZXR1cm4gd3JhcCAocCwgdW5saW5rIChmMSkpOworfQorCitzdGF0aWMgaW50Citvc19zdGF0IChwLCBmaWxlLCBidWYpCisgICAgIGhvc3RfY2FsbGJhY2sgKnA7CisgICAgIGNvbnN0IGNoYXIgKmZpbGU7CisgICAgIHN0cnVjdCBzdGF0ICpidWY7Cit7CisgIC8qID8/PyBUaGVyZSBpcyBhbiBpc3N1ZSBvZiB3aGVuIHRvIHRyYW5zbGF0ZSB0byB0aGUgdGFyZ2V0IGxheW91dC4KKyAgICAgT25lIGNvdWxkIGRvIHRoYXQgaW5zaWRlIHRoaXMgZnVuY3Rpb24sIG9yIG9uZSBjb3VsZCBoYXZlIHRoZQorICAgICBjYWxsZXIgZG8gaXQuICBJdCdzIG1vcmUgZmxleGlibGUgdG8gbGV0IHRoZSBjYWxsZXIgZG8gaXQsIHRob3VnaAorICAgICBJJ20gbm90IHN1cmUgdGhlIGZsZXhpYmlsaXR5IHdpbGwgZXZlciBiZSB1c2VmdWwuICAqLworICByZXR1cm4gd3JhcCAocCwgc3RhdCAoZmlsZSwgYnVmKSk7Cit9CisKK3N0YXRpYyBpbnQKK29zX2ZzdGF0IChwLCBmZCwgYnVmKQorICAgICBob3N0X2NhbGxiYWNrICpwOworICAgICBpbnQgZmQ7CisgICAgIHN0cnVjdCBzdGF0ICpidWY7Cit7CisgIGlmIChmZGJhZCAocCwgZmQpKQorICAgIHJldHVybiAtMTsKKyAgLyogPz8/IFRoZXJlIGlzIGFuIGlzc3VlIG9mIHdoZW4gdG8gdHJhbnNsYXRlIHRvIHRoZSB0YXJnZXQgbGF5b3V0LgorICAgICBPbmUgY291bGQgZG8gdGhhdCBpbnNpZGUgdGhpcyBmdW5jdGlvbiwgb3Igb25lIGNvdWxkIGhhdmUgdGhlCisgICAgIGNhbGxlciBkbyBpdC4gIEl0J3MgbW9yZSBmbGV4aWJsZSB0byBsZXQgdGhlIGNhbGxlciBkbyBpdCwgdGhvdWdoCisgICAgIEknbSBub3Qgc3VyZSB0aGUgZmxleGliaWxpdHkgd2lsbCBldmVyIGJlIHVzZWZ1bC4gICovCisgIHJldHVybiB3cmFwIChwLCBmc3RhdCAoZmRtYXAgKHAsIGZkKSwgYnVmKSk7Cit9CisKK3N0YXRpYyBpbnQKK29zX3NodXRkb3duIChwKQorICAgICBob3N0X2NhbGxiYWNrICpwOworeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9DQUxMQkFDS19GRFM7IGkrKykKKyAgICB7CisgICAgICBpZiAocC0+ZmRvcGVuW2ldICYmICFwLT5hbHdheXNvcGVuW2ldKSB7CisJY2xvc2UgKHAtPmZkbWFwW2ldKTsKKwlwLT5mZG9wZW5baV0gPSAwOworICAgICAgfQorICAgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK29zX2luaXQgKHApCisgICAgIGhvc3RfY2FsbGJhY2sgKnA7Cit7CisgIGludCBpOworCisgIG9zX3NodXRkb3duIChwKTsKKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICB7CisgICAgICBwLT5mZG1hcFtpXSA9IGk7CisgICAgICBwLT5mZG9wZW5baV0gPSAxOworICAgICAgcC0+YWx3YXlzb3BlbltpXSA9IDE7CisgICAgfQorCisgIHAtPnN5c2NhbGxfbWFwID0gY2JfaW5pdF9zeXNjYWxsX21hcDsKKyAgcC0+ZXJybm9fbWFwID0gY2JfaW5pdF9lcnJub19tYXA7CisgIHAtPm9wZW5fbWFwID0gY2JfaW5pdF9vcGVuX21hcDsKKworICByZXR1cm4gMTsKK30KKworLyogREVQUkVDSUFURUQgKi8KKworLyogVkFSQVJHUyAqLworc3RhdGljIHZvaWQKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKK29zX3ByaW50Zl9maWx0ZXJlZCAoaG9zdF9jYWxsYmFjayAqcCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisjZWxzZQorb3NfcHJpbnRmX2ZpbHRlcmVkIChwLCB2YV9hbGlzdCkKKyAgICAgaG9zdF9jYWxsYmFjayAqcDsKKyAgICAgdmFfZGNsCisjZW5kaWYKK3sKKyAgdmFfbGlzdCBhcmdzOworI2lmZGVmIEFOU0lfUFJPVE9UWVBFUworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyNlbHNlCisgIGNoYXIgKmZvcm1hdDsKKworICB2YV9zdGFydCAoYXJncyk7CisgIGZvcm1hdCA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKKyNlbmRpZgorCisgIHZmcHJpbnRmIChzdGRvdXQsIGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7Cit9CisKKy8qIFZBUkFSR1MgKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCitvc192cHJpbnRmX2ZpbHRlcmVkIChob3N0X2NhbGxiYWNrICpwLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKKyNlbHNlCitvc192cHJpbnRmX2ZpbHRlcmVkIChwLCBmb3JtYXQsIGFyZ3MpCisgICAgIGhvc3RfY2FsbGJhY2sgKnA7CisgICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKKyAgICAgdmFfbGlzdCBhcmdzOworI2VuZGlmCit7CisgIHZwcmludGYgKGZvcm1hdCwgYXJncyk7Cit9CisKKy8qIFZBUkFSR1MgKi8KK3N0YXRpYyB2b2lkCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCitvc19ldnByaW50Zl9maWx0ZXJlZCAoaG9zdF9jYWxsYmFjayAqcCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCisjZWxzZQorb3NfZXZwcmludGZfZmlsdGVyZWQgKHAsIGZvcm1hdCwgYXJncykKKyAgICAgaG9zdF9jYWxsYmFjayAqcDsKKyAgICAgY29uc3QgY2hhciAqZm9ybWF0OworICAgICB2YV9saXN0IGFyZ3M7CisjZW5kaWYKK3sKKyAgdmZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKK30KKworLyogVkFSQVJHUyAqLworc3RhdGljIHZvaWQKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKK29zX2Vycm9yIChob3N0X2NhbGxiYWNrICpwLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKyNlbHNlCitvc19lcnJvciAocCwgdmFfYWxpc3QpCisgICAgIGhvc3RfY2FsbGJhY2sgKnA7CisgICAgIHZhX2RjbAorI2VuZGlmCit7CisgIHZhX2xpc3QgYXJnczsKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisjZWxzZQorICBjaGFyICpmb3JtYXQ7CisKKyAgdmFfc3RhcnQgKGFyZ3MpOworICBmb3JtYXQgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7CisjZW5kaWYKKworICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOworICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworCisgIHZhX2VuZCAoYXJncyk7CisgIGV4aXQgKDEpOworfQorCitob3N0X2NhbGxiYWNrIGRlZmF1bHRfY2FsbGJhY2sgPQoreworICBvc19jbG9zZSwKKyAgb3NfZ2V0X2Vycm5vLAorICBvc19pc2F0dHksCisgIG9zX2xzZWVrLAorICBvc19vcGVuLAorICBvc19yZWFkLAorICBvc19yZWFkX3N0ZGluLAorICBvc19yZW5hbWUsCisgIG9zX3N5c3RlbSwKKyAgb3NfdGltZSwKKyAgb3NfdW5saW5rLAorICBvc193cml0ZSwKKyAgb3Nfd3JpdGVfc3Rkb3V0LAorICBvc19mbHVzaF9zdGRvdXQsCisgIG9zX3dyaXRlX3N0ZGVyciwKKyAgb3NfZmx1c2hfc3RkZXJyLAorCisgIG9zX3N0YXQsCisgIG9zX2ZzdGF0LAorCisgIG9zX3BvbGxfcXVpdCwKKworICBvc19zaHV0ZG93biwKKyAgb3NfaW5pdCwKKworICBvc19wcmludGZfZmlsdGVyZWQsICAvKiBkZXByZWNhdGVkICovCisKKyAgb3NfdnByaW50Zl9maWx0ZXJlZCwKKyAgb3NfZXZwcmludGZfZmlsdGVyZWQsCisgIG9zX2Vycm9yLAorCisgIDAsIAkJLyogbGFzdCBlcnJubyAqLworCisgIHsgMCwgfSwJLyogZmRtYXAgKi8KKyAgeyAwLCB9LAkvKiBmZG9wZW4gKi8KKyAgeyAwLCB9LAkvKiBhbHdheXNvcGVuICovCisKKyAgMCwgLyogc3lzY2FsbF9tYXAgKi8KKyAgMCwgLyogZXJybm9fbWFwICovCisgIDAsIC8qIG9wZW5fbWFwICovCisgIDAsIC8qIHNpZ25hbF9tYXAgKi8KKyAgMCwgLyogc3RhdF9tYXAgKi8KKwkKKyAgSE9TVF9DQUxMQkFDS19NQUdJQywKK307CisMCisvKiBSZWFkIGluIGEgZmlsZSBkZXNjcmliaW5nIHRoZSB0YXJnZXQncyBzeXN0ZW0gY2FsbCB2YWx1ZXMuCisgICBFLmcuIG1heWJlIHNvbWVvbmUgd2lsbCB3YW50IHRvIHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBuZXdsaWIuCisgICBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgYmFzaWMgc3lzdGVtIGNhbGwgcmVjb2duaXRpb24gYW5kIHZhbHVlIHBhc3NpbmcvCisgICByZXR1cm5pbmcgaXMgc3VwcG9ydGVkLiAgU28gbWF5YmUgc29tZSBjb2RpbmcvcmVjb21waWxhdGlvbiB3aWxsIGJlCisgICBuZWNlc3NhcnksIGJ1dCBub3QgYXMgbXVjaC4KKworICAgSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgZXhpc3RpbmcgbWFwcGluZyBpcyBub3QgY2hhbmdlZC4gICovCisKK0NCX1JDCitjYl9yZWFkX3RhcmdldF9zeXNjYWxsX21hcHMgKGNiLCBmaWxlKQorICAgICBob3N0X2NhbGxiYWNrICpjYjsKKyAgICAgY29uc3QgY2hhciAqZmlsZTsKK3sKKyAgQ0JfVEFSR0VUX0RFRlNfTUFQICpzeXNjYWxsX21hcCwgKmVycm5vX21hcCwgKm9wZW5fbWFwLCAqc2lnbmFsX21hcDsKKyAgY29uc3QgY2hhciAqc3RhdF9tYXA7CisgIEZJTEUgKmY7CisKKyAgaWYgKChmID0gZm9wZW4gKGZpbGUsICJyIikpID09IE5VTEwpCisgICAgcmV0dXJuIENCX1JDX0FDQ0VTUzsKKworICAvKiAuLi4gcmVhZCBpbiBhbmQgcGFyc2UgZmlsZSAuLi4gKi8KKworICBmY2xvc2UgKGYpOworICByZXR1cm4gQ0JfUkNfTk9fTUVNOyAvKiBGSVhNRTp3aXAgKi8KKworICAvKiBGcmVlIHN0b3JhZ2UgYWxsb2NhdGVkIGZvciBhbnkgZXhpc3RpbmcgbWFwcy4gICovCisgIGlmIChjYi0+c3lzY2FsbF9tYXApCisgICAgZnJlZSAoY2ItPnN5c2NhbGxfbWFwKTsKKyAgaWYgKGNiLT5lcnJub19tYXApCisgICAgZnJlZSAoY2ItPmVycm5vX21hcCk7CisgIGlmIChjYi0+b3Blbl9tYXApCisgICAgZnJlZSAoY2ItPm9wZW5fbWFwKTsKKyAgaWYgKGNiLT5zaWduYWxfbWFwKQorICAgIGZyZWUgKGNiLT5zaWduYWxfbWFwKTsKKyAgaWYgKGNiLT5zdGF0X21hcCkKKyAgICBmcmVlICgoUFRSKSBjYi0+c3RhdF9tYXApOworCisgIGNiLT5zeXNjYWxsX21hcCA9IHN5c2NhbGxfbWFwOworICBjYi0+ZXJybm9fbWFwID0gZXJybm9fbWFwOworICBjYi0+b3Blbl9tYXAgPSBvcGVuX21hcDsKKyAgY2ItPnNpZ25hbF9tYXAgPSBzaWduYWxfbWFwOworICBjYi0+c3RhdF9tYXAgPSBzdGF0X21hcDsKKworICByZXR1cm4gQ0JfUkNfT0s7Cit9CisKKy8qIFRyYW5zbGF0ZSB0aGUgdGFyZ2V0J3MgdmVyc2lvbiBvZiBhIHN5c2NhbGwgbnVtYmVyIHRvIHRoZSBob3N0J3MuCisgICBUaGlzIGlzbid0IGFjdHVhbGx5IHRoZSBob3N0J3MgdmVyc2lvbiwgcmF0aGVyIGEgY2Fub25pY2FsIGZvcm0uCisgICA/Pz8gUGVyaGFwcyB0aGlzIHNob3VsZCBiZSByZW5hbWVkIHRvIC4uLl9jYW5vbl9zeXNjYWxsLiAgKi8KKworaW50CitjYl90YXJnZXRfdG9faG9zdF9zeXNjYWxsIChjYiwgdGFyZ2V0X3ZhbCkKKyAgICAgaG9zdF9jYWxsYmFjayAqY2I7CisgICAgIGludCB0YXJnZXRfdmFsOworeworICBDQl9UQVJHRVRfREVGU19NQVAgKm07CisKKyAgZm9yIChtID0gJmNiLT5zeXNjYWxsX21hcFswXTsgbS0+dGFyZ2V0X3ZhbCAhPSAtMTsgKyttKQorICAgIGlmIChtLT50YXJnZXRfdmFsID09IHRhcmdldF92YWwpCisgICAgICByZXR1cm4gbS0+aG9zdF92YWw7CisKKyAgcmV0dXJuIC0xOworfQorCisvKiBGSVhNRTogc29ydCB0YWJsZXMgaWYgbGFyZ2UuCisgICBBbHRlcm5hdGl2ZWx5LCBhbiBvYnZpb3VzIGltcHJvdmVtZW50IGZvciBlcnJubyBjb252ZXJzaW9uIGlzCisgICB0byBtYWNoaW5lIGdlbmVyYXRlIGEgZnVuY3Rpb24gd2l0aCBhIGxhcmdlIHN3aXRjaCgpLiAgKi8KKworLyogVHJhbnNsYXRlIHRoZSBob3N0J3MgdmVyc2lvbiBvZiBlcnJubyB0byB0aGUgdGFyZ2V0J3MuICAqLworCitpbnQKK2NiX2hvc3RfdG9fdGFyZ2V0X2Vycm5vIChjYiwgaG9zdF92YWwpCisgICAgIGhvc3RfY2FsbGJhY2sgKmNiOworICAgICBpbnQgaG9zdF92YWw7Cit7CisgIENCX1RBUkdFVF9ERUZTX01BUCAqbTsKKworICBmb3IgKG0gPSAmY2ItPmVycm5vX21hcFswXTsgbS0+aG9zdF92YWw7ICsrbSkKKyAgICBpZiAobS0+aG9zdF92YWwgPT0gaG9zdF92YWwpCisgICAgICByZXR1cm4gbS0+dGFyZ2V0X3ZhbDsKKworICAvKiA/Pz8gV2hpY2ggZXJyb3IgdG8gcmV0dXJuIGluIHRoaXMgY2FzZSBpcyB1cCBmb3IgZ3JhYnMuCisgICAgIE5vdGUgdGhhdCBzb21lIG1pc3NpbmcgdmFsdWVzIG1heSBoYXZlIHN0YW5kYXJkIGFsdGVybmF0aXZlcy4KKyAgICAgRm9yIG5vdyByZXR1cm4gMCBhbmQgcmVxdWlyZSBjYWxsZXIgdG8gZGVhbCB3aXRoIGl0LiAgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qIEdpdmVuIGEgc2V0IG9mIHRhcmdldCBiaXRtYXNrcyBmb3IgdGhlIG9wZW4gc3lzdGVtIGNhbGwsCisgICByZXR1cm4gdGhlIGhvc3QgZXF1aXZhbGVudC4KKyAgIE1hcHBpbmcgb3BlbiBmbGFnIHZhbHVlcyBpcyBiZXN0IGRvbmUgYnkgbG9vcGluZyBzbyB0aGVyZSdzIG5vIG5lZWQKKyAgIHRvIG1hY2hpbmUgZ2VuZXJhdGUgdGhpcyBmdW5jdGlvbi4gICovCisKK2ludAorY2JfdGFyZ2V0X3RvX2hvc3Rfb3BlbiAoY2IsIHRhcmdldF92YWwpCisgICAgIGhvc3RfY2FsbGJhY2sgKmNiOworICAgICBpbnQgdGFyZ2V0X3ZhbDsKK3sKKyAgaW50IGhvc3RfdmFsID0gMDsKKyAgQ0JfVEFSR0VUX0RFRlNfTUFQICptOworCisgIGZvciAobSA9ICZjYi0+b3Blbl9tYXBbMF07IG0tPmhvc3RfdmFsICE9IC0xOyArK20pCisgICAgeworICAgICAgc3dpdGNoIChtLT50YXJnZXRfdmFsKQorCXsKKwkgIC8qIE9fUkRPTkxZIGNhbiBiZSAoYW5kIHVzdWFsbHkgaXMpIDAgd2hpY2ggbmVlZHMgdG8gYmUgdHJlYXRlZAorCSAgICAgc3BlY2lhbGx5LiAgKi8KKwljYXNlIFRBUkdFVF9PX1JET05MWSA6CisJY2FzZSBUQVJHRVRfT19XUk9OTFkgOgorCWNhc2UgVEFSR0VUX09fUkRXUiA6CisJICBpZiAoKHRhcmdldF92YWwgJiAoVEFSR0VUX09fUkRPTkxZIHwgVEFSR0VUX09fV1JPTkxZIHwgVEFSR0VUX09fUkRXUikpCisJICAgICAgPT0gbS0+dGFyZ2V0X3ZhbCkKKwkgICAgaG9zdF92YWwgfD0gbS0+aG9zdF92YWw7CisJICAvKiBIYW5kbGUgdGhlIGhvc3QvdGFyZ2V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIGJpbmFyeSBhbmQKKyAgICAgICAgICAgICB0ZXh0IG1vZGUuICBPbmx5IG9uZSBjYXNlIGlzIG9mIGltcG9ydGFuY2UgKi8KKyNpZiAhIGRlZmluZWQgKFRBUkdFVF9PX0JJTkFSWSkgJiYgZGVmaW5lZCAoT19CSU5BUlkpCisJICBob3N0X3ZhbCB8PSBPX0JJTkFSWTsKKyNlbmRpZgorCSAgYnJlYWs7CisJZGVmYXVsdCA6CisJICBpZiAoKG0tPnRhcmdldF92YWwgJiB0YXJnZXRfdmFsKSA9PSBtLT50YXJnZXRfdmFsKQorCSAgICBob3N0X3ZhbCB8PSBtLT5ob3N0X3ZhbDsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgcmV0dXJuIGhvc3RfdmFsOworfQorCisvKiBVdGlsaXR5IGZvciBjYl9ob3N0X3RvX3RhcmdldF9zdGF0IHRvIHN0b3JlIHZhbHVlcyBpbiB0aGUgdGFyZ2V0J3MKKyAgIHN0YXQgc3RydWN0LiAgKi8KKworc3RhdGljIHZvaWQKK3N0b3JlIChwLCBzaXplLCB2YWwsIGJpZ19wKQorICAgICBjaGFyICpwOworICAgICBpbnQgc2l6ZTsKKyAgICAgbG9uZyB2YWw7IC8qID8/PyBtdXN0IGJlIGFzIGJpZyBhcyB0YXJnZXQgd29yZCBzaXplICovCisgICAgIGludCBiaWdfcDsKK3sKKyAgaWYgKGJpZ19wKQorICAgIHsKKyAgICAgIHAgKz0gc2l6ZTsKKyAgICAgIHdoaWxlIChzaXplLS0gPiAwKQorCXsKKwkgICotLXAgPSB2YWw7CisJICB2YWwgPj49IDg7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHdoaWxlIChzaXplLS0gPiAwKQorCXsKKwkgICpwKysgPSB2YWw7CisJICB2YWwgPj49IDg7CisJfQorICAgIH0KK30KKworLyogVHJhbnNsYXRlIGEgaG9zdCdzIHN0YXQgc3RydWN0IGludG8gYSB0YXJnZXQncy4KKyAgIElmIEhTIGlzIE5VTEwsIGp1c3QgY29tcHV0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQsCisgICBUUyBpcyBpZ25vcmVkLgorCisgICBUaGUgcmVzdWx0IGlzIHRoZSBzaXplIG9mIHRoZSB0YXJnZXQncyBzdGF0IHN0cnVjdCwKKyAgIG9yIHplcm8gaWYgYW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgdGhlIHRyYW5zbGF0aW9uLiAgKi8KKworaW50CitjYl9ob3N0X3RvX3RhcmdldF9zdGF0IChjYiwgaHMsIHRzKQorICAgICBob3N0X2NhbGxiYWNrICpjYjsKKyAgICAgY29uc3Qgc3RydWN0IHN0YXQgKmhzOworICAgICBQVFIgdHM7Cit7CisgIGNvbnN0IGNoYXIgKm0gPSBjYi0+c3RhdF9tYXA7CisgIGNoYXIgKnA7CisgIGludCBiaWdfcCA9IDA7CisKKyAgaWYgKGhzID09IE5VTEwpCisgICAgdHMgPSBOVUxMOworICBwID0gdHM7CisKKyAgd2hpbGUgKG0pCisgICAgeworICAgICAgY2hhciAqcSA9IHN0cmNociAobSwgJywnKTsKKyAgICAgIGludCBzaXplOworCisgICAgICAvKiBGSVhNRTogVXNlIHNzY2FuZj8gKi8KKyAgICAgIGlmIChxID09IE5VTEwpCisJeworCSAgLyogRklYTUU6IHByaW50IGVycm9yIG1lc3NhZ2UgKi8KKwkgIHJldHVybiAwOworCX0KKyAgICAgIHNpemUgPSBhdG9pIChxICsgMSk7CisgICAgICBpZiAoc2l6ZSA9PSAwKQorCXsKKwkgIC8qIEZJWE1FOiBwcmludCBlcnJvciBtZXNzYWdlICovCisJICByZXR1cm4gMDsKKwl9CisKKyAgICAgIGlmIChocyAhPSBOVUxMKQorCXsKKwkgIGlmIChzdHJuY21wIChtLCAic3RfZGV2IiwgcSAtIG0pID09IDApCisJICAgIHN0b3JlIChwLCBzaXplLCBocy0+c3RfZGV2LCBiaWdfcCk7CisJICBlbHNlIGlmIChzdHJuY21wIChtLCAic3RfaW5vIiwgcSAtIG0pID09IDApCisJICAgIHN0b3JlIChwLCBzaXplLCBocy0+c3RfaW5vLCBiaWdfcCk7CisJICAvKiBGSVhNRTp3aXAgKi8KKwkgIGVsc2UKKwkgICAgc3RvcmUgKHAsIHNpemUsIDAsIGJpZ19wKTsgLyogdW5zdXBwb3J0ZWQgZmllbGQsIHN0b3JlIDAgKi8KKwl9CisKKyAgICAgIHAgKz0gc2l6ZTsKKyAgICAgIG0gPSBzdHJjaHIgKHEsICc6Jyk7CisgICAgICBpZiAobSkKKwkrK207CisgICAgfQorCisgIHJldHVybiBwIC0gKGNoYXIgKikgdHM7Cit9CisMCisvKiBDb3ZlciBmdW5jdGlvbnMgdG8gdGhlIHZmcHJpbnRmIGNhbGxiYWNrcy4KKworICAgPz8/IElmIG9uZSB0aGlua3Mgb2YgdGhlIGNhbGxiYWNrcyBhcyBhIHN1YnN5c3RlbSBvbnRvIGl0c2VsZiBbb3IgcGFydCBvZgorICAgYSBsYXJnZXIgInJlbW90ZSB0YXJnZXQgc3Vic3lzdGVtIl0gd2l0aCBhIHdlbGwgZGVmaW5lZCBpbnRlcmZhY2UsIHRoZW4KKyAgIG9uZSB3b3VsZCB0aGluayB0aGF0IHRoZSBzdWJzeXN0ZW0gd291bGQgcHJvdmlkZSB0aGVzZS4gIEhvd2V2ZXIsIHVudGlsCisgICBvbmUgaXMgYWxsb3dlZCB0byBjcmVhdGUgc3VjaCBhIHN1YnN5c3RlbSAod2l0aCBpdHMgb3duIHNvdXJjZSB0cmVlCisgICBpbmRlcGVuZGVudCBvZiBhbnkgcGFydGljdWxhciB1c2VyKSwgc3VjaCBhIGNyaXR0ZXIgY2FuJ3QgZXhpc3QuICBUaHVzCisgICB0aGVzZSBmdW5jdGlvbnMgYXJlIGhlcmUgZm9yIHRoZSB0aW1lIGJlaW5nLiAgKi8KKwordm9pZAorc2ltX2NiX3ByaW50ZiAoaG9zdF9jYWxsYmFjayAqcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgIHZhX2xpc3QgYXA7CisKKyAgdmFfc3RhcnQgKGFwLCBmbXQpOworICBwLT52cHJpbnRmX2ZpbHRlcmVkIChwLCBmbXQsIGFwKTsKKyAgdmFfZW5kIChhcCk7Cit9CisKK3ZvaWQKK3NpbV9jYl9lcHJpbnRmIChob3N0X2NhbGxiYWNrICpwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcDsKKworICB2YV9zdGFydCAoYXAsIGZtdCk7CisgIHAtPmV2cHJpbnRmX2ZpbHRlcmVkIChwLCBmbXQsIGFwKTsKKyAgdmFfZW5kIChhcCk7Cit9CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2NnZW4tY3B1LmggYi9zaW0vY29tbW9uL2NnZW4tY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxMjEwMAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vY2dlbi1jcHUuaApAQCAtMCwwICsxLDk4IEBACisvKiBTaW11bGF0b3IgaGVhZGVyIGZvciBjZ2VuIGNwdXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIENHRU5fQ1BVX0gKKyNkZWZpbmUgQ0dFTl9DUFVfSAorCisvKiBUeXBlIG9mIGZ1bmN0aW9uIHRoYXQgaXMgdWx0aW1hdGVseSBjYWxsZWQgYnkgc2ltX3Jlc3VtZS4gICovCit0eXBlZGVmIHZvaWQgKEVOR0lORV9GTikgKFNJTV9DUFUgKik7CisKKy8qIFR5cGUgb2YgZnVuY3Rpb24gdG8gZG8gZGlzYXNzZW1ibHkuICAqLwordHlwZWRlZiB2b2lkIChDR0VOX0RJU0FTU0VNQkxFUikgKFNJTV9DUFUgKiwgY29uc3QgQ0dFTl9JTlNOICosCisJCQkJICBjb25zdCBBUkdCVUYgKiwgSUFERFIgcGNfLCBjaGFyICpidWZfKTsKKworLyogQWRkaXRpb25hbCBub24tbWFjaGluZSBnZW5lcmF0ZWQgcGVyLWNwdSBkYXRhIHRvIGdvIGluIFNJTV9DUFUuCisgICBUaGUgbWVtYmVyJ3MgbmFtZSBtdXN0IGJlIGBjZ2VuX2NwdScuICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIE5vbi16ZXJvIHdoaWxlIGNwdSBzaW11bGF0aW9uIGlzIHJ1bm5pbmcuICAqLworICBpbnQgcnVubmluZ19wOworI2RlZmluZSBDUFVfUlVOTklOR19QKGNwdSkgKChjcHUpLT5jZ2VuX2NwdS5ydW5uaW5nX3ApCisKKyAgLyogSW5zdHJ1Y3Rpb24gY291bnQuICBUaGlzIGlzIG1haW50YWluZWQgZXZlbiBpbiBmYXN0IG1vZGUgdG8ga2VlcCB0cmFjaworICAgICBvZiBzaW11bGF0b3Igc3BlZWQuICAqLworICB1bnNpZ25lZCBsb25nIGluc25fY291bnQ7CisjZGVmaW5lIENQVV9JTlNOX0NPVU5UKGNwdSkgKChjcHUpLT5jZ2VuX2NwdS5pbnNuX2NvdW50KQorCisgIC8qIHNpbV9yZXN1bWUgaGFuZGxlcnMgKi8KKyAgRU5HSU5FX0ZOICpmYXN0X2VuZ2luZV9mbjsKKyNkZWZpbmUgQ1BVX0ZBU1RfRU5HSU5FX0ZOKGNwdSkgKChjcHUpLT5jZ2VuX2NwdS5mYXN0X2VuZ2luZV9mbikKKyAgRU5HSU5FX0ZOICpmdWxsX2VuZ2luZV9mbjsKKyNkZWZpbmUgQ1BVX0ZVTExfRU5HSU5FX0ZOKGNwdSkgKChjcHUpLT5jZ2VuX2NwdS5mdWxsX2VuZ2luZV9mbikKKworICAvKiBNYXhpbXVtIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgcGVyIHRpbWUgc2xpY2UuCisgICAgIFdoZW4gc2luZ2xlIHN0ZXBwaW5nIHRoaXMgaXMgMS4gIElmIHVzaW5nIHRoZSBwYmIgbW9kZWwsIHRoaXMgY2FuIGJlCisgICAgIG1vcmUgdGhhbiAxLiAgMCBtZWFucyAiYXMgbG9uZyBhcyB5b3Ugd2FudCIuICAqLworICB1bnNpZ25lZCBpbnQgbWF4X3NsaWNlX2luc25zOworI2RlZmluZSBDUFVfTUFYX1NMSUNFX0lOU05TKGNwdSkgKChjcHUpLT5jZ2VuX2NwdS5tYXhfc2xpY2VfaW5zbnMpCisKKyAgLyogU2ltdWxhdG9yJ3MgZXhlY3V0aW9uIGNhY2hlLgorICAgICBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhpcyBldmVuIGlmIG5vdCB1c2VkIGFzIHNvbWUgc2ltdWxhdG9ycyBtYXkgaGF2ZQorICAgICBvbmUgbWFjaGluZSB2YXJpYW50IHRoYXQgdXNlcyB0aGUgc2NhY2hlIGFuZCBhbm90aGVyIHRoYXQgZG9lc24ndCBhbmQKKyAgICAgd2UgZG9uJ3Qgd2FudCBtZW1iZXJzIGluIHRoaXMgc3RydWN0IHRvIG1vdmUgYWJvdXQuICAqLworICBDUFVfU0NBQ0hFIHNjYWNoZTsKKworICAvKiBJbnN0cnVjdGlvbiBkZXNjcmlwdG9yIHRhYmxlLiAgKi8KKyAgSURFU0MgKmlkZXNjOworI2RlZmluZSBDUFVfSURFU0MoY3B1KSAoKGNwdSktPmNnZW5fY3B1LmlkZXNjKQorCisgIC8qIFdoZXRoZXIgdGhlIHJlYWQsd3JpdGUsc2VtYW50aWMgZW50cmllcyAoY29tcHV0ZWQgZ290byBsYWJlbHMpIGhhdmUgYmVlbgorICAgICBpbml0aWFsaXplZCBvciBub3QuICAqLworICBpbnQgaWRlc2NfcmVhZF9pbml0X3A7CisjZGVmaW5lIENQVV9JREVTQ19SRUFEX0lOSVRfUChjcHUpICgoY3B1KS0+Y2dlbl9jcHUuaWRlc2NfcmVhZF9pbml0X3ApCisgIGludCBpZGVzY193cml0ZV9pbml0X3A7CisjZGVmaW5lIENQVV9JREVTQ19XUklURV9JTklUX1AoY3B1KSAoKGNwdSktPmNnZW5fY3B1LmlkZXNjX3dyaXRlX2luaXRfcCkKKyAgaW50IGlkZXNjX3NlbV9pbml0X3A7CisjZGVmaW5lIENQVV9JREVTQ19TRU1fSU5JVF9QKGNwdSkgKChjcHUpLT5jZ2VuX2NwdS5pZGVzY19zZW1faW5pdF9wKQorCisgIC8qIENwdSBkZXNjcmlwdG9yIHRhYmxlLgorICAgICBUaGlzIGlzIGEgQ0dFTiBjcmVhdGVkIGVudGl0eSB0aGF0IGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbiBmaWxlCisgICAgIHR1cm5lZCBpbnRvIEMgY29kZSBhbmQgdGFibGVzIGZvciBvdXIgdXNlLiAgKi8KKyAgQ0dFTl9DUFVfREVTQyBjcHVfZGVzYzsKKyNkZWZpbmUgQ1BVX0NQVV9ERVNDKGNwdSkgKChjcHUpLT5jZ2VuX2NwdS5jcHVfZGVzYykKKworICAvKiBGdW5jdGlvbiB0byBmZXRjaCB0aGUgaW5zbiBkYXRhIGVudHJ5IGluIHRoZSBJREVTQy4gICovCisgIGNvbnN0IENHRU5fSU5TTiAqICgqZ2V0X2lkYXRhKSAoU0lNX0NQVSAqLCBpbnQpOworI2RlZmluZSBDUFVfR0VUX0lEQVRBKGNwdSkgKChjcHUpLT5jZ2VuX2NwdS5nZXRfaWRhdGEpCisKKyAgLyogRGlzYXNzZW1ibGVyLiAgKi8KKyAgQ0dFTl9ESVNBU1NFTUJMRVIgKmRpc2Fzc2VtYmxlcjsKKyNkZWZpbmUgQ1BVX0RJU0FTU0VNQkxFUihjcHUpICgoY3B1KS0+Y2dlbl9jcHUuZGlzYXNzZW1ibGVyKQorCisgIC8qIEFsbG93IHNsb3AgaW4gc2l6ZSBjYWxjcyBmb3IgY2FzZSB3aGVyZSBtdWx0aXBsZSBjcHUgdHlwZXMgYXJlIHN1cHBvcnRlZAorICAgICBhbmQgc3BhY2UgZm9yIHRoZSBzcGVjaWZpZWQgY3B1IGlzIG1hbGxvYydkIGF0IHJ1biB0aW1lLiAgKi8KKyAgZG91YmxlIHNsb3A7Cit9IENHRU5fQ1BVOworCisvKiBTaG9ydGhhbmQgbWFjcm8gZm9yIGZldGNoaW5nIHJlZ2lzdGVycy4KKyAgIENQVV9DR0VOX0hXIGlzIGRlZmluZWQgaW4gY3B1LmguICAqLworI2RlZmluZSBDUFUoeCkgKENQVV9DR0VOX0hXIChjdXJyZW50X2NwdSktPngpCisKKyNlbmRpZiAvKiBDR0VOX0NQVV9IICovCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2NnZW4tZGVmcy5oIGIvc2ltL2NvbW1vbi9jZ2VuLWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2M5YThhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9jZ2VuLWRlZnMuaApAQCAtMCwwICsxLDE3NCBAQAorLyogR2VuZXJhbCBDcHUgdG9vbHMgR0VOZXJhdGVkIHNpbXVsYXRvciBzdXBwb3J0LgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBDR0VOX0RFRlNfSAorI2RlZmluZSBDR0VOX0RFRlNfSAorCisvKiBDb21wdXRlIG51bWJlciBvZiBsb25ncyByZXF1aXJlZCB0byBob2xkIE4gYml0cy4gICovCisjZGVmaW5lIEhPU1RfTE9OR1NfRk9SX0JJVFMobikgXAorICAoKChuKSArIHNpemVvZiAobG9uZykgKiA4IC0gMSkgLyBzaXplb2YgKGxvbmcpICogOCkKKwwKKy8qIEZvcndhcmQgZGVjbHMuICBEZWZpbmVkIGluIHRoZSBtYWNoaW5lIGdlbmVyYXRlZCBmaWxlcy4gICovCisKKy8qIFRoaXMgaG9sZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBleHRyYWN0ZWQgaW5zbi4KKyAgIFRoZXJlIGFyZSBhIGZldyBjb21tb24gZW50cmllcyAoZS5nLiBwYyBhZGRyZXNzKSwgYW5kIHRoZW4gb25lIGJpZworICAgdW5pb24gd2l0aCBhbiBlbnRyeSBmb3IgZWFjaCBvZiB0aGUgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4gICovCit0eXBlZGVmIHN0cnVjdCBhcmdidWYgQVJHQlVGOworCisvKiBBUkdCVUYgYWNjZXNzb3JzLiAgKi8KKyNkZWZpbmUgQVJHQlVGX0FERFIoYWJ1ZikgKChhYnVmKS0+YWRkcikKKyNkZWZpbmUgQVJHQlVGX0lERVNDKGFidWYpICgoYWJ1ZiktPmlkZXNjKQorI2RlZmluZSBBUkdCVUZfVFJBQ0VfUChhYnVmKSAoKGFidWYpLT50cmFjZV9wKQorI2RlZmluZSBBUkdCVUZfUFJPRklMRV9QKGFidWYpICgoYWJ1ZiktPnByb2ZpbGVfcCkKKworLyogVGhpcyBpcyBvbmUgQVJHQlVGIHBsdXMgd2hhdGV2ZXIgZWxzZSBpcyBuZWVkZWQgZm9yIFdJVEhfU0NBQ0hFIHN1cHBvcnQuCisgICBBdCBwcmVzZW50IHRoZXJlIGlzIG5vdGhpbmcgZWxzZSwgYnV0IGl0IGFsc28gcHJvdmlkZXMgYSBsZXZlbCBvZgorICAgYWJzdHJhY3Rpb24uICAqLwordHlwZWRlZiBzdHJ1Y3Qgc2NhY2hlIFNDQUNIRTsKKworLyogVGhpcyBpcyBhIHVuaW9uIHdpdGggb25lIGVudHJ5IGZvciBlYWNoIGluc3RydWN0aW9uIGZvcm1hdC4KKyAgIEVhY2ggZW50cnkgY29udGFpbnMgYWxsIG9mIHRoZSBub24tY29uc3RhbnQgaW5wdXRzIG9mIHRoZSBpbnN0cnVjdGlvbgorICAgaW4gdGhlIGNhc2Ugb2YgcmVhZC1iZWZvcmUtZXhlYyBzdXBwb3J0LCBvciBhbGwgb3V0cHV0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24KKyAgIGluIHRoZSBjYXNlIG9mIHdyaXRlLWFmdGVyLWV4ZWMgc3VwcG9ydC4gICovCit0eXBlZGVmIHN0cnVjdCBwYXJleGVjIFBBUkVYRUM7CisKKy8qIEFuICJJbnN0cnVjdGlvbiBERVNDcmlwdG9yIi4KKyAgIFRoaXMgaXMgdGhlIG1haW4gaGFuZGxlIG9uIGFuIGluc3RydWN0aW9uIGZvciB0aGUgc2ltdWxhdG9yLiAgKi8KK3R5cGVkZWYgc3RydWN0IGlkZXNjIElERVNDOworDAorLyogRW5naW5lIHN1cHBvcnQuCisgICA/Pz8gVGhpcyBpcyBoZXJlIGJlY2F1c2UgaXQncyBuZWVkZWQgYmVmb3JlIGVuZy5oIChidWlsdCBieSBnZW5tbG9vcC5zaCkKKyAgIHdoaWNoIGlzIG5lZWRlZCBiZWZvcmUgY2dlbi1lbmdpbmUuaCBhbmQgY3B1LmguCisgICA/Pz8gVGhpcyBkZXBlbmRzIG9uIGEgY3B1IGZhbWlseSBzcGVjaWZpYyB0eXBlLCBJQUREUiwgYnV0IG5vIG1hY2hpbmUKKyAgIGdlbmVyYXRlZCBoZWFkZXJzIHdpbGwgaGF2ZSBiZWVuIGluY2x1ZGVkIHlldC4gIHNpbS9jb21tb24gY3VycmVudGx5CisgICByZXF1aXJlcyB0aGUgdHlwZWRlZiBvZiBzaW1fY2lhIGluIHNpbS1tYWluLmggYmV0d2VlbiB0aGUgaW5jbHVzaW9uIG9mCisgICBzaW0tYmFzaWNzLmggYW5kIHNpbS1iYXNlLmggc28gdGhpcyBpcyBubyBkaWZmZXJlbnQuICAqLworCisvKiBTRU1fQVJHIGlzIGludGVuZGVkIHRvIGhpZGUgd2hldGhlciBvciBub3QgdGhlIHNjYWNoZSBpcyBpbiB1c2UgZnJvbSB0aGUKKyAgIHNlbWFudGljIHJvdXRpbmVzLiAgSW4gcmVhbGl0eSBmb3IgdGhlIHdpdGgtZXh0cmFjdGlvbiBjYXNlIGl0IGlzIGFsd2F5cworICAgYW4gU0NBQ0hFICogZXZlbiB3aGVuIG5vdCB1c2luZyB0aGUgU0NBQ0hFIHNpbmNlIHRoZXJlJ3Mgbm8gY3VycmVudCB3aW4gdG8KKyAgIG1ha2luZyBpdCBzb21ldGhpbmcgZWxzZSAoIm5vdCB1c2luZyB0aGUgU0NBQ0hFIiBpcyBsaWtlIGhhdmluZyBhIGNhY2hlCisgICBzaXplIG9mIDEpLgorICAgVGhlIHdpdGhvdXQtZXh0cmFjdGlvbiBjYXNlIHN0aWxsIHVzZXMgYW4gQVJHQlVGOgorICAgLSBjb25zaXN0ZW5jeSB3aXRoIHNjYWNoZSB2ZXJzaW9uCisgICAtIHN0aWxsIG5lZWQgdG8gcmVjb3JkIHdoaWNoIG9wZXJhbmRzIGFyZSB3cml0dGVuCisgICAgIFRoaXMgd291bGRuJ3QgYmUgbmVlZGVkIGlmIG1vZGVsaW5nIHdhcyBkb25lIGluIHRoZSBzZW1hbnRpYyByb3V0aW5lcworICAgICBidXQgdGhpcyBpc24ndCBhcyBnZW5lcmFsIGFzIGhhbmRsaW5nIGl0IG91dHNpZGUgb2YgdGhlIHNlbWFudGljIHJvdXRpbmVzLgorICAgICBGb3IgZXhhbXBsZSBTaGFkZSBhbGxvd3MgY2FsbGluZyB1c2VyLXN1cHBsaWVkIGNvZGUgYmVmb3JlL2FmdGVyIGVhY2gKKyAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoaXMgaXMgc29tZXRoaW5nIHRoYXQgaXMgYmVpbmcgcGxhbm5lZC4KKyAgID8/PyBUaGVyZSBpcyBzdGlsbCBzb21lIGNsdW1zaW5lc3MgaW4gaG93IG11Y2ggb2YgQVJHQlVGIHRvIHVzZS4gICovCit0eXBlZGVmIFNDQUNIRSAqU0VNX0FSRzsKKworLyogaW5zdHJ1Y3Rpb24gYWRkcmVzcworICAgPz8/IFRoaXMgd2FzIGludGVuZGVkIHRvIGJlIGEgc3RydWN0IG9mIHR3byBlbGVtZW50cyBpbiB0aGUgV0lUSF9TQ0FDSEVfUEJCCisgICBjYXNlLiAgVGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIElBRERSLCB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgdGhlIFNDQUNIRSAqLgorICAgSGF2ZW4ndCBmb3VuZCB0aGUgdGltZSB5ZXQgdG8gbWFrZSB0aGlzIHdvcmssIGJ1dCBpdCBzZWVtZWQgYSBuaWNlciBhcHByb2FjaAorICAgdGhhbiB0aGUgY3VycmVudCBicl9jYWNoZSBzdHVmZi4gICovCit0eXBlZGVmIElBRERSIFBDQUREUjsKKworLyogQ3VycmVudCBpbnN0cnVjdGlvbiBhZGRyZXNzLCB1c2VkIGJ5IGNvbW1vbi4gKi8KK3R5cGVkZWYgSUFERFIgQ0lBOworCisvKiBTZW1hbnRpYyByb3V0aW5lcycgdmVyc2lvbiBvZiB0aGUgUEMuICAqLworI2lmIFdJVEhfU0NBQ0hFX1BCQgordHlwZWRlZiBTQ0FDSEUgKlNFTV9QQzsKKyNlbHNlCit0eXBlZGVmIElBRERSIFNFTV9QQzsKKyNlbmRpZgorDAorLyogVmlydHVhbCBpbnNuIHN1cHBvcnQuICAqLworCisvKiBPcGNvZGUgdGFibGUgZm9yIHZpcnR1YWwgaW5zbnMgKG9ubHkgdXNlZCBieSB0aGUgc2ltdWxhdG9yKS4gICovCitleHRlcm4gY29uc3QgQ0dFTl9JTlNOIGNnZW5fdmlydHVhbF9pbnNuX3RhYmxlW107CisKKy8qIC12ZSBvZiBpbmRpY2VzIG9mIHZpcnR1YWwgaW5zbnMgaW4gY2dlbl92aXJ0dWFsX2luc25fdGFibGUuICAqLwordHlwZWRlZiBlbnVtIHsKKyAgVklSVFVBTF9JTlNOX1hfSU5WQUxJRCA9IDAsCisgIFZJUlRVQUxfSU5TTl9YX0JFRk9SRSA9IC0xLCBWSVJUVUFMX0lOU05fWF9BRlRFUiA9IC0yLAorICBWSVJUVUFMX0lOU05fWF9CRUdJTiA9IC0zLAorICBWSVJUVUFMX0lOU05fWF9DSEFJTj0gLTQsIFZJUlRVQUxfSU5TTl9YX0NUSV9DSEFJTiA9IC01Cit9IENHRU5fSU5TTl9WSVJUVUFMX1RZUEU7CisKKy8qIFJldHVybiBub24temVybyBpZiBPUENPREUgaXMgYSB2aXJ0dWFsIGluc24uICAqLworI2RlZmluZSBDR0VOX0lOU05fVklSVFVBTF9QKGluc24pIFwKKyAgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKChpbnNuKSwgQ0dFTl9JTlNOX1ZJUlRVQUwpCisMCisvKiBHTlUgQydzICJjb21wdXRlZCBnb3RvIiBmYWNpbGl0eSBpcyB1c2VkIHRvIHNwZWVkIHRoaW5ncyB1cCB3aGVyZQorICAgcG9zc2libGUuICBUaGVzZSBtYWNyb3MgcHJvdmlkZSBhIHBvcnRhYmxlIHdheSB0byB1c2UgdGhlbS4KKyAgIE5lc3Rpbmcgb2YgdGhlc2Ugc3dpdGNoIHN0YXRlbWVudHMgaXMgZG9uZSBieSBwcm92aWRpbmcgYW4gZXh0cmEgYXJndW1lbnQKKyAgIHRoYXQgZGlzdGluZ3Vpc2hlcyB0aGVtLiAgYE4nIGNhbiBiZSBhIG51bWJlciBvciBzeW1ib2wuCisgICBWYXJpYWJsZSBgbGFiZWxzXyMjTicgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIHRoZSBsYWJlbHMgb2YgZWFjaCBjYXNlLiAgKi8KKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFNXSVRDSChOLCBYKSBnb3RvICpYOworI2RlZmluZSBDQVNFKE4sIFgpIGNhc2VfIyNOIyNfIyNYCisjZGVmaW5lIEJSRUFLKE4pIGdvdG8gZW5kX3N3aXRjaF8jI04KKyNkZWZpbmUgREVGQVVMVChOKSBkZWZhdWx0XyMjTgorI2RlZmluZSBFTkRTV0lUQ0goTikgZW5kX3N3aXRjaF8jI046CisjZWxzZQorI2RlZmluZSBTV0lUQ0goTiwgWCkgc3dpdGNoIChYKQorI2RlZmluZSBDQVNFKE4sIFgpIGNhc2UgWCAvKiBGSVhNRTogb2xkIHNlbS1zd2l0Y2ggaGFkIChAYXJjaEBfLFgpIGhlcmUgKi8KKyNkZWZpbmUgQlJFQUsoTikgYnJlYWsKKyNkZWZpbmUgREVGQVVMVChOKSBkZWZhdWx0CisjZGVmaW5lIEVORFNXSVRDSChOKQorI2VuZGlmCisMCisvKiBTaW11bGF0b3Igc3RhdGUuICAqLworCisvKiBSZWNvcmRzIHNpbXVsYXRvciBkZXNjcmlwdG9yIHNvIHV0aWxpdGllcyBsaWtlIEBjcHVAX2R1bXBfcmVncyBjYW4gYmUKKyAgIGNhbGxlZCBmcm9tIGdkYi4gICovCitleHRlcm4gU0lNX0RFU0MgY3VycmVudF9zdGF0ZTsKKworLyogU2ltdWxhdG9yIHN0YXRlLiAgKi8KKworLyogQ0dFTl9TVEFURSBjb250YWlucyBhZGRpdGlvbmFsIHN0YXRlIGluZm9ybWF0aW9uIG5vdCBwcmVzZW50IGluCisgICBzaW1fc3RhdGVfYmFzZS4gICovCisKK3R5cGVkZWYgc3RydWN0IGNnZW5fc3RhdGUgeworICAvKiBGSVhNRTogTW92ZWQgdG8gc2ltX3N0YXRlX2Jhc2UuICAqLworICAvKiBhcmd2LCBlbnYgKi8KKyAgY2hhciAqKmFyZ3Y7CisjZGVmaW5lIFNUQVRFX0FSR1YocykgKChzKSAtPiBjZ2VuX3N0YXRlLmFyZ3YpCisgIC8qIEZJWE1FOiBNb3ZlIHRvIHNpbV9zdGF0ZV9iYXNlLiAgKi8KKyAgY2hhciAqKmVudnA7CisjZGVmaW5lIFNUQVRFX0VOVlAocykgKChzKSAtPiBjZ2VuX3N0YXRlLmVudnApCisKKyAgLyogTm9uLXplcm8gaWYgbm8gdHJhY2luZyBvciBwcm9maWxpbmcgaXMgc2VsZWN0ZWQuICAqLworICBpbnQgcnVuX2Zhc3RfcDsKKyNkZWZpbmUgU1RBVEVfUlVOX0ZBU1RfUChzZCkgKChzZCkgLT4gY2dlbl9zdGF0ZS5ydW5fZmFzdF9wKQorfSBDR0VOX1NUQVRFOworDAorLyogVmFyaW91cyB1dGlsaXRpZXMuICAqLworCisvKiBDYWxsZWQgYWZ0ZXIgc2ltX3Bvc3RfYXJndl9pbml0IHRvIGRvIGFueSBjZ2VuIGluaXRpYWxpemF0aW9uLiAgKi8KK2V4dGVybiB2b2lkIGNnZW5faW5pdCAoU0lNX0RFU0MpOworCisvKiBSZXR1cm4gdGhlIG5hbWUgb2YgYW4gaW5zbi4gICovCitleHRlcm4gQ1BVX0lOU05fTkFNRV9GTiBjZ2VuX2luc25fbmFtZTsKKworLyogUmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBleHRyYSBieXRlcyByZXF1aXJlZCBmb3IgYSBzaW1fY3B1IHN0cnVjdC4gICovCisvKiA/Pz8gT2ssIHllcywgdGhpcyBpcyBsZXNzIHByZXR0eSB0aGFuIGl0IHNob3VsZCBiZS4gIEdpdmUgbWUgYSBiZXR0ZXIKKyAgIGxhbmd1YWdlIFtvciBzdWdnZXN0IGEgYmV0dGVyIHdheV0uICAqLworZXh0ZXJuIGludCBjZ2VuX2NwdV9tYXhfZXh0cmFfYnl0ZXMgKHZvaWQpOworCisvKiBDYWxsZWQgdG8gcHJvY2VzcyBhbiBpbnZhbGlkIGluc3RydWN0aW9uLiAgKi8KK2V4dGVybiB2b2lkIHNpbV9lbmdpbmVfaW52YWxpZF9pbnNuIChTSU1fQ1BVICosIElBRERSKTsKKworI2VuZGlmIC8qIENHRU5fREVGU19IICovCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2NnZW4tZW5naW5lLmggYi9zaW0vY29tbW9uL2NnZW4tZW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQyMTMzMgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vY2dlbi1lbmdpbmUuaApAQCAtMCwwICsxLDQ3MyBAQAorLyogRW5naW5lIGhlYWRlciBmb3IgQ3B1IHRvb2xzIEdFTmVyYXRlZCBzaW11bGF0b3JzLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIG11c3QgYmUgaW5jbHVkZWQgYWZ0ZXIgZW5nLmggYW5kIGJlZm9yZSAke2NwdX0uaC4gICovCisKKy8qIFNlbWFudGljIGZ1bmN0aW9ucyBjb21lIGluIHNpeCB2ZXJzaW9ucyBvbiB0d28gYXhlczoKKyAgIGZhc3QvZnVsbC1mZWF0dXJlZCwgYW5kIHVzaW5nIG9uZSBvZiB0aGUgc2ltcGxlL3NjYWNoZS9jb21waWxhdGlvbiBlbmdpbmVzLgorICAgQSBmdWxsIGZlYXR1cmVkIHNpbXVsYXRvciBpcyBhbHdheXMgcHJvdmlkZWQuICAtLWVuYWJsZS1zaW0tZmFzdCBpbmNsdWRlcworICAgc3VwcG9ydCBmb3IgZmFzdCBleGVjdXRpb24gYnkgZHVwbGljYXRpbmcgdGhlIHNlbWFudGljIGNvZGUgYnV0IGxlYXZpbmcKKyAgIG91dCBhbGwgZmVhdHVyZXMgbGlrZSB0cmFjaW5nIGFuZCBwcm9maWxpbmcuCisgICBVc2luZyB0aGUgc2NhY2hlIGlzIHNlbGVjdGVkIHdpdGggLS1lbmFibGUtc2ltLXNjYWNoZS4gICovCisvKiBGSVhNRTogLS1lbmFibGUtc2ltLWZhc3Qgbm90IGltcGxlbWVudGVkIHlldC4gICovCisvKiBGSVhNRTogdW5kZWNpZGVkIGhvdyB0byBoYW5kbGUgV0lUSF9TQ0FDSEVfUEJCLiAgKi8KKworLyogVGhlcmUgYXJlIHNldmVyYWwgc3R5bGVzIG9mIGVuZ2luZXMsIGFsbCBnZW5lcmFsbHkgc3VwcG9ydGVkIGJ5IHRoZQorICAgc2FtZSBjb2RlOgorCisgICBXSVRIX1NDQUNIRSAmJiBXSVRIX1NDQUNIRV9QQkIgLSBwc2V1ZG8tYmFzaWMtYmxvY2sgc2NhY2hpbmcKKyAgIFdJVEhfU0NBQ0hFICYmICFXSVRIX1NDQUNIRV9QQkIgLSBzY2FjaGluZyBvbiBhbiBpbnNuIGJ5IGluc24gYmFzaXMKKyAgICFXSVRIX1NDQUNIRSAtIHNpbXBsZSBlbmdpbmU6IGZldGNoIGFuIGluc24sIGV4ZWN1dGUgYW4gaW5zbgorCisgICBUaGUgIVdJVEhfU0NBQ0hFIGNhc2UgY2FuIGFsc28gYmUgYnJva2VuIHVwIGludG8gdHdvIGZsYXZvdXJzOgorICAgZXh0cmFjdCB0aGUgZmllbGRzIG9mIHRoZSBpbnNuIGludG8gYW4gQVJHQlVGIHN0cnVjdCwgb3IgZGVmZXIgdGhlCisgICBleHRyYWN0aW9uIHRvIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgVGhlIGZvcm1lciBjYW4gYmUgdmlld2VkIGFzIHRoZQorICAgV0lUSF9TQ0FDSEUgY2FzZSB3aXRoIGEgY2FjaGUgc2l6ZSBvZiAxICh0aHVzIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgYQorICAgV0lUSF9FWFRSQUNUSU9OIG1hY3JvKS4gIFRoZSBXSVRIX1NDQUNIRSBjYXNlIGFsd2F5cyBleHRyYWN0cyB0aGUgZmllbGRzCisgICBpbnRvIGFuIEFSR0JVRiBzdHJ1Y3QuICAqLworCisjaWZuZGVmIENHRU5fRU5HSU5FX0gKKyNkZWZpbmUgQ0dFTl9FTkdJTkVfSAorCisvKiBJbnN0cnVjdGlvbiBmaWVsZCBzdXBwb3J0IG1hY3Jvcy4gICovCisKKyNkZWZpbmUgRVhUUkFDVF9NU0IwX0lOVCh2YWwsIHRvdGFsLCBzdGFydCwgbGVuZ3RoKSBcCisoKChJTlQpICh2YWwpIDw8ICgoc2l6ZW9mIChJTlQpICogOCkgLSAodG90YWwpICsgKHN0YXJ0KSkpIFwKKyA+PiAoKHNpemVvZiAoSU5UKSAqIDgpIC0gKGxlbmd0aCkpKQorI2RlZmluZSBFWFRSQUNUX01TQjBfVUlOVCh2YWwsIHRvdGFsLCBzdGFydCwgbGVuZ3RoKSBcCisoKChVSU5UKSAodmFsKSA8PCAoKHNpemVvZiAoVUlOVCkgKiA4KSAtICh0b3RhbCkgKyAoc3RhcnQpKSkgXAorID4+ICgoc2l6ZW9mIChVSU5UKSAqIDgpIC0gKGxlbmd0aCkpKQorCisjZGVmaW5lIEVYVFJBQ1RfTFNCMF9JTlQodmFsLCB0b3RhbCwgc3RhcnQsIGxlbmd0aCkgXAorKCgoSU5UKSAodmFsKSA8PCAoKHNpemVvZiAoSU5UKSAqIDgpIC0gKHN0YXJ0KSAtIDEpKSBcCisgPj4gKChzaXplb2YgKElOVCkgKiA4KSAtIChsZW5ndGgpKSkKKyNkZWZpbmUgRVhUUkFDVF9MU0IwX1VJTlQodmFsLCB0b3RhbCwgc3RhcnQsIGxlbmd0aCkgXAorKCgoVUlOVCkgKHZhbCkgPDwgKChzaXplb2YgKFVJTlQpICogOCkgLSAoc3RhcnQpIC0gMSkpIFwKKyA+PiAoKHNpemVvZiAoVUlOVCkgKiA4KSAtIChsZW5ndGgpKSkKKworI2lmIENHRU5fSU5TTl9MU0IwX1AKKworI2RlZmluZSBFWFRSQUNUX0lOVCh2YWwsIHRvdGFsLCBzdGFydCwgbGVuZ3RoKSBcCisgIEVYVFJBQ1RfTFNCMF9JTlQgKCh2YWwpLCAodG90YWwpLCAoc3RhcnQpLCAobGVuZ3RoKSkKKyNkZWZpbmUgRVhUUkFDVF9VSU5UKHZhbCwgdG90YWwsIHN0YXJ0LCBsZW5ndGgpIFwKKyAgRVhUUkFDVF9MU0IwX1VJTlQgKCh2YWwpLCAodG90YWwpLCAoc3RhcnQpLCAobGVuZ3RoKSkKKworI2Vsc2UKKworI2RlZmluZSBFWFRSQUNUX0lOVCh2YWwsIHRvdGFsLCBzdGFydCwgbGVuZ3RoKSBcCisgIEVYVFJBQ1RfTVNCMF9JTlQgKCh2YWwpLCAodG90YWwpLCAoc3RhcnQpLCAobGVuZ3RoKSkKKyNkZWZpbmUgRVhUUkFDVF9VSU5UKHZhbCwgdG90YWwsIHN0YXJ0LCBsZW5ndGgpIFwKKyAgRVhUUkFDVF9NU0IwX1VJTlQgKCh2YWwpLCAodG90YWwpLCAoc3RhcnQpLCAobGVuZ3RoKSkKKworI2VuZGlmCisMCisvKiBTZW1hbnRpYyByb3V0aW5lcy4gICovCisKKy8qIFR5cGUgb2YgdGhlIG1hY2hpbmUgZ2VuZXJhdGVkIGV4dHJhY3Rpb24gZm5zLiAgKi8KKy8qID8/PyBObyBsb25nZXIgdXNlZC4gICovCit0eXBlZGVmIHZvaWQgKEVYVFJBQ1RfRk4pIChTSU1fQ1BVICosIElBRERSLCBDR0VOX0lOU05fSU5ULCBBUkdCVUYgKik7CisKKy8qIFR5cGUgb2YgdGhlIG1hY2hpbmUgZ2VuZXJhdGVkIHNlbWFudGljIGZucy4gICovCisKKyNpZiBXSVRIX1NDQUNIRQorCisvKiBJbnN0cnVjdGlvbiBmaWVsZHMgYXJlIGV4dHJhY3RlZCBpbnRvIEFSR0JVRiBiZWZvcmUgY2FsbGluZyB0aGUKKyAgIHNlbWFudGljIHJvdXRpbmUuICAqLworI2lmIEhBVkVfUEFSQUxMRUxfSU5TTlMKK3R5cGVkZWYgU0VNX1BDIChTRU1BTlRJQ19GTikgKFNJTV9DUFUgKiwgU0VNX0FSRywgUEFSRVhFQyAqKTsKKyNlbHNlCit0eXBlZGVmIFNFTV9QQyAoU0VNQU5USUNfRk4pIChTSU1fQ1BVICosIFNFTV9BUkcpOworI2VuZGlmCisKKyNlbHNlCisKKy8qIFJlc3VsdCBvZiBzZW1hbnRpYyByb3V0aW5lcyBpcyBhIHN0YXR1cyBpbmRpY2F0b3IgKHdpcCkuICAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgU0VNX1NUQVRVUzsKKworLyogSW5zdHJ1Y3Rpb24gZmllbGRzIGFyZSBleHRyYWN0ZWQgYnkgdGhlIHNlbWFudGljIHJvdXRpbmUuCisgICA/Pz8gVE9ETzogbXVsdGkgd29yZCBpbnNucy4gICovCisjaWYgSEFWRV9QQVJBTExFTF9JTlNOUwordHlwZWRlZiBTRU1fU1RBVFVTIChTRU1BTlRJQ19GTikgKFNJTV9DUFUgKiwgU0VNX0FSRywgUEFSRVhFQyAqLCBDR0VOX0lOU05fSU5UKTsKKyNlbHNlCit0eXBlZGVmIFNFTV9TVEFUVVMgKFNFTUFOVElDX0ZOKSAoU0lNX0NQVSAqLCBTRU1fQVJHLCBDR0VOX0lOU05fSU5UKTsKKyNlbmRpZgorCisjZW5kaWYKKworLyogSW4gdGhlIEFSR0JVRiBzdHJ1Y3QsIGEgcG9pbnRlciB0byB0aGUgc2VtYW50aWMgcm91dGluZSBmb3IgdGhlIGluc24uICAqLworCit1bmlvbiBzZW0geworI2lmICEgV0lUSF9TRU1fU1dJVENIX0ZVTEwKKyAgU0VNQU5USUNfRk4gKnNlbV9mdWxsOworI2VuZGlmCisjaWYgISBXSVRIX1NFTV9TV0lUQ0hfRkFTVAorICBTRU1BTlRJQ19GTiAqc2VtX2Zhc3Q7CisjZW5kaWYKKyNpZiBXSVRIX1NFTV9TV0lUQ0hfRlVMTCB8fCBXSVRIX1NFTV9TV0lUQ0hfRkFTVAorI2lmZGVmIF9fR05VQ19fCisgIHZvaWQgKnNlbV9jYXNlOworI2Vsc2UKKyAgaW50IHNlbV9jYXNlOworI2VuZGlmCisjZW5kaWYKK307CisKKy8qIFNldCB0aGUgYXBwcm9wcmlhdGUgc2VtYW50aWMgaGFuZGxlciBpbiBBQlVGLiAgKi8KKworI2lmIFdJVEhfU0VNX1NXSVRDSF9GVUxMCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgU0VNX1NFVF9GVUxMX0NPREUoYWJ1ZiwgaWRlc2MpIFwKKyAgZG8geyAoYWJ1ZiktPnNlbWFudGljLnNlbV9jYXNlID0gKGlkZXNjKS0+c2VtX2Z1bGxfbGFiOyB9IHdoaWxlICgwKQorI2Vsc2UgCisjZGVmaW5lIFNFTV9TRVRfRlVMTF9DT0RFKGFidWYsIGlkZXNjKSBcCisgIGRvIHsgKGFidWYpLT5zZW1hbnRpYy5zZW1fY2FzZSA9IChpZGVzYyktPm51bTsgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgU0VNX1NFVF9GVUxMX0NPREUoYWJ1ZiwgaWRlc2MpIFwKKyAgZG8geyAoYWJ1ZiktPnNlbWFudGljLnNlbV9mdWxsID0gKGlkZXNjKS0+c2VtX2Z1bGw7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmIFdJVEhfU0VNX1NXSVRDSF9GQVNUCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgU0VNX1NFVF9GQVNUX0NPREUoYWJ1ZiwgaWRlc2MpIFwKKyAgZG8geyAoYWJ1ZiktPnNlbWFudGljLnNlbV9jYXNlID0gKGlkZXNjKS0+c2VtX2Zhc3RfbGFiOyB9IHdoaWxlICgwKQorI2Vsc2UgCisjZGVmaW5lIFNFTV9TRVRfRkFTVF9DT0RFKGFidWYsIGlkZXNjKSBcCisgIGRvIHsgKGFidWYpLT5zZW1hbnRpYy5zZW1fY2FzZSA9IChpZGVzYyktPm51bTsgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgU0VNX1NFVF9GQVNUX0NPREUoYWJ1ZiwgaWRlc2MpIFwKKyAgZG8geyAoYWJ1ZiktPnNlbWFudGljLnNlbV9mYXN0ID0gKGlkZXNjKS0+c2VtX2Zhc3Q7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBTRU1fU0VUX0NPREUoYWJ1ZiwgaWRlc2MsIGZhc3RfcCkgXAorZG8geyBcCisgIGlmIChmYXN0X3ApIFwKKyAgICBTRU1fU0VUX0ZBU1RfQ09ERSAoKGFidWYpLCAoaWRlc2MpKTsgXAorICBlbHNlIFwKKyAgICBTRU1fU0VUX0ZVTExfQ09ERSAoKGFidWYpLCAoaWRlc2MpKTsgXAorfSB3aGlsZSAoMCkKKwwKKy8qIFJldHVybiBub24temVybyBpZiBJREVTQyBpcyBhIGNvbmRpdGlvbmFsIG9yIHVuY29uZGl0aW9uYWwgQ1RJLiAgKi8KKworI2RlZmluZSBJREVTQ19DVElfUChpZGVzYykgXAorICAgICAoKENHRU5fQVRUUl9CT09MUyAoQ0dFTl9JTlNOX0FUVFJTICgoaWRlc2MpLT5pZGF0YSkpIFwKKyAgICAgICAmIChDR0VOX0FUVFJfTUFTSyAoQ0dFTl9JTlNOX0NPTkRfQ1RJKSBcCisJICB8IENHRU5fQVRUUl9NQVNLIChDR0VOX0lOU05fVU5DT05EX0NUSSkpKSBcCisgICAgICAhPSAwKQorCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgSURFU0MgaXMgYSBza2lwIGluc24uICAqLworCisjZGVmaW5lIElERVNDX1NLSVBfUChpZGVzYykgXAorICAgICAoKENHRU5fQVRUUl9CT09MUyAoQ0dFTl9JTlNOX0FUVFJTICgoaWRlc2MpLT5pZGF0YSkpIFwKKyAgICAgICAmIENHRU5fQVRUUl9NQVNLIChDR0VOX0lOU05fU0tJUF9DVEkpKSBcCisgICAgICAhPSAwKQorCisvKiBUaGVzZSBhcmUgdXNlZCBzbyB0aGF0IHdlIGNhbiBjb21waWxlIHR3byBjb3BpZXMgb2YgdGhlIHNlbWFudGljIGNvZGUsCisgICBvbmUgd2l0aCBmdWxsIGZlYXR1cmUgc3VwcG9ydCBhbmQgb25lIHdpdGhvdXQgdGhhdCBydW5zIGZhc3QoZXIpLiAgKi8KKyNkZWZpbmUgU0VNX0ZOX05BTUUoY3B1LGZuKSBYQ09OQ0FUMyAoY3B1LF9zZW1fLGZuKQorI2RlZmluZSBTRU1GX0ZOX05BTUUoY3B1LGZuKSBYQ09OQ0FUMyAoY3B1LF9zZW1mXyxmbikKKworLyogUmV0dXJuIHBvaW50ZXIgdG8gQVJHQlVGIGdpdmVuIHB0ciB0byBTQ0FDSEUuICAqLworI2RlZmluZSBTRU1fQVJHQlVGKHNlbV9hcmcpICgmIChzZW1fYXJnKSAtPiBhcmdidWYpCisKKy8qIFRoZXJlIGFyZSBzZXZlcmFsIHN0eWxlcyBvZiBlbmdpbmVzLCBhbGwgZ2VuZXJhbGx5IHN1cHBvcnRlZCBieSB0aGUKKyAgIHNhbWUgY29kZToKKworICAgV0lUSF9TQ0FDSEUgJiYgV0lUSF9TQ0FDSEVfUEJCIC0gcHNldWRvLWJhc2ljLWJsb2NrIHNjYWNoaW5nCisgICBXSVRIX1NDQUNIRSAmJiAhV0lUSF9TQ0FDSEVfUEJCIC0gc2NhY2hpbmcgb24gYW4gaW5zbiBieSBpbnNuIGJhc2lzCisgICAhV0lUSF9TQ0FDSEUgLSBzaW1wbGUgZW5naW5lOiBmZXRjaCBhbiBpbnNuLCBleGVjdXRlIGFuIGluc24KKworICAgPz8/IFRoZSAhV0lUSF9TQ0FDSEUgY2FzZSBjYW4gYWxzbyBiZSBicm9rZW4gdXAgaW50byB0d28gZmxhdm91cnM6CisgICBleHRyYWN0IHRoZSBmaWVsZHMgb2YgdGhlIGluc24gaW50byBhbiBBUkdCVUYgc3RydWN0LCBvciBkZWZlciB0aGUKKyAgIGV4dHJhY3Rpb24gdG8gdGhlIHNlbWFudGljIGhhbmRsZXIuICBUaGUgV0lUSF9TQ0FDSEUgY2FzZSBhbHdheXMKKyAgIGV4dHJhY3RzIHRoZSBmaWVsZHMgaW50byBhbiBBUkdCVUYgc3RydWN0LiAgKi8KKworI2lmIFdJVEhfU0NBQ0hFCisKKyNkZWZpbmUgQ0lBX0FERFIoY2lhKSAoY2lhKQorCisjaWYgV0lUSF9TQ0FDSEVfUEJCCisKKy8qIFJldHVybiB0aGUgc2NhY2hlIHBvaW50ZXIgb2YgdGhlIGN1cnJlbnQgaW5zbi4gICovCisjZGVmaW5lIFNFTV9TRU1fQVJHKHZwYywgc2MpICh2cGMpCisKKy8qIFJldHVybiB0aGUgdmlydHVhbCBwYyBvZiB0aGUgbmV4dCBpbnNuIHRvIGV4ZWN1dGUKKyAgIChhc3N1bWluZyB0aGlzIGlzbid0IGEgY3RpIG9yIHRoZSBicmFuY2ggaXNuJ3QgdGFrZW4pLiAgKi8KKyNkZWZpbmUgU0VNX05FWFRfVlBDKHNlbV9hcmcsIHBjLCBsZW4pICgoc2VtX2FyZykgKyAxKQorCisvKiBVcGRhdGUgdGhlIGluc3RydWN0aW9uIGNvdW50ZXIuICAqLworI2RlZmluZSBQQkJfVVBEQVRFX0lOU05fQ09VTlQoY3B1LHNjKSBcCisgIChDUFVfSU5TTl9DT1VOVCAoY3B1KSArPSBTRU1fQVJHQlVGIChzYykgLT4gZmllbGRzLmNoYWluLmluc25fY291bnQpCisKKy8qIFZhbHVlIGZvciBicl9hZGRyX3B0ciBpbmRpY2F0aW5nIGJyYW5jaCB3YXNuJ3QgdGFrZW4uICAqLworI2RlZmluZSBTRU1fQlJBTkNIX1VOVEFLRU4gKChTRU1fUEMgKikgMCkKKworLyogVmFsdWUgZm9yIGJyX2FkZHJfcHRyIGluZGljYXRpbmcgYnJhbmNoIHdhcyB0YWtlbiB0byB1bmNhY2hlYWJsZQorICAgYWRkcmVzcyAoZS5nLiBqIHJlZykuICAqLworI2RlZmluZSBTRU1fQlJBTkNIX1VOQ0FDSEVBQkxFICgoU0VNX1BDICopIDEpCisKKy8qIEluaXRpYWxpemUgbmV4dC1wYmIgbGluayBmb3IgU0VNX0JSQU5DSF9WSUFfQ0FDSEUuICAqLworI2RlZmluZSBTRU1fQlJBTkNIX0lOSVRfRVhUUkFDVChhYnVmKSBcCitkbyB7IChhYnVmKS0+ZmllbGRzLmN0aS5hZGRyX2NhY2hlID0gMDsgfSB3aGlsZSAoMCkKKworLyogRG8gbm90IGFwcGVuZCBhIGA7JyB0byBpbnZvY2F0aW9ucyBvZiB0aGlzLgorICAgbnBjLG5wY19wdHIgYXJlIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGN0aSBpbnNuIGFuZCBjdGktY2hhaW4uICAqLworI2RlZmluZSBTRU1fQlJBTkNIX0lOSVQgXAorICBJQUREUiBucGMgPSAwOyAvKiBhc3NpZ24gYSB2YWx1ZSBmb3IgLVdhbGwgKi8gXAorICBTRU1fUEMgKm5wY19wdHIgPSBTRU1fQlJBTkNIX1VOVEFLRU47CisKKy8qIFNFTV9JTl9TV0lUQ0ggaXMgZGVmaW5lZCBhdCB0aGUgdG9wIG9mIHRoZSBtYWlubG9vcC5jIGZpbGVzCisgICBnZW5lcmF0ZWQgYnkgZ2VubWxvb3Auc2guICBJdCBleGlzdHMgc28gZ2VuZXJhdGVkIHNlbWFudGljIGNvZGUgbmVlZG4ndAorICAgY2FyZSB3aGV0aGVyIGl0J3MgYmVpbmcgcHV0IGluIGEgc3dpdGNoIG9yIGluIGEgZnVuY3Rpb24uICAqLworI2lmZGVmIFNFTV9JTl9TV0lUQ0gKKyNkZWZpbmUgU0VNX0JSQU5DSF9GSU5JKHBjdmFyKSBcCitkbyB7IFwKKyAgcGJiX2JyX25wYyA9IG5wYzsgXAorICBwYmJfYnJfbnBjX3B0ciA9IG5wY19wdHI7IFwKK30gd2hpbGUgKDApCisjZWxzZSAvKiAxIHNlbWFudGljIGZ1bmN0aW9uIHBlciBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBTRU1fQlJBTkNIX0ZJTkkocGN2YXIpIFwKK2RvIHsgXAorICBDUFVfUEJCX0JSX05QQyAoY3VycmVudF9jcHUpID0gbnBjOyBcCisgIENQVV9QQkJfQlJfTlBDX1BUUiAoY3VycmVudF9jcHUpID0gbnBjX3B0cjsgXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBSZXR1cm4gYWRkcmVzcyBvZiBjYWNoZWQgYnJhbmNoIGFkZHJlc3MgdmFsdWUuICAqLworI2RlZmluZSBTRU1fQlJBTkNIX0FERFJfQ0FDSEUoc2VtX2FyZykgXAorICAoJiBTRU1fQVJHQlVGIChzZW1fYXJnKS0+ZmllbGRzLmN0aS5hZGRyX2NhY2hlKQorCisjZGVmaW5lIFNFTV9CUkFOQ0hfVklBX0NBQ0hFKGNwdSwgc2MsIG5ld3ZhbCwgcGN2YXIsIGNhY2hldmFycHRyKSBcCitkbyB7IFwKKyAgbnBjID0gKG5ld3ZhbCk7IFwKKyAgbnBjX3B0ciA9IChjYWNoZXZhcnB0cik7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU0VNX0JSQU5DSF9WSUFfQUREUihjcHUsIHNjLCBuZXd2YWwsIHBjdmFyKSBcCitkbyB7IFwKKyAgbnBjID0gKG5ld3ZhbCk7IFwKKyAgbnBjX3B0ciA9IFNFTV9CUkFOQ0hfVU5DQUNIRUFCTEU7IFwKK30gd2hpbGUgKDApCisKKyNlbHNlIC8qICEgV0lUSF9TQ0FDSEVfUEJCICovCisKKyNkZWZpbmUgU0VNX1NFTV9BUkcodnBjLCBzYykgKHNjKQorCisjZGVmaW5lIFNFTV9ORVhUX1ZQQyhzZW1fYXJnLCBwYywgbGVuKSAoKHBjKSArIChsZW4pKQorCisjZGVmaW5lIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUKGFidWYpIGRvIHsgfSB3aGlsZSAoMCkKKworLyogPz8/IE1heSB3aXNoIHRvIG1vdmUgdGFrZW5fcCBvdXQgb2YgaGVyZSBhbmQgbWFrZSBpdCBleHBsaWNpdC4gICovCisjZGVmaW5lIFNFTV9CUkFOQ0hfSU5JVCBcCisgIGludCB0YWtlbl9wID0gMDsKKworI2lmbmRlZiBUQVJHRVRfU0VNX0JSQU5DSF9GSU5JKHBjdmFyLCB0YWtlbl9wKQorI2RlZmluZSBUQVJHRVRfU0VNX0JSQU5DSF9GSU5JKHBjdmFyLCB0YWtlbl9wKQorI2VuZGlmCisjZGVmaW5lIFNFTV9CUkFOQ0hfRklOSShwY3ZhcikgXAorICBkbyB7IFRBUkdFVF9TRU1fQlJBTkNIX0ZJTkkgKHBjdmFyLCB0YWtlbl9wKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBTRU1fQlJBTkNIX0FERFJfQ0FDSEUoc2VtX2FyZykgc2hvdWxkbnRfYmVfdXNlZAorCisjZGVmaW5lIFNFTV9CUkFOQ0hfVklBX0NBQ0hFKGNwdSwgc2MsIG5ld3ZhbCwgcGN2YXIsIGNhY2hldmFyKSBcCitkbyB7IFwKKyAgKHBjdmFyKSA9IChuZXd2YWwpOyBcCisgIHRha2VuX3AgPSAxOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNFTV9CUkFOQ0hfVklBX0FERFIoY3B1LCBzYywgbmV3dmFsLCBwY3ZhcikgXAorZG8geyBcCisgIChwY3ZhcikgPSAobmV3dmFsKTsgXAorICB0YWtlbl9wID0gMTsgXAorfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qICEgV0lUSF9TQ0FDSEVfUEJCICovCisKKyNlbHNlIC8qICEgV0lUSF9TQ0FDSEUgKi8KKworLyogVGhpcyBpcyB0aGUgInNpbXBsZSIgZW5naW5lIGNhc2UuICAqLworCisjZGVmaW5lIENJQV9BRERSKGNpYSkgKGNpYSkKKworI2RlZmluZSBTRU1fU0VNX0FSRyh2cGMsIHNjKSAoc2MpCisKKyNkZWZpbmUgU0VNX05FWFRfVlBDKHNlbV9hcmcsIHBjLCBsZW4pICgocGMpICsgKGxlbikpCisKKyNkZWZpbmUgU0VNX0JSQU5DSF9JTklUIFwKKyAgaW50IHRha2VuX3AgPSAwOworCisjZGVmaW5lIFNFTV9CUkFOQ0hfQUREUl9DQUNIRShzZW1fYXJnKSBzaG91bGRudF9iZV91c2VkCisKKyNkZWZpbmUgU0VNX0JSQU5DSF9WSUFfQ0FDSEUoY3B1LCBhYnVmLCBuZXd2YWwsIHBjdmFyLCBjYWNoZXZhcikgXAorZG8geyBcCisgIChwY3ZhcikgPSAobmV3dmFsKTsgXAorICB0YWtlbl9wID0gMTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTRU1fQlJBTkNIX1ZJQV9BRERSKGNwdSwgYWJ1ZiwgbmV3dmFsLCBwY3ZhcikgXAorZG8geyBcCisgIChwY3ZhcikgPSAobmV3dmFsKTsgXAorICB0YWtlbl9wID0gMTsgXAorfSB3aGlsZSAoMCkKKworLyogRmluaXNoIG9mZiBicmFuY2ggaW5zbnMuCisgICBUaGUgdGFyZ2V0IG11c3QgZGVmaW5lIFRBUkdFVF9TRU1fQlJBTkNIX0ZJTkkuCisgICA/Pz8gVGhpcyBjYW4gcHJvYmFibHkgZ28gYXdheSB3aGVuIGRlZmluZS1leGVjdXRlIGlzIGZpbmlzaGVkLiAgKi8KKyNkZWZpbmUgU0VNX0JSQU5DSF9GSU5JKHBjdmFyLCBib29sX2F0dHJzKSBcCisgIGRvIHsgVEFSR0VUX1NFTV9CUkFOQ0hfRklOSSAoKHBjdmFyKSwgKGJvb2xfYXR0cnMpLCB0YWtlbl9wKTsgfSB3aGlsZSAoMCkKKworLyogRmluaXNoIG9mZiBub24tYnJhbmNoIGluc25zLgorICAgVGhlIHRhcmdldCBtdXN0IGRlZmluZSBUQVJHRVRfU0VNX05CUkFOQ0hfRklOSS4KKyAgID8/PyBUaGlzIGNhbiBwcm9iYWJseSBnbyBhd2F5IHdoZW4gZGVmaW5lLWV4ZWN1dGUgaXMgZmluaXNoZWQuICAqLworI2RlZmluZSBTRU1fTkJSQU5DSF9GSU5JKHBjdmFyLCBib29sX2F0dHJzKSBcCisgIGRvIHsgVEFSR0VUX1NFTV9OQlJBTkNIX0ZJTkkgKChwY3ZhciksIChib29sX2F0dHJzKSk7IH0gd2hpbGUgKDApCisKKyNlbmRpZiAvKiAhIFdJVEhfU0NBQ0hFICovCisMCisvKiBJbnN0cnVjdGlvbiBpbmZvcm1hdGlvbi4gICovCisKKy8qIENvbXBpbGUgdGltZSBjb21wdXRhYmxlIGluc3RydWN0aW9uIGRhdGEuCisKKyAgID8/PyBNYXkgd2lzaCB0byBtb3ZlIHBhcmFsbGVsIGV4ZWN1dGlvbiBzdXBwb3J0IGludG8gaXRzIG93biBzdHJ1Y3QuCisgICBJdCdzIGEgZmFpciBiaXQgb2YgImNsdXR0ZXIiIGZvciB0aGUgIm5vcm1hbCIgY2FzZS4gICovCisKK3N0cnVjdCBpbnNuX3NlbSB7CisgIC8qIFRoZSBpbnN0cnVjdGlvbiB0eXBlIChhIG51bWJlciB0aGF0IGlkZW50aWZpZXMgZWFjaCBpbnNuIG92ZXIgdGhlCisgICAgIGVudGlyZSBhcmNoaXRlY3R1cmUpLiAgKi8KKyAgQ0dFTl9JTlNOX1RZUEUgdHlwZTsKKworICAvKiBJbmRleCBpbiBJREVTQyB0YWJsZS4gICovCisgIGludCBpbmRleDsKKworICAvKiBTYW5pdHkgY2hlY2ssIGF0IG1vc3Qgb25lIG9mIHRoZXNlIG1heSBiZSB0cnVlLiAgKi8KKyNpZiBXSVRIX1BBUkFMTEVMX1JFQUQgJiYgV0lUSF9QQVJBTExFTF9XUklURQorI2Vycm9yICJCb3RoIFdJVEhfUEFSQUxMRUxfUkVBRCAmJiBXSVRIX1BBUkFMTEVMX1dSSVRFIGNhbid0IGJlIHRydWUuIgorI2VuZGlmCisKKyNpZiBXSVRIX1BBUkFMTEVMX1JFQUQgfHwgV0lUSF9QQVJBTExFTF9XUklURQorICAvKiBJbmRleCBpbiBJREVTQyB0YWJsZSBvZiBwYXJhbGxlbCBoYW5kbGVyLiAgKi8KKyAgaW50IHBhcl9pbmRleDsKKyNlbmRpZgorCisjaWYgV0lUSF9QQVJBTExFTF9SRUFECisjaWZuZGVmIF9fR05VQ19fCisgIC8qIFNlbWFudGljIGZvcm1hdCBudW1iZXIgb2YgcHJlLXJlYWQgaGFuZGxlci4KKyAgICAgT25seSB1c2VkIGJ5IGNoaXBzIHRoYXQgc3VwcG9ydCBwYXJhbGxlbCBleGVjdXRpb24gb2Ygc2V2ZXJhbCBpbnNucy4KKyAgICAgSXQgaXMgYWx3YXlzIGltcGxlbWVudGVkIGFzIGEgYHN3aXRjaCcuICBJbiB0aGUgY2FzZSBvZiBHTlVDIHdlIHVzZQorICAgICBjb21wdXRlZCBnb3Rvcy4gIFdoZW4gbm90IEdOVUMsIHRoaXMgaXMgdGhlIGFyZ3VtZW50IHRvIGBzd2l0Y2gnLiAgKi8KKyAgaW50IGZtdDsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBXSVRIX1BBUkFMTEVMX1dSSVRFCisgIC8qIEluZGV4IGluIElERVNDIHRhYmxlIG9mIHdyaXRlYmFjayBoYW5kbGVyLgorICAgICBPbmx5IHVzZWQgYnkgY2hpcHMgdGhhdCBzdXBwb3J0IHBhcmFsbGVsIGV4ZWN1dGlvbiBvZiBzZXZlcmFsIGluc25zLiAgKi8KKyAgaW50IHdyaXRlX2luZGV4OworI2VuZGlmCisKKyAgLyogUm91dGluZXMgdG8gZXhlY3V0ZSB0aGUgaW5zbi4KKyAgICAgVGhlIGZ1bGwgdmVyc2lvbiBoYXMgYWxsIGZlYXR1cmVzIChwcm9maWxpbmcsdHJhY2luZykgY29tcGlsZWQgaW4uCisgICAgIFRoZSBmYXN0IHZlcnNpb24gaGFzIG5vbmUgb2YgdGhhdC4gICovCisjaWYgISBXSVRIX1NFTV9TV0lUQ0hfRlVMTAorICBTRU1BTlRJQ19GTiAqc2VtX2Z1bGw7CisjZW5kaWYKKyNpZiBXSVRIX0ZBU1QgJiYgISBXSVRIX1NFTV9TV0lUQ0hfRkFTVAorICBTRU1BTlRJQ19GTiAqc2VtX2Zhc3Q7CisjZW5kaWYKK307CisKKy8qIFJ1bi10aW1lIGNvbXB1dGVkIGluc3RydWN0aW9uIGRlc2NyaXB0b3IuICAqLworCitzdHJ1Y3QgaWRlc2MgeworICAvKiBQYXJhbGxlbCByZWFkLWJlZm9yZS1leGVjIHN1cHBvcnQuICAqLworI2lmIFdJVEhfUEFSQUxMRUxfUkVBRAorICBzdHJ1Y3QgaWRlc2MgKnBhcl9pZGVzYzsKKyNpZmRlZiBfX0dOVUNfXworICB2b2lkICpyZWFkOworI2Vsc2UKKyAgaW50IGZtdDsKKyNlbmRpZgorI2VuZGlmCisKKyAgLyogUGFyYWxsZWwgd3JpdGUtYWZ0ZXItZXhlYyBzdXBwb3J0LiAgKi8KKyNpZiBXSVRIX1BBUkFMTEVMX1dSSVRFCisgIC8qIFBvaW50ZXIgdG8gcGFyYWxsZWwgaGFuZGxlciBpZiBzZXJpYWwgaW5zbi4KKyAgICAgUG9pbnRlciB0byB3cml0ZWJhY2sgaGFuZGxlciBpZiBwYXJhbGxlbCBpbnNuLiAgKi8KKyAgc3RydWN0IGlkZXNjICpwYXJfaWRlc2M7CisjZW5kaWYKKworI2lmIFdJVEhfU0VNX1NXSVRDSF9GVUxMCisjaWZkZWYgX19HTlVDX18KKyAgdm9pZCAqc2VtX2Z1bGxfbGFiOworI2Vsc2UKKyAgLyogbm90aGluZyBuZWVkZWQsIHN3aXRjaCdzIG9uIGBudW0nIG1lbWJlciAqLworI2VuZGlmCisjZWxzZQorICBTRU1BTlRJQ19GTiAqc2VtX2Z1bGw7CisjZW5kaWYKKworI2lmIFdJVEhfU0VNX1NXSVRDSF9GQVNUCisjaWZkZWYgX19HTlVDX18KKyAgdm9pZCAqc2VtX2Zhc3RfbGFiOworI2Vsc2UKKyAgLyogbm90aGluZyBuZWVkZWQsIHN3aXRjaCdzIG9uIGBudW0nIG1lbWJlciAqLworI2VuZGlmCisjZWxzZQorICBTRU1BTlRJQ19GTiAqc2VtX2Zhc3Q7CisjZW5kaWYKKworICAvKiBJbnN0cnVjdGlvbiBudW1iZXIgKGluZGV4IGluIElERVNDIHRhYmxlLCBwcm9maWxlIHRhYmxlKS4KKyAgICAgQWxzbyB1c2VkIHRvIHN3aXRjaCBvbiBpbiBub24tZ2NjIHNlbWFudGljIHN3aXRjaGVzLiAgKi8KKyAgaW50IG51bTsKKworICAvKiBpbnN0cnVjdGlvbiBkYXRhIChuYW1lLCBhdHRyaWJ1dGVzLCBzaXplLCBldGMuKSAqLworICBjb25zdCBDR0VOX0lOU04gKmlkYXRhOworCisgIC8qIGluc3RydWN0aW9uIGF0dHJpYnV0ZXMsIGNvcGllZCBmcm9tIGBpZGF0YScgZm9yIHNwZWVkICovCisgIGNvbnN0IENHRU5fSU5TTl9BVFRSX1RZUEUgKmF0dHJzOworCisgIC8qIGluc3RydWN0aW9uIGxlbmd0aCBpbiBieXRlcywgY29waWVkIGZyb20gYGlkYXRhJyBmb3Igc3BlZWQgKi8KKyAgaW50IGxlbmd0aDsKKworICAvKiBwcm9maWxpbmcvbW9kZWxsaW5nIHN1cHBvcnQgKi8KKyAgY29uc3QgSU5TTl9USU1JTkcgKnRpbWluZzsKK307CisMCisvKiBUcmFjaW5nL3Byb2ZpbGluZy4gICovCisKKy8qIFJldHVybiBub24temVybyBpZiBhIGJlZm9yZS9hZnRlciBoYW5kbGVyIGlzIG5lZWRlZC4KKyAgIFdoZW4gdHJhY2luZy9wcm9maWxpbmcgYSBzZWxlY3RlZCByYW5nZSB0aGVyZSdzIG5vIG5lZWQgdG8gc2xvdworICAgZG93biBzaW11bGF0aW9uIG9mIHRoZSBvdGhlciBpbnNucyAoZXhjZXB0IHRvIGdldCBtb3JlIGFjY3VyYXRlIGRhdGEhKS4KKworICAgPz8/IE1heSB3aXNoIHRvIHByb2ZpbGUgYWxsIGluc25zIGlmIGRvaW5nIGluc24gdHJhY2luZywgb3IgdG8KKyAgIGdldCBtb3JlIGFjY3VyYXRlIGN5Y2xlIGRhdGEuCisKKyAgIEZpcnN0IHRlc3QgQU5ZX1Agc28gd2UgYXZvaWQgYSBwb3RlbnRpYWxseSBleHBlbnNpdmUgSElUX1AgY2FsbAorICAgW2lmIHRoZXJlIGFyZSBsb3RzIG9mIGFkZHJlc3MgcmFuZ2VzXS4gICovCisKKyNkZWZpbmUgUENfSU5fVFJBQ0VfUkFOR0VfUChjcHUsIHBjKSBcCisgIChUUkFDRV9BTllfUCAoY3B1KSBcCisgICAmJiBBRERSX1JBTkdFX0hJVF9QIChUUkFDRV9SQU5HRSAoQ1BVX1RSQUNFX0RBVEEgKGNwdSkpLCAocGMpKSkKKyNkZWZpbmUgUENfSU5fUFJPRklMRV9SQU5HRV9QKGNwdSwgcGMpIFwKKyAgKFBST0ZJTEVfQU5ZX1AgKGNwdSkgXAorICAgJiYgQUREUl9SQU5HRV9ISVRfUCAoUFJPRklMRV9SQU5HRSAoQ1BVX1BST0ZJTEVfREFUQSAoY3B1KSksIChwYykpKQorCisjZW5kaWYgLyogQ0dFTl9FTkdJTkVfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9jZ2VuLW1lbS5oIGIvc2ltL2NvbW1vbi9jZ2VuLW1lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MWNjYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL2NnZW4tbWVtLmgKQEAgLTAsMCArMSwyMDMgQEAKKy8qIE1lbW9yeSBvcHMgaGVhZGVyIGZvciBDR0VOLWJhc2VkIHNpbXVsYXRvcnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgQ0dFTl9NRU1fSAorI2RlZmluZSBDR0VOX01FTV9ICisKKyNpZmRlZiBNRU1PUFNfREVGSU5FX0lOTElORQorI2RlZmluZSBNRU1PUFNfSU5MSU5FCisjZWxzZQorI2RlZmluZSBNRU1PUFNfSU5MSU5FIGV4dGVybiBpbmxpbmUKKyNlbmRpZgorCisvKiBNZW1vcnkgcmVhZCBzdXBwb3J0LiAgKi8KKworI2lmIGRlZmluZWQgKF9fR05VQ19fKSB8fCBkZWZpbmVkIChNRU1PUFNfREVGSU5FX0lOTElORSkKKyNkZWZpbmUgREVDTEFSRV9HRVRNRU0obW9kZSwgc2l6ZSkgXAorTUVNT1BTX0lOTElORSBtb2RlIFwKK1hDT05DQVQyIChHRVRNRU0sbW9kZSkgKFNJTV9DUFUgKmNwdSwgSUFERFIgcGMsIEFERFIgYSkgXAoreyBcCisgIFBST0ZJTEVfQ09VTlRfUkVBRCAoY3B1LCBhLCBYQ09OQ0FUMiAoTU9ERV8sbW9kZSkpOyBcCisgIC8qIERvbid0IHJlYWQgYW55dGhpbmcgaW50byAidW5hbGlnbmVkIiBoZXJlLiAgQmFkIG5hbWUgY2hvaWNlLiAgKi9cCisgIHJldHVybiBYQ09OQ0FUMiAoc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfLHNpemUpIChjcHUsIHBjLCByZWFkX21hcCwgYSk7IFwKK30KKyNlbHNlCisjZGVmaW5lIERFQ0xBUkVfR0VUTUVNKG1vZGUsIHNpemUpIFwKK2V4dGVybiBtb2RlIFhDT05DQVQyIChHRVRNRU0sbW9kZSkgKFNJTV9DUFUgKiwgSUFERFIsIEFERFIpOworI2VuZGlmCisKK0RFQ0xBUkVfR0VUTUVNIChRSSwgMSkKK0RFQ0xBUkVfR0VUTUVNIChVUUksIDEpCitERUNMQVJFX0dFVE1FTSAoSEksIDIpCitERUNMQVJFX0dFVE1FTSAoVUhJLCAyKQorREVDTEFSRV9HRVRNRU0gKFNJLCA0KQorREVDTEFSRV9HRVRNRU0gKFVTSSwgNCkKK0RFQ0xBUkVfR0VUTUVNIChESSwgOCkKK0RFQ0xBUkVfR0VUTUVNIChVREksIDgpCisKKyN1bmRlZiBERUNMQVJFX0dFVE1FTQorCisjaWYgZGVmaW5lZCAoX19HTlVDX18pIHx8IGRlZmluZWQgKE1FTU9QU19ERUZJTkVfSU5MSU5FKQorI2RlZmluZSBERUNMQVJFX0dFVE1FTShtb2RlLCBzaXplKSBcCitNRU1PUFNfSU5MSU5FIG1vZGUgXAorWENPTkNBVDIgKEdFVE1FTSxtb2RlKSAoU0lNX0NQVSAqY3B1LCBJQUREUiBwYywgQUREUiBhKSBcCit7IFwKKyAgUFJPRklMRV9DT1VOVF9SRUFEIChjcHUsIGEsIFhDT05DQVQyIChNT0RFXyxtb2RlKSk7IFwKKyAgLyogRG9uJ3QgcmVhZCBhbnl0aGluZyBpbnRvICJ1bmFsaWduZWQiIGhlcmUuICBCYWQgbmFtZSBjaG9pY2UuICAqL1wKKyAgcmV0dXJuIFhDT05DQVQyIChzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF8sc2l6ZSkgKGNwdSwgcGMsIHJlYWRfbWFwLCBhKTsgXAorfQorI2Vsc2UKKyNkZWZpbmUgREVDTEFSRV9HRVRNRU0obW9kZSwgc2l6ZSkgXAorZXh0ZXJuIG1vZGUgWENPTkNBVDIgKEdFVE1FTSxtb2RlKSAoU0lNX0NQVSAqLCBJQUREUiwgQUREUik7CisjZW5kaWYKKworREVDTEFSRV9HRVRNRU0gKFNGLCA0KQorREVDTEFSRV9HRVRNRU0gKERGLCA4KQorLypERUNMQVJFX0dFVE1FTSAoVEYsIDE2KSovCisKKyN1bmRlZiBERUNMQVJFX0dFVE1FTQorDAorLyogTWVtb3J5IHdyaXRlIHN1cHBvcnQuICAqLworCisjaWYgZGVmaW5lZCAoX19HTlVDX18pIHx8IGRlZmluZWQgKE1FTU9QU19ERUZJTkVfSU5MSU5FKQorI2RlZmluZSBERUNMQVJFX1NFVE1FTShtb2RlLCBzaXplKSBcCitNRU1PUFNfSU5MSU5FIHZvaWQgXAorWENPTkNBVDIgKFNFVE1FTSxtb2RlKSAoU0lNX0NQVSAqY3B1LCBJQUREUiBwYywgQUREUiBhLCBtb2RlIHZhbCkgXAoreyBcCisgIFBST0ZJTEVfQ09VTlRfV1JJVEUgKGNwdSwgYSwgWENPTkNBVDIgKE1PREVfLG1vZGUpKTsgXAorICAvKiBEb24ndCByZWFkIGFueXRoaW5nIGludG8gInVuYWxpZ25lZCIgaGVyZS4gIEJhZCBuYW1lIGNob2ljZS4gICovIFwKKyAgWENPTkNBVDIgKHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF8sc2l6ZSkgKGNwdSwgcGMsIHdyaXRlX21hcCwgYSwgdmFsKTsgXAorfQorI2Vsc2UKKyNkZWZpbmUgREVDTEFSRV9TRVRNRU0obW9kZSwgc2l6ZSkgXAorZXh0ZXJuIHZvaWQgWENPTkNBVDIgKFNFVE1FTSxtb2RlKSAoU0lNX0NQVSAqLCBJQUREUiwgQUREUiwgbW9kZSk7CisjZW5kaWYKKworREVDTEFSRV9TRVRNRU0gKFFJLCAxKQorREVDTEFSRV9TRVRNRU0gKFVRSSwgMSkKK0RFQ0xBUkVfU0VUTUVNIChISSwgMikKK0RFQ0xBUkVfU0VUTUVNIChVSEksIDIpCitERUNMQVJFX1NFVE1FTSAoU0ksIDQpCitERUNMQVJFX1NFVE1FTSAoVVNJLCA0KQorREVDTEFSRV9TRVRNRU0gKERJLCA4KQorREVDTEFSRV9TRVRNRU0gKFVESSwgOCkKKworLyoKK0RFQ0xBUkVfU0VUTUVNIChTRiwgNCkKK0RFQ0xBUkVfU0VUTUVNIChERiwgOCkKK0RFQ0xBUkVfU0VUTUVNIChURiwgMTYpCisqLworCisjdW5kZWYgREVDTEFSRV9TRVRNRU0KKwwKKy8qIEluc3RydWN0aW9uIHJlYWQgc3VwcG9ydC4gICovCisKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgfHwgZGVmaW5lZCAoTUVNT1BTX0RFRklORV9JTkxJTkUpCisjZGVmaW5lIERFQ0xBUkVfR0VUSU1FTShtb2RlLCBzaXplKSBcCitNRU1PUFNfSU5MSU5FIG1vZGUgXAorWENPTkNBVDIgKEdFVElNRU0sbW9kZSkgKFNJTV9DUFUgKmNwdSwgSUFERFIgYSkgXAoreyBcCisgIC8qUFJPRklMRV9DT1VOVF9SRUFEIChjcHUsIGEsIFhDT05DQVQyIChNT0RFXyxtb2RlKSk7Ki8gXAorICAvKiBEb24ndCByZWFkIGFueXRoaW5nIGludG8gInVuYWxpZ25lZCIgaGVyZS4gIEJhZCBuYW1lIGNob2ljZS4gICovXAorICByZXR1cm4gWENPTkNBVDIgKHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkXyxzaXplKSAoY3B1LCBhLCBleGVjX21hcCwgYSk7IFwKK30KKyNlbHNlCisjZGVmaW5lIERFQ0xBUkVfR0VUSU1FTShtb2RlLCBzaXplKSBcCitleHRlcm4gbW9kZSBYQ09OQ0FUMiAoR0VUSU1FTSxtb2RlKSAoU0lNX0NQVSAqLCBBRERSKTsKKyNlbmRpZgorCitERUNMQVJFX0dFVElNRU0gKFVRSSwgMSkKK0RFQ0xBUkVfR0VUSU1FTSAoVUhJLCAyKQorREVDTEFSRV9HRVRJTUVNIChVU0ksIDQpCitERUNMQVJFX0dFVElNRU0gKFVESSwgOCkKKworI3VuZGVmIERFQ0xBUkVfR0VUSU1FTQorDAorLyogR0VUVDxtb2RlPjogdHJhbnNsYXRlIHRhcmdldCB2YWx1ZSBhdCBQIHRvIGhvc3QgdmFsdWUuCisgICBUaGlzIG5lZWRuJ3QgYmUgdmVyeSBlZmZpY2llbnQgKGkuZS4gY2FuIGNhbGwgbWVtY3B5KSBhcyB0aGlzIGlzCisgICBvbmx5IHVzZWQgd2hlbiBpbnRlcmZhY2luZyB3aXRoIHRoZSBvdXRzaWRlIHdvcmxkIChlLmcuIGdkYikuICAqLworCisjaWYgZGVmaW5lZCAoX19HTlVDX18pIHx8IGRlZmluZWQgKE1FTU9QU19ERUZJTkVfSU5MSU5FKQorI2RlZmluZSBERUNMQVJFX0dFVFQobW9kZSwgc2l6ZSkgXAorTUVNT1BTX0lOTElORSBtb2RlIFwKK1hDT05DQVQyIChHRVRULG1vZGUpICh1bnNpZ25lZCBjaGFyICpwKSBcCit7IFwKKyAgbW9kZSB0bXA7IFwKKyAgbWVtY3B5ICgmdG1wLCBwLCBzaXplb2YgKG1vZGUpKTsgXAorICByZXR1cm4gWENPTkNBVDIgKFQySF8sc2l6ZSkgKHRtcCk7IFwKK30KKyNlbHNlCisjZGVmaW5lIERFQ0xBUkVfR0VUVChtb2RlLCBzaXplKSBcCitleHRlcm4gbW9kZSBYQ09OQ0FUMiAoR0VUVCxtb2RlKSAodW5zaWduZWQgY2hhciAqKTsKKyNlbmRpZgorCitERUNMQVJFX0dFVFQgKFFJLCAxKQorREVDTEFSRV9HRVRUIChVUUksIDEpCitERUNMQVJFX0dFVFQgKEhJLCAyKQorREVDTEFSRV9HRVRUIChVSEksIDIpCitERUNMQVJFX0dFVFQgKFNJLCA0KQorREVDTEFSRV9HRVRUIChVU0ksIDQpCitERUNMQVJFX0dFVFQgKERJLCA4KQorREVDTEFSRV9HRVRUIChVREksIDgpCisKKy8qCitERUNMQVJFX0dFVFQgKFNGLCA0KQorREVDTEFSRV9HRVRUIChERiwgOCkKK0RFQ0xBUkVfR0VUVCAoVEYsIDE2KQorKi8KKworI3VuZGVmIERFQ0xBUkVfR0VUVAorDAorLyogU0VUVDxtb2RlPjogdHJhbnNsYXRlIGhvc3QgdmFsdWUgdG8gdGFyZ2V0IHZhbHVlIGFuZCBzdG9yZSBhdCBQLgorICAgVGhpcyBuZWVkbid0IGJlIHZlcnkgZWZmaWNpZW50IChpLmUuIGNhbiBjYWxsIG1lbWNweSkgYXMgdGhpcyBpcworICAgb25seSB1c2VkIHdoZW4gaW50ZXJmYWNpbmcgd2l0aCB0aGUgb3V0c2lkZSB3b3JsZCAoZS5nLiBnZGIpLiAgKi8KKworI2lmIGRlZmluZWQgKF9fR05VQ19fKSB8fCBkZWZpbmVkIChNRU1PUFNfREVGSU5FX0lOTElORSkKKyNkZWZpbmUgREVDTEFSRV9TRVRUKG1vZGUsIHNpemUpIFwKK01FTU9QU19JTkxJTkUgdm9pZCBcCitYQ09OQ0FUMiAoU0VUVCxtb2RlKSAodW5zaWduZWQgY2hhciAqYnVmLCBtb2RlIHZhbCkgXAoreyBcCisgIG1vZGUgdG1wOyBcCisgIHRtcCA9IFhDT05DQVQyIChIMlRfLHNpemUpICh2YWwpOyBcCisgIG1lbWNweSAoYnVmLCAmdG1wLCBzaXplb2YgKG1vZGUpKTsgXAorfQorI2Vsc2UKKyNkZWZpbmUgREVDTEFSRV9TRVRUKG1vZGUsIHNpemUpIFwKK2V4dGVybiBtb2RlIFhDT05DQVQyIChHRVRULG1vZGUpICh1bnNpZ25lZCBjaGFyICosIG1vZGUpOworI2VuZGlmCisKK0RFQ0xBUkVfU0VUVCAoUUksIDEpCitERUNMQVJFX1NFVFQgKFVRSSwgMSkKK0RFQ0xBUkVfU0VUVCAoSEksIDIpCitERUNMQVJFX1NFVFQgKFVISSwgMikKK0RFQ0xBUkVfU0VUVCAoU0ksIDQpCitERUNMQVJFX1NFVFQgKFVTSSwgNCkKK0RFQ0xBUkVfU0VUVCAoREksIDgpCitERUNMQVJFX1NFVFQgKFVESSwgOCkKKworLyoKK0RFQ0xBUkVfU0VUVCAoU0YsIDQpCitERUNMQVJFX1NFVFQgKERGLCA4KQorREVDTEFSRV9TRVRUIChURiwgMTYpCisqLworCisjdW5kZWYgREVDTEFSRV9TRVRUCisKKyNlbmRpZiAvKiBDR0VOX01FTV9IICovCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2NnZW4tb3BzLmggYi9zaW0vY29tbW9uL2NnZW4tb3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjMGU2YwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vY2dlbi1vcHMuaApAQCAtMCwwICsxLDg5NyBAQAorLyogU2VtYW50aWNzIG9wcyBzdXBwb3J0IGZvciBDR0VOLWJhc2VkIHNpbXVsYXRvcnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2lmbmRlZiBDR0VOX1NFTV9PUFNfSAorI2RlZmluZSBDR0VOX1NFTV9PUFNfSAorCisvKiBTZW1hbnRpYyBvcGVyYXRpb25zLgorICAgQXQgb25lIHBvaW50IHRoaXMgZmlsZSB3YXMgbWFjaGluZSBnZW5lcmF0ZWQuICBNYXliZSBpdCB3aWxsIGJlIGFnYWluLiAgKi8KKworLyogVGhlc2UgZG9uJ3QgcmVhbGx5IGhhdmUgYSBtb2RlLiAgKi8KKyNkZWZpbmUgQU5ESUYoeCwgeSkgKCh4KSAmJiAoeSkpCisjZGVmaW5lIE9SSUYoeCwgeSkgKCh4KSB8fCAoeSkpCisKKyNkZWZpbmUgQU5EQkkoeCwgeSkgKCh4KSAmICh5KSkKKyNkZWZpbmUgT1JCSSh4LCB5KSAoKHgpIHwgKHkpKQorI2RlZmluZSBYT1JCSSh4LCB5KSAoKHgpIF4gKHkpKQorI2RlZmluZSBORUdCSSh4KSAoLSAoeCkpCisjZGVmaW5lIE5PVEJJKHgpICghIChCSSkgKHgpKQorI2RlZmluZSBJTlZCSSh4KSAofiAoeCkpCisjZGVmaW5lIEVRQkkoeCwgeSkgKChCSSkgKHgpID09IChCSSkgKHkpKQorI2RlZmluZSBORUJJKHgsIHkpICgoQkkpICh4KSAhPSAoQkkpICh5KSkKKyNkZWZpbmUgTFRCSSh4LCB5KSAoKEJJKSAoeCkgPCAoQkkpICh5KSkKKyNkZWZpbmUgTEVCSSh4LCB5KSAoKEJJKSAoeCkgPD0gKEJJKSAoeSkpCisjZGVmaW5lIEdUQkkoeCwgeSkgKChCSSkgKHgpID4gKEJJKSAoeSkpCisjZGVmaW5lIEdFQkkoeCwgeSkgKChCSSkgKHgpID49IChCSSkgKHkpKQorI2RlZmluZSBMVFVCSSh4LCB5KSAoKEJJKSAoeCkgPCAoQkkpICh5KSkKKyNkZWZpbmUgTEVVQkkoeCwgeSkgKChCSSkgKHgpIDw9IChCSSkgKHkpKQorI2RlZmluZSBHVFVCSSh4LCB5KSAoKEJJKSAoeCkgPiAoQkkpICh5KSkKKyNkZWZpbmUgR0VVQkkoeCwgeSkgKChCSSkgKHgpID49IChCSSkgKHkpKQorCisjZGVmaW5lIEFERFFJKHgsIHkpICgoeCkgKyAoeSkpCisjZGVmaW5lIFNVQlFJKHgsIHkpICgoeCkgLSAoeSkpCisjZGVmaW5lIE1VTFFJKHgsIHkpICgoeCkgKiAoeSkpCisjZGVmaW5lIERJVlFJKHgsIHkpICgoUUkpICh4KSAvIChRSSkgKHkpKQorI2RlZmluZSBVRElWUUkoeCwgeSkgKChVUUkpICh4KSAvIChVUUkpICh5KSkKKyNkZWZpbmUgTU9EUUkoeCwgeSkgKChRSSkgKHgpICUgKFFJKSAoeSkpCisjZGVmaW5lIFVNT0RRSSh4LCB5KSAoKFVRSSkgKHgpICUgKFVRSSkgKHkpKQorI2RlZmluZSBTUkFRSSh4LCB5KSAoKFFJKSAoeCkgPj4gKHkpKQorI2RlZmluZSBTUkxRSSh4LCB5KSAoKFVRSSkgKHgpID4+ICh5KSkKKyNkZWZpbmUgU0xMUUkoeCwgeSkgKChVUUkpICh4KSA8PCAoeSkpCitleHRlcm4gUUkgUk9SUUkgUEFSQU1TICgoUUksIGludCkpOworZXh0ZXJuIFFJIFJPTFFJIFBBUkFNUyAoKFFJLCBpbnQpKTsKKyNkZWZpbmUgQU5EUUkoeCwgeSkgKCh4KSAmICh5KSkKKyNkZWZpbmUgT1JRSSh4LCB5KSAoKHgpIHwgKHkpKQorI2RlZmluZSBYT1JRSSh4LCB5KSAoKHgpIF4gKHkpKQorI2RlZmluZSBORUdRSSh4KSAoLSAoeCkpCisjZGVmaW5lIE5PVFFJKHgpICghIChRSSkgKHgpKQorI2RlZmluZSBJTlZRSSh4KSAofiAoeCkpCisjZGVmaW5lIEVRUUkoeCwgeSkgKChRSSkgKHgpID09IChRSSkgKHkpKQorI2RlZmluZSBORVFJKHgsIHkpICgoUUkpICh4KSAhPSAoUUkpICh5KSkKKyNkZWZpbmUgTFRRSSh4LCB5KSAoKFFJKSAoeCkgPCAoUUkpICh5KSkKKyNkZWZpbmUgTEVRSSh4LCB5KSAoKFFJKSAoeCkgPD0gKFFJKSAoeSkpCisjZGVmaW5lIEdUUUkoeCwgeSkgKChRSSkgKHgpID4gKFFJKSAoeSkpCisjZGVmaW5lIEdFUUkoeCwgeSkgKChRSSkgKHgpID49IChRSSkgKHkpKQorI2RlZmluZSBMVFVRSSh4LCB5KSAoKFVRSSkgKHgpIDwgKFVRSSkgKHkpKQorI2RlZmluZSBMRVVRSSh4LCB5KSAoKFVRSSkgKHgpIDw9IChVUUkpICh5KSkKKyNkZWZpbmUgR1RVUUkoeCwgeSkgKChVUUkpICh4KSA+IChVUUkpICh5KSkKKyNkZWZpbmUgR0VVUUkoeCwgeSkgKChVUUkpICh4KSA+PSAoVVFJKSAoeSkpCisKKyNkZWZpbmUgQURESEkoeCwgeSkgKCh4KSArICh5KSkKKyNkZWZpbmUgU1VCSEkoeCwgeSkgKCh4KSAtICh5KSkKKyNkZWZpbmUgTVVMSEkoeCwgeSkgKCh4KSAqICh5KSkKKyNkZWZpbmUgRElWSEkoeCwgeSkgKChISSkgKHgpIC8gKEhJKSAoeSkpCisjZGVmaW5lIFVESVZISSh4LCB5KSAoKFVISSkgKHgpIC8gKFVISSkgKHkpKQorI2RlZmluZSBNT0RISSh4LCB5KSAoKEhJKSAoeCkgJSAoSEkpICh5KSkKKyNkZWZpbmUgVU1PREhJKHgsIHkpICgoVUhJKSAoeCkgJSAoVUhJKSAoeSkpCisjZGVmaW5lIFNSQUhJKHgsIHkpICgoSEkpICh4KSA+PiAoeSkpCisjZGVmaW5lIFNSTEhJKHgsIHkpICgoVUhJKSAoeCkgPj4gKHkpKQorI2RlZmluZSBTTExISSh4LCB5KSAoKFVISSkgKHgpIDw8ICh5KSkKK2V4dGVybiBISSBST1JISSBQQVJBTVMgKChISSwgaW50KSk7CitleHRlcm4gSEkgUk9MSEkgUEFSQU1TICgoSEksIGludCkpOworI2RlZmluZSBBTkRISSh4LCB5KSAoKHgpICYgKHkpKQorI2RlZmluZSBPUkhJKHgsIHkpICgoeCkgfCAoeSkpCisjZGVmaW5lIFhPUkhJKHgsIHkpICgoeCkgXiAoeSkpCisjZGVmaW5lIE5FR0hJKHgpICgtICh4KSkKKyNkZWZpbmUgTk9USEkoeCkgKCEgKEhJKSAoeCkpCisjZGVmaW5lIElOVkhJKHgpICh+ICh4KSkKKyNkZWZpbmUgRVFISSh4LCB5KSAoKEhJKSAoeCkgPT0gKEhJKSAoeSkpCisjZGVmaW5lIE5FSEkoeCwgeSkgKChISSkgKHgpICE9IChISSkgKHkpKQorI2RlZmluZSBMVEhJKHgsIHkpICgoSEkpICh4KSA8IChISSkgKHkpKQorI2RlZmluZSBMRUhJKHgsIHkpICgoSEkpICh4KSA8PSAoSEkpICh5KSkKKyNkZWZpbmUgR1RISSh4LCB5KSAoKEhJKSAoeCkgPiAoSEkpICh5KSkKKyNkZWZpbmUgR0VISSh4LCB5KSAoKEhJKSAoeCkgPj0gKEhJKSAoeSkpCisjZGVmaW5lIExUVUhJKHgsIHkpICgoVUhJKSAoeCkgPCAoVUhJKSAoeSkpCisjZGVmaW5lIExFVUhJKHgsIHkpICgoVUhJKSAoeCkgPD0gKFVISSkgKHkpKQorI2RlZmluZSBHVFVISSh4LCB5KSAoKFVISSkgKHgpID4gKFVISSkgKHkpKQorI2RlZmluZSBHRVVISSh4LCB5KSAoKFVISSkgKHgpID49IChVSEkpICh5KSkKKworI2RlZmluZSBBRERTSSh4LCB5KSAoKHgpICsgKHkpKQorI2RlZmluZSBTVUJTSSh4LCB5KSAoKHgpIC0gKHkpKQorI2RlZmluZSBNVUxTSSh4LCB5KSAoKHgpICogKHkpKQorI2RlZmluZSBESVZTSSh4LCB5KSAoKFNJKSAoeCkgLyAoU0kpICh5KSkKKyNkZWZpbmUgVURJVlNJKHgsIHkpICgoVVNJKSAoeCkgLyAoVVNJKSAoeSkpCisjZGVmaW5lIE1PRFNJKHgsIHkpICgoU0kpICh4KSAlIChTSSkgKHkpKQorI2RlZmluZSBVTU9EU0koeCwgeSkgKChVU0kpICh4KSAlIChVU0kpICh5KSkKKyNkZWZpbmUgU1JBU0koeCwgeSkgKChTSSkgKHgpID4+ICh5KSkKKyNkZWZpbmUgU1JMU0koeCwgeSkgKChVU0kpICh4KSA+PiAoeSkpCisjZGVmaW5lIFNMTFNJKHgsIHkpICgoVVNJKSAoeCkgPDwgKHkpKQorZXh0ZXJuIFNJIFJPUlNJIFBBUkFNUyAoKFNJLCBpbnQpKTsKK2V4dGVybiBTSSBST0xTSSBQQVJBTVMgKChTSSwgaW50KSk7CisjZGVmaW5lIEFORFNJKHgsIHkpICgoeCkgJiAoeSkpCisjZGVmaW5lIE9SU0koeCwgeSkgKCh4KSB8ICh5KSkKKyNkZWZpbmUgWE9SU0koeCwgeSkgKCh4KSBeICh5KSkKKyNkZWZpbmUgTkVHU0koeCkgKC0gKHgpKQorI2RlZmluZSBOT1RTSSh4KSAoISAoU0kpICh4KSkKKyNkZWZpbmUgSU5WU0koeCkgKH4gKHgpKQorI2RlZmluZSBFUVNJKHgsIHkpICgoU0kpICh4KSA9PSAoU0kpICh5KSkKKyNkZWZpbmUgTkVTSSh4LCB5KSAoKFNJKSAoeCkgIT0gKFNJKSAoeSkpCisjZGVmaW5lIExUU0koeCwgeSkgKChTSSkgKHgpIDwgKFNJKSAoeSkpCisjZGVmaW5lIExFU0koeCwgeSkgKChTSSkgKHgpIDw9IChTSSkgKHkpKQorI2RlZmluZSBHVFNJKHgsIHkpICgoU0kpICh4KSA+IChTSSkgKHkpKQorI2RlZmluZSBHRVNJKHgsIHkpICgoU0kpICh4KSA+PSAoU0kpICh5KSkKKyNkZWZpbmUgTFRVU0koeCwgeSkgKChVU0kpICh4KSA8IChVU0kpICh5KSkKKyNkZWZpbmUgTEVVU0koeCwgeSkgKChVU0kpICh4KSA8PSAoVVNJKSAoeSkpCisjZGVmaW5lIEdUVVNJKHgsIHkpICgoVVNJKSAoeCkgPiAoVVNJKSAoeSkpCisjZGVmaW5lIEdFVVNJKHgsIHkpICgoVVNJKSAoeCkgPj0gKFVTSSkgKHkpKQorCisjaWZkZWYgRElfRk5fU1VQUE9SVAorZXh0ZXJuIERJIEFERERJIFBBUkFNUyAoKERJLCBESSkpOworZXh0ZXJuIERJIFNVQkRJIFBBUkFNUyAoKERJLCBESSkpOworZXh0ZXJuIERJIE1VTERJIFBBUkFNUyAoKERJLCBESSkpOworZXh0ZXJuIERJIERJVkRJIFBBUkFNUyAoKERJLCBESSkpOworZXh0ZXJuIERJIFVESVZESSBQQVJBTVMgKChESSwgREkpKTsKK2V4dGVybiBESSBNT0RESSBQQVJBTVMgKChESSwgREkpKTsKK2V4dGVybiBESSBVTU9EREkgUEFSQU1TICgoREksIERJKSk7CitleHRlcm4gREkgU1JBREkgUEFSQU1TICgoREksIGludCkpOworZXh0ZXJuIFVESSBTUkxESSBQQVJBTVMgKChVREksIGludCkpOworZXh0ZXJuIFVESSBTTExESSBQQVJBTVMgKChVREksIGludCkpOworZXh0ZXJuIERJIFJPUkRJIFBBUkFNUyAoKERJLCBpbnQpKTsKK2V4dGVybiBESSBST0xESSBQQVJBTVMgKChESSwgaW50KSk7CitleHRlcm4gREkgQU5EREkgUEFSQU1TICgoREksIERJKSk7CitleHRlcm4gREkgT1JESSBQQVJBTVMgKChESSwgREkpKTsKK2V4dGVybiBESSBYT1JESSBQQVJBTVMgKChESSwgREkpKTsKK2V4dGVybiBESSBORUdESSBQQVJBTVMgKChESSkpOworZXh0ZXJuIGludCBOT1RESSBQQVJBTVMgKChESSkpOworZXh0ZXJuIERJIElOVkRJIFBBUkFNUyAoKERJKSk7CitleHRlcm4gaW50IEVRREkgUEFSQU1TICgoREksIERJKSk7CitleHRlcm4gaW50IE5FREkgUEFSQU1TICgoREksIERJKSk7CitleHRlcm4gaW50IExUREkgUEFSQU1TICgoREksIERJKSk7CitleHRlcm4gaW50IExFREkgUEFSQU1TICgoREksIERJKSk7CitleHRlcm4gaW50IEdUREkgUEFSQU1TICgoREksIERJKSk7CitleHRlcm4gaW50IEdFREkgUEFSQU1TICgoREksIERJKSk7CitleHRlcm4gaW50IExUVURJIFBBUkFNUyAoKFVESSwgVURJKSk7CitleHRlcm4gaW50IExFVURJIFBBUkFNUyAoKFVESSwgVURJKSk7CitleHRlcm4gaW50IEdUVURJIFBBUkFNUyAoKFVESSwgVURJKSk7CitleHRlcm4gaW50IEdFVURJIFBBUkFNUyAoKFVESSwgVURJKSk7CisjZWxzZSAvKiAhIERJX0ZOX1NVUFBPUlQgKi8KKyNkZWZpbmUgQUREREkoeCwgeSkgKCh4KSArICh5KSkKKyNkZWZpbmUgU1VCREkoeCwgeSkgKCh4KSAtICh5KSkKKyNkZWZpbmUgTVVMREkoeCwgeSkgKCh4KSAqICh5KSkKKyNkZWZpbmUgRElWREkoeCwgeSkgKChESSkgKHgpIC8gKERJKSAoeSkpCisjZGVmaW5lIFVESVZESSh4LCB5KSAoKFVESSkgKHgpIC8gKFVESSkgKHkpKQorI2RlZmluZSBNT0RESSh4LCB5KSAoKERJKSAoeCkgJSAoREkpICh5KSkKKyNkZWZpbmUgVU1PRERJKHgsIHkpICgoVURJKSAoeCkgJSAoVURJKSAoeSkpCisjZGVmaW5lIFNSQURJKHgsIHkpICgoREkpICh4KSA+PiAoeSkpCisjZGVmaW5lIFNSTERJKHgsIHkpICgoVURJKSAoeCkgPj4gKHkpKQorI2RlZmluZSBTTExESSh4LCB5KSAoKFVESSkgKHgpIDw8ICh5KSkKK2V4dGVybiBESSBST1JESSBQQVJBTVMgKChESSwgaW50KSk7CitleHRlcm4gREkgUk9MREkgUEFSQU1TICgoREksIGludCkpOworI2RlZmluZSBBTkRESSh4LCB5KSAoKHgpICYgKHkpKQorI2RlZmluZSBPUkRJKHgsIHkpICgoeCkgfCAoeSkpCisjZGVmaW5lIFhPUkRJKHgsIHkpICgoeCkgXiAoeSkpCisjZGVmaW5lIE5FR0RJKHgpICgtICh4KSkKKyNkZWZpbmUgTk9UREkoeCkgKCEgKERJKSAoeCkpCisjZGVmaW5lIElOVkRJKHgpICh+ICh4KSkKKyNkZWZpbmUgRVFESSh4LCB5KSAoKERJKSAoeCkgPT0gKERJKSAoeSkpCisjZGVmaW5lIE5FREkoeCwgeSkgKChESSkgKHgpICE9IChESSkgKHkpKQorI2RlZmluZSBMVERJKHgsIHkpICgoREkpICh4KSA8IChESSkgKHkpKQorI2RlZmluZSBMRURJKHgsIHkpICgoREkpICh4KSA8PSAoREkpICh5KSkKKyNkZWZpbmUgR1RESSh4LCB5KSAoKERJKSAoeCkgPiAoREkpICh5KSkKKyNkZWZpbmUgR0VESSh4LCB5KSAoKERJKSAoeCkgPj0gKERJKSAoeSkpCisjZGVmaW5lIExUVURJKHgsIHkpICgoVURJKSAoeCkgPCAoVURJKSAoeSkpCisjZGVmaW5lIExFVURJKHgsIHkpICgoVURJKSAoeCkgPD0gKFVESSkgKHkpKQorI2RlZmluZSBHVFVESSh4LCB5KSAoKFVESSkgKHgpID4gKFVESSkgKHkpKQorI2RlZmluZSBHRVVESSh4LCB5KSAoKFVESSkgKHgpID49IChVREkpICh5KSkKKyNlbmRpZiAvKiBESV9GTl9TVVBQT1JUICovCisKKyNpZmRlZiBTRl9GTl9TVVBQT1JUCitleHRlcm4gU0YgQUREU0YgUEFSQU1TICgoU0YsIFNGKSk7CitleHRlcm4gU0YgU1VCU0YgUEFSQU1TICgoU0YsIFNGKSk7CitleHRlcm4gU0YgTkVHU0YgUEFSQU1TICgoU0YpKTsKK2V4dGVybiBTRiBNVUxTRiBQQVJBTVMgKChTRiwgU0YpKTsKK2V4dGVybiBTRiBESVZTRiBQQVJBTVMgKChTRiwgU0YpKTsKK2V4dGVybiBpbnQgRVFTRiBQQVJBTVMgKChTRiwgU0YpKTsKK2V4dGVybiBpbnQgTkVTRiBQQVJBTVMgKChTRiwgU0YpKTsKK2V4dGVybiBpbnQgTFRTRiBQQVJBTVMgKChTRiwgU0YpKTsKK2V4dGVybiBpbnQgTEVTRiBQQVJBTVMgKChTRiwgU0YpKTsKK2V4dGVybiBpbnQgR1RTRiBQQVJBTVMgKChTRiwgU0YpKTsKK2V4dGVybiBpbnQgR0VTRiBQQVJBTVMgKChTRiwgU0YpKTsKK2V4dGVybiBTRiBBQlNTRiBQQVJBTVMgKChTRikpOworZXh0ZXJuIFNGIFNRUlRTRiBQQVJBTVMgKChTRikpOworZXh0ZXJuIFNGIENPU1NGIFBBUkFNUyAoKFNGKSk7CitleHRlcm4gU0YgU0lOU0YgUEFSQU1TICgoU0YpKTsKKyNlbHNlIC8qICEgU0ZfRk5fU1VQUE9SVCAqLworI2RlZmluZSBBRERTRih4LCB5KSAoKHgpICsgKHkpKQorI2RlZmluZSBTVUJTRih4LCB5KSAoKHgpIC0gKHkpKQorI2RlZmluZSBORUdTRih4KSAoLSAoeCkpCisjZGVmaW5lIE1VTFNGKHgsIHkpICgoeCkgKiAoeSkpCisjZGVmaW5lIERJVlNGKHgsIHkpICgoeCkgLyAoeSkpCisjZGVmaW5lIEVRU0YoeCwgeSkgKChTRikgKHgpID09IChTRikgKHkpKQorI2RlZmluZSBORVNGKHgsIHkpICgoU0YpICh4KSAhPSAoU0YpICh5KSkKKyNkZWZpbmUgTFRTRih4LCB5KSAoKFNGKSAoeCkgPCAoU0YpICh5KSkKKyNkZWZpbmUgTEVTRih4LCB5KSAoKFNGKSAoeCkgPD0gKFNGKSAoeSkpCisjZGVmaW5lIEdUU0YoeCwgeSkgKChTRikgKHgpID4gKFNGKSAoeSkpCisjZGVmaW5lIEdFU0YoeCwgeSkgKChTRikgKHgpID49IChTRikgKHkpKQorZXh0ZXJuIFNGIEFCU1NGIFBBUkFNUyAoKFNGKSk7CitleHRlcm4gU0YgU1FSVFNGIFBBUkFNUyAoKFNGKSk7CitleHRlcm4gU0YgQ09TU0YgUEFSQU1TICgoU0YpKTsKK2V4dGVybiBTRiBTSU5TRiBQQVJBTVMgKChTRikpOworI2VuZGlmIC8qIFNGX0ZOX1NVUFBPUlQgKi8KKworI2lmZGVmIERGX0ZOX1NVUFBPUlQKK2V4dGVybiBERiBBRERERiBQQVJBTVMgKChERiwgREYpKTsKK2V4dGVybiBERiBTVUJERiBQQVJBTVMgKChERiwgREYpKTsKK2V4dGVybiBERiBORUdERiBQQVJBTVMgKChERikpOworZXh0ZXJuIERGIE1VTERGIFBBUkFNUyAoKERGLCBERikpOworZXh0ZXJuIERGIERJVkRGIFBBUkFNUyAoKERGLCBERikpOworZXh0ZXJuIGludCBFUURGIFBBUkFNUyAoKERGLCBERikpOworZXh0ZXJuIGludCBORURGIFBBUkFNUyAoKERGLCBERikpOworZXh0ZXJuIGludCBMVERGIFBBUkFNUyAoKERGLCBERikpOworZXh0ZXJuIGludCBMRURGIFBBUkFNUyAoKERGLCBERikpOworZXh0ZXJuIGludCBHVERGIFBBUkFNUyAoKERGLCBERikpOworZXh0ZXJuIGludCBHRURGIFBBUkFNUyAoKERGLCBERikpOworZXh0ZXJuIERGIEFCU0RGIFBBUkFNUyAoKERGKSk7CitleHRlcm4gREYgU1FSVERGIFBBUkFNUyAoKERGKSk7CitleHRlcm4gREYgQ09TREYgUEFSQU1TICgoREYpKTsKK2V4dGVybiBERiBTSU5ERiBQQVJBTVMgKChERikpOworI2Vsc2UgLyogISBERl9GTl9TVVBQT1JUICovCisjZGVmaW5lIEFERERGKHgsIHkpICgoeCkgKyAoeSkpCisjZGVmaW5lIFNVQkRGKHgsIHkpICgoeCkgLSAoeSkpCisjZGVmaW5lIE5FR0RGKHgpICgtICh4KSkKKyNkZWZpbmUgTVVMREYoeCwgeSkgKCh4KSAqICh5KSkKKyNkZWZpbmUgRElWREYoeCwgeSkgKCh4KSAvICh5KSkKKyNkZWZpbmUgRVFERih4LCB5KSAoKERGKSAoeCkgPT0gKERGKSAoeSkpCisjZGVmaW5lIE5FREYoeCwgeSkgKChERikgKHgpICE9IChERikgKHkpKQorI2RlZmluZSBMVERGKHgsIHkpICgoREYpICh4KSA8IChERikgKHkpKQorI2RlZmluZSBMRURGKHgsIHkpICgoREYpICh4KSA8PSAoREYpICh5KSkKKyNkZWZpbmUgR1RERih4LCB5KSAoKERGKSAoeCkgPiAoREYpICh5KSkKKyNkZWZpbmUgR0VERih4LCB5KSAoKERGKSAoeCkgPj0gKERGKSAoeSkpCitleHRlcm4gREYgQUJTREYgUEFSQU1TICgoREYpKTsKK2V4dGVybiBERiBTUVJUREYgUEFSQU1TICgoREYpKTsKK2V4dGVybiBERiBDT1NERiBQQVJBTVMgKChERikpOworZXh0ZXJuIERGIFNJTkRGIFBBUkFNUyAoKERGKSk7CisjZW5kaWYgLyogREZfRk5fU1VQUE9SVCAqLworCisjaWZkZWYgWEZfRk5fU1VQUE9SVAorZXh0ZXJuIFhGIEFERFhGIFBBUkFNUyAoKFhGLCBYRikpOworZXh0ZXJuIFhGIFNVQlhGIFBBUkFNUyAoKFhGLCBYRikpOworZXh0ZXJuIFhGIE5FR1hGIFBBUkFNUyAoKFhGKSk7CitleHRlcm4gWEYgTVVMWEYgUEFSQU1TICgoWEYsIFhGKSk7CitleHRlcm4gWEYgRElWWEYgUEFSQU1TICgoWEYsIFhGKSk7CitleHRlcm4gaW50IEVRWEYgUEFSQU1TICgoWEYsIFhGKSk7CitleHRlcm4gaW50IE5FWEYgUEFSQU1TICgoWEYsIFhGKSk7CitleHRlcm4gaW50IExUWEYgUEFSQU1TICgoWEYsIFhGKSk7CitleHRlcm4gaW50IExFWEYgUEFSQU1TICgoWEYsIFhGKSk7CitleHRlcm4gaW50IEdUWEYgUEFSQU1TICgoWEYsIFhGKSk7CitleHRlcm4gaW50IEdFWEYgUEFSQU1TICgoWEYsIFhGKSk7CitleHRlcm4gWEYgQUJTWEYgUEFSQU1TICgoWEYpKTsKK2V4dGVybiBYRiBTUVJUWEYgUEFSQU1TICgoWEYpKTsKK2V4dGVybiBYRiBDT1NYRiBQQVJBTVMgKChYRikpOworZXh0ZXJuIFhGIFNJTlhGIFBBUkFNUyAoKFhGKSk7CisjZWxzZSAvKiAhIFhGX0ZOX1NVUFBPUlQgKi8KKyNkZWZpbmUgQUREWEYoeCwgeSkgKCh4KSArICh5KSkKKyNkZWZpbmUgU1VCWEYoeCwgeSkgKCh4KSAtICh5KSkKKyNkZWZpbmUgTkVHWEYoeCkgKC0gKHgpKQorI2RlZmluZSBNVUxYRih4LCB5KSAoKHgpICogKHkpKQorI2RlZmluZSBESVZYRih4LCB5KSAoKHgpIC8gKHkpKQorI2RlZmluZSBFUVhGKHgsIHkpICgoWEYpICh4KSA9PSAoWEYpICh5KSkKKyNkZWZpbmUgTkVYRih4LCB5KSAoKFhGKSAoeCkgIT0gKFhGKSAoeSkpCisjZGVmaW5lIExUWEYoeCwgeSkgKChYRikgKHgpIDwgKFhGKSAoeSkpCisjZGVmaW5lIExFWEYoeCwgeSkgKChYRikgKHgpIDw9IChYRikgKHkpKQorI2RlZmluZSBHVFhGKHgsIHkpICgoWEYpICh4KSA+IChYRikgKHkpKQorI2RlZmluZSBHRVhGKHgsIHkpICgoWEYpICh4KSA+PSAoWEYpICh5KSkKK2V4dGVybiBYRiBBQlNYRiBQQVJBTVMgKChYRikpOworZXh0ZXJuIFhGIFNRUlRYRiBQQVJBTVMgKChYRikpOworZXh0ZXJuIFhGIENPU1hGIFBBUkFNUyAoKFhGKSk7CitleHRlcm4gWEYgU0lOWEYgUEFSQU1TICgoWEYpKTsKKyNlbmRpZiAvKiBYRl9GTl9TVVBQT1JUICovCisKKyNpZmRlZiBURl9GTl9TVVBQT1JUCitleHRlcm4gVEYgQUREVEYgUEFSQU1TICgoVEYsIFRGKSk7CitleHRlcm4gVEYgU1VCVEYgUEFSQU1TICgoVEYsIFRGKSk7CitleHRlcm4gVEYgTkVHVEYgUEFSQU1TICgoVEYpKTsKK2V4dGVybiBURiBNVUxURiBQQVJBTVMgKChURiwgVEYpKTsKK2V4dGVybiBURiBESVZURiBQQVJBTVMgKChURiwgVEYpKTsKK2V4dGVybiBpbnQgRVFURiBQQVJBTVMgKChURiwgVEYpKTsKK2V4dGVybiBpbnQgTkVURiBQQVJBTVMgKChURiwgVEYpKTsKK2V4dGVybiBpbnQgTFRURiBQQVJBTVMgKChURiwgVEYpKTsKK2V4dGVybiBpbnQgTEVURiBQQVJBTVMgKChURiwgVEYpKTsKK2V4dGVybiBpbnQgR1RURiBQQVJBTVMgKChURiwgVEYpKTsKK2V4dGVybiBpbnQgR0VURiBQQVJBTVMgKChURiwgVEYpKTsKK2V4dGVybiBURiBBQlNURiBQQVJBTVMgKChURikpOworZXh0ZXJuIFRGIFNRUlRURiBQQVJBTVMgKChURikpOworZXh0ZXJuIFRGIENPU1RGIFBBUkFNUyAoKFRGKSk7CitleHRlcm4gVEYgU0lOVEYgUEFSQU1TICgoVEYpKTsKKyNlbHNlIC8qICEgVEZfRk5fU1VQUE9SVCAqLworI2RlZmluZSBBRERURih4LCB5KSAoKHgpICsgKHkpKQorI2RlZmluZSBTVUJURih4LCB5KSAoKHgpIC0gKHkpKQorI2RlZmluZSBORUdURih4KSAoLSAoeCkpCisjZGVmaW5lIE1VTFRGKHgsIHkpICgoeCkgKiAoeSkpCisjZGVmaW5lIERJVlRGKHgsIHkpICgoeCkgLyAoeSkpCisjZGVmaW5lIEVRVEYoeCwgeSkgKChURikgKHgpID09IChURikgKHkpKQorI2RlZmluZSBORVRGKHgsIHkpICgoVEYpICh4KSAhPSAoVEYpICh5KSkKKyNkZWZpbmUgTFRURih4LCB5KSAoKFRGKSAoeCkgPCAoVEYpICh5KSkKKyNkZWZpbmUgTEVURih4LCB5KSAoKFRGKSAoeCkgPD0gKFRGKSAoeSkpCisjZGVmaW5lIEdUVEYoeCwgeSkgKChURikgKHgpID4gKFRGKSAoeSkpCisjZGVmaW5lIEdFVEYoeCwgeSkgKChURikgKHgpID49IChURikgKHkpKQorZXh0ZXJuIFRGIEFCU1RGIFBBUkFNUyAoKFRGKSk7CitleHRlcm4gVEYgU1FSVFRGIFBBUkFNUyAoKFRGKSk7CitleHRlcm4gVEYgQ09TVEYgUEFSQU1TICgoVEYpKTsKK2V4dGVybiBURiBTSU5URiBQQVJBTVMgKChURikpOworI2VuZGlmIC8qIFRGX0ZOX1NVUFBPUlQgKi8KKworCisjZGVmaW5lIEVYVEJJUUkoeCkgKChRSSkgKEJJKSAoeCkpCisjZGVmaW5lIEVYVEJJSEkoeCkgKChISSkgKEJJKSAoeCkpCisjZGVmaW5lIEVYVEJJU0koeCkgKChTSSkgKEJJKSAoeCkpCisjaWYgZGVmaW5lZCAoRElfRk5fU1VQUE9SVCkKK2V4dGVybiBESSBFWFRCSURJIFBBUkFNUyAoKEJJKSk7CisjZWxzZQorI2RlZmluZSBFWFRCSURJKHgpICgoREkpIChCSSkgKHgpKQorI2VuZGlmCisjZGVmaW5lIEVYVFFJSEkoeCkgKChISSkgKFFJKSAoeCkpCisjZGVmaW5lIEVYVFFJU0koeCkgKChTSSkgKFFJKSAoeCkpCisjaWYgZGVmaW5lZCAoRElfRk5fU1VQUE9SVCkKK2V4dGVybiBESSBFWFRRSURJIFBBUkFNUyAoKFFJKSk7CisjZWxzZQorI2RlZmluZSBFWFRRSURJKHgpICgoREkpIChRSSkgKHgpKQorI2VuZGlmCisjZGVmaW5lIEVYVEhJU0koeCkgKChTSSkgKEhJKSAoeCkpCisjaWYgZGVmaW5lZCAoRElfRk5fU1VQUE9SVCkKK2V4dGVybiBESSBFWFRISURJIFBBUkFNUyAoKEhJKSk7CisjZWxzZQorI2RlZmluZSBFWFRISURJKHgpICgoREkpIChISSkgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoRElfRk5fU1VQUE9SVCkKK2V4dGVybiBESSBFWFRTSURJIFBBUkFNUyAoKFNJKSk7CisjZWxzZQorI2RlZmluZSBFWFRTSURJKHgpICgoREkpIChTSSkgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0ZfRk5fU1VQUE9SVCkgfHwgZGVmaW5lZCAoREZfRk5fU1VQUE9SVCkKK2V4dGVybiBERiBFWFRTRkRGIFBBUkFNUyAoKFNGKSk7CisjZWxzZQorI2RlZmluZSBFWFRTRkRGKHgpICgoREYpIChTRikgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0ZfRk5fU1VQUE9SVCkgfHwgZGVmaW5lZCAoWEZfRk5fU1VQUE9SVCkKK2V4dGVybiBYRiBFWFRTRlhGIFBBUkFNUyAoKFNGKSk7CisjZWxzZQorI2RlZmluZSBFWFRTRlhGKHgpICgoWEYpIChTRikgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0ZfRk5fU1VQUE9SVCkgfHwgZGVmaW5lZCAoVEZfRk5fU1VQUE9SVCkKK2V4dGVybiBURiBFWFRTRlRGIFBBUkFNUyAoKFNGKSk7CisjZWxzZQorI2RlZmluZSBFWFRTRlRGKHgpICgoVEYpIChTRikgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoREZfRk5fU1VQUE9SVCkgfHwgZGVmaW5lZCAoWEZfRk5fU1VQUE9SVCkKK2V4dGVybiBYRiBFWFRERlhGIFBBUkFNUyAoKERGKSk7CisjZWxzZQorI2RlZmluZSBFWFRERlhGKHgpICgoWEYpIChERikgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoREZfRk5fU1VQUE9SVCkgfHwgZGVmaW5lZCAoVEZfRk5fU1VQUE9SVCkKK2V4dGVybiBURiBFWFRERlRGIFBBUkFNUyAoKERGKSk7CisjZWxzZQorI2RlZmluZSBFWFRERlRGKHgpICgoVEYpIChERikgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoWEZfRk5fU1VQUE9SVCkgfHwgZGVmaW5lZCAoVEZfRk5fU1VQUE9SVCkKK2V4dGVybiBURiBFWFRYRlRGIFBBUkFNUyAoKFhGKSk7CisjZWxzZQorI2RlZmluZSBFWFRYRlRGKHgpICgoVEYpIChYRikgKHgpKQorI2VuZGlmCisjZGVmaW5lIFpFWFRCSVFJKHgpICgoUUkpIChCSSkgKHgpKQorI2RlZmluZSBaRVhUQklISSh4KSAoKEhJKSAoQkkpICh4KSkKKyNkZWZpbmUgWkVYVEJJU0koeCkgKChTSSkgKEJJKSAoeCkpCisjaWYgZGVmaW5lZCAoRElfRk5fU1VQUE9SVCkKK2V4dGVybiBESSBaRVhUQklESSBQQVJBTVMgKChCSSkpOworI2Vsc2UKKyNkZWZpbmUgWkVYVEJJREkoeCkgKChESSkgKEJJKSAoeCkpCisjZW5kaWYKKyNkZWZpbmUgWkVYVFFJSEkoeCkgKChISSkgKFVRSSkgKHgpKQorI2RlZmluZSBaRVhUUUlTSSh4KSAoKFNJKSAoVVFJKSAoeCkpCisjaWYgZGVmaW5lZCAoRElfRk5fU1VQUE9SVCkKK2V4dGVybiBESSBaRVhUUUlESSBQQVJBTVMgKChRSSkpOworI2Vsc2UKKyNkZWZpbmUgWkVYVFFJREkoeCkgKChESSkgKFVRSSkgKHgpKQorI2VuZGlmCisjZGVmaW5lIFpFWFRISVNJKHgpICgoU0kpIChVSEkpICh4KSkKKyNpZiBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQorZXh0ZXJuIERJIFpFWFRISURJIFBBUkFNUyAoKEhJKSk7CisjZWxzZQorI2RlZmluZSBaRVhUSElESSh4KSAoKERJKSAoVUhJKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQorZXh0ZXJuIERJIFpFWFRTSURJIFBBUkFNUyAoKFNJKSk7CisjZWxzZQorI2RlZmluZSBaRVhUU0lESSh4KSAoKERJKSAoVVNJKSAoeCkpCisjZW5kaWYKKyNkZWZpbmUgVFJVTkNRSUJJKHgpICgoQkkpIChRSSkgKHgpKQorI2RlZmluZSBUUlVOQ0hJQkkoeCkgKChCSSkgKEhJKSAoeCkpCisjZGVmaW5lIFRSVU5DSElRSSh4KSAoKFFJKSAoSEkpICh4KSkKKyNkZWZpbmUgVFJVTkNTSUJJKHgpICgoQkkpIChTSSkgKHgpKQorI2RlZmluZSBUUlVOQ1NJUUkoeCkgKChRSSkgKFNJKSAoeCkpCisjZGVmaW5lIFRSVU5DU0lISSh4KSAoKEhJKSAoU0kpICh4KSkKKyNpZiBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQorZXh0ZXJuIEJJIFRSVU5DRElCSSBQQVJBTVMgKChESSkpOworI2Vsc2UKKyNkZWZpbmUgVFJVTkNESUJJKHgpICgoQkkpIChESSkgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoRElfRk5fU1VQUE9SVCkKK2V4dGVybiBRSSBUUlVOQ0RJUUkgUEFSQU1TICgoREkpKTsKKyNlbHNlCisjZGVmaW5lIFRSVU5DRElRSSh4KSAoKFFJKSAoREkpICh4KSkKKyNlbmRpZgorI2lmIGRlZmluZWQgKERJX0ZOX1NVUFBPUlQpCitleHRlcm4gSEkgVFJVTkNESUhJIFBBUkFNUyAoKERJKSk7CisjZWxzZQorI2RlZmluZSBUUlVOQ0RJSEkoeCkgKChISSkgKERJKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQorZXh0ZXJuIFNJIFRSVU5DRElTSSBQQVJBTVMgKChESSkpOworI2Vsc2UKKyNkZWZpbmUgVFJVTkNESVNJKHgpICgoU0kpIChESSkgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoREZfRk5fU1VQUE9SVCkgfHwgZGVmaW5lZCAoU0ZfRk5fU1VQUE9SVCkKK2V4dGVybiBTRiBUUlVOQ0RGU0YgUEFSQU1TICgoREYpKTsKKyNlbHNlCisjZGVmaW5lIFRSVU5DREZTRih4KSAoKFNGKSAoREYpICh4KSkKKyNlbmRpZgorI2lmIGRlZmluZWQgKFhGX0ZOX1NVUFBPUlQpIHx8IGRlZmluZWQgKFNGX0ZOX1NVUFBPUlQpCitleHRlcm4gU0YgVFJVTkNYRlNGIFBBUkFNUyAoKFhGKSk7CisjZWxzZQorI2RlZmluZSBUUlVOQ1hGU0YoeCkgKChTRikgKFhGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChYRl9GTl9TVVBQT1JUKSB8fCBkZWZpbmVkIChERl9GTl9TVVBQT1JUKQorZXh0ZXJuIERGIFRSVU5DWEZERiBQQVJBTVMgKChYRikpOworI2Vsc2UKKyNkZWZpbmUgVFJVTkNYRkRGKHgpICgoREYpIChYRikgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoVEZfRk5fU1VQUE9SVCkgfHwgZGVmaW5lZCAoU0ZfRk5fU1VQUE9SVCkKK2V4dGVybiBTRiBUUlVOQ1RGU0YgUEFSQU1TICgoVEYpKTsKKyNlbHNlCisjZGVmaW5lIFRSVU5DVEZTRih4KSAoKFNGKSAoVEYpICh4KSkKKyNlbmRpZgorI2lmIGRlZmluZWQgKFRGX0ZOX1NVUFBPUlQpIHx8IGRlZmluZWQgKERGX0ZOX1NVUFBPUlQpCitleHRlcm4gREYgVFJVTkNURkRGIFBBUkFNUyAoKFRGKSk7CisjZWxzZQorI2RlZmluZSBUUlVOQ1RGREYoeCkgKChERikgKFRGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChURl9GTl9TVVBQT1JUKSB8fCBkZWZpbmVkIChYRl9GTl9TVVBQT1JUKQorZXh0ZXJuIFhGIFRSVU5DVEZYRiBQQVJBTVMgKChURikpOworI2Vsc2UKKyNkZWZpbmUgVFJVTkNURlhGKHgpICgoWEYpIChURikgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0ZfRk5fU1VQUE9SVCkKK2V4dGVybiBTRiBGTE9BVFFJU0YgUEFSQU1TICgoUUkpKTsKKyNlbHNlCisjZGVmaW5lIEZMT0FUUUlTRih4KSAoKFNGKSAoUUkpICh4KSkKKyNlbmRpZgorI2lmIGRlZmluZWQgKERGX0ZOX1NVUFBPUlQpCitleHRlcm4gREYgRkxPQVRRSURGIFBBUkFNUyAoKFFJKSk7CisjZWxzZQorI2RlZmluZSBGTE9BVFFJREYoeCkgKChERikgKFFJKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChYRl9GTl9TVVBQT1JUKQorZXh0ZXJuIFhGIEZMT0FUUUlYRiBQQVJBTVMgKChRSSkpOworI2Vsc2UKKyNkZWZpbmUgRkxPQVRRSVhGKHgpICgoWEYpIChRSSkgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoVEZfRk5fU1VQUE9SVCkKK2V4dGVybiBURiBGTE9BVFFJVEYgUEFSQU1TICgoUUkpKTsKKyNlbHNlCisjZGVmaW5lIEZMT0FUUUlURih4KSAoKFRGKSAoUUkpICh4KSkKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNGX0ZOX1NVUFBPUlQpCitleHRlcm4gU0YgRkxPQVRISVNGIFBBUkFNUyAoKEhJKSk7CisjZWxzZQorI2RlZmluZSBGTE9BVEhJU0YoeCkgKChTRikgKEhJKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChERl9GTl9TVVBQT1JUKQorZXh0ZXJuIERGIEZMT0FUSElERiBQQVJBTVMgKChISSkpOworI2Vsc2UKKyNkZWZpbmUgRkxPQVRISURGKHgpICgoREYpIChISSkgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoWEZfRk5fU1VQUE9SVCkKK2V4dGVybiBYRiBGTE9BVEhJWEYgUEFSQU1TICgoSEkpKTsKKyNlbHNlCisjZGVmaW5lIEZMT0FUSElYRih4KSAoKFhGKSAoSEkpICh4KSkKKyNlbmRpZgorI2lmIGRlZmluZWQgKFRGX0ZOX1NVUFBPUlQpCitleHRlcm4gVEYgRkxPQVRISVRGIFBBUkFNUyAoKEhJKSk7CisjZWxzZQorI2RlZmluZSBGTE9BVEhJVEYoeCkgKChURikgKEhJKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTRl9GTl9TVVBQT1JUKQorZXh0ZXJuIFNGIEZMT0FUU0lTRiBQQVJBTVMgKChTSSkpOworI2Vsc2UKKyNkZWZpbmUgRkxPQVRTSVNGKHgpICgoU0YpIChTSSkgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoREZfRk5fU1VQUE9SVCkKK2V4dGVybiBERiBGTE9BVFNJREYgUEFSQU1TICgoU0kpKTsKKyNlbHNlCisjZGVmaW5lIEZMT0FUU0lERih4KSAoKERGKSAoU0kpICh4KSkKKyNlbmRpZgorI2lmIGRlZmluZWQgKFhGX0ZOX1NVUFBPUlQpCitleHRlcm4gWEYgRkxPQVRTSVhGIFBBUkFNUyAoKFNJKSk7CisjZWxzZQorI2RlZmluZSBGTE9BVFNJWEYoeCkgKChYRikgKFNJKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChURl9GTl9TVVBQT1JUKQorZXh0ZXJuIFRGIEZMT0FUU0lURiBQQVJBTVMgKChTSSkpOworI2Vsc2UKKyNkZWZpbmUgRkxPQVRTSVRGKHgpICgoVEYpIChTSSkgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoRElfRk5fU1VQUE9SVCkgfHwgZGVmaW5lZCAoU0ZfRk5fU1VQUE9SVCkKK2V4dGVybiBTRiBGTE9BVERJU0YgUEFSQU1TICgoREkpKTsKKyNlbHNlCisjZGVmaW5lIEZMT0FURElTRih4KSAoKFNGKSAoREkpICh4KSkKKyNlbmRpZgorI2lmIGRlZmluZWQgKERJX0ZOX1NVUFBPUlQpIHx8IGRlZmluZWQgKERGX0ZOX1NVUFBPUlQpCitleHRlcm4gREYgRkxPQVRESURGIFBBUkFNUyAoKERJKSk7CisjZWxzZQorI2RlZmluZSBGTE9BVERJREYoeCkgKChERikgKERJKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChESV9GTl9TVVBQT1JUKSB8fCBkZWZpbmVkIChYRl9GTl9TVVBQT1JUKQorZXh0ZXJuIFhGIEZMT0FURElYRiBQQVJBTVMgKChESSkpOworI2Vsc2UKKyNkZWZpbmUgRkxPQVRESVhGKHgpICgoWEYpIChESSkgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoRElfRk5fU1VQUE9SVCkgfHwgZGVmaW5lZCAoVEZfRk5fU1VQUE9SVCkKK2V4dGVybiBURiBGTE9BVERJVEYgUEFSQU1TICgoREkpKTsKKyNlbHNlCisjZGVmaW5lIEZMT0FURElURih4KSAoKFRGKSAoREkpICh4KSkKKyNlbmRpZgorI2lmIGRlZmluZWQgKFNGX0ZOX1NVUFBPUlQpCitleHRlcm4gU0YgVUZMT0FUUUlTRiBQQVJBTVMgKChRSSkpOworI2Vsc2UKKyNkZWZpbmUgVUZMT0FUUUlTRih4KSAoKFNGKSAoVVFJKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChERl9GTl9TVVBQT1JUKQorZXh0ZXJuIERGIFVGTE9BVFFJREYgUEFSQU1TICgoUUkpKTsKKyNlbHNlCisjZGVmaW5lIFVGTE9BVFFJREYoeCkgKChERikgKFVRSSkgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoWEZfRk5fU1VQUE9SVCkKK2V4dGVybiBYRiBVRkxPQVRRSVhGIFBBUkFNUyAoKFFJKSk7CisjZWxzZQorI2RlZmluZSBVRkxPQVRRSVhGKHgpICgoWEYpIChVUUkpICh4KSkKKyNlbmRpZgorI2lmIGRlZmluZWQgKFRGX0ZOX1NVUFBPUlQpCitleHRlcm4gVEYgVUZMT0FUUUlURiBQQVJBTVMgKChRSSkpOworI2Vsc2UKKyNkZWZpbmUgVUZMT0FUUUlURih4KSAoKFRGKSAoVVFJKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTRl9GTl9TVVBQT1JUKQorZXh0ZXJuIFNGIFVGTE9BVEhJU0YgUEFSQU1TICgoSEkpKTsKKyNlbHNlCisjZGVmaW5lIFVGTE9BVEhJU0YoeCkgKChTRikgKFVISSkgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoREZfRk5fU1VQUE9SVCkKK2V4dGVybiBERiBVRkxPQVRISURGIFBBUkFNUyAoKEhJKSk7CisjZWxzZQorI2RlZmluZSBVRkxPQVRISURGKHgpICgoREYpIChVSEkpICh4KSkKKyNlbmRpZgorI2lmIGRlZmluZWQgKFhGX0ZOX1NVUFBPUlQpCitleHRlcm4gWEYgVUZMT0FUSElYRiBQQVJBTVMgKChISSkpOworI2Vsc2UKKyNkZWZpbmUgVUZMT0FUSElYRih4KSAoKFhGKSAoVUhJKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChURl9GTl9TVVBQT1JUKQorZXh0ZXJuIFRGIFVGTE9BVEhJVEYgUEFSQU1TICgoSEkpKTsKKyNlbHNlCisjZGVmaW5lIFVGTE9BVEhJVEYoeCkgKChURikgKFVISSkgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoU0ZfRk5fU1VQUE9SVCkKK2V4dGVybiBTRiBVRkxPQVRTSVNGIFBBUkFNUyAoKFNJKSk7CisjZWxzZQorI2RlZmluZSBVRkxPQVRTSVNGKHgpICgoU0YpIChVU0kpICh4KSkKKyNlbmRpZgorI2lmIGRlZmluZWQgKERGX0ZOX1NVUFBPUlQpCitleHRlcm4gREYgVUZMT0FUU0lERiBQQVJBTVMgKChTSSkpOworI2Vsc2UKKyNkZWZpbmUgVUZMT0FUU0lERih4KSAoKERGKSAoVVNJKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChYRl9GTl9TVVBQT1JUKQorZXh0ZXJuIFhGIFVGTE9BVFNJWEYgUEFSQU1TICgoU0kpKTsKKyNlbHNlCisjZGVmaW5lIFVGTE9BVFNJWEYoeCkgKChYRikgKFVTSSkgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoVEZfRk5fU1VQUE9SVCkKK2V4dGVybiBURiBVRkxPQVRTSVRGIFBBUkFNUyAoKFNJKSk7CisjZWxzZQorI2RlZmluZSBVRkxPQVRTSVRGKHgpICgoVEYpIChVU0kpICh4KSkKKyNlbmRpZgorI2lmIGRlZmluZWQgKERJX0ZOX1NVUFBPUlQpIHx8IGRlZmluZWQgKFNGX0ZOX1NVUFBPUlQpCitleHRlcm4gU0YgVUZMT0FURElTRiBQQVJBTVMgKChESSkpOworI2Vsc2UKKyNkZWZpbmUgVUZMT0FURElTRih4KSAoKFNGKSAoVURJKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChESV9GTl9TVVBQT1JUKSB8fCBkZWZpbmVkIChERl9GTl9TVVBQT1JUKQorZXh0ZXJuIERGIFVGTE9BVERJREYgUEFSQU1TICgoREkpKTsKKyNlbHNlCisjZGVmaW5lIFVGTE9BVERJREYoeCkgKChERikgKFVESSkgKHgpKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoRElfRk5fU1VQUE9SVCkgfHwgZGVmaW5lZCAoWEZfRk5fU1VQUE9SVCkKK2V4dGVybiBYRiBVRkxPQVRESVhGIFBBUkFNUyAoKERJKSk7CisjZWxzZQorI2RlZmluZSBVRkxPQVRESVhGKHgpICgoWEYpIChVREkpICh4KSkKKyNlbmRpZgorI2lmIGRlZmluZWQgKERJX0ZOX1NVUFBPUlQpIHx8IGRlZmluZWQgKFRGX0ZOX1NVUFBPUlQpCitleHRlcm4gVEYgVUZMT0FURElURiBQQVJBTVMgKChESSkpOworI2Vsc2UKKyNkZWZpbmUgVUZMT0FURElURih4KSAoKFRGKSAoVURJKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTRl9GTl9TVVBQT1JUKQorZXh0ZXJuIEJJIEZJWFNGQkkgUEFSQU1TICgoU0YpKTsKKyNlbHNlCisjZGVmaW5lIEZJWFNGQkkoeCkgKChCSSkgKFNGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTRl9GTl9TVVBQT1JUKQorZXh0ZXJuIFFJIEZJWFNGUUkgUEFSQU1TICgoU0YpKTsKKyNlbHNlCisjZGVmaW5lIEZJWFNGUUkoeCkgKChRSSkgKFNGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTRl9GTl9TVVBQT1JUKQorZXh0ZXJuIEhJIEZJWFNGSEkgUEFSQU1TICgoU0YpKTsKKyNlbHNlCisjZGVmaW5lIEZJWFNGSEkoeCkgKChISSkgKFNGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTRl9GTl9TVVBQT1JUKQorZXh0ZXJuIFNJIEZJWFNGU0kgUEFSQU1TICgoU0YpKTsKKyNlbHNlCisjZGVmaW5lIEZJWFNGU0koeCkgKChTSSkgKFNGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTRl9GTl9TVVBQT1JUKSB8fCBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQorZXh0ZXJuIERJIEZJWFNGREkgUEFSQU1TICgoU0YpKTsKKyNlbHNlCisjZGVmaW5lIEZJWFNGREkoeCkgKChESSkgKFNGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChERl9GTl9TVVBQT1JUKQorZXh0ZXJuIEJJIEZJWERGQkkgUEFSQU1TICgoREYpKTsKKyNlbHNlCisjZGVmaW5lIEZJWERGQkkoeCkgKChCSSkgKERGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChERl9GTl9TVVBQT1JUKQorZXh0ZXJuIFFJIEZJWERGUUkgUEFSQU1TICgoREYpKTsKKyNlbHNlCisjZGVmaW5lIEZJWERGUUkoeCkgKChRSSkgKERGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChERl9GTl9TVVBQT1JUKQorZXh0ZXJuIEhJIEZJWERGSEkgUEFSQU1TICgoREYpKTsKKyNlbHNlCisjZGVmaW5lIEZJWERGSEkoeCkgKChISSkgKERGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChERl9GTl9TVVBQT1JUKQorZXh0ZXJuIFNJIEZJWERGU0kgUEFSQU1TICgoREYpKTsKKyNlbHNlCisjZGVmaW5lIEZJWERGU0koeCkgKChTSSkgKERGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChERl9GTl9TVVBQT1JUKSB8fCBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQorZXh0ZXJuIERJIEZJWERGREkgUEFSQU1TICgoREYpKTsKKyNlbHNlCisjZGVmaW5lIEZJWERGREkoeCkgKChESSkgKERGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChYRl9GTl9TVVBQT1JUKQorZXh0ZXJuIEJJIEZJWFhGQkkgUEFSQU1TICgoWEYpKTsKKyNlbHNlCisjZGVmaW5lIEZJWFhGQkkoeCkgKChCSSkgKFhGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChYRl9GTl9TVVBQT1JUKQorZXh0ZXJuIFFJIEZJWFhGUUkgUEFSQU1TICgoWEYpKTsKKyNlbHNlCisjZGVmaW5lIEZJWFhGUUkoeCkgKChRSSkgKFhGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChYRl9GTl9TVVBQT1JUKQorZXh0ZXJuIEhJIEZJWFhGSEkgUEFSQU1TICgoWEYpKTsKKyNlbHNlCisjZGVmaW5lIEZJWFhGSEkoeCkgKChISSkgKFhGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChYRl9GTl9TVVBQT1JUKQorZXh0ZXJuIFNJIEZJWFhGU0kgUEFSQU1TICgoWEYpKTsKKyNlbHNlCisjZGVmaW5lIEZJWFhGU0koeCkgKChTSSkgKFhGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChYRl9GTl9TVVBQT1JUKSB8fCBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQorZXh0ZXJuIERJIEZJWFhGREkgUEFSQU1TICgoWEYpKTsKKyNlbHNlCisjZGVmaW5lIEZJWFhGREkoeCkgKChESSkgKFhGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChURl9GTl9TVVBQT1JUKQorZXh0ZXJuIEJJIEZJWFRGQkkgUEFSQU1TICgoVEYpKTsKKyNlbHNlCisjZGVmaW5lIEZJWFRGQkkoeCkgKChCSSkgKFRGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChURl9GTl9TVVBQT1JUKQorZXh0ZXJuIFFJIEZJWFRGUUkgUEFSQU1TICgoVEYpKTsKKyNlbHNlCisjZGVmaW5lIEZJWFRGUUkoeCkgKChRSSkgKFRGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChURl9GTl9TVVBQT1JUKQorZXh0ZXJuIEhJIEZJWFRGSEkgUEFSQU1TICgoVEYpKTsKKyNlbHNlCisjZGVmaW5lIEZJWFRGSEkoeCkgKChISSkgKFRGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChURl9GTl9TVVBQT1JUKQorZXh0ZXJuIFNJIEZJWFRGU0kgUEFSQU1TICgoVEYpKTsKKyNlbHNlCisjZGVmaW5lIEZJWFRGU0koeCkgKChTSSkgKFRGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChURl9GTl9TVVBQT1JUKSB8fCBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQorZXh0ZXJuIERJIEZJWFRGREkgUEFSQU1TICgoVEYpKTsKKyNlbHNlCisjZGVmaW5lIEZJWFRGREkoeCkgKChESSkgKFRGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTRl9GTl9TVVBQT1JUKQorZXh0ZXJuIFFJIFVGSVhTRlFJIFBBUkFNUyAoKFNGKSk7CisjZWxzZQorI2RlZmluZSBVRklYU0ZRSSh4KSAoKFVRSSkgKFNGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTRl9GTl9TVVBQT1JUKQorZXh0ZXJuIEhJIFVGSVhTRkhJIFBBUkFNUyAoKFNGKSk7CisjZWxzZQorI2RlZmluZSBVRklYU0ZISSh4KSAoKFVISSkgKFNGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTRl9GTl9TVVBQT1JUKQorZXh0ZXJuIFNJIFVGSVhTRlNJIFBBUkFNUyAoKFNGKSk7CisjZWxzZQorI2RlZmluZSBVRklYU0ZTSSh4KSAoKFVTSSkgKFNGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChTRl9GTl9TVVBQT1JUKSB8fCBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQorZXh0ZXJuIERJIFVGSVhTRkRJIFBBUkFNUyAoKFNGKSk7CisjZWxzZQorI2RlZmluZSBVRklYU0ZESSh4KSAoKFVESSkgKFNGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChERl9GTl9TVVBQT1JUKQorZXh0ZXJuIFFJIFVGSVhERlFJIFBBUkFNUyAoKERGKSk7CisjZWxzZQorI2RlZmluZSBVRklYREZRSSh4KSAoKFVRSSkgKERGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChERl9GTl9TVVBQT1JUKQorZXh0ZXJuIEhJIFVGSVhERkhJIFBBUkFNUyAoKERGKSk7CisjZWxzZQorI2RlZmluZSBVRklYREZISSh4KSAoKFVISSkgKERGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChERl9GTl9TVVBQT1JUKQorZXh0ZXJuIFNJIFVGSVhERlNJIFBBUkFNUyAoKERGKSk7CisjZWxzZQorI2RlZmluZSBVRklYREZTSSh4KSAoKFVTSSkgKERGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChERl9GTl9TVVBQT1JUKSB8fCBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQorZXh0ZXJuIERJIFVGSVhERkRJIFBBUkFNUyAoKERGKSk7CisjZWxzZQorI2RlZmluZSBVRklYREZESSh4KSAoKFVESSkgKERGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChYRl9GTl9TVVBQT1JUKQorZXh0ZXJuIFFJIFVGSVhYRlFJIFBBUkFNUyAoKFhGKSk7CisjZWxzZQorI2RlZmluZSBVRklYWEZRSSh4KSAoKFVRSSkgKFhGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChYRl9GTl9TVVBQT1JUKQorZXh0ZXJuIEhJIFVGSVhYRkhJIFBBUkFNUyAoKFhGKSk7CisjZWxzZQorI2RlZmluZSBVRklYWEZISSh4KSAoKFVISSkgKFhGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChYRl9GTl9TVVBQT1JUKQorZXh0ZXJuIFNJIFVGSVhYRlNJIFBBUkFNUyAoKFhGKSk7CisjZWxzZQorI2RlZmluZSBVRklYWEZTSSh4KSAoKFVTSSkgKFhGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChYRl9GTl9TVVBQT1JUKSB8fCBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQorZXh0ZXJuIERJIFVGSVhYRkRJIFBBUkFNUyAoKFhGKSk7CisjZWxzZQorI2RlZmluZSBVRklYWEZESSh4KSAoKFVESSkgKFhGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChURl9GTl9TVVBQT1JUKQorZXh0ZXJuIFFJIFVGSVhURlFJIFBBUkFNUyAoKFRGKSk7CisjZWxzZQorI2RlZmluZSBVRklYVEZRSSh4KSAoKFVRSSkgKFRGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChURl9GTl9TVVBQT1JUKQorZXh0ZXJuIEhJIFVGSVhURkhJIFBBUkFNUyAoKFRGKSk7CisjZWxzZQorI2RlZmluZSBVRklYVEZISSh4KSAoKFVISSkgKFRGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChURl9GTl9TVVBQT1JUKQorZXh0ZXJuIFNJIFVGSVhURlNJIFBBUkFNUyAoKFRGKSk7CisjZWxzZQorI2RlZmluZSBVRklYVEZTSSh4KSAoKFVTSSkgKFRGKSAoeCkpCisjZW5kaWYKKyNpZiBkZWZpbmVkIChURl9GTl9TVVBQT1JUKSB8fCBkZWZpbmVkIChESV9GTl9TVVBQT1JUKQorZXh0ZXJuIERJIFVGSVhURkRJIFBBUkFNUyAoKFRGKSk7CisjZWxzZQorI2RlZmluZSBVRklYVEZESSh4KSAoKFVESSkgKFRGKSAoeCkpCisjZW5kaWYKKwwKKy8qIFNlbWFudGljIHN1cHBvcnQgdXRpbGl0aWVzLiAgKi8KKworI2lmZGVmIF9fR05VQ19fCisKKyNpZmRlZiBTRU1PUFNfREVGSU5FX0lOTElORQorI2RlZmluZSBTRU1PUFNfSU5MSU5FCisjZWxzZQorI2RlZmluZSBTRU1PUFNfSU5MSU5FIGV4dGVybiBpbmxpbmUKKyNlbmRpZgorCitTRU1PUFNfSU5MSU5FIFNJCitBRERDU0kgKFNJIGEsIFNJIGIsIEJJIGMpCit7CisgIFNJIHJlcyA9IEFERFNJIChhLCBBRERTSSAoYiwgYykpOworICByZXR1cm4gcmVzOworfQorCitTRU1PUFNfSU5MSU5FIEJJCitBRERDRlNJIChTSSBhLCBTSSBiLCBCSSBjKQoreworICBTSSB0bXAgPSBBRERTSSAoYSwgQUREU0kgKGIsIGMpKTsKKyAgQkkgcmVzID0gKChVU0kpIHRtcCA8IChVU0kpIGEpIHx8IChjICYmIHRtcCA9PSBhKTsKKyAgcmV0dXJuIHJlczsKK30KKworU0VNT1BTX0lOTElORSBCSQorQURET0ZTSSAoU0kgYSwgU0kgYiwgQkkgYykKK3sKKyAgU0kgdG1wID0gQUREU0kgKGEsIEFERFNJIChiLCBjKSk7CisgIEJJIHJlcyA9ICgoKGEgPCAwKSA9PSAoYiA8IDApKQorCSAgICAmJiAoKGEgPCAwKSAhPSAodG1wIDwgMCkpKTsKKyAgcmV0dXJuIHJlczsKK30KKworU0VNT1BTX0lOTElORSBTSQorU1VCQ1NJIChTSSBhLCBTSSBiLCBCSSBjKQoreworICBTSSByZXMgPSBTVUJTSSAoYSwgQUREU0kgKGIsIGMpKTsKKyAgcmV0dXJuIHJlczsKK30KKworU0VNT1BTX0lOTElORSBCSQorU1VCQ0ZTSSAoU0kgYSwgU0kgYiwgQkkgYykKK3sKKyAgQkkgcmVzID0gKChVU0kpIGEgPCAoVVNJKSBiKSB8fCAoYyAmJiBhID09IGIpOworICByZXR1cm4gcmVzOworfQorCitTRU1PUFNfSU5MSU5FIEJJCitTVUJPRlNJIChTSSBhLCBTSSBiLCBCSSBjKQoreworICBTSSB0bXAgPSBTVUJTSSAoYSwgQUREU0kgKGIsIGMpKTsKKyAgQkkgcmVzID0gKCgoYSA8IDApICE9IChiIDwgMCkpCisJICAgICYmICgoYSA8IDApICE9ICh0bXAgPCAwKSkpOworICByZXR1cm4gcmVzOworfQorCisjZWxzZQorCitTSSBBRERDU0kgKFNJLCBTSSwgQkkpOworVUJJIEFERENGU0kgKFNJLCBTSSwgQkkpOworVUJJIEFERE9GU0kgKFNJLCBTSSwgQkkpOworU0kgU1VCQ1NJIChTSSwgU0ksIEJJKTsKK1VCSSBTVUJDRlNJIChTSSwgU0ksIEJJKTsKK1VCSSBTVUJPRlNJIChTSSwgU0ksIEJJKTsKKworI2VuZGlmCisMCisvKiBESSBtb2RlIHN1cHBvcnQgaWYgImxvbmcgbG9uZyIgZG9lc24ndCBleGlzdC4KKyAgIEF0IG9uZSBwb2ludCBDR0VOIHN1cHBvcnRlZCBLJlIgQyBjb21waWxlcnMsIGFuZCBBTlNJIEMgY29tcGlsZXJzIHdpdGhvdXQKKyAgICJsb25nIGxvbmciLiAgT25lIGNhbiBhcmd1ZSB0aGUgdmFyaW91cyBtZXJpdHMgb2Yga2VlcGluZyB0aGlzIGluIG9yCisgICB0aHJvd2luZyBpdCBvdXQuICBJIHdlbnQgdG8gdGhlIHRyb3VibGUgb2YgYWRkaW5nIGl0IHNvIGZvciB0aGUgdGltZSBiZWluZworICAgSSdtIGxlYXZpbmcgaXQgaW4uICAqLworCisjaWZkZWYgRElfRk5fU1VQUE9SVAorCitESSBtYWtlX3N0cnVjdF9kaSAoU0ksIFNJKTsKKy8qIEZJWE1FOiBuZWVkZWQ/ICovCitESSBDT05WSElESSAoSEkpOworREkgQ09OVlNJREkgKFNJKTsKK1NJIENPTlZESVNJIChESSk7CisKKyNlbmRpZiAvKiBESV9GTl9TVVBQT1JUICovCisKKyNlbmRpZiAvKiBDR0VOX1NFTV9PUFNfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9jZ2VuLXJ1bi5jIGIvc2ltL2NvbW1vbi9jZ2VuLXJ1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZWUxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL2NnZW4tcnVuLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qIE1haW4gc2ltdWxhdG9yIGxvb3AgZm9yIENHRU4tYmFzZWQgc2ltdWxhdG9ycy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogPz8/IFRoZXNlIGFyZSBvbGQgbm90ZXMsIGtlcHQgYXJvdW5kIGZvciBub3cuCisgICBDb2xsZWN0aW5nIHByb2ZpbGUgZGF0YSBhbmQgdHJhY2luZyBzbG93IHVzIGRvd24gc28gd2UgZG9uJ3QgZG8gdGhlbSBpbgorICAgImZhc3QgbW9kZSIuCisgICBUaGVyZSBhcmUgNiBwb3NzaWJpbGl0aWVzIG9uIDIgYXhlczoKKyAgIC0gbm8tc2NhY2hpbmcsIGluc24tc2NhY2hpbmcsIGJhc2ljLWJsb2NrLXNjYWNoaW5nCisgICAtIHJ1biB3aXRoIGZ1bGwgZmVhdHVyZXMgb3IgcnVuIGZhc3QKKyAgIFN1cHBvcnRpbmcgYWxsIHNpeCBwb3NzaWJpbGl0aWVzIGluIG9uZSBleGVjdXRhYmxlIGlzIGEgYml0IG11Y2ggYnV0CisgICBzdXBwb3J0aW5nIGZ1bGwvZmFzdCBzZWVtcyByZWFzb25hYmxlLgorICAgSWYgdGhlIHNjYWNoZSBpcyBjb25maWd1cmVkIGluIGl0IGlzIGFsd2F5cyB1c2VkLgorICAgSWYgcGJiLXNjYWNoaW5nIGlzIGNvbmZpZ3VyZWQgaW4gaXQgaXMgYWx3YXlzIHVzZWQuCisgICA/Pz8gU29tZXRpbWVzIHN1cHBvcnRpbmcgbW9yZSB0aGFuIG9uZSBzZXQgb2Ygc2VtYW50aWMgZnVuY3Rpb25zIHdpbGwgbWFrZQorICAgdGhlIHNpbXVsYXRvciB0b28gbGFyZ2UgLSB0aGlzIHNob3VsZCBiZSBjb25maWd1cmFibGUuICBCbGFoIGJsYWggYmxhaC4KKyAgID8/PyBTdXBwb3J0aW5nIGZ1bGwvZmFzdCBjYW4gYmUgbW9yZSBtb2R1bGFyLCBibGFoIGJsYWggYmxhaC4KKyAgIFdoZW4gdGhlIGZyYW1ld29yayBpcyBtb3JlIG1vZHVsYXIsIHRoaXMgY2FuIGJlLgorKi8KKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAic2ltLWFzc2VydC5oIgorCisjaWZuZGVmIFNJTV9FTkdJTkVfUFJFRklYX0hPT0sKKyNkZWZpbmUgU0lNX0VOR0lORV9QUkVGSVhfSE9PSyhzZCkKKyNlbmRpZgorI2lmbmRlZiBTSU1fRU5HSU5FX1BPU1RGSVhfSE9PSworI2RlZmluZSBTSU1fRU5HSU5FX1BPU1RGSVhfSE9PSyhzZCkKKyNlbmRpZgorCitzdGF0aWMgc2ltX2V2ZW50X2hhbmRsZXIgaGFzX3N0ZXBwZWQ7CitzdGF0aWMgdm9pZCBwcmltZV9jcHUgKFNJTV9DUFUgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGVuZ2luZV9ydW5fMSAoU0lNX0RFU0MsIGludCwgaW50KTsKK3N0YXRpYyB2b2lkIGVuZ2luZV9ydW5fbiAoU0lNX0RFU0MsIGludCwgaW50LCBpbnQsIGludCk7CisKKy8qIHNpbV9yZXN1bWUgZm9yIGNnZW4gKi8KKwordm9pZAorc2ltX3Jlc3VtZSAoU0lNX0RFU0Mgc2QsIGludCBzdGVwLCBpbnQgc2lnZ25hbCkKK3sKKyAgc2ltX2VuZ2luZSAqZW5naW5lID0gU1RBVEVfRU5HSU5FIChzZCk7CisgIGptcF9idWYgYnVmOworICBpbnQgam1wdmFsOworCisgIEFTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKKworICAvKiB3ZSBvbmx5IHdhbnQgdG8gYmUgc2luZ2xlIHN0ZXBwaW5nIHRoZSBzaW11bGF0b3Igb25jZSAqLworICBpZiAoZW5naW5lLT5zdGVwcGVyICE9IE5VTEwpCisgICAgeworICAgICAgc2ltX2V2ZW50c19kZXNjaGVkdWxlIChzZCwgZW5naW5lLT5zdGVwcGVyKTsKKyAgICAgIGVuZ2luZS0+c3RlcHBlciA9IE5VTEw7CisgICAgfQorICBpZiAoc3RlcCkKKyAgICBlbmdpbmUtPnN0ZXBwZXIgPSBzaW1fZXZlbnRzX3NjaGVkdWxlIChzZCwgMSwgaGFzX3N0ZXBwZWQsIHNkKTsKKworICBzaW1fbW9kdWxlX3Jlc3VtZSAoc2QpOworCisjaWYgV0lUSF9TQ0FDSEUKKyAgaWYgKFVTSU5HX1NDQUNIRV9QIChzZCkpCisgICAgc2NhY2hlX2ZsdXNoIChzZCk7CisjZW5kaWYKKworICAvKiBydW4vcmVzdW1lIHRoZSBzaW11bGF0b3IgKi8KKworICBzaW1fZW5naW5lX3NldF9ydW5fc3RhdGUgKHNkLCBzaW1fcnVubmluZywgMCk7CisKKyAgZW5naW5lLT5qbXBidWYgPSAmYnVmOworICBqbXB2YWwgPSBzZXRqbXAgKGJ1Zik7CisgIGlmIChqbXB2YWwgPT0gc2ltX2VuZ2luZV9zdGFydF9qbXB2YWwKKyAgICAgIHx8IGptcHZhbCA9PSBzaW1fZW5naW5lX3Jlc3RhcnRfam1wdmFsKQorICAgIHsKKyAgICAgIGludCBsYXN0X2NwdV9uciA9IHNpbV9lbmdpbmVfbGFzdF9jcHVfbnIgKHNkKTsKKyAgICAgIGludCBuZXh0X2NwdV9uciA9IHNpbV9lbmdpbmVfbmV4dF9jcHVfbnIgKHNkKTsKKyAgICAgIGludCBucl9jcHVzID0gc2ltX2VuZ2luZV9ucl9jcHVzIChzZCk7CisgICAgICAvKiA/Pz8gU2V0dGluZyBtYXhfaW5zbnMgdG8gMCBhbGxvd3MgcGJiL2ppdCBjb2RlIHRvIHJ1biB3aWxkIGFuZCBpcworCSB1c2VmdWwgaWYgYWxsIG9uZSB3YW50cyB0byBkbyBpcyBydW4gYSBiZW5jaG1hcmsuICBOZWVkIHNvbWUgYmV0dGVyCisJIHdheSB0byBpZGVudGlmeSB0aGlzIGNhc2UuICAqLworICAgICAgaW50IG1heF9pbnNucyA9IChzdGVwCisJCSAgICAgICA/IDEKKwkJICAgICAgIDogKG5yX2NwdXMgPT0gMSAvKiYmIHdpcDpuby1ldmVudHMqLykKKwkJICAgICAgID8gMAorCQkgICAgICAgOiA0KTsgLypGSVhNRTogbWFnaWMgbnVtYmVyKi8KKyAgICAgIGludCBmYXN0X3AgPSBTVEFURV9SVU5fRkFTVF9QIChzZCk7CisKKyAgICAgIHNpbV9ldmVudHNfcHJlcHJvY2VzcyAoc2QsIGxhc3RfY3B1X25yID49IG5yX2NwdXMsIG5leHRfY3B1X25yID49IG5yX2NwdXMpOworICAgICAgaWYgKG5leHRfY3B1X25yID49IG5yX2NwdXMpCisJbmV4dF9jcHVfbnIgPSAwOworICAgICAgaWYgKG5yX2NwdXMgPT0gMSkKKwllbmdpbmVfcnVuXzEgKHNkLCBtYXhfaW5zbnMsIGZhc3RfcCk7CisgICAgICBlbHNlCisJZW5naW5lX3J1bl9uIChzZCwgbmV4dF9jcHVfbnIsIG5yX2NwdXMsIG1heF9pbnNucywgZmFzdF9wKTsKKyAgICB9CisjaWYgMSAvKndpcCovCisgIGVsc2UKKyAgICB7CisgICAgICAvKiBBY2NvdW50IGZvciB0aGUgbGFzdCBpbnNuIGV4ZWN1dGVkLiAgKi8KKyAgICAgIFNJTV9DUFUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIHNpbV9lbmdpbmVfbGFzdF9jcHVfbnIgKHNkKSk7CisgICAgICArKyBDUFVfSU5TTl9DT1VOVCAoY3B1KTsKKyAgICAgIFRSQUNFX0lOU05fRklOSSAoY3B1LCBOVUxMLCAxKTsKKyAgICB9CisjZW5kaWYKKworICBlbmdpbmUtPmptcGJ1ZiA9IE5VTEw7CisKKyAgeworICAgIGludCBpOworICAgIGludCBucl9jcHVzID0gc2ltX2VuZ2luZV9ucl9jcHVzIChzZCk7CisKKyNpZiAwIC8qd2lwLGlnbm9yZSovCisgICAgLyogSWYgdGhlIGxvb3AgZXhpdHMsIGVpdGhlciB3ZSBzaW5nbGUtc3RlcHBlZCBvciBAY3B1QF9lbmdpbmVfc3RvcAorICAgICAgIHdhcyBjYWxsZWQuICAqLworICAgIGlmIChzdGVwKQorICAgICAgc2ltX2VuZ2luZV9zZXRfcnVuX3N0YXRlIChzZCwgc2ltX3N0b3BwZWQsIFNJTV9TSUdUUkFQKTsKKyAgICBlbHNlCisgICAgICBzaW1fZW5naW5lX3NldF9ydW5fc3RhdGUgKHNkLCBwZW5kaW5nX3JlYXNvbiwgcGVuZGluZ19zaWdyYyk7CisjZW5kaWYKKworICAgIGZvciAoaSA9IDA7IGkgPCBucl9jcHVzOyArK2kpCisgICAgICB7CisJU0lNX0NQVSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgaSk7CisKKwlQUk9GSUxFX1RPVEFMX0lOU05fQ09VTlQgKENQVV9QUk9GSUxFX0RBVEEgKGNwdSkpICs9IENQVV9JTlNOX0NPVU5UIChjcHUpOworICAgICAgfQorICB9CisKKyAgc2ltX21vZHVsZV9zdXNwZW5kIChzZCk7Cit9CisKKy8qIEhhbHQgdGhlIHNpbXVsYXRvciBhZnRlciBqdXN0IG9uZSBpbnN0cnVjdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCitoYXNfc3RlcHBlZCAoU0lNX0RFU0Mgc2QsIHZvaWQgKmRhdGEpCit7CisgIEFTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKKyAgc2ltX2VuZ2luZV9oYWx0IChzZCwgTlVMTCwgTlVMTCwgTlVMTF9DSUEsIHNpbV9zdG9wcGVkLCBTSU1fU0lHVFJBUCk7Cit9CisKKy8qIFByZXBhcmUgYSBjcHUgZm9yIHJ1bm5pbmcuCisgICBNQVhfSU5TTlMgaXMgdGhlIG51bWJlciBvZiBpbnNucyB0byBleGVjdXRlIHBlciB0aW1lIHNsaWNlLgorICAgSWYgMCBpdCBtZWFucyB0aGUgY3B1IGNhbiBydW4gYXMgbG9uZyBhcyBpdCB3YW50cyAoZS5nLiB1bnRpbCB0aGUKKyAgIHByb2dyYW0gY29tcGxldGVzKS4KKyAgID8/PyBQZXJoYXBzIHRoaXMgc2hvdWxkIGJlIGFuIGFyZ3VtZW50IHRvIHRoZSBlbmdpbmVfZm4uICAqLworCitzdGF0aWMgdm9pZAorcHJpbWVfY3B1IChTSU1fQ1BVICpjcHUsIGludCBtYXhfaW5zbnMpCit7CisgIENQVV9NQVhfU0xJQ0VfSU5TTlMgKGNwdSkgPSBtYXhfaW5zbnM7CisgIENQVV9JTlNOX0NPVU5UIChjcHUpID0gMDsKKworICAvKiBJbml0aWFsaXplIHRoZSBpbnNuIGRlc2NyaXB0b3IgdGFibGUuCisgICAgIFRoaXMgaGFzIHRvIGJlIGRvbmUgYWZ0ZXIgYWxsIGluaXRpYWxpemF0aW9uIHNvIHdlIGp1c3QgZGVmZXIgaXQgdG8KKyAgICAgaGVyZS4gICovCisKKyAgaWYgKE1BQ0hfUFJFUEFSRV9SVU4gKENQVV9NQUNIIChjcHUpKSkKKyAgICAoKiBNQUNIX1BSRVBBUkVfUlVOIChDUFVfTUFDSCAoY3B1KSkpIChjcHUpOworfQorCisvKiBNYWluIGxvb3AsIGZvciAxIGNwdS4gICovCisKK3N0YXRpYyB2b2lkCitlbmdpbmVfcnVuXzEgKFNJTV9ERVNDIHNkLCBpbnQgbWF4X2luc25zLCBpbnQgZmFzdF9wKQoreworICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCAwKTsKKyAgRU5HSU5FX0ZOICpmbiA9IGZhc3RfcCA/IENQVV9GQVNUX0VOR0lORV9GTiAoY3B1KSA6IENQVV9GVUxMX0VOR0lORV9GTiAoY3B1KTsKKworICBwcmltZV9jcHUgKGNwdSwgbWF4X2luc25zKTsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBTSU1fRU5HSU5FX1BSRUZJWF9IT09LIChzZCk7CisKKyAgICAgICgqZm4pIChjcHUpOworCisgICAgICBTSU1fRU5HSU5FX1BPU1RGSVhfSE9PSyAoc2QpOworCisgICAgICAvKiBwcm9jZXNzIGFueSBldmVudHMgKi8KKyAgICAgIGlmIChzaW1fZXZlbnRzX3RpY2sgKHNkKSkKKwlzaW1fZXZlbnRzX3Byb2Nlc3MgKHNkKTsKKyAgICB9Cit9CisKKy8qIE1haW4gbG9vcCwgZm9yIG11bHRpcGxlIGNwdXMuICAqLworCitzdGF0aWMgdm9pZAorZW5naW5lX3J1bl9uIChTSU1fREVTQyBzZCwgaW50IG5leHRfY3B1X25yLCBpbnQgbnJfY3B1cywgaW50IG1heF9pbnNucywgaW50IGZhc3RfcCkKK3sKKyAgaW50IGk7CisgIEVOR0lORV9GTiAqZW5naW5lX2Zuc1tNQVhfTlJfUFJPQ0VTU09SU107CisKKyAgZm9yIChpID0gMDsgaSA8IG5yX2NwdXM7ICsraSkKKyAgICB7CisgICAgICBTSU1fQ1BVICpjcHUgPSBTVEFURV9DUFUgKHNkLCBpKTsKKworICAgICAgZW5naW5lX2Zuc1tpXSA9IGZhc3RfcCA/IENQVV9GQVNUX0VOR0lORV9GTiAoY3B1KSA6IENQVV9GVUxMX0VOR0lORV9GTiAoY3B1KTsKKyAgICAgIHByaW1lX2NwdSAoY3B1LCBtYXhfaW5zbnMpOworICAgIH0KKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBTSU1fRU5HSU5FX1BSRUZJWF9IT09LIChzZCk7CisKKyAgICAgIC8qIEZJWE1FOiBwcm9wZXIgY3ljbGluZyBvZiBhbGwgb2YgdGhlbSwgYmxhaCBibGFoIGJsYWguICAqLworICAgICAgd2hpbGUgKG5leHRfY3B1X25yICE9IG5yX2NwdXMpCisJeworCSAgU0lNX0NQVSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgbmV4dF9jcHVfbnIpOworCisJICAoKiBlbmdpbmVfZm5zW25leHRfY3B1X25yXSkgKGNwdSk7CisJICArK25leHRfY3B1X25yOworCX0KKworICAgICAgU0lNX0VOR0lORV9QT1NURklYX0hPT0sgKHNkKTsKKworICAgICAgLyogcHJvY2VzcyBhbnkgZXZlbnRzICovCisgICAgICBpZiAoc2ltX2V2ZW50c190aWNrIChzZCkpCisJc2ltX2V2ZW50c19wcm9jZXNzIChzZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9jZ2VuLXNjYWNoZS5jIGIvc2ltL2NvbW1vbi9jZ2VuLXNjYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZWEwNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL2NnZW4tc2NhY2hlLmMKQEAgLTAsMCArMSw0NzEgQEAKKy8qIFNpbXVsYXRvciBjYWNoZSByb3V0aW5lcyBmb3IgQ0dFTiBzaW11bGF0b3JzIChhbmQgbWF5YmUgb3RoZXJzKS4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgU0NBQ0hFX0RFRklORV9JTkxJTkUKKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAic2ltLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJzaW0taW8uaCIKKworI2RlZmluZSBNQVgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorCisvKiBVbnVzZWQgYWRkcmVzcy4gICovCisjZGVmaW5lIFVOVVNFRF9BRERSIDB4ZmZmZmZmZmYKKworLyogU2NhY2hlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKyAgID8/PyBFeHBlcmltZW50cyB0byBkZXRlcm1pbmUgcmVhc29uYWJsZSB2YWx1ZXMgaXMgd2lwLgorICAgVGhlc2UgYXJlIGp1c3QgZ3Vlc3Nlcy4gICovCisKKy8qIERlZmF1bHQgbnVtYmVyIG9mIHNjYWNoZSBlbGVtZW50cy4KKyAgIFRoZSBzaXplIG9mIGFuIGVsZW1lbnQgaXMgdHlwaWNhbGx5IDMyLTY0IGJ5dGVzLCBzbyB0aGUgc2l6ZSBvZiB0aGUKKyAgIGRlZmF1bHQgc2NhY2hlIHdpbGwgYmUgYmV0d2VlbiA1MTJLIGFuZCAxTSBieXRlcy4gICovCisjaWZkZWYgQ09ORklHX1NJTV9DQUNIRV9TSVpFCisjZGVmaW5lIFNDQUNIRV9ERUZBVUxUX0NBQ0hFX1NJWkUgQ09ORklHX1NJTV9DQUNIRV9TSVpFCisjZWxzZQorI2RlZmluZSBTQ0FDSEVfREVGQVVMVF9DQUNIRV9TSVpFIDE2Mzg0CisjZW5kaWYKKworLyogTWluaW11bSBjYWNoZSBzaXplLgorICAgVGhlIG0zMnIgcG9ydCBhc3N1bWVzIGEgY2FjaGUgc2l6ZSBvZiBhdCBsZWFzdCAyIHNvIGl0IGNhbiBkZWNvZGUgYm90aCAxNgorICAgYml0IGluc25zLiAgV2hlbiBjb21waWxpbmcgd2UgbmVlZCBhbiBleHRyYSBmb3IgdGhlIGNoYWluIGVudHJ5LiAgQW5kIHRoaXMKKyAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyLiAgSGVuY2UgNCBpcyB0aGUgbWluaW11bSAodGhvdWdoLCBmb3IgdGhvc2Ugd2l0aAorICAgZmVhdHVyaXRpcyBvciBpdGNoeSBwZWRhbnRpYyBiaXRzLCB3ZSBjb3VsZCBtYWtlIHRoaXMgY29uZGl0aW9uYWwgb24KKyAgIFdJVEhfU0NBQ0hFX1BCQikuICAqLworI2RlZmluZSBNSU5fU0NBQ0hFX1NJWkUgNAorCisvKiBSYXRpbyBvZiBzaXplIG9mIHRleHQgc2VjdGlvbiB0byBzaXplIG9mIHNjYWNoZS4KKyAgIFdoZW4gY29tcGlsaW5nLCB3ZSBkb24ndCB3YW50IHRvIGZsdXNoIHRoZSBzY2FjaGUgbW9yZSB0aGFuIHdlIGhhdmUgdG8KKyAgIGJ1dCB3ZSBhbHNvIGRvbid0IHdhbnQgaXQgdG8gYmUgZXhvcmJpdGFudGx5KHNwPykgbGFyZ2UuICBTbyB3ZSBwaWNrIGEgaGlnaAorICAgZGVmYXVsdCB2YWx1ZSwgdGhlbiByZWR1Y2UgaXQgYnkgdGhlIHNpemUgb2YgdGhlIHByb2dyYW0gYmVpbmcgc2ltdWxhdGVkLAorICAgYnV0IHdlIGRvbid0IG92ZXJyaWRlIGFueSB2YWx1ZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgIElmIG5vdCBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlIHNpemUgdG8gdXNlIGlzIGNvbXB1dGVkIGFzCisgICBtYXggKE1JTl9TQ0FDSEVfU0laRSwKKyAgICAgICAgbWluIChERUZBVUxUX1NDQUNIRV9TSVpFLAorICAgICAgICAgICAgIHRleHRfc2l6ZSAvIChiYXNlX2luc25fc2l6ZSAqIElOU05fU0NBQ0hFX1JBVElPKSkpLiAgKi8KKy8qID8/PyBJbnRlcmVzdGluZyBpZGVhIGJ1dCBub3QgY3VycmVudGx5IHVzZWQuICAqLworI2RlZmluZSBJTlNOX1NDQUNIRV9SQVRJTyA0CisKKy8qIERlZmF1bHQgbWF4aW11bSBpbnNuIGNoYWluIGxlbmd0aC4KKyAgIFRoZSBvbmx5IHJlYXNvbiBmb3IgYSBtYXhpbXVtIGlzIHNvIHdlIGNhbiBwbGFjZSBhIG1heGltdW0gc2l6ZSBvbiB0aGUKKyAgIHByb2ZpbGluZyB0YWJsZS4gIENoYWluIGxlbmd0aHMgYXJlIGRldGVybWluZWQgYnkgY3RpJ3MuCisgICAzMiBpcyBhIG1vcmUgcmVhc29uYWJsZSBudW1iZXIsIGJ1dCB3aGVuIHByb2ZpbGluZywgdGhlIGJlZm9yZS9hZnRlcgorICAgaGFuZGxlcnMgdGFrZSB1cCB0aGF0IG11Y2ggbW9yZSBzcGFjZS4gIFRoZSBzY2FjaGUgaXMgZmlsbGVkIGZyb20gZnJvbnQgdG8KKyAgIGJhY2sgc28gYWxsIHRoaXMgZGV0ZXJtaW5lcyBpcyB3aGVuIHRoZSBzY2FjaGUgbmVlZHMgdG8gYmUgZmx1c2hlZC4gICovCisjZGVmaW5lIE1BWF9DSEFJTl9MRU5HVEggNjQKKworLyogRGVmYXVsdCBtYXhpbXVtIGhhc2ggbGlzdCBsZW5ndGguICAqLworI2RlZmluZSBNQVhfSEFTSF9DSEFJTl9MRU5HVEggNAorCisvKiBNaW5pbXVtIGhhc2ggdGFibGUgc2l6ZS4gICovCisjZGVmaW5lIE1JTl9IQVNIX0NIQUlOUyAzMgorCisvKiBSYXRpbyBvZiBudW1iZXIgb2Ygc2NhY2hlIGVsZW1lbnRzIHRvIG51bWJlciBvZiBoYXNoIGxpc3RzLgorICAgU2luY2UgdGhlIHVzZXIgY2FuIG9ubHkgc3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgc2NhY2hlLCB3ZSBjb21wdXRlIHRoZQorICAgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSBhcworICAgbWF4IChNSU5fSEFTSF9DSEFJTlMsIHNjYWNoZV9zaXplIC8gU0NBQ0hFX0hBU0hfUkFUSU8pLiAgKi8KKyNkZWZpbmUgU0NBQ0hFX0hBU0hfUkFUSU8gOAorCisvKiBIYXNoIGEgUEMgdmFsdWUuCisgICBGSVhNRTogTWF5IHdpc2ggdG8gbWFrZSB0aGUgaGFzaGluZyBhcmNoaXRlY3R1cmUgc3BlY2lmaWMuCisgICBGSVhNRTogcmV2aXNpdCAqLworI2RlZmluZSBIQVNIX1BDKHBjKSAoKChwYykgPj4gMikgKyAoKHBjKSA+PiA1KSkKKworc3RhdGljIE1PRFVMRV9JTklUX0ZOIHNjYWNoZV9pbml0Oworc3RhdGljIE1PRFVMRV9VTklOU1RBTExfRk4gc2NhY2hlX3VuaW5zdGFsbDsKKworc3RhdGljIERFQ0xBUkVfT1BUSU9OX0hBTkRMRVIgKHNjYWNoZV9vcHRpb25faGFuZGxlcik7CisKKyNkZWZpbmUgT1BUSU9OX1BST0ZJTEVfU0NBQ0hFCShPUFRJT05fU1RBUlQgKyAwKQorCitzdGF0aWMgY29uc3QgT1BUSU9OIHNjYWNoZV9vcHRpb25zW10gPSB7CisgIHsgeyJzY2FjaGUtc2l6ZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCAnYyd9LAorICAgICAgJ2MnLCAiW1NJWkVdIiwgIlNwZWNpZnkgc2l6ZSBvZiBzaW11bGF0b3IgZXhlY3V0aW9uIGNhY2hlIiwKKyAgICAgIHNjYWNoZV9vcHRpb25faGFuZGxlciB9LAorI2lmIFdJVEhfU0NBQ0hFX1BCQgorICAvKiA/Pz8gSXQgbWlnaHQgYmUgbmljZSB0byBhbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBzaXplIG9mIHRoZSBoYXNoCisgICAgIHRhYmxlLCB0aGUgbWF4aW11bSBoYXNoIGxpc3QgbGVuZ3RoLCBhbmQgdGhlIG1heGltdW0gY2hhaW4gbGVuZ3RoLCBidXQKKyAgICAgZm9yIG5vdyB0aGF0IG1pZ2h0IGJlIG1vcmUgYWtpbiB0byBmZWF0dXJpdGlzLiAgKi8KKyNlbmRpZgorICB7IHsicHJvZmlsZS1zY2FjaGUiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BST0ZJTEVfU0NBQ0hFfSwKKyAgICAgICdcMCcsICJvbnxvZmYiLCAiUGVyZm9ybSBzaW11bGF0b3IgZXhlY3V0aW9uIGNhY2hlIHByb2ZpbGluZyIsCisgICAgICBzY2FjaGVfb3B0aW9uX2hhbmRsZXIgfSwKKyAgeyB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9LCAnXDAnLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBTSU1fUkMKK3NjYWNoZV9vcHRpb25faGFuZGxlciAoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgaW50IG9wdCwKKwkJICAgICAgIGNoYXIgKmFyZywgaW50IGlzX2NvbW1hbmQpCit7CisgIGludCBuOworCisgIHN3aXRjaCAob3B0KQorICAgIHsKKyAgICBjYXNlICdjJyA6CisgICAgICBpZiAoV0lUSF9TQ0FDSEUpCisJeworCSAgaWYgKGFyZyAhPSBOVUxMKQorCSAgICB7CisJICAgICAgaW50IG4gPSBzdHJ0b2wgKGFyZywgTlVMTCwgMCk7CisJICAgICAgaWYgKG4gPCBNSU5fU0NBQ0hFX1NJWkUpCisJCXsKKwkJICBzaW1faW9fZXByaW50ZiAoc2QsICJpbnZhbGlkIHNjYWNoZSBzaXplIGAlZCcsIG11c3QgYmUgYXQgbGVhc3QgNCIsIG4pOworCQkgIHJldHVybiBTSU1fUkNfRkFJTDsKKwkJfQorCSAgICAgIC8qIEVuc3VyZSBpdCdzIGEgbXVsdGlwbGUgb2YgMi4gICovCisJICAgICAgaWYgKChuICYgKG4gLSAxKSkgIT0gMCkKKwkJeworCQkgIHNpbV9pb19lcHJpbnRmIChzZCwgInNjYWNoZSBzaXplIGAlZCcgbm90IGEgbXVsdGlwbGUgb2YgMlxuIiwgbik7CisJCSAgeworCQkgICAgLyogcm91bmQgdXAgdG8gbmVhcmVzdCBtdWx0aXBsZSBvZiAyICovCisJCSAgICBpbnQgaTsKKwkJICAgIGZvciAoaSA9IDE7IGkgPCBuOyBpIDw8PSAxKQorCQkgICAgICBjb250aW51ZTsKKwkJICAgIG4gPSBpOworCQkgIH0KKwkJICBzaW1faW9fZXByaW50ZiAoc2QsICJyb3VuZGluZyBzY2FjaGUgc2l6ZSB1cCB0byAlZFxuIiwgbik7CisJCX0KKwkgICAgICBpZiAoY3B1ID09IE5VTEwpCisJCVNUQVRFX1NDQUNIRV9TSVpFIChzZCkgPSBuOworCSAgICAgIGVsc2UKKwkJQ1BVX1NDQUNIRV9TSVpFIChjcHUpID0gbjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKGNwdSA9PSBOVUxMKQorCQlTVEFURV9TQ0FDSEVfU0laRSAoc2QpID0gU0NBQ0hFX0RFRkFVTFRfQ0FDSEVfU0laRTsKKwkgICAgICBlbHNlCisJCUNQVV9TQ0FDSEVfU0laRSAoY3B1KSA9IFNDQUNIRV9ERUZBVUxUX0NBQ0hFX1NJWkU7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJc2ltX2lvX2VwcmludGYgKHNkLCAiU2ltdWxhdG9yIGV4ZWN1dGlvbiBjYWNoZSBub3QgZW5hYmxlZCwgYC0tc2NhY2hlLXNpemUnIGlnbm9yZWRcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9QUk9GSUxFX1NDQUNIRSA6CisgICAgICBpZiAoV0lUSF9TQ0FDSEUgJiYgV0lUSF9QUk9GSUxFX1NDQUNIRV9QKQorCXsKKwkgIC8qIEZJWE1FOiBoYW5kbGUgY3B1ICE9IE5VTEwuICAqLworCSAgcmV0dXJuIHNpbV9wcm9maWxlX3NldF9vcHRpb24gKHNkLCAiLXNjYWNoZSIsIFBST0ZJTEVfU0NBQ0hFX0lEWCwKKwkJCQkJIGFyZyk7CisJfQorICAgICAgZWxzZQorCXNpbV9pb19lcHJpbnRmIChzZCwgIlNpbXVsYXRvciBjYWNoZSBwcm9maWxpbmcgbm90IGNvbXBpbGVkIGluLCBgLS1wcm9maWxlLXNjYWNoZScgaWdub3JlZFxuIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworU0lNX1JDCitzY2FjaGVfaW5zdGFsbCAoU0lNX0RFU0Mgc2QpCit7CisgIHNpbV9hZGRfb3B0aW9uX3RhYmxlIChzZCwgTlVMTCwgc2NhY2hlX29wdGlvbnMpOworICBzaW1fbW9kdWxlX2FkZF9pbml0X2ZuIChzZCwgc2NhY2hlX2luaXQpOworICBzaW1fbW9kdWxlX2FkZF91bmluc3RhbGxfZm4gKHNkLCBzY2FjaGVfdW5pbnN0YWxsKTsKKworICAvKiBUaGlzIGlzIHRoZSBkZWZhdWx0LCBpdCBtYXkgYmUgb3ZlcnJpZGRlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKi8KKyAgU1RBVEVfU0NBQ0hFX1NJWkUgKHNkKSA9IFdJVEhfU0NBQ0hFOworCisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKK3N0YXRpYyBTSU1fUkMKK3NjYWNoZV9pbml0IChTSU1fREVTQyBzZCkKK3sKKyAgaW50IGM7CisKKyAgZm9yIChjID0gMDsgYyA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2MpCisgICAgeworICAgICAgU0lNX0NQVSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgYyk7CisgICAgICBpbnQgZWxtX3NpemUgPSBJTVBfUFJPUFNfU0NBQ0hFX0VMTV9TSVpFIChNQUNIX0lNUF9QUk9QUyAoQ1BVX01BQ0ggKGNwdSkpKTsKKworICAgICAgLyogZWxtX3NpemUgaXMgMCBpZiB0aGUgY3B1IGRvZXNuJ3Qgbm90IGhhdmUgc2NhY2hlIHN1cHBvcnQgKi8KKyAgICAgIGlmIChlbG1fc2l6ZSA9PSAwKQorCXsKKwkgIENQVV9TQ0FDSEVfU0laRSAoY3B1KSA9IDA7CisJICBDUFVfU0NBQ0hFX0NBQ0hFIChjcHUpID0gTlVMTDsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKENQVV9TQ0FDSEVfU0laRSAoY3B1KSA9PSAwKQorCSAgICBDUFVfU0NBQ0hFX1NJWkUgKGNwdSkgPSBTVEFURV9TQ0FDSEVfU0laRSAoc2QpOworCSAgQ1BVX1NDQUNIRV9DQUNIRSAoY3B1KSA9CisJICAgIChTQ0FDSEUgKikgeG1hbGxvYyAoQ1BVX1NDQUNIRV9TSVpFIChjcHUpICogZWxtX3NpemUpOworI2lmIFdJVEhfU0NBQ0hFX1BCQgorCSAgQ1BVX1NDQUNIRV9NQVhfQ0hBSU5fTEVOR1RIIChjcHUpID0gTUFYX0NIQUlOX0xFTkdUSDsKKwkgIENQVV9TQ0FDSEVfTlVNX0hBU0hfQ0hBSU5fRU5UUklFUyAoY3B1KSA9IE1BWF9IQVNIX0NIQUlOX0xFTkdUSDsKKwkgIENQVV9TQ0FDSEVfTlVNX0hBU0hfQ0hBSU5TIChjcHUpID0gTUFYIChNSU5fSEFTSF9DSEFJTlMsCisJCQkJCQkgIENQVV9TQ0FDSEVfU0laRSAoY3B1KQorCQkJCQkJICAvIFNDQUNIRV9IQVNIX1JBVElPKTsKKwkgIENQVV9TQ0FDSEVfSEFTSF9UQUJMRSAoY3B1KSA9CisJICAgIChTQ0FDSEVfTUFQICopIHhtYWxsb2MgKENQVV9TQ0FDSEVfTlVNX0hBU0hfQ0hBSU5TIChjcHUpCisJCQkJICAgICogQ1BVX1NDQUNIRV9OVU1fSEFTSF9DSEFJTl9FTlRSSUVTIChjcHUpCisJCQkJICAgICogc2l6ZW9mIChTQ0FDSEVfTUFQKSk7CisJICBDUFVfU0NBQ0hFX1BCQl9CRUdJTiAoY3B1KSA9IChTQ0FDSEUgKikgemFsbG9jIChlbG1fc2l6ZSk7CisJICBDUFVfU0NBQ0hFX0NIQUlOX0xFTkdUSFMgKGNwdSkgPQorCSAgICAodW5zaWduZWQgbG9uZyAqKSB6YWxsb2MgKChDUFVfU0NBQ0hFX01BWF9DSEFJTl9MRU5HVEggKGNwdSkgKyAxKQorCQkJCSAgICAgICogc2l6ZW9mIChsb25nKSk7CisjZW5kaWYKKwl9CisgICAgfQorCisgIHNjYWNoZV9mbHVzaCAoc2QpOworCisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKK3N0YXRpYyB2b2lkCitzY2FjaGVfdW5pbnN0YWxsIChTSU1fREVTQyBzZCkKK3sKKyAgaW50IGM7CisKKyAgZm9yIChjID0gMDsgYyA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2MpCisgICAgeworICAgICAgU0lNX0NQVSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgYyk7CisKKyAgICAgIGlmIChDUFVfU0NBQ0hFX0NBQ0hFIChjcHUpICE9IE5VTEwpCisJZnJlZSAoQ1BVX1NDQUNIRV9DQUNIRSAoY3B1KSk7CisjaWYgV0lUSF9TQ0FDSEVfUEJCCisgICAgICBpZiAoQ1BVX1NDQUNIRV9IQVNIX1RBQkxFIChjcHUpICE9IE5VTEwpCisJZnJlZSAoQ1BVX1NDQUNIRV9IQVNIX1RBQkxFIChjcHUpKTsKKyAgICAgIGlmIChDUFVfU0NBQ0hFX1BCQl9CRUdJTiAoY3B1KSAhPSBOVUxMKQorCWZyZWUgKENQVV9TQ0FDSEVfUEJCX0JFR0lOIChjcHUpKTsKKyAgICAgIGlmIChDUFVfU0NBQ0hFX0NIQUlOX0xFTkdUSFMgKGNwdSkgIT0gTlVMTCkKKwlmcmVlIChDUFVfU0NBQ0hFX0NIQUlOX0xFTkdUSFMgKGNwdSkpOworI2VuZGlmCisgICAgfQorfQorCit2b2lkCitzY2FjaGVfZmx1c2ggKFNJTV9ERVNDIHNkKQoreworICBpbnQgYzsKKworICBmb3IgKGMgPSAwOyBjIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrYykKKyAgICB7CisgICAgICBTSU1fQ1BVICpjcHUgPSBTVEFURV9DUFUgKHNkLCBjKTsKKyAgICAgIHNjYWNoZV9mbHVzaF9jcHUgKGNwdSk7CisgICAgfQorfQorCit2b2lkCitzY2FjaGVfZmx1c2hfY3B1IChTSU1fQ1BVICpjcHUpCit7CisgIGludCBpLG47CisKKyAgLyogRG9uJ3QgYm90aGVyIGlmIGNhY2hlIG5vdCBpbiB1c2UuICAqLworICBpZiAoQ1BVX1NDQUNIRV9TSVpFIChjcHUpID09IDApCisgICAgcmV0dXJuOworCisjaWYgV0lUSF9TQ0FDSEVfUEJCCisgIC8qIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhpcyBiZSByZWFzb25hYmx5IGZhc3QgYXMgdGhpcyBjYW4gYmUgZG9uZSB3aGVuCisgICAgIHRoZSBzaW11bGF0aW9uIGlzIHJ1bm5pbmcuICAqLworICBDUFVfU0NBQ0hFX05FWFRfRlJFRSAoY3B1KSA9IENQVV9TQ0FDSEVfQ0FDSEUgKGNwdSk7CisgIG4gPSBDUFVfU0NBQ0hFX05VTV9IQVNIX0NIQUlOUyAoY3B1KSAqIENQVV9TQ0FDSEVfTlVNX0hBU0hfQ0hBSU5fRU5UUklFUyAoY3B1KTsKKyAgLyogPz8/IE1pZ2h0IGJlIGZhc3RlciB0byBqdXN0IHNldCB0aGUgZmlyc3QgZW50cnksIHRoZW4gdXBkYXRlIHRoZQorICAgICAibGFzdCBlbnRyeSIgbWFya2VyIGR1cmluZyBhbGxvY2F0aW9uLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IG47ICsraSkKKyAgICBDUFVfU0NBQ0hFX0hBU0hfVEFCTEUgKGNwdSkgW2ldIC4gcGMgPSBVTlVTRURfQUREUjsKKyNlbHNlCisgIHsKKyAgICBpbnQgZWxtX3NpemUgPSBJTVBfUFJPUFNfU0NBQ0hFX0VMTV9TSVpFIChNQUNIX0lNUF9QUk9QUyAoQ1BVX01BQ0ggKGNwdSkpKTsKKyAgICBTQ0FDSEUgKnNjOworCisgICAgLyogVGVjaG5pY2FsbHksIHRoaXMgbWF5IG5vdCBiZSBuZWNlc3NhcnksIGJ1dCBpdCBoZWxwcyBkZWJ1Z2dpbmcuICAqLworICAgIG1lbXNldCAoQ1BVX1NDQUNIRV9DQUNIRSAoY3B1KSwgMCwKKwkgICAgQ1BVX1NDQUNIRV9TSVpFIChjcHUpICogZWxtX3NpemUpOworCisgICAgZm9yIChpID0gMCwgc2MgPSBDUFVfU0NBQ0hFX0NBQ0hFIChjcHUpOyBpIDwgQ1BVX1NDQUNIRV9TSVpFIChjcHUpOworCSArK2ksIHNjID0gKFNDQUNIRSAqKSAoKGNoYXIgKikgc2MgKyBlbG1fc2l6ZSkpCisgICAgICB7CisJc2MtPmFyZ2J1Zi5hZGRyID0gVU5VU0VEX0FERFI7CisgICAgICB9CisgIH0KKyNlbmRpZgorfQorCisjaWYgV0lUSF9TQ0FDSEVfUEJCCisKKy8qIExvb2sgdXAgUEMgaW4gdGhlIGhhc2ggdGFibGUgb2Ygc2NhY2hlIGVudHJ5IHBvaW50cy4KKyAgIFJldHVybnMgdGhlIGVudHJ5IG9yIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KKworU0NBQ0hFICoKK3NjYWNoZV9sb29rdXAgKFNJTV9DUFUgKmNwdSwgSUFERFIgcGMpCit7CisgIHVuc2lnbmVkIGludCBzbG90ID0gSEFTSF9QQyAocGMpICYgKENQVV9TQ0FDSEVfTlVNX0hBU0hfQ0hBSU5TIChjcHUpIC0gMSk7CisgIGludCBpLCBtYXhfaSA9IENQVV9TQ0FDSEVfTlVNX0hBU0hfQ0hBSU5fRU5UUklFUyAoY3B1KTsKKyAgU0NBQ0hFX01BUCAqc2NtOworCisgIC8qIFdlIGRvbid0IHVwZGF0ZSBoaXQvbWlzcyBzdGF0aXN0aWNzIGFzIHRoaXMgaXMgb25seSB1c2VkIHdoZW4gcmVjb3JkaW5nCisgICAgIGJyYW5jaCB0YXJnZXQgYWRkcmVzc2VzLiAgKi8KKworICBzY20gPSAmIENQVV9TQ0FDSEVfSEFTSF9UQUJMRSAoY3B1KSBbc2xvdF07CisgIGZvciAoaSA9IDA7IGkgPCBtYXhfaSAmJiBzY20tPnBjICE9IFVOVVNFRF9BRERSOyArK2ksICsrc2NtKQorICAgIHsKKyAgICAgIGlmIChzY20tPnBjID09IHBjKQorCXJldHVybiBzY20tPnNjOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIExvb2sgdXAgUEMgYW5kIGlmIG5vdCBmb3VuZCBjcmVhdGUgYW4gZW50cnkgZm9yIGl0LgorICAgSWYgZm91bmQgdGhlIHJlc3VsdCBpcyBhIHBvaW50ZXIgdG8gdGhlIFNDQUNIRSBlbnRyeS4KKyAgIElmIG5vdCBmb3VuZCB0aGUgcmVzdWx0IGlzIE5VTEwsIGFuZCB0aGUgYWRkcmVzcyBvZiBhIGJ1ZmZlciBvZiBhdCBsZWFzdAorICAgTiBlbnRyaWVzIGlzIHN0b3JlZCBpbiBCVUZQLgorICAgSXQncyBkb25lIHRoaXMgd2F5IHNvIHRoZSBjYWxsZXIgY2FuIHN0aWxsIGRpc3Rpbmd1aXNoIGZvdW5kL25vdC1mb3VuZC4KKyAgIElmIHRoZSB0YWJsZSBpcyBmdWxsLCBpdCBpcyBlbXB0aWVkIHRvIG1ha2Ugcm9vbS4KKyAgIElmIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGhhc2ggbGlzdCBpcyByZWFjaGVkIGEgcmFuZG9tIGVudHJ5IGlzIHRocm93biBvdXQKKyAgIHRvIG1ha2Ugcm9vbS4KKyAgID8/PyBPbmUgbWlnaHQgd2FudCB0byB0cnkgdG8gbWFrZSB0aGlzIHNtYXJ0ZXIsIGJ1dCBsZXQncyBzZWUgc29tZQorICAgbWVhc3VyYWJsZSBiZW5lZml0IGZpcnN0LiAgKi8KKworU0NBQ0hFICoKK3NjYWNoZV9sb29rdXBfb3JfYWxsb2MgKFNJTV9DUFUgKmNwdSwgSUFERFIgcGMsIGludCBuLCBTQ0FDSEUgKipidWZwKQoreworICB1bnNpZ25lZCBpbnQgc2xvdCA9IEhBU0hfUEMgKHBjKSAmIChDUFVfU0NBQ0hFX05VTV9IQVNIX0NIQUlOUyAoY3B1KSAtIDEpOworICBpbnQgaSwgbWF4X2kgPSBDUFVfU0NBQ0hFX05VTV9IQVNIX0NIQUlOX0VOVFJJRVMgKGNwdSk7CisgIFNDQUNIRV9NQVAgKnNjbTsKKyAgU0NBQ0hFICpzYzsKKworICBzY20gPSAmIENQVV9TQ0FDSEVfSEFTSF9UQUJMRSAoY3B1KSBbc2xvdF07CisgIGZvciAoaSA9IDA7IGkgPCBtYXhfaSAmJiBzY20tPnBjICE9IFVOVVNFRF9BRERSOyArK2ksICsrc2NtKQorICAgIHsKKyAgICAgIGlmIChzY20tPnBjID09IHBjKQorCXsKKwkgIFBST0ZJTEVfQ09VTlRfU0NBQ0hFX0hJVCAoY3B1KTsKKwkgIHJldHVybiBzY20tPnNjOworCX0KKyAgICB9CisgIFBST0ZJTEVfQ09VTlRfU0NBQ0hFX01JU1MgKGNwdSk7CisKKyAgLyogVGhlIGFkZHJlc3Mgd2Ugd2FudCBpc24ndCBjYWNoZWQuICBCdW1tZXIuCisgICAgIElmIHRoZSBoYXNoIGNoYWluIHdlIGhhdmUgZm9yIHRoaXMgYWRkcmVzcyBpcyBmdWxsLCB0aHJvdyBvdXQgYW4gZW50cnkKKyAgICAgdG8gbWFrZSByb29tLiAgKi8KKworICBpZiAoaSA9PSBtYXhfaSkKKyAgICB7CisgICAgICAvKiBSYXRoZXIgdGhhbiBkbyBzb21ldGhpbmcgc29waGlzdGljYXRlZCBsaWtlIExSVSwgd2UganVzdCB0aHJvdyBvdXQKKwkgYSBzZW1pLXJhbmRvbSBlbnRyeS4gIExldCBzb21lb25lIGVsc2UgaGF2ZSB0aGUgam95IG9mIHNheWluZyBob3cKKwkgd3JvbmcgdGhpcyBpcy4gIE5FWFRfRlJFRSBpcyB0aGUgZW50cnkgdG8gdGhyb3cgb3V0IGFuZCBjeWNsZXMKKwkgdGhyb3VnaCBhbGwgcG9zc2liaWxpdGllcy4gICovCisgICAgICBzdGF0aWMgaW50IG5leHRfZnJlZSA9IDA7CisKKyAgICAgIHNjbSA9ICYgQ1BVX1NDQUNIRV9IQVNIX1RBQkxFIChjcHUpIFtzbG90XTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuZXh0X2ZyZWU7ICsraSwgKytzY20pCisJY29udGludWU7CisgICAgICArK25leHRfZnJlZTsKKyAgICAgIGlmIChuZXh0X2ZyZWUgPT0gQ1BVX1NDQUNIRV9OVU1fSEFTSF9DSEFJTl9FTlRSSUVTIChjcHUpKQorCW5leHRfZnJlZSA9IDA7CisgICAgfQorCisgIC8qIEF0IHRoaXMgcG9pbnQgU0NNIHBvaW50cyB0byB0aGUgaGFzaCB0YWJsZSBlbnRyeSB0byB1c2UuCisgICAgIE5vdyBtYWtlIHN1cmUgdGhlcmUncyByb29tIGluIHRoZSBjYWNoZS4gICovCisKKyAgeworICAgIGludCBlbG1fc2l6ZSA9IElNUF9QUk9QU19TQ0FDSEVfRUxNX1NJWkUgKE1BQ0hfSU1QX1BST1BTIChDUFVfTUFDSCAoY3B1KSkpOworICAgIGludCBlbG1zX3VzZWQgPSAoKChjaGFyICopIENQVV9TQ0FDSEVfTkVYVF9GUkVFIChjcHUpCisJCSAgICAgIC0gKGNoYXIgKikgQ1BVX1NDQUNIRV9DQUNIRSAoY3B1KSkKKwkJICAgICAvIGVsbV9zaXplKTsKKyAgICBpbnQgZWxtc19sZWZ0ID0gQ1BVX1NDQUNIRV9TSVpFIChjcHUpIC0gZWxtc191c2VkOworCisgICAgaWYgKGVsbXNfbGVmdCA8IG4pCisgICAgICB7CisJUFJPRklMRV9DT1VOVF9TQ0FDSEVfRlVMTF9GTFVTSCAoY3B1KTsKKwlzY2FjaGVfZmx1c2hfY3B1IChjcHUpOworICAgICAgfQorICB9CisKKyAgc2MgPSBDUFVfU0NBQ0hFX05FWFRfRlJFRSAoY3B1KTsKKyAgc2NtLT5wYyA9IHBjOworICBzY20tPnNjID0gc2M7CisKKyAgKmJ1ZnAgPSBzYzsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKyNlbmRpZiAvKiBXSVRIX1NDQUNIRV9QQkIgKi8KKworLyogUHJpbnQgY2FjaGUgYWNjZXNzIHN0YXRpY3MgZm9yIENQVS4gICovCisKK3ZvaWQKK3NjYWNoZV9wcmludF9wcm9maWxlIChTSU1fQ1BVICpjcHUsIGludCB2ZXJib3NlKQoreworICBTSU1fREVTQyBzZCA9IENQVV9TVEFURSAoY3B1KTsKKyAgdW5zaWduZWQgbG9uZyBoaXRzID0gQ1BVX1NDQUNIRV9ISVRTIChjcHUpOworICB1bnNpZ25lZCBsb25nIG1pc3NlcyA9IENQVV9TQ0FDSEVfTUlTU0VTIChjcHUpOworICBjaGFyIGJ1ZlsyMF07CisgIHVuc2lnbmVkIGxvbmcgbWF4X3ZhbDsKKyAgdW5zaWduZWQgbG9uZyAqbGVuZ3RoczsKKyAgaW50IGk7CisKKyAgaWYgKENQVV9TQ0FDSEVfU0laRSAoY3B1KSA9PSAwKQorICAgIHJldHVybjsKKworICBzaW1faW9fcHJpbnRmIChzZCwgIlNpbXVsYXRvciBDYWNoZSBTdGF0aXN0aWNzXG5cbiIpOworCisgIC8qIE9uZSBjb3VsZCB1c2UgUFJPRklMRV9MQUJFTF9XSURUSCBoZXJlLiAgSSBjaG9zZSBub3QgdG8uICAqLworICBzaW1faW9fcHJpbnRmIChzZCwgIiAgQ2FjaGUgc2l6ZTogJXNcbiIsCisJCSBzaW1fYWRkX2NvbW1hcyAoYnVmLCBzaXplb2YgKGJ1ZiksIENQVV9TQ0FDSEVfU0laRSAoY3B1KSkpOworICBzaW1faW9fcHJpbnRmIChzZCwgIiAgSGl0czogICAgICAgJXNcbiIsCisJCSBzaW1fYWRkX2NvbW1hcyAoYnVmLCBzaXplb2YgKGJ1ZiksIGhpdHMpKTsKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICIgIE1pc3NlczogICAgICVzXG4iLAorCQkgc2ltX2FkZF9jb21tYXMgKGJ1Ziwgc2l6ZW9mIChidWYpLCBtaXNzZXMpKTsKKyAgaWYgKGhpdHMgKyBtaXNzZXMgIT0gMCkKKyAgICBzaW1faW9fcHJpbnRmIChzZCwgIiAgSGl0IHJhdGU6ICAgJS4yZiUlXG4iLAorCQkgICAoKGRvdWJsZSkgaGl0cyAvICgoZG91YmxlKSBoaXRzICsgKGRvdWJsZSkgbWlzc2VzKSkgKiAxMDApOworCisjaWYgV0lUSF9TQ0FDSEVfUEJCCisgIHNpbV9pb19wcmludGYgKHNkLCAiXG4iKTsKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICIgIEhhc2ggdGFibGUgc2l6ZTogICAgICAgJXNcbiIsCisJCSBzaW1fYWRkX2NvbW1hcyAoYnVmLCBzaXplb2YgKGJ1ZiksIENQVV9TQ0FDSEVfTlVNX0hBU0hfQ0hBSU5TIChjcHUpKSk7CisgIHNpbV9pb19wcmludGYgKHNkLCAiICBNYXggaGFzaCBsaXN0IGxlbmd0aDogICVzXG4iLAorCQkgc2ltX2FkZF9jb21tYXMgKGJ1Ziwgc2l6ZW9mIChidWYpLCBDUFVfU0NBQ0hFX05VTV9IQVNIX0NIQUlOX0VOVFJJRVMgKGNwdSkpKTsKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICIgIE1heCBpbnNuIGNoYWluIGxlbmd0aDogJXNcbiIsCisJCSBzaW1fYWRkX2NvbW1hcyAoYnVmLCBzaXplb2YgKGJ1ZiksIENQVV9TQ0FDSEVfTUFYX0NIQUlOX0xFTkdUSCAoY3B1KSkpOworICBzaW1faW9fcHJpbnRmIChzZCwgIiAgQ2FjaGUgZnVsbCBmbHVzaGVzOiAgICAlc1xuIiwKKwkJIHNpbV9hZGRfY29tbWFzIChidWYsIHNpemVvZiAoYnVmKSwgQ1BVX1NDQUNIRV9GVUxMX0ZMVVNIRVMgKGNwdSkpKTsKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOworCisgIGlmICh2ZXJib3NlKQorICAgIHsKKyAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiICBJbnNuIGNoYWluIGxlbmd0aHM6XG5cbiIpOworICAgICAgbWF4X3ZhbCA9IDA7CisgICAgICBsZW5ndGhzID0gQ1BVX1NDQUNIRV9DSEFJTl9MRU5HVEhTIChjcHUpOworICAgICAgZm9yIChpID0gMTsgaSA8IENQVV9TQ0FDSEVfTUFYX0NIQUlOX0xFTkdUSCAoY3B1KTsgKytpKQorCWlmIChsZW5ndGhzW2ldID4gbWF4X3ZhbCkKKwkgIG1heF92YWwgPSBsZW5ndGhzW2ldOworICAgICAgZm9yIChpID0gMTsgaSA8IENQVV9TQ0FDSEVfTUFYX0NIQUlOX0xFTkdUSCAoY3B1KTsgKytpKQorCXsKKwkgIHNpbV9pb19wcmludGYgKHNkLCAiICAlMmQ6ICUqczogIiwKKwkJCSBpLAorCQkJIG1heF92YWwgPCAxMDAwMCA/IDUgOiAxMCwKKwkJCSBzaW1fYWRkX2NvbW1hcyAoYnVmLCBzaXplb2YgKGJ1ZiksIGxlbmd0aHNbaV0pKTsKKwkgIHNpbV9wcm9maWxlX3ByaW50X2JhciAoc2QsIFBST0ZJTEVfSElTVE9HUkFNX1dJRFRILAorCQkJCSBsZW5ndGhzW2ldLCBtYXhfdmFsKTsKKwkgIHNpbV9pb19wcmludGYgKHNkLCAiXG4iKTsKKwl9CisgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIlxuIik7CisgICAgfQorI2VuZGlmIC8qIFdJVEhfU0NBQ0hFX1BCQiAqLworfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9jZ2VuLXNjYWNoZS5oIGIvc2ltL2NvbW1vbi9jZ2VuLXNjYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYTRlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL2NnZW4tc2NhY2hlLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qIFNpbXVsYXRvciBoZWFkZXIgZm9yIGNnZW4gc2NhY2hlIHN1cHBvcnQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgQ0dFTl9TQ0FDSEVfSAorI2RlZmluZSBDR0VOX1NDQUNIRV9ICisKKyNpZm5kZWYgV0lUSF9TQ0FDSEUKKyNkZWZpbmUgV0lUSF9TQ0FDSEUgMAorI2VuZGlmCisKKy8qIFdoZW4gY2FjaGluZyBiYidzLCBpbnN0cnVjdGlvbnMgYXJlIGV4dHJhY3RlZCBpbnRvICJjaGFpbnMiLgorICAgU0NBQ0hFX01BUCBpcyBhIGhhc2ggdGFibGUgaW50byB0aGVzZSBjaGFpbnMuICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIElBRERSIHBjOworICBTQ0FDSEUgKnNjOworfSBTQ0FDSEVfTUFQOworCit0eXBlZGVmIHN0cnVjdCBjcHVfc2NhY2hlIHsKKyAgLyogU2ltdWxhdG9yIGNhY2hlIHNpemUuICBNdXN0IGJlIGEgcG93ZXIgb2YgMi4KKyAgICAgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBgY2FjaGUnIG1lbWJlci4gICovCisgIHVuc2lnbmVkIGludCBzaXplOworI2RlZmluZSBDUFVfU0NBQ0hFX1NJWkUoY3B1KSAoKGNwdSkgLT4gY2dlbl9jcHUuc2NhY2hlLnNpemUpCisgIC8qIFRoZSBjYWNoZS4gICovCisgIFNDQUNIRSAqY2FjaGU7CisjZGVmaW5lIENQVV9TQ0FDSEVfQ0FDSEUoY3B1KSAoKGNwdSkgLT4gY2dlbl9jcHUuc2NhY2hlLmNhY2hlKQorCisjaWYgV0lUSF9TQ0FDSEVfUEJCCisgIC8qIE51bWJlciBvZiBoYXNoIGNoYWlucy4gIE11c3QgYmUgYSBwb3dlciBvZiAyLiAgKi8KKyAgdW5zaWduZWQgaW50IG51bV9oYXNoX2NoYWluczsKKyNkZWZpbmUgQ1BVX1NDQUNIRV9OVU1fSEFTSF9DSEFJTlMoY3B1KSAoKGNwdSkgLT4gY2dlbl9jcHUuc2NhY2hlLm51bV9oYXNoX2NoYWlucykKKyAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gZWFjaCBoYXNoIGNoYWluLgorICAgICBUaGUgaGFzaCB0YWJsZSBpcyBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIE54TSBhcnJheSB3aGVyZQorICAgICBOID0gbnVtX2hhc2hfY2hhaW5zCisgICAgIE0gPSBudW1faGFzaF9jaGFpbl9lbnRyaWVzLiAgKi8KKyAgdW5zaWduZWQgaW50IG51bV9oYXNoX2NoYWluX2VudHJpZXM7CisjZGVmaW5lIENQVV9TQ0FDSEVfTlVNX0hBU0hfQ0hBSU5fRU5UUklFUyhjcHUpICgoY3B1KSAtPiBjZ2VuX2NwdS5zY2FjaGUubnVtX2hhc2hfY2hhaW5fZW50cmllcykKKyAgLyogTWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGluIGEgY2hhaW4uCisgICAgID8/PyBUaGlzIGp1c3QgbGV0J3MgdXMgc2V0IGEgc3RhdGljIHNpemUgb2YgY2hhaW5fbGVuZ3RocyB0YWJsZS4KKyAgICAgSW4gYSBzaW11bGF0aW9uIHRoYXQgaGFuZGxlcyBtb3JlIHRoYW4ganVzdCB0aGUgY3B1LCB0aGlzIG1pZ2h0IGFsc28gYmUKKyAgICAgdXNlZCB0byBrZWVwIHRvbyBtYW55IGluc3RydWN0aW9ucyBmcm9tIGJlaW5nIGV4ZWN1dGVkIGJlZm9yZSBjaGVja2luZworICAgICBmb3IgZXZlbnRzIChvciBzb21lIHN1Y2gpLiAgKi8KKyAgdW5zaWduZWQgaW50IG1heF9jaGFpbl9sZW5ndGg7CisjZGVmaW5lIENQVV9TQ0FDSEVfTUFYX0NIQUlOX0xFTkdUSChjcHUpICgoY3B1KSAtPiBjZ2VuX2NwdS5zY2FjaGUubWF4X2NoYWluX2xlbmd0aCkKKyAgLyogU3BlY2lhbCBzY2FjaGUgZW50cnkgZm9yIChyZSlzdGFydGluZyBiYiBleHRyYWN0aW9uLiAgKi8KKyAgU0NBQ0hFICpwYmJfYmVnaW47CisjZGVmaW5lIENQVV9TQ0FDSEVfUEJCX0JFR0lOKGNwdSkgKChjcHUpIC0+IGNnZW5fY3B1LnNjYWNoZS5wYmJfYmVnaW4pCisgIC8qIEhhc2ggdGFibGUgaW50byBjYWNoZWQgY2hhaW5zLiAgKi8KKyAgU0NBQ0hFX01BUCAqaGFzaF90YWJsZTsKKyNkZWZpbmUgQ1BVX1NDQUNIRV9IQVNIX1RBQkxFKGNwdSkgKChjcHUpIC0+IGNnZW5fY3B1LnNjYWNoZS5oYXNoX3RhYmxlKQorICAvKiBOZXh0IGZyZWUgZW50cnkgaW4gY2FjaGUuICAqLworICBTQ0FDSEUgKm5leHRfZnJlZTsKKyNkZWZpbmUgQ1BVX1NDQUNIRV9ORVhUX0ZSRUUoY3B1KSAoKGNwdSkgLT4gY2dlbl9jcHUuc2NhY2hlLm5leHRfZnJlZSkKKworICAvKiBBZGRyZXNzIG9mIGN0aS1jaGFpbiBpbnNuLCBvbmx5IHVzZWQgYnkgZnVuY3Rpb25hbCBzZW1hbnRpY3MsCisgICAgIG5vdCBzd2l0Y2ggZm9ybS4gICovCisgIFNDQUNIRSAqKnBiYl9icl9ucGNfcHRyOworI2RlZmluZSBDUFVfUEJCX0JSX05QQ19QVFIoY3B1KSAoKGNwdSkgLT4gY2dlbl9jcHUuc2NhY2hlLnBiYl9icl9ucGNfcHRyKQorICAvKiBUYXJnZXQncyBicmFuY2ggYWRkcmVzcy4gICovCisgIElBRERSIHBiYl9icl9ucGM7CisjZGVmaW5lIENQVV9QQkJfQlJfTlBDKGNwdSkgKChjcHUpIC0+IGNnZW5fY3B1LnNjYWNoZS5wYmJfYnJfbnBjKQorI2VuZGlmIC8qIFdJVEhfU0NBQ0hFX1BCQiAqLworCisjaWYgV0lUSF9QUk9GSUxFX1NDQUNIRV9QCisgIC8qIENhY2hlIGhpdHMsIG1pc3Nlcy4gICovCisgIHVuc2lnbmVkIGxvbmcgaGl0cywgbWlzc2VzOworI2RlZmluZSBDUFVfU0NBQ0hFX0hJVFMoY3B1KSAoKGNwdSkgLT4gY2dlbl9jcHUuc2NhY2hlLmhpdHMpCisjZGVmaW5lIENQVV9TQ0FDSEVfTUlTU0VTKGNwdSkgKChjcHUpIC0+IGNnZW5fY3B1LnNjYWNoZS5taXNzZXMpCisKKyNpZiBXSVRIX1NDQUNIRV9QQkIKKyAgLyogQ2hhaW4gbGVuZ3RoIGNvdW50cy4KKyAgICAgRWFjaCBlbGVtZW50IGlzIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBjaGFpbnMgY3JlYXRlZCB3aXRoIHRoYXQKKyAgICAgbGVuZ3RoLiAgKi8KKyAgdW5zaWduZWQgbG9uZyAqY2hhaW5fbGVuZ3RoczsKKyNkZWZpbmUgQ1BVX1NDQUNIRV9DSEFJTl9MRU5HVEhTKGNwdSkgKChjcHUpIC0+IGNnZW5fY3B1LnNjYWNoZS5jaGFpbl9sZW5ndGhzKQorICAvKiBOdW1iZXIgb2YgdGltZXMgY2FjaGUgd2FzIGZsdXNoZWQgZHVlIHRvIGl0cyBiZWluZyBmdWxsLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBmdWxsX2ZsdXNoZXM7CisjZGVmaW5lIENQVV9TQ0FDSEVfRlVMTF9GTFVTSEVTKGNwdSkgKChjcHUpIC0+IGNnZW5fY3B1LnNjYWNoZS5mdWxsX2ZsdXNoZXMpCisjZW5kaWYKKyNlbmRpZgorfSBDUFVfU0NBQ0hFOworCisvKiBIYXNoIGEgUEMgdmFsdWUuCisgICBUaGlzIGlzIHNwbGl0IGludG8gdHdvIHBhcnRzIHRvIGhlbHAgd2l0aCBtb3ZpbmcgYXMgbXVjaCBvZiB0aGUKKyAgIGNvbXB1dGF0aW9uIG91dCBvZiB0aGUgbWFpbiBsb29wLiAgKi8KKyNkZWZpbmUgQ1BVX1NDQUNIRV9IQVNIX01BU0soY3B1KSAoQ1BVX1NDQUNIRV9TSVpFIChjcHUpIC0gMSkKKyNkZWZpbmUgU0NBQ0hFX0hBU0hfUEMocGMsIG1hc2spIFwKKygoQ0dFTl9NSU5fSU5TTl9TSVpFID09IDIgPyAoKHBjKSA+PiAxKSBcCisgIDogQ0dFTl9NSU5fSU5TTl9TSVpFID09IDQgPyAoKHBjKSA+PiAyKSBcCisgIDogKHBjKSkgXAorICYgKG1hc2spKQorCisvKiBOb24temVybyBpZiBjYWNoZSBpcyBpbiB1c2UuICAqLworI2RlZmluZSBVU0lOR19TQ0FDSEVfUChzZCkgKFNUQVRFX1NDQUNIRV9TSVpFIChzZCkgPiAwKQorCisvKiBJbnN0YWxsIHRoZSBzaW11bGF0b3IgY2FjaGUgaW50byB0aGUgc2ltdWxhdG9yLiAgKi8KK01PRFVMRV9JTlNUQUxMX0ZOIHNjYWNoZV9pbnN0YWxsOworCisvKiBMb29rdXAgYSBQQyB2YWx1ZSBpbiB0aGUgc2NhY2hlIFtjb21waWxhdGlvbiBvbmx5XS4gICovCitleHRlcm4gU0NBQ0hFICogc2NhY2hlX2xvb2t1cCAoU0lNX0NQVSAqLCBJQUREUik7CisvKiBSZXR1cm4gYSBwb2ludGVyIHRvIGF0IGxlYXN0IE4gYnVmZmVycy4gICovCitleHRlcm4gU0NBQ0hFICpzY2FjaGVfbG9va3VwX29yX2FsbG9jIChTSU1fQ1BVICosIElBRERSLCBpbnQsIFNDQUNIRSAqKik7CisvKiBGbHVzaCBhbGwgY3B1J3Mgc2NhY2hlcy4gICovCitleHRlcm4gdm9pZCBzY2FjaGVfZmx1c2ggKFNJTV9ERVNDKTsKKy8qIEZsdXNoIGEgY3B1J3Mgc2NhY2hlLiAgKi8KK2V4dGVybiB2b2lkIHNjYWNoZV9mbHVzaF9jcHUgKFNJTV9DUFUgKik7CisMCisvKiBTY2FjaGUgcHJvZmlsaW5nIHN1cHBvcnQuICAqLworCisvKiBQcmludCBzdW1tYXJ5IHNjYWNoZSB1c2FnZSBpbmZvcm1hdGlvbi4gICovCitleHRlcm4gdm9pZCBzY2FjaGVfcHJpbnRfcHJvZmlsZSAoU0lNX0NQVSAqY3B1LCBpbnQgdmVyYm9zZSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfU0NBQ0hFX1AKKworI2RlZmluZSBQUk9GSUxFX0NPVU5UX1NDQUNIRV9ISVQoY3B1KSBcCitkbyB7IFwKKyAgaWYgKENQVV9QUk9GSUxFX0ZMQUdTIChjcHUpIFtQUk9GSUxFX1NDQUNIRV9JRFhdKSBcCisgICAgKysgQ1BVX1NDQUNIRV9ISVRTIChjcHUpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBQUk9GSUxFX0NPVU5UX1NDQUNIRV9NSVNTKGNwdSkgXAorZG8geyBcCisgIGlmIChDUFVfUFJPRklMRV9GTEFHUyAoY3B1KSBbUFJPRklMRV9TQ0FDSEVfSURYXSkgXAorICAgICsrIENQVV9TQ0FDSEVfTUlTU0VTIChjcHUpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBQUk9GSUxFX0NPVU5UX1NDQUNIRV9DSEFJTl9MRU5HVEgoY3B1LGxlbmd0aCkgXAorZG8geyBcCisgIGlmIChDUFVfUFJPRklMRV9GTEFHUyAoY3B1KSBbUFJPRklMRV9TQ0FDSEVfSURYXSkgXAorICAgICsrIENQVV9TQ0FDSEVfQ0hBSU5fTEVOR1RIUyAoY3B1KSBbbGVuZ3RoXTsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgUFJPRklMRV9DT1VOVF9TQ0FDSEVfRlVMTF9GTFVTSChjcHUpIFwKK2RvIHsgXAorICBpZiAoQ1BVX1BST0ZJTEVfRkxBR1MgKGNwdSkgW1BST0ZJTEVfU0NBQ0hFX0lEWF0pIFwKKyAgICArKyBDUFVfU0NBQ0hFX0ZVTExfRkxVU0hFUyAoY3B1KTsgXAorfSB3aGlsZSAoMCkKKworI2Vsc2UKKworI2RlZmluZSBQUk9GSUxFX0NPVU5UX1NDQUNIRV9ISVQoY3B1KQorI2RlZmluZSBQUk9GSUxFX0NPVU5UX1NDQUNIRV9NSVNTKGNwdSkKKyNkZWZpbmUgUFJPRklMRV9DT1VOVF9TQ0FDSEVfQ0hBSU5fTEVOR1RIKGNwdSxsZW5ndGgpCisjZGVmaW5lIFBST0ZJTEVfQ09VTlRfU0NBQ0hFX0ZVTExfRkxVU0goY3B1KQorCisjZW5kaWYKKworI2VuZGlmIC8qIENHRU5fU0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vY2dlbi1zaW0uaCBiL3NpbS9jb21tb24vY2dlbi1zaW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDgwMTVmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9jZ2VuLXNpbS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIE1haW4gaGVhZGVyIGZpbGUgZm9yIENwdSB0b29scyBHRU5lcmF0ZWQgc2ltdWxhdG9ycy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBtdXN0IGJlIGluY2x1ZGVkIGFmdGVyIHNpbS1iYXNlLmguICAqLworCisjaWZuZGVmIENHRU5fU0lNX0gKKyNkZWZpbmUgQ0dFTl9TSU1fSAorCisjaW5jbHVkZSAiY2dlbi1kZWZzLmgiCisjaW5jbHVkZSAiY2dlbi1zY2FjaGUuaCIKKyNpbmNsdWRlICJjZ2VuLWNwdS5oIgorI2luY2x1ZGUgImNnZW4tdHJhY2UuaCIKKworLyogVGhpcyBpcyBhIG1hY2hpbmUgZ2VuZXJhdGVkIGZpbGUuICAqLworI2luY2x1ZGUgImNwdWFsbC5oIgorCisjZW5kaWYgLyogQ0dFTl9TSU1fSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9jZ2VuLXRyYWNlLmMgYi9zaW0vY29tbW9uL2NnZW4tdHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdkMWZhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9jZ2VuLXRyYWNlLmMKQEAgLTAsMCArMSw0MTQgQEAKKy8qIFRyYWNpbmcgc3VwcG9ydCBmb3IgQ0dFTi1iYXNlZCBzaW11bGF0b3JzLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAiZGlzLWFzbS5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInNpbS1tYWluLmgiCisKKyN1bmRlZiBtaW4KKyNkZWZpbmUgbWluKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKKworI2lmbmRlZiBTSVpFX0lOU1RSVUNUSU9OCisjZGVmaW5lIFNJWkVfSU5TVFJVQ1RJT04gMTYKKyNlbmRpZgorCisjaWZuZGVmIFNJWkVfTE9DQVRJT04KKyNkZWZpbmUgU0laRV9MT0NBVElPTiAyMAorI2VuZGlmCisKKyNpZm5kZWYgU0laRV9QQworI2RlZmluZSBTSVpFX1BDIDYKKyNlbmRpZgorCisjaWZuZGVmIFNJWkVfTElORV9OVU1CRVIKKyNkZWZpbmUgU0laRV9MSU5FX05VTUJFUiA0CisjZW5kaWYKKworI2lmbmRlZiBTSVpFX0NZQ0xFX0NPVU5UCisjZGVmaW5lIFNJWkVfQ1lDTEVfQ09VTlQgMgorI2VuZGlmCisKKyNpZm5kZWYgU0laRV9UT1RBTF9DWUNMRV9DT1VOVAorI2RlZmluZSBTSVpFX1RPVEFMX0NZQ0xFX0NPVU5UIDkKKyNlbmRpZgorCisjaWZuZGVmIFNJWkVfVFJBQ0VfQlVGCisjZGVmaW5lIFNJWkVfVFJBQ0VfQlVGIDI1NgorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitkaXNhc3NlbWJsZV9pbnNuIChTSU1fQ1BVICosIGNvbnN0IENHRU5fSU5TTiAqLAorCQkgIGNvbnN0IHN0cnVjdCBhcmdidWYgKiwgSUFERFIsIGNoYXIgKik7CisKKy8qIFRleHQgaXMgcXVldWVkIGluIFRSQUNFX0JVRiBiZWNhdXNlIHdlIHdhbnQgdG8gb3V0cHV0IHRoZSBpbnNuJ3MgY3ljbGUKKyAgIGNvdW50IGZpcnN0IGJ1dCB0aGF0IGlzbid0IGtub3duIHVudGlsIGFmdGVyIHRoZSBpbnNuIGhhcyBleGVjdXRlZC4KKyAgIFRoaXMgYWxzbyBoYW5kbGVzIHRoZSBxdWV1ZWluZyBvZiB0cmFjZSByZXN1bHRzLCBUUkFDRV9SRVNVTFQgbWF5IGJlCisgICBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIG9uZSBpbnNuLiAgKi8KK3N0YXRpYyBjaGFyIHRyYWNlX2J1ZltTSVpFX1RSQUNFX0JVRl07CisvKiBJZiBOVUxMLCBvdXRwdXQgdG8gc3Rkb3V0IGRpcmVjdGx5LiAgKi8KK3N0YXRpYyBjaGFyICpidWZwdHI7CisKKy8qIE5vbi16ZXJvIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGluc24gaW4gYSBzZXQgb2YgcGFyYWxsZWwgaW5zbnMuICAqLworc3RhdGljIGludCBmaXJzdF9pbnNuX3A7CisKKy8qIEZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gdHJhY2VfaW5zbiBhbmQgdHJhY2VfcmVzdWx0LiAgKi8KK3N0YXRpYyBpbnQgcHJpbnRlZF9yZXN1bHRfcDsKKworLyogSW5zbiBhbmQgaXRzIGV4dHJhY3RlZCBmaWVsZHMuCisgICBTZXQgYnkgdHJhY2VfaW5zbiwgdXNlZCBieSB0cmFjZV9pbnNuX2ZpbmkuCisgICA/Pz8gTW92ZSB0byBTSU1fQ1BVIHRvIHN1cHBvcnQgaGV0ZXJvZ2VuZW91cyBtdWx0aS1jcHUgY2FzZS4gICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNnZW5faW5zbiAqY3VycmVudF9pbnNuOworc3RhdGljIGNvbnN0IHN0cnVjdCBhcmdidWYgKmN1cnJlbnRfYWJ1ZjsKKwordm9pZAordHJhY2VfaW5zbl9pbml0IChTSU1fQ1BVICpjcHUsIGludCBmaXJzdF9wKQoreworICBidWZwdHIgPSB0cmFjZV9idWY7CisgICpidWZwdHIgPSAwOworICBmaXJzdF9pbnNuX3AgPSBmaXJzdF9wOworCisgIC8qIFNldCB0byBOVUxMIHNvIHRyYWNlX2luc25fZmluaSBjYW4ga25vdyBpZiB0cmFjZV9pbnNuIHdhcyBjYWxsZWQuICAqLworICBjdXJyZW50X2luc24gPSBOVUxMOworICBjdXJyZW50X2FidWYgPSBOVUxMOworfQorCit2b2lkCit0cmFjZV9pbnNuX2ZpbmkgKFNJTV9DUFUgKmNwdSwgY29uc3Qgc3RydWN0IGFyZ2J1ZiAqYWJ1ZiwgaW50IGxhc3RfcCkKK3sKKyAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7CisKKyAgLyogV2FzIGluc24gdHJhY2VkPyAgSXQgbWlnaHQgbm90IGJlIGlmIHRyYWNlIHJhbmdlcyBhcmUgaW4gZWZmZWN0LiAgKi8KKyAgaWYgKGN1cnJlbnRfaW5zbiA9PSBOVUxMKQorICAgIHJldHVybjsKKworICAvKiBUaGUgZmlyc3QgdGhpbmcgcHJpbnRlZCBpcyBjdXJyZW50IGFuZCB0b3RhbCBjeWNsZSBjb3VudHMuICAqLworCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGNwdSkKKyAgICAgICYmIEFSR0JVRl9QUk9GSUxFX1AgKGN1cnJlbnRfYWJ1ZikpCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyB0b3RhbCA9IFBST0ZJTEVfTU9ERUxfVE9UQUxfQ1lDTEVTIChDUFVfUFJPRklMRV9EQVRBIChjcHUpKTsKKyAgICAgIHVuc2lnbmVkIGxvbmcgdGhpc19pbnNuID0gUFJPRklMRV9NT0RFTF9DVVJfSU5TTl9DWUNMRVMgKENQVV9QUk9GSUxFX0RBVEEgKGNwdSkpOworCisgICAgICBpZiAobGFzdF9wKQorCXsKKwkgIHRyYWNlX3ByaW50ZiAoc2QsIGNwdSwgIiUtKmxkICUtKmxkICIsCisJCQlTSVpFX0NZQ0xFX0NPVU5ULCB0aGlzX2luc24sCisJCQlTSVpFX1RPVEFMX0NZQ0xFX0NPVU5ULCB0b3RhbCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHRyYWNlX3ByaW50ZiAoc2QsIGNwdSwgIiUtKmxkICUtKnMgIiwKKwkJCVNJWkVfQ1lDTEVfQ09VTlQsIHRoaXNfaW5zbiwKKwkJCVNJWkVfVE9UQUxfQ1lDTEVfQ09VTlQsICItLS0iKTsKKwl9CisgICAgfQorCisgIC8qIFByaW50IHRoZSBkaXNhc3NlbWJsZWQgaW5zbi4gICovCisKKyAgdHJhY2VfcHJpbnRmIChzZCwgY3B1LCAiJXMiLCBUUkFDRV9QUkVGSVggKENQVV9UUkFDRV9EQVRBIChjcHUpKSk7CisKKyNpZiAwCisgIC8qIFByaW50IGluc24gcmVzdWx0cy4gICovCisgIHsKKyAgICBjb25zdCBDR0VOX09QSU5TVCAqb3BpbnN0ID0gQ0dFTl9JTlNOX09QRVJBTkRTIChjdXJyZW50X2luc24pOworCisgICAgaWYgKG9waW5zdCkKKyAgICAgIHsKKwlpbnQgaTsKKwlpbnQgaW5kaWNlc1tNQVhfT1BFUkFORF9JTlNUQU5DRVNdOworCisJLyogRmV0Y2ggdGhlIG9wZXJhbmRzIHVzZWQgYnkgdGhlIGluc24uICAqLworCS8qIEZJWE1FOiBBZGQgZm4gcHRyIHRvIENHRU5fQ1BVX0RFU0MuICAqLworCUNHRU5fU1lNIChnZXRfaW5zbl9vcGVyYW5kcykgKENQVV9DUFVfREVTQyAoY3B1KSwgY3VycmVudF9pbnNuLAorCQkJCSAgICAgIDAsIENHRU5fRklFTERTX0JJVFNJWkUgKCZpbnNuX2ZpZWxkcyksCisJCQkJICAgICAgaW5kaWNlcyk7CisKKwlmb3IgKGkgPSAwOworCSAgICAgQ0dFTl9PUElOU1RfVFlQRSAob3BpbnN0KSAhPSBDR0VOX09QSU5TVF9FTkQ7CisJICAgICArK2ksICsrb3BpbnN0KQorCSAgeworCSAgICBpZiAoQ0dFTl9PUElOU1RfVFlQRSAob3BpbnN0KSA9PSBDR0VOX09QSU5TVF9PVVRQVVQpCisJICAgICAgdHJhY2VfcmVzdWx0IChjcHUsIGN1cnJlbnRfaW5zbiwgb3BpbnN0LCBpbmRpY2VzW2ldKTsKKwkgIH0KKyAgICAgIH0KKyAgfQorI2VuZGlmCisKKyAgLyogUHJpbnQgYW55dGhpbmcgZWxzZSByZXF1ZXN0ZWQuICAqLworCisgIGlmICgqdHJhY2VfYnVmKQorICAgIHRyYWNlX3ByaW50ZiAoc2QsIGNwdSwgIiAlc1xuIiwgdHJhY2VfYnVmKTsKKyAgZWxzZQorICAgIHRyYWNlX3ByaW50ZiAoc2QsIGNwdSwgIlxuIik7Cit9CisKK3ZvaWQKK3RyYWNlX2luc24gKFNJTV9DUFUgKmNwdSwgY29uc3Qgc3RydWN0IGNnZW5faW5zbiAqb3Bjb2RlLAorCSAgICBjb25zdCBzdHJ1Y3QgYXJnYnVmICphYnVmLCBJQUREUiBwYykKK3sKKyAgY2hhciBkaXNhc21fYnVmWzUwXTsKKworICBwcmludGVkX3Jlc3VsdF9wID0gMDsKKyAgY3VycmVudF9pbnNuID0gb3Bjb2RlOworICBjdXJyZW50X2FidWYgPSBhYnVmOworCisgIGlmIChDR0VOX0lOU05fVklSVFVBTF9QIChvcGNvZGUpKQorICAgIHsKKyAgICAgIHRyYWNlX3ByZWZpeCAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsIE5VTExfQ0lBLCBwYywgMCwKKwkJICAgIE5VTEwsIDAsIENHRU5fSU5TTl9OQU1FIChvcGNvZGUpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgQ1BVX0RJU0FTU0VNQkxFUiAoY3B1KSAoY3B1LCBvcGNvZGUsIGFidWYsIHBjLCBkaXNhc21fYnVmKTsKKyAgdHJhY2VfcHJlZml4IChDUFVfU1RBVEUgKGNwdSksIGNwdSwgTlVMTF9DSUEsIHBjLCBUUkFDRV9MSU5FTlVNX1AgKGNwdSksCisJCU5VTEwsIDAsCisJCSIlcyUtKnMiLAorCQlmaXJzdF9pbnNuX3AgPyAiICIgOiAifCIsCisJCVNJWkVfSU5TVFJVQ1RJT04sIGRpc2FzbV9idWYpOworfQorCit2b2lkCit0cmFjZV9leHRyYWN0IChTSU1fQ1BVICpjcHUsIElBRERSIHBjLCBjaGFyICpuYW1lLCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHByaW50ZWRfb25lX3AgPSAwOworICBjaGFyICpmbXQ7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIG5hbWUpOworCisgIHRyYWNlX3ByaW50ZiAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsICJFeHRyYWN0OiAweCUuKmx4OiAlcyAiLAorCQlTSVpFX1BDLCBwYywgbmFtZSk7CisKKyAgZG8geworICAgIGludCB0eXBlLGl2YWw7CisKKyAgICBmbXQgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7CisKKyAgICBpZiAoZm10KQorICAgICAgeworCWlmIChwcmludGVkX29uZV9wKQorCSAgdHJhY2VfcHJpbnRmIChDUFVfU1RBVEUgKGNwdSksIGNwdSwgIiwgIik7CisJcHJpbnRlZF9vbmVfcCA9IDE7CisJdHlwZSA9IHZhX2FyZyAoYXJncywgaW50KTsKKwlzd2l0Y2ggKHR5cGUpCisJICB7CisJICBjYXNlICd4JyA6CisJICAgIGl2YWwgPSB2YV9hcmcgKGFyZ3MsIGludCk7CisJICAgIHRyYWNlX3ByaW50ZiAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsIGZtdCwgaXZhbCk7CisJICAgIGJyZWFrOworCSAgZGVmYXVsdCA6CisJICAgIGFib3J0ICgpOworCSAgfQorICAgICAgfQorICB9IHdoaWxlIChmbXQpOworCisgIHZhX2VuZCAoYXJncyk7CisgIHRyYWNlX3ByaW50ZiAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsICJcbiIpOworfQorCit2b2lkCit0cmFjZV9yZXN1bHQgKFNJTV9DUFUgKmNwdSwgY2hhciAqbmFtZSwgaW50IHR5cGUsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworCisgIHZhX3N0YXJ0IChhcmdzLCB0eXBlKTsKKyAgaWYgKHByaW50ZWRfcmVzdWx0X3ApCisgICAgY2dlbl90cmFjZV9wcmludGYgKGNwdSwgIiwgIik7CisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlICd4JyA6CisgICAgZGVmYXVsdCA6CisgICAgICBjZ2VuX3RyYWNlX3ByaW50ZiAoY3B1LCAiJXMgPC0gMHgleCIsIG5hbWUsIHZhX2FyZyAoYXJncywgaW50KSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdEJyA6CisgICAgICB7CisJREkgZGk7CisJLyogdGhpcyBpcyBzZXBhcmF0ZWQgZnJvbSBwcmV2aW91cyBsaW5lIGZvciBzdW5vcyBjYyAqLworCWRpID0gdmFfYXJnIChhcmdzLCBESSk7CisJY2dlbl90cmFjZV9wcmludGYgKGNwdSwgIiVzIDwtIDB4JXglMDh4IiwgbmFtZSwKKwkJCSAgIEdFVEhJREkoZGkpLCBHRVRMT0RJIChkaSkpOworCWJyZWFrOworICAgICAgfQorICAgIH0KKworICBwcmludGVkX3Jlc3VsdF9wID0gMTsKKyAgdmFfZW5kIChhcmdzKTsKK30KKworLyogUHJpbnQgdHJhY2Ugb3V0cHV0IHRvIEJVRlBUUiBpZiBhY3RpdmUsIG90aGVyd2lzZSBwcmludCBub3JtYWxseS4KKyAgIFRoaXMgaXMgb25seSBmb3IgdHJhY2luZyBzZW1hbnRpYyBjb2RlLiAgKi8KKwordm9pZAorY2dlbl90cmFjZV9wcmludGYgKFNJTV9DUFUgKmNwdSwgY2hhciAqZm10LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKworICB2YV9zdGFydCAoYXJncywgZm10KTsKKworICBpZiAoYnVmcHRyID09IE5VTEwpCisgICAgeworICAgICAgaWYgKFRSQUNFX0ZJTEUgKENQVV9UUkFDRV9EQVRBIChjcHUpKSA9PSBOVUxMKQorCSgqIFNUQVRFX0NBTExCQUNLIChDUFVfU1RBVEUgKGNwdSkpLT5ldnByaW50Zl9maWx0ZXJlZCkKKwkgIChTVEFURV9DQUxMQkFDSyAoQ1BVX1NUQVRFIChjcHUpKSwgZm10LCBhcmdzKTsKKyAgICAgIGVsc2UKKwl2ZnByaW50ZiAoVFJBQ0VfRklMRSAoQ1BVX1RSQUNFX0RBVEEgKGNwdSkpLCBmbXQsIGFyZ3MpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHZzcHJpbnRmIChidWZwdHIsIGZtdCwgYXJncyk7CisgICAgICBidWZwdHIgKz0gc3RybGVuIChidWZwdHIpOworICAgICAgLyogPz8/IE5lZWQgdmVyc2lvbiBvZiBTSU1fQVNTRVJUIHRoYXQgaXMgYWx3YXlzIGVuYWJsZWQuICAqLworICAgICAgaWYgKGJ1ZnB0ciAtIHRyYWNlX2J1ZiA+IFNJWkVfVFJBQ0VfQlVGKQorCWFib3J0ICgpOworICAgIH0KKworICB2YV9lbmQgKGFyZ3MpOworfQorDAorLyogRGlzYXNzZW1ibHkgc3VwcG9ydC4gICovCisKKy8qIHNwcmludGYgdG8gYSAic3RyZWFtIiAqLworCitpbnQKK3NpbV9kaXNhc21fc3ByaW50ZiBWUEFSQU1TICgoU0ZJTEUgKmYsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSkKK3sKKyNpZm5kZWYgX19TVERDX18KKyAgU0ZJTEUgKmY7CisgIGNvbnN0IGNoYXIgKmZvcm1hdDsKKyNlbmRpZgorICBpbnQgbjsKKyAgdmFfbGlzdCBhcmdzOworCisgIFZBX1NUQVJUIChhcmdzLCBmb3JtYXQpOworI2lmbmRlZiBfX1NURENfXworICBmID0gdmFfYXJnIChhcmdzLCBTRklMRSAqKTsKKyAgZm9ybWF0ID0gdmFfYXJnIChhcmdzLCBjaGFyICopOworI2VuZGlmCisgIHZzcHJpbnRmIChmLT5jdXJyZW50LCBmb3JtYXQsIGFyZ3MpOworICBmLT5jdXJyZW50ICs9IG4gPSBzdHJsZW4gKGYtPmN1cnJlbnQpOworICB2YV9lbmQgKGFyZ3MpOworICByZXR1cm4gbjsKK30KKworLyogTWVtb3J5IHJlYWQgc3VwcG9ydCBmb3IgYW4gb3Bjb2RlcyBkaXNhc3NlbWJsZXIuICAqLworCitpbnQKK3NpbV9kaXNhc21fcmVhZF9tZW1vcnkgKGJmZF92bWEgbWVtYWRkciwgYmZkX2J5dGUgKm15YWRkciwgaW50IGxlbmd0aCwKKwkJCXN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKQoreworICBTSU1fQ1BVICpjcHUgPSAoU0lNX0NQVSAqKSBpbmZvLT5hcHBsaWNhdGlvbl9kYXRhOworICBTSU1fREVTQyBzZCA9IENQVV9TVEFURSAoY3B1KTsKKyAgaW50IGxlbmd0aF9yZWFkOworCisgIGxlbmd0aF9yZWFkID0gc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLCBjcHUsIHJlYWRfbWFwLCBteWFkZHIsIG1lbWFkZHIsCisJCQkJICAgICAgbGVuZ3RoKTsKKyAgaWYgKGxlbmd0aF9yZWFkICE9IGxlbmd0aCkKKyAgICByZXR1cm4gRUlPOworICByZXR1cm4gMDsKK30KKworLyogTWVtb3J5IGVycm9yIHN1cHBvcnQgZm9yIGFuIG9wY29kZXMgZGlzYXNzZW1ibGVyLiAgKi8KKwordm9pZAorc2ltX2Rpc2FzbV9wZXJyb3JfbWVtb3J5IChpbnQgc3RhdHVzLCBiZmRfdm1hIG1lbWFkZHIsCisJCQkgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKQoreworICBpZiAoc3RhdHVzICE9IEVJTykKKyAgICAvKiBDYW4ndCBoYXBwZW4uICAqLworICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiVW5rbm93biBlcnJvciAlZC4iLCBzdGF0dXMpOworICBlbHNlCisgICAgLyogQWN0dWFsbHksIGFkZHJlc3MgYmV0d2VlbiBtZW1hZGRyIGFuZCBtZW1hZGRyICsgbGVuIHdhcworICAgICAgIG91dCBvZiBib3VuZHMuICAqLworICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLAorCQkJIkFkZHJlc3MgMHgleCBpcyBvdXQgb2YgYm91bmRzLiIsCisJCQkoaW50KSBtZW1hZGRyKTsKK30KKworLyogRGlzYXNzZW1ibGUgdXNpbmcgdGhlIENHRU4gb3Bjb2RlIHRhYmxlLgorICAgPz8/IFdoaWxlIGV4ZWN1dGluZyBhbiBpbnN0cnVjdGlvbiwgdGhlIGluc24gaGFzIGJlZW4gZGVjb2RlZCBhbmQgYWxsIGl0cworICAgZmllbGRzIGhhdmUgYmVlbiBleHRyYWN0ZWQuICBJdCBpcyBjZXJ0YWlubHkgcG9zc2libGUgdG8gZG8gdGhlIGRpc2Fzc2VtYmx5CisgICB3aXRoIHRoYXQgZGF0YS4gIFRoaXMgc2VlbXMgc2ltcGxlciwgYnV0IG1heWJlIGluIHRoZSBmdXR1cmUgdGhlIGFscmVhZHkKKyAgIGV4dHJhY3RlZCBmaWVsZHMgd2lsbCBiZSB1c2VkLiAgKi8KKwordm9pZAorc2ltX2NnZW5fZGlzYXNzZW1ibGVfaW5zbiAoU0lNX0NQVSAqY3B1LCBjb25zdCBDR0VOX0lOU04gKmluc24sCisJCQkgICBjb25zdCBBUkdCVUYgKmFidWYsIElBRERSIHBjLCBjaGFyICpidWYpCit7CisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisgIHVuc2lnbmVkIGxvbmcgaW5zbl92YWx1ZTsKKyAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gZGlzYXNtX2luZm87CisgIFNGSUxFIHNmaWxlOworICB1bmlvbiB7CisgICAgdW5zaWduZWQ4IGJ5dGVzW0NHRU5fTUFYX0lOU05fU0laRV07CisgICAgdW5zaWduZWQxNiBzaG9ydHNbOF07CisgICAgdW5zaWduZWQzMiB3b3Jkc1s0XTsKKyAgfSBpbnNuX2J1ZjsKKyAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7CisgIENHRU5fQ1BVX0RFU0MgY2QgPSBDUFVfQ1BVX0RFU0MgKGNwdSk7CisgIENHRU5fRVhUUkFDVF9JTkZPIGV4X2luZm87CisgIENHRU5fRklFTERTICpmaWVsZHMgPSBhbGxvY2EgKENHRU5fQ1BVX1NJWkVPRl9GSUVMRFMgKGNkKSk7CisgIGludCBpbnNuX2JpdF9sZW5ndGggPSBDR0VOX0lOU05fQklUU0laRSAoaW5zbik7CisgIGludCBpbnNuX2xlbmd0aCA9IGluc25fYml0X2xlbmd0aCAvIDg7CisKKyAgc2ZpbGUuYnVmZmVyID0gc2ZpbGUuY3VycmVudCA9IGJ1ZjsKKyAgSU5JVF9ESVNBU1NFTUJMRV9JTkZPIChkaXNhc21faW5mbywgKEZJTEUgKikgJnNmaWxlLAorCQkJIChmcHJpbnRmX2Z0eXBlKSBzaW1fZGlzYXNtX3NwcmludGYpOworICBkaXNhc21faW5mby5lbmRpYW4gPQorICAgIChiZmRfYmlnX2VuZGlhbiAoU1RBVEVfUFJPR19CRkQgKHNkKSkgPyBCRkRfRU5ESUFOX0JJRworICAgICA6IGJmZF9saXR0bGVfZW5kaWFuIChTVEFURV9QUk9HX0JGRCAoc2QpKSA/IEJGRF9FTkRJQU5fTElUVExFCisgICAgIDogQkZEX0VORElBTl9VTktOT1dOKTsKKworICBsZW5ndGggPSBzaW1fY29yZV9yZWFkX2J1ZmZlciAoc2QsIGNwdSwgcmVhZF9tYXAsICZpbnNuX2J1ZiwgcGMsCisJCQkJIGluc25fbGVuZ3RoKTsKKworICBzd2l0Y2ggKG1pbiAoQ0dFTl9CQVNFX0lOU05fU0laRSwgaW5zbl9sZW5ndGgpKQorICAgIHsKKyAgICBjYXNlIDAgOiByZXR1cm47IC8qIGZha2UgaW5zbiwgdHlwaWNhbGx5ICJjb21waWxlIiAoYWthICJpbnZhbGlkIikgKi8KKyAgICBjYXNlIDEgOiBpbnNuX3ZhbHVlID0gaW5zbl9idWYuYnl0ZXNbMF07IGJyZWFrOworICAgIGNhc2UgMiA6IGluc25fdmFsdWUgPSBUMkhfMiAoaW5zbl9idWYuc2hvcnRzWzBdKTsgYnJlYWs7CisgICAgY2FzZSA0IDogaW5zbl92YWx1ZSA9IFQySF80IChpbnNuX2J1Zi53b3Jkc1swXSk7IGJyZWFrOworICAgIGRlZmF1bHQ6IGFib3J0ICgpOworICAgIH0KKworICBkaXNhc21faW5mby5idWZmZXJfdm1hID0gcGM7CisgIGRpc2FzbV9pbmZvLmJ1ZmZlciA9IGluc25fYnVmLmJ5dGVzOworICBkaXNhc21faW5mby5idWZmZXJfbGVuZ3RoID0gbGVuZ3RoOworCisgIGV4X2luZm8uZGlzX2luZm8gPSAoUFRSKSAmZGlzYXNtX2luZm87CisgIGV4X2luZm8udmFsaWQgPSAoMSA8PCBsZW5ndGgpIC0gMTsKKyAgZXhfaW5mby5pbnNuX2J5dGVzID0gaW5zbl9idWYuYnl0ZXM7CisKKyAgbGVuZ3RoID0gKCpDR0VOX0VYVFJBQ1RfRk4gKGNkLCBpbnNuKSkgKGNkLCBpbnNuLCAmZXhfaW5mbywgaW5zbl92YWx1ZSwgZmllbGRzLCBwYyk7CisgIC8qIFJlc3VsdCBvZiBleHRyYWN0IGZuIGlzIGluIGJpdHMuICAqLworICAvKiA/Pz8gVGhpcyBhc3N1bWVzIHRoYXQgZWFjaCBpbnN0cnVjdGlvbiBoYXMgYSBmaXhlZCBsZW5ndGggKGFuZCB0aHVzCisgICAgIGZvciBpbnNucyB3aXRoIG11bHRpcGxlIHZlcnNpb25zIG9mIHZhcmlhYmxlIGxlbmd0aHMgdGhleSB3b3VsZCBlYWNoCisgICAgIGhhdmUgdGhlaXIgb3duIHRhYmxlIGVudHJ5KS4gICovCisgIGlmIChsZW5ndGggPT0gaW5zbl9iaXRfbGVuZ3RoKQorICAgIHsKKyAgICAgICgqQ0dFTl9QUklOVF9GTiAoY2QsIGluc24pKSAoY2QsICZkaXNhc21faW5mbywgaW5zbiwgZmllbGRzLCBwYywgbGVuZ3RoKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBhYm9ydGluZyBpcyB0b28gZHJhc3RpYy4gICovCisgICAgICBzdHJjcHkgKGJ1ZiwgIioqKnVua25vd24qKioiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2NnZW4tdHJhY2UuaCBiL3NpbS9jb21tb24vY2dlbi10cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNzk2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL2NnZW4tdHJhY2UuaApAQCAtMCwwICsxLDkxIEBACisvKiBTaW11bGF0b3IgdHJhY2luZyBzdXBwb3J0IGZvciBDcHUgdG9vbHMgR0VOZXJhdGVkIHNpbXVsYXRvcnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIENHRU5fVFJBQ0VfSAorI2RlZmluZSBDR0VOX1RSQUNFX0gKKwordm9pZCB0cmFjZV9pbnNuX2luaXQgKFNJTV9DUFUgKiwgaW50KTsKK3ZvaWQgdHJhY2VfaW5zbl9maW5pIChTSU1fQ1BVICosIGNvbnN0IHN0cnVjdCBhcmdidWYgKiwgaW50KTsKK3ZvaWQgdHJhY2VfaW5zbiAoU0lNX0NQVSAqLCBjb25zdCBzdHJ1Y3QgY2dlbl9pbnNuICosCisJCSBjb25zdCBzdHJ1Y3QgYXJnYnVmICosIElBRERSKTsKK3ZvaWQgdHJhY2VfZXh0cmFjdCAoU0lNX0NQVSAqLCBJQUREUiwgY2hhciAqLCAuLi4pOwordm9pZCB0cmFjZV9yZXN1bHQgKFNJTV9DUFUgKiwgY2hhciAqLCBpbnQsIC4uLik7Cit2b2lkIGNnZW5fdHJhY2VfcHJpbnRmIChTSU1fQ1BVICosIGNoYXIgKmZtdCwgLi4uKTsKKworLyogVHJhY2UgaW5zdHJ1Y3Rpb24gcmVzdWx0cy4gICovCisjZGVmaW5lIFRSQUNFX1JFU1VMVF9QKGNwdSwgYWJ1ZikgKFRSQUNFX0lOU05fUCAoY3B1KSAmJiBBUkdCVUZfVFJBQ0VfUCAoYWJ1ZikpCisKKyNkZWZpbmUgVFJBQ0VfSU5TTl9JTklUKGNwdSwgYWJ1ZiwgZmlyc3RfcCkgXAorZG8geyBcCisgIGlmIChUUkFDRV9JTlNOX1AgKGNwdSkpIFwKKyAgICB0cmFjZV9pbnNuX2luaXQgKChjcHUpLCAoZmlyc3RfcCkpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBUUkFDRV9JTlNOX0ZJTkkoY3B1LCBhYnVmLCBsYXN0X3ApIFwKK2RvIHsgXAorICBpZiAoVFJBQ0VfSU5TTl9QIChjcHUpKSBcCisgICAgdHJhY2VfaW5zbl9maW5pICgoY3B1KSwgKGFidWYpLCAobGFzdF9wKSk7IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFRSQUNFX1BSSU5URihjcHUsIHdoYXQsIGFyZ3MpIFwKK2RvIHsgXAorICBpZiAoVFJBQ0VfUCAoKGNwdSksICh3aGF0KSkpIFwKKyAgICBjZ2VuX3RyYWNlX3ByaW50ZiBhcmdzIDsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgVFJBQ0VfSU5TTihjcHUsIGluc24sIGFidWYsIHBjKSBcCitkbyB7IFwKKyAgaWYgKFRSQUNFX0lOU05fUCAoY3B1KSAmJiBBUkdCVUZfVFJBQ0VfUCAoYWJ1ZikpIFwKKyAgICB0cmFjZV9pbnNuICgoY3B1KSwgKGluc24pLCAoYWJ1ZiksIChwYykpIDsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgVFJBQ0VfRVhUUkFDVChjcHUsIGFidWYsIGFyZ3MpIFwKK2RvIHsgXAorICBpZiAoVFJBQ0VfRVhUUkFDVF9QIChjcHUpKSBcCisgICAgdHJhY2VfZXh0cmFjdCBhcmdzIDsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgVFJBQ0VfUkVTVUxUKGNwdSwgYWJ1ZiwgbmFtZSwgdHlwZSwgdmFsKSBcCitkbyB7IFwKKyAgaWYgKFRSQUNFX1JFU1VMVF9QICgoY3B1KSwgKGFidWYpKSkgXAorICAgIHRyYWNlX3Jlc3VsdCAoKGNwdSksIChuYW1lKSwgKHR5cGUpLCAodmFsKSkgOyBcCit9IHdoaWxlICgwKQorDAorLyogRGlzYXNzZW1ibHkgc3VwcG9ydC4gICovCisKKy8qIEZ1bmN0aW9uIHRvIHVzZSBmb3IgY2dlbi1iYXNlZCBkaXNhc3NlbWJsZXJzLiAgKi8KK2V4dGVybiBDR0VOX0RJU0FTU0VNQkxFUiBzaW1fY2dlbl9kaXNhc3NlbWJsZV9pbnNuOworCisvKiBQc2V1ZG8gRklMRSBvYmplY3QgZm9yIHN0cmluZ3MuICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyICpidWZmZXI7CisgIGNoYXIgKmN1cnJlbnQ7Cit9IFNGSUxFOworCisvKiBTdHJpbmcgcHJpbnRlciBmb3IgdGhlIGRpc2Fzc2VtYmxlci4gICovCitleHRlcm4gaW50IHNpbV9kaXNhc21fc3ByaW50ZiAoU0ZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pOworCisvKiBGb3Igb3Bjb2RlcyBiYXNlZCBkaXNhc3NlbWJsZXJzLiAgKi8KKyNpZmRlZiBCRkRfVkVSU0lPTgorc3RydWN0IGRpc2Fzc2VtYmxlX2luZm87CitleHRlcm4gaW50CitzaW1fZGlzYXNtX3JlYWRfbWVtb3J5IChiZmRfdm1hIG1lbWFkZHJfLCBiZmRfYnl0ZSAqbXlhZGRyXywgaW50IGxlbmd0aF8sCisJCQlzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mb18pOworZXh0ZXJuIHZvaWQKK3NpbV9kaXNhc21fcGVycm9yX21lbW9yeSAoaW50IHN0YXR1c18sIGJmZF92bWEgbWVtYWRkcl8sCisJCQkgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvXyk7CisjZW5kaWYKKworI2VuZGlmIC8qIENHRU5fVFJBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9jZ2VuLXR5cGVzLmggYi9zaW0vY29tbW9uL2NnZW4tdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTdlNjAxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9jZ2VuLXR5cGVzLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qIFR5cGVzIGZvciBDcHUgdG9vbHMgR0VOZXJhdGVkIHNpbXVsYXRvcnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGZpbGUgaXMgbm90IGluY2x1ZGVkIHdpdGggY2dlbi1zaW0uaCBhcyBpdCBkZWZpbmVzIHR5cGVzCisgICBuZWVkZWQgYnkgc2ltLWJhc2UuaC4gICovCisKKyNpZm5kZWYgQ0dFTl9UWVBFU19ICisjZGVmaW5lIENHRU5fVFlQRVNfSAorCisvKiBNaXNjZWxsYW5lb3VzIGNnZW4gY29uZmlndXJ5IGRlZmluZWQgaGVyZSBhcyB0aGlzIGZpbGUgZ2V0cworICAgaW5jbHVkZWQgc29vbiBlbm91Z2guICAqLworCisvKiBJbmRpY2F0ZSB3ZSBzdXBwb3J0IC0tcHJvZmlsZS1tb2RlbC4gICovCisjdW5kZWYgU0lNX0hBVkVfTU9ERUwKKyNkZWZpbmUgU0lNX0hBVkVfTU9ERUwKKworLyogSW5kaWNhdGUgd2Ugc3VwcG9ydCAtLXtwcm9maWxlLHRyYWNlfS17cmFuZ2UsZnVuY3Rpb259LiAgKi8KKyN1bmRlZiBTSU1fSEFWRV9BRERSX1JBTkdFCisjZGVmaW5lIFNJTV9IQVZFX0FERFJfUkFOR0UKKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIEhBVkVfTE9OR0xPTkcKKyN1bmRlZiBESV9GTl9TVVBQT1JUCisjZWxzZQorI3VuZGVmIEhBVkVfTE9OR0xPTkcKKyNkZWZpbmUgRElfRk5fU1VQUE9SVAorI2VuZGlmCisMCisvKiBNb2RlIHN1cHBvcnQuICAqLworCisvKiBDb21tb24gbW9kZSB0eXBlcy4gICovCisvKiA/Pz8gVGFyZ2V0IHNwZWNpZmljIG1vZGVzLiAgKi8KK3R5cGVkZWYgZW51bSBtb2RlX3R5cGUgeworICBNT0RFX1ZNLCBNT0RFX0JJLAorICBNT0RFX1FJLCBNT0RFX0hJLCBNT0RFX1NJLCBNT0RFX0RJLAorICBNT0RFX1VRSSwgTU9ERV9VSEksIE1PREVfVVNJLCBNT0RFX1VESSwKKyAgTU9ERV9TRiwgTU9ERV9ERiwgTU9ERV9YRiwgTU9ERV9URiwKKyAgTU9ERV9UQVJHRVRfTUFYIC8qID0gTU9ERV9URj8gKi8sCisgIC8qIFRoZXNlIGFyZSBob3N0IG1vZGVzLiAgKi8KKyAgTU9ERV9JTlQsIE1PREVfVUlOVCwgTU9ERV9QVFIsIC8qPz8/IE1PREVfQUREUiwgTU9ERV9JQUREUiwqLworICBNT0RFX01BWAorfSBNT0RFX1RZUEU7CisKKyNkZWZpbmUgTUFYX1RBUkdFVF9NT0RFUyAoKGludCkgTU9ERV9UQVJHRVRfTUFYKQorI2RlZmluZSBNQVhfTU9ERVMgKChpbnQpIE1PREVfTUFYKQorCitleHRlcm4gY29uc3QgY2hhciAqbW9kZV9uYW1lc1tdOworI2RlZmluZSBNT0RFX05BTUUobSkgKG1vZGVfbmFtZXNbbV0pCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBCSTsKK3R5cGVkZWYgc2lnbmVkOCBRSTsKK3R5cGVkZWYgc2lnbmVkMTYgSEk7Cit0eXBlZGVmIHNpZ25lZDMyIFNJOwordHlwZWRlZiB1bnNpZ25lZDggVVFJOwordHlwZWRlZiB1bnNpZ25lZDE2IFVISTsKK3R5cGVkZWYgdW5zaWduZWQzMiBVU0k7CisKKyNpZmRlZiBIQVZFX0xPTkdMT05HCit0eXBlZGVmIHNpZ25lZDY0IERJOwordHlwZWRlZiB1bnNpZ25lZDY0IFVESTsKKyNkZWZpbmUgR0VUTE9ESShkaSkgKChTSSkgKGRpKSkKKyNkZWZpbmUgR0VUSElESShkaSkgKChTSSkgKChVREkpIChkaSkgPj4gMzIpKQorI2RlZmluZSBTRVRMT0RJKGRpLCB2YWwpICgoZGkpID0gKCgoZGkpICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpIHwgKHZhbCkpKQorI2RlZmluZSBTRVRISURJKGRpLCB2YWwpICgoZGkpID0gKCgoZGkpICYgMHhmZmZmZmZmZkxMKSB8ICgoKERJKSAodmFsKSkgPDwgMzIpKSkKKyNkZWZpbmUgU0VUREkoZGksIGhpLCBsbykgKChkaSkgPSBNQUtFREkgKGhpLCBsbykpCisjZGVmaW5lIE1BS0VESShoaSwgbG8pICgoKChESSkgKFNJKSAoaGkpKSA8PCAzMikgfCAoKFVESSkgKFVTSSkgKGxvKSkpCisjZWxzZQorLyogREkgbW9kZSBzdXBwb3J0IGlmICJsb25nIGxvbmciIGRvZXNuJ3QgZXhpc3QuCisgICBBdCBvbmUgcG9pbnQgQ0dFTiBzdXBwb3J0ZWQgSyZSIEMgY29tcGlsZXJzLCBhbmQgQU5TSSBDIGNvbXBpbGVycyB3aXRob3V0CisgICAibG9uZyBsb25nIi4gIE9uZSBjYW4gYXJndWUgdGhlIHZhcmlvdXMgbWVyaXRzIG9mIGtlZXBpbmcgdGhpcyBpbiBvcgorICAgdGhyb3dpbmcgaXQgb3V0LiAgSSB3ZW50IHRvIHRoZSB0cm91YmxlIG9mIGFkZGluZyBpdCBzbyBmb3IgdGhlIHRpbWUgYmVpbmcKKyAgIEknbSBsZWF2aW5nIGl0IGluLiAgKi8KK3R5cGVkZWYgc3RydWN0IHsgU0kgaGksbG87IH0gREk7Cit0eXBlZGVmIERJIFVESTsKKyNkZWZpbmUgR0VUTE9ESShkaSkgKChkaSkubG8pCisjZGVmaW5lIEdFVEhJREkoZGkpICgoZGkpLmhpKQorI2RlZmluZSBTRVRMT0RJKGRpLCB2YWwpICgoZGkpLmxvID0gKHZhbCkpCisjZGVmaW5lIFNFVEhJREkoZGksIHZhbCkgKChkaSkuaGkgPSAodmFsKSkKKyNkZWZpbmUgU0VUREkoZGksIGhpLCBsbykgKChkaSkgPSBNQUtFREkgKGhpLCBsbykpCitleHRlcm4gREkgbWFrZV9zdHJ1Y3RfZGkgKFNJLCBTSSk7CisjZGVmaW5lIE1BS0VESShoaSwgbG8pIChtYWtlX3N0cnVjdF9kaSAoKGhpKSwgKGxvKSkpCisjZW5kaWYKKworLyogRklYTUU6IE5lZWQgdG8gcHJvdmlkZSBsaWJyYXJpZXMgaWYgdGhlc2UgYXJlbid0IGFwcHJvcHJpYXRlIGZvciB0YXJnZXQsCisgICBvciB1c2VyJ3MgbmVlZHMuICAqLwordHlwZWRlZiBmbG9hdCBTRjsKK3R5cGVkZWYgZG91YmxlIERGOwordHlwZWRlZiBkb3VibGUgWEY7IC8qIEZJWE1FOiBjb25maWd1cmUsIHByb3ZpZGUgbGlicmFyeSAqLwordHlwZWRlZiBkb3VibGUgVEY7IC8qIEZJWE1FOiBjb25maWd1cmUsIHByb3ZpZGUgbGlicmFyeSAqLworCisvKiBUaGVzZSBhcmUgdXNlZCB0byByZWNvcmQgZXh0cmFjdGVkIHJhdyBkYXRhIGZyb20gYW4gaW5zdHJ1Y3Rpb24sIGFtb25nIG90aGVyCisgICB0aGluZ3MuICBJdCBtdXN0IGJlIGEgaG9zdCBkYXRhIHR5cGUsIGFuZCBub3QgYSB0YXJnZXQgb25lLiAgKi8KK3R5cGVkZWYgaW50IElOVDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQ7CisKK3R5cGVkZWYgdW5zaWduZWRfYWRkcmVzcyBBRERSOyAgLyogRklYTUU6IHdpcCovCit0eXBlZGVmIHVuc2lnbmVkX2FkZHJlc3MgSUFERFI7IC8qIEZJWE1FOiB3aXAqLworCisjZW5kaWYgLyogQ0dFTl9UWVBFU19IICovCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2NnZW4tdXRpbHMuYyBiL3NpbS9jb21tb24vY2dlbi11dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYWZmNWMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL2NnZW4tdXRpbHMuYwpAQCAtMCwwICsxLDMyOCBAQAorLyogU3VwcG9ydCBjb2RlIGZvciB2YXJpb3VzIHBpZWNlcyBvZiBDR0VOIHNpbXVsYXRvcnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJkaXMtYXNtLmgiCisKKyNkZWZpbmUgTUVNT1BTX0RFRklORV9JTkxJTkUKKyNpbmNsdWRlICJjZ2VuLW1lbS5oIgorCisjZGVmaW5lIFNFTU9QU19ERUZJTkVfSU5MSU5FCisjaW5jbHVkZSAiY2dlbi1vcHMuaCIKKworI3VuZGVmIG1pbgorI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorCitjb25zdCBjaGFyICptb2RlX25hbWVzW10gPSB7CisgICJWTSIsCisgICJCSSIsCisgICJRSSIsCisgICJISSIsCisgICJTSSIsCisgICJESSIsCisgICJVUUkiLAorICAiVUhJIiwKKyAgIlVTSSIsCisgICJVREkiLAorICAiU0YiLAorICAiREYiLAorICAiWEYiLAorICAiVEYiLAorICAwLCAvKiBNT0RFX1RBUkdFVF9NQVggKi8KKyAgIklOVCIsCisgICJVSU5UIiwKKyAgIlBUUiIKK307CisKKy8qIE9wY29kZSB0YWJsZSBmb3IgdmlydHVhbCBpbnNucyB1c2VkIGJ5IHRoZSBzaW11bGF0b3IuICAqLworCisjZGVmaW5lIFYgQ0dFTl9BVFRSX01BU0sgKENHRU5fSU5TTl9WSVJUVUFMKQorCitzdGF0aWMgY29uc3QgQ0dFTl9JQkFTRSB2aXJ0dWFsX2luc25fZW50cmllc1tdID0KK3sKKyAgeworICAgIFZJUlRVQUxfSU5TTl9YX0lOVkFMSUQsICItLWludmFsaWQtLSIsIE5VTEwsIDAsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIFYsIHsgMCB9IH0KKyAgfSwKKyAgeworICAgIFZJUlRVQUxfSU5TTl9YX0JFRk9SRSwgIi0tYmVmb3JlLS0iLCBOVUxMLCAwLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCBWLCB7IDAgfSB9CisgIH0sCisgIHsKKyAgICBWSVJUVUFMX0lOU05fWF9BRlRFUiwgIi0tYWZ0ZXItLSIsIE5VTEwsIDAsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIFYsIHsgMCB9IH0KKyAgfSwKKyAgeworICAgIFZJUlRVQUxfSU5TTl9YX0JFR0lOLCAiLS1iZWdpbi0tIiwgTlVMTCwgMCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgViwgeyAwIH0gfQorICB9LAorICB7CisgICAgVklSVFVBTF9JTlNOX1hfQ0hBSU4sICItLWNoYWluLS0iLCBOVUxMLCAwLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCBWLCB7IDAgfSB9CisgIH0sCisgIHsKKyAgICBWSVJUVUFMX0lOU05fWF9DVElfQ0hBSU4sICItLWN0aS1jaGFpbi0tIiwgTlVMTCwgMCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgViwgeyAwIH0gfQorICB9Cit9OworCisjdW5kZWYgVgorCitjb25zdCBDR0VOX0lOU04gY2dlbl92aXJ0dWFsX2luc25fdGFibGVbXSA9Cit7CisgIHsgJiB2aXJ0dWFsX2luc25fZW50cmllc1swXSB9LAorICB7ICYgdmlydHVhbF9pbnNuX2VudHJpZXNbMV0gfSwKKyAgeyAmIHZpcnR1YWxfaW5zbl9lbnRyaWVzWzJdIH0sCisgIHsgJiB2aXJ0dWFsX2luc25fZW50cmllc1szXSB9LAorICB7ICYgdmlydHVhbF9pbnNuX2VudHJpZXNbNF0gfSwKKyAgeyAmIHZpcnR1YWxfaW5zbl9lbnRyaWVzWzVdIH0KK307CisKKy8qIEluaXRpYWxpemUgY2dlbiB0aGluZ3MuCisgICBUaGlzIGlzIGNhbGxlZCBhZnRlciBzaW1fcG9zdF9hcmd2X2luaXQuICAqLworCit2b2lkCitjZ2VuX2luaXQgKFNJTV9ERVNDIHNkKQoreworICBpbnQgaSwgYzsKKworICAvKiBJZiBubyBwcm9maWxpbmcgb3IgdHJhY2luZyBoYXMgYmVlbiBlbmFibGVkLCBydW4gaW4gZmFzdCBtb2RlLiAgKi8KKyAgeworICAgIGludCBydW5fZmFzdF9wID0gMTsKKworICAgIGZvciAoYyA9IDA7IGMgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytjKQorICAgICAgeworCVNJTV9DUFUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIGMpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9QUk9GSUxFX1ZBTFVFUzsgKytpKQorCSAgaWYgKENQVV9QUk9GSUxFX0ZMQUdTIChjcHUpIFtpXSkKKwkgICAgeworCSAgICAgIHJ1bl9mYXN0X3AgPSAwOworCSAgICAgIGJyZWFrOworCSAgICB9CisJZm9yIChpID0gMDsgaSA8IE1BWF9UUkFDRV9WQUxVRVM7ICsraSkKKwkgIGlmIChDUFVfVFJBQ0VfRkxBR1MgKGNwdSkgW2ldKQorCSAgICB7CisJICAgICAgcnVuX2Zhc3RfcCA9IDA7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwlpZiAoISBydW5fZmFzdF9wKQorCSAgYnJlYWs7CisgICAgICB9CisgICAgU1RBVEVfUlVOX0ZBU1RfUCAoc2QpID0gcnVuX2Zhc3RfcDsKKyAgfQorfQorCisvKiBSZXR1cm4gdGhlIG5hbWUgb2YgaW5zbiBudW1iZXIgSS4gICovCisKK2NvbnN0IGNoYXIgKgorY2dlbl9pbnNuX25hbWUgKFNJTV9DUFUgKmNwdSwgaW50IGkpCit7CisgIHJldHVybiBDR0VOX0lOU05fTkFNRSAoKCogQ1BVX0dFVF9JREFUQSAoY3B1KSkgKChjcHUpLCAoaSkpKTsKK30KKworLyogUmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBleHRyYSBieXRlcyByZXF1aXJlZCBmb3IgYSBTSU1fQ1BVIHN0cnVjdC4gICovCisKK2ludAorY2dlbl9jcHVfbWF4X2V4dHJhX2J5dGVzICh2b2lkKQoreworICBpbnQgaTsKKyAgaW50IGV4dHJhID0gMDsKKworICBmb3IgKGkgPSAwOyBzaW1fbWFjaHNbaV0gIT0gMDsgKytpKQorICAgIHsKKyAgICAgIGludCBzaXplID0gSU1QX1BST1BTX1NJTV9DUFVfU0laRSAoTUFDSF9JTVBfUFJPUFMgKHNpbV9tYWNoc1tpXSkpOworICAgICAgaWYgKHNpemUgPiBleHRyYSkKKwlleHRyYSA9IHNpemU7CisgICAgfQorICByZXR1cm4gZXh0cmE7Cit9CisMCisjaWZkZWYgRElfRk5fU1VQUE9SVAorCitESQorbWFrZV9zdHJ1Y3RfZGkgKGhpLCBsbykKKyAgICAgU0kgaGksIGxvOworeworICBESSByZXN1bHQ7CisKKyAgcmVzdWx0LmhpID0gaGk7CisgIHJlc3VsdC5sbyA9IGxvOworICByZXR1cm4gcmVzdWx0OworfQorCitESQorQU5EREkgKGEsIGIpCisgICAgIERJIGEsIGI7Cit7CisgIFNJIGFoaSA9IEdFVEhJREkgKGEpOworICBTSSBhbG8gPSBHRVRMT0RJIChhKTsKKyAgU0kgYmhpID0gR0VUSElESSAoYik7CisgIFNJIGJsbyA9IEdFVExPREkgKGIpOworICByZXR1cm4gTUFLRURJIChhaGkgJiBiaGksIGFsbyAmIGJsbyk7Cit9CisKK0RJCitPUkRJIChhLCBiKQorICAgICBESSBhLCBiOworeworICBTSSBhaGkgPSBHRVRISURJIChhKTsKKyAgU0kgYWxvID0gR0VUTE9ESSAoYSk7CisgIFNJIGJoaSA9IEdFVEhJREkgKGIpOworICBTSSBibG8gPSBHRVRMT0RJIChiKTsKKyAgcmV0dXJuIE1BS0VESSAoYWhpIHwgYmhpLCBhbG8gfCBibG8pOworfQorCitESQorQUREREkgKGEsIGIpCisgICAgIERJIGEsIGI7Cit7CisgIFVTSSBhaGkgPSBHRVRISURJIChhKTsKKyAgVVNJIGFsbyA9IEdFVExPREkgKGEpOworICBVU0kgYmhpID0gR0VUSElESSAoYik7CisgIFVTSSBibG8gPSBHRVRMT0RJIChiKTsKKyAgVVNJIHggPSBhbG8gKyBibG87CisgIHJldHVybiBNQUtFREkgKGFoaSArIGJoaSArICh4IDwgYWxvKSwgeCk7Cit9CisKK0RJCitNVUxESSAoYSwgYikKKyAgICAgREkgYSwgYjsKK3sKKyAgVVNJIGFoaSA9IEdFVEhJREkgKGEpOworICBVU0kgYWxvID0gR0VUTE9ESSAoYSk7CisgIFVTSSBiaGkgPSBHRVRISURJIChiKTsKKyAgVVNJIGJsbyA9IEdFVExPREkgKGIpOworICBVU0kgcmhpLHJsbzsKKyAgVVNJIHgwLCB4MSwgeDIsIHgzOworCisgIHgwID0gYWxvICogYmxvOworICB4MSA9IGFsbyAqIGJoaTsKKyAgeDIgPSBhaGkgKiBibG87CisgIHgzID0gYWhpICogYmhpOworCisjZGVmaW5lIFNJX1RZUEVfU0laRSAzMgorI2RlZmluZSBCSVRTNCAoU0lfVFlQRV9TSVpFIC8gNCkKKyNkZWZpbmUgbGxfQiAoMUwgPDwgKFNJX1RZUEVfU0laRSAvIDIpKQorI2RlZmluZSBsbF9sb3dwYXJ0KHQpICgoVVNJKSAodCkgJSBsbF9CKQorI2RlZmluZSBsbF9oaWdocGFydCh0KSAoKFVTSSkgKHQpIC8gbGxfQikKKyAgeDEgKz0gbGxfaGlnaHBhcnQgKHgwKTsJLyogdGhpcyBjYW4ndCBnaXZlIGNhcnJ5ICovCisgIHgxICs9IHgyOwkJCS8qIGJ1dCB0aGlzIGluZGVlZCBjYW4gKi8KKyAgaWYgKHgxIDwgeDIpCQkJLyogZGlkIHdlIGdldCBpdD8gKi8KKyAgICB4MyArPSBsbF9COwkJCS8qIHllcywgYWRkIGl0IGluIHRoZSBwcm9wZXIgcG9zLiAqLworCisgIHJoaSA9IHgzICsgbGxfaGlnaHBhcnQgKHgxKTsKKyAgcmxvID0gbGxfbG93cGFydCAoeDEpICogbGxfQiArIGxsX2xvd3BhcnQgKHgwKTsKKyAgcmV0dXJuIE1BS0VESSAocmhpICsgKGFsbyAqIGJoaSkgKyAoYWhpICogYmxvKSwgcmxvKTsKK30KKworREkKK1NITERJICh2YWwsIHNoaWZ0KQorICAgICBESSB2YWw7CisgICAgIFNJIHNoaWZ0OworeworICBVU0kgaGkgPSBHRVRISURJICh2YWwpOworICBVU0kgbG8gPSBHRVRMT0RJICh2YWwpOworICAvKiBGSVhNRTogTmVlZCB0byB3b3JyeSBhYm91dCBzaGlmdCA8IDAgfHwgc2hpZnQgPj0gMzIuICAqLworICByZXR1cm4gTUFLRURJICgoaGkgPDwgc2hpZnQpIHwgKGxvID4+ICgzMiAtIHNoaWZ0KSksIGxvIDw8IHNoaWZ0KTsKK30KKworREkKK1NMQURJICh2YWwsIHNoaWZ0KQorICAgICBESSB2YWw7CisgICAgIFNJIHNoaWZ0OworeworICBTSSBoaSA9IEdFVEhJREkgKHZhbCk7CisgIFVTSSBsbyA9IEdFVExPREkgKHZhbCk7CisgIC8qIEZJWE1FOiBOZWVkIHRvIHdvcnJ5IGFib3V0IHNoaWZ0IDwgMCB8fCBzaGlmdCA+PSAzMi4gICovCisgIHJldHVybiBNQUtFREkgKChoaSA8PCBzaGlmdCkgfCAobG8gPj4gKDMyIC0gc2hpZnQpKSwgbG8gPDwgc2hpZnQpOworfQorCitESQorU1JBREkgKHZhbCwgc2hpZnQpCisgICAgIERJIHZhbDsKKyAgICAgU0kgc2hpZnQ7Cit7CisgIFNJIGhpID0gR0VUSElESSAodmFsKTsKKyAgVVNJIGxvID0gR0VUTE9ESSAodmFsKTsKKyAgLyogV2UgdXNlIFNSQVNJIGJlY2F1c2UgdGhlIHJlc3VsdCBpcyBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGlmIGhpIDwgMC4gICovCisgIC8qIEZJWE1FOiBOZWVkIHRvIHdvcnJ5IGFib3V0IHNoaWZ0IDwgMCB8fCBzaGlmdCA+PSAzMi4gICovCisgIHJldHVybiBNQUtFREkgKFNSQVNJIChoaSwgc2hpZnQpLCAoaGkgPDwgKDMyIC0gc2hpZnQpKSB8IChsbyA+PiBzaGlmdCkpOworfQorCitpbnQKK0dFREkgKGEsIGIpCisgICAgIERJIGEsIGI7Cit7CisgIFNJIGFoaSA9IEdFVEhJREkgKGEpOworICBVU0kgYWxvID0gR0VUTE9ESSAoYSk7CisgIFNJIGJoaSA9IEdFVEhJREkgKGIpOworICBVU0kgYmxvID0gR0VUTE9ESSAoYik7CisgIGlmIChhaGkgPiBiaGkpCisgICAgcmV0dXJuIDE7CisgIGlmIChhaGkgPT0gYmhpKQorICAgIHJldHVybiBhbG8gPj0gYmxvOworICByZXR1cm4gMDsKK30KKworaW50CitMRURJIChhLCBiKQorICAgICBESSBhLCBiOworeworICBTSSBhaGkgPSBHRVRISURJIChhKTsKKyAgVVNJIGFsbyA9IEdFVExPREkgKGEpOworICBTSSBiaGkgPSBHRVRISURJIChiKTsKKyAgVVNJIGJsbyA9IEdFVExPREkgKGIpOworICBpZiAoYWhpIDwgYmhpKQorICAgIHJldHVybiAxOworICBpZiAoYWhpID09IGJoaSkKKyAgICByZXR1cm4gYWxvIDw9IGJsbzsKKyAgcmV0dXJuIDA7Cit9CisKK0RJCitDT05WSElESSAodmFsKQorICAgICBISSB2YWw7Cit7CisgIGlmICh2YWwgPCAwKQorICAgIHJldHVybiBNQUtFREkgKC0xLCB2YWwpOworICBlbHNlCisgICAgcmV0dXJuIE1BS0VESSAoMCwgdmFsKTsKK30KKworREkKK0NPTlZTSURJICh2YWwpCisgICAgIFNJIHZhbDsKK3sKKyAgaWYgKHZhbCA8IDApCisgICAgcmV0dXJuIE1BS0VESSAoLTEsIHZhbCk7CisgIGVsc2UKKyAgICByZXR1cm4gTUFLRURJICgwLCB2YWwpOworfQorCitTSQorQ09OVkRJU0kgKHZhbCkKKyAgICAgREkgdmFsOworeworICByZXR1cm4gR0VUTE9ESSAodmFsKTsKK30KKworI2VuZGlmIC8qIERJX0ZOX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vY29uZmlnLmluIGIvc2ltL2NvbW1vbi9jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRmOTU2MAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vY29uZmlnLmluCkBAIC0wLDAgKzEsMTY3IEBACisvKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KKyN1bmRlZiBDX0FMTE9DQQorCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCisjdW5kZWYgY29uc3QKKworLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgorICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KKyN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KKyN1bmRlZiBIQVZFX0FMTE9DQQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KKyN1bmRlZiBIQVZFX0FMTE9DQV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KKyN1bmRlZiBIQVZFX01NQVAKKworLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KKyN1bmRlZiBpbmxpbmUKKworLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBvZmZfdAorCisvKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KKyN1bmRlZiBfUE9TSVhfU09VUkNFCisKKy8qIERlZmluZSBhcyB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIChpbnQgb3Igdm9pZCkuICAqLworI3VuZGVmIFJFVFNJR1RZUEUKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgc2l6ZV90CisKKy8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQorICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCisgICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCisgU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcworIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcworIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCisgKi8KKyN1bmRlZiBTVEFDS19ESVJFQ1RJT04KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KKyN1bmRlZiBTVERDX0hFQURFUlMKKworLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCisjdW5kZWYgRU5BQkxFX05MUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCisjdW5kZWYgSEFWRV9HRVRURVhUCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLworI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX3NldGZwdWN3IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fU0VURlBVQ1cKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfRENHRVRURVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0dFVENXRAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cnVzYWdlIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0dFVFJVU0FHRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9NVU5NQVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfUFVURU5WCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NFVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRMT0NBTEUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzaWdhY3Rpb24gZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0lHQUNUSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDSFIKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0aW1lIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1RJTUUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9BUkdaX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZGxmY24uaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfRExGQ05fSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9FUlJOT19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZnB1X2NvbnRyb2wuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfRlBVX0NPTlRST0xfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9NQUxMT0NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9OTF9UWVBFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVElNRVNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1RJTUVfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVU5JU1REX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1ZBTFVFU19ICmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2NvbmZpZ3VyZSBiL3NpbS9jb21tb24vY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRkYzc2NzAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDM5MDIgQEAKKyMhIC9iaW4vc2gKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIgorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQorIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgorCisjIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAzCisKKworCisKKworIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDEKKworCisKKyMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDEKKworCisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgQ3lnd2luMzIsIHdpdGhvdXQgdXNpbmcKKyMgQUNfQ0FOT05JQ0FMXyouICBJZiBzbywgc2V0IG91dHB1dCB2YXJpYWJsZSBDWUdXSU4zMiB0byAieWVzIi4KKyMgT3RoZXJ3aXNlIHNldCBpdCB0byAibm8iLgorCisKKworIyBDaGVjayB0byBzZWUgaWYgd2UncmUgcnVubmluZyB1bmRlciBXaW4zMiwgd2l0aG91dCB1c2luZworIyBBQ19DQU5PTklDQUxfKi4gIElmIHNvLCBzZXQgb3V0cHV0IHZhcmlhYmxlIEVYRUVYVCB0byAiLmV4ZSIuCisjIE90aGVyd2lzZSBzZXQgaXQgdG8gIiIuCisKKworCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCisgICAgZXhpdCAwIDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Li9jb25maWcubG9nCisKK2VjaG8gIlwKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorIiAxPiY1CisKKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCithY19jb25maWd1cmVfYXJncz0KK2ZvciBhY19hcmcKK2RvCisgIGNhc2UgIiRhY19hcmciIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBlc2FjCitkb25lCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKyMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCisjIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCitpZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID4gY29uZmRlZnMuaAorCisjIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0CisjIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCithY19leGVleHQ9CithY19vYmpleHQ9bworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworCisKKyMgVGhpcyBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IHRoZSB0YXJnZXQgc3BlY2lmaWMgZGlyZWN0b3JpZXMsIGFuZCBieSB1cy4KK2VjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2Nzc6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBDUFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKKyAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KKyAgQ1BQPSIke0NDLWNjfSAtRSIKKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjkyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2OTg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDcwOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NzE1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3MjYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjczMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0vbGliL2NwcAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCisgIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgorZWxzZQorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCitlY2hvICIkYWNfdCIiJENQUCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3NTc6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQorc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKK2FsbDoKKwlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJworRU9GCisjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KK2V2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAoraWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKK2Vsc2UKKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KK2ZpCitybSAtZiBjb25mdGVzdG1ha2UKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIFNFVF9NQUtFPQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc4NDogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQoraWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCisgIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKK3RoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCitFT0YKKworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENDPSIkQ0MgLXBvc2l4IgorICBlbHNlCisgICAgQ0M9IiRDQyAtWHAiCisgIGZpCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBJU0M9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODA1OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4MTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjgxODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4MzUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODUzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICA6CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDg3NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQoraWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKK2V4aXQgKDApOyB9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4ODU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgOgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTA5OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDkxNCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwordHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OworLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK2NoYXIgY29uc3QgKmNvbnN0ICpjY3A7CitjaGFyICoqcDsKKy8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCitzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CitzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKKy8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KKyAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQorICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KK2NvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKK2NjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKy8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCisrK2NjcDsKK3AgPSAoY2hhcioqKSBjY3A7CitjY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKK3sgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgKnQ7CisgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7CisKKyAgKnQrKyA9IDA7Cit9Cit7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLworICBpbnQgeFtdID0gezI1LCAxN307CisgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICsrZm9vOworfQoreyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOworICBpcHRyIHAgPSAwOworICArK3A7Cit9Cit7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKKyAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OworICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Cit9Cit7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLworICBjb25zdCBpbnQgZm9vID0gMTA7Cit9CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5NjM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgY29uc3QgCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTg0OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX2N2X2NfaW5saW5lPW5vCitmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDk5MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworfSAkYWNfa3cgZm9vKCkgeworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk5ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitmaQorcm0gLWYgY29uZnRlc3QqCitkb25lCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKK2Nhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KKyAgaW5saW5lIHwgeWVzKSA7OworICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGlubGluZSAKK0VPRgorIDs7CisgICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCitFT0YKKyA7OworZXNhYworCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwMjQ6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwMjkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgb2ZmX3QgbG9uZworRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwNTc6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA2MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAic2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZAorRU9GCisKK2ZpCisKKyMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCisjIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwOTI6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDk3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhbGxvY2EuaD4KK2ludCBtYWluKCkgeworY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTI1OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExMzAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZWxzZQorIyBpZmRlZiBfTVNDX1ZFUgorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgZWxzZQorIyAgaWYgSEFWRV9BTExPQ0FfSAorIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KK2NoYXIgKmFsbG9jYSAoKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0EgMQorRU9GCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KKyAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKKyAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCisgICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAorICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KKyAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIENfQUxMT0NBIDEKK0VPRgorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExOTA6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTk1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKK3dlYmVjcmF5CisjZWxzZQord2Vub3RiZWNyYXkKKyNlbmRpZgorCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9vc19jcmF5PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCitmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIyMDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTIyNSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjQ4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCitFT0YKKworICBicmVhaworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2RvbmUKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyNzU6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjgzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK2ZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCit7CisgIHN0YXRpYyBjaGFyICphZGRyID0gMDsKKyAgYXV0byBjaGFyIGR1bW15OworICBpZiAoYWRkciA9PSAwKQorICAgIHsKKyAgICAgIGFkZHIgPSAmZHVtbXk7CisgICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKK30KK21haW4gKCkKK3sKKyAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQorZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KK0VPRgorCitmaQorCitmb3IgYWNfaGRyIGluIHVuaXN0ZC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTMyNzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzMzIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTM2NjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM3MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzk0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDE5OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNDI3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCisgICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKKwltbWFwIHByaXZhdGUgbm90IGZpeGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisJbW1hcCBzaGFyZWQgbm90IGZpeGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKKyAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKKyAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQorICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQorICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCisgICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQorICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKKyAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgorCisgICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCisgICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgorICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCisgICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisvKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCisjaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKyMgaWZkZWYgSEFWRV9VTklTVERfSAorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGVuZGlmCisKKy8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCisjIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisjIGVuZGlmCisKKyMgaWZkZWYgX1NDX1BBR0VTSVpFCisjICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKKyMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKyMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCisjICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKKyMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgICAgaWZkZWYgTkJQRworIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQorIyAgICAgaWZuZGVmIENMU0laRQorIyAgICAgIGRlZmluZSBDTFNJWkUgMQorIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCisjICAgIGVsc2UgLyogbm8gTkJQRyAqLworIyAgICAgaWZkZWYgTkJQQworIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKKyMgICAgIGVsc2UgLyogbm8gTkJQQyAqLworIyAgICAgIGlmZGVmIFBBR0VTSVpFCisjICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCisjICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KKyMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KKyMgICAgZW5kaWYgLyogbm8gTkJQRyAqLworIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCisjICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLworCisjZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9CisjZWxzZQorY2hhciAqbWFsbG9jKCk7CisjZW5kaWYKKworaW50CittYWluKCkKK3sKKwljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKKwlpbnQgaSwgcGFnZXNpemU7CisJaW50IGZkOworCisJcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOworCisJLyoKKwkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCisJICovCisJZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKKwl1bWFzaygwKTsKKwlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKworCS8qCisJICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCisJICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAorCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCisJICovCisJZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEyKQorCQlleGl0KDEpOworCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKKwlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQorCQkJZXhpdCgxKTsKKworCS8qCisJICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKKwkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCisJICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCisJICovCisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7CisJZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YTMpCisJCWV4aXQoMSk7CisJaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCisJCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOworCWV4aXQoMCk7Cit9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTY3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTU1BUCAxCitFT0YKKworZmkKKworCisjIGF1dG9jb25mLmluZm8gc2F5cyB0aGlzIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgQUNfSU5JVC4KKworCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCithY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKK2FjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisKKyMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgorIyBUaGUgaW5wdXRzIGFyZToKKyMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAorIworIyBUaGUgcnVsZXMgYXJlOgorIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKKyMgICAgc2FtZSB0aW1lLgorIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KKyMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAorIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KKyMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KKyMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCisKKyMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KKyMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KK2Nhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgorTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OworKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCisKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgoraWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2NDA6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorCitob3N0X2FsaWFzPSRob3N0CitjYXNlICIkaG9zdF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKQorICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKKyAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaSA7OworICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKK2hvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY2MTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKwordGFyZ2V0X2FsaWFzPSR0YXJnZXQKK2Nhc2UgIiR0YXJnZXRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKwordGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAordGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK3RhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCit0YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY3OTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorCitidWlsZF9hbGlhcz0kYnVpbGQKK2Nhc2UgIiRidWlsZF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKK2J1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitidWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgorCit0ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCisgIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKKyAgICBOT05FTk9ORXMseCx4LCAmJgorICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCisKK2lmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQorZWxzZQorICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCisgIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKK3MsXFwsXFxcXCxnOyBzLFwkLCQkLGcKK0VPRl9TRUQKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKKyAgcm0gLWYgY29uZnRlc3RzZWQKK2ZpCit0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KK3Rlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKworIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgordGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3MjM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3NTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODAyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorIDs7CisgICAgZXNhYworICBmaQorICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODMzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxODQzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK21haW4oKXtyZXR1cm4oMCk7fQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4NDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcworICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCisgIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KKyAgZWxzZQorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCisgIGZpCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODY3OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1CitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTg3MjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg4MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2N2X3Byb2dfZ2NjPXllcworZWxzZQorICBhY19jdl9wcm9nX2djYz1ubworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKKworaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorCithY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKK2FjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTAwOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYworaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19nPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQorCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5NDM6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisKKyMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KK2lmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisgIENDX0ZPUl9CVUlMRD0nJChDQyknCitlbHNlCisgIENDX0ZPUl9CVUlMRD1nY2MKK2ZpCisKKworCisKK0FSPSR7QVItYXJ9CisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjAwOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKK2ZpCitmaQorUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworQUxMX0xJTkdVQVM9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAordW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDQzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjA0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjA1MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAorX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwODM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIwODggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjExMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCisgICAgIGZvciBhY19mdW5jIGluIHN0cGNweQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjE0MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjE0NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmaQorICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KKyAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1RQQ1BZIDEKK0VPRgorCisgICBmaQorCisgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyMDI6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjIwNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bG9jYWxlLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiBMQ19NRVNTQUdFUworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgorICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQorRU9GCisKKyAgICBmaQorICBmaQorICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjM1OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCisgIFVTRV9OTFM9JGVuYWJsZXZhbAorZWxzZQorICBVU0VfTkxTPXllcworZmkKKworICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgorICAgIAorCisgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KKworICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEVOQUJMRV9OTFMgMQorRU9GCisKKyAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyNTU6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKK2Vsc2UKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubworZmkKKworICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2CisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KKwlubHNfY3ZfaGVhZGVyX2xpYmd0PQorCUNBVE9CSkVYVD1OT05FCisKKwlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjI3NDogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjI3OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjg0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjMwMTogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzA2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzEzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKwkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMjk6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQorYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1saW50bCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzM3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgYmluZHRleHRkb21haW4oKTsKKworaW50IG1haW4oKSB7CitiaW5kdGV4dGRvbWFpbigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjM2NDogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzY5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM3NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0dFVFRFWFQgMQorRU9GCisKKwkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0MDQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisJICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgorCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0Mzg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI0NDMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ2NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQ5MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjUyODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNTYwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CitleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CisJCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9LmdtbworCQkgICBEQVRBRElSTkFNRT1zaGFyZQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9Lm1vCisJCSAgIERBVEFESVJOQU1FPWxpYgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCQlJTlNUT0JKRVhUPS5tbworCSAgICAgIGZpCisJICAgIGZpCisJCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisJICAgICAgICAKKyAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KKwkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCisgICAgICAgIGZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjYwMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KKwlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2MzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2Njk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KKwkgIDogOworCWVsc2UKKwkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCisgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKKyAgICBkb25lCisKKyAgICAgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgIAorCisgICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCisgICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCisgICAgICAgTElOR1VBUz0KKyAgICAgZWxzZQorICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3NTk6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQorICAgICAgIE5FV19MSU5HVUFTPQorICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbworICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgorICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7CisgICAgICAgICBlc2FjCisgICAgICAgZG9uZQorICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCisgICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2CisgICAgIGZpCisKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCisgICAgIGZpCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKKyAgIGVsc2UKKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAorLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgorICAgZmkKKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgorICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KKwkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3ODc6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI3OTIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc5NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIG1zZ2Zvcm1hdD1saW51eAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK21zZ2Zvcm1hdD14b3BlbgorZmkKKworCisJICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCisgICAgICBmaQorICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCisJICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICAKKyAgIAorCisgICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCisgICAKKworICAgICAgbD0KKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgCisKKyMgQ2hlY2sgZm9yIGNvbW1vbiBoZWFkZXJzLgorIyBGSVhNRTogU2VlbXMgdG8gbWUgdGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgZm9yIGkzODYtd2luZG93cyBob3N0cy4KKyMgQXQgb25lIHBvaW50IHRoZXJlIHdlcmUgaGFyZGNvZGVkIEFDX0RFRklORSdzIGlmICR7aG9zdH0gPSBpMzg2LSotd2luZG93cyouCitmb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB1bmlzdGQuaCB0aW1lLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyODY2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjg3MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg3NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19oZHIgaW4gc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5MDY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTExICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTE2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2hkciBpbiBmY250bC5oIGZwdV9jb250cm9sLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTQ2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjk1MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19oZHIgaW4gZGxmY24uaCBlcnJuby5oIHN5cy9zdGF0LmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTg2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjk5MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk5NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHJ1c2FnZSB0aW1lIHNpZ2FjdGlvbiBfX3NldGZwdWN3CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMDI1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDMwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworIyBDaGVjayBmb3Igc29ja2V0IGxpYnJhcmllcworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMwODA6IGNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nYmluZCB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxzb2NrZXQgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzA4OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGJpbmQoKTsKKworaW50IG1haW4oKSB7CitiaW5kKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDk5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHNvY2tldCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9saWIgMQorRU9GCisKKyAgTElCUz0iLWxzb2NrZXQgJExJQlMiCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzEyNzogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQorYWNfbGliX3Zhcj1gZWNobyBuc2wnXydnZXRob3N0YnluYW1lIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbG5zbCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMTM1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZ2V0aG9zdGJ5bmFtZSgpOworCitpbnQgbWFpbigpIHsKK2dldGhvc3RieW5hbWUoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbnNsIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2xpYiAxCitFT0YKKworICBMSUJTPSItbG5zbCAkTElCUyIKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0CisKKworCitVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlNQUlOVD0iIiBVU0VfTUFJTlRBSU5FUl9NT0RFPXllcyA7OworICBubykJTUFJTlQ9IiMiIDs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLW1haW50YWluZXItbW9kZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IE1BSU5UPSIjIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQorZmkKK2Vsc2UKKyAgTUFJTlQ9IiMiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSAtRFVTRV9CU1dBUD0xIjs7CisgIG5vKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0wIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1ic3dhcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ic3dhcD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9ic3dhcD0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY2ZsYWdzIG9yIC0tZGlzYWJsZS1zaW0tY2ZsYWdzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jZmxhZ3MiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQkgc2ltX2NmbGFncz0iLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIjs7CisgIHRyYWNlKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJQbGVhc2UgdXNlIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpbnN0ZWFkLiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2NmbGFncz0iIjs7CisgIG5vKQkgc2ltX2NmbGFncz0iIjs7CisgICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2NmbGFncz0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVidWcgb3IgLS1kaXNhYmxlLXNpbS1kZWJ1ZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWJ1ZyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpIHNpbV9kZWJ1Zz0iLURERUJVRz03IC1EV0lUSF9ERUJVRz03Ijs7CisgIG5vKSAgc2ltX2RlYnVnPSItRERFQlVHPTAgLURXSVRIX0RFQlVHPTAiOzsKKyAgKikgICBzaW1fZGVidWc9Ii1EREVCVUc9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfREVCVUc9Jygke2VuYWJsZXZhbH0pJyI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWJ1ZyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIGRlYnVnID0gJHNpbV9kZWJ1ZyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2RlYnVnPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zdGRpbyBvciAtLWRpc2FibGUtc2ltLXN0ZGlvIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zdGRpbytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N0ZGlvIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7CisgIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zdGRpbyIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGlvPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkaW8iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHN0ZGlvIGZsYWdzID0gJHNpbV9zdGRpbyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3N0ZGlvPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS10cmFjZSBvciAtLWRpc2FibGUtc2ltLXRyYWNlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV90cmFjZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3RyYWNlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3RyYWNlPSItRFRSQUNFPTEgLURXSVRIX1RSQUNFPS0xIjs7CisgIG5vKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MCAtRFdJVEhfVFJBQ0U9MCI7OworICBbLTAtOV0qKQorCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fdHJhY2U9IiIKKwlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKwkgIGlmIHRlc3QgeCIkc2ltX3RyYWNlIiA9IHg7IHRoZW4KKwkgICAgc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9JyhUUkFDRV8keCIKKwkgIGVsc2UKKwkgICAgc2ltX3RyYWNlPSIke3NpbV90cmFjZX18VFJBQ0VfJHgiCisJICBmaQorCWRvbmUKKwlzaW1fdHJhY2U9IiRzaW1fdHJhY2UpJyIgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSB0cmFjZSA9ICRzaW1fdHJhY2UiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV90cmFjZT0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcHJvZmlsZSBvciAtLWRpc2FibGUtc2ltLXByb2ZpbGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3Byb2ZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9wcm9maWxlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7CisgIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OworICBbLTAtOV0qKQorCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fcHJvZmlsZT0iIgorCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbworCSAgaWYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgPSB4OyB0aGVuCisJICAgIHNpbV9wcm9maWxlPSItRFdJVEhfUFJPRklMRT0nKFBST0ZJTEVfJHgiCisJICBlbHNlCisJICAgIHNpbV9wcm9maWxlPSIke3NpbV9wcm9maWxlfXxQUk9GSUxFXyR4IgorCSAgZmkKKwlkb25lCisJc2ltX3Byb2ZpbGU9IiRzaW1fcHJvZmlsZSknIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9wcm9maWxlIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gcHJvZmlsZSA9ICRzaW1fcHJvZmlsZSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3Byb2ZpbGU9IiIKK2ZpCisKKworCitlY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMzMjI6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMzI3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBzaWduYWwKKyN1bmRlZiBzaWduYWwKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7CisjZWxzZQordm9pZCAoKnNpZ25hbCAoKSkgKCk7CisjZW5kaWYKKworaW50IG1haW4oKSB7CitpbnQgaTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzQ0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpZ25hbD1pbnQKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCitFT0YKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzM2NDogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkQ1lHV0lOMzIiID0geWVzOyB0aGVuCithbV9jdl9leGVleHQ9LmV4ZQorZWxzZQorY2F0ID4gYW1fY190ZXN0LmMgPDwgJ0VPRicKK2ludCBtYWluKCkgeworLyogTm90aGluZyBuZWVkZWQgaGVyZSAqLworfQorRU9GCiske0NDLWNjfSAtbyBhbV9jX3Rlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgYW1fY190ZXN0LmMgJExJQlMgMT4mNQorYW1fY3ZfZXhlZXh0PWBscyBhbV9jX3Rlc3QuKiB8IGdyZXAgLXYgYW1fY190ZXN0LmMgfCBzZWQgLWUgcy9hbV9jX3Rlc3QvL2AKK3JtIC1mIGFtX2NfdGVzdCoKK2ZpCisKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iID0geCAmJiBhbV9jdl9leGVleHQ9bm8KK2ZpCitFWEVFWFQ9IiIKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthbV9jdl9leGVleHR9CitlY2hvICIkYWNfdCIiJHthbV9jdl9leGVleHR9IiAxPiY2CisKKworc2ltX2xpbmtfZmlsZXM9CitzaW1fbGlua19saW5rcz0KKworc2ltX2xpbmtfbGlua3M9dGNvbmZpZy5oCitpZiB0ZXN0IC1mICR7c3JjZGlyfS90Y29uZmlnLmluCit0aGVuCisgIHNpbV9saW5rX2ZpbGVzPXRjb25maWcuaW4KK2Vsc2UKKyAgc2ltX2xpbmtfZmlsZXM9Li4vY29tbW9uL3Rjb25maWcuaW4KK2ZpCisKKyMgdGFyZy12YWxzLmRlZiBwb2ludHMgdG8gdGhlIGxpYmMgbWFjcm8gZGVzY3JpcHRpb24gZmlsZS4KK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyotKi0qKSBUQVJHX1ZBTFNfREVGPS4uL2NvbW1vbi9ubHR2YWxzLmRlZiA7OworZXNhYworc2ltX2xpbmtfZmlsZXM9IiR7c2ltX2xpbmtfZmlsZXN9ICR7VEFSR19WQUxTX0RFRn0iCitzaW1fbGlua19saW5rcz0iJHtzaW1fbGlua19saW5rc30gdGFyZy12YWxzLmRlZiIKKworCisKKyMgUHV0IGEgdXNlZnVsIGNvcHkgb2YgQ1BQX0ZPUl9UQVJHRVQgaW4gTWFrZWZpbGUuCisjIFRoaXMgaXMgb25seSB1c2VkIHRvIGJ1aWxkIHRoZSB0YXJnZXQgdmFsdWVzIGhlYWRlciBmaWxlcy4gIFRoZXNlIGZpbGVzIGFyZQorIyBzaGlwcGVkIHdpdGggZGlzdHJpYnV0aW9ucyBzbyBDUFBfRk9SX1RBUkdFVCBvbmx5IG5lZWRzIHRvIHdvcmsgaW4KKyMgZGV2ZWxvcGVyJ3MgdHJlZXMuICBUaGlzIHZhbHVlIGlzIGJvcnJvd2VkIGZyb20gLi4vLi4vTWFrZWZpbGUuaW4uCitDUFBfRk9SX1RBUkdFVD0iXGAgXAorICBpZiB0ZXN0IC1mIFwkXCR7cm9vdG1lfS8uLi8uLi9nY2MvTWFrZWZpbGUgOyB0aGVuIFwKKyAgICBpZiB0ZXN0IC1mIFwkXCR7cm9vdG1lfS8uLi8uLi9cJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvTWFrZWZpbGUgOyB0aGVuIFwKKyAgICAgIGVjaG8gXCRcJHtyb290bWV9Ly4uLy4uL2djYy94Z2NjIC1CXCRcJHtyb290bWV9Ly4uLy4uL2djYy8gLWlkaXJhZnRlciBcJFwke3Jvb3RtZX0vLi4vLi4vXCQoVEFSR0VUX1NVQkRJUikvbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyIFwkKHNyY3Jvb3QpL25ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jOyBcCisgICAgZWxzZSBcCisgICAgICBlY2hvIFwkXCR7cm9vdG1lfS8uLi8uLi9nY2MveGdjYyAtQlwkXCR7cm9vdG1lfS8uLi8uLi9nY2MvOyBcCisgICAgZmk7IFwKKyAgZWxzZSBcCisgICAgaWYgdGVzdCAnXCQoaG9zdF9jYW5vbmljYWwpJyA9ICdcJCh0YXJnZXRfY2Fub25pY2FsKScgOyB0aGVuIFwKKyAgICAgIGVjaG8gXCQoQ0MpOyBcCisgICAgZWxzZSBcCisgICAgICB0PSdcJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gZ2NjIHwgc2VkIC1lICdzL3gveC8nIFwkXCR0OyBcCisgICAgZmk7IFwKKyAgZmlcYCAtRSIKKworCisjIFNldCBUQVJHRVRfU1VCRElSLCBuZWVkZWQgYnkgQ1BQX0ZPUl9UQVJHRVQuCitpZiB0ZXN0IHgiJHtob3N0fSIgPSB4IiR7dGFyZ2V0fSIgOyB0aGVuCisJVEFSR0VUX1NVQkRJUj0iLiIKK2Vsc2UKKwlUQVJHRVRfU1VCRElSPSR7dGFyZ2V0X2FsaWFzfQorZmkKKworCisjIFRoZXNlIGFyZW4ndCBhbGwgbmVlZGVkIHlldCwgYnV0IHdpbGwgYmUgZXZlbnR1YWxseS4KK2ZvciBhY19oZHIgaW4gc3RkbGliLmggc3RyaW5nLmggc3RyaW5ncy5oIHRpbWUuaCBzeXMvdGltZXMuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM0NDE6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNDQ2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDUxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCithY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBjY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQHNpbV9lbnZpcm9ubWVudEAlJHNpbV9lbnZpcm9ubWVudCVnCitzJUBzaW1fYWxpZ25tZW50QCUkc2ltX2FsaWdubWVudCVnCitzJUBzaW1fYXNzZXJ0QCUkc2ltX2Fzc2VydCVnCitzJUBzaW1fYml0c2l6ZUAlJHNpbV9iaXRzaXplJWcKK3MlQHNpbV9lbmRpYW5AJSRzaW1fZW5kaWFuJWcKK3MlQHNpbV9ob3N0ZW5kaWFuQCUkc2ltX2hvc3RlbmRpYW4lZworcyVAc2ltX2Zsb2F0QCUkc2ltX2Zsb2F0JWcKK3MlQHNpbV9zY2FjaGVAJSRzaW1fc2NhY2hlJWcKK3MlQHNpbV9kZWZhdWx0X21vZGVsQCUkc2ltX2RlZmF1bHRfbW9kZWwlZworcyVAc2ltX2h3X2NmbGFnc0AlJHNpbV9od19jZmxhZ3MlZworcyVAc2ltX2h3X29ianNAJSRzaW1faHdfb2JqcyVnCitzJUBzaW1faHdAJSRzaW1faHclZworcyVAc2ltX2lubGluZUAlJHNpbV9pbmxpbmUlZworcyVAc2ltX3BhY2thZ2VzQCUkc2ltX3BhY2thZ2VzJWcKK3MlQHNpbV9yZWdwYXJtQCUkc2ltX3JlZ3Bhcm0lZworcyVAc2ltX3Jlc2VydmVkX2JpdHNAJSRzaW1fcmVzZXJ2ZWRfYml0cyVnCitzJUBzaW1fc21wQCUkc2ltX3NtcCVnCitzJUBzaW1fc3RkY2FsbEAlJHNpbV9zdGRjYWxsJWcKK3MlQHNpbV94b3JfZW5kaWFuQCUkc2ltX3hvcl9lbmRpYW4lZworcyVAYnVpbGRfd2FybmluZ3NAJSRidWlsZF93YXJuaW5ncyVnCitzJUBTSEVMTEAlJFNIRUxMJWcKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBob3N0QCUkaG9zdCVnCitzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCitzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKK3MlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZworcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKK3MlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCitzJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCitzJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCitzJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZworcyVAYnVpbGRAJSRidWlsZCVnCitzJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKK3MlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCitzJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZworcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCitzJUBDQ0AlJENDJWcKK3MlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCitzJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZworcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKK3MlQEhERUZJTkVTQCUkSERFRklORVMlZworcyVAQVJAJSRBUiVnCitzJUBSQU5MSUJAJSRSQU5MSUIlZworcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCitzJUBDUFBAJSRDUFAlZworcyVAQUxMT0NBQCUkQUxMT0NBJWcKK3MlQFVTRV9OTFNAJSRVU0VfTkxTJWcKK3MlQE1TR0ZNVEAlJE1TR0ZNVCVnCitzJUBHTVNHRk1UQCUkR01TR0ZNVCVnCitzJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKK3MlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZworcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCitzJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZworcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCitzJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKK3MlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKK3MlQElOVExERVBTQCUkSU5UTERFUFMlZworcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCitzJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKK3MlQFBPRklMRVNAJSRQT0ZJTEVTJWcKK3MlQFBPU1VCQCUkUE9TVUIlZworcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZworcyVAR1RfTk9AJSRHVF9OTyVnCitzJUBHVF9ZRVNAJSRHVF9ZRVMlZworcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZworcyVAbEAlJGwlZworcyVATUFJTlRAJSRNQUlOVCVnCitzJUBzaW1fYnN3YXBAJSRzaW1fYnN3YXAlZworcyVAc2ltX2NmbGFnc0AlJHNpbV9jZmxhZ3MlZworcyVAc2ltX2RlYnVnQCUkc2ltX2RlYnVnJWcKK3MlQHNpbV9zdGRpb0AlJHNpbV9zdGRpbyVnCitzJUBzaW1fdHJhY2VAJSRzaW1fdHJhY2UlZworcyVAc2ltX3Byb2ZpbGVAJSRzaW1fcHJvZmlsZSVnCitzJUBFWEVFWFRAJSRFWEVFWFQlZworcyVAQ1BQX0ZPUl9UQVJHRVRAJSRDUFBfRk9SX1RBUkdFVCVnCitzJUBUQVJHRVRfU1VCRElSQCUkVEFSR0VUX1NVQkRJUiVnCisKK0NFT0YKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KK2FjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCithY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19tb3JlX2xpbmVzPToKK2FjX3NlZF9jbWRzPSIiCit3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBmaQorICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCisgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZWxzZQorICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZmkKKyAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKyAgICBhY19iZWc9JGFjX2VuZAorICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgYWNfc2VkX2NtZHM9Y2F0CitmaQorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitDT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKyAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCisgIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCitzJUBJTlNUQUxMQCUkSU5TVEFMTCVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKKyMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyMKKyMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KK2FjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJworYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCithY19kQz0nXDMnCithY19kRD0nJWcnCisjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKK2FjX3VDPScgJworYWNfdUQ9J1w0JWcnCisjIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY19lQj0nJCVcMSNcMmRlZmluZVwzJworYWNfZUM9JyAnCithY19lRD0nJWcnCisKK2lmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorICBDT05GSUdfSEVBREVSUz0iY2NvbmZpZy5oOmNvbmZpZy5pbiIKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZmkKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKKworICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAorICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KKworRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCisjIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCitybSAtZiBjb25mdGVzdC52YWxzCitjYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCitzL1tcXCYlXS9cXCYvZworcyVbXFwkYF0lXFwmJWcKK3MlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCitzJWFjX2QlYWNfdSVncAorcyVhY191JWFjX2UlZ3AKK0VPRgorc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscworcm0gLWYgY29uZnRlc3QuaGRyCisKKyMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKKyMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCitzJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQorRU9GCisKKyMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgorIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KKworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgOgorZG8KKyAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAorICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCisgIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKKyAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCisgIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUworICBlY2hvICdDRU9GCisgIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0CisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgorJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKKyAgcm0gLWYgY29uZnRlc3QudmFscworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKKyAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCisgIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCisgICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgorICAgIHJtIC1mIGNvbmZ0ZXN0LmgKKyAgZWxzZQorICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgZmkKKyAgICBybSAtZiAkYWNfZmlsZQorICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKKyAgZmkKK2ZpOyBkb25lCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorY2FzZSB4JENPTkZJR19IRUFERVJTIGluIHhjY29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9jb25maWd1cmUuaW4gYi9zaW0vY29tbW9uL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGVhNTM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9jb25maWd1cmUuaW4KQEAgLTAsMCArMSw0MCBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitBQ19QUkVSRVEoMi41KWRubAorQUNfSU5JVChNYWtlZmlsZS5pbikKKworIyBUaGlzIGlzIGludGVuZGVkIGZvciB1c2UgYnkgdGhlIHRhcmdldCBzcGVjaWZpYyBkaXJlY3RvcmllcywgYW5kIGJ5IHVzLgorU0lNX0FDX0NPTU1PTihjY29uZmlnLmgpCisKKyMgUHV0IGEgdXNlZnVsIGNvcHkgb2YgQ1BQX0ZPUl9UQVJHRVQgaW4gTWFrZWZpbGUuCisjIFRoaXMgaXMgb25seSB1c2VkIHRvIGJ1aWxkIHRoZSB0YXJnZXQgdmFsdWVzIGhlYWRlciBmaWxlcy4gIFRoZXNlIGZpbGVzIGFyZQorIyBzaGlwcGVkIHdpdGggZGlzdHJpYnV0aW9ucyBzbyBDUFBfRk9SX1RBUkdFVCBvbmx5IG5lZWRzIHRvIHdvcmsgaW4KKyMgZGV2ZWxvcGVyJ3MgdHJlZXMuICBUaGlzIHZhbHVlIGlzIGJvcnJvd2VkIGZyb20gLi4vLi4vTWFrZWZpbGUuaW4uCitDUFBfRk9SX1RBUkdFVD0iXGAgXAorICBpZiB0ZXN0IC1mIFwkXCR7cm9vdG1lfS8uLi8uLi9nY2MvTWFrZWZpbGUgOyB0aGVuIFwKKyAgICBpZiB0ZXN0IC1mIFwkXCR7cm9vdG1lfS8uLi8uLi9cJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvTWFrZWZpbGUgOyB0aGVuIFwKKyAgICAgIGVjaG8gXCRcJHtyb290bWV9Ly4uLy4uL2djYy94Z2NjIC1CXCRcJHtyb290bWV9Ly4uLy4uL2djYy8gLWlkaXJhZnRlciBcJFwke3Jvb3RtZX0vLi4vLi4vXCQoVEFSR0VUX1NVQkRJUikvbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyIFwkKHNyY3Jvb3QpL25ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jOyBcCisgICAgZWxzZSBcCisgICAgICBlY2hvIFwkXCR7cm9vdG1lfS8uLi8uLi9nY2MveGdjYyAtQlwkXCR7cm9vdG1lfS8uLi8uLi9nY2MvOyBcCisgICAgZmk7IFwKKyAgZWxzZSBcCisgICAgaWYgdGVzdCAnXCQoaG9zdF9jYW5vbmljYWwpJyA9ICdcJCh0YXJnZXRfY2Fub25pY2FsKScgOyB0aGVuIFwKKyAgICAgIGVjaG8gXCQoQ0MpOyBcCisgICAgZWxzZSBcCisgICAgICB0PSdcJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gZ2NjIHwgc2VkIC1lICdzL3gveC8nIFwkXCR0OyBcCisgICAgZmk7IFwKKyAgZmlcYCAtRSIKK0FDX1NVQlNUKENQUF9GT1JfVEFSR0VUKQorCisjIFNldCBUQVJHRVRfU1VCRElSLCBuZWVkZWQgYnkgQ1BQX0ZPUl9UQVJHRVQuCitpZiB0ZXN0IHgiJHtob3N0fSIgPSB4IiR7dGFyZ2V0fSIgOyB0aGVuCisJVEFSR0VUX1NVQkRJUj0iLiIKK2Vsc2UKKwlUQVJHRVRfU1VCRElSPSR7dGFyZ2V0X2FsaWFzfQorZmkKK0FDX1NVQlNUKFRBUkdFVF9TVUJESVIpCisKKyMgVGhlc2UgYXJlbid0IGFsbCBuZWVkZWQgeWV0LCBidXQgd2lsbCBiZSBldmVudHVhbGx5LgorQUNfQ0hFQ0tfSEVBREVSUyhzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdGltZS5oIHN5cy90aW1lcy5oKQorCitBQ19PVVRQVVQoTWFrZWZpbGUsCitbY2FzZSB4JENPTkZJR19IRUFERVJTIGluIHhjY29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjXSkKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vZHYtY29yZS5jIGIvc2ltL2NvbW1vbi9kdi1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmNGY2OAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vZHYtY29yZS5jCkBAIC0wLDAgKzEsMTE4IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKyAgICAKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgICAgCisgICAgKi8KKworCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJody1tYWluLmgiCisKKy8qIERFVklDRQorICAgCisgICBjb3JlIC0gcm9vdCBvZiB0aGUgZGV2aWNlIHRyZWUKKyAgIAorICAgREVTQ1JJUFRJT04KKyAgIAorICAgVGhlIGNvcmUgZGV2aWNlLCBwb3NpdGlvbmVkIGF0IHRoZSByb290IG9mIHRoZSBkZXZpY2UgdHJlZSBhcHBlYXJzCisgICB0byBpdHMgY2hpbGQgZGV2aWNlcyBhcyBhIG5vcm1hbCBkZXZpY2UganVzdCBsaWtlIGV2ZXJ5IG90aGVyCisgICBkZXZpY2UgaW4gdGhlIHRyZWUuCisKKyAgIEludGVybmFsbHkgaXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSBjb3JlIG9iamVjdC4gIFJlcXVlc3RzIHRvCisgICBhdHRhY2ggKG9yIGRldGFjaCkgYWRkcmVzcyBzcGFjZXMgYXJlIHBhc3NlZCB0byB0aGF0IGNvcmUgb2JqZWN0LgorICAgUmVxdWVzdHMgdG8gdHJhbnNmZXIgKERNQSkgZGF0YSBhcmUgcmVmbGVjdGVkIGJhY2sgZG93biB0aGUgZGV2aWNlCisgICB0cmVlIHVzaW5nIHRoZSBjb3JlX21hcCBkYXRhIHRyYW5zZmVyIG1ldGhvZHMuCisKKyAgIFBST1BFUlRJRVMKKworICAgTm9uZS4KKworICAgKi8KKworCitzdGF0aWMgdm9pZAorZHZfY29yZV9hdHRhY2hfYWRkcmVzc19jYWxsYmFjayAoc3RydWN0IGh3ICptZSwKKwkJCQkgaW50IGxldmVsLAorCQkJCSBpbnQgc3BhY2UsCisJCQkJIGFkZHJlc3Nfd29yZCBhZGRyLAorCQkJCSBhZGRyZXNzX3dvcmQgbnJfYnl0ZXMsCisJCQkJIHN0cnVjdCBodyAqY2xpZW50KQoreworICBIV19UUkFDRSAoKG1lLCAiYXR0YWNoIC0gbGV2ZWw9JWQsIHNwYWNlPSVkLCBhZGRyPTB4JWx4LCBucl9ieXRlcz0lbGQsIGNsaWVudD0lcyIsCisJICAgICBsZXZlbCwgc3BhY2UsICh1bnNpZ25lZCBsb25nKSBhZGRyLCAodW5zaWduZWQgbG9uZykgbnJfYnl0ZXMsIGh3X3BhdGggKGNsaWVudCkpKTsKKyAgLyogTk9URTogQXQgcHJlc2V0IHRoZSBzcGFjZSBpcyBhc3N1bWVkIHRvIGJlIHplcm8uICBQZXJoYXBocyB0aGUKKyAgICAgc3BhY2Ugc2hvdWxkIGJlIG1hcHBlZCBvbnRvIHNvbWV0aGluZyBmb3IgaW5zdGFuY2U6IHNwYWNlMCAtCisgICAgIHVuaWZpZWQgbWVtb3J5OyBzcGFjZTEgLSBJTyBtZW1vcnk7IC4uLiAqLworICBpZiAoc3BhY2UgIT0gMCkKKyAgICBod19hYm9ydCAobWUsICJIZXkhIFVua25vd24gc3BhY2UgJWQiLCBzcGFjZSk7CisgIHNpbV9jb3JlX2F0dGFjaCAoaHdfc3lzdGVtIChtZSksCisJCSAgIE5VTEwsIC8qY3B1Ki8KKwkJICAgbGV2ZWwsCisJCSAgIGFjY2Vzc19yZWFkX3dyaXRlX2V4ZWMsCisJCSAgIHNwYWNlLCBhZGRyLAorCQkgICBucl9ieXRlcywKKwkJICAgMCwgLyogbW9kdWxvICovCisJCSAgIGNsaWVudCwKKwkJICAgTlVMTCk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkCitkdl9jb3JlX2RtYV9yZWFkX2J1ZmZlcl9jYWxsYmFjayAoc3RydWN0IGh3ICptZSwKKwkJCQkgIHZvaWQgKmRlc3QsCisJCQkJICBpbnQgc3BhY2UsCisJCQkJICB1bnNpZ25lZF93b3JkIGFkZHIsCisJCQkJICB1bnNpZ25lZCBucl9ieXRlcykKK3sKKyAgcmV0dXJuIHNpbV9jb3JlX3JlYWRfYnVmZmVyIChod19zeXN0ZW0gKG1lKSwKKwkJCSAgICAgICBOVUxMLCAvKkNQVSovCisJCQkgICAgICAgc3BhY2UsIC8qPz8/Ki8KKwkJCSAgICAgICBkZXN0LAorCQkJICAgICAgIGFkZHIsCisJCQkgICAgICAgbnJfYnl0ZXMpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZAorZHZfY29yZV9kbWFfd3JpdGVfYnVmZmVyX2NhbGxiYWNrIChzdHJ1Y3QgaHcgKm1lLAorCQkJCSAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKKwkJCQkgICBpbnQgc3BhY2UsCisJCQkJICAgdW5zaWduZWRfd29yZCBhZGRyLAorCQkJCSAgIHVuc2lnbmVkIG5yX2J5dGVzLAorCQkJCSAgIGludCB2aW9sYXRlX3JlYWRfb25seV9zZWN0aW9uKQoreworICByZXR1cm4gc2ltX2NvcmVfd3JpdGVfYnVmZmVyIChod19zeXN0ZW0gKG1lKSwKKwkJCQlOVUxMLCAvKmNwdSovCisJCQkJc3BhY2UsIC8qPz8/Ki8KKwkJCQlzb3VyY2UsCisJCQkJYWRkciwKKwkJCQlucl9ieXRlcyk7Cit9CisKKworc3RhdGljIHZvaWQKK2R2X2NvcmVfZmluaXNoIChzdHJ1Y3QgaHcgKm1lKQoreworICBzZXRfaHdfYXR0YWNoX2FkZHJlc3MgKG1lLCBkdl9jb3JlX2F0dGFjaF9hZGRyZXNzX2NhbGxiYWNrKTsKKyAgc2V0X2h3X2RtYV93cml0ZV9idWZmZXIgKG1lLCBkdl9jb3JlX2RtYV93cml0ZV9idWZmZXJfY2FsbGJhY2spOworICBzZXRfaHdfZG1hX3JlYWRfYnVmZmVyIChtZSwgZHZfY29yZV9kbWFfcmVhZF9idWZmZXJfY2FsbGJhY2spOworfQorCitjb25zdCBzdHJ1Y3QgaHdfZGVzY3JpcHRvciBkdl9jb3JlX2Rlc2NyaXB0b3JbXSA9IHsKKyAgeyAiY29yZSIsIGR2X2NvcmVfZmluaXNoLCB9LAorICB7IE5VTEwgfSwKK307CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2R2LWdsdWUuYyBiL3NpbS9jb21tb24vZHYtZ2x1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMzU1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL2R2LWdsdWUuYwpAQCAtMCwwICsxLDM3MyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisgICAgCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsMTk5OCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorICAgIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgICAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAgICAKKyAgICAqLworCisKKyNpbmNsdWRlICJody1tYWluLmgiCisKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKworLyogREVWSUNFCisgICAKKworICAgZ2x1ZSAtIGdsdWUgdG8gaW50ZXJjb25uZWN0IGFuZCB0ZXN0IGhhcmR3YXJlIHBvcnRzCisgICAKKworICAgREVTQ1JJUFRJT04KKyAgIAorCisgICBUaGUgZ2x1ZSBkZXZpY2UgcHJvdmlkZXMgdHdvIGZ1bmN0aW9ucy4gIEZpcnN0bHksIGl0IHByb3ZpZGVzIGEKKyAgIG1lY2hhbmlzbSBmb3IgaW5zcGVjdGluZyBhbmQgZHJpdmluZyB0aGUgcG9ydCBuZXR3b3JrLiAgU2Vjb25kbHksCisgICBpdCBwcm92aWRlcyBhIHNldCBvZiBib29sZWFuIHByaW1pdGl2ZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBhcHBseQorICAgY29tYmluYXRvcmlhbCBvcGVyYXRpb25zIHRvIHRoZSBwb3J0IG5ldHdvcmsuCisKKyAgIEdsdWUgZGV2aWNlcyBoYXZlIGEgdmFyaWFibGUgbnVtYmVyIG9mIGJpZyBlbmRpYW4gPDxvdXRwdXQ+PgorICAgcmVnaXN0ZXJzLiAgRWFjaCByZWdpc3RlciBpcyB0YXJnZXQtd29yZCBzaXplZC4gIFRoZSByZWdpc3RlcnMgY2FuCisgICBiZSByZWFkIGFuZCB3cml0dGVuLgorCisgICBXcml0aW5nIHRvIGFuIG91dHB1dCByZWdpc3RlciByZXN1bHRzIGluIGFuIGV2ZW50IGJlaW5nIGRyaXZlbgorICAgKGxldmVsIGRldGVybWluZWQgYnkgdGhlIHZhbHVlIHdyaXR0ZW4pIG9uIHRoZSBkZXZpY2VzCisgICBjb3JyZXNwb25kaW5nIG91dHB1dCBwb3J0LgorCisgICBSZWFkaW5nIGFuIDw8b3V0cHV0Pj4gcmVnaXN0ZXIgcmV0dXJucyBlaXRoZXIgdGhlIGxhc3QgdmFsdWUKKyAgIHdyaXR0ZW4gb3IgdGhlIG1vc3QgcmVjZW50bHkgY29tcHV0ZWQgdmFsdWUgKGZvciB0aGF0IHJlZ2lzdGVyKSBhcworICAgYSByZXN1bHQgb2YgYW4gZXZlbnQgYXJpdmluZyBvbiB0aGF0IHBvcnQgKHdoaWNoIGV2ZXIgd2FzIGNvbXB1dGVkCisgICBsYXN0KS4KKworICAgQXQgcHJlc2VudCB0aGUgZm9sbG93aW5nIHN1YiBkZXZpY2UgdHlwZXMgYXJlIGF2YWlsYWJsZToKKworICAgPDxnbHVlPj46IEluIGFkZGl0aW9uIHRvIGRyaXZpbmcgaXRzIG91dHB1dCBpbnRlcnJ1cHQgcG9ydCB3aXRoIGFueQorICAgdmFsdWUgd3JpdHRlbiB0byBhbiBpbnRlcnJ1cHQgaW5wdXQgcG9ydCBpcyBzdG9yZWQgaW4gdGhlCisgICBjb3JyZXNwb25kaW5nIDw8b3V0cHV0Pj4gcmVnaXN0ZXIuICBTdWNoIGlucHV0IGludGVycnVwdHMsIGhvd2V2ZXIsCisgICBhcmUgbm90IHByb3BvZ2F0ZWQgdG8gYW4gb3V0cHV0IGludGVycnVwdCBwb3J0LgorCisgICA8PGdsdWUtYW5kPj46IFRoZSBiaXQtd2lzZSBBTkQgb2YgdGhlIGludGVycnVwdCBpbnB1dHMgaXMgY29tcHV0ZWQKKyAgIGFuZCB0aGVuIGJvdGggc3RvcmVkIGluIDw8b3V0cHV0Pj4gcmVnaXN0ZXIgemVybyBhbmQgcHJvcG9nYXRlZCB0bworICAgb3V0cHV0IGludGVycnVwdCBvdXRwdXQgcG9ydCB6ZXJvLgorCisKKyAgIFBST1BFUlRJRVMKKyAgIAorCisgICByZWcgPSA8YWRkcmVzcz4gPHNpemU+IChyZXF1aXJlZCkKKworICAgU3BlY2lmeSB0aGUgYWRkcmVzcyAod2l0aGluIHRoZSBwYXJlbnQgYnVzKSB0aGF0IHRoaXMgZGV2aWNlIGlzIHRvCisgICBsaXZlLiAgVGhlIGFkZHJlc3MgbXVzdCBiZSAyMDQ4ICogc2l6ZW9mICh3b3JkKSAoOGsgaW4gYSAzMmJpdAorICAgc2ltdWxhdGlvbikgYWxpZ25lZC4KKworCisgICBpbnRlcnJ1cHQtcmFuZ2VzID0gPGludC1udW1iZXI+IDxyYW5nZT4gKG9wdGlvbmFsKQorCisgICBJZiBwcmVzZW50LCB0aGlzIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHZhbGlkIGludGVycnVwdCBpbnB1dHMgKHVwCisgICB0byB0aGUgbWF4aW11bSBvZiAyMDQ4KS4gIEJ5IGRlZmF1bHQsIDw8aW50LW51bWJlcj4+IGlzIHplcm8gYW5kCisgICByYW5nZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSA8PHJlZz4+IHNpemUuCisKKworICAgUE9SVFMKKworICAgCisgICBpbnRbMC4uXSAoaW5wdXQsIG91dHB1dCkKKworICAgQm90aCBhbiBpbnB1dCBhbmQgYW4gb3V0cHV0IHBvcnQuCisKKworICAgRVhBTVBMRVMKKworCisgICBFbmFibGUgdHJhY2luZyBvZiB0aGUgZGV2aWNlOgorCisgICB8IC10IGdsdWUtZGV2aWNlIFwKKworCisgICBDcmVhdGUgc291cmNlLCBiaXR3aXplLWFuZCwgYW5kIHNpbmsgZ2x1ZSBkZXZpY2VzLiAgU2luY2UgdGhlCisgICBkZXZpY2UgYXQgYWRkcmVzcyA8PDB4MTAwMDA+PiBpcyBvZiBzaXplIDw8OD4+IGl0IHdpbGwgaGF2ZSB0d28KKyAgIG91dHB1dCBpbnRlcnJ1cHQgcG9ydHMuCisKKyAgIHwgLW8gJy9pb2J1c0AweGYwMDAwMDAwL2dsdWVAMHgxMDAwMC9yZWcgMHgxMDAwMCA4JyBcCisgICB8IC1vICcvaW9idXNAMHhmMDAwMDAwMC9nbHVlLWFuZEAweDIwMDAwL3JlZyAweDIwMDAwIDQnIFwKKyAgIHwgLW8gJy9pb2J1c0AweGYwMDAwMDAwL2dsdWUtYW5kL2ludGVycnVwdC1yYW5nZXMgMCAyJyBcCisgICB8IC1vICcvaW9idXNAMHhmMDAwMDAwMC9nbHVlQDB4MzAwMDAvcmVnIDB4MzAwMDAgNCcgXAorCisKKyAgIFdpcmUgdGhlIHR3byBzb3VyY2UgaW50ZXJydXB0cyB0byB0aGUgQU5EIGRldmljZToKKworICAgfCAtbyAnL2lvYnVzQDB4ZjAwMDAwMDAvZ2x1ZUAweDEwMDAwID4gMCAwIC9pb2J1cy9nbHVlLWFuZCcgXAorICAgfCAtbyAnL2lvYnVzQDB4ZjAwMDAwMDAvZ2x1ZUAweDEwMDAwID4gMSAxIC9pb2J1cy9nbHVlLWFuZCcgXAorCisKKyAgIFdpcmUgdGhlIEFORCBkZXZpY2UgdXAgdG8gdGhlIHNpbmsgc28gdGhhdCB0aGUgYW5kJ3Mgb3V0cHV0IGlzIG5vdAorICAgbGVmdCBvcGVuLgorCisgICB8IC1vICcvaW9idXNAMHhmMDAwMDAwMC9nbHVlLWFuZCA+IDAgMCAvaW9idXMvZ2x1ZUAweDMwMDAwJyBcCisKKworICAgV2l0aCB0aGUgYWJvdmUgY29uZmlndXJhdGlvbi4gIFRoZSBjbGllbnQgcHJvZ3JhbSBpcyBhYmxlIHRvCisgICBjb21wdXRlIGEgdHdvIGJpdCBBTkQuICBGb3IgaW5zdGFuY2UgdGhlIDw8Qz4+IHN0dWIgYmVsb3cgcHJpbnRzIDEKKyAgIEFORCAwLgorCisgICB8ICB1bnNpZ25lZCAqaW5wdXQgPSAodm9pZCopMHhmMDAxMDAwMDsKKyAgIHwgIHVuc2lnbmVkICpvdXRwdXQgPSAodm9pZCopMHhmMDAzMDAwMDsKKyAgIHwgIHVuc2lnbmVkIGFuczsKKyAgIHwgIGlucHV0WzBdID0gaHRvbmwoMSk7CisgICB8ICBpbnB1dFsxXSA9IGh0b25sKDApOworICAgfCAgYW5zID0gbnRvaGwoKm91dHB1dCk7CisgICB8ICB3cml0ZV9zdHJpbmcoIkFORCBpcyAiKTsKKyAgIHwgIHdyaXRlX2ludChhbnMpOworICAgfCAgd3JpdGVfbGluZSgpOworICAgCisKKyAgIEJVR1MKKworICAgCisgICBBIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGRldmljZSBtYXkgc3VwcG9ydCBtdWx0aXBsZQorICAgaW50ZXJydXB0IHJhbmdlcy4KKworICAgU29tZSBvZiB0aGUgZGV2aWNlcyBsaXN0ZWQgbWF5IG5vdCB5ZXQgYmUgZnVsbHkgaW1wbGVtZW50ZWQuCisKKyAgIEFkZGl0aW9uYWwgZGV2aWNlcyBzdWNoIGFzIGEgRCBmbGlwLWZsb3AgKERGRiksIGFuIGludmVydGVyIChJTlYpCisgICBvciBhIGxhdGNoIChMQVQpIG1heSBwcm92ZSB1c2VmdWwuCisKKyAgICovCisKKworZW51bSB7CisgIG1heF9ucl9wb3J0cyA9IDIwNDgsCit9OworCitlbnVtIGh3X2dsdWVfdHlwZSB7CisgIGdsdWVfdW5kZWZpbmVkID0gMCwKKyAgZ2x1ZV9pbywKKyAgZ2x1ZV9hbmQsCisgIGdsdWVfbmFuZCwKKyAgZ2x1ZV9vciwKKyAgZ2x1ZV94b3IsCisgIGdsdWVfbm9yLAorICBnbHVlX25vdCwKK307CisKK3N0cnVjdCBod19nbHVlIHsKKyAgZW51bSBod19nbHVlX3R5cGUgdHlwZTsKKyAgaW50IGludF9udW1iZXI7CisgIGludCAqaW5wdXQ7CisgIGludCBucl9pbnB1dHM7CisgIHVuc2lnbmVkIHNpemVvZl9pbnB1dDsKKyAgLyogb3VyIG91dHB1dCByZWdpc3RlcnMgKi8KKyAgaW50IHNwYWNlOworICB1bnNpZ25lZF93b3JkIGFkZHJlc3M7CisgIHVuc2lnbmVkIHNpemVvZl9vdXRwdXQ7CisgIGludCAqb3V0cHV0OworICBpbnQgbnJfb3V0cHV0czsKK307CisKKworc3RhdGljIGh3X2lvX3JlYWRfYnVmZmVyX21ldGhvZCBod19nbHVlX2lvX3JlYWRfYnVmZmVyOworc3RhdGljIGh3X2lvX3dyaXRlX2J1ZmZlcl9tZXRob2QgaHdfZ2x1ZV9pb193cml0ZV9idWZmZXI7CitzdGF0aWMgaHdfcG9ydF9ldmVudF9tZXRob2QgaHdfZ2x1ZV9wb3J0X2V2ZW50OworY29uc3Qgc3RhdGljIHN0cnVjdCBod19wb3J0X2Rlc2NyaXB0b3IgaHdfZ2x1ZV9wb3J0c1tdOworCitzdGF0aWMgdm9pZAoraHdfZ2x1ZV9maW5pc2ggKHN0cnVjdCBodyAqbWUpCit7CisgIHN0cnVjdCBod19nbHVlICpnbHVlID0gSFdfWkFMTE9DIChtZSwgc3RydWN0IGh3X2dsdWUpOworICAKKyAgLyogZXN0YWJsaXNoIG91ciBvd24gbWV0aG9kcyAqLworICBzZXRfaHdfZGF0YSAobWUsIGdsdWUpOworICBzZXRfaHdfaW9fcmVhZF9idWZmZXIgKG1lLCBod19nbHVlX2lvX3JlYWRfYnVmZmVyKTsKKyAgc2V0X2h3X2lvX3dyaXRlX2J1ZmZlciAobWUsIGh3X2dsdWVfaW9fd3JpdGVfYnVmZmVyKTsKKyAgc2V0X2h3X3BvcnRzIChtZSwgaHdfZ2x1ZV9wb3J0cyk7CisgIHNldF9od19wb3J0X2V2ZW50IChtZSwgaHdfZ2x1ZV9wb3J0X2V2ZW50KTsKKworICAvKiBhdHRhY2ggdG8gb3VyIHBhcmVudCBidXMgKi8KKyAgZG9faHdfYXR0YWNoX3JlZ3MgKG1lKTsKKyAgCisgIC8qIGVzdGFibGlzaCB0aGUgb3V0cHV0IHJlZ2lzdGVycyAqLworICB7CisgICAgcmVnX3Byb3BlcnR5X3NwZWMgdW5pdDsKKyAgICBpbnQgcmVnX25yOworICAgIC8qIGZpbmQgYSByZWxldmFudCByZWcgZW50cnkgKi8KKyAgICByZWdfbnIgPSAwOworICAgIHdoaWxlIChod19maW5kX3JlZ19hcnJheV9wcm9wZXJ0eSAobWUsICJyZWciLCByZWdfbnIsICZ1bml0KQorCSAgICYmICFod191bml0X3NpemVfdG9fYXR0YWNoX3NpemUgKGh3X3BhcmVudCAobWUpLAorCQkJCQkgICAgJnVuaXQuc2l6ZSwKKwkJCQkJICAgICZnbHVlLT5zaXplb2Zfb3V0cHV0LAorCQkJCQkgICAgbWUpKQorICAgICAgcmVnX25yKys7CisgICAgLyogY2hlY2sgb3V0IHRoZSBzaXplICovCisgICAgaWYgKGdsdWUtPnNpemVvZl9vdXRwdXQgPT0gMCkKKyAgICAgIGh3X2Fib3J0IChtZSwgImF0IGxlYXN0IG9uZSByZWcgcHJvcGVydHkgc2l6ZSBtdXN0IGJlIG5vbnplcm8iKTsKKyAgICBpZiAoZ2x1ZS0+c2l6ZW9mX291dHB1dCAlIHNpemVvZiAodW5zaWduZWRfd29yZCkgIT0gMCkKKyAgICAgIGh3X2Fib3J0IChtZSwgInJlZyBwcm9wZXJ0eSBzaXplIG11c3QgYmUgJWQgYWxpZ25lZCIsCisJCXNpemVvZiAodW5zaWduZWRfd29yZCkpOworICAgIC8qIGFuZCB0aGUgYWRkcmVzcyAqLworICAgIGh3X3VuaXRfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyAoaHdfcGFyZW50IChtZSksCisJCQkJICAgICAgICZ1bml0LmFkZHJlc3MsCisJCQkJICAgICAgICZnbHVlLT5zcGFjZSwKKwkJCQkgICAgICAgJmdsdWUtPmFkZHJlc3MsCisJCQkJICAgICAgIG1lKTsKKyAgICBpZiAoZ2x1ZS0+YWRkcmVzcyAlIChzaXplb2YgKHVuc2lnbmVkX3dvcmQpICogbWF4X25yX3BvcnRzKSAhPSAwKQorICAgICAgaHdfYWJvcnQgKG1lLCAicmVnIHByb3BlcnR5IGFkZHJlc3MgbXVzdCBiZSAlZCBhbGlnbmVkIiwKKwkJc2l6ZW9mICh1bnNpZ25lZF93b3JkKSAqIG1heF9ucl9wb3J0cyk7CisgICAgZ2x1ZS0+bnJfb3V0cHV0cyA9IGdsdWUtPnNpemVvZl9vdXRwdXQgLyBzaXplb2YgKHVuc2lnbmVkX3dvcmQpOworICAgIGdsdWUtPm91dHB1dCA9IGh3X3phbGxvYyAobWUsIGdsdWUtPnNpemVvZl9vdXRwdXQpOworICB9CisgIAorICAvKiBlc3RhYmxpc2ggdGhlIGlucHV0IHBvcnRzICovCisgIHsKKyAgICBjb25zdCBzdHJ1Y3QgaHdfcHJvcGVydHkgKnJhbmdlczsKKyAgICByYW5nZXMgPSBod19maW5kX3Byb3BlcnR5IChtZSwgImludGVycnVwdC1yYW5nZXMiKTsKKyAgICBpZiAocmFuZ2VzID09IE5VTEwpCisgICAgICB7CisJZ2x1ZS0+aW50X251bWJlciA9IDA7CisJZ2x1ZS0+bnJfaW5wdXRzID0gZ2x1ZS0+bnJfb3V0cHV0czsKKyAgICAgIH0KKyAgICBlbHNlIGlmIChyYW5nZXMtPnNpemVvZl9hcnJheSAhPSBzaXplb2YgKHVuc2lnbmVkX2NlbGwpICogMikKKyAgICAgIHsKKwlod19hYm9ydCAobWUsICJpbnZhbGlkIGludGVycnVwdC1yYW5nZXMgcHJvcGVydHkgKGluY29ycmVjdCBzaXplKSIpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwljb25zdCB1bnNpZ25lZF9jZWxsICppbnRfcmFuZ2UgPSByYW5nZXMtPmFycmF5OworCWdsdWUtPmludF9udW1iZXIgPSBCRTJIX2NlbGwgKGludF9yYW5nZVswXSk7CisJZ2x1ZS0+bnJfaW5wdXRzID0gQkUySF9jZWxsIChpbnRfcmFuZ2VbMV0pOworICAgICAgfQorICAgIGdsdWUtPnNpemVvZl9pbnB1dCA9IGdsdWUtPm5yX2lucHV0cyAqIHNpemVvZiAodW5zaWduZWQpOworICAgIGdsdWUtPmlucHV0ID0gaHdfemFsbG9jIChtZSwgZ2x1ZS0+c2l6ZW9mX2lucHV0KTsKKyAgfQorICAKKyAgLyogZGV0ZXJtaW5lIG91ciB0eXBlICovCisgIHsKKyAgICBjb25zdCBjaGFyICpuYW1lID0gaHdfbmFtZShtZSk7CisgICAgaWYgKHN0cmNtcCAobmFtZSwgImdsdWUiKSA9PSAwKQorICAgICAgZ2x1ZS0+dHlwZSA9IGdsdWVfaW87CisgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiZ2x1ZS1hbmQiKSA9PSAwKQorICAgICAgZ2x1ZS0+dHlwZSA9IGdsdWVfYW5kOworICAgIGVsc2UKKyAgICAgIGh3X2Fib3J0IChtZSwgInVuaW1wbGVtZW50ZWQgZ2x1ZSB0eXBlIik7CisgIH0KKyAgCisgIEhXX1RSQUNFICgobWUsICJpbnQtbnVtYmVyICVkLCBucl9pbnB1dHMgJWQsIG5yX291dHB1dHMgJWQiLAorCSAgICAgZ2x1ZS0+aW50X251bWJlciwgZ2x1ZS0+bnJfaW5wdXRzLCBnbHVlLT5ucl9vdXRwdXRzKSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAoraHdfZ2x1ZV9pb19yZWFkX2J1ZmZlciAoc3RydWN0IGh3ICptZSwKKwkJCXZvaWQgKmRlc3QsCisJCQlpbnQgc3BhY2UsCisJCQl1bnNpZ25lZF93b3JkIGFkZHIsCisJCQl1bnNpZ25lZCBucl9ieXRlcykKK3sKKyAgc3RydWN0IGh3X2dsdWUgKmdsdWUgPSAoc3RydWN0IGh3X2dsdWUgKikgaHdfZGF0YSAobWUpOworICBpbnQgcmVnID0gKChhZGRyIC0gZ2x1ZS0+YWRkcmVzcykgLyBzaXplb2YgKHVuc2lnbmVkX3dvcmQpKSAlIGdsdWUtPm5yX291dHB1dHM7CisgIGlmIChucl9ieXRlcyAhPSBzaXplb2YgKHVuc2lnbmVkX3dvcmQpCisgICAgICB8fCAoYWRkciAlIHNpemVvZiAodW5zaWduZWRfd29yZCkpICE9IDApCisgICAgaHdfYWJvcnQgKG1lLCAibWlzc2FsaWduZWQgcmVhZCBhY2Nlc3MgKCVkOjB4JWx4OiVkKSBub3Qgc3VwcG9ydGVkIiwKKwkgICAgICBzcGFjZSwgKHVuc2lnbmVkIGxvbmcpYWRkciwgbnJfYnl0ZXMpOworICAqKHVuc2lnbmVkX3dvcmQqKWRlc3QgPSBIMkJFXzQoZ2x1ZS0+b3V0cHV0W3JlZ10pOworICBIV19UUkFDRSAoKG1lLCAicmVhZCAtIHBvcnQgJWQgKDB4JWx4KSwgbGV2ZWwgJWQiLAorCSAgICAgcmVnLCAodW5zaWduZWQgbG9uZykgYWRkciwgZ2x1ZS0+b3V0cHV0W3JlZ10pKTsKKyAgcmV0dXJuIG5yX2J5dGVzOworfQorCisKK3N0YXRpYyB1bnNpZ25lZAoraHdfZ2x1ZV9pb193cml0ZV9idWZmZXIgKHN0cnVjdCBodyAqbWUsCisJCQkgY29uc3Qgdm9pZCAqc291cmNlLAorCQkJIGludCBzcGFjZSwKKwkJCSB1bnNpZ25lZF93b3JkIGFkZHIsCisJCQkgdW5zaWduZWQgbnJfYnl0ZXMpCit7CisgIHN0cnVjdCBod19nbHVlICpnbHVlID0gKHN0cnVjdCBod19nbHVlICopIGh3X2RhdGEgKG1lKTsKKyAgaW50IHJlZyA9ICgoYWRkciAtIGdsdWUtPmFkZHJlc3MpIC8gc2l6ZW9mICh1bnNpZ25lZF93b3JkKSkgJSBtYXhfbnJfcG9ydHM7CisgIGlmIChucl9ieXRlcyAhPSBzaXplb2YgKHVuc2lnbmVkX3dvcmQpCisgICAgICB8fCAoYWRkciAlIHNpemVvZiAodW5zaWduZWRfd29yZCkpICE9IDApCisgICAgaHdfYWJvcnQgKG1lLCAibWlzc2FsaWduZWQgd3JpdGUgYWNjZXNzICglZDoweCVseDolZCkgbm90IHN1cHBvcnRlZCIsCisJICAgICAgc3BhY2UsICh1bnNpZ25lZCBsb25nKSBhZGRyLCBucl9ieXRlcyk7CisgIGdsdWUtPm91dHB1dFtyZWddID0gSDJCRV80ICgqKHVuc2lnbmVkX3dvcmQqKXNvdXJjZSk7CisgIEhXX1RSQUNFICgobWUsICJ3cml0ZSAtIHBvcnQgJWQgKDB4JWx4KSwgbGV2ZWwgJWQiLAorCSAgICAgcmVnLCAodW5zaWduZWQgbG9uZykgYWRkciwgZ2x1ZS0+b3V0cHV0W3JlZ10pKTsKKyAgaHdfcG9ydF9ldmVudCAobWUsIHJlZywgZ2x1ZS0+b3V0cHV0W3JlZ10pOworICByZXR1cm4gbnJfYnl0ZXM7Cit9CisKK3N0YXRpYyB2b2lkCitod19nbHVlX3BvcnRfZXZlbnQgKHN0cnVjdCBodyAqbWUsCisJCSAgICBpbnQgbXlfcG9ydCwKKwkJICAgIHN0cnVjdCBodyAqc291cmNlLAorCQkgICAgaW50IHNvdXJjZV9wb3J0LAorCQkgICAgaW50IGxldmVsKQoreworICBzdHJ1Y3QgaHdfZ2x1ZSAqZ2x1ZSA9IChzdHJ1Y3QgaHdfZ2x1ZSAqKSBod19kYXRhIChtZSk7CisgIGludCBpOworICBpZiAobXlfcG9ydCA8IGdsdWUtPmludF9udW1iZXIKKyAgICAgIHx8IG15X3BvcnQgPj0gZ2x1ZS0+aW50X251bWJlciArIGdsdWUtPm5yX2lucHV0cykKKyAgICBod19hYm9ydCAobWUsICJwb3J0ICVkIG91dHNpZGUgb2YgdmFsaWQgcmFuZ2UiLCBteV9wb3J0KTsKKyAgZ2x1ZS0+aW5wdXRbbXlfcG9ydCAtIGdsdWUtPmludF9udW1iZXJdID0gbGV2ZWw7CisgIHN3aXRjaCAoZ2x1ZS0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBnbHVlX2lvOgorICAgICAgeworCWludCBwb3J0ID0gbXlfcG9ydCAlIGdsdWUtPm5yX291dHB1dHM7CisJZ2x1ZS0+b3V0cHV0W3BvcnRdID0gbGV2ZWw7CisJSFdfVFJBQ0UgKChtZSwgImlucHV0IC0gcG9ydCAlZCAoMHglbHgpLCBsZXZlbCAlZCIsCisJCSAgIG15X3BvcnQsCisJCSAgICh1bnNpZ25lZCBsb25nKSBnbHVlLT5hZGRyZXNzICsgcG9ydCAqIHNpemVvZiAodW5zaWduZWRfd29yZCksCisJCSAgIGxldmVsKSk7CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBnbHVlX2FuZDoKKyAgICAgIHsKKwlnbHVlLT5vdXRwdXRbMF0gPSBnbHVlLT5pbnB1dFswXTsKKwlmb3IgKGkgPSAxOyBpIDwgZ2x1ZS0+bnJfaW5wdXRzOyBpKyspCisJICBnbHVlLT5vdXRwdXRbMF0gJj0gZ2x1ZS0+aW5wdXRbaV07CisJSFdfVFJBQ0UgKChtZSwgImFuZCAtIHBvcnQgJWQsIGxldmVsICVkIGFycml2ZWQgLSBvdXRwdXQgJWQiLAorCQkgICBteV9wb3J0LCBsZXZlbCwgZ2x1ZS0+b3V0cHV0WzBdKSk7CisJaHdfcG9ydF9ldmVudCAobWUsIDAsIGdsdWUtPm91dHB1dFswXSk7CisJYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHsKKwlod19hYm9ydCAobWUsICJvcGVyYXRvciBub3QgaW1wbGVtZW50ZWQiKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICB9Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod19wb3J0X2Rlc2NyaXB0b3IgaHdfZ2x1ZV9wb3J0c1tdID0geworICB7ICJpbnQiLCAwLCBtYXhfbnJfcG9ydHMgfSwKKyAgeyBOVUxMIH0KK307CisKKworY29uc3Qgc3RydWN0IGh3X2Rlc2NyaXB0b3IgZHZfZ2x1ZV9kZXNjcmlwdG9yW10gPSB7CisgIHsgImdsdWUiLCBod19nbHVlX2ZpbmlzaCwgfSwKKyAgeyAiZ2x1ZS1hbmQiLCBod19nbHVlX2ZpbmlzaCwgfSwKKyAgeyAiZ2x1ZS1uYW5kIiwgaHdfZ2x1ZV9maW5pc2gsIH0sCisgIHsgImdsdWUtb3IiLCBod19nbHVlX2ZpbmlzaCwgfSwKKyAgeyAiZ2x1ZS14b3IiLCBod19nbHVlX2ZpbmlzaCwgfSwKKyAgeyAiZ2x1ZS1ub3IiLCBod19nbHVlX2ZpbmlzaCwgfSwKKyAgeyAiZ2x1ZS1ub3QiLCBod19nbHVlX2ZpbmlzaCwgfSwKKyAgeyBOVUxMIH0sCit9OwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9kdi1wYWwuYyBiL3NpbS9jb21tb24vZHYtcGFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxYmRlNwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vZHYtcGFsLmMKQEAgLTAsMCArMSw2MDUgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorICAgIAorICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LDE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICAgIAorICAgICovCisKKworI2luY2x1ZGUgImh3LW1haW4uaCIKKyNpbmNsdWRlICJzaW0taW8uaCIKKworLyogTk9URTogcGFsIGlzIG5hdWdodHkgYW5kIGdydWJzIGFyb3VuZCBsb29raW5nIGF0IHRoaW5ncyBvdXRzaWRlIG9mCisgICBpdHMgaW1tZWRpYXRlIGRvbWFpbiAqLworI2luY2x1ZGUgImh3LXRyZWUuaCIKKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKy8qIERFVklDRQorCisgICAKKyAgIHBhbCAtIGdsdWUgbG9naWMgZGV2aWNlIGNvbnRhaW5pbmcgYXNzb3J0ZWQganVuaworCisgICAKKyAgIERFU0NSSVBUSU9OCisKKyAgIAorICAgVHlwaWNhbCBoYXJkd2FyZSBkZXBlbmRhbnQgaGFjay4gIFRoaXMgZGV2aWNlIGFsbG93cyB0aGUgZmlybXdhcmUKKyAgIHRvIGdhaW4gYWNjZXNzIHRvIGFsbCB0aGUgdGhpbmdzIHRoZSBmaXJtd2FyZSBuZWVkcyAoYnV0IHRoZSBPUworICAgZG9lc24ndCkuCisKKyAgIFRoZSBwYWwgY29udGFpbnMgdGhlIGZvbGxvd2luZyByZWdpc3RlcnM6CisKKyAgIHwwCXJlc2V0IHJlZ2lzdGVyICh3cml0ZSwgOGJpdCkKKyAgIHw0CXByb2Nlc3NvciBpZCByZWdpc3RlciAocmVhZCwgOGJpdCkKKyAgIHw4CWludGVycnVwdCByZWdpc3RlciAoOCAtIHBvcnQsIDkgLSBsZXZlbCkgKHdyaXRlLCAxNmJpdCkKKyAgIHwxMglwcm9jZXNzb3IgY291bnQgcmVnaXN0ZXIgKHJlYWQsIDhiaXQpCisKKyAgIHwxNgl0dHkgaW5wdXQgZmlmbyByZWdpc3RlciAocmVhZCwgOGJpdCkKKyAgIHwyMAl0dHkgaW5wdXQgc3RhdHVzIHJlZ2lzdGVyIChyZWFkLCA4Yml0KQorICAgfDI0CXR0eSBvdXRwdXQgZmlmbyByZWdpc3RlciAod3JpdGUsIDhiaXQpCisgICB8MjgJdHR5IG91dHB1dCBzdGF0dXMgcmVnaXN0ZXIgKHJlYWQsIDhiaXQpCisKKyAgIHwzMiAgY291bnRkb3duIHJlZ2lzdGVyIChyZWFkL3dyaXRlLCAzMmJpdCwgYmlnLWVuZGlhbikKKyAgIHwzNiAgY291bnRkb3duIHZhbHVlIHJlZ2lzdGVyIChyZWFkLCAzMmJpdCwgYmlnLWVuZGlhbikKKyAgIHw0MCAgdGltZXIgcmVnaXN0ZXIgKHJlYWQvd3JpdGUsIDMyYml0LCBiaWctZW5kaWFuKQorICAgfDQ0ICB0aW1lciB2YWx1ZSByZWdpc3RlciAocmVhZCwgMzJiaXQsIGJpZy1lbmRpYW4pCisKKyAgIFJFU0VUICh3cml0ZSk6IGhhbHRzIHRoZSBzaW11bGF0b3IuICBUaGUgdmFsdWUgd3JpdHRlbiB0byB0aGUKKyAgIHJlZ2lzdGVyIGlzIHVzZWQgYXMgYW4gZXhpdCBzdGF0dXMuCisgICAKKyAgIFBST0NFU1NPUiBJRCAocmVhZCk6IHJldHVybnMgdGhlIHByb2Nlc3NvciBpZGVudGlmaWVyICgwIC4uIE4tMSkgb2YKKyAgIHRoZSBwcm9jZXNzb3IgcGVyZm9ybWluZyB0aGUgcmVhZC4KKyAgIAorICAgSU5URVJSVVBUICh3cml0ZSk6IFRoaXMgcmVnaXN0ZXIgbXVzdCBiZSB3cml0dGVuIHVzaW5nIGEgdHdvIGJ5dGUKKyAgIHN0b3JlLiAgVGhlIGxvdyBieXRlIHNwZWNpZmllcyBhIHBvcnQgYW5kIHRoZSB1cHBlciBieXRlIHNwZWNpZmllcworICAgdGhlIGEgbGV2ZWwuICBMRVZFTCBpcyBkcml2ZW4gb24gdGhlIHNwZWNpZmllZCBwb3J0LiAgQnkKKyAgIGNvbnZlbnRpb24sIHRoZSBwYWwncyBpbnRlcnJ1cHQgcG9ydHMgKGludDAsIGludDEsIC4uLikgYXJlIHdpcmVkCisgICB1cCB0byB0aGUgY29ycmVzcG9uZGluZyBwcm9jZXNzb3IncyBsZXZlbCBzZW5zYXRpdmUgZXh0ZXJuYWwKKyAgIGludGVycnVwdCBwaW4uICBFZzogQSB0d28gYnl0ZSB3cml0ZSB0byBhZGRyZXNzIDggb2YgMHgwMTAyCisgICAoYmlnLWVuZGlhbikgd2lsbCByZXN1bHQgaW4gcHJvY2Vzc29yIDIncyBleHRlcm5hbCBpbnRlcnJ1cHQgcGluCisgICBiZWluZyBhc3NlcnRlZC4KKworICAgUFJPQ0VTU09SIENPVU5UIChyZWFkKTogcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHByb2Nlc3NvcnMKKyAgIGFjdGl2ZSBpbiB0aGUgY3VycmVudCBzaW11bGF0aW9uLgorCisgICBUVFkgSU5QVVQgRklGTyAocmVhZCk6IGlmIHRoZSBUVFkgaW5wdXQgc3RhdHVzIHJlZ2lzdGVyIGluZGljYXRlcyBhCisgICBjaGFyYWN0ZXIgaXMgYXZhaWxhYmxlIGJ5IGJlaW5nIG5vbnplcm8sIHJldHVybnMgdGhlIG5leHQgYXZhaWxhYmxlCisgICBjaGFyYWN0ZXIgZnJvbSB0aGUgcGFsJ3MgdHR5IGlucHV0IHBvcnQuCisKKyAgIFRUWSBPVVRQVVQgRklGTyAod3JpdGUpOiBpZiB0aGUgVFRZIG91dHB1dCBzdGF0dXMgcmVnaXN0ZXIKKyAgIGluZGljYXRlcyB0aGUgb3V0cHV0IGZpZm8gaXMgbm90IGZ1bGwgYnkgYmVpbmcgbm9uemVybywgb3V0cHV0cyB0aGUKKyAgIGNoYXJhY3RlciB3cml0dGVuIHRvIHRoZSB0dHkncyBvdXRwdXQgcG9ydC4KKworICAgQ09VTkRPV04gKHJlYWQvd3JpdGUpOiBUaGUgY291bnRkb3duIHJlZ2lzdGVycyBwcm92aWRlIGEKKyAgIG5vbi1yZXBlYXRpbmcgdGltZWQgaW50ZXJydXB0IHNvdXJjZS4gIFdyaXRpbmcgYSAzMiBiaXQgYmlnLWVuZGlhbgorICAgemVybyB2YWx1ZSB0byB0aGlzIHJlZ2lzdGVyIGNsZWFycyB0aGUgY291bnRkb3duIHRpbWVyLiAgV3JpdGluZyBhCisgICBub24temVybyAzMiBiaXQgYmlnLWVuZGlhbiB2YWx1ZSB0byB0aGlzIHJlZ2lzdGVyIHNldHMgdGhlCisgICBjb3VudGRvd24gdGltZXIgdG8gZXhwaXJlIGluIFZBTFVFIHRpY2tzICh0aWNrcyBpcyB0YXJnZXQKKyAgIGRlcGVuZGFudCkuICBSZWFkaW5nIHRoZSBjb3VudGRvd24gcmVnaXN0ZXIgcmV0dXJucyB0aGUgbGFzdCB2YWx1ZQorICAgd3JpdGVuLgorCisgICBDT1VOVERPV04gVkFMVUUgKHJlYWQpOiBSZWFkaW5nIHRoaXMgMzIgYml0IGJpZy1lbmRpYW4gcmVnaXN0ZXIKKyAgIHJldHVybnMgdGhlIG51bWJlciBvZiB0aWNrcyByZW1haW5pbmcgdW50aWwgdGhlIGNvdW50ZG93biB0aW1lcgorICAgZXhwaXJlcy4KKworICAgVElNRVIgKHJlYWQvd3JpdGUpOiBUaGUgdGltZXIgcmVnaXN0ZXJzIHByb3ZpZGUgYSBwZXJpb2RpYyB0aW1lZAorICAgaW50ZXJydXB0IHNvdXJjZS4gIFdyaXRpbmcgYSAzMiBiaXQgYmlnLWVuZGlhbiB6ZXJvIHZhbHVlIHRvIHRoaXMKKyAgIHJlZ2lzdGVyIGNsZWFycyB0aGUgcGVyaW9kaWMgdGltZXIuICBXcml0aW5nIGEgMzIgYml0IG5vbi16ZXJvCisgICB2YWx1ZSB0byB0aGlzIHJlZ2lzdGVyIHNldHMgdGhlIHBlcmlvZGljIHRpbWVyIHRvIHRyaWdlciBldmVyeQorICAgVkFMVUUgdGlja3MgKHRpY2tzIGlzIHRhcmdldCBkZXBlbmRhbnQpLiAgUmVhZGluZyB0aGUgdGltZXIKKyAgIHJlZ2lzdGVyIHJldHVybnMgdGhlIGxhc3QgdmFsdWUgd3JpdHRlbi4KKworICAgVElNRVIgVkFMVUUgKHJlYWQpOiBSZWFkaW5nIHRoaXMgMzIgYml0IGJpZy1lbmRpYW4gcmVnaXN0ZXIgcmV0dXJucworICAgdGhlIG51bWJlciBvZiB0aWNrcyB1bnRpbCB0aGUgbmV4dCBwZXJpb2RpYyBpbnRlcnJ1cHQuCisKKworICAgUFJPUEVSVElFUworICAgCisKKyAgIHJlZyA9IDxhZGRyZXNzPiA8c2l6ZT4gKHJlcXVpcmVkKQorCisgICBTcGVjaWZ5IHRoZSBhZGRyZXNzICh3aXRoaW4gdGhlIHBhcmVudCBidXMpIHRoYXQgdGhpcyBkZXZpY2UgaXMgdG8KKyAgIGJlIGxvY2F0ZWQuCisKKyAgIHBvbGw/ID0gPGJvb2xlYW4+CisKKyAgIElmIHByZXNlbnQgYW5kIHRydWUsIGluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2Ugc2hvdWxkIHBvbGwgaXRzCisgICBpbnB1dC4KKworCisgICBQT1JUUworCisKKyAgIGludFswLi5OUl9QUk9DRVNTT1JTXSAob3V0cHV0KQorCisgICBEcml2ZW4gYXMgYSByZXN1bHQgb2YgYSB3cml0ZSB0byB0aGUgaW50ZXJydXB0LXBvcnQgLworICAgaW50ZXJydXB0LWxldmVsIHJlZ2lzdGVyIHBhaXIuCisKKworICAgY291bnRkb3duCisKKyAgIERyaXZlbiB3aGVuZXZlciB0aGUgY291bnRkb3duIGNvdW50ZXIgcmVhY2hlcyB6ZXJvLgorCisKKyAgIHRpbWVyCisKKyAgIERyaXZlbiB3aGVuZXZlciB0aGUgdGltZXIgY291bnRlciByZWFjaGVzIHplcm8uCisKKworICAgQlVHUworCisKKyAgIEF0IHByZXNlbnQgdGhlIGNvbW1vbiBzaW11bGF0b3IgZnJhbWV3b3JrIGRvZXMgbm90IHN1cHBvcnQgaW5wdXQKKyAgIHBvbGxpbmcuCisKKyAgICovCisKKworZW51bSB7CisgIGh3X3BhbF9yZXNldF9yZWdpc3RlciA9IDB4MCwKKyAgaHdfcGFsX2NwdV9ucl9yZWdpc3RlciA9IDB4NCwKKyAgaHdfcGFsX2ludF9yZWdpc3RlciA9IDB4OCwKKyAgaHdfcGFsX25yX2NwdV9yZWdpc3RlciA9IDB4YSwKKyAgaHdfcGFsX3JlYWRfZmlmbyA9IDB4MTAsCisgIGh3X3BhbF9yZWFkX3N0YXR1cyA9IDB4MTQsCisgIGh3X3BhbF93cml0ZV9maWZvID0gMHgxOCwKKyAgaHdfcGFsX3dyaXRlX3N0YXR1cyA9IDB4MWEsCisgIGh3X3BhbF9jb3VudGRvd24gPSAweDIwLAorICBod19wYWxfY291bnRkb3duX3ZhbHVlID0gMHgyNCwKKyAgaHdfcGFsX3RpbWVyID0gMHgyOCwKKyAgaHdfcGFsX3RpbWVyX3ZhbHVlID0gMHgyYywKKyAgaHdfcGFsX2FkZHJlc3NfbWFzayA9IDB4M2YsCit9OworCisKK3R5cGVkZWYgc3RydWN0IF9od19wYWxfY29uc29sZV9idWZmZXIgeworICBjaGFyIGJ1ZmZlcjsKKyAgaW50IHN0YXR1czsKK30gaHdfcGFsX2NvbnNvbGVfYnVmZmVyOworCit0eXBlZGVmIHN0cnVjdCBfaHdfcGFsX2NvdW50ZXIgeworICBzdHJ1Y3QgaHdfZXZlbnQgKmhhbmRsZXI7CisgIHNpZ25lZDY0IHN0YXJ0OworICB1bnNpZ25lZDMyIGRlbHRhOworICBpbnQgcGVyaW9kaWNfcDsKK30gaHdfcGFsX2NvdW50ZXI7CisKKwordHlwZWRlZiBzdHJ1Y3QgX2h3X3BhbF9kZXZpY2UgeworICBod19wYWxfY29uc29sZV9idWZmZXIgaW5wdXQ7CisgIGh3X3BhbF9jb25zb2xlX2J1ZmZlciBvdXRwdXQ7CisgIGh3X3BhbF9jb3VudGVyIGNvdW50ZG93bjsKKyAgaHdfcGFsX2NvdW50ZXIgdGltZXI7CisgIHN0cnVjdCBodyAqZGlzazsKKyAgZG9faHdfcG9sbF9yZWFkX21ldGhvZCAqcmVhZGVyOworfSBod19wYWxfZGV2aWNlOworCitlbnVtIHsKKyAgQ09VTlRET1dOX1BPUlQsCisgIFRJTUVSX1BPUlQsCisgIElOVF9QT1JULAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod19wb3J0X2Rlc2NyaXB0b3IgaHdfcGFsX3BvcnRzW10gPSB7CisgIHsgImNvdW50ZG93biIsIENPVU5URE9XTl9QT1JULCAwLCBvdXRwdXRfcG9ydCwgfSwKKyAgeyAidGltZXIiLCBUSU1FUl9QT1JULCAwLCBvdXRwdXRfcG9ydCwgfSwKKyAgeyAiaW50IiwgSU5UX1BPUlQsIE1BWF9OUl9QUk9DRVNTT1JTLCBvdXRwdXRfcG9ydCwgfSwKKyAgeyBOVUxMIH0KK307CisKKworLyogY291bnRkb3duIGFuZCBzaW1wbGUgdGltZXIgKi8KKworc3RhdGljIHZvaWQKK2RvX2NvdW50ZXJfZXZlbnQgKHN0cnVjdCBodyAqbWUsCisJCSAgdm9pZCAqZGF0YSkKK3sKKyAgaHdfcGFsX2NvdW50ZXIgKmNvdW50ZXIgPSAoaHdfcGFsX2NvdW50ZXIgKikgZGF0YTsKKyAgaWYgKGNvdW50ZXItPnBlcmlvZGljX3ApCisgICAgeworICAgICAgSFdfVFJBQ0UgKChtZSwgInRpbWVyIGV4cGlyZWQiKSk7CisgICAgICBjb3VudGVyLT5zdGFydCA9IGh3X2V2ZW50X3F1ZXVlX3RpbWUgKG1lKTsKKyAgICAgIGh3X3BvcnRfZXZlbnQgKG1lLCBUSU1FUl9QT1JULCAxKTsKKyAgICAgIGh3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlIChtZSwgY291bnRlci0+ZGVsdGEsIGRvX2NvdW50ZXJfZXZlbnQsIGNvdW50ZXIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEhXX1RSQUNFICgobWUsICJjb3VudGRvd24gZXhwaXJlZCIpKTsKKyAgICAgIGNvdW50ZXItPmRlbHRhID0gMDsKKyAgICAgIGh3X3BvcnRfZXZlbnQgKG1lLCBDT1VOVERPV05fUE9SVCwgMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZG9fY291bnRlcl9yZWFkIChzdHJ1Y3QgaHcgKm1lLAorCQkgaHdfcGFsX2RldmljZSAqcGFsLAorCQkgY29uc3QgY2hhciAqcmVnLAorCQkgaHdfcGFsX2NvdW50ZXIgKmNvdW50ZXIsCisJCSB1bnNpZ25lZDMyICp3b3JkLAorCQkgdW5zaWduZWQgbnJfYnl0ZXMpCit7CisgIHVuc2lnbmVkMzIgdmFsOworICBpZiAobnJfYnl0ZXMgIT0gNCkKKyAgICBod19hYm9ydCAobWUsICIlcyAtIGJhZCByZWFkIHNpemUgbXVzdCBiZSA0IGJ5dGVzIiwgcmVnKTsKKyAgdmFsID0gY291bnRlci0+ZGVsdGE7CisgIEhXX1RSQUNFICgobWUsICJyZWFkIC0gJXMgJWxkIiwgcmVnLCAobG9uZykgdmFsKSk7CisgICp3b3JkID0gSDJCRV80ICh2YWwpOworfQorCitzdGF0aWMgdm9pZAorZG9fY291bnRlcl92YWx1ZSAoc3RydWN0IGh3ICptZSwKKwkJICBod19wYWxfZGV2aWNlICpwYWwsCisJCSAgY29uc3QgY2hhciAqcmVnLAorCQkgIGh3X3BhbF9jb3VudGVyICpjb3VudGVyLAorCQkgIHVuc2lnbmVkMzIgKndvcmQsCisJCSAgdW5zaWduZWQgbnJfYnl0ZXMpCit7CisgIHVuc2lnbmVkMzIgdmFsOworICBpZiAobnJfYnl0ZXMgIT0gNCkKKyAgICBod19hYm9ydCAobWUsICIlcyAtIGJhZCByZWFkIHNpemUgbXVzdCBiZSA0IGJ5dGVzIiwgcmVnKTsKKyAgaWYgKGNvdW50ZXItPmRlbHRhICE9IDApCisgICAgdmFsID0gKGNvdW50ZXItPnN0YXJ0ICsgY291bnRlci0+ZGVsdGEKKwkgICAtIGh3X2V2ZW50X3F1ZXVlX3RpbWUgKG1lKSk7CisgIGVsc2UKKyAgICB2YWwgPSAwOworICBIV19UUkFDRSAoKG1lLCAicmVhZCAtICVzICVsZCIsIHJlZywgKGxvbmcpIHZhbCkpOworICAqd29yZCA9IEgyQkVfNCAodmFsKTsKK30KKworc3RhdGljIHZvaWQKK2RvX2NvdW50ZXJfd3JpdGUgKHN0cnVjdCBodyAqbWUsCisJCSAgaHdfcGFsX2RldmljZSAqcGFsLAorCQkgIGNvbnN0IGNoYXIgKnJlZywKKwkJICBod19wYWxfY291bnRlciAqY291bnRlciwKKwkJICBjb25zdCB1bnNpZ25lZDMyICp3b3JkLAorCQkgIHVuc2lnbmVkIG5yX2J5dGVzKQoreworICBpZiAobnJfYnl0ZXMgIT0gNCkKKyAgICBod19hYm9ydCAobWUsICIlcyAtIGJhZCB3cml0ZSBzaXplIG11c3QgYmUgNCBieXRlcyIsIHJlZyk7CisgIGlmIChjb3VudGVyLT5oYW5kbGVyICE9IE5VTEwpCisgICAgeworICAgICAgaHdfZXZlbnRfcXVldWVfZGVzY2hlZHVsZSAobWUsIGNvdW50ZXItPmhhbmRsZXIpOworICAgICAgY291bnRlci0+aGFuZGxlciA9IE5VTEw7CisgICAgfQorICBjb3VudGVyLT5kZWx0YSA9IEJFMkhfNCAoKndvcmQpOworICBjb3VudGVyLT5zdGFydCA9IGh3X2V2ZW50X3F1ZXVlX3RpbWUgKG1lKTsKKyAgSFdfVFJBQ0UgKChtZSwgIndyaXRlIC0gJXMgJWxkIiwgcmVnLCAobG9uZykgY291bnRlci0+ZGVsdGEpKTsKKyAgaWYgKGNvdW50ZXItPmRlbHRhID4gMCkKKyAgICBod19ldmVudF9xdWV1ZV9zY2hlZHVsZSAobWUsIGNvdW50ZXItPmRlbHRhLCBkb19jb3VudGVyX2V2ZW50LCBjb3VudGVyKTsKK30KKworCisKKworLyogY2hlY2sgdGhlIGNvbnNvbGUgZm9yIGFuIGF2YWlsYWJsZSBjaGFyYWN0ZXIgKi8KK3N0YXRpYyB2b2lkCitzY2FuX2h3X3BhbCAoc3RydWN0IGh3ICptZSkKK3sKKyAgaHdfcGFsX2RldmljZSAqaHdfcGFsID0gKGh3X3BhbF9kZXZpY2UgKilod19kYXRhIChtZSk7CisgIGNoYXIgYzsKKyAgaW50IGNvdW50OworICBjb3VudCA9IGRvX2h3X3BvbGxfcmVhZCAobWUsIGh3X3BhbC0+cmVhZGVyLCAwLypTVERJTiovLCAmYywgc2l6ZW9mKGMpKTsKKyAgc3dpdGNoIChjb3VudCkKKyAgICB7CisgICAgY2FzZSBIV19JT19OT1RfUkVBRFk6CisgICAgY2FzZSBIV19JT19FT0Y6CisgICAgICBod19wYWwtPmlucHV0LmJ1ZmZlciA9IDA7CisgICAgICBod19wYWwtPmlucHV0LnN0YXR1cyA9IDA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaHdfcGFsLT5pbnB1dC5idWZmZXIgPSBjOworICAgICAgaHdfcGFsLT5pbnB1dC5zdGF0dXMgPSAxOworICAgIH0KK30KKworLyogd3JpdGUgdGhlIGNoYXJhY3RlciB0byB0aGUgaHdfcGFsICovCisKK3N0YXRpYyB2b2lkCit3cml0ZV9od19wYWwgKHN0cnVjdCBodyAqbWUsCisJICAgICAgY2hhciB2YWwpCit7CisgIGh3X3BhbF9kZXZpY2UgKmh3X3BhbCA9IChod19wYWxfZGV2aWNlICopIGh3X2RhdGEgKG1lKTsKKyAgc2ltX2lvX3dyaXRlX3N0ZG91dCAoaHdfc3lzdGVtIChtZSksICZ2YWwsIDEpOworICBod19wYWwtPm91dHB1dC5idWZmZXIgPSB2YWw7CisgIGh3X3BhbC0+b3V0cHV0LnN0YXR1cyA9IDE7Cit9CisKKworLyogUmVhZHMvd3JpdGVzICovCisKK3N0YXRpYyB1bnNpZ25lZAoraHdfcGFsX2lvX3JlYWRfYnVmZmVyIChzdHJ1Y3QgaHcgKm1lLAorCQkgICAgICAgdm9pZCAqZGVzdCwKKwkJICAgICAgIGludCBzcGFjZSwKKwkJICAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKKwkJICAgICAgIHVuc2lnbmVkIG5yX2J5dGVzKQoreworICBod19wYWxfZGV2aWNlICpod19wYWwgPSAoaHdfcGFsX2RldmljZSAqKSBod19kYXRhIChtZSk7CisgIHVuc2lnbmVkXzEgKmJ5dGUgPSAodW5zaWduZWRfMSAqKSBkZXN0OworICBtZW1zZXQgKGRlc3QsIDAsIG5yX2J5dGVzKTsKKyAgc3dpdGNoIChhZGRyICYgaHdfcGFsX2FkZHJlc3NfbWFzaykKKyAgICB7CisKKyAgICBjYXNlIGh3X3BhbF9jcHVfbnJfcmVnaXN0ZXI6CisjaWZkZWYgQ1BVX0lOREVYCisgICAgICAqYnl0ZSA9IENQVV9JTkRFWCAoaHdfc3lzdGVtX2NwdSAobWUpKTsKKyNlbHNlCisgICAgICAqYnl0ZSA9IDA7CisjZW5kaWYKKyAgICAgIEhXX1RSQUNFICgobWUsICJyZWFkIC0gY3B1LW5yICVkXG4iLCAqYnl0ZSkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGh3X3BhbF9ucl9jcHVfcmVnaXN0ZXI6CisgICAgICBpZiAoaHdfdHJlZV9maW5kX3Byb3BlcnR5IChtZSwgIi9vcGVucHJvbS9vcHRpb25zL3NtcCIpID09IE5VTEwpCisJeworCSAgKmJ5dGUgPSAxOworCSAgSFdfVFJBQ0UgKChtZSwgInJlYWQgLSBuci1jcHUgJWQgKG5vdCBkZWZpbmVkKVxuIiwgKmJ5dGUpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgKmJ5dGUgPSBod190cmVlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eSAobWUsICIvb3BlbnByb20vb3B0aW9ucy9zbXAiKTsKKwkgIEhXX1RSQUNFICgobWUsICJyZWFkIC0gbnItY3B1ICVkXG4iLCAqYnl0ZSkpOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBod19wYWxfcmVhZF9maWZvOgorICAgICAgKmJ5dGUgPSBod19wYWwtPmlucHV0LmJ1ZmZlcjsKKyAgICAgIEhXX1RSQUNFICgobWUsICJyZWFkIC0gaW5wdXQtZmlmbyAlZFxuIiwgKmJ5dGUpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBod19wYWxfcmVhZF9zdGF0dXM6CisgICAgICBzY2FuX2h3X3BhbCAobWUpOworICAgICAgKmJ5dGUgPSBod19wYWwtPmlucHV0LnN0YXR1czsKKyAgICAgIEhXX1RSQUNFICgobWUsICJyZWFkIC0gaW5wdXQtc3RhdHVzICVkXG4iLCAqYnl0ZSkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGh3X3BhbF93cml0ZV9maWZvOgorICAgICAgKmJ5dGUgPSBod19wYWwtPm91dHB1dC5idWZmZXI7CisgICAgICBIV19UUkFDRSAoKG1lLCAicmVhZCAtIG91dHB1dC1maWZvICVkXG4iLCAqYnl0ZSkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGh3X3BhbF93cml0ZV9zdGF0dXM6CisgICAgICAqYnl0ZSA9IGh3X3BhbC0+b3V0cHV0LnN0YXR1czsKKyAgICAgIEhXX1RSQUNFICgobWUsICJyZWFkIC0gb3V0cHV0LXN0YXR1cyAlZFxuIiwgKmJ5dGUpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBod19wYWxfY291bnRkb3duOgorICAgICAgZG9fY291bnRlcl9yZWFkIChtZSwgaHdfcGFsLCAiY291bnRkb3duIiwKKwkJICAgICAgICZod19wYWwtPmNvdW50ZG93biwgZGVzdCwgbnJfYnl0ZXMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGh3X3BhbF9jb3VudGRvd25fdmFsdWU6CisgICAgICBkb19jb3VudGVyX3ZhbHVlIChtZSwgaHdfcGFsLCAiY291bnRkb3duLXZhbHVlIiwKKwkJCSZod19wYWwtPmNvdW50ZG93biwgZGVzdCwgbnJfYnl0ZXMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGh3X3BhbF90aW1lcjoKKyAgICAgIGRvX2NvdW50ZXJfcmVhZCAobWUsIGh3X3BhbCwgInRpbWVyIiwKKwkJICAgICAgICZod19wYWwtPnRpbWVyLCBkZXN0LCBucl9ieXRlcyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgaHdfcGFsX3RpbWVyX3ZhbHVlOgorICAgICAgZG9fY291bnRlcl92YWx1ZSAobWUsIGh3X3BhbCwgInRpbWVyLXZhbHVlIiwKKwkJCSZod19wYWwtPnRpbWVyLCBkZXN0LCBucl9ieXRlcyk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBIV19UUkFDRSAoKG1lLCAicmVhZCAtID8/P1xuIikpOworICAgICAgYnJlYWs7CisKKyAgICB9CisgIHJldHVybiBucl9ieXRlczsKK30KKworCitzdGF0aWMgdW5zaWduZWQKK2h3X3BhbF9pb193cml0ZV9idWZmZXIgKHN0cnVjdCBodyAqbWUsCisJCQljb25zdCB2b2lkICpzb3VyY2UsCisJCQlpbnQgc3BhY2UsCisJCQl1bnNpZ25lZF93b3JkIGFkZHIsCisJCQl1bnNpZ25lZCBucl9ieXRlcykKK3sKKyAgaHdfcGFsX2RldmljZSAqaHdfcGFsID0gKGh3X3BhbF9kZXZpY2UqKSBod19kYXRhIChtZSk7CisgIHVuc2lnbmVkXzEgKmJ5dGUgPSAodW5zaWduZWRfMSAqKSBzb3VyY2U7CisgIAorICBzd2l0Y2ggKGFkZHIgJiBod19wYWxfYWRkcmVzc19tYXNrKQorICAgIHsKKworICAgIGNhc2UgaHdfcGFsX3Jlc2V0X3JlZ2lzdGVyOgorICAgICAgaHdfaGFsdCAobWUsIHNpbV9leGl0ZWQsIGJ5dGVbMF0pOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGh3X3BhbF9pbnRfcmVnaXN0ZXI6CisgICAgICBod19wb3J0X2V2ZW50IChtZSwKKwkJICAgICBJTlRfUE9SVCArIGJ5dGVbMF0sIC8qcG9ydCovCisJCSAgICAgKG5yX2J5dGVzID4gMSA/IGJ5dGVbMV0gOiAwKSk7IC8qIHZhbCAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGh3X3BhbF9yZWFkX2ZpZm86CisgICAgICBod19wYWwtPmlucHV0LmJ1ZmZlciA9IGJ5dGVbMF07CisgICAgICBIV19UUkFDRSAoKG1lLCAid3JpdGUgLSBpbnB1dC1maWZvICVkXG4iLCBieXRlWzBdKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgaHdfcGFsX3JlYWRfc3RhdHVzOgorICAgICAgaHdfcGFsLT5pbnB1dC5zdGF0dXMgPSBieXRlWzBdOworICAgICAgSFdfVFJBQ0UgKChtZSwgIndyaXRlIC0gaW5wdXQtc3RhdHVzICVkXG4iLCBieXRlWzBdKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgaHdfcGFsX3dyaXRlX2ZpZm86CisgICAgICB3cml0ZV9od19wYWwgKG1lLCBieXRlWzBdKTsKKyAgICAgIEhXX1RSQUNFICgobWUsICJ3cml0ZSAtIG91dHB1dC1maWZvICVkXG4iLCBieXRlWzBdKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgaHdfcGFsX3dyaXRlX3N0YXR1czoKKyAgICAgIGh3X3BhbC0+b3V0cHV0LnN0YXR1cyA9IGJ5dGVbMF07CisgICAgICBIV19UUkFDRSAoKG1lLCAid3JpdGUgLSBvdXRwdXQtc3RhdHVzICVkXG4iLCBieXRlWzBdKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgaHdfcGFsX2NvdW50ZG93bjoKKyAgICAgIGRvX2NvdW50ZXJfd3JpdGUgKG1lLCBod19wYWwsICJjb3VudGRvd24iLAorCQkJJmh3X3BhbC0+Y291bnRkb3duLCBzb3VyY2UsIG5yX2J5dGVzKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBod19wYWxfdGltZXI6CisgICAgICBkb19jb3VudGVyX3dyaXRlIChtZSwgaHdfcGFsLCAidGltZXIiLAorCQkJJmh3X3BhbC0+dGltZXIsIHNvdXJjZSwgbnJfYnl0ZXMpOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICB9CisgIHJldHVybiBucl9ieXRlczsKK30KKworCisvKiBpbnN0YW5jZXMgb2YgdGhlIGh3X3BhbCBzdHJ1Y3QgaHcgKi8KKworI2lmIE5PVF9ZRVQKK3N0YXRpYyB2b2lkCitod19wYWxfaW5zdGFuY2VfZGVsZXRlX2NhbGxiYWNrKGh3X2luc3RhbmNlICppbnN0YW5jZSkKK3sKKyAgLyogbm90aGluZyB0byBkZWxldGUsIHRoZSBod19wYWwgaXMgYXR0YWNoZWQgdG8gdGhlIHN0cnVjdCBodyAqLworICByZXR1cm47Cit9CisjZW5kaWYKKworI2lmIE5PVF9ZRVQKK3N0YXRpYyBpbnQKK2h3X3BhbF9pbnN0YW5jZV9yZWFkX2NhbGxiYWNrIChod19pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQkgICAgICB2b2lkICpidWYsCisJCQkgICAgICB1bnNpZ25lZF93b3JkIGxlbikKK3sKKyAgRElUUkFDRSAocGFsLCAoInJlYWQgLSAlcyAoJWxkKSIsIChjb25zdCBjaGFyKikgYnVmLCAobG9uZyBpbnQpIGxlbikpOworICByZXR1cm4gc2ltX2lvX3JlYWRfc3RkaW4gKGJ1ZiwgbGVuKTsKK30KKyNlbmRpZgorCisjaWYgTk9UX1lFVAorc3RhdGljIGludAoraHdfcGFsX2luc3RhbmNlX3dyaXRlX2NhbGxiYWNrIChod19pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQkJY29uc3Qgdm9pZCAqYnVmLAorCQkJCXVuc2lnbmVkX3dvcmQgbGVuKQoreworICBpbnQgaTsKKyAgY29uc3QgY2hhciAqY2hwID0gYnVmOworICBod19wYWxfZGV2aWNlICpod19wYWwgPSBod19pbnN0YW5jZV9kYXRhIChpbnN0YW5jZSk7CisgIERJVFJBQ0UgKHBhbCwgKCJ3cml0ZSAtICVzICglbGQpIiwgKGNvbnN0IGNoYXIqKSBidWYsIChsb25nIGludCkgbGVuKSk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICB3cml0ZV9od19wYWwgKGh3X3BhbCwgY2hwW2ldKTsKKyAgc2ltX2lvX2ZsdXNoX3N0ZG91dHB1dCAoKTsKKyAgcmV0dXJuIGk7Cit9CisjZW5kaWYKKworI2lmIE5PVF9ZRVQKK3N0YXRpYyBjb25zdCBod19pbnN0YW5jZV9jYWxsYmFja3MgaHdfcGFsX2luc3RhbmNlX2NhbGxiYWNrcyA9IHsKKyAgaHdfcGFsX2luc3RhbmNlX2RlbGV0ZV9jYWxsYmFjaywKKyAgaHdfcGFsX2luc3RhbmNlX3JlYWRfY2FsbGJhY2ssCisgIGh3X3BhbF9pbnN0YW5jZV93cml0ZV9jYWxsYmFjaywKK307CisjZW5kaWYKKworI2lmIDAKK3N0YXRpYyBod19pbnN0YW5jZSAqCitod19wYWxfY3JlYXRlX2luc3RhbmNlIChzdHJ1Y3QgaHcgKm1lLAorCQkJY29uc3QgY2hhciAqcGF0aCwKKwkJCWNvbnN0IGNoYXIgKmFyZ3MpCit7CisgIHJldHVybiBod19jcmVhdGVfaW5zdGFuY2VfZnJvbSAobWUsIE5VTEwsCisJCQkJICAgICAgaHdfZGF0YSAobWUpLAorCQkJCSAgICAgIHBhdGgsIGFyZ3MsCisJCQkJICAgICAgJmh3X3BhbF9pbnN0YW5jZV9jYWxsYmFja3MpOworfQorI2VuZGlmCisKKworc3RhdGljIHZvaWQKK2h3X3BhbF9hdHRhY2hfYWRkcmVzcyAoc3RydWN0IGh3ICptZSwKKwkJICAgICAgIGludCBsZXZlbCwKKwkJICAgICAgIGludCBzcGFjZSwKKwkJICAgICAgIGFkZHJlc3Nfd29yZCBhZGRyLAorCQkgICAgICAgYWRkcmVzc193b3JkIG5yX2J5dGVzLAorCQkgICAgICAgc3RydWN0IGh3ICpjbGllbnQpCit7CisgIGh3X3BhbF9kZXZpY2UgKnBhbCA9IChod19wYWxfZGV2aWNlKikgaHdfZGF0YSAobWUpOworICBwYWwtPmRpc2sgPSBjbGllbnQ7Cit9CisKKworI2lmIDAKK3N0YXRpYyBod19jYWxsYmFja3MgY29uc3QgaHdfcGFsX2NhbGxiYWNrcyA9IHsKKyAgeyBnZW5lcmljX2h3X2luaXRfYWRkcmVzcywgfSwKKyAgeyBod19wYWxfYXR0YWNoX2FkZHJlc3MsIH0sIC8qIGFkZHJlc3MgKi8KKyAgeyBod19wYWxfaW9fcmVhZF9idWZmZXJfY2FsbGJhY2ssCisgICAgICBod19wYWxfaW9fd3JpdGVfYnVmZmVyX2NhbGxiYWNrLCB9LAorICB7IE5VTEwsIH0sIC8qIERNQSAqLworICB7IE5VTEwsIE5VTEwsIGh3X3BhbF9pbnRlcnJ1cHRfcG9ydHMgfSwgLyogaW50ZXJydXB0ICovCisgIHsgZ2VuZXJpY19od191bml0X2RlY29kZSwKKyAgICBnZW5lcmljX2h3X3VuaXRfZW5jb2RlLAorICAgIGdlbmVyaWNfaHdfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcywKKyAgICBnZW5lcmljX2h3X3NpemVfdG9fYXR0YWNoX3NpemUgfSwKKyAgaHdfcGFsX2NyZWF0ZV9pbnN0YW5jZSwKK307CisjZW5kaWYKKworCitzdGF0aWMgdm9pZAoraHdfcGFsX2ZpbmlzaCAoc3RydWN0IGh3ICpodykKK3sKKyAgLyogY3JlYXRlIHRoZSBkZXNjcmlwdG9yICovCisgIGh3X3BhbF9kZXZpY2UgKmh3X3BhbCA9IEhXX1pBTExPQyAoaHcsIGh3X3BhbF9kZXZpY2UpOworICBod19wYWwtPm91dHB1dC5zdGF0dXMgPSAxOworICBod19wYWwtPm91dHB1dC5idWZmZXIgPSAnXDAnOworICBod19wYWwtPmlucHV0LnN0YXR1cyA9IDA7CisgIGh3X3BhbC0+aW5wdXQuYnVmZmVyID0gJ1wwJzsKKyAgc2V0X2h3X2RhdGEgKGh3LCBod19wYWwpOworICBzZXRfaHdfYXR0YWNoX2FkZHJlc3MgKGh3LCBod19wYWxfYXR0YWNoX2FkZHJlc3MpOworICBzZXRfaHdfaW9fcmVhZF9idWZmZXIgKGh3LCBod19wYWxfaW9fcmVhZF9idWZmZXIpOworICBzZXRfaHdfaW9fd3JpdGVfYnVmZmVyIChodywgaHdfcGFsX2lvX3dyaXRlX2J1ZmZlcik7CisgIHNldF9od19wb3J0cyAoaHcsIGh3X3BhbF9wb3J0cyk7CisgIC8qIGF0dGFjaCBvdXJzZWx2ZXMgKi8KKyAgZG9faHdfYXR0YWNoX3JlZ3MgKGh3KTsKKyAgLyogSWYgc28gY29uZmlndXJlZCwgZW5hYmxlIHBvbGxlZCBpbnB1dCAqLworICBpZiAoaHdfZmluZF9wcm9wZXJ0eSAoaHcsICJwb2xsPyIpICE9IE5VTEwKKyAgICAgICYmIGh3X2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eSAoaHcsICJwb2xsPyIpKQorICAgIHsKKyAgICAgIGh3X3BhbC0+cmVhZGVyID0gc2ltX2lvX3BvbGxfcmVhZDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBod19wYWwtPnJlYWRlciA9IHNpbV9pb19yZWFkOworICAgIH0KKyAgLyogdGFnIHRoZSBwZXJpb2RpYyB0aW1lciAqLworICBod19wYWwtPnRpbWVyLnBlcmlvZGljX3AgPSAxOworfQorCisKK2NvbnN0IHN0cnVjdCBod19kZXNjcmlwdG9yIGR2X3BhbF9kZXNjcmlwdG9yW10gPSB7CisgIHsgInBhbCIsIGh3X3BhbF9maW5pc2gsIH0sCisgIHsgTlVMTCB9LAorfTsKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vZHYtc29ja3Nlci5jIGIvc2ltL2NvbW1vbi9kdi1zb2Nrc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1Mjg4YwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vZHYtc29ja3Nlci5jCkBAIC0wLDAgKzEsMzg2IEBACisvKiBTZXJpYWwgcG9ydCBlbXVsYXRpb24gdXNpbmcgc29ja2V0cy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEZJWE1FOiB3aWxsIG9idmlvdXNseSBuZWVkIHRvIGV2b2x2ZS4KKyAgIC0gY29ubmVjdGlvbmxlc3Mgc29ja2V0cyBtaWdodCBiZSBtb3JlIGFwcHJvcHJpYXRlLiAgKi8KKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0ZDTlRMX0gKKyNpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaWZuZGVmIF9fQ1lHV0lOMzJfXworI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKKyNpbmNsdWRlICJzaW0tb3B0aW9ucy5oIgorCisjaW5jbHVkZSAiZHYtc29ja3Nlci5oIgorDAorLyogR2V0IGRlZmluaXRpb25zIGZvciBib3RoIE9fTk9OQkxPQ0sgYW5kIE9fTkRFTEFZLiAgKi8KKworI2lmbmRlZiBPX05ERUxBWQorI2lmZGVmIEZOREVMQVkKKyNkZWZpbmUgT19OREVMQVkgRk5ERUxBWQorI2Vsc2UgLyogISBkZWZpbmVkIChGTkRFTEFZKSAqLworI2RlZmluZSBPX05ERUxBWSAwCisjZW5kaWYgLyogISBkZWZpbmVkIChGTkRFTEFZKSAqLworI2VuZGlmIC8qICEgZGVmaW5lZCAoT19OREVMQVkpICovCisKKyNpZm5kZWYgT19OT05CTE9DSworI2lmZGVmIEZOQkxPQ0sKKyNkZWZpbmUgT19OT05CTE9DSyBGTkJMT0NLCisjZWxzZSAvKiAhIGRlZmluZWQgKEZOQkxPQ0spICovCisjZGVmaW5lIE9fTk9OQkxPQ0sgMAorI2VuZGlmIC8qICEgZGVmaW5lZCAoRk5CTE9DSykgKi8KKyNlbmRpZiAvKiAhIGRlZmluZWQgKE9fTk9OQkxPQ0spICovCisMCisjZGVmaW5lIE1JTihhLGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisKKy8qIENvbXByb21pc2UgYmV0d2VlbiBlYXRpbmcgY3B1IGFuZCBwcm9wZXJseSBidXN5LXdhaXRpbmcuCisgICBPbmUgY291bGQgaGF2ZSBhbiBvcHRpb24gdG8gc2V0IHRoaXMgYnV0IGZvciBub3cgdGhhdCBzZWVtcworICAgbGlrZSBmZWF0dXJpdGlzLiAgKi8KKyNkZWZpbmUgREVGQVVMVF9USU1FT1VUIDEwMDAgLyogbWljcm9zZWNvbmRzICovCisKKy8qIEZJWE1FOiBUaGVzZSBzaG91bGQgYWxsb2NhdGVkIGF0IHJ1biB0aW1lIGFuZCBrZXB0IHdpdGggb3RoZXIgc2ltdWxhdG9yCisgICBzdGF0ZSAoZHVoLi4uKS4gIExhdGVyLiAgKi8KK2NvbnN0IGNoYXIgKiBzb2Nrc2VyX2FkZHIgPSBOVUxMOworLyogVGltZW91dCBpbiBtaWNyb3NlY29uZHMgZHVyaW5nIHN0YXR1cyBmbGFnIGNvbXB1dGF0aW9uLgorICAgU2V0dGluZyB0aGlzIHRvIHplcm8gYWNoaWV2ZXMgcHJvcGVyIGJ1c3kgd2FpdCBzZW1hbnRpY3MgYnV0IGVhdHMgY3B1LiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc29ja3Nlcl90aW1lb3V0ID0gREVGQVVMVF9USU1FT1VUOworc3RhdGljIGludCBzb2Nrc2VyX2xpc3Rlbl9mZCA9IC0xOworc3RhdGljIGludCBzb2Nrc2VyX2ZkID0gLTE7CisMCisvKiBGSVhNRTogdXNlIHRyZWUgcHJvcGVydGllcyB3aGVuIHRoZXkncmUgcmVhZHkuICAqLworCit0eXBlZGVmIGVudW0geworICBPUFRJT05fQUREUiA9IE9QVElPTl9TVEFSVAorfSBTT0NLU0VSX09QVElPTlM7CisKK3N0YXRpYyBERUNMQVJFX09QVElPTl9IQU5ETEVSIChzb2Nrc2VyX29wdGlvbl9oYW5kbGVyKTsKKworc3RhdGljIGNvbnN0IE9QVElPTiBzb2Nrc2VyX29wdGlvbnNbXSA9Cit7CisgIHsgeyAic29ja3Nlci1hZGRyIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BRERSIH0sCisgICAgICAnXDAnLCAiU09DS0VUIEFERFJFU1MiLCAiU2V0IHNlcmlhbCBlbXVsYXRpb24gc29ja2V0IGFkZHJlc3MiLAorICAgICAgc29ja3Nlcl9vcHRpb25faGFuZGxlciB9LAorICB7IHsgTlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDAgfSwgJ1wwJywgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCitzdGF0aWMgU0lNX1JDCitzb2Nrc2VyX29wdGlvbl9oYW5kbGVyIChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBpbnQgb3B0LAorCQkJY2hhciAqYXJnLCBpbnQgaXNfY29tbWFuZCkKK3sKKyAgc3dpdGNoIChvcHQpCisgICAgeworICAgIGNhc2UgT1BUSU9OX0FERFIgOgorICAgICAgc29ja3Nlcl9hZGRyID0gYXJnOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKK3N0YXRpYyBTSU1fUkMKK2R2X3NvY2tzZXJfaW5pdCAoU0lNX0RFU0Mgc2QpCit7CisgIHN0cnVjdCBob3N0ZW50ICpob3N0ZW50OworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja2FkZHI7CisgIGNoYXIgaG9zdG5hbWVbMTAwXTsKKyAgY29uc3QgY2hhciAqcG9ydF9zdHI7CisgIGludCB0bXAscG9ydDsKKworICBpZiAoU1RBVEVfRU5WSVJPTk1FTlQgKHNkKSAhPSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQKKyAgICAgIHx8IHNvY2tzZXJfYWRkciA9PSBOVUxMKQorICAgIHJldHVybiBTSU1fUkNfT0s7CisKKyAgaWYgKCpzb2Nrc2VyX2FkZHIgPT0gJy8nKQorICAgIHsKKyAgICAgIC8qIHN1cHBvcnQgZm9yIHRoZXNlIGNhbiBjb21lIGxhdGVyICovCisgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJzb2Nrc2VyIGluaXQ6IHVuaXggZG9tYWluIHNvY2tldHMgbm90IHN1cHBvcnRlZDogYCVzJ1xuIiwKKwkJICAgICAgc29ja3Nlcl9hZGRyKTsKKyAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKyAgICB9CisKKyAgcG9ydF9zdHIgPSBzdHJjaHIgKHNvY2tzZXJfYWRkciwgJzonKTsKKyAgaWYgKCFwb3J0X3N0cikKKyAgICB7CisgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJzb2Nrc2VyIGluaXQ6IG1pc3NpbmcgcG9ydCBudW1iZXI6IGAlcydcbiIsCisJCSAgICAgIHNvY2tzZXJfYWRkcik7CisgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisgICAgfQorICB0bXAgPSBNSU4gKHBvcnRfc3RyIC0gc29ja3Nlcl9hZGRyLCAoaW50KSBzaXplb2YgaG9zdG5hbWUgLSAxKTsKKyAgc3RybmNweSAoaG9zdG5hbWUsIHNvY2tzZXJfYWRkciwgdG1wKTsKKyAgaG9zdG5hbWVbdG1wXSA9ICdcMDAwJzsKKyAgcG9ydCA9IGF0b2kgKHBvcnRfc3RyICsgMSk7CisKKyAgaG9zdGVudCA9IGdldGhvc3RieW5hbWUgKGhvc3RuYW1lKTsKKyAgaWYgKCEgaG9zdGVudCkKKyAgICB7CisgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJzb2Nrc2VyIGluaXQ6IHVua25vd24gaG9zdDogJXNcbiIsCisJCSAgICAgIGhvc3RuYW1lKTsKKyAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKyAgICB9CisKKyAgc29ja3Nlcl9saXN0ZW5fZmQgPSBzb2NrZXQgKFBGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgaWYgKHNvY2tzZXJfbGlzdGVuX2ZkIDwgMCkKKyAgICB7CisgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJzb2Nrc2VyIGluaXQ6IHVuYWJsZSB0byBnZXQgc29ja2V0OiAlc1xuIiwKKwkJICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisgICAgfQorCisgIHNvY2thZGRyLnNpbl9mYW1pbHkgPSBQRl9JTkVUOworICBzb2NrYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICBtZW1jcHkgKCZzb2NrYWRkci5zaW5fYWRkci5zX2FkZHIsIGhvc3RlbnQtPmhfYWRkciwKKwkgIHNpemVvZiAoc3RydWN0IGluX2FkZHIpKTsKKworICB0bXAgPSAxOworICBpZiAoc2V0c29ja29wdCAoc29ja3Nlcl9saXN0ZW5fZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKHZvaWQqKSYgdG1wLCBzaXplb2YodG1wKSkgPCAwKQorICAgIHsKKyAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgInNvY2tzZXIgaW5pdDogdW5hYmxlIHRvIHNldCBTT19SRVVTRUFERFI6ICVzXG4iLAorCQkgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICB9CisgIGlmIChiaW5kIChzb2Nrc2VyX2xpc3Rlbl9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc29ja2FkZHIsIHNpemVvZiAoc29ja2FkZHIpKSA8IDApCisgICAgeworICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAic29ja3NlciBpbml0OiB1bmFibGUgdG8gYmluZCBzb2NrZXQgYWRkcmVzczogJXNcbiIsCisJCSAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgY2xvc2UgKHNvY2tzZXJfbGlzdGVuX2ZkKTsKKyAgICAgIHNvY2tzZXJfbGlzdGVuX2ZkID0gLTE7CisgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisgICAgfQorICBpZiAobGlzdGVuIChzb2Nrc2VyX2xpc3Rlbl9mZCwgMSkgPCAwKQorICAgIHsKKyAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgInNvY2tzZXIgaW5pdDogdW5hYmxlIHRvIHNldCB1cCBsaXN0ZW5lcjogJXNcbiIsCisJCSAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgICAgY2xvc2UgKHNvY2tzZXJfbGlzdGVuX2ZkKTsKKyAgICAgIHNvY2tzZXJfbGlzdGVuX2ZkID0gLTE7CisgICAgICByZXR1cm4gU0lNX1JDX09LOworICAgIH0KKworICAvKiBIYW5kbGUgd3JpdGVzIHRvIG1pc3NpbmcgY2xpZW50IC0+IFNJR1BJUEUuCisgICAgID8/PyBOZWVkIGEgY2VudHJhbCBzaWduYWwgbWFuYWdlbWVudCBtb2R1bGUuICAqLworICB7CisgICAgUkVUU0lHVFlQRSAoKm9yaWcpICgpOworICAgIG9yaWcgPSBzaWduYWwgKFNJR1BJUEUsIFNJR19JR04pOworICAgIC8qIElmIGEgaGFuZGxlciBpcyBhbHJlYWR5IHNldCB1cCwgZG9uJ3QgbWVzcyB3aXRoIGl0LiAgKi8KKyAgICBpZiAob3JpZyAhPSBTSUdfREZMICYmIG9yaWcgIT0gU0lHX0lHTikKKyAgICAgIHNpZ25hbCAoU0lHUElQRSwgb3JpZyk7CisgIH0KKworICByZXR1cm4gU0lNX1JDX09LOworfQorCitzdGF0aWMgdm9pZAorZHZfc29ja3Nlcl91bmluc3RhbGwgKFNJTV9ERVNDIHNkKQoreworICBpZiAoc29ja3Nlcl9saXN0ZW5fZmQgIT0gLTEpCisgICAgeworICAgICAgY2xvc2UgKHNvY2tzZXJfbGlzdGVuX2ZkKTsKKyAgICAgIHNvY2tzZXJfbGlzdGVuX2ZkID0gLTE7CisgICAgfQorICBpZiAoc29ja3Nlcl9mZCAhPSAtMSkKKyAgICB7CisgICAgICBjbG9zZSAoc29ja3Nlcl9mZCk7CisgICAgICBzb2Nrc2VyX2ZkID0gLTE7CisgICAgfQorfQorCitTSU1fUkMKK2R2X3NvY2tzZXJfaW5zdGFsbCAoU0lNX0RFU0Mgc2QpCit7CisgIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7CisgIGlmIChzaW1fYWRkX29wdGlvbl90YWJsZSAoc2QsIE5VTEwsIHNvY2tzZXJfb3B0aW9ucykgIT0gU0lNX1JDX09LKQorICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKyAgc2ltX21vZHVsZV9hZGRfaW5pdF9mbiAoc2QsIGR2X3NvY2tzZXJfaW5pdCk7CisgIHNpbV9tb2R1bGVfYWRkX3VuaW5zdGFsbF9mbiAoc2QsIGR2X3NvY2tzZXJfdW5pbnN0YWxsKTsKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworc3RhdGljIGludAorY29ubmVjdGVkX3AgKFNJTV9ERVNDIHNkKQoreworICBpbnQgbnVtZmRzLGZsYWdzOworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgZmRfc2V0IHJlYWRmZHM7CisgIHN0cnVjdCBzb2NrYWRkciBzb2NrYWRkcjsKKyAgaW50IGFkZHJsZW47CisKKyAgaWYgKHNvY2tzZXJfbGlzdGVuX2ZkID09IC0xKQorICAgIHJldHVybiAwOworCisgIGlmIChzb2Nrc2VyX2ZkID49IDApCisgICAgeworICAgICAgLyogRklYTUU6IGhhcyBjbGllbnQgZ29uZSBhd2F5PyAqLworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIE5vdCBjb25uZWN0ZWQuICBDb25uZWN0IHdpdGggYSBjbGllbnQgaWYgdGhlcmUgaXMgb25lLiAgKi8KKworICBGRF9aRVJPICgmcmVhZGZkcyk7CisgIEZEX1NFVCAoc29ja3Nlcl9saXN0ZW5fZmQsICZyZWFkZmRzKTsKKworICAvKiA/Pz8gT25lIGNhbiBjZXJ0YWlubHkgYXJndWUgdGhpcyBzaG91bGQgYmUgZG9uZSBkaWZmZXJlbnRseSwKKyAgICAgYnV0IGZvciBub3cgdGhpcyBpcyBzdWZmaWNpZW50LiAgKi8KKyAgdHYudHZfc2VjID0gMDsKKyAgdHYudHZfdXNlYyA9IHNvY2tzZXJfdGltZW91dDsKKworICBudW1mZHMgPSBzZWxlY3QgKHNvY2tzZXJfbGlzdGVuX2ZkICsgMSwgJnJlYWRmZHMsIDAsIDAsICZ0dik7CisgIGlmIChudW1mZHMgPD0gMCkKKyAgICByZXR1cm4gMDsKKworICBzb2Nrc2VyX2ZkID0gYWNjZXB0IChzb2Nrc2VyX2xpc3Rlbl9mZCwgJnNvY2thZGRyLCAmYWRkcmxlbik7CisgIGlmIChzb2Nrc2VyX2ZkIDwgMCkKKyAgICByZXR1cm4gMDsKKworICAvKiBTZXQgbm9uLWJsb2NraW5nIGkvby4gICovCisgIGZsYWdzID0gZmNudGwgKHNvY2tzZXJfZmQsIEZfR0VURkwpOworICBmbGFncyB8PSBPX05PTkJMT0NLIHwgT19OREVMQVk7CisgIGlmIChmY250bCAoc29ja3Nlcl9mZCwgRl9TRVRGTCwgZmxhZ3MpID09IC0xKQorICAgIHsKKyAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgInVuYWJsZSB0byBzZXQgbm9uYmxvY2tpbmcgaS9vIik7CisgICAgICBjbG9zZSAoc29ja3Nlcl9mZCk7CisgICAgICBzb2Nrc2VyX2ZkID0gLTE7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIHJldHVybiAxOworfQorCitpbnQKK2R2X3NvY2tzZXJfc3RhdHVzIChTSU1fREVTQyBzZCkKK3sKKyAgaW50IG51bXJmZHMsbnVtd2ZkcyxzdGF0dXM7CisgIHN0cnVjdCB0aW1ldmFsIHR2OworICBmZF9zZXQgcmVhZGZkcyx3cml0ZWZkczsKKworICAvKiBzdGF0dXMgdG8gcmV0dXJuIGlmIHRoZSBzb2NrZXQgaXNuJ3Qgc2V0IHVwLCBvciBzZWxlY3QgZmFpbHMgKi8KKyAgc3RhdHVzID0gRFZfU09DS1NFUl9JTlBVVF9FTVBUWSB8IERWX1NPQ0tTRVJfT1VUUFVUX0VNUFRZOworCisgIGlmICghIGNvbm5lY3RlZF9wIChzZCkpCisgICAgcmV0dXJuIHN0YXR1czsKKworICBGRF9aRVJPICgmcmVhZGZkcyk7CisgIEZEX1pFUk8gKCZ3cml0ZWZkcyk7CisgIEZEX1NFVCAoc29ja3Nlcl9mZCwgJnJlYWRmZHMpOworICBGRF9TRVQgKHNvY2tzZXJfZmQsICZ3cml0ZWZkcyk7CisKKyAgLyogPz8/IE9uZSBjYW4gY2VydGFpbmx5IGFyZ3VlIHRoaXMgc2hvdWxkIGJlIGRvbmUgZGlmZmVyZW50bHksCisgICAgIGJ1dCBmb3Igbm93IHRoaXMgaXMgc3VmZmljaWVudC4gIFRoZSByZWFkIGlzIGRvbmUgc2VwYXJhdGVseQorICAgICBmcm9tIHRoZSB3cml0ZSB0byBlbmZvcmNlIHRoZSBkZWxheSB3aGljaCB3ZSBoZXVyaXN0aWNhbGx5IHNldCB0bworICAgICBvbmNlIGV2ZXJ5IFNPQ0tTRVJfVElNRU9VVF9GUkVRIHRyaWVzLgorICAgICBObywgdGhpcyBpc24ndCBncmVhdCBmb3IgU01QIHNpdHVhdGlvbnMsIGJsYWggYmxhaCBibGFoLiAgKi8KKworICB7CisgICAgc3RhdGljIGludCBuOworI2RlZmluZSBTT0NLU0VSX1RJTUVPVVRfRlJFUSA0MgorICAgIGlmICgrK24gPT0gU09DS1NFUl9USU1FT1VUX0ZSRVEpCisgICAgICBuID0gMDsKKyAgICBpZiAobiA9PSAwKQorICAgICAgeworCXR2LnR2X3NlYyA9IDA7CisJdHYudHZfdXNlYyA9IHNvY2tzZXJfdGltZW91dDsKKwludW1yZmRzID0gc2VsZWN0IChzb2Nrc2VyX2ZkICsgMSwgJnJlYWRmZHMsIDAsIDAsICZ0dik7CisJdHYudHZfc2VjID0gMDsKKwl0di50dl91c2VjID0gMDsKKwludW13ZmRzID0gc2VsZWN0IChzb2Nrc2VyX2ZkICsgMSwgMCwgJndyaXRlZmRzLCAwLCAmdHYpOworICAgICAgfQorICAgIGVsc2UgLyogZG8gYm90aCBzZWxlY3RzIGF0IG9uY2UgKi8KKyAgICAgIHsKKwl0di50dl9zZWMgPSAwOworCXR2LnR2X3VzZWMgPSAwOworCW51bXJmZHMgPSBudW13ZmRzID0gc2VsZWN0IChzb2Nrc2VyX2ZkICsgMSwgJnJlYWRmZHMsICZ3cml0ZWZkcywgMCwgJnR2KTsKKyAgICAgIH0KKyAgfQorCisgIHN0YXR1cyA9IDA7CisgIGlmIChudW1yZmRzIDw9IDAgfHwgISBGRF9JU1NFVCAoc29ja3Nlcl9mZCwgJnJlYWRmZHMpKQorICAgIHN0YXR1cyB8PSBEVl9TT0NLU0VSX0lOUFVUX0VNUFRZOworICBpZiAobnVtd2ZkcyA8PSAwIHx8IEZEX0lTU0VUIChzb2Nrc2VyX2ZkLCAmd3JpdGVmZHMpKQorICAgIHN0YXR1cyB8PSBEVl9TT0NLU0VSX09VVFBVVF9FTVBUWTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworaW50Citkdl9zb2Nrc2VyX3dyaXRlIChTSU1fREVTQyBzZCwgdW5zaWduZWQgY2hhciBjKQoreworICBpbnQgbjsKKworICBpZiAoISBjb25uZWN0ZWRfcCAoc2QpKQorICAgIHJldHVybiAtMTsKKyAgbiA9IHdyaXRlIChzb2Nrc2VyX2ZkLCAmYywgMSk7CisgIGlmIChuID09IC0xKQorICAgIHsKKyAgICAgIGlmIChlcnJubyA9PSBFUElQRSkKKwl7CisJICBjbG9zZSAoc29ja3Nlcl9mZCk7CisJICBzb2Nrc2VyX2ZkID0gLTE7CisJfQorICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgaWYgKG4gIT0gMSkKKyAgICByZXR1cm4gLTE7CisgIHJldHVybiAxOworfQorCitpbnQKK2R2X3NvY2tzZXJfcmVhZCAoU0lNX0RFU0Mgc2QpCit7CisgIHVuc2lnbmVkIGNoYXIgYzsKKyAgaW50IG47CisKKyAgaWYgKCEgY29ubmVjdGVkX3AgKHNkKSkKKyAgICByZXR1cm4gLTE7CisgIG4gPSByZWFkIChzb2Nrc2VyX2ZkLCAmYywgMSk7CisgIC8qID8/PyBXZSdyZSBhc3N1bWluZyBzZW1hbnRpY3MgdGhhdCBtYXkgbm90IGJlIGNvcnJlY3QgZm9yIGFsbCBob3N0cy4KKyAgICAgSW4gcGFydGljdWxhciAoZnJvbSBjdnNzcmMvc3JjL3NlcnZlci5jKSwgdGhpcyBhc3N1bWVzIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgIEJTRCBvciBQT1NJWCBub25ibG9ja2luZyBJL08uICBTeXN0ZW0gViBub25ibG9ja2luZyBJL08gcmV0dXJucyB6ZXJvIGlmCisgICAgIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmVhZC4gICovCisgIGlmIChuID09IDApCisgICAgeworICAgICAgY2xvc2UgKHNvY2tzZXJfZmQpOworICAgICAgc29ja3Nlcl9mZCA9IC0xOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgaWYgKG4gIT0gMSkKKyAgICByZXR1cm4gLTE7CisgIHJldHVybiBjOworfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9kdi1zb2Nrc2VyLmggYi9zaW0vY29tbW9uL2R2LXNvY2tzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjBhN2E5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9kdi1zb2Nrc2VyLmgKQEAgLTAsMCArMSwzMiBAQAorLyogU2VyaWFsIHBvcnQgZW11bGF0aW9uIHZpYSBzb2NrZXRzLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBzaW11bGF0b3JzLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIERWX1NPQ0tTRVJfSAorI2RlZmluZSBEVl9TT0NLU0VSX0gKKworLyogYml0cyBpbiByZXN1bHQgb2YgZGV2X3NvY2tzZXJfc3RhdHVzICovCisjZGVmaW5lIERWX1NPQ0tTRVJfSU5QVVRfRU1QVFkgIDEKKyNkZWZpbmUgRFZfU09DS1NFUl9PVVRQVVRfRU1QVFkgMgorCisvKiBGSVhNRTogbGF0ZXIgYWRkIGEgZGV2aWNlIHB0ciBhcmcgKi8KK2V4dGVybiBpbnQgZHZfc29ja3Nlcl9zdGF0dXMgKFNJTV9ERVNDKTsKK2ludCBkdl9zb2Nrc2VyX3dyaXRlIChTSU1fREVTQywgdW5zaWduZWQgY2hhcik7CitpbnQgZHZfc29ja3Nlcl9yZWFkIChTSU1fREVTQyk7CisKKyNlbmRpZiAvKiBEVl9TT0NLU0VSX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vZ2RiaW5pdC5pbiBiL3NpbS9jb21tb24vZ2RiaW5pdC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGRhMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9nZGJpbml0LmluCkBAIC0wLDAgKzEsMTAgQEAKK2JyZWFrIHNpbV9pb19lcnJvcgorCitkZWZpbmUgZHVtcAorc2V0IHNpbV9kZWJ1Z19kdW1wICgpCitlbmQKKworZG9jdW1lbnQgZHVtcAorRHVtcCBjcHUgYW5kIHNpbXVsYXRvciByZWdpc3RlcnMgZm9yIGRlYnVnZ2luZyB0aGUgc2ltdWxhdG9yLgorUmVxdWlyZXMgdGhlIHNpbXVsYXRvciB0byBwcm92aWRlIGZ1bmN0aW9uIHNpbV9kZWJ1Z19kdW1wLgorZW5kCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2dlbm1sb29wLnNoIGIvc2ltL2NvbW1vbi9nZW5tbG9vcC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjVmZTcyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9nZW5tbG9vcC5zaApAQCAtMCwwICsxLDExMjIgQEAKKyMgR2VuZXJhdGUgdGhlIG1haW4gbG9vcCBvZiB0aGUgc2ltdWxhdG9yLgorIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIHNpbXVsYXRvcnMuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIFRoaXMgZmlsZSBjcmVhdGVzIHR3byBmaWxlczogZW5nLmhpbiBhbmQgbWxvb3AuY2luLgorIyBlbmcuaGluIGRlZmluZXMgYSBmZXcgbWFjcm9zIHRoYXQgc3BlY2lmeSB3aGF0IGtpbmQgb2YgZW5naW5lIHdhcyBzZWxlY3RlZAorIyBiYXNlZCBvbiB0aGUgYXJndW1lbnRzIHRvIHRoaXMgc2NyaXB0LgorIyBtbG9vcC5jaW4gY29udGFpbnMgdGhlIGVuZ2luZS4KKyMKKyMgPz8/IFJlbmFtZSBtbG9vcC5jIHRvIGVuZy5jPworIyA/Pz8gUmVuYW1lIG1haW5sb29wLmluIHRvIGVuZ2luZS5pbj8KKyMgPz8/IEFkZCBvcHRpb25zIHRvIHNwZWNpZnkgb3V0cHV0IGZpbGUgbmFtZXM/CisjID8/PyBSZW5hbWUgdGhpcyBmaWxlIHRvIGdlbmVuZ2luZS5zaD8KKyMKKyMgU3ludGF4OiBnZW5tbG9vcC5zaCBbb3B0aW9uc10KKyMKKyMgT3B0aW9uczoKKyMKKyMgLW1vbm8gfCAtbXVsdGkKKyMgICAgLSBzcGVjaWZ5IHNpbmdsZSBjcHUgb3IgbXVsdGlwbGUgY3B1cyAobnVtYmVyIHNwZWNpZnlhYmxlIGF0IHJ1bnRpbWUpLAorIyAgICAgIG1heGltdW0gbnVtYmVyIGlzIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIKKyMgICAgLSAtbXVsdGkgd2lwCisjCisjIC1mYXN0OiBpbmNsdWRlIHN1cHBvcnQgZm9yIGZhc3QgZXhlY3V0aW9uIGluIGFkZGl0aW9uIHRvIGZ1bGwgZmVhdHVyZWQgbW9kZQorIworIwlGdWxsIGZlYXR1cmVkIG1vZGUgaXMgZm9yIHRyYWNpbmcsIHByb2ZpbGluZywgZXRjLiBhbmQgaXMgYWx3YXlzCisjCXByb3ZpZGVkLiAgRmFzdCBtb2RlIGNvbnRhaW5zIG5vIGZyaWxscywgZXhjZXB0IHNwZWVkLgorIwlBIHRhcmdldCBuZWVkIG9ubHkgcHJvdmlkZSBhICJmdWxsIiB2ZXJzaW9uIG9mIG9uZSBvZgorIwlzaW1wbGUsc2NhY2hlLHBiYi4gIElmIHRoZSB0YXJnZXQgd2FudHMgaXQgY2FuIGFsc28gcHJvdmlkZSBhIGZhc3QKKyMJdmVyc2lvbiBvZiBzYW1lLiAgSXQgY2FuJ3QgcHJvdmlkZSBtb3JlIHRoYW4gdGhpcy4KKyMJPz8/IExhdGVyIGFkZCBhYmlsaXR5IHRvIGhhdmUgYW5vdGhlciBzZXQgb2YgZnVsbC9mYXN0IHNlbWFudGljcworIwlmb3IgdXNlIGluIHdpdGgtZGV2aWNlcy93aXRoLXNtcCBzaXR1YXRpb25zIChwYmIgY2FuIGJlIGluYXBwcm9wcmlhdGUKKyMJaGVyZSkuCisjCisjIC1mdWxsLXN3aXRjaDogc2FtZSBhcyAtZmFzdCBidXQgZm9yIGZ1bGwgZmVhdHVyZWQgdmVyc2lvbiBvZiAtc3dpdGNoCisjCU9ubHkgbmVlZGVkIGlmIC1mYXN0IHByZXNlbnQuCisjCisjIC1zaW1wbGU6IHNpbXBsZSBleGVjdXRpb24gZW5naW5lICh0aGUgZGVmYXVsdCkKKyMKKyMJVGhpcyBlbmdpbmUgZmV0Y2hlcyBhbmQgZXhlY3V0ZXMgb25lIGluc3RydWN0aW9uIGF0IGEgdGltZS4KKyMJRmllbGQgZXh0cmFjdGlvbiBpcyBkb25lIGluIHRoZSBzZW1hbnRpYyByb3V0aW5lcy4KKyMKKyMJPz8/IFRoZXJlIGFyZSB0d28gcG9zc2libGUgZmxhdm91cnMgb2YgLXNpbXBsZS4gIE9uZSB0aGF0IGV4dHJhY3RzCisjCWZpZWxkcyBpbiB0aGUgc2VtYW50aWMgcm91dGluZSAod2hpY2ggaXMgd2hhdCBpcyBpbXBsZW1lbnRlZCBoZXJlKSwKKyMJYW5kIG9uZSB0aGF0IHN0b3JlcyB0aGUgZXh0cmFjdGVkIGZpZWxkcyBpbiBBUkdCVUYgYmVmb3JlIGNhbGxpbmcgdGhlCisjCXNlbWFudGljIHJvdXRpbmUuICBUaGUgbGF0dGVyIGlzIGVzc2VudGlhbGx5IHRoZSAtc2NhY2hlIGNhc2Ugd2l0aCBhCisjCWNhY2hlIHNpemUgb2Ygb25lIChhbmQgdGhlIHNjYWNoZSBsb29rdXAgY29kZSByZW1vdmVkKS4gIFRoZXJlIGFyZSBubworIwljdXJyZW50IHVzZXMgb2YgdGhpcyBhbmQgaXQncyBub3QgY2xlYXIgd2hlbiBkb2luZyB0aGlzIHdvdWxkIGJlIGEgd2luLgorIwlNb3JlIGNvbXBsaWNhdGVkIElTQSdzIHRoYXQgd2FudCB0byB1c2UgLXNpbXBsZSBtYXkgZmluZCB0aGlzIGEgd2luLgorIwlTaG91bGQgdGhpcyBldmVyIGJlIGRlc2lyYWJsZSwgaW1wbGVtZW50IGEgbmV3IGVuZ2luZSBzdHlsZSBoZXJlIGFuZAorIwljYWxsIGl0IC1leHRyYWN0IChvciBzb21lIHN1Y2gpLiAgSXQncyBiZWxpZXZlZCB0aGF0IHRoZSBDR0VOLWdlbmVyYXRlZAorIwljb2RlIGZvciB0aGUgLXNjYWNoZSBjYXNlIHdvdWxkIGJlIHVzYWJsZSBoZXJlLCBzbyBubyBuZXcgY29kZQorIwlnZW5lcmF0aW9uIG9wdGlvbiB3b3VsZCBiZSBuZWVkZWQgZm9yIENHRU4uCisjCisjIC1zY2FjaGU6IHVzZSB0aGUgc2NhY2hlIHRvIHNwZWVkIHRoaW5ncyB1cCAobm90IGFsd2F5cyBhIHdpbikKKyMKKyMJVGhpcyBlbmdpbmUgY2FjaGVzIHRoZSBleHRyYWN0ZWQgaW5zdHJ1Y3Rpb24gYmVmb3JlIGV4ZWN1dGluZyBpdC4KKyMJV2hlbiBleGVjdXRpbmcgaW5zdHJ1Y3Rpb25zIHRoZXkgYXJlIGZpcnN0IGxvb2tlZCB1cCBpbiB0aGUgc2NhY2hlLgorIworIyAtcGJiOiBzYW1lIGFzIC1zY2FjaGUgYnV0IGV4dHJhY3QgYSAocHNldWRvLSkgYmFzaWMgYmxvY2sgYXQgYSB0aW1lCisjCisjCVRoaXMgZW5naW5lIGlzIGJhc2ljYWxseSBpZGVudGljYWwgdG8gdGhlIHNjYWNoZSB2ZXJzaW9uIGV4Y2VwdCB0aGF0CisjCWV4dHJhY3Rpb24gaXMgZG9uZSBhIHBzZXVkby1iYXNpYy1ibG9jayBhdCBhIHRpbWUgYW5kIHRoZSBhZGRyZXNzIG9mCisjCXRoZSBzY2FjaGUgZW50cnkgb2YgYSBicmFuY2ggdGFyZ2V0IGlzIHJlY29yZGVkIGFzIHdlbGwuCisjCUFkZGl0aW9uYWwgc3BlZWR1cHMgYXJlIHRoZW4gcG9zc2libGUgYnkgZGVmZXJpbmcgQ3RybC1DIGNoZWNraW5nCisjCXRvIHRoZSBlbmQgb2YgYmFzaWMgYmxvY2tzIGFuZCBieSB0aHJlYWRpbmcgdGhlIGluc25zIHRvZ2V0aGVyLgorIwlXZSBjYWxsIHRoZW0gcHNldWRvLWJhc2ljLWJsb2NrJ3MgaW5zdGVhZCBvZiBqdXN0IGJhc2ljLWJsb2NrcyBiZWNhdXNlCisjCXRoZXkncmUgbm90IG5lY2Vzc2FyaWx5IGJhc2ljLWJsb2NrcywgdGhvdWdoIG5vcm1hbGx5IGFyZS4KKyMKKyMgLXBhcmFsbGVsLXJlYWQ6IHN1cHBvcnQgcGFyYWxsZWwgZXhlY3V0aW9uIHdpdGggcmVhZC1iZWZvcmUtZXhlYyBzdXBwb3J0LgorIyAtcGFyYWxsZWwtd3JpdGU6IHN1cHBvcnQgcGFyYWxsZWwgZXhlY3V0aW9uIHdpdGggd3JpdGUtYWZ0ZXItZXhlYyBzdXBwb3J0LgorIworIwlPbmUgb2YgdGhlc2Ugb3B0aW9ucyBpcyBzcGVjaWZpZWQgaW4gYWRkaXRpb24gdG8gLXNpbXBsZSwgLXNjYWNoZSwKKyMJLXBiYi4gIE5vdGUgdGhhdCB3aGlsZSB0aGUgY29kZSBjYW4gZGV0ZXJtaW5lIGlmIHRoZSBjcHUgc3VwcG9ydHMKKyMJcGFyYWxsZWwgZXhlY3V0aW9uIHdpdGggSEFWRV9QQVJBTExFTF9JTlNOUyBbYW5kIHRodXMgdGhpcyBvcHRpb24gaXMKKyMJdGVjaG5pY2FsbHkgdW5uZWNlc3NhcnldLCBoYXZpbmcgdGhpcyBvcHRpb24gY3V0cyBkb3duIG9uIHRoZSBjbHV0dGVyCisjCWluIHRoZSByZXN1bHQuCisjCisjIC1zd2l0Y2ggZmlsZTogc3BlY2lmeSBmaWxlIGNvbnRhaW5pbmcgc2VtYW50aWNzIGltcGxlbWVudGVkIGFzIGEgc3dpdGNoKCkKKyMKKyMgLWNwdSA8Y3B1LWZhbWlseT4KKyMKKyMJU3BlY2lmeSB0aGUgY3B1IGZhbWlseSBuYW1lLgorIworIyAtaW5maWxlIDxpbnB1dC1maWxlPgorIworIwlTcGVjaWZ5IHRoZSBtYWlubG9vcC5pbiBpbnB1dCBmaWxlLgorIworIyBPbmx5IG9uZSBvZiAtc2NhY2hlLy1wYmIgbWF5IGJlIHNlbGVjdGVkLgorIyAtc2ltcGxlIGlzIHRoZSBkZWZhdWx0LgorIworIyMjIworIworIyBUT0RPCisjIC0gYnVpbGQgbWFpbmxvb3AuaW4gZnJvbSAuY3B1IGZpbGUKKwordHlwZT1tb25vCisjc2NhY2hlPQorI2Zhc3Q9CisjZnVsbF9zd2l0Y2g9CisjcGJiPQorcGFyYWxsZWw9bm8KK3N3aXRjaD0KK2NwdT0idW5rbm93biIKK2luZmlsZT0iIgorCit3aGlsZSB0ZXN0ICQjIC1ndCAwCitkbworCWNhc2UgJDEgaW4KKwktbW9ubykgdHlwZT1tb25vIDs7CisJLW11bHRpKSB0eXBlPW11bHRpIDs7CisJLW5vLWZhc3QpIDs7CisJLWZhc3QpIGZhc3Q9eWVzIDs7CisJLWZ1bGwtc3dpdGNoKSBmdWxsX3N3aXRjaD15ZXMgOzsKKwktc2ltcGxlKSA7OworCS1zY2FjaGUpIHNjYWNoZT15ZXMgOzsKKwktcGJiKSBwYmI9eWVzIDs7CisJLW5vLXBhcmFsbGVsKSA7OworCS1wYXJhbGxlbC1yZWFkKSBwYXJhbGxlbD1yZWFkIDs7CisJLXBhcmFsbGVsLXdyaXRlKSBwYXJhbGxlbD13cml0ZSA7OworCS1zd2l0Y2gpIHNoaWZ0IDsgc3dpdGNoPSQxIDs7CisJLWNwdSkgc2hpZnQgOyBjcHU9JDEgOzsKKwktaW5maWxlKSBzaGlmdCA7IGluZmlsZT0kMSA7OworCSopIGVjaG8gInVua25vd24gb3B0aW9uOiAkMSIgPiYyIDsgZXhpdCAxIDs7CisJZXNhYworCXNoaWZ0Citkb25lCisKKyMgQXJndW1lbnQgdmFsaWRhdGlvbi4KKworaWYgWyB4JHNjYWNoZSA9IHh5ZXMgLWEgeCRwYmIgPSB4eWVzIF0gOyB0aGVuCisgICAgZWNobyAib25seSBvbmUgb2YgLXNjYWNoZSBhbmQgLXBiYiBtYXkgYmUgc2VsZWN0ZWQiID4mMgorICAgIGV4aXQgMQorZmkKKworaWYgWyAieCRjcHUiID0geHVua25vd24gXSA7IHRoZW4KKyAgICBlY2hvICJjcHUgZmFtaWx5IG5vdCBzcGVjaWZpZWQiID4mMgorICAgIGV4aXQgMQorZmkKKworaWYgWyAieCRpbmZpbGUiID0geCBdIDsgdGhlbgorICAgIGVjaG8gIm1haW5sb29wLmluIG5vdCBzcGVjaWZpZWQiID4mMgorICAgIGV4aXQgMQorZmkKKworbG93ZXJjYXNlPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKK3VwcGVyY2FzZT0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCitDUFU9YGVjaG8gJHtjcHV9IHwgdHIgIiR7bG93ZXJjYXNlfSIgIiR7dXBwZXJjYXNlfSJgCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3JtIC1mIGVuZy5oaW4KK2V4ZWMgMT5lbmcuaGluCisKK2VjaG8gIi8qIGVuZ2luZSBjb25maWd1cmF0aW9uIGZvciAke2NwdX0gKi8iCitlY2hvICIiCisKK2VjaG8gIi8qIFdJVEhfRkFTVDogbm9uLXplcm8gaWYgYSBmYXN0IHZlcnNpb24gb2YgdGhlIGVuZ2luZSBpcyBhdmFpbGFibGUiCitlY2hvICIgICBpbiBhZGRpdGlvbiB0byB0aGUgZnVsbC1mZWF0dXJlZCB2ZXJzaW9uLiAgKi8iCitpZiBbIHgkZmFzdCA9IHh5ZXMgXSA7IHRoZW4KKwllY2hvICIjZGVmaW5lIFdJVEhfRkFTVCAxIgorZWxzZQorCWVjaG8gIiNkZWZpbmUgV0lUSF9GQVNUIDAiCitmaQorCitlY2hvICIiCitlY2hvICIvKiBXSVRIX1NDQUNIRV9QQkJfJHtDUFV9OiBub24temVybyBpZiB0aGUgcGJiIGVuZ2luZSB3YXMgc2VsZWN0ZWQuICAqLyIKK2lmIFsgeCRwYmIgPSB4eWVzIF0gOyB0aGVuCisJZWNobyAiI2RlZmluZSBXSVRIX1NDQUNIRV9QQkJfJHtDUFV9IDEiCitlbHNlCisJZWNobyAiI2RlZmluZSBXSVRIX1NDQUNIRV9QQkJfJHtDUFV9IDAiCitmaQorCitlY2hvICIiCitlY2hvICIvKiBIQVZFX1BBUkFMTEVMX0lOU05TOiBub24temVybyBpZiBjcHUgY2FuIHBhcmFsbGVsbHkgZXhlY3V0ZSA+IDEgaW5zbi4gICovIgoraWYgWyB4JHBhcmFsbGVsICE9IHhubyBdIDsgdGhlbgorCWVjaG8gIiNkZWZpbmUgSEFWRV9QQVJBTExFTF9JTlNOUyAxIgorCWlmIFsgeCRwYXJhbGxlbCA9IHhyZWFkIF0gOyB0aGVuCisJICAgIGVjaG8gIi8qIFBhcmFsbGVsIGV4ZWN1dGlvbiBpcyBzdXBwb3J0ZWQgYnkgcmVhZC1iZWZvcmUtZXhlYy4gICovIgorCSAgICBlY2hvICIjZGVmaW5lIFdJVEhfUEFSQUxMRUxfUkVBRCAxIgorCSAgICBlY2hvICIjZGVmaW5lIFdJVEhfUEFSQUxMRUxfV1JJVEUgMCIKKwllbHNlCisJICAgIGVjaG8gIi8qIFBhcmFsbGVsIGV4ZWN1dGlvbiBpcyBzdXBwb3J0ZWQgYnkgd3JpdGUtYWZ0ZXItZXhlYy4gICovIgorCSAgICBlY2hvICIjZGVmaW5lIFdJVEhfUEFSQUxMRUxfUkVBRCAwIgorCSAgICBlY2hvICIjZGVmaW5lIFdJVEhfUEFSQUxMRUxfV1JJVEUgMSIKKwlmaQorZWxzZQorCWVjaG8gIiNkZWZpbmUgSEFWRV9QQVJBTExFTF9JTlNOUyAwIgorCWVjaG8gIiNkZWZpbmUgV0lUSF9QQVJBTExFTF9SRUFEIDAiCisJZWNobyAiI2RlZmluZSBXSVRIX1BBUkFMTEVMX1dSSVRFIDAiCitmaQorCitpZiBbICJ4JHN3aXRjaCIgIT0geCBdIDsgdGhlbgorCWVjaG8gIiIKKwllY2hvICIvKiBXSVRIX1NFTV9TV0lUQ0hfRlVMTDogbm9uLXplcm8gaWYgZnVsbC1mZWF0dXJlZCBlbmdpbmUgaXMiCisJZWNobyAiICAgaW1wbGVtZW50ZWQgYXMgYSBzd2l0Y2goKS4gICovIgorCWlmIFsgeCRmYXN0ICE9IHh5ZXMgLW8geCRmdWxsX3N3aXRjaCA9IHh5ZXMgXSA7IHRoZW4KKwkJZWNobyAiI2RlZmluZSBXSVRIX1NFTV9TV0lUQ0hfRlVMTCAxIgorCWVsc2UKKwkJZWNobyAiI2RlZmluZSBXSVRIX1NFTV9TV0lUQ0hfRlVMTCAwIgorCWZpCisJZWNobyAiIgorCWVjaG8gIi8qIFdJVEhfU0VNX1NXSVRDSF9GQVNUOiBub24temVybyBpZiBmYXN0IGVuZ2luZSBpcyIKKwllY2hvICIgICBpbXBsZW1lbnRlZCBhcyBhIHN3aXRjaCgpLiAgKi8iCisJaWYgWyB4JGZhc3QgPSB4eWVzIF0gOyB0aGVuCisJCWVjaG8gIiNkZWZpbmUgV0lUSF9TRU1fU1dJVENIX0ZBU1QgMSIKKwllbHNlCisJCWVjaG8gIiNkZWZpbmUgV0lUSF9TRU1fU1dJVENIX0ZBU1QgMCIKKwlmaQorZmkKKworIyBEZWNscyBvZiBmdW5jdGlvbnMgd2UgZGVmaW5lLgorCitlY2hvICIiCitlY2hvICIvKiBGdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgZ2VuZXJhdGVkIG1haW5sb29wLmMgZmlsZSIKK2VjaG8gIiAgICh3aGljaCBkb2Vzbid0IG5lY2Vzc2FyaWx5IGhhdmUgdGhhdCBmaWxlIG5hbWUpLiAgKi8iCitlY2hvICIiCitlY2hvICJleHRlcm4gRU5HSU5FX0ZOICR7Y3B1fV9lbmdpbmVfcnVuX2Z1bGw7IgorZWNobyAiZXh0ZXJuIEVOR0lORV9GTiAke2NwdX1fZW5naW5lX3J1bl9mYXN0OyIKKworaWYgWyB4JHBiYiA9IHh5ZXMgXSA7IHRoZW4KKwllY2hvICIiCisJZWNobyAiZXh0ZXJuIFNFTV9QQyAke2NwdX1fcGJiX2JlZ2luIChTSU1fQ1BVICosIGludCk7IgorCWVjaG8gImV4dGVybiBTRU1fUEMgJHtjcHV9X3BiYl9jaGFpbiAoU0lNX0NQVSAqLCBTRU1fQVJHKTsiCisJZWNobyAiZXh0ZXJuIFNFTV9QQyAke2NwdX1fcGJiX2N0aV9jaGFpbiAoU0lNX0NQVSAqLCBTRU1fQVJHLCBTRU1fUEMgKiwgUENBRERSKTsiCisJZWNobyAiZXh0ZXJuIHZvaWQgJHtjcHV9X3BiYl9iZWZvcmUgKFNJTV9DUFUgKiwgU0NBQ0hFICopOyIKKwllY2hvICJleHRlcm4gdm9pZCAke2NwdX1fcGJiX2FmdGVyIChTSU1fQ1BVICosIFNDQUNIRSAqKTsiCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitybSAtZiB0bXAtbWxvb3AuY2luIG1sb29wLmNpbgorZXhlYyAxPnRtcC1tbG9vcC5jaW4KKworIyBXZSB1c2UgQGNwdUAgaW5zdGVhZCBvZiAke2NwdX0gYmVjYXVzZSB3ZSBzdGlsbCBuZWVkIHRvIHJ1biBzZWQgdG8gaGFuZGxlCisjIHRyYW5zZm9ybWF0aW9uIG9mIEBjcHVAIGZvciBtYWlubG9vcC5pbiwgc28gdGhlcmUncyBubyBuZWVkIHRvIHVzZSAke2NwdX0KKyMgaGVyZS4KKworY2F0IDw8IEVPRgorLyogVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSB0aGUgZ2VubWxvb3Agc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCisKKy8qIEVuYWJsZSBzd2l0Y2goKSBzdXBwb3J0IGluIGNnZW4gaGVhZGVycy4gICovCisjZGVmaW5lIFNFTV9JTl9TV0lUQ0gKKworI2RlZmluZSBXQU5UX0NQVSBAY3B1QAorI2RlZmluZSBXQU5UX0NQVV9AQ1BVQAorCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJjZ2VuLW1lbS5oIgorI2luY2x1ZGUgImNnZW4tb3BzLmgiCisjaW5jbHVkZSAic2ltLWFzc2VydC5oIgorCisvKiBGaWxsIGluIHRoZSBhZG1pbmlzdHJhdGl2ZSBBUkdCVUYgZmllbGRzIHJlcXVpcmVkIGJ5IGFsbCBpbnNucywKKyAgIHZpcnR1YWwgYW5kIHJlYWwuICAqLworCitzdGF0aWMgSU5MSU5FIHZvaWQKK0BjcHVAX2ZpbGxfYXJnYnVmIChjb25zdCBTSU1fQ1BVICpjcHUsIEFSR0JVRiAqYWJ1ZiwgY29uc3QgSURFU0MgKmlkZXNjLAorCQkgICAgUENBRERSIHBjLCBpbnQgZmFzdF9wKQoreworI2lmIFdJVEhfU0NBQ0hFCisgIFNFTV9TRVRfQ09ERSAoYWJ1ZiwgaWRlc2MsIGZhc3RfcCk7CisgIEFSR0JVRl9BRERSIChhYnVmKSA9IHBjOworI2VuZGlmCisgIEFSR0JVRl9JREVTQyAoYWJ1ZikgPSBpZGVzYzsKK30KKworLyogRmlsbCBpbiB0cmFjaW5nL3Byb2ZpbGluZyBmaWVsZHMgb2YgYW4gQVJHQlVGLiAgKi8KKworc3RhdGljIElOTElORSB2b2lkCitAY3B1QF9maWxsX2FyZ2J1Zl90cCAoY29uc3QgU0lNX0NQVSAqY3B1LCBBUkdCVUYgKmFidWYsCisJCSAgICAgICBpbnQgdHJhY2VfcCwgaW50IHByb2ZpbGVfcCkKK3sKKyAgQVJHQlVGX1RSQUNFX1AgKGFidWYpID0gdHJhY2VfcDsKKyAgQVJHQlVGX1BST0ZJTEVfUCAoYWJ1ZikgPSBwcm9maWxlX3A7Cit9CisKKyNpZiBXSVRIX1NDQUNIRV9QQkIKKworLyogRW1pdCB0aGUgIngtYmVmb3JlIiBoYW5kbGVyLgorICAgeC1iZWZvcmUgaXMgZW1pdHRlZCBiZWZvcmUgZWFjaCBpbnNuIChzZXJpYWwgb3IgcGFyYWxsZWwpLgorICAgVGhpcyBpcyBhcyBvcHBvc2VkIHRvIHgtYWZ0ZXIgd2hpY2ggaXMgb25seSBlbWl0dGVkIGF0IHRoZSBlbmQgb2YgYSBncm91cAorICAgb2YgcGFyYWxsZWwgaW5zbnMuICAqLworCitzdGF0aWMgSU5MSU5FIHZvaWQKK0BjcHVAX2VtaXRfYmVmb3JlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0NBQ0hFICpzYywgUENBRERSIHBjLCBpbnQgZmlyc3RfcCkKK3sKKyAgQVJHQlVGICphYnVmID0gJnNjWzBdLmFyZ2J1ZjsKKyAgY29uc3QgSURFU0MgKmlkID0gJiBDUFVfSURFU0MgKGN1cnJlbnRfY3B1KSBbQENQVUBfSU5TTl9YX0JFRk9SRV07CisKKyAgYWJ1Zi0+ZmllbGRzLmJlZm9yZS5maXJzdF9wID0gZmlyc3RfcDsKKyAgQGNwdUBfZmlsbF9hcmdidWYgKGN1cnJlbnRfY3B1LCBhYnVmLCBpZCwgcGMsIDApOworICAvKiBubyBuZWVkIHRvIHNldCB0cmFjZV9wLHByb2ZpbGVfcCAqLworfQorCisvKiBFbWl0IHRoZSAieC1hZnRlciIgaGFuZGxlci4KKyAgIHgtYWZ0ZXIgaXMgZW1pdHRlZCBhZnRlciBhIHNlcmlhbCBpbnNuIG9yIGF0IHRoZSBlbmQgb2YgYSBncm91cCBvZgorICAgcGFyYWxsZWwgaW5zbnMuICAqLworCitzdGF0aWMgSU5MSU5FIHZvaWQKK0BjcHVAX2VtaXRfYWZ0ZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTQ0FDSEUgKnNjLCBQQ0FERFIgcGMpCit7CisgIEFSR0JVRiAqYWJ1ZiA9ICZzY1swXS5hcmdidWY7CisgIGNvbnN0IElERVNDICppZCA9ICYgQ1BVX0lERVNDIChjdXJyZW50X2NwdSkgW0BDUFVAX0lOU05fWF9BRlRFUl07CisKKyAgQGNwdUBfZmlsbF9hcmdidWYgKGN1cnJlbnRfY3B1LCBhYnVmLCBpZCwgcGMsIDApOworICAvKiBubyBuZWVkIHRvIHNldCB0cmFjZV9wLHByb2ZpbGVfcCAqLworfQorCisjZW5kaWYgLyogV0lUSF9TQ0FDSEVfUEJCICovCisKK0VPRgorCiske1NIRUxMfSAkaW5maWxlIHN1cHBvcnQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBTaW1wbGUgZW5naW5lOiBmZXRjaCBhbiBpbnN0cnVjdGlvbiwgZXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24uCisjCisjIEluc3RydWN0aW9uIGZpZWxkcyBhcmUgbm90IGV4dHJhY3RlZCBpbnRvIEFSR0JVRiwgdGhleSBhcmUgZXh0cmFjdGVkIGluCisjIHRoZSBzZW1hbnRpYyByb3V0aW5lcyB0aGVtc2VsdmVzLiAgSG93ZXZlciwgdGhlcmUgaXMgc3RpbGwgYSBuZWVkIHRvIHBhc3MKKyMgYW5kIHJldHVybiBtaXNjLiBpbmZvcm1hdGlvbiB0byB0aGUgc2VtYW50aWMgcm91dGluZXMgc28gd2Ugc3RpbGwgdXNlIEFSR0JVRi4KKyMgW09uZSBjb3VsZCBjZXJ0YWlubHkgaW1wbGVtZW50IHRoaW5ncyBkaWZmZXJlbnRseSBhbmQgcmVtb3ZlIEFSR0JVRi4KKyMgSXQncyBub3QgY2xlYXIgdGhpcyBpcyBuZWNlc3NhcmlseSBhbHdheXMgYSB3aW4uXQorIyA/Pz8gVGhlIHVzZSBvZiB0aGUgU0NBQ0hFIHN0cnVjdCBpcyBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgd2l0aC1zY2FjaGUKKyMgY2FzZSB0aG91Z2ggaXQgbWlnaHQgYmUgYSBzb3VyY2Ugb2YgY29uZnVzaW9uLgorCitpZiBbIHgkc2NhY2hlICE9IHh5ZXMgLWEgeCRwYmIgIT0geHllcyBdIDsgdGhlbgorCisgICAgY2F0IDw8IEVPRgorCisjZGVmaW5lIEZBU1RfUCAwCisKK3ZvaWQKK0BjcHVAX2VuZ2luZV9ydW5fZnVsbCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisjZGVmaW5lIEZBU1RfUCAwCisgIFNJTV9ERVNDIGN1cnJlbnRfc3RhdGUgPSBDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KTsKKyAgLyogPz8/IFVzZSBvZiBTQ0FDSEUgaXMgYSBiaXQgb2YgYSBoYWNrIGFzIHdlIGRvbid0IGFjdHVhbGx5IHVzZSB0aGUgc2NhY2hlLgorICAgICBXZSBkbyBob3dldmVyIHVzZSBBUkdCVUYgc28gZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIG90aGVyIGVuZ2luZSBmbGF2b3VycworICAgICB0aGUgU0NBQ0hFIHR5cGUgaXMgdXNlZC4gICovCisgIFNDQUNIRSBjYWNoZVtNQVhfTElXX0lOU05TXTsKKyAgU0NBQ0hFICpzYyA9ICZjYWNoZVswXTsKKworRU9GCisKK2lmIFsgeCRwYXJhbGxlbCAhPSB4bm8gXSA7IHRoZW4KKyAgY2F0IDw8IEVPRgorICBQQVJFWEVDIHBidWZzW01BWF9QQVJBTExFTF9JTlNOU107CisgIFBBUkVYRUMgKnBhcl9leGVjOworCitFT0YKK2ZpCisKKyMgQW55IGluaXRpYWxpemF0aW9uIGNvZGUgYmVmb3JlIGxvb3Bpbmcgc3RhcnRzLgorIyBOb3RlIHRoYXQgdGhpcyBjb2RlIG1heSBkZWNsYXJlIHNvbWUgbG9jYWxzLgorJHtTSEVMTH0gJGluZmlsZSBpbml0CisKK2lmIFsgeCRwYXJhbGxlbCAhPSB4bm8gXSA7IHRoZW4KKyAgY2F0IDw8IEVPRgorCisjaWYgZGVmaW5lZCAoSEFWRV9QQVJBTExFTF9FWEVDKSAmJiBkZWZpbmVkIChfX0dOVUNfXykKKyAgeworICAgIGlmICghIENQVV9JREVTQ19SRUFEX0lOSVRfUCAoY3VycmVudF9jcHUpKQorICAgICAgeworLyogPz8/IExhdGVyIG1heWJlIHBhc3RlIHJlYWQuYyBpbiB3aGVuIGJ1aWxkaW5nIG1haW5sb29wLmMuICAqLworI2RlZmluZSBERUZJTkVfTEFCRUxTCisjaW5jbHVkZSAicmVhZHguYyIKKwlDUFVfSURFU0NfUkVBRF9JTklUX1AgKGN1cnJlbnRfY3B1KSA9IDE7CisgICAgICB9CisgIH0KKyNlbmRpZgorCitFT0YKK2ZpCisKK2NhdCA8PCBFT0YKKworI2lmIFdJVEhfU0VNX1NXSVRDSF9GVUxMICYmIGRlZmluZWQgKF9fR05VQ19fKQorICB7CisgICAgaWYgKCEgQ1BVX0lERVNDX1NFTV9JTklUX1AgKGN1cnJlbnRfY3B1KSkKKyAgICAgIHsKKy8qID8/PyBMYXRlciBtYXliZSBwYXN0ZSBzZW0tc3dpdGNoLmMgaW4gd2hlbiBidWlsZGluZyBtYWlubG9vcC5jLiAgKi8KKyNkZWZpbmUgREVGSU5FX0xBQkVMUworI2luY2x1ZGUgIiRzd2l0Y2giCisJQ1BVX0lERVNDX1NFTV9JTklUX1AgKGN1cnJlbnRfY3B1KSA9IDE7CisgICAgICB9CisgIH0KKyNlbmRpZgorCisgIGRvCisgICAgeworLyogYmVnaW4gZnVsbC1leGVjLXNpbXBsZSAqLworRU9GCisKKyR7U0hFTEx9ICRpbmZpbGUgZnVsbC1leGVjLXNpbXBsZQorCitjYXQgPDwgRU9GCisvKiBlbmQgZnVsbC1leGVjLXNpbXBsZSAqLworCisgICAgICArKyBDUFVfSU5TTl9DT1VOVCAoY3VycmVudF9jcHUpOworICAgIH0KKyAgd2hpbGUgKDAgLypDUFVfUlVOTklOR19QIChjdXJyZW50X2NwdSkqLyk7Cit9CisKKyN1bmRlZiBGQVNUX1AKKworRU9GCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFNpbXBsZSBlbmdpbmU6IGZhc3QgdmVyc2lvbi4KKyMgPz8/IEEgc29tZXdoYXQgZHViaW91cyBlZmZvcnQsIGJ1dCBmb3IgY29tcGxldGVuZXNzJyBzYWtlLgorCitpZiBbIHgkZmFzdCA9IHh5ZXMgXSA7IHRoZW4KKworICAgIGNhdCA8PCBFT0YKKworI2RlZmluZSBGQVNUX1AgMQorCitGSVhNRTogImZhc3Qgc2ltcGxlIHZlcnNpb24gdW5pbXBsZW1lbnRlZCwgZGVsZXRlIC1mYXN0IGFyZyB0byBnZW5tbG9vcC5zaC4iCisKKyN1bmRlZiBGQVNUX1AKKworRU9GCisKK2ZpICMgLWZhc3QKKworZmkgIyBzaW1wbGUgZW5naW5lCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgU2NhY2hlIGVuZ2luZTogbG9va3VwIGluc24gaW4gc2NhY2hlLCBmZXRjaCBpZiBtaXNzaW5nLCB0aGVuIGV4ZWN1dGUgaXQuCisKK2lmIFsgeCRzY2FjaGUgPSB4eWVzIF0gOyB0aGVuCisKKyAgICBjYXQgPDwgRU9GCisKK3N0YXRpYyBJTkxJTkUgU0NBQ0hFICoKK0BjcHVAX3NjYWNoZV9sb29rdXAgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBQQ0FERFIgdnBjLCBTQ0FDSEUgKnNjYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBoYXNoX21hc2ssIGludCBGQVNUX1ApCit7CisgIC8qIEZpcnN0IHN0ZXA6IGxvb2sgdXAgY3VycmVudCBpbnNuIGluIGhhc2ggdGFibGUuICAqLworICBTQ0FDSEUgKnNjID0gc2NhY2hlICsgU0NBQ0hFX0hBU0hfUEMgKHZwYywgaGFzaF9tYXNrKTsKKworICAvKiBJZiB0aGUgZW50cnkgaXNuJ3QgdGhlIG9uZSB3ZSB3YW50IChjYWNoZSBtaXNzKSwKKyAgICAgZmV0Y2ggYW5kIGRlY29kZSB0aGUgaW5zdHJ1Y3Rpb24uICAqLworICBpZiAoc2MtPmFyZ2J1Zi5hZGRyICE9IHZwYykKKyAgICB7CisgICAgICBpbnNuX3QgaW5zbjsKKworICAgICAgaWYgKEZBU1RfUCkKKwlQUk9GSUxFX0NPVU5UX1NDQUNIRV9NSVNTIChjdXJyZW50X2NwdSk7CisKKy8qIGJlZ2luIGV4dHJhY3Qtc2NhY2hlICovCitFT0YKKworJHtTSEVMTH0gJGluZmlsZSBleHRyYWN0LXNjYWNoZQorCitjYXQgPDwgRU9GCisvKiBlbmQgZXh0cmFjdC1zY2FjaGUgKi8KKyAgICB9CisgIGVsc2UgaWYgKEZBU1RfUCkKKyAgICB7CisgICAgICBQUk9GSUxFX0NPVU5UX1NDQUNIRV9ISVQgKGN1cnJlbnRfY3B1KTsKKyAgICAgIC8qIE1ha2UgY29yZSBhY2Nlc3Mgc3RhdGlzdGljcyBjb21lIG91dCByaWdodC4KKwkgVGhlIHNpemUgaXMgYSBndWVzcywgYnV0IGl0J3MgY3VycmVudGx5IG5vdCB1c2VkIGVpdGhlci4gICovCisgICAgICBQUk9GSUxFX0NPVU5UX0NPUkUgKGN1cnJlbnRfY3B1LCB2cGMsIDIsIGV4ZWNfbWFwKTsKKyAgICB9CisKKyAgcmV0dXJuIHNjOworfQorCisjZGVmaW5lIEZBU1RfUCAwCisKK3ZvaWQKK0BjcHVAX2VuZ2luZV9ydW5fZnVsbCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIFNJTV9ERVNDIGN1cnJlbnRfc3RhdGUgPSBDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KTsKKyAgU0NBQ0hFICpzY2FjaGUgPSBDUFVfU0NBQ0hFX0NBQ0hFIChjdXJyZW50X2NwdSk7CisgIHVuc2lnbmVkIGludCBoYXNoX21hc2sgPSBDUFVfU0NBQ0hFX0hBU0hfTUFTSyAoY3VycmVudF9jcHUpOworICBTRU1fUEMgdnBjOworCitFT0YKKworaWYgWyB4JHBhcmFsbGVsICE9IHhubyBdIDsgdGhlbgorICBjYXQgPDwgRU9GCisgIFBBUkVYRUMgcGJ1ZnNbTUFYX1BBUkFMTEVMX0lOU05TXTsKKyAgUEFSRVhFQyAqcGFyX2V4ZWM7CisKK0VPRgorZmkKKworIyBBbnkgaW5pdGlhbGl6YXRpb24gY29kZSBiZWZvcmUgbG9vcGluZyBzdGFydHMuCisjIE5vdGUgdGhhdCB0aGlzIGNvZGUgbWF5IGRlY2xhcmUgc29tZSBsb2NhbHMuCiske1NIRUxMfSAkaW5maWxlIGluaXQKKworaWYgWyB4JHBhcmFsbGVsICE9IHhubyBdIDsgdGhlbgorICBjYXQgPDwgRU9GCisKKyNpZiBkZWZpbmVkIChIQVZFX1BBUkFMTEVMX0VYRUMpICYmIGRlZmluZWQgKF9fR05VQ19fKQorICB7CisgICAgaWYgKCEgQ1BVX0lERVNDX1JFQURfSU5JVF9QIChjdXJyZW50X2NwdSkpCisgICAgICB7CisvKiA/Pz8gTGF0ZXIgbWF5YmUgcGFzdGUgcmVhZC5jIGluIHdoZW4gYnVpbGRpbmcgbWFpbmxvb3AuYy4gICovCisjZGVmaW5lIERFRklORV9MQUJFTFMKKyNpbmNsdWRlICJyZWFkeC5jIgorCUNQVV9JREVTQ19SRUFEX0lOSVRfUCAoY3VycmVudF9jcHUpID0gMTsKKyAgICAgIH0KKyAgfQorI2VuZGlmCisKK0VPRgorZmkKKworY2F0IDw8IEVPRgorCisgIHZwYyA9IEdFVF9IX1BDICgpOworCisgIGRvCisgICAgeworICAgICAgU0NBQ0hFICpzYzsKKworICAgICAgc2MgPSBAY3B1QF9zY2FjaGVfbG9va3VwIChjdXJyZW50X2NwdSwgdnBjLCBzY2FjaGUsIGhhc2hfbWFzaywgRkFTVF9QKTsKKworLyogYmVnaW4gZnVsbC1leGVjLXNjYWNoZSAqLworRU9GCisKKyR7U0hFTEx9ICRpbmZpbGUgZnVsbC1leGVjLXNjYWNoZQorCitjYXQgPDwgRU9GCisvKiBlbmQgZnVsbC1leGVjLXNjYWNoZSAqLworCisgICAgICBTRVRfSF9QQyAodnBjKTsKKworICAgICAgKysgQ1BVX0lOU05fQ09VTlQgKGN1cnJlbnRfY3B1KTsKKyAgICB9CisgIHdoaWxlICgwIC8qQ1BVX1JVTk5JTkdfUCAoY3VycmVudF9jcHUpKi8pOworfQorCisjdW5kZWYgRkFTVF9QCisKK0VPRgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBTY2FjaGUgZW5naW5lOiBmYXN0IHZlcnNpb24uCisKK2lmIFsgeCRmYXN0ID0geHllcyBdIDsgdGhlbgorCisgICAgY2F0IDw8IEVPRgorCisjZGVmaW5lIEZBU1RfUCAxCisKK3ZvaWQKK0BjcHVAX2VuZ2luZV9ydW5fZmFzdCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIFNJTV9ERVNDIGN1cnJlbnRfc3RhdGUgPSBDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KTsKKyAgU0NBQ0hFICpzY2FjaGUgPSBDUFVfU0NBQ0hFX0NBQ0hFIChjdXJyZW50X2NwdSk7CisgIHVuc2lnbmVkIGludCBoYXNoX21hc2sgPSBDUFVfU0NBQ0hFX0hBU0hfTUFTSyAoY3VycmVudF9jcHUpOworICBTRU1fUEMgdnBjOworCitFT0YKKworaWYgWyB4JHBhcmFsbGVsICE9IHhubyBdIDsgdGhlbgorICBjYXQgPDwgRU9GCisgIFBBUkVYRUMgcGJ1ZnNbTUFYX1BBUkFMTEVMX0lOU05TXTsKKyAgUEFSRVhFQyAqcGFyX2V4ZWM7CisKK0VPRgorZmkKKworIyBBbnkgaW5pdGlhbGl6YXRpb24gY29kZSBiZWZvcmUgbG9vcGluZyBzdGFydHMuCisjIE5vdGUgdGhhdCB0aGlzIGNvZGUgbWF5IGRlY2xhcmUgc29tZSBsb2NhbHMuCiske1NIRUxMfSAkaW5maWxlIGluaXQKKworaWYgWyB4JHBhcmFsbGVsICE9IHhubyBdIDsgdGhlbgorICBjYXQgPDwgRU9GCisKKyNpZiBkZWZpbmVkIChIQVZFX1BBUkFMTEVMX0VYRUMpICYmIGRlZmluZWQgKF9fR05VQ19fKQorICB7CisgICAgaWYgKCEgQ1BVX0lERVNDX1JFQURfSU5JVF9QIChjdXJyZW50X2NwdSkpCisgICAgICB7CisvKiA/Pz8gTGF0ZXIgbWF5YmUgcGFzdGUgcmVhZC5jIGluIHdoZW4gYnVpbGRpbmcgbWFpbmxvb3AuYy4gICovCisjZGVmaW5lIERFRklORV9MQUJFTFMKKyNpbmNsdWRlICJyZWFkeC5jIgorCUNQVV9JREVTQ19SRUFEX0lOSVRfUCAoY3VycmVudF9jcHUpID0gMTsKKyAgICAgIH0KKyAgfQorI2VuZGlmCisKK0VPRgorZmkgIyBwYXJhbGxlbCAhPSBubworCitjYXQgPDwgRU9GCisKKyNpZiBXSVRIX1NFTV9TV0lUQ0hfRkFTVCAmJiBkZWZpbmVkIChfX0dOVUNfXykKKyAgeworICAgIGlmICghIENQVV9JREVTQ19TRU1fSU5JVF9QIChjdXJyZW50X2NwdSkpCisgICAgICB7CisvKiA/Pz8gTGF0ZXIgbWF5YmUgcGFzdGUgc2VtLXN3aXRjaC5jIGluIHdoZW4gYnVpbGRpbmcgbWFpbmxvb3AuYy4gICovCisjZGVmaW5lIERFRklORV9MQUJFTFMKKyNpbmNsdWRlICIkc3dpdGNoIgorCUNQVV9JREVTQ19TRU1fSU5JVF9QIChjdXJyZW50X2NwdSkgPSAxOworICAgICAgfQorICB9CisjZW5kaWYKKworICB2cGMgPSBHRVRfSF9QQyAoKTsKKworICBkbworICAgIHsKKyAgICAgIFNDQUNIRSAqc2M7CisKKyAgICAgIHNjID0gQGNwdUBfc2NhY2hlX2xvb2t1cCAoY3VycmVudF9jcHUsIHZwYywgc2NhY2hlLCBoYXNoX21hc2ssIEZBU1RfUCk7CisKKy8qIGJlZ2luIGZhc3QtZXhlYy1zY2FjaGUgKi8KK0VPRgorCiske1NIRUxMfSAkaW5maWxlIGZhc3QtZXhlYy1zY2FjaGUKKworY2F0IDw8IEVPRgorLyogZW5kIGZhc3QtZXhlYy1zY2FjaGUgKi8KKworICAgICAgU0VUX0hfUEMgKHZwYyk7CisKKyAgICAgICsrIENQVV9JTlNOX0NPVU5UIChjdXJyZW50X2NwdSk7CisgICAgfQorICB3aGlsZSAoMCAvKkNQVV9SVU5OSU5HX1AgKGN1cnJlbnRfY3B1KSovKTsKK30KKworI3VuZGVmIEZBU1RfUAorCitFT0YKKworZmkgIyAtZmFzdAorCitmaSAjIC1zY2FjaGUKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBDb21waWxhdGlvbiBlbmdpbmU6IGxvb2t1cCBpbnNuIGluIHNjYWNoZSwgZXh0cmFjdCBhIHBiYgorIyAocHNldWRvLWJhc2ljLWJsb2NrKSBpZiBtaXNzaW5nLCB0aGVuIGV4ZWN1dGUgdGhlIHBiYi4KKyMgQSAicGJiIiBpcyBhIHNlcXVlbmNlIG9mIGluc25zIHVwIHRvIHRoZSBuZXh0IGN0aSBpbnNuIG9yIHVudGlsCisjIHNvbWUgcHJlc3BlY2lmaWVkIG1heGltdW0uCisjIENUSTogY29udHJvbCB0cmFuc2ZlciBpbnN0cnVjdGlvbi4KKworaWYgWyB4JHBiYiA9IHh5ZXMgXSA7IHRoZW4KKworICAgIGNhdCA8PCBFT0YKKworLyogUmVjb3JkIGFkZHJlc3Mgb2YgY3RpIHRlcm1pbmF0aW5nIGEgcGJiLiAgKi8KKyNkZWZpbmUgU0VUX0NUSV9WUEMoc2MpIGRvIHsgX2N0aV9zYyA9IChzYyk7IH0gd2hpbGUgKDApCisvKiBSZWNvcmQgbnVtYmVyIG9mIFtyZWFsXSBpbnNucyBpbiBwYmIuICAqLworI2RlZmluZSBTRVRfSU5TTl9DT1VOVChuKSBkbyB7IF9pbnNuX2NvdW50ID0gKG4pOyB9IHdoaWxlICgwKQorCisvKiBGZXRjaCBhbmQgZXh0cmFjdCBhIHBzZXVkby1iYXNpYy1ibG9jay4KKyAgIEZBU1RfUCBpcyBub24temVybyBpZiBubyB0cmFjaW5nL3Byb2ZpbGluZy9ldGMuIGlzIHdhbnRlZC4gICovCisKK0lOTElORSBTRU1fUEMKK0BjcHVAX3BiYl9iZWdpbiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIGludCBGQVNUX1ApCit7CisgIFNFTV9QQyBuZXdfdnBjOworICBQQ0FERFIgcGM7CisgIFNDQUNIRSAqc2M7CisgIGludCBtYXhfaW5zbnMgPSBDUFVfU0NBQ0hFX01BWF9DSEFJTl9MRU5HVEggKGN1cnJlbnRfY3B1KTsKKworICBwYyA9IEdFVF9IX1BDICgpOworCisgIG5ld192cGMgPSBzY2FjaGVfbG9va3VwX29yX2FsbG9jIChjdXJyZW50X2NwdSwgcGMsIG1heF9pbnNucywgJnNjKTsKKyAgaWYgKCEgbmV3X3ZwYykKKyAgICB7CisgICAgICAvKiBMZWFkaW5nICdfJyB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBtYWlubG9vcC5pbi4gICovCisgICAgICBpbnQgX2luc25fY291bnQgPSAwOworICAgICAgU0NBQ0hFICpvcmlnX3NjID0gc2M7CisgICAgICBTQ0FDSEUgKl9jdGlfc2MgPSBOVUxMOworICAgICAgaW50IHNsaWNlX2luc25zID0gQ1BVX01BWF9TTElDRV9JTlNOUyAoY3VycmVudF9jcHUpOworCisgICAgICAvKiBGaXJzdCBmaWd1cmUgb3V0IGhvdyBtYW55IGluc3RydWN0aW9ucyB0byBjb21waWxlLgorCSBNQVhfSU5TTlMgaXMgdGhlIHNpemUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIsIHdoaWNoIGluY2x1ZGVzIHNwYWNlCisJIGZvciBiZWZvcmUvYWZ0ZXIgaGFuZGxlcnMgaWYgdGhleSdyZSBiZWluZyB1c2VkLgorCSBTTElDRV9JTlNOUyBpcyB0aGUgbWF4aW51bSBudW1iZXIgb2YgcmVhbCBpbnNucyB0aGF0IGNhbiBiZQorCSBleGVjdXRlZC4gIFplcm8gbWVhbnMgImFzIG1hbnkgYXMgd2Ugd2FudCIuICAqLworICAgICAgLyogPz8/IG1heF9pbnNucyBpcyBzZXJ2aW5nIHR3byBpbmNvbXBhdGlibGUgcm9sZXMuCisJIDEpIE51bWJlciBvZiBzbG90cyBhdmFpbGFibGUgaW4gc2NhY2hlIGJ1ZmZlci4KKwkgMikgTnVtYmVyIG9mIHJlYWwgaW5zbnMgdG8gZXhlY3V0ZS4KKwkgVGhleSdyZSBpbmNvbXBhdGlibGUgYmVjYXVzZSB0aGVyZSBhcmUgdmlydHVhbCBpbnNucyBlbWl0dGVkIHRvbworCSAoY2hhaW4sY3RpLWNoYWluLGJlZm9yZSxhZnRlciBoYW5kbGVycykuICAqLworCisgICAgICBpZiAoc2xpY2VfaW5zbnMgPT0gMSkKKwl7CisJICAvKiBObyBuZWVkIHRvIHdvcnJ5IGFib3V0IGV4dHJhIHNsb3RzIHJlcXVpcmVkIGZvciB2aXJ0dWFsIGluc25zCisJICAgICBhbmQgcGFyYWxsZWwgZXhlYyBzdXBwb3J0IGJlY2F1c2UgTUFYX0NIQUlOX0xFTkdUSCBpcworCSAgICAgZ3VhcmFudGVlZCB0byBiZSBiaWcgZW5vdWdoIHRvIGV4ZWN1dGUgYXQgbGVhc3QgMSBpbnNuISAgKi8KKwkgIG1heF9pbnNucyA9IDE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIEFsbG93IGVub3VnaCBzbG9wIHNvIHRoYXQgd2hpbGUgY29tcGlsaW5nIGluc25zLCBpZiBtYXhfaW5zbnMgPiAwCisJICAgICB0aGVuIHRoZXJlJ3MgZ3VhcmFudGVlZCB0byBiZSBlbm91Z2ggc3BhY2UgdG8gZW1pdCBvbmUgcmVhbCBpbnNuLgorCSAgICAgTUFYX0NIQUlOX0xFTkdUSCBpcyB0eXBpY2FsbHkgbXVjaCBsb25nZXIgdGhhbgorCSAgICAgdGhlIG5vcm1hbCBudW1iZXIgb2YgaW5zbnMgYmV0d2VlbiBjdGkncyBhbnl3YXkuICAqLworCSAgbWF4X2luc25zIC09ICgxIC8qIG9uZSBmb3IgdGhlIHRyYWlsaW5nIGNoYWluIGluc24gKi8KKwkJCSsgKEZBU1RfUAorCQkJICAgPyAwCisJCQkgICA6ICgxICsgTUFYX1BBUkFMTEVMX0lOU05TKSAvKiBiZWZvcmUrYWZ0ZXIgKi8pCisJCQkrIChNQVhfUEFSQUxMRUxfSU5TTlMgPiAxCisJCQkgICA/IChNQVhfUEFSQUxMRUxfSU5TTlMgKiAyKQorCQkJICAgOiAwKSk7CisKKwkgIC8qIEFjY291bnQgZm9yIGJlZm9yZS9hZnRlciBoYW5kbGVycy4gICovCisJICBpZiAoISBGQVNUX1ApCisJICAgIHNsaWNlX2luc25zICo9IDM7CisKKwkgIGlmIChzbGljZV9pbnNucyA+IDAKKwkgICAgICAmJiBzbGljZV9pbnNucyA8IG1heF9pbnNucykKKwkgICAgbWF4X2luc25zID0gc2xpY2VfaW5zbnM7CisJfQorCisgICAgICBuZXdfdnBjID0gc2M7CisKKyAgICAgIC8qIFNDLFBDIG11c3QgYmUgdXBkYXRlZCB0byBwb2ludCBwYXNzZWQgdGhlIGxhc3QgZW50cnkgdXNlZC4KKwkgU0VUX0NUSV9WUEMgbXVzdCBiZSBjYWxsZWQgaWYgcGJiIGlzIHRlcm1pbmF0ZWQgYnkgYSBjdGkuCisJIFNFVF9JTlNOX0NPVU5UIG11c3QgYmUgY2FsbGVkIHRvIHJlY29yZCBudW1iZXIgb2YgcmVhbCBpbnNucyBpbgorCSBwYmIgW2NvdWxkIGJlIGNvbXB1dGVkIGJ5IHVzIG9mIGNvdXJzZSwgZXh0cmEgY3B1IGJ1dCBwZXJoYXBzCisJIG5lZ2xpZ2libGUgZW5vdWdoXS4gICovCisKKy8qIGJlZ2luIGV4dHJhY3QtcGJiICovCitFT0YKKworJHtTSEVMTH0gJGluZmlsZSBleHRyYWN0LXBiYgorCitjYXQgPDwgRU9GCisvKiBlbmQgZXh0cmFjdC1wYmIgKi8KKworICAgICAgLyogVGhlIGxhc3Qgb25lIGlzIGEgcHNldWRvLWluc24gdG8gbGluayB0byB0aGUgbmV4dCBjaGFpbi4KKwkgSXQgaXMgYWxzbyB1c2VkIHRvIHJlY29yZCB0aGUgaW5zbiBjb3VudCBmb3IgdGhpcyBjaGFpbi4gICovCisgICAgICB7CisJY29uc3QgSURFU0MgKmlkOworCisJLyogV2FzIHBiYiB0ZXJtaW5hdGVkIGJ5IGEgY3RpPyAgKi8KKwlpZiAoX2N0aV9zYykKKwkgIHsKKwkgICAgaWQgPSAmIENQVV9JREVTQyAoY3VycmVudF9jcHUpIFtAQ1BVQF9JTlNOX1hfQ1RJX0NIQUlOXTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGlkID0gJiBDUFVfSURFU0MgKGN1cnJlbnRfY3B1KSBbQENQVUBfSU5TTl9YX0NIQUlOXTsKKwkgIH0KKwlTRU1fU0VUX0NPREUgKCZzYy0+YXJnYnVmLCBpZCwgRkFTVF9QKTsKKwlzYy0+YXJnYnVmLmlkZXNjID0gaWQ7CisJc2MtPmFyZ2J1Zi5hZGRyID0gcGM7CisJc2MtPmFyZ2J1Zi5maWVsZHMuY2hhaW4uaW5zbl9jb3VudCA9IF9pbnNuX2NvdW50OworCXNjLT5hcmdidWYuZmllbGRzLmNoYWluLm5leHQgPSAwOworCSsrc2M7CisgICAgICB9CisKKyAgICAgIC8qIFVwZGF0ZSB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBmcmVlIGVudHJ5LiAgKi8KKyAgICAgIENQVV9TQ0FDSEVfTkVYVF9GUkVFIChjdXJyZW50X2NwdSkgPSBzYzsKKyAgICAgIC8qIFJlY29yZCBsZW5ndGggb2YgY2hhaW4gaWYgcHJvZmlsaW5nLgorCSBUaGlzIGluY2x1ZGVzIHZpcnR1YWwgaW5zbnMgc2luY2UgdGhleSBjb3VudCBhZ2FpbnN0CisJIG1heF9pbnNucyB0b28uICAqLworICAgICAgaWYgKCEgRkFTVF9QKQorCVBST0ZJTEVfQ09VTlRfU0NBQ0hFX0NIQUlOX0xFTkdUSCAoY3VycmVudF9jcHUsIHNjIC0gb3JpZ19zYyk7CisgICAgfQorCisgIHJldHVybiBuZXdfdnBjOworfQorCisvKiBDaGFpbiB0byB0aGUgbmV4dCBibG9jayBmcm9tIGEgbm9uLWN0aSB0ZXJtaW5hdGVkIHByZXZpb3VzIGJsb2NrLiAgKi8KKworSU5MSU5FIFNFTV9QQworQGNwdUBfcGJiX2NoYWluIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKworICBQQkJfVVBEQVRFX0lOU05fQ09VTlQgKGN1cnJlbnRfY3B1LCBzZW1fYXJnKTsKKworICBTRVRfSF9QQyAoYWJ1Zi0+YWRkcik7CisKKyAgLyogSWYgbm90IHJ1bm5pbmcgZm9yZXZlciwgZXhpdCBiYWNrIHRvIG1haW4gbG9vcC4gICovCisgIGlmIChDUFVfTUFYX1NMSUNFX0lOU05TIChjdXJyZW50X2NwdSkgIT0gMAorICAgICAgLyogQWxzbyBleGl0IGJhY2sgdG8gbWFpbiBsb29wIGlmIHRoZXJlJ3MgYW4gZXZlbnQuCisgICAgICAgICBOb3RlIHRoYXQgaWYgQ1BVX01BWF9TTElDRV9JTlNOUyAhPSAxLCBldmVudHMgd29uJ3QgZ2V0IHByb2Nlc3NlZAorCSBhdCB0aGUgInJpZ2h0IiB0aW1lLCBidXQgdGhlbiB0aGF0IHdhcyB3aGF0IHdhcyBhc2tlZCBmb3IuCisJIFRoZXJlIGlzIG5vIHNpbHZlciBidWxsZXQgZm9yIHNpbXVsYXRvciBlbmdpbmVzLgorICAgICAgICAgPz8/IENsZWFybHkgdGhpcyBuZWVkcyBhIGNsZWFuZXIgaW50ZXJmYWNlLgorCSBBdCBwcmVzZW50IGl0J3MganVzdCBzbyBDdHJsLUMgd29ya3MuICAqLworICAgICAgfHwgU1RBVEVfRVZFTlRTIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPndvcmtfcGVuZGluZykKKyAgICBDUFVfUlVOTklOR19QIChjdXJyZW50X2NwdSkgPSAwOworCisgIC8qIElmIGNoYWluZWQgdG8gbmV4dCBibG9jaywgZ28gc3RyYWlnaHQgdG8gaXQuICAqLworICBpZiAoYWJ1Zi0+ZmllbGRzLmNoYWluLm5leHQpCisgICAgcmV0dXJuIGFidWYtPmZpZWxkcy5jaGFpbi5uZXh0OworICAvKiBTZWUgaWYgbmV4dCBibG9jayBoYXMgYWxyZWFkeSBiZWVuIGNvbXBpbGVkLiAgKi8KKyAgYWJ1Zi0+ZmllbGRzLmNoYWluLm5leHQgPSBzY2FjaGVfbG9va3VwIChjdXJyZW50X2NwdSwgYWJ1Zi0+YWRkcik7CisgIGlmIChhYnVmLT5maWVsZHMuY2hhaW4ubmV4dCkKKyAgICByZXR1cm4gYWJ1Zi0+ZmllbGRzLmNoYWluLm5leHQ7CisgIC8qIE5vcGUsIHNvIG5leHQgaW5zbiBpcyBhIHZpcnR1YWwgaW5zbiB0byBpbnZva2UgdGhlIGNvbXBpbGVyCisgICAgIChiZWdpbiBhIHBiYikuICAqLworICByZXR1cm4gQ1BVX1NDQUNIRV9QQkJfQkVHSU4gKGN1cnJlbnRfY3B1KTsKK30KKworLyogQ2hhaW4gdG8gdGhlIG5leHQgYmxvY2sgZnJvbSBhIGN0aSB0ZXJtaW5hdGVkIHByZXZpb3VzIGJsb2NrLgorICAgTkVXX1ZQQ19QVFIgaXMgb25lIG9mIFNFTV9CUkFOQ0hfVU5UQUtFTiwgU0VNX0JSQU5DSF9VTkNBQ0hFQUJMRSwgb3IKKyAgIGEgcG9pbnRlciB0byBhIGxvY2F0aW9uIGNvbnRhaW5pbmcgdGhlIFNFTV9QQyBvZiB0aGUgYnJhbmNoJ3MgYWRkcmVzcy4KKyAgIE5FV19QQyBpcyB0aGUgdGFyZ2V0J3MgYnJhbmNoIGFkZHJlc3MsIGFuZCBpcyBvbmx5IHZhbGlkIGlmCisgICBORVdfVlBDX1BUUiAhPSBTRU1fQlJBTkNIX1VOVEFLRU4uICAqLworCitJTkxJTkUgU0VNX1BDCitAY3B1QF9wYmJfY3RpX2NoYWluIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnLAorCQkgICAgIFNFTV9QQyAqbmV3X3ZwY19wdHIsIFBDQUREUiBuZXdfcGMpCit7CisgIEFSR0JVRiAqYWJ1ZjsKKworICBQQkJfVVBEQVRFX0lOU05fQ09VTlQgKGN1cnJlbnRfY3B1LCBzZW1fYXJnKTsKKworICAvKiBJZiBub3QgcnVubmluZyBmb3JldmVyLCBleGl0IGJhY2sgdG8gbWFpbiBsb29wLiAgKi8KKyAgaWYgKENQVV9NQVhfU0xJQ0VfSU5TTlMgKGN1cnJlbnRfY3B1KSAhPSAwCisgICAgICAvKiBBbHNvIGV4aXQgYmFjayB0byBtYWluIGxvb3AgaWYgdGhlcmUncyBhbiBldmVudC4KKyAgICAgICAgIE5vdGUgdGhhdCBpZiBDUFVfTUFYX1NMSUNFX0lOU05TICE9IDEsIGV2ZW50cyB3b24ndCBnZXQgcHJvY2Vzc2VkCisJIGF0IHRoZSAicmlnaHQiIHRpbWUsIGJ1dCB0aGVuIHRoYXQgd2FzIHdoYXQgd2FzIGFza2VkIGZvci4KKwkgVGhlcmUgaXMgbm8gc2lsdmVyIGJ1bGxldCBmb3Igc2ltdWxhdG9yIGVuZ2luZXMuCisgICAgICAgICA/Pz8gQ2xlYXJseSB0aGlzIG5lZWRzIGEgY2xlYW5lciBpbnRlcmZhY2UuCisJIEF0IHByZXNlbnQgaXQncyBqdXN0IHNvIEN0cmwtQyB3b3Jrcy4gICovCisgICAgICB8fCBTVEFURV9FVkVOVFMgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+d29ya19wZW5kaW5nKQorICAgIENQVV9SVU5OSU5HX1AgKGN1cnJlbnRfY3B1KSA9IDA7CisKKyAgLyogUmVzdGFydCBjb21waWxlciBpZiB3ZSBicmFuY2hlZCB0byBhbiB1bmNhY2hlYWJsZSBhZGRyZXNzCisgICAgIChlLmcuICJqIHJlZyIpLiAgKi8KKyAgaWYgKG5ld192cGNfcHRyID09IFNFTV9CUkFOQ0hfVU5DQUNIRUFCTEUpCisgICAgeworICAgICAgU0VUX0hfUEMgKG5ld19wYyk7CisgICAgICByZXR1cm4gQ1BVX1NDQUNIRV9QQkJfQkVHSU4gKGN1cnJlbnRfY3B1KTsKKyAgICB9CisKKyAgLyogSWYgYnJhbmNoIHdhc24ndCB0YWtlbiwgdXBkYXRlIHRoZSBwYyBhbmQgc2V0IEJSX0FERFJfUFRSIHRvIG91cgorICAgICBuZXh0IGNoYWluIHB0ci4gICovCisgIGlmIChuZXdfdnBjX3B0ciA9PSBTRU1fQlJBTkNIX1VOVEFLRU4pCisgICAgeworICAgICAgYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICAgICAgU0VUX0hfUEMgKGFidWYtPmFkZHIpOworICAgICAgbmV3X3ZwY19wdHIgPSAmYWJ1Zi0+ZmllbGRzLmNoYWluLm5leHQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgU0VUX0hfUEMgKG5ld19wYyk7CisgICAgfQorCisgIC8qIElmIGNoYWluZWQgdG8gbmV4dCBibG9jaywgZ28gc3RyYWlnaHQgdG8gaXQuICAqLworICBpZiAoKm5ld192cGNfcHRyKQorICAgIHJldHVybiAqbmV3X3ZwY19wdHI7CisgIC8qIFNlZSBpZiBuZXh0IGJsb2NrIGhhcyBhbHJlYWR5IGJlZW4gY29tcGlsZWQuICAqLworICAqbmV3X3ZwY19wdHIgPSBzY2FjaGVfbG9va3VwIChjdXJyZW50X2NwdSwgR0VUX0hfUEMgKCkpOworICBpZiAoKm5ld192cGNfcHRyKQorICAgIHJldHVybiAqbmV3X3ZwY19wdHI7CisgIC8qIE5vcGUsIHNvIG5leHQgaW5zbiBpcyBhIHZpcnR1YWwgaW5zbiB0byBpbnZva2UgdGhlIGNvbXBpbGVyCisgICAgIChiZWdpbiBhIHBiYikuICAqLworICByZXR1cm4gQ1BVX1NDQUNIRV9QQkJfQkVHSU4gKGN1cnJlbnRfY3B1KTsKK30KKworLyogeC1iZWZvcmUgaGFuZGxlci4KKyAgIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBlYWNoIGluc24uICAqLworCit2b2lkCitAY3B1QF9wYmJfYmVmb3JlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0NBQ0hFICpzYykKK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gc2M7CisgIGNvbnN0IEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgZmlyc3RfcCA9IGFidWYtPmZpZWxkcy5iZWZvcmUuZmlyc3RfcDsKKyAgY29uc3QgQVJHQlVGICpjdXJfYWJ1ZiA9IFNFTV9BUkdCVUYgKHNjICsgMSk7CisgIGNvbnN0IElERVNDICpjdXJfaWRlc2MgPSBjdXJfYWJ1Zi0+aWRlc2M7CisgIFBDQUREUiBwYyA9IGN1cl9hYnVmLT5hZGRyOworCisgIGlmIChBUkdCVUZfUFJPRklMRV9QIChjdXJfYWJ1ZikpCisgICAgUFJPRklMRV9DT1VOVF9JTlNOIChjdXJyZW50X2NwdSwgcGMsIGN1cl9pZGVzYy0+bnVtKTsKKworICAvKiBJZiB0aGlzIGlzbid0IHRoZSBmaXJzdCBpbnNuLCBmaW5pc2ggdXAgdGhlIHByZXZpb3VzIG9uZS4gICovCisKKyAgaWYgKCEgZmlyc3RfcCkKKyAgICB7CisgICAgICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisJeworCSAgY29uc3QgU0VNX0FSRyBwcmV2X3NlbV9hcmcgPSBzYyAtIDE7CisJICBjb25zdCBBUkdCVUYgKnByZXZfYWJ1ZiA9IFNFTV9BUkdCVUYgKHByZXZfc2VtX2FyZyk7CisJICBjb25zdCBJREVTQyAqcHJldl9pZGVzYyA9IHByZXZfYWJ1Zi0+aWRlc2M7CisJICBpbnQgY3ljbGVzOworCisJICAvKiA/Pz8gTWF5IHdhbnQgdG8gbWVhc3VyZSBhbGwgaW5zbnMgaWYgZG9pbmcgaW5zbiB0cmFjaW5nLiAgKi8KKwkgIGlmIChBUkdCVUZfUFJPRklMRV9QIChwcmV2X2FidWYpKQorCSAgICB7CisJICAgICAgY3ljbGVzID0gKCpwcmV2X2lkZXNjLT50aW1pbmctPm1vZGVsX2ZuKSAoY3VycmVudF9jcHUsIHByZXZfc2VtX2FyZyk7CisJICAgICAgQGNwdUBfbW9kZWxfaW5zbl9hZnRlciAoY3VycmVudF9jcHUsIDAgLypsYXN0X3AqLywgY3ljbGVzKTsKKwkgICAgfQorCX0KKworICAgICAgVFJBQ0VfSU5TTl9GSU5JIChjdXJyZW50X2NwdSwgY3VyX2FidWYsIDAgLypsYXN0X3AqLyk7CisgICAgfQorCisgIC8qIEZJWE1FOiBMYXRlciBtYWtlIGNvdmVyIG1hY3JvczogUFJPRklMRV9JTlNOX3tJTklULEZJTkl9LiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpCisgICAgICAmJiBBUkdCVUZfUFJPRklMRV9QIChjdXJfYWJ1ZikpCisgICAgQGNwdUBfbW9kZWxfaW5zbl9iZWZvcmUgKGN1cnJlbnRfY3B1LCBmaXJzdF9wKTsKKworICBUUkFDRV9JTlNOX0lOSVQgKGN1cnJlbnRfY3B1LCBjdXJfYWJ1ZiwgZmlyc3RfcCk7CisgIFRSQUNFX0lOU04gKGN1cnJlbnRfY3B1LCBjdXJfaWRlc2MtPmlkYXRhLCBjdXJfYWJ1ZiwgcGMpOworfQorCisvKiB4LWFmdGVyIGhhbmRsZXIuCisgICBUaGlzIGlzIGNhbGxlZCBhZnRlciBhIHNlcmlhbCBpbnNuIG9yIGF0IHRoZSBlbmQgb2YgYSBncm91cCBvZiBwYXJhbGxlbAorICAgaW5zbnMuICAqLworCit2b2lkCitAY3B1QF9wYmJfYWZ0ZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTQ0FDSEUgKnNjKQoreworICBTRU1fQVJHIHNlbV9hcmcgPSBzYzsKKyAgY29uc3QgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGNvbnN0IFNFTV9BUkcgcHJldl9zZW1fYXJnID0gc2MgLSAxOworICBjb25zdCBBUkdCVUYgKnByZXZfYWJ1ZiA9IFNFTV9BUkdCVUYgKHByZXZfc2VtX2FyZyk7CisKKyAgLyogPz8/IE1heSB3YW50IHRvIG1lYXN1cmUgYWxsIGluc25zIGlmIGRvaW5nIGluc24gdHJhY2luZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KQorICAgICAgJiYgQVJHQlVGX1BST0ZJTEVfUCAocHJldl9hYnVmKSkKKyAgICB7CisgICAgICBjb25zdCBJREVTQyAqcHJldl9pZGVzYyA9IHByZXZfYWJ1Zi0+aWRlc2M7CisgICAgICBpbnQgY3ljbGVzOworCisgICAgICBjeWNsZXMgPSAoKnByZXZfaWRlc2MtPnRpbWluZy0+bW9kZWxfZm4pIChjdXJyZW50X2NwdSwgcHJldl9zZW1fYXJnKTsKKyAgICAgIEBjcHVAX21vZGVsX2luc25fYWZ0ZXIgKGN1cnJlbnRfY3B1LCAxIC8qbGFzdF9wKi8sIGN5Y2xlcyk7CisgICAgfQorICBUUkFDRV9JTlNOX0ZJTkkgKGN1cnJlbnRfY3B1LCBwcmV2X2FidWYsIDEgLypsYXN0X3AqLyk7Cit9CisKKyNkZWZpbmUgRkFTVF9QIDAKKwordm9pZAorQGNwdUBfZW5naW5lX3J1bl9mdWxsIChTSU1fQ1BVICpjdXJyZW50X2NwdSkKK3sKKyAgU0lNX0RFU0MgY3VycmVudF9zdGF0ZSA9IENQVV9TVEFURSAoY3VycmVudF9jcHUpOworICBTQ0FDSEUgKnNjYWNoZSA9IENQVV9TQ0FDSEVfQ0FDSEUgKGN1cnJlbnRfY3B1KTsKKyAgLyogdmlydHVhbCBwcm9ncmFtIGNvdW50ZXIgKi8KKyAgU0VNX1BDIHZwYzsKKyNpZiBXSVRIX1NFTV9TV0lUQ0hfRlVMTAorICAvKiBGb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGN0aSdzIGFuZCBjdGktY2hhaW4uICAqLworICBQQ0FERFIgcGJiX2JyX25wYzsKKyAgU0VNX1BDICpwYmJfYnJfbnBjX3B0cjsKKyNlbmRpZgorCitFT0YKKworaWYgWyB4JHBhcmFsbGVsICE9IHhubyBdIDsgdGhlbgorICBjYXQgPDwgRU9GCisgIFBBUkVYRUMgcGJ1ZnNbTUFYX1BBUkFMTEVMX0lOU05TXTsKKyAgUEFSRVhFQyAqcGFyX2V4ZWMgPSAmcGJ1ZnNbMF07CisKK0VPRgorZmkKKworIyBBbnkgaW5pdGlhbGl6YXRpb24gY29kZSBiZWZvcmUgbG9vcGluZyBzdGFydHMuCisjIE5vdGUgdGhhdCB0aGlzIGNvZGUgbWF5IGRlY2xhcmUgc29tZSBsb2NhbHMuCiske1NIRUxMfSAkaW5maWxlIGluaXQKKworY2F0IDw8IEVPRgorCisgIGlmICghIENQVV9JREVTQ19TRU1fSU5JVF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgLyogPz8/ICd0d291bGQgYmUgbmljZSB0byBtb3ZlIHRoaXMgdXAgYSBsZXZlbCBhbmQgb25seSBjYWxsIGl0IG9uY2UuCisJIE9uIHRoZSBvdGhlciBoYW5kLCBpbiB0aGUgImxldCdzIGdvIGZhc3QiIGNhc2UgdGhlIHRlc3QgaXMgb25seSBkb25lCisJIG9uY2UgcGVyIHBiYiAoc2luY2Ugd2Ugb25seSByZXR1cm4gdG8gdGhlIG1haW4gbG9vcCBhdCB0aGUgZW5kIG9mCisJIGEgcGJiKS4gIEFuZCBpbiB0aGUgImxldCdzIHJ1biB1bnRpbCB3ZSdyZSBkb25lIiBjYXNlIHdlIGRvbid0IHJldHVybgorCSB1bnRpbCB0aGUgcHJvZ3JhbSBleGl0cy4gICovCisKKyNpZiBXSVRIX1NFTV9TV0lUQ0hfRlVMTCAmJiBkZWZpbmVkIChfX0dOVUNfXykKKy8qID8/PyBMYXRlciBtYXliZSBwYXN0ZSBzZW0tc3dpdGNoLmMgaW4gd2hlbiBidWlsZGluZyBtYWlubG9vcC5jLiAgKi8KKyNkZWZpbmUgREVGSU5FX0xBQkVMUworI2luY2x1ZGUgIiRzd2l0Y2giCisjZW5kaWYKKworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgImJlZ2luIChjb21waWxlKSBhIHBiYiIgdmlydHVhbCBpbnNuLiAgKi8KKyAgICAgIHZwYyA9IENQVV9TQ0FDSEVfUEJCX0JFR0lOIChjdXJyZW50X2NwdSk7CisgICAgICBTRU1fU0VUX0ZVTExfQ09ERSAoU0VNX0FSR0JVRiAodnBjKSwKKwkJCSAmIENQVV9JREVTQyAoY3VycmVudF9jcHUpIFtAQ1BVQF9JTlNOX1hfQkVHSU5dKTsKKyAgICAgIHZwYy0+YXJnYnVmLmlkZXNjID0gJiBDUFVfSURFU0MgKGN1cnJlbnRfY3B1KSBbQENQVUBfSU5TTl9YX0JFR0lOXTsKKworICAgICAgQ1BVX0lERVNDX1NFTV9JTklUX1AgKGN1cnJlbnRfY3B1KSA9IDE7CisgICAgfQorCisgIENQVV9SVU5OSU5HX1AgKGN1cnJlbnRfY3B1KSA9IDE7CisgIC8qID8/PyBJbiB0aGUgY2FzZSB3aGVyZSB3ZSdyZSByZXR1cm5pbmcgdG8gdGhlIG1haW4gbG9vcCBhZnRlciBldmVyeQorICAgICBwYmIgd2UgZG9uJ3Qgd2FudCB0byBjYWxsIHBiYl9iZWdpbiBlYWNoIHRpbWUgKHdoaWNoIGhhc2hlcyBvbiB0aGUgcGMKKyAgICAgYW5kIGRvZXMgYSB0YWJsZSBsb29rdXApLiAgQSB3YXkgdG8gc3BlZWQgdGhpcyB1cCBpcyB0byBzYXZlIHZwYworICAgICBiZXR3ZWVuIGNhbGxzLiAgKi8KKyAgdnBjID0gQGNwdUBfcGJiX2JlZ2luIChjdXJyZW50X2NwdSwgRkFTVF9QKTsKKworICBkbworICAgIHsKKy8qIGJlZ2luIGZ1bGwtZXhlYy1wYmIgKi8KK0VPRgorCiske1NIRUxMfSAkaW5maWxlIGZ1bGwtZXhlYy1wYmIKKworY2F0IDw8IEVPRgorLyogZW5kIGZ1bGwtZXhlYy1wYmIgKi8KKyAgICB9CisgIHdoaWxlIChDUFVfUlVOTklOR19QIChjdXJyZW50X2NwdSkpOworfQorCisjdW5kZWYgRkFTVF9QCisKK0VPRgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBDb21waWxlIGVuZ2luZTogZmFzdCB2ZXJzaW9uLgorCitpZiBbIHgkZmFzdCA9IHh5ZXMgXSA7IHRoZW4KKworICAgIGNhdCA8PCBFT0YKKworI2RlZmluZSBGQVNUX1AgMQorCit2b2lkCitAY3B1QF9lbmdpbmVfcnVuX2Zhc3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICBTSU1fREVTQyBjdXJyZW50X3N0YXRlID0gQ1BVX1NUQVRFIChjdXJyZW50X2NwdSk7CisgIFNDQUNIRSAqc2NhY2hlID0gQ1BVX1NDQUNIRV9DQUNIRSAoY3VycmVudF9jcHUpOworICAvKiB2aXJ0dWFsIHByb2dyYW0gY291bnRlciAqLworICBTRU1fUEMgdnBjOworI2lmIFdJVEhfU0VNX1NXSVRDSF9GQVNUCisgIC8qIEZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gY3RpJ3MgYW5kIGN0aS1jaGFpbi4gICovCisgIFBDQUREUiBwYmJfYnJfbnBjOworICBTRU1fUEMgKnBiYl9icl9ucGNfcHRyOworI2VuZGlmCisKK0VPRgorCitpZiBbIHgkcGFyYWxsZWwgIT0geG5vIF0gOyB0aGVuCisgIGNhdCA8PCBFT0YKKyAgUEFSRVhFQyBwYnVmc1tNQVhfUEFSQUxMRUxfSU5TTlNdOworICBQQVJFWEVDICpwYXJfZXhlYyA9ICZwYnVmc1swXTsKKworRU9GCitmaQorCisjIEFueSBpbml0aWFsaXphdGlvbiBjb2RlIGJlZm9yZSBsb29waW5nIHN0YXJ0cy4KKyMgTm90ZSB0aGF0IHRoaXMgY29kZSBtYXkgZGVjbGFyZSBzb21lIGxvY2Fscy4KKyR7U0hFTEx9ICRpbmZpbGUgaW5pdAorCitjYXQgPDwgRU9GCisKKyAgaWYgKCEgQ1BVX0lERVNDX1NFTV9JTklUX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICAvKiA/Pz8gJ3R3b3VsZCBiZSBuaWNlIHRvIG1vdmUgdGhpcyB1cCBhIGxldmVsIGFuZCBvbmx5IGNhbGwgaXQgb25jZS4KKwkgT24gdGhlIG90aGVyIGhhbmQsIGluIHRoZSAibGV0J3MgZ28gZmFzdCIgY2FzZSB0aGUgdGVzdCBpcyBvbmx5IGRvbmUKKwkgb25jZSBwZXIgcGJiIChzaW5jZSB3ZSBvbmx5IHJldHVybiB0byB0aGUgbWFpbiBsb29wIGF0IHRoZSBlbmQgb2YKKwkgYSBwYmIpLiAgQW5kIGluIHRoZSAibGV0J3MgcnVuIHVudGlsIHdlJ3JlIGRvbmUiIGNhc2Ugd2UgZG9uJ3QgcmV0dXJuCisJIHVudGlsIHRoZSBwcm9ncmFtIGV4aXRzLiAgKi8KKworI2lmIFdJVEhfU0VNX1NXSVRDSF9GQVNUICYmIGRlZmluZWQgKF9fR05VQ19fKQorLyogPz8/IExhdGVyIG1heWJlIHBhc3RlIHNlbS1zd2l0Y2guYyBpbiB3aGVuIGJ1aWxkaW5nIG1haW5sb29wLmMuICAqLworI2RlZmluZSBERUZJTkVfTEFCRUxTCisjaW5jbHVkZSAiJHN3aXRjaCIKKyNlbmRpZgorCisgICAgICAvKiBJbml0aWFsaXplIHRoZSAiYmVnaW4gKGNvbXBpbGUpIGEgcGJiIiB2aXJ0dWFsIGluc24uICAqLworICAgICAgdnBjID0gQ1BVX1NDQUNIRV9QQkJfQkVHSU4gKGN1cnJlbnRfY3B1KTsKKyAgICAgIFNFTV9TRVRfRkFTVF9DT0RFIChTRU1fQVJHQlVGICh2cGMpLAorCQkJICYgQ1BVX0lERVNDIChjdXJyZW50X2NwdSkgW0BDUFVAX0lOU05fWF9CRUdJTl0pOworICAgICAgdnBjLT5hcmdidWYuaWRlc2MgPSAmIENQVV9JREVTQyAoY3VycmVudF9jcHUpIFtAQ1BVQF9JTlNOX1hfQkVHSU5dOworCisgICAgICBDUFVfSURFU0NfU0VNX0lOSVRfUCAoY3VycmVudF9jcHUpID0gMTsKKyAgICB9CisKKyAgQ1BVX1JVTk5JTkdfUCAoY3VycmVudF9jcHUpID0gMTsKKyAgLyogPz8/IEluIHRoZSBjYXNlIHdoZXJlIHdlJ3JlIHJldHVybmluZyB0byB0aGUgbWFpbiBsb29wIGFmdGVyIGV2ZXJ5CisgICAgIHBiYiB3ZSBkb24ndCB3YW50IHRvIGNhbGwgcGJiX2JlZ2luIGVhY2ggdGltZSAod2hpY2ggaGFzaGVzIG9uIHRoZSBwYworICAgICBhbmQgZG9lcyBhIHRhYmxlIGxvb2t1cCkuICBBIHdheSB0byBzcGVlZCB0aGlzIHVwIGlzIHRvIHNhdmUgdnBjCisgICAgIGJldHdlZW4gY2FsbHMuICAqLworICB2cGMgPSBAY3B1QF9wYmJfYmVnaW4gKGN1cnJlbnRfY3B1LCBGQVNUX1ApOworCisgIGRvCisgICAgeworLyogYmVnaW4gZmFzdC1leGVjLXBiYiAqLworRU9GCisKKyR7U0hFTEx9ICRpbmZpbGUgZmFzdC1leGVjLXBiYgorCitjYXQgPDwgRU9GCisvKiBlbmQgZmFzdC1leGVjLXBiYiAqLworICAgIH0KKyAgd2hpbGUgKENQVV9SVU5OSU5HX1AgKGN1cnJlbnRfY3B1KSk7Cit9CisKKyN1bmRlZiBGQVNUX1AKKworRU9GCitmaSAjIC1mYXN0CisKK2ZpICMgLXBiYgorCisjIFByb2Nlc3MgQGNwdUAsQENQVUAgYXBwZWFyaW5nIGluIG1haW5sb29wLmluLgorc2VkIC1lICJzL0BjcHVALyRjcHUvZyIgLWUgInMvQENQVUAvJENQVS9nIiA8IHRtcC1tbG9vcC5jaW4gPiBtbG9vcC5jaW4KK3JjPSQ/CitybSAtZiB0bXAtbWxvb3AuY2luCisKK2V4aXQgJHJjCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2dlbm5sdHZhbHMuc2ggYi9zaW0vY29tbW9uL2dlbm5sdHZhbHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmZjY2MgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vZ2Vubmx0dmFscy5zaApAQCAtMCwwICsxLDY3IEBACisjISAvYmluL3NoCisjIEdlbmVyYXRlIG5sdHZhbHMuZGVmLCBhIGZpbGUgdGhhdCBkZXNjcmliZXMgdmFyaW91cyBuZXdsaWIvbGliZ2xvc3MKKyMgdGFyZ2V0IHZhbHVlcyB1c2VkIGJ5IHRoZSBob3N0L3RhcmdldCBpbnRlcmZhY2UuCisjCisjIFN5bnRheDogL2Jpbi9zaCBnZW5ubHR2YWxzLnNoIHNoZWxsIHNyY3Jvb3QgY3BwCisKK3NoZWxsPSQxCitzcmNyb290PSQyCitjcHA9JDMKKworc3JjY29tPSRzcmNyb290L3NpbS9jb21tb24KKworZWNobyAnLyogTmV3bGliL2xpYmdsb3NzIG1hY3JvIHZhbHVlcyBuZWVkZWQgYnkgcmVtb3RlIHRhcmdldCBzdXBwb3J0LiAgKi8nCitlY2hvICcvKiBUaGlzIGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQgYnkgZ2Vubmx0dmFscy5zaC4gICovJworCiskc2hlbGwgJHtzcmNjb219L2dlbnR2YWxzLnNoICIiIGVycm5vICR7c3Jjcm9vdH0vbmV3bGliL2xpYmMvaW5jbHVkZSBcCisJImVycm5vLmggc3lzL2Vycm5vLmgiICdFW0EtWjAtOV0qJyAiJHtjcHB9IgorCiskc2hlbGwgJHtzcmNjb219L2dlbnR2YWxzLnNoICIiIHNpZ25hbCAke3NyY3Jvb3R9L25ld2xpYi9saWJjL2luY2x1ZGUgXAorCSJzaWduYWwuaCBzeXMvc2lnbmFsLmgiICdTSUdbQS1aMC05XSonICIke2NwcH0iCisKKyRzaGVsbCAke3NyY2NvbX0vZ2VudHZhbHMuc2ggIiIgb3BlbiAke3NyY3Jvb3R9L25ld2xpYi9saWJjL2luY2x1ZGUgXAorCSJmY250bC5oIHN5cy9mY250bC5oIiAnT19bQS1aMC05XSonICIke2NwcH0iCisKKyMgVW5mb3J0dW5hdGVseSwgZWFjaCBuZXdsaWIvbGliZ2xvc3MgcG9ydCBoYXMgc2VlbiBmaXQgdG8gZGVmaW5lIHRoZWlyIG93bgorIyBzeXNjYWxsLmggZmlsZS4gIFRoaXMgbWVhbnMgdGhhdCBzeXN0ZW0gY2FsbCBudW1iZXJzIGNhbiB2YXJ5IGZvciBlYWNoIHBvcnQuCisjIFN1cHBvcnQgZm9yIGFsbCB0aGlzIGNydWQgaXMga2VwdCBoZXJlLCByYXRoZXIgdGhhbiB0cnlpbmcgdG8gZ2V0IHRvbyBmYW5jeS4KKyMgSWYgeW91IHdhbnQgdG8gdHJ5IHRvIGltcHJvdmUgdGhpcywgcGxlYXNlIGRvLCBidXQgZG9uJ3QgYnJlYWsgYW55dGhpbmcuCisjIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHN0YW5kYXJkIHN5c2NhbGwuaCBmaWxlIChsaWJnbG9zcy9zeXNjYWxsLmgpIG5vdyB3aGljaAorIyBob3BlZnVsbHkgbW9yZSB0YXJnZXRzIGNhbiB1c2UuCisKK2Rpcj1uZXdsaWIvbGliYy9zeXMvZDEwdi9zeXMgdGFyZ2V0PWQxMHYKKyRzaGVsbCAke3NyY2NvbX0vZ2VudHZhbHMuc2ggJHRhcmdldCBzeXMgJHtzcmNyb290fS8kZGlyIFwKKwkic3lzY2FsbC5oIiAnU1lTX1tfQS1aYS16MC05XSonICIke2NwcH0iCisKK2Rpcj1saWJnbG9zcyB0YXJnZXQ9ZDMwdgorJHNoZWxsICR7c3JjY29tfS9nZW50dmFscy5zaCAkdGFyZ2V0IHN5cyAke3NyY3Jvb3R9LyRkaXIgXAorCSJzeXNjYWxsLmgiICdTWVNfW19BLVphLXowLTldKicgIiR7Y3BwfSIKKworZGlyPWxpYmdsb3NzIHRhcmdldD1mcjMwCiskc2hlbGwgJHtzcmNjb219L2dlbnR2YWxzLnNoICR0YXJnZXQgc3lzICR7c3Jjcm9vdH0vJGRpciBcCisJInN5c2NhbGwuaCIgJ1NZU19bX0EtWmEtejAtOV0qJyAiJHtjcHB9IgorCitkaXI9bGliZ2xvc3MvaTk2MCB0YXJnZXQ9aTk2MAorJHNoZWxsICR7c3JjY29tfS9nZW50dmFscy5zaCAkdGFyZ2V0IHN5cyAke3NyY3Jvb3R9LyRkaXIgXAorCSJzeXNjYWxsLmgiICdTWVNfW19BLVphLXowLTldKicgIiR7Y3BwfSIKKworZGlyPWxpYmdsb3NzIHRhcmdldD1tMzJyCiskc2hlbGwgJHtzcmNjb219L2dlbnR2YWxzLnNoICR0YXJnZXQgc3lzICR7c3Jjcm9vdH0vJGRpciBcCisJInN5c2NhbGwuaCIgJ1NZU19bX0EtWmEtejAtOV0qJyAiJHtjcHB9IgorCitkaXI9bGliZ2xvc3MgdGFyZ2V0PW1uMTAyMDAKKyRzaGVsbCAke3NyY2NvbX0vZ2VudHZhbHMuc2ggJHRhcmdldCBzeXMgJHtzcmNyb290fS8kZGlyIFwKKwkic3lzY2FsbC5oIiAnU1lTX1tfQS1aYS16MC05XSonICIke2NwcH0iCisKK2Rpcj1saWJnbG9zcyB0YXJnZXQ9bW4xMDMwMAorJHNoZWxsICR7c3JjY29tfS9nZW50dmFscy5zaCAkdGFyZ2V0IHN5cyAke3NyY3Jvb3R9LyRkaXIgXAorCSJzeXNjYWxsLmgiICdTWVNfW19BLVphLXowLTldKicgIiR7Y3BwfSIKKworZGlyPWxpYmdsb3NzIHRhcmdldD1zcGFyYworJHNoZWxsICR7c3JjY29tfS9nZW50dmFscy5zaCAkdGFyZ2V0IHN5cyAke3NyY3Jvb3R9LyRkaXIgXAorCSJzeXNjYWxsLmgiICdTWVNfW19BLVphLXowLTldKicgIiR7Y3BwfSIKKworZGlyPWxpYmdsb3NzL3Y4NTAvc3lzIHRhcmdldD12ODUwCiskc2hlbGwgJHtzcmNjb219L2dlbnR2YWxzLnNoICR0YXJnZXQgc3lzICR7c3Jjcm9vdH0vJGRpciBcCisJInN5c2NhbGwuaCIgJ1NZU19bX0EtWmEtejAtOV0qJyAiJHtjcHB9IgorCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2dlbnRtYXAuYyBiL3NpbS9jb21tb24vZ2VudG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZjVkMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL2dlbnRtYXAuYwpAQCAtMCwwICsxLDEyNSBAQAorLyogR2VuZXJhdGUgdGFyZy12YWxzLmggYW5kIHRhcmctbWFwLmMuICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RydWN0IHRkZWZzIHsKKyAgY2hhciAqc3ltYm9sOworICBpbnQgdmFsdWU7Cit9OworCitzdGF0aWMgc3RydWN0IHRkZWZzIHN5c190ZGVmc1tdID0geworI2RlZmluZSBzeXNfZGVmcworI2luY2x1ZGUgInRhcmctdmFscy5kZWYiCisjdW5kZWYgc3lzX2RlZnMKKyAgeyAwLCAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdGRlZnMgZXJybm9fdGRlZnNbXSA9ICB7CisjZGVmaW5lIGVycm5vX2RlZnMKKyNpbmNsdWRlICJ0YXJnLXZhbHMuZGVmIgorI3VuZGVmIGVycm5vX2RlZnMKKyAgeyAwLCAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdGRlZnMgb3Blbl90ZGVmc1tdID0geworI2RlZmluZSBvcGVuX2RlZnMKKyNpbmNsdWRlICJ0YXJnLXZhbHMuZGVmIgorI3VuZGVmIG9wZW5fZGVmcworICB7IDAsIDAgfQorfTsKKworc3RhdGljIHZvaWQKK2dlbl90YXJnX3ZhbHNfaCAoKQoreworICBzdHJ1Y3QgdGRlZnMgKnQ7CisKKyAgcHJpbnRmICgiLyogVGFyZ2V0IGhlYWRlciB2YWx1ZXMgbmVlZGVkIGJ5IHRoZSBzaW11bGF0b3IgYW5kIGdkYi4gICovXG4iKTsKKyAgcHJpbnRmICgiLyogVGhpcyBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkIGJ5IGdlbnRtYXAuYy4gICovXG5cbiIpOworCisgIHByaW50ZiAoIiNpZm5kZWYgVEFSR19WQUxTX0hcbiIpOworICBwcmludGYgKCIjZGVmaW5lIFRBUkdfVkFMU19IXG5cbiIpOworCisgIHByaW50ZiAoIi8qIHN5c2NhbGwgdmFsdWVzICovXG4iKTsKKyAgZm9yICh0ID0gJnN5c190ZGVmc1swXTsgdC0+c3ltYm9sOyArK3QpCisgICAgcHJpbnRmICgiI2RlZmluZSBUQVJHRVRfJXMgJWRcbiIsIHQtPnN5bWJvbCwgdC0+dmFsdWUpOworICBwcmludGYgKCJcbiIpOworCisgIHByaW50ZiAoIi8qIGVycm5vIHZhbHVlcyAqL1xuIik7CisgIGZvciAodCA9ICZlcnJub190ZGVmc1swXTsgdC0+c3ltYm9sOyArK3QpCisgICAgcHJpbnRmICgiI2RlZmluZSBUQVJHRVRfJXMgJWRcbiIsIHQtPnN5bWJvbCwgdC0+dmFsdWUpOworICBwcmludGYgKCJcbiIpOworCisgIHByaW50ZiAoIi8qIG9wZW4gZmxhZyB2YWx1ZXMgKi9cbiIpOworICBmb3IgKHQgPSAmb3Blbl90ZGVmc1swXTsgdC0+c3ltYm9sOyArK3QpCisgICAgcHJpbnRmICgiI2RlZmluZSBUQVJHRVRfJXMgMHgleFxuIiwgdC0+c3ltYm9sLCB0LT52YWx1ZSk7CisgIHByaW50ZiAoIlxuIik7CisKKyAgcHJpbnRmICgiI2VuZGlmIC8qIFRBUkdfVkFMU19IICovXG4iKTsKK30KKworc3RhdGljIHZvaWQKK2dlbl90YXJnX21hcF9jICgpCit7CisgIHN0cnVjdCB0ZGVmcyAqdDsKKworICBwcmludGYgKCIvKiBUYXJnZXQgdmFsdWUgbWFwcGluZyB1dGlsaXRpZXMgbmVlZGVkIGJ5IHRoZSBzaW11bGF0b3IgYW5kIGdkYi4gICovXG4iKTsKKyAgcHJpbnRmICgiLyogVGhpcyBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkIGJ5IGdlbnRtYXAuYy4gICovXG5cbiIpOworCisgIHByaW50ZiAoIiNpbmNsdWRlIDxlcnJuby5oPlxuIik7CisgIHByaW50ZiAoIiNpbmNsdWRlIDxmY250bC5oPlxuIik7CisgIHByaW50ZiAoIiNpbmNsdWRlIFwiYW5zaWRlY2wuaFwiXG4iKTsKKyAgcHJpbnRmICgiI2luY2x1ZGUgXCJjYWxsYmFjay5oXCJcbiIpOworICBwcmludGYgKCIjaW5jbHVkZSBcInRhcmctdmFscy5oXCJcbiIpOworICBwcmludGYgKCJcbiIpOworCisgIHByaW50ZiAoIi8qIHN5c2NhbGwgbWFwcGluZyB0YWJsZSAqL1xuIik7CisgIHByaW50ZiAoIkNCX1RBUkdFVF9ERUZTX01BUCBjYl9pbml0X3N5c2NhbGxfbWFwW10gPSB7XG4iKTsKKyAgZm9yICh0ID0gJnN5c190ZGVmc1swXTsgdC0+c3ltYm9sOyArK3QpCisgICAgeworICAgICAgcHJpbnRmICgiI2lmZGVmIENCXyVzXG4iLCB0LT5zeW1ib2wpOworICAgICAgcHJpbnRmICgiICB7IENCXyVzLCBUQVJHRVRfJXMgfSxcbiIsIHQtPnN5bWJvbCwgdC0+c3ltYm9sKTsKKyAgICAgIHByaW50ZiAoIiNlbmRpZlxuIik7CisgICAgfQorICBwcmludGYgKCIgIHsgLTEsIC0xIH1cbiIpOworICBwcmludGYgKCJ9O1xuXG4iKTsKKworICBwcmludGYgKCIvKiBlcnJubyBtYXBwaW5nIHRhYmxlICovXG4iKTsKKyAgcHJpbnRmICgiQ0JfVEFSR0VUX0RFRlNfTUFQIGNiX2luaXRfZXJybm9fbWFwW10gPSB7XG4iKTsKKyAgZm9yICh0ID0gJmVycm5vX3RkZWZzWzBdOyB0LT5zeW1ib2w7ICsrdCkKKyAgICB7CisgICAgICBwcmludGYgKCIjaWZkZWYgJXNcbiIsIHQtPnN5bWJvbCk7CisgICAgICBwcmludGYgKCIgIHsgJXMsIFRBUkdFVF8lcyB9LFxuIiwgdC0+c3ltYm9sLCB0LT5zeW1ib2wpOworICAgICAgcHJpbnRmICgiI2VuZGlmXG4iKTsKKyAgICB9CisgIHByaW50ZiAoIiAgeyAwLCAwIH1cbiIpOworICBwcmludGYgKCJ9O1xuXG4iKTsKKworICBwcmludGYgKCIvKiBvcGVuIGZsYWdzIG1hcHBpbmcgdGFibGUgKi9cbiIpOworICBwcmludGYgKCJDQl9UQVJHRVRfREVGU19NQVAgY2JfaW5pdF9vcGVuX21hcFtdID0ge1xuIik7CisgIGZvciAodCA9ICZvcGVuX3RkZWZzWzBdOyB0LT5zeW1ib2w7ICsrdCkKKyAgICB7CisgICAgICBwcmludGYgKCIjaWZkZWYgJXNcbiIsIHQtPnN5bWJvbCk7CisgICAgICBwcmludGYgKCIgIHsgJXMsIFRBUkdFVF8lcyB9LFxuIiwgdC0+c3ltYm9sLCB0LT5zeW1ib2wpOworICAgICAgcHJpbnRmICgiI2VuZGlmXG4iKTsKKyAgICB9CisgIHByaW50ZiAoIiAgeyAtMSwgLTEgfVxuIik7CisgIHByaW50ZiAoIn07XG5cbiIpOworfQorCitpbnQKK21haW4gKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICphcmd2W107Cit7CisgIGlmIChhcmdjICE9IDIpCisgICAgYWJvcnQgKCk7CisKKyAgaWYgKHN0cmNtcCAoYXJndlsxXSwgIi1oIikgPT0gMCkKKyAgICBnZW5fdGFyZ192YWxzX2ggKCk7CisgIGVsc2UgaWYgKHN0cmNtcCAoYXJndlsxXSwgIi1jIikgPT0gMCkKKyAgICBnZW5fdGFyZ19tYXBfYyAoKTsKKyAgZWxzZQorICAgIGFib3J0ICgpOworCisgIGV4aXQgKDApOworfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9nZW50dmFscy5zaCBiL3NpbS9jb21tb24vZ2VudHZhbHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkNzMxNQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vZ2VudHZhbHMuc2gKQEAgLTAsMCArMSw3NCBAQAorIyEvYmluL3NoCisjIFVzYWdlOiBnZW50dmFscy5zaCB0YXJnZXQgdHlwZSBkaXIgZmlsZXMgcGF0dGVybiBjcHAKKwordGFyZ2V0PSQxCit0eXBlPSQyCitkaXI9JDMKKyMgRklYTUU6IFdvdWxkIGJlIG5pY2UgdG8gcHJvY2VzcyAjaW5jbHVkZSdzIGluIHRoZXNlIGZpbGVzLgorZmlsZXM9JDQKK3BhdHRlcm49JDUKK2NwcD0kNgorCisjIEZJWE1FOiBuZWVkIHRyYXAgdG8gcmVtb3ZlIHRtcCBmaWxlcy4KKworcm0gLWYgdG1wdmFscy5saXN0IHRtcHZhbHMudW5pcQorZm9yIGYgaW4gJGZpbGVzCitkbworCWlmIHRlc3QgLWYgJGRpci8kZiA7IHRoZW4KKwkJZ3JlcCAiI2RlZmluZVsgCV0kcGF0dGVybiIgJGRpci8kZiB8IHNlZCAtZSAicy9eLiojZGVmaW5lWyAJXVwoJHBhdHRlcm5cKVsgCV0qXChbXiAJXVteIAldKlwpLiokL1wxLyIgPj4gdG1wdmFscy5saXN0CisJZmkKK2RvbmUKKworc29ydCA8dG1wdmFscy5saXN0IHwgdW5pcSA+dG1wdmFscy51bmlxCisKK3JtIC1mIHRtcHZhbHMuaAorZm9yIGYgaW4gJGZpbGVzCitkbworCWlmIHRlc3QgLWYgJGRpci8kZiA7IHRoZW4KKwkJZWNobyAiI2luY2x1ZGUgPCRmPiIgPj50bXB2YWxzLmgKKwlmaQorZG9uZQorCitjYXQgdG1wdmFscy51bmlxIHwKK3doaWxlIHJlYWQgc3ltCitkbworCWVjaG8gIiNpZmRlZiAkc3ltIiA+PnRtcHZhbHMuaAorCWVjaG8gJ0RFRlZBTCB7ICInJHN5bSciLCAnJHN5bSAnIH0sJyA+PnRtcHZhbHMuaAorCWVjaG8gIiNlbmRpZiIgPj50bXB2YWxzLmgKK2RvbmUKKworaWYgdGVzdCAteiAiJHRhcmdldCIKK3RoZW4KKwllY2hvICIjaWZkZWYgJHt0eXBlfV9kZWZzIgorZWxzZQorCWVjaG8gIiNpZmRlZiBOTF9UQVJHRVRfJHRhcmdldCIKKwllY2hvICIjaWZkZWYgJHt0eXBlfV9kZWZzIgorZmkKKworZm9yIGYgaW4gJGZpbGVzCitkbworCWlmIHRlc3QgLWYgJGRpci8kZiA7IHRoZW4KKwkJZWNobyAiLyogZnJvbSAkZiAqLyIKKwlmaQorZG9uZQorCitpZiB0ZXN0IC16ICIkdGFyZ2V0IgordGhlbgorCWVjaG8gIi8qIGJlZ2luICR0eXBlIHRhcmdldCBtYWNyb3MgKi8iCitlbHNlCisJZWNobyAiLyogYmVnaW4gJHRhcmdldCAkdHlwZSB0YXJnZXQgbWFjcm9zICovIgorZmkKKworJGNwcCAtSSRkaXIgdG1wdmFscy5oIHwgZ3JlcCBERUZWQUwgfCBzZWQgLWUgJ3MvREVGVkFMLy8nIC1lICdzLyAgLyAvJworCitpZiB0ZXN0IC16ICIkdGFyZ2V0IgordGhlbgorCWVjaG8gIi8qIGVuZCAkdHlwZSB0YXJnZXQgbWFjcm9zICovIgorCWVjaG8gIiNlbmRpZiIKK2Vsc2UKKwllY2hvICIvKiBlbmQgJHRhcmdldCAkdHlwZSB0YXJnZXQgbWFjcm9zICovIgorCWVjaG8gIiNlbmRpZiIKKwllY2hvICIjZW5kaWYiCitmaQorCitybSAtZiB0bXB2YWxzLmxpc3QgdG1wdmFscy51bmlxIHRtcHZhbHMuaApkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9ody1hbGxvYy5jIGIvc2ltL2NvbW1vbi9ody1hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NGFlODIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL2h3LWFsbG9jLmMKQEAgLTAsMCArMSw5OSBAQAorLyogSGFyZHdhcmUgbWVtb3J5IGFsbG9jYXRvci4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2luY2x1ZGUgImh3LW1haW4uaCIKKyNpbmNsdWRlICJody1iYXNlLmgiCisKKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCitzdHJ1Y3QgaHdfYWxsb2NfZGF0YSB7CisgIHZvaWQgKmFsbG9jOworICBpbnQgemFsbG9jX3A7CisgIHN0cnVjdCBod19hbGxvY19kYXRhICpuZXh0OworfTsKKwordm9pZAorY3JlYXRlX2h3X2FsbG9jX2RhdGEgKHN0cnVjdCBodyAqbWUpCit7CisgIC8qIE5VTEwgKi8KK30KKwordm9pZAorZGVsZXRlX2h3X2FsbG9jX2RhdGEgKHN0cnVjdCBodyAqbWUpCit7CisgIGlmIChtZS0+YWxsb2Nfb2ZfaHcgIT0gTlVMTCkKKyAgICBod19hYm9ydCAobWUsICJody1hbGxvYyBib3RjaCIpOworICB3aGlsZSAobWUtPmFsbG9jX29mX2h3ICE9IE5VTEwpCisgICAgeworICAgICAgaHdfZnJlZSAobWUsIG1lLT5hbGxvY19vZl9ody0+YWxsb2MpOworICAgIH0KK30KKworCisKK3ZvaWQgKgoraHdfemFsbG9jIChzdHJ1Y3QgaHcgKm1lLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisgIHN0cnVjdCBod19hbGxvY19kYXRhICptZW1vcnkgPSBaQUxMT0MgKHN0cnVjdCBod19hbGxvY19kYXRhKTsKKyAgbWVtb3J5LT5hbGxvYyA9IHphbGxvYyAoc2l6ZSk7CisgIG1lbW9yeS0+emFsbG9jX3AgPSAxOworICBtZW1vcnktPm5leHQgPSBtZS0+YWxsb2Nfb2ZfaHc7CisgIG1lLT5hbGxvY19vZl9odyA9IG1lbW9yeTsKKyAgcmV0dXJuIG1lbW9yeS0+YWxsb2M7Cit9CisKK3ZvaWQgKgoraHdfbWFsbG9jIChzdHJ1Y3QgaHcgKm1lLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisgIHN0cnVjdCBod19hbGxvY19kYXRhICptZW1vcnkgPSBaQUxMT0MgKHN0cnVjdCBod19hbGxvY19kYXRhKTsKKyAgbWVtb3J5LT5hbGxvYyA9IHphbGxvYyAoc2l6ZSk7CisgIG1lbW9yeS0+emFsbG9jX3AgPSAwOworICBtZW1vcnktPm5leHQgPSBtZS0+YWxsb2Nfb2ZfaHc7CisgIG1lLT5hbGxvY19vZl9odyA9IG1lbW9yeTsKKyAgcmV0dXJuIG1lbW9yeS0+YWxsb2M7Cit9CisKK3ZvaWQKK2h3X2ZyZWUgKHN0cnVjdCBodyAqbWUsCisJIHZvaWQgKmFsbG9jKQoreworICBzdHJ1Y3QgaHdfYWxsb2NfZGF0YSAqKm1lbW9yeTsKKyAgZm9yIChtZW1vcnkgPSAmbWUtPmFsbG9jX29mX2h3OworICAgICAgICptZW1vcnkgIT0gTlVMTDsKKyAgICAgICBtZW1vcnkgPSAmKCptZW1vcnkpLT5uZXh0KQorICAgIHsKKyAgICAgIGlmICgoKm1lbW9yeSktPmFsbG9jID09IGFsbG9jKQorCXsKKwkgIHN0cnVjdCBod19hbGxvY19kYXRhICpkaWUgPSAoKm1lbW9yeSk7CisJICAoKm1lbW9yeSkgPSBkaWUtPm5leHQ7CisJICBpZiAoZGllLT56YWxsb2NfcCkKKwkgICAgemZyZWUgKGRpZS0+YWxsb2MpOworCSAgZWxzZQorCSAgICBmcmVlIChkaWUtPmFsbG9jKTsKKwkgIHpmcmVlIChkaWUpOworCSAgcmV0dXJuOworCX0KKyAgICB9CisgIGh3X2Fib3J0IChtZSwgImZyZWUgb2YgbWVtb3J5IG5vdCBiZWxvbmdpbmcgdG8gYSBkZXZpY2UiKTsKK30KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vaHctYWxsb2MuaCBiL3NpbS9jb21tb24vaHctYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGIwM2YyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9ody1hbGxvYy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIEhhcmR3YXJlIG1lbW9yeSBhbGxvY2F0b3IuCisgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNpZm5kZWYgSFdfQUxMT0NfSAorI2RlZmluZSBIV19BTExPQ19ICisKKy8qIE1lY2hhbmlzbSBmb3IgYXNzb2NpYXRpbmcgbWVtb3J5IGFsbG9jYXRlZCBieSBhIGRldmljZSB0byB0aGF0CisgICBkZXZpY2UuCisKKyAgIFdoZW4gYSBkZXZpY2UgaXMgZGVsZXRlZCBhbnkgcmVtYWluaW5nIG1lbW9yeSByZWdpb25zIGFzc29jaWF0ZWQgdG8KKyAgIGl0IGFyZSByZWNsYWltZWQuCisKKyAgIEZJWE1FOiBQZXJoYXBocyB0aGlzIGNhbiBiZSBnZW5lcmFsaXplZC4gUGVyaGFwaHMgaXQgc2hvdWxkIG5vdAorICAgYmUuICovCisKKworI2RlZmluZSBIV19aQUxMT0MobWUsdHlwZSkgKHR5cGUqKSBod196YWxsb2MgKG1lLCBzaXplb2YgKHR5cGUpKQorI2RlZmluZSBIV19NQUxMT0MobWUsdHlwZSkgKHR5cGUqKSBod19tYWxsb2MgKG1lLCBzaXplb2YgKHR5cGUpKQorI2RlZmluZSBIV19OWkFMTE9DKE1FLFRZUEUsTikgKFRZUEUqKSBod196YWxsb2MgKG1lLCBzaXplb2YgKFRZUEUpICogKE4pKQorCitleHRlcm4gdm9pZCAqaHdfemFsbG9jIChzdHJ1Y3QgaHcgKm1lLCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIHZvaWQgKmh3X21hbGxvYyAoc3RydWN0IGh3ICptZSwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworZXh0ZXJuIHZvaWQgaHdfZnJlZSAoc3RydWN0IGh3ICptZSwgdm9pZCAqKTsKKworCisvKiBEdXBsaWNhdGUgYSBzdHJpbmcgYWxsb2NhdGluZyBtZW1vcnkgdXNpbmcgdGhlIHBlci1kZXZpY2UgaGVhcCAqLworCitleHRlcm4gY2hhciAqaHdfc3RyZHVwIChzdHJ1Y3QgaHcgKm1lLCBjb25zdCBjaGFyICpzdHIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vaHctYmFzZS5jIGIvc2ltL2NvbW1vbi9ody1iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzYWM2NAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vaHctYmFzZS5jCkBAIC0wLDAgKzEsNTcxIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCAxOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaW5jbHVkZSAiaHctbWFpbi5oIgorI2luY2x1ZGUgImh3LWJhc2UuaCIKKworCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJody1jb25maWcuaCIKKworc3RydWN0IGh3X2Jhc2VfZGF0YSB7CisgIGludCBmaW5pc2hlZF9wOworICBjb25zdCBzdHJ1Y3QgaHdfZGVzY3JpcHRvciAqZGVzY3JpcHRvcjsKKyAgaHdfZGVsZXRlX2NhbGxiYWNrICp0b19kZWxldGU7Cit9OworCitzdGF0aWMgaW50CitnZW5lcmljX2h3X3VuaXRfZGVjb2RlIChzdHJ1Y3QgaHcgKmJ1cywKKwkJCWNvbnN0IGNoYXIgKnVuaXQsCisJCQlod191bml0ICpwaHlzKQoreworICBtZW1zZXQgKHBoeXMsIDAsIHNpemVvZiAoKnBoeXMpKTsKKyAgaWYgKHVuaXQgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGludCBucl9jZWxscyA9IDA7CisgICAgICBjb25zdCBpbnQgbWF4X25yX2NlbGxzID0gaHdfdW5pdF9ucl9hZGRyZXNzX2NlbGxzIChidXMpOworICAgICAgd2hpbGUgKDEpCisJeworCSAgY2hhciAqZW5kID0gTlVMTDsKKwkgIHVuc2lnbmVkIGxvbmcgdmFsOworCSAgdmFsID0gc3RydG91bCAodW5pdCwgJmVuZCwgMCk7CisJICAvKiBwYXJzZSBlcnJvcj8gKi8KKwkgIGlmICh1bml0ID09IGVuZCkKKwkgICAgcmV0dXJuIC0xOworCSAgLyogdHdvIG1hbnkgY2VsbHM/ICovCisJICBpZiAobnJfY2VsbHMgPj0gbWF4X25yX2NlbGxzKQorCSAgICByZXR1cm4gLTE7CisJICAvKiBzYXZlIGl0ICovCisJICBwaHlzLT5jZWxsc1tucl9jZWxsc10gPSB2YWw7CisJICBucl9jZWxscysrOworCSAgdW5pdCA9IGVuZDsKKwkgIC8qIG1vcmUgdG8gZm9sbG93PyAqLworCSAgaWYgKGlzc3BhY2UgKCp1bml0KSB8fCAqdW5pdCA9PSAnXDAnKQorCSAgICBicmVhazsKKwkgIGlmICgqdW5pdCAhPSAnLCcpCisJICAgIHJldHVybiAtMTsKKwkgIHVuaXQrKzsKKwl9CisgICAgICBpZiAobnJfY2VsbHMgPCBtYXhfbnJfY2VsbHMpIHsKKwkvKiBzaGlmdCBldmVyeXRoaW5nIHRvIGNvcnJlY3QgcG9zaXRpb24gKi8KKwlpbnQgaTsKKwlmb3IgKGkgPSAxOyBpIDw9IG5yX2NlbGxzOyBpKyspCisJICBwaHlzLT5jZWxsc1ttYXhfbnJfY2VsbHMgLSBpXSA9IHBoeXMtPmNlbGxzW25yX2NlbGxzIC0gaV07CisJZm9yIChpID0gMDsgaSA8IChtYXhfbnJfY2VsbHMgLSBucl9jZWxscyk7IGkrKykKKwkgIHBoeXMtPmNlbGxzW2ldID0gMDsKKyAgICAgIH0KKyAgICAgIHBoeXMtPm5yX2NlbGxzID0gbWF4X25yX2NlbGxzOworICAgICAgcmV0dXJuIG1heF9ucl9jZWxsczsKKyAgfQorfQorCitzdGF0aWMgaW50CitnZW5lcmljX2h3X3VuaXRfZW5jb2RlIChzdHJ1Y3QgaHcgKmJ1cywKKwkJCWNvbnN0IGh3X3VuaXQgKnBoeXMsCisJCQljaGFyICpidWYsCisJCQlpbnQgc2l6ZW9mX2J1ZikKK3sKKyAgaW50IGk7CisgIGludCBsZW47CisgIGNoYXIgKnBvcyA9IGJ1ZjsKKyAgLyogc2tpcCBsZWFkaW5nIHplcm8ncyAqLworICBmb3IgKGkgPSAwOyBpIDwgcGh5cy0+bnJfY2VsbHM7IGkrKykKKyAgICB7CisgICAgICBpZiAocGh5cy0+Y2VsbHNbaV0gIT0gMCkKKwlicmVhazsKKyAgICB9CisgIC8qIGRvbid0IG91dHB1dCBhbnl0aGluZyBpZiBlbXB0eSAqLworICBpZiAocGh5cy0+bnJfY2VsbHMgPT0gMCkKKyAgICB7CisgICAgICBzdHJjcHkocG9zLCAiIik7CisgICAgICBsZW4gPSAwOworICAgIH0KKyAgZWxzZSBpZiAoaSA9PSBwaHlzLT5ucl9jZWxscykKKyAgICB7CisgICAgICAvKiBhbGwgemVybyAqLworICAgICAgc3RyY3B5KHBvcywgIjAiKTsKKyAgICAgIGxlbiA9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZm9yICg7IGkgPCBwaHlzLT5ucl9jZWxsczsgaSsrKQorCXsKKwkgIGlmIChwb3MgIT0gYnVmKSB7CisJICAgIHN0cmNhdChwb3MsICIsIik7CisJICAgIHBvcyA9IHN0cmNocihwb3MsICdcMCcpOworCSAgfQorCSAgaWYgKHBoeXMtPmNlbGxzW2ldIDwgMTApCisJICAgIHNwcmludGYgKHBvcywgIiVsZCIsICh1bnNpZ25lZCBsb25nKXBoeXMtPmNlbGxzW2ldKTsKKwkgIGVsc2UKKwkgICAgc3ByaW50ZiAocG9zLCAiMHglbHgiLCAodW5zaWduZWQgbG9uZylwaHlzLT5jZWxsc1tpXSk7CisJICBwb3MgPSBzdHJjaHIocG9zLCAnXDAnKTsKKwl9CisgICAgICBsZW4gPSBwb3MgLSBidWY7CisgICAgfQorICBpZiAobGVuID49IHNpemVvZl9idWYpCisgICAgaHdfYWJvcnQgKE5VTEwsICJnZW5lcmljX3VuaXRfZW5jb2RlIC0gYnVmZmVyIG92ZXJmbG93XG4iKTsKKyAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludAorZ2VuZXJpY19od191bml0X2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MgKHN0cnVjdCBodyAqbWUsCisJCQkJCSAgIGNvbnN0IGh3X3VuaXQgKmFkZHJlc3MsCisJCQkJCSAgIGludCAqYXR0YWNoX3NwYWNlLAorCQkJCQkgICB1bnNpZ25lZF93b3JkICphdHRhY2hfYWRkcmVzcywKKwkJCQkJICAgc3RydWN0IGh3ICpjbGllbnQpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgYWRkcmVzcy0+bnJfY2VsbHMgLSAyOyBpKyspCisgICAgeworICAgICAgaWYgKGFkZHJlc3MtPmNlbGxzW2ldICE9IDApCisJaHdfYWJvcnQgKG1lLCAiT25seSAzMmJpdCBhZGRyZXNzZXMgc3VwcG9ydGVkIik7CisgICAgfQorICBpZiAoYWRkcmVzcy0+bnJfY2VsbHMgPj0gMikKKyAgICAqYXR0YWNoX3NwYWNlID0gYWRkcmVzcy0+Y2VsbHNbYWRkcmVzcy0+bnJfY2VsbHMgLSAyXTsKKyAgZWxzZQorICAgICphdHRhY2hfc3BhY2UgPSAwOworICAqYXR0YWNoX2FkZHJlc3MgPSBhZGRyZXNzLT5jZWxsc1thZGRyZXNzLT5ucl9jZWxscyAtIDFdOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorZ2VuZXJpY19od191bml0X3NpemVfdG9fYXR0YWNoX3NpemUgKHN0cnVjdCBodyAqbWUsCisJCQkJICAgICBjb25zdCBod191bml0ICpzaXplLAorCQkJCSAgICAgdW5zaWduZWQgKm5yX2J5dGVzLAorCQkJCSAgICAgc3RydWN0IGh3ICpjbGllbnQpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZS0+bnJfY2VsbHMgLSAxOyBpKyspCisgICAgeworICAgICAgaWYgKHNpemUtPmNlbGxzW2ldICE9IDApCisJaHdfYWJvcnQgKG1lLCAiT25seSAzMmJpdCBzaXplcyBzdXBwb3J0ZWQiKTsKKyAgICB9CisgICpucl9ieXRlcyA9IHNpemUtPmNlbGxzWzBdOworICByZXR1cm4gKm5yX2J5dGVzOworfQorCisKKy8qIGlnbm9yZS9wYXNzdGhyb3VnaCB2ZXJzaW9ucyBvZiBlYWNoIGZ1bmN0aW9uICovCisKK3N0YXRpYyB2b2lkCitwYXNzdGhyb3VnaF9od19hdHRhY2hfYWRkcmVzcyAoc3RydWN0IGh3ICptZSwKKwkJCSAgICAgICBpbnQgbGV2ZWwsCisJCQkgICAgICAgaW50IHNwYWNlLAorCQkJICAgICAgIGFkZHJlc3Nfd29yZCBhZGRyLAorCQkJICAgICAgIGFkZHJlc3Nfd29yZCBucl9ieXRlcywKKwkJCSAgICAgICBzdHJ1Y3QgaHcgKmNsaWVudCkgLypjYWxsYmFjay9kZWZhdWx0Ki8KK3sKKyAgaWYgKGh3X3BhcmVudCAobWUpID09IE5VTEwpCisgICAgaHdfYWJvcnQgKGNsaWVudCwgImh3X2F0dGFjaF9hZGRyZXNzOiBubyBwYXJlbnQgYXR0YWNoIG1ldGhvZCIpOworICBod19hdHRhY2hfYWRkcmVzcyAoaHdfcGFyZW50IChtZSksIGxldmVsLAorCQkgICAgIHNwYWNlLCBhZGRyLCBucl9ieXRlcywKKwkJICAgICBjbGllbnQpOworfQorCitzdGF0aWMgdm9pZAorcGFzc3Rocm91Z2hfaHdfZGV0YWNoX2FkZHJlc3MgKHN0cnVjdCBodyAqbWUsCisJCQkgICAgICAgaW50IGxldmVsLAorCQkJICAgICAgIGludCBzcGFjZSwKKwkJCSAgICAgICBhZGRyZXNzX3dvcmQgYWRkciwKKwkJCSAgICAgICBhZGRyZXNzX3dvcmQgbnJfYnl0ZXMsCisJCQkgICAgICAgc3RydWN0IGh3ICpjbGllbnQpIC8qY2FsbGJhY2svZGVmYXVsdCovCit7CisgIGlmIChod19wYXJlbnQgKG1lKSA9PSBOVUxMKQorICAgIGh3X2Fib3J0IChjbGllbnQsICJod19hdHRhY2hfYWRkcmVzczogbm8gcGFyZW50IGF0dGFjaCBtZXRob2QiKTsKKyAgaHdfZGV0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLCBsZXZlbCwKKwkJICAgICBzcGFjZSwgYWRkciwgbnJfYnl0ZXMsCisJCSAgICAgY2xpZW50KTsKK30KKworc3RhdGljIHVuc2lnbmVkCitwYW5pY19od19pb19yZWFkX2J1ZmZlciAoc3RydWN0IGh3ICptZSwKKwkJCSB2b2lkICpkZXN0LAorCQkJIGludCBzcGFjZSwKKwkJCSB1bnNpZ25lZF93b3JkIGFkZHIsCisJCQkgdW5zaWduZWQgbnJfYnl0ZXMpCit7CisgIGh3X2Fib3J0IChtZSwgIm5vIGlvLXJlYWQgbWV0aG9kIik7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQKK3BhbmljX2h3X2lvX3dyaXRlX2J1ZmZlciAoc3RydWN0IGh3ICptZSwKKwkJCSAgY29uc3Qgdm9pZCAqc291cmNlLAorCQkJICBpbnQgc3BhY2UsCisJCQkgIHVuc2lnbmVkX3dvcmQgYWRkciwKKwkJCSAgdW5zaWduZWQgbnJfYnl0ZXMpCit7CisgIGh3X2Fib3J0IChtZSwgIm5vIGlvLXdyaXRlIG1ldGhvZCIpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkCitwYXNzdGhyb3VnaF9od19kbWFfcmVhZF9idWZmZXIgKHN0cnVjdCBodyAqbWUsCisJCQkJdm9pZCAqZGVzdCwKKwkJCQlpbnQgc3BhY2UsCisJCQkJdW5zaWduZWRfd29yZCBhZGRyLAorCQkJCXVuc2lnbmVkIG5yX2J5dGVzKQoreworICBpZiAoaHdfcGFyZW50IChtZSkgPT0gTlVMTCkKKyAgICBod19hYm9ydCAobWUsICJubyBwYXJlbnQgZG1hLXJlYWQgbWV0aG9kIik7CisgIHJldHVybiBod19kbWFfcmVhZF9idWZmZXIgKGh3X3BhcmVudCAobWUpLCBkZXN0LAorCQkJICAgICBzcGFjZSwgYWRkciwgbnJfYnl0ZXMpOworfQorCitzdGF0aWMgdW5zaWduZWQKK3Bhc3N0aHJvdWdoX2h3X2RtYV93cml0ZV9idWZmZXIgKHN0cnVjdCBodyAqbWUsCisJCQkJIGNvbnN0IHZvaWQgKnNvdXJjZSwKKwkJCQkgaW50IHNwYWNlLAorCQkJCSB1bnNpZ25lZF93b3JkIGFkZHIsCisJCQkJIHVuc2lnbmVkIG5yX2J5dGVzLAorCQkJCSBpbnQgdmlvbGF0ZV9yZWFkX29ubHlfc2VjdGlvbikKK3sKKyAgaWYgKGh3X3BhcmVudCAobWUpID09IE5VTEwpCisgICAgaHdfYWJvcnQgKG1lLCAibm8gcGFyZW50IGRtYS13cml0ZSBtZXRob2QiKTsKKyAgcmV0dXJuIGh3X2RtYV93cml0ZV9idWZmZXIgKGh3X3BhcmVudCAobWUpLCBzb3VyY2UsCisJCQkgICAgICBzcGFjZSwgYWRkciwKKwkJCSAgICAgIG5yX2J5dGVzLAorCQkJICAgICAgdmlvbGF0ZV9yZWFkX29ubHlfc2VjdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitpZ25vcmVfaHdfZGVsZXRlIChzdHJ1Y3QgaHcgKm1lKQoreworICAvKiBOT1AgKi8KK30KKworCisKKworc3RhdGljIGNvbnN0IGNoYXIgKgorZnVsbF9uYW1lX29mX2h3IChzdHJ1Y3QgaHcgKmxlYWYsCisJCSBjaGFyICpidWYsCisJCSB1bnNpZ25lZCBzaXplb2ZfYnVmKQoreworICAvKiBnZXQgYSBidWZmZXIgKi8KKyAgY2hhciBmdWxsX25hbWVbMTAyNF07CisgIGlmIChidWYgPT0gKGNoYXIqKTApCisgICAgeworICAgICAgYnVmID0gZnVsbF9uYW1lOworICAgICAgc2l6ZW9mX2J1ZiA9IHNpemVvZiAoZnVsbF9uYW1lKTsKKyAgICB9CisKKyAgLyogdXNlIGhlYWQgcmVjdXJzaW9uIHRvIGNvbnN0cnVjdCB0aGUgcGF0aCAqLworCisgIGlmIChod19wYXJlbnQgKGxlYWYpID09IE5VTEwpCisgICAgLyogcm9vdCAqLworICAgIHsKKyAgICAgIGlmIChzaXplb2ZfYnVmIDwgMSkKKwlod19hYm9ydCAobGVhZiwgImJ1ZmZlciBvdmVyZmxvdyIpOworICAgICAgKmJ1ZiA9ICdcMCc7CisgICAgfQorICBlbHNlCisgICAgLyogc3ViIG5vZGUgKi8KKyAgICB7CisgICAgICBjaGFyIHVuaXRbMTAyNF07CisgICAgICBmdWxsX25hbWVfb2ZfaHcgKGh3X3BhcmVudCAobGVhZiksIGJ1Ziwgc2l6ZW9mX2J1Zik7CisgICAgICBpZiAoaHdfdW5pdF9lbmNvZGUgKGh3X3BhcmVudCAobGVhZiksCisJCQkgIGh3X3VuaXRfYWRkcmVzcyAobGVhZiksCisJCQkgIHVuaXQgKyAxLAorCQkJICBzaXplb2YgKHVuaXQpIC0gMSkKKwkgID4gMCkKKwl1bml0WzBdID0gJ0AnOworICAgICAgZWxzZQorCXVuaXRbMF0gPSAnXDAnOworICAgICAgaWYgKHN0cmxlbiAoYnVmKSArIHN0cmxlbiAoIi8iKSArIHN0cmxlbiAoaHdfbmFtZSAobGVhZikpICsgc3RybGVuICh1bml0KQorCSAgPj0gc2l6ZW9mX2J1ZikKKwlod19hYm9ydCAobGVhZiwgImJ1ZmZlciBvdmVyZmxvdyIpOworICAgICAgc3RyY2F0IChidWYsICIvIik7CisgICAgICBzdHJjYXQgKGJ1ZiwgaHdfbmFtZSAobGVhZikpOworICAgICAgc3RyY2F0IChidWYsIHVuaXQpOworICAgIH0KKyAgCisgIC8qIHJldHVybiBpdCB1c2VmdWxseSAqLworICBpZiAoYnVmID09IGZ1bGxfbmFtZSkKKyAgICBidWYgPSBod19zdHJkdXAgKGxlYWYsIGZ1bGxfbmFtZSk7CisgIHJldHVybiBidWY7Cit9CisKK3N0cnVjdCBodyAqCitod19jcmVhdGUgKHN0cnVjdCBzaW1fc3RhdGUgKnNkLAorCSAgIHN0cnVjdCBodyAqcGFyZW50LAorCSAgIGNvbnN0IGNoYXIgKmZhbWlseSwKKwkgICBjb25zdCBjaGFyICpuYW1lLAorCSAgIGNvbnN0IGNoYXIgKnVuaXQsCisJICAgY29uc3QgY2hhciAqYXJncykKK3sKKyAvKiBOT1RFOiBIVyBtdXN0IGJlIGFsbG9jYXRlZCB1c2luZyBaQUxMT0MsIG90aGVycyB1c2UgSFdfWkFMTE9DICovCisgIHN0cnVjdCBodyAqaHcgPSBaQUxMT0MgKHN0cnVjdCBodyk7CisKKyAgLyogb3VyIGlkZW50aXR5ICovCisgIGh3LT5mYW1pbHlfb2ZfaHcgPSBod19zdHJkdXAgKGh3LCBmYW1pbHkpOworICBody0+bmFtZV9vZl9odyA9IGh3X3N0cmR1cCAoaHcsIG5hbWUpOworICBody0+YXJnc19vZl9odyA9IGh3X3N0cmR1cCAoaHcsIGFyZ3MpOworCisgIC8qIGEgaG9vayBpbnRvIHRoZSBzeXN0ZW0gKi8KKyAgaWYgKHNkICE9IE5VTEwpCisgICAgaHctPnN5c3RlbV9vZl9odyA9IHNkOworICBlbHNlIGlmIChwYXJlbnQgIT0gTlVMTCkKKyAgICBody0+c3lzdGVtX29mX2h3ID0gaHdfc3lzdGVtIChwYXJlbnQpOworICBlbHNlCisgICAgaHdfYWJvcnQgKHBhcmVudCwgIk5vIHN5c3RlbSBmb3VuZCIpOworCisgIC8qIGluIGEgdHJlZSAqLworICBpZiAocGFyZW50ICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IGh3ICoqc2libGluZyA9ICZwYXJlbnQtPmNoaWxkX29mX2h3OworICAgICAgd2hpbGUgKCgqc2libGluZykgIT0gTlVMTCkKKwlzaWJsaW5nID0gJigqc2libGluZyktPnNpYmxpbmdfb2ZfaHc7CisgICAgICAqc2libGluZyA9IGh3OworICAgICAgaHctPnBhcmVudF9vZl9odyA9IHBhcmVudDsKKyAgICB9CisKKyAgLyogdG9wIG9mIHRyZWUgKi8KKyAgaWYgKHBhcmVudCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBodyAqcm9vdCA9IHBhcmVudDsKKyAgICAgIHdoaWxlIChyb290LT5wYXJlbnRfb2ZfaHcgIT0gTlVMTCkKKwlyb290ID0gcm9vdC0+cGFyZW50X29mX2h3OworICAgICAgaHctPnJvb3Rfb2ZfaHcgPSByb290OworICAgIH0KKyAgCisgIC8qIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBkZXZpY2Ugb24gdGhlIHBhcmVudHMgYnVzICovCisgIGlmIChwYXJlbnQgIT0gTlVMTCkKKyAgICB7CisgICAgICBod191bml0X2RlY29kZSAocGFyZW50LCB1bml0LCAmaHctPnVuaXRfYWRkcmVzc19vZl9odyk7CisgICAgfQorCisgIC8qIERldGVybWluZSBvdXIgcGF0aCAqLworICBpZiAocGFyZW50ICE9IE5VTEwpCisgICAgaHctPnBhdGhfb2ZfaHcgPSBmdWxsX25hbWVfb2ZfaHcgKGh3LCBOVUxMLCAwKTsKKyAgZWxzZQorICAgIGh3LT5wYXRoX29mX2h3ID0gIi8iOworCisgIC8qIGNyZWF0ZSBvdXIgYmFzZSB0eXBlICovCisgIGh3LT5iYXNlX29mX2h3ID0gSFdfWkFMTE9DIChodywgc3RydWN0IGh3X2Jhc2VfZGF0YSk7CisgIGh3LT5iYXNlX29mX2h3LT5maW5pc2hlZF9wID0gMDsKKworICAvKiBvdXIgY2FsbGJhY2tzICovCisgIHNldF9od19pb19yZWFkX2J1ZmZlciAoaHcsIHBhbmljX2h3X2lvX3JlYWRfYnVmZmVyKTsKKyAgc2V0X2h3X2lvX3dyaXRlX2J1ZmZlciAoaHcsIHBhbmljX2h3X2lvX3dyaXRlX2J1ZmZlcik7CisgIHNldF9od19kbWFfcmVhZF9idWZmZXIgKGh3LCBwYXNzdGhyb3VnaF9od19kbWFfcmVhZF9idWZmZXIpOworICBzZXRfaHdfZG1hX3dyaXRlX2J1ZmZlciAoaHcsIHBhc3N0aHJvdWdoX2h3X2RtYV93cml0ZV9idWZmZXIpOworICBzZXRfaHdfdW5pdF9kZWNvZGUgKGh3LCBnZW5lcmljX2h3X3VuaXRfZGVjb2RlKTsKKyAgc2V0X2h3X3VuaXRfZW5jb2RlIChodywgZ2VuZXJpY19od191bml0X2VuY29kZSk7CisgIHNldF9od191bml0X2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MgKGh3LCBnZW5lcmljX2h3X3VuaXRfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyk7CisgIHNldF9od191bml0X3NpemVfdG9fYXR0YWNoX3NpemUgKGh3LCBnZW5lcmljX2h3X3VuaXRfc2l6ZV90b19hdHRhY2hfc2l6ZSk7CisgIHNldF9od19hdHRhY2hfYWRkcmVzcyAoaHcsIHBhc3N0aHJvdWdoX2h3X2F0dGFjaF9hZGRyZXNzKTsKKyAgc2V0X2h3X2RldGFjaF9hZGRyZXNzIChodywgcGFzc3Rocm91Z2hfaHdfZGV0YWNoX2FkZHJlc3MpOworICBzZXRfaHdfZGVsZXRlIChodywgaWdub3JlX2h3X2RlbGV0ZSk7CisKKyAgLyogbG9jYXRlIGEgZGVzY3JpcHRvciAqLworICB7CisgICAgY29uc3Qgc3RydWN0IGh3X2Rlc2NyaXB0b3IgKip0YWJsZTsKKyAgICBmb3IgKHRhYmxlID0gaHdfZGVzY3JpcHRvcnM7CisJICp0YWJsZSAhPSBOVUxMOworCSB0YWJsZSsrKQorICAgICAgeworCWNvbnN0IHN0cnVjdCBod19kZXNjcmlwdG9yICplbnRyeTsKKwlmb3IgKGVudHJ5ID0gKnRhYmxlOworCSAgICAgZW50cnktPmZhbWlseSAhPSBOVUxMOworCSAgICAgZW50cnkrKykKKwkgIHsKKwkgICAgaWYgKHN0cmNtcCAoZmFtaWx5LCBlbnRyeS0+ZmFtaWx5KSA9PSAwKQorCSAgICAgIHsKKwkJaHctPmJhc2Vfb2ZfaHctPmRlc2NyaXB0b3IgPSBlbnRyeTsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgfQorICAgICAgfQorICAgIGlmIChody0+YmFzZV9vZl9ody0+ZGVzY3JpcHRvciA9PSBOVUxMKQorICAgICAgeworCWh3X2Fib3J0IChwYXJlbnQsICJVbmtub3duIGRldmljZSBgJXMnIiwgZmFtaWx5KTsKKyAgICAgIH0KKyAgfQorCisgIC8qIEF0dGFjaCBkdW1teSBwb3J0cyAqLworICBjcmVhdGVfaHdfYWxsb2NfZGF0YSAoaHcpOworICBjcmVhdGVfaHdfcHJvcGVydHlfZGF0YSAoaHcpOworICBjcmVhdGVfaHdfcG9ydF9kYXRhIChodyk7CisgIGNyZWF0ZV9od19ldmVudF9kYXRhIChodyk7CisgIGNyZWF0ZV9od19oYW5kbGVfZGF0YSAoaHcpOworICBjcmVhdGVfaHdfaW5zdGFuY2VfZGF0YSAoaHcpOworICAKKyAgcmV0dXJuIGh3OworfQorCisKK2ludAoraHdfZmluaXNoZWRfcCAoc3RydWN0IGh3ICptZSkKK3sKKyAgcmV0dXJuIChtZS0+YmFzZV9vZl9ody0+ZmluaXNoZWRfcCk7Cit9CisKK3ZvaWQKK2h3X2ZpbmlzaCAoc3RydWN0IGh3ICptZSkKK3sKKyAgaWYgKGh3X2ZpbmlzaGVkX3AgKG1lKSkKKyAgICBod19hYm9ydCAobWUsICJBdHRlbXB0IHRvIGZpbmlzaCBmaW5pc2hlZCBkZXZpY2UiKTsKKworICAvKiBGaWxsIGluIHRoZSAoaG9wZWZ1bGx5KSBkZWZpbmVkIGFkZHJlc3Mvc2l6ZSBjZWxscyB2YWx1ZXMgKi8KKyAgaWYgKGh3X2ZpbmRfcHJvcGVydHkgKG1lLCAiI2FkZHJlc3MtY2VsbHMiKSAhPSBOVUxMKQorICAgIG1lLT5ucl9hZGRyZXNzX2NlbGxzX29mX2h3X3VuaXQgPQorICAgICAgaHdfZmluZF9pbnRlZ2VyX3Byb3BlcnR5IChtZSwgIiNhZGRyZXNzLWNlbGxzIik7CisgIGVsc2UKKyAgICBtZS0+bnJfYWRkcmVzc19jZWxsc19vZl9od191bml0ID0gMjsKKyAgaWYgKGh3X2ZpbmRfcHJvcGVydHkgKG1lLCAiI3NpemUtY2VsbHMiKSAhPSBOVUxMKQorICAgIG1lLT5ucl9zaXplX2NlbGxzX29mX2h3X3VuaXQgPQorICAgICAgaHdfZmluZF9pbnRlZ2VyX3Byb3BlcnR5IChtZSwgIiNzaXplLWNlbGxzIik7CisgIGVsc2UKKyAgICBtZS0+bnJfc2l6ZV9jZWxsc19vZl9od191bml0ID0gMTsKKworICAvKiBGaWxsIGluIHRoZSAoaG9wZWZ1bGx5KSBkZWZpbmVkIHRyYWNlIHZhcmlhYmxlICovCisgIGlmIChod19maW5kX3Byb3BlcnR5IChtZSwgInRyYWNlPyIpICE9IE5VTEwpCisgICAgbWUtPnRyYWNlX29mX2h3X3AgPSBod19maW5kX2Jvb2xlYW5fcHJvcGVydHkgKG1lLCAidHJhY2U/Iik7CisgIC8qIGFsbG93IGdsb2JhbCB2YXJpYWJsZSB0byBkZWZpbmUgZGVmYXVsdCB0cmFjaW5nICovCisgIGVsc2UgaWYgKCEgaHdfdHJhY2VfcCAobWUpCisJICAgJiYgaHdfZmluZF9wcm9wZXJ0eSAoaHdfcm9vdCAobWUpLCAiZ2xvYmFsLXRyYWNlPyIpICE9IE5VTEwKKwkgICAmJiBod19maW5kX2Jvb2xlYW5fcHJvcGVydHkgKGh3X3Jvb3QgKG1lKSwgImdsb2JhbC10cmFjZT8iKSkKKyAgICBtZS0+dHJhY2Vfb2ZfaHdfcCA9IDE7CisgICAgCisKKyAgLyogQWxsb3cgdGhlIHJlYWwgZGV2aWNlIHRvIG92ZXJyaWRlIGFueSBtZXRob2RzICovCisgIG1lLT5iYXNlX29mX2h3LT5kZXNjcmlwdG9yLT50b19maW5pc2ggKG1lKTsKKyAgbWUtPmJhc2Vfb2ZfaHctPmZpbmlzaGVkX3AgPSAxOworfQorCisKK3ZvaWQKK2h3X2RlbGV0ZSAoc3RydWN0IGh3ICptZSkKK3sKKyAgLyogZ2l2ZSB0aGUgb2JqZWN0IGEgY2hhbmNlIHRvIHRpZHkgdXAgKi8KKyAgbWUtPmJhc2Vfb2ZfaHctPnRvX2RlbGV0ZSAobWUpOworCisgIGRlbGV0ZV9od19pbnN0YW5jZV9kYXRhIChtZSk7CisgIGRlbGV0ZV9od19oYW5kbGVfZGF0YSAobWUpOworICBkZWxldGVfaHdfZXZlbnRfZGF0YSAobWUpOworICBkZWxldGVfaHdfcG9ydF9kYXRhIChtZSk7CisgIGRlbGV0ZV9od19wcm9wZXJ0eV9kYXRhIChtZSk7CisKKyAgLyogbm93IHVubGluayB1cyBmcm9tIHRoZSB0cmVlICovCisgIGlmIChod19wYXJlbnQgKG1lKSkKKyAgICB7CisgICAgICBzdHJ1Y3QgaHcgKipzaWJsaW5nID0gJmh3X3BhcmVudCAobWUpLT5jaGlsZF9vZl9odzsKKyAgICAgIHdoaWxlICgqc2libGluZyAhPSBOVUxMKQorCXsKKwkgIGlmICgqc2libGluZyA9PSBtZSkKKwkgICAgeworCSAgICAgICpzaWJsaW5nID0gbWUtPnNpYmxpbmdfb2ZfaHc7CisJICAgICAgbWUtPnNpYmxpbmdfb2ZfaHcgPSBOVUxMOworCSAgICAgIG1lLT5wYXJlbnRfb2ZfaHcgPSBOVUxMOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBzb21lIHNhbml0eSBjaGVja3MgKi8KKyAgaWYgKGh3X2NoaWxkIChtZSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBod19hYm9ydCAobWUsICJhdHRlbXB0IHRvIGRlbGV0ZSBkZXZpY2Ugd2l0aCBjaGlsZHJlbiIpOworICAgIH0KKyAgaWYgKGh3X3NpYmxpbmcgKG1lKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGh3X2Fib3J0IChtZSwgImF0dGVtcHQgdG8gZGVsZXRlIGRldmljZSB3aXRoIHNpYmxpbmdzIik7CisgICAgfQorCisgIC8qIGJsb3cgYXdheSBhbGwgbWVtb3J5IGJlbG9uZ2luZyB0byB0aGUgZGV2aWNlICovCisgIGRlbGV0ZV9od19hbGxvY19kYXRhIChtZSk7CisKKyAgLyogZmluYWxseSAqLworICB6ZnJlZSAobWUtPmJhc2Vfb2ZfaHcpOworICB6ZnJlZSAobWUpOworfQorCisKKy8qIEdvIHRocm91Z2ggdGhlIGRldmljZXMgdmFyaW91cyByZWcgcHJvcGVydGllcyBmb3IgdGhvc2UgdGhhdAorICAgc3BlY2lmeSBhdHRhY2ggYWRkcmVzc2VzICovCisKKwordm9pZAorZG9faHdfYXR0YWNoX3JlZ3MgKHN0cnVjdCBodyAqaHcpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyICoocmVnX3Byb3BlcnR5X25hbWVzW10pID0geworICAgICJhdHRhY2gtYWRkcmVzc2VzIiwKKyAgICAiYXNzaWduZWQtYWRkcmVzc2VzIiwKKyAgICAicmVnIiwKKyAgICAiYWx0ZXJuYXRlLXJlZyIgLAorICAgIE5VTEwKKyAgfTsKKyAgY29uc3QgY2hhciAqKnJlZ19wcm9wZXJ0eV9uYW1lOworICBpbnQgbnJfdmFsaWRfcmVnX3Byb3BlcnRpZXMgPSAwOworICBmb3IgKHJlZ19wcm9wZXJ0eV9uYW1lID0gcmVnX3Byb3BlcnR5X25hbWVzOworICAgICAgICpyZWdfcHJvcGVydHlfbmFtZSAhPSBOVUxMOworICAgICAgIHJlZ19wcm9wZXJ0eV9uYW1lKyspCisgICAgeworICAgICAgaWYgKGh3X2ZpbmRfcHJvcGVydHkgKGh3LCAqcmVnX3Byb3BlcnR5X25hbWUpICE9IE5VTEwpCisJeworCSAgcmVnX3Byb3BlcnR5X3NwZWMgcmVnOworCSAgaW50IHJlZ19lbnRyeTsKKwkgIGZvciAocmVnX2VudHJ5ID0gMDsKKwkgICAgICAgaHdfZmluZF9yZWdfYXJyYXlfcHJvcGVydHkgKGh3LCAqcmVnX3Byb3BlcnR5X25hbWUsIHJlZ19lbnRyeSwKKwkJCQkJICAgJnJlZyk7CisJICAgICAgIHJlZ19lbnRyeSsrKQorCSAgICB7CisJICAgICAgdW5zaWduZWRfd29yZCBhdHRhY2hfYWRkcmVzczsKKwkgICAgICBpbnQgYXR0YWNoX3NwYWNlOworCSAgICAgIHVuc2lnbmVkIGF0dGFjaF9zaXplOworCSAgICAgIGlmICghaHdfdW5pdF9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzIChod19wYXJlbnQgKGh3KSwKKwkJCQkJCSAgICAgICZyZWcuYWRkcmVzcywKKwkJCQkJCSAgICAgICZhdHRhY2hfc3BhY2UsCisJCQkJCQkgICAgICAmYXR0YWNoX2FkZHJlc3MsCisJCQkJCQkgICAgICBodykpCisJCWNvbnRpbnVlOworCSAgICAgIGlmICghaHdfdW5pdF9zaXplX3RvX2F0dGFjaF9zaXplIChod19wYXJlbnQgKGh3KSwKKwkJCQkJCSZyZWcuc2l6ZSwKKwkJCQkJCSZhdHRhY2hfc2l6ZSwgaHcpKQorCQljb250aW51ZTsKKwkgICAgICBod19hdHRhY2hfYWRkcmVzcyAoaHdfcGFyZW50IChodyksCisJCQkJIDAsCisJCQkJIGF0dGFjaF9zcGFjZSwgYXR0YWNoX2FkZHJlc3MsIGF0dGFjaF9zaXplLAorCQkJCSBodyk7CisJICAgICAgbnJfdmFsaWRfcmVnX3Byb3BlcnRpZXMrKzsKKwkgICAgfQorCSAgLyogaWYgZmlyc3Qgb3B0aW9uIG1hdGNoZXMgZG9uJ3QgdHJ5IGZvciBhbnkgb3RoZXJzICovCisJICBpZiAocmVnX3Byb3BlcnR5X25hbWUgPT0gcmVnX3Byb3BlcnR5X25hbWVzKQorCSAgICBicmVhazsKKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9ody1iYXNlLmggYi9zaW0vY29tbW9uL2h3LWJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ1MmQxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9ody1iYXNlLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgSFdfQkFTRQorI2RlZmluZSBIV19CQVNFCisKKy8qIENyZWF0ZSBhIHByaW1hdGl2ZSBkZXZpY2UgKi8KKworc3RydWN0IGh3ICpod19jcmVhdGUKKyhzdHJ1Y3Qgc2ltX3N0YXRlICpzZCwKKyBzdHJ1Y3QgaHcgKnBhcmVudCwKKyBjb25zdCBjaGFyICpmYW1pbHksCisgY29uc3QgY2hhciAqbmFtZSwKKyBjb25zdCBjaGFyICp1bml0LAorIGNvbnN0IGNoYXIgKmFyZ3MpOworCisKKy8qIENvbXBsZXRlIHRoZSBjcmVhdGlvbiBvZiB0aGF0IGRldmljZSAoZmluaXNoIG92ZXJyaWRlcyBtZXRob2RzCisgICB1c2luZyB0aGUgc2V0X2h3Xyogb3BlcmF0aW9ucyBiZWxvdykgKi8KKwordm9pZCBod19maW5pc2gKKyhzdHJ1Y3QgaHcgKm1lKTsKKworaW50IGh3X2ZpbmlzaGVkX3AKKyhzdHJ1Y3QgaHcgKm1lKTsKKworCisvKiBEZWxldGUgdGhlIGVudGlyZSBkZXZpY2UgKi8KKwordm9pZCBod19kZWxldGUKKyhzdHJ1Y3QgaHcgKm1lKTsKKworCisvKiBPdmVycmlkZSBkZXZpY2UgbWV0aG9kcyAqLworCit0eXBlZGVmIHZvaWQgKGh3X2RlbGV0ZV9jYWxsYmFjaykKKyAgICAgKHN0cnVjdCBodyAqbWUpOworCisjZGVmaW5lIHNldF9od19kZWxldGUoaHcsIG1ldGhvZCkgXAorKChodyktPmJhc2Vfb2ZfaHctPnRvX2RlbGV0ZSA9IChtZXRob2QpKQorCisKKy8qIEFMTE9DICovCisKK2V4dGVybiB2b2lkIGNyZWF0ZV9od19hbGxvY19kYXRhCisoc3RydWN0IGh3ICpodyk7CitleHRlcm4gdm9pZCBkZWxldGVfaHdfYWxsb2NfZGF0YQorKHN0cnVjdCBodyAqaHcpOworCisKKy8qIFBPUlRTICovCisKK2V4dGVybiB2b2lkIGNyZWF0ZV9od19wb3J0X2RhdGEKKyhzdHJ1Y3QgaHcgKmh3KTsKK2V4dGVybiB2b2lkIGRlbGV0ZV9od19wb3J0X2RhdGEKKyhzdHJ1Y3QgaHcgKmh3KTsKKworCisvKiBQUk9QRVJUSUVTICovCisKK2V4dGVybiB2b2lkIGNyZWF0ZV9od19wcm9wZXJ0eV9kYXRhCisoc3RydWN0IGh3ICpodyk7CitleHRlcm4gdm9pZCBkZWxldGVfaHdfcHJvcGVydHlfZGF0YQorKHN0cnVjdCBodyAqaHcpOworCisKKy8qIEVWRU5UUyAqLworCitleHRlcm4gdm9pZCBjcmVhdGVfaHdfZXZlbnRfZGF0YQorKHN0cnVjdCBodyAqaHcpOworZXh0ZXJuIHZvaWQgZGVsZXRlX2h3X2V2ZW50X2RhdGEKKyhzdHJ1Y3QgaHcgKmh3KTsKKworCisvKiBIQU5ETEVTICovCisKK2V4dGVybiB2b2lkIGNyZWF0ZV9od19oYW5kbGVfZGF0YQorKHN0cnVjdCBodyAqaHcpOworZXh0ZXJuIHZvaWQgZGVsZXRlX2h3X2hhbmRsZV9kYXRhCisoc3RydWN0IGh3ICpodyk7CisKKworLyogSU5TVEFOQ0VTICovCisKK2V4dGVybiB2b2lkIGNyZWF0ZV9od19pbnN0YW5jZV9kYXRhCisoc3RydWN0IGh3ICpodyk7CitleHRlcm4gdm9pZCBkZWxldGVfaHdfaW5zdGFuY2VfZGF0YQorKHN0cnVjdCBodyAqaHcpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9ody1kZXZpY2UuYyBiL3NpbS9jb21tb24vaHctZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmNTBlMwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vaHctZGV2aWNlLmMKQEAgLTAsMCArMSw2NiBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2luY2x1ZGUgImh3LW1haW4uaCIKKyNpbmNsdWRlICJody1iYXNlLmgiCisKKyNpZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworLyogQWRkcmVzcyBtZXRob2RzICovCisKK2NvbnN0IGh3X3VuaXQgKgoraHdfdW5pdF9hZGRyZXNzIChzdHJ1Y3QgaHcgKm1lKQoreworICByZXR1cm4gJm1lLT51bml0X2FkZHJlc3Nfb2ZfaHc7Cit9CisKKworLyogSU9DVEw6ICovCisKK2ludAoraHdfaW9jdGwgKHN0cnVjdCBodyAqbWUsCisJICBod19pb2N0bF9yZXF1ZXN0IHJlcXVlc3QsCisJICAuLi4pCit7CisgIGludCBzdGF0dXM7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0KGFwLCByZXF1ZXN0KTsKKyAgc3RhdHVzID0gbWUtPnRvX2lvY3RsIChtZSwgcmVxdWVzdCwgYXApOworICB2YV9lbmQoYXApOworICByZXR1cm4gc3RhdHVzOworfQorICAgICAgCitjaGFyICoKK2h3X3N0cmR1cCAoc3RydWN0IGh3ICptZSwgY29uc3QgY2hhciAqc3RyKQoreworICBpZiAoc3RyICE9IE5VTEwpCisgICAgeworICAgICAgY2hhciAqZHVwID0gaHdfemFsbG9jIChtZSwgc3RybGVuIChzdHIpICsgMSk7CisgICAgICBzdHJjcHkgKGR1cCwgc3RyKTsKKyAgICAgIHJldHVybiBkdXA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9ody1kZXZpY2UuaCBiL3NpbS9jb21tb24vaHctZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiZGM1YQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vaHctZGV2aWNlLmgKQEAgLTAsMCArMSw1MzUgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgSFdfREVWSUNFX0gKKyNkZWZpbmUgSFdfREVWSUNFX0gKKworLyogZGVjbGFyZWQgaW4gc2ltLWJhc2ljcy5oLCB0aGlzIG9iamVjdCBpcyB1c2VkIGV2ZXJ5d2hlcmUgKi8KKy8qIHR5cGVkZWYgc3RydWN0IF9kZXZpY2UgZGV2aWNlOyAqLworCisKKy8qIEludHJvZHVjdGlvbjoKKworICAgQXMgZXhwbGFpbmVkIGluIGVhcmxpZXIgc2VjdGlvbnMsIHRoZSBkZXZpY2UsIGRldmljZSBpbnN0YW5jZSwKKyAgIHByb3BlcnR5IGFuZCBwb3J0cyBsaWUgYXQgdGhlIGhlYXJ0IG9mIFBTSU0ncyBkZXZpY2UgbW9kZWwuCisKKyAgIEluIHRoZSBiZWxvdyBhIHN5bm9wc2lzIG9mIHRoZSBkZXZpY2Ugb2JqZWN0IGFuZCB0aGUgb3BlcmF0aW9ucyBpdAorICAgc3VwcG9ydHMgYXJlIGdpdmVuLgorICAgKi8KKworCisvKiBDcmVhdGlvbjoKKworICAgVGhlIGRldmljZXMgYXJlIGNyZWF0ZWQgdXNpbmcgYSBzZXF1ZW5jZSBvZiBzdGVwcy4gIEluIHBhcnRpY3VsYXI6CisKKwlvCUEgdHJlZSBmcmFtZXdvcmsgaXMgY3JlYXRlZC4KKworCQlBdCB0aGlzIHBvaW50LCBwcm9wZXJ0aWVzIGNhbiBiZSBtb2RpZmllZCBhbmQgZXh0cmEKKwkJZGV2aWNlcyBpbnNlcnRlZCAob3IgcmVtb3ZlZD8pLgorCisjaWYgTEFURVIKKworCQlBbnkgcHJvcGVydGllcyB0aGF0IGhhdmUgYSBydW4tdGltZSB2YWx1ZSAoZWcgaWhhbmRsZQorCQlvciBkZXZpY2UgaW5zdGFuY2UgcG9pbnRlciBwcm9wZXJ0aWVzKSBhcmUgZW50ZXJlZAorCQlpbnRvIHRoZSBkZXZpY2UgdHJlZSB1c2luZyBhIG5hbWVkIHJlZmVyZW5jZSB0byB0aGUKKwkJY29ycmVzcG9uZGluZyBydW50aW1lIG9iamVjdCB0aGF0IGlzIHRvIGJlIGNyZWF0ZWQuCisKKyNlbmRpZgorCisJbwlSZWFsIGRldmljZXMgYXJlIGNyZWF0ZWQgZm9yIGFsbCB0aGUgZHVtbXkgZGV2aWNlcy4KKworCQlBIGRldmljZSBjYW4gYXNzdW1lIHRoYXQgYWxsIG9mIGl0cyBwYXJlbnRzIGhhdmUgYmVlbgorCQlpbml0aWFsaXplZC4KKworCQlBIGRldmljZSBjYW4gYXNzdW1lIHRoYXQgYWxsIG5vbiBydW4tdGltZSBwcm9wZXJ0aWVzCisJCWhhdmUgYmVlbiBpbml0aWFsaXplZC4KKworCQlBcyBwYXJ0IG9mIGJlaW5nIGNyZWF0ZWQsIHRoZSBkZXZpY2Ugbm9ybWFsbHkgYXR0YWNoZXMKKwkJaXRzZWxmIHRvIGl0cyBwYXJlbnQgYnVzLgorCisjaWYgTEFURVIKKworCQlEZXZpY2UgaW5zdGFuY2UgZGF0YSBpcyBpbml0aWFsaXplZC4KKworI2VuZGlmCisKKyNpZiBMQVRFUgorCisJbwlBbnkgcnVuLXRpbWUgcHJvcGVydGllcyBhcmUgY3JlYXRlZC4KKworI2VuZGlmCisKKyNpZiBNVUNIX01VQ0hfTEFURVIKKworCW8JU29tZSBkZXZpY2VzLCBhcyBwYXJ0IG9mIHRoZWlyIGluaXRpYWxpemF0aW9uCisJCW1pZ2h0IHdhbnQgdG8gcmVmZXIgdG8gaWhhbmRsZSBwcm9wZXJ0aWVzCisJCWluIHRoZSBkZXZpY2UgdHJlZS4KKworI2VuZGlmCisKKyAgIE5PVEVTOgorCisJbwlJdCBpcyBpbXBvcnRhbnQgdG8gc2VwYXJhdGUgdGhlIGNyZWF0aW9uCisJCW9mIGFuIGFjdHVhbCBkZXZpY2UgZnJvbSB0aGUgY3JlYXRpb24KKwkJb2YgdGhlIHRyZWUuICBUaGUgYWx0ZXJuYXRpdmUgY3JlYXRpbmcKKwkJdGhlIGRldmljZSBpbiB0d28gc3RhZ2VzOiBBcyBhIHNlcGFyYXRlCisJCWVudGl0eSBhbmQgdGhlbiBhcyBhIHBhcnQgb2YgdGhlIHRyZWUuCisKKyNpZiBMQVRFUgorCW8JUnVuLXRpbWUgcHJvcGVydGllcyBjYW4gbm90IGJlIGNyZWF0ZWQKKwkJdW50aWwgYWZ0ZXIgdGhlIGRldmljZXMgaW4gdGhlIHRyZWUKKwkJaGF2ZSBiZWVuIGNyZWF0ZWQuICBIZW5jZSBhbiBleHRyYSBwYXNzCisJCWZvciBoYW5kbGluZyB0aGVtLgorI2VuZGlmCisKKyAgICovCisKKy8qIFJlbGF0aW9uc2hpcHM6CisKKyAgIEEgZGV2aWNlIGlzIGFibGUgdG8gZGV0ZXJtaW5lIGl0cyByZWxhdGlvbnNoaXAgdG8gb3RoZXIgZGV2aWNlcworICAgd2l0aGluIHRoZSB0cmVlLiAgT3BlcmF0aW9ucyBpbmNsdWRlIHF1ZXJ5aW5nIGZvciBhIGRldmljZXMgcGFyZW50LAorICAgc2libGluZywgY2hpbGQsIG5hbWUsIGFuZCBwYXRoIChmcm9tIHRoZSByb290KS4KKworICAgKi8KKworCisjZGVmaW5lIGh3X3BhcmVudChodykgKChodyktPnBhcmVudF9vZl9odyArIDApCisKKyNkZWZpbmUgaHdfc2libGluZyhodykgKChodyktPnNpYmxpbmdfb2ZfaHcgKyAwKQorCisjZGVmaW5lIGh3X2NoaWxkKGh3KSAoKGh3KS0+Y2hpbGRfb2ZfaHcgKyAwKQorCisKKworLyogSGVycml0YWdlOgorCisgKi8KKworI2RlZmluZSBod19mYW1pbHkoaHcpICgoaHcpLT5mYW1pbHlfb2ZfaHcgKyAwKQorCisjZGVmaW5lIGh3X25hbWUoaHcpICgoaHcpLT5uYW1lX29mX2h3ICsgMCkKKworI2RlZmluZSBod19hcmdzKGh3KSAoKGh3KS0+YXJnc19vZl9odyArIDApCisKKyNkZWZpbmUgaHdfcGF0aChodykgKChodyktPnBhdGhfb2ZfaHcgKyAwKQorCisKKworLyogU2hvcnQgY3V0IHRvIHRoZSByb290IG5vZGUgb2YgdGhlIHRyZWUgKi8KKworI2RlZmluZSBod19yb290KGh3KSAoKGh3KS0+cm9vdF9vZl9odyArIDApCisKKy8qIFNob3J0IGN1dCBiYWNrIHRvIHRoZSBzaW11bGF0b3Igb2JqZWN0ICovCisKKyNkZWZpbmUgaHdfc3lzdGVtKGh3KSAoKGh3KS0+c3lzdGVtX29mX2h3KQorCisvKiBGb3IgcmVxdWVzdHMgaW5pdGlhdGVkIGJ5IGEgQ1BVIHRoZSBjcHUgdGhhdCBpbml0aWF0ZWQgdGhlIHJlcXVlc3QgKi8KKworc3RydWN0IF9zaW1fY3B1ICpod19zeXN0ZW1fY3B1IChzdHJ1Y3QgaHcgKmh3KTsKKworCisvKiBEZXZpY2UgcHJpdmF0ZSBkYXRhICovCisKKyNkZWZpbmUgaHdfZGF0YShodykgKChodyktPmRhdGFfb2ZfaHcpCisKKyNkZWZpbmUgc2V0X2h3X2RhdGEoaHcsIHZhbHVlKSBcCisoKGh3KS0+ZGF0YV9vZl9odyA9ICh2YWx1ZSkpCisKKworDAorLyogUGVyZm9ybSBhIHNvZnQgcmVzZXQgb2YgdGhlIGRldmljZSAqLworCit0eXBlZGVmIHVuc2lnbmVkIChod19yZXNldF9tZXRob2QpCisgICAgIChzdHJ1Y3QgaHcgKm1lKTsKKworI2RlZmluZSBod19yZXNldChodykgKChodyktPnRvX3Jlc2V0IChodykpCisKKyNkZWZpbmUgc2V0X2h3X3Jlc2V0KGh3LCBtZXRob2QpIFwKKygoaHcpLT50b19yZXNldCA9IG1ldGhvZCkKKworDAorLyogSGFyZHdhcmUgb3BlcmF0aW9uczoKKworICAgQ29ubmVjdGluZyBhIHBhcmVudCB0byBpdHMgY2hpbGRyZW4gaXMgYSBjb21tb24gYnVzLiBUaGUgcGFyZW50CisgICBub2RlIGlzIGRlc2NyaWJlZCBhcyB0aGUgYnVzIG93bmVyIGFuZCBpcyByZXNwb25pc2JsZSBmb3IKKyAgIGNvLW9yZGluYXRpbmcgYnVzIG9wZXJhdGlvbnMuIE9uIHRoZSBidXMsIGEgU1BBQ0U6QUREUiBwYWlyIGlzIHVzZWQKKyAgIHRvIHNwZWNpZnkgYW4gYWRkcmVzcy4gIEEgZGV2aWNlIHRoYXQgaXMgYm90aCBhIGJ1cyBvd25lciAocGFyZW50KQorICAgYW5kIGJ1cyBjbGllbnQgKGNoaWxkKSBhcmUgcmVmZXJlZCB0byBhcyBhIGJyaWRnaW5nIGRldmljZS4KKworICAgQSBjaGlsZCBwZXJmb3JtaW5nIGEgZGF0YSAoRE1BKSB0cmFuc2ZlciB3aWxsIHBhc3MgaXRzIHJlcXVlc3QgdG8KKyAgIHRoZSBidXMgb3duZXIgKHRoZSBkZXZpY2VzIHBhcmVudCkuICBUaGUgYnVzIG93bmVyIHdpbGwgdGhlbiBlaXRoZXIKKyAgIHJlZmxlY3QgdGhlIHJlcXVlc3QgdG8gb25lIG9mIHRoZSBvdGhlciBkZXZpY2VzIGF0dGFjaGVkIHRvIHRoZSBidXMKKyAgIChhIGNoaWxkIG9mIHRoZSBidXMgb3duZXIpIG9yIGJyaWRnZSB0aGUgcmVxdWVzdCB1cCB0aGUgdHJlZSB0byB0aGUKKyAgIG5leHQgYnVzLiAqLworCisKKy8qIENoaWxkcmVuIGF0dGFjaGVkIHRvIGEgYnVzIGNhbiByZWdpc3RlciAoYXR0YWNoKSB0aGVtc2VsdmVzIHRvCisgICBzcGVjaWZpYyBhZGRyZXNzZXMgb24gdGhlaXIgYXR0YWNoZWQgYnVzLgorCisgICAoQSBkZXZpY2UgbWF5IGFsc28gYmUgaW1wbGljaXRseSBhdHRhY2hlZCB0byBjZXJ0YWluIGJ1cworICAgYWRkcmVzc2VzKS4KKworICAgVGhlIFNQQUNFOkFERFIgcGFpciBzcGVjaWZ5IGFuIGFkZHJlc3Mgb24gdGhlIGNvbW1vbiBidXMgdGhhdAorICAgY29ubmVjdHMgdGhlIHBhcmVudCBhbmQgY2hpbGQgZGV2aWNlcy4gKi8KKwordHlwZWRlZiB2b2lkIChod19hdHRhY2hfYWRkcmVzc19tZXRob2QpCisgICAgIChzdHJ1Y3QgaHcgKm1lLAorICAgICAgaW50IGxldmVsLAorICAgICAgaW50IHNwYWNlLAorICAgICAgYWRkcmVzc193b3JkIGFkZHIsCisgICAgICBhZGRyZXNzX3dvcmQgbnJfYnl0ZXMsCisgICAgICBzdHJ1Y3QgaHcgKmNsaWVudCk7IC8qY2FsbGJhY2svZGVmYXVsdCovCisKKyNkZWZpbmUgaHdfYXR0YWNoX2FkZHJlc3MobWUsIGxldmVsLCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMsIGNsaWVudCkgXAorKChtZSktPnRvX2F0dGFjaF9hZGRyZXNzIChtZSwgbGV2ZWwsIHNwYWNlLCBhZGRyLCBucl9ieXRlcywgY2xpZW50KSkKKworI2RlZmluZSBzZXRfaHdfYXR0YWNoX2FkZHJlc3MoaHcsIG1ldGhvZCkgXAorKChodyktPnRvX2F0dGFjaF9hZGRyZXNzID0gKG1ldGhvZCkpCisKK3R5cGVkZWYgdm9pZCAoaHdfZGV0YWNoX2FkZHJlc3NfbWV0aG9kKQorICAgICAoc3RydWN0IGh3ICptZSwKKyAgICAgIGludCBsZXZlbCwKKyAgICAgIGludCBzcGFjZSwKKyAgICAgIGFkZHJlc3Nfd29yZCBhZGRyLAorICAgICAgYWRkcmVzc193b3JkIG5yX2J5dGVzLAorICAgICAgc3RydWN0IGh3ICpjbGllbnQpOyAvKmNhbGxiYWNrL2RlZmF1bHQqLworCisjZGVmaW5lIGh3X2RldGFjaF9hZGRyZXNzKG1lLCBsZXZlbCwgc3BhY2UsIGFkZHIsIG5yX2J5dGVzLCBjbGllbnQpIFwKKygobWUpLT50b19kZXRhY2hfYWRkcmVzcyAobWUsIGxldmVsLCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMsIGNsaWVudCkpCisKKyNkZWZpbmUgc2V0X2h3X2RldGFjaF9hZGRyZXNzKGh3LCBtZXRob2QpIFwKKygoaHcpLT50b19kZXRhY2hfYWRkcmVzcyA9IChtZXRob2QpKQorCisKKy8qIEFuIElPIG9wZXJhdGlvbiBmcm9tIGEgcGFyZW50IHRvIGEgY2hpbGQgdmlhIHRoZSBjb25lY3RpbmcgYnVzLgorCisgICBUaGUgU1BBQ0U6QUREUiBwYWlyIHNwZWNpZnkgYW4gYWRkcmVzcyBvbiB0aGUgYnVzIHNoYXJlZCBiZXR3ZWVuCisgICB0aGUgcGFyZW50IGFuZCBjaGlsZCBkZXZpY2VzLiAqLworCit0eXBlZGVmIHVuc2lnbmVkIChod19pb19yZWFkX2J1ZmZlcl9tZXRob2QpCisgICAgIChzdHJ1Y3QgaHcgKm1lLAorICAgICAgdm9pZCAqZGVzdCwKKyAgICAgIGludCBzcGFjZSwKKyAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKKyAgICAgIHVuc2lnbmVkIG5yX2J5dGVzKTsKKworI2RlZmluZSBod19pb19yZWFkX2J1ZmZlcihodywgZGVzdCwgc3BhY2UsIGFkZHIsIG5yX2J5dGVzKSBcCisoKGh3KS0+dG9faW9fcmVhZF9idWZmZXIgKGh3LCBkZXN0LCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMpKQorCisjZGVmaW5lIHNldF9od19pb19yZWFkX2J1ZmZlcihodywgbWV0aG9kKSBcCisoKGh3KS0+dG9faW9fcmVhZF9idWZmZXIgPSAobWV0aG9kKSkKKwordHlwZWRlZiB1bnNpZ25lZCAoaHdfaW9fd3JpdGVfYnVmZmVyX21ldGhvZCkKKyAgICAgKHN0cnVjdCBodyAqbWUsCisgICAgICBjb25zdCB2b2lkICpzb3VyY2UsCisgICAgICBpbnQgc3BhY2UsCisgICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCisgICAgICB1bnNpZ25lZCBucl9ieXRlcyk7CisKKyNkZWZpbmUgaHdfaW9fd3JpdGVfYnVmZmVyKGh3LCBzcmMsIHNwYWNlLCBhZGRyLCBucl9ieXRlcykgXAorKChodyktPnRvX2lvX3dyaXRlX2J1ZmZlciAoaHcsIHNyYywgc3BhY2UsIGFkZHIsIG5yX2J5dGVzKSkKKworI2RlZmluZSBzZXRfaHdfaW9fd3JpdGVfYnVmZmVyKGh3LCBtZXRob2QpIFwKKygoaHcpLT50b19pb193cml0ZV9idWZmZXIgPSAobWV0aG9kKSkKKworCisvKiBDb252ZXJzbHksIHRoZSBkZXZpY2UgcGNpMTAwMCwxQDEgbWF5IG5lZWQgdG8gcGVyZm9ybSBhIGRtYSB0cmFuc2ZlcgorICAgaW50byB0aGUgY3B1L21lbW9yeSBjb3JlLiAgSnVzdCBhcyBJL08gbW92ZXMgdG93YXJkcyB0aGUgbGVhdmVzLAorICAgZG1hIHRyYW5zZmVycyBtb3ZlIHRvd2FyZHMgdGhlIGNvcmUgdmlhIHRoZSBpbml0aWF0aW5nIGRldmljZXMKKyAgIHBhcmVudCBub2Rlcy4gIFRoZSByb290IGRldmljZSAoc3BlY2lhbCkgY29udmVydHMgdGhlIERNQSB0cmFuc2ZlcgorICAgaW50byByZWFkcy93cml0ZXMgdG8gbWVtb3J5LgorCisgICBUaGUgU1BBQ0U6QUREUiBwYWlyIHNwZWNpZnkgYW4gYWRkcmVzcyBvbiB0aGUgY29tbW9uIGJ1cyBjb25uZWN0aW5nCisgICB0aGUgcGFyZW50IGFuZCBjaGlsZCBkZXZpY2VzLiAqLworCit0eXBlZGVmIHVuc2lnbmVkIChod19kbWFfcmVhZF9idWZmZXJfbWV0aG9kKQorICAgICAoc3RydWN0IGh3ICpidXMsCisgICAgICB2b2lkICpkZXN0LAorICAgICAgaW50IHNwYWNlLAorICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAorICAgICAgdW5zaWduZWQgbnJfYnl0ZXMpOworCisjZGVmaW5lIGh3X2RtYV9yZWFkX2J1ZmZlcihidXMsIGRlc3QsIHNwYWNlLCBhZGRyLCBucl9ieXRlcykgXAorKChidXMpLT50b19kbWFfcmVhZF9idWZmZXIgKGJ1cywgZGVzdCwgc3BhY2UsIGFkZHIsIG5yX2J5dGVzKSkKKworI2RlZmluZSBzZXRfaHdfZG1hX3JlYWRfYnVmZmVyKG1lLCBtZXRob2QpIFwKKygobWUpLT50b19kbWFfcmVhZF9idWZmZXIgPSAobWV0aG9kKSkKKwordHlwZWRlZiB1bnNpZ25lZCAoaHdfZG1hX3dyaXRlX2J1ZmZlcl9tZXRob2QpCisgICAgIChzdHJ1Y3QgaHcgKmJ1cywKKyAgICAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKKyAgICAgIGludCBzcGFjZSwKKyAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKKyAgICAgIHVuc2lnbmVkIG5yX2J5dGVzLAorICAgICAgaW50IHZpb2xhdGVfcmVhZF9vbmx5X3NlY3Rpb24pOworCisjZGVmaW5lIGh3X2RtYV93cml0ZV9idWZmZXIoYnVzLCBzcmMsIHNwYWNlLCBhZGRyLCBucl9ieXRlcywgdmlvbGF0ZV9ybykgXAorKChidXMpLT50b19kbWFfd3JpdGVfYnVmZmVyIChidXMsIHNyYywgc3BhY2UsIGFkZHIsIG5yX2J5dGVzLCB2aW9sYXRlX3JvKSkKKworI2RlZmluZSBzZXRfaHdfZG1hX3dyaXRlX2J1ZmZlcihtZSwgbWV0aG9kKSBcCisoKG1lKS0+dG9fZG1hX3dyaXRlX2J1ZmZlciA9IChtZXRob2QpKQorDAorLyogQWRkcmVzcy9zaXplIHNwZWNzIGZvciBkZXZpY2VzIGFyZSBlbmNvZGVkIGZvbGxvd2luZyBhIGNvbnZlbnRpb24KKyAgIHNpbWlsYXIgdG8gdGhhdCB1c2VkIGJ5IE9wZW5GaXJtd2FyZS4gIEluIHBhcnRpY3VsYXIsIGFuCisgICBhZGRyZXNzL3NpemUgaXMgcGFja2VkIGludG8gYSBzZXF1ZW5jZSBvZiB1cCB0byBmb3VyIGNlbGwgd29yZHMuCisgICBUaGUgbnVtYmVyIG9mIHdvcmRzIGRldGVybWluZWQgYnkgdGhlIG51bWJlciBvZiB7YWRkcmVzcyxzaXplfQorICAgY2VsbHMgYXR0cmlidXRlcyBvZiB0aGUgZGV2aWNlLiAqLworCit0eXBlZGVmIHN0cnVjdCBfaHdfdW5pdCB7CisgIGludCBucl9jZWxsczsKKyAgdW5zaWduZWRfY2VsbCBjZWxsc1s0XTsgLyogdW51c2VkIGNlbGxzIGFyZSB6ZXJvICovCit9IGh3X3VuaXQ7CisKKworLyogRm9yIHRoZSBnaXZlbiBidXMsIHRoZSBudW1iZXIgb2YgYWRkcmVzcyBhbmQgc2l6ZSBjZWxscyB1c2VkIGluIGEKKyAgIGh3X3VuaXQuICovCisKKyNkZWZpbmUgaHdfdW5pdF9ucl9hZGRyZXNzX2NlbGxzKGJ1cykgKChidXMpLT5ucl9hZGRyZXNzX2NlbGxzX29mX2h3X3VuaXQgKyAwKQorCisjZGVmaW5lIGh3X3VuaXRfbnJfc2l6ZV9jZWxscyhidXMpICgoYnVzKS0+bnJfc2l6ZV9jZWxsc19vZl9od191bml0ICsgMCkKKworCisvKiBGb3IgdGhlIGdpdmVuIGRldmljZSwgaXRzIGlkZW50aWZ5aW5nIGh3X3VuaXQgYWRkcmVzcy4KKworICAgRWFjaCBkZXZpY2UgaGFzIGFuIGlkZW50aWZ5aW5nIGh3X3VuaXQgYWRkcmVzcy4gIFRoYXQgYWRkcmVzcyBpcworICAgdXNlZCB3aGVuIGlkZW50aWZ5aW5nIG9uZSBvZiBhIG51bWJlciBvZiBpZGVudGljYWwgZGV2aWNlcyBvbiBhCisgICBjb21tb24gY29udHJvbGxlciBidXMuIGV4IGZkMCZmZDEuICovCisKK2NvbnN0IGh3X3VuaXQgKmh3X3VuaXRfYWRkcmVzcworKHN0cnVjdCBodyAqbWUpOworCisKKy8qIENvbnZlcnQgYmV0d2VlbiBhIHRleHR1YWwgYW5kIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhCisgICBod191bml0IGFkZHJlc3Mvc2l6ZS4KKworICAgTk9URTogQSBkZXZpY2UgYXNrcyBpdHMgcGFyZW50IHRvIHRyYW5zbGF0ZSBiZXR3ZWVuIGEgaHdfdW5pdCBhbmQKKyAgIHRleHR1YWwgcmVwcmVzZW50YXRpb24uICBUaGlzIGlzIGJlY2F1c2UgdGhlIHRleHR1YWwgYWRkcmVzcyBvZiBhCisgICBkZXZpY2UgaXMgc3BlY2lmaWVkIHVzaW5nIHRoZSBwYXJlbnQgYnVzc2VzIG5vdGF0aW9uLiAqLworCit0eXBlZGVmIGludCAoaHdfdW5pdF9kZWNvZGVfbWV0aG9kKQorICAgICAoc3RydWN0IGh3ICpidXMsCisgICAgICBjb25zdCBjaGFyICplbmNvZGVkLAorICAgICAgaHdfdW5pdCAqdW5pdCk7CisKKyNkZWZpbmUgaHdfdW5pdF9kZWNvZGUoYnVzLCBlbmNvZGVkLCB1bml0KSBcCisoKGJ1cyktPnRvX3VuaXRfZGVjb2RlIChidXMsIGVuY29kZWQsIHVuaXQpKQorCisjZGVmaW5lIHNldF9od191bml0X2RlY29kZShodywgbWV0aG9kKSBcCisoKGh3KS0+dG9fdW5pdF9kZWNvZGUgPSAobWV0aG9kKSkKKwordHlwZWRlZiBpbnQgKGh3X3VuaXRfZW5jb2RlX21ldGhvZCkKKyAgICAgKHN0cnVjdCBodyAqYnVzLAorICAgICAgY29uc3QgaHdfdW5pdCAqdW5pdCwKKyAgICAgIGNoYXIgKmVuY29kZWQsCisgICAgICBpbnQgc2l6ZW9mX2J1Zik7CisgICAgIAorI2RlZmluZSBod191bml0X2VuY29kZShidXMsIHVuaXQsIGVuY29kZWQsIHNpemVvZl9lbmNvZGVkKSBcCisoKGJ1cyktPnRvX3VuaXRfZW5jb2RlIChidXMsIHVuaXQsIGVuY29kZWQsIHNpemVvZl9lbmNvZGVkKSkKKworI2RlZmluZSBzZXRfaHdfdW5pdF9lbmNvZGUoaHcsIG1ldGhvZCkgXAorKChodyktPnRvX3VuaXRfZW5jb2RlID0gKG1ldGhvZCkpCisKKworLyogQXMgdGhlIGJ1cyB0aGF0IHRoZSBkZXZpY2UgaXMgYXR0YWNoZWQgdG9vLCB0byB0cmFuc2xhdGUgYSBkZXZpY2VzCisgICBod191bml0IGFkZHJlc3Mvc2l6ZSBpbnRvIGEgZm9ybSBzdWl0YWJsZSBmb3IgYW4gYXR0YWNoIGFkZHJlc3MKKyAgIGNhbGwuCisKKyAgIFJldHVybiBhIHplcm8gcmVzdWx0IGlmIHRoZSBhZGRyZXNzIHNob3VsZCBiZSBpZ25vcmVkIHdoZW4gbG9va2luZworICAgZm9yIGF0dGFjaCBhZGRyZXNzZXMuICovCisKK3R5cGVkZWYgaW50IChod191bml0X2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3NfbWV0aG9kKQorICAgICAoc3RydWN0IGh3ICpidXMsCisgICAgICBjb25zdCBod191bml0ICp1bml0X2FkZHIsCisgICAgICBpbnQgKmF0dGFjaF9zcGFjZSwKKyAgICAgIHVuc2lnbmVkX3dvcmQgKmF0dGFjaF9hZGRyLAorICAgICAgc3RydWN0IGh3ICpjbGllbnQpOworCisjZGVmaW5lIGh3X3VuaXRfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyhidXMsIHVuaXRfYWRkciwgYXR0YWNoX3NwYWNlLCBhdHRhY2hfYWRkciwgY2xpZW50KSBcCisoKGJ1cyktPnRvX3VuaXRfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyAoYnVzLCB1bml0X2FkZHIsIGF0dGFjaF9zcGFjZSwgYXR0YWNoX2FkZHIsIGNsaWVudCkpCisKKyNkZWZpbmUgc2V0X2h3X3VuaXRfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyhodywgbWV0aG9kKSBcCisoKGh3KS0+dG9fdW5pdF9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzID0gKG1ldGhvZCkpCisKK3R5cGVkZWYgaW50IChod191bml0X3NpemVfdG9fYXR0YWNoX3NpemVfbWV0aG9kKQorICAgICAoc3RydWN0IGh3ICpidXMsCisgICAgICBjb25zdCBod191bml0ICp1bml0X3NpemUsCisgICAgICB1bnNpZ25lZCAqYXR0YWNoX3NpemUsCisgICAgICBzdHJ1Y3QgaHcgKmNsaWVudCk7CisKKyNkZWZpbmUgaHdfdW5pdF9zaXplX3RvX2F0dGFjaF9zaXplKGJ1cywgdW5pdF9zaXplLCBhdHRhY2hfc2l6ZSwgY2xpZW50KSBcCisoKGJ1cyktPnRvX3VuaXRfc2l6ZV90b19hdHRhY2hfc2l6ZSAoYnVzLCB1bml0X3NpemUsIGF0dGFjaF9zaXplLCBjbGllbnQpKQorCisjZGVmaW5lIHNldF9od191bml0X3NpemVfdG9fYXR0YWNoX3NpemUoaHcsIG1ldGhvZCkgXAorKChodyktPnRvX3VuaXRfc2l6ZV90b19hdHRhY2hfc2l6ZSA9IChtZXRob2QpKQorCisMCitleHRlcm4gY2hhciAqaHdfc3RyZHVwIChzdHJ1Y3QgaHcgKm1lLCBjb25zdCBjaGFyICpzdHIpOworCisMCisvKiBVdGlsaXRpZXM6CisKKyAgICovCisKKy8qIElPQ1RMOjoKKworICAgT2Z0ZW4gZGV2aWNlcyByZXF1aXJlIGBvdXQgb2YgYmFuZCcgb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQuCisgICBGb3IgaW5zdGFuY2UgYSBwYWwgZGV2aWNlIG1heSBuZWVkIHRvIG5vdGlmeSBhIFBDSSBicmlkZ2UgZGV2aWNlCisgICB0aGF0IGFuIGludGVycnVwdCBhY2sgY3ljbGUgbmVlZHMgdG8gYmUgcGVyZm9ybWVkIG9uIHRoZSBQQ0kgYnVzLgorICAgV2l0aGluIFBTSU0gc3VjaCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgYnkgdXNpbmcgdGhlIGdlbmVyaWMKKyAgIGlvY3RsIGNhbGwgPDxod19pb2N0bCgpPj4uCisKKyAgICovCisKK3R5cGVkZWYgZW51bSB7CisgIGh3X2lvY3RsX2JyZWFrLCAvKiB1bnNpZ25lZF93b3JkIHJlcXVlc3RlZF9icmVhayAqLworICBod19pb2N0bF9zZXRfdHJhY2UsIC8qIHZvaWQgKi8KKyAgaHdfaW9jdGxfY3JlYXRlX3N0YWNrLCAvKiB1bnNpZ25lZF93b3JkICpzcCwgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwICovCisgIGh3X2lvY3RsX2NoYW5nZV9tZWRpYSwgLyogY29uc3QgY2hhciAqbmV3X2ltYWdlIChwb3NzaWJseSBOVUxMKSAqLworICBucl9od19pb2N0bF9yZXF1ZXN0cywKK30gaHdfaW9jdGxfcmVxdWVzdDsKKwordHlwZWRlZiBpbnQgKGh3X2lvY3RsX21ldGhvZCkKKyAgICAgKHN0cnVjdCBodyAqbWUsCisgICAgICBod19pb2N0bF9yZXF1ZXN0IHJlcXVlc3QsCisgICAgICB2YV9saXN0IGFwKTsKKworaW50IGh3X2lvY3RsCisoc3RydWN0IGh3ICptZSwKKyBod19pb2N0bF9yZXF1ZXN0IHJlcXVlc3QsCisgLi4uKTsKKworCisvKiBFcnJvciByZXBvcnRpbmc6OgorCisgICBTbyB0aGF0IGVycm9ycyBvcmlnaW5hdGluZyBmcm9tIGRldmljZXMgYXBwZWFyIGluIGEgY29uc2lzdGVudAorICAgZm9ybWF0LCB0aGUgPDxod19hYm9ydCgpPj4gZnVuY3Rpb24gY2FuIGJlIHVzZWQuICBGb3JtYXRzIGFuZAorICAgb3V0cHV0cyB0aGUgZXJyb3IgbWVzc2FnZSBiZWZvcmUgYWJvcnRpbmcgdGhlIHNpbXVsYXRpb24KKworICAgRGV2aWNlcyBzaG91bGQgdXNlIHRoaXMgZnVuY3Rpb24gdG8gYWJvcnQgdGhlIHNpbXVsYXRpb24gZXhjZXB0CisgICB3aGVuIHRoZSBhYm9ydCByZWFzb24gbGVhdmVzIHRoZSBzaW11bGF0aW9uIGluIGEgaGF6YXJkb3VzCisgICBjb25kaXRpb24gKGZvciBpbnN0YW5jZSBhIGZhaWxlZCBtYWxsb2MpLgorCisgICAqLworCit2b2lkIGh3X2Fib3J0Cisoc3RydWN0IGh3ICptZSwKKyBjb25zdCBjaGFyICpmbXQsCisgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CisKK3ZvaWQgaHdfdmFib3J0Cisoc3RydWN0IGh3ICptZSwKKyBjb25zdCBjaGFyICpmbXQsCisgdmFfbGlzdCBhcCk7CisKK3ZvaWQgaHdfaGFsdAorKHN0cnVjdCBodyAqbWUsCisgaW50IHJlYXNvbiwKKyBpbnQgc3RhdHVzKTsKKworCisjZGVmaW5lIGh3X3RyYWNlX3AoaHcpICgoaHcpLT50cmFjZV9vZl9od19wICsgMCkKKwordm9pZCBod190cmFjZQorKHN0cnVjdCBodyAqbWUsCisgY29uc3QgY2hhciAqZm10LAorIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworCisjZGVmaW5lIEhXX1RSQUNFKEFSR1MpIFwKK2RvIHsgXAorICBpZiAoaHdfdHJhY2VfcCAobWUpKSBcCisgICAgeyBcCisgICAgICBod190cmFjZSBBUkdTOyBcCisgICAgfSBcCit9IHdoaWxlICgwKQorCisKKy8qIFNvbWUgb2YgdGhlIHJlbGF0ZWQgZnVuY3Rpb25zIHJlcXVpcmUgc3BlY2lmaWMgdHlwZXMgKi8KKworc3RydWN0IGh3X3Byb3BlcnR5X2RhdGE7CitzdHJ1Y3QgaHdfcG9ydF9kYXRhOworc3RydWN0IGh3X2Jhc2VfZGF0YTsKK3N0cnVjdCBod19hbGxvY19kYXRhOworc3RydWN0IGh3X2V2ZW50X2RhdGE7CitzdHJ1Y3QgaHdfaGFuZGxlX2RhdGE7CitzdHJ1Y3QgaHdfaW5zdGFuY2VfZGF0YTsKKworLyogRmluYWxseSB0aGUgaGFyZHdhcmUgZGV2aWNlIC0ga2VlcCB5b3VyIGdydWJieSBsaXR0bGUgbWl0cyBvZmYgb2YKKyAgIHRoZXNlIGludGVybmFscyEgOi0pICovCisKK3N0cnVjdCBodyB7CisKKyAgLyogb3VyIHJlbGF0aXZlcyAqLworICBzdHJ1Y3QgaHcgKnBhcmVudF9vZl9odzsKKyAgc3RydWN0IGh3ICpzaWJsaW5nX29mX2h3OworICBzdHJ1Y3QgaHcgKmNoaWxkX29mX2h3OworCisgIC8qIG91ciBpZGVudGl0eSAqLworICBjb25zdCBjaGFyICpuYW1lX29mX2h3OworICBjb25zdCBjaGFyICpmYW1pbHlfb2ZfaHc7CisgIGNvbnN0IGNoYXIgKmFyZ3Nfb2ZfaHc7CisgIGNvbnN0IGNoYXIgKnBhdGhfb2ZfaHc7CisKKyAgLyogb3VyIGRhdGEgKi8KKyAgdm9pZCAqZGF0YV9vZl9odzsKKworICAvKiBob3QgbGlua3MgKi8KKyAgc3RydWN0IGh3ICpyb290X29mX2h3OworICBzdHJ1Y3Qgc2ltX3N0YXRlICpzeXN0ZW1fb2ZfaHc7CisKKyAgLyogaWRlbnRpZnlpbmcgZGF0YSAqLworICBod191bml0IHVuaXRfYWRkcmVzc19vZl9odzsKKyAgaW50IG5yX2FkZHJlc3NfY2VsbHNfb2ZfaHdfdW5pdDsKKyAgaW50IG5yX3NpemVfY2VsbHNfb2ZfaHdfdW5pdDsKKworICAvKiBTb2Z0IHJlc2V0ICovCisgIGh3X3Jlc2V0X21ldGhvZCAqdG9fcmVzZXQ7CisKKyAgLyogQmFzaWMgY2FsbGJhY2tzICovCisgIGh3X2lvX3JlYWRfYnVmZmVyX21ldGhvZCAqdG9faW9fcmVhZF9idWZmZXI7CisgIGh3X2lvX3dyaXRlX2J1ZmZlcl9tZXRob2QgKnRvX2lvX3dyaXRlX2J1ZmZlcjsKKyAgaHdfZG1hX3JlYWRfYnVmZmVyX21ldGhvZCAqdG9fZG1hX3JlYWRfYnVmZmVyOworICBod19kbWFfd3JpdGVfYnVmZmVyX21ldGhvZCAqdG9fZG1hX3dyaXRlX2J1ZmZlcjsKKyAgaHdfYXR0YWNoX2FkZHJlc3NfbWV0aG9kICp0b19hdHRhY2hfYWRkcmVzczsKKyAgaHdfZGV0YWNoX2FkZHJlc3NfbWV0aG9kICp0b19kZXRhY2hfYWRkcmVzczsKKworICAvKiBNb3JlIGNvbXBsaWNhdGVkIGNhbGxiYWNrcyAqLworICBod19pb2N0bF9tZXRob2QgKnRvX2lvY3RsOworICBpbnQgdHJhY2Vfb2ZfaHdfcDsKKworICAvKiBhZGRyZXNzIGNhbGxiYWNrcyAqLworICBod191bml0X2RlY29kZV9tZXRob2QgKnRvX3VuaXRfZGVjb2RlOworICBod191bml0X2VuY29kZV9tZXRob2QgKnRvX3VuaXRfZW5jb2RlOworICBod191bml0X2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3NfbWV0aG9kICp0b191bml0X2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3M7CisgIGh3X3VuaXRfc2l6ZV90b19hdHRhY2hfc2l6ZV9tZXRob2QgKnRvX3VuaXRfc2l6ZV90b19hdHRhY2hfc2l6ZTsKKworICAvKiByZWxhdGVkIGRhdGEgKi8KKyAgc3RydWN0IGh3X3Byb3BlcnR5X2RhdGEgKnByb3BlcnRpZXNfb2ZfaHc7CisgIHN0cnVjdCBod19wb3J0X2RhdGEgKnBvcnRzX29mX2h3OworICBzdHJ1Y3QgaHdfYmFzZV9kYXRhICpiYXNlX29mX2h3OworICBzdHJ1Y3QgaHdfYWxsb2NfZGF0YSAqYWxsb2Nfb2ZfaHc7CisgIHN0cnVjdCBod19ldmVudF9kYXRhICpldmVudHNfb2ZfaHc7CisgIHN0cnVjdCBod19oYW5kbGVfZGF0YSAqaGFuZGxlc19vZl9odzsKKyAgc3RydWN0IGh3X2luc3RhbmNlX2RhdGEgKmluc3RhbmNlc19vZl9odzsKKworfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vaHctZXZlbnRzLmMgYi9zaW0vY29tbW9uL2h3LWV2ZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYzVhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL2h3LWV2ZW50cy5jCkBAIC0wLDAgKzEsMjYzIEBACisvKiBIYXJkd2FyZSBldmVudCBtYW5hZ2VyLgorICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisjaW5jbHVkZSAiaHctbWFpbi5oIgorI2luY2x1ZGUgImh3LWJhc2UuaCIKKworI2luY2x1ZGUgInNpbS1ldmVudHMuaCIKKworCisvKiBUaGUgaHctZXZlbnRzIG9iamVjdCBpcyBpbXBsZW1lbnRlZCB1c2luZyBzaW0tZXZlbnRzICovCisKK3N0cnVjdCBod19ldmVudCB7CisgIHZvaWQgKmRhdGE7CisgIHN0cnVjdCBodyAqbWU7CisgIGh3X2V2ZW50X2NhbGxiYWNrICpjYWxsYmFjazsKKyAgc2ltX2V2ZW50ICpyZWFsOworICBzdHJ1Y3QgaHdfZXZlbnRfZGF0YSAqZW50cnk7Cit9OworCitzdHJ1Y3QgaHdfZXZlbnRfZGF0YSB7CisgIHN0cnVjdCBod19ldmVudCBldmVudDsKKyAgc3RydWN0IGh3X2V2ZW50X2RhdGEgKm5leHQ7Cit9OworCit2b2lkCitjcmVhdGVfaHdfZXZlbnRfZGF0YSAoc3RydWN0IGh3ICptZSkKK3sKKyAgaWYgKG1lLT5ldmVudHNfb2ZfaHcgIT0gTlVMTCkKKyAgICBod19hYm9ydCAobWUsICJzdHJheSBldmVudHMiKTsKKyAgLyogTk9QICovCit9CisKK3ZvaWQKK2RlbGV0ZV9od19ldmVudF9kYXRhIChzdHJ1Y3QgaHcgKm1lKQoreworICBpZiAobWUtPmV2ZW50c19vZl9odyAhPSBOVUxMKQorICAgIGh3X2Fib3J0IChtZSwgInN0cmF5IGV2ZW50cyIpOworfQorCisKKy8qIFBhc3MgdGhlIEgvVyBldmVudCBvbnRvIHRoZSByZWFsIGNhbGxiYWNrICovCisKK3N0YXRpYyB2b2lkCitib3VuY2VfaHdfZXZlbnQgKFNJTV9ERVNDIHNkLAorCQkgdm9pZCAqZGF0YSkKK3sKKyAgLyogc2F2ZSB0aGUgZGF0YSAqLworICBzdHJ1Y3QgaHdfZXZlbnRfZGF0YSAqZW50cnkgPSAoc3RydWN0IGh3X2V2ZW50X2RhdGEgKikgZGF0YTsKKyAgc3RydWN0IGh3ICptZSA9IGVudHJ5LT5ldmVudC5tZTsKKyAgdm9pZCAqZXZlbnRfZGF0YSA9IGVudHJ5LT5ldmVudC5kYXRhOworICBod19ldmVudF9jYWxsYmFjayAqY2FsbGJhY2sgPSBlbnRyeS0+ZXZlbnQuY2FsbGJhY2s7CisgIHN0cnVjdCBod19ldmVudF9kYXRhICoqcHJldiA9ICZtZS0+ZXZlbnRzX29mX2h3OworICB3aGlsZSAoKCpwcmV2KSAhPSBlbnRyeSkKKyAgICBwcmV2ID0gJigqcHJldiktPm5leHQ7CisgICgqcHJldikgPSBlbnRyeS0+bmV4dDsKKyAgaHdfZnJlZSAobWUsIGVudHJ5KTsKKyAgY2FsbGJhY2sgKG1lLCBldmVudF9kYXRhKTsgLyogbWF5IG5vdCByZXR1cm4gKi8KK30KKworCisKKy8qIE1hcCBvbnRvIHRoZSBldmVudCBmdW5jdGlvbnMgKi8KKworc3RydWN0IGh3X2V2ZW50ICoKK2h3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlIChzdHJ1Y3QgaHcgKm1lLAorCQkJIHNpZ25lZDY0IGRlbHRhX3RpbWUsCisJCQkgaHdfZXZlbnRfY2FsbGJhY2sgKmNhbGxiYWNrLAorCQkJIHZvaWQgKmRhdGEpCit7CisgIHN0cnVjdCBod19ldmVudCAqZXZlbnQ7CisgIHZhX2xpc3QgZHVtbXk7CisgIGV2ZW50ID0gaHdfZXZlbnRfcXVldWVfc2NoZWR1bGVfdnRyYWNlZiAobWUsIGRlbHRhX3RpbWUsIGNhbGxiYWNrLCBkYXRhLAorCQkJCQkgICBOVUxMLCBkdW1teSk7CisgIHJldHVybiBldmVudDsKK30KKworc3RydWN0IGh3X2V2ZW50ICoKK2h3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlX3RyYWNlZiAoc3RydWN0IGh3ICptZSwKKwkJCQlzaWduZWQ2NCBkZWx0YV90aW1lLAorCQkJCWh3X2V2ZW50X2NhbGxiYWNrICpjYWxsYmFjaywKKwkJCQl2b2lkICpkYXRhLAorCQkJCWNvbnN0IGNoYXIgKmZtdCwKKwkJCQkuLi4pCit7CisgIHN0cnVjdCBod19ldmVudCAqZXZlbnQ7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0IChhcCwgZm10KTsKKyAgZXZlbnQgPSBod19ldmVudF9xdWV1ZV9zY2hlZHVsZV92dHJhY2VmIChtZSwgZGVsdGFfdGltZSwgY2FsbGJhY2ssIGRhdGEsIGZtdCwgYXApOworICB2YV9lbmQgKGFwKTsKKyAgcmV0dXJuIGV2ZW50OworfQorCitzdHJ1Y3QgaHdfZXZlbnQgKgoraHdfZXZlbnRfcXVldWVfc2NoZWR1bGVfdnRyYWNlZiAoc3RydWN0IGh3ICptZSwKKwkJCQkgc2lnbmVkNjQgZGVsdGFfdGltZSwKKwkJCQkgaHdfZXZlbnRfY2FsbGJhY2sgKmNhbGxiYWNrLAorCQkJCSB2b2lkICpkYXRhLAorCQkJCSBjb25zdCBjaGFyICpmbXQsCisJCQkJIHZhX2xpc3QgYXApCit7CisgIHN0cnVjdCBod19ldmVudF9kYXRhICplbnRyeSA9IEhXX1pBTExPQyAobWUsIHN0cnVjdCBod19ldmVudF9kYXRhKTsKKyAgZW50cnktPm5leHQgPSBtZS0+ZXZlbnRzX29mX2h3OworICBtZS0+ZXZlbnRzX29mX2h3ID0gZW50cnk7CisgIC8qIGZpbGwgaXQgaW4gKi8KKyAgZW50cnktPmV2ZW50LmVudHJ5ID0gZW50cnk7CisgIGVudHJ5LT5ldmVudC5kYXRhID0gZGF0YTsKKyAgZW50cnktPmV2ZW50LmNhbGxiYWNrID0gY2FsbGJhY2s7CisgIGVudHJ5LT5ldmVudC5tZSA9IG1lOworICBlbnRyeS0+ZXZlbnQucmVhbCA9IHNpbV9ldmVudHNfc2NoZWR1bGVfdnRyYWNlZiAoaHdfc3lzdGVtIChtZSksCisJCQkJCQkgICBkZWx0YV90aW1lLAorCQkJCQkJICAgYm91bmNlX2h3X2V2ZW50LAorCQkJCQkJICAgZW50cnksCisJCQkJCQkgICBmbXQsIGFwKTsKKyAgcmV0dXJuICZlbnRyeS0+ZXZlbnQ7Cit9CisKKwordm9pZAoraHdfZXZlbnRfcXVldWVfZGVzY2hlZHVsZSAoc3RydWN0IGh3ICptZSwKKwkJCSAgIHN0cnVjdCBod19ldmVudCAqZXZlbnRfdG9fcmVtb3ZlKQoreworLyogWkFQIHRoZSBldmVudCBidXQgb25seSBpZiBpdCBpcyBzdGlsbCBpbiB0aGUgZXZlbnQgcXVldWUuICBOb3RlCisgICB0aGF0IGV2ZW50X3RvX3JlbW92ZSBpcyBvbmx5IGRlLXJlZmVyZW5jZWQgYWZ0ZXIgaXRzIHZhbGlkaXR5IGhhcworICAgYmVlbiBjb25maXJtZWQuICAqLworICBzdHJ1Y3QgaHdfZXZlbnRfZGF0YSAqKnByZXY7CisgIGZvciAocHJldiA9ICZtZS0+ZXZlbnRzX29mX2h3OworICAgICAgICgqcHJldikgIT0gTlVMTDsKKyAgICAgICBwcmV2ID0gJigqcHJldiktPm5leHQpCisgICAgeworICAgICAgc3RydWN0IGh3X2V2ZW50X2RhdGEgKmVudHJ5ID0gKCpwcmV2KTsKKyAgICAgIGlmICgmZW50cnktPmV2ZW50ID09IGV2ZW50X3RvX3JlbW92ZSkKKwl7CisJICBzaW1fZXZlbnRzX2Rlc2NoZWR1bGUgKGh3X3N5c3RlbSAobWUpLAorCQkJCSBlbnRyeS0+ZXZlbnQucmVhbCk7CisJICAoKnByZXYpID0gZW50cnktPm5leHQ7CisJICBod19mcmVlIChtZSwgZW50cnkpOworCSAgcmV0dXJuOworCX0KKyAgICB9Cit9CisKKworc2lnbmVkNjQKK2h3X2V2ZW50X3F1ZXVlX3RpbWUgKHN0cnVjdCBodyAqbWUpCit7CisgIHJldHVybiBzaW1fZXZlbnRzX3RpbWUgKGh3X3N5c3RlbSAobWUpKTsKK30KKworCisvKiBPbmx5IHdvcnJ5IGFib3V0IHRoaXMgY29tcGxpbmcgb24gQU5TSSBzeXN0ZW1zLgorICAgQnVpbGQgd2l0aCBgbWFrZSB0ZXN0LWh3LWV2ZW50cycgaW4gc2ltLzxjcHU+IGRpcmVjdG9yeSovCisKKyNpZiBkZWZpbmVkIChNQUlOKQorI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIHZvaWQKK3Rlc3RfaGFuZGxlciAoc3RydWN0IGh3ICptZSwKKwkgICAgICB2b2lkICpkYXRhKQoreworICBpbnQgKm4gPSBkYXRhOworICBpZiAoKm4gIT0gaHdfZXZlbnRfcXVldWVfdGltZSAobWUpKQorICAgIGFib3J0ICgpOworICAqbiA9IC0oKm4pOworfQorCitpbnQKK21haW4gKGludCBhcmdjLAorICAgICAgY2hhciAqKmFyZ3YpCit7CisgIGhvc3RfY2FsbGJhY2sgKmNiID0gWkFMTE9DIChob3N0X2NhbGxiYWNrKTsKKyAgc3RydWN0IHNpbV9zdGF0ZSAqc2QgPSBzaW1fc3RhdGVfYWxsb2MgKDAsIGNiKTsKKyAgc3RydWN0IGh3ICptZSA9IFpBTExPQyAoc3RydWN0IGh3KTsKKyAgc2ltX3ByZV9hcmd2X2luaXQgKHNkLCAidGVzdC1ody1ldmVudHMiKTsKKyAgc2ltX3Bvc3RfYXJndl9pbml0IChzZCk7CisgIG1lLT5zeXN0ZW1fb2ZfaHcgPSBzZDsKKworICBwcmludGYgKCJDcmVhdGUgaHctZXZlbnQtZGF0YVxuIik7CisgIHsKKyAgICBjcmVhdGVfaHdfYWxsb2NfZGF0YSAobWUpOworICAgIGNyZWF0ZV9od19ldmVudF9kYXRhIChtZSk7CisgICAgZGVsZXRlX2h3X2V2ZW50X2RhdGEgKG1lKTsKKyAgICBkZWxldGVfaHdfYWxsb2NfZGF0YSAobWUpOworICB9CisKKyAgcHJpbnRmICgiQ3JlYXRlIGh3LWV2ZW50c1xuIik7CisgIHsKKyAgICBzdHJ1Y3QgaHdfZXZlbnQgKmE7CisgICAgc3RydWN0IGh3X2V2ZW50ICpiOworICAgIHN0cnVjdCBod19ldmVudCAqYzsKKyAgICBzdHJ1Y3QgaHdfZXZlbnQgKmQ7CisgICAgY3JlYXRlX2h3X2FsbG9jX2RhdGEgKG1lKTsKKyAgICBjcmVhdGVfaHdfZXZlbnRfZGF0YSAobWUpOworICAgIGEgPSBod19ldmVudF9xdWV1ZV9zY2hlZHVsZSAobWUsIDAsIE5VTEwsIE5VTEwpOworICAgIGIgPSBod19ldmVudF9xdWV1ZV9zY2hlZHVsZSAobWUsIDEsIE5VTEwsIE5VTEwpOworICAgIGMgPSBod19ldmVudF9xdWV1ZV9zY2hlZHVsZSAobWUsIDIsIE5VTEwsIE5VTEwpOworICAgIGQgPSBod19ldmVudF9xdWV1ZV9zY2hlZHVsZSAobWUsIDEsIE5VTEwsIE5VTEwpOworICAgIGh3X2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUgKG1lLCBjKTsKKyAgICBod19ldmVudF9xdWV1ZV9kZXNjaGVkdWxlIChtZSwgYik7CisgICAgaHdfZXZlbnRfcXVldWVfZGVzY2hlZHVsZSAobWUsIGEpOworICAgIGh3X2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUgKG1lLCBkKTsKKyAgICBjID0gSFdfWkFMTE9DIChtZSwgc3RydWN0IGh3X2V2ZW50KTsKKyAgICBod19ldmVudF9xdWV1ZV9kZXNjaGVkdWxlIChtZSwgYik7IC8qIE9PUFMhICovCisgICAgaHdfZnJlZSAobWUsIGMpOworICAgIGRlbGV0ZV9od19ldmVudF9kYXRhIChtZSk7CisgICAgZGVsZXRlX2h3X2FsbG9jX2RhdGEgKG1lKTsKKyAgfQorCisgIHByaW50ZiAoIlNjaGVkdWxlIGh3LWV2ZW50c1xuIik7CisgIHsKKyAgICBzdHJ1Y3QgaHdfZXZlbnQgKiplOworICAgIGludCAqbjsKKyAgICBpbnQgaTsKKyAgICBpbnQgbnIgPSA0OworICAgIGUgPSBIV19OWkFMTE9DIChtZSwgc3RydWN0IGh3X2V2ZW50ICosIG5yKTsKKyAgICBuID0gSFdfTlpBTExPQyAobWUsIGludCwgbnIpOworICAgIGNyZWF0ZV9od19hbGxvY19kYXRhIChtZSk7CisgICAgY3JlYXRlX2h3X2V2ZW50X2RhdGEgKG1lKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKKyAgICAgIHsKKwluW2ldID0gaTsKKwllW2ldID0gaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUgKG1lLCBpLCB0ZXN0X2hhbmRsZXIsICZuW2ldKTsKKyAgICAgIH0KKyAgICBzaW1fZXZlbnRzX3ByZXByb2Nlc3MgKHNkLCAxLCAxKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKKyAgICAgIHsKKwlpZiAoc2ltX2V2ZW50c190aWNrIChzZCkpCisJICBzaW1fZXZlbnRzX3Byb2Nlc3MgKHNkKTsKKyAgICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKKyAgICAgIHsKKwlpZiAobltpXSAhPSAtaSkKKwkgIGFib3J0ICgpOworCWh3X2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUgKG1lLCBlW2ldKTsKKyAgICAgIH0KKyAgICBod19mcmVlIChtZSwgbik7CisgICAgaHdfZnJlZSAobWUsIGUpOworICAgIGRlbGV0ZV9od19ldmVudF9kYXRhIChtZSk7CisgICAgZGVsZXRlX2h3X2FsbG9jX2RhdGEgKG1lKTsKKyAgfQorCisgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2h3LWV2ZW50cy5oIGIvc2ltL2NvbW1vbi9ody1ldmVudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWI2ZjhiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9ody1ldmVudHMuaApAQCAtMCwwICsxLDYxIEBACisvKiBIYXJkd2FyZSBldmVudCBtYW5hZ2VyLgorICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBIV19FVkVOVFNfSAorI2RlZmluZSBIV19FVkVOVFNfSAorCisvKiBFdmVudCBtYW5hZ2VyIGN1c3RvbWl6ZWQgZm9yIGhhcmR3YXJlIG1vZGVscy4KKworICAgVGhpcyBpbnRlcmZhY2UgaXMgZGlzY3Vzc2VkIGZ1cnRoZXIgaW4gc2ltLWV2ZW50cy5oLiAqLworCitzdHJ1Y3QgaHdfZXZlbnQ7Cit0eXBlZGVmIHZvaWQgKGh3X2V2ZW50X2NhbGxiYWNrKSAoc3RydWN0IGh3ICptZSwgdm9pZCAqZGF0YSk7CisKK3N0cnVjdCBod19ldmVudCAqaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUKKyhzdHJ1Y3QgaHcgKm1lLAorIHNpZ25lZDY0IGRlbHRhX3RpbWUsCisgaHdfZXZlbnRfY2FsbGJhY2sgKmhhbmRsZXIsCisgdm9pZCAqZGF0YSk7CisKK3N0cnVjdCBod19ldmVudCAqaHdfZXZlbnRfcXVldWVfc2NoZWR1bGVfdHJhY2VmCisoc3RydWN0IGh3ICptZSwKKyBzaWduZWQ2NCBkZWx0YV90aW1lLAorIGh3X2V2ZW50X2NhbGxiYWNrICpoYW5kbGVyLAorIHZvaWQgKmRhdGEsCisgY29uc3QgY2hhciAqZm10LAorIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA1LCA2KSkpOworCitzdHJ1Y3QgaHdfZXZlbnQgKmh3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlX3Z0cmFjZWYKKyhzdHJ1Y3QgaHcgKm1lLAorIHNpZ25lZDY0IGRlbHRhX3RpbWUsCisgaHdfZXZlbnRfY2FsbGJhY2sgKmhhbmRsZXIsCisgdm9pZCAqZGF0YSwKKyBjb25zdCBjaGFyICpmbXQsCisgdmFfbGlzdCBhcCk7CisKKwordm9pZCBod19ldmVudF9xdWV1ZV9kZXNjaGVkdWxlCisoc3RydWN0IGh3ICptZSwKKyBzdHJ1Y3QgaHdfZXZlbnQgKmV2ZW50X3RvX3JlbW92ZSk7CisKK3NpZ25lZDY0IGh3X2V2ZW50X3F1ZXVlX3RpbWUKKyhzdHJ1Y3QgaHcgKm1lKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2h3LWhhbmRsZXMuYyBiL3NpbS9jb21tb24vaHctaGFuZGxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MDBjYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL2h3LWhhbmRsZXMuYwpAQCAtMCwwICsxLDIzNyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwxOTk3LTE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpbmNsdWRlICJody1tYWluLmgiCisjaW5jbHVkZSAiaHctYmFzZS5oIgorCisKK3N0cnVjdCBod19oYW5kbGVfbWFwcGluZyB7CisgIGNlbGxfd29yZCBleHRlcm5hbDsKKyAgc3RydWN0IGh3ICpwaGFuZGxlOworICBzdHJ1Y3QgaHdfaW5zdGFuY2UgKmloYW5kbGU7CisgIHN0cnVjdCBod19oYW5kbGVfbWFwcGluZyAqbmV4dDsKK307CisKKworc3RydWN0IGh3X2hhbmRsZV9kYXRhIHsKKyAgaW50IG5yX21hcHBpbmdzOworICBzdHJ1Y3QgaHdfaGFuZGxlX21hcHBpbmcgKm1hcHBpbmdzOworfTsKKwordm9pZAorY3JlYXRlX2h3X2hhbmRsZV9kYXRhIChzdHJ1Y3QgaHcgKmh3KQoreworICBpZiAoaHdfcGFyZW50IChodykgPT0gTlVMTCkKKyAgICB7CisgICAgICBody0+aGFuZGxlc19vZl9odyA9IEhXX1pBTExPQyAoaHcsIHN0cnVjdCBod19oYW5kbGVfZGF0YSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaHctPmhhbmRsZXNfb2ZfaHcgPSBod19yb290IChodyktPmhhbmRsZXNfb2ZfaHc7CisgICAgfQorfQorCit2b2lkCitkZWxldGVfaHdfaGFuZGxlX2RhdGEgKHN0cnVjdCBodyAqaHcpCit7CisgIC8qIE5VTEwgKi8KK30KKworCisKKyNpZiAwCit2b2lkCitod19oYW5kbGVfaW5pdCAoc3RydWN0IGh3ICpodykKK3sKKyAgc3RydWN0IGh3X2hhbmRsZV9tYXBwaW5nICpjdXJyZW50X21hcCA9IGRiLT5tYXBwaW5nczsKKyAgaWYgKGN1cnJlbnRfbWFwICE9IE5VTEwpCisgICAgeworICAgICAgZGItPm5yX21hcHBpbmdzID0gZGItPm1hcHBpbmdzLT5leHRlcm5hbDsKKyAgICAgIC8qIHZlcmlmeSB0aGF0IHRoZSBtYXBwaW5ncyB0aGF0IHdlcmUgbm90IHJlbW92ZWQgYXJlIGluCisJIHNlcXVlbmNlIGRvd24gdG8gbnIgMSAqLworICAgICAgd2hpbGUgKGN1cnJlbnRfbWFwLT5uZXh0ICE9IE5VTEwpCisJeworCSAgaWYgKGN1cnJlbnRfbWFwLT5leHRlcm5hbCAhPSBjdXJyZW50X21hcC0+bmV4dC0+ZXh0ZXJuYWwgKyAxKQorCSAgICBlcnJvciAoImh3X2hhbmRsZTogaHdfaGFuZGxlIGRhdGFiYXNlIHBvc3NpYmx5IGNvcnJ1cHQiKTsKKwkgIGN1cnJlbnRfbWFwID0gY3VycmVudF9tYXAtPm5leHQ7CisJfQorICAgICAgQVNTRVJUIChjdXJyZW50X21hcC0+bmV4dCA9PSBOVUxMKTsKKyAgICAgIGlmIChjdXJyZW50X21hcC0+ZXh0ZXJuYWwgIT0gMSkKKwllcnJvciAoImh3X2hhbmRsZTogaHdfaGFuZGxlIGRhdGFiYXNlIHBvc3NpYmx5IGNvcnJ1cHQiKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkYi0+bnJfbWFwcGluZ3MgPSAwOworICAgIH0KK30KKyNlbmRpZgorCisKK3N0cnVjdCBod19pbnN0YW5jZSAqCitod19oYW5kbGVfaWhhbmRsZTIgKHN0cnVjdCBodyAqaHcsCisJCSAgICBjZWxsX3dvcmQgZXh0ZXJuYWwpCit7CisgIHN0cnVjdCBod19oYW5kbGVfZGF0YSAqZGIgPSBody0+aGFuZGxlc19vZl9odzsKKyAgc3RydWN0IGh3X2hhbmRsZV9tYXBwaW5nICpjdXJyZW50X21hcCA9IGRiLT5tYXBwaW5nczsKKyAgd2hpbGUgKGN1cnJlbnRfbWFwICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGN1cnJlbnRfbWFwLT5leHRlcm5hbCA9PSBleHRlcm5hbCkKKwlyZXR1cm4gY3VycmVudF9tYXAtPmloYW5kbGU7CisgICAgICBjdXJyZW50X21hcCA9IGN1cnJlbnRfbWFwLT5uZXh0OworICAgIH0KKyAgcmV0dXJuICh2b2lkKikwOworfQorCisKK3N0cnVjdCBodyAqCitod19oYW5kbGVfcGhhbmRsZTIgKHN0cnVjdCBodyAqaHcsCisJCSAgICBjZWxsX3dvcmQgZXh0ZXJuYWwpCit7CisgIHN0cnVjdCBod19oYW5kbGVfZGF0YSAqZGIgPSBody0+aGFuZGxlc19vZl9odzsKKyAgc3RydWN0IGh3X2hhbmRsZV9tYXBwaW5nICpjdXJyZW50X21hcCA9IGRiLT5tYXBwaW5nczsKKyAgd2hpbGUgKGN1cnJlbnRfbWFwICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGN1cnJlbnRfbWFwLT5leHRlcm5hbCA9PSBleHRlcm5hbCkKKwlyZXR1cm4gY3VycmVudF9tYXAtPnBoYW5kbGU7CisgICAgICBjdXJyZW50X21hcCA9IGN1cnJlbnRfbWFwLT5uZXh0OworICAgIH0KKyAgcmV0dXJuICh2b2lkKikwOworfQorCisKK2NlbGxfd29yZAoraHdfaGFuZGxlXzJpaGFuZGxlIChzdHJ1Y3QgaHcgKmh3LAorCQkgICAgc3RydWN0IGh3X2luc3RhbmNlICppbnRlcm5hbCkKK3sKKyAgc3RydWN0IGh3X2hhbmRsZV9kYXRhICpkYiA9IGh3LT5oYW5kbGVzX29mX2h3OworICBzdHJ1Y3QgaHdfaGFuZGxlX21hcHBpbmcgKmN1cnJlbnRfbWFwID0gZGItPm1hcHBpbmdzOworICB3aGlsZSAoY3VycmVudF9tYXAgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoY3VycmVudF9tYXAtPmloYW5kbGUgPT0gaW50ZXJuYWwpCisJcmV0dXJuIGN1cnJlbnRfbWFwLT5leHRlcm5hbDsKKyAgICAgIGN1cnJlbnRfbWFwID0gY3VycmVudF9tYXAtPm5leHQ7CisgICAgfQorICByZXR1cm4gMDsKK30KKworCitjZWxsX3dvcmQKK2h3X2hhbmRsZV8ycGhhbmRsZSAoc3RydWN0IGh3ICpodywKKwkJICAgIHN0cnVjdCBodyAqaW50ZXJuYWwpCit7CisgIHN0cnVjdCBod19oYW5kbGVfZGF0YSAqZGIgPSBody0+aGFuZGxlc19vZl9odzsKKyAgc3RydWN0IGh3X2hhbmRsZV9tYXBwaW5nICpjdXJyZW50X21hcCA9IGRiLT5tYXBwaW5nczsKKyAgd2hpbGUgKGN1cnJlbnRfbWFwICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGN1cnJlbnRfbWFwLT5waGFuZGxlID09IGludGVybmFsKQorCXJldHVybiBjdXJyZW50X21hcC0+ZXh0ZXJuYWw7CisgICAgICBjdXJyZW50X21hcCA9IGN1cnJlbnRfbWFwLT5uZXh0OworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKwordm9pZAoraHdfaGFuZGxlX2FkZF9paGFuZGxlIChzdHJ1Y3QgaHcgKmh3LAorCQkgICAgICAgc3RydWN0IGh3X2luc3RhbmNlICppbnRlcm5hbCkKK3sKKyAgc3RydWN0IGh3X2hhbmRsZV9kYXRhICpkYiA9IGh3LT5oYW5kbGVzX29mX2h3OworICBpZiAoaHdfaGFuZGxlXzJpaGFuZGxlIChodywgaW50ZXJuYWwpICE9IDApIAorICAgIHsKKyAgICAgIGh3X2Fib3J0IChodywgImF0dGVtcHRpbmcgdG8gYWRkIGFuIGloYW5kbGUgYWxyZWFkeSBpbiB0aGUgZGF0YSBiYXNlIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogaW5zZXJ0IGF0IHRoZSBmcm9udCBtYWtpbmcgdGhpbmdzIGluIGRlY2VuZGluZyBvcmRlciAqLworICAgICAgc3RydWN0IGh3X2hhbmRsZV9tYXBwaW5nICpuZXdfbWFwID0gWkFMTE9DIChzdHJ1Y3QgaHdfaGFuZGxlX21hcHBpbmcpOworICAgICAgbmV3X21hcC0+bmV4dCA9IGRiLT5tYXBwaW5nczsKKyAgICAgIG5ld19tYXAtPmloYW5kbGUgPSBpbnRlcm5hbDsKKyAgICAgIGRiLT5ucl9tYXBwaW5ncyArPSAxOworICAgICAgbmV3X21hcC0+ZXh0ZXJuYWwgPSBkYi0+bnJfbWFwcGluZ3M7CisgICAgICBkYi0+bWFwcGluZ3MgPSBuZXdfbWFwOworICAgIH0KK30KKworCit2b2lkCitod19oYW5kbGVfYWRkX3BoYW5kbGUgKHN0cnVjdCBodyAqaHcsCisJCSAgICAgICBzdHJ1Y3QgaHcgKmludGVybmFsKQoreworICBzdHJ1Y3QgaHdfaGFuZGxlX2RhdGEgKmRiID0gaHctPmhhbmRsZXNfb2ZfaHc7CisgIGlmIChod19oYW5kbGVfMnBoYW5kbGUgKGh3LCBpbnRlcm5hbCkgIT0gMCkgCisgICAgeworICAgICAgaHdfYWJvcnQgKGh3LCAiYXR0ZW1wdGluZyB0byBhZGQgYSBwaGFuZGxlIGFscmVhZHkgaW4gdGhlIGRhdGEgYmFzZSIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIGluc2VydCBhdCB0aGUgZnJvbnQgbWFraW5nIHRoaW5ncyBpbiBkZWNlbmRpbmcgb3JkZXIgKi8KKyAgICAgIHN0cnVjdCBod19oYW5kbGVfbWFwcGluZyAqbmV3X21hcCA9IFpBTExPQyAoc3RydWN0IGh3X2hhbmRsZV9tYXBwaW5nKTsKKyAgICAgIG5ld19tYXAtPm5leHQgPSBkYi0+bWFwcGluZ3M7CisgICAgICBuZXdfbWFwLT5waGFuZGxlID0gaW50ZXJuYWw7CisgICAgICBkYi0+bnJfbWFwcGluZ3MgKz0gMTsKKyAgICAgIG5ld19tYXAtPmV4dGVybmFsID0gZGItPm5yX21hcHBpbmdzOworICAgICAgZGItPm1hcHBpbmdzID0gbmV3X21hcDsKKyAgICB9Cit9CisKKwordm9pZAoraHdfaGFuZGxlX3JlbW92ZV9paGFuZGxlIChzdHJ1Y3QgaHcgKmh3LAorCQkJICBzdHJ1Y3QgaHdfaW5zdGFuY2UgKmludGVybmFsKQoreworICBzdHJ1Y3QgaHdfaGFuZGxlX2RhdGEgKmRiID0gaHctPmhhbmRsZXNfb2ZfaHc7CisgIHN0cnVjdCBod19oYW5kbGVfbWFwcGluZyAqKmN1cnJlbnRfbWFwID0gJmRiLT5tYXBwaW5nczsKKyAgd2hpbGUgKCpjdXJyZW50X21hcCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICgoKmN1cnJlbnRfbWFwKS0+aWhhbmRsZSA9PSBpbnRlcm5hbCkKKwl7CisJICBzdHJ1Y3QgaHdfaGFuZGxlX21hcHBpbmcgKmRlbGV0ZSA9ICpjdXJyZW50X21hcDsKKwkgICpjdXJyZW50X21hcCA9IGRlbGV0ZS0+bmV4dDsKKwkgIHpmcmVlIChkZWxldGUpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGN1cnJlbnRfbWFwID0gJigqY3VycmVudF9tYXApLT5uZXh0OworICAgIH0KKyAgaHdfYWJvcnQgKGh3LCAiYXR0ZW1wdCB0byByZW1vdmUgbm9uZXhpc3RhbnQgaWhhbmRsZSIpOworfQorCisKK3ZvaWQKK2h3X2hhbmRsZV9yZW1vdmVfcGhhbmRsZSAoc3RydWN0IGh3ICpodywKKwkJCSAgc3RydWN0IGh3ICppbnRlcm5hbCkKK3sKKyAgc3RydWN0IGh3X2hhbmRsZV9kYXRhICpkYiA9IGh3LT5oYW5kbGVzX29mX2h3OworICBzdHJ1Y3QgaHdfaGFuZGxlX21hcHBpbmcgKipjdXJyZW50X21hcCA9ICZkYi0+bWFwcGluZ3M7CisgIHdoaWxlICgqY3VycmVudF9tYXAgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoKCpjdXJyZW50X21hcCktPnBoYW5kbGUgPT0gaW50ZXJuYWwpCisJeworCSAgc3RydWN0IGh3X2hhbmRsZV9tYXBwaW5nICpkZWxldGUgPSAqY3VycmVudF9tYXA7CisJICAqY3VycmVudF9tYXAgPSBkZWxldGUtPm5leHQ7CisJICB6ZnJlZSAoZGVsZXRlKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBjdXJyZW50X21hcCA9ICYoKmN1cnJlbnRfbWFwKS0+bmV4dDsKKyAgICB9CisgIGh3X2Fib3J0IChodywgImF0dGVtcHQgdG8gcmVtb3ZlIG5vbmV4aXN0YW50IHBoYW5kbGUiKTsKK30KKworCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2h3LWhhbmRsZXMuaCBiL3NpbS9jb21tb24vaHctaGFuZGxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4N2M5ZDAyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9ody1oYW5kbGVzLmgKQEAgLTAsMCArMSw2MyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwxOTk3LTE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgSFdfSEFORExFU19ICisjZGVmaW5lIEhXX0hBTkRMRVNfSAorCisKKy8qIEV4cG9ydCBhIGNhcGFiaWxpdHkgKGhhbmRsZSkgZGF0YSBiYXNlIHRoYXQgbWFwcyBiZXR3ZWVuIGludGVybmFsCisgICBkYXRhIHZhbHVlcyBhbmQgdGhvc2UgZ2l2ZW4gdG8gYSBzaW11bGF0aW9uLiAqLworCisKK2NlbGxfd29yZCBod19oYW5kbGVfMmloYW5kbGUKKyhzdHJ1Y3QgaHcgKmRiLAorIHN0cnVjdCBod19pbnN0YW5jZSAqaW5zdGFuY2UpOworCitzdHJ1Y3QgaHdfaW5zdGFuY2UgKmh3X2hhbmRsZV9paGFuZGxlMgorKHN0cnVjdCBodyAqZGIsCisgY2VsbF93b3JkIGV4dGVybmFsKTsKKwordm9pZCBod19oYW5kbGVfYWRkX2loYW5kbGUKKyhzdHJ1Y3QgaHcgKmRiLAorIHN0cnVjdCBod19pbnN0YW5jZSAqaW5zdGFuY2UpOworCit2b2lkIGh3X2hhbmRsZV9yZW1vdmVfaWhhbmRsZQorKHN0cnVjdCBodyAqZGIsCisgc3RydWN0IGh3X2luc3RhbmNlICppbnN0YW5jZSk7CisKKworY2VsbF93b3JkIGh3X2hhbmRsZV8ycGhhbmRsZQorKHN0cnVjdCBodyAqZGIsCisgc3RydWN0IGh3ICpodyk7CisKK3N0cnVjdCBodyAqaHdfaGFuZGxlX3BoYW5kbGUyCisoc3RydWN0IGh3ICpkYiwKKyBjZWxsX3dvcmQgZXh0ZXJuYWwpOworCit2b2lkIGh3X2hhbmRsZV9hZGRfcGhhbmRsZQorKHN0cnVjdCBodyAqZGIsCisgc3RydWN0IGh3ICpodyk7CisKK3ZvaWQgaHdfaGFuZGxlX3JlbW92ZV9waGFuZGxlCisoc3RydWN0IGh3ICpkYiwKKyBzdHJ1Y3QgaHcgKmh3KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2h3LWluc3RhbmNlcy5jIGIvc2ltL2NvbW1vbi9ody1pbnN0YW5jZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTNmODE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9ody1pbnN0YW5jZXMuYwpAQCAtMCwwICsxLDI4NSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2luY2x1ZGUgImh3LW1haW4uaCIKKyNpbmNsdWRlICJody1iYXNlLmgiCisKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisKK3N0cnVjdCBod19pbnN0YW5jZV9kYXRhIHsKKyAgaHdfZmluaXNoX2luc3RhbmNlX21ldGhvZCAqdG9fZmluaXNoOworICBzdHJ1Y3QgaHdfaW5zdGFuY2UgKmluc3RhbmNlczsKK307CisKK3N0YXRpYyBod19maW5pc2hfaW5zdGFuY2VfbWV0aG9kIGFib3J0X2h3X2ZpbmlzaF9pbnN0YW5jZTsKKwordm9pZAorY3JlYXRlX2h3X2luc3RhbmNlX2RhdGEgKHN0cnVjdCBodyAqbWUpCit7CisgIG1lLT5pbnN0YW5jZXNfb2ZfaHcgPSBIV19aQUxMT0MgKG1lLCBzdHJ1Y3QgaHdfaW5zdGFuY2VfZGF0YSk7CisgIHNldF9od19maW5pc2hfaW5zdGFuY2UgKG1lLCBhYm9ydF9od19maW5pc2hfaW5zdGFuY2UpOworfQorCit2b2lkCitkZWxldGVfaHdfaW5zdGFuY2VfZGF0YSAoc3RydWN0IGh3ICptZSkKK3sKKyAgLyogTk9QICovCit9CisKKworc3RhdGljIHZvaWQKK2Fib3J0X2h3X2ZpbmlzaF9pbnN0YW5jZSAoc3RydWN0IGh3ICpodywKKwkJCSAgc3RydWN0IGh3X2luc3RhbmNlICppbnN0YW5jZSkKK3sKKyAgaHdfYWJvcnQgKGh3LCAibm8gaW5zdGFuY2UgZmluaXNoIG1ldGhvZCIpOworfQorCit2b2lkCitzZXRfaHdfZmluaXNoX2luc3RhbmNlIChzdHJ1Y3QgaHcgKm1lLAorCQkJaHdfZmluaXNoX2luc3RhbmNlX21ldGhvZCAqZmluaXNoKQoreworICBtZS0+aW5zdGFuY2VzX29mX2h3LT50b19maW5pc2ggPSBmaW5pc2g7Cit9CisKKworI2lmIDAKK3ZvaWQKK2NsZWFuX2h3X2luc3RhbmNlcyAoc3RydWN0IGh3ICptZSkKK3sKKyAgc3RydWN0IGh3X2luc3RhbmNlICoqaW5zdGFuY2UgPSAmbWUtPmluc3RhbmNlczsKKyAgd2hpbGUgKCppbnN0YW5jZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBod19pbnN0YW5jZSAqb2xkX2luc3RhbmNlID0gKmluc3RhbmNlOworICAgICAgaHdfaW5zdGFuY2VfZGVsZXRlIChvbGRfaW5zdGFuY2UpOworICAgICAgaW5zdGFuY2UgPSAmbWUtPmluc3RhbmNlczsKKyAgICB9Cit9CisjZW5kaWYKKworCit2b2lkCitod19pbnN0YW5jZV9kZWxldGUgKHN0cnVjdCBod19pbnN0YW5jZSAqaW5zdGFuY2UpCit7CisjaWYgMQorICBod19hYm9ydCAoaHdfaW5zdGFuY2VfaHcgKGluc3RhbmNlKSwgIm5vdCBpbXBsZW1lbnRlZCIpOworI2Vsc2UKKyAgc3RydWN0IGh3ICptZSA9IGh3X2luc3RhbmNlX2h3IChpbnN0YW5jZSk7CisgIGlmIChpbnN0YW5jZS0+dG9faW5zdGFuY2VfZGVsZXRlID09IE5VTEwpCisgICAgaHdfYWJvcnQgKG1lLCAibm8gZGVsZXRlIG1ldGhvZCIpOworICBpbnN0YW5jZS0+bWV0aG9kLT5kZWxldGUoaW5zdGFuY2UpOworICBpZiAoaW5zdGFuY2UtPmFyZ3MgIT0gTlVMTCkKKyAgICB6ZnJlZSAoaW5zdGFuY2UtPmFyZ3MpOworICBpZiAoaW5zdGFuY2UtPnBhdGggIT0gTlVMTCkKKyAgICB6ZnJlZSAoaW5zdGFuY2UtPnBhdGgpOworICBpZiAoaW5zdGFuY2UtPmNoaWxkID09IE5VTEwpCisgICAgeworICAgICAgLyogb25seSByZW1vdmUgbGVhZiBub2RlcyAqLworICAgICAgc3RydWN0IGh3X2luc3RhbmNlICoqY3VyciA9ICZtZS0+aW5zdGFuY2VzOworICAgICAgd2hpbGUgKCpjdXJyICE9IGluc3RhbmNlKQorCXsKKwkgIEFTU0VSVCAoKmN1cnIgIT0gTlVMTCk7CisJICBjdXJyID0gJigqY3VyciktPm5leHQ7CisJfQorICAgICAgKmN1cnIgPSBpbnN0YW5jZS0+bmV4dDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBjaGVjayBpdCBpc24ndCBpbiB0aGUgaW5zdGFuY2UgbGlzdCAqLworICAgICAgc3RydWN0IGh3X2luc3RhbmNlICpjdXJyID0gbWUtPmluc3RhbmNlczsKKyAgICAgIHdoaWxlIChjdXJyICE9IE5VTEwpCisJeworCSAgQVNTRVJUKGN1cnIgIT0gaW5zdGFuY2UpOworCSAgY3VyciA9IGN1cnItPm5leHQ7CisJfQorICAgICAgLyogdW5saW5rIHRoZSBjaGlsZCAqLworICAgICAgQVNTRVJUIChpbnN0YW5jZS0+Y2hpbGQtPnBhcmVudCA9PSBpbnN0YW5jZSk7CisgICAgICBpbnN0YW5jZS0+Y2hpbGQtPnBhcmVudCA9IE5VTEw7CisgICAgfQorICBjYXBfcmVtb3ZlIChtZS0+aWhhbmRsZXMsIGluc3RhbmNlKTsKKyAgemZyZWUgKGluc3RhbmNlKTsKKyNlbmRpZgorfQorCisKK3N0YXRpYyBpbnQKK3BhbmljX2h3X2luc3RhbmNlX3JlYWQgKHN0cnVjdCBod19pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQl2b2lkICphZGRyLAorCQkJdW5zaWduZWRfd29yZCBsZW4pCit7CisgIGh3X2Fib3J0IChod19pbnN0YW5jZV9odyAoaW5zdGFuY2UpLCAibm8gcmVhZCBtZXRob2QiKTsKKyAgcmV0dXJuIC0xOworfQorCisKKworc3RhdGljIGludAorcGFuaWNfaHdfaW5zdGFuY2Vfd3JpdGUgKHN0cnVjdCBod19pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQkgY29uc3Qgdm9pZCAqYWRkciwKKwkJCSB1bnNpZ25lZF93b3JkIGxlbikKK3sKKyAgaHdfYWJvcnQgKGh3X2luc3RhbmNlX2h3IChpbnN0YW5jZSksICJubyB3cml0ZSBtZXRob2QiKTsKKyAgcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyBpbnQKK3BhbmljX2h3X2luc3RhbmNlX3NlZWsgKHN0cnVjdCBod19pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQl1bnNpZ25lZF93b3JkIHBvc19oaSwKKwkJCXVuc2lnbmVkX3dvcmQgcG9zX2xvKQoreworICBod19hYm9ydCAoaHdfaW5zdGFuY2VfaHcgKGluc3RhbmNlKSwgIm5vIHNlZWsgbWV0aG9kIik7CisgIHJldHVybiAtMTsKK30KKworCitpbnQKK2h3X2luc3RhbmNlX2NhbGxfbWV0aG9kIChzdHJ1Y3QgaHdfaW5zdGFuY2UgKmluc3RhbmNlLAorCQkJIGNvbnN0IGNoYXIgKm1ldGhvZF9uYW1lLAorCQkJIGludCBuX3N0YWNrX2FyZ3MsCisJCQkgdW5zaWduZWRfY2VsbCBzdGFja19hcmdzWy8qbl9zdGFja19hcmdzKi9dLAkKKwkJCSBpbnQgbl9zdGFja19yZXR1cm5zLAorCQkJIHVuc2lnbmVkX2NlbGwgc3RhY2tfcmV0dXJuc1svKm5fc3RhY2tfYXJncyovXSkKK3sKKyNpZiAxCisgIGh3X2Fib3J0IChod19pbnN0YW5jZV9odyAoaW5zdGFuY2UpLCAibm90IGltcGxlbWVudGVkIik7CisgIHJldHVybiAtMTsKKyNlbHNlCisgIHN0cnVjdCBodyAqbWUgPSBpbnN0YW5jZS0+b3duZXI7CisgIGNvbnN0IGh3X2luc3RhbmNlX21ldGhvZHMgKm1ldGhvZCA9IGluc3RhbmNlLT5tZXRob2QtPm1ldGhvZHM7CisgIGlmIChtZXRob2QgPT0gTlVMTCkKKyAgICB7CisgICAgICBod19hYm9ydCAobWUsICJubyBtZXRob2RzICh3YW50ICVzKSIsIG1ldGhvZF9uYW1lKTsKKyAgICB9CisgIHdoaWxlIChtZXRob2QtPm5hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoc3RyY21wKG1ldGhvZC0+bmFtZSwgbWV0aG9kX25hbWUpID09IDApCisJeworCSAgcmV0dXJuIG1ldGhvZC0+bWV0aG9kIChpbnN0YW5jZSwKKwkJCQkgbl9zdGFja19hcmdzLCBzdGFja19hcmdzLAorCQkJCSBuX3N0YWNrX3JldHVybnMsIHN0YWNrX3JldHVybnMpOworCX0KKyAgICAgIG1ldGhvZCsrOworICAgIH0KKyAgaHdfYWJvcnQgKG1lLCAibm8gJXMgbWV0aG9kIiwgbWV0aG9kX25hbWUpOworICByZXR1cm4gMDsKKyNlbmRpZgorfQorCisKKyNkZWZpbmUgc2V0X2h3X2luc3RhbmNlX3JlYWQoaW5zdGFuY2UsIG1ldGhvZClcCisoKGluc3RhbmNlKS0+dG9faW5zdGFuY2VfcmVhZCA9IChtZXRob2QpKQorCisjZGVmaW5lIHNldF9od19pbnN0YW5jZV93cml0ZShpbnN0YW5jZSwgbWV0aG9kKVwKKygoaW5zdGFuY2UpLT50b19pbnN0YW5jZV93cml0ZSA9IChtZXRob2QpKQorCisjZGVmaW5lIHNldF9od19pbnN0YW5jZV9zZWVrKGluc3RhbmNlLCBtZXRob2QpXAorKChpbnN0YW5jZSktPnRvX2luc3RhbmNlX3NlZWsgPSAobWV0aG9kKSkKKworCisjaWYgMAorc3RhdGljIHZvaWQKK3NldF9od19pbnN0YW5jZV9maW5pc2ggKHN0cnVjdCBodyAqbWUsCisJCQlod19pbnN0YW5jZV9maW5pc2hfbWV0aG9kICptZXRob2QpCit7CisgIGlmIChtZS0+aW5zdGFuY2VzX29mX2h3ID09IE5VTEwpCisgICAgbWUtPmluc3RhbmNlc19vZl9odyA9IEhXX1pBTExPQyAobWUsIHN0cnVjdCBod19pbnN0YW5jZV9kYXRhKTsKKyAgbWUtPmluc3RhbmNlc19vZl9ody0+dG9fZmluaXNoID0gbWV0aG9kOworfQorI2VuZGlmCisKKworc3RydWN0IGh3X2luc3RhbmNlICoKK2h3X2luc3RhbmNlX2NyZWF0ZSAoc3RydWN0IGh3ICptZSwKKwkJICAgIHN0cnVjdCBod19pbnN0YW5jZSAqcGFyZW50LAorCQkgICAgY29uc3QgY2hhciAqcGF0aCwKKwkJICAgIGNvbnN0IGNoYXIgKmFyZ3MpCit7CisgIHN0cnVjdCBod19pbnN0YW5jZSAqaW5zdGFuY2UgPSBaQUxMT0MgKHN0cnVjdCBod19pbnN0YW5jZSk7CisgIC8qaW5zdGFuY2UtPnVuaXQqLworICAvKiBsaW5rIHRoaXMgaW5zdGFuY2UgaW50byB0aGUgZGV2aWNlcyBsaXN0ICovCisgIGluc3RhbmNlLT5od19vZl9pbnN0YW5jZSA9IG1lOworICBpbnN0YW5jZS0+cGFyZW50X29mX2luc3RhbmNlID0gTlVMTDsKKyAgLyogbGluayB0aGlzIGluc3RhbmNlIGludG8gdGhlIGZyb250IG9mIHRoZSBkZXZpY2VzIGluc3RhbmNlIGxpc3QgKi8KKyAgaW5zdGFuY2UtPnNpYmxpbmdfb2ZfaW5zdGFuY2UgPSBtZS0+aW5zdGFuY2VzX29mX2h3LT5pbnN0YW5jZXM7CisgIG1lLT5pbnN0YW5jZXNfb2ZfaHctPmluc3RhbmNlcyA9IGluc3RhbmNlOworICBpZiAocGFyZW50ICE9IE5VTEwpCisgICAgeworICAgICAgQVNTRVJUIChwYXJlbnQtPmNoaWxkX29mX2luc3RhbmNlID09IE5VTEwpOworICAgICAgcGFyZW50LT5jaGlsZF9vZl9pbnN0YW5jZSA9IGluc3RhbmNlOworICAgICAgaW5zdGFuY2UtPnBhcmVudF9vZl9pbnN0YW5jZSA9IHBhcmVudDsKKyAgICB9CisgIGluc3RhbmNlLT5hcmdzX29mX2luc3RhbmNlID0gaHdfc3RyZHVwIChtZSwgYXJncyk7CisgIGluc3RhbmNlLT5wYXRoX29mX2luc3RhbmNlID0gaHdfc3RyZHVwIChtZSwgcGF0aCk7CisgIHNldF9od19pbnN0YW5jZV9yZWFkIChpbnN0YW5jZSwgcGFuaWNfaHdfaW5zdGFuY2VfcmVhZCk7CisgIHNldF9od19pbnN0YW5jZV93cml0ZSAoaW5zdGFuY2UsIHBhbmljX2h3X2luc3RhbmNlX3dyaXRlKTsKKyAgc2V0X2h3X2luc3RhbmNlX3NlZWsgKGluc3RhbmNlLCBwYW5pY19od19pbnN0YW5jZV9zZWVrKTsKKyAgaHdfaGFuZGxlX2FkZF9paGFuZGxlIChtZSwgaW5zdGFuY2UpOworICBtZS0+aW5zdGFuY2VzX29mX2h3LT50b19maW5pc2ggKG1lLCBpbnN0YW5jZSk7CisgIHJldHVybiBpbnN0YW5jZTsKK30KKworCitzdHJ1Y3QgaHdfaW5zdGFuY2UgKgoraHdfaW5zdGFuY2VfaW50ZXJjZWVkIChzdHJ1Y3QgaHdfaW5zdGFuY2UgKnBhcmVudCwKKwkJICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCisJCSAgICAgICBjb25zdCBjaGFyICphcmdzKQoreworI2lmIDEKKyAgcmV0dXJuIE5VTEw7CisjZWxzZQorICBzdHJ1Y3QgaHdfaW5zdGFuY2UgKmluc3RhbmNlID0gWkFMTE9DIChzdHJ1Y3QgaHdfaW5zdGFuY2UpOworICAvKmluc3RhbmNlLT51bml0Ki8KKyAgLyogbGluayB0aGlzIGluc3RhbmNlIGludG8gdGhlIGRldmljZXMgbGlzdCAqLworICBpZiAobWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBBU1NFUlQgKHBhcmVudCA9PSBOVUxMKTsKKyAgICAgIGluc3RhbmNlLT5od19vZl9pbnN0YW5jZSA9IG1lOworICAgICAgaW5zdGFuY2UtPnBhcmVudF9vZl9pbnN0YW5jZSA9IE5VTEw7CisgICAgICAvKiBsaW5rIHRoaXMgaW5zdGFuY2UgaW50byB0aGUgZnJvbnQgb2YgdGhlIGRldmljZXMgaW5zdGFuY2UgbGlzdCAqLworICAgICAgaW5zdGFuY2UtPnNpYmxpbmdfb2ZfaW5zdGFuY2UgPSBtZS0+aW5zdGFuY2VzX29mX2h3LT5pbnN0YW5jZXM7CisgICAgICBtZS0+aW5zdGFuY2VzX29mX2h3LT5pbnN0YW5jZXMgPSBpbnN0YW5jZTsKKyAgICB9CisgIGlmIChwYXJlbnQgIT0gTlVMTCkKKyAgICB7CisgICAgICBzdHJ1Y3QgaHdfaW5zdGFuY2UgKipwcmV2aW91czsKKyAgICAgIEFTU0VSVCAocGFyZW50LT5jaGlsZF9vZl9pbnN0YW5jZSA9PSBOVUxMKTsKKyAgICAgIHBhcmVudC0+Y2hpbGRfb2ZfaW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICAgIGluc3RhbmNlLT5vd25lciA9IHBhcmVudC0+b3duZXI7CisgICAgICBpbnN0YW5jZS0+cGFyZW50X29mX2luc3RhbmNlID0gcGFyZW50OworICAgICAgLyogaW4gdGhlIGRldmljZXMgaW5zdGFuY2UgbGlzdCByZXBsYWNlIHRoZSBwYXJlbnQgaW5zdGFuY2Ugd2l0aAorCSB0aGlzIG9uZSAqLworICAgICAgaW5zdGFuY2UtPm5leHQgPSBwYXJlbnQtPm5leHQ7CisgICAgICAvKiByZXBsYWNlIHBhcmVudCB3aXRoIHRoaXMgbmV3IG5vZGUgKi8KKyAgICAgIHByZXZpb3VzID0gJmluc3RhbmNlLT5vd25lci0+aW5zdGFuY2VzOworICAgICAgd2hpbGUgKCpwcmV2aW91cyAhPSBwYXJlbnQpCisJeworCSAgQVNTRVJUICgqcHJldmlvdXMgIT0gTlVMTCk7CisJICBwcmV2aW91cyA9ICYoKnByZXZpb3VzKS0+bmV4dDsKKwl9CisgICAgICAqcHJldmlvdXMgPSBpbnN0YW5jZTsKKyAgICB9CisgIGluc3RhbmNlLT5kYXRhID0gZGF0YTsKKyAgaW5zdGFuY2UtPmFyZ3MgPSAoYXJncyA9PSBOVUxMID8gTlVMTCA6IChjaGFyICopIHN0cmR1cChhcmdzKSk7CisgIGluc3RhbmNlLT5wYXRoID0gKHBhdGggPT0gTlVMTCA/IE5VTEwgOiAoY2hhciAqKSBzdHJkdXAocGF0aCkpOworICBjYXBfYWRkIChpbnN0YW5jZS0+b3duZXItPmloYW5kbGVzLCBpbnN0YW5jZSk7CisgIHJldHVybiBpbnN0YW5jZTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9ody1pbnN0YW5jZXMuaCBiL3NpbS9jb21tb24vaHctaW5zdGFuY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQyN2IxMQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vaHctaW5zdGFuY2VzLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgSFdfSU5TVEFOQ0VTX0gKKyNkZWZpbmUgSFdfSU5TVEFOQ0VTX0gKKworLyogSW5zdGFuY2VzOgorCisgICBBcyB3aXRoIElFRUUxMjc1LCBhIGRldmljZSBjYW4gYmUgb3BlbmVkLCBjcmVhdGluZyBhbiBpbnN0YW5jZS4KKyAgIEluc3RhbmNlcyBwcm92aWRlIG1vcmUgYWJzdHJhY3QgaW50ZXJmYWNlcyB0byB0aGUgdW5kZXJseWluZworICAgaGFyZHdhcmUuICBGb3IgZXhhbXBsZSwgdGhlIGluc3RhbmNlIG1ldGhvZHMgZm9yIGEgZGlzayBtYXkgaW5jbHVkZQorICAgY29kZSB0aGF0IGlzIGFibGUgdG8gaW50ZXJwcmV0IGZpbGUgc3lzdGVtcyBmb3VuZCBvbiBkaXNrcy4gIFN1Y2gKKyAgIG1ldGhvZHMgd291bGQgdGhlcmUgZm9yIGFsbG93IHRoZSBtYW5pcHVsYXRpb24gb2YgZmlsZXMgb24gdGhlCisgICBkaXNrcyBmaWxlIHN5c3RlbS4gIFRoZSBvcGVyYXRpb25zIHdvdWxkIGJlIGltcGxlbWVudGVkIHVzaW5nIHRoZQorICAgYmFzaWMgYmxvY2sgSS9PIG1vZGVsIHByb3ZpZGVkIGJ5IHRoZSBkaXNrLgorCisgICBUaGlzIG1vZGVsIGluY2x1ZGVzIG1ldGhvZHMgdGhhdCBmYWNpbGlhdGUgdGhlIGNyZWF0aW9uIG9mIGRldmljZQorICAgaW5zdGFuY2UgYW5kIChzaG91bGQgYSBnaXZlbiBkZXZpY2Ugc3VwcG9ydCBpdCkgc3RhbmRhcmQgb3BlcmF0aW9ucworICAgb24gdGhvc2UgaW5zdGFuY2VzLgorCisgICAqLworCisKK3N0cnVjdCBod19pbnN0YW5jZTsKKworCit0eXBlZGVmIHZvaWQgKGh3X2ZpbmlzaF9pbnN0YW5jZV9tZXRob2QpCisgICAgIChzdHJ1Y3QgaHcgKmh3LAorICAgICAgc3RydWN0IGh3X2luc3RhbmNlICopOworCitleHRlcm4gdm9pZCBzZXRfaHdfZmluaXNoX2luc3RhbmNlCisoc3RydWN0IGh3ICpodywKKyBod19maW5pc2hfaW5zdGFuY2VfbWV0aG9kICptZXRob2QpOworCisKKy8qIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgaGFyZHdhcmUgKi8KKworc3RydWN0IGh3X2luc3RhbmNlICpod19pbnN0YW5jZV9jcmVhdGUKKyhzdHJ1Y3QgaHcgKmh3LAorIHN0cnVjdCBod19pbnN0YW5jZSAqcGFyZW50LAorIGNvbnN0IGNoYXIgKnBhdGgsCisgY29uc3QgY2hhciAqYXJncyk7CisKK3N0cnVjdCBod19pbnN0YW5jZSAqaHdfaW5zdGFuY2VfaW50ZXJjZWVkCisoc3RydWN0IGh3X2luc3RhbmNlICpwYXJlbnQsCisgY29uc3QgY2hhciAqcGF0aCwKKyBjb25zdCBjaGFyICphcmdzKTsKKwordm9pZCBod19pbnN0YW5jZV9kZWxldGUKKyhzdHJ1Y3QgaHdfaW5zdGFuY2UgKmluc3RhbmNlKTsKKworCisvKiBtZXRob2RzIGFwcGxpZWQgdG8gYW4gaW5zdGFuY2Ugb2YgdGhlIGh3ICovCisKK3R5cGVkZWYgaW50IChod19pbnN0YW5jZV9yZWFkX21ldGhvZCkKKyAgICAgKHN0cnVjdCBod19pbnN0YW5jZSAqaW5zdGFuY2UsCisgICAgICB2b2lkICphZGRyLAorICAgICAgdW5zaWduZWRfY2VsbCBsZW4pOworCisjZGVmaW5lIGh3X2luc3RhbmNlX3JlYWQoaW5zdGFuY2UsIGFkZHIsIGxlbikgXAorKChpbnN0YW5jZSktPnRvX2luc3RhbmNlX3JlYWQgKChpbnN0YW5jZSksIChhZGRyKSwgKGxlbikpKQorCisjZGVmaW5lIHNldF9od19pbnN0YW5jZV9yZWFkKGluc3RhbmNlLCBtZXRob2QpIFwKKygoaW5zdGFuY2UpLT50b19pbnN0YW5jZV9yZWFkID0gKG1ldGhvZCkpCisKKwordHlwZWRlZiBpbnQgKGh3X2luc3RhbmNlX3dyaXRlX21ldGhvZCkKKyAgICAgKHN0cnVjdCBod19pbnN0YW5jZSAqaW5zdGFuY2UsCisgICAgICBjb25zdCB2b2lkICphZGRyLAorICAgICAgdW5zaWduZWRfY2VsbCBsZW4pOworCisjZGVmaW5lIGh3X2luc3RhbmNlX3dyaXRlKGluc3RhbmNlLCBhZGRyLCBsZW4pIFwKKygoaW5zdGFuY2UpLT50b19pbnN0YW5jZV93cml0ZSAoKGluc3RhbmNlKSwgKGFkZHIpLCAobGVuKSkpCisKKyNkZWZpbmUgc2V0X2h3X2luc3RhbmNlX3dyaXRlKGluc3RhbmNlLCBtZXRob2QpIFwKKygoaW5zdGFuY2UpLT50b19pbnN0YW5jZV93cml0ZSA9IChtZXRob2QpKQorCisKK3R5cGVkZWYgaW50IChod19pbnN0YW5jZV9zZWVrX21ldGhvZCkKKyAgICAgKHN0cnVjdCBod19pbnN0YW5jZSAqaW5zdGFuY2UsCisgICAgICB1bnNpZ25lZF9jZWxsIHBvc19oaSwKKyAgICAgIHVuc2lnbmVkX2NlbGwgcG9zX2xvKTsKKworI2RlZmluZSBod19pbnN0YW5jZV9zZWVrKGluc3RhbmNlLCBwb3NfaGksIHBvc19sbykgXAorKChpbnN0YW5jZSktPnRvX2luc3RhbmNlX3NlZWsgKChpbnN0YW5jZSksIChwb3NfaGkpLCAocG9zX2xvKSkpOworCisjZGVmaW5lIHNldF9od19pbnN0YW5jZV9zZWVrKGluc3RhbmNlLCBtZXRob2QpIFwKKygoaW5zdGFuY2UpLT50b19pbnN0YW5jZV9zZWVrID0gKG1ldGhvZCkpCisKKworaW50IGh3X2luc3RhbmNlX2NhbGxfbWV0aG9kCisoc3RydWN0IGh3X2luc3RhbmNlICppbnN0YW5jZSwKKyBjb25zdCBjaGFyICptZXRob2QsCisgaW50IG5fc3RhY2tfYXJncywKKyB1bnNpZ25lZF9jZWxsIHN0YWNrX2FyZ3NbLypuX3N0YWNrX2FyZ3MgKyAxKE5VTEwpKi9dLAorIGludCBuX3N0YWNrX3JldHVybnMsCisgdW5zaWduZWRfY2VsbCBzdGFja19yZXR1cm5zWy8qbl9zdGFja19yZXR1cm5zICsgMShOVUxMKSovXSk7CisKKworCisvKiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgaW5zdGFuY2UgKi8KKworI2RlZmluZSBod19pbnN0YW5jZV9odyhpbnN0YW5jZSkgKChpbnN0YW5jZSktPmh3X29mX2luc3RhbmNlICsgMCkKKworI2RlZmluZSBod19pbnN0YW5jZV9wYXRoKGluc3RhbmNlKSAoKGluc3RhbmNlKS0+cGF0aF9vZl9pbnN0YW5jZSArIDApCisKKyNkZWZpbmUgaHdfaW5zdGFuY2VfYXJncyhpbnN0YW5jZSkgKChpbnN0YW5jZSktPmFyZ3Nfb2ZfaW5zdGFuY2UpCisKKyNkZWZpbmUgaHdfaW5zdGFuY2VfZGF0YShpbnN0YW5jZSkgKChpbnN0YW5jZSktPmRhdGFfb2ZfaW5zdGFuY2UpCisKKyNkZWZpbmUgaHdfaW5zdGFuY2Vfc3lzdGVtKGluc3RhbmNlKSAoaHdfc3lzdGVtIChod19pbnN0YW5jZV9odyAoaW5zdGFuY2UpKSkKKworCisKKy8qIEZpbmFsbHkgYW4gaW5zdGFuY2Ugb2YgYSBoYXJkd2FyZSBkZXZpY2UgLSBrZWVwIHlvdXIgZ3J1YmJ5IGxpdHRsZQorICAgbWl0cyBvZmYgb2YgdGhlc2UgaW50ZXJuYWxzISA6LSkgKi8KKworc3RydWN0IGh3X2luc3RhbmNlIHsKKworICB2b2lkICpkYXRhX29mX2luc3RhbmNlOworICBjaGFyICphcmdzX29mX2luc3RhbmNlOworICBjaGFyICpwYXRoX29mX2luc3RhbmNlOworCisgIC8qIHRoZSBkZXZpY2UgdGhhdCBvd25zIHRoZSBpbnN0YW5jZSAqLworICBzdHJ1Y3QgaHcgKmh3X29mX2luc3RhbmNlOworICBzdHJ1Y3QgaHdfaW5zdGFuY2UgKnNpYmxpbmdfb2ZfaW5zdGFuY2U7CisKKyAgLyogaW50ZXJwb3NlZCBpbnN0YW5jZSAqLworICBzdHJ1Y3QgaHdfaW5zdGFuY2UgKnBhcmVudF9vZl9pbnN0YW5jZTsKKyAgc3RydWN0IGh3X2luc3RhbmNlICpjaGlsZF9vZl9pbnN0YW5jZTsKKworICAvKiBtZXRob2RzICovCisgIGh3X2luc3RhbmNlX3JlYWRfbWV0aG9kICp0b19pbnN0YW5jZV9yZWFkOworICBod19pbnN0YW5jZV93cml0ZV9tZXRob2QgKnRvX2luc3RhbmNlX3dyaXRlOworICBod19pbnN0YW5jZV9zZWVrX21ldGhvZCAqdG9faW5zdGFuY2Vfc2VlazsKKworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL2h3LW1haW4uaCBiL3NpbS9jb21tb24vaHctbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMDg2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL2h3LW1haW4uaApAQCAtMCwwICsxLDczIEBACisvKiBDb21tb24gaGFyZHdhcmUgaGVhZGVyIGZpbGUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBBbmRyZXcgQ2FnbmV5IGFuZCBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNpZm5kZWYgSFdfTUFJTgorI2RlZmluZSBIV19NQUlOCisKKy8qIGVzdGFibGlzaCBhIHR5cGUgc3lzdGVtICovCisjaW5jbHVkZSAic2ltLWJhc2ljcy5oIgorCisvKiBjb25zdHJ1Y3QgYSBodyBkZXZpY2UgKi8KKyNpbmNsdWRlICJody1kZXZpY2UuaCIKKyNpbmNsdWRlICJody1wcm9wZXJ0aWVzLmgiCisjaW5jbHVkZSAiaHctZXZlbnRzLmgiCisjaW5jbHVkZSAiaHctYWxsb2MuaCIKKyNpbmNsdWRlICJody1pbnN0YW5jZXMuaCIKKyNpbmNsdWRlICJody1oYW5kbGVzLmgiCisjaW5jbHVkZSAiaHctcG9ydHMuaCIKKworLyogRGVzY3JpcHRpb24gb2YgYSBoYXJkd2FyZSBkZXZpY2UgKi8KKwordHlwZWRlZiB2b2lkIChod19maW5pc2hfbWV0aG9kKQorICAgICAoc3RydWN0IGh3ICptZSk7CisKK3N0cnVjdCBod19kZXNjcmlwdG9yIHsKKyAgY29uc3QgY2hhciAqZmFtaWx5OworICBod19maW5pc2hfbWV0aG9kICp0b19maW5pc2g7Cit9OworCisvKiBIZWxwZXIgZnVuY3Rpb25zIHRvIG1ha2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgZGV2aWNlIGVhc2llciAqLworCisvKiBHbyB0aHJvdWdoIHRoZSBkZXZpY2VzIHJlZyBwcm9wZXJ0aWVzIGFuZCBsb29rIGZvciB0aG9zZSBzcGVjaWZ5aW5nCisgICBhbiBhZGRyZXNzIHRvIGF0dGFjaCB2YXJpb3VzIHJlZ2lzdGVycyB0byAqLworCit2b2lkIGRvX2h3X2F0dGFjaF9yZWdzIChzdHJ1Y3QgaHcgKm1lKTsKKworLyogUGVyZm9ybSBhIHBvbGxpbmcgcmVhZCBvbiBGRCByZXR1cm5pbmcgZWl0aGVyIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgIG9yIGEgaHdfaW8gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIHJlYXNvbiBmb3IgdGhlIHJlYWQKKyAgIGZhaWx1cmUgKi8KKworZW51bSB7CisgIEhXX0lPX0VPRiA9IC0xLCBIV19JT19OT1RfUkVBRFkgPSAtMiwgLyogU2VlOiBJRUVFIDEyNzUgKi8KK307CisKK3R5cGVkZWYgaW50IChkb19od19wb2xsX3JlYWRfbWV0aG9kKQorICAgICAoU0lNX0RFU0Mgc2QsIGludCwgY2hhciAqLCBpbnQpOworCitpbnQgZG9faHdfcG9sbF9yZWFkCisoc3RydWN0IGh3ICptZSwKKyBkb19od19wb2xsX3JlYWRfbWV0aG9kICpyZWFkLAorIGludCBzaW1faW9fZmQsCisgdm9pZCAqYnVmLAorIHVuc2lnbmVkIHNpemVfb2ZfYnVmKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vaHctcG9ydHMuYyBiL3NpbS9jb21tb24vaHctcG9ydHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2RjOTg1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9ody1wb3J0cy5jCkBAIC0wLDAgKzEsMzM5IEBACisvKiBIYXJkd2FyZSBwb3J0cy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEFuZHJldyBDYWduZXkgYW5kIEN5Z251cyBTb2x1dGlvbnMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisjaW5jbHVkZSAiaHctbWFpbi5oIgorI2luY2x1ZGUgImh3LWJhc2UuaCIKKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjZGVmaW5lIFRSQUNFKHgseSkKKworCitzdHJ1Y3QgaHdfcG9ydF9lZGdlIHsKKyAgaW50IG15X3BvcnQ7CisgIHN0cnVjdCBodyAqZGVzdDsKKyAgaW50IGRlc3RfcG9ydDsKKyAgc3RydWN0IGh3X3BvcnRfZWRnZSAqbmV4dDsKKyAgb2JqZWN0X2Rpc3Bvc2l0aW9uIGRpc3Bvc2l0aW9uOworfTsKKworc3RydWN0IGh3X3BvcnRfZGF0YSB7CisgIGh3X3BvcnRfZXZlbnRfbWV0aG9kICp0b19wb3J0X2V2ZW50OworICBjb25zdCBzdHJ1Y3QgaHdfcG9ydF9kZXNjcmlwdG9yICpwb3J0czsKKyAgc3RydWN0IGh3X3BvcnRfZWRnZSAqZWRnZXM7Cit9OworCitjb25zdCBzdHJ1Y3QgaHdfcG9ydF9kZXNjcmlwdG9yIGVtcHR5X2h3X3BvcnRzW10gPSB7CisgIHsgTlVMTCwgfSwKK307CisKK3N0YXRpYyB2b2lkCitwYW5pY19od19wb3J0X2V2ZW50IChzdHJ1Y3QgaHcgKm1lLAorCQkgICAgIGludCBteV9wb3J0LAorCQkgICAgIHN0cnVjdCBodyAqc291cmNlLAorCQkgICAgIGludCBzb3VyY2VfcG9ydCwKKwkJICAgICBpbnQgbGV2ZWwpCit7CisgIGh3X2Fib3J0IChtZSwgIm5vIHBvcnQgbWV0aG9kIik7Cit9CisKK3ZvaWQKK2NyZWF0ZV9od19wb3J0X2RhdGEgKHN0cnVjdCBodyAqbWUpCit7CisgIG1lLT5wb3J0c19vZl9odyA9IEhXX1pBTExPQyAobWUsIHN0cnVjdCBod19wb3J0X2RhdGEpOworICBzZXRfaHdfcG9ydF9ldmVudCAobWUsIHBhbmljX2h3X3BvcnRfZXZlbnQpOworICBzZXRfaHdfcG9ydHMgKG1lLCBlbXB0eV9od19wb3J0cyk7Cit9CisKK3ZvaWQKK2RlbGV0ZV9od19wb3J0X2RhdGEgKHN0cnVjdCBodyAqbWUpCit7CisgIGh3X2ZyZWUgKG1lLCBtZS0+cG9ydHNfb2ZfaHcpOworICBtZS0+cG9ydHNfb2ZfaHcgPSBOVUxMOworfQorCit2b2lkCitzZXRfaHdfcG9ydHMgKHN0cnVjdCBodyAqbWUsCisJICAgICAgY29uc3Qgc3RydWN0IGh3X3BvcnRfZGVzY3JpcHRvciBwb3J0c1tdKQoreworICBtZS0+cG9ydHNfb2ZfaHctPnBvcnRzID0gcG9ydHM7Cit9CisKK3ZvaWQKK3NldF9od19wb3J0X2V2ZW50IChzdHJ1Y3QgaHcgKm1lLAorCQkgICBod19wb3J0X2V2ZW50X21ldGhvZCAqcG9ydF9ldmVudCkKK3sKKyAgbWUtPnBvcnRzX29mX2h3LT50b19wb3J0X2V2ZW50ID0gcG9ydF9ldmVudDsKK30KKworCitzdGF0aWMgdm9pZAorYXR0YWNoX2h3X3BvcnRfZWRnZSAoc3RydWN0IGh3ICptZSwKKwkJICAgICBzdHJ1Y3QgaHdfcG9ydF9lZGdlICoqbGlzdCwKKwkJICAgICBpbnQgbXlfcG9ydCwKKwkJICAgICBzdHJ1Y3QgaHcgKmRlc3QsCisJCSAgICAgaW50IGRlc3RfcG9ydCwKKwkJICAgICBvYmplY3RfZGlzcG9zaXRpb24gZGlzcG9zaXRpb24pCit7CisgIHN0cnVjdCBod19wb3J0X2VkZ2UgKm5ld19lZGdlID0gSFdfWkFMTE9DIChtZSwgc3RydWN0IGh3X3BvcnRfZWRnZSk7CisgIG5ld19lZGdlLT5teV9wb3J0ID0gbXlfcG9ydDsKKyAgbmV3X2VkZ2UtPmRlc3QgPSBkZXN0OworICBuZXdfZWRnZS0+ZGVzdF9wb3J0ID0gZGVzdF9wb3J0OworICBuZXdfZWRnZS0+bmV4dCA9ICpsaXN0OworICBuZXdfZWRnZS0+ZGlzcG9zaXRpb24gPSBkaXNwb3NpdGlvbjsKKyAgKmxpc3QgPSBuZXdfZWRnZTsKK30KKworCitzdGF0aWMgdm9pZAorZGV0YWNoX2h3X3BvcnRfZWRnZSAoc3RydWN0IGh3ICptZSwKKwkJICAgICBzdHJ1Y3QgaHdfcG9ydF9lZGdlICoqbGlzdCwKKwkJICAgICBpbnQgbXlfcG9ydCwKKwkJICAgICBzdHJ1Y3QgaHcgKmRlc3QsCisJCSAgICAgaW50IGRlc3RfcG9ydCkKK3sKKyAgd2hpbGUgKCpsaXN0ICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IGh3X3BvcnRfZWRnZSAqb2xkX2VkZ2UgPSAqbGlzdDsKKyAgICAgIGlmIChvbGRfZWRnZS0+ZGVzdCA9PSBkZXN0CisJICAmJiBvbGRfZWRnZS0+ZGVzdF9wb3J0ID09IGRlc3RfcG9ydAorCSAgJiYgb2xkX2VkZ2UtPm15X3BvcnQgPT0gbXlfcG9ydCkKKwl7CisJICBpZiAob2xkX2VkZ2UtPmRpc3Bvc2l0aW9uID09IHBlcm1lbmFudF9vYmplY3QpCisJICAgIGh3X2Fib3J0IChtZSwgImF0dGVtcHQgdG8gZGVsZXRlIHBlcm1lbmFudCBwb3J0IGVkZ2UiKTsKKwkgICpsaXN0ID0gb2xkX2VkZ2UtPm5leHQ7CisJICBod19mcmVlIChtZSwgb2xkX2VkZ2UpOworCSAgcmV0dXJuOworCX0KKyAgICB9CisgIGh3X2Fib3J0IChtZSwgImF0dGVtcHQgdG8gZGVsZXRlIHVuYXR0YWNoZWQgcG9ydCIpOworfQorCisKKyNpZiAwCitzdGF0aWMgdm9pZAorY2xlYW5faHdfcG9ydF9lZGdlcyAoc3RydWN0IGh3X3BvcnRfZWRnZSAqKmxpc3QpCit7CisgIHdoaWxlICgqbGlzdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBod19wb3J0X2VkZ2UgKm9sZF9lZGdlID0gKmxpc3Q7CisgICAgICBzd2l0Y2ggKG9sZF9lZGdlLT5kaXNwb3NpdGlvbikKKwl7CisJY2FzZSBwZXJtZW5hbnRfb2JqZWN0OgorCSAgbGlzdCA9ICZvbGRfZWRnZS0+bmV4dDsKKwkgIGJyZWFrOworCWNhc2UgdGVtcG9yYXJ5X29iamVjdDoKKwkgICpsaXN0ID0gb2xkX2VkZ2UtPm5leHQ7CisJICBod19mcmVlIChtZSwgb2xkX2VkZ2UpOworCSAgYnJlYWs7CisJfQorICAgIH0KK30KKyNlbmRpZgorCisKKy8qIFBvcnRzOiAqLworCit2b2lkCitod19wb3J0X2V2ZW50IChzdHJ1Y3QgaHcgKm1lLAorCSAgICAgICBpbnQgbXlfcG9ydCwKKwkgICAgICAgaW50IGxldmVsKQoreworICBpbnQgZm91bmRfYW5fZWRnZSA9IDA7CisgIHN0cnVjdCBod19wb3J0X2VkZ2UgKmVkZ2U7CisgIC8qIGRldmljZSdzIGxpbmVzIGRpcmVjdGx5IGNvbm5lY3RlZCAqLworICBmb3IgKGVkZ2UgPSBtZS0+cG9ydHNfb2ZfaHctPmVkZ2VzOworICAgICAgIGVkZ2UgIT0gTlVMTDsKKyAgICAgICBlZGdlID0gZWRnZS0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoZWRnZS0+bXlfcG9ydCA9PSBteV9wb3J0KQorCXsKKwkgIGVkZ2UtPmRlc3QtPnBvcnRzX29mX2h3LT50b19wb3J0X2V2ZW50IChlZGdlLT5kZXN0LAorCQkJCQkJICBlZGdlLT5kZXN0X3BvcnQsCisJCQkJCQkgIG1lLAorCQkJCQkJICBteV9wb3J0LAorCQkJCQkJICBsZXZlbCk7CisJICBmb3VuZF9hbl9lZGdlID0gMTsKKwl9CisgICAgfQorICBpZiAoIWZvdW5kX2FuX2VkZ2UpCisgICAgaHdfYWJvcnQgKG1lLCAiTm8gZWRnZSBmb3IgcG9ydCAlZCIsIG15X3BvcnQpOworfQorCisKK3ZvaWQKK2h3X3BvcnRfYXR0YWNoIChzdHJ1Y3QgaHcgKm1lLAorCQlpbnQgbXlfcG9ydCwKKwkJc3RydWN0IGh3ICpkZXN0LAorCQlpbnQgZGVzdF9wb3J0LAorCQlvYmplY3RfZGlzcG9zaXRpb24gZGlzcG9zaXRpb24pCit7CisgIGF0dGFjaF9od19wb3J0X2VkZ2UgKG1lLAorCQkgICAgICAgJm1lLT5wb3J0c19vZl9ody0+ZWRnZXMsCisJCSAgICAgICBteV9wb3J0LAorCQkgICAgICAgZGVzdCwKKwkJICAgICAgIGRlc3RfcG9ydCwKKwkJICAgICAgIGRpc3Bvc2l0aW9uKTsKK30KKworCit2b2lkCitod19wb3J0X2RldGFjaCAoc3RydWN0IGh3ICptZSwKKwkJaW50IG15X3BvcnQsCisJCXN0cnVjdCBodyAqZGVzdCwKKwkJaW50IGRlc3RfcG9ydCkKK3sKKyAgZGV0YWNoX2h3X3BvcnRfZWRnZSAobWUsCisJCSAgICAgICAmbWUtPnBvcnRzX29mX2h3LT5lZGdlcywKKwkJICAgICAgIG15X3BvcnQsCisJCSAgICAgICBkZXN0LAorCQkgICAgICAgZGVzdF9wb3J0KTsKK30KKworCit2b2lkCitod19wb3J0X3RyYXZlcnNlIChzdHJ1Y3QgaHcgKm1lLAorCQkgIGh3X3BvcnRfdHJhdmVyc2VfZnVuY3Rpb24gKmhhbmRsZXIsCisJCSAgdm9pZCAqZGF0YSkKK3sKKyAgc3RydWN0IGh3X3BvcnRfZWRnZSAqcG9ydF9lZGdlOworICBmb3IgKHBvcnRfZWRnZSA9IG1lLT5wb3J0c19vZl9ody0+ZWRnZXM7CisgICAgICAgcG9ydF9lZGdlICE9IE5VTEw7CisgICAgICAgcG9ydF9lZGdlID0gcG9ydF9lZGdlLT5uZXh0KQorICAgIHsKKyAgICAgIGhhbmRsZXIgKG1lLCBwb3J0X2VkZ2UtPm15X3BvcnQsCisJICAgICAgIHBvcnRfZWRnZS0+ZGVzdCwgcG9ydF9lZGdlLT5kZXN0X3BvcnQsCisJICAgICAgIGRhdGEpOworICAgIH0KK30KKworCitpbnQKK2h3X3BvcnRfZGVjb2RlIChzdHJ1Y3QgaHcgKm1lLAorCQljb25zdCBjaGFyICpwb3J0X25hbWUsCisJCXBvcnRfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgaWYgKHBvcnRfbmFtZSA9PSBOVUxMIHx8IHBvcnRfbmFtZVswXSA9PSAnXDAnKQorICAgIHJldHVybiAwOworICBpZiAoaXNkaWdpdChwb3J0X25hbWVbMF0pKQorICAgIHsKKyAgICAgIHJldHVybiBzdHJ0b3VsIChwb3J0X25hbWUsIE5VTEwsIDApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbnN0IHN0cnVjdCBod19wb3J0X2Rlc2NyaXB0b3IgKnBvcnRzID0KKwltZS0+cG9ydHNfb2ZfaHctPnBvcnRzOworICAgICAgaWYgKHBvcnRzICE9IE5VTEwpIAorCXsKKwkgIHdoaWxlIChwb3J0cy0+bmFtZSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgaWYgKHBvcnRzLT5kaXJlY3Rpb24gPT0gYmlkaXJlY3RfcG9ydAorCQkgIHx8IHBvcnRzLT5kaXJlY3Rpb24gPT0gZGlyZWN0aW9uKQorCQl7CisJCSAgaWYgKHBvcnRzLT5ucl9wb3J0cyA+IDApCisJCSAgICB7CisJCSAgICAgIGludCBsZW4gPSBzdHJsZW4gKHBvcnRzLT5uYW1lKTsKKwkJICAgICAgaWYgKHN0cm5jbXAgKHBvcnRfbmFtZSwgcG9ydHMtPm5hbWUsIGxlbikgPT0gMCkKKwkJCXsKKwkJCSAgaWYgKHBvcnRfbmFtZVtsZW5dID09ICdcMCcpCisJCQkgICAgcmV0dXJuIHBvcnRzLT5udW1iZXI7CisJCQkgIGVsc2UgaWYoaXNkaWdpdCAocG9ydF9uYW1lW2xlbl0pKQorCQkJICAgIHsKKwkJCSAgICAgIGludCBwb3J0ID0gKHBvcnRzLT5udW1iZXIKKwkJCQkJICArIHN0cnRvdWwgKCZwb3J0X25hbWVbbGVuXSwgTlVMTCwgMCkpOworCQkJICAgICAgaWYgKHBvcnQgPj0gcG9ydHMtPm51bWJlciArIHBvcnRzLT5ucl9wb3J0cykKKwkJCQlod19hYm9ydCAobWUsCisJCQkJCSAgIlBvcnQgJXMgb3V0IG9mIHJhbmdlIiwKKwkJCQkJICBwb3J0X25hbWUpOworCQkJICAgICAgcmV0dXJuIHBvcnQ7CisJCQkgICAgfQorCQkJfQorCQkgICAgfQorCQkgIGVsc2UgaWYgKHN0cmNtcCAocG9ydF9uYW1lLCBwb3J0cy0+bmFtZSkgPT0gMCkKKwkJICAgIHJldHVybiBwb3J0cy0+bnVtYmVyOworCQl9CisJICAgICAgcG9ydHMrKzsKKwkgICAgfQorCX0KKyAgICB9CisgIGh3X2Fib3J0IChtZSwgIlVucmVjb25pemVkIHBvcnQgJXMiLCBwb3J0X25hbWUpOworICByZXR1cm4gMDsKK30KKworCitpbnQKK2h3X3BvcnRfZW5jb2RlIChzdHJ1Y3QgaHcgKm1lLAorCQlpbnQgcG9ydF9udW1iZXIsCisJCWNoYXIgKmJ1ZiwKKwkJaW50IHNpemVvZl9idWYsCisJCXBvcnRfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgY29uc3Qgc3RydWN0IGh3X3BvcnRfZGVzY3JpcHRvciAqcG9ydHMgPSBOVUxMOworICBwb3J0cyA9IG1lLT5wb3J0c19vZl9ody0+cG9ydHM7CisgIGlmIChwb3J0cyAhPSBOVUxMKSB7CisgICAgd2hpbGUgKHBvcnRzLT5uYW1lICE9IE5VTEwpCisgICAgICB7CisJaWYgKHBvcnRzLT5kaXJlY3Rpb24gPT0gYmlkaXJlY3RfcG9ydAorCSAgICB8fCBwb3J0cy0+ZGlyZWN0aW9uID09IGRpcmVjdGlvbikKKwkgIHsKKwkgICAgaWYgKHBvcnRzLT5ucl9wb3J0cyA+IDApCisJICAgICAgeworCQlpZiAocG9ydF9udW1iZXIgPj0gcG9ydHMtPm51bWJlcgorCQkgICAgJiYgcG9ydF9udW1iZXIgPCBwb3J0cy0+bnVtYmVyICsgcG9ydHMtPm5yX3BvcnRzKQorCQkgIHsKKwkJICAgIHN0cmNweSAoYnVmLCBwb3J0cy0+bmFtZSk7CisJCSAgICBzcHJpbnRmIChidWYgKyBzdHJsZW4oYnVmKSwgIiVkIiwgcG9ydF9udW1iZXIgLSBwb3J0cy0+bnVtYmVyKTsKKwkJICAgIGlmIChzdHJsZW4gKGJ1ZikgPj0gc2l6ZW9mX2J1ZikKKwkJICAgICAgaHdfYWJvcnQgKG1lLCAiaHdfcG9ydF9lbmNvZGU6IGJ1ZmZlciBvdmVyZmxvdyIpOworCQkgICAgcmV0dXJuIHN0cmxlbiAoYnVmKTsKKwkJICB9CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlpZiAocG9ydHMtPm51bWJlciA9PSBwb3J0X251bWJlcikKKwkJICB7CisJCSAgICBpZiAoc3RybGVuKHBvcnRzLT5uYW1lKSA+PSBzaXplb2ZfYnVmKQorCQkgICAgICBod19hYm9ydCAobWUsICJod19wb3J0X2VuY29kZTogYnVmZmVyIG92ZXJmbG93Iik7CisJCSAgICBzdHJjcHkoYnVmLCBwb3J0cy0+bmFtZSk7CisJCSAgICByZXR1cm4gc3RybGVuKGJ1Zik7CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKwlwb3J0cysrOworICAgICAgfQorICB9CisgIHNwcmludGYgKGJ1ZiwgIiVkIiwgcG9ydF9udW1iZXIpOworICBpZiAoc3RybGVuKGJ1ZikgPj0gc2l6ZW9mX2J1ZikKKyAgICBod19hYm9ydCAobWUsICJod19wb3J0X2VuY29kZTogYnVmZmVyIG92ZXJmbG93Iik7CisgIHJldHVybiBzdHJsZW4oYnVmKTsKK30KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vaHctcG9ydHMuaCBiL3NpbS9jb21tb24vaHctcG9ydHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjY4OTVhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9ody1wb3J0cy5oCkBAIC0wLDAgKzEsMTI5IEBACisvKiBIYXJkd2FyZSBwb3J0cy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEFuZHJldyBDYWduZXkgYW5kIEN5Z251cyBTb2x1dGlvbnMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisjaWZuZGVmIEhXX1BPUlRTX0gKKyNkZWZpbmUgSFdfUE9SVFNfSAorCisvKiBJbml0aWFsaXplIGEgcG9ydCAqLworCitzdHJ1Y3QgaHdfcG9ydF9kZXNjcmlwdG9yIHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgaW50IG51bWJlcjsgCisgIGludCBucl9wb3J0czsKKyAgcG9ydF9kaXJlY3Rpb24gZGlyZWN0aW9uOworfTsKKwordm9pZCBzZXRfaHdfcG9ydHMgKHN0cnVjdCBodyAqaHcsIGNvbnN0IHN0cnVjdCBod19wb3J0X2Rlc2NyaXB0b3IgcG9ydHNbXSk7CisKK3R5cGVkZWYgdm9pZCAoaHdfcG9ydF9ldmVudF9tZXRob2QpCisgICAgIChzdHJ1Y3QgaHcgKm1lLAorICAgICAgaW50IG15X3BvcnQsCisgICAgICBzdHJ1Y3QgaHcgKnNvdXJjZSwKKyAgICAgIGludCBzb3VyY2VfcG9ydCwKKyAgICAgIGludCBsZXZlbCk7CisKK3ZvaWQgc2V0X2h3X3BvcnRfZXZlbnQgKHN0cnVjdCBodyAqaHcsIGh3X3BvcnRfZXZlbnRfbWV0aG9kICp0b19wb3J0X2V2ZW50KTsKKworCisvKiBQb3J0IHNvdXJjZQorCisgICBBIGRldmljZSBkcml2ZXMgaXRzIG91dHB1dCBwb3J0cyB1c2luZyB0aGUgY2FsbAorCisgICAqLworCit2b2lkIGh3X3BvcnRfZXZlbnQKKyhzdHJ1Y3QgaHcgKm1lLAorIGludCBteV9wb3J0LAorIGludCB2YWx1ZSk7CisKKy8qIFRoaXMgcG9ydCBldmVudCB3aWxsIHRoZW4gYmUgcHJvcG9nYXRlZCB0byBhbnkgYXR0YWNoZWQKKyAgIGRlc3RpbmF0aW9uIHBvcnRzLgorCisgICBBbnkgaW50ZXJwcmV0YXRpb24gb2YgUE9SVCBhbmQgVkFMVUUgaXMgbW9kZWwgZGVwZW5kYW50LiAgQXMgYQorICAgZ3VpZGVsaW5lIHRoZSBmb2xsb3dpbmcgYXJlIHJlY29tbWVuZGVkOiBQQ0kgaW50ZXJydXB0cyBBLUQgc2hvdWxkCisgICBjb3JyZXNwb25kIHRvIHBvcnRzIDAtMzsgbGV2ZWwgc2Vuc2F0aXZlIGludGVycnVwdHMgYmUgcmVxdWVzdGVkCisgICB3aXRoIGEgdmFsdWUgb2Ygb25lIGFuZCB3aXRoZHJhd24gd2l0aCBhIHZhbHVlIG9mIDA7IGVkZ2Ugc2Vuc2F0aXZlCisgICBpbnRlcnJ1cHRzIGFsd2F5cyBoYXZlIGEgdmFsdWUgb2YgMSwgdGhlIGV2ZW50IGl0cyBzZWxmIGlzIHRyZWF0ZWQKKyAgIGFzIHRoZSBpbnRlcnJ1cHQuCisKKworICAgUG9ydCBkZXN0aW5hdGlvbnMKKworICAgQXR0YWNoZWQgdG8gZWFjaCBwb3J0IG9mIGEgZGV2aWNlIGNhbiBiZSB6ZXJvIG9yIG1vcmUKKyAgIGRlc2l0aW5hdGlvbnMuICBUaGVzZSBkZXN0aW5hdGlvbnMgY29uc2lzdCBvZiBhIGRldmljZS9wb3J0IHBhaXIuCisgICBBIGRlc3RpbmF0aW9uIGlzIGF0dGFjaGVkL2RldGFjaGVkIHRvIGEgZGV2aWNlIGxpbmUgdXNpbmcgdGhlCisgICBhdHRhY2ggYW5kIGRldGFjaCBjYWxscy4gKi8KKwordm9pZCBod19wb3J0X2F0dGFjaAorKHN0cnVjdCBodyAqbWUsCisgaW50IG15X3BvcnQsCisgc3RydWN0IGh3ICpkZXN0LAorIGludCBkZXN0X3BvcnQsCisgb2JqZWN0X2Rpc3Bvc2l0aW9uIGRpc3Bvc2l0aW9uKTsKKwordm9pZCBod19wb3J0X2RldGFjaAorKHN0cnVjdCBodyAqbWUsCisgaW50IG15X3BvcnQsCisgc3RydWN0IGh3ICpkZXN0LAorIGludCBkZXN0X3BvcnQpOworCisKKy8qIEl0ZXJhdGUgb3ZlciB0aGUgbGlzdCBvZiBwb3J0cyBhdHRhY2hlZCB0byBhIGRldmljZSAqLworCit0eXBlZGVmIHZvaWQgKGh3X3BvcnRfdHJhdmVyc2VfZnVuY3Rpb24pCisgICAgIChzdHJ1Y3QgaHcgKm1lLAorICAgICAgaW50IG15X3BvcnQsCisgICAgICBzdHJ1Y3QgaHcgKmRlc3QsCisgICAgICBpbnQgZGVzdF9wb3J0LAorICAgICAgdm9pZCAqZGF0YSk7CisKK3ZvaWQgaHdfcG9ydF90cmF2ZXJzZQorKHN0cnVjdCBodyAqbWUsCisgaHdfcG9ydF90cmF2ZXJzZV9mdW5jdGlvbiAqaGFuZGxlciwKKyB2b2lkICpkYXRhKTsKKyAKKworLyogREVTVElOQVRJT04gaXMgYXR0YWNoZWQgKGRldGFjaGVkKSB0byBMSU5FIG9mIHRoZSBkZXZpY2UgTUUKKworCisgICBQb3J0IGNvbnZlcnNpb24KKworICAgVXNlcnMgcmVmZXIgdG8gcG9ydCBudW1iZXJzIHN5bWJvbGljYWxseS4gIEZvciBpbnN0YW5jZSBhIGRldmljZQorICAgbWF5IHJlZmVyIHRvIGl0cyBgSU5UJyBzaWduYWwgd2hpY2ggaXMgaW50ZXJuYWxseSByZXByZXNlbnRlZCBieQorICAgcG9ydCAzLgorCisgICBUbyBjb252ZXJ0IHRvL2Zyb20gdGhlIHN5bWJvbGljIGFuZCBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhCisgICBwb3J0IG5hbWUvbnVtYmVyLiAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZS4gKi8KKworaW50IGh3X3BvcnRfZGVjb2RlCisoc3RydWN0IGh3ICptZSwKKyBjb25zdCBjaGFyICpzeW1ib2xpY19uYW1lLAorIHBvcnRfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKK2ludCBod19wb3J0X2VuY29kZQorKHN0cnVjdCBodyAqbWUsCisgaW50IHBvcnRfbnVtYmVyLAorIGNoYXIgKmJ1ZiwKKyBpbnQgc2l6ZW9mX2J1ZiwKKyBwb3J0X2RpcmVjdGlvbiBkaXJlY3Rpb24pOworIAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vaHctcHJvcGVydGllcy5jIGIvc2ltL2NvbW1vbi9ody1wcm9wZXJ0aWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlOTI5MQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vaHctcHJvcGVydGllcy5jCkBAIC0wLDAgKzEsOTA1IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworI2luY2x1ZGUgImh3LW1haW4uaCIKKyNpbmNsdWRlICJody1iYXNlLmgiCisKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBUUkFDRShBLEIpCisKKy8qIHByb3BlcnR5IGVudHJpZXMgKi8KKworc3RydWN0IGh3X3Byb3BlcnR5X2RhdGEgeworICBzdHJ1Y3QgaHdfcHJvcGVydHlfZGF0YSAqbmV4dDsKKyAgc3RydWN0IGh3X3Byb3BlcnR5ICpwcm9wZXJ0eTsKKyAgY29uc3Qgdm9pZCAqaW5pdF9hcnJheTsKKyAgdW5zaWduZWQgc2l6ZW9mX2luaXRfYXJyYXk7Cit9OworCit2b2lkCitjcmVhdGVfaHdfcHJvcGVydHlfZGF0YSAoc3RydWN0IGh3ICptZSkKK3sKK30KKwordm9pZAorZGVsZXRlX2h3X3Byb3BlcnR5X2RhdGEgKHN0cnVjdCBodyAqbWUpCit7Cit9CisKKworLyogRGV2aWNlIFByb3BlcnRpZXM6ICovCisKK3N0YXRpYyBzdHJ1Y3QgaHdfcHJvcGVydHlfZGF0YSAqCitmaW5kX3Byb3BlcnR5X2RhdGEgKHN0cnVjdCBodyAqbWUsCisJCSAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSkKK3sKKyAgc3RydWN0IGh3X3Byb3BlcnR5X2RhdGEgKmVudHJ5OworICBBU1NFUlQgKHByb3BlcnR5ICE9IE5VTEwpOworICBlbnRyeSA9IG1lLT5wcm9wZXJ0aWVzX29mX2h3OworICB3aGlsZSAoZW50cnkgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChlbnRyeS0+cHJvcGVydHktPm5hbWUsIHByb3BlcnR5KSA9PSAwKQorCXJldHVybiBlbnRyeTsKKyAgICAgIGVudHJ5ID0gZW50cnktPm5leHQ7CisgICAgfQorICByZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZAoraHdfYWRkX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKm1lLAorCQkgY29uc3QgY2hhciAqcHJvcGVydHksCisJCSBod19wcm9wZXJ0eV90eXBlIHR5cGUsCisJCSBjb25zdCB2b2lkICppbml0X2FycmF5LAorCQkgdW5zaWduZWQgc2l6ZW9mX2luaXRfYXJyYXksCisJCSBjb25zdCB2b2lkICphcnJheSwKKwkJIHVuc2lnbmVkIHNpemVvZl9hcnJheSwKKwkJIGNvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqb3JpZ2luYWwsCisJCSBvYmplY3RfZGlzcG9zaXRpb24gZGlzcG9zaXRpb24pCit7CisgIHN0cnVjdCBod19wcm9wZXJ0eV9kYXRhICpuZXdfZW50cnkgPSBOVUxMOworICBzdHJ1Y3QgaHdfcHJvcGVydHkgKm5ld192YWx1ZSA9IE5VTEw7CisgIAorICAvKiBmaW5kIHRoZSBsaXN0IGVuZCAqLworICBzdHJ1Y3QgaHdfcHJvcGVydHlfZGF0YSAqKmluc2VydGlvbl9wb2ludCA9ICZtZS0+cHJvcGVydGllc19vZl9odzsKKyAgd2hpbGUgKCppbnNlcnRpb25fcG9pbnQgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoc3RyY21wICgoKmluc2VydGlvbl9wb2ludCktPnByb3BlcnR5LT5uYW1lLCBwcm9wZXJ0eSkgPT0gMCkKKwlyZXR1cm47CisgICAgICBpbnNlcnRpb25fcG9pbnQgPSAmKCppbnNlcnRpb25fcG9pbnQpLT5uZXh0OworICAgIH0KKyAgCisgIC8qIGNyZWF0ZSBhIG5ldyB2YWx1ZSAqLworICBuZXdfdmFsdWUgPSBIV19aQUxMT0MgKG1lLCBzdHJ1Y3QgaHdfcHJvcGVydHkpOworICBuZXdfdmFsdWUtPm5hbWUgPSAoY2hhciAqKSBzdHJkdXAgKHByb3BlcnR5KTsKKyAgbmV3X3ZhbHVlLT50eXBlID0gdHlwZTsKKyAgaWYgKHNpemVvZl9hcnJheSA+IDApCisgICAgeworICAgICAgdm9pZCAqbmV3X2FycmF5ID0gaHdfemFsbG9jIChtZSwgc2l6ZW9mX2FycmF5KTsKKyAgICAgIG1lbWNweSAobmV3X2FycmF5LCBhcnJheSwgc2l6ZW9mX2FycmF5KTsKKyAgICAgIG5ld192YWx1ZS0+YXJyYXkgPSBuZXdfYXJyYXk7CisgICAgICBuZXdfdmFsdWUtPnNpemVvZl9hcnJheSA9IHNpemVvZl9hcnJheTsKKyAgICB9CisgIG5ld192YWx1ZS0+b3duZXIgPSBtZTsKKyAgbmV3X3ZhbHVlLT5vcmlnaW5hbCA9IG9yaWdpbmFsOworICBuZXdfdmFsdWUtPmRpc3Bvc2l0aW9uID0gZGlzcG9zaXRpb247CisgIAorICAvKiBpbnNlcnQgdGhlIHZhbHVlIGludG8gdGhlIGxpc3QgKi8KKyAgbmV3X2VudHJ5ID0gSFdfWkFMTE9DIChtZSwgc3RydWN0IGh3X3Byb3BlcnR5X2RhdGEpOworICAqaW5zZXJ0aW9uX3BvaW50ID0gbmV3X2VudHJ5OworICBpZiAoc2l6ZW9mX2luaXRfYXJyYXkgPiAwKQorICAgIHsKKyAgICAgIHZvaWQgKm5ld19pbml0X2FycmF5ID0gaHdfemFsbG9jIChtZSwgc2l6ZW9mX2luaXRfYXJyYXkpOworICAgICAgbWVtY3B5IChuZXdfaW5pdF9hcnJheSwgaW5pdF9hcnJheSwgc2l6ZW9mX2luaXRfYXJyYXkpOworICAgICAgbmV3X2VudHJ5LT5pbml0X2FycmF5ID0gbmV3X2luaXRfYXJyYXk7CisgICAgICBuZXdfZW50cnktPnNpemVvZl9pbml0X2FycmF5ID0gc2l6ZW9mX2luaXRfYXJyYXk7CisgICAgfQorICBuZXdfZW50cnktPnByb3BlcnR5ID0gbmV3X3ZhbHVlOworfQorCisKK3N0YXRpYyB2b2lkCitod19zZXRfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCisJCSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKwkJIGh3X3Byb3BlcnR5X3R5cGUgdHlwZSwKKwkJIGNvbnN0IHZvaWQgKmFycmF5LAorCQkgaW50IHNpemVvZl9hcnJheSkKK3sKKyAgLyogZmluZCB0aGUgcHJvcGVydHkgKi8KKyAgc3RydWN0IGh3X3Byb3BlcnR5X2RhdGEgKmVudHJ5ID0gZmluZF9wcm9wZXJ0eV9kYXRhIChtZSwgcHJvcGVydHkpOworICBpZiAoZW50cnkgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBleGlzdGluZyBwcm9wZXJ0eSAtIHVwZGF0ZSBpdCAqLworICAgICAgdm9pZCAqbmV3X2FycmF5ID0gMDsKKyAgICAgIHN0cnVjdCBod19wcm9wZXJ0eSAqdmFsdWUgPSBlbnRyeS0+cHJvcGVydHk7CisgICAgICAvKiBjaGVjayB0aGUgdHlwZSBtYXRjaGVzICovCisgICAgICBpZiAodmFsdWUtPnR5cGUgIT0gdHlwZSkKKwlod19hYm9ydCAobWUsICJjb25mbGljdCBiZXR3ZWVuIHR5cGUgb2YgbmV3IGFuZCBvbGQgdmFsdWUgZm9yIHByb3BlcnR5ICVzIiwgcHJvcGVydHkpOworICAgICAgLyogcmVwbGFjZSBpdHMgdmFsdWUgKi8KKyAgICAgIGlmICh2YWx1ZS0+YXJyYXkgIT0gTlVMTCkKKwlod19mcmVlIChtZSwgKHZvaWQqKXZhbHVlLT5hcnJheSk7CisgICAgICBuZXdfYXJyYXkgPSAoc2l6ZW9mX2FycmF5ID4gMAorCQkgICA/IGh3X3phbGxvYyAobWUsIHNpemVvZl9hcnJheSkKKwkJICAgOiAodm9pZCopMCk7CisgICAgICB2YWx1ZS0+YXJyYXkgPSBuZXdfYXJyYXk7CisgICAgICB2YWx1ZS0+c2l6ZW9mX2FycmF5ID0gc2l6ZW9mX2FycmF5OworICAgICAgaWYgKHNpemVvZl9hcnJheSA+IDApCisJbWVtY3B5IChuZXdfYXJyYXksIGFycmF5LCBzaXplb2ZfYXJyYXkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIG5ldyBwcm9wZXJ0eSAtIGNyZWF0ZSBpdCAqLworICAgICAgaHdfYWRkX3Byb3BlcnR5IChtZSwgcHJvcGVydHksIHR5cGUsCisJCSAgICAgICBOVUxMLCAwLCBhcnJheSwgc2l6ZW9mX2FycmF5LAorCQkgICAgICAgTlVMTCwgdGVtcG9yYXJ5X29iamVjdCk7CisgICAgfQorfQorCisKKyNpZiAwCitzdGF0aWMgdm9pZAorY2xlYW5faHdfcHJvcGVydGllcyAoc3RydWN0IGh3ICptZSkKK3sKKyAgc3RydWN0IGh3X3Byb3BlcnR5X2RhdGEgKipkZWxldGVfcG9pbnQgPSAmbWUtPnByb3BlcnRpZXNfb2ZfaHc7CisgIHdoaWxlICgqZGVsZXRlX3BvaW50ICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IGh3X3Byb3BlcnR5X2RhdGEgKmN1cnJlbnQgPSAqZGVsZXRlX3BvaW50OworICAgICAgc3dpdGNoIChjdXJyZW50LT5wcm9wZXJ0eS0+ZGlzcG9zaXRpb24pCisJeworCWNhc2UgcGVybWVuYW50X29iamVjdDoKKwkgIC8qIHphcCB0aGUgY3VycmVudCB2YWx1ZSwgd2lsbCBiZSBpbml0aWFsaXplZCBsYXRlciAqLworCSAgQVNTRVJUIChjdXJyZW50LT5pbml0X2FycmF5ICE9IE5VTEwpOworCSAgaWYgKGN1cnJlbnQtPnByb3BlcnR5LT5hcnJheSAhPSBOVUxMKQorCSAgICB7CisJICAgICAgaHdfZnJlZSAobWUsICh2b2lkKiljdXJyZW50LT5wcm9wZXJ0eS0+YXJyYXkpOworCSAgICAgIGN1cnJlbnQtPnByb3BlcnR5LT5hcnJheSA9IE5VTEw7CisJICAgIH0KKwkgIGRlbGV0ZV9wb2ludCA9ICYoKmRlbGV0ZV9wb2ludCktPm5leHQ7CisJICBicmVhazsKKwljYXNlIHRlbXBvcmFyeV9vYmplY3Q6CisJICAvKiB6YXAgdGhlIGFjdHVhbCBwcm9wZXJ0eSwgd2FzIGNyZWF0ZWQgZHVyaW5nIHNpbXVsYXRpb24gcnVuICovCisJICBBU1NFUlQgKGN1cnJlbnQtPmluaXRfYXJyYXkgPT0gTlVMTCk7CisJICAqZGVsZXRlX3BvaW50ID0gY3VycmVudC0+bmV4dDsKKwkgIGlmIChjdXJyZW50LT5wcm9wZXJ0eS0+YXJyYXkgIT0gTlVMTCkKKwkgICAgaHdfZnJlZSAobWUsICh2b2lkKiljdXJyZW50LT5wcm9wZXJ0eS0+YXJyYXkpOworCSAgaHdfZnJlZSAobWUsIGN1cnJlbnQtPnByb3BlcnR5KTsKKwkgIGh3X2ZyZWUgKG1lLCBjdXJyZW50KTsKKwkgIGJyZWFrOworCX0KKyAgICB9Cit9CisjZW5kaWYKKworI2lmIDAKK3ZvaWQKK2h3X2luaXRfc3RhdGljX3Byb3BlcnRpZXMgKFNJTV9ERVNDIHNkLAorCQkJICAgc3RydWN0IGh3ICptZSwKKwkJCSAgIHZvaWQgKmRhdGEpCit7CisgIHN0cnVjdCBod19wcm9wZXJ0eV9kYXRhICpwcm9wZXJ0eTsKKyAgZm9yIChwcm9wZXJ0eSA9IG1lLT5wcm9wZXJ0aWVzX29mX2h3OworICAgICAgIHByb3BlcnR5ICE9IE5VTEw7CisgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS0+bmV4dCkKKyAgICB7CisgICAgICBBU1NFUlQgKHByb3BlcnR5LT5pbml0X2FycmF5ICE9IE5VTEwpOworICAgICAgQVNTRVJUIChwcm9wZXJ0eS0+cHJvcGVydHktPmFycmF5ID09IE5VTEwpOworICAgICAgQVNTRVJUKHByb3BlcnR5LT5wcm9wZXJ0eS0+ZGlzcG9zaXRpb24gPT0gcGVybWVuYW50X29iamVjdCk7CisgICAgICBzd2l0Y2ggKHByb3BlcnR5LT5wcm9wZXJ0eS0+dHlwZSkKKwl7CisJY2FzZSBhcnJheV9wcm9wZXJ0eToKKwljYXNlIGJvb2xlYW5fcHJvcGVydHk6CisJY2FzZSByYW5nZV9hcnJheV9wcm9wZXJ0eToKKwljYXNlIHJlZ19hcnJheV9wcm9wZXJ0eToKKwljYXNlIHN0cmluZ19wcm9wZXJ0eToKKwljYXNlIHN0cmluZ19hcnJheV9wcm9wZXJ0eToKKwljYXNlIGludGVnZXJfcHJvcGVydHk6CisJICAvKiBkZWxldGUgdGhlIHByb3BlcnR5LCBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBvcmlnaW5hbCAqLworCSAgaHdfc2V0X3Byb3BlcnR5IChtZSwgcHJvcGVydHktPnByb3BlcnR5LT5uYW1lLAorCQkJICAgcHJvcGVydHktPnByb3BlcnR5LT50eXBlLAorCQkJICAgcHJvcGVydHktPmluaXRfYXJyYXksCisJCQkgICBwcm9wZXJ0eS0+c2l6ZW9mX2luaXRfYXJyYXkpOworCSAgYnJlYWs7CisjaWYgMAorCWNhc2UgaWhhbmRsZV9wcm9wZXJ0eToKKwkgIGJyZWFrOworI2VuZGlmCisJfQorICAgIH0KK30KKyNlbmRpZgorCisKKyNpZiAwCit2b2lkCitod19pbml0X3J1bnRpbWVfcHJvcGVydGllcyAoU0lNX0RFU0Mgc2QsCisJCQkgICAgc3RydWN0IGh3ICptZSwKKwkJCSAgICB2b2lkICpkYXRhKQoreworICBzdHJ1Y3QgaHdfcHJvcGVydHlfZGF0YSAqcHJvcGVydHk7CisgIGZvciAocHJvcGVydHkgPSBtZS0+cHJvcGVydGllc19vZl9odzsKKyAgICAgICBwcm9wZXJ0eSAhPSBOVUxMOworICAgICAgIHByb3BlcnR5ID0gcHJvcGVydHktPm5leHQpCisgICAgeworICAgICAgc3dpdGNoIChwcm9wZXJ0eS0+cHJvcGVydHktPmRpc3Bvc2l0aW9uKQorCXsKKwljYXNlIHBlcm1lbmFudF9vYmplY3Q6CisJICBzd2l0Y2ggKHByb3BlcnR5LT5wcm9wZXJ0eS0+dHlwZSkKKwkgICAgeworI2lmIDAKKwkgICAgY2FzZSBpaGFuZGxlX3Byb3BlcnR5OgorCSAgICAgIHsKKwkJc3RydWN0IGh3X2luc3RhbmNlICppaGFuZGxlOworCQlpaGFuZGxlX3J1bnRpbWVfcHJvcGVydHlfc3BlYyBzcGVjOworCQlBU1NFUlQgKHByb3BlcnR5LT5pbml0X2FycmF5ICE9IE5VTEwpOworCQlBU1NFUlQgKHByb3BlcnR5LT5wcm9wZXJ0eS0+YXJyYXkgPT0gTlVMTCk7CisJCWh3X2ZpbmRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5IChtZSwgcHJvcGVydHktPnByb3BlcnR5LT5uYW1lLCAmc3BlYyk7CisJCWloYW5kbGUgPSB0cmVlX2luc3RhbmNlIChtZSwgc3BlYy5mdWxsX3BhdGgpOworCQlod19zZXRfaWhhbmRsZV9wcm9wZXJ0eSAobWUsIHByb3BlcnR5LT5wcm9wZXJ0eS0+bmFtZSwgaWhhbmRsZSk7CisJCWJyZWFrOworCSAgICAgIH0KKyNlbmRpZgorCSAgICBjYXNlIGFycmF5X3Byb3BlcnR5OgorCSAgICBjYXNlIGJvb2xlYW5fcHJvcGVydHk6CisJICAgIGNhc2UgcmFuZ2VfYXJyYXlfcHJvcGVydHk6CisJICAgIGNhc2UgaW50ZWdlcl9wcm9wZXJ0eToKKwkgICAgY2FzZSByZWdfYXJyYXlfcHJvcGVydHk6CisJICAgIGNhc2Ugc3RyaW5nX3Byb3BlcnR5OgorCSAgICBjYXNlIHN0cmluZ19hcnJheV9wcm9wZXJ0eToKKwkgICAgICBBU1NFUlQgKHByb3BlcnR5LT5pbml0X2FycmF5ICE9IE5VTEwpOworCSAgICAgIEFTU0VSVCAocHJvcGVydHktPnByb3BlcnR5LT5hcnJheSAhPSBOVUxMKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSB0ZW1wb3Jhcnlfb2JqZWN0OgorCSAgQVNTRVJUIChwcm9wZXJ0eS0+aW5pdF9hcnJheSA9PSBOVUxMKTsKKwkgIEFTU0VSVCAocHJvcGVydHktPnByb3BlcnR5LT5hcnJheSAhPSBOVUxMKTsKKwkgIGJyZWFrOworCX0KKyAgICB9Cit9CisjZW5kaWYKKworCisKK2NvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqCitod19uZXh0X3Byb3BlcnR5IChjb25zdCBzdHJ1Y3QgaHdfcHJvcGVydHkgKnByb3BlcnR5KQoreworICAvKiBmaW5kIHRoZSBwcm9wZXJ0eSBpbiB0aGUgbGlzdCAqLworICBzdHJ1Y3QgaHcgKm93bmVyID0gcHJvcGVydHktPm93bmVyOworICBzdHJ1Y3QgaHdfcHJvcGVydHlfZGF0YSAqZW50cnkgPSBvd25lci0+cHJvcGVydGllc19vZl9odzsKKyAgd2hpbGUgKGVudHJ5ICE9IE5VTEwgJiYgZW50cnktPnByb3BlcnR5ICE9IHByb3BlcnR5KQorICAgIGVudHJ5ID0gZW50cnktPm5leHQ7CisgIC8qIG5vdyByZXR1cm4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0eSAqLworICBBU1NFUlQgKGVudHJ5ICE9IE5VTEwpOyAvKiBtdXN0IGJlIGEgbWVtYmVyISAqLworICBpZiAoZW50cnktPm5leHQgIT0gTlVMTCkKKyAgICByZXR1cm4gZW50cnktPm5leHQtPnByb3BlcnR5OworICBlbHNlCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICoKK2h3X2ZpbmRfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCisJCSAgY29uc3QgY2hhciAqcHJvcGVydHkpCit7CisgIGlmIChtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgZWxzZSBpZiAocHJvcGVydHkgPT0gTlVMTCB8fCBzdHJjbXAgKHByb3BlcnR5LCAiIikgPT0gMCkKKyAgICB7CisgICAgICBpZiAobWUtPnByb3BlcnRpZXNfb2ZfaHcgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKyAgICAgIGVsc2UKKwlyZXR1cm4gbWUtPnByb3BlcnRpZXNfb2ZfaHctPnByb3BlcnR5OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN0cnVjdCBod19wcm9wZXJ0eV9kYXRhICplbnRyeSA9IGZpbmRfcHJvcGVydHlfZGF0YSAobWUsIHByb3BlcnR5KTsKKyAgICAgIGlmIChlbnRyeSAhPSBOVUxMKQorCXJldHVybiBlbnRyeS0+cHJvcGVydHk7CisgICAgfQorICByZXR1cm4gTlVMTDsKK30KKworCit2b2lkCitod19hZGRfYXJyYXlfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCisJCSAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKwkJICAgICAgIGNvbnN0IHZvaWQgKmFycmF5LAorCQkgICAgICAgaW50IHNpemVvZl9hcnJheSkKK3sKKyAgaHdfYWRkX3Byb3BlcnR5IChtZSwgcHJvcGVydHksIGFycmF5X3Byb3BlcnR5LAorCQkgICBhcnJheSwgc2l6ZW9mX2FycmF5LCBhcnJheSwgc2l6ZW9mX2FycmF5LAorCQkgICBOVUxMLCBwZXJtZW5hbnRfb2JqZWN0KTsKK30KKwordm9pZAoraHdfc2V0X2FycmF5X3Byb3BlcnR5IChzdHJ1Y3QgaHcgKm1lLAorCQkgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHksCisJCSAgICAgICBjb25zdCB2b2lkICphcnJheSwKKwkJICAgICAgIGludCBzaXplb2ZfYXJyYXkpCit7CisgIGh3X3NldF9wcm9wZXJ0eSAobWUsIHByb3BlcnR5LCBhcnJheV9wcm9wZXJ0eSwgYXJyYXksIHNpemVvZl9hcnJheSk7Cit9CisKK2NvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqCitod19maW5kX2FycmF5X3Byb3BlcnR5IChzdHJ1Y3QgaHcgKm1lLAorCQkJY29uc3QgY2hhciAqcHJvcGVydHkpCit7CisgIGNvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqbm9kZTsKKyAgbm9kZSA9IGh3X2ZpbmRfcHJvcGVydHkgKG1lLCBwcm9wZXJ0eSk7CisgIGlmIChub2RlID09IE5VTEwpCisgICAgaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCIlc1wiIG5vdCBmb3VuZCIsIHByb3BlcnR5KTsKKyAgaWYgKG5vZGUtPnR5cGUgIT0gYXJyYXlfcHJvcGVydHkpCisgICAgaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCIlc1wiIG9mIHdyb25nIHR5cGUgKGFycmF5KSIsIHByb3BlcnR5KTsKKyAgcmV0dXJuIG5vZGU7Cit9CisKKworCit2b2lkCitod19hZGRfYm9vbGVhbl9wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKKwkJCSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKwkJCSBpbnQgYm9vbGVhbikKK3sKKyAgc2lnbmVkMzIgbmV3X2Jvb2xlYW4gPSAoYm9vbGVhbiA/IC0xIDogMCk7CisgIGh3X2FkZF9wcm9wZXJ0eSAobWUsIHByb3BlcnR5LCBib29sZWFuX3Byb3BlcnR5LAorCQkgICAmbmV3X2Jvb2xlYW4sIHNpemVvZihuZXdfYm9vbGVhbiksCisJCSAgICZuZXdfYm9vbGVhbiwgc2l6ZW9mKG5ld19ib29sZWFuKSwKKwkJICAgTlVMTCwgcGVybWVuYW50X29iamVjdCk7Cit9CisKK2ludAoraHdfZmluZF9ib29sZWFuX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKm1lLAorCQkJICBjb25zdCBjaGFyICpwcm9wZXJ0eSkKK3sKKyAgY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpub2RlOworICB1bnNpZ25lZF9jZWxsIGJvb2xlYW47CisgIG5vZGUgPSBod19maW5kX3Byb3BlcnR5IChtZSwgcHJvcGVydHkpOworICBpZiAobm9kZSA9PSBOVUxMKQorICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBub3QgZm91bmQiLCBwcm9wZXJ0eSk7CisgIGlmIChub2RlLT50eXBlICE9IGJvb2xlYW5fcHJvcGVydHkpCisgICAgaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCIlc1wiIG9mIHdyb25nIHR5cGUgKGJvb2xlYW4pIiwgcHJvcGVydHkpOworICBBU1NFUlQgKHNpemVvZiAoYm9vbGVhbikgPT0gbm9kZS0+c2l6ZW9mX2FycmF5KTsKKyAgbWVtY3B5ICgmYm9vbGVhbiwgbm9kZS0+YXJyYXksIHNpemVvZiAoYm9vbGVhbikpOworICByZXR1cm4gYm9vbGVhbjsKK30KKworCisKKyNpZiAwCit2b2lkCitod19hZGRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKm1lLAorCQkJCSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKwkJCQkgY29uc3QgaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5X3NwZWMgKmloYW5kbGUpCit7CisgIC8qIGVudGVyIHRoZSBmdWxsIHBhdGggYXMgdGhlIGluaXQgYXJyYXkgKi8KKyAgaHdfYWRkX3Byb3BlcnR5IChtZSwgcHJvcGVydHksIGloYW5kbGVfcHJvcGVydHksCisJCSAgIGloYW5kbGUtPmZ1bGxfcGF0aCwgc3RybGVuKGloYW5kbGUtPmZ1bGxfcGF0aCkgKyAxLAorCQkgICBOVUxMLCAwLAorCQkgICBOVUxMLCBwZXJtZW5hbnRfb2JqZWN0KTsKK30KKyNlbmRpZgorCisjaWYgMAordm9pZAoraHdfZmluZF9paGFuZGxlX3J1bnRpbWVfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCisJCQkJICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKwkJCQkgIGloYW5kbGVfcnVudGltZV9wcm9wZXJ0eV9zcGVjICppaGFuZGxlKQoreworICBzdHJ1Y3QgaHdfcHJvcGVydHlfZGF0YSAqZW50cnkgPSBmaW5kX3Byb3BlcnR5X2RhdGEgKG1lLCBwcm9wZXJ0eSk7CisgIFRSQUNFICh0cmFjZV9kZXZpY2VzLAorCSAoImh3X2ZpbmRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5KG1lPTB4JWx4LCBwcm9wZXJ0eT0lcylcbiIsCisJICAobG9uZyltZSwgcHJvcGVydHkpKTsKKyAgaWYgKGVudHJ5ID09IE5VTEwpCisgICAgaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCIlc1wiIG5vdCBmb3VuZCIsIHByb3BlcnR5KTsKKyAgaWYgKGVudHJ5LT5wcm9wZXJ0eS0+dHlwZSAhPSBpaGFuZGxlX3Byb3BlcnR5CisgICAgICB8fCBlbnRyeS0+cHJvcGVydHktPmRpc3Bvc2l0aW9uICE9IHBlcm1lbmFudF9vYmplY3QpCisgICAgaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCIlc1wiIG9mIHdyb25nIHR5cGUiLCBwcm9wZXJ0eSk7CisgIEFTU0VSVCAoZW50cnktPmluaXRfYXJyYXkgIT0gTlVMTCk7CisgIC8qIHRoZSBmdWxsIHBhdGggKi8KKyAgaWhhbmRsZS0+ZnVsbF9wYXRoID0gZW50cnktPmluaXRfYXJyYXk7Cit9CisjZW5kaWYKKworCisKKyNpZiAwCit2b2lkCitod19zZXRfaWhhbmRsZV9wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKKwkJCSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKwkJCSBod19pbnN0YW5jZSAqaWhhbmRsZSkKK3sKKyAgdW5zaWduZWRfY2VsbCBjZWxsczsKKyAgY2VsbHMgPSBIMkJFX2NlbGwgKGh3X2luc3RhbmNlX3RvX2V4dGVybmFsIChpaGFuZGxlKSk7CisgIGh3X3NldF9wcm9wZXJ0eSAobWUsIHByb3BlcnR5LCBpaGFuZGxlX3Byb3BlcnR5LAorCQkgICAmY2VsbHMsIHNpemVvZiAoY2VsbHMpKTsKKwkJICAgICAgCit9CisjZW5kaWYKKworI2lmIDAKK2h3X2luc3RhbmNlICoKK2h3X2ZpbmRfaWhhbmRsZV9wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKKwkJCSAgY29uc3QgY2hhciAqcHJvcGVydHkpCit7CisgIGNvbnN0IGh3X3Byb3BlcnR5X2RhdGEgKm5vZGU7CisgIHVuc2lnbmVkX2NlbGwgaWhhbmRsZTsKKyAgaHdfaW5zdGFuY2UgKmluc3RhbmNlOworCisgIG5vZGUgPSBod19maW5kX3Byb3BlcnR5IChtZSwgcHJvcGVydHkpOworICBpZiAobm9kZSA9PSBOVUxMKQorICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBub3QgZm91bmQiLCBwcm9wZXJ0eSk7CisgIGlmIChub2RlLT50eXBlICE9IGloYW5kbGVfcHJvcGVydHkpCisgICAgaHdfYWJvcnQobWUsICJwcm9wZXJ0eSBcIiVzXCIgb2Ygd3JvbmcgdHlwZSAoaWhhbmRsZSkiLCBwcm9wZXJ0eSk7CisgIGlmIChub2RlLT5hcnJheSA9PSBOVUxMKQorICAgIGh3X2Fib3J0KG1lLCAicnVudGltZSBwcm9wZXJ0eSBcIiVzXCIgbm90IHlldCBpbml0aWFsaXplZCIsIHByb3BlcnR5KTsKKworICBBU1NFUlQgKHNpemVvZihpaGFuZGxlKSA9PSBub2RlLT5zaXplb2ZfYXJyYXkpOworICBtZW1jcHkgKCZpaGFuZGxlLCBub2RlLT5hcnJheSwgc2l6ZW9mKGloYW5kbGUpKTsKKyAgaW5zdGFuY2UgPSBleHRlcm5hbF90b19od19pbnN0YW5jZSAobWUsIEJFMkhfY2VsbChpaGFuZGxlKSk7CisgIEFTU0VSVCAoaW5zdGFuY2UgIT0gTlVMTCk7CisgIHJldHVybiBpbnN0YW5jZTsKK30KKyNlbmRpZgorCisKK3ZvaWQKK2h3X2FkZF9pbnRlZ2VyX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKm1lLAorCQkJIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorCQkJIHNpZ25lZF9jZWxsIGludGVnZXIpCit7CisgIEgyQkUgKGludGVnZXIpOworICBod19hZGRfcHJvcGVydHkgKG1lLCBwcm9wZXJ0eSwgaW50ZWdlcl9wcm9wZXJ0eSwKKwkJICAgJmludGVnZXIsIHNpemVvZihpbnRlZ2VyKSwKKwkJICAgJmludGVnZXIsIHNpemVvZihpbnRlZ2VyKSwKKwkJICAgTlVMTCwgcGVybWVuYW50X29iamVjdCk7Cit9CisKK3NpZ25lZF9jZWxsCitod19maW5kX2ludGVnZXJfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCisJCQkgIGNvbnN0IGNoYXIgKnByb3BlcnR5KQoreworICBjb25zdCBzdHJ1Y3QgaHdfcHJvcGVydHkgKm5vZGU7CisgIHNpZ25lZF9jZWxsIGludGVnZXI7CisgIFRSQUNFICh0cmFjZV9kZXZpY2VzLAorCSAoImh3X2ZpbmRfaW50ZWdlcihtZT0weCVseCwgcHJvcGVydHk9JXMpXG4iLAorCSAgKGxvbmcpbWUsIHByb3BlcnR5KSk7CisgIG5vZGUgPSBod19maW5kX3Byb3BlcnR5IChtZSwgcHJvcGVydHkpOworICBpZiAobm9kZSA9PSBOVUxMKQorICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBub3QgZm91bmQiLCBwcm9wZXJ0eSk7CisgIGlmIChub2RlLT50eXBlICE9IGludGVnZXJfcHJvcGVydHkpCisgICAgaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCIlc1wiIG9mIHdyb25nIHR5cGUgKGludGVnZXIpIiwgcHJvcGVydHkpOworICBBU1NFUlQgKHNpemVvZihpbnRlZ2VyKSA9PSBub2RlLT5zaXplb2ZfYXJyYXkpOworICBtZW1jcHkgKCZpbnRlZ2VyLCBub2RlLT5hcnJheSwgc2l6ZW9mIChpbnRlZ2VyKSk7CisgIHJldHVybiBCRTJIX2NlbGwgKGludGVnZXIpOworfQorCitpbnQKK2h3X2ZpbmRfaW50ZWdlcl9hcnJheV9wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKKwkJCQljb25zdCBjaGFyICpwcm9wZXJ0eSwKKwkJCQl1bnNpZ25lZCBpbmRleCwKKwkJCQlzaWduZWRfY2VsbCAqaW50ZWdlcikKK3sKKyAgY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpub2RlOworICBpbnQgc2l6ZW9mX2ludGVnZXIgPSBzaXplb2YgKCppbnRlZ2VyKTsKKyAgc2lnbmVkX2NlbGwgKmNlbGw7CisgIFRSQUNFICh0cmFjZV9kZXZpY2VzLAorCSAoImh3X2ZpbmRfaW50ZWdlcihtZT0weCVseCwgcHJvcGVydHk9JXMpXG4iLAorCSAgKGxvbmcpbWUsIHByb3BlcnR5KSk7CisgIAorICAvKiBjaGVjayB0aGluZ3Mgc2FuZSAqLworICBub2RlID0gaHdfZmluZF9wcm9wZXJ0eSAobWUsIHByb3BlcnR5KTsKKyAgaWYgKG5vZGUgPT0gTlVMTCkKKyAgICBod19hYm9ydCAobWUsICJwcm9wZXJ0eSBcIiVzXCIgbm90IGZvdW5kIiwgcHJvcGVydHkpOworICBpZiAobm9kZS0+dHlwZSAhPSBpbnRlZ2VyX3Byb3BlcnR5CisgICAgICAmJiBub2RlLT50eXBlICE9IGFycmF5X3Byb3BlcnR5KQorICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBvZiB3cm9uZyB0eXBlIChpbnRlZ2VyIG9yIGFycmF5KSIsIHByb3BlcnR5KTsKKyAgaWYgKChub2RlLT5zaXplb2ZfYXJyYXkgJSBzaXplb2ZfaW50ZWdlcikgIT0gMCkKKyAgICBod19hYm9ydCAobWUsICJwcm9wZXJ0eSBcIiVzXCIgY29udGFpbnMgYW4gaW5jb21wbGV0ZSBudW1iZXIgb2YgY2VsbHMiLCBwcm9wZXJ0eSk7CisgIGlmIChub2RlLT5zaXplb2ZfYXJyYXkgPD0gc2l6ZW9mX2ludGVnZXIgKiBpbmRleCkKKyAgICByZXR1cm4gMDsKKyAgCisgIC8qIEZpbmQgYW5kIGNvbnZlcnQgdGhlIHZhbHVlICovCisgIGNlbGwgPSAoKHNpZ25lZF9jZWxsKilub2RlLT5hcnJheSkgKyBpbmRleDsKKyAgKmludGVnZXIgPSBCRTJIX2NlbGwgKCpjZWxsKTsKKyAgCisgIHJldHVybiBub2RlLT5zaXplb2ZfYXJyYXkgLyBzaXplb2ZfaW50ZWdlcjsKK30KKworCitzdGF0aWMgdW5zaWduZWRfY2VsbCAqCit1bml0X2FkZHJlc3NfdG9fY2VsbHMgKGNvbnN0IGh3X3VuaXQgKnVuaXQsCisJCSAgICAgICB1bnNpZ25lZF9jZWxsICpjZWxsLAorCQkgICAgICAgaW50IG5yX2NlbGxzKQoreworICBpbnQgaTsKKyAgQVNTRVJUKG5yX2NlbGxzID09IHVuaXQtPm5yX2NlbGxzKTsKKyAgZm9yIChpID0gMDsgaSA8IHVuaXQtPm5yX2NlbGxzOyBpKyspCisgICAgeworICAgICAgKmNlbGwgPSBIMkJFX2NlbGwgKHVuaXQtPmNlbGxzW2ldKTsKKyAgICAgIGNlbGwgKz0gMTsKKyAgICB9CisgIHJldHVybiBjZWxsOworfQorCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZF9jZWxsICoKK2NlbGxzX3RvX3VuaXRfYWRkcmVzcyAoY29uc3QgdW5zaWduZWRfY2VsbCAqY2VsbCwKKwkJICAgICAgIGh3X3VuaXQgKnVuaXQsCisJCSAgICAgICBpbnQgbnJfY2VsbHMpCit7CisgIGludCBpOworICBtZW1zZXQodW5pdCwgMCwgc2l6ZW9mKCp1bml0KSk7CisgIHVuaXQtPm5yX2NlbGxzID0gbnJfY2VsbHM7CisgIGZvciAoaSA9IDA7IGkgPCB1bml0LT5ucl9jZWxsczsgaSsrKQorICAgIHsKKyAgICAgIHVuaXQtPmNlbGxzW2ldID0gQkUySF9jZWxsICgqY2VsbCk7CisgICAgICBjZWxsICs9IDE7CisgICAgfQorICByZXR1cm4gY2VsbDsKK30KKworCitzdGF0aWMgdW5zaWduZWQKK25yX3JhbmdlX3Byb3BlcnR5X2NlbGxzIChzdHJ1Y3QgaHcgKm1lLAorCQkJIGludCBucl9yYW5nZXMpCit7CisgIHJldHVybiAoKGh3X3VuaXRfbnJfYWRkcmVzc19jZWxscyAobWUpCisJICAgKyBod191bml0X25yX2FkZHJlc3NfY2VsbHMgKGh3X3BhcmVudCAobWUpKQorCSAgICsgaHdfdW5pdF9ucl9zaXplX2NlbGxzIChtZSkpCisJICApICogbnJfcmFuZ2VzOworfQorCit2b2lkCitod19hZGRfcmFuZ2VfYXJyYXlfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCisJCQkgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorCQkJICAgICBjb25zdCByYW5nZV9wcm9wZXJ0eV9zcGVjICpyYW5nZXMsCisJCQkgICAgIHVuc2lnbmVkIG5yX3JhbmdlcykKK3sKKyAgdW5zaWduZWQgc2l6ZW9mX2NlbGxzID0gKG5yX3JhbmdlX3Byb3BlcnR5X2NlbGxzIChtZSwgbnJfcmFuZ2VzKQorCQkJICAgKiBzaXplb2YgKHVuc2lnbmVkX2NlbGwpKTsKKyAgdW5zaWduZWRfY2VsbCAqY2VsbHMgPSBod196YWxsb2MgKG1lLCBzaXplb2ZfY2VsbHMpOworICB1bnNpZ25lZF9jZWxsICpjZWxsOworICBpbnQgaTsKKyAgCisgIC8qIGNvcHkgdGhlIHByb3BlcnR5IGVsZW1lbnRzIG92ZXIgKi8KKyAgY2VsbCA9IGNlbGxzOworICBmb3IgKGkgPSAwOyBpIDwgbnJfcmFuZ2VzOyBpKyspCisgICAgeworICAgICAgY29uc3QgcmFuZ2VfcHJvcGVydHlfc3BlYyAqcmFuZ2UgPSAmcmFuZ2VzW2ldOworICAgICAgLyogY29weSB0aGUgY2hpbGQgYWRkcmVzcyAqLworICAgICAgY2VsbCA9IHVuaXRfYWRkcmVzc190b19jZWxscyAoJnJhbmdlLT5jaGlsZF9hZGRyZXNzLCBjZWxsLAorCQkJCSAgICBod191bml0X25yX2FkZHJlc3NfY2VsbHMgKG1lKSk7CisgICAgICAvKiBjb3B5IHRoZSBwYXJlbnQgYWRkcmVzcyAqLworICAgICAgY2VsbCA9IHVuaXRfYWRkcmVzc190b19jZWxscyAoJnJhbmdlLT5wYXJlbnRfYWRkcmVzcywgY2VsbCwgCisJCQkJICAgIGh3X3VuaXRfbnJfYWRkcmVzc19jZWxscyAoaHdfcGFyZW50IChtZSkpKTsKKyAgICAgIC8qIGNvcHkgdGhlIHNpemUgKi8KKyAgICAgIGNlbGwgPSB1bml0X2FkZHJlc3NfdG9fY2VsbHMgKCZyYW5nZS0+c2l6ZSwgY2VsbCwgCisJCQkJICAgIGh3X3VuaXRfbnJfc2l6ZV9jZWxscyAobWUpKTsKKyAgICB9CisgIEFTU0VSVCAoY2VsbCA9PSAmY2VsbHNbbnJfcmFuZ2VfcHJvcGVydHlfY2VsbHMgKG1lLCBucl9yYW5nZXMpXSk7CisgIAorICAvKiBhZGQgaXQgKi8KKyAgaHdfYWRkX3Byb3BlcnR5IChtZSwgcHJvcGVydHksIHJhbmdlX2FycmF5X3Byb3BlcnR5LAorCQkgICBjZWxscywgc2l6ZW9mX2NlbGxzLAorCQkgICBjZWxscywgc2l6ZW9mX2NlbGxzLAorCQkgICBOVUxMLCBwZXJtZW5hbnRfb2JqZWN0KTsKKyAgCisgIGh3X2ZyZWUgKG1lLCBjZWxscyk7Cit9CisKK2ludAoraHdfZmluZF9yYW5nZV9hcnJheV9wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorCQkJICAgICAgdW5zaWduZWQgaW5kZXgsCisJCQkgICAgICByYW5nZV9wcm9wZXJ0eV9zcGVjICpyYW5nZSkKK3sKKyAgY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpub2RlOworICB1bnNpZ25lZCBzaXplb2ZfZW50cnkgPSAobnJfcmFuZ2VfcHJvcGVydHlfY2VsbHMgKG1lLCAxKQorCQkJICAgKiBzaXplb2YgKHVuc2lnbmVkX2NlbGwpKTsKKyAgY29uc3QgdW5zaWduZWRfY2VsbCAqY2VsbHM7CisgIAorICAvKiBsb2NhdGUgdGhlIHByb3BlcnR5ICovCisgIG5vZGUgPSBod19maW5kX3Byb3BlcnR5IChtZSwgcHJvcGVydHkpOworICBpZiAobm9kZSA9PSBOVUxMKQorICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBub3QgZm91bmQiLCBwcm9wZXJ0eSk7CisgIGlmIChub2RlLT50eXBlICE9IHJhbmdlX2FycmF5X3Byb3BlcnR5KQorICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBvZiB3cm9uZyB0eXBlIChyYW5nZSBhcnJheSkiLCBwcm9wZXJ0eSk7CisgIAorICAvKiBhbGlnbmVkID8gKi8KKyAgaWYgKChub2RlLT5zaXplb2ZfYXJyYXkgJSBzaXplb2ZfZW50cnkpICE9IDApCisgICAgaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCIlc1wiIGNvbnRhaW5zIGFuIGluY29tcGxldGUgbnVtYmVyIG9mIGVudHJpZXMiLAorCSAgICAgIHByb3BlcnR5KTsKKyAgCisgIC8qIHdpdGhpbiBib3VuZHM/ICovCisgIGlmIChub2RlLT5zaXplb2ZfYXJyYXkgPCBzaXplb2ZfZW50cnkgKiAoaW5kZXggKyAxKSkKKyAgICByZXR1cm4gMDsKKyAgCisgIC8qIGZpbmQgdGhlIHJhbmdlIG9mIGludGVyZXN0ICovCisgIGNlbGxzID0gKHVuc2lnbmVkX2NlbGwqKSgoY2hhciopbm9kZS0+YXJyYXkgKyBzaXplb2ZfZW50cnkgKiBpbmRleCk7CisgIAorICAvKiBjb3B5IHRoZSBjaGlsZCBhZGRyZXNzIG91dCAtIGNvbnZlcnRpbmcgYXMgd2UgZ28gKi8KKyAgY2VsbHMgPSBjZWxsc190b191bml0X2FkZHJlc3MgKGNlbGxzLCAmcmFuZ2UtPmNoaWxkX2FkZHJlc3MsCisJCQkJIGh3X3VuaXRfbnJfYWRkcmVzc19jZWxscyAobWUpKTsKKyAgCisgIC8qIGNvcHkgdGhlIHBhcmVudCBhZGRyZXNzIG91dCAtIGNvbnZlcnRpbmcgYXMgd2UgZ28gKi8KKyAgY2VsbHMgPSBjZWxsc190b191bml0X2FkZHJlc3MgKGNlbGxzLCAmcmFuZ2UtPnBhcmVudF9hZGRyZXNzLAorCQkJCSBod191bml0X25yX2FkZHJlc3NfY2VsbHMgKGh3X3BhcmVudCAobWUpKSk7CisgIAorICAvKiBjb3B5IHRoZSBzaXplIC0gY29udmVydGluZyBhcyB3ZSBnbyAqLworICBjZWxscyA9IGNlbGxzX3RvX3VuaXRfYWRkcmVzcyAoY2VsbHMsICZyYW5nZS0+c2l6ZSwKKwkJCQkgaHdfdW5pdF9ucl9zaXplX2NlbGxzIChtZSkpOworICAKKyAgcmV0dXJuIG5vZGUtPnNpemVvZl9hcnJheSAvIHNpemVvZl9lbnRyeTsKK30KKworCitzdGF0aWMgdW5zaWduZWQKK25yX3JlZ19wcm9wZXJ0eV9jZWxscyAoc3RydWN0IGh3ICptZSwKKwkJICAgICAgIGludCBucl9yZWdzKQoreworICByZXR1cm4gKGh3X3VuaXRfbnJfYWRkcmVzc19jZWxscyAoaHdfcGFyZW50KG1lKSkKKwkgICsgaHdfdW5pdF9ucl9zaXplX2NlbGxzIChod19wYXJlbnQobWUpKQorCSAgKSAqIG5yX3JlZ3M7Cit9CisKK3ZvaWQKK2h3X2FkZF9yZWdfYXJyYXlfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCisJCQkgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKwkJCSAgIGNvbnN0IHJlZ19wcm9wZXJ0eV9zcGVjICpyZWdzLAorCQkJICAgdW5zaWduZWQgbnJfcmVncykKK3sKKyAgdW5zaWduZWQgc2l6ZW9mX2NlbGxzID0gKG5yX3JlZ19wcm9wZXJ0eV9jZWxscyAobWUsIG5yX3JlZ3MpCisJCQkgICAqIHNpemVvZiAodW5zaWduZWRfY2VsbCkpOworICB1bnNpZ25lZF9jZWxsICpjZWxscyA9IGh3X3phbGxvYyAobWUsIHNpemVvZl9jZWxscyk7CisgIHVuc2lnbmVkX2NlbGwgKmNlbGw7CisgIGludCBpOworICAKKyAgLyogY29weSB0aGUgcHJvcGVydHkgZWxlbWVudHMgb3ZlciAqLworICBjZWxsID0gY2VsbHM7CisgIGZvciAoaSA9IDA7IGkgPCBucl9yZWdzOyBpKyspCisgICAgeworICAgICAgY29uc3QgcmVnX3Byb3BlcnR5X3NwZWMgKnJlZyA9ICZyZWdzW2ldOworICAgICAgLyogY29weSB0aGUgYWRkcmVzcyAqLworICAgICAgY2VsbCA9IHVuaXRfYWRkcmVzc190b19jZWxscyAoJnJlZy0+YWRkcmVzcywgY2VsbCwKKwkJCQkgICAgaHdfdW5pdF9ucl9hZGRyZXNzX2NlbGxzIChod19wYXJlbnQgKG1lKSkpOworICAgICAgLyogY29weSB0aGUgc2l6ZSAqLworICAgICAgY2VsbCA9IHVuaXRfYWRkcmVzc190b19jZWxscyAoJnJlZy0+c2l6ZSwgY2VsbCwKKwkJCQkgICAgaHdfdW5pdF9ucl9zaXplX2NlbGxzIChod19wYXJlbnQgKG1lKSkpOworICAgIH0KKyAgQVNTRVJUIChjZWxsID09ICZjZWxsc1tucl9yZWdfcHJvcGVydHlfY2VsbHMgKG1lLCBucl9yZWdzKV0pOworICAKKyAgLyogYWRkIGl0ICovCisgIGh3X2FkZF9wcm9wZXJ0eSAobWUsIHByb3BlcnR5LCByZWdfYXJyYXlfcHJvcGVydHksCisJCSAgIGNlbGxzLCBzaXplb2ZfY2VsbHMsCisJCSAgIGNlbGxzLCBzaXplb2ZfY2VsbHMsCisJCSAgIE5VTEwsIHBlcm1lbmFudF9vYmplY3QpOworICAKKyAgaHdfZnJlZSAobWUsIGNlbGxzKTsKK30KKworaW50Citod19maW5kX3JlZ19hcnJheV9wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKKwkJCSAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKwkJCSAgICB1bnNpZ25lZCBpbmRleCwKKwkJCSAgICByZWdfcHJvcGVydHlfc3BlYyAqcmVnKQoreworICBjb25zdCBzdHJ1Y3QgaHdfcHJvcGVydHkgKm5vZGU7CisgIHVuc2lnbmVkIHNpemVvZl9lbnRyeSA9IChucl9yZWdfcHJvcGVydHlfY2VsbHMgKG1lLCAxKQorCQkJICAgKiBzaXplb2YgKHVuc2lnbmVkX2NlbGwpKTsKKyAgY29uc3QgdW5zaWduZWRfY2VsbCAqY2VsbHM7CisgIAorICAvKiBsb2NhdGUgdGhlIHByb3BlcnR5ICovCisgIG5vZGUgPSBod19maW5kX3Byb3BlcnR5IChtZSwgcHJvcGVydHkpOworICBpZiAobm9kZSA9PSBOVUxMKQorICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBub3QgZm91bmQiLCBwcm9wZXJ0eSk7CisgIGlmIChub2RlLT50eXBlICE9IHJlZ19hcnJheV9wcm9wZXJ0eSkKKyAgICBod19hYm9ydCAobWUsICJwcm9wZXJ0eSBcIiVzXCIgb2Ygd3JvbmcgdHlwZSAocmVnIGFycmF5KSIsIHByb3BlcnR5KTsKKyAgCisgIC8qIGFsaWduZWQgPyAqLworICBpZiAoKG5vZGUtPnNpemVvZl9hcnJheSAlIHNpemVvZl9lbnRyeSkgIT0gMCkKKyAgICBod19hYm9ydCAobWUsICJwcm9wZXJ0eSBcIiVzXCIgY29udGFpbnMgYW4gaW5jb21wbGV0ZSBudW1iZXIgb2YgZW50cmllcyIsCisJICAgICAgcHJvcGVydHkpOworICAKKyAgLyogd2l0aGluIGJvdW5kcz8gKi8KKyAgaWYgKG5vZGUtPnNpemVvZl9hcnJheSA8IHNpemVvZl9lbnRyeSAqIChpbmRleCArIDEpKQorICAgIHJldHVybiAwOworICAKKyAgLyogZmluZCB0aGUgcmFuZ2Ugb2YgaW50ZXJlc3QgKi8KKyAgY2VsbHMgPSAodW5zaWduZWRfY2VsbCopKChjaGFyKilub2RlLT5hcnJheSArIHNpemVvZl9lbnRyeSAqIGluZGV4KTsKKyAgCisgIC8qIGNvcHkgdGhlIGFkZHJlc3Mgb3V0IC0gY29udmVydGluZyBhcyB3ZSBnbyAqLworICBjZWxscyA9IGNlbGxzX3RvX3VuaXRfYWRkcmVzcyAoY2VsbHMsICZyZWctPmFkZHJlc3MsCisJCQkJIGh3X3VuaXRfbnJfYWRkcmVzc19jZWxscyAoaHdfcGFyZW50IChtZSkpKTsKKyAgCisgIC8qIGNvcHkgdGhlIHNpemUgb3V0IC0gY29udmVydGluZyBhcyB3ZSBnbyAqLworICBjZWxscyA9IGNlbGxzX3RvX3VuaXRfYWRkcmVzcyAoY2VsbHMsICZyZWctPnNpemUsCisJCQkJIGh3X3VuaXRfbnJfc2l6ZV9jZWxscyAoaHdfcGFyZW50IChtZSkpKTsKKyAgCisgIHJldHVybiBub2RlLT5zaXplb2ZfYXJyYXkgLyBzaXplb2ZfZW50cnk7Cit9CisKKwordm9pZAoraHdfYWRkX3N0cmluZ19wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKKwkJCWNvbnN0IGNoYXIgKnByb3BlcnR5LAorCQkJY29uc3QgY2hhciAqc3RyaW5nKQoreworICBod19hZGRfcHJvcGVydHkgKG1lLCBwcm9wZXJ0eSwgc3RyaW5nX3Byb3BlcnR5LAorCQkgICBzdHJpbmcsIHN0cmxlbihzdHJpbmcpICsgMSwKKwkJICAgc3RyaW5nLCBzdHJsZW4oc3RyaW5nKSArIDEsCisJCSAgIE5VTEwsIHBlcm1lbmFudF9vYmplY3QpOworfQorCitjb25zdCBjaGFyICoKK2h3X2ZpbmRfc3RyaW5nX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKm1lLAorCQkJIGNvbnN0IGNoYXIgKnByb3BlcnR5KQoreworICBjb25zdCBzdHJ1Y3QgaHdfcHJvcGVydHkgKm5vZGU7CisgIGNvbnN0IGNoYXIgKnN0cmluZzsKKyAgbm9kZSA9IGh3X2ZpbmRfcHJvcGVydHkgKG1lLCBwcm9wZXJ0eSk7CisgIGlmIChub2RlID09IE5VTEwpCisgICAgaHdfYWJvcnQgKG1lLCAicHJvcGVydHkgXCIlc1wiIG5vdCBmb3VuZCIsIHByb3BlcnR5KTsKKyAgaWYgKG5vZGUtPnR5cGUgIT0gc3RyaW5nX3Byb3BlcnR5KQorICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBvZiB3cm9uZyB0eXBlIChzdHJpbmcpIiwgcHJvcGVydHkpOworICBzdHJpbmcgPSBub2RlLT5hcnJheTsKKyAgQVNTRVJUIChzdHJsZW4oc3RyaW5nKSArIDEgPT0gbm9kZS0+c2l6ZW9mX2FycmF5KTsKKyAgcmV0dXJuIHN0cmluZzsKK30KKwordm9pZAoraHdfYWRkX3N0cmluZ19hcnJheV9wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorCQkJICAgICAgY29uc3Qgc3RyaW5nX3Byb3BlcnR5X3NwZWMgKnN0cmluZ3MsCisJCQkgICAgICB1bnNpZ25lZCBucl9zdHJpbmdzKQoreworICBpbnQgc2l6ZW9mX2FycmF5OworICBpbnQgc3RyaW5nX25yOworICBjaGFyICphcnJheTsKKyAgY2hhciAqY2hwOworICBpZiAobnJfc3RyaW5ncyA9PSAwKQorICAgIGh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBtdXN0IGJlIG5vbi1udWxsIiwgcHJvcGVydHkpOworICAvKiB0b3RhbCB1cCB0aGUgc2l6ZSBvZiB0aGUgbmVlZGVkIGFycmF5ICovCisgIGZvciAoc2l6ZW9mX2FycmF5ID0gMCwgc3RyaW5nX25yID0gMDsKKyAgICAgICBzdHJpbmdfbnIgPCBucl9zdHJpbmdzOworICAgICAgIHN0cmluZ19uciArKykKKyAgICB7CisgICAgICBzaXplb2ZfYXJyYXkgKz0gc3RybGVuIChzdHJpbmdzW3N0cmluZ19ucl0pICsgMTsKKyAgICB9CisgIC8qIGNyZWF0ZSB0aGUgYXJyYXkgKi8KKyAgYXJyYXkgPSAoY2hhciopIGh3X3phbGxvYyAobWUsIHNpemVvZl9hcnJheSk7CisgIGNocCA9IGFycmF5OworICBmb3IgKHN0cmluZ19uciA9IDA7CisgICAgICAgc3RyaW5nX25yIDwgbnJfc3RyaW5nczsKKyAgICAgICBzdHJpbmdfbnIrKykKKyAgICB7CisgICAgICBzdHJjcHkgKGNocCwgc3RyaW5nc1tzdHJpbmdfbnJdKTsKKyAgICAgIGNocCArPSBzdHJsZW4gKGNocCkgKyAxOworICAgIH0KKyAgQVNTRVJUIChjaHAgPT0gYXJyYXkgKyBzaXplb2ZfYXJyYXkpOworICAvKiBub3cgZW50ZXIgaXQgKi8KKyAgaHdfYWRkX3Byb3BlcnR5IChtZSwgcHJvcGVydHksIHN0cmluZ19hcnJheV9wcm9wZXJ0eSwKKwkJICAgYXJyYXksIHNpemVvZl9hcnJheSwKKwkJICAgYXJyYXksIHNpemVvZl9hcnJheSwKKwkJICAgTlVMTCwgcGVybWVuYW50X29iamVjdCk7Cit9CisKK2ludAoraHdfZmluZF9zdHJpbmdfYXJyYXlfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCisJCQkgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHksCisJCQkgICAgICAgdW5zaWduZWQgaW5kZXgsCisJCQkgICAgICAgc3RyaW5nX3Byb3BlcnR5X3NwZWMgKnN0cmluZykKK3sKKyAgY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpub2RlOworICBub2RlID0gaHdfZmluZF9wcm9wZXJ0eSAobWUsIHByb3BlcnR5KTsKKyAgaWYgKG5vZGUgPT0gTlVMTCkKKyAgICBod19hYm9ydCAobWUsICJwcm9wZXJ0eSBcIiVzXCIgbm90IGZvdW5kIiwgcHJvcGVydHkpOworICBzd2l0Y2ggKG5vZGUtPnR5cGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICBod19hYm9ydCAobWUsICJwcm9wZXJ0eSBcIiVzXCIgb2Ygd3JvbmcgdHlwZSIsIHByb3BlcnR5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugc3RyaW5nX3Byb3BlcnR5OgorICAgICAgaWYgKGluZGV4ID09IDApCisJeworCSAgKnN0cmluZyA9IG5vZGUtPmFycmF5OworCSAgQVNTRVJUIChzdHJsZW4oKnN0cmluZykgKyAxID09IG5vZGUtPnNpemVvZl9hcnJheSk7CisJICByZXR1cm4gMTsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIGFycmF5X3Byb3BlcnR5OgorICAgICAgaWYgKG5vZGUtPnNpemVvZl9hcnJheSA9PSAwCisJICB8fCAoKGNoYXIqKW5vZGUtPmFycmF5KVtub2RlLT5zaXplb2ZfYXJyYXkgLSAxXSAhPSAnXDAnKQorCWh3X2Fib3J0IChtZSwgInByb3BlcnR5IFwiJXNcIiBpbnZhbGlkIGZvciBzdHJpbmcgYXJyYXkiLCBwcm9wZXJ0eSk7CisgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKyAgICBjYXNlIHN0cmluZ19hcnJheV9wcm9wZXJ0eToKKyAgICAgIEFTU0VSVCAobm9kZS0+c2l6ZW9mX2FycmF5ID4gMCk7CisgICAgICBBU1NFUlQgKCgoY2hhciopbm9kZS0+YXJyYXkpW25vZGUtPnNpemVvZl9hcnJheSAtIDFdID09ICdcMCcpOworICAgICAgeworCWNvbnN0IGNoYXIgKmNocCA9IG5vZGUtPmFycmF5OworCWludCBucl9lbnRyaWVzID0gMDsKKwkvKiBjb3VudCB0aGUgbnVtYmVyIG9mIHN0cmluZ3MsIGtlZXBpbmcgYW4gZXllIG91dCBmb3IgdGhlIG9uZQorCSAgIHdlJ3JlIGxvb2tpbmcgZm9yICovCisJKnN0cmluZyA9IGNocDsKKwlkbworCSAgeworCSAgICBpZiAoKmNocCA9PSAnXDAnKQorCSAgICAgIHsKKwkJLyogbmV4dCBzdHJpbmcgKi8KKwkJbnJfZW50cmllcysrOworCQljaHArKzsKKwkJaWYgKG5yX2VudHJpZXMgPT0gaW5kZXgpCisJCSAgKnN0cmluZyA9IGNocDsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCWNocCsrOworCSAgICAgIH0KKwkgIH0gd2hpbGUgKGNocCA8IChjaGFyKilub2RlLT5hcnJheSArIG5vZGUtPnNpemVvZl9hcnJheSk7CisJaWYgKGluZGV4IDwgbnJfZW50cmllcykKKwkgIHJldHVybiBucl9lbnRyaWVzOworCWVsc2UKKwkgIHsKKwkgICAgKnN0cmluZyA9IE5VTEw7CisJICAgIHJldHVybiAwOworCSAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gMDsKK30KKwordm9pZAoraHdfYWRkX2R1cGxpY2F0ZV9wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKKwkJCSAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorCQkJICAgY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpvcmlnaW5hbCkKK3sKKyAgc3RydWN0IGh3X3Byb3BlcnR5X2RhdGEgKm1hc3RlcjsKKyAgVFJBQ0UgKHRyYWNlX2RldmljZXMsCisJICgiaHdfYWRkX2R1cGxpY2F0ZV9wcm9wZXJ0eShtZT0weCVseCwgcHJvcGVydHk9JXMsIC4uLilcbiIsCisJICAobG9uZyltZSwgcHJvcGVydHkpKTsKKyAgaWYgKG9yaWdpbmFsLT5kaXNwb3NpdGlvbiAhPSBwZXJtZW5hbnRfb2JqZWN0KQorICAgIGh3X2Fib3J0IChtZSwgIkNhbiBvbmx5IGR1cGxpY2F0ZSBwZXJtZW5hbnQgb2JqZWN0cyIpOworICAvKiBmaW5kIHRoZSBvcmlnaW5hbCdzIG1hc3RlciAqLworICBtYXN0ZXIgPSBvcmlnaW5hbC0+b3duZXItPnByb3BlcnRpZXNfb2ZfaHc7CisgIHdoaWxlIChtYXN0ZXItPnByb3BlcnR5ICE9IG9yaWdpbmFsKQorICAgIHsKKyAgICAgIG1hc3RlciA9IG1hc3Rlci0+bmV4dDsKKyAgICAgIEFTU0VSVChtYXN0ZXIgIT0gTlVMTCk7CisgICAgfQorICAvKiBub3cgZHVwbGljYXRlIGl0ICovCisgIGh3X2FkZF9wcm9wZXJ0eSAobWUsIHByb3BlcnR5LAorCQkgICBvcmlnaW5hbC0+dHlwZSwKKwkJICAgbWFzdGVyLT5pbml0X2FycmF5LCBtYXN0ZXItPnNpemVvZl9pbml0X2FycmF5LAorCQkgICBvcmlnaW5hbC0+YXJyYXksIG9yaWdpbmFsLT5zaXplb2ZfYXJyYXksCisJCSAgIG9yaWdpbmFsLCBwZXJtZW5hbnRfb2JqZWN0KTsKK30KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vaHctcHJvcGVydGllcy5oIGIvc2ltL2NvbW1vbi9ody1wcm9wZXJ0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExZmJhMwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vaHctcHJvcGVydGllcy5oCkBAIC0wLDAgKzEsMjQ0IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIEhXX1BST1BFUlRJRVNfSAorI2RlZmluZSBIV19QUk9QRVJUSUVTX0gKKworLyogVGhlIGZvbGxvd2luZyBhcmUgdmFsaWQgcHJvcGVydHkgdHlwZXMuICBUaGUgcHJvcGVydHkgYGFycmF5JyBpcworICAgZm9yIGdlbmVyaWMgdW50eXBlZCBkYXRhLiAqLworCit0eXBlZGVmIGVudW0geworICBhcnJheV9wcm9wZXJ0eSwKKyAgYm9vbGVhbl9wcm9wZXJ0eSwKKyNpZiAwCisgIGloYW5kbGVfcHJvcGVydHksIC8qcnVudGltZSovCisjZW5kaWYKKyAgaW50ZWdlcl9wcm9wZXJ0eSwKKyAgcmFuZ2VfYXJyYXlfcHJvcGVydHksCisgIHJlZ19hcnJheV9wcm9wZXJ0eSwKKyAgc3RyaW5nX3Byb3BlcnR5LAorICBzdHJpbmdfYXJyYXlfcHJvcGVydHksCit9IGh3X3Byb3BlcnR5X3R5cGU7CisKK3N0cnVjdCBod19wcm9wZXJ0eSB7CisgIHN0cnVjdCBodyAqb3duZXI7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGh3X3Byb3BlcnR5X3R5cGUgdHlwZTsKKyAgdW5zaWduZWQgc2l6ZW9mX2FycmF5OworICBjb25zdCB2b2lkICphcnJheTsKKyAgY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpvcmlnaW5hbDsKKyAgb2JqZWN0X2Rpc3Bvc2l0aW9uIGRpc3Bvc2l0aW9uOworfTsKKworI2RlZmluZSBod19wcm9wZXJ0eV9vd25lcihwKSAoKHApLT5vd25lciArIDApCisjZGVmaW5lIGh3X3Byb3BlcnR5X25hbWUocCkgKChwKS0+bmFtZSArIDApCisjZGVmaW5lIGh3X3Byb3BlcnR5X3R5cGUocCkgKChwKS0+dHlwZSArIDApCisjZGVmaW5lIGh3X3Byb3BlcnR5X2FycmF5KHApICgocCktPmFycmF5ICsgMCkKKyNkZWZpbmUgaHdfcHJvcGVydHlfc2l6ZW9mX2FycmF5KHApICgocCktPnNpemVvZl9hcnJheSArIDApCisjZGVmaW5lIGh3X3Byb3BlcnR5X29yaWdpbmFsKHApICgocCktPm9yaWdpbmFsICsgMCkKKyNkZWZpbmUgaHdfcHJvcGVydHlfZGlzcG9zaXRpb24ocCkgKChwKS0+ZGlzcG9zaXRpb24gKyAwKQorCisKKy8qIEZpbmQvaXRlcmF0ZSBvdmVyIHByb3Blcml0ZXMgYXR0YWNoZWQgdG8gYSBkZXZpY2UuCisKKyAgIFRvIGl0ZXJhdGUgb3ZlciBhbGwgcHJvcGVydGllcyBhdHRhY2hlZCB0byBhIGRldmljZSwgY2FsbAorICAgaHdfZmluZF9wcm9wZXJ0eSAoLi4sIE5VTEwpIGFuZCB0aGVuIGh3X3Byb3BlcnR5X25leHQuICovCisKK2NvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqaHdfZmluZF9wcm9wZXJ0eQorKHN0cnVjdCBodyAqbWUsCisgY29uc3QgY2hhciAqcHJvcGVydHkpOworCitjb25zdCBzdHJ1Y3QgaHdfcHJvcGVydHkgKmh3X25leHRfcHJvcGVydHkKKyhjb25zdCBzdHJ1Y3QgaHdfcHJvcGVydHkgKnByZXZpb3VzKTsKKworCisvKiBNYW5pcHVsYXRlIHRoZSBwcm9wZXJ0aWVzIGJlbG9uZ2luZyB0byBhIGdpdmVuIGRldmljZS4KKworICAgSFdfQUREXyogd2lsbCwgaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQsIGFkZCBhCisgICBwcm9wZXJ0eSB0byB0aGUgZGV2aWNlLiAgQWRkaW5nIGEgcHJvcGVydHkgdG8gYSBkZXZpY2UgYWZ0ZXIgaXQgaGFzCisgICBiZWVuIGNyZWF0ZWQgaXMgYSBjaGVja2VkIHJ1bi10aW1lIGVycm9yICh1c2UgSFdfU0VUXyopLgorCisgICBIV19TRVRfKiB3aWxsIGFsd2F5cyB1cGRhdGUgKG9yIGNyZWF0ZSkgdGhlIHByb3BlcnR5IHNvIHRoYXQgaXQgaGFzCisgICB0aGUgc3BlY2lmaWVkIHZhbHVlLiAgQ2hhbmdpbmcgdGhlIHR5cGUgb2YgYSBwcm9wZXJ0eSBpcyBhIGNoZWNrZWQKKyAgIHJ1bi10aW1lIGVycm9yLgorCisgICBGSU5EIHJldHVybnMgdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzIHZhbHVlLiAgSXQgaXMgYSBjaGVja2VkCisgICBydW50aW1lIGVycm9yIHRvIGVpdGhlciByZXF1ZXN0IGEgbm9uZXhpc3RhbnQgcHJvcGVydHkgb3IgdG8KKyAgIHJlcXVlc3QgYSBwcm9wZXJ0eSB1c2luZyB0aGUgd3JvbmcgdHlwZS4gQ29kZSBsb2NhdGluZyBhIHByb3BlcnR5CisgICBzaG91bGQgZmlyc3QgY2hlY2sgaXRzIHR5cGUgKHVzaW5nIGh3X2ZpbmRfcHJvcGVydHkgYWJvdmUpIGFuZCB0aGVuCisgICBvYnRhaW4gaXRzIHZhbHVlIHVzaW5nIHRoZSBiZWxvdy4KKworICAgTmFtaW5nIGNvbnZlbnRpb246CisKKyAgIHZvaWQgaHdfYWRkXzx0eXBlPl9wcm9wZXJ0eShzdHJ1Y3QgaHcgKiwgY29uc3QgY2hhciAqLCA8dHlwZT4pCisgICB2b2lkIGh3X2FkZF8qX2FycmF5X3Byb3BlcnR5KHN0cnVjdCBodyAqLCBjb25zdCBjaGFyICosIGNvbnN0IDx0eXBlPiosIGludCkKKyAgIHZvaWQgaHdfc2V0XypfcHJvcGVydHkoc3RydWN0IGh3ICosIGNvbnN0IGNoYXIgKiwgPHR5cGU+KQorICAgdm9pZCBod19zZXRfKl9hcnJheV9wcm9wZXJ0eShzdHJ1Y3QgaHcgKiwgY29uc3QgY2hhciAqLCBjb25zdCA8dHlwZT4qLCBpbnQpCisgICA8dHlwZT4gaHdfZmluZF8qX3Byb3BlcnR5KHN0cnVjdCBodyAqLCBjb25zdCBjaGFyICopCisgICBpbnQgaHdfZmluZF8qX2FycmF5X3Byb3BlcnR5KHN0cnVjdCBodyAqLCBjb25zdCBjaGFyICosIGludCwgPHR5cGU+KikKKworICAgKi8KKworCit2b2lkIGh3X2FkZF9hcnJheV9wcm9wZXJ0eQorKHN0cnVjdCBodyAqbWUsCisgY29uc3QgY2hhciAqcHJvcGVydHksCisgY29uc3Qgdm9pZCAqYXJyYXksCisgaW50IHNpemVvZl9hcnJheSk7CisKK3ZvaWQgaHdfc2V0X2FycmF5X3Byb3BlcnR5Cisoc3RydWN0IGh3ICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyBjb25zdCB2b2lkICphcnJheSwKKyBpbnQgc2l6ZW9mX2FycmF5KTsKKworY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpod19maW5kX2FycmF5X3Byb3BlcnR5Cisoc3RydWN0IGh3ICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSk7CisKKworCit2b2lkIGh3X2FkZF9ib29sZWFuX3Byb3BlcnR5Cisoc3RydWN0IGh3ICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyBpbnQgYm9vbCk7CisKK2ludCBod19maW5kX2Jvb2xlYW5fcHJvcGVydHkKKyhzdHJ1Y3QgaHcgKm1lLAorIGNvbnN0IGNoYXIgKnByb3BlcnR5KTsKKworCisKKyNpZiAwCit0eXBlZGVmIHN0cnVjdCBfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5X3NwZWMgeworICBjb25zdCBjaGFyICpmdWxsX3BhdGg7Cit9IGloYW5kbGVfcnVudGltZV9wcm9wZXJ0eV9zcGVjOworCit2b2lkIGh3X2FkZF9paGFuZGxlX3J1bnRpbWVfcHJvcGVydHkKKyhzdHJ1Y3QgaHcgKm1lLAorIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorIGNvbnN0IGloYW5kbGVfcnVudGltZV9wcm9wZXJ0eV9zcGVjICppaGFuZGxlKTsKKwordm9pZCBod19maW5kX2loYW5kbGVfcnVudGltZV9wcm9wZXJ0eQorKHN0cnVjdCBodyAqbWUsCisgY29uc3QgY2hhciAqcHJvcGVydHksCisgaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5X3NwZWMgKmloYW5kbGUpOworCit2b2lkIGh3X3NldF9paGFuZGxlX3Byb3BlcnR5Cisoc3RydWN0IGh3ICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyBod19pbnN0YW5jZSAqaWhhbmRsZSk7CisKK2h3X2luc3RhbmNlICogaHdfZmluZF9paGFuZGxlX3Byb3BlcnR5Cisoc3RydWN0IGh3ICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSk7CisjZW5kaWYKKworCit2b2lkIGh3X2FkZF9pbnRlZ2VyX3Byb3BlcnR5Cisoc3RydWN0IGh3ICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyBzaWduZWRfY2VsbCBpbnRlZ2VyKTsKKworc2lnbmVkX2NlbGwgaHdfZmluZF9pbnRlZ2VyX3Byb3BlcnR5Cisoc3RydWN0IGh3ICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSk7CisKK2ludCBod19maW5kX2ludGVnZXJfYXJyYXlfcHJvcGVydHkKKyhzdHJ1Y3QgaHcgKm1lLAorIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorIHVuc2lnbmVkIGluZGV4LAorIHNpZ25lZF93b3JkICppbnRlZ2VyKTsKKworCisKK3R5cGVkZWYgc3RydWN0IF9yYW5nZV9wcm9wZXJ0eV9zcGVjIHsKKyAgaHdfdW5pdCBjaGlsZF9hZGRyZXNzOworICBod191bml0IHBhcmVudF9hZGRyZXNzOworICBod191bml0IHNpemU7Cit9IHJhbmdlX3Byb3BlcnR5X3NwZWM7CisKK3ZvaWQgaHdfYWRkX3JhbmdlX2FycmF5X3Byb3BlcnR5Cisoc3RydWN0IGh3ICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyBjb25zdCByYW5nZV9wcm9wZXJ0eV9zcGVjICpyYW5nZXMsCisgdW5zaWduZWQgbnJfcmFuZ2VzKTsKKworaW50IGh3X2ZpbmRfcmFuZ2VfYXJyYXlfcHJvcGVydHkKKyhzdHJ1Y3QgaHcgKm1lLAorIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorIHVuc2lnbmVkIGluZGV4LAorIHJhbmdlX3Byb3BlcnR5X3NwZWMgKnJhbmdlKTsKKworCisKK3R5cGVkZWYgc3RydWN0IF9yZWdfcHJvcGVydHlfc3BlYyB7CisgIGh3X3VuaXQgYWRkcmVzczsKKyAgaHdfdW5pdCBzaXplOworfSByZWdfcHJvcGVydHlfc3BlYzsKKwordm9pZCBod19hZGRfcmVnX2FycmF5X3Byb3BlcnR5Cisoc3RydWN0IGh3ICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyBjb25zdCByZWdfcHJvcGVydHlfc3BlYyAqcmVnLAorIHVuc2lnbmVkIG5yX3JlZ3MpOworCitpbnQgaHdfZmluZF9yZWdfYXJyYXlfcHJvcGVydHkKKyhzdHJ1Y3QgaHcgKm1lLAorIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorIHVuc2lnbmVkIGluZGV4LAorIHJlZ19wcm9wZXJ0eV9zcGVjICpyZWcpOworCisKKwordm9pZCBod19hZGRfc3RyaW5nX3Byb3BlcnR5Cisoc3RydWN0IGh3ICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyBjb25zdCBjaGFyICpzdHJpbmcpOworCitjb25zdCBjaGFyICpod19maW5kX3N0cmluZ19wcm9wZXJ0eQorKHN0cnVjdCBodyAqbWUsCisgY29uc3QgY2hhciAqcHJvcGVydHkpOworCisKKwordHlwZWRlZiBjb25zdCBjaGFyICpzdHJpbmdfcHJvcGVydHlfc3BlYzsKKwordm9pZCBod19hZGRfc3RyaW5nX2FycmF5X3Byb3BlcnR5Cisoc3RydWN0IGh3ICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyBjb25zdCBzdHJpbmdfcHJvcGVydHlfc3BlYyAqc3RyaW5ncywKKyB1bnNpZ25lZCBucl9zdHJpbmdzKTsKKworaW50IGh3X2ZpbmRfc3RyaW5nX2FycmF5X3Byb3BlcnR5Cisoc3RydWN0IGh3ICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyB1bnNpZ25lZCBpbmRleCwKKyBzdHJpbmdfcHJvcGVydHlfc3BlYyAqc3RyaW5nKTsKKworCisKK3ZvaWQgaHdfYWRkX2R1cGxpY2F0ZV9wcm9wZXJ0eQorKHN0cnVjdCBodyAqbWUsCisgY29uc3QgY2hhciAqcHJvcGVydHksCisgY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpvcmlnaW5hbCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9ody10cmVlLmMgYi9zaW0vY29tbW9uL2h3LXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTU1ODM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9ody10cmVlLmMKQEAgLTAsMCArMSwxMzQ0IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworI2luY2x1ZGUgImh3LW1haW4uaCIKKyNpbmNsdWRlICJody1iYXNlLmgiCisjaW5jbHVkZSAiaHctdHJlZS5oIgorCisjaW5jbHVkZSAic2ltLWFzc2VydC5oIgorCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKy8qIG1hbmlwdWxhdGUvbG9va3VwIGRldmljZSBuYW1lcyAqLworCit0eXBlZGVmIHN0cnVjdCBfbmFtZV9zcGVjaWZpZXIgeworICAKKyAgLyogY29tcG9uZW50cyBpbiB0aGUgZnVsbCBsZW5ndGggbmFtZSAqLworICBjaGFyICpwYXRoOworICBjaGFyICpwcm9wZXJ0eTsKKyAgY2hhciAqdmFsdWU7CisgIAorICAvKiBjdXJyZW50IGRldmljZSAqLworICBjaGFyICpmYW1pbHk7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgKnVuaXQ7CisgIGNoYXIgKmFyZ3M7CisgIAorICAvKiBwcmV2aW91cyBkZXZpY2UgKi8KKyAgY2hhciAqbGFzdF9uYW1lOworICBjaGFyICpsYXN0X2ZhbWlseTsKKyAgY2hhciAqbGFzdF91bml0OworICBjaGFyICpsYXN0X2FyZ3M7CisgIAorICAvKiB3b3JrIGFyZWEgKi8KKyAgY2hhciBidWZbMTAyNF07CisgIAorfSBuYW1lX3NwZWNpZmllcjsKKworCisKKy8qIEdpdmVuIGEgZGV2aWNlIHNwZWNpZmllciwgYnJlYWsgaXQgdXAgaW50byBpdHMgbWFpbiBjb21wb25lbnRzOgorICAgcGF0aCAoYW5kIGlmIHByZXNlbnQpIHByb3BlcnR5IG5hbWUgYW5kIHByb3BlcnR5IHZhbHVlLiAqLworCitzdGF0aWMgaW50CitzcGxpdF9kZXZpY2Vfc3BlY2lmaWVyIChzdHJ1Y3QgaHcgKmN1cnJlbnQsCisJCQljb25zdCBjaGFyICpkZXZpY2Vfc3BlY2lmaWVyLAorCQkJbmFtZV9zcGVjaWZpZXIgKnNwZWMpCit7CisgIGNoYXIgKmNocCA9IE5VTEw7CisgIAorICAvKiBleHBhbmQgYW55IGxlYWRpbmcgYWxpYXMgaWYgcHJlc2VudCAqLworICBpZiAoY3VycmVudCAhPSBOVUxMCisgICAgICAmJiAqZGV2aWNlX3NwZWNpZmllciAhPSAnXDAnCisgICAgICAmJiAqZGV2aWNlX3NwZWNpZmllciAhPSAnLicKKyAgICAgICYmICpkZXZpY2Vfc3BlY2lmaWVyICE9ICcvJykKKyAgICB7CisgICAgICBzdHJ1Y3QgaHcgKmFsaWFzZXMgPSBod190cmVlX2ZpbmRfZGV2aWNlIChjdXJyZW50LCAiL2FsaWFzZXMiKTsKKyAgICAgIGNoYXIgYWxpYXNbMzJdOworICAgICAgaW50IGxlbiA9IDA7CisgICAgICB3aGlsZSAoZGV2aWNlX3NwZWNpZmllcltsZW5dICE9ICdcMCcKKwkgICAgICYmIGRldmljZV9zcGVjaWZpZXJbbGVuXSAhPSAnLycKKwkgICAgICYmIGRldmljZV9zcGVjaWZpZXJbbGVuXSAhPSAnOicKKwkgICAgICYmICFpc3NwYWNlIChkZXZpY2Vfc3BlY2lmaWVyW2xlbl0pKQorCXsKKwkgIGFsaWFzW2xlbl0gPSBkZXZpY2Vfc3BlY2lmaWVyW2xlbl07CisJICBsZW4rKzsKKwkgIGlmIChsZW4gPj0gc2l6ZW9mKGFsaWFzKSkKKwkgICAgaHdfYWJvcnQgKE5VTEwsICJzcGxpdF9kZXZpY2Vfc3BlY2lmaWVyOiBidWZmZXIgb3ZlcmZsb3ciKTsKKwl9CisgICAgICBhbGlhc1tsZW5dID0gJ1wwJzsKKyAgICAgIGlmIChhbGlhc2VzICE9IE5VTEwKKwkgICYmIGh3X2ZpbmRfcHJvcGVydHkgKGFsaWFzZXMsIGFsaWFzKSkKKwl7CisJICBzdHJjcHkgKHNwZWMtPmJ1ZiwgaHdfZmluZF9zdHJpbmdfcHJvcGVydHkoYWxpYXNlcywgYWxpYXMpKTsKKwkgIHN0cmNhdCAoc3BlYy0+YnVmLCBkZXZpY2Vfc3BlY2lmaWVyICsgbGVuKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3RyY3B5IChzcGVjLT5idWYsIGRldmljZV9zcGVjaWZpZXIpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzdHJjcHkoc3BlYy0+YnVmLCBkZXZpY2Vfc3BlY2lmaWVyKTsKKyAgICB9CisgIAorICAvKiBjaGVjayBubyBvdmVyZmxvdyAqLworICBpZiAoc3RybGVuKHNwZWMtPmJ1ZikgPj0gc2l6ZW9mKHNwZWMtPmJ1ZikpCisgICAgaHdfYWJvcnQgKE5VTEwsICJzcGxpdF9kZXZpY2Vfc3BlY2lmaWVyOiBidWZmZXIgb3ZlcmZsb3dcbiIpOworICAKKyAgLyogc3RyaXAgbGVhZGluZyBzcGFjZXMgKi8KKyAgY2hwID0gc3BlYy0+YnVmOworICB3aGlsZSAoKmNocCAhPSAnXDAnICYmIGlzc3BhY2UoKmNocCkpCisgICAgY2hwKys7CisgIGlmICgqY2hwID09ICdcMCcpCisgICAgcmV0dXJuIDA7CisgIAorICAvKiBmaW5kIHRoZSBwYXRoIGFuZCB0ZXJtaW5hdGUgaXQgd2l0aCBudWxsICovCisgIHNwZWMtPnBhdGggPSBjaHA7CisgIHdoaWxlICgqY2hwICE9ICdcMCcgJiYgIWlzc3BhY2UoKmNocCkpCisgICAgY2hwKys7CisgIGlmICgqY2hwICE9ICdcMCcpCisgICAgeworICAgICAgKmNocCA9ICdcMCc7CisgICAgICBjaHArKzsKKyAgICB9CisgIAorICAvKiBhbmQgYW55IHZhbHVlICovCisgIHdoaWxlICgqY2hwICE9ICdcMCcgJiYgaXNzcGFjZSgqY2hwKSkKKyAgICBjaHArKzsKKyAgc3BlYy0+dmFsdWUgPSBjaHA7CisgIAorICAvKiBub3cgZ28gYmFjayBhbmQgY2hvcCB0aGUgcHJvcGVydHkgb2ZmIG9mIHRoZSBwYXRoICovCisgIGlmIChzcGVjLT52YWx1ZVswXSA9PSAnXDAnKQorICAgIHsKKyAgICAgIHNwZWMtPnByb3BlcnR5ID0gTlVMTDsgLypub3QgYSBwcm9wZXJ0eSovCisgICAgICBzcGVjLT52YWx1ZSA9IE5VTEw7CisgICAgfQorICBlbHNlIGlmIChzcGVjLT52YWx1ZVswXSA9PSAnPicKKwkgICB8fCBzcGVjLT52YWx1ZVswXSA9PSAnPCcpCisgICAgeworICAgICAgLyogYW4gaW50ZXJydXB0IHNwZWMgKi8KKyAgICAgIHNwZWMtPnByb3BlcnR5ID0gTlVMTDsKKyAgICB9CisgIGVsc2UgeworICAgIGNocCA9IHN0cnJjaHIoc3BlYy0+cGF0aCwgJy8nKTsKKyAgICBpZiAoY2hwID09IE5VTEwpCisgICAgICB7CisJc3BlYy0+cHJvcGVydHkgPSBzcGVjLT5wYXRoOworCXNwZWMtPnBhdGggPSBzdHJjaHIoc3BlYy0+cHJvcGVydHksICdcMCcpOworICAgICAgfQorICAgIGVsc2UgeworICAgICAgKmNocCA9ICdcMCc7CisgICAgICBzcGVjLT5wcm9wZXJ0eSA9IGNocCsxOworICAgIH0KKyAgfQorICAKKyAgLyogYW5kIG1hcmsgdGhlIHJlc3QgYXMgaW52YWxpZCAqLworICBzcGVjLT5uYW1lID0gTlVMTDsKKyAgc3BlYy0+ZmFtaWx5ID0gTlVMTDsKKyAgc3BlYy0+dW5pdCA9IE5VTEw7CisgIHNwZWMtPmFyZ3MgPSBOVUxMOworICBzcGVjLT5sYXN0X25hbWUgPSBOVUxMOworICBzcGVjLT5sYXN0X2ZhbWlseSA9IE5VTEw7CisgIHNwZWMtPmxhc3RfdW5pdCA9IE5VTEw7CisgIHNwZWMtPmxhc3RfYXJncyA9IE5VTEw7CisgIAorICByZXR1cm4gMTsKK30KKworCisvKiBnaXZlbiBhIGRldmljZSBzcGVjaWZpZXIgYnJlYWsgaXQgdXAgaW50byBpdHMgbWFpbiBjb21wb25lbnRzIC0KKyAgIHBhdGggYW5kIHByb3BlcnR5IG5hbWUgLSBhc3N1bWluZyB0aGF0IHRoZSBsYXN0IGBkZXZpY2UnIGlzIGEKKyAgIHByb3BlcnR5IG5hbWUuICovCisKK3N0YXRpYyBpbnQKK3NwbGl0X3Byb3BlcnR5X3NwZWNpZmllciAoc3RydWN0IGh3ICpjdXJyZW50LAorCQkJICBjb25zdCBjaGFyICpwcm9wZXJ0eV9zcGVjaWZpZXIsCisJCQkgIG5hbWVfc3BlY2lmaWVyICpzcGVjKQoreworICBpZiAoc3BsaXRfZGV2aWNlX3NwZWNpZmllciAoY3VycmVudCwgcHJvcGVydHlfc3BlY2lmaWVyLCBzcGVjKSkKKyAgICB7CisgICAgICBpZiAoc3BlYy0+cHJvcGVydHkgPT0gTlVMTCkKKwl7CisJICAvKiBmb3JjZSB0aGUgbGFzdCBuYW1lIHRvIGJlIGEgcHJvcGVydHkgbmFtZSAqLworCSAgY2hhciAqY2hwID0gc3RycmNociAoc3BlYy0+cGF0aCwgJy8nKTsKKwkgIGlmIChjaHAgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHNwZWMtPnByb3BlcnR5ID0gc3BlYy0+cGF0aDsKKwkgICAgICBzcGVjLT5wYXRoID0gc3RycmNociAoc3BlYy0+cHJvcGVydHksICdcMCcpOzsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgKmNocCA9ICdcMCc7CisJICAgICAgc3BlYy0+cHJvcGVydHkgPSBjaHAgKyAxOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIDE7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKworLyogZGV2aWNlIHRoZSBuZXh0IGRldmljZSBuYW1lIGFuZCBzcGxpdCBpdCB1cCwgcmV0dXJuIDAgd2hlbiBubyBtb3JlCisgICBuYW1lcyB0byBzdHJ1Y3QgaHcgKi8KKworc3RhdGljIGludAorc3BsaXRfZGV2aWNlX25hbWUgKG5hbWVfc3BlY2lmaWVyICpzcGVjKQoreworICBjaGFyICpjaHA7CisgIC8qIHJlbWVtYmVyIHdoYXQgY2FtZSBiZWZvcmUgKi8KKyAgc3BlYy0+bGFzdF9uYW1lID0gc3BlYy0+bmFtZTsKKyAgc3BlYy0+bGFzdF9mYW1pbHkgPSBzcGVjLT5mYW1pbHk7CisgIHNwZWMtPmxhc3RfdW5pdCA9IHNwZWMtPnVuaXQ7CisgIHNwZWMtPmxhc3RfYXJncyA9IHNwZWMtPmFyZ3M7CisgIC8qIGZpbmlzaGVkPyAqLworICBpZiAoc3BlYy0+cGF0aFswXSA9PSAnXDAnKQorICAgIHsKKyAgICAgIHNwZWMtPm5hbWUgPSBOVUxMOworICAgICAgc3BlYy0+ZmFtaWx5ID0gTlVMTDsKKyAgICAgIHNwZWMtPnVuaXQgPSBOVUxMOworICAgICAgc3BlYy0+YXJncyA9IE5VTEw7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIC8qIGJyZWFrIHRoZSBjdXJyZW50IGRldmljZSBzcGVjIGZyb20gdGhlIHBhdGggKi8KKyAgc3BlYy0+bmFtZSA9IHNwZWMtPnBhdGg7CisgIGNocCA9IHN0cmNociAoc3BlYy0+bmFtZSwgJy8nKTsKKyAgaWYgKGNocCA9PSBOVUxMKQorICAgIHNwZWMtPnBhdGggPSBzdHJjaHIgKHNwZWMtPm5hbWUsICdcMCcpOworICBlbHNlIAorICAgIHsKKyAgICAgIHNwZWMtPnBhdGggPSBjaHArMTsKKyAgICAgICpjaHAgPSAnXDAnOworICAgIH0KKyAgLyogYnJlYWsgb3V0IHRoZSBiYXNlICovCisgIGlmIChzcGVjLT5uYW1lWzBdID09ICcoJykKKyAgICB7CisgICAgICBjaHAgPSBzdHJjaHIoc3BlYy0+bmFtZSwgJyknKTsKKyAgICAgIGlmIChjaHAgPT0gTlVMTCkKKwl7CisJICBzcGVjLT5mYW1pbHkgPSBzcGVjLT5uYW1lOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAqY2hwID0gJ1wwJzsKKwkgIHNwZWMtPmZhbWlseSA9IHNwZWMtPm5hbWUgKyAxOworCSAgc3BlYy0+bmFtZSA9IGNocCArIDE7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNwZWMtPmZhbWlseSA9IHNwZWMtPm5hbWU7CisgICAgfQorICAvKiBub3cgYnJlYWsgb3V0IHRoZSB1bml0ICovCisgIGNocCA9IHN0cmNocihzcGVjLT5uYW1lLCAnQCcpOworICBpZiAoY2hwID09IE5VTEwpCisgICAgeworICAgICAgc3BlYy0+dW5pdCA9IE5VTEw7CisgICAgICBjaHAgPSBzcGVjLT5uYW1lOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICpjaHAgPSAnXDAnOworICAgICAgY2hwICs9IDE7CisgICAgICBzcGVjLT51bml0ID0gY2hwOworICAgIH0KKyAgLyogZmluYWxseSBhbnkgYXJncyAqLworICBjaHAgPSBzdHJjaHIoY2hwLCAnOicpOworICBpZiAoY2hwID09IE5VTEwpCisgICAgc3BlYy0+YXJncyA9IE5VTEw7CisgIGVsc2UKKyAgICB7CisgICAgICAqY2hwID0gJ1wwJzsKKyAgICAgIHNwZWMtPmFyZ3MgPSBjaHArMTsKKyAgICB9CisgIHJldHVybiAxOworfQorCisKKy8qIGRldmljZSB0aGUgdmFsdWUsIHJldHVybmluZyB0aGUgbmV4dCBub24tc3BhY2UgdG9rZW4gKi8KKworc3RhdGljIGNoYXIgKgorc3BsaXRfdmFsdWUgKG5hbWVfc3BlY2lmaWVyICpzcGVjKQoreworICBjaGFyICp0b2tlbjsKKyAgaWYgKHNwZWMtPnZhbHVlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIC8qIHNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZSAqLworICB3aGlsZSAoaXNzcGFjZSAoc3BlYy0+dmFsdWVbMF0pKQorICAgIHNwZWMtPnZhbHVlKys7CisgIGlmIChzcGVjLT52YWx1ZVswXSA9PSAnXDAnKQorICAgIHsKKyAgICAgIHNwZWMtPnZhbHVlID0gTlVMTDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgdG9rZW4gPSBzcGVjLT52YWx1ZTsKKyAgLyogZmluZCB0cmFpbGluZyBzcGFjZSAqLworICB3aGlsZSAoc3BlYy0+dmFsdWVbMF0gIT0gJ1wwJyAmJiAhaXNzcGFjZSAoc3BlYy0+dmFsdWVbMF0pKQorICAgIHNwZWMtPnZhbHVlKys7CisgIC8qIGNob3AgdGhpcyB2YWx1ZSBvdXQgKi8KKyAgaWYgKHNwZWMtPnZhbHVlWzBdICE9ICdcMCcpCisgICAgeworICAgICAgc3BlYy0+dmFsdWVbMF0gPSAnXDAnOworICAgICAgc3BlYy0+dmFsdWUrKzsKKyAgICB9CisgIHJldHVybiB0b2tlbjsKK30KKworCisKKy8qIHRyYXZlcnNlIHRoZSBwYXRoIHNwZWNpZmllZCBieSBzcGVjIHN0YXJ0aW5nIGF0IGN1cnJlbnQgKi8KKworc3RhdGljIHN0cnVjdCBodyAqCitzcGxpdF9maW5kX2RldmljZSAoc3RydWN0IGh3ICpjdXJyZW50LAorCQkgICBuYW1lX3NwZWNpZmllciAqc3BlYykKK3sKKyAgLyogc3RyaXAgb2ZmIChhbmQgcHJvY2VzcykgYW55IGxlYWRpbmcgLiwgLi4sIC4vIGFuZCAvICovCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGlmIChzdHJuY21wIChzcGVjLT5wYXRoLCAiLyIsIHN0cmxlbiAoIi8iKSkgPT0gMCkKKwl7CisJICAvKiBjZCAvLi4uICovCisJICB3aGlsZSAoY3VycmVudCAhPSBOVUxMICYmIGh3X3BhcmVudCAoY3VycmVudCkgIT0gTlVMTCkKKwkgICAgY3VycmVudCA9IGh3X3BhcmVudCAoY3VycmVudCk7CisJICBzcGVjLT5wYXRoICs9IHN0cmxlbiAoIi8iKTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJuY21wIChzcGVjLT5wYXRoLCAiLi8iLCBzdHJsZW4gKCIuLyIpKSA9PSAwKQorCXsKKwkgIC8qIGNkIC4vLi4uICovCisJICBjdXJyZW50ID0gY3VycmVudDsKKwkgIHNwZWMtPnBhdGggKz0gc3RybGVuICgiLi8iKTsKKwl9CisgICAgICBlbHNlIGlmIChzdHJuY21wIChzcGVjLT5wYXRoLCAiLi4vIiwgc3RybGVuICgiLi4vIikpID09IDApCisJeworCSAgLyogY2QgLi4vLi4uICovCisJICBpZiAoY3VycmVudCAhPSBOVUxMICYmIGh3X3BhcmVudCAoY3VycmVudCkgIT0gTlVMTCkKKwkgICAgY3VycmVudCA9IGh3X3BhcmVudCAoY3VycmVudCk7CisJICBzcGVjLT5wYXRoICs9IHN0cmxlbiAoIi4uLyIpOworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc3BlYy0+cGF0aCwgIi4iKSA9PSAwKQorCXsKKwkgIC8qIGNkIC4gKi8KKwkgIGN1cnJlbnQgPSBjdXJyZW50OworCSAgc3BlYy0+cGF0aCArPSBzdHJsZW4gKCIuIik7CisJfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChzcGVjLT5wYXRoLCAiLi4iKSA9PSAwKQorCXsKKwkgIC8qIGNkIC4uICovCisJICBpZiAoY3VycmVudCAhPSBOVUxMICYmIGh3X3BhcmVudCAoY3VycmVudCkgIT0gTlVMTCkKKwkgICAgY3VycmVudCA9IGh3X3BhcmVudCAoY3VycmVudCk7CisJICBzcGVjLT5wYXRoICs9IHN0cmxlbiAoIi4uIik7CisJfQorICAgICAgZWxzZQorCWJyZWFrOworICAgIH0KKyAgCisgIC8qIG5vdyBnbyB0aHJvdWdoIHRoZSBwYXRoIHByb3BlciAqLworICAKKyAgaWYgKGN1cnJlbnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBzcGxpdF9kZXZpY2VfbmFtZSAoc3BlYyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIAorICB3aGlsZSAoc3BsaXRfZGV2aWNlX25hbWUgKHNwZWMpKQorICAgIHsKKyAgICAgIHN0cnVjdCBodyAqY2hpbGQ7CisgICAgICBmb3IgKGNoaWxkID0gaHdfY2hpbGQgKGN1cnJlbnQpOworCSAgIGNoaWxkICE9IE5VTEw7IGNoaWxkID0gaHdfc2libGluZyAoY2hpbGQpKQorCXsKKwkgIGlmIChzdHJjbXAgKHNwZWMtPm5hbWUsIGh3X25hbWUgKGNoaWxkKSkgPT0gMCkKKwkgICAgeworCSAgICAgIGlmIChzcGVjLT51bml0ID09IE5VTEwpCisJCWJyZWFrOworCSAgICAgIGVsc2UKKwkJeworCQkgIGh3X3VuaXQgcGh5czsKKwkJICBod191bml0X2RlY29kZSAoY3VycmVudCwgc3BlYy0+dW5pdCwgJnBoeXMpOworCQkgIGlmIChtZW1jbXAgKCZwaHlzLCBod191bml0X2FkZHJlc3MgKGNoaWxkKSwKKwkJCSAgICAgIHNpemVvZiAoaHdfdW5pdCkpID09IDApCisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJfQorICAgICAgaWYgKGNoaWxkID09IE5VTEwpCisJcmV0dXJuIGN1cnJlbnQ7IC8qIHNlYXJjaCBmYWlsZWQgKi8KKyAgICAgIGN1cnJlbnQgPSBjaGlsZDsKKyAgICB9CisgIAorICByZXR1cm4gY3VycmVudDsKK30KKworCitzdGF0aWMgc3RydWN0IGh3ICoKK3NwbGl0X2ZpbGxfcGF0aCAoc3RydWN0IGh3ICpjdXJyZW50LAorCQkgY29uc3QgY2hhciAqZGV2aWNlX3NwZWNpZmllciwKKwkJIG5hbWVfc3BlY2lmaWVyICpzcGVjKQoreworICAvKiBicmVhayBpdCB1cCAqLworICBpZiAoIXNwbGl0X2RldmljZV9zcGVjaWZpZXIgKGN1cnJlbnQsIGRldmljZV9zcGVjaWZpZXIsIHNwZWMpKQorICAgIGh3X2Fib3J0IChjdXJyZW50LCAiZXJyb3IgcGFyc2luZyAlc1xuIiwgZGV2aWNlX3NwZWNpZmllcik7CisgIAorICAvKiBmaWxsIG91ciB0cmVlIHdpdGggaXRzIGNvbnRlbnRzICovCisgIGN1cnJlbnQgPSBzcGxpdF9maW5kX2RldmljZSAoY3VycmVudCwgc3BlYyk7CisgIAorICAvKiBhZGQgYW55IGFkZGl0aW9uYWwgZGV2aWNlcyBhcyBuZWVkZWQgKi8KKyAgaWYgKHNwZWMtPm5hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBkbworCXsKKwkgIGlmIChjdXJyZW50ICE9IE5VTEwgJiYgIWh3X2ZpbmlzaGVkX3AgKGN1cnJlbnQpKQorCSAgICBod19maW5pc2ggKGN1cnJlbnQpOworCSAgY3VycmVudCA9IGh3X2NyZWF0ZSAoTlVMTCwKKwkJCSAgICAgICBjdXJyZW50LAorCQkJICAgICAgIHNwZWMtPmZhbWlseSwKKwkJCSAgICAgICBzcGVjLT5uYW1lLAorCQkJICAgICAgIHNwZWMtPnVuaXQsCisJCQkgICAgICAgc3BlYy0+YXJncyk7CisJfQorICAgICAgd2hpbGUgKHNwbGl0X2RldmljZV9uYW1lIChzcGVjKSk7CisgICAgfQorICAKKyAgcmV0dXJuIGN1cnJlbnQ7Cit9CisKKwwKKy8qIDxub24td2hpdGUtc3BhY2U+ICovCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3NraXBfdG9rZW4oY29uc3QgY2hhciAqY2hwKQoreworICB3aGlsZSAoIWlzc3BhY2UoKmNocCkgJiYgKmNocCAhPSAnXDAnKQorICAgIGNocCsrOworICB3aGlsZSAoaXNzcGFjZSgqY2hwKSAmJiAqY2hwICE9ICdcMCcpCisgICAgY2hwKys7CisgIHJldHVybiBjaHA7Cit9CisKKworLyogY291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzICovCisKK3N0YXRpYyBpbnQKK2NvdW50X2VudHJpZXMgKHN0cnVjdCBodyAqY3VycmVudCwKKwkgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHlfbmFtZSwKKwkgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHlfdmFsdWUsCisJICAgICAgIGludCBtb2R1bG8pCit7CisgIGNvbnN0IGNoYXIgKmNocCA9IHByb3BlcnR5X3ZhbHVlOworICBpbnQgbnJfZW50cmllcyA9IDA7CisgIHdoaWxlICgqY2hwICE9ICdcMCcpCisgICAgeworICAgICAgbnJfZW50cmllcyArPSAxOworICAgICAgY2hwID0gc2tpcF90b2tlbiAoY2hwKTsKKyAgICB9CisgIGlmICgobnJfZW50cmllcyAlIG1vZHVsbykgIT0gMCkKKyAgICB7CisgICAgICBod19hYm9ydCAoY3VycmVudCwgImluY29ycmVjdCBudW1iZXIgb2YgZW50cmllcyBmb3IgJXMgcHJvcGVydHkgJXMsIHNob3VsZCBiZSBtdWx0aXBsZSBvZiAlZCIsCisJCXByb3BlcnR5X25hbWUsIHByb3BlcnR5X3ZhbHVlLCBtb2R1bG8pOworICAgIH0KKyAgcmV0dXJuIG5yX2VudHJpZXMgLyBtb2R1bG87Cit9CisKKworCisvKiBwYXJzZTogPGFkZHJlc3M+IDo6PSA8dG9rZW4+IDsgZGV2aWNlIGRlcGVuZGFudCAqLworCitzdGF0aWMgY29uc3QgY2hhciAqCitwYXJzZV9hZGRyZXNzIChzdHJ1Y3QgaHcgKmN1cnJlbnQsCisJICAgICAgIHN0cnVjdCBodyAqYnVzLAorCSAgICAgICBjb25zdCBjaGFyICpjaHAsCisJICAgICAgIGh3X3VuaXQgKmFkZHJlc3MpCit7CisgIGlmIChod191bml0X2RlY29kZSAoYnVzLCBjaHAsIGFkZHJlc3MpIDwgMCkKKyAgICBod19hYm9ydCAoY3VycmVudCwgImludmFsaWQgdW5pdCBhZGRyZXNzIGluICVzIiwgY2hwKTsKKyAgcmV0dXJuIHNraXBfdG9rZW4gKGNocCk7Cit9CisKKworLyogcGFyc2U6IDxzaXplPiA6Oj0gPG51bWJlcj4geyAiLCIgPG51bWJlcj4gfSA7ICovCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3BhcnNlX3NpemUgKHN0cnVjdCBodyAqY3VycmVudCwKKwkgICAgc3RydWN0IGh3ICpidXMsCisJICAgIGNvbnN0IGNoYXIgKmNocCwKKwkgICAgaHdfdW5pdCAqc2l6ZSkKK3sKKyAgaW50IGk7CisgIGludCBucjsKKyAgY29uc3QgY2hhciAqY3VyciA9IGNocDsKKyAgbWVtc2V0KHNpemUsIDAsIHNpemVvZigqc2l6ZSkpOworICAvKiBwYXJzZSB0aGUgbnVtZXJpYyBsaXN0ICovCisgIHNpemUtPm5yX2NlbGxzID0gaHdfdW5pdF9ucl9zaXplX2NlbGxzIChidXMpOworICBuciA9IDA7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGNoYXIgKm5leHQ7CisgICAgICBzaXplLT5jZWxsc1tucl0gPSBzdHJ0b3VsIChjdXJyLCAmbmV4dCwgMCk7CisgICAgICBpZiAoY3VyciA9PSBuZXh0KQorCWh3X2Fib3J0IChjdXJyZW50LCAiUHJvYmxlbSBwYXJzaW5nIDxzaXplPiAlcyIsIGNocCk7CisgICAgICBuciArPSAxOworICAgICAgaWYgKG5leHRbMF0gIT0gJywnKQorCWJyZWFrOworICAgICAgaWYgKG5yID09IHNpemUtPm5yX2NlbGxzKQorCWh3X2Fib3J0IChjdXJyZW50LCAiVG9vIG1hbnkgdmFsdWVzIGluIDxzaXplPiAlcyIsIGNocCk7CisgICAgICBjdXJyID0gbmV4dCArIDE7CisgICAgfQorICBBU1NFUlQgKG5yID4gMCAmJiBuciA8PSBzaXplLT5ucl9jZWxscyk7CisgIC8qIHJpZ2h0IGFsaWduIHRoZSBudW1iZXJzICovCisgIGZvciAoaSA9IDE7IGkgPD0gc2l6ZS0+bnJfY2VsbHM7IGkrKykKKyAgICB7CisgICAgICBpZiAoaSA8PSBucikKKwlzaXplLT5jZWxsc1tzaXplLT5ucl9jZWxscyAtIGldID0gc2l6ZS0+Y2VsbHNbbnIgLSBpXTsKKyAgICAgIGVsc2UKKwlzaXplLT5jZWxsc1tzaXplLT5ucl9jZWxscyAtIGldID0gMDsKKyAgICB9CisgIHJldHVybiBza2lwX3Rva2VuIChjaHApOworfQorCisKKy8qIHBhcnNlOiA8cmVnPiA6Oj0geyA8YWRkcmVzcz4gPHNpemU+IH0gOyAqLworCitzdGF0aWMgdm9pZAorcGFyc2VfcmVnX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKmN1cnJlbnQsCisJCSAgICBjb25zdCBjaGFyICpwcm9wZXJ0eV9uYW1lLAorCQkgICAgY29uc3QgY2hhciAqcHJvcGVydHlfdmFsdWUpCit7CisgIGludCBucl9yZWdzOworICBpbnQgcmVnX25yOworICByZWdfcHJvcGVydHlfc3BlYyAqcmVnczsKKyAgY29uc3QgY2hhciAqY2hwOworICAKKyAgLyogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcmVnIGVudHJpZXMgYnkgY291bnRpbmcgdG9rZW5zICovCisgIG5yX3JlZ3MgPSBjb3VudF9lbnRyaWVzIChjdXJyZW50LCBwcm9wZXJ0eV9uYW1lLCBwcm9wZXJ0eV92YWx1ZSwgMik7CisgIAorICAvKiBjcmVhdGUgd29ya2luZyBzcGFjZSAqLworICByZWdzID0gemFsbG9jIChucl9yZWdzICogc2l6ZW9mICgqcmVncykpOworICAKKyAgLyogZmlsbCBpdCBpbiAqLworICBjaHAgPSBwcm9wZXJ0eV92YWx1ZTsKKyAgZm9yIChyZWdfbnIgPSAwOyByZWdfbnIgPCBucl9yZWdzOyByZWdfbnIrKykKKyAgICB7CisgICAgICBjaHAgPSBwYXJzZV9hZGRyZXNzIChjdXJyZW50LCBod19wYXJlbnQoY3VycmVudCksCisJCQkgICBjaHAsICZyZWdzW3JlZ19ucl0uYWRkcmVzcyk7CisgICAgICBjaHAgPSBwYXJzZV9zaXplIChjdXJyZW50LCBod19wYXJlbnQoY3VycmVudCksCisJCQljaHAsICZyZWdzW3JlZ19ucl0uc2l6ZSk7CisgICAgfQorICAKKyAgLyogY3JlYXRlIGl0ICovCisgIGh3X2FkZF9yZWdfYXJyYXlfcHJvcGVydHkgKGN1cnJlbnQsIHByb3BlcnR5X25hbWUsCisJCQkgICAgIHJlZ3MsIG5yX3JlZ3MpOworICAKKyAgemZyZWUgKHJlZ3MpOworfQorCisKKy8qIHsgPGNoaWxkLWFkZHJlc3M+IDxwYXJlbnQtYWRkcmVzcz4gPGNoaWxkLXNpemU+IH0qICovCisKK3N0YXRpYyB2b2lkCitwYXJzZV9yYW5nZXNfcHJvcGVydHkgKHN0cnVjdCBodyAqY3VycmVudCwKKwkJICAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5X25hbWUsCisJCSAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eV92YWx1ZSkKK3sKKyAgaW50IG5yX3JhbmdlczsKKyAgaW50IHJhbmdlX25yOworICByYW5nZV9wcm9wZXJ0eV9zcGVjICpyYW5nZXM7CisgIGNvbnN0IGNoYXIgKmNocDsKKyAgCisgIC8qIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHJhbmdlcyBzcGVjaWZpZWQgKi8KKyAgbnJfcmFuZ2VzID0gY291bnRfZW50cmllcyAoY3VycmVudCwgcHJvcGVydHlfbmFtZSwgcHJvcGVydHlfdmFsdWUsIDMpOworICAKKyAgLyogY3JlYXRlIGEgcHJvcGVydHkgb2YgdGhhdCBzaXplICovCisgIHJhbmdlcyA9IHphbGxvYyAobnJfcmFuZ2VzICogc2l6ZW9mKCpyYW5nZXMpKTsKKyAgCisgIC8qIGZpbGwgaXQgaW4gKi8KKyAgY2hwID0gcHJvcGVydHlfdmFsdWU7CisgIGZvciAocmFuZ2VfbnIgPSAwOyByYW5nZV9uciA8IG5yX3JhbmdlczsgcmFuZ2VfbnIrKykKKyAgICB7CisgICAgICBjaHAgPSBwYXJzZV9hZGRyZXNzIChjdXJyZW50LCBjdXJyZW50LAorCQkJICAgY2hwLCAmcmFuZ2VzW3JhbmdlX25yXS5jaGlsZF9hZGRyZXNzKTsKKyAgICAgIGNocCA9IHBhcnNlX2FkZHJlc3MgKGN1cnJlbnQsIGh3X3BhcmVudChjdXJyZW50KSwKKwkJCSAgIGNocCwgJnJhbmdlc1tyYW5nZV9ucl0ucGFyZW50X2FkZHJlc3MpOworICAgICAgY2hwID0gcGFyc2Vfc2l6ZSAoY3VycmVudCwgY3VycmVudCwKKwkJCWNocCwgJnJhbmdlc1tyYW5nZV9ucl0uc2l6ZSk7CisgICAgfQorICAKKyAgLyogY3JlYXRlIGl0ICovCisgIGh3X2FkZF9yYW5nZV9hcnJheV9wcm9wZXJ0eSAoY3VycmVudCwgcHJvcGVydHlfbmFtZSwgcmFuZ2VzLCBucl9yYW5nZXMpOworICAKKyAgemZyZWUgKHJhbmdlcyk7Cit9CisKKworLyogPGludGVnZXI+IC4uLiAqLworCitzdGF0aWMgdm9pZAorcGFyc2VfaW50ZWdlcl9wcm9wZXJ0eSAoc3RydWN0IGh3ICpjdXJyZW50LAorCQkJY29uc3QgY2hhciAqcHJvcGVydHlfbmFtZSwKKwkJCWNvbnN0IGNoYXIgKnByb3BlcnR5X3ZhbHVlKQoreworICBpbnQgbnJfZW50cmllczsKKyAgdW5zaWduZWRfY2VsbCB3b3Jkc1sxMDI0XTsKKyAgLyogaW50ZWdlciBvciBpbnRlZ2VyIGFycmF5PyAqLworICBucl9lbnRyaWVzID0gMDsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgY2hhciAqZW5kOworICAgICAgd29yZHNbbnJfZW50cmllc10gPSBzdHJ0b3VsIChwcm9wZXJ0eV92YWx1ZSwgJmVuZCwgMCk7CisgICAgICBpZiAocHJvcGVydHlfdmFsdWUgPT0gZW5kKQorCWJyZWFrOworICAgICAgbnJfZW50cmllcyArPSAxOworICAgICAgaWYgKG5yX2VudHJpZXMgKiBzaXplb2YgKHdvcmRzWzBdKSA+PSBzaXplb2YgKHdvcmRzKSkKKwlod19hYm9ydCAoY3VycmVudCwgImJ1ZmZlciBvdmVyZmxvdyIpOworICAgICAgcHJvcGVydHlfdmFsdWUgPSBlbmQ7CisgICAgfQorICBpZiAobnJfZW50cmllcyA9PSAwKQorICAgIGh3X2Fib3J0IChjdXJyZW50LCAiZXJyb3IgcGFyc2luZyBpbnRlZ2VyIHByb3BlcnR5ICVzICglcykiLAorCSAgICAgIHByb3BlcnR5X25hbWUsIHByb3BlcnR5X3ZhbHVlKTsKKyAgZWxzZSBpZiAobnJfZW50cmllcyA9PSAxKQorICAgIGh3X2FkZF9pbnRlZ2VyX3Byb3BlcnR5IChjdXJyZW50LCBwcm9wZXJ0eV9uYW1lLCB3b3Jkc1swXSk7CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBucl9lbnRyaWVzOyBpKyspCisJeworCSAgSDJCRSAod29yZHNbaV0pOworCX0KKyAgICAgIC8qIHBlcmhhcGhzIGludGVnZXIgYXJyYXkgcHJvcGVydHkgaXMgYmV0dGVyICovCisgICAgICBod19hZGRfYXJyYXlfcHJvcGVydHkgKGN1cnJlbnQsIHByb3BlcnR5X25hbWUsIHdvcmRzLAorCQkJICAgICBzaXplb2Yod29yZHNbMF0pICogbnJfZW50cmllcyk7CisgICAgfQorfQorCisKKy8qIDxzdHJpbmc+IC4uLiAqLworCitzdGF0aWMgdm9pZAorcGFyc2Vfc3RyaW5nX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKmN1cnJlbnQsCisJCSAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eV9uYW1lLAorCQkgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHlfdmFsdWUpCit7CisgIGNoYXIgKipzdHJpbmdzOworICBjb25zdCBjaGFyICpjaHA7CisgIGludCBucl9zdHJpbmdzOworICBpbnQgYXBwcm94X25yX3N0cmluZ3M7CisgIAorICAvKiBnZXQgYW4gZXN0aW1hdGUgYXMgdG8gdGhlIG51bWJlciBvZiBzdHJpbmdzIGJ5IGNvdW50aW5nIGRvdWJsZQorICAgICBxdW90ZXMgKi8KKyAgYXBwcm94X25yX3N0cmluZ3MgPSAyOworICBmb3IgKGNocCA9IHByb3BlcnR5X3ZhbHVlOyAqY2hwOyBjaHArKykKKyAgICB7CisgICAgICBpZiAoKmNocCA9PSAnIicpCisJYXBwcm94X25yX3N0cmluZ3MrKzsKKyAgICB9CisgIGFwcHJveF9ucl9zdHJpbmdzID0gKGFwcHJveF9ucl9zdHJpbmdzKSAvIDI7CisgIAorICAvKiBjcmVhdGUgYSBzdHJpbmcgYnVmZmVyIGZvciB0aGF0IG1hbnkgKHBsdXMgYSBudWxsKSAqLworICBzdHJpbmdzID0gKGNoYXIqKikgemFsbG9jICgoYXBwcm94X25yX3N0cmluZ3MgKyAxKSAqIHNpemVvZihjaGFyKikpOworICAKKyAgLyogbm93IGZpbmQgYWxsIHRoZSBzdHJpbmdzICovCisgIGNocCA9IHByb3BlcnR5X3ZhbHVlOworICBucl9zdHJpbmdzID0gMDsKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgCisgICAgICAvKiBza2lwIGxlYWRpbmcgc3BhY2UgKi8KKyAgICAgIHdoaWxlICgqY2hwICE9ICdcMCcgJiYgaXNzcGFjZSAoKmNocCkpCisJY2hwICs9IDE7CisgICAgICBpZiAoKmNocCA9PSAnXDAnKQorCWJyZWFrOworICAgICAgCisgICAgICAvKiBjb3B5IGl0IGluICovCisgICAgICBpZiAoKmNocCA9PSAnIicpCisJeworCSAgLyogYSBxdW90ZWQgc3RyaW5nIC0gd2F0Y2ggZm9yICdcJyBldC5hbC4gKi8KKwkgIC8qIGVzdGltYXRlIHRoZSBzaXplIGFuZCBhbGxvY2F0ZSBzcGFjZSBmb3IgaXQgKi8KKwkgIGludCBwb3M7CisJICBjaHArKzsKKwkgIHBvcyA9IDA7CisJICB3aGlsZSAoY2hwW3Bvc10gIT0gJ1wwJyAmJiBjaHBbcG9zXSAhPSAnIicpCisJICAgIHsKKwkgICAgICBpZiAoY2hwW3Bvc10gPT0gJ1xcJyAmJiBjaHBbcG9zKzFdICE9ICdcMCcpCisJCXBvcyArPSAyOworCSAgICAgIGVsc2UKKwkJcG9zICs9IDE7CisJICAgIH0KKwkgIHN0cmluZ3NbbnJfc3RyaW5nc10gPSB6YWxsb2MgKHBvcyArIDEpOworCSAgLyogY29weSB0aGUgc3RyaW5nIG92ZXIgKi8KKwkgIHBvcyA9IDA7CisJICB3aGlsZSAoKmNocCAhPSAnXDAnICYmICpjaHAgIT0gJyInKQorCSAgICB7CisJICAgICAgaWYgKCpjaHAgPT0gJ1xcJyAmJiAqKGNocCsxKSAhPSAnXDAnKSB7CisJCXN0cmluZ3NbbnJfc3RyaW5nc11bcG9zXSA9ICooY2hwKzEpOworCQljaHAgKz0gMjsKKwkJcG9zKys7CisJICAgICAgfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHN0cmluZ3NbbnJfc3RyaW5nc11bcG9zXSA9ICpjaHA7CisJCSAgY2hwICs9IDE7CisJCSAgcG9zKys7CisJCX0KKwkgICAgfQorCSAgaWYgKCpjaHAgIT0gJ1wwJykKKwkgICAgY2hwKys7CisJICBzdHJpbmdzW25yX3N0cmluZ3NdW3Bvc10gPSAnXDAnOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBjb3B5IG92ZXIgYSBzaW5nbGUgdW5xdW90ZWQgdG9rZW4gKi8KKwkgIGludCBsZW4gPSAwOworCSAgd2hpbGUgKGNocFtsZW5dICE9ICdcMCcgJiYgIWlzc3BhY2UoY2hwW2xlbl0pKQorCSAgICBsZW4rKzsKKwkgIHN0cmluZ3NbbnJfc3RyaW5nc10gPSB6YWxsb2MobGVuICsgMSk7CisJICBzdHJuY3B5KHN0cmluZ3NbbnJfc3RyaW5nc10sIGNocCwgbGVuKTsKKwkgIHN0cmluZ3NbbnJfc3RyaW5nc11bbGVuXSA9ICdcMCc7CisJICBjaHAgKz0gbGVuOworCX0KKyAgICAgIG5yX3N0cmluZ3MrKzsKKyAgICAgIGlmIChucl9zdHJpbmdzID4gYXBwcm94X25yX3N0cmluZ3MpCisJaHdfYWJvcnQgKGN1cnJlbnQsICJTdHJpbmcgcHJvcGVydHkgJXMgYmFkbHkgZm9ybWF0dGVkIiwKKwkJICBwcm9wZXJ0eV9uYW1lKTsKKyAgICB9CisgIEFTU0VSVCAoc3RyaW5nc1tucl9zdHJpbmdzXSA9PSBOVUxMKTsgLyogZnJvbSB6YWxsb2MgKi8KKyAgCisgIC8qIGluc3RhbGwgaXQgKi8KKyAgaWYgKG5yX3N0cmluZ3MgPT0gMCkKKyAgICBod19hZGRfc3RyaW5nX3Byb3BlcnR5IChjdXJyZW50LCBwcm9wZXJ0eV9uYW1lLCAiIik7CisgIGVsc2UgaWYgKG5yX3N0cmluZ3MgPT0gMSkKKyAgICBod19hZGRfc3RyaW5nX3Byb3BlcnR5IChjdXJyZW50LCBwcm9wZXJ0eV9uYW1lLCBzdHJpbmdzWzBdKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKipzcGVjcyA9IChjb25zdCBjaGFyKiopIHN0cmluZ3M7IC8qIHN0b3AgYSBib2d1cyBlcnJvciAqLworICAgICAgaHdfYWRkX3N0cmluZ19hcnJheV9wcm9wZXJ0eSAoY3VycmVudCwgcHJvcGVydHlfbmFtZSwKKwkJCQkgICAgc3BlY3MsIG5yX3N0cmluZ3MpOworICAgIH0KKyAgCisgIC8qIGZsdXNoIHRoZSBjcmVhdGVkIHN0cmluZyAqLworICB3aGlsZSAobnJfc3RyaW5ncyA+IDApCisgICAgeworICAgICAgbnJfc3RyaW5ncy0tOworICAgICAgemZyZWUgKHN0cmluZ3NbbnJfc3RyaW5nc10pOworICAgIH0KKyAgemZyZWUoc3RyaW5ncyk7Cit9CisKKworLyogPHBhdGgtdG8taWhhbmRsZS1kZXZpY2U+ICovCisKKyNpZiBOT1RfWUVUCitzdGF0aWMgdm9pZAorcGFyc2VfaWhhbmRsZV9wcm9wZXJ0eSAoc3RydWN0IGh3ICpjdXJyZW50LAorCQkJY29uc3QgY2hhciAqcHJvcGVydHksCisJCQljb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5X3NwZWMgaWhhbmRsZTsKKyAgCisgIC8qIHBhc3MgdGhlIGZ1bGwgcGF0aCAqLworICBpaGFuZGxlLmZ1bGxfcGF0aCA9IHZhbHVlOworICAKKyAgLyogc2F2ZSB0aGlzIHJlYWR5IGZvciB0aGUgaWhhbmRsZSBjcmVhdGUgKi8KKyAgaHdfYWRkX2loYW5kbGVfcnVudGltZV9wcm9wZXJ0eSAoY3VycmVudCwgcHJvcGVydHksCisJCQkJICAgJmloYW5kbGUpOworfQorI2VuZGlmCisKKworc3RydWN0IGh3ICoKK2h3X3RyZWVfY3JlYXRlIChTSU1fREVTQyBzZCwKKwkJY29uc3QgY2hhciAqZmFtaWx5KQoreworICByZXR1cm4gaHdfY3JlYXRlIChzZCwgTlVMTCwgZmFtaWx5LCBmYW1pbHksIE5VTEwsIE5VTEwpOworfQorCit2b2lkCitod190cmVlX2RlbGV0ZSAoc3RydWN0IGh3ICptZSkKK3sKKyAgLyogTmVlZCB0byBhbGxvdyBkZXZpY2VzIHRvIGRpc2FwZWFyIHVuZGVyIG91ciBmZWV0ICovCisgIHdoaWxlIChod19jaGlsZCAobWUpICE9IE5VTEwpCisgICAgeworICAgICAgaHdfdHJlZV9kZWxldGUgKGh3X2NoaWxkIChtZSkpOworICAgIH0KKyAgaHdfZGVsZXRlIChtZSk7Cit9CisKKworc3RydWN0IGh3ICoKK2h3X3RyZWVfcGFyc2UgKHN0cnVjdCBodyAqY3VycmVudCwKKwkgICAgICAgY29uc3QgY2hhciAqZm10LAorCSAgICAgICAuLi4pCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydCAoYXAsIGZtdCk7CisgICAgY3VycmVudCA9IGh3X3RyZWVfdnBhcnNlIChjdXJyZW50LCBmbXQsIGFwKTsKKyAgICB2YV9lbmQgKGFwKTsKKyAgICByZXR1cm4gY3VycmVudDsKK30KKyAgCitzdHJ1Y3QgaHcgKgoraHdfdHJlZV92cGFyc2UgKHN0cnVjdCBodyAqY3VycmVudCwKKwkJY29uc3QgY2hhciAqZm10LAorCQl2YV9saXN0IGFwKQoreworICBjaGFyIGRldmljZV9zcGVjaWZpZXJbMTAyNF07CisgIG5hbWVfc3BlY2lmaWVyIHNwZWM7CisgIAorICAvKiBmb3JtYXQgdGhlIHBhdGggKi8KKyAgdnNwcmludGYgKGRldmljZV9zcGVjaWZpZXIsIGZtdCwgYXApOworICBpZiAoc3RybGVuIChkZXZpY2Vfc3BlY2lmaWVyKSA+PSBzaXplb2YgKGRldmljZV9zcGVjaWZpZXIpKQorICAgIGh3X2Fib3J0IChOVUxMLCAiZGV2aWNlX3RyZWVfYWRkX2RldmljZWQ6IGJ1ZmZlciBvdmVyZmxvd1xuIik7CisgIAorICAvKiBjb25zdHJ1Y3QgdGhlIHRyZWUgZG93biB0byB0aGUgZmluYWwgc3RydWN0IGh3ICovCisgIGN1cnJlbnQgPSBzcGxpdF9maWxsX3BhdGggKGN1cnJlbnQsIGRldmljZV9zcGVjaWZpZXIsICZzcGVjKTsKKyAgCisgIC8qIGlzIHRoZXJlIGFuIGludGVycnVwdCBzcGVjICovCisgIGlmIChzcGVjLnByb3BlcnR5ID09IE5VTEwKKyAgICAgICYmIHNwZWMudmFsdWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBjaGFyICpvcCA9IHNwbGl0X3ZhbHVlICgmc3BlYyk7CisgICAgICBzd2l0Y2ggKG9wWzBdKQorCXsKKwljYXNlICc+JzoKKwkgIHsKKwkgICAgY2hhciAqbXlfcG9ydF9uYW1lID0gc3BsaXRfdmFsdWUgKCZzcGVjKTsKKwkgICAgaW50IG15X3BvcnQ7CisJICAgIGNoYXIgKmRlc3RfcG9ydF9uYW1lID0gc3BsaXRfdmFsdWUgKCZzcGVjKTsKKwkgICAgaW50IGRlc3RfcG9ydDsKKwkgICAgbmFtZV9zcGVjaWZpZXIgZGVzdF9zcGVjOworCSAgICBjaGFyICpkZXN0X2h3X25hbWUgPSBzcGxpdF92YWx1ZSAoJnNwZWMpOworCSAgICBzdHJ1Y3QgaHcgKmRlc3Q7CisJICAgIC8qIGZpbmQgbXkgbmFtZSAqLworCSAgICBpZiAoIWh3X2ZpbmlzaGVkX3AgKGN1cnJlbnQpKQorCSAgICAgIGh3X2ZpbmlzaCAoY3VycmVudCk7CisJICAgIG15X3BvcnQgPSBod19wb3J0X2RlY29kZSAoY3VycmVudCwgbXlfcG9ydF9uYW1lLCBvdXRwdXRfcG9ydCk7CisJICAgIC8qIGZpbmQgdGhlIGRlc3QgZGV2aWNlIGFuZCBwb3J0ICovCisJICAgIGRlc3QgPSBzcGxpdF9maWxsX3BhdGggKGN1cnJlbnQsIGRlc3RfaHdfbmFtZSwgJmRlc3Rfc3BlYyk7CisJICAgIGlmICghaHdfZmluaXNoZWRfcCAoZGVzdCkpCisJICAgICAgaHdfZmluaXNoIChkZXN0KTsKKwkgICAgZGVzdF9wb3J0ID0gaHdfcG9ydF9kZWNvZGUgKGRlc3QsIGRlc3RfcG9ydF9uYW1lLAorCQkJCQlpbnB1dF9wb3J0KTsKKwkgICAgLyogY29ubmVjdCB0aGUgdHdvICovCisJICAgIGh3X3BvcnRfYXR0YWNoIChjdXJyZW50LAorCQkJICAgIG15X3BvcnQsCisJCQkgICAgZGVzdCwKKwkJCSAgICBkZXN0X3BvcnQsCisJCQkgICAgcGVybWVuYW50X29iamVjdCk7CisJICAgIGJyZWFrOworCSAgfQorCWRlZmF1bHQ6CisJICBod19hYm9ydCAoY3VycmVudCwgInVucmVjb25pc2VkIGludGVycnVwdCBzcGVjICVzXG4iLCBzcGVjLnZhbHVlKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIAorICAvKiBpcyB0aGVyZSBhIHByb3BlcnR5ICovCisgIGlmIChzcGVjLnByb3BlcnR5ICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoc3BlYy52YWx1ZSwgInRydWUiKSA9PSAwKQorCWh3X2FkZF9ib29sZWFuX3Byb3BlcnR5IChjdXJyZW50LCBzcGVjLnByb3BlcnR5LCAxKTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc3BlYy52YWx1ZSwgImZhbHNlIikgPT0gMCkKKwlod19hZGRfYm9vbGVhbl9wcm9wZXJ0eSAoY3VycmVudCwgc3BlYy5wcm9wZXJ0eSwgMCk7CisgICAgICBlbHNlCisJeworCSAgY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpwcm9wZXJ0eTsKKwkgIHN3aXRjaCAoc3BlYy52YWx1ZVswXSkKKwkgICAgeworI2lmIE5PVF9ZRVQKKwkgICAgY2FzZSAnKic6CisJICAgICAgeworCQlwYXJzZV9paGFuZGxlX3Byb3BlcnR5IChjdXJyZW50LCBzcGVjLnByb3BlcnR5LCBzcGVjLnZhbHVlICsgMSk7CisJCWJyZWFrOworCSAgICAgIH0KKyNlbmRpZgorCSAgICBjYXNlICdbJzoKKwkgICAgICB7CisJCXVuc2lnbmVkOCB3b3Jkc1sxMDI0XTsKKwkJY2hhciAqY3VyciA9IHNwZWMudmFsdWUgKyAxOworCQlpbnQgbnJfd29yZHMgPSAwOworCQl3aGlsZSAoMSkKKwkJICB7CisJCSAgICBjaGFyICpuZXh0OworCQkgICAgd29yZHNbbnJfd29yZHNdID0gSDJCRV8xIChzdHJ0b3VsIChjdXJyLCAmbmV4dCwgMCkpOworCQkgICAgaWYgKGN1cnIgPT0gbmV4dCkKKwkJICAgICAgYnJlYWs7CisJCSAgICBjdXJyID0gbmV4dDsKKwkJICAgIG5yX3dvcmRzICs9IDE7CisJCSAgfQorCQlod19hZGRfYXJyYXlfcHJvcGVydHkgKGN1cnJlbnQsIHNwZWMucHJvcGVydHksCisJCQkJICAgICAgIHdvcmRzLCBzaXplb2Yod29yZHNbMF0pICogbnJfd29yZHMpOworCQlicmVhazsKKwkgICAgICB9CisJICAgIGNhc2UgJyInOgorCSAgICAgIHsKKwkJcGFyc2Vfc3RyaW5nX3Byb3BlcnR5IChjdXJyZW50LCBzcGVjLnByb3BlcnR5LCBzcGVjLnZhbHVlKTsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgICBjYXNlICchJzoKKwkgICAgICB7CisJCXNwZWMudmFsdWUrKzsKKwkJcHJvcGVydHkgPSBod190cmVlX2ZpbmRfcHJvcGVydHkgKGN1cnJlbnQsIHNwZWMudmFsdWUpOworCQlpZiAocHJvcGVydHkgPT0gTlVMTCkKKwkJICBod19hYm9ydCAoY3VycmVudCwgInByb3BlcnR5ICVzIG5vdCBmb3VuZFxuIiwgc3BlYy52YWx1ZSk7CisJCWh3X2FkZF9kdXBsaWNhdGVfcHJvcGVydHkgKGN1cnJlbnQsCisJCQkJCSAgIHNwZWMucHJvcGVydHksCisJCQkJCSAgIHByb3BlcnR5KTsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgICBkZWZhdWx0OgorCSAgICAgIHsKKwkJaWYgKHN0cmNtcCAoc3BlYy5wcm9wZXJ0eSwgInJlZyIpID09IDAKKwkJICAgIHx8IHN0cmNtcCAoc3BlYy5wcm9wZXJ0eSwgImFzc2lnbmVkLWFkZHJlc3NlcyIpID09IDAKKwkJICAgIHx8IHN0cmNtcCAoc3BlYy5wcm9wZXJ0eSwgImFsdGVybmF0ZS1yZWciKSA9PSAwKQorCQkgIHsKKwkJICAgIHBhcnNlX3JlZ19wcm9wZXJ0eSAoY3VycmVudCwgc3BlYy5wcm9wZXJ0eSwgc3BlYy52YWx1ZSk7CisJCSAgfQorCQllbHNlIGlmIChzdHJjbXAgKHNwZWMucHJvcGVydHksICJyYW5nZXMiKSA9PSAwKQorCQkgIHsKKwkJICAgIHBhcnNlX3Jhbmdlc19wcm9wZXJ0eSAoY3VycmVudCwgc3BlYy5wcm9wZXJ0eSwgc3BlYy52YWx1ZSk7CisJCSAgfQorCQllbHNlIGlmIChpc2RpZ2l0KHNwZWMudmFsdWVbMF0pCisJCQkgfHwgKHNwZWMudmFsdWVbMF0gPT0gJy0nICYmIGlzZGlnaXQoc3BlYy52YWx1ZVsxXSkpCisJCQkgfHwgKHNwZWMudmFsdWVbMF0gPT0gJysnICYmIGlzZGlnaXQoc3BlYy52YWx1ZVsxXSkpKQorCQkgIHsKKwkJICAgIHBhcnNlX2ludGVnZXJfcHJvcGVydHkoY3VycmVudCwgc3BlYy5wcm9wZXJ0eSwgc3BlYy52YWx1ZSk7CisJCSAgfQorCQllbHNlCisJCSAgcGFyc2Vfc3RyaW5nX3Byb3BlcnR5KGN1cnJlbnQsIHNwZWMucHJvcGVydHksIHNwZWMudmFsdWUpOworCQlicmVhazsKKwkgICAgICB9CisJICAgIH0KKwl9CisgICAgfQorICByZXR1cm4gY3VycmVudDsKK30KKworCitzdGF0aWMgdm9pZAorZmluaXNoX2h3X3RyZWUgKHN0cnVjdCBodyAqbWUsCisJCXZvaWQgKmRhdGEpCit7CisgIGlmICghaHdfZmluaXNoZWRfcCAobWUpKQorICAgIGh3X2ZpbmlzaCAobWUpOworfQorCit2b2lkCitod190cmVlX2ZpbmlzaCAoc3RydWN0IGh3ICpyb290KQoreworICBod190cmVlX3RyYXZlcnNlIChyb290LCBmaW5pc2hfaHdfdHJlZSwgTlVMTCwgTlVMTCk7Cit9CisKKworCit2b2lkCitod190cmVlX3RyYXZlcnNlIChzdHJ1Y3QgaHcgKnJvb3QsCisJCSAgaHdfdHJlZV90cmF2ZXJzZV9mdW5jdGlvbiAqcHJlZml4LAorCQkgIGh3X3RyZWVfdHJhdmVyc2VfZnVuY3Rpb24gKnBvc3RmaXgsCisJCSAgdm9pZCAqZGF0YSkKK3sKKyAgc3RydWN0IGh3ICpjaGlsZDsKKyAgaWYgKHByZWZpeCAhPSBOVUxMKQorICAgIHByZWZpeCAocm9vdCwgZGF0YSk7CisgIGZvciAoY2hpbGQgPSBod19jaGlsZCAocm9vdCk7CisgICAgICAgY2hpbGQgIT0gTlVMTDsKKyAgICAgICBjaGlsZCA9IGh3X3NpYmxpbmcgKGNoaWxkKSkKKyAgICB7CisgICAgICBod190cmVlX3RyYXZlcnNlIChjaGlsZCwgcHJlZml4LCBwb3N0Zml4LCBkYXRhKTsKKyAgICB9CisgIGlmIChwb3N0Zml4ICE9IE5VTEwpCisgICAgcG9zdGZpeCAocm9vdCwgZGF0YSk7Cit9CisKKworDAorc3RydWN0IHByaW50ZXIgeworICBod190cmVlX3ByaW50X2NhbGxiYWNrICpwcmludDsKKyAgdm9pZCAqZmlsZTsKK307CisKK3N0YXRpYyB2b2lkCitwcmludF9hZGRyZXNzIChzdHJ1Y3QgaHcgKmJ1cywKKwkgICAgICAgY29uc3QgaHdfdW5pdCAqcGh5cywKKwkgICAgICAgc3RydWN0IHByaW50ZXIgKnApCit7CisgIGNoYXIgdW5pdFszMl07CisgIGh3X3VuaXRfZW5jb2RlIChidXMsIHBoeXMsIHVuaXQsIHNpemVvZih1bml0KSk7CisgIHAtPnByaW50IChwLT5maWxlLCAiICVzIiwgdW5pdCk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9zaXplIChzdHJ1Y3QgaHcgKmJ1cywKKwkgICAgY29uc3QgaHdfdW5pdCAqc2l6ZSwKKwkgICAgc3RydWN0IHByaW50ZXIgKnApCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZS0+bnJfY2VsbHM7IGkrKykKKyAgICBpZiAoc2l6ZS0+Y2VsbHNbaV0gIT0gMCkKKyAgICAgIGJyZWFrOworICBpZiAoaSA8IHNpemUtPm5yX2NlbGxzKSB7CisgICAgcC0+cHJpbnQgKHAtPmZpbGUsICIgMHglbHgiLCAodW5zaWduZWQgbG9uZykgc2l6ZS0+Y2VsbHNbaV0pOworICAgIGkrKzsKKyAgICBmb3IgKDsgaSA8IHNpemUtPm5yX2NlbGxzOyBpKyspCisgICAgICBwLT5wcmludCAocC0+ZmlsZSwgIiwweCVseCIsICh1bnNpZ25lZCBsb25nKSBzaXplLT5jZWxsc1tpXSk7CisgIH0KKyAgZWxzZQorICAgIHAtPnByaW50IChwLT5maWxlLCAiIDAiKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X3JlZ19wcm9wZXJ0eSAoc3RydWN0IGh3ICptZSwKKwkJICAgIGNvbnN0IHN0cnVjdCBod19wcm9wZXJ0eSAqcHJvcGVydHksCisJCSAgICBzdHJ1Y3QgcHJpbnRlciAqcCkKK3sKKyAgaW50IHJlZ19ucjsKKyAgcmVnX3Byb3BlcnR5X3NwZWMgcmVnOworICBmb3IgKHJlZ19uciA9IDA7CisgICAgICAgaHdfZmluZF9yZWdfYXJyYXlfcHJvcGVydHkgKG1lLCBwcm9wZXJ0eS0+bmFtZSwgcmVnX25yLCAmcmVnKTsKKyAgICAgICByZWdfbnIrKykgeworICAgIHByaW50X2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLCAmcmVnLmFkZHJlc3MsIHApOworICAgIHByaW50X3NpemUgKG1lLCAmcmVnLnNpemUsIHApOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9yYW5nZXNfcHJvcGVydHkgKHN0cnVjdCBodyAqbWUsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgaHdfcHJvcGVydHkgKnByb3BlcnR5LAorCQkgICAgICAgc3RydWN0IHByaW50ZXIgKnApCit7CisgIGludCByYW5nZV9ucjsKKyAgcmFuZ2VfcHJvcGVydHlfc3BlYyByYW5nZTsKKyAgZm9yIChyYW5nZV9uciA9IDA7CisgICAgICAgaHdfZmluZF9yYW5nZV9hcnJheV9wcm9wZXJ0eSAobWUsIHByb3BlcnR5LT5uYW1lLCByYW5nZV9uciwgJnJhbmdlKTsKKyAgICAgICByYW5nZV9ucisrKQorICAgIHsKKyAgICAgIHByaW50X2FkZHJlc3MgKG1lLCAmcmFuZ2UuY2hpbGRfYWRkcmVzcywgcCk7CisgICAgICBwcmludF9hZGRyZXNzIChod19wYXJlbnQgKG1lKSwgJnJhbmdlLnBhcmVudF9hZGRyZXNzLCBwKTsKKyAgICAgIHByaW50X3NpemUgKG1lLCAmcmFuZ2Uuc2l6ZSwgcCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfc3RyaW5nIChzdHJ1Y3QgaHcgKm1lLAorCSAgICAgIGNvbnN0IGNoYXIgKnN0cmluZywKKwkgICAgICBzdHJ1Y3QgcHJpbnRlciAqcCkKK3sKKyAgcC0+cHJpbnQgKHAtPmZpbGUsICIgXCIiKTsKKyAgd2hpbGUgKCpzdHJpbmcgIT0gJ1wwJykgeworICAgIHN3aXRjaCAoKnN0cmluZykgeworICAgIGNhc2UgJyInOgorICAgICAgcC0+cHJpbnQgKHAtPmZpbGUsICJcXFwiIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcXCc6CisgICAgICBwLT5wcmludCAocC0+ZmlsZSwgIlxcXFwiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBwLT5wcmludCAocC0+ZmlsZSwgIiVjIiwgKnN0cmluZyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgc3RyaW5nKys7CisgIH0KKyAgcC0+cHJpbnQgKHAtPmZpbGUsICJcIiIpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfc3RyaW5nX2FycmF5X3Byb3BlcnR5IChzdHJ1Y3QgaHcgKm1lLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaHdfcHJvcGVydHkgKnByb3BlcnR5LAorCQkJICAgICBzdHJ1Y3QgcHJpbnRlciAqcCkKK3sKKyAgaW50IG5yOworICBzdHJpbmdfcHJvcGVydHlfc3BlYyBzdHJpbmc7CisgIGZvciAobnIgPSAwOworICAgICAgIGh3X2ZpbmRfc3RyaW5nX2FycmF5X3Byb3BlcnR5IChtZSwgcHJvcGVydHktPm5hbWUsIG5yLCAmc3RyaW5nKTsKKyAgICAgICBucisrKQorICAgIHsKKyAgICAgIHByaW50X3N0cmluZyAobWUsIHN0cmluZywgcCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfcHJvcGVydGllcyAoc3RydWN0IGh3ICptZSwKKwkJICBzdHJ1Y3QgcHJpbnRlciAqcCkKK3sKKyAgY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpwcm9wZXJ0eTsKKyAgZm9yIChwcm9wZXJ0eSA9IGh3X2ZpbmRfcHJvcGVydHkgKG1lLCBOVUxMKTsKKyAgICAgICBwcm9wZXJ0eSAhPSBOVUxMOworICAgICAgIHByb3BlcnR5ID0gaHdfbmV4dF9wcm9wZXJ0eSAocHJvcGVydHkpKQorICAgIHsKKyAgICAgIGlmIChod19wYXJlbnQgKG1lKSA9PSBOVUxMKQorCXAtPnByaW50IChwLT5maWxlLCAiLyVzIiwgcHJvcGVydHktPm5hbWUpOworICAgICAgZWxzZQorCXAtPnByaW50IChwLT5maWxlLCAiJXMvJXMiLCBod19wYXRoIChtZSksIHByb3BlcnR5LT5uYW1lKTsKKyAgICAgIGlmIChwcm9wZXJ0eS0+b3JpZ2luYWwgIT0gTlVMTCkKKwl7CisJICBwLT5wcmludCAocC0+ZmlsZSwgIiAhIik7CisJICBwLT5wcmludCAocC0+ZmlsZSwgIiVzLyVzIiwgCisJCSAgICAgaHdfcGF0aCAocHJvcGVydHktPm9yaWdpbmFsLT5vd25lciksCisJCSAgICAgcHJvcGVydHktPm9yaWdpbmFsLT5uYW1lKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3dpdGNoIChwcm9wZXJ0eS0+dHlwZSkKKwkgICAgeworCSAgICBjYXNlIGFycmF5X3Byb3BlcnR5OgorCSAgICAgIHsKKwkJaWYgKChwcm9wZXJ0eS0+c2l6ZW9mX2FycmF5ICUgc2l6ZW9mIChzaWduZWRfY2VsbCkpID09IDApCisJCSAgeworCQkgICAgdW5zaWduZWRfY2VsbCAqdyA9ICh1bnNpZ25lZF9jZWxsKikgcHJvcGVydHktPmFycmF5OworCQkgICAgaW50IGNlbGxfbnI7CisJCSAgICBmb3IgKGNlbGxfbnIgPSAwOworCQkJIGNlbGxfbnIgPCAocHJvcGVydHktPnNpemVvZl9hcnJheSAvIHNpemVvZiAodW5zaWduZWRfY2VsbCkpOworCQkJIGNlbGxfbnIrKykKKwkJICAgICAgeworCQkJcC0+cHJpbnQgKHAtPmZpbGUsICIgMHglbHgiLCAodW5zaWduZWQgbG9uZykgQkUySF9jZWxsICh3W2NlbGxfbnJdKSk7CisJCSAgICAgIH0KKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICB1bnNpZ25lZDggKncgPSAodW5zaWduZWQ4Kilwcm9wZXJ0eS0+YXJyYXk7CisJCSAgICBwLT5wcmludCAocC0+ZmlsZSwgIiBbIik7CisJCSAgICB3aGlsZSAoKGNoYXIqKXcgLSAoY2hhciopcHJvcGVydHktPmFycmF5IDwgcHJvcGVydHktPnNpemVvZl9hcnJheSkgeworCQkgICAgICBwLT5wcmludCAocC0+ZmlsZSwgIiAweCUyeCIsIEJFMkhfMSAoKncpKTsKKwkJICAgICAgdysrOworCQkgICAgfQorCQkgIH0KKwkJYnJlYWs7CisJICAgICAgfQorCSAgICBjYXNlIGJvb2xlYW5fcHJvcGVydHk6CisJICAgICAgeworCQlpbnQgYiA9IGh3X2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eShtZSwgcHJvcGVydHktPm5hbWUpOworCQlwLT5wcmludCAocC0+ZmlsZSwgIiAlcyIsIGIgPyAidHJ1ZSIgIDogImZhbHNlIik7CisJCWJyZWFrOworCSAgICAgIH0KKyNpZiBOT1RfWUVUCisJICAgIGNhc2UgaWhhbmRsZV9wcm9wZXJ0eToKKwkgICAgICB7CisJCWlmIChwcm9wZXJ0eS0+YXJyYXkgIT0gTlVMTCkKKwkJICB7CisJCSAgICBkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlID0gaHdfZmluZF9paGFuZGxlX3Byb3BlcnR5IChtZSwgcHJvcGVydHktPm5hbWUpOworCQkgICAgcC0+cHJpbnQgKHAtPmZpbGUsICIgKiVzIiwgZGV2aWNlX2luc3RhbmNlX3BhdGgoaW5zdGFuY2UpKTsKKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICAvKiBub3QgeWV0IGluaXRpYWxpemVkLCBhc2sgdGhlIGRldmljZSBmb3IgdGhlIHBhdGggKi8KKwkJICAgIGloYW5kbGVfcnVudGltZV9wcm9wZXJ0eV9zcGVjIHNwZWM7CisJCSAgICBod19maW5kX2loYW5kbGVfcnVudGltZV9wcm9wZXJ0eSAobWUsIHByb3BlcnR5LT5uYW1lLCAmc3BlYyk7CisJCSAgICBwLT5wcmludCAocC0+ZmlsZSwgIiAqJXMiLCBzcGVjLmZ1bGxfcGF0aCk7CisJCSAgfQorCQlicmVhazsKKwkgICAgICB9CisjZW5kaWYKKwkgICAgY2FzZSBpbnRlZ2VyX3Byb3BlcnR5OgorCSAgICAgIHsKKwkJdW5zaWduZWRfd29yZCB3ID0gaHdfZmluZF9pbnRlZ2VyX3Byb3BlcnR5IChtZSwgcHJvcGVydHktPm5hbWUpOworCQlwLT5wcmludCAocC0+ZmlsZSwgIiAweCVseCIsICh1bnNpZ25lZCBsb25nKXcpOworCQlicmVhazsKKwkgICAgICB9CisJICAgIGNhc2UgcmFuZ2VfYXJyYXlfcHJvcGVydHk6CisJICAgICAgeworCQlwcmludF9yYW5nZXNfcHJvcGVydHkgKG1lLCBwcm9wZXJ0eSwgcCk7CisJCWJyZWFrOworCSAgICAgIH0KKwkgICAgY2FzZSByZWdfYXJyYXlfcHJvcGVydHk6CisJICAgICAgeworCQlwcmludF9yZWdfcHJvcGVydHkgKG1lLCBwcm9wZXJ0eSwgcCk7CisJCWJyZWFrOworCSAgICAgIH0KKwkgICAgY2FzZSBzdHJpbmdfcHJvcGVydHk6CisJICAgICAgeworCQljb25zdCBjaGFyICpzID0gaHdfZmluZF9zdHJpbmdfcHJvcGVydHkgKG1lLCBwcm9wZXJ0eS0+bmFtZSk7CisJCXByaW50X3N0cmluZyAobWUsIHMsIHApOworCQlicmVhazsKKwkgICAgICB9CisJICAgIGNhc2Ugc3RyaW5nX2FycmF5X3Byb3BlcnR5OgorCSAgICAgIHsKKwkJcHJpbnRfc3RyaW5nX2FycmF5X3Byb3BlcnR5IChtZSwgcHJvcGVydHksIHApOworCQlicmVhazsKKwkgICAgICB9CisJICAgIH0KKwl9CisgICAgICBwLT5wcmludCAocC0+ZmlsZSwgIlxuIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfaW50ZXJydXB0cyAoc3RydWN0IGh3ICptZSwKKyAgICAgICAgICAgICAgICAgIGludCBteV9wb3J0LAorCQkgIHN0cnVjdCBodyAqZGVzdCwKKwkJICBpbnQgZGVzdF9wb3J0LAorCQkgIHZvaWQgKmRhdGEpCit7CisgIHN0cnVjdCBwcmludGVyICpwID0gZGF0YTsKKyAgY2hhciBzcmNbMzJdOworICBjaGFyIGRzdFszMl07CisgIGh3X3BvcnRfZW5jb2RlIChtZSwgbXlfcG9ydCwgc3JjLCBzaXplb2Yoc3JjKSwgb3V0cHV0X3BvcnQpOworICBod19wb3J0X2VuY29kZSAoZGVzdCwgZGVzdF9wb3J0LCBkc3QsIHNpemVvZihkc3QpLCBpbnB1dF9wb3J0KTsKKyAgcC0+cHJpbnQgKHAtPmZpbGUsCisJICAgICIlcyA+ICVzICVzICVzXG4iLAorCSAgICBod19wYXRoIChtZSksCisJICAgIHNyYywgZHN0LAorCSAgICBod19wYXRoIChkZXN0KSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9kZXZpY2UgKHN0cnVjdCBodyAqbWUsCisJICAgICAgdm9pZCAqZGF0YSkKK3sKKyAgc3RydWN0IHByaW50ZXIgKnAgPSBkYXRhOworICBwLT5wcmludCAocC0+ZmlsZSwgIiVzXG4iLCBod19wYXRoIChtZSkpOworICBwcmludF9wcm9wZXJ0aWVzIChtZSwgcCk7CisgIGh3X3BvcnRfdHJhdmVyc2UgKG1lLCBwcmludF9pbnRlcnJ1cHRzLCBkYXRhKTsKK30KKwordm9pZAoraHdfdHJlZV9wcmludCAoc3RydWN0IGh3ICpyb290LAorCSAgICAgICBod190cmVlX3ByaW50X2NhbGxiYWNrICpwcmludCwKKwkgICAgICAgdm9pZCAqZmlsZSkKK3sKKyAgc3RydWN0IHByaW50ZXIgcDsKKyAgcC5wcmludCA9IHByaW50OworICBwLmZpbGUgPSBmaWxlOworICBod190cmVlX3RyYXZlcnNlIChyb290LAorCQkgICAgcHJpbnRfZGV2aWNlLCBOVUxMLAorCQkgICAgJnApOworfQorCisKKwwKKyNpZiBOT1RfWUVUCitkZXZpY2VfaW5zdGFuY2UgKgordHJlZV9pbnN0YW5jZShzdHJ1Y3QgaHcgKnJvb3QsCisJICAgICAgY29uc3QgY2hhciAqZGV2aWNlX3NwZWNpZmllcikKK3sKKyAgLyogZmluZCB0aGUgZGV2aWNlIG5vZGUgKi8KKyAgc3RydWN0IGh3ICptZTsKKyAgbmFtZV9zcGVjaWZpZXIgc3BlYzsKKyAgaWYgKCFzcGxpdF9kZXZpY2Vfc3BlY2lmaWVyKHJvb3QsIGRldmljZV9zcGVjaWZpZXIsICZzcGVjKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgbWUgPSBzcGxpdF9maW5kX2RldmljZShyb290LCAmc3BlYyk7CisgIGlmIChzcGVjLm5hbWUgIT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgLyogY3JlYXRlIHRoZSBpbnN0YW5jZSAqLworICByZXR1cm4gZGV2aWNlX2NyZWF0ZV9pbnN0YW5jZShtZSwgZGV2aWNlX3NwZWNpZmllciwgc3BlYy5sYXN0X2FyZ3MpOworfQorI2VuZGlmCisKK3N0cnVjdCBodyAqCitod190cmVlX2ZpbmRfZGV2aWNlIChzdHJ1Y3QgaHcgKnJvb3QsCisJCSAgICAgY29uc3QgY2hhciAqcGF0aF90b19kZXZpY2UpCit7CisgIHN0cnVjdCBodyAqbm9kZTsKKyAgbmFtZV9zcGVjaWZpZXIgc3BlYzsKKyAgCisgIC8qIHBhcnNlIHRoZSBwYXRoICovCisgIHNwbGl0X2RldmljZV9zcGVjaWZpZXIgKHJvb3QsIHBhdGhfdG9fZGV2aWNlLCAmc3BlYyk7CisgIGlmIChzcGVjLnZhbHVlICE9IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7IC8qIHNvbWV0aGluZyB3aWVyZCAqLworICAKKyAgLyogbm93IGZpbmQgaXQgKi8KKyAgbm9kZSA9IHNwbGl0X2ZpbmRfZGV2aWNlIChyb290LCAmc3BlYyk7CisgIGlmIChzcGVjLm5hbWUgIT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsgLyogbm90IGEgbGVhZiAqLworICAKKyAgcmV0dXJuIG5vZGU7Cit9CisKKworY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICoKK2h3X3RyZWVfZmluZF9wcm9wZXJ0eSAoc3RydWN0IGh3ICpyb290LAorCQkgICAgICAgY29uc3QgY2hhciAqcGF0aF90b19wcm9wZXJ0eSkKK3sKKyAgbmFtZV9zcGVjaWZpZXIgc3BlYzsKKyAgaWYgKCFzcGxpdF9wcm9wZXJ0eV9zcGVjaWZpZXIgKHJvb3QsIHBhdGhfdG9fcHJvcGVydHksICZzcGVjKSkKKyAgICBod19hYm9ydCAocm9vdCwgIkludmFsaWQgcHJvcGVydHkgcGF0aCAlcyIsIHBhdGhfdG9fcHJvcGVydHkpOworICByb290ID0gc3BsaXRfZmluZF9kZXZpY2UgKHJvb3QsICZzcGVjKTsKKyAgaWYgKHNwZWMubmFtZSAhPSBOVUxMKQorICAgIHJldHVybiBOVUxMOyAvKiBub3QgYSBsZWFmICovCisgIHJldHVybiBod19maW5kX3Byb3BlcnR5IChyb290LCBzcGVjLnByb3BlcnR5KTsKK30KKworaW50Citod190cmVlX2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eSAoc3RydWN0IGh3ICpyb290LAorCQkJICAgICAgIGNvbnN0IGNoYXIgKnBhdGhfdG9fcHJvcGVydHkpCit7CisgIG5hbWVfc3BlY2lmaWVyIHNwZWM7CisgIGlmICghc3BsaXRfcHJvcGVydHlfc3BlY2lmaWVyIChyb290LCBwYXRoX3RvX3Byb3BlcnR5LCAmc3BlYykpCisgICAgaHdfYWJvcnQgKHJvb3QsICJJbnZhbGlkIHByb3BlcnR5IHBhdGggJXMiLCBwYXRoX3RvX3Byb3BlcnR5KTsKKyAgcm9vdCA9IHNwbGl0X2ZpbmRfZGV2aWNlIChyb290LCAmc3BlYyk7CisgIGlmIChzcGVjLm5hbWUgIT0gTlVMTCkKKyAgICBod19hYm9ydCAocm9vdCwgImRldmljZSBcIiVzXCIgbm90IGZvdW5kIChwcm9wZXJ0eSBcIiVzXCIpIiwKKwkgICAgICBzcGVjLm5hbWUsIHBhdGhfdG9fcHJvcGVydHkpOworICByZXR1cm4gaHdfZmluZF9ib29sZWFuX3Byb3BlcnR5IChyb290LCBzcGVjLnByb3BlcnR5KTsKK30KKworc2lnbmVkX2NlbGwKK2h3X3RyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKnJvb3QsCisJCQkgICAgICAgY29uc3QgY2hhciAqcGF0aF90b19wcm9wZXJ0eSkKK3sKKyAgbmFtZV9zcGVjaWZpZXIgc3BlYzsKKyAgaWYgKCFzcGxpdF9wcm9wZXJ0eV9zcGVjaWZpZXIgKHJvb3QsIHBhdGhfdG9fcHJvcGVydHksICZzcGVjKSkKKyAgICBod19hYm9ydCAocm9vdCwgIkludmFsaWQgcHJvcGVydHkgcGF0aCAlcyIsIHBhdGhfdG9fcHJvcGVydHkpOworICByb290ID0gc3BsaXRfZmluZF9kZXZpY2UgKHJvb3QsICZzcGVjKTsKKyAgaWYgKHNwZWMubmFtZSAhPSBOVUxMKQorICAgIGh3X2Fib3J0IChyb290LCAiZGV2aWNlIFwiJXNcIiBub3QgZm91bmQgKHByb3BlcnR5IFwiJXNcIikiLAorCSAgICAgIHNwZWMubmFtZSwgcGF0aF90b19wcm9wZXJ0eSk7CisgIHJldHVybiBod19maW5kX2ludGVnZXJfcHJvcGVydHkgKHJvb3QsIHNwZWMucHJvcGVydHkpOworfQorCisjaWYgTk9UX1lFVAorZGV2aWNlX2luc3RhbmNlICoKK2h3X3RyZWVfZmluZF9paGFuZGxlX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKnJvb3QsCisJCQkgICAgICAgY29uc3QgY2hhciAqcGF0aF90b19wcm9wZXJ0eSkKK3sKKyAgc3RydWN0IGh3ICpyb290OworICBuYW1lX3NwZWNpZmllciBzcGVjOworICBpZiAoIXNwbGl0X3Byb3BlcnR5X3NwZWNpZmllciAocm9vdCwgcGF0aF90b19wcm9wZXJ0eSwgJnNwZWMpKQorICAgIGh3X2Fib3J0IChyb290LCAiSW52YWxpZCBwcm9wZXJ0eSBwYXRoICVzIiwgcGF0aF90b19wcm9wZXJ0eSk7CisgIHJvb3QgPSBzcGxpdF9maW5kX2RldmljZSAocm9vdCwgJnNwZWMpOworICBpZiAoc3BlYy5uYW1lICE9IE5VTEwpCisgICAgaHdfYWJvcnQgKHJvb3QsICJkZXZpY2UgXCIlc1wiIG5vdCBmb3VuZCAocHJvcGVydHkgXCIlc1wiKSIsCisJICAgICAgc3BlYy5uYW1lLCBwYXRoX3RvX3Byb3BlcnR5KTsKKyAgcmV0dXJuIGh3X2ZpbmRfaWhhbmRsZV9wcm9wZXJ0eSAocm9vdCwgc3BlYy5wcm9wZXJ0eSk7Cit9CisjZW5kaWYKKworY29uc3QgY2hhciAqCitod190cmVlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5IChzdHJ1Y3QgaHcgKnJvb3QsCisJCQkgICAgICBjb25zdCBjaGFyICpwYXRoX3RvX3Byb3BlcnR5KQoreworICBuYW1lX3NwZWNpZmllciBzcGVjOworICBpZiAoIXNwbGl0X3Byb3BlcnR5X3NwZWNpZmllciAocm9vdCwgcGF0aF90b19wcm9wZXJ0eSwgJnNwZWMpKQorICAgIGh3X2Fib3J0IChyb290LCAiSW52YWxpZCBwcm9wZXJ0eSBwYXRoICVzIiwgcGF0aF90b19wcm9wZXJ0eSk7CisgIHJvb3QgPSBzcGxpdF9maW5kX2RldmljZSAocm9vdCwgJnNwZWMpOworICBpZiAoc3BlYy5uYW1lICE9IE5VTEwpCisgICAgaHdfYWJvcnQgKHJvb3QsICJkZXZpY2UgXCIlc1wiIG5vdCBmb3VuZCAocHJvcGVydHkgXCIlc1wiKSIsCisJICAgICAgc3BlYy5uYW1lLCBwYXRoX3RvX3Byb3BlcnR5KTsKKyAgcmV0dXJuIGh3X2ZpbmRfc3RyaW5nX3Byb3BlcnR5IChyb290LCBzcGVjLnByb3BlcnR5KTsKK30KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vaHctdHJlZS5oIGIvc2ltL2NvbW1vbi9ody10cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhNTY4MQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vaHctdHJlZS5oCkBAIC0wLDAgKzEsMTE5IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIEhXX1RSRUUKKyNkZWZpbmUgSFdfVFJFRQorCisKK3N0cnVjdCBodyAqaHdfdHJlZV9jcmVhdGUKKyhTSU1fREVTQyBzZCwKKyBjb25zdCBjaGFyICpkZXZpY2UpOworCit2b2lkIGh3X3RyZWVfZGVsZXRlCisoc3RydWN0IGh3ICpyb290KTsKKworc3RydWN0IGh3ICpod190cmVlX3BhcnNlCisoc3RydWN0IGh3ICpyb290LAorIGNvbnN0IGNoYXIgKmZtdCwKKyAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKKworc3RydWN0IGh3ICpod190cmVlX3ZwYXJzZQorKHN0cnVjdCBodyAqcm9vdCwKKyBjb25zdCBjaGFyICpmbXQsCisgdmFfbGlzdCBhcCk7CisKKwordm9pZCBod190cmVlX2ZpbmlzaAorKHN0cnVjdCBodyAqcm9vdCk7CisKK3R5cGVkZWYgdm9pZCAoaHdfdHJlZV9wcmludF9jYWxsYmFjaykKKyAgICAgKHZvaWQgKiwKKyAgICAgIGNvbnN0IGNoYXIgKmZtdCwKKyAgICAgIC4uLik7CisKK3ZvaWQgaHdfdHJlZV9wcmludAorKHN0cnVjdCBodyAqcm9vdCwKKyBod190cmVlX3ByaW50X2NhbGxiYWNrICpwcmludCwKKyB2b2lkICpmaWxlKTsKKworCisvKiBUcmVlIHRyYXZlcnNhbDo6CisKKyAgIFRoZSBlbnRpcmUgZGV2aWNlIHRyZWUgY2FuIGJlIHRyYXZlcnNlZCB1c2luZyB0aGUKKyAgIDw8ZGV2aWNlX3RyZWVfdHJhdmVyc2UoKT4+IGZ1bmN0aW9uLiAgVGhlIHRyYXZlcnNhbCBjYW4gYmUgaW4KKyAgIGVpdGhlciBwcmVmaXggb3IgcG9zdGZpeCBvcmRlci4KKworICAgKi8KKwordHlwZWRlZiB2b2lkIChod190cmVlX3RyYXZlcnNlX2Z1bmN0aW9uKQorICAgICAoc3RydWN0IGh3ICpkZXZpY2UsCisgICAgICB2b2lkICpkYXRhKTsKKwordm9pZCBod190cmVlX3RyYXZlcnNlCisoc3RydWN0IGh3ICpyb290LAorIGh3X3RyZWVfdHJhdmVyc2VfZnVuY3Rpb24gKnByZWZpeCwKKyBod190cmVlX3RyYXZlcnNlX2Z1bmN0aW9uICpwb3N0Zml4LAorIHZvaWQgKmRhdGEpOworCisKKy8qIFRyZWUgbG9va3VwOjoKKworICAgVGhlIGZ1bmN0aW9uIDw8aHdfdHJlZV9maW5kX2RldmljZSgpPj4gd2lsbCBhdHRlbXB0IHRvIGxvY2F0ZSB0aGUKKyAgIHNwZWNpZmllZCBkZXZpY2Ugd2l0aGluIHRoZSB0cmVlLiAgSWYgdGhlIGRldmljZSBpcyBub3QgZm91bmQgYQorICAgTlVMTCBkZXZpY2UgaXMgcmV0dXJuZWQuCisKKyAgICovCisKK3N0cnVjdCBodyAqIGh3X3RyZWVfZmluZF9kZXZpY2UKKyhzdHJ1Y3QgaHcgKnJvb3QsCisgY29uc3QgY2hhciAqcGF0aCk7CisKKworY29uc3Qgc3RydWN0IGh3X3Byb3BlcnR5ICpod190cmVlX2ZpbmRfcHJvcGVydHkKKyhzdHJ1Y3QgaHcgKnJvb3QsCisgY29uc3QgY2hhciAqcGF0aF90b19wcm9wZXJ0eSk7CisKK2ludCBod190cmVlX2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eQorKHN0cnVjdCBodyAqcm9vdCwKKyBjb25zdCBjaGFyICpwYXRoX3RvX3Byb3BlcnR5KTsKKworc2lnbmVkX2NlbGwgaHdfdHJlZV9maW5kX2ludGVnZXJfcHJvcGVydHkKKyhzdHJ1Y3QgaHcgKnJvb3QsCisgY29uc3QgY2hhciAqcGF0aF90b19wcm9wZXJ0eSk7CisKKyNpZiBOT1RfWUVUCitkZXZpY2VfaW5zdGFuY2UgKmh3X3RyZWVfZmluZF9paGFuZGxlX3Byb3BlcnR5Cisoc3RydWN0IGh3ICpyb290LAorIGNvbnN0IGNoYXIgKnBhdGhfdG9fcHJvcGVydHkpOworI2VuZGlmCisKK2NvbnN0IGNoYXIgKmh3X3RyZWVfZmluZF9zdHJpbmdfcHJvcGVydHkKKyhzdHJ1Y3QgaHcgKnJvb3QsCisgY29uc3QgY2hhciAqcGF0aF90b19wcm9wZXJ0eSk7CisKKworLyogUGVyZm9ybSBhIHNvZnQgcmVzZXQgb24gdGhlIGNyZWF0ZWQgdHJlZS4gKi8KKwordm9pZCBod190cmVlX3Jlc2V0Cisoc3RydWN0IGh3ICpyb290KTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vbmx0dmFscy5kZWYgYi9zaW0vY29tbW9uL25sdHZhbHMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZTgyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL25sdHZhbHMuZGVmCkBAIC0wLDAgKzEsNDE4IEBACisvKiBOZXdsaWIvbGliZ2xvc3MgbWFjcm8gdmFsdWVzIG5lZWRlZCBieSByZW1vdGUgdGFyZ2V0IHN1cHBvcnQuICAqLworLyogVGhpcyBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkIGJ5IGdlbm5sdHZhbHMuc2guICAqLworI2lmZGVmIGVycm5vX2RlZnMKKy8qIGZyb20gZXJybm8uaCAqLworLyogZnJvbSBzeXMvZXJybm8uaCAqLworLyogYmVnaW4gZXJybm8gdGFyZ2V0IG1hY3JvcyAqLworIHsgIkUyQklHIiwgNyAgfSwKKyB7ICJFQUNDRVMiLCAxMyAgfSwKKyB7ICJFQUREUklOVVNFIiwgMTEyICB9LAorIHsgIkVBRERSTk9UQVZBSUwiLCAxMjUgIH0sCisgeyAiRUFEViIsIDY4ICB9LAorIHsgIkVBRk5PU1VQUE9SVCIsIDEwNiAgfSwKKyB7ICJFQUdBSU4iLCAxMSAgfSwKKyB7ICJFQUxSRUFEWSIsIDEyMCAgfSwKKyB7ICJFQkFERSIsIDUwICB9LAorIHsgIkVCQURGIiwgOSAgfSwKKyB7ICJFQkFERkQiLCA4MSAgfSwKKyB7ICJFQkFETVNHIiwgNzcgIH0sCisgeyAiRUJBRFIiLCA1MSAgfSwKKyB7ICJFQkFEUlFDIiwgNTQgIH0sCisgeyAiRUJBRFNMVCIsIDU1ICB9LAorIHsgIkVCRk9OVCIsIDU3ICB9LAorIHsgIkVCVVNZIiwgMTYgIH0sCisgeyAiRUNISUxEIiwgMTAgIH0sCisgeyAiRUNIUk5HIiwgMzcgIH0sCisgeyAiRUNPTU0iLCA3MCAgfSwKKyB7ICJFQ09OTkFCT1JURUQiLCAxMTMgIH0sCisgeyAiRUNPTk5SRUZVU0VEIiwgMTExICB9LAorIHsgIkVDT05OUkVTRVQiLCAxMDQgIH0sCisgeyAiRURFQURMSyIsIDQ1ICB9LAorIHsgIkVERUFETE9DSyIsIDU2ICB9LAorIHsgIkVERVNUQUREUlJFUSIsIDEyMSAgfSwKKyB7ICJFRE9NIiwgMzMgIH0sCisgeyAiRURPVERPVCIsIDc2ICB9LAorIHsgIkVEUVVPVCIsIDEzMiAgfSwKKyB7ICJFRVhJU1QiLCAxNyAgfSwKKyB7ICJFRkFVTFQiLCAxNCAgfSwKKyB7ICJFRkJJRyIsIDI3ICB9LAorIHsgIkVIT1NURE9XTiIsIDExNyAgfSwKKyB7ICJFSE9TVFVOUkVBQ0giLCAxMTggIH0sCisgeyAiRUlEUk0iLCAzNiAgfSwKKyB7ICJFSU5QUk9HUkVTUyIsIDExOSAgfSwKKyB7ICJFSU5UUiIsIDQgIH0sCisgeyAiRUlOVkFMIiwgMjIgIH0sCisgeyAiRUlPIiwgNSAgfSwKKyB7ICJFSVNDT05OIiwgMTI3ICB9LAorIHsgIkVJU0RJUiIsIDIxICB9LAorIHsgIkVMMkhMVCIsIDQ0ICB9LAorIHsgIkVMMk5TWU5DIiwgMzggIH0sCisgeyAiRUwzSExUIiwgMzkgIH0sCisgeyAiRUwzUlNUIiwgNDAgIH0sCisgeyAiRUxCSU4iLCA3NSAgfSwKKyB7ICJFTElCQUNDIiwgODMgIH0sCisgeyAiRUxJQkJBRCIsIDg0ICB9LAorIHsgIkVMSUJFWEVDIiwgODcgIH0sCisgeyAiRUxJQk1BWCIsIDg2ICB9LAorIHsgIkVMSUJTQ04iLCA4NSAgfSwKKyB7ICJFTE5STkciLCA0MSAgfSwKKyB7ICJFTE9PUCIsIDkyICB9LAorIHsgIkVNRklMRSIsIDI0ICB9LAorIHsgIkVNTElOSyIsIDMxICB9LAorIHsgIkVNU0dTSVpFIiwgMTIyICB9LAorIHsgIkVNVUxUSUhPUCIsIDc0ICB9LAorIHsgIkVOQU1FVE9PTE9ORyIsIDkxICB9LAorIHsgIkVORVRET1dOIiwgMTE1ICB9LAorIHsgIkVORVRSRVNFVCIsIDEyNiAgfSwKKyB7ICJFTkVUVU5SRUFDSCIsIDExNCAgfSwKKyB7ICJFTkZJTEUiLCAyMyAgfSwKKyB7ICJFTk1GSUxFIiwgODkgIH0sCisgeyAiRU5PQU5PIiwgNTMgIH0sCisgeyAiRU5PQlVGUyIsIDEwNSAgfSwKKyB7ICJFTk9DU0kiLCA0MyAgfSwKKyB7ICJFTk9EQVRBIiwgNjEgIH0sCisgeyAiRU5PREVWIiwgMTkgIH0sCisgeyAiRU5PRU5UIiwgMiAgfSwKKyB7ICJFTk9FWEVDIiwgOCAgfSwKKyB7ICJFTk9MQ0siLCA0NiAgfSwKKyB7ICJFTk9MSU5LIiwgNjcgIH0sCisgeyAiRU5PTUVNIiwgMTIgIH0sCisgeyAiRU5PTVNHIiwgMzUgIH0sCisgeyAiRU5PTkVUIiwgNjQgIH0sCisgeyAiRU5PUEtHIiwgNjUgIH0sCisgeyAiRU5PUFJPVE9PUFQiLCAxMDkgIH0sCisgeyAiRU5PU1BDIiwgMjggIH0sCisgeyAiRU5PU1IiLCA2MyAgfSwKKyB7ICJFTk9TVFIiLCA2MCAgfSwKKyB7ICJFTk9TWVMiLCA4OCAgfSwKKyB7ICJFTk9UQkxLIiwgMTUgIH0sCisgeyAiRU5PVENPTk4iLCAxMjggIH0sCisgeyAiRU5PVERJUiIsIDIwICB9LAorIHsgIkVOT1RFTVBUWSIsIDkwICB9LAorIHsgIkVOT1RTT0NLIiwgMTA4ICB9LAorIHsgIkVOT1RTVVAiLCAxMzQgIH0sCisgeyAiRU5PVFRZIiwgMjUgIH0sCisgeyAiRU5PVFVOSVEiLCA4MCAgfSwKKyB7ICJFTlhJTyIsIDYgIH0sCisgeyAiRU9QTk9UU1VQUCIsIDk1ICB9LAorIHsgIkVQRVJNIiwgMSAgfSwKKyB7ICJFUEZOT1NVUFBPUlQiLCA5NiAgfSwKKyB7ICJFUElQRSIsIDMyICB9LAorIHsgIkVQUk9DTElNIiwgMTMwICB9LAorIHsgIkVQUk9UTyIsIDcxICB9LAorIHsgIkVQUk9UT05PU1VQUE9SVCIsIDEyMyAgfSwKKyB7ICJFUFJPVE9UWVBFIiwgMTA3ICB9LAorIHsgIkVSQU5HRSIsIDM0ICB9LAorIHsgIkVSRU1DSEciLCA4MiAgfSwKKyB7ICJFUkVNT1RFIiwgNjYgIH0sCisgeyAiRVJPRlMiLCAzMCAgfSwKKyB7ICJFU0hVVERPV04iLCAxMTAgIH0sCisgeyAiRVNPQ0tUTk9TVVBQT1JUIiwgMTI0ICB9LAorIHsgIkVTUElQRSIsIDI5ICB9LAorIHsgIkVTUkNIIiwgMyAgfSwKKyB7ICJFU1JNTlQiLCA2OSAgfSwKKyB7ICJFU1RBTEUiLCAxMzMgIH0sCisgeyAiRVRJTUUiLCA2MiAgfSwKKyB7ICJFVElNRURPVVQiLCAxMTYgIH0sCisgeyAiRVRPT01BTllSRUZTIiwgMTI5ICB9LAorIHsgIkVUWFRCU1kiLCAyNiAgfSwKKyB7ICJFVU5BVENIIiwgNDIgIH0sCisgeyAiRVVTRVJTIiwgMTMxICB9LAorIHsgIkVXT1VMREJMT0NLIiwgMTEgICB9LAorIHsgIkVYREVWIiwgMTggIH0sCisgeyAiRVhGVUxMIiwgNTIgIH0sCisvKiBlbmQgZXJybm8gdGFyZ2V0IG1hY3JvcyAqLworI2VuZGlmCisjaWZkZWYgc2lnbmFsX2RlZnMKKy8qIGZyb20gc2lnbmFsLmggKi8KKy8qIGZyb20gc3lzL3NpZ25hbC5oICovCisvKiBiZWdpbiBzaWduYWwgdGFyZ2V0IG1hY3JvcyAqLworIHsgIlNJR0FCUlQiLCA2ICB9LAorIHsgIlNJR0FMUk0iLCAxNCAgfSwKKyB7ICJTSUdCVVMiLCAxMCAgfSwKKyB7ICJTSUdDSExEIiwgMjAgIH0sCisgeyAiU0lHQ0xEIiwgMjAgIH0sCisgeyAiU0lHQ09OVCIsIDE5ICB9LAorIHsgIlNJR0VNVCIsIDcgIH0sCisgeyAiU0lHRlBFIiwgOCAgfSwKKyB7ICJTSUdIVVAiLCAxICB9LAorIHsgIlNJR0lMTCIsIDQgIH0sCisgeyAiU0lHSU5UIiwgMiAgfSwKKyB7ICJTSUdJTyIsIDIzICB9LAorIHsgIlNJR0lPVCIsIDYgIH0sCisgeyAiU0lHS0lMTCIsIDkgIH0sCisgeyAiU0lHTE9TVCIsIDI5ICB9LAorIHsgIlNJR1BJUEUiLCAxMyAgfSwKKyB7ICJTSUdQT0xMIiwgMjMgICB9LAorIHsgIlNJR1BST0YiLCAyNyAgfSwKKyB7ICJTSUdRVUlUIiwgMyAgfSwKKyB7ICJTSUdTRUdWIiwgMTEgIH0sCisgeyAiU0lHU1RPUCIsIDE3ICB9LAorIHsgIlNJR1NZUyIsIDEyICB9LAorIHsgIlNJR1RFUk0iLCAxNSAgfSwKKyB7ICJTSUdUUkFQIiwgNSAgfSwKKyB7ICJTSUdUU1RQIiwgMTggIH0sCisgeyAiU0lHVFRJTiIsIDIxICB9LAorIHsgIlNJR1RUT1UiLCAyMiAgfSwKKyB7ICJTSUdVUkciLCAxNiAgfSwKKyB7ICJTSUdVU1IxIiwgMzAgIH0sCisgeyAiU0lHVVNSMiIsIDMxICB9LAorIHsgIlNJR1ZUQUxSTSIsIDI2ICB9LAorIHsgIlNJR1dJTkNIIiwgMjggIH0sCisgeyAiU0lHWENQVSIsIDI0ICB9LAorIHsgIlNJR1hGU1oiLCAyNSAgfSwKKy8qIGVuZCBzaWduYWwgdGFyZ2V0IG1hY3JvcyAqLworI2VuZGlmCisjaWZkZWYgb3Blbl9kZWZzCisvKiBmcm9tIGZjbnRsLmggKi8KKy8qIGZyb20gc3lzL2ZjbnRsLmggKi8KKy8qIGJlZ2luIG9wZW4gdGFyZ2V0IG1hY3JvcyAqLworIHsgIk9fQUNDTU9ERSIsICgwIHwgMSB8IDIgKSAgfSwKKyB7ICJPX0FQUEVORCIsIDB4MDAwOCAgIH0sCisgeyAiT19DUkVBVCIsIDB4MDIwMCAgIH0sCisgeyAiT19FWENMIiwgMHgwODAwICAgfSwKKyB7ICJPX05PQ1RUWSIsIDB4ODAwMCAgIH0sCisgeyAiT19OT05CTE9DSyIsIDB4NDAwMCAgIH0sCisgeyAiT19SRE9OTFkiLCAwICB9LAorIHsgIk9fUkRXUiIsIDIgIH0sCisgeyAiT19TWU5DIiwgMHgyMDAwICAgfSwKKyB7ICJPX1RSVU5DIiwgMHgwNDAwICAgfSwKKyB7ICJPX1dST05MWSIsIDEgIH0sCisvKiBlbmQgb3BlbiB0YXJnZXQgbWFjcm9zICovCisjZW5kaWYKKyNpZmRlZiBOTF9UQVJHRVRfZDEwdgorI2lmZGVmIHN5c19kZWZzCisvKiBmcm9tIHN5c2NhbGwuaCAqLworLyogYmVnaW4gZDEwdiBzeXMgdGFyZ2V0IG1hY3JvcyAqLworIHsgIlNZU19BUkciLCAyNCAgfSwKKyB7ICJTWVNfY2hkaXIiLCAxMiAgfSwKKyB7ICJTWVNfY2htb2QiLCAxNSAgfSwKKyB7ICJTWVNfY2hvd24iLCAxNiAgfSwKKyB7ICJTWVNfY2xvc2UiLCA2ICB9LAorIHsgIlNZU19jcmVhdCIsIDggIH0sCisgeyAiU1lTX2V4ZWN2IiwgMTEgIH0sCisgeyAiU1lTX2V4ZWN2ZSIsIDU5ICB9LAorIHsgIlNZU19leGl0IiwgMSAgfSwKKyB7ICJTWVNfZm9yayIsIDIgIH0sCisgeyAiU1lTX2ZzdGF0IiwgMjIgIH0sCisgeyAiU1lTX2dldHBpZCIsIDIwICB9LAorIHsgIlNZU19pc2F0dHkiLCAyMSAgfSwKKyB7ICJTWVNfa2lsbCIsIDYwICB9LAorIHsgIlNZU19saW5rIiwgOSAgfSwKKyB7ICJTWVNfbHNlZWsiLCAxOSAgfSwKKyB7ICJTWVNfbWtub2QiLCAxNCAgfSwKKyB7ICJTWVNfb3BlbiIsIDUgIH0sCisgeyAiU1lTX3BpcGUiLCA0MiAgfSwKKyB7ICJTWVNfcmVhZCIsIDMgIH0sCisgeyAiU1lTX3N0YXQiLCAzOCAgfSwKKyB7ICJTWVNfdGltZSIsIDIzICB9LAorIHsgIlNZU191bmxpbmsiLCAxMCAgfSwKKyB7ICJTWVNfdXRpbWUiLCAyMDEgIH0sCisgeyAiU1lTX3dhaXQiLCAyMDIgIH0sCisgeyAiU1lTX3dhaXQ0IiwgNyAgfSwKKyB7ICJTWVNfd3JpdGUiLCA0ICB9LAorLyogZW5kIGQxMHYgc3lzIHRhcmdldCBtYWNyb3MgKi8KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgTkxfVEFSR0VUX2QzMHYKKyNpZmRlZiBzeXNfZGVmcworLyogZnJvbSBzeXNjYWxsLmggKi8KKy8qIGJlZ2luIGQzMHYgc3lzIHRhcmdldCBtYWNyb3MgKi8KKyB7ICJTWVNfYXJndiIsIDEzICB9LAorIHsgIlNZU19hcmd2bGVuIiwgMTIgIH0sCisgeyAiU1lTX2NoZGlyIiwgMTQgIH0sCisgeyAiU1lTX2NobW9kIiwgMTYgIH0sCisgeyAiU1lTX2Nsb3NlIiwgMyAgfSwKKyB7ICJTWVNfZXhpdCIsIDEgIH0sCisgeyAiU1lTX2ZzdGF0IiwgMTAgIH0sCisgeyAiU1lTX2dldHBpZCIsIDggIH0sCisgeyAiU1lTX2tpbGwiLCA5ICB9LAorIHsgIlNZU19sc2VlayIsIDYgIH0sCisgeyAiU1lTX29wZW4iLCAyICB9LAorIHsgIlNZU19yZWFkIiwgNCAgfSwKKyB7ICJTWVNfc3RhdCIsIDE1ICB9LAorIHsgIlNZU190aW1lIiwgMTggIH0sCisgeyAiU1lTX3VubGluayIsIDcgIH0sCisgeyAiU1lTX3V0aW1lIiwgMTcgIH0sCisgeyAiU1lTX3dyaXRlIiwgNSAgfSwKKy8qIGVuZCBkMzB2IHN5cyB0YXJnZXQgbWFjcm9zICovCisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIE5MX1RBUkdFVF9mcjMwCisjaWZkZWYgc3lzX2RlZnMKKy8qIGZyb20gc3lzY2FsbC5oICovCisvKiBiZWdpbiBmcjMwIHN5cyB0YXJnZXQgbWFjcm9zICovCisgeyAiU1lTX2FyZ3YiLCAxMyAgfSwKKyB7ICJTWVNfYXJndmxlbiIsIDEyICB9LAorIHsgIlNZU19jaGRpciIsIDE0ICB9LAorIHsgIlNZU19jaG1vZCIsIDE2ICB9LAorIHsgIlNZU19jbG9zZSIsIDMgIH0sCisgeyAiU1lTX2V4aXQiLCAxICB9LAorIHsgIlNZU19mc3RhdCIsIDEwICB9LAorIHsgIlNZU19nZXRwaWQiLCA4ICB9LAorIHsgIlNZU19raWxsIiwgOSAgfSwKKyB7ICJTWVNfbHNlZWsiLCA2ICB9LAorIHsgIlNZU19vcGVuIiwgMiAgfSwKKyB7ICJTWVNfcmVhZCIsIDQgIH0sCisgeyAiU1lTX3N0YXQiLCAxNSAgfSwKKyB7ICJTWVNfdGltZSIsIDE4ICB9LAorIHsgIlNZU191bmxpbmsiLCA3ICB9LAorIHsgIlNZU191dGltZSIsIDE3ICB9LAorIHsgIlNZU193cml0ZSIsIDUgIH0sCisvKiBlbmQgZnIzMCBzeXMgdGFyZ2V0IG1hY3JvcyAqLworI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBOTF9UQVJHRVRfaTk2MAorI2lmZGVmIHN5c19kZWZzCisvKiBmcm9tIHN5c2NhbGwuaCAqLworLyogYmVnaW4gaTk2MCBzeXMgdGFyZ2V0IG1hY3JvcyAqLworIHsgIlNZU19hcmd2IiwgMTMgIH0sCisgeyAiU1lTX2FyZ3ZsZW4iLCAxMiAgfSwKKyB7ICJTWVNfY2hkaXIiLCAxNCAgfSwKKyB7ICJTWVNfY2htb2QiLCAxNiAgfSwKKyB7ICJTWVNfY2xvc2UiLCAyMzQgIH0sCisgeyAiU1lTX2V4aXQiLCAyNTcgIH0sCisgeyAiU1lTX2ZzdGF0IiwgMTAgIH0sCisgeyAiU1lTX2dldHBpZCIsIDggIH0sCisgeyAiU1lTX2tpbGwiLCA5ICB9LAorIHsgIlNZU19sc2VlayIsIDIzMyAgfSwKKyB7ICJTWVNfb3BlbiIsIDIzMCAgfSwKKyB7ICJTWVNfcmVhZCIsIDIzMSAgfSwKKyB7ICJTWVNfc3RhdCIsIDE1ICB9LAorIHsgIlNZU190aW1lIiwgMTggIH0sCisgeyAiU1lTX3VubGluayIsIDcgIH0sCisgeyAiU1lTX3V0aW1lIiwgMTcgIH0sCisgeyAiU1lTX3dyaXRlIiwgMjMyICB9LAorLyogZW5kIGk5NjAgc3lzIHRhcmdldCBtYWNyb3MgKi8KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgTkxfVEFSR0VUX20zMnIKKyNpZmRlZiBzeXNfZGVmcworLyogZnJvbSBzeXNjYWxsLmggKi8KKy8qIGJlZ2luIG0zMnIgc3lzIHRhcmdldCBtYWNyb3MgKi8KKyB7ICJTWVNfYXJndiIsIDEzICB9LAorIHsgIlNZU19hcmd2bGVuIiwgMTIgIH0sCisgeyAiU1lTX2NoZGlyIiwgMTQgIH0sCisgeyAiU1lTX2NobW9kIiwgMTYgIH0sCisgeyAiU1lTX2Nsb3NlIiwgMyAgfSwKKyB7ICJTWVNfZXhpdCIsIDEgIH0sCisgeyAiU1lTX2ZzdGF0IiwgMTAgIH0sCisgeyAiU1lTX2dldHBpZCIsIDggIH0sCisgeyAiU1lTX2tpbGwiLCA5ICB9LAorIHsgIlNZU19sc2VlayIsIDYgIH0sCisgeyAiU1lTX29wZW4iLCAyICB9LAorIHsgIlNZU19yZWFkIiwgNCAgfSwKKyB7ICJTWVNfc3RhdCIsIDE1ICB9LAorIHsgIlNZU190aW1lIiwgMTggIH0sCisgeyAiU1lTX3VubGluayIsIDcgIH0sCisgeyAiU1lTX3V0aW1lIiwgMTcgIH0sCisgeyAiU1lTX3dyaXRlIiwgNSAgfSwKKy8qIGVuZCBtMzJyIHN5cyB0YXJnZXQgbWFjcm9zICovCisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIE5MX1RBUkdFVF9tbjEwMjAwCisjaWZkZWYgc3lzX2RlZnMKKy8qIGZyb20gc3lzY2FsbC5oICovCisvKiBiZWdpbiBtbjEwMjAwIHN5cyB0YXJnZXQgbWFjcm9zICovCisgeyAiU1lTX2FyZ3YiLCAxMyAgfSwKKyB7ICJTWVNfYXJndmxlbiIsIDEyICB9LAorIHsgIlNZU19jaGRpciIsIDE0ICB9LAorIHsgIlNZU19jaG1vZCIsIDE2ICB9LAorIHsgIlNZU19jbG9zZSIsIDMgIH0sCisgeyAiU1lTX2V4aXQiLCAxICB9LAorIHsgIlNZU19mc3RhdCIsIDEwICB9LAorIHsgIlNZU19nZXRwaWQiLCA4ICB9LAorIHsgIlNZU19raWxsIiwgOSAgfSwKKyB7ICJTWVNfbHNlZWsiLCA2ICB9LAorIHsgIlNZU19vcGVuIiwgMiAgfSwKKyB7ICJTWVNfcmVhZCIsIDQgIH0sCisgeyAiU1lTX3N0YXQiLCAxNSAgfSwKKyB7ICJTWVNfdGltZSIsIDE4ICB9LAorIHsgIlNZU191bmxpbmsiLCA3ICB9LAorIHsgIlNZU191dGltZSIsIDE3ICB9LAorIHsgIlNZU193cml0ZSIsIDUgIH0sCisvKiBlbmQgbW4xMDIwMCBzeXMgdGFyZ2V0IG1hY3JvcyAqLworI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBOTF9UQVJHRVRfbW4xMDMwMAorI2lmZGVmIHN5c19kZWZzCisvKiBmcm9tIHN5c2NhbGwuaCAqLworLyogYmVnaW4gbW4xMDMwMCBzeXMgdGFyZ2V0IG1hY3JvcyAqLworIHsgIlNZU19hcmd2IiwgMTMgIH0sCisgeyAiU1lTX2FyZ3ZsZW4iLCAxMiAgfSwKKyB7ICJTWVNfY2hkaXIiLCAxNCAgfSwKKyB7ICJTWVNfY2htb2QiLCAxNiAgfSwKKyB7ICJTWVNfY2xvc2UiLCAzICB9LAorIHsgIlNZU19leGl0IiwgMSAgfSwKKyB7ICJTWVNfZnN0YXQiLCAxMCAgfSwKKyB7ICJTWVNfZ2V0cGlkIiwgOCAgfSwKKyB7ICJTWVNfa2lsbCIsIDkgIH0sCisgeyAiU1lTX2xzZWVrIiwgNiAgfSwKKyB7ICJTWVNfb3BlbiIsIDIgIH0sCisgeyAiU1lTX3JlYWQiLCA0ICB9LAorIHsgIlNZU19zdGF0IiwgMTUgIH0sCisgeyAiU1lTX3RpbWUiLCAxOCAgfSwKKyB7ICJTWVNfdW5saW5rIiwgNyAgfSwKKyB7ICJTWVNfdXRpbWUiLCAxNyAgfSwKKyB7ICJTWVNfd3JpdGUiLCA1ICB9LAorLyogZW5kIG1uMTAzMDAgc3lzIHRhcmdldCBtYWNyb3MgKi8KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgTkxfVEFSR0VUX3NwYXJjCisjaWZkZWYgc3lzX2RlZnMKKy8qIGZyb20gc3lzY2FsbC5oICovCisvKiBiZWdpbiBzcGFyYyBzeXMgdGFyZ2V0IG1hY3JvcyAqLworIHsgIlNZU19hcmd2IiwgMTMgIH0sCisgeyAiU1lTX2FyZ3ZsZW4iLCAxMiAgfSwKKyB7ICJTWVNfY2hkaXIiLCAxNCAgfSwKKyB7ICJTWVNfY2htb2QiLCAxNiAgfSwKKyB7ICJTWVNfY2xvc2UiLCAzICB9LAorIHsgIlNZU19leGl0IiwgMSAgfSwKKyB7ICJTWVNfZnN0YXQiLCAxMCAgfSwKKyB7ICJTWVNfZ2V0cGlkIiwgOCAgfSwKKyB7ICJTWVNfa2lsbCIsIDkgIH0sCisgeyAiU1lTX2xzZWVrIiwgNiAgfSwKKyB7ICJTWVNfb3BlbiIsIDIgIH0sCisgeyAiU1lTX3JlYWQiLCA0ICB9LAorIHsgIlNZU19zdGF0IiwgMTUgIH0sCisgeyAiU1lTX3RpbWUiLCAxOCAgfSwKKyB7ICJTWVNfdW5saW5rIiwgNyAgfSwKKyB7ICJTWVNfdXRpbWUiLCAxNyAgfSwKKyB7ICJTWVNfd3JpdGUiLCA1ICB9LAorLyogZW5kIHNwYXJjIHN5cyB0YXJnZXQgbWFjcm9zICovCisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIE5MX1RBUkdFVF92ODUwCisjaWZkZWYgc3lzX2RlZnMKKy8qIGZyb20gc3lzY2FsbC5oICovCisvKiBiZWdpbiB2ODUwIHN5cyB0YXJnZXQgbWFjcm9zICovCisgeyAiU1lTX0FSRyIsIDI0ICB9LAorIHsgIlNZU19jaGRpciIsIDEyICB9LAorIHsgIlNZU19jaG1vZCIsIDE1ICB9LAorIHsgIlNZU19jaG93biIsIDE2ICB9LAorIHsgIlNZU19jbG9zZSIsIDYgIH0sCisgeyAiU1lTX2NyZWF0IiwgOCAgfSwKKyB7ICJTWVNfZXhlY3YiLCAxMSAgfSwKKyB7ICJTWVNfZXhlY3ZlIiwgNTkgIH0sCisgeyAiU1lTX2V4aXQiLCAxICB9LAorIHsgIlNZU19mb3JrIiwgMiAgfSwKKyB7ICJTWVNfZnN0YXQiLCAyMiAgfSwKKyB7ICJTWVNfZ2V0cGlkIiwgMjAgIH0sCisgeyAiU1lTX2dldHRpbWVvZmRheSIsIDExNiAgfSwKKyB7ICJTWVNfaXNhdHR5IiwgMjEgIH0sCisgeyAiU1lTX2xpbmsiLCA5ICB9LAorIHsgIlNZU19sc2VlayIsIDE5ICB9LAorIHsgIlNZU19ta25vZCIsIDE0ICB9LAorIHsgIlNZU19vcGVuIiwgNSAgfSwKKyB7ICJTWVNfcGlwZSIsIDQyICB9LAorIHsgIlNZU19yZWFkIiwgMyAgfSwKKyB7ICJTWVNfc3RhdCIsIDM4ICB9LAorIHsgIlNZU190aW1lIiwgMjMgIH0sCisgeyAiU1lTX3VubGluayIsIDEwICB9LAorIHsgIlNZU191dGltZSIsIDIwMSAgfSwKKyB7ICJTWVNfd2FpdCIsIDIwMiAgfSwKKyB7ICJTWVNfd2FpdDQiLCA3ICB9LAorIHsgIlNZU193cml0ZSIsIDQgIH0sCisvKiBlbmQgdjg1MCBzeXMgdGFyZ2V0IG1hY3JvcyAqLworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vbnJ1bi5jIGIvc2ltL2NvbW1vbi9ucnVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiZTMzZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vbnJ1bi5jCkBAIC0wLDAgKzEsMjE0IEBACisvKiBOZXcgdmVyc2lvbiBvZiBydW4gZnJvbnQgZW5kIHN1cHBvcnQgZm9yIHNpbXVsYXRvcnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorCisjaW5jbHVkZSAiYmZkLmgiCisKKyNpZmRlZiBIQVZFX0VOVklST04KK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCB1c2FnZSAodm9pZCk7CisKK2V4dGVybiBob3N0X2NhbGxiYWNrIGRlZmF1bHRfY2FsbGJhY2s7CisKK3N0YXRpYyBjaGFyICpteW5hbWU7CisKK3N0YXRpYyBTSU1fREVTQyBzZDsKKworc3RhdGljIFJFVFNJR1RZUEUKK2NudHJsX2MgKGludCBzaWcpCit7CisgIGlmICghIHNpbV9zdG9wIChzZCkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUXVpdCFcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqKnByb2dfYXJndiA9IE5VTEw7CisgIHN0cnVjdCBfYmZkICpwcm9nX2JmZDsKKyAgZW51bSBzaW1fc3RvcCByZWFzb247CisgIGludCBzaWdyYyA9IDA7CisgIGludCBzaW5nbGVfc3RlcCA9IDA7CisgIFJFVFNJR1RZUEUgKCpwcmV2X3NpZ2ludCkgKCk7CisKKyAgbXluYW1lID0gYXJndlswXSArIHN0cmxlbiAoYXJndlswXSk7CisgIHdoaWxlIChteW5hbWUgPiBhcmd2WzBdICYmIG15bmFtZVstMV0gIT0gJy8nKQorICAgIC0tbXluYW1lOworCisgIC8qIElOVEVSTkFMOiBXaGVuIE1ZTkFNRSBpcyBgc3RlcCcsIHNpbmdsZSBzdGVwIHRoZSBzaW11bGF0b3IKKyAgICAgaW5zdGVhZCBvZiBhbGxvd2luZyBpdCB0byBydW4gZnJlZS4gIFRoZSBzb2xlIHB1cnBvc2Ugb2YgdGhpcworICAgICBIQUNLIGlzIHRvIGFsbG93IHRoZSBzaW1fcmVzdW1lIGludGVyZmFjZSdzIHN0ZXAgYXJndW1lbnQgdG8gYmUKKyAgICAgdGVzdGVkIHdpdGhvdXQgaGF2aW5nIHRvIGJ1aWxkL3J1biBnZGIuICovCisgIGlmIChzdHJsZW4gKG15bmFtZSkgPiA0ICYmIHN0cmNtcCAobXluYW1lIC0gNCwgInN0ZXAiKSA9PSAwKQorICAgIHsKKyAgICAgIHNpbmdsZV9zdGVwID0gMTsKKyAgICB9CisKKyAgLyogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBzaW11bGF0b3IuICAqLworICBkZWZhdWx0X2NhbGxiYWNrLmluaXQgKCZkZWZhdWx0X2NhbGxiYWNrKTsKKyAgc2QgPSBzaW1fb3BlbiAoU0lNX09QRU5fU1RBTkRBTE9ORSwgJmRlZmF1bHRfY2FsbGJhY2ssIE5VTEwsIGFyZ3YpOworICBpZiAoc2QgPT0gMCkKKyAgICBleGl0ICgxKTsKKyAgaWYgKFNUQVRFX01BR0lDIChzZCkgIT0gU0lNX01BR0lDX05VTUJFUikKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJJbnRlcm5hbCBlcnJvciAtIGJhZCBtYWdpYyBudW1iZXIgaW4gc2ltdWxhdG9yIHN0cnVjdFxuIik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgLyogV2FzIHRoZXJlIGEgcHJvZ3JhbSB0byBydW4/ICAqLworICBwcm9nX2FyZ3YgPSBTVEFURV9QUk9HX0FSR1YgKHNkKTsKKyAgcHJvZ19iZmQgPSBTVEFURV9QUk9HX0JGRCAoc2QpOworICBpZiAocHJvZ19hcmd2ID09IE5VTEwgfHwgKnByb2dfYXJndiA9PSBOVUxMKQorICAgIHVzYWdlICgpOworCisgIG5hbWUgPSAqcHJvZ19hcmd2OworCisgIC8qIEZvciBzaW11bGF0b3JzIHRoYXQgZG9uJ3Qgb3BlbiBwcm9nIGR1cmluZyBzaW1fb3BlbigpICovCisgIGlmIChwcm9nX2JmZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHByb2dfYmZkID0gYmZkX29wZW5yIChuYW1lLCAwKTsKKyAgICAgIGlmIChwcm9nX2JmZCA9PSBOVUxMKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuIFwiJXNcIjogJXNcbiIsIAorCQkgICBteW5hbWUsIG5hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKwkgIGV4aXQgKDEpOworCX0KKyAgICAgIGlmICghYmZkX2NoZWNrX2Zvcm1hdCAocHJvZ19iZmQsIGJmZF9vYmplY3QpKSAKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsICIlczogXCIlc1wiIGlzIG5vdCBhbiBvYmplY3QgZmlsZTogJXNcbiIsCisJCSAgIG15bmFtZSwgbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCSAgZXhpdCAoMSk7CisJfQorICAgIH0KKworICBpZiAoU1RBVEVfVkVSQk9TRV9QIChzZCkpCisgICAgcHJpbnRmICgiJXMgJXNcbiIsIG15bmFtZSwgbmFtZSk7CisKKyAgLyogTG9hZCB0aGUgcHJvZ3JhbSBpbnRvIHRoZSBzaW11bGF0b3IuICAqLworICBpZiAoc2ltX2xvYWQgKHNkLCBuYW1lLCBwcm9nX2JmZCwgMCkgPT0gU0lNX1JDX0ZBSUwpCisgICAgZXhpdCAoMSk7CisKKyAgLyogUHJlcGFyZSB0aGUgcHJvZ3JhbSBmb3IgZXhlY3V0aW9uLiAgKi8KKyNpZmRlZiBIQVZFX0VOVklST04KKyAgc2ltX2NyZWF0ZV9pbmZlcmlvciAoc2QsIHByb2dfYmZkLCBwcm9nX2FyZ3YsIGVudmlyb24pOworI2Vsc2UKKyAgc2ltX2NyZWF0ZV9pbmZlcmlvciAoc2QsIHByb2dfYmZkLCBwcm9nX2FyZ3YsIE5VTEwpOworI2VuZGlmCisKKyAgLyogUnVuL1N0ZXAgdGhlIHByb2dyYW0uICAqLworICBpZiAoc2luZ2xlX3N0ZXApCisgICAgeworICAgICAgZG8KKwl7CisJICBwcmV2X3NpZ2ludCA9IHNpZ25hbCAoU0lHSU5ULCBjbnRybF9jKTsKKwkgIHNpbV9yZXN1bWUgKHNkLCAxLypzdGVwKi8sIDApOworCSAgc2lnbmFsIChTSUdJTlQsIHByZXZfc2lnaW50KTsKKwkgIHNpbV9zdG9wX3JlYXNvbiAoc2QsICZyZWFzb24sICZzaWdyYyk7CisKKwkgIGlmICgocmVhc29uID09IHNpbV9zdG9wcGVkKSAmJgorCSAgICAgIChzaWdyYyA9PSBzaW1fc2lnbmFsX3RvX2hvc3QgKHNkLCBTSU1fU0lHSU5UKSkpCisJICAgIGJyZWFrOyAvKiBleGl0IG9uIGNvbnRyb2wtQyAqLworCX0KKyAgICAgIC8qIHJlbWFpbiBvbiBicmVha3BvaW50IG9yIHNpZ25hbHMgaW4gb2UgbW9kZSovCisgICAgICB3aGlsZSAoKChyZWFzb24gPT0gc2ltX3NpZ25hbGxlZCkgJiYKKwkgICAgICAoc2lncmMgPT0gc2ltX3NpZ25hbF90b19ob3N0IChzZCwgU0lNX1NJR1RSQVApKSkgfHwKKwkgICAgICgocmVhc29uID09IHNpbV9zdG9wcGVkKSAmJiAKKwkgICAgICAoU1RBVEVfRU5WSVJPTk1FTlQgKHNkKSA9PSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQpKSk7CisgICAgfQorICBlbHNlIGRvCisgICAgeworI2lmIGRlZmluZWQgKEhBVkVfU0lHQUNUSU9OKSAmJiBkZWZpbmVkIChTQV9SRVNUQVJUKQorICAgICAgc3RydWN0IHNpZ2FjdGlvbiBzYSwgb3NhOworICAgICAgc2Euc2FfaGFuZGxlciA9IGNudHJsX2M7CisgICAgICBzaWdlbXB0eXNldCAoJnNhLnNhX21hc2spOworICAgICAgc2Euc2FfZmxhZ3MgPSAwOworICAgICAgc2lnYWN0aW9uIChTSUdJTlQsICZzYSwgJm9zYSk7CisgICAgICBwcmV2X3NpZ2ludCA9IG9zYS5zYV9oYW5kbGVyOworI2Vsc2UKKyAgICAgIHByZXZfc2lnaW50ID0gc2lnbmFsIChTSUdJTlQsIGNudHJsX2MpOworI2VuZGlmCisgICAgICBzaW1fcmVzdW1lIChzZCwgMCwgc2lncmMpOworICAgICAgc2lnbmFsIChTSUdJTlQsIHByZXZfc2lnaW50KTsKKyAgICAgIHNpbV9zdG9wX3JlYXNvbiAoc2QsICZyZWFzb24sICZzaWdyYyk7CisKKyAgICAgIGlmICgocmVhc29uID09IHNpbV9zdG9wcGVkKSAmJgorCSAgKHNpZ3JjID09IHNpbV9zaWduYWxfdG9faG9zdCAoc2QsIFNJTV9TSUdJTlQpKSkKKwlicmVhazsgLyogZXhpdCBvbiBjb250cm9sLUMgKi8KKworICAgICAgLyogcmVtYWluIG9uIHNpZ25hbHMgaW4gb2UgbW9kZSAqLworICAgIH0gd2hpbGUgKChyZWFzb24gPT0gc2ltX3N0b3BwZWQpICYmCisJICAgICAoU1RBVEVfRU5WSVJPTk1FTlQgKHNkKSA9PSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQpKTsKKworICAvKiBQcmludCBhbnkgc3RhdHMgdGhlIHNpbXVsYXRvciBjb2xsZWN0ZWQuICAqLworICBzaW1faW5mbyAoc2QsIDApOworCisgIC8qIFNodXRkb3duIHRoZSBzaW11bGF0b3IuICAqLworICBzaW1fY2xvc2UgKHNkLCAwKTsKKworICAvKiBJZiByZWFzb24gaXMgc2ltX2V4aXRlZCwgdGhlbiBzaWdyYyBob2xkcyB0aGUgZXhpdCBjb2RlIHdoaWNoIHdlIHdhbnQKKyAgICAgdG8gcmV0dXJuLiAgSWYgcmVhc29uIGlzIHNpbV9zdG9wcGVkIG9yIHNpbV9zaWduYWxsZWQsIHRoZW4gc2lncmMgaG9sZHMKKyAgICAgdGhlIHNpZ25hbCB0aGF0IHRoZSBzaW11bGF0b3IgcmVjZWl2ZWQ7IHdlIHdhbnQgdG8gcmV0dXJuIHRoYXQgdG8KKyAgICAgaW5kaWNhdGUgZmFpbHVyZS4gICovCisKKyNpZmRlZiBTSU1fSDgzMDAgLyogRklYTUU6IFVnaC4gIGdyZXAgZm9yIFNMRUVQIGluIGNvbXBpbGUuYyAgKi8KKyAgaWYgKHNpZ3JjID09IFNJR0lMTCkKKyAgICBhYm9ydCAoKTsKKyAgc2lncmMgPSAwOworI2Vsc2UKKyAgLyogV2h5IGRpZCB3ZSBzdG9wPyAqLworICBzd2l0Y2ggKHJlYXNvbikKKyAgICB7CisgICAgY2FzZSBzaW1fc2lnbmFsbGVkOgorICAgIGNhc2Ugc2ltX3N0b3BwZWQ6CisgICAgICBpZiAoc2lncmMgIT0gMCkKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAicHJvZ3JhbSBzdG9wcGVkIHdpdGggc2lnbmFsICVkLlxuIiwgc2lncmMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHNpbV9leGl0ZWQ6CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJwcm9ncmFtIGluIHVuZGVmaW5lZCBzdGF0ZSAoJWQ6JWQpXG4iLCByZWFzb24sIHNpZ3JjKTsKKyAgICAgIGJyZWFrOworCisgICAgfQorI2VuZGlmCisKKyAgcmV0dXJuIHNpZ3JjOworfQorCitzdGF0aWMgdm9pZAordXNhZ2UgKCkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6ICVzIFtvcHRpb25zXSBwcm9ncmFtIFtwcm9ncmFtIGFyZ3NdXG4iLCBteW5hbWUpOworICBmcHJpbnRmIChzdGRlcnIsICJSdW4gYCVzIC0taGVscCcgZm9yIGZ1bGwgbGlzdCBvZiBvcHRpb25zLlxuIiwgbXluYW1lKTsKKyAgZXhpdCAoMSk7Cit9CisKKworI2lmZGVmIF9fQ1lHV0lOMzJfXworLyogbm8tb3AgR1VJIHVwZGF0ZSBob29rIGZvciBzdGFuZGFsb25lIHNpbSAqLwordm9pZCAoKnVpX2xvb3BfaG9vaykgUEFSQU1TICgoaW50KSkgPSBOVUxMOworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3J1bi4xIGIvc2ltL2NvbW1vbi9ydW4uMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODZlMjBiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9ydW4uMQpAQCAtMCwwICsxLDEwNyBAQAorLlwiIENvcHlyaWdodCAoYykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKy5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgorLlRIIHJ1biAxICIxM29jdDE5OTMiICJHTlUgVG9vbHMiICJHTlUgVG9vbHMiCisuZGUgQlAKKy5zcAorLnRpIC0uMmkKK1woKioKKy4uCisKKy5TSCBOQU1FCitydW5cKGVtXCZTaW11bGF0b3IgZnJvbnQtZW5kCisKKy5TSCBTWU5PUFNJUworLmh5IDAKKy5uYQorLlRQCisuQiBydW4KKy5SQiAiW1x8IiBcLXYgIlx8XSIKKy4iIC5SQiAiW1x8IiBcLXQgIlx8XSIKKy5SQiAiW1x8IiBcLXAKKy5JUiBmcmVxICJcfF0iCisuUkIgIltcfCIgXC1tCisuSVIgbWVtb3J5ICJcfF0iCisuSSBwcm9ncmFtCisuYWQgYgorLmh5IDEKKy5TSCBERVNDUklQVElPTgorCitVc2UgYFx8XGMKKy5CSSBydW4gIiBwcm9ncmFtIlxjCitcJlx8JyB0byBleGVjdXRlIGEgYmluYXJ5IGJ5IGludGVycHJldGluZyBtYWNoaW5lIGluc3RydWN0aW9ucyBvbiB5b3VyCitob3N0IGNvbXB1dGVyLgorCisuQiBydW4KK2lzIHRoZSBzYW1lIGVtdWxhdG9yIHVzZWQgYnkgR0RCJ3MgYFx8XGMKKy5CIHRhcmdldCBzaW1cYworXCZcfCcgY29tbWFuZC4gIFlvdSBjYW4gcnVuIGl0IGRpcmVjdGx5IGJ5IGV4ZWN1dGluZworLkIgcnVuCitpZiB5b3UganVzdCB3YW50IHRvIHNlZSB5b3VyIHByb2dyYW0gZXhlY3V0ZSwgYW5kIGRvIG5vdCBuZWVkIGFueQorZGVidWdnZXIgZnVuY3Rpb25hbGl0eS4gIFlvdSBjYW4gYWxzbyB1c2UKKy5CIHJ1bgordG8gZ2VuZXJhdGUgcHJvZmlsaW5nIGluZm9ybWF0aW9uIGZvciBhbmFseXNpcyB3aXRoCisuQlIgZ3Byb2YgLgorCisuU0ggT1BUSU9OUworCisuVFAKKy5CIFwtdgorVmVyYm9zZSBvdXRwdXQuICBEaXNwbGF5IHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHJ1biBiZWZvcmUKK2V4ZWN1dGlvbjsgYWZ0ZXIgZXhlY3V0aW9uLCBkaXNwbGF5IHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zCitleGVjdXRlZCwgdGhlIG51bWJlciBvZiBtYWNoaW5lIGN5Y2xlcyBlbXVsYXRlZCwgdGhlIG51bWJlciBvZgorcGlwZWxpbmUgc3RhbGxzLCB0aGUgcmVhbCB0aW1lIHRha2VuLCB0aGUgZW11bGF0ZWQgZXhlY3V0aW9uIHRpbWUKK3Rha2VuLCBhbmQgYSBzdW1tYXJ5IG9mIGhvdyBtdWNoIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB3YXMgZ2VuZXJhdGVkLgorLiIKKy4iIC5UUAorLiIgLkIgXC10CisuIiBgdHJhY2UnLCBjYWxscyBhIHNpbV90cmFjZSByb3V0aW5lIHRoYXQgZG9lcyBub3RoaW5nLgorCisuVFAKKy5CSSBcLXAgIiBmcmVxIgorR2VuZXJhdGUgcHJvZmlsZSBpbmZvcm1hdGlvbiAoZm9yIHVzZSB3aXRoCisuQiBncHJvZlxjCitcJikuCisuSSBmcmVxCitpcyB0aGUgcHJvZmlsaW5nIGZyZXF1ZW5jeS4gIFdyaXRlIHRoZSBwcm9maWxpbmcgaW5mb3JtYXRpb24gdG8gYSBmaWxlIGNhbGxlZAorLkJSIGdtb24ub3V0IC4KKworLlRQCisuQkkgXC1tICIgbWVtb3J5IgorU2V0IHRoZSBtZW1vcnkgc2l6ZSBmb3IgdGhlIGVtdWxhdGVkIG1hY2hpbmUgdG8gdHdvIHRvIHRoZSBwb3dlcgorLklSIG1lbW9yeSAuCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxOSwgZW11bGF0aW5nIGEgYm9hcmQgd2l0aCA1MjQyODggYnl0ZXMgb2YgbWVtb3J5LgorCisuUFAKKworLlNIICJTRUUgQUxTTyIKKy5SQiAiYFx8IiBncHJvZiAiXHwnIgorZW50cnkgaW4KKy5CIGluZm9cYworXCY7CisuUkIgImBcfCIgZ2RiICJcfCciCitlbnRyeSBpbgorLkIgaW5mb1xjCitcJjsKKy5JIAorVXNpbmcgR0RCOiBBIEd1aWRlIHRvIHRoZSBHTlUgU291cmNlLUxldmVsIERlYnVnZ2VyXGMKKywgUmljaGFyZCBNLiBTdGFsbG1hbiBhbmQgUm9sYW5kIEguIFBlc2NoLgorCisuU0ggQ09QWUlORworQ29weXJpZ2h0IChjKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLlBQCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKK2VudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisuUFAKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCittYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKK3ZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgordHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgordGhlIG9yaWdpbmFsIEVuZ2xpc2guCisKKwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9ydW4uYyBiL3NpbS9jb21tb24vcnVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE3MDFiYwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vcnVuLmMKQEAgLTAsMCArMSwzMDggQEAKKy8qIHJ1biBmcm9udCBlbmQgc3VwcG9ydCBmb3IgYWxsIHRoZSBzaW11bGF0b3JzLgorICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5My05NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogU3RldmUgQ2hhbWJlcmxhaW4gc2FjQGN5Z251cy5jb20sCisgICBhbmQgb3RoZXJzIGF0IEN5Z251cy4gICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJ0Y29uZmlnLmgiCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIF9fU1REQ19fCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjZWxzZQorI2luY2x1ZGUgPHZhcmFyZ3MuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAicmVtb3RlLXNpbS5oIgorCisjaW5jbHVkZSAiLi4vbGliaWJlcnR5L2FsbG9jYS1jb25mLmgiCisKK3N0YXRpYyB2b2lkIHVzYWdlIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiBpbnQgb3B0aW5kOworZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKworZXh0ZXJuIGhvc3RfY2FsbGJhY2sgZGVmYXVsdF9jYWxsYmFjazsKKworc3RhdGljIGNoYXIgKm15bmFtZTsKKworCisvKiBOT1RFOiBzaW1fc2l6ZSgpIGFuZCBzaW1fdHJhY2UoKSBhcmUgZ29pbmcgYXdheSAqLworZXh0ZXJuIGludCBzaW1fdHJhY2UgUEFSQU1TICgoU0lNX0RFU0Mgc2QpKTsKKworZXh0ZXJuIGludCBnZXRvcHQgKCk7CisKK3N0YXRpYyBTSU1fREVTQyBzZDsKKworc3RhdGljIFJFVFNJR1RZUEUKK2NudHJsX2MgKGludCBzaWcpCit7CisgIGlmICghIHNpbV9zdG9wIChzZCkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUXVpdCFcbiIpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorfQorCitpbnQKK21haW4gKGFjLCBhdikKKyAgICAgaW50IGFjOworICAgICBjaGFyICoqYXY7Cit7CisgIFJFVFNJR1RZUEUgKCpwcmV2X3NpZ2ludCkgKCk7CisgIGJmZCAqYWJmZDsKKyAgaW50IGk7CisgIGludCB2ZXJib3NlID0gMDsKKyAgaW50IHRyYWNlID0gMDsKKyAgY2hhciAqbmFtZTsKKyAgc3RhdGljIGNoYXIgKm5vX2FyZ3NbNF07CisgIGNoYXIgKipzaW1fYXJndiA9ICZub19hcmdzWzBdOworICBjaGFyICoqcHJvZ19hcmdzOworICBlbnVtIHNpbV9zdG9wIHJlYXNvbjsKKyAgaW50IHNpZ3JjOworCisgIG15bmFtZSA9IGF2WzBdICsgc3RybGVuIChhdlswXSk7CisgIHdoaWxlIChteW5hbWUgPiBhdlswXSAmJiBteW5hbWVbLTFdICE9ICcvJykKKyAgICAtLW15bmFtZTsKKworICAvKiBUaGUgZmlyc3QgZWxlbWVudCBvZiBzaW1fb3BlbidzIGFyZ3YgaXMgdGhlIHByb2dyYW0gbmFtZS4gICovCisgIG5vX2FyZ3NbMF0gPSBhdlswXTsKKyNpZmRlZiBTSU1fSEFWRV9CSUVORElBTgorICBub19hcmdzWzFdID0gIi1FIjsKKyAgbm9fYXJnc1syXSA9ICJzZXQtbGF0ZXIiOworI2VuZGlmCisKKyAgLyogRklYTUU6IFRoaXMgaXMgY3VycmVudGx5IGJlaW5nIG1pZ3JhdGVkIGludG8gc2ltX29wZW4uCisgICAgIFNpbXVsYXRvcnMgdGhhdCB1c2UgZnVuY3Rpb25zIHN1Y2ggYXMgc2ltX3NpemUoKSBzdGlsbCByZXF1aXJlCisgICAgIHRoaXMuICovCisgIGRlZmF1bHRfY2FsbGJhY2suaW5pdCAoJmRlZmF1bHRfY2FsbGJhY2spOworICBzaW1fc2V0X2NhbGxiYWNrcyAoJmRlZmF1bHRfY2FsbGJhY2spOworCisgIC8qIEZJWE1FOiBUaGlzIGlzIGN1cnJlbnRseSBiZWluZyByZXdyaXR0ZW4gdG8gaGF2ZSBlYWNoIHNpbXVsYXRvcgorICAgICBkbyBhbGwgYXJndiBwcm9jZXNzaW5nLiAgKi8KKworI2lmZGVmIFNJTV9IODMwMCAvKiBGSVhNRTogcXVpY2sgaGFjayAqLworICB3aGlsZSAoKGkgPSBnZXRvcHQgKGFjLCBhdiwgImE6YzptOnA6czpodHYiKSkgIT0gRU9GKSAKKyNlbHNlCisgIHdoaWxlICgoaSA9IGdldG9wdCAoYWMsIGF2LCAiYTpjOm06cDpzOnR2IikpICE9IEVPRikgCisjZW5kaWYKKyAgICBzd2l0Y2ggKGkpCisgICAgICB7CisgICAgICBjYXNlICdhJzoKKwkvKiBGSVhNRTogVGVtcG9yYXJ5IGhhY2suICAqLworCXsKKwkgIGludCBsZW4gPSBzdHJsZW4gKGF2WzBdKSArIHN0cmxlbiAob3B0YXJnKTsKKwkgIGNoYXIgKmFyZ2J1ZiA9IChjaGFyICopIGFsbG9jYSAobGVuICsgMiArIDUwKTsKKwkgIHNwcmludGYgKGFyZ2J1ZiwgIiVzICVzIiwgYXZbMF0sIG9wdGFyZyk7CisjaWZkZWYgU0lNX0hBVkVfQklFTkRJQU4KKwkgIC8qIFRoZSBkZXNpcmVkIGVuZGlhbm5lc3MgbXVzdCBiZSBwYXNzZWQgdG8gc2ltX29wZW4uCisJICAgICBUaGUgdmFsdWUgZm9yICJzZXQtbGF0ZXIiIGlzIHNldCB3aGVuIHdlIGtub3cgd2hhdCBpdCBpcy4KKwkgICAgIC1FIHN1cHBvcnQgaXNuJ3QgeWV0IHBhcnQgb2YgdGhlIHB1Ymxpc2hlZCBpbnRlcmZhY2UuICAqLworCSAgc3RyY2F0IChhcmdidWYsICIgLUUgc2V0LWxhdGVyIik7CisjZW5kaWYKKwkgIHNpbV9hcmd2ID0gYnVpbGRhcmd2IChhcmdidWYpOworCX0KKwlicmVhazsKKyNpZmRlZiBTSU1fSEFWRV9TSU1DQUNIRQorICAgICAgY2FzZSAnYyc6CisJc2ltX3NldF9zaW1jYWNoZV9zaXplIChhdG9pIChvcHRhcmcpKTsKKwlicmVhazsKKyNlbmRpZgorICAgICAgY2FzZSAnbSc6CisJLyogRklYTUU6IFJlbmFtZSB0byBzaW1fc2V0X21lbV9zaXplLiAgKi8KKwlzaW1fc2l6ZSAoYXRvaSAob3B0YXJnKSk7CisJYnJlYWs7CisjaWZkZWYgU0lNX0hBVkVfUFJPRklMRQorICAgICAgY2FzZSAncCc6CisJc2ltX3NldF9wcm9maWxlIChhdG9pIChvcHRhcmcpKTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ3MnOgorCXNpbV9zZXRfcHJvZmlsZV9zaXplIChhdG9pIChvcHRhcmcpKTsKKwlicmVhazsKKyNlbmRpZgorICAgICAgY2FzZSAndCc6CisJdHJhY2UgPSAxOworCS8qIEZJWE1FOiBuZWVkIHRvIGFsbG93IHNwZWNpZmljYXRpb24gb2Ygd2hhdCB0byB0cmFjZS4gICovCisJLyogc2ltX3NldF90cmFjZSAoMSk7ICovCisJYnJlYWs7CisgICAgICBjYXNlICd2JzoKKwkvKiBUaGluZ3MgdGhhdCBhcmUgcHJpbnRlZCB3aXRoIC12IGFyZSB0aGUga2luZHMgb2YgdGhpbmdzIHRoYXQKKwkgICBnY2MgLXYgcHJpbnRzLiAgVGhpcyBpcyBub3QgbWVhbnQgdG8gaW5jbHVkZSBkZXRhaWxlZCB0cmFjaW5nCisJICAgb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBqdXN0IHN1bW1hcmllcy4gICovCisJdmVyYm9zZSA9IDE7CisJLyogc2ltX3NldF92ZXJib3NlICgxKTsgKi8KKwlicmVhazsKKwkvKiBGSVhNRTogUXVpY2sgaGFjaywgdG8gYmUgcmVwbGFjZWQgYnkgbW9yZSBnZW5lcmFsIGZhY2lsaXR5LiAgKi8KKyNpZmRlZiBTSU1fSDgzMDAKKyAgICAgIGNhc2UgJ2gnOgorCXNldF9oODMwMGggKDEpOworCWJyZWFrOworI2VuZGlmCisgICAgICBkZWZhdWx0OgorCXVzYWdlICgpOworICAgICAgfQorCisgIGFjIC09IG9wdGluZDsKKyAgYXYgKz0gb3B0aW5kOworICBpZiAoYWMgPD0gMCkKKyAgICB1c2FnZSAoKTsKKworICBuYW1lID0gKmF2OworICBwcm9nX2FyZ3MgPSBhdjsKKworICBpZiAodmVyYm9zZSkKKyAgICB7CisgICAgICBwcmludGYgKCIlcyAlc1xuIiwgbXluYW1lLCBuYW1lKTsKKyAgICB9CisKKyAgYWJmZCA9IGJmZF9vcGVuciAobmFtZSwgMCk7CisgIGlmICghYWJmZCkgCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXM6ICVzXG4iLCAKKwkgICAgICAgbXluYW1lLCBuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKKyAgICB7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogY2FuJ3QgbG9hZCAlczogJXNcbiIsCisJICAgICAgIG15bmFtZSwgbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisjaWZkZWYgU0lNX0hBVkVfQklFTkRJQU4KKyAgLyogVGhlIGVuZGlhbm5lc3MgbXVzdCBiZSBwYXNzZWQgdG8gc2ltX29wZW4gYmVjYXVzZSBvbmUgbWF5IHdpc2ggdG8KKyAgICAgZXhhbWluZS9zZXQgcmVnaXN0ZXJzIGJlZm9yZSBjYWxsaW5nIHNpbV9sb2FkIFt3aGljaCBpcyB0aGUgb3RoZXIKKyAgICAgcGxhY2Ugd2hlcmUgb25lIGNhbiBkZXRlcm1pbmUgZW5kaWFubmVzc10uICBXZSBwcmV2aW91c2x5IHBhc3NlZCB0aGUKKyAgICAgZW5kaWFubmVzcyB2aWEgZ2xvYmFsIGB0YXJnZXRfYnl0ZV9vcmRlcicgYnV0IHRoYXQncyBub3QgYSBjbGVhbgorICAgICBpbnRlcmZhY2UuICAqLworICBmb3IgKGkgPSAxOyBzaW1fYXJndltpICsgMV0gIT0gTlVMTDsgKytpKQorICAgIGNvbnRpbnVlOworICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQorICAgIHNpbV9hcmd2W2ldID0gImJpZyI7CisgIGVsc2UKKyAgICBzaW1fYXJndltpXSA9ICJsaXR0bGUiOworI2VuZGlmCisKKyAgLyogRW5zdXJlIHRoYXQgYW55IHJ1bi10aW1lIGluaXRpYWxpc2F0aW9uIHRoYXQgbmVlZHMgdG8gYmUKKyAgICAgcGVyZm9ybWVkIGJ5IHRoZSBzaW11bGF0b3IgY2FuIG9jY3VyLiAqLworICBzZCA9IHNpbV9vcGVuIChTSU1fT1BFTl9TVEFOREFMT05FLCAmZGVmYXVsdF9jYWxsYmFjaywgYWJmZCwgc2ltX2FyZ3YpOworICBpZiAoc2QgPT0gMCkKKyAgICBleGl0ICgxKTsKKworICBpZiAoc2ltX2xvYWQgKHNkLCBuYW1lLCBhYmZkLCAwKSA9PSBTSU1fUkNfRkFJTCkKKyAgICBleGl0ICgxKTsKKworICBpZiAoc2ltX2NyZWF0ZV9pbmZlcmlvciAoc2QsIGFiZmQsIHByb2dfYXJncywgTlVMTCkgPT0gU0lNX1JDX0ZBSUwpCisgICAgZXhpdCAoMSk7CisKKyAgcHJldl9zaWdpbnQgPSBzaWduYWwgKFNJR0lOVCwgY250cmxfYyk7CisgIGlmICh0cmFjZSkKKyAgICB7CisgICAgICBpbnQgZG9uZSA9IDA7CisgICAgICB3aGlsZSAoIWRvbmUpCisJeworCSAgZG9uZSA9IHNpbV90cmFjZSAoc2QpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzaW1fcmVzdW1lIChzZCwgMCwgMCk7CisgICAgfQorICBzaWduYWwgKFNJR0lOVCwgcHJldl9zaWdpbnQpOworCisgIGlmICh2ZXJib3NlKQorICAgIHNpbV9pbmZvIChzZCwgMCk7CisKKyAgc2ltX3N0b3BfcmVhc29uIChzZCwgJnJlYXNvbiwgJnNpZ3JjKTsKKworICBzaW1fY2xvc2UgKHNkLCAwKTsKKworICAvKiBJZiByZWFzb24gaXMgc2ltX2V4aXRlZCwgdGhlbiBzaWdyYyBob2xkcyB0aGUgZXhpdCBjb2RlIHdoaWNoIHdlIHdhbnQKKyAgICAgdG8gcmV0dXJuLiAgSWYgcmVhc29uIGlzIHNpbV9zdG9wcGVkIG9yIHNpbV9zaWduYWxsZWQsIHRoZW4gc2lncmMgaG9sZHMKKyAgICAgdGhlIHNpZ25hbCB0aGF0IHRoZSBzaW11bGF0b3IgcmVjZWl2ZWQ7IHdlIHdhbnQgdG8gcmV0dXJuIHRoYXQgdG8KKyAgICAgaW5kaWNhdGUgZmFpbHVyZS4gICovCisKKyNpZmRlZiBTSU1fSDgzMDAgLyogRklYTUU6IFVnaC4gIGdyZXAgZm9yIFNMRUVQIGluIGNvbXBpbGUuYyAgKi8KKyAgaWYgKHNpZ3JjID09IFNJR0lMTCkKKyAgICBhYm9ydCAoKTsKKyAgc2lncmMgPSAwOworI2Vsc2UKKyAgLyogV2h5IGRpZCB3ZSBzdG9wPyAqLworICBzd2l0Y2ggKHJlYXNvbikKKyAgICB7CisgICAgY2FzZSBzaW1fc2lnbmFsbGVkOgorICAgIGNhc2Ugc2ltX3N0b3BwZWQ6CisgICAgICBpZiAoc2lncmMgIT0gMCkKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAicHJvZ3JhbSBzdG9wcGVkIHdpdGggc2lnbmFsICVkLlxuIiwgc2lncmMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHNpbV9leGl0ZWQ6CisgICAgICBicmVhazsKKworICAgIGNhc2Ugc2ltX3J1bm5pbmc6CisgICAgY2FzZSBzaW1fcG9sbGluZzogLyogdGhlc2UgaW5kaWNhdGUgYSBzZXJpb3VzIHByb2JsZW0gKi8KKyAgICAgIGFib3J0ICgpOworICAgICAgYnJlYWs7CisKKyAgICB9CisjZW5kaWYKKworICByZXR1cm4gc2lncmM7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZSAoKQoreworICBmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogJXMgW29wdGlvbnNdIHByb2dyYW0gW3Byb2dyYW0gYXJnc11cbiIsIG15bmFtZSk7CisgIGZwcmludGYgKHN0ZGVyciwgIk9wdGlvbnM6XG4iKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiLWEgYXJncyAgICAgICAgIFBhc3MgYGFyZ3MnIHRvIHNpbXVsYXRvci5cbiIpOworI2lmZGVmIFNJTV9IQVZFX1NJTUNBQ0hFCisgIGZwcmludGYgKHN0ZGVyciwgIi1jIHNpemUgICAgICAgICBTZXQgc2ltdWxhdG9yIGNhY2hlIHNpemUgdG8gYHNpemUnLlxuIik7CisjZW5kaWYKKyNpZmRlZiBTSU1fSDgzMDAKKyAgZnByaW50ZiAoc3RkZXJyLCAiLWggICAgICAgICAgICAgIEV4ZWN1dGFibGUgaXMgZm9yIGg4LzMwMGggb3IgaDgvMzAwcy5cbiIpOworI2VuZGlmCisgIGZwcmludGYgKHN0ZGVyciwgIi1tIHNpemUgICAgICAgICBTZXQgbWVtb3J5IHNpemUgb2Ygc2ltdWxhdG9yLCBpbiBieXRlcy5cbiIpOworI2lmZGVmIFNJTV9IQVZFX1BST0ZJTEUKKyAgZnByaW50ZiAoc3RkZXJyLCAiLXAgZnJlcSAgICAgICAgIFNldCBwcm9maWxpbmcgZnJlcXVlbmN5LlxuIik7CisgIGZwcmludGYgKHN0ZGVyciwgIi1zIHNpemUgICAgICAgICBTZXQgcHJvZmlsaW5nIHNpemUuXG4iKTsKKyNlbmRpZgorICBmcHJpbnRmIChzdGRlcnIsICItdCAgICAgICAgICAgICAgUGVyZm9ybSBpbnN0cnVjdGlvbiB0cmFjaW5nLlxuIik7CisgIGZwcmludGYgKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBOb3RlOiBWZXJ5IGZldyBzaW11bGF0b3JzIHN1cHBvcnQgdHJhY2luZy5cbiIpOworICBmcHJpbnRmIChzdGRlcnIsICItdiAgICAgICAgICAgICAgVmVyYm9zZSBvdXRwdXQuXG4iKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAicHJvZ3JhbSBhcmdzICAgIEFyZ3VtZW50cyB0byBwYXNzIHRvIHNpbXVsYXRlZCBwcm9ncmFtLlxuIik7CisgIGZwcmludGYgKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBOb3RlOiBWZXJ5IGZldyBzaW11bGF0b3JzIHN1cHBvcnQgdGhpcy5cbiIpOworICBleGl0ICgxKTsKK30KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWFib3J0LmMgYi9zaW0vY29tbW9uL3NpbS1hYm9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OGJmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS1hYm9ydC5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIEdlbmVyaWMgc2ltdWxhdG9yIGFib3J0LgorICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKKworLyogVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBzaW1fZW5naW5lX2Fib3J0IHRoYXQgZG9lcyBub3QgdXNlCisgICBsb25nam1wLCBpbnN0ZWFkIGl0IGp1c3QgY2FsbHMgc2ltX2lvX2Vycm9yLiAgc2ltX2lvX2Vycm9yIHdpbGwKKyAgIGp1bXAgcmlnaHQgb3V0IG9mIHRoZSBzaW11bGF0b3IuCisKKyAgIEl0IGlzIGludGVuZGVkIGFzIGEgaG9sZGVyIGZvciBzaW11bGF0b3JzIHRoYXQgaGF2ZSBzdGFydGVkIHRvIHVzZQorICAgc2ltLWNvcmUgZXQuYWwuIGJ1dCBhcmUgbm90IHlldCBpbiBhIHBvc2l0aW9uIHRvIHVzZSBzaW0tZW5naW5lCisgICAodGhlIHNldGptcC9sb25nam1wIGNvZGUpLiAqLworCisKK3ZvaWQKK3NpbV9lbmdpbmVfYWJvcnQgKFNJTV9ERVNDIHNkLAorCQkgIHNpbV9jcHUgKmNwdSwKKwkJICBzaW1fY2lhIGNpYSwKKwkJICBjb25zdCBjaGFyICpmbXQsCisJCSAgLi4uKQoreworICBBU1NFUlQgKHNkID09IE5VTEwgfHwgU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKKyAgaWYgKHNkICE9IE5VTEwpCisgICAgeworICAgICAgdmFfbGlzdCBhcDsKKyAgICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgICAgc2ltX2lvX2V2cHJpbnRmIChzZCwgZm10LCBhcCk7CisgICAgICB2YV9lbmQoYXApOworICAgICAgc2ltX2lvX2Vycm9yIChzZCwgIlxuIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdmFfbGlzdCBhcDsKKyAgICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgICAgdmZwcmludGYgKHN0ZGVyciwgZm10LCBhcCk7CisgICAgICB2YV9lbmQoYXApOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWFsdS5oIGIvc2ltL2NvbW1vbi9zaW0tYWx1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkMTAxOAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vc2ltLWFsdS5oCkBAIC0wLDAgKzEsMTA0NyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTcsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIF9TSU1fQUxVX0hfCisjZGVmaW5lIF9TSU1fQUxVX0hfCisKKyNpbmNsdWRlICJzeW1jYXQuaCIKKworCisvKiBJTlRFR0VSIEFMVSBNT0RVTEU6CisKKyAgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIDIncyBjb21wbGVtZW50IGFyaXRobWV0aWMKKyAgIGluY2x1ZGluZyB0aGUgcmVjb3JkaW5nIG9mIGNhcnJ5IGFuZCBvdmVyZmxvdyBzdGF0dXMgYml0cy4KKworCisgICBFWEFNUExFOgorCisgICBDb2RlIHVzaW5nIHRoaXMgbW9kdWxlIGluY2x1ZGVzIGl0IGludG8gc2ltLW1haW4uaCBhbmQgdGhlbiwgYXMgYQorICAgY29udmVudGlvbiwgZGVmaW5lcyBtYWNybydzIEFMVSpfRU5EIHRoYXQgcmVjb3JkcyB0aGUgcmVzdWx0IG9mIGFueQorICAgYXJpdG1ldGljIHBlcmZvcm1lZC4gIEV4OgorCisgICAJI2luY2x1ZGUgInNpbS1hbHUuaCIKKwkjZGVmaW5lIEFMVTMyX0VORChSRVMpIFwKKwkoUkVTKSA9IEFMVTMyX09WRVJGTE9XX1JFU1VMVDsgXAorCWNhcnJ5ID0gQUxVMzJfSEFEX0NBUlJZX0JPUlJPVzsgXAorCW92ZXJmbG93ID0gQUxVMzJfSEFEX09WRVJGTE9XCisKKyAgIFRoZSBtYWNybydzIGFyZSB0aGVuIHVzZWQgdmlzOgorCisgICAgICAgIHsKKwkgIEFMVTMyX0JFR0lOIChHUFJbaV0pOworCSAgQUxVMzJfQUREQyAoR1BSW2pdKTsKKwkgIEFMVTMyX0VORCAoR1BSW2tdKTsKKwl9CisKKworICAgTk9URVM6CisKKyAgIE1hY3JvcyBleGlzdCBmb3IgZWZmaWNpZW50bHkgY29tcHV0aW5nIDgsIDE2LCAzMiBhbmQgNjQgYml0CisgICBhcml0aG1ldGljIC0gQUxVOF8qLCBBTFUxNl8qLCAuLi4uICBJbiBhZGRpdGlvbiwgYWNjb3JkaW5nIHRvCisgICBUQVJHRVRfV09SRF9CSVRTSVpFIGEgc2V0IG9mIHNob3J0LWhhbmQgbWFjcm9zIGFyZSBkZWZpbmVkIC0gQUxVXyoKKworICAgSW5pdGlhbGl6YXRpb246CisKKwlBTFUqX0JFR0lOKEFDQyk6IERlY2xhcmUgaW5pdGlhbGl6ZSB0aGUgQUxVIGFjY3VtdWxhdG9yIHdpdGggQUNDLgorCisgICBSZXN1bHRzOgorCisgICAgICAgIFRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgZmluYWwgcmVzdWx0IG1heSBiZSBjb21wdXRlZCBhIG51bWJlcgorICAgICAgICBvZiBkaWZmZXJlbnQgd2F5cy4gIFRocmVlIGRpZmZlcmVudCBvdmVyZmxvdyBtYWNybydzIGFyZQorICAgICAgICBkZWZpbmVkLCB0aGUgbW9zdCBlZmZpY2llbnQgb25lIHRvIHVzZSBkZXBlbmRzIG9uIHdoaWNoIG90aGVyCisgICAgICAgIG91dHB1dHMgZnJvbSB0aGUgYWx1IGFyZSBiZWluZyB1c2VkLgorCisJQUxVKl9SRVNVTFQ6IEdlbmVyaWMgQUxVIHJlc3VsdCBvdXRwdXQuCisKKyAgIAlBTFUqX0hBRF9PVkVSRkxPVzogUmV0dXJucyBhIG5vbnplcm8gdmFsdWUgaWYgc2lnbmVkIG92ZXJmbG93CisgICAJb2NjdXJlZC4KKworCUFMVSpfT1ZFUkZMT1dfUkVTVUxUOiBJZiB0aGUgbWFjcm8gQUxVKl9IQURfT1ZFUkZMT1cgaXMgYmVpbmcKKwl1c2VkIHRoaXMgaXMgdGhlIG1vc3QgZWZmaWNpZW50IHJlc3VsdCBhdmFpbGFibGUuICBFeDoKKworCQkjZGVmaW5lIEFMVTE2X0VORChSRVMpIFwKKwkJaWYgKEFMVTE2X0hBRF9PVkVSRkxPVykgXAorCQkgIHNpbV9lbmdpbmVfaGFsdCAoLi4uKTsgXAorCQkoUkVTKSA9IEFMVTE2X09WRVJGTE9XX1JFU1VMVAorICAgCisgICAJQUxVKl9IQURfQ0FSUllfQk9SUk9XOiBSZXR1cm5zIGEgbm9uemVybyB2YWx1ZSBpZiB1bnNpZ25lZAorICAgCW92ZXJmbG93IG9yIHVuZGVyZmxvdyAoYWxzbyByZWZlcmVkIHRvIGFzIGNhcnJ5IGFuZCBib3Jyb3cpCisgICAJb2NjdXJlZC4KKworCUFMVSpfQ0FSUllfQk9SUk9XX1JFU1VMVDogSWYgdGhlIG1hY3JvIEFMVSpfSEFEX0NBUlJZX0JPUlJPVyBpcyBiZWluZworCXVzZWQgdGhpcyBpcyB0aGUgbW9zdCBlZmZpY2llbnQgcmVzdWx0IGF2YWlsYWJsZS4gIEV4OgorCisJCSNkZWZpbmUgQUxVNjRfRU5EKFJFUykgXAorCQlTdGF0ZS5jYXJyeSA9IEFMVTY0X0hBRF9DQVJSWV9CT1JST1c7IFwKKwkJKFJFUykgPSBBTFU2NF9DQVJSWV9CT1JST1dfUkVTVUxUCisgICAKKyAgIAorICAgQWRkaXRpb246CisKKwlBTFUqX0FERChWQUwpOiBBZGQgVkFMIHRvIHRoZSBBTFUgYWNjdW11bGF0b3IuICBSZWNvcmQgYW55CisJb3ZlcmZsb3cgYXMgd2VsbCBhcyB0aGUgZmluYWwgcmVzdWx0LgorCisJQUxVKl9BRERDKFZBTCk6IEFkZCBWQUwgdG8gdGhlIEFMVSBhY2N1bXVsYXRvci4gIFJlY29yZCBhbnkKKwljYXJyeS1vdXQgb3Igb3ZlcmZsb3cgYXMgd2VsbCBhcyB0aGUgZmluYWwgcmVzdWx0LgorCisJQUxVKl9BRERDX0MoVkFMLENJKTogQWRkIFZBTCBhbmQgQ0kgKGNhcnJ5LWluKS4gIFJlY29yZCBhbnkKKwljYXJyeS1vdXQgb3Igb3ZlcmZsb3cgYXMgd2VsbCBhcyB0aGUgZmluYWwgcmVzdWx0LgorCisgICBTdWJ0cmFjdGlvbjoKKworCUFMVSpfU1VCKFZBTCk6IFN1YnRyYWN0IFZBTCBmcm9tIHRoZSBBTFUgYWNjdW11bGF0b3IuICBSZWNvcmQKKwlhbnkgdW5kZXJmbG93IGFzIHdlbGwgYXMgdGhlIGZpbmFsIHJlc3VsdC4KKworCUFMVSpfU1VCQyhWQUwpOiBTdWJ0cmFjdCBWQUwgZnJvbSB0aGUgQUxVIGFjY3VtdWxhdG9yIHVzaW5nCisJbmVnYXRlZCBhZGRpdGlvbi4gIFJlY29yZCBhbnkgdW5kZXJmbG93IG9yIGNhcnJ5LW91dCBhcyB3ZWxsCisJYXMgdGhlIGZpbmFsIHJlc3VsdC4KKworCUFMVSpfU1VCQihWQUwpOiBTdWJ0cmFjdCBWQUwgZnJvbSB0aGUgQUxVIGFjY3VtdWxhdG9yIHVzaW5nCisJZGlyZWN0IHN1YnRyYWN0aW9uIChBQ0MrflZBTCsxKS4gIFJlY29yZCBhbnkgdW5kZXJmbG93IG9yCisJYm9ycm93LW91dCBhcyB3ZWxsIGFzIHRoZSBmaW5hbCByZXN1bHQuCisKKwlBTFUqX1NVQkNfWChWQUwsQ0kpOiBTdWJ0cmFjdCBWQUwgYW5kIENJIChjYXJyeS1pbikgZnJvbSB0aGUKKwlBTFUgYWNjdW11bGF0b3IgdXNpbmcgZXh0ZW5kZWQgbmVnYXRlZCBhZGRpdGlvbiAoQUNDK35WQUwrQ0kpLgorCVJlY29yZCBhbnkgdW5kZXJmbG93IG9yIGNhcnJ5LW91dCBhcyB3ZWxsIGFzIHRoZSBmaW5hbCByZXN1bHQuCisKKwlBTFUqX1NVQkJfQihWQUwsQkkpOiBTdWJ0cmFjdCBWQUwgYW5kIEJJIChib3Jyb3ctaW4pIGZyb20gdGhlCisJQUxVIGFjY3VtdWxhdG9yIHVzaW5nIGRpcmVjdCBzdWJ0cmFjdGlvbi4gIFJlY29yZCBhbnkKKwl1bmRlcmZsb3cgb3IgYm9ycm93LW91dCBhcyB3ZWxsIGFzIHRoZSBmaW5hbCByZXN1bHQuCisKKworICovCisKKworCisvKiBUd29zIGNvbXBsZW1lbnQgYXJpdG1ldGljIC0gYWRkaXRpb24vc3VidHJhY3Rpb24gLSBjYXJyeS9ib3Jyb3cKKyAgIChvciB5b3UgdGhvdWdodCB5b3Uga25ldyB0aGUgYW5zd2VyIHRvIDAtMCkKKworICAgCisKKyAgIE5vdGF0aW9uIGFuZCBQcm9wZXJ0aWVzOgorCisKKyAgIFhuIGRlbm90ZXMgdGhlIHZhbHVlIFggc3RvcmVkIGluIE4gYml0cy4KKworICAgTVNCbiAoWCk6IFRoZSBtb3N0IHNpZ25pZmljYW50IChzaWduKSBiaXQgb2YgWCB0cmVhdGVkIGFzIGFuIE4gYml0CisgICB2YWx1ZS4KKworICAgU0VYVG4gKFgpOiBUaGUgaW5maW5pdGUgc2lnbiBleHRlbnNpb24gb2YgWCB0cmVhdGVkIGFzIGFuIE4gYml0CisgICB2YWx1ZS4KKworICAgTUFYbiwgTUlObjogVGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZCBvZiBhIHNpZ25lZCwgdHdvJ3MKKyAgIGNvbXBsZW1lbnQgTiBiaXQgdmFsdWUuCisKKyAgIFVNQVhuOiBUaGUgdXBwZXIgYm91bmQgb2YgYW4gdW5zaWduZWQgTiBiaXQgdmFsdWUgKHRoZSBsb3dlcgorICAgYm91bmQgaXMgYWx3YXlzIHplcm8pLgorCisgICBVbjogVU1BWG4gKyAxLiAgVW5zaWduZWQgYXJyaXRobWV0aWMgaXMgY29tcHV0ZWQgYG1vZHVsbyAoVW4pJy4gIAorCisgICBYW3BdOiBJcyBiaXQgUCBvZiBYLiAgWFswXSBkZW5vdGVzIHRoZSBsZWFzdCBzaWduaWZhbnQgYml0LgorCisgICB+WFtwXTogSXMgdGhlIGludmVyc2lvbiBvZiBiaXQgWFtwXS4gQWxzbyBlcXVhbCB0byAxLVhbcF0sCisgICAoMStYW3BdKW1vZCgyKS4KKworCisKKyAgIEFkZGl0aW9uIC0gT3ZlcmZsb3cgLSBJbnRyb2R1Y3Rpb246CisKKworICAgT3ZlcmZsb3cvT3ZlcmZsb3cgaW5kaWNhdGVzIGFuIGVycm9yIGluIGNvbXB1dGF0aW9uIG9mIHNpZ25lZAorICAgYXJyaXRobWV0aWMuICBpLmUuIGdpdmVuIFgsWSBpbiBbTUlObi4uTUFYbl07IG92ZXJmbG93CisgICBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVzdWx0IFgrWSA+IE1BWG4gb3IgWCtZIDwgTUlOX0lOVHguCisKKyAgIEhhcmR3YXJlIHRyYWRpdGlvbmFsbHkgaW1wbGVtZW50cyBvdmVyZmxvdyBieSBjb21wdXRpbmcgdGhlIFhPUiBvZgorICAgY2FycnktaW4vY2Fycnktb3V0IG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgQUxVLiBIZXJlCisgICBvdGhlciBtZXRob2RzIG5lZWQgdG8gYmUgZm91bmQuCisKKworCisgICBBZGRpdGlvbiAtIE92ZXJmbG93IC0gbWV0aG9kIDE6CisKKworICAgT3ZlcmZsb3cgb2NjdXJlcyB3aGVuIHRoZSBzaWduIChtb3N0IHNpZ25pZmljYW50IGJpdCkgb2YgdGhlIHR3byBOCisgICBiaXQgb3BlcmFuZHMgaXMgaWRlbnRpY2FsIGJ1dCBkaWZmZXJlbnQgdG8gdGhlIHNpZ24gb2YgdGhlIHJlc3VsdDoKKworICAgICAgICAgICAgICAgIFJuID0gKFhuICsgWW4pCisJCVYgPSBNU0JuICh+KFhuIF4gWW4pICYgKFJuIF4gWG4pKQorCisKKworICAgQWRkaXRpb24gLSBPdmVyZmxvdyAtIG1ldGhvZCAyOgorCisKKyAgIFRoZSB0d28gTiBiaXQgb3BlcmFuZHMgYXJlIHNpZ24gZXh0ZW5kZWQgdG8gTT5OIGJpdHMgYW5kIHRoZW4KKyAgIGFkZGVkLiAgT3ZlcmZsb3cgb2NjdXJlcyB3aGVuIFNJR05fQklUPG4+IGFuZCBTSUdOX0JJVDxtPiBkbyBub3QKKyAgIG1hdGNoLgorICAKKyAgIAkJUm0gPSAoU0VYVG4gKFhuKSArIFNFWFRuIChZbikpCisJCVYgPSBNU0JuICgoUm0gPj4gKE0gLSBOKSkgXiBSbSkKKworCisKKyAgIEFkZGl0aW9uIC0gT3ZlcmZsb3cgLSBtZXRob2QgMzoKKworCisgICBUaGUgdHdvIE4gYml0IG9wZXJhbmRzIGFyZSBzaWduIGV4dGVuZGVkIHRvIE0+TiBiaXRzIGFuZCB0aGVuCisgICBhZGRlZC4gIE92ZXJmbG93IG9jY3VyZXMgd2hlbiB0aGUgcmVzdWx0IGlzIG91dHNpZGUgb2YgdGhlIHNpZ24KKyAgIGV4dGVuZGVkIHJhbmdlIFtNSU5uIC4uIE1BWG5dLgorCisKKworICAgQWRkaXRpb24gLSBPdmVyZmxvdyAtIG1ldGhvZCA0OgorCisKKyAgIEdpdmVuIHRoZSBSZXN1bHQgYW5kIENhcnJ5LW91dCBiaXRzLCB0aGUgb1ZlcmZsb3cgZnJvbSB0aGUgYWRkaXRpb24KKyAgIG9mIFgsIFkgYW5kIGNhcnJ5LUluIGNhbiBiZSBjb21wdXRlZCB1c2luZyB0aGUgZXF1YXRpb246CisKKyAgICAgICAgICAgICAgICBSbiA9IChYbiArIFluKQorCQlWID0gKE1TQm4gKChYbiBeIFluKSBeIFJuKSkgXiBDKQorCisgICBBcyBzaG93biBpbiB0aGUgdGFibGUgYmVsb3c6CisKKyAgICAgICAgIEkgIFggIFkgIFIgIEMgfCBWIHwgWF5ZICBeUiAgXkMKKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0tLS0tLS0tLS0tCisgICAgICAgICAwICAwICAwICAwICAwIHwgMCB8ICAwICAgIDAgICAwCisgICAgICAgICAwICAwICAxICAxICAwIHwgMCB8ICAxICAgIDAgICAwCisgICAgICAgICAwICAxICAwICAxICAwIHwgMCB8ICAxICAgIDAgICAwCisgICAgICAgICAwICAxICAxICAwICAxIHwgMSB8ICAwICAgIDAgICAxCisgICAgICAgICAxICAwICAwICAxICAwIHwgMSB8ICAwICAgIDEgICAxCisgICAgICAgICAxICAwICAxICAwICAxIHwgMCB8ICAxICAgIDEgICAwCisgICAgICAgICAxICAxICAwICAwICAxIHwgMCB8ICAxICAgIDEgICAwCisgICAgICAgICAxICAxICAxICAxICAxIHwgMCB8ICAwICAgIDEgICAwCisKKworCisgICBBZGRpdGlvbiAtIENhcnJ5IC0gSW50cm9kdWN0aW9uOgorCisKKyAgIENhcnJ5IChwb29ybHkgbmFtZWQpIGluZGljYXRlcyB0aGF0IGFuIG92ZXJmbG93IG9jY3VyZWQgZm9yCisgICB1bnNpZ25lZCBOIGJpdCBhZGRpdGlvbi4gIGkuZS4gZ2l2ZW4gWCwgWSBpbiBbMC4uVU1BWG5dIHRoZW4KKyAgIGNhcnJ5IGluZGljYXRlcyBYK1kgPiBVTUFYbiBvciBYK1kgPj0gVW4uCisKKyAgIFRoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgdGhlIG91dHB1dCBmb3IgYWxsIGdpdmVuIGlucHV0cyBpbnRvIGEKKyAgIGZ1bGwtYWRkZXIuCisgIAorICAgICAgICAgSSAgWCAgWSAgUiB8IEMKKyAgICAgICAgLS0tLS0tLS0tLS0tKy0tLQorICAgICAgICAgMCAgMCAgMCAgMCB8IDAKKyAgICAgICAgIDAgIDAgIDEgIDEgfCAwCisgICAgICAgICAwICAxICAwICAxIHwgMAorICAgICAgICAgMCAgMSAgMSAgMCB8IDEKKyAgICAgICAgIDEgIDAgIDAgIDEgfCAwCisgICAgICAgICAxICAwICAxICAwIHwgMQorICAgICAgICAgMSAgMSAgMCAgMCB8IDEKKyAgICAgICAgIDEgIDEgIDEgIDEgfCAxCisKKyAgIChjYXJyeS1JbiwgWCwgWSwgUmVzdWx0LCBDYXJyeS1vdXQpOgorCisKKworICAgQWRkaXRpb24gLSBDYXJyeSAtIG1ldGhvZCAxOgorCisKKyAgIExvb2tpbmcgYXQgdGhlIHRlcm1zIFgsIFkgYW5kIFIgd2Ugd2FudCBhbiBlcXVhdGlvbiBmb3IgQy4KKworICAgICAgIFhZXFIgIDAgIDEKKyAgICAgICAgICArLS0tLS0tLQorICAgICAgIDAwIHwgIDAgIDAgCisgICAgICAgMDEgfCAgMSAgMAorICAgICAgIDExIHwgIDEgIDEKKyAgICAgICAxMCB8ICAxICAwCisKKyAgIFRoaXMgZ2l2aW5nIHVzIHRoZSBzdW0tb2YtcHJvZCBlcXVhdGlvbjoKKworCQlNU0JuICgoWG4gJiBZbikgfCAoWG4gJiB+Um4pIHwgKFluICYgflJuKSkKKworICAgVmVyaWZ5aW5nOgorCisgICAgICAgICBJICBYICBZICBSIHwgQyB8IFgmWSAgWCZ+UiBZJn5SIAorICAgICAgICAtLS0tLS0tLS0tLS0rLS0tKy0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgMCAgMCAgMCAgMCB8IDAgfCAgMCAgICAwICAgIDAKKyAgICAgICAgIDAgIDAgIDEgIDEgfCAwIHwgIDAgICAgMCAgICAwCisgICAgICAgICAwICAxICAwICAxIHwgMCB8ICAwICAgIDAgICAgMAorICAgICAgICAgMCAgMSAgMSAgMCB8IDEgfCAgMSAgICAxICAgIDEKKyAgICAgICAgIDEgIDAgIDAgIDEgfCAwIHwgIDAgICAgMCAgICAwCisgICAgICAgICAxICAwICAxICAwIHwgMSB8ICAwICAgIDAgICAgMQorICAgICAgICAgMSAgMSAgMCAgMCB8IDEgfCAgMCAgICAxICAgIDAKKyAgICAgICAgIDEgIDEgIDEgIDEgfCAxIHwgIDEgICAgMCAgICAwCisKKworCisgICBBZGRpdGlvbiAtIENhcnJ5IC0gbWV0aG9kIDI6CisKKworICAgR2l2ZW4gdHdvIHNpZ25lZCBOIGJpdCBudW1iZXJzLCBhIGNhcnJ5IGNhbiBiZSBkZXRlY3RlZCBieSB0cmVhdGluZworICAgdGhlIG51bWJlcnMgYXMgTiBiaXQgdW5zaWduZWQgYW5kIGFkZGluZyB0aGVtIHVzaW5nIE0+TiB1bnNpZ25lZAorICAgYXJyaXRobWV0aWMuICBDYXJyeSBpcyBpbmRpY2F0ZWQgYnkgYml0ICgxIDw8IE4pIGJlaW5nIHNldCAocmVzdWx0CisgICA+PSAyKipOKS4KKworCisKKyAgIEFkZGl0aW9uIC0gQ2FycnkgLSBtZXRob2QgMzoKKworCisgICBHaXZlbiB0aGUgb1ZlcmZsb3cgYml0LiAgVGhlIGNhcnJ5IGNhbiBiZSBjb21wdXRlZCBmcm9tOgorCisJCSh+UiZWKSB8IChSJlYpCisKKworCisgICBBZGRpdGlvbiAtIENhcnJ5IC0gbWV0aG9kIDQ6CisKKyAgIEdpdmVuIHR3byBzaWduZWQgbnVtYmVycy4gIFRyZWF0aW5nIHRoZW0gYXMgdW5zaWduZWQgd2UgaGF2ZToKKworCQkwIDw9IFggPCBVbiwgMCA8PSBZIDwgVW4KKwk9PT4JWCArIFkgPCAyIFVuCisKKyAgIENvbnNpZGVyIFkgd2hlbiBjYXJyeSBvY2N1cmVzOgorCisJCVggKyBZID49IFVuLCBZIDwgVW4KKwk9PT4JKFVuIC0gWCkgPD0gWSA8IFVuICAgICAgICAgICAgICAgIyByZS1hcmFuZ2UKKwk9PT4JVW4gPD0gWCArIFkgPCBVbiArIFggPCAyIFVuICAgICAgIyBhZGQgWG4KKwk9PT4JMCA8PSAoWCArIFkpIG1vZCBVbiA8IFggbW9kIFVuCisKKyAgIG9yIHdoZW4gY2FycnkgYXMgb2NjdXJlZDoKKworICAgICAgICAgICAgICAgKFggKyBZKSBtb2QgVW4gPCBYIG1vZCBVbgorCisgICBDb25zaWRlciBZIHdoZW4gY2FycnkgZG9lcyBub3Qgb2NjdXJlOgorCisJCVggKyBZIDwgVW4KKwloYXZlCVggPCBVbiwgWSA+PSAwCisJPT0+CVggPD0gWCArIFkgPCBVbgorCT09PiAgICAgWCBtb2QgVW4gPD0gKFggKyBZKSBtb2QgVW4KKworICAgb3Igd2hlbiBjYXJyeSBoYXMgbm90IG9jY3VyZWQ6CisKKwkgICAgICAgICEgKCAoWCArIFkpIG1vZCBVbiA8IFggbW9kIFVuKQorCisgICBoZW5jZSB3ZSBnZXQgY2FycnkgYnkgY29tcHV0aW5nIGluIE4gYml0IHVuc2lnbmVkIGFycml0aG1ldGljLgorCisgICAgICAgICAgICAgICAgY2FycnkgPC0gKFhuICsgWW4pIDwgWG4KKworCisKKyAgIFN1YnRyYWN0aW9uIC0gSW50cm9kdWN0aW9uCisKKworICAgVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgd2F5cyBvZiBjb21wdXRpbmcgdGhlIHNpZ25lZCB0d28ncworICAgY29tcGxlbWVudCBkaWZmZXJlbmNlIG9mIHR3byBudW1iZXJzLiAgVGhlIGZpcnN0IGlzIGJhc2VkIG9uCisgICBuZWdhdGl2ZSBhZGRpdGlvbiwgdGhlIHNlY29uZCBvbiBkaXJlY3Qgc3VidHJhY3Rpb24uCisKKworCisgICBTdWJ0cmFjdGlvbiAtIENhcnJ5IC0gSW50cm9kdWN0aW9uIC0gTmVnYXRlZCBBZGRpdGlvbgorCisKKyAgIFRoZSBlcXVhdGlvbiBYIC0gWSBjYW4gYmUgY29tcHV0ZWQgdXNpbmc6CisKKyAgIAkJWCArICgtWSkKKwk9PT4JWCArIH5ZICsgMQkJIyAtWSA9IH5ZICsgMQorCisgICBJbiBhZGRpdGlvbiB0byB0aGUgcmVzdWx0LCB0aGUgZXF1YXRpb24gcHJvZHVjZXMgQ2Fycnktb3V0LiAgRm9yCisgICBzdWNjZWVkaW5nIGV4dGVuZGVkIHBycmNpc2lvbiBjYWxjdWxhdGlvbnMsIHRoZSBtb3JlIGdlbmVyYWwKKyAgIGVxdWF0aW9uIGNhbiBiZSB1c2VkOgorCisJCUNbcF06UltwXSAgPSAgWFtwXSArIH5ZW3BdICsgQ1twLTFdCisgCXdoZXJlCUNbMF06UlswXSAgPSAgWFswXSArIH5ZWzBdICsgMQorCisKKworICAgU3VidHJhY3Rpb24gLSBCb3Jyb3cgLSBJbnRyb2R1Y3Rpb24gLSBEaXJlY3QgU3VidHJhY3Rpb24KKworCisgICBUaGUgYWx0ZXJuYXRpdmUgdG8gbmVnYXRpdmUgYWRkaXRpb24gaXMgZGlyZWN0IHN1YnRyYWN0aW9uIHdoZXJlCisgICBgWC1ZIGlzIGNvbXB1dGVkIGRpcmVjdGx5LiAgSW4gYWRkaXRpb24gdG8gdGhlIHJlc3VsdCBvZiB0aGUKKyAgIGNhbGN1bGF0aW9uLCBhIEJvcnJvdyBiaXQgaXMgcHJvZHVjZWQuICBJbiBnZW5lcmFsIHRlcm1zOgorCisJCUJbcF06UltwXSAgPSAgWFtwXSAtIFlbcF0gLSBCW3AtMV0KKwl3aGVyZQlCWzBdOlJbMF0gID0gIFhbMF0gLSBZWzBdCisKKyAgIFRoZSBCb3Jyb3cgYml0IGlzIHRoZSBjb21wbGVtZW50IG9mIHRoZSBDYXJyeSBiaXQgcHJvZHVjZWQgYnkKKyAgIE5lZ2F0ZWQgQWRkaXRpb24gYWJvdmUuICBBIGRvZGd5IHByb29mIGZvbGxvd3M6CisKKyAgIAlDYXNlIDA6CisJCUNbMF06UlswXSA9IFhbMF0gKyB+WVswXSArIDEKKwk9PT4JQ1swXTpSWzBdID0gWFswXSArIDEgLSBZWzBdICsgMQkjIH5ZWzBdID0gKDEgLSBZWzBdKT8KKwk9PT4JQ1swXTpSWzBdID0gMiArIFhbMF0gLSBZWzBdCisJPT0+CUNbMF06UlswXSA9IDIgKyBCWzBdOlJbMF0KKwk9PT4JQ1swXTpSWzBdID0gKDEgKyBCWzBdKTpSWzBdCisJPT0+CUNbMF0gPSB+QlswXQkJCSMgKDEgKyBCWzBdKSBtb2QgMiA9IH5CWzBdPworCisJQ2FzZSBQOgorCQlDW3BdOlJbcF0gPSBYW3BdICsgfllbcF0gKyBDW3AtMV0KKwk9PT4JQ1twXTpSW3BdID0gWFtwXSArIDEgLSBZWzBdICsgMSAtIEJbcC0xXQorCT09PglDW3BdOlJbcF0gPSAyICsgWFtwXSAtIFlbMF0gLSBCW3AtMV0KKwk9PT4JQ1twXTpSW3BdID0gMiArIEJbcF06UltwXQorCT09PglDW3BdOlJbcF0gPSAoMSArIEJbcF0pOlJbcF0KKwk9PT4gICAgIENbcF0gPSB+QltwXQorCisgICBUaGUgdGFibGUgYmVsb3cgbGlzdHMgYWxsIHBvc3NpYmxlIGlucHV0cy9vdXRwdXRzIGZvciBhCisgICBmdWxsLXN1YnRyYWN0b3I6CisKKyAgIAlYICBZICBJICB8ICBSICBCCisJMCAgMCAgMCAgfCAgMCAgMAorCTAgIDAgIDEgIHwgIDEgIDEKKwkwICAxICAwICB8ICAxICAxCisJMCAgMSAgMSAgfCAgMCAgMQorCTEgIDAgIDAgIHwgIDEgIDAKKwkxICAwICAxICB8ICAwICAwCisJMSAgMSAgMCAgfCAgMCAgMAorCTEgIDEgIDEgIHwgIDEgIDEKKworCisKKyAgIFN1YnRyYWN0aW9uIC0gTWV0aG9kIDEKKworCisgICBUcmVhdGluZyBYbiBhbmQgWW4gYXMgdW5zaWduZWQgdmFsdWVzIHRoZW4gYSBib3Jyb3cgKHVuc2lnbmVkCisgICB1bmRlcmZsb3cpIG9jY3VyZXMgd2hlbjoKKworCQlCID0gWG4gPCBZbgorCT09PglDID0gWG4gPj0gWW4KKworICovCisKKworCisvKiA4IGJpdCB0YXJnZXQgZXhwcmVzc2lvbnM6CisKKyAgIFNpbmNlIHRoZSBob3N0J3MgbmF0dXJhbCBiaXRzaXplID4gOCBiaXRzLCBjYXJyeSBtZXRob2QgMiBhbmQKKyAgIG92ZXJmbG93IG1ldGhvZCAyIGFyZSB1c2VkLiAqLworCisjZGVmaW5lIEFMVThfQkVHSU4oVkFMKSBcCit1bnNpZ25lZCBhbHU4X2NyID0gKHVuc2lnbmVkOCkgKFZBTCk7IFwKK3NpZ25lZCBhbHU4X3ZyID0gKHNpZ25lZDgpIChhbHU4X2NyKQorCisjZGVmaW5lIEFMVThfU0VUKFZBTCkgXAorYWx1OF9jciA9ICh1bnNpZ25lZDgpIChWQUwpOyBcCithbHU4X3ZyID0gKHNpZ25lZDgpIChhbHU4X2NyKQorCisjZGVmaW5lIEFMVThfU0VUX0NBUlJZX0JPUlJPVyhDQVJSWSkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIGlmIChDQVJSWSkJCQkJCQkJCVwKKyAgICBhbHU4X2NyIHw9ICgoc2lnbmVkKS0xKSA8PCA4OwkJCQkJXAorICBlbHNlCQkJCQkJCQkJXAorICAgIGFsdThfY3IgJj0gMHhmZjsJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFU4X0hBRF9DQVJSWV9CT1JST1cgKGFsdThfY3IgJiBMU0JJVDMyKDgpKQorI2RlZmluZSBBTFU4X0hBRF9PVkVSRkxPVyAoKChhbHU4X3ZyID4+IDgpIF4gYWx1OF92cikgJiBMU0JJVDMyICg4LTEpKQorCisjZGVmaW5lIEFMVThfUkVTVUxUICgodW5zaWduZWQ4KSBhbHU4X2NyKQorI2RlZmluZSBBTFU4X0NBUlJZX0JPUlJPV19SRVNVTFQgKCh1bnNpZ25lZDgpIGFsdThfY3IpCisjZGVmaW5lIEFMVThfT1ZFUkZMT1dfUkVTVUxUICgodW5zaWduZWQ4KSBhbHU4X3ZyKQorCisvKiAjZGVmaW5lIEFMVThfRU5EID8/Pz8/IC0gdGFyZ2V0IGRlcGVuZGFudCAqLworCisKKworLyogMTYgYml0IHRhcmdldCBleHByZXNzaW9uczoKKworICAgU2luY2UgdGhlIGhvc3QncyBuYXR1cmFsIGJpdHNpemUgPiAxNiBiaXRzLCBjYXJyeSBtZXRob2QgMiBhbmQKKyAgIG92ZXJmbG93IG1ldGhvZCAyIGFyZSB1c2VkLiAqLworCisjZGVmaW5lIEFMVTE2X0JFR0lOKFZBTCkgXAorc2lnbmVkIGFsdTE2X2NyID0gKHVuc2lnbmVkMTYpIChWQUwpOyBcCit1bnNpZ25lZCBhbHUxNl92ciA9IChzaWduZWQxNikgKGFsdTE2X2NyKQorCisjZGVmaW5lIEFMVTE2X1NFVChWQUwpIFwKK2FsdTE2X2NyID0gKHVuc2lnbmVkMTYpIChWQUwpOyBcCithbHUxNl92ciA9IChzaWduZWQxNikgKGFsdTE2X2NyKQorCisjZGVmaW5lIEFMVTE2X1NFVF9DQVJSWV9CT1JST1coQ0FSUlkpCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICBpZiAoQ0FSUlkpCQkJCQkJCQlcCisgICAgYWx1MTZfY3IgfD0gKChzaWduZWQpLTEpIDw8IDE2OwkJCQkJXAorICBlbHNlCQkJCQkJCQkJXAorICAgIGFsdTE2X2NyICY9IDB4ZmZmZjsJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFUxNl9IQURfQ0FSUllfQk9SUk9XIChhbHUxNl9jciAmIExTQklUMzIoMTYpKQorI2RlZmluZSBBTFUxNl9IQURfT1ZFUkZMT1cgKCgoYWx1MTZfdnIgPj4gMTYpIF4gYWx1MTZfdnIpICYgTFNCSVQzMiAoMTYtMSkpCisKKyNkZWZpbmUgQUxVMTZfUkVTVUxUICgodW5zaWduZWQxNikgYWx1MTZfY3IpCisjZGVmaW5lIEFMVTE2X0NBUlJZX0JPUlJPV19SRVNVTFQgKCh1bnNpZ25lZDE2KSBhbHUxNl9jcikKKyNkZWZpbmUgQUxVMTZfT1ZFUkZMT1dfUkVTVUxUICgodW5zaWduZWQxNikgYWx1MTZfdnIpCisKKy8qICNkZWZpbmUgQUxVMTZfRU5EID8/Pz8/IC0gdGFyZ2V0IGRlcGVuZGFudCAqLworCisKKworLyogMzIgYml0IHRhcmdldCBleHByZXNzaW9uczoKKworICAgU2luY2UgbW9zdCBob3N0cyBkbyBub3Qgc3VwcG9ydCA2NCAoPiAzMikgYml0IGFycml0aG1ldGljLCBjYXJyeQorICAgbWV0aG9kIDQgYW5kIG92ZXJmbG93IG1ldGhvZCA0IGFyZSB1c2VkLiAqLworCisjZGVmaW5lIEFMVTMyX0JFR0lOKFZBTCkgXAordW5zaWduZWQzMiBhbHUzMl9yID0gKFZBTCk7IFwKK2ludCBhbHUzMl9jID0gMDsgXAoraW50IGFsdTMyX3YgPSAwCisKKyNkZWZpbmUgQUxVMzJfU0VUKFZBTCkgXAorYWx1MzJfciA9IChWQUwpOyBcCithbHUzMl9jID0gMDsgXAorYWx1MzJfdiA9IDAKKworI2RlZmluZSBBTFUzMl9TRVRfQ0FSUllfQk9SUk9XKENBUlJZKSBhbHUzMl9jID0gKENBUlJZKQorCisjZGVmaW5lIEFMVTMyX0hBRF9DQVJSWV9CT1JST1cgKGFsdTMyX2MpCisjZGVmaW5lIEFMVTMyX0hBRF9PVkVSRkxPVyAoYWx1MzJfdikKKworI2RlZmluZSBBTFUzMl9SRVNVTFQgKGFsdTMyX3IpCisjZGVmaW5lIEFMVTMyX0NBUlJZX0JPUlJPV19SRVNVTFQgKGFsdTMyX3IpCisjZGVmaW5lIEFMVTMyX09WRVJGTE9XX1JFU1VMVCAoYWx1MzJfcikKKworCisKKy8qIDY0IGJpdCB0YXJnZXQgZXhwcmVzc2lvbnM6CisKKyAgIEV2ZW4gdGhvdWdoIHRoZSBob3N0IHR5cGljYWxseSBkb2Vzbid0IHN1cHBvcnQgbmF0aXZlIDY0IGJpdAorICAgYXJyaXRobWV0aWMsIGl0IGlzIHN0aWxsIHVzZWQuICovCisKKyNkZWZpbmUgQUxVNjRfQkVHSU4oVkFMKSBcCit1bnNpZ25lZDY0IGFsdTY0X3IgPSAoVkFMKTsgXAoraW50IGFsdTY0X2MgPSAwOyBcCitpbnQgYWx1NjRfdiA9IDAKKworI2RlZmluZSBBTFU2NF9TRVQoVkFMKSBcCithbHU2NF9yID0gKFZBTCk7IFwKK2FsdTY0X2MgPSAwOyBcCithbHU2NF92ID0gMAorCisjZGVmaW5lIEFMVTY0X1NFVF9DQVJSWV9CT1JST1coQ0FSUlkpIGFsdTY0X2MgPSAoQ0FSUlkpCisKKyNkZWZpbmUgQUxVNjRfSEFEX0NBUlJZX0JPUlJPVyAoYWx1NjRfYykKKyNkZWZpbmUgQUxVNjRfSEFEX09WRVJGTE9XIChhbHU2NF92KQorCisjZGVmaW5lIEFMVTY0X1JFU1VMVCAoYWx1NjRfcikKKyNkZWZpbmUgQUxVNjRfQ0FSUllfQk9SUk9XX1JFU1VMVCAoYWx1NjRfcikKKyNkZWZpbmUgQUxVNjRfT1ZFUkZMT1dfUkVTVUxUIChhbHU2NF9yKQorCisKKworLyogR2VuZXJpYyB2ZXJzaW9ucyBvZiBhYm92ZSBtYWNyb3MgKi8KKworI2RlZmluZSBBTFVfQkVHSU4JICAgIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX0JFR0lOKQorI2RlZmluZSBBTFVfU0VUCQkgICAgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfU0VUKQorI2RlZmluZSBBTFVfU0VUX0NBUlJZCSAgICBYQ09OQ0FUMyhBTFUsV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFLF9TRVRfQ0FSUlkpCisKKyNkZWZpbmUgQUxVX0hBRF9PVkVSRkxPVyAgICBYQ09OQ0FUMyhBTFUsV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFLF9IQURfT1ZFUkZMT1cpCisjZGVmaW5lIEFMVV9IQURfQ0FSUlkgICAgICAgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfSEFEX0NBUlJZKQorCisjZGVmaW5lIEFMVV9SRVNVTFQgICAgICAgICAgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfUkVTVUxUKQorI2RlZmluZSBBTFVfT1ZFUkZMT1dfUkVTVUxUIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX09WRVJGTE9XX1JFU1VMVCkKKyNkZWZpbmUgQUxVX0NBUlJZX1JFU1VMVCAgICBYQ09OQ0FUMyhBTFUsV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFLF9DQVJSWV9SRVNVTFQpCisKKworCisvKiBCYXNpYyBvcGVyYXRpb24gLSBhZGQgKG92ZXJmbG93aW5nKSAqLworCisjZGVmaW5lIEFMVThfQUREKFZBTCkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgdW5zaWduZWQ4IGFsdThhZGRfdmFsID0gKFZBTCk7CQkJCQlcCisgIEFMVThfQUREQyAoYWx1OGFkZF92YWwpOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUxVMTZfQUREKFZBTCkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgdW5zaWduZWQxNiBhbHUxNmFkZF92YWwgPSAoVkFMKTsJCQkJCVwKKyAgQUxVMTZfQUREQyAoYWx1OGFkZF92YWwpOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUxVMzJfQUREKFZBTCkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgdW5zaWduZWQzMiBhbHUzMmFkZF92YWwgPSAoVkFMKTsJCQkJCVwKKyAgQUxVMzJfQUREQyAoYWx1MzJhZGRfdmFsKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFMVTY0X0FERChWQUwpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIHVuc2lnbmVkNjQgYWx1NjRhZGRfdmFsID0gKHVuc2lnbmVkNjQpIChWQUwpOwkJCQlcCisgIEFMVTY0X0FEREMgKGFsdTY0YWRkX3ZhbCk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFVfQUREIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX0FERCkKKworCisKKy8qIEJhc2ljIG9wZXJhdGlvbiAtIGFkZCBjYXJyeWluZyAoYW5kIG92ZXJmbG93aW5nKSAqLworCisjZGVmaW5lIEFMVThfQUREQyhWQUwpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIHVuc2lnbmVkOCBhbHU4YWRkY192YWwgPSAoVkFMKTsJCQkJCVwKKyAgYWx1OF9jciArPSAodW5zaWduZWQ4KShhbHU4YWRkY192YWwpOwkJCQkJXAorICBhbHU4X3ZyICs9IChzaWduZWQ4KShhbHU4YWRkY192YWwpOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFUxNl9BRERDKFZBTCkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgdW5zaWduZWQxNiBhbHUxNmFkZGNfdmFsID0gKFZBTCk7CQkJCQlcCisgIGFsdTE2X2NyICs9ICh1bnNpZ25lZDE2KShhbHUxNmFkZGNfdmFsKTsJCQkJXAorICBhbHUxNl92ciArPSAoc2lnbmVkMTYpKGFsdTE2YWRkY192YWwpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFMVTMyX0FEREMoVkFMKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICB1bnNpZ25lZDMyIGFsdTMyYWRkY192YWwgPSAoVkFMKTsJCQkJCVwKKyAgdW5zaWduZWQzMiBhbHUzMmFkZGNfc2lnbiA9IGFsdTMyYWRkY192YWwgXiBhbHUzMl9yOwkJCVwKKyAgYWx1MzJfciArPSAoYWx1MzJhZGRjX3ZhbCk7CQkJCQkJXAorICBhbHUzMl9jID0gKGFsdTMyX3IgPCBhbHUzMmFkZGNfdmFsKTsJCQkJCVwKKyAgYWx1MzJfdiA9ICgoYWx1MzJhZGRjX3NpZ24gXiAtICh1bnNpZ25lZDMyKWFsdTMyX2MpIF4gYWx1MzJfcikgPj4gMzE7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUxVNjRfQUREQyhWQUwpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIHVuc2lnbmVkNjQgYWx1NjRhZGRjX3ZhbCA9ICh1bnNpZ25lZDY0KSAoVkFMKTsJCQlcCisgIHVuc2lnbmVkNjQgYWx1NjRhZGRjX3NpZ24gPSBhbHU2NGFkZGNfdmFsIF4gYWx1NjRfcjsJCQlcCisgIGFsdTY0X3IgKz0gKGFsdTY0YWRkY192YWwpOwkJCQkJCVwKKyAgYWx1NjRfYyA9IChhbHU2NF9yIDwgYWx1NjRhZGRjX3ZhbCk7CQkJCQlcCisgIGFsdTY0X3YgPSAoKGFsdTY0YWRkY19zaWduIF4gLSAodW5zaWduZWQ2NClhbHU2NF9jKSBeIGFsdTY0X3IpID4+IDYzOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFMVV9BRERDIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX0FEREMpCisKKworCisvKiBDb21wb3VuZCBvcGVyYXRpb24gLSBhZGQgY2FycnlpbmcgKGFuZCBvdmVyZmxvd2luZykgd2l0aCBjYXJyeS1pbiAqLworCisjZGVmaW5lIEFMVThfQUREQ19DKFZBTCxDKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIHVuc2lnbmVkOCBhbHU4YWRkY2NfdmFsID0gKFZBTCk7CQkJCQlcCisgIHVuc2lnbmVkOCBhbHU4YWRkY2NfYyA9IChDKTsJCQkJCQlcCisgIGFsdThfY3IgKz0gKHVuc2lnbmVkKSh1bnNpZ25lZDgpYWx1OGFkZGNjX3ZhbCArIGFsdThhZGRjY19jOwkJXAorICBhbHU4X3ZyICs9IChzaWduZWQpKHNpZ25lZDgpKGFsdThhZGRjY192YWwpICsgYWx1OGFkZGNjX2M7CQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFMVTE2X0FERENfQyhWQUwsQykJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICB1bnNpZ25lZDE2IGFsdTE2YWRkY2NfdmFsID0gKFZBTCk7CQkJCQlcCisgIHVuc2lnbmVkMTYgYWx1MTZhZGRjY19jID0gKEMpOwkJCQkJXAorICBhbHUxNl9jciArPSAodW5zaWduZWQpKHVuc2lnbmVkMTYpYWx1MTZhZGRjY192YWwgKyBhbHUxNmFkZGNjX2M7CVwKKyAgYWx1MTZfdnIgKz0gKHNpZ25lZCkoc2lnbmVkMTYpKGFsdTE2YWRkY2NfdmFsKSArIGFsdTE2YWRkY2NfYzsJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFUzMl9BRERDX0MoVkFMLEMpCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgdW5zaWduZWQzMiBhbHUzMmFkZGNjX3ZhbCA9IChWQUwpOwkJCQkJXAorICB1bnNpZ25lZDMyIGFsdTMyYWRkY2NfYyA9IChDKTsJCQkJCVwKKyAgdW5zaWduZWQzMiBhbHUzMmFkZGNjX3NpZ24gPSAoYWx1MzJhZGRjY192YWwgXiBhbHUzMl9yKTsJCVwKKyAgYWx1MzJfciArPSAoYWx1MzJhZGRjY192YWwgKyBhbHUzMmFkZGNjX2MpOwkJCQlcCisgIGFsdTMyX2MgPSAoKGFsdTMyX3IgPCBhbHUzMmFkZGNjX3ZhbCkJCQkJCVwKKyAgICAgICAgICAgICB8fCAoYWx1MzJhZGRjY19jICYmIGFsdTMyX3IgPT0gYWx1MzJhZGRjY192YWwpKTsJCVwKKyAgYWx1MzJfdiA9ICgoYWx1MzJhZGRjY19zaWduIF4gLSAodW5zaWduZWQzMilhbHUzMl9jKSBeIGFsdTMyX3IpID4+IDMxO1wKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUxVNjRfQUREQ19DKFZBTCxDKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIHVuc2lnbmVkNjQgYWx1NjRhZGRjY192YWwgPSAoVkFMKTsJCQkJCVwKKyAgdW5zaWduZWQ2NCBhbHU2NGFkZGNjX2MgPSAoQyk7CQkJCQlcCisgIHVuc2lnbmVkNjQgYWx1NjRhZGRjY19zaWduID0gKGFsdTY0YWRkY2NfdmFsIF4gYWx1NjRfcik7CQlcCisgIGFsdTY0X3IgKz0gKGFsdTY0YWRkY2NfdmFsICsgYWx1NjRhZGRjY19jKTsJCQkJXAorICBhbHU2NF9jID0gKChhbHU2NF9yIDwgYWx1NjRhZGRjY192YWwpCQkJCQlcCisgICAgICAgICAgICAgfHwgKGFsdTY0YWRkY2NfYyAmJiBhbHU2NF9yID09IGFsdTY0YWRkY2NfdmFsKSk7CQlcCisgIGFsdTY0X3YgPSAoKGFsdTY0YWRkY2Nfc2lnbiBeIC0gKHVuc2lnbmVkNjQpYWx1NjRfYykgXiBhbHU2NF9yKSA+PiA2MztcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFMVV9BRERDX0MgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfQUREQ19DKQorCisKKworLyogQmFzaWMgb3BlcmF0aW9uIC0gc3VidHJhY3QgKG92ZXJmbG93aW5nKSAqLworCisjZGVmaW5lIEFMVThfU1VCKFZBTCkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgdW5zaWduZWQ4IGFsdThzdWJfdmFsID0gKFZBTCk7CQkJCQlcCisgIEFMVThfQUREQ19DICh+YWx1OHN1Yl92YWwsIDEpOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFUxNl9TVUIoVkFMKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICB1bnNpZ25lZDE2IGFsdTE2c3ViX3ZhbCA9IChWQUwpOwkJCQkJXAorICBBTFUxNl9BRERDX0MgKH5hbHUxNnN1Yl92YWwsIDEpOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFUzMl9TVUIoVkFMKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICB1bnNpZ25lZDMyIGFsdTMyc3ViX3ZhbCA9IChWQUwpOwkJCQkJXAorICBBTFUzMl9BRERDX0MgKH5hbHUzMnN1Yl92YWwsIDEpOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFU2NF9TVUIoVkFMKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICB1bnNpZ25lZDY0IGFsdTY0c3ViX3ZhbCA9IChWQUwpOwkJCQkJXAorICBBTFU2NF9BRERDX0MgKH5hbHU2NHN1Yl92YWwsIDEpOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFVfU1VCIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX1NVQikKKworCisKKy8qIEJhc2ljIG9wZXJhdGlvbiAtIHN1YnRyYWN0IGNhcnJ5aW5nIChhbmQgb3ZlcmZsb3dpbmcpICovCisKKyNkZWZpbmUgQUxVOF9TVUJDKFZBTCkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgdW5zaWduZWQ4IGFsdThzdWJjX3ZhbCA9IChWQUwpOwkJCQkJXAorICBBTFU4X0FERENfQyAofmFsdThzdWJjX3ZhbCwgMSk7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFMVTE2X1NVQkMoVkFMKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICB1bnNpZ25lZDE2IGFsdTE2c3ViY192YWwgPSAoVkFMKTsJCQkJCVwKKyAgQUxVMTZfQUREQ19DICh+YWx1MTZzdWJjX3ZhbCwgMSk7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFMVTMyX1NVQkMoVkFMKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICB1bnNpZ25lZDMyIGFsdTMyc3ViY192YWwgPSAoVkFMKTsJCQkJCVwKKyAgQUxVMzJfQUREQ19DICh+YWx1MzJzdWJjX3ZhbCwgMSk7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFMVTY0X1NVQkMoVkFMKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICB1bnNpZ25lZDY0IGFsdTY0c3ViY192YWwgPSAoVkFMKTsJCQkJCVwKKyAgQUxVNjRfQUREQ19DICh+YWx1NjRzdWJjX3ZhbCwgMSk7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFMVV9TVUJDIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX1NVQkMpCisKKworCisvKiBDb21wb3VuZCBvcGVyYXRpb24gLSBzdWJ0cmFjdCBjYXJyeWluZyAoYW5kIG92ZXJmbG93aW5nKSwgZXh0ZW5kZWQgKi8KKworI2RlZmluZSBBTFU4X1NVQkNfWChWQUwsQykJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICB1bnNpZ25lZDggYWx1OHN1YmN4X3ZhbCA9IChWQUwpOwkJCQkJXAorICB1bnNpZ25lZDggYWx1OHN1YmN4X2MgPSAoQyk7CQkJCQkJXAorICBBTFU4X0FERENfQyAofmFsdThzdWJjeF92YWwsIGFsdThzdWJjeF9jKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFUxNl9TVUJDX1goVkFMLEMpCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgdW5zaWduZWQxNiBhbHUxNnN1YmN4X3ZhbCA9IChWQUwpOwkJCQkJXAorICB1bnNpZ25lZDE2IGFsdTE2c3ViY3hfYyA9IChDKTsJCQkJCVwKKyAgQUxVMTZfQUREQ19DICh+YWx1MTZzdWJjeF92YWwsIGFsdTE2c3ViY3hfYyk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUxVMzJfU1VCQ19YKFZBTCxDKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIHVuc2lnbmVkMzIgYWx1MzJzdWJjeF92YWwgPSAoVkFMKTsJCQkJCVwKKyAgdW5zaWduZWQzMiBhbHUzMnN1YmN4X2MgPSAoQyk7CQkJCQlcCisgIEFMVTMyX0FERENfQyAofmFsdTMyc3ViY3hfdmFsLCBhbHUzMnN1YmN4X2MpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFMVTY0X1NVQkNfWChWQUwsQykJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICB1bnNpZ25lZDY0IGFsdTY0c3ViY3hfdmFsID0gKFZBTCk7CQkJCQlcCisgIHVuc2lnbmVkNjQgYWx1NjRzdWJjeF9jID0gKEMpOwkJCQkJXAorICBBTFU2NF9BRERDX0MgKH5hbHU2NHN1YmN4X3ZhbCwgYWx1NjRzdWJjeF9jKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFVfU1VCQ19YIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX1NVQkNfWCkKKworCisKKy8qIEJhc2ljIG9wZXJhdGlvbiAtIHN1YnRyYWN0IGJvcnJvd2luZyAoYW5kIG92ZXJmbG93aW5nKSAqLworCisjZGVmaW5lIEFMVThfU1VCQihWQUwpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIHVuc2lnbmVkOCBhbHU4c3ViYl92YWwgPSAoVkFMKTsJCQkJCVwKKyAgYWx1OF9jciAtPSAodW5zaWduZWQpKHVuc2lnbmVkOClhbHU4c3ViYl92YWw7CQkJCVwKKyAgYWx1OF92ciAtPSAoc2lnbmVkKShzaWduZWQ4KWFsdThzdWJiX3ZhbDsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFUxNl9TVUJCKFZBTCkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgdW5zaWduZWQxNiBhbHUxNnN1YmJfdmFsID0gKFZBTCk7CQkJCQlcCisgIGFsdTE2X2NyIC09ICh1bnNpZ25lZCkodW5zaWduZWQxNilhbHUxNnN1YmJfdmFsOwkJCVwKKyAgYWx1MTZfdnIgLT0gKHNpZ25lZCkoc2lnbmVkMTYpYWx1MTZzdWJiX3ZhbDsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFUzMl9TVUJCKFZBTCkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgdW5zaWduZWQzMiBhbHUzMnN1YmJfdmFsID0gKFZBTCk7CQkJCQlcCisgIHVuc2lnbmVkMzIgYWx1MzJzdWJiX3NpZ24gPSBhbHUzMnN1YmJfdmFsIF4gYWx1MzJfcjsJCQlcCisgIGFsdTMyX2MgPSAoYWx1MzJfciA8IGFsdTMyc3ViYl92YWwpOwkJCQkJXAorICBhbHUzMl9yIC09IChhbHUzMnN1YmJfdmFsKTsJCQkJCQlcCisgIGFsdTMyX3YgPSAoKGFsdTMyc3ViYl9zaWduIF4gLSAodW5zaWduZWQzMilhbHUzMl9jKSBeIGFsdTMyX3IpID4+IDMxOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFMVTY0X1NVQkIoVkFMKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICB1bnNpZ25lZDY0IGFsdTY0c3ViYl92YWwgPSAoVkFMKTsJCQkJCVwKKyAgdW5zaWduZWQ2NCBhbHU2NHN1YmJfc2lnbiA9IGFsdTY0c3ViYl92YWwgXiBhbHU2NF9yOwkJCVwKKyAgYWx1NjRfYyA9IChhbHU2NF9yIDwgYWx1NjRzdWJiX3ZhbCk7CQkJCQlcCisgIGFsdTY0X3IgLT0gKGFsdTY0c3ViYl92YWwpOwkJCQkJCVwKKyAgYWx1NjRfdiA9ICgoYWx1NjRzdWJiX3NpZ24gXiAtICh1bnNpZ25lZDY0KWFsdTY0X2MpIF4gYWx1NjRfcikgPj4gMzE7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUxVX1NVQkIgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfU1VCQikKKworCisKKy8qIENvbXBvdW5kIG9wZXJhdGlvbiAtIHN1YnRyYWN0IGJvcnJvd2luZyAoYW5kIG92ZXJmbG93aW5nKSB3aXRoIGJvcnJvdy1pbiAqLworCisjZGVmaW5lIEFMVThfU1VCQl9CKFZBTCxCKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIHVuc2lnbmVkOCBhbHU4c3ViYmJfdmFsID0gKFZBTCk7CQkJCQlcCisgIHVuc2lnbmVkOCBhbHU4c3ViYmJfYiA9IChCKTsJCQkJCQlcCisgIGFsdThfY3IgLT0gKHVuc2lnbmVkKSh1bnNpZ25lZDgpYWx1OHN1YmJiX3ZhbDsJCQlcCisgIGFsdThfY3IgLT0gKHVuc2lnbmVkKSh1bnNpZ25lZDgpYWx1OHN1YmJiX2I7CQkJCVwKKyAgYWx1OF92ciAtPSAoc2lnbmVkKShzaWduZWQ4KWFsdThzdWJiYl92YWwgKyBhbHU4c3ViYmJfYjsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUxVMTZfU1VCQl9CKFZBTCxCKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIHVuc2lnbmVkMTYgYWx1MTZzdWJiYl92YWwgPSAoVkFMKTsJCQkJCVwKKyAgdW5zaWduZWQxNiBhbHUxNnN1YmJiX2IgPSAoQik7CQkJCQlcCisgIGFsdTE2X2NyIC09ICh1bnNpZ25lZCkodW5zaWduZWQxNilhbHUxNnN1YmJiX3ZhbDsJCQlcCisgIGFsdTE2X2NyIC09ICh1bnNpZ25lZCkodW5zaWduZWQxNilhbHUxNnN1YmJiX2I7CQkJXAorICBhbHUxNl92ciAtPSAoc2lnbmVkKShzaWduZWQxNilhbHUxNnN1YmJiX3ZhbCArIGFsdTE2c3ViYmJfYjsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUxVMzJfU1VCQl9CKFZBTCxCKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIHVuc2lnbmVkMzIgYWx1MzJzdWJiYl92YWwgPSAoVkFMKTsJCQkJCVwKKyAgdW5zaWduZWQzMiBhbHUzMnN1YmJiX2IgPSAoQik7CQkJCQlcCisgIEFMVTMyX0FERENfQyAofmFsdTMyc3ViYmJfdmFsLCAhYWx1MzJzdWJiYl9iKTsJCQlcCisgIGFsdTMyX2MgPSAhYWx1MzJfYzsJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFU2NF9TVUJCX0IoVkFMLEIpCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgdW5zaWduZWQ2NCBhbHU2NHN1YmJiX3ZhbCA9IChWQUwpOwkJCQkJXAorICB1bnNpZ25lZDY0IGFsdTY0c3ViYmJfYiA9IChCKTsJCQkJCVwKKyAgQUxVNjRfQUREQ19DICh+YWx1NjRzdWJiYl92YWwsICFhbHU2NHN1YmJiX2IpOwkJCVwKKyAgYWx1NjRfYyA9ICFhbHU2NF9jOwkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFMVV9TVUJCX0IgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfU1VCQl9CKQorCisKKworLyogQmFzaWMgb3BlcmF0aW9uIC0gbmVnYXRlIChvdmVyZmxvd2luZykgKi8KKworI2RlZmluZSBBTFU4X05FRygpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIHNpZ25lZCBhbHU4bmVnX3ZhbCA9IChBTFU4X1JFU1VMVCk7CQkJCQlcCisgIEFMVThfU0VUICgxKTsJCQkJCQkJCVwKKyAgQUxVOF9BRERDICh+YWx1OG5lZ192YWwpOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUxVMTZfTkVHKCkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgc2lnbmVkIGFsdTE2bmVnX3ZhbCA9IChBTFUxNl9SRVNVTFQpOwkJCQlcCisgIEFMVTE2X1NFVCAoMSk7CQkJCQkJCVwKKyAgQUxVMTZfQUREQyAofmFsdTE2bmVnX3ZhbCk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFUzMl9ORUcoKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICB1bnNpZ25lZDMyIGFsdTMybmVnX3ZhbCA9IChBTFUzMl9SRVNVTFQpOwkJCQlcCisgIEFMVTMyX1NFVCAoMSk7CQkJCQkJCVwKKyAgQUxVMzJfQUREQyAofmFsdTMybmVnX3ZhbCk7CQkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEFMVTY0X05FRygpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIHVuc2lnbmVkNjQgYWx1NjRuZWdfdmFsID0gKEFMVTY0X1JFU1VMVCk7CQkJCVwKKyAgQUxVNjRfU0VUICgxKTsJCQkJCQkJXAorICBBTFU2NF9BRERDICh+YWx1NjRuZWdfdmFsKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFMVV9ORUcgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfTkVHKQorCisKKworCisvKiBCYXNpYyBvcGVyYXRpb24gLSBuZWdhdGUgY2FycnlpbmcgKGFuZCBvdmVyZmxvd2luZykgKi8KKworI2RlZmluZSBBTFU4X05FR0MoKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICBzaWduZWQgYWx1OG5lZ2NfdmFsID0gKEFMVThfUkVTVUxUKTsJCQkJCVwKKyAgQUxVOF9TRVQgKDEpOwkJCQkJCQkJXAorICBBTFU4X0FEREMgKH5hbHU4bmVnY192YWwpOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUxVMTZfTkVHQygpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIHNpZ25lZCBhbHUxNm5lZ2NfdmFsID0gKEFMVTE2X1JFU1VMVCk7CQkJCVwKKyAgQUxVMTZfU0VUICgxKTsJCQkJCQkJXAorICBBTFUxNl9BRERDICh+YWx1MTZuZWdjX3ZhbCk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFUzMl9ORUdDKCkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgdW5zaWduZWQzMiBhbHUzMm5lZ2NfdmFsID0gKEFMVTMyX1JFU1VMVCk7CQkJCVwKKyAgQUxVMzJfU0VUICgxKTsJCQkJCQkJXAorICBBTFUzMl9BRERDICh+YWx1MzJuZWdjX3ZhbCk7CQkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEFMVTY0X05FR0MoKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICB1bnNpZ25lZDY0IGFsdTY0bmVnY192YWwgPSAoQUxVNjRfUkVTVUxUKTsJCQkJXAorICBBTFU2NF9TRVQgKDEpOwkJCQkJCQlcCisgIEFMVTY0X0FEREMgKH5hbHU2NG5lZ2NfdmFsKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFMVV9ORUdDIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX05FR0MpCisKKworCisKKy8qIEJhc2ljIG9wZXJhdGlvbiAtIG5lZ2F0ZSBib3Jyb3dpbmcgKGFuZCBvdmVyZmxvd2luZykgKi8KKworI2RlZmluZSBBTFU4X05FR0IoKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICBzaWduZWQgYWx1OG5lZ2JfdmFsID0gKEFMVThfUkVTVUxUKTsJCQkJCVwKKyAgQUxVOF9TRVQgKDApOwkJCQkJCQkJXAorICBBTFU4X1NVQkIgKGFsdThuZWdiX3ZhbCk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFUxNl9ORUdCKCkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgc2lnbmVkIGFsdTE2bmVnYl92YWwgPSAoQUxVMTZfUkVTVUxUKTsJCQkJXAorICBBTFUxNl9TRVQgKDApOwkJCQkJCQlcCisgIEFMVTE2X1NVQkIgKGFsdTE2bmVnYl92YWwpOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUxVMzJfTkVHQigpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIHVuc2lnbmVkMzIgYWx1MzJuZWdiX3ZhbCA9IChBTFUzMl9SRVNVTFQpOwkJCQlcCisgIEFMVTMyX1NFVCAoMCk7CQkJCQkJCVwKKyAgQUxVMzJfU1VCQiAoYWx1MzJuZWdiX3ZhbCk7CQkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEFMVTY0X05FR0IoKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICB1bnNpZ25lZDY0IGFsdTY0bmVnYl92YWwgPSAoQUxVNjRfUkVTVUxUKTsJCQkJXAorICBBTFU2NF9TRVQgKDApOwkJCQkJCQlcCisgIEFMVTY0X1NVQkIgKGFsdTY0bmVnYl92YWwpOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUxVX05FR0IgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfTkVHQikKKworCisKKworLyogT3RoZXIgKi8KKworI2RlZmluZSBBTFU4X09SKFZBTCkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgZXJyb3IoIkFMVTE2X09SIik7CQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUxVMTZfT1IoVkFMKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICBlcnJvcigiQUxVMTZfT1IiKTsJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFUzMl9PUihWQUwpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIGFsdTMyX3IgfD0gKFZBTCk7CQkJCQkJCVwKKyAgYWx1MzJfYyA9IDA7CQkJCQkJCQlcCisgIGFsdTMyX3YgPSAwOwkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFU2NF9PUihWQUwpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIGFsdTY0X3IgfD0gKFZBTCk7CQkJCQkJCVwKKyAgYWx1NjRfYyA9IDA7CQkJCQkJCQlcCisgIGFsdTY0X3YgPSAwOwkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFVfT1IoVkFMKSBYQ09OQ0FUMyhBTFUsV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFLF9PUikoVkFMKQorCisKKworI2RlZmluZSBBTFUxNl9YT1IoVkFMKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICBlcnJvcigiQUxVMTZfWE9SIik7CQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUxVMzJfWE9SKFZBTCkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgYWx1MzJfciBePSAoVkFMKTsJCQkJCQkJXAorICBhbHUzMl9jID0gMDsJCQkJCQkJCVwKKyAgYWx1MzJfdiA9IDA7CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFMVTY0X1hPUihWQUwpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIGFsdTY0X3IgXj0gKFZBTCk7CQkJCQkJCVwKKyAgYWx1NjRfYyA9IDA7CQkJCQkJCQlcCisgIGFsdTY0X3YgPSAwOwkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFVfWE9SKFZBTCkgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfWE9SKShWQUwpCisKKworCisKKyNkZWZpbmUgQUxVMTZfQU5EKFZBTCkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgZXJyb3IoIkFMVV9BTkQxNiIpOwkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFMVTMyX0FORChWQUwpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIGFsdTMyX3IgJj0gKFZBTCk7CQkJCQkJCVwKKyAgYWx1MzJfciA9IDA7CQkJCQkJCQlcCisgIGFsdTMyX3YgPSAwOwkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFU2NF9BTkQoVkFMKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICBhbHU2NF9yICY9IChWQUwpOwkJCQkJCQlcCisgIGFsdTY0X3IgPSAwOwkJCQkJCQkJXAorICBhbHU2NF92ID0gMDsJCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUxVX0FORChWQUwpIFhDT05DQVQzKEFMVSxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUsX0FORCkoVkFMKQorCisKKworCisjZGVmaW5lIEFMVTE2X05PVChWQUwpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIGVycm9yKCJBTFVfTk9UMTYiKTsJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBTFUzMl9OT1QJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgYWx1MzJfciA9IH5hbHUzMl9yOwkJCQkJCQlcCisgIGFsdTMyX2MgPSAwOwkJCQkJCQkJXAorICBhbHUzMl92ID0gMDsJCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQUxVNjRfTk9UCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisgIGFsdTY0X3IgPSB+YWx1NjRfcjsJCQkJCQkJXAorICBhbHU2NF9jID0gMDsJCQkJCQkJCVwKKyAgYWx1NjRfdiA9IDA7CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFMVV9OT1QgWENPTkNBVDMoQUxVLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSxfTk9UKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWFyYW5nZS5jIGIvc2ltL2NvbW1vbi9zaW0tYXJhbmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5NTVlNgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vc2ltLWFyYW5nZS5jCkBAIC0wLDAgKzEsMzAxIEBACisvKiBBZGRyZXNzIHJhbmdlcy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGVsbCBzaW0tYXJhbmdlLmggaXQncyB1cy4gICovCisjZGVmaW5lIFNJTV9BUkFOR0VfQworCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAic2ltLWJhc2ljcy5oIgorI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjZGVmaW5lIERFRklORV9JTkxJTkVfUCAoISBkZWZpbmVkIChTSU1fQVJBTkdFX0NfSU5DTFVERUQpKQorI2RlZmluZSBERUZJTkVfTk9OX0lOTElORV9QIGRlZmluZWQgKFNJTV9BUkFOR0VfQ19JTkNMVURFRCkKKworI2lmIERFRklORV9OT05fSU5MSU5FX1AKKworLyogSW5zZXJ0IGEgcmFuZ2UuICAqLworCitzdGF0aWMgdm9pZAoraW5zZXJ0X3JhbmdlIChBRERSX1NVQlJBTkdFICoqcG9zLCBBRERSX1NVQlJBTkdFICphc3IpCit7CisgIGFzci0+bmV4dCA9ICpwb3M7CisgICpwb3MgPSBhc3I7Cit9CisKKy8qIERlbGV0ZSBhIHJhbmdlLiAgKi8KKworc3RhdGljIHZvaWQKK2RlbGV0ZV9yYW5nZSAoQUREUl9TVUJSQU5HRSAqKnRoaXNhc3JwKQoreworICBBRERSX1NVQlJBTkdFICp0aGlzYXNyOworCisgIHRoaXNhc3IgPSAqdGhpc2FzcnA7CisgICp0aGlzYXNycCA9IHRoaXNhc3ItPm5leHQ7CisKKyAgZnJlZSAodGhpc2Fzcik7Cit9CisKKy8qIEFkZCBvciBkZWxldGUgYW4gYWRkcmVzcyByYW5nZS4KKyAgIFRoaXMgY29kZSB3YXMgYm9ycm93ZWQgZnJvbSBsaW51eCdzIGxvY2tzLmM6cG9zaXhfbG9ja19maWxlKCkuCisgICA/Pz8gVG9kbzogR2l2ZW4gb3VyIHNpbXBsZXIgbmVlZHMgdGhpcyBjb3VsZCBiZSBzaW1wbGlmaWVkCisgICAoc3BsaXQgaW50byB0d28gZm5zKS4gICovCisKK3N0YXRpYyB2b2lkCitmcm9iX3JhbmdlIChBRERSX1JBTkdFICphciwgYWRkcmVzc193b3JkIHN0YXJ0LCBhZGRyZXNzX3dvcmQgZW5kLCBpbnQgZGVsZXRlX3ApCit7CisgIEFERFJfU1VCUkFOR0UgKmFzcjsKKyAgQUREUl9TVUJSQU5HRSAqbmV3X2FzciwgKm5ld19hc3IyOworICBBRERSX1NVQlJBTkdFICpsZWZ0ID0gTlVMTDsKKyAgQUREUl9TVUJSQU5HRSAqcmlnaHQgPSBOVUxMOworICBBRERSX1NVQlJBTkdFICoqYmVmb3JlOworICBBRERSX1NVQlJBTkdFIGluaXRfY2FsbGVyOworICBBRERSX1NVQlJBTkdFICpjYWxsZXIgPSAmaW5pdF9jYWxsZXI7CisgIGludCBhZGRlZF9wID0gMDsKKworICBtZW1zZXQgKGNhbGxlciwgMCwgc2l6ZW9mIChBRERSX1NVQlJBTkdFKSk7CisgIG5ld19hc3IgPSBaQUxMT0MgKEFERFJfU1VCUkFOR0UpOworICBuZXdfYXNyMiA9IFpBTExPQyAoQUREUl9TVUJSQU5HRSk7CisKKyAgY2FsbGVyLT5zdGFydCA9IHN0YXJ0OworICBjYWxsZXItPmVuZCA9IGVuZDsKKyAgYmVmb3JlID0gJmFyLT5yYW5nZXM7CisKKyAgd2hpbGUgKChhc3IgPSAqYmVmb3JlKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICghIGRlbGV0ZV9wKQorCXsKKwkgIC8qIFRyeSBuZXh0IHJhbmdlIGlmIGN1cnJlbnQgcmFuZ2UgcHJlY2VlZHMgbmV3IG9uZSBhbmQgbm90CisJICAgICBhZGphY2VudCBvciBvdmVybGFwcGluZy4gICovCisJICBpZiAoYXNyLT5lbmQgPCBjYWxsZXItPnN0YXJ0IC0gMSkKKwkgICAgZ290byBuZXh0X3JhbmdlOworCisJICAvKiBCcmVhayBvdXQgaWYgbmV3IHJhbmdlIHByZWNlZWRzIGN1cnJlbnQgb25lIGFuZCBub3QKKwkgICAgIGFkamFjZW50IG9yIG92ZXJsYXBwaW5nLiAgKi8KKwkgIGlmIChhc3ItPnN0YXJ0ID4gY2FsbGVyLT5lbmQgKyAxKQorCSAgICBicmVhazsKKworCSAgLyogSWYgd2UgY29tZSBoZXJlLCB0aGUgbmV3IGFuZCBjdXJyZW50IHJhbmdlcyBhcmUgYWRqYWNlbnQgb3IKKwkgICAgIG92ZXJsYXBwaW5nLiBNYWtlIG9uZSByYW5nZSB5aWVsZGluZyBmcm9tIHRoZSBsb3dlciBzdGFydCBhZGRyZXNzCisJICAgICBvZiBib3RoIHJhbmdlcyB0byB0aGUgaGlnaGVyIGVuZCBhZGRyZXNzLiAgKi8KKwkgIGlmIChhc3ItPnN0YXJ0ID4gY2FsbGVyLT5zdGFydCkKKwkgICAgYXNyLT5zdGFydCA9IGNhbGxlci0+c3RhcnQ7CisJICBlbHNlCisJICAgIGNhbGxlci0+c3RhcnQgPSBhc3ItPnN0YXJ0OworCSAgaWYgKGFzci0+ZW5kIDwgY2FsbGVyLT5lbmQpCisJICAgIGFzci0+ZW5kID0gY2FsbGVyLT5lbmQ7CisJICBlbHNlCisJICAgIGNhbGxlci0+ZW5kID0gYXNyLT5lbmQ7CisKKwkgIGlmIChhZGRlZF9wKQorCSAgICB7CisJICAgICAgZGVsZXRlX3JhbmdlIChiZWZvcmUpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICBjYWxsZXIgPSBhc3I7CisJICBhZGRlZF9wID0gMTsKKwl9CisgICAgICBlbHNlIC8qIGRlbGV0aW5nIGEgcmFuZ2UgKi8KKwl7CisJICAvKiBUcnkgbmV4dCByYW5nZSBpZiBjdXJyZW50IHJhbmdlIHByZWNlZWRzIG5ldyBvbmUuICAqLworCSAgaWYgKGFzci0+ZW5kIDwgY2FsbGVyLT5zdGFydCkKKwkgICAgZ290byBuZXh0X3JhbmdlOworCisJICAvKiBCcmVhayBvdXQgaWYgbmV3IHJhbmdlIHByZWNlZWRzIGN1cnJlbnQgb25lLiAgKi8KKwkgIGlmIChhc3ItPnN0YXJ0ID4gY2FsbGVyLT5lbmQpCisJICAgIGJyZWFrOworCisJICBhZGRlZF9wID0gMTsKKworCSAgaWYgKGFzci0+c3RhcnQgPCBjYWxsZXItPnN0YXJ0KQorCSAgICBsZWZ0ID0gYXNyOworCisJICAvKiBJZiB0aGUgbmV4dCByYW5nZSBpbiB0aGUgbGlzdCBoYXMgYSBoaWdoZXIgZW5kCisJICAgICBhZGRyZXNzIHRoYW4gdGhlIG5ldyBvbmUsIGluc2VydCB0aGUgbmV3IG9uZSBoZXJlLiAgKi8KKwkgIGlmIChhc3ItPmVuZCA+IGNhbGxlci0+ZW5kKQorCSAgICB7CisJICAgICAgcmlnaHQgPSBhc3I7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGlmIChhc3ItPnN0YXJ0ID49IGNhbGxlci0+c3RhcnQpCisJICAgIHsKKwkgICAgICAvKiBUaGUgbmV3IHJhbmdlIGNvbXBsZXRlbHkgcmVwbGFjZXMgYW4gb2xkCisJICAgICAgICAgb25lIChUaGlzIG1heSBoYXBwZW4gc2V2ZXJhbCB0aW1lcykuICAqLworCSAgICAgIGlmIChhZGRlZF9wKQorCQl7CisJCSAgZGVsZXRlX3JhbmdlIChiZWZvcmUpOworCQkgIGNvbnRpbnVlOworCQl9CisKKwkgICAgICAvKiBSZXBsYWNlIHRoZSBvbGQgcmFuZ2Ugd2l0aCB0aGUgbmV3IG9uZS4gICovCisJICAgICAgYXNyLT5zdGFydCA9IGNhbGxlci0+c3RhcnQ7CisJICAgICAgYXNyLT5lbmQgPSBjYWxsZXItPmVuZDsKKwkgICAgICBjYWxsZXIgPSBhc3I7CisJICAgICAgYWRkZWRfcCA9IDE7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIEdvIG9uIHRvIG5leHQgcmFuZ2UuICAqLworICAgIG5leHRfcmFuZ2U6CisgICAgICBiZWZvcmUgPSAmYXNyLT5uZXh0OworICAgIH0KKworICBpZiAoIWFkZGVkX3ApCisgICAgeworICAgICAgaWYgKGRlbGV0ZV9wKQorCWdvdG8gb3V0OworICAgICAgbmV3X2Fzci0+c3RhcnQgPSBjYWxsZXItPnN0YXJ0OworICAgICAgbmV3X2Fzci0+ZW5kID0gY2FsbGVyLT5lbmQ7CisgICAgICBpbnNlcnRfcmFuZ2UgKGJlZm9yZSwgbmV3X2Fzcik7CisgICAgICBuZXdfYXNyID0gTlVMTDsKKyAgICB9CisgIGlmIChyaWdodCkKKyAgICB7CisgICAgICBpZiAobGVmdCA9PSByaWdodCkKKwl7CisJICAvKiBUaGUgbmV3IHJhbmdlIGJyZWFrcyB0aGUgb2xkIG9uZSBpbiB0d28gcGllY2VzLAorCSAgICAgc28gd2UgaGF2ZSB0byB1c2UgdGhlIHNlY29uZCBuZXcgcmFuZ2UuICAqLworCSAgbmV3X2FzcjItPnN0YXJ0ID0gcmlnaHQtPnN0YXJ0OworCSAgbmV3X2FzcjItPmVuZCA9IHJpZ2h0LT5lbmQ7CisJICBsZWZ0ID0gbmV3X2FzcjI7CisJICBpbnNlcnRfcmFuZ2UgKGJlZm9yZSwgbGVmdCk7CisJICBuZXdfYXNyMiA9IE5VTEw7CisJfQorICAgICAgcmlnaHQtPnN0YXJ0ID0gY2FsbGVyLT5lbmQgKyAxOworICAgIH0KKyAgaWYgKGxlZnQpCisgICAgeworICAgICAgbGVmdC0+ZW5kID0gY2FsbGVyLT5zdGFydCAtIDE7CisgICAgfQorCisgb3V0OgorICBpZiAobmV3X2FzcikKKyAgICBmcmVlKG5ld19hc3IpOworICBpZiAobmV3X2FzcjIpCisgICAgZnJlZShuZXdfYXNyMik7Cit9CisKKy8qIEZyZWUgVCBhbmQgYWxsIHN1YnRyZWVzLiAgKi8KKworc3RhdGljIHZvaWQKK2ZyZWVfc2VhcmNoX3RyZWUgKEFERFJfUkFOR0VfVFJFRSAqdCkKK3sKKyAgaWYgKHQgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlX3NlYXJjaF90cmVlICh0LT5sb3dlcik7CisgICAgICBmcmVlX3NlYXJjaF90cmVlICh0LT5oaWdoZXIpOworICAgICAgZnJlZSAodCk7CisgICAgfQorfQorCisvKiBTdWJyb3V0aW5lIG9mIGJ1aWxkX3NlYXJjaF90cmVlIHRvIHJlY3Vyc2l2ZWx5IGJ1aWxkIGEgYmFsYW5jZWQgdHJlZS4KKyAgID8/PyBJdCdzIG5vdCBhbiBvcHRpbXVtIHRyZWUgdGhvdWdoLiAgKi8KKworc3RhdGljIEFERFJfUkFOR0VfVFJFRSAqCitidWlsZF90cmVlXzEgKEFERFJfU1VCUkFOR0UgKiphc3J0YWIsIHVuc2lnbmVkIGludCBuKQoreworICB1bnNpZ25lZCBpbnQgbWlkID0gbiAvIDI7CisgIEFERFJfUkFOR0VfVFJFRSAqdDsKKworICBpZiAobiA9PSAwKQorICAgIHJldHVybiBOVUxMOworICB0ID0gKEFERFJfUkFOR0VfVFJFRSAqKSB4bWFsbG9jIChzaXplb2YgKEFERFJfUkFOR0VfVFJFRSkpOworICB0LT5zdGFydCA9IGFzcnRhYlttaWRdLT5zdGFydDsKKyAgdC0+ZW5kID0gYXNydGFiW21pZF0tPmVuZDsKKyAgaWYgKG1pZCAhPSAwKQorICAgIHQtPmxvd2VyID0gYnVpbGRfdHJlZV8xIChhc3J0YWIsIG1pZCk7CisgIGVsc2UKKyAgICB0LT5sb3dlciA9IE5VTEw7CisgIGlmIChuID4gbWlkICsgMSkKKyAgICB0LT5oaWdoZXIgPSBidWlsZF90cmVlXzEgKGFzcnRhYiArIG1pZCArIDEsIG4gLSBtaWQgLSAxKTsKKyAgZWxzZQorICAgIHQtPmhpZ2hlciA9IE5VTEw7CisgIHJldHVybiB0OworfQorCisvKiBCdWlsZCBhIHNlYXJjaCB0cmVlIGZvciBhZGRyZXNzIHJhbmdlIEFSLiAgKi8KKworc3RhdGljIHZvaWQKK2J1aWxkX3NlYXJjaF90cmVlIChBRERSX1JBTkdFICphcikKK3sKKyAgLyogPz8/IFNpbXBsZSB2ZXJzaW9uIGZvciBub3cuICAqLworICBBRERSX1NVQlJBTkdFICphc3IsKiphc3J0YWI7CisgIHVuc2lnbmVkIGludCBpLCBuOworCisgIGZvciAobiA9IDAsIGFzciA9IGFyLT5yYW5nZXM7IGFzciAhPSBOVUxMOyArK24sIGFzciA9IGFzci0+bmV4dCkKKyAgICBjb250aW51ZTsKKyAgYXNydGFiID0gKEFERFJfU1VCUkFOR0UgKiopIHhtYWxsb2MgKG4gKiBzaXplb2YgKEFERFJfU1VCUkFOR0UgKikpOworICBmb3IgKGkgPSAwLCBhc3IgPSBhci0+cmFuZ2VzOyBpIDwgbjsgKytpLCBhc3IgPSBhc3ItPm5leHQpCisgICAgYXNydGFiW2ldID0gYXNyOworICBhci0+cmFuZ2VfdHJlZSA9IGJ1aWxkX3RyZWVfMSAoYXNydGFiLCBuKTsKKyAgZnJlZSAoYXNydGFiKTsKK30KKwordm9pZAorc2ltX2FkZHJfcmFuZ2VfYWRkIChBRERSX1JBTkdFICphciwgYWRkcmVzc193b3JkIHN0YXJ0LCBhZGRyZXNzX3dvcmQgZW5kKQoreworICBmcm9iX3JhbmdlIChhciwgc3RhcnQsIGVuZCwgMCk7CisKKyAgLyogUmVidWlsZCB0aGUgc2VhcmNoIHRyZWUuICAqLworICAvKiA/Pz8gSW5zdGVhZCBvZiByZWJ1aWxkaW5nIGl0IGhlcmUgaXQgY291bGQgYmUgZG9uZSBpbiBhIG1vZHVsZSByZXN1bWUKKyAgICAgaGFuZGxlciwgc2F5IGJ5IGZpcnN0IGNoZWNraW5nIGZvciBhIGBjaGFuZ2VkJyBmbGFnLCBhc3N1bWluZyBvZiBjb3Vyc2UKKyAgICAgdGhpcyB3b3VsZCBuZXZlciBiZSBkb25lIHdoaWxlIHRoZSBzaW11bGF0aW9uIGlzIHJ1bm5pbmcuICAqLworICBmcmVlX3NlYXJjaF90cmVlIChhci0+cmFuZ2VfdHJlZSk7CisgIGJ1aWxkX3NlYXJjaF90cmVlIChhcik7Cit9CisKK3ZvaWQKK3NpbV9hZGRyX3JhbmdlX2RlbGV0ZSAoQUREUl9SQU5HRSAqYXIsIGFkZHJlc3Nfd29yZCBzdGFydCwgYWRkcmVzc193b3JkIGVuZCkKK3sKKyAgZnJvYl9yYW5nZSAoYXIsIHN0YXJ0LCBlbmQsIDEpOworCisgIC8qIFJlYnVpbGQgdGhlIHNlYXJjaCB0cmVlLiAgKi8KKyAgLyogPz8/IEluc3RlYWQgb2YgcmVidWlsZGluZyBpdCBoZXJlIGl0IGNvdWxkIGJlIGRvbmUgaW4gYSBtb2R1bGUgcmVzdW1lCisgICAgIGhhbmRsZXIsIHNheSBieSBmaXJzdCBjaGVja2luZyBmb3IgYSBgY2hhbmdlZCcgZmxhZywgYXNzdW1pbmcgb2YgY291cnNlCisgICAgIHRoaXMgd291bGQgbmV2ZXIgYmUgZG9uZSB3aGlsZSB0aGUgc2ltdWxhdGlvbiBpcyBydW5uaW5nLiAgKi8KKyAgZnJlZV9zZWFyY2hfdHJlZSAoYXItPnJhbmdlX3RyZWUpOworICBidWlsZF9zZWFyY2hfdHJlZSAoYXIpOworfQorCisjZW5kaWYgLyogREVGSU5FX05PTl9JTkxJTkVfUCAqLworCisjaWYgREVGSU5FX0lOTElORV9QCisKK1NJTV9BUkFOR0VfSU5MSU5FIGludAorc2ltX2FkZHJfcmFuZ2VfaGl0X3AgKEFERFJfUkFOR0UgKmFyLCBhZGRyZXNzX3dvcmQgYWRkcikKK3sKKyAgQUREUl9SQU5HRV9UUkVFICp0ID0gYXItPnJhbmdlX3RyZWU7CisKKyAgd2hpbGUgKHQgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoYWRkciA8IHQtPnN0YXJ0KQorCXQgPSB0LT5sb3dlcjsKKyAgICAgIGVsc2UgaWYgKGFkZHIgPiB0LT5lbmQpCisJdCA9IHQtPmhpZ2hlcjsKKyAgICAgIGVsc2UKKwlyZXR1cm4gMTsKKyAgICB9CisgIHJldHVybiAwOworfQorCisjZW5kaWYgLyogREVGSU5FX0lOTElORV9QICovCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1hcmFuZ2UuaCBiL3NpbS9jb21tb24vc2ltLWFyYW5nZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYmEwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS1hcmFuZ2UuaApAQCAtMCwwICsxLDgzIEBACisvKiBBZGRyZXNzIHJhbmdlcy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBmaWxlIGlzIG1lYW50IHRvIGJlIGluY2x1ZGVkIGJ5IHNpbS1iYXNpY3MuaC4gICovCisKKyNpZm5kZWYgU0lNX0FSQU5HRV9ICisjZGVmaW5lIFNJTV9BUkFOR0VfSAorCisvKiBBIGxpc3Qgb2YgYWRkcmVzcyByYW5nZXMuICAqLworCit0eXBlZGVmIHN0cnVjdCBfYWRkcl9zdWJyYW5nZSB7CisgIHN0cnVjdCBfYWRkcl9zdWJyYW5nZSAqbmV4dDsKKworICAvKiBSYW5nZSBvZiBhZGRyZXNzZXMgdG8gYmUgdHJhY2VkIGlzIFtzdGFydCxlbmRdLiAgKi8KKyAgYWRkcmVzc193b3JkIHN0YXJ0LGVuZDsKK30gQUREUl9TVUJSQU5HRTsKKworLyogRm9yIHNwZWVkLCBzZWFyY2hpbmcgaXMgZG9uZSBvbiBhIHRyZWUuICAqLworCit0eXBlZGVmIHN0cnVjdCBfYWRkcl9yYW5nZV90cmVlIHsKKyAgc3RydWN0IF9hZGRyX3JhbmdlX3RyZWUgKmxvd2VyOworICBzdHJ1Y3QgX2FkZHJfcmFuZ2VfdHJlZSAqaGlnaGVyOworCisgIC8qIFJhbmdlIG9mIGFkZHJlc3NlcyB0byBiZSB0cmFjZWQgaXMgW3N0YXJ0LGVuZF0uICAqLworICBhZGRyZXNzX3dvcmQgc3RhcnQsZW5kOworfSBBRERSX1JBTkdFX1RSRUU7CisKKy8qIFRoZSB0b3AgbGV2ZWwgc3RydWN0LiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2FkZHJfcmFuZ2UgeworICBBRERSX1NVQlJBTkdFICpyYW5nZXM7CisjZGVmaW5lIEFERFJfUkFOR0VfUkFOR0VTKGFyKSAoKGFyKS0+cmFuZ2VzKQorICBBRERSX1JBTkdFX1RSRUUgKnJhbmdlX3RyZWU7CisjZGVmaW5lIEFERFJfUkFOR0VfVFJFRShhcikgKChhciktPnJhbmdlX3RyZWUpCit9IEFERFJfUkFOR0U7CisKKy8qIEFkZCBhZGRyZXNzIHJhbmdlIFNUQVJULEVORCB0byBBUi4gICovCitleHRlcm4gdm9pZCBzaW1fYWRkcl9yYW5nZV9hZGQgKEFERFJfUkFOR0UgKiAvKmFyKi8sCisJCQkJYWRkcmVzc193b3JkIC8qc3RhcnQqLywKKwkJCQlhZGRyZXNzX3dvcmQgLyplbmQqLyk7CisKKy8qIERlbGV0ZSBhZGRyZXNzIHJhbmdlIFNUQVJULEVORCBmcm9tIEFSLiAgKi8KK2V4dGVybiB2b2lkIHNpbV9hZGRyX3JhbmdlX2RlbGV0ZSAoQUREUl9SQU5HRSAqIC8qYXIqLywKKwkJCQkgICBhZGRyZXNzX3dvcmQgLypzdGFydCovLAorCQkJCSAgIGFkZHJlc3Nfd29yZCAvKmVuZCovKTsKKworLyogUmV0dXJuIG5vbi16ZXJvIGlmIEFERFIgaXMgaW4gcmFuZ2UgQVIsIHRyYXZlcnNpbmcgdGhlIGVudGlyZSB0cmVlLgorICAgSWYgbm8gcmFuZ2UgaXMgc3BlY2lmaWVkLCB0aGF0IGlzIGRlZmluZWQgdG8gbWVhbiAiZXZlcnl0aGluZyIuICAqLworZXh0ZXJuIElOTElORSBpbnQKK3NpbV9hZGRyX3JhbmdlX2hpdF9wIChBRERSX1JBTkdFICogLyphciovLCBhZGRyZXNzX3dvcmQgLyphZGRyKi8pOworI2RlZmluZSBBRERSX1JBTkdFX0hJVF9QKGFyLCBhZGRyKSBcCisgICgoYXIpLT5yYW5nZV90cmVlID09IE5VTEwgfHwgc2ltX2FkZHJfcmFuZ2VfaGl0X3AgKChhciksIChhZGRyKSkpCisKKyNpZmRlZiBIQVZFX0lOTElORQorI2lmZGVmIFNJTV9BUkFOR0VfQworI2RlZmluZSBTSU1fQVJBTkdFX0lOTElORSBJTkxJTkUKKyNlbHNlCisjZGVmaW5lIFNJTV9BUkFOR0VfSU5MSU5FIEVYVEVSTl9JTkxJTkUKKyNlbmRpZgorI2luY2x1ZGUgInNpbS1hcmFuZ2UuYyIKKyNlbHNlCisjZGVmaW5lIFNJTV9BUkFOR0VfSU5MSU5FCisjZW5kaWYKKyNkZWZpbmUgU0lNX0FSQU5HRV9DX0lOQ0xVREVECisKKyNlbmRpZiAvKiBTSU1fQVJBTkdFX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWFzc2VydC5oIGIvc2ltL2NvbW1vbi9zaW0tYXNzZXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3NDA4NAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vc2ltLWFzc2VydC5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBHREIuCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTcsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIF9TSU1fQVNTRVJUX0hfCisjZGVmaW5lIF9TSU1fQVNTRVJUX0hfCisKKyNkZWZpbmUgU0lNX0ZJTFRFUl9QQVRIKEZJTEUsIFBBVEgpIFwKK2RvIFwKKyAgeyBcCisgICAgLyogc3RyaXAgbGVhZGluZyBwYXRoICovIFwKKyAgICBjb25zdCBjaGFyICpwID0gKFBBVEgpOyBcCisgICAgKEZJTEUpID0gcDsgXAorICAgIHdoaWxlICgqcCAhPSAnXDAnICYmICpwICE9ICc6JykgXAorICAgICAgeyBcCisgICAgICAgIGlmICgqcCA9PSAnLycpIFwKKyAgICAgICAgICAoRklMRSkgPSBwICsgMTsgXAorICAgICAgICBwKys7IFwKKyAgICAgIH0gXAorICB9IFwKK3doaWxlICgwKQorCisvKiBUaGUgc3VidGxlIGRpZmZlcmVuY2UgYmV0d2VlbiBTSU1fQVNTRVJUIGFuZCBBU1NFUlQgaXMgdGhhdAorICAgU0lNX0FTU0VSVCBwYXNzZXMgYHNkJyB0byBzaW1faW9fZXJyb3IgZm9yIHRoZSBTSU1fREVTQywKKyAgIEFTU0VSVCBwYXNzZXMgTlVMTC4gICovCisKKyNpZiAhZGVmaW5lZCAoU0lNX0FTU0VSVCkKKyNpZiBkZWZpbmVkIChXSVRIX0FTU0VSVCkKKyNkZWZpbmUgU0lNX0FTU0VSVChFWFBSRVNTSU9OKSBcCitkbyBcCisgIHsgXAorICAgIGlmIChXSVRIX0FTU0VSVCkgXAorICAgICAgeyBcCisgICAgICAgIGlmICghKEVYUFJFU1NJT04pKSBcCisgICAgICAgICAgeyBcCisgICAgICAgICAgICAvKiByZXBvcnQgdGhlIGZhaWx1cmUgKi8gXAorICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZTsgXAorICAgICAgICAgICAgU0lNX0ZJTFRFUl9QQVRIKGZpbGUsIF9fRklMRV9fKTsgXAorICAgICAgICAgICAgc2ltX2lvX2Vycm9yIChzZCwgIiVzOiVkOiBhc3NlcnRpb24gZmFpbGVkIC0gJXMiLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsIF9fTElORV9fLCAjRVhQUkVTU0lPTik7IFwKKyAgICAgICAgICB9IFwKKyAgICAgIH0gXAorICB9IFwKK3doaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgU0lNX0FTU0VSVChFWFBSRVNTSU9OKSBkbyB7IC8qbm90aGluZyovOyB9IHdoaWxlICgwKQorI2VuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChBU1NFUlQpCisjaWYgZGVmaW5lZCAoV0lUSF9BU1NFUlQpCisjZGVmaW5lIEFTU0VSVChFWFBSRVNTSU9OKSBcCitkbyBcCisgIHsgXAorICAgIGlmIChXSVRIX0FTU0VSVCkgXAorICAgICAgeyBcCisgICAgICAgIGlmICghKEVYUFJFU1NJT04pKSBcCisgICAgICAgICAgeyBcCisgICAgICAgICAgICAvKiByZXBvcnQgdGhlIGZhaWx1cmUgKi8gXAorICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZTsgXAorICAgICAgICAgICAgU0lNX0ZJTFRFUl9QQVRIKGZpbGUsIF9fRklMRV9fKTsgXAorICAgICAgICAgICAgc2ltX2lvX2Vycm9yIChOVUxMLCAiJXM6JWQ6IGFzc2VydGlvbiBmYWlsZWQgLSAlcyIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwgX19MSU5FX18sICNFWFBSRVNTSU9OKTsgXAorICAgICAgICAgIH0gXAorICAgICAgfSBcCisgIH0gXAord2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBBU1NFUlQoRVhQUkVTU0lPTikgZG8geyAvKm5vdGhpbmcqLzsgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tYmFzZS5oIGIvc2ltL2NvbW1vbi9zaW0tYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZTAxYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS1iYXNlLmgKQEAgLTAsMCArMSwyNTIgQEAKKy8qIFNpbXVsYXRvciBwc2V1ZG8gYmFzZWNsYXNzLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LTE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKy8qIFNpbXVsYXRvciBzdGF0ZSBwc2V1ZG8gYmFzZWNsYXNzLgorCisgICBFYWNoIHNpbXVsYXRvciBpcyByZXF1aXJlZCB0byBoYXZlIHRoZSBmaWxlIGBgc2ltLW1haW4uaCcnLiAgVGhhdAorICAgZmlsZSBpbmNsdWRlcyBgYHNpbS1iYXNpY3MuaCcnLCBkZWZpbmVzIHRoZSBiYXNlIHR5cGUgYGBzaW1fY2lhJycKKyAgICh0aGUgZGF0YSB0eXBlIHRoYXQgY29udGFpbnMgY29tcGxldGUgY3VycmVudCBpbnN0cnVjdGlvbiBhZGRyZXNzCisgICBpbmZvcm1hdGlvbiksIGluY2x1ZGUgYGBzaW0tYmFzZS5oJyc6CisKKyAgICAgI2luY2x1ZGUgInNpbS1iYXNpY3MuaCIKKyAgICAgdHlwZWRlZiBhZGRyZXNzX3dvcmQgc2ltX2NpYTsKKyAgICAgLy0qIElmIGBzaW1fY2lhJyBpcyBub3QgYW4gaW50ZWdyYWwgdmFsdWUgKGUuZy4gYSBzdHJ1Y3QpLCBkZWZpbmUKKyAgICAgICAgIENJQV9BRERSIHRvIHJldHVybiB0aGUgaW50ZWdyYWwgdmFsdWUuICAqLS8KKyAgICAgLy0qICNkZWZpbmUgQ0lBX0FERFIoY2lhKSAoLi4uKSAqLS8KKyAgICAgI2luY2x1ZGUgInNpbS1iYXNlLmgiCisgICAKKyAgIGZpbmFsbHksIHR3byBkYXRhIHR5cGVzIGBzdHJ1Y3QgX3NpbV9jcHUnIGFuZCBgc3RydWN0IHNpbV9zdGF0ZScKKyAgIGFyZSBkZWZpbmVkOgorCisgICAgIHN0cnVjdCBfc2ltX2NwdSB7CisgICAgICAgIC4uLiBzaW11bGF0b3Igc3BlY2lmaWMgbWVtYmVycyAuLi4KKyAgICAgICAgc2ltX2NwdV9iYXNlIGJhc2U7CisgICAgIH07CisKKyAgICAgc3RydWN0IHNpbV9zdGF0ZSB7CisgICAgICAgc2ltX2NwdSBjcHVbTUFYX05SX1BST0NFU1NPUlNdOworICAgICAjaWYgKFdJVEhfU01QKQorICAgICAjZGVmaW5lIFNUQVRFX0NQVShzZCxuKSAoJihzZCktPmNwdVtuXSkKKyAgICAgI2Vsc2UKKyAgICAgI2RlZmluZSBTVEFURV9DUFUoc2QsbikgKCYoc2QpLT5jcHVbMF0pCisgICAgICNlbmRpZgorICAgICAgIC4uLiBzaW11bGF0b3Igc3BlY2lmaWMgbWVtYmVycyAuLi4KKyAgICAgICBzaW1fc3RhdGVfYmFzZSBiYXNlOworICAgICB9OworCisgICBOb3RlIHRoYXQgYGJhc2UnIGFwcGVhcnMgbGFzdC4gIFRoaXMgbWFrZXMgYGJhc2UubWFnaWMnIGFwcGVhciBsYXN0CisgICBpbiB0aGUgZW50aXJlIHN0cnVjdCBhbmQgaGVscHMgY2F0Y2ggbWlzY29tcGlsYXRpb24gZXJyb3JzLiAqLworCisKKyNpZm5kZWYgU0lNX0JBU0VfSAorI2RlZmluZSBTSU1fQkFTRV9ICisKKy8qIFByZS1kZWNsYXJlIGNlcnRhaW4gdHlwZXMuICovCisKKy8qIHR5cGVkZWYgPHRhcmdldC1kZXBlbmRhbnQ+IHNpbV9jaWE7ICovCisjaWZuZGVmIE5VTExfQ0lBCisjZGVmaW5lIE5VTExfQ0lBICgoc2ltX2NpYSkgMCkKKyNlbmRpZgorLyogUmV0dXJuIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIGFkZHJlc3MgYXMgYSBudW1iZXIuCisgICBTb21lIHRhcmdldHMgdHJlYXQgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gYWRkcmVzcyBhcyBhIHN0cnVjdAorICAgKGUuZy4gZm9yIGRlbGF5IHNsb3QgaGFuZGxpbmcpLiAgKi8KKyNpZm5kZWYgQ0lBX0FERFIKKyNkZWZpbmUgQ0lBX0FERFIoY2lhKSAoY2lhKQorI2VuZGlmCisjaWZuZGVmIElOVkFMSURfSU5TVFJVQ1RJT05fQUREUkVTUworI2RlZmluZSBJTlZBTElEX0lOU1RSVUNUSU9OX0FERFJFU1MgKChhZGRyZXNzX3dvcmQpMCAtIDEpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgX3NpbV9jcHUgc2ltX2NwdTsKKworI2luY2x1ZGUgInNpbS1tb2R1bGUuaCIKKworI2luY2x1ZGUgInNpbS10cmFjZS5oIgorI2luY2x1ZGUgInNpbS1jb3JlLmgiCisjaW5jbHVkZSAic2ltLWV2ZW50cy5oIgorI2luY2x1ZGUgInNpbS1wcm9maWxlLmgiCisjaWZkZWYgU0lNX0hBVkVfTU9ERUwKKyNpbmNsdWRlICJzaW0tbW9kZWwuaCIKKyNlbmRpZgorI2luY2x1ZGUgInNpbS1pby5oIgorI2luY2x1ZGUgInNpbS1lbmdpbmUuaCIKKyNpbmNsdWRlICJzaW0td2F0Y2guaCIKKyNpbmNsdWRlICJzaW0tbWVtb3B0LmgiCisjaWZkZWYgU0lNX0hBVkVfQlJFQUtQT0lOVFMKKyNpbmNsdWRlICJzaW0tYnJlYWsuaCIKKyNlbmRpZgorI2luY2x1ZGUgInNpbS1jcHUuaCIKKworLyogR2xvYmFsIHBvaW50ZXIgdG8gY3VycmVudCBzdGF0ZSB3aGlsZSBzaW1fcmVzdW1lIGlzIHJ1bm5pbmcuCisgICBPbiBhIG1hY2hpbmUgd2l0aCBsb3RzIG9mIHJlZ2lzdGVycywgaXQgbWlnaHQgYmUgcG9zc2libGUgdG8gcmVzZXJ2ZQorICAgb25lIG9mIHRoZW0gZm9yIGN1cnJlbnRfc3RhdGUuICBIb3dldmVyIG9uIGEgbWFjaGluZSB3aXRoIGZldyByZWdpc3RlcnMKKyAgIGN1cnJlbnRfc3RhdGUgY2FuJ3QgcGVybWFuZW50bHkgbGl2ZSBpbiBvbmUgYW5kIGluZGlyZWN0aW5nIHRocm91Z2ggaXQKKyAgIHdpbGwgYmUgc2xvd2VyIFtpbiB3aGljaCBjYXNlIG9uZSBjYW4gaGF2ZSBzaW1fcmVzdW1lIHNldCBnbG9iYWxzIGZyb20KKyAgIGN1cnJlbnRfc3RhdGUgZm9yIGZhc3RlciBhY2Nlc3NdLgorICAgSWYgQ1VSUkVOVF9TVEFURV9SRUcgaXMgZGVmaW5lZCwgaXQgbWVhbnMgY3VycmVudF9zdGF0ZSBpcyBsaXZpbmcgaW4KKyAgIGEgZ2xvYmFsIHJlZ2lzdGVyLiAgKi8KKworCisjaWZkZWYgQ1VSUkVOVF9TVEFURV9SRUcKKy8qIEZJWE1FOiB3aXAgKi8KKyNlbHNlCitleHRlcm4gc3RydWN0IHNpbV9zdGF0ZSAqY3VycmVudF9zdGF0ZTsKKyNlbmRpZgorCisKKy8qIFRoZSBzaW11bGF0b3IgbWF5IHByb3ZpZGUgZGlmZmVyZW50IChhbmQgZmFzdGVyKSBkZWZpbml0aW9uLiAgKi8KKyNpZm5kZWYgQ1VSUkVOVF9TVEFURQorI2RlZmluZSBDVVJSRU5UX1NUQVRFIGN1cnJlbnRfc3RhdGUKKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IHsKKworICAvKiBTaW11bGF0b3IncyBhcmd2WzBdLiAgKi8KKyAgY29uc3QgY2hhciAqbXlfbmFtZTsKKyNkZWZpbmUgU1RBVEVfTVlfTkFNRShzZCkgKChzZCktPmJhc2UubXlfbmFtZSkKKworICAvKiBXaG8gb3BlbmVkIHRoZSBzaW11bGF0b3IuICAqLworICBTSU1fT1BFTl9LSU5EIG9wZW5fa2luZDsKKyNkZWZpbmUgU1RBVEVfT1BFTl9LSU5EKHNkKSAoKHNkKS0+YmFzZS5vcGVuX2tpbmQpCisKKyAgLyogVGhlIGhvc3QgY2FsbGJhY2tzLiAgKi8KKyAgc3RydWN0IGhvc3RfY2FsbGJhY2tfc3RydWN0ICpjYWxsYmFjazsKKyNkZWZpbmUgU1RBVEVfQ0FMTEJBQ0soc2QpICgoc2QpLT5iYXNlLmNhbGxiYWNrKQorCisgIC8qIFRoZSB0eXBlIG9mIHNpbXVsYXRpb24gZW52aXJvbm1lbnQgKHVzZXIvb3BlcmF0aW5nKS4gICovCisgIGVudW0gc2ltX2Vudmlyb25tZW50IGVudmlyb25tZW50OworI2RlZmluZSBTVEFURV9FTlZJUk9OTUVOVChzZCkgKChzZCktPmJhc2UuZW52aXJvbm1lbnQpCisKKyNpZiAwIC8qIEZJWE1FOiBOb3QgcmVhZHkgeWV0LiAgKi8KKyAgLyogU3R1ZmYgZGVmaW5lZCBpbiBzaW0tY29uZmlnLmguICAqLworICBzdHJ1Y3Qgc2ltX2NvbmZpZyBjb25maWc7CisjZGVmaW5lIFNUQVRFX0NPTkZJRyhzZCkgKChzZCktPmJhc2UuY29uZmlnKQorI2VuZGlmCisKKyAgLyogTGlzdCBvZiBpbnN0YWxsZWQgbW9kdWxlIGBpbml0JyBoYW5kbGVycy4gICovCisgIHN0cnVjdCBtb2R1bGVfbGlzdCAqbW9kdWxlczsKKyNkZWZpbmUgU1RBVEVfTU9EVUxFUyhzZCkgKChzZCktPmJhc2UubW9kdWxlcykKKworICAvKiBTdXBwb3J0ZWQgb3B0aW9ucy4gICovCisgIHN0cnVjdCBvcHRpb25fbGlzdCAqb3B0aW9uczsKKyNkZWZpbmUgU1RBVEVfT1BUSU9OUyhzZCkgKChzZCktPmJhc2Uub3B0aW9ucykKKworICAvKiBOb24temVybyBpZiAtdiBzcGVjaWZpZWQuICAqLworICBpbnQgdmVyYm9zZV9wOworI2RlZmluZSBTVEFURV9WRVJCT1NFX1Aoc2QpICgoc2QpLT5iYXNlLnZlcmJvc2VfcCkKKworICAvKiBOb24gY3B1LXNwZWNpZmljIHRyYWNlIGRhdGEuICBTZWUgc2ltLXRyYWNlLmguICAqLworICBUUkFDRV9EQVRBIHRyYWNlX2RhdGE7CisjZGVmaW5lIFNUQVRFX1RSQUNFX0RBVEEoc2QpICgmIChzZCktPmJhc2UudHJhY2VfZGF0YSkKKworICAvKiBJZiBub24gTlVMTCwgdGhlIEJGRCBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgKi8KKyAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmFyY2hpdGVjdHVyZTsKKyNkZWZpbmUgU1RBVEVfQVJDSElURUNUVVJFKHNkKSAoKHNkKS0+YmFzZS5hcmNoaXRlY3R1cmUpCisKKyAgLyogSWYgbm9uIE5VTEwsIHRoZSBiZmQgdGFyZ2V0IHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lICovCisgIGNvbnN0IGNoYXIgKnRhcmdldDsKKyNkZWZpbmUgU1RBVEVfVEFSR0VUKHNkKSAoKHNkKS0+YmFzZS50YXJnZXQpCisKKyAgLyogSW4gc3RhbmRhbG9uZSBzaW11bGF0b3IsIHRoaXMgaXMgdGhlIHByb2dyYW0ncyBhcmd1bWVudHMgcGFzc2VkCisgICAgIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLworICBjaGFyICoqcHJvZ19hcmd2OworI2RlZmluZSBTVEFURV9QUk9HX0FSR1Yoc2QpICgoc2QpLT5iYXNlLnByb2dfYXJndikKKworICAvKiBUaGUgcHJvZ3JhbSdzIGJmZC4gICovCisgIHN0cnVjdCBfYmZkICpwcm9nX2JmZDsKKyNkZWZpbmUgU1RBVEVfUFJPR19CRkQoc2QpICgoc2QpLT5iYXNlLnByb2dfYmZkKQorCisgIC8qIFN5bWJvbCB0YWJsZSBmb3IgcHJvZ19iZmQgKi8KKyAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKnByb2dfc3ltczsKKyNkZWZpbmUgU1RBVEVfUFJPR19TWU1TKHNkKSAoKHNkKS0+YmFzZS5wcm9nX3N5bXMpCisKKyAgLyogVGhlIHByb2dyYW0ncyB0ZXh0IHNlY3Rpb24uICAqLworICBzdHJ1Y3Qgc2VjICp0ZXh0X3NlY3Rpb247CisgIC8qIFN0YXJ0aW5nIGFuZCBlbmRpbmcgdGV4dCBzZWN0aW9uIGFkZHJlc3NlcyBmcm9tIHRoZSBiZmQuICAqLworICBTSU1fQUREUiB0ZXh0X3N0YXJ0LCB0ZXh0X2VuZDsKKyNkZWZpbmUgU1RBVEVfVEVYVF9TRUNUSU9OKHNkKSAoKHNkKS0+YmFzZS50ZXh0X3NlY3Rpb24pCisjZGVmaW5lIFNUQVRFX1RFWFRfU1RBUlQoc2QpICgoc2QpLT5iYXNlLnRleHRfc3RhcnQpCisjZGVmaW5lIFNUQVRFX1RFWFRfRU5EKHNkKSAoKHNkKS0+YmFzZS50ZXh0X2VuZCkKKworICAvKiBTdGFydCBhZGRyZXNzLCBzZXQgd2hlbiB0aGUgcHJvZ3JhbSBpcyBsb2FkZWQgZnJvbSB0aGUgYmZkLiAgKi8KKyAgU0lNX0FERFIgc3RhcnRfYWRkcjsKKyNkZWZpbmUgU1RBVEVfU1RBUlRfQUREUihzZCkgKChzZCktPmJhc2Uuc3RhcnRfYWRkcikKKworICAvKiBTaXplIG9mIHRoZSBzaW11bGF0b3IncyBjYWNoZSwgaWYgYW55LgorICAgICBUaGlzIGlzIG5vdCB0aGUgdGFyZ2V0J3MgY2FjaGUuICBJdCBpcyB0aGUgY2FjaGUgdGhlIHNpbXVsYXRvciB1c2VzCisgICAgIHRvIHByb2Nlc3MgaW5zdHJ1Y3Rpb25zLiAgKi8KKyAgdW5zaWduZWQgaW50IHNjYWNoZV9zaXplOworI2RlZmluZSBTVEFURV9TQ0FDSEVfU0laRShzZCkgKChzZCktPmJhc2Uuc2NhY2hlX3NpemUpCisKKyAgLyogRklYTUU6IE1vdmUgdG8gdG9wIGxldmVsIHNpbV9zdGF0ZSBzdHJ1Y3QgKGFzIHNvbWUgc3RydWN0KT8gICovCisjaWZkZWYgU0lNX0hBVkVfRkxBVE1FTQorICB1bnNpZ25lZCBpbnQgbWVtX3NpemU7CisjZGVmaW5lIFNUQVRFX01FTV9TSVpFKHNkKSAoKHNkKS0+YmFzZS5tZW1fc2l6ZSkKKyAgdW5zaWduZWQgaW50IG1lbV9iYXNlOworI2RlZmluZSBTVEFURV9NRU1fQkFTRShzZCkgKChzZCktPmJhc2UubWVtX2Jhc2UpCisgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKKyNkZWZpbmUgU1RBVEVfTUVNT1JZKHNkKSAoKHNkKS0+YmFzZS5tZW1vcnkpCisjZW5kaWYKKworICAvKiBjb3JlIG1lbW9yeSBidXMgKi8KKyNkZWZpbmUgU1RBVEVfQ09SRShzZCkgKCYoc2QpLT5iYXNlLmNvcmUpCisgIHNpbV9jb3JlIGNvcmU7CisKKyAgLyogUmVjb3JkIG9mIG1lbW9yeSBzZWN0aW9ucyBhZGRlZCB2aWEgdGhlIG1lbW9yeS1vcHRpb25zIGludGVyZmFjZS4gICovCisjZGVmaW5lIFNUQVRFX01FTU9QVChzZCkgKChzZCktPmJhc2UubWVtb3B0KQorICBzaW1fbWVtb3B0ICptZW1vcHQ7CisKKyAgLyogZXZlbnQgaGFuZGxlciAqLworI2RlZmluZSBTVEFURV9FVkVOVFMoc2QpICgmKHNkKS0+YmFzZS5ldmVudHMpCisgIHNpbV9ldmVudHMgZXZlbnRzOworCisgIC8qIGdlbmVyaWMgaGFsdC9yZXN1bWUgZW5naW5lICovCisgIHNpbV9lbmdpbmUgZW5naW5lOworI2RlZmluZSBTVEFURV9FTkdJTkUoc2QpICgmKHNkKS0+YmFzZS5lbmdpbmUpCisKKyAgLyogZ2VuZXJpYyB3YXRjaHBvaW50IHN1cHBvcnQgKi8KKyAgc2ltX3dhdGNocG9pbnRzIHdhdGNocG9pbnRzOworI2RlZmluZSBTVEFURV9XQVRDSFBPSU5UUyhzZCkgKCYoc2QpLT5iYXNlLndhdGNocG9pbnRzKQorCisgIC8qIFBvaW50ZXIgdG8gbGlzdCBvZiBicmVha3BvaW50cyAqLworICBzdHJ1Y3Qgc2ltX2JyZWFrcG9pbnQgKmJyZWFrcG9pbnRzOworI2RlZmluZSBTVEFURV9CUkVBS1BPSU5UUyhzZCkgKChzZCktPmJhc2UuYnJlYWtwb2ludHMpCisKKyNpZiBXSVRIX0hXCisgIHN0cnVjdCBzaW1faHcgKmh3OworI2RlZmluZSBTVEFURV9IVyhzZCkgKChzZCktPmJhc2UuaHcpCisjZW5kaWYKKworCisgIC8qIE1hcmtlciBmb3IgdGhvc2Ugd2FudGluZyB0byBkbyBzYW5pdHkgY2hlY2tzLgorICAgICBUaGlzIHNob3VsZCByZW1haW4gdGhlIGxhc3QgbWVtYmVyIG9mIHRoaXMgc3RydWN0IHRvIGhlbHAgY2F0Y2gKKyAgICAgbWlzY29tcGlsYXRpb24gZXJyb3JzLiAgKi8KKyAgaW50IG1hZ2ljOworI2RlZmluZSBTSU1fTUFHSUNfTlVNQkVSIDB4NDI0MgorI2RlZmluZSBTVEFURV9NQUdJQyhzZCkgKChzZCktPmJhc2UubWFnaWMpCit9IHNpbV9zdGF0ZV9iYXNlOworCisvKiBGdW5jdGlvbnMgZm9yIGFsbG9jYXRpbmcvZnJlZWluZyBhIHNpbV9zdGF0ZS4gICovCitTSU1fREVTQyBzaW1fc3RhdGVfYWxsb2MgUEFSQU1TICgoU0lNX09QRU5fS0lORCBraW5kLCBob3N0X2NhbGxiYWNrICpjYWxsYmFjaykpOwordm9pZCBzaW1fc3RhdGVfZnJlZSBQQVJBTVMgKChTSU1fREVTQykpOworCisjZW5kaWYgLyogU0lNX0JBU0VfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tYmFzaWNzLmggYi9zaW0vY29tbW9uL3NpbS1iYXNpY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzM0YjIxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tYmFzaWNzLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisgICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfU0lNX0JBU0lDU19IXworI2RlZmluZSBfU0lNX0JBU0lDU19IXworCisKKy8qIEJhc2ljIGNvbmZpZ3VyYXRpb24gKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisvKiBCYXNpYyBob3N0IGRlcGVuZGFudCBtZXNzIC0gaG9wZWZ1bGx5IDxzdGRpby5oPiArIDxzdGRhcmcuaD4gd2lsbAorICAgYnJpbmcgcG90ZW50aWFsIGNvbmZsaWN0cyBvdXQgaW4gdGhlIG9wZW4gKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisKKyNpZmRlZiBfX0NZR1dJTjMyX18KK2V4dGVybiBpbnQgdmFzcHJpbnRmIChjaGFyICoqcmVzdWx0LCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncyk7CitleHRlcm4gaW50IGFzcHJpbnRmIChjaGFyICoqcmVzdWx0LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CisjZW5kaWYKKworCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAwCisjZW5kaWYKKworCisJCisvKiBTb21lIHZlcnNpb25zIG9mIEdDQyBpbmNsdWRlIGFuIGF0dHJpYnV0ZSBvcGVyYXRvciwgZGVmaW5lIGl0ICovCisKKyNpZiAhZGVmaW5lZCAoX19hdHRyaWJ1dGVfXykKKyNpZiAoIWRlZmluZWQoX19HTlVDX18pIHx8IChfX0dOVUNfXyA8IDIpIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgNikpCisjZGVmaW5lIF9fYXR0cmlidXRlX18oYXJnKQorI2VuZGlmCisjZW5kaWYKKworCisvKiBHbG9iYWwgdHlwZXMgdGhhdCBjb2RlIG1hbmlwdWxhdGVzICovCisKK3R5cGVkZWYgc3RydWN0IF9kZXZpY2UgZGV2aWNlOworc3RydWN0IGh3Oworc3RydWN0IF9zaW1fZnB1OworCisKKy8qIEdlbmVyaWMgYWRkcmVzcyBzcGFjZSAobWFwcykgYW5kIGFjY2VzcyBhdHRyaWJ1dGVzICovCisKK2VudW0geworICByZWFkX21hcCA9IDAsCisgIHdyaXRlX21hcCA9IDEsCisgIGV4ZWNfbWFwID0gMiwKKyAgaW9fbWFwID0gMywKKyAgbnJfbWFwcyA9IDMyLCAvKiBzb21ldGhpbmcgc21hbGwgKi8KK307CisKK2VudW0geworICBhY2Nlc3NfaW52YWxpZCA9IDAsCisgIGFjY2Vzc19yZWFkID0gMSA8PCByZWFkX21hcCwKKyAgYWNjZXNzX3dyaXRlID0gMSA8PCB3cml0ZV9tYXAsCisgIGFjY2Vzc19leGVjID0gMSA8PCBleGVjX21hcCwKKyAgYWNjZXNzX2lvID0gMSA8PCBpb19tYXAsCit9OworCitlbnVtIHsKKyAgYWNjZXNzX3JlYWRfd3JpdGUgPSAoYWNjZXNzX3JlYWQgfCBhY2Nlc3Nfd3JpdGUpLAorICBhY2Nlc3NfcmVhZF9leGVjID0gKGFjY2Vzc19yZWFkIHwgYWNjZXNzX2V4ZWMpLAorICBhY2Nlc3Nfd3JpdGVfZXhlYyA9IChhY2Nlc3Nfd3JpdGUgfCBhY2Nlc3NfZXhlYyksCisgIGFjY2Vzc19yZWFkX3dyaXRlX2V4ZWMgPSAoYWNjZXNzX3JlYWQgfCBhY2Nlc3Nfd3JpdGUgfCBhY2Nlc3NfZXhlYyksCisgIGFjY2Vzc19yZWFkX2lvID0gKGFjY2Vzc19yZWFkIHwgYWNjZXNzX2lvKSwKKyAgYWNjZXNzX3dyaXRlX2lvID0gKGFjY2Vzc193cml0ZSB8IGFjY2Vzc19pbyksCisgIGFjY2Vzc19yZWFkX3dyaXRlX2lvID0gKGFjY2Vzc19yZWFkIHwgYWNjZXNzX3dyaXRlIHwgYWNjZXNzX2lvKSwKKyAgYWNjZXNzX2V4ZWNfaW8gPSAoYWNjZXNzX2V4ZWMgfCBhY2Nlc3NfaW8pLAorICBhY2Nlc3NfcmVhZF9leGVjX2lvID0gKGFjY2Vzc19yZWFkIHwgYWNjZXNzX2V4ZWMgfCBhY2Nlc3NfaW8pLAorICBhY2Nlc3Nfd3JpdGVfZXhlY19pbyA9IChhY2Nlc3Nfd3JpdGUgfCBhY2Nlc3NfZXhlYyB8IGFjY2Vzc19pbyksCisgIGFjY2Vzc19yZWFkX3dyaXRlX2V4ZWNfaW8gPSAoYWNjZXNzX3JlYWQgfCBhY2Nlc3Nfd3JpdGUgfCBhY2Nlc3NfZXhlYyB8IGFjY2Vzc19pbyksCit9OworCisKKy8qIGRpc3Bvc2l0aW9uIG9mIGFuIG9iamVjdCB3aGVuIHRoaW5ncyBhcmUgcmVzZXQgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgcGVybWVuYW50X29iamVjdCwKKyAgdGVtcG9yYXJ5X29iamVjdCwKK30gb2JqZWN0X2Rpc3Bvc2l0aW9uOworCisKKy8qIE1lbW9yeSB0cmFuc2ZlciB0eXBlcyAqLworCit0eXBlZGVmIGVudW0gX3RyYW5zZmVyX3R5cGUgeworICByZWFkX3RyYW5zZmVyLAorICB3cml0ZV90cmFuc2ZlciwKK30gdHJhbnNmZXJfdHlwZTsKKworCisvKiBkaXJlY3Rpb25zICovCisKK3R5cGVkZWYgZW51bSB7CisgIGJpZGlyZWN0X3BvcnQsCisgIGlucHV0X3BvcnQsCisgIG91dHB1dF9wb3J0LAorfSBwb3J0X2RpcmVjdGlvbjsKKworCisMCisvKiBCYXNpYyBkZWZpbml0aW9ucyAtIG9yZGVyZWQgc28gdGhhdCBub3RoaW5nIGNhbGxzIHdoYXQgY29tZXMgYWZ0ZXIgaXQuICAqLworCisvKiBGSVhNRTogY29uZGl0aW9uYWxpemluZyB0Y29uZmlnLmggb24gSEFWRV9DT05GSUdfSCBzZWVtcyB3cm9uZy4gICovCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgInRjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIKKworI2luY2x1ZGUgInNpbS1jb25maWcuaCIKKworI2luY2x1ZGUgInNpbS1pbmxpbmUuaCIKKworI2luY2x1ZGUgInNpbS10eXBlcy5oIgorI2luY2x1ZGUgInNpbS1iaXRzLmgiCisjaW5jbHVkZSAic2ltLWVuZGlhbi5oIgorI2luY2x1ZGUgInNpbS1zaWduYWwuaCIKKyNpbmNsdWRlICJzaW0tYXJhbmdlLmgiCisKKyNpbmNsdWRlICJzaW0tdXRpbHMuaCIKKworLyogTm90ZTogT25seSB0aGUgc2ltcGxlciBpbnRlcmZhY2VzIGFyZSBkZWZpbmVkIGhlcmUuICBNb3JlIGhlYXZ5CisgICB3ZWlnaHQgb2JqZWN0cywgc3VjaCBhcyBjb3JlIGFuZCBldmVudHMsIGFyZSBkZWZpbmVkIGluIHRoZSBtb3JlCisgICBzZXJpb3VzIHNpbS1iYXNlLmggaGVhZGVyLiAqLworCisjZW5kaWYgLyogX1NJTV9CQVNJQ1NfSF8gKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWJpdHMuYyBiL3NpbS9jb21tb24vc2ltLWJpdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2ZiNzNiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tYml0cy5jCkBAIC0wLDAgKzEsMjA4IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIF9TSU1fQklUU19DXworI2RlZmluZSBfU0lNX0JJVFNfQ18KKworI2luY2x1ZGUgInNpbS1iYXNpY3MuaCIKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisjaW5jbHVkZSAic2ltLWlvLmgiCisKKworSU5MSU5FX1NJTV9CSVRTXAorKHVuc2lnbmVkX3dvcmQpCitMU01BU0tFRCAodW5zaWduZWRfd29yZCB2YWwsCisJICBpbnQgc3RhcnQsCisJICBpbnQgc3RvcCkKK3sKKyAgLyogTk9URSAtIHN0YXJ0LCBzdG9wIGNhbiB3cmFwICovCisgIHZhbCAmPSBMU01BU0sgKHN0YXJ0LCBzdG9wKTsKKyAgcmV0dXJuIHZhbDsKK30KKworCitJTkxJTkVfU0lNX0JJVFNcCisodW5zaWduZWRfd29yZCkKK01TTUFTS0VEICh1bnNpZ25lZF93b3JkIHZhbCwKKwkgIGludCBzdGFydCwKKwkgIGludCBzdG9wKQoreworICAvKiBOT1RFIC0gc3RhcnQsIHN0b3AgY2FuIHdyYXAgKi8KKyAgdmFsICY9IE1TTUFTSyAoc3RhcnQsIHN0b3ApOworICByZXR1cm4gdmFsOworfQorCisKK0lOTElORV9TSU1fQklUU1wKKyh1bnNpZ25lZF93b3JkKQorTFNFWFRSQUNURUQgKHVuc2lnbmVkX3dvcmQgdmFsLAorCSAgICAgaW50IHN0YXJ0LAorCSAgICAgaW50IHN0b3ApCit7CisgIEFTU0VSVCAoc3RhcnQgPj0gc3RvcCk7CisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyAgcmV0dXJuIExTRVhUUkFDVEVENjQgKHZhbCwgc3RhcnQsIHN0b3ApOworI2VuZGlmCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKKyAgaWYgKHN0b3AgPj0gMzIpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoc3RhcnQgPCAzMikKKwl2YWwgJj0gTFNNQVNLIChzdGFydCwgMCk7CisgICAgICB2YWwgPj49IHN0b3A7CisgICAgICByZXR1cm4gdmFsOworICAgIH0KKyNlbmRpZgorfQorCisKK0lOTElORV9TSU1fQklUU1wKKyh1bnNpZ25lZF93b3JkKQorTVNFWFRSQUNURUQgKHVuc2lnbmVkX3dvcmQgdmFsLAorCSAgICAgaW50IHN0YXJ0LAorCSAgICAgaW50IHN0b3ApCit7CisgIEFTU0VSVCAoc3RhcnQgPD0gc3RvcCk7CisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyAgcmV0dXJuIE1TRVhUUkFDVEVENjQgKHZhbCwgc3RhcnQsIHN0b3ApOworI2VuZGlmCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKKyAgaWYgKHN0b3AgPCAzMikKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChzdGFydCA+PSAzMikKKwl2YWwgJj0gTVNNQVNLIChzdGFydCwgNjQgLSAxKTsKKyAgICAgIHZhbCA+Pj0gKDY0IC0gc3RvcCAtIDEpOworICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisjZW5kaWYKK30KKworCitJTkxJTkVfU0lNX0JJVFNcCisodW5zaWduZWRfd29yZCkKK0xTSU5TRVJURUQgKHVuc2lnbmVkX3dvcmQgdmFsLAorCSAgICBpbnQgc3RhcnQsCisJICAgIGludCBzdG9wKQoreworICBBU1NFUlQgKHN0YXJ0ID49IHN0b3ApOworI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCisgIHJldHVybiBMU0lOU0VSVEVENjQgKHZhbCwgc3RhcnQsIHN0b3ApOworI2VuZGlmCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKKyAgLyogQml0IG51bWJlcnMgYXJlIDYzLi4wLCBldmVuIGZvciAzMiBiaXQgdGFyZ2V0cy4KKyAgICAgT24gMzIgYml0IHRhcmdldHMgd2UgaWdub3JlIDYzLi4zMiAgKi8KKyAgaWYgKHN0b3AgPj0gMzIpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICB7CisgICAgICB2YWwgPDw9IHN0b3A7CisgICAgICB2YWwgJj0gTFNNQVNLIChzdGFydCwgc3RvcCk7CisgICAgICByZXR1cm4gdmFsOworICAgIH0KKyNlbmRpZgorfQorCitJTkxJTkVfU0lNX0JJVFNcCisodW5zaWduZWRfd29yZCkKK01TSU5TRVJURUQgKHVuc2lnbmVkX3dvcmQgdmFsLAorCSAgICBpbnQgc3RhcnQsCisJICAgIGludCBzdG9wKQoreworICBBU1NFUlQgKHN0YXJ0IDw9IHN0b3ApOworI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCisgIHJldHVybiBNU0lOU0VSVEVENjQgKHZhbCwgc3RhcnQsIHN0b3ApOworI2VuZGlmCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKKyAgLyogQml0IG51bWJlcnMgYXJlIDAuLjYzLCBldmVuIGZvciAzMiBiaXQgdGFyZ2V0cy4KKyAgICAgT24gMzIgYml0IHRhcmdldHMgd2UgaWdub3JlIDAuLjMxLiAgKi8KKyAgaWYgKHN0b3AgPCAzMikKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHsKKyAgICAgIHZhbCA8PD0gKCg2NCAtIDEpIC0gc3RvcCk7CisgICAgICB2YWwgJj0gTVNNQVNLIChzdGFydCwgc3RvcCk7CisgICAgICByZXR1cm4gdmFsOworICAgIH0KKyNlbmRpZgorfQorCisKKworSU5MSU5FX1NJTV9CSVRTXAorKHVuc2lnbmVkX3dvcmQpCitMU1NFWFQgKHNpZ25lZF93b3JkIHZhbCwKKwlpbnQgc2lnbl9iaXQpCit7CisgIEFTU0VSVCAoc2lnbl9iaXQgPCA2NCk7CisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyAgcmV0dXJuIExTU0VYVDY0ICh2YWwsIHNpZ25fYml0KTsKKyNlbmRpZgorI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCisgIGlmIChzaWduX2JpdCA+PSAzMikKKyAgICByZXR1cm4gdmFsOworICBlbHNlIHsKKyAgICB2YWwgPSBMU1NFWFQzMiAodmFsLCBzaWduX2JpdCk7CisgICAgcmV0dXJuIHZhbDsKKyAgfQorI2VuZGlmCit9CisKK0lOTElORV9TSU1fQklUU1wKKyh1bnNpZ25lZF93b3JkKQorTVNTRVhUIChzaWduZWRfd29yZCB2YWwsCisJaW50IHNpZ25fYml0KQoreworICBBU1NFUlQgKHNpZ25fYml0IDwgNjQpOworI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCisgIHJldHVybiBNU1NFWFQ2NCAodmFsLCBzaWduX2JpdCk7CisjZW5kaWYKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQorICBpZiAoc2lnbl9iaXQgPCAzMikKKyAgICByZXR1cm4gdmFsOworICBlbHNlIHsKKyAgICB2YWwgPSBNU1NFWFQzMiAodmFsLCBzaWduX2JpdCAtIDMyKTsKKyAgICByZXR1cm4gdmFsOworICB9CisjZW5kaWYKK30KKworCisKKyNkZWZpbmUgTiA4CisjaW5jbHVkZSAic2ltLW4tYml0cy5oIgorI3VuZGVmIE4KKworI2RlZmluZSBOIDE2CisjaW5jbHVkZSAic2ltLW4tYml0cy5oIgorI3VuZGVmIE4KKworI2RlZmluZSBOIDMyCisjaW5jbHVkZSAic2ltLW4tYml0cy5oIgorI3VuZGVmIE4KKworI2RlZmluZSBOIDY0CisjaW5jbHVkZSAic2ltLW4tYml0cy5oIgorI3VuZGVmIE4KKworI2VuZGlmIC8qIF9TSU1fQklUU19DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tYml0cy5oIGIvc2ltL2NvbW1vbi9zaW0tYml0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMTFiY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS1iaXRzLmgKQEAgLTAsMCArMSw1NjQgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisgICAgQ29weXJpZ2h0IChDKSAxOTk3LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfU0lNX0JJVFNfSF8KKyNkZWZpbmUgX1NJTV9CSVRTX0hfCisKKworLyogQml0IG1hbmlwdWxhdGlvbiByb3V0aW5lczoKKworICAgQml0IG51bWJlcmluZzogVGhlIGJpdHMgYXJlIG51bWJlcmVkIGFjY29yZGluZyB0byB0aGUgdGFyZ2V0IElTQSdzCisgICBjb252ZW50aW9uLiAgVGhhdCBiZWluZyBjb250cm9sbGVkIGJ5IFdJVEhfVEFSR0VUX1dPUkRfTVNCLiAgRm9yCisgICB0aGUgUG93ZXJQQyAoV0lUSF9UQVJHRVRfV09SRF9NU0IgPT0gMCkgdGhlIG51bWJlcmluZyBpcyAwLi4zMQorICAgd2hpbGUgZm9yIHRoZSBNSVBTIChXSVRIX1RBUkdFVF9XT1JEX01TQiA9PSAzMSkgaXQgaXMgMzEuLjAuCisKKyAgIFNpemUgY29udmVudGlvbjogRWFjaCBtYWNybyBpcyBpbiB0aHJlZSBmb3JtcyAtIDxNQUNSTz4zMiB3aGljaAorICAgb3BlcmF0ZXMgaW4gMzJiaXQgcXVhbnRpdHkgKGJpdHMgYXJlIG51bWJlcmVkIDAuLjMxKTsgPE1BQ1JPPjY0CisgICB3aGljaCBvcGVyYXRlcyB1c2luZyA2NGJpdCBxdWFudGl0ZXMgKGFuZCBiaXRzIGFyZSBudW1iZXJlZCAwLi42Myk7CisgICBhbmQgPE1BQ1JPPiB3aGljaCBvcGVyYXRlcyB1c2luZyB0aGUgYml0IHNpemUgb2YgdGhlIHRhcmdldAorICAgYXJjaGl0ZWN0dXJlIChiaXRzIGFyZSBzdGlsbCBudW1iZXJlZCAwLi42MyksIHdpdGggMzJiaXQKKyAgIGFyY2hpdGVjdHVyZXMgaWdub3JpbmcgdGhlIGZpcnN0IDMyYml0cyBsZWF2aW5nIGJpdCAzMiBhcyB0aGUgbW9zdAorICAgc2lnbmlmaWNhbnQuCisKKyAgIE5COiBVc2UgRVhUUkFDVEVELCBNU0VYVFJBQ1RFRCBhbmQgTFNFWFRSQUNURUQgYXMgYSBndWlkZWxpbmUgZm9yCisgICBuYW1pbmcuICBMU01BU0sgYW5kIExTTUFTS0VEIGFyZSB3cm9uZy4KKworICAgQklUKihQT1MpOiBgKicgYml0IGNvbnN0YW50IHdpdGgganVzdCAxIGJpdCBzZXQuCisKKyAgIExTQklUKihPRkZTRVQpOiBgKicgYml0IGNvbnN0YW50IHdpdGgganVzdCAxIGJpdCBzZXQgLSBMUyBiaXQgaXMKKyAgIHplcm8uCisKKyAgIE1TQklUKihPRkZTRVQpOiBgKicgYml0IGNvbnN0YW50IHdpdGgganVzdCAxIGJpdCBzZXQgLSBNUyBiaXQgaXMKKyAgIHplcm8uCisKKyAgIE1BU0sqKEZJUlNULCBMQVNUKTogYConIGJpdCBjb25zdGFudCB3aXRoIGJpdHMgW0ZJUlNUIC4uIExBU1RdCisgICBzZXQuIFRoZSA8TUFDUk8+IChubyBzaXplKSB2ZXJzaW9uIHBlcm1pdHMgRklSU1QgPj0gTEFTVCBhbmQKKyAgIGdlbmVyYXRlcyBhIHdyYXBwZWQgYml0IG1hc2sgdmlzIChbMC4uTEFTVF0gfCBbRklSU1QuLkxTQl0pLgorCisgICBMU01BU0sqKEZJUlNULCBMQVNUKTogTGlrZSBNQVNLIC0gTFMgYml0IGlzIHplcm8uCisKKyAgIE1TTUFTSyooRklSU1QsIExBU1QpOiBMaWtlIE1BU0sgLSBMUyBiaXQgaXMgemVyby4KKworICAgTUFTS0VEKihWQUxVRSwgRklSU1QsIExBU1QpOiBNYXNrcyBvdXQgYWxsIGJ1dCBiaXRzIFtGSVJTVAorICAgLi4gTEFTVF0uCisKKyAgIExTTUFTS0VEKihWQUxVRSwgRklSU1QsIExBU1QpOiBMaWtlIE1BU0tFRCAtIExTIGJpdCBpcyB6ZXJvLgorCisgICBNU01BU0tFRCooVkFMVUUsIEZJUlNULCBMQVNUKTogTGlrZSBNQVNLRUQgLSBNUyBiaXQgaXMgemVyby4KKworICAgRVhUUkFDVEVEKihWQUxVRSwgRklSU1QsIExBU1QpOiBNYXNrcyBvdXQgYml0cyBbRklSU1QgLi4gTEFTVF0gYnV0CisgICBhbHNvIHJpZ2h0IHNoaWZ0cyB0aGUgbWFza2VkIHZhbHVlIHNvIHRoYXQgYml0IExBU1QgYmVjb21lcyB0aGUKKyAgIGxlYXN0IHNpZ25pZmljYW50IChyaWdodCBtb3N0KS4KKworICAgTFNFWFRSQUNURUQqKFZBTFVFLCBGSVJTVCwgTEFTVCk6IFNhbWUgYXMgZXh0cmFjdGVkIC0gTFMgYml0IGlzCisgICB6ZXJvLgorCisgICBNU0VYVFJBQ1RFRCooVkFMVUUsIEZJUlNULCBMQVNUKTogU2FtZSBhcyBleHRyYWN0ZWQgLSBNUyBiaXQgaXMKKyAgIHplcm8uCisKKyAgIFNIVUZGTEVEKiooVkFMVUUsIE9MRCwgTkVXKTogTWFzayB0aGVuIG1vdmUgYSBzaW5nbGUgYml0IGZyb20gT0xECisgICBuZXcgTkVXLgorCisgICBNT1ZFRCoqKFZBTFVFLCBPTERfRklSU1QsIE9MRF9MQVNULCBORVdfRklSU1QsIE5FV19MQVNUKTogTW92ZXMKKyAgIHRoaW5ncyBhcm91bmQgc28gdGhhdCBiaXRzIE9MRF9GSVJTVC4uT0xEX0xBU1QgYXJlIG1hc2tlZCB0aGVuCisgICBtb3ZlZCB0byBORVdfRklSU1QuLk5FV19MQVNULgorCisgICBJTlNFUlRFRCooVkFMVUUsIEZJUlNULCBMQVNUKTogVGFrZXMgVkFMVUUgYW5kIGBpbnNlcnRzJyB0aGUgKExBU1QKKyAgIC0gRklSU1QgKyAxKSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGludG8gYml0IHBvc2l0aW9ucyBbIEZJUlNUCisgICAuLiBMQVNUIF0uICBUaGlzIGlzIGFsbW9zdCB0aGUgY29tcGxlbWVudCB0byBFWFRSQUNURUQuCisKKyAgIElFQV9NQVNLRUQoU0hPVUxEX01BU0ssIEFERFIpOiBDb252ZXJ0IHRoZSBhZGRyZXNzIHRvIHRoZSB0YXJnZXRzCisgICBuYXR1cmFsIHNpemUuICBJZiBpbiAzMmJpdCBtb2RlLCBkaXNjYXJkIHRoZSBoaWdoIDMyYml0cy4KKworICAgRVhURU5EKihWQUxVRSk6IENvbnZlcnQgdGhlIGAqJyBiaXQgdmFsdWUgdG8gdGhlIHRhcmdldHMgbmF0dXJhbAorICAgd29yZCBzaXplLiAgU2lnbiBleHRlbmQgdGhlIHZhbHVlIGlmIG5lZWRlZC4KKworICAgQUxJR05fKihWQUxVRSk6IFJvdW5kIHRoZSB2YWx1ZSB1cHdhcmRzIHNvIHRoYXQgaXQgaXMgYWxpZ25lZCB0byBhCisgICBgXyonIGJ5dGUgYm91bmRhcnkuCisKKyAgIEZMT09SXyooVkFMVUUpOiBUcnVuY2F0ZSB0aGUgdmFsdWUgc28gdGhhdCBpdCBpcyBhbGlnbmVkIHRvIGEgYF8qJworICAgYnl0ZSBib3VuZGFyeS4KKworICAgUk9UKihWQUxVRSwgTlJfQklUUyk6IFJldHVybiB0aGUgYConIGJpdCBWQUxVRSByb3RhdGVkIGJ5IE5SX0JJVFMKKyAgIHJpZ2h0IChwb3NpdGl2ZSkgb3IgbGVmdCAobmVnYXRpdmUpLgorCisgICBST1RMKihWQUxVRSwgTlJfQklUUyk6IFJldHVybiB0aGUgYConIGJpdCB2YWx1ZSByb3RhdGVkIGJ5IE5SX0JJVFMKKyAgIGxlZnQuICAwIDw9IE5SX0JJVFMgPD0gYConLgorCisgICBST1RSKihWQUxVRSwgTlJfQklUUyk6IFJldHVybiB0aGUgYConIGJpdCB2YWx1ZSByb3RhdGVkIGJ5IE5SX0JJVFMKKyAgIHJpZ2h0LiAgMCA8PSBOUl9CSVRTIDw9IE4uCisKKyAgIFNFWFQqKFZBTFVFLCBTSUdOX0JJVCk6IFRyZWF0IFNJR05fQklUIGFzIFZBTFVFcyBzaWduLCBleHRlbmQgaXQgdGkKKyAgIGAqJyBiaXRzLgorCisgICBOb3RlOiBPbmx5IHRoZSBCSVQqIGFuZCBNQVNLKiBtYWNyb3MgcmV0dXJuIGEgY29uc3RhbnQgdGhhdCBjYW4gYmUKKyAgIHVzZWQgaW4gdmFyaWFibGUgZGVjbGFyYXRpb25zLgorCisgICAqLworCisKKy8qIGNvbXB1dGUgdGhlIG51bWJlciBvZiBiaXRzIGJldHdlZW4gU1RBUlQgYW5kIFNUT1AgKi8KKworI2lmIChXSVRIX1RBUkdFVF9XT1JEX01TQiA9PSAwKQorI2RlZmluZSBfTUFLRV9XSURUSChTVEFSVCwgU1RPUCkgKFNUT1AgLSBTVEFSVCArIDEpCisjZWxzZQorI2RlZmluZSBfTUFLRV9XSURUSChTVEFSVCwgU1RPUCkgKFNUQVJUIC0gU1RPUCArIDEpCisjZW5kaWYKKworCisKKy8qIGNvbXB1dGUgdGhlIG51bWJlciBzaGlmdHMgcmVxdWlyZWQgdG8gbW92ZSBhIGJpdCBiZXR3ZWVuIExTQiAoTVNCKQorICAgYW5kIFBPUyAqLworCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfTVNCID09IDApCisjZGVmaW5lIF9MU0JfU0hJRlQoV0lEVEgsIFBPUykgKFdJRFRIIC0gMSAtIFBPUykKKyNlbHNlCisjZGVmaW5lIF9MU0JfU0hJRlQoV0lEVEgsIFBPUykgKFBPUykKKyNlbmRpZgorCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfTVNCID09IDApCisjZGVmaW5lIF9NU0JfU0hJRlQoV0lEVEgsIFBPUykgKFBPUykKKyNlbHNlCisjZGVmaW5lIF9NU0JfU0hJRlQoV0lEVEgsIFBPUykgKFdJRFRIIC0gMSAtIFBPUykKKyNlbmRpZgorCisKKy8qIGNvbXB1dGUgdGhlIGFic29sdXRlIGJpdCBwb3NpdGlvbiBnaXZlbiB0aGUgT0ZGU0VUIGZyb20gdGhlIE1TQihMU0IpCisgICBOQjogX01BS0VfeHh4X1BPUyAoV0lEVEgsIF9NQUtFX3h4eF9TSElGVCAoV0lEVEgsIFBPUykpID09IFBPUyAqLworCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfTVNCID09IDApCisjZGVmaW5lIF9NU0JfUE9TKFdJRFRILCBTSElGVCkgKFNISUZUKQorI2Vsc2UKKyNkZWZpbmUgX01TQl9QT1MoV0lEVEgsIFNISUZUKSAoV0lEVEggLSAxIC0gU0hJRlQpCisjZW5kaWYKKworI2lmIChXSVRIX1RBUkdFVF9XT1JEX01TQiA9PSAwKQorI2RlZmluZSBfTFNCX1BPUyhXSURUSCwgU0hJRlQpIChXSURUSCAtIDEgLSBTSElGVCkKKyNlbHNlCisjZGVmaW5lIF9MU0JfUE9TKFdJRFRILCBTSElGVCkgKFNISUZUKQorI2VuZGlmCisKKworLyogY29udmVydCBhIDY0IGJpdCBwb3NpdGlvbiBpbnRvIGEgY29ycmVzcG9uZGluZyAzMmJpdCBwb3NpdGlvbi4gTVNCCisgICBwb3MgaGFuZGxlcyB0aGUgcG9zaWJpbGl0eSB0aGF0IHRoZSBiaXQgbGllcyBiZXlvbmQgdGhlIDMyYml0CisgICBib3VuZGFyeSAqLworCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfTVNCID09IDApCisjZGVmaW5lIF9NU0JfMzIoU1RBUlQsIFNUT1ApIChTVEFSVCA8PSBTVE9QIFwKKwkJCSAgICAgID8gKFNUQVJUIDwgMzIgPyAwIDogU1RBUlQgLSAzMikgXAorCQkJICAgICAgOiAoU1RPUCA8IDMyID8gMCA6IFNUT1AgLSAzMikpCisjZWxzZQorI2RlZmluZSBfTVNCXzMyKFNUQVJULCBTVE9QKSAoU1RBUlQgPj0gU1RPUCBcCisJCQkgICAgICA/IChTVEFSVCA+PSAzMiA/IDMxIDogU1RBUlQpIFwKKwkJCSAgICAgIDogKFNUT1AgPj0gMzIgPyAzMSA6IFNUT1ApKQorI2VuZGlmCisKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9NU0IgPT0gMCkKKyNkZWZpbmUgX0xTQl8zMihTVEFSVCwgU1RPUCkgKFNUQVJUIDw9IFNUT1AgXAorCQkJICAgICAgPyAoU1RPUCA8IDMyID8gMCA6IFNUT1AgLSAzMikgXAorCQkJICAgICAgOiAoU1RBUlQgPCAzMiA/IDAgOiBTVEFSVCAtIDMyKSkKKyNlbHNlCisjZGVmaW5lIF9MU0JfMzIoU1RBUlQsIFNUT1ApIChTVEFSVCA+PSBTVE9QIFwKKwkJCSAgICAgID8gKFNUT1AgPj0gMzIgPyAzMSA6IFNUT1ApIFwKKwkJCSAgICAgIDogKFNUQVJUID49IDMyID8gMzEgOiBTVEFSVCkpCisjZW5kaWYKKworI2lmIChXSVRIX1RBUkdFVF9XT1JEX01TQiA9PSAwKQorI2RlZmluZSBfTVNCKFNUQVJULCBTVE9QKSAoU1RBUlQgPD0gU1RPUCA/IFNUQVJUIDogU1RPUCkKKyNlbHNlCisjZGVmaW5lIF9NU0IoU1RBUlQsIFNUT1ApIChTVEFSVCA+PSBTVE9QID8gU1RBUlQgOiBTVE9QKQorI2VuZGlmCisKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9NU0IgPT0gMCkKKyNkZWZpbmUgX0xTQihTVEFSVCwgU1RPUCkgKFNUQVJUIDw9IFNUT1AgPyBTVE9QIDogU1RBUlQpCisjZWxzZQorI2RlZmluZSBfTFNCKFNUQVJULCBTVE9QKSAoU1RBUlQgPj0gU1RPUCA/IFNUT1AgOiBTVEFSVCkKKyNlbmRpZgorCisKKy8qIExTL01TIEJpdCBvcGVyYXRpb25zICovCisKKyNkZWZpbmUgTFNCSVQ4KFBPUykgICgodW5zaWduZWQ4KSAxIDw8IChQT1MpKQorI2RlZmluZSBMU0JJVDE2KFBPUykgKCh1bnNpZ25lZDE2KTEgPDwgKFBPUykpCisjZGVmaW5lIExTQklUMzIoUE9TKSAoKHVuc2lnbmVkMzIpMSA8PCAoUE9TKSkKKyNkZWZpbmUgTFNCSVQ2NChQT1MpICgodW5zaWduZWQ2NCkxIDw8IChQT1MpKQorCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyNkZWZpbmUgTFNCSVQoUE9TKSBMU0JJVDY0IChQT1MpCisjZWxzZQorI2RlZmluZSBMU0JJVChQT1MpICgodW5zaWduZWQzMikoKFBPUykgPj0gMzIgXAorCQkgICAgICAgICAgICAgICAgID8gMCBcCisJCQkgICAgICAgICA6ICgxIDw8ICgoUE9TKSA+PSAzMiA/IDAgOiAoUE9TKSkpKSkKKyNlbmRpZgorCisKKyNkZWZpbmUgTVNCSVQ4KFBPUykgICgodW5zaWduZWQ4KSAxIDw8ICggOCAtIDEgLSAoUE9TKSkpCisjZGVmaW5lIE1TQklUMTYoUE9TKSAoKHVuc2lnbmVkMTYpMSA8PCAoMTYgLSAxIC0gKFBPUykpKQorI2RlZmluZSBNU0JJVDMyKFBPUykgKCh1bnNpZ25lZDMyKTEgPDwgKDMyIC0gMSAtIChQT1MpKSkKKyNkZWZpbmUgTVNCSVQ2NChQT1MpICgodW5zaWduZWQ2NCkxIDw8ICg2NCAtIDEgLSAoUE9TKSkpCisKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQorI2RlZmluZSBNU0JJVChQT1MpIE1TQklUNjQgKFBPUykKKyNlbHNlCisjZGVmaW5lIE1TQklUKFBPUykgKCh1bnNpZ25lZDMyKSgoUE9TKSA8IDMyIFwKKwkJICAgICAgICAgICAgICAgICA/IDAgXAorCQkgICAgICAgICAgICAgICAgIDogKDEgPDwgKChQT1MpIDwgMzIgPyAwIDogKDY0IC0gMSkgLSAoUE9TKSkpKSkKKyNlbmRpZgorCisKKy8qIEJpdCBvcGVyYXRpb25zICovCisKKyNkZWZpbmUgQklUNChQT1MpICAoMSA8PCBfTFNCX1NISUZUICg0LCAoUE9TKSkpCisjZGVmaW5lIEJJVDUoUE9TKSAgKDEgPDwgX0xTQl9TSElGVCAoNSwgKFBPUykpKQorI2RlZmluZSBCSVQxMChQT1MpICgxIDw8IF9MU0JfU0hJRlQgKDEwLCAoUE9TKSkpCisKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9NU0IgPT0gMCkKKyNkZWZpbmUgQklUOCAgTVNCSVQ4CisjZGVmaW5lIEJJVDE2IE1TQklUMTYKKyNkZWZpbmUgQklUMzIgTVNCSVQzMgorI2RlZmluZSBCSVQ2NCBNU0JJVDY0CisjZGVmaW5lIEJJVCAgIE1TQklUCisjZWxzZQorI2RlZmluZSBCSVQ4ICBMU0JJVDgKKyNkZWZpbmUgQklUMTYgTFNCSVQxNgorI2RlZmluZSBCSVQzMiBMU0JJVDMyCisjZGVmaW5lIEJJVDY0IExTQklUNjQKKyNkZWZpbmUgQklUICAgTFNCSVQKKyNlbmRpZgorCisKKworLyogbXVsdGkgYml0IG1hc2sgKi8KKworLyogMTExMTExIC0+IG1tbGwxMSAtPiBtbTExbGwgKi8KKyNkZWZpbmUgX01BU0tuKFdJRFRILCBTVEFSVCwgU1RPUCkgKCgodW5zaWduZWQjI1dJRFRIKSgtMSkgXAorCQkJCSAgICAgPj4gKF9NU0JfU0hJRlQgKFdJRFRILCBTVEFSVCkgXAorCQkJCQkgKyBfTFNCX1NISUZUIChXSURUSCwgU1RPUCkpKSBcCisJCQkJICAgIDw8IF9MU0JfU0hJRlQgKFdJRFRILCBTVE9QKSkKKworI2lmIChXSVRIX1RBUkdFVF9XT1JEX01TQiA9PSAwKQorI2RlZmluZSBfUE9TX0xFKFNUQVJULCBTVE9QKSAoU1RBUlQgPD0gU1RPUCkKKyNlbHNlCisjZGVmaW5lIF9QT1NfTEUoU1RBUlQsIFNUT1ApIChTVE9QIDw9IFNUQVJUKQorI2VuZGlmCisKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQorI2RlZmluZSBNQVNLKFNUQVJULCBTVE9QKSBcCisgICAgIChfUE9TX0xFICgoU1RBUlQpLCAoU1RPUCkpIFwKKyAgICAgID8gX01BU0tuKDY0LCBcCisJICAgICAgIF9NU0IgKChTVEFSVCksIChTVE9QKSksIFwKKwkgICAgICAgX0xTQiAoKFNUQVJUKSwgKFNUT1ApKSApIFwKKyAgICAgIDogKF9NQVNLbig2NCwgX01TQl9QT1MgKDY0LCAwKSwgKFNUT1ApKSBcCisJIHwgX01BU0tuKDY0LCAoU1RBUlQpLCBfTFNCX1BPUyAoNjQsIDApKSkpCisjZW5kaWYKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQorI2RlZmluZSBNQVNLKFNUQVJULCBTVE9QKSBcCisgICAgIChfUE9TX0xFICgoU1RBUlQpLCAoU1RPUCkpIFwKKyAgICAgID8gKF9QT1NfTEUgKChTVE9QKSwgX01TQl9QT1MgKDY0LCAzMSkpIFwKKwkgPyAwIFwKKwkgOiBfTUFTS24gKDMyLCBcCisJCSAgIF9NU0JfMzIgKChTVEFSVCksIChTVE9QKSksIFwKKwkJICAgX0xTQl8zMiAoKFNUQVJUKSwgKFNUT1ApKSkpIFwKKyAgICAgIDogKF9NQVNLbiAoMzIsIFwKKwkJIF9MU0JfMzIgKChTVEFSVCksIChTVE9QKSksIFwKKwkJIF9MU0JfUE9TICgzMiwgMCkpIFwKKwkgfCAoX1BPU19MRSAoKFNUT1ApLCBfTVNCX1BPUyAoNjQsIDMxKSkgXAorCSAgICA/IDAgXAorCSAgICA6IF9NQVNLbiAoMzIsIFwKKwkJICAgICAgX01TQl9QT1MgKDMyLCAwKSwgXAorCQkgICAgICBfTVNCXzMyICgoU1RBUlQpLCAoU1RPUCkpKSkpKQorI2VuZGlmCisjaWYgIWRlZmluZWQgKE1BU0spCisjZXJyb3IgIk1BU0sgbmV2ZXIgdW5kZWZpbmVkIgorI2VuZGlmCisKKworLyogTXVsdGktYml0IG1hc2sgb24gbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyAqLworCisjZGVmaW5lIF9MU01BU0tuKFdJRFRILCBGSVJTVCwgTEFTVCkgX01BU0tuIChXSURUSCwgXAorCQkJCQkgICAgIF9MU0JfUE9TIChXSURUSCwgRklSU1QpLCBcCisJCQkJCSAgICAgX0xTQl9QT1MgKFdJRFRILCBMQVNUKSkKKworI2RlZmluZSBMU01BU0s4KEZJUlNULCBMQVNUKSAgIF9MU01BU0tuICggOCwgKEZJUlNUKSwgKExBU1QpKQorI2RlZmluZSBMU01BU0sxNihGSVJTVCwgTEFTVCkgIF9MU01BU0tuICgxNiwgKEZJUlNUKSwgKExBU1QpKQorI2RlZmluZSBMU01BU0szMihGSVJTVCwgTEFTVCkgIF9MU01BU0tuICgzMiwgKEZJUlNUKSwgKExBU1QpKQorI2RlZmluZSBMU01BU0s2NChGSVJTVCwgTEFTVCkgIF9MU01BU0tuICg2NCwgKEZJUlNUKSwgKExBU1QpKQorCisjZGVmaW5lIExTTUFTSyhGSVJTVCwgTEFTVCkgKE1BU0sgKF9MU0JfUE9TICg2NCwgRklSU1QpLCBfTFNCX1BPUyAoNjQsIExBU1QpKSkKKworCisvKiBNdWx0aS1iaXQgbWFzayBvbiBtb3N0IHNpZ25pZmljYW50IGJpdHMgKi8KKworI2RlZmluZSBfTVNNQVNLbihXSURUSCwgRklSU1QsIExBU1QpIF9NQVNLbiAoV0lEVEgsIFwKKwkJCQkJICAgICBfTVNCX1BPUyAoV0lEVEgsIEZJUlNUKSwgXAorCQkJCQkgICAgIF9NU0JfUE9TIChXSURUSCwgTEFTVCkpCisKKyNkZWZpbmUgTVNNQVNLOChGSVJTVCwgTEFTVCkgIF9NU01BU0tuICggOCwgKEZJUlNUKSwgKExBU1QpKQorI2RlZmluZSBNU01BU0sxNihGSVJTVCwgTEFTVCkgX01TTUFTS24gKDE2LCAoRklSU1QpLCAoTEFTVCkpCisjZGVmaW5lIE1TTUFTSzMyKEZJUlNULCBMQVNUKSBfTVNNQVNLbiAoMzIsIChGSVJTVCksIChMQVNUKSkKKyNkZWZpbmUgTVNNQVNLNjQoRklSU1QsIExBU1QpIF9NU01BU0tuICg2NCwgKEZJUlNUKSwgKExBU1QpKQorCisjZGVmaW5lIE1TTUFTSyhGSVJTVCwgTEFTVCkgKE1BU0sgKF9NU0JfUE9TICg2NCwgRklSU1QpLCBfTVNCX1BPUyAoNjQsIExBU1QpKSkKKworCisKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9NU0IgPT0gMCkKKyNkZWZpbmUgTUFTSzggIE1TTUFTSzgKKyNkZWZpbmUgTUFTSzE2IE1TTUFTSzE2CisjZGVmaW5lIE1BU0szMiBNU01BU0szMgorI2RlZmluZSBNQVNLNjQgTVNNQVNLNjQKKyNlbHNlCisjZGVmaW5lIE1BU0s4ICBMU01BU0s4CisjZGVmaW5lIE1BU0sxNiBMU01BU0sxNgorI2RlZmluZSBNQVNLMzIgTFNNQVNLMzIKKyNkZWZpbmUgTUFTSzY0IExTTUFTSzY0CisjZW5kaWYKKworCisKKy8qIG1hc2sgdGhlIHJlcXVpcmVkIGJpdHMsIGxlYXZpbmcgdGhlbSBpbiBwbGFjZSAqLworCitJTkxJTkVfU0lNX0JJVFModW5zaWduZWQ4KSAgTFNNQVNLRUQ4ICAodW5zaWduZWQ4ICB3b3JkLCBpbnQgZmlyc3QsIGludCBsYXN0KTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDE2KSBMU01BU0tFRDE2ICh1bnNpZ25lZDE2IHdvcmQsIGludCBmaXJzdCwgaW50IGxhc3QpOworSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkMzIpIExTTUFTS0VEMzIgKHVuc2lnbmVkMzIgd29yZCwgaW50IGZpcnN0LCBpbnQgbGFzdCk7CitJTkxJTkVfU0lNX0JJVFModW5zaWduZWQ2NCkgTFNNQVNLRUQ2NCAodW5zaWduZWQ2NCB3b3JkLCBpbnQgZmlyc3QsIGludCBsYXN0KTsKKworSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkX3dvcmQpIExTTUFTS0VEICh1bnNpZ25lZF93b3JkIHdvcmQsIGludCBmaXJzdCwgaW50IGxhc3QpOworCitJTkxJTkVfU0lNX0JJVFModW5zaWduZWQ4KSAgTVNNQVNLRUQ4ICAodW5zaWduZWQ4ICB3b3JkLCBpbnQgZmlyc3QsIGludCBsYXN0KTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDE2KSBNU01BU0tFRDE2ICh1bnNpZ25lZDE2IHdvcmQsIGludCBmaXJzdCwgaW50IGxhc3QpOworSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkMzIpIE1TTUFTS0VEMzIgKHVuc2lnbmVkMzIgd29yZCwgaW50IGZpcnN0LCBpbnQgbGFzdCk7CitJTkxJTkVfU0lNX0JJVFModW5zaWduZWQ2NCkgTVNNQVNLRUQ2NCAodW5zaWduZWQ2NCB3b3JkLCBpbnQgZmlyc3QsIGludCBsYXN0KTsKKworSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkX3dvcmQpIE1TTUFTS0VEICh1bnNpZ25lZF93b3JkIHdvcmQsIGludCBmaXJzdCwgaW50IGxhc3QpOworCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfTVNCID09IDApCisjZGVmaW5lIE1BU0tFRDggIE1TTUFTS0VEOAorI2RlZmluZSBNQVNLRUQxNiBNU01BU0tFRDE2CisjZGVmaW5lIE1BU0tFRDMyIE1TTUFTS0VEMzIKKyNkZWZpbmUgTUFTS0VENjQgTVNNQVNLRUQ2NAorI2RlZmluZSBNQVNLRUQgICBNU01BU0tFRAorI2Vsc2UKKyNkZWZpbmUgTUFTS0VEOCAgTFNNQVNLRUQ4CisjZGVmaW5lIE1BU0tFRDE2IExTTUFTS0VEMTYKKyNkZWZpbmUgTUFTS0VEMzIgTFNNQVNLRUQzMgorI2RlZmluZSBNQVNLRUQ2NCBMU01BU0tFRDY0CisjZGVmaW5lIE1BU0tFRCBMU01BU0tFRAorI2VuZGlmCisKKworCisvKiBleHRyYWN0IHRoZSByZXF1aXJlZCBiaXRzIGFsaWduaW5nIHRoZW0gd2l0aCB0aGUgbHNiICovCisKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDgpICBMU0VYVFJBQ1RFRDggICh1bnNpZ25lZDggIHZhbCwgaW50IHN0YXJ0LCBpbnQgc3RvcCk7CitJTkxJTkVfU0lNX0JJVFModW5zaWduZWQxNikgTFNFWFRSQUNURUQxNiAodW5zaWduZWQxNiB2YWwsIGludCBzdGFydCwgaW50IHN0b3ApOworSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkMzIpIExTRVhUUkFDVEVEMzIgKHVuc2lnbmVkMzIgdmFsLCBpbnQgc3RhcnQsIGludCBzdG9wKTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDY0KSBMU0VYVFJBQ1RFRDY0ICh1bnNpZ25lZDY0IHZhbCwgaW50IHN0YXJ0LCBpbnQgc3RvcCk7CisKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZF93b3JkKSBMU0VYVFJBQ1RFRCAodW5zaWduZWRfd29yZCB2YWwsIGludCBzdGFydCwgaW50IHN0b3ApOworCitJTkxJTkVfU0lNX0JJVFModW5zaWduZWQ4KSAgTVNFWFRSQUNURUQ4ICAodW5zaWduZWQ4ICB2YWwsIGludCBzdGFydCwgaW50IHN0b3ApOworSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkMTYpIE1TRVhUUkFDVEVEMTYgKHVuc2lnbmVkMTYgdmFsLCBpbnQgc3RhcnQsIGludCBzdG9wKTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDMyKSBNU0VYVFJBQ1RFRDMyICh1bnNpZ25lZDMyIHZhbCwgaW50IHN0YXJ0LCBpbnQgc3RvcCk7CitJTkxJTkVfU0lNX0JJVFModW5zaWduZWQ2NCkgTVNFWFRSQUNURUQ2NCAodW5zaWduZWQ2NCB2YWwsIGludCBzdGFydCwgaW50IHN0b3ApOworCitJTkxJTkVfU0lNX0JJVFModW5zaWduZWRfd29yZCkgTVNFWFRSQUNURUQgKHVuc2lnbmVkX3dvcmQgdmFsLCBpbnQgc3RhcnQsIGludCBzdG9wKTsKKworI2lmIChXSVRIX1RBUkdFVF9XT1JEX01TQiA9PSAwKQorI2RlZmluZSBFWFRSQUNURUQ4ICBNU0VYVFJBQ1RFRDgKKyNkZWZpbmUgRVhUUkFDVEVEMTYgTVNFWFRSQUNURUQxNgorI2RlZmluZSBFWFRSQUNURUQzMiBNU0VYVFJBQ1RFRDMyCisjZGVmaW5lIEVYVFJBQ1RFRDY0IE1TRVhUUkFDVEVENjQKKyNkZWZpbmUgRVhUUkFDVEVEICAgTVNFWFRSQUNURUQKKyNlbHNlCisjZGVmaW5lIEVYVFJBQ1RFRDggIExTRVhUUkFDVEVEOAorI2RlZmluZSBFWFRSQUNURUQxNiBMU0VYVFJBQ1RFRDE2CisjZGVmaW5lIEVYVFJBQ1RFRDMyIExTRVhUUkFDVEVEMzIKKyNkZWZpbmUgRVhUUkFDVEVENjQgTFNFWFRSQUNURUQ2NAorI2RlZmluZSBFWFRSQUNURUQgICBMU0VYVFJBQ1RFRAorI2VuZGlmCisKKworCisvKiBtb3ZlIGEgc2luZ2xlIGJpdCBhcm91bmQgKi8KKy8qIE5COiB0aGUgd2llcmRuZXNzIChOPk8/Ti1POjApIGlzIHRvIHN0b3AgYSB3YXJuaW5nIGZyb20gR0NDICovCisjZGVmaW5lIF9TSFVGRkxFRG4oTiwgV09SRCwgT0xELCBORVcpIFwKKygoT0xEKSA8IChORVcpIFwKKyA/ICgoKHVuc2lnbmVkIyNOKShXT1JEKSBcCisgICAgID4+ICgoKE5FVykgPiAoT0xEKSkgPyAoKE5FVykgLSAoT0xEKSkgOiAwKSkgXAorICAgICYgTUFTSzMyKChORVcpLCAoTkVXKSkpIFwKKyA6ICgoKHVuc2lnbmVkIyNOKShXT1JEKSBcCisgICAgIDw8ICgoKE9MRCkgPiAoTkVXKSkgPyAoKE9MRCkgLSAoTkVXKSkgOiAwKSkgXAorICAgICYgTUFTSzMyKChORVcpLCAoTkVXKSkpKQorCisjZGVmaW5lIFNIVUZGTEVEMzIoV09SRCwgT0xELCBORVcpIF9TSFVGRkxFRG4gKDMyLCBXT1JELCBPTEQsIE5FVykKKyNkZWZpbmUgU0hVRkZMRUQ2NChXT1JELCBPTEQsIE5FVykgX1NIVUZGTEVEbiAoNjQsIFdPUkQsIE9MRCwgTkVXKQorCisjZGVmaW5lIFNIVUZGTEVEKFdPUkQsIE9MRCwgTkVXKSBfU0hVRkZMRURuIChfd29yZCwgV09SRCwgT0xELCBORVcpCisKKworLyogSW5zZXJ0IGEgZ3JvdXAgb2YgYml0cyBpbnRvIGEgYml0IHBvc2l0aW9uICovCisKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDgpICBMU0lOU0VSVEVEOCAgKHVuc2lnbmVkOCAgdmFsLCBpbnQgc3RhcnQsIGludCBzdG9wKTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDE2KSBMU0lOU0VSVEVEMTYgKHVuc2lnbmVkMTYgdmFsLCBpbnQgc3RhcnQsIGludCBzdG9wKTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDMyKSBMU0lOU0VSVEVEMzIgKHVuc2lnbmVkMzIgdmFsLCBpbnQgc3RhcnQsIGludCBzdG9wKTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDY0KSBMU0lOU0VSVEVENjQgKHVuc2lnbmVkNjQgdmFsLCBpbnQgc3RhcnQsIGludCBzdG9wKTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZF93b3JkKSBMU0lOU0VSVEVEICh1bnNpZ25lZF93b3JkIHZhbCwgaW50IHN0YXJ0LCBpbnQgc3RvcCk7CisKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDgpICBNU0lOU0VSVEVEOCAgKHVuc2lnbmVkOCAgdmFsLCBpbnQgc3RhcnQsIGludCBzdG9wKTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDE2KSBNU0lOU0VSVEVEMTYgKHVuc2lnbmVkMTYgdmFsLCBpbnQgc3RhcnQsIGludCBzdG9wKTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDMyKSBNU0lOU0VSVEVEMzIgKHVuc2lnbmVkMzIgdmFsLCBpbnQgc3RhcnQsIGludCBzdG9wKTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDY0KSBNU0lOU0VSVEVENjQgKHVuc2lnbmVkNjQgdmFsLCBpbnQgc3RhcnQsIGludCBzdG9wKTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZF93b3JkKSBNU0lOU0VSVEVEICh1bnNpZ25lZF93b3JkIHZhbCwgaW50IHN0YXJ0LCBpbnQgc3RvcCk7CisKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9NU0IgPT0gMCkKKyNkZWZpbmUgSU5TRVJURUQ4ICBNU0lOU0VSVEVEOAorI2RlZmluZSBJTlNFUlRFRDE2IE1TSU5TRVJURUQxNgorI2RlZmluZSBJTlNFUlRFRDMyIE1TSU5TRVJURUQzMgorI2RlZmluZSBJTlNFUlRFRDY0IE1TSU5TRVJURUQ2NAorI2RlZmluZSBJTlNFUlRFRCAgIE1TSU5TRVJURUQKKyNlbHNlCisjZGVmaW5lIElOU0VSVEVEOCAgTFNJTlNFUlRFRDgKKyNkZWZpbmUgSU5TRVJURUQxNiBMU0lOU0VSVEVEMTYKKyNkZWZpbmUgSU5TRVJURUQzMiBMU0lOU0VSVEVEMzIKKyNkZWZpbmUgSU5TRVJURUQ2NCBMU0lOU0VSVEVENjQKKyNkZWZpbmUgSU5TRVJURUQgICBMU0lOU0VSVEVECisjZW5kaWYKKworCisKKy8qIE1PVkUgYml0cyBmcm9tIG9uZSBsb2MgdG8gYW5vdGhlciAoY29tYmluYXRpb24gb2YgZXh0cmFjdC9pbnNlcnQpICovCisKKyNkZWZpbmUgTU9WRUQ4KFZBTCxPSCxPTCxOSCxOTCkgIElOU0VSVEVEOCAoRVhUUkFDVEVEOCAoKFZBTCksIE9ILCBPTCksIE5ILCBOTCkKKyNkZWZpbmUgTU9WRUQxNihWQUwsT0gsT0wsTkgsTkwpIElOU0VSVEVEMTYoRVhUUkFDVEVEMTYoKFZBTCksIE9ILCBPTCksIE5ILCBOTCkKKyNkZWZpbmUgTU9WRUQzMihWQUwsT0gsT0wsTkgsTkwpIElOU0VSVEVEMzIoRVhUUkFDVEVEMzIoKFZBTCksIE9ILCBPTCksIE5ILCBOTCkKKyNkZWZpbmUgTU9WRUQ2NChWQUwsT0gsT0wsTkgsTkwpIElOU0VSVEVENjQoRVhUUkFDVEVENjQoKFZBTCksIE9ILCBPTCksIE5ILCBOTCkKKyNkZWZpbmUgTU9WRUQoVkFMLE9ILE9MLE5ILE5MKSAgIElOU0VSVEVEICAoRVhUUkFDVEVEICAoKFZBTCksIE9ILCBPTCksIE5ILCBOTCkKKworCisKKy8qIFNpZ24gZXh0ZW5kIHRoZSBxdWFudGl0eSB0byB0aGUgdGFyZ2V0cyBuYXR1cmFsIHdvcmQgc2l6ZSAqLworCisjZGVmaW5lIEVYVEVORDQoWCkgIChMU1NFWFQgKChYKSwgMykpCisjZGVmaW5lIEVYVEVORDUoWCkgIChMU1NFWFQgKChYKSwgNCkpCisjZGVmaW5lIEVYVEVORDgoWCkgICgoc2lnbmVkX3dvcmQpKHNpZ25lZDgpKFgpKQorI2RlZmluZSBFWFRFTkQxMShYKSAgKExTU0VYVCAoKFgpLCAxMCkpCisjZGVmaW5lIEVYVEVORDE1KFgpICAoTFNTRVhUICgoWCksIDE0KSkKKyNkZWZpbmUgRVhURU5EMTYoWCkgKChzaWduZWRfd29yZCkoc2lnbmVkMTYpKFgpKQorI2RlZmluZSBFWFRFTkQyNChYKSAgKExTU0VYVCAoKFgpLCAyMykpCisjZGVmaW5lIEVYVEVORDMyKFgpICgoc2lnbmVkX3dvcmQpKHNpZ25lZDMyKShYKSkKKyNkZWZpbmUgRVhURU5ENjQoWCkgKChzaWduZWRfd29yZCkoc2lnbmVkNjQpKFgpKQorCisvKiBkZXBlbmRpbmcgb24gTU9ERSByZXR1cm4gYSA2NGJpdCBvciAzMmJpdCAoc2lnbiBleHRlbmRlZCkgdmFsdWUgKi8KKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQorI2RlZmluZSBFWFRFTkRFRChYKSAgICAgKChzaWduZWQ2NCkoc2lnbmVkMzIpKFgpKQorI2VuZGlmCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKKyNkZWZpbmUgRVhURU5ERUQoWCkgICAgIChYKQorI2VuZGlmCisKKworLyogbWVtb3J5IGFsaWdubWVudCBtYWNybydzICovCisjZGVmaW5lIF9BTElHTmEoQSxYKSAgKCgoWCkgKyAoKEEpIC0gMSkpICYgfigoQSkgLSAxKSkKKyNkZWZpbmUgX0ZMT09SYShBLFgpICAoKFgpICYgfigoQSkgLSAxKSkKKworI2RlZmluZSBBTElHTl84KFgpCV9BTElHTmEgKDgsIFgpCisjZGVmaW5lIEFMSUdOXzE2KFgpCV9BTElHTmEgKDE2LCBYKQorCisjZGVmaW5lIEFMSUdOX1BBR0UoWCkJX0FMSUdOYSAoMHgxMDAwLCBYKQorI2RlZmluZSBGTE9PUl9QQUdFKFgpICAgKChYKSAmIH4oMHgxMDAwIC0gMSkpCisKKworLyogYml0IGJsaXRpbmcgbWFjcm8ncyAqLworI2RlZmluZSBCTElUMzIoViwgUE9TLCBCSVQpIFwKK2RvIHsgXAorICBpZiAoQklUKSBcCisgICAgViB8PSBCSVQzMiAoUE9TKTsgXAorICBlbHNlIFwKKyAgICBWICY9IH5CSVQzMiAoUE9TKTsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgTUJMSVQzMihWLCBMTywgSEksIFZBTCkgXAorZG8geyBcCisgIChWKSA9ICgoKFYpICYgfk1BU0szMiAoKExPKSwgKEhJKSkpIFwKKwkgfCBJTlNFUlRFRDMyIChWQUwsIExPLCBISSkpOyBcCit9IHdoaWxlICgwKQorCisKKworLyogc29tZSByb3RhdGUgZnVuY3Rpb25zLiAgVGhlIGdlbmVyaWMgbWFjcm8ncyBST1QsIFJPVEwsIFJPVFIgYXJlCisgICBpbnRlbnRpb25hbGx5IG9taXRlZC4gKi8KKworCitJTkxJTkVfU0lNX0JJVFModW5zaWduZWQ4KSAgUk9UOCAgKHVuc2lnbmVkOCAgdmFsLCBpbnQgc2hpZnQpOworSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkMTYpIFJPVDE2ICh1bnNpZ25lZDE2IHZhbCwgaW50IHNoaWZ0KTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDMyKSBST1QzMiAodW5zaWduZWQzMiB2YWwsIGludCBzaGlmdCk7CitJTkxJTkVfU0lNX0JJVFModW5zaWduZWQ2NCkgUk9UNjQgKHVuc2lnbmVkNjQgdmFsLCBpbnQgc2hpZnQpOworCisKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDgpICBST1RMOCAgKHVuc2lnbmVkOCAgdmFsLCBpbnQgc2hpZnQpOworSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkMTYpIFJPVEwxNiAodW5zaWduZWQxNiB2YWwsIGludCBzaGlmdCk7CitJTkxJTkVfU0lNX0JJVFModW5zaWduZWQzMikgUk9UTDMyICh1bnNpZ25lZDMyIHZhbCwgaW50IHNoaWZ0KTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDY0KSBST1RMNjQgKHVuc2lnbmVkNjQgdmFsLCBpbnQgc2hpZnQpOworCisKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDgpICBST1RSOCAgKHVuc2lnbmVkOCAgdmFsLCBpbnQgc2hpZnQpOworSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkMTYpIFJPVFIxNiAodW5zaWduZWQxNiB2YWwsIGludCBzaGlmdCk7CitJTkxJTkVfU0lNX0JJVFModW5zaWduZWQzMikgUk9UUjMyICh1bnNpZ25lZDMyIHZhbCwgaW50IHNoaWZ0KTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDY0KSBST1RSNjQgKHVuc2lnbmVkNjQgdmFsLCBpbnQgc2hpZnQpOworCisKKworLyogU2lnbiBleHRlbnNpb24gb3BlcmF0aW9ucyAqLworCitJTkxJTkVfU0lNX0JJVFModW5zaWduZWQ4KSAgTFNTRVhUOCAgKHNpZ25lZDggIHZhbCwgaW50IHNpZ25fYml0KTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDE2KSBMU1NFWFQxNiAoc2lnbmVkMTYgdmFsLCBpbnQgc2lnbl9iaXQpOworSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkMzIpIExTU0VYVDMyIChzaWduZWQzMiB2YWwsIGludCBzaWduX2JpdCk7CitJTkxJTkVfU0lNX0JJVFModW5zaWduZWQ2NCkgTFNTRVhUNjQgKHNpZ25lZDY0IHZhbCwgaW50IHNpZ25fYml0KTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZF93b3JkKSBMU1NFWFQgKHNpZ25lZF93b3JkIHZhbCwgaW50IHNpZ25fYml0KTsKKworSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkOCkgIE1TU0VYVDggIChzaWduZWQ4ICB2YWwsIGludCBzaWduX2JpdCk7CitJTkxJTkVfU0lNX0JJVFModW5zaWduZWQxNikgTVNTRVhUMTYgKHNpZ25lZDE2IHZhbCwgaW50IHNpZ25fYml0KTsKK0lOTElORV9TSU1fQklUUyh1bnNpZ25lZDMyKSBNU1NFWFQzMiAoc2lnbmVkMzIgdmFsLCBpbnQgc2lnbl9iaXQpOworSU5MSU5FX1NJTV9CSVRTKHVuc2lnbmVkNjQpIE1TU0VYVDY0IChzaWduZWQ2NCB2YWwsIGludCBzaWduX2JpdCk7CitJTkxJTkVfU0lNX0JJVFModW5zaWduZWRfd29yZCkgTVNTRVhUIChzaWduZWRfd29yZCB2YWwsIGludCBzaWduX2JpdCk7CisKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9NU0IgPT0gMCkKKyNkZWZpbmUgU0VYVDggIE1TU0VYVDgKKyNkZWZpbmUgU0VYVDE2IE1TU0VYVDE2CisjZGVmaW5lIFNFWFQzMiBNU1NFWFQzMgorI2RlZmluZSBTRVhUNjQgTVNTRVhUNjQKKyNkZWZpbmUgU0VYVCAgIE1TU0VYVAorI2Vsc2UKKyNkZWZpbmUgU0VYVDggIExTU0VYVDgKKyNkZWZpbmUgU0VYVDE2IExTU0VYVDE2CisjZGVmaW5lIFNFWFQzMiBMU1NFWFQzMgorI2RlZmluZSBTRVhUNjQgTFNTRVhUNjQKKyNkZWZpbmUgU0VYVCAgIExTU0VYVAorI2VuZGlmCisKKworCisjaWYgSF9SRVZFQUxTX01PRFVMRV9QIChTSU1fQklUU19JTkxJTkUpCisjaW5jbHVkZSAic2ltLWJpdHMuYyIKKyNlbmRpZgorCisjZW5kaWYgLyogX1NJTV9CSVRTX0hfICovCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1icmVhay5jIGIvc2ltL2NvbW1vbi9zaW0tYnJlYWsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjg5NTYwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tYnJlYWsuYwpAQCAtMCwwICsxLDI3OCBAQAorLyogU2ltdWxhdG9yIGJyZWFrcG9pbnQgc3VwcG9ydC4KKyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisjaW5jbHVkZSAic2ltLWJyZWFrLmgiCisKKyNpZm5kZWYgU0lNX0JSRUFLUE9JTlQKKyNkZWZpbmUgU0lNX0JSRUFLUE9JTlQgezB4MDB9CisjZGVmaW5lIFNJTV9CUkVBS1BPSU5UX1NJWkUgKDEpCisjZW5kaWYKKworc3RydWN0CitzaW1fYnJlYWtwb2ludAoreworICBzdHJ1Y3Qgc2ltX2JyZWFrcG9pbnQgKm5leHQ7CisgIFNJTV9BRERSIGFkZHI7CQkvKiBBZGRyZXNzIG9mIHRoaXMgYnJlYWtwb2ludCAqLworICBpbnQgZmxhZ3M7CisgIHVuc2lnbmVkIGNoYXIgbG9jX2NvbnRlbnRzW1NJTV9CUkVBS1BPSU5UX1NJWkVdOyAvKiBDb250ZW50cyBvZiBhZGRyIHdoaWxlCisJCQkJCQkgICAgICBCUCBpcyBlbmFibGVkICovCit9OworCisjZGVmaW5lIFNJTV9CUkVBS19JTlNFUlRFRCAweDEJLyogQnJlYWtwb2ludCBoYXMgYmVlbiBpbnNlcnRlZCAqLworI2RlZmluZSBTSU1fQlJFQUtfRElTQUJMRUQgMHgyCS8qIEJyZWFrcG9pbnQgaXMgZGlzYWJsZWQgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2ltX2JyZWFrcG9pbnQgW10gPSBTSU1fQlJFQUtQT0lOVDsKKworc3RhdGljIHZvaWQgaW5zZXJ0X2JyZWFrcG9pbnQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsCisJCQkJICAgICAgIHN0cnVjdCBzaW1fYnJlYWtwb2ludCAqYnApKTsKK3N0YXRpYyB2b2lkIHJlbW92ZV9icmVha3BvaW50IFBBUkFNUyAoKFNJTV9ERVNDIHNkLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2ltX2JyZWFrcG9pbnQgKmJwKSk7CitzdGF0aWMgU0lNX1JDIHJlc3VtZV9oYW5kbGVyIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7CitzdGF0aWMgU0lNX1JDIHN1c3BlbmRfaGFuZGxlciBQQVJBTVMgKChTSU1fREVTQyBzZCkpOworCisKKy8qIERvIHRoZSBhY3R1YWwgd29yayBvZiBpbnNlcnRpbmcgYSBicmVha3BvaW50IGludG8gdGhlIGluc3RydWN0aW9uCisgICBzdHJlYW0uICovCisKK3N0YXRpYyB2b2lkCitpbnNlcnRfYnJlYWtwb2ludCAoc2QsIGJwKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgc3RydWN0IHNpbV9icmVha3BvaW50ICpicDsKK3sKKyAgaWYgKGJwLT5mbGFncyAmIChTSU1fQlJFQUtfSU5TRVJURUQgfCBTSU1fQlJFQUtfRElTQUJMRUQpKQorICAgIHJldHVybjsKKworICBzaW1fY29yZV9yZWFkX2J1ZmZlciAoc2QsIE5VTEwsIGV4ZWNfbWFwLCBicC0+bG9jX2NvbnRlbnRzLAorCQkJYnAtPmFkZHIsIFNJTV9CUkVBS1BPSU5UX1NJWkUpOworICBzaW1fY29yZV93cml0ZV9idWZmZXIgKHNkLCBOVUxMLCBleGVjX21hcCwgc2ltX2JyZWFrcG9pbnQsCisJCQkgYnAtPmFkZHIsIFNJTV9CUkVBS1BPSU5UX1NJWkUpOworICBicC0+ZmxhZ3MgfD0gU0lNX0JSRUFLX0lOU0VSVEVEOworfQorCisvKiBEbyB0aGUgYWN0dWFsIHdvcmsgb2YgcmVtb3ZpbmcgYSBicmVha3BvaW50LiAqLworCitzdGF0aWMgdm9pZAorcmVtb3ZlX2JyZWFrcG9pbnQgKHNkLCBicCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIHN0cnVjdCBzaW1fYnJlYWtwb2ludCAqYnA7Cit7CisgIGlmICghKGJwLT5mbGFncyAmIFNJTV9CUkVBS19JTlNFUlRFRCkpCisgICAgcmV0dXJuOworCisgIHNpbV9jb3JlX3dyaXRlX2J1ZmZlciAoc2QsIE5VTEwsIGV4ZWNfbWFwLCBicC0+bG9jX2NvbnRlbnRzLAorCQkJIGJwLT5hZGRyLCBTSU1fQlJFQUtQT0lOVF9TSVpFKTsKKyAgYnAtPmZsYWdzICY9IH5TSU1fQlJFQUtfSU5TRVJURUQ7Cit9CisKKy8qIENvbWUgaGVyZSB3aGVuIGEgYnJlYWtwb2ludCBpbnNuIGlzIGhpdC4gIElmIGl0J3MgcmVhbGx5IGEgYnJlYWtwb2ludCwgd2UKKyAgIGhhbHQgdGhpbmdzLCBhbmQgbmV2ZXIgcmV0dXJuLiAgSWYgaXQncyBhIGZhbHNlIGhpdCwgd2UgcmV0dXJuIHRvIGxldCB0aGUKKyAgIGNhbGxlciBoYW5kbGUgdGhpbmdzLiAgKi8KKwordm9pZAorc2ltX2hhbmRsZV9icmVha3BvaW50IChzZCwgY3B1LCBjaWEpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBzaW1fY3B1ICpjcHU7CisgICAgIHNpbV9jaWEgY2lhOworeworICBzdHJ1Y3Qgc2ltX2JyZWFrcG9pbnQgKmJwOworCisgIGZvciAoYnAgPSBTVEFURV9CUkVBS1BPSU5UUyAoc2QpOyBicDsgYnAgPSBicC0+bmV4dCkKKyAgICBpZiAoYnAtPmFkZHIgPT0gQ0lBX0FERFIgKGNpYSkpCisgICAgICBicmVhazsKKworICBpZiAoIWJwIHx8ICEoYnAtPmZsYWdzICYgU0lNX0JSRUFLX0lOU0VSVEVEKSkKKyAgICByZXR1cm47CisKKyAgc2ltX2VuZ2luZV9oYWx0IChzZCwgU1RBVEVfQ1BVIChzZCwgMCksIE5VTEwsIGNpYSwgc2ltX3N0b3BwZWQsIFNJTV9TSUdUUkFQKTsKK30KKworLyogSGFuZGxlciBmdW5jdGlvbnMgZm9yIHNpbXVsYXRvciByZXN1bWUgYW5kIHN1c3BlbmQgZXZlbnRzLiAqLworCitzdGF0aWMgU0lNX1JDCityZXN1bWVfaGFuZGxlciAoc2QpCisgICAgIFNJTV9ERVNDIHNkOworeworICBzdHJ1Y3Qgc2ltX2JyZWFrcG9pbnQgKmJwOworCisgIGZvciAoYnAgPSBTVEFURV9CUkVBS1BPSU5UUyAoc2QpOyBicDsgYnAgPSBicC0+bmV4dCkKKyAgICBpbnNlcnRfYnJlYWtwb2ludCAoc2QsIGJwKTsKKworICByZXR1cm4gU0lNX1JDX09LOworfQorCitzdGF0aWMgU0lNX1JDCitzdXNwZW5kX2hhbmRsZXIgKHNkKQorICAgICBTSU1fREVTQyBzZDsKK3sKKyAgc3RydWN0IHNpbV9icmVha3BvaW50ICpicDsKKworICBmb3IgKGJwID0gU1RBVEVfQlJFQUtQT0lOVFMgKHNkKTsgYnA7IGJwID0gYnAtPm5leHQpCisgICAgcmVtb3ZlX2JyZWFrcG9pbnQgKHNkLCBicCk7CisKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworLyogQ2FsbGVkIGZyb20gc2ltdWxhdG9yIG1vZHVsZSBpbml0aWFsaXphdGlvbi4gICovCisKK1NJTV9SQworc2ltX2JyZWFrX2luc3RhbGwgKHNkKQorICAgICBTSU1fREVTQyBzZDsKK3sKKyAgc2ltX21vZHVsZV9hZGRfcmVzdW1lX2ZuIChzZCwgcmVzdW1lX2hhbmRsZXIpOworICBzaW1fbW9kdWxlX2FkZF9zdXNwZW5kX2ZuIChzZCwgc3VzcGVuZF9oYW5kbGVyKTsKKworICByZXR1cm4gU0lNX1JDX09LOworfQorCisvKiBJbnN0YWxsIGEgYnJlYWtwb2ludC4gIFRoaXMgaXMgYSB1c2VyLWZ1bmN0aW9uLiAgVGhlIGJyZWFrcG9pbnQgaXNuJ3QKKyAgIGFjdHVhbGx5IGluc3RhbGxlZCBoZXJlLiAgV2UganVzdCByZWNvcmQgaXQuICBSZXN1bWVfaGFuZGxlciBkb2VzIHRoZQorICAgYWN0dWFsIHdvcmsuCisqLworCitTSU1fUkMKK3NpbV9zZXRfYnJlYWtwb2ludCAoc2QsIGFkZHIpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBTSU1fQUREUiBhZGRyOworeworICBzdHJ1Y3Qgc2ltX2JyZWFrcG9pbnQgKmJwOworCisgIGZvciAoYnAgPSBTVEFURV9CUkVBS1BPSU5UUyAoc2QpOyBicDsgYnAgPSBicC0+bmV4dCkKKyAgICBpZiAoYnAtPmFkZHIgPT0gYWRkcikKKyAgICAgIHJldHVybiBTSU1fUkNfRFVQTElDQVRFX0JSRUFLUE9JTlQ7IC8qIEFscmVhZHkgdGhlcmUgKi8KKyAgICBlbHNlCisgICAgICBicmVhazsgLyogRklYTUU6IHdoeSBub3Qgc2NhbiBhbGwgYnAncz8gKi8KKworICBicCA9IFpBTExPQyAoc3RydWN0IHNpbV9icmVha3BvaW50KTsKKworICBicC0+YWRkciA9IGFkZHI7CisgIGJwLT5uZXh0ID0gU1RBVEVfQlJFQUtQT0lOVFMgKHNkKTsKKyAgYnAtPmZsYWdzID0gMDsKKyAgU1RBVEVfQlJFQUtQT0lOVFMgKHNkKSA9IGJwOworCisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKKy8qIERlbGV0ZSBhIGJyZWFrcG9pbnQuICBBbGwga25vd2xlZ2Ugb2YgdGhlIGJyZWFrcG9pbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZQorICAgc2ltdWxhdG9yLgorKi8KKworU0lNX1JDCitzaW1fY2xlYXJfYnJlYWtwb2ludCAoc2QsIGFkZHIpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBTSU1fQUREUiBhZGRyOworeworICBzdHJ1Y3Qgc2ltX2JyZWFrcG9pbnQgKmJwLCAqYnBwcmV2OworCisgIGZvciAoYnAgPSBTVEFURV9CUkVBS1BPSU5UUyAoc2QpLCBicHByZXYgPSBOVUxMOworICAgICAgIGJwOworICAgICAgIGJwcHJldiA9IGJwLCBicCA9IGJwLT5uZXh0KQorICAgIGlmIChicC0+YWRkciA9PSBhZGRyKQorICAgICAgYnJlYWs7CisKKyAgaWYgKCFicCkKKyAgICByZXR1cm4gU0lNX1JDX1VOS05PV05fQlJFQUtQT0lOVDsKKworICByZW1vdmVfYnJlYWtwb2ludCAoc2QsIGJwKTsKKworICBpZiAoYnBwcmV2KQorICAgIGJwcHJldi0+bmV4dCA9IGJwLT5uZXh0OworICBlbHNlCisgICAgU1RBVEVfQlJFQUtQT0lOVFMgKHNkKSA9IE5VTEw7CisKKyAgemZyZWUgKGJwKTsKKworICByZXR1cm4gU0lNX1JDX09LOworfQorCitTSU1fUkMKK3NpbV9jbGVhcl9hbGxfYnJlYWtwb2ludHMgKHNkKQorICAgICBTSU1fREVTQyBzZDsKK3sKKyAgd2hpbGUgKFNUQVRFX0JSRUFLUE9JTlRTIChzZCkpCisgICAgc2ltX2NsZWFyX2JyZWFrcG9pbnQgKHNkLCBTVEFURV9CUkVBS1BPSU5UUyAoc2QpLT5hZGRyKTsKKworICByZXR1cm4gU0lNX1JDX09LOworfQorCitTSU1fUkMKK3NpbV9lbmFibGVfYnJlYWtwb2ludCAoc2QsIGFkZHIpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBTSU1fQUREUiBhZGRyOworeworICBzdHJ1Y3Qgc2ltX2JyZWFrcG9pbnQgKmJwOworCisgIGZvciAoYnAgPSBTVEFURV9CUkVBS1BPSU5UUyAoc2QpOyBicDsgYnAgPSBicC0+bmV4dCkKKyAgICBpZiAoYnAtPmFkZHIgPT0gYWRkcikKKyAgICAgIGJyZWFrOworCisgIGlmICghYnApCisgICAgcmV0dXJuIFNJTV9SQ19VTktOT1dOX0JSRUFLUE9JTlQ7CisKKyAgYnAtPmZsYWdzICY9IH5TSU1fQlJFQUtfRElTQUJMRUQ7CisKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworU0lNX1JDCitzaW1fZGlzYWJsZV9icmVha3BvaW50IChzZCwgYWRkcikKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIFNJTV9BRERSIGFkZHI7Cit7CisgIHN0cnVjdCBzaW1fYnJlYWtwb2ludCAqYnA7CisKKyAgZm9yIChicCA9IFNUQVRFX0JSRUFLUE9JTlRTIChzZCk7IGJwOyBicCA9IGJwLT5uZXh0KQorICAgIGlmIChicC0+YWRkciA9PSBhZGRyKQorICAgICAgYnJlYWs7CisKKyAgaWYgKCFicCkKKyAgICByZXR1cm4gU0lNX1JDX1VOS05PV05fQlJFQUtQT0lOVDsKKworICBicC0+ZmxhZ3MgfD0gU0lNX0JSRUFLX0RJU0FCTEVEOworCisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKK1NJTV9SQworc2ltX2VuYWJsZV9hbGxfYnJlYWtwb2ludHMgKHNkKQorICAgICBTSU1fREVTQyBzZDsKK3sKKyAgc3RydWN0IHNpbV9icmVha3BvaW50ICpicDsKKworICBmb3IgKGJwID0gU1RBVEVfQlJFQUtQT0lOVFMgKHNkKTsgYnA7IGJwID0gYnAtPm5leHQpCisgICAgYnAtPmZsYWdzICY9IH5TSU1fQlJFQUtfRElTQUJMRUQ7CisKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworU0lNX1JDCitzaW1fZGlzYWJsZV9hbGxfYnJlYWtwb2ludHMgKHNkKQorICAgICBTSU1fREVTQyBzZDsKK3sKKyAgc3RydWN0IHNpbV9icmVha3BvaW50ICpicDsKKworICBmb3IgKGJwID0gU1RBVEVfQlJFQUtQT0lOVFMgKHNkKTsgYnA7IGJwID0gYnAtPm5leHQpCisgICAgYnAtPmZsYWdzIHw9IFNJTV9CUkVBS19ESVNBQkxFRDsKKworICByZXR1cm4gU0lNX1JDX09LOworfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tYnJlYWsuaCBiL3NpbS9jb21tb24vc2ltLWJyZWFrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwMzM4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vc2ltLWJyZWFrLmgKQEAgLTAsMCArMSwzOCBAQAorLyogU2ltdWxhdG9yIGJyZWFrcG9pbnQgc3VwcG9ydC4KKyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2lmbmRlZiBTSU1fQlJFQUtfSAorI2RlZmluZSBTSU1fQlJFQUtfSAorCisvKiBDYWxsIHRoaXMgdG8gaW5zdGFsbCB0aGUgcmVzdW1lIGFuZCBzdXNwZW5kIGhhbmRsZXJzIGZvciB0aGUgYnJlYWtwb2ludAorICAgbW9kdWxlLiAgKi8KKworTU9EVUxFX0lOU1RBTExfRk4gc2ltX2JyZWFrX2luc3RhbGw7CisKKy8qIENhbGwgdGhpcyBpbnNpZGUgdGhlIHNpbXVsYXRvciB3aGVuIHdlIGV4ZWN1dGUgdGhlIHBvdGVudGlhbAorICAgYnJlYWtwb2ludCBpbnNuLiAgSWYgdGhlIGJyZWFrcG9pbnQgc3lzdGVtIGtub3dzIGFib3V0IGl0LCB0aGUKKyAgIGJyZWFrcG9pbnQgaXMgaGFuZGxlZCwgYW5kIHRoaXMgcm91dGluZSBuZXZlciByZXR1cm5zLiAgSWYgdGhpcworICAgaXNuJ3QgcmVhbGx5IGEgYnJlYWtwb2ludCwgdGhlbiBpdCByZXR1cm5zIHRvIGFsbG93IHRoZSBjYWxsZXIgdG8KKyAgIGhhbmRsZSB0aGluZ3MuICAqLworCit2b2lkIHNpbV9oYW5kbGVfYnJlYWtwb2ludCBQQVJBTVMgKChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBzaW1fY2lhIGNpYSkpOworCisjZW5kaWYgLyogU0lNX0JSRUFLX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWNvbmZpZy5jIGIvc2ltL2NvbW1vbi9zaW0tY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBhMTlhYQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vc2ltLWNvbmZpZy5jCkBAIC0wLDAgKzEsMzc3IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBzaW11bGF0b3JzLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAic2ltLWFzc2VydC5oIgorI2luY2x1ZGUgImJmZC5oIgorCisKK2ludCBjdXJyZW50X2hvc3RfYnl0ZV9vcmRlcjsKK2ludCBjdXJyZW50X3RhcmdldF9ieXRlX29yZGVyOworaW50IGN1cnJlbnRfc3RkaW87CisKK2VudW0gc2ltX2FsaWdubWVudHMgY3VycmVudF9hbGlnbm1lbnQ7CisKKyNpZiBkZWZpbmVkIChXSVRIX0ZMT0FUSU5HX1BPSU5UKQoraW50IGN1cnJlbnRfZmxvYXRpbmdfcG9pbnQ7CisjZW5kaWYKKworCisKKy8qIG1hcCBhIGJ5dGUgb3JkZXIgb250byBhIHRleHR1YWwgc3RyaW5nICovCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2NvbmZpZ19ieXRlX29yZGVyX3RvX2EgKGludCBieXRlX29yZGVyKQoreworICBzd2l0Y2ggKGJ5dGVfb3JkZXIpCisgICAgeworICAgIGNhc2UgTElUVExFX0VORElBTjoKKyAgICAgIHJldHVybiAiTElUVExFX0VORElBTiI7CisgICAgY2FzZSBCSUdfRU5ESUFOOgorICAgICAgcmV0dXJuICJCSUdfRU5ESUFOIjsKKyAgICBjYXNlIDA6CisgICAgICByZXR1cm4gIjAiOworICAgIH0KKyAgcmV0dXJuICJVTktOT1dOIjsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqCitjb25maWdfc3RkaW9fdG9fYSAoaW50IHN0ZGlvKQoreworICBzd2l0Y2ggKHN0ZGlvKQorICAgIHsKKyAgICBjYXNlIERPTlRfVVNFX1NURElPOgorICAgICAgcmV0dXJuICJET05UX1VTRV9TVERJTyI7CisgICAgY2FzZSBET19VU0VfU1RESU86CisgICAgICByZXR1cm4gIkRPX1VTRV9TVERJTyI7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuICIwIjsKKyAgICB9CisgIHJldHVybiAiVU5LTk9XTiI7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKgorY29uZmlnX2Vudmlyb25tZW50X3RvX2EgKGVudW0gc2ltX2Vudmlyb25tZW50IGVudmlyb25tZW50KQoreworICBzd2l0Y2ggKGVudmlyb25tZW50KQorICAgIHsKKyAgICBjYXNlIEFMTF9FTlZJUk9OTUVOVDoKKyAgICAgIHJldHVybiAiQUxMX0VOVklST05NRU5UIjsKKyAgICBjYXNlIFVTRVJfRU5WSVJPTk1FTlQ6CisgICAgICByZXR1cm4gIlVTRVJfRU5WSVJPTk1FTlQiOworICAgIGNhc2UgVklSVFVBTF9FTlZJUk9OTUVOVDoKKyAgICAgIHJldHVybiAiVklSVFVBTF9FTlZJUk9OTUVOVCI7CisgICAgY2FzZSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQ6CisgICAgICByZXR1cm4gIk9QRVJBVElOR19FTlZJUk9OTUVOVCI7CisgICAgfQorICByZXR1cm4gIlVOS05PV04iOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2NvbmZpZ19hbGlnbm1lbnRfdG9fYSAoZW51bSBzaW1fYWxpZ25tZW50cyBhbGlnbm1lbnQpCit7CisgIHN3aXRjaCAoYWxpZ25tZW50KQorICAgIHsKKyAgICBjYXNlIE1JWEVEX0FMSUdOTUVOVDoKKyAgICAgIHJldHVybiAiTUlYRURfQUxJR05NRU5UIjsKKyAgICBjYXNlIE5PTlNUUklDVF9BTElHTk1FTlQ6CisgICAgICByZXR1cm4gIk5PTlNUUklDVF9BTElHTk1FTlQiOworICAgIGNhc2UgU1RSSUNUX0FMSUdOTUVOVDoKKyAgICAgIHJldHVybiAiU1RSSUNUX0FMSUdOTUVOVCI7CisgICAgY2FzZSBGT1JDRURfQUxJR05NRU5UOgorICAgICAgcmV0dXJuICJGT1JDRURfQUxJR05NRU5UIjsKKyAgICB9CisgIHJldHVybiAiVU5LTk9XTiI7Cit9CisKKworI2lmIGRlZmluZWQgKFdJVEhfRkxPQVRJTkdfUE9JTlQpCitzdGF0aWMgY29uc3QgY2hhciAqCitjb25maWdfZmxvYXRpbmdfcG9pbnRfdG9fYSAoaW50IGZsb2F0aW5nX3BvaW50KQoreworICBzd2l0Y2ggKGZsb2F0aW5nX3BvaW50KQorICAgIHsKKyAgICBjYXNlIFNPRlRfRkxPQVRJTkdfUE9JTlQ6CisgICAgICByZXR1cm4gIlNPRlRfRkxPQVRJTkdfUE9JTlQiOworICAgIGNhc2UgSEFSRF9GTE9BVElOR19QT0lOVDoKKyAgICAgIHJldHVybiAiSEFSRF9GTE9BVElOR19QT0lOVCI7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuICIwIjsKKyAgICB9CisgIHJldHVybiAiVU5LTk9XTiI7Cit9CisjZW5kaWYKKworLyogU2V0IHRoZSBkZWZhdWx0IGVudmlyb25tZW50LCBwcmlvciB0byBwYXJzaW5nIGFyZ3YuICAqLworCit2b2lkCitzaW1fY29uZmlnX2RlZmF1bHQgKFNJTV9ERVNDIHNkKQoreworICAgLyogU2V0IHRoZSBjdXJyZW50IGVudmlyb25tZW50IHRvIEFMTF9FTlZJUk9OTUVOVCB0byBpbmRpY2F0ZSBub25lIGhhcyBiZWVuCisgICAgICBzZWxlY3RlZCB5ZXQuICBUaGlzIGlzIHNvIHRoYXQgYWZ0ZXIgcGFyc2luZyBhcmd2LCB3ZSBrbm93IHdoZXRoZXIgdGhlCisgICAgICBlbnZpcm9ubWVudCB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQgb3Igbm90LiAgKi8KKyAgU1RBVEVfRU5WSVJPTk1FTlQgKHNkKSA9IEFMTF9FTlZJUk9OTUVOVDsKK30KKworLyogQ29tcGxldGUgYW5kIHZlcmlmeSB0aGUgc2ltdWxhdGlvbiBlbnZpcm9ubWVudC4gICovCisKK1NJTV9SQworc2ltX2NvbmZpZyAoU0lNX0RFU0Mgc2QpCit7CisgIGludCBwcmVmZXJlZF90YXJnZXRfYnl0ZV9vcmRlcjsKKyAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKKworICAvKiBleHRyYWN0IGFsbCByZWxldmFudCBpbmZvcm1hdGlvbiAqLworICBpZiAoU1RBVEVfUFJPR19CRkQgKHNkKSA9PSBOVUxMKQorICAgIHByZWZlcmVkX3RhcmdldF9ieXRlX29yZGVyID0gMDsKKyAgZWxzZQorICAgIHByZWZlcmVkX3RhcmdldF9ieXRlX29yZGVyID0gKGJmZF9saXR0bGVfZW5kaWFuKFNUQVRFX1BST0dfQkZEIChzZCkpCisJCQkJICA/IExJVFRMRV9FTkRJQU4KKwkJCQkgIDogQklHX0VORElBTik7CisKKyAgLyogc2V0IHRoZSBob3N0IGJ5dGUgb3JkZXIgKi8KKyAgY3VycmVudF9ob3N0X2J5dGVfb3JkZXIgPSAxOworICBpZiAoKihjaGFyKikoJmN1cnJlbnRfaG9zdF9ieXRlX29yZGVyKSkKKyAgICBjdXJyZW50X2hvc3RfYnl0ZV9vcmRlciA9IExJVFRMRV9FTkRJQU47CisgIGVsc2UKKyAgICBjdXJyZW50X2hvc3RfYnl0ZV9vcmRlciA9IEJJR19FTkRJQU47CisKKyAgLyogdmVyaWZ5IHRoZSBob3N0IGJ5dGUgb3JkZXIgKi8KKyAgaWYgKENVUlJFTlRfSE9TVF9CWVRFX09SREVSICE9IGN1cnJlbnRfaG9zdF9ieXRlX29yZGVyKQorICAgIHsKKyAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgImhvc3QgKCVzKSBhbmQgY29uZmlndXJlZCAoJXMpIGJ5dGUgb3JkZXIgaW4gY29uZmxpY3QiLAorCQkgICAgICBjb25maWdfYnl0ZV9vcmRlcl90b19hIChjdXJyZW50X2hvc3RfYnl0ZV9vcmRlciksCisJCSAgICAgIGNvbmZpZ19ieXRlX29yZGVyX3RvX2EgKENVUlJFTlRfSE9TVF9CWVRFX09SREVSKSk7CisgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisgICAgfQorCisKKyAgLyogc2V0IHRoZSB0YXJnZXQgYnl0ZSBvcmRlciAqLworI2lmIChXSVRIX1RSRUVfUFJPUEVSVElFUykKKyAgaWYgKGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIgPT0gMCkKKyAgICBjdXJyZW50X3RhcmdldF9ieXRlX29yZGVyCisgICAgICA9ICh0cmVlX2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eSAocm9vdCwgIi9vcHRpb25zL2xpdHRsZS1lbmRpYW4/IikKKwkgPyBMSVRUTEVfRU5ESUFOCisJIDogQklHX0VORElBTik7CisjZW5kaWYKKyAgaWYgKGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIgPT0gMAorICAgICAgJiYgcHJlZmVyZWRfdGFyZ2V0X2J5dGVfb3JkZXIgIT0gMCkKKyAgICBjdXJyZW50X3RhcmdldF9ieXRlX29yZGVyID0gcHJlZmVyZWRfdGFyZ2V0X2J5dGVfb3JkZXI7CisgIGlmIChjdXJyZW50X3RhcmdldF9ieXRlX29yZGVyID09IDApCisgICAgY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlciA9IFdJVEhfVEFSR0VUX0JZVEVfT1JERVI7CisgIGlmIChjdXJyZW50X3RhcmdldF9ieXRlX29yZGVyID09IDApCisgICAgY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlciA9IFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUjsKKworICAvKiB2ZXJpZnkgdGhlIHRhcmdldCBieXRlIG9yZGVyICovCisgIGlmIChDVVJSRU5UX1RBUkdFVF9CWVRFX09SREVSID09IDApCisgICAgeworICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiVGFyZ2V0IGJ5dGUgb3JkZXIgdW5zcGVjaWZpZWRcbiIpOworICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOworICAgIH0KKyAgaWYgKENVUlJFTlRfVEFSR0VUX0JZVEVfT1JERVIgIT0gY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlcikKKyAgICBzaW1faW9fZXByaW50ZiAoc2QsICJUYXJnZXQgKCVzKSBhbmQgY29uZmlndXJlZCAoJXMpIGJ5dGUgb3JkZXIgaW4gY29uZmxpY3RcbiIsCisJCSAgY29uZmlnX2J5dGVfb3JkZXJfdG9fYSAoY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlciksCisJCSAgY29uZmlnX2J5dGVfb3JkZXJfdG9fYSAoQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUikpOworICBpZiAocHJlZmVyZWRfdGFyZ2V0X2J5dGVfb3JkZXIgIT0gMAorICAgICAgJiYgQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiAhPSBwcmVmZXJlZF90YXJnZXRfYnl0ZV9vcmRlcikKKyAgICBzaW1faW9fZXByaW50ZiAoc2QsICJUYXJnZXQgKCVzKSBhbmQgc3BlY2lmaWVkICglcykgYnl0ZSBvcmRlciBpbiBjb25mbGljdFxuIiwKKwkJICBjb25maWdfYnl0ZV9vcmRlcl90b19hIChDVVJSRU5UX1RBUkdFVF9CWVRFX09SREVSKSwKKwkJICBjb25maWdfYnl0ZV9vcmRlcl90b19hIChwcmVmZXJlZF90YXJnZXRfYnl0ZV9vcmRlcikpOworCisKKyAgLyogc2V0IHRoZSBzdGRpbyAqLworICBpZiAoY3VycmVudF9zdGRpbyA9PSAwKQorICAgIGN1cnJlbnRfc3RkaW8gPSBXSVRIX1NURElPOworICBpZiAoY3VycmVudF9zdGRpbyA9PSAwKQorICAgIGN1cnJlbnRfc3RkaW8gPSBET19VU0VfU1RESU87CisKKyAgLyogdmVyaWZ5IHRoZSBzdGRpbyAqLworICBpZiAoQ1VSUkVOVF9TVERJTyA9PSAwKQorICAgIHsKKyAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlRhcmdldCBzdGFuZGFyZCBJTyB1bnNwZWNpZmllZFxuIik7CisgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisgICAgfQorICBpZiAoQ1VSUkVOVF9TVERJTyAhPSBjdXJyZW50X3N0ZGlvKQorICAgIHsKKyAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlRhcmdldCAoJXMpIGFuZCBjb25maWd1cmVkICglcykgc3RhbmRhcmQgSU8gaW4gY29uZmxpY3RcbiIsCisJCSAgICAgIGNvbmZpZ19zdGRpb190b19hIChDVVJSRU5UX1NURElPKSwKKwkJICAgICAgY29uZmlnX3N0ZGlvX3RvX2EgKGN1cnJlbnRfc3RkaW8pKTsKKyAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKyAgICB9CisgIAorICAKKyAgLyogY2hlY2sgdGhlIHZhbHVlIG9mIE1TQiAqLworICBpZiAoV0lUSF9UQVJHRVRfV09SRF9NU0IgIT0gMAorICAgICAgJiYgV0lUSF9UQVJHRVRfV09SRF9NU0IgIT0gKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSAtIDEpKQorICAgIHsKKyAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlRhcmdldCBiaXRzaXplICglZCkgY29udHJhZGljdHMgdGFyZ2V0IG1vc3Qgc2lnbmlmaWNhbnQgYml0ICglZClcbiIsCisJCSAgICAgIFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSwgV0lUSF9UQVJHRVRfV09SRF9NU0IpOworICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOworICAgIH0KKyAgCisgIAorICAvKiBzZXQgdGhlIGVudmlyb25tZW50ICovCisjaWYgKFdJVEhfVFJFRV9QUk9QRVJUSUVTKQorICBpZiAoU1RBVEVfRU5WSVJPTk1FTlQgKHNkKSA9PSBBTExfRU5WSVJPTk1FTlQpCisgICAgeworICAgICAgY29uc3QgY2hhciAqZW52ID0KKwl0cmVlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5KHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy9lbnYiKTsKKyAgICAgIFNUQVRFX0VOVklST05NRU5UIChzZCkgPSAoKHN0cmNtcChlbnYsICJ1c2VyIikgPT0gMAorCQkJCSB8fCBzdHJjbXAoZW52LCAidWVhIikgPT0gMCkKKwkJCQk/IFVTRVJfRU5WSVJPTk1FTlQKKwkJCQk6IChzdHJjbXAoZW52LCAidmlydHVhbCIpID09IDAKKwkJCQkgICB8fCBzdHJjbXAoZW52LCAidmVhIikgPT0gMCkKKwkJCQk/IFZJUlRVQUxfRU5WSVJPTk1FTlQKKwkJCQk6IChzdHJjbXAoZW52LCAib3BlcmF0aW5nIikgPT0gMAorCQkJCSAgIHx8IHN0cmNtcChlbnYsICJvZWEiKSA9PSAwKQorCQkJCT8gT1BFUkFUSU5HX0VOVklST05NRU5UCisJCQkJOiBBTExfRU5WSVJPTk1FTlQpOworICAgIH0KKyNlbmRpZgorICBpZiAoU1RBVEVfRU5WSVJPTk1FTlQgKHNkKSA9PSBBTExfRU5WSVJPTk1FTlQpCisgICAgU1RBVEVfRU5WSVJPTk1FTlQgKHNkKSA9IERFRkFVTFRfRU5WSVJPTk1FTlQ7CisgIAorICAKKyAgLyogc2V0IHRoZSBhbGlnbm1lbnQgKi8KKyNpZiAoV0lUSF9UUkVFX1BST1BFUlRJRVMpCisgIGlmIChjdXJyZW50X2FsaWdubWVudCA9PSAwKQorICAgIGN1cnJlbnRfYWxpZ25tZW50ID0KKyAgICAgICh0cmVlX2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eShyb290LCAiL29wZW5wcm9tL29wdGlvbnMvc3RyaWN0LWFsaWdubWVudD8iKQorICAgICAgID8gU1RSSUNUX0FMSUdOTUVOVAorICAgICAgIDogTk9OU1RSSUNUX0FMSUdOTUVOVCk7CisjZW5kaWYKKyAgaWYgKGN1cnJlbnRfYWxpZ25tZW50ID09IDApCisgICAgY3VycmVudF9hbGlnbm1lbnQgPSBXSVRIX0FMSUdOTUVOVDsKKyAgaWYgKGN1cnJlbnRfYWxpZ25tZW50ID09IDApCisgICAgY3VycmVudF9hbGlnbm1lbnQgPSBXSVRIX0RFRkFVTFRfQUxJR05NRU5UOworICAKKyAgLyogdmVyaWZ5IHRoZSBhbGlnbm1lbnQgKi8KKyAgaWYgKENVUlJFTlRfQUxJR05NRU5UID09IDApCisgICAgeworICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiVGFyZ2V0IGFsaWdubWVudCB1bnNwZWNpZmllZFxuIik7CisgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisgICAgfQorICBpZiAoQ1VSUkVOVF9BTElHTk1FTlQgIT0gY3VycmVudF9hbGlnbm1lbnQpCisgICAgeworICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiVGFyZ2V0ICglcykgYW5kIGNvbmZpZ3VyZWQgKCVzKSBhbGlnbm1lbnQgaW4gY29uZmxpY3RcbiIsCisJCSAgICAgIGNvbmZpZ19hbGlnbm1lbnRfdG9fYSAoQ1VSUkVOVF9BTElHTk1FTlQpLAorCQkgICAgICBjb25maWdfYWxpZ25tZW50X3RvX2EgKGN1cnJlbnRfYWxpZ25tZW50KSk7CisgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisgICAgfQorICAKKyNpZiBkZWZpbmVkIChXSVRIX0ZMT0FUSU5HX1BPSU5UKQorICAKKyAgLyogc2V0IHRoZSBmbG9hdGluZyBwb2ludCAqLworICBpZiAoY3VycmVudF9mbG9hdGluZ19wb2ludCA9PSAwKQorICAgIGN1cnJlbnRfZmxvYXRpbmdfcG9pbnQgPSBXSVRIX0ZMT0FUSU5HX1BPSU5UOworICAKKyAgLyogdmVyaWZ5IHRoZSBmbG9hdGluZyBwb2ludCAqLworICBpZiAoQ1VSUkVOVF9GTE9BVElOR19QT0lOVCA9PSAwKQorICAgIHsKKyAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlRhcmdldCBmbG9hdGluZy1wb2ludCB1bnNwZWNpZmllZFxuIik7CisgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisgICAgfQorICBpZiAoQ1VSUkVOVF9GTE9BVElOR19QT0lOVCAhPSBjdXJyZW50X2Zsb2F0aW5nX3BvaW50KQorICAgIHsKKyAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlRhcmdldCAoJXMpIGFuZCBjb25maWd1cmVkICglcykgZmxvYXRpbmctcG9pbnQgaW4gY29uZmxpY3RcbiIsCisJCSAgICAgIGNvbmZpZ19hbGlnbm1lbnRfdG9fYSAoQ1VSUkVOVF9GTE9BVElOR19QT0lOVCksCisJCSAgICAgIGNvbmZpZ19hbGlnbm1lbnRfdG9fYSAoY3VycmVudF9mbG9hdGluZ19wb2ludCkpOworICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOworICAgIH0KKyAgCisjZW5kaWYKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworCit2b2lkCitwcmludF9zaW1fY29uZmlnIChTSU1fREVTQyBzZCkKK3sKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19WRVJTSU9OX18pCisgIHNpbV9pb19wcmludGYgKHNkLCAiQ29tcGlsZWQgYnkgR0NDICVzIG9uICVzICVzXG4iLAorCQkJICBfX1ZFUlNJT05fXywgX19EQVRFX18sIF9fVElNRV9fKTsKKyNlbHNlCisgIHNpbV9pb19wcmludGYgKHNkLCAiQ29tcGlsZWQgb24gJXMgJXNcbiIsIF9fREFURV9fLCBfX1RJTUVfXyk7CisjZW5kaWYKKworICBzaW1faW9fcHJpbnRmIChzZCwgIldJVEhfVEFSR0VUX0JZVEVfT1JERVIgICA9ICVzXG4iLAorCQkgY29uZmlnX2J5dGVfb3JkZXJfdG9fYSAoV0lUSF9UQVJHRVRfQllURV9PUkRFUikpOworCisgIHNpbV9pb19wcmludGYgKHNkLCAiV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSICAgPSAlc1xuIiwKKwkJIGNvbmZpZ19ieXRlX29yZGVyX3RvX2EgKFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUikpOworCisgIHNpbV9pb19wcmludGYgKHNkLCAiV0lUSF9IT1NUX0JZVEVfT1JERVIgICAgID0gJXNcbiIsCisJCSBjb25maWdfYnl0ZV9vcmRlcl90b19hIChXSVRIX0hPU1RfQllURV9PUkRFUikpOworCisgIHNpbV9pb19wcmludGYgKHNkLCAiV0lUSF9TVERJTyAgICAgICAgICAgICAgID0gJXNcbiIsCisJCSBjb25maWdfc3RkaW9fdG9fYSAoV0lUSF9TVERJTykpOworCisgIHNpbV9pb19wcmludGYgKHNkLCAiV0lUSF9UQVJHRVRfV09SRF9NU0IgICAgID0gJWRcbiIsCisJCSBXSVRIX1RBUkdFVF9XT1JEX01TQik7CisKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICJXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPSAlZFxuIiwKKwkJIFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSk7CisKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICJXSVRIX1RBUkdFVF9BRERSRVNTX0JJVFNJWkUgPSAlZFxuIiwKKwkJIFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRSk7CisKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICJXSVRIX1RBUkdFVF9DRUxMX0JJVFNJWkUgPSAlZFxuIiwKKwkJIFdJVEhfVEFSR0VUX0NFTExfQklUU0laRSk7CisKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICJXSVRIX1RBUkdFVF9GTE9BVElOR19QT0lOVF9CSVRTSVpFID0gJWRcbiIsCisJCSBXSVRIX1RBUkdFVF9GTE9BVElOR19QT0lOVF9CSVRTSVpFKTsKKworICBzaW1faW9fcHJpbnRmIChzZCwgIldJVEhfRU5WSVJPTk1FTlQgPSAlc1xuIiwKKwkJIGNvbmZpZ19lbnZpcm9ubWVudF90b19hIChXSVRIX0VOVklST05NRU5UKSk7CisKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICJXSVRIX0FMSUdOTUVOVCA9ICVzXG4iLAorCQkgY29uZmlnX2FsaWdubWVudF90b19hIChXSVRIX0FMSUdOTUVOVCkpOworCisjaWYgZGVmaW5lZCAoV0lUSF9ERUZBVUxUX0FMSUdOTUVOVCkKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICJXSVRIX0RFRkFVTFRfQUxJR05NRU5UID0gJXNcbiIsCisJCSBjb25maWdfYWxpZ25tZW50X3RvX2EgKFdJVEhfREVGQVVMVF9BTElHTk1FTlQpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoV0lUSF9YT1JfRU5ESUFOKQorICBzaW1faW9fcHJpbnRmIChzZCwgIldJVEhfWE9SX0VORElBTiA9ICVkXG4iLCBXSVRIX1hPUl9FTkRJQU4pOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChXSVRIX0ZMT0FUSU5HX1BPSU5UKQorICBzaW1faW9fcHJpbnRmIChzZCwgIldJVEhfRkxPQVRJTkdfUE9JTlQgPSAlc1xuIiwKKwkJIGNvbmZpZ19mbG9hdGluZ19wb2ludF90b19hIChXSVRIX0ZMT0FUSU5HX1BPSU5UKSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKFdJVEhfU01QKQorICBzaW1faW9fcHJpbnRmIChzZCwgIldJVEhfU01QID0gJWRcbiIsIFdJVEhfU01QKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoV0lUSF9SRVNFUlZFRF9CSVRTKQorICBzaW1faW9fcHJpbnRmIChzZCwgIldJVEhfUkVTRVJWRURfQklUUyA9ICVkXG4iLCBXSVRIX1JFU0VSVkVEX0JJVFMpOworI2VuZGlmCisJCSAKKyNpZiBkZWZpbmVkIChXSVRIX1BST0ZJTEUpCisgIHNpbV9pb19wcmludGYgKHNkLCAiV0lUSF9QUk9GSUxFID0gJWRcbiIsIFdJVEhfUFJPRklMRSk7CisjZW5kaWYKKwkJIAorfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tY29uZmlnLmggYi9zaW0vY29tbW9uL3NpbS1jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzIwNzEyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tY29uZmlnLmgKQEAgLTAsMCArMSw1OTQgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgU0lNX0NPTkZJR19ICisjZGVmaW5lIFNJTV9DT05GSUdfSAorCisKKy8qIEhvc3QgZGVwZW5kYW50OgorCisgICBUaGUgQ1BQIGJlbG93IGRlZmluZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGF0aW9uIGhvc3QuICBJbgorICAgcGFydGljdWxhciBpdCBkZWZpbmVzIHRoZSBtYWNybydzOgorCisgICAJV0lUSF9IT1NUX0JZVEVfT1JERVIJVGhlIGJ5dGUgb3JkZXIgb2YgdGhlIGhvc3QuIENvdWxkCisJCQkJYmUgYW55IG9mIExJVFRMRV9FTkRJQU4sIEJJR19FTkRJQU4KKwkJCQlvciAwICh1bmtub3duKS4gIFRob3NlIG1hY3JvJ3MgYWxzbworCQkJCW5lZWQgdG8gYmUgZGVmaW5lZC4KKworICovCisKKworLyogTmV0QlNEOgorCisgICBOZXRCU0QgaXMgZWFzeSwgZXZlcnl0aGluZyB5b3UgY291bGQgZXZlciB3YW50IGlzIGluIGEgaGVhZGVyIGZpbGUKKyAgICh3ZWxsIGFsbW9zdCA6LSkgKi8KKworI2lmIGRlZmluZWQoX19OZXRCU0RfXykKKyMgaW5jbHVkZSA8bWFjaGluZS9lbmRpYW4uaD4KKyMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCisjICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgorIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIEJZVEVfT1JERVIKKyMgZW5kaWYKKyMgaWYgKEJZVEVfT1JERVIgIT0gV0lUSF9IT1NUX0JZVEVfT1JERVIpCisjICBlcnJvciAiaG9zdCBlbmRpYW4gaW5jb3JyZWN0bHkgY29uZmlndXJlZCwgY2hlY2sgY29uZmlnLmgiCisjIGVuZGlmCisjZW5kaWYKKworLyogTGludXggaXMgc2ltaWxhcmx5IGVhc3kuICAqLworCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisjIGluY2x1ZGUgPGVuZGlhbi5oPgorIyBpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikgJiYgIWRlZmluZWQoTElUVExFX0VORElBTikKKyMgIGRlZmluZSBMSVRUTEVfRU5ESUFOIF9fTElUVExFX0VORElBTgorIyBlbmRpZgorIyBpZiBkZWZpbmVkKF9fQklHX0VORElBTikgJiYgIWRlZmluZWQoQklHX0VORElBTikKKyMgIGRlZmluZSBCSUdfRU5ESUFOIF9fQklHX0VORElBTgorIyBlbmRpZgorIyBpZiBkZWZpbmVkKF9fQllURV9PUkRFUikgJiYgIWRlZmluZWQoQllURV9PUkRFUikKKyMgIGRlZmluZSBCWVRFX09SREVSIF9fQllURV9PUkRFUgorIyBlbmRpZgorIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgPT0gMCkKKyMgIHVuZGVmIFdJVEhfSE9TVF9CWVRFX09SREVSCisjICBkZWZpbmUgV0lUSF9IT1NUX0JZVEVfT1JERVIgQllURV9PUkRFUgorIyBlbmRpZgorIyBpZiAoQllURV9PUkRFUiAhPSBXSVRIX0hPU1RfQllURV9PUkRFUikKKyMgIGVycm9yICJob3N0IGVuZGlhbiBpbmNvcnJlY3RseSBjb25maWd1cmVkLCBjaGVjayBjb25maWcuaCIKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBJTlNFUlQgSEVSRSAtIGhvc3RzIHRoYXQgaGF2ZSBhdmFpbGFibGUgTElUVExFX0VORElBTiBhbmQKKyAgIEJJR19FTkRJQU4gbWFjcm8ncyAqLworCisKKy8qIFNvbWUgaG9zdHMgZG9uJ3QgZGVmaW5lIExJVFRMRV9FTkRJQU4gb3IgQklHX0VORElBTiwgaGVscCB0aGVtIG91dCAqLworCisjaWZuZGVmIExJVFRMRV9FTkRJQU4KKyNkZWZpbmUgTElUVExFX0VORElBTiAxMjM0CisjZW5kaWYKKyNpZm5kZWYgQklHX0VORElBTgorI2RlZmluZSBCSUdfRU5ESUFOIDQzMjEKKyNlbmRpZgorCisKKy8qIFN1bk9TIG9uIFNQQVJDOgorCisgICBCaWcgZW5kaWFuIGxhc3QgdGltZSBJIGxvb2tlZCAqLworCisjaWYgZGVmaW5lZChzcGFyYykgfHwgZGVmaW5lZChfX3NwYXJjX18pCisjIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSAwKQorIyAgdW5kZWYgV0lUSF9IT1NUX0JZVEVfT1JERVIKKyMgIGRlZmluZSBXSVRIX0hPU1RfQllURV9PUkRFUiBCSUdfRU5ESUFOCisjIGVuZGlmCisjIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOKQorIyAgZXJyb3IgInN1biB3YXMgYmlnIGVuZGlhbiBsYXN0IHRpbWUgSSBsb29rZWQgLi4uIgorIyBlbmRpZgorI2VuZGlmCisKKworLyogUmFuZG9tIHg4NgorCisgICBMaXR0bGUgZW5kaWFuIGxhc3QgdGltZSBJIGxvb2tlZCAqLworCisjaWYgZGVmaW5lZChpMzg2KSB8fCBkZWZpbmVkKGk0ODYpIHx8IGRlZmluZWQoaTU4NikgfHwgZGVmaW5lZCAoaTY4NikgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2k0ODZfXykgfHwgZGVmaW5lZChfX2k1ODZfXykgfHwgZGVmaW5lZCAoX19pNjg2X18pCisjIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSAwKQorIyAgdW5kZWYgV0lUSF9IT1NUX0JZVEVfT1JERVIKKyMgIGRlZmluZSBXSVRIX0hPU1RfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisjIGVuZGlmCisjIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiAhPSBMSVRUTEVfRU5ESUFOKQorIyAgZXJyb3IgIng4NiB3YXMgbGl0dGxlIGVuZGlhbiBsYXN0IHRpbWUgSSBsb29rZWQgLi4uIgorIyBlbmRpZgorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCAoX19pNDg2X18pIHx8IGRlZmluZWQgKF9faTU4Nl9fKSB8fCBkZWZpbmVkIChfX2k2ODZfXykpICYmIGRlZmluZWQoX19HTlVDX18pICYmIFdJVEhfQlNXQVAKKyN1bmRlZiAgaHRvbmwKKyN1bmRlZiAgbnRvaGwKKyNkZWZpbmUgaHRvbmwoSU4pIF9fZXh0ZW5zaW9uX18gKHsgaW50IF9vdXQ7IF9fYXNtX18gKCJic3dhcCAlMCIgOiAiPXIiIChfb3V0KSA6ICIwIiAoSU4pKTsgX291dDsgfSkKKyNkZWZpbmUgbnRvaGwoSU4pIF9fZXh0ZW5zaW9uX18gKHsgaW50IF9vdXQ7IF9fYXNtX18gKCJic3dhcCAlMCIgOiAiPXIiIChfb3V0KSA6ICIwIiAoSU4pKTsgX291dDsgfSkKKyNlbmRpZgorCisvKiBQb3dlciBvciBQb3dlclBDIHJ1bm5pbmcgQUlYICAqLworI2lmIGRlZmluZWQoX1BPV0VSKSAmJiBkZWZpbmVkKF9BSVgpCisjIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSAwKQorIyAgdW5kZWYgV0lUSF9IT1NUX0JZVEVfT1JERVIKKyMgIGRlZmluZSBXSVRIX0hPU1RfQllURV9PUkRFUiBCSUdfRU5ESUFOCisjIGVuZGlmCisjIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOKQorIyAgZXJyb3IgIlBvd2VyL1Bvd2VyUEMgQUlYIHdhcyBiaWcgZW5kaWFuIGxhc3QgdGltZSBJIGxvb2tlZCAuLi4iCisjIGVuZGlmCisjZW5kaWYKKworLyogU29sYXJpcyBydW5uaW5nIFBvd2VyUEMgKi8KKyNpZiBkZWZpbmVkKF9fUFBDKSAmJiBkZWZpbmVkKF9fc3VuX18pCisjIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSAwKQorIyAgdW5kZWYgV0lUSF9IT1NUX0JZVEVfT1JERVIKKyMgIGRlZmluZSBXSVRIX0hPU1RfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisjIGVuZGlmCisjIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiAhPSBMSVRUTEVfRU5ESUFOKQorIyAgZXJyb3IgIlNvbGFyaXMgb24gUG93ZXJQQ3Mgd2FzIGxpdHRsZSBlbmRpYW4gbGFzdCB0aW1lIEkgbG9va2VkIC4uLiIKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBIUC9QQSAqLworI2lmIGRlZmluZWQoX19ocHBhX18pCisjIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSAwKQorIyAgdW5kZWYgV0lUSF9IT1NUX0JZVEVfT1JERVIKKyMgIGRlZmluZSBXSVRIX0hPU1RfQllURV9PUkRFUiBCSUdfRU5ESUFOCisjIGVuZGlmCisjIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOKQorIyAgZXJyb3IgIkhQL1BBIHdhcyBiaWcgZW5kaWFuIGxhc3QgdGltZSBJIGxvb2tlZCAuLi4iCisjIGVuZGlmCisjZW5kaWYKKworLyogQmlnIGVuZGlhbiBNSVBTICovCisjaWYgZGVmaW5lZChfX01JUFNFQl9fKQorIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgPT0gMCkKKyMgIHVuZGVmIFdJVEhfSE9TVF9CWVRFX09SREVSCisjICBkZWZpbmUgV0lUSF9IT1NUX0JZVEVfT1JERVIgQklHX0VORElBTgorIyBlbmRpZgorIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgIT0gQklHX0VORElBTikKKyMgIGVycm9yICJNSVBTRUIgd2FzIGJpZyBlbmRpYW4gbGFzdCB0aW1lIEkgbG9va2VkIC4uLiIKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBMaXR0bGUgZW5kaWFuIE1JUFMgKi8KKyNpZiBkZWZpbmVkKF9fTUlQU0VMX18pCisjIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSAwKQorIyAgdW5kZWYgV0lUSF9IT1NUX0JZVEVfT1JERVIKKyMgIGRlZmluZSBXSVRIX0hPU1RfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisjIGVuZGlmCisjIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiAhPSBMSVRUTEVfRU5ESUFOKQorIyAgZXJyb3IgIk1JUFNFTCB3YXMgbGl0dGxlIGVuZGlhbiBsYXN0IHRpbWUgSSBsb29rZWQgLi4uIgorIyBlbmRpZgorI2VuZGlmCisKKy8qIFdpbmRvd3MgTlQgKi8KKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykKKyMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCisjICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgorIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyMgZW5kaWYKKyMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSICE9IExJVFRMRV9FTkRJQU4pCisjICBlcnJvciAiV2luZG93cyBOVCB3YXMgbGl0dGxlIGVuZGlhbiBsYXN0IHRpbWUgSSBsb29rZWQgLi4uIgorIyBlbmRpZgorI2VuZGlmCisKKy8qIEFscGhhIHJ1bm5pbmcgREVDIHVuaXggKi8KKyNpZiBkZWZpbmVkKF9fb3NmX18pICYmIGRlZmluZWQoX19hbHBoYV9fKQorIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgPT0gMCkKKyMgIHVuZGVmIFdJVEhfSE9TVF9CWVRFX09SREVSCisjICBkZWZpbmUgV0lUSF9IT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgorIyBlbmRpZgorIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgIT0gTElUVExFX0VORElBTikKKyMgIGVycm9yICJBWFAgcnVubmluZyBERUMgdW5peCB3YXMgbGl0dGxlIGVuZGlhbiBsYXN0IHRpbWUgSSBsb29rZWQgLi4uIgorIyBlbmRpZgorI2VuZGlmCisKKworLyogSU5TRVJUIEhFUkUgLSBhZGRpdGlvbmFsIGhvc3RzIHRoYXQgZG8gbm90IGhhdmUgTElUVExFX0VORElBTiBhbmQKKyAgIEJJR19FTkRJQU4gZGVmaW5pdGlvbnMgYXZhaWxhYmxlLiAgKi8KKwwKKy8qIFVudGlsIGRldmljZXMgYW5kIHRyZWUgcHJvcGVydGllcyBhcmUgc29ydGVkIG91dCwgdGVsbCBzaW0tY29uZmlnLmMKKyAgIG5vdCB0byBjYWxsIHRoZSB0cmVlX2ZpbmRfZm9vIGZucy4gICovCisjZGVmaW5lIFdJVEhfVFJFRV9QUk9QRVJUSUVTIDAKKworCisvKiBlbmRpYW5uZXNzIG9mIHRoZSBob3N0L3RhcmdldDoKKworICAgSWYgdGhlIGJ1aWxkIHByb2Nlc3MgaXMgYXdhcmUgKGF0IGNvbXBpbGUgdGltZSkgb2YgdGhlIGVuZGlhbm5lc3MKKyAgIG9mIHRoZSBob3N0L3RhcmdldCBpdCBpcyBhYmxlIHRvIGVsaW1pbmF0ZSBzbG93ZXIgZ2VuZXJpYyBlbmRpYW4KKyAgIGhhbmRsaW5nIGNvZGUuCisKKyAgIFBvc3NpYmxlIHZhbHVlcyBhcmUgMCAodW5rbm93biksIExJVFRMRV9FTkRJQU4sIEJJR19FTkRJQU4gKi8KKworI2lmbmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgorI2RlZmluZSBXSVRIX0hPU1RfQllURV9PUkRFUgkJMCAvKnVua25vd24qLworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9UQVJHRVRfQllURV9PUkRFUgorI2RlZmluZSBXSVRIX1RBUkdFVF9CWVRFX09SREVSCQkwIC8qdW5rbm93biovCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVIKKyNkZWZpbmUgV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSIDAgLyogZmF0YWwgKi8KKyNlbmRpZgorCitleHRlcm4gaW50IGN1cnJlbnRfaG9zdF9ieXRlX29yZGVyOworI2RlZmluZSBDVVJSRU5UX0hPU1RfQllURV9PUkRFUiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgXAorCQkJCSA/IFdJVEhfSE9TVF9CWVRFX09SREVSIFwKKwkJCQkgOiBjdXJyZW50X2hvc3RfYnl0ZV9vcmRlcikKK2V4dGVybiBpbnQgY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlcjsKKyNkZWZpbmUgQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiAoV0lUSF9UQVJHRVRfQllURV9PUkRFUiBcCisJCQkJICAgPyBXSVRIX1RBUkdFVF9CWVRFX09SREVSIFwKKwkJCQkgICA6IGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIpCisKKworCisvKiBYT1IgZW5kaWFuLgorCisgICBJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUsIHRoZSBzaW11bGF0b3IgY2FuIHN1cHBvcnQgdGhlIGhvcnJpYmxlCisgICBYT1IgZW5kaWFuIG1vZGUgKGFzIGZvdW5kIGluIHRoZSBQb3dlclBDIGFuZCBNSVBTIElTQSkuICBTZWUKKyAgIHNpbS1jb3JlIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisgICBJZiBXSVRIX1hPUl9FTkRJQU4gaXMgbm9uLXplcm8sIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgICBwb3RlbnRpYWxseSBpbnZvbHZlZCBpbiB0aGUgWE9SIG11bmdlLiBBIHR5cGljYWwgdmFsdWUgaXMgOC4gKi8KKworI2lmbmRlZiBXSVRIX1hPUl9FTkRJQU4KKyNkZWZpbmUgV0lUSF9YT1JfRU5ESUFOCQkwCisjZW5kaWYKKworCisKKy8qIEludGVsIGhvc3QgQlNXQVAgc3VwcG9ydDoKKworICAgV2hldGhlciB0byB1c2UgYnN3YXAgb24gdGhlIDQ4NiBhbmQgcGVudGl1bXMgcmF0aGVyIHRoYW4gdGhlIDM4NgorICAgc2VxdWVuY2UgdGhhdCB1c2VzIHhjaGdiL3JvcmwveGNoZ2IgKi8KKyNpZm5kZWYgV0lUSF9CU1dBUAorI2RlZmluZQlXSVRIX0JTV0FQIDAKKyNlbmRpZgorCisKKworLyogU01QIHN1cHBvcnQ6CisKKyAgIFNldHMgYSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHByb2Nlc3NvcnMgdGhhdCBjYW4gYmUgc2ltdWxhdGVkLiAgSWYKKyAgIFdJVEhfU01QIGlzIHNldCB0byB6ZXJvICgwKSwgdGhlIHNpbXVsYXRvciBpcyByZXN0cmljdGVkIHRvCisgICBzdXBvcnRpbmcgb25seSBvbmUgcHJvY2Vzc29yIChhbmQgYXMgYSBjb25zZXF1ZW5jZSBsZWF2ZXMgdGhlIFNNUAorICAgY29kZSBvdXQgb2YgdGhlIGJ1aWxkIHByb2Nlc3MpLgorCisgICBUaGUgYWN0dWFsIG51bWJlciBvZiBwcm9jZXNzb3JzIGlzIHRha2VuIGZyb20gdGhlIGRldmljZQorICAgL29wdGlvbnMvc21wQDxuci1jcHU+ICovCisKKyNpZiBkZWZpbmVkIChXSVRIX1NNUCkgJiYgKFdJVEhfU01QID4gMCkKKyNkZWZpbmUgTUFYX05SX1BST0NFU1NPUlMJCVdJVEhfU01QCisjZW5kaWYKKworI2lmbmRlZiBNQVhfTlJfUFJPQ0VTU09SUworI2RlZmluZSBNQVhfTlJfUFJPQ0VTU09SUwkJMQorI2VuZGlmCisKKworLyogU2l6ZSBvZiB0YXJnZXQgd29yZCwgYWRkcmVzcyBhbmQgT3BlbkZpcm13YXJlIENlbGw6CisKKyAgIFRoZSB0YXJnZXQgd29yZCBzaXplIGlzIGRldGVybWluZWQgYnkgdGhlIG5hdHVyYWwgc2l6ZSBvZiBpdHMKKyAgIHJlZ2luc3RlcnMuCisKKyAgIE9uIG1vc3QgaG9zdHMsIHRoZSBhZGRyZXNzIGFuZCBjZWxsIGFyZSB0aGUgc2FtZSBzaXplIGFzIGEgdGFyZ2V0CisgICB3b3JkLiAgKi8KKworI2lmbmRlZiBXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUKKyNkZWZpbmUgV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFICAgICAgICAzMgorI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9UQVJHRVRfQUREUkVTU19CSVRTSVpFCisjZGVmaW5lIFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRQlXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfVEFSR0VUX0NFTExfQklUU0laRQorI2RlZmluZSBXSVRIX1RBUkdFVF9DRUxMX0JJVFNJWkUJV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX1RBUkdFVF9GTE9BVElOR19QT0lOVF9CSVRTSVpFCisjZGVmaW5lIFdJVEhfVEFSR0VUX0ZMT0FUSU5HX1BPSU5UX0JJVFNJWkUgNjQKKyNlbmRpZgorCisKKworLyogTW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGFyZ2V0OgorCisgICBTZXQgdGhpcyBhY2NvcmRpbmcgdG8geW91ciB0YXJnZXQncyBiaXQgbnVtYmVyaW5nIGNvbnZlbnRpb24uICBGb3IKKyAgIHRoZSBQb3dlclBDIGl0IGlzIHplcm8sIGZvciBtYW55IG90aGVyIHRhcmdldHMgaXQgaXMgMzEgb3IgNjMuCisKKyAgIEZvciB0YXJnZXRzIHRoYXQgY2FuIGJvdGggaGF2ZSBlaXRoZXIgMzIgb3IgNjQgYml0IHdvcmRzIGFuZCBudW1iZXIKKyAgIE1TQiBhcyAzMSwgNjMuICBEZWZpbmUgdGhpcyB0byBiZSAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFIC0gMSkgKi8KKworI2lmbmRlZiBXSVRIX1RBUkdFVF9XT1JEX01TQgorI2RlZmluZSBXSVRIX1RBUkdFVF9XT1JEX01TQiAgICAgICAgICAgIDAKKyNlbmRpZgorCisKKworLyogUHJvZ3JhbSBlbnZpcm9ubWVudDoKKworICAgVGhyZWUgZW52aXJvbm1lbnRzIGFyZSBhdmFpbGFibGUgLSBVRUEgKHVzZXIpLCBWRUEgKHZpcnR1YWwpIGFuZAorICAgT0VBIChwZXJhdGluZykuICBUaGUgZm9ybWVyIHR3byBhcmUgZW52aXJvbm1lbnQgdGhhdCB1c2VycyB3b3VsZAorICAgZXhwZWN0IHRvIHNlZSAoVkVBIGluY2x1ZGVzIHRoaW5ncyBsaWtlIGNvaGVyZW5jeSBhbmQgdGhlIHRpbWUKKyAgIGJhc2UpIHdoaWxlIE9FQSBpcyB3aGF0IGFuIG9wZXJhdGluZyBzeXN0ZW0gZXhwZWN0cyB0byBzZWUuICBCeQorICAgc2V0dGluZyB0aGVzZSB0byBzcGVjaWZpYyB2YWx1ZXMsIHRoZSBidWlsZCBwcm9jZXNzIGlzIGFibGUgdG8KKyAgIGVsaW1pbmF0ZSBub24gcmVsZXZlbnQgZW52aXJvbm1lbnQgY29kZS4KKworICAgU1RBVEVfRU5WSVJPTk1FTlQoc2QpIHNwZWNpZmllcyB3aGljaCBvZiB2ZWEgb3Igb2VhIGlzIHJlcXVpcmVkIGZvcgorICAgdGhlIGN1cnJlbnQgcnVudGltZS4KKworICAgQUxMX0VOVklST05NRU5UIGlzIHVzZWQgZHVyaW5nIGNvbmZpZ3VyYXRpb24gYXMgYSB2YWx1ZSBmb3IKKyAgIFdJVEhfRU5WSVJPTk1FTlQgdG8gaW5kaWNhdGUgdGhlIGNob2ljZSBpcyBydW50aW1lIHNlbGVjdGFibGUuCisgICBUaGUgZGVmYXVsdCBpcyB0aGVuIFVTRVJfRU5WSVJPTk1FTlQgW3NpbmNlIGFsbG93aW5nIHRoZSB1c2VyIHRvIGNob29zZQorICAgdGhlIGRlZmF1bHQgYXQgY29uZmlndXJlIHRpbWUgc2VlbXMgbGlrZSBmZWF0dXJpdGlzIGFuZCBzaW5jZSBwZW9wbGUgdXNpbmcKKyAgIE9QRVJBVElOR19FTlZJUk9OTUVOVCBoYXZlIG1vcmUgdG8gd29ycnkgYWJvdXQgdGhhbiBzZWxlY3RpbmcgdGhlCisgICBkZWZhdWx0XS4KKyAgIEFMTF9FTlZJUk9OTUVOVCBpcyBhbHNvIHVzZWQgdG8gc2V0IFNUQVRFX0VOVklST05NRU5UIHRvIHRoZQorICAgInVuaW5pdGlhbGl6ZWQiIHN0YXRlLiAgKi8KKworZW51bSBzaW1fZW52aXJvbm1lbnQgeworICBBTExfRU5WSVJPTk1FTlQsCisgIFVTRVJfRU5WSVJPTk1FTlQsCisgIFZJUlRVQUxfRU5WSVJPTk1FTlQsCisgIE9QRVJBVElOR19FTlZJUk9OTUVOVAorfTsKKworLyogSWYgdGhlIHNpbXVsYXRvciBzcGVjaWZpZWQgU0lNX0FDX09QVElPTl9FTlZJUk9OTUVOVCwgaW5kaWNhdGUgc28uICAqLworI2lmZGVmIFdJVEhfRU5WSVJPTk1FTlQKKyNkZWZpbmUgU0lNX0hBVkVfRU5WSVJPTk1FTlQKKyNlbmRpZgorCisvKiBJZiB0aGUgc2ltdWxhdG9yIGRvZXNuJ3Qgc3BlY2lmeSBTSU1fQUNfT1BUSU9OX0VOVklST05NRU5UIGluIGl0cworICAgY29uZmlndXJlLmluLCB0aGUgb25seSBzdXBwb3J0ZWQgZW52aXJvbm1lbnQgaXMgdGhlIHVzZXIgZW52aXJvbm1lbnQuICAqLworI2lmbmRlZiBXSVRIX0VOVklST05NRU5UCisjZGVmaW5lIFdJVEhfRU5WSVJPTk1FTlQgVVNFUl9FTlZJUk9OTUVOVAorI2VuZGlmCisKKyNkZWZpbmUgREVGQVVMVF9FTlZJUk9OTUVOVCAoV0lUSF9FTlZJUk9OTUVOVCAhPSBBTExfRU5WSVJPTk1FTlQgXAorCQkJICAgICA/IFdJVEhfRU5WSVJPTk1FTlQgXAorCQkJICAgICA6IFVTRVJfRU5WSVJPTk1FTlQpCisKKworLyogQ2FsbGJhY2sgJiBNb2R1bG8gTWVtb3J5LgorCisgICBDb3JlIGluY2x1ZGVzIGEgYnVpbHRpbiBtZW1vcnkgdHlwZSAocmF3X21lbW9yeSkgdGhhdCBpcworICAgaW1wbGVtZW50ZWQgdXNpbmcgYW4gYXJyYXkuICByYXdfbWVtb3J5IGRvZXMgbm90IHJlcXVpcmUgYW55CisgICBhZGRpdGlvbmFsIGZ1bmN0aW9ucyBldGMuCisKKyAgIENhbGxiYWNrIG1lbW9yeSBpcyB3aGVyZSB0aGUgY29yZSBjYWxscyBhIGNvcmUgZGV2aWNlIGZvciB0aGUgZGF0YQorICAgaXQgcmVxdWlyZXMuICBDYWxsYmFjayBtZW1vcnkgY2FuIGJlIGxheWVyZWQgdXNpbmcgcHJpb3JpdGllcy4KKworICAgTW9kdWxvIG1lbW9yeSBpcyBhIHZhcmlhdGlvbiBvbiByYXdfbWVtb3J5IHdoZXJlIEFERFJFU1MgJiAoTU9EVUxPCisgICAtIDEpIGlzIHVzZWQgYXMgdGhlIGluZGV4IGludG8gdGhlIG1lbW9yeSBhcnJheS4KKworICAgVGhlIE9FQSBtb2RlbCB1c2VzIGNhbGxiYWNrIG1lbW9yeSBmb3IgZGV2aWNlcy4KKworICAgVGhlIFZFQSBtb2RlbCB1c2VzIGNhbGxiYWNrIG1lbW9yeSB0byBjYXB0dXJlIGBwYWdlIGZhdWx0cycuCisKKyAgIEJUVywgd2hpbGUgcmF3X21lbW9yeSBjb3VsZCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYXMgYSBjYWxsYmFjaywKKyAgIHByb2ZpbGluZyBoYXMgc2hvd24gdGhhdCB0aGVyZSBpcyBhIGJpZ2VyIHdpbiAoYXQgbGVhc3QgZm9yIHRoZQorICAgeDg2KSBpbiBlbGltaW5hdGluZyBhIGZ1bmN0aW9uIGNhbGwgZm9yIHRoZSBtb3N0IGNvbW1vbgorICAgKHJhd19tZW1vcnkpIGNhc2UuICovCisKKyNpZm5kZWYgV0lUSF9DQUxMQkFDS19NRU1PUlkKKyNkZWZpbmUgV0lUSF9DQUxMQkFDS19NRU1PUlkJCTEKKyNlbmRpZgorCisjaWZuZGVmIFdJVEhfTU9EVUxPX01FTU9SWQorI2RlZmluZSBXSVRIX01PRFVMT19NRU1PUlkgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisKKworLyogQWxpZ25tZW50OgorCisgICBBIHByb2Nlc3NvciBhcmNoaXRlY3R1cmUgbWF5IG9yIG1heSBub3QgaGFuZGxlIG1pc3MgYWxpZ25lZAorICAgdHJhbnNmZXJzLgorCisgICBBcyBhbHRlcm5hdGl2ZXM6IGJvdGggbGl0dGxlIGFuZCBiaWcgZW5kaWFuIG1vZGVzIHRha2UgYW4gZXhjZXB0aW9uCisgICAoU1RSSUNUX0FMSUdOTUVOVCk7IGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBtb2RlbHMgaGFuZGxlIG1pcyBhbGlnbmVkCisgICB0cmFuc2ZlcnMgKE5PTlNUUklDVF9BTElHTk1FTlQpOyBvciB0aGUgYWRkcmVzcyBpcyBmb3JjZWQgaW50bworICAgYWxpZ25tZW50IHVzaW5nIGEgbWFzayAoRk9SQ0VEX0FMSUdOTUVOVCkuCisKKyAgIE1peGVkIGFsaWdubWVudCBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gdGhlIHNpbXVsYXRvciBuZWVkcyB0byBiZQorICAgYWJsZSB0byBjaGFuZ2UgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudHMgb24gdGhlIGZseSAoZWcgZm9yCisgICBiaS1lbmRpYW4gc3VwcG9ydCkuICovCisKK2VudW0gc2ltX2FsaWdubWVudHMgeworICBNSVhFRF9BTElHTk1FTlQsCisgIE5PTlNUUklDVF9BTElHTk1FTlQsCisgIFNUUklDVF9BTElHTk1FTlQsCisgIEZPUkNFRF9BTElHTk1FTlQsCit9OworCitleHRlcm4gZW51bSBzaW1fYWxpZ25tZW50cyBjdXJyZW50X2FsaWdubWVudDsKKworI2lmICFkZWZpbmVkIChXSVRIX0FMSUdOTUVOVCkKKyNkZWZpbmUgV0lUSF9BTElHTk1FTlQgMAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoV0lUSF9ERUZBVUxUX0FMSUdOTUVOVCkKKyNkZWZpbmUgV0lUSF9ERUZBVUxUX0FMSUdOTUVOVCAwIC8qIGZhdGFsICovCisjZW5kaWYKKworCisKKworI2RlZmluZSBDVVJSRU5UX0FMSUdOTUVOVCAoV0lUSF9BTElHTk1FTlQgXAorCQkJICAgPyBXSVRIX0FMSUdOTUVOVCBcCisJCQkgICA6IGN1cnJlbnRfYWxpZ25tZW50KQorCisKKworLyogRmxvYXRpbmcgcG9pbnQgc3Vwb3J0OgorCisgICBTaG91bGQgdGhlIHByb2Nlc3NvciB0cmFwIGZvciBhbGwgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIChhcworICAgaWYgdGhlIGhhcmR3YXJlIHdhc24ndCBpbXBsZW1lbnRlZCkgb3IgaW1wbGVtZW50IHRoZSBmbG9hdGluZyBwb2ludAorICAgaW5zdHJ1Y3Rpb25zIGRpcmVjdGx5LiAqLworCisjaWYgZGVmaW5lZCAoV0lUSF9GTE9BVElOR19QT0lOVCkKKworI2RlZmluZSBTT0ZUX0ZMT0FUSU5HX1BPSU5UCQkxCisjZGVmaW5lIEhBUkRfRkxPQVRJTkdfUE9JTlQJCTIKKworZXh0ZXJuIGludCBjdXJyZW50X2Zsb2F0aW5nX3BvaW50OworI2RlZmluZSBDVVJSRU5UX0ZMT0FUSU5HX1BPSU5UIChXSVRIX0ZMT0FUSU5HX1BPSU5UIFwKKwkJCQk/IFdJVEhfRkxPQVRJTkdfUE9JTlQgXAorCQkJCTogY3VycmVudF9mbG9hdGluZ19wb2ludCkKKworI2VuZGlmCisKKworCisvKiBFbmdpbmUgbW9kdWxlLgorCisgICBVc2UgdGhlIGNvbW1vbiBzdGFydC9zdG9wL3Jlc3RhcnQgZnJhbWV3b3JrIChzaW0tZW5naW5lKS4KKyAgIFNpbXVsYXRvcnMgdXNpbmcgdGhlIG90aGVyIG1vZHVsZXMgYnV0IG5vdCB0aGUgZW5naW5lIHNob3VsZCBkZWZpbmUKKyAgIFdJVEhfRU5HSU5FPTAuICovCisKKyNpZm5kZWYgV0lUSF9FTkdJTkUKKyNkZWZpbmUgV0lUSF9FTkdJTkUJCQkxCisjZW5kaWYKKworCisKKy8qIERlYnVnZ2luZzoKKworICAgQ29udHJvbCB0aGUgaW5jbHVzaW9uIG9mIGRlYnVnZ2luZyBjb2RlLgorICAgRGVidWdnaW5nIGlzIG9ubHkgdHVybmVkIG9uIGluIHJhcmUgY2lyY3Vtc3RhbmNlcyBbc2F5IGR1cmluZyBkZXZlbG9wbWVudF0KKyAgIGFuZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdHVybmVkIG9uIG90aGVyd2lzZS4gICovCisKKyNpZm5kZWYgV0lUSF9ERUJVRworI2RlZmluZSBXSVRIX0RFQlVHCQkJMAorI2VuZGlmCisKKy8qIEluY2x1ZGUgdGhlIHRyYWNpbmcgY29kZS4gIERpc2FibGluZyB0aGlzIGVsaW1pbmF0ZXMgYWxsIHRyYWNpbmcKKyAgIGNvZGUgKi8KKworI2lmbmRlZiBXSVRIX1RSQUNFCisjZGVmaW5lIFdJVEhfVFJBQ0UgICAgICAgICAgICAgICAgICAgICAgKC0xKQorI2VuZGlmCisKKy8qIEluY2x1ZGUgdGhlIHByb2ZpbGluZyBjb2RlLiAgRGlzYWJsaW5nIHRoaXMgZWxpbWluYXRlcyBhbGwgcHJvZmlsaW5nCisgICBjb2RlLiAgKi8KKworI2lmbmRlZiBXSVRIX1BST0ZJTEUKKyNkZWZpbmUgV0lUSF9QUk9GSUxFCQkJKC0xKQorI2VuZGlmCisKKworLyogaW5jbHVkZSBjb2RlIHRoYXQgY2hlY2tzIGFzc2VydGlvbnMgc2NhdHRlcmVkIHRocm91Z2ggb3V0IHRoZQorICAgcHJvZ3JhbSAqLworCisjaWZuZGVmIFdJVEhfQVNTRVJUCisjZGVmaW5lIFdJVEhfQVNTRVJUCQkJMQorI2VuZGlmCisKKworLyogV2hldGhlciB0byBjaGVjayBpbnN0cnVjdGlvbnMgZm9yIHJlc2VydmVkIGJpdHMgYmVpbmcgc2V0ICovCisKKy8qICNkZWZpbmUgV0lUSF9SRVNFUlZFRF9CSVRTCQkxICovCisKKworCisvKiBpbmNsdWRlIG1vbml0b3JpbmcgY29kZSAqLworCisjZGVmaW5lIE1PTklUT1JfSU5TVFJVQ1RJT05fSVNTVUUJMQorI2RlZmluZSBNT05JVE9SX0xPQURfU1RPUkVfVU5JVAkJMgorLyogZG8gbm90IGRlZmluZSBXSVRIX01PTiBieSBkZWZhdWx0ICovCisjZGVmaW5lIERFRkFVTFRfV0lUSF9NT04JCShNT05JVE9SX0xPQURfU1RPUkVfVU5JVCBcCisJCQkJCSB8IE1PTklUT1JfSU5TVFJVQ1RJT05fSVNTVUUpCisKKworLyogQ3VycmVudCBDUFUgbW9kZWwgKG1vZGVscyBhcmUgaW4gdGhlIGdlbmVyYXRlZCBtb2RlbHMuaCBpbmNsdWRlIGZpbGUpICAqLworI2lmbmRlZiBXSVRIX01PREVMCisjZGVmaW5lIFdJVEhfTU9ERUwJCQkwCisjZW5kaWYKKworI2RlZmluZSBDVVJSRU5UX01PREVMIChXSVRIX01PREVMCVwKKwkJICAgICAgID8gV0lUSF9NT0RFTAlcCisJCSAgICAgICA6IGN1cnJlbnRfbW9kZWwpCisKKyNpZm5kZWYgV0lUSF9ERUZBVUxUX01PREVMCisjZGVmaW5lIFdJVEhfREVGQVVMVF9NT0RFTAkJREVGQVVMVF9NT0RFTAorI2VuZGlmCisKKyNkZWZpbmUgTU9ERUxfSVNTVUVfSUdOT1JFCQkoLTEpCisjZGVmaW5lIE1PREVMX0lTU1VFX1BST0NFU1MJCTEKKworI2lmbmRlZiBXSVRIX01PREVMX0lTU1VFCisjZGVmaW5lIFdJVEhfTU9ERUxfSVNTVUUJCTAKKyNlbmRpZgorCitleHRlcm4gaW50IGN1cnJlbnRfbW9kZWxfaXNzdWU7CisjZGVmaW5lIENVUlJFTlRfTU9ERUxfSVNTVUUgKFdJVEhfTU9ERUxfSVNTVUUJXAorCQkJICAgICA/IFdJVEhfTU9ERUxfSVNTVUUJXAorCQkJICAgICA6IGN1cnJlbnRfbW9kZWxfaXNzdWUpCisKKworCisvKiBXaGV0aGVyIG9yIG5vdCBpbnB1dC9vdXRwdXQganVzdCB1c2VzIHN0ZGlvLCBvciB1c2VzIHByaW50Zl9maWx0ZXJlZCBmb3IKKyAgIG91dHB1dCwgYW5kIHBvbGxpbmcgaW5wdXQgZm9yIGlucHV0LiAgKi8KKworI2RlZmluZSBET05UX1VTRV9TVERJTwkJCTIKKyNkZWZpbmUgRE9fVVNFX1NURElPCQkJMQorCisjaWZuZGVmIFdJVEhfU1RESU8KKyNkZWZpbmUgV0lUSF9TVERJTwkJCTAKKyNlbmRpZgorCitleHRlcm4gaW50IGN1cnJlbnRfc3RkaW87CisjZGVmaW5lIENVUlJFTlRfU1RESU8gKFdJVEhfU1RESU8JXAorCQkgICAgICAgPyBXSVRIX1NURElPICAgICBcCisJCSAgICAgICA6IGN1cnJlbnRfc3RkaW8pCisKKworCisvKiBTcGVjaWZ5IHRoYXQgY29uZmlndXJlZCBjYWxscyBwYXNzIHBhcmFtZXRlcnMgaW4gcmVnaXN0ZXJzIHdoZW4gdGhlCisgICBjb252ZW50aW9uIGlzIHRoYXQgdGhleSBhcmUgcGxhY2VkIG9uIHRoZSBzdGFjayAqLworCisjaWZuZGVmIFdJVEhfUkVHUEFSTQorI2RlZmluZSBXSVRIX1JFR1BBUk0gICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qIFNwZWNpZnkgdGhhdCBjb25maWd1cmVkIGNhbGxzIHVzZSBhbiBhbHRlcm5hdGl2ZSBjYWxsaW5nIG1lY2hhbmlzbSAqLworCisjaWZuZGVmIFdJVEhfU1REQ0FMTAorI2RlZmluZSBXSVRIX1NURENBTEwgICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKworLyogU2V0IHRoZSBkZWZhdWx0IHN0YXRlIGNvbmZpZ3VyYXRpb24sIGJlZm9yZSBwYXJzaW5nIGFyZ3YuICAqLworCitleHRlcm4gdm9pZCBzaW1fY29uZmlnX2RlZmF1bHQgKFNJTV9ERVNDIHNkKTsKKworLyogQ29tcGxldGUgYW5kIHZlcmlmeSB0aGUgc2ltdWxhdG9yIGNvbmZpZ3VyYXRpb24uICAqLworCitleHRlcm4gU0lNX1JDIHNpbV9jb25maWcgKFNJTV9ERVNDIHNkKTsKKworLyogUHJpbnQgdGhlIHNpbXVsYXRvciBjb25maWd1cmF0aW9uLiAgKi8KKworZXh0ZXJuIHZvaWQgcHJpbnRfc2ltX2NvbmZpZyAoU0lNX0RFU0Mgc2QpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tY29yZS5jIGIvc2ltL2NvbW1vbi9zaW0tY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NjI3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS1jb3JlLmMKQEAgLTAsMCArMSw4MzkgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgU0lNX0NPUkVfQworI2RlZmluZSBTSU1fQ09SRV9DCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKKworI2lmIChXSVRIX0hXKQorI2luY2x1ZGUgInNpbS1ody5oIgorI2VuZGlmCisKKyNpZiAoV0lUSF9ERVZJQ0VTKQorLyogVE9ETzogY3JlYXRlIHNpbS9jb21tb24vZGV2aWNlLmggKi8KK3ZvaWQgZGV2aWNlX2Vycm9yIChkZXZpY2UgKm1lLCBjaGFyKiBtZXNzYWdlLCAuLi4pOworaW50IGRldmljZV9pb19yZWFkX2J1ZmZlcihkZXZpY2UgKm1lLCB2b2lkICpkZXN0LCBpbnQgc3BhY2UsIGFkZHJlc3Nfd29yZCBhZGRyLCB1bnNpZ25lZCBucl9ieXRlcywgc2ltX2NwdSAqcHJvY2Vzc29yLCBzaW1fY2lhIGNpYSk7CitpbnQgZGV2aWNlX2lvX3dyaXRlX2J1ZmZlcihkZXZpY2UgKm1lLCBjb25zdCB2b2lkICpzb3VyY2UsIGludCBzcGFjZSwgYWRkcmVzc193b3JkIGFkZHIsIHVuc2lnbmVkIG5yX2J5dGVzLCBzaW1fY3B1ICpwcm9jZXNzb3IsIHNpbV9jaWEgY2lhKTsKKyNlbmRpZgorCisvKiAiY29yZSIgbW9kdWxlIGluc3RhbGwgaGFuZGxlci4KKworICAgVGhpcyBpcyBjYWxsZWQgdmlhIHNpbV9tb2R1bGVfaW5zdGFsbCB0byBpbnN0YWxsIHRoZSAiY29yZSIKKyAgIHN1YnN5c3RlbSBpbnRvIHRoZSBzaW11bGF0b3IuICAqLworCisjaWYgRVhURVJOX1NJTV9DT1JFX1AKK3N0YXRpYyBNT0RVTEVfSU5JVF9GTiBzaW1fY29yZV9pbml0Oworc3RhdGljIE1PRFVMRV9VTklOU1RBTExfRk4gc2ltX2NvcmVfdW5pbnN0YWxsOworI2VuZGlmCisKKyNpZiBFWFRFUk5fU0lNX0NPUkVfUAorU0lNX1JDCitzaW1fY29yZV9pbnN0YWxsIChTSU1fREVTQyBzZCkKK3sKKyAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKKworICAvKiBlc3RhYmxpc2ggdGhlIG90aGVyIGhhbmRsZXJzICovCisgIHNpbV9tb2R1bGVfYWRkX3VuaW5zdGFsbF9mbiAoc2QsIHNpbV9jb3JlX3VuaW5zdGFsbCk7CisgIHNpbV9tb2R1bGVfYWRkX2luaXRfZm4gKHNkLCBzaW1fY29yZV9pbml0KTsKKworICAvKiBlc3RhYmxpc2ggYW55IGluaXRpYWwgZGF0YSBzdHJ1Y3R1cmVzIC0gbm9uZSAqLworICByZXR1cm4gU0lNX1JDX09LOworfQorI2VuZGlmCisKKworLyogVW5pbnN0YWxsIHRoZSAiY29yZSIgc3Vic3lzdGVtIGZyb20gdGhlIHNpbXVsYXRvci4gICovCisKKyNpZiBFWFRFUk5fU0lNX0NPUkVfUAorc3RhdGljIHZvaWQKK3NpbV9jb3JlX3VuaW5zdGFsbCAoU0lNX0RFU0Mgc2QpCit7CisgIHNpbV9jb3JlICpjb3JlID0gU1RBVEVfQ09SRShzZCk7CisgIHVuc2lnbmVkIG1hcDsKKyAgLyogYmxvdyBhd2F5IGFueSBtYXBwaW5ncyAqLworICBmb3IgKG1hcCA9IDA7IG1hcCA8IG5yX21hcHM7IG1hcCsrKSB7CisgICAgc2ltX2NvcmVfbWFwcGluZyAqY3VyciA9IGNvcmUtPmNvbW1vbi5tYXBbbWFwXS5maXJzdDsKKyAgICB3aGlsZSAoY3VyciAhPSBOVUxMKSB7CisgICAgICBzaW1fY29yZV9tYXBwaW5nICp0YmQgPSBjdXJyOworICAgICAgY3VyciA9IGN1cnItPm5leHQ7CisgICAgICBpZiAodGJkLT5mcmVlX2J1ZmZlciAhPSBOVUxMKSB7CisJU0lNX0FTU0VSVCh0YmQtPmJ1ZmZlciAhPSBOVUxMKTsKKwl6ZnJlZSh0YmQtPmZyZWVfYnVmZmVyKTsKKyAgICAgIH0KKyAgICAgIHpmcmVlKHRiZCk7CisgICAgfQorICAgIGNvcmUtPmNvbW1vbi5tYXBbbWFwXS5maXJzdCA9IE5VTEw7CisgIH0KK30KKyNlbmRpZgorCisKKyNpZiBFWFRFUk5fU0lNX0NPUkVfUAorc3RhdGljIFNJTV9SQworc2ltX2NvcmVfaW5pdCAoU0lNX0RFU0Mgc2QpCit7CisgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKyNlbmRpZgorCisKKworI2lmbmRlZiBTSU1fQ09SRV9TSUdOQUwKKyNkZWZpbmUgU0lNX0NPUkVfU0lHTkFMKFNELENQVSxDSUEsTUFQLE5SX0JZVEVTLEFERFIsVFJBTlNGRVIsRVJST1IpIFwKK3NpbV9jb3JlX3NpZ25hbCAoKFNEKSwgKENQVSksIChDSUEpLCAoTUFQKSwgKE5SX0JZVEVTKSwgKEFERFIpLCAoVFJBTlNGRVIpLCAoRVJST1IpKQorI2VuZGlmCisKKyNpZiBFWFRFUk5fU0lNX0NPUkVfUAordm9pZAorc2ltX2NvcmVfc2lnbmFsIChTSU1fREVTQyBzZCwKKwkJIHNpbV9jcHUgKmNwdSwKKwkJIHNpbV9jaWEgY2lhLAorCQkgdW5zaWduZWQgbWFwLAorCQkgaW50IG5yX2J5dGVzLAorCQkgYWRkcmVzc193b3JkIGFkZHIsCisJCSB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyLAorCQkgc2ltX2NvcmVfc2lnbmFscyBzaWcpCit7CisgIGNvbnN0IGNoYXIgKmNvcHkgPSAodHJhbnNmZXIgPT0gcmVhZF90cmFuc2ZlciA/ICJyZWFkIiA6ICJ3cml0ZSIpOworICBhZGRyZXNzX3dvcmQgaXAgPSBDSUFfQUREUiAoY2lhKTsKKyAgc3dpdGNoIChzaWcpCisgICAgeworICAgIGNhc2Ugc2ltX2NvcmVfdW5tYXBwZWRfc2lnbmFsOgorICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiY29yZTogJWQgYnl0ZSAlcyB0byB1bm1hcHBlZCBhZGRyZXNzIDB4JWx4IGF0IDB4JWx4XG4iLAorCQkgICAgICBucl9ieXRlcywgY29weSwgKHVuc2lnbmVkIGxvbmcpIGFkZHIsICh1bnNpZ25lZCBsb25nKSBpcCk7CisgICAgICBzaW1fZW5naW5lX2hhbHQgKHNkLCBjcHUsIE5VTEwsIGNpYSwgc2ltX3N0b3BwZWQsIFNJTV9TSUdTRUdWKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugc2ltX2NvcmVfdW5hbGlnbmVkX3NpZ25hbDoKKyAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgImNvcmU6ICVkIGJ5dGUgbWlzYWxpZ25lZCAlcyB0byBhZGRyZXNzIDB4JWx4IGF0IDB4JWx4XG4iLAorCQkgICAgICBucl9ieXRlcywgY29weSwgKHVuc2lnbmVkIGxvbmcpIGFkZHIsICh1bnNpZ25lZCBsb25nKSBpcCk7CisgICAgICBzaW1fZW5naW5lX2hhbHQgKHNkLCBjcHUsIE5VTEwsIGNpYSwgc2ltX3N0b3BwZWQsIFNJTV9TSUdCVVMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNpbV9lbmdpbmVfYWJvcnQgKHNkLCBjcHUsIGNpYSwKKwkJCSJzaW1fY29yZV9zaWduYWwgLSBpbnRlcm5hbCBlcnJvciAtIGJhZCBzd2l0Y2giKTsKKyAgICB9Cit9CisjZW5kaWYKKworCisjaWYgRVhURVJOX1NJTV9DT1JFX1AKK3N0YXRpYyBzaW1fY29yZV9tYXBwaW5nICoKK25ld19zaW1fY29yZV9tYXBwaW5nIChTSU1fREVTQyBzZCwKKwkJICAgICAgaW50IGxldmVsLAorCQkgICAgICBpbnQgc3BhY2UsCisJCSAgICAgIGFkZHJlc3Nfd29yZCBhZGRyLAorCQkgICAgICBhZGRyZXNzX3dvcmQgbnJfYnl0ZXMsCisJCSAgICAgIHVuc2lnbmVkIG1vZHVsbywKKyNpZiBXSVRIX0hXCisJCSAgICAgIHN0cnVjdCBodyAqZGV2aWNlLAorI2Vsc2UKKwkJICAgICAgZGV2aWNlICpkZXZpY2UsCisjZW5kaWYKKwkJICAgICAgdm9pZCAqYnVmZmVyLAorCQkgICAgICB2b2lkICpmcmVlX2J1ZmZlcikKK3sKKyAgc2ltX2NvcmVfbWFwcGluZyAqbmV3X21hcHBpbmcgPSBaQUxMT0Moc2ltX2NvcmVfbWFwcGluZyk7CisgIC8qIGNvbW1vbiAqLworICBuZXdfbWFwcGluZy0+bGV2ZWwgPSBsZXZlbDsKKyAgbmV3X21hcHBpbmctPnNwYWNlID0gc3BhY2U7CisgIG5ld19tYXBwaW5nLT5iYXNlID0gYWRkcjsKKyAgbmV3X21hcHBpbmctPm5yX2J5dGVzID0gbnJfYnl0ZXM7CisgIG5ld19tYXBwaW5nLT5ib3VuZCA9IGFkZHIgKyAobnJfYnl0ZXMgLSAxKTsKKyAgaWYgKG1vZHVsbyA9PSAwKQorICAgIG5ld19tYXBwaW5nLT5tYXNrID0gKHVuc2lnbmVkKSAwIC0gMTsKKyAgZWxzZQorICAgIG5ld19tYXBwaW5nLT5tYXNrID0gbW9kdWxvIC0gMTsKKyAgbmV3X21hcHBpbmctPmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgbmV3X21hcHBpbmctPmZyZWVfYnVmZmVyID0gZnJlZV9idWZmZXI7CisgIG5ld19tYXBwaW5nLT5kZXZpY2UgPSBkZXZpY2U7CisgIHJldHVybiBuZXdfbWFwcGluZzsKK30KKyNlbmRpZgorCisKKyNpZiBFWFRFUk5fU0lNX0NPUkVfUAorc3RhdGljIHZvaWQKK3NpbV9jb3JlX21hcF9hdHRhY2ggKFNJTV9ERVNDIHNkLAorCQkgICAgIHNpbV9jb3JlX21hcCAqYWNjZXNzX21hcCwKKwkJICAgICBpbnQgbGV2ZWwsCisJCSAgICAgaW50IHNwYWNlLAorCQkgICAgIGFkZHJlc3Nfd29yZCBhZGRyLAorCQkgICAgIGFkZHJlc3Nfd29yZCBucl9ieXRlcywKKwkJICAgICB1bnNpZ25lZCBtb2R1bG8sCisjaWYgV0lUSF9IVworCQkgICAgIHN0cnVjdCBodyAqY2xpZW50LCAvKmNhbGxiYWNrL2RlZmF1bHQqLworI2Vsc2UKKwkJICAgICBkZXZpY2UgKmNsaWVudCwgLypjYWxsYmFjay9kZWZhdWx0Ki8KKyNlbmRpZgorCQkgICAgIHZvaWQgKmJ1ZmZlciwgLypyYXdfbWVtb3J5Ki8KKwkJICAgICB2b2lkICpmcmVlX2J1ZmZlcikgLypyYXdfbWVtb3J5Ki8KK3sKKyAgLyogZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50IGZvciB0aGlzIGFkZGl0aW9uYWwgbWFwcGluZyBhbmQgdGhlbgorICAgICBpbnNlcnQgKi8KKyAgc2ltX2NvcmVfbWFwcGluZyAqbmV4dF9tYXBwaW5nOworICBzaW1fY29yZV9tYXBwaW5nICoqbGFzdF9tYXBwaW5nOworCisgIFNJTV9BU1NFUlQgKChjbGllbnQgPT0gTlVMTCkgIT0gKGJ1ZmZlciA9PSBOVUxMKSk7CisgIFNJTV9BU1NFUlQgKChjbGllbnQgPT0gTlVMTCkgPj0gKGZyZWVfYnVmZmVyICE9IE5VTEwpKTsKKworICAvKiBhY3R1YWxseSBkbyBvY2Nhc2lvbmFsbHkgZ2V0IGEgemVybyBzaXplIG1hcCAqLworICBpZiAobnJfYnl0ZXMgPT0gMCkKKyAgICB7CisjaWYgKFdJVEhfREVWSUNFUykKKyAgICAgIGRldmljZV9lcnJvcihjbGllbnQsICJjYWxsZWQgb24gc2ltX2NvcmVfbWFwX2F0dGFjaCB3aXRoIHNpemUgemVybyIpOworI2VuZGlmCisjaWYgKFdJVEhfSFcpCisgICAgICBzaW1faHdfYWJvcnQgKHNkLCBjbGllbnQsICJjYWxsZWQgb24gc2ltX2NvcmVfbWFwX2F0dGFjaCB3aXRoIHNpemUgemVybyIpOworI2VuZGlmCisgICAgICBzaW1faW9fZXJyb3IgKHNkLCAiY2FsbGVkIG9uIHNpbV9jb3JlX21hcF9hdHRhY2ggd2l0aCBzaXplIHplcm8iKTsKKyAgICB9CisKKyAgLyogZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50IChiZXR3ZWVuIGxhc3QvbmV4dCkgKi8KKyAgbmV4dF9tYXBwaW5nID0gYWNjZXNzX21hcC0+Zmlyc3Q7CisgIGxhc3RfbWFwcGluZyA9ICZhY2Nlc3NfbWFwLT5maXJzdDsKKyAgd2hpbGUobmV4dF9tYXBwaW5nICE9IE5VTEwKKwkmJiAobmV4dF9tYXBwaW5nLT5sZXZlbCA8IGxldmVsCisJICAgIHx8IChuZXh0X21hcHBpbmctPmxldmVsID09IGxldmVsCisJCSYmIG5leHRfbWFwcGluZy0+Ym91bmQgPCBhZGRyKSkpCisgICAgeworICAgICAgLyogcHJvdmlkZWQgbGV2ZWxzIGFyZSB0aGUgc2FtZSAqLworICAgICAgLyogYXNzZXJ0OiBuZXh0X21hcHBpbmctPmJhc2UgPiBhbGwgYmFzZXMgYmVmb3JlIG5leHRfbWFwcGluZyAqLworICAgICAgLyogYXNzZXJ0OiBuZXh0X21hcHBpbmctPmJvdW5kID49IGFsbCBib3VuZHMgYmVmb3JlIG5leHRfbWFwcGluZyAqLworICAgICAgbGFzdF9tYXBwaW5nID0gJm5leHRfbWFwcGluZy0+bmV4dDsKKyAgICAgIG5leHRfbWFwcGluZyA9IG5leHRfbWFwcGluZy0+bmV4dDsKKyAgICB9CisgIAorICAvKiBjaGVjayBpbnNlcnRpb24gcG9pbnQgY29ycmVjdCAqLworICBTSU1fQVNTRVJUIChuZXh0X21hcHBpbmcgPT0gTlVMTCB8fCBuZXh0X21hcHBpbmctPmxldmVsID49IGxldmVsKTsKKyAgaWYgKG5leHRfbWFwcGluZyAhPSBOVUxMICYmIG5leHRfbWFwcGluZy0+bGV2ZWwgPT0gbGV2ZWwKKyAgICAgICYmIG5leHRfbWFwcGluZy0+YmFzZSA8IChhZGRyICsgKG5yX2J5dGVzIC0gMSkpKQorICAgIHsKKyNpZiAoV0lUSF9ERVZJQ0VTKQorICAgICAgZGV2aWNlX2Vycm9yIChjbGllbnQsICJtZW1vcnkgbWFwICVkOjB4JWx4Li4weCVseCAoJWxkIGJ5dGVzKSBvdmVybGFwcyAlZDoweCVseC4uMHglbHggKCVsZCBieXRlcykiLAorCQkgICAgc3BhY2UsCisJCSAgICAobG9uZykgYWRkciwKKwkJICAgIChsb25nKSBucl9ieXRlcywKKwkJICAgIChsb25nKSAoYWRkciArIChucl9ieXRlcyAtIDEpKSwKKwkJICAgIG5leHRfbWFwcGluZy0+c3BhY2UsCisJCSAgICAobG9uZykgbmV4dF9tYXBwaW5nLT5iYXNlLAorCQkgICAgKGxvbmcpIG5leHRfbWFwcGluZy0+Ym91bmQsCisJCSAgICAobG9uZykgbmV4dF9tYXBwaW5nLT5ucl9ieXRlcyk7CisjZW5kaWYKKyNpZiBXSVRIX0hXCisgICAgICBzaW1faHdfYWJvcnQgKHNkLCBjbGllbnQsICJtZW1vcnkgbWFwICVkOjB4JWx4Li4weCVseCAoJWxkIGJ5dGVzKSBvdmVybGFwcyAlZDoweCVseC4uMHglbHggKCVsZCBieXRlcykiLAorCQkgICAgc3BhY2UsCisJCSAgICAobG9uZykgYWRkciwKKwkJICAgIChsb25nKSBucl9ieXRlcywKKwkJICAgIChsb25nKSAoYWRkciArIChucl9ieXRlcyAtIDEpKSwKKwkJICAgIG5leHRfbWFwcGluZy0+c3BhY2UsCisJCSAgICAobG9uZykgbmV4dF9tYXBwaW5nLT5iYXNlLAorCQkgICAgKGxvbmcpIG5leHRfbWFwcGluZy0+Ym91bmQsCisJCSAgICAobG9uZykgbmV4dF9tYXBwaW5nLT5ucl9ieXRlcyk7CisjZW5kaWYKKyAgICAgIHNpbV9pb19lcnJvciAoc2QsICJtZW1vcnkgbWFwICVkOjB4JWx4Li4weCVseCAoJWxkIGJ5dGVzKSBvdmVybGFwcyAlZDoweCVseC4uMHglbHggKCVsZCBieXRlcykiLAorCQkgICAgc3BhY2UsCisJCSAgICAobG9uZykgYWRkciwKKwkJICAgIChsb25nKSBucl9ieXRlcywKKwkJICAgIChsb25nKSAoYWRkciArIChucl9ieXRlcyAtIDEpKSwKKwkJICAgIG5leHRfbWFwcGluZy0+c3BhY2UsCisJCSAgICAobG9uZykgbmV4dF9tYXBwaW5nLT5iYXNlLAorCQkgICAgKGxvbmcpIG5leHRfbWFwcGluZy0+Ym91bmQsCisJCSAgICAobG9uZykgbmV4dF9tYXBwaW5nLT5ucl9ieXRlcyk7CisgIH0KKworICAvKiBjcmVhdGUvaW5zZXJ0IHRoZSBuZXcgbWFwcGluZyAqLworICAqbGFzdF9tYXBwaW5nID0gbmV3X3NpbV9jb3JlX21hcHBpbmcoc2QsCisJCQkJICAgICAgIGxldmVsLAorCQkJCSAgICAgICBzcGFjZSwgYWRkciwgbnJfYnl0ZXMsIG1vZHVsbywKKwkJCQkgICAgICAgY2xpZW50LCBidWZmZXIsIGZyZWVfYnVmZmVyKTsKKyAgKCpsYXN0X21hcHBpbmcpLT5uZXh0ID0gbmV4dF9tYXBwaW5nOworfQorI2VuZGlmCisKKworLyogQXR0YWNoIG1lbW9yeSBvciBhIG1lbW9yeSBtYXBwZWQgZGV2aWNlIHRvIHRoZSBzaW11bGF0b3IuCisgICBTZWUgc2ltLWNvcmUuaCBmb3IgYSBmdWxsIGRlc2NyaXB0aW9uLiAgKi8KKworI2lmIEVYVEVSTl9TSU1fQ09SRV9QCit2b2lkCitzaW1fY29yZV9hdHRhY2ggKFNJTV9ERVNDIHNkLAorCQkgc2ltX2NwdSAqY3B1LAorCQkgaW50IGxldmVsLAorCQkgdW5zaWduZWQgbWFwbWFzaywKKwkJIGludCBzcGFjZSwKKwkJIGFkZHJlc3Nfd29yZCBhZGRyLAorCQkgYWRkcmVzc193b3JkIG5yX2J5dGVzLAorCQkgdW5zaWduZWQgbW9kdWxvLAorI2lmIFdJVEhfSFcKKwkJIHN0cnVjdCBodyAqY2xpZW50LAorI2Vsc2UKKwkJIGRldmljZSAqY2xpZW50LAorI2VuZGlmCisJCSB2b2lkICpvcHRpb25hbF9idWZmZXIpCit7CisgIHNpbV9jb3JlICptZW1vcnkgPSBTVEFURV9DT1JFKHNkKTsKKyAgdW5zaWduZWQgbWFwOworICB2b2lkICpidWZmZXI7CisgIHZvaWQgKmZyZWVfYnVmZmVyOworCisgIC8qIGNoZWNrIGZvciBmb3IgYXR0ZW1wdCB0byB1c2UgdW5pbXBsZW1lbnRlZCBwZXItcHJvY2Vzc29yIGNvcmUgbWFwICovCisgIGlmIChjcHUgIT0gTlVMTCkKKyAgICBzaW1faW9fZXJyb3IgKHNkLCAic2ltX2NvcmVfbWFwX2F0dGFjaCAtIHByb2Nlc3NvciBzcGVjaWZpYyBtZW1vcnkgbWFwIG5vdCB5ZXQgc3VwcG9ydGVkIik7CisKKyAgLyogdmVyaWZ5IG1vZHVsbyBtZW1vcnkgKi8KKyAgaWYgKCFXSVRIX01PRFVMT19NRU1PUlkgJiYgbW9kdWxvICE9IDApCisgICAgeworI2lmIChXSVRIX0RFVklDRVMpCisgICAgICBkZXZpY2VfZXJyb3IgKGNsaWVudCwgInNpbV9jb3JlX2F0dGFjaCAtIGludGVybmFsIGVycm9yIC0gbW9kdWxvIG1lbW9yeSBkaXNhYmxlZCIpOworI2VuZGlmCisjaWYgKFdJVEhfSFcpCisgICAgICBzaW1faHdfYWJvcnQgKHNkLCBjbGllbnQsICJzaW1fY29yZV9hdHRhY2ggLSBpbnRlcm5hbCBlcnJvciAtIG1vZHVsbyBtZW1vcnkgZGlzYWJsZWQiKTsKKyNlbmRpZgorICAgICAgc2ltX2lvX2Vycm9yIChzZCwgInNpbV9jb3JlX2F0dGFjaCAtIGludGVybmFsIGVycm9yIC0gbW9kdWxvIG1lbW9yeSBkaXNhYmxlZCIpOworICAgIH0KKyAgaWYgKGNsaWVudCAhPSBOVUxMICYmIG1vZHVsbyAhPSAwKQorICAgIHsKKyNpZiAoV0lUSF9ERVZJQ0VTKQorICAgICAgZGV2aWNlX2Vycm9yIChjbGllbnQsICJzaW1fY29yZV9hdHRhY2ggLSBpbnRlcm5hbCBlcnJvciAtIG1vZHVsbyBhbmQgY2FsbGJhY2sgbWVtb3J5IGNvbmZsaWN0Iik7CisjZW5kaWYKKyNpZiAoV0lUSF9IVykKKyAgICAgIHNpbV9od19hYm9ydCAoc2QsIGNsaWVudCwgInNpbV9jb3JlX2F0dGFjaCAtIGludGVybmFsIGVycm9yIC0gbW9kdWxvIGFuZCBjYWxsYmFjayBtZW1vcnkgY29uZmxpY3QiKTsKKyNlbmRpZgorICAgICAgc2ltX2lvX2Vycm9yIChzZCwgInNpbV9jb3JlX2F0dGFjaCAtIGludGVybmFsIGVycm9yIC0gbW9kdWxvIGFuZCBjYWxsYmFjayBtZW1vcnkgY29uZmxpY3QiKTsKKyAgICB9CisgIGlmIChtb2R1bG8gIT0gMCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBtYXNrID0gbW9kdWxvIC0gMTsKKyAgICAgIC8qIGFueSB6ZXJvIGJpdHMgKi8KKyAgICAgIHdoaWxlIChtYXNrID49IHNpemVvZiAodW5zaWduZWQ2NCkpIC8qIG1pbmltdW0gbW9kdWxvICovCisJeworCSAgaWYgKChtYXNrICYgMSkgPT0gMCkKKwkgICAgbWFzayA9IDA7CisJICBlbHNlCisJICAgIG1hc2sgPj49IDE7CisJfQorICAgICAgaWYgKG1hc2sgIT0gc2l6ZW9mICh1bnNpZ25lZDY0KSAtIDEpCisJeworI2lmIChXSVRIX0RFVklDRVMpCisJICBkZXZpY2VfZXJyb3IgKGNsaWVudCwgInNpbV9jb3JlX2F0dGFjaCAtIGludGVybmFsIGVycm9yIC0gbW9kdWxvICVseCBub3QgcG93ZXIgb2YgdHdvIiwgKGxvbmcpIG1vZHVsbyk7CisjZW5kaWYKKyNpZiAoV0lUSF9IVykKKwkgIHNpbV9od19hYm9ydCAoc2QsIGNsaWVudCwgInNpbV9jb3JlX2F0dGFjaCAtIGludGVybmFsIGVycm9yIC0gbW9kdWxvICVseCBub3QgcG93ZXIgb2YgdHdvIiwgKGxvbmcpIG1vZHVsbyk7CisjZW5kaWYKKwkgIHNpbV9pb19lcnJvciAoc2QsICJzaW1fY29yZV9hdHRhY2ggLSBpbnRlcm5hbCBlcnJvciAtIG1vZHVsbyAlbHggbm90IHBvd2VyIG9mIHR3byIsIChsb25nKSBtb2R1bG8pOworCX0KKyAgICB9CisKKyAgLyogdmVyaWZ5IGNvbnNpc3RlbmN5IGJldHdlZW4gZGV2aWNlIGFuZCBidWZmZXIgKi8KKyAgaWYgKGNsaWVudCAhPSBOVUxMICYmIG9wdGlvbmFsX2J1ZmZlciAhPSBOVUxMKQorICAgIHsKKyNpZiAoV0lUSF9ERVZJQ0VTKQorICAgICAgZGV2aWNlX2Vycm9yIChjbGllbnQsICJzaW1fY29yZV9hdHRhY2ggLSBpbnRlcm5hbCBlcnJvciAtIGNvbmZsaWN0aW5nIGJ1ZmZlciBhbmQgYXR0YWNoIGFyZ3VtZW50cyIpOworI2VuZGlmCisjaWYgKFdJVEhfSFcpCisgICAgICBzaW1faHdfYWJvcnQgKHNkLCBjbGllbnQsICJzaW1fY29yZV9hdHRhY2ggLSBpbnRlcm5hbCBlcnJvciAtIGNvbmZsaWN0aW5nIGJ1ZmZlciBhbmQgYXR0YWNoIGFyZ3VtZW50cyIpOworI2VuZGlmCisgICAgICBzaW1faW9fZXJyb3IgKHNkLCAic2ltX2NvcmVfYXR0YWNoIC0gaW50ZXJuYWwgZXJyb3IgLSBjb25mbGljdGluZyBidWZmZXIgYW5kIGF0dGFjaCBhcmd1bWVudHMiKTsKKyAgICB9CisgIGlmIChjbGllbnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAob3B0aW9uYWxfYnVmZmVyID09IE5VTEwpCisJeworCSAgaW50IHBhZGRpbmcgPSAoYWRkciAlIHNpemVvZiAodW5zaWduZWQ2NCkpOworCSAgdW5zaWduZWQgbG9uZyBieXRlcyA9IChtb2R1bG8gPT0gMCA/IG5yX2J5dGVzIDogbW9kdWxvKSArIHBhZGRpbmc7CisJICBmcmVlX2J1ZmZlciA9IHphbGxvYyAoYnl0ZXMpOworCSAgYnVmZmVyID0gKGNoYXIqKSBmcmVlX2J1ZmZlciArIHBhZGRpbmc7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJ1ZmZlciA9IG9wdGlvbmFsX2J1ZmZlcjsKKwkgIGZyZWVfYnVmZmVyID0gTlVMTDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogYSBkZXZpY2UgKi8KKyAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICBmcmVlX2J1ZmZlciA9IE5VTEw7CisgICAgfQorCisgIC8qIGF0dGFjaCB0aGUgcmVnaW9uIHRvIGFsbCBhcHBsaWNhYmxlIGFjY2VzcyBtYXBzICovCisgIGZvciAobWFwID0gMDsgCisgICAgICAgbWFwIDwgbnJfbWFwczsKKyAgICAgICBtYXArKykKKyAgICB7CisgICAgICBpZiAobWFwbWFzayAmICgxIDw8IG1hcCkpCisJeworCSAgc2ltX2NvcmVfbWFwX2F0dGFjaCAoc2QsICZtZW1vcnktPmNvbW1vbi5tYXBbbWFwXSwKKwkJCSAgICAgICBsZXZlbCwgc3BhY2UsIGFkZHIsIG5yX2J5dGVzLCBtb2R1bG8sCisJCQkgICAgICAgY2xpZW50LCBidWZmZXIsIGZyZWVfYnVmZmVyKTsKKwkgIGZyZWVfYnVmZmVyID0gTlVMTDsKKwl9CisgICAgfQorICAKKyAgLyogSnVzdCBjb3B5IHRoaXMgbWFwIHRvIGVhY2ggb2YgdGhlIHByb2Nlc3NvciBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZXMuCisgICAgIEZJWE1FIC0gbGF0ZXIgdGhpcyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRydWUgcHJvY2Vzc29yIHNwZWNpZmljCisgICAgIG1hcHMuICovCisgIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1BST0NFU1NPUlM7IGkrKykKKyAgICAgIHsKKwlDUFVfQ09SRSAoU1RBVEVfQ1BVIChzZCwgaSkpLT5jb21tb24gPSBTVEFURV9DT1JFIChzZCktPmNvbW1vbjsKKyAgICAgIH0KKyAgfQorfQorI2VuZGlmCisKKworLyogUmVtb3ZlIGFueSBtZW1vcnkgcmVmZXJlbmNlIHJlbGF0ZWQgdG8gdGhpcyBhZGRyZXNzICovCisjaWYgRVhURVJOX1NJTV9DT1JFX1AKK3N0YXRpYyB2b2lkCitzaW1fY29yZV9tYXBfZGV0YWNoIChTSU1fREVTQyBzZCwKKwkJICAgICBzaW1fY29yZV9tYXAgKmFjY2Vzc19tYXAsCisJCSAgICAgaW50IGxldmVsLAorCQkgICAgIGludCBzcGFjZSwKKwkJICAgICBhZGRyZXNzX3dvcmQgYWRkcikKK3sKKyAgc2ltX2NvcmVfbWFwcGluZyAqKmVudHJ5OworICBmb3IgKGVudHJ5ID0gJmFjY2Vzc19tYXAtPmZpcnN0OworICAgICAgICgqZW50cnkpICE9IE5VTEw7CisgICAgICAgZW50cnkgPSAmKCplbnRyeSktPm5leHQpCisgICAgeworICAgICAgaWYgKCgqZW50cnkpLT5iYXNlID09IGFkZHIKKwkgICYmICgqZW50cnkpLT5sZXZlbCA9PSBsZXZlbAorCSAgJiYgKCplbnRyeSktPnNwYWNlID09IHNwYWNlKQorCXsKKwkgIHNpbV9jb3JlX21hcHBpbmcgKmRlYWQgPSAoKmVudHJ5KTsKKwkgICgqZW50cnkpID0gZGVhZC0+bmV4dDsKKwkgIGlmIChkZWFkLT5mcmVlX2J1ZmZlciAhPSBOVUxMKQorCSAgICB6ZnJlZSAoZGVhZC0+ZnJlZV9idWZmZXIpOworCSAgemZyZWUgKGRlYWQpOworCSAgcmV0dXJuOworCX0KKyAgICB9Cit9CisjZW5kaWYKKworI2lmIEVYVEVSTl9TSU1fQ09SRV9QCit2b2lkCitzaW1fY29yZV9kZXRhY2ggKFNJTV9ERVNDIHNkLAorCQkgc2ltX2NwdSAqY3B1LAorCQkgaW50IGxldmVsLAorCQkgaW50IGFkZHJlc3Nfc3BhY2UsCisJCSBhZGRyZXNzX3dvcmQgYWRkcikKK3sKKyAgc2ltX2NvcmUgKm1lbW9yeSA9IFNUQVRFX0NPUkUgKHNkKTsKKyAgdW5zaWduZWQgbWFwOworICBmb3IgKG1hcCA9IDA7IG1hcCA8IG5yX21hcHM7IG1hcCsrKQorICAgIHsKKyAgICAgIHNpbV9jb3JlX21hcF9kZXRhY2ggKHNkLCAmbWVtb3J5LT5jb21tb24ubWFwW21hcF0sCisJCQkgICBsZXZlbCwgYWRkcmVzc19zcGFjZSwgYWRkcik7CisgICAgfQorICAvKiBKdXN0IGNvcHkgdGhpcyB1cGRhdGUgdG8gZWFjaCBvZiB0aGUgcHJvY2Vzc29yIHNwZWNpZmljIGRhdGEKKyAgICAgc3RydWN0dXJlcy4gIEZJWE1FIC0gbGF0ZXIgdGhpcyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRydWUKKyAgICAgcHJvY2Vzc29yIHNwZWNpZmljIG1hcHMuICovCisgIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1BST0NFU1NPUlM7IGkrKykKKyAgICAgIHsKKwlDUFVfQ09SRSAoU1RBVEVfQ1BVIChzZCwgaSkpLT5jb21tb24gPSBTVEFURV9DT1JFIChzZCktPmNvbW1vbjsKKyAgICAgIH0KKyAgfQorfQorI2VuZGlmCisKKworU1RBVElDX0lOTElORV9TSU1fQ09SRVwKKyhzaW1fY29yZV9tYXBwaW5nICopCitzaW1fY29yZV9maW5kX21hcHBpbmcoc2ltX2NvcmVfY29tbW9uICpjb3JlLAorCQkgICAgICB1bnNpZ25lZCBtYXAsCisJCSAgICAgIGFkZHJlc3Nfd29yZCBhZGRyLAorCQkgICAgICB1bnNpZ25lZCBucl9ieXRlcywKKwkJICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlciwKKwkJICAgICAgaW50IGFib3J0LCAvKmVpdGhlciAwIG9yIDEgLSBoaW50IHRvIGlubGluZS8tTyAqLworCQkgICAgICBzaW1fY3B1ICpjcHUsIC8qIGFib3J0ID0+IGNwdSAhPSBOVUxMICovCisJCSAgICAgIHNpbV9jaWEgY2lhKQoreworICBzaW1fY29yZV9tYXBwaW5nICptYXBwaW5nID0gY29yZS0+bWFwW21hcF0uZmlyc3Q7CisgIEFTU0VSVCAoKGFkZHIgJiAobnJfYnl0ZXMgLSAxKSkgPT0gMCk7IC8qIG11c3QgYmUgYWxpZ25lZCAqLworICBBU1NFUlQgKChhZGRyICsgKG5yX2J5dGVzIC0gMSkpID49IGFkZHIpOyAvKiBtdXN0IG5vdCB3cmFwICovCisgIEFTU0VSVCAoIWFib3J0IHx8IGNwdSAhPSBOVUxMKTsgLyogYWJvcnQgbmVlZHMgYSBub24gbnVsbCBDUFUgKi8KKyAgd2hpbGUgKG1hcHBpbmcgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoYWRkciA+PSBtYXBwaW5nLT5iYXNlCisJICAmJiAoYWRkciArIChucl9ieXRlcyAtIDEpKSA8PSBtYXBwaW5nLT5ib3VuZCkKKwlyZXR1cm4gbWFwcGluZzsKKyAgICAgIG1hcHBpbmcgPSBtYXBwaW5nLT5uZXh0OworICAgIH0KKyAgaWYgKGFib3J0KQorICAgIHsKKyAgICAgIFNJTV9DT1JFX1NJR05BTCAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsIGNpYSwgbWFwLCBucl9ieXRlcywgYWRkciwgdHJhbnNmZXIsCisJCSAgICAgICBzaW1fY29yZV91bm1hcHBlZF9zaWduYWwpOworICAgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKworU1RBVElDX0lOTElORV9TSU1fQ09SRVwKKyh2b2lkICopCitzaW1fY29yZV90cmFuc2xhdGUgKHNpbV9jb3JlX21hcHBpbmcgKm1hcHBpbmcsCisJCSAgICBhZGRyZXNzX3dvcmQgYWRkcikKK3sKKyAgaWYgKFdJVEhfTU9EVUxPX01FTU9SWSkKKyAgICByZXR1cm4gKHZvaWQgKikoKHVuc2lnbmVkOCAqKSBtYXBwaW5nLT5idWZmZXIKKwkJICAgICsgKChhZGRyIC0gbWFwcGluZy0+YmFzZSkgJiBtYXBwaW5nLT5tYXNrKSk7CisgIGVsc2UKKyAgICByZXR1cm4gKHZvaWQgKikoKHVuc2lnbmVkOCAqKSBtYXBwaW5nLT5idWZmZXIKKwkJICAgICsgYWRkciAtIG1hcHBpbmctPmJhc2UpOworfQorCisKKyNpZiBFWFRFUk5fU0lNX0NPUkVfUAordW5zaWduZWQKK3NpbV9jb3JlX3JlYWRfYnVmZmVyIChTSU1fREVTQyBzZCwKKwkJICAgICAgc2ltX2NwdSAqY3B1LAorCQkgICAgICB1bnNpZ25lZCBtYXAsCisJCSAgICAgIHZvaWQgKmJ1ZmZlciwKKwkJICAgICAgYWRkcmVzc193b3JkIGFkZHIsCisJCSAgICAgIHVuc2lnbmVkIGxlbikKK3sKKyAgc2ltX2NvcmVfY29tbW9uICpjb3JlID0gKGNwdSA9PSBOVUxMID8gJlNUQVRFX0NPUkUgKHNkKS0+Y29tbW9uIDogJkNQVV9DT1JFIChjcHUpLT5jb21tb24pOworICB1bnNpZ25lZCBjb3VudCA9IDA7CisgIHdoaWxlIChjb3VudCA8IGxlbikKKyB7CisgICAgdW5zaWduZWRfd29yZCByYWRkciA9IGFkZHIgKyBjb3VudDsKKyAgICBzaW1fY29yZV9tYXBwaW5nICptYXBwaW5nID0KKyAgICAgIHNpbV9jb3JlX2ZpbmRfbWFwcGluZyAoY29yZSwgbWFwLAorCQkJICAgIHJhZGRyLCAvKm5yLWJ5dGVzKi8xLAorCQkJICAgIHJlYWRfdHJhbnNmZXIsCisJCQkgICAgMCAvKmRvbnQtYWJvcnQqLywgTlVMTCwgTlVMTF9DSUEpOworICAgIGlmIChtYXBwaW5nID09IE5VTEwpCisgICAgICBicmVhazsKKyNpZiAoV0lUSF9ERVZJQ0VTKQorICAgIGlmIChtYXBwaW5nLT5kZXZpY2UgIT0gTlVMTCkKKyAgICAgIHsKKwlpbnQgbnJfYnl0ZXMgPSBsZW4gLSBjb3VudDsKKwlpZiAocmFkZHIgKyBucl9ieXRlcyAtIDE+IG1hcHBpbmctPmJvdW5kKQorCSAgbnJfYnl0ZXMgPSBtYXBwaW5nLT5ib3VuZCAtIHJhZGRyICsgMTsKKwlpZiAoZGV2aWNlX2lvX3JlYWRfYnVmZmVyIChtYXBwaW5nLT5kZXZpY2UsCisJCQkJICAgKHVuc2lnbmVkXzEqKWJ1ZmZlciArIGNvdW50LAorCQkJCSAgIG1hcHBpbmctPnNwYWNlLAorCQkJCSAgIHJhZGRyLAorCQkJCSAgIG5yX2J5dGVzLCAKKwkJCQkgICBjcHUsIAorCQkJCSAgIENJQV9HRVQgKGNwdSkpICE9IG5yX2J5dGVzKQorCSAgYnJlYWs7CisJY291bnQgKz0gbnJfYnl0ZXM7CisJY29udGludWU7CisgICAgICB9CisjZW5kaWYKKyNpZiAoV0lUSF9IVykKKyAgICBpZiAobWFwcGluZy0+ZGV2aWNlICE9IE5VTEwpCisgICAgICB7CisJaW50IG5yX2J5dGVzID0gbGVuIC0gY291bnQ7CisJaWYgKHJhZGRyICsgbnJfYnl0ZXMgLSAxPiBtYXBwaW5nLT5ib3VuZCkKKwkgIG5yX2J5dGVzID0gbWFwcGluZy0+Ym91bmQgLSByYWRkciArIDE7CisJaWYgKHNpbV9od19pb19yZWFkX2J1ZmZlciAoc2QsIG1hcHBpbmctPmRldmljZSwKKwkJCQkgICAodW5zaWduZWRfMSopYnVmZmVyICsgY291bnQsCisJCQkJICAgbWFwcGluZy0+c3BhY2UsCisJCQkJICAgcmFkZHIsCisJCQkJICAgbnJfYnl0ZXMpICE9IG5yX2J5dGVzKQorCSAgYnJlYWs7CisJY291bnQgKz0gbnJfYnl0ZXM7CisJY29udGludWU7CisgICAgICB9CisjZW5kaWYKKyAgICAoKHVuc2lnbmVkXzEqKWJ1ZmZlcilbY291bnRdID0KKyAgICAgICoodW5zaWduZWRfMSopc2ltX2NvcmVfdHJhbnNsYXRlKG1hcHBpbmcsIHJhZGRyKTsKKyAgICBjb3VudCArPSAxOworIH0KKyAgcmV0dXJuIGNvdW50OworfQorI2VuZGlmCisKKworI2lmIEVYVEVSTl9TSU1fQ09SRV9QCit1bnNpZ25lZAorc2ltX2NvcmVfd3JpdGVfYnVmZmVyIChTSU1fREVTQyBzZCwKKwkJICAgICAgIHNpbV9jcHUgKmNwdSwKKwkJICAgICAgIHVuc2lnbmVkIG1hcCwKKwkJICAgICAgIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKwkJICAgICAgIGFkZHJlc3Nfd29yZCBhZGRyLAorCQkgICAgICAgdW5zaWduZWQgbGVuKQoreworICBzaW1fY29yZV9jb21tb24gKmNvcmUgPSAoY3B1ID09IE5VTEwgPyAmU1RBVEVfQ09SRSAoc2QpLT5jb21tb24gOiAmQ1BVX0NPUkUgKGNwdSktPmNvbW1vbik7CisgIHVuc2lnbmVkIGNvdW50ID0gMDsKKyAgd2hpbGUgKGNvdW50IDwgbGVuKQorICAgIHsKKyAgICAgIHVuc2lnbmVkX3dvcmQgcmFkZHIgPSBhZGRyICsgY291bnQ7CisgICAgICBzaW1fY29yZV9tYXBwaW5nICptYXBwaW5nID0KKwlzaW1fY29yZV9maW5kX21hcHBpbmcgKGNvcmUsIG1hcCwKKwkJCSAgICAgICByYWRkciwgLypuci1ieXRlcyovMSwKKwkJCSAgICAgICB3cml0ZV90cmFuc2ZlciwKKwkJCSAgICAgICAwIC8qZG9udC1hYm9ydCovLCBOVUxMLCBOVUxMX0NJQSk7CisgICAgICBpZiAobWFwcGluZyA9PSBOVUxMKQorCWJyZWFrOworI2lmIChXSVRIX0RFVklDRVMpCisgICAgICBpZiAoV0lUSF9DQUxMQkFDS19NRU1PUlkKKwkgICYmIG1hcHBpbmctPmRldmljZSAhPSBOVUxMKQorCXsKKwkgIGludCBucl9ieXRlcyA9IGxlbiAtIGNvdW50OworCSAgaWYgKHJhZGRyICsgbnJfYnl0ZXMgLSAxID4gbWFwcGluZy0+Ym91bmQpCisJICAgIG5yX2J5dGVzID0gbWFwcGluZy0+Ym91bmQgLSByYWRkciArIDE7CisJICBpZiAoZGV2aWNlX2lvX3dyaXRlX2J1ZmZlciAobWFwcGluZy0+ZGV2aWNlLAorCQkJCSAgICAgICh1bnNpZ25lZF8xKilidWZmZXIgKyBjb3VudCwKKwkJCQkgICAgICBtYXBwaW5nLT5zcGFjZSwKKwkJCQkgICAgICByYWRkciwKKwkJCQkgICAgICBucl9ieXRlcywKKwkJCQkgICAgICBjcHUsIAorCQkJCSAgICAgIENJQV9HRVQoY3B1KSkgIT0gbnJfYnl0ZXMpCisJICAgIGJyZWFrOworCSAgY291bnQgKz0gbnJfYnl0ZXM7CisJICBjb250aW51ZTsKKwl9CisjZW5kaWYKKyNpZiAoV0lUSF9IVykKKyAgICAgIGlmIChXSVRIX0NBTExCQUNLX01FTU9SWQorCSAgJiYgbWFwcGluZy0+ZGV2aWNlICE9IE5VTEwpCisJeworCSAgaW50IG5yX2J5dGVzID0gbGVuIC0gY291bnQ7CisJICBpZiAocmFkZHIgKyBucl9ieXRlcyAtIDEgPiBtYXBwaW5nLT5ib3VuZCkKKwkgICAgbnJfYnl0ZXMgPSBtYXBwaW5nLT5ib3VuZCAtIHJhZGRyICsgMTsKKwkgIGlmIChzaW1faHdfaW9fd3JpdGVfYnVmZmVyIChzZCwgbWFwcGluZy0+ZGV2aWNlLAorCQkJCSAgICAgICh1bnNpZ25lZF8xKilidWZmZXIgKyBjb3VudCwKKwkJCQkgICAgICBtYXBwaW5nLT5zcGFjZSwKKwkJCQkgICAgICByYWRkciwKKwkJCQkgICAgICBucl9ieXRlcykgIT0gbnJfYnl0ZXMpCisJICAgIGJyZWFrOworCSAgY291bnQgKz0gbnJfYnl0ZXM7CisJICBjb250aW51ZTsKKwl9CisjZW5kaWYKKyAgICAgICoodW5zaWduZWRfMSopc2ltX2NvcmVfdHJhbnNsYXRlKG1hcHBpbmcsIHJhZGRyKSA9CisJKCh1bnNpZ25lZF8xKilidWZmZXIpW2NvdW50XTsKKyAgICAgIGNvdW50ICs9IDE7CisgICAgfQorICByZXR1cm4gY291bnQ7Cit9CisjZW5kaWYKKworCisjaWYgRVhURVJOX1NJTV9DT1JFX1AKK3ZvaWQKK3NpbV9jb3JlX3NldF94b3IgKFNJTV9ERVNDIHNkLAorCQkgIHNpbV9jcHUgKmNwdSwKKwkJICBpbnQgaXNfeG9yKQoreworICAvKiBzZXQgdXAgdGhlIFhPUiBtYXAgaWYgcmVxdWlyZWQuICovCisgIGlmIChXSVRIX1hPUl9FTkRJQU4pIHsKKyAgICB7CisgICAgICBzaW1fY29yZSAqY29yZSA9IFNUQVRFX0NPUkUgKHNkKTsKKyAgICAgIHNpbV9jcHVfY29yZSAqY3B1X2NvcmUgPSAoY3B1ICE9IE5VTEwgPyBDUFVfQ09SRSAoY3B1KSA6IE5VTEwpOworICAgICAgaWYgKGNwdV9jb3JlICE9IE5VTEwpCisJeworCSAgaW50IGkgPSAxOworCSAgdW5zaWduZWQgbWFzazsKKwkgIGlmIChpc194b3IpCisJICAgIG1hc2sgPSBXSVRIX1hPUl9FTkRJQU4gLSAxOworCSAgZWxzZQorCSAgICBtYXNrID0gMDsKKwkgIHdoaWxlIChpIC0gMSA8IFdJVEhfWE9SX0VORElBTikKKwkgICAgeworCSAgICAgIGNwdV9jb3JlLT54b3JbaS0xXSA9IG1hc2s7CisJICAgICAgbWFzayA9IChtYXNrIDw8IDEpICYgKFdJVEhfWE9SX0VORElBTiAtIDEpOworCSAgICAgIGkgPSAoaSA8PCAxKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoaXNfeG9yKQorCSAgICBjb3JlLT5ieXRlX3hvciA9IFdJVEhfWE9SX0VORElBTiAtIDE7CisJICBlbHNlCisJICAgIGNvcmUtPmJ5dGVfeG9yID0gMDsKKwl9CSAgCisgICAgfQorICB9CisgIGVsc2UgeworICAgIGlmIChpc194b3IpCisgICAgICBzaW1fZW5naW5lX2Fib3J0IChzZCwgTlVMTCwgTlVMTF9DSUEsCisJCQkiQXR0ZW1wdGVkIHRvIGVuYWJsZSB4b3ItZW5kaWFuIG1vZGUgd2hlbiBwZXJtZW5hbnRseSBkaXNhYmxlZC4iKTsKKyAgfQorfQorI2VuZGlmCisKKworI2lmIEVYVEVSTl9TSU1fQ09SRV9QCitzdGF0aWMgdm9pZAorcmV2ZXJzZV9uICh1bnNpZ25lZF8xICpkZXN0LAorCSAgIGNvbnN0IHVuc2lnbmVkXzEgKnNyYywKKwkgICBpbnQgbnJfYnl0ZXMpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnJfYnl0ZXM7IGkrKykKKyAgICB7CisgICAgICBkZXN0IFtucl9ieXRlcyAtIGkgLSAxXSA9IHNyYyBbaV07CisgICAgfQorfQorI2VuZGlmCisKKworI2lmIEVYVEVSTl9TSU1fQ09SRV9QCit1bnNpZ25lZAorc2ltX2NvcmVfeG9yX3JlYWRfYnVmZmVyIChTSU1fREVTQyBzZCwKKwkJCSAgc2ltX2NwdSAqY3B1LAorCQkJICB1bnNpZ25lZCBtYXAsCisJCQkgIHZvaWQgKmJ1ZmZlciwKKwkJCSAgYWRkcmVzc193b3JkIGFkZHIsCisJCQkgIHVuc2lnbmVkIG5yX2J5dGVzKQoreworICBhZGRyZXNzX3dvcmQgYnl0ZV94b3IgPSAoY3B1ID09IE5VTEwgPyBTVEFURV9DT1JFIChzZCktPmJ5dGVfeG9yIDogQ1BVX0NPUkUgKGNwdSktPnhvclswXSk7CisgIGlmICghV0lUSF9YT1JfRU5ESUFOIHx8ICFieXRlX3hvcikKKyAgICByZXR1cm4gc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLCBjcHUsIG1hcCwgYnVmZmVyLCBhZGRyLCBucl9ieXRlcyk7CisgIGVsc2UKKyAgICAvKiBvbmx5IGJyZWFrIHVwIHRyYW5zZmVycyB3aGVuIHhvci1lbmRpYW4gaXMgYm90aCBzZWxlY3RlZCBhbmQgZW5hYmxlZCAqLworICAgIHsKKyAgICAgIHVuc2lnbmVkXzEgeFtXSVRIX1hPUl9FTkRJQU4gKyAxXTsgLyogKzEgdG8gYXZvaWQgemVyby1zaXplZCBhcnJheSAqLworICAgICAgdW5zaWduZWQgbnJfdHJhbnNmZXJlZCA9IDA7CisgICAgICBhZGRyZXNzX3dvcmQgc3RhcnQgPSBhZGRyOworICAgICAgdW5zaWduZWQgbnJfdGhpc190cmFuc2ZlciA9IChXSVRIX1hPUl9FTkRJQU4gLSAoYWRkciAmIH4oV0lUSF9YT1JfRU5ESUFOIC0gMSkpKTsKKyAgICAgIGFkZHJlc3Nfd29yZCBzdG9wOworICAgICAgLyogaW5pdGlhbCBhbmQgaW50ZXJtZWRpYXRlIHRyYW5zZmVycyBhcmUgYnJva2VuIHdoZW4gdGhleSBjcm9zcworICAgICAgICAgYW4gWE9SIGVuZGlhbiBib3VuZGFyeSAqLworICAgICAgd2hpbGUgKG5yX3RyYW5zZmVyZWQgKyBucl90aGlzX3RyYW5zZmVyIDwgbnJfYnl0ZXMpCisJLyogaW5pdGlhbC9pbnRlcm1lZGlhdGUgdHJhbnNmZXJzICovCisJeworCSAgLyogc2luY2UgeG9yLWVuZGlhbiBpcyBlbmFibGVkIHN0b3BeeG9yIGRlZmluZXMgdGhlIHN0YXJ0CisgICAgICAgICAgICAgYWRkcmVzcyBvZiB0aGUgdHJhbnNmZXIgKi8KKwkgIHN0b3AgPSBzdGFydCArIG5yX3RoaXNfdHJhbnNmZXIgLSAxOworCSAgU0lNX0FTU0VSVCAoc3RhcnQgPD0gc3RvcCk7CisJICBTSU1fQVNTRVJUICgoc3RvcCBeIGJ5dGVfeG9yKSA8PSAoc3RhcnQgXiBieXRlX3hvcikpOworCSAgaWYgKHNpbV9jb3JlX3JlYWRfYnVmZmVyIChzZCwgY3B1LCBtYXAsIHgsIHN0b3AgXiBieXRlX3hvciwgbnJfdGhpc190cmFuc2ZlcikKKwkgICAgICAhPSBucl90aGlzX3RyYW5zZmVyKQorCSAgICByZXR1cm4gbnJfdHJhbnNmZXJlZDsKKwkgIHJldmVyc2VfbiAoJigodW5zaWduZWRfMSopYnVmZmVyKVtucl90cmFuc2ZlcmVkXSwgeCwgbnJfdGhpc190cmFuc2Zlcik7CisJICBucl90cmFuc2ZlcmVkICs9IG5yX3RoaXNfdHJhbnNmZXI7CisJICBucl90aGlzX3RyYW5zZmVyID0gV0lUSF9YT1JfRU5ESUFOOworCSAgc3RhcnQgPSBzdG9wICsgMTsKKwl9CisgICAgICAvKiBmaW5hbCB0cmFuc2ZlciAqLworICAgICAgbnJfdGhpc190cmFuc2ZlciA9IG5yX2J5dGVzIC0gbnJfdHJhbnNmZXJlZDsKKyAgICAgIHN0b3AgPSBzdGFydCArIG5yX3RoaXNfdHJhbnNmZXIgLSAxOworICAgICAgU0lNX0FTU0VSVCAoc3RvcCA9PSAoYWRkciArIG5yX2J5dGVzIC0gMSkpOworICAgICAgaWYgKHNpbV9jb3JlX3JlYWRfYnVmZmVyIChzZCwgY3B1LCBtYXAsIHgsIHN0b3AgXiBieXRlX3hvciwgbnJfdGhpc190cmFuc2ZlcikKKwkgICE9IG5yX3RoaXNfdHJhbnNmZXIpCisJcmV0dXJuIG5yX3RyYW5zZmVyZWQ7CisgICAgICByZXZlcnNlX24gKCYoKHVuc2lnbmVkXzEqKWJ1ZmZlcilbbnJfdHJhbnNmZXJlZF0sIHgsIG5yX3RoaXNfdHJhbnNmZXIpOworICAgICAgcmV0dXJuIG5yX2J5dGVzOworICAgIH0KK30KKyNlbmRpZgorICAKKyAgCisjaWYgRVhURVJOX1NJTV9DT1JFX1AKK3Vuc2lnbmVkCitzaW1fY29yZV94b3Jfd3JpdGVfYnVmZmVyIChTSU1fREVTQyBzZCwKKwkJCSAgIHNpbV9jcHUgKmNwdSwKKwkJCSAgIHVuc2lnbmVkIG1hcCwKKwkJCSAgIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKwkJCSAgIGFkZHJlc3Nfd29yZCBhZGRyLAorCQkJICAgdW5zaWduZWQgbnJfYnl0ZXMpCit7CisgIGFkZHJlc3Nfd29yZCBieXRlX3hvciA9IChjcHUgPT0gTlVMTCA/IFNUQVRFX0NPUkUgKHNkKS0+Ynl0ZV94b3IgOiBDUFVfQ09SRSAoY3B1KS0+eG9yWzBdKTsKKyAgaWYgKCFXSVRIX1hPUl9FTkRJQU4gfHwgIWJ5dGVfeG9yKQorICAgIHJldHVybiBzaW1fY29yZV93cml0ZV9idWZmZXIgKHNkLCBjcHUsIG1hcCwgYnVmZmVyLCBhZGRyLCBucl9ieXRlcyk7CisgIGVsc2UKKyAgICAvKiBvbmx5IGJyZWFrIHVwIHRyYW5zZmVycyB3aGVuIHhvci1lbmRpYW4gaXMgYm90aCBzZWxlY3RlZCBhbmQgZW5hYmxlZCAqLworICAgIHsKKyAgICAgIHVuc2lnbmVkXzEgeFtXSVRIX1hPUl9FTkRJQU4gKyAxXTsgLyogKzEgdG8gYXZvaWQgemVybyBzaXplZCBhcnJheSAqLworICAgICAgdW5zaWduZWQgbnJfdHJhbnNmZXJlZCA9IDA7CisgICAgICBhZGRyZXNzX3dvcmQgc3RhcnQgPSBhZGRyOworICAgICAgdW5zaWduZWQgbnJfdGhpc190cmFuc2ZlciA9IChXSVRIX1hPUl9FTkRJQU4gLSAoYWRkciAmIH4oV0lUSF9YT1JfRU5ESUFOIC0gMSkpKTsKKyAgICAgIGFkZHJlc3Nfd29yZCBzdG9wOworICAgICAgLyogaW5pdGlhbCBhbmQgaW50ZXJtZWRpYXRlIHRyYW5zZmVycyBhcmUgYnJva2VuIHdoZW4gdGhleSBjcm9zcworICAgICAgICAgYW4gWE9SIGVuZGlhbiBib3VuZGFyeSAqLworICAgICAgd2hpbGUgKG5yX3RyYW5zZmVyZWQgKyBucl90aGlzX3RyYW5zZmVyIDwgbnJfYnl0ZXMpCisJLyogaW5pdGlhbC9pbnRlcm1lZGlhdGUgdHJhbnNmZXJzICovCisJeworCSAgLyogc2luY2UgeG9yLWVuZGlhbiBpcyBlbmFibGVkIHN0b3BeeG9yIGRlZmluZXMgdGhlIHN0YXJ0CisgICAgICAgICAgICAgYWRkcmVzcyBvZiB0aGUgdHJhbnNmZXIgKi8KKwkgIHN0b3AgPSBzdGFydCArIG5yX3RoaXNfdHJhbnNmZXIgLSAxOworCSAgU0lNX0FTU0VSVCAoc3RhcnQgPD0gc3RvcCk7CisJICBTSU1fQVNTRVJUICgoc3RvcCBeIGJ5dGVfeG9yKSA8PSAoc3RhcnQgXiBieXRlX3hvcikpOworCSAgcmV2ZXJzZV9uICh4LCAmKCh1bnNpZ25lZF8xKilidWZmZXIpW25yX3RyYW5zZmVyZWRdLCBucl90aGlzX3RyYW5zZmVyKTsKKwkgIGlmIChzaW1fY29yZV9yZWFkX2J1ZmZlciAoc2QsIGNwdSwgbWFwLCB4LCBzdG9wIF4gYnl0ZV94b3IsIG5yX3RoaXNfdHJhbnNmZXIpCisJICAgICAgIT0gbnJfdGhpc190cmFuc2ZlcikKKwkgICAgcmV0dXJuIG5yX3RyYW5zZmVyZWQ7CisJICBucl90cmFuc2ZlcmVkICs9IG5yX3RoaXNfdHJhbnNmZXI7CisJICBucl90aGlzX3RyYW5zZmVyID0gV0lUSF9YT1JfRU5ESUFOOworCSAgc3RhcnQgPSBzdG9wICsgMTsKKwl9CisgICAgICAvKiBmaW5hbCB0cmFuc2ZlciAqLworICAgICAgbnJfdGhpc190cmFuc2ZlciA9IG5yX2J5dGVzIC0gbnJfdHJhbnNmZXJlZDsKKyAgICAgIHN0b3AgPSBzdGFydCArIG5yX3RoaXNfdHJhbnNmZXIgLSAxOworICAgICAgU0lNX0FTU0VSVCAoc3RvcCA9PSAoYWRkciArIG5yX2J5dGVzIC0gMSkpOworICAgICAgcmV2ZXJzZV9uICh4LCAmKCh1bnNpZ25lZF8xKilidWZmZXIpW25yX3RyYW5zZmVyZWRdLCBucl90aGlzX3RyYW5zZmVyKTsKKyAgICAgIGlmIChzaW1fY29yZV9yZWFkX2J1ZmZlciAoc2QsIGNwdSwgbWFwLCB4LCBzdG9wIF4gYnl0ZV94b3IsIG5yX3RoaXNfdHJhbnNmZXIpCisJICAhPSBucl90aGlzX3RyYW5zZmVyKQorCXJldHVybiBucl90cmFuc2ZlcmVkOworICAgICAgcmV0dXJuIG5yX2J5dGVzOworICAgIH0KK30KKyNlbmRpZgorCisKKworLyogZGVmaW5lIHRoZSByZWFkL3dyaXRlIDEvMi80LzgvMTYvd29yZCBmdW5jdGlvbnMgKi8KKworI2RlZmluZSBOIDE2CisjaW5jbHVkZSAic2ltLW4tY29yZS5oIgorCisjZGVmaW5lIE4gOAorI2luY2x1ZGUgInNpbS1uLWNvcmUuaCIKKworI2RlZmluZSBOIDcKKyNkZWZpbmUgTSA4CisjaW5jbHVkZSAic2ltLW4tY29yZS5oIgorCisjZGVmaW5lIE4gNgorI2RlZmluZSBNIDgKKyNpbmNsdWRlICJzaW0tbi1jb3JlLmgiCisKKyNkZWZpbmUgTiA1CisjZGVmaW5lIE0gOAorI2luY2x1ZGUgInNpbS1uLWNvcmUuaCIKKworI2RlZmluZSBOIDQKKyNpbmNsdWRlICJzaW0tbi1jb3JlLmgiCisKKyNkZWZpbmUgTiAzCisjZGVmaW5lIE0gNAorI2luY2x1ZGUgInNpbS1uLWNvcmUuaCIKKworI2RlZmluZSBOIDIKKyNpbmNsdWRlICJzaW0tbi1jb3JlLmgiCisKKyNkZWZpbmUgTiAxCisjaW5jbHVkZSAic2ltLW4tY29yZS5oIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWNvcmUuaCBiL3NpbS9jb21tb24vc2ltLWNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmYxNWEzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tY29yZS5oCkBAIC0wLDAgKzEsMzQzIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIFNJTV9DT1JFX0gKKyNkZWZpbmUgU0lNX0NPUkVfSAorCisKKy8qIGNvcmUgc2lnbmFscyAoZXJyb3IgY29uZGl0aW9ucykKKyAgIERlZmluZSBTSU1fQ09SRV9TSUdOQUwgdG8gY2F0Y2ggdGhlc2Ugc2lnbmFscyAtIHNlZSBzaW0tY29yZS5jIGZvcgorICAgZGV0YWlscy4gICovCisKK3R5cGVkZWYgZW51bSB7CisgIHNpbV9jb3JlX3VubWFwcGVkX3NpZ25hbCwKKyAgc2ltX2NvcmVfdW5hbGlnbmVkX3NpZ25hbCwKKyAgbnJfc2ltX2NvcmVfc2lnbmFscywKK30gc2ltX2NvcmVfc2lnbmFsczsKKworLyogVHlwZSBvZiBTSU1fQ09SRV9TSUdOQUwgaGFuZGxlci4gICovCit0eXBlZGVmIHZvaWQgKFNJTV9DT1JFX1NJR05BTF9GTikKKyAgICAgKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIHNpbV9jaWEgY2lhLCB1bnNpZ25lZCBtYXAsIGludCBucl9ieXRlcywKKyAgICAgIGFkZHJlc3Nfd29yZCBhZGRyLCB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyLCBzaW1fY29yZV9zaWduYWxzIHNpZyk7CisKK2V4dGVybiBTSU1fQ09SRV9TSUdOQUxfRk4gc2ltX2NvcmVfc2lnbmFsOworCisKKy8qIGJhc2ljIHR5cGVzICovCisKK3R5cGVkZWYgc3RydWN0IF9zaW1fY29yZV9tYXBwaW5nIHNpbV9jb3JlX21hcHBpbmc7CitzdHJ1Y3QgX3NpbV9jb3JlX21hcHBpbmcgeworICAvKiBjb21tb24gKi8KKyAgaW50IGxldmVsOworICBpbnQgc3BhY2U7CisgIHVuc2lnbmVkX3dvcmQgYmFzZTsKKyAgdW5zaWduZWRfd29yZCBib3VuZDsKKyAgdW5zaWduZWRfd29yZCBucl9ieXRlczsKKyAgdW5zaWduZWQgbWFzazsKKyAgLyogbWVtb3J5IG1hcCAqLworICB2b2lkICpmcmVlX2J1ZmZlcjsKKyAgdm9pZCAqYnVmZmVyOworICAvKiBjYWxsYmFjayBtYXAgKi8KKyNpZiAoV0lUSF9IVykKKyAgc3RydWN0IGh3ICpkZXZpY2U7CisjZWxzZQorICBkZXZpY2UgKmRldmljZTsKKyNlbmRpZgorICAvKiB0cmFjaW5nICovCisgIGludCB0cmFjZTsKKyAgLyogZ3Jvd3RoICovCisgIHNpbV9jb3JlX21hcHBpbmcgKm5leHQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfc2ltX2NvcmVfbWFwIHNpbV9jb3JlX21hcDsKK3N0cnVjdCBfc2ltX2NvcmVfbWFwIHsKKyAgc2ltX2NvcmVfbWFwcGluZyAqZmlyc3Q7Cit9OworCisKK3R5cGVkZWYgc3RydWN0IF9zaW1fY29yZV9jb21tb24geworICBzaW1fY29yZV9tYXAgbWFwW25yX21hcHNdOworfSBzaW1fY29yZV9jb21tb247CisKKworLyogTWFpbiBjb3JlIHN0cnVjdHVyZSAqLworCit0eXBlZGVmIHN0cnVjdCBfc2ltX2NvcmUgc2ltX2NvcmU7CitzdHJ1Y3QgX3NpbV9jb3JlIHsKKyAgc2ltX2NvcmVfY29tbW9uIGNvbW1vbjsKKyAgYWRkcmVzc193b3JkIGJ5dGVfeG9yOyAvKiBhcHBseSB4b3IgdW5pdmVyc2FsbHkgKi8KK307CisKKworLyogUGVyIENQVSBkaXN0cmlidXRlZCBjb21wb25lbnQgb2YgdGhlIGNvcmUuICBBdCBwcmVzZW50IHRoaXMgaXMKKyAgIG1vc3RseSBhIGNsb25lIG9mIHRoZSBnbG9iYWwgY29yZSBkYXRhIHN0cnVjdHVyZS4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3NpbV9jcHVfY29yZSB7CisgIHNpbV9jb3JlX2NvbW1vbiBjb21tb247CisgIGFkZHJlc3Nfd29yZCB4b3JbV0lUSF9YT1JfRU5ESUFOICsgMV07IC8qICsxIHRvIGF2b2lkIHplcm8tc2l6ZWQgYXJyYXkgKi8KK30gc2ltX2NwdV9jb3JlOworCisKKy8qIEluc3RhbGwgdGhlICJjb3JlIiBtb2R1bGUuICAqLworCitleHRlcm4gU0lNX1JDIHNpbV9jb3JlX2luc3RhbGwgKFNJTV9ERVNDIHNkKTsKKworCisKKy8qIENyZWF0ZSBhIG1lbW9yeSByZWdpb24gd2l0aGluIHRoZSBjb3JlLgorCisgICBDUFUgLSB3aGVuIG5vbiBOVUxMLCBzcGVjaWZlcyB0aGUgc2luZ2xlIHByb2Nlc3NvciB0aGF0IHRoZSBtZW1vcnkKKyAgIHNwYWNlIGlzIHRvIGJlIGF0dGFjaGVkIHRvLiAoSU5JTVBMRU1FTlRFRCkuCisKKyAgIExFVkVMIC0gc3BlY2lmaWVzIHRoZSBvcmRlcmluZyBvZiB0aGUgbWVtb3J5IHJlZ2lvbi4gIExvd2VyIHJlZ2lvbnMKKyAgIGFyZSBzZWFyY2hlZCBmaXJzdC4gIFdpdGhpbiBhIGxldmVsLCBtZW1vcnkgcmVnaW9ucyBjYW4gbm90CisgICBvdmVybGFwLgorCisgICBNQVBNQVNLIC0gQml0bWFzayBzcGVjaWZ5aW5nIHRoZSBtZW1vcnkgbWFwcyB0aGF0IHRoZSByZWdpb24gaXMgdG8KKyAgIGJlIGF0dGFjaGVkIHRvLiAgVHlwaWNhbGx5IHRoZSBlbnVtcyBzaW0tYmFzaWNzLmg6YWNjZXNzXyogYXJlIHVzZWQuCisKKyAgIEFERFJFU1NfU1BBQ0UgLSBGb3IgZGV2aWNlIHJlZ2lvbnMsIGEgTUFQOkFERFJFU1MgcGFpciBpcworICAgdHJhbnNsYXRlZCBpbnRvIEFERFJFU1NfU1BBQ0U6T0ZGU0VUIGJlZm9yZSBiZWluZyBwYXNzZWQgdG8gdGhlCisgICBjbGllbnQgZGV2aWNlLgorCisgICBNT0RVTE8gLSB3aGVuIHRoZSBzaW11bGF0b3IgaGFzIGJlZW4gY29uZmlndXJlZCBXSVRIX01PRFVMTyBzdXBwb3J0CisgICBhbmQgaXMgZ3JlYXRlciB0aGFuIHplcm8sIHNwZWNpZmllcyB0aGF0IGFjY2Vzc2VzIHRvIHRoZSByZWdpb24KKyAgIFtBRERSIC4uIEFERFIrTlJfQllURVMpIHNob3VsZCBiZSBtYXBwZWQgb250byB0aGUgc3ViIHJlZ2lvbiBbQUREUgorICAgLi4gQUREUitNT0RVTE8pLiAgVGhlIG1vZHVsbyB2YWx1ZSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLgorCisgICBERVZJQ0UgLSBXaGVuIG5vbiBOVUxMLCBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIGEgY2FsbGJhY2sgbWVtb3J5CisgICBzcGFjZSBhbmQgc3BlY2lmaWVkIGRldmljZSdzIG1lbW9yeSBjYWxsYmFjayBoYW5kbGVyIHNob3VsZCBiZQorICAgY2FsbGVkLgorCisgICBPUFRJT05BTF9CVUZGRVIgLSB3aGVuIG5vbiBOVUxMLCBzcGVjaWZpZXMgdGhlIGJ1ZmZlciB0byB1c2UgZm9yCisgICBkYXRhIHJlYWQgJiB3cml0dGVuIHRvIHRoZSByZWdpb24uICBOb3JtYWxseSBhIG1vcmUgZWZmaWNpZW50CisgICBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgdXNlZC4gIEl0IGlzIGFzc3VtZWQgdGhhdCBidWZmZXIgaXMgYWxsb2NhdGVkCisgICBzdWNoIHRoYXQgdGhlIGJ5dGUgYWxpZ25tZWQgb2YgT1BUSU9OQUxfQlVGRkVSIG1hdGNoZXMgQUREUiB2aXMKKyAgIChPUFRJT05BTF9CVUZGRVIgJSA4KSA9PSAoQUREUiAlIDgpKS4gIEl0IGlzIGRlZmluZWQgdG8gYmUgYSBzdWItb3B0aW1hbAorICAgaG9vayB0aGF0IGFsbG93cyBjbGllbnRzIHRvIGRvIG5hc3R5IHRoaW5ncyB0aGF0IHRoZSBpbnRlcmZhY2UgZG9lc24ndAorICAgYWNjb21vZGF0ZS4gKi8KKworZXh0ZXJuIHZvaWQgc2ltX2NvcmVfYXR0YWNoCisoU0lNX0RFU0Mgc2QsCisgc2ltX2NwdSAqY3B1LAorIGludCBsZXZlbCwKKyB1bnNpZ25lZCBtYXBtYXNrLAorIGludCBhZGRyZXNzX3NwYWNlLAorIGFkZHJlc3Nfd29yZCBhZGRyLAorIGFkZHJlc3Nfd29yZCBucl9ieXRlcywKKyB1bnNpZ25lZCBtb2R1bG8sCisjaWYgKFdJVEhfSFcpCisgc3RydWN0IGh3ICpjbGllbnQsCisjZWxzZQorIGRldmljZSAqY2xpZW50LAorI2VuZGlmCisgdm9pZCAqb3B0aW9uYWxfYnVmZmVyKTsKKworCisvKiBEZWxldGUgYSBtZW1vcnkgc2VjdGlvbiB3aXRoaW4gdGhlIGNvcmUuCisKKyAqLworCitleHRlcm4gdm9pZCBzaW1fY29yZV9kZXRhY2gKKyhTSU1fREVTQyBzZCwKKyBzaW1fY3B1ICpjcHUsCisgaW50IGxldmVsLAorIGludCBhZGRyZXNzX3NwYWNlLAorIGFkZHJlc3Nfd29yZCBhZGRyKTsKKworCisvKiBWYXJpYWJsZSBzaXplZCByZWFkL3dyaXRlCisKKyAgIFRyYW5zZmVyIGEgdmFyaWFibGUgc2l6ZWQgYmxvY2sgb2YgcmF3IGRhdGEgYmV0d2VlbiB0aGUgaG9zdCBhbmQKKyAgIHRhcmdldC4gIFNob3VsZCBhbnkgcHJvYmxlbXMgb2NjdXJlLCB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgICBzdWNjZXNzZnVsbHkgdHJhbnNmZXJlZCBpcyByZXR1cm5lZC4KKworICAgTm8gaG9zdC90YXJnZXQgYnl0ZSBlbmRpYW4gY29udmVyc2lvbiBpcyBwZXJmb3JtZWQuICBObyB4b3ItZW5kaWFuCisgICBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZC4KKworICAgSWYgQ1BVIGFyZ3VtZW50LCB3aGVuIG5vbiBOVUxMLCBzcGVjaWZpZXMgdGhlIHByb2Nlc3NvciBzcGVjaWZpYworICAgYWRkcmVzcyBtYXAgdGhhdCBpcyB0byBiZSB1c2VkIGluIHRoZSB0cmFuc2Zlci4gKi8KKworCitleHRlcm4gdW5zaWduZWQgc2ltX2NvcmVfcmVhZF9idWZmZXIKKyhTSU1fREVTQyBzZCwKKyBzaW1fY3B1ICpjcHUsCisgdW5zaWduZWQgbWFwLAorIHZvaWQgKmJ1ZmZlciwKKyBhZGRyZXNzX3dvcmQgYWRkciwKKyB1bnNpZ25lZCBucl9ieXRlcyk7CisKK2V4dGVybiB1bnNpZ25lZCBzaW1fY29yZV93cml0ZV9idWZmZXIKKyhTSU1fREVTQyBzZCwKKyBzaW1fY3B1ICpjcHUsCisgdW5zaWduZWQgbWFwLAorIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKyBhZGRyZXNzX3dvcmQgYWRkciwKKyB1bnNpZ25lZCBucl9ieXRlcyk7CisKKworCisvKiBDb25maWd1cmUgdGhlIGNvcmUncyBYT1IgZW5kaWFuIHRyYW5zZmVyIG1vZGUuICBPbmx5IGFwcGxpY2FibGUKKyAgIHdoZW4gV0lUSF9YT1JfRU5ESUFOIGlzIGVuYWJsZWQuCisKKyAgIFRhcmdldHMgc3Vwb3J0aW5nIFhPUiBlbmRpYW4sIHNoYWxsIG5vdGlmeSB0aGUgY29yZSBvZiBhbnkgY2hhbmdlcworICAgaW4gc3RhdGUgdmlhIHRoaXMgY2FsbC4KKworICAgVGhlIENQVSBhcmd1bWVudCwgd2hlbiBub24gTlVMTCwgc3BlY2lmZXMgdGhlIHNpbmdsZSBwcm9jZXNzb3IgdGhhdAorICAgdGhlIHhvci1lbmRpYW4gY29uZmlndXJhdGlvbiBpcyB0byBiZSBhcHBsaWVkIHRvLiAqLworCitleHRlcm4gdm9pZCBzaW1fY29yZV9zZXRfeG9yCisoU0lNX0RFU0Mgc2QsCisgc2ltX2NwdSAqY3B1LAorIGludCBpc194b3IpOworCisKKy8qIFhPUiB2ZXJzaW9uIG9mIHZhcmlhYmxlIHNpemVkIHJlYWQvd3JpdGUuCisKKyAgIFRyYW5zZmVyIGEgdmFyaWFibGUgc2l6ZWQgYmxvY2sgb2YgcmF3IGRhdGEgYmV0d2VlbiB0aGUgaG9zdCBhbmQKKyAgIHRhcmdldC4gIFNob3VsZCBhbnkgcHJvYmxlbXMgb2NjdXJlLCB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgICBzdWNjZXNzZnVsbHkgdHJhbnNmZXJlZCBpcyByZXR1cm5lZC4KKworICAgTm8gaG9zdC90YXJnZXQgYnl0ZSBlbmRpYW4gY29udmVyc2lvbiBpcyBwZXJmb3JtZWQuICBJZiBhcHBsaWNhYmxlCisgICAoV0lUSF9YT1JfRU5ESUFOIGFuZCB4b3ItZW5kaWFuIHNldCksIHhvci1lbmRpYW4gY29udmVyc2lvbiAqaXMqCisgICBwZXJmb3JtZWQuCisKKyAgIElmIENQVSBhcmd1bWVudCwgd2hlbiBub24gTlVMTCwgc3BlY2lmaWVzIHRoZSBwcm9jZXNzb3Igc3BlY2lmaWMKKyAgIGFkZHJlc3MgbWFwIHRoYXQgaXMgdG8gYmUgdXNlZCBpbiB0aGUgdHJhbnNmZXIuICovCisKK2V4dGVybiB1bnNpZ25lZCBzaW1fY29yZV94b3JfcmVhZF9idWZmZXIKKyhTSU1fREVTQyBzZCwKKyBzaW1fY3B1ICpjcHUsCisgdW5zaWduZWQgbWFwLAorIHZvaWQgKmJ1ZmZlciwKKyBhZGRyZXNzX3dvcmQgYWRkciwKKyB1bnNpZ25lZCBucl9ieXRlcyk7CisKK2V4dGVybiB1bnNpZ25lZCBzaW1fY29yZV94b3Jfd3JpdGVfYnVmZmVyCisoU0lNX0RFU0Mgc2QsCisgc2ltX2NwdSAqY3B1LAorIHVuc2lnbmVkIG1hcCwKKyBjb25zdCB2b2lkICpidWZmZXIsCisgYWRkcmVzc193b3JkIGFkZHIsCisgdW5zaWduZWQgbnJfYnl0ZXMpOworCisKKworLyogRml4ZWQgc2l6ZWQsIHByb2Nlc3NvciBvcmllbnRlZCwgcmVhZC93cml0ZS4KKworICAgVHJhbnNmZXIgYSBmaXhlZCBhbW91dCBvZiBtZW1vcnkgYmV0d2VlbiB0aGUgaG9zdCBhbmQgdGFyZ2V0LiAgVGhlCisgICBkYXRhIHRyYW5zZmVyZWQgaXMgdHJhbnNsYXRlZCBmcm9tL3RvIGhvc3QgdG8vZnJvbSB0YXJnZXQgYnl0ZQorICAgb3JkZXIgKGluY2x1ZGluZyB4b3IgZW5kaWFuKS4gIFNob3VsZCB0aGUgdHJhbnNmZXIgZmFpbCwgdGhlCisgICBvcGVyYXRpb24gc2hhbGwgYWJvcnQgKG5vIHJldHVybikuCisKKyAgIEFMSUdORUQgYXNzdW1lcyB5aGF0IHRoZSBzcGVjaWZpZWQgQUREUkVTUyBpcyBjb3JyZWN0bHkgYWxsaWduZWQKKyAgIGZvciBhbiBOIGJ5dGUgdHJhbnNmZXIgKG5vIGFsaWdubWVudCBjaGVja3MgYXJlIG1hZGUpLiAgUGFzc2luZyBhbgorICAgaW5jb3JyZWN0bHkgYWxpZ25lZCBBRERSRVNTIGlzIGVycm9uZW91cy4KKworICAgVU5BTElHTkVEIGNoZWNrcy9tb2RpZmllcyB0aGUgQUREUkVTUyBhY2NvcmRpbmcgdG8gdGhlIHJlcXVpcmVtZW50cworICAgb2YgYW4gTiBieXRlIHRyYW5zZmVyLiBBY3Rpb24sIGFzIGRlZmluZWQgYnkgV0lUSF9BTElHTk1FTlQsIGJlaW5nCisgICB0YWtlbiBzaG91bGQgdGhlIGNoZWNrIGZhaWwuCisKKyAgIE1JU1NBTElHTkVEIHRyYW5zZmVycyB0aGUgZGF0YSByZWdhcmRsZXNzLgorCisgICBNaXNhbGlnbmVkIHhvci1lbmRpYW4gYWNjZXNzZXMgYXJlIGJyb2tlbiBpbnRvIGEgc2VxdWVuY2Ugb2YKKyAgIHRyYW5zZmVycyBlYWNoIDw9IFdJVEhfWE9SX0VORElBTiBieXRlcyAqLworCisKKyNkZWZpbmUgREVDTEFSRV9TSU1fQ09SRV9XUklURV9OKEFMSUdOTUVOVCxOLE0pIFwKK0lOTElORV9TSU1fQ09SRVwKKyh2b2lkKSBzaW1fY29yZV93cml0ZV8jI0FMSUdOTUVOVCMjXyMjTiBcCisoc2ltX2NwdSAqY3B1LCBcCisgc2ltX2NpYSBjaWEsIFwKKyB1bnNpZ25lZCBtYXAsIFwKKyBhZGRyZXNzX3dvcmQgYWRkciwgXAorIHVuc2lnbmVkXyMjTSB2YWwpOworCitERUNMQVJFX1NJTV9DT1JFX1dSSVRFX04oYWxpZ25lZCwxLDEpCitERUNMQVJFX1NJTV9DT1JFX1dSSVRFX04oYWxpZ25lZCwyLDIpCitERUNMQVJFX1NJTV9DT1JFX1dSSVRFX04oYWxpZ25lZCw0LDQpCitERUNMQVJFX1NJTV9DT1JFX1dSSVRFX04oYWxpZ25lZCw4LDgpCitERUNMQVJFX1NJTV9DT1JFX1dSSVRFX04oYWxpZ25lZCwxNiwxNikKKworI2RlZmluZSBzaW1fY29yZV93cml0ZV91bmFsaWduZWRfMSBzaW1fY29yZV93cml0ZV9hbGlnbmVkXzEgCitERUNMQVJFX1NJTV9DT1JFX1dSSVRFX04odW5hbGlnbmVkLDIsMikKK0RFQ0xBUkVfU0lNX0NPUkVfV1JJVEVfTih1bmFsaWduZWQsNCw0KQorREVDTEFSRV9TSU1fQ09SRV9XUklURV9OKHVuYWxpZ25lZCw4LDgpCitERUNMQVJFX1NJTV9DT1JFX1dSSVRFX04odW5hbGlnbmVkLDE2LDE2KQorCitERUNMQVJFX1NJTV9DT1JFX1dSSVRFX04obWlzYWxpZ25lZCwzLDQpCitERUNMQVJFX1NJTV9DT1JFX1dSSVRFX04obWlzYWxpZ25lZCw1LDgpCitERUNMQVJFX1NJTV9DT1JFX1dSSVRFX04obWlzYWxpZ25lZCw2LDgpCitERUNMQVJFX1NJTV9DT1JFX1dSSVRFX04obWlzYWxpZ25lZCw3LDgpCisKKyNkZWZpbmUgc2ltX2NvcmVfd3JpdGVfMSBzaW1fY29yZV93cml0ZV9hbGlnbmVkXzEKKyNkZWZpbmUgc2ltX2NvcmVfd3JpdGVfMiBzaW1fY29yZV93cml0ZV9hbGlnbmVkXzIKKyNkZWZpbmUgc2ltX2NvcmVfd3JpdGVfNCBzaW1fY29yZV93cml0ZV9hbGlnbmVkXzQKKyNkZWZpbmUgc2ltX2NvcmVfd3JpdGVfOCBzaW1fY29yZV93cml0ZV9hbGlnbmVkXzgKKyNkZWZpbmUgc2ltX2NvcmVfd3JpdGVfMTYgc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF8xNgorCisjZGVmaW5lIHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF93b3JkIFhDT05DQVQyKHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF8sV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFKQorI2RlZmluZSBzaW1fY29yZV93cml0ZV9hbGlnbmVkX3dvcmQgWENPTkNBVDIoc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF8sV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFKQorI2RlZmluZSBzaW1fY29yZV93cml0ZV93b3JkIFhDT05DQVQyKHNpbV9jb3JlX3dyaXRlXyxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUpCisKKyN1bmRlZiBERUNMQVJFX1NJTV9DT1JFX1dSSVRFX04KKworCisjZGVmaW5lIERFQ0xBUkVfU0lNX0NPUkVfUkVBRF9OKEFMSUdOTUVOVCxOLE0pIFwKK0lOTElORV9TSU1fQ09SRVwKKyh1bnNpZ25lZF8jI00pIHNpbV9jb3JlX3JlYWRfIyNBTElHTk1FTlQjI18jI04gXAorKHNpbV9jcHUgKmNwdSwgXAorIHNpbV9jaWEgY2lhLCBcCisgdW5zaWduZWQgbWFwLCBcCisgYWRkcmVzc193b3JkIGFkZHIpOworCitERUNMQVJFX1NJTV9DT1JFX1JFQURfTihhbGlnbmVkLDEsMSkKK0RFQ0xBUkVfU0lNX0NPUkVfUkVBRF9OKGFsaWduZWQsMiwyKQorREVDTEFSRV9TSU1fQ09SRV9SRUFEX04oYWxpZ25lZCw0LDQpCitERUNMQVJFX1NJTV9DT1JFX1JFQURfTihhbGlnbmVkLDgsOCkKK0RFQ0xBUkVfU0lNX0NPUkVfUkVBRF9OKGFsaWduZWQsMTYsMTYpCisKKyNkZWZpbmUgc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfMSBzaW1fY29yZV9yZWFkX2FsaWduZWRfMQorREVDTEFSRV9TSU1fQ09SRV9SRUFEX04odW5hbGlnbmVkLDIsMikKK0RFQ0xBUkVfU0lNX0NPUkVfUkVBRF9OKHVuYWxpZ25lZCw0LDQpCitERUNMQVJFX1NJTV9DT1JFX1JFQURfTih1bmFsaWduZWQsOCw4KQorREVDTEFSRV9TSU1fQ09SRV9SRUFEX04odW5hbGlnbmVkLDE2LDE2KQorCitERUNMQVJFX1NJTV9DT1JFX1JFQURfTihtaXNhbGlnbmVkLDMsNCkKK0RFQ0xBUkVfU0lNX0NPUkVfUkVBRF9OKG1pc2FsaWduZWQsNSw4KQorREVDTEFSRV9TSU1fQ09SRV9SRUFEX04obWlzYWxpZ25lZCw2LDgpCitERUNMQVJFX1NJTV9DT1JFX1JFQURfTihtaXNhbGlnbmVkLDcsOCkKKworCisjZGVmaW5lIHNpbV9jb3JlX3JlYWRfMSBzaW1fY29yZV9yZWFkX2FsaWduZWRfMQorI2RlZmluZSBzaW1fY29yZV9yZWFkXzIgc2ltX2NvcmVfcmVhZF9hbGlnbmVkXzIKKyNkZWZpbmUgc2ltX2NvcmVfcmVhZF80IHNpbV9jb3JlX3JlYWRfYWxpZ25lZF80CisjZGVmaW5lIHNpbV9jb3JlX3JlYWRfOCBzaW1fY29yZV9yZWFkX2FsaWduZWRfOAorI2RlZmluZSBzaW1fY29yZV9yZWFkXzE2IHNpbV9jb3JlX3JlYWRfYWxpZ25lZF8xNgorCisjZGVmaW5lIHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkX3dvcmQgWENPTkNBVDIoc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfLFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSkKKyNkZWZpbmUgc2ltX2NvcmVfcmVhZF9hbGlnbmVkX3dvcmQgWENPTkNBVDIoc2ltX2NvcmVfcmVhZF9hbGlnbmVkXyxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUpCisjZGVmaW5lIHNpbV9jb3JlX3JlYWRfd29yZCBYQ09OQ0FUMihzaW1fY29yZV9yZWFkXyxXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUpCisKKyN1bmRlZiBERUNMQVJFX1NJTV9DT1JFX1JFQURfTgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tY3B1LmMgYi9zaW0vY29tbW9uL3NpbS1jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTZkNTJjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tY3B1LmMKQEAgLTAsMCArMSw4MCBAQAorLyogQ1BVIHN1cHBvcnQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2luY2x1ZGUgImJmZC5oIgorCisvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYWxsIGNwdXMgaW4gdGhlIHNpbXVsYXRvci4KKyAgIFNwYWNlIGZvciB0aGUgY3B1IG11c3QgY3VycmVudGx5IGV4aXN0IHByaW9yIHRvIHBhcnNpbmcgQVJHVi4KKyAgIEVYVFJBX0JZVEVTIGlzIGFkZGl0aW9uYWwgc3BhY2UgdG8gYWxsb2NhdGUgZm9yIHRoZSBzaW1fY3B1IHN0cnVjdC4gICovCisvKiA/Pz8gd2lwLiAgYmV0dGVyIHNvbHV0aW9uIG11c3Qgd2FpdC4gICovCisKK1NJTV9SQworc2ltX2NwdV9hbGxvY19hbGwgKFNJTV9ERVNDIHNkLCBpbnQgbmNwdXMsIGludCBleHRyYV9ieXRlcykKK3sKKyAgaW50IGM7CisKKyAgZm9yIChjID0gMDsgYyA8IG5jcHVzOyArK2MpCisgICAgU1RBVEVfQ1BVIChzZCwgYykgPSBzaW1fY3B1X2FsbG9jIChzZCwgZXh0cmFfYnl0ZXMpOworICByZXR1cm4gU0lNX1JDX09LOworfQorCisvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSBjcHUgb2JqZWN0LgorICAgRVhUUkFfQllURVMgaXMgYWRkaXRpb25hbCBzcGFjZSB0byBhbGxvY2F0ZSBmb3IgdGhlIHNpbV9jcHUgc3RydWN0LiAgKi8KKworc2ltX2NwdSAqCitzaW1fY3B1X2FsbG9jIChTSU1fREVTQyBzZCwgaW50IGV4dHJhX2J5dGVzKQoreworICByZXR1cm4gemFsbG9jIChzaXplb2YgKHNpbV9jcHUpICsgZXh0cmFfYnl0ZXMpOworfQorCisvKiBGcmVlIGFsbCByZXNvdXJjZXMgaGVsZCBieSBhbGwgY3B1cy4gICovCisKK3ZvaWQKK3NpbV9jcHVfZnJlZV9hbGwgKFNJTV9ERVNDIHNkKQoreworICBpbnQgYzsKKworICBmb3IgKGMgPSAwOyBjIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrYykKKyAgICBpZiAoU1RBVEVfQ1BVIChzZCwgYykpCisgICAgICBzaW1fY3B1X2ZyZWUgKFNUQVRFX0NQVSAoc2QsIGMpKTsKK30KKworLyogRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgQ1BVLiAgKi8KKwordm9pZAorc2ltX2NwdV9mcmVlIChzaW1fY3B1ICpjcHUpCit7CisgIHpmcmVlIChjcHUpOworfQorDAorLyogUEMgdXRpbGl0aWVzLiAgKi8KKworc2ltX2NpYQorc2ltX3BjX2dldCAoc2ltX2NwdSAqY3B1KQoreworICByZXR1cm4gKCogQ1BVX1BDX0ZFVENIIChjcHUpKSAoY3B1KTsKK30KKwordm9pZAorc2ltX3BjX3NldCAoc2ltX2NwdSAqY3B1LCBzaW1fY2lhIG5ld3ZhbCkKK3sKKyAgKCogQ1BVX1BDX1NUT1JFIChjcHUpKSAoY3B1LCBuZXd2YWwpOworfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tY3B1LmggYi9zaW0vY29tbW9uL3NpbS1jcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjlmZWFkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tY3B1LmgKQEAgLTAsMCArMSwxNTIgQEAKKy8qIENQVSBzdXBwb3J0LgorICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgYnkgc2ltLWJhc2UuaC4KKworICAgVGhpcyBmaWxlIHByb3ZpZGVzIGFuIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBzaW11bGF0b3IgZnJhbWV3b3JrIGFuZAorICAgdGhlIHNlbGVjdGVkIGNwdS4gICovCisKKyNpZm5kZWYgU0lNX0NQVV9ICisjZGVmaW5lIFNJTV9DUFVfSAorCisvKiBUeXBlIG9mIGZ1bmN0aW9uIHRvIHJldHVybiBhbiBpbnNuIG5hbWUuICAqLwordHlwZWRlZiBjb25zdCBjaGFyICogKENQVV9JTlNOX05BTUVfRk4pIChzaW1fY3B1ICosIGludCk7CisKKy8qIFR5cGVzIGZvciByZWdpc3RlciBhY2Nlc3MgZnVuY3Rpb25zLgorICAgVGhlc2Ugcm91dGluZXMgaW1wbGVtZW50IHRoZSBzaW1fe2ZldGNoLHN0b3JlfV9yZWdpc3RlciBpbnRlcmZhY2UuICAqLwordHlwZWRlZiBpbnQgKENQVVJFR19GRVRDSF9GTikgKHNpbV9jcHUgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosIGludCk7Cit0eXBlZGVmIGludCAoQ1BVUkVHX1NUT1JFX0ZOKSAoc2ltX2NwdSAqLCBpbnQsIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKKworLyogVHlwZXMgZm9yIFBDIGFjY2VzcyBmdW5jdGlvbnMuCisgICBTb21lIHNpbXVsYXRvcnMgcmVxdWlyZSBhIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIHRvIGFjY2VzcyB0aGUgcHJvZ3JhbQorICAgY291bnRlciBbYSBtYWNybyBpcyBpbnN1ZmZpY2llbnQgYXMgdGhlIFBDIGlzIGtlcHQgaW4gYSBjcHUtc3BlY2lmaWMgcGFydAorICAgb2YgdGhlIHNpbV9jcHUgc3RydWN0XS4gICovCit0eXBlZGVmIHNpbV9jaWEgKFBDX0ZFVENIX0ZOKSAoc2ltX2NwdSAqKTsKK3R5cGVkZWYgdm9pZCAoUENfU1RPUkVfRk4pIChzaW1fY3B1ICosIHNpbV9jaWEpOworCisvKiBQc2V1ZG8gYmFzZWNsYXNzIGZvciBlYWNoIGNwdS4gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKworICAvKiBCYWNrbGluayB0byBtYWluIHN0YXRlIHN0cnVjdC4gICovCisgIFNJTV9ERVNDIHN0YXRlOworI2RlZmluZSBDUFVfU1RBVEUoY3B1KSAoKGNwdSktPmJhc2Uuc3RhdGUpCisKKyAgLyogUHJvY2Vzc29yIGluZGV4IHdpdGhpbiB0aGUgU0RfREVTQyAqLworICBpbnQgaW5kZXg7CisjZGVmaW5lIENQVV9JTkRFWChjcHUpICgoY3B1KS0+YmFzZS5pbmRleCkKKworICAvKiBUaGUgbmFtZSBvZiB0aGUgY3B1LiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKyNkZWZpbmUgQ1BVX05BTUUoY3B1KSAoKGNwdSktPmJhc2UubmFtZSkKKworICAvKiBPcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgY3B1LiAgKi8KKyAgc3RydWN0IG9wdGlvbl9saXN0ICpvcHRpb25zOworI2RlZmluZSBDUFVfT1BUSU9OUyhjcHUpICgoY3B1KS0+YmFzZS5vcHRpb25zKQorCisgIC8qIFByb2Nlc3NvciBzcGVjaWZpYyBjb3JlIGRhdGEgKi8KKyAgc2ltX2NwdV9jb3JlIGNvcmU7CisjZGVmaW5lIENQVV9DT1JFKGNwdSkgKCYgKGNwdSktPmJhc2UuY29yZSkKKworICAvKiBOdW1iZXIgb2YgaW5zdHJ1Y3Rpb25zICh1c2VkIHRvIGl0ZXJhdGUgb3ZlciBDUFVfSU5TTl9OQU1FKS4gICovCisgIHVuc2lnbmVkIGludCBtYXhfaW5zbnM7CisjZGVmaW5lIENQVV9NQVhfSU5TTlMoY3B1KSAoKGNwdSktPmJhc2UubWF4X2luc25zKQorCisgIC8qIEZ1bmN0aW9uIHRvIHJldHVybiB0aGUgbmFtZSBvZiBhbiBpbnNuLiAgKi8KKyAgQ1BVX0lOU05fTkFNRV9GTiAqaW5zbl9uYW1lOworI2RlZmluZSBDUFVfSU5TTl9OQU1FKGNwdSkgKChjcHUpLT5iYXNlLmluc25fbmFtZSkKKworICAvKiBUcmFjZSBkYXRhLiAgU2VlIHNpbS10cmFjZS5oLiAgKi8KKyAgVFJBQ0VfREFUQSB0cmFjZV9kYXRhOworI2RlZmluZSBDUFVfVFJBQ0VfREFUQShjcHUpICgmIChjcHUpLT5iYXNlLnRyYWNlX2RhdGEpCisKKyAgLyogTWF4aW11bSBudW1iZXIgb2YgZGVidWdnYWJsZSBlbnRpdGllcy4KKyAgICAgVGhpcyBkZWJ1Z2dpbmcgaXMgbm90IGludGVuZGVkIGZvciBub3JtYWwgdXNlLgorICAgICBJdCBpcyBvbmx5IGVuYWJsZWQgd2hlbiB0aGUgc2ltdWxhdG9yIGlzIGNvbmZpZ3VyZWQgd2l0aCAtLXdpdGgtZGVidWcKKyAgICAgd2hpY2ggc2hvdWxkbid0IG5vcm1hbGx5IGJlIHNwZWNpZmllZC4gICovCisjaWZuZGVmIE1BWF9ERUJVR19WQUxVRVMKKyNkZWZpbmUgTUFYX0RFQlVHX1ZBTFVFUyA0CisjZW5kaWYKKworICAvKiBCb29sZWFuIGFycmF5IG9mIHNwZWNpZmllZCBkZWJ1Z2dpbmcgZmxhZ3MuICAqLworICBjaGFyIGRlYnVnX2ZsYWdzW01BWF9ERUJVR19WQUxVRVNdOworI2RlZmluZSBDUFVfREVCVUdfRkxBR1MoY3B1KSAoKGNwdSktPmJhc2UuZGVidWdfZmxhZ3MpCisgIC8qIFN0YW5kYXJkIHZhbHVlcy4gICovCisjZGVmaW5lIERFQlVHX0lOU05fSURYIDAKKyNkZWZpbmUgREVCVUdfTkVYVF9JRFggMiAvKiBzaW11bGF0b3Igc3BlY2lmaWMgZGVidWcgYml0cyBiZWdpbiBoZXJlICovCisKKyAgLyogRGVidWdnaW5nIG91dHB1dCBnb2VzIHRvIHRoaXMgb3Igc3RkZXJyIGlmIE5VTEwuCisgICAgIFdlIGNhbid0IHN0b3JlIGBzdGRlcnInIGhlcmUgYXMgc3RkZXJyIGdvZXMgdGhyb3VnaCBhIGNhbGxiYWNrLiAgKi8KKyAgRklMRSAqZGVidWdfZmlsZTsKKyNkZWZpbmUgQ1BVX0RFQlVHX0ZJTEUoY3B1KSAoKGNwdSktPmJhc2UuZGVidWdfZmlsZSkKKworICAvKiBQcm9maWxlIGRhdGEuICBTZWUgc2ltLXByb2ZpbGUuaC4gICovCisgIFBST0ZJTEVfREFUQSBwcm9maWxlX2RhdGE7CisjZGVmaW5lIENQVV9QUk9GSUxFX0RBVEEoY3B1KSAoJiAoY3B1KS0+YmFzZS5wcm9maWxlX2RhdGEpCisKKyNpZmRlZiBTSU1fSEFWRV9NT0RFTAorICAvKiBNYWNoaW5lIHRhYmxlcyBmb3IgdGhpcyBjcHUuICBTZWUgc2ltLW1vZGVsLmguICAqLworICBjb25zdCBNQUNIICptYWNoOworI2RlZmluZSBDUFVfTUFDSChjcHUpICgoY3B1KS0+YmFzZS5tYWNoKQorICAvKiBUaGUgc2VsZWN0ZWQgbW9kZWwuICAqLworICBjb25zdCBNT0RFTCAqbW9kZWw7CisjZGVmaW5lIENQVV9NT0RFTChjcHUpICgoY3B1KS0+YmFzZS5tb2RlbCkKKyAgLyogTW9kZWwgZGF0YSAocHJvZmlsaW5nIHN0YXRlLCBldGMuKS4gICovCisgIHZvaWQgKm1vZGVsX2RhdGE7CisjZGVmaW5lIENQVV9NT0RFTF9EQVRBKGNwdSkgKChjcHUpLT5iYXNlLm1vZGVsX2RhdGEpCisjZW5kaWYKKworICAvKiBSb3V0aW5lcyB0byBmZXRjaC9zdG9yZSByZWdpc3RlcnMuICAqLworICBDUFVSRUdfRkVUQ0hfRk4gKnJlZ19mZXRjaDsKKyNkZWZpbmUgQ1BVX1JFR19GRVRDSChjKSAoKGMpLT5iYXNlLnJlZ19mZXRjaCkKKyAgQ1BVUkVHX1NUT1JFX0ZOICpyZWdfc3RvcmU7CisjZGVmaW5lIENQVV9SRUdfU1RPUkUoYykgKChjKS0+YmFzZS5yZWdfc3RvcmUpCisgIFBDX0ZFVENIX0ZOICpwY19mZXRjaDsKKyNkZWZpbmUgQ1BVX1BDX0ZFVENIKGMpICgoYyktPmJhc2UucGNfZmV0Y2gpCisgIFBDX1NUT1JFX0ZOICpwY19zdG9yZTsKKyNkZWZpbmUgQ1BVX1BDX1NUT1JFKGMpICgoYyktPmJhc2UucGNfc3RvcmUpCisKK30gc2ltX2NwdV9iYXNlOworCisvKiBDcmVhdGUgYWxsIGNwdXMuICAqLworZXh0ZXJuIFNJTV9SQyBzaW1fY3B1X2FsbG9jX2FsbCAoU0lNX0RFU0MsIGludCwgaW50KTsKKy8qIENyZWF0ZSBhIGNwdS4gICovCitleHRlcm4gc2ltX2NwdSAqc2ltX2NwdV9hbGxvYyAoU0lNX0RFU0MsIGludCk7CisvKiBSZWxlYXNlIHJlc291cmNlcyBoZWxkIGJ5IGFsbCBjcHVzLiAgKi8KK2V4dGVybiB2b2lkIHNpbV9jcHVfZnJlZV9hbGwgKFNJTV9ERVNDKTsKKy8qIFJlbGVhc2UgcmVzb3VyY2VzIGhlbGQgYnkgYSBjcHUuICAqLworZXh0ZXJuIHZvaWQgc2ltX2NwdV9mcmVlIChzaW1fY3B1ICopOworCisvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjcHUgZGF0YSBmb3IgQ1BVX05BTUUsIG9yIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KK2V4dGVybiBzaW1fY3B1ICpzaW1fY3B1X2xvb2t1cCAoU0lNX0RFU0MsIGNvbnN0IGNoYXIgKik7CisKKy8qIFJldHVybiBwcmVmaXggdG8gdXNlIGluIGNwdSBzcGVjaWZpYyBtZXNzYWdlcy4gICovCitleHRlcm4gY29uc3QgY2hhciAqc2ltX2NwdV9tc2dfcHJlZml4IChzaW1fY3B1ICopOworLyogQ292ZXIgZm4gdG8gc2ltX2lvX2VwcmludGYuICAqLworZXh0ZXJuIHZvaWQgc2ltX2lvX2VwcmludGZfY3B1IChzaW1fY3B1ICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKKworLyogR2V0L3NldCBhIHBjIHZhbHVlLiAgKi8KKyNkZWZpbmUgQ1BVX1BDX0dFVChjcHUpICgoKiBDUFVfUENfRkVUQ0ggKGNwdSkpIChjcHUpKQorI2RlZmluZSBDUFVfUENfU0VUKGNwdSxuZXd2YWwpICgoKiBDUFVfUENfU1RPUkUgKGNwdSkpICgoY3B1KSwgKG5ld3ZhbCkpKQorLyogRXh0ZXJuYWwgaW50ZXJmYWNlIHRvIGFjY2Vzc2luZyB0aGUgcGMuICAqLworc2ltX2NpYSBzaW1fcGNfZ2V0IChzaW1fY3B1ICopOwordm9pZCBzaW1fcGNfc2V0IChzaW1fY3B1ICosIHNpbV9jaWEpOworCisjZW5kaWYgLyogU0lNX0NQVV9IICovCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1lbmRpYW4uYyBiL3NpbS9jb21tb24vc2ltLWVuZGlhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ODIwMjgKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS1lbmRpYW4uYwpAQCAtMCwwICsxLDEyOCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfU0lNX0VORElBTl9DXworI2RlZmluZSBfU0lNX0VORElBTl9DXworCisjaW5jbHVkZSAic2ltLWJhc2ljcy5oIgorI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKKyNpbmNsdWRlICJzaW0taW8uaCIKKworCisjaWYgIWRlZmluZWQoX1NXQVBfMSkKKyNkZWZpbmUgX1NXQVBfMShTRVQsUkFXKSBTRVQgKFJBVykKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX1NXQVBfMikgJiYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoaHRvbnMpCisjZGVmaW5lIF9TV0FQXzIoU0VULFJBVykgU0VUIGh0b25zIChSQVcpCisjZW5kaWYKKworI2lmbmRlZglfU1dBUF8yCisjZGVmaW5lIF9TV0FQXzIoU0VULFJBVykgU0VUICgoKFJBVykgPj4gOCkgfCAoKFJBVykgPDwgOCkpCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9TV0FQXzQpICYmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOKSAmJiBkZWZpbmVkKGh0b25sKQorI2RlZmluZSBfU1dBUF80KFNFVCxSQVcpIFNFVCBodG9ubCAoUkFXKQorI2VuZGlmCisKKyNpZm5kZWYgX1NXQVBfNAorI2RlZmluZQlfU1dBUF80KFNFVCxSQVcpIFNFVCAoKChSQVcpIDw8IDI0KSB8ICgoKFJBVykgJiAweGZmMDApIDw8IDgpIHwgKCgoUkFXKSAmIDB4ZmYwMDAwKSA+PiA4KSB8ICgoUkFXKSA+PiAyNCkpCisjZW5kaWYKKworI2lmbmRlZiBfU1dBUF84CisjZGVmaW5lIF9TV0FQXzgoU0VULFJBVykgXAorICB1bmlvbiB7IHVuc2lnbmVkXzggZHdvcmQ7IHVuc2lnbmVkXzQgd29yZHNbMl07IH0gaW4sIG91dDsgXAorICBpbi5kd29yZCA9IFJBVzsgXAorICBfU1dBUF80IChvdXQud29yZHNbMF0gPSwgaW4ud29yZHNbMV0pOyBcCisgIF9TV0FQXzQgKG91dC53b3Jkc1sxXSA9LCBpbi53b3Jkc1swXSk7IFwKKyAgU0VUIG91dC5kd29yZDsKKyNlbmRpZgorCisjaWZuZGVmIF9TV0FQXzE2CisjZGVmaW5lIF9TV0FQXzE2KFNFVCxSQVcpIFwKKyAgdW5pb24geyB1bnNpZ25lZF8xNiB3b3JkOyB1bnNpZ25lZF80IHdvcmRzWzRdOyB9IGluLCBvdXQ7IFwKKyAgaW4ud29yZCA9IChSQVcpOyBcCisgIF9TV0FQXzQgKG91dC53b3Jkc1swXSA9LCBpbi53b3Jkc1szXSk7IFwKKyAgX1NXQVBfNCAob3V0LndvcmRzWzFdID0sIGluLndvcmRzWzJdKTsgXAorICBfU1dBUF80IChvdXQud29yZHNbMl0gPSwgaW4ud29yZHNbMV0pOyBcCisgIF9TV0FQXzQgKG91dC53b3Jkc1szXSA9LCBpbi53b3Jkc1swXSk7IFwKKyAgU0VUIG91dC53b3JkOworI2VuZGlmCisKKworI2RlZmluZSBOIDEKKyNpbmNsdWRlICJzaW0tbi1lbmRpYW4uaCIKKyN1bmRlZiBOCisKKyNkZWZpbmUgTiAyCisjaW5jbHVkZSAic2ltLW4tZW5kaWFuLmgiCisjdW5kZWYgTgorCisjZGVmaW5lIE4gNAorI2luY2x1ZGUgInNpbS1uLWVuZGlhbi5oIgorI3VuZGVmIE4KKworI2RlZmluZSBOIDgKKyNpbmNsdWRlICJzaW0tbi1lbmRpYW4uaCIKKyN1bmRlZiBOCisKKyNkZWZpbmUgTiAxNgorI2luY2x1ZGUgInNpbS1uLWVuZGlhbi5oIgorI3VuZGVmIE4KKworCitJTkxJTkVfU0lNX0VORElBTlwKKyh1bnNpZ25lZF84KQorc2ltX2VuZGlhbl9zcGxpdF8xNiAodW5zaWduZWRfMTYgd29yZCwgaW50IHcpCit7CisgIGlmIChDVVJSRU5UX0hPU1RfQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOKQorICAgIHsKKyAgICAgIHJldHVybiB3b3JkLmFbMSAtIHddOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiB3b3JkLmFbd107CisgICAgfQorfQorCisKK0lOTElORV9TSU1fRU5ESUFOXAorKHVuc2lnbmVkXzE2KQorc2ltX2VuZGlhbl9qb2luXzE2ICh1bnNpZ25lZF84IGgsIHVuc2lnbmVkXzggbCkKKworeworICB1bnNpZ25lZF8xNiB3b3JkOworICBpZiAoQ1VSUkVOVF9IT1NUX0JZVEVfT1JERVIgPT0gTElUVExFX0VORElBTikKKyAgICB7CisgICAgICB3b3JkLmFbMF0gPSBsOworICAgICAgd29yZC5hWzFdID0gaDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3b3JkLmFbMF0gPSBoOworICAgICAgd29yZC5hWzFdID0gbDsKKyAgICB9CisgIHJldHVybiB3b3JkOworfQorCisKKworI2VuZGlmIC8qIF9TSU1fRU5ESUFOX0NfICovCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1lbmRpYW4uaCBiL3NpbS9jb21tb24vc2ltLWVuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MzNjODIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS1lbmRpYW4uaApAQCAtMCwwICsxLDQxNCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTcsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIF9TSU1fRU5ESUFOX0hfCisjZGVmaW5lIF9TSU1fRU5ESUFOX0hfCisKKworLyogQyBieXRlIGNvbnZlcnNpb24gZnVuY3Rpb25zICovCisKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzEpIGVuZGlhbl9oMnRfMSh1bnNpZ25lZF8xIHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMikgZW5kaWFuX2gydF8yKHVuc2lnbmVkXzIgeCk7CitJTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF80KSBlbmRpYW5faDJ0XzQodW5zaWduZWRfNCB4KTsKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzgpIGVuZGlhbl9oMnRfOCh1bnNpZ25lZF84IHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMTYpIGVuZGlhbl9oMnRfMTYodW5zaWduZWRfMTYgeCk7CisKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzEpIGVuZGlhbl90MmhfMSh1bnNpZ25lZF8xIHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMikgZW5kaWFuX3QyaF8yKHVuc2lnbmVkXzIgeCk7CitJTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF80KSBlbmRpYW5fdDJoXzQodW5zaWduZWRfNCB4KTsKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzgpIGVuZGlhbl90MmhfOCh1bnNpZ25lZF84IHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMTYpIGVuZGlhbl90MmhfMTYodW5zaWduZWRfMTYgeCk7CisKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzEpIHN3YXBfMSh1bnNpZ25lZF8xIHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMikgc3dhcF8yKHVuc2lnbmVkXzIgeCk7CitJTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF80KSBzd2FwXzQodW5zaWduZWRfNCB4KTsKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzgpIHN3YXBfOCh1bnNpZ25lZF84IHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMTYpIHN3YXBfMTYodW5zaWduZWRfMTYgeCk7CisKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzEpIGVuZGlhbl9oMmJlXzEodW5zaWduZWRfMSB4KTsKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzIpIGVuZGlhbl9oMmJlXzIodW5zaWduZWRfMiB4KTsKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzQpIGVuZGlhbl9oMmJlXzQodW5zaWduZWRfNCB4KTsKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzgpIGVuZGlhbl9oMmJlXzgodW5zaWduZWRfOCB4KTsKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzE2KSBlbmRpYW5faDJiZV8xNih1bnNpZ25lZF8xNiB4KTsKKworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMSkgZW5kaWFuX2JlMmhfMSh1bnNpZ25lZF8xIHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMikgZW5kaWFuX2JlMmhfMih1bnNpZ25lZF8yIHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfNCkgZW5kaWFuX2JlMmhfNCh1bnNpZ25lZF80IHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfOCkgZW5kaWFuX2JlMmhfOCh1bnNpZ25lZF84IHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMTYpIGVuZGlhbl9iZTJoXzE2KHVuc2lnbmVkXzE2IHgpOworCitJTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8xKSBlbmRpYW5faDJsZV8xKHVuc2lnbmVkXzEgeCk7CitJTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8yKSBlbmRpYW5faDJsZV8yKHVuc2lnbmVkXzIgeCk7CitJTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF80KSBlbmRpYW5faDJsZV80KHVuc2lnbmVkXzQgeCk7CitJTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF84KSBlbmRpYW5faDJsZV84KHVuc2lnbmVkXzggeCk7CitJTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8xNikgZW5kaWFuX2gybGVfMTYodW5zaWduZWRfMTYgeCk7CisKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzEpIGVuZGlhbl9sZTJoXzEodW5zaWduZWRfMSB4KTsKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzIpIGVuZGlhbl9sZTJoXzIodW5zaWduZWRfMiB4KTsKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzQpIGVuZGlhbl9sZTJoXzQodW5zaWduZWRfNCB4KTsKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzgpIGVuZGlhbl9sZTJoXzgodW5zaWduZWRfOCB4KTsKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzE2KSBlbmRpYW5fbGUyaF8xNih1bnNpZ25lZF8xNiB4KTsKKworSU5MSU5FX1NJTV9FTkRJQU4odm9pZCopIG9mZnNldF8xKHVuc2lnbmVkXzEgKngsIHVuc2lnbmVkIHdzLCB1bnNpZ25lZCB3KTsKK0lOTElORV9TSU1fRU5ESUFOKHZvaWQqKSBvZmZzZXRfMih1bnNpZ25lZF8yICp4LCB1bnNpZ25lZCB3cywgdW5zaWduZWQgdyk7CitJTkxJTkVfU0lNX0VORElBTih2b2lkKikgb2Zmc2V0XzQodW5zaWduZWRfNCAqeCwgdW5zaWduZWQgd3MsIHVuc2lnbmVkIHcpOworSU5MSU5FX1NJTV9FTkRJQU4odm9pZCopIG9mZnNldF84KHVuc2lnbmVkXzggKngsIHVuc2lnbmVkIHdzLCB1bnNpZ25lZCB3KTsKK0lOTElORV9TSU1fRU5ESUFOKHZvaWQqKSBvZmZzZXRfMTYodW5zaWduZWRfMTYgKngsIHVuc2lnbmVkIHdzLCB1bnNpZ25lZCB3KTsKKworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMTYpIHNpbV9lbmRpYW5fam9pbl8xNiAodW5zaWduZWRfOCBoLCB1bnNpZ25lZF84IGwpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfOCkgc2ltX2VuZGlhbl9zcGxpdF8xNiAodW5zaWduZWRfMTYgd29yZCwgaW50IHcpOworCisKKy8qIFNXQVAgKi8KKworI2RlZmluZSBTV0FQXzEoWCkgc3dhcF8xKFgpCisjZGVmaW5lIFNXQVBfMihYKSBzd2FwXzIoWCkKKyNkZWZpbmUgU1dBUF80KFgpIHN3YXBfNChYKQorI2RlZmluZSBTV0FQXzgoWCkgc3dhcF84KFgpCisjZGVmaW5lIFNXQVBfMTYoWCkgc3dhcF8xNihYKQorCisKKy8qIEhPU1QgdG8gQkUgKi8KKworI2RlZmluZSBIMkJFXzEoWCkgZW5kaWFuX2gyYmVfMShYKQorI2RlZmluZSBIMkJFXzIoWCkgZW5kaWFuX2gyYmVfMihYKQorI2RlZmluZSBIMkJFXzQoWCkgZW5kaWFuX2gyYmVfNChYKQorI2RlZmluZSBIMkJFXzgoWCkgZW5kaWFuX2gyYmVfOChYKQorI2RlZmluZSBIMkJFXzE2KFgpIGVuZGlhbl9oMmJlXzE2KFgpCisjZGVmaW5lIEJFMkhfMShYKSBlbmRpYW5fYmUyaF8xKFgpCisjZGVmaW5lIEJFMkhfMihYKSBlbmRpYW5fYmUyaF8yKFgpCisjZGVmaW5lIEJFMkhfNChYKSBlbmRpYW5fYmUyaF80KFgpCisjZGVmaW5lIEJFMkhfOChYKSBlbmRpYW5fYmUyaF84KFgpCisjZGVmaW5lIEJFMkhfMTYoWCkgZW5kaWFuX2JlMmhfMTYoWCkKKworCisvKiBIT1NUIHRvIExFICovCisKKyNkZWZpbmUgSDJMRV8xKFgpIGVuZGlhbl9oMmxlXzEoWCkKKyNkZWZpbmUgSDJMRV8yKFgpIGVuZGlhbl9oMmxlXzIoWCkKKyNkZWZpbmUgSDJMRV80KFgpIGVuZGlhbl9oMmxlXzQoWCkKKyNkZWZpbmUgSDJMRV84KFgpIGVuZGlhbl9oMmxlXzgoWCkKKyNkZWZpbmUgSDJMRV8xNihYKSBlbmRpYW5faDJsZV8xNihYKQorI2RlZmluZSBMRTJIXzEoWCkgZW5kaWFuX2xlMmhfMShYKQorI2RlZmluZSBMRTJIXzIoWCkgZW5kaWFuX2xlMmhfMihYKQorI2RlZmluZSBMRTJIXzQoWCkgZW5kaWFuX2xlMmhfNChYKQorI2RlZmluZSBMRTJIXzgoWCkgZW5kaWFuX2xlMmhfOChYKQorI2RlZmluZSBMRTJIXzE2KFgpIGVuZGlhbl9sZTJoXzE2KFgpCisKKworLyogSE9TVCB0byBUQVJHRVQgKi8KKworI2RlZmluZSBIMlRfMShYKSBlbmRpYW5faDJ0XzEoWCkKKyNkZWZpbmUgSDJUXzIoWCkgZW5kaWFuX2gydF8yKFgpCisjZGVmaW5lIEgyVF80KFgpIGVuZGlhbl9oMnRfNChYKQorI2RlZmluZSBIMlRfOChYKSBlbmRpYW5faDJ0XzgoWCkKKyNkZWZpbmUgSDJUXzE2KFgpIGVuZGlhbl9oMnRfMTYoWCkKKyNkZWZpbmUgVDJIXzEoWCkgZW5kaWFuX3QyaF8xKFgpCisjZGVmaW5lIFQySF8yKFgpIGVuZGlhbl90MmhfMihYKQorI2RlZmluZSBUMkhfNChYKSBlbmRpYW5fdDJoXzQoWCkKKyNkZWZpbmUgVDJIXzgoWCkgZW5kaWFuX3QyaF84KFgpCisjZGVmaW5lIFQySF8xNihYKSBlbmRpYW5fdDJoXzE2KFgpCisKKworLyogQ09OVkVSVCBJTiBQTEFDRQorCisgICBUaGVzZSBtYWNyb3MsIGdpdmVuIGFuIGFyZ3VtZW50IG9mIHVua25vd24gc2l6ZSwgc3dhcCBpdHMgdmFsdWUgaW4KKyAgIHBsYWNlIGlmIGEgaG9zdC90YXJnZXQgY29udmVyc2lvbiBpcyByZXF1aXJlZC4gKi8KKworI2RlZmluZSBIMlQoVkFSSUFCTEUpIFwKK2RvIHsgXAorICB2b2lkICp2cCA9ICYoVkFSSUFCTEUpOyBcCisgIHN3aXRjaCAoc2l6ZW9mIChWQVJJQUJMRSkpIHsgXAorICBjYXNlIDE6ICoodW5zaWduZWRfMSopdnAgPSBIMlRfMSgqKHVuc2lnbmVkXzEqKXZwKTsgYnJlYWs7IFwKKyAgY2FzZSAyOiAqKHVuc2lnbmVkXzIqKXZwID0gSDJUXzIoKih1bnNpZ25lZF8yKil2cCk7IGJyZWFrOyBcCisgIGNhc2UgNDogKih1bnNpZ25lZF80Kil2cCA9IEgyVF80KCoodW5zaWduZWRfNCopdnApOyBicmVhazsgXAorICBjYXNlIDg6ICoodW5zaWduZWRfOCopdnAgPSBIMlRfOCgqKHVuc2lnbmVkXzgqKXZwKTsgYnJlYWs7IFwKKyAgY2FzZSAxNjogKih1bnNpZ25lZF8xNiopdnAgPSBIMlRfMTYoKih1bnNpZ25lZF8xNiopdnApOyBicmVhazsgXAorICB9IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVDJIKFZBUklBQkxFKSBcCitkbyB7IFwKKyAgc3dpdGNoIChzaXplb2YoVkFSSUFCTEUpKSB7IFwKKyAgY2FzZSAxOiBWQVJJQUJMRSA9IFQySF8xKFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgY2FzZSAyOiBWQVJJQUJMRSA9IFQySF8yKFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgY2FzZSA0OiBWQVJJQUJMRSA9IFQySF80KFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgY2FzZSA4OiBWQVJJQUJMRSA9IFQySF84KFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgLypjYXNlIDE2OiBWQVJJQUJMRSA9IFQySF8xNihWQVJJQUJMRSk7IGJyZWFrOyovIFwKKyAgfSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNXQVAoVkFSSUFCTEUpIFwKK2RvIHsgXAorICBzd2l0Y2ggKHNpemVvZihWQVJJQUJMRSkpIHsgXAorICBjYXNlIDE6IFZBUklBQkxFID0gU1dBUF8xKFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgY2FzZSAyOiBWQVJJQUJMRSA9IFNXQVBfMihWQVJJQUJMRSk7IGJyZWFrOyBcCisgIGNhc2UgNDogVkFSSUFCTEUgPSBTV0FQXzQoVkFSSUFCTEUpOyBicmVhazsgXAorICBjYXNlIDg6IFZBUklBQkxFID0gU1dBUF84KFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgLypjYXNlIDE2OiBWQVJJQUJMRSA9IFNXQVBfMTYoVkFSSUFCTEUpOyBicmVhazsqLyBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBIMkJFKFZBUklBQkxFKSBcCitkbyB7IFwKKyAgc3dpdGNoIChzaXplb2YoVkFSSUFCTEUpKSB7IFwKKyAgY2FzZSAxOiBWQVJJQUJMRSA9IEgyQkVfMShWQVJJQUJMRSk7IGJyZWFrOyBcCisgIGNhc2UgMjogVkFSSUFCTEUgPSBIMkJFXzIoVkFSSUFCTEUpOyBicmVhazsgXAorICBjYXNlIDQ6IFZBUklBQkxFID0gSDJCRV80KFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgY2FzZSA4OiBWQVJJQUJMRSA9IEgyQkVfOChWQVJJQUJMRSk7IGJyZWFrOyBcCisgIC8qY2FzZSAxNjogVkFSSUFCTEUgPSBIMkJFXzE2KFZBUklBQkxFKTsgYnJlYWs7Ki8gXAorICB9IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQkUySChWQVJJQUJMRSkgXAorZG8geyBcCisgIHN3aXRjaCAoc2l6ZW9mKFZBUklBQkxFKSkgeyBcCisgIGNhc2UgMTogVkFSSUFCTEUgPSBCRTJIXzEoVkFSSUFCTEUpOyBicmVhazsgXAorICBjYXNlIDI6IFZBUklBQkxFID0gQkUySF8yKFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgY2FzZSA0OiBWQVJJQUJMRSA9IEJFMkhfNChWQVJJQUJMRSk7IGJyZWFrOyBcCisgIGNhc2UgODogVkFSSUFCTEUgPSBCRTJIXzgoVkFSSUFCTEUpOyBicmVhazsgXAorICAvKmNhc2UgMTY6IFZBUklBQkxFID0gQkUySF8xNihWQVJJQUJMRSk7IGJyZWFrOyovIFwKKyAgfSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEgyTEUoVkFSSUFCTEUpIFwKK2RvIHsgXAorICBzd2l0Y2ggKHNpemVvZihWQVJJQUJMRSkpIHsgXAorICBjYXNlIDE6IFZBUklBQkxFID0gSDJMRV8xKFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgY2FzZSAyOiBWQVJJQUJMRSA9IEgyTEVfMihWQVJJQUJMRSk7IGJyZWFrOyBcCisgIGNhc2UgNDogVkFSSUFCTEUgPSBIMkxFXzQoVkFSSUFCTEUpOyBicmVhazsgXAorICBjYXNlIDg6IFZBUklBQkxFID0gSDJMRV84KFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgLypjYXNlIDE2OiBWQVJJQUJMRSA9IEgyTEVfMTYoVkFSSUFCTEUpOyBicmVhazsqLyBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBMRTJIKFZBUklBQkxFKSBcCitkbyB7IFwKKyAgc3dpdGNoIChzaXplb2YoVkFSSUFCTEUpKSB7IFwKKyAgY2FzZSAxOiBWQVJJQUJMRSA9IExFMkhfMShWQVJJQUJMRSk7IGJyZWFrOyBcCisgIGNhc2UgMjogVkFSSUFCTEUgPSBMRTJIXzIoVkFSSUFCTEUpOyBicmVhazsgXAorICBjYXNlIDQ6IFZBUklBQkxFID0gTEUySF80KFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgY2FzZSA4OiBWQVJJQUJMRSA9IExFMkhfOChWQVJJQUJMRSk7IGJyZWFrOyBcCisgIC8qY2FzZSAxNjogVkFSSUFCTEUgPSBMRTJIXzE2KFZBUklBQkxFKTsgYnJlYWs7Ki8gXAorICB9IFwKK30gd2hpbGUgKDApCisKKworCisvKiBUQVJHRVQgV09SRDoKKworICAgQnl0ZSBzd2FwIGEgcXVhbnRpdHkgdGhlIHNpemUgb2YgdGhlIHRhcmdldHMgd29yZCAqLworCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyNkZWZpbmUgSDJUX3dvcmQoWCkgSDJUXzgoWCkKKyNkZWZpbmUgVDJIX3dvcmQoWCkgVDJIXzgoWCkKKyNkZWZpbmUgSDJCRV93b3JkKFgpIEgyQkVfOChYKQorI2RlZmluZSBCRTJIX3dvcmQoWCkgQkUySF84KFgpCisjZGVmaW5lIEgyTEVfd29yZChYKSBIMkxFXzgoWCkKKyNkZWZpbmUgTEUySF93b3JkKFgpIExFMkhfOChYKQorI2RlZmluZSBTV0FQX3dvcmQoWCkgU1dBUF84KFgpCisjZW5kaWYKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQorI2RlZmluZSBIMlRfd29yZChYKSBIMlRfNChYKQorI2RlZmluZSBUMkhfd29yZChYKSBUMkhfNChYKQorI2RlZmluZSBIMkJFX3dvcmQoWCkgSDJCRV80KFgpCisjZGVmaW5lIEJFMkhfd29yZChYKSBCRTJIXzQoWCkKKyNkZWZpbmUgSDJMRV93b3JkKFgpIEgyTEVfNChYKQorI2RlZmluZSBMRTJIX3dvcmQoWCkgTEUySF80KFgpCisjZGVmaW5lIFNXQVBfd29yZChYKSBTV0FQXzQoWCkKKyNlbmRpZgorCisKKworLyogVEFSR0VUIENFTEw6CisKKyAgIEJ5dGUgc3dhcCBhIHF1YW50aXR5IHRoZSBzaXplIG9mIHRoZSB0YXJnZXRzIElFRUUgMTI3NSBtZW1vcnkgY2VsbCAqLworCisjZGVmaW5lIEgyVF9jZWxsKFgpIEgyVF80KFgpCisjZGVmaW5lIFQySF9jZWxsKFgpIFQySF80KFgpCisjZGVmaW5lIEgyQkVfY2VsbChYKSBIMkJFXzQoWCkKKyNkZWZpbmUgQkUySF9jZWxsKFgpIEJFMkhfNChYKQorI2RlZmluZSBIMkxFX2NlbGwoWCkgSDJMRV80KFgpCisjZGVmaW5lIExFMkhfY2VsbChYKSBMRTJIXzQoWCkKKyNkZWZpbmUgU1dBUF9jZWxsKFgpIFNXQVBfNChYKQorCisKKworLyogSE9TVCBPZmZzZXRzOgorCisgICBBZGRyZXNzIG9mIGhpZ2gvbG93IHN1Yi13b3JkIHdpdGhpbiBhIGhvc3Qgd29yZCBxdWFudGl0eS4KKworICAgQWRkcmVzcyBvZiBzdWItd29yZCBOIHdpdGhpbiBhIGhvc3Qgd29yZCBxdWFudGl0eS4gIE5PVEU6IE51bWJlcmluZworICAgaXMgQklHIGVuZGlhbiBhbHdheXMuICovCisKKyNkZWZpbmUgQUgxXzIoWCkgKHVuc2lnbmVkXzEqKW9mZnNldF8yKChYKSwgMSwgMCkKKyNkZWZpbmUgQUwxXzIoWCkgKHVuc2lnbmVkXzEqKW9mZnNldF8yKChYKSwgMSwgMSkKKworI2RlZmluZSBBSDJfNChYKSAodW5zaWduZWRfMiopb2Zmc2V0XzQoKFgpLCAyLCAwKQorI2RlZmluZSBBTDJfNChYKSAodW5zaWduZWRfMiopb2Zmc2V0XzQoKFgpLCAyLCAxKQorCisjZGVmaW5lIEFINF84KFgpICh1bnNpZ25lZF80KilvZmZzZXRfOCgoWCksIDQsIDApCisjZGVmaW5lIEFMNF84KFgpICh1bnNpZ25lZF80KilvZmZzZXRfOCgoWCksIDQsIDEpCisKKyNkZWZpbmUgQUg4XzE2KFgpICh1bnNpZ25lZF84KilvZmZzZXRfMTYoKFgpLCA4LCAwKQorI2RlZmluZSBBTDhfMTYoWCkgKHVuc2lnbmVkXzgqKW9mZnNldF8xNigoWCksIDgsIDEpCisKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQorI2RlZmluZSBBSF93b3JkKFgpIEFINF84KFgpCisjZGVmaW5lIEFMX3dvcmQoWCkgQUw0XzgoWCkKKyNlbmRpZgorI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCisjZGVmaW5lIEFIX3dvcmQoWCkgQUgyXzQoWCkKKyNkZWZpbmUgQUxfd29yZChYKSBBTDJfNChYKQorI2VuZGlmCisKKworI2RlZmluZSBBMV8yKFgsTikgKHVuc2lnbmVkXzEqKW9mZnNldF8yKChYKSwgMSwgKE4pKQorCisjZGVmaW5lIEExXzQoWCxOKSAodW5zaWduZWRfMSopb2Zmc2V0XzQoKFgpLCAxLCAoTikpCisjZGVmaW5lIEEyXzQoWCxOKSAodW5zaWduZWRfMiopb2Zmc2V0XzQoKFgpLCAyLCAoTikpCisKKyNkZWZpbmUgQTFfOChYLE4pICh1bnNpZ25lZF8xKilvZmZzZXRfOCgoWCksIDEsIChOKSkKKyNkZWZpbmUgQTJfOChYLE4pICh1bnNpZ25lZF8yKilvZmZzZXRfOCgoWCksIDIsIChOKSkKKyNkZWZpbmUgQTRfOChYLE4pICh1bnNpZ25lZF80KilvZmZzZXRfOCgoWCksIDQsIChOKSkKKworI2RlZmluZSBBMV8xNihYLE4pICh1bnNpZ25lZF8xKilvZmZzZXRfMTYoKFgpLCAxLCAoTikpCisjZGVmaW5lIEEyXzE2KFgsTikgKHVuc2lnbmVkXzIqKW9mZnNldF8xNigoWCksIDIsIChOKSkKKyNkZWZpbmUgQTRfMTYoWCxOKSAodW5zaWduZWRfNCopb2Zmc2V0XzE2KChYKSwgNCwgKE4pKQorI2RlZmluZSBBOF8xNihYLE4pICh1bnNpZ25lZF84KilvZmZzZXRfMTYoKFgpLCA4LCAoTikpCisKKworCisKKy8qIEhPU1QgQ29tcG9uZW50czoKKworICAgVmFsdWUgb2Ygc3ViLXdvcmQgd2l0aGluIGEgaG9zdCB3b3JkIHF1YW50aXR5ICovCisKKyNkZWZpbmUgVkgxXzIoWCkgKCh1bnNpZ25lZF8xKSgodW5zaWduZWRfMikoWCkgPj4gOCkpCisjZGVmaW5lIFZMMV8yKFgpICh1bnNpZ25lZF8xKShYKQorCisjZGVmaW5lIFZIMl80KFgpICgodW5zaWduZWRfMikoKHVuc2lnbmVkXzQpKFgpID4+IDE2KSkKKyNkZWZpbmUgVkwyXzQoWCkgKCh1bnNpZ25lZF8yKShYKSkKKworI2RlZmluZSBWSDRfOChYKSAoKHVuc2lnbmVkXzQpKCh1bnNpZ25lZF84KShYKSA+PiAzMikpCisjZGVmaW5lIFZMNF84KFgpICgodW5zaWduZWRfNCkoWCkpCisKKyNkZWZpbmUgVkg4XzE2KFgpIChzaW1fZW5kaWFuX3NwbGl0XzE2ICgoWCksIDApKQorI2RlZmluZSBWTDhfMTYoWCkgKHNpbV9lbmRpYW5fc3BsaXRfMTYgKChYKSwgMSkpCisKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQorI2RlZmluZSBWSF93b3JkKFgpIFZINF84KFgpCisjZGVmaW5lIFZMX3dvcmQoWCkgVkw0XzgoWCkKKyNlbmRpZgorI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCisjZGVmaW5lIFZIX3dvcmQoWCkgVkgyXzQoWCkKKyNkZWZpbmUgVkxfd29yZChYKSBWTDJfNChYKQorI2VuZGlmCisKKworI2RlZmluZSBWMV8yKFgsTikgKCh1bnNpZ25lZF8xKSgodW5zaWduZWRfMikoWCkgPj4gKCA4ICogKDEgLSAoTikpKSkpCisKKyNkZWZpbmUgVjFfNChYLE4pICgodW5zaWduZWRfMSkoKHVuc2lnbmVkXzQpKFgpID4+ICggOCAqICgzIC0gKE4pKSkpKQorI2RlZmluZSBWMl80KFgsTikgKCh1bnNpZ25lZF8yKSgodW5zaWduZWRfNCkoWCkgPj4gKDE2ICogKDEgLSAoTikpKSkpCisKKyNkZWZpbmUgVjFfOChYLE4pICgodW5zaWduZWRfMSkoKHVuc2lnbmVkXzgpKFgpID4+ICggOCAqICg3IC0gKE4pKSkpKQorI2RlZmluZSBWMl84KFgsTikgKCh1bnNpZ25lZF8yKSgodW5zaWduZWRfOCkoWCkgPj4gKDE2ICogKDMgLSAoTikpKSkpCisjZGVmaW5lIFY0XzgoWCxOKSAoKHVuc2lnbmVkXzQpKCh1bnNpZ25lZF84KShYKSA+PiAoMzIgKiAoMSAtIChOKSkpKSkKKworI2RlZmluZSBWMV8xNihYLE4pICgqQTFfMTYgKCYoWCksTikpCisjZGVmaW5lIFYyXzE2KFgsTikgKCpBMl8xNiAoJihYKSxOKSkKKyNkZWZpbmUgVjRfMTYoWCxOKSAoKkE0XzE2ICgmKFgpLE4pKQorI2RlZmluZSBWOF8xNihYLE4pICgqQThfMTYgKCYoWCksTikpCisKKworLyogUmV2ZXJzZSAtIGluc2VydCBzdWItd29yZCBpbnRvIHdvcmQgcXVhbnRpdHkgKi8KKworI2RlZmluZSBWMl9IMShYKSAoKHVuc2lnbmVkXzIpKHVuc2lnbmVkXzEpKFgpIDw8ICA4KQorI2RlZmluZSBWMl9MMShYKSAoKHVuc2lnbmVkXzIpKHVuc2lnbmVkXzEpKFgpKQorCisjZGVmaW5lIFY0X0gyKFgpICgodW5zaWduZWRfNCkodW5zaWduZWRfMikoWCkgPDwgMTYpCisjZGVmaW5lIFY0X0wyKFgpICgodW5zaWduZWRfNCkodW5zaWduZWRfMikoWCkpCisKKyNkZWZpbmUgVjhfSDQoWCkgKCh1bnNpZ25lZF84KSh1bnNpZ25lZF80KShYKSA8PCAzMikKKyNkZWZpbmUgVjhfTDQoWCkgKCh1bnNpZ25lZF84KSh1bnNpZ25lZF80KShYKSkKKworI2RlZmluZSBWMTZfSDgoWCkgKCh1bnNpZ25lZF8xNikodW5zaWduZWRfOCkoWCkgPDwgNjQpCisjZGVmaW5lIFYxNl9MOChYKSAoKHVuc2lnbmVkXzE2KSh1bnNpZ25lZF84KShYKSkKKworCisjZGVmaW5lIFYyXzEoWCxOKSAoKHVuc2lnbmVkXzIpKHVuc2lnbmVkXzEpKFgpIDw8ICggOCAqICgxIC0gKE4pKSkpCisKKyNkZWZpbmUgVjRfMShYLE4pICgodW5zaWduZWRfNCkodW5zaWduZWRfMSkoWCkgPDwgKCA4ICogKDMgLSAoTikpKSkKKyNkZWZpbmUgVjRfMihYLE4pICgodW5zaWduZWRfNCkodW5zaWduZWRfMikoWCkgPDwgKDE2ICogKDEgLSAoTikpKSkKKworI2RlZmluZSBWOF8xKFgsTikgKCh1bnNpZ25lZF84KSh1bnNpZ25lZF8xKShYKSA8PCAoIDggKiAoNyAtIChOKSkpKQorI2RlZmluZSBWOF8yKFgsTikgKCh1bnNpZ25lZF84KSh1bnNpZ25lZF8yKShYKSA8PCAoMTYgKiAoMyAtIChOKSkpKQorI2RlZmluZSBWOF80KFgsTikgKCh1bnNpZ25lZF84KSh1bnNpZ25lZF80KShYKSA8PCAoMzIgKiAoMSAtIChOKSkpKQorCisjZGVmaW5lIFYxNl8xKFgsTikgKCh1bnNpZ25lZF8xNikodW5zaWduZWRfMSkoWCkgPDwgKCA4ICogKDE1IC0gKE4pKSkpCisjZGVmaW5lIFYxNl8yKFgsTikgKCh1bnNpZ25lZF8xNikodW5zaWduZWRfMikoWCkgPDwgKDE2ICogKDcgLSAoTikpKSkKKyNkZWZpbmUgVjE2XzQoWCxOKSAoKHVuc2lnbmVkXzE2KSh1bnNpZ25lZF80KShYKSA8PCAoMzIgKiAoMyAtIChOKSkpKQorI2RlZmluZSBWMTZfOChYLE4pICgodW5zaWduZWRfMTYpKHVuc2lnbmVkXzgpKFgpIDw8ICg2NCAqICgxIC0gKE4pKSkpCisKKworLyogUmV2ZXJzZSAtIGluc2VydCBOIHN1Yi13b3JkcyBpbnRvIHNpbmdsZSB3b3JkIHF1YW50aXR5ICovCisKKyNkZWZpbmUgVTJfMShJMCxJMSkgKFYyXzEoSTAsMCkgfCBWMl8xKEkxLDEpKQorI2RlZmluZSBVNF8xKEkwLEkxLEkyLEkzKSAoVjRfMShJMCwwKSB8IFY0XzEoSTEsMSkgfCBWNF8xKEkyLDIpIHwgVjRfMShJMywzKSkKKyNkZWZpbmUgVThfMShJMCxJMSxJMixJMyxJNCxJNSxJNixJNykgXAorKFY4XzEoSTAsMCkgfCBWOF8xKEkxLDEpIHwgVjhfMShJMiwyKSB8IFY4XzEoSTMsMykgXAorIHwgVjhfMShJNCw0KSB8IFY4XzEoSTUsNSkgfCBWOF8xKEk2LDYpIHwgVjhfMShJNyw3KSkKKyNkZWZpbmUgVTE2XzEoSTAsSTEsSTIsSTMsSTQsSTUsSTYsSTcsSTgsSTksSTEwLEkxMSxJMTIsSTEzLEkxNCxJMTUpIFwKKyhWMTZfMShJMCwwKSB8IFYxNl8xKEkxLDEpIHwgVjE2XzEoSTIsMikgfCBWMTZfMShJMywzKSBcCisgfCBWMTZfMShJNCw0KSB8IFYxNl8xKEk1LDUpIHwgVjE2XzEoSTYsNikgfCBWMTZfMShJNyw3KSBcCisgfCBWMTZfMShJOCw4KSB8IFYxNl8xKEk5LDkpIHwgVjE2XzEoSTEwLDEwKSB8IFYxNl8xKEkxMSwxMSkgXAorIHwgVjE2XzEoSTEyLDEyKSB8IFYxNl8xKEkxMywxMykgfCBWMTZfMShJMTQsMTQpIHwgVjE2XzEoSTE1LDE1KSkKKworI2RlZmluZSBVNF8yKEkwLEkxKSAoVjRfMihJMCwwKSB8IFY0XzIoSTEsMSkpCisjZGVmaW5lIFU4XzIoSTAsSTEsSTIsSTMpIChWOF8yKEkwLDApIHwgVjhfMihJMSwxKSB8IFY4XzIoSTIsMikgfCBWOF8yKEkzLDMpKQorI2RlZmluZSBVMTZfMihJMCxJMSxJMixJMyxJNCxJNSxJNixJNykgXAorKFYxNl8yKEkwLDApIHwgVjE2XzIoSTEsMSkgfCBWMTZfMihJMiwyKSB8IFYxNl8yKEkzLDMpIFwKKyB8IFYxNl8yKEk0LDQpIHwgVjE2XzIoSTUsNSkgfCBWMTZfMihJNiw2KSB8IFYxNl8yKEk3LDcpICkKKworI2RlZmluZSBVOF80KEkwLEkxKSAoVjhfNChJMCwwKSB8IFY4XzQoSTEsMSkpCisjZGVmaW5lIFUxNl80KEkwLEkxLEkyLEkzKSAoVjE2XzQoSTAsMCkgfCBWMTZfNChJMSwxKSB8IFYxNl80KEkyLDIpIHwgVjE2XzQoSTMsMykpCisKKyNkZWZpbmUgVTE2XzgoSTAsSTEpIChzaW1fZW5kaWFuX2pvaW5fMTYgKEkwLCBJMSkpCisKKworI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCisjZGVmaW5lIFZ3b3JkX0goWCkgVjhfSDQoWCkKKyNkZWZpbmUgVndvcmRfTChYKSBWOF9MNChYKQorI2VuZGlmCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKKyNkZWZpbmUgVndvcmRfSChYKSBWNF9IMihYKQorI2RlZmluZSBWd29yZF9MKFgpIFY0X0wyKFgpCisjZW5kaWYKKworCisKKworI2lmIEhfUkVWRUFMU19NT0RVTEVfUCAoU0lNX0VORElBTl9JTkxJTkUpCisjaW5jbHVkZSAic2ltLWVuZGlhbi5jIgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU0lNX0VORElBTl9IXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tZW5naW5lLmMgYi9zaW0vY29tbW9uL3NpbS1lbmdpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDE1ZjYzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tZW5naW5lLmMKQEAgLTAsMCArMSwyMTAgQEAKKy8qIEdlbmVyaWMgc2ltdWxhdG9yIGhhbHQvcmVzdGFydC4KKyAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisKKy8qIEdldCB0aGUgcnVuIHN0YXRlLgorICAgUkVBU09OL1NJR1JDIGFyZSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHNpbV9zdG9wX3JlYXNvbi4KKyAgID8/PyBTaG91bGQgZWFjaCBjcHUgaGF2ZSBpdHMgb3duIGNvcHk/ICAqLworCit2b2lkCitzaW1fZW5naW5lX2dldF9ydW5fc3RhdGUgKFNJTV9ERVNDIHNkLCBlbnVtIHNpbV9zdG9wICpyZWFzb24sIGludCAqc2lncmMpCit7CisgIHNpbV9lbmdpbmUgKmVuZ2luZSA9IFNUQVRFX0VOR0lORSAoc2QpOworICBBU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7CisgICpyZWFzb24gPSBlbmdpbmUtPnJlYXNvbjsKKyAgKnNpZ3JjID0gZW5naW5lLT5zaWdyYzsKK30KKworLyogU2V0IHRoZSBydW4gc3RhdGUgdG8gUkVBU09OL1NJR1JDLgorICAgUkVBU09OL1NJR1JDIGFyZSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHNpbV9zdG9wX3JlYXNvbi4KKyAgID8/PyBTaG91bGQgZWFjaCBjcHUgaGF2ZSBpdHMgb3duIGNvcHk/ICAqLworCit2b2lkCitzaW1fZW5naW5lX3NldF9ydW5fc3RhdGUgKFNJTV9ERVNDIHNkLCBlbnVtIHNpbV9zdG9wIHJlYXNvbiwgaW50IHNpZ3JjKQoreworICBzaW1fZW5naW5lICplbmdpbmUgPSBTVEFURV9FTkdJTkUgKHNkKTsKKyAgQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworICBlbmdpbmUtPnJlYXNvbiA9IHJlYXNvbjsKKyAgZW5naW5lLT5zaWdyYyA9IHNpZ3JjOworfQorCisvKiBHZW5lcmljIGhhbHQgKi8KKwordm9pZAorc2ltX2VuZ2luZV9oYWx0IChTSU1fREVTQyBzZCwKKwkJIHNpbV9jcHUgKmxhc3RfY3B1LAorCQkgc2ltX2NwdSAqbmV4dF9jcHUsIC8qIE5VTEwgLSB1c2UgZGVmYXVsdCAqLworCQkgc2ltX2NpYSBjaWEsCisJCSBlbnVtIHNpbV9zdG9wIHJlYXNvbiwKKwkJIGludCBzaWdyYykKK3sKKyAgc2ltX2VuZ2luZSAqZW5naW5lID0gU1RBVEVfRU5HSU5FIChzZCk7CisgIEFTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKKyAgaWYgKGVuZ2luZS0+am1wYnVmICE9IE5VTEwpCisgICAgeworICAgICAgam1wX2J1ZiAqaGFsdF9idWYgPSBlbmdpbmUtPmptcGJ1ZjsKKyAgICAgIGVuZ2luZS0+bGFzdF9jcHUgPSBsYXN0X2NwdTsKKyAgICAgIGVuZ2luZS0+bmV4dF9jcHUgPSBuZXh0X2NwdTsKKyAgICAgIGVuZ2luZS0+cmVhc29uID0gcmVhc29uOworICAgICAgZW5naW5lLT5zaWdyYyA9IHNpZ3JjOworCisgICAgICBTSU1fRU5HSU5FX0hBTFRfSE9PSyAoc2QsIGxhc3RfY3B1LCBjaWEpOworCisjaWZkZWYgU0lNX0NQVV9FWENFUFRJT05fU1VTUEVORAorICAgICAgaWYgKGxhc3RfY3B1ICE9IE5VTEwgJiYgcmVhc29uICE9IHNpbV9leGl0ZWQpCisJU0lNX0NQVV9FWENFUFRJT05fU1VTUEVORCAoc2QsIGxhc3RfY3B1LCBzaW1fc2lnbmFsX3RvX2hvc3QgKHNkLCBzaWdyYykpOworI2VuZGlmCisKKyAgICAgIGxvbmdqbXAgKCpoYWx0X2J1Ziwgc2ltX2VuZ2luZV9oYWx0X2ptcHZhbCk7CisgICAgfQorICBlbHNlCisgICAgc2ltX2lvX2Vycm9yIChzZCwgInNpbV9oYWx0IC0gYmFkIGxvbmcganVtcCIpOworfQorCisKKy8qIEdlbmVyaWMgcmVzdGFydCAqLworCit2b2lkCitzaW1fZW5naW5lX3Jlc3RhcnQgKFNJTV9ERVNDIHNkLAorCQkgICAgc2ltX2NwdSAqbGFzdF9jcHUsCisJCSAgICBzaW1fY3B1ICpuZXh0X2NwdSwKKwkJICAgIHNpbV9jaWEgY2lhKQoreworICBzaW1fZW5naW5lICplbmdpbmUgPSBTVEFURV9FTkdJTkUgKHNkKTsKKyAgQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworICBpZiAoZW5naW5lLT5qbXBidWYgIT0gTlVMTCkKKyAgICB7CisgICAgICBqbXBfYnVmICpoYWx0X2J1ZiA9IGVuZ2luZS0+am1wYnVmOworICAgICAgZW5naW5lLT5sYXN0X2NwdSA9IGxhc3RfY3B1OworICAgICAgZW5naW5lLT5uZXh0X2NwdSA9IG5leHRfY3B1OworICAgICAgU0lNX0VOR0lORV9SRVNUQVJUX0hPT0sgKHNkLCBsYXN0X2NwdSwgY2lhKTsKKyAgICAgIGxvbmdqbXAgKCpoYWx0X2J1Ziwgc2ltX2VuZ2luZV9yZXN0YXJ0X2ptcHZhbCk7CisgICAgfQorICBlbHNlCisgICAgc2ltX2lvX2Vycm9yIChzZCwgInNpbV9yZXN0YXJ0IC0gYmFkIGxvbmcganVtcCIpOworfQorCisKKy8qIEdlbmVyaWMgZXJyb3IgY29kZSAqLworCit2b2lkCitzaW1fZW5naW5lX3ZhYm9ydCAoU0lNX0RFU0Mgc2QsCisJCSAgIHNpbV9jcHUgKmNwdSwKKwkJICAgc2ltX2NpYSBjaWEsCisJCSAgIGNvbnN0IGNoYXIgKmZtdCwKKwkJICAgdmFfbGlzdCBhcCkKK3sKKyAgQVNTRVJUIChzZCA9PSBOVUxMIHx8IFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7CisgIGlmIChzZCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHZmcHJpbnRmIChzdGRlcnIsIGZtdCwgYXApOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG5RdWl0XG4iKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKyAgZWxzZSBpZiAoU1RBVEVfRU5HSU5FIChzZCktPmptcGJ1ZiA9PSBOVUxMKQorICAgIHsKKyAgICAgIHNpbV9pb19ldnByaW50ZiAoc2QsIGZtdCwgYXApOworICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiXG4iKTsKKyAgICAgIHNpbV9pb19lcnJvciAoc2QsICJRdWl0IFNpbXVsYXRvciIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNpbV9pb19ldnByaW50ZiAoc2QsIGZtdCwgYXApOworICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiXG4iKTsKKyAgICAgIHNpbV9lbmdpbmVfaGFsdCAoc2QsIGNwdSwgTlVMTCwgY2lhLCBzaW1fc3RvcHBlZCwgU0lNX1NJR0FCUlQpOworICAgIH0KK30KKwordm9pZAorc2ltX2VuZ2luZV9hYm9ydCAoU0lNX0RFU0Mgc2QsCisJCSAgc2ltX2NwdSAqY3B1LAorCQkgIHNpbV9jaWEgY2lhLAorCQkgIGNvbnN0IGNoYXIgKmZtdCwKKwkJICAuLi4pCit7CisgIHZhX2xpc3QgYXA7CisgIEFTU0VSVCAoc2QgPT0gTlVMTCB8fCBTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworICB2YV9zdGFydChhcCwgZm10KTsKKyAgc2ltX2VuZ2luZV92YWJvcnQgKHNkLCBjcHUsIGNpYSwgZm10LCBhcCk7CisgIHZhX2VuZCAoYXApOworfQorCisKKy8qIEdlbmVyaWMgbmV4dC9sYXN0IGNwdSAqLworCitpbnQKK3NpbV9lbmdpbmVfbGFzdF9jcHVfbnIgKFNJTV9ERVNDIHNkKQoreworICBzaW1fZW5naW5lICplbmdpbmUgPSBTVEFURV9FTkdJTkUgKHNkKTsKKyAgaWYgKGVuZ2luZS0+bGFzdF9jcHUgIT0gTlVMTCkKKyAgICByZXR1cm4gZW5naW5lLT5sYXN0X2NwdSAtIFNUQVRFX0NQVSAoc2QsIDApOworICBlbHNlCisgICAgcmV0dXJuIE1BWF9OUl9QUk9DRVNTT1JTOworfQorCitpbnQKK3NpbV9lbmdpbmVfbmV4dF9jcHVfbnIgKFNJTV9ERVNDIHNkKQoreworICBzaW1fZW5naW5lICplbmdpbmUgPSBTVEFURV9FTkdJTkUgKHNkKTsKKyAgaWYgKGVuZ2luZS0+bmV4dF9jcHUgIT0gTlVMTCkKKyAgICByZXR1cm4gZW5naW5lLT5uZXh0X2NwdSAtIFNUQVRFX0NQVSAoc2QsIDApOworICBlbHNlCisgICAgcmV0dXJuIHNpbV9lbmdpbmVfbGFzdF9jcHVfbnIgKHNkKSArIDE7Cit9CisKK2ludAorc2ltX2VuZ2luZV9ucl9jcHVzIChTSU1fREVTQyBzZCkKK3sKKyAgc2ltX2VuZ2luZSAqZW5naW5lID0gU1RBVEVfRU5HSU5FIChzZCk7CisgIHJldHVybiBlbmdpbmUtPm5yX2NwdXM7Cit9CisKKworCisKKy8qIEluaXRpYWxpemF0aW9uICovCisKK3N0YXRpYyBTSU1fUkMKK3NpbV9lbmdpbmVfaW5pdCAoU0lNX0RFU0Mgc2QpCit7CisgIC8qIGluaXRpYWxpemUgdGhlIHN0YXJ0L3N0b3AvcmVzdW1lIGVuZ2luZSAqLworICBzaW1fZW5naW5lICplbmdpbmUgPSBTVEFURV9FTkdJTkUgKHNkKTsKKyAgZW5naW5lLT5qbXBidWYgPSBOVUxMOworICBlbmdpbmUtPmxhc3RfY3B1ID0gTlVMTDsKKyAgZW5naW5lLT5uZXh0X2NwdSA9IE5VTEw7CisgIGVuZ2luZS0+bnJfY3B1cyA9IE1BWF9OUl9QUk9DRVNTT1JTOworICBlbmdpbmUtPnJlYXNvbiA9IHNpbV9ydW5uaW5nOworICBlbmdpbmUtPnNpZ3JjID0gMDsKKyAgZW5naW5lLT5zdGVwcGVyID0gTlVMTDsgLyogc2ltX2V2ZW50c19pbml0IHdpbGwgY2xlYW4gaXQgdXAgKi8KKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworCitTSU1fUkMKK3NpbV9lbmdpbmVfaW5zdGFsbCAoU0lNX0RFU0Mgc2QpCit7CisgIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7CisgIHNpbV9tb2R1bGVfYWRkX2luaXRfZm4gKHNkLCBzaW1fZW5naW5lX2luaXQpOworICByZXR1cm4gU0lNX1JDX09LOworfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tZW5naW5lLmggYi9zaW0vY29tbW9uL3NpbS1lbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWFhNTFmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tZW5naW5lLmgKQEAgLTAsMCArMSwxNjEgQEAKKy8qIEdlbmVyaWMgc2ltdWxhdG9yIGhhbHQvcmVzdW1lLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBTSU1fRU5HSU5FX0gKKyNkZWZpbmUgU0lNX0VOR0lORV9ICisKKwordHlwZWRlZiBzdHJ1Y3QgX3NpbV9lbmdpbmUgc2ltX2VuZ2luZTsKK3N0cnVjdCBfc2ltX2VuZ2luZQoreworICB2b2lkICpqbXBidWY7CisgIHNpbV9jcHUgKmxhc3RfY3B1OworICBzaW1fY3B1ICpuZXh0X2NwdTsKKyAgaW50IG5yX2NwdXM7CisgIGVudW0gc2ltX3N0b3AgcmVhc29uOworICBzaW1fZXZlbnQgKnN0ZXBwZXI7CisgIGludCBzaWdyYzsKK307CisKKworCisvKiBqbXB2YWw6IDAgKGluaXRpYWwgdXNlKSBzdGFydCBzaW11bGF0b3IKKyAgICAgICAgICAgMSAgICAgICAgICAgICAgIGhhbHQgc2ltdWxhdG9yCisgICAgICAgICAgIDIgICAgICAgICAgICAgICByZXN0YXJ0IHNpbXVsYXRvcgorICAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgSVNPIEMgc3RhbmRhcmQgKHRoZSBvbmx5IHRpbWUgMCBpcyByZXR1cm5lZAorICAgaXMgYXQgdGhlIGluaXRpYWwgY2FsbCB0byBzZXRqbXApLiAqLworCitlbnVtIHsKKyAgc2ltX2VuZ2luZV9zdGFydF9qbXB2YWwsCisgIHNpbV9lbmdpbmVfaGFsdF9qbXB2YWwsCisgIHNpbV9lbmdpbmVfcmVzdGFydF9qbXB2YWwsCit9OworCisKKy8qIEdldC9zZXQgdGhlIHJ1biBzdGF0ZSBvZiBDUFUgdG8gUkVBU09OL1NJR1JDLgorICAgUkVBU09OL1NJR1JDIGFyZSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHNpbV9zdG9wX3JlYXNvbi4gICovCit2b2lkIHNpbV9lbmdpbmVfZ2V0X3J1bl9zdGF0ZSAoU0lNX0RFU0Mgc2QsIGVudW0gc2ltX3N0b3AgKnJlYXNvbiwgaW50ICpzaWdyYyk7Cit2b2lkIHNpbV9lbmdpbmVfc2V0X3J1bl9zdGF0ZSAoU0lNX0RFU0Mgc2QsIGVudW0gc2ltX3N0b3AgcmVhc29uLCBpbnQgc2lncmMpOworCisKKy8qIEhhbHQgdGhlIHNpbXVsYXRvciAqbm93KiAqLworCitleHRlcm4gdm9pZCBzaW1fZW5naW5lX2hhbHQKKyhTSU1fREVTQyBzZCwKKyBzaW1fY3B1ICpsYXN0X2NwdSwgLyogTlVMTCAtPiBpbiBldmVudC1tZ3IgKi8KKyBzaW1fY3B1ICpuZXh0X2NwdSwgLyogTlVMTCAtPiBzdWNjIChsYXN0X2NwdSkgb3IgZXZlbnQtbWdyICovCisgc2ltX2NpYSBjaWEsCisgZW51bSBzaW1fc3RvcCByZWFzb24sCisgaW50IHNpZ3JjKTsKKworLyogSGFsdCBob29rIC0gYWxsb3cgdGFyZ2V0IHNwZWNpZmljIG9wZXJhdGlvbiB3aGVuIGhhbHRpbmcgYQorICAgc2ltdWxhdG9yICovCisKKyNpZiAhZGVmaW5lZCAoU0lNX0VOR0lORV9IQUxUX0hPT0spCisjZGVmaW5lIFNJTV9FTkdJTkVfSEFMVF9IT09LKFNELCBMQVNUX0NQVSwgQ0lBKSBcCitpZiAoKExBU1RfQ1BVKSAhPSBOVUxMKSBDSUFfU0VUIChMQVNUX0NQVSwgQ0lBKQorI2VuZGlmCisKKy8qIE5COiBJZiBhIHBvcnQgdXNlcyB0aGUgU0lNX0NQVV9FWENFUFRJT05fKiBob29rcywgdGhlIGRlZmF1bHQgCisgICBTSU1fRU5HSU5FX0hBTFRfSE9PSyBhbmQgU0lNX0VOR0lORV9SRVNVTUVfSE9PSyBtdXN0IG5vdCBiZSB1c2VkLgorICAgVGhleSBjb25mbGljdCBpbiB0aGF0IHRoZSBQQyBzZXQgYnkgdGhlIEhBTFRfSE9PSyBtYXkgb3ZlcndyaXRlIHRoZQorICAgcHJvcGVyIG9uZSwgYXMgaW50ZW5kZWQgdG8gYmUgc2F2ZWQgYnkgdGhlIEVYQ0VQVElPTl9UUklHR0VSCisgICBob29rLiAqLworCisKKy8qIHJlc3RhcnQgdGhlIHNpbXVsYXRvciAqbm93KiAqLworCitleHRlcm4gdm9pZCBzaW1fZW5naW5lX3Jlc3RhcnQKKyhTSU1fREVTQyBzZCwKKyBzaW1fY3B1ICpsYXN0X2NwdSwgLyogTlVMTCAtPiBpbiBldmVudC1tZ3IgKi8KKyBzaW1fY3B1ICpuZXh0X2NwdSwgLyogTlVMTCAtPiBzdWNjIChsYXN0X2NwdSkgb3IgZXZlbnQtbWdyICovCisgc2ltX2NpYSBjaWEpOworCisvKiBSZXN0YXJ0IGhvb2sgLSBhbGxvdyB0YXJnZXQgc3BlY2lmaWMgb3BlcmF0aW9uIHdoZW4gcmVzdGFydGluZyBhCisgICBzaW11bGF0b3IgKi8KKworI2lmICFkZWZpbmVkIChTSU1fRU5HSU5FX1JFU1RBUlRfSE9PSykKKyNkZWZpbmUgU0lNX0VOR0lORV9SRVNUQVJUX0hPT0soU0QsIExBU1RfQ1BVLCBDSUEpIFNJTV9FTkdJTkVfSEFMVF9IT09LKFNELCBMQVNUX0NQVSwgQ0lBKQorI2VuZGlmCisKKworCisKKy8qIEFib3J0IHRoZSBzaW11bGF0b3IgKm5vdyouCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgTlVMTCBzYWZlLiAgSXQgY2FuIGJlIGNhbGxlZCB3aGVuIGVpdGhlciBvZiBTRCBvcgorICAgQ0lBIGFyZSBOVUxMLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIHNldGptcC9sb25nam1wIHNhZmUuICBJdCBjYW4gYmUgY2FsbGVkIHdoZW4gb2YKKyAgIHRoZSBzaW1fZW5naW5lIHNldGptcC9sb25nam1wIGJ1ZmZlciBoYXMgbm90IGJlZW4gZXN0YWJsaXNoZWQuCisKKyAgIFNpbXVsYXRvcnMgdGhhdCBhcmUgdXNpbmcgY29tcG9uZW50cyBzdWNoIGFzIHNpbS1jb3JlIGJ1dCBhcmUgbm90CisgICB5ZXQgdXNpbmcgdGhpcyBzaW0tZW5naW5lIG1vZHVsZSBzaG91bGQgbGluayBpbiBmaWxlIHNpbS1hYm9ydC5vCisgICB3aGljaCBpbXBsZW1lbnRzIGEgbm9uIHNldGptcC9sb25nam1wIHZlcnNpb24gb2YKKyAgIHNpbV9lbmdpbmVfYWJvcnQuICovCisKK2V4dGVybiB2b2lkIHNpbV9lbmdpbmVfYWJvcnQKKyhTSU1fREVTQyBzZCwKKyBzaW1fY3B1ICpjcHUsCisgc2ltX2NpYSBjaWEsCisgY29uc3QgY2hhciAqZm10LAorIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOworCitleHRlcm4gdm9pZCBzaW1fZW5naW5lX3ZhYm9ydAorKFNJTV9ERVNDIHNkLAorIHNpbV9jcHUgKmNwdSwKKyBzaW1fY2lhIGNpYSwKKyBjb25zdCBjaGFyICpmbXQsCisgdmFfbGlzdCBhcCk7CisKKy8qIE5vIGFib3J0IGhvb2sgLSB3aGVuIHBvc3NpYmxlIHRoaXMgZnVuY3Rpb24gZXhpdHMgdXNpbmcgdGhlCisgICBlbmdpbmVfaGFsdCBmdW5jdGlvbiAoYW5kIFNJTV9FTkdJTkVfSEFMVF9IT09LKS4gKi8KKworCisKKworLyogQ2FsbGVkIGJ5IHRoZSBnZW5lcmljIHNpbV9yZXN1bWUgdG8gcnVuIHRoZSBzaW11bGF0aW9uIHdpdGhpbiB0aGUKKyAgIGFib3ZlIHNhZnR5IG5ldC4KKworICAgQW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBzaW1fZW5naW5lX3J1biBjYW4gYmUgZm91bmQgaW4gdGhlCisgICBmaWxlIHNpbS1ydW4uYyAqLworCitleHRlcm4gdm9pZCBzaW1fZW5naW5lX3J1bgorKFNJTV9ERVNDIHNkLAorIGludCBuZXh0X2NwdV9uciwKKyBpbnQgbnJfY3B1cywKKyBpbnQgc2lnZ25hbCk7IC8qIG1vc3Qgc2ltdWxhdG9ycyBpZ25vcmUgc2lnZ25hbCAqLworCisKKworLyogRGV0ZXJtaW5lIHRoZSBzdGF0ZSBvZiBuZXh0L2xhc3QgY3B1IHdoZW4gdGhlIHNpbXVsYXRvciB3YXMgbGFzdAorICAgaGFsdGVkIC0gYSB2YWx1ZSA+PSBNQVhfTlJfUFJPQ0VTU09SUyBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAgIGV2ZW50LXF1ZXVlIHdhcyBuZXh0L2xhc3QuICovCisKK2V4dGVybiBpbnQgc2ltX2VuZ2luZV9uZXh0X2NwdV9uciAoU0lNX0RFU0Mgc2QpOworZXh0ZXJuIGludCBzaW1fZW5naW5lX2xhc3RfY3B1X25yIChTSU1fREVTQyBzZCk7CitleHRlcm4gaW50IHNpbV9lbmdpbmVfbnJfY3B1cyAoU0lNX0RFU0Mgc2QpOworCisKKy8qIEVzdGFibGlzaCB0aGUgc2ltdWxhdG9yIGVuZ2luZSAqLworTU9EVUxFX0lOU1RBTExfRk4gc2ltX2VuZ2luZV9pbnN0YWxsOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tZXZlbnRzLmMgYi9zaW0vY29tbW9uL3NpbS1ldmVudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjdkOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tZXZlbnRzLmMKQEAgLTAsMCArMSwxMTg4IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIF9TSU1fRVZFTlRTX0NfCisjZGVmaW5lIF9TSU1fRVZFTlRTX0NfCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzaWduYWwuaD4gLyogRm9yIFNJR1BST0NNQVNLIGV0LmFsLiAqLworCisjaWYgX19DWUdXSU4zMl9fCisvKiBUaGUgdWlfbG9vcF9ob29rIGlzIGNhbGxlZCB0byBrZWVwIHRoZSBHVUkgYWxpdmUgd2hpbGUgdGhlIHNpbXVsYXRvcgorICAgaXMgcnVubmluZy4gIFRoZSBjb3VudGVyIGlzIHRvIG1ha2Ugc3VyZSB3ZSBkbyBub3Qgd2FrZSBpdCB0b28gb2Z0ZW4uCisqLworCitleHRlcm4gdm9pZCAoKnVpX2xvb3BfaG9vaykgUEFSQU1TICgoaW50KSk7CitzdGF0aWMgdW5zaWduZWQgaW50IHVpX2xvb3BfaG9va19jb3VudGVyID0gMDsKKyNlbmRpZgorCit0eXBlZGVmIGVudW0geworICB3YXRjaF9pbnZhbGlkLAorCisgIC8qIGNvcmUgLSB0YXJnZXQgYnl0ZSBvcmRlciAqLworICB3YXRjaF9jb3JlX3RhcmdfMSwKKyAgd2F0Y2hfY29yZV90YXJnXzIsCisgIHdhdGNoX2NvcmVfdGFyZ180LAorICB3YXRjaF9jb3JlX3RhcmdfOCwKKyAgLyogY29yZSAtIGJpZy1lbmRpYW4gKi8KKyAgd2F0Y2hfY29yZV9iZV8xLAorICB3YXRjaF9jb3JlX2JlXzIsCisgIHdhdGNoX2NvcmVfYmVfNCwKKyAgd2F0Y2hfY29yZV9iZV84LAorICAvKiBjb3JlIC0gbGl0dGxlLWVuZGlhbiAqLworICB3YXRjaF9jb3JlX2xlXzEsCisgIHdhdGNoX2NvcmVfbGVfMiwKKyAgd2F0Y2hfY29yZV9sZV80LAorICB3YXRjaF9jb3JlX2xlXzgsCisKKyAgLyogc2ltIC0gaG9zdCBieXRlIG9yZGVyICovCisgIHdhdGNoX3NpbV9ob3N0XzEsCisgIHdhdGNoX3NpbV9ob3N0XzIsCisgIHdhdGNoX3NpbV9ob3N0XzQsCisgIHdhdGNoX3NpbV9ob3N0XzgsCisgIC8qIHNpbSAtIGJpZy1lbmRpYW4gKi8KKyAgd2F0Y2hfc2ltX2JlXzEsCisgIHdhdGNoX3NpbV9iZV8yLAorICB3YXRjaF9zaW1fYmVfNCwKKyAgd2F0Y2hfc2ltX2JlXzgsCisgIC8qIHNpbSAtIGxpdHRsZS1lbmRpYW4gKi8KKyAgd2F0Y2hfc2ltX2xlXzEsCisgIHdhdGNoX3NpbV9sZV8yLAorICB3YXRjaF9zaW1fbGVfNCwKKyAgd2F0Y2hfc2ltX2xlXzgsCisgIAorICAvKiB3YWxsY2xvY2sgKi8KKyAgd2F0Y2hfY2xvY2ssCisKKyAgLyogdGltZXIgKi8KKyAgd2F0Y2hfdGltZXIsCit9IHNpbV9ldmVudF93YXRjaHBvaW50czsKKworCitzdHJ1Y3QgX3NpbV9ldmVudCB7CisgIHNpbV9ldmVudF93YXRjaHBvaW50cyB3YXRjaGluZzsKKyAgdm9pZCAqZGF0YTsKKyAgc2ltX2V2ZW50X2hhbmRsZXIgKmhhbmRsZXI7CisgIC8qIHRpbWVyIGV2ZW50ICovCisgIHNpZ25lZDY0IHRpbWVfb2ZfZXZlbnQ7CisgIC8qIHdhdGNoIHdhbGxjbG9jayBldmVudCAqLworICB1bnNpZ25lZCB3YWxsY2xvY2s7CisgIC8qIHdhdGNoIGNvcmUgYWRkcmVzcyAqLworICBhZGRyZXNzX3dvcmQgY29yZV9hZGRyOworICB1bnNpZ25lZCBjb3JlX21hcDsKKyAgLyogd2F0Y2ggc2ltIGFkZHIgKi8KKyAgdm9pZCAqaG9zdF9hZGRyOworICAvKiB3YXRjaCBjb3JlL3NpbSByYW5nZSAqLworICBpbnQgaXNfd2l0aGluOyAvKiAwLzEgKi8KKyAgdW5zaWduZWQgdWI7CisgIHVuc2lnbmVkIGxiOworICB1bnNpZ25lZDY0IHViNjQ7CisgIHVuc2lnbmVkNjQgbGI2NDsKKyAgLyogdHJhY2UgaW5mbyAoaWYgYW55KSAqLworICBjaGFyICp0cmFjZTsKKyAgLyogbGlzdCAqLworICBzaW1fZXZlbnQgKm5leHQ7Cit9OworCisKKy8qIFRoZSBldmVudCBxdWV1ZSBtYWludGFpbnMgYSBzaW5nbGUgYWJzb2x1dGUgdGltZSB1c2luZyB0d28KKyAgIHZhcmlhYmxlcy4KKyAgIAorICAgVElNRV9PRl9FVkVOVDogdGhpcyBob2xkcyB0aGUgdGltZSBhdCB3aGljaCB0aGUgbmV4dCBldmVudCBpcyBtZW50CisgICB0byBvY2N1cmUuICBJZiBubyBuZXh0IGV2ZW50IGl0IHdpbGwgaG9sZCB0aGUgdGltZSBvZiB0aGUgbGFzdAorICAgZXZlbnQuCisKKyAgIFRJTUVfRlJPTV9FVkVOVDogVGhlIGN1cnJlbnQgZGlzdGFuY2UgZnJvbSBUSU1FX09GX0VWRU5ULiAgQSB2YWx1ZQorICAgPD0gMCAoZXhjZXB0IHdoZW4gcG9sbC1ldmVudCBpcyBiZWluZyBwcm9jZXNzZWQpIGluZGljYXRlcyB0aGF0CisgICBldmVudCBwcm9jZXNzaW5nIGlzIGR1ZS4gIFRoaXMgdmFyaWFibGUgaXMgZGVjcmVtZW50ZWQgb25jZSBmb3IKKyAgIGVhY2ggaXRlcmF0aW9uIG9mIGEgY2xvY2sgY3ljbGUuCisKKyAgIEluaXRpYWxseSwgdGhlIGNsb2NrIGlzIHN0YXJ0ZWQgYXQgdGltZSBvbmUgKDApIHdpdGggVElNRV9PRl9FVkVOVAorICAgPT0gMCBhbmQgVElNRV9GUk9NX0VWRU5UID09IDAgYW5kIHdpdGggTlJfVElDS1NfVE9fUFJPQ0VTUyA9PSAxLgorCisgICBDbGVhcmx5IHRoZXJlIGlzIGEgYnVnIGluIHRoYXQgdGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgYWJzb2x1dGUKKyAgIHRpbWUgY291bnRlciB3aWxsIG5ldmVyIGJlY29tZSBncmVhdGVyIHRoYW4gMl42Mi4KKworICAgVG8gYXZvaWQgdGhlIG5lZWQgdG8gdXNlIDY0Yml0IGFyaXRobWV0aWMsIHRoZSBldmVudCBxdWV1ZSBhbHdheXMKKyAgIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBldmVudCBzY2hlZHVsZWQgZXZlcnkgMTYgMDAwIHRpY2tzLiAgVGhpcworICAgbGltaXRzIHRoZSB0aW1lIGZyb20gZXZlbnQgY291bnRlciB0byB2YWx1ZXMgbGVzcyB0aGFuCisgICAxNiAwMDAuICovCisKKworI2lmICFkZWZpbmVkIChTSU1fRVZFTlRTX1BPTExfUkFURSkKKyNkZWZpbmUgU0lNX0VWRU5UU19QT0xMX1JBVEUgMHgxMDAwCisjZW5kaWYKKworCisjZGVmaW5lIF9FVFJBQ0Ugc2QsIE5VTEwKKworI3VuZGVmIEVUUkFDRV9QCisjZGVmaW5lIEVUUkFDRV9QIChXSVRIX1RSQUNFICYmIFNUQVRFX0VWRU5UUyAoc2QpLT50cmFjZSkKKworI3VuZGVmIEVUUkFDRQorI2RlZmluZSBFVFJBQ0UoQVJHUykgXAorZG8gXAorICB7IFwKKyAgICBpZiAoRVRSQUNFX1ApIFwKKyAgICAgIHsgXAorICAgICAgICBpZiAoU1RSQUNFX0RFQlVHX1AgKHNkKSkgXAorCSAgeyBcCisJICAgIGNvbnN0IGNoYXIgKmZpbGU7IFwKKwkgICAgU0lNX0ZJTFRFUl9QQVRIIChmaWxlLCBfX0ZJTEVfXyk7IFwKKwkgICAgdHJhY2VfcHJpbnRmIChzZCwgTlVMTCwgIiVzOiVkOiAiLCBmaWxlLCBfX0xJTkVfXyk7IFwKKwkgIH0gXAorICAgICAgICB0cmFjZV9wcmludGYgIEFSR1M7IFwKKyAgICAgIH0gXAorICB9IFwKK3doaWxlICgwKQorCisKKy8qIGV2ZW50IHF1ZXVlIGl0ZXJhdG9yIC0gZG9uJ3QgaXRlcmF0ZSBvdmVyIHRoZSBoZWxkIHF1ZXVlLiAqLworCisjaWYgRVhURVJOX1NJTV9FVkVOVFNfUAorc3RhdGljIHNpbV9ldmVudCAqKgorbmV4dF9ldmVudF9xdWV1ZSAoU0lNX0RFU0Mgc2QsCisJCSAgc2ltX2V2ZW50ICoqcXVldWUpCit7CisgIGlmIChxdWV1ZSA9PSBOVUxMKQorICAgIHJldHVybiAmU1RBVEVfRVZFTlRTIChzZCktPnF1ZXVlOworICBlbHNlIGlmIChxdWV1ZSA9PSAmU1RBVEVfRVZFTlRTIChzZCktPnF1ZXVlKQorICAgIHJldHVybiAmU1RBVEVfRVZFTlRTIChzZCktPndhdGNocG9pbnRzOworICBlbHNlIGlmIChxdWV1ZSA9PSAmU1RBVEVfRVZFTlRTIChzZCktPndhdGNocG9pbnRzKQorICAgIHJldHVybiAmU1RBVEVfRVZFTlRTIChzZCktPndhdGNoZWRwb2ludHM7CisgIGVsc2UgaWYgKHF1ZXVlID09ICZTVEFURV9FVkVOVFMgKHNkKS0+d2F0Y2hlZHBvaW50cykKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZQorICAgIHNpbV9pb19lcnJvciAoc2QsICJuZXh0X2V2ZW50X3F1ZXVlIC0gYmFkIHF1ZXVlIik7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKworU1RBVElDX0lOTElORV9TSU1fRVZFTlRTXAorKHZvaWQpCitzaW1fZXZlbnRzX3BvbGwgKFNJTV9ERVNDIHNkLAorCQkgdm9pZCAqZGF0YSkKK3sKKyAgLyoganVzdCByZS1zY2hlZHVsZSBpbiAxMDAwIG1pbGxpb24gdGlja3MgdGltZSAqLworICBzaW1fZXZlbnRzX3NjaGVkdWxlIChzZCwgU0lNX0VWRU5UU19QT0xMX1JBVEUsIHNpbV9ldmVudHNfcG9sbCwgc2QpOworICBzaW1faW9fcG9sbF9xdWl0IChzZCk7Cit9CisKKworLyogImV2ZW50cyIgbW9kdWxlIGluc3RhbGwgaGFuZGxlci4KKyAgIFRoaXMgaXMgY2FsbGVkIHZpYSBzaW1fbW9kdWxlX2luc3RhbGwgdG8gaW5zdGFsbCB0aGUgImV2ZW50cyIgc3Vic3lzdGVtCisgICBpbnRvIHRoZSBzaW11bGF0b3IuICAqLworCisjaWYgRVhURVJOX1NJTV9FVkVOVFNfUAorU1RBVElDX1NJTV9FVkVOVFMgKE1PRFVMRV9VTklOU1RBTExfRk4pIHNpbV9ldmVudHNfdW5pbnN0YWxsOworU1RBVElDX1NJTV9FVkVOVFMgKE1PRFVMRV9JTklUX0ZOKSBzaW1fZXZlbnRzX2luaXQ7CitTVEFUSUNfU0lNX0VWRU5UUyAoTU9EVUxFX1JFU1VNRV9GTikgc2ltX2V2ZW50c19yZXN1bWU7CitTVEFUSUNfU0lNX0VWRU5UUyAoTU9EVUxFX1NVU1BFTkRfRk4pIHNpbV9ldmVudHNfc3VzcGVuZDsKKyNlbmRpZgorCisjaWYgRVhURVJOX1NJTV9FVkVOVFNfUAorU0lNX1JDCitzaW1fZXZlbnRzX2luc3RhbGwgKFNJTV9ERVNDIHNkKQoreworICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworICBzaW1fbW9kdWxlX2FkZF91bmluc3RhbGxfZm4gKHNkLCBzaW1fZXZlbnRzX3VuaW5zdGFsbCk7CisgIHNpbV9tb2R1bGVfYWRkX2luaXRfZm4gKHNkLCBzaW1fZXZlbnRzX2luaXQpOworICBzaW1fbW9kdWxlX2FkZF9yZXN1bWVfZm4gKHNkLCBzaW1fZXZlbnRzX3Jlc3VtZSk7CisgIHNpbV9tb2R1bGVfYWRkX3N1c3BlbmRfZm4gKHNkLCBzaW1fZXZlbnRzX3N1c3BlbmQpOworICByZXR1cm4gU0lNX1JDX09LOworfQorI2VuZGlmCisKKworLyogU3VzcGVuZC9yZXN1bWUgdGhlIGV2ZW50IHF1ZXVlIG1hbmFnZXIgd2hlbiB0aGUgc2ltdWxhdG9yIGlzIG5vdAorICAgcnVubmluZyAqLworCisjaWYgRVhURVJOX1NJTV9FVkVOVFNfUAorc3RhdGljIFNJTV9SQworc2ltX2V2ZW50c19yZXN1bWUgKFNJTV9ERVNDIHNkKQoreworICBzaW1fZXZlbnRzICpldmVudHMgPSBTVEFURV9FVkVOVFMgKHNkKTsKKyAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKKyAgU0lNX0FTU0VSVCAoZXZlbnRzLT5yZXN1bWVfd2FsbGNsb2NrID09IDApOworICBldmVudHMtPnJlc3VtZV93YWxsY2xvY2sgPSBzaW1fZWxhcHNlZF90aW1lX2dldCAoKTsKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKyNlbmRpZgorCisjaWYgRVhURVJOX1NJTV9FVkVOVFNfUAorc3RhdGljIFNJTV9SQworc2ltX2V2ZW50c19zdXNwZW5kIChTSU1fREVTQyBzZCkKK3sKKyAgc2ltX2V2ZW50cyAqZXZlbnRzID0gU1RBVEVfRVZFTlRTIChzZCk7CisgIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7CisgIFNJTV9BU1NFUlQgKGV2ZW50cy0+cmVzdW1lX3dhbGxjbG9jayAhPSAwKTsKKyAgZXZlbnRzLT5lbGFwc2VkX3dhbGxjbG9jayArPSBzaW1fZWxhcHNlZF90aW1lX3NpbmNlIChldmVudHMtPnJlc3VtZV93YWxsY2xvY2spOworICBldmVudHMtPnJlc3VtZV93YWxsY2xvY2sgPSAwOworICByZXR1cm4gU0lNX1JDX09LOworfQorI2VuZGlmCisKKworLyogVW5pbnN0YWxsIHRoZSAiZXZlbnRzIiBzdWJzeXN0ZW0gZnJvbSB0aGUgc2ltdWxhdG9yLiAgKi8KKworI2lmIEVYVEVSTl9TSU1fRVZFTlRTX1AKK3N0YXRpYyB2b2lkCitzaW1fZXZlbnRzX3VuaW5zdGFsbCAoU0lNX0RFU0Mgc2QpCit7CisgIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7CisgIC8qIEZJWE1FOiBmcmVlIGJ1ZmZlcnMsIGV0Yy4gKi8KK30KKyNlbmRpZgorCisKKy8qIG1hbGxvYy9mcmVlICovCisKKyNpZiBFWFRFUk5fU0lNX0VWRU5UU19QCitzdGF0aWMgc2ltX2V2ZW50ICoKK3NpbV9ldmVudHNfemFsbG9jIChTSU1fREVTQyBzZCkKK3sKKyAgc2ltX2V2ZW50cyAqZXZlbnRzID0gU1RBVEVfRVZFTlRTIChzZCk7CisgIHNpbV9ldmVudCAqbmV3ID0gZXZlbnRzLT5mcmVlX2xpc3Q7CisgIGlmIChuZXcgIT0gTlVMTCkKKyAgICB7CisgICAgICBldmVudHMtPmZyZWVfbGlzdCA9IG5ldy0+bmV4dDsKKyAgICAgIG1lbXNldCAobmV3LCAwLCBzaXplb2YgKCpuZXcpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisjaWYgZGVmaW5lZCAoSEFWRV9TSUdQUk9DTUFTSykgJiYgZGVmaW5lZCAoU0lHX1NFVE1BU0spCisgICAgICAvKi1MT0NLLSovCisgICAgICBzaWdzZXRfdCBvbGRfbWFzazsKKyAgICAgIHNpZ3NldF90IG5ld19tYXNrOworICAgICAgc2lnZmlsbHNldCgmbmV3X21hc2spOworICAgICAgc2lncHJvY21hc2sgKFNJR19TRVRNQVNLLCAmbmV3X21hc2ssICZvbGRfbWFzayk7CisjZW5kaWYKKyAgICAgIG5ldyA9IFpBTExPQyAoc2ltX2V2ZW50KTsKKyNpZiBkZWZpbmVkIChIQVZFX1NJR1BST0NNQVNLKSAmJiBkZWZpbmVkIChTSUdfU0VUTUFTSykKKyAgICAgIC8qLVVOTE9DSy0qLworICAgICAgc2lncHJvY21hc2sgKFNJR19TRVRNQVNLLCAmb2xkX21hc2ssIE5VTEwpOworI2VuZGlmCisgICAgfQorICByZXR1cm4gbmV3OworfQorI2VuZGlmCisKK1NUQVRJQ19JTkxJTkVfU0lNX0VWRU5UU1wKKyh2b2lkKQorc2ltX2V2ZW50c19mcmVlIChTSU1fREVTQyBzZCwKKwkJIHNpbV9ldmVudCAqZGVhZCkKK3sKKyAgc2ltX2V2ZW50cyAqZXZlbnRzID0gU1RBVEVfRVZFTlRTIChzZCk7CisgIGRlYWQtPm5leHQgPSBldmVudHMtPmZyZWVfbGlzdDsKKyAgZXZlbnRzLT5mcmVlX2xpc3QgPSBkZWFkOworICBpZiAoZGVhZC0+dHJhY2UgIT0gTlVMTCkKKyAgICB7CisgICAgICBmcmVlIChkZWFkLT50cmFjZSk7IC8qIE5COiBhc3ByaW50ZiByZXR1cm5zIGEgYGZyZWUnIGJ1ZiAqLworICAgICAgZGVhZC0+dHJhY2UgPSBOVUxMOworICAgIH0KK30KKworCisvKiBJbml0aWFsaXplIHRoZSBzaW11bGF0b3IgZXZlbnQgbWFuYWdlciAqLworCisjaWYgRVhURVJOX1NJTV9FVkVOVFNfUAorU0lNX1JDCitzaW1fZXZlbnRzX2luaXQgKFNJTV9ERVNDIHNkKQoreworICBzaW1fZXZlbnRzICpldmVudHMgPSBTVEFURV9FVkVOVFMgKHNkKTsKKworICAvKiBkcmFpbiB0aGUgaW50ZXJydXB0IHF1ZXVlICovCisgIGV2ZW50cy0+bnJfaGVsZCA9IDA7CisgIGlmIChldmVudHMtPmhlbGQgPT0gTlVMTCkKKyAgICBldmVudHMtPmhlbGQgPSBOWkFMTE9DIChzaW1fZXZlbnQsIE1BWF9OUl9TSUdOQUxfU0lNX0VWRU5UUyk7CisKKyAgLyogZHJhaW4gdGhlIG5vcm1hbCBxdWV1ZXMgKi8KKyAgeworICAgIHNpbV9ldmVudCAqKnF1ZXVlID0gTlVMTDsKKyAgICB3aGlsZSAoKHF1ZXVlID0gbmV4dF9ldmVudF9xdWV1ZSAoc2QsIHF1ZXVlKSkgIT0gTlVMTCkKKyAgICAgIHsKKwlpZiAocXVldWUgPT0gTlVMTCkgYnJlYWs7CisJd2hpbGUgKCpxdWV1ZSAhPSBOVUxMKQorCSAgeworCSAgICBzaW1fZXZlbnQgKmRlYWQgPSAqcXVldWU7CisJICAgICpxdWV1ZSA9IGRlYWQtPm5leHQ7CisJICAgIHNpbV9ldmVudHNfZnJlZSAoc2QsIGRlYWQpOworCSAgfQorCSpxdWV1ZSA9IE5VTEw7CisgICAgICB9CisgIH0KKworICAvKiB3aW5kIHRpbWUgYmFjayB0byB6ZXJvICovCisgIGV2ZW50cy0+bnJfdGlja3NfdG9fcHJvY2VzcyA9IDE7IC8qIHN0YXJ0IGJ5IGRvaW5nIHF1ZXVlICovCisgIGV2ZW50cy0+dGltZV9vZl9ldmVudCA9IDA7CisgIGV2ZW50cy0+dGltZV9mcm9tX2V2ZW50ID0gMDsKKyAgZXZlbnRzLT5lbGFwc2VkX3dhbGxjbG9jayA9IDA7CisgIGV2ZW50cy0+cmVzdW1lX3dhbGxjbG9jayA9IDA7CisKKyAgLyogc2NoZWR1bGUgb3VyIGluaXRpYWwgY291bnRlciBldmVudCAqLworICBzaW1fZXZlbnRzX3NjaGVkdWxlIChzZCwgMCwgc2ltX2V2ZW50c19wb2xsLCBzZCk7CisKKyAgLyogZnJvbSBub3cgb24sIGV4Y2VwdCB3aGVuIHRoZSBsYXJnZS1pbnQgZXZlbnQgaXMgYmVpbmcgcHJvY2Vzc2VkCisgICAgIHRoZSBldmVudCBxdWV1ZSBpcyBub24gZW1wdHkgKi8KKyAgU0lNX0FTU0VSVCAoZXZlbnRzLT5xdWV1ZSAhPSBOVUxMKTsKKworICByZXR1cm4gU0lNX1JDX09LOworfQorI2VuZGlmCisKKworSU5MSU5FX1NJTV9FVkVOVFNcCisoc2lnbmVkNjQpCitzaW1fZXZlbnRzX3RpbWUgKFNJTV9ERVNDIHNkKQoreworICBzaW1fZXZlbnRzICpldmVudHMgPSBTVEFURV9FVkVOVFMgKHNkKTsKKyAgcmV0dXJuIChldmVudHMtPnRpbWVfb2ZfZXZlbnQgLSBldmVudHMtPnRpbWVfZnJvbV9ldmVudCk7Cit9CisKKworSU5MSU5FX1NJTV9FVkVOVFNcCisodW5zaWduZWQgbG9uZykKK3NpbV9ldmVudHNfZWxhcHNlZF90aW1lIChTSU1fREVTQyBzZCkKK3sKKyAgdW5zaWduZWQgbG9uZyBlbGFwc2VkID0gU1RBVEVfRVZFTlRTIChzZCktPmVsYXBzZWRfd2FsbGNsb2NrOworCisgIC8qIEFyZSB3ZSBiZWluZyBjYWxsZWQgaW5zaWRlIHNpbV9yZXN1bWU/CisgICAgIChJcyB0aGVyZSBhIHNpbXVsYXRpb24gaW4gcHJvZ3Jlc3M/KSAgKi8KKyAgaWYgKFNUQVRFX0VWRU5UUyAoc2QpLT5yZXN1bWVfd2FsbGNsb2NrICE9IDApCisgICAgIGVsYXBzZWQgKz0gc2ltX2VsYXBzZWRfdGltZV9zaW5jZSAoU1RBVEVfRVZFTlRTIChzZCktPnJlc3VtZV93YWxsY2xvY2spOworCisgIHJldHVybiBlbGFwc2VkOworfQorCisKK1NUQVRJQ19JTkxJTkVfU0lNX0VWRU5UU1wKKyh2b2lkKQordXBkYXRlX3RpbWVfZnJvbV9ldmVudCAoU0lNX0RFU0Mgc2QpCit7CisgIHNpbV9ldmVudHMgKmV2ZW50cyA9IFNUQVRFX0VWRU5UUyAoc2QpOworICBzaWduZWQ2NCBjdXJyZW50X3RpbWUgPSBzaW1fZXZlbnRzX3RpbWUgKHNkKTsKKyAgaWYgKGV2ZW50cy0+cXVldWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBldmVudHMtPnRpbWVfb2ZfZXZlbnQgPSBldmVudHMtPnF1ZXVlLT50aW1lX29mX2V2ZW50OworICAgICAgZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQgPSAoZXZlbnRzLT5xdWV1ZS0+dGltZV9vZl9ldmVudCAtIGN1cnJlbnRfdGltZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZXZlbnRzLT50aW1lX29mX2V2ZW50ID0gY3VycmVudF90aW1lIC0gMTsKKyAgICAgIGV2ZW50cy0+dGltZV9mcm9tX2V2ZW50ID0gLTE7CisgICAgfQorICBTSU1fQVNTRVJUIChjdXJyZW50X3RpbWUgPT0gc2ltX2V2ZW50c190aW1lIChzZCkpOworfQorCisKKyNpZiBFWFRFUk5fU0lNX0VWRU5UU19QCitzdGF0aWMgdm9pZAoraW5zZXJ0X3NpbV9ldmVudCAoU0lNX0RFU0Mgc2QsCisJCSAgc2ltX2V2ZW50ICpuZXdfZXZlbnQsCisJCSAgc2lnbmVkNjQgZGVsdGEpCit7CisgIHNpbV9ldmVudHMgKmV2ZW50cyA9IFNUQVRFX0VWRU5UUyAoc2QpOworICBzaW1fZXZlbnQgKmN1cnI7CisgIHNpbV9ldmVudCAqKnByZXY7CisgIHNpZ25lZDY0IHRpbWVfb2ZfZXZlbnQ7CisKKyAgaWYgKGRlbHRhIDwgMCkKKyAgICBzaW1faW9fZXJyb3IgKHNkLCAid2hhdCBpcyBwYXN0IGlzIHBhc3QhXG4iKTsKKyAgCisgIC8qIGNvbXB1dGUgd2hlbiB0aGUgZXZlbnQgc2hvdWxkIG9jY3VyZSAqLworICB0aW1lX29mX2V2ZW50ID0gc2ltX2V2ZW50c190aW1lIChzZCkgKyBkZWx0YTsKKyAgCisgIC8qIGZpbmQgdGhlIHF1ZXVlIGluc2VydGlvbiBwb2ludCAtIHRoaW5ncyBhcmUgdGltZSBvcmRlcmVkICovCisgIHByZXYgPSAmZXZlbnRzLT5xdWV1ZTsKKyAgY3VyciA9IGV2ZW50cy0+cXVldWU7CisgIHdoaWxlIChjdXJyICE9IE5VTEwgJiYgdGltZV9vZl9ldmVudCA+PSBjdXJyLT50aW1lX29mX2V2ZW50KQorICAgIHsKKyAgICAgIFNJTV9BU1NFUlQgKGN1cnItPm5leHQgPT0gTlVMTAorCQkgIHx8IGN1cnItPnRpbWVfb2ZfZXZlbnQgPD0gY3Vyci0+bmV4dC0+dGltZV9vZl9ldmVudCk7CisgICAgICBwcmV2ID0gJmN1cnItPm5leHQ7CisgICAgICBjdXJyID0gY3Vyci0+bmV4dDsKKyAgICB9CisgIFNJTV9BU1NFUlQgKGN1cnIgPT0gTlVMTCB8fCB0aW1lX29mX2V2ZW50IDwgY3Vyci0+dGltZV9vZl9ldmVudCk7CisgIAorICAvKiBpbnNlcnQgaXQgKi8KKyAgbmV3X2V2ZW50LT5uZXh0ID0gY3VycjsKKyAgKnByZXYgPSBuZXdfZXZlbnQ7CisgIG5ld19ldmVudC0+dGltZV9vZl9ldmVudCA9IHRpbWVfb2ZfZXZlbnQ7CisgIAorICAvKiBhZGp1c3QgdGhlIHRpbWUgdW50aWwgdGhlIGZpcnN0IGV2ZW50ICovCisgIHVwZGF0ZV90aW1lX2Zyb21fZXZlbnQgKHNkKTsKK30KKyNlbmRpZgorCisKKyNpZiBFWFRFUk5fU0lNX0VWRU5UU19QCitzaW1fZXZlbnQgKgorc2ltX2V2ZW50c19zY2hlZHVsZSAoU0lNX0RFU0Mgc2QsCisJCSAgICAgc2lnbmVkNjQgZGVsdGFfdGltZSwKKwkJICAgICBzaW1fZXZlbnRfaGFuZGxlciAqaGFuZGxlciwKKwkJICAgICB2b2lkICpkYXRhKQoreworICB2YV9saXN0IGR1bW15OworICByZXR1cm4gc2ltX2V2ZW50c19zY2hlZHVsZV92dHJhY2VmIChzZCwgZGVsdGFfdGltZSwgaGFuZGxlciwgZGF0YSwKKwkJCQkgICAgICBOVUxMLCBkdW1teSk7Cit9CisjZW5kaWYKKworCisjaWYgRVhURVJOX1NJTV9FVkVOVFNfUAorc2ltX2V2ZW50ICoKK3NpbV9ldmVudHNfc2NoZWR1bGVfdHJhY2VmIChTSU1fREVTQyBzZCwKKwkJCSAgICBzaWduZWQ2NCBkZWx0YV90aW1lLAorCQkJICAgIHNpbV9ldmVudF9oYW5kbGVyICpoYW5kbGVyLAorCQkJICAgIHZvaWQgKmRhdGEsCisJCQkgICAgY29uc3QgY2hhciAqZm10LAorCQkJICAgIC4uLikKK3sKKyAgc2ltX2V2ZW50ICpuZXdfZXZlbnQ7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0IChhcCwgZm10KTsKKyAgbmV3X2V2ZW50ID0gc2ltX2V2ZW50c19zY2hlZHVsZV92dHJhY2VmIChzZCwgZGVsdGFfdGltZSwgaGFuZGxlciwgZGF0YSwgZm10LCBhcCk7CisgIHZhX2VuZCAoYXApOworICByZXR1cm4gbmV3X2V2ZW50OworfQorI2VuZGlmCisKKworI2lmIEVYVEVSTl9TSU1fRVZFTlRTX1AKK3NpbV9ldmVudCAqCitzaW1fZXZlbnRzX3NjaGVkdWxlX3Z0cmFjZWYgKFNJTV9ERVNDIHNkLAorCQkJICAgICBzaWduZWQ2NCBkZWx0YV90aW1lLAorCQkJICAgICBzaW1fZXZlbnRfaGFuZGxlciAqaGFuZGxlciwKKwkJCSAgICAgdm9pZCAqZGF0YSwKKwkJCSAgICAgY29uc3QgY2hhciAqZm10LAorCQkJICAgICB2YV9saXN0IGFwKQoreworICBzaW1fZXZlbnQgKm5ld19ldmVudCA9IHNpbV9ldmVudHNfemFsbG9jIChzZCk7CisgIG5ld19ldmVudC0+ZGF0YSA9IGRhdGE7CisgIG5ld19ldmVudC0+aGFuZGxlciA9IGhhbmRsZXI7CisgIG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF90aW1lcjsKKyAgaWYgKGZtdCA9PSBOVUxMIHx8ICFFVFJBQ0VfUCB8fCB2YXNwcmludGYgKCZuZXdfZXZlbnQtPnRyYWNlLCBmbXQsIGFwKSA8IDApCisgICAgbmV3X2V2ZW50LT50cmFjZSA9IE5VTEw7CisgIGluc2VydF9zaW1fZXZlbnQoc2QsIG5ld19ldmVudCwgZGVsdGFfdGltZSk7CisgIEVUUkFDRSgoX0VUUkFDRSwKKwkgICJldmVudCBzY2hlZHVsZWQgYXQgJWxkIC0gdGFnIDB4JWx4IC0gdGltZSAlbGQsIGhhbmRsZXIgMHglbHgsIGRhdGEgMHglbHglcyVzXG4iLAorCSAgKGxvbmcpc2ltX2V2ZW50c190aW1lKHNkKSwKKwkgIChsb25nKW5ld19ldmVudCwKKwkgIChsb25nKW5ld19ldmVudC0+dGltZV9vZl9ldmVudCwKKwkgIChsb25nKW5ld19ldmVudC0+aGFuZGxlciwKKwkgIChsb25nKW5ld19ldmVudC0+ZGF0YSwKKwkgIChuZXdfZXZlbnQtPnRyYWNlICE9IE5VTEwpID8gIiwgIiA6ICIiLAorCSAgKG5ld19ldmVudC0+dHJhY2UgIT0gTlVMTCkgPyBuZXdfZXZlbnQtPnRyYWNlIDogIiIpKTsKKyAgcmV0dXJuIG5ld19ldmVudDsKK30KKyNlbmRpZgorCisKKyNpZiBFWFRFUk5fU0lNX0VWRU5UU19QCit2b2lkCitzaW1fZXZlbnRzX3NjaGVkdWxlX2FmdGVyX3NpZ25hbCAoU0lNX0RFU0Mgc2QsCisJCQkJICBzaWduZWQ2NCBkZWx0YV90aW1lLAorCQkJCSAgc2ltX2V2ZW50X2hhbmRsZXIgKmhhbmRsZXIsCisJCQkJICB2b2lkICpkYXRhKQoreworICBzaW1fZXZlbnRzICpldmVudHMgPSBTVEFURV9FVkVOVFMgKHNkKTsKKyAgc2ltX2V2ZW50ICpuZXdfZXZlbnQ7CisjaWYgZGVmaW5lZCAoSEFWRV9TSUdQUk9DTUFTSykgJiYgZGVmaW5lZCAoU0lHX1NFVE1BU0spCisgIC8qLUxPQ0stKi8KKyAgc2lnc2V0X3Qgb2xkX21hc2s7CisgIHNpZ3NldF90IG5ld19tYXNrOworICBzaWdmaWxsc2V0KCZuZXdfbWFzayk7CisgIHNpZ3Byb2NtYXNrIChTSUdfU0VUTUFTSywgJm5ld19tYXNrLCAmb2xkX21hc2spOworI2VuZGlmCisgIAorICAvKiBhbGxvY2F0ZSBhbiBldmVudCBlbnRyeSBmcm9tIHRoZSBzaWduYWwgYnVmZmVyICovCisgIG5ld19ldmVudCA9ICZldmVudHMtPmhlbGQgW2V2ZW50cy0+bnJfaGVsZF07CisgIGV2ZW50cy0+bnJfaGVsZCArKzsKKyAgaWYgKGV2ZW50cy0+bnJfaGVsZCA+IE1BWF9OUl9TSUdOQUxfU0lNX0VWRU5UUykKKyAgICB7CisgICAgICBzaW1fZW5naW5lX2Fib3J0IChOVUxMLCBOVUxMLCBOVUxMX0NJQSwKKwkJCSJzaW1fZXZlbnRzX3NjaGVkdWxlX2FmdGVyX3NpZ25hbCAtIGJ1ZmZlciBvdmVmbG93Iik7CisgICAgfQorICAKKyAgbmV3X2V2ZW50LT5kYXRhID0gZGF0YTsKKyAgbmV3X2V2ZW50LT5oYW5kbGVyID0gaGFuZGxlcjsKKyAgbmV3X2V2ZW50LT50aW1lX29mX2V2ZW50ID0gZGVsdGFfdGltZTsgLyogd29yayBpdCBvdXQgbGF0ZXIgKi8KKyAgbmV3X2V2ZW50LT5uZXh0ID0gTlVMTDsKKworICBldmVudHMtPndvcmtfcGVuZGluZyA9IDE7IC8qIG5vdGlmeSBtYWluIHByb2Nlc3MgKi8KKworI2lmIGRlZmluZWQgKEhBVkVfU0lHUFJPQ01BU0spICYmIGRlZmluZWQgKFNJR19TRVRNQVNLKQorICAvKi1VTkxPQ0stKi8KKyAgc2lncHJvY21hc2sgKFNJR19TRVRNQVNLLCAmb2xkX21hc2ssIE5VTEwpOworI2VuZGlmCisgIAorICBFVFJBQ0UgKChfRVRSQUNFLAorCSAgICJzaWduYWwgc2NoZWR1bGVkIGF0ICVsZCAtIHRhZyAweCVseCAtIHRpbWUgJWxkLCBoYW5kbGVyIDB4JWx4LCBkYXRhIDB4JWx4XG4iLAorCSAgIChsb25nKXNpbV9ldmVudHNfdGltZShzZCksCisJICAgKGxvbmcpbmV3X2V2ZW50LAorCSAgIChsb25nKW5ld19ldmVudC0+dGltZV9vZl9ldmVudCwKKwkgICAobG9uZyluZXdfZXZlbnQtPmhhbmRsZXIsCisJICAgKGxvbmcpbmV3X2V2ZW50LT5kYXRhKSk7Cit9CisjZW5kaWYKKworCisjaWYgRVhURVJOX1NJTV9FVkVOVFNfUAorc2ltX2V2ZW50ICoKK3NpbV9ldmVudHNfd2F0Y2hfY2xvY2sgKFNJTV9ERVNDIHNkLAorCQkJdW5zaWduZWQgZGVsdGFfbXNfdGltZSwKKwkJCXNpbV9ldmVudF9oYW5kbGVyICpoYW5kbGVyLAorCQkJdm9pZCAqZGF0YSkKK3sKKyAgc2ltX2V2ZW50cyAqZXZlbnRzID0gU1RBVEVfRVZFTlRTIChzZCk7CisgIHNpbV9ldmVudCAqbmV3X2V2ZW50ID0gc2ltX2V2ZW50c196YWxsb2MgKHNkKTsKKyAgLyogdHlwZSAqLworICBuZXdfZXZlbnQtPndhdGNoaW5nID0gd2F0Y2hfY2xvY2s7CisgIC8qIGhhbmRsZXIgKi8KKyAgbmV3X2V2ZW50LT5kYXRhID0gZGF0YTsKKyAgbmV3X2V2ZW50LT5oYW5kbGVyID0gaGFuZGxlcjsKKyAgLyogZGF0YSAqLworICBpZiAoZXZlbnRzLT5yZXN1bWVfd2FsbGNsb2NrID09IDApCisgICAgbmV3X2V2ZW50LT53YWxsY2xvY2sgPSAoZXZlbnRzLT5lbGFwc2VkX3dhbGxjbG9jayArIGRlbHRhX21zX3RpbWUpOworICBlbHNlCisgICAgbmV3X2V2ZW50LT53YWxsY2xvY2sgPSAoZXZlbnRzLT5lbGFwc2VkX3dhbGxjbG9jaworCQkJICAgICsgc2ltX2VsYXBzZWRfdGltZV9zaW5jZSAoZXZlbnRzLT5yZXN1bWVfd2FsbGNsb2NrKQorCQkJICAgICsgZGVsdGFfbXNfdGltZSk7CisgIC8qIGluc2VydCAqLworICBuZXdfZXZlbnQtPm5leHQgPSBldmVudHMtPndhdGNocG9pbnRzOworICBldmVudHMtPndhdGNocG9pbnRzID0gbmV3X2V2ZW50OworICBldmVudHMtPndvcmtfcGVuZGluZyA9IDE7CisgIEVUUkFDRSAoKF9FVFJBQ0UsCisJICAiZXZlbnQgd2F0Y2hpbmcgY2xvY2sgYXQgJWxkIC0gdGFnIDB4JWx4IC0gd2FsbGNsb2NrICVsZCwgaGFuZGxlciAweCVseCwgZGF0YSAweCVseFxuIiwKKwkgICAobG9uZylzaW1fZXZlbnRzX3RpbWUgKHNkKSwKKwkgICAobG9uZyluZXdfZXZlbnQsCisJICAgKGxvbmcpbmV3X2V2ZW50LT53YWxsY2xvY2ssCisJICAgKGxvbmcpbmV3X2V2ZW50LT5oYW5kbGVyLAorCSAgIChsb25nKW5ld19ldmVudC0+ZGF0YSkpOworICByZXR1cm4gbmV3X2V2ZW50OworfQorI2VuZGlmCisKKworI2lmIEVYVEVSTl9TSU1fRVZFTlRTX1AKK3NpbV9ldmVudCAqCitzaW1fZXZlbnRzX3dhdGNoX3NpbSAoU0lNX0RFU0Mgc2QsCisJCSAgICAgIHZvaWQgKmhvc3RfYWRkciwKKwkJICAgICAgaW50IG5yX2J5dGVzLAorCQkgICAgICBpbnQgYnl0ZV9vcmRlciwKKwkJICAgICAgaW50IGlzX3dpdGhpbiwKKwkJICAgICAgdW5zaWduZWQ2NCBsYiwKKwkJICAgICAgdW5zaWduZWQ2NCB1YiwKKwkJICAgICAgc2ltX2V2ZW50X2hhbmRsZXIgKmhhbmRsZXIsCisJCSAgICAgIHZvaWQgKmRhdGEpCit7CisgIHNpbV9ldmVudHMgKmV2ZW50cyA9IFNUQVRFX0VWRU5UUyAoc2QpOworICBzaW1fZXZlbnQgKm5ld19ldmVudCA9IHNpbV9ldmVudHNfemFsbG9jIChzZCk7CisgIC8qIHR5cGUgKi8KKyAgc3dpdGNoIChieXRlX29yZGVyKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBzd2l0Y2ggKG5yX2J5dGVzKQorCXsKKwljYXNlIDE6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9zaW1faG9zdF8xOyBicmVhazsKKwljYXNlIDI6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9zaW1faG9zdF8yOyBicmVhazsKKwljYXNlIDQ6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9zaW1faG9zdF80OyBicmVhazsKKwljYXNlIDg6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9zaW1faG9zdF84OyBicmVhazsKKwlkZWZhdWx0OiBzaW1faW9fZXJyb3IgKHNkLCAic2ltX2V2ZW50c193YXRjaF9zaW0gLSBpbnZhbGlkIG5yIGJ5dGVzIik7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBCSUdfRU5ESUFOOgorICAgICAgc3dpdGNoIChucl9ieXRlcykKKwl7CisJY2FzZSAxOiBuZXdfZXZlbnQtPndhdGNoaW5nID0gd2F0Y2hfc2ltX2JlXzE7IGJyZWFrOworCWNhc2UgMjogbmV3X2V2ZW50LT53YXRjaGluZyA9IHdhdGNoX3NpbV9iZV8yOyBicmVhazsKKwljYXNlIDQ6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9zaW1fYmVfNDsgYnJlYWs7CisJY2FzZSA4OiBuZXdfZXZlbnQtPndhdGNoaW5nID0gd2F0Y2hfc2ltX2JlXzg7IGJyZWFrOworCWRlZmF1bHQ6IHNpbV9pb19lcnJvciAoc2QsICJzaW1fZXZlbnRzX3dhdGNoX3NpbSAtIGludmFsaWQgbnIgYnl0ZXMiKTsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIExJVFRMRV9FTkRJQU46CisgICAgICBzd2l0Y2ggKG5yX2J5dGVzKQorCXsKKwljYXNlIDE6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9zaW1fbGVfMTsgYnJlYWs7CisJY2FzZSAyOiBuZXdfZXZlbnQtPndhdGNoaW5nID0gd2F0Y2hfc2ltX2xlXzI7IGJyZWFrOworCWNhc2UgNDogbmV3X2V2ZW50LT53YXRjaGluZyA9IHdhdGNoX3NpbV9sZV80OyBicmVhazsKKwljYXNlIDg6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9zaW1fbGVfODsgYnJlYWs7CisJZGVmYXVsdDogc2ltX2lvX2Vycm9yIChzZCwgInNpbV9ldmVudHNfd2F0Y2hfc2ltIC0gaW52YWxpZCBuciBieXRlcyIpOworCX0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzaW1faW9fZXJyb3IgKHNkLCAic2ltX2V2ZW50c193YXRjaF9zaW0gLSBpbnZhbGlkIGJ5dGUgb3JkZXIiKTsKKyAgICB9CisgIC8qIGhhbmRsZXIgKi8KKyAgbmV3X2V2ZW50LT5kYXRhID0gZGF0YTsKKyAgbmV3X2V2ZW50LT5oYW5kbGVyID0gaGFuZGxlcjsKKyAgLyogZGF0YSAqLworICBuZXdfZXZlbnQtPmhvc3RfYWRkciA9IGhvc3RfYWRkcjsKKyAgbmV3X2V2ZW50LT5sYiA9IGxiOworICBuZXdfZXZlbnQtPmxiNjQgPSBsYjsKKyAgbmV3X2V2ZW50LT51YiA9IHViOworICBuZXdfZXZlbnQtPnViNjQgPSB1YjsKKyAgbmV3X2V2ZW50LT5pc193aXRoaW4gPSAoaXNfd2l0aGluICE9IDApOworICAvKiBpbnNlcnQgKi8KKyAgbmV3X2V2ZW50LT5uZXh0ID0gZXZlbnRzLT53YXRjaHBvaW50czsKKyAgZXZlbnRzLT53YXRjaHBvaW50cyA9IG5ld19ldmVudDsKKyAgZXZlbnRzLT53b3JrX3BlbmRpbmcgPSAxOworICBFVFJBQ0UgKChfRVRSQUNFLAorCSAgICJldmVudCB3YXRjaGluZyBob3N0IGF0ICVsZCAtIHRhZyAweCVseCAtIGhvc3QtYWRkciAweCVseCwgMHglbHguLjB4JWx4LCBoYW5kbGVyIDB4JWx4LCBkYXRhIDB4JWx4XG4iLAorCSAgIChsb25nKXNpbV9ldmVudHNfdGltZSAoc2QpLAorCSAgIChsb25nKW5ld19ldmVudCwKKwkgICAobG9uZyluZXdfZXZlbnQtPmhvc3RfYWRkciwKKwkgICAobG9uZyluZXdfZXZlbnQtPmxiLAorCSAgIChsb25nKW5ld19ldmVudC0+dWIsCisJICAgKGxvbmcpbmV3X2V2ZW50LT5oYW5kbGVyLAorCSAgIChsb25nKW5ld19ldmVudC0+ZGF0YSkpOworICByZXR1cm4gbmV3X2V2ZW50OworfQorI2VuZGlmCisKKworI2lmIEVYVEVSTl9TSU1fRVZFTlRTX1AKK3NpbV9ldmVudCAqCitzaW1fZXZlbnRzX3dhdGNoX2NvcmUgKFNJTV9ERVNDIHNkLAorCQkgICAgICAgYWRkcmVzc193b3JkIGNvcmVfYWRkciwKKwkJICAgICAgIHVuc2lnbmVkIGNvcmVfbWFwLAorCQkgICAgICAgaW50IG5yX2J5dGVzLAorCQkgICAgICAgaW50IGJ5dGVfb3JkZXIsCisJCSAgICAgICBpbnQgaXNfd2l0aGluLAorCQkgICAgICAgdW5zaWduZWQ2NCBsYiwKKwkJICAgICAgIHVuc2lnbmVkNjQgdWIsCisJCSAgICAgICBzaW1fZXZlbnRfaGFuZGxlciAqaGFuZGxlciwKKwkJICAgICAgIHZvaWQgKmRhdGEpCit7CisgIHNpbV9ldmVudHMgKmV2ZW50cyA9IFNUQVRFX0VWRU5UUyAoc2QpOworICBzaW1fZXZlbnQgKm5ld19ldmVudCA9IHNpbV9ldmVudHNfemFsbG9jIChzZCk7CisgIC8qIHR5cGUgKi8KKyAgc3dpdGNoIChieXRlX29yZGVyKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBzd2l0Y2ggKG5yX2J5dGVzKQorCXsKKwljYXNlIDE6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9jb3JlX3RhcmdfMTsgYnJlYWs7CisJY2FzZSAyOiBuZXdfZXZlbnQtPndhdGNoaW5nID0gd2F0Y2hfY29yZV90YXJnXzI7IGJyZWFrOworCWNhc2UgNDogbmV3X2V2ZW50LT53YXRjaGluZyA9IHdhdGNoX2NvcmVfdGFyZ180OyBicmVhazsKKwljYXNlIDg6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9jb3JlX3RhcmdfODsgYnJlYWs7CisJZGVmYXVsdDogc2ltX2lvX2Vycm9yIChzZCwgInNpbV9ldmVudHNfd2F0Y2hfY29yZSAtIGludmFsaWQgbnIgYnl0ZXMiKTsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIEJJR19FTkRJQU46CisgICAgICBzd2l0Y2ggKG5yX2J5dGVzKQorCXsKKwljYXNlIDE6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9jb3JlX2JlXzE7IGJyZWFrOworCWNhc2UgMjogbmV3X2V2ZW50LT53YXRjaGluZyA9IHdhdGNoX2NvcmVfYmVfMjsgYnJlYWs7CisJY2FzZSA0OiBuZXdfZXZlbnQtPndhdGNoaW5nID0gd2F0Y2hfY29yZV9iZV80OyBicmVhazsKKwljYXNlIDg6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9jb3JlX2JlXzg7IGJyZWFrOworCWRlZmF1bHQ6IHNpbV9pb19lcnJvciAoc2QsICJzaW1fZXZlbnRzX3dhdGNoX2NvcmUgLSBpbnZhbGlkIG5yIGJ5dGVzIik7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBMSVRUTEVfRU5ESUFOOgorICAgICAgc3dpdGNoIChucl9ieXRlcykKKwl7CisJY2FzZSAxOiBuZXdfZXZlbnQtPndhdGNoaW5nID0gd2F0Y2hfY29yZV9sZV8xOyBicmVhazsKKwljYXNlIDI6IG5ld19ldmVudC0+d2F0Y2hpbmcgPSB3YXRjaF9jb3JlX2xlXzI7IGJyZWFrOworCWNhc2UgNDogbmV3X2V2ZW50LT53YXRjaGluZyA9IHdhdGNoX2NvcmVfbGVfNDsgYnJlYWs7CisJY2FzZSA4OiBuZXdfZXZlbnQtPndhdGNoaW5nID0gd2F0Y2hfY29yZV9sZV84OyBicmVhazsKKwlkZWZhdWx0OiBzaW1faW9fZXJyb3IgKHNkLCAic2ltX2V2ZW50c193YXRjaF9jb3JlIC0gaW52YWxpZCBuciBieXRlcyIpOworCX0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzaW1faW9fZXJyb3IgKHNkLCAic2ltX2V2ZW50c193YXRjaF9jb3JlIC0gaW52YWxpZCBieXRlIG9yZGVyIik7CisgICAgfQorICAvKiBoYW5kbGVyICovCisgIG5ld19ldmVudC0+ZGF0YSA9IGRhdGE7CisgIG5ld19ldmVudC0+aGFuZGxlciA9IGhhbmRsZXI7CisgIC8qIGRhdGEgKi8KKyAgbmV3X2V2ZW50LT5jb3JlX2FkZHIgPSBjb3JlX2FkZHI7CisgIG5ld19ldmVudC0+Y29yZV9tYXAgPSBjb3JlX21hcDsKKyAgbmV3X2V2ZW50LT5sYiA9IGxiOworICBuZXdfZXZlbnQtPmxiNjQgPSBsYjsKKyAgbmV3X2V2ZW50LT51YiA9IHViOworICBuZXdfZXZlbnQtPnViNjQgPSB1YjsKKyAgbmV3X2V2ZW50LT5pc193aXRoaW4gPSAoaXNfd2l0aGluICE9IDApOworICAvKiBpbnNlcnQgKi8KKyAgbmV3X2V2ZW50LT5uZXh0ID0gZXZlbnRzLT53YXRjaHBvaW50czsKKyAgZXZlbnRzLT53YXRjaHBvaW50cyA9IG5ld19ldmVudDsKKyAgZXZlbnRzLT53b3JrX3BlbmRpbmcgPSAxOworICBFVFJBQ0UgKChfRVRSQUNFLAorCSAgICJldmVudCB3YXRjaGluZyBob3N0IGF0ICVsZCAtIHRhZyAweCVseCAtIGhvc3QtYWRkciAweCVseCwgMHglbHguLjB4JWx4LCBoYW5kbGVyIDB4JWx4LCBkYXRhIDB4JWx4XG4iLAorCSAgIChsb25nKXNpbV9ldmVudHNfdGltZSAoc2QpLAorCSAgIChsb25nKW5ld19ldmVudCwKKwkgICAobG9uZyluZXdfZXZlbnQtPmhvc3RfYWRkciwKKwkgICAobG9uZyluZXdfZXZlbnQtPmxiLAorCSAgIChsb25nKW5ld19ldmVudC0+dWIsCisJICAgKGxvbmcpbmV3X2V2ZW50LT5oYW5kbGVyLAorCSAgIChsb25nKW5ld19ldmVudC0+ZGF0YSkpOworICByZXR1cm4gbmV3X2V2ZW50OworfQorI2VuZGlmCisKKworI2lmIEVYVEVSTl9TSU1fRVZFTlRTX1AKK3ZvaWQKK3NpbV9ldmVudHNfZGVzY2hlZHVsZSAoU0lNX0RFU0Mgc2QsCisJCSAgICAgICBzaW1fZXZlbnQgKmV2ZW50X3RvX3JlbW92ZSkKK3sKKyAgc2ltX2V2ZW50cyAqZXZlbnRzID0gU1RBVEVfRVZFTlRTIChzZCk7CisgIHNpbV9ldmVudCAqdG9fcmVtb3ZlID0gKHNpbV9ldmVudCopZXZlbnRfdG9fcmVtb3ZlOworICBpZiAoZXZlbnRfdG9fcmVtb3ZlICE9IE5VTEwpCisgICAgeworICAgICAgc2ltX2V2ZW50ICoqcXVldWUgPSBOVUxMOworICAgICAgd2hpbGUgKChxdWV1ZSA9IG5leHRfZXZlbnRfcXVldWUgKHNkLCBxdWV1ZSkpICE9IE5VTEwpCisJeworCSAgc2ltX2V2ZW50ICoqcHRyX3RvX2N1cnJlbnQ7CisJICBmb3IgKHB0cl90b19jdXJyZW50ID0gcXVldWU7CisJICAgICAgICpwdHJfdG9fY3VycmVudCAhPSBOVUxMICYmICpwdHJfdG9fY3VycmVudCAhPSB0b19yZW1vdmU7CisJICAgICAgIHB0cl90b19jdXJyZW50ID0gJigqcHRyX3RvX2N1cnJlbnQpLT5uZXh0KTsKKwkgIGlmICgqcHRyX3RvX2N1cnJlbnQgPT0gdG9fcmVtb3ZlKQorCSAgICB7CisJICAgICAgc2ltX2V2ZW50ICpkZWFkID0gKnB0cl90b19jdXJyZW50OworCSAgICAgICpwdHJfdG9fY3VycmVudCA9IGRlYWQtPm5leHQ7CisJICAgICAgRVRSQUNFICgoX0VUUkFDRSwKKwkJICAgICAgICJldmVudC93YXRjaCBkZXNjaGVkdWxlZCBhdCAlbGQgLSB0YWcgMHglbHggLSB0aW1lICVsZCwgaGFuZGxlciAweCVseCwgZGF0YSAweCVseCVzJXNcbiIsCisJCSAgICAgICAobG9uZykgc2ltX2V2ZW50c190aW1lIChzZCksCisJCSAgICAgICAobG9uZykgZXZlbnRfdG9fcmVtb3ZlLAorCQkgICAgICAgKGxvbmcpIGRlYWQtPnRpbWVfb2ZfZXZlbnQsCisJCSAgICAgICAobG9uZykgZGVhZC0+aGFuZGxlciwKKwkJICAgICAgIChsb25nKSBkZWFkLT5kYXRhLAorCQkgICAgICAgKGRlYWQtPnRyYWNlICE9IE5VTEwpID8gIiwgIiA6ICIiLAorCQkgICAgICAgKGRlYWQtPnRyYWNlICE9IE5VTEwpID8gZGVhZC0+dHJhY2UgOiAiIikpOworCSAgICAgIHNpbV9ldmVudHNfZnJlZSAoc2QsIGRlYWQpOworCSAgICAgIHVwZGF0ZV90aW1lX2Zyb21fZXZlbnQgKHNkKTsKKwkgICAgICBTSU1fQVNTRVJUICgoZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQgPj0gMCkgPT0gKGV2ZW50cy0+cXVldWUgIT0gTlVMTCkpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0KKyAgICB9CisgIEVUUkFDRSAoKF9FVFJBQ0UsCisJICAgImV2ZW50L3dhdGNoIGRlc2NoZWR1bGVkIGF0ICVsZCAtIHRhZyAweCVseCAtIG5vdCBmb3VuZFxuIiwKKwkgICAobG9uZykgc2ltX2V2ZW50c190aW1lIChzZCksCisJICAgKGxvbmcpIGV2ZW50X3RvX3JlbW92ZSkpOworfQorI2VuZGlmCisKKworU1RBVElDX0lOTElORV9TSU1fRVZFTlRTXAorKGludCkKK3NpbV93YXRjaF92YWxpZCAoU0lNX0RFU0Mgc2QsCisJCSBzaW1fZXZlbnQgKnRvX2RvKQoreworICBzd2l0Y2ggKHRvX2RvLT53YXRjaGluZykKKyAgICB7CisKKyNkZWZpbmUgV0FUQ0hfQ09SRShOLE9QLEVYVCkgXAorICAgICAgaW50IG9rOyBcCisgICAgICB1bnNpZ25lZF8jI04gd29yZCA9IDA7IFwKKyAgICAgIGludCBucl9yZWFkID0gc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLCBOVUxMLCB0b19kby0+Y29yZV9tYXAsICZ3b3JkLCBcCisJCQkJCSAgdG9fZG8tPmNvcmVfYWRkciwgc2l6ZW9mICh3b3JkKSk7IFwKKyAgICAgIE9QICh3b3JkKTsgXAorICAgICAgb2sgPSAobnJfcmVhZCA9PSBzaXplb2YgKHVuc2lnbmVkXyMjTikgXAorCSAgICAmJiAodG9fZG8tPmlzX3dpdGhpbiBcCisJCT09ICh3b3JkID49IHRvX2RvLT5sYiMjRVhUIFwKKwkJICAgICYmIHdvcmQgPD0gdG9fZG8tPnViIyNFWFQpKSk7CisKKyAgICBjYXNlIHdhdGNoX2NvcmVfdGFyZ18xOgorICAgICAgeworCVdBVENIX0NPUkUgKDEsIFQySCwpOworCXJldHVybiBvazsKKyAgICAgIH0KKyAgICBjYXNlIHdhdGNoX2NvcmVfdGFyZ18yOgorICAgICAgeworICAgICAgICBXQVRDSF9DT1JFICgyLCBUMkgsKTsKKwlyZXR1cm4gb2s7CisgICAgICB9CisgICAgY2FzZSB3YXRjaF9jb3JlX3RhcmdfNDoKKyAgICAgIHsKKyAgICAgICAgV0FUQ0hfQ09SRSAoNCwgVDJILCk7CisJcmV0dXJuIG9rOworICAgICAgfQorICAgIGNhc2Ugd2F0Y2hfY29yZV90YXJnXzg6CisgICAgICB7CisgICAgICAgIFdBVENIX0NPUkUgKDgsIFQySCw2NCk7CisJcmV0dXJuIG9rOworICAgICAgfQorCisgICAgY2FzZSB3YXRjaF9jb3JlX2JlXzE6CisgICAgICB7CisgICAgICAgIFdBVENIX0NPUkUgKDEsIEJFMkgsKTsKKwlyZXR1cm4gb2s7CisgICAgICB9CisgICAgY2FzZSB3YXRjaF9jb3JlX2JlXzI6CisgICAgICB7CisgICAgICAgIFdBVENIX0NPUkUgKDIsIEJFMkgsKTsKKwlyZXR1cm4gb2s7CisgICAgICB9CisgICAgY2FzZSB3YXRjaF9jb3JlX2JlXzQ6CisgICAgICB7CisgICAgICAgIFdBVENIX0NPUkUgKDQsIEJFMkgsKTsKKwlyZXR1cm4gb2s7CisgICAgICB9CisgICAgY2FzZSB3YXRjaF9jb3JlX2JlXzg6CisgICAgICB7CisgICAgICAgIFdBVENIX0NPUkUgKDgsIEJFMkgsNjQpOworCXJldHVybiBvazsKKyAgICAgIH0KKworICAgIGNhc2Ugd2F0Y2hfY29yZV9sZV8xOgorICAgICAgeworICAgICAgICBXQVRDSF9DT1JFICgxLCBMRTJILCk7CisJcmV0dXJuIG9rOworICAgICAgfQorICAgIGNhc2Ugd2F0Y2hfY29yZV9sZV8yOgorICAgICAgeworICAgICAgICBXQVRDSF9DT1JFICgyLCBMRTJILCk7CisJcmV0dXJuIG9rOworICAgICAgfQorICAgIGNhc2Ugd2F0Y2hfY29yZV9sZV80OgorICAgICAgeworICAgICAgICBXQVRDSF9DT1JFICg0LCBMRTJILCk7CisJcmV0dXJuIG9rOworICAgICAgfQorICAgIGNhc2Ugd2F0Y2hfY29yZV9sZV84OgorICAgICAgeworICAgICAgICBXQVRDSF9DT1JFICg4LCBMRTJILDY0KTsKKwlyZXR1cm4gb2s7CisgICAgICB9CisjdW5kZWYgV0FUQ0hfQ09SRQorCisjZGVmaW5lIFdBVENIX1NJTShOLE9QLEVYVCkgXAorICAgICAgaW50IG9rOyBcCisgICAgICB1bnNpZ25lZF8jI04gd29yZCA9ICoodW5zaWduZWRfIyNOKil0b19kby0+aG9zdF9hZGRyOyBcCisgICAgICBPUCAod29yZCk7IFwKKyAgICAgIG9rID0gKHRvX2RvLT5pc193aXRoaW4gXAorCSAgICA9PSAod29yZCA+PSB0b19kby0+bGIjI0VYVCBcCisJCSYmIHdvcmQgPD0gdG9fZG8tPnViIyNFWFQpKTsKKworICAgIGNhc2Ugd2F0Y2hfc2ltX2hvc3RfMToKKyAgICAgIHsKKyAgICAgICAgV0FUQ0hfU0lNICgxLCB3b3JkID0gLCk7CisJcmV0dXJuIG9rOworICAgICAgfQorICAgIGNhc2Ugd2F0Y2hfc2ltX2hvc3RfMjoKKyAgICAgIHsKKyAgICAgICAgV0FUQ0hfU0lNICgyLCB3b3JkID0gLCk7CisJcmV0dXJuIG9rOworICAgICAgfQorICAgIGNhc2Ugd2F0Y2hfc2ltX2hvc3RfNDoKKyAgICAgIHsKKyAgICAgICAgV0FUQ0hfU0lNICg0LCB3b3JkID0gLCk7CisJcmV0dXJuIG9rOworICAgICAgfQorICAgIGNhc2Ugd2F0Y2hfc2ltX2hvc3RfODoKKyAgICAgIHsKKyAgICAgICAgV0FUQ0hfU0lNICg4LCB3b3JkID0gLDY0KTsKKwlyZXR1cm4gb2s7CisgICAgICB9CisKKyAgICBjYXNlIHdhdGNoX3NpbV9iZV8xOgorICAgICAgeworICAgICAgICBXQVRDSF9TSU0gKDEsIEJFMkgsKTsKKwlyZXR1cm4gb2s7CisgICAgICB9CisgICAgY2FzZSB3YXRjaF9zaW1fYmVfMjoKKyAgICAgIHsKKyAgICAgICAgV0FUQ0hfU0lNICgyLCBCRTJILCk7CisJcmV0dXJuIG9rOworICAgICAgfQorICAgIGNhc2Ugd2F0Y2hfc2ltX2JlXzQ6CisgICAgICB7CisgICAgICAgIFdBVENIX1NJTSAoNCwgQkUySCwpOworCXJldHVybiBvazsKKyAgICAgIH0KKyAgICBjYXNlIHdhdGNoX3NpbV9iZV84OgorICAgICAgeworICAgICAgICBXQVRDSF9TSU0gKDgsIEJFMkgsNjQpOworCXJldHVybiBvazsKKyAgICAgIH0KKworICAgIGNhc2Ugd2F0Y2hfc2ltX2xlXzE6CisgICAgICB7CisgICAgICAgIFdBVENIX1NJTSAoMSwgTEUySCwpOworCXJldHVybiBvazsKKyAgICAgIH0KKyAgICBjYXNlIHdhdGNoX3NpbV9sZV8yOgorICAgICAgeworICAgICAgICBXQVRDSF9TSU0gKDEsIExFMkgsKTsKKwlyZXR1cm4gb2s7CisgICAgICB9CisgICAgY2FzZSB3YXRjaF9zaW1fbGVfNDoKKyAgICAgIHsKKyAgICAgICAgV0FUQ0hfU0lNICgxLCBMRTJILCk7CisJcmV0dXJuIG9rOworICAgICAgfQorICAgIGNhc2Ugd2F0Y2hfc2ltX2xlXzg6CisgICAgICB7CisgICAgICAgIFdBVENIX1NJTSAoMSwgTEUySCw2NCk7CisJcmV0dXJuIG9rOworICAgICAgfQorI3VuZGVmIFdBVENIX1NJTQorCisgICAgY2FzZSB3YXRjaF9jbG9jazogLyogd2FsbGNsb2NrICovCisgICAgICB7CisJdW5zaWduZWQgbG9uZyBlbGFwc2VkX3RpbWUgPSBzaW1fZXZlbnRzX2VsYXBzZWRfdGltZSAoc2QpOworCXJldHVybiAoZWxhcHNlZF90aW1lID49IHRvX2RvLT53YWxsY2xvY2spOworICAgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHNpbV9pb19lcnJvciAoc2QsICJzaW1fd2F0Y2hfdmFsaWQgLSBiYWQgc3dpdGNoIik7CisgICAgICBicmVhazsKKworICAgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworSU5MSU5FX1NJTV9FVkVOVFNcCisoaW50KQorc2ltX2V2ZW50c190aWNrIChTSU1fREVTQyBzZCkKK3sKKyAgc2ltX2V2ZW50cyAqZXZlbnRzID0gU1RBVEVfRVZFTlRTIChzZCk7CisKKyAgLyogdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHByZXZpb3VzIHRpY2tzIGhhdmUgYmVlbgorICAgICBmdWxseSBwcm9jZXNzZWQgKi8KKworICAvKiBBZHZhbmNlIHRoZSB0aW1lIGJ1dCAqb25seSogaWYgdGhlcmUgaXMgbm90aGluZyB0byBwcm9jZXNzICovCisgIGlmIChldmVudHMtPndvcmtfcGVuZGluZworICAgICAgfHwgZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQgPT0gMCkKKyAgICB7CisgICAgICBldmVudHMtPm5yX3RpY2tzX3RvX3Byb2Nlc3MgKz0gMTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGV2ZW50cy0+dGltZV9mcm9tX2V2ZW50IC09IDE7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKworSU5MSU5FX1NJTV9FVkVOVFNcCisoaW50KQorc2ltX2V2ZW50c190aWNrbiAoU0lNX0RFU0Mgc2QsCisJCSAgaW50IG4pCit7CisgIHNpbV9ldmVudHMgKmV2ZW50cyA9IFNUQVRFX0VWRU5UUyAoc2QpOworICBTSU1fQVNTRVJUIChuID4gMCk7CisKKyAgLyogdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHByZXZpb3VzIHRpY2tzIGhhdmUgYmVlbgorICAgICBmdWxseSBwcm9jZXNzZWQgKi8KKworICAvKiBBZHZhbmNlIHRoZSB0aW1lIGJ1dCAqb25seSogaWYgdGhlcmUgaXMgbm90aGluZyB0byBwcm9jZXNzICovCisgIGlmIChldmVudHMtPndvcmtfcGVuZGluZyB8fCBldmVudHMtPnRpbWVfZnJvbV9ldmVudCA8IG4pCisgICAgeworICAgICAgZXZlbnRzLT5ucl90aWNrc190b19wcm9jZXNzICs9IG47CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBldmVudHMtPnRpbWVfZnJvbV9ldmVudCAtPSBuOworICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisKK0lOTElORV9TSU1fRVZFTlRTXAorKHZvaWQpCitzaW1fZXZlbnRzX3NsaXAgKFNJTV9ERVNDIHNkLAorCQkgaW50IHNsaXApCit7CisgIHNpbV9ldmVudHMgKmV2ZW50cyA9IFNUQVRFX0VWRU5UUyAoc2QpOworICBTSU1fQVNTRVJUIChzbGlwID4gMCk7CisKKyAgLyogRmxhZyBhIHJlYWR5IGV2ZW50IHdpdGggd29ya19wZW5kaW5nIGluc3RlYWQgb2YgbnVtYmVyIG9mIHRpY2tzCisgICAgIHRvIHByb2Nlc3Mgc28gdGhhdCB0aGUgdGltZSBjb250aW51ZXMgdG8gYmUgY29ycmVjdCAqLworICBpZiAoZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQgPCBzbGlwKQorICAgIHsKKyAgICAgIGV2ZW50cy0+d29ya19wZW5kaW5nID0gMTsKKyAgICB9CisgIGV2ZW50cy0+dGltZV9mcm9tX2V2ZW50IC09IHNsaXA7Cit9CisKKworSU5MSU5FX1NJTV9FVkVOVFNcCisodm9pZCkKK3NpbV9ldmVudHNfcHJlcHJvY2VzcyAoU0lNX0RFU0Mgc2QsCisJCSAgICAgICBpbnQgZXZlbnRzX3dlcmVfbGFzdCwKKwkJICAgICAgIGludCBldmVudHNfd2VyZV9uZXh0KQoreworICBzaW1fZXZlbnRzICpldmVudHMgPSBTVEFURV9FVkVOVFMoc2QpOworICBpZiAoZXZlbnRzX3dlcmVfbGFzdCkKKyAgICB7CisgICAgICAvKiBIYWx0ZWQgcGFydCB3YXkgdGhyb3VnaCBldmVudCBwcm9jZXNzaW5nICovCisgICAgICBBU1NFUlQgKGV2ZW50cy0+bnJfdGlja3NfdG9fcHJvY2VzcyAhPSAwKTsKKyAgICAgIC8qIFRoZSBleHRlcm5hbCB3b3JsZCBjYW4ndCB0ZWxsIGlmIHRoZSBldmVudCB0aGF0IHN0b3BwZWQgdGhlCisgICAgICAgICBzaW11bGF0b3Igd2FzIHRoZSBsYXN0IGV2ZW50IHRvIHByb2Nlc3MuICovCisgICAgICBBU1NFUlQgKGV2ZW50c193ZXJlX25leHQpOworICAgICAgc2ltX2V2ZW50c19wcm9jZXNzIChzZCk7CisgICAgfQorICBlbHNlIGlmIChldmVudHNfd2VyZV9uZXh0KQorICAgIHsKKyAgICAgIC8qIEhhbHRlZCBieSB0aGUgbGFzdCBwcm9jZXNzb3IgKi8KKyAgICAgIGlmIChzaW1fZXZlbnRzX3RpY2sgKHNkKSkKKwlzaW1fZXZlbnRzX3Byb2Nlc3MgKHNkKTsKKyAgICB9Cit9CisKKworSU5MSU5FX1NJTV9FVkVOVFNcCisodm9pZCkKK3NpbV9ldmVudHNfcHJvY2VzcyAoU0lNX0RFU0Mgc2QpCit7CisgIHNpbV9ldmVudHMgKmV2ZW50cyA9IFNUQVRFX0VWRU5UUyhzZCk7CisgIHNpZ25lZDY0IGV2ZW50X3RpbWUgPSBzaW1fZXZlbnRzX3RpbWUoc2QpOworCisgIC8qIENsZWFyIHdvcmtfcGVuZGluZyBiZWZvcmUgY2hlY2tpbmcgbnJfaGVsZC4gIENsZWFyaW5nCisgICAgIHdvcmtfcGVuZGluZyBhZnRlciBucl9oZWxkICh3aXRoIG91dCBhIGxvY2sgY291bGQgbG9vc2UgYW4KKyAgICAgZXZlbnQpLiAqLworICBldmVudHMtPndvcmtfcGVuZGluZyA9IDA7CisKKyAgLyogbW92ZSBhbnkgZXZlbnRzIHRoYXQgd2VyZSBhc3luY2hyb25vdXNseSBxdWV1ZWQgYnkgYW55IHNpZ25hbAorICAgICBoYW5kbGVycyBvbnRvIHRoZSByZWFsIGV2ZW50IHF1ZXVlLiAgKi8KKyAgaWYgKGV2ZW50cy0+bnJfaGVsZCA+IDApCisgICAgeworICAgICAgaW50IGk7CisgICAgICAKKyNpZiBkZWZpbmVkKEhBVkVfU0lHUFJPQ01BU0spICYmIGRlZmluZWQoU0lHX1NFVE1BU0spCisgICAgICAvKi1MT0NLLSovCisgICAgICBzaWdzZXRfdCBvbGRfbWFzazsKKyAgICAgIHNpZ3NldF90IG5ld19tYXNrOworICAgICAgc2lnZmlsbHNldCgmbmV3X21hc2spOworICAgICAgc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZuZXdfbWFzaywgJm9sZF9tYXNrKTsKKyNlbmRpZgorCisgICAgICBmb3IgKGkgPSAwOyBpIDwgZXZlbnRzLT5ucl9oZWxkOyBpKyspCisJeworCSAgc2ltX2V2ZW50ICplbnRyeSA9ICZldmVudHMtPmhlbGQgW2ldOworCSAgc2ltX2V2ZW50c19zY2hlZHVsZSAoc2QsCisJCQkgICAgICAgZW50cnktPnRpbWVfb2ZfZXZlbnQsCisJCQkgICAgICAgZW50cnktPmhhbmRsZXIsCisJCQkgICAgICAgZW50cnktPmRhdGEpOworCX0KKyAgICAgIGV2ZW50cy0+bnJfaGVsZCA9IDA7CisgICAgICAKKyNpZiBkZWZpbmVkKEhBVkVfU0lHUFJPQ01BU0spICYmIGRlZmluZWQoU0lHX1NFVE1BU0spCisgICAgICAvKi1VTkxPQ0stKi8KKyAgICAgIHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb2xkX21hc2ssIE5VTEwpOworI2VuZGlmCisgICAgICAKKyAgICB9CisgIAorICAvKiBQcm9jZXNzIGFueSB3YXRjaHBvaW50cy4gQmUgY2FyZWZ1bCB0byBhbGxvdyBhIHdhdGNocG9pbnQgdG8KKyAgICAgYXBwZWFyL2Rpc2FwcGVhciB1bmRlciBvdXIgZmVldC4KKyAgICAgVG8gZW5zdXJlIHRoYXQgd2F0Y2hwb2ludHMgYXJlIHByb2Nlc3NlZCBvbmx5IG9uY2UgcGVyIGN5Y2xlLAorICAgICB0aGV5IGFyZSBtb3ZlZCBvbnRvIGEgd2F0Y2hlZCBxdWV1ZSwgdGhpcyByZXR1cm5lZCB0byB0aGUKKyAgICAgd2F0Y2hwb2ludCBxdWV1ZSB3aGVuIGFsbCBxdWV1ZSBwcm9jZXNzaW5nIGhhcyBiZWVuCisgICAgIGNvbXBsZXRlZC4gKi8KKyAgd2hpbGUgKGV2ZW50cy0+d2F0Y2hwb2ludHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBzaW1fZXZlbnQgKnRvX2RvID0gZXZlbnRzLT53YXRjaHBvaW50czsKKyAgICAgIGV2ZW50cy0+d2F0Y2hwb2ludHMgPSB0b19kby0+bmV4dDsKKyAgICAgIGlmIChzaW1fd2F0Y2hfdmFsaWQgKHNkLCB0b19kbykpCisJeworCSAgc2ltX2V2ZW50X2hhbmRsZXIgKmhhbmRsZXIgPSB0b19kby0+aGFuZGxlcjsKKwkgIHZvaWQgKmRhdGEgPSB0b19kby0+ZGF0YTsKKwkgIEVUUkFDRSgoX0VUUkFDRSwKKwkJICAiZXZlbnQgaXNzdWVkIGF0ICVsZCAtIHRhZyAweCVseCAtIGhhbmRsZXIgMHglbHgsIGRhdGEgMHglbHglcyVzXG4iLAorCQkgIChsb25nKSBldmVudF90aW1lLAorCQkgIChsb25nKSB0b19kbywKKwkJICAobG9uZykgaGFuZGxlciwKKwkJICAobG9uZykgZGF0YSwKKwkJICAodG9fZG8tPnRyYWNlICE9IE5VTEwpID8gIiwgIiA6ICIiLAorCQkgICh0b19kby0+dHJhY2UgIT0gTlVMTCkgPyB0b19kby0+dHJhY2UgOiAiIikpOworCSAgc2ltX2V2ZW50c19mcmVlIChzZCwgdG9fZG8pOworCSAgaGFuZGxlciAoc2QsIGRhdGEpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB0b19kby0+bmV4dCA9IGV2ZW50cy0+d2F0Y2hlZHBvaW50czsKKwkgIGV2ZW50cy0+d2F0Y2hlZHBvaW50cyA9IHRvX2RvOworCX0KKyAgICB9CisgIAorICAvKiBjb25zdW1lIGFsbCBldmVudHMgZm9yIHRoaXMgb3IgZWFybGllciB0aW1lcy4gIEJlIGNhcmVmdWwgdG8KKyAgICAgYWxsb3cgYW4gZXZlbnQgdG8gYXBwZWFyL2Rpc2FwcGVhciB1bmRlciBvdXIgZmVldCAqLworICB3aGlsZSAoZXZlbnRzLT5xdWV1ZS0+dGltZV9vZl9ldmVudCA8CisJIChldmVudF90aW1lICsgZXZlbnRzLT5ucl90aWNrc190b19wcm9jZXNzKSkKKyAgICB7CisgICAgICBzaW1fZXZlbnQgKnRvX2RvID0gZXZlbnRzLT5xdWV1ZTsKKyAgICAgIHNpbV9ldmVudF9oYW5kbGVyICpoYW5kbGVyID0gdG9fZG8tPmhhbmRsZXI7CisgICAgICB2b2lkICpkYXRhID0gdG9fZG8tPmRhdGE7CisgICAgICBldmVudHMtPnF1ZXVlID0gdG9fZG8tPm5leHQ7CisgICAgICB1cGRhdGVfdGltZV9mcm9tX2V2ZW50IChzZCk7CisgICAgICBFVFJBQ0UoKF9FVFJBQ0UsCisJICAgICAgImV2ZW50IGlzc3VlZCBhdCAlbGQgLSB0YWcgMHglbHggLSBoYW5kbGVyIDB4JWx4LCBkYXRhIDB4JWx4JXMlc1xuIiwKKwkgICAgICAobG9uZykgZXZlbnRfdGltZSwKKwkgICAgICAobG9uZykgdG9fZG8sCisJICAgICAgKGxvbmcpIGhhbmRsZXIsCisJICAgICAgKGxvbmcpIGRhdGEsCisJICAgICAgKHRvX2RvLT50cmFjZSAhPSBOVUxMKSA/ICIsICIgOiAiIiwKKwkgICAgICAodG9fZG8tPnRyYWNlICE9IE5VTEwpID8gdG9fZG8tPnRyYWNlIDogIiIpKTsKKyAgICAgIHNpbV9ldmVudHNfZnJlZSAoc2QsIHRvX2RvKTsKKyAgICAgIGhhbmRsZXIgKHNkLCBkYXRhKTsKKyAgICB9CisgIAorICAvKiBwdXQgdGhpbmdzIGJhY2sgd2hlcmUgdGhleSBiZWxvbmcgcmVhZHkgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbiAqLworICBldmVudHMtPndhdGNocG9pbnRzID0gZXZlbnRzLT53YXRjaGVkcG9pbnRzOworICBldmVudHMtPndhdGNoZWRwb2ludHMgPSBOVUxMOworICBpZiAoZXZlbnRzLT53YXRjaHBvaW50cyAhPSBOVUxMKQorICAgIGV2ZW50cy0+d29ya19wZW5kaW5nID0gMTsKKyAgCisgIC8qIGFkdmFuY2UgdGhlIHRpbWUgKi8KKyAgU0lNX0FTU0VSVCAoZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQgPj0gZXZlbnRzLT5ucl90aWNrc190b19wcm9jZXNzKTsKKyAgU0lNX0FTU0VSVCAoZXZlbnRzLT5xdWV1ZSAhPSBOVUxMKTsgLyogYWx3YXlzIHBvbGwgZXZlbnQgKi8KKyAgZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQgLT0gZXZlbnRzLT5ucl90aWNrc190b19wcm9jZXNzOworCisgIC8qIHRoaXMgcm91bmQgb2YgcHJvY2Vzc2luZyBjb21wbGV0ZSAqLworICBldmVudHMtPm5yX3RpY2tzX3RvX3Byb2Nlc3MgPSAwOworCisjaWYgX19DWUdXSU4zMl9fCisgIC8qIE5vdyBjYWxsIHRoZSB1aV9sb29wX2hvb2sgdG8gZ2l2ZSB0aGUgZ3VpIGEgY2hhbmNlIHRvCisgICAgIHByb2Nlc3MgZXZlbnRzLiAqLworICAKKyAgaWYgKHVpX2xvb3BfaG9vayAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIGF0dGVtcHQgdG8gbGltaXQgY2FsbHMgdG8gMS0xMCBwZXIgc2Vjb25kICovCisgICAgICBpZiAoISAodWlfbG9vcF9ob29rX2NvdW50ZXIrKyAmIDB4ZikpCisJKCp1aV9sb29wX2hvb2spICgtMik7IC8qIG1hZ2ljICovCisgICAgfQorI2VuZGlmCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tZXZlbnRzLmggYi9zaW0vY29tbW9uL3NpbS1ldmVudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmFlM2RmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tZXZlbnRzLmgKQEAgLTAsMCArMSwyNzEgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgU0lNX0VWRU5UU19ICisjZGVmaW5lIFNJTV9FVkVOVFNfSAorCisKKy8qIE5vdGVzOgorCisgICBXaGVuIHNjaGVkdWxpbmcgYW4gZXZlbnQsIHRoZSBhIGRlbHRhIG9mIHplcm8vb25lIHJlZmVycyB0byB0aGUKKyAgIHRpbWVsaW5lIGFzIGZvbGxvd3M6CisKKyAgIGVwb2NoICAgMHwxICAgICAgICAgICAgICAxfDIgICAgICAgICAgICAgIDJ8MyAgICAgICAgICAgICAgM3wKKyAgICoqcXVldWUqKnwtLWluc24tLXwqcXVldWUqfC0taW5zbi0tfCpxdWV1ZSp8LS1pbnNuLS18KnF1ZXVlKnwKKyAgICAgfCAgIF4gICAgICAgICAgICAgICBeICAgICAgICB8ICAgICAgIF4gICAgICAgICAgICAgICAgXgorICAgICBgLSArMCAtLS0tLS0tLS0tLS0gKzEgLS0uLiAgIGAtLS0tLSArMCAtLS0tLS0tLS0tLS0tICsxIC0tLi4KKworICAgV2hlbiB0aGUgcXVldWUgaXMgaW5pdGlhbGl6ZWQsIHRoZSB0aW1lIGlzIHNldCB0byB6ZXJvIHdpdGggYQorICAgbnVtYmVyIG9mIGluaXRpYWxpemF0aW9uIGV2ZW50cyBzY2hlZHVsZWQuICBDb25zZXF1ZW50bHksIGFzIGFsc28KKyAgIGlsbHVzdHJhdGVkIGFib3ZlLCB0aGUgZXZlbnQgcXVldWUgc2hvdWxkIGJlIHByb2Nlc3NlZCBiZWZvcmUgdGhlCisgICBmaXJzdCBpbnN0cnVjdGlvbi4gIFRoYXQgaW5zdHJ1Y3Rpb24gYmVpbmcgZXhlY3V0ZWQgZHVyaW5nIHRpY2sgMS4KKworICAgVGhlIHNpbXVsYXRvciBtYWluIGxvb3AgbWF5IHRha2UgYSBmb3JtIHNpbWlsYXIgdG86CisKKyAgICAgICBpZiAoaGFsdC0vcmVzdGFydC1zZXRqbXApCisgICAgICAgICB7CisKKwkgICAuLi4uIC8vIERldGVybWluZSB3aG8gc2hvdWxkIGdvIG5leHQKKwkgICBsYXN0LWNwdS1uciA9IGdldC1sYXN0LWNwdS1uciAoc2QpOworCSAgIG5leHQtY3B1LW5yID0gZ2V0LW5leHQtY3B1LW5yIChzZCk7CisJICAgZXZlbnRzLXdlcmUtbGFzdD8gPSAobGFzdC1jcHUtbnIgPj0gbnItY3B1cyk7CisJICAgZXZlbnRzLXdlcmUtbmV4dD8gPSAobmV4dC1jcHUtbnIgPj0gbnItY3B1cyk7CisKKyAgICAgICAgICAgLi4uLiAvLyBwcm9jZXNzIGFueSBvdXRzdGFuZGluZyBldmVudHMKKyAgICAgICAgICAgc2ltX2V2ZW50c19wcmVwcm9jZXNzIChzZCwgZXZlbnRzLXdlcmUtbGFzdD8sIGV2ZW50cy13ZXJlLW5leHQ/KTsKKwkgICBpZiAoZXZlbnRzLXdlcmUtbmV4dCkKKwkgICAgIG5leHQtY3B1LW5yID0gMDsKKworICAgICAgICAgICAuLi4uIC8vIHByaW1lIG1haW4gbG9vcCAKKworICAgICAgICAgICB3aGlsZSAoMSkKKyAgICAgICAgICAgICB7CisJICAgICAgICAuLi4uIC8vIG1vZGVsIG9uZSBpbnNuIG9mIG5leHQtY3B1LW5yIC4uIG5yLWNwdXMKKyAgICAgICAgICAgICAgICBpZiAoc2ltX2V2ZW50c190aWNrIChzZCkpCisJICAgICAgICAgIHNpbV9ldmVudHNfcHJvY2VzcyAoc2QpOworICAgICAgICAgICAgICAgIG5leHQtY3B1LW5yID0gMAorCSAgICAgfQorICAgICAgICAgfQorCisgICBOQi4gIEluIHRoZSBhYm92ZSBwc2V1ZG8gY29kZSBpdCBpcyBhc3N1bWVkIHRoYXQgYW55IGNwdS1uciA+PQorICAgbnItY3B1cyBpcyBhIG1hcmtlciBmb3IgdGhlIGV2ZW50IHF1ZXVlLiAqLworCisKK3R5cGVkZWYgdm9pZCBzaW1fZXZlbnRfaGFuZGxlcihTSU1fREVTQyBzZCwgdm9pZCAqZGF0YSk7CisKK3R5cGVkZWYgc3RydWN0IF9zaW1fZXZlbnQgc2ltX2V2ZW50OworCit0eXBlZGVmIHN0cnVjdCBfc2ltX2V2ZW50cyBzaW1fZXZlbnRzOworc3RydWN0IF9zaW1fZXZlbnRzIHsKKyAgaW50IG5yX3RpY2tzX3RvX3Byb2Nlc3M7CisgIHNpbV9ldmVudCAqcXVldWU7CisgIHNpbV9ldmVudCAqd2F0Y2hwb2ludHM7CisgIHNpbV9ldmVudCAqd2F0Y2hlZHBvaW50czsKKyAgc2ltX2V2ZW50ICpmcmVlX2xpc3Q7CisgIC8qIGZsYWcgYWRkaXRpb25hbCB3b3JrIG5lZWRlZCAqLworICB2b2xhdGlsZSBpbnQgd29ya19wZW5kaW5nOworICAvKiB0aGUgYXN5bmNocm9ub3VzIGV2ZW50IHF1ZXVlICovCisjaWZuZGVmIE1BWF9OUl9TSUdOQUxfU0lNX0VWRU5UUworI2RlZmluZSBNQVhfTlJfU0lHTkFMX1NJTV9FVkVOVFMgMgorI2VuZGlmCisgIHNpbV9ldmVudCAqaGVsZDsKKyAgdm9sYXRpbGUgaW50IG5yX2hlbGQ7CisgIC8qIHRpbWVrZWVwaW5nICovCisgIHVuc2lnbmVkIGxvbmcgZWxhcHNlZF93YWxsY2xvY2s7CisgIFNJTV9FTEFQU0VEX1RJTUUgcmVzdW1lX3dhbGxjbG9jazsKKyAgc2lnbmVkNjQgdGltZV9vZl9ldmVudDsKKyAgaW50IHRpbWVfZnJvbV9ldmVudDsKKyAgaW50IHRyYWNlOworfTsKKworCisKKy8qIEluc3RhbGwgdGhlICJldmVudHMiIG1vZHVsZS4gICovCisKK2V4dGVybiBTSU1fUkMgc2ltX2V2ZW50c19pbnN0YWxsIChTSU1fREVTQyBzZCk7CisKKworLyogU2NoZWR1bGUgYW4gZXZlbnQgREVMVEFfVElNRSB0aWNrcyBpbnRvIHRoZSBmdXR1cmUgKi8KKworZXh0ZXJuIHNpbV9ldmVudCAqc2ltX2V2ZW50c19zY2hlZHVsZQorKFNJTV9ERVNDIHNkLAorIHNpZ25lZDY0IGRlbHRhX3RpbWUsCisgc2ltX2V2ZW50X2hhbmRsZXIgKmhhbmRsZXIsCisgdm9pZCAqZGF0YSk7CisKK2V4dGVybiBzaW1fZXZlbnQgKnNpbV9ldmVudHNfc2NoZWR1bGVfdHJhY2VmCisoU0lNX0RFU0Mgc2QsCisgc2lnbmVkNjQgZGVsdGFfdGltZSwKKyBzaW1fZXZlbnRfaGFuZGxlciAqaGFuZGxlciwKKyB2b2lkICpkYXRhLAorIGNvbnN0IGNoYXIgKmZtdCwKKyAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgNSwgNikpKTsKKworZXh0ZXJuIHNpbV9ldmVudCAqc2ltX2V2ZW50c19zY2hlZHVsZV92dHJhY2VmCisoU0lNX0RFU0Mgc2QsCisgc2lnbmVkNjQgZGVsdGFfdGltZSwKKyBzaW1fZXZlbnRfaGFuZGxlciAqaGFuZGxlciwKKyB2b2lkICpkYXRhLAorIGNvbnN0IGNoYXIgKmZtdCwKKyB2YV9saXN0IGFwKTsKKworCitleHRlcm4gdm9pZCBzaW1fZXZlbnRzX3NjaGVkdWxlX2FmdGVyX3NpZ25hbAorKFNJTV9ERVNDIHNkLAorIHNpZ25lZDY0IGRlbHRhX3RpbWUsCisgc2ltX2V2ZW50X2hhbmRsZXIgKmhhbmRsZXIsCisgdm9pZCAqZGF0YSk7CisKKy8qIE5COiBzaWduYWwgbGV2ZWwgZXZlbnRzIGNhbid0IGhhdmUgdHJhY2Ugc3RyaW5ncyBhcyBtYWxsb2MgaXNuJ3QKKyAgIGF2YWlsYWJsZSAqLworCisKKworLyogU2NoZWR1bGUgYW4gZXZlbnQgbWlsbGktc2Vjb25kcyBmcm9tIE5PVy4gIFRoZSBleGFjdCBpbnRlcnByZXRhdGlvbgorICAgb2Ygd2FsbGNsb2NrIGlzIGhvc3QgZGVwZW5kYW50LiAqLworCitleHRlcm4gc2ltX2V2ZW50ICpzaW1fZXZlbnRzX3dhdGNoX2Nsb2NrCisoU0lNX0RFU0Mgc2QsCisgdW5zaWduZWQgZGVsdGFfbXNfdGltZSwKKyBzaW1fZXZlbnRfaGFuZGxlciAqaGFuZGxlciwKKyB2b2lkICpkYXRhKTsKKworCisvKiBTY2hlZHVsZSBhbiBldmVudCB3aGVuIHRoZSB0ZXN0IChJU19XSVRISU4gPT0gKFZBTCA+PSBMQiAmJiBWQUwgPD0KKyAgIFVCKSkgb2YgdGhlIE5SX0JZVEVTIHZhbHVlIGF0IEhPU1RfQUREUiB3aXRoIEJZVEVfT1JERVIgZW5kaWFuIGlzCisgICB0cnVlLgorCisgICBIT1NUX0FERFI6IHBvaW50ZXIgaW50byB0aGUgaG9zdCBhZGRyZXNzIHNwYWNlLgorICAgQllURV9PUkRFUjogMCAtIGhvc3QgZW5kaWFuOyBCSUdfRU5ESUFOOyBMSVRUTEVfRU5ESUFOICovCisKK2V4dGVybiBzaW1fZXZlbnQgKnNpbV9ldmVudHNfd2F0Y2hfc2ltCisoU0lNX0RFU0Mgc2QsCisgdm9pZCAqaG9zdF9hZGRyLAorIGludCBucl9ieXRlcywKKyBpbnQgYnl0ZV9vcmRlciwKKyBpbnQgaXNfd2l0aGluLAorIHVuc2lnbmVkNjQgbGIsCisgdW5zaWduZWQ2NCB1YiwKKyBzaW1fZXZlbnRfaGFuZGxlciAqaGFuZGxlciwKKyB2b2lkICpkYXRhKTsKKworCisvKiBTY2hlZHVsZSBhbiBldmVudCB3aGVuIHRoZSB0ZXN0IChJU19XSVRISU4gPT0gKFZBTCA+PSBMQiAmJiBWQUwgPD0KKyAgIFVCKSkgb2YgdGhlIE5SX0JZVEVTIHZhbHVlIGF0IENPUkVfQUREUiBpbiBCWVRFX09SREVSIGVuZGlhbiBpcworICAgdHJ1ZS4KKworICAgQ09SRV9BRERSL01BUDogcG9pbnRlciBpbnRvIHRoZSB0YXJnZXQgYWRkcmVzcyBzcGFjZS4KKyAgIEJZVEVfT1JERVI6IDAgLSBjdXJyZW50IHRhcmdldCBlbmRpYW47IEJJR19FTkRJQU47IExJVFRMRV9FTkRJQU4gKi8KKworZXh0ZXJuIHNpbV9ldmVudCAqc2ltX2V2ZW50c193YXRjaF9jb3JlCisoU0lNX0RFU0Mgc2QsCisgYWRkcmVzc193b3JkIGNvcmVfYWRkciwKKyB1bnNpZ25lZCBtYXAsCisgaW50IG5yX2J5dGVzLAorIGludCBieXRlX29yZGVyLAorIGludCBpc193aXRoaW4sCisgdW5zaWduZWQ2NCBsYiwKKyB1bnNpZ25lZDY0IHViLAorIHNpbV9ldmVudF9oYW5kbGVyICpoYW5kbGVyLAorIHZvaWQgKmRhdGEpOworCisvKiBEZXNjaGVkdWxlIHRoZSBzcGVjaWZpZWQgZXZlbnQgKi8KKworZXh0ZXJuIHZvaWQgc2ltX2V2ZW50c19kZXNjaGVkdWxlCisoU0lNX0RFU0Mgc2QsCisgc2ltX2V2ZW50ICpldmVudF90b19yZW1vdmUpOworCisKKy8qIFByZXBhcmUgZm9yIG1haW4gc2ltdWxhdG9yIGxvb3AuICBFbnN1cmUgdGhhdCB0aGUgbmV4dCB0aGluZyB0byBkbworICAgaXMgbm90IGV2ZW50IHByb2Nlc3NpbmcuCisKKyAgIElmIHRoZSBzaW11bGF0b3IgaGFsdGVkIHBhcnQgd2F5IHRocm91Z2ggZXZlbnQgcHJvY2Vzc2luZyB0aGVuIGJvdGgKKyAgIEVWRU5UU19XRVJFX0xBU1QgYW5kIEVWRU5UU19XRVJFX05FWFQgc2hhbGwgYmUgdHJ1ZS4KKworICAgSWYgdGhlIHNpbXVsYXRvciBoYWx0ZWQgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgbGFzdCBjcHUsIHRoZW4gb25seQorICAgRVZFTlRTX1dFUkVfTkVYVCBzaGFsbCBiZSB0cnVlLiAqLworCitJTkxJTkVfU0lNX0VWRU5UU1wKKyh2b2lkKSBzaW1fZXZlbnRzX3ByZXByb2Nlc3MKKyhTSU1fREVTQyBzZCwKKyBpbnQgZXZlbnRzX3dlcmVfbGFzdCwKKyBpbnQgZXZlbnRzX3dlcmVfbmV4dCk7CisKKworLyogUHJvZ3Jlc3MgdGltZS4KKworICAgU2VwYXJhdGVkIGludG8gdHdvIHBhcnRzIHNvIHRoYXQgdGhlIG1haW4gbG9vcCBjYW4gc2F2ZSBpdHMgY29udGV4dAorICAgYmVmb3JlIHRoZSBldmVudCBxdWV1ZSBpcyBwcm9jZXNzZWQuICBXaGVuIHNpbV9ldmVudHNfdGljayooKQorICAgcmV0dXJucyB0cnVlLCBhbnkgc2ltdWxhdGlvbiBjb250ZXh0IHNob3VsZCBiZSBzYXZlZCBhbmQKKyAgIHNpbV9ldmVudHNfcHJvY2VzcygpIGNhbGxlZC4KKworICAgU0lNX0VWRU5UU19USUNLIGFkdmFuY2VzIHRoZSBjbG9jayBieSAxIGN5Y2xlLgorCisgICBTSU1fRVZFTlRTX1RJQ0tOIGFkdmFuY2VzIHRoZSBjbG9jayBieSBOIGN5Y2xlcyAoMS4uTUFYSU5UKS4gKi8KKworSU5MSU5FX1NJTV9FVkVOVFNcCisoaW50KSBzaW1fZXZlbnRzX3RpY2sKKyhTSU1fREVTQyBzZCk7CisKK0lOTElORV9TSU1fRVZFTlRTXAorKGludCkgc2ltX2V2ZW50c190aWNrbgorKFNJTV9ERVNDIHNkLAorIGludCBuKTsKKworSU5MSU5FX1NJTV9FVkVOVFNcCisodm9pZCkgc2ltX2V2ZW50c19wcm9jZXNzCisoU0lNX0RFU0Mgc2QpOworCisKKy8qIEFkdmFuY2UgdGhlIGNsb2NrIGJ5IGFuIGFkZGl0aW9uYWwgU0xJUCBjeWNsZXMgYXQgdGhlIG5leHQgY2FsbCB0bworICAgc2ltX2V2ZW50c190aWNrKigpLiAgRm9yIG11bHRpcGxlIGNhbGxzLCB0aGUgZWZmZWN0IGlzCisgICBhY2N1bXVsYXRpdmUuICovCisKK0lOTElORV9TSU1fRVZFTlRTXAorKHZvaWQpIHNpbV9ldmVudHNfc2xpcAorKFNJTV9ERVNDIHNkLAorIGludCBzbGlwKTsKKworCisvKiBQcm9ncmVzcyB0aW1lIHN1Y2ggdGhhdCBhbiBldmVudCBzaGFsbCBvY2N1cmUgdXBvbiB0aGUgbmV4dCBjYWxsIHRvCisgICBzaW1fZXZlbnRzIHRpY2sgKi8KKworI2lmIDAKK0lOTElORV9TSU1fRVZFTlRTXAorKHZvaWQpIHNpbV9ldmVudHNfdGltZXdhcnAKKyhTSU1fREVTQyBzZCk7CisjZW5kaWYKKworCisvKiBsb2NhbCBjb25jZXB0IG9mIGVsYXBzZWQgdGFyZ2V0IHRpbWUgKi8KKworSU5MSU5FX1NJTV9FVkVOVFNcCisoc2lnbmVkNjQpIHNpbV9ldmVudHNfdGltZQorKFNJTV9ERVNDIHNkKTsKKworCisvKiBsb2NhbCBjb25jZXB0IG9mIGVsYXBzZWQgaG9zdCB0aW1lIChtaWxsaXNlY29uZHMpICovCisKK0lOTElORV9TSU1fRVZFTlRTXAorKHVuc2lnbmVkIGxvbmcpIHNpbV9ldmVudHNfZWxhcHNlZF90aW1lCisoU0lNX0RFU0Mgc2QpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWZwdS5jIGIvc2ltL2NvbW1vbi9zaW0tZnB1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmNzQ2YQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vc2ltLWZwdS5jCkBAIC0wLDAgKzEsMjU3OCBAQAorLyogVGhpcyBpcyBhIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50IGxpYnJhcnkgd2hpY2ggY2FuIGJlIHVzZWQgaW5zdGVhZAorICAgb2YgdGhlIGZsb2F0aW5nIHBvaW50IHJvdXRpbmVzIGluIGxpYmdjYzEuYyBmb3IgdGFyZ2V0cyB3aXRob3V0CisgICBoYXJkd2FyZSBmbG9hdGluZyBwb2ludC4gICovCisKKy8qIENvcHlyaWdodCAoQykgMTk5NCwxOTk3LTE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Cit1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2xhdGVyIHZlcnNpb24uCisKK0luIGFkZGl0aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzIHlvdSB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBsaW5rIHRoZQorY29tcGlsZWQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgd2l0aCBvdGhlciBwcm9ncmFtcywgYW5kIHRvIGRpc3RyaWJ1dGUKK3Rob3NlIHByb2dyYW1zIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9uIGNvbWluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcworZmlsZS4gIChUaGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByZXN0cmljdGlvbnMgZG8gYXBwbHkgaW4gb3RoZXIKK3Jlc3BlY3RzOyBmb3IgZXhhbXBsZSwgdGhleSBjb3ZlciBtb2RpZmljYXRpb24gb2YgdGhlIGZpbGUsIGFuZAorZGlzdHJpYnV0aW9uIHdoZW4gbm90IGxpbmtlZCBpbnRvIGFub3RoZXIgcHJvZ3JhbS4pCisKK1RoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCisKKy8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIGlmIHlvdSBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIG90aGVyIGZpbGVzLAorICAgc29tZSBvZiB3aGljaCBhcmUgY29tcGlsZWQgd2l0aCBHQ0MsIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwKKyAgIHRoaXMgbGlicmFyeSBkb2VzIG5vdCBieSBpdHNlbGYgY2F1c2UgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlCisgICB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAgIFRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkKKyAgIHRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICAqLworCisvKiBUaGlzIGltcGxlbWVudHMgSUVFRSA3NTQgZm9ybWF0IGFyaXRobWV0aWMsIGJ1dCBkb2VzIG5vdCBwcm92aWRlIGEKKyAgIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGUgcm91bmRpbmcgbW9kZSwgb3IgZm9yIGdlbmVyYXRpbmcgb3IgaGFuZGxpbmcKKyAgIGV4Y2VwdGlvbnMuCisKKyAgIFRoZSBvcmlnaW5hbCBjb2RlIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCBoYWNrZWQgYnkgTWFyayBFaWNoaW4gYW5kIEppbQorICAgV2lsc29uLCBhbGwgb2YgQ3lnbnVzIFN1cHBvcnQuICAqLworCisKKyNpZm5kZWYgU0lNX0ZQVV9DCisjZGVmaW5lIFNJTV9GUFVfQworCisjaW5jbHVkZSAic2ltLWJhc2ljcy5oIgorI2luY2x1ZGUgInNpbS1mcHUuaCIKKworI2luY2x1ZGUgInNpbS1pby5oIgorI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKKworCisvKiBEZWJ1Z2dpbmcgc3VwcG9ydC4gKi8KKworc3RhdGljIHZvaWQKK3ByaW50X2JpdHMgKHVuc2lnbmVkNjQgeCwKKwkgICAgaW50IG1zYml0LAorCSAgICBzaW1fZnB1X3ByaW50X2Z1bmMgcHJpbnQsCisJICAgIHZvaWQgKmFyZykKK3sKKyAgdW5zaWduZWQ2NCBiaXQgPSBMU0JJVDY0IChtc2JpdCk7CisgIGludCBpID0gNDsKKyAgd2hpbGUgKGJpdCkKKyAgICB7CisgICAgICBpZiAoaSA9PSAwKQorCXByaW50IChhcmcsICIsIik7CisgICAgICBpZiAoKHggJiBiaXQpKQorCXByaW50IChhcmcsICIxIik7CisgICAgICBlbHNlCisJcHJpbnQgKGFyZywgIjAiKTsKKyAgICAgIGJpdCA+Pj0gMTsKKyAgICAgIGkgPSAoaSArIDEpICUgNDsKKyAgICB9Cit9CisKKworCisvKiBRdWljayBhbmQgZGlydHkgY29udmVyc2lvbiBiZXR3ZWVuIGEgaG9zdCBkb3VibGUgYW5kIGhvc3QgNjRiaXQgaW50ICovCisKK3R5cGVkZWYgdW5pb24geworICBkb3VibGUgZDsKKyAgdW5zaWduZWQ2NCBpOworfSBzaW1fZnB1X21hcDsgIAorCisKKy8qIEEgcGFja2VkIElFRUUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgorCisgICBGb3JtIGlzIDxTSUdOOjE+PEJJQVNFREVYUDpOUl9FWFBCSVRTPjxGUkFDOk5SX0ZSQUNCSVRTPiBmb3IgYm90aAorICAgMzIgYW5kIDY0IGJpdCBudW1iZXJzLiAgVGhpcyBudW1iZXIgaXMgaW50ZXJwcmV0ZWQgYXM6CisKKyAgIE5vcm1hbGl6ZWQgKDAgPCBCSUFTRURFWFAgJiYgQklBU0VERVhQIDwgRVhQTUFYKToKKyAgIChzaWduID8gJy0nIDogJysnKSAxLjxGUkFDPiB4IDIgXiAoQklBU0VERVhQIC0gRVhQQklBUykKKworICAgRGVub3JtYWxpemVkICgwID09IEJJQVNFREVYUCAmJiBGUkFDICE9IDApOgorICAgKHNpZ24gPyAiLSIgOiAiKyIpIDAuPEZSQUM+IHggMiBeICgtIEVYUEJJQVMpCisKKyAgIFplcm8gKDAgPT0gQklBU0VERVhQICYmIEZSQUMgPT0gMCk6CisgICAoc2lnbiA/ICItIiA6ICIrIikgMC4wCisgICAKKyAgIEluZmluaXR5IChCSUFTRURFWFAgPT0gRVhQTUFYICYmIEZSQUMgPT0gMCk6CisgICAoc2lnbiA/ICItIiA6ICIrIikgImluZmluaXR5IgorCisgICBTaWduYWxpbmdOYU4gKEJJQVNFREVYUCA9PSBFWFBNQVggJiYgRlJBQyA+IDAgJiYgRlJBQyA8IFFVSUVUX05BTik6CisgICBTTmFOLkZSQUMKKworICAgUXVpZXROYU4gKEJJQVNFREVYUCA9PSBFWFBNQVggJiYgRlJBQyA+IDAgJiYgRlJBQyA+IFFVSUVUX05BTik6CisgICBRTmFOLkZSQUMKKworICAgKi8KKworI2RlZmluZSBOUl9FWFBCSVRTICAoaXNfZG91YmxlID8gICAxMSA6ICAgOCkKKyNkZWZpbmUgTlJfRlJBQ0JJVFMgKGlzX2RvdWJsZSA/ICAgNTIgOiAyMykKKyNkZWZpbmUgU0lHTkJJVCAgICAgKGlzX2RvdWJsZSA/IE1TQklUNjQgKDApIDogTVNCSVQ2NCAoMzIpKQorCisjZGVmaW5lIEVYUE1BWDMyICAgICgyNTUpCisjZGVmaW5lIEVYTVBBWDY0ICAgICgyMDQ3KQorI2RlZmluZSBFWFBNQVggICAgICAoKHVuc2lnbmVkKSAoaXNfZG91YmxlID8gRVhNUEFYNjQgOiBFWFBNQVgzMikpCisKKyNkZWZpbmUgRVhQQklBUzMyICAgKDEyNykKKyNkZWZpbmUgRVhQQklBUzY0ICAgKDEwMjMpCisjZGVmaW5lIEVYUEJJQVMgICAgIChpc19kb3VibGUgPyBFWFBCSUFTNjQgOiBFWFBCSUFTMzIpCisKKyNkZWZpbmUgUVVJRVRfTkFOICAgTFNCSVQ2NCAoTlJfRlJBQ0JJVFMgLSAxKQorCisKKworLyogQW4gdW5wYWNrZWQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgorCisgICBXaGVuIHVucGFja2VkLCB0aGUgZnJhY3Rpb24gb2YgYm90aCBhIDMyIGFuZCA2NCBiaXQgZmxvYXRpbmcgcG9pbnQKKyAgIG51bWJlciBpcyBzdG9yZWQgdXNpbmcgdGhlIHNhbWUgZm9ybWF0OgorCisgICA2NCBiaXQgLSA8SU1QTElDSVRfMToxPjxGUkFDQklUUzo1Mj48R1VBUkRTOjg+PFBBRDowMD4KKyAgIDMyIGJpdCAtIDxJTVBMSUNJVF8xOjE+PEZSQUNCSVRTOjIzPjxHVUFSRFM6Nz48UEFEOjMwPiAqLworCisjZGVmaW5lIE5SX1BBRDMyICAgICgzMCkKKyNkZWZpbmUgTlJfUEFENjQgICAgKDApCisjZGVmaW5lIE5SX1BBRCAgICAgIChpc19kb3VibGUgPyBOUl9QQUQ2NCA6IE5SX1BBRDMyKQorI2RlZmluZSBQQURNQVNLICAgICAoaXNfZG91YmxlID8gMCA6IExTTUFTSzY0IChOUl9QQUQzMiAtIDEsIDApKQorCisjZGVmaW5lIE5SX0dVQVJEUzMyICg3ICsgTlJfUEFEMzIpCisjZGVmaW5lIE5SX0dVQVJEUzY0ICg4ICsgTlJfUEFENjQpCisjZGVmaW5lIE5SX0dVQVJEUyAgKGlzX2RvdWJsZSA/IE5SX0dVQVJEUzY0IDogTlJfR1VBUkRTMzIpCisjZGVmaW5lIEdVQVJETUFTSyAgTFNNQVNLNjQgKE5SX0dVQVJEUyAtIDEsIDApCisKKyNkZWZpbmUgR1VBUkRNU0IgICBMU0JJVDY0ICAoTlJfR1VBUkRTIC0gMSkKKyNkZWZpbmUgR1VBUkRMU0IgICBMU0JJVDY0ICAoTlJfUEFEKQorI2RlZmluZSBHVUFSRFJPVU5EIExTTUFTSzY0IChOUl9HVUFSRFMgLSAyLCAwKQorCisjZGVmaW5lIE5SX0ZSQUNfR1VBUkQgICAoNjApCisjZGVmaW5lIElNUExJQ0lUXzEgTFNCSVQ2NCAoTlJfRlJBQ19HVUFSRCkKKyNkZWZpbmUgSU1QTElDSVRfMiBMU0JJVDY0IChOUl9GUkFDX0dVQVJEICsgMSkKKyNkZWZpbmUgSU1QTElDSVRfNCBMU0JJVDY0IChOUl9GUkFDX0dVQVJEICsgMikKKyNkZWZpbmUgTlJfU1BBUkUgMgorCisjZGVmaW5lIEZSQUMzMk1BU0sgTFNNQVNLNjQgKDYzLCBOUl9GUkFDX0dVQVJEIC0gMzIgKyAxKQorCisjZGVmaW5lIE5PUk1BTF9FWFBNSU4gKC0oRVhQQklBUykrMSkKKworI2RlZmluZSBOT1JNQUxfRVhQTUFYMzIgKEVYUEJJQVMzMikKKyNkZWZpbmUgTk9STUFMX0VYUE1BWDY0IChFWFBCSUFTNjQpCisjZGVmaW5lIE5PUk1BTF9FWFBNQVggKEVYUEJJQVMpCisKKworLyogSW50ZWdlciBjb25zdGFudHMgKi8KKworI2RlZmluZSBNQVhfSU5UMzIgICgoc2lnbmVkNjQpIExTTUFTSzY0ICgzMCwgMCkpCisjZGVmaW5lIE1BWF9VSU5UMzIgTFNNQVNLNjQgKDMxLCAwKQorI2RlZmluZSBNSU5fSU5UMzIgICgoc2lnbmVkNjQpIExTTUFTSzY0ICg2MywgMzEpKQorCisjZGVmaW5lIE1BWF9JTlQ2NCAgKChzaWduZWQ2NCkgTFNNQVNLNjQgKDYyLCAwKSkKKyNkZWZpbmUgTUFYX1VJTlQ2NCBMU01BU0s2NCAoNjMsIDApCisjZGVmaW5lIE1JTl9JTlQ2NCAgKChzaWduZWQ2NCkgTFNNQVNLNjQgKDYzLCA2MykpCisKKyNkZWZpbmUgTUFYX0lOVCAgIChpc182NGJpdCA/IE1BWF9JTlQ2NCAgOiBNQVhfSU5UMzIpCisjZGVmaW5lIE1JTl9JTlQgICAoaXNfNjRiaXQgPyBNSU5fSU5UNjQgIDogTUlOX0lOVDMyKQorI2RlZmluZSBNQVhfVUlOVCAgKGlzXzY0Yml0ID8gTUFYX1VJTlQ2NCA6IE1BWF9VSU5UMzIpCisjZGVmaW5lIE5SX0lOVEJJVFMgKGlzXzY0Yml0ID8gNjQgOiAzMikKKworLyogU3F1ZWVzZSBhbiB1bnBhY2tlZCBzaW1fZnB1IHN0cnVjdCBpbnRvIGEgMzIvNjQgYml0IGludGVnZXIgKi8KK1NUQVRJQ19JTkxJTkVfU0lNX0ZQVSAodW5zaWduZWQ2NCkKK3BhY2tfZnB1IChjb25zdCBzaW1fZnB1ICpzcmMsCisJICBpbnQgaXNfZG91YmxlKQoreworICBpbnQgc2lnbjsKKyAgdW5zaWduZWQ2NCBleHA7CisgIHVuc2lnbmVkNjQgZnJhY3Rpb247CisgIHVuc2lnbmVkNjQgcGFja2VkOworCisgIHN3aXRjaCAoc3JjLT5jbGFzcykKKyAgICB7CisgICAgICAvKiBjcmVhdGUgYSBOYU4gKi8KKyAgICBjYXNlIHNpbV9mcHVfY2xhc3NfcW5hbjoKKyAgICAgIHNpZ24gPSBzcmMtPnNpZ247CisgICAgICBleHAgPSBFWFBNQVg7CisgICAgICAvKiBmb3JjZSBmcmFjdGlvbiB0byBjb3JyZWN0IGNsYXNzICovCisgICAgICBmcmFjdGlvbiA9IHNyYy0+ZnJhY3Rpb247CisgICAgICBmcmFjdGlvbiA+Pj0gTlJfR1VBUkRTOworICAgICAgZnJhY3Rpb24gfD0gUVVJRVRfTkFOOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzaW1fZnB1X2NsYXNzX3NuYW46CisgICAgICBzaWduID0gc3JjLT5zaWduOworICAgICAgZXhwID0gRVhQTUFYOworICAgICAgLyogZm9yY2UgZnJhY3Rpb24gdG8gY29ycmVjdCBjbGFzcyAqLworICAgICAgZnJhY3Rpb24gPSBzcmMtPmZyYWN0aW9uOworICAgICAgZnJhY3Rpb24gPj49IE5SX0dVQVJEUzsKKyAgICAgIGZyYWN0aW9uICY9IH5RVUlFVF9OQU47CisgICAgICBicmVhazsKKyAgICBjYXNlIHNpbV9mcHVfY2xhc3NfaW5maW5pdHk6CisgICAgICBzaWduID0gc3JjLT5zaWduOworICAgICAgZXhwID0gRVhQTUFYOworICAgICAgZnJhY3Rpb24gPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzaW1fZnB1X2NsYXNzX3plcm86CisgICAgICBzaWduID0gc3JjLT5zaWduOworICAgICAgZXhwID0gMDsKKyAgICAgIGZyYWN0aW9uID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc19udW1iZXI6CisgICAgY2FzZSBzaW1fZnB1X2NsYXNzX2Rlbm9ybToKKyAgICAgIEFTU0VSVCAoc3JjLT5mcmFjdGlvbiA+PSBJTVBMSUNJVF8xKTsKKyAgICAgIEFTU0VSVCAoc3JjLT5mcmFjdGlvbiA8IElNUExJQ0lUXzIpOworICAgICAgaWYgKHNyYy0+bm9ybWFsX2V4cCA8IE5PUk1BTF9FWFBNSU4pCisJeworCSAgLyogVGhpcyBudW1iZXIncyBleHBvbmVudCBpcyB0b28gbG93IHRvIGZpdCBpbnRvIHRoZSBiaXRzCisJICAgICBhdmFpbGFibGUgaW4gdGhlIG51bWJlciBXZSdsbCBkZW5vcm1hbGl6ZSB0aGUgbnVtYmVyIGJ5CisJICAgICBzdG9yaW5nIHplcm8gaW4gdGhlIGV4cG9uZW50IGFuZCBzaGlmdCB0aGUgZnJhY3Rpb24gdG8KKwkgICAgIHRoZSByaWdodCB0byBtYWtlIHVwIGZvciBpdC4gKi8KKwkgIGludCBucl9zaGlmdCA9IE5PUk1BTF9FWFBNSU4gLSBzcmMtPm5vcm1hbF9leHA7CisJICBpZiAobnJfc2hpZnQgPiBOUl9GUkFDQklUUykKKwkgICAgeworCSAgICAgIC8qIHVuZGVyZmxvdywganVzdCBtYWtlIHRoZSBudW1iZXIgemVybyAqLworCSAgICAgIHNpZ24gPSBzcmMtPnNpZ247CisJICAgICAgZXhwID0gMDsKKwkgICAgICBmcmFjdGlvbiA9IDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHNpZ24gPSBzcmMtPnNpZ247CisJICAgICAgZXhwID0gMDsKKwkgICAgICAvKiBTaGlmdCBieSB0aGUgdmFsdWUgKi8KKwkgICAgICBmcmFjdGlvbiA9IHNyYy0+ZnJhY3Rpb247CisJICAgICAgZnJhY3Rpb24gPj49IE5SX0dVQVJEUzsKKwkgICAgICBmcmFjdGlvbiA+Pj0gbnJfc2hpZnQ7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChzcmMtPm5vcm1hbF9leHAgPiBOT1JNQUxfRVhQTUFYKQorCXsKKwkgIC8qIEluZmluaXR5ICovCisJICBzaWduID0gc3JjLT5zaWduOworCSAgZXhwID0gRVhQTUFYOworCSAgZnJhY3Rpb24gPSAwOyAKKwl9CisgICAgICBlbHNlCisJeworCSAgZXhwID0gKHNyYy0+bm9ybWFsX2V4cCArIEVYUEJJQVMpOworCSAgc2lnbiA9IHNyYy0+c2lnbjsKKwkgIGZyYWN0aW9uID0gc3JjLT5mcmFjdGlvbjsKKwkgIC8qIEZJWE1FOiBOZWVkIHRvIHJvdW5kIGFjY29yZGluZyB0byBXSVRIX1NJTV9GUFVfUk9VTkRJTkcKKyAgICAgICAgICAgICBvciBzb21lIHN1Y2ggKi8KKwkgIC8qIFJvdW5kIHRvIG5lYXJlc3Q6IElmIHRoZSBndWFyZCBiaXRzIGFyZSB0aGUgYWxsIHplcm8sIGJ1dAorCSAgICAgdGhlIGZpcnN0LCB0aGVuIHdlJ3JlIGhhbGYgd2F5IGJldHdlZW4gdHdvIG51bWJlcnMsCisJICAgICBjaG9vc2UgdGhlIG9uZSB3aGljaCBtYWtlcyB0aGUgbHNiIG9mIHRoZSBhbnN3ZXIgMC4gICovCisJICBpZiAoKGZyYWN0aW9uICYgR1VBUkRNQVNLKSA9PSBHVUFSRE1TQikKKwkgICAgeworCSAgICAgIGlmICgoZnJhY3Rpb24gJiAoR1VBUkRNU0IgPDwgMSkpKQorCQlmcmFjdGlvbiArPSAoR1VBUkRNU0IgPDwgMSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIEFkZCBhIG9uZSB0byB0aGUgZ3VhcmRzIHRvIGZvcmNlIHJvdW5kIHRvIG5lYXJlc3QgKi8KKwkgICAgICBmcmFjdGlvbiArPSBHVUFSRFJPVU5EOworCSAgICB9CisJICBpZiAoKGZyYWN0aW9uICYgSU1QTElDSVRfMikpIC8qIHJvdW5kaW5nIHJlc3VsdGVkIGluIGNhcnJ5ICovCisJICAgIHsKKwkgICAgICBleHAgKz0gMTsKKwkgICAgICBmcmFjdGlvbiA+Pj0gMTsKKwkgICAgfQorCSAgZnJhY3Rpb24gPj49IE5SX0dVQVJEUzsKKwkgIC8qIFdoZW4gZXhwID09IEVYUE1BWCAob3ZlcmZsb3cgZnJvbSBjYXJyeSkgZnJhY3Rpb24gbXVzdAorCSAgICAgaGF2ZSBiZWVuIG1hZGUgemVybyAqLworCSAgQVNTRVJUICgoZXhwID09IEVYUE1BWCkgPD0gKChmcmFjdGlvbiAmIH5JTVBMSUNJVF8xKSA9PSAwKSk7CisJfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBwYWNrZWQgPSAoKHNpZ24gPyBTSUdOQklUIDogMCkKKwkgICAgIHwgKGV4cCA8PCBOUl9GUkFDQklUUykKKwkgICAgIHwgTFNNQVNLRUQ2NCAoZnJhY3Rpb24sIE5SX0ZSQUNCSVRTIC0gMSwgMCkpOworCisgIC8qIHRyYWNlIG9wZXJhdGlvbiAqLworI2lmIDAKKyAgaWYgKGlzX2RvdWJsZSkKKyAgICB7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcHJpbnRmICgicGFja19mcHU6ICIpOworICAgICAgcHJpbnRmICgiLT4gJWMlMGxYLiUwNmxYXG4iLAorCSAgICAgIExTTUFTS0VEMzIgKHBhY2tlZCwgMzEsIDMxKSA/ICc4JyA6ICcwJywKKwkgICAgICAobG9uZykgTFNFWFRSQUNURUQzMiAocGFja2VkLCAzMCwgMjMpLAorCSAgICAgIChsb25nKSBMU0VYVFJBQ1RFRDMyIChwYWNrZWQsIDIzIC0gMSwgMCkpOworICAgIH0KKyNlbmRpZgorICAKKyAgcmV0dXJuIHBhY2tlZDsKK30KKworCisvKiBVbnBhY2sgYSAzMi82NCBiaXQgaW50ZWdlciBpbnRvIGEgc2ltX2ZwdSBzdHJ1Y3R1cmUgKi8KK1NUQVRJQ19JTkxJTkVfU0lNX0ZQVSAodm9pZCkKK3VucGFja19mcHUgKHNpbV9mcHUgKmRzdCwgdW5zaWduZWQ2NCBwYWNrZWQsIGludCBpc19kb3VibGUpCit7CisgIHVuc2lnbmVkNjQgZnJhY3Rpb24gPSBMU01BU0tFRDY0IChwYWNrZWQsIE5SX0ZSQUNCSVRTIC0gMSwgMCk7CisgIHVuc2lnbmVkIGV4cCA9IExTRVhUUkFDVEVENjQgKHBhY2tlZCwgTlJfRVhQQklUUyArIE5SX0ZSQUNCSVRTIC0gMSwgTlJfRlJBQ0JJVFMpOworICBpbnQgc2lnbiA9IChwYWNrZWQgJiBTSUdOQklUKSAhPSAwOworCisgIGlmIChleHAgPT0gMCkKKyAgICB7CisgICAgICAvKiBIbW0uICBMb29rcyBsaWtlIDAgKi8KKyAgICAgIGlmIChmcmFjdGlvbiA9PSAwKQorCXsKKwkgIC8qIHRhc3RlcyBsaWtlIHplcm8gKi8KKwkgIGRzdC0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3plcm87CisJICBkc3QtPnNpZ24gPSBzaWduOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBaZXJvIGV4cG9uZW50IHdpdGggbm9uIHplcm8gZnJhY3Rpb24gLSBpdCdzIGRlbm9ybWFsaXplZCwKKwkgICAgIHNvIHRoZXJlIGlzbid0IGEgbGVhZGluZyBpbXBsaWNpdCBvbmUgLSB3ZSdsbCBzaGlmdCBpdCBzbworCSAgICAgaXQgZ2V0cyBvbmUuICAqLworCSAgZHN0LT5ub3JtYWxfZXhwID0gZXhwIC0gRVhQQklBUyArIDE7CisJICBkc3QtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19kZW5vcm07CisJICBkc3QtPnNpZ24gPSBzaWduOworCSAgZnJhY3Rpb24gPDw9IE5SX0dVQVJEUzsKKwkgIHdoaWxlIChmcmFjdGlvbiA8IElNUExJQ0lUXzEpCisJICAgIHsKKwkgICAgICBmcmFjdGlvbiA8PD0gMTsKKwkgICAgICBkc3QtPm5vcm1hbF9leHAtLTsKKwkgICAgfQorCSAgZHN0LT5mcmFjdGlvbiA9IGZyYWN0aW9uOworCX0KKyAgICB9CisgIGVsc2UgaWYgKGV4cCA9PSBFWFBNQVgpCisgICAgeworICAgICAgLyogSHVnZSBleHBvbmVudCovCisgICAgICBpZiAoZnJhY3Rpb24gPT0gMCkKKwl7CisJICAvKiBBdHRhY2hlZCB0byBhIHplcm8gZnJhY3Rpb24gLSBtZWFucyBpbmZpbml0eSAqLworCSAgZHN0LT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfaW5maW5pdHk7CisJICBkc3QtPnNpZ24gPSBzaWduOworCSAgLyogZHN0LT5ub3JtYWxfZXhwID0gRVhQQklBUzsgKi8KKwkgIC8qIGRzdC0+ZnJhY3Rpb24gPSAwOyAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBOb24gemVybyBmcmFjdGlvbiwgbWVhbnMgTmFOICovCisJICBkc3QtPnNpZ24gPSBzaWduOworCSAgZHN0LT5mcmFjdGlvbiA9IChmcmFjdGlvbiA8PCBOUl9HVUFSRFMpOworCSAgaWYgKGZyYWN0aW9uID49IFFVSUVUX05BTikKKwkgICAgZHN0LT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfcW5hbjsKKwkgIGVsc2UKKwkgICAgZHN0LT5jbGFzcyA9IHNpbV9mcHVfY2xhc3Nfc25hbjsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogTm90aGluZyBzdHJhbmdlIGFib3V0IHRoaXMgbnVtYmVyICovCisgICAgICBkc3QtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19udW1iZXI7CisgICAgICBkc3QtPnNpZ24gPSBzaWduOworICAgICAgZHN0LT5mcmFjdGlvbiA9ICgoZnJhY3Rpb24gPDwgTlJfR1VBUkRTKSB8IElNUExJQ0lUXzEpOworICAgICAgZHN0LT5ub3JtYWxfZXhwID0gZXhwIC0gRVhQQklBUzsKKyAgICB9CisKKyAgLyogdHJhY2Ugb3BlcmF0aW9uICovCisjaWYgMAorICBpZiAoaXNfZG91YmxlKQorICAgIHsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludGYgKCJ1bnBhY2tfZnB1OiAlYyUwMmxYLiUwNmxYIC0+XG4iLAorCSAgICAgIExTTUFTS0VEMzIgKHBhY2tlZCwgMzEsIDMxKSA/ICc4JyA6ICcwJywKKwkgICAgICAobG9uZykgTFNFWFRSQUNURUQzMiAocGFja2VkLCAzMCwgMjMpLAorCSAgICAgIChsb25nKSBMU0VYVFJBQ1RFRDMyIChwYWNrZWQsIDIzIC0gMSwgMCkpOworICAgIH0KKyNlbmRpZgorCisgIC8qIHNhbml0eSBjaGVja3MgKi8KKyAgeworICAgIHNpbV9mcHVfbWFwIHZhbDsKKyAgICB2YWwuaSA9IHBhY2tfZnB1IChkc3QsIDEpOworICAgIGlmIChpc19kb3VibGUpCisgICAgICB7CisJQVNTRVJUICh2YWwuaSA9PSBwYWNrZWQpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwl1bnNpZ25lZDMyIHZhbCA9IHBhY2tfZnB1IChkc3QsIDApOworCXVuc2lnbmVkMzIgb3JnID0gcGFja2VkOworCUFTU0VSVCAodmFsID09IG9yZyk7CisgICAgICB9CisgIH0KK30KKworCisvKiBDb252ZXJ0IGEgZmxvYXRpbmcgcG9pbnQgaW50byBhbiBpbnRlZ2VyICovCitTVEFUSUNfSU5MSU5FX1NJTV9GUFUgKGludCkKK2ZwdTJpIChzaWduZWQ2NCAqaSwKKyAgICAgICBjb25zdCBzaW1fZnB1ICpzLAorICAgICAgIGludCBpc182NGJpdCwKKyAgICAgICBzaW1fZnB1X3JvdW5kIHJvdW5kKQoreworICB1bnNpZ25lZDY0IHRtcDsKKyAgaW50IHNoaWZ0OworICBpbnQgc3RhdHVzID0gMDsKKyAgaWYgKHNpbV9mcHVfaXNfemVybyAocykpCisgICAgeworICAgICAgKmkgPSAwOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc19zbmFuIChzKSkKKyAgICB7CisgICAgICAqaSA9IE1JTl9JTlQ7IC8qIEZJWE1FICovCisgICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9jdmk7CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc19xbmFuIChzKSkKKyAgICB7CisgICAgICAqaSA9IE1JTl9JTlQ7IC8qIEZJWE1FICovCisgICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9jdmk7CisgICAgfQorICAvKiBtYXAgaW5maW5pdHkgb250byBNQVhfSU5ULi4uICovCisgIGlmIChzaW1fZnB1X2lzX2luZmluaXR5IChzKSkKKyAgICB7CisgICAgICAqaSA9IHMtPnNpZ24gPyBNSU5fSU5UIDogTUFYX0lOVDsKKyAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2N2aTsKKyAgICB9CisgIC8qIGl0IGlzIGEgbnVtYmVyLCBidXQgYSBzbWFsbCBvbmUgKi8KKyAgaWYgKHMtPm5vcm1hbF9leHAgPCAwKQorICAgIHsKKyAgICAgICppID0gMDsKKyAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbmV4YWN0OworICAgIH0KKyAgLyogSXMgdGhlIGZsb2F0aW5nIHBvaW50IE1JTl9JTlQgb3IganVzdCBjbG9zZT8gKi8KKyAgaWYgKHMtPnNpZ24gJiYgcy0+bm9ybWFsX2V4cCA9PSAoTlJfSU5UQklUUyAtIDEpKQorICAgIHsKKyAgICAgICppID0gTUlOX0lOVDsKKyAgICAgIEFTU0VSVCAocy0+ZnJhY3Rpb24gPj0gSU1QTElDSVRfMSk7CisgICAgICBpZiAocy0+ZnJhY3Rpb24gPT0gSU1QTElDSVRfMSkKKwlyZXR1cm4gMDsgLyogZXhhY3QgKi8KKyAgICAgIGlmIChpc182NGJpdCkgLyogY2FuJ3Qgcm91bmQgKi8KKwlyZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9jdmk7IC8qIG11c3QgYmUgb3ZlcmZsb3cgKi8KKyAgICAgIC8qIEZvciBhIDMyYml0IHdpdGggTUFYX0lOVCwgcm91bmRpbmcgaXMgcG9zc2libGUgKi8KKyAgICAgIHN3aXRjaCAocm91bmQpCisJeworCWNhc2Ugc2ltX2ZwdV9yb3VuZF9kZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJY2FzZSBzaW1fZnB1X3JvdW5kX3plcm86CisJICBpZiAoKHMtPmZyYWN0aW9uICYgRlJBQzMyTUFTSykgIT0gSU1QTElDSVRfMSkKKwkgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfY3ZpOworCSAgZWxzZQorCSAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW5leGFjdDsKKwkgIGJyZWFrOworCWNhc2Ugc2ltX2ZwdV9yb3VuZF9uZWFyOgorCSAgeworCSAgICBpZiAoKHMtPmZyYWN0aW9uICYgRlJBQzMyTUFTSykgIT0gSU1QTElDSVRfMSkKKwkgICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9jdmk7CisJICAgIGVsc2UgaWYgKChzLT5mcmFjdGlvbiAmICFGUkFDMzJNQVNLKSA+PSAofkZSQUMzMk1BU0sgPj4gMSkpCisJICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfY3ZpOworCSAgICBlbHNlCisJICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2luZXhhY3Q7CisJICB9CisJY2FzZSBzaW1fZnB1X3JvdW5kX3VwOgorCSAgaWYgKChzLT5mcmFjdGlvbiAmIEZSQUMzMk1BU0spID09IElNUExJQ0lUXzEpCisJICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbmV4YWN0OworCSAgZWxzZQorCSAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9jdmk7CisJY2FzZSBzaW1fZnB1X3JvdW5kX2Rvd246CisJICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9jdmk7CisJfQorICAgIH0KKyAgLyogV291bGQgcmlnaHQgc2hpZnRpbmcgcmVzdWx0IGluIHRoZSBGUkFDIGJlaW5nIHNoaWZ0ZWQgaW50bworICAgICAodGhyb3VnaCkgdGhlIGludGVnZXIncyBzaWduIGJpdD8gKi8KKyAgaWYgKHMtPm5vcm1hbF9leHAgPiAoTlJfSU5UQklUUyAtIDIpKQorICAgIHsKKyAgICAgICppID0gcy0+c2lnbiA/IE1JTl9JTlQgOiBNQVhfSU5UOworICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfY3ZpOworICAgIH0KKyAgLyogbm9ybWFsIG51bWJlciBzaGlmdCBpdCBpbnRvIHBsYWNlICovCisgIHRtcCA9IHMtPmZyYWN0aW9uOworICBzaGlmdCA9IChzLT5ub3JtYWxfZXhwIC0gKE5SX0ZSQUNfR1VBUkQpKTsKKyAgaWYgKHNoaWZ0ID4gMCkKKyAgICB7CisgICAgICB0bXAgPDw9IHNoaWZ0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNoaWZ0ID0gLXNoaWZ0OworICAgICAgaWYgKHRtcCAmICgoU0lHTkVENjQgKDEpIDw8IHNoaWZ0KSAtIDEpKQorCXN0YXR1cyB8PSBzaW1fZnB1X3N0YXR1c19pbmV4YWN0OworICAgICAgdG1wID4+PSBzaGlmdDsKKyAgICB9CisgICppID0gcy0+c2lnbiA/ICgtdG1wKSA6ICh0bXApOworICByZXR1cm4gc3RhdHVzOworfQorCisvKiBjb252ZXJ0IGFuIGludGVnZXIgaW50byBhIGZsb2F0aW5nIHBvaW50ICovCitTVEFUSUNfSU5MSU5FX1NJTV9GUFUgKGludCkKK2kyZnB1IChzaW1fZnB1ICpmLCBzaWduZWQ2NCBpLCBpbnQgaXNfNjRiaXQpCit7CisgIGludCBzdGF0dXMgPSAwOworICBpZiAoaSA9PSAwKQorICAgIHsKKyAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc196ZXJvOworICAgICAgZi0+c2lnbiA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX251bWJlcjsKKyAgICAgIGYtPnNpZ24gPSAoaSA8IDApOworICAgICAgZi0+bm9ybWFsX2V4cCA9IE5SX0ZSQUNfR1VBUkQ7CisKKyAgICAgIGlmIChmLT5zaWduKSAKKwl7CisJICAvKiBTcGVjaWFsIGNhc2UgZm9yIG1pbmludCwgc2luY2UgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZworCSAgICAgK3ZlIGludGVnZXIgcmVwcmVzZW50YXRpb24gZm9yIGl0ICovCisJICBpZiAoaSA9PSBNSU5fSU5UKQorCSAgICB7CisJICAgICAgZi0+ZnJhY3Rpb24gPSBJTVBMSUNJVF8xOworCSAgICAgIGYtPm5vcm1hbF9leHAgPSBOUl9JTlRCSVRTIC0gMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBmLT5mcmFjdGlvbiA9ICgtaSk7CisJfQorICAgICAgZWxzZQorCWYtPmZyYWN0aW9uID0gaTsKKworICAgICAgaWYgKGYtPmZyYWN0aW9uID49IElNUExJQ0lUXzIpCisJeworCSAgZG8gCisJICAgIHsKKwkgICAgICBmLT5mcmFjdGlvbiA+Pj0gMTsKKwkgICAgICBmLT5ub3JtYWxfZXhwICs9IDE7CisJICAgIH0KKwkgIHdoaWxlIChmLT5mcmFjdGlvbiA+PSBJTVBMSUNJVF8yKTsKKwl9CisgICAgICBlbHNlIGlmIChmLT5mcmFjdGlvbiA8IElNUExJQ0lUXzEpCisJeworCSAgZG8KKwkgICAgeworCSAgICAgIGYtPmZyYWN0aW9uIDw8PSAxOworCSAgICAgIGYtPm5vcm1hbF9leHAgLT0gMTsKKwkgICAgfQorCSAgd2hpbGUgKGYtPmZyYWN0aW9uIDwgSU1QTElDSVRfMSk7CisJfQorICAgIH0KKworICAvKiB0cmFjZSBvcGVyYXRpb24gKi8KKyNpZiAwCisgIHsKKyAgICBwcmludGYgKCJpMmZwdTogMHglMDhsWCAtPlxuIiwgKGxvbmcpIGkpOworICB9CisjZW5kaWYKKworICAvKiBzYW5pdHkgY2hlY2sgKi8KKyAgeworICAgIHNpZ25lZDY0IHZhbDsKKyAgICBmcHUyaSAoJnZhbCwgZiwgaXNfNjRiaXQsIHNpbV9mcHVfcm91bmRfemVybyk7CisgICAgaWYgKGkgPj0gTUlOX0lOVDMyICYmIGkgPD0gTUFYX0lOVDMyKQorICAgICAgeworCUFTU0VSVCAodmFsID09IGkpOworICAgICAgfQorICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKiBDb252ZXJ0IGEgZmxvYXRpbmcgcG9pbnQgaW50byBhbiBpbnRlZ2VyICovCitTVEFUSUNfSU5MSU5FX1NJTV9GUFUgKGludCkKK2ZwdTJ1ICh1bnNpZ25lZDY0ICp1LCBjb25zdCBzaW1fZnB1ICpzLCBpbnQgaXNfNjRiaXQpCit7CisgIGNvbnN0IGludCBpc19kb3VibGUgPSAxOworICB1bnNpZ25lZDY0IHRtcDsKKyAgaW50IHNoaWZ0OworICBpZiAoc2ltX2ZwdV9pc196ZXJvIChzKSkKKyAgICB7CisgICAgICAqdSA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChzaW1fZnB1X2lzX25hbiAocykpCisgICAgeworICAgICAgKnUgPSAwOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAvKiBpdCBpcyBhIG5lZ2F0aXZlIG51bWJlciAqLworICBpZiAocy0+c2lnbikKKyAgICB7CisgICAgICAqdSA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIC8qIGdldCByZWFzb25hYmxlIE1BWF9VU0lfSU5ULi4uICovCisgIGlmIChzaW1fZnB1X2lzX2luZmluaXR5IChzKSkKKyAgICB7CisgICAgICAqdSA9IE1BWF9VSU5UOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAvKiBpdCBpcyBhIG51bWJlciwgYnV0IGEgc21hbGwgb25lICovCisgIGlmIChzLT5ub3JtYWxfZXhwIDwgMCkKKyAgICB7CisgICAgICAqdSA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIC8qIG92ZXJmbG93ICovCisgIGlmIChzLT5ub3JtYWxfZXhwID4gKE5SX0lOVEJJVFMgLSAxKSkKKyAgICB7CisgICAgICAqdSA9IE1BWF9VSU5UOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAvKiBub3JtYWwgbnVtYmVyICovCisgIHRtcCA9IChzLT5mcmFjdGlvbiAmIH5QQURNQVNLKTsKKyAgc2hpZnQgPSAocy0+bm9ybWFsX2V4cCAtIChOUl9GUkFDQklUUyArIE5SX0dVQVJEUykpOworICBpZiAoc2hpZnQgPiAwKQorICAgIHsKKyAgICAgIHRtcCA8PD0gc2hpZnQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2hpZnQgPSAtc2hpZnQ7CisgICAgICB0bXAgPj49IHNoaWZ0OworICAgIH0KKyAgKnUgPSB0bXA7CisgIHJldHVybiAwOworfQorCisvKiBDb252ZXJ0IGFuIHVuc2lnbmVkIGludGVnZXIgaW50byBhIGZsb2F0aW5nIHBvaW50ICovCitTVEFUSUNfSU5MSU5FX1NJTV9GUFUgKGludCkKK3UyZnB1IChzaW1fZnB1ICpmLCB1bnNpZ25lZDY0IHUsIGludCBpc182NGJpdCkKK3sKKyAgaWYgKHUgPT0gMCkKKyAgICB7CisgICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfemVybzsKKyAgICAgIGYtPnNpZ24gPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19udW1iZXI7CisgICAgICBmLT5zaWduID0gMDsKKyAgICAgIGYtPm5vcm1hbF9leHAgPSBOUl9GUkFDX0dVQVJEOworICAgICAgZi0+ZnJhY3Rpb24gPSB1OworCisgICAgICB3aGlsZSAoZi0+ZnJhY3Rpb24gPCBJTVBMSUNJVF8xKQorCXsKKwkgIGYtPmZyYWN0aW9uIDw8PSAxOworCSAgZi0+bm9ybWFsX2V4cCAtPSAxOworCX0KKyAgICB9CisgIHJldHVybiAwOworfQorCisKKy8qIHJlZ2lzdGVyIDwtPiBzaW1fZnB1ICovCisKK0lOTElORV9TSU1fRlBVICh2b2lkKQorc2ltX2ZwdV8zMnRvIChzaW1fZnB1ICpmLCB1bnNpZ25lZDMyIHMpCit7CisgIHVucGFja19mcHUgKGYsIHMsIDApOworfQorCisKK0lOTElORV9TSU1fRlBVICh2b2lkKQorc2ltX2ZwdV8yMzJ0byAoc2ltX2ZwdSAqZiwgdW5zaWduZWQzMiBoLCB1bnNpZ25lZDMyIGwpCit7CisgIHVuc2lnbmVkNjQgcyA9IGg7CisgIHMgPSAocyA8PCAzMikgfCBsOworICB1bnBhY2tfZnB1IChmLCBzLCAxKTsKK30KKworCitJTkxJTkVfU0lNX0ZQVSAodm9pZCkKK3NpbV9mcHVfNjR0byAoc2ltX2ZwdSAqZiwgdW5zaWduZWQ2NCBzKQoreworICB1bnBhY2tfZnB1IChmLCBzLCAxKTsKK30KKworCitJTkxJTkVfU0lNX0ZQVSAodm9pZCkKK3NpbV9mcHVfdG8zMiAodW5zaWduZWQzMiAqcywKKwkgICAgICBjb25zdCBzaW1fZnB1ICpmKQoreworICAqcyA9IHBhY2tfZnB1IChmLCAwKTsKK30KKworCitJTkxJTkVfU0lNX0ZQVSAodm9pZCkKK3NpbV9mcHVfdG8yMzIgKHVuc2lnbmVkMzIgKmgsIHVuc2lnbmVkMzIgKmwsCisJICAgICAgIGNvbnN0IHNpbV9mcHUgKmYpCit7CisgIHVuc2lnbmVkNjQgcyA9IHBhY2tfZnB1IChmLCAxKTsKKyAgKmwgPSBzOworICAqaCA9IChzID4+IDMyKTsKK30KKworCitJTkxJTkVfU0lNX0ZQVSAodm9pZCkKK3NpbV9mcHVfdG82NCAodW5zaWduZWQ2NCAqdSwKKwkgICAgICBjb25zdCBzaW1fZnB1ICpmKQoreworICAqdSA9IHBhY2tfZnB1IChmLCAxKTsKK30KKworCitJTkxJTkVfU0lNX0ZQVSAodm9pZCkKK3NpbV9mcHVfZnJhY3Rpb250byAoc2ltX2ZwdSAqZiwKKwkJICAgIGludCBzaWduLAorCQkgICAgaW50IG5vcm1hbF9leHAsCisJCSAgICB1bnNpZ25lZDY0IGZyYWN0aW9uLAorCQkgICAgaW50IHByZWNpc2lvbikKK3sKKyAgaW50IHNoaWZ0ID0gKE5SX0ZSQUNfR1VBUkQgLSBwcmVjaXNpb24pOworICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfbnVtYmVyOworICBmLT5zaWduID0gc2lnbjsKKyAgZi0+bm9ybWFsX2V4cCA9IG5vcm1hbF9leHA7CisgIC8qIHNoaWZ0IHRoZSBmcmFjdGlvbiB0byB3aGVyZSBzaW0tZnB1IGV4cGVjdHMgaXQgKi8KKyAgaWYgKHNoaWZ0ID49IDApCisgICAgZi0+ZnJhY3Rpb24gPSAoZnJhY3Rpb24gPDwgc2hpZnQpOworICBlbHNlCisgICAgZi0+ZnJhY3Rpb24gPSAoZnJhY3Rpb24gPj4gLXNoaWZ0KTsKKyAgZi0+ZnJhY3Rpb24gfD0gSU1QTElDSVRfMTsKK30KKworCitJTkxJTkVfU0lNX0ZQVSAodW5zaWduZWQ2NCkKK3NpbV9mcHVfdG9mcmFjdGlvbiAoY29uc3Qgc2ltX2ZwdSAqZCwKKwkJICAgIGludCBwcmVjaXNpb24pCit7CisgIC8qIHdlIGhhdmUgTlJfRlJBQ19HVUFSRCBiaXRzLCB3ZSB3YW50IG9ubHkgUFJFQ0lTSU9OIGJpdHMgKi8KKyAgaW50IHNoaWZ0ID0gKE5SX0ZSQUNfR1VBUkQgLSBwcmVjaXNpb24pOworICB1bnNpZ25lZDY0IGZyYWN0aW9uID0gKGQtPmZyYWN0aW9uICYgfklNUExJQ0lUXzEpOworICBpZiAoc2hpZnQgPj0gMCkKKyAgICByZXR1cm4gZnJhY3Rpb24gPj4gc2hpZnQ7CisgIGVsc2UKKyAgICByZXR1cm4gZnJhY3Rpb24gPDwgLXNoaWZ0OworfQorCisKKy8qIFJvdW5kaW5nICovCisKK1NUQVRJQ19JTkxJTkVfU0lNX0ZQVSAoaW50KQorZG9fbm9ybWFsX292ZXJmbG93IChzaW1fZnB1ICpmLAorCQkgICAgaW50IGlzX2RvdWJsZSwKKwkJICAgIHNpbV9mcHVfcm91bmQgcm91bmQpCit7CisgIHN3aXRjaCAocm91bmQpCisgICAgeworICAgIGNhc2Ugc2ltX2ZwdV9yb3VuZF9kZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBzaW1fZnB1X3JvdW5kX25lYXI6CisgICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfaW5maW5pdHk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHNpbV9mcHVfcm91bmRfdXA6CisgICAgICBpZiAoIWYtPnNpZ24pCisJZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX2luZmluaXR5OworICAgICAgYnJlYWs7CisgICAgY2FzZSBzaW1fZnB1X3JvdW5kX2Rvd246CisgICAgICBpZiAoZi0+c2lnbikKKwlmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfaW5maW5pdHk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHNpbV9mcHVfcm91bmRfemVybzoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgZi0+bm9ybWFsX2V4cCA9IE5PUk1BTF9FWFBNQVg7CisgIGYtPmZyYWN0aW9uID0gTFNNQVNLNjQgKE5SX0ZSQUNfR1VBUkQsIE5SX0dVQVJEUyk7CisgIHJldHVybiAoc2ltX2ZwdV9zdGF0dXNfb3ZlcmZsb3cgfCBzaW1fZnB1X3N0YXR1c19pbmV4YWN0KTsKK30KKworU1RBVElDX0lOTElORV9TSU1fRlBVIChpbnQpCitkb19ub3JtYWxfdW5kZXJmbG93IChzaW1fZnB1ICpmLAorCQkgICAgIGludCBpc19kb3VibGUsCisJCSAgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCkKK3sKKyAgc3dpdGNoIChyb3VuZCkKKyAgICB7CisgICAgY2FzZSBzaW1fZnB1X3JvdW5kX2RlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIHNpbV9mcHVfcm91bmRfbmVhcjoKKyAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc196ZXJvOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzaW1fZnB1X3JvdW5kX3VwOgorICAgICAgaWYgKGYtPnNpZ24pCisJZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3plcm87CisgICAgICBicmVhazsKKyAgICBjYXNlIHNpbV9mcHVfcm91bmRfZG93bjoKKyAgICAgIGlmICghZi0+c2lnbikKKwlmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfemVybzsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugc2ltX2ZwdV9yb3VuZF96ZXJvOgorICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3plcm87CisgICAgICBicmVhazsKKyAgICB9CisgIGYtPm5vcm1hbF9leHAgPSBOT1JNQUxfRVhQTUlOIC0gTlJfRlJBQ0JJVFM7CisgIGYtPmZyYWN0aW9uID0gSU1QTElDSVRfMTsKKyAgcmV0dXJuIChzaW1fZnB1X3N0YXR1c19pbmV4YWN0IHwgc2ltX2ZwdV9zdGF0dXNfdW5kZXJmbG93KTsKK30KKworCisKKy8qIFJvdW5kIGEgbnVtYmVyIHVzaW5nIE5SX0dVQVJEUy4KKyAgIFdpbGwgcmV0dXJuIHRoZSByb3VuZGVkIG51bWJlciBvciBGLT5GUkFDVElPTiA9PSAwIHdoZW4gdW5kZXJmbG93ICovCisKK1NUQVRJQ19JTkxJTkVfU0lNX0ZQVSAoaW50KQorZG9fbm9ybWFsX3JvdW5kIChzaW1fZnB1ICpmLAorCQkgaW50IG5yX2d1YXJkcywKKwkJIHNpbV9mcHVfcm91bmQgcm91bmQpCit7CisgIHVuc2lnbmVkNjQgZ3VhcmRtYXNrID0gTFNNQVNLNjQgKG5yX2d1YXJkcyAtIDEsIDApOworICB1bnNpZ25lZDY0IGd1YXJkbXNiID0gTFNCSVQ2NCAobnJfZ3VhcmRzIC0gMSk7CisgIHVuc2lnbmVkNjQgZnJhY2xzYiA9IGd1YXJkbXNiIDw8IDE7CisgIGlmICgoZi0+ZnJhY3Rpb24gJiBndWFyZG1hc2spKQorICAgIHsKKyAgICAgIGludCBzdGF0dXMgPSBzaW1fZnB1X3N0YXR1c19pbmV4YWN0OworICAgICAgc3dpdGNoIChyb3VuZCkKKwl7CisJY2FzZSBzaW1fZnB1X3JvdW5kX2RlZmF1bHQ6CisJICByZXR1cm4gMDsKKwljYXNlIHNpbV9mcHVfcm91bmRfbmVhcjoKKwkgIGlmICgoZi0+ZnJhY3Rpb24gJiBndWFyZG1zYikpCisJICAgIHsKKwkgICAgICBpZiAoKGYtPmZyYWN0aW9uICYgZnJhY2xzYikpCisJCXsKKwkJICBzdGF0dXMgfD0gc2ltX2ZwdV9zdGF0dXNfcm91bmRlZDsKKwkJfQorCSAgICAgIGVsc2UgaWYgKChmLT5mcmFjdGlvbiAmIChndWFyZG1hc2sgPj4gMSkpKQorCQl7CisJCSAgc3RhdHVzIHw9IHNpbV9mcHVfc3RhdHVzX3JvdW5kZWQ7CisJCX0KKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBzaW1fZnB1X3JvdW5kX3VwOgorCSAgaWYgKCFmLT5zaWduKQorCSAgICBzdGF0dXMgfD0gc2ltX2ZwdV9zdGF0dXNfcm91bmRlZDsKKwkgIGJyZWFrOworCWNhc2Ugc2ltX2ZwdV9yb3VuZF9kb3duOgorCSAgaWYgKGYtPnNpZ24pCisJICAgIHN0YXR1cyB8PSBzaW1fZnB1X3N0YXR1c19yb3VuZGVkOworCSAgYnJlYWs7CisJY2FzZSBzaW1fZnB1X3JvdW5kX3plcm86CisJICBicmVhazsKKwl9CisgICAgICBmLT5mcmFjdGlvbiAmPSB+Z3VhcmRtYXNrOworICAgICAgLyogcm91bmQgaWYgbmVlZGVkLCBoYW5kbGUgcmVzdWx0aW5nIG92ZXJmbG93ICovCisgICAgICBpZiAoKHN0YXR1cyAmIHNpbV9mcHVfc3RhdHVzX3JvdW5kZWQpKQorCXsKKwkgIGYtPmZyYWN0aW9uICs9IGZyYWNsc2I7CisJICBpZiAoKGYtPmZyYWN0aW9uICYgSU1QTElDSVRfMikpCisJICAgIHsKKwkgICAgICBmLT5mcmFjdGlvbiA+Pj0gMTsKKwkgICAgICBmLT5ub3JtYWxfZXhwICs9IDE7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisKK1NUQVRJQ19JTkxJTkVfU0lNX0ZQVSAoaW50KQorZG9fcm91bmQgKHNpbV9mcHUgKmYsCisJICBpbnQgaXNfZG91YmxlLAorCSAgc2ltX2ZwdV9yb3VuZCByb3VuZCwKKwkgIHNpbV9mcHVfZGVub3JtIGRlbm9ybSkKK3sKKyAgc3dpdGNoIChmLT5jbGFzcykKKyAgICB7CisgICAgY2FzZSBzaW1fZnB1X2NsYXNzX3FuYW46CisgICAgY2FzZSBzaW1fZnB1X2NsYXNzX3plcm86CisgICAgY2FzZSBzaW1fZnB1X2NsYXNzX2luZmluaXR5OgorICAgICAgcmV0dXJuIDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIHNpbV9mcHVfY2xhc3Nfc25hbjoKKyAgICAgIC8qIFF1aWV0ZW4gYSBTaWduYWxpbmdOYU4gKi8gCisgICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfcW5hbjsKKyAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3NuYW47CisgICAgICBicmVhazsKKyAgICBjYXNlIHNpbV9mcHVfY2xhc3NfbnVtYmVyOgorICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc19kZW5vcm06CisgICAgICB7CisJaW50IHN0YXR1czsKKwlBU1NFUlQgKGYtPmZyYWN0aW9uIDwgSU1QTElDSVRfMik7CisJQVNTRVJUIChmLT5mcmFjdGlvbiA+PSBJTVBMSUNJVF8xKTsKKwlpZiAoZi0+bm9ybWFsX2V4cCA8IE5PUk1BTF9FWFBNSU4pCisJICB7CisJICAgIC8qIFRoaXMgbnVtYmVyJ3MgZXhwb25lbnQgaXMgdG9vIGxvdyB0byBmaXQgaW50byB0aGUgYml0cworCSAgICAgICBhdmFpbGFibGUgaW4gdGhlIG51bWJlci4gIFJvdW5kIG9mZiBhbnkgYml0cyB0aGF0IHdpbGwgYmUKKwkgICAgICAgZGlzY2FyZGVkIGFzIGEgcmVzdWx0IG9mIGRlbm9ybWFsaXphdGlvbi4gIEVkZ2UgY2FzZSBpcworCSAgICAgICB0aGUgaW1wbGljaXQgYml0IHNoaWZ0ZWQgdG8gR1VBUkQwIGFuZCB0aGVuIHJvdW5kZWQKKwkgICAgICAgdXAuICovCisJICAgIGludCBzaGlmdCA9IE5PUk1BTF9FWFBNSU4gLSBmLT5ub3JtYWxfZXhwOworCSAgICBpZiAoc2hpZnQgKyBOUl9HVUFSRFMgPD0gTlJfRlJBQ19HVUFSRCArIDEKKwkJJiYgIShkZW5vcm0gJiBzaW1fZnB1X2Rlbm9ybV96ZXJvKSkKKwkgICAgICB7CisJCXN0YXR1cyA9IGRvX25vcm1hbF9yb3VuZCAoZiwgc2hpZnQgKyBOUl9HVUFSRFMsIHJvdW5kKTsKKwkJaWYgKGYtPmZyYWN0aW9uID09IDApIC8qIHJvdW5kaW5nIHVuZGVyZmxvd2VkICovCisJCSAgeworCQkgICAgc3RhdHVzIHw9IGRvX25vcm1hbF91bmRlcmZsb3cgKGYsIGlzX2RvdWJsZSwgcm91bmQpOworCQkgIH0KKwkJZWxzZSBpZiAoZi0+bm9ybWFsX2V4cCA8IE5PUk1BTF9FWFBNSU4pIC8qIHN0aWxsIHVuZGVyZmxvdz8gKi8KKwkJICB7CisJCSAgICBzdGF0dXMgfD0gc2ltX2ZwdV9zdGF0dXNfZGVub3JtOworCQkgICAgLyogQW55IGxvc3Mgb2YgcHJlY2lzaW9uIHdoZW4gZGVub3JtYWxpemluZyBpcworCQkgICAgICAgdW5kZXJmbG93LiBTb21lIHByb2Nlc3NvcnMgY2hlY2sgZm9yIHVuZGVyZmxvdworCQkgICAgICAgYmVmb3JlIHJvdW5kaW5nLCBzb21lIGFmdGVyISAqLworCQkgICAgaWYgKHN0YXR1cyAmIHNpbV9mcHVfc3RhdHVzX2luZXhhY3QpCisJCSAgICAgIHN0YXR1cyB8PSBzaW1fZnB1X3N0YXR1c191bmRlcmZsb3c7CisJCSAgICAvKiBGbGFnIHRoYXQgcmVzdWx0YW50IHZhbHVlIGhhcyBiZWVuIGRlbm9ybWFsaXplZCAqLworCQkgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX2Rlbm9ybTsKKwkJICB9CisJCWVsc2UgaWYgKChkZW5vcm0gJiBzaW1fZnB1X2Rlbm9ybV91bmRlcmZsb3dfaW5leGFjdCkpCisJCSAgeworCQkgICAgaWYgKChzdGF0dXMgJiBzaW1fZnB1X3N0YXR1c19pbmV4YWN0KSkKKwkJICAgICAgc3RhdHVzIHw9IHNpbV9mcHVfc3RhdHVzX3VuZGVyZmxvdzsKKwkJICB9CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlzdGF0dXMgPSBkb19ub3JtYWxfdW5kZXJmbG93IChmLCBpc19kb3VibGUsIHJvdW5kKTsKKwkgICAgICB9CisJICB9CisJZWxzZSBpZiAoZi0+bm9ybWFsX2V4cCA+IE5PUk1BTF9FWFBNQVgpCisJICB7CisJICAgIC8qIEluZmluaXR5ICovCisJICAgIHN0YXR1cyA9IGRvX25vcm1hbF9vdmVyZmxvdyAoZiwgaXNfZG91YmxlLCByb3VuZCk7CisJICB9CisJZWxzZQorCSAgeworCSAgICBzdGF0dXMgPSBkb19ub3JtYWxfcm91bmQgKGYsIE5SX0dVQVJEUywgcm91bmQpOworCSAgICBpZiAoZi0+ZnJhY3Rpb24gPT0gMCkKKwkgICAgICAvKiBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfemVybzsgKi8KKwkgICAgICBzdGF0dXMgfD0gZG9fbm9ybWFsX3VuZGVyZmxvdyAoZiwgaXNfZG91YmxlLCByb3VuZCk7CisJICAgIGVsc2UgaWYgKGYtPm5vcm1hbF9leHAgPiBOT1JNQUxfRVhQTUFYKQorCSAgICAgIC8qIG9vcHMhIHJvdW5kaW5nIGNhdXNlZCBvdmVyZmxvdyAqLworCSAgICAgIHN0YXR1cyB8PSBkb19ub3JtYWxfb3ZlcmZsb3cgKGYsIGlzX2RvdWJsZSwgcm91bmQpOworCSAgfQorCUFTU0VSVCAoKGYtPmNsYXNzID09IHNpbV9mcHVfY2xhc3NfbnVtYmVyCisJCSB8fCBmLT5jbGFzcyA9PSBzaW1fZnB1X2NsYXNzX2Rlbm9ybSkKKwkJPD0gKGYtPmZyYWN0aW9uIDwgSU1QTElDSVRfMiAmJiBmLT5mcmFjdGlvbiA+PSBJTVBMSUNJVF8xKSk7CisJcmV0dXJuIHN0YXR1czsKKyAgICAgIH0KKyAgICB9CisgIHJldHVybiAwOworfQorCitJTkxJTkVfU0lNX0ZQVSAoaW50KQorc2ltX2ZwdV9yb3VuZF8zMiAoc2ltX2ZwdSAqZiwKKwkJICBzaW1fZnB1X3JvdW5kIHJvdW5kLAorCQkgIHNpbV9mcHVfZGVub3JtIGRlbm9ybSkKK3sKKyAgcmV0dXJuIGRvX3JvdW5kIChmLCAwLCByb3VuZCwgZGVub3JtKTsKK30KKworSU5MSU5FX1NJTV9GUFUgKGludCkKK3NpbV9mcHVfcm91bmRfNjQgKHNpbV9mcHUgKmYsCisJCSAgc2ltX2ZwdV9yb3VuZCByb3VuZCwKKwkJICBzaW1fZnB1X2Rlbm9ybSBkZW5vcm0pCit7CisgIHJldHVybiBkb19yb3VuZCAoZiwgMSwgcm91bmQsIGRlbm9ybSk7Cit9CisKKworCisvKiBBcml0aG1ldGljIG9wcyAqLworCitJTkxJTkVfU0lNX0ZQVSAoaW50KQorc2ltX2ZwdV9hZGQgKHNpbV9mcHUgKmYsCisJICAgICBjb25zdCBzaW1fZnB1ICpsLAorCSAgICAgY29uc3Qgc2ltX2ZwdSAqcikKK3sKKyAgaWYgKHNpbV9mcHVfaXNfc25hbiAobCkpCisgICAgeworICAgICAgKmYgPSAqbDsKKyAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19xbmFuOworICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc25hbjsKKyAgICB9CisgIGlmIChzaW1fZnB1X2lzX3NuYW4gKHIpKQorICAgIHsKKyAgICAgICpmID0gKnI7CisgICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfcW5hbjsKKyAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3NuYW47CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc19xbmFuIChsKSkKKyAgICB7CisgICAgICAqZiA9ICpsOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc19xbmFuIChyKSkKKyAgICB7CisgICAgICAqZiA9ICpyOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc19pbmZpbml0eSAobCkpCisgICAgeworICAgICAgaWYgKHNpbV9mcHVfaXNfaW5maW5pdHkgKHIpCisJICAmJiBsLT5zaWduICE9IHItPnNpZ24pCisJeworCSAgKmYgPSBzaW1fZnB1X3FuYW47CisJICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9pc2k7CisJfQorICAgICAgKmYgPSAqbDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgaWYgKHNpbV9mcHVfaXNfaW5maW5pdHkgKHIpKQorICAgIHsKKyAgICAgICpmID0gKnI7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChzaW1fZnB1X2lzX3plcm8gKGwpKQorICAgIHsKKyAgICAgIGlmIChzaW1fZnB1X2lzX3plcm8gKHIpKQorCXsKKwkgICpmID0gc2ltX2ZwdV96ZXJvOworCSAgZi0+c2lnbiA9IGwtPnNpZ24gJiByLT5zaWduOworCX0KKyAgICAgIGVsc2UKKwkqZiA9ICpyOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc196ZXJvIChyKSkKKyAgICB7CisgICAgICAqZiA9ICpsOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgaW50IHNoaWZ0ID0gbC0+bm9ybWFsX2V4cCAtIHItPm5vcm1hbF9leHA7CisgICAgdW5zaWduZWQ2NCBsZnJhY3Rpb247CisgICAgdW5zaWduZWQ2NCByZnJhY3Rpb247CisgICAgLyogdXNlIGV4cCBvZiBsYXJnZXIgKi8KKyAgICBpZiAoc2hpZnQgPj0gTlJfRlJBQ19HVUFSRCkKKyAgICAgIHsKKwkvKiBsZWZ0IGhhcyBtdWNoIGJpZ2dlciBtYWduaXR1dGUgKi8KKwkqZiA9ICpsOworCXJldHVybiBzaW1fZnB1X3N0YXR1c19pbmV4YWN0OworICAgICAgfQorICAgIGlmIChzaGlmdCA8PSAtIE5SX0ZSQUNfR1VBUkQpCisgICAgICB7CisJLyogcmlnaHQgaGFzIG11Y2ggYmlnZ2VyIG1hZ25pdHV0ZSAqLworCSpmID0gKnI7CisJcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2luZXhhY3Q7CisgICAgICB9CisgICAgbGZyYWN0aW9uID0gbC0+ZnJhY3Rpb247CisgICAgcmZyYWN0aW9uID0gci0+ZnJhY3Rpb247CisgICAgaWYgKHNoaWZ0ID4gMCkKKyAgICAgIHsKKwlmLT5ub3JtYWxfZXhwID0gbC0+bm9ybWFsX2V4cDsKKwlpZiAocmZyYWN0aW9uICYgTFNNQVNLNjQgKHNoaWZ0IC0gMSwgMCkpCisJICB7CisJICAgIHN0YXR1cyB8PSBzaW1fZnB1X3N0YXR1c19pbmV4YWN0OworCSAgICByZnJhY3Rpb24gfD0gTFNCSVQ2NCAoc2hpZnQpOyAvKiBzdGljayBMU0JpdCAqLworCSAgfQorCXJmcmFjdGlvbiA+Pj0gc2hpZnQ7CisgICAgICB9CisgICAgZWxzZSBpZiAoc2hpZnQgPCAwKQorICAgICAgeworCWYtPm5vcm1hbF9leHAgPSByLT5ub3JtYWxfZXhwOworCWlmIChsZnJhY3Rpb24gJiBMU01BU0s2NCAoLSBzaGlmdCAtIDEsIDApKQorCSAgeworCSAgICBzdGF0dXMgfD0gc2ltX2ZwdV9zdGF0dXNfaW5leGFjdDsKKwkgICAgbGZyYWN0aW9uIHw9IExTQklUNjQgKC0gc2hpZnQpOyAvKiBzdGljayBMU0JpdCAqLworCSAgfQorCWxmcmFjdGlvbiA+Pj0gLXNoaWZ0OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwlmLT5ub3JtYWxfZXhwID0gci0+bm9ybWFsX2V4cDsKKyAgICAgIH0KKworICAgIC8qIHBlcmZvcm0gdGhlIGFkZGl0aW9uICovCisgICAgaWYgKGwtPnNpZ24pCisgICAgICBsZnJhY3Rpb24gPSAtIGxmcmFjdGlvbjsKKyAgICBpZiAoci0+c2lnbikKKyAgICAgIHJmcmFjdGlvbiA9IC0gcmZyYWN0aW9uOworICAgIGYtPmZyYWN0aW9uID0gbGZyYWN0aW9uICsgcmZyYWN0aW9uOworCisgICAgLyogemVybz8gKi8KKyAgICBpZiAoZi0+ZnJhY3Rpb24gPT0gMCkKKyAgICAgIHsKKwkqZiA9IHNpbV9mcHVfemVybzsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICAgIC8qIHNpZ24/ICovCisgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX251bWJlcjsKKyAgICBpZiAoKHNpZ25lZDY0KSBmLT5mcmFjdGlvbiA+PSAwKQorICAgICAgZi0+c2lnbiA9IDA7CisgICAgZWxzZQorICAgICAgeworCWYtPnNpZ24gPSAxOworCWYtPmZyYWN0aW9uID0gLSBmLT5mcmFjdGlvbjsKKyAgICAgIH0KKworICAgIC8qIG5vcm1hbGl6ZSBpdCAqLworICAgIGlmICgoZi0+ZnJhY3Rpb24gJiBJTVBMSUNJVF8yKSkKKyAgICAgIHsKKwlmLT5mcmFjdGlvbiA9IChmLT5mcmFjdGlvbiA+PiAxKSB8IChmLT5mcmFjdGlvbiAmIDEpOworCWYtPm5vcm1hbF9leHAgKys7CisgICAgICB9CisgICAgZWxzZSBpZiAoZi0+ZnJhY3Rpb24gPCBJTVBMSUNJVF8xKQorICAgICAgeworCWRvCisJICB7CisJICAgIGYtPmZyYWN0aW9uIDw8PSAxOworCSAgICBmLT5ub3JtYWxfZXhwIC0tOworCSAgfQorCXdoaWxlIChmLT5mcmFjdGlvbiA8IElNUExJQ0lUXzEpOworICAgICAgfQorICAgIEFTU0VSVCAoZi0+ZnJhY3Rpb24gPj0gSU1QTElDSVRfMSAmJiBmLT5mcmFjdGlvbiA8IElNUExJQ0lUXzIpOworICAgIHJldHVybiBzdGF0dXM7CisgIH0KK30KKworCitJTkxJTkVfU0lNX0ZQVSAoaW50KQorc2ltX2ZwdV9zdWIgKHNpbV9mcHUgKmYsCisJICAgICBjb25zdCBzaW1fZnB1ICpsLAorCSAgICAgY29uc3Qgc2ltX2ZwdSAqcikKK3sKKyAgaWYgKHNpbV9mcHVfaXNfc25hbiAobCkpCisgICAgeworICAgICAgKmYgPSAqbDsKKyAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19xbmFuOworICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc25hbjsKKyAgICB9CisgIGlmIChzaW1fZnB1X2lzX3NuYW4gKHIpKQorICAgIHsKKyAgICAgICpmID0gKnI7CisgICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfcW5hbjsKKyAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3NuYW47CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc19xbmFuIChsKSkKKyAgICB7CisgICAgICAqZiA9ICpsOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc19xbmFuIChyKSkKKyAgICB7CisgICAgICAqZiA9ICpyOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc19pbmZpbml0eSAobCkpCisgICAgeworICAgICAgaWYgKHNpbV9mcHVfaXNfaW5maW5pdHkgKHIpCisJICAmJiBsLT5zaWduID09IHItPnNpZ24pCisJeworCSAgKmYgPSBzaW1fZnB1X3FuYW47CisJICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9pc2k7CisJfQorICAgICAgKmYgPSAqbDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgaWYgKHNpbV9mcHVfaXNfaW5maW5pdHkgKHIpKQorICAgIHsKKyAgICAgICpmID0gKnI7CisgICAgICBmLT5zaWduID0gIXItPnNpZ247CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChzaW1fZnB1X2lzX3plcm8gKGwpKQorICAgIHsKKyAgICAgIGlmIChzaW1fZnB1X2lzX3plcm8gKHIpKQorCXsKKwkgICpmID0gc2ltX2ZwdV96ZXJvOworCSAgZi0+c2lnbiA9IGwtPnNpZ24gJiAhci0+c2lnbjsKKwl9CisgICAgICBlbHNlCisJeworCSAgKmYgPSAqcjsKKwkgIGYtPnNpZ24gPSAhci0+c2lnbjsKKwl9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChzaW1fZnB1X2lzX3plcm8gKHIpKQorICAgIHsKKyAgICAgICpmID0gKmw7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIHsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBpbnQgc2hpZnQgPSBsLT5ub3JtYWxfZXhwIC0gci0+bm9ybWFsX2V4cDsKKyAgICB1bnNpZ25lZDY0IGxmcmFjdGlvbjsKKyAgICB1bnNpZ25lZDY0IHJmcmFjdGlvbjsKKyAgICAvKiB1c2UgZXhwIG9mIGxhcmdlciAqLworICAgIGlmIChzaGlmdCA+PSBOUl9GUkFDX0dVQVJEKQorICAgICAgeworCS8qIGxlZnQgaGFzIG11Y2ggYmlnZ2VyIG1hZ25pdHV0ZSAqLworCSpmID0gKmw7CisJcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2luZXhhY3Q7CisgICAgICB9CisgICAgaWYgKHNoaWZ0IDw9IC0gTlJfRlJBQ19HVUFSRCkKKyAgICAgIHsKKwkvKiByaWdodCBoYXMgbXVjaCBiaWdnZXIgbWFnbml0dXRlICovCisJKmYgPSAqcjsKKwlmLT5zaWduID0gIXItPnNpZ247CisJcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2luZXhhY3Q7CisgICAgICB9CisgICAgbGZyYWN0aW9uID0gbC0+ZnJhY3Rpb247CisgICAgcmZyYWN0aW9uID0gci0+ZnJhY3Rpb247CisgICAgaWYgKHNoaWZ0ID4gMCkKKyAgICAgIHsKKwlmLT5ub3JtYWxfZXhwID0gbC0+bm9ybWFsX2V4cDsKKwlpZiAocmZyYWN0aW9uICYgTFNNQVNLNjQgKHNoaWZ0IC0gMSwgMCkpCisJICB7CisJICAgIHN0YXR1cyB8PSBzaW1fZnB1X3N0YXR1c19pbmV4YWN0OworCSAgICByZnJhY3Rpb24gfD0gTFNCSVQ2NCAoc2hpZnQpOyAvKiBzdGljayBMU0JpdCAqLworCSAgfQorCXJmcmFjdGlvbiA+Pj0gc2hpZnQ7CisgICAgICB9CisgICAgZWxzZSBpZiAoc2hpZnQgPCAwKQorICAgICAgeworCWYtPm5vcm1hbF9leHAgPSByLT5ub3JtYWxfZXhwOworCWlmIChsZnJhY3Rpb24gJiBMU01BU0s2NCAoLSBzaGlmdCAtIDEsIDApKQorCSAgeworCSAgICBzdGF0dXMgfD0gc2ltX2ZwdV9zdGF0dXNfaW5leGFjdDsKKwkgICAgbGZyYWN0aW9uIHw9IExTQklUNjQgKC0gc2hpZnQpOyAvKiBzdGljayBMU0JpdCAqLworCSAgfQorCWxmcmFjdGlvbiA+Pj0gLXNoaWZ0OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwlmLT5ub3JtYWxfZXhwID0gci0+bm9ybWFsX2V4cDsKKyAgICAgIH0KKworICAgIC8qIHBlcmZvcm0gdGhlIHN1YnRyYWN0aW9uICovCisgICAgaWYgKGwtPnNpZ24pCisgICAgICBsZnJhY3Rpb24gPSAtIGxmcmFjdGlvbjsKKyAgICBpZiAoIXItPnNpZ24pCisgICAgICByZnJhY3Rpb24gPSAtIHJmcmFjdGlvbjsKKyAgICBmLT5mcmFjdGlvbiA9IGxmcmFjdGlvbiArIHJmcmFjdGlvbjsKKworICAgIC8qIHplcm8/ICovCisgICAgaWYgKGYtPmZyYWN0aW9uID09IDApCisgICAgICB7CisJKmYgPSBzaW1fZnB1X3plcm87CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAvKiBzaWduPyAqLworICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19udW1iZXI7CisgICAgaWYgKChzaWduZWQ2NCkgZi0+ZnJhY3Rpb24gPj0gMCkKKyAgICAgIGYtPnNpZ24gPSAwOworICAgIGVsc2UKKyAgICAgIHsKKwlmLT5zaWduID0gMTsKKwlmLT5mcmFjdGlvbiA9IC0gZi0+ZnJhY3Rpb247CisgICAgICB9CisKKyAgICAvKiBub3JtYWxpemUgaXQgKi8KKyAgICBpZiAoKGYtPmZyYWN0aW9uICYgSU1QTElDSVRfMikpCisgICAgICB7CisJZi0+ZnJhY3Rpb24gPSAoZi0+ZnJhY3Rpb24gPj4gMSkgfCAoZi0+ZnJhY3Rpb24gJiAxKTsKKwlmLT5ub3JtYWxfZXhwICsrOworICAgICAgfQorICAgIGVsc2UgaWYgKGYtPmZyYWN0aW9uIDwgSU1QTElDSVRfMSkKKyAgICAgIHsKKwlkbworCSAgeworCSAgICBmLT5mcmFjdGlvbiA8PD0gMTsKKwkgICAgZi0+bm9ybWFsX2V4cCAtLTsKKwkgIH0KKwl3aGlsZSAoZi0+ZnJhY3Rpb24gPCBJTVBMSUNJVF8xKTsKKyAgICAgIH0KKyAgICBBU1NFUlQgKGYtPmZyYWN0aW9uID49IElNUExJQ0lUXzEgJiYgZi0+ZnJhY3Rpb24gPCBJTVBMSUNJVF8yKTsKKyAgICByZXR1cm4gc3RhdHVzOworICB9Cit9CisKKworSU5MSU5FX1NJTV9GUFUgKGludCkKK3NpbV9mcHVfbXVsIChzaW1fZnB1ICpmLAorCSAgICAgY29uc3Qgc2ltX2ZwdSAqbCwKKwkgICAgIGNvbnN0IHNpbV9mcHUgKnIpCit7CisgIGlmIChzaW1fZnB1X2lzX3NuYW4gKGwpKQorICAgIHsKKyAgICAgICpmID0gKmw7CisgICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfcW5hbjsKKyAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3NuYW47CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc19zbmFuIChyKSkKKyAgICB7CisgICAgICAqZiA9ICpyOworICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3FuYW47CisgICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zbmFuOworICAgIH0KKyAgaWYgKHNpbV9mcHVfaXNfcW5hbiAobCkpCisgICAgeworICAgICAgKmYgPSAqbDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgaWYgKHNpbV9mcHVfaXNfcW5hbiAocikpCisgICAgeworICAgICAgKmYgPSAqcjsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgaWYgKHNpbV9mcHVfaXNfaW5maW5pdHkgKGwpKQorICAgIHsKKyAgICAgIGlmIChzaW1fZnB1X2lzX3plcm8gKHIpKQorCXsKKwkgICpmID0gc2ltX2ZwdV9xbmFuOworCSAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfaW16OworCX0KKyAgICAgICpmID0gKmw7CisgICAgICBmLT5zaWduID0gbC0+c2lnbiBeIHItPnNpZ247CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChzaW1fZnB1X2lzX2luZmluaXR5IChyKSkKKyAgICB7CisgICAgICBpZiAoc2ltX2ZwdV9pc196ZXJvIChsKSkKKwl7CisJICAqZiA9IHNpbV9mcHVfcW5hbjsKKwkgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2ltejsKKwl9CisgICAgICAqZiA9ICpyOworICAgICAgZi0+c2lnbiA9IGwtPnNpZ24gXiByLT5zaWduOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc196ZXJvIChsKSB8fCBzaW1fZnB1X2lzX3plcm8gKHIpKQorICAgIHsKKyAgICAgICpmID0gc2ltX2ZwdV96ZXJvOworICAgICAgZi0+c2lnbiA9IGwtPnNpZ24gXiByLT5zaWduOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAvKiBDYWxjdWxhdGUgdGhlIG1hbnRpc3NhIGJ5IG11bHRpcGx5aW5nIGJvdGggNjRiaXQgbnVtYmVycyB0byBnZXQgYQorICAgICAxMjggYml0IG51bWJlciAqLworICB7CisgICAgdW5zaWduZWQ2NCBsb3c7CisgICAgdW5zaWduZWQ2NCBoaWdoOworICAgIHVuc2lnbmVkNjQgbmwgPSBsLT5mcmFjdGlvbiAmIDB4ZmZmZmZmZmY7CisgICAgdW5zaWduZWQ2NCBuaCA9IGwtPmZyYWN0aW9uID4+IDMyOworICAgIHVuc2lnbmVkNjQgbWwgPSByLT5mcmFjdGlvbiAmIDB4ZmZmZmZmZmY7CisgICAgdW5zaWduZWQ2NCBtaCA9IHItPmZyYWN0aW9uID4+MzI7CisgICAgdW5zaWduZWQ2NCBwcF9sbCA9IG1sICogbmw7CisgICAgdW5zaWduZWQ2NCBwcF9obCA9IG1oICogbmw7CisgICAgdW5zaWduZWQ2NCBwcF9saCA9IG1sICogbmg7CisgICAgdW5zaWduZWQ2NCBwcF9oaCA9IG1oICogbmg7CisgICAgdW5zaWduZWQ2NCByZXMyID0gMDsKKyAgICB1bnNpZ25lZDY0IHJlczAgPSAwOworICAgIHVuc2lnbmVkNjQgcHNfaGhfXyA9IHBwX2hsICsgcHBfbGg7CisgICAgaWYgKHBzX2hoX18gPCBwcF9obCkKKyAgICAgIHJlczIgKz0gVU5TSUdORUQ2NCAoMHgxMDAwMDAwMDApOworICAgIHBwX2hsID0gKHBzX2hoX18gPDwgMzIpICYgVU5TSUdORUQ2NCAoMHhmZmZmZmZmZjAwMDAwMDAwKTsKKyAgICByZXMwID0gcHBfbGwgKyBwcF9obDsKKyAgICBpZiAocmVzMCA8IHBwX2xsKQorICAgICAgcmVzMisrOworICAgIHJlczIgKz0gKChwc19oaF9fID4+IDMyKSAmIDB4ZmZmZmZmZmYpICsgcHBfaGg7CisgICAgaGlnaCA9IHJlczI7CisgICAgbG93ID0gcmVzMDsKKyAgICAKKyAgICBmLT5ub3JtYWxfZXhwID0gbC0+bm9ybWFsX2V4cCArIHItPm5vcm1hbF9leHA7CisgICAgZi0+c2lnbiA9IGwtPnNpZ24gXiByLT5zaWduOworICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19udW1iZXI7CisKKyAgICAvKiBJbnB1dCBpcyBib3VuZGVkIGJ5IFsxLDIpICAgOyAgIFsyXjYwLDJeNjEpCisgICAgICAgT3V0cHV0IGlzIGJvdW5kZWQgYnkgWzEsNCkgIDsgICBbMl4xMjAsMl4xMjIpICovCisgCisgICAgLyogQWRqdXN0IHRoZSBleHBvbmVudCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlIGRlY2ltYWwgcG9pbnQgZW5kZWQKKyAgICAgICB1cCBpbiB0aGUgaGlnaCA2NCBiaXQgd29yZC4gIEluIHRoZSBzb3VyY2UgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICAgICB3YXMgYXQgTlJfRlJBQ19HVUFSRC4gKi8KKyAgICBmLT5ub3JtYWxfZXhwICs9IE5SX0ZSQUNfR1VBUkQgKyA2NCAtIChOUl9GUkFDX0dVQVJEICogMik7CisKKyAgICAvKiBUaGUgaGlnaCB3b3JkIGlzIGJvdW5kZWQgYWNjb3JkaW5nIHRvIHRoZSBhYm92ZS4gIENvbnNlcXVlbnRseQorICAgICAgIGl0IGhhcyBuZXZlciBvdmVyZmxvd2VkIGludG8gSU1QTElDSVRfMi4gKi8KKyAgICBBU1NFUlQgKGhpZ2ggPCBMU0JJVDY0ICgoKE5SX0ZSQUNfR1VBUkQgKyAxKSAqIDIpIC0gNjQpKTsKKyAgICBBU1NFUlQgKGhpZ2ggPj0gTFNCSVQ2NCAoKE5SX0ZSQUNfR1VBUkQgKiAyKSAtIDY0KSk7CisgICAgQVNTRVJUIChMU0JJVDY0ICgoKE5SX0ZSQUNfR1VBUkQgKyAxKSAqIDIpIC0gNjQpIDwgSU1QTElDSVRfMSk7CisKKyNpZiAwCisgICAgcHJpbnRmICgiXG4iKTsKKyAgICBwcmludF9iaXRzIChoaWdoLCA2MywgKHNpbV9mcHVfcHJpbnRfZnVuYyopZnByaW50Ziwgc3Rkb3V0KTsKKyAgICBwcmludGYgKCI7Iik7CisgICAgcHJpbnRfYml0cyAobG93LCA2MywgKHNpbV9mcHVfcHJpbnRfZnVuYyopZnByaW50Ziwgc3Rkb3V0KTsKKyAgICBwcmludGYgKCJcbiIpOworI2VuZGlmCisKKyAgICAvKiBub3JtYWxpemUgKi8KKyAgICBkbworICAgICAgeworCWYtPm5vcm1hbF9leHAtLTsKKwloaWdoIDw8PSAxOworCWlmIChsb3cgJiBMU0JJVDY0ICg2MykpCisJICBoaWdoIHw9IDE7CisJbG93IDw8PSAxOworICAgICAgfQorICAgIHdoaWxlIChoaWdoIDwgSU1QTElDSVRfMSk7CisKKyNpZiAwCisgICAgcHJpbnRfYml0cyAoaGlnaCwgNjMsIChzaW1fZnB1X3ByaW50X2Z1bmMqKWZwcmludGYsIHN0ZG91dCk7CisgICAgcHJpbnRmICgiOyIpOworICAgIHByaW50X2JpdHMgKGxvdywgNjMsIChzaW1fZnB1X3ByaW50X2Z1bmMqKWZwcmludGYsIHN0ZG91dCk7CisgICAgcHJpbnRmICgiXG4iKTsKKyNlbmRpZgorCisgICAgQVNTRVJUIChoaWdoID49IElNUExJQ0lUXzEgJiYgaGlnaCA8IElNUExJQ0lUXzIpOworICAgIGlmIChsb3cgIT0gMCkKKyAgICAgIHsKKwlmLT5mcmFjdGlvbiA9IChoaWdoIHwgMSk7IC8qIHN0aWNreSAqLworCXJldHVybiBzaW1fZnB1X3N0YXR1c19pbmV4YWN0OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwlmLT5mcmFjdGlvbiA9IGhpZ2g7CisJcmV0dXJuIDA7CisgICAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworSU5MSU5FX1NJTV9GUFUgKGludCkKK3NpbV9mcHVfZGl2IChzaW1fZnB1ICpmLAorCSAgICAgY29uc3Qgc2ltX2ZwdSAqbCwKKwkgICAgIGNvbnN0IHNpbV9mcHUgKnIpCit7CisgIGlmIChzaW1fZnB1X2lzX3NuYW4gKGwpKQorICAgIHsKKyAgICAgICpmID0gKmw7CisgICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfcW5hbjsKKyAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3NuYW47CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc19zbmFuIChyKSkKKyAgICB7CisgICAgICAqZiA9ICpyOworICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3FuYW47CisgICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zbmFuOworICAgIH0KKyAgaWYgKHNpbV9mcHVfaXNfcW5hbiAobCkpCisgICAgeworICAgICAgKmYgPSAqbDsKKyAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19xbmFuOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc19xbmFuIChyKSkKKyAgICB7CisgICAgICAqZiA9ICpyOworICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3FuYW47CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChzaW1fZnB1X2lzX2luZmluaXR5IChsKSkKKyAgICB7CisgICAgICBpZiAoc2ltX2ZwdV9pc19pbmZpbml0eSAocikpCisJeworCSAgKmYgPSBzaW1fZnB1X3FuYW47CisJICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9pZGk7CisJfQorICAgICAgZWxzZQorCXsKKwkgICpmID0gKmw7CisJICBmLT5zaWduID0gbC0+c2lnbiBeIHItPnNpZ247CisJICByZXR1cm4gMDsKKwl9CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc196ZXJvIChsKSkKKyAgICB7CisgICAgICBpZiAoc2ltX2ZwdV9pc196ZXJvIChyKSkKKwl7CisJICAqZiA9IHNpbV9mcHVfcW5hbjsKKwkgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3pkejsKKwl9CisgICAgICBlbHNlCisJeworCSAgKmYgPSAqbDsKKwkgIGYtPnNpZ24gPSBsLT5zaWduIF4gci0+c2lnbjsKKwkgIHJldHVybiAwOworCX0KKyAgICB9CisgIGlmIChzaW1fZnB1X2lzX2luZmluaXR5IChyKSkKKyAgICB7CisgICAgICAqZiA9IHNpbV9mcHVfemVybzsKKyAgICAgIGYtPnNpZ24gPSBsLT5zaWduIF4gci0+c2lnbjsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgaWYgKHNpbV9mcHVfaXNfemVybyAocikpCisgICAgeworICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX2luZmluaXR5OworICAgICAgZi0+c2lnbiA9IGwtPnNpZ24gXiByLT5zaWduOworICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfZGl2MDsKKyAgICB9CisKKyAgLyogQ2FsY3VsYXRlIHRoZSBtYW50aXNzYSBieSBtdWx0aXBseWluZyBib3RoIDY0Yml0IG51bWJlcnMgdG8gZ2V0IGEKKyAgICAgMTI4IGJpdCBudW1iZXIgKi8KKyAgeworICAgIC8qIHF1b3RpZW50ID0gICggKCBudW1lcmF0b3IgLyBkZW5vbWluYXRvcikKKyAgICAgICAgICAgICAgICAgICAgICB4IDJeKG51bWVyYXRvciBleHBvbmVudCAtICBkZW5vbWluYXRvciBleHBvbmVudCkKKyAgICAgKi8KKyAgICB1bnNpZ25lZDY0IG51bWVyYXRvcjsKKyAgICB1bnNpZ25lZDY0IGRlbm9taW5hdG9yOworICAgIHVuc2lnbmVkNjQgcXVvdGllbnQ7CisgICAgdW5zaWduZWQ2NCBiaXQ7CisKKyAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfbnVtYmVyOworICAgIGYtPnNpZ24gPSBsLT5zaWduIF4gci0+c2lnbjsKKyAgICBmLT5ub3JtYWxfZXhwID0gbC0+bm9ybWFsX2V4cCAtIHItPm5vcm1hbF9leHA7CisKKyAgICBudW1lcmF0b3IgPSBsLT5mcmFjdGlvbjsKKyAgICBkZW5vbWluYXRvciA9IHItPmZyYWN0aW9uOworCisgICAgLyogRnJhY3Rpb24gd2lsbCBiZSBsZXNzIHRoYW4gMS4wICovCisgICAgaWYgKG51bWVyYXRvciA8IGRlbm9taW5hdG9yKQorICAgICAgeworCW51bWVyYXRvciA8PD0gMTsKKwlmLT5ub3JtYWxfZXhwLS07CisgICAgICB9CisgICAgQVNTRVJUIChudW1lcmF0b3IgPj0gZGVub21pbmF0b3IpOworICAgIAorICAgIC8qIEdhaW4gZXh0cmEgcHJlY2lzaW9uLCBhbHJlYWR5IHVzZWQgb25lIHNwYXJlIGJpdCAqLworICAgIG51bWVyYXRvciA8PD0gICAgTlJfU1BBUkU7CisgICAgZGVub21pbmF0b3IgPDw9ICBOUl9TUEFSRTsKKworICAgIC8qIERvZXMgZGl2aWRlIG9uZSBiaXQgYXQgYSB0aW1lLiAgT3B0aW1pemU/Pz8gICovCisgICAgcXVvdGllbnQgPSAwOworICAgIGJpdCA9IChJTVBMSUNJVF8xIDw8IE5SX1NQQVJFKTsKKyAgICB3aGlsZSAoYml0KQorICAgICAgeworCWlmIChudW1lcmF0b3IgPj0gZGVub21pbmF0b3IpCisJICB7CisJICAgIHF1b3RpZW50IHw9IGJpdDsKKwkgICAgbnVtZXJhdG9yIC09IGRlbm9taW5hdG9yOworCSAgfQorCWJpdCA+Pj0gMTsKKwludW1lcmF0b3IgPDw9IDE7CisgICAgICB9CisKKyNpZiAwCisgICAgcHJpbnRmICgiXG4iKTsKKyAgICBwcmludF9iaXRzIChxdW90aWVudCwgNjMsIChzaW1fZnB1X3ByaW50X2Z1bmMqKWZwcmludGYsIHN0ZG91dCk7CisgICAgcHJpbnRmICgiXG4iKTsKKyAgICBwcmludF9iaXRzIChudW1lcmF0b3IsIDYzLCAoc2ltX2ZwdV9wcmludF9mdW5jKilmcHJpbnRmLCBzdGRvdXQpOworICAgIHByaW50ZiAoIlxuIik7CisgICAgcHJpbnRfYml0cyAoZGVub21pbmF0b3IsIDYzLCAoc2ltX2ZwdV9wcmludF9mdW5jKilmcHJpbnRmLCBzdGRvdXQpOworICAgIHByaW50ZiAoIlxuIik7CisjZW5kaWYKKworICAgIC8qIGRpc2NhcmQgKGJ1dCBzYXZlKSB0aGUgZXh0cmEgYml0cyAqLworICAgIGlmICgocXVvdGllbnQgJiBMU01BU0s2NCAoTlJfU1BBUkUgLTEsIDApKSkKKyAgICAgIHF1b3RpZW50ID0gKHF1b3RpZW50ID4+IE5SX1NQQVJFKSB8IDE7CisgICAgZWxzZQorICAgICAgcXVvdGllbnQgPSAocXVvdGllbnQgPj4gTlJfU1BBUkUpOworCisgICAgZi0+ZnJhY3Rpb24gPSBxdW90aWVudDsKKyAgICBBU1NFUlQgKGYtPmZyYWN0aW9uID49IElNUExJQ0lUXzEgJiYgZi0+ZnJhY3Rpb24gPCBJTVBMSUNJVF8yKTsKKyAgICBpZiAobnVtZXJhdG9yICE9IDApCisgICAgICB7CisJZi0+ZnJhY3Rpb24gfD0gMTsgLyogc3RpY2sgcmVtYWluaW5nIGJpdHMgKi8KKwlyZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW5leGFjdDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gMDsKKyAgfQorfQorCisKK0lOTElORV9TSU1fRlBVIChpbnQpCitzaW1fZnB1X21heCAoc2ltX2ZwdSAqZiwKKwkgICAgIGNvbnN0IHNpbV9mcHUgKmwsCisJICAgICBjb25zdCBzaW1fZnB1ICpyKQoreworICBpZiAoc2ltX2ZwdV9pc19zbmFuIChsKSkKKyAgICB7CisgICAgICAqZiA9ICpsOworICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3FuYW47CisgICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zbmFuOworICAgIH0KKyAgaWYgKHNpbV9mcHVfaXNfc25hbiAocikpCisgICAgeworICAgICAgKmYgPSAqcjsKKyAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19xbmFuOworICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc25hbjsKKyAgICB9CisgIGlmIChzaW1fZnB1X2lzX3FuYW4gKGwpKQorICAgIHsKKyAgICAgICpmID0gKmw7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChzaW1fZnB1X2lzX3FuYW4gKHIpKQorICAgIHsKKyAgICAgICpmID0gKnI7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChzaW1fZnB1X2lzX2luZmluaXR5IChsKSkKKyAgICB7CisgICAgICBpZiAoc2ltX2ZwdV9pc19pbmZpbml0eSAocikKKwkgICYmIGwtPnNpZ24gPT0gci0+c2lnbikKKwl7CisJICAqZiA9IHNpbV9mcHVfcW5hbjsKKwkgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2lzaTsKKwl9CisgICAgICBpZiAobC0+c2lnbikKKwkqZiA9ICpyOyAvKiAtaW5mIDwgYW55dGhpbmcgKi8KKyAgICAgIGVsc2UKKwkqZiA9ICpsOyAvKiAraW5mID4gYW50aGluZyAqLworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc19pbmZpbml0eSAocikpCisgICAgeworICAgICAgaWYgKHItPnNpZ24pCisJKmYgPSAqbDsgLyogYW55dGhpbmcgPiAtaW5mICovCisgICAgICBlbHNlCisJKmYgPSAqcjsgLyogYW50aGluZyA8ICtpbmYgKi8KKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgaWYgKGwtPnNpZ24gPiByLT5zaWduKQorICAgIHsKKyAgICAgICpmID0gKnI7IC8qIC12ZSA8ICt2ZSAqLworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAobC0+c2lnbiA8IHItPnNpZ24pCisgICAgeworICAgICAgKmYgPSAqbDsgLyogK3ZlID4gLXZlICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIEFTU0VSVCAobC0+c2lnbiA9PSByLT5zaWduKTsKKyAgaWYgKGwtPm5vcm1hbF9leHAgPiByLT5ub3JtYWxfZXhwCisgICAgICB8fCAobC0+bm9ybWFsX2V4cCA9PSByLT5ub3JtYWxfZXhwICYmIAorCSAgbC0+ZnJhY3Rpb24gPiByLT5mcmFjdGlvbikpCisgICAgeworICAgICAgLyogfGx8ID4gfHJ8ICovCisgICAgICBpZiAobC0+c2lnbikKKwkqZiA9ICpyOyAvKiAtdmUgPCAtdmUgKi8KKyAgICAgIGVsc2UKKwkqZiA9ICpsOyAvKiArdmUgPiArdmUgKi8KKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHxsfCA8PSB8cnwgKi8KKyAgICAgIGlmIChsLT5zaWduKQorCSpmID0gKmw7IC8qIC12ZSA+IC12ZSAqLworICAgICAgZWxzZQorCSpmID0gKnI7IC8qICt2ZSA8ICt2ZSAqLworICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisKK0lOTElORV9TSU1fRlBVIChpbnQpCitzaW1fZnB1X21pbiAoc2ltX2ZwdSAqZiwKKwkgICAgIGNvbnN0IHNpbV9mcHUgKmwsCisJICAgICBjb25zdCBzaW1fZnB1ICpyKQoreworICBpZiAoc2ltX2ZwdV9pc19zbmFuIChsKSkKKyAgICB7CisgICAgICAqZiA9ICpsOworICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3FuYW47CisgICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zbmFuOworICAgIH0KKyAgaWYgKHNpbV9mcHVfaXNfc25hbiAocikpCisgICAgeworICAgICAgKmYgPSAqcjsKKyAgICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19xbmFuOworICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc25hbjsKKyAgICB9CisgIGlmIChzaW1fZnB1X2lzX3FuYW4gKGwpKQorICAgIHsKKyAgICAgICpmID0gKmw7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChzaW1fZnB1X2lzX3FuYW4gKHIpKQorICAgIHsKKyAgICAgICpmID0gKnI7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChzaW1fZnB1X2lzX2luZmluaXR5IChsKSkKKyAgICB7CisgICAgICBpZiAoc2ltX2ZwdV9pc19pbmZpbml0eSAocikKKwkgICYmIGwtPnNpZ24gPT0gci0+c2lnbikKKwl7CisJICAqZiA9IHNpbV9mcHVfcW5hbjsKKwkgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2lzaTsKKwl9CisgICAgICBpZiAobC0+c2lnbikKKwkqZiA9ICpsOyAvKiAtaW5mIDwgYW55dGhpbmcgKi8KKyAgICAgIGVsc2UKKwkqZiA9ICpyOyAvKiAraW5mID4gYW50aGluZyAqLworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc19pbmZpbml0eSAocikpCisgICAgeworICAgICAgaWYgKHItPnNpZ24pCisJKmYgPSAqcjsgLyogYW55dGhpbmcgPiAtaW5mICovCisgICAgICBlbHNlCisJKmYgPSAqbDsgLyogYW55dGhpbmcgPCAraW5mICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChsLT5zaWduID4gci0+c2lnbikKKyAgICB7CisgICAgICAqZiA9ICpsOyAvKiAtdmUgPCArdmUgKi8KKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgaWYgKGwtPnNpZ24gPCByLT5zaWduKQorICAgIHsKKyAgICAgICpmID0gKnI7IC8qICt2ZSA+IC12ZSAqLworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBBU1NFUlQgKGwtPnNpZ24gPT0gci0+c2lnbik7CisgIGlmIChsLT5ub3JtYWxfZXhwID4gci0+bm9ybWFsX2V4cAorICAgICAgfHwgKGwtPm5vcm1hbF9leHAgPT0gci0+bm9ybWFsX2V4cCAmJiAKKwkgIGwtPmZyYWN0aW9uID4gci0+ZnJhY3Rpb24pKQorICAgIHsKKyAgICAgIC8qIHxsfCA+IHxyfCAqLworICAgICAgaWYgKGwtPnNpZ24pCisJKmYgPSAqbDsgLyogLXZlIDwgLXZlICovCisgICAgICBlbHNlCisJKmYgPSAqcjsgLyogK3ZlID4gK3ZlICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiB8bHwgPD0gfHJ8ICovCisgICAgICBpZiAobC0+c2lnbikKKwkqZiA9ICpyOyAvKiAtdmUgPiAtdmUgKi8KKyAgICAgIGVsc2UKKwkqZiA9ICpsOyAvKiArdmUgPCArdmUgKi8KKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworCitJTkxJTkVfU0lNX0ZQVSAoaW50KQorc2ltX2ZwdV9uZWcgKHNpbV9mcHUgKmYsCisJICAgICBjb25zdCBzaW1fZnB1ICpyKQoreworICBpZiAoc2ltX2ZwdV9pc19zbmFuIChyKSkKKyAgICB7CisgICAgICAqZiA9ICpyOworICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3FuYW47CisgICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zbmFuOworICAgIH0KKyAgaWYgKHNpbV9mcHVfaXNfcW5hbiAocikpCisgICAgeworICAgICAgKmYgPSAqcjsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgKmYgPSAqcjsKKyAgZi0+c2lnbiA9ICFyLT5zaWduOworICByZXR1cm4gMDsKK30KKworCitJTkxJTkVfU0lNX0ZQVSAoaW50KQorc2ltX2ZwdV9hYnMgKHNpbV9mcHUgKmYsCisJICAgICBjb25zdCBzaW1fZnB1ICpyKQoreworICBpZiAoc2ltX2ZwdV9pc19zbmFuIChyKSkKKyAgICB7CisgICAgICAqZiA9ICpyOworICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3FuYW47CisgICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zbmFuOworICAgIH0KKyAgaWYgKHNpbV9mcHVfaXNfcW5hbiAocikpCisgICAgeworICAgICAgKmYgPSAqcjsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgKmYgPSAqcjsKKyAgZi0+c2lnbiA9IDA7CisgIHJldHVybiAwOworfQorCisKK0lOTElORV9TSU1fRlBVIChpbnQpCitzaW1fZnB1X2ludiAoc2ltX2ZwdSAqZiwKKwkgICAgIGNvbnN0IHNpbV9mcHUgKnIpCit7CisgIGlmIChzaW1fZnB1X2lzX3NuYW4gKHIpKQorICAgIHsKKyAgICAgICpmID0gKnI7CisgICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfcW5hbjsKKyAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3NuYW47CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc19xbmFuIChyKSkKKyAgICB7CisgICAgICAqZiA9ICpyOworICAgICAgZi0+Y2xhc3MgPSBzaW1fZnB1X2NsYXNzX3FuYW47CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChzaW1fZnB1X2lzX2luZmluaXR5IChyKSkKKyAgICB7CisgICAgICAqZiA9IHNpbV9mcHVfemVybzsKKyAgICAgIGYtPnNpZ24gPSByLT5zaWduOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc196ZXJvIChyKSkKKyAgICB7CisgICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfaW5maW5pdHk7CisgICAgICBmLT5zaWduID0gci0+c2lnbjsKKyAgICAgIHJldHVybiBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2RpdjA7CisgICAgfQorICAqZiA9ICpyOworICBmLT5ub3JtYWxfZXhwID0gLSByLT5ub3JtYWxfZXhwOworICByZXR1cm4gMDsKK30KKworCitJTkxJTkVfU0lNX0ZQVSAoaW50KQorc2ltX2ZwdV9zcXJ0IChzaW1fZnB1ICpmLAorCSAgICAgIGNvbnN0IHNpbV9mcHUgKnIpCit7CisgIGlmIChzaW1fZnB1X2lzX3NuYW4gKHIpKQorICAgIHsKKyAgICAgICpmID0gc2ltX2ZwdV9xbmFuOworICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc25hbjsKKyAgICB9CisgIGlmIChzaW1fZnB1X2lzX3FuYW4gKHIpKQorICAgIHsKKyAgICAgICpmID0gc2ltX2ZwdV9xbmFuOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc196ZXJvIChyKSkKKyAgICB7CisgICAgICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfemVybzsKKyAgICAgIGYtPnNpZ24gPSByLT5zaWduOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBpZiAoc2ltX2ZwdV9pc19pbmZpbml0eSAocikpCisgICAgeworICAgICAgaWYgKHItPnNpZ24pCisJeworCSAgKmYgPSBzaW1fZnB1X3FuYW47CisJICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zcXJ0OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBmLT5jbGFzcyA9IHNpbV9mcHVfY2xhc3NfaW5maW5pdHk7CisJICBmLT5zaWduID0gMDsKKwkgIGYtPnNpZ24gPSAwOworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKyAgaWYgKHItPnNpZ24pCisgICAgeworICAgICAgKmYgPSBzaW1fZnB1X3FuYW47CisgICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zcXJ0OworICAgIH0KKworICAvKiBAKCMpZV9zcXJ0LmMgNS4xIDkzLzA5LzI0ICovCisgIC8qCisgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICogQ29weXJpZ2h0IChDKSAxOTkzIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgICoKKyAgICogRGV2ZWxvcGVkIGF0IFN1blBybywgYSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJ1c2luZXNzLgorICAgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgICAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICAgKiBpcyBwcmVzZXJ2ZWQuCisgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICovCisgIAorICAvKiBfX2llZWU3NTRfc3FydCh4KQorICAgKiBSZXR1cm4gY29ycmVjdGx5IHJvdW5kZWQgc3FydC4KKyAgICogICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgKiAgICAgICAgICAgfCAgVXNlIHRoZSBoYXJkd2FyZSBzcXJ0IGlmIHlvdSBoYXZlIG9uZSB8CisgICAqICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogTWV0aG9kOiAKKyAgICogICBCaXQgYnkgYml0IG1ldGhvZCB1c2luZyBpbnRlZ2VyIGFyaXRobWV0aWMuIChTbG93LCBidXQgcG9ydGFibGUpIAorICAgKiAgIDEuIE5vcm1hbGl6YXRpb24KKyAgICoJU2NhbGUgeCB0byB5IGluIFsxLDQpIHdpdGggZXZlbiBwb3dlcnMgb2YgMjogCisgICAqCWZpbmQgYW4gaW50ZWdlciBrIHN1Y2ggdGhhdCAgMSA8PSAoeT14KjJeKDJrKSkgPCA0LCB0aGVuCisgICAqCQlzcXJ0KHgpID0gMl5rICogc3FydCh5KQorICAgLQorICAgLSBTaW5jZToKKyAgIC0gICBzcXJ0ICggeCoyXigybSkgKSAgICAgPSBzcXJ0KHgpLjJebSAgICA7IG0gZXZlbgorICAgLSAgIHNxcnQgKCB4KjJeKDJtICsgMSkgKSA9IHNxcnQoMi54KS4yXm0gIDsgbSBvZGQKKyAgIC0gRGVmaW5lOgorICAgLSAgIHkgPSAoKG0gZXZlbikgPyB4IDogMi54KQorICAgLSBUaGVuOgorICAgLSAgIHkgaW4gWzEsIDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgW0lNUExJQ0lUXzEsSU1QTElDSVRfNCkKKyAgIC0gQW5kOgorICAgLSAgIHNxcnQgKHkpIGluIFsxLCAyKSAgICAgICAgICAgICAgICAgICAgIDsgW0lNUExJQ0lUXzEsSU1QTElDSVRfMikKKyAgIC0KKyAgICogICAyLiBCaXQgYnkgYml0IGNvbXB1dGF0aW9uCisgICAqCUxldCBxICA9IHNxcnQoeSkgdHJ1bmNhdGVkIHRvIGkgYml0IGFmdGVyIGJpbmFyeSBwb2ludCAocSA9IDEpLAorICAgKgkgICAgIGkJCQkJCQkJIDAKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsxICAgICAgICAgMgorICAgKgkgICAgcyAgPSAyKnEgLCBhbmQJeSAgPSAgMiAgICogKCB5IC0gcSAgKS4JCSgxKQorICAgKgkgICAgIGkgICAgICBpICAgICAgICAgICAgaSAgICAgICAgICAgICAgICAgaQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAqCVRvIGNvbXB1dGUgcSAgICBmcm9tIHEgLCBvbmUgY2hlY2tzIHdoZXRoZXIgCisgICAqCQkgICAgaSsxICAgICAgIGkgICAgICAgICAgICAgICAgICAgICAgIAorICAgKgorICAgKgkJCSAgICAgIC0oaSsxKSAyCisgICAqCQkJKHEgKyAyICAgICAgKSA8PSB5LgkJCSgyKQorICAgKiAgICAgCQkJICBpCisgICAqCQkJCQkJCSAgICAgIC0oaSsxKQorICAgKglJZiAoMikgaXMgZmFsc2UsIHRoZW4gcSAgID0gcSA7IG90aGVyd2lzZSBxICAgPSBxICArIDIgICAgICAuCisgICAqCQkgCSAgICAgICBpKzEgICBpICAgICAgICAgICAgIGkrMSAgIGkKKyAgICoKKyAgICoJV2l0aCBzb21lIGFsZ2VicmljIG1hbmlwdWxhdGlvbiwgaXQgaXMgbm90IGRpZmZpY3VsdCB0byBzZWUKKyAgICoJdGhhdCAoMikgaXMgZXF1aXZhbGVudCB0byAKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oaSsxKQorICAgKgkJCXMgICsgIDIgICAgICAgPD0geQkJCSgzKQorICAgKgkJCSBpICAgICAgICAgICAgICAgIGkKKyAgICoKKyAgICoJVGhlIGFkdmFudGFnZSBvZiAoMykgaXMgdGhhdCBzICBhbmQgeSAgY2FuIGJlIGNvbXB1dGVkIGJ5IAorICAgKgkJCQkgICAgICBpICAgICAgaQorICAgKgl0aGUgZm9sbG93aW5nIHJlY3VycmVuY2UgZm9ybXVsYToKKyAgICoJICAgIGlmICgzKSBpcyBmYWxzZQorICAgKgorICAgKgkgICAgcyAgICAgPSAgcyAgLAl5ICAgID0geSAgIDsJCQkoNCkKKyAgICoJICAgICBpKzEgICAgICBpCQkgaSsxICAgIGkKKyAgICoKKyAgIC0KKyAgIC0gICAgICAgICAgICAgICAgICAgICAgTk9URTogeSAgICA9IDIqeQorICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsxICAgICAgaQorICAgLQorICAgKgkgICAgb3RoZXJ3aXNlLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgLWkgICAgICAgICAgICAgICAgICAgICAgLShpKzEpCisgICAqCSAgICBzCSAgPSAgcyAgKyAyICAsICB5ICAgID0geSAgLSAgcyAgLSAyICAJCSg1KQorICAgKiAgICAgICAgIGkrMSAgICAgIGkgICAgICAgICAgaSsxICAgIGkgICAgIGkKKyAgICoJCQkJCisgICAtCisgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShpKzEpCisgICAtICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IHkgICAgPSAyICh5ICAtICBzICAtICAyICAgICAgKSAJCQorICAgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsxICAgICAgIGkgICAgIGkKKyAgIC0KKyAgICoJT25lIG1heSBlYXNpbHkgdXNlIGluZHVjdGlvbiB0byBwcm92ZSAoNCkgYW5kICg1KS4gCisgICAqCU5vdGUuIFNpbmNlIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiAoMykgY29udGFpbiBvbmx5IGkrMiBiaXRzLAorICAgKgkgICAgICBpdCBkb2VzIG5vdCBuZWNlc3NhcnkgdG8gZG8gYSBmdWxsICg1My1iaXQpIGNvbXBhcmlzb24gCisgICAqCSAgICAgIGluICgzKS4KKyAgICogICAzLiBGaW5hbCByb3VuZGluZworICAgKglBZnRlciBnZW5lcmF0aW5nIHRoZSA1MyBiaXRzIHJlc3VsdCwgd2UgY29tcHV0ZSBvbmUgbW9yZSBiaXQuCisgICAqCVRvZ2V0aGVyIHdpdGggdGhlIHJlbWFpbmRlciwgd2UgY2FuIGRlY2lkZSB3aGV0aGVyIHRoZQorICAgKglyZXN1bHQgaXMgZXhhY3QsIGJpZ2dlciB0aGFuIDEvMnVscCwgb3IgbGVzcyB0aGFuIDEvMnVscAorICAgKgkoaXQgd2lsbCBuZXZlciBlcXVhbCB0byAxLzJ1bHApLgorICAgKglUaGUgcm91bmRpbmcgbW9kZSBjYW4gYmUgZGV0ZWN0ZWQgYnkgY2hlY2tpbmcgd2hldGhlcgorICAgKglodWdlICsgdGlueSBpcyBlcXVhbCB0byBodWdlLCBhbmQgd2hldGhlciBodWdlIC0gdGlueSBpcworICAgKgllcXVhbCB0byBodWdlIGZvciBzb21lIGZsb2F0aW5nIHBvaW50IG51bWJlciAiaHVnZSIgYW5kICJ0aW55Ii4KKyAgICoJCQorICAgKiBTcGVjaWFsIGNhc2VzOgorICAgKglzcXJ0KCstMCkgPSArLTAgCS4uLiBleGFjdAorICAgKglzcXJ0KGluZikgPSBpbmYKKyAgICoJc3FydCgtdmUpID0gTmFOCQkuLi4gd2l0aCBpbnZhbGlkIHNpZ25hbAorICAgKglzcXJ0KE5hTikgPSBOYU4JCS4uLiB3aXRoIGludmFsaWQgc2lnbmFsIGZvciBzaWduYWxpbmcgTmFOCisgICAqCisgICAqIE90aGVyIG1ldGhvZHMgOiBzZWUgdGhlIGFwcGVuZGVkIGZpbGUgYXQgdGhlIGVuZCBvZiB0aGUgcHJvZ3JhbSBiZWxvdy4KKyAgICotLS0tLS0tLS0tLS0tLS0KKyAgICovCisKKyAgeworICAgIC8qIGdlbmVyYXRlIHNxcnQoeCkgYml0IGJ5IGJpdCAqLworICAgIHVuc2lnbmVkNjQgeTsKKyAgICB1bnNpZ25lZDY0IHE7CisgICAgdW5zaWduZWQ2NCBzOworICAgIHVuc2lnbmVkNjQgYjsKKworICAgIGYtPmNsYXNzID0gc2ltX2ZwdV9jbGFzc19udW1iZXI7CisgICAgZi0+c2lnbiA9IDA7CisgICAgeSA9IHItPmZyYWN0aW9uOworICAgIGYtPm5vcm1hbF9leHAgPSAoci0+bm9ybWFsX2V4cCA+PiAxKTsJLyogZXhwID0gW2V4cC8yXSAqLworCisgICAgLyogb2RkIGV4cCwgZG91YmxlIHggdG8gbWFrZSBpdCBldmVuICovCisgICAgQVNTRVJUICh5ID49IElNUExJQ0lUXzEgJiYgeSA8IElNUExJQ0lUXzQpOworICAgIGlmICgoci0+bm9ybWFsX2V4cCAmIDEpKQorICAgICAgeworCXkgKz0geTsKKyAgICAgIH0KKyAgICBBU1NFUlQgKHkgPj0gSU1QTElDSVRfMSAmJiB5IDwgKElNUExJQ0lUXzIgPDwgMSkpOworCisgICAgLyogTGV0IGxvb3AgZGV0ZXJtaW5lIGZpcnN0IHZhbHVlIG9mIHMgKGVpdGhlciAxIG9yIDIpICovCisgICAgYiA9IElNUExJQ0lUXzE7CisgICAgcSA9IDA7CisgICAgcyA9IDA7CisgICAgCisgICAgd2hpbGUgKGIpCisgICAgICB7CisJdW5zaWduZWQ2NCB0ID0gcyArIGI7CisJaWYgKHQgPD0geSkKKwkgIHsKKwkgICAgcyB8PSAoYiA8PCAxKTsKKwkgICAgeSAtPSB0OworCSAgICBxIHw9IGI7CisJICB9CisJeSA8PD0gMTsKKwliID4+PSAxOworICAgICAgfQorCisgICAgQVNTRVJUIChxID49IElNUExJQ0lUXzEgJiYgcSA8IElNUExJQ0lUXzIpOworICAgIGYtPmZyYWN0aW9uID0gcTsKKyAgICBpZiAoeSAhPSAwKQorICAgICAgeworCWYtPmZyYWN0aW9uIHw9IDE7IC8qIHN0aWNrIHJlbWFpbmluZyBiaXRzICovCisJcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2luZXhhY3Q7CisgICAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworCisvKiBpbnQvbG9uZyA8LT4gc2ltX2ZwdSAqLworCitJTkxJTkVfU0lNX0ZQVSAoaW50KQorc2ltX2ZwdV9pMzJ0byAoc2ltX2ZwdSAqZiwKKwkgICAgICAgc2lnbmVkMzIgaSwKKwkgICAgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCkKK3sKKyAgaTJmcHUgKGYsIGksIDApOworICByZXR1cm4gMDsKK30KKworSU5MSU5FX1NJTV9GUFUgKGludCkKK3NpbV9mcHVfdTMydG8gKHNpbV9mcHUgKmYsCisJICAgICAgIHVuc2lnbmVkMzIgdSwKKwkgICAgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCkKK3sKKyAgdTJmcHUgKGYsIHUsIDApOworICByZXR1cm4gMDsKK30KKworSU5MSU5FX1NJTV9GUFUgKGludCkKK3NpbV9mcHVfaTY0dG8gKHNpbV9mcHUgKmYsCisJICAgICAgIHNpZ25lZDY0IGksCisJICAgICAgIHNpbV9mcHVfcm91bmQgcm91bmQpCit7CisgIGkyZnB1IChmLCBpLCAxKTsKKyAgcmV0dXJuIDA7Cit9CisKK0lOTElORV9TSU1fRlBVIChpbnQpCitzaW1fZnB1X3U2NHRvIChzaW1fZnB1ICpmLAorCSAgICAgICB1bnNpZ25lZDY0IHUsCisJICAgICAgIHNpbV9mcHVfcm91bmQgcm91bmQpCit7CisgIHUyZnB1IChmLCB1LCAxKTsKKyAgcmV0dXJuIDA7Cit9CisKKworSU5MSU5FX1NJTV9GUFUgKGludCkKK3NpbV9mcHVfdG8zMmkgKHNpZ25lZDMyICppLAorCSAgICAgICBjb25zdCBzaW1fZnB1ICpmLAorCSAgICAgICBzaW1fZnB1X3JvdW5kIHJvdW5kKQoreworICBzaWduZWQ2NCBpNjQ7CisgIGludCBzdGF0dXMgPSBmcHUyaSAoJmk2NCwgZiwgMCwgcm91bmQpOworICAqaSA9IGk2NDsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworSU5MSU5FX1NJTV9GUFUgKGludCkKK3NpbV9mcHVfdG8zMnUgKHVuc2lnbmVkMzIgKnUsCisJICAgICAgIGNvbnN0IHNpbV9mcHUgKmYsCisJICAgICAgIHNpbV9mcHVfcm91bmQgcm91bmQpCit7CisgIHVuc2lnbmVkNjQgdTY0OworICBpbnQgc3RhdHVzID0gZnB1MnUgKCZ1NjQsIGYsIDApOworICAqdSA9IHU2NDsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworSU5MSU5FX1NJTV9GUFUgKGludCkKK3NpbV9mcHVfdG82NGkgKHNpZ25lZDY0ICppLAorCSAgICAgICBjb25zdCBzaW1fZnB1ICpmLAorCSAgICAgICBzaW1fZnB1X3JvdW5kIHJvdW5kKQoreworICByZXR1cm4gZnB1MmkgKGksIGYsIDEsIHJvdW5kKTsKK30KKworCitJTkxJTkVfU0lNX0ZQVSAoaW50KQorc2ltX2ZwdV90bzY0dSAodW5zaWduZWQ2NCAqdSwKKwkgICAgICAgY29uc3Qgc2ltX2ZwdSAqZiwKKwkgICAgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCkKK3sKKyAgcmV0dXJuIGZwdTJ1ICh1LCBmLCAxKTsKK30KKworCisKKy8qIHNpbV9mcHUgLT4gaG9zdCBmb3JtYXQgKi8KKworI2lmIDAKK0lOTElORV9TSU1fRlBVIChmbG9hdCkKK3NpbV9mcHVfMmYgKGNvbnN0IHNpbV9mcHUgKmYpCit7CisgIHJldHVybiBmdmFsLmQ7Cit9CisjZW5kaWYKKworCitJTkxJTkVfU0lNX0ZQVSAoZG91YmxlKQorc2ltX2ZwdV8yZCAoY29uc3Qgc2ltX2ZwdSAqcykKK3sKKyAgc2ltX2ZwdV9tYXAgdmFsOworICBpZiAoc2ltX2ZwdV9pc19zbmFuIChzKSkKKyAgICB7CisgICAgICAvKiBnYWcgU05hTidzICovCisgICAgICBzaW1fZnB1IG4gPSAqczsKKyAgICAgIG4uY2xhc3MgPSBzaW1fZnB1X2NsYXNzX3FuYW47CisgICAgICB2YWwuaSA9IHBhY2tfZnB1ICgmbiwgMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdmFsLmkgPSBwYWNrX2ZwdSAocywgMSk7CisgICAgfQorICByZXR1cm4gdmFsLmQ7Cit9CisKKworI2lmIDAKK0lOTElORV9TSU1fRlBVICh2b2lkKQorc2ltX2ZwdV9mMiAoc2ltX2ZwdSAqZiwKKwkgICAgZmxvYXQgcykKK3sKKyAgc2ltX2ZwdV9tYXAgdmFsOworICB2YWwuZCA9IHM7CisgIHVucGFja19mcHUgKGYsIHZhbC5pLCAxKTsKK30KKyNlbmRpZgorCisKK0lOTElORV9TSU1fRlBVICh2b2lkKQorc2ltX2ZwdV9kMiAoc2ltX2ZwdSAqZiwKKwkgICAgZG91YmxlIGQpCit7CisgIHNpbV9mcHVfbWFwIHZhbDsKKyAgdmFsLmQgPSBkOworICB1bnBhY2tfZnB1IChmLCB2YWwuaSwgMSk7Cit9CisKKworLyogR2VuZXJhbCAqLworCitJTkxJTkVfU0lNX0ZQVSAoaW50KQorc2ltX2ZwdV9pc19uYW4gKGNvbnN0IHNpbV9mcHUgKmQpCit7CisgIHN3aXRjaCAoZC0+Y2xhc3MpCisgICAgeworICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc19xbmFuOgorICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc19zbmFuOgorICAgICAgcmV0dXJuIDE7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworSU5MSU5FX1NJTV9GUFUgKGludCkKK3NpbV9mcHVfaXNfcW5hbiAoY29uc3Qgc2ltX2ZwdSAqZCkKK3sKKyAgc3dpdGNoIChkLT5jbGFzcykKKyAgICB7CisgICAgY2FzZSBzaW1fZnB1X2NsYXNzX3FuYW46CisgICAgICByZXR1cm4gMTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitJTkxJTkVfU0lNX0ZQVSAoaW50KQorc2ltX2ZwdV9pc19zbmFuIChjb25zdCBzaW1fZnB1ICpkKQoreworICBzd2l0Y2ggKGQtPmNsYXNzKQorICAgIHsKKyAgICBjYXNlIHNpbV9mcHVfY2xhc3Nfc25hbjoKKyAgICAgIHJldHVybiAxOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK0lOTElORV9TSU1fRlBVIChpbnQpCitzaW1fZnB1X2lzX3plcm8gKGNvbnN0IHNpbV9mcHUgKmQpCit7CisgIHN3aXRjaCAoZC0+Y2xhc3MpCisgICAgeworICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc196ZXJvOgorICAgICAgcmV0dXJuIDE7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworSU5MSU5FX1NJTV9GUFUgKGludCkKK3NpbV9mcHVfaXNfaW5maW5pdHkgKGNvbnN0IHNpbV9mcHUgKmQpCit7CisgIHN3aXRjaCAoZC0+Y2xhc3MpCisgICAgeworICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc19pbmZpbml0eToKKyAgICAgIHJldHVybiAxOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK0lOTElORV9TSU1fRlBVIChpbnQpCitzaW1fZnB1X2lzX251bWJlciAoY29uc3Qgc2ltX2ZwdSAqZCkKK3sKKyAgc3dpdGNoIChkLT5jbGFzcykKKyAgICB7CisgICAgY2FzZSBzaW1fZnB1X2NsYXNzX2Rlbm9ybToKKyAgICBjYXNlIHNpbV9mcHVfY2xhc3NfbnVtYmVyOgorICAgICAgcmV0dXJuIDE7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworSU5MSU5FX1NJTV9GUFUgKGludCkKK3NpbV9mcHVfaXNfZGVub3JtIChjb25zdCBzaW1fZnB1ICpkKQoreworICBzd2l0Y2ggKGQtPmNsYXNzKQorICAgIHsKKyAgICBjYXNlIHNpbV9mcHVfY2xhc3NfZGVub3JtOgorICAgICAgcmV0dXJuIDE7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworCitJTkxJTkVfU0lNX0ZQVSAoaW50KQorc2ltX2ZwdV9zaWduIChjb25zdCBzaW1fZnB1ICpkKQoreworICByZXR1cm4gZC0+c2lnbjsKK30KKworCitJTkxJTkVfU0lNX0ZQVSAoaW50KQorc2ltX2ZwdV9leHAgKGNvbnN0IHNpbV9mcHUgKmQpCit7CisgIHJldHVybiBkLT5ub3JtYWxfZXhwOworfQorCisKKworSU5MSU5FX1NJTV9GUFUgKGludCkKK3NpbV9mcHVfaXMgKGNvbnN0IHNpbV9mcHUgKmQpCit7CisgIHN3aXRjaCAoZC0+Y2xhc3MpCisgICAgeworICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc19xbmFuOgorICAgICAgcmV0dXJuIFNJTV9GUFVfSVNfUU5BTjsKKyAgICBjYXNlIHNpbV9mcHVfY2xhc3Nfc25hbjoKKyAgICAgIHJldHVybiBTSU1fRlBVX0lTX1NOQU47CisgICAgY2FzZSBzaW1fZnB1X2NsYXNzX2luZmluaXR5OgorICAgICAgaWYgKGQtPnNpZ24pCisJcmV0dXJuIFNJTV9GUFVfSVNfTklORjsKKyAgICAgIGVsc2UKKwlyZXR1cm4gU0lNX0ZQVV9JU19QSU5GOworICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc19udW1iZXI6CisgICAgICBpZiAoZC0+c2lnbikKKwlyZXR1cm4gU0lNX0ZQVV9JU19OTlVNQkVSOworICAgICAgZWxzZQorCXJldHVybiBTSU1fRlBVX0lTX1BOVU1CRVI7CisgICAgY2FzZSBzaW1fZnB1X2NsYXNzX2Rlbm9ybToKKyAgICAgIGlmIChkLT5zaWduKQorCXJldHVybiBTSU1fRlBVX0lTX05ERU5PUk07CisgICAgICBlbHNlCisJcmV0dXJuIFNJTV9GUFVfSVNfUERFTk9STTsKKyAgICBjYXNlIHNpbV9mcHVfY2xhc3NfemVybzoKKyAgICAgIGlmIChkLT5zaWduKQorCXJldHVybiBTSU1fRlBVX0lTX05aRVJPOworICAgICAgZWxzZQorCXJldHVybiBTSU1fRlBVX0lTX1BaRVJPOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gLTE7CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKK0lOTElORV9TSU1fRlBVIChpbnQpCitzaW1fZnB1X2NtcCAoY29uc3Qgc2ltX2ZwdSAqbCwgY29uc3Qgc2ltX2ZwdSAqcikKK3sKKyAgc2ltX2ZwdSByZXM7CisgIHNpbV9mcHVfc3ViICgmcmVzLCBsLCByKTsKKyAgcmV0dXJuIHNpbV9mcHVfaXMgKCZyZXMpOworfQorCitJTkxJTkVfU0lNX0ZQVSAoaW50KQorc2ltX2ZwdV9pc19sdCAoY29uc3Qgc2ltX2ZwdSAqbCwgY29uc3Qgc2ltX2ZwdSAqcikKK3sKKyAgaW50IHN0YXR1czsKKyAgc2ltX2ZwdV9sdCAoJnN0YXR1cywgbCwgcik7CisgIHJldHVybiBzdGF0dXM7Cit9CisKK0lOTElORV9TSU1fRlBVIChpbnQpCitzaW1fZnB1X2lzX2xlIChjb25zdCBzaW1fZnB1ICpsLCBjb25zdCBzaW1fZnB1ICpyKQoreworICBpbnQgaXM7CisgIHNpbV9mcHVfbGUgKCZpcywgbCwgcik7CisgIHJldHVybiBpczsKK30KKworSU5MSU5FX1NJTV9GUFUgKGludCkKK3NpbV9mcHVfaXNfZXEgKGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpCit7CisgIGludCBpczsKKyAgc2ltX2ZwdV9lcSAoJmlzLCBsLCByKTsKKyAgcmV0dXJuIGlzOworfQorCitJTkxJTkVfU0lNX0ZQVSAoaW50KQorc2ltX2ZwdV9pc19uZSAoY29uc3Qgc2ltX2ZwdSAqbCwgY29uc3Qgc2ltX2ZwdSAqcikKK3sKKyAgaW50IGlzOworICBzaW1fZnB1X25lICgmaXMsIGwsIHIpOworICByZXR1cm4gaXM7Cit9CisKK0lOTElORV9TSU1fRlBVIChpbnQpCitzaW1fZnB1X2lzX2dlIChjb25zdCBzaW1fZnB1ICpsLCBjb25zdCBzaW1fZnB1ICpyKQoreworICBpbnQgaXM7CisgIHNpbV9mcHVfZ2UgKCZpcywgbCwgcik7CisgIHJldHVybiBpczsKK30KKworSU5MSU5FX1NJTV9GUFUgKGludCkKK3NpbV9mcHVfaXNfZ3QgKGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpCit7CisgIGludCBpczsKKyAgc2ltX2ZwdV9ndCAoJmlzLCBsLCByKTsKKyAgcmV0dXJuIGlzOworfQorCisKKy8qIENvbXBhcmUgb3BlcmF0b3JzICovCisKK0lOTElORV9TSU1fRlBVIChpbnQpCitzaW1fZnB1X2x0IChpbnQgKmlzLAorCSAgICBjb25zdCBzaW1fZnB1ICpsLAorCSAgICBjb25zdCBzaW1fZnB1ICpyKQoreworICBpZiAoIXNpbV9mcHVfaXNfbmFuIChsKSAmJiAhc2ltX2ZwdV9pc19uYW4gKHIpKQorICAgIHsKKyAgICAgIHNpbV9mcHVfbWFwIGx2YWw7CisgICAgICBzaW1fZnB1X21hcCBydmFsOworICAgICAgbHZhbC5pID0gcGFja19mcHUgKGwsIDEpOworICAgICAgcnZhbC5pID0gcGFja19mcHUgKHIsIDEpOworICAgICAgKCppcykgPSAobHZhbC5kIDwgcnZhbC5kKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZSBpZiAoc2ltX2ZwdV9pc19zbmFuIChsKSB8fCBzaW1fZnB1X2lzX3NuYW4gKHIpKQorICAgIHsKKyAgICAgICppcyA9IDA7CisgICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zbmFuOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICppcyA9IDA7CisgICAgICByZXR1cm4gc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9xbmFuOworICAgIH0KK30KKworSU5MSU5FX1NJTV9GUFUgKGludCkKK3NpbV9mcHVfbGUgKGludCAqaXMsCisJICAgIGNvbnN0IHNpbV9mcHUgKmwsCisJICAgIGNvbnN0IHNpbV9mcHUgKnIpCit7CisgIGlmICghc2ltX2ZwdV9pc19uYW4gKGwpICYmICFzaW1fZnB1X2lzX25hbiAocikpCisgICAgeworICAgICAgc2ltX2ZwdV9tYXAgbHZhbDsKKyAgICAgIHNpbV9mcHVfbWFwIHJ2YWw7CisgICAgICBsdmFsLmkgPSBwYWNrX2ZwdSAobCwgMSk7CisgICAgICBydmFsLmkgPSBwYWNrX2ZwdSAociwgMSk7CisgICAgICAqaXMgPSAobHZhbC5kIDw9IHJ2YWwuZCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UgaWYgKHNpbV9mcHVfaXNfc25hbiAobCkgfHwgc2ltX2ZwdV9pc19zbmFuIChyKSkKKyAgICB7CisgICAgICAqaXMgPSAwOworICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc25hbjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqaXMgPSAwOworICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfcW5hbjsKKyAgICB9Cit9CisKK0lOTElORV9TSU1fRlBVIChpbnQpCitzaW1fZnB1X2VxIChpbnQgKmlzLAorCSAgICBjb25zdCBzaW1fZnB1ICpsLAorCSAgICBjb25zdCBzaW1fZnB1ICpyKQoreworICBpZiAoIXNpbV9mcHVfaXNfbmFuIChsKSAmJiAhc2ltX2ZwdV9pc19uYW4gKHIpKQorICAgIHsKKyAgICAgIHNpbV9mcHVfbWFwIGx2YWw7CisgICAgICBzaW1fZnB1X21hcCBydmFsOworICAgICAgbHZhbC5pID0gcGFja19mcHUgKGwsIDEpOworICAgICAgcnZhbC5pID0gcGFja19mcHUgKHIsIDEpOworICAgICAgKCppcykgPSAobHZhbC5kID09IHJ2YWwuZCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UgaWYgKHNpbV9mcHVfaXNfc25hbiAobCkgfHwgc2ltX2ZwdV9pc19zbmFuIChyKSkKKyAgICB7CisgICAgICAqaXMgPSAwOworICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc25hbjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqaXMgPSAwOworICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfcW5hbjsKKyAgICB9Cit9CisKK0lOTElORV9TSU1fRlBVIChpbnQpCitzaW1fZnB1X25lIChpbnQgKmlzLAorCSAgICBjb25zdCBzaW1fZnB1ICpsLAorCSAgICBjb25zdCBzaW1fZnB1ICpyKQoreworICBpZiAoIXNpbV9mcHVfaXNfbmFuIChsKSAmJiAhc2ltX2ZwdV9pc19uYW4gKHIpKQorICAgIHsKKyAgICAgIHNpbV9mcHVfbWFwIGx2YWw7CisgICAgICBzaW1fZnB1X21hcCBydmFsOworICAgICAgbHZhbC5pID0gcGFja19mcHUgKGwsIDEpOworICAgICAgcnZhbC5pID0gcGFja19mcHUgKHIsIDEpOworICAgICAgKCppcykgPSAobHZhbC5kICE9IHJ2YWwuZCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UgaWYgKHNpbV9mcHVfaXNfc25hbiAobCkgfHwgc2ltX2ZwdV9pc19zbmFuIChyKSkKKyAgICB7CisgICAgICAqaXMgPSAwOworICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc25hbjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqaXMgPSAwOworICAgICAgcmV0dXJuIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfcW5hbjsKKyAgICB9Cit9CisKK0lOTElORV9TSU1fRlBVIChpbnQpCitzaW1fZnB1X2dlIChpbnQgKmlzLAorCSAgICBjb25zdCBzaW1fZnB1ICpsLAorCSAgICBjb25zdCBzaW1fZnB1ICpyKQoreworICByZXR1cm4gc2ltX2ZwdV9sZSAoaXMsIHIsIGwpOworfQorCitJTkxJTkVfU0lNX0ZQVSAoaW50KQorc2ltX2ZwdV9ndCAoaW50ICppcywKKwkgICAgY29uc3Qgc2ltX2ZwdSAqbCwKKwkgICAgY29uc3Qgc2ltX2ZwdSAqcikKK3sKKyAgcmV0dXJuIHNpbV9mcHVfbHQgKGlzLCByLCBsKTsKK30KKworCisvKiBBIG51bWJlciBvZiB1c2VmdWwgY29uc3RhbnRzICovCisKKyNpZiBFWFRFUk5fU0lNX0ZQVV9QCitjb25zdCBzaW1fZnB1IHNpbV9mcHVfemVybyA9IHsKKyAgc2ltX2ZwdV9jbGFzc196ZXJvLAorfTsKK2NvbnN0IHNpbV9mcHUgc2ltX2ZwdV9xbmFuID0geworICBzaW1fZnB1X2NsYXNzX3FuYW4sCit9OworY29uc3Qgc2ltX2ZwdSBzaW1fZnB1X29uZSA9IHsKKyAgc2ltX2ZwdV9jbGFzc19udW1iZXIsIDAsIElNUExJQ0lUXzEsIDEKK307Citjb25zdCBzaW1fZnB1IHNpbV9mcHVfdHdvID0geworICBzaW1fZnB1X2NsYXNzX251bWJlciwgMCwgSU1QTElDSVRfMSwgMgorfTsKK2NvbnN0IHNpbV9mcHUgc2ltX2ZwdV9tYXgzMiA9IHsKKyAgc2ltX2ZwdV9jbGFzc19udW1iZXIsIDAsIExTTUFTSzY0IChOUl9GUkFDX0dVQVJELCBOUl9HVUFSRFMzMiksIE5PUk1BTF9FWFBNQVgzMgorfTsKK2NvbnN0IHNpbV9mcHUgc2ltX2ZwdV9tYXg2NCA9IHsKKyAgc2ltX2ZwdV9jbGFzc19udW1iZXIsIDAsIExTTUFTSzY0IChOUl9GUkFDX0dVQVJELCBOUl9HVUFSRFM2NCksIE5PUk1BTF9FWFBNQVg2NAorfTsKKyNlbmRpZgorCisKKy8qIEZvciBkZWJ1Z2dpbmcgKi8KKworSU5MSU5FX1NJTV9GUFUgKHZvaWQpCitzaW1fZnB1X3ByaW50X2ZwdSAoY29uc3Qgc2ltX2ZwdSAqZiwKKwkJICAgc2ltX2ZwdV9wcmludF9mdW5jICpwcmludCwKKwkJICAgdm9pZCAqYXJnKQoreworICBwcmludCAoYXJnLCAiJXMiLCBmLT5zaWduID8gIi0iIDogIisiKTsKKyAgc3dpdGNoIChmLT5jbGFzcykKKyAgICB7CisgICAgY2FzZSBzaW1fZnB1X2NsYXNzX3FuYW46CisgICAgICBwcmludCAoYXJnLCAiMC4iKTsKKyAgICAgIHByaW50X2JpdHMgKGYtPmZyYWN0aW9uLCBOUl9GUkFDX0dVQVJEIC0gMSwgcHJpbnQsIGFyZyk7CisgICAgICBwcmludCAoYXJnLCAiKlF1aWV0TmFOIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHNpbV9mcHVfY2xhc3Nfc25hbjoKKyAgICAgIHByaW50IChhcmcsICIwLiIpOworICAgICAgcHJpbnRfYml0cyAoZi0+ZnJhY3Rpb24sIE5SX0ZSQUNfR1VBUkQgLSAxLCBwcmludCwgYXJnKTsKKyAgICAgIHByaW50IChhcmcsICIqU2lnbmFsTmFOIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHNpbV9mcHVfY2xhc3NfemVybzoKKyAgICAgIHByaW50IChhcmcsICIwLjAiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc19pbmZpbml0eToKKyAgICAgIHByaW50IChhcmcsICJJTkYiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugc2ltX2ZwdV9jbGFzc19udW1iZXI6CisgICAgY2FzZSBzaW1fZnB1X2NsYXNzX2Rlbm9ybToKKyAgICAgIHByaW50IChhcmcsICIxLiIpOworICAgICAgcHJpbnRfYml0cyAoZi0+ZnJhY3Rpb24sIE5SX0ZSQUNfR1VBUkQgLSAxLCBwcmludCwgYXJnKTsKKyAgICAgIHByaW50IChhcmcsICIqMl4lKy01ZCIsIGYtPm5vcm1hbF9leHApOworICAgICAgQVNTRVJUIChmLT5mcmFjdGlvbiA+PSBJTVBMSUNJVF8xKTsKKyAgICAgIEFTU0VSVCAoZi0+ZnJhY3Rpb24gPCBJTVBMSUNJVF8yKTsKKyAgICB9Cit9CisKKworSU5MSU5FX1NJTV9GUFUgKHZvaWQpCitzaW1fZnB1X3ByaW50X3N0YXR1cyAoaW50IHN0YXR1cywKKwkJICAgICAgc2ltX2ZwdV9wcmludF9mdW5jICpwcmludCwKKwkJICAgICAgdm9pZCAqYXJnKQoreworICBpbnQgaSA9IDE7CisgIGNoYXIgKnByZWZpeCA9ICIiOworICB3aGlsZSAoc3RhdHVzID49IGkpCisgICAgeworICAgICAgc3dpdGNoICgoc2ltX2ZwdV9zdGF0dXMpIChzdGF0dXMgJiBpKSkKKwl7CisJY2FzZSBzaW1fZnB1X3N0YXR1c19kZW5vcm06CisJICBwcmludCAoYXJnLCAiJXNEIiwgcHJlZml4KTsKKwkgIGJyZWFrOworCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9zbmFuOgorCSAgcHJpbnQgKGFyZywgIiVzU05hTiIsIHByZWZpeCk7CisJICBicmVhazsKKwljYXNlIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfcW5hbjoKKwkgIHByaW50IChhcmcsICIlc1FOYU4iLCBwcmVmaXgpOworCSAgYnJlYWs7CisJY2FzZSBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2lzaToKKwkgIHByaW50IChhcmcsICIlc0lTSSIsIHByZWZpeCk7CisJICBicmVhazsKKwljYXNlIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfaWRpOgorCSAgcHJpbnQgKGFyZywgIiVzSURJIiwgcHJlZml4KTsKKwkgIGJyZWFrOworCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF96ZHo6CisJICBwcmludCAoYXJnLCAiJXNaRFoiLCBwcmVmaXgpOworCSAgYnJlYWs7CisJY2FzZSBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2ltejoKKwkgIHByaW50IChhcmcsICIlc0lNWiIsIHByZWZpeCk7CisJICBicmVhazsKKwljYXNlIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfY3ZpOgorCSAgcHJpbnQgKGFyZywgIiVzQ1ZJIiwgcHJlZml4KTsKKwkgIGJyZWFrOworCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9jbXA6CisJICBwcmludCAoYXJnLCAiJXNDTVAiLCBwcmVmaXgpOworCSAgYnJlYWs7CisJY2FzZSBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3NxcnQ6CisJICBwcmludCAoYXJnLCAiJXNTUVJUIiwgcHJlZml4KTsKKwkgIGJyZWFrOworCSAgYnJlYWs7CisJY2FzZSBzaW1fZnB1X3N0YXR1c19pbmV4YWN0OgorCSAgcHJpbnQgKGFyZywgIiVzWCIsIHByZWZpeCk7CisJICBicmVhazsKKwkgIGJyZWFrOworCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfb3ZlcmZsb3c6CisJICBwcmludCAoYXJnLCAiJXNPIiwgcHJlZml4KTsKKwkgIGJyZWFrOworCSAgYnJlYWs7CisJY2FzZSBzaW1fZnB1X3N0YXR1c191bmRlcmZsb3c6CisJICBwcmludCAoYXJnLCAiJXNVIiwgcHJlZml4KTsKKwkgIGJyZWFrOworCSAgYnJlYWs7CisJY2FzZSBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2RpdjA6CisJICBwcmludCAoYXJnLCAiJXMvIiwgcHJlZml4KTsKKwkgIGJyZWFrOworCSAgYnJlYWs7CisJY2FzZSBzaW1fZnB1X3N0YXR1c19yb3VuZGVkOgorCSAgcHJpbnQgKGFyZywgIiVzUiIsIHByZWZpeCk7CisJICBicmVhazsKKwkgIGJyZWFrOworCX0KKyAgICAgIGkgPDw9IDE7CisgICAgICBwcmVmaXggPSAiLCI7CisgICAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWZwdS5oIGIvc2ltL2NvbW1vbi9zaW0tZnB1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkNTNjMgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vc2ltLWZwdS5oCkBAIC0wLDAgKzEsNDE3IEBACisvKiBTaW11bGF0b3IgRmxvYXRpbmctcG9pbnQgc3VwcG9ydC4KKyAgIENvcHlyaWdodCAoQykgMTk5Ny0xOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisKKyNpZm5kZWYgU0lNX0ZQVV9ICisjZGVmaW5lIFNJTV9GUFVfSAorCisKKworLyogVGhlIEZQVSBpbnRlcm1lZGlhdGUgdHlwZSAtIHRoaXMgb2JqZWN0LCBwYXNzZWQgYnkgcmVmZXJlbmNlLAorICAgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb3BhcXVlLgorCisKKyAgIFByYWdtYXRpY3MgLSBwYXNzIHN0cnVjdCBieSByZWY6CisKKyAgIFRoZSBhbHRlcm5hdGl2ZXMgZm9yIHRoaXMgb2JqZWN0L2ludGVyZmFjZSB0aGF0IHdlcmUgY29uc2lkZXJlZAorICAgd2VyZTogYSBwYWNrZWQgNjQgYml0IHZhbHVlOyBhbiB1bnBhY2tlZCBzdHJ1Y3R1cmUgcGFzc2VkIGJ5IHZhbHVlOworICAgYW5kIGFuIHVucGFja2VkIHN0cnVjdHVyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLgorCisgICBUaGUgcGFja2VkIDY0IGJpdCB2YWx1ZSB3YXMgcmVqZWN0ZWQgYmVjYXVzZTogaXQgbGltaXRlZCB0aGUKKyAgIHByZWNpc2lvbiBvZiBpbnRlcm1lZGlhdGUgdmFsdWVzOyByZWFzb25hYmxlIHBlcmZvcm1hbmNlIHdvdWxkIG9ubHkKKyAgIGJlIGFjaGlldmVkIHdoZW4gdGhlIHNpbV9mcHUgcGFja2FnZSB3YXMgaW4tbGluZWQgYWxsb3dpbmcgcmVwZWF0ZWQKKyAgIHVucGFja2luZyBvcGVyYXRpb25zIHRvIGJlIGVsaW1pbmF0ZWQuCisKKyAgIEZvciB1bnBhY2tlZCBzdHJ1Y3R1cmVzIChwYXNzZWQgYnkgdmFsdWUgYW5kIHJlZmVyZW5jZSksIHRoZSBjb2RlCisgICBxdWFsaXR5IG9mIEdDQy0yLjcgKG9uIHg4NikgZm9yIGVhY2ggYWx0ZXJuYXRpdmUgd2FzIGNvbXBhcmVkLgorICAgTmVlZGxlc3MgdG8gc2F5IHRoZSByZXN1bHRzLCB3aGlsZSBiZXR0ZXIgdGhlbiBmb3IgYSBwYWNrZWQgNjQgYml0CisgICBvYmplY3QsIHdlcmUgc3RpbGwgcG9vciAoR0NDIGhhZCBvbmx5IGxpbWl0ZWQgc3VwcG9ydCBmb3IgdGhlCisgICBvcHRpbWl6YXRpb24gb2YgcmVmZXJlbmNlcyB0byBzdHJ1Y3R1cmUgbWVtYmVycykuICBSZWdhcmRsZXNzLCB0aGUKKyAgIHN0cnVjdC1ieS1yZWYgYWx0ZXJuYXRpdmUgYWNoaWV2ZWQgYmV0dGVyIHJlc3VsdHMgd2hlbiBjb21waWxlZAorICAgd2l0aCAoYmV0dGVyIHNwZWVkKSBhbmQgd2l0aG91dCAoYmV0dGVyIGNvZGUgZGVuc2l0eSkgaW4tbGluaW5nLgorICAgSGVyZSdzIGxvb2tpbmcgZm9yd2FyZCB0byBhbiBpbXByb3ZlZCBHQ0Mgb3B0aW1pemVyLgorCisKKyAgIFByYWdtYXRpY3MgLSBhdm9pZCBob3N0IEZQIGhhcmR3YXJlOgorCisgICBGUCBvcGVyYXRpb25zIGNhbiBiZSBpbXBsZW1lbnRlZCBieSBlaXRoZXI6IHRoZSBob3N0J3MgZmxvYXRpbmcKKyAgIHBvaW50IGhhcmR3YXJlOyBvciBieSBlbXVsYXRpbmcgdGhlIEZQIG9wZXJhdGlvbnMgdXNpbmcgaW50ZWdlcgorICAgb25seSByb3V0aW5lcy4gIFRoaXMgaXMgZGlyZWN0IHRyYWRlb2ZmIGJldHdlZW4gc3BlZWQsIHBvcnRhYmlsaXR5CisgICBhbmQgY29ycmVjdG5lc3MuCisKKyAgIFRoZSB0d28gcHJpbmNpcGFsIHJlYXNvbnMgZm9yIHNlbGVjdGluZyBwb3J0YWJpbGl0eSBhbmQgY29ycmVjdG5lc3MKKyAgIG92ZXIgc3BlZWQgYXJlOgorCisgICAxIC0gQ29ycmVjdG5lc3MuICBUaGUgYXNzdW1wdGlvbiB0aGF0IEZQIGNvcnJlY3RuZXNzIHdhc24ndCBhbgorICAgaXNzdWUgZm9yIGNvZGUgYmVpbmcgcnVuIG9uIHNpbXVsYXRvcnMgd2FzIHdyb25nLiAgSW5zdGVhZCBvZgorICAgcnVubmluZyBGUCB0b2xlcmFudCAoPykgY29kZSwgc2ltdWxhdG9yIHVzZXJzIGluc3RlYWQgdHlwaWNhbGx5IHJ1bgorICAgdmVyeSBhZ2dyZXNzaXZlIEZQIGNvZGUgc2VxdWVuY2VzLiAgVGhlIHNvbGUgcHVycG9zZSBvZiB0aG9zZQorICAgc2VxdWVuY2VzIGJlaW5nIHRvIHRlc3QgdGhlIHRhcmdldCBJU0EncyBGUCBpbXBsZW1lbnRhdGlvbi4KKworICAgMiAtIFBvcnRhYmlsaXR5LiAgVGhlIGhvc3QgRlAgaW1wbGVtZW50YXRpb24gaXMgbm90IHByZWRpY3RhYmxlLiAgQQorICAgc2ltdWxhdG9yIG1vZGVsaW5nIGFnZ3Jlc3NpdmUgRlAgY29kZSBzZXF1ZW5jZXMgdXNpbmcgdGhlIGhvc3RzIEZQVQorICAgcmVsaWVzIGhlYXZpbHkgb24gdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBob3N0cyBGUCBpbXBsZW1lbnRhdGlvbi4KKyAgIEl0IHR1cm5zIG91dCB0aGF0IHN1Y2ggdHJ1c3QgY2FuIGJlIG1pc3BsYWNlZC4gIFRoZSBiZWhhdmlvciBvZgorICAgaG9zdCBGUCBpbXBsZW1lbnRhdGlvbnMgd2hlbiBoYW5kbGluZyBlZGdlIGNvbmRpdGlvbnMgc3VjaCBhcyBTTmFOcworICAgYW5kIGV4Y2VwdGlvbnMgdmFyaWVkIHdpZGVseS4KKworCisgICAqLworCisKK3R5cGVkZWYgZW51bQoreworICBzaW1fZnB1X2NsYXNzX3plcm8sCisgIHNpbV9mcHVfY2xhc3Nfc25hbiwKKyAgc2ltX2ZwdV9jbGFzc19xbmFuLAorICBzaW1fZnB1X2NsYXNzX251bWJlciwKKyAgc2ltX2ZwdV9jbGFzc19kZW5vcm0sCisgIHNpbV9mcHVfY2xhc3NfaW5maW5pdHksCit9IHNpbV9mcHVfY2xhc3M7CisKK3R5cGVkZWYgc3RydWN0IF9zaW1fZnB1IHsKKyAgc2ltX2ZwdV9jbGFzcyBjbGFzczsKKyAgaW50IHNpZ247CisgIHVuc2lnbmVkNjQgZnJhY3Rpb247CisgIGludCBub3JtYWxfZXhwOworfSBzaW1fZnB1OworCisKKworLyogUm91bmRpbmcgb3B0aW9ucy4KKworICAgVGhlIHZhbHVlIHplcm8gKHNpbV9mcHVfcm91bmRfZGVmYXVsdCkgZm9yIEFMVSBvcGVyYXRpb25zIGluZGljYXRlcworICAgdGhhdCwgd2hlbiBwb3NzaWJsZSwgcm91bmRpbmcgc2hvdWxkIGJlIGF2b2lkZWQuICovCisKK3R5cGVkZWYgZW51bQoreworICBzaW1fZnB1X3JvdW5kX2RlZmF1bHQgPSAwLAorICBzaW1fZnB1X3JvdW5kX25lYXIgPSAxLAorICBzaW1fZnB1X3JvdW5kX3plcm8gPSAyLAorICBzaW1fZnB1X3JvdW5kX3VwID0gMywKKyAgc2ltX2ZwdV9yb3VuZF9kb3duID0gNCwKK30gc2ltX2ZwdV9yb3VuZDsKKworCisvKiBPcHRpb25zIHdoZW4gaGFuZGxpbmcgZGVub3JtYWxpemVkIG51bWJlcnMuICAqLworCit0eXBlZGVmIGVudW0KK3sKKyAgc2ltX2ZwdV9kZW5vcm1fZGVmYXVsdCA9IDAsCisgIHNpbV9mcHVfZGVub3JtX3VuZGVyZmxvd19pbmV4YWN0ID0gMSwKKyAgc2ltX2ZwdV9kZW5vcm1femVybyA9IDIsCit9IHNpbV9mcHVfZGVub3JtOworCisKKworLyogU3RhdHVzIHZhbHVlcyByZXR1cm5lZCBieSBGUFUgb3BlcmF0b3JzLgorCisgICBXaGVuIGNoZWNraW5nIHRoZSByZXN1bHQgb2YgYW4gRlAgc2VxdWVuY2UgKGV4IDMydG8sIGFkZCwgc2luZ2xlLAorICAgdG8zMikgdGhlIGNhbGxlciBtYXkgZWl0aGVyOiBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIGVhY2ggRlAKKyAgIG9wZXJhdG9yOyBvciBmb3JtIHRoZSB1bmlvbiAoT1IpIG9mIHRoZSByZXR1cm5lZCB2YWx1ZXMgYW5kIGV4YW1pbmUKKyAgIHRoZW0gb25jZSBhdCB0aGUgZW5kLgorCisgICBGSVhNRTogVGhpcyBmYWNpbGl0eSBpcyBzdGlsbCBiZWluZyBkZXZlbG9wZWQuICBUaGUgY2hvaWNlIG9mCisgICBzdGF0dXMgdmFsdWVzIHJldHVybmVkIGFuZCB0aGVpciBleGFjdCBtZWFuaW5nIG1heSBjaGFuZ2VkIGluIHRoZQorICAgZnV0dXJlLiAgKi8KKwordHlwZWRlZiBlbnVtCit7CisgIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc25hbiA9IDEsCisgIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfcW5hbiA9IDIsCisgIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfaXNpID0gNCwgLyogKGluZiAtIGluZikgKi8KKyAgc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9pZGkgPSA4LCAvKiAoaW5mIC8gaW5mKSAqLworICBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3pkeiA9IDE2LCAvKiAoMCAvIDApICovCisgIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfaW16ID0gMzIsIC8qIChpbmYgKiAwKSAqLworICBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2N2aSA9IDY0LCAvKiBjb252ZXJ0IHRvIGludGVnZXIgKi8KKyAgc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9kaXYwID0gMTI4LCAvKiAoWCAvIDApICovCisgIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfY21wID0gMjU2LCAvKiBjb21wYXJlICovCisgIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc3FydCA9IDUxMiwKKyAgc2ltX2ZwdV9zdGF0dXNfcm91bmRlZCA9IDEwMjQsCisgIHNpbV9mcHVfc3RhdHVzX2luZXhhY3QgPSAyMDQ4LAorICBzaW1fZnB1X3N0YXR1c19vdmVyZmxvdyA9IDQwOTYsCisgIHNpbV9mcHVfc3RhdHVzX3VuZGVyZmxvdyA9IDgxOTIsCisgIHNpbV9mcHVfc3RhdHVzX2Rlbm9ybSA9IDE2Mzg0LAorfSBzaW1fZnB1X3N0YXR1czsKKworCisKKworLyogRGlyZWN0bHkgbWFwIGJldHdlZW4gYSAzMi82NCBiaXQgcmVnaXN0ZXIgYW5kIHRoZSBzaW1fZnB1IGludGVybmFsCisgICB0eXBlLgorCisgICBXaGVuIGNvbnZlcnRpbmcgZnJvbSB0aGUgMzIvNjQgYml0IHBhY2tlZCBmb3JtYXQgdG8gdGhlIHNpbV9mcHUKKyAgIGludGVybmFsIHR5cGUsIHRoZSBvcGVyYXRpb24gaXMgZXhhY3QuCisKKyAgIFdoZW4gY29udmVydGluZyBmcm9tIHRoZSBzaW1fZnB1IGludGVybmFsIHR5cGUgdG8gMzIvNjQgYml0IHBhY2tlZAorICAgZm9ybWF0LCB0aGUgb3BlcmF0aW9uIG1heSByZXN1bHQgaW4gYSBsb3NzIG9mIHByZWNpc2lvbi4gVGhlCisgICBjb25maWd1cmF0aW9uIG1hY3JvIFdJVEhfRlBVX0NPTlZFUlNJT04gY29udHJvbHMgdGhpcy4gIEJ5IGRlZmF1bHQsCisgICBzaWxlbnQgcm91bmQgdG8gbmVhcmVzdCBpcyBwZXJmb3JtZWQuICBBbHRlcm5hdGl2bHksIHJvdW5kIHVwLAorICAgcm91bmQgZG93biBhbmQgcm91bmQgdG8gemVybyBjYW4gYmUgcGVyZm9ybWVkLiAgSW4gYSBzaW11bGF0b3IKKyAgIGVtdWxhdGluZyBleGFjdCBGUFUgYmVoYXZvdXIsIHNpbV9mcHVfcm91bmRfezMyLDY0fSBzaG91bGQgYmUKKyAgIGNhbGxlZCBiZWZvcmUgcGFja2luZyB0aGUgc2ltX2ZwdSB2YWx1ZS4gICovCisKK0lOTElORV9TSU1fRlBVICh2b2lkKSBzaW1fZnB1XzMydG8gKHNpbV9mcHUgKmYsIHVuc2lnbmVkMzIgcyk7CitJTkxJTkVfU0lNX0ZQVSAodm9pZCkgc2ltX2ZwdV8yMzJ0byAoc2ltX2ZwdSAqZiwgdW5zaWduZWQzMiBoLCB1bnNpZ25lZDMyIGwpOworSU5MSU5FX1NJTV9GUFUgKHZvaWQpIHNpbV9mcHVfNjR0byAoc2ltX2ZwdSAqZiwgdW5zaWduZWQ2NCBkKTsKKworSU5MSU5FX1NJTV9GUFUgKHZvaWQpIHNpbV9mcHVfdG8zMiAodW5zaWduZWQzMiAqcywgY29uc3Qgc2ltX2ZwdSAqZik7CitJTkxJTkVfU0lNX0ZQVSAodm9pZCkgc2ltX2ZwdV90bzIzMiAodW5zaWduZWQzMiAqaCwgdW5zaWduZWQzMiAqbCwgY29uc3Qgc2ltX2ZwdSAqZik7CitJTkxJTkVfU0lNX0ZQVSAodm9pZCkgc2ltX2ZwdV90bzY0ICh1bnNpZ25lZDY0ICpkLCBjb25zdCBzaW1fZnB1ICpmKTsKKworCisvKiBDcmVhdGUgYSBzaW1fZnB1IHN0cnVjdCB1c2luZyByYXcgaW5mb3JtYXRpb24uICAoRlJBQ1RJT04gJiBMU01BU0sKKyAgIChQUkVDSVNJT04tMSwgMCkpIGlzIGFzc3VtZWQgdG8gY29udGFpbiB0aGUgZnJhY3Rpb24gcGFydCBvZiB0aGUKKyAgIGZsb2F0aW5nLXBvaW50IG51bWJlci4gIFRoZSBsZWFkaW5nIGJpdCBMU0JJVCAoUFJFQ0lTSU9OKSBpcyBhbHdheXMKKyAgIGltcGxpZWQuICBUaGUgbnVtYmVyIGNyZWF0ZWQgY2FuIGJlIHJlcHJlc2VudGVkIGJ5OgorCisgICAoU0lHTiA/ICItIiA6ICIrIikgIjEuIiBGUkFDVElPTntQUkVDSVNJT04tMSwwfSBYIDIgXiBOT1JNQUxfRVhQPgorCisgICBZb3UgY2FuIG5vdCBzcGVjaWZ5IHplcm8gdXNpbmcgdGhpcyBmdW5jdGlvbi4gKi8KKworSU5MSU5FX1NJTV9GUFUgKHZvaWQpIHNpbV9mcHVfZnJhY3Rpb250byAoc2ltX2ZwdSAqZiwgaW50IHNpZ24sIGludCBub3JtYWxfZXhwLCB1bnNpZ25lZDY0IGZyYWN0aW9uLCBpbnQgcHJlY2lzaW9uKTsKKworLyogUmV2ZXJzZSBvcGVyYXRvbi4gIElmIFMgaXMgYSBub24temVybyBudW1iZXIsIGRpc2NhcmRzIHRoZSBpbXBsaWVkCisgICBsZWFkaW5nIG9uZSBhbmQgcmV0dXJucyBQUkVDSVNJT04gZnJhY3Rpb24gYml0cy4gIE5vIHJvdW5kaW5nIGlzCisgICBwZXJmb3JtZWQuICovCitJTkxJTkVfU0lNX0ZQVSAodW5zaWduZWQ2NCkgc2ltX2ZwdV90b2ZyYWN0aW9uIChjb25zdCBzaW1fZnB1ICpzLCBpbnQgcHJlY2lzaW9uKTsKKworCisKKy8qIFJvdW5kaW5nIG9wZXJhdG9ycy4KKworICAgRm9yY2UgYW4gaW50ZXJtZWRpYXRlIHJlc3VsdCB0byBhbiBleGFjdCAzMi82NCBiaXQKKyAgIHJlcHJlc2VudGF0aW9uLiAqLworCitJTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X3JvdW5kXzMyIChzaW1fZnB1ICpmLAorCQkJCSAgICAgICBzaW1fZnB1X3JvdW5kIHJvdW5kLAorCQkJCSAgICAgICBzaW1fZnB1X2Rlbm9ybSBkZW5vcm0pOworSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9yb3VuZF82NCAoc2ltX2ZwdSAqZiwKKwkJCQkgICAgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCwKKwkJCQkgICAgICAgc2ltX2ZwdV9kZW5vcm0gZGVub3JtKTsKKworCisKKy8qIEFycml0aG1ldGljIG9wZXJhdG9ycy4KKworICAgRklYTUU6IEluIHRoZSBmdXR1cmUsIGFkZGl0aW9uYWwgYXJndW1lbnRzIFJPVU5ESU5HIGFuZCBCSVRTSVpFIG1heQorICAgYmUgYWRkZWQuICovCisKK3R5cGVkZWYgaW50IChzaW1fZnB1X29wMSkgKHNpbV9mcHUgKmYsCisJCQkgICBjb25zdCBzaW1fZnB1ICpsKTsKK3R5cGVkZWYgaW50IChzaW1fZnB1X29wMikgKHNpbV9mcHUgKmYsCisJCQkgICBjb25zdCBzaW1fZnB1ICpsLAorCQkJICAgY29uc3Qgc2ltX2ZwdSAqcik7CisKK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfYWRkIChzaW1fZnB1ICpmLAorCQkJCSAgY29uc3Qgc2ltX2ZwdSAqbCwgY29uc3Qgc2ltX2ZwdSAqcik7CitJTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X3N1YiAoc2ltX2ZwdSAqZiwKKwkJCQkgIGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpOworSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9tdWwgKHNpbV9mcHUgKmYsCisJCQkJICBjb25zdCBzaW1fZnB1ICpsLCBjb25zdCBzaW1fZnB1ICpyKTsKK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfZGl2IChzaW1fZnB1ICpmLAorCQkJCSAgY29uc3Qgc2ltX2ZwdSAqbCwgY29uc3Qgc2ltX2ZwdSAqcik7CitJTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X21heCAoc2ltX2ZwdSAqZiwKKwkJCQkgIGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpOworSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9taW4gKHNpbV9mcHUgKmYsCisJCQkJICBjb25zdCBzaW1fZnB1ICpsLCBjb25zdCBzaW1fZnB1ICpyKTsKK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfbmVnIChzaW1fZnB1ICpmLAorCQkJCSAgY29uc3Qgc2ltX2ZwdSAqYSk7CitJTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X2FicyAoc2ltX2ZwdSAqZiwKKwkJCQkgIGNvbnN0IHNpbV9mcHUgKmEpOworSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9pbnYgKHNpbV9mcHUgKmYsCisJCQkJICBjb25zdCBzaW1fZnB1ICphKTsKK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfc3FydCAoc2ltX2ZwdSAqZiwKKwkJCQkgICBjb25zdCBzaW1fZnB1ICpzcXIpOworCisKKworLyogQ29udmVyc2lvbiBvZiBpbnRlZ2VyIDwtPiBmbG9hdGluZyBwb2ludC4gKi8KKworSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9pMzJ0byAoc2ltX2ZwdSAqZiwgc2lnbmVkMzIgaSwKKwkJCQkgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCk7CitJTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X3UzMnRvIChzaW1fZnB1ICpmLCB1bnNpZ25lZDMyIHUsCisJCQkJICAgIHNpbV9mcHVfcm91bmQgcm91bmQpOworSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9pNjR0byAoc2ltX2ZwdSAqZiwgc2lnbmVkNjQgaSwKKwkJCQkgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCk7CitJTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X3U2NHRvIChzaW1fZnB1ICpmLCB1bnNpZ25lZDY0IHUsCisJCQkJICAgIHNpbV9mcHVfcm91bmQgcm91bmQpOworI2lmIDAKK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaTIzMnRvIChzaW1fZnB1ICpmLCBzaWduZWQzMiBoLCBzaWduZWQzMiBsLAorCQkJCSAgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCk7CisjZW5kaWYKKyNpZiAwCitJTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X3UyMzJ0byAoc2ltX2ZwdSAqZiwgdW5zaWduZWQzMiBoLCB1bnNpZ25lZDMyIGwsCisJCQkJICAgICBzaW1fZnB1X3JvdW5kIHJvdW5kKTsKKyNlbmRpZgorCitJTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X3RvMzJpIChzaWduZWQzMiAqaSwgY29uc3Qgc2ltX2ZwdSAqZiwKKwkJCQkgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCk7CitJTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X3RvMzJ1ICh1bnNpZ25lZDMyICp1LCBjb25zdCBzaW1fZnB1ICpmLAorCQkJCSAgICBzaW1fZnB1X3JvdW5kIHJvdW5kKTsKK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfdG82NGkgKHNpZ25lZDY0ICppLCBjb25zdCBzaW1fZnB1ICpmLAorCQkJCSAgICBzaW1fZnB1X3JvdW5kIHJvdW5kKTsKK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfdG82NHUgKHVuc2lnbmVkNjQgKnUsIGNvbnN0IHNpbV9mcHUgKmYsCisJCQkJICAgIHNpbV9mcHVfcm91bmQgcm91bmQpOworI2lmIDAKK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfdG8yMzJpIChzaWduZWQ2NCAqaCwgc2lnbmVkNjQgKmwsIGNvbnN0IHNpbV9mcHUgKmYsCisJCQkJICAgICBzaW1fZnB1X3JvdW5kIHJvdW5kKTsKKyNlbmRpZgorI2lmIDAKK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfdG8yMzJ1ICh1bnNpZ25lZDY0ICpoLCB1bnNpZ25lZDY0ICpsLCBjb25zdCBzaW1fZnB1ICpmLAorCQkJCSAgICAgc2ltX2ZwdV9yb3VuZCByb3VuZCk7CisjZW5kaWYKKworCisvKiBDb252ZXJzaW9uIG9mIGludGVybmFsIHNpbV9mcHUgdHlwZSB0byBob3N0IGRvdWJsZSBmb3JtYXQuCisKKyAgIEZvciBkZWJ1Z2luZy90cmFjaW5nIG9ubHkuICBBIFNOYU4gaXMgbmV2ZXIgcmV0dXJuZWQuICovCisKKy8qIElOTElORV9TSU1fRlBVIChmbG9hdCkgc2ltX2ZwdV8yZiAoY29uc3Qgc2ltX2ZwdSAqZik7ICovCitJTkxJTkVfU0lNX0ZQVSAoZG91YmxlKSBzaW1fZnB1XzJkIChjb25zdCBzaW1fZnB1ICpkKTsKKworLyogSU5MSU5FX1NJTV9GUFUgKHZvaWQpIHNpbV9mcHVfZjIgKHNpbV9mcHUgKmYsIGZsb2F0IHMpOyAqLworSU5MSU5FX1NJTV9GUFUgKHZvaWQpIHNpbV9mcHVfZDIgKHNpbV9mcHUgKmYsIGRvdWJsZSBkKTsKKworCisKKy8qIFNwZWNpZmljIG51bWJlciBjbGFzc2VzLgorCisgICBOQjogV2hlbiBlaXRoZXIsIGEgMzIvNjQgYml0IGZsb2F0aW5nIHBvaW50cyBpcyBjb252ZXJ0ZWQgdG8KKyAgIGludGVybmFsIGZvcm1hdCwgb3IgYW4gaW50ZXJuYWwgZm9ybWF0IG51bWJlciBpcyByb3VuZGVkIHRvIDMyLzY0CisgICBiaXQgcHJlY2lzaW9uLCBhIHNwZWNpYWwgbWFya2VyIGlzIHJldGFpbmVkIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlCisgICB2YWx1ZSB3YXMgbm9ybWFsaXplZC4gIEZvciBzdWNoIG51bWJlcnMgYm90aCBpc19udW1iZXIgYW5kCisgICBpc19kZW5vcm0gcmV0dXJuIHRydWUuICovCisKK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaXNfbmFuIChjb25zdCBzaW1fZnB1ICpzKTsgLyogMSA9PiBTTmFOIG9yIFFOYU4gKi8KK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaXNfc25hbiAoY29uc3Qgc2ltX2ZwdSAqcyk7IC8qIDEgPT4gU05hTiAqLworSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9pc19xbmFuIChjb25zdCBzaW1fZnB1ICpzKTsgLyogMSA9PiBRTmFOICovCisKK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaXNfemVybyAoY29uc3Qgc2ltX2ZwdSAqcyk7CitJTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X2lzX2luZmluaXR5IChjb25zdCBzaW1fZnB1ICpzKTsKK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaXNfbnVtYmVyIChjb25zdCBzaW1fZnB1ICpzKTsgLyogIXplcm8gKi8KK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaXNfZGVub3JtIChjb25zdCBzaW1fZnB1ICpzKTsgLyogIXplcm8gKi8KKworCisKKy8qIEZsb2F0aW5nIHBvaW50IGZpZWxkcyAqLworCitJTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X3NpZ24gKGNvbnN0IHNpbV9mcHUgKnMpOworSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9leHAgKGNvbnN0IHNpbV9mcHUgKnMpOworCisKKworLyogU3BlY2lmaWMgY29tcGFyaXNvbiBvcGVyYXRvcnMKKworICAgRm9yIE5hTnMgZXQuYWwuLCB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgd2lsbCBzZXQgSVMgdG8gemVybyBhbmQKKyAgIHJldHVybiBhIG5vbnplcm8gcmVzdWx0LiAqLworCitJTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X2x0IChpbnQgKmlzLCBjb25zdCBzaW1fZnB1ICpsLCBjb25zdCBzaW1fZnB1ICpyKTsKK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfbGUgKGludCAqaXMsIGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpOworSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9lcSAoaW50ICppcywgY29uc3Qgc2ltX2ZwdSAqbCwgY29uc3Qgc2ltX2ZwdSAqcik7CitJTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X25lIChpbnQgKmlzLCBjb25zdCBzaW1fZnB1ICpsLCBjb25zdCBzaW1fZnB1ICpyKTsKK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfZ2UgKGludCAqaXMsIGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpOworSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9ndCAoaW50ICppcywgY29uc3Qgc2ltX2ZwdSAqbCwgY29uc3Qgc2ltX2ZwdSAqcik7CisKK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaXNfbHQgKGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpOworSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9pc19sZSAoY29uc3Qgc2ltX2ZwdSAqbCwgY29uc3Qgc2ltX2ZwdSAqcik7CitJTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X2lzX2VxIChjb25zdCBzaW1fZnB1ICpsLCBjb25zdCBzaW1fZnB1ICpyKTsKK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaXNfbmUgKGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpOworSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9pc19nZSAoY29uc3Qgc2ltX2ZwdSAqbCwgY29uc3Qgc2ltX2ZwdSAqcik7CitJTkxJTkVfU0lNX0ZQVSAoaW50KSBzaW1fZnB1X2lzX2d0IChjb25zdCBzaW1fZnB1ICpsLCBjb25zdCBzaW1fZnB1ICpyKTsKKworCisKKy8qIEdlbmVyYWwgbnVtYmVyIGNsYXNzIGFuZCBjb21wYXJpc29uIG9wZXJhdG9ycy4KKworICAgVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpcyBpbmRpY2F0ZWQgYnkgcmV0dXJuaW5nIG9uZSBvZiB0aGUKKyAgIHZhbHVlcyBiZWxvdy4gIEVmZmljaWVudCBlbXVsYXRpb24gb2YgYSB0YXJnZXQgRlAgY29tcGFyZQorICAgaW5zdHJ1Y3Rpb24gY2FuIGJlIGFjaGlldmVkIGJ5IHJlZGVmaW5pbmcgdGhlIHZhbHVlcyBiZWxvdyB0byBtYXRjaAorICAgY29ycmVzcG9uZGluZyB0YXJnZXQgRlAgc3RhdHVzIGJpdHMuCisKKyAgIEZvciBpbnN0YW5jZS4gIFNJTV9GUFVfUU5BTiBtYXkgYmUgcmVkZWZpbmVkIHRvIGJlIHRoZSBiaXQKKyAgIGBJTlZBTElEJyB3aGlsZSBTSU1fRlBVX05JTkYgbWlnaHQgYmUgcmVkZWZpbmVkIGFzIHRoZSBiaXRzCisgICBgTkVHQVRJVkUgfCBJTkZJTklUWSB8IFZBTElEJy4gKi8KKworI2lmbmRlZiBTSU1fRlBVX0lTX1NOQU4KK2VudW0geworICBTSU1fRlBVX0lTX1NOQU4gPSAxLCAvKiBOb2lzeSBub3QtYS1udW1iZXIgKi8KKyAgU0lNX0ZQVV9JU19RTkFOID0gMiwgLyogUXVpdGUgbm90LWEtbnVtYmVyICovCisgIFNJTV9GUFVfSVNfTklORiA9IDMsIC8qIC1pbmZpbml0eSAqLworICBTSU1fRlBVX0lTX1BJTkYgPSA0LCAvKiAraW5maW5pdHkgKi8KKyAgU0lNX0ZQVV9JU19OTlVNQkVSID0gNSwgLyogLW51bWJlciAtIFsgLU1BWCAuLiAtTUlOIF0gKi8KKyAgU0lNX0ZQVV9JU19QTlVNQkVSID0gNiwgLyogK251bWJlciAtIFsgK01JTiAuLiArTUFYIF0gKi8KKyAgU0lNX0ZQVV9JU19OREVOT1JNID0gNywgLyogLWRlbm9ybSAtICggTUlOIC4uIDAgKSAqLworICBTSU1fRlBVX0lTX1BERU5PUk0gPSA4LCAvKiArZGVub3JtIC0gKCAwIC4uIE1JTiApICovCisgIFNJTV9GUFVfSVNfTlpFUk8gPSA5LCAvKiAtMCAqLworICBTSU1fRlBVX0lTX1BaRVJPID0gMTAsIC8qICswICovCit9OworI2VuZGlmCisKK0lOTElORV9TSU1fRlBVIChpbnQpIHNpbV9mcHVfaXMgKGNvbnN0IHNpbV9mcHUgKmwpOworSU5MSU5FX1NJTV9GUFUgKGludCkgc2ltX2ZwdV9jbXAgKGNvbnN0IHNpbV9mcHUgKmwsIGNvbnN0IHNpbV9mcHUgKnIpOworCisKKworLyogQSBjb25zdGFudCBvZiB1c2VmdWwgbnVtYmVycyAqLworCitleHRlcm4gY29uc3Qgc2ltX2ZwdSBzaW1fZnB1X3plcm87CitleHRlcm4gY29uc3Qgc2ltX2ZwdSBzaW1fZnB1X29uZTsKK2V4dGVybiBjb25zdCBzaW1fZnB1IHNpbV9mcHVfdHdvOworZXh0ZXJuIGNvbnN0IHNpbV9mcHUgc2ltX2ZwdV9xbmFuOworZXh0ZXJuIGNvbnN0IHNpbV9mcHUgc2ltX2ZwdV9tYXgzMjsKK2V4dGVybiBjb25zdCBzaW1fZnB1IHNpbV9mcHVfbWF4NjQ7CisKKworLyogU2VsZWN0IHRoZSBhcHBsaWNhYmxlIGZ1bmN0aW9ucyBmb3IgdGhlIGZwX3dvcmQgdHlwZSAqLworCisjaWYgV0lUSF9UQVJHRVRfRkxPQVRJTkdfUE9JTlRfQklUU0laRSA9PSAzMgorI2RlZmluZSBzaW1fZnB1X3RvZnAgc2ltX2ZwdV90bzMyCisjZGVmaW5lIHNpbV9mcHVfZnB0byBzaW1fZnB1XzMydG8KKyNkZWZpbmUgc2ltX2ZwdV9yb3VuZF9mcCBzaW1fZnB1X3JvdW5kXzMyCisjZGVmaW5lIHNpbV9mcHVfbWF4ZnAgc2ltX2ZwdV9tYXgzMgorI2VuZGlmCisjaWYgV0lUSF9UQVJHRVRfRkxPQVRJTkdfUE9JTlRfQklUU0laRSA9PSA2NAorI2RlZmluZSBzaW1fZnB1X3RvZnAgc2ltX2ZwdV90bzY0CisjZGVmaW5lIHNpbV9mcHVfZnB0byBzaW1fZnB1XzY0dG8KKyNkZWZpbmUgc2ltX2ZwdV9yb3VuZF9mcCBzaW1fZnB1X3JvdW5kXzY0CisjZGVmaW5lIHNpbV9mcHVfbWF4ZnAgc2ltX2ZwdV9tYXg2NAorI2VuZGlmCisKKworCisvKiBGb3IgZGVidWdnaW5nICovCisKK3R5cGVkZWYgdm9pZCBzaW1fZnB1X3ByaW50X2Z1bmMgKHZvaWQgKiwgY2hhciAqLCAuLi4pOworCitJTkxJTkVfU0lNX0ZQVSAodm9pZCkgc2ltX2ZwdV9wcmludF9mcHUgKGNvbnN0IHNpbV9mcHUgKmYsCisJCQkJCSBzaW1fZnB1X3ByaW50X2Z1bmMgKnByaW50LAorCQkJCQkgdm9pZCAqYXJnKTsKKworSU5MSU5FX1NJTV9GUFUgKHZvaWQpIHNpbV9mcHVfcHJpbnRfc3RhdHVzIChpbnQgc3RhdHVzLAorCQkJCQkgICAgc2ltX2ZwdV9wcmludF9mdW5jICpwcmludCwKKwkJCQkJICAgIHZvaWQgKmFyZyk7CisKKyNpZiBIX1JFVkVBTFNfTU9EVUxFX1AgKFNJTV9GUFVfSU5MSU5FKQorI2luY2x1ZGUgInNpbS1mcHUuYyIKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWhsb2FkLmMgYi9zaW0vY29tbW9uL3NpbS1obG9hZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDE2ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS1obG9hZC5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIEdlbmVyaWMgbG9hZCBmb3IgaGFyZHdhcmUgc2ltdWxhdG9yIG1vZGVscy4KKyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInNpbS11dGlscy5oIgorI2luY2x1ZGUgInNpbS1hc3NlcnQuaCIKKworCisvKiBHZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIHNpbV9sb2FkIHRoYXQgd29ya3Mgd2l0aCBzaW11bGF0b3JzCisgICBtb2RlbGluZyBhIGhhcmR3YXJlIHBsYXRmb3JtLiAqLworCitTSU1fUkMKK3NpbV9sb2FkIChzZCwgcHJvZ19uYW1lLCBwcm9nX2JmZCwgZnJvbV90dHkpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBjaGFyICpwcm9nX25hbWU7CisgICAgIHN0cnVjdCBfYmZkICpwcm9nX2JmZDsKKyAgICAgaW50IGZyb21fdHR5OworeworICBiZmQgKnJlc3VsdF9iZmQ7CisKKyAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKKyAgaWYgKHNpbV9hbmFseXplX3Byb2dyYW0gKHNkLCBwcm9nX25hbWUsIHByb2dfYmZkKSAhPSBTSU1fUkNfT0spCisgICAgcmV0dXJuIFNJTV9SQ19GQUlMOworICBTSU1fQVNTRVJUIChTVEFURV9QUk9HX0JGRCAoc2QpICE9IE5VTEwpOworCisgIC8qIE5PVEU6IEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIG9sZGVyIGhhcmR3YXJlIHNpbXVsYXRvcnMKKyAgICAgaW5jb3JyZWN0bHkgd3JpdGUgdGhlIHByb2dyYW0gc2VjdGlvbnMgYXQgTE1BIGludGVycHJldGVkIGFzIGEKKyAgICAgdmlydHVhbCBhZGRyZXNzLiAgVGhpcyBpcyBzdGlsbCBhY2NvbW1vZGF0ZWQgZm9yIGJhY2t3YXJkCisgICAgIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gKi8KKyAgLyogRklYTUU6IFRoZSBmb2xsb3dpbmcgc2ltdWxhdG9ycyB1c2UgdGhpcyBmaWxlIGFzIG9mIDk4MDMxMzoKKyAgICAgbTMyciwgbWlwcywgdjg1MCBbZ3JlcCBmb3Igc2ltLWhsb2FkIGluIGFsbCBNYWtlZmlsZS5pbidzXS4KKyAgICAgRWFjaCBvZiB0aGVzZSBzaG91bGQgYmUgcHJvcGVybHkgdXNpbmcgbG1hLiAgV2hlbiB0aGlzIGlzIGNvbmZpcm1lZCwKKyAgICAgU0lNX0hBTkRMRVNfTE1BIGNhbiBnbyBhd2F5LiAgKi8KKyNpZm5kZWYgU0lNX0hBTkRMRVNfTE1BCisjZGVmaW5lIFNJTV9IQU5ETEVTX0xNQSAwCisjZW5kaWYKKworICByZXN1bHRfYmZkID0gc2ltX2xvYWRfZmlsZSAoc2QsIFNUQVRFX01ZX05BTUUgKHNkKSwKKwkJCSAgICAgIFNUQVRFX0NBTExCQUNLIChzZCksCisJCQkgICAgICBwcm9nX25hbWUsCisJCQkgICAgICBTVEFURV9QUk9HX0JGRCAoc2QpLAorCQkJICAgICAgU1RBVEVfT1BFTl9LSU5EIChzZCkgPT0gU0lNX09QRU5fREVCVUcsCisJCQkgICAgICBTSU1fSEFORExFU19MTUEsIHNpbV93cml0ZSk7CisgIGlmIChyZXN1bHRfYmZkID09IE5VTEwpCisgICAgeworICAgICAgYmZkX2Nsb3NlIChTVEFURV9QUk9HX0JGRCAoc2QpKTsKKyAgICAgIFNUQVRFX1BST0dfQkZEIChzZCkgPSBOVUxMOworICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOworICAgIH0KKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWhydy5jIGIvc2ltL2NvbW1vbi9zaW0taHJ3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUzODMwMgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vc2ltLWhydy5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIEdlbmVyaWMgbWVtb3J5IHJlYWQvd3JpdGUgZm9yIGhhcmR3YXJlIHNpbXVsYXRvciBtb2RlbHMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisKKy8qIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2Ygc2ltX3JlYWQgdGhhdCB3b3JrcyB3aXRoIHNpbXVsYXRvcnMKKyAgIG1vZGVsaW5nIHJlYWwgaGFyZHdhcmUgKi8KKworaW50CitzaW1fcmVhZCAoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIG1lbSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKQoreworICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworICByZXR1cm4gc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLCBOVUxMLCByZWFkX21hcCwKKwkJCSAgICAgICBidWYsIG1lbSwgbGVuZ3RoKTsKK30KKworaW50CitzaW1fd3JpdGUgKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBtZW0sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkKK3sKKyAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKKyAgcmV0dXJuIHNpbV9jb3JlX3dyaXRlX2J1ZmZlciAoc2QsIE5VTEwsIHdyaXRlX21hcCwKKwkJCQlidWYsIG1lbSwgbGVuZ3RoKTsKK30KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWh3LmMgYi9zaW0vY29tbW9uL3NpbS1ody5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0Mzg0NjIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS1ody5jCkBAIC0wLDAgKzEsNTA4IEBACisvKiBTaW11bGF0b3IgaGFyZHdhcmUgb3B0aW9uIGhhbmRsaW5nLgorICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQgYW5kIEFuZHJldyBDYWduZXkuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAic2ltLWFzc2VydC5oIgorI2luY2x1ZGUgInNpbS1vcHRpb25zLmgiCisKKyNpbmNsdWRlICJzaW0taHcuaCIKKworI2luY2x1ZGUgImh3LXRyZWUuaCIKKyNpbmNsdWRlICJody1kZXZpY2UuaCIKKyNpbmNsdWRlICJody1tYWluLmgiCisjaW5jbHVkZSAiaHctYmFzZS5oIgorCisKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN5cy9lcnJuby5oPgorCisKK3N0cnVjdCBzaW1faHcgeworICBzdHJ1Y3QgaHcgKnRyZWU7CisgIGludCB0cmFjZV9wOworICBpbnQgaW5mb19wOworICAvKiBpZiBjYWxsZWQgZnJvbSBhIHByb2Nlc3NvciAqLworICBzaW1fY3B1ICpjcHU7CisgIHNpbV9jaWEgY2lhOworfTsKKworCitzdHJ1Y3QgaHcgKgorc2ltX2h3X3BhcnNlIChzdHJ1Y3Qgc2ltX3N0YXRlICpzZCwKKwkgICAgICBjb25zdCBjaGFyICpmbXQsCisJICAgICAgLi4uKQoreworICBzdHJ1Y3QgaHcgKmN1cnJlbnQ7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0IChhcCwgZm10KTsKKyAgY3VycmVudCA9IGh3X3RyZWVfdnBhcnNlIChTVEFURV9IVyAoc2QpLT50cmVlLCBmbXQsIGFwKTsKKyAgdmFfZW5kIChhcCk7CisgIHJldHVybiBjdXJyZW50OworfQorCitzdHJ1Y3QgcHJpbnRlciB7CisgIHN0cnVjdCBzaW1fc3RhdGUgKmZpbGU7CisgIHZvaWQgKCpwcmludCkgKHN0cnVjdCBzaW1fc3RhdGUgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0IGFwKTsKK307CisKK3N0YXRpYyB2b2lkCitkb19wcmludCAodm9pZCAqZmlsZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgIHN0cnVjdCBwcmludGVyICpwID0gZmlsZTsKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQgKGFwLCBmbXQpOworICBwLT5wcmludCAocC0+ZmlsZSwgZm10LCBhcCk7CisgIHZhX2VuZCAoYXApOworfQorCit2b2lkCitzaW1faHdfcHJpbnQgKHN0cnVjdCBzaW1fc3RhdGUgKnNkLAorCSAgICAgIHZvaWQgKCpwcmludCkgKHN0cnVjdCBzaW1fc3RhdGUgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0IGFwKSkKK3sKKyAgc3RydWN0IHByaW50ZXIgcDsKKyAgcC5maWxlID0gc2Q7CisgIHAucHJpbnQgPSBwcmludDsKKyAgaHdfdHJlZV9wcmludCAoU1RBVEVfSFcgKHNkKS0+dHJlZSwgZG9fcHJpbnQsICZwKTsKK30KKworCisKKworLyogY29tbWFuZCBsaW5lIG9wdGlvbnMuICovCisKK2VudW0geworICBPUFRJT05fSFdfSU5GTyA9IE9QVElPTl9TVEFSVCwKKyAgT1BUSU9OX0hXX1RSQUNFLAorICBPUFRJT05fSFdfREVWSUNFLAorICBPUFRJT05fSFdfRklMRSwKK307CisKK3N0YXRpYyBERUNMQVJFX09QVElPTl9IQU5ETEVSIChod19vcHRpb25faGFuZGxlcik7CisKK3N0YXRpYyBjb25zdCBPUFRJT04gaHdfb3B0aW9uc1tdID0KK3sKKyAgeyB7Imh3LWluZm8iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0hXX0lORk8gfSwKKyAgICAgICdcMCcsIE5VTEwsICJMaXN0IGNvbmZpZ3VyYWJsZSBodyByZWdpb25zIiwKKyAgICAgIGh3X29wdGlvbl9oYW5kbGVyIH0sCisgIHsgeyJpbmZvLWh3Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IV19JTkZPIH0sCisgICAgICAnXDAnLCBOVUxMLCBOVUxMLAorICAgICAgaHdfb3B0aW9uX2hhbmRsZXIgfSwKKworICB7IHsiaHctdHJhY2UiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0hXX1RSQUNFIH0sCisgICAgICAnXDAnLCAib258b2ZmIiwgIlRyYWNlIGFsbCBoYXJkd2FyZSBkZXZpY2VzIiwKKyAgICAgIGh3X29wdGlvbl9oYW5kbGVyIH0sCisgIHsgeyJ0cmFjZS1odyIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSFdfVFJBQ0UgfSwKKyAgICAgICdcMCcsIE5VTEwsIE5VTEwsCisgICAgICBod19vcHRpb25faGFuZGxlciB9LAorCisgIHsgeyJody1kZXZpY2UiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0hXX0RFVklDRSB9LAorICAgICAgJ1wwJywgIkRFVklDRSIsICJBZGQgdGhlIHNwZWNpZmllZCBkZXZpY2UiLAorICAgICAgaHdfb3B0aW9uX2hhbmRsZXIgfSwKKworICB7IHsiaHctZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSFdfRklMRSB9LAorICAgICAgJ1wwJywgIkZJTEUiLCAiQWRkIHRoZSBkZXZpY2VzIGxpc3RlZCBpbiB0aGUgZmlsZSIsCisgICAgICBod19vcHRpb25faGFuZGxlciB9LAorCisgIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfSwgJ1wwJywgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCisKKworLyogQ29waWVkIGZyb20gLi4vcHBjL3BzaW0uYzpwc2ltX21lcmdlX2RldmljZV9maWxlKCkgKi8KKworc3RhdGljIFNJTV9SQworbWVyZ2VfZGV2aWNlX2ZpbGUgKHN0cnVjdCBzaW1fc3RhdGUgKnNkLAorCQkgICBjb25zdCBjaGFyICpmaWxlX25hbWUpCit7CisgIEZJTEUgKmRlc2NyaXB0aW9uOworICBzdHJ1Y3QgaHcgKmN1cnJlbnQgPSBTVEFURV9IVyAoc2QpLT50cmVlOworICBpbnQgbGluZV9ucjsKKyAgY2hhciBkZXZpY2VfcGF0aFsxMDAwXTsKKyAgCisgIC8qIHRyeSBvcGVuaW5nIHRoZSBmaWxlICovCisgIGRlc2NyaXB0aW9uID0gZm9wZW4gKGZpbGVfbmFtZSwgInIiKTsKKyAgaWYgKGRlc2NyaXB0aW9uID09IE5VTEwpCisgICAgeworICAgICAgcGVycm9yIChmaWxlX25hbWUpOworICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOworICAgIH0KKyAgCisgIGxpbmVfbnIgPSAwOworICB3aGlsZSAoZmdldHMgKGRldmljZV9wYXRoLCBzaXplb2YoZGV2aWNlX3BhdGgpLCBkZXNjcmlwdGlvbikpCisgICAgeworICAgICAgY2hhciAqZGV2aWNlOworICAgICAgLyogY2hlY2sgdGhhdCBhIGNvbXBsZXRlIGxpbmUgd2FzIHJlYWQgKi8KKyAgICAgIGlmIChzdHJjaHIgKGRldmljZV9wYXRoLCAnXG4nKSA9PSBOVUxMKQorCXsKKwkgIGZjbG9zZSAoZGVzY3JpcHRpb24pOworCSAgc2ltX2lvX2VwcmludGYgKHNkLCAiJXM6JWQ6IGxpbmUgdG8gbG9uZyIsIGZpbGVfbmFtZSwgbGluZV9ucik7CisJICByZXR1cm4gU0lNX1JDX0ZBSUw7CisJfQorICAgICAgKnN0cmNociAoZGV2aWNlX3BhdGgsICdcbicpID0gJ1wwJzsKKyAgICAgIGxpbmVfbnIrKzsKKyAgICAgIC8qIHNraXAgY29tbWVudHMgKCIjIiBvciAiOyIpIGFuZCBibGFuayBsaW5lcyBsaW5lcyAqLworICAgICAgZm9yIChkZXZpY2UgPSBkZXZpY2VfcGF0aDsKKwkgICAqZGV2aWNlICE9ICdcMCcgJiYgaXNzcGFjZSAoKmRldmljZSk7CisJICAgZGV2aWNlKyspOworICAgICAgaWYgKGRldmljZVswXSA9PSAnIycKKwkgIHx8IGRldmljZVswXSA9PSAnOycKKwkgIHx8IGRldmljZVswXSA9PSAnXDAnKQorCWNvbnRpbnVlOworICAgICAgLyogbWVyZ2UgYW55IGFwcGVuZGVkIGxpbmVzICovCisgICAgICB3aGlsZSAoZGV2aWNlX3BhdGhbc3RybGVuIChkZXZpY2VfcGF0aCkgLSAxXSA9PSAnXFwnKQorCXsKKwkgIGludCBjdXJsZW4gPSBzdHJsZW4gKGRldmljZV9wYXRoKSAtIDE7CisJICAvKiB6YXAgdGhlIGBcJyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lICovCisJICBkZXZpY2VfcGF0aFtjdXJsZW5dID0gJ1wwJzsKKwkgIC8qIGFwcGVuZCB0aGUgbmV4dCBsaW5lICovCisJICBpZiAoIWZnZXRzIChkZXZpY2VfcGF0aCArIGN1cmxlbiwKKwkJICAgICAgc2l6ZW9mIChkZXZpY2VfcGF0aCkgLSBjdXJsZW4sCisJCSAgICAgIGRlc2NyaXB0aW9uKSkKKwkgICAgeworCSAgICAgIGZjbG9zZSAoZGVzY3JpcHRpb24pOworCSAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIiVzOiVkOiB1bmV4cGVjdGVkIGVvZiIsIGZpbGVfbmFtZSwgbGluZV9ucik7CisJICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOworCSAgICB9CisJICBpZiAoc3RyY2hyKGRldmljZV9wYXRoLCAnXG4nKSA9PSBOVUxMKQorCSAgICB7CisJICAgICAgZmNsb3NlKGRlc2NyaXB0aW9uKTsKKwkgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICIlczolZDogbGluZSB0byBsb25nIiwgZmlsZV9uYW1lLCBsaW5lX25yKTsKKwkgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisJICAgIH0KKwkgICpzdHJjaHIoZGV2aWNlX3BhdGgsICdcbicpID0gJ1wwJzsKKwkgIGxpbmVfbnIrKzsKKwl9CisgICAgICAvKiBwYXJzZSB0aGlzIGxpbmUgKi8KKyAgICAgIGN1cnJlbnQgPSBod190cmVlX3BhcnNlIChjdXJyZW50LCAiJXMiLCBkZXZpY2UpOworICAgIH0KKyAgZmNsb3NlIChkZXNjcmlwdGlvbik7CisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKKworc3RhdGljIFNJTV9SQworaHdfb3B0aW9uX2hhbmRsZXIgKHN0cnVjdCBzaW1fc3RhdGUgKnNkLCBzaW1fY3B1ICpjcHUsIGludCBvcHQsCisJCSAgIGNoYXIgKmFyZywgaW50IGlzX2NvbW1hbmQpCit7CisgIHN3aXRjaCAob3B0KQorICAgIHsKKworICAgIGNhc2UgT1BUSU9OX0hXX0lORk86CisgICAgICB7CisJLyogZGVsYXkgaW5mbyB1bnRpbCBhZnRlciB0aGUgdHJlZSBpcyBmaW5pc2hlZCAqLworCVNUQVRFX0hXIChzZCktPmluZm9fcCA9IDE7CisJcmV0dXJuIFNJTV9SQ19PSzsKKwlicmVhazsKKyAgICAgIH0KKworICAgIGNhc2UgT1BUSU9OX0hXX1RSQUNFOgorICAgICAgeworCWlmIChhcmcgPT0gTlVMTCkKKwkgIHsKKwkgICAgU1RBVEVfSFcgKHNkKS0+dHJhY2VfcCA9IDE7CisJICB9CisJZWxzZSBpZiAoc3RyY21wIChhcmcsICJ5ZXMiKSA9PSAwCisJCSB8fCBzdHJjbXAgKGFyZywgIm9uIikgPT0gMCkKKwkgIHsKKwkgICAgU1RBVEVfSFcgKHNkKS0+dHJhY2VfcCA9IDE7CisJICB9CisJZWxzZSBpZiAoc3RyY21wIChhcmcsICJubyIpID09IDAKKwkJIHx8IHN0cmNtcCAoYXJnLCAib2ZmIikgPT0gMCkKKwkgIHsKKwkgICAgU1RBVEVfSFcgKHNkKS0+dHJhY2VfcCA9IDA7CisJICB9CisJZWxzZQorCSAgeworCSAgICBzaW1faW9fZXByaW50ZiAoc2QsICJPcHRpb24gLS1ody10cmFjZSBpZ25vcmVkXG4iKTsKKwkgICAgLyogc2V0IHRyYWNpbmcgb24gYWxsIGRldmljZXMgKi8KKwkgICAgcmV0dXJuIFNJTV9SQ19GQUlMOworCSAgfQorCS8qIEZJWE1FOiBOb3QgdmVyeSBuaWNlIC0gc2VlIGFsc28gaHctYmFzZS5jICovCisJaWYgKFNUQVRFX0hXIChzZCktPnRyYWNlX3ApCisJICBod190cmVlX3BhcnNlIChTVEFURV9IVyAoc2QpLT50cmVlLCAiL2dsb2JhbC10cmFjZT8gdHJ1ZSIpOworCXJldHVybiBTSU1fUkNfT0s7CisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIE9QVElPTl9IV19ERVZJQ0U6CisgICAgICB7CisJaHdfdHJlZV9wYXJzZSAoU1RBVEVfSFcgKHNkKS0+dHJlZSwgYXJnKTsKKwlyZXR1cm4gU0lNX1JDX09LOworICAgICAgfQorCisgICAgY2FzZSBPUFRJT05fSFdfRklMRToKKyAgICAgIHsKKwlyZXR1cm4gbWVyZ2VfZGV2aWNlX2ZpbGUgKHNkLCBhcmcpOworICAgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlVua25vd24gaHcgb3B0aW9uICVkXG4iLCBvcHQpOworICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOworCisgICAgfQorCisgIHJldHVybiBTSU1fUkNfRkFJTDsKK30KKworCisvKiAiaHciIG1vZHVsZSBpbnN0YWxsIGhhbmRsZXIuCisKKyAgIFRoaXMgaXMgY2FsbGVkIHZpYSBzaW1fbW9kdWxlX2luc3RhbGwgdG8gaW5zdGFsbCB0aGUgImh3IiBzdWJzeXN0ZW0KKyAgIGludG8gdGhlIHNpbXVsYXRvci4gICovCisKK3N0YXRpYyBNT0RVTEVfSU5JVF9GTiBzaW1faHdfaW5pdDsKK3N0YXRpYyBNT0RVTEVfVU5JTlNUQUxMX0ZOIHNpbV9od191bmluc3RhbGw7CisKK1NJTV9SQworc2ltX2h3X2luc3RhbGwgKHN0cnVjdCBzaW1fc3RhdGUgKnNkKQoreworICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworICBzaW1fYWRkX29wdGlvbl90YWJsZSAoc2QsIE5VTEwsIGh3X29wdGlvbnMpOworICBzaW1fbW9kdWxlX2FkZF91bmluc3RhbGxfZm4gKHNkLCBzaW1faHdfdW5pbnN0YWxsKTsKKyAgc2ltX21vZHVsZV9hZGRfaW5pdF9mbiAoc2QsIHNpbV9od19pbml0KTsKKyAgU1RBVEVfSFcgKHNkKSA9IFpBTExPQyAoc3RydWN0IHNpbV9odyk7CisgIFNUQVRFX0hXIChzZCktPnRyZWUgPSBod190cmVlX2NyZWF0ZSAoc2QsICJjb3JlIik7CisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKKworc3RhdGljIFNJTV9SQworc2ltX2h3X2luaXQgKHN0cnVjdCBzaW1fc3RhdGUgKnNkKQoreworICAvKiBGSVhNRTogYW55dGhpbmcgbmVlZGVkPyAqLworICBod190cmVlX2ZpbmlzaCAoU1RBVEVfSFcgKHNkKS0+dHJlZSk7CisgIGlmIChTVEFURV9IVyAoc2QpLT5pbmZvX3ApCisgICAgc2ltX2h3X3ByaW50IChzZCwgc2ltX2lvX3ZwcmludGYpOworICByZXR1cm4gU0lNX1JDX09LOworfQorCisvKiBVbmluc3RhbGwgdGhlICJodyIgc3Vic3lzdGVtIGZyb20gdGhlIHNpbXVsYXRvci4gICovCisKK3N0YXRpYyB2b2lkCitzaW1faHdfdW5pbnN0YWxsIChzdHJ1Y3Qgc2ltX3N0YXRlICpzZCkKK3sKKyAgLyogaHdfdHJlZV9kZWxldGUgKFNUQVRFX0hXIChzZCktPnRyZWUpOyAqLworICB6ZnJlZSAoU1RBVEVfSFcgKHNkKSk7CisgIFNUQVRFX0hXIChzZCkgPSBOVUxMOworfQorCisKKwwKKy8qIERhdGEgdHJhbnNmZXJzIHRvL2Zyb20gdGhlIGhhcmR3YXJlIGRldmljZSB0cmVlLiAgVGhlcmUgYXJlIHNldmVyYWwKKyAgIGNhc2VzLiAqLworCisKKy8qIENQVTogVGhlIHNpbXVsYXRpb24gaXMgcnVubmluZyBhbmQgdGhlIGN1cnJlbnQgQ1BVL0NJQQorICAgaW5pdGlhdGVzIGEgZGF0YSB0cmFuc2Zlci4gKi8KKwordm9pZCAKK3NpbV9jcHVfaHdfaW9fcmVhZF9idWZmZXIgKHNpbV9jcHUgKmNwdSwKKwkJCSAgIHNpbV9jaWEgY2lhLAorCQkJICAgc3RydWN0IGh3ICpodywKKwkJCSAgIHZvaWQgKmRlc3QsCisJCQkgICBpbnQgc3BhY2UsCisJCQkgICB1bnNpZ25lZF93b3JkIGFkZHIsCisJCQkgICB1bnNpZ25lZCBucl9ieXRlcykKK3sKKyAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7CisgIFNUQVRFX0hXIChzZCktPmNwdSA9IGNwdTsKKyAgU1RBVEVfSFcgKHNkKS0+Y2lhID0gY2lhOworICBpZiAoaHdfaW9fcmVhZF9idWZmZXIgKGh3LCBkZXN0LCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMpICE9IG5yX2J5dGVzKQorICAgIHNpbV9lbmdpbmVfYWJvcnQgKHNkLCBjcHUsIGNpYSwgImJyb2tlbiBDUFUgcmVhZCIpOworfQorCit2b2lkIAorc2ltX2NwdV9od19pb193cml0ZV9idWZmZXIgKHNpbV9jcHUgKmNwdSwKKwkJCSAgICBzaW1fY2lhIGNpYSwKKwkJCSAgICBzdHJ1Y3QgaHcgKmh3LAorCQkJICAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKKwkJCSAgICBpbnQgc3BhY2UsCisJCQkgICAgdW5zaWduZWRfd29yZCBhZGRyLAorCQkJICAgIHVuc2lnbmVkIG5yX2J5dGVzKQoreworICBTSU1fREVTQyBzZCA9IENQVV9TVEFURSAoY3B1KTsKKyAgU1RBVEVfSFcgKHNkKS0+Y3B1ID0gY3B1OworICBTVEFURV9IVyAoc2QpLT5jaWEgPSBjaWE7CisgIGlmIChod19pb193cml0ZV9idWZmZXIgKGh3LCBzb3VyY2UsIHNwYWNlLCBhZGRyLCBucl9ieXRlcykgIT0gbnJfYnl0ZXMpCisgICAgc2ltX2VuZ2luZV9hYm9ydCAoc2QsIGNwdSwgY2lhLCAiYnJva2VuIENQVSB3cml0ZSIpOworfQorCisKKworCisvKiBTWVNURU06IEEgZGF0YSB0cmFuc2ZlciBpcyBiZWluZyBpbml0aWF0ZWQgYnkgdGhlIHN5c3RlbS4gKi8KKwordW5zaWduZWQgCitzaW1faHdfaW9fcmVhZF9idWZmZXIgKHN0cnVjdCBzaW1fc3RhdGUgKnNkLAorCQkgICAgICAgc3RydWN0IGh3ICpodywKKwkJICAgICAgIHZvaWQgKmRlc3QsCisJCSAgICAgICBpbnQgc3BhY2UsCisJCSAgICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCisJCSAgICAgICB1bnNpZ25lZCBucl9ieXRlcykKK3sKKyAgU1RBVEVfSFcgKHNkKS0+Y3B1ID0gTlVMTDsKKyAgcmV0dXJuIGh3X2lvX3JlYWRfYnVmZmVyIChodywgZGVzdCwgc3BhY2UsIGFkZHIsIG5yX2J5dGVzKTsKK30KKwordW5zaWduZWQKK3NpbV9od19pb193cml0ZV9idWZmZXIgKHN0cnVjdCBzaW1fc3RhdGUgKnNkLAorCQkJc3RydWN0IGh3ICpodywKKwkJCWNvbnN0IHZvaWQgKnNvdXJjZSwKKwkJCWludCBzcGFjZSwKKwkJCXVuc2lnbmVkX3dvcmQgYWRkciwKKwkJCXVuc2lnbmVkIG5yX2J5dGVzKQoreworICBTVEFURV9IVyAoc2QpLT5jcHUgPSBOVUxMOworICByZXR1cm4gaHdfaW9fd3JpdGVfYnVmZmVyIChodywgc291cmNlLCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMpOworfQorCisKKwwKKy8qIEFib3J0IHRoZSBzaW11bGF0aW9uIHNwZWNpZnlpbmcgSFcgYXMgdGhlIHJlYXNvbiAqLworCit2b2lkCitod192YWJvcnQgKHN0cnVjdCBodyAqbWUsCisJICAgY29uc3QgY2hhciAqZm10LAorCSAgIHZhX2xpc3QgYXApCit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGNoYXIgKm1zZzsKKyAgLyogZmluZCBhbiBpZGVudGl0eSAqLworICBpZiAobWUgIT0gTlVMTCAmJiBod19wYXRoIChtZSkgIT0gTlVMTCAmJiBod19wYXRoIChtZSkgWzBdICE9ICdcMCcpCisgICAgbmFtZSA9IGh3X3BhdGggKG1lKTsKKyAgZWxzZSBpZiAobWUgIT0gTlVMTCAmJiBod19uYW1lIChtZSkgIT0gTlVMTCAmJiBod19uYW1lIChtZSlbMF0gIT0gJ1wwJykKKyAgICBuYW1lID0gaHdfbmFtZSAobWUpOworICBlbHNlIGlmIChtZSAhPSBOVUxMICYmIGh3X2ZhbWlseSAobWUpICE9IE5VTEwgJiYgaHdfZmFtaWx5IChtZSlbMF0gIT0gJ1wwJykKKyAgICBuYW1lID0gaHdfZmFtaWx5IChtZSk7CisgIGVsc2UKKyAgICBuYW1lID0gImRldmljZSI7CisgIC8qIGNvbnN0cnVjdCBhbiB1cGRhdGVkIGZvcm1hdCBzdHJpbmcgKi8KKyAgbXNnID0gYWxsb2NhIChzdHJsZW4gKG5hbWUpICsgc3RybGVuICgiOiAiKSArIHN0cmxlbiAoZm10KSArIDEpOworICBzdHJjcHkgKG1zZywgbmFtZSk7CisgIHN0cmNhdCAobXNnLCAiOiAiKTsKKyAgc3RyY2F0IChtc2csIGZtdCk7CisgIC8qIHJlcG9ydCB0aGUgcHJvYmxlbSAqLworICBzaW1fZW5naW5lX3ZhYm9ydCAoaHdfc3lzdGVtIChtZSksCisJCSAgICAgU1RBVEVfSFcgKGh3X3N5c3RlbSAobWUpKS0+Y3B1LAorCQkgICAgIFNUQVRFX0hXIChod19zeXN0ZW0gKG1lKSktPmNpYSwKKwkJICAgICBtc2csIGFwKTsKK30KKwordm9pZAoraHdfYWJvcnQgKHN0cnVjdCBodyAqbWUsCisJICBjb25zdCBjaGFyICpmbXQsCisJICAuLi4pCit7CisgIHZhX2xpc3QgYXA7CisgIC8qIHJlcG9ydCB0aGUgcHJvYmxlbSAqLworICB2YV9zdGFydCAoYXAsIGZtdCk7CisgIGh3X3ZhYm9ydCAobWUsIGZtdCwgYXApOworICB2YV9lbmQgKGFwKTsKK30KKwordm9pZAorc2ltX2h3X2Fib3J0IChzdHJ1Y3Qgc2ltX3N0YXRlICpzZCwKKwkgICAgICBzdHJ1Y3QgaHcgKm1lLAorCSAgICAgIGNvbnN0IGNoYXIgKmZtdCwKKwkgICAgICAuLi4pCit7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0IChhcCwgZm10KTsKKyAgaWYgKG1lID09IE5VTEwpCisgICAgc2ltX2VuZ2luZV92YWJvcnQgKHNkLCBOVUxMLCBOVUxMX0NJQSwgZm10LCBhcCk7CisgIGVsc2UKKyAgICBod192YWJvcnQgKG1lLCBmbXQsIGFwKTsKKyAgdmFfZW5kIChhcCk7Cit9CisKKworLyogTUlTQyByb3V0aW5lcyB0byB0aWUgSFcgaW50byB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtICovCisKK3ZvaWQKK2h3X2hhbHQgKHN0cnVjdCBodyAqbWUsCisJIGludCByZWFzb24sCisJIGludCBzdGF0dXMpCit7CisgIHN0cnVjdCBzaW1fc3RhdGUgKnNkID0gaHdfc3lzdGVtIChtZSk7CisgIHN0cnVjdCBzaW1faHcgKnNpbSA9IFNUQVRFX0hXIChzZCk7CisgIHNpbV9lbmdpbmVfaGFsdCAoc2QsIHNpbS0+Y3B1LCBOVUxMLCBzaW0tPmNpYSwgcmVhc29uLCBzdGF0dXMpOworfQorCitzdHJ1Y3QgX3NpbV9jcHUgKgoraHdfc3lzdGVtX2NwdSAoc3RydWN0IGh3ICptZSkKK3sKKyAgcmV0dXJuIFNUQVRFX0hXIChod19zeXN0ZW0gKG1lKSktPmNwdTsKK30KKwordm9pZAoraHdfdHJhY2UgKHN0cnVjdCBodyAqbWUsCisJICBjb25zdCBjaGFyICpmbXQsCisJICAuLi4pCit7CisgIGlmIChod190cmFjZV9wIChtZSkpIC8qIHRvIGJlIHN1cmUsIHRvIGJlIHN1cmUgKi8KKyAgICB7CisgICAgICB2YV9saXN0IGFwOworICAgICAgdmFfc3RhcnQgKGFwLCBmbXQpOworICAgICAgc2ltX2lvX2VwcmludGYgKGh3X3N5c3RlbSAobWUpLCAiJXM6ICIsIGh3X3BhdGggKG1lKSk7CisgICAgICBzaW1faW9fZXZwcmludGYgKGh3X3N5c3RlbSAobWUpLCBmbXQsIGFwKTsKKyAgICAgIHNpbV9pb19lcHJpbnRmIChod19zeXN0ZW0gKG1lKSwgIlxuIik7CisgICAgICB2YV9lbmQgKGFwKTsKKyAgICB9Cit9CisKKworLyogQmFzZWQgb24gZ2RiLTQuMTcvc2ltL3BwYy9tYWluLmM6c2ltX2lvX3JlYWRfc3RkaW4oKSAqLworCitpbnQKK2RvX2h3X3BvbGxfcmVhZCAoc3RydWN0IGh3ICptZSwKKwkJIGRvX2h3X3BvbGxfcmVhZF9tZXRob2QgKnJlYWQsCisJCSBpbnQgc2ltX2lvX2ZkLAorCQkgdm9pZCAqYnVmLAorCQkgdW5zaWduZWQgc2l6ZW9mX2J1ZikKK3sKKyAgaW50IHN0YXR1cyA9IHJlYWQgKGh3X3N5c3RlbSAobWUpLCBzaW1faW9fZmQsIGJ1Ziwgc2l6ZW9mX2J1Zik7CisgIGlmIChzdGF0dXMgPiAwKQorICAgIHJldHVybiBzdGF0dXM7CisgIGVsc2UgaWYgKHN0YXR1cyA9PSAwICYmIHNpemVvZl9idWYgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgZWxzZSBpZiAoc3RhdHVzID09IDApCisgICAgcmV0dXJuIEhXX0lPX0VPRjsKKyAgZWxzZSAvKiBzdGF0dXMgPCAwICovCisgICAgeworI2lmZGVmIEVBR0FJTgorICAgICAgaWYgKFNUQVRFX0NBTExCQUNLIChod19zeXN0ZW0gKG1lKSktPmxhc3RfZXJybm8gPT0gRUFHQUlOKQorCXJldHVybiBIV19JT19OT1RfUkVBRFk7CisgICAgICBlbHNlCisJcmV0dXJuIEhXX0lPX0VPRjsKKyNlbHNlCisgICAgICByZXR1cm4gSFdfSU9fRU9GOworI2VuZGlmCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0taHcuaCBiL3NpbS9jb21tb24vc2ltLWh3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlYmQxOAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vc2ltLWh3LmgKQEAgLTAsMCArMSw5OCBAQAorLyogRGV2aWNlIGRlZmluaXRpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBTSU1fSFdfSAorI2RlZmluZSBTSU1fSFdfSAorCisKKy8qIEVzdGFibGlzaCB0aGlzIG9iamVjdCAqLworCitTSU1fUkMgc2ltX2h3X2luc3RhbGwKKyhzdHJ1Y3Qgc2ltX3N0YXRlICpzZCk7CisKKworLyogUGFyc2UgYSBoYXJkd2FyZSBkZWZpbml0aW9uICovCisKK3N0cnVjdCBodyAqc2ltX2h3X3BhcnNlCisoc3RydWN0IHNpbV9zdGF0ZSAqc2QsCisgY29uc3QgY2hhciAqZm10LAorIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworCisKKy8qIFByaW50IHRoZSBoYXJkd2FyZSB0cmVlICovCisKK3ZvaWQgc2ltX2h3X3ByaW50Cisoc3RydWN0IHNpbV9zdGF0ZSAqc2QsCisgdm9pZCAoKnByaW50KSAoc3RydWN0IHNpbV9zdGF0ZSAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QgYXApKTsKKworCisvKiBBYm9ydCB0aGUgc2ltdWxhdGlvbiBzcGVjaWZ5aW5nIEhXIGFzIHRoZSByZWFzb24gKi8KKwordm9pZCBzaW1faHdfYWJvcnQKKyhTSU1fREVTQyBzZCwKKyBzdHJ1Y3QgaHcgKmh3LAorIGNvbnN0IGNoYXIgKmZtdCwKKyAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKKworCisKKy8qIENQVTogVGhlIHNpbXVsYXRpb24gaXMgcnVubmluZyBhbmQgdGhlIGN1cnJlbnQgQ1BVL0NJQQorICAgaW5pdGlhdGVzIGEgZGF0YSB0cmFuc2Zlci4gKi8KKwordm9pZCBzaW1fY3B1X2h3X2lvX3JlYWRfYnVmZmVyCisoc2ltX2NwdSAqY3B1LAorIHNpbV9jaWEgY2lhLAorIHN0cnVjdCBodyAqaHcsCisgdm9pZCAqZGVzdCwKKyBpbnQgc3BhY2UsCisgdW5zaWduZWRfd29yZCBhZGRyLAorIHVuc2lnbmVkIG5yX2J5dGVzKTsKKwordm9pZCBzaW1fY3B1X2h3X2lvX3dyaXRlX2J1ZmZlcgorKHNpbV9jcHUgKmNwdSwKKyBzaW1fY2lhIGNpYSwKKyBzdHJ1Y3QgaHcgKmh3LAorIGNvbnN0IHZvaWQgKnNvdXJjZSwKKyBpbnQgc3BhY2UsCisgdW5zaWduZWRfd29yZCBhZGRyLAorIHVuc2lnbmVkIG5yX2J5dGVzKTsKKworCisKKy8qIFNZU1RFTTogQSBkYXRhIHRyYW5zZmVyIGlzIGJlaW5nIGluaXRpYXRlZCBieSB0aGUgc3lzdGVtLiAqLworCit1bnNpZ25lZCBzaW1faHdfaW9fcmVhZF9idWZmZXIKKyhzdHJ1Y3Qgc2ltX3N0YXRlICpzZCwKKyBzdHJ1Y3QgaHcgKmh3LAorIHZvaWQgKmRlc3QsCisgaW50IHNwYWNlLAorIHVuc2lnbmVkX3dvcmQgYWRkciwKKyB1bnNpZ25lZCBucl9ieXRlcyk7CisKK3Vuc2lnbmVkIHNpbV9od19pb193cml0ZV9idWZmZXIKKyhzdHJ1Y3Qgc2ltX3N0YXRlICpzZCwKKyBzdHJ1Y3QgaHcgKmh3LAorIGNvbnN0IHZvaWQgKnNvdXJjZSwKKyBpbnQgc3BhY2UsCisgdW5zaWduZWRfd29yZCBhZGRyLAorIHVuc2lnbmVkIG5yX2J5dGVzKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWluZm8uYyBiL3NpbS9jb21tb24vc2ltLWluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDgzMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0taW5mby5jCkBAIC0wLDAgKzEsMzIgQEAKKy8qIEdlbmVyaWMgbWVtb3J5IHJlYWQvd3JpdGUgZm9yIGhhcmR3YXJlIHNpbXVsYXRvciBtb2RlbHMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisKKy8qIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2Ygc2ltX2luZm8gdGhhdCB3b3JrcyB3aXRoIHNpbXVsYXRvcnMgdXNpbmcKKyAgIHNpbS1tb2R1bGUuICovCisKK3ZvaWQKK3NpbV9pbmZvIChTSU1fREVTQyBzZCwgaW50IHZlcmJvc2UpCit7CisgIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7CisgIHNpbV9tb2R1bGVfaW5mbyAoc2QsIHZlcmJvc2UgfHwgU1RBVEVfVkVSQk9TRV9QIChzZCkpOworfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0taW5saW5lLmMgYi9zaW0vY29tbW9uL3NpbS1pbmxpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzBjNjVlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0taW5saW5lLmMKQEAgLTAsMCArMSw5NiBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTcsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIFNJTV9JTkxJTkVfQworI2RlZmluZSBTSU1fSU5MSU5FX0MKKworI3VuZGVmIFNJTV9JTkxJTkVfUAorI2RlZmluZSBTSU1fSU5MSU5FX1AgMQorCisjaW5jbHVkZSAic2ltLWlubGluZS5oIgorI2luY2x1ZGUgInNpbS1tYWluLmgiCisKKworI2lmIENfUkVWRUFMU19NT0RVTEVfUCAoU0lNX0JJVFNfSU5MSU5FKQorI2luY2x1ZGUgInNpbS1iaXRzLmMiCisjZW5kaWYKKworCisjaWYgQ19SRVZFQUxTX01PRFVMRV9QIChTSU1fQ09SRV9JTkxJTkUpCisjaW5jbHVkZSAic2ltLWNvcmUuYyIKKyNlbmRpZgorCisKKyNpZiBDX1JFVkVBTFNfTU9EVUxFX1AgKFNJTV9FTkRJQU5fSU5MSU5FKQorI2luY2x1ZGUgInNpbS1lbmRpYW4uYyIKKyNlbmRpZgorCisKKyNpZiBDX1JFVkVBTFNfTU9EVUxFX1AgKFNJTV9FVkVOVFNfSU5MSU5FKQorI2luY2x1ZGUgInNpbS1ldmVudHMuYyIKKyNlbmRpZgorCisKKyNpZiBDX1JFVkVBTFNfTU9EVUxFX1AgKFNJTV9GUFVfSU5MSU5FKQorI2luY2x1ZGUgInNpbS1mcHUuYyIKKyNlbmRpZgorCisKKyNpZiBDX1JFVkVBTFNfTU9EVUxFX1AgKFNJTV9UWVBFU19JTkxJTkUpCisjaW5jbHVkZSAic2ltLXR5cGVzLmMiCisjZW5kaWYKKworCisjaWYgQ19SRVZFQUxTX01PRFVMRV9QIChTSU1fTUFJTl9JTkxJTkUpCisjaW5jbHVkZSAic2ltLW1haW4uYyIKKyNlbmRpZgorCisKKyNpZiBDX1JFVkVBTFNfTU9EVUxFX1AgKEVOR0lORV9JTkxJTkUpCisvKiAjaW5jbHVkZSAiZW5naW5lLmMiIC0gaGFuZGxlZCBieSBnZW5lcmF0b3IgKi8KKyNlbmRpZgorCisKKyNpZiBDX1JFVkVBTFNfTU9EVUxFX1AgKElDQUNIRV9JTkxJTkUpCisvKiAjaW5jbHVkZSAiaWNhY2hlLmMiIC0gaGFuZGxlZCBieSBnZW5lcmF0b3IgKi8KKyNlbmRpZgorCisKKyNpZiBDX1JFVkVBTFNfTU9EVUxFX1AgKElERUNPREVfSU5MSU5FKQorLyogI2luY2x1ZGUgImlkZWNvZGUuYyIgLSBoYW5kbGVkIGJ5IGdlbmVyYXRvciAqLworI2VuZGlmCisKKworI2lmIENfUkVWRUFMU19NT0RVTEVfUCAoU0VNQU5USUNTX0lOTElORSkKKy8qICNpbmNsdWRlICJzZW1hbnRpY3MuYyIgLSBoYW5kbGVkIGJ5IGdlbmVyYXRvciAqLworI2VuZGlmCisKKworI2lmIENfUkVWRUFMU19NT0RVTEVfUCAoU1VQUE9SVF9JTkxJTkUpCisvKiAjaW5jbHVkZSAic3VwcG9ydC5jIiAtIGhhbmRsZWQgYnkgZ2VuZXJhdG9yICovCisjZW5kaWYKKworCisjdW5kZWYgU0lNX0lOTElORV9QCisjZGVmaW5lIFNJTV9JTkxJTkVfUCAwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0taW5saW5lLmggYi9zaW0vY29tbW9uL3NpbS1pbmxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDA2NThkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0taW5saW5lLmgKQEAgLTAsMCArMSw4MTAgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisgICAgQ29weXJpZ2h0IChDKSAxOTk3LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBTSU1fSU5MSU5FX0gKKyNkZWZpbmUgU0lNX0lOTElORV9ICisKKworLyogSU5MSU5FIENPREUgU0VMRUNUSU9OOgorCisgICBHQ0MgLU8zIGF0dGVtcHRzIHRvIGlubGluZSBhbnkgZnVuY3Rpb24gb3IgcHJvY2VkdXJlIGluIHNjb3BlLiAgVGhlCisgICBvcHRpb25zIGJlbG93IGZhY2lsaXRhdGUgZmluZXIgZ3JhaW5lZCBjb250cm9sIG92ZXIgd2hhdCBpcyBhbmQKKyAgIHdoYXQgaXMgbm90IGlubGluZWQuICBJbiBwYXJ0aWN1bGFyLCBpdCBhbGxvd3MgdGhlIHNlbGVjdGlvbiBvZgorICAgbW9kdWxlcyBmb3IgaW5saW5pbmcuICBEb2luZyB0aGlzIGFsbG93cyB0aGUgY29tcGlsZXIgdG8gYm90aAorICAgZWxpbWluYXRlIHRoZSBvdmVyaGVhZCBvZiBmdW5jdGlvbiBjYWxscyBhbmQgKGFzIGEgY29uc2VxdWVuY2UpCisgICBhbHNvIGVsaW1pbmF0ZSBmdXJ0aGVyIGRlYWQgY29kZS4KKworICAgT24gYSBDSVNDICh4ODYpIEkndmUgZm91bmQgdGhhdCBJIGNhbiBhY2hpZXZlIGFuIG9yZGVyIG9mIG1hZ2ludHVkZQorICAgc3BlZWQgaW1wcm92ZW1lbnQgKHgzLXg1KS4gIEluIHRoZSBjYXNlIG9mIFJJU0MgKHNwYXJjKSB3aGlsZSB0aGUKKyAgIHBlcmZvcm1hbmNlIGdhaW4gaXNuJ3QgYXMgZ3JlYXQgaXQgaXMgc3RpbGwgc2lnbmlmaWNhbnQuCisKKyAgIEVhY2ggbW9kdWxlIGlzIGNvbnRyb2xlZCBieSB0aGUgbWFjcm8gPG1vZHVsZT5fSU5MSU5FIHdoaWNoIGNhbgorICAgaGF2ZSB0aGUgdmFsdWVzIGRlc2NyaWJlZCBiZWxvdworCisgICAgICAgMCAoWkVSTykKKworICAgICAgICAgRG8gbm90IGlubGluZSBhbnkgdGhpbmcgZm9yIHRoZSBnaXZlbiBtb2R1bGUKKworICAgVGhlIGZvbGxvd2luZyBiaXQgZmllbGRzIHZhbHVlcyBjYW4gYmUgY29tYmluZWQ6CisKKyAgICAgIEhfUkVWRUFMU19NT0RVTEU6CisgICAgICBDX1JFVkVBTFNfTU9EVUxFOgorCisgICAgICAgICBJbmNsdWRlIHRoZSBDIGZpbGUgZm9yIHRoZSBtb2R1bGUgaW50byB0aGUgZmlsZSBiZWluZworICAgICAgICAgY29tcGlsZWQuICBUaGUgYWN0dWFsIGlubGluaW5nIGlzIGNvbnRyb2xsZWQgc2VwYXJhdGx5LgorCisJIFdoaWxlIG9mIG5vIGFwcGFyZW50IGJlbmVmaXQsIHRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIHRoZQorCSBpbmNsdWRlZCBtb2R1bGUsIHdoZW4gY29tcGlsZWQsIHRvIGlubGluZSBpdHMgY2FsbHMgdG8gd2hhdAorCSB3b3VsZCBvdGhlcndpemUgYmUgZXh0ZXJuYWwgZnVuY3Rpb25zLgorCisJIHtDXyxIX30gRGV0ZXJtaW5lcyB3aGVyZSB0aGUgbW9kdWxlIGlzIGlubGluZWQuICBBCisJIEhfUkVWRUFMU19NT0RVTEUgd2lsbCBiZSBpbmNsdWRlZCBldmVyeXdoZXJlLgorCisgICAgICBJTkxJTkVfR0xPQkFMUzoKKworICAgICAgICAgTWFrZSBleHRlcm5hbCBmdW5jdGlvbnMgd2l0aGluIHRoZSBtb2R1bGUgYGlubGluZScuICBUaHVzIGlmCisgICAgICAgICB0aGUgbW9kdWxlIGlzIGluY2x1ZGVkIGludG8gYSBmaWxlIGJlaW5nIGNvbXBpbGVkLCBjYWxscyB0bworCSB0aGUgaW5jbHVkZWQgbW9kdWxlcyBmdW50aW9ucyBjYW4gYmUgZWxpbWluYXRlZC4gIElOTElORV9NT0RVTEUKKwkgaW1wbGllcyBSRVZFQUxfTU9EVUxFLgorCisgICAgICBJTkxJTkVfTE9DQUxTOgorCisgICAgICAgICBNYWtlIGludGVybmFsIChzdGF0aWMpIGZ1bmN0aW9ucyB3aXRoaW4gdGhlIG1vZHVsZSBgaW5saW5lJy4KKworCisgICBDT0RJTkcgU1RZTEU6CisKKyAgIFRoZSBpbmxpbmUgYWJpbGl0eSBpcyBlbmFibGVkIGJ5IHNwZWNpZnlpbmcgZXZlcnkgZGF0YSBhbmQgZnVuY3Rpb24KKyAgIGRlY2xhcmF0aW9uIGFuZCBkZWZpbml0aW9uIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKKworICAgICAgIEdMT0JBTCBJTkxJTkUgRlVOQ1RJT05TOgorCisgICAgICAgICAgU3VjaCBmdW5jdGlvbnMgYXJlIHNtYWxsIGFuZCB1c2VkIGhlYXZpbHkuICBJbmxpbmluZyB0aGVtCisgICAgICAgICAgd2lsbCBlbGltaW5hdGUgYW4gdW5uZWNlc3NhcnkgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KKworCSAgLmg6IElOTElORV9PVVJQS0cgKHZvaWQpIG91cnBrZ19mdW5jCisJICAgICAgKGludCB4LAorCSAgICAgICBpbnQgeSk7CisKKwkgIC5jOiBJTkxJTkVfT1VSUEtHICh2b2lkKQorCSAgICAgIG91cnBrZ19mdW5jIChpbnQgeCwKKwkgICAgICAgICAgICAgICAgICAgaW50IHkpCisJICAgICAgeworCSAgICAgICAgLi4uCisJICAgICAgfQorCisKKyAgICAgICBHTE9CQUwgSU5MSU5FIFZBUklBQkxFUzoKKworICAgICAgICAgIFRoaXMgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UuCisKKworICAgICAgIEdMT0JBTCBOT04tSU5MSU5FIChFWFRFUk4pIEZVTkNUSU9OUyBBTkQgVkFSSUFCTEVTOgorCisgICAgICAgICAgVGhlc2UgaW5jbHVkZSBmdW5jdGlvbnMgd2l0aCB2YXJhcmdzIHBhcmFtZXRlcnMuICBJdCBjYW4KKyAgICAgICAgICBhbHNvIGluY2x1ZGUgbGFyZ2UgcmFyZWx5IHVzZWQgZnVuY3Rpb25zIHRoYXQgY29udHJpYnV0ZQorICAgICAgICAgIGxpdHRsZSB3aGVuIGlubGluZWQuCisKKwkgIC5oOiBleHRlcm4gaW50IG91cnBrZ19wcmludAorCSAgICAgIChjaGFyICpmbXQsIC4uLik7CisJICAgICAgZXh0ZXJuIGludCBhX2dsb2JhbF92YXJpYWJsZTsKKworCSAgLmM6ICNpZiBFWFRFUk5fT1VSUEtHX1AKKwkgICAgICBpbnQKKwkgICAgICBvdXJwa2dfcHJpbnQgKGNoYXIgKmZtdCwKKwkgICAgICAgICAgICAgICAgICAgIC4uLikKKyAgICAgICAgICAgICAgeworCSAgICAgICAgIC4uLgorCSAgICAgIH0KKwkgICAgICAjZW5kaWYKKwkgICAgICAjaWYgRVhURVJOX09VUlBLR19QCisJICAgICAgaW50IGFfZ2xvYmFsX3ZhcmlhYmxlID0gMTsKKwkgICAgICAjZW5kaWYKKworCisgICAgICAgTE9DQUwgKFNUQVRJQykgRlVOQ1RJT05TOgorCisgICAgICAgICAgVGhlc2UgY2FuIGVpdGhlciBiZSBtYXJrZWQgaW5saW5lIG9yIGp1c3Qgc3RhdGljIHN0YXRpYyB2aXM6CisKKwkgIC5oOiBTVEFUSUNfSU5MSU5FX09VUlBLRyAoaW50KSBvdXJwa2dfc3RhdGljZiAodm9pZCk7CisJICAuYzogU1RBVElDX0lOTElORV9PVVJQS0cgKGludCkKKwkgICAgICBvdXJwa2dfc3RhdGljZiAodm9pZCkKKwkgICAgICB7CisJICAgICAgICAuLgorCSAgICAgIH0KKworCSAgLmg6IFNUQVRJQ19PVVJQS0cgKGludCkgb3VycGtnX3N0YXRpY2YgKHZvaWQpOworCSAgLmM6IFNUQVRJQ19PVVJQS0cgKGludCkKKwkgICAgICBvdXJwa2dfc3RhdGljZiAodm9pZCkKKwkgICAgICB7CisJICAgICAgICAuLgorCSAgICAgIH0KKworCisgICAgICAgQWxsIC5oIGZpbGVzOgorCisKKyAgICAgICAgICBBbGwgbW9kdWxlcyBtdXN0IHdyYXAgdGhlaXIgLmggY29kZSBpbiB0aGUgZm9sbG93aW5nOgorCisJICAjaWZuZGVmIE9VUlBLR19ICisJICAjZGVmaW5lIE9VUlBLR19ICisJICAuLi4gY29kZSBwcm9wZXIgLi4uCisJICAjZW5kaWYKKworICAgICAgICAgIEluIGFkZGl0aW9uLCBtb2R1bGVzIHRoYXQgd2FudCB0byBhbGxvdyBnbG9iYWwgaW5saW5pbmcgbXVzdAorICAgICAgICAgIGluY2x1ZGUgdGhlIGxpbmVzIChiZWxvdykgYXQgdGhlIGVuZCBvZiB0aGUgLmggZmlsZS4gKEZJWE1FOgorICAgICAgICAgIFNob3VsZG4ndCBiZSBuZWVkZWQpLgorCisgICAgICAgICAgI2lmIEhfUkVWRUFMU19NT0RVTEVfUCAoT1VSUEtHX0lOTElORSkKKyAgICAgICAgICAjaW5jbHVkZSAib3VycGtnLmMiCisgICAgICAgICAgI2VuZGlmCisKKworICAgICAgIEFsbCAuYyBmaWxlczoKKworICAgICAgICAgIEFsbCBtb2R1bGVzIG11c3Qgd3JhcCB0aGVpciAuYyBjb2RlIGluIHRoZSBmb2xsb3dpbmcKKworCSAgI2lmbmRlZiBPVVJQS0dfQworCSAgI2RlZmluZSBPVVJQS0dfQworCSAgLi4uIGNvZGUgcHJvcGVyIC4uLgorCSAgI2VuZGlmCisKKworICAgTk9XIElUIFdPUktTOgorCisgICAgICAwOgorCisgICAgICBTaW5jZSBubyBpbmxpbmluZyBpcyBkZWZpbmVkLiBBbGwgbWFjcm8ncyBnZXQgc3RhbmRhcmQgZGVmYXVsdHMKKyAgICAgIChleHRlcm4sIHN0YXRpYywgLi4uKS4KKyAgICAgIAorCisKKyAgICAgIEhfUkVWRUFMU19NT0RVTEUgKGFsdCBpbmNsdWRlcyBvdXIpOgorCisKKyAgICAgIGFsdHByb2cuYyBkZWZpbmVzIEFMVFBST0dfQyBhbmQgdGhlbiBpbmNsdWRlcyBzaW0taW5saW5lLmguCisKKyAgICAgIEluIHNpbS1pbmxpbmUuaCB0aGUgZXhwcmVzc2lvbiBgYCBIX1JFVkVBTFNfTU9EVUxFX1AKKyAgICAgIChPVVJQUk9HX0lOTElORSkgJiYgISAgZGVmaW5lZCAoT1VSUFJPR19DKSAmJiBSRVZFQUxfTU9EVUxFX1AKKyAgICAgIChPVVJQUk9HX0lOTElORSkgJycgaXMgVFJVRSBzbyBpdCBkZWZpbmVzICpfT1VSUFJPRyBhcyBzdGF0aWMKKyAgICAgIGFuZCBFWFRFUk5fT1VSUFJPR19QIGFzIEZBTFNFLgorCisgICAgICBhbHRwcm9nLmMgaW5jbHVkZXMgb3VycHJvZy5oLgorCisgICAgICBJbiBvdXJwcm9nLmggdGhlIGV4cHJlc3Npb24gYGBIX1JFVkVBTFNfTU9EVUxFX1AKKyAgICAgIChPVVJQUk9HX0lOTElORSknJyBpcyBUUlVFIHNvIGl0IGluY2x1ZGVzIG91cnByb2cuYy4KKworICAgICAgQ29uc2VxdWVudGx5LCBhbGwgdGhlIGNvZGUgaW4gb3VycHJvZy5jIGlzIHZpc2libGUgYW5kIHN0YXRpYyBpbgorICAgICAgdGhlIGZpbGUgYWx0cHJvZy5jCisKKworCisgICAgICBIX1JFVkVBTFNfTU9EVUxFIChvdXIgaW5jbHVkZXMgb3VyKToKKworCisgICAgICBvdXJwcm9nLmMgZGVmaW5lcyBPVVJQUk9HX0MgYW5kIHRoZW4gaW5jbHVkZXMgc2ltLWlubGluZS5oLgorCisgICAgICBJbiBzaW0taW5saW5lLmggdGhlIHRlcm0gYGAgISBkZWZpbmVkIChPVVJQUk9HX0MpICcnIGlzIEZBTFNFIHNvCisgICAgICBpdCBkZWZpbmVzICpfT1VSUFJPRyBhcyBub24tc3RhdGljIGFuZCBFWFRFUk5fT1VSUFJPR19QIGFzIFRSVUUuCisKKyAgICAgIG91cnByb2cuYyBpbmNsdWRlcyBvdXJwcm9nLmguCisKKyAgICAgIEluIG91cnByb2cuaCB0aGUgZXhwcmVzc2lvbiBgYEhfUkVWRUFMU19NT0RVTEVfUAorICAgICAgKE9VUlBST0dfSU5MSU5FKScnIGlzIHRydWUgc28gaXQgaW5jbHVkZXMgb3VycHJvZy5jLgorCisgICAgICBJbiBvdXJwcm9nLmMgKHNlY29uZCBpbmNsdWRlKSB0aGUgZXhwcmVzc2lvbiBkZWZpbmVkIChPVVJQUk9HX0MpCisgICAgICBhbmQgc28gdGhlIGJvZHkgaXMgbm90IHJlLWluY2x1ZGVkLgorCisgICAgICBDb25zZXF1ZW50bHksIG91cnByb2cubyB3aWxsIGNvbnRhaW4gYSBub24tc3RhdGljIGNvcHkgb2YgYWxsCisgICAgICB0aGUgZXhwb3J0ZWQgc3ltYm9scy4KKworCisKKyAgICAgIENfUkVWRUFMU19NT0RVTEUgKGFsdCBpbmNsdWRlcyBvdXIpOgorCisKKyAgICAgIGFsdHByb2cuYyBkZWZpbmVzIEFMVFBST0dfQyBhbmQgdGhlbiBpbmNsdWRlcyBzaW0taW5saW5lLmMKKworICAgICAgc2ltLWlubGluZS5jIGRlZmluZXMgQ19JTkxJTkVfQyBhbmQgdGhlbiBpbmNsdWRlcyBzaW0taW5saW5lLmgKKyAgICAgIAorICAgICAgSW4gc2ltLWlubGluZS5oIHRoZSBleHByZXNzaW9uIGBgIGRlZmluZWQgKFNJTV9JTkxJTkUpICYmICEKKyAgICAgIGRlZmluZWQgKE9VUlBST0dfQykgJiYgUkVWRUFMX01PRFVMRV9QIChPVVJQUk9HX0lOTElORSkgJycgaXMKKyAgICAgIHRydWUgc28gaXQgZGVmaW5lcyAqX09VUlBST0cgYXMgc3RhdGljIGFuZCBFWFRFUk5fT1VSUFJPR19QIGFzCisgICAgICBGQUxTRS4KKworICAgICAgSW4gc2ltLWlubGluZS5jIHRoZSBleHByZXNzaW9uIGBgQ19SRVZFQUxTX01PRFVMRV9QCisgICAgICAoT1VSUFJPR19JTkxJTkUpJycgaXMgdHJ1ZSBzbyBpdCBpbmNsdWRlcyBvdXJwcm9nLmMuCisKKyAgICAgIENvbnNlcXVlbnRseSwgYWxsIHRoZSBjb2RlIGluIG91cnByb2cuYyBpcyB2aXNpYmxlIGFuZCBzdGF0aWMgaW4KKyAgICAgIHRoZSBmaWxlIGFsdHByb2cuYy4KKworCisKKyAgICAgIENfUkVWRUFMU19NT0RVTEUgKG91ciBpbmNsdWRlcyBvdXIpOgorCisKKyAgICAgIG91cnByb2cuYyBkZWZpbmVzIE9VUlBST0dfQyBhbmQgdGhlbiBpbmNsdWRlcyBzaW0taW5saW5lLmMKKworICAgICAgc2ltLWlubGluZS5jIGRlZmluZXMgQ19JTkxJTkVfQyBhbmQgdGhlbiBpbmNsdWRlcyBzaW0taW5saW5lLmgKKyAgICAgIAorICAgICAgSW4gc2ltLWlubGluZS5oIHRoZSB0ZXJtIGBgICEgIGRlZmluZWQgKE9VUlBST0dfQykgJycgaXMgRkFMU0UKKyAgICAgIHNvIGl0IGRlZmluZXMgKl9PVVJQUk9HIGFzIG5vbi1zdGF0aWMgYW5kIEVYVEVSTl9PVVJQUk9HX1AgYXMKKyAgICAgIFRSVUUuCisKKyAgICAgIENvbnNlcXVlbnRseSwgb3VycHJvZy5vIHdpbGwgY29udGFpbiBhIG5vbi1zdGF0aWMgY29weSBvZiBhbGwKKyAgICAgIHRoZSBleHBvcnRlZCBzeW1ib2xzLgorCisKKworICAgUkVBTElUWSBDSEVDSzoKKworICAgVGhpcyBpcyBub3QgZm9yIHRoZSBmYWludCBoZWFydGVkLiAgSSd2ZSBzZWVuIEdDQyBnZXQgdXAgdG8gNTAwbWIKKyAgIHRyeWluZyB0byBjb21waWxlIHdoYXQgdGhpcyBjYW4gY3JlYXRlLiAqLworDAorI2RlZmluZSBIX1JFVkVBTFNfTU9EVUxFCQkxCisjZGVmaW5lIENfUkVWRUFMU19NT0RVTEUJCTIKKyNkZWZpbmUgSU5MSU5FX0dMT0JBTFMJCQk0CisjZGVmaW5lIElOTElORV9MT0NBTFMJCQk4CisKKyNkZWZpbmUgUkVHUEFSTV9NT0RVTEUgICAgICAgICAgICAgICAgIDMyCisKKyNkZWZpbmUgQUxMX0hfSU5MSU5FIChIX1JFVkVBTFNfTU9EVUxFIHwgSU5MSU5FX0dMT0JBTFMgfCBJTkxJTkVfTE9DQUxTKQorI2RlZmluZSBBTExfQ19JTkxJTkUgKENfUkVWRUFMU19NT0RVTEUgfCBJTkxJTkVfR0xPQkFMUyB8IElOTElORV9MT0NBTFMpCisKKworLyogRGVmYXVsdCBtYWNybyB0byBzaW1wbGlmeSBjb250cm9sIHNldmVyYWwgb2Yga2V5IHRoZSBpbmxpbmVzICovCisKKyNpZm5kZWYgREVGQVVMVF9JTkxJTkUKKyNkZWZpbmUJREVGQVVMVF9JTkxJTkUJCQlJTkxJTkVfTE9DQUxTCisjZW5kaWYKKworI2RlZmluZSBSRVZFQUxfTU9EVUxFX1AoWCkgKFggJiAoSF9SRVZFQUxTX01PRFVMRSB8IENfUkVWRUFMU19NT0RVTEUpKQorI2RlZmluZSBIX1JFVkVBTFNfTU9EVUxFX1AoWCkgKChYICYgSF9SRVZFQUxTX01PRFVMRSkpCisjZGVmaW5lIENfUkVWRUFMU19NT0RVTEVfUChYKSAoKFggJiBDX1JFVkVBTFNfTU9EVUxFKSkKKworCisjaWZuZGVmIEhBVkVfSU5MSU5FCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgSEFWRV9JTkxJTkUKKyNlbmRpZgorI2VuZGlmCisKKworLyogWW91ciBjb21waWxlcnMgaW5saW5lIHByZWZpeCAqLworCisjaWZuZGVmIElOTElORQorI2lmIGRlZmluZWQgKF9fR05VQ19fKSAmJiBkZWZpbmVkIChfX09QVElNSVpFX18pCisjZGVmaW5lIElOTElORSBfX2lubGluZV9fCisjZWxzZQorI2RlZmluZSBJTkxJTkUgLyppbmxpbmUqLworI2VuZGlmCisjZW5kaWYKKworLyogPz8/IFRlbXBvcmFyeSwgcGVuZGluZyBkZWNpc2lvbiB0byBhbHdheXMgdXNlIGV4dGVybiBpbmxpbmUgYW5kIGRvIGEgdmFzdAorICAgY2xlYW51cCBvZiBpbmxpbmUgc3VwcG9ydC4gICovCisjaWZuZGVmIElOTElORTIKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykKKyNkZWZpbmUgSU5MSU5FMiBfX2lubGluZV9fCisjZWxzZQorI2RlZmluZSBJTkxJTkUyIC8qaW5saW5lKi8KKyNlbmRpZgorI2VuZGlmCisKKworLyogWW91ciBjb21waWxlcidzIHN0YXRpYyBpbmxpbmUgcHJlZml4ICovCisKKyNpZm5kZWYgU1RBVElDX0lOTElORQorI2RlZmluZSBTVEFUSUNfSU5MSU5FIHN0YXRpYyBJTkxJTkUKKyNlbmRpZgorCisKKy8qIFlvdXIgY29tcGlsZXIncyBleHRlcm4gaW5saW5lIHByZWZpeCAqLworCisjaWZuZGVmIEVYVEVSTl9JTkxJTkUKKyNkZWZpbmUgRVhURVJOX0lOTElORSBleHRlcm4gSU5MSU5FMgorI2VuZGlmCisKKworLyogWW91ciBjb21waWxlcidzIG5vLXJldHVybiByZXNlcnZlZCB3b3JkICovCisKKyNpZm5kZWYgTk9SRVRVUk4KKyNkZWZpbmUgTk9SRVRVUk4KKyNlbmRpZgorCisKKworLyogWW91ciBjb21waWxlcnMncyB1bnVzZWQgcmVzZXJ2ZWQgd29yZCAqLworCisjaWYgIWRlZmluZWQgKFVOVVNFRCkKKyNpZiAoIWRlZmluZWQgKF9fR05VQ19fKSBcCisgICAgIHx8IChfX0dOVUNfXyA8IDIpIFwKKyAgICAgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA3KSkKKyNkZWZpbmUgVU5VU0VECisjZWxzZQorI2RlZmluZSBVTlVTRUQgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCisjZW5kaWYKKyNlbmRpZgorCisKKworCisvKiBZb3VyIGNvbXBpbGVycyBub25zdGFuZGFyZCBmdW5jdGlvbiBjYWxsIG1lY2hhbmlzbSBwcmVmaXggKi8KKworI2lmICFkZWZpbmVkIFJFR1BBUk0KKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgKGRlZmluZWQgKF9faTM4Nl9fKSB8fCBkZWZpbmVkIChfX2k0ODZfXykgfHwgZGVmaW5lZCAoX19pNTg2X18pIHx8IGRlZmluZWQgKF9faTY4Nl9fKSkKKyNpZiAoV0lUSF9SRUdQQVJNICYmIFdJVEhfU1REQ0FMTCkKKyNkZWZpbmUgUkVHUEFSTSBfX2F0dHJpYnV0ZV9fKChfX3JlZ3Bhcm1fXyhXSVRIX1JFR1BBUk0pLF9fc3RkY2FsbF9fKSkKKyNlbHNlCisjaWYgKFdJVEhfUkVHUEFSTSAmJiAhV0lUSF9TVERDQUxMKQorI2RlZmluZSBSRUdQQVJNIF9fYXR0cmlidXRlX18oKF9fcmVncGFybV9fKFdJVEhfUkVHUEFSTSkpKQorI2Vsc2UKKyNpZiAoIVdJVEhfUkVHUEFSTSAmJiBXSVRIX1NURENBTEwpCisjZGVmaW5lIFJFR1BBUk0gX19hdHRyaWJ1dGVfXygoX19zdGRjYWxsX18pKQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkIFJFR1BBUk0KKyNkZWZpbmUgUkVHUEFSTQorI2VuZGlmCisKKworDAorLyogKioqKioKKyAgIHNpbS1iaXRzIGFuZCBzaW0tZW5kaWFuIGFyZSB0cmVhdGVkIGRpZmZlcmVudGx5IGZyb20gdGhlIHJlc3QKKyAgIG9mIHRoZSBtb2R1bGVzIGJlbG93LiAgVGhlaXIgZGVmYXVsdCB2YWx1ZSBpcyBBTExfSF9JTkxJTkUuCisgICBUaGUgcmVzdCBhcmUgQUxMX0NfSU5MSU5FLiAgRG9uJ3QgYmxpbmssIHlvdSdsbCBtaXNzIGl0IQorICAgKioqKioKKyAgICovCisKKy8qIHNpbS1iaXRzICovCisKKyNpZiAhZGVmaW5lZCAoU0lNX0JJVFNfSU5MSU5FKSAmJiAoREVGQVVMVF9JTkxJTkUpCisjIGRlZmluZSBTSU1fQklUU19JTkxJTkUgKEFMTF9IX0lOTElORSkKKyNlbmRpZgorCisjaWYgKFNJTV9CSVRTX0lOTElORSAmIFJFR1BBUk1fTU9EVUxFKQorIyBkZWZpbmUgUkVHUEFSTV9TSU1fQklUUyBSRUdQQVJNCisjZWxzZQorIyBkZWZpbmUgUkVHUEFSTV9TSU1fQklUUworI2VuZGlmCisKKyNpZiAoKEhfUkVWRUFMU19NT0RVTEVfUCAoU0lNX0JJVFNfSU5MSU5FKSB8fCBkZWZpbmVkIChTSU1fSU5MSU5FX0MpKSBcCisgICAgICYmICFkZWZpbmVkIChTSU1fQklUU19DKSBcCisgICAgICYmIChSRVZFQUxfTU9EVUxFX1AgKFNJTV9CSVRTX0lOTElORSkpKQorIyBpZiAoU0lNX0JJVFNfSU5MSU5FICYgSU5MSU5FX0dMT0JBTFMpCisjICBkZWZpbmUgSU5MSU5FX1NJTV9CSVRTKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKKyMgIGRlZmluZSBFWFRFUk5fU0lNX0JJVFNfUCAwCisjIGVsc2UKKyMgIGRlZmluZSBJTkxJTkVfU0lNX0JJVFMoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VEIFJFR1BBUk1fU0lNX0JJVFMKKyMgIGRlZmluZSBFWFRFUk5fU0lNX0JJVFNfUCAwCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgSU5MSU5FX1NJTV9CSVRTKFRZUEUpIFRZUEUgUkVHUEFSTV9TSU1fQklUUworIyBkZWZpbmUgRVhURVJOX1NJTV9CSVRTX1AgMQorI2VuZGlmCisKKyNpZiAoU0lNX0JJVFNfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU0lNX0JJVFMoVFlQRSkgc3RhdGljIElOTElORSBUWVBFCisjZWxzZQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9TSU1fQklUUyhUWVBFKSBzdGF0aWMgVFlQRSBSRUdQQVJNX1NJTV9CSVRTCisjZW5kaWYKKworI2RlZmluZSBTVEFUSUNfU0lNX0JJVFMoVFlQRSkgc3RhdGljIFRZUEUKKworCisKKy8qIHNpbS1jb3JlICovCisKKyNpZiAhZGVmaW5lZCAoU0lNX0NPUkVfSU5MSU5FKSAmJiAoREVGQVVMVF9JTkxJTkUpCisjIGRlZmluZSBTSU1fQ09SRV9JTkxJTkUgQUxMX0NfSU5MSU5FCisjZW5kaWYKKworI2lmIChTSU1fQ09SRV9JTkxJTkUgJiBSRUdQQVJNX01PRFVMRSkKKyMgZGVmaW5lIFJFR1BBUk1fU0lNX0NPUkUgUkVHUEFSTQorI2Vsc2UKKyMgZGVmaW5lIFJFR1BBUk1fU0lNX0NPUkUKKyNlbmRpZgorCisjaWYgKChIX1JFVkVBTFNfTU9EVUxFX1AgKFNJTV9DT1JFX0lOTElORSkgfHwgZGVmaW5lZCAoU0lNX0lOTElORV9DKSkgXAorICAgICAmJiAhZGVmaW5lZCAoU0lNX0NPUkVfQykgXAorICAgICAmJiAoUkVWRUFMX01PRFVMRV9QIChTSU1fQ09SRV9JTkxJTkUpKSkKKyMgaWYgKFNJTV9DT1JFX0lOTElORSAmIElOTElORV9HTE9CQUxTKQorIyAgZGVmaW5lIElOTElORV9TSU1fQ09SRShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECisjICBkZWZpbmUgRVhURVJOX1NJTV9DT1JFX1AgMAorI2Vsc2UKKyMgIGRlZmluZSBJTkxJTkVfU0lNX0NPUkUoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VEIFJFR1BBUk1fU0lNX0NPUkUKKyMgIGRlZmluZSBFWFRFUk5fU0lNX0NPUkVfUCAwCisjZW5kaWYKKyNlbHNlCisjIGRlZmluZSBJTkxJTkVfU0lNX0NPUkUoVFlQRSkgVFlQRSBSRUdQQVJNX1NJTV9DT1JFCisjIGRlZmluZSBFWFRFUk5fU0lNX0NPUkVfUCAxCisjZW5kaWYKKworI2lmIChTSU1fQ09SRV9JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9TSU1fQ09SRShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKKyNlbHNlCisjIGRlZmluZSBTVEFUSUNfSU5MSU5FX1NJTV9DT1JFKFRZUEUpIHN0YXRpYyBUWVBFIFJFR1BBUk1fU0lNX0NPUkUKKyNlbmRpZgorCisjZGVmaW5lIFNUQVRJQ19TSU1fQ09SRShUWVBFKSBzdGF0aWMgVFlQRQorCisKKworLyogc2ltLWVuZGlhbiAqLworCisjaWYgIWRlZmluZWQgKFNJTV9FTkRJQU5fSU5MSU5FKSAmJiAoREVGQVVMVF9JTkxJTkUpCisjIGRlZmluZSBTSU1fRU5ESUFOX0lOTElORSBBTExfSF9JTkxJTkUKKyNlbmRpZgorCisjaWYgKFNJTV9FTkRJQU5fSU5MSU5FICYgUkVHUEFSTV9NT0RVTEUpCisjIGRlZmluZSBSRUdQQVJNX1NJTV9FTkRJQU4gUkVHUEFSTQorI2Vsc2UKKyMgZGVmaW5lIFJFR1BBUk1fU0lNX0VORElBTgorI2VuZGlmCisKKyNpZiAoKEhfUkVWRUFMU19NT0RVTEVfUCAoU0lNX0VORElBTl9JTkxJTkUpIHx8IGRlZmluZWQgKFNJTV9JTkxJTkVfQykpIFwKKyAgICAgJiYgIWRlZmluZWQgKFNJTV9FTkRJQU5fQykgXAorICAgICAmJiAoUkVWRUFMX01PRFVMRV9QIChTSU1fRU5ESUFOX0lOTElORSkpKQorIyBpZiAoU0lNX0VORElBTl9JTkxJTkUgJiBJTkxJTkVfR0xPQkFMUykKKyMgIGRlZmluZSBJTkxJTkVfU0lNX0VORElBTihUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECisjICBkZWZpbmUgRVhURVJOX1NJTV9FTkRJQU5fUCAwCisjIGVsc2UKKyMgIGRlZmluZSBJTkxJTkVfU0lNX0VORElBTihUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQgUkVHUEFSTV9TSU1fRU5ESUFOCisjICBkZWZpbmUgRVhURVJOX1NJTV9FTkRJQU5fUCAwCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgSU5MSU5FX1NJTV9FTkRJQU4oVFlQRSkgVFlQRSBSRUdQQVJNX1NJTV9FTkRJQU4KKyMgZGVmaW5lIEVYVEVSTl9TSU1fRU5ESUFOX1AgMQorI2VuZGlmCisKKyNpZiAoU0lNX0VORElBTl9JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9TSU1fRU5ESUFOKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQorI2Vsc2UKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU0lNX0VORElBTihUWVBFKSBzdGF0aWMgVFlQRSBSRUdQQVJNX1NJTV9FTkRJQU4KKyNlbmRpZgorCisjZGVmaW5lIFNUQVRJQ19TSU1fRU5ESUFOKFRZUEUpIHN0YXRpYyBUWVBFCisKKworCisvKiBzaW0tZXZlbnRzICovCisKKyNpZiAhZGVmaW5lZCAoU0lNX0VWRU5UU19JTkxJTkUpICYmIChERUZBVUxUX0lOTElORSkKKyMgZGVmaW5lIFNJTV9FVkVOVFNfSU5MSU5FIEFMTF9DX0lOTElORQorI2VuZGlmCisKKyNpZiAoU0lNX0VWRU5UU19JTkxJTkUgJiBSRUdQQVJNX01PRFVMRSkKKyMgZGVmaW5lIFJFR1BBUk1fU0lNX0VWRU5UUyBSRUdQQVJNCisjZWxzZQorIyBkZWZpbmUgUkVHUEFSTV9TSU1fRVZFTlRTCisjZW5kaWYKKworI2lmICgoSF9SRVZFQUxTX01PRFVMRV9QIChTSU1fRVZFTlRTX0lOTElORSkgfHwgZGVmaW5lZCAoU0lNX0lOTElORV9DKSkgXAorICAgICAmJiAhZGVmaW5lZCAoU0lNX0VWRU5UU19DKSBcCisgICAgICYmIChSRVZFQUxfTU9EVUxFX1AgKFNJTV9FVkVOVFNfSU5MSU5FKSkpCisjIGlmIChTSU1fRVZFTlRTX0lOTElORSAmIElOTElORV9HTE9CQUxTKQorIyAgZGVmaW5lIElOTElORV9TSU1fRVZFTlRTKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKKyMgIGRlZmluZSBFWFRFUk5fU0lNX0VWRU5UU19QIDAKKyMgZWxzZQorIyAgZGVmaW5lIElOTElORV9TSU1fRVZFTlRTKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRCBSRUdQQVJNX1NJTV9FVkVOVFMKKyMgIGRlZmluZSBFWFRFUk5fU0lNX0VWRU5UU19QIDAKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBJTkxJTkVfU0lNX0VWRU5UUyhUWVBFKSBUWVBFIFJFR1BBUk1fU0lNX0VWRU5UUworIyBkZWZpbmUgRVhURVJOX1NJTV9FVkVOVFNfUCAxCisjZW5kaWYKKworI2lmIChTSU1fRVZFTlRTX0lOTElORSAmIElOTElORV9MT0NBTFMpCisjIGRlZmluZSBTVEFUSUNfSU5MSU5FX1NJTV9FVkVOVFMoVFlQRSkgc3RhdGljIElOTElORSBUWVBFCisjZWxzZQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9TSU1fRVZFTlRTKFRZUEUpIHN0YXRpYyBUWVBFIFJFR1BBUk1fU0lNX0VWRU5UUworI2VuZGlmCisKKyNkZWZpbmUgU1RBVElDX1NJTV9FVkVOVFMoVFlQRSkgc3RhdGljIFRZUEUKKworCisKKy8qIHNpbS1mcHUgKi8KKworI2lmICFkZWZpbmVkIChTSU1fRlBVX0lOTElORSkgJiYgKERFRkFVTFRfSU5MSU5FKQorIyBkZWZpbmUgU0lNX0ZQVV9JTkxJTkUgQUxMX0NfSU5MSU5FCisjZW5kaWYKKworI2lmIChTSU1fRlBVX0lOTElORSAmIFJFR1BBUk1fTU9EVUxFKQorIyBkZWZpbmUgUkVHUEFSTV9TSU1fRlBVIFJFR1BBUk0KKyNlbHNlCisjIGRlZmluZSBSRUdQQVJNX1NJTV9GUFUKKyNlbmRpZgorCisjaWYgKChIX1JFVkVBTFNfTU9EVUxFX1AgKFNJTV9GUFVfSU5MSU5FKSB8fCBkZWZpbmVkIChTSU1fSU5MSU5FX0MpKSBcCisgICAgICYmICFkZWZpbmVkIChTSU1fRlBVX0MpIFwKKyAgICAgJiYgKFJFVkVBTF9NT0RVTEVfUCAoU0lNX0ZQVV9JTkxJTkUpKSkKKyMgaWYgKFNJTV9GUFVfSU5MSU5FICYgSU5MSU5FX0dMT0JBTFMpCisjICBkZWZpbmUgSU5MSU5FX1NJTV9GUFUoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9TSU1fRlBVX1AgMAorIyBlbHNlCisjICBkZWZpbmUgSU5MSU5FX1NJTV9GUFUoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VEIFJFR1BBUk1fU0lNX0ZQVQorIyAgZGVmaW5lIEVYVEVSTl9TSU1fRlBVX1AgMAorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIElOTElORV9TSU1fRlBVKFRZUEUpIFRZUEUgUkVHUEFSTV9TSU1fRlBVCisjIGRlZmluZSBFWFRFUk5fU0lNX0ZQVV9QIDEKKyNlbmRpZgorCisjaWYgKFNJTV9GUFVfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU0lNX0ZQVShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKKyNlbHNlCisjIGRlZmluZSBTVEFUSUNfSU5MSU5FX1NJTV9GUFUoVFlQRSkgc3RhdGljIFRZUEUgUkVHUEFSTV9TSU1fRlBVCisjZW5kaWYKKworI2RlZmluZSBTVEFUSUNfU0lNX0ZQVShUWVBFKSBzdGF0aWMgVFlQRQorCisKKworLyogc2ltLXR5cGVzICovCisKKyNpZiAoU0lNX1RZUEVTX0lOTElORSAmIFJFR1BBUk1fTU9EVUxFKQorIyBkZWZpbmUgUkVHUEFSTV9TSU1fVFlQRVMgUkVHUEFSTQorI2Vsc2UKKyMgZGVmaW5lIFJFR1BBUk1fU0lNX1RZUEVTCisjZW5kaWYKKworI2lmICgoSF9SRVZFQUxTX01PRFVMRV9QIChTSU1fVFlQRVNfSU5MSU5FKSB8fCBkZWZpbmVkIChTSU1fSU5MSU5FX0MpKSBcCisgICAgICYmICFkZWZpbmVkIChTSU1fVFlQRVNfQykgXAorICAgICAmJiAoUkVWRUFMX01PRFVMRV9QIChTSU1fVFlQRVNfSU5MSU5FKSkpCisjIGlmIChTSU1fVFlQRVNfSU5MSU5FICYgSU5MSU5FX0dMT0JBTFMpCisjICBkZWZpbmUgSU5MSU5FX1NJTV9UWVBFUyhUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECisjICBkZWZpbmUgRVhURVJOX1NJTV9UWVBFU19QIDAKKyMgZWxzZQorIyAgZGVmaW5lIElOTElORV9TSU1fVFlQRVMoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VEIFJFR1BBUk1fU0lNX1RZUEVTCisjICBkZWZpbmUgRVhURVJOX1NJTV9UWVBFU19QIDAKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBJTkxJTkVfU0lNX1RZUEVTKFRZUEUpIFRZUEUgUkVHUEFSTV9TSU1fVFlQRVMKKyMgZGVmaW5lIEVYVEVSTl9TSU1fVFlQRVNfUCAxCisjZW5kaWYKKworI2lmIChTSU1fVFlQRVNfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU0lNX1RZUEVTKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQorI2Vsc2UKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU0lNX1RZUEVTKFRZUEUpIHN0YXRpYyBUWVBFIFJFR1BBUk1fU0lNX1RZUEVTCisjZW5kaWYKKworI2RlZmluZSBTVEFUSUNfU0lNX1RZUEVTKFRZUEUpIHN0YXRpYyBUWVBFCisKKworCisvKiBzaW1fbWFpbiAqLworCisjaWYgIWRlZmluZWQgKFNJTV9NQUlOX0lOTElORSkgJiYgKERFRkFVTFRfSU5MSU5FKQorIyBkZWZpbmUgU0lNX01BSU5fSU5MSU5FIChBTExfQ19JTkxJTkUpCisjZW5kaWYKKworI2lmIChTSU1fTUFJTl9JTkxJTkUgJiBSRUdQQVJNX01PRFVMRSkKKyMgZGVmaW5lIFJFR1BBUk1fU0lNX01BSU4gUkVHUEFSTQorI2Vsc2UKKyMgZGVmaW5lIFJFR1BBUk1fU0lNX01BSU4KKyNlbmRpZgorCisjaWYgKChIX1JFVkVBTFNfTU9EVUxFX1AgKFNJTV9NQUlOX0lOTElORSkgfHwgZGVmaW5lZCAoU0lNX0lOTElORV9DKSkgXAorICAgICAmJiAhZGVmaW5lZCAoU0lNX01BSU5fQykgXAorICAgICAmJiAoUkVWRUFMX01PRFVMRV9QIChTSU1fTUFJTl9JTkxJTkUpKSkKKyMgaWYgKFNJTV9NQUlOX0lOTElORSAmIElOTElORV9HTE9CQUxTKQorIyAgZGVmaW5lIElOTElORV9TSU1fTUFJTihUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECisjICBkZWZpbmUgRVhURVJOX1NJTV9NQUlOX1AgMAorIyBlbHNlCisjICBkZWZpbmUgSU5MSU5FX1NJTV9NQUlOKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRCBSRUdQQVJNX1NJTV9NQUlOCisjICBkZWZpbmUgRVhURVJOX1NJTV9NQUlOX1AgMAorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIElOTElORV9TSU1fTUFJTihUWVBFKSBUWVBFIFJFR1BBUk1fU0lNX01BSU4KKyMgZGVmaW5lIEVYVEVSTl9TSU1fTUFJTl9QIDEKKyNlbmRpZgorCisjaWYgKFNJTV9NQUlOX0lOTElORSAmIElOTElORV9MT0NBTFMpCisjIGRlZmluZSBTVEFUSUNfSU5MSU5FX1NJTV9NQUlOKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQorI2Vsc2UKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU0lNX01BSU4oVFlQRSkgc3RhdGljIFRZUEUgUkVHUEFSTV9TSU1fTUFJTgorI2VuZGlmCisKKyNkZWZpbmUgU1RBVElDX1NJTV9NQUlOKFRZUEUpIHN0YXRpYyBUWVBFCisMCisvKiBlbmdpbmUgKi8KKworI2lmIChFTkdJTkVfSU5MSU5FICYgUkVHUEFSTV9NT0RVTEUpCisjIGRlZmluZSBSRUdQQVJNX0VOR0lORSBSRUdQQVJNCisjZWxzZQorIyBkZWZpbmUgUkVHUEFSTV9FTkdJTkUKKyNlbmRpZgorCisjaWYgKChIX1JFVkVBTFNfTU9EVUxFX1AgKEVOR0lORV9JTkxJTkUpIHx8IGRlZmluZWQgKFNJTV9JTkxJTkVfQykpIFwKKyAgICAgJiYgIWRlZmluZWQgKEVOR0lORV9DKSBcCisgICAgICYmIChSRVZFQUxfTU9EVUxFX1AgKEVOR0lORV9JTkxJTkUpKSkKKyMgaWYgKEVOR0lORV9JTkxJTkUgJiBJTkxJTkVfR0xPQkFMUykKKyMgIGRlZmluZSBJTkxJTkVfRU5HSU5FKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKKyMgIGRlZmluZSBFWFRFUk5fRU5HSU5FX1AgMAorIyBlbHNlCisjICBkZWZpbmUgSU5MSU5FX0VOR0lORShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQgUkVHUEFSTV9FTkdJTkUKKyMgIGRlZmluZSBFWFRFUk5fRU5HSU5FX1AgMAorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIElOTElORV9FTkdJTkUoVFlQRSkgVFlQRSBSRUdQQVJNX0VOR0lORQorIyBkZWZpbmUgRVhURVJOX0VOR0lORV9QIDEKKyNlbmRpZgorCisjaWYgKEVOR0lORV9JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9FTkdJTkUoVFlQRSkgc3RhdGljIElOTElORSBUWVBFCisjZWxzZQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9FTkdJTkUoVFlQRSkgc3RhdGljIFRZUEUgUkVHUEFSTV9FTkdJTkUKKyNlbmRpZgorCisjZGVmaW5lIFNUQVRJQ19FTkdJTkUoVFlQRSkgc3RhdGljIFRZUEUKKworCisKKy8qIGljYWNoZSAqLworCisjaWYgKElDQUNIRV9JTkxJTkUgJiBSRUdQQVJNX01PRFVMRSkKKyMgZGVmaW5lIFJFR1BBUk1fSUNBQ0hFIFJFR1BBUk0KKyNlbHNlCisjIGRlZmluZSBSRUdQQVJNX0lDQUNIRQorI2VuZGlmCisKKyNpZiAoKEhfUkVWRUFMU19NT0RVTEVfUCAoSUNBQ0hFX0lOTElORSkgfHwgZGVmaW5lZCAoU0lNX0lOTElORV9DKSkgXAorICAgICAmJiAhZGVmaW5lZCAoSUNBQ0hFX0MpIFwKKyAgICAgJiYgKFJFVkVBTF9NT0RVTEVfUCAoSUNBQ0hFX0lOTElORSkpKQorIyBpZiAoSUNBQ0hFX0lOTElORSAmIElOTElORV9HTE9CQUxTKQorIyAgZGVmaW5lIElOTElORV9JQ0FDSEUoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9JQ0FDSEVfUCAwCisjZWxzZQorIyAgZGVmaW5lIElOTElORV9JQ0FDSEUoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VEIFJFR1BBUk1fSUNBQ0hFCisjICBkZWZpbmUgRVhURVJOX0lDQUNIRV9QIDAKKyNlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIElOTElORV9JQ0FDSEUoVFlQRSkgVFlQRSBSRUdQQVJNX0lDQUNIRQorIyBkZWZpbmUgRVhURVJOX0lDQUNIRV9QIDEKKyNlbmRpZgorCisjaWYgKElDQUNIRV9JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9JQ0FDSEUoVFlQRSkgc3RhdGljIElOTElORSBUWVBFCisjZWxzZQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9JQ0FDSEUoVFlQRSkgc3RhdGljIFRZUEUgUkVHUEFSTV9JQ0FDSEUKKyNlbmRpZgorCisjZGVmaW5lIFNUQVRJQ19JQ0FDSEUoVFlQRSkgc3RhdGljIFRZUEUKKworCisKKy8qIGlkZWNvZGUgKi8KKworI2lmIChJREVDT0RFX0lOTElORSAmIFJFR1BBUk1fTU9EVUxFKQorIyBkZWZpbmUgUkVHUEFSTV9JREVDT0RFIFJFR1BBUk0KKyNlbHNlCisjIGRlZmluZSBSRUdQQVJNX0lERUNPREUKKyNlbmRpZgorCisjaWYgKChIX1JFVkVBTFNfTU9EVUxFX1AgKElERUNPREVfSU5MSU5FKSB8fCBkZWZpbmVkIChTSU1fSU5MSU5FX0MpKSBcCisgICAgICYmICFkZWZpbmVkIChJREVDT0RFX0MpIFwKKyAgICAgJiYgKFJFVkVBTF9NT0RVTEVfUCAoSURFQ09ERV9JTkxJTkUpKSkKKyMgaWYgKElERUNPREVfSU5MSU5FICYgSU5MSU5FX0dMT0JBTFMpCisjICBkZWZpbmUgSU5MSU5FX0lERUNPREUoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9JREVDT0RFX1AgMAorI2Vsc2UKKyMgIGRlZmluZSBJTkxJTkVfSURFQ09ERShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQgUkVHUEFSTV9JREVDT0RFCisjICBkZWZpbmUgRVhURVJOX0lERUNPREVfUCAwCisjZW5kaWYKKyNlbHNlCisjIGRlZmluZSBJTkxJTkVfSURFQ09ERShUWVBFKSBUWVBFIFJFR1BBUk1fSURFQ09ERQorIyBkZWZpbmUgRVhURVJOX0lERUNPREVfUCAxCisjZW5kaWYKKworI2lmIChJREVDT0RFX0lOTElORSAmIElOTElORV9MT0NBTFMpCisjIGRlZmluZSBTVEFUSUNfSU5MSU5FX0lERUNPREUoVFlQRSkgc3RhdGljIElOTElORSBUWVBFCisjZWxzZQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9JREVDT0RFKFRZUEUpIHN0YXRpYyBUWVBFIFJFR1BBUk1fSURFQ09ERQorI2VuZGlmCisKKyNkZWZpbmUgU1RBVElDX0lERUNPREUoVFlQRSkgc3RhdGljIFRZUEUKKworCisKKy8qIHNlbWFudGljcyAqLworCisjaWYgKFNFTUFOVElDU19JTkxJTkUgJiBSRUdQQVJNX01PRFVMRSkKKyMgZGVmaW5lIFJFR1BBUk1fU0VNQU5USUNTIFJFR1BBUk0KKyNlbHNlCisjIGRlZmluZSBSRUdQQVJNX1NFTUFOVElDUworI2VuZGlmCisKKyNpZiAoKEhfUkVWRUFMU19NT0RVTEVfUCAoU0VNQU5USUNTX0lOTElORSkgfHwgZGVmaW5lZCAoU0lNX0lOTElORV9DKSkgXAorICAgICAmJiAhZGVmaW5lZCAoU0VNQU5USUNTX0MpIFwKKyAgICAgJiYgKFJFVkVBTF9NT0RVTEVfUCAoU0VNQU5USUNTX0lOTElORSkpKQorIyBpZiAoU0VNQU5USUNTX0lOTElORSAmIElOTElORV9HTE9CQUxTKQorIyAgZGVmaW5lIElOTElORV9TRU1BTlRJQ1MoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9TRU1BTlRJQ1NfUCAwCisjZWxzZQorIyAgZGVmaW5lIElOTElORV9TRU1BTlRJQ1MoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VEIFJFR1BBUk1fU0VNQU5USUNTCisjICBkZWZpbmUgRVhURVJOX1NFTUFOVElDU19QIDAKKyNlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIElOTElORV9TRU1BTlRJQ1MoVFlQRSkgVFlQRSBSRUdQQVJNX1NFTUFOVElDUworIyBkZWZpbmUgRVhURVJOX1NFTUFOVElDU19QIDEKKyNlbmRpZgorCisjaWYgRVhURVJOX1NFTUFOVElDU19QCisjIGRlZmluZSBFWFRFUk5fU0VNQU5USUNTKFRZUEUpIFRZUEUgUkVHUEFSTV9TRU1BTlRJQ1MKKyNlbHNlCisjIGRlZmluZSBFWFRFUk5fU0VNQU5USUNTKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRCBSRUdQQVJNX1NFTUFOVElDUworI2VuZGlmCisKKyNpZiAoU0VNQU5USUNTX0lOTElORSAmIElOTElORV9MT0NBTFMpCisjIGRlZmluZSBTVEFUSUNfSU5MSU5FX1NFTUFOVElDUyhUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKKyNlbHNlCisjIGRlZmluZSBTVEFUSUNfSU5MSU5FX1NFTUFOVElDUyhUWVBFKSBzdGF0aWMgVFlQRSBSRUdQQVJNX1NFTUFOVElDUworI2VuZGlmCisKKyNkZWZpbmUgU1RBVElDX1NFTUFOVElDUyhUWVBFKSBzdGF0aWMgVFlQRQorCisKKworLyogc3VwcG9ydCAqLworCisjaWYgIWRlZmluZWQgKFNVUFBPUlRfSU5MSU5FKSAmJiAoREVGQVVMVF9JTkxJTkUpCisjIGRlZmluZSBTVVBQT1JUX0lOTElORSBBTExfQ19JTkxJTkUKKyNlbmRpZgorCisjaWYgKFNVUFBPUlRfSU5MSU5FICYgUkVHUEFSTV9NT0RVTEUpCisjIGRlZmluZSBSRUdQQVJNX1NVUFBPUlQgUkVHUEFSTQorI2Vsc2UKKyMgZGVmaW5lIFJFR1BBUk1fU1VQUE9SVAorI2VuZGlmCisKKyNpZiAoKEhfUkVWRUFMU19NT0RVTEVfUCAoU1VQUE9SVF9JTkxJTkUpIHx8IGRlZmluZWQgKFNJTV9JTkxJTkVfQykpIFwKKyAgICAgJiYgIWRlZmluZWQgKFNVUFBPUlRfQykgXAorICAgICAmJiAoUkVWRUFMX01PRFVMRV9QIChTVVBQT1JUX0lOTElORSkpKQorIyBpZiAoU1VQUE9SVF9JTkxJTkUgJiBJTkxJTkVfR0xPQkFMUykKKyMgIGRlZmluZSBJTkxJTkVfU1VQUE9SVChUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECisjICBkZWZpbmUgRVhURVJOX1NVUFBPUlRfUCAwCisjZWxzZQorIyAgZGVmaW5lIElOTElORV9TVVBQT1JUKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRCBSRUdQQVJNX1NVUFBPUlQKKyMgIGRlZmluZSBFWFRFUk5fU1VQUE9SVF9QIDAKKyNlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIElOTElORV9TVVBQT1JUKFRZUEUpIFRZUEUgUkVHUEFSTV9TVVBQT1JUCisjIGRlZmluZSBFWFRFUk5fU1VQUE9SVF9QIDEKKyNlbmRpZgorCisjaWYgKFNVUFBPUlRfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU1VQUE9SVChUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKKyNlbHNlCisjIGRlZmluZSBTVEFUSUNfSU5MSU5FX1NVUFBPUlQoVFlQRSkgc3RhdGljIFRZUEUgUkVHUEFSTV9TVVBQT1JUCisjZW5kaWYKKworI2RlZmluZSBTVEFUSUNfU1VQUE9SVChUWVBFKSBzdGF0aWMgVFlQRQorCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1pby5jIGIvc2ltL2NvbW1vbi9zaW0taW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2QyZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0taW8uYwpAQCAtMCwwICsxLDM3OSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTgsIEN5Z251cyBTb2x1dGlvbnMuCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2luY2x1ZGUgInNpbS1pby5oIgorI2luY2x1ZGUgInRhcmctdmFscy5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpZiBIQVZFX0ZDTlRMX0gKKyNpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisKKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworCisvKiBTZWUgdGhlIGZpbGUgaW5jbHVkZS9jYWxsYmFja3MuaCBmb3IgYSBkZXNjcmlwdGlvbiAqLworCisKK2ludAorc2ltX2lvX2luaXQoU0lNX0RFU0Mgc2QpCit7CisgIHJldHVybiBTVEFURV9DQUxMQkFDSyAoc2QpLT5pbml0IChTVEFURV9DQUxMQkFDSyAoc2QpKTsKK30KKworCitpbnQKK3NpbV9pb19zaHV0ZG93bihTSU1fREVTQyBzZCkKK3sKKyAgcmV0dXJuIFNUQVRFX0NBTExCQUNLIChzZCktPnNodXRkb3duIChTVEFURV9DQUxMQkFDSyAoc2QpKTsKK30KKworCitpbnQKK3NpbV9pb191bmxpbmsoU0lNX0RFU0Mgc2QsCisJICAgICAgY29uc3QgY2hhciAqZjEpCit7CisgIHJldHVybiBTVEFURV9DQUxMQkFDSyAoc2QpLT51bmxpbmsgKFNUQVRFX0NBTExCQUNLIChzZCksIGYxKTsKK30KKworCitsb25nCitzaW1faW9fdGltZShTSU1fREVTQyBzZCwKKwkgICAgbG9uZyAqdCkKK3sKKyAgcmV0dXJuIFNUQVRFX0NBTExCQUNLIChzZCktPnRpbWUgKFNUQVRFX0NBTExCQUNLIChzZCksIHQpOworfQorCisKK2ludAorc2ltX2lvX3N5c3RlbShTSU1fREVTQyBzZCwgY29uc3QgY2hhciAqcykKK3sKKyAgcmV0dXJuIFNUQVRFX0NBTExCQUNLIChzZCktPnN5c3RlbSAoU1RBVEVfQ0FMTEJBQ0sgKHNkKSwgcyk7Cit9CisKKworaW50CitzaW1faW9fcmVuYW1lKFNJTV9ERVNDIHNkLAorCSAgICAgIGNvbnN0IGNoYXIgKmYxLAorCSAgICAgIGNvbnN0IGNoYXIgKmYyKQoreworICByZXR1cm4gU1RBVEVfQ0FMTEJBQ0sgKHNkKS0+cmVuYW1lIChTVEFURV9DQUxMQkFDSyAoc2QpLCBmMSwgZjIpOworfQorCisKK2ludAorc2ltX2lvX3dyaXRlX3N0ZG91dChTSU1fREVTQyBzZCwKKwkJICAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJICAgIGludCBsZW4pCit7CisgIHN3aXRjaCAoQ1VSUkVOVF9TVERJTykgeworICBjYXNlIERPX1VTRV9TVERJTzoKKyAgICByZXR1cm4gU1RBVEVfQ0FMTEJBQ0sgKHNkKS0+d3JpdGVfc3Rkb3V0IChTVEFURV9DQUxMQkFDSyAoc2QpLCBidWYsIGxlbik7CisgICAgYnJlYWs7CisgIGNhc2UgRE9OVF9VU0VfU1RESU86CisgICAgcmV0dXJuIFNUQVRFX0NBTExCQUNLIChzZCktPndyaXRlIChTVEFURV9DQUxMQkFDSyAoc2QpLCAxLCBidWYsIGxlbik7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgc2ltX2lvX2Vycm9yIChzZCwgInNpbV9pb193cml0ZV9zdGRvdXQ6IHVuYWNjb3VudGVkIHN3aXRjaFxuIik7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKwordm9pZAorc2ltX2lvX2ZsdXNoX3N0ZG91dChTSU1fREVTQyBzZCkKK3sKKyAgc3dpdGNoIChDVVJSRU5UX1NURElPKSB7CisgIGNhc2UgRE9fVVNFX1NURElPOgorICAgIFNUQVRFX0NBTExCQUNLIChzZCktPmZsdXNoX3N0ZG91dCAoU1RBVEVfQ0FMTEJBQ0sgKHNkKSk7CisgICAgYnJlYWs7CisgIGNhc2UgRE9OVF9VU0VfU1RESU86CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgc2ltX2lvX2Vycm9yIChzZCwgInNpbV9pb19mbHVzaF9zdGRvdXQ6IHVuYWNjb3VudGVkIHN3aXRjaFxuIik7CisgICAgYnJlYWs7CisgIH0KK30KKworCitpbnQKK3NpbV9pb193cml0ZV9zdGRlcnIoU0lNX0RFU0Mgc2QsCisJCSAgICBjb25zdCBjaGFyICpidWYsCisJCSAgICBpbnQgbGVuKQoreworICBzd2l0Y2ggKENVUlJFTlRfU1RESU8pIHsKKyAgY2FzZSBET19VU0VfU1RESU86CisgICAgcmV0dXJuIFNUQVRFX0NBTExCQUNLIChzZCktPndyaXRlX3N0ZGVyciAoU1RBVEVfQ0FMTEJBQ0sgKHNkKSwgYnVmLCBsZW4pOworICAgIGJyZWFrOworICBjYXNlIERPTlRfVVNFX1NURElPOgorICAgIHJldHVybiBTVEFURV9DQUxMQkFDSyAoc2QpLT53cml0ZSAoU1RBVEVfQ0FMTEJBQ0sgKHNkKSwgMiwgYnVmLCBsZW4pOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHNpbV9pb19lcnJvciAoc2QsICJzaW1faW9fd3JpdGVfc3RkZXJyOiB1bmFjY291bnRlZCBzd2l0Y2hcbiIpOworICAgIGJyZWFrOworICB9CisgIHJldHVybiAwOworfQorCisKK3ZvaWQKK3NpbV9pb19mbHVzaF9zdGRlcnIoU0lNX0RFU0Mgc2QpCit7CisgIHN3aXRjaCAoQ1VSUkVOVF9TVERJTykgeworICBjYXNlIERPX1VTRV9TVERJTzoKKyAgICBTVEFURV9DQUxMQkFDSyAoc2QpLT5mbHVzaF9zdGRlcnIgKFNUQVRFX0NBTExCQUNLIChzZCkpOworICAgIGJyZWFrOworICBjYXNlIERPTlRfVVNFX1NURElPOgorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHNpbV9pb19lcnJvciAoc2QsICJzaW1faW9fZmx1c2hfc3RkZXJyOiB1bmFjY291bnRlZCBzd2l0Y2hcbiIpOworICAgIGJyZWFrOworICB9Cit9CisKKworaW50CitzaW1faW9fd3JpdGUoU0lNX0RFU0Mgc2QsCisJICAgICBpbnQgZmQsCisJICAgICBjb25zdCBjaGFyICpidWYsCisJICAgICBpbnQgbGVuKQoreworICByZXR1cm4gU1RBVEVfQ0FMTEJBQ0sgKHNkKS0+d3JpdGUgKFNUQVRFX0NBTExCQUNLIChzZCksIGZkLCBidWYsIGxlbik7Cit9CisKKworaW50CitzaW1faW9fcmVhZF9zdGRpbihTSU1fREVTQyBzZCwKKwkJICBjaGFyICpidWYsCisJCSAgaW50IGxlbikKK3sKKyAgc3dpdGNoIChDVVJSRU5UX1NURElPKSB7CisgIGNhc2UgRE9fVVNFX1NURElPOgorICAgIHJldHVybiBTVEFURV9DQUxMQkFDSyAoc2QpLT5yZWFkX3N0ZGluIChTVEFURV9DQUxMQkFDSyAoc2QpLCBidWYsIGxlbik7CisgICAgYnJlYWs7CisgIGNhc2UgRE9OVF9VU0VfU1RESU86CisgICAgcmV0dXJuIFNUQVRFX0NBTExCQUNLIChzZCktPnJlYWQgKFNUQVRFX0NBTExCQUNLIChzZCksIDAsIGJ1ZiwgbGVuKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBzaW1faW9fZXJyb3IgKHNkLCAic2ltX2lvX3JlYWRfc3RkaW46IHVuYWNjb3VudGVkIHN3aXRjaFxuIik7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworaW50CitzaW1faW9fcmVhZChTSU1fREVTQyBzZCwgaW50IGZkLAorCSAgICBjaGFyICpidWYsCisJICAgIGludCBsZW4pCit7CisgIHJldHVybiBTVEFURV9DQUxMQkFDSyAoc2QpLT5yZWFkIChTVEFURV9DQUxMQkFDSyAoc2QpLCBmZCwgYnVmLCBsZW4pOworfQorCisKK2ludAorc2ltX2lvX29wZW4oU0lNX0RFU0Mgc2QsCisJICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJICAgIGludCBmbGFncykKK3sKKyAgcmV0dXJuIFNUQVRFX0NBTExCQUNLIChzZCktPm9wZW4gKFNUQVRFX0NBTExCQUNLIChzZCksIG5hbWUsIGZsYWdzKTsKK30KKworCitpbnQKK3NpbV9pb19sc2VlayhTSU1fREVTQyBzZCwKKwkgICAgIGludCBmZCwKKwkgICAgIGxvbmcgb2ZmLAorCSAgICAgaW50IHdheSkKK3sKKyAgcmV0dXJuIFNUQVRFX0NBTExCQUNLIChzZCktPmxzZWVrIChTVEFURV9DQUxMQkFDSyAoc2QpLCBmZCwgb2ZmLCB3YXkpOworfQorCisKK2ludAorc2ltX2lvX2lzYXR0eShTSU1fREVTQyBzZCwKKwkgICAgICBpbnQgZmQpCit7CisgIHJldHVybiBTVEFURV9DQUxMQkFDSyAoc2QpLT5pc2F0dHkgKFNUQVRFX0NBTExCQUNLIChzZCksIGZkKTsKK30KKworCitpbnQKK3NpbV9pb19nZXRfZXJybm8oU0lNX0RFU0Mgc2QpCit7CisgIHJldHVybiBTVEFURV9DQUxMQkFDSyAoc2QpLT5nZXRfZXJybm8gKFNUQVRFX0NBTExCQUNLIChzZCkpOworfQorCisKK2ludAorc2ltX2lvX2Nsb3NlKFNJTV9ERVNDIHNkLAorCSAgICAgaW50IGZkKQoreworICByZXR1cm4gU1RBVEVfQ0FMTEJBQ0sgKHNkKS0+Y2xvc2UgKFNUQVRFX0NBTExCQUNLIChzZCksIGZkKTsKK30KKworCit2b2lkCitzaW1faW9fcHJpbnRmKFNJTV9ERVNDIHNkLAorCSAgICAgIGNvbnN0IGNoYXIgKmZtdCwKKwkgICAgICAuLi4pCit7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0KGFwLCBmbXQpOworICBTVEFURV9DQUxMQkFDSyAoc2QpLT52cHJpbnRmX2ZpbHRlcmVkIChTVEFURV9DQUxMQkFDSyAoc2QpLCBmbXQsIGFwKTsKKyAgdmFfZW5kKGFwKTsKK30KKworCit2b2lkCitzaW1faW9fdnByaW50ZihTSU1fREVTQyBzZCwKKwkgICAgICAgY29uc3QgY2hhciAqZm10LAorCSAgICAgICB2YV9saXN0IGFwKQoreworICBTVEFURV9DQUxMQkFDSyAoc2QpLT52cHJpbnRmX2ZpbHRlcmVkIChTVEFURV9DQUxMQkFDSyAoc2QpLCBmbXQsIGFwKTsKK30KKworCit2b2lkCitzaW1faW9fZXByaW50ZihTSU1fREVTQyBzZCwKKwkgICAgICBjb25zdCBjaGFyICpmbXQsCisJICAgICAgLi4uKQoreworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgZm10KTsKKyAgU1RBVEVfQ0FMTEJBQ0sgKHNkKS0+ZXZwcmludGZfZmlsdGVyZWQgKFNUQVRFX0NBTExCQUNLIChzZCksIGZtdCwgYXApOworICB2YV9lbmQoYXApOworfQorCisKK3ZvaWQKK3NpbV9pb19ldnByaW50ZihTSU1fREVTQyBzZCwKKwkJY29uc3QgY2hhciAqZm10LAorCQl2YV9saXN0IGFwKQoreworICBTVEFURV9DQUxMQkFDSyAoc2QpLT5ldnByaW50Zl9maWx0ZXJlZCAoU1RBVEVfQ0FMTEJBQ0sgKHNkKSwgZm10LCBhcCk7Cit9CisKKwordm9pZAorc2ltX2lvX2Vycm9yKFNJTV9ERVNDIHNkLAorCSAgICAgY29uc3QgY2hhciAqZm10LAorCSAgICAgLi4uKQoreworICBpZiAoc2QgPT0gTlVMTCB8fCBTVEFURV9DQUxMQkFDSyAoc2QpID09IE5VTEwpIHsKKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIHZmcHJpbnRmIChzdGRlcnIsIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyAgICBhYm9ydCAoKTsKKyAgfQorICBlbHNlIHsKKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIFNUQVRFX0NBTExCQUNLIChzZCktPmV2cHJpbnRmX2ZpbHRlcmVkIChTVEFURV9DQUxMQkFDSyAoc2QpLCBmbXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOworICAgIFNUQVRFX0NBTExCQUNLIChzZCktPmVycm9yIChTVEFURV9DQUxMQkFDSyAoc2QpLCAiIik7CisgIH0KK30KKworCit2b2lkCitzaW1faW9fcG9sbF9xdWl0KFNJTV9ERVNDIHNkKQoreworICBpZiAoU1RBVEVfQ0FMTEJBQ0sgKHNkKS0+cG9sbF9xdWl0ICE9IE5VTEwpCisgICAgaWYgKFNUQVRFX0NBTExCQUNLIChzZCktPnBvbGxfcXVpdCAoU1RBVEVfQ0FMTEJBQ0sgKHNkKSkpCisgICAgICBzaW1fc3RvcCAoc2QpOworfQorCisKKy8qIEJhc2VkIG9uIGdkYi00LjE3L3NpbS9wcGMvbWFpbi5jOnNpbV9pb19yZWFkX3N0ZGluKCkuCisKKyAgIEZJWE1FOiBTaG91bGQgbm90IGJlIGNhbGxpbmcgZmNudGwoKSBvciBncnViYmluZyBhcm91bmQgaW5zaWRlIG9mCisgICAtPmZkbWFwIGFuZCAtPmVycm5vLgorCisgICBGSVhNRTogU29tZSBjb21wbGV0bHkgbmV3IG1lY2hhbmlzbSBmb3IgaGFuZGxpbmcgdGhlIGdlbmVyYWwKKyAgIHByb2JsZW0gb2YgYXN5bmNocm9ub3VzIElPIGlzIG5lZWRlZC4KKworICAgRklYTUU6IFRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcmVzcyB0aGUgZWNob2luZyAoRUNITykgb2YgaW5wdXQuCisgICBDb25zZXF1ZW50bHkgcG9sbGVkIGlucHV0IGlzIGFsd2F5cyBkaXNwbGF5ZWQuCisKKyAgIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBlcmZvcm0gdW5jb29rZWQgcmVhZHMuCisgICBDb25zZXF1ZW50bHksIGRhdGEgd2lsbCBub3QgYmUgcmVhZCB1bnRpbCBhbiBFT0xOIGNoYXJhY3RlciBoYXMKKyAgIGJlZW4gZW50ZXJlZC4gQSBjbnRybC1kIG1heSBmb3JjZSB0aGUgZWFybHkgdGVybWluYXRpb24gb2YgYSBsaW5lICovCisKKworaW50CitzaW1faW9fcG9sbF9yZWFkIChTSU1fREVTQyBzZCwKKwkJICBpbnQgc2ltX2lvX2ZkLAorCQkgIGNoYXIgKmJ1ZiwKKwkJICBpbnQgc2l6ZW9mX2J1ZikKK3sKKyNpZiBkZWZpbmVkKE9fTkRFTEFZKSAmJiBkZWZpbmVkKEZfR0VURkwpICYmIGRlZmluZWQoRl9TRVRGTCkKKyAgaW50IGZkID0gU1RBVEVfQ0FMTEJBQ0sgKHNkKS0+ZmRtYXBbc2ltX2lvX2ZkXTsKKyAgaW50IGZsYWdzOworICBpbnQgc3RhdHVzOworICBpbnQgbnJfcmVhZDsKKyAgaW50IHJlc3VsdDsKKyAgU1RBVEVfQ0FMTEJBQ0sgKHNkKS0+bGFzdF9lcnJubyA9IDA7CisgIC8qIGdldCB0aGUgb2xkIHN0YXR1cyAqLworICBmbGFncyA9IGZjbnRsIChmZCwgRl9HRVRGTCwgMCk7CisgIGlmIChmbGFncyA9PSAtMSkKKyAgICB7CisgICAgICBwZXJyb3IgKCJzaW1faW9fcG9sbF9yZWFkIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIC8qIHRlbXAsIGRpc2FibGUgYmxvY2tpbmcgSU8gKi8KKyAgc3RhdHVzID0gZmNudGwgKGZkLCBGX1NFVEZMLCBmbGFncyB8IE9fTkRFTEFZKTsKKyAgaWYgKHN0YXR1cyA9PSAtMSkKKyAgICB7CisgICAgICBwZXJyb3IgKCJzaW1faW9fcmVhZF9zdGRpbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAvKiB0cnkgZm9yIGlucHV0ICovCisgIG5yX3JlYWQgPSByZWFkIChmZCwgYnVmLCBzaXplb2ZfYnVmKTsKKyAgaWYgKG5yX3JlYWQgPj0gMCkKKyAgICB7CisgICAgICAvKiBwcmludGYgKCI8bnItcmVhZD0lZD5cbiIsIG5yX3JlYWQpOyAqLworICAgICAgcmVzdWx0ID0gbnJfcmVhZDsKKyAgICB9CisgIGVsc2UKKyAgICB7IC8qIG5yX3JlYWQgPCAwICovCisgICAgICByZXN1bHQgPSAtMTsKKyAgICAgIFNUQVRFX0NBTExCQUNLIChzZCktPmxhc3RfZXJybm8gPSBlcnJubzsKKyAgICB9CisgIC8qIHJldHVybiB0byByZWd1bGFyIHZld2luZyAqLworICBzdGF0dXMgPSBmY250bCAoZmQsIEZfU0VURkwsIGZsYWdzKTsKKyAgaWYgKHN0YXR1cyA9PSAtMSkKKyAgICB7CisgICAgICBwZXJyb3IgKCJzaW1faW9fcmVhZF9zdGRpbiIpOworICAgICAgLyogcmV0dXJuIDA7ICovCisgICAgfQorICByZXR1cm4gcmVzdWx0OworI2Vsc2UKKyAgcmV0dXJuIHNpbV9pb19yZWFkIChzZCwgc2ltX2lvX2ZkLCBidWYsIHNpemVvZl9idWYpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1pby5oIGIvc2ltL2NvbW1vbi9zaW0taW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTViNjIzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0taW8uaApAQCAtMCwwICsxLDg0IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIFNJTV9JT19ICisjZGVmaW5lIFNJTV9JT19ICisKKy8qIFNlZSB0aGUgZmlsZSBpbmNsdWRlL2NhbGxiYWNrcy5oIGZvciBhIGRlc2NyaXB0aW9uICovCisKK2ludCBzaW1faW9faW5pdCAoU0lNX0RFU0Mgc2QpOworCitpbnQgc2ltX2lvX3NodXRkb3duIChTSU1fREVTQyBzZCk7CisKK2ludCBzaW1faW9fdW5saW5rIChTSU1fREVTQyBzZCwgY29uc3QgY2hhciAqKTsKKworbG9uZyBzaW1faW9fdGltZSAoU0lNX0RFU0Mgc2QsIGxvbmcgKik7CisKK2ludCBzaW1faW9fc3lzdGVtIChTSU1fREVTQyBzZCwgY29uc3QgY2hhciAqKTsKKworaW50IHNpbV9pb19yZW5hbWUgKFNJTV9ERVNDIHNkLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKK2ludCBzaW1faW9fd3JpdGVfc3Rkb3V0IChTSU1fREVTQyBzZCwgY29uc3QgY2hhciAqLCBpbnQpOworCit2b2lkIHNpbV9pb19mbHVzaF9zdGRvdXQgKFNJTV9ERVNDIHNkKTsKKworaW50IHNpbV9pb193cml0ZV9zdGRlcnIgKFNJTV9ERVNDIHNkLCBjb25zdCBjaGFyICosIGludCk7CisKK3ZvaWQgc2ltX2lvX2ZsdXNoX3N0ZGVyciAoU0lNX0RFU0Mgc2QpOworCitpbnQgc2ltX2lvX3dyaXRlIChTSU1fREVTQyBzZCwgaW50LCBjb25zdCBjaGFyICosIGludCk7CisKK2ludCBzaW1faW9fcmVhZF9zdGRpbiAoU0lNX0RFU0Mgc2QsIGNoYXIgKiwgaW50KTsKKworaW50IHNpbV9pb19yZWFkIChTSU1fREVTQyBzZCwgaW50LCBjaGFyICosIGludCk7CisKK2ludCBzaW1faW9fb3BlbiAoU0lNX0RFU0Mgc2QsIGNvbnN0IGNoYXIgKiwgaW50KTsKKworaW50IHNpbV9pb19sc2VlayAoU0lNX0RFU0Mgc2QsIGludCwgbG9uZywgaW50KTsKKworaW50IHNpbV9pb19pc2F0dHkgKFNJTV9ERVNDIHNkLCBpbnQpOworCitpbnQgc2ltX2lvX2dldF9lcnJubyAoU0lNX0RFU0Mgc2QpOworCitpbnQgc2ltX2lvX2Nsb3NlIChTSU1fREVTQyBzZCwgaW50KTsKKwordm9pZCBzaW1faW9fcHJpbnRmIChTSU1fREVTQyBzZCwKKwkJICAgIGNvbnN0IGNoYXIgKmZtdCwKKwkJICAgIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworCit2b2lkIHNpbV9pb192cHJpbnRmIChTSU1fREVTQyBzZCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKKwordm9pZCBzaW1faW9fZXByaW50ZiAoU0lNX0RFU0Mgc2QsCisJCSAgICAgY29uc3QgY2hhciAqZm10LAorCQkgICAgIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworCit2b2lkIHNpbV9pb19ldnByaW50ZiAoU0lNX0RFU0Mgc2QsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCk7CisKK3ZvaWQgc2ltX2lvX2Vycm9yIChTSU1fREVTQyBzZCwKKwkJICAgY29uc3QgY2hhciAqZm10LAorCQkgICAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKKwordm9pZCBzaW1faW9fcG9sbF9xdWl0IChTSU1fREVTQyBzZCk7CisKKy8qIFJldHVybnMgLTEgYW5kIHNldHMgKGhvc3QpIEVBR0FJTiBpZiBub3QgcmVhZHkuICovCitpbnQgc2ltX2lvX3BvbGxfcmVhZCAoU0lNX0RFU0Mgc2QsIGludCwgY2hhciAqLCBpbnQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLWxvYWQuYyBiL3NpbS9jb21tb24vc2ltLWxvYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmZiMzNiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tbG9hZC5jCkBAIC0wLDAgKzEsMjM5IEBACisvKiBVdGlsaXR5IHRvIGxvYWQgYSBmaWxlIGludG8gdGhlIHNpbXVsYXRvci4KKyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhpcyBpcyBhIHN0YW5kYWxvbmUgbG9hZGVyLCBpbmRlcGVuZGVudCBvZiB0aGUgc2ltLWJhc2ljLmggbWFjaGluZXJ5LAorICAgYXMgaXQgaXMgdXNlZCBieSBzaW11bGF0b3JzIHRoYXQgZG9uJ3QgdXNlIGl0IFt0aG91Z2ggdGhhdCBkb2Vzbid0IG1lYW4KKyAgIHRvIHN1Z2dlc3QgdGhhdCB0aGV5IHNob3VsZG4ndCA6LSldLiAgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4gLyogZm9yIE5VTEwgKi8KKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8dmFyYXJncy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAic2ltLWJhc2ljcy5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInNpbS11dGlscy5oIgorCisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlICJyZW1vdGUtc2ltLmgiCisKK3N0YXRpYyB2b2lkIGVwcmludGYgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIC4uLikpOworc3RhdGljIHZvaWQgeHByaW50ZiBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgLi4uKSk7CitzdGF0aWMgdm9pZCByZXBvcnRfdHJhbnNmZXJfcGVyZm9ybWFuY2UKKyAgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCB1bnNpZ25lZCBsb25nLCB0aW1lX3QsIHRpbWVfdCkpOworc3RhdGljIHZvaWQgeHByaW50Zl9iZmRfdm1hIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgYmZkX3ZtYSkpOworCisvKiBMb2FkIHByb2dyYW0gUFJPRyBpbnRvIHRoZSBzaW11bGF0b3IgdXNpbmcgdGhlIGZ1bmN0aW9uIERPX0xPQUQuCisgICBJZiBQUk9HX0JGRCBpcyBub24tTlVMTCwgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBvcGVuZWQuCisgICBJZiBWRVJCT1NFX1AgaXMgbm9uLXplcm8gc3RhdGlzdGljcyBhcmUgcHJpbnRlZCBvZiBlYWNoIGxvYWRlZCBzZWN0aW9uCisgICBhbmQgdGhlIHRyYW5zZmVyIHJhdGUgKGZvciBjb25zaXN0ZW5jeSB3aXRoIGdkYikuCisgICBJZiBMTUFfUCBpcyBub24temVybyB0aGUgcHJvZ3JhbSBzZWN0aW9ucyBhcmUgbG9hZGVkIGF0IHRoZSBMTUEKKyAgIHJhdGhlciB0aGFuIHRoZSBWTUEKKyAgIElmIHRoaXMgZmFpbHMgYW4gZXJyb3IgbWVzc2FnZSBpcyBwcmludGVkIGFuZCBOVUxMIGlzIHJldHVybmVkLgorICAgSWYgaXQgc3VjY2VlZHMgdGhlIGJmZCBpcyByZXR1cm5lZC4KKyAgIE5PVEU6IEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIG9sZGVyIGhhcmR3YXJlIHNpbXVsYXRvcnMgaW5jb3JyZWN0bHkKKyAgIHdyaXRlIHRoZSBwcm9ncmFtIHNlY3Rpb25zIGF0IExNQSBpbnRlcnByZXRlZCBhcyBhIHZpcnR1YWwgYWRkcmVzcy4KKyAgIFRoaXMgaXMgc3RpbGwgYWNjb21tb2RhdGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHJlYXNvbnMuICovCisKKworYmZkICoKK3NpbV9sb2FkX2ZpbGUgKHNkLCBteW5hbWUsIGNhbGxiYWNrLCBwcm9nLCBwcm9nX2JmZCwgdmVyYm9zZV9wLCBsbWFfcCwgZG9fd3JpdGUpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBjb25zdCBjaGFyICpteW5hbWU7CisgICAgIGhvc3RfY2FsbGJhY2sgKmNhbGxiYWNrOworICAgICBjaGFyICpwcm9nOworICAgICBiZmQgKnByb2dfYmZkOworICAgICBpbnQgdmVyYm9zZV9wOworICAgICBpbnQgbG1hX3A7CisgICAgIHNpbV93cml0ZV9mbiBkb193cml0ZTsKK3sKKyAgYXNlY3Rpb24gKnM7CisgIC8qIFJlY29yZCBzZXBhcmF0ZWx5IGFzIHdlIGRvbid0IHdhbnQgdG8gY2xvc2UgUFJPR19CRkQgaWYgaXQgd2FzIHBhc3NlZC4gICovCisgIGJmZCAqcmVzdWx0X2JmZDsKKyAgdGltZV90IHN0YXJ0X3RpbWUgPSAwOwkvKiBTdGFydCBhbmQgZW5kIHRpbWVzIG9mIGRvd25sb2FkICovCisgIHRpbWVfdCBlbmRfdGltZSA9IDA7CisgIHVuc2lnbmVkIGxvbmcgZGF0YV9jb3VudCA9IDA7CS8qIE51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCB0byBtZW1vcnkgKi8KKyAgaW50IGZvdW5kX2xvYWRhYmxlX3NlY3Rpb247CisKKyAgaWYgKHByb2dfYmZkICE9IE5VTEwpCisgICAgcmVzdWx0X2JmZCA9IHByb2dfYmZkOworICBlbHNlCisgICAgeworICAgICAgcmVzdWx0X2JmZCA9IGJmZF9vcGVuciAocHJvZywgMCk7CisgICAgICBpZiAocmVzdWx0X2JmZCA9PSBOVUxMKQorCXsKKwkgIGVwcmludGYgKGNhbGxiYWNrLCAiJXM6IGNhbid0IG9wZW4gXCIlc1wiOiAlc1xuIiwgCisJCSAgIG15bmFtZSwgcHJvZywgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOworCSAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICBpZiAoIWJmZF9jaGVja19mb3JtYXQgKHJlc3VsdF9iZmQsIGJmZF9vYmplY3QpKSAKKyAgICB7CisgICAgICBlcHJpbnRmIChjYWxsYmFjaywgIiVzOiBcIiVzXCIgaXMgbm90IGFuIG9iamVjdCBmaWxlOiAlc1xuIiwKKwkgICAgICAgbXluYW1lLCBwcm9nLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgICAvKiBPbmx5IGNsb3NlIGlmIHdlIG9wZW5lZCBpdC4gICovCisgICAgICBpZiAocHJvZ19iZmQgPT0gTlVMTCkKKwliZmRfY2xvc2UgKHJlc3VsdF9iZmQpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIGlmICh2ZXJib3NlX3ApCisgICAgc3RhcnRfdGltZSA9IHRpbWUgKE5VTEwpOworCisgIGZvdW5kX2xvYWRhYmxlX3NlY3Rpb24gPSAwOworICBmb3IgKHMgPSByZXN1bHRfYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpIAorICAgIHsKKyAgICAgIGlmIChzLT5mbGFncyAmIFNFQ19MT0FEKSAKKwl7CisJICBiZmRfc2l6ZV90eXBlIHNpemU7CisKKwkgIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHMpOworCSAgaWYgKHNpemUgPiAwKQorCSAgICB7CisJICAgICAgY2hhciAqYnVmZmVyOworCSAgICAgIGJmZF92bWEgbG1hOworCisJICAgICAgYnVmZmVyID0gbWFsbG9jIChzaXplKTsKKwkgICAgICBpZiAoYnVmZmVyID09IE5VTEwpCisJCXsKKwkJICBlcHJpbnRmIChjYWxsYmFjaywKKwkJCSAgICIlczogaW5zdWZmaWNpZW50IG1lbW9yeSB0byBsb2FkIFwiJXNcIlxuIiwKKwkJCSAgIG15bmFtZSwgcHJvZyk7CisJCSAgLyogT25seSBjbG9zZSBpZiB3ZSBvcGVuZWQgaXQuICAqLworCQkgIGlmIChwcm9nX2JmZCA9PSBOVUxMKQorCQkgICAgYmZkX2Nsb3NlIChyZXN1bHRfYmZkKTsKKwkJICByZXR1cm4gTlVMTDsKKwkJfQorCSAgICAgIGlmIChsbWFfcCkKKwkJbG1hID0gYmZkX3NlY3Rpb25fbG1hIChyZXN1bHRfYmZkLCBzKTsKKwkgICAgICBlbHNlCisJCWxtYSA9IGJmZF9zZWN0aW9uX3ZtYSAocmVzdWx0X2JmZCwgcyk7CisJICAgICAgaWYgKHZlcmJvc2VfcCkKKwkJeworCQkgIHhwcmludGYgKGNhbGxiYWNrLCAiTG9hZGluZyBzZWN0aW9uICVzLCBzaXplIDB4JWx4ICVzICIsCisJCQkgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAocmVzdWx0X2JmZCwgcyksCisJCQkgICAodW5zaWduZWQgbG9uZykgc2l6ZSwKKwkJCSAgIChsbWFfcCA/ICJsbWEiIDogInZtYSIpKTsKKwkJICB4cHJpbnRmX2JmZF92bWEgKGNhbGxiYWNrLCBsbWEpOworCQkgIHhwcmludGYgKGNhbGxiYWNrLCAiXG4iKTsKKwkJfQorCSAgICAgIGRhdGFfY291bnQgKz0gc2l6ZTsKKwkgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKHJlc3VsdF9iZmQsIHMsIGJ1ZmZlciwgMCwgc2l6ZSk7CisJICAgICAgZG9fd3JpdGUgKHNkLCBsbWEsIGJ1ZmZlciwgc2l6ZSk7CisJICAgICAgZm91bmRfbG9hZGFibGVfc2VjdGlvbiA9IDE7CisJICAgICAgZnJlZSAoYnVmZmVyKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKCFmb3VuZF9sb2FkYWJsZV9zZWN0aW9uKQorICAgIHsKKyAgICAgIGVwcmludGYgKGNhbGxiYWNrLAorCSAgICAgICAiJXM6IG5vIGxvYWRhYmxlIHNlY3Rpb25zIFwiJXNcIlxuIiwKKwkgICAgICAgbXluYW1lLCBwcm9nKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBpZiAodmVyYm9zZV9wKQorICAgIHsKKyAgICAgIGVuZF90aW1lID0gdGltZSAoTlVMTCk7CisgICAgICB4cHJpbnRmIChjYWxsYmFjaywgIlN0YXJ0IGFkZHJlc3MgIik7CisgICAgICB4cHJpbnRmX2JmZF92bWEgKGNhbGxiYWNrLCBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKHJlc3VsdF9iZmQpKTsKKyAgICAgIHhwcmludGYgKGNhbGxiYWNrLCAiXG4iKTsKKyAgICAgIHJlcG9ydF90cmFuc2Zlcl9wZXJmb3JtYW5jZSAoY2FsbGJhY2ssIGRhdGFfY291bnQsIHN0YXJ0X3RpbWUsIGVuZF90aW1lKTsKKyAgICB9CisKKyAgcmV0dXJuIHJlc3VsdF9iZmQ7Cit9CisKK3N0YXRpYyB2b2lkCit4cHJpbnRmIFZQQVJBTVMgKChob3N0X2NhbGxiYWNrICpjYWxsYmFjaywgY29uc3QgY2hhciAqZm10LCAuLi4pKQoreworI2lmbmRlZiBBTlNJX1BST1RPVFlQRVMKKyAgaG9zdF9jYWxsYmFjayAqY2FsbGJhY2s7CisgIGNoYXIgKmZtdDsKKyNlbmRpZgorICB2YV9saXN0IGFwOworCisgIFZBX1NUQVJUIChhcCwgZm10KTsKKyNpZm5kZWYgQU5TSV9QUk9UT1RZUEVTCisgIGNhbGxiYWNrID0gdmFfYXJnIChhcCwgaG9zdF9jYWxsYmFjayAqKTsKKyAgZm10ID0gdmFfYXJnIChhcCwgY2hhciAqKTsKKyNlbmRpZgorCisgICgqY2FsbGJhY2stPnZwcmludGZfZmlsdGVyZWQpIChjYWxsYmFjaywgZm10LCBhcCk7CisKKyAgdmFfZW5kIChhcCk7Cit9CisKK3N0YXRpYyB2b2lkCitlcHJpbnRmIFZQQVJBTVMgKChob3N0X2NhbGxiYWNrICpjYWxsYmFjaywgY29uc3QgY2hhciAqZm10LCAuLi4pKQoreworI2lmbmRlZiBBTlNJX1BST1RPVFlQRVMKKyAgaG9zdF9jYWxsYmFjayAqY2FsbGJhY2s7CisgIGNoYXIgKmZtdDsKKyNlbmRpZgorICB2YV9saXN0IGFwOworCisgIFZBX1NUQVJUIChhcCwgZm10KTsKKyNpZm5kZWYgQU5TSV9QUk9UT1RZUEVTCisgIGNhbGxiYWNrID0gdmFfYXJnIChhcCwgaG9zdF9jYWxsYmFjayAqKTsKKyAgZm10ID0gdmFfYXJnIChhcCwgY2hhciAqKTsKKyNlbmRpZgorCisgICgqY2FsbGJhY2stPmV2cHJpbnRmX2ZpbHRlcmVkKSAoY2FsbGJhY2ssIGZtdCwgYXApOworCisgIHZhX2VuZCAoYXApOworfQorCisvKiBSZXBvcnQgaG93IGZhc3QgdGhlIHRyYW5zZmVyIHdlbnQuICovCisKK3N0YXRpYyB2b2lkCityZXBvcnRfdHJhbnNmZXJfcGVyZm9ybWFuY2UgKGNhbGxiYWNrLCBkYXRhX2NvdW50LCBzdGFydF90aW1lLCBlbmRfdGltZSkKKyAgICAgaG9zdF9jYWxsYmFjayAqY2FsbGJhY2s7CisgICAgIHVuc2lnbmVkIGxvbmcgZGF0YV9jb3VudDsKKyAgICAgdGltZV90IHN0YXJ0X3RpbWUsIGVuZF90aW1lOworeworICB4cHJpbnRmIChjYWxsYmFjaywgIlRyYW5zZmVyIHJhdGU6ICIpOworICBpZiAoZW5kX3RpbWUgIT0gc3RhcnRfdGltZSkKKyAgICB4cHJpbnRmIChjYWxsYmFjaywgIiVsZCBiaXRzL3NlYyIsCisJICAgICAoZGF0YV9jb3VudCAqIDgpIC8gKGVuZF90aW1lIC0gc3RhcnRfdGltZSkpOworICBlbHNlCisgICAgeHByaW50ZiAoY2FsbGJhY2ssICIlbGQgYml0cyBpbiA8MSBzZWMiLCAoZGF0YV9jb3VudCAqIDgpKTsKKyAgeHByaW50ZiAoY2FsbGJhY2ssICIuXG4iKTsKK30KKworLyogUHJpbnQgYSBiZmRfdm1hLgorICAgVGhpcyBpcyBpbnRlbmRlZCB0byBoYW5kbGUgdGhlIHZhZ2FyaWVzIG9mIDMyIHZzIDY0IGJpdHMsIGV0Yy4gICovCisKK3N0YXRpYyB2b2lkCit4cHJpbnRmX2JmZF92bWEgKGNhbGxiYWNrLCB2bWEpCisgICAgIGhvc3RfY2FsbGJhY2sgKmNhbGxiYWNrOworICAgICBiZmRfdm1hIHZtYTsKK3sKKyAgLyogRklYTUU6IGZvciBub3cgKi8KKyAgeHByaW50ZiAoY2FsbGJhY2ssICIweCVseCIsICh1bnNpZ25lZCBsb25nKSB2bWEpOworfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tbWVtb3B0LmMgYi9zaW0vY29tbW9uL3NpbS1tZW1vcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTUyYTY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tbWVtb3B0LmMKQEAgLTAsMCArMSw0NzEgQEAKKy8qIFNpbXVsYXRvciBtZW1vcnkgb3B0aW9uIGhhbmRsaW5nLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisjaW5jbHVkZSAic2ltLW9wdGlvbnMuaCIKKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisvKiBNZW1vcnkgZmlsbCBieXRlICovCitzdGF0aWMgdW5zaWduZWQ4IGZpbGxfYnl0ZV92YWx1ZTsKK3N0YXRpYyBpbnQgZmlsbF9ieXRlX2ZsYWcgPSAwOworCisvKiBNZW1vcnkgY29tbWFuZCBsaW5lIG9wdGlvbnMuICovCisKK2VudW0geworICBPUFRJT05fTUVNT1JZX0RFTEVURSA9IE9QVElPTl9TVEFSVCwKKyAgT1BUSU9OX01FTU9SWV9SRUdJT04sCisgIE9QVElPTl9NRU1PUllfU0laRSwKKyAgT1BUSU9OX01FTU9SWV9JTkZPLAorICBPUFRJT05fTUVNT1JZX0FMSUFTLAorICBPUFRJT05fTUVNT1JZX0NMRUFSLAorICBPUFRJT05fTUVNT1JZX0ZJTEwKK307CisKK3N0YXRpYyBERUNMQVJFX09QVElPTl9IQU5ETEVSIChtZW1vcnlfb3B0aW9uX2hhbmRsZXIpOworCitzdGF0aWMgY29uc3QgT1BUSU9OIG1lbW9yeV9vcHRpb25zW10gPQoreworICB7IHsibWVtb3J5LWRlbGV0ZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUVNT1JZX0RFTEVURSB9LAorICAgICAgJ1wwJywgIkFERFJFU1N8YWxsIiwgIkRlbGV0ZSBtZW1vcnkgYXQgQUREUkVTUyAoYWxsIGFkZHJlc3NlcykiLAorICAgICAgbWVtb3J5X29wdGlvbl9oYW5kbGVyIH0sCisgIHsgeyJkZWxldGUtbWVtb3J5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NRU1PUllfREVMRVRFIH0sCisgICAgICAnXDAnLCAiQUREUkVTUyIsIE5VTEwsCisgICAgICBtZW1vcnlfb3B0aW9uX2hhbmRsZXIgfSwKKworICB7IHsibWVtb3J5LXJlZ2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUVNT1JZX1JFR0lPTiB9LAorICAgICAgJ1wwJywgIkFERFJFU1MsU0laRVssTU9EVUxPXSIsICJBZGQgYSBtZW1vcnkgcmVnaW9uIiwKKyAgICAgIG1lbW9yeV9vcHRpb25faGFuZGxlciB9LAorCisgIHsgeyJtZW1vcnktYWxpYXMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01FTU9SWV9BTElBUyB9LAorICAgICAgJ1wwJywgIkFERFJFU1MsU0laRXssQUREUkVTU30iLCAiQWRkIG1lbW9yeSBzaGFkb3ciLAorICAgICAgbWVtb3J5X29wdGlvbl9oYW5kbGVyIH0sCisKKyAgeyB7Im1lbW9yeS1zaXplIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NRU1PUllfU0laRSB9LAorICAgICAgJ1wwJywgIlNJWkUiLCAiQWRkIG1lbW9yeSBhdCBhZGRyZXNzIHplcm8iLAorICAgICAgbWVtb3J5X29wdGlvbl9oYW5kbGVyIH0sCisKKyAgeyB7Im1lbW9yeS1maWxsIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NRU1PUllfRklMTCB9LAorICAgICAgJ1wwJywgIlZBTFVFIiwgIkZpbGwgc3Vic2VxdWVudGx5IGFkZGVkIG1lbW9yeSByZWdpb25zIiwKKyAgICAgIG1lbW9yeV9vcHRpb25faGFuZGxlciB9LAorCisgIHsgeyJtZW1vcnktY2xlYXIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01FTU9SWV9DTEVBUiB9LAorICAgICAgJ1wwJywgTlVMTCwgIkNsZWFyIHN1YnNlcXVlbnRseSBhZGRlZCBtZW1vcnkgcmVnaW9ucyIsCisgICAgICBtZW1vcnlfb3B0aW9uX2hhbmRsZXIgfSwKKworICB7IHsibWVtb3J5LWluZm8iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01FTU9SWV9JTkZPIH0sCisgICAgICAnXDAnLCBOVUxMLCAiTGlzdCBjb25maWd1cmFibGUgbWVtb3J5IHJlZ2lvbnMiLAorICAgICAgbWVtb3J5X29wdGlvbl9oYW5kbGVyIH0sCisgIHsgeyJpbmZvLW1lbW9yeSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUVNT1JZX0lORk8gfSwKKyAgICAgICdcMCcsIE5VTEwsIE5VTEwsCisgICAgICBtZW1vcnlfb3B0aW9uX2hhbmRsZXIgfSwKKworICB7IHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0sICdcMCcsIE5VTEwsIE5VTEwsIE5VTEwgfQorfTsKKworCitzdGF0aWMgc2ltX21lbW9wdCAqCitkb19tZW1vcHRfYWRkIChTSU1fREVTQyBzZCwKKwkgICAgICAgaW50IGxldmVsLAorCSAgICAgICBpbnQgc3BhY2UsCisJICAgICAgIGFkZHJlc3Nfd29yZCBhZGRyLAorCSAgICAgICBhZGRyZXNzX3dvcmQgbnJfYnl0ZXMsCisJICAgICAgIHVuc2lnbmVkIG1vZHVsbywKKwkgICAgICAgc2ltX21lbW9wdCAqKmVudHJ5LAorCSAgICAgICB2b2lkICpidWZmZXIpCit7CisgIHZvaWQgKmZpbGxfYnVmZmVyOworICB1bnNpZ25lZCBmaWxsX2xlbmd0aDsKKyAgdm9pZCAqZnJlZV9idWZmZXI7CisKKyAgaWYgKGJ1ZmZlciAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIEJ1ZmZlciBhbHJlYWR5IGdpdmVuLiAgc2ltX21lbW9yeV91bmluc3RhbGwgd2lsbCBmcmVlIGl0LiAqLworICAgICAgc2ltX2NvcmVfYXR0YWNoIChzZCwgTlVMTCwKKwkJICAgICAgIGxldmVsLCBhY2Nlc3NfcmVhZF93cml0ZV9leGVjLCBzcGFjZSwKKwkJICAgICAgIGFkZHIsIG5yX2J5dGVzLCBtb2R1bG8sIE5VTEwsIGJ1ZmZlcik7CisKKyAgICAgIGZyZWVfYnVmZmVyID0gYnVmZmVyOworICAgICAgZmlsbF9idWZmZXIgPSBidWZmZXI7CisgICAgICBmaWxsX2xlbmd0aCA9IChtb2R1bG8gPT0gMCkgPyBucl9ieXRlcyA6IG1vZHVsbzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBBbGxvY2F0ZSBuZXcgd2VsbC1hbGlnbmVkIGJ1ZmZlciwganVzdCBhcyBzaW1fY29yZV9hdHRhY2goKS4gKi8KKyAgICAgIHZvaWQgKmFsaWduZWRfYnVmZmVyOworICAgICAgaW50IHBhZGRpbmcgPSAoYWRkciAlIHNpemVvZiAodW5zaWduZWQ2NCkpOworICAgICAgdW5zaWduZWQgbG9uZyBieXRlcyA9IChtb2R1bG8gPT0gMCA/IG5yX2J5dGVzIDogbW9kdWxvKSArIHBhZGRpbmc7CisKKyAgICAgIC8qIElmIGZpbGxpbmcgd2l0aCBub24temVybyB2YWx1ZSwgZG8gbm90IHVzZSBjbGVhcmluZyBhbGxvY2F0b3IuICovCisKKyAgICAgIGlmIChmaWxsX2J5dGVfZmxhZyAmJiBmaWxsX2J5dGVfdmFsdWUgIT0gMCkKKyAgICAgICAgZnJlZV9idWZmZXIgPSB4bWFsbG9jIChieXRlcyk7IC8qIGRvbid0IGNsZWFyICovCisgICAgICBlbHNlCisgICAgICAgIGZyZWVfYnVmZmVyID0gemFsbG9jIChieXRlcyk7IC8qIGNsZWFyICovCisKKyAgICAgIGFsaWduZWRfYnVmZmVyID0gKGNoYXIqKSBmcmVlX2J1ZmZlciArIHBhZGRpbmc7CisKKyAgICAgIHNpbV9jb3JlX2F0dGFjaCAoc2QsIE5VTEwsCisJCSAgICAgICBsZXZlbCwgYWNjZXNzX3JlYWRfd3JpdGVfZXhlYywgc3BhY2UsCisJCSAgICAgICBhZGRyLCBucl9ieXRlcywgbW9kdWxvLCBOVUxMLCBhbGlnbmVkX2J1ZmZlcik7CisKKyAgICAgIGZpbGxfYnVmZmVyID0gYWxpZ25lZF9idWZmZXI7CisgICAgICBmaWxsX2xlbmd0aCA9IChtb2R1bG8gPT0gMCkgPyBucl9ieXRlcyA6IG1vZHVsbzsKKworICAgICAgLyogSWYgd2UganVzdCB1c2VkIGEgY2xlYXJpbmcgYWxsb2NhdG9yLCBhbmQgYXJlIGFib3V0IHRvIGZpbGwgd2l0aAorICAgICAgICAgemVybywgdHJ1bmNhdGUgdGhlIHJlZHVuZGFudCBmaWxsIG9wZXJhdGlvbi4gKi8KKworICAgICAgaWYgKGZpbGxfYnl0ZV9mbGFnICYmIGZpbGxfYnl0ZV92YWx1ZSA9PSAwKQorICAgICAgICAgZmlsbF9sZW5ndGggPSAxOyAvKiBhdm9pZCBib3VuZGFyeSBsZW5ndGg9MCBjYXNlICovCisgICAgfQorCisgIGlmIChmaWxsX2J5dGVfZmxhZykKKyAgICB7CisgICAgICBBU1NFUlQgKGZpbGxfYnVmZmVyICE9IDApOworICAgICAgbWVtc2V0ICgoY2hhciopIGZpbGxfYnVmZmVyLCBmaWxsX2J5dGVfdmFsdWUsIGZpbGxfbGVuZ3RoKTsKKyAgICB9CisKKyAgd2hpbGUgKCgqZW50cnkpICE9IE5VTEwpCisgICAgZW50cnkgPSAmKCplbnRyeSktPm5leHQ7CisgICgqZW50cnkpID0gWkFMTE9DIChzaW1fbWVtb3B0KTsKKyAgKCplbnRyeSktPmxldmVsID0gbGV2ZWw7CisgICgqZW50cnkpLT5zcGFjZSA9IHNwYWNlOworICAoKmVudHJ5KS0+YWRkciA9IGFkZHI7CisgICgqZW50cnkpLT5ucl9ieXRlcyA9IG5yX2J5dGVzOworICAoKmVudHJ5KS0+bW9kdWxvID0gbW9kdWxvOworICAoKmVudHJ5KS0+YnVmZmVyID0gZnJlZV9idWZmZXI7CisKKyAgcmV0dXJuICgqZW50cnkpOworfQorCitzdGF0aWMgU0lNX1JDCitkb19tZW1vcHRfZGVsZXRlIChTSU1fREVTQyBzZCwKKwkJICBpbnQgbGV2ZWwsCisJCSAgaW50IHNwYWNlLAorCQkgIGFkZHJlc3Nfd29yZCBhZGRyKQoreworICBzaW1fbWVtb3B0ICoqZW50cnkgPSAmU1RBVEVfTUVNT1BUIChzZCk7CisgIHNpbV9tZW1vcHQgKmFsaWFzOworICB3aGlsZSAoKCplbnRyeSkgIT0gTlVMTAorCSAmJiAoKCplbnRyeSktPmxldmVsICE9IGxldmVsCisJICAgICAgfHwgKCplbnRyeSktPnNwYWNlICE9IHNwYWNlCisJICAgICAgfHwgKCplbnRyeSktPmFkZHIgIT0gYWRkcikpCisgICAgZW50cnkgPSAmKCplbnRyeSktPm5leHQ7CisgIGlmICgoKmVudHJ5KSA9PSBOVUxMKQorICAgIHsKKyAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIk1lbW9yeSBhdCAweCVseCBub3QgZm91bmQsIG5vdCBkZWxldGVkXG4iLAorCQkgICAgICAobG9uZykgYWRkcik7CisgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisgICAgfQorICAvKiBkZWxldGUgYW55IGJ1ZmZlciAqLworICBpZiAoKCplbnRyeSktPmJ1ZmZlciAhPSBOVUxMKQorICAgIHpmcmVlICgoKmVudHJ5KS0+YnVmZmVyKTsKKyAgLyogZGVsZXRlIGl0IGFuZCBpdHMgYWxpYXNlcyAqLworICBhbGlhcyA9ICplbnRyeTsKKyAgKmVudHJ5ID0gKCplbnRyeSktPm5leHQ7CisgIHdoaWxlIChhbGlhcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIHNpbV9tZW1vcHQgKmRlYWQgPSBhbGlhczsKKyAgICAgIGFsaWFzID0gYWxpYXMtPmFsaWFzOworICAgICAgc2ltX2NvcmVfZGV0YWNoIChzZCwgTlVMTCwgZGVhZC0+bGV2ZWwsIGRlYWQtPnNwYWNlLCBkZWFkLT5hZGRyKTsKKyAgICAgIHpmcmVlIChkZWFkKTsKKyAgICB9CisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKKworc3RhdGljIGNoYXIgKgorcGFyc2Vfc2l6ZSAoY2hhciAqY2hwLAorCSAgICBhZGRyZXNzX3dvcmQgKm5yX2J5dGVzLAorCSAgICB1bnNpZ25lZCAqbW9kdWxvKQoreworICAvKiA8bnJfYnl0ZXM+IFsgIiUiIDxtb2R1bG8+IF0gKi8KKyAgKm5yX2J5dGVzID0gc3RydG91bCAoY2hwLCAmY2hwLCAwKTsKKyAgaWYgKCpjaHAgPT0gJyUnKQorICAgIHsKKyAgICAgICptb2R1bG8gPSBzdHJ0b3VsIChjaHAgKyAxLCAmY2hwLCAwKTsKKyAgICB9CisgIHJldHVybiBjaHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK3BhcnNlX3Vsb25nX3ZhbHVlIChjaGFyICpjaHAsCisJCSAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWUpCit7CisgICp2YWx1ZSA9IHN0cnRvdWwgKGNocCwgJmNocCwgMCk7CisgIHJldHVybiBjaHA7Cit9CisKK3N0YXRpYyBjaGFyICoKK3BhcnNlX2FkZHIgKGNoYXIgKmNocCwKKwkgICAgaW50ICpsZXZlbCwKKwkgICAgaW50ICpzcGFjZSwKKwkgICAgYWRkcmVzc193b3JkICphZGRyKQoreworICAvKiBbIDxzcGFjZT4gIjogIiBdIDxhZGRyPiBbICJAIiA8bGV2ZWw+IF0gKi8KKyAgKmFkZHIgPSAodW5zaWduZWQgbG9uZykgc3RydG91bCAoY2hwLCAmY2hwLCAwKTsKKyAgaWYgKCpjaHAgPT0gJzonKQorICAgIHsKKyAgICAgICpzcGFjZSA9ICphZGRyOworICAgICAgKmFkZHIgPSAodW5zaWduZWQgbG9uZykgc3RydG91bCAoY2hwICsgMSwgJmNocCwgMCk7CisgICAgfQorICBpZiAoKmNocCA9PSAnQCcpCisgICAgeworICAgICAgKmxldmVsID0gc3RydG91bCAoY2hwICsgMSwgJmNocCwgMCk7CisgICAgfQorICByZXR1cm4gY2hwOworfQorCisKK3N0YXRpYyBTSU1fUkMKK21lbW9yeV9vcHRpb25faGFuZGxlciAoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgaW50IG9wdCwKKwkJICAgICAgIGNoYXIgKmFyZywgaW50IGlzX2NvbW1hbmQpCit7CisgIHN3aXRjaCAob3B0KQorICAgIHsKKworICAgIGNhc2UgT1BUSU9OX01FTU9SWV9ERUxFVEU6CisgICAgICBpZiAoc3RyY2FzZWNtcCAoYXJnLCAiYWxsIikgPT0gMCkKKwl7CisJICB3aGlsZSAoU1RBVEVfTUVNT1BUIChzZCkgIT0gTlVMTCkKKwkgICAgZG9fbWVtb3B0X2RlbGV0ZSAoc2QsCisJCQkgICAgICBTVEFURV9NRU1PUFQgKHNkKS0+bGV2ZWwsCisJCQkgICAgICBTVEFURV9NRU1PUFQgKHNkKS0+c3BhY2UsCisJCQkgICAgICBTVEFURV9NRU1PUFQgKHNkKS0+YWRkcik7CisJICByZXR1cm4gU0lNX1JDX09LOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpbnQgbGV2ZWwgPSAwOworCSAgaW50IHNwYWNlID0gMDsKKwkgIGFkZHJlc3Nfd29yZCBhZGRyID0gMDsKKwkgIHBhcnNlX2FkZHIgKGFyZywgJmxldmVsLCAmc3BhY2UsICZhZGRyKTsKKwkgIHJldHVybiBkb19tZW1vcHRfZGVsZXRlIChzZCwgbGV2ZWwsIHNwYWNlLCBhZGRyKTsKKwl9CisgICAgCisgICAgY2FzZSBPUFRJT05fTUVNT1JZX1JFR0lPTjoKKyAgICAgIHsKKwljaGFyICpjaHAgPSBhcmc7CisJaW50IGxldmVsID0gMDsKKwlpbnQgc3BhY2UgPSAwOworCWFkZHJlc3Nfd29yZCBhZGRyID0gMDsKKwlhZGRyZXNzX3dvcmQgbnJfYnl0ZXMgPSAwOworCXVuc2lnbmVkIG1vZHVsbyA9IDA7CisJLyogcGFyc2UgdGhlIGFyZ3VtZW50cyAqLworCWNocCA9IHBhcnNlX2FkZHIgKGNocCwgJmxldmVsLCAmc3BhY2UsICZhZGRyKTsKKwlpZiAoKmNocCAhPSAnLCcpCisJICB7CisJICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIk1pc3Npbmcgc2l6ZSBmb3IgbWVtb3J5LXJlZ2lvblxuIik7CisJICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKwkgIH0KKwljaHAgPSBwYXJzZV9zaXplIChjaHAgKyAxLCAmbnJfYnl0ZXMsICZtb2R1bG8pOworCS8qIG9sZCBzdHlsZSAqLworCWlmICgqY2hwID09ICcsJykKKwkgIG1vZHVsbyA9IHN0cnRvdWwgKGNocCArIDEsICZjaHAsIDApOworCS8qIHRyeSB0byBhdHRhY2gvaW5zZXJ0IGl0ICovCisJZG9fbWVtb3B0X2FkZCAoc2QsIGxldmVsLCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMsIG1vZHVsbywKKwkJICAgICAgICZTVEFURV9NRU1PUFQgKHNkKSwgTlVMTCk7CisJcmV0dXJuIFNJTV9SQ19PSzsKKyAgICAgIH0KKworICAgIGNhc2UgT1BUSU9OX01FTU9SWV9BTElBUzoKKyAgICAgIHsKKwljaGFyICpjaHAgPSBhcmc7CisJaW50IGxldmVsID0gMDsKKwlpbnQgc3BhY2UgPSAwOworCWFkZHJlc3Nfd29yZCBhZGRyID0gMDsKKwlhZGRyZXNzX3dvcmQgbnJfYnl0ZXMgPSAwOworCXVuc2lnbmVkIG1vZHVsbyA9IDA7CisJc2ltX21lbW9wdCAqZW50cnk7CisJLyogcGFyc2UgdGhlIGFyZ3VtZW50cyAqLworCWNocCA9IHBhcnNlX2FkZHIgKGNocCwgJmxldmVsLCAmc3BhY2UsICZhZGRyKTsKKwlpZiAoKmNocCAhPSAnLCcpCisJICB7CisJICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIk1pc3Npbmcgc2l6ZSBmb3IgbWVtb3J5LXJlZ2lvblxuIik7CisJICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKwkgIH0KKwljaHAgPSBwYXJzZV9zaXplIChjaHAgKyAxLCAmbnJfYnl0ZXMsICZtb2R1bG8pOworCS8qIHRyeSB0byBhdHRhY2gvaW5zZXJ0IHRoZSBtYWluIHJlY29yZCAqLworCWVudHJ5ID0gZG9fbWVtb3B0X2FkZCAoc2QsIGxldmVsLCBzcGFjZSwgYWRkciwgbnJfYnl0ZXMsIG1vZHVsbywKKwkJCSAgICAgICAmU1RBVEVfTUVNT1BUIChzZCksCisJCQkgICAgICAgTlVMTCk7CisJLyogbm93IGF0dGFjaCBhbGwgdGhlIGFsaWFzZXMgKi8KKwl3aGlsZSAoKmNocCA9PSAnLCcpCisJICB7CisJICAgIGludCBhX2xldmVsID0gbGV2ZWw7CisJICAgIGludCBhX3NwYWNlID0gc3BhY2U7CisJICAgIGFkZHJlc3Nfd29yZCBhX2FkZHIgPSBhZGRyOworCSAgICBjaHAgPSBwYXJzZV9hZGRyIChjaHAgKyAxLCAmYV9sZXZlbCwgJmFfc3BhY2UsICZhX2FkZHIpOworCSAgICBkb19tZW1vcHRfYWRkIChzZCwgYV9sZXZlbCwgYV9zcGFjZSwgYV9hZGRyLCBucl9ieXRlcywgbW9kdWxvLAorCQkJICAgJmVudHJ5LT5hbGlhcywgZW50cnktPmJ1ZmZlcik7CisJICB9CisJcmV0dXJuIFNJTV9SQ19PSzsKKyAgICAgIH0KKworICAgIGNhc2UgT1BUSU9OX01FTU9SWV9TSVpFOgorICAgICAgeworCWludCBsZXZlbCA9IDA7CisJaW50IHNwYWNlID0gMDsKKwlhZGRyZXNzX3dvcmQgYWRkciA9IDA7CisJYWRkcmVzc193b3JkIG5yX2J5dGVzID0gMDsKKwl1bnNpZ25lZCBtb2R1bG8gPSAwOworCS8qIHBhcnNlIHRoZSBhcmd1bWVudHMgKi8KKwlwYXJzZV9zaXplIChhcmcsICZucl9ieXRlcywgJm1vZHVsbyk7CisJLyogdHJ5IHRvIGF0dGFjaC9pbnNlcnQgaXQgKi8KKwlkb19tZW1vcHRfYWRkIChzZCwgbGV2ZWwsIHNwYWNlLCBhZGRyLCBucl9ieXRlcywgbW9kdWxvLAorCQkgICAgICAgJlNUQVRFX01FTU9QVCAoc2QpLCBOVUxMKTsKKwlyZXR1cm4gU0lNX1JDX09LOworICAgICAgfQorCisgICAgY2FzZSBPUFRJT05fTUVNT1JZX0NMRUFSOgorICAgICAgeworCWZpbGxfYnl0ZV92YWx1ZSA9ICh1bnNpZ25lZDgpIDA7CisJZmlsbF9ieXRlX2ZsYWcgPSAxOworCXJldHVybiBTSU1fUkNfT0s7CisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIE9QVElPTl9NRU1PUllfRklMTDoKKyAgICAgIHsKKwl1bnNpZ25lZCBsb25nIGZpbGxfdmFsdWU7CisJcGFyc2VfdWxvbmdfdmFsdWUgKGFyZywgJmZpbGxfdmFsdWUpOworCWlmIChmaWxsX3ZhbHVlID4gMjU1KQorCSAgeworCSAgICBzaW1faW9fZXByaW50ZiAoc2QsICJNaXNzaW5nIGZpbGwgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTVcbiIpOworCSAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisJICB9CisJZmlsbF9ieXRlX3ZhbHVlID0gKHVuc2lnbmVkOCkgZmlsbF92YWx1ZTsKKwlmaWxsX2J5dGVfZmxhZyA9IDE7CisJcmV0dXJuIFNJTV9SQ19PSzsKKwlicmVhazsKKyAgICAgIH0KKworICAgIGNhc2UgT1BUSU9OX01FTU9SWV9JTkZPOgorICAgICAgeworCXNpbV9tZW1vcHQgKmVudHJ5OworCXNpbV9pb19wcmludGYgKHNkLCAiTWVtb3J5IG1hcHM6XG4iKTsKKwlmb3IgKGVudHJ5ID0gU1RBVEVfTUVNT1BUIChzZCk7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpCisJICB7CisJICAgIHNpbV9tZW1vcHQgKmFsaWFzOworCSAgICBzaW1faW9fcHJpbnRmIChzZCwgIiBtZW1vcnkiKTsKKwkgICAgaWYgKGVudHJ5LT5hbGlhcyA9PSBOVUxMKQorCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiIHJlZ2lvbiAiKTsKKwkgICAgZWxzZQorCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiIGFsaWFzICIpOworCSAgICBpZiAoZW50cnktPnNwYWNlICE9IDApCisJICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICIweCVseDoiLCAobG9uZykgZW50cnktPnNwYWNlKTsKKwkgICAgc2ltX2lvX3ByaW50ZiAoc2QsICIweCUwOGx4IiwgKGxvbmcpIGVudHJ5LT5hZGRyKTsKKwkgICAgaWYgKGVudHJ5LT5sZXZlbCAhPSAwKQorCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiQDB4JWx4IiwgKGxvbmcpIGVudHJ5LT5sZXZlbCk7CisJICAgIHNpbV9pb19wcmludGYgKHNkLCAiLDB4JWx4IiwKKwkJCSAgIChsb25nKSBlbnRyeS0+bnJfYnl0ZXMpOworCSAgICBpZiAoZW50cnktPm1vZHVsbyAhPSAwKQorCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiJSUweCVseCIsIChsb25nKSBlbnRyeS0+bW9kdWxvKTsKKwkgICAgZm9yIChhbGlhcyA9IGVudHJ5LT5hbGlhczsKKwkJIGFsaWFzICE9IE5VTEw7CisJCSBhbGlhcyA9IGFsaWFzLT5uZXh0KQorCSAgICAgIHsKKwkJaWYgKGFsaWFzLT5zcGFjZSAhPSAwKQorCQkgIHNpbV9pb19wcmludGYgKHNkLCAiMHglbHg6IiwgKGxvbmcpIGFsaWFzLT5zcGFjZSk7CisJCXNpbV9pb19wcmludGYgKHNkLCAiLDB4JTA4bHgiLCAobG9uZykgYWxpYXMtPmFkZHIpOworCQlpZiAoYWxpYXMtPmxldmVsICE9IDApCisJCSAgc2ltX2lvX3ByaW50ZiAoc2QsICJAMHglbHgiLCAobG9uZykgYWxpYXMtPmxldmVsKTsKKwkgICAgICB9CisJICAgIHNpbV9pb19wcmludGYgKHNkLCAiXG4iKTsKKwkgIH0KKwlyZXR1cm4gU0lNX1JDX09LOworCWJyZWFrOworICAgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlVua25vd24gbWVtb3J5IG9wdGlvbiAlZFxuIiwgb3B0KTsKKyAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKworICAgIH0KKworICByZXR1cm4gU0lNX1JDX0ZBSUw7Cit9CisKKworLyogIm1lbW9yeSIgbW9kdWxlIGluc3RhbGwgaGFuZGxlci4KKworICAgVGhpcyBpcyBjYWxsZWQgdmlhIHNpbV9tb2R1bGVfaW5zdGFsbCB0byBpbnN0YWxsIHRoZSAibWVtb3J5IiBzdWJzeXN0ZW0KKyAgIGludG8gdGhlIHNpbXVsYXRvci4gICovCisKK3N0YXRpYyBNT0RVTEVfSU5JVF9GTiBzaW1fbWVtb3J5X2luaXQ7CitzdGF0aWMgTU9EVUxFX1VOSU5TVEFMTF9GTiBzaW1fbWVtb3J5X3VuaW5zdGFsbDsKKworU0lNX1JDCitzaW1fbWVtb3B0X2luc3RhbGwgKFNJTV9ERVNDIHNkKQoreworICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworICBzaW1fYWRkX29wdGlvbl90YWJsZSAoc2QsIE5VTEwsIG1lbW9yeV9vcHRpb25zKTsKKyAgc2ltX21vZHVsZV9hZGRfdW5pbnN0YWxsX2ZuIChzZCwgc2ltX21lbW9yeV91bmluc3RhbGwpOworICBzaW1fbW9kdWxlX2FkZF9pbml0X2ZuIChzZCwgc2ltX21lbW9yeV9pbml0KTsKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworCisvKiBVbmluc3RhbGwgdGhlICJtZW1vcnkiIHN1YnN5c3RlbSBmcm9tIHRoZSBzaW11bGF0b3IuICAqLworCitzdGF0aWMgdm9pZAorc2ltX21lbW9yeV91bmluc3RhbGwgKFNJTV9ERVNDIHNkKQoreworICBzaW1fbWVtb3B0ICoqZW50cnkgPSAmU1RBVEVfTUVNT1BUIChzZCk7CisgIHNpbV9tZW1vcHQgKmFsaWFzOworCisgIHdoaWxlICgoKmVudHJ5KSAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIGRlbGV0ZSBhbnkgYnVmZmVyICovCisgICAgICBpZiAoKCplbnRyeSktPmJ1ZmZlciAhPSBOVUxMKQorCXpmcmVlICgoKmVudHJ5KS0+YnVmZmVyKTsKKworICAgICAgLyogZGVsZXRlIGl0IGFuZCBpdHMgYWxpYXNlcyAqLworICAgICAgYWxpYXMgPSAqZW50cnk7CisgICAgICB3aGlsZSAoYWxpYXMgIT0gTlVMTCkKKwl7CisJICBzaW1fbWVtb3B0ICpkZWFkID0gYWxpYXM7CisJICBhbGlhcyA9IGFsaWFzLT5hbGlhczsKKwkgIHNpbV9jb3JlX2RldGFjaCAoc2QsIE5VTEwsIGRlYWQtPmxldmVsLCBkZWFkLT5zcGFjZSwgZGVhZC0+YWRkcik7CisJICB6ZnJlZSAoZGVhZCk7CisJfQorCisgICAgICAvKiBuZXh0IHZpY3RpbSAqLworICAgICAgKmVudHJ5ID0gKCplbnRyeSktPm5leHQ7CisgICAgfQorfQorCisKK3N0YXRpYyBTSU1fUkMKK3NpbV9tZW1vcnlfaW5pdCAoU0lNX0RFU0Mgc2QpCit7CisgIC8qIEZJWE1FOiBhbnl0aGluZyBuZWVkZWQ/ICovCisgIHJldHVybiBTSU1fUkNfT0s7Cit9CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1tZW1vcHQuaCBiL3NpbS9jb21tb24vc2ltLW1lbW9wdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4N2M1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS1tZW1vcHQuaApAQCAtMCwwICsxLDQ2IEBACisvKiBIZWFkZXIgZmlsZSBmb3Igc2ltdWxhdG9yIG1lbW9yeSBhcmd1bWVudCBoYW5kbGluZy4KKyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgU0lNX01FTU9QVF9ICisjZGVmaW5lIFNJTV9NRU1PUFRfSAorCisvKiBQcm92aWRlcyBhIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UgZm9yIG1hbmlwdWxhdGluZyB0aGUgbWVtb3J5IGNvcmUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3NpbV9tZW1vcHQgc2ltX21lbW9wdDsKK3N0cnVjdCBfc2ltX21lbW9wdCB7CisgIGludCBsZXZlbDsKKyAgaW50IHNwYWNlOworICB1bnNpZ25lZF93b3JkIGFkZHI7CisgIHVuc2lnbmVkX3dvcmQgbnJfYnl0ZXM7CisgIHVuc2lnbmVkIG1vZHVsbzsKKyAgdm9pZCAqYnVmZmVyOworICBzaW1fbWVtb3B0ICphbGlhczsgLyogbGlua2VkIGxpc3QgKi8KKyAgc2ltX21lbW9wdCAqbmV4dDsKK307CisKKworLyogSW5zdGFsbCB0aGUgIm1lbW9wdCIgbW9kdWxlLiAgKi8KKworU0lNX1JDIHNpbV9tZW1vcHRfaW5zdGFsbCAoU0lNX0RFU0Mgc2QpOworCisKKy8qIFdhcyB0aGVyZSBhIG1lbW9yeSBjb21tYW5kPyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLW1vZGVsLmMgYi9zaW0vY29tbW9uL3NpbS1tb2RlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMjZmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS1tb2RlbC5jCkBAIC0wLDAgKzEsMjA4IEBACisvKiBNb2RlbCBzdXBwb3J0LgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAic2ltLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJzaW0taW8uaCIKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisjaW5jbHVkZSAiYmZkLmgiCisKK3N0YXRpYyB2b2lkIG1vZGVsX3NldCAoc2ltX2NwdSAqLCBjb25zdCBNT0RFTCAqKTsKKworc3RhdGljIERFQ0xBUkVfT1BUSU9OX0hBTkRMRVIgKG1vZGVsX29wdGlvbl9oYW5kbGVyKTsKKworc3RhdGljIE1PRFVMRV9JTklUX0ZOIHNpbV9tb2RlbF9pbml0OworCisjZGVmaW5lIE9QVElPTl9NT0RFTCAoT1BUSU9OX1NUQVJUICsgMCkKKworc3RhdGljIGNvbnN0IE9QVElPTiBtb2RlbF9vcHRpb25zW10gPSB7CisgIHsgeyJtb2RlbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTU9ERUx9LAorICAgICAgJ1wwJywgIk1PREVMIiwgIlNwZWNpZnkgbW9kZWwgdG8gc2ltdWxhdGUiLAorICAgICAgbW9kZWxfb3B0aW9uX2hhbmRsZXIgfSwKKyAgeyB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9LCAnXDAnLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBTSU1fUkMKK21vZGVsX29wdGlvbl9oYW5kbGVyIChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBpbnQgb3B0LAorCQkgICAgICBjaGFyICphcmcsIGludCBpc19jb21tYW5kKQoreworICBzd2l0Y2ggKG9wdCkKKyAgICB7CisgICAgY2FzZSBPUFRJT05fTU9ERUwgOgorICAgICAgeworCWNvbnN0IE1PREVMICptb2RlbCA9IHNpbV9tb2RlbF9sb29rdXAgKGFyZyk7CisJaWYgKCEgbW9kZWwpCisJICB7CisJICAgIHNpbV9pb19lcHJpbnRmIChzZCwgInVua25vd24gbW9kZWwgYCVzJyIsIGFyZyk7CisJICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKwkgIH0KKwlzaW1fbW9kZWxfc2V0IChzZCwgY3B1LCBtb2RlbCk7CisJYnJlYWs7CisgICAgICB9CisgICAgfQorCisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKK1NJTV9SQworc2ltX21vZGVsX2luc3RhbGwgKFNJTV9ERVNDIHNkKQoreworICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworCisgIHNpbV9hZGRfb3B0aW9uX3RhYmxlIChzZCwgTlVMTCwgbW9kZWxfb3B0aW9ucyk7CisgIHNpbV9tb2R1bGVfYWRkX2luaXRfZm4gKHNkLCBzaW1fbW9kZWxfaW5pdCk7CisKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworLyogU3Vicm91dGluZSBvZiBzaW1fbW9kZWxfc2V0IHRvIHNldCB0aGUgbW9kZWwgZm9yIG9uZSBjcHUuICAqLworCitzdGF0aWMgdm9pZAorbW9kZWxfc2V0IChzaW1fY3B1ICpjcHUsIGNvbnN0IE1PREVMICptb2RlbCkKK3sKKyAgQ1BVX01BQ0ggKGNwdSkgPSBNT0RFTF9NQUNIIChtb2RlbCk7CisgIENQVV9NT0RFTCAoY3B1KSA9IG1vZGVsOworICAoKiBNQUNIX0lOSVRfQ1BVIChNT0RFTF9NQUNIIChtb2RlbCkpKSAoY3B1KTsKKyAgKCogTU9ERUxfSU5JVCAobW9kZWwpKSAoY3B1KTsKK30KKworLyogU2V0IHRoZSBjdXJyZW50IG1vZGVsIG9mIENQVSB0byBNT0RFTC4KKyAgIElmIENQVSBpcyBOVUxMLCBhbGwgY3B1cyBhcmUgc2V0IHRvIE1PREVMLiAgKi8KKwordm9pZAorc2ltX21vZGVsX3NldCAoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgY29uc3QgTU9ERUwgKm1vZGVsKQoreworICBpZiAoISBjcHUpCisgICAgeworICAgICAgaW50IGM7CisKKyAgICAgIGZvciAoYyA9IDA7IGMgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytjKQorCWlmIChTVEFURV9DUFUgKHNkLCBjKSkKKwkgIG1vZGVsX3NldCAoU1RBVEVfQ1BVIChzZCwgYyksIG1vZGVsKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtb2RlbF9zZXQgKGNwdSwgbW9kZWwpOworICAgIH0KK30KKworLyogTG9vayB1cCBtb2RlbCBuYW1lZCBOQU1FLgorICAgUmVzdWx0IGlzIHBvaW50ZXIgdG8gTU9ERUwgZW50cnkgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLworCitjb25zdCBNT0RFTCAqCitzaW1fbW9kZWxfbG9va3VwIChjb25zdCBjaGFyICpuYW1lKQoreworICBjb25zdCBNQUNIICoqbWFjaHA7CisgIGNvbnN0IE1PREVMICptb2RlbDsKKworICBmb3IgKG1hY2hwID0gJiBzaW1fbWFjaHNbMF07ICptYWNocCAhPSBOVUxMOyArK21hY2hwKQorICAgIHsKKyAgICAgIGZvciAobW9kZWwgPSBNQUNIX01PREVMUyAoKm1hY2hwKTsgTU9ERUxfTkFNRSAobW9kZWwpICE9IE5VTEw7ICsrbW9kZWwpCisJeworCSAgaWYgKHN0cmNtcCAoTU9ERUxfTkFNRSAobW9kZWwpLCBuYW1lKSA9PSAwKQorCSAgICByZXR1cm4gbW9kZWw7CisJfQorICAgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIExvb2sgdXAgbWFjaGluZSBuYW1lZCBOQU1FLgorICAgUmVzdWx0IGlzIHBvaW50ZXIgdG8gTUFDSCBlbnRyeSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCisKK2NvbnN0IE1BQ0ggKgorc2ltX21hY2hfbG9va3VwIChjb25zdCBjaGFyICpuYW1lKQoreworICBjb25zdCBNQUNIICoqbWFjaHA7CisKKyAgZm9yIChtYWNocCA9ICYgc2ltX21hY2hzWzBdOyAqbWFjaHAgIT0gTlVMTDsgKyttYWNocCkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChNQUNIX05BTUUgKCptYWNocCksIG5hbWUpID09IDApCisJcmV0dXJuICptYWNocDsKKyAgICB9CisgIHJldHVybiBOVUxMOworfQorCisvKiBMb29rIHVwIGEgbWFjaGluZSB2aWEgaXRzIGJmZCBuYW1lLgorICAgUmVzdWx0IGlzIHBvaW50ZXIgdG8gTUFDSCBlbnRyeSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCisKK2NvbnN0IE1BQ0ggKgorc2ltX21hY2hfbG9va3VwX2JmZF9uYW1lIChjb25zdCBjaGFyICpuYW1lKQoreworICBjb25zdCBNQUNIICoqbWFjaHA7CisKKyAgZm9yIChtYWNocCA9ICYgc2ltX21hY2hzWzBdOyAqbWFjaHAgIT0gTlVMTDsgKyttYWNocCkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChNQUNIX0JGRF9OQU1FICgqbWFjaHApLCBuYW1lKSA9PSAwKQorCXJldHVybiAqbWFjaHA7CisgICAgfQorICByZXR1cm4gTlVMTDsKK30KKworLyogSW5pdGlhbGl6ZSBtb2RlbCBzdXBwb3J0LiAgKi8KKworc3RhdGljIFNJTV9SQworc2ltX21vZGVsX2luaXQgKFNJTV9ERVNDIHNkKQoreworICBTSU1fQ1BVICpjcHU7CisKKyAgLyogSWYgYm90aCBjcHUgbW9kZWwgYW5kIHN0YXRlIGFyY2hpdGVjdHVyZSBhcmUgc2V0LCBlbnN1cmUgdGhleSdyZQorICAgICBjb21wYXRpYmxlLiAgSWYgb25seSBvbmUgaXMgc2V0LCBzZXQgdGhlIG90aGVyLiAgSWYgbmVpdGhlciBhcmUgc2V0LAorICAgICB1c2UgdGhlIGRlZmF1bHQgbW9kZWwuICBTVEFURV9BUkNISVRFQ1RVUkUgaXMgdGhlIGJmZF9hcmNoX2luZm8gZGF0YQorICAgICBmb3IgdGhlIHNlbGVjdGVkICJtYWNoIiAoYmZkIHRlcm1pbm9sb2d5KS4gICovCisKKyAgLyogT25seSBjaGVjayBjcHUgMC4gIFNUQVRFX0FSQ0hJVEVDVFVSRSBpcyBmb3IgdGhhdCBvbmUgb25seS4gICovCisgIC8qID8/PyBBdCBwcmVzZW50IHRoaXMgb25seSBzdXBwb3J0cyBob21vZ2VuZW91cyBtdWx0aXByb2Nlc3NvcnMuICAqLworICBjcHUgPSBTVEFURV9DUFUgKHNkLCAwKTsKKworICBpZiAoISBTVEFURV9BUkNISVRFQ1RVUkUgKHNkKQorICAgICAgJiYgISBDUFVfTUFDSCAoY3B1KSkKKyAgICB7CisgICAgICAvKiBTZXQgdGhlIGRlZmF1bHQgbW9kZWwuICAqLworICAgICAgY29uc3QgTU9ERUwgKm1vZGVsID0gc2ltX21vZGVsX2xvb2t1cCAoV0lUSF9ERUZBVUxUX01PREVMKTsKKyAgICAgIHNpbV9tb2RlbF9zZXQgKHNkLCBOVUxMLCBtb2RlbCk7CisgICAgfQorCisgIGlmIChTVEFURV9BUkNISVRFQ1RVUkUgKHNkKQorICAgICAgJiYgQ1BVX01BQ0ggKGNwdSkpCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoU1RBVEVfQVJDSElURUNUVVJFIChzZCktPnByaW50YWJsZV9uYW1lLAorCQkgIE1BQ0hfQkZEX05BTUUgKENQVV9NQUNIIChjcHUpKSkgIT0gMCkKKwl7CisJICBzaW1faW9fZXByaW50ZiAoc2QsICJpbnZhbGlkIG1vZGVsIGAlcycgZm9yIGAlcydcbiIsCisJCQkgIE1PREVMX05BTUUgKENQVV9NT0RFTCAoY3B1KSksCisJCQkgIFNUQVRFX0FSQ0hJVEVDVFVSRSAoc2QpLT5wcmludGFibGVfbmFtZSk7CisJICByZXR1cm4gU0lNX1JDX0ZBSUw7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoU1RBVEVfQVJDSElURUNUVVJFIChzZCkpCisgICAgeworICAgICAgLyogVXNlIHRoZSBkZWZhdWx0IG1vZGVsIGZvciB0aGUgc2VsZWN0ZWQgbWFjaGluZS4KKwkgVGhlIGRlZmF1bHQgbW9kZWwgaXMgdGhlIGZpcnN0IG9uZSBpbiB0aGUgbGlzdC4gICovCisgICAgICBjb25zdCBNQUNIICptYWNoID0gc2ltX21hY2hfbG9va3VwX2JmZF9uYW1lIChTVEFURV9BUkNISVRFQ1RVUkUgKHNkKS0+cHJpbnRhYmxlX25hbWUpOworICAgICAgc2ltX21vZGVsX3NldCAoc2QsIE5VTEwsIE1BQ0hfTU9ERUxTIChtYWNoKSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgU1RBVEVfQVJDSElURUNUVVJFIChzZCkgPSBiZmRfc2Nhbl9hcmNoIChNQUNIX0JGRF9OQU1FIChDUFVfTUFDSCAoY3B1KSkpOworICAgIH0KKworICByZXR1cm4gU0lNX1JDX09LOworfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tbW9kZWwuaCBiL3NpbS9jb21tb24vc2ltLW1vZGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3NzY5YQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vc2ltLW1vZGVsLmgKQEAgLTAsMCArMSwxMzggQEAKKy8qIEFyY2hpdGVjdHVyZSwgbWFjaGluZSwgYW5kIG1vZGVsIHN1cHBvcnQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBOb21lbmNsYXR1cmU6CisgICBhcmNoaXRlY3R1cmUgPSBvbmUgb2Ygc3BhcmMsIG1pcHMsIHNoLCBldGMuCisgICBpbiB0aGUgc3BhcmMgYXJjaGl0ZWN0dXJlLCBtYWNoID0gb25lIG9mIHY2LCB2NywgdjgsIHNwYXJjbGl0ZSwgZXRjLgorICAgaW4gdGhlIHY4IG1hY2gsIG1vZGVsID0gb25lIG9mIHN1cGVyc3BhcmMsIGV0Yy4KKyovCisKKy8qIFRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBieSBzaW0tYmFzaWNzLmguICAqLworCisjaWZuZGVmIFNJTV9NT0RFTF9ICisjZGVmaW5lIFNJTV9NT0RFTF9ICisKKy8qIEZ1bmN0aW9uIHVuaXQgYW5kIGluc3RydWN0aW9uIHRpbWluZyBzdXBwb3J0LgorICAgPz8/IFRoaXMgaXMgb2J2aW91c2x5IGluc3VmZmljaWVudGx5IGdlbmVyYWwuCisgICBJdCdzIHVzZWZ1bCBidXQgaXQgbmVlZHMgZWxhYm9yYXRpbmcgdXBvbi4gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhciBuYW1lOyAvKiBhY3R1YWxseSBhIFVOSVRfVFlQRSBlbnVtICovCisgIHVuc2lnbmVkIGNoYXIgaXNzdWU7CisgIHVuc2lnbmVkIGNoYXIgZG9uZTsKK30gVU5JVDsKKworI2lmbmRlZiBNQVhfVU5JVFMKKyNkZWZpbmUgTUFYX1VOSVRTIDEKKyNlbmRpZgorCit0eXBlZGVmIGludCAoTU9ERUxfRk4pIChzaW1fY3B1ICosIHZvaWQgKik7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogVGhpcyBpcyBhbiBpbnRlZ2VyIHRoYXQgaWRlbnRpZmllcyB0aGlzIGluc24uCisgICAgIEhvdyB0aGlzIHdvcmtzIGlzIHVwIHRvIHRoZSB0YXJnZXQuICAqLworICBpbnQgbnVtOworCisgIC8qIEZ1bmN0aW9uIHRvIGhhbmRsZSBpbnNuLXNwZWNpZmljIHByb2ZpbGluZy4gICovCisgIE1PREVMX0ZOICptb2RlbF9mbjsKKworICAvKiBBcnJheSBvZiBmdW5jdGlvbiB1bml0cyB1c2VkIGJ5IHRoaXMgaW5zbi4gICovCisgIFVOSVQgdW5pdHNbTUFYX1VOSVRTXTsKK30gSU5TTl9USU1JTkc7CisKKy8qIFN0cnVjdCB0byBkZXNjcmliZSB2YXJpb3VzIGltcGxlbWVudGF0aW9uIHByb3BlcnRpZXMgb2YgYSBjcHUuCisgICBXaGVuIG11bHRpcGxlIGNwdSB2YXJpYW50cyBhcmUgc3VwcG9ydGVkLCB0aGUgc2l6ZXMgb2Ygc29tZSBzdHJ1Y3RzCisgICBjYW4gdmFyeS4gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogVGhlIHNpemUgb2YgdGhlIFNJTV9DUFUgc3RydWN0LiAgKi8KKyAgaW50IHNpbV9jcHVfc2l6ZTsKKyNkZWZpbmUgSU1QX1BST1BTX1NJTV9DUFVfU0laRShjcHVfcHJvcHMpICgoY3B1X3Byb3BzKS0+c2ltX2NwdV9zaXplKQorICAvKiBBbiBTQ0FDSEUgZWxlbWVudCBjYW4gdmFyeSBpbiBzaXplLCBkZXBlbmRpbmcgb24gdGhlIHNlbGVjdGVkIGNwdS4KKyAgICAgVGhpcyBpcyB6ZXJvIGlmIHRoZSBTQ0FDSEUgaXNuJ3QgaW4gdXNlIGZvciB0aGlzIHZhcmlhbnQuICAqLworICBpbnQgc2NhY2hlX2VsbV9zaXplOworI2RlZmluZSBJTVBfUFJPUFNfU0NBQ0hFX0VMTV9TSVpFKGNwdV9wcm9wcykgKChjcHVfcHJvcHMpLT5zY2FjaGVfZWxtX3NpemUpCit9IE1BQ0hfSU1QX1BST1BFUlRJRVM7CisKKy8qIEEgbWFjaGluZSB2YXJpYW50LiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBjaGFyICpuYW1lOworI2RlZmluZSBNQUNIX05BTUUobSkgKChtKS0+bmFtZSkKKyAgLyogVGhpcyBpcyB0aGUgYXJndW1lbnQgdG8gYmZkX3NjYW5fYXJjaC4gICovCisgIGNvbnN0IGNoYXIgKmJmZF9uYW1lOworI2RlZmluZSBNQUNIX0JGRF9OQU1FKG0pICgobSktPmJmZF9uYW1lKQorICBpbnQgd29yZF9iaXRzaXplOworI2RlZmluZSBNQUNIX1dPUkRfQklUU0laRShtKSAoKG0pLT53b3JkX2JpdHNpemUpCisgIGludCBhZGRyX2JpdHNpemU7CisjZGVmaW5lIE1BQ0hfQUREUl9CSVRTSVpFKG0pICgobSktPmFkZHJfYml0c2l6ZSkKKworICAvKiBQb2ludGVyIHRvIG51bGwtZW50cnkgdGVybWluYXRlZCB0YWJsZSBvZiBtb2RlbHMgb2YgdGhpcyBtYWNoLgorICAgICBUaGUgZGVmYXVsdCBpcyB0aGUgZmlyc3Qgb25lLiAgKi8KKyAgY29uc3Qgc3RydWN0IG1vZGVsICptb2RlbHM7CisjZGVmaW5lIE1BQ0hfTU9ERUxTKG0pICgobSktPm1vZGVscykKKworICAvKiBQb2ludGVyIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoaXMgbWFjaC4gICovCisgIGNvbnN0IE1BQ0hfSU1QX1BST1BFUlRJRVMgKmltcF9wcm9wczsKKyNkZWZpbmUgTUFDSF9JTVBfUFJPUFMobSkgKChtKS0+aW1wX3Byb3BzKQorCisgIC8qIENhbGxlZCBieSBzaW1fbW9kZWxfc2V0IHdoZW4gdGhlIG1vZGVsIG9mIGEgY3B1IGlzIHNldC4gICovCisgIHZvaWQgKCogaW5pdF9jcHUpIChzaW1fY3B1ICopOworI2RlZmluZSBNQUNIX0lOSVRfQ1BVKG0pICgobSktPmluaXRfY3B1KQorCisgIC8qIEluaXRpYWxpemUgdGhlIHNpbXVsYXRvciBlbmdpbmUgZm9yIHRoaXMgY3B1LgorICAgICBVc2VkIGJ5IGNnZW4gc2ltdWxhdG9ycyB0byBpbml0aWFsaXplIHRoZSBpbnNuIGRlc2NyaXB0b3IgdGFibGUuICAqLworICB2b2lkICgqIHByZXBhcmVfcnVuKSAoc2ltX2NwdSAqKTsKKyNkZWZpbmUgTUFDSF9QUkVQQVJFX1JVTihtKSAoKG0pLT5wcmVwYXJlX3J1bikKK30gTUFDSDsKKworLyogQSBtb2RlbCAoaW1wbGVtZW50YXRpb24pIG9mIGEgbWFjaGluZS4gICovCisKK3R5cGVkZWYgc3RydWN0IG1vZGVsIHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyNkZWZpbmUgTU9ERUxfTkFNRShtKSAoKG0pLT5uYW1lKQorICBjb25zdCBNQUNIICptYWNoOworI2RlZmluZSBNT0RFTF9NQUNIKG0pICgobSktPm1hY2gpCisgIC8qIEFuIGVudW0gdGhhdCBkaXN0aW5ndWlzaGVkIHRoZSBtb2RlbC4gICovCisgIGludCBudW07CisjZGVmaW5lIE1PREVMX05VTShtKSAoKG0pLT5udW0pCisgIC8qIFBvaW50ZXIgdG8gdGltaW5nIHRhYmxlIGZvciB0aGlzIG1vZGVsLiAgKi8KKyAgY29uc3QgSU5TTl9USU1JTkcgKnRpbWluZzsKKyNkZWZpbmUgTU9ERUxfVElNSU5HKG0pICgobSktPnRpbWluZykKKyAgdm9pZCAoKiBpbml0KSAoc2ltX2NwdSAqKTsKKyNkZWZpbmUgTU9ERUxfSU5JVChtKSAoKG0pLT5pbml0KQorfSBNT0RFTDsKKworLyogVGFibGVzIG9mIHN1cHBvcnRlZCBtYWNoaW5lcy4gICovCisvKiA/Pz8gSW4gYSBzaW11bGF0b3Igb2YgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcywgd2lsbCBuZWVkIG11bHRpcGxlIGNvcGllcyBvZgorICAgdGhpcy4gIEhhdmUgYW4gYGFyY2hzJyBhcnJheSB0aGF0IGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgbWFjaHMgYXJyYXkKKyAgIGZvciBlYWNoICh3aGljaCBpbiB0dXJuIGhhcyBhIHBvaW50ZXIgdG8gdGhlIG1vZGVscyBhcnJheSBmb3IgZWFjaCkuICAqLworZXh0ZXJuIGNvbnN0IE1BQ0ggKnNpbV9tYWNoc1tdOworCisvKiBNb2RlbCBtb2R1bGUgaGFuZGxlcnMuICAqLworZXh0ZXJuIE1PRFVMRV9JTlNUQUxMX0ZOIHNpbV9tb2RlbF9pbnN0YWxsOworCisvKiBTdXBwb3J0IHJvdXRpbmVzLiAgKi8KK2V4dGVybiB2b2lkIHNpbV9tb2RlbF9zZXQgKFNJTV9ERVNDIHNkXywgc2ltX2NwdSAqY3B1XywgY29uc3QgTU9ERUwgKm1vZGVsXyk7CitleHRlcm4gY29uc3QgTU9ERUwgKiBzaW1fbW9kZWxfbG9va3VwIChjb25zdCBjaGFyICpuYW1lXyk7CitleHRlcm4gY29uc3QgTUFDSCAqIHNpbV9tYWNoX2xvb2t1cCAoY29uc3QgY2hhciAqbmFtZV8pOworZXh0ZXJuIGNvbnN0IE1BQ0ggKiBzaW1fbWFjaF9sb29rdXBfYmZkX25hbWUgKGNvbnN0IGNoYXIgKmJmZF9uYW1lXyk7CisKKyNlbmRpZiAvKiBTSU1fTU9ERUxfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tbW9kdWxlLmMgYi9zaW0vY29tbW9uL3NpbS1tb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWViMzJhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tbW9kdWxlLmMKQEAgLTAsMCArMSwzOTkgQEAKKy8qIE1vZHVsZSBzdXBwb3J0LgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAic2ltLWlvLmgiCisjaW5jbHVkZSAic2ltLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisKKyNpZiBXSVRIX0hXCisjaW5jbHVkZSAic2ltLWh3LmgiCisjZW5kaWYKKworI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorCisvKiBMaXN0IG9mIGFsbCBtb2R1bGVzLiAgKi8KK3N0YXRpYyBNT0RVTEVfSU5TVEFMTF9GTiAqIGNvbnN0IG1vZHVsZXNbXSA9IHsKKyAgc3RhbmRhcmRfaW5zdGFsbCwKKyAgc2ltX2V2ZW50c19pbnN0YWxsLAorI2lmZGVmIFNJTV9IQVZFX01PREVMCisgIHNpbV9tb2RlbF9pbnN0YWxsLAorI2VuZGlmCisjaWYgV0lUSF9FTkdJTkUKKyAgc2ltX2VuZ2luZV9pbnN0YWxsLAorI2VuZGlmCisjaWYgV0lUSF9UUkFDRQorICB0cmFjZV9pbnN0YWxsLAorI2VuZGlmCisjaWYgV0lUSF9QUk9GSUxFCisgIHByb2ZpbGVfaW5zdGFsbCwKKyNlbmRpZgorICBzaW1fY29yZV9pbnN0YWxsLAorI2lmbmRlZiBTSU1fSEFWRV9GTEFUTUVNCisgIC8qIEZJWE1FOiBzaG91bGQgaGFuZGxlIGZsYXRtZW0gYXMgd2VsbCBGTEFUTUVNICovCisgIHNpbV9tZW1vcHRfaW5zdGFsbCwKKyNlbmRpZgorI2lmIFdJVEhfV0FUQ0hQT0lOVFMKKyAgc2ltX3dhdGNocG9pbnRfaW5zdGFsbCwKKyNlbmRpZgorI2lmIFdJVEhfU0NBQ0hFCisgIHNjYWNoZV9pbnN0YWxsLAorI2VuZGlmCisjaWZkZWYgU0lNX0hBVkVfQlJFQUtQT0lOVFMKKyAgc2ltX2JyZWFrX2luc3RhbGwsCisjZW5kaWYKKyNpZiBXSVRIX0hXCisgIHNpbV9od19pbnN0YWxsLAorI2VuZGlmCisgIC8qIENvbmZpZ3VyZWQgaW4gW3NpbXVsYXRvciBzcGVjaWZpY10gYWRkaXRpb25hbCBtb2R1bGVzLiAgKi8KKyNpZmRlZiBNT0RVTEVfTElTVAorICBNT0RVTEVfTElTVAorI2VuZGlmCisgIDAKK307CisMCisvKiBGdW5jdGlvbnMgY2FsbGVkIGZyb20gc2ltX29wZW4uICAqLworCisvKiBJbml0aWFsaXplIGNvbW1vbiBwYXJ0cyBiZWZvcmUgYXJndW1lbnQgcHJvY2Vzc2luZy4gICovCisKK1NJTV9SQworc2ltX3ByZV9hcmd2X2luaXQgKFNJTV9ERVNDIHNkLCBjb25zdCBjaGFyICpteW5hbWUpCit7CisgIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7CisgIFNJTV9BU1NFUlQgKFNUQVRFX01PRFVMRVMgKHNkKSA9PSBOVUxMKTsKKworICBTVEFURV9NWV9OQU1FIChzZCkgPSBteW5hbWUgKyBzdHJsZW4gKG15bmFtZSk7CisgIHdoaWxlIChTVEFURV9NWV9OQU1FIChzZCkgPiBteW5hbWUgJiYgU1RBVEVfTVlfTkFNRSAoc2QpWy0xXSAhPSAnLycpCisgICAgLS1TVEFURV9NWV9OQU1FIChzZCk7CisKKyAgLyogU2V0IHRoZSBjcHUgbmFtZXMgdG8gZGVmYXVsdCB2YWx1ZXMuICAqLworICB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2kpCisgICAgICB7CisJY2hhciAqbmFtZTsKKwlhc3ByaW50ZiAoJm5hbWUsICJjcHUlZCIsIGkpOworCUNQVV9OQU1FIChTVEFURV9DUFUgKHNkLCBpKSkgPSBuYW1lOworICAgICAgfQorICB9CisKKyAgc2ltX2NvbmZpZ19kZWZhdWx0IChzZCk7CisKKyAgLyogSW5zdGFsbCBhbGwgY29uZmlndXJlZCBpbiBtb2R1bGVzLiAgKi8KKyAgaWYgKHNpbV9tb2R1bGVfaW5zdGFsbCAoc2QpICE9IFNJTV9SQ19PSykKKyAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworLyogSW5pdGlhbGl6ZSBjb21tb24gcGFydHMgYWZ0ZXIgYXJndW1lbnQgcHJvY2Vzc2luZy4gICovCisKK1NJTV9SQworc2ltX3Bvc3RfYXJndl9pbml0IChTSU1fREVTQyBzZCkKK3sKKyAgaW50IGk7CisgIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7CisgIFNJTV9BU1NFUlQgKFNUQVRFX01PRFVMRVMgKHNkKSAhPSBOVUxMKTsKKworICAvKiBTZXQgdGhlIGNwdS0+c3RhdGUgYmFja2xpbmtzIGZvciBlYWNoIGNwdS4gICovCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytpKQorICAgIHsKKyAgICAgIENQVV9TVEFURSAoU1RBVEVfQ1BVIChzZCwgaSkpID0gc2Q7CisgICAgICBDUFVfSU5ERVggKFNUQVRFX0NQVSAoc2QsIGkpKSA9IGk7CisgICAgfQorCisgIGlmIChzaW1fbW9kdWxlX2luaXQgKHNkKSAhPSBTSU1fUkNfT0spCisgICAgcmV0dXJuIFNJTV9SQ19GQUlMOworCisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisMCisvKiBJbnN0YWxsIGFsbCBtb2R1bGVzLgorICAgSWYgdGhpcyBmYWlscywgbm8gbW9kdWxlcyBhcmUgbGVmdCBpbnN0YWxsZWQuICAqLworCitTSU1fUkMKK3NpbV9tb2R1bGVfaW5zdGFsbCAoU0lNX0RFU0Mgc2QpCit7CisgIE1PRFVMRV9JTlNUQUxMX0ZOICogY29uc3QgKm1vZHA7CisKKyAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKKyAgU0lNX0FTU0VSVCAoU1RBVEVfTU9EVUxFUyAoc2QpID09IE5VTEwpOworCisgIFNUQVRFX01PRFVMRVMgKHNkKSA9IFpBTExPQyAoc3RydWN0IG1vZHVsZV9saXN0KTsKKyAgZm9yIChtb2RwID0gbW9kdWxlczsgKm1vZHAgIT0gTlVMTDsgKyttb2RwKQorICAgIHsKKyAgICAgIGlmICgoKm1vZHApIChzZCkgIT0gU0lNX1JDX09LKQorCXsKKwkgIHNpbV9tb2R1bGVfdW5pbnN0YWxsIChzZCk7CisJICBTSU1fQVNTRVJUIChTVEFURV9NT0RVTEVTIChzZCkgPT0gTlVMTCk7CisJICByZXR1cm4gU0lNX1JDX0ZBSUw7CisJfQorICAgIH0KKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworLyogQ2FsbGVkIGFmdGVyIGFsbCBtb2R1bGVzIGhhdmUgYmVlbiBpbnN0YWxsZWQgYW5kIGFmdGVyIGFyZ3YKKyAgIGhhcyBiZWVuIHByb2Nlc3NlZC4gICovCisKK1NJTV9SQworc2ltX21vZHVsZV9pbml0IChTSU1fREVTQyBzZCkKK3sKKyAgc3RydWN0IG1vZHVsZV9saXN0ICptb2R1bGVzID0gU1RBVEVfTU9EVUxFUyAoc2QpOworICBNT0RVTEVfSU5JVF9MSVNUICptb2RwOworCisgIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7CisgIFNJTV9BU1NFUlQgKFNUQVRFX01PRFVMRVMgKHNkKSAhPSBOVUxMKTsKKworICBmb3IgKG1vZHAgPSBtb2R1bGVzLT5pbml0X2xpc3Q7IG1vZHAgIT0gTlVMTDsgbW9kcCA9IG1vZHAtPm5leHQpCisgICAgeworICAgICAgaWYgKCgqbW9kcC0+Zm4pIChzZCkgIT0gU0lNX1JDX09LKQorCXJldHVybiBTSU1fUkNfRkFJTDsKKyAgICB9CisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKKy8qIENhbGxlZCB3aGVuIGV2ZXIgdGhlIHNpbXVsYXRvciBpcyByZXN1bWVkICovCisKK1NJTV9SQworc2ltX21vZHVsZV9yZXN1bWUgKFNJTV9ERVNDIHNkKQoreworICBzdHJ1Y3QgbW9kdWxlX2xpc3QgKm1vZHVsZXMgPSBTVEFURV9NT0RVTEVTIChzZCk7CisgIE1PRFVMRV9SRVNVTUVfTElTVCAqbW9kcDsKKworICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworICBTSU1fQVNTRVJUIChTVEFURV9NT0RVTEVTIChzZCkgIT0gTlVMTCk7CisKKyAgZm9yIChtb2RwID0gbW9kdWxlcy0+cmVzdW1lX2xpc3Q7IG1vZHAgIT0gTlVMTDsgbW9kcCA9IG1vZHAtPm5leHQpCisgICAgeworICAgICAgaWYgKCgqbW9kcC0+Zm4pIChzZCkgIT0gU0lNX1JDX09LKQorCXJldHVybiBTSU1fUkNfRkFJTDsKKyAgICB9CisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKKy8qIENhbGxlZCB3aGVuIGV2ZXIgdGhlIHNpbXVsYXRvciBpcyBzdXNwZW5kZWQgKi8KKworU0lNX1JDCitzaW1fbW9kdWxlX3N1c3BlbmQgKFNJTV9ERVNDIHNkKQoreworICBzdHJ1Y3QgbW9kdWxlX2xpc3QgKm1vZHVsZXMgPSBTVEFURV9NT0RVTEVTIChzZCk7CisgIE1PRFVMRV9TVVNQRU5EX0xJU1QgKm1vZHA7CisKKyAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKKyAgU0lNX0FTU0VSVCAoU1RBVEVfTU9EVUxFUyAoc2QpICE9IE5VTEwpOworCisgIGZvciAobW9kcCA9IG1vZHVsZXMtPnN1c3BlbmRfbGlzdDsgbW9kcCAhPSBOVUxMOyBtb2RwID0gbW9kcC0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoKCptb2RwLT5mbikgKHNkKSAhPSBTSU1fUkNfT0spCisJcmV0dXJuIFNJTV9SQ19GQUlMOworICAgIH0KKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworLyogVW5pbnN0YWxsIGluc3RhbGxlZCBtb2R1bGVzLCBjYWxsZWQgYnkgc2ltX2Nsb3NlLiAgKi8KKwordm9pZAorc2ltX21vZHVsZV91bmluc3RhbGwgKFNJTV9ERVNDIHNkKQoreworICBzdHJ1Y3QgbW9kdWxlX2xpc3QgKm1vZHVsZXMgPSBTVEFURV9NT0RVTEVTIChzZCk7CisgIE1PRFVMRV9VTklOU1RBTExfTElTVCAqbW9kcDsKKworICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworICBTSU1fQVNTRVJUIChTVEFURV9NT0RVTEVTIChzZCkgIT0gTlVMTCk7CisKKyAgLyogVW5pbnN0YWxsIHRoZSBtb2R1bGVzLiAgKi8KKyAgZm9yIChtb2RwID0gbW9kdWxlcy0+dW5pbnN0YWxsX2xpc3Q7IG1vZHAgIT0gTlVMTDsgbW9kcCA9IG1vZHAtPm5leHQpCisgICAgKCptb2RwLT5mbikgKHNkKTsKKworICAvKiBjbGVhbi11cCBpbml0IGxpc3QgKi8KKyAgeworICAgIE1PRFVMRV9JTklUX0xJU1QgKm4sICpkOworICAgIGZvciAoZCA9IG1vZHVsZXMtPmluaXRfbGlzdDsgZCAhPSBOVUxMOyBkID0gbikKKyAgICAgIHsKKwluID0gZC0+bmV4dDsKKwl6ZnJlZSAoZCk7CisgICAgICB9CisgIH0KKworICAvKiBjbGVhbi11cCByZXN1bWUgbGlzdCAqLworICB7CisgICAgTU9EVUxFX1JFU1VNRV9MSVNUICpuLCAqZDsKKyAgICBmb3IgKGQgPSBtb2R1bGVzLT5yZXN1bWVfbGlzdDsgZCAhPSBOVUxMOyBkID0gbikKKyAgICAgIHsKKwluID0gZC0+bmV4dDsKKwl6ZnJlZSAoZCk7CisgICAgICB9CisgIH0KKworICAvKiBjbGVhbi11cCBzdXNwZW5kIGxpc3QgKi8KKyAgeworICAgIE1PRFVMRV9TVVNQRU5EX0xJU1QgKm4sICpkOworICAgIGZvciAoZCA9IG1vZHVsZXMtPnN1c3BlbmRfbGlzdDsgZCAhPSBOVUxMOyBkID0gbikKKyAgICAgIHsKKwluID0gZC0+bmV4dDsKKwl6ZnJlZSAoZCk7CisgICAgICB9CisgIH0KKworICAvKiBjbGVhbi11cCB1bmluc3RhbGwgbGlzdCAqLworICB7CisgICAgTU9EVUxFX1VOSU5TVEFMTF9MSVNUICpuLCAqZDsKKyAgICBmb3IgKGQgPSBtb2R1bGVzLT51bmluc3RhbGxfbGlzdDsgZCAhPSBOVUxMOyBkID0gbikKKyAgICAgIHsKKwluID0gZC0+bmV4dDsKKwl6ZnJlZSAoZCk7CisgICAgICB9CisgIH0KKworICAvKiBjbGVhbi11cCBpbmZvIGxpc3QgKi8KKyAgeworICAgIE1PRFVMRV9JTkZPX0xJU1QgKm4sICpkOworICAgIGZvciAoZCA9IG1vZHVsZXMtPmluZm9fbGlzdDsgZCAhPSBOVUxMOyBkID0gbikKKyAgICAgIHsKKwluID0gZC0+bmV4dDsKKwl6ZnJlZSAoZCk7CisgICAgICB9CisgIH0KKworICB6ZnJlZSAobW9kdWxlcyk7CisgIFNUQVRFX01PRFVMRVMgKHNkKSA9IE5VTEw7Cit9CisKKy8qIENhbGxlZCB3aGVuIGV2ZXIgc2ltdWxhdG9yIGluZm8gaXMgbmVlZGVkICovCisKK3ZvaWQKK3NpbV9tb2R1bGVfaW5mbyAoU0lNX0RFU0Mgc2QsIGludCB2ZXJib3NlKQoreworICBzdHJ1Y3QgbW9kdWxlX2xpc3QgKm1vZHVsZXMgPSBTVEFURV9NT0RVTEVTIChzZCk7CisgIE1PRFVMRV9JTkZPX0xJU1QgKm1vZHA7CisKKyAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKKyAgU0lNX0FTU0VSVCAoU1RBVEVfTU9EVUxFUyAoc2QpICE9IE5VTEwpOworCisgIGZvciAobW9kcCA9IG1vZHVsZXMtPmluZm9fbGlzdDsgbW9kcCAhPSBOVUxMOyBtb2RwID0gbW9kcC0+bmV4dCkKKyAgICB7CisgICAgICAoKm1vZHAtPmZuKSAoc2QsIHZlcmJvc2UpOworICAgIH0KK30KKwwKKy8qIEFkZCBGTiB0byB0aGUgaW5pdCBoYW5kbGVyIGxpc3QuCisgICBpbml0IGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBpbnN0YWxsLiAqLworCit2b2lkCitzaW1fbW9kdWxlX2FkZF9pbml0X2ZuIChTSU1fREVTQyBzZCwgTU9EVUxFX0lOSVRfRk4gZm4pCit7CisgIHN0cnVjdCBtb2R1bGVfbGlzdCAqbW9kdWxlcyA9IFNUQVRFX01PRFVMRVMgKHNkKTsKKyAgTU9EVUxFX0lOSVRfTElTVCAqbCA9IFpBTExPQyAoTU9EVUxFX0lOSVRfTElTVCk7CisgIE1PRFVMRV9JTklUX0xJU1QgKipsYXN0OworCisgIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7CisgIFNJTV9BU1NFUlQgKFNUQVRFX01PRFVMRVMgKHNkKSAhPSBOVUxMKTsKKworICBsYXN0ID0gJm1vZHVsZXMtPmluaXRfbGlzdDsKKyAgd2hpbGUgKCpsYXN0ICE9IE5VTEwpCisgICAgbGFzdCA9ICYoKCpsYXN0KS0+bmV4dCk7CisKKyAgbC0+Zm4gPSBmbjsKKyAgbC0+bmV4dCA9IE5VTEw7CisgICpsYXN0ID0gbDsKK30KKworLyogQWRkIEZOIHRvIHRoZSByZXN1bWUgaGFuZGxlciBsaXN0LgorICAgcmVzdW1lIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBpbnN0YWxsLiAqLworCit2b2lkCitzaW1fbW9kdWxlX2FkZF9yZXN1bWVfZm4gKFNJTV9ERVNDIHNkLCBNT0RVTEVfUkVTVU1FX0ZOIGZuKQoreworICBzdHJ1Y3QgbW9kdWxlX2xpc3QgKm1vZHVsZXMgPSBTVEFURV9NT0RVTEVTIChzZCk7CisgIE1PRFVMRV9SRVNVTUVfTElTVCAqbCA9IFpBTExPQyAoTU9EVUxFX1JFU1VNRV9MSVNUKTsKKyAgTU9EVUxFX1JFU1VNRV9MSVNUICoqbGFzdDsKKworICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworICBTSU1fQVNTRVJUIChTVEFURV9NT0RVTEVTIChzZCkgIT0gTlVMTCk7CisKKyAgbGFzdCA9ICZtb2R1bGVzLT5yZXN1bWVfbGlzdDsKKyAgd2hpbGUgKCpsYXN0ICE9IE5VTEwpCisgICAgbGFzdCA9ICYoKCpsYXN0KS0+bmV4dCk7CisKKyAgbC0+Zm4gPSBmbjsKKyAgbC0+bmV4dCA9IE5VTEw7CisgICpsYXN0ID0gbDsKK30KKworLyogQWRkIEZOIHRvIHRoZSBpbml0IGhhbmRsZXIgbGlzdC4KKyAgIHN1c3BlbmQgaW4gdGhlIHJldmVyc2Ugb3JkZXIgdG8gaW5zdGFsbC4gKi8KKwordm9pZAorc2ltX21vZHVsZV9hZGRfc3VzcGVuZF9mbiAoU0lNX0RFU0Mgc2QsIE1PRFVMRV9TVVNQRU5EX0ZOIGZuKQoreworICBzdHJ1Y3QgbW9kdWxlX2xpc3QgKm1vZHVsZXMgPSBTVEFURV9NT0RVTEVTIChzZCk7CisgIE1PRFVMRV9TVVNQRU5EX0xJU1QgKmwgPSBaQUxMT0MgKE1PRFVMRV9TVVNQRU5EX0xJU1QpOworICBNT0RVTEVfU1VTUEVORF9MSVNUICoqbGFzdDsKKworICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworICBTSU1fQVNTRVJUIChTVEFURV9NT0RVTEVTIChzZCkgIT0gTlVMTCk7CisKKyAgbGFzdCA9ICZtb2R1bGVzLT5zdXNwZW5kX2xpc3Q7CisgIHdoaWxlICgqbGFzdCAhPSBOVUxMKQorICAgIGxhc3QgPSAmKCgqbGFzdCktPm5leHQpOworCisgIGwtPmZuID0gZm47CisgIGwtPm5leHQgPSBtb2R1bGVzLT5zdXNwZW5kX2xpc3Q7CisgIG1vZHVsZXMtPnN1c3BlbmRfbGlzdCA9IGw7Cit9CisKKy8qIEFkZCBGTiB0byB0aGUgdW5pbnN0YWxsIGhhbmRsZXIgbGlzdC4KKyAgIFVuaW5zdGFsbCBpbiByZXZlcnNlIG9yZGVyIHRvIGluc3RhbGwuICAqLworCit2b2lkCitzaW1fbW9kdWxlX2FkZF91bmluc3RhbGxfZm4gKFNJTV9ERVNDIHNkLCBNT0RVTEVfVU5JTlNUQUxMX0ZOIGZuKQoreworICBzdHJ1Y3QgbW9kdWxlX2xpc3QgKm1vZHVsZXMgPSBTVEFURV9NT0RVTEVTIChzZCk7CisgIE1PRFVMRV9VTklOU1RBTExfTElTVCAqbCA9IFpBTExPQyAoTU9EVUxFX1VOSU5TVEFMTF9MSVNUKTsKKworICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworICBTSU1fQVNTRVJUIChTVEFURV9NT0RVTEVTIChzZCkgIT0gTlVMTCk7CisKKyAgbC0+Zm4gPSBmbjsKKyAgbC0+bmV4dCA9IG1vZHVsZXMtPnVuaW5zdGFsbF9saXN0OworICBtb2R1bGVzLT51bmluc3RhbGxfbGlzdCA9IGw7Cit9CisKKy8qIEFkZCBGTiB0byB0aGUgaW5mbyBoYW5kbGVyIGxpc3QuCisgICBSZXBvcnQgaW5mbyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgaW5zdGFsbC4gKi8KKwordm9pZAorc2ltX21vZHVsZV9hZGRfaW5mb19mbiAoU0lNX0RFU0Mgc2QsIE1PRFVMRV9JTkZPX0ZOIGZuKQoreworICBzdHJ1Y3QgbW9kdWxlX2xpc3QgKm1vZHVsZXMgPSBTVEFURV9NT0RVTEVTIChzZCk7CisgIE1PRFVMRV9JTkZPX0xJU1QgKmwgPSBaQUxMT0MgKE1PRFVMRV9JTkZPX0xJU1QpOworICBNT0RVTEVfSU5GT19MSVNUICoqbGFzdDsKKworICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworICBTSU1fQVNTRVJUIChTVEFURV9NT0RVTEVTIChzZCkgIT0gTlVMTCk7CisKKyAgbGFzdCA9ICZtb2R1bGVzLT5pbmZvX2xpc3Q7CisgIHdoaWxlICgqbGFzdCAhPSBOVUxMKQorICAgIGxhc3QgPSAmKCgqbGFzdCktPm5leHQpOworCisgIGwtPmZuID0gZm47CisgIGwtPm5leHQgPSBOVUxMOworICAqbGFzdCA9IGw7Cit9CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1tb2R1bGUuaCBiL3NpbS9jb21tb24vc2ltLW1vZHVsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYmEzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS1tb2R1bGUuaApAQCAtMCwwICsxLDEyNSBAQAorLyogTW9kdWxlIHN1cHBvcnQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgYnkgc2ltLWJhc2UuaC4gICovCisKKyNpZm5kZWYgU0lNX01PRFVMRVNfSAorI2RlZmluZSBTSU1fTU9EVUxFU19ICisKKy8qIE1vZHVsZXMgYXJlIGFkZG9ucyB0byB0aGUgc2ltdWxhdG9yIHRoYXQgcGVyZm9ybSBhIHNwZWNpZmljIGZ1bmN0aW9uCisgICAoZS5nLiB0cmFjaW5nLCBwcm9maWxpbmcsIG1lbW9yeSBzdWJzeXN0ZW0sIGV0Yy4pLiAgU29tZSBtb2R1bGVzIGFyZQorICAgYnVpbHRpbiwgYW5kIG90aGVycyBhcmUgYWRkZWQgYXQgY29uZmlndXJlIHRpbWUuICBUaGUgaW50ZW50IGlzIHRvCisgICBwcm92aWRlIGEgdW5pZm9ybSBmcmFtZXdvcmsgZm9yIGFsbCBvZiB0aGUgcGllY2VzIHRoYXQgbWFrZSB1cCB0aGUKKyAgIHNpbXVsYXRvci4KKworICAgVE9ETzogQWRkIGZhY2lsaXRpZXMgZm9yIHNhdmluZy9yZXN0b3Jpbmcgc3RhdGUgdG8vZnJvbSBhIGZpbGUuICAqLworCisKKy8qIFZhcmlvdXMgZnVuY3Rpb24gdHlwZXMuICAqLworCit0eXBlZGVmIFNJTV9SQyAoTU9EVUxFX0lOU1RBTExfRk4pIChTSU1fREVTQyk7Cit0eXBlZGVmIFNJTV9SQyAoTU9EVUxFX0lOSVRfRk4pIChTSU1fREVTQyk7Cit0eXBlZGVmIFNJTV9SQyAoTU9EVUxFX1JFU1VNRV9GTikgKFNJTV9ERVNDKTsKK3R5cGVkZWYgU0lNX1JDIChNT0RVTEVfU1VTUEVORF9GTikgKFNJTV9ERVNDKTsKK3R5cGVkZWYgdm9pZCAgIChNT0RVTEVfVU5JTlNUQUxMX0ZOKSAoU0lNX0RFU0MpOwordHlwZWRlZiB2b2lkICAgKE1PRFVMRV9JTkZPX0ZOKSAoU0lNX0RFU0MsIGludCk7CisKKworLyogTGlzdHMgb2YgaW5zdGFsbGVkIGhhbmRsZXJzLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbW9kdWxlX2luaXRfbGlzdCB7CisgIHN0cnVjdCBtb2R1bGVfaW5pdF9saXN0ICpuZXh0OworICBNT0RVTEVfSU5JVF9GTiAqZm47Cit9IE1PRFVMRV9JTklUX0xJU1Q7CisKK3R5cGVkZWYgc3RydWN0IG1vZHVsZV9yZXN1bWVfbGlzdCB7CisgIHN0cnVjdCBtb2R1bGVfcmVzdW1lX2xpc3QgKm5leHQ7CisgIE1PRFVMRV9SRVNVTUVfRk4gKmZuOworfSBNT0RVTEVfUkVTVU1FX0xJU1Q7CisKK3R5cGVkZWYgc3RydWN0IG1vZHVsZV9zdXNwZW5kX2xpc3QgeworICBzdHJ1Y3QgbW9kdWxlX3N1c3BlbmRfbGlzdCAqbmV4dDsKKyAgTU9EVUxFX1NVU1BFTkRfRk4gKmZuOworfSBNT0RVTEVfU1VTUEVORF9MSVNUOworCit0eXBlZGVmIHN0cnVjdCBtb2R1bGVfdW5pbnN0YWxsX2xpc3QgeworICBzdHJ1Y3QgbW9kdWxlX3VuaW5zdGFsbF9saXN0ICpuZXh0OworICBNT0RVTEVfVU5JTlNUQUxMX0ZOICpmbjsKK30gTU9EVUxFX1VOSU5TVEFMTF9MSVNUOworCit0eXBlZGVmIHN0cnVjdCBtb2R1bGVfaW5mb19saXN0IHsKKyAgc3RydWN0IG1vZHVsZV9pbmZvX2xpc3QgKm5leHQ7CisgIE1PRFVMRV9JTkZPX0ZOICpmbjsKK30gTU9EVUxFX0lORk9fTElTVDsKKworCisvKiBGdW5jdGlvbnMgdG8gcmVnaXN0ZXIgbW9kdWxlIHdpdGggdmFyaW91cyBoYW5kbGVyIGxpc3RzICovCisKK1NJTV9SQyBzaW1fbW9kdWxlX2luc3RhbGwgKFNJTV9ERVNDKTsKK3ZvaWQgc2ltX21vZHVsZV91bmluc3RhbGwgKFNJTV9ERVNDKTsKK3ZvaWQgc2ltX21vZHVsZV9hZGRfaW5pdF9mbiAoU0lNX0RFU0Mgc2QsIE1PRFVMRV9JTklUX0ZOIGZuKTsKK3ZvaWQgc2ltX21vZHVsZV9hZGRfcmVzdW1lX2ZuIChTSU1fREVTQyBzZCwgTU9EVUxFX1JFU1VNRV9GTiBmbik7Cit2b2lkIHNpbV9tb2R1bGVfYWRkX3N1c3BlbmRfZm4gKFNJTV9ERVNDIHNkLCBNT0RVTEVfU1VTUEVORF9GTiBmbik7Cit2b2lkIHNpbV9tb2R1bGVfYWRkX3VuaW5zdGFsbF9mbiAoU0lNX0RFU0Mgc2QsIE1PRFVMRV9VTklOU1RBTExfRk4gZm4pOwordm9pZCBzaW1fbW9kdWxlX2FkZF9pbmZvX2ZuIChTSU1fREVTQyBzZCwgTU9EVUxFX0lORk9fRk4gZm4pOworCisKKy8qIEluaXRpYWxpemUgaW5zdGFsbGVkIG1vZHVsZXMgYmVmb3JlIGFyZ3VtZW50IHByb2Nlc3NpbmcuCisgICBDYWxsZWQgYnkgc2ltX29wZW4uICAqLworU0lNX1JDIHNpbV9wcmVfYXJndl9pbml0IChTSU1fREVTQyBzZCwgY29uc3QgY2hhciAqbXluYW1lKTsKKworLyogSW5pdGlhbGl6ZSBpbnN0YWxsZWQgbW9kdWxlcyBhZnRlciBhcmd1bWVudCBwcm9jZXNzaW5nLgorICAgQ2FsbGVkIGJ5IHNpbV9vcGVuLiAgKi8KK1NJTV9SQyBzaW1fcG9zdF9hcmd2X2luaXQgKFNJTV9ERVNDIHNkKTsKKworLyogUmUtaW5pdGlhbGl6ZSB0aGUgbW9kdWxlLiAgQ2FsbGVkIGJ5IHNpbV9jcmVhdGVfaW5mZXJpb3IuICovCitTSU1fUkMgc2ltX21vZHVsZV9pbml0IChTSU1fREVTQyBzZCk7CisKKy8qIFN1c3BlbmQvcmVzdW1lIG1vZHVsZXMuICBDYWxsZWQgYnkgc2ltX3J1biBvciBzaW1fcmVzdW1lICovCitTSU1fUkMgc2ltX21vZHVsZV9zdXNwZW5kIChTSU1fREVTQyBzZCk7CitTSU1fUkMgc2ltX21vZHVsZV9yZXN1bWUgKFNJTV9ERVNDIHNkKTsKKworLyogUmVwb3J0IGdlbmVyYWwgaW5mb3JtYXRpb24gb24gbW9kdWxlICovCit2b2lkIHNpbV9tb2R1bGVfaW5mbyAoU0lNX0RFU0Mgc2QsIGludCB2ZXJib3NlKTsKKworCisvKiBNb2R1bGUgcHJpdmF0ZSBkYXRhICovCisKK3N0cnVjdCBtb2R1bGVfbGlzdCB7CisKKyAgLyogTGlzdCBvZiBpbnN0YWxsZWQgbW9kdWxlIGBpbml0JyBoYW5kbGVycyAqLworICBNT0RVTEVfSU5JVF9MSVNUICppbml0X2xpc3Q7CisKKyAgLyogTGlzdCBvZiBpbnN0YWxsZWQgbW9kdWxlIGB1bmluc3RhbGwnIGhhbmRsZXJzLiAgKi8KKyAgTU9EVUxFX1VOSU5TVEFMTF9MSVNUICp1bmluc3RhbGxfbGlzdDsKKworICAvKiBMaXN0IG9mIGluc3RhbGxlZCBtb2R1bGUgYHJlc3VtZScgaGFuZGxlcnMuICAqLworICBNT0RVTEVfUkVTVU1FX0xJU1QgKnJlc3VtZV9saXN0OworCisgIC8qIExpc3Qgb2YgaW5zdGFsbGVkIG1vZHVsZSBgc3VzcGVuZCcgaGFuZGxlcnMuICAqLworICBNT0RVTEVfU1VTUEVORF9MSVNUICpzdXNwZW5kX2xpc3Q7CisKKyAgLyogTGlzdCBvZiBpbnN0YWxsZWQgbW9kdWxlIGBpbmZvJyBoYW5kbGVycy4gICovCisgIE1PRFVMRV9JTkZPX0xJU1QgKmluZm9fbGlzdDsKKworfTsKKworCisjZW5kaWYgLyogU0lNX01PRFVMRVNfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tbi1iaXRzLmggYi9zaW0vY29tbW9uL3NpbS1uLWJpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzE1N2ZmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tbi1iaXRzLmgKQEAgLTAsMCArMSwyMTggQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisgICAgQ29weXJpZ2h0IChDKSAxOTk3LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBOCisjZXJyb3IgIk4gbXVzdCBiZSAjZGVmaW5lZCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3ltY2F0LmgiCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSAmJiBkZWZpbmVkKHNpZ25lZCkKKy8qIElmIHNpZ25lZCB3ZXJlIGRlZmluZWQgdG8gYmUgc2F5IF9fc2lnbmVkIChpZSwgc29tZSB2ZXJzaW9ucyBvZiBMaW51eCksCisgICB0aGVuIHRoZSBzaWduZWROIG1hY3JvIHdvdWxkIG5vdCB3b3JrIGNvcnJlY3RseS4gIElmIHdlIGhhdmUgYSBzdGFuZGFyZAorICAgY29tcGlsZXIsIHdlIGhhdmUgc2lnbmVkLiAgKi8KKyN1bmRlZiBzaWduZWQKKyNlbmRpZgorCisvKiBOT1RFOiBTZWUgZW5kIG9mIGZpbGUgZm9yICN1bmRlZiAqLworI2RlZmluZSB1bnNpZ25lZE4gWENPTkNBVDIodW5zaWduZWQsTikKKyNkZWZpbmUgc2lnbmVkTiBYQ09OQ0FUMihzaWduZWQsTikKKyNkZWZpbmUgTFNNQVNLbiBYQ09OQ0FUMihMU01BU0ssTikKKyNkZWZpbmUgTVNNQVNLbiBYQ09OQ0FUMihNU01BU0ssTikKKyNkZWZpbmUgTFNNQVNLRURuIFhDT05DQVQyKExTTUFTS0VELE4pCisjZGVmaW5lIE1TTUFTS0VEbiBYQ09OQ0FUMihNU01BU0tFRCxOKQorI2RlZmluZSBMU0VYVFJBQ1RFRG4gWENPTkNBVDIoTFNFWFRSQUNURUQsTikKKyNkZWZpbmUgTVNFWFRSQUNURURuIFhDT05DQVQyKE1TRVhUUkFDVEVELE4pCisjZGVmaW5lIExTSU5TRVJURURuIFhDT05DQVQyKExTSU5TRVJURUQsTikKKyNkZWZpbmUgTVNJTlNFUlRFRG4gWENPTkNBVDIoTVNJTlNFUlRFRCxOKQorI2RlZmluZSBST1RuIFhDT05DQVQyKFJPVCxOKQorI2RlZmluZSBST1RMbiBYQ09OQ0FUMihST1RMLE4pCisjZGVmaW5lIFJPVFJuIFhDT05DQVQyKFJPVFIsTikKKyNkZWZpbmUgTVNTRVhUbiBYQ09OQ0FUMihNU1NFWFQsTikKKyNkZWZpbmUgTFNTRVhUbiBYQ09OQ0FUMihMU1NFWFQsTikKKworLyogVEFHUzogTFNNQVNLRUQxNiBMU01BU0tFRDMyIExTTUFTS0VENjQgKi8KKworSU5MSU5FX1NJTV9CSVRTXAorKHVuc2lnbmVkTikKK0xTTUFTS0VEbiAodW5zaWduZWROIHdvcmQsCisJICAgaW50IHN0YXJ0LAorCSAgIGludCBzdG9wKQoreworICB3b3JkICY9IExTTUFTS24gKHN0YXJ0LCBzdG9wKTsKKyAgcmV0dXJuIHdvcmQ7Cit9CisKKy8qIFRBR1M6IE1TTUFTS0VEMTYgTVNNQVNLRUQzMiBNU01BU0tFRDY0ICovCisKK0lOTElORV9TSU1fQklUU1wKKyh1bnNpZ25lZE4pCitNU01BU0tFRG4gKHVuc2lnbmVkTiB3b3JkLAorCSAgIGludCBzdGFydCwKKwkgICBpbnQgc3RvcCkKK3sKKyAgd29yZCAmPSBNU01BU0tuIChzdGFydCwgc3RvcCk7CisgIHJldHVybiB3b3JkOworfQorCisvKiBUQUdTOiBMU0VYVFJBQ1RFRDE2IExTRVhUUkFDVEVEMzIgTFNFWFRSQUNURUQ2NCAqLworCitJTkxJTkVfU0lNX0JJVFNcCisodW5zaWduZWROKQorTFNFWFRSQUNURURuICh1bnNpZ25lZE4gdmFsLAorCSAgICAgIGludCBzdGFydCwKKwkgICAgICBpbnQgc3RvcCkKK3sKKyAgdmFsIDw8PSAoTiAtIDEgLSBzdGFydCk7IC8qIGRyb3AgaGlnaCBiaXRzICovCisgIHZhbCA+Pj0gKE4gLSAxIC0gc3RhcnQpICsgKHN0b3ApOyAvKiBkcm9wIGxvdyBiaXRzICovCisgIHJldHVybiB2YWw7Cit9CisKKy8qIFRBR1M6IE1TRVhUUkFDVEVEMTYgTVNFWFRSQUNURUQzMiBNU0VYVFJBQ1RFRDY0ICovCisKK0lOTElORV9TSU1fQklUU1wKKyh1bnNpZ25lZE4pCitNU0VYVFJBQ1RFRG4gKHVuc2lnbmVkTiB2YWwsCisJICAgICAgaW50IHN0YXJ0LAorCSAgICAgIGludCBzdG9wKQoreworICB2YWwgPDw9IChzdGFydCk7IC8qIGRyb3AgaGlnaCBiaXRzICovCisgIHZhbCA+Pj0gKHN0YXJ0KSArIChOIC0gMSAtIHN0b3ApOyAvKiBkcm9wIGxvdyBiaXRzICovCisgIHJldHVybiB2YWw7Cit9CisKKy8qIFRBR1M6IExTSU5TRVJURUQxNiBMU0lOU0VSVEVEMzIgTFNJTlNFUlRFRDY0ICovCisKK0lOTElORV9TSU1fQklUU1wKKyh1bnNpZ25lZE4pCitMU0lOU0VSVEVEbiAodW5zaWduZWROIHZhbCwKKwkgICAgIGludCBzdGFydCwKKwkgICAgIGludCBzdG9wKQoreworICB2YWwgPDw9IHN0b3A7CisgIHZhbCAmPSBMU01BU0tuIChzdGFydCwgc3RvcCk7CisgIHJldHVybiB2YWw7Cit9CisKKy8qIFRBR1M6IE1TSU5TRVJURUQxNiBNU0lOU0VSVEVEMzIgTVNJTlNFUlRFRDY0ICovCisKK0lOTElORV9TSU1fQklUU1wKKyh1bnNpZ25lZE4pCitNU0lOU0VSVEVEbiAodW5zaWduZWROIHZhbCwKKwkgICAgIGludCBzdGFydCwKKwkgICAgIGludCBzdG9wKQoreworICB2YWwgPDw9ICgoTiAtIDEpIC0gc3RvcCk7CisgIHZhbCAmPSBNU01BU0tuIChzdGFydCwgc3RvcCk7CisgIHJldHVybiB2YWw7Cit9CisKKy8qIFRBR1M6IFJPVDE2IFJPVDMyIFJPVDY0ICovCisKK0lOTElORV9TSU1fQklUU1wKKyh1bnNpZ25lZE4pCitST1RuICh1bnNpZ25lZE4gdmFsLAorICAgICAgaW50IHNoaWZ0KQoreworICBpZiAoc2hpZnQgPiAwKQorICAgIHJldHVybiBST1RSbiAodmFsLCBzaGlmdCk7CisgIGVsc2UgaWYgKHNoaWZ0IDwgMCkKKyAgICByZXR1cm4gUk9UTG4gKHZhbCwgLXNoaWZ0KTsKKyAgZWxzZQorICAgIHJldHVybiB2YWw7Cit9CisKKy8qIFRBR1M6IFJPVEwxNiBST1RMMzIgUk9UTDY0ICovCisKK0lOTElORV9TSU1fQklUU1wKKyh1bnNpZ25lZE4pCitST1RMbiAodW5zaWduZWROIHZhbCwKKyAgICAgICBpbnQgc2hpZnQpCit7CisgIHVuc2lnbmVkTiByZXN1bHQ7CisgIEFTU0VSVCAoc2hpZnQgPD0gTik7CisgIHJlc3VsdCA9ICgoKHZhbCkgPDwgKHNoaWZ0KSkgfCAoKHZhbCkgPj4gKChOKS0oc2hpZnQpKSkpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBUQUdTOiBST1RSMTYgUk9UUjMyIFJPVFI2NCAqLworCitJTkxJTkVfU0lNX0JJVFNcCisodW5zaWduZWROKQorUk9UUm4gKHVuc2lnbmVkTiB2YWwsCisgICAgICAgaW50IHNoaWZ0KQoreworICB1bnNpZ25lZE4gcmVzdWx0OworICBBU1NFUlQgKHNoaWZ0IDw9IE4pOworICByZXN1bHQgPSAoKCh2YWwpID4+IChzaGlmdCkpIHwgKCh2YWwpIDw8ICgoTiktKHNoaWZ0KSkpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogVEFHUzogTFNTRVhUMTYgTFNTRVhUMzIgTFNTRVhUNjQgKi8KKworSU5MSU5FX1NJTV9CSVRTXAorKHVuc2lnbmVkTikKK0xTU0VYVG4gKHNpZ25lZE4gdmFsLAorCSBpbnQgc2lnbl9iaXQpCit7CisgIGludCBzaGlmdDsKKyAgLyogbWFrZSB0aGUgc2lnbi1iaXQgbW9zdCBzaWduaWZpY2FudCBhbmQgdGhlbiBzbWVhciBpdCBiYWNrIGludG8KKyAgICAgcG9zaXRpb24gKi8KKyAgQVNTRVJUIChzaWduX2JpdCA8IE4pOworICBzaGlmdCA9ICgoTiAtIDEpIC0gc2lnbl9iaXQpOworICB2YWwgPDw9IHNoaWZ0OworICB2YWwgPj49IHNoaWZ0OworICByZXR1cm4gdmFsOworfQorCisvKiBUQUdTOiBNU1NFWFQxNiBNU1NFWFQzMiBNU1NFWFQ2NCAqLworCitJTkxJTkVfU0lNX0JJVFNcCisodW5zaWduZWROKQorTVNTRVhUbiAoc2lnbmVkTiB2YWwsCisJIGludCBzaWduX2JpdCkKK3sKKyAgLyogbWFrZSB0aGUgc2lnbi1iaXQgbW9zdCBzaWduaWZpY2FudCBhbmQgdGhlbiBzbWVhciBpdCBiYWNrIGludG8KKyAgICAgcG9zaXRpb24gKi8KKyAgQVNTRVJUIChzaWduX2JpdCA8IE4pOworICB2YWwgPDw9IHNpZ25fYml0OworICB2YWwgPj49IHNpZ25fYml0OworICByZXR1cm4gdmFsOworfQorCisKKy8qIE5PVEU6IFNlZSBzdGFydCBvZiBmaWxlIGZvciAjZGVmaW5lICovCisjdW5kZWYgTFNTRVhUbgorI3VuZGVmIE1TU0VYVG4KKyN1bmRlZiBST1RMbgorI3VuZGVmIFJPVFJuCisjdW5kZWYgUk9UbgorI3VuZGVmIExTSU5TRVJURURuCisjdW5kZWYgTVNJTlNFUlRFRG4KKyN1bmRlZiBMU0VYVFJBQ1RFRG4KKyN1bmRlZiBNU0VYVFJBQ1RFRG4KKyN1bmRlZiBMU01BU0tFRG4KKyN1bmRlZiBMU01BU0tuCisjdW5kZWYgTVNNQVNLRURuCisjdW5kZWYgTVNNQVNLbgorI3VuZGVmIHNpZ25lZE4KKyN1bmRlZiB1bnNpZ25lZE4KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLW4tY29yZS5oIGIvc2ltL2NvbW1vbi9zaW0tbi1jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZlY2EwMwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vc2ltLW4tY29yZS5oCkBAIC0wLDAgKzEsNDE3IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIE4KKyNlcnJvciAiTiBtdXN0IGJlICNkZWZpbmVkIgorI2VuZGlmCisjaWZuZGVmIE0KKyNkZWZpbmUgTSBOCisjZW5kaWYKKworLyogTjogVGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHRvIHRyYW5zZmVyLgorICAgTTogVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgdHlwZSB1c2VkIHRvIHRyYW5zZmVyIHRoZSBkYXRhICovCisKKyNpZiAoTiA+IE0pCisjZXJyb3IgIk4gKG5yIGJ5dGVzIG9mIGRhdGEpIG11c3QgYmUgPD0gTSAobnIgb2YgYnl0ZXMgaW4gZGF0YSB0eXBlKSIKKyNlbmRpZgorCisKKyNpbmNsdWRlICJzeW1jYXQuaCIKKworLyogTk9URTogc2VlIGVuZCBvZiBmaWxlIGZvciAjdW5kZWYgb2YgdGhlc2UgbWFjcm9zICovCisKKyNkZWZpbmUgdW5zaWduZWRfTSBYQ09OQ0FUMih1bnNpZ25lZF8sTSkKKworI2RlZmluZSBUMkhfTSBYQ09OQ0FUMihUMkhfLE0pCisjZGVmaW5lIEgyVF9NIFhDT05DQVQyKEgyVF8sTSkKKyNkZWZpbmUgU1dBUF9NIFhDT05DQVQyKFNXQVBfLE0pCisKKyNkZWZpbmUgc2ltX2NvcmVfcmVhZF9hbGlnbmVkX04gWENPTkNBVDIoc2ltX2NvcmVfcmVhZF9hbGlnbmVkXyxOKQorI2RlZmluZSBzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF9OIFhDT05DQVQyKHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkXyxOKQorI2RlZmluZSBzaW1fY29yZV9yZWFkX21pc2FsaWduZWRfTiBYQ09OQ0FUMihzaW1fY29yZV9yZWFkX21pc2FsaWduZWRfLE4pCisjZGVmaW5lIHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfTiBYQ09OQ0FUMihzaW1fY29yZV93cml0ZV9hbGlnbmVkXyxOKQorI2RlZmluZSBzaW1fY29yZV93cml0ZV91bmFsaWduZWRfTiBYQ09OQ0FUMihzaW1fY29yZV93cml0ZV91bmFsaWduZWRfLE4pCisjZGVmaW5lIHNpbV9jb3JlX3dyaXRlX21pc2FsaWduZWRfTiBYQ09OQ0FUMihzaW1fY29yZV93cml0ZV9taXNhbGlnbmVkXyxOKQorI2RlZmluZSBzaW1fY29yZV90cmFjZV9NIFhDT05DQVQyKHNpbV9jb3JlX3RyYWNlXyxNKQorI2RlZmluZSBzaW1fY29yZV9kdW1teV9NIFhDT05DQVQyKHNpbV9jb3JlX2R1bW15XyxNKQorCisKKyNpZiAoTSA9PSBOICYmIE4gPiAxKQorLyogZHVtbXkgdmFyaWFibGUgdXNlZCBhcyBhIHJldHVybiB2YWx1ZSB3aGVuIG5vdGhpbmcgZWxzZSBpcworICAgYXZhaWxhYmxlIGFuZCB0aGUgY29tcGlsZXIgaXMgY29tcGxhaW5pbmcgKi8KK3N0YXRpYyB1bnNpZ25lZF9NIHNpbV9jb3JlX2R1bW15X007CisjZW5kaWYKKworCisvKiBUQUdTOiBzaW1fY29yZV90cmFjZV8xIHNpbV9jb3JlX3RyYWNlXzIgKi8KKy8qIFRBR1M6IHNpbV9jb3JlX3RyYWNlXzQgc2ltX2NvcmVfdHJhY2VfOCAqLworLyogVEFHUzogc2ltX2NvcmVfdHJhY2VfMTYgKi8KKworI2lmIChNID09IE4pCitTVEFUSUNfU0lNX0NPUkUodm9pZCkKK3NpbV9jb3JlX3RyYWNlX00gKHNpbV9jcHUgKmNwdSwKKwkJICBzaW1fY2lhIGNpYSwKKwkJICBpbnQgbGluZV9uciwKKwkJICB0cmFuc2Zlcl90eXBlIHR5cGUsCisJCSAgdW5zaWduZWQgbWFwLAorCQkgIGFkZHJlc3Nfd29yZCBhZGRyLAorCQkgIHVuc2lnbmVkX00gdmFsLAorCQkgIGludCBucl9ieXRlcykKK3sKKyAgY29uc3QgY2hhciAqdHJhbnNmZXIgPSAodHlwZSA9PSByZWFkX3RyYW5zZmVyID8gInJlYWQiIDogIndyaXRlIik7CisgIGNvbnN0IGNoYXIgKmRpcmVjdGlvbiA9ICh0eXBlID09IHJlYWRfdHJhbnNmZXIgPyAiLT4iIDogIjwtIik7CisKKyAgaWYgKFRSQUNFX0RFQlVHX1AgKGNwdSkpCisgICAgdHJhY2VfcHJpbnRmIChDUFVfU1RBVEUgKGNwdSksIGNwdSwgInNpbS1uLWNvcmUuaDolZDogIiwgbGluZV9ucik7CisKKyNpZiAoTSA9PSAxNikKKyAgdHJhY2VfcHJpbnRmIChDUFVfU1RBVEUgKGNwdSksIGNwdSwKKwkJIiVzLSVkICVzOjB4JTA4bHggJXMgMHglMDhseCUwOGx4JTA4bHglMDhseFxuIiwKKwkJdHJhbnNmZXIsIG5yX2J5dGVzLAorCQltYXBfdG9fc3RyIChtYXApLAorCQkodW5zaWduZWQgbG9uZykgYWRkciwKKwkJZGlyZWN0aW9uLAorCQkodW5zaWduZWQgbG9uZykgVjRfMTYgKHZhbCwgMCksCisJCSh1bnNpZ25lZCBsb25nKSBWNF8xNiAodmFsLCAxKSwKKwkJKHVuc2lnbmVkIGxvbmcpIFY0XzE2ICh2YWwsIDIpLAorCQkodW5zaWduZWQgbG9uZykgVjRfMTYgKHZhbCwgMykpOworI2VuZGlmCisjaWYgKE0gPT0gOCkKKyAgdHJhY2VfcHJpbnRmIChDUFVfU1RBVEUgKGNwdSksIGNwdSwKKwkJIiVzLSVkICVzOjB4JTA4bHggJXMgMHglMDhseCUwOGx4XG4iLAorCQl0cmFuc2ZlciwgbnJfYnl0ZXMsCisJCW1hcF90b19zdHIgKG1hcCksCisJCSh1bnNpZ25lZCBsb25nKSBhZGRyLAorCQlkaXJlY3Rpb24sCisJCSh1bnNpZ25lZCBsb25nKSBWNF84ICh2YWwsIDApLAorCQkodW5zaWduZWQgbG9uZykgVjRfOCAodmFsLCAxKSk7CisjZW5kaWYKKyNpZiAoTSA9PSA0KQorICB0cmFjZV9wcmludGYgKENQVV9TVEFURSAoY3B1KSwgY3B1LAorCQkiJXMtJWQgJXM6MHglMDhseCAlcyAweCUwOGx4XG4iLAorCQl0cmFuc2ZlciwKKwkJbnJfYnl0ZXMsCisJCW1hcF90b19zdHIgKG1hcCksCisJCSh1bnNpZ25lZCBsb25nKSBhZGRyLAorCQlkaXJlY3Rpb24sCisJCSh1bnNpZ25lZCBsb25nKSB2YWwpOworI2VuZGlmCisjaWYgKE0gPT0gMikKKyAgdHJhY2VfcHJpbnRmIChDUFVfU1RBVEUgKGNwdSksIGNwdSwKKwkJIiVzLSVkICVzOjB4JTA4bHggJXMgMHglMDRseFxuIiwKKwkJdHJhbnNmZXIsCisJCW5yX2J5dGVzLAorCQltYXBfdG9fc3RyIChtYXApLAorCQkodW5zaWduZWQgbG9uZykgYWRkciwKKwkJZGlyZWN0aW9uLAorCQkodW5zaWduZWQgbG9uZykgdmFsKTsKKyNlbmRpZgorI2lmIChNID09IDEpCisgIHRyYWNlX3ByaW50ZiAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsCisJCSIlcy0lZCAlczoweCUwOGx4ICVzIDB4JTAybHhcbiIsCisJCXRyYW5zZmVyLAorCQlucl9ieXRlcywKKwkJbWFwX3RvX3N0ciAobWFwKSwKKwkJKHVuc2lnbmVkIGxvbmcpIGFkZHIsCisJCWRpcmVjdGlvbiwKKwkJKHVuc2lnbmVkIGxvbmcpIHZhbCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisgIAorLyogVEFHUzogc2ltX2NvcmVfcmVhZF9hbGlnbmVkXzEgc2ltX2NvcmVfcmVhZF9hbGlnbmVkXzIgKi8KKy8qIFRBR1M6IHNpbV9jb3JlX3JlYWRfYWxpZ25lZF80IHNpbV9jb3JlX3JlYWRfYWxpZ25lZF84ICovCisvKiBUQUdTOiBzaW1fY29yZV9yZWFkX2FsaWduZWRfMTYgKi8KKworI2lmIChNID09IE4pCitJTkxJTkVfU0lNX0NPUkUodW5zaWduZWRfTSkKK3NpbV9jb3JlX3JlYWRfYWxpZ25lZF9OKHNpbV9jcHUgKmNwdSwKKwkJCXNpbV9jaWEgY2lhLAorCQkJdW5zaWduZWQgbWFwLAorCQkJYWRkcmVzc193b3JkIHhhZGRyKQoreworICBzaW1fY3B1X2NvcmUgKmNwdV9jb3JlID0gQ1BVX0NPUkUgKGNwdSk7CisgIHNpbV9jb3JlX2NvbW1vbiAqY29yZSA9ICZjcHVfY29yZS0+Y29tbW9uOworICB1bnNpZ25lZF9NIHZhbDsKKyAgc2ltX2NvcmVfbWFwcGluZyAqbWFwcGluZzsKKyAgYWRkcmVzc193b3JkIGFkZHI7CisjaWYgV0lUSF9YT1JfRU5ESUFOICE9IDAKKyAgaWYgKFdJVEhfWE9SX0VORElBTikKKyAgICBhZGRyID0geGFkZHIgXiBjcHVfY29yZS0+eG9yWyhOIC0gMSkgJSBXSVRIX1hPUl9FTkRJQU5dOworICBlbHNlCisjZW5kaWYKKyAgICBhZGRyID0geGFkZHI7CisgIG1hcHBpbmcgPSBzaW1fY29yZV9maW5kX21hcHBpbmcgKGNvcmUsIG1hcCwgYWRkciwgTiwgcmVhZF90cmFuc2ZlciwgMSAvKmFib3J0Ki8sIGNwdSwgY2lhKTsKKyAgZG8KKyAgICB7CisjaWYgKFdJVEhfREVWSUNFUykKKyAgICAgIGlmIChXSVRIX0NBTExCQUNLX01FTU9SWSAmJiBtYXBwaW5nLT5kZXZpY2UgIT0gTlVMTCkKKwl7CisJICB1bnNpZ25lZF9NIGRhdGE7CisJICBpZiAoZGV2aWNlX2lvX3JlYWRfYnVmZmVyIChtYXBwaW5nLT5kZXZpY2UsICZkYXRhLCBtYXBwaW5nLT5zcGFjZSwgYWRkciwgTiwgY3B1LCBjaWEpICE9IE4pCisJICAgIGRldmljZV9lcnJvciAobWFwcGluZy0+ZGV2aWNlLCAiaW50ZXJuYWwgZXJyb3IgLSAlcyAtIGlvX3JlYWRfYnVmZmVyIHNob3VsZCBub3QgZmFpbCIsCisJCQkgIFhTVFJJTkcgKHNpbV9jb3JlX3JlYWRfYWxpZ25lZF9OKSk7CisJICB2YWwgPSBUMkhfTSAoZGF0YSk7CisJICBicmVhazsKKwl9CisjZW5kaWYKKyNpZiAoV0lUSF9IVykKKyAgICAgIGlmIChXSVRIX0NBTExCQUNLX01FTU9SWSAmJiBtYXBwaW5nLT5kZXZpY2UgIT0gTlVMTCkKKwl7CisJICB1bnNpZ25lZF9NIGRhdGE7CisJICBzaW1fY3B1X2h3X2lvX3JlYWRfYnVmZmVyIChjcHUsIGNpYSwgbWFwcGluZy0+ZGV2aWNlLCAmZGF0YSwgbWFwcGluZy0+c3BhY2UsIGFkZHIsIE4pOworCSAgdmFsID0gVDJIX00gKGRhdGEpOworCSAgYnJlYWs7CisJfQorI2VuZGlmCisgICAgICB2YWwgPSBUMkhfTSAoKih1bnNpZ25lZF9NKikgc2ltX2NvcmVfdHJhbnNsYXRlIChtYXBwaW5nLCBhZGRyKSk7CisgICAgfQorICB3aGlsZSAoMCk7CisgIFBST0ZJTEVfQ09VTlRfQ09SRSAoY3B1LCBhZGRyLCBOLCBtYXApOworICBpZiAoVFJBQ0VfUCAoY3B1LCBUUkFDRV9DT1JFX0lEWCkpCisgICAgc2ltX2NvcmVfdHJhY2VfTSAoY3B1LCBjaWEsIF9fTElORV9fLCByZWFkX3RyYW5zZmVyLCBtYXAsIGFkZHIsIHZhbCwgTik7CisgIHJldHVybiB2YWw7Cit9CisjZW5kaWYKKyAgCisvKiBUQUdTOiBzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF8xIHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkXzIgKi8KKy8qIFRBR1M6IHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkXzQgc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfOCAqLworLyogVEFHUzogc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfMTYgKi8KKworI2lmIChNID09IE4gJiYgTiA+IDEpCitJTkxJTkVfU0lNX0NPUkUodW5zaWduZWRfTSkKK3NpbV9jb3JlX3JlYWRfdW5hbGlnbmVkX04oc2ltX2NwdSAqY3B1LAorCQkJICBzaW1fY2lhIGNpYSwKKwkJCSAgdW5zaWduZWQgbWFwLAorCQkJICBhZGRyZXNzX3dvcmQgYWRkcikKK3sKKyAgaW50IGFsaWdubWVudCA9IE4gLSAxOworICAvKiBpZiBoYXJkd2lyZWQgdG8gZm9yY2VkIGFsaWdubWVudCBqdXN0IGRvIGl0ICovCisgIGlmIChXSVRIX0FMSUdOTUVOVCA9PSBGT1JDRURfQUxJR05NRU5UKQorICAgIHJldHVybiBzaW1fY29yZV9yZWFkX2FsaWduZWRfTiAoY3B1LCBjaWEsIG1hcCwgYWRkciAmIH5hbGlnbm1lbnQpOworICBlbHNlIGlmICgoYWRkciAmIGFsaWdubWVudCkgPT0gMCkKKyAgICByZXR1cm4gc2ltX2NvcmVfcmVhZF9hbGlnbmVkX04gKGNwdSwgY2lhLCBtYXAsIGFkZHIpOworICBlbHNlCisgICAgc3dpdGNoIChDVVJSRU5UX0FMSUdOTUVOVCkKKyAgICAgIHsKKyAgICAgIGNhc2UgU1RSSUNUX0FMSUdOTUVOVDoKKwlTSU1fQ09SRV9TSUdOQUwgKENQVV9TVEFURSAoY3B1KSwgY3B1LCBjaWEsIG1hcCwgTiwgYWRkciwKKwkJCSByZWFkX3RyYW5zZmVyLCBzaW1fY29yZV91bmFsaWduZWRfc2lnbmFsKTsKKyAgICAgIGNhc2UgTk9OU1RSSUNUX0FMSUdOTUVOVDoKKwl7CisJICB1bnNpZ25lZF9NIHZhbDsKKwkgIGlmIChzaW1fY29yZV94b3JfcmVhZF9idWZmZXIgKENQVV9TVEFURSAoY3B1KSwgY3B1LCBtYXAsICZ2YWwsIGFkZHIsIE4pICE9IE4pCisJICAgIFNJTV9DT1JFX1NJR05BTCAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsIGNpYSwgbWFwLCBOLCBhZGRyLAorCQkJICAgICByZWFkX3RyYW5zZmVyLCBzaW1fY29yZV91bmFsaWduZWRfc2lnbmFsKTsKKwkgIHZhbCA9IFQySF9NKHZhbCk7CisJICBQUk9GSUxFX0NPVU5UX0NPUkUgKGNwdSwgYWRkciwgTiwgbWFwKTsKKwkgIGlmIChUUkFDRV9QIChjcHUsIFRSQUNFX0NPUkVfSURYKSkKKwkgICAgc2ltX2NvcmVfdHJhY2VfTSAoY3B1LCBjaWEsIF9fTElORV9fLCByZWFkX3RyYW5zZmVyLCBtYXAsIGFkZHIsIHZhbCwgTik7CisJICByZXR1cm4gdmFsOworCX0KKyAgICAgIGNhc2UgRk9SQ0VEX0FMSUdOTUVOVDoKKwlyZXR1cm4gc2ltX2NvcmVfcmVhZF9hbGlnbmVkX04gKGNwdSwgY2lhLCBtYXAsIGFkZHIgJiB+YWxpZ25tZW50KTsKKyAgICAgIGNhc2UgTUlYRURfQUxJR05NRU5UOgorCXNpbV9lbmdpbmVfYWJvcnQgKENQVV9TVEFURSAoY3B1KSwgY3B1LCBjaWEsCisJCQkgICJpbnRlcm5hbCBlcnJvciAtICVzIC0gbWl4ZWQgYWxpZ25tZW50IiwKKwkJCSAgWFNUUklORyAoc2ltX2NvcmVfcmVhZF91bmFsaWduZWRfTikpOworICAgICAgZGVmYXVsdDoKKwlzaW1fZW5naW5lX2Fib3J0IChDUFVfU1RBVEUgKGNwdSksIGNwdSwgY2lhLAorCQkJICAiaW50ZXJuYWwgZXJyb3IgLSAlcyAtIGJhZCBzd2l0Y2giLAorCQkJICBYU1RSSU5HIChzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF9OKSk7CisJLyogdG8ga2VlcCBzb21lIGNvbXBpbGVycyBoYXBweSwgd2UgcmV0dXJuIGEgZHVtbXkgKi8KKwlyZXR1cm4gc2ltX2NvcmVfZHVtbXlfTTsKKyAgICAgIH0KK30KKyNlbmRpZgorCisvKiBUQUdTOiBzaW1fY29yZV9yZWFkX21pc2FsaWduZWRfMyBzaW1fY29yZV9yZWFkX21pc2FsaWduZWRfNSAqLworLyogVEFHUzogc2ltX2NvcmVfcmVhZF9taXNhbGlnbmVkXzYgc2ltX2NvcmVfcmVhZF9taXNhbGlnbmVkXzcgKi8KKworI2lmIChNICE9IE4pCitJTkxJTkVfU0lNX0NPUkUodW5zaWduZWRfTSkKK3NpbV9jb3JlX3JlYWRfbWlzYWxpZ25lZF9OKHNpbV9jcHUgKmNwdSwKKwkJCSAgc2ltX2NpYSBjaWEsCisJCQkgIHVuc2lnbmVkIG1hcCwKKwkJCSAgYWRkcmVzc193b3JkIGFkZHIpCit7CisgIHVuc2lnbmVkX00gdmFsID0gMDsKKyAgaWYgKHNpbV9jb3JlX3hvcl9yZWFkX2J1ZmZlciAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsIG1hcCwgJnZhbCwgYWRkciwgTikgIT0gTikKKyAgICBTSU1fQ09SRV9TSUdOQUwgKENQVV9TVEFURSAoY3B1KSwgY3B1LCBjaWEsIG1hcCwgTiwgYWRkciwKKwkJICAgICByZWFkX3RyYW5zZmVyLCBzaW1fY29yZV91bmFsaWduZWRfc2lnbmFsKTsKKyAgaWYgKENVUlJFTlRfSE9TVF9CWVRFX09SREVSICE9IENVUlJFTlRfVEFSR0VUX0JZVEVfT1JERVIpCisgICAgdmFsID0gU1dBUF9NICh2YWwpOworICBpZiAoQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQorICAgIHZhbCA+Pj0gKE0gLSBOKSAqIDg7CisgIFBST0ZJTEVfQ09VTlRfQ09SRSAoY3B1LCBhZGRyLCBOLCBtYXApOworICBpZiAoVFJBQ0VfUCAoY3B1LCBUUkFDRV9DT1JFX0lEWCkpCisgICAgc2ltX2NvcmVfdHJhY2VfTSAoY3B1LCBjaWEsIF9fTElORV9fLCByZWFkX3RyYW5zZmVyLCBtYXAsIGFkZHIsIHZhbCwgTik7CisgIHJldHVybiB2YWw7Cit9CisjZW5kaWYKKworLyogVEFHUzogc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF8xIHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfMiAqLworLyogVEFHUzogc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF80IHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfOCAqLworLyogVEFHUzogc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF8xNiAqLworCisjaWYgKE0gPT0gTikKK0lOTElORV9TSU1fQ09SRSh2b2lkKQorc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF9OKHNpbV9jcHUgKmNwdSwKKwkJCSBzaW1fY2lhIGNpYSwKKwkJCSB1bnNpZ25lZCBtYXAsCisJCQkgYWRkcmVzc193b3JkIHhhZGRyLAorCQkJIHVuc2lnbmVkX00gdmFsKQoreworICBzaW1fY3B1X2NvcmUgKmNwdV9jb3JlID0gQ1BVX0NPUkUgKGNwdSk7CisgIHNpbV9jb3JlX2NvbW1vbiAqY29yZSA9ICZjcHVfY29yZS0+Y29tbW9uOworICBzaW1fY29yZV9tYXBwaW5nICptYXBwaW5nOworICBhZGRyZXNzX3dvcmQgYWRkcjsKKyNpZiBXSVRIX1hPUl9FTkRJQU4gIT0gMAorICBpZiAoV0lUSF9YT1JfRU5ESUFOKQorICAgIGFkZHIgPSB4YWRkciBeIGNwdV9jb3JlLT54b3JbKE4gLSAxKSAlIFdJVEhfWE9SX0VORElBTl07CisgIGVsc2UKKyNlbmRpZgorICAgIGFkZHIgPSB4YWRkcjsKKyAgbWFwcGluZyA9IHNpbV9jb3JlX2ZpbmRfbWFwcGluZyAoY29yZSwgbWFwLCBhZGRyLCBOLCB3cml0ZV90cmFuc2ZlciwgMSAvKmFib3J0Ki8sIGNwdSwgY2lhKTsKKyAgZG8KKyAgICB7CisjaWYgKFdJVEhfREVWSUNFUykKKyAgICAgIGlmIChXSVRIX0NBTExCQUNLX01FTU9SWSAmJiBtYXBwaW5nLT5kZXZpY2UgIT0gTlVMTCkKKwl7CisJICB1bnNpZ25lZF9NIGRhdGEgPSBIMlRfTSAodmFsKTsKKwkgIGlmIChkZXZpY2VfaW9fd3JpdGVfYnVmZmVyIChtYXBwaW5nLT5kZXZpY2UsICZkYXRhLCBtYXBwaW5nLT5zcGFjZSwgYWRkciwgTiwgY3B1LCBjaWEpICE9IE4pCisJICAgIGRldmljZV9lcnJvciAobWFwcGluZy0+ZGV2aWNlLCAiaW50ZXJuYWwgZXJyb3IgLSAlcyAtIGlvX3dyaXRlX2J1ZmZlciBzaG91bGQgbm90IGZhaWwiLAorCQkJICBYU1RSSU5HIChzaW1fY29yZV93cml0ZV9hbGlnbmVkX04pKTsKKwkgIGJyZWFrOworCX0KKyNlbmRpZgorI2lmIChXSVRIX0hXKQorICAgICAgaWYgKFdJVEhfQ0FMTEJBQ0tfTUVNT1JZICYmIG1hcHBpbmctPmRldmljZSAhPSBOVUxMKQorCXsKKwkgIHVuc2lnbmVkX00gZGF0YSA9IEgyVF9NICh2YWwpOworCSAgc2ltX2NwdV9od19pb193cml0ZV9idWZmZXIgKGNwdSwgY2lhLCBtYXBwaW5nLT5kZXZpY2UsICZkYXRhLCBtYXBwaW5nLT5zcGFjZSwgYWRkciwgTik7CisJICBicmVhazsKKwl9CisjZW5kaWYKKyAgICAgICoodW5zaWduZWRfTSopIHNpbV9jb3JlX3RyYW5zbGF0ZSAobWFwcGluZywgYWRkcikgPSBIMlRfTSAodmFsKTsKKyAgICB9CisgIHdoaWxlICgwKTsKKyAgUFJPRklMRV9DT1VOVF9DT1JFIChjcHUsIGFkZHIsIE4sIG1hcCk7CisgIGlmIChUUkFDRV9QIChjcHUsIFRSQUNFX0NPUkVfSURYKSkKKyAgICBzaW1fY29yZV90cmFjZV9NIChjcHUsIGNpYSwgX19MSU5FX18sIHdyaXRlX3RyYW5zZmVyLCBtYXAsIGFkZHIsIHZhbCwgTik7Cit9CisjZW5kaWYKKworLyogVEFHUzogc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkXzEgc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkXzIgKi8KKy8qIFRBR1M6IHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF80IHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF84ICovCisvKiBUQUdTOiBzaW1fY29yZV93cml0ZV91bmFsaWduZWRfMTYgKi8KKworI2lmIChNID09IE4gJiYgTiA+IDEpCitJTkxJTkVfU0lNX0NPUkUodm9pZCkKK3NpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF9OKHNpbV9jcHUgKmNwdSwKKwkJCSAgIHNpbV9jaWEgY2lhLAorCQkJICAgdW5zaWduZWQgbWFwLAorCQkJICAgYWRkcmVzc193b3JkIGFkZHIsCisJCQkgICB1bnNpZ25lZF9NIHZhbCkKK3sKKyAgaW50IGFsaWdubWVudCA9IE4gLSAxOworICAvKiBpZiBoYXJkd2lyZWQgdG8gZm9yY2VkIGFsaWdubWVudCBqdXN0IGRvIGl0ICovCisgIGlmIChXSVRIX0FMSUdOTUVOVCA9PSBGT1JDRURfQUxJR05NRU5UKQorICAgIHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfTiAoY3B1LCBjaWEsIG1hcCwgYWRkciAmIH5hbGlnbm1lbnQsIHZhbCk7CisgIGVsc2UgaWYgKChhZGRyICYgYWxpZ25tZW50KSA9PSAwKQorICAgIHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfTiAoY3B1LCBjaWEsIG1hcCwgYWRkciwgdmFsKTsKKyAgZWxzZQorICAgIHN3aXRjaCAoQ1VSUkVOVF9BTElHTk1FTlQpCisgICAgICB7CisgICAgICBjYXNlIFNUUklDVF9BTElHTk1FTlQ6CisJU0lNX0NPUkVfU0lHTkFMIChDUFVfU1RBVEUgKGNwdSksIGNwdSwgY2lhLCBtYXAsIE4sIGFkZHIsCisJCQkgd3JpdGVfdHJhbnNmZXIsIHNpbV9jb3JlX3VuYWxpZ25lZF9zaWduYWwpOworCWJyZWFrOworICAgICAgY2FzZSBOT05TVFJJQ1RfQUxJR05NRU5UOgorCXsKKwkgIHVuc2lnbmVkX00gZGF0YSA9IEgyVF9NICh2YWwpOworCSAgaWYgKHNpbV9jb3JlX3hvcl93cml0ZV9idWZmZXIgKENQVV9TVEFURSAoY3B1KSwgY3B1LCBtYXAsICZkYXRhLCBhZGRyLCBOKSAhPSBOKQorCSAgICBTSU1fQ09SRV9TSUdOQUwgKENQVV9TVEFURSAoY3B1KSwgY3B1LCBjaWEsIG1hcCwgTiwgYWRkciwKKwkJCSAgICAgd3JpdGVfdHJhbnNmZXIsIHNpbV9jb3JlX3VuYWxpZ25lZF9zaWduYWwpOworCSAgUFJPRklMRV9DT1VOVF9DT1JFIChjcHUsIGFkZHIsIE4sIG1hcCk7CisJICBpZiAoVFJBQ0VfUCAoY3B1LCBUUkFDRV9DT1JFX0lEWCkpCisJICAgIHNpbV9jb3JlX3RyYWNlX00gKGNwdSwgY2lhLCBfX0xJTkVfXywgd3JpdGVfdHJhbnNmZXIsIG1hcCwgYWRkciwgdmFsLCBOKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGNhc2UgRk9SQ0VEX0FMSUdOTUVOVDoKKwlzaW1fY29yZV93cml0ZV9hbGlnbmVkX04gKGNwdSwgY2lhLCBtYXAsIGFkZHIgJiB+YWxpZ25tZW50LCB2YWwpOworCWJyZWFrOworICAgICAgY2FzZSBNSVhFRF9BTElHTk1FTlQ6CisJc2ltX2VuZ2luZV9hYm9ydCAoQ1BVX1NUQVRFIChjcHUpLCBjcHUsIGNpYSwKKwkJCSAgImludGVybmFsIGVycm9yIC0gJXMgLSBtaXhlZCBhbGlnbm1lbnQiLAorCQkJICBYU1RSSU5HIChzaW1fY29yZV93cml0ZV91bmFsaWduZWRfTikpOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlzaW1fZW5naW5lX2Fib3J0IChDUFVfU1RBVEUgKGNwdSksIGNwdSwgY2lhLAorCQkJICAiaW50ZXJuYWwgZXJyb3IgLSAlcyAtIGJhZCBzd2l0Y2giLAorCQkJICBYU1RSSU5HIChzaW1fY29yZV93cml0ZV91bmFsaWduZWRfTikpOworCWJyZWFrOworICAgICAgfQorfQorI2VuZGlmCisKKy8qIFRBR1M6IHNpbV9jb3JlX3dyaXRlX21pc2FsaWduZWRfMyBzaW1fY29yZV93cml0ZV9taXNhbGlnbmVkXzUgKi8KKy8qIFRBR1M6IHNpbV9jb3JlX3dyaXRlX21pc2FsaWduZWRfNiBzaW1fY29yZV93cml0ZV9taXNhbGlnbmVkXzcgKi8KKworI2lmIChNICE9IE4pCitJTkxJTkVfU0lNX0NPUkUodm9pZCkKK3NpbV9jb3JlX3dyaXRlX21pc2FsaWduZWRfTihzaW1fY3B1ICpjcHUsCisJCQkgICBzaW1fY2lhIGNpYSwKKwkJCSAgIHVuc2lnbmVkIG1hcCwKKwkJCSAgIGFkZHJlc3Nfd29yZCBhZGRyLAorCQkJICAgdW5zaWduZWRfTSB2YWwpCit7CisgIHVuc2lnbmVkX00gZGF0YSA9IHZhbDsKKyAgaWYgKENVUlJFTlRfVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKKyAgICBkYXRhIDw8PSAoTSAtIE4pICogODsKKyAgaWYgKENVUlJFTlRfSE9TVF9CWVRFX09SREVSICE9IENVUlJFTlRfVEFSR0VUX0JZVEVfT1JERVIpCisgICAgZGF0YSA9IFNXQVBfTSAoZGF0YSk7CisgIGlmIChzaW1fY29yZV94b3Jfd3JpdGVfYnVmZmVyIChDUFVfU1RBVEUgKGNwdSksIGNwdSwgbWFwLCAmZGF0YSwgYWRkciwgTikgIT0gTikKKyAgICBTSU1fQ09SRV9TSUdOQUwgKENQVV9TVEFURSAoY3B1KSwgY3B1LCBjaWEsIG1hcCwgTiwgYWRkciwKKwkJICAgICB3cml0ZV90cmFuc2Zlciwgc2ltX2NvcmVfdW5hbGlnbmVkX3NpZ25hbCk7CisgIFBST0ZJTEVfQ09VTlRfQ09SRSAoY3B1LCBhZGRyLCBOLCBtYXApOworICBpZiAoVFJBQ0VfUCAoY3B1LCBUUkFDRV9DT1JFX0lEWCkpCisgICAgc2ltX2NvcmVfdHJhY2VfTSAoY3B1LCBjaWEsIF9fTElORV9fLCB3cml0ZV90cmFuc2ZlciwgbWFwLCBhZGRyLCB2YWwsIE4pOworfQorI2VuZGlmCisKKworLyogTk9URTogc2VlIHN0YXJ0IG9mIGZpbGUgZm9yICNkZWZpbmUgb2YgdGhlc2UgbWFjcm9zICovCisjdW5kZWYgdW5zaWduZWRfTQorI3VuZGVmIFQySF9NCisjdW5kZWYgSDJUX00KKyN1bmRlZiBTV0FQX00KKyN1bmRlZiBzaW1fY29yZV9yZWFkX2FsaWduZWRfTgorI3VuZGVmIHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkX04KKyN1bmRlZiBzaW1fY29yZV9yZWFkX21pc2FsaWduZWRfTgorI3VuZGVmIHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfTgorI3VuZGVmIHNpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF9OCisjdW5kZWYgc2ltX2NvcmVfd3JpdGVfbWlzYWxpZ25lZF9OCisjdW5kZWYgc2ltX2NvcmVfdHJhY2VfTQorI3VuZGVmIHNpbV9jb3JlX2R1bW15X00KKyN1bmRlZiBNCisjdW5kZWYgTgpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tbi1lbmRpYW4uaCBiL3NpbS9jb21tb24vc2ltLW4tZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUzZTA1YQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vc2ltLW4tZW5kaWFuLmgKQEAgLTAsMCArMSwxNjkgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgTgorI2Vycm9yICJOIG11c3QgYmUgI2RlZmluZWQiCisjZW5kaWYKKworI2luY2x1ZGUgInN5bWNhdC5oIgorCisvKiBOT1RFOiBTZWUgZW5kIG9mIGZpbGUgZm9yICN1bmRlZiAqLworI2RlZmluZSB1bnNpZ25lZF9OIFhDT05DQVQyKHVuc2lnbmVkXyxOKQorI2RlZmluZSBlbmRpYW5fdDJoX04gWENPTkNBVDIoZW5kaWFuX3QyaF8sTikKKyNkZWZpbmUgZW5kaWFuX2gydF9OIFhDT05DQVQyKGVuZGlhbl9oMnRfLE4pCisjZGVmaW5lIF9TV0FQX04gWENPTkNBVDIoX1NXQVBfLE4pCisjZGVmaW5lIHN3YXBfTiBYQ09OQ0FUMihzd2FwXyxOKQorI2RlZmluZSBlbmRpYW5faDJiZV9OIFhDT05DQVQyKGVuZGlhbl9oMmJlXyxOKQorI2RlZmluZSBlbmRpYW5fYmUyaF9OIFhDT05DQVQyKGVuZGlhbl9iZTJoXyxOKQorI2RlZmluZSBlbmRpYW5faDJsZV9OIFhDT05DQVQyKGVuZGlhbl9oMmxlXyxOKQorI2RlZmluZSBlbmRpYW5fbGUyaF9OIFhDT05DQVQyKGVuZGlhbl9sZTJoXyxOKQorI2RlZmluZSBvZmZzZXRfTiBYQ09OQ0FUMihvZmZzZXRfLE4pCisKKy8qIFRBR1M6IGVuZGlhbl90MmhfMSBlbmRpYW5fdDJoXzIgZW5kaWFuX3QyaF80IGVuZGlhbl90MmhfOCBlbmRpYW5fdDJoXzE2ICovCisKK0lOTElORV9TSU1fRU5ESUFOXAorKHVuc2lnbmVkX04pCitlbmRpYW5fdDJoX04odW5zaWduZWRfTiByYXdfaW4pCit7CisgIGlmIChDVVJSRU5UX1RBUkdFVF9CWVRFX09SREVSID09IENVUlJFTlRfSE9TVF9CWVRFX09SREVSKSB7CisgICAgcmV0dXJuIHJhd19pbjsKKyAgfQorICBlbHNlIHsKKyAgICBfU1dBUF9OKHJldHVybixyYXdfaW4pOworICB9Cit9CisKKy8qIFRBR1M6IGVuZGlhbl9oMnRfMSBlbmRpYW5faDJ0XzIgZW5kaWFuX2gydF80IGVuZGlhbl9oMnRfOCBlbmRpYW5faDJ0XzE2ICovCisKK0lOTElORV9TSU1fRU5ESUFOXAorKHVuc2lnbmVkX04pCitlbmRpYW5faDJ0X04odW5zaWduZWRfTiByYXdfaW4pCit7CisgIGlmIChDVVJSRU5UX1RBUkdFVF9CWVRFX09SREVSID09IENVUlJFTlRfSE9TVF9CWVRFX09SREVSKSB7CisgICAgcmV0dXJuIHJhd19pbjsKKyAgfQorICBlbHNlIHsKKyAgICBfU1dBUF9OKHJldHVybixyYXdfaW4pOworICB9Cit9CisKKy8qIFRBR1M6IHN3YXBfMSBzd2FwXzIgc3dhcF80IHN3YXBfOCBzd2FwXzE2ICovCisKK0lOTElORV9TSU1fRU5ESUFOXAorKHVuc2lnbmVkX04pCitzd2FwX04odW5zaWduZWRfTiByYXdfaW4pCit7CisgIF9TV0FQX04ocmV0dXJuLHJhd19pbik7Cit9CisKKy8qIFRBR1M6IGVuZGlhbl9oMmJlXzEgZW5kaWFuX2gyYmVfMiBlbmRpYW5faDJiZV80IGVuZGlhbl9oMmJlXzggZW5kaWFuX2gyYmVfMTYgKi8KKworSU5MSU5FX1NJTV9FTkRJQU5cCisodW5zaWduZWRfTikKK2VuZGlhbl9oMmJlX04odW5zaWduZWRfTiByYXdfaW4pCit7CisgIGlmIChDVVJSRU5UX0hPU1RfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKSB7CisgICAgcmV0dXJuIHJhd19pbjsKKyAgfQorICBlbHNlIHsKKyAgICBfU1dBUF9OKHJldHVybixyYXdfaW4pOworICB9Cit9CisKKy8qIFRBR1M6IGVuZGlhbl9iZTJoXzEgZW5kaWFuX2JlMmhfMiBlbmRpYW5fYmUyaF80IGVuZGlhbl9iZTJoXzggZW5kaWFuX2JlMmhfMTYgKi8KKworSU5MSU5FX1NJTV9FTkRJQU5cCisodW5zaWduZWRfTikKK2VuZGlhbl9iZTJoX04odW5zaWduZWRfTiByYXdfaW4pCit7CisgIGlmIChDVVJSRU5UX0hPU1RfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKSB7CisgICAgcmV0dXJuIHJhd19pbjsKKyAgfQorICBlbHNlIHsKKyAgICBfU1dBUF9OKHJldHVybixyYXdfaW4pOworICB9Cit9CisKKy8qIFRBR1M6IGVuZGlhbl9oMmxlXzEgZW5kaWFuX2gybGVfMiBlbmRpYW5faDJsZV80IGVuZGlhbl9oMmxlXzggZW5kaWFuX2gybGVfMTYgKi8KKworSU5MSU5FX1NJTV9FTkRJQU5cCisodW5zaWduZWRfTikKK2VuZGlhbl9oMmxlX04odW5zaWduZWRfTiByYXdfaW4pCit7CisgIGlmIChDVVJSRU5UX0hPU1RfQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOKSB7CisgICAgcmV0dXJuIHJhd19pbjsKKyAgfQorICBlbHNlIHsKKyAgICBfU1dBUF9OKHJldHVybixyYXdfaW4pOworICB9Cit9CisKKy8qIFRBR1M6IGVuZGlhbl9sZTJoXzEgZW5kaWFuX2xlMmhfMiBlbmRpYW5fbGUyaF80IGVuZGlhbl9sZTJoXzggZW5kaWFuX2xlMmhfMTYgKi8KKworSU5MSU5FX1NJTV9FTkRJQU5cCisodW5zaWduZWRfTikKK2VuZGlhbl9sZTJoX04odW5zaWduZWRfTiByYXdfaW4pCit7CisgIGlmIChDVVJSRU5UX0hPU1RfQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOKSB7CisgICAgcmV0dXJuIHJhd19pbjsKKyAgfQorICBlbHNlIHsKKyAgICBfU1dBUF9OKHJldHVybixyYXdfaW4pOworICB9Cit9CisKKy8qIFRBR1M6IG9mZnNldF8xIG9mZnNldF8yIG9mZnNldF80IG9mZnNldF84IG9mZnNldF8xNiAqLworCitJTkxJTkVfU0lNX0VORElBTlwKKyh2b2lkKikKK29mZnNldF9OICh1bnNpZ25lZF9OICp4LAorCSAgdW5zaWduZWQgc2l6ZW9mX3dvcmQsCisJICB1bnNpZ25lZCB3b3JkKQoreworICBjaGFyICppbiA9IChjaGFyKil4OworICBjaGFyICpvdXQ7CisgIHVuc2lnbmVkIG9mZnNldCA9IHNpemVvZl93b3JkICogd29yZDsKKyAgQVNTRVJUIChvZmZzZXQgKyBzaXplb2Zfd29yZCA8PSBzaXplb2YodW5zaWduZWRfTikpOworICBBU1NFUlQgKHdvcmQgPCAoc2l6ZW9mICh1bnNpZ25lZF9OKSAvIHNpemVvZl93b3JkKSk7CisgIEFTU0VSVCAoKHNpemVvZiAodW5zaWduZWRfTikgJSBzaXplb2Zfd29yZCkgPT0gMCk7CisgIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOKQorICAgIHsKKyAgICAgIG91dCA9IGluICsgc2l6ZW9mICh1bnNpZ25lZF9OKSAtIG9mZnNldCAtIHNpemVvZl93b3JkOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG91dCA9IGluICsgb2Zmc2V0OworICAgIH0KKyAgcmV0dXJuIG91dDsKK30KKworCisvKiBOT1RFOiBTZWUgc3RhcnQgb2YgZmlsZSBmb3IgI2RlZmluZSAqLworI3VuZGVmIHVuc2lnbmVkX04KKyN1bmRlZiBlbmRpYW5fdDJoX04KKyN1bmRlZiBlbmRpYW5faDJ0X04KKyN1bmRlZiBfU1dBUF9OCisjdW5kZWYgc3dhcF9OCisjdW5kZWYgZW5kaWFuX2gyYmVfTgorI3VuZGVmIGVuZGlhbl9iZTJoX04KKyN1bmRlZiBlbmRpYW5faDJsZV9OCisjdW5kZWYgZW5kaWFuX2xlMmhfTgorI3VuZGVmIG9mZnNldF9OCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1vcHRpb25zLmMgYi9zaW0vY29tbW9uL3NpbS1vcHRpb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ5MjU2YgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vc2ltLW9wdGlvbnMuYwpAQCAtMCwwICsxLDkzNiBAQAorLyogU2ltdWxhdG9yIG9wdGlvbiBoYW5kbGluZy4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAic2ltLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJzaW0taW8uaCIKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisKKyNpbmNsdWRlICJiZmQuaCIKKworLyogQWRkIGEgc2V0IG9mIG9wdGlvbnMgdG8gdGhlIHNpbXVsYXRvci4KKyAgIFRBQkxFIGlzIGFuIGFycmF5IG9mIE9QVElPTlMgdGVybWluYXRlZCBieSBhIE5VTEwgYG9wdC5uYW1lJyBlbnRyeS4KKyAgIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGJ5IG1vZHVsZXMgaW4gdGhlaXIgYGluc3RhbGwnIGhhbmRsZXIuICAqLworCitTSU1fUkMKK3NpbV9hZGRfb3B0aW9uX3RhYmxlIChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBjb25zdCBPUFRJT04gKnRhYmxlKQoreworICBzdHJ1Y3Qgb3B0aW9uX2xpc3QgKm9sID0gKChzdHJ1Y3Qgb3B0aW9uX2xpc3QgKikKKwkJCSAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBvcHRpb25fbGlzdCkpKTsKKworICAvKiBOb3RlOiBUaGUgbGlzdCBpcyBjb25zdHJ1Y3RlZCBpbiB0aGUgcmV2ZXJzZSBvcmRlciB3ZSdyZSBjYWxsZWQgc28KKyAgICAgbGF0ZXIgY2FsbHMgd2lsbCBvdmVycmlkZSBlYXJsaWVyIG9uZXMgKGluIGNhc2UgdGhhdCBldmVyIGhhcHBlbnMpLgorICAgICBUaGlzIGlzIHRoZSBpbnRlbmRlZCBiZWhhdmlvdXIuICAqLworCisgIGlmIChjcHUpCisgICAgeworICAgICAgb2wtPm5leHQgPSBDUFVfT1BUSU9OUyAoY3B1KTsKKyAgICAgIG9sLT5vcHRpb25zID0gdGFibGU7CisgICAgICBDUFVfT1BUSU9OUyAoY3B1KSA9IG9sOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG9sLT5uZXh0ID0gU1RBVEVfT1BUSU9OUyAoc2QpOworICAgICAgb2wtPm9wdGlvbnMgPSB0YWJsZTsKKyAgICAgIFNUQVRFX09QVElPTlMgKHNkKSA9IG9sOworICAgIH0KKworICByZXR1cm4gU0lNX1JDX09LOworfQorCisvKiBTdGFuZGFyZCBvcHRpb24gdGFibGUuCisgICBNb2R1bGVzIG1heSBzcGVjaWZ5IGFkZGl0aW9uYWwgb25lcy4KKyAgIFRoZSBjYWxsZXIgb2Ygc2ltX3BhcnNlX2FyZ3MgbWF5IGFsc28gc3BlY2lmeSBhZGRpdGlvbmFsIG9wdGlvbnMKKyAgIGJ5IGNhbGxpbmcgc2ltX2FkZF9vcHRpb25fdGFibGUgZmlyc3QuICAqLworCitzdGF0aWMgREVDTEFSRV9PUFRJT05fSEFORExFUiAoc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIpOworCisvKiBGSVhNRTogV2Ugc2hvdWxkbid0IHByaW50IGluIC0taGVscCBvdXRwdXQgb3B0aW9ucyB0aGF0IGFyZW4ndCB1c2FibGUuCisgICBTb21lIGZpbmUgdHVuaW5nIHdpbGwgYmUgbmVjZXNzYXJ5LiAgT25lIGNhbiBlaXRoZXIgbW92ZSBsZXNzIGdlbmVyYWwKKyAgIG9wdGlvbnMgdG8gYW5vdGhlciB0YWJsZSBvciB1c2UgYSBIQVZFX0ZPTyBtYWNybyB0byBpZmRlZiBvdXQgdW5hdmFpbGFibGUKKyAgIG9wdGlvbnMuICAqLworCisvKiA/Pz8gT25lIG1pZ2h0IHdhbnQgdG8gY29uZGl0aW9uYWxseSBjb21waWxlIG91dCB0aGUgZW50cmllcyB0aGF0CisgICBhcmVuJ3QgZW5hYmxlZC4gIFRoZXJlJ3MgYSBkaXN0aW5jdGlvbiwgaG93ZXZlciwgYmV0d2VlbiBvcHRpb25zIGEKKyAgIHNpbXVsYXRvciBjYW4ndCBzdXBwb3J0IGFuZCBvcHRpb25zIHRoYXQgaGF2ZW4ndCBiZWVuIGNvbmZpZ3VyZWQgaW4uCisgICBDZXJ0YWlubHkgb3B0aW9ucyBhIHNpbXVsYXRvciBjYW4ndCBzdXBwb3J0IHNob3VsZG4ndCBhcHBlYXIgaW4gdGhlCisgICBvdXRwdXQgb2YgLS1oZWxwLiAgV2hldGhlciB0aGUgc2FtZSB0aGluZyBhcHBsaWVzIHRvIG9wdGlvbnMgdGhhdCBoYXZlbid0CisgICBiZWVuIGNvbmZpZ3VyZWQgaW4gb3Igbm90IGlzbid0IHNvbWV0aGluZyBJIGNhbiBnZXQgd29ya2VkIHVwIG92ZXIuCisgICBbTm90ZSB0aGF0IGNvbmRpdGlvbmFsbHkgY29tcGlsaW5nIHRoZW0gb3V0IG1pZ2h0IHNpbXBseSBpbnZvbHZlIG1vdmluZworICAgdGhlIG9wdGlvbiB0byBhbm90aGVyIHRhYmxlLl0KKyAgIElmIHlvdSBkZWNpZGUgdG8gY29uZGl0aW9uYWxseSBjb21waWxlIHRoZW0gb3V0IGFzIHdlbGwsIGRlbGV0ZSB0aGlzCisgICBjb21tZW50IGFuZCBhZGQgYSBjb21tZW50IHNheWluZyB0aGF0IHRoYXQgaXMgdGhlIHJ1bGUuICAqLworCit0eXBlZGVmIGVudW0geworICBPUFRJT05fREVCVUdfSU5TTiA9IE9QVElPTl9TVEFSVCwKKyAgT1BUSU9OX0RFQlVHX0ZJTEUsCisgIE9QVElPTl9ET19DT01NQU5ELAorICBPUFRJT05fQVJDSElURUNUVVJFLAorICBPUFRJT05fVEFSR0VULAorICBPUFRJT05fQVJDSElURUNUVVJFX0lORk8sCisgIE9QVElPTl9FTlZJUk9OTUVOVCwKKyAgT1BUSU9OX0FMSUdOTUVOVCwKKyAgT1BUSU9OX1ZFUkJPU0UsCisjaWYgZGVmaW5lZCAoU0lNX0hBVkVfQklFTkRJQU4pCisgIE9QVElPTl9FTkRJQU4sCisjZW5kaWYKKyAgT1BUSU9OX0RFQlVHLAorI2lmZGVmIFNJTV9IQVZFX0ZMQVRNRU0KKyAgT1BUSU9OX01FTV9TSVpFLAorI2VuZGlmCisgIE9QVElPTl9IRUxQLAorI2lmZGVmIFNJTV9IODMwMCAvKiBGSVhNRTogU2hvdWxkIGJlIG1vdmFibGUgdG8gaDgzMDAgZGlyLiAgKi8KKyAgT1BUSU9OX0g4MzAwLAorI2VuZGlmCit9IFNUQU5EQVJEX09QVElPTlM7CisKK3N0YXRpYyBjb25zdCBPUFRJT04gc3RhbmRhcmRfb3B0aW9uc1tdID0KK3sKKyAgeyB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUkJPU0V9LAorICAgICAgJ3YnLCBOVUxMLCAiVmVyYm9zZSBvdXRwdXQiLAorICAgICAgc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIgfSwKKworI2lmIGRlZmluZWQgKFNJTV9IQVZFX0JJRU5ESUFOKSAvKiA/Pz8gJiYgV0lUSF9UQVJHRVRfQllURV9PUkRFUiA9PSAwICovCisgIHsgeyJlbmRpYW4iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VORElBTn0sCisgICAgICAnRScsICJiaWd8bGl0dGxlIiwgIlNldCBlbmRpYW5uZXNzIiwKKyAgICAgIHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyIH0sCisjZW5kaWYKKworI2lmZGVmIFNJTV9IQVZFX0VOVklST05NRU5UCisgIC8qIFRoaXMgb3B0aW9uIGlzbid0IHN1cHBvcnRlZCB1bmxlc3MgYWxsIGNob2ljZXMgYXJlIHN1cHBvcnRlZCBpbiBrZWVwaW5nCisgICAgIHdpdGggdGhlIGdvYWwgb2Ygbm90IHByaW50aW5nIGluIC0taGVscCBvdXRwdXQgdGhpbmdzIHRoZSBzaW11bGF0b3IgY2FuJ3QKKyAgICAgZG8gW2FzIG9wcG9zZWQgdG8gdGhpbmdzIHRoYXQganVzdCBoYXZlbid0IGJlZW4gY29uZmlndXJlZCBpbl0uICAqLworICB7IHsiZW52aXJvbm1lbnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VOVklST05NRU5UfSwKKyAgICAgICdcMCcsICJ1c2VyfHZpcnR1YWx8b3BlcmF0aW5nIiwgIlNldCBydW5uaW5nIGVudmlyb25tZW50IiwKKyAgICAgIHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyIH0sCisjZW5kaWYKKworICB7IHsiYWxpZ25tZW50IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BTElHTk1FTlR9LAorICAgICAgJ1wwJywgInN0cmljdHxub25zdHJpY3R8Zm9yY2VkIiwgIlNldCBtZW1vcnkgYWNjZXNzIGFsaWdubWVudCIsCisgICAgICBzdGFuZGFyZF9vcHRpb25faGFuZGxlciB9LAorCisgIHsgeyJkZWJ1ZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fREVCVUd9LAorICAgICAgJ0QnLCBOVUxMLCAiUHJpbnQgZGVidWdnaW5nIG1lc3NhZ2VzIiwKKyAgICAgIHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyIH0sCisgIHsgeyJkZWJ1Zy1pbnNuIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ERUJVR19JTlNOfSwKKyAgICAgICdcMCcsIE5VTEwsICJQcmludCBpbnN0cnVjdGlvbiBkZWJ1Z2dpbmcgbWVzc2FnZXMiLAorICAgICAgc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIgfSwKKyAgeyB7ImRlYnVnLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RFQlVHX0ZJTEV9LAorICAgICAgJ1wwJywgIkZJTEUgTkFNRSIsICJTcGVjaWZ5IGRlYnVnZ2luZyBvdXRwdXQgZmlsZSIsCisgICAgICBzdGFuZGFyZF9vcHRpb25faGFuZGxlciB9LAorCisjaWZkZWYgU0lNX0g4MzAwIC8qIEZJWE1FOiBTaG91bGQgYmUgbW92YWJsZSB0byBoODMwMCBkaXIuICAqLworICB7IHsiaDgzMDBoIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IODMwMH0sCisgICAgICAnaCcsIE5VTEwsICJJbmRpY2F0ZSB0aGUgQ1BVIGlzIGg4LzMwMGggb3IgaDgvMzAwcyIsCisgICAgICBzdGFuZGFyZF9vcHRpb25faGFuZGxlciB9LAorI2VuZGlmCisKKyNpZmRlZiBTSU1fSEFWRV9GTEFUTUVNCisgIHsgeyJtZW0tc2l6ZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUVNX1NJWkV9LAorICAgICAgJ20nLCAiTUVNT1JZIFNJWkUiLCAiU3BlY2lmeSBtZW1vcnkgc2l6ZSIsCisgICAgICBzdGFuZGFyZF9vcHRpb25faGFuZGxlciB9LAorI2VuZGlmCisKKyAgeyB7ImRvLWNvbW1hbmQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RPX0NPTU1BTkR9LAorICAgICAgJ1wwJywgIkNPTU1BTkQiLCAiIi8qdW5kb2N1bWVudGVkKi8sCisgICAgICBzdGFuZGFyZF9vcHRpb25faGFuZGxlciB9LAorCisgIHsgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IRUxQfSwKKyAgICAgICdIJywgTlVMTCwgIlByaW50IGhlbHAgaW5mb3JtYXRpb24iLAorICAgICAgc3RhbmRhcmRfb3B0aW9uX2hhbmRsZXIgfSwKKworICB7IHsiYXJjaGl0ZWN0dXJlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BUkNISVRFQ1RVUkV9LAorICAgICAgJ1wwJywgIk1BQ0hJTkUiLCAiU3BlY2lmeSB0aGUgYXJjaGl0ZWN0dXJlIHRvIHVzZSIsCisgICAgICBzdGFuZGFyZF9vcHRpb25faGFuZGxlciB9LAorICB7IHsiYXJjaGl0ZWN0dXJlLWluZm8iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FSQ0hJVEVDVFVSRV9JTkZPfSwKKyAgICAgICdcMCcsIE5VTEwsICJMaXN0IHN1cHBvcnRlZCBhcmNoaXRlY3R1cmVzIiwKKyAgICAgIHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyIH0sCisgIHsgeyJpbmZvLWFyY2hpdGVjdHVyZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQVJDSElURUNUVVJFX0lORk99LAorICAgICAgJ1wwJywgTlVMTCwgTlVMTCwKKyAgICAgIHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyIH0sCisKKyAgeyB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVEFSR0VUfSwKKyAgICAgICdcMCcsICJCRkROQU1FIiwgIlNwZWNpZnkgdGhlIG9iamVjdC1jb2RlIGZvcm1hdCBmb3IgdGhlIG9iamVjdCBmaWxlcyIsCisgICAgICBzdGFuZGFyZF9vcHRpb25faGFuZGxlciB9LAorCisgIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfSwgJ1wwJywgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCitzdGF0aWMgU0lNX1JDCitzdGFuZGFyZF9vcHRpb25faGFuZGxlciAoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgaW50IG9wdCwKKwkJCSBjaGFyICphcmcsIGludCBpc19jb21tYW5kKQoreworICBpbnQgaSxuOworCisgIHN3aXRjaCAoKFNUQU5EQVJEX09QVElPTlMpIG9wdCkKKyAgICB7CisgICAgY2FzZSBPUFRJT05fVkVSQk9TRToKKyAgICAgIFNUQVRFX1ZFUkJPU0VfUCAoc2QpID0gMTsKKyAgICAgIGJyZWFrOworCisjaWZkZWYgU0lNX0hBVkVfQklFTkRJQU4KKyAgICBjYXNlIE9QVElPTl9FTkRJQU46CisgICAgICBpZiAoc3RyY21wIChhcmcsICJiaWciKSA9PSAwKQorCXsKKwkgIGlmIChXSVRIX1RBUkdFVF9CWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4pCisJICAgIHsKKwkgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJTaW11bGF0b3IgY29tcGlsZWQgZm9yIGxpdHRsZSBlbmRpYW4gb25seS5cbiIpOworCSAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKwkgICAgfQorCSAgLyogRklYTUU6d2lwOiBOZWVkIHRvIHNldCBzb21ldGhpbmcgaW4gU1RBVEVfQ09ORklHLiAgKi8KKwkgIGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIgPSBCSUdfRU5ESUFOOworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibGl0dGxlIikgPT0gMCkKKwl7CisJICBpZiAoV0lUSF9UQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQorCSAgICB7CisJICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiU2ltdWxhdG9yIGNvbXBpbGVkIGZvciBiaWcgZW5kaWFuIG9ubHkuXG4iKTsKKwkgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisJICAgIH0KKwkgIC8qIEZJWE1FOndpcDogTmVlZCB0byBzZXQgc29tZXRoaW5nIGluIFNUQVRFX0NPTkZJRy4gICovCisJICBjdXJyZW50X3RhcmdldF9ieXRlX29yZGVyID0gTElUVExFX0VORElBTjsKKwl9CisgICAgICBlbHNlCisJeworCSAgc2ltX2lvX2VwcmludGYgKHNkLCAiSW52YWxpZCBlbmRpYW4gc3BlY2lmaWNhdGlvbiBgJXMnXG4iLCBhcmcpOworCSAgcmV0dXJuIFNJTV9SQ19GQUlMOworCX0KKyAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICBjYXNlIE9QVElPTl9FTlZJUk9OTUVOVDoKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgInVzZXIiKSA9PSAwKQorCVNUQVRFX0VOVklST05NRU5UIChzZCkgPSBVU0VSX0VOVklST05NRU5UOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJ2aXJ0dWFsIikgPT0gMCkKKwlTVEFURV9FTlZJUk9OTUVOVCAoc2QpID0gVklSVFVBTF9FTlZJUk9OTUVOVDsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAib3BlcmF0aW5nIikgPT0gMCkKKwlTVEFURV9FTlZJUk9OTUVOVCAoc2QpID0gT1BFUkFUSU5HX0VOVklST05NRU5UOworICAgICAgZWxzZQorCXsKKwkgIHNpbV9pb19lcHJpbnRmIChzZCwgIkludmFsaWQgZW52aXJvbm1lbnQgc3BlY2lmaWNhdGlvbiBgJXMnXG4iLCBhcmcpOworCSAgcmV0dXJuIFNJTV9SQ19GQUlMOworCX0KKyAgICAgIGlmIChXSVRIX0VOVklST05NRU5UICE9IEFMTF9FTlZJUk9OTUVOVAorCSAgJiYgV0lUSF9FTlZJUk9OTUVOVCAhPSBTVEFURV9FTlZJUk9OTUVOVCAoc2QpKQorCXsKKwkgIGNoYXIgKnR5cGU7CisJICBzd2l0Y2ggKFdJVEhfRU5WSVJPTk1FTlQpCisJICAgIHsKKwkgICAgY2FzZSBVU0VSX0VOVklST05NRU5UOiB0eXBlID0gInVzZXIiOyBicmVhazsKKwkgICAgY2FzZSBWSVJUVUFMX0VOVklST05NRU5UOiB0eXBlID0gInZpcnR1YWwiOyBicmVhazsKKwkgICAgY2FzZSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQ6IHR5cGUgPSAib3BlcmF0aW5nIjsgYnJlYWs7CisJICAgIH0KKwkgIHNpbV9pb19lcHJpbnRmIChzZCwgIlNpbXVsYXRvciBjb21waWxlZCBmb3IgdGhlICVzIGVudmlyb25tZW50IG9ubHkuXG4iLAorCQkJICB0eXBlKTsKKwkgIHJldHVybiBTSU1fUkNfRkFJTDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX0FMSUdOTUVOVDoKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgInN0cmljdCIpID09IDApCisJeworCSAgaWYgKFdJVEhfQUxJR05NRU5UID09IDAgfHwgV0lUSF9BTElHTk1FTlQgPT0gU1RSSUNUX0FMSUdOTUVOVCkKKwkgICAgeworCSAgICAgIGN1cnJlbnRfYWxpZ25tZW50ID0gU1RSSUNUX0FMSUdOTUVOVDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm9uc3RyaWN0IikgPT0gMCkKKwl7CisJICBpZiAoV0lUSF9BTElHTk1FTlQgPT0gMCB8fCBXSVRIX0FMSUdOTUVOVCA9PSBOT05TVFJJQ1RfQUxJR05NRU5UKQorCSAgICB7CisJICAgICAgY3VycmVudF9hbGlnbm1lbnQgPSBOT05TVFJJQ1RfQUxJR05NRU5UOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJmb3JjZWQiKSA9PSAwKQorCXsKKwkgIGlmIChXSVRIX0FMSUdOTUVOVCA9PSAwIHx8IFdJVEhfQUxJR05NRU5UID09IEZPUkNFRF9BTElHTk1FTlQpCisJICAgIHsKKwkgICAgICBjdXJyZW50X2FsaWdubWVudCA9IEZPUkNFRF9BTElHTk1FTlQ7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgc2ltX2lvX2VwcmludGYgKHNkLCAiSW52YWxpZCBhbGlnbm1lbnQgc3BlY2lmaWNhdGlvbiBgJXMnXG4iLCBhcmcpOworCSAgcmV0dXJuIFNJTV9SQ19GQUlMOworCX0KKyAgICAgIHN3aXRjaCAoV0lUSF9BTElHTk1FTlQpCisJeworCWNhc2UgU1RSSUNUX0FMSUdOTUVOVDoKKwkgIHNpbV9pb19lcHJpbnRmIChzZCwgIlNpbXVsYXRvciBjb21waWxlZCBmb3Igc3RyaWN0IGFsaWdubWVudCBvbmx5LlxuIik7CisJICBicmVhazsKKwljYXNlIE5PTlNUUklDVF9BTElHTk1FTlQ6CisJICBzaW1faW9fZXByaW50ZiAoc2QsICJTaW11bGF0b3IgY29tcGlsZWQgZm9yIG5vbnN0cmljdCBhbGlnbm1lbnQgb25seS5cbiIpOworCSAgYnJlYWs7CisJY2FzZSBGT1JDRURfQUxJR05NRU5UOgorCSAgc2ltX2lvX2VwcmludGYgKHNkLCAiU2ltdWxhdG9yIGNvbXBpbGVkIGZvciBmb3JjZWQgYWxpZ25tZW50IG9ubHkuXG4iKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKworICAgIGNhc2UgT1BUSU9OX0RFQlVHOgorICAgICAgaWYgKCEgV0lUSF9ERUJVRykKKwlzaW1faW9fZXByaW50ZiAoc2QsICJEZWJ1Z2dpbmcgbm90IGNvbXBpbGVkIGluLCBgLUQnIGlnbm9yZWRcbiIpOworICAgICAgZWxzZQorCXsKKwkgIGZvciAobiA9IDA7IG4gPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytuKQorCSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0RFQlVHX1ZBTFVFUzsgKytpKQorCSAgICAgIENQVV9ERUJVR19GTEFHUyAoU1RBVEVfQ1BVIChzZCwgbikpW2ldID0gMTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX0RFQlVHX0lOU04gOgorICAgICAgaWYgKCEgV0lUSF9ERUJVRykKKwlzaW1faW9fZXByaW50ZiAoc2QsICJEZWJ1Z2dpbmcgbm90IGNvbXBpbGVkIGluLCBgLS1kZWJ1Zy1pbnNuJyBpZ25vcmVkXG4iKTsKKyAgICAgIGVsc2UKKwl7CisJICBmb3IgKG4gPSAwOyBuIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrbikKKwkgICAgQ1BVX0RFQlVHX0ZMQUdTIChTVEFURV9DUFUgKHNkLCBuKSlbREVCVUdfSU5TTl9JRFhdID0gMTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX0RFQlVHX0ZJTEUgOgorICAgICAgaWYgKCEgV0lUSF9ERUJVRykKKwlzaW1faW9fZXByaW50ZiAoc2QsICJEZWJ1Z2dpbmcgbm90IGNvbXBpbGVkIGluLCBgLS1kZWJ1Zy1maWxlJyBpZ25vcmVkXG4iKTsKKyAgICAgIGVsc2UKKwl7CisJICBGSUxFICpmID0gZm9wZW4gKGFyZywgInciKTsKKworCSAgaWYgKGYgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlVuYWJsZSB0byBvcGVuIGRlYnVnIG91dHB1dCBmaWxlIGAlcydcbiIsIGFyZyk7CisJICAgICAgcmV0dXJuIFNJTV9SQ19GQUlMOworCSAgICB9CisJICBmb3IgKG4gPSAwOyBuIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrbikKKwkgICAgQ1BVX0RFQlVHX0ZJTEUgKFNUQVRFX0NQVSAoc2QsIG4pKSA9IGY7CisJfQorICAgICAgYnJlYWs7CisKKyNpZmRlZiBTSU1fSDgzMDAgLyogRklYTUU6IENhbiBiZSBtb3ZlZCB0byBoODMwMCBkaXIuICAqLworICAgIGNhc2UgT1BUSU9OX0g4MzAwOgorICAgICAgc2V0X2g4MzAwaCAoMSk7CisgICAgICBicmVhazsKKyNlbmRpZgorCisjaWZkZWYgU0lNX0hBVkVfRkxBVE1FTQorICAgIGNhc2UgT1BUSU9OX01FTV9TSVpFOgorICAgICAgeworCXVuc2lnbmVkIGxvbmcgdWwgPSBzdHJ0b2wgKGFyZywgTlVMTCwgMCk7CisJLyogMTYzODQ6IHNvbWUgbWluaW1hbCBhbW91bnQgKi8KKwlpZiAoISBpc2RpZ2l0IChhcmdbMF0pIHx8IHVsIDwgMTYzODQpCisJICB7CisJICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIkludmFsaWQgbWVtb3J5IHNpemUgYCVzJyIsIGFyZyk7CisJICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKwkgIH0KKwlTVEFURV9NRU1fU0laRSAoc2QpID0gdWw7CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgY2FzZSBPUFRJT05fRE9fQ09NTUFORDoKKyAgICAgIHNpbV9kb19jb21tYW5kIChzZCwgYXJnKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fQVJDSElURUNUVVJFOgorICAgICAgeworCWNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICphcCA9IGJmZF9zY2FuX2FyY2ggKGFyZyk7CisJaWYgKGFwID09IE5VTEwpCisJICB7CisJICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIkFyY2hpdGVjdHVyZSBgJXMnIHVua25vd25cbiIsIGFyZyk7CisJICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKwkgIH0KKwlTVEFURV9BUkNISVRFQ1RVUkUgKHNkKSA9IGFwOworCWJyZWFrOworICAgICAgfQorCisgICAgY2FzZSBPUFRJT05fQVJDSElURUNUVVJFX0lORk86CisgICAgICB7CisJY29uc3QgY2hhciAqKmxpc3QgPSBiZmRfYXJjaF9saXN0KCk7CisJY29uc3QgY2hhciAqKmxwOworCWlmIChsaXN0ID09IE5VTEwpCisJICBhYm9ydCAoKTsKKwlzaW1faW9fcHJpbnRmIChzZCwgIlBvc3NpYmxlIGFyY2hpdGVjdHVyZXM6Iik7CisJZm9yIChscCA9IGxpc3Q7ICpscCAhPSBOVUxMOyBscCsrKQorCSAgc2ltX2lvX3ByaW50ZiAoc2QsICIgJXMiLCAqbHApOworCXNpbV9pb19wcmludGYgKHNkLCAiXG4iKTsKKwlmcmVlIChsaXN0KTsKKwlicmVhazsKKyAgICAgIH0KKworICAgIGNhc2UgT1BUSU9OX1RBUkdFVDoKKyAgICAgIHsKKwlTVEFURV9UQVJHRVQgKHNkKSA9IHhzdHJkdXAgKGFyZyk7CisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIE9QVElPTl9IRUxQOgorICAgICAgc2ltX3ByaW50X2hlbHAgKHNkLCBpc19jb21tYW5kKTsKKyAgICAgIGlmIChTVEFURV9PUEVOX0tJTkQgKHNkKSA9PSBTSU1fT1BFTl9TVEFOREFMT05FKQorCWV4aXQgKDApOworICAgICAgLyogRklYTUU6ICd0d291bGQgYmUgbmljZSB0byBkbyBzb21ldGhpbmcgc2ltaWxhciBpZiBnZGIuICAqLworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKKy8qIEFkZCB0aGUgc3RhbmRhcmQgb3B0aW9uIGxpc3QgdG8gdGhlIHNpbXVsYXRvci4gICovCisKK1NJTV9SQworc3RhbmRhcmRfaW5zdGFsbCAoU0lNX0RFU0Mgc2QpCit7CisgIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7CisgIGlmIChzaW1fYWRkX29wdGlvbl90YWJsZSAoc2QsIE5VTEwsIHN0YW5kYXJkX29wdGlvbnMpICE9IFNJTV9SQ19PSykKKyAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKKy8qIFJldHVybiBub24temVybyBpZiBhcmcgaXMgYSBkdXBsaWNhdGUgYXJndW1lbnQuCisgICBJZiBBUkcgaXMgTlVMTCwgaW5pdGlhbGl6ZS4gICovCisKKyNkZWZpbmUgQVJHX0hBU0hfU0laRSA5NworI2RlZmluZSBBUkdfSEFTSChhKSAoKDI1NiAqICh1bnNpZ25lZCBjaGFyKSBhWzBdICsgKHVuc2lnbmVkIGNoYXIpIGFbMV0pICUgQVJHX0hBU0hfU0laRSkKKworc3RhdGljIGludAorZHVwX2FyZ19wIChhcmcpCisgICAgIGNoYXIgKmFyZzsKK3sKKyAgaW50IGhhc2g7CisgIHN0YXRpYyBjaGFyICoqYXJnX3RhYmxlID0gTlVMTDsKKworICBpZiAoYXJnID09IE5VTEwpCisgICAgeworICAgICAgaWYgKGFyZ190YWJsZSA9PSBOVUxMKQorCWFyZ190YWJsZSA9IChjaGFyICoqKSB4bWFsbG9jIChBUkdfSEFTSF9TSVpFICogc2l6ZW9mIChjaGFyICopKTsKKyAgICAgIG1lbXNldCAoYXJnX3RhYmxlLCAwLCBBUkdfSEFTSF9TSVpFICogc2l6ZW9mIChjaGFyICopKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBoYXNoID0gQVJHX0hBU0ggKGFyZyk7CisgIHdoaWxlIChhcmdfdGFibGVbaGFzaF0gIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChhcmcsIGFyZ190YWJsZVtoYXNoXSkgPT0gMCkKKwlyZXR1cm4gMTsKKyAgICAgIC8qIFdlIGFzc3VtZSB0aGVyZSB3b24ndCBiZSBtb3JlIHRoYW4gQVJHX0hBU0hfU0laRSBhcmd1bWVudHMgc28gd2UKKwkgZG9uJ3QgY2hlY2sgaWYgdGhlIHRhYmxlIGlzIGZ1bGwuICAqLworICAgICAgaWYgKCsraGFzaCA9PSBBUkdfSEFTSF9TSVpFKQorCWhhc2ggPSAwOworICAgIH0KKyAgYXJnX3RhYmxlW2hhc2hdID0gYXJnOworICByZXR1cm4gMDsKK30KKyAgICAgCisvKiBDYWxsZWQgYnkgc2ltX29wZW4gdG8gcGFyc2UgdGhlIGFyZ3VtZW50cy4gICovCisKK1NJTV9SQworc2ltX3BhcnNlX2FyZ3MgKHNkLCBhcmd2KQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIGludCBjLCBpLCBhcmdjLCBudW1fb3B0czsKKyAgY2hhciAqcCwgKnNob3J0X29wdGlvbnM7CisgIC8qIFRoZSBgdmFsJyBvcHRpb24gc3RydWN0IGVudHJ5IGlzIGR5bmFtaWNhbGx5IGFzc2lnbmVkIGZvciBvcHRpb25zIHRoYXQKKyAgICAgb25seSBjb21lIGluIHRoZSBsb25nIGZvcm0uICBPUklHX1ZBTCBpcyB1c2VkIHRvIGdldCB0aGUgb3JpZ2luYWwgdmFsdWUKKyAgICAgYmFjay4gICovCisgIGludCAqb3JpZ192YWw7CisgIHN0cnVjdCBvcHRpb24gKmxwLCAqbG9uZ19vcHRpb25zOworICBjb25zdCBzdHJ1Y3Qgb3B0aW9uX2xpc3QgKm9sOworICBjb25zdCBPUFRJT04gKm9wdDsKKyAgT1BUSU9OX0hBTkRMRVIgKipoYW5kbGVyczsKKyAgc2ltX2NwdSAqKm9wdF9jcHU7CisKKyAgLyogQ291bnQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuICAqLworICBmb3IgKGFyZ2MgPSAwOyBhcmd2W2FyZ2NdICE9IE5VTEw7ICsrYXJnYykKKyAgICBjb250aW51ZTsKKworICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIG9wdGlvbnMuICAqLworICBudW1fb3B0cyA9IDA7CisgIGZvciAob2wgPSBTVEFURV9PUFRJT05TIChzZCk7IG9sICE9IE5VTEw7IG9sID0gb2wtPm5leHQpCisgICAgZm9yIChvcHQgPSBvbC0+b3B0aW9uczsgT1BUSU9OX1ZBTElEX1AgKG9wdCk7ICsrb3B0KQorICAgICAgKytudW1fb3B0czsKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2kpCisgICAgZm9yIChvbCA9IENQVV9PUFRJT05TIChTVEFURV9DUFUgKHNkLCBpKSk7IG9sICE9IE5VTEw7IG9sID0gb2wtPm5leHQpCisgICAgICBmb3IgKG9wdCA9IG9sLT5vcHRpb25zOyBPUFRJT05fVkFMSURfUCAob3B0KTsgKytvcHQpCisJKytudW1fb3B0czsKKworICAvKiBJbml0aWFsaXplIGR1cGxpY2F0ZSBhcmd1bWVudCBjaGVja2VyLiAgKi8KKyAgKHZvaWQpIGR1cF9hcmdfcCAoTlVMTCk7CisKKyAgLyogQnVpbGQgdGhlIG9wdGlvbiB0YWJsZSBmb3IgZ2V0b3B0LiAgKi8KKworICBsb25nX29wdGlvbnMgPSBOWkFMTE9DIChzdHJ1Y3Qgb3B0aW9uLCBudW1fb3B0cyArIDEpOworICBscCA9IGxvbmdfb3B0aW9uczsKKyAgc2hvcnRfb3B0aW9ucyA9IE5aQUxMT0MgKGNoYXIsIG51bV9vcHRzICogMyArIDEpOworICBwID0gc2hvcnRfb3B0aW9uczsKKyAgaGFuZGxlcnMgPSBOWkFMTE9DIChPUFRJT05fSEFORExFUiAqLCBPUFRJT05fU1RBUlQgKyBudW1fb3B0cyk7CisgIG9yaWdfdmFsID0gTlpBTExPQyAoaW50LCBPUFRJT05fU1RBUlQgKyBudW1fb3B0cyk7CisgIG9wdF9jcHUgPSBOWkFMTE9DIChzaW1fY3B1ICosIE9QVElPTl9TVEFSVCArIG51bV9vcHRzKTsKKworICAvKiBTZXQgJysnIGFzIGZpcnN0IGNoYXIgc28gYXJndW1lbnQgcGVybXV0YXRpb24gaXNuJ3QgZG9uZS4gIFRoaXMKKyAgICAgaXMgZG9uZSB0byBzdG9wIGdldG9wdF9sb25nIHJldHVybmluZyBvcHRpb25zIHRoYXQgYXBwZWFyIGFmdGVyCisgICAgIHRoZSB0YXJnZXQgcHJvZ3JhbS4gIFN1Y2ggb3B0aW9ucyBzaG91bGQgYmUgcGFzc2VkIHVuY2hhbmdlZCBpbnRvCisgICAgIHRoZSBwcm9ncmFtIGltYWdlLiAqLworICAqcCsrID0gJysnOworCisgIGZvciAoaSA9IE9QVElPTl9TVEFSVCwgb2wgPSBTVEFURV9PUFRJT05TIChzZCk7IG9sICE9IE5VTEw7IG9sID0gb2wtPm5leHQpCisgICAgZm9yIChvcHQgPSBvbC0+b3B0aW9uczsgT1BUSU9OX1ZBTElEX1AgKG9wdCk7ICsrb3B0KQorICAgICAgeworCWlmIChkdXBfYXJnX3AgKG9wdC0+b3B0Lm5hbWUpKQorCSAgY29udGludWU7CisJaWYgKG9wdC0+c2hvcnRvcHQgIT0gMCkKKwkgIHsKKwkgICAgKnArKyA9IG9wdC0+c2hvcnRvcHQ7CisJICAgIGlmIChvcHQtPm9wdC5oYXNfYXJnID09IHJlcXVpcmVkX2FyZ3VtZW50KQorCSAgICAgICpwKysgPSAnOic7CisJICAgIGVsc2UgaWYgKG9wdC0+b3B0Lmhhc19hcmcgPT0gb3B0aW9uYWxfYXJndW1lbnQpCisJICAgICAgeyAqcCsrID0gJzonOyAqcCsrID0gJzonOyB9CisJICAgIGhhbmRsZXJzWyh1bnNpZ25lZCBjaGFyKSBvcHQtPnNob3J0b3B0XSA9IG9wdC0+aGFuZGxlcjsKKwkgICAgaWYgKG9wdC0+b3B0LnZhbCAhPSAwKQorCSAgICAgIG9yaWdfdmFsWyh1bnNpZ25lZCBjaGFyKSBvcHQtPnNob3J0b3B0XSA9IG9wdC0+b3B0LnZhbDsKKwkgICAgZWxzZQorCSAgICAgIG9yaWdfdmFsWyh1bnNpZ25lZCBjaGFyKSBvcHQtPnNob3J0b3B0XSA9IG9wdC0+c2hvcnRvcHQ7CisJICB9CisJaWYgKG9wdC0+b3B0Lm5hbWUgIT0gTlVMTCkKKwkgIHsKKwkgICAgKmxwID0gb3B0LT5vcHQ7CisJICAgIC8qIER5bmFtaWNhbGx5IGFzc2lnbiBgdmFsJyBudW1iZXJzIGZvciBsb25nIG9wdGlvbnMuICovCisJICAgIGxwLT52YWwgPSBpKys7CisJICAgIGhhbmRsZXJzW2xwLT52YWxdID0gb3B0LT5oYW5kbGVyOworCSAgICBvcmlnX3ZhbFtscC0+dmFsXSA9IG9wdC0+b3B0LnZhbDsKKwkgICAgb3B0X2NwdVtscC0+dmFsXSA9IE5VTEw7CisJICAgICsrbHA7CisJICB9CisgICAgICB9CisKKyAgZm9yIChjID0gMDsgYyA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2MpCisgICAgeworICAgICAgc2ltX2NwdSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgYyk7CisgICAgICBmb3IgKG9sID0gQ1BVX09QVElPTlMgKGNwdSk7IG9sICE9IE5VTEw7IG9sID0gb2wtPm5leHQpCisJZm9yIChvcHQgPSBvbC0+b3B0aW9uczsgT1BUSU9OX1ZBTElEX1AgKG9wdCk7ICsrb3B0KQorCSAgeworI2lmIDAgLyogRWFjaCBvcHRpb24gaXMgcHJlcGVuZGVkIHdpdGggLS08Y3B1bmFtZT4tIHNvIHRoaXMgZ3JlYXRseSBjdXRzIGRvd24KKwkgb24gdGhlIG5lZWQgZm9yIGR1cF9hcmdfcCBjaGVja2luZy4gIE1heWJlIGluIHRoZSBmdXR1cmUgaXQnbGwgYmUKKwkgbmVlZGVkIHNvIHRoaXMgaXMganVzdCBjb21tZW50ZWQgb3V0LCBhbmQgbm90IGRlbGV0ZWQuICAqLworCSAgICBpZiAoZHVwX2FyZ19wIChvcHQtPm9wdC5uYW1lKSkKKwkgICAgICBjb250aW51ZTsKKyNlbmRpZgorCSAgICAvKiBEb24ndCBhbGxvdyBzaG9ydCB2ZXJzaW9ucyBvZiBjcHUgc3BlY2lmaWMgb3B0aW9ucyBmb3Igbm93LiAgKi8KKwkgICAgaWYgKG9wdC0+c2hvcnRvcHQgIT0gMCkKKwkgICAgICB7CisJCXNpbV9pb19lcHJpbnRmIChzZCwgImludGVybmFsIGVycm9yLCBzaG9ydCBjcHUgc3BlY2lmaWMgb3B0aW9uIik7CisJCXJldHVybiBTSU1fUkNfRkFJTDsKKwkgICAgICB9CisJICAgIGlmIChvcHQtPm9wdC5uYW1lICE9IE5VTEwpCisJICAgICAgeworCQljaGFyICpuYW1lOworCQkqbHAgPSBvcHQtPm9wdDsKKwkJLyogUHJlcGVuZCAtLTxjcHVuYW1lPi0gdG8gdGhlIG9wdGlvbi4gICovCisJCWFzcHJpbnRmICgmbmFtZSwgIiVzLSVzIiwgQ1BVX05BTUUgKGNwdSksIGxwLT5uYW1lKTsKKwkJbHAtPm5hbWUgPSBuYW1lOworCQkvKiBEeW5hbWljYWxseSBhc3NpZ24gYHZhbCcgbnVtYmVycyBmb3IgbG9uZyBvcHRpb25zLiAqLworCQlscC0+dmFsID0gaSsrOworCQloYW5kbGVyc1tscC0+dmFsXSA9IG9wdC0+aGFuZGxlcjsKKwkJb3JpZ192YWxbbHAtPnZhbF0gPSBvcHQtPm9wdC52YWw7CisJCW9wdF9jcHVbbHAtPnZhbF0gPSBjcHU7CisJCSsrbHA7CisJICAgICAgfQorCSAgfQorICAgIH0KKwkgICAgCisgIC8qIFRlcm1pbmF0ZSB0aGUgc2hvcnQgYW5kIGxvbmcgb3B0aW9uIGxpc3RzLiAgKi8KKyAgKnAgPSAwOworICBscC0+bmFtZSA9IE5VTEw7CisKKyAgLyogRW5zdXJlIGdldG9wdCBpcyBpbml0aWFsaXplZC4gICovCisgIG9wdGluZCA9IDA7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaW50IGxvbmdpbmQsIG9wdGM7CisKKyAgICAgIG9wdGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgc2hvcnRfb3B0aW9ucywgbG9uZ19vcHRpb25zLCAmbG9uZ2luZCk7CisgICAgICBpZiAob3B0YyA9PSAtMSkKKwl7CisJICBpZiAoU1RBVEVfT1BFTl9LSU5EIChzZCkgPT0gU0lNX09QRU5fU1RBTkRBTE9ORSkKKwkgICAgU1RBVEVfUFJPR19BUkdWIChzZCkgPSBkdXBhcmd2IChhcmd2ICsgb3B0aW5kKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGlmIChvcHRjID09ICc/JykKKwlyZXR1cm4gU0lNX1JDX0ZBSUw7CisKKyAgICAgIGlmICgoKmhhbmRsZXJzW29wdGNdKSAoc2QsIG9wdF9jcHVbb3B0Y10sIG9yaWdfdmFsW29wdGNdLCBvcHRhcmcsIDAvKiFpc19jb21tYW5kKi8pID09IFNJTV9SQ19GQUlMKQorCXJldHVybiBTSU1fUkNfRkFJTDsKKyAgICB9CisKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworLyogVXRpbGl0eSBvZiBzaW1fcHJpbnRfaGVscCB0byBwcmludCBhIGxpc3Qgb2Ygb3B0aW9uIHRhYmxlcy4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF9oZWxwIChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBjb25zdCBzdHJ1Y3Qgb3B0aW9uX2xpc3QgKm9sLCBpbnQgaXNfY29tbWFuZCkKK3sKKyAgY29uc3QgT1BUSU9OICpvcHQ7CisKKyAgZm9yICggOyBvbCAhPSBOVUxMOyBvbCA9IG9sLT5uZXh0KQorICAgIGZvciAob3B0ID0gb2wtPm9wdGlvbnM7IE9QVElPTl9WQUxJRF9QIChvcHQpOyArK29wdCkKKyAgICAgIHsKKwljb25zdCBpbnQgaW5kZW50ID0gMzA7CisJaW50IGNvbW1hLCBsZW47CisJY29uc3QgT1BUSU9OICpvOworCisJaWYgKGR1cF9hcmdfcCAob3B0LT5vcHQubmFtZSkpCisJICBjb250aW51ZTsKKworCWlmIChvcHQtPmRvYyA9PSBOVUxMKQorCSAgY29udGludWU7CisKKwlpZiAob3B0LT5kb2NfbmFtZSAhPSBOVUxMICYmIG9wdC0+ZG9jX25hbWUgWzBdID09ICdcMCcpCisJICBjb250aW51ZTsKKworCXNpbV9pb19wcmludGYgKHNkLCAiICAiKTsKKworCWNvbW1hID0gMDsKKwlsZW4gPSAyOworCisJLyogbGlzdCBhbnkgc2hvcnQgb3B0aW9ucyAoYWxpYXNlcykgZm9yIHRoZSBjdXJyZW50IE9QVCAqLworCWlmICghaXNfY29tbWFuZCkKKwkgIHsKKwkgICAgbyA9IG9wdDsKKwkgICAgZG8KKwkgICAgICB7CisJCWlmIChvLT5zaG9ydG9wdCAhPSAnXDAnKQorCQkgIHsKKwkJICAgIHNpbV9pb19wcmludGYgKHNkLCAiJXMtJWMiLCBjb21tYSA/ICIsICIgOiAiIiwgby0+c2hvcnRvcHQpOworCQkgICAgbGVuICs9IChjb21tYSA/IDIgOiAwKSArIDI7CisJCSAgICBpZiAoby0+YXJnICE9IE5VTEwpCisJCSAgICAgIHsKKwkJCWlmIChvLT5vcHQuaGFzX2FyZyA9PSBvcHRpb25hbF9hcmd1bWVudCkKKwkJCSAgeworCQkJICAgIHNpbV9pb19wcmludGYgKHNkLCAiWyVzXSIsIG8tPmFyZyk7CisJCQkgICAgbGVuICs9IDEgKyBzdHJsZW4gKG8tPmFyZykgKyAxOworCQkJICB9CisJCQllbHNlCisJCQkgIHsKKwkJCSAgICBzaW1faW9fcHJpbnRmIChzZCwgIiAlcyIsIG8tPmFyZyk7CisJCQkgICAgbGVuICs9IDEgKyBzdHJsZW4gKG8tPmFyZyk7CisJCQkgIH0KKwkJICAgICAgfQorCQkgICAgY29tbWEgPSAxOworCQkgIH0KKwkJKytvOworCSAgICAgIH0KKwkgICAgd2hpbGUgKE9QVElPTl9WQUxJRF9QIChvKSAmJiBvLT5kb2MgPT0gTlVMTCk7CisJICB9CisJCisJLyogbGlzdCBhbnkgbG9uZyBvcHRpb25zIChhbGlhc2VzKSBmb3IgdGhlIGN1cnJlbnQgT1BUICovCisJbyA9IG9wdDsKKwlkbworCSAgeworCSAgICBjb25zdCBjaGFyICpuYW1lOworCSAgICBjb25zdCBjaGFyICpjcHVfcHJlZml4ID0gY3B1ID8gQ1BVX05BTUUgKGNwdSkgOiBOVUxMOworCSAgICBpZiAoby0+ZG9jX25hbWUgIT0gTlVMTCkKKwkgICAgICBuYW1lID0gby0+ZG9jX25hbWU7CisJICAgIGVsc2UKKwkgICAgICBuYW1lID0gby0+b3B0Lm5hbWU7CisJICAgIGlmIChuYW1lICE9IE5VTEwpCisJICAgICAgeworCQlzaW1faW9fcHJpbnRmIChzZCwgIiVzJXMlcyVzJXMiLAorCQkJICAgICAgIGNvbW1hID8gIiwgIiA6ICIiLAorCQkJICAgICAgIGlzX2NvbW1hbmQgPyAiIiA6ICItLSIsCisJCQkgICAgICAgY3B1ID8gY3B1X3ByZWZpeCA6ICIiLAorCQkJICAgICAgIGNwdSA/ICItIiA6ICIiLAorCQkJICAgICAgIG5hbWUpOworCQlsZW4gKz0gKChjb21tYSA/IDIgOiAwKQorCQkJKyAoaXNfY29tbWFuZCA/IDAgOiAyKQorCQkJKyBzdHJsZW4gKG5hbWUpKTsKKwkJaWYgKG8tPmFyZyAhPSBOVUxMKQorCQkgIHsKKwkJICAgIGlmIChvLT5vcHQuaGFzX2FyZyA9PSBvcHRpb25hbF9hcmd1bWVudCkKKwkJICAgICAgeworCQkJc2ltX2lvX3ByaW50ZiAoc2QsICIgWyVzXSIsIG8tPmFyZyk7CisJCQlsZW4gKz0gMiArIHN0cmxlbiAoby0+YXJnKSArIDE7CisJCSAgICAgIH0KKwkJICAgIGVsc2UKKwkJICAgICAgeworCQkJc2ltX2lvX3ByaW50ZiAoc2QsICIgJXMiLCBvLT5hcmcpOworCQkJbGVuICs9IDEgKyBzdHJsZW4gKG8tPmFyZyk7CisJCSAgICAgIH0KKwkJICB9CisJCWNvbW1hID0gMTsKKwkgICAgICB9CisJICAgICsrbzsKKwkgIH0KKwl3aGlsZSAoT1BUSU9OX1ZBTElEX1AgKG8pICYmIG8tPmRvYyA9PSBOVUxMKTsKKworCWlmIChsZW4gPj0gaW5kZW50KQorCSAgeworCSAgICBzaW1faW9fcHJpbnRmIChzZCwgIlxuJSpzIiwgaW5kZW50LCAiIik7CisJICB9CisJZWxzZQorCSAgc2ltX2lvX3ByaW50ZiAoc2QsICIlKnMiLCBpbmRlbnQgLSBsZW4sICIiKTsKKworCS8qIHByaW50IHRoZSBkZXNjcmlwdGlvbiwgd29yZCB3cmFwIGxvbmcgbGluZXMgKi8KKwl7CisJICBjb25zdCBjaGFyICpjaHAgPSBvcHQtPmRvYzsKKwkgIHVuc2lnbmVkIGRvY193aWR0aCA9IDgwIC0gaW5kZW50OworCSAgd2hpbGUgKHN0cmxlbiAoY2hwKSA+PSBkb2Nfd2lkdGgpIC8qIHNvbWUgc2xhY2sgKi8KKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgKmVuZCA9IGNocCArIGRvY193aWR0aCAtIDE7CisJICAgICAgd2hpbGUgKGVuZCA+IGNocCAmJiAhaXNzcGFjZSAoKmVuZCkpCisJCWVuZCAtLTsKKwkgICAgICBpZiAoZW5kID09IGNocCkKKwkJZW5kID0gY2hwICsgZG9jX3dpZHRoIC0gMTsKKwkgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIiUuKnNcbiUqcyIsIGVuZCAtIGNocCwgY2hwLCBpbmRlbnQsICIiKTsKKwkgICAgICBjaHAgPSBlbmQ7CisJICAgICAgd2hpbGUgKGlzc3BhY2UgKCpjaHApICYmICpjaHAgIT0gJ1wwJykKKwkJY2hwKys7CisJICAgIH0KKwkgIHNpbV9pb19wcmludGYgKHNkLCAiJXNcbiIsIGNocCk7CisJfQorICAgICAgfQorfQorCisvKiBQcmludCBoZWxwIG1lc3NhZ2VzIGZvciB0aGUgb3B0aW9ucy4gICovCisKK3ZvaWQKK3NpbV9wcmludF9oZWxwIChzZCwgaXNfY29tbWFuZCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCBpc19jb21tYW5kOworeworICBpZiAoU1RBVEVfT1BFTl9LSU5EIChzZCkgPT0gU0lNX09QRU5fU1RBTkRBTE9ORSkKKyAgICBzaW1faW9fcHJpbnRmIChzZCwgIlVzYWdlOiAlcyBbb3B0aW9uc10gcHJvZ3JhbSBbcHJvZ3JhbSBhcmdzXVxuIiwKKwkJICAgU1RBVEVfTVlfTkFNRSAoc2QpKTsKKworICAvKiBJbml0aWFsaXplIGR1cGxpY2F0ZSBhcmd1bWVudCBjaGVja2VyLiAgKi8KKyAgKHZvaWQpIGR1cF9hcmdfcCAoTlVMTCk7CisKKyAgaWYgKFNUQVRFX09QRU5fS0lORCAoc2QpID09IFNJTV9PUEVOX1NUQU5EQUxPTkUpCisgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJPcHRpb25zOlxuIik7CisgIGVsc2UKKyAgICBzaW1faW9fcHJpbnRmIChzZCwgIkNvbW1hbmRzOlxuIik7CisKKyAgcHJpbnRfaGVscCAoc2QsIE5VTEwsIFNUQVRFX09QVElPTlMgKHNkKSwgaXNfY29tbWFuZCk7CisgIHNpbV9pb19wcmludGYgKHNkLCAiXG4iKTsKKworICAvKiBQcmludCBjcHUtc3BlY2lmaWMgb3B0aW9ucy4gICovCisgIHsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytpKQorICAgICAgeworCXNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIGkpOworCWlmIChDUFVfT1BUSU9OUyAoY3B1KSA9PSBOVUxMKQorCSAgY29udGludWU7CisJc2ltX2lvX3ByaW50ZiAoc2QsICJDUFUgJXMgc3BlY2lmaWMgb3B0aW9uczpcbiIsIENQVV9OQU1FIChjcHUpKTsKKwlwcmludF9oZWxwIChzZCwgY3B1LCBDUFVfT1BUSU9OUyAoY3B1KSwgaXNfY29tbWFuZCk7CisJc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOworICAgICAgfQorICB9CisKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICJOb3RlOiBEZXBlbmRpbmcgb24gdGhlIHNpbXVsYXRvciBjb25maWd1cmF0aW9uIHNvbWUgJXNzXG4iLAorCQkgU1RBVEVfT1BFTl9LSU5EIChzZCkgPT0gU0lNX09QRU5fU1RBTkRBTE9ORSA/ICJvcHRpb24iIDogImNvbW1hbmQiKTsKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICIgICAgICBtYXkgbm90IGJlIGFwcGxpY2FibGVcbiIpOworCisgIGlmIChTVEFURV9PUEVOX0tJTkQgKHNkKSA9PSBTSU1fT1BFTl9TVEFOREFMT05FKQorICAgIHsKKyAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiXG4iKTsKKyAgICAgIHNpbV9pb19wcmludGYgKHNkLCAicHJvZ3JhbSBhcmdzICAgIEFyZ3VtZW50cyB0byBwYXNzIHRvIHNpbXVsYXRlZCBwcm9ncmFtLlxuIik7CisgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIiAgICAgICAgICAgICAgICBOb3RlOiBWZXJ5IGZldyBzaW11bGF0b3JzIHN1cHBvcnQgdGhpcy5cbiIpOworICAgIH0KK30KKworLyogVXRpbGl0eSBvZiBzaW1fYXJnc19jb21tYW5kIHRvIGZpbmQgdGhlIGNsb3Nlc3QgbWF0Y2ggZm9yIGEgY29tbWFuZC4KKyAgIENvbW1hbmRzIHRoYXQgaGF2ZSAiLSIgaW4gdGhlbSBjYW4gYmUgc3BlY2lmaWVkIGFzIHNlcGFyYXRlIHdvcmRzLgorICAgZS5nLiBzaW0gbWVtb3J5LXJlZ2lvbiAweDgwMDAwMCwweDQwMDAKKyAgIG9yICAgc2ltIG1lbW9yeSByZWdpb24gMHg4MDAwMDAsMHg0MDAwCisgICBJZiBDUFUgaXMgbm9uLW51bGwsIHVzZSBpdHMgb3B0aW9uIHRhYmxlIGxpc3QsIG90aGVyd2lzZSB1c2UgdGhlIG1haW4gb25lLgorICAgKlBBUkdJIGlzIHdoZXJlIHRvIHN0YXJ0IGxvb2tpbmcgaW4gQVJHVi4gIEl0IGlzIHVwZGF0ZWQgdG8gcG9pbnQgcGFzdAorICAgdGhlIGZvdW5kIG9wdGlvbi4gICovCisKK3N0YXRpYyBjb25zdCBPUFRJT04gKgorZmluZF9tYXRjaCAoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgY2hhciAqYXJndltdLCBpbnQgKnBhcmdpKQoreworICBjb25zdCBzdHJ1Y3Qgb3B0aW9uX2xpc3QgKm9sOworICBjb25zdCBPUFRJT04gKm9wdDsKKyAgLyogbW9zdCByZWNlbnQgb3B0aW9uIG1hdGNoICovCisgIGNvbnN0IE9QVElPTiAqbWF0Y2hpbmdfb3B0ID0gTlVMTDsKKyAgaW50IG1hdGNoaW5nX2FyZ2kgPSAtMTsKKworICBpZiAoY3B1KQorICAgIG9sID0gQ1BVX09QVElPTlMgKGNwdSk7CisgIGVsc2UKKyAgICBvbCA9IFNUQVRFX09QVElPTlMgKHNkKTsKKworICAvKiBTa2lwIHBhc3NlZCBlbGVtZW50cyBzcGVjaWZpZWQgYnkgKlBBUkdJLiAgKi8KKyAgYXJndiArPSAqcGFyZ2k7CisKKyAgZm9yICggOyBvbCAhPSBOVUxMOyBvbCA9IG9sLT5uZXh0KQorICAgIGZvciAob3B0ID0gb2wtPm9wdGlvbnM7IE9QVElPTl9WQUxJRF9QIChvcHQpOyArK29wdCkKKyAgICAgIHsKKwlpbnQgYXJnaSA9IDA7CisJY29uc3QgY2hhciAqbmFtZSA9IG9wdC0+b3B0Lm5hbWU7CisJaWYgKG5hbWUgPT0gTlVMTCkKKwkgIGNvbnRpbnVlOworCXdoaWxlIChhcmd2IFthcmdpXSAhPSBOVUxMCisJICAgICAgICYmIHN0cm5jbXAgKG5hbWUsIGFyZ3YgW2FyZ2ldLCBzdHJsZW4gKGFyZ3YgW2FyZ2ldKSkgPT0gMCkKKwkgIHsKKwkgICAgbmFtZSA9ICZuYW1lIFtzdHJsZW4gKGFyZ3ZbYXJnaV0pXTsKKwkgICAgaWYgKG5hbWUgWzBdID09ICctJykKKwkgICAgICB7CisJCS8qIGxlYWRpbmcgbWF0Y2ggLi4uPGEtYi1jPi1kLWUtZiAtIGNvbnRpbnVlIHNlYXJjaCAqLworCQluYW1lICsrOyAvKiBza2lwIGAtJyAqLworCQlhcmdpICsrOworCQljb250aW51ZTsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKG5hbWUgWzBdID09ICdcMCcpCisJICAgICAgeworCQkvKiBleGFjdCBtYXRjaCAuLi48YS1iLWMtZC1lLWY+IC0gYmV0dGVyIHRoYW4gYmVmb3JlPyAqLworCQlpZiAoYXJnaSA+IG1hdGNoaW5nX2FyZ2kpCisJCSAgeworCQkgICAgbWF0Y2hpbmdfYXJnaSA9IGFyZ2k7CisJCSAgICBtYXRjaGluZ19vcHQgPSBvcHQ7CisJCSAgfQorCQlicmVhazsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICBicmVhazsKKwkgIH0KKyAgICAgIH0KKworICAqcGFyZ2kgPSBtYXRjaGluZ19hcmdpOworICByZXR1cm4gbWF0Y2hpbmdfb3B0OworfQorCitTSU1fUkMKK3NpbV9hcmdzX2NvbW1hbmQgKFNJTV9ERVNDIHNkLCBjaGFyICpjbWQpCit7CisgIC8qIHNvbWV0aGluZyB0byBkbz8gKi8KKyAgaWYgKGNtZCA9PSBOVUxMKQorICAgIHJldHVybiBTSU1fUkNfT0s7IC8qIEZJWE1FIC0gcGVyaGFwaHMgaGVscCB3b3VsZCBiZSBiZXR0ZXIgKi8KKyAgCisgIGlmIChjbWQgWzBdID09ICctJykKKyAgICB7CisgICAgICAvKiB1c2VyIHNwZWNpZmllZCAtPG9wdD4gLi4uIGZvcm0/ICovCisgICAgICBjaGFyICoqYXJndiA9IGJ1aWxkYXJndiAoY21kKTsKKyAgICAgIFNJTV9SQyByYyA9IHNpbV9wYXJzZV9hcmdzIChzZCwgYXJndik7CisgICAgICBmcmVlYXJndiAoYXJndik7CisgICAgICByZXR1cm4gcmM7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciAqKmFyZ3YgPSBidWlsZGFyZ3YgKGNtZCk7CisgICAgICBjb25zdCBPUFRJT04gKm1hdGNoaW5nX29wdCA9IE5VTEw7CisgICAgICBpbnQgbWF0Y2hpbmdfYXJnaTsKKyAgICAgIHNpbV9jcHUgKmNwdTsKKworICAgICAgaWYgKGFyZ3YgWzBdID09IE5VTEwpCisJcmV0dXJuIFNJTV9SQ19PSzsgLyogRklYTUUgLSBwZXJoYXBocyBoZWxwIHdvdWxkIGJlIGJldHRlciAqLworCisgICAgICAvKiBGaXJzdCBjaGVjayBmb3IgYSBjcHUgc2VsZWN0b3IuICAqLworICAgICAgeworCWNoYXIgKmNwdV9uYW1lID0geHN0cmR1cCAoYXJndlswXSk7CisJY2hhciAqaHlwaGVuID0gc3RyY2hyIChjcHVfbmFtZSwgJy0nKTsKKwlpZiAoaHlwaGVuKQorCSAgKmh5cGhlbiA9IDA7CisJY3B1ID0gc2ltX2NwdV9sb29rdXAgKHNkLCBjcHVfbmFtZSk7CisJaWYgKGNwdSkKKwkgIHsKKwkgICAgLyogSWYgPGNwdW5hbWU+LTxjb21tYW5kPiwgcG9pbnQgYXJndlswXSBhdCA8Y29tbWFuZD4uICAqLworCSAgICBpZiAoaHlwaGVuKQorCSAgICAgIHsKKwkJbWF0Y2hpbmdfYXJnaSA9IDA7CisJCWFyZ3ZbMF0gKz0gaHlwaGVuIC0gY3B1X25hbWUgKyAxOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIG1hdGNoaW5nX2FyZ2kgPSAxOworCSAgICBtYXRjaGluZ19vcHQgPSBmaW5kX21hdGNoIChzZCwgY3B1LCBhcmd2LCAmbWF0Y2hpbmdfYXJnaSk7CisJICAgIC8qIElmIGh5cGhlbiBmb3VuZCByZXN0b3JlIGFyZ3ZbMF0uICAqLworCSAgICBpZiAoaHlwaGVuKQorCSAgICAgIGFyZ3ZbMF0gLT0gaHlwaGVuIC0gY3B1X25hbWUgKyAxOworCSAgfQorCWZyZWUgKGNwdV9uYW1lKTsKKyAgICAgIH0KKworICAgICAgLyogSWYgdGhhdCBmYWlsZWQsIHRyeSB0aGUgbWFpbiB0YWJsZS4gICovCisgICAgICBpZiAobWF0Y2hpbmdfb3B0ID09IE5VTEwpCisJeworCSAgbWF0Y2hpbmdfYXJnaSA9IDA7CisJICBtYXRjaGluZ19vcHQgPSBmaW5kX21hdGNoIChzZCwgTlVMTCwgYXJndiwgJm1hdGNoaW5nX2FyZ2kpOworCX0KKworICAgICAgaWYgKG1hdGNoaW5nX29wdCAhPSBOVUxMKQorCXsKKwkgIHN3aXRjaCAobWF0Y2hpbmdfb3B0LT5vcHQuaGFzX2FyZykKKwkgICAgeworCSAgICBjYXNlIG5vX2FyZ3VtZW50OgorCSAgICAgIGlmIChhcmd2IFttYXRjaGluZ19hcmdpICsgMV0gPT0gTlVMTCkKKwkJbWF0Y2hpbmdfb3B0LT5oYW5kbGVyIChzZCwgY3B1LCBtYXRjaGluZ19vcHQtPm9wdC52YWwsCisJCQkJICAgICAgIE5VTEwsIDEvKmlzX2NvbW1hbmQqLyk7CisJICAgICAgZWxzZQorCQlzaW1faW9fZXByaW50ZiAoc2QsICJDb21tYW5kIGAlcycgdGFrZXMgbm8gYXJndW1lbnRzXG4iLAorCQkJCW1hdGNoaW5nX29wdC0+b3B0Lm5hbWUpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIG9wdGlvbmFsX2FyZ3VtZW50OgorCSAgICAgIGlmIChhcmd2IFttYXRjaGluZ19hcmdpICsgMV0gPT0gTlVMTCkKKwkJbWF0Y2hpbmdfb3B0LT5oYW5kbGVyIChzZCwgY3B1LCBtYXRjaGluZ19vcHQtPm9wdC52YWwsCisJCQkJICAgICAgIE5VTEwsIDEvKmlzX2NvbW1hbmQqLyk7CisJICAgICAgZWxzZSBpZiAoYXJndiBbbWF0Y2hpbmdfYXJnaSArIDJdID09IE5VTEwpCisJCW1hdGNoaW5nX29wdC0+aGFuZGxlciAoc2QsIGNwdSwgbWF0Y2hpbmdfb3B0LT5vcHQudmFsLAorCQkJCSAgICAgICBhcmd2IFttYXRjaGluZ19hcmdpICsgMV0sIDEvKmlzX2NvbW1hbmQqLyk7CisJICAgICAgZWxzZQorCQlzaW1faW9fZXByaW50ZiAoc2QsICJDb21tYW5kIGAlcycgcmVxdWlyZXMgbm8gbW9yZSB0aGFuIG9uZSBhcmd1bWVudFxuIiwKKwkJCQltYXRjaGluZ19vcHQtPm9wdC5uYW1lKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSByZXF1aXJlZF9hcmd1bWVudDoKKwkgICAgICBpZiAoYXJndiBbbWF0Y2hpbmdfYXJnaSArIDFdID09IE5VTEwpCisJCXNpbV9pb19lcHJpbnRmIChzZCwgIkNvbW1hbmQgYCVzJyByZXF1aXJlcyBhbiBhcmd1bWVudFxuIiwKKwkJCQltYXRjaGluZ19vcHQtPm9wdC5uYW1lKTsKKwkgICAgICBlbHNlIGlmIChhcmd2IFttYXRjaGluZ19hcmdpICsgMl0gPT0gTlVMTCkKKwkJbWF0Y2hpbmdfb3B0LT5oYW5kbGVyIChzZCwgY3B1LCBtYXRjaGluZ19vcHQtPm9wdC52YWwsCisJCQkJICAgICAgIGFyZ3YgW21hdGNoaW5nX2FyZ2kgKyAxXSwgMS8qaXNfY29tbWFuZCovKTsKKwkgICAgICBlbHNlCisJCXNpbV9pb19lcHJpbnRmIChzZCwgIkNvbW1hbmQgYCVzJyByZXF1aXJlcyBvbmx5IG9uZSBhcmd1bWVudFxuIiwKKwkJCQltYXRjaGluZ19vcHQtPm9wdC5uYW1lKTsKKwkgICAgfQorCSAgZnJlZWFyZ3YgKGFyZ3YpOworCSAgcmV0dXJuIFNJTV9SQ19PSzsKKwl9CisKKyAgICAgIGZyZWVhcmd2IChhcmd2KTsKKyAgICB9CisgICAgICAKKyAgLyogZGlkbid0IGZpbmQgYW55dGhpbmcgdGhhdCByZW1vdGx5IG1hdGNoZWQgKi8KKyAgcmV0dXJuIFNJTV9SQ19GQUlMOworfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tb3B0aW9ucy5oIGIvc2ltL2NvbW1vbi9zaW0tb3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4Y2FkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS1vcHRpb25zLmgKQEAgLTAsMCArMSwxNDkgQEAKKy8qIEhlYWRlciBmaWxlIGZvciBzaW11bGF0b3IgYXJndW1lbnQgaGFuZGxpbmcuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIFNJTV9PUFRJT05TX0gKKyNkZWZpbmUgU0lNX09QVElPTlNfSAorCisjaW5jbHVkZSAiZ2V0b3B0LmgiCisKKy8qIEFSR1Ygb3B0aW9uIHN1cHBvcnQuCisKKyAgIE9wdGlvbnMgZm9yIHRoZSBzdGFuZGFsb25lIHNpbXVsYXRvciBhcmUgcGFyc2VkIGJ5IHNpbV9vcGVuIHNpbmNlCisgICBzaW1fb3BlbiBoYW5kbGVzIHRoZSBsYXJnZSBtYWpvcml0eSBvZiB0aGVtIGFuZCBpdCBhbHNvIHBhcnNlcyB0aGUKKyAgIG9wdGlvbnMgd2hlbiBpbnZva2VkIGJ5IGdkYiBbb3IgYW55IGV4dGVybmFsIHByb2dyYW1dLgorCisgICBGb3IgT1BUSU9OX0hBTkRMRVI6IGFyZyMyIGlzIHRoZSBwcm9jZXNzb3IgdG8gYXBwbHkgdG8gb3B0aW9uIHRvCisgICAoYWxsIGlmIE5VTEwpOyBhcmcjMyBpcyB0aGUgb3B0aW9uIGluZGV4OyBhcmcjNCBpcyB0aGUgb3B0aW9uJ3MKKyAgIGFyZ3VtZW50LCBOVUxMIGlmIG9wdGlvbmFsIGFuZCBtaXNzaW5nOyBhcmcjNSBpcyBub256ZXJvIGlmIGEKKyAgIGNvbW1hbmQgaXMgYmVpbmcgaW50ZXJwcmV0ZWQuICovCisKK3R5cGVkZWYgU0lNX1JDIChPUFRJT05fSEFORExFUikgUEFSQU1TICgoU0lNX0RFU0MsIHNpbV9jcHUgKiwgaW50LCBjaGFyICosIGludCkpOworCisvKiBEZWNsYXJlIG9wdGlvbiBoYW5kbGVycyB3aXRoIGEgbWFjcm8gc28gaXQncyB1c2FibGUgb24gayZyIHN5c3RlbXMuICAqLworI2RlZmluZSBERUNMQVJFX09QVElPTl9IQU5ETEVSKGZuKSBTSU1fUkMgZm4gUEFSQU1TICgoU0lNX0RFU0MsIHNpbV9jcHUgKiwgaW50LCBjaGFyICosIGludCkpCisKK3R5cGVkZWYgc3RydWN0IHsKKworICAvKiBUaGUgbG9uZyBvcHRpb24gaW5mb3JtYXRpb24uICovCisKKyAgc3RydWN0IG9wdGlvbiBvcHQ7CisKKyAgLyogVGhlIHNob3J0IG9wdGlvbiB3aXRoIHRoZSBzYW1lIG1lYW5pbmcgKCdcMCcgaWYgbm9uZSkuCisKKyAgICAgRm9yIHNob3J0IG9wdGlvbnMsIHdoZW4gT1BULlZBTCBpcyBub24temVybywgaXQsIGluc3RlYWQgb2YKKyAgICAgU0hPUlRPUFQgaXMgcGFzc2VkIHRvIEhBTkRMRVIuCisKKyAgICAgRm9yIGV4YW1wbGUsIGZvciB0aGUgYmVsb3c6CisKKwl7IHsiZGMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZBTFVFfSwKKwkgICAgJ2QnLCBOVUxMLCAiPDxkZXNjcmlwdGlvbj4+IiwgSEFORExFUn0sCisJeyB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9WQUxVRX0sCisJICAgICdlJywgTlVMTCwgIjw8ZGVzY3JpcHRpb24+PiIsIEhBTkRMRVJ9LAorCisgICAgIHRoZSBvcHRpb25zIC0tZGMsIC1kIGFuZCAtZSBhbGwgcmVzdWx0IGluIE9QVElPTl9WQUxVRSBiZWluZworICAgICBwYXNzZWQgaW50byBIQU5ETEVSLiAqLworCisgIGNoYXIgc2hvcnRvcHQ7CisKKyAgLyogVGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IChOVUxMIGlmIG5vbmUpLiAgKi8KKworICBjb25zdCBjaGFyICphcmc7CisKKyAgLyogVGhlIGRvY3VtZW50YXRpb24gc3RyaW5nLgorCisgICAgIElmIERPQyBpcyBOVUxMLCB0aGlzIG9wdGlvbiBuYW1lIGlzIGxpc3RlZCBhcyBhIHN5bm9ueW0gZm9yIHRoZQorICAgICBwcmV2aW91cyBvcHRpb24uCisKKyAgICAgSWYgRE9DIGFuZCBET0NfTkFNRSBhcmUgdGhlIGVtcHR5IHN0cmluZyAoaS5lLiAiIiksIHRoaXMgb3B0aW9uCisgICAgIGlzIG5vdCBsaXN0ZWQgaW4gdXNhZ2UgYW5kIGhlbHAgbWVzc2FnZXMuCisKKyAgICAgRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBhbGlhc2VkIG9wdGlvbnMgLS1kYywgLS1kcCBhbmQgLWQsIHRoZW46CisKKwl7IHsiZGMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RDfSwKKwkgICAgJ2QnLCBOVUxMLCAiPDxkZXNjcmlwdGlvbj4+IiwgSEFORExFUn0sCisJeyB7ImRwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9EUH0sCisJICAgICdcMCcsIE5VTEwsIE5VTEwsIEhBTkRMRVJ9LAorCisgICAgIHdpbGwgbGlzdCBgYC1kLCAtLWRjLCAtLWRwIDw8ZGVzY3JpcHRpb24+PicnICovCisKKyAgY29uc3QgY2hhciAqZG9jOworCisgIC8qIEEgZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgb3B0aW9uLiAgKi8KKworICBPUFRJT05fSEFORExFUiAqaGFuZGxlcjsKKworICAvKiBUaGUgZG9jdW1lbnRhdGlvbiBuYW1lLiAgVXNlZCB3aGVuIGdlbmVyYXRpbmcgdXNhZ2UgYW5kIGhlbHAKKyAgICAgbWVzc2FnZXMuCisKKyAgICAgSWYgRE9DIGFuZCBET0NfTkFNRSBhcmUgdGhlIGVtcHR5IHN0cmluZyAoaS5lLiAiIiksIHRoaXMgb3B0aW9uCisgICAgIGlzIG5vdCBsaXN0ZWQgaW4gdXNhZ2UgYW5kIGhlbHAgbWVzc2FnZXMuCisKKyAgICAgSWYgRE9DX05BTUUgaXMgYSBub24tZW1wdHkgc3RyaW5nIHRoZW4gaXQsIGluc3RlZCBvZiBPUFQuTkFNRSwgaXMKKyAgICAgbGlzdGVkIGFzIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24gaW4gdXNhZ2UgYW5kIGhlbHAgbWVzc2FnZXMuCisKKyAgICAgRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSBvcHRpb25zIC0tc2V0LXBjIGFuZCAtLXNldC1zcCwgdGhlbjoKKworCXsgeyJzZXQtcGMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NFVF9QQ30sCisgICAgICAgICAgICAnXDAnLCBOVUxMLCAiPDxkZXNjcmlwdGlvbj4+IiwgSEFORExFUiwgIi0tc2V0LVJFR05BTUUiIH0sCisJeyB7InNldC1zcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU0VUX1NQfSwKKwkgICAgJ1wwJywgTlVMTCwgIiIsIEhBTkRMRVIsICIiIH0sCisKKyAgICAgd2lsbCBsaXN0IGBgLS1zZXQtUkVHTkFNRSA8PGRlc2NyaXB0aW9uPj4iLiAqLworCisgIGNvbnN0IGNoYXIgKmRvY19uYW1lOworCit9IE9QVElPTjsKKworLyogQWxsIG9wdGlvbnMgdGhhdCBkb24ndCBoYXZlIGEgc2hvcnQgZm9ybSBlcXVpdmFsZW50IGJlZ2luIHdpdGggdGhpcyBmb3IKKyAgIGB2YWwnLiAgMTMwIGlzbid0IHNwZWNpYWwsIGp1c3Qgc29tZSBub24tQVNDSUkgdmFsdWUgdG8gYmVnaW4gYXQuCisgICBNb2R1bGVzIG5lZWRuJ3Qgd29ycnkgYWJvdXQgY29sbGlzaW9ucyBoZXJlLCB0aGUgY29kZSBkeW5hbWljYWxseSBhc3NpZ25lZAorICAgdGhlIGFjdHVhbCBudW1iZXJzIHVzZWQgYW5kIHRoZW4gcGFzc2VzIHRoZSBvcmlnaW5hbCB2YWx1ZSB0byB0aGUgb3B0aW9uCisgICBoYW5kbGVyLiAgKi8KKyNkZWZpbmUgT1BUSU9OX1NUQVJUIDEzMAorCisvKiBJZGVudGlmeSB2YWxpZCBvcHRpb24gaW4gdGhlIHRhYmxlICovCisjZGVmaW5lIE9QVElPTl9WQUxJRF9QKE8pICgoTyktPm9wdC5uYW1lICE9IE5VTEwgfHwgKE8pLT5zaG9ydG9wdCAhPSAnXDAnKQorCisvKiBMaXN0IG9mIG9wdGlvbnMgYWRkZWQgYnkgdmFyaW91cyBtb2R1bGVzLiAgKi8KK3R5cGVkZWYgc3RydWN0IG9wdGlvbl9saXN0IHsKKyAgc3RydWN0IG9wdGlvbl9saXN0ICpuZXh0OworICBjb25zdCBPUFRJT04gKm9wdGlvbnM7Cit9IE9QVElPTl9MSVNUOworCisvKiBBZGQgYSBzZXQgb2Ygb3B0aW9ucyB0byB0aGUgc2ltdWxhdG9yLgorICAgQ1BVIGlzIHRoZSBjcHUgdGhlIG9wdGlvbnMgYXBwbHkgdG8gb3IgTlVMTCBmb3IgYWxsIGNwdXMuCisgICBUQUJMRSBpcyBhbiBhcnJheSBvZiBPUFRJT05TIHRlcm1pbmF0ZWQgYnkgYSBOVUxMIGBvcHQubmFtZScgZW50cnkuICAqLworU0lNX1JDIHNpbV9hZGRfb3B0aW9uX3RhYmxlIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGNvbnN0IE9QVElPTiAqdGFibGUpKTsKKworLyogSW5zdGFsbCBoYW5kbGVyIGZvciB0aGUgc3RhbmRhcmQgb3B0aW9ucy4gICovCitNT0RVTEVfSU5TVEFMTF9GTiBzdGFuZGFyZF9pbnN0YWxsOworCisvKiBDYWxsZWQgYnkgc2ltX29wZW4gdG8gcGFyc2UgdGhlIGFyZ3VtZW50cy4gICovCitTSU1fUkMgc2ltX3BhcnNlX2FyZ3MgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGNoYXIgKiphcmd2KSk7CisKKy8qIFByaW50IGhlbHAgbWVzc2FnZXMgZm9yIHRoZSBvcHRpb25zLiAgSVNfQ09NTUFORCBpcyBub24temVybyB3aGVuCisgICB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgaW50ZXJwcmV0ZXIuICovCit2b2lkIHNpbV9wcmludF9oZWxwIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBpbnQgaXNfY29tbWFuZCkpOworCisvKiBUcnkgdG8gcGFyc2UgdGhlIGNvbW1hbmQgYXMgaWYgaXQgaXMgYW4gb3B0aW9uLCBPbmx5IGZhaWwgd2hlbgorICAgdG90YWxseSB1bnN1Y2Nlc3NmdWwgKi8KK1NJTV9SQyBzaW1fYXJnc19jb21tYW5kIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBjaGFyICpjbWQpKTsKKworI2VuZGlmIC8qIFNJTV9PUFRJT05TX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLXByb2ZpbGUuYyBiL3NpbS9jb21tb24vc2ltLXByb2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDA3NWQxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tcHJvZmlsZS5jCkBAIC0wLDAgKzEsMTE3NSBAQAorLyogRGVmYXVsdCBwcm9maWxpbmcgc3VwcG9ydC4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2luY2x1ZGUgInNpbS1pby5oIgorI2luY2x1ZGUgInNpbS1vcHRpb25zLmgiCisjaW5jbHVkZSAic2ltLWFzc2VydC5oIgorCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBDT01NQVMobikgc2ltX2FkZF9jb21tYXMgKGNvbW1hX2J1Ziwgc2l6ZW9mIChjb21tYV9idWYpLCAobikpCisKK3N0YXRpYyBNT0RVTEVfSU5JVF9GTiBwcm9maWxlX2luaXQ7CitzdGF0aWMgTU9EVUxFX1VOSU5TVEFMTF9GTiBwcm9maWxlX3VuaW5zdGFsbDsKKworc3RhdGljIERFQ0xBUkVfT1BUSU9OX0hBTkRMRVIgKHByb2ZpbGVfb3B0aW9uX2hhbmRsZXIpOworCitlbnVtIHsKKyAgT1BUSU9OX1BST0ZJTEVfSU5TTiA9IE9QVElPTl9TVEFSVCwKKyAgT1BUSU9OX1BST0ZJTEVfTUVNT1JZLAorICBPUFRJT05fUFJPRklMRV9NT0RFTCwKKyAgT1BUSU9OX1BST0ZJTEVfRklMRSwKKyAgT1BUSU9OX1BST0ZJTEVfQ09SRSwKKyAgT1BUSU9OX1BST0ZJTEVfUEMsCisgIE9QVElPTl9QUk9GSUxFX1BDX1JBTkdFLAorICBPUFRJT05fUFJPRklMRV9QQ19HUkFOVUxBUklUWSwKKyAgT1BUSU9OX1BST0ZJTEVfUkFOR0UsCisgIE9QVElPTl9QUk9GSUxFX0ZVTkNUSU9OCit9OworCitzdGF0aWMgY29uc3QgT1BUSU9OIHByb2ZpbGVfb3B0aW9uc1tdID0geworICB7IHsicHJvZmlsZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCAncCd9LAorICAgICAgJ3AnLCAib258b2ZmIiwgIlBlcmZvcm0gcHJvZmlsaW5nIiwKKyAgICAgIHByb2ZpbGVfb3B0aW9uX2hhbmRsZXIgfSwKKyAgeyB7InByb2ZpbGUtaW5zbiIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUFJPRklMRV9JTlNOfSwKKyAgICAgICdcMCcsICJvbnxvZmYiLCAiUGVyZm9ybSBpbnN0cnVjdGlvbiBwcm9maWxpbmciLAorICAgICAgcHJvZmlsZV9vcHRpb25faGFuZGxlciB9LAorICB7IHsicHJvZmlsZS1tZW1vcnkiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BST0ZJTEVfTUVNT1JZfSwKKyAgICAgICdcMCcsICJvbnxvZmYiLCAiUGVyZm9ybSBtZW1vcnkgcHJvZmlsaW5nIiwKKyAgICAgIHByb2ZpbGVfb3B0aW9uX2hhbmRsZXIgfSwKKyAgeyB7InByb2ZpbGUtY29yZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUFJPRklMRV9DT1JFfSwKKyAgICAgICdcMCcsICJvbnxvZmYiLCAiUGVyZm9ybSBDT1JFIHByb2ZpbGluZyIsCisgICAgICBwcm9maWxlX29wdGlvbl9oYW5kbGVyIH0sCisgIHsgeyJwcm9maWxlLW1vZGVsIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QUk9GSUxFX01PREVMfSwKKyAgICAgICdcMCcsICJvbnxvZmYiLCAiUGVyZm9ybSBtb2RlbCBwcm9maWxpbmciLAorICAgICAgcHJvZmlsZV9vcHRpb25faGFuZGxlciB9LAorCisgIHsgeyJwcm9maWxlLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BST0ZJTEVfRklMRX0sCisgICAgICAnXDAnLCAiRklMRSBOQU1FIiwgIlNwZWNpZnkgcHJvZmlsZSBvdXRwdXQgZmlsZSIsCisgICAgICBwcm9maWxlX29wdGlvbl9oYW5kbGVyIH0sCisKKyAgeyB7InByb2ZpbGUtcGMiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BST0ZJTEVfUEN9LAorICAgICAgJ1wwJywgIm9ufG9mZiIsICJQZXJmb3JtIFBDIHByb2ZpbGluZyIsCisgICAgICBwcm9maWxlX29wdGlvbl9oYW5kbGVyIH0sCisgIHsgeyJwcm9maWxlLXBjLWZyZXF1ZW5jeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnRid9LAorICAgICAgJ0YnLCAiUEMgUFJPRklMRSBGUkVRVUVOQ1kiLCAiU3BlY2lmaWVkIFBDIHByb2ZpbGluZyBmcmVxdWVuY3kiLAorICAgICAgcHJvZmlsZV9vcHRpb25faGFuZGxlciB9LAorICB7IHsicHJvZmlsZS1wYy1zaXplIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdTJ30sCisgICAgICAnUycsICJQQyBQUk9GSUxFIFNJWkUiLCAiU3BlY2lmeSBQQyBwcm9maWxpbmcgc2l6ZSIsCisgICAgICBwcm9maWxlX29wdGlvbl9oYW5kbGVyIH0sCisgIHsgeyJwcm9maWxlLXBjLWdyYW51bGFyaXR5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QUk9GSUxFX1BDX0dSQU5VTEFSSVRZfSwKKyAgICAgICdcMCcsICJQQyBQUk9GSUxFIEdSQU5VTEFSSVRZIiwgIlNwZWNpZnkgUEMgcHJvZmlsaW5nIHNhbXBsZSBjb3ZlcmFnZSIsCisgICAgICBwcm9maWxlX29wdGlvbl9oYW5kbGVyIH0sCisgIHsgeyJwcm9maWxlLXBjLXJhbmdlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QUk9GSUxFX1BDX1JBTkdFfSwKKyAgICAgICdcMCcsICJCQVNFLEJPVU5EIiwgIlNwZWNpZnkgUEMgcHJvZmlsaW5nIGFkZHJlc3MgcmFuZ2UiLAorICAgICAgcHJvZmlsZV9vcHRpb25faGFuZGxlciB9LAorCisjaWZkZWYgU0lNX0hBVkVfQUREUl9SQU5HRQorICB7IHsicHJvZmlsZS1yYW5nZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUFJPRklMRV9SQU5HRX0sCisgICAgICAnXDAnLCAiU1RBUlQsRU5EIiwgIlNwZWNpZnkgcmFuZ2Ugb2YgYWRkcmVzc2VzIGZvciBpbnN0cnVjdGlvbiBhbmQgbW9kZWwgcHJvZmlsaW5nIiwKKyAgICAgIHByb2ZpbGVfb3B0aW9uX2hhbmRsZXIgfSwKKyNpZiAwIC8qd2lwKi8KKyAgeyB7InByb2ZpbGUtZnVuY3Rpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BST0ZJTEVfRlVOQ1RJT059LAorICAgICAgJ1wwJywgIkZVTkNUSU9OIiwgIlNwZWNpZnkgZnVuY3Rpb24gdG8gcHJvZmlsZSIsCisgICAgICBwcm9maWxlX29wdGlvbl9oYW5kbGVyIH0sCisjZW5kaWYKKyNlbmRpZgorCisgIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfSwgJ1wwJywgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCisvKiBTZXQvcmVzZXQgdGhlIHByb2ZpbGUgb3B0aW9ucyBpbmRpY2F0ZWQgaW4gTUFTSy4gICovCisKK3N0YXRpYyBTSU1fUkMKK3NldF9wcm9maWxlX29wdGlvbl9tYXNrIChTSU1fREVTQyBzZCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG1hc2ssIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgaW50IHByb2ZpbGVfbnI7CisgIGludCBjcHVfbnI7CisgIGludCBwcm9maWxlX3ZhbCA9IDE7CisKKyAgaWYgKGFyZyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKGFyZywgInllcyIpID09IDAKKwkgIHx8IHN0cmNtcCAoYXJnLCAib24iKSA9PSAwCisJICB8fCBzdHJjbXAgKGFyZywgIjEiKSA9PSAwKQorCXByb2ZpbGVfdmFsID0gMTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm8iKSA9PSAwCisJICAgICAgIHx8IHN0cmNtcCAoYXJnLCAib2ZmIikgPT0gMAorCSAgICAgICB8fCBzdHJjbXAgKGFyZywgIjAiKSA9PSAwKQorCXByb2ZpbGVfdmFsID0gMDsKKyAgICAgIGVsc2UKKwl7CisJICBzaW1faW9fZXByaW50ZiAoc2QsICJBcmd1bWVudCBgJXMnIGZvciBgLS1wcm9maWxlJXMnIGludmFsaWQsIG9uZSBvZiBgb24nLCBgb2ZmJywgYHllcycsIGBubycgZXhwZWN0ZWRcbiIsIGFyZywgbmFtZSk7CisJICByZXR1cm4gU0lNX1JDX0ZBSUw7CisJfQorICAgIH0KKworICAvKiB1cGRhdGUgYXBwbGljYWJsZSBwcm9maWxlIGJpdHMgKi8KKyAgZm9yIChwcm9maWxlX25yID0gMDsgcHJvZmlsZV9uciA8IE1BWF9QUk9GSUxFX1ZBTFVFUzsgKytwcm9maWxlX25yKQorICAgIHsKKyAgICAgIGlmICgobWFzayAmICgxIDw8IHByb2ZpbGVfbnIpKSA9PSAwKQorCWNvbnRpbnVlOworCisjaWYgMCAvKiBzZWUgc2ltLXRyYWNlLmMsIHNldCBmbGFncyBpbiBTVEFURSBoZXJlIGlmL3doZW4gdGhlcmUgYXJlIGFueSAqLworICAgICAgLyogU2V0IG5vbi1jcHUgc3BlY2lmaWMgdmFsdWVzLiAgKi8KKyAgICAgIHN3aXRjaCAocHJvZmlsZV9ucikKKwl7CisJY2FzZSA/Pz8gOgorCSAgYnJlYWs7CisJfQorI2VuZGlmCisKKyAgICAgIC8qIFNldCBjcHUgdmFsdWVzLiAgKi8KKyAgICAgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7IGNwdV9ucisrKQorCXsKKwkgIENQVV9QUk9GSUxFX0ZMQUdTIChTVEFURV9DUFUgKHNkLCBjcHVfbnIpKVtwcm9maWxlX25yXSA9IHByb2ZpbGVfdmFsOworCX0KKyAgICB9CisKKyAgLyogUmUtY29tcHV0ZSB0aGUgY3B1IHByb2ZpbGUgc3VtbWFyeS4gICovCisgIGlmIChwcm9maWxlX3ZhbCkKKyAgICB7CisgICAgICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IE1BWF9OUl9QUk9DRVNTT1JTOyBjcHVfbnIrKykKKwlDUFVfUFJPRklMRV9EQVRBIChTVEFURV9DUFUgKHNkLCBjcHVfbnIpKS0+cHJvZmlsZV9hbnlfcCA9IDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZm9yIChjcHVfbnIgPSAwOyBjcHVfbnIgPCBNQVhfTlJfUFJPQ0VTU09SUzsgY3B1X25yKyspCisJeworCSAgQ1BVX1BST0ZJTEVfREFUQSAoU1RBVEVfQ1BVIChzZCwgY3B1X25yKSktPnByb2ZpbGVfYW55X3AgPSAwOworCSAgZm9yIChwcm9maWxlX25yID0gMDsgcHJvZmlsZV9uciA8IE1BWF9QUk9GSUxFX1ZBTFVFUzsgKytwcm9maWxlX25yKQorCSAgICB7CisJICAgICAgaWYgKENQVV9QUk9GSUxFX0ZMQUdTIChTVEFURV9DUFUgKHNkLCBjcHVfbnIpKVtwcm9maWxlX25yXSkKKwkJeworCQkgIENQVV9QUk9GSUxFX0RBVEEgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpLT5wcm9maWxlX2FueV9wID0gMTsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJfQorICAgIH0gIAorCisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKKy8qIFNldCBvbmUgcHJvZmlsZSBvcHRpb24gYmFzZWQgb24gaXRzIElEWCB2YWx1ZS4KKyAgIE5vdCBzdGF0aWMgYXMgY2dlbi1zY2FjaGUuYyB1c2VzIGl0LiAgKi8KKworU0lNX1JDCitzaW1fcHJvZmlsZV9zZXRfb3B0aW9uIChTSU1fREVTQyBzZCwgY29uc3QgY2hhciAqbmFtZSwgaW50IGlkeCwgY29uc3QgY2hhciAqYXJnKQoreworICByZXR1cm4gc2V0X3Byb2ZpbGVfb3B0aW9uX21hc2sgKHNkLCBuYW1lLCAxIDw8IGlkeCwgYXJnKTsKK30KKworc3RhdGljIFNJTV9SQworcHJvZmlsZV9vcHRpb25faGFuZGxlciAoU0lNX0RFU0Mgc2QsCisJCQlzaW1fY3B1ICpjcHUsCisJCQlpbnQgb3B0LAorCQkJY2hhciAqYXJnLAorCQkJaW50IGlzX2NvbW1hbmQpCit7CisgIGludCBjcHVfbnIscHJvZl9ucjsKKworICAvKiBGSVhNRTogTmVlZCB0byBoYW5kbGUgYGNwdScgYXJnLiAgKi8KKworICBzd2l0Y2ggKG9wdCkKKyAgICB7CisgICAgY2FzZSAncCcgOgorICAgICAgaWYgKCEgV0lUSF9QUk9GSUxFKQorCXNpbV9pb19lcHJpbnRmIChzZCwgIlByb2ZpbGluZyBub3QgY29tcGlsZWQgaW4sIGAtcCcgaWdub3JlZFxuIik7CisgICAgICBlbHNlCisJcmV0dXJuIHNldF9wcm9maWxlX29wdGlvbl9tYXNrIChzZCwgInByb2ZpbGUiLCBQUk9GSUxFX1VTRUZVTF9NQVNLLAorCQkJCQlhcmcpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9QUk9GSUxFX0lOU04gOgorICAgICAgaWYgKFdJVEhfUFJPRklMRV9JTlNOX1ApCisJcmV0dXJuIHNpbV9wcm9maWxlX3NldF9vcHRpb24gKHNkLCAiLWluc24iLCBQUk9GSUxFX0lOU05fSURYLCBhcmcpOworICAgICAgZWxzZQorCXNpbV9pb19lcHJpbnRmIChzZCwgIkluc3RydWN0aW9uIHByb2ZpbGluZyBub3QgY29tcGlsZWQgaW4sIGAtLXByb2ZpbGUtaW5zbicgaWdub3JlZFxuIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX1BST0ZJTEVfTUVNT1JZIDoKKyAgICAgIGlmIChXSVRIX1BST0ZJTEVfTUVNT1JZX1ApCisJcmV0dXJuIHNpbV9wcm9maWxlX3NldF9vcHRpb24gKHNkLCAiLW1lbW9yeSIsIFBST0ZJTEVfTUVNT1JZX0lEWCwgYXJnKTsKKyAgICAgIGVsc2UKKwlzaW1faW9fZXByaW50ZiAoc2QsICJNZW1vcnkgcHJvZmlsaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tcHJvZmlsZS1tZW1vcnknIGlnbm9yZWRcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9QUk9GSUxFX0NPUkUgOgorICAgICAgaWYgKFdJVEhfUFJPRklMRV9DT1JFX1ApCisJcmV0dXJuIHNpbV9wcm9maWxlX3NldF9vcHRpb24gKHNkLCAiLWNvcmUiLCBQUk9GSUxFX0NPUkVfSURYLCBhcmcpOworICAgICAgZWxzZQorCXNpbV9pb19lcHJpbnRmIChzZCwgIkNPUkUgcHJvZmlsaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tcHJvZmlsZS1jb3JlJyBpZ25vcmVkXG4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fUFJPRklMRV9NT0RFTCA6CisgICAgICBpZiAoV0lUSF9QUk9GSUxFX01PREVMX1ApCisJcmV0dXJuIHNpbV9wcm9maWxlX3NldF9vcHRpb24gKHNkLCAiLW1vZGVsIiwgUFJPRklMRV9NT0RFTF9JRFgsIGFyZyk7CisgICAgICBlbHNlCisJc2ltX2lvX2VwcmludGYgKHNkLCAiTW9kZWwgcHJvZmlsaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tcHJvZmlsZS1tb2RlbCcgaWdub3JlZFxuIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX1BST0ZJTEVfRklMRSA6CisgICAgICAvKiBGSVhNRTogTWlnaHQgd2FudCB0aGlzIHRvIGFwcGx5IHRvIHBjIHByb2ZpbGluZyBvbmx5LAorCSBvciBoYXZlIHR3byBwcm9maWxlIGZpbGUgb3B0aW9ucy4gICovCisgICAgICBpZiAoISBXSVRIX1BST0ZJTEUpCisJc2ltX2lvX2VwcmludGYgKHNkLCAiUHJvZmlsaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tcHJvZmlsZS1maWxlJyBpZ25vcmVkXG4iKTsKKyAgICAgIGVsc2UKKwl7CisJICBGSUxFICpmID0gZm9wZW4gKGFyZywgInciKTsKKworCSAgaWYgKGYgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlVuYWJsZSB0byBvcGVuIHByb2ZpbGUgb3V0cHV0IGZpbGUgYCVzJ1xuIiwgYXJnKTsKKwkgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisJICAgIH0KKwkgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrY3B1X25yKQorCSAgICBQUk9GSUxFX0ZJTEUgKENQVV9QUk9GSUxFX0RBVEEgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpKSA9IGY7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9QUk9GSUxFX1BDOgorICAgICAgaWYgKFdJVEhfUFJPRklMRV9QQ19QKQorCXJldHVybiBzaW1fcHJvZmlsZV9zZXRfb3B0aW9uIChzZCwgIi1wYyIsIFBST0ZJTEVfUENfSURYLCBhcmcpOworICAgICAgZWxzZQorCXNpbV9pb19lcHJpbnRmIChzZCwgIlBDIHByb2ZpbGluZyBub3QgY29tcGlsZWQgaW4sIGAtLXByb2ZpbGUtcGMnIGlnbm9yZWRcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdGJyA6CisgICAgICBpZiAoV0lUSF9QUk9GSUxFX1BDX1ApCisJeworCSAgLyogRklYTUU6IFZhbGlkYXRlIGFyZy4gICovCisJICBpbnQgdmFsID0gYXRvaSAoYXJnKTsKKwkgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrY3B1X25yKQorCSAgICBQUk9GSUxFX1BDX0ZSRVEgKENQVV9QUk9GSUxFX0RBVEEgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpKSA9IHZhbDsKKwkgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrY3B1X25yKQorCSAgICBDUFVfUFJPRklMRV9GTEFHUyAoU1RBVEVfQ1BVIChzZCwgY3B1X25yKSlbUFJPRklMRV9QQ19JRFhdID0gMTsKKwl9CisgICAgICBlbHNlCisJc2ltX2lvX2VwcmludGYgKHNkLCAiUEMgcHJvZmlsaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tcHJvZmlsZS1wYy1mcmVxdWVuY3knIGlnbm9yZWRcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdTJyA6CisgICAgICBpZiAoV0lUSF9QUk9GSUxFX1BDX1ApCisJeworCSAgLyogRklYTUU6IFZhbGlkYXRlIGFyZy4gICovCisJICBpbnQgdmFsID0gYXRvaSAoYXJnKTsKKwkgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrY3B1X25yKQorCSAgICBQUk9GSUxFX1BDX05SX0JVQ0tFVFMgKENQVV9QUk9GSUxFX0RBVEEgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpKSA9IHZhbDsKKwkgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrY3B1X25yKQorCSAgICBDUFVfUFJPRklMRV9GTEFHUyAoU1RBVEVfQ1BVIChzZCwgY3B1X25yKSlbUFJPRklMRV9QQ19JRFhdID0gMTsKKwl9CisgICAgICBlbHNlCisJc2ltX2lvX2VwcmludGYgKHNkLCAiUEMgcHJvZmlsaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tcHJvZmlsZS1wYy1zaXplJyBpZ25vcmVkXG4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fUFJPRklMRV9QQ19HUkFOVUxBUklUWToKKyAgICAgIGlmIChXSVRIX1BST0ZJTEVfUENfUCkKKwl7CisJICBpbnQgc2hpZnQ7CisJICBpbnQgdmFsID0gYXRvaSAoYXJnKTsKKwkgIC8qIGNoZWNrIHRoYXQgdGhlIGdyYW51bGFyaXR5IGlzIGEgcG93ZXIgb2YgdHdvICovCisJICBzaGlmdCA9IDA7CisJICB3aGlsZSAodmFsID4gKDEgPDwgc2hpZnQpKQorCSAgICB7CisJICAgICAgc2hpZnQgKz0gMTsKKwkgICAgfQorCSAgaWYgKHZhbCAhPSAoMSA8PCBzaGlmdCkpCisJICAgIHsKKwkgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJQQyBwcm9maWxpbmcgZ3JhbnVsYXJpdHkgbm90IGEgcG93ZXIgb2YgdHdvXG4iKTsKKwkgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisJICAgIH0KKwkgIGlmIChzaGlmdCA9PSAwKQorCSAgICB7CisJICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiUEMgcHJvZmlsaW5nIGdyYW51bGFyaXR5IHRvbyBzbWFsbCIpOworCSAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKwkgICAgfQorCSAgZm9yIChjcHVfbnIgPSAwOyBjcHVfbnIgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytjcHVfbnIpCisJICAgIFBST0ZJTEVfUENfU0hJRlQgKENQVV9QUk9GSUxFX0RBVEEgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpKSA9IHNoaWZ0OworCSAgZm9yIChjcHVfbnIgPSAwOyBjcHVfbnIgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytjcHVfbnIpCisJICAgIENQVV9QUk9GSUxFX0ZMQUdTIChTVEFURV9DUFUgKHNkLCBjcHVfbnIpKVtQUk9GSUxFX1BDX0lEWF0gPSAxOworCX0KKyAgICAgIGVsc2UKKwlzaW1faW9fZXByaW50ZiAoc2QsICJQQyBwcm9maWxpbmcgbm90IGNvbXBpbGVkIGluLCBgLS1wcm9maWxlLXBjLWdyYW51bGFyaXR5JyBpZ25vcmVkXG4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fUFJPRklMRV9QQ19SQU5HRToKKyAgICAgIGlmIChXSVRIX1BST0ZJTEVfUENfUCkKKwl7CisJICAvKiBGSVhNRTogVmFsaWRhdGUgYXJncyAqLworCSAgY2hhciAqY2hwID0gYXJnOworCSAgdW5zaWduZWQgbG9uZyBiYXNlOworCSAgdW5zaWduZWQgbG9uZyBib3VuZDsKKwkgIGJhc2UgPSBzdHJ0b3VsIChjaHAsICZjaHAsIDApOworCSAgaWYgKCpjaHAgIT0gJywnKQorCSAgICB7CisJICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiLS1wcm9maWxlLXBjLXJhbmdlIG1pc3NpbmcgQk9VTkQgYXJndW1lbnRcbiIpOworCSAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKwkgICAgfQorCSAgYm91bmQgPSBzdHJ0b3VsIChjaHAgKyAxLCBOVUxMLCAwKTsKKwkgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrY3B1X25yKQorCSAgICB7CisJICAgICAgUFJPRklMRV9QQ19TVEFSVCAoQ1BVX1BST0ZJTEVfREFUQSAoU1RBVEVfQ1BVIChzZCwgY3B1X25yKSkpID0gYmFzZTsKKwkgICAgICBQUk9GSUxFX1BDX0VORCAoQ1BVX1BST0ZJTEVfREFUQSAoU1RBVEVfQ1BVIChzZCwgY3B1X25yKSkpID0gYm91bmQ7CisJICAgIH0JICAgICAgCisJICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2NwdV9ucikKKwkgICAgQ1BVX1BST0ZJTEVfRkxBR1MgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpW1BST0ZJTEVfUENfSURYXSA9IDE7CisJfQorICAgICAgZWxzZQorCXNpbV9pb19lcHJpbnRmIChzZCwgIlBDIHByb2ZpbGluZyBub3QgY29tcGlsZWQgaW4sIGAtLXByb2ZpbGUtcGMtcmFuZ2UnIGlnbm9yZWRcbiIpOworICAgICAgYnJlYWs7CisKKyNpZmRlZiBTSU1fSEFWRV9BRERSX1JBTkdFCisgICAgY2FzZSBPUFRJT05fUFJPRklMRV9SQU5HRSA6CisgICAgICBpZiAoV0lUSF9QUk9GSUxFKQorCXsKKwkgIGNoYXIgKmNocCA9IGFyZzsKKwkgIHVuc2lnbmVkIGxvbmcgc3RhcnQsZW5kOworCSAgc3RhcnQgPSBzdHJ0b3VsIChjaHAsICZjaHAsIDApOworCSAgaWYgKCpjaHAgIT0gJywnKQorCSAgICB7CisJICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiLS1wcm9maWxlLXJhbmdlIG1pc3NpbmcgRU5EIGFyZ3VtZW50XG4iKTsKKwkgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisJICAgIH0KKwkgIGVuZCA9IHN0cnRvdWwgKGNocCArIDEsIE5VTEwsIDApOworCSAgLyogRklYTUU6IEFyZ3VtZW50IHZhbGlkYXRpb24uICAqLworCSAgaWYgKGNwdSAhPSBOVUxMKQorCSAgICBzaW1fYWRkcl9yYW5nZV9hZGQgKFBST0ZJTEVfUkFOR0UgKENQVV9QUk9GSUxFX0RBVEEgKGNwdSkpLAorCQkJCXN0YXJ0LCBlbmQpOworCSAgZWxzZQorCSAgICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2NwdV9ucikKKwkgICAgICBzaW1fYWRkcl9yYW5nZV9hZGQgKFBST0ZJTEVfUkFOR0UgKENQVV9QUk9GSUxFX0RBVEEgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpKSwKKwkJCQkgIHN0YXJ0LCBlbmQpOworCX0KKyAgICAgIGVsc2UKKwlzaW1faW9fZXByaW50ZiAoc2QsICJQcm9maWxpbmcgbm90IGNvbXBpbGVkIGluLCBgLS1wcm9maWxlLXJhbmdlJyBpZ25vcmVkXG4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fUFJPRklMRV9GVU5DVElPTiA6CisgICAgICBpZiAoV0lUSF9QUk9GSUxFKQorCXsKKwkgIC8qd2lwOiBuZWVkIHRvIGNvbXB1dGUgZnVuY3Rpb24gcmFuZ2UgZ2l2ZW4gbmFtZSovCisJfQorICAgICAgZWxzZQorCXNpbV9pb19lcHJpbnRmIChzZCwgIlByb2ZpbGluZyBub3QgY29tcGlsZWQgaW4sIGAtLXByb2ZpbGUtZnVuY3Rpb24nIGlnbm9yZWRcbiIpOworICAgICAgYnJlYWs7CisjZW5kaWYgLyogU0lNX0hBVkVfQUREUl9SQU5HRSAqLworICAgIH0KKworICByZXR1cm4gU0lNX1JDX09LOworfQorDAorLyogUEMgcHJvZmlsaW5nIHN1cHBvcnQgKi8KKworI2lmIFdJVEhfUFJPRklMRV9QQ19QCisKK3N0YXRpYyB2b2lkCitwcm9maWxlX3BjX2NsZWFudXAgKFNJTV9ERVNDIHNkKQoreworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IE1BWF9OUl9QUk9DRVNTT1JTOyBuKyspCisgICAgeworICAgICAgc2ltX2NwdSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgbik7CisgICAgICBQUk9GSUxFX0RBVEEgKmRhdGEgPSBDUFVfUFJPRklMRV9EQVRBIChjcHUpOworICAgICAgaWYgKFBST0ZJTEVfUENfQ09VTlQgKGRhdGEpICE9IE5VTEwpCisJemZyZWUgKFBST0ZJTEVfUENfQ09VTlQgKGRhdGEpKTsKKyAgICAgIFBST0ZJTEVfUENfQ09VTlQgKGRhdGEpID0gTlVMTDsKKyAgICAgIGlmIChQUk9GSUxFX1BDX0VWRU5UIChkYXRhKSAhPSBOVUxMKQorCXNpbV9ldmVudHNfZGVzY2hlZHVsZSAoc2QsIFBST0ZJTEVfUENfRVZFTlQgKGRhdGEpKTsKKyAgICAgIFBST0ZJTEVfUENfRVZFTlQgKGRhdGEpID0gTlVMTDsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3Byb2ZpbGVfcGNfdW5pbnN0YWxsIChTSU1fREVTQyBzZCkKK3sKKyAgcHJvZmlsZV9wY19jbGVhbnVwIChzZCk7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9maWxlX3BjX2V2ZW50IChTSU1fREVTQyBzZCwKKwkJICB2b2lkICpkYXRhKQoreworICBzaW1fY3B1ICpjcHUgPSAoc2ltX2NwdSopIGRhdGE7CisgIFBST0ZJTEVfREFUQSAqcHJvZmlsZSA9IENQVV9QUk9GSUxFX0RBVEEgKGNwdSk7CisgIGFkZHJlc3Nfd29yZCBwYzsKKyAgdW5zaWduZWQgaTsKKyAgc3dpdGNoIChTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5zaXplb2ZfcGMpCisgICAgeworICAgIGNhc2UgMjogcGMgPSAqKHVuc2lnbmVkXzIqKShTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5wYykgOyBicmVhazsKKyAgICBjYXNlIDQ6IHBjID0gKih1bnNpZ25lZF80KikoU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKS0+cGMpIDsgYnJlYWs7CisgICAgY2FzZSA4OiBwYyA9ICoodW5zaWduZWRfOCopKFNUQVRFX1dBVENIUE9JTlRTIChzZCktPnBjKSA7IGJyZWFrOworICAgIGRlZmF1bHQ6IHBjID0gMDsKKyAgICB9CisgIGkgPSAocGMgLSBQUk9GSUxFX1BDX1NUQVJUIChwcm9maWxlKSkgPj4gUFJPRklMRV9QQ19TSElGVCAocHJvZmlsZSk7CisgIGlmIChpIDwgUFJPRklMRV9QQ19OUl9CVUNLRVRTIChwcm9maWxlKSkKKyAgICBQUk9GSUxFX1BDX0NPVU5UIChwcm9maWxlKSBbaV0gKz0gMTsgLyogT3ZlcmZsb3c/ICovCisgIGVsc2UKKyAgICBQUk9GSUxFX1BDX0NPVU5UIChwcm9maWxlKSBbUFJPRklMRV9QQ19OUl9CVUNLRVRTIChwcm9maWxlKV0gKz0gMTsKKyAgUFJPRklMRV9QQ19FVkVOVCAocHJvZmlsZSkgPSAKKyAgICBzaW1fZXZlbnRzX3NjaGVkdWxlIChzZCwgUFJPRklMRV9QQ19GUkVRIChwcm9maWxlKSwgcHJvZmlsZV9wY19ldmVudCwgY3B1KTsKK30KKworc3RhdGljIFNJTV9SQworcHJvZmlsZV9wY19pbml0IChTSU1fREVTQyBzZCkKK3sKKyAgaW50IG47CisgIHByb2ZpbGVfcGNfY2xlYW51cCAoc2QpOworICBmb3IgKG4gPSAwOyBuIDwgTUFYX05SX1BST0NFU1NPUlM7IG4rKykKKyAgICB7CisgICAgICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCBuKTsKKyAgICAgIFBST0ZJTEVfREFUQSAqZGF0YSA9IENQVV9QUk9GSUxFX0RBVEEgKGNwdSk7CisgICAgICBpZiAoQ1BVX1BST0ZJTEVfRkxBR1MgKFNUQVRFX0NQVSAoc2QsIG4pKVtQUk9GSUxFX1BDX0lEWF0KKwkgICYmIFNUQVRFX1dBVENIUE9JTlRTIChzZCktPnBjICE9IE5VTEwpCisJeworCSAgaW50IGJ1Y2tldF9zaXplOworCSAgLyogZmlsbCBpbiB0aGUgZnJlcXVlbmN5IGlmIG5vdCBzcGVjaWZpZWQgKi8KKwkgIGlmIChQUk9GSUxFX1BDX0ZSRVEgKGRhdGEpID09IDApCisJICAgIFBST0ZJTEVfUENfRlJFUSAoZGF0YSkgPSAyNTY7CisJICAvKiBmaWxsIGluIHRoZSBzdGFydC9lbmQgaWYgbm90IHNwZWNpZmllZCAqLworCSAgaWYgKFBST0ZJTEVfUENfRU5EIChkYXRhKSA9PSAwKQorCSAgICB7CisJICAgICAgUFJPRklMRV9QQ19TVEFSVCAoZGF0YSkgPSBTVEFURV9URVhUX1NUQVJUIChzZCk7CisJICAgICAgUFJPRklMRV9QQ19FTkQgKGRhdGEpID0gU1RBVEVfVEVYVF9FTkQgKHNkKTsKKwkgICAgfQorCSAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgaWYgbm90IHNwZWNpZmllZC4gKi8KKwkgIGlmIChQUk9GSUxFX1BDX05SX0JVQ0tFVFMgKGRhdGEpID09IDApCisJICAgIHsKKwkgICAgICBpZiAoUFJPRklMRV9QQ19CVUNLRVRfU0laRSAoZGF0YSkgPT0gMCkKKwkJUFJPRklMRV9QQ19OUl9CVUNLRVRTIChkYXRhKSA9IDE2OworCSAgICAgIGVsc2UKKwkJeworCQkgIGlmIChQUk9GSUxFX1BDX0VORCAoZGF0YSkgPT0gMCkKKwkJICAgIHsKKwkJICAgICAgLyogbnJfYnVja2V0cyA9IChmdWxsLWFkZHJlc3MtcmFuZ2UgLyAyKSAvIChidWNrZXRfc2l6ZSAvIDIpICovCisJCSAgICAgIFBST0ZJTEVfUENfTlJfQlVDS0VUUyAoZGF0YSkgPQorCQkJKCgxIDw8IChTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5zaXplb2ZfcGMpICogKDggLSAxKSkKKwkJCSAvIChQUk9GSUxFX1BDX0JVQ0tFVF9TSVpFIChkYXRhKSAvIDIpKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIFBST0ZJTEVfUENfTlJfQlVDS0VUUyAoZGF0YSkgPQorCQkJKChQUk9GSUxFX1BDX0VORCAoZGF0YSkKKwkJCSAgLSBQUk9GSUxFX1BDX1NUQVJUIChkYXRhKQorCQkJICArIFBST0ZJTEVfUENfQlVDS0VUX1NJWkUgKGRhdGEpIC0gMSkKKwkJCSAvIFBST0ZJTEVfUENfQlVDS0VUX1NJWkUgKGRhdGEpKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICAvKiBDb21wdXRlIHRoZSBidWNrZXQgc2l6ZSBpZiBub3Qgc3BlY2lmaWVkLiAgRW5zdXJlIHRoYXQgaXQKKyAgICAgICAgICAgICBpcyByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IHBvd2VyIG9mIHR3byAqLworCSAgaWYgKFBST0ZJTEVfUENfQlVDS0VUX1NJWkUgKGRhdGEpID09IDApCisJICAgIHsKKwkgICAgICBpZiAoUFJPRklMRV9QQ19FTkQgKGRhdGEpID09IDApCisJCS8qIGJ1Y2tldF9zaXplID0gKGZ1bGwtYWRkcmVzcy1yYW5nZSAvIDIpIC8gKG5yX2J1Y2tldHMgLyAyKSAqLworCQlidWNrZXRfc2l6ZSA9ICgoMSA8PCAoKFNUQVRFX1dBVENIUE9JTlRTIChzZCktPnNpemVvZl9wYyAqIDgpIC0gMSkpCisJCQkgICAgICAgLyAoUFJPRklMRV9QQ19OUl9CVUNLRVRTIChkYXRhKSAvIDIpKTsKKwkgICAgICBlbHNlCisJCWJ1Y2tldF9zaXplID0gKChQUk9GSUxFX1BDX0VORCAoZGF0YSkKKwkJCQktIFBST0ZJTEVfUENfU1RBUlQgKGRhdGEpCisJCQkJKyBQUk9GSUxFX1BDX05SX0JVQ0tFVFMgKGRhdGEpIC0gMSkKKwkJCSAgICAgICAvIFBST0ZJTEVfUENfTlJfQlVDS0VUUyAoZGF0YSkpOworCSAgICAgIFBST0ZJTEVfUENfU0hJRlQgKGRhdGEpID0gMDsKKwkgICAgICB3aGlsZSAoYnVja2V0X3NpemUgPCBQUk9GSUxFX1BDX0JVQ0tFVF9TSVpFIChkYXRhKSkKKwkJeworCQkgIFBST0ZJTEVfUENfU0hJRlQgKGRhdGEpICs9IDE7CisJCX0KKwkgICAgfQorCSAgLyogQWxpZ24gdGhlIGVuZCBhZGRyZXNzIHdpdGggYnVja2V0IHNpemUgKi8KKwkgIGlmIChQUk9GSUxFX1BDX0VORCAoZGF0YSkgIT0gMCkKKwkgICAgUFJPRklMRV9QQ19FTkQgKGRhdGEpID0gKFBST0ZJTEVfUENfU1RBUlQgKGRhdGEpCisJCQkJICAgICArIChQUk9GSUxFX1BDX0JVQ0tFVF9TSVpFIChkYXRhKQorCQkJCQkqIFBST0ZJTEVfUENfTlJfQlVDS0VUUyAoZGF0YSkpKTsKKwkgIC8qIGNyZWF0ZSB0aGUgcmVsZXZhbnQgYnVmZmVycyAqLworCSAgUFJPRklMRV9QQ19DT1VOVCAoZGF0YSkgPQorCSAgICBOWkFMTE9DICh1bnNpZ25lZCwgUFJPRklMRV9QQ19OUl9CVUNLRVRTIChkYXRhKSArIDEpOworCSAgUFJPRklMRV9QQ19FVkVOVCAoZGF0YSkgPQorCSAgICBzaW1fZXZlbnRzX3NjaGVkdWxlIChzZCwKKwkJCQkgUFJPRklMRV9QQ19GUkVRIChkYXRhKSwKKwkJCQkgcHJvZmlsZV9wY19ldmVudCwKKwkJCQkgY3B1KTsKKwl9CisgICAgfQorICByZXR1cm4gU0lNX1JDX09LOworfQorCitzdGF0aWMgdm9pZAorcHJvZmlsZV9wcmludF9wYyAoc2ltX2NwdSAqY3B1LCBpbnQgdmVyYm9zZSkKK3sKKyAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7CisgIFBST0ZJTEVfREFUQSAqcHJvZmlsZSA9IENQVV9QUk9GSUxFX0RBVEEgKGNwdSk7CisgIGNoYXIgY29tbWFfYnVmWzIwXTsKKyAgdW5zaWduZWQgbWF4X3ZhbDsKKyAgdW5zaWduZWQgdG90YWw7CisgIHVuc2lnbmVkIGk7CisKKyAgaWYgKFBST0ZJTEVfUENfQ09VTlQgKHByb2ZpbGUpID09IDApCisgICAgcmV0dXJuOworCisgIHNpbV9pb19wcmludGYgKHNkLCAiUHJvZ3JhbSBDb3VudGVyIFN0YXRpc3RpY3M6XG5cbiIpOworCisgIC8qIEZpcnN0IHBhc3Mgb3ZlciBkYXRhIGNvbXB1dGVzIHZhcmlvdXMgdGhpbmdzLiAgKi8KKyAgbWF4X3ZhbCA9IDA7CisgIHRvdGFsID0gMDsKKyAgZm9yIChpID0gMDsgaSA8PSBQUk9GSUxFX1BDX05SX0JVQ0tFVFMgKHByb2ZpbGUpOyArK2kpCisgICAgeworICAgICAgdG90YWwgKz0gUFJPRklMRV9QQ19DT1VOVCAocHJvZmlsZSkgW2ldOworICAgICAgaWYgKFBST0ZJTEVfUENfQ09VTlQgKHByb2ZpbGUpIFtpXSA+IG1heF92YWwpCisJbWF4X3ZhbCA9IFBST0ZJTEVfUENfQ09VTlQgKHByb2ZpbGUpIFtpXTsKKyAgICB9CisKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICIgIFRvdGFsIHNhbXBsZXM6ICVzXG4iLAorCQkgQ09NTUFTICh0b3RhbCkpOworICBzaW1faW9fcHJpbnRmIChzZCwgIiAgR3JhbnVsYXJpdHk6ICVzIGJ5dGVzIHBlciBidWNrZXRcbiIsCisJCSBDT01NQVMgKFBST0ZJTEVfUENfQlVDS0VUX1NJWkUgKHByb2ZpbGUpKSk7CisgIHNpbV9pb19wcmludGYgKHNkLCAiICBTaXplOiAlcyBidWNrZXRzXG4iLAorCQkgQ09NTUFTIChQUk9GSUxFX1BDX05SX0JVQ0tFVFMgKHByb2ZpbGUpKSk7CisgIHNpbV9pb19wcmludGYgKHNkLCAiICBGcmVxdWVuY3k6ICVzIGN5Y2xlcyBwZXIgc2FtcGxlXG4iLAorCQkgQ09NTUFTIChQUk9GSUxFX1BDX0ZSRVEgKHByb2ZpbGUpKSk7CisKKyAgaWYgKFBST0ZJTEVfUENfRU5EIChwcm9maWxlKSAhPSAwKQorICAgIHNpbV9pb19wcmludGYgKHNkLCAiICBSYW5nZTogMHglbHggMHglbHhcbiIsCisJCSAgIChsb25nKSBQUk9GSUxFX1BDX1NUQVJUIChwcm9maWxlKSwKKwkJICAgKGxvbmcpIFBST0ZJTEVfUENfRU5EIChwcm9maWxlKSk7CisKKyAgaWYgKHZlcmJvc2UgJiYgbWF4X3ZhbCAhPSAwKQorICAgIHsKKyAgICAgIC8qIE5vdyB3ZSBjYW4gcHJpbnQgdGhlIGhpc3RvZ3JhbS4gICovCisgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIlxuIik7CisgICAgICBmb3IgKGkgPSAwOyBpIDw9IFBST0ZJTEVfUENfTlJfQlVDS0VUUyAocHJvZmlsZSk7ICsraSkKKwl7CisJICBpZiAoUFJPRklMRV9QQ19DT1VOVCAocHJvZmlsZSkgW2ldICE9IDApCisJICAgIHsKKwkgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIiAgIik7CisJICAgICAgaWYgKGkgPT0gUFJPRklMRV9QQ19OUl9CVUNLRVRTIChwcm9maWxlKSkKKwkJc2ltX2lvX3ByaW50ZiAoc2QsICIlMTBzOiIsICJvdmVyZmxvdyIpOworCSAgICAgIGVsc2UKKwkJc2ltX2lvX3ByaW50ZiAoc2QsICIweCUwOGx4OiIsCisJCQkgICAgICAgKGxvbmcpIChQUk9GSUxFX1BDX1NUQVJUIChwcm9maWxlKQorCQkJCSAgICAgICArIChpICogUFJPRklMRV9QQ19CVUNLRVRfU0laRSAocHJvZmlsZSkpKSk7CisJICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICIgJSpzIiwKKwkJCSAgICAgbWF4X3ZhbCA8IDEwMDAwID8gNSA6IDEwLAorCQkJICAgICBDT01NQVMgKFBST0ZJTEVfUENfQ09VTlQgKHByb2ZpbGUpIFtpXSkpOworCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiICU0LjFmIiwKKwkJCSAgICAgKFBST0ZJTEVfUENfQ09VTlQgKHByb2ZpbGUpIFtpXSAqIDEwMC4wKSAvIHRvdGFsKTsKKwkgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIjogIik7CisJICAgICAgc2ltX3Byb2ZpbGVfcHJpbnRfYmFyIChzZCwgUFJPRklMRV9ISVNUT0dSQU1fV0lEVEgsCisJCQkJICAgICBQUk9GSUxFX1BDX0NPVU5UIChwcm9maWxlKSBbaV0sCisJCQkJICAgICBtYXhfdmFsKTsKKwkgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIlxuIik7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIGR1bXAgdGhlIGhpc3RvZ3JhbSB0byB0aGUgZmlsZSAiZ21vbi5vdXQiIHVzaW5nIEJTRCdzIGdwcm9mIGZpbGUKKyAgICAgZm9ybWF0ICovCisgIC8qIFNpbmNlIGEgcHJvZmlsZSBkYXRhIGZpbGUgaXMgaW4gdGhlIG5hdGl2ZSBmb3JtYXQgb2YgdGhlIGhvc3Qgb24KKyAgICAgd2hpY2ggdGhlIHByb2ZpbGUgaXMgYmVpbmcsIGVuZGlhbiBpc3N1ZXMgYXJlIG5vdCBjb25zaWRlcmVkIGluCisgICAgIHRoZSBjb2RlIGJlbG93LiAqLworICAvKiBGSVhNRTogSXMgdGhpcyB0aGUgYmVzdCBwbGFjZSBmb3IgdGhpcyBjb2RlPyAqLworICB7CisgICAgRklMRSAqcGYgPSBmb3BlbiAoImdtb24ub3V0IiwgIndiIik7CisgICAgCisgICAgaWYgKHBmID09IE5VTEwpCisgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJGYWlsZWQgdG8gb3BlbiBcImdtb24ub3V0XCIgcHJvZmlsZSBmaWxlXG4iKTsKKyAgICBlbHNlCisgICAgICB7CisJaW50IG9rOworCS8qIEZJWE1FOiB3aGF0IGlmIHRoZSB0YXJnZXQgaGFzIGEgNjQgYml0IFBDPyAqLworCXVuc2lnbmVkMzIgaGVhZGVyWzNdOworCXVuc2lnbmVkIGxvb3A7CisJaWYgKFBST0ZJTEVfUENfRU5EIChwcm9maWxlKSAhPSAwKQorCSAgeworCSAgICBoZWFkZXJbMF0gPSBQUk9GSUxFX1BDX1NUQVJUIChwcm9maWxlKTsKKwkgICAgaGVhZGVyWzFdID0gUFJPRklMRV9QQ19FTkQgKHByb2ZpbGUpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgaGVhZGVyWzBdID0gMDsKKwkgICAgaGVhZGVyWzFdID0gMDsKKwkgIH0KKwkvKiBzaXplIG9mIHNhbXBsZSBidWZmZXIgKCsgaGVhZGVyKSAqLworCWhlYWRlclsyXSA9IFBST0ZJTEVfUENfTlJfQlVDS0VUUyAocHJvZmlsZSkgKiAyICsgc2l6ZW9mIChoZWFkZXIpOworCW9rID0gZndyaXRlICgmaGVhZGVyLCBzaXplb2YgKGhlYWRlciksIDEsIHBmKTsKKwlmb3IgKGxvb3AgPSAwOworCSAgICAgb2sgJiYgKGxvb3AgPCBQUk9GSUxFX1BDX05SX0JVQ0tFVFMgKHByb2ZpbGUpKTsKKwkgICAgIGxvb3ArKykKKwkgIHsKKwkgICAgc2lnbmVkMTYgc2FtcGxlOworCSAgICBpZiAoUFJPRklMRV9QQ19DT1VOVCAocHJvZmlsZSkgW2xvb3BdID49IDB4ZmZmZikKKwkgICAgICBzYW1wbGUgPSAweGZmZmY7CisJICAgIGVsc2UKKwkgICAgICBzYW1wbGUgPSBQUk9GSUxFX1BDX0NPVU5UIChwcm9maWxlKSBbbG9vcF07CisJICAgIG9rID0gZndyaXRlICgmc2FtcGxlLCBzaXplb2YgKHNhbXBsZSksIDEsIHBmKTsKKwkgIH0KKwlpZiAob2sgPT0gMCkKKwkgIHNpbV9pb19lcHJpbnRmIChzZCwgIkZhaWxlZCB0byB3cml0ZSB0byBcImdtb24ub3V0XCIgcHJvZmlsZSBmaWxlXG4iKTsKKwlmY2xvc2UocGYpOworICAgICAgfQorICB9CisKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOworfQorCisjZW5kaWYKKwwKKy8qIFN1bW1hcnkgcHJpbnRpbmcgc3VwcG9ydC4gICovCisKKyNpZiBXSVRIX1BST0ZJTEVfSU5TTl9QCisKK3N0YXRpYyBTSU1fUkMKK3Byb2ZpbGVfaW5zbl9pbml0IChTSU1fREVTQyBzZCkKK3sKKyAgaW50IGM7CisKKyAgZm9yIChjID0gMDsgYyA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2MpCisgICAgeworICAgICAgc2ltX2NwdSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgYyk7CisKKyAgICAgIGlmIChDUFVfTUFYX0lOU05TIChjcHUpID4gMCkKKwlQUk9GSUxFX0lOU05fQ09VTlQgKENQVV9QUk9GSUxFX0RBVEEgKGNwdSkpID0gTlpBTExPQyAodW5zaWduZWQgaW50LCBDUFVfTUFYX0lOU05TIChjcHUpKTsKKyAgICB9CisKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworc3RhdGljIHZvaWQKK3Byb2ZpbGVfcHJpbnRfaW5zbiAoc2ltX2NwdSAqY3B1LCBpbnQgdmVyYm9zZSkKK3sKKyAgdW5zaWduZWQgaW50IGksIG4sIHRvdGFsLCBtYXhfdmFsLCBtYXhfbmFtZV9sZW47CisgIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjcHUpOworICBQUk9GSUxFX0RBVEEgKmRhdGEgPSBDUFVfUFJPRklMRV9EQVRBIChjcHUpOworICBjaGFyIGNvbW1hX2J1ZlsyMF07CisKKyAgLyogSWYgTUFYX0lOU05TIG5vdCBzZXQsIGluc24gcHJvZmlsaW5nIGlzbid0IHN1cHBvcnRlZC4gICovCisgIGlmIChDUFVfTUFYX0lOU05TIChjcHUpID09IDApCisgICAgcmV0dXJuOworCisgIHNpbV9pb19wcmludGYgKHNkLCAiSW5zdHJ1Y3Rpb24gU3RhdGlzdGljcyIpOworI2lmZGVmIFNJTV9IQVZFX0FERFJfUkFOR0UKKyAgaWYgKFBST0ZJTEVfUkFOR0UgKGRhdGEpLT5yYW5nZXMpCisgICAgc2ltX2lvX3ByaW50ZiAoc2QsICIgKGZvciBzZWxlY3RlZCBhZGRyZXNzIHJhbmdlKHMpKSIpOworI2VuZGlmCisgIHNpbV9pb19wcmludGYgKHNkLCAiXG5cbiIpOworCisgIC8qIEZpcnN0IHBhc3Mgb3ZlciBkYXRhIGNvbXB1dGVzIHZhcmlvdXMgdGhpbmdzLiAgKi8KKyAgbWF4X3ZhbCA9IDA7CisgIHRvdGFsID0gMDsKKyAgbWF4X25hbWVfbGVuID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IENQVV9NQVhfSU5TTlMgKGNwdSk7ICsraSkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lID0gKCpDUFVfSU5TTl9OQU1FIChjcHUpKSAoY3B1LCBpKTsKKworICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKwljb250aW51ZTsKKyAgICAgIHRvdGFsICs9IFBST0ZJTEVfSU5TTl9DT1VOVCAoZGF0YSkgW2ldOworICAgICAgaWYgKFBST0ZJTEVfSU5TTl9DT1VOVCAoZGF0YSkgW2ldID4gbWF4X3ZhbCkKKwltYXhfdmFsID0gUFJPRklMRV9JTlNOX0NPVU5UIChkYXRhKSBbaV07CisgICAgICBuID0gc3RybGVuIChuYW1lKTsKKyAgICAgIGlmIChuID4gbWF4X25hbWVfbGVuKQorCW1heF9uYW1lX2xlbiA9IG47CisgICAgfQorICAvKiBzZXQgdGhlIHRvdGFsIGluc24gY291bnQsIGluIGNhc2UgY2xpZW50IGlzIGJlaW5nIGxhenkgKi8KKyAgaWYgKCEgUFJPRklMRV9UT1RBTF9JTlNOX0NPVU5UIChkYXRhKSkKKyAgICBQUk9GSUxFX1RPVEFMX0lOU05fQ09VTlQgKGRhdGEpID0gdG90YWw7CisKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICIgIFRvdGFsOiAlcyBpbnNuc1xuIiwgQ09NTUFTICh0b3RhbCkpOworCisgIGlmICh2ZXJib3NlICYmIG1heF92YWwgIT0gMCkKKyAgICB7CisgICAgICAvKiBOb3cgd2UgY2FuIHByaW50IHRoZSBoaXN0b2dyYW0uICAqLworICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOworICAgICAgZm9yIChpID0gMDsgaSA8IENQVV9NQVhfSU5TTlMgKGNwdSk7ICsraSkKKwl7CisJICBjb25zdCBjaGFyICpuYW1lID0gKCpDUFVfSU5TTl9OQU1FIChjcHUpKSAoY3B1LCBpKTsKKworCSAgaWYgKG5hbWUgPT0gTlVMTCkKKwkgICAgY29udGludWU7CisJICBpZiAoUFJPRklMRV9JTlNOX0NPVU5UIChkYXRhKSBbaV0gIT0gMCkKKwkgICAgeworCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiICAgJSpzOiAlKnM6ICIsCisJCQkgICAgIG1heF9uYW1lX2xlbiwgbmFtZSwKKwkJCSAgICAgbWF4X3ZhbCA8IDEwMDAwID8gNSA6IDEwLAorCQkJICAgICBDT01NQVMgKFBST0ZJTEVfSU5TTl9DT1VOVCAoZGF0YSkgW2ldKSk7CisJICAgICAgc2ltX3Byb2ZpbGVfcHJpbnRfYmFyIChzZCwgUFJPRklMRV9ISVNUT0dSQU1fV0lEVEgsCisJCQkJICAgICBQUk9GSUxFX0lOU05fQ09VTlQgKGRhdGEpIFtpXSwKKwkJCQkgICAgIG1heF92YWwpOworCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiXG4iKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOworfQorCisjZW5kaWYKKworI2lmIFdJVEhfUFJPRklMRV9NRU1PUllfUAorCitzdGF0aWMgdm9pZAorcHJvZmlsZV9wcmludF9tZW1vcnkgKHNpbV9jcHUgKmNwdSwgaW50IHZlcmJvc2UpCit7CisgIHVuc2lnbmVkIGludCBpLCBuOworICB1bnNpZ25lZCBpbnQgdG90YWxfcmVhZCwgdG90YWxfd3JpdGU7CisgIHVuc2lnbmVkIGludCBtYXhfdmFsLCBtYXhfbmFtZV9sZW47CisgIC8qIEZJWE1FOiBOZWVkIHRvIGFkZCBzbXAgc3VwcG9ydC4gICovCisgIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjcHUpOworICBQUk9GSUxFX0RBVEEgKmRhdGEgPSBDUFVfUFJPRklMRV9EQVRBIChjcHUpOworICBjaGFyIGNvbW1hX2J1ZlsyMF07CisKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICJNZW1vcnkgQWNjZXNzIFN0YXRpc3RpY3NcblxuIik7CisKKyAgLyogRmlyc3QgcGFzcyBvdmVyIGRhdGEgY29tcHV0ZXMgdmFyaW91cyB0aGluZ3MuICAqLworICBtYXhfdmFsID0gdG90YWxfcmVhZCA9IHRvdGFsX3dyaXRlID0gbWF4X25hbWVfbGVuID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IE1PREVfVEFSR0VUX01BWDsgKytpKQorICAgIHsKKyAgICAgIHRvdGFsX3JlYWQgKz0gUFJPRklMRV9SRUFEX0NPVU5UIChkYXRhKSBbaV07CisgICAgICB0b3RhbF93cml0ZSArPSBQUk9GSUxFX1dSSVRFX0NPVU5UIChkYXRhKSBbaV07CisgICAgICBpZiAoUFJPRklMRV9SRUFEX0NPVU5UIChkYXRhKSBbaV0gPiBtYXhfdmFsKQorCW1heF92YWwgPSBQUk9GSUxFX1JFQURfQ09VTlQgKGRhdGEpIFtpXTsKKyAgICAgIGlmIChQUk9GSUxFX1dSSVRFX0NPVU5UIChkYXRhKSBbaV0gPiBtYXhfdmFsKQorCW1heF92YWwgPSBQUk9GSUxFX1dSSVRFX0NPVU5UIChkYXRhKSBbaV07CisgICAgICBuID0gc3RybGVuIChNT0RFX05BTUUgKGkpKTsKKyAgICAgIGlmIChuID4gbWF4X25hbWVfbGVuKQorCW1heF9uYW1lX2xlbiA9IG47CisgICAgfQorCisgIC8qIE9uZSBjb3VsZCB1c2UgUFJPRklMRV9MQUJFTF9XSURUSCBoZXJlLiAgSSBjaG9zZSBub3QgdG8uICAqLworICBzaW1faW9fcHJpbnRmIChzZCwgIiAgVG90YWwgcmVhZDogICVzIGFjY2Vzc2VzXG4iLAorCQkgQ09NTUFTICh0b3RhbF9yZWFkKSk7CisgIHNpbV9pb19wcmludGYgKHNkLCAiICBUb3RhbCB3cml0ZTogJXMgYWNjZXNzZXNcbiIsCisJCSBDT01NQVMgKHRvdGFsX3dyaXRlKSk7CisKKyAgaWYgKHZlcmJvc2UgJiYgbWF4X3ZhbCAhPSAwKQorICAgIHsKKyAgICAgIC8qIEZJWE1FOiBOZWVkIHRvIHNlcGFyYXRlIGluc3RydWN0aW9uIGZldGNoZXMgZnJvbSBkYXRhIGZldGNoZXMKKwkgYXMgdGhlIGZvcm1lciBzd2FtcHMgdGhlIGxhdHRlci4gICovCisgICAgICAvKiBOb3cgd2UgY2FuIHByaW50IHRoZSBoaXN0b2dyYW0uICAqLworICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOworICAgICAgZm9yIChpID0gMDsgaSA8IE1PREVfVEFSR0VUX01BWDsgKytpKQorCXsKKwkgIGlmIChQUk9GSUxFX1JFQURfQ09VTlQgKGRhdGEpIFtpXSAhPSAwKQorCSAgICB7CisJICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICIgICAlKnMgcmVhZDogICUqczogIiwKKwkJCSAgICAgbWF4X25hbWVfbGVuLCBNT0RFX05BTUUgKGkpLAorCQkJICAgICBtYXhfdmFsIDwgMTAwMDAgPyA1IDogMTAsCisJCQkgICAgIENPTU1BUyAoUFJPRklMRV9SRUFEX0NPVU5UIChkYXRhKSBbaV0pKTsKKwkgICAgICBzaW1fcHJvZmlsZV9wcmludF9iYXIgKHNkLCBQUk9GSUxFX0hJU1RPR1JBTV9XSURUSCwKKwkJCQkgICAgIFBST0ZJTEVfUkVBRF9DT1VOVCAoZGF0YSkgW2ldLAorCQkJCSAgICAgbWF4X3ZhbCk7CisJICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOworCSAgICB9CisJICBpZiAoUFJPRklMRV9XUklURV9DT1VOVCAoZGF0YSkgW2ldICE9IDApCisJICAgIHsKKwkgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIiAgICUqcyB3cml0ZTogJSpzOiAiLAorCQkJICAgICBtYXhfbmFtZV9sZW4sIE1PREVfTkFNRSAoaSksCisJCQkgICAgIG1heF92YWwgPCAxMDAwMCA/IDUgOiAxMCwKKwkJCSAgICAgQ09NTUFTIChQUk9GSUxFX1dSSVRFX0NPVU5UIChkYXRhKSBbaV0pKTsKKwkgICAgICBzaW1fcHJvZmlsZV9wcmludF9iYXIgKHNkLCBQUk9GSUxFX0hJU1RPR1JBTV9XSURUSCwKKwkJCQkgICAgIFBST0ZJTEVfV1JJVEVfQ09VTlQgKGRhdGEpIFtpXSwKKwkJCQkgICAgIG1heF92YWwpOworCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiXG4iKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOworfQorCisjZW5kaWYKKworI2lmIFdJVEhfUFJPRklMRV9DT1JFX1AKKworc3RhdGljIHZvaWQKK3Byb2ZpbGVfcHJpbnRfY29yZSAoc2ltX2NwdSAqY3B1LCBpbnQgdmVyYm9zZSkKK3sKKyAgdW5zaWduZWQgaW50IHRvdGFsOworICB1bnNpZ25lZCBpbnQgbWF4X3ZhbDsKKyAgLyogRklYTUU6IE5lZWQgdG8gYWRkIHNtcCBzdXBwb3J0LiAgKi8KKyAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7CisgIFBST0ZJTEVfREFUQSAqZGF0YSA9IENQVV9QUk9GSUxFX0RBVEEgKGNwdSk7CisgIGNoYXIgY29tbWFfYnVmWzIwXTsKKworICBzaW1faW9fcHJpbnRmIChzZCwgIkNPUkUgU3RhdGlzdGljc1xuXG4iKTsKKworICAvKiBGaXJzdCBwYXNzIG92ZXIgZGF0YSBjb21wdXRlcyB2YXJpb3VzIHRoaW5ncy4gICovCisgIHsKKyAgICB1bnNpZ25lZCBtYXA7CisgICAgdG90YWwgPSAwOworICAgIG1heF92YWwgPSAwOworICAgIGZvciAobWFwID0gMDsgbWFwIDwgbnJfbWFwczsgbWFwKyspCisgICAgICB7CisJdG90YWwgKz0gUFJPRklMRV9DT1JFX0NPVU5UIChkYXRhKSBbbWFwXTsKKwlpZiAoUFJPRklMRV9DT1JFX0NPVU5UIChkYXRhKSBbbWFwXSA+IG1heF92YWwpCisJICBtYXhfdmFsID0gUFJPRklMRV9DT1JFX0NPVU5UIChkYXRhKSBbbWFwXTsKKyAgICAgIH0KKyAgfQorCisgIC8qIE9uZSBjb3VsZCB1c2UgUFJPRklMRV9MQUJFTF9XSURUSCBoZXJlLiAgSSBjaG9zZSBub3QgdG8uICAqLworICBzaW1faW9fcHJpbnRmIChzZCwgIiAgVG90YWw6ICAlcyBhY2Nlc3Nlc1xuIiwKKwkJIENPTU1BUyAodG90YWwpKTsKKworICBpZiAodmVyYm9zZSAmJiBtYXhfdmFsICE9IDApCisgICAgeworICAgICAgdW5zaWduZWQgbWFwOworICAgICAgLyogTm93IHdlIGNhbiBwcmludCB0aGUgaGlzdG9ncmFtLiAgKi8KKyAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiXG4iKTsKKyAgICAgIGZvciAobWFwID0gMDsgbWFwIDwgbnJfbWFwczsgbWFwKyspCisJeworCSAgaWYgKFBST0ZJTEVfQ09SRV9DT1VOVCAoZGF0YSkgW21hcF0gIT0gMCkKKwkgICAgeworCSAgICAgIHNpbV9pb19wcmludGYgKHNkLCAiJTEwczoiLCBtYXBfdG9fc3RyIChtYXApKTsKKwkgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIiUqczogIiwKKwkJCSAgICAgbWF4X3ZhbCA8IDEwMDAwID8gNSA6IDEwLAorCQkJICAgICBDT01NQVMgKFBST0ZJTEVfQ09SRV9DT1VOVCAoZGF0YSkgW21hcF0pKTsKKwkgICAgICBzaW1fcHJvZmlsZV9wcmludF9iYXIgKHNkLCBQUk9GSUxFX0hJU1RPR1JBTV9XSURUSCwKKwkJCQkgICAgIFBST0ZJTEVfQ09SRV9DT1VOVCAoZGF0YSkgW21hcF0sCisJCQkJICAgICBtYXhfdmFsKTsKKwkgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIlxuIik7CisJICAgIH0KKwl9CisgICAgfQorCisgIHNpbV9pb19wcmludGYgKHNkLCAiXG4iKTsKK30KKworI2VuZGlmCisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorCitzdGF0aWMgdm9pZAorcHJvZmlsZV9wcmludF9tb2RlbCAoc2ltX2NwdSAqY3B1LCBpbnQgdmVyYm9zZSkKK3sKKyAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7CisgIFBST0ZJTEVfREFUQSAqZGF0YSA9IENQVV9QUk9GSUxFX0RBVEEgKGNwdSk7CisgIHVuc2lnbmVkIGxvbmcgY3RpX3N0YWxsX2N5Y2xlcyA9IFBST0ZJTEVfTU9ERUxfQ1RJX1NUQUxMX0NZQ0xFUyAoZGF0YSk7CisgIHVuc2lnbmVkIGxvbmcgbG9hZF9zdGFsbF9jeWNsZXMgPSBQUk9GSUxFX01PREVMX0xPQURfU1RBTExfQ1lDTEVTIChkYXRhKTsKKyAgdW5zaWduZWQgbG9uZyB0b3RhbF9jeWNsZXMgPSBQUk9GSUxFX01PREVMX1RPVEFMX0NZQ0xFUyAoZGF0YSk7CisgIGNoYXIgY29tbWFfYnVmWzIwXTsKKworICBzaW1faW9fcHJpbnRmIChzZCwgIk1vZGVsICVzIFRpbWluZyBJbmZvcm1hdGlvbiIsCisJCSBNT0RFTF9OQU1FIChDUFVfTU9ERUwgKGNwdSkpKTsKKyNpZmRlZiBTSU1fSEFWRV9BRERSX1JBTkdFCisgIGlmIChQUk9GSUxFX1JBTkdFIChkYXRhKS0+cmFuZ2VzKQorICAgIHNpbV9pb19wcmludGYgKHNkLCAiIChmb3Igc2VsZWN0ZWQgYWRkcmVzcyByYW5nZShzKSkiKTsKKyNlbmRpZgorICBzaW1faW9fcHJpbnRmIChzZCwgIlxuXG4iKTsKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICIgICUtKnMgJXNcbiIsCisJCSBQUk9GSUxFX0xBQkVMX1dJRFRILCAiVGFrZW4gYnJhbmNoZXM6IiwKKwkJIENPTU1BUyAoUFJPRklMRV9NT0RFTF9UQUtFTl9DT1VOVCAoZGF0YSkpKTsKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICIgICUtKnMgJXNcbiIsCisJCSBQUk9GSUxFX0xBQkVMX1dJRFRILCAiVW50YWtlbiBicmFuY2hlczoiLAorCQkgQ09NTUFTIChQUk9GSUxFX01PREVMX1VOVEFLRU5fQ09VTlQgKGRhdGEpKSk7CisgIHNpbV9pb19wcmludGYgKHNkLCAiICAlLSpzICVzXG4iLAorCQkgUFJPRklMRV9MQUJFTF9XSURUSCwgIkN5Y2xlcyBzdGFsbGVkIGR1ZSB0byBicmFuY2hlczoiLAorCQkgQ09NTUFTIChjdGlfc3RhbGxfY3ljbGVzKSk7CisgIHNpbV9pb19wcmludGYgKHNkLCAiICAlLSpzICVzXG4iLAorCQkgUFJPRklMRV9MQUJFTF9XSURUSCwgIkN5Y2xlcyBzdGFsbGVkIGR1ZSB0byBsb2FkczoiLAorCQkgQ09NTUFTIChsb2FkX3N0YWxsX2N5Y2xlcykpOworICBzaW1faW9fcHJpbnRmIChzZCwgIiAgJS0qcyAlc1xuIiwKKwkJIFBST0ZJTEVfTEFCRUxfV0lEVEgsICJUb3RhbCBjeWNsZXMgKCphcHByb3hpbWF0ZSopOiIsCisJCSBDT01NQVMgKHRvdGFsX2N5Y2xlcykpOworICBzaW1faW9fcHJpbnRmIChzZCwgIlxuIik7Cit9CisKKyNlbmRpZgorCit2b2lkCitzaW1fcHJvZmlsZV9wcmludF9iYXIgKFNJTV9ERVNDIHNkLCB1bnNpZ25lZCBpbnQgd2lkdGgsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgdmFsLCB1bnNpZ25lZCBpbnQgbWF4X3ZhbCkKK3sKKyAgdW5zaWduZWQgaW50IGksIGNvdW50OworCisgIGNvdW50ID0gKChkb3VibGUpIHZhbCAvIChkb3VibGUpIG1heF92YWwpICogKGRvdWJsZSkgd2lkdGg7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgc2ltX2lvX3ByaW50ZiAoc2QsICIqIik7Cit9CisKKy8qIFByaW50IHRoZSBzaW11bGF0b3IncyBleGVjdXRpb24gc3BlZWQgZm9yIENQVS4gICovCisKK3N0YXRpYyB2b2lkCitwcm9maWxlX3ByaW50X3NwZWVkIChzaW1fY3B1ICpjcHUpCit7CisgIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjcHUpOworICBQUk9GSUxFX0RBVEEgKmRhdGEgPSBDUFVfUFJPRklMRV9EQVRBIChjcHUpOworICB1bnNpZ25lZCBsb25nIG1pbGxpc2Vjb25kcyA9IHNpbV9ldmVudHNfZWxhcHNlZF90aW1lIChzZCk7CisgIHVuc2lnbmVkIGxvbmcgdG90YWwgPSBQUk9GSUxFX1RPVEFMX0lOU05fQ09VTlQgKGRhdGEpOworICBjaGFyIGNvbW1hX2J1ZlsyMF07CisKKyAgc2ltX2lvX3ByaW50ZiAoc2QsICJTaW11bGF0b3IgRXhlY3V0aW9uIFNwZWVkXG5cbiIpOworCisgIGlmICh0b3RhbCAhPSAwKQorICAgIHNpbV9pb19wcmludGYgKHNkLCAiICBUb3RhbCBpbnN0cnVjdGlvbnM6ICAgJXNcbiIsIENPTU1BUyAodG90YWwpKTsKKworICBpZiAobWlsbGlzZWNvbmRzIDwgMTAwMCkKKyAgICBzaW1faW9fcHJpbnRmIChzZCwgIiAgVG90YWwgZXhlY3V0aW9uIHRpbWU6IDwgMSBzZWNvbmRcblxuIik7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGUgcHJpbnRpbmcgb2YgdGhlIHRpbWUgcm91bmRlZCB0byAyIGRlY2ltYWwgcGxhY2VzIG1ha2VzIHRoZSBzcGVlZAorCSBjYWxjdWxhdGlvbiBzZWVtIGluY29ycmVjdCBbZXZlbiB0aG91Z2ggaXQgaXMgY29ycmVjdF0uICBTbyByb3VuZAorCSBNSUxMSVNFQ09ORFMgZmlyc3QuIFRoaXMgY2FuIG1hcmdpbmFsbHkgYWZmZWN0IHRoZSByZXN1bHQsIGJ1dCBpdCdzCisJIGJldHRlciB0aGF0IHRoZSB1c2VyIG5vdCBwZXJjZWl2ZSB0aGVyZSdzIGEgbWF0aCBlcnJvci4gICovCisgICAgICBkb3VibGUgc2VjcyA9IChkb3VibGUpIG1pbGxpc2Vjb25kcyAvIDEwMDA7CisgICAgICBzZWNzID0gKChkb3VibGUpICh1bnNpZ25lZCBsb25nKSAoc2VjcyAqIDEwMCArIC41KSkgLyAxMDA7CisgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIiAgVG90YWwgZXhlY3V0aW9uIHRpbWU6ICUuMmYgc2Vjb25kc1xuIiwgc2Vjcyk7CisgICAgICAvKiBEb24ndCBjb25mdXNlIHRoaW5ncyB3aXRoIGRhdGEgdGhhdCBpc24ndCB1c2VmdWwuCisJIElmIHdlIHJhbiBmb3IgbGVzcyB0aGFuIDIgc2Vjb25kcywgb25seSB1c2UgdGhlIGRhdGEgaWYgd2UKKwkgZXhlY3V0ZWQgbW9yZSB0aGFuIDEwMCwwMDAgaW5zbnMuICAqLworICAgICAgaWYgKHNlY3MgPj0gMiB8fCB0b3RhbCA+PSAxMDAwMDApCisJc2ltX2lvX3ByaW50ZiAoc2QsICIgIFNpbXVsYXRvciBzcGVlZDogICAgICAlcyBpbnNucy9zZWNvbmRcblxuIiwKKwkJICAgICAgIENPTU1BUyAoKHVuc2lnbmVkIGxvbmcpICgoZG91YmxlKSB0b3RhbCAvIHNlY3MpKSk7CisgICAgfQorfQorCisvKiBQcmludCBzZWxlY3RlZCBhZGRyZXNzIHJhbmdlcy4gICovCisKK3N0YXRpYyB2b2lkCitwcm9maWxlX3ByaW50X2FkZHJfcmFuZ2VzIChzaW1fY3B1ICpjcHUpCit7CisgIEFERFJfU1VCUkFOR0UgKmFzciA9IFBST0ZJTEVfUkFOR0UgKENQVV9QUk9GSUxFX0RBVEEgKGNwdSkpLT5yYW5nZXM7CisgIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjcHUpOworCisgIGlmIChhc3IpCisgICAgeworICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJTZWxlY3RlZCBhZGRyZXNzIHJhbmdlc1xuXG4iKTsKKyAgICAgIHdoaWxlIChhc3IgIT0gTlVMTCkKKwl7CisJICBzaW1faW9fcHJpbnRmIChzZCwgIiAgMHglbHggLSAweCVseFxuIiwKKwkJCSAobG9uZykgYXNyLT5zdGFydCwgKGxvbmcpIGFzci0+ZW5kKTsKKwkgIGFzciA9IGFzci0+bmV4dDsKKwl9CisgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIlxuIik7CisgICAgfQorfQorCisvKiBUb3AgbGV2ZWwgZnVuY3Rpb24gdG8gcHJpbnQgYWxsIHN1bW1hcnkgcHJvZmlsZSBpbmZvcm1hdGlvbi4KKyAgIEl0IGlzIFtjdXJyZW50bHldIGludGVuZGVkIHRoYXQgYWxsIHN1Y2ggZGF0YSBpcyBwcmludGVkIGJ5IHRoaXMgZnVuY3Rpb24uCisgICBJJ2QgcmF0aGVyIGtlZXAgaXQgYWxsIGluIG9uZSBwbGFjZSBmb3Igbm93LiAgVG8gdGhhdCBlbmQsIE1JU0NfQ1BVIGFuZAorICAgTUlTQyBhcmUgY2FsbGJhY2tzIHVzZWQgdG8gcHJpbnQgYW55IG1pc2NlbGxhbmVvdXMgZGF0YS4KKworICAgT25lIG1pZ2h0IHdhbnQgdG8gYWRkIGEgdXNlciBvcHRpb24gdGhhdCBhbGxvd3MgcHJpbnRpbmcgYnkgdHlwZSBvciBieSBjcHUKKyAgIChpLmUuIHByaW50IGFsbCBpbnNuIGRhdGEgZm9yIGVhY2ggY3B1IGZpcnN0LCBvciBwcmludCBkYXRhIGNwdSBieSBjcHUpLgorICAgVGhpcyBtYXkgYmUgYSBjYXNlIG9mIGZlYXR1cml0aXMgc28gaXQncyBjdXJyZW50bHkgbGVmdCBvdXQuCisKKyAgIE5vdGUgdGhhdCByZXN1bHRzIGFyZSBpbmRlbnRlZCB0d28gc3BhY2VzIHRvIGRpc3Rpbmd1aXNoIHRoZW0gZnJvbQorICAgc2VjdGlvbiB0aXRsZXMuICAqLworCitzdGF0aWMgdm9pZAorcHJvZmlsZV9pbmZvIChTSU1fREVTQyBzZCwgaW50IHZlcmJvc2UpCit7CisgIGludCBpLGM7CisgIGludCBwcmludF90aXRsZV9wID0gMDsKKworICAvKiBPbmx5IHByaW50IHRoZSB0aXRsZSBpZiBzb21lIGRhdGEgaGFzIGJlZW4gY29sbGVjdGVkLiAgKi8KKyAgLyogPz8/IFdoeSBkb24ndCB3ZSBqdXN0IGV4aXQgaWYgbm8gZGF0YSBjb2xsZWN0ZWQ/ICAqLworICAvKiBGSVhNRTogSWYgdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIGNhbiBiZSBzZWxlY3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lLAorICAgICB0aGVuIE1BWF9OUl9QUk9DRVNTT1JTIHdpbGwgbmVlZCB0byB0YWtlIGFuIGFyZ3VtZW50IG9mIGBzZCcuICAqLworCisgIGZvciAoYyA9IDA7IGMgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytjKQorICAgIHsKKyAgICAgIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIGMpOworICAgICAgUFJPRklMRV9EQVRBICpkYXRhID0gQ1BVX1BST0ZJTEVfREFUQSAoY3B1KTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9QUk9GSUxFX1ZBTFVFUzsgKytpKQorCWlmIChQUk9GSUxFX0ZMQUdTIChkYXRhKSBbaV0pCisJICBwcmludF90aXRsZV9wID0gMTsKKyAgICAgIC8qIE9uZSBjb3VsZCBicmVhayBvdXQgZWFybHkgaWYgcHJpbnRfdGl0bGVfcCBpcyBzZXQuICAqLworICAgIH0KKyAgaWYgKHByaW50X3RpdGxlX3ApCisgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJTdW1tYXJ5IHByb2ZpbGluZyByZXN1bHRzOlxuXG4iKTsKKworICAvKiBMb29wLCBjcHUgYnkgY3B1LCBwcmludGluZyByZXN1bHRzLiAgKi8KKworICBmb3IgKGMgPSAwOyBjIDwgTUFYX05SX1BST0NFU1NPUlM7ICsrYykKKyAgICB7CisgICAgICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCBjKTsKKyAgICAgIFBST0ZJTEVfREFUQSAqZGF0YSA9IENQVV9QUk9GSUxFX0RBVEEgKGNwdSk7CisKKyAgICAgIGlmIChNQVhfTlJfUFJPQ0VTU09SUyA+IDEKKwkgICYmICgwCisjaWYgV0lUSF9QUk9GSUxFX0lOU05fUAorCSAgICAgIHx8IFBST0ZJTEVfRkxBR1MgKGRhdGEpIFtQUk9GSUxFX0lOU05fSURYXQorI2VuZGlmCisjaWYgV0lUSF9QUk9GSUxFX01FTU9SWV9QCisJICAgICAgfHwgUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfTUVNT1JZX0lEWF0KKyNlbmRpZgorI2lmIFdJVEhfUFJPRklMRV9DT1JFX1AKKwkgICAgICB8fCBQUk9GSUxFX0ZMQUdTIChkYXRhKSBbUFJPRklMRV9DT1JFX0lEWF0KKyNlbmRpZgorI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisJICAgICAgfHwgUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfTU9ERUxfSURYXQorI2VuZGlmCisjaWYgV0lUSF9QUk9GSUxFX1NDQUNIRV9QICYmIFdJVEhfU0NBQ0hFCisJICAgICAgfHwgUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfU0NBQ0hFX0lEWF0KKyNlbmRpZgorI2lmIFdJVEhfUFJPRklMRV9QQ19QCisJICAgICAgfHwgUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfUENfSURYXQorI2VuZGlmCisJICAgICAgKSkKKwl7CisJICBzaW1faW9fcHJpbnRmIChzZCwgIkNQVSAlZFxuXG4iLCBjKTsKKwl9CisKKyNpZmRlZiBTSU1fSEFWRV9BRERSX1JBTkdFCisgICAgICBpZiAocHJpbnRfdGl0bGVfcAorCSAgJiYgKFBST0ZJTEVfSU5TTl9QIChjcHUpCisJICAgICAgfHwgUFJPRklMRV9NT0RFTF9QIChjcHUpKSkKKwlwcm9maWxlX3ByaW50X2FkZHJfcmFuZ2VzIChjcHUpOworI2VuZGlmCisKKyNpZiBXSVRIX1BST0ZJTEVfSU5TTl9QCisgICAgICBpZiAoUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfSU5TTl9JRFhdKQorCXByb2ZpbGVfcHJpbnRfaW5zbiAoY3B1LCB2ZXJib3NlKTsKKyNlbmRpZgorCisjaWYgV0lUSF9QUk9GSUxFX01FTU9SWV9QCisgICAgICBpZiAoUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfTUVNT1JZX0lEWF0pCisJcHJvZmlsZV9wcmludF9tZW1vcnkgKGNwdSwgdmVyYm9zZSk7CisjZW5kaWYKKworI2lmIFdJVEhfUFJPRklMRV9DT1JFX1AKKyAgICAgIGlmIChQUk9GSUxFX0ZMQUdTIChkYXRhKSBbUFJPRklMRV9DT1JFX0lEWF0pCisJcHJvZmlsZV9wcmludF9jb3JlIChjcHUsIHZlcmJvc2UpOworI2VuZGlmCisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAgICAgaWYgKFBST0ZJTEVfRkxBR1MgKGRhdGEpIFtQUk9GSUxFX01PREVMX0lEWF0pCisJcHJvZmlsZV9wcmludF9tb2RlbCAoY3B1LCB2ZXJib3NlKTsKKyNlbmRpZgorCisjaWYgV0lUSF9QUk9GSUxFX1NDQUNIRV9QICYmIFdJVEhfU0NBQ0hFCisgICAgICBpZiAoUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfU0NBQ0hFX0lEWF0pCisJc2NhY2hlX3ByaW50X3Byb2ZpbGUgKGNwdSwgdmVyYm9zZSk7CisjZW5kaWYKKworI2lmIFdJVEhfUFJPRklMRV9QQ19QCisgICAgICBpZiAoUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfUENfSURYXSkKKwlwcm9maWxlX3ByaW50X3BjIChjcHUsIHZlcmJvc2UpOworI2VuZGlmCisKKyAgICAgIC8qIFByaW50IGNwdS1zcGVjaWZpYyBkYXRhIGJlZm9yZSB0aGUgZXhlY3V0aW9uIHNwZWVkLiAgKi8KKyAgICAgIGlmIChQUk9GSUxFX0lORk9fQ1BVX0NBTExCQUNLIChkYXRhKSAhPSBOVUxMKQorCVBST0ZJTEVfSU5GT19DUFVfQ0FMTEJBQ0sgKGRhdGEpIChjcHUsIHZlcmJvc2UpOworCisgICAgICAvKiBBbHdheXMgdHJ5IHRvIHByaW50IGV4ZWN1dGlvbiB0aW1lIGFuZCBzcGVlZC4gICovCisgICAgICBpZiAodmVyYm9zZQorCSAgfHwgUFJPRklMRV9GTEFHUyAoZGF0YSkgW1BST0ZJTEVfSU5TTl9JRFhdKQorCXByb2ZpbGVfcHJpbnRfc3BlZWQgKGNwdSk7CisgICAgfQorCisgIC8qIEZpbmFsbHkgcHJpbnQgbm9uLWNwdSBzcGVjaWZpYyBtaXNjZWxsYW5lb3VzIGRhdGEuICAqLworICBpZiAoU1RBVEVfUFJPRklMRV9JTkZPX0NBTExCQUNLIChzZCkpCisgICAgU1RBVEVfUFJPRklMRV9JTkZPX0NBTExCQUNLIChzZCkgKHNkLCB2ZXJib3NlKTsKKworfQorDAorLyogSW5zdGFsbCBwcm9maWxpbmcgc3VwcG9ydCBpbiB0aGUgc2ltdWxhdG9yLiAgKi8KKworU0lNX1JDCitwcm9maWxlX2luc3RhbGwgKFNJTV9ERVNDIHNkKQoreworICBpbnQgaTsKKworICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworICBzaW1fYWRkX29wdGlvbl90YWJsZSAoc2QsIE5VTEwsIHByb2ZpbGVfb3B0aW9ucyk7CisgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytpKQorICAgIG1lbXNldCAoQ1BVX1BST0ZJTEVfREFUQSAoU1RBVEVfQ1BVIChzZCwgaSkpLCAwLAorCSAgICBzaXplb2YgKCogQ1BVX1BST0ZJTEVfREFUQSAoU1RBVEVfQ1BVIChzZCwgaSkpKSk7CisjaWYgV0lUSF9QUk9GSUxFX0lOU05fUAorICBzaW1fbW9kdWxlX2FkZF9pbml0X2ZuIChzZCwgcHJvZmlsZV9pbnNuX2luaXQpOworI2VuZGlmCisjaWYgV0lUSF9QUk9GSUxFX1BDX1AKKyAgc2ltX21vZHVsZV9hZGRfdW5pbnN0YWxsX2ZuIChzZCwgcHJvZmlsZV9wY191bmluc3RhbGwpOworICBzaW1fbW9kdWxlX2FkZF9pbml0X2ZuIChzZCwgcHJvZmlsZV9wY19pbml0KTsKKyNlbmRpZgorICBzaW1fbW9kdWxlX2FkZF9pbml0X2ZuIChzZCwgcHJvZmlsZV9pbml0KTsKKyAgc2ltX21vZHVsZV9hZGRfdW5pbnN0YWxsX2ZuIChzZCwgcHJvZmlsZV91bmluc3RhbGwpOworICBzaW1fbW9kdWxlX2FkZF9pbmZvX2ZuIChzZCwgcHJvZmlsZV9pbmZvKTsKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworc3RhdGljIFNJTV9SQworcHJvZmlsZV9pbml0IChTSU1fREVTQyBzZCkKK3sKKyNpZmRlZiBTSU1fSEFWRV9BRERSX1JBTkdFCisgIC8qIENoZWNrIGlmIGEgcmFuZ2UgaGFzIGJlZW4gc3BlY2lmaWVkIHdpdGhvdXQgc3BlY2lmeWluZyB3aGF0IHRvCisgICAgIGNvbGxlY3QuICAqLworICB7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1BST0NFU1NPUlM7ICsraSkKKyAgICAgIHsKKwlzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCBpKTsKKworCWlmIChBRERSX1JBTkdFX1JBTkdFUyAoUFJPRklMRV9SQU5HRSAoQ1BVX1BST0ZJTEVfREFUQSAoY3B1KSkpCisJICAgICYmICEgKFBST0ZJTEVfSU5TTl9QIChjcHUpCisJCSAgfHwgUFJPRklMRV9NT0RFTF9QIChjcHUpKSkKKwkgIHsKKwkgICAgc2ltX2lvX2VwcmludGZfY3B1IChjcHUsICJQcm9maWxpbmcgYWRkcmVzcyByYW5nZSBzcGVjaWZpZWQgd2l0aG91dCAtLXByb2ZpbGUtaW5zbiBvciAtLXByb2ZpbGUtbW9kZWwuXG4iKTsKKwkgICAgc2ltX2lvX2VwcmludGZfY3B1IChjcHUsICJBZGRyZXNzIHJhbmdlIGlnbm9yZWQuXG4iKTsKKwkgICAgc2ltX2FkZHJfcmFuZ2VfZGVsZXRlIChQUk9GSUxFX1JBTkdFIChDUFVfUFJPRklMRV9EQVRBIChjcHUpKSwKKwkJCQkgICAwLCB+IChhZGRyZXNzX3dvcmQpIDApOworCSAgfQorICAgICAgfQorICB9CisjZW5kaWYKKworICByZXR1cm4gU0lNX1JDX09LOworfQorCitzdGF0aWMgdm9pZAorcHJvZmlsZV91bmluc3RhbGwgKFNJTV9ERVNDIHNkKQoreworICBpbnQgaSxqOworCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytpKQorICAgIHsKKyAgICAgIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIGkpOworICAgICAgUFJPRklMRV9EQVRBICpkYXRhID0gQ1BVX1BST0ZJTEVfREFUQSAoY3B1KTsKKworICAgICAgaWYgKFBST0ZJTEVfRklMRSAoZGF0YSkgIT0gTlVMTCkKKwl7CisJICAvKiBJZiBvdXRwdXQgZnJvbSBkaWZmZXJlbnQgY3B1cyBpcyBnb2luZyB0byB0aGUgc2FtZSBmaWxlLAorCSAgICAgYXZvaWQgY2xvc2luZyB0aGUgZmlsZSB0d2ljZS4gICovCisJICBmb3IgKGogPSAwOyBqIDwgaTsgKytqKQorCSAgICBpZiAoUFJPRklMRV9GSUxFIChDUFVfUFJPRklMRV9EQVRBIChTVEFURV9DUFUgKHNkLCBqKSkpCisJCT09IFBST0ZJTEVfRklMRSAoZGF0YSkpCisJICAgICAgYnJlYWs7CisJICBpZiAoaSA9PSBqKQorCSAgICBmY2xvc2UgKFBST0ZJTEVfRklMRSAoZGF0YSkpOworCX0KKworICAgICAgaWYgKFBST0ZJTEVfSU5TTl9DT1VOVCAoZGF0YSkgIT0gTlVMTCkKKwl6ZnJlZSAoUFJPRklMRV9JTlNOX0NPVU5UIChkYXRhKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tcHJvZmlsZS5oIGIvc2ltL2NvbW1vbi9zaW0tcHJvZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOGQ5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS1wcm9maWxlLmgKQEAgLTAsMCArMSwyODkgQEAKKy8qIFByb2ZpbGUgaGVhZGVyIGZvciBzaW11bGF0b3JzIHVzaW5nIGNvbW1vbiBmcmFtZXdvcmsuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIFNJTV9QUk9GSUxFX0gKKyNkZWZpbmUgU0lNX1BST0ZJTEVfSAorCisjaWZuZGVmIFdJVEhfUFJPRklMRQorRXJyb3IsIFdJVEhfUFJPRklMRSBub3QgZGVmaW5lZC4KKyNlbmRpZgorCisvKiBTdGFuZGFyZCBwcm9maWxhYmxlIGVudGl0aWVzLiAgKi8KKworZW51bSB7CisgIC8qIFByb2ZpbGUgaW5zbiB1c2FnZS4gICovCisgIFBST0ZJTEVfSU5TTl9JRFggPSAxLAorCisgIC8qIFByb2ZpbGUgbWVtb3J5IHVzYWdlLiAgKi8KKyAgUFJPRklMRV9NRU1PUllfSURYLAorCisgIC8qIFByb2ZpbGUgdGhlIGNwdSBtb2RlbCAoY3ljbGVzLCBldGMuKS4gICovCisgIFBST0ZJTEVfTU9ERUxfSURYLAorCisgIC8qIFByb2ZpbGUgdGhlIHNpbXVsYXRvcidzIGV4ZWN1dGlvbiBjYWNoZS4gICovCisgIFBST0ZJTEVfU0NBQ0hFX0lEWCwKKworICAvKiBQcm9maWxlIHRoZSBQQy4gICovCisgIFBST0ZJTEVfUENfSURYLAorCisgIC8qIFByb2ZpbGUgc2ltLWNvcmUuYyBzdHVmZi4gICovCisgIC8qID8/PyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIFBST0ZJTEVfTUVNT1JZX0lEWCBpcyAuLi4gPyAgKi8KKyAgUFJPRklMRV9DT1JFX0lEWCwKKworICAvKiBTaW11bGF0b3Igc3BlY2lmaWMgcHJvZmlsZSBiaXRzIGJlZ2luIGhlcmUuICAqLworICBQUk9GSUxFX05FWFRfSURYCit9OworCisvKiBNYXhpbXVtIG51bWJlciBvZiBwcm9maWxhYmxlIGVudGl0aWVzLiAgKi8KKyNpZm5kZWYgTUFYX1BST0ZJTEVfVkFMVUVTCisjZGVmaW5lIE1BWF9QUk9GSUxFX1ZBTFVFUyAzMgorI2VuZGlmCisKKy8qIFRoZSAtcCBvcHRpb24gb25seSBwcmludHMgdXNlZnVsIHZhbHVlcy4gIEl0J3MgZWFzeSB0byB0eXBlIGFuZCBzaG91bGRuJ3QKKyAgIHNwbGF0IG9uIHRoZSBzY3JlZW4gZXZlcnl0aGluZyB1bmRlciB0aGUgc3VuIG1ha2luZyBub3RoaW5nIGVhc3kgdG8KKyAgIGZpbmQuICAqLworI2RlZmluZSBQUk9GSUxFX1VTRUZVTF9NQVNLIFwKKygoMSA8PCBQUk9GSUxFX0lOU05fSURYKSBcCisgfCAoMSA8PCBQUk9GSUxFX01FTU9SWV9JRFgpIFwKKyB8ICgxIDw8IFBST0ZJTEVfTU9ERUxfSURYKSBcCisgfCAoMSA8PCBQUk9GSUxFX0NPUkVfSURYKSkKKworLyogVXRpbGl0eSB0byBwYXJzZSBhIC0tcHJvZmlsZS08Zm9vPiBvcHRpb24uICAqLworLyogPz8/IE9uIHRoZSBvbmUgaGFuZCBhbGwgY2FsbHMgY291bGQgYmUgY29uZmluZWQgdG8gc2ltLXByb2ZpbGUuYywgYnV0CisgICBvbiB0aGUgb3RoZXIgaGFuZCBrZWVwaW5nIGEgbW9kdWxlJ3MgcHJvZmlsaW5nIG9wdGlvbiB3aXRoIHRoZSBtb2R1bGUncworICAgc291cmNlIGlzIGNsZWFuZXIuICAgKi8KKworU0lNX1JDIHNpbV9wcm9maWxlX3NldF9vcHRpb24gKFNJTV9ERVNDIHNkXywgY29uc3QgY2hhciAqbmFtZV8sIGludCBpZHhfLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmFyZ18pOworDAorLyogTWFza3Mgc28gV0lUSF9QUk9GSUxFIGNhbiBoYXZlIHN5bWJvbGljIHZhbHVlcy4KKyAgIFRoZSBjYXNlIGNob2ljZSBoZXJlIGlzIG9uIHB1cnBvc2UuICBUaGUgbG93ZXJjYXNlIHBhcnRzIGFyZSBhcmdzIHRvCisgICAtLXdpdGgtcHJvZmlsZS4gICovCisjZGVmaW5lIFBST0ZJTEVfaW5zbiAgICgxIDw8IFBST0ZJTEVfSU5TTl9JRFgpCisjZGVmaW5lIFBST0ZJTEVfbWVtb3J5ICgxIDw8IFBST0ZJTEVfTUVNT1JZX0lEWCkKKyNkZWZpbmUgUFJPRklMRV9tb2RlbCAgKDEgPDwgUFJPRklMRV9NT0RFTF9JRFgpCisjZGVmaW5lIFBST0ZJTEVfc2NhY2hlICgxIDw8IFBST0ZJTEVfU0NBQ0hFX0lEWCkKKyNkZWZpbmUgUFJPRklMRV9wYyAgICAgKDEgPDwgUFJPRklMRV9QQ19JRFgpCisjZGVmaW5lIFBST0ZJTEVfY29yZSAgICgxIDw8IFBST0ZJTEVfQ09SRV9JRFgpCisKKy8qIFByZXByb2Nlc3NvciBtYWNyb3MgdG8gc2ltcGxpZnkgdGVzdHMgb2YgV0lUSF9QUk9GSUxFLiAgKi8KKyNkZWZpbmUgV0lUSF9QUk9GSUxFX0lOU05fUCAoV0lUSF9QUk9GSUxFICYgUFJPRklMRV9pbnNuKQorI2RlZmluZSBXSVRIX1BST0ZJTEVfTUVNT1JZX1AgKFdJVEhfUFJPRklMRSAmIFBST0ZJTEVfbWVtb3J5KQorI2RlZmluZSBXSVRIX1BST0ZJTEVfTU9ERUxfUCAoV0lUSF9QUk9GSUxFICYgUFJPRklMRV9tb2RlbCkKKyNkZWZpbmUgV0lUSF9QUk9GSUxFX1NDQUNIRV9QIChXSVRIX1BST0ZJTEUgJiBQUk9GSUxFX3NjYWNoZSkKKyNkZWZpbmUgV0lUSF9QUk9GSUxFX1BDX1AgKFdJVEhfUFJPRklMRSAmIFBST0ZJTEVfcGMpCisjZGVmaW5lIFdJVEhfUFJPRklMRV9DT1JFX1AgKFdJVEhfUFJPRklMRSAmIFBST0ZJTEVfY29yZSkKKworLyogSWYgTUFYX1RBUkdFVF9NT0RFUyBpc24ndCBkZWZpbmVkLCB3ZSBjYW4ndCBkbyBtZW1vcnkgcHJvZmlsaW5nLgorICAgPz8/IEl0IGlzIGludGVuZGVkIHRoYXQgdGhpcyBpcyBhIHRlbXBvcmFyeSBvY2N1cmVuY2UuICBOb3JtYWxseQorICAgTUFYX1RBUkdFVF9NT0RFUyBpcyBkZWZpbmVkLiAgKi8KKyNpZm5kZWYgTUFYX1RBUkdFVF9NT0RFUworI3VuZGVmIFdJVEhfUFJPRklMRV9NRU1PUllfUAorI2RlZmluZSBXSVRIX1BST0ZJTEVfTUVNT1JZX1AgMAorI2VuZGlmCisKKy8qIE9ubHkgYnVpbGQgTU9ERUwgY29kZSB3aGVuIHRoZSB0YXJnZXQgc2ltdWxhdG9yIGhhcyBzdXBwb3J0IGZvciBpdCAqLworI2lmbmRlZiBTSU1fSEFWRV9NT0RFTAorI3VuZGVmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisjZGVmaW5lIFdJVEhfUFJPRklMRV9NT0RFTF9QIDAKKyNlbmRpZgorCisvKiBQcm9maWxpbmcgaW5zdGFsbCBoYW5kbGVyLiAgKi8KK01PRFVMRV9JTlNUQUxMX0ZOIHByb2ZpbGVfaW5zdGFsbDsKKworLyogT3V0cHV0IGZvcm1hdCBtYWNyb3MuICAqLworI2lmbmRlZiBQUk9GSUxFX0hJU1RPR1JBTV9XSURUSAorI2RlZmluZSBQUk9GSUxFX0hJU1RPR1JBTV9XSURUSCA0MAorI2VuZGlmCisjaWZuZGVmIFBST0ZJTEVfTEFCRUxfV0lEVEgKKyNkZWZpbmUgUFJPRklMRV9MQUJFTF9XSURUSCAzMgorI2VuZGlmCisMCisvKiBDYWxsYmFja3MgZm9yIGludGVybmFsIHByb2ZpbGVfaW5mby4KKyAgIFRoZSBjYWxsYmFja3MgbWF5IGJlIE5VTEwgbWVhbmluZyB0aGVyZSBpc24ndCBvbmUuCisgICBOb3RlIHRoYXQgcmVzdWx0cyBhcmUgaW5kZW50ZWQgdHdvIHNwYWNlcyB0byBkaXN0aW5ndWlzaCB0aGVtIGZyb20KKyAgIHNlY3Rpb24gdGl0bGVzLgorICAgSWYgbm9uLU5VTEwsIFBST0ZJTEVfQ0FMTEJBQ0sgaXMgY2FsbGVkIHRvIHByaW50IGV4dHJhIG5vbi1jcHUgcmVsYXRlZCBkYXRhLgorICAgSWYgbm9uLU5VTEwsIFBST0ZJTEVfQ1BVX0NBTExCQUNLIGlzIGNhbGxlZCB0byBwcmludCBleHRyYSBjcHUgcmVsYXRlZCBkYXRhLgorICAgKi8KKwordHlwZWRlZiB2b2lkIChQUk9GSUxFX0lORk9fQ0FMTEJBQ0tfRk4pIChTSU1fREVTQywgaW50KTsKK3N0cnVjdCBfc2ltX2NwdTsgLyogZm9yd2FyZCByZWZlcmVuY2UgKi8KK3R5cGVkZWYgdm9pZCAoUFJPRklMRV9JTkZPX0NQVV9DQUxMQkFDS19GTikgKHN0cnVjdCBfc2ltX2NwdSAqY3B1LCBpbnQgdmVyYm9zZSk7CisKKwwKKy8qIFN0cnVjdCBjb250YWluaW5nIG1vc3QgcHJvZmlsaW5nIGRhdGEuCisgICBJdCBkb2Vzbid0IGNvbnRhaW4gYWxsIHByb2ZpbGluZyBkYXRhIGJlY2F1c2UgZm9yIGV4YW1wbGUgc2NhY2hlIGRhdGEKKyAgIGlzIGtlcHQgd2l0aCB0aGUgcmVzdCBvZiBzY2FjaGUgc3VwcG9ydC4gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogR2xvYmFsIHN1bW1hcnkgb2YgYWxsIHRoZSBjdXJyZW50IHByb2ZpbGluZyBvcHRpb25zLiAgKi8KKyAgY2hhciBwcm9maWxlX2FueV9wOworCisgIC8qIEJvb2xlYW4gYXJyYXkgb2Ygc3BlY2lmaWVkIHByb2ZpbGluZyBmbGFncy4gICovCisgIGNoYXIgcHJvZmlsZV9mbGFnc1tNQVhfUFJPRklMRV9WQUxVRVNdOworI2RlZmluZSBQUk9GSUxFX0ZMQUdTKHApICgocCktPnByb2ZpbGVfZmxhZ3MpCisKKyAgLyogVGhlIHRvdGFsIGluc24gY291bnQgaXMgdHJhY2tlZCBzZXBhcmF0ZWx5LgorICAgICBJdCBpcyBhbHdheXMgY29tcHV0ZWQsIHJlZ2FyZGxlc3Mgb2YgaW5zbiBwcm9maWxpbmcuICAqLworICB1bnNpZ25lZCBsb25nIHRvdGFsX2luc25fY291bnQ7CisjZGVmaW5lIFBST0ZJTEVfVE9UQUxfSU5TTl9DT1VOVChwKSAoKHApLT50b3RhbF9pbnNuX2NvdW50KQorCisjaWYgV0lUSF9QUk9GSUxFX0lOU05fUAorICB1bnNpZ25lZCBpbnQgKmluc25fY291bnQ7CisjZGVmaW5lIFBST0ZJTEVfSU5TTl9DT1VOVChwKSAoKHApLT5pbnNuX2NvdW50KQorI2VuZGlmCisKKyNpZiBXSVRIX1BST0ZJTEVfTUVNT1JZX1AKKyAgdW5zaWduZWQgaW50IHJlYWRfY291bnRbTUFYX1RBUkdFVF9NT0RFU107CisjZGVmaW5lIFBST0ZJTEVfUkVBRF9DT1VOVChwKSAoKHApLT5yZWFkX2NvdW50KQorICB1bnNpZ25lZCBpbnQgd3JpdGVfY291bnRbTUFYX1RBUkdFVF9NT0RFU107CisjZGVmaW5lIFBST0ZJTEVfV1JJVEVfQ09VTlQocCkgKChwKS0+d3JpdGVfY291bnQpCisjZW5kaWYKKworI2lmIFdJVEhfUFJPRklMRV9DT1JFX1AKKyAgLyogQ291bnQgcmVhZC93cml0ZS9leGVjIGFjY2Vzc2VzIHNlcGFyYXRseS4gKi8KKyAgdW5zaWduZWQgaW50IGNvcmVfY291bnRbbnJfbWFwc107CisjZGVmaW5lIFBST0ZJTEVfQ09SRV9DT1VOVChwKSAoKHApLT5jb3JlX2NvdW50KQorI2VuZGlmCisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiA/Pz8gUXVpY2sgaGFjayB1bnRpbCBtb3JlIGVsYWJvcmF0ZSBzY2hlbWUgaXMgZmluaXNoZWQuICAqLworICAvKiBUb3RhbCBjeWNsZSBjb3VudCwgaW5jbHVkaW5nIHN0YWxscy4gICovCisgIHVuc2lnbmVkIGxvbmcgdG90YWxfY3ljbGVzOworI2RlZmluZSBQUk9GSUxFX01PREVMX1RPVEFMX0NZQ0xFUyhwKSAoKHApLT50b3RhbF9jeWNsZXMpCisgIC8qIFN0YWxscyBkdWUgdG8gYnJhbmNoZXMuICAqLworICB1bnNpZ25lZCBsb25nIGN0aV9zdGFsbF9jeWNsZXM7CisjZGVmaW5lIFBST0ZJTEVfTU9ERUxfQ1RJX1NUQUxMX0NZQ0xFUyhwKSAoKHApLT5jdGlfc3RhbGxfY3ljbGVzKQorICB1bnNpZ25lZCBsb25nIGxvYWRfc3RhbGxfY3ljbGVzOworI2RlZmluZSBQUk9GSUxFX01PREVMX0xPQURfU1RBTExfQ1lDTEVTKHApICgocCktPmxvYWRfc3RhbGxfY3ljbGVzKQorICAvKiBOdW1iZXIgb2YgY3ljbGVzIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHRvb2suICAqLworICB1bnNpZ25lZCBsb25nIGN1cl9pbnNuX2N5Y2xlczsKKyNkZWZpbmUgUFJPRklMRV9NT0RFTF9DVVJfSU5TTl9DWUNMRVMocCkgKChwKS0+Y3VyX2luc25fY3ljbGVzKQorCisgIC8qIFRha2VuIGFuZCBub3QtdGFrZW4gYnJhbmNoZXMgKGFuZCBvdGhlciBjdGkncykuICAqLworICB1bnNpZ25lZCBsb25nIHRha2VuX2NvdW50LCB1bnRha2VuX2NvdW50OworI2RlZmluZSBQUk9GSUxFX01PREVMX1RBS0VOX0NPVU5UKHApICgocCktPnRha2VuX2NvdW50KQorI2RlZmluZSBQUk9GSUxFX01PREVMX1VOVEFLRU5fQ09VTlQocCkgKChwKS0+dW50YWtlbl9jb3VudCkKKyNlbmRpZgorCisjaWYgV0lUSF9QUk9GSUxFX1BDX1AKKyAgLyogUEMgcHJvZmlsaW5nIGF0dGVtcHRzIHRvIGRldGVybWluZSBmdW5jdGlvbiB1c2FnZSBieSBzYW1wbGluZyB0aGUgUEMKKyAgICAgZXZlcnkgc28gbWFueSBpbnN0cnVjdGlvbnMuICAqLworICB1bnNpZ25lZCBpbnQgcHJvZmlsZV9wY19mcmVxOworI2RlZmluZSBQUk9GSUxFX1BDX0ZSRVEocCkgKChwKS0+cHJvZmlsZV9wY19mcmVxKQorICB1bnNpZ25lZCBpbnQgcHJvZmlsZV9wY19ucl9idWNrZXRzOworI2RlZmluZSBQUk9GSUxFX1BDX05SX0JVQ0tFVFMocCkgKChwKS0+cHJvZmlsZV9wY19ucl9idWNrZXRzKQorICBhZGRyZXNzX3dvcmQgcHJvZmlsZV9wY19zdGFydDsKKyNkZWZpbmUgUFJPRklMRV9QQ19TVEFSVChwKSAoKHApLT5wcm9maWxlX3BjX3N0YXJ0KQorICBhZGRyZXNzX3dvcmQgcHJvZmlsZV9wY19lbmQ7CisjZGVmaW5lIFBST0ZJTEVfUENfRU5EKHApICgocCktPnByb2ZpbGVfcGNfZW5kKQorICB1bnNpZ25lZCBwcm9maWxlX3BjX3NoaWZ0OworI2RlZmluZSBQUk9GSUxFX1BDX1NISUZUKHApICgocCktPnByb2ZpbGVfcGNfc2hpZnQpCisjZGVmaW5lIFBST0ZJTEVfUENfQlVDS0VUX1NJWkUocCkgKFBST0ZJTEVfUENfU0hJRlQgKHApID8gKDEgPDwgUFJPRklMRV9QQ19TSElGVCAocCkpIDogMCkKKyAgdW5zaWduZWQgKnByb2ZpbGVfcGNfY291bnQ7CisjZGVmaW5lIFBST0ZJTEVfUENfQ09VTlQocCkgKChwKS0+cHJvZmlsZV9wY19jb3VudCkKKyAgc2ltX2V2ZW50ICpwcm9maWxlX3BjX2V2ZW50OworI2RlZmluZSBQUk9GSUxFX1BDX0VWRU5UKHApICgocCktPnByb2ZpbGVfcGNfZXZlbnQpCisjZW5kaWYKKworICAvKiBQcm9maWxlIG91dHB1dCBnb2VzIHRvIHRoaXMgb3Igc3RkZXJyIGlmIE5VTEwuCisgICAgIFdlIGNhbid0IHN0b3JlIGBzdGRlcnInIGhlcmUgYXMgc3RkZXJyIGdvZXMgdGhyb3VnaCBhIGNhbGxiYWNrLiAgKi8KKyAgRklMRSAqcHJvZmlsZV9maWxlOworI2RlZmluZSBQUk9GSUxFX0ZJTEUocCkgKChwKS0+cHJvZmlsZV9maWxlKQorCisgIC8qIFdoZW4gcmVwb3J0aW5nIGEgcHJvZmlsZSBzdW1tYXJ5LCBob29rIHRvIGluY2x1ZGUgcGVyLXByb2Nlc3NvcgorICAgICB0YXJnZXQgc3BlY2lmaWMgcHJvZmlsZSBpbmZvcm1hdGlvbiAqLworICBQUk9GSUxFX0lORk9fQ1BVX0NBTExCQUNLX0ZOICppbmZvX2NwdV9jYWxsYmFjazsKKyNkZWZpbmUgUFJPRklMRV9JTkZPX0NQVV9DQUxMQkFDSyhwKSAoKHApLT5pbmZvX2NwdV9jYWxsYmFjaykKKworICAvKiBXaGVuIHJlcG9ydGluZyBhIHByb2ZpbGUgc3VtbWFyeSwgaG9vayB0byBpbmNsdWRlIGNvbW1vbiB0YXJnZXQKKyAgICAgc3BlY2lmaWMgcHJvZmlsZSBpbmZvcm1hdGlvbiAqLworICBQUk9GSUxFX0lORk9fQ0FMTEJBQ0tfRk4gKmluZm9fY2FsbGJhY2s7CisjZGVmaW5lIFNUQVRFX1BST0ZJTEVfSU5GT19DQUxMQkFDSyhzZCkgXAorKENQVV9QUk9GSUxFX0RBVEEgKFNUQVRFX0NQVSAoc2QsIDApKS0+aW5mb19jYWxsYmFjaykKKworICAvKiBQcm9maWxlIHJhbmdlLgorICAgICA/Pz8gTm90IGFsbCBjcHUncyBzdXBwb3J0IHRoaXMuICAqLworICBBRERSX1JBTkdFIHJhbmdlOworI2RlZmluZSBQUk9GSUxFX1JBTkdFKHApICgmIChwKS0+cmFuZ2UpCit9IFBST0ZJTEVfREFUQTsKKwwKKy8qIFByZWRpY2F0ZXMuICAqLworCisjZGVmaW5lIENQVV9QUk9GSUxFX0ZMQUdTKGNwdSkgUFJPRklMRV9GTEFHUyAoQ1BVX1BST0ZJTEVfREFUQSAoY3B1KSkKKworLyogUmV0dXJuIG5vbi16ZXJvIGlmIHRyYWNpbmcgb2YgSURYIGlzIGVuYWJsZWQgZm9yIENQVS4gICovCisjZGVmaW5lIFBST0ZJTEVfUChjcHUsaWR4KSBcCisoKFdJVEhfUFJPRklMRSAmICgxIDw8IChpZHgpKSkgIT0gMCBcCisgJiYgQ1BVX1BST0ZJTEVfRkxBR1MgKGNwdSlbaWR4XSAhPSAwKQorCisvKiBOb24temVybyBpZiAtLXByb2ZpbGUtPHh4eHg+IHdhcyBzcGVjaWZpZWQgZm9yIENQVS4gICovCisjZGVmaW5lIFBST0ZJTEVfQU5ZX1AoY3B1KQkoKFdJVEhfUFJPRklMRSkgJiYgKENQVV9QUk9GSUxFX0RBVEEgKGNwdSktPnByb2ZpbGVfYW55X3ApKQorI2RlZmluZSBQUk9GSUxFX0lOU05fUChjcHUpCVBST0ZJTEVfUCAoY3B1LCBQUk9GSUxFX0lOU05fSURYKQorI2RlZmluZSBQUk9GSUxFX01FTU9SWV9QKGNwdSkJUFJPRklMRV9QIChjcHUsIFBST0ZJTEVfTUVNT1JZX0lEWCkKKyNkZWZpbmUgUFJPRklMRV9NT0RFTF9QKGNwdSkJUFJPRklMRV9QIChjcHUsIFBST0ZJTEVfTU9ERUxfSURYKQorI2RlZmluZSBQUk9GSUxFX1NDQUNIRV9QKGNwdSkJUFJPRklMRV9QIChjcHUsIFBST0ZJTEVfU0NBQ0hFX0lEWCkKKyNkZWZpbmUgUFJPRklMRV9QQ19QKGNwdSkJUFJPRklMRV9QIChjcHUsIFBST0ZJTEVfUENfSURYKQorI2RlZmluZSBQUk9GSUxFX0NPUkVfUChjcHUpCVBST0ZJTEVfUCAoY3B1LCBQUk9GSUxFX0NPUkVfSURYKQorDAorLyogVXNhZ2UgbWFjcm9zLiAgKi8KKworI2lmIFdJVEhfUFJPRklMRV9JTlNOX1AKKyNkZWZpbmUgUFJPRklMRV9DT1VOVF9JTlNOKGNwdSwgcGMsIGluc25fbnVtKSBcCitkbyB7IFwKKyAgaWYgKFBST0ZJTEVfSU5TTl9QIChjcHUpKSBcCisgICAgKysgUFJPRklMRV9JTlNOX0NPVU5UIChDUFVfUFJPRklMRV9EQVRBIChjcHUpKSBbaW5zbl9udW1dOyBcCit9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgUFJPRklMRV9DT1VOVF9JTlNOKGNwdSwgcGMsIGluc25fbnVtKQorI2VuZGlmIC8qICEgaW5zbiAqLworCisjaWYgV0lUSF9QUk9GSUxFX01FTU9SWV9QCisjZGVmaW5lIFBST0ZJTEVfQ09VTlRfUkVBRChjcHUsIGFkZHIsIG1vZGVfbnVtKSBcCitkbyB7IFwKKyAgaWYgKFBST0ZJTEVfTUVNT1JZX1AgKGNwdSkpIFwKKyAgICArKyBQUk9GSUxFX1JFQURfQ09VTlQgKENQVV9QUk9GSUxFX0RBVEEgKGNwdSkpIFttb2RlX251bV07IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFBST0ZJTEVfQ09VTlRfV1JJVEUoY3B1LCBhZGRyLCBtb2RlX251bSkgXAorZG8geyBcCisgIGlmIChQUk9GSUxFX01FTU9SWV9QIChjcHUpKSBcCisgICAgKysgUFJPRklMRV9XUklURV9DT1VOVCAoQ1BVX1BST0ZJTEVfREFUQSAoY3B1KSkgW21vZGVfbnVtXTsgXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIFBST0ZJTEVfQ09VTlRfUkVBRChjcHUsIGFkZHIsIG1vZGVfbnVtKQorI2RlZmluZSBQUk9GSUxFX0NPVU5UX1dSSVRFKGNwdSwgYWRkciwgbW9kZV9udW0pCisjZW5kaWYgLyogISBtZW1vcnkgKi8KKworI2lmIFdJVEhfUFJPRklMRV9DT1JFX1AKKyNkZWZpbmUgUFJPRklMRV9DT1VOVF9DT1JFKGNwdSwgYWRkciwgc2l6ZSwgbWFwKSBcCitkbyB7IFwKKyAgaWYgKFBST0ZJTEVfQ09SRV9QIChjcHUpKSBcCisgICAgUFJPRklMRV9DT1JFX0NPVU5UIChDUFVfUFJPRklMRV9EQVRBIChjcHUpKSBbbWFwXSArPSAxOyBcCit9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgUFJPRklMRV9DT1VOVF9DT1JFKGNwdSwgYWRkciwgc2l6ZSwgbWFwKQorI2VuZGlmIC8qICEgY29yZSAqLworCisvKiBNaXNjLiB1dGlsaXRpZXMuICAqLworCitleHRlcm4gdm9pZCBzaW1fcHJvZmlsZV9wcmludF9iYXIgKFNJTV9ERVNDLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKKworI2VuZGlmIC8qIFNJTV9QUk9GSUxFX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLXJlYXNvbi5jIGIvc2ltL2NvbW1vbi9zaW0tcmVhc29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU0MGRmMwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vc2ltLXJlYXNvbi5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qIEdlbmVyaWMgc2ltdWxhdG9yIHN0b3BfcmVhc29uLgorICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAic2ltLWFzc2VydC5oIgorCisvKiBHZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIHNpbV9zdG9wX3JlYXNvbiAqLworCit2b2lkCitzaW1fc3RvcF9yZWFzb24gKFNJTV9ERVNDIHNkLCBlbnVtIHNpbV9zdG9wICpyZWFzb24sIGludCAqc2lncmMpCit7CisgIHNpbV9lbmdpbmUgKmVuZ2luZSA9IE5VTEw7CisgIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7CisgIGVuZ2luZSA9IFNUQVRFX0VOR0lORSAoc2QpOworICAqcmVhc29uID0gZW5naW5lLT5yZWFzb247CisgIHN3aXRjaCAoKnJlYXNvbikKKyAgICB7CisgICAgY2FzZSBzaW1fZXhpdGVkIDoKKyAgICAgICpzaWdyYyA9IGVuZ2luZS0+c2lncmM7CisgICAgICBicmVhazsKKyAgICBjYXNlIHNpbV9zaWduYWxsZWQgOgorICAgICAgLyogPz8/IFNlZSB0aGUgY29tbWVudCBiZWxvdyBjYXNlIGBzaW1fc2lnbmFsbGVkJyBpbgorCSBnZGIvcmVtb3RlLXNpbS5jOmdkYnNpbV93YWl0LgorCSA/Pz8gQ29uc2lkZXIgdGhlIGNhc2Ugb2YgdGhlIHRhcmdldCByZXF1ZXN0aW5nIHRoYXQgaXQKKwkga2lsbCgyKSBpdHNlbGYgd2l0aCBTSUdOQUwuICBUaGF0IFNJR05BTCwgYmVpbmcgdGFyZ2V0CisJIHNwZWNpZmljLCB3aWxsIG5vdCBjb3JyZXNwb25kIHRvIGVpdGhlciBvZiB0aGUgU0lNX1NJR05BTAorCSBlbnVtIG5vciB0aGUgSE9TVF9TSUdOQUwuICBBIG1hcHBpbmcgZnJvbSBUQVJHRVRfU0lHTkFMIHRvCisJIEhPU1RfU0lHTkFMIGlzIG5lZWRlZC4gICovCisgICAgICAqc2lncmMgPSBzaW1fc2lnbmFsX3RvX2hvc3QgKHNkLCBlbmdpbmUtPnNpZ3JjKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugc2ltX3N0b3BwZWQgOgorICAgICAgLyogVGhlIGdkYi9zaW11bGF0b3IgaW50ZXJmYWNlIGNhbGxzIGZvciB1cyB0byByZXR1cm4gdGhlIGhvc3QKKwkgdmVyc2lvbiBvZiB0aGUgc2lnbmFsIHdoaWNoIGdkYiB0aGVuIGNvbnZlcnRzIGludG8gdGhlCisJIHRhcmdldCdzIHZlcnNpb24uICBUaGlzIGlzIG9idmlvdXNseSBhIGJpdCBjbHVtc3kuICAqLworICAgICAgKnNpZ3JjID0gc2ltX3NpZ25hbF90b19ob3N0IChzZCwgZW5naW5lLT5zaWdyYyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLXJlZy5jIGIvc2ltL2NvbW1vbi9zaW0tcmVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YzZGM0MQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vc2ltLXJlZy5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qIEdlbmVyaWMgcmVnaXN0ZXIgcmVhZC93cml0ZS4KKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAic2ltLWFzc2VydC5oIgorCisvKiBHZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIHNpbV9mZXRjaF9yZWdpc3RlciBmb3Igc2ltdWxhdG9ycyB1c2luZworICAgQ1BVX1JFR19GRVRDSC4KKyAgIFRoZSBjb250ZW50cyBvZiBCVUYgYXJlIGluIHRhcmdldCBieXRlIG9yZGVyLiAgKi8KKy8qID8/PyBPYnZpb3VzbHkgdGhlIGludGVyZmFjZSBuZWVkcyB0byBiZSBleHRlbmRlZCB0byBoYW5kbGUgbXVsdGlwbGUKKyAgIGNwdXMuICAqLworCitpbnQKK3NpbV9mZXRjaF9yZWdpc3RlciAoU0lNX0RFU0Mgc2QsIGludCBybiwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKQoreworICBTSU1fQ1BVICpjcHUgPSBTVEFURV9DUFUgKHNkLCAwKTsKKworICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworICByZXR1cm4gKCogQ1BVX1JFR19GRVRDSCAoY3B1KSkgKGNwdSwgcm4sIGJ1ZiwgbGVuZ3RoKTsKK30KKworLyogR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiBzaW1fZmV0Y2hfcmVnaXN0ZXIgZm9yIHNpbXVsYXRvcnMgdXNpbmcKKyAgIENQVV9SRUdfRkVUQ0guCisgICBUaGUgY29udGVudHMgb2YgQlVGIGFyZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gICovCisvKiA/Pz8gT2J2aW91c2x5IHRoZSBpbnRlcmZhY2UgbmVlZHMgdG8gYmUgZXh0ZW5kZWQgdG8gaGFuZGxlIG11bHRpcGxlCisgICBjcHVzLiAgKi8KKworaW50CitzaW1fc3RvcmVfcmVnaXN0ZXIgKFNJTV9ERVNDIHNkLCBpbnQgcm4sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkKK3sKKyAgU0lNX0NQVSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgMCk7CisKKyAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKKyAgcmV0dXJuICgqIENQVV9SRUdfU1RPUkUgKGNwdSkpIChjcHUsIHJuLCBidWYsIGxlbmd0aCk7Cit9CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1yZXN1bWUuYyBiL3NpbS9jb21tb24vc2ltLXJlc3VtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YjQ3NWUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS1yZXN1bWUuYwpAQCAtMCwwICsxLDg1IEBACisvKiBHZW5lcmljIHNpbXVsYXRvciByZXN1bWUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisKKy8qIEhhbHQgdGhlIHNpbXVsYXRvciBhZnRlciBqdXN0IG9uZSBpbnN0cnVjdGlvbiAqLworCitzdGF0aWMgdm9pZAoraGFzX3N0ZXBwZWQgKFNJTV9ERVNDIHNkLAorCSAgICAgdm9pZCAqZGF0YSkKK3sKKyAgQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworICBzaW1fZW5naW5lX2hhbHQgKHNkLCBOVUxMLCBOVUxMLCBOVUxMX0NJQSwgc2ltX3N0b3BwZWQsIFNJTV9TSUdUUkFQKTsKK30KKworCisvKiBHZW5lcmljIHJlc3VtZSAtIGFzc3VtZXMgdGhlIGV4aXN0YW5jZSBvZiBzaW1fZW5naW5lX3J1biAqLworCit2b2lkCitzaW1fcmVzdW1lIChTSU1fREVTQyBzZCwKKwkgICAgaW50IHN0ZXAsCisJICAgIGludCBzaWdnbmFsKQoreworICBzaW1fZW5naW5lICplbmdpbmUgPSBTVEFURV9FTkdJTkUgKHNkKTsKKyAgam1wX2J1ZiBidWY7CisgIGludCBqbXB2YWw7CisKKyAgQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworCisgIC8qIHdlIG9ubHkgd2FudCB0byBiZSBzaW5nbGUgc3RlcHBpbmcgdGhlIHNpbXVsYXRvciBvbmNlICovCisgIGlmIChlbmdpbmUtPnN0ZXBwZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICBzaW1fZXZlbnRzX2Rlc2NoZWR1bGUgKHNkLCBlbmdpbmUtPnN0ZXBwZXIpOworICAgICAgZW5naW5lLT5zdGVwcGVyID0gTlVMTDsKKyAgICB9CisgIGlmIChzdGVwKQorICAgIGVuZ2luZS0+c3RlcHBlciA9IHNpbV9ldmVudHNfc2NoZWR1bGUgKHNkLCAxLCBoYXNfc3RlcHBlZCwgc2QpOworCisgIHNpbV9tb2R1bGVfcmVzdW1lIChzZCk7CisKKyAgLyogcnVuL3Jlc3VtZSB0aGUgc2ltdWxhdG9yICovCisgIGVuZ2luZS0+am1wYnVmID0gJmJ1ZjsKKyAgam1wdmFsID0gc2V0am1wIChidWYpOworICBpZiAoam1wdmFsID09IHNpbV9lbmdpbmVfc3RhcnRfam1wdmFsCisgICAgICB8fCBqbXB2YWwgPT0gc2ltX2VuZ2luZV9yZXN0YXJ0X2ptcHZhbCkKKyAgICB7CisgICAgICBpbnQgbGFzdF9jcHVfbnIgPSBzaW1fZW5naW5lX2xhc3RfY3B1X25yIChzZCk7CisgICAgICBpbnQgbmV4dF9jcHVfbnIgPSBzaW1fZW5naW5lX25leHRfY3B1X25yIChzZCk7CisgICAgICBpbnQgbnJfY3B1cyA9IHNpbV9lbmdpbmVfbnJfY3B1cyAoc2QpOworCisgICAgICBzaW1fZXZlbnRzX3ByZXByb2Nlc3MgKHNkLCBsYXN0X2NwdV9uciA+PSBucl9jcHVzLCBuZXh0X2NwdV9uciA+PSBucl9jcHVzKTsKKyAgICAgIGlmIChuZXh0X2NwdV9uciA+PSBucl9jcHVzKQorCW5leHRfY3B1X25yID0gMDsKKworI2lmZGVmIFNJTV9DUFVfRVhDRVBUSU9OX1JFU1VNRQorICAgICAgeworCXNpbV9jcHUqIGNwdSA9IFNUQVRFX0NQVSAoc2QsIG5leHRfY3B1X25yKTsKKwlTSU1fQ1BVX0VYQ0VQVElPTl9SRVNVTUUoc2QsIGNwdSwgc2lnZ25hbCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgc2ltX2VuZ2luZV9ydW4gKHNkLCBuZXh0X2NwdV9uciwgbnJfY3B1cywgc2lnZ25hbCk7CisgICAgfQorICBlbmdpbmUtPmptcGJ1ZiA9IE5VTEw7CisKKyAgc2ltX21vZHVsZV9zdXNwZW5kIChzZCk7Cit9CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS1ydW4uYyBiL3NpbS9jb21tb24vc2ltLXJ1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZjcyOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS1ydW4uYwpAQCAtMCwwICsxLDUxIEBACisvKiBHZW5lcmljIHNpbXVsYXRvciBydW4uCisgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisKKy8qIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2Ygc2ltX2VuZ2luZV9ydW4gdGhhdCB3b3JrcyB3aXRoaW4gdGhlCisgICBzaW1fZW5naW5lIHNldGptcC9sb25nam1wIGZyYW1ld29yay4gKi8KKworI2RlZmluZSBJTUVNIFhDT05DQVQKKwordm9pZAorc2ltX2VuZ2luZV9ydW4gKFNJTV9ERVNDIHNkLAorCQlpbnQgbmV4dF9jcHVfbnIsIC8qIGlnbm9yZSAqLworCQlpbnQgbnJfY3B1cywgLyogaWdub3JlICovCisJCWludCBzaWdnbmFsKSAvKiBpZ25vcmUgKi8KK3sKKyAgc2ltX2NpYSBjaWE7CisgIHNpbV9jcHUgKmNwdTsKKyAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKKyAgY3B1ID0gU1RBVEVfQ1BVIChzZCwgMCk7CisgIGNpYSA9IENJQV9HRVQgKGNwdSk7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGluc3RydWN0aW9uX3dvcmQgaW5zbiA9IElNRU0zMiAoY2lhKTsKKyAgICAgIGNpYSA9IGlkZWNvZGVfaXNzdWUgKHNkLCBpbnNuLCBjaWEpOworICAgICAgLyogcHJvY2VzcyBhbnkgZXZlbnRzICovCisgICAgICBpZiAoc2ltX2V2ZW50c190aWNrIChzZCkpCisJeworCSAgQ0lBX1NFVCAoY3B1LCBjaWEpOworCSAgc2ltX2V2ZW50c19wcm9jZXNzIChzZCk7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLXNpZ25hbC5jIGIvc2ltL2NvbW1vbi9zaW0tc2lnbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3MDliMQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vc2ltLXNpZ25hbC5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qIFNpbXVsYXRvciBzaWduYWwgc3VwcG9ydAorICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAic2ltLW1haW4uaCIKKworLyogQ29udmVydCBTSU1fU0lHRk9PIHRvIFNJR0ZPTy4KKyAgIFdoYXQgdG8gZG8gd2hlbiB0aGUgaG9zdCBkb2Vzbid0IGhhdmUgU0lHRk9PIGlzIGhhbmRsZWQgb24gYSBjYXNlIGJ5IGNhc2UKKyAgIGJhc2lzLiAgR2VuZXJhbGx5LCBpbiB0aGUgY2FzZSBvZiBwYXNzaW5nIGEgdmFsdWUgYmFjayB0byBnZGIsIHdlIHdhbnQgZ2RiCisgICB0byBub3QgdGhpbmsgdGhlIHByb2Nlc3MgaGFzIGRpZWQgKHNvIGl0IGNhbiBiZSBkZWJ1Z2dlZCBhdCB0aGUgcG9pbnQgb2YKKyAgIGZhaWx1cmUpLiAgKi8KKworI2lmZGVmIF9NU0NfVkVSCisjaWZuZGVmIFNJR1RSQVAKKyNkZWZpbmUgU0lHVFJBUCA1CisjZW5kaWYKKyNpZm5kZWYgU0lHQlVTCisjZGVmaW5lIFNJR0JVUyAxMAorI2VuZGlmCisjaWZuZGVmIFNJR1FVSVQKKyNkZWZpbmUgU0lHUVVJVCAzCisjZW5kaWYKKyNlbmRpZgorCitpbnQKK3NpbV9zaWduYWxfdG9faG9zdCAoU0lNX0RFU0Mgc2QsIFNJTV9TSUdOQUwgc2lnKQoreworICBzd2l0Y2ggKHNpZykKKyAgICB7CisgICAgY2FzZSBTSU1fU0lHSU5UIDoKKyAgICAgIHJldHVybiBTSUdJTlQ7CisKKyAgICBjYXNlIFNJTV9TSUdBQlJUIDoKKyAgICAgIHJldHVybiBTSUdBQlJUOworCisgICAgY2FzZSBTSU1fU0lHSUxMIDoKKyNpZmRlZiBTSUdJTEwKKyAgICAgIHJldHVybiBTSUdJTEw7CisjZWxzZQorICAgICAgcmV0dXJuIFNJR1NFR1Y7CisjZW5kaWYKKworICAgIGNhc2UgU0lNX1NJR1RSQVAgOgorICAgICAgcmV0dXJuIFNJR1RSQVA7CisKKyAgICBjYXNlIFNJTV9TSUdCVVMgOgorI2lmZGVmIFNJR0JVUworICAgICAgcmV0dXJuIFNJR0JVUzsKKyNlbHNlCisgICAgICByZXR1cm4gU0lHU0VHVjsKKyNlbmRpZgorCisgICAgY2FzZSBTSU1fU0lHU0VHViA6CisgICAgICByZXR1cm4gU0lHU0VHVjsKKworICAgIGNhc2UgU0lNX1NJR1hDUFUgOgorI2lmZGVmIFNJR1hDUFUKKyAgICAgIHJldHVybiBTSUdYQ1BVOworI2VuZGlmCisgICAgICBicmVhazsKKworICAgIGNhc2UgU0lNX1NJR0ZQRToKKyNpZmRlZiBTSUdYQ1BVCisgICAgICByZXR1cm4gU0lHRlBFOworI2VuZGlmCisgICAgICBicmVhazsKKworICAgIGNhc2UgU0lNX1NJR05PTkU6CisgICAgICByZXR1cm4gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBzaW1faW9fZXByaW50ZiAoc2QsICJzaW1fc2lnbmFsX3RvX2hvc3Q6IHVua25vd24gc2lnbmFsOiAlZFxuIiwgc2lnKTsKKyNpZmRlZiBTSUdIVVAKKyAgcmV0dXJuIFNJR0hVUDsgIC8qIEZJWE1FOiBTdWdnZXN0aW9ucz8gICovCisjZWxzZQorICByZXR1cm4gMTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tc2lnbmFsLmggYi9zaW0vY29tbW9uL3NpbS1zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzJlMTdkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tc2lnbmFsLmgKQEAgLTAsMCArMSw0OSBAQAorLyogU2ltdWxhdG9yIHNpZ25hbCBzdXBwb3J0CisgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydAorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgU0lNX1NJR05BTF9ICisjZGVmaW5lIFNJTV9TSUdOQUxfSAorCisvKiBTaWduYWxzIHdlIHVzZS4KKyAgIFRoaXMgcHJvdmlkZXMgYSBsYXllciBiZXR3ZWVuIG91ciB2YWx1ZXMgYW5kIGhvc3QvdGFyZ2V0IHZhbHVlcy4gICovCisKK3R5cGVkZWYgZW51bSB7CisgIFNJTV9TSUdOT05FID0gNjQsCisgIC8qIGlsbGVnYWwgaW5zbiAqLworICBTSU1fU0lHSUxMLAorICAvKiBicmVha3BvaW50ICovCisgIFNJTV9TSUdUUkFQLAorICAvKiBtaXNhbGlnbmVkIG1lbW9yeSBhY2Nlc3MgKi8KKyAgU0lNX1NJR0JVUywKKyAgLyogdHJpZWQgdG8gcmVhZC93cml0ZSBtZW1vcnkgdGhhdCdzIG5vdCByZWFkYWJsZS93cml0YWJsZSAqLworICBTSU1fU0lHU0VHViwKKyAgLyogY3B1IGxpbWl0IGV4Y2VlZGVkICovCisgIFNJTV9TSUdYQ1BVLAorICAvKiBzaW11bGF0aW9uIGludGVycnVwdGVkIChzaW1fc3RvcCBjYWxsZWQpICovCisgIFNJTV9TSUdJTlQsCisgIC8qIEZsb2F0aW5nIHBvaW50IG9yIGludGVnZXIgZGl2aWRlICovCisgIFNJTV9TSUdGUEUsCisgIC8qIHNpbXVsYXRpb24gYWJvcnRlZCAqLworICBTSU1fU0lHQUJSVAorfSBTSU1fU0lHTkFMOworCitpbnQgc2ltX3NpZ25hbF90b19ob3N0IChTSU1fREVTQyBzZCwgU0lNX1NJR05BTCk7CisKKyNlbmRpZiAvKiBTSU1fU0lHTkFMX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLXN0b3AuYyBiL3NpbS9jb21tb24vc2ltLXN0b3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGU5MzE1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tc3RvcC5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qIEdlbmVyaWMgc2ltdWxhdG9yIHN0b3AuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisKKy8qIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2Ygc2ltX3N0b3AuICAqLworCitzdGF0aWMgdm9pZAorY29udHJvbF9jX3NpbXVsYXRpb24gKFNJTV9ERVNDIHNkLAorCQkgICAgICB2b2lkICpkYXRhKQoreworICBBU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7CisgIHNpbV9lbmdpbmVfaGFsdCAoc2QsIE5VTEwsIE5VTEwsIE5VTExfQ0lBLCBzaW1fc3RvcHBlZCwgU0lNX1NJR0lOVCk7Cit9CisKK2ludAorc2ltX3N0b3AgKFNJTV9ERVNDIHNkKQoreworICBBU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7CisgIHNpbV9ldmVudHNfc2NoZWR1bGVfYWZ0ZXJfc2lnbmFsKHNkLAorCQkJCSAgIDAgLypOT1cqLywKKwkJCQkgICBjb250cm9sX2Nfc2ltdWxhdGlvbiwKKwkJCQkgICBzZCAvKmRhdGEqLyk7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zaW0tdHJhY2UuYyBiL3NpbS9jb21tb24vc2ltLXRyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZhMjMxMwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vc2ltLXRyYWNlLmMKQEAgLTAsMCArMSwxMzQxIEBACisvKiBTaW11bGF0b3IgdHJhY2luZy9kZWJ1Z2dpbmcgc3VwcG9ydC4KKyAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2luY2x1ZGUgInNpbS1pby5oIgorI2luY2x1ZGUgInNpbS1vcHRpb25zLmgiCisjaW5jbHVkZSAic2ltLWZwdS5oIgorCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmbmRlZiBTSVpFX1BIQVNFCisjZGVmaW5lIFNJWkVfUEhBU0UgOAorI2VuZGlmCisKKyNpZm5kZWYgU0laRV9MT0NBVElPTgorI2RlZmluZSBTSVpFX0xPQ0FUSU9OIDIwCisjZW5kaWYKKworI2lmbmRlZiBTSVpFX1BDCisjZGVmaW5lIFNJWkVfUEMgNgorI2VuZGlmCisKKyNpZm5kZWYgU0laRV9MSU5FX05VTUJFUgorI2RlZmluZSBTSVpFX0xJTkVfTlVNQkVSIDQKKyNlbmRpZgorCitzdGF0aWMgTU9EVUxFX0lOSVRfRk4gdHJhY2VfaW5pdDsKK3N0YXRpYyBNT0RVTEVfVU5JTlNUQUxMX0ZOIHRyYWNlX3VuaW5zdGFsbDsKKworc3RhdGljIERFQ0xBUkVfT1BUSU9OX0hBTkRMRVIgKHRyYWNlX29wdGlvbl9oYW5kbGVyKTsKKworZW51bSB7CisgIE9QVElPTl9UUkFDRV9JTlNOCT0gT1BUSU9OX1NUQVJULAorICBPUFRJT05fVFJBQ0VfREVDT0RFLAorICBPUFRJT05fVFJBQ0VfRVhUUkFDVCwKKyAgT1BUSU9OX1RSQUNFX0xJTkVOVU0sCisgIE9QVElPTl9UUkFDRV9NRU1PUlksCisgIE9QVElPTl9UUkFDRV9NT0RFTCwKKyAgT1BUSU9OX1RSQUNFX0FMVSwKKyAgT1BUSU9OX1RSQUNFX0NPUkUsCisgIE9QVElPTl9UUkFDRV9FVkVOVFMsCisgIE9QVElPTl9UUkFDRV9GUFUsCisgIE9QVElPTl9UUkFDRV9CUkFOQ0gsCisgIE9QVElPTl9UUkFDRV9TRU1BTlRJQ1MsCisgIE9QVElPTl9UUkFDRV9SQU5HRSwKKyAgT1BUSU9OX1RSQUNFX0ZVTkNUSU9OLAorICBPUFRJT05fVFJBQ0VfREVCVUcsCisgIE9QVElPTl9UUkFDRV9GSUxFCit9OworCitzdGF0aWMgY29uc3QgT1BUSU9OIHRyYWNlX29wdGlvbnNbXSA9Cit7CisgIC8qIFRoaXMgdGFibGUgaXMgb3JnYW5pemVkIHRvIGdyb3VwIHJlbGF0ZWQgaW5zdHJ1Y3Rpb25zIHRvZ2V0aGVyLiAgKi8KKyAgeyB7InRyYWNlIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsICd0J30sCisgICAgICAndCcsICJvbnxvZmYiLCAiVHJhY2UgdXNlZnVsIHRoaW5ncyIsCisgICAgICB0cmFjZV9vcHRpb25faGFuZGxlciB9LAorICB7IHsidHJhY2UtaW5zbiIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBQ0VfSU5TTn0sCisgICAgICAnXDAnLCAib258b2ZmIiwgIlBlcmZvcm0gaW5zdHJ1Y3Rpb24gdHJhY2luZyIsCisgICAgICB0cmFjZV9vcHRpb25faGFuZGxlciB9LAorICB7IHsidHJhY2UtZGVjb2RlIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFDRV9ERUNPREV9LAorICAgICAgJ1wwJywgIm9ufG9mZiIsICJUcmFjZSBpbnN0cnVjdGlvbiBkZWNvZGluZyIsCisgICAgICB0cmFjZV9vcHRpb25faGFuZGxlciB9LAorICB7IHsidHJhY2UtZXh0cmFjdCIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBQ0VfRVhUUkFDVH0sCisgICAgICAnXDAnLCAib258b2ZmIiwgIlRyYWNlIGluc3RydWN0aW9uIGV4dHJhY3Rpb24iLAorICAgICAgdHJhY2Vfb3B0aW9uX2hhbmRsZXIgfSwKKyAgeyB7InRyYWNlLWxpbmVudW0iLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RSQUNFX0xJTkVOVU19LAorICAgICAgJ1wwJywgIm9ufG9mZiIsICJQZXJmb3JtIGxpbmUgbnVtYmVyIHRyYWNpbmcgKGltcGxpZXMgLS10cmFjZS1pbnNuKSIsCisgICAgICB0cmFjZV9vcHRpb25faGFuZGxlciB9LAorICB7IHsidHJhY2UtbWVtb3J5Iiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFDRV9NRU1PUll9LAorICAgICAgJ1wwJywgIm9ufG9mZiIsICJUcmFjZSBtZW1vcnkgb3BlcmF0aW9ucyIsCisgICAgICB0cmFjZV9vcHRpb25faGFuZGxlciB9LAorICB7IHsidHJhY2UtYWx1Iiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFDRV9BTFV9LAorICAgICAgJ1wwJywgIm9ufG9mZiIsICJUcmFjZSBBTFUgb3BlcmF0aW9ucyIsCisgICAgICB0cmFjZV9vcHRpb25faGFuZGxlciB9LAorICB7IHsidHJhY2UtZnB1Iiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFDRV9GUFV9LAorICAgICAgJ1wwJywgIm9ufG9mZiIsICJUcmFjZSBGUFUgb3BlcmF0aW9ucyIsCisgICAgICB0cmFjZV9vcHRpb25faGFuZGxlciB9LAorICB7IHsidHJhY2UtYnJhbmNoIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFDRV9CUkFOQ0h9LAorICAgICAgJ1wwJywgIm9ufG9mZiIsICJUcmFjZSBicmFuY2hpbmciLAorICAgICAgdHJhY2Vfb3B0aW9uX2hhbmRsZXIgfSwKKyAgeyB7InRyYWNlLXNlbWFudGljcyIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBQ0VfU0VNQU5USUNTfSwKKyAgICAgICdcMCcsICJvbnxvZmYiLCAiUGVyZm9ybSBBTFUsIEZQVSwgTUVNT1JZLCBhbmQgQlJBTkNIIHRyYWNpbmciLAorICAgICAgdHJhY2Vfb3B0aW9uX2hhbmRsZXIgfSwKKyAgeyB7InRyYWNlLW1vZGVsIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFDRV9NT0RFTH0sCisgICAgICAnXDAnLCAib258b2ZmIiwgIkluY2x1ZGUgbW9kZWwgcGVyZm9ybWFuY2UgZGF0YSIsCisgICAgICB0cmFjZV9vcHRpb25faGFuZGxlciB9LAorICB7IHsidHJhY2UtY29yZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBQ0VfQ09SRX0sCisgICAgICAnXDAnLCAib258b2ZmIiwgIlRyYWNlIGNvcmUgb3BlcmF0aW9ucyIsCisgICAgICB0cmFjZV9vcHRpb25faGFuZGxlciB9LAorICB7IHsidHJhY2UtZXZlbnRzIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFDRV9FVkVOVFN9LAorICAgICAgJ1wwJywgIm9ufG9mZiIsICJUcmFjZSBldmVudHMiLAorICAgICAgdHJhY2Vfb3B0aW9uX2hhbmRsZXIgfSwKKyNpZmRlZiBTSU1fSEFWRV9BRERSX1JBTkdFCisgIHsgeyJ0cmFjZS1yYW5nZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBQ0VfUkFOR0V9LAorICAgICAgJ1wwJywgIlNUQVJULEVORCIsICJTcGVjaWZ5IHJhbmdlIG9mIGFkZHJlc3NlcyBmb3IgaW5zdHJ1Y3Rpb24gdHJhY2luZyIsCisgICAgICB0cmFjZV9vcHRpb25faGFuZGxlciB9LAorI2lmIDAgLyp3aXAqLworICB7IHsidHJhY2UtZnVuY3Rpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RSQUNFX0ZVTkNUSU9OfSwKKyAgICAgICdcMCcsICJGVU5DVElPTiIsICJTcGVjaWZ5IGZ1bmN0aW9uIHRvIHRyYWNlIiwKKyAgICAgIHRyYWNlX29wdGlvbl9oYW5kbGVyIH0sCisjZW5kaWYKKyNlbmRpZgorICB7IHsidHJhY2UtZGVidWciLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RSQUNFX0RFQlVHfSwKKyAgICAgICdcMCcsICJvbnxvZmYiLCAiQWRkIGluZm9ybWF0aW9uIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHRoZSBzaW11bGF0b3IgdG8gdGhlIHRyYWNpbmcgb3V0cHV0IiwKKyAgICAgIHRyYWNlX29wdGlvbl9oYW5kbGVyIH0sCisgIHsgeyJ0cmFjZS1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFDRV9GSUxFfSwKKyAgICAgICdcMCcsICJGSUxFIE5BTUUiLCAiU3BlY2lmeSB0cmFjaW5nIG91dHB1dCBmaWxlIiwKKyAgICAgIHRyYWNlX29wdGlvbl9oYW5kbGVyIH0sCisgIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfSwgJ1wwJywgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCisvKiBTZXQvcmVzZXQgdGhlIHRyYWNlIG9wdGlvbnMgaW5kaWNhdGVkIGluIE1BU0suICAqLworCitzdGF0aWMgU0lNX1JDCitzZXRfdHJhY2Vfb3B0aW9uX21hc2sgKHNkLCBuYW1lLCBtYXNrLCBhcmcpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICBpbnQgbWFzazsKKyAgICAgY29uc3QgY2hhciAqYXJnOworeworICBpbnQgdHJhY2VfbnI7CisgIGludCBjcHVfbnI7CisgIGludCB0cmFjZV92YWwgPSAxOworCisgIGlmIChhcmcgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChhcmcsICJ5ZXMiKSA9PSAwCisJICB8fCBzdHJjbXAgKGFyZywgIm9uIikgPT0gMAorCSAgfHwgc3RyY21wIChhcmcsICIxIikgPT0gMCkKKwl0cmFjZV92YWwgPSAxOworICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJubyIpID09IDAKKwkgICAgICAgfHwgc3RyY21wIChhcmcsICJvZmYiKSA9PSAwCisJICAgICAgIHx8IHN0cmNtcCAoYXJnLCAiMCIpID09IDApCisJdHJhY2VfdmFsID0gMDsKKyAgICAgIGVsc2UKKwl7CisJICBzaW1faW9fZXByaW50ZiAoc2QsICJBcmd1bWVudCBgJXMnIGZvciBgLS10cmFjZSVzJyBpbnZhbGlkLCBvbmUgb2YgYG9uJywgYG9mZicsIGB5ZXMnLCBgbm8nIGV4cGVjdGVkXG4iLCBhcmcsIG5hbWUpOworCSAgcmV0dXJuIFNJTV9SQ19GQUlMOworCX0KKyAgICB9CisKKyAgLyogdXBkYXRlIGFwcGxpY2FibGUgdHJhY2UgYml0cyAqLworICBmb3IgKHRyYWNlX25yID0gMDsgdHJhY2VfbnIgPCBNQVhfVFJBQ0VfVkFMVUVTOyArK3RyYWNlX25yKQorICAgIHsKKyAgICAgIGlmICgobWFzayAmICgxIDw8IHRyYWNlX25yKSkgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgLyogU2V0IG5vbi1jcHUgc3BlY2lmaWMgdmFsdWVzLiAgKi8KKyAgICAgIHN3aXRjaCAodHJhY2VfbnIpCisJeworCWNhc2UgVFJBQ0VfRVZFTlRTX0lEWDoKKwkgIFNUQVRFX0VWRU5UUyAoc2QpLT50cmFjZSA9IHRyYWNlX3ZhbDsKKwkgIGJyZWFrOworCWNhc2UgVFJBQ0VfREVCVUdfSURYOgorCSAgU1RBVEVfVFJBQ0VfRkxBR1MgKHNkKVt0cmFjZV9ucl0gPSB0cmFjZV92YWw7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIFNldCBjcHUgdmFsdWVzLiAgKi8KKyAgICAgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7IGNwdV9ucisrKQorCXsKKwkgIENQVV9UUkFDRV9GTEFHUyAoU1RBVEVfQ1BVIChzZCwgY3B1X25yKSlbdHJhY2VfbnJdID0gdHJhY2VfdmFsOworCX0KKyAgICB9CisKKyAgLyogUmUtY29tcHV0ZSB0aGUgY3B1IHRyYWNlIHN1bW1hcnkuICAqLworICBpZiAodHJhY2VfdmFsKQorICAgIHsKKyAgICAgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7IGNwdV9ucisrKQorCUNQVV9UUkFDRV9EQVRBIChTVEFURV9DUFUgKHNkLCBjcHVfbnIpKS0+dHJhY2VfYW55X3AgPSAxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7IGNwdV9ucisrKQorCXsKKwkgIENQVV9UUkFDRV9EQVRBIChTVEFURV9DUFUgKHNkLCBjcHVfbnIpKS0+dHJhY2VfYW55X3AgPSAwOworCSAgZm9yICh0cmFjZV9uciA9IDA7IHRyYWNlX25yIDwgTUFYX1RSQUNFX1ZBTFVFUzsgKyt0cmFjZV9ucikKKwkgICAgeworCSAgICAgIGlmIChDUFVfVFJBQ0VfRkxBR1MgKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpW3RyYWNlX25yXSkKKwkJeworCQkgIENQVV9UUkFDRV9EQVRBIChTVEFURV9DUFUgKHNkLCBjcHVfbnIpKS0+dHJhY2VfYW55X3AgPSAxOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisgICAgfSAgCisKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworLyogU2V0IG9uZSB0cmFjZSBvcHRpb24gYmFzZWQgb24gaXRzIElEWCB2YWx1ZS4gICovCisKK3N0YXRpYyBTSU1fUkMKK3NldF90cmFjZV9vcHRpb24gKHNkLCBuYW1lLCBpZHgsIGFyZykKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgIGludCBpZHg7CisgICAgIGNvbnN0IGNoYXIgKmFyZzsKK3sKKyAgcmV0dXJuIHNldF90cmFjZV9vcHRpb25fbWFzayAoc2QsIG5hbWUsIDEgPDwgaWR4LCBhcmcpOworfQorCisKK3N0YXRpYyBTSU1fUkMKK3RyYWNlX29wdGlvbl9oYW5kbGVyIChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBpbnQgb3B0LAorCQkgICAgICBjaGFyICphcmcsIGludCBpc19jb21tYW5kKQoreworICBpbnQgbjsKKyAgaW50IGNwdV9ucjsKKworICBzd2l0Y2ggKG9wdCkKKyAgICB7CisgICAgY2FzZSAndCcgOgorICAgICAgaWYgKCEgV0lUSF9UUkFDRSkKKwlzaW1faW9fZXByaW50ZiAoc2QsICJUcmFjaW5nIG5vdCBjb21waWxlZCBpbiwgYC10JyBpZ25vcmVkXG4iKTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gc2V0X3RyYWNlX29wdGlvbl9tYXNrIChzZCwgInRyYWNlIiwgVFJBQ0VfVVNFRlVMX01BU0ssIGFyZyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX1RSQUNFX0lOU04gOgorICAgICAgaWYgKFdJVEhfVFJBQ0VfSU5TTl9QKQorCXJldHVybiBzZXRfdHJhY2Vfb3B0aW9uIChzZCwgIi1pbnNuIiwgVFJBQ0VfSU5TTl9JRFgsIGFyZyk7CisgICAgICBlbHNlCisJc2ltX2lvX2VwcmludGYgKHNkLCAiSW5zdHJ1Y3Rpb24gdHJhY2luZyBub3QgY29tcGlsZWQgaW4sIGAtLXRyYWNlLWluc24nIGlnbm9yZWRcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9UUkFDRV9ERUNPREUgOgorICAgICAgaWYgKFdJVEhfVFJBQ0VfREVDT0RFX1ApCisJcmV0dXJuIHNldF90cmFjZV9vcHRpb24gKHNkLCAiLWRlY29kZSIsIFRSQUNFX0RFQ09ERV9JRFgsIGFyZyk7CisgICAgICBlbHNlCisJc2ltX2lvX2VwcmludGYgKHNkLCAiRGVjb2RlIHRyYWNpbmcgbm90IGNvbXBpbGVkIGluLCBgLS10cmFjZS1kZWNvZGUnIGlnbm9yZWRcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9UUkFDRV9FWFRSQUNUIDoKKyAgICAgIGlmIChXSVRIX1RSQUNFX0VYVFJBQ1RfUCkKKwlyZXR1cm4gc2V0X3RyYWNlX29wdGlvbiAoc2QsICItZXh0cmFjdCIsIFRSQUNFX0VYVFJBQ1RfSURYLCBhcmcpOworICAgICAgZWxzZQorCXNpbV9pb19lcHJpbnRmIChzZCwgIkV4dHJhY3QgdHJhY2luZyBub3QgY29tcGlsZWQgaW4sIGAtLXRyYWNlLWV4dHJhY3QnIGlnbm9yZWRcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9UUkFDRV9MSU5FTlVNIDoKKyAgICAgIGlmIChXSVRIX1RSQUNFX0xJTkVOVU1fUCAmJiBXSVRIX1RSQUNFX0lOU05fUCkKKwl7CisJICBpZiAoc2V0X3RyYWNlX29wdGlvbiAoc2QsICItbGluZW51bSIsIFRSQUNFX0xJTkVOVU1fSURYLCBhcmcpICE9IFNJTV9SQ19PSworCSAgICAgIHx8IHNldF90cmFjZV9vcHRpb24gKHNkLCAiLWxpbmVudW0iLCBUUkFDRV9JTlNOX0lEWCwgYXJnKSAhPSBTSU1fUkNfT0spCisJICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKwl9CisgICAgICBlbHNlCisJc2ltX2lvX2VwcmludGYgKHNkLCAiTGluZSBudW1iZXIgb3IgaW5zdHJ1Y3Rpb24gdHJhY2luZyBub3QgY29tcGlsZWQgaW4sIGAtLXRyYWNlLWxpbmVudW0nIGlnbm9yZWRcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9UUkFDRV9NRU1PUlkgOgorICAgICAgaWYgKFdJVEhfVFJBQ0VfTUVNT1JZX1ApCisJcmV0dXJuIHNldF90cmFjZV9vcHRpb24gKHNkLCAiLW1lbW9yeSIsIFRSQUNFX01FTU9SWV9JRFgsIGFyZyk7CisgICAgICBlbHNlCisJc2ltX2lvX2VwcmludGYgKHNkLCAiTWVtb3J5IHRyYWNpbmcgbm90IGNvbXBpbGVkIGluLCBgLS10cmFjZS1tZW1vcnknIGlnbm9yZWRcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9UUkFDRV9NT0RFTCA6CisgICAgICBpZiAoV0lUSF9UUkFDRV9NT0RFTF9QKQorCXJldHVybiBzZXRfdHJhY2Vfb3B0aW9uIChzZCwgIi1tb2RlbCIsIFRSQUNFX01PREVMX0lEWCwgYXJnKTsKKyAgICAgIGVsc2UKKwlzaW1faW9fZXByaW50ZiAoc2QsICJNb2RlbCB0cmFjaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tdHJhY2UtbW9kZWwnIGlnbm9yZWRcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9UUkFDRV9BTFUgOgorICAgICAgaWYgKFdJVEhfVFJBQ0VfQUxVX1ApCisJcmV0dXJuIHNldF90cmFjZV9vcHRpb24gKHNkLCAiLWFsdSIsIFRSQUNFX0FMVV9JRFgsIGFyZyk7CisgICAgICBlbHNlCisJc2ltX2lvX2VwcmludGYgKHNkLCAiQUxVIHRyYWNpbmcgbm90IGNvbXBpbGVkIGluLCBgLS10cmFjZS1hbHUnIGlnbm9yZWRcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9UUkFDRV9DT1JFIDoKKyAgICAgIGlmIChXSVRIX1RSQUNFX0NPUkVfUCkKKwlyZXR1cm4gc2V0X3RyYWNlX29wdGlvbiAoc2QsICItY29yZSIsIFRSQUNFX0NPUkVfSURYLCBhcmcpOworICAgICAgZWxzZQorCXNpbV9pb19lcHJpbnRmIChzZCwgIkNPUkUgdHJhY2luZyBub3QgY29tcGlsZWQgaW4sIGAtLXRyYWNlLWNvcmUnIGlnbm9yZWRcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9UUkFDRV9FVkVOVFMgOgorICAgICAgaWYgKFdJVEhfVFJBQ0VfRVZFTlRTX1ApCisJcmV0dXJuIHNldF90cmFjZV9vcHRpb24gKHNkLCAiLWV2ZW50cyIsIFRSQUNFX0VWRU5UU19JRFgsIGFyZyk7CisgICAgICBlbHNlCisJc2ltX2lvX2VwcmludGYgKHNkLCAiRVZFTlRTIHRyYWNpbmcgbm90IGNvbXBpbGVkIGluLCBgLS10cmFjZS1ldmVudHMnIGlnbm9yZWRcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9UUkFDRV9GUFUgOgorICAgICAgaWYgKFdJVEhfVFJBQ0VfRlBVX1ApCisJcmV0dXJuIHNldF90cmFjZV9vcHRpb24gKHNkLCAiLWZwdSIsIFRSQUNFX0ZQVV9JRFgsIGFyZyk7CisgICAgICBlbHNlCisJc2ltX2lvX2VwcmludGYgKHNkLCAiRlBVIHRyYWNpbmcgbm90IGNvbXBpbGVkIGluLCBgLS10cmFjZS1mcHUnIGlnbm9yZWRcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9UUkFDRV9CUkFOQ0ggOgorICAgICAgaWYgKFdJVEhfVFJBQ0VfQlJBTkNIX1ApCisJcmV0dXJuIHNldF90cmFjZV9vcHRpb24gKHNkLCAiLWJyYW5jaCIsIFRSQUNFX0JSQU5DSF9JRFgsIGFyZyk7CisgICAgICBlbHNlCisJc2ltX2lvX2VwcmludGYgKHNkLCAiQnJhbmNoIHRyYWNpbmcgbm90IGNvbXBpbGVkIGluLCBgLS10cmFjZS1icmFuY2gnIGlnbm9yZWRcbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QVElPTl9UUkFDRV9TRU1BTlRJQ1MgOgorICAgICAgaWYgKFdJVEhfVFJBQ0VfQUxVX1AKKwkgICYmIFdJVEhfVFJBQ0VfRlBVX1AKKwkgICYmIFdJVEhfVFJBQ0VfTUVNT1JZX1AKKwkgICYmIFdJVEhfVFJBQ0VfQlJBTkNIX1ApCisJeworCSAgaWYgKHNldF90cmFjZV9vcHRpb24gKHNkLCAiLXNlbWFudGljcyIsIFRSQUNFX0FMVV9JRFgsIGFyZykgIT0gU0lNX1JDX09LCisJICAgICAgfHwgc2V0X3RyYWNlX29wdGlvbiAoc2QsICItc2VtYW50aWNzIiwgVFJBQ0VfRlBVX0lEWCwgYXJnKSAhPSBTSU1fUkNfT0sKKwkgICAgICB8fCBzZXRfdHJhY2Vfb3B0aW9uIChzZCwgIi1zZW1hbnRpY3MiLCBUUkFDRV9NRU1PUllfSURYLCBhcmcpICE9IFNJTV9SQ19PSworCSAgICAgIHx8IHNldF90cmFjZV9vcHRpb24gKHNkLCAiLXNlbWFudGljcyIsIFRSQUNFX0JSQU5DSF9JRFgsIGFyZykgIT0gU0lNX1JDX09LKQorCSAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisJfQorICAgICAgZWxzZQorCXNpbV9pb19lcHJpbnRmIChzZCwgIkFsdSwgZnB1LCBtZW1vcnksIGFuZC9vciBicmFuY2ggdHJhY2luZyBub3QgY29tcGlsZWQgaW4sIGAtLXRyYWNlLXNlbWFudGljcycgaWdub3JlZFxuIik7CisgICAgICBicmVhazsKKworI2lmZGVmIFNJTV9IQVZFX0FERFJfUkFOR0UKKyAgICBjYXNlIE9QVElPTl9UUkFDRV9SQU5HRSA6CisgICAgICBpZiAoV0lUSF9UUkFDRSkKKwl7CisJICBjaGFyICpjaHAgPSBhcmc7CisJICB1bnNpZ25lZCBsb25nIHN0YXJ0LGVuZDsKKwkgIHN0YXJ0ID0gc3RydG91bCAoY2hwLCAmY2hwLCAwKTsKKwkgIGlmICgqY2hwICE9ICcsJykKKwkgICAgeworCSAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIi0tdHJhY2UtcmFuZ2UgbWlzc2luZyBFTkQgYXJndW1lbnRcbiIpOworCSAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKwkgICAgfQorCSAgZW5kID0gc3RydG91bCAoY2hwICsgMSwgTlVMTCwgMCk7CisJICAvKiBGSVhNRTogQXJndW1lbnQgdmFsaWRhdGlvbi4gICovCisJICBpZiAoY3B1ICE9IE5VTEwpCisJICAgIHNpbV9hZGRyX3JhbmdlX2FkZCAoVFJBQ0VfUkFOR0UgKENQVV9QUk9GSUxFX0RBVEEgKGNwdSkpLAorCQkJCXN0YXJ0LCBlbmQpOworCSAgZWxzZQorCSAgICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2NwdV9ucikKKwkgICAgICBzaW1fYWRkcl9yYW5nZV9hZGQgKFRSQUNFX1JBTkdFIChDUFVfVFJBQ0VfREFUQSAoU1RBVEVfQ1BVIChzZCwgY3B1X25yKSkpLAorCQkJCSAgc3RhcnQsIGVuZCk7CisJfQorICAgICAgZWxzZQorCXNpbV9pb19lcHJpbnRmIChzZCwgIlRyYWNpbmcgbm90IGNvbXBpbGVkIGluLCBgLS10cmFjZS1yYW5nZScgaWdub3JlZFxuIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX1RSQUNFX0ZVTkNUSU9OIDoKKyAgICAgIGlmIChXSVRIX1RSQUNFKQorCXsKKwkgIC8qd2lwOiBuZWVkIHRvIGNvbXB1dGUgZnVuY3Rpb24gcmFuZ2UgZ2l2ZW4gbmFtZSovCisJfQorICAgICAgZWxzZQorCXNpbV9pb19lcHJpbnRmIChzZCwgIlRyYWNpbmcgbm90IGNvbXBpbGVkIGluLCBgLS10cmFjZS1mdW5jdGlvbicgaWdub3JlZFxuIik7CisgICAgICBicmVhazsKKyNlbmRpZiAvKiBTSU1fSEFWRV9BRERSX1JBTkdFICovCisKKyAgICBjYXNlIE9QVElPTl9UUkFDRV9ERUJVRyA6CisgICAgICBpZiAoV0lUSF9UUkFDRV9ERUJVR19QKQorCXJldHVybiBzZXRfdHJhY2Vfb3B0aW9uIChzZCwgIi1kZWJ1ZyIsIFRSQUNFX0RFQlVHX0lEWCwgYXJnKTsKKyAgICAgIGVsc2UKKwlzaW1faW9fZXByaW50ZiAoc2QsICJUcmFjaW5nIGRlYnVnIHN1cHBvcnQgbm90IGNvbXBpbGVkIGluLCBgLS10cmFjZS1kZWJ1ZycgaWdub3JlZFxuIik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BUSU9OX1RSQUNFX0ZJTEUgOgorICAgICAgaWYgKCEgV0lUSF9UUkFDRSkKKwlzaW1faW9fZXByaW50ZiAoc2QsICJUcmFjaW5nIG5vdCBjb21waWxlZCBpbiwgYC0tdHJhY2UtZmlsZScgaWdub3JlZFxuIik7CisgICAgICBlbHNlCisJeworCSAgRklMRSAqZiA9IGZvcGVuIChhcmcsICJ3Iik7CisKKwkgIGlmIChmID09IE5VTEwpCisJICAgIHsKKwkgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJVbmFibGUgdG8gb3BlbiB0cmFjZSBvdXRwdXQgZmlsZSBgJXMnXG4iLCBhcmcpOworCSAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKwkgICAgfQorCSAgZm9yIChuID0gMDsgbiA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK24pCisJICAgIFRSQUNFX0ZJTEUgKENQVV9UUkFDRV9EQVRBIChTVEFURV9DUFUgKHNkLCBuKSkpID0gZjsKKwkgIFRSQUNFX0ZJTEUgKFNUQVRFX1RSQUNFX0RBVEEgKHNkKSkgPSBmOworCX0KKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gU0lNX1JDX09LOworfQorDAorLyogSW5zdGFsbCB0cmFjaW5nIHN1cHBvcnQuICAqLworCitTSU1fUkMKK3RyYWNlX2luc3RhbGwgKFNJTV9ERVNDIHNkKQoreworICBpbnQgaTsKKworICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworCisgIHNpbV9hZGRfb3B0aW9uX3RhYmxlIChzZCwgTlVMTCwgdHJhY2Vfb3B0aW9ucyk7CisgIG1lbXNldCAoU1RBVEVfVFJBQ0VfREFUQSAoc2QpLCAwLCBzaXplb2YgKCogU1RBVEVfVFJBQ0VfREFUQSAoc2QpKSk7CisgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytpKQorICAgIG1lbXNldCAoQ1BVX1RSQUNFX0RBVEEgKFNUQVRFX0NQVSAoc2QsIGkpKSwgMCwKKwkgICAgc2l6ZW9mICgqIENQVV9UUkFDRV9EQVRBIChTVEFURV9DUFUgKHNkLCBpKSkpKTsKKyAgc2ltX21vZHVsZV9hZGRfaW5pdF9mbiAoc2QsIHRyYWNlX2luaXQpOworICBzaW1fbW9kdWxlX2FkZF91bmluc3RhbGxfZm4gKHNkLCB0cmFjZV91bmluc3RhbGwpOworICByZXR1cm4gU0lNX1JDX09LOworfQorCitzdGF0aWMgU0lNX1JDCit0cmFjZV9pbml0IChTSU1fREVTQyBzZCkKK3sKKyNpZmRlZiBTSU1fSEFWRV9BRERSX1JBTkdFCisgIC8qIENoZWNrIGlmIGEgcmFuZ2UgaGFzIGJlZW4gc3BlY2lmaWVkIHdpdGhvdXQgc3BlY2lmeWluZyB3aGF0IHRvCisgICAgIGNvbGxlY3QuICAqLworICB7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1BST0NFU1NPUlM7ICsraSkKKyAgICAgIHsKKwlzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCBpKTsKKworCWlmIChBRERSX1JBTkdFX1JBTkdFUyAoVFJBQ0VfUkFOR0UgKENQVV9UUkFDRV9EQVRBIChjcHUpKSkKKwkgICAgJiYgISBUUkFDRV9JTlNOX1AgKGNwdSkpCisJICB7CisJICAgIHNpbV9pb19lcHJpbnRmX2NwdSAoY3B1LCAiVHJhY2luZyBhZGRyZXNzIHJhbmdlIHNwZWNpZmllZCB3aXRob3V0IC0tdHJhY2UtaW5zbi5cbiIpOworCSAgICBzaW1faW9fZXByaW50Zl9jcHUgKGNwdSwgIkFkZHJlc3MgcmFuZ2UgaWdub3JlZC5cbiIpOworCSAgICBzaW1fYWRkcl9yYW5nZV9kZWxldGUgKFRSQUNFX1JBTkdFIChDUFVfVFJBQ0VfREFUQSAoY3B1KSksCisJCQkJICAgMCwgfiAoYWRkcmVzc193b3JkKSAwKTsKKwkgIH0KKyAgICAgIH0KKyAgfQorI2VuZGlmCisKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworc3RhdGljIHZvaWQKK3RyYWNlX3VuaW5zdGFsbCAoU0lNX0RFU0Mgc2QpCit7CisgIGludCBpLGo7CisgIEZJTEUgKnNmaWxlID0gVFJBQ0VfRklMRSAoU1RBVEVfVFJBQ0VfREFUQSAoc2QpKTsKKworICBpZiAoc2ZpbGUgIT0gTlVMTCkKKyAgICBmY2xvc2UgKHNmaWxlKTsKKworICBmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1BST0NFU1NPUlM7ICsraSkKKyAgICB7CisgICAgICBGSUxFICpjZmlsZSA9IFRSQUNFX0ZJTEUgKENQVV9UUkFDRV9EQVRBIChTVEFURV9DUFUgKHNkLCBpKSkpOworICAgICAgaWYgKGNmaWxlICE9IE5VTEwgJiYgY2ZpbGUgIT0gc2ZpbGUpCisJeworCSAgLyogSWYgb3V0cHV0IGZyb20gZGlmZmVyZW50IGNwdXMgaXMgZ29pbmcgdG8gdGhlIHNhbWUgZmlsZSwKKwkgICAgIGF2b2lkIGNsb3NpbmcgdGhlIGZpbGUgdHdpY2UuICAqLworCSAgZm9yIChqID0gMDsgaiA8IGk7ICsraikKKwkgICAgaWYgKFRSQUNFX0ZJTEUgKENQVV9UUkFDRV9EQVRBIChTVEFURV9DUFUgKHNkLCBqKSkpID09IGNmaWxlKQorCSAgICAgIGJyZWFrOworCSAgaWYgKGkgPT0gaikKKwkgICAgZmNsb3NlIChjZmlsZSk7CisJfQorICAgIH0KK30KKwwKK3R5cGVkZWYgZW51bSB7CisgIHRyYWNlX2ZtdF9pbnZhbGlkLAorICB0cmFjZV9mbXRfd29yZCwKKyAgdHJhY2VfZm10X2ZwLAorICB0cmFjZV9mbXRfZnB1LAorICB0cmFjZV9mbXRfc3RyaW5nLAorICB0cmFjZV9mbXRfYm9vbCwKKyAgdHJhY2VfZm10X2FkZHIsCisgIHRyYWNlX2ZtdF9pbnN0cnVjdGlvbl9pbmNvbXBsZXRlLAorfSBkYXRhX2ZtdDsKKworLyogY29tcHV0ZSB0aGUgbnIgb2YgdHJhY2UgZGF0YSB1bml0cyBjb25zdW1lZCBieSBkYXRhICovCitzdGF0aWMgaW50CitzYXZlX2RhdGFfc2l6ZSAoVFJBQ0VfREFUQSAqZGF0YSwKKwkJbG9uZyBzaXplKQoreworICByZXR1cm4gKChzaXplICsgc2l6ZW9mIChUUkFDRV9JTlBVVF9EQVRBIChkYXRhKSBbMF0pIC0gMSkKKwkgIC8gc2l6ZW9mIChUUkFDRV9JTlBVVF9EQVRBIChkYXRhKSBbMF0pKTsKK30KKworCisvKiBBcmNoaXZlIERBVEEgaW50byB0aGUgdHJhY2UgYnVmZmVyICovCitzdGF0aWMgdm9pZAorc2F2ZV9kYXRhIChTSU1fREVTQyBzZCwKKwkgICBUUkFDRV9EQVRBICpkYXRhLAorCSAgIGRhdGFfZm10IGZtdCwKKwkgICBsb25nIHNpemUsCisJICAgdm9pZCAqYnVmKQoreworICBpbnQgaSA9IFRSQUNFX0lOUFVUX0lEWCAoZGF0YSk7CisgIGlmIChpID09IHNpemVvZiAoVFJBQ0VfSU5QVVRfRk1UIChkYXRhKSkpCisgICAgc2ltX2lvX2Vycm9yIChzZCwgInRyYWNlIGJ1ZmZlciBvdmVyZmxvdyIpOworICBUUkFDRV9JTlBVVF9GTVQgKGRhdGEpIFtpXSA9IGZtdDsKKyAgVFJBQ0VfSU5QVVRfU0laRSAoZGF0YSkgW2ldID0gc2l6ZTsKKyAgbWVtY3B5ICgmVFJBQ0VfSU5QVVRfREFUQSAoZGF0YSkgW2ldLCBidWYsIHNpemUpOworICBpICs9IHNhdmVfZGF0YV9zaXplIChkYXRhLCBzaXplKTsKKyAgVFJBQ0VfSU5QVVRfSURYIChkYXRhKSA9IGk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9kYXRhIChTSU1fREVTQyBzZCwKKwkgICAgc2ltX2NwdSAqY3B1LAorCSAgICBkYXRhX2ZtdCBmbXQsCisJICAgIGxvbmcgc2l6ZSwKKwkgICAgdm9pZCAqZGF0YSkKK3sKKyAgc3dpdGNoIChmbXQpCisgICAgeworICAgIGNhc2UgdHJhY2VfZm10X2luc3RydWN0aW9uX2luY29tcGxldGU6CisgICAgICB0cmFjZV9wcmludGYgKHNkLCBjcHUsICIgKGluc3RydWN0aW9uIGluY29tcGxldGUpIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRyYWNlX2ZtdF93b3JkOgorICAgIGNhc2UgdHJhY2VfZm10X2FkZHI6CisgICAgICB7CisJc3dpdGNoIChzaXplKQorCSAgeworCSAgY2FzZSBzaXplb2YgKHVuc2lnbmVkMzIpOgorCSAgICB0cmFjZV9wcmludGYgKHNkLCBjcHUsICIgMHglMDhseCIsIChsb25nKSAqICh1bnNpZ25lZDMyKikgZGF0YSk7CisJICAgIGJyZWFrOworCSAgY2FzZSBzaXplb2YgKHVuc2lnbmVkNjQpOgorCSAgICB0cmFjZV9wcmludGYgKHNkLCBjcHUsICIgMHglMDhseCUwOGx4IiwKKwkJCSAgKGxvbmcpICgoKiAodW5zaWduZWQ2NCopIGRhdGEpID4+IDMyKSwKKwkJCSAgKGxvbmcpICogKHVuc2lnbmVkNjQqKSBkYXRhKTsKKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICBhYm9ydCAoKTsKKwkgIH0KKwlicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIHRyYWNlX2ZtdF9ib29sOgorICAgICAgeworCVNJTV9BU1NFUlQgKHNpemUgPT0gc2l6ZW9mIChpbnQpKTsKKwl0cmFjZV9wcmludGYgKHNkLCBjcHUsICIgJS04cyIsCisJCSAgICAgICgqIChpbnQqKSBkYXRhKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgdHJhY2VfZm10X2ZwOgorICAgICAgeworCXNpbV9mcHUgZnA7CisJc3dpdGNoIChzaXplKQorCSAgeworCSAgICAvKiBGSVhNRTogQXNzdW1lcyBzaXplb2YgZmxvYXQgPT0gNDsgc2l6ZW9mIGRvdWJsZSA9PSA4ICovCisJICBjYXNlIDQ6CisJICAgIHNpbV9mcHVfMzJ0byAoJmZwLCAqKHVuc2lnbmVkMzIqKWRhdGEpOworCSAgICBicmVhazsKKwkgIGNhc2UgODoKKwkgICAgc2ltX2ZwdV82NHRvICgmZnAsICoodW5zaWduZWQ2NCopZGF0YSk7CisJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkgICAgYWJvcnQgKCk7CisJICB9CisJdHJhY2VfcHJpbnRmIChzZCwgY3B1LCAiICU4ZyIsIHNpbV9mcHVfMmQgKCZmcCkpOworCXN3aXRjaCAoc2l6ZSkKKwkgIHsKKwkgIGNhc2UgNDoKKwkgICAgdHJhY2VfcHJpbnRmIChzZCwgY3B1LCAiICgweCUwOGx4KSIsCisJCQkgIChsb25nKSAqKHVuc2lnbmVkMzIqKWRhdGEpOworCSAgICBicmVhazsKKwkgIGNhc2UgODoKKwkgICAgdHJhY2VfcHJpbnRmIChzZCwgY3B1LCAiICgweCUwOGx4JTA4bHgpIiwKKwkJCSAgKGxvbmcpICgqKHVuc2lnbmVkNjQqKWRhdGEgPj4gMzIpLAorCQkJICAobG9uZykgKCoodW5zaWduZWQ2NCopZGF0YSkpOworCSAgICBicmVhazsKKwkgIGRlZmF1bHQ6CisJICAgIGFib3J0ICgpOworCSAgfQorCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgdHJhY2VfZm10X2ZwdToKKyAgICAgIC8qIEZJWE1FOiBBdCBwcmVzZW50IHNpbV9mcHUgZGF0YSBpcyBzdG9yZWQgYXMgYSBkb3VibGUgKi8KKyAgICAgIHRyYWNlX3ByaW50ZiAoc2QsIGNwdSwgIiAlOGciLCAqIChkb3VibGUqKSBkYXRhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdHJhY2VfZm10X3N0cmluZzoKKyAgICAgIHRyYWNlX3ByaW50ZiAoc2QsIGNwdSwgIiAlLThzIiwgKGNoYXIqKSBkYXRhKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisJCSAgCitzdGF0aWMgY29uc3QgY2hhciAqCit0cmFjZV9pZHhfdG9fc3RyIChpbnQgdHJhY2VfaWR4KQoreworICBzdGF0aWMgY2hhciBudW1bOF07CisgIHN3aXRjaCAodHJhY2VfaWR4KQorICAgIHsKKyAgICBjYXNlIFRSQUNFX0FMVV9JRFg6ICAgICByZXR1cm4gImFsdTogICAgICI7CisgICAgY2FzZSBUUkFDRV9JTlNOX0lEWDogICAgcmV0dXJuICJpbnNuOiAgICAiOworICAgIGNhc2UgVFJBQ0VfREVDT0RFX0lEWDogIHJldHVybiAiZGVjb2RlOiAgIjsKKyAgICBjYXNlIFRSQUNFX0VYVFJBQ1RfSURYOiByZXR1cm4gImV4dHJhY3Q6ICI7CisgICAgY2FzZSBUUkFDRV9NRU1PUllfSURYOiAgcmV0dXJuICJtZW1vcnk6ICAiOworICAgIGNhc2UgVFJBQ0VfQ09SRV9JRFg6ICAgIHJldHVybiAiY29yZTogICAgIjsKKyAgICBjYXNlIFRSQUNFX0VWRU5UU19JRFg6ICByZXR1cm4gImV2ZW50czogICI7CisgICAgY2FzZSBUUkFDRV9GUFVfSURYOiAgICAgcmV0dXJuICJmcHU6ICAgICAiOworICAgIGNhc2UgVFJBQ0VfQlJBTkNIX0lEWDogIHJldHVybiAiYnJhbmNoOiAgIjsKKyAgICBkZWZhdWx0OgorICAgICAgc3ByaW50ZiAobnVtLCAiPyVkPyIsIHRyYWNlX2lkeCk7CisgICAgICByZXR1cm4gbnVtOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3RyYWNlX3Jlc3VsdHMgKFNJTV9ERVNDIHNkLAorCSAgICAgICBzaW1fY3B1ICpjcHUsCisJICAgICAgIGludCB0cmFjZV9pZHgsCisJICAgICAgIGludCBsYXN0X2lucHV0KQoreworICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7CisgIGludCBucl9vdXQ7CisgIGludCBpOworCisgIC8qIGNyb3NzIGNoZWNrIHRyYWNlX2lkeCBhZ2FpbnN0IFRSQUNFX0lEWCAoZGF0YSk/ICovCisKKyAgLyogcHJlZml4ICovCisgIHRyYWNlX3ByaW50ZiAoc2QsIGNwdSwgIiVzICVzIiwKKwkJdHJhY2VfaWR4X3RvX3N0ciAoVFJBQ0VfSURYIChkYXRhKSksCisJCVRSQUNFX1BSRUZJWCAoZGF0YSkpOworICBUUkFDRV9JRFggKGRhdGEpID0gMDsKKworICBmb3IgKGkgPSAwLCBucl9vdXQgPSAwOworICAgICAgIGkgPCBUUkFDRV9JTlBVVF9JRFggKGRhdGEpOworICAgICAgIGkgKz0gc2F2ZV9kYXRhX3NpemUgKGRhdGEsIFRSQUNFX0lOUFVUX1NJWkUgKGRhdGEpIFtpXSksIG5yX291dCsrKQorICAgIHsKKyAgICAgIGlmIChpID09IGxhc3RfaW5wdXQpCisJeworCSAgaW50IHBhZCA9IChzdHJsZW4gKCIgMHgiKSArIHNpemVvZiAodW5zaWduZWRfd29yZCkgKiAyKTsKKwkgIGludCBwYWRkaW5nID0gcGFkICogKDMgLSBucl9vdXQpOworCSAgaWYgKHBhZGRpbmcgPCAwKQorCSAgICBwYWRkaW5nID0gMDsKKwkgIHBhZGRpbmcgKz0gc3RybGVuICgiIDo6Iik7CisJICB0cmFjZV9wcmludGYgKHNkLCBjcHUsICIlKnMiLCBwYWRkaW5nLCAiIDo6Iik7CisJfQorICAgICAgcHJpbnRfZGF0YSAoc2QsIGNwdSwKKwkJICBUUkFDRV9JTlBVVF9GTVQgKGRhdGEpIFtpXSwKKwkJICBUUkFDRV9JTlBVVF9TSVpFIChkYXRhKSBbaV0sCisJCSAgJlRSQUNFX0lOUFVUX0RBVEEgKGRhdGEpIFtpXSk7CisgICAgfQorICB0cmFjZV9wcmludGYgKHNkLCBjcHUsICJcbiIpOworfQorCit2b2lkCit0cmFjZV9wcmVmaXggKFNJTV9ERVNDIHNkLAorCSAgICAgIHNpbV9jcHUgKmNwdSwKKwkgICAgICBzaW1fY2lhIGNpYSwKKwkgICAgICBhZGRyZXNzX3dvcmQgcGMsCisJICAgICAgaW50IGxpbmVfcCwKKwkgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkgICAgICBpbnQgbGluZW51bSwKKwkgICAgICBjb25zdCBjaGFyICpmbXQsCisJICAgICAgLi4uKQoreworICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7CisgIHZhX2xpc3QgYXA7CisgIGNoYXIgKnByZWZpeCA9IFRSQUNFX1BSRUZJWCAoZGF0YSk7CisgIGNoYXIgKmNocDsKKyAvKiBGSVhNRTogVGhlIFRSQUNFX1BSRUZJWF9XSURUSCBzaG91bGQgYmUgZGV0ZXJtaW5lZCBhdCBidWlsZCB0aW1lIHVzaW5nCisgICAga25vd24gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRpc2Fzc2VtYmxlZCBpbnN0cnVjdGlvbnMuICovCisjaWZuZGVmIFRSQUNFX1BSRUZJWF9XSURUSAorI2RlZmluZSBUUkFDRV9QUkVGSVhfV0lEVEggNDgKKyNlbmRpZgorICBpbnQgd2lkdGggPSBUUkFDRV9QUkVGSVhfV0lEVEg7CisKKyAgLyogaWYgdGhlIHByZXZpb3VzIHRyYWNlIGRhdGEgd2Fzbid0IGZsdXNoZWQsIGZsdXNoIGl0IG5vdyB3aXRoIGEKKyAgICAgbm90ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHRyYWNlIHdhcyBpbmNvbXBsZXRlLiAqLworICBpZiAoVFJBQ0VfSURYIChkYXRhKSAhPSAwKQorICAgIHsKKyAgICAgIGludCBsYXN0X2lucHV0ID0gVFJBQ0VfSU5QVVRfSURYIChkYXRhKTsKKyAgICAgIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF9pbnN0cnVjdGlvbl9pbmNvbXBsZXRlLCAxLCAiIik7CisgICAgICB0cmFjZV9yZXN1bHRzIChzZCwgY3B1LCBUUkFDRV9JRFggKGRhdGEpLCBsYXN0X2lucHV0KTsKKyAgICB9CisgIFRSQUNFX0lEWCAoZGF0YSkgPSAwOworICBUUkFDRV9JTlBVVF9JRFggKGRhdGEpID0gMDsKKworICAvKiBDcmVhdGUgdGhlIHRleHQgcHJlZml4IGZvciB0aGlzIG5ldyBpbnN0cnVjdGlvbjogKi8KKyAgaWYgKCFsaW5lX3ApCisgICAgeworICAgICAgaWYgKGZpbGVuYW1lKQorCXsKKwkgIHNwcmludGYgKHByZWZpeCwgIiVzOiUtKmQgMHglLipseCAiLAorCQkgICBmaWxlbmFtZSwKKwkJICAgU0laRV9MSU5FX05VTUJFUiwgbGluZW51bSwKKwkJICAgU0laRV9QQywgKGxvbmcpIHBjKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3ByaW50ZiAocHJlZml4LCAiMHglLipseCAiLAorCQkgICBTSVpFX1BDLCAobG9uZykgcGMpOworCSAgLyogU2hyaW5rIHRoZSB3aWR0aCBieSB0aGUgYW1vdW50IHRoYXQgd2UgZGlkbid0IHByaW50LiAgKi8KKwkgIHdpZHRoIC09IFNJWkVfTElORV9OVU1CRVIgKyBTSVpFX1BDICsgODsKKwl9CisgICAgICBjaHAgPSBzdHJjaHIgKHByZWZpeCwgJ1wwJyk7CisgICAgICB2YV9zdGFydCAoYXAsIGZtdCk7CisgICAgICB2c3ByaW50ZiAoY2hwLCBmbXQsIGFwKTsKKyAgICAgIHZhX2VuZCAoYXApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNoYXIgYnVmWzI1Nl07CisgICAgICBidWZbMF0gPSAwOworICAgICAgaWYgKFNUQVRFX1RFWFRfU0VDVElPTiAoQ1BVX1NUQVRFIChjcHUpKQorCSAgJiYgcGMgPj0gU1RBVEVfVEVYVF9TVEFSVCAoQ1BVX1NUQVRFIChjcHUpKQorCSAgJiYgcGMgPCBTVEFURV9URVhUX0VORCAoQ1BVX1NUQVRFIChjcHUpKSkKKwl7CisJICBjb25zdCBjaGFyICpwY19maWxlbmFtZSA9IChjb25zdCBjaGFyICopMDsKKwkgIGNvbnN0IGNoYXIgKnBjX2Z1bmN0aW9uID0gKGNvbnN0IGNoYXIgKikwOworCSAgdW5zaWduZWQgaW50IHBjX2xpbmVudW0gPSAwOworCSAgYmZkICphYmZkOworCSAgYXN5bWJvbCAqKmFzeW1ib2xzOworCisJICBhYmZkID0gU1RBVEVfUFJPR19CRkQgKENQVV9TVEFURSAoY3B1KSk7CisJICBhc3ltYm9scyA9IFNUQVRFX1BST0dfU1lNUyAoQ1BVX1NUQVRFIChjcHUpKTsKKwkgIGlmIChhc3ltYm9scyA9PSBOVUxMKQorCSAgICB7CisJICAgICAgbG9uZyBzeW1zaXplOworCSAgICAgIGxvbmcgc3ltYm9sX2NvdW50OworCisJICAgICAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKKwkgICAgICBpZiAoc3ltc2l6ZSA8IDApCisJCXsKKwkJICBzaW1fZW5naW5lX2Fib3J0IChzZCwgY3B1LCBjaWEsICJjb3VsZCBub3QgcmVhZCBzeW1ib2xzIik7CisJCX0KKwkgICAgICBhc3ltYm9scyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1zaXplKTsKKwkgICAgICBzeW1ib2xfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgYXN5bWJvbHMpOworCSAgICAgIGlmIChzeW1ib2xfY291bnQgPCAwKQorCQl7CisJCSAgc2ltX2VuZ2luZV9hYm9ydCAoc2QsIGNwdSwgY2lhLCAiY291bGQgbm90IGNhbm9uaWNhbGl6ZSBzeW1ib2xzIik7CisJCX0KKwkgICAgICBTVEFURV9QUk9HX1NZTVMgKENQVV9TVEFURSAoY3B1KSkgPSBhc3ltYm9sczsKKwkgICAgfQorCisJICBpZiAoYmZkX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLAorCQkJCSAgICAgU1RBVEVfVEVYVF9TRUNUSU9OIChDUFVfU1RBVEUgKGNwdSkpLAorCQkJCSAgICAgYXN5bWJvbHMsCisJCQkJICAgICBwYyAtIFNUQVRFX1RFWFRfU1RBUlQgKENQVV9TVEFURSAoY3B1KSksCisJCQkJICAgICAmcGNfZmlsZW5hbWUsICZwY19mdW5jdGlvbiwgJnBjX2xpbmVudW0pKQorCSAgICB7CisJICAgICAgY2hhciAqcCA9IGJ1ZjsKKwkgICAgICBpZiAocGNfbGluZW51bSkKKwkJeworCQkgIHNwcmludGYgKHAsICIjJS0qZCAiLCBTSVpFX0xJTkVfTlVNQkVSLCBwY19saW5lbnVtKTsKKwkJICBwICs9IHN0cmxlbiAocCk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBzcHJpbnRmIChwLCAiJS0qcyAiLCBTSVpFX0xJTkVfTlVNQkVSKzEsICItLS0iKTsKKwkJICBwICs9IFNJWkVfTElORV9OVU1CRVIrMjsKKwkJfQorCisJICAgICAgaWYgKHBjX2Z1bmN0aW9uKQorCQl7CisJCSAgc3ByaW50ZiAocCwgIiVzICIsIHBjX2Z1bmN0aW9uKTsKKwkJICBwICs9IHN0cmxlbiAocCk7CisJCX0KKwkgICAgICBlbHNlIGlmIChwY19maWxlbmFtZSkKKwkJeworCQkgIGNoYXIgKnEgPSAoY2hhciAqKSBzdHJyY2hyIChwY19maWxlbmFtZSwgJy8nKTsKKwkJICBzcHJpbnRmIChwLCAiJXMgIiwgKHEpID8gcSsxIDogcGNfZmlsZW5hbWUpOworCQkgIHAgKz0gc3RybGVuIChwKTsKKwkJfQorCisJICAgICAgaWYgKCpwID09ICcgJykKKwkJKnAgPSAnXDAnOworCSAgICB9CisJfQorCisgICAgICBzcHJpbnRmIChwcmVmaXgsICIweCUuKnggJS0qLipzICIsCisJICAgICAgIFNJWkVfUEMsICh1bnNpZ25lZCkgcGMsCisJICAgICAgIFNJWkVfTE9DQVRJT04sIFNJWkVfTE9DQVRJT04sIGJ1Zik7CisgICAgICBjaHAgPSBzdHJjaHIgKHByZWZpeCwgJ1wwJyk7CisgICAgICB2YV9zdGFydCAoYXAsIGZtdCk7CisgICAgICB2c3ByaW50ZiAoY2hwLCBmbXQsIGFwKTsKKyAgICAgIHZhX2VuZCAoYXApOworICAgIH0KKworICAvKiBQYWQgaXQgb3V0IHRvIFRSQUNFX1BSRUZJWF9XSURUSC4gICovCisgIGNocCA9IHN0cmNociAocHJlZml4LCAnXDAnKTsKKyAgaWYgKGNocCAtIHByZWZpeCA8IHdpZHRoKQorICAgIHsKKyAgICAgIG1lbXNldCAoY2hwLCAnICcsIHdpZHRoIC0gKGNocCAtIHByZWZpeCkpOworICAgICAgY2hwID0gJnByZWZpeCBbd2lkdGhdOworICAgICAgKmNocCA9ICdcMCc7CisgICAgfQorICBzdHJjcHkgKGNocCwgIiAtIik7CisKKyAgLyogY2hlY2sgdGhhdCB3ZSd2ZSBub3Qgb3ZlciBmbG93ZWQgdGhlIHByZWZpeCBidWZmZXIgKi8KKyAgaWYgKHN0cmxlbiAocHJlZml4KSA+PSBzaXplb2YgKFRSQUNFX1BSRUZJWCAoZGF0YSkpKQorICAgIGFib3J0ICgpOworfQorCit2b2lkCit0cmFjZV9nZW5lcmljIChTSU1fREVTQyBzZCwKKwkgICAgICAgc2ltX2NwdSAqY3B1LAorCSAgICAgICBpbnQgdHJhY2VfaWR4LAorCSAgICAgICBjb25zdCBjaGFyICpmbXQsCisJICAgICAgIC4uLikKK3sKKyAgdmFfbGlzdCBhcDsKKyAgdHJhY2VfcHJpbnRmIChzZCwgY3B1LCAiJXMgJXMiLAorCQl0cmFjZV9pZHhfdG9fc3RyICh0cmFjZV9pZHgpLAorCQlUUkFDRV9QUkVGSVggKENQVV9UUkFDRV9EQVRBIChjcHUpKSk7CisgIHZhX3N0YXJ0IChhcCwgZm10KTsKKyAgdHJhY2VfdnByaW50ZiAoc2QsIGNwdSwgZm10LCBhcCk7CisgIHZhX2VuZCAoYXApOworICB0cmFjZV9wcmludGYgKHNkLCBjcHUsICJcbiIpOworfQorCit2b2lkCit0cmFjZV9pbnB1dDAgKFNJTV9ERVNDIHNkLAorCSAgICAgIHNpbV9jcHUgKmNwdSwKKwkgICAgICBpbnQgdHJhY2VfaWR4KQoreworICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7CisgIFRSQUNFX0lEWCAoZGF0YSkgPSB0cmFjZV9pZHg7Cit9CisKK3ZvaWQKK3RyYWNlX2lucHV0X3dvcmQxIChTSU1fREVTQyBzZCwKKwkJICAgc2ltX2NwdSAqY3B1LAorCQkgICBpbnQgdHJhY2VfaWR4LAorCQkgICB1bnNpZ25lZF93b3JkIGQwKQoreworICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7CisgIFRSQUNFX0lEWCAoZGF0YSkgPSB0cmFjZV9pZHg7CisgIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF93b3JkLCBzaXplb2YgKHVuc2lnbmVkX3dvcmQpLCAmZDApOworfQorCit2b2lkCit0cmFjZV9pbnB1dF93b3JkMiAoU0lNX0RFU0Mgc2QsCisJCSAgIHNpbV9jcHUgKmNwdSwKKwkJICAgaW50IHRyYWNlX2lkeCwKKwkJICAgdW5zaWduZWRfd29yZCBkMCwKKwkJICAgdW5zaWduZWRfd29yZCBkMSkKK3sKKyAgVFJBQ0VfREFUQSAqZGF0YSA9IENQVV9UUkFDRV9EQVRBIChjcHUpOworICBUUkFDRV9JRFggKGRhdGEpID0gdHJhY2VfaWR4OworICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfd29yZCwgc2l6ZW9mICh1bnNpZ25lZF93b3JkKSwgJmQwKTsKKyAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X3dvcmQsIHNpemVvZiAodW5zaWduZWRfd29yZCksICZkMSk7Cit9CisKK3ZvaWQKK3RyYWNlX2lucHV0X3dvcmQzIChTSU1fREVTQyBzZCwKKwkJICAgc2ltX2NwdSAqY3B1LAorCQkgICBpbnQgdHJhY2VfaWR4LAorCQkgICB1bnNpZ25lZF93b3JkIGQwLAorCQkgICB1bnNpZ25lZF93b3JkIGQxLAorCQkgICB1bnNpZ25lZF93b3JkIGQyKQoreworICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7CisgIFRSQUNFX0lEWCAoZGF0YSkgPSB0cmFjZV9pZHg7CisgIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF93b3JkLCBzaXplb2YgKHVuc2lnbmVkX3dvcmQpLCAmZDApOworICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfd29yZCwgc2l6ZW9mICh1bnNpZ25lZF93b3JkKSwgJmQxKTsKKyAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X3dvcmQsIHNpemVvZiAodW5zaWduZWRfd29yZCksICZkMik7Cit9CisKK3ZvaWQKK3RyYWNlX2lucHV0X3dvcmQ0IChTSU1fREVTQyBzZCwKKwkJICAgc2ltX2NwdSAqY3B1LAorCQkgICBpbnQgdHJhY2VfaWR4LAorCQkgICB1bnNpZ25lZF93b3JkIGQwLAorCQkgICB1bnNpZ25lZF93b3JkIGQxLAorCQkgICB1bnNpZ25lZF93b3JkIGQyLAorCQkgICB1bnNpZ25lZF93b3JkIGQzKQoreworICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7CisgIFRSQUNFX0lEWCAoZGF0YSkgPSB0cmFjZV9pZHg7CisgIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF93b3JkLCBzaXplb2YgKGQwKSwgJmQwKTsKKyAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X3dvcmQsIHNpemVvZiAoZDEpLCAmZDEpOworICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfd29yZCwgc2l6ZW9mIChkMiksICZkMik7CisgIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF93b3JkLCBzaXplb2YgKGQzKSwgJmQzKTsKK30KKwordm9pZAordHJhY2VfaW5wdXRfYm9vbDEgKFNJTV9ERVNDIHNkLAorCQkgICBzaW1fY3B1ICpjcHUsCisJCSAgIGludCB0cmFjZV9pZHgsCisJCSAgIGludCBkMCkKK3sKKyAgVFJBQ0VfREFUQSAqZGF0YSA9IENQVV9UUkFDRV9EQVRBIChjcHUpOworICBUUkFDRV9JRFggKGRhdGEpID0gdHJhY2VfaWR4OworICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfYm9vbCwgc2l6ZW9mIChkMCksICZkMCk7Cit9CisKK3ZvaWQKK3RyYWNlX2lucHV0X2FkZHIxIChTSU1fREVTQyBzZCwKKwkJICAgc2ltX2NwdSAqY3B1LAorCQkgICBpbnQgdHJhY2VfaWR4LAorCQkgICBhZGRyZXNzX3dvcmQgZDApCit7CisgIFRSQUNFX0RBVEEgKmRhdGEgPSBDUFVfVFJBQ0VfREFUQSAoY3B1KTsKKyAgVFJBQ0VfSURYIChkYXRhKSA9IHRyYWNlX2lkeDsKKyAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X2FkZHIsIHNpemVvZiAoZDApLCAmZDApOworfQorCit2b2lkCit0cmFjZV9pbnB1dF9mcDEgKFNJTV9ERVNDIHNkLAorCQkgc2ltX2NwdSAqY3B1LAorCQkgaW50IHRyYWNlX2lkeCwKKwkJIGZwX3dvcmQgZjApCit7CisgIFRSQUNFX0RBVEEgKmRhdGEgPSBDUFVfVFJBQ0VfREFUQSAoY3B1KTsKKyAgVFJBQ0VfSURYIChkYXRhKSA9IHRyYWNlX2lkeDsKKyAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X2ZwLCBzaXplb2YgKGZwX3dvcmQpLCAmZjApOworfQorCit2b2lkCit0cmFjZV9pbnB1dF9mcDIgKFNJTV9ERVNDIHNkLAorCQkgc2ltX2NwdSAqY3B1LAorCQkgaW50IHRyYWNlX2lkeCwKKwkJIGZwX3dvcmQgZjAsCisJCSBmcF93b3JkIGYxKQoreworICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7CisgIFRSQUNFX0lEWCAoZGF0YSkgPSB0cmFjZV9pZHg7CisgIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF9mcCwgc2l6ZW9mIChmcF93b3JkKSwgJmYwKTsKKyAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X2ZwLCBzaXplb2YgKGZwX3dvcmQpLCAmZjEpOworfQorCit2b2lkCit0cmFjZV9pbnB1dF9mcDMgKFNJTV9ERVNDIHNkLAorCQkgc2ltX2NwdSAqY3B1LAorCQkgaW50IHRyYWNlX2lkeCwKKwkJIGZwX3dvcmQgZjAsCisJCSBmcF93b3JkIGYxLAorCQkgZnBfd29yZCBmMikKK3sKKyAgVFJBQ0VfREFUQSAqZGF0YSA9IENQVV9UUkFDRV9EQVRBIChjcHUpOworICBUUkFDRV9JRFggKGRhdGEpID0gdHJhY2VfaWR4OworICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfZnAsIHNpemVvZiAoZnBfd29yZCksICZmMCk7CisgIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF9mcCwgc2l6ZW9mIChmcF93b3JkKSwgJmYxKTsKKyAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X2ZwLCBzaXplb2YgKGZwX3dvcmQpLCAmZjIpOworfQorCit2b2lkCit0cmFjZV9pbnB1dF9mcHUxIChTSU1fREVTQyBzZCwKKwkJICBzaW1fY3B1ICpjcHUsCisJCSAgaW50IHRyYWNlX2lkeCwKKwkJICBzaW1fZnB1ICpmMCkKK3sKKyAgZG91YmxlIGQ7CisgIFRSQUNFX0RBVEEgKmRhdGEgPSBDUFVfVFJBQ0VfREFUQSAoY3B1KTsKKyAgVFJBQ0VfSURYIChkYXRhKSA9IHRyYWNlX2lkeDsKKyAgZCA9IHNpbV9mcHVfMmQgKGYwKTsKKyAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X2ZwLCBzaXplb2YgKGRvdWJsZSksICZkKTsKK30KKwordm9pZAordHJhY2VfaW5wdXRfZnB1MiAoU0lNX0RFU0Mgc2QsCisJCSAgc2ltX2NwdSAqY3B1LAorCQkgIGludCB0cmFjZV9pZHgsCisJCSAgc2ltX2ZwdSAqZjAsCisJCSAgc2ltX2ZwdSAqZjEpCit7CisgIGRvdWJsZSBkOworICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7CisgIFRSQUNFX0lEWCAoZGF0YSkgPSB0cmFjZV9pZHg7CisgIGQgPSBzaW1fZnB1XzJkIChmMCk7CisgIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF9mcCwgc2l6ZW9mIChkb3VibGUpLCAmZCk7CisgIGQgPSBzaW1fZnB1XzJkIChmMSk7CisgIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF9mcCwgc2l6ZW9mIChkb3VibGUpLCAmZCk7Cit9CisKK3ZvaWQKK3RyYWNlX2lucHV0X2ZwdTMgKFNJTV9ERVNDIHNkLAorCQkgIHNpbV9jcHUgKmNwdSwKKwkJICBpbnQgdHJhY2VfaWR4LAorCQkgIHNpbV9mcHUgKmYwLAorCQkgIHNpbV9mcHUgKmYxLAorCQkgIHNpbV9mcHUgKmYyKQoreworICBkb3VibGUgZDsKKyAgVFJBQ0VfREFUQSAqZGF0YSA9IENQVV9UUkFDRV9EQVRBIChjcHUpOworICBUUkFDRV9JRFggKGRhdGEpID0gdHJhY2VfaWR4OworICBkID0gc2ltX2ZwdV8yZCAoZjApOworICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfZnAsIHNpemVvZiAoZG91YmxlKSwgJmQpOworICBkID0gc2ltX2ZwdV8yZCAoZjEpOworICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfZnAsIHNpemVvZiAoZG91YmxlKSwgJmQpOworICBkID0gc2ltX2ZwdV8yZCAoZjIpOworICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfZnAsIHNpemVvZiAoZG91YmxlKSwgJmQpOworfQorCit2b2lkCit0cmFjZV9yZXN1bHRfd29yZDEgKFNJTV9ERVNDIHNkLAorCQkgICAgc2ltX2NwdSAqY3B1LAorCQkgICAgaW50IHRyYWNlX2lkeCwKKwkJICAgIHVuc2lnbmVkX3dvcmQgcjApCit7CisgIFRSQUNFX0RBVEEgKmRhdGEgPSBDUFVfVFJBQ0VfREFUQSAoY3B1KTsKKyAgaW50IGxhc3RfaW5wdXQ7CisKKyAgLyogQXBwZW5kIGFueSByZXN1bHRzIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0cyAqLworICBsYXN0X2lucHV0ID0gVFJBQ0VfSU5QVVRfSURYIChkYXRhKTsKKyAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X3dvcmQsIHNpemVvZiAodW5zaWduZWRfd29yZCksICZyMCk7CisKKyAgdHJhY2VfcmVzdWx0cyAoc2QsIGNwdSwgdHJhY2VfaWR4LCBsYXN0X2lucHV0KTsKK30JICAgICAgCisKK3ZvaWQKK3RyYWNlX3Jlc3VsdDAgKFNJTV9ERVNDIHNkLAorCSAgICAgICBzaW1fY3B1ICpjcHUsCisJICAgICAgIGludCB0cmFjZV9pZHgpCit7CisgIFRSQUNFX0RBVEEgKmRhdGEgPSBDUFVfVFJBQ0VfREFUQSAoY3B1KTsKKyAgaW50IGxhc3RfaW5wdXQ7CisKKyAgLyogQXBwZW5kIGFueSByZXN1bHRzIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0cyAqLworICBsYXN0X2lucHV0ID0gVFJBQ0VfSU5QVVRfSURYIChkYXRhKTsKKworICB0cmFjZV9yZXN1bHRzIChzZCwgY3B1LCB0cmFjZV9pZHgsIGxhc3RfaW5wdXQpOworfQkgICAgICAKKwordm9pZAordHJhY2VfcmVzdWx0X3dvcmQyIChTSU1fREVTQyBzZCwKKwkJICAgIHNpbV9jcHUgKmNwdSwKKwkJICAgIGludCB0cmFjZV9pZHgsCisJCSAgICB1bnNpZ25lZF93b3JkIHIwLAorCQkgICAgdW5zaWduZWRfd29yZCByMSkKK3sKKyAgVFJBQ0VfREFUQSAqZGF0YSA9IENQVV9UUkFDRV9EQVRBIChjcHUpOworICBpbnQgbGFzdF9pbnB1dDsKKworICAvKiBBcHBlbmQgYW55IHJlc3VsdHMgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXRzICovCisgIGxhc3RfaW5wdXQgPSBUUkFDRV9JTlBVVF9JRFggKGRhdGEpOworICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfd29yZCwgc2l6ZW9mIChyMCksICZyMCk7CisgIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF93b3JkLCBzaXplb2YgKHIxKSwgJnIxKTsKKworICB0cmFjZV9yZXN1bHRzIChzZCwgY3B1LCB0cmFjZV9pZHgsIGxhc3RfaW5wdXQpOworfQkgICAgICAKKwordm9pZAordHJhY2VfcmVzdWx0X3dvcmQ0IChTSU1fREVTQyBzZCwKKwkJICAgIHNpbV9jcHUgKmNwdSwKKwkJICAgIGludCB0cmFjZV9pZHgsCisJCSAgICB1bnNpZ25lZF93b3JkIHIwLAorCQkgICAgdW5zaWduZWRfd29yZCByMSwKKwkJICAgIHVuc2lnbmVkX3dvcmQgcjIsCisJCSAgICB1bnNpZ25lZF93b3JkIHIzKQoreworICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7CisgIGludCBsYXN0X2lucHV0OworCisgIC8qIEFwcGVuZCBhbnkgcmVzdWx0cyB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dHMgKi8KKyAgbGFzdF9pbnB1dCA9IFRSQUNFX0lOUFVUX0lEWCAoZGF0YSk7CisgIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF93b3JkLCBzaXplb2YgKHIwKSwgJnIwKTsKKyAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X3dvcmQsIHNpemVvZiAocjEpLCAmcjEpOworICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfd29yZCwgc2l6ZW9mIChyMiksICZyMik7CisgIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF93b3JkLCBzaXplb2YgKHIzKSwgJnIzKTsKKworICB0cmFjZV9yZXN1bHRzIChzZCwgY3B1LCB0cmFjZV9pZHgsIGxhc3RfaW5wdXQpOworfQkgICAgICAKKwordm9pZAordHJhY2VfcmVzdWx0X2Jvb2wxIChTSU1fREVTQyBzZCwKKwkJICAgIHNpbV9jcHUgKmNwdSwKKwkJICAgIGludCB0cmFjZV9pZHgsCisJCSAgICBpbnQgcjApCit7CisgIFRSQUNFX0RBVEEgKmRhdGEgPSBDUFVfVFJBQ0VfREFUQSAoY3B1KTsKKyAgaW50IGxhc3RfaW5wdXQ7CisKKyAgLyogQXBwZW5kIGFueSByZXN1bHRzIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0cyAqLworICBsYXN0X2lucHV0ID0gVFJBQ0VfSU5QVVRfSURYIChkYXRhKTsKKyAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X2Jvb2wsIHNpemVvZiAocjApLCAmcjApOworCisgIHRyYWNlX3Jlc3VsdHMgKHNkLCBjcHUsIHRyYWNlX2lkeCwgbGFzdF9pbnB1dCk7Cit9CSAgICAgIAorCit2b2lkCit0cmFjZV9yZXN1bHRfYWRkcjEgKFNJTV9ERVNDIHNkLAorCQkgICAgc2ltX2NwdSAqY3B1LAorCQkgICAgaW50IHRyYWNlX2lkeCwKKwkJICAgIGFkZHJlc3Nfd29yZCByMCkKK3sKKyAgVFJBQ0VfREFUQSAqZGF0YSA9IENQVV9UUkFDRV9EQVRBIChjcHUpOworICBpbnQgbGFzdF9pbnB1dDsKKworICAvKiBBcHBlbmQgYW55IHJlc3VsdHMgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXRzICovCisgIGxhc3RfaW5wdXQgPSBUUkFDRV9JTlBVVF9JRFggKGRhdGEpOworICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfYWRkciwgc2l6ZW9mIChyMCksICZyMCk7CisKKyAgdHJhY2VfcmVzdWx0cyAoc2QsIGNwdSwgdHJhY2VfaWR4LCBsYXN0X2lucHV0KTsKK30JICAgICAgCisKK3ZvaWQKK3RyYWNlX3Jlc3VsdF9mcDEgKFNJTV9ERVNDIHNkLAorCQkgIHNpbV9jcHUgKmNwdSwKKwkJICBpbnQgdHJhY2VfaWR4LAorCQkgIGZwX3dvcmQgZjApCit7CisgIFRSQUNFX0RBVEEgKmRhdGEgPSBDUFVfVFJBQ0VfREFUQSAoY3B1KTsKKyAgaW50IGxhc3RfaW5wdXQ7CisKKyAgLyogQXBwZW5kIGFueSByZXN1bHRzIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0cyAqLworICBsYXN0X2lucHV0ID0gVFJBQ0VfSU5QVVRfSURYIChkYXRhKTsKKyAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X2ZwLCBzaXplb2YgKGZwX3dvcmQpLCAmZjApOworCisgIHRyYWNlX3Jlc3VsdHMgKHNkLCBjcHUsIHRyYWNlX2lkeCwgbGFzdF9pbnB1dCk7Cit9CSAgICAgIAorCit2b2lkCit0cmFjZV9yZXN1bHRfZnAyIChTSU1fREVTQyBzZCwKKwkJICBzaW1fY3B1ICpjcHUsCisJCSAgaW50IHRyYWNlX2lkeCwKKwkJICBmcF93b3JkIGYwLAorCQkgIGZwX3dvcmQgZjEpCit7CisgIFRSQUNFX0RBVEEgKmRhdGEgPSBDUFVfVFJBQ0VfREFUQSAoY3B1KTsKKyAgaW50IGxhc3RfaW5wdXQ7CisKKyAgLyogQXBwZW5kIGFueSByZXN1bHRzIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0cyAqLworICBsYXN0X2lucHV0ID0gVFJBQ0VfSU5QVVRfSURYIChkYXRhKTsKKyAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X2ZwLCBzaXplb2YgKGYwKSwgJmYwKTsKKyAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X2ZwLCBzaXplb2YgKGYxKSwgJmYxKTsKKworICB0cmFjZV9yZXN1bHRzIChzZCwgY3B1LCB0cmFjZV9pZHgsIGxhc3RfaW5wdXQpOworfQkgICAgICAKKwordm9pZAordHJhY2VfcmVzdWx0X2ZwdTEgKFNJTV9ERVNDIHNkLAorCQkgICBzaW1fY3B1ICpjcHUsCisJCSAgIGludCB0cmFjZV9pZHgsCisJCSAgIHNpbV9mcHUgKmYwKQoreworICBkb3VibGUgZDsKKyAgVFJBQ0VfREFUQSAqZGF0YSA9IENQVV9UUkFDRV9EQVRBIChjcHUpOworICBpbnQgbGFzdF9pbnB1dDsKKworICAvKiBBcHBlbmQgYW55IHJlc3VsdHMgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXRzICovCisgIGxhc3RfaW5wdXQgPSBUUkFDRV9JTlBVVF9JRFggKGRhdGEpOworICBkID0gc2ltX2ZwdV8yZCAoZjApOworICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfZnAsIHNpemVvZiAoZG91YmxlKSwgJmQpOworCisgIHRyYWNlX3Jlc3VsdHMgKHNkLCBjcHUsIHRyYWNlX2lkeCwgbGFzdF9pbnB1dCk7Cit9CSAgICAgIAorCit2b2lkCit0cmFjZV9yZXN1bHRfc3RyaW5nMSAoU0lNX0RFU0Mgc2QsCisJCSAgICAgIHNpbV9jcHUgKmNwdSwKKwkJICAgICAgaW50IHRyYWNlX2lkeCwKKwkJICAgICAgY2hhciAqczApCit7CisgIFRSQUNFX0RBVEEgKmRhdGEgPSBDUFVfVFJBQ0VfREFUQSAoY3B1KTsKKyAgaW50IGxhc3RfaW5wdXQ7CisKKyAgLyogQXBwZW5kIGFueSByZXN1bHRzIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0cyAqLworICBsYXN0X2lucHV0ID0gVFJBQ0VfSU5QVVRfSURYIChkYXRhKTsKKyAgc2F2ZV9kYXRhIChzZCwgZGF0YSwgdHJhY2VfZm10X3N0cmluZywgc3RybGVuIChzMCkgKyAxLCBzMCk7CisKKyAgdHJhY2VfcmVzdWx0cyAoc2QsIGNwdSwgdHJhY2VfaWR4LCBsYXN0X2lucHV0KTsKK30JICAgICAgCisKK3ZvaWQKK3RyYWNlX3Jlc3VsdF93b3JkMV9zdHJpbmcxIChTSU1fREVTQyBzZCwKKwkJCSAgICBzaW1fY3B1ICpjcHUsCisJCQkgICAgaW50IHRyYWNlX2lkeCwKKwkJCSAgICB1bnNpZ25lZF93b3JkIHIwLAorCQkJICAgIGNoYXIgKnMwKQoreworICBUUkFDRV9EQVRBICpkYXRhID0gQ1BVX1RSQUNFX0RBVEEgKGNwdSk7CisgIGludCBsYXN0X2lucHV0OworCisgIC8qIEFwcGVuZCBhbnkgcmVzdWx0cyB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dHMgKi8KKyAgbGFzdF9pbnB1dCA9IFRSQUNFX0lOUFVUX0lEWCAoZGF0YSk7CisgIHNhdmVfZGF0YSAoc2QsIGRhdGEsIHRyYWNlX2ZtdF93b3JkLCBzaXplb2YgKHVuc2lnbmVkX3dvcmQpLCAmcjApOworICBzYXZlX2RhdGEgKHNkLCBkYXRhLCB0cmFjZV9mbXRfc3RyaW5nLCBzdHJsZW4gKHMwKSArIDEsIHMwKTsKKworICB0cmFjZV9yZXN1bHRzIChzZCwgY3B1LCB0cmFjZV9pZHgsIGxhc3RfaW5wdXQpOworfQkgICAgICAKKwwKK3ZvaWQKK3RyYWNlX3ZwcmludGYgKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKyAgaWYgKGNwdSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChUUkFDRV9GSUxFIChDUFVfVFJBQ0VfREFUQSAoY3B1KSkgIT0gTlVMTCkKKwl2ZnByaW50ZiAoVFJBQ0VfRklMRSAoQ1BVX1RSQUNFX0RBVEEgKGNwdSkpLCBmbXQsIGFwKTsKKyAgICAgIGVsc2UKKwlzaW1faW9fZXZwcmludGYgKHNkLCBmbXQsIGFwKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoVFJBQ0VfRklMRSAoU1RBVEVfVFJBQ0VfREFUQSAoc2QpKSAhPSBOVUxMKQorCXZmcHJpbnRmIChUUkFDRV9GSUxFIChTVEFURV9UUkFDRV9EQVRBIChzZCkpLCBmbXQsIGFwKTsKKyAgICAgIGVsc2UKKwlzaW1faW9fZXZwcmludGYgKHNkLCBmbXQsIGFwKTsKKyAgICB9Cit9CisKKy8qIFRoZSBmdW5jdGlvbiB0cmFjZV9vbmVfaW5zbiBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgZnVuY3Rpb24gcGFpcgorICAgdHJhY2VfcHJlZml4KCkgKyB0cmFjZV9nZW5lcmljKCkuICBJdCBpcyBzdGlsbCB1c2VkLiAqLwordm9pZAordHJhY2Vfb25lX2luc24gKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGFkZHJlc3Nfd29yZCBwYywKKwkJaW50IGxpbmVfcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbnVtLAorCQljb25zdCBjaGFyICpwaGFzZV93b19jb2xvbiwgY29uc3QgY2hhciAqZm10LAorCQkuLi4pCit7CisgIHZhX2xpc3QgYXA7CisgIGNoYXIgcGhhc2VbU0laRV9QSEFTRSsyXTsKKworICBzdHJuY3B5IChwaGFzZSwgcGhhc2Vfd29fY29sb24sIFNJWkVfUEhBU0UpOworICBzdHJjYXQgKHBoYXNlLCAiOiIpOworCisgIGlmICghbGluZV9wKQorICAgIHsKKyAgICAgIHRyYWNlX3ByaW50ZiAoc2QsIGNwdSwgIiUtKnMgJXM6JS0qZCAweCUuKmx4ICIsCisJCSAgICBTSVpFX1BIQVNFKzEsIHBoYXNlLAorCQkgICAgZmlsZW5hbWUsCisJCSAgICBTSVpFX0xJTkVfTlVNQkVSLCBsaW5lbnVtLAorCQkgICAgU0laRV9QQywgKGxvbmcpcGMpOworICAgICAgdmFfc3RhcnQgKGFwLCBmbXQpOworICAgICAgdHJhY2VfdnByaW50ZiAoc2QsIGNwdSwgZm10LCBhcCk7CisgICAgICB2YV9lbmQgKGFwKTsKKyAgICAgIHRyYWNlX3ByaW50ZiAoc2QsIGNwdSwgIlxuIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY2hhciBidWZbMjU2XTsKKworICAgICAgYnVmWzBdID0gMDsKKyAgICAgIGlmIChTVEFURV9URVhUX1NFQ1RJT04gKENQVV9TVEFURSAoY3B1KSkKKwkgICYmIHBjID49IFNUQVRFX1RFWFRfU1RBUlQgKENQVV9TVEFURSAoY3B1KSkKKwkgICYmIHBjIDwgU1RBVEVfVEVYVF9FTkQgKENQVV9TVEFURSAoY3B1KSkpCisJeworCSAgY29uc3QgY2hhciAqcGNfZmlsZW5hbWUgPSAoY29uc3QgY2hhciAqKTA7CisJICBjb25zdCBjaGFyICpwY19mdW5jdGlvbiA9IChjb25zdCBjaGFyICopMDsKKwkgIHVuc2lnbmVkIGludCBwY19saW5lbnVtID0gMDsKKworCSAgaWYgKGJmZF9maW5kX25lYXJlc3RfbGluZSAoU1RBVEVfUFJPR19CRkQgKENQVV9TVEFURSAoY3B1KSksCisJCQkJICAgICBTVEFURV9URVhUX1NFQ1RJT04gKENQVV9TVEFURSAoY3B1KSksCisJCQkJICAgICAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikgMCwKKwkJCQkgICAgIHBjIC0gU1RBVEVfVEVYVF9TVEFSVCAoQ1BVX1NUQVRFIChjcHUpKSwKKwkJCQkgICAgICZwY19maWxlbmFtZSwgJnBjX2Z1bmN0aW9uLCAmcGNfbGluZW51bSkpCisJICAgIHsKKwkgICAgICBjaGFyICpwID0gYnVmOworCSAgICAgIGlmIChwY19saW5lbnVtKQorCQl7CisJCSAgc3ByaW50ZiAocCwgIiMlLSpkICIsIFNJWkVfTElORV9OVU1CRVIsIHBjX2xpbmVudW0pOworCQkgIHAgKz0gc3RybGVuIChwKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHNwcmludGYgKHAsICIlLSpzICIsIFNJWkVfTElORV9OVU1CRVIrMSwgIi0tLSIpOworCQkgIHAgKz0gU0laRV9MSU5FX05VTUJFUisyOworCQl9CisKKwkgICAgICBpZiAocGNfZnVuY3Rpb24pCisJCXsKKwkJICBzcHJpbnRmIChwLCAiJXMgIiwgcGNfZnVuY3Rpb24pOworCQkgIHAgKz0gc3RybGVuIChwKTsKKwkJfQorCSAgICAgIGVsc2UgaWYgKHBjX2ZpbGVuYW1lKQorCQl7CisJCSAgY2hhciAqcSA9IChjaGFyICopIHN0cnJjaHIgKHBjX2ZpbGVuYW1lLCAnLycpOworCQkgIHNwcmludGYgKHAsICIlcyAiLCAocSkgPyBxKzEgOiBwY19maWxlbmFtZSk7CisJCSAgcCArPSBzdHJsZW4gKHApOworCQl9CisKKwkgICAgICBpZiAoKnAgPT0gJyAnKQorCQkqcCA9ICdcMCc7CisJICAgIH0KKwl9CisKKyAgICAgIHRyYWNlX3ByaW50ZiAoc2QsIGNwdSwgIiUtKnMgMHglLip4ICUtKi4qcyAiLAorCQkgICAgU0laRV9QSEFTRSsxLCBwaGFzZSwKKwkJICAgIFNJWkVfUEMsICh1bnNpZ25lZCkgcGMsCisJCSAgICBTSVpFX0xPQ0FUSU9OLCBTSVpFX0xPQ0FUSU9OLCBidWYpOworICAgICAgdmFfc3RhcnQgKGFwLCBmbXQpOworICAgICAgdHJhY2VfdnByaW50ZiAoc2QsIGNwdSwgZm10LCBhcCk7CisgICAgICB2YV9lbmQgKGFwKTsKKyAgICAgIHRyYWNlX3ByaW50ZiAoc2QsIGNwdSwgIlxuIik7CisgICAgfQorfQorCit2b2lkCit0cmFjZV9wcmludGYgVlBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSkKK3sKKyNpZiAhZGVmaW5lZCBfX1NURENfXyAmJiAhZGVmaW5lZCBBTE1PU1RfU1REQworICBTSU1fREVTQyBzZDsKKyAgc2ltX2NwdSAqY3B1OworICBjb25zdCBjaGFyICpmbXQ7CisjZW5kaWYKKyAgdmFfbGlzdCBhcDsKKworICBWQV9TVEFSVCAoYXAsIGZtdCk7CisjaWYgIWRlZmluZWQgX19TVERDX18gJiYgIWRlZmluZWQgQUxNT1NUX1NUREMKKyAgc2QgPSB2YV9hcmcgKGFwLCBTSU1fREVTQyk7CisgIGNwdSA9IHZhX2FyZyAoYXAsIHNpbV9jcHUgKik7CisgIGZtdCA9IHZhX2FyZyAoYXAsIGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKworICB0cmFjZV92cHJpbnRmIChzZCwgY3B1LCBmbXQsIGFwKTsKKworICB2YV9lbmQgKGFwKTsKK30KKwordm9pZAorZGVidWdfcHJpbnRmIFZQQVJBTVMgKChzaW1fY3B1ICpjcHUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSkKK3sKKyNpZiAhZGVmaW5lZCBfX1NURENfXyAmJiAhZGVmaW5lZCBBTE1PU1RfU1REQworICBzaW1fY3B1ICpjcHU7CisgIGNvbnN0IGNoYXIgKmZtdDsKKyNlbmRpZgorICB2YV9saXN0IGFwOworCisgIFZBX1NUQVJUIChhcCwgZm10KTsKKyNpZiAhZGVmaW5lZCBfX1NURENfXyAmJiAhZGVmaW5lZCBBTE1PU1RfU1REQworICBjcHUgPSB2YV9hcmcgKGFwLCBzaW1fY3B1ICopOworICBmbXQgPSB2YV9hcmcgKGFwLCBjb25zdCBjaGFyICopOworI2VuZGlmCisKKyAgaWYgKENQVV9ERUJVR19GSUxFIChjcHUpID09IE5VTEwpCisgICAgKCogU1RBVEVfQ0FMTEJBQ0sgKENQVV9TVEFURSAoY3B1KSktPmV2cHJpbnRmX2ZpbHRlcmVkKQorICAgICAgKFNUQVRFX0NBTExCQUNLIChDUFVfU1RBVEUgKGNwdSkpLCBmbXQsIGFwKTsKKyAgZWxzZQorICAgIHZmcHJpbnRmIChDUFVfREVCVUdfRklMRSAoY3B1KSwgZm10LCBhcCk7CisKKyAgdmFfZW5kIChhcCk7Cit9CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS10cmFjZS5oIGIvc2ltL2NvbW1vbi9zaW0tdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGQyNzdlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tdHJhY2UuaApAQCAtMCwwICsxLDU1MSBAQAorLyogU2ltdWxhdG9yIHRyYWNpbmcvZGVidWdnaW5nIHN1cHBvcnQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIGZpbGUgaXMgbWVhbnQgdG8gYmUgaW5jbHVkZWQgYnkgc2ltLWJhc2ljcy5oLiAgKi8KKworI2lmbmRlZiBTSU1fVFJBQ0VfSAorI2RlZmluZSBTSU1fVFJBQ0VfSAorCisvKiBTdGFuZGFyZCB0cmFjZWFibGUgZW50aXRpZXMuICAqLworCitlbnVtIHsKKyAgLyogVHJhY2UgaW5zbiBleGVjdXRpb24uICAqLworICBUUkFDRV9JTlNOX0lEWCA9IDEsCisKKyAgLyogVHJhY2UgaW5zbiBkZWNvZGluZy4KKyAgICAgPz8/IFRoaXMgaXMgbW9yZSBvZiBhIHNpbXVsYXRvciBkZWJ1Z2dpbmcgb3BlcmF0aW9uIGFuZCBtaWdodCBiZXN0IGJlCisgICAgIG1vdmVkIHRvIC0tZGVidWctZGVjb2RlLiAgKi8KKyAgVFJBQ0VfREVDT0RFX0lEWCwKKworICAvKiBUcmFjZSBpbnNuIGV4dHJhY3Rpb24uCisgICAgID8/PyBUaGlzIGlzIG1vcmUgb2YgYSBzaW11bGF0b3IgZGVidWdnaW5nIG9wZXJhdGlvbiBhbmQgbWlnaHQgYmVzdCBiZQorICAgICBtb3ZlZCB0byAtLWRlYnVnLWV4dHJhY3QuICAqLworICBUUkFDRV9FWFRSQUNUX0lEWCwKKworICAvKiBUcmFjZSBpbnNuIGV4ZWN1dGlvbiBidXQgaW5jbHVkZSBsaW5lIG51bWJlcnMuICAqLworICBUUkFDRV9MSU5FTlVNX0lEWCwKKworICAvKiBUcmFjZSBtZW1vcnkgb3BlcmF0aW9ucy4KKyAgICAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCBUUkFDRV9DT1JFX0lEWCBpcyAoSSB0aGluaykgdGhhdCB0aGlzCisgICAgIGlzIGludGVuZGVkIHRvIGFwcGx5IHRvIGEgaGlnaGVyIGxldmVsLiAgVFJBQ0VfQ09SRV9JRFggYXBwbGllcyB0byB0aGUKKyAgICAgbG93IGxldmVsIGNvcmUgb3BlcmF0aW9ucy4gICovCisgIFRSQUNFX01FTU9SWV9JRFgsCisKKyAgLyogSW5jbHVkZSBtb2RlbCBwZXJmb3JtYW5jZSBkYXRhIGluIHRyYWNpbmcgb3V0cHV0LiAgKi8KKyAgVFJBQ0VfTU9ERUxfSURYLAorCisgIC8qIFRyYWNlIEFMVSBvcGVyYXRpb25zLiAgKi8KKyAgVFJBQ0VfQUxVX0lEWCwKKworICAvKiBUcmFjZSBtZW1vcnkgY29yZSBvcGVyYXRpb25zLiAgKi8KKyAgVFJBQ0VfQ09SRV9JRFgsCisKKyAgLyogVHJhY2UgZXZlbnRzLiAgKi8KKyAgVFJBQ0VfRVZFTlRTX0lEWCwKKworICAvKiBUcmFjZSBmcHUgb3BlcmF0aW9ucy4gICovCisgIFRSQUNFX0ZQVV9JRFgsCisKKyAgLyogVHJhY2UgYnJhbmNoaW5nLiAgKi8KKyAgVFJBQ0VfQlJBTkNIX0lEWCwKKworICAvKiBBZGQgaW5mb3JtYXRpb24gdXNlZnVsIGZvciBkZWJ1Z2dpbmcgdGhlIHNpbXVsYXRvciB0byB0cmFjZSBvdXRwdXQuICAqLworICBUUkFDRV9ERUJVR19JRFgsCisKKyAgLyogU2ltdWxhdG9yIHNwZWNpZmljIHRyYWNlIGJpdHMgYmVnaW4gaGVyZS4gICovCisgIFRSQUNFX05FWFRfSURYLAorCit9OworLyogTWF4aW11bSBudW1iZXIgb2YgdHJhY2VhYmxlIGVudGl0aWVzLiAgKi8KKyNpZm5kZWYgTUFYX1RSQUNFX1ZBTFVFUworI2RlZmluZSBNQVhfVFJBQ0VfVkFMVUVTIDMyCisjZW5kaWYKKworLyogVGhlIC10IG9wdGlvbiBvbmx5IHByaW50cyB1c2VmdWwgdmFsdWVzLiAgSXQncyBlYXN5IHRvIHR5cGUgYW5kIHNob3VsZG4ndAorICAgc3BsYXQgb24gdGhlIHNjcmVlbiBldmVyeXRoaW5nIHVuZGVyIHRoZSBzdW4gbWFraW5nIG5vdGhpbmcgZWFzeSB0bworICAgZmluZC4gICovCisjZGVmaW5lIFRSQUNFX1VTRUZVTF9NQVNLIFwKKygoMSA8PCBUUkFDRV9JTlNOX0lEWCkgXAorIHwgKDEgPDwgVFJBQ0VfTElORU5VTV9JRFgpIFwKKyB8ICgxIDw8IFRSQUNFX01FTU9SWV9JRFgpIFwKKyB8ICgxIDw8IFRSQUNFX01PREVMX0lEWCkgXAorIHwgKDEgPDwgVFJBQ0VfRVZFTlRTX0lEWCkpCisMCisvKiBNYXNrcyBzbyBXSVRIX1RSQUNFIGNhbiBoYXZlIHN5bWJvbGljIHZhbHVlcy4KKyAgIFRoZSBjYXNlIGNob2ljZSBoZXJlIGlzIG9uIHB1cnBvc2UuICBUaGUgbG93ZXJjYXNlIHBhcnRzIGFyZSBhcmdzIHRvCisgICAtLXdpdGgtdHJhY2UuICAqLworI2RlZmluZSBUUkFDRV9pbnNuICAgICAoMSA8PCBUUkFDRV9JTlNOX0lEWCkKKyNkZWZpbmUgVFJBQ0VfZGVjb2RlICAgKDEgPDwgVFJBQ0VfREVDT0RFX0lEWCkKKyNkZWZpbmUgVFJBQ0VfZXh0cmFjdCAgKDEgPDwgVFJBQ0VfRVhUUkFDVF9JRFgpCisjZGVmaW5lIFRSQUNFX2xpbmVudW0gICgxIDw8IFRSQUNFX0xJTkVOVU1fSURYKQorI2RlZmluZSBUUkFDRV9tZW1vcnkgICAoMSA8PCBUUkFDRV9NRU1PUllfSURYKQorI2RlZmluZSBUUkFDRV9tb2RlbCAgICAoMSA8PCBUUkFDRV9NT0RFTF9JRFgpCisjZGVmaW5lIFRSQUNFX2FsdSAgICAgICgxIDw8IFRSQUNFX0FMVV9JRFgpCisjZGVmaW5lIFRSQUNFX2NvcmUgICAgICgxIDw8IFRSQUNFX0NPUkVfSURYKQorI2RlZmluZSBUUkFDRV9ldmVudHMgICAoMSA8PCBUUkFDRV9FVkVOVFNfSURYKQorI2RlZmluZSBUUkFDRV9mcHUgICAgICAoMSA8PCBUUkFDRV9GUFVfSURYKQorI2RlZmluZSBUUkFDRV9icmFuY2ggICAoMSA8PCBUUkFDRV9CUkFOQ0hfSURYKQorI2RlZmluZSBUUkFDRV9kZWJ1ZyAgICAoMSA8PCBUUkFDRV9ERUJVR19JRFgpCisKKy8qIFByZXByb2Nlc3NvciBtYWNyb3MgdG8gc2ltcGxpZnkgdGVzdHMgb2YgV0lUSF9UUkFDRS4gICovCisjZGVmaW5lIFdJVEhfVFJBQ0VfSU5TTl9QCShXSVRIX1RSQUNFICYgVFJBQ0VfaW5zbikKKyNkZWZpbmUgV0lUSF9UUkFDRV9ERUNPREVfUAkoV0lUSF9UUkFDRSAmIFRSQUNFX2RlY29kZSkKKyNkZWZpbmUgV0lUSF9UUkFDRV9FWFRSQUNUX1AJKFdJVEhfVFJBQ0UgJiBUUkFDRV9leHRyYWN0KQorI2RlZmluZSBXSVRIX1RSQUNFX0xJTkVOVU1fUAkoV0lUSF9UUkFDRSAmIFRSQUNFX2xpbmVudW0pCisjZGVmaW5lIFdJVEhfVFJBQ0VfTUVNT1JZX1AJKFdJVEhfVFJBQ0UgJiBUUkFDRV9tZW1vcnkpCisjZGVmaW5lIFdJVEhfVFJBQ0VfTU9ERUxfUAkoV0lUSF9UUkFDRSAmIFRSQUNFX21vZGVsKQorI2RlZmluZSBXSVRIX1RSQUNFX0FMVV9QCShXSVRIX1RSQUNFICYgVFJBQ0VfYWx1KQorI2RlZmluZSBXSVRIX1RSQUNFX0NPUkVfUAkoV0lUSF9UUkFDRSAmIFRSQUNFX2NvcmUpCisjZGVmaW5lIFdJVEhfVFJBQ0VfRVZFTlRTX1AJKFdJVEhfVFJBQ0UgJiBUUkFDRV9ldmVudHMpCisjZGVmaW5lIFdJVEhfVFJBQ0VfRlBVX1AJKFdJVEhfVFJBQ0UgJiBUUkFDRV9mcHUpCisjZGVmaW5lIFdJVEhfVFJBQ0VfQlJBTkNIX1AJKFdJVEhfVFJBQ0UgJiBUUkFDRV9icmFuY2gpCisjZGVmaW5lIFdJVEhfVFJBQ0VfREVCVUdfUAkoV0lUSF9UUkFDRSAmIFRSQUNFX2RlYnVnKQorCisvKiBUcmFjaW5nIGluc3RhbGwgaGFuZGxlci4gICovCitNT0RVTEVfSU5TVEFMTF9GTiB0cmFjZV9pbnN0YWxsOworDAorLyogU3RydWN0IGNvbnRhaW5pbmcgYWxsIHN5c3RlbSBhbmQgY3B1IHRyYWNlIGRhdGEuCisKKyAgIFN5c3RlbSB0cmFjZSBkYXRhIGlzIHN0b3JlZCB3aXRoIHRoZSBhc3NvY2lhdGVkIG1vZHVsZS4KKyAgIFN5c3RlbSBhbmQgY3B1IHRyYWNpbmcgbXVzdCBzaGFyZSB0aGUgc2FtZSBzcGFjZSBvZiBiaXRtYXNrcyBhcyB0aGV5CisgICBhcmUgYXJndW1lbnRzIHRvIC0td2l0aC10cmFjZS4gIE9uZSBjb3VsZCBoYXZlIC0td2l0aC10cmFjZSBhbmQKKyAgIC0td2l0aC1jcHUtdHJhY2Ugb3Igc29tZSBzdWNoIGJ1dCB0aGF0J3MgYW4gb3Zlci1jb21wbGljYXRpb24gYXQgdGhpcyBwb2ludAorICAgaW4gdGltZS4gIEFsc28sIHRoZXJlIG1heSBiZSBvY2Nhc2lvbnMgd2hlcmUgc3lzdGVtIGFuZCBjcHUgdHJhY2luZyBtYXkKKyAgIHdpc2ggdG8gc2hhcmUgYSBuYW1lLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3RyYWNlX2RhdGEgeworCisgIC8qIEdsb2JhbCBzdW1tYXJ5IG9mIGFsbCB0aGUgY3VycmVudCB0cmFjZSBvcHRpb25zICovCisgIGNoYXIgdHJhY2VfYW55X3A7CisKKyAgLyogQm9vbGVhbiBhcnJheSBvZiBzcGVjaWZpZWQgdHJhY2luZyBmbGFncy4gICovCisgIC8qID8/PyBJdCdzIG5vdCBjbGVhciB0aGF0IHVzaW5nIGFuIGFycmF5IHZzIGEgYml0IG1hc2sgaXMgZmFzdGVyLgorICAgICBDb25zaWRlciB0aGUgY2FzZSB3aGVyZSBvbmUgd2FudHMgdG8gdGVzdCB3aGV0aGVyIGFueSBvZiBzZXZlcmFsIGJpdHMKKyAgICAgYXJlIHNldC4gICovCisgIGNoYXIgdHJhY2VfZmxhZ3NbTUFYX1RSQUNFX1ZBTFVFU107CisjZGVmaW5lIFRSQUNFX0ZMQUdTKHQpICgodCktPnRyYWNlX2ZsYWdzKQorCisgIC8qIFRyYWNpbmcgb3V0cHV0IGdvZXMgdG8gdGhpcyBvciBzdGRlcnIgaWYgTlVMTC4KKyAgICAgV2UgY2FuJ3Qgc3RvcmUgYHN0ZGVycicgaGVyZSBhcyBzdGRlcnIgZ29lcyB0aHJvdWdoIGEgY2FsbGJhY2suICAqLworICBGSUxFICp0cmFjZV9maWxlOworI2RlZmluZSBUUkFDRV9GSUxFKHQpICgodCktPnRyYWNlX2ZpbGUpCisKKyAgLyogQnVmZmVyIHRvIHN0b3JlIHRoZSBwcmVmaXggdG8gYmUgcHJpbnRlZCBiZWZvcmUgYW55IHRyYWNlIGxpbmUuICAqLworICBjaGFyIHRyYWNlX3ByZWZpeFsyNTZdOworI2RlZmluZSBUUkFDRV9QUkVGSVgodCkgKCh0KS0+dHJhY2VfcHJlZml4KQorCisgIC8qIEJ1ZmZlciB0byBzYXZlIHRoZSBpbnB1dHMgZm9yIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLiAgVXNlIGEKKyAgICAgdW5pb24gdG8gZm9yY2UgdGhlIGJ1ZmZlciBpbnRvIGNvcnJlY3QgYWxpZ25tZW50ICovCisgIHVuaW9uIHsKKyAgICB1bnNpZ25lZDggaTg7CisgICAgdW5zaWduZWQxNiBpMTY7CisgICAgdW5zaWduZWQzMiBpMzI7CisgICAgdW5zaWduZWQ2NCBpNjQ7CisgIH0gdHJhY2VfaW5wdXRfZGF0YVsxNl07CisgIHVuc2lnbmVkOCB0cmFjZV9pbnB1dF9mbXRbMTZdOworICB1bnNpZ25lZDggdHJhY2VfaW5wdXRfc2l6ZVsxNl07CisgIGludCB0cmFjZV9pbnB1dF9pZHg7CisjZGVmaW5lIFRSQUNFX0lOUFVUX0RBVEEodCkgKCh0KS0+dHJhY2VfaW5wdXRfZGF0YSkKKyNkZWZpbmUgVFJBQ0VfSU5QVVRfRk1UKHQpICgodCktPnRyYWNlX2lucHV0X2ZtdCkKKyNkZWZpbmUgVFJBQ0VfSU5QVVRfU0laRSh0KSAoKHQpLT50cmFjZV9pbnB1dF9zaXplKQorI2RlZmluZSBUUkFDRV9JTlBVVF9JRFgodCkgKCh0KS0+dHJhY2VfaW5wdXRfaWR4KQorCisgIC8qIENhdGVnb3J5IG9mIHRyYWNlIGJlaW5nIHBlcmZvcm1lZCAqLworICBpbnQgdHJhY2VfaWR4OworI2RlZmluZSBUUkFDRV9JRFgodCkgKCh0KS0+dHJhY2VfaWR4KQorCisgIC8qIFRyYWNlIHJhbmdlLgorICAgICA/Pz8gTm90IGFsbCBjcHUncyBzdXBwb3J0IHRoaXMuICAqLworICBBRERSX1JBTkdFIHJhbmdlOworI2RlZmluZSBUUkFDRV9SQU5HRSh0KSAoJiAodCktPnJhbmdlKQorfSBUUkFDRV9EQVRBOworDAorLyogU3lzdGVtIHRyYWNpbmcgc3VwcG9ydC4gICovCisKKyNkZWZpbmUgU1RBVEVfVFJBQ0VfRkxBR1Moc2QpIFRSQUNFX0ZMQUdTIChTVEFURV9UUkFDRV9EQVRBIChzZCkpCisKKy8qIFJldHVybiBub24temVybyBpZiB0cmFjaW5nIG9mIElEWCBpcyBlbmFibGVkIGZvciBub24tY3B1IHNwZWNpZmljCisgICBjb21wb25lbnRzLiAgVGhlICJTIiBpbiAiU1RSQUNFIiByZWZlcnMgdG8gIlN5c3RlbSIuICAqLworI2RlZmluZSBTVFJBQ0VfUChzZCxpZHgpIFwKKygoV0lUSF9UUkFDRSAmICgxIDw8IChpZHgpKSkgIT0gMCBcCisgJiYgU1RBVEVfVFJBQ0VfRkxBR1MgKHNkKVtpZHhdICE9IDApCisKKy8qIE5vbi16ZXJvIGlmIC0tdHJhY2UtPHh4eHg+IHdhcyBzcGVjaWZpZWQgZm9yIFNELiAgKi8KKyNkZWZpbmUgU1RSQUNFX0RFQlVHX1Aoc2QpCVNUUkFDRV9QIChzZCwgVFJBQ0VfREVCVUdfSURYKQorDAorLyogQ1BVIHRyYWNpbmcgc3VwcG9ydC4gICovCisKKyNkZWZpbmUgQ1BVX1RSQUNFX0ZMQUdTKGNwdSkgVFJBQ0VfRkxBR1MgKENQVV9UUkFDRV9EQVRBIChjcHUpKQorCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgdHJhY2luZyBvZiBJRFggaXMgZW5hYmxlZCBmb3IgQ1BVLiAgKi8KKyNkZWZpbmUgVFJBQ0VfUChjcHUsaWR4KSBcCisoKFdJVEhfVFJBQ0UgJiAoMSA8PCAoaWR4KSkpICE9IDAgXAorICYmIENQVV9UUkFDRV9GTEFHUyAoY3B1KVtpZHhdICE9IDApCisKKy8qIE5vbi16ZXJvIGlmIC0tdHJhY2UtPHh4eHg+IHdhcyBzcGVjaWZpZWQgZm9yIENQVS4gICovCisjZGVmaW5lIFRSQUNFX0FOWV9QKGNwdSkJKChXSVRIX1RSQUNFKSAmJiAoQ1BVX1RSQUNFX0RBVEEgKGNwdSktPnRyYWNlX2FueV9wKSkKKyNkZWZpbmUgVFJBQ0VfSU5TTl9QKGNwdSkJVFJBQ0VfUCAoY3B1LCBUUkFDRV9JTlNOX0lEWCkKKyNkZWZpbmUgVFJBQ0VfREVDT0RFX1AoY3B1KQlUUkFDRV9QIChjcHUsIFRSQUNFX0RFQ09ERV9JRFgpCisjZGVmaW5lIFRSQUNFX0VYVFJBQ1RfUChjcHUpCVRSQUNFX1AgKGNwdSwgVFJBQ0VfRVhUUkFDVF9JRFgpCisjZGVmaW5lIFRSQUNFX0xJTkVOVU1fUChjcHUpCVRSQUNFX1AgKGNwdSwgVFJBQ0VfTElORU5VTV9JRFgpCisjZGVmaW5lIFRSQUNFX01FTU9SWV9QKGNwdSkJVFJBQ0VfUCAoY3B1LCBUUkFDRV9NRU1PUllfSURYKQorI2RlZmluZSBUUkFDRV9NT0RFTF9QKGNwdSkJVFJBQ0VfUCAoY3B1LCBUUkFDRV9NT0RFTF9JRFgpCisjZGVmaW5lIFRSQUNFX0FMVV9QKGNwdSkJVFJBQ0VfUCAoY3B1LCBUUkFDRV9BTFVfSURYKQorI2RlZmluZSBUUkFDRV9DT1JFX1AoY3B1KQlUUkFDRV9QIChjcHUsIFRSQUNFX0NPUkVfSURYKQorI2RlZmluZSBUUkFDRV9FVkVOVFNfUChjcHUpCVRSQUNFX1AgKGNwdSwgVFJBQ0VfRVZFTlRTX0lEWCkKKyNkZWZpbmUgVFJBQ0VfRlBVX1AoY3B1KQlUUkFDRV9QIChjcHUsIFRSQUNFX0ZQVV9JRFgpCisjZGVmaW5lIFRSQUNFX0JSQU5DSF9QKGNwdSkJVFJBQ0VfUCAoY3B1LCBUUkFDRV9CUkFOQ0hfSURYKQorI2RlZmluZSBUUkFDRV9ERUJVR19QKGNwdSkJVFJBQ0VfUCAoY3B1LCBUUkFDRV9ERUJVR19JRFgpCisMCisvKiBUcmFjZWluZyBmdW5jdGlvbnMuCisKKyAqLworCisvKiBQcmltZSB0aGUgdHJhY2UgYnVmZmVycyByZWFkeSBmb3IgYW55IHRyYWNlIG91dHB1dC4KKyAgIE11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGFueSBvdGhlciB0cmFjZSBvcGVyYXRpb24gKi8KK2V4dGVybiB2b2lkIHRyYWNlX3ByZWZpeCBQQVJBTVMgKChTSU1fREVTQyBzZCwKKwkJCQkgIHNpbV9jcHUgKmNwdSwKKwkJCQkgIHNpbV9jaWEgY2lhLAorCQkJCSAgYWRkcmVzc193b3JkIHBjLAorCQkJCSAgaW50IHByaW50X2xpbmVudW1fcCwKKwkJCQkgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKKwkJCQkgIGludCBsaW5lX25yLAorCQkJCSAgY29uc3QgY2hhciAqZm10LAorCQkJCSAgLi4uKSkKKyAgICAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgOCwgOSkpKTsKKworLyogR2VuZXJpYyB0cmFjZSBwcmludCwgYXNzdW1lcyB0cmFjZV9wcmVmaXgoKSBoYXMgYmVlbiBjYWxsZWQgKi8KKworZXh0ZXJuIHZvaWQgdHJhY2VfZ2VuZXJpYyBQQVJBTVMgKChTSU1fREVTQyBzZCwKKwkJCQkgICBzaW1fY3B1ICpjcHUsCisJCQkJICAgaW50IHRyYWNlX2lkeCwKKwkJCQkgICBjb25zdCBjaGFyICpmbXQsCisJCQkJICAgLi4uKSkKKyAgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDQsIDUpKSk7CisKKy8qIFRyYWNlIGEgdmFyeWluZyBudW1iZXIgb2Ygd29yZCBzaXplZCBpbnB1dHMvb3V0cHV0cy4gIHRyYWNlX3Jlc3VsdCoKKyAgIG11c3QgYmUgY2FsbGVkIHRvIGNsb3NlIHRoZSB0cmFjZSBvcGVyYXRpb24uICovCisKK2V4dGVybiB2b2lkIHRyYWNlX2lucHV0MCBQQVJBTVMgKChTSU1fREVTQyBzZCwKKwkJCQkgIHNpbV9jcHUgKmNwdSwKKwkJCQkgIGludCB0cmFjZV9pZHgpKTsKKworZXh0ZXJuIHZvaWQgdHJhY2VfaW5wdXRfd29yZDEgUEFSQU1TICgoU0lNX0RFU0Mgc2QsCisJCQkJICAgICAgIHNpbV9jcHUgKmNwdSwKKwkJCQkgICAgICAgaW50IHRyYWNlX2lkeCwKKwkJCQkgICAgICAgdW5zaWduZWRfd29yZCBkMCkpOworCitleHRlcm4gdm9pZCB0cmFjZV9pbnB1dF93b3JkMiBQQVJBTVMgKChTSU1fREVTQyBzZCwKKwkJCQkgICAgICAgc2ltX2NwdSAqY3B1LAorCQkJCSAgICAgICBpbnQgdHJhY2VfaWR4LAorCQkJCSAgICAgICB1bnNpZ25lZF93b3JkIGQwLAorCQkJCSAgICAgICB1bnNpZ25lZF93b3JkIGQxKSk7CisKK2V4dGVybiB2b2lkIHRyYWNlX2lucHV0X3dvcmQzIFBBUkFNUyAoKFNJTV9ERVNDIHNkLAorCQkJCSAgICAgICBzaW1fY3B1ICpjcHUsCisJCQkJICAgICAgIGludCB0cmFjZV9pZHgsCisJCQkJICAgICAgIHVuc2lnbmVkX3dvcmQgZDAsCisJCQkJICAgICAgIHVuc2lnbmVkX3dvcmQgZDEsCisJCQkJICAgICAgIHVuc2lnbmVkX3dvcmQgZDIpKTsKKworZXh0ZXJuIHZvaWQgdHJhY2VfaW5wdXRfd29yZDQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsCisJCQkJICAgICAgIHNpbV9jcHUgKmNwdSwKKwkJCQkgICAgICAgaW50IHRyYWNlX2lkeCwKKwkJCQkgICAgICAgdW5zaWduZWRfd29yZCBkMCwKKwkJCQkgICAgICAgdW5zaWduZWRfd29yZCBkMSwKKwkJCQkgICAgICAgdW5zaWduZWRfd29yZCBkMiwKKwkJCQkgICAgICAgdW5zaWduZWRfd29yZCBkMykpOworCitleHRlcm4gdm9pZCB0cmFjZV9pbnB1dF9hZGRyMSBQQVJBTVMgKChTSU1fREVTQyBzZCwKKwkJCQkgICAgICAgc2ltX2NwdSAqY3B1LAorCQkJCSAgICAgICBpbnQgdHJhY2VfaWR4LAorCQkJCSAgICAgICBhZGRyZXNzX3dvcmQgZDApKTsKKworZXh0ZXJuIHZvaWQgdHJhY2VfaW5wdXRfYm9vbDEgUEFSQU1TICgoU0lNX0RFU0Mgc2QsCisJCQkJICAgICAgIHNpbV9jcHUgKmNwdSwKKwkJCQkgICAgICAgaW50IHRyYWNlX2lkeCwKKwkJCQkgICAgICAgaW50IGQwKSk7CisKK2V4dGVybiB2b2lkIHRyYWNlX2lucHV0X2ZwMSBQQVJBTVMgKChTSU1fREVTQyBzZCwKKwkJCQkgICAgIHNpbV9jcHUgKmNwdSwKKwkJCQkgICAgIGludCB0cmFjZV9pZHgsCisJCQkJICAgICBmcF93b3JkIGYwKSk7CisKK2V4dGVybiB2b2lkIHRyYWNlX2lucHV0X2ZwMiBQQVJBTVMgKChTSU1fREVTQyBzZCwKKwkJCQkgICAgIHNpbV9jcHUgKmNwdSwKKwkJCQkgICAgIGludCB0cmFjZV9pZHgsCisJCQkJICAgICBmcF93b3JkIGYwLAorCQkJCSAgICAgZnBfd29yZCBmMSkpOworCitleHRlcm4gdm9pZCB0cmFjZV9pbnB1dF9mcDMgUEFSQU1TICgoU0lNX0RFU0Mgc2QsCisJCQkJICAgICBzaW1fY3B1ICpjcHUsCisJCQkJICAgICBpbnQgdHJhY2VfaWR4LAorCQkJCSAgICAgZnBfd29yZCBmMCwKKwkJCQkgICAgIGZwX3dvcmQgZjEsCisJCQkJICAgICBmcF93b3JkIGYyKSk7CisKK2V4dGVybiB2b2lkIHRyYWNlX2lucHV0X2ZwdTEgUEFSQU1TICgoU0lNX0RFU0Mgc2QsCisJCQkJICAgICBzaW1fY3B1ICpjcHUsCisJCQkJICAgICBpbnQgdHJhY2VfaWR4LAorCQkJCSAgICAgc3RydWN0IF9zaW1fZnB1ICpmMCkpOworCitleHRlcm4gdm9pZCB0cmFjZV9pbnB1dF9mcHUyIFBBUkFNUyAoKFNJTV9ERVNDIHNkLAorCQkJCSAgICAgc2ltX2NwdSAqY3B1LAorCQkJCSAgICAgaW50IHRyYWNlX2lkeCwKKwkJCQkgICAgIHN0cnVjdCBfc2ltX2ZwdSAqZjAsCisJCQkJICAgICBzdHJ1Y3QgX3NpbV9mcHUgKmYxKSk7CisKK2V4dGVybiB2b2lkIHRyYWNlX2lucHV0X2ZwdTMgUEFSQU1TICgoU0lNX0RFU0Mgc2QsCisJCQkJICAgICBzaW1fY3B1ICpjcHUsCisJCQkJICAgICBpbnQgdHJhY2VfaWR4LAorCQkJCSAgICAgc3RydWN0IF9zaW1fZnB1ICpmMCwKKwkJCQkgICAgIHN0cnVjdCBfc2ltX2ZwdSAqZjEsCisJCQkJICAgICBzdHJ1Y3QgX3NpbV9mcHUgKmYyKSk7CisKKy8qIE90aGVyIHRyYWNlX2lucHV0e188Zm10Pjxuci1pbnB1dHM+fSBmdW5jdGlvbnMgY2FuIGdvIGhlcmUgKi8KKworZXh0ZXJuIHZvaWQgdHJhY2VfcmVzdWx0MCBQQVJBTVMgKChTSU1fREVTQyBzZCwKKwkJCQkgICBzaW1fY3B1ICpjcHUsCisJCQkJICAgaW50IHRyYWNlX2lkeCkpOworCitleHRlcm4gdm9pZCB0cmFjZV9yZXN1bHRfd29yZDEgUEFSQU1TICgoU0lNX0RFU0Mgc2QsCisJCQkJCXNpbV9jcHUgKmNwdSwKKwkJCQkJaW50IHRyYWNlX2lkeCwKKwkJCQkJdW5zaWduZWRfd29yZCByMCkpOworCitleHRlcm4gdm9pZCB0cmFjZV9yZXN1bHRfd29yZDIgUEFSQU1TICgoU0lNX0RFU0Mgc2QsCisJCQkJCXNpbV9jcHUgKmNwdSwKKwkJCQkJaW50IHRyYWNlX2lkeCwKKwkJCQkJdW5zaWduZWRfd29yZCByMCwKKwkJCQkJdW5zaWduZWRfd29yZCByMSkpOworCitleHRlcm4gdm9pZCB0cmFjZV9yZXN1bHRfd29yZDQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsCisJCQkJCXNpbV9jcHUgKmNwdSwKKwkJCQkJaW50IHRyYWNlX2lkeCwKKwkJCQkJdW5zaWduZWRfd29yZCByMCwKKwkJCQkJdW5zaWduZWRfd29yZCByMSwKKwkJCQkJdW5zaWduZWRfd29yZCByMiwKKwkJCQkJdW5zaWduZWRfd29yZCByMykpOworCitleHRlcm4gdm9pZCB0cmFjZV9yZXN1bHRfYm9vbDEgUEFSQU1TICgoU0lNX0RFU0Mgc2QsCisJCQkJCXNpbV9jcHUgKmNwdSwKKwkJCQkJaW50IHRyYWNlX2lkeCwKKwkJCQkJaW50IHIwKSk7CisKK2V4dGVybiB2b2lkIHRyYWNlX3Jlc3VsdF9hZGRyMSBQQVJBTVMgKChTSU1fREVTQyBzZCwKKwkJCQkJc2ltX2NwdSAqY3B1LAorCQkJCQlpbnQgdHJhY2VfaWR4LAorCQkJCQlhZGRyZXNzX3dvcmQgcjApKTsKKworZXh0ZXJuIHZvaWQgdHJhY2VfcmVzdWx0X2ZwMSBQQVJBTVMgKChTSU1fREVTQyBzZCwKKwkJCQkgICAgICBzaW1fY3B1ICpjcHUsCisJCQkJICAgICAgaW50IHRyYWNlX2lkeCwKKwkJCQkgICAgICBmcF93b3JkIGYwKSk7CisKK2V4dGVybiB2b2lkIHRyYWNlX3Jlc3VsdF9mcDIgUEFSQU1TICgoU0lNX0RFU0Mgc2QsCisJCQkJICAgICAgc2ltX2NwdSAqY3B1LAorCQkJCSAgICAgIGludCB0cmFjZV9pZHgsCisJCQkJICAgICAgZnBfd29yZCBmMCwKKwkJCQkgICAgICBmcF93b3JkIGYxKSk7CisKK2V4dGVybiB2b2lkIHRyYWNlX3Jlc3VsdF9mcHUxIFBBUkFNUyAoKFNJTV9ERVNDIHNkLAorCQkJCSAgICAgICBzaW1fY3B1ICpjcHUsCisJCQkJICAgICAgIGludCB0cmFjZV9pZHgsCisJCQkJICAgICAgIHN0cnVjdCBfc2ltX2ZwdSAqZjApKTsKKworZXh0ZXJuIHZvaWQgdHJhY2VfcmVzdWx0X3N0cmluZzEgUEFSQU1TICgoU0lNX0RFU0Mgc2QsCisJCQkJCSAgc2ltX2NwdSAqY3B1LAorCQkJCQkgIGludCB0cmFjZV9pZHgsCisJCQkJCSAgY2hhciAqc3RyMCkpOworCitleHRlcm4gdm9pZCB0cmFjZV9yZXN1bHRfd29yZDFfc3RyaW5nMSBQQVJBTVMgKChTSU1fREVTQyBzZCwKKwkJCQkJCXNpbV9jcHUgKmNwdSwKKwkJCQkJCWludCB0cmFjZV9pZHgsCisJCQkJCQl1bnNpZ25lZF93b3JkIHIwLAorCQkJCQkJY2hhciAqczApKTsKKworLyogT3RoZXIgdHJhY2VfcmVzdWx0e188dHlwZT48bnItcmVzdWx0cz59ICovCisKKworLyogTWFjcm8ncyBmb3IgdHJhY2luZyBBTFUgaW5zdHJ1Y3Rpb25zICovCisKKyNkZWZpbmUgVFJBQ0VfQUxVX0lOUFVUMCgpIFwKK2RvIHsgXAorICBpZiAoVFJBQ0VfQUxVX1AgKENQVSkpIFwKKyAgICB0cmFjZV9pbnB1dDAgKFNELCBDUFUsIFRSQUNFX0FMVV9JRFgpOyBcCit9IHdoaWxlICgwKQorICAgIAorI2RlZmluZSBUUkFDRV9BTFVfSU5QVVQxKFYwKSBcCitkbyB7IFwKKyAgaWYgKFRSQUNFX0FMVV9QIChDUFUpKSBcCisgICAgdHJhY2VfaW5wdXRfd29yZDEgKFNELCBDUFUsIFRSQUNFX0FMVV9JRFgsIChWMCkpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFRSQUNFX0FMVV9JTlBVVDIoVjAsVjEpIFwKK2RvIHsgXAorICBpZiAoVFJBQ0VfQUxVX1AgKENQVSkpIFwKKyAgICB0cmFjZV9pbnB1dF93b3JkMiAoU0QsIENQVSwgVFJBQ0VfQUxVX0lEWCwgKFYwKSwgKFYxKSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVFJBQ0VfQUxVX0lOUFVUMyhWMCxWMSxWMikgXAorZG8geyBcCisgIGlmIChUUkFDRV9BTFVfUCAoQ1BVKSkgXAorICAgIHRyYWNlX2lucHV0X3dvcmQzIChTRCwgQ1BVLCBUUkFDRV9BTFVfSURYLCAoVjApLCAoVjEpLCAoVjIpKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUUkFDRV9BTFVfSU5QVVQ0KFYwLFYxLFYyLFYzKSBcCitkbyB7IFwKKyAgaWYgKFRSQUNFX0FMVV9QIChDUFUpKSBcCisgICAgdHJhY2VfaW5wdXRfd29yZDQgKFNELCBDUFUsIFRSQUNFX0FMVV9JRFgsIChWMCksIChWMSksIChWMiksIChWMykpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFRSQUNFX0FMVV9SRVNVTFQoUjApIFRSQUNFX0FMVV9SRVNVTFQxKFIwKQorCisjZGVmaW5lIFRSQUNFX0FMVV9SRVNVTFQwKCkgXAorZG8geyBcCisgIGlmIChUUkFDRV9BTFVfUCAoQ1BVKSkgXAorICAgIHRyYWNlX3Jlc3VsdDAgKFNELCBDUFUsIFRSQUNFX0FMVV9JRFgpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFRSQUNFX0FMVV9SRVNVTFQxKFIwKSBcCitkbyB7IFwKKyAgaWYgKFRSQUNFX0FMVV9QIChDUFUpKSBcCisgICAgdHJhY2VfcmVzdWx0X3dvcmQxIChTRCwgQ1BVLCBUUkFDRV9BTFVfSURYLCAoUjApKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUUkFDRV9BTFVfUkVTVUxUMihSMCxSMSkgXAorZG8geyBcCisgIGlmIChUUkFDRV9BTFVfUCAoQ1BVKSkgXAorICAgIHRyYWNlX3Jlc3VsdF93b3JkMiAoU0QsIENQVSwgVFJBQ0VfQUxVX0lEWCwgKFIwKSwgKFIxKSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVFJBQ0VfQUxVX1JFU1VMVDQoUjAsUjEsUjIsUjMpIFwKK2RvIHsgXAorICBpZiAoVFJBQ0VfQUxVX1AgKENQVSkpIFwKKyAgICB0cmFjZV9yZXN1bHRfd29yZDQgKFNELCBDUFUsIFRSQUNFX0FMVV9JRFgsIChSMCksIChSMSksIChSMiksIChSMykpOyBcCit9IHdoaWxlICgwKQorCisKKy8qIE1hY3JvJ3MgZm9yIHRyYWNpbmcgRlBVIGluc3RydWN0aW9ucyAqLworCisjZGVmaW5lIFRSQUNFX0ZQX0lOUFVUMCgpIFwKK2RvIHsgXAorICBpZiAoVFJBQ0VfRlBVX1AgKENQVSkpIFwKKyAgICB0cmFjZV9pbnB1dDAgKFNELCBDUFUsIFRSQUNFX0ZQVV9JRFgpOyBcCit9IHdoaWxlICgwKQorICAgIAorI2RlZmluZSBUUkFDRV9GUF9JTlBVVDEoVjApIFwKK2RvIHsgXAorICBpZiAoVFJBQ0VfRlBVX1AgKENQVSkpIFwKKyAgICB0cmFjZV9pbnB1dF9mcDEgKFNELCBDUFUsIFRSQUNFX0ZQVV9JRFgsIChWMCkpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFRSQUNFX0ZQX0lOUFVUMihWMCxWMSkgXAorZG8geyBcCisgIGlmIChUUkFDRV9GUFVfUCAoQ1BVKSkgXAorICAgIHRyYWNlX2lucHV0X2ZwMiAoU0QsIENQVSwgVFJBQ0VfRlBVX0lEWCwgKFYwKSwgKFYxKSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVFJBQ0VfRlBfSU5QVVQzKFYwLFYxLFYyKSBcCitkbyB7IFwKKyAgaWYgKFRSQUNFX0ZQVV9QIChDUFUpKSBcCisgICAgdHJhY2VfaW5wdXRfZnAzIChTRCwgQ1BVLCBUUkFDRV9GUFVfSURYLCAoVjApLCAoVjEpLCAoVjIpKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUUkFDRV9GUF9JTlBVVF9XT1JEMShWMCkgXAorZG8geyBcCisgIGlmIChUUkFDRV9GUFVfUCAoQ1BVKSkgXAorICAgIHRyYWNlX2lucHV0X3dvcmQxIChTRCwgQ1BVLCBUUkFDRV9GUFVfSURYLCAoVjApKTsgXAorfSB3aGlsZSAoMCkKKyAgICAKKyNkZWZpbmUgVFJBQ0VfRlBfUkVTVUxUKFIwKSBcCitkbyB7IFwKKyAgaWYgKFRSQUNFX0ZQVV9QIChDUFUpKSBcCisgICAgdHJhY2VfcmVzdWx0X2ZwMSAoU0QsIENQVSwgVFJBQ0VfRlBVX0lEWCwgKFIwKSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVFJBQ0VfRlBfUkVTVUxUMihSMCxSMSkgXAorZG8geyBcCisgIGlmIChUUkFDRV9GUFVfUCAoQ1BVKSkgXAorICAgIHRyYWNlX3Jlc3VsdF9mcDIgKFNELCBDUFUsIFRSQUNFX0ZQVV9JRFgsIChSMCksIChSMSkpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFRSQUNFX0ZQX1JFU1VMVF9CT09MKFIwKSBcCitkbyB7IFwKKyAgaWYgKFRSQUNFX0ZQVV9QIChDUFUpKSBcCisgICAgdHJhY2VfcmVzdWx0X2Jvb2wxIChTRCwgQ1BVLCBUUkFDRV9GUFVfSURYLCAoUjApKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUUkFDRV9GUF9SRVNVTFRfV09SRChSMCkgXAorZG8geyBcCisgIGlmIChUUkFDRV9GUFVfUCAoQ1BVKSkgXAorICAgIHRyYWNlX3Jlc3VsdF93b3JkMSAoU0QsIENQVSwgVFJBQ0VfRlBVX0lEWCwgKFIwKSk7IFwKK30gd2hpbGUgKDApCisKKworLyogTWFjcm9zIGZvciB0cmFjaW5nIGJyYW5jaGVzICovCisKKyNkZWZpbmUgVFJBQ0VfQlJBTkNIX0lOUFVUKENPTkQpIFwKK2RvIHsgXAorICBpZiAoVFJBQ0VfQlJBTkNIX1AgKENQVSkpIFwKKyAgICB0cmFjZV9pbnB1dF9ib29sMSAoU0QsIENQVSwgVFJBQ0VfQlJBTkNIX0lEWCwgKENPTkQpKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUUkFDRV9CUkFOQ0hfUkVTVUxUKERFU1QpIFwKK2RvIHsgXAorICBpZiAoVFJBQ0VfQlJBTkNIX1AgKENQVSkpIFwKKyAgICB0cmFjZV9yZXN1bHRfYWRkcjEgKFNELCBDUFUsIFRSQUNFX0JSQU5DSF9JRFgsIChERVNUKSk7IFwKK30gd2hpbGUgKDApCisKKwwKKy8qIFRoZSBmdW5jdGlvbiB0cmFjZV9vbmVfaW5zbiBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgZnVuY3Rpb24gcGFpcgorICAgdHJhY2VfcHJlZml4KCkgKyB0cmFjZV9nZW5lcmljKCkgKi8KK2V4dGVybiB2b2lkIHRyYWNlX29uZV9pbnNuIFBBUkFNUyAoKFNJTV9ERVNDIHNkLAorCQkJCSAgICBzaW1fY3B1ICogY3B1LAorCQkJCSAgICBhZGRyZXNzX3dvcmQgY2lhLAorCQkJCSAgICBpbnQgcHJpbnRfbGluZW51bV9wLAorCQkJCSAgICBjb25zdCBjaGFyICpmaWxlX25hbWUsCisJCQkJICAgIGludCBsaW5lX25yLAorCQkJCSAgICBjb25zdCBjaGFyICp1bml0LAorCQkJCSAgICBjb25zdCBjaGFyICpmbXQsCisJCQkJICAgIC4uLikpCisgICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCA4LCA5KSkpOworCitleHRlcm4gdm9pZCB0cmFjZV9wcmludGYgUEFSQU1TICgoU0lNX0RFU0MsIHNpbV9jcHUgKiwgY29uc3QgY2hhciAqLCAuLi4pKQorICAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKKworZXh0ZXJuIHZvaWQgdHJhY2VfdnByaW50ZiBQQVJBTVMgKChTSU1fREVTQywgc2ltX2NwdSAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKKworLyogRGVidWcgc3VwcG9ydC4KKyAgIFRoaXMgaXMgaW5jbHVkZWQgaGVyZSBiZWNhdXNlIHRoZXJlIGlzbid0IGVub3VnaCBvZiBpdCB0byBqdXN0aWZ5CisgICBhIHNpbS1kZWJ1Zy5oLiAgKi8KKworLyogUmV0dXJuIG5vbi16ZXJvIGlmIGRlYnVnZ2luZyBvZiBJRFggZm9yIENQVSBpcyBlbmFibGVkLiAgKi8KKyNkZWZpbmUgREVCVUdfUChjcHUsIGlkeCkgXAorKChXSVRIX0RFQlVHICYgKDEgPDwgKGlkeCkpKSAhPSAwIFwKKyAmJiBDUFVfREVCVUdfRkxBR1MgKGNwdSlbaWR4XSAhPSAwKQorCisvKiBOb24temVybyBpZiAiLS1kZWJ1Zy1pbnNuIiBzcGVjaWZpZWQuICAqLworI2RlZmluZSBERUJVR19JTlNOX1AoY3B1KSBERUJVR19QIChjcHUsIERFQlVHX0lOU05fSURYKQorCitleHRlcm4gdm9pZCBkZWJ1Z19wcmludGYgUEFSQU1TICgoc2ltX2NwdSAqLCBjb25zdCBjaGFyICosIC4uLikpCisgICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOworCisjZW5kaWYgLyogU0lNX1RSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLXR5cGVzLmggYi9zaW0vY29tbW9uL3NpbS10eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYmM1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS10eXBlcy5oCkBAIC0wLDAgKzEsMjAxIEBACisvKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBwc2ltIChtb2RlbCBvZiB0aGUgUG93ZXJQQyh0bSkgYXJjaGl0ZWN0dXJlKQorCisgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIAorICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAtLQorCisgICBQb3dlclBDIGlzIGEgdHJhZGVtYXJrIG9mIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24uICovCisKKworI2lmbmRlZiBTSU1fVFlQRVNfSAorLyogI2RlZmluZSBTSU1fVFlQRVNfSCAqLworCisvKiBJTlRFR0VSIFFVQU5USVRJRVM6CisKKyAgIFRZUEVTOgorCisgICAgIHNpZ25lZCogICAgc2lnbmVkIHR5cGUgb2YgdGhlIGdpdmVuIHNpemUKKyAgICAgdW5zaWduZWQqICBUaGUgY29ycmVzcG9uZGluZyBpbnNpZ25lZCB0eXBlCisKKyAgIFNJWkVTCisKKyAgICAgKk5OCVNpemUgYmFzZWQgb24gdGhlIG51bWJlciBvZiBiaXRzCisgICAgICpfTk4gICAgICAgU2l6ZSBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBieXRlcworICAgICAqX3dvcmQgICAgIFNpemUgYmFzZWQgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUncyB3b3JkCisgICAgIAkJd29yZCBzaXplICgzMi82NCBiaXRzKQorICAgICAqX2NlbGwgICAgIFNpemUgYmFzZWQgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUncworICAgICAJCUlFRUUgMTI3NSBjZWxsIHNpemUgKGFsbW9zdCBhbHdheXMgMzIgYml0cykKKworKi8KKworCisjaWYgIWRlZmluZWQgKFNJTV9UWVBFU19IKSAmJiBkZWZpbmVkIChfX0dOVUNfXykKKyNkZWZpbmUgU0lNX1RZUEVTX0gKKworLyogYml0IGJhc2VkICovCisKKyNkZWZpbmUgVU5TSUdORUQzMihYKSAoKHVuc2lnbmVkMzIpIFgjI1VMKQorI2RlZmluZSBVTlNJR05FRDY0KFgpICgodW5zaWduZWQ2NCkgWCMjVUxMKQorCisjZGVmaW5lIFNJR05FRDMyKFgpICgoc2lnbmVkMzIpIFgjI0wpCisjZGVmaW5lIFNJR05FRDY0KFgpICgoc2lnbmVkNjQpIFgjI0xMKQorCit0eXBlZGVmIHNpZ25lZCBpbnQgc2lnbmVkOCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fUUlfXykpKTsKK3R5cGVkZWYgc2lnbmVkIGludCBzaWduZWQxNiBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fSElfXykpKTsKK3R5cGVkZWYgc2lnbmVkIGludCBzaWduZWQzMiBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fU0lfXykpKTsKK3R5cGVkZWYgc2lnbmVkIGludCBzaWduZWQ2NCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fRElfXykpKTsKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdW5zaWduZWQ4IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19RSV9fKSkpOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdW5zaWduZWQxNiBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fSElfXykpKTsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVuc2lnbmVkMzIgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX1NJX18pKSk7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1bnNpZ25lZDY0IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19ESV9fKSkpOworCit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkNjQgYVsyXTsgfSB1bnNpZ25lZDEyODsKK3R5cGVkZWYgc3RydWN0IHsgc2lnbmVkNjQgYVsyXTsgfSBzaWduZWQxMjg7CisKKyNlbmRpZgorCisKKyNpZiAhZGVmaW5lZCAoU0lNX1RZUEVTX0gpICYmIGRlZmluZWQgKF9NU0NfVkVSKQorI2RlZmluZSBTSU1fVFlQRVNfSAorCisvKiBiaXQgYmFzZWQgKi8KKworI2RlZmluZSBVTlNJR05FRDMyKFgpIChYIyN1aTMyKQorI2RlZmluZSBVTlNJR05FRDY0KFgpIChYIyN1aTY0KQorCisjZGVmaW5lIFNJR05FRDMyKFgpIChYIyNpMzIpCisjZGVmaW5lIFNJR05FRDY0KFgpIChYIyNpNjQpCisKK3R5cGVkZWYgc2lnbmVkIGNoYXIgc2lnbmVkODsKK3R5cGVkZWYgc2lnbmVkIHNob3J0IHNpZ25lZDE2OwordHlwZWRlZiBzaWduZWQgaW50IHNpZ25lZDMyOwordHlwZWRlZiBzaWduZWQgX19pbnQ2NCBzaWduZWQ2NDsKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdW5zaWduZWQ4OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdW5zaWduZWQxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVuc2lnbmVkMzI7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdW5zaWduZWQ2NDsKKwordHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZDY0IGFbMl07IH0gdW5zaWduZWQxMjg7Cit0eXBlZGVmIHN0cnVjdCB7IHNpZ25lZDY0IGFbMl07IH0gc2lnbmVkMTI4OworCisjZW5kaWYgLyogX01TQ19WRVIgKi8KKworCisjaWYgIWRlZmluZWQgKFNJTV9UWVBFU19IKQorI2RlZmluZSBTSU1fVFlQRVNfSAorCisvKiBiaXQgYmFzZWQgKi8KKworI2RlZmluZSBVTlNJR05FRDMyKFgpIChYIyNVTCkKKyNkZWZpbmUgVU5TSUdORUQ2NChYKSAoWCMjVUxMKQorCisjZGVmaW5lIFNJR05FRDMyKFgpIChYIyNMKQorI2RlZmluZSBTSUdORUQ2NChYKSAoWCMjTEwpCisKK3R5cGVkZWYgc2lnbmVkIGNoYXIgc2lnbmVkODsKK3R5cGVkZWYgc2lnbmVkIHNob3J0IHNpZ25lZDE2OworI2lmIGRlZmluZWQgKF9fQUxQSEFfXykKK3R5cGVkZWYgc2lnbmVkIGludCB1bnNpZ25lZDMyOwordHlwZWRlZiBzaWduZWQgbG9uZyB1bnNpZ25lZDY0OworI2Vsc2UKK3R5cGVkZWYgc2lnbmVkIGxvbmcgdW5zaWduZWQzMjsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyB1bnNpZ25lZDY0OworI2VuZGlmCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1bnNpZ25lZDg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVuc2lnbmVkMTY7CisjaWYgZGVmaW5lZCAoX19BTFBIQV9fKQordHlwZWRlZiB1bnNpZ25lZCBpbnQgdW5zaWduZWQzMjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1bnNpZ25lZDY0OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1bnNpZ25lZDMyOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdW5zaWduZWQ2NDsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkNjQgYVsyXTsgfSB1bnNpZ25lZDEyODsKK3R5cGVkZWYgc3RydWN0IHsgc2lnbmVkNjQgYVsyXTsgfSBzaWduZWQxMjg7CisKKyNlbmRpZgorCisKKy8qIGJ5dGUgYmFzZWQgKi8KKwordHlwZWRlZiBzaWduZWQ4IHNpZ25lZF8xOwordHlwZWRlZiBzaWduZWQxNiBzaWduZWRfMjsKK3R5cGVkZWYgc2lnbmVkMzIgc2lnbmVkXzQ7Cit0eXBlZGVmIHNpZ25lZDY0IHNpZ25lZF84OwordHlwZWRlZiBzaWduZWQxMjggc2lnbmVkXzE2OworCit0eXBlZGVmIHVuc2lnbmVkOCB1bnNpZ25lZF8xOwordHlwZWRlZiB1bnNpZ25lZDE2IHVuc2lnbmVkXzI7Cit0eXBlZGVmIHVuc2lnbmVkMzIgdW5zaWduZWRfNDsKK3R5cGVkZWYgdW5zaWduZWQ2NCB1bnNpZ25lZF84OwordHlwZWRlZiB1bnNpZ25lZDEyOCB1bnNpZ25lZF8xNjsKKworCisvKiBmb3IgZ2VuZXJhbCB3b3JrLCB0aGUgZm9sbG93aW5nIGFyZSBkZWZpbmVkICovCisvKiB1bnNpZ25lZDogPj0gMzIgYml0cyAqLworLyogc2lnbmVkOiAgID49IDMyIGJpdHMgKi8KKy8qIGxvbmc6ICAgICA+PSAzMiBiaXRzLCBzaWduIHVuZGVmaW5lZCAqLworLyogaW50OiAgICAgIHNtYWxsIGluZGljYXRvciAqLworCisvKiB0YXJnZXQgYXJjaGl0ZWN0dXJlIGJhc2VkICovCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKK3R5cGVkZWYgdW5zaWduZWQ2NCB1bnNpZ25lZF93b3JkOwordHlwZWRlZiBzaWduZWQ2NCBzaWduZWRfd29yZDsKKyNlbmRpZgorI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCit0eXBlZGVmIHVuc2lnbmVkMzIgdW5zaWduZWRfd29yZDsKK3R5cGVkZWYgc2lnbmVkMzIgc2lnbmVkX3dvcmQ7CisjZW5kaWYKKworCisvKiBPdGhlciBpbnN0cnVjdGlvbnMgKi8KKyNpZiAoV0lUSF9UQVJHRVRfQUREUkVTU19CSVRTSVpFID09IDY0KQordHlwZWRlZiB1bnNpZ25lZDY0IHVuc2lnbmVkX2FkZHJlc3M7Cit0eXBlZGVmIHNpZ25lZDY0IHNpZ25lZF9hZGRyZXNzOworI2VuZGlmCisjaWYgKFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRSA9PSAzMikKK3R5cGVkZWYgdW5zaWduZWQzMiB1bnNpZ25lZF9hZGRyZXNzOwordHlwZWRlZiBzaWduZWQzMiBzaWduZWRfYWRkcmVzczsKKyNlbmRpZgordHlwZWRlZiB1bnNpZ25lZF9hZGRyZXNzIGFkZHJlc3Nfd29yZDsKKworCisvKiBJRUVFIDEyNzUgY2VsbCBzaXplICovCisjaWYgKFdJVEhfVEFSR0VUX0NFTExfQklUU0laRSA9PSA2NCkKK3R5cGVkZWYgdW5zaWduZWQ2NCB1bnNpZ25lZF9jZWxsOwordHlwZWRlZiBzaWduZWQ2NCBzaWduZWRfY2VsbDsKKyNlbmRpZgorI2lmIChXSVRIX1RBUkdFVF9DRUxMX0JJVFNJWkUgPT0gMzIpCit0eXBlZGVmIHVuc2lnbmVkMzIgdW5zaWduZWRfY2VsbDsKK3R5cGVkZWYgc2lnbmVkMzIgc2lnbmVkX2NlbGw7CisjZW5kaWYKK3R5cGVkZWYgc2lnbmVkX2NlbGwgY2VsbF93b3JkOyAvKiBjZWxscyBhcmUgbm9ybWFsbHkgc2lnbmVkICovCisKKworLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzICovCisjaWYgKFdJVEhfVEFSR0VUX0ZMT0FUSU5HX1BPSU5UX0JJVFNJWkUgPT0gNjQpCit0eXBlZGVmIHVuc2lnbmVkNjQgZnBfd29yZDsKKyNlbmRpZgorI2lmIChXSVRIX1RBUkdFVF9GTE9BVElOR19QT0lOVF9CSVRTSVpFID09IDMyKQordHlwZWRlZiB1bnNpZ25lZDMyIGZwX3dvcmQ7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3NpbS11dGlscy5jIGIvc2ltL2NvbW1vbi9zaW0tdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWRiYWU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zaW0tdXRpbHMuYwpAQCAtMCwwICsxLDQxMSBAQAorLyogTWlzY2VsbGFuZW91cyBzaW11bGF0b3IgdXRpbGl0aWVzLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAic2ltLWFzc2VydC5oIgorCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1RJTUVfSAorI2luY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjaW5jbHVkZSA8c3lzL3RpbWUuaD4gLyogbmVlZGVkIGJ5IHN5cy9yZXNvdXJjZS5oICovCisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzaW0tdXRpbHMuaCIKKworLyogR2xvYmFsIHBvaW50ZXIgdG8gYWxsIHN0YXRlIGRhdGEuCisgICBTZXQgYnkgc2ltX3Jlc3VtZS4gICovCitzdHJ1Y3Qgc2ltX3N0YXRlICpjdXJyZW50X3N0YXRlOworCisvKiBBbGxvY2F0ZSB6ZXJvIGZpbGxlZCBtZW1vcnkgd2l0aCB4bWFsbG9jIC0geG1hbGxvYyBhYm9ydHMgb2YgdGhlCisgICBhbGxvY2F0aW9uIGZhaWxzLiAgKi8KKwordm9pZCAqCit6YWxsb2MgKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKyAgdm9pZCAqbWVtb3J5ID0gKHZvaWQgKikgeG1hbGxvYyAoc2l6ZSk7CisgIG1lbXNldCAobWVtb3J5LCAwLCBzaXplKTsKKyAgcmV0dXJuIG1lbW9yeTsKK30KKwordm9pZAoremZyZWUgKHZvaWQgKmRhdGEpCit7CisgIGZyZWUgKGRhdGEpOworfQorCisvKiBBbGxvY2F0ZSBhIHNpbV9zdGF0ZSBzdHJ1Y3QuICAqLworCitTSU1fREVTQworc2ltX3N0YXRlX2FsbG9jIChTSU1fT1BFTl9LSU5EIGtpbmQsCisJCSBob3N0X2NhbGxiYWNrICpjYWxsYmFjaykKK3sKKyAgU0lNX0RFU0Mgc2QgPSBaQUxMT0MgKHN0cnVjdCBzaW1fc3RhdGUpOworCisgIFNUQVRFX01BR0lDIChzZCkgPSBTSU1fTUFHSUNfTlVNQkVSOworICBTVEFURV9DQUxMQkFDSyAoc2QpID0gY2FsbGJhY2s7CisgIFNUQVRFX09QRU5fS0lORCAoc2QpID0ga2luZDsKKworI2lmIDAKKyAgeworICAgIGludCBjcHVfbnI7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBiYWNrIGxpbmsgZnJvbSB0aGUgY3B1IHN0cnVjdCB0byB0aGUgc3RhdGUgc3RydWN0LiAgKi8KKyAgICAvKiA/Pz8gSSBjYW4gZW52aXNpb24gYSBkZXNpZ24gd2hlcmUgdGhlIHN0YXRlIHN0cnVjdCBjb250YWlucyBhbiBhcnJheQorICAgICAgIG9mIHBvaW50ZXJzIHRvIGNwdSBzdHJ1Y3RzLCByYXRoZXIgdGhhbiBhbiBhcnJheSBvZiBzdHJ1Y3RzIHRoZW1zZWx2ZXMuCisgICAgICAgSW1wbGVtZW50aW5nIHRoaXMgaXMgdHJpY2tpZXIgYXMgb25lIG1heSBub3Qga25vdyB3aGF0IHRvIGFsbG9jYXRlIHVudGlsCisgICAgICAgb25lIGhhcyBwYXJzZWQgdGhlIGFyZ3MuICBQYXJzaW5nIHRoZSBhcmdzIHR3aWNlIHdvdWxkbid0IGJlIHVucmVhc29uYWJsZSwKKyAgICAgICBJTUhPLiAgSWYgdGhlIHN0YXRlIHN0cnVjdCBldmVyIGRvZXMgY29udGFpbiBhbiBhcnJheSBvZiBwb2ludGVycyB0aGVuIHdlCisgICAgICAgY2FuJ3QgZG8gdGhpcyBoZXJlLgorICAgICAgID8/PyBTZWUgYWxzbyBzaW1fcG9zdF9hcmd2X2luaXQqLworICAgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgTUFYX05SX1BST0NFU1NPUlM7IGNwdV9ucisrKQorICAgICAgeworCUNQVV9TVEFURSAoU1RBVEVfQ1BVIChzZCwgY3B1X25yKSkgPSBzZDsKKwlDUFVfSU5ERVggKFNUQVRFX0NQVSAoc2QsIGNwdV9ucikpID0gY3B1X25yOworICAgICAgfQorICB9CisjZW5kaWYKKworI2lmZGVmIFNJTV9TVEFURV9JTklUCisgIFNJTV9TVEFURV9JTklUIChzZCk7CisjZW5kaWYKKworICByZXR1cm4gc2Q7Cit9CisKKy8qIEZyZWUgYSBzaW1fc3RhdGUgc3RydWN0LiAgKi8KKwordm9pZAorc2ltX3N0YXRlX2ZyZWUgKFNJTV9ERVNDIHNkKQoreworICBBU1NFUlQgKHNkLT5iYXNlLm1hZ2ljID09IFNJTV9NQUdJQ19OVU1CRVIpOworCisjaWZkZWYgU0lNX1NUQVRFX0ZSRUUKKyAgU0lNX1NUQVRFX0ZSRUUgKHNkKTsKKyNlbmRpZgorCisgIHpmcmVlIChzZCk7Cit9CisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGNwdSBkYXRhIGZvciBDUFVfTkFNRSwgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLworCitzaW1fY3B1ICoKK3NpbV9jcHVfbG9va3VwIChTSU1fREVTQyBzZCwgY29uc3QgY2hhciAqY3B1X25hbWUpCit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlJfUFJPQ0VTU09SUzsgKytpKQorICAgIGlmIChzdHJjbXAgKGNwdV9uYW1lLCBDUFVfTkFNRSAoU1RBVEVfQ1BVIChzZCwgaSkpKSA9PSAwKQorICAgICAgcmV0dXJuIFNUQVRFX0NQVSAoc2QsIGkpOworICByZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJuIHRoZSBwcmVmaXggdG8gdXNlIGZvciBhIENQVSBzcGVjaWZpYyBtZXNzYWdlICh0eXBpY2FsbHkgYW4KKyAgIGVycm9yIG1lc3NhZ2UpLiAgKi8KKworY29uc3QgY2hhciAqCitzaW1fY3B1X21zZ19wcmVmaXggKHNpbV9jcHUgKmNwdSkKK3sKKyNpZiBNQVhfTlJfUFJPQ0VTU09SUyA9PSAxCisgIHJldHVybiAiIjsKKyNlbHNlCisgIHN0YXRpYyBjaGFyICpwcmVmaXg7CisKKyAgaWYgKHByZWZpeCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGludCBtYXhsZW4gPSAwOworICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2kpCisJeworCSAgaW50IGxlbiA9IHN0cmxlbiAoQ1BVX05BTUUgKFNUQVRFX0NQVSAoc2QsIGkpKSk7CisJICBpZiAobGVuID4gbWF4bGVuKQorCSAgICBtYXhsZW4gPSBsZW47CisJfQorICAgICAgcHJlZml4ID0gKGNoYXIgKikgeG1hbGxvYyAobWF4bGVuICsgNSk7CisgICAgfQorICBzcHJpbnRmIChwcmVmaXgsICIlczogIiwgQ1BVX05BTUUgKGNwdSkpOworICByZXR1cm4gcHJlZml4OworI2VuZGlmCit9CisKKy8qIENvdmVyIGZuIHRvIHNpbV9pb19lcHJpbnRmLiAgKi8KKwordm9pZAorc2ltX2lvX2VwcmludGZfY3B1IChzaW1fY3B1ICpjcHUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICBTSU1fREVTQyBzZCA9IENQVV9TVEFURSAoY3B1KTsKKyAgdmFfbGlzdCBhcDsKKworICB2YV9zdGFydCAoYXAsIGZtdCk7CisgIHNpbV9pb19lcHJpbnRmIChzZCwgc2ltX2NwdV9tc2dfcHJlZml4IChjcHUpKTsKKyAgc2ltX2lvX2V2cHJpbnRmIChzZCwgZm10LCBhcCk7CisgIHZhX2VuZCAoYXApOworfQorCisvKiBUdXJuIFZBTFVFIGludG8gYSBzdHJpbmcgd2l0aCBjb21tYXMuICAqLworCitjaGFyICoKK3NpbV9hZGRfY29tbWFzIChjaGFyICpidWYsIGludCBzaXplb2ZfYnVmLCB1bnNpZ25lZCBsb25nIHZhbHVlKQoreworICBpbnQgY29tbWEgPSAzOworICBjaGFyICplbmRidWYgPSBidWYgKyBzaXplb2ZfYnVmIC0gMTsKKworICAqLS1lbmRidWYgPSAnXDAnOworICBkbyB7CisgICAgaWYgKGNvbW1hLS0gPT0gMCkKKyAgICAgIHsKKwkqLS1lbmRidWYgPSAnLCc7CisJY29tbWEgPSAyOworICAgICAgfQorCisgICAgKi0tZW5kYnVmID0gKHZhbHVlICUgMTApICsgJzAnOworICB9IHdoaWxlICgodmFsdWUgLz0gMTApICE9IDApOworCisgIHJldHVybiBlbmRidWY7Cit9CisKKy8qIEFuYWx5emUgUFJPR19OQU1FL1BST0dfQkZEIGFuZCBzZXQgdGhlc2UgZmllbGRzIGluIHRoZSBzdGF0ZSBzdHJ1Y3Q6CisgICBTVEFURV9BUkNISVRFQ1RVUkUsIGlmIG5vdCBzZXQgYWxyZWFkeSBhbmQgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgYmZkCisgICBTVEFURV9QUk9HX0JGRAorICAgU1RBVEVfU1RBUlRfQUREUgorICAgU1RBVEVfVEVYVF9TRUNUSU9OCisgICBTVEFURV9URVhUX1NUQVJUCisgICBTVEFURV9URVhUX0VORAorCisgICBQUk9HX05BTUUgaXMgdGhlIGZpbGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSBvciBOVUxMLgorICAgUFJPR19CRkQgaXMgaXRzIGJmZCBvciBOVUxMLgorCisgICBJZiBib3RoIFBST0dfTkFNRSBhbmQgUFJPR19CRkQgYXJlIE5VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGVseS4KKyAgIElmIFBST0dfQkZEIGlzIG5vdCBOVUxMLCBQUk9HX05BTUUgaXMgaWdub3JlZC4KKworICAgSW1wbGljaXQgaW5wdXRzOiBTVEFURV9NWV9OQU1FKHNkKSwgU1RBVEVfVEFSR0VUKHNkKSwKKyAgICAgICAgICAgICAgICAgICAgU1RBVEVfQVJDSElURUNUVVJFKHNkKS4KKworICAgQSBuZXcgYmZkIGlzIGNyZWF0ZWQgc28gdGhlIGFwcCBpc24ndCByZXF1aXJlZCB0byBrZWVwIGl0cyBjb3B5IG9mIHRoZQorICAgYmZkIG9wZW4uICAqLworCitTSU1fUkMKK3NpbV9hbmFseXplX3Byb2dyYW0gKHNkLCBwcm9nX25hbWUsIHByb2dfYmZkKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgY2hhciAqcHJvZ19uYW1lOworICAgICBiZmQgKnByb2dfYmZkOworeworICBhc2VjdGlvbiAqczsKKyAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKKworICBpZiAocHJvZ19iZmQgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAocHJvZ19iZmQgPT0gU1RBVEVfUFJPR19CRkQgKHNkKSkKKwkvKiBhbHJlYWR5IGFuYWx5emVkICovCisJcmV0dXJuIFNJTV9SQ19PSzsKKyAgICAgIGVsc2UKKwkvKiBkdXBsaWNhdGUgbmVlZGVkLCBzYXZlIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIHJlLW9wZW5lZCAqLworCXByb2dfbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKHByb2dfYmZkKTsKKyAgICB9CisKKyAgLyogZG8gd2UgbmVlZCB0byBkdXBsaWNhdGUgYW55dGhpbmc/ICovCisgIGlmIChwcm9nX25hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gU0lNX1JDX09LOworCisgIC8qIG9wZW4gYSBuZXcgY29weSBvZiB0aGUgcHJvZ19iZmQgKi8KKyAgcHJvZ19iZmQgPSBiZmRfb3BlbnIgKHByb2dfbmFtZSwgU1RBVEVfVEFSR0VUIChzZCkpOworICBpZiAocHJvZ19iZmQgPT0gTlVMTCkKKyAgICB7CisgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICIlczogY2FuJ3Qgb3BlbiBcIiVzXCI6ICVzXG4iLCAKKwkJICAgICAgU1RBVEVfTVlfTkFNRSAoc2QpLAorCQkgICAgICBwcm9nX25hbWUsCisJCSAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKKyAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKyAgICB9CisgIGlmICghYmZkX2NoZWNrX2Zvcm1hdCAocHJvZ19iZmQsIGJmZF9vYmplY3QpKSAKKyAgICB7CisgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICIlczogXCIlc1wiIGlzIG5vdCBhbiBvYmplY3QgZmlsZTogJXNcbiIsCisJCSAgICAgIFNUQVRFX01ZX05BTUUgKHNkKSwKKwkJICAgICAgcHJvZ19uYW1lLAorCQkgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgICBiZmRfY2xvc2UgKHByb2dfYmZkKTsKKyAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKyAgICB9CisgIGlmIChTVEFURV9BUkNISVRFQ1RVUkUgKHNkKSAhPSBOVUxMKQorICAgIGJmZF9zZXRfYXJjaF9pbmZvIChwcm9nX2JmZCwgU1RBVEVfQVJDSElURUNUVVJFIChzZCkpOworICBlbHNlCisgICAgeworICAgICAgaWYgKGJmZF9nZXRfYXJjaCAocHJvZ19iZmQpICE9IGJmZF9hcmNoX3Vua25vd24KKwkgICYmIGJmZF9nZXRfYXJjaCAocHJvZ19iZmQpICE9IGJmZF9hcmNoX29ic2N1cmUpCisJeworCSAgU1RBVEVfQVJDSElURUNUVVJFIChzZCkgPSBiZmRfZ2V0X2FyY2hfaW5mbyAocHJvZ19iZmQpOworCX0KKyAgICB9CisKKyAgLyogdXBkYXRlIHRoZSBzaW0gc3RydWN0dXJlICovCisgIGlmIChTVEFURV9QUk9HX0JGRCAoc2QpICE9IE5VTEwpCisgICAgYmZkX2Nsb3NlIChTVEFURV9QUk9HX0JGRCAoc2QpKTsKKyAgU1RBVEVfUFJPR19CRkQgKHNkKSA9IHByb2dfYmZkOworICBTVEFURV9TVEFSVF9BRERSIChzZCkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKHByb2dfYmZkKTsKKworICBmb3IgKHMgPSBwcm9nX2JmZC0+c2VjdGlvbnM7IHM7IHMgPSBzLT5uZXh0KQorICAgIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChwcm9nX2JmZCwgcyksICIudGV4dCIpID09IDApCisgICAgICB7CisJU1RBVEVfVEVYVF9TRUNUSU9OIChzZCkgPSBzOworCVNUQVRFX1RFWFRfU1RBUlQgKHNkKSA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKHByb2dfYmZkLCBzKTsKKwlTVEFURV9URVhUX0VORCAoc2QpID0gU1RBVEVfVEVYVF9TVEFSVCAoc2QpICsgYmZkX3NlY3Rpb25fc2l6ZSAocHJvZ19iZmQsIHMpOworCWJyZWFrOworICAgICAgfQorCisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisMCisvKiBTaW11bGF0b3IgdGltaW5nIHN1cHBvcnQuICAqLworCisvKiBDYWxsZWQgYmVmb3JlIHNpbV9lbGFwc2VkX3RpbWVfc2luY2UgdG8gZ2V0IGEgcmVmZXJlbmNlIHBvaW50LiAgKi8KKworU0lNX0VMQVBTRURfVElNRQorc2ltX2VsYXBzZWRfdGltZV9nZXQgKCkKK3sKKyNpZmRlZiBIQVZFX0dFVFJVU0FHRQorICBzdHJ1Y3QgcnVzYWdlIG15dGltZTsKKyAgaWYgKGdldHJ1c2FnZSAoUlVTQUdFX1NFTEYsICZteXRpbWUpID09IDApCisgICAgcmV0dXJuIDEgKyAoU0lNX0VMQVBTRURfVElNRSkgKCgoZG91YmxlKSBteXRpbWUucnVfdXRpbWUudHZfc2VjICogMTAwMCkgKyAoKChkb3VibGUpIG15dGltZS5ydV91dGltZS50dl91c2VjICsgNTAwKSAvIDEwMDApKTsKKyAgcmV0dXJuIDE7CisjZWxzZQorI2lmZGVmIEhBVkVfVElNRQorICByZXR1cm4gMSArIChTSU1fRUxBUFNFRF9USU1FKSB0aW1lICgodGltZV90KSAwKTsKKyNlbHNlCisgIHJldHVybiAxOworI2VuZGlmCisjZW5kaWYKK30KKworLyogUmV0dXJuIHRoZSBlbGFwc2VkIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIFNUQVJULgorICAgVGhlIGFjdHVhbCB0aW1lIG1heSBiZSBjcHUgdXNhZ2UgKHByZWZlcmVkKSBvciB3YWxsIGNsb2NrLiAgKi8KKwordW5zaWduZWQgbG9uZworc2ltX2VsYXBzZWRfdGltZV9zaW5jZSAoc3RhcnQpCisgICAgIFNJTV9FTEFQU0VEX1RJTUUgc3RhcnQ7Cit7CisjaWZkZWYgSEFWRV9HRVRSVVNBR0UKKyAgcmV0dXJuIHNpbV9lbGFwc2VkX3RpbWVfZ2V0ICgpIC0gc3RhcnQ7CisjZWxzZQorI2lmZGVmIEhBVkVfVElNRQorICByZXR1cm4gKHNpbV9lbGFwc2VkX3RpbWVfZ2V0ICgpIC0gc3RhcnQpICogMTAwMDsKKyNlbHNlCisgIHJldHVybiAwOworI2VuZGlmCisjZW5kaWYKK30KKworCisKKy8qIGRvX2NvbW1hbmQgYnV0IHdpdGggcHJpbnRmIHN0eWxlIGZvcm1hdHRpbmcgb2YgdGhlIGFyZ3VtZW50cyAqLwordm9pZAorc2ltX2RvX2NvbW1hbmRmIChTSU1fREVTQyBzZCwKKwkJIGNvbnN0IGNoYXIgKmZtdCwKKwkJIC4uLikKK3sKKyAgdmFfbGlzdCBhcDsKKyAgY2hhciAqYnVmOworICB2YV9zdGFydCAoYXAsIGZtdCk7CisgIHZhc3ByaW50ZiAoJmJ1ZiwgZm10LCBhcCk7CisgIHNpbV9kb19jb21tYW5kIChzZCwgYnVmKTsKKyAgdmFfZW5kIChhcCk7CisgIGZyZWUgKGJ1Zik7Cit9CisKKworLyogc2ltLWJhc2ljcy5oIGRlZmluZXMgYSBudW1iZXIgb2YgZW51bWVyYXRpb25zLCBjb252ZXJ0IGVhY2ggb2YgdGhlbQorICAgdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gKi8KK2NvbnN0IGNoYXIgKgorbWFwX3RvX3N0ciAodW5zaWduZWQgbWFwKQoreworICBzd2l0Y2ggKG1hcCkKKyAgICB7CisgICAgY2FzZSByZWFkX21hcDogcmV0dXJuICJyZWFkIjsKKyAgICBjYXNlIHdyaXRlX21hcDogcmV0dXJuICJ3cml0ZSI7CisgICAgY2FzZSBleGVjX21hcDogcmV0dXJuICJleGVjIjsKKyAgICBjYXNlIGlvX21hcDogcmV0dXJuICJpbyI7CisgICAgZGVmYXVsdDoKKyAgICAgIHsKKwlzdGF0aWMgY2hhciBzdHJbMTBdOworCXNwcmludGYgKHN0ciwgIiglbGQpIiwgKGxvbmcpIG1hcCk7CisJcmV0dXJuIHN0cjsKKyAgICAgIH0KKyAgICB9Cit9CisKK2NvbnN0IGNoYXIgKgorYWNjZXNzX3RvX3N0ciAodW5zaWduZWQgYWNjZXNzKQoreworICBzd2l0Y2ggKGFjY2VzcykKKyAgICB7CisgICAgY2FzZSBhY2Nlc3NfaW52YWxpZDogcmV0dXJuICJpbnZhbGlkIjsKKyAgICBjYXNlIGFjY2Vzc19yZWFkOiByZXR1cm4gInJlYWQiOworICAgIGNhc2UgYWNjZXNzX3dyaXRlOiByZXR1cm4gIndyaXRlIjsKKyAgICBjYXNlIGFjY2Vzc19leGVjOiByZXR1cm4gImV4ZWMiOworICAgIGNhc2UgYWNjZXNzX2lvOiByZXR1cm4gImlvIjsKKyAgICBjYXNlIGFjY2Vzc19yZWFkX3dyaXRlOiByZXR1cm4gInJlYWRfd3JpdGUiOworICAgIGNhc2UgYWNjZXNzX3JlYWRfZXhlYzogcmV0dXJuICJyZWFkX2V4ZWMiOworICAgIGNhc2UgYWNjZXNzX3dyaXRlX2V4ZWM6IHJldHVybiAid3JpdGVfZXhlYyI7CisgICAgY2FzZSBhY2Nlc3NfcmVhZF93cml0ZV9leGVjOiByZXR1cm4gInJlYWRfd3JpdGVfZXhlYyI7CisgICAgY2FzZSBhY2Nlc3NfcmVhZF9pbzogcmV0dXJuICJyZWFkX2lvIjsKKyAgICBjYXNlIGFjY2Vzc193cml0ZV9pbzogcmV0dXJuICJ3cml0ZV9pbyI7CisgICAgY2FzZSBhY2Nlc3NfcmVhZF93cml0ZV9pbzogcmV0dXJuICJyZWFkX3dyaXRlX2lvIjsKKyAgICBjYXNlIGFjY2Vzc19leGVjX2lvOiByZXR1cm4gImV4ZWNfaW8iOworICAgIGNhc2UgYWNjZXNzX3JlYWRfZXhlY19pbzogcmV0dXJuICJyZWFkX2V4ZWNfaW8iOworICAgIGNhc2UgYWNjZXNzX3dyaXRlX2V4ZWNfaW86IHJldHVybiAid3JpdGVfZXhlY19pbyI7CisgICAgY2FzZSBhY2Nlc3NfcmVhZF93cml0ZV9leGVjX2lvOiByZXR1cm4gInJlYWRfd3JpdGVfZXhlY19pbyI7CisgICAgZGVmYXVsdDoKKyAgICAgIHsKKwlzdGF0aWMgY2hhciBzdHJbMTBdOworCXNwcmludGYgKHN0ciwgIiglbGQpIiwgKGxvbmcpIGFjY2Vzcyk7CisJcmV0dXJuIHN0cjsKKyAgICAgIH0KKyAgICB9Cit9CisKK2NvbnN0IGNoYXIgKgordHJhbnNmZXJfdG9fc3RyICh1bnNpZ25lZCB0cmFuc2ZlcikKK3sKKyAgc3dpdGNoICh0cmFuc2ZlcikKKyAgICB7CisgICAgY2FzZSByZWFkX3RyYW5zZmVyOiByZXR1cm4gInJlYWQiOworICAgIGNhc2Ugd3JpdGVfdHJhbnNmZXI6IHJldHVybiAid3JpdGUiOworICAgIGRlZmF1bHQ6IHJldHVybiAiKGVycm9yKSI7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLXV0aWxzLmggYi9zaW0vY29tbW9uL3NpbS11dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlODBlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS11dGlscy5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qIE1pc2NlbGxhbmVvdXMgc2ltdWxhdG9yIHV0aWxpdGllcy4KKyAgIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgU0lNX1VUSUxTX0gKKyNkZWZpbmUgU0lNX1VUSUxTX0gKKworLyogTWVtb3J5IG1hbmFnZW1lbnQgd2l0aCBhbiBhbGxvY2F0b3IgdGhhdCBjbGVhcnMgbWVtb3J5IGJlZm9yZSB1c2UuICovCisKK3ZvaWQgKnphbGxvYyAodW5zaWduZWQgbG9uZyBzaXplKTsKKworI2RlZmluZSBaQUxMT0MoVFlQRSkgKFRZUEUqKXphbGxvYyhzaXplb2YgKFRZUEUpKQorI2RlZmluZSBOWkFMTE9DKFRZUEUsTikgKFRZUEUqKXphbGxvYyhzaXplb2YgKFRZUEUpICogKE4pKQorCit2b2lkIHpmcmVlKHZvaWQqKTsKKworLyogVHVybiBWQUxVRSBpbnRvIGEgc3RyaW5nIHdpdGggY29tbWFzLiAgKi8KK2NoYXIgKnNpbV9hZGRfY29tbWFzIChjaGFyICosIGludCwgdW5zaWduZWQgbG9uZyk7CisKKy8qIFV0aWxpdGllcyBmb3IgZWxhcHNlZCB0aW1lIHJlcG9ydGluZy4gICovCisKKy8qIE9wYXF1ZSB0eXBlLCBrbm93biBvbmx5IGluc2lkZSBzaW1fZWxhcHNlZF90aW1lX2ZvbyBmbnMuIEV4dGVybmFsbHkKKyAgIGl0IGlzIGtub3duIHRvIG5ldmVyIGhhdmUgdGhlIHZhbHVlIHplcm8uICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgU0lNX0VMQVBTRURfVElNRTsKKworCisvKiBHZXQgcmVmZXJlbmNlIHBvaW50IGZvciBmdXR1cmUgY2FsbCB0byBzaW1fdGltZV9lbGFwc2VkLiAgKi8KK1NJTV9FTEFQU0VEX1RJTUUgc2ltX2VsYXBzZWRfdGltZV9nZXQgKHZvaWQpOworCisvKiBFbGFwc2VkIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIFNUQVJULiAgKi8KK3Vuc2lnbmVkIGxvbmcgc2ltX2VsYXBzZWRfdGltZV9zaW5jZSAoU0lNX0VMQVBTRURfVElNRSBzdGFydCk7CisKKy8qIFV0aWxpdGllcyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBsb2FkIGltYWdlLiAgKi8KKworU0lNX1JDIHNpbV9hbmFseXplX3Byb2dyYW0gKFNJTV9ERVNDIHNkLCBjaGFyICpwcm9nX25hbWUsCisJCQkgICAgc3RydWN0IF9iZmQgKnByb2dfYmZkKTsKKworLyogTG9hZCBwcm9ncmFtIFBST0cgaW50byB0aGUgc2ltdWxhdG9yIHVzaW5nIHRoZSBmdW5jdGlvbiBET19MT0FELgorICAgSWYgUFJPR19CRkQgaXMgbm9uLU5VTEwsIHRoZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gb3BlbmVkLgorICAgSWYgVkVSQk9TRV9QIGlzIG5vbi16ZXJvIHN0YXRpc3RpY3MgYXJlIHByaW50ZWQgb2YgZWFjaCBsb2FkZWQgc2VjdGlvbgorICAgYW5kIHRoZSB0cmFuc2ZlciByYXRlIChmb3IgY29uc2lzdGVuY3kgd2l0aCBnZGIpLgorICAgSWYgTE1BX1AgaXMgbm9uLXplcm8gdGhlIHByb2dyYW0gc2VjdGlvbnMgYXJlIGxvYWRlZCBhdCB0aGUgTE1BCisgICByYXRoZXIgdGhhbiB0aGUgVk1BCisgICBJZiB0aGlzIGZhaWxzIGFuIGVycm9yIG1lc3NhZ2UgaXMgcHJpbnRlZCBhbmQgTlVMTCBpcyByZXR1cm5lZC4KKyAgIElmIGl0IHN1Y2NlZWRzIHRoZSBiZmQgaXMgcmV0dXJuZWQuCisgICBOT1RFOiBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBvbGRlciBoYXJkd2FyZSBzaW11bGF0b3JzIGluY29ycmVjdGx5CisgICB3cml0ZSB0aGUgcHJvZ3JhbSBzZWN0aW9ucyBhdCBMTUEgaW50ZXJwcmV0ZWQgYXMgYSB2aXJ0dWFsIGFkZHJlc3MuCisgICBUaGlzIGlzIHN0aWxsIGFjY29tbW9kYXRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZWFzb25zLiAqLworCit0eXBlZGVmIGludCBzaW1fd3JpdGVfZm4gUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIG1lbSwKKwkJCQkgICAgICB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW5ndGgpKTsKK3N0cnVjdCBfYmZkICpzaW1fbG9hZF9maWxlIChTSU1fREVTQyBzZCwgY29uc3QgY2hhciAqbXluYW1lLAorCQkJICAgIGhvc3RfY2FsbGJhY2sgKmNhbGxiYWNrLCBjaGFyICpwcm9nLAorCQkJICAgIHN0cnVjdCBfYmZkICpwcm9nX2JmZCwgaW50IHZlcmJvc2VfcCwKKwkJCSAgICBpbnQgbG1hX3AsIHNpbV93cml0ZV9mbiBkb19sb2FkKTsKKworLyogSW50ZXJuYWwgdmVyc2lvbiBvZiBzaW1fZG9fY29tbWFuZCwgaW5jbHVkZSBmb3JtYXR0aW5nICovCit2b2lkIHNpbV9kb19jb21tYW5kZiAoU0lNX0RFU0Mgc2QsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKworCisvKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiBjYWxsYmFjay5jIGFzIGNvdmVyIGZ1bmN0aW9ucyB0byB0aGUgdnByaW50ZgorICAgY2FsbGJhY2tzLiAgKi8KKwordm9pZCBzaW1fY2JfcHJpbnRmIChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKK3ZvaWQgc2ltX2NiX2VwcmludGYgKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pOworCisKKy8qIHNpbS1iYXNpY3MuaCBkZWZpbmVzIGEgbnVtYmVyIG9mIGVudW1lcmF0aW9ucywgY29udmVydCBlYWNoIG9mIHRoZW0KKyAgIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uICovCitjb25zdCBjaGFyICptYXBfdG9fc3RyICh1bnNpZ25lZCBtYXApOworY29uc3QgY2hhciAqYWNjZXNzX3RvX3N0ciAodW5zaWduZWQgYWNjZXNzKTsKK2NvbnN0IGNoYXIgKnRyYW5zZmVyX3RvX3N0ciAodW5zaWduZWQgdHJhbnNmZXIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLXdhdGNoLmMgYi9zaW0vY29tbW9uL3NpbS13YXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YzlhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS13YXRjaC5jCkBAIC0wLDAgKzEsNDU4IEBACisvKiBHZW5lcmljIHNpbXVsYXRvciB3YXRjaHBvaW50IHN1cHBvcnQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJzaW0tb3B0aW9ucy5oIgorCisjaW5jbHVkZSAic2ltLWFzc2VydC5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKK2VudW0geworICBPUFRJT05fV0FUQ0hfREVMRVRFICAgICAgICAgICAgICAgICAgICAgID0gT1BUSU9OX1NUQVJULAorCisgIE9QVElPTl9XQVRDSF9JTkZPLAorICBPUFRJT05fV0FUQ0hfQ0xPQ0ssCisgIE9QVElPTl9XQVRDSF9DWUNMRVMsCisgIE9QVElPTl9XQVRDSF9QQywKKworICBPUFRJT05fV0FUQ0hfT1AsCit9OworCisKKy8qIEJyZWFrIGFuIG9wdGlvbiBudW1iZXIgaW50byBpdHMgb3AvaW50LW5yICovCitzdGF0aWMgd2F0Y2hwb2ludF90eXBlCitvcHRpb25fdG9fdHlwZSAoU0lNX0RFU0Mgc2QsCisJCWludCBvcHRpb24pCit7CisgIHNpbV93YXRjaHBvaW50cyAqd2F0Y2ggPSBTVEFURV9XQVRDSFBPSU5UUyAoc2QpOworICB3YXRjaHBvaW50X3R5cGUgdHlwZSA9ICgob3B0aW9uIC0gT1BUSU9OX1dBVENIX09QKQorCQkJICAvICh3YXRjaC0+bnJfaW50ZXJydXB0cyArIDEpKTsKKyAgU0lNX0FTU0VSVCAodHlwZSA+PSAwICYmIHR5cGUgPCBucl93YXRjaHBvaW50X3R5cGVzKTsKKyAgcmV0dXJuIHR5cGU7Cit9CisKK3N0YXRpYyBpbnQKK29wdGlvbl90b19pbnRlcnJ1cHRfbnIgKFNJTV9ERVNDIHNkLAorCQkJaW50IG9wdGlvbikKK3sKKyAgc2ltX3dhdGNocG9pbnRzICp3YXRjaCA9IFNUQVRFX1dBVENIUE9JTlRTIChzZCk7CisgIGludCBpbnRlcnJ1cHRfbnIgPSAoKG9wdGlvbiAtIE9QVElPTl9XQVRDSF9PUCkKKwkJICAgICAgJSAod2F0Y2gtPm5yX2ludGVycnVwdHMgKyAxKSk7CisgIHJldHVybiBpbnRlcnJ1cHRfbnI7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGVfdG9fb3B0aW9uIChTSU1fREVTQyBzZCwKKwkJd2F0Y2hwb2ludF90eXBlIHR5cGUsCisJCWludCBpbnRlcnJ1cHRfbnIpCit7CisgIHNpbV93YXRjaHBvaW50cyAqd2F0Y2ggPSBTVEFURV9XQVRDSFBPSU5UUyAoc2QpOworICByZXR1cm4gKCh0eXBlICogKHdhdGNoLT5ucl9pbnRlcnJ1cHRzICsgMSkpCisJICArIGludGVycnVwdF9ucgorCSAgKyBPUFRJT05fV0FUQ0hfT1ApOworfQorCisKKy8qIERlbGV0ZSBvbmUgb3IgbW9yZSB3YXRjaHBvaW50cy4gIEZhaWwgaWYgbm8gd2F0Y2hwb2ludHMgd2VyZSBmb3VuZCAqLworCitzdGF0aWMgU0lNX1JDCitkb193YXRjaHBvaW50X2RlbGV0ZSAoU0lNX0RFU0Mgc2QsCisJCSAgICAgIGludCBpZGVudCwKKwkJICAgICAgd2F0Y2hwb2ludF90eXBlIHR5cGUpCit7CisgIHNpbV93YXRjaHBvaW50cyAqd2F0Y2ggPSBTVEFURV9XQVRDSFBPSU5UUyAoc2QpOworICBzaW1fd2F0Y2hfcG9pbnQgKiplbnRyeSA9ICZ3YXRjaC0+cG9pbnRzOworICBTSU1fUkMgc3RhdHVzID0gU0lNX1JDX0ZBSUw7CisgIHdoaWxlICgoKmVudHJ5KSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmICgoKmVudHJ5KS0+aWRlbnQgPT0gaWRlbnQKKwkgIHx8ICgqZW50cnkpLT50eXBlID09IHR5cGUpCisJeworCSAgc2ltX3dhdGNoX3BvaW50ICpkZWFkID0gKCplbnRyeSk7CisJICAoKmVudHJ5KSA9ICgqZW50cnkpLT5uZXh0OworCSAgc2ltX2V2ZW50c19kZXNjaGVkdWxlIChzZCwgZGVhZC0+ZXZlbnQpOworCSAgemZyZWUgKGRlYWQpOworCSAgc3RhdHVzID0gU0lNX1JDX09LOworCX0KKyAgICAgIGVsc2UKKwllbnRyeSA9ICYoKmVudHJ5KS0+bmV4dDsKKyAgICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBjaGFyICoKK3dhdGNocG9pbnRfdHlwZV90b19zdHIgKFNJTV9ERVNDIHNkLAorCQkJd2F0Y2hwb2ludF90eXBlIHR5cGUpCit7CisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSAgcGNfd2F0Y2hwb2ludDoKKyAgICAgIHJldHVybiAicGMiOworICAgIGNhc2UgY2xvY2tfd2F0Y2hwb2ludDoKKyAgICAgIHJldHVybiAiY2xvY2siOworICAgIGNhc2UgY3ljbGVzX3dhdGNocG9pbnQ6CisgICAgICByZXR1cm4gImN5Y2xlcyI7CisgICAgY2FzZSBpbnZhbGlkX3dhdGNocG9pbnQ6CisgICAgY2FzZSBucl93YXRjaHBvaW50X3R5cGVzOgorICAgICAgcmV0dXJuICIoaW52YWxpZC10eXBlKSI7CisgICAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNoYXIgKgoraW50ZXJydXB0X25yX3RvX3N0ciAoU0lNX0RFU0Mgc2QsCisJCSAgICAgaW50IGludGVycnVwdF9ucikKK3sKKyAgc2ltX3dhdGNocG9pbnRzICp3YXRjaCA9IFNUQVRFX1dBVENIUE9JTlRTIChzZCk7CisgIGlmIChpbnRlcnJ1cHRfbnIgPCAwKQorICAgIHJldHVybiAiKGludmFsaWQtaW50ZXJydXB0KSI7CisgIGVsc2UgaWYgKGludGVycnVwdF9uciA+PSB3YXRjaC0+bnJfaW50ZXJydXB0cykKKyAgICByZXR1cm4gImJyZWFrcG9pbnQiOworICBlbHNlCisgICAgcmV0dXJuIHdhdGNoLT5pbnRlcnJ1cHRfbmFtZXNbaW50ZXJydXB0X25yXTsKK30KKworCitzdGF0aWMgdm9pZAorZG9fd2F0Y2hwb2ludF9pbmZvIChTSU1fREVTQyBzZCkKK3sKKyAgc2ltX3dhdGNocG9pbnRzICp3YXRjaCA9IFNUQVRFX1dBVENIUE9JTlRTIChzZCk7CisgIHNpbV93YXRjaF9wb2ludCAqcG9pbnQ7CisgIHNpbV9pb19wcmludGYgKHNkLCAiV2F0Y2hwb2ludHM6XG4iKTsKKyAgZm9yIChwb2ludCA9IHdhdGNoLT5wb2ludHM7IHBvaW50ICE9IE5VTEw7IHBvaW50ID0gcG9pbnQtPm5leHQpCisgICAgeworICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICIlM2Q6IHdhdGNoICVzICVzICIsCisJCSAgICAgcG9pbnQtPmlkZW50LAorCQkgICAgIHdhdGNocG9pbnRfdHlwZV90b19zdHIgKHNkLCBwb2ludC0+dHlwZSksCisJCSAgICAgaW50ZXJydXB0X25yX3RvX3N0ciAoc2QsIHBvaW50LT5pbnRlcnJ1cHRfbnIpKTsKKyAgICAgIGlmIChwb2ludC0+aXNfcGVyaW9kaWMpCisJc2ltX2lvX3ByaW50ZiAoc2QsICIrIik7CisgICAgICBpZiAoIXBvaW50LT5pc193aXRoaW4pCisJc2ltX2lvX3ByaW50ZiAoc2QsICIhIik7CisgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIjB4JWx4IiwgcG9pbnQtPmFyZzApOworICAgICAgaWYgKHBvaW50LT5hcmcxICE9IHBvaW50LT5hcmcwKQorCXNpbV9pb19wcmludGYgKHNkLCAiLDB4JWx4IiwgcG9pbnQtPmFyZzEpOworICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJcbiIpOworICAgIH0KK30KKwkJICAgIAorCisKK3N0YXRpYyBzaW1fZXZlbnRfaGFuZGxlciBoYW5kbGVfd2F0Y2hwb2ludDsKKworc3RhdGljIFNJTV9SQworc2NoZWR1bGVfd2F0Y2hwb2ludCAoU0lNX0RFU0Mgc2QsCisJCSAgICAgc2ltX3dhdGNoX3BvaW50ICpwb2ludCkKK3sKKyAgc2ltX3dhdGNocG9pbnRzICp3YXRjaCA9IFNUQVRFX1dBVENIUE9JTlRTIChzZCk7CisgIHN3aXRjaCAocG9pbnQtPnR5cGUpCisgICAgeworICAgIGNhc2UgcGNfd2F0Y2hwb2ludDoKKyAgICAgIHBvaW50LT5ldmVudCA9IHNpbV9ldmVudHNfd2F0Y2hfc2ltIChzZCwKKwkJCQkJICAgd2F0Y2gtPnBjLAorCQkJCQkgICB3YXRjaC0+c2l6ZW9mX3BjLAorCQkJCQkgICAwLyogaG9zdC1lbmRpYW4gKi8sCisJCQkJCSAgIHBvaW50LT5pc193aXRoaW4sCisJCQkJCSAgIHBvaW50LT5hcmcwLCBwb2ludC0+YXJnMSwKKwkJCQkJICAgLyogUEMgaW4gYXJnMC4uYXJnMSAqLworCQkJCQkgICBoYW5kbGVfd2F0Y2hwb2ludCwKKwkJCQkJICAgcG9pbnQpOworICAgICAgcmV0dXJuIFNJTV9SQ19PSzsKKyAgICBjYXNlIGNsb2NrX3dhdGNocG9pbnQ6CisgICAgICBwb2ludC0+ZXZlbnQgPSBzaW1fZXZlbnRzX3dhdGNoX2Nsb2NrIChzZCwKKwkJCQkJICAgICBwb2ludC0+YXJnMCwgLyogbXMgdGltZSAqLworCQkJCQkgICAgIGhhbmRsZV93YXRjaHBvaW50LAorCQkJCQkgICAgIHBvaW50KTsKKyAgICAgIHJldHVybiBTSU1fUkNfT0s7CisgICAgY2FzZSBjeWNsZXNfd2F0Y2hwb2ludDoKKyAgICAgIHBvaW50LT5ldmVudCA9IHNpbV9ldmVudHNfc2NoZWR1bGUgKHNkLAorCQkJCQkgIHBvaW50LT5hcmcwLCAvKiB0aW1lICovCisJCQkJCSAgaGFuZGxlX3dhdGNocG9pbnQsCisJCQkJCSAgcG9pbnQpOworICAgICAgcmV0dXJuIFNJTV9SQ19PSzsKKyAgICBkZWZhdWx0OgorICAgICAgc2ltX2VuZ2luZV9hYm9ydCAoc2QsIE5VTEwsIE5VTExfQ0lBLAorCQkJImhhbmRsZV93YXRjaHBvaW50IC0gaW50ZXJuYWwgZXJyb3IgLSBiYWQgc3dpdGNoIik7CisgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisgICAgfQorICByZXR1cm4gU0lNX1JDX09LOworfQorCisKK3N0YXRpYyB2b2lkCitoYW5kbGVfd2F0Y2hwb2ludCAoU0lNX0RFU0Mgc2QsIHZvaWQgKmRhdGEpCit7CisgIHNpbV93YXRjaHBvaW50cyAqd2F0Y2ggPSBTVEFURV9XQVRDSFBPSU5UUyAoc2QpOworICBzaW1fd2F0Y2hfcG9pbnQgKnBvaW50ID0gKHNpbV93YXRjaF9wb2ludCAqKSBkYXRhOworICBpbnQgaW50ZXJydXB0X25yID0gcG9pbnQtPmludGVycnVwdF9ucjsKKworICBpZiAocG9pbnQtPmlzX3BlcmlvZGljKQorICAgIC8qIHJlc2NoZWR1bGUgdGhpcyBldmVudCBiZWZvcmUgcHJvY2Vzc2luZyBpdCAqLworICAgIHNjaGVkdWxlX3dhdGNocG9pbnQgKHNkLCBwb2ludCk7CisgIGVsc2UKKyAgICBkb193YXRjaHBvaW50X2RlbGV0ZSAoc2QsIHBvaW50LT5pZGVudCwgaW52YWxpZF93YXRjaHBvaW50KTsKKyAgICAKKyAgaWYgKHBvaW50LT5pbnRlcnJ1cHRfbnIgPT0gd2F0Y2gtPm5yX2ludGVycnVwdHMpCisgICAgc2ltX2VuZ2luZV9oYWx0IChzZCwgTlVMTCwgTlVMTCwgTlVMTF9DSUEsIHNpbV9zdG9wcGVkLCBTSU1fU0lHSU5UKTsKKyAgZWxzZQorICAgIHdhdGNoLT5pbnRlcnJ1cHRfaGFuZGxlciAoc2QsICZ3YXRjaC0+aW50ZXJydXB0X25hbWVzW2ludGVycnVwdF9ucl0pOworfQorCisKK3N0YXRpYyBTSU1fUkMKK2RvX3dhdGNocG9pbnRfY3JlYXRlIChTSU1fREVTQyBzZCwKKwkJICAgICAgd2F0Y2hwb2ludF90eXBlIHR5cGUsCisJCSAgICAgIGludCBvcHQsCisJCSAgICAgIGNoYXIgKmFyZykKK3sKKyAgc2ltX3dhdGNocG9pbnRzICp3YXRjaCA9IFNUQVRFX1dBVENIUE9JTlRTIChzZCk7CisgIHNpbV93YXRjaF9wb2ludCAqKnBvaW50OworCisgIC8qIGNyZWF0ZSB0aGUgd2F0Y2hwb2ludCAqLworICBwb2ludCA9ICZ3YXRjaC0+cG9pbnRzOworICB3aGlsZSAoKCpwb2ludCkgIT0gTlVMTCkKKyAgICBwb2ludCA9ICYoKnBvaW50KS0+bmV4dDsKKyAgKCpwb2ludCkgPSBaQUxMT0MgKHNpbV93YXRjaF9wb2ludCk7CisKKyAgLyogZmlsbCBpbiB0aGUgZGV0YWlscyAqLworICAoKnBvaW50KS0+aWRlbnQgPSArKyh3YXRjaC0+bGFzdF9wb2ludF9ucik7CisgICgqcG9pbnQpLT50eXBlID0gb3B0aW9uX3RvX3R5cGUgKHNkLCBvcHQpOworICAoKnBvaW50KS0+aW50ZXJydXB0X25yID0gb3B0aW9uX3RvX2ludGVycnVwdF9uciAoc2QsIG9wdCk7CisgIC8qIHByZWZpeGVzIHRvIGFyZyAtICs9PSBwZXJpb2RpYywgIT09bm90IG9yIG91dHNpZGUgKi8KKyAgKCpwb2ludCktPmlzX3dpdGhpbiA9IDE7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGlmIChhcmdbMF0gPT0gJysnKQorCSgqcG9pbnQpLT5pc19wZXJpb2RpYyA9IDE7CisgICAgICBlbHNlIGlmIChhcmdbMF0gPT0gJyEnKQorCSgqcG9pbnQpLT5pc193aXRoaW4gPSAwOworICAgICAgZWxzZQorCWJyZWFrOworICAgICAgYXJnKys7CisgICAgfQorCQorICAoKnBvaW50KS0+YXJnMCA9IHN0cnRvdWwgKGFyZywgJmFyZywgMCk7CisgIGlmIChhcmdbMF0gPT0gJywnKQorICAgICgqcG9pbnQpLT5hcmcwID0gc3RydG91bCAoYXJnLCBOVUxMLCAwKTsKKyAgZWxzZQorICAgICgqcG9pbnQpLT5hcmcxID0gKCpwb2ludCktPmFyZzA7CisKKyAgLyogc2NoZWR1bGUgaXQgKi8KKyAgc2NoZWR1bGVfd2F0Y2hwb2ludCAoc2QsICgqcG9pbnQpKTsKKworICByZXR1cm4gU0lNX1JDX09LOworfQorCisKK3N0YXRpYyBTSU1fUkMKK3dhdGNocG9pbnRfb3B0aW9uX2hhbmRsZXIgKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGludCBvcHQsCisJCQkgICBjaGFyICphcmcsIGludCBpc19jb21tYW5kKQoreworICBpZiAob3B0ID49IE9QVElPTl9XQVRDSF9PUCkKKyAgICByZXR1cm4gZG9fd2F0Y2hwb2ludF9jcmVhdGUgKHNkLCBjbG9ja193YXRjaHBvaW50LCBvcHQsIGFyZyk7CisgIGVsc2UKKyAgICBzd2l0Y2ggKG9wdCkKKyAgICAgIHsKKwkKKyAgICAgIGNhc2UgT1BUSU9OX1dBVENIX0RFTEVURToKKwlpZiAoaXNkaWdpdCAoKGludCkgYXJnWzBdKSkKKwkgIHsKKwkgICAgaW50IGlkZW50ID0gc3RydG9sIChhcmcsIE5VTEwsIDApOworCSAgICBpZiAoZG9fd2F0Y2hwb2ludF9kZWxldGUgKHNkLCBpZGVudCwgaW52YWxpZF93YXRjaHBvaW50KQorCQkhPSBTSU1fUkNfT0spCisJICAgICAgeworCQlzaW1faW9fZXByaW50ZiAoc2QsICJXYXRjaHBvaW50ICVkIG5vdCBmb3VuZFxuIiwgaWRlbnQpOworCQlyZXR1cm4gU0lNX1JDX0ZBSUw7CisJICAgICAgfQorCSAgICByZXR1cm4gU0lNX1JDX09LOworCSAgfQorCWVsc2UgaWYgKHN0cmNhc2VjbXAgKGFyZywgImFsbCIpID09IDApCisJICB7CisJICAgIHdhdGNocG9pbnRfdHlwZSB0eXBlOworCSAgICBmb3IgKHR5cGUgPSBpbnZhbGlkX3dhdGNocG9pbnQgKyAxOworCQkgdHlwZSA8IG5yX3dhdGNocG9pbnRfdHlwZXM7CisJCSB0eXBlKyspCisJICAgICAgeworCQlkb193YXRjaHBvaW50X2RlbGV0ZSAoc2QsIDAsIHR5cGUpOworCSAgICAgIH0KKwkgICAgcmV0dXJuIFNJTV9SQ19PSzsKKwkgIH0KKwllbHNlIGlmIChzdHJjYXNlY21wIChhcmcsICJwYyIpID09IDApCisJICB7CisJICAgIGlmIChkb193YXRjaHBvaW50X2RlbGV0ZSAoc2QsIDAsIHBjX3dhdGNocG9pbnQpCisJCSE9IFNJTV9SQ19PSykKKwkgICAgICB7CisJCXNpbV9pb19lcHJpbnRmIChzZCwgIk5vIFBDIHdhdGNocG9pbnRzIGZvdW5kXG4iKTsKKwkJcmV0dXJuIFNJTV9SQ19GQUlMOworCSAgICAgIH0KKwkgICAgcmV0dXJuIFNJTV9SQ19PSzsKKwkgIH0KKwllbHNlIGlmIChzdHJjYXNlY21wIChhcmcsICJjbG9jayIpID09IDApCisJICB7CisJICAgIGlmIChkb193YXRjaHBvaW50X2RlbGV0ZSAoc2QsIDAsIGNsb2NrX3dhdGNocG9pbnQpICE9IFNJTV9SQ19PSykKKwkgICAgICB7CisJCXNpbV9pb19lcHJpbnRmIChzZCwgIk5vIENMT0NLIHdhdGNocG9pbnRzIGZvdW5kXG4iKTsKKwkJcmV0dXJuIFNJTV9SQ19GQUlMOworCSAgICAgIH0KKwkgICAgcmV0dXJuIFNJTV9SQ19PSzsKKwkgIH0KKwllbHNlIGlmIChzdHJjYXNlY21wIChhcmcsICJjeWNsZXMiKSA9PSAwKQorCSAgeworCSAgICBpZiAoZG9fd2F0Y2hwb2ludF9kZWxldGUgKHNkLCAwLCBjeWNsZXNfd2F0Y2hwb2ludCkgIT0gU0lNX1JDX09LKQorCSAgICAgIHsKKwkJc2ltX2lvX2VwcmludGYgKHNkLCAiTm8gQ1lDTEVTIHdhdGNocG9pbnRzIGZvdW5kXG4iKTsKKwkJcmV0dXJuIFNJTV9SQ19GQUlMOworCSAgICAgIH0KKwkgICAgcmV0dXJuIFNJTV9SQ19PSzsKKwkgIH0KKwlzaW1faW9fZXByaW50ZiAoc2QsICJVbmtub3duIHdhdGNocG9pbnQgdHlwZSBgJXMnXG4iLCBhcmcpOworCXJldHVybiBTSU1fUkNfRkFJTDsKKwkKKyAgICAgIGNhc2UgT1BUSU9OX1dBVENIX0lORk86CisJeworCSAgZG9fd2F0Y2hwb2ludF9pbmZvIChzZCk7CisJICByZXR1cm4gU0lNX1JDX09LOworCX0KKyAgICAgIAorICAgICAgZGVmYXVsdDoKKwlzaW1faW9fZXByaW50ZiAoc2QsICJVbmtub3duIHdhdGNoIG9wdGlvbiAlZFxuIiwgb3B0KTsKKwlyZXR1cm4gU0lNX1JDX0ZBSUw7CisJCisgICAgICB9CisgIAorfQorCisKK3N0YXRpYyBTSU1fUkMKK3NpbV93YXRjaHBvaW50X2luaXQgKFNJTV9ERVNDIHNkKQoreworICBzaW1fd2F0Y2hwb2ludHMgKndhdGNoID0gU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKTsKKyAgc2ltX3dhdGNoX3BvaW50ICpwb2ludDsKKyAgLyogTk9URTogRG8gbm90IG5lZWQgdG8gZGUtc2NoZWR1bGUgYW55IHByZXZpb3VzIHdhdGNocG9pbnRzIGFzCisgICAgIHNpbS1ldmVudHMgaGFzIGFscmVhZHkgZG9uZSB0aGlzICovCisgIC8qIHNjaGVkdWxlIGFueSB3YXRjaHBvaW50cyBlbmFibGVkIGJ5IGNvbW1hbmQgbGluZSBvcHRpb25zICovCisgIGZvciAocG9pbnQgPSB3YXRjaC0+cG9pbnRzOyBwb2ludCAhPSBOVUxMOyBwb2ludCA9IHBvaW50LT5uZXh0KQorICAgIHsKKyAgICAgIHNjaGVkdWxlX3dhdGNocG9pbnQgKHNkLCBwb2ludCk7CisgICAgfQorICByZXR1cm4gU0lNX1JDX09LOworfQorCisKK3N0YXRpYyBjb25zdCBPUFRJT04gd2F0Y2hwb2ludF9vcHRpb25zW10gPQoreworICB7IHsid2F0Y2gtZGVsZXRlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVRDSF9ERUxFVEUgfSwKKyAgICAgICdcMCcsICJJREVOVHxhbGx8cGN8Y3ljbGVzfGNsb2NrIiwgIkRlbGV0ZSBhIHdhdGNocG9pbnQiLAorICAgICAgd2F0Y2hwb2ludF9vcHRpb25faGFuZGxlciB9LAorCisgIHsgeyJ3YXRjaC1pbmZvIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVRDSF9JTkZPIH0sCisgICAgICAnXDAnLCBOVUxMLCAiTGlzdCBzY2hlZHVsZWQgd2F0Y2hwb2ludHMiLAorICAgICAgd2F0Y2hwb2ludF9vcHRpb25faGFuZGxlciB9LAorCisgIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfSwgJ1wwJywgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCitzdGF0aWMgY2hhciAqZGVmYXVsdF9pbnRlcnJ1cHRfbmFtZXNbXSA9IHsgImludCIsIDAsIH07CisKKworCitTSU1fUkMKK3NpbV93YXRjaHBvaW50X2luc3RhbGwgKFNJTV9ERVNDIHNkKQoreworICBzaW1fd2F0Y2hwb2ludHMgKndhdGNoID0gU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKTsKKyAgU0lNX0FTU0VSVCAoU1RBVEVfTUFHSUMgKHNkKSA9PSBTSU1fTUFHSUNfTlVNQkVSKTsKKyAgLyogdGhlIGJhc2ljIGNvbW1hbmQgc2V0ICovCisgIHNpbV9tb2R1bGVfYWRkX2luaXRfZm4gKHNkLCBzaW1fd2F0Y2hwb2ludF9pbml0KTsKKyAgc2ltX2FkZF9vcHRpb25fdGFibGUgKHNkLCBOVUxMLCB3YXRjaHBvaW50X29wdGlvbnMpOworICAvKiBmaWxsIGluIHNvbWUgZGV0YWlscyAqLworICBpZiAod2F0Y2gtPmludGVycnVwdF9uYW1lcyA9PSBOVUxMKQorICAgIHdhdGNoLT5pbnRlcnJ1cHRfbmFtZXMgPSBkZWZhdWx0X2ludGVycnVwdF9uYW1lczsKKyAgd2F0Y2gtPm5yX2ludGVycnVwdHMgPSAwOworICB3aGlsZSAod2F0Y2gtPmludGVycnVwdF9uYW1lc1t3YXRjaC0+bnJfaW50ZXJydXB0c10gIT0gTlVMTCkKKyAgICB3YXRjaC0+bnJfaW50ZXJydXB0cysrOworICAvKiBnZW5lcmF0ZSBtb3JlIGFkdmFuc2VkIGNvbW1hbmRzICovCisgIHsKKyAgICBPUFRJT04gKmludF9vcHRpb25zID0gTlpBTExPQyAoT1BUSU9OLCAxICsgKHdhdGNoLT5ucl9pbnRlcnJ1cHRzICsgMSkgKiBucl93YXRjaHBvaW50X3R5cGVzKTsKKyAgICBpbnQgaW50ZXJydXB0X25yOworICAgIGZvciAoaW50ZXJydXB0X25yID0gMDsgaW50ZXJydXB0X25yIDw9IHdhdGNoLT5ucl9pbnRlcnJ1cHRzOyBpbnRlcnJ1cHRfbnIrKykKKyAgICAgIHsKKwl3YXRjaHBvaW50X3R5cGUgdHlwZTsKKwlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgbnJfd2F0Y2hwb2ludF90eXBlczsgdHlwZSsrKQorCSAgeworCSAgICBjaGFyICpuYW1lOworCSAgICBpbnQgbnIgPSBpbnRlcnJ1cHRfbnIgKiBucl93YXRjaHBvaW50X3R5cGVzICsgdHlwZTsKKwkgICAgT1BUSU9OICpvcHRpb24gPSAmaW50X29wdGlvbnNbbnJdOworCSAgICBhc3ByaW50ZiAoJm5hbWUsICJ3YXRjaC0lcy0lcyIsCisJCSAgICAgIHdhdGNocG9pbnRfdHlwZV90b19zdHIgKHNkLCB0eXBlKSwKKwkJICAgICAgaW50ZXJydXB0X25yX3RvX3N0ciAoc2QsIGludGVycnVwdF9ucikpOworCSAgICBvcHRpb24tPm9wdC5uYW1lID0gbmFtZTsKKwkgICAgb3B0aW9uLT5vcHQuaGFzX2FyZyA9IHJlcXVpcmVkX2FyZ3VtZW50OworCSAgICBvcHRpb24tPm9wdC52YWwgPSB0eXBlX3RvX29wdGlvbiAoc2QsIHR5cGUsIGludGVycnVwdF9ucik7CisJICAgIG9wdGlvbi0+ZG9jID0gIiI7CisJICAgIG9wdGlvbi0+ZG9jX25hbWUgPSAiIjsKKwkgICAgb3B0aW9uLT5oYW5kbGVyID0gd2F0Y2hwb2ludF9vcHRpb25faGFuZGxlcjsKKwkgIH0KKyAgICAgIH0KKyAgICAvKiBhZGp1c3QgZmlyc3QgZmV3IGVudHJpZXMgc28gdGhhdCB0aGV5IGNvbnRhaW4gcmVhbAorICAgICAgIGRvY3VtZW50YXRpb24sIHRoZSBmaXJzdCBlbnRyeSBpbmNsdWRlcyBhIGxpc3Qgb2YgYWN0aW9ucy4gKi8KKyAgICB7CisgICAgICBjaGFyICpwcmVmaXggPSAKKwkiV2F0Y2ggdGhlIHNpbXVsYXRvciwgdGFrZSBBQ1RJT04gaW4gQ09VTlQgY3ljbGVzIChgKycgZm9yIGV2ZXJ5IENPVU5UIGN5Y2xlcyksIEFDVElPTiBpcyI7CisgICAgICBjaGFyICpkb2M7CisgICAgICBpbnQgbGVuID0gc3RybGVuIChwcmVmaXgpICsgMTsKKyAgICAgIGZvciAoaW50ZXJydXB0X25yID0gMDsgaW50ZXJydXB0X25yIDw9IHdhdGNoLT5ucl9pbnRlcnJ1cHRzOyBpbnRlcnJ1cHRfbnIrKykKKwlsZW4gKz0gc3RybGVuIChpbnRlcnJ1cHRfbnJfdG9fc3RyIChzZCwgaW50ZXJydXB0X25yKSkgKyAxOworICAgICAgZG9jID0gTlpBTExPQyAoY2hhciwgbGVuKTsKKyAgICAgIHN0cmNweSAoZG9jLCBwcmVmaXgpOworICAgICAgZm9yIChpbnRlcnJ1cHRfbnIgPSAwOyBpbnRlcnJ1cHRfbnIgPD0gd2F0Y2gtPm5yX2ludGVycnVwdHM7IGludGVycnVwdF9ucisrKQorCXsKKwkgIHN0cmNhdCAoZG9jLCAiICIpOworCSAgc3RyY2F0IChkb2MsIGludGVycnVwdF9ucl90b19zdHIgKHNkLCBpbnRlcnJ1cHRfbnIpKTsKKwl9CisgICAgICBpbnRfb3B0aW9uc1swXS5kb2NfbmFtZSA9ICJ3YXRjaC1jeWNsZXMtQUNUSU9OIjsKKyAgICAgIGludF9vcHRpb25zWzBdLmFyZyA9ICJbK11DT1VOVCI7CisgICAgICBpbnRfb3B0aW9uc1swXS5kb2MgPSBkb2M7CisgICAgfQorICAgIGludF9vcHRpb25zWzFdLmRvY19uYW1lID0gIndhdGNoLXBjLUFDVElPTiI7CisgICAgaW50X29wdGlvbnNbMV0uYXJnID0gIlshXUFERFJFU1MiOworICAgIGludF9vcHRpb25zWzFdLmRvYyA9CisgICAgICAiV2F0Y2ggdGhlIFBDLCB0YWtlIEFDVElPTiB3aGVuIG1hdGNoZXMgQUREUkVTUyAoaW4gcmFuZ2UgQUREUkVTUyxBRERSRVNTKSwgYCEnIG5lZ2F0ZXMgdGVzdCI7CisgICAgaW50X29wdGlvbnNbMl0uZG9jX25hbWUgPSAid2F0Y2gtY2xvY2stQUNUSU9OIjsKKyAgICBpbnRfb3B0aW9uc1syXS5hcmcgPSAiWytdTUlMTElTRUNPTkRTIjsKKyAgICBpbnRfb3B0aW9uc1syXS5kb2MgPQorICAgICAgIldhdGNoIHRoZSBjbG9jaywgdGFrZSBBQ1RJT04gYWZ0ZXIgTUlMTElTRUNPTkRTIChgKycgZm9yIGV2ZXJ5IE1JTExJU0VDT05EUykiOworCisgICAgc2ltX2FkZF9vcHRpb25fdGFibGUgKHNkLCBOVUxMLCBpbnRfb3B0aW9ucyk7CisgIH0KKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KZGlmZiAtLWdpdCBhL3NpbS9jb21tb24vc2ltLXdhdGNoLmggYi9zaW0vY29tbW9uL3NpbS13YXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOTIwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vY29tbW9uL3NpbS13YXRjaC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qIFNpbXVsYXRvciB3YXRjaHBvaW50IHN1cHBvcnQuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNpZm5kZWYgU0lNX1dBVENIX0gKKyNkZWZpbmUgU0lNX1dBVENIX0gKKwordHlwZWRlZiBlbnVtIHsKKyAgaW52YWxpZF93YXRjaHBvaW50ID0gLTEsCisgIHBjX3dhdGNocG9pbnQsCisgIGNsb2NrX3dhdGNocG9pbnQsCisgIGN5Y2xlc193YXRjaHBvaW50LAorICBucl93YXRjaHBvaW50X3R5cGVzLAorfSB3YXRjaHBvaW50X3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IF9zaW1fd2F0Y2hfcG9pbnQgc2ltX3dhdGNoX3BvaW50Oworc3RydWN0IF9zaW1fd2F0Y2hfcG9pbnQgeworICBpbnQgaWRlbnQ7CisgIHdhdGNocG9pbnRfdHlwZSB0eXBlOworICBpbnQgaW50ZXJydXB0X25yOyAvKiA9PSBucl9pbnRlcnJ1cHRzIC0+IGJyZWFrcG9pbnQgKi8KKyAgaW50IGlzX3BlcmlvZGljOworICBpbnQgaXNfd2l0aGluOworICB1bnNpZ25lZCBsb25nIGFyZzA7CisgIHVuc2lnbmVkIGxvbmcgYXJnMTsKKyAgc2ltX2V2ZW50ICpldmVudDsKKyAgc2ltX3dhdGNoX3BvaW50ICpuZXh0OworfTsKKworCit0eXBlZGVmIHN0cnVjdCBfc2ltX3dhdGNocG9pbnRzIHsKKworICAvKiBQb2ludGVyIGludG8gdGhlIGhvc3QncyBkYXRhIHN0cnVjdHVyZXMgc3BlY2lmeWluZyB0aGUKKyAgICAgYWRkcmVzcy9zaXplIG9mIHRoZSBwcm9ncmFtLWNvdW50ZXIgKi8KKyAgLyogRklYTUU6IEluIHRoZSBmdXR1cmUgdGhpcyBzaGFsbCBiZSBnZW5lcmFsaXplZCBzbyB0aGF0IGFueSBvZiB0aGUKKyAgICAgTiBwcm9jZXNzb3JzIE0gcmVnaXN0ZXJzIGNhbiBiZSB3YXRjaGVkICovCisgIHZvaWQgKnBjOworICBpbnQgc2l6ZW9mX3BjOworCisgIC8qIFBvaW50ZXIgdG8gdGhlIGhhbmRsZXIgZm9yIGludGVycnVwdCB3YXRjaHBvaW50cyAqLworICAvKiBGSVhNRTogY2FuIHRoaXMgYmUgZG9uZSBiZXR0ZXI/ICovCisgIC8qIE5PVEU6IEZvciB0aGUgREFUQSBhcmcsIHRoZSBoYW5kbGVyIGlzIHBhc3NlZCBhIChjaGFyKiopIHBvaW50ZXIKKyAgICAgdGhhdCBpcyBhbiBvZmZzZXQgaW50byB0aGUgSU5URVJSVVBUX05BTUVTIHZlY3Rvci4gIFVzZQorICAgICBhcml0aG1ldGljIHRvIGRldGVybWluZSB0aGUgaW50ZXJydXB0LW5yLiAqLworICBzaW1fZXZlbnRfaGFuZGxlciAqaW50ZXJydXB0X2hhbmRsZXI7CisKKyAgLyogUG9pbnRlciB0byBhIG51bGwgdGVybWluYXRlZCBsaXN0IG9mIGludGVycnVwdCBuYW1lcyAqLworICAvKiBGSVhNRTogY2FuIHRoaXMgYmUgZG9uZSBiZXR0ZXI/ICBMb29rIGF0IHRoZSBQUEMncyBpbnRlcnJ1cHQKKyAgICAgbWVjaGFuaXNtIGFuZCB0YWJsZSBmb3IgYSByb3VnaCBpZGVhIG9mIHdoZXJlIGl0IHdpbGwgZ28gbmV4dCAqLworICBpbnQgbnJfaW50ZXJydXB0czsKKyAgY2hhciAqKmludGVycnVwdF9uYW1lczsKKworICAvKiBhY3RpdmUgd2F0Y2hwb2ludHMgKi8KKyAgaW50IGxhc3RfcG9pbnRfbnI7CisgIHNpbV93YXRjaF9wb2ludCAqcG9pbnRzOworCit9IHNpbV93YXRjaHBvaW50czsKKworLyogV2F0Y2ggaW5zdGFsbCBoYW5kbGVyLiAgKi8KK01PRFVMRV9JTlNUQUxMX0ZOIHNpbV93YXRjaHBvaW50X2luc3RhbGw7CisKKyNlbmRpZiAvKiBTSU1fV0FUQ0hfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2NvbW1vbi9zeXNjYWxsLmMgYi9zaW0vY29tbW9uL3N5c2NhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGEzYjg4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbW1vbi9zeXNjYWxsLmMKQEAgLTAsMCArMSw0ODIgQEAKKy8qIFJlbW90ZSB0YXJnZXQgc3lzdGVtIGNhbGwgc3VwcG9ydC4KKyAgIENvcHlyaWdodCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIFRoaXMgaW50ZXJmYWNlIGlzbid0IGludGVuZGVkIHRvIGJlIHNwZWNpZmljIHRvIGFueSBwYXJ0aWN1bGFyIGtpbmQKKyAgIG9mIHJlbW90ZSAoaGFyZHdhcmUsIHNpbXVsYXRvciwgd2hhdGV2ZXIpLiAgQXMgc3VjaCwgc3VwcG9ydCBmb3IgaXQKKyAgIChlLmcuIHNpbS9jb21tb24vY2FsbGJhY2suYykgc2hvdWxkICpub3QqIGxpdmUgaW4gdGhlIHNpbXVsYXRvciBzb3VyY2UKKyAgIHRyZWUsIG5vciBzaG91bGQgaXQgbGl2ZSBpbiB0aGUgZ2RiIHNvdXJjZSB0cmVlLiAgSyZSIEMgbXVzdCBiZQorICAgc3VwcG9ydGVkLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaWZkZWYgQU5TSV9QUk9UT1RZUEVTCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjZWxzZQorI2luY2x1ZGUgPHZhcmFyZ3MuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAidGFyZy12YWxzLmgiCisKKyNpZm5kZWYgRU5PU1lTCisjZGVmaW5lIEVOT1NZUyBFSU5WQUwKKyNlbmRpZgorI2lmbmRlZiBFTkFNRVRPT0xPTkcKKyNkZWZpbmUgRU5BTUVUT09MT05HIEVJTlZBTAorI2VuZGlmCisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIGEgcGF0aCBuYW1lLiAgKi8KKyNpZm5kZWYgTUFYX1BBVEhfTEVOCisjZGVmaW5lIE1BWF9QQVRIX0xFTiAxMDI0CisjZW5kaWYKKworLyogV2hlbiBkb2luZyBmaWxlIHJlYWQvd3JpdGVzLCBkbyB0aGlzIG1hbnkgYnl0ZXMgYXQgYSB0aW1lLiAgKi8KKyNkZWZpbmUgRklMRV9YRlJfU0laRSA0MDk2CisKKy8qIEZJWE1FOiBmb3Igbm93LCBuZWVkIHRvIGNvbnNpZGVyIHRhcmdldCB3b3JkIHNpemUuICAqLworI2RlZmluZSBUV09SRCBsb25nCisjZGVmaW5lIFRBRERSIHVuc2lnbmVkIGxvbmcKKworLyogVXRpbGl0eSBvZiBjYl9zeXNjYWxsIHRvIGZldGNoIGEgcGF0aCBuYW1lIG9yIG90aGVyIHN0cmluZyBmcm9tIHRoZSB0YXJnZXQuCisgICBUaGUgcmVzdWx0IGlzIDAgZm9yIHN1Y2Nlc3Mgb3IgYSBob3N0IGVycm5vIHZhbHVlLiAgKi8KKworc3RhdGljIGludAorZ2V0X3N0cmluZyAoY2IsIHNjLCBidWYsIGJ1ZmxlbiwgYWRkcikKKyAgICAgaG9zdF9jYWxsYmFjayAqY2I7CisgICAgIENCX1NZU0NBTEwgKnNjOworICAgICBjaGFyICpidWY7CisgICAgIGludCBidWZsZW47CisgICAgIFRBRERSIGFkZHI7Cit7CisgIGNoYXIgKnAsICpwZW5kOworCisgIGZvciAocCA9IGJ1ZiwgcGVuZCA9IGJ1ZiArIGJ1ZmxlbjsgcCA8IHBlbmQ7ICsrcCwgKythZGRyKQorICAgIHsKKyAgICAgIC8qIE5vLCBpdCBpc24ndCBleHBlY3RlZCB0aGF0IHRoaXMgd291bGQgY2F1c2Ugb25lIHRyYW5zYWN0aW9uIHdpdGgKKwkgdGhlIHJlbW90ZSB0YXJnZXQgZm9yIGVhY2ggYnl0ZS4gIFRoZSB0YXJnZXQgY291bGQgc2VuZCB0aGUKKwkgcGF0aCBuYW1lIGFsb25nIHdpdGggdGhlIHN5c2NhbGwgcmVxdWVzdCwgYW5kIGNhY2hlIHRoZSBmaWxlCisJIG5hbWUgc29tZXdoZXJlIChvciBvdGhlcndpc2UgdHdlYWsgdGhpcyBhcyBkZXNpcmVkKS4gICovCisgICAgICB1bnNpZ25lZCBpbnQgY291bnQgPSAoKnNjLT5yZWFkX21lbSkgKGNiLCBzYywgYWRkciwgcCwgMSk7CisJCQkJICAgIAorICAgICAgaWYgKGNvdW50ICE9IDEpCisJcmV0dXJuIEVJTlZBTDsKKyAgICAgIGlmICgqcCA9PSAwKQorCWJyZWFrOworICAgIH0KKyAgaWYgKHAgPT0gcGVuZCkKKyAgICByZXR1cm4gRU5BTUVUT09MT05HOworICByZXR1cm4gMDsKK30KKworLyogVXRpbGl0eSBvZiBjYl9zeXNjYWxsIHRvIGZldGNoIGEgcGF0aCBuYW1lLgorICAgVGhlIGJ1ZmZlciBpcyBtYWxsb2MnZCBhbmQgdGhlIGFkZHJlc3MgaXMgc3RvcmVkIGluIEJVRlAuCisgICBUaGUgcmVzdWx0IGlzIHRoYXQgb2YgZ2V0X3N0cmluZy4KKyAgIElmIGFuIGVycm9yIG9jY3Vycywgbm8gYnVmZmVyIGlzIGxlZnQgbWFsbG9jJ2QuICAqLworCitzdGF0aWMgaW50CitnZXRfcGF0aCAoY2IsIHNjLCBhZGRyLCBidWZwKQorICAgICBob3N0X2NhbGxiYWNrICpjYjsKKyAgICAgQ0JfU1lTQ0FMTCAqc2M7CisgICAgIFRBRERSIGFkZHI7CisgICAgIGNoYXIgKipidWZwOworeworICBjaGFyICpidWYgPSB4bWFsbG9jIChNQVhfUEFUSF9MRU4pOworICBpbnQgcmVzdWx0OworCisgIHJlc3VsdCA9IGdldF9zdHJpbmcgKGNiLCBzYywgYnVmLCBNQVhfUEFUSF9MRU4sIGFkZHIpOworICBpZiAocmVzdWx0ID09IDApCisgICAgKmJ1ZnAgPSBidWY7CisgIGVsc2UKKyAgICBmcmVlIChidWYpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBQZXJmb3JtIGEgc3lzdGVtIGNhbGwgb24gYmVoYWxmIG9mIHRoZSB0YXJnZXQuICAqLworCitDQl9SQworY2Jfc3lzY2FsbCAoY2IsIHNjKQorICAgICBob3N0X2NhbGxiYWNrICpjYjsKKyAgICAgQ0JfU1lTQ0FMTCAqc2M7Cit7CisgIFRXT1JEIHJlc3VsdCA9IDAsIGVycmNvZGUgPSAwOworCisgIGlmIChzYy0+bWFnaWMgIT0gQ0JfU1lTQ0FMTF9NQUdJQykKKyAgICBhYm9ydCAoKTsKKworICBzd2l0Y2ggKGNiX3RhcmdldF90b19ob3N0X3N5c2NhbGwgKGNiLCBzYy0+ZnVuYykpCisgICAgeworI2lmIDAgLyogRklYTUU6IHdpcCAqLworICAgIGNhc2UgQ0JfU1lTX2FyZ3ZsZW4gOgorICAgICAgeworCS8qIENvbXB1dGUgaG93IG11Y2ggc3BhY2UgaXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIGFyZ3YsZW52cAorCSAgIHN0cmluZ3Mgc28gdGhhdCB0aGUgcHJvZ3JhbSBjYW4gYWxsb2NhdGUgdGhlIHNwYWNlIGFuZCB0aGVuCisJICAgY2FsbCBTWVNfYXJndiB0byBmZXRjaCB0aGUgdmFsdWVzLiAgKi8KKwlpbnQgYWRkcl9zaXplID0gY2ItPmFkZHJfc2l6ZTsKKwlpbnQgYXJnYyxlbnZjLGFyZ2xlbixlbnZsZW47CisJY29uc3QgY2hhciAqKmFyZ3YgPSBjYi0+aW5pdF9hcmd2OworCWNvbnN0IGNoYXIgKiplbnZwID0gY2ItPmluaXRfZW52cDsKKworCWFyZ2MgPSBhcmdsZW4gPSAwOworCWlmIChhcmd2KQorCSAgeworCSAgICBmb3IgKCA7IGFyZ3ZbYXJnY107ICsrYXJnYykKKwkgICAgICBhcmdsZW4gKz0gc3RybGVuIChhcmd2W2FyZ2NdKSArIDE7CisJICB9CisJZW52YyA9IGVudmxlbiA9IDA7CisJaWYgKGVudnApCisJICB7CisJICAgIGZvciAoIDsgZW52cFtlbnZjXTsgKytlbnZjKQorCSAgICAgIGVudmxlbiArPSBzdHJsZW4gKGVudnBbZW52Y10pICsgMTsKKwkgIH0KKwlyZXN1bHQgPSBhcmdsZW4gKyBlbnZsZW47CisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIENCX1NZU19hcmd2IDoKKyAgICAgIHsKKwkvKiBQb2ludGVyIHRvIHRhcmdldCdzIGJ1ZmZlci4gICovCisJVEFERFIgdGJ1ZiA9IHNjLT5hcmcxOworCS8qIEJ1ZmZlciBzaXplLiAgKi8KKwlpbnQgYnVmc2l6ZSA9IHNjLT5hcmcyOworCS8qIFEgaXMgdGhlIHRhcmdldCBhZGRyZXNzIG9mIHdoZXJlIGFsbCB0aGUgc3RyaW5ncyBnby4gICovCisJVEFERFIgcTsKKwlpbnQgd29yZF9zaXplID0gY2ItPndvcmRfc2l6ZTsKKwlpbnQgaSxhcmdjLGVudmMsbGVuOworCWNvbnN0IGNoYXIgKiphcmd2ID0gY2ItPmluaXRfYXJndjsKKwljb25zdCBjaGFyICoqZW52cCA9IGNiLT5pbml0X2VudnA7CisKKwlhcmdjID0gMDsKKwlpZiAoYXJndikKKwkgIHsKKwkgICAgZm9yICggOyBhcmd2W2FyZ2NdOyArK2FyZ2MpCisJICAgICAgeworCQlpbnQgbGVuID0gc3RybGVuIChhcmd2W2FyZ2NdKTsKKwkJaW50IHdyaXR0ZW4gPSAoKnNjLT53cml0ZV9tZW0pIChjYiwgc2MsIHRidWYsIGFyZ3ZbYXJnY10sIGxlbiArIDEpOworCQlpZiAod3JpdHRlbiAhPSBsZW4pCisJCSAgeworCQkgICAgcmVzdWx0ID0gLTE7CisJCSAgICBlcnJjb2RlID0gRUlOVkFMOworCQkgICAgZ290byBGaW5pc2hTeXNjYWxsOworCQkgIH0KKwkJdGJ1ZiA9IGxlbiArIDE7CisJICAgICAgfQorCSAgfQorCWlmICgoKnNjLT53cml0ZV9tZW0pIChjYiwgc2MsIHRidWYsICIiLCAxKSAhPSAxKQorCSAgeworCSAgICByZXN1bHQgPSAtMTsKKwkgICAgZXJyY29kZSA9IEVJTlZBTDsKKwkgICAgZ290byBGaW5pc2hTeXNjYWxsOworCSAgfQorCXRidWYrKzsKKwllbnZjID0gMDsKKwlpZiAoZW52cCkKKwkgIHsKKwkgICAgZm9yICggOyBlbnZwW2VudmNdOyArK2VudmMpCisJICAgICAgeworCQlpbnQgbGVuID0gc3RybGVuIChlbnZwW2VudmNdKTsKKwkJaW50IHdyaXR0ZW4gPSAoKnNjLT53cml0ZV9tZW0pIChjYiwgc2MsIHRidWYsIGVudnBbZW52Y10sIGxlbiArIDEpOworCQlpZiAod3JpdHRlbiAhPSBsZW4pCisJCSAgeworCQkgICAgcmVzdWx0ID0gLTE7CisJCSAgICBlcnJjb2RlID0gRUlOVkFMOworCQkgICAgZ290byBGaW5pc2hTeXNjYWxsOworCQkgIH0KKwkJdGJ1ZiA9IGxlbiArIDE7CisJICAgICAgfQorCSAgfQorCWlmICgoKnNjLT53cml0ZV9tZW0pIChjYiwgc2MsIHRidWYsICIiLCAxKSAhPSAxKQorCSAgeworCSAgICByZXN1bHQgPSAtMTsKKwkgICAgZXJyY29kZSA9IEVJTlZBTDsKKwkgICAgZ290byBGaW5pc2hTeXNjYWxsOworCSAgfQorCXJlc3VsdCA9IGFyZ2M7CisJc2MtPnJlc3VsdDIgPSBlbnZjOworCWJyZWFrOworICAgICAgfQorI2VuZGlmIC8qIHdpcCAqLworCisgICAgY2FzZSBDQl9TWVNfZXhpdCA6CisgICAgICAvKiBDYWxsZXIgbXVzdCBjYXRjaCBhbmQgaGFuZGxlLiAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDQl9TWVNfb3BlbiA6CisgICAgICB7CisJY2hhciAqcGF0aDsKKworCWVycmNvZGUgPSBnZXRfcGF0aCAoY2IsIHNjLCBzYy0+YXJnMSwgJnBhdGgpOworCWlmIChlcnJjb2RlICE9IDApCisJICB7CisJICAgIHJlc3VsdCA9IC0xOworCSAgICBnb3RvIEZpbmlzaFN5c2NhbGw7CisJICB9CisJcmVzdWx0ID0gKCpjYi0+b3BlbikgKGNiLCBwYXRoLCBzYy0+YXJnMiAvKiwgc2MtPmFyZzMqLyk7CisJZnJlZSAocGF0aCk7CisJaWYgKHJlc3VsdCA8IDApCisJICBnb3RvIEVycm9yRmluaXNoOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENCX1NZU19jbG9zZSA6CisgICAgICByZXN1bHQgPSAoKmNiLT5jbG9zZSkgKGNiLCBzYy0+YXJnMSk7CisgICAgICBpZiAocmVzdWx0IDwgMCkKKwlnb3RvIEVycm9yRmluaXNoOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENCX1NZU19yZWFkIDoKKyAgICAgIHsKKwkvKiA/Pz8gUGVyZmVjdCBoYW5kbGluZyBvZiBlcnJvciBjb25kaXRpb25zIG1heSByZXF1aXJlIG9ubHkgb25lCisJICAgY2FsbCB0byBjYi0+cmVhZC4gIE9uZSBjYW4ndCBhc3N1bWUgYWxsIHRoZSBkYXRhIGlzCisJICAgY29udGlndW91c2x5IHN0b3JlZCBpbiBob3N0IG1lbW9yeSBzbyB0aGF0IHdvdWxkIHJlcXVpcmUKKwkgICBtYWxsb2MnaW5nL2ZyZWUnaW5nIHRoZSBzcGFjZS4gIE1heWJlIGxhdGVyLiAgKi8KKwljaGFyIGJ1ZltGSUxFX1hGUl9TSVpFXTsKKwlpbnQgZmQgPSBzYy0+YXJnMTsKKwlUQUREUiBhZGRyID0gc2MtPmFyZzI7CisJc2l6ZV90IGNvdW50ID0gc2MtPmFyZzM7CisJc2l6ZV90IGJ5dGVzX3JlYWQgPSAwOworCWludCBieXRlc193cml0dGVuOworCisJd2hpbGUgKGNvdW50ID4gMCkKKwkgIHsKKwkgICAgaWYgKGZkID09IDApCisJICAgICAgcmVzdWx0ID0gKGludCkgKCpjYi0+cmVhZF9zdGRpbikgKGNiLCBidWYsCisJCQkJCQkoY291bnQgPCBGSUxFX1hGUl9TSVpFCisJCQkJCQkgPyBjb3VudCA6IEZJTEVfWEZSX1NJWkUpKTsKKwkgICAgZWxzZQorCSAgICAgIHJlc3VsdCA9IChpbnQpICgqY2ItPnJlYWQpIChjYiwgZmQsIGJ1ZiwKKwkJCQkJICAoY291bnQgPCBGSUxFX1hGUl9TSVpFCisJCQkJCSAgID8gY291bnQgOiBGSUxFX1hGUl9TSVpFKSk7CisJICAgIGlmIChyZXN1bHQgPT0gLTEpCisJICAgICAgZ290byBFcnJvckZpbmlzaDsKKwkgICAgaWYgKHJlc3VsdCA9PSAwKQkvKiBFT0YgKi8KKwkgICAgICBicmVhazsKKwkgICAgYnl0ZXNfd3JpdHRlbiA9ICgqc2MtPndyaXRlX21lbSkgKGNiLCBzYywgYWRkciwgYnVmLCByZXN1bHQpOworCSAgICBpZiAoYnl0ZXNfd3JpdHRlbiAhPSByZXN1bHQpCisJICAgICAgeworCQlyZXN1bHQgPSAtMTsKKwkJZXJyY29kZSA9IEVJTlZBTDsKKwkJZ290byBGaW5pc2hTeXNjYWxsOworCSAgICAgIH0KKwkgICAgYnl0ZXNfcmVhZCArPSByZXN1bHQ7CisJICAgIGNvdW50IC09IHJlc3VsdDsKKwkgICAgYWRkciArPSByZXN1bHQ7CisJICAgIC8qIElmIHRoaXMgaXMgYSBzaG9ydCByZWFkLCBkb24ndCBnbyBiYWNrIGZvciBtb3JlICovCisJICAgIGlmIChyZXN1bHQgIT0gRklMRV9YRlJfU0laRSkKKwkgICAgICBicmVhazsKKwkgIH0KKwlyZXN1bHQgPSBieXRlc19yZWFkOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENCX1NZU193cml0ZSA6CisgICAgICB7CisJLyogPz8/IFBlcmZlY3QgaGFuZGxpbmcgb2YgZXJyb3IgY29uZGl0aW9ucyBtYXkgcmVxdWlyZSBvbmx5IG9uZQorCSAgIGNhbGwgdG8gY2ItPndyaXRlLiAgT25lIGNhbid0IGFzc3VtZSBhbGwgdGhlIGRhdGEgaXMKKwkgICBjb250aWd1b3VzbHkgc3RvcmVkIGluIGhvc3QgbWVtb3J5IHNvIHRoYXQgd291bGQgcmVxdWlyZQorCSAgIG1hbGxvYydpbmcvZnJlZSdpbmcgdGhlIHNwYWNlLiAgTWF5YmUgbGF0ZXIuICAqLworCWNoYXIgYnVmW0ZJTEVfWEZSX1NJWkVdOworCWludCBmZCA9IHNjLT5hcmcxOworCVRBRERSIGFkZHIgPSBzYy0+YXJnMjsKKwlzaXplX3QgY291bnQgPSBzYy0+YXJnMzsKKwlpbnQgYnl0ZXNfcmVhZDsKKwlzaXplX3QgYnl0ZXNfd3JpdHRlbiA9IDA7CisKKwl3aGlsZSAoY291bnQgPiAwKQorCSAgeworCSAgICBpbnQgYnl0ZXNfdG9fcmVhZCA9IGNvdW50IDwgRklMRV9YRlJfU0laRSA/IGNvdW50IDogRklMRV9YRlJfU0laRTsKKwkgICAgYnl0ZXNfcmVhZCA9ICgqc2MtPnJlYWRfbWVtKSAoY2IsIHNjLCBhZGRyLCBidWYsIGJ5dGVzX3RvX3JlYWQpOworCSAgICBpZiAoYnl0ZXNfcmVhZCAhPSBieXRlc190b19yZWFkKQorCSAgICAgIHsKKwkJcmVzdWx0ID0gLTE7CisJCWVycmNvZGUgPSBFSU5WQUw7CisJCWdvdG8gRmluaXNoU3lzY2FsbDsKKwkgICAgICB9CisJICAgIGlmIChmZCA9PSAxKQorCSAgICAgIHsKKwkJcmVzdWx0ID0gKGludCkgKCpjYi0+d3JpdGVfc3Rkb3V0KSAoY2IsIGJ1ZiwgYnl0ZXNfcmVhZCk7CisJCSgqY2ItPmZsdXNoX3N0ZG91dCkgKGNiKTsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKGZkID09IDIpCisJICAgICAgeworCQlyZXN1bHQgPSAoaW50KSAoKmNiLT53cml0ZV9zdGRlcnIpIChjYiwgYnVmLCBieXRlc19yZWFkKTsKKwkJKCpjYi0+Zmx1c2hfc3RkZXJyKSAoY2IpOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHJlc3VsdCA9IChpbnQpICgqY2ItPndyaXRlKSAoY2IsIGZkLCBidWYsIGJ5dGVzX3JlYWQpOworCSAgICBpZiAocmVzdWx0ID09IC0xKQorCSAgICAgIGdvdG8gRXJyb3JGaW5pc2g7CisJICAgIGJ5dGVzX3dyaXR0ZW4gKz0gcmVzdWx0OworCSAgICBjb3VudCAtPSByZXN1bHQ7CisJICAgIGFkZHIgKz0gcmVzdWx0OworCSAgfQorCXJlc3VsdCA9IGJ5dGVzX3dyaXR0ZW47CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQ0JfU1lTX2xzZWVrIDoKKyAgICAgIHsKKwlpbnQgZmQgPSBzYy0+YXJnMTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHNjLT5hcmcyOworCWludCB3aGVuY2UgPSBzYy0+YXJnMzsKKworCXJlc3VsdCA9ICgqY2ItPmxzZWVrKSAoY2IsIGZkLCBvZmZzZXQsIHdoZW5jZSk7CisJaWYgKHJlc3VsdCA8IDApCisJICBnb3RvIEVycm9yRmluaXNoOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENCX1NZU191bmxpbmsgOgorICAgICAgeworCWNoYXIgKnBhdGg7CisKKwllcnJjb2RlID0gZ2V0X3BhdGggKGNiLCBzYywgc2MtPmFyZzEsICZwYXRoKTsKKwlpZiAoZXJyY29kZSAhPSAwKQorCSAgeworCSAgICByZXN1bHQgPSAtMTsKKwkgICAgZ290byBGaW5pc2hTeXNjYWxsOworCSAgfQorCXJlc3VsdCA9ICgqY2ItPnVubGluaykgKGNiLCBwYXRoKTsKKwlmcmVlIChwYXRoKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkgIGdvdG8gRXJyb3JGaW5pc2g7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQ0JfU1lTX3N0YXQgOgorICAgICAgeworCWNoYXIgKnBhdGgsKmJ1ZjsKKwlpbnQgYnVmbGVuOworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJVEFERFIgYWRkciA9IHNjLT5hcmcyOworCisJZXJyY29kZSA9IGdldF9wYXRoIChjYiwgc2MsIHNjLT5hcmcxLCAmcGF0aCk7CisJaWYgKGVycmNvZGUgIT0gMCkKKwkgIHsKKwkgICAgcmVzdWx0ID0gLTE7CisJICAgIGdvdG8gRmluaXNoU3lzY2FsbDsKKwkgIH0KKwlyZXN1bHQgPSAoKmNiLT5zdGF0KSAoY2IsIHBhdGgsICZzdGF0YnVmKTsKKwlmcmVlIChwYXRoKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkgIGdvdG8gRXJyb3JGaW5pc2g7CisJYnVmbGVuID0gY2JfaG9zdF90b190YXJnZXRfc3RhdCAoY2IsIE5VTEwsIE5VTEwpOworCWJ1ZiA9IHhtYWxsb2MgKGJ1Zmxlbik7CisJaWYgKGNiX2hvc3RfdG9fdGFyZ2V0X3N0YXQgKGNiLCAmc3RhdGJ1ZiwgYnVmKSAhPSBidWZsZW4pCisJICB7CisJICAgIC8qIFRoZSB0cmFuc2xhdGlvbiBmYWlsZWQuICBUaGlzIGlzIGR1ZSB0byBhbiBpbnRlcm5hbAorCSAgICAgICBob3N0IHByb2dyYW0gZXJyb3IsIG5vdCB0aGUgdGFyZ2V0J3MgZmF1bHQuICAqLworCSAgICBmcmVlIChidWYpOworCSAgICBlcnJjb2RlID0gRU5PU1lTOworCSAgICByZXN1bHQgPSAtMTsKKwkgICAgZ290byBGaW5pc2hTeXNjYWxsOworCSAgfQorCWlmICgoKnNjLT53cml0ZV9tZW0pIChjYiwgc2MsIGFkZHIsIGJ1ZiwgYnVmbGVuKSAhPSBidWZsZW4pCisJICB7CisJICAgIGZyZWUgKGJ1Zik7CisJICAgIGVycmNvZGUgPSBFSU5WQUw7CisJICAgIHJlc3VsdCA9IC0xOworCSAgICBnb3RvIEZpbmlzaFN5c2NhbGw7CisJICB9CisJZnJlZSAoYnVmKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDQl9TWVNfZnN0YXQgOgorICAgICAgeworCWNoYXIgKmJ1ZjsKKwlpbnQgYnVmbGVuOworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJVEFERFIgYWRkciA9IHNjLT5hcmcyOworCisJcmVzdWx0ID0gKCpjYi0+ZnN0YXQpIChjYiwgc2MtPmFyZzEsICZzdGF0YnVmKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkgIGdvdG8gRXJyb3JGaW5pc2g7CisJYnVmbGVuID0gY2JfaG9zdF90b190YXJnZXRfc3RhdCAoY2IsIE5VTEwsIE5VTEwpOworCWJ1ZiA9IHhtYWxsb2MgKGJ1Zmxlbik7CisJaWYgKGNiX2hvc3RfdG9fdGFyZ2V0X3N0YXQgKGNiLCAmc3RhdGJ1ZiwgYnVmKSAhPSBidWZsZW4pCisJICB7CisJICAgIC8qIFRoZSB0cmFuc2xhdGlvbiBmYWlsZWQuICBUaGlzIGlzIGR1ZSB0byBhbiBpbnRlcm5hbAorCSAgICAgICBob3N0IHByb2dyYW0gZXJyb3IsIG5vdCB0aGUgdGFyZ2V0J3MgZmF1bHQuICAqLworCSAgICBmcmVlIChidWYpOworCSAgICBlcnJjb2RlID0gRU5PU1lTOworCSAgICByZXN1bHQgPSAtMTsKKwkgICAgZ290byBGaW5pc2hTeXNjYWxsOworCSAgfQorCWlmICgoKnNjLT53cml0ZV9tZW0pIChjYiwgc2MsIGFkZHIsIGJ1ZiwgYnVmbGVuKSAhPSBidWZsZW4pCisJICB7CisJICAgIGZyZWUgKGJ1Zik7CisJICAgIGVycmNvZGUgPSBFSU5WQUw7CisJICAgIHJlc3VsdCA9IC0xOworCSAgICBnb3RvIEZpbmlzaFN5c2NhbGw7CisJICB9CisJZnJlZSAoYnVmKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDQl9TWVNfdGltZSA6CisgICAgICB7CisJLyogRklYTUU6IE1heSB3aXNoIHRvIGNoYW5nZSBDQl9TWVNfdGltZSB0byBzb21ldGhpbmcgZWxzZS4KKwkgICBXZSBtaWdodCBhbHNvIHdhbnQgZ2V0dGltZW9mZGF5IG9yIHRpbWVzLCBidXQgaWYgc3lzdGVtIGNhbGxzCisJICAgY2FuIGJlIGJ1aWx0IG9uIG90aGVycywgd2UgY2FuIGtlZXAgdGhlIG51bWJlciB3ZSBoYXZlIHRvIHN1cHBvcnQKKwkgICBoZXJlIGRvd24uICAqLworCXRpbWVfdCB0ID0gKCpjYi0+dGltZSkgKGNiLCAodGltZV90ICopIDApOworCXJlc3VsdCA9IHQ7CisJLyogSXQgaXMgdXAgdG8gdGFyZ2V0IGNvZGUgdG8gcHJvY2VzcyB0aGUgYXJndW1lbnQgdG8gdGltZSgpLiAgKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDQl9TWVNfY2hkaXIgOgorICAgIGNhc2UgQ0JfU1lTX2NobW9kIDoKKyAgICBjYXNlIENCX1NZU191dGltZSA6CisgICAgICAvKiBmYWxsIHRocm91Z2ggZm9yIG5vdyAqLworCisgICAgZGVmYXVsdCA6CisgICAgICByZXN1bHQgPSAtMTsKKyAgICAgIGVycmNvZGUgPSBFTk9TWVM7CisgICAgICBicmVhazsKKyAgICB9CisKKyBGaW5pc2hTeXNjYWxsOgorICBzYy0+cmVzdWx0ID0gcmVzdWx0OworICBpZiAoZXJyY29kZSA9PSAwKQorICAgIHNjLT5lcnJjb2RlID0gMDsKKyAgZWxzZQorICAgIHNjLT5lcnJjb2RlID0gY2JfaG9zdF90b190YXJnZXRfZXJybm8gKGNiLCBlcnJjb2RlKTsKKyAgcmV0dXJuIENCX1JDX09LOworCisgRXJyb3JGaW5pc2g6CisgIHNjLT5yZXN1bHQgPSByZXN1bHQ7CisgIHNjLT5lcnJjb2RlID0gKCpjYi0+Z2V0X2Vycm5vKSAoY2IpOworICByZXR1cm4gQ0JfUkNfT0s7Cit9CmRpZmYgLS1naXQgYS9zaW0vY29tbW9uL3Rjb25maWcuaW4gYi9zaW0vY29tbW9uL3Rjb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4YjViZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb21tb24vdGNvbmZpZy5pbgpAQCAtMCwwICsxLDE5IEBACisvKiBEZWZhdWx0IHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuCisgICBUbyBvdmVycmlkZSB0aGlzLCBjcmVhdGUgZmlsZSBgdGNvbmZpZy5pbicgaW4gdGhlIHNpbXVsYXRvcidzCisgICBzb3VyY2UgZGlyZWN0b3J5LiAgKi8KKworLyogRGVmaW5lIHRoaXMgaWYgdGhlIHNpbXVsYXRvciBzdXBwb3J0cyBwcm9maWxpbmcuCisgICBTZWUgdGhlIG1pcHMgc2ltdWxhdG9yIGZvciBhbiBleGFtcGxlLgorICAgVGhpcyBlbmFibGVzIHRoZSBgLXAgZm9vJyBhbmQgYC1zIGJhcicgb3B0aW9ucy4KKyAgIFRoZSB0YXJnZXQgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzaW1fc2V0X3Byb2ZpbGV7LF9zaXplfS4gICovCisvKiAjZGVmaW5lIFNJTV9IQVZFX1BST0ZJTEUgKi8KKworLyogRGVmaW5lIHRoaXMgaWYgdGhlIHNpbXVsYXRvciB1c2VzIGFuIGluc3RydWN0aW9uIGNhY2hlLgorICAgU2VlIHRoZSBoOC8zMDAgc2ltdWxhdG9yIGZvciBhbiBleGFtcGxlLgorICAgVGhpcyBlbmFibGVzIHRoZSBgLWMgc2l6ZScgb3B0aW9uIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUuCisgICBUaGUgdGFyZ2V0IGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgc2ltX3NldF9zaW1jYWNoZV9zaXplLiAgKi8KKy8qICNkZWZpbmUgU0lNX0hBVkVfU0lNQ0FDSEUgKi8KKworLyogRGVmaW5lIHRoaXMgaWYgdGhlIHRhcmdldCBjcHUgaXMgYmktZW5kaWFuCisgICBhbmQgdGhlIHNpbXVsYXRvciBzdXBwb3J0cyBpdC4gICovCisvKiAjZGVmaW5lIFNJTV9IQVZFX0JJRU5ESUFOICovCmRpZmYgLS1naXQgYS9zaW0vY29uZmlndXJlIGIvc2ltL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MjU3ZGU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDE5MTcgQEAKKyMhIC9iaW4vc2gKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCisjIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworIyBEZWZhdWx0czoKK2FjX2hlbHA9CithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCisjIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46CithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0gIgorYWNfaGVscD0iJGFjX2hlbHAKKyIKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2J1aWxkPU5PTkUKK2NhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2V4ZWNfcHJlZml4PU5PTkUKK2hvc3Q9Tk9ORQorbm9fY3JlYXRlPQorbm9ub3B0PU5PTkUKK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3RhcmdldD1OT05FCit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorc3ViZGlycz0KK01GTEFHUz0gTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCisgICAgZXhpdCAwIDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Li9jb25maWcubG9nCisKK2VjaG8gIlwKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorIiAxPiY1CisKKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCithY19jb25maWd1cmVfYXJncz0KK2ZvciBhY19hcmcKK2RvCisgIGNhc2UgIiRhY19hcmciIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBlc2FjCitkb25lCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKyMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCisjIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCitpZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID4gY29uZmRlZnMuaAorCisjIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0CisjIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCithY19leGVleHQ9CithY19vYmpleHQ9bworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTMzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1NjM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2MTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY0NjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKKworI2xpbmUgNjU3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworbWFpbigpe3JldHVybigwKTt9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjYyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKyAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisgIGVsc2UKKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcworICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY4ODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Citjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY5MzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzAyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjcyMTogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKK2lmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfY2NfZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3ODM6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgoraWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjg0MjogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisKK2hvc3RfYWxpYXM9JGhvc3QKK2Nhc2UgIiRob3N0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpCisgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpIDs7CisgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2hvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAoraG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjg2MzogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorCitidWlsZF9hbGlhcz0kYnVpbGQKK2Nhc2UgIiRidWlsZF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKK2J1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitidWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgorCitpZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgorICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQorZWxzZQorICBhY190b29sX3ByZWZpeD0KK2ZpCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hcjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4ODk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19BUj0iJHthY190b29sX3ByZWZpeH1hciIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiICYmIGFjX2N2X3Byb2dfQVI9ImFyIgorZmkKK2ZpCitBUj0iJGFjX2N2X3Byb2dfQVIiCitpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQVIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTIxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5NTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlbHNlCisgIFJBTkxJQj0iOiIKK2ZpCitmaQorCisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTAzMzogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisKK2hvc3RfYWxpYXM9JGhvc3QKK2Nhc2UgIiRob3N0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpCisgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpIDs7CisgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2hvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAoraG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDU0OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorCit0YXJnZXRfYWxpYXM9JHRhcmdldAorY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCit0YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCit0YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDcyOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9CitlbHNlCisgICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KKyAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAorcyxcXCxcXFxcLGc7IHMsXCQsJCQsZworRU9GX1NFRAorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgorICBybSAtZiBjb25mdGVzdHNlZAorZmkKK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorCisjIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCit0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTExNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTE0NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19wcm9nX3JlamVjdGVkPW5vCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworCWNvbnRpbnVlCisgICAgICBmaQorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KKyAgICAqd2luMzIqIHwgKldJTjMyKikKKyAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExOTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyMjk6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCisKKyNsaW5lIDEyNDAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCittYWluKCl7cmV0dXJuKDApO30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjQ1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKyAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisgIGVsc2UKKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcworICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyNzE6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgorY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjc2OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19HTlVDX18KKyAgeWVzOworI2VuZGlmCitFT0YKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjg1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzMDQ6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCitpZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBhY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCisKKworCitBUj0ke0FSLWFyfQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzNDI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKyMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KKworaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KKyAgQ0NfRk9SX0JVSUxEPSckKENDKScKK2Vsc2UKKyAgQ0NfRk9SX0JVSUxEPWdjYworZmkKKworCisjIElmIGEgY3B1IGV2ZXIgaGFzIG1vcmUgdGhhbiBvbmUgc2ltdWxhdG9yIHRvIGNob29zZSBmcm9tLCB1c2UKKyMgLS1lbmFibGUtc2ltPS4uLiB0byBjaG9vc2UuCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltIG9yIC0tZGlzYWJsZS1zaW0gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW0iCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KK3llcyB8IG5vKSA7OworKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGdpdmVuIGZvciAtLWVuYWJsZS1zaW0gb3B0aW9uIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKK2ZpCisKKworIyBBc3N1bWUgc2ltdWxhdG9yIGNhbiBiZSBidWlsdCB3aXRoIGNjLgorIyBJZiB0aGUgdXNlciBwYXNzZXMgLS1lbmFibGUtc2ltIGJ1aWx0IGl0IHJlZ2FyZGxlc3Mgb2YgJChDQykuCitvbmx5X2lmX2djYz1ubworb25seV9pZl9lbmFibGVkPW5vCitleHRyYV9zdWJkaXJzPWNvbW1vbgorCisjIFdIRU4gQURESU5HIEVOVFJJRVMgVE8gVEhJUyBNQVRSSVg6CisjICBNYWtlIHN1cmUgdGhhdCB0aGUgbGVmdCBzaWRlIGFsd2F5cyBoYXMgdHdvIGRhc2hlcy4gIE90aGVyd2lzZSB5b3UKKyMgIGNhbiBnZXQgc3B1cmlvdXMgbWF0Y2hlcy4gIEV2ZW4gZm9yIHVuYW1iaWd1b3VzIGNhc2VzLCBkbyB0aGlzIGFzIGEKKyMgIGNvbnZlbnRpb24sIGVsc2UgdGhlIHRhYmxlIGJlY29tZXMgYSByZWFsIG1lc3MgdG8gdW5kZXJzdGFuZCBhbmQgbWFpbnRhaW4uCisKK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyAgYXJtKi0qLSopCQlzaW1fdGFyZ2V0PWFybSA7OworICBzdHJvbmdhcm0qLSotKikJc2ltX3RhcmdldD1hcm0gOzsKKyAgdGh1bWIqLSotKikgICAgICAgICAgIHNpbV90YXJnZXQ9YXJtIDs7CisgIGQxMHYtKi0qKQkJc2ltX3RhcmdldD1kMTB2IDs7CisgIGQzMHYtKi0qKQorCXNpbV90YXJnZXQ9ZDMwdgorCW9ubHlfaWZfZ2NjPXllcworCWV4dHJhX3N1YmRpcnM9IiR7ZXh0cmFfc3ViZGlyc30gaWdlbiIKKwk7OworICBmcjMwLSotKikJCXNpbV90YXJnZXQ9ZnIzMCA7OworICBoODMwMCotKi0qKQkJc2ltX3RhcmdldD1oODMwMCA7OworICBoODUwMC0qLSopCQlzaW1fdGFyZ2V0PWg4NTAwIDs7CisgIGk5NjAtKi0qKQkJc2ltX3RhcmdldD1pOTYwIDs7CisgIG0zMnItKi0qKQkJc2ltX3RhcmdldD1tMzJyIDs7CisgIG1pcHMqLSotKikKKwkjIFRoZSBNSVBTIHNpbXVsYXRvciBjYW4gb25seSBiZSBjb21waWxlZCBieSBnY2MuCisJc2ltX3RhcmdldD1taXBzCisJb25seV9pZl9nY2M9eWVzCisJZXh0cmFfc3ViZGlycz0iJHtleHRyYV9zdWJkaXJzfSBpZ2VuIgorCTs7CisgIG1uMTAzMDAqLSotKikKKwkjIFRoZSBtbjEwMzAwIHNpbXVsYXRvciBjYW4gb25seSBiZSBjb21waWxlZCBieSBnY2MuCisJc2ltX3RhcmdldD1tbjEwMzAwCisJb25seV9pZl9nY2M9eWVzCisJZXh0cmFfc3ViZGlycz0iJHtleHRyYV9zdWJkaXJzfSBpZ2VuIgorCTs7CisgIG1uMTAyMDAqLSotKikKKwlzaW1fdGFyZ2V0PW1uMTAyMDAKKwk7OworICBzaCotKi0qKQkJc2ltX3RhcmdldD1zaCA7OworICBwb3dlcnBjKi0qLWVhYmkqIHwgcG93ZXJwYyotKi1zb2xhcmlzKiB8IHBvd2VycGMqLSotc3lzdjQqIHwgcG93ZXJwYyotKi1lbGYqIHwgcG93ZXJwYyotKi1saW51eCogKQorCSMgVGhlIFBvd2VyUEMgc2ltdWxhdG9yIHVzZXMgdGhlIEdDQyBleHRlbnNpb24gbG9uZyBsb25nIGFzIHdlbGwgYXMKKwkjIEFOU0kgcHJvdG90eXBlcywgc28gZG9uJ3QgZW5hYmxlIGl0IGZvciByYW5kb20gaG9zdCBjb21waWxlcnMKKwkjIHVubGVzcyBhc2tlZCB0by4KKwlzaW1fdGFyZ2V0PXBwYworCW9ubHlfaWZfZ2NjPXllcworCSNleHRyYV9zdWJkaXJzPSIke2V4dHJhX3N1YmRpcnN9IgorCTs7CisgIHY4NTAtKi0qKQorCSMgVGhlIFY4NTAgc2ltdWxhdG9yIGNhbiBvbmx5IGJlIGNvbXBpbGVkIGJ5IGdjYy4KKwlzaW1fdGFyZ2V0PXY4NTAKKwlleHRyYV9zdWJkaXJzPSIke2V4dHJhX3N1YmRpcnN9IGlnZW4iCisJb25seV9pZl9nY2M9eWVzCisJOzsKKyAgdjg1MGUtKi0qKQorCSMgVGhlIFY4NTAgc2ltdWxhdG9yIGNhbiBvbmx5IGJlIGNvbXBpbGVkIGJ5IGdjYy4KKwlzaW1fdGFyZ2V0PXY4NTAKKwlleHRyYV9zdWJkaXJzPSIke2V4dHJhX3N1YmRpcnN9IGlnZW4iCisJb25seV9pZl9nY2M9eWVzCisJOzsKKyAgdjg1MGVhLSotKikKKwkjIFRoZSBWODUwIHNpbXVsYXRvciBjYW4gb25seSBiZSBjb21waWxlZCBieSBnY2MuCisJc2ltX3RhcmdldD12ODUwCisJZXh0cmFfc3ViZGlycz0iJHtleHRyYV9zdWJkaXJzfSBpZ2VuIgorCW9ubHlfaWZfZ2NjPXllcworCTs7CisgIHc2NS0qLSopCisJc2ltX3RhcmdldD13NjUKKwkjIFRoZSB3NjUgaXMgc3VmZmVyaW5nIGZyb20gZ3JhZHVhbCBkZWNheS4KKwlvbmx5X2lmX2VuYWJsZWQ9eWVzCisJOzsKKyAgejhrKi0qLSopCQlzaW1fdGFyZ2V0PXo4ayA7OworICBzcGFyYzY0LSotKikKKwlvbmx5X2lmX2djYz15ZXMKKwlpZiB0ZXN0ICJ4JHt3aXRoX2NnZW59IiA9IHh5ZXMgLW8gIngke3dpdGhfY2dlbl9zaW19IiA9IHh5ZXMgOyB0aGVuCisJCXNpbV90YXJnZXQ9c3BhcmMKKwkJZXh0cmFfc3ViZGlycz0iJHtleHRyYV9zdWJkaXJzfSB0ZXN0c3VpdGUiCisJZWxzZQorCQlzaW1fdGFyZ2V0PW5vbmUgIyBEb24ndCBidWlsZCBlcmMzMiBpZiBzcGFyYzY0LgorCWZpCisJOzsKKyAgc3BhcmNsaXRlKi0qLSogfCBzcGFyYzg2eCotKi0qKQorCSMgVGhlIFNQQVJDIHNpbXVsYXRvciBjYW4gb25seSBiZSBjb21waWxlZCBieSBnY2MuCisJb25seV9pZl9nY2M9eWVzCisJaWYgdGVzdCAieCR7d2l0aF9jZ2VufSIgPSB4eWVzIC1vICJ4JHt3aXRoX2NnZW5fc2ltfSIgPSB4eWVzIDsgdGhlbgorCQlzaW1fdGFyZ2V0PXNwYXJjCisJCWV4dHJhX3N1YmRpcnM9IiR7ZXh0cmFfc3ViZGlyc30gdGVzdHN1aXRlIgorCWVsc2UKKwkJc2ltX3RhcmdldD1lcmMzMgorCWZpCisJOzsKKyAgc3BhcmMqLSotKikKKwkjIFRoZSBTUEFSQyBzaW11bGF0b3IgY2FuIG9ubHkgYmUgY29tcGlsZWQgYnkgZ2NjLgorCW9ubHlfaWZfZ2NjPXllcworCWlmIHRlc3QgIngke3dpdGhfY2dlbn0iID0geHllcyAtbyAieCR7d2l0aF9jZ2VuX3NpbX0iID0geHllcyA7IHRoZW4KKwkJc2ltX3RhcmdldD1zcGFyYworCQlleHRyYV9zdWJkaXJzPSIke2V4dHJhX3N1YmRpcnN9IHRlc3RzdWl0ZSIKKwllbHNlCisJCSMgVW5mb3J0dW5hdGVseSBlcmMzMiB3b24ndCBidWlsZCBvbiBtYW55IGhvc3RzLCBzbyBvbmx5IGVuYWJsZQorCQkjIGl0IGlmIHRoZSB1c2VyIHJlYWxseSByZWFsbHkgd2FudHMgaXQuCisJCW9ubHlfaWZfZW5hYmxlZD15ZXMKKwkJc2ltX3RhcmdldD1lcmMzMgorCWZpCisJOzsKKyAgKikJCQlzaW1fdGFyZ2V0PW5vbmUgOzsKK2VzYWMKKworCisKKworIyBJcyB0aGVyZSBhIHRlc3RzdWl0ZSBkaXJlY3RvcnkgZm9yIHRoZSB0YXJnZXQ/Cit0ZXN0ZGlyPWBlY2hvICR7dGFyZ2V0fSB8IHNlZCAtZSAncy8tLiotLy0vJ2AKK2lmIHRlc3QgLXIgJHtzcmNkaXJ9L3Rlc3RzdWl0ZS8ke3Rlc3RkaXJ9L2NvbmZpZ3VyZSA7IHRoZW4KKyAgZXh0cmFfc3ViZGlycz0iJHtleHRyYV9zdWJkaXJzfSB0ZXN0c3VpdGUiCitmaQorCisKK2Nhc2UgIiR7ZW5hYmxlX3NpbX0iIGluCitubykJc2ltX3RhcmdldD1ub25lIDs7Cit5ZXMpCisJaWYgdGVzdCAke29ubHlfaWZfZ2NjfSA9IHllcyA7IHRoZW4KKwkJaWYgdGVzdCAiJHtHQ0N9IiAhPSB5ZXMgOyB0aGVuCisJCQllY2hvICJDYW4ndCBlbmFibGUgc2ltdWxhdG9yIHNpbmNlIG5vdCBjb21waWxpbmcgd2l0aCBHQ0MuIgorCQkJc2ltX3RhcmdldD1ub25lCisJCWZpCisJZmkKKwk7OworKikKKwlpZiB0ZXN0ICR7b25seV9pZl9lbmFibGVkfSA9IHllcyA7IHRoZW4KKwkJc2ltX3RhcmdldD1ub25lCisJZWxzZQorCQlpZiB0ZXN0ICR7b25seV9pZl9nY2N9ID0geWVzIDsgdGhlbgorCQkJaWYgdGVzdCAiJHtHQ0N9IiAhPSB5ZXMgOyB0aGVuCisJCQkJc2ltX3RhcmdldD1ub25lCisJCQlmaQorCQlmaQorCWZpCisJOzsKK2VzYWMKKworaWYgdGVzdCB4IiR7c2ltX3RhcmdldH0iICE9IHhub25lIDsgdGhlbgorCWNvbmZpZ2RpcnM9IiR7ZXh0cmFfc3ViZGlyc30gJHtzaW1fdGFyZ2V0fSIKKwlzdWJkaXJzPSIkY29uZmlnZGlycyIKKworZmkKKwordHJhcCAnJyAxIDIgMTUKK2NhdCA+IGNvbmZjYWNoZSA8PFxFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgorIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAorIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCisjIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgorIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCisjIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgorIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCisjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworRU9GCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKyhzZXQpIDI+JjEgfAorICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgorICAqYWNfc3BhY2U9XCAqKQorICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCisgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICBzZWQgLW4gXAorICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKKyAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKyAgICA7OworICAqKQorICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJworICAgIDs7CisgIGVzYWMgPj4gY29uZmNhY2hlCitpZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKyMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCitmaQorCit0cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBERUZTLgorIyBQcm90ZWN0IGFnYWluc3Qgc2hlbGwgZXhwYW5zaW9uIHdoaWxlIGV4ZWN1dGluZyBNYWtlZmlsZSBydWxlcy4KKyMgUHJvdGVjdCBhZ2FpbnN0IE1ha2VmaWxlIG1hY3JvIGV4cGFuc2lvbi4KK2NhdCA+IGNvbmZ0ZXN0LmRlZnMgPDxcRU9GCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUtRFwxPVwyJWcKK3MlWyAJYH4jJF4mKigpe31cXHw7JyI8Pj9dJVxcJiVnCitzJVxbJVxcJiVnCitzJVxdJVxcJiVnCitzJVwkJSQkJWcKK0VPRgorREVGUz1gc2VkIC1mIGNvbmZ0ZXN0LmRlZnMgY29uZmRlZnMuaCB8IHRyICdcMDEyJyAnICdgCitybSAtZiBjb25mdGVzdC5kZWZzCisKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUiIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAU0hFTExAJSRTSEVMTCVnCitzJUBDRkxBR1NAJSRDRkxBR1MlZworcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCitzJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKK3MlQEZGTEFHU0AlJEZGTEFHUyVnCitzJUBERUZTQCUkREVGUyVnCitzJUBMREZMQUdTQCUkTERGTEFHUyVnCitzJUBMSUJTQCUkTElCUyVnCitzJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKK3MlQHByZWZpeEAlJHByZWZpeCVnCitzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCitzJUBiaW5kaXJAJSRiaW5kaXIlZworcyVAc2JpbmRpckAlJHNiaW5kaXIlZworcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworcyVAZGF0YWRpckAlJGRhdGFkaXIlZworcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZworcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCitzJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCitzJUBsaWJkaXJAJSRsaWJkaXIlZworcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworcyVAaW5mb2RpckAlJGluZm9kaXIlZworcyVAbWFuZGlyQCUkbWFuZGlyJWcKK3MlQENDQCUkQ0MlZworcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKK3MlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZworcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKK3MlQGhvc3RAJSRob3N0JWcKK3MlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKK3MlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCitzJUBob3N0X29zQCUkaG9zdF9vcyVnCitzJUBidWlsZEAlJGJ1aWxkJWcKK3MlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZworcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKK3MlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCitzJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKK3MlQEFSQCUkQVIlZworcyVAUkFOTElCQCUkUkFOTElCJWcKK3MlQHRhcmdldEAlJHRhcmdldCVnCitzJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZworcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZworcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZworcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKK3MlQEhERUZJTkVTQCUkSERFRklORVMlZworcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKK3MlQHN1YmRpcnNAJSRzdWJkaXJzJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KKyAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OworICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKK3MlQElOU1RBTExAJSRJTlNUQUxMJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworZXhpdCAwCitFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCitybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwordGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisKK2lmIHRlc3QgIiRub19yZWN1cnNpb24iICE9IHllczsgdGhlbgorCisgICMgUmVtb3ZlIC0tY2FjaGUtZmlsZSBhbmQgLS1zcmNkaXIgYXJndW1lbnRzIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisgIGFjX3N1Yl9jb25maWd1cmVfYXJncz0KKyAgYWNfcHJldj0KKyAgZm9yIGFjX2FyZyBpbiAkYWNfY29uZmlndXJlX2FyZ3M7IGRvCisgICAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgICBhY19wcmV2PQorICAgICAgY29udGludWUKKyAgICBmaQorICAgIGNhc2UgIiRhY19hcmciIGluCisgICAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICAgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgICAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgICAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICAgIDs7CisgICAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgICAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICAgIDs7CisgICAgKikgYWNfc3ViX2NvbmZpZ3VyZV9hcmdzPSIkYWNfc3ViX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgICAgZXNhYworICBkb25lCisKKyAgZm9yIGFjX2NvbmZpZ19kaXIgaW4gJGNvbmZpZ2RpcnM7IGRvCisKKyAgICAjIERvIG5vdCBjb21wbGFpbiwgc28gYSBjb25maWd1cmUgc2NyaXB0IGNhbiBjb25maWd1cmUgd2hpY2hldmVyCisgICAgIyBwYXJ0cyBvZiBhIGxhcmdlIHNvdXJjZSB0cmVlIGFyZSBwcmVzZW50LgorICAgIGlmIHRlc3QgISAtZCAkc3JjZGlyLyRhY19jb25maWdfZGlyOyB0aGVuCisgICAgICBjb250aW51ZQorICAgIGZpCisKKyAgICBlY2hvIGNvbmZpZ3VyaW5nIGluICRhY19jb25maWdfZGlyCisKKyAgICBjYXNlICIkc3JjZGlyIiBpbgorICAgIC4pIDs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgLWQgLi8kYWNfY29uZmlnX2RpciB8fCBta2RpciAuLyRhY19jb25maWdfZGlyOyB0aGVuIDo7CisgICAgICBlbHNlCisgICAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBjcmVhdGUgYHB3ZGAvJGFjX2NvbmZpZ19kaXIiIDE+JjI7IGV4aXQgMTsgfQorICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgYWNfcG9wZGlyPWBwd2RgCisgICAgY2QgJGFjX2NvbmZpZ19kaXIKKworICAgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAvJGFjX2NvbmZpZ19kaXIuCisgICAgICBhY19kb3RzPWBlY2hvICRhY19jb25maWdfZGlyfHNlZCAtZSAncyVeXC4vJSUnIC1lICdzJVteL10kJSYvJScgLWUgJ3MlW14vXSovJS4uLyVnJ2AKKworICAgIGNhc2UgIiRzcmNkaXIiIGluCisgICAgLikgIyBObyAtLXNyY2RpciBvcHRpb24uICBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgICBhY19zdWJfc3JjZGlyPSRzcmNkaXIgOzsKKyAgICAvKikgIyBBYnNvbHV0ZSBwYXRoLgorICAgICAgYWNfc3ViX3NyY2Rpcj0kc3JjZGlyLyRhY19jb25maWdfZGlyIDs7CisgICAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgICAgYWNfc3ViX3NyY2Rpcj0kYWNfZG90cyRzcmNkaXIvJGFjX2NvbmZpZ19kaXIgOzsKKyAgICBlc2FjCisKKyAgICAjIENoZWNrIGZvciBndWVzdGVkIGNvbmZpZ3VyZTsgb3RoZXJ3aXNlIGdldCBDeWdudXMgc3R5bGUgY29uZmlndXJlLgorICAgIGlmIHRlc3QgLWYgJGFjX3N1Yl9zcmNkaXIvY29uZmlndXJlOyB0aGVuCisgICAgICBhY19zdWJfY29uZmlndXJlPSRhY19zdWJfc3JjZGlyL2NvbmZpZ3VyZQorICAgIGVsaWYgdGVzdCAtZiAkYWNfc3ViX3NyY2Rpci9jb25maWd1cmUuaW47IHRoZW4KKyAgICAgIGFjX3N1Yl9jb25maWd1cmU9JGFjX2NvbmZpZ3VyZQorICAgIGVsc2UKKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogbm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBpbiAkYWNfY29uZmlnX2RpciIgMT4mMgorICAgICAgYWNfc3ViX2NvbmZpZ3VyZT0KKyAgICBmaQorCisgICAgIyBUaGUgcmVjdXJzaW9uIGlzIGhlcmUuCisgICAgaWYgdGVzdCAtbiAiJGFjX3N1Yl9jb25maWd1cmUiOyB0aGVuCisKKyAgICAgICMgTWFrZSB0aGUgY2FjaGUgZmlsZSBuYW1lIGNvcnJlY3QgcmVsYXRpdmUgdG8gdGhlIHN1YmRpcmVjdG9yeS4KKyAgICAgIGNhc2UgIiRjYWNoZV9maWxlIiBpbgorICAgICAgLyopIGFjX3N1Yl9jYWNoZV9maWxlPSRjYWNoZV9maWxlIDs7CisgICAgICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgICAgIGFjX3N1Yl9jYWNoZV9maWxlPSIkYWNfZG90cyRjYWNoZV9maWxlIiA7OworICAgICAgZXNhYworICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KKyAgICAgICAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OworICAgICAgICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OworICAgICAgICBlc2FjCisKKyAgICAgIGVjaG8gInJ1bm5pbmcgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX3N1Yl9jb25maWd1cmUgJGFjX3N1Yl9jb25maWd1cmVfYXJncyAtLWNhY2hlLWZpbGU9JGFjX3N1Yl9jYWNoZV9maWxlIC0tc3JjZGlyPSRhY19zdWJfc3JjZGlyIgorICAgICAgIyBUaGUgZXZhbCBtYWtlcyBxdW90aW5nIGFyZ3VtZW50cyB3b3JrLgorICAgICAgaWYgZXZhbCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfc3ViX2NvbmZpZ3VyZSAkYWNfc3ViX2NvbmZpZ3VyZV9hcmdzIC0tY2FjaGUtZmlsZT0kYWNfc3ViX2NhY2hlX2ZpbGUgLS1zcmNkaXI9JGFjX3N1Yl9zcmNkaXIKKyAgICAgIHRoZW4gOgorICAgICAgZWxzZQorICAgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19zdWJfY29uZmlndXJlIGZhaWxlZCBmb3IgJGFjX2NvbmZpZ19kaXIiIDE+JjI7IGV4aXQgMTsgfQorICAgICAgZmkKKyAgICBmaQorCisgICAgY2QgJGFjX3BvcGRpcgorICBkb25lCitmaQorCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvc2ltL2NvbmZpZ3VyZS5pbiBiL3NpbS9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzMTZkYQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9jb25maWd1cmUuaW4KQEAgLTAsMCArMSwxODcgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorQUNfUFJFUkVRKDIuMTIuMSlkbmwKK0FDX0lOSVQoTWFrZWZpbGUuaW4pCisKK0FDX1BST0dfQ0MKK0FDX1BST0dfSU5TVEFMTAorQUNfQ0hFQ0tfVE9PTChBUiwgYXIpCitBQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQorCitBQ19DT05GSUdfQVVYX0RJUihgY2QgJHNyY2Rpcjtwd2RgLy4uKQorQUNfQ0FOT05JQ0FMX1NZU1RFTQorQUNfQVJHX1BST0dSQU0KK0FDX1BST0dfQ0MKK0FDX1NVQlNUKENGTEFHUykKK0FDX1NVQlNUKEhERUZJTkVTKQorQVI9JHtBUi1hcn0KK0FDX1NVQlNUKEFSKQorQUNfUFJPR19SQU5MSUIKKworIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgorQUNfQ19DUk9TUworaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KKyAgQ0NfRk9SX0JVSUxEPSckKENDKScKK2Vsc2UKKyAgQ0NfRk9SX0JVSUxEPWdjYworZmkKK0FDX1NVQlNUKENDX0ZPUl9CVUlMRCkKKworIyBJZiBhIGNwdSBldmVyIGhhcyBtb3JlIHRoYW4gb25lIHNpbXVsYXRvciB0byBjaG9vc2UgZnJvbSwgdXNlCisjIC0tZW5hYmxlLXNpbT0uLi4gdG8gY2hvb3NlLgorQUNfQVJHX0VOQUJMRShzaW0sCitbICAtLWVuYWJsZS1zaW0gXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCit5ZXMgfCBubykgOzsKKyopCUFDX01TR19FUlJPUihiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGdpdmVuIGZvciAtLWVuYWJsZS1zaW0gb3B0aW9uKSA7OworZXNhY10pCisKKyMgQXNzdW1lIHNpbXVsYXRvciBjYW4gYmUgYnVpbHQgd2l0aCBjYy4KKyMgSWYgdGhlIHVzZXIgcGFzc2VzIC0tZW5hYmxlLXNpbSBidWlsdCBpdCByZWdhcmRsZXNzIG9mICQoQ0MpLgorb25seV9pZl9nY2M9bm8KK29ubHlfaWZfZW5hYmxlZD1ubworZXh0cmFfc3ViZGlycz1jb21tb24KKworIyBXSEVOIEFERElORyBFTlRSSUVTIFRPIFRISVMgTUFUUklYOgorIyAgTWFrZSBzdXJlIHRoYXQgdGhlIGxlZnQgc2lkZSBhbHdheXMgaGFzIHR3byBkYXNoZXMuICBPdGhlcndpc2UgeW91CisjICBjYW4gZ2V0IHNwdXJpb3VzIG1hdGNoZXMuICBFdmVuIGZvciB1bmFtYmlndW91cyBjYXNlcywgZG8gdGhpcyBhcyBhCisjICBjb252ZW50aW9uLCBlbHNlIHRoZSB0YWJsZSBiZWNvbWVzIGEgcmVhbCBtZXNzIHRvIHVuZGVyc3RhbmQgYW5kIG1haW50YWluLgorCitjYXNlICIke3RhcmdldH0iIGluCisgIGFybSotKi0qKQkJc2ltX3RhcmdldD1hcm0gOzsKKyAgc3Ryb25nYXJtKi0qLSopCXNpbV90YXJnZXQ9YXJtIDs7CisgIHRodW1iKi0qLSopICAgICAgICAgICBzaW1fdGFyZ2V0PWFybSA7OworICBkMTB2LSotKikJCXNpbV90YXJnZXQ9ZDEwdiA7OworICBkMzB2LSotKikKKwlzaW1fdGFyZ2V0PWQzMHYKKwlvbmx5X2lmX2djYz15ZXMKKwlleHRyYV9zdWJkaXJzPSIke2V4dHJhX3N1YmRpcnN9IGlnZW4iCisJOzsKKyAgZnIzMC0qLSopCQlzaW1fdGFyZ2V0PWZyMzAgOzsKKyAgaDgzMDAqLSotKikJCXNpbV90YXJnZXQ9aDgzMDAgOzsKKyAgaDg1MDAtKi0qKQkJc2ltX3RhcmdldD1oODUwMCA7OworICBpOTYwLSotKikJCXNpbV90YXJnZXQ9aTk2MCA7OworICBtMzJyLSotKikJCXNpbV90YXJnZXQ9bTMyciA7OworICBtaXBzKi0qLSopCisJIyBUaGUgTUlQUyBzaW11bGF0b3IgY2FuIG9ubHkgYmUgY29tcGlsZWQgYnkgZ2NjLgorCXNpbV90YXJnZXQ9bWlwcworCW9ubHlfaWZfZ2NjPXllcworCWV4dHJhX3N1YmRpcnM9IiR7ZXh0cmFfc3ViZGlyc30gaWdlbiIKKwk7OworICBtbjEwMzAwKi0qLSopCisJIyBUaGUgbW4xMDMwMCBzaW11bGF0b3IgY2FuIG9ubHkgYmUgY29tcGlsZWQgYnkgZ2NjLgorCXNpbV90YXJnZXQ9bW4xMDMwMAorCW9ubHlfaWZfZ2NjPXllcworCWV4dHJhX3N1YmRpcnM9IiR7ZXh0cmFfc3ViZGlyc30gaWdlbiIKKwk7OworICBtbjEwMjAwKi0qLSopCisJc2ltX3RhcmdldD1tbjEwMjAwCisJOzsKKyAgc2gqLSotKikJCXNpbV90YXJnZXQ9c2ggOzsKKyAgcG93ZXJwYyotKi1lYWJpKiB8IHBvd2VycGMqLSotc29sYXJpcyogfCBwb3dlcnBjKi0qLXN5c3Y0KiB8IHBvd2VycGMqLSotZWxmKiB8IHBvd2VycGMqLSotbGludXgqICkKKwkjIFRoZSBQb3dlclBDIHNpbXVsYXRvciB1c2VzIHRoZSBHQ0MgZXh0ZW5zaW9uIGxvbmcgbG9uZyBhcyB3ZWxsIGFzCisJIyBBTlNJIHByb3RvdHlwZXMsIHNvIGRvbid0IGVuYWJsZSBpdCBmb3IgcmFuZG9tIGhvc3QgY29tcGlsZXJzCisJIyB1bmxlc3MgYXNrZWQgdG8uCisJc2ltX3RhcmdldD1wcGMKKwlvbmx5X2lmX2djYz15ZXMKKwkjZXh0cmFfc3ViZGlycz0iJHtleHRyYV9zdWJkaXJzfSIKKwk7OworICB2ODUwLSotKikKKwkjIFRoZSBWODUwIHNpbXVsYXRvciBjYW4gb25seSBiZSBjb21waWxlZCBieSBnY2MuCisJc2ltX3RhcmdldD12ODUwCisJZXh0cmFfc3ViZGlycz0iJHtleHRyYV9zdWJkaXJzfSBpZ2VuIgorCW9ubHlfaWZfZ2NjPXllcworCTs7CisgIHY4NTBlLSotKikKKwkjIFRoZSBWODUwIHNpbXVsYXRvciBjYW4gb25seSBiZSBjb21waWxlZCBieSBnY2MuCisJc2ltX3RhcmdldD12ODUwCisJZXh0cmFfc3ViZGlycz0iJHtleHRyYV9zdWJkaXJzfSBpZ2VuIgorCW9ubHlfaWZfZ2NjPXllcworCTs7CisgIHY4NTBlYS0qLSopCisJIyBUaGUgVjg1MCBzaW11bGF0b3IgY2FuIG9ubHkgYmUgY29tcGlsZWQgYnkgZ2NjLgorCXNpbV90YXJnZXQ9djg1MAorCWV4dHJhX3N1YmRpcnM9IiR7ZXh0cmFfc3ViZGlyc30gaWdlbiIKKwlvbmx5X2lmX2djYz15ZXMKKwk7OworICB3NjUtKi0qKQorCXNpbV90YXJnZXQ9dzY1CisJIyBUaGUgdzY1IGlzIHN1ZmZlcmluZyBmcm9tIGdyYWR1YWwgZGVjYXkuCisJb25seV9pZl9lbmFibGVkPXllcworCTs7CisgIHo4ayotKi0qKQkJc2ltX3RhcmdldD16OGsgOzsKKyAgc3BhcmM2NC0qLSopCisJb25seV9pZl9nY2M9eWVzCisJaWYgdGVzdCAieCR7d2l0aF9jZ2VufSIgPSB4eWVzIC1vICJ4JHt3aXRoX2NnZW5fc2ltfSIgPSB4eWVzIDsgdGhlbgorCQlzaW1fdGFyZ2V0PXNwYXJjCisJCWV4dHJhX3N1YmRpcnM9IiR7ZXh0cmFfc3ViZGlyc30gdGVzdHN1aXRlIgorCWVsc2UKKwkJc2ltX3RhcmdldD1ub25lICMgRG9uJ3QgYnVpbGQgZXJjMzIgaWYgc3BhcmM2NC4KKwlmaQorCTs7CisgIHNwYXJjbGl0ZSotKi0qIHwgc3BhcmM4NngqLSotKikKKwkjIFRoZSBTUEFSQyBzaW11bGF0b3IgY2FuIG9ubHkgYmUgY29tcGlsZWQgYnkgZ2NjLgorCW9ubHlfaWZfZ2NjPXllcworCWlmIHRlc3QgIngke3dpdGhfY2dlbn0iID0geHllcyAtbyAieCR7d2l0aF9jZ2VuX3NpbX0iID0geHllcyA7IHRoZW4KKwkJc2ltX3RhcmdldD1zcGFyYworCQlleHRyYV9zdWJkaXJzPSIke2V4dHJhX3N1YmRpcnN9IHRlc3RzdWl0ZSIKKwllbHNlCisJCXNpbV90YXJnZXQ9ZXJjMzIKKwlmaQorCTs7CisgIHNwYXJjKi0qLSopCisJIyBUaGUgU1BBUkMgc2ltdWxhdG9yIGNhbiBvbmx5IGJlIGNvbXBpbGVkIGJ5IGdjYy4KKwlvbmx5X2lmX2djYz15ZXMKKwlpZiB0ZXN0ICJ4JHt3aXRoX2NnZW59IiA9IHh5ZXMgLW8gIngke3dpdGhfY2dlbl9zaW19IiA9IHh5ZXMgOyB0aGVuCisJCXNpbV90YXJnZXQ9c3BhcmMKKwkJZXh0cmFfc3ViZGlycz0iJHtleHRyYV9zdWJkaXJzfSB0ZXN0c3VpdGUiCisJZWxzZQorCQkjIFVuZm9ydHVuYXRlbHkgZXJjMzIgd29uJ3QgYnVpbGQgb24gbWFueSBob3N0cywgc28gb25seSBlbmFibGUKKwkJIyBpdCBpZiB0aGUgdXNlciByZWFsbHkgcmVhbGx5IHdhbnRzIGl0LgorCQlvbmx5X2lmX2VuYWJsZWQ9eWVzCisJCXNpbV90YXJnZXQ9ZXJjMzIKKwlmaQorCTs7CisgICopCQkJc2ltX3RhcmdldD1ub25lIDs7Citlc2FjCisKKworCisKKyMgSXMgdGhlcmUgYSB0ZXN0c3VpdGUgZGlyZWN0b3J5IGZvciB0aGUgdGFyZ2V0PwordGVzdGRpcj1gZWNobyAke3RhcmdldH0gfCBzZWQgLWUgJ3MvLS4qLS8tLydgCitpZiB0ZXN0IC1yICR7c3JjZGlyfS90ZXN0c3VpdGUvJHt0ZXN0ZGlyfS9jb25maWd1cmUgOyB0aGVuCisgIGV4dHJhX3N1YmRpcnM9IiR7ZXh0cmFfc3ViZGlyc30gdGVzdHN1aXRlIgorZmkKKworCitjYXNlICIke2VuYWJsZV9zaW19IiBpbgorbm8pCXNpbV90YXJnZXQ9bm9uZSA7OworeWVzKQorCWlmIHRlc3QgJHtvbmx5X2lmX2djY30gPSB5ZXMgOyB0aGVuCisJCWlmIHRlc3QgIiR7R0NDfSIgIT0geWVzIDsgdGhlbgorCQkJZWNobyAiQ2FuJ3QgZW5hYmxlIHNpbXVsYXRvciBzaW5jZSBub3QgY29tcGlsaW5nIHdpdGggR0NDLiIKKwkJCXNpbV90YXJnZXQ9bm9uZQorCQlmaQorCWZpCisJOzsKKyopCisJaWYgdGVzdCAke29ubHlfaWZfZW5hYmxlZH0gPSB5ZXMgOyB0aGVuCisJCXNpbV90YXJnZXQ9bm9uZQorCWVsc2UKKwkJaWYgdGVzdCAke29ubHlfaWZfZ2NjfSA9IHllcyA7IHRoZW4KKwkJCWlmIHRlc3QgIiR7R0NDfSIgIT0geWVzIDsgdGhlbgorCQkJCXNpbV90YXJnZXQ9bm9uZQorCQkJZmkKKwkJZmkKKwlmaQorCTs7Citlc2FjCisKK2lmIHRlc3QgeCIke3NpbV90YXJnZXR9IiAhPSB4bm9uZSA7IHRoZW4KKwljb25maWdkaXJzPSIke2V4dHJhX3N1YmRpcnN9ICR7c2ltX3RhcmdldH0iCisJQUNfQ09ORklHX1NVQkRJUlMoJGNvbmZpZ2RpcnMpCitmaQorCitBQ19PVVRQVVQoTWFrZWZpbGUpCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvc2ltL2QxMHYvQ2hhbmdlTG9nIGIvc2ltL2QxMHYvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYjhjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZDEwdi9DaGFuZ2VMb2cKQEAgLTAsMCArMSw5NzQgQEAKKzE5OTktMDEtMjYgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogc2ltb3BzLmMgKE9QXzU2MDcpOiBDb3JyZWN0IHNhdHVyYXRpb24gY29tcGFyaXNvbi9hc3NpZ25tZW50LgorCShPUF8xMjAxLCBPUF8xMjAzLCBPUF8xNzAwMTIwMCwgT1BfMTcwMDEyMDIsIAorICAgICAgICAgT1BfMkEwMCwgT1BfMjgwMCwgT1BfMkMwMCwgT1BfMzIwMCwgT1BfMzIwMSwgCisgICAgICAgICBPUF8xMDAxLCBPUF8xMDAzLCBPUF8xNzAwMTAwMCwgT1BfMTcwMDEwMDIpOiBEaXR0by4KKworMTk5OS0wMS0yNiAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQorCisJKiBzaW1vcHMuYyAoT1BfNTYwNSk6IFNpZ24gZXh0ZW5kIE1JTjMyIGFuZCBNQVgzMiBiZWZvcmUgc2F0dXJhdGlvbgorICAgICAgICBjb21wYXJpc29uLgorCShPUF81NjA3KTogRGl0dG8uCisJKE9QXzJBMDApOiBEaXR0by4KKwkoT1BfMjgwMCk6IERpdHRvLgorCisxOTk5LTAxLTEzICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCisKKwkqIHNpbW9wcy5jIChPUF8xMjIzKTogU2lnbiBleHRlbmQgTUlOMzIgYW5kIE1BWDMyIGJlZm9yZSBzYXR1cmF0aW9uCisJY29tcGFyaXNvbi4KKworVHVlIE5vdiAyNCAxNzowNDo0MyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChzeXMvc3lzY2FsbC5oKTogSW5jbHVkZSB0YXJnLXZhbHMuaCBpbnN0ZWFkLgorCShTWVNfKik6IFJlcGxhY2Ugd2l0aCBUQVJHRVRfU1lTXyouCisKKwkqIE1ha2VmaWxlLmluOiBBZGQgZGVwZW5kZW5jeSBvbiB0YXJnLXZhbHMuaC4KKwkoTkxfVEFSR0VUKTogRGVmaW5lIGFzIE5MX1RBUkdFVF9kMTB2LgorCitXZWQgU2VwIDMwIDAwOjA2OjMyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYW15LmN5Z251cy5jb20+CisKKwkqIGludGVycC5jICh4ZmVyX21lbSk6IE1pc3NpbmcgYnJlYWssIGluc3RydWN0aW9uIG1lbW9yeSBjYXNlCisgCWZsb3dlZCBpbnRvIHVuaWZpZWQgbWVtb3J5IGNhc2UuCisKK1dlZCBTZXAgMzAgMTA6MTQ6MTggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogc2ltb3BzLmM6IElmIGxvYWQgaW5zdHJ1Y3Rpb24gd2l0aCBhdXRvIGluY3JlbWVudC9kZWNyZW1lbnQKKwlhZGRyZXNzaW5nIGlzIHVzZWQgd2hlbiB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgaXMgdGhlIHNhbWUgYXMKKwl0aGUgYWRkcmVzcyByZWdpc3RlciwgdGhlbiBpZ25vcmUgdGhlIGF1dG8gaW5jcmVtZW50L2RlY3JlbWVudC4KKworVHVlIEFwciAyOCAxODozMzozMSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitTdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitTdW4gQXByIDI2IDE1OjIwOjIzIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogYWNjb25maWcuaDogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KKworRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworRnJpIEFwciAyNCAxMToyMDowNiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBzaW5jbHVkZS4KKworRnJpIEFwciAyNCAxMTowNDo0NiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGNob29rLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzdHJ1Y3QgaGFzaF9lbnRyeSk6IE9QQ09ERSBhbmQgTUFTSyBhcmUgdW5zaWduZWQuCisKKwkqIGQxMHZfc2ltLmggKHJlbW90ZS1zaW0uaCwgc2ltLWNvbmZpZy5oKTogSW5jbHVkZS4KKwkKK1NhdCBBcHIgIDQgMjA6MzY6MjUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBBcHIgIDEgMTI6NTk6MTcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAodHJhY2VfaW5wdXRfZnVuYyk6IFVzZSBtb3ZlX2Zyb21fY3IgLyBDUkVHUyB0byBvYnRhaW4KKyAJdXAtdG8tZGF0ZSBDUiB2YWx1ZS4KKwkoT1BfT1BfMTAwMDAwMCwgYWRkMyk6IFRyYWNlIGlucHV0cyBiZWZvcmUgcGVyZm9ybWluZyBhZGQuCisJKE9QXzVGMDAsIDwqPik6IFRyYWNlIGlucHV0IHJlZ2lzdGVycyBiZWZvcmUgbWFraW5nIHN5c3RlbSBjYWxsLgorCShPUF81RjAwLCA8a2lsbD4pOiBUcmFjZSBSMCwgUjEgbm90IFJFR24uCisJKE9QXzVGMDAsIDxnZXRwaWQ+KTogQWx3YXlzIHJldHVybiA0Ny4KKwkKKwkqIGQxMHZfc2ltLmggKFNMT1QsIFNMT1RfTlIsIFNMT1RfUEVORF9NQVNLLCBTTE9UX1BFTkQsCisgCVNMT1RfRElTQ0FSRCwgU0xPVF9GTFVTSCk6IERlZmluZS4gIEFuIGltcGxlbWVudGF0aW9uIG9mIHdyaXRlCisgCWJhY2sgc2xvdHMuCisJKHN0cnVjdCBfc3RhdGUpOiBBZGQgc3RydWN0IHNsb3Qgc2xvdCB0byBnbG9iYWwgc3RhdGUgdmFyaWFibGUuCisJKHN0cnVjdCBfc3RhdGUpOiBEZWxldGUgZmllbGRzIFNNLCBFQSwgREIsIERNLCBJRSwgUlAsIE1ELCBGWCwgU1QsCisgCUYwLCBGMSwgQyBmcm9tIGdsb2JhbCBTdGF0ZSB2YXJpYWJsZS4KKwkoc3RydWN0IF9zdGF0ZSk6IEFkZCBzdHJ1Y3QgdHJhY2UgdG8gZ2xvYmFsIFN0YXRlIHZhcmlhYmxlLgorCShHUFIsIFNFVF9HUFIpOiBEZWZpbmUuICBTRVRfR1BSIHVzZXMgU0xPVF9QRU5ELgorCShQU1cqLCBTRVRfUFNXKik6IERlZmluZS4gU0VUX1BTVyogdXNlcyBTRVRfQ1JFRy4KKwkoQ1JFRywgU0VUX0NSRUcsIFNFVF8qKTogRGVmaW5lLiBTRVRfQ1JFRyB1c2VzIGZ1bmMgbW92ZV90b19jci4KKwkoSU5DX0FERFIpOiBSZS1pbXBsZW1lbnQuICBVc2UgU0VUX0dQUiB0byB1cGRhdGUgcmVnaXN0ZXJzLgorCShKTVApOiBSZS1pbXBsZW1lbnQuIFVzZSBTRVRfKiB0byB1cGRhdGUgcmVnaXN0ZXJzLgorCisJKiBpbnRlcnAuYzogVXNlIG5ldyBTRVRfKiBldC5hbC4gbWFjcm9zIHRvIGZldGNoIC8gc3RvcmUKKyAJcmVnaXN0ZXJzLgorCShnZXRfb3BlcmFuZHMpOiBTcXVpcnJlbCBhd2F5IHRyYWNlIHZhbHVlcyBhdCBzdGFydCBvZiBlYWNoCisgCW9wZXJhbmQgZGVjb2RlLgorCShkb18yX3Nob3J0KTogRmx1c2ggcGVuZGluZyB3cml0ZXMgYmVmb3JlIGlzc3Vpbmcgc2Vjb25kCisgCWluc3RydWN0aW9uLgorCShzaW1fcmVzdW1lKTogRmx1c2ggcGVuZGluZyB3cml0ZXMgYXQgZW5kIG9mIGluc3RydWN0aW9uIGN5Y2xlLgorCShzaW1fZmV0Y2hfcmVnaXN0ZXIsIHNpbV9zdG9yZV9yZWdpc3Rlciwgc2ltX2NyZWF0ZV9pbmZlcmlvcik6CisgCUFmdGVyIHNjaGVkdWxpbmcgdXBkYXRlcyB0byByZWdpc3RlcnMgdXNpbmcgU0VUXyosIGZsdXNoIHVwZGF0ZXMuCisJKHNpbV9yZXN1bWUpOiBSZS1vcmRlciBoYW5kbGluZyBvZiBSUFQvcmVwZWF0IGFuZCBJQkEvaGJyZWFrIHNvCisgCXRoYXQgZWFjaCBzZXRzIHBjIHVzaW5nIFNFVF8qIGFuZCBsYXN0IFNFVF8qIGV2ZW50dWFsbHkgd2luZHMgb3V0LgorCQorCSogc2ltb3BzLmM6IFVzZSBuZXcgU0VUXyogZXQuYWwuIG1hY3JvcyB0byBmZXRjaCAvIHN0b3JlCisgCXJlZ2lzdGVycy4KKwkobW92ZV90b19jcik6IEFkZCBNQVNLIGFyZ3VtZW50IGZvciBzZWxlY3RpdmUgdXBkYXRlIG9mIENSRUcgYml0cy4KKyAgCVJlLWltcGxlbWVudCB1c2luZyBuZXcgU0VUXyogbWFjcm9zLgorCSh0cmFjZV9vdXRwdXRfZnVuYywgdHJhY2Vfb3V0cHV0KTogRGVsZXRlLiBSZXBsYWNlIHdpdGguCisJKGRvX3RyYWNlX291dHB1dF9mbHVzaCwgdHJhY2Vfb3V0cHV0X2ZpbmlzaCwgdHJhY2Vfb3V0cHV0XzQwLAorIAl0cmFjZV9vdXRwdXRfMzIsIHRyYWNlX291dHB1dF8xNiwgdHJhY2Vfb3V0cHV0X3ZvaWQsCisgCXRyYWNlX291dHB1dF9mbGFnKTogTmV3IGZ1bmN0aW9ucy4gIEhhbmRsZSBzcGVjaWZpYyB0cmFjZSBjYXNlcy4KKwkoT1BfKik6IFJlLXdyaXRlIHRyYWNpbmcgdG8gdXNlIG5ldyB0cmFjZV9vdXRwdXRfKiBmdW5jdGlvbnMuCisJKE9QXyopOiBSZS13cml0ZSB0byB1c2UgbmV3IFNFVF8qIGV0LmFsLiBtYWNyb3MuCisJKEZVTkMsIFBBUk1bMS00XSwgUkVUVkFMLCBSRVRWQUwzMik6IFJlZG8gZGVmaW5pdGlvbi4KKwkoUkVUVkFMX0hJR0gsIFJFVFZBTF9MT1cpOiBEZWxldGUsIHVzZSBSRVRWQUwzMi4KKwkKK1dlZCBBcHIgIDEgMTI6NTU6MTggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKFNJTV9BQ19PUFRJT05fV0FSTklOR1MpOiBBZGQuCisJY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKworRnJpIE1hciAyNyAxNjoxNTo1MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIE1hciAyNSAxMjozNToyOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIE1hciAxOCAxMjozODoxMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVHVlIEZlYiAxNyAxMjozODo0MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fc3RvcmVfcmVnaXN0ZXIsIHNpbV9mZXRjaF9yZWdpc3Rlcik6IFBhc3MgaW4KKyAJbGVuZ3RoIHBhcmFtZXRlci4gIFJldHVybiAtMS4KKworTW9uIE9jdCAyNyAxNDo0MzozMyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogKGRtZW1fYWRkcik6IElmIGFkZHJlc3MgaXMgaWxsZWdhbCBvciBpbiBJL08gc3BhY2UsIHNpZ25hbCBhIGJ1cworIAllcnJvci4gIEFsbG9jYXRlIHVuaWZpZWQgbWVtb3J5IG9uIGRlbWFuZC4gIEZpeCBETUVNIGFkZHJlc3MKKyAJY2FsY3VsYXRpb25zLgorCQorTW9uIEZlYiAxNiAxMDoyNzo1MyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF81RjIwKTogSW1wbGVtZW50ICJkYnQiLgorCShPUF81RjYwKTogSW1wbGVtZW50ICJydGQiLgorCisJKiBkMTB2X3NpbS5oIChEUENfQ1IpOiBEZWZpbmUgZW51bS4KKwkoREJUX1ZFQ1RPUl9TVEFSVCk6IERlZmluZQorCShEUFNXLCBEUEMpOiBEZWZpbmUuCisKK0ZyaSBGZWIgMTMgMTU6MTU6NTggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAobW92ZV90b19jcik6IFN5bmMgcmVnc1tTUF9JRFhdIHdpdGggU3RhdGUuc3AgYWNjb3JkaW5nCisgCXRvIFBTVzpTTS4KKworCSogZDEwdl9zaW0uaCAoc3RydWN0IF9zdGF0ZSk6IEFkZCBzcCwgYXMgaG9sZGluZyBhcmVhIGZvciBTUEkvU1BVLgorCShTUF9JRFgpOiBEZWZpbmUuCisKK1dlZCBGZWIgMTEgMTY6NTM6NDkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAoT1BfNUYwMCk6IENhbGwgZXJyb3IgaW5zdGVhZCBvZiBhYm9ydCBmb3IgdW5rbm93bgorIAlzeXNjYWxscy4KKworCSogZDEwdl9zaW0uaCAoZW51bSk6IERlZmluZSBEUFNXX0NSLgorCisJKiBzaW1vcHMuYyAobW92ZV90b19jcik6IE1hc2sgb3V0IGhhcmR3aXJlZCB6ZXJvIGJpdHMgaW4gRFBTVy4KKworVHVlIEZlYiAxMCAxODoyODozOCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fd3JpdGVfcGh5cyk6IERlbGV0ZS4KKwkoc2ltX2xvYWQpOiBDYWxsIHNpbV9sb2FkX2ZpbGUgd2l0aCBzaW1fd3JpdGUgYW5kIExNQS4KKworTW9uIEZlYiAgOSAxMjowNTowMSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jOiBSZXdyaXRlIHhmZXJfbWVtIHNvIHRoYXQgaXQgdHJhbnNsYXRlcyBhZGRyZXNzZXMgYXMgLQorIAkweDAwLi4uIC0gRE1BUCB0cmFuc2xhdGVkIG1lbW9yeSwgMHgwMS4uLiBJTUFQIHRyYW5zbGF0ZWQgbWVtb3J5LAorIAkweDEwLi4uIC0gb24tY2hpcCBkYXRhLCAweDExLi4uIC0gb24tY2hpcCBpbnNuLCAweDEyLi4uIC0gdW5pZmllZAorIAltZW1vcnkuCisJKHBjX2FkZHIpOiBEZWxldGUuCisJKGltZW1fYWRkcik6IE5ldyBmdW5jdGlvbiAtIHRyYW5zbGF0ZSBJTUVNIGFkZHJlc3MuCisJKHNpbV9yZXN1bWUpOiBVc2UgaW1lbV9hZGRyIHRvIHRyYW5zbGF0ZSBpbnNuIGFkZHJlc3MsIGFib3J0IGlmCisgCXRyYW5zbGF0aW9uIGZhaWxlZC4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFdyaXRlIEFSR1YgdG8gbWVtb3J5IHVzaW5nIHNpbV93cml0ZS4gIFBhc3MKKyAJYXJnYy9hcmd2IHVzaW5nIHIwL3IxIG5vdCByMi9yMy4KKwkoc2ltX3NpemUpOiBEbyBub3QgaW5pdGlhbGl6ZSBJTUFQL0RNQVAgaGVyZS4KKwkoc2ltX29wZW4pOiBDYWxsIHNpbV9jcmVhdGVfaW5mZXJpb3IgYW5kIHNpbV9zaXplIHRvIGluaXRpYWxpemUKKyAJdGhlIHN5c3RlbS4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEluaXRpYWxpemUgSU1BUC9ETUFQIHRvIGhhcmR3YXJlIHJlc2V0CisgCWRlZmF1bHRzLgorCShpbml0X3N5c3RlbSk6IERlbGV0ZS4KKwkoeGZlcl9tZW0sIHNpbV9mZXRjaF9yZWdpc3Rlciwgc2ltX3N0b3JlX3JlZ2lzdGVyKTogRG8gbm90IGNhbGwKKyAJaW5pdF9zeXN0ZW0uCisJKGRlY29kZV9wYyk6IENoZWNrIHByb2dfYmZkIGlzIGRlZmluZWQgYmVmb3JlIGxvb2tpbmcgdXAgLnRleHQKKyAJc2VjdGlvbi4KKworU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworU3VuIEphbiAyNSAyMjoyMzowMSAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9zdG9wX3JlYXNvbik6IEV4aXQgc3RhdHVzIGlzIG5vdyBpbiByMCwgbm90IHIyLgorCitTYXQgSmFuIDI0IDE5OjAwOjMwIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBkMTB2X3NpbS5oIChERUJVR19UUkFQKTogTmV3IGRlYnVnIGZsYWcuCisKKwkqIHNpbW9wcy5jIChPUF81RjAwKTogSWYgREVCVUdfVFJBUCBpcyBvbiwgdHVybiB0cmFwcyAwLTE0IGludG8KKwlwcmludGluZyB0aGUgcmVnaXN0ZXJzLgorCitUaHUgSmFuIDIyIDE3OjU0OjAxIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAob3BfdHlwZXMpOiBOZXcgQUJJLCBhcmdzIGFyZSByMC4ucjMsIHN5c3RlbSBjYWxsICMgaXMKKwlpbiByNC4KKwkodHJhY2Vfe2luLG91dH1wdXRfZnVuYyk6IERpdHRvLgorCShPUF80OTAwKTogRGl0dG8uCisJKE9QXzI0ODAwMDAwKTogRGl0dG8uCisJKE9QXzREMDApOiBEaXR0by4KKwkoT1BfNUYwMCk6IERpdHRvLgorCitUaHUgSmFuIDIyIDE0OjMwOjM2IDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoVU1FTV9TRUdNRU5UUyk6IE5ldyBkZWZpbmUsIHNldCB0byAxMjguCisJKHNpbV9zaXplKTogVXNlIFVNRU1fU0VHTUVOVFMgcmF0aGVyIHRoYW4gaGFyZHdpcmVkIGNvbnN0YW50LgorCShzaW1fY2xvc2UpOiBSZXNldCBwcm9nX2JmZCB0byBOVUxMIGFmdGVyIGNsb3NpbmcgaXQuICBBbHNvCisJcmVzZXQgcHJvZ19iZmRfd2FzX29wZW5lZF9wIGFmdGVyIGNsb3NpbmcgcHJvZ19iZmQuCisJKHNpbV9sb2FkKTogUmVzZXQgcHJvZ19iZmRfd2FzX29wZW5lZF9wIGFmdGVyIGNsb3NpbmcgcHJvZ19iZmQuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBHZXQgc3RhcnQgYWRkcmVzcyBmcm9tIGFiZmQgbm90IHByb2dfYmZkLgorCSh4ZmVyX21lbSk6IERvIGJvdW5kcyBjaGVja2luZyBvbiBhZGRyZXNzZXMgYW5kIHJldHVybiB6ZXJvIGxlbmd0aAorCXJlYWQvd3JpdGUgb24gYmFkIGFkZHJlc3NlcywgcmF0aGVyIHRoYW4gYWJvcnRpbmcuICBQcmVwYXJlIHRvCisJYmUgYWJsZSB0byBoYW5kbGUgeGZlcnMgdGhhdCBjcm9zcyBzZWdtZW50IGJvdW5kYXJpZXMsIGJ1dCBub3QKKwl5ZXQgaW1wbGVtZW50ZWQuICBPbmx5IGVtaXQgZGVidWcgbWVzc2FnZSB3aGVuIGQxMHZfZGVidWcgaXMKKwlzZXQgYXMgd2VsbCBhcyBERUJVRyBiZWluZyBkZWZpbmVkLgorCitNb24gSmFuIDE5IDIyOjI2OjI5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gRGVjIDE1IDIzOjE3OjExIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworVHVlIERlYyAgOSAxMDoyODozMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGQxMHZfc2ltLmggKFJQVF9TKTogSW5kZXggY3JlZ3Mgd2l0aCBSUFRfU19DUiBub3QgUlBUX0VfQ1IuCisJKEJQU1cpOiBEaXR0byBmb3IgQlBTV19DUiBhbmQgbm90IFBTV19DUi4KKworCSogc2ltb3BzLmMgKE9QXzVGNDApOiBKTVAgdG8gQlBDIGluc3RlYWQgb2YgYXNzaWduaW5nIFBDIGRpcmVjdGx5LgorCQorTW9uIERlYyAgOCAxMjo1ODozMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF81RjAwKTogRnJvbSBNYXJ0aW4gSHVudCA8aHVudEBjeWdudXMuY29tPi4gQ2hhbmdlCisgCXJlc2VydmVkIHRyYXAgZnJvbSAwIHRvIDE1LiBBZGQgdHJhcCBlbXVsYXRpb24gY29kZSBmb3IgMC0xNC4KKworCSogaW50ZXJwLmMgKHNpbV9yZXN1bWUpOiBGcm9tIE1hcnRpbiBIdW50IDxodW50QGN5Z251cy5jb20+LiBDaGVjaworIAlJQkEgZm9yIFNEQlQuCisKKwkqIGQxMHZfc2ltLmggKEFFX1ZFQ1RPUl9TVEFSVCwgUklFX1ZFQ1RPUl9TVEFSVCwKKyAJU0RCVF9WRUNUT1JfU1RBUlQsIFRSQVBfVkVDVE9SX1NUQVJUKTogRGVmaW5lLgorCQorCSogc2ltb3BzLmMgKE9QXzVGMDApOiBGb3IgInRyYXAiLCBtYXNrIG91dCBhbGwgYnV0IFNNIGJpdCBpbiBQU1csCisgCXVzZSBtb3ZlX3RvX2NyLgorCShPUF81RjAwKTogRm9yICJ0cmFwIiwgdXBkYXRlIEJQU1cgd2l0aCBtb3ZlX3RvX2NyLgorCitGcmkgRGVjICA1IDE1OjMxOjE3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZDEwdl9zaW0uaCAoZW51bSk6IEVudW1lcmF0ZSBDUiByZWdpc3RlciBuYW1lcy4KKwkoZW51bSk6IEVudW1lcmF0ZSBQU1cgYml0IHZhbHVlcy4KKwkoUFNXKTogT2J0YWluIHZhbHVlIHVpbmcgbW92ZV9mcm9tX2NyLgorCShNT0RfUywgTU9EX0UsIEJQU1cpOiBNYWtlIHItdmFsdWVzLgorCShtb3ZlX2Zyb21fY3IsIG1vdmVfdG9fY3IpOiBEZWNsYXJlIGZ1bmN0aW9ucy4KKwkKKwkqIGludGVycC5jIChzaW1fZmV0Y2hfcmVnaXN0ZXIsIHNpbV9zdG9yZV9yZWdpc3Rlcik6IFVzZQorIAltb3ZlX2Zyb21fY3IgYW5kIG1vdmVfdG9fY3IgZm9yIENSIHJlZ2lzdGVyIHRyYW5zZmVycy4KKworCSogc2ltb3BzLmMgKG1vdmVfZnJvbV9jciwgbW92ZV90b19jcik6IE5ldyBmdW5jdGlvbnMuCisJKE9QXzVGNDApOiBNb3ZlIEJQU1cgdG8gUFNXIHVzaW5nIG1vdmVfdG9fY3IgYW5kIG1vdmVfZnJvbV9jci4KKwkoT1BfNTYwMCk6IEZvciAibXZ0YyIsIHVzZSBmdW5jdGlvbiBtb3ZlX3RvX2NyLgorCShPUF81MjAwKTogRm9yICJtdmZjIiwgdXNlIGZ1bmN0aW9uIG1vdmVfZnJvbV9jci4KKworRnJpIERlYyAgNSAxMzozMzoxNCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF81NjAwKTogRm9yICJtdnRjIiBNT0RfRSBhbmQgTU9EX1MsIGVuc3VyZSB0aGF0IHRoZQorIAlMU2JpdCBpcyB6ZXJvLgorCitUaHUgRGVjICA0IDA5OjIxOjA1IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVGh1IERlYyAgNCAxNjo1MTowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGQxMHZfc2ltLmggKHN0cnVjdCBfc3RhdGUpOiBBZGQgRE0gLSBQU1cgZGVidWcgbWFzay4KKworCSogc2ltb3BzLmMgKE9QXzU2MDApOiBGb3IgIm12dGMiLCBzYXZlIFBTVy5ETS4KKwkoT1BfNTIwMCk6IERpdHRvIGZvciAibXZmYyIuCisKK1dlZCBEZWMgIDMgMTc6Mjc6MDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBkMTB2X3NpbS5oIChTRVhUNTYpOiBEZWZpbmUuCisKKwkqIHNpbW9wcy5jIChPUF80MjAxKTogRm9yICJyYWMiLCBzaWduIGV4dGVuZCA1NiBiaXQgdmFsdWUgYmVmb3JlCisgCWl0IGlzIHNoaWZ0ZWQuCisKKwkqIGQxMHZfc2ltLmggKE1BWDMyLCBNSU4zMiwgTUFTSzMyLCBNQVNLNDApOiBSZS1kZWZpbmUgdXNpbmcKKyAJU0lHTkVENjQgbWFjcm8uCisKK1R1ZSBEZWMgIDIgMTU6Mzg6MzQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fcmVzdW1lKTogQ2FsbCBkb18yX3Nob3J0IHdpdGggTEVGVF9GSVJTVCBvcgorCVJJR0hUX0ZJUlNULCBhcyBhcHByb3ByaWF0ZSwgaW5zdGVhZCBvZiBoYXJkY29kZWQgaW50cyB0aGF0CisJZG9uJ3QgbWF0Y2ggZW51bSB2YWx1ZXMuCisKK1R1ZSBEZWMgIDIgMTU6MDE6MDggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAoT1BfM0EwMCk6IEZvciAibWFjdSIsIHBlcmZvcm0gbXVsdGlwbHkgc3RhZ2UgdXNpbmcgMzIKKyAJYml0IHJhdGhlciB0aGFuIDE2IGJpdCBwcmVjaXNpb24uCisJKE9QXzNDMDApOiBGb3IgIm11bHh1Iiwgc3RvcmUgdW5zaWduZWQgcHJvZHVjdCBpbiBBQ0MuCisJKE9QXzM4MDApOiBGb3IgIm1zYnUiLCBzdWJ0cmFjdCB1bnNpZ25lZCBwcm9kdWN0IGZyb20gQUNDLAorCShPUF8wKTogRm9yICJzdWIiLCBjb21wdXRlIGNhcnJ5IGJ5IGNvbXBhcmluZyBpbnB1dHMuCisKK1R1ZSBEZWMgIDIgMTE6MDQ6MzcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAoT1BfMTAwMCk6IEZvciAic3ViMnciLCBjb21wdXRlIGNhcnJ5IGJ5IGNvbXBhcmluZworIAlpbnB1dHMuCisKK01vbiBOb3YgMTcgMjA6NTc6MjEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAoT1BfMSk6IFVzZSAzMiBiaXQgdW5zaWduZWQgYXJpdGhtZXRpYyBmb3Igc3VidHJhY3QsCisgCWNhcnJ5IGluZGljYXRlZCBieSB2YWx1ZSA+IDB4ZmZmZi4KKworRnJpIE5vdiAxNCAxMjo1MToyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fcmVzdW1lKTogRG9uJ3Qgc2V0IHVwIFNJR0lOVCBoYW5kbGVyIHVzaW5nIHNpZ25hbCwKKyAJaGFuZGxlZCBieSBjbGllbnQuCisJKHNpbV9yZXN1bWUpOiBGaXggcmFjZSBjb25kaXRpb24gb2YgYSBkaXJlY3QgYXNzaWdubWVudCB0bworIAlzdG9wX3NpbXVsYXRvciwgY29uZGl0aW9uYWxseSBjYWxsIHNpbV9zdG9wLgorCShzaW1fc3RvcF9yZWFzb24pOiBDaGVjayBzdG9wX3NpbXVsYXRvciByZXR1cm5pbmcgU0lHSU5ULiAgQ2xlYXIKKyAJc3RvcF9zaW11bGF0b3IgcmVhZHkgZm9yIG5leHQgc2ltX3Jlc3VtZSBjYWxsLgorCShzaW1fY3RybF9jKTogRGVsZXRlIGZ1bmN0aW9uLgorCitUaHUgTm92IDEzIDE5OjI5OjM0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9yZXN1bWUpOiBGb3IgIlJFUCIsIG9ubHkgY2hlY2svdXBkYXRlIHRoZSBQQyB3aGVuCisgCWEgYnJhbmNoIGluc3RydWN0aW9uIGhhcyBub3QgYmVlbiBleGVjdXRlZC4KKworTW9uIE5vdiAxMCAxNzo1MDoxOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF80MjAxKTogInJhY2hpIi4gU2lnbiBleHRlbmQgYml0IDQwIG9mIEFDQy4gIFNpZ24KKyAJZXh0ZW5kIGJpdCA0NCBhbGwgY29uc3RhbnRzLgorCShPUF80MjAxKTogUmVwbGFjZSBHQ0Mgc3BlY2lmaWMgMHguLkxMIHdpdGggU0lHTkVENjQgbWFjcm8uCisJCitGcmkgT2N0IDI0IDEwOjI2OjI5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZDEwdl9zaW0uaDogSW5jbHVkZSBzaW0tdHlwZXMuaC4KKwkodWludDgsIGluODE2LCB1aW55MTYsIGludDMyLCB1aW50MzIsIGludDY0LCB1aW50NjQpOiBUeXBlZGVmCisgCXVzaW5nIHVuc2lnbmVkOCBldC5hbC4gZnJvbSBzaW0tdHlwZXMuaC4KKwkoU0VYVDMyLCBTRVhUNDAsIFNFWFQ0NCwgU0VYVDYwKTogUmVwbGFjZSBHQ0Mgc3BlY2lmaWMgMHguLkxMIHdpdGgKKyAJU0lHTkVENjQgbWFjcm8uCisKK1dlZCBPY3QgMjIgMTQ6NDM6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX3dyaXRlX3BoeXMpOiBOZXcgZnVuY3Rpb24sIHdyaXRlIHRvIHBoeXNpY2FsCisgCWluc3RlYWQgb2YgdmlydHVhbCBtZW1vcnkuCisJCisJKiBpbnRlcnAuYyAoc2ltX2xvYWQpOiBQYXNzIGxtYV9wIGFuZCBzaW1fd3JpdGVfcGh5cyB0bworIAlzaW1fbG9hZF9maWxlLgorCitNb24gT2N0IDEzIDEwOjU1OjA3IDE5OTcgIEZyZWQgRmlzaCAgPGN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF82QTAxKTogQ2hhbmdlIE9QX1BPU1RERUMgdG8gT1BfUE9TVElOQyBhbmQgbW92ZQorCWV4Y2VwdGlvbiBnZW5lcmF0aW9uIGNvZGUgdG8gT1BfNkUwMS4KKwkoT1BfNkUwMSk6IENoYW5nZSBPUF9QT1NUSU5DIHRvIE9QX1BPU1RERUMgYW5kIGluc2VydCBleGNlcHRpb24KKwlnZW5lcmF0aW9uIGNvZGUuCisKK1NhdCBPY3QgMTEgMDk6MDI6MDggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF82NDAxKTogcG9zdGRlY3JlbWVudCBvbiByMTUgaXMgT0ssIHJlbW92ZSBleGNlcHRpb24uCisJKE9QXzY2MDEpOiBEaXR0by4KKworRnJpIE9jdCAgMyAwOToyODowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworU2F0IFNlcCAyNyAxMjo1MTozNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHBjX2FkZHIpOiBEaXNjYXJkIHVwcGVyIGJpdChzKSBvZiBQQyBpbiBjYXNlCisJSU1BUDEgc2VsZWN0cyB1bmlmaWVkIG1lbW9yeS4KKwkqIGQxMHZfc2ltLmggKElOQ19BRERSKTogQWxpZ24gTU9EX0UgdG8gaW5jcmVtZW50IGJlZm9yZSB0ZXN0aW5nCisJZm9yIGVuZCBjb25kaXRpb24uCisKK1dlZCBTZXAgMjQgMTc6Mzg6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1R1ZSBTZXAgMjMgMTE6MDQ6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK01vbiBTZXAgMjIgMTE6NDY6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK0ZyaSBTZXAgMTkgMTc6NDU6MjUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK01vbiBTZXAgMTUgMTc6MzY6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBTZXAgMTAgMjI6MzA6MjQgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fcmVzdW1lKTogSW5jcmVtZW50IFBDIGF0IGVuZCBvZiByZXAKKwlsb29wLgorCisJKiBzaW1vcHMuYyAoT1BfNDIwMSk6IEZpeCByYWNoaSBpbnN0cnVjdGlvbi4KKworVGh1IFNlcCAgNCAxNzoyMToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmE+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIEF1ZyAyNyAxODoxMzoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1R1ZSBBdWcgMjYgMTA6Mzc6NDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX2tpbGwpOiBEZWxldGUuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBBZGQgQUJGRCBhcmd1bWVudC4KKwkoc2ltX2xvYWQpOiBNb3ZlIHNldHRpbmcgb2YgUEMgZnJvbSBoZXJlLgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogVG8gaGVyZS4KKwkoc3RhcnRfYWRkcmVzcyk6IERlbGV0ZSB2YXJpYWJsZS4KKworTW9uIEF1ZyAyNSAxNzo1MDoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK01vbiBBdWcgMjUgMTU6Mzk6MjkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBBZGQgQUJGRCBhcmd1bWVudC4KKworVHVlIE1heSAyMCAxMDoxNDo0NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IEFkZCBjYWxsYmFjayBhcmd1bWVudC4KKwkoc2ltX3NldF9jYWxsYmFja3MpOiBSZW1vdmUgU0lNX0RFU0MgYXJndW1lbnQuCisKK1RodSBBcHIgMjQgMDA6Mzk6NTEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgQXByIDIyIDEwOjI5OjIzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IFVuZG8gcGF0Y2ggdG8gYWRkIC1FIHN1cHBvcnQuCisKK0ZyaSBBcHIgMTggMTM6Mzk6MDEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX3N0b3ApOiBOZXcgZnVuY3Rpb24uCisKK1RodSBBcHIgMTcgMDI6NDI6MDAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFNJTV9PQkpTKTogQWRkIHNpbS1sb2FkLm8uCisJKiBkMTB2X3NpbS5oIChleGVjX2JmZCk6IFJlbmFtZSB0byBwcm9nX2JmZC4KKwkqIGludGVycC5jOiAjaW5jbHVkZSBiZmQuaC4KKwkobXluYW1lLCBzaW1fa2luZCwgc3RhcnRfYWRkcmVzcyk6IE5ldyBzdGF0aWMgbG9jYWxzLgorCShwcm9nX2JmZF93YXNfb3BlbmVkX3AsIHByb2dfYmZkKTogTmV3IHN0YXRpYyBsb2NhbHMuCisJKGRlY29kZV9wYyk6IFVwZGF0ZSB0byB1c2UgcHJvZ19iZmQuCisJKHNpbV9vcGVuKTogU2V0IHNpbV9raW5kLCBteW5hbWUuICBJZ25vcmUgLUUgYXJnLgorCShzaW1fY2xvc2UpOiBDbG9zZSBwcm9nX2JmZCBpZiBzaW11bGF0b3Igb3BlbmVkIGl0LgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogUmV0dXJuIFNJTV9SQy4gIERlbGV0ZSBhcmcgc3RhcnRfYWRkcmVzcy4KKwkoc2ltX2xvYWQpOiBSZXR1cm4gU0lNX1JDLiAgTmV3IGFyZyBhYmZkLiAgU2V0IHN0YXJ0IGFkZHJlc3MgZnJvbSBiZmQuCisJQ2FsbCBzaW1fbG9hZF9maWxlIHRvIGxvYWQgZmlsZSBpbnRvIHNpbXVsYXRvci4KKwkqIHNpbW9wcy5jICh0cmFjZV9pbnB1dF9mdW5jKTogZXhlY19iZmQgcmVuYW1lZCB0byBwcm9nX2JmZC4KKworV2VkIEFwciAxNiAxNjoxMjowMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF81RjAwKTogT25seSBwcm92aWRlIHN5c3RlbSBjYWxscyBTWVNfZXhlY3YsCisgCVNZU193YWl0LCBTWVNfd2FpdCwgU1lTX3V0aW1lLCBTWVNfdGltZSBpZiBkZWZpbmVkIGJ5IHRoZSBob3N0LgorCQorTW9uIEFwciAgNyAxNTo0NTowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworV2VkIEFwciAgMiAxNTowNjoyOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBOZXcgYXJnIGBraW5kJy4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgQXByICAyIDE0OjM0OjE5IDE5OTcgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gTWFyIDE3IDE1OjEwOjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgorCitGcmkgTWFyIDE0IDEwOjM0OjExIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworCSogc2ltb3BzLmMgKE9QXzVGMDApOiBSZW1vdmUgb2xkIHRyYXBzIDEtMy4gIE1ha2UgdHJhcCAxNSB0aGUgc2FtZQorCWFzIHRyYXAgMCwgd2hpY2ggd2lsbCBiZSBkZXByZWNhdGVkLiAgT25seSBzZXQgZXJybm8sIGlmIGFuIGVycm9yCisJaW4gZmFjdCB3YXMgcmV0dXJuZWQuCisKK1RodSBNYXIgMTMgMTI6NDE6MjAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmM6IERlbGV0ZSByZWR1bmRhbnQgcHJvdG90eXBlcyBvZiBzaW1fZm9vIGZucy4KKwkoc2ltX29wZW4pOiBOZXcgU0lNX0RFU0MgcmVzdWx0LiAgQXJndW1lbnQgaXMgbm93IGluIGFyZ3YgZm9ybS4KKwkob3RoZXIgc2ltXyopOiBOZXcgU0lNX0RFU0MgYXJndW1lbnQuCisKK1RodSBNYXIgMTMgMTA6Mjk6MDQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jICh0cmFjZV97aW5wdXQsb3V0cHV0fV9mdW5jKTogQ2FsbCBmbHVzaF9zdGRvdXQgZnJvbSB0aGUKKwljYWxsYmFjayBmdW5jdGlvbnMuCisJKE9QXzVGMDApOiBEaXR0by4KKwkoT1BfNns0LDYsQyxBfTAxKTogVGVzdCBmb3IgcG9zdCBkZWNyZW1lbnQgb24gdGhlIHN0YWNrIHBvaW50ZXIuCisJKE9QX3sxMjAwLDEwMDAwMDAsMjAxLDVGRTAsMTAwMywxNzAwMTAwMn0pOiBGaXggcHJvYmxlbXMgaW4KKwlzZXR0aW5nIHRoZSBjYXJyeSBiaXQgYWZ0ZXIgYW4gYWRkIG9yIGEgc3VidHJhY3QuCisKK1dlZCBGZWIgMTIgMTY6MDQ6MTUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF97MTQwMywxNTAwMkEwMiwzezAsNH0wezAsMX19KTogT25seSB1c2UgdGhlIGJvdHRvbQorCTQwIGJpdHMgb2YgYWNjdW11bGF0b3JzLiAgU2lnbi96ZXJvIGV4dGVuZCBhcyBhcHByb3ByaWF0ZS4KKworVHVlIEZlYiAgNCAxMzozMzozMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQENPTU1PTl9NQUtFRklMRV9GUkFHKTogVXNlCisJQ09NTU9OX3tQUkUsUE9TVH1fQ09ORklHX0ZSQUcgaW5zdGVhZC4KKwkqIGNvbmZpZ3VyZS5pbjogc2luY2x1ZGUgLi4vY29tbW9uL2FjbG9jYWwubTQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitUaHUgSmFuIDIzIDExOjQ2OjIzIDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4gTWFrZWZpbGUuaW46ICBVcGRhdGUgdG8gbmV3IGNvbmZpZ3VyZQorCXNjaGVtZSB3aGljaCBpcyBtb3JlIGNvbXBhdGlibGUgd2l0aCBXaW5HREIgYnVpbGRzLgorCSogY29uZmlndXJlLmluOiAgSW1wcm92ZSBjb21tZW50IG9uIGhvdyB0byBydW4gYXV0b2NvbmYuCisJKiBjb25maWd1cmU6ICBSZS1ydW4gYXV0b2NvbmYgdG8gZ2V0IG5ldyAuLi9jb21tb24vYWNsb2NhbC5tNC4KKwkqIE1ha2VmaWxlLmluOiAgVXNlIGF1dG9jb25mIHN1YnN0aXR1dGlvbiB0byBpbnN0YWxsIGNvbW1vbgorCW1ha2VmaWxlIGZyYWdtZW50LgorCitGcmkgRGVjIDI3IDIyOjU0OjA1IDE5OTYgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQorCisJKiBnZW5jb2RlLmM6IHBhdGNoIHRvIG5vdCAjaW5jbHVkZSAiZDEwdl9zaW0uaCIgd2hpY2gKKwl1bmVjZXNzYXJpbHkgaW5jbHVkZXMgYmZkLmggYW5kIGNhdXNlcyB3aW5nZGIgY29uZmlndXJlCisJdG8gZmFpbC4KKworTW9uIERlYyAxNiAxMzozOTowMyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHhmZXJfbWVtKTogQ2hhbmdlIHVuaWZpZWQgbWVtb3J5IHRvIDB4MC4KKworVGh1IE5vdiAyOCAyMDo0Mjo1NiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF8zRTAxKTogRml4IHRyYWNpbmcgaW5mb3JtYXRpb24uCisJKE9QXzMwMHswLDF9KTogRG8gbm90IHByb3BpZ2F0ZSBzaWduLgorCitNb24gTm92IDI1IDE5OjQ3OjQwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5pbiAoV09SRFNfQklHRU5ESUFOKTogQWRkLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKwkqIGQxMHZfc2ltLmg6ICNpbmNsdWRlICJjb25maWcuaCIKKworU2F0IE5vdiAyMyAwOTozNDo1MCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGdlbmNvZGUuYyAod3JpdGVfb3Bjb2Rlcyk6IEVsaW1pbmF0ZSB3YXJuaW5ncyB3aGVuIGdlbmVyYXRlZAorCXRhYmxlLmMgaXMgY29tcGlsZWQuCisKK1dlZCBOb3YgMjAgMTk6NDE6NDAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBDYXN0IHJlc3VsdCBvZiBjYWxsb2MsIGFuZCBtYWtlIHN1cmUgTlVMTAorCXdhcyBub3QgcmV0dXJuZWQuCisJKGRtZW1fYWRkcik6IElmIGFkZHJlc3MgaXMgaWxsZWdhbCBvciBpbiBJL08gc3BhY2UsIHNpZ25hbCBhIGJ1cworCWVycm9yLgorCShwY19hZGRyKTogU2lnbmFsIGJ1cyBlcnJvciwgbm90IGlsbGVnYWwgaW5zdHJ1Y3Rpb24gZm9yIGJvZ3VzCisJcGMuCisKK1dlZCBOb3YgMjAgMDE6MjM6MDMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IERlbGV0ZSBhbGwgc3R1ZmYgbW92ZWQgdG8gLi4vY29tbW9uL01ha2UtY29tbW9uLmluLgorCShTSU1fT0JKUyxTSU1fRVhUUkFfQ0ZMQUdTLFNJTV9FWFRSQV9DTEVBTik6IERlZmluZS4KKwkqIGNvbmZpZ3VyZS5pbjogU2ltcGxpZnkgdXNpbmcgbWFjcm9zIGluIC4uL2NvbW1vbi9hY2xvY2FsLm00LgorCUNhbGwgQUNfQ0hFQ0tfSEVBREVSUyh1bmlzdGQuaCkuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogY29uZmlnLmluOiBOZXcgZmlsZS4KKwkqIGludGVycC5jOiAjaW5jbHVkZSAiY2FsbGJhY2suaCIuCisJKiBzaW1vcHMuYzogI2luY2x1ZGUgImNvbmZpZy5oIi4gICNpbmNsdWRlIDx1bmlzdGQuaD4gaWYgcHJlc2VudC4KKworRnJpIE5vdiAgOCAxNjoxOTo1NSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KKworCSogZDEwdi1zaW0uaCAoc2ltb3BzKTogQWRkIGZsYWcgaXNfbG9uZy4KKwkoU3RhdGUpOiBBZGQgcGNfY2hhbmdlZC4gIEluc3RydWN0aW9ucyB3aGljaCB1cGRhdGUgdGhlIFBDIHNob3VsZAorCXVzZSB0aGUgSk1QIG1hY3JvIHdoaWNoIHNldHMgdGhpcy4KKwkoSk1QKTogTmV3IG1hY3JvLiAgU2V0cyB0aGUgUEMgYW5kIHRoZSBwY19jaGFuZ2VkIGZsYWcuCisKKwkqIGdlbmNvZGUuYyAod3JpdGVfb3Bjb2Rlcyk6IEFkZCBpc19sb25nIGZpZWxkLgorCQorCSogaW50ZXJwLmMgKGxvb2t1cF9oYXNoKTogSWYgd2UgYmxpbmRseSBhcHBseSBhIHNob3J0IG9wY29kZSdzIG1hc2sKKwl0byBhIGxvbmcgb3Bjb2RlIHdlIGNvdWxkIGdldCBhIGZhbHNlIG1hdGNoLiAgQ2hlY2sgdGhlIG9wY29kZSBzaXplLgorCShoYXNoKTogQWRkIGEgc2l6ZSBmaWVsZCB0byB0aGUgaGFzaCB0YWJsZS4KKwkoc2ltX29wZW4pOiBJbml0aWFsaXplIHNpemUgZmllbGQgaW4gaGFzaCB0YWJsZS4KKwkoc2ltX3Jlc3VtZSk6IENoYW5nZSB0byBsb2dpYyBmb3Igc2V0dGluZyB0aGUgUEMuICBVc2VkIHRvIGluY3JlbWVudCB0aGUKKwlQQyBpZiBpdCBoYWQgbm90IGJlZW4gY2hhbmdlZC4gIFRoaXMgZGlkbid0IGFsbG93IHNpbmdsZS1pbnN0cnVjdGlvbiBsb29wcy4KKwlOb3cgY2hlY2tzIHRoZSBmbGFnIFN0YXRlLnBjX2NoYW5nZWQuICBBbHNvIG5vdyBzdG9wcyB3aGVuIF5DIGlzIHJlY2VpdmVkLgorCShkbWVtX2FkZHIpOiBGaXggdHJhbnNsYXRpb24gb2YgZGF0YSBzZWdtZW50cyB0byB1bmlmaWVkIG1lbW9yeS4KKwkoc2ltX2N0cmxfYyk6IE5ldyBmdW5jdGlvbi4gIFdoZW4gXkMgaXMgcmVjZWl2ZWQsIHNldCBzdG9wX3NpbXVsYXRvciBmbGFnLgorCisJKiBzaW1vcHMuYzogQ2hhbmdlZCBhbGwgYnJhbmNoIGFuZCBqdW1wIGluc3RydWN0aW9ucyB0byB1c2UgbmV3IEpNUCBtYWNyby4KKwkoT1BfMjAwMDAwMDApOiBDb3JyZWN0ZWQgdHJhY2UgaW5mb3JtYXRpb24gdG8gc2hvdyB0aGlzIGlzIGEgbGRpLmwsIG5vdAorCWEgbGRpLnMgaW5zdHJ1Y3Rpb24uCisJCitUaHUgT2N0IDMxIDE5OjEzOjU1IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX2ZldGNoX3JlZ2lzdGVyLCBzaW1fc3RvcmVfcmVnaXN0ZXIpOiBGaXggYnVnIHdoZXJlCisJdXBkYXRpbmcgdGhlIGFjY3VtdWxhdG9ycyB3YXMgb3ZlcndyaXRpbmcgb3RoZXIgcGFydHMgb2YgdGhlIGdsb2JhbAorCVN0YXRlIHZhcmlhYmxlLgorCitXZWQgT2N0IDMwIDE3OjM1OjE0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKGJmZC5oKSBEb24ndCBpbmNsdWRlIGl0IGhlcmUgYW55IG1vcmUuCisJKHRleHR7LF9zdGFydCxfZW5kfSk6IE1vdmUgaGVyZSBmcm9tIHNpbW9wcy5jIGFuZCBtYWtlIGV4dGVybi4KKwkoZGVjb2RlX3BjKTogTmV3IGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgUEMgYXMgYW4gYWRkcmVzcyB0aGF0IHRoZQorCWRlYnVnZ2VyIGNhbiB1c2UuCisJKGRtZW1fYWRkcik6IFByaW50IGRlY29kZWQgUEMgaW4gZXJyb3IgbWVzc2FnZS4KKwkocGNfYWRkcik6IERpdHRvLgorCisJKiBzaW1vcHMuYyAoYmZkLmgpIERvbid0IGluY2x1ZGUgaXQgaGVyZSBhbnkgbW9yZS4KKwkodGV4dHssX3N0YXJ0LF9lbmR9KTogTW92ZSB0byBzaW1vcHMuYy4KKwkodHJhY2VfaW5wdXRfZnVuYyk6IE1vdmUgZGVjb2Rpbmcgb2YgUEMsIGFuZCBsb29raW5nIHVwIC50ZXh0CisJc3RhcnQgdG8gZGVjb2RlX3BjLgorCisJKiBkMTB2X3NpbS5oIChiZmQuaCk6IEluY2x1ZGUgaXQgaGVyZS4KKwkodGV4dHssX3N0YXJ0LF9lbmR9KTogQWRkIGV4dGVybmFsIGRlY2xhcmF0aW9ucy4KKwkoZXhlY19iZmQpOiBEaXR0by4KKwkoZGVjb2RlX3BjKTogRGl0dG8uCisKK1R1ZSBPY3QgMjkgMTI6MTM6NTIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fc2l6ZSk6IE5vdyBhbGxvY2F0ZXMgdW5pZmllZCBtZW1vcnkgZm9yIGltYXAgc2VnbWVudHMKKwkwLDEsMiwgYW5kIDEyNy4gSW5pdGlhbGl6ZXMgaW1hcDAgYW5kIGltYXAxIHRvIDB4MTAwMC4gIEluaXRpYWxpemVzIGRtYXAgdG8gMC4KKwkoc2ltX3dyaXRlKTogSnVzdCBjYWxsIHhmZXJfbWVtKCkuCisJKHNpbV9yZWFkKTogSnVzdCBjYWxsIHhmZXJfbWVtKCkuCisJKHhmZXJfbWVtKTogTmV3IGZ1bmN0aW9uLiBEb2VzIGFwcHJvcHJpYXRlIG1lbW9yeSBtYXBwaW5nIGFuZCBjb3BpZXMgYnl0ZXMuCisJKGRtZW1fYWRkcik6IE5ldyBmdW5jdGlvbi4gUmVhZHMgZG1hcCByZWdpc3RlciBhbmQgdHJhbnNsYXRlcyBkYXRhCisgCWFkZHJlc3NlcyB0byBsb2NhbCBhZGRyZXNzZXMuCisJKHBjX2FkZHIpOiBOZXcgZnVuY3Rpb24uIFJlYWRzIGltYXAgcmVnaXN0ZXIgYW5kIGNvbXB1dGVzIGxvY2FsIGFkZHJlc3MKKwljb3JyZXNwb25kaW5nIHRvIGNvbnRlbnRzIG9mIHRoZSBQQy4KKwkoc2ltX3Jlc3VtZSk6IENoYW5nZSB0byB1c2UgcGNfYWRkcigpLgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogQ2hhbmdlIHJlaW5pdGlhbGl6YXRpb24gY29kZS4gQWxzbyByZWluaXRpYWxpemVzCisJaW1hcFswMV0gYW5kIGRtYXAuCisJKHNpbV9mZXRjaF9yZWdpc3Rlcik6IEFkZCBmYWtlIHJlZ2lzdGVycyAzMiwzMywzNCBmb3IgaW1hcDAsIGltYXAxLCBhbmQgZG1hcC4KKwkoc2ltX3N0b3JlX3JlZ2lzdGVyKTogQWRkIGZha2UgcmVnaXN0ZXJzIDMyLDMzLDM0IGZvciBpbWFwMCwgaW1hcDEsIGFuZCBkbWFwLgorCisJKiBzaW1vcHMuYyAoTUVNUFRSKTogUmVkZWZpbmUgdG8gdXNlIGRtZW1fYWRkcigpLgorCShPUF81RjAwKTogUmVwbGFjZSByZWZlcmVuY2VzIHRvIFNUYXRlLmltZW0gd2l0aCBkbWVtX2FkZHIoKS4KKwkKKwkqIGQxMHYtc2ltLmggKFN0YXRlKTogUmVtb3ZlIG1lbV9taW4gYW5kIG1lbV9tYXguIEFkZCB1bWVtWzEyOF0uCisJKFJCLFNXLFJXLFNMVyxSTFcpOiBSZWRlZmluZSB0byB1c2UgZG1lbV9hZGRyKCkuCisJKElNQVAwLElNQVAxLERNQVAsU0VUX0lNQVAsU0VUX0lNQVAxLFNFVF9ETUFQKTogRGVmaW5lLgorCQorVHVlIE9jdCAyMiAxNToyMjozMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGQxMHZfc2ltLmggKF9pbnNfdHlwZSk6IFJlb3JnYW5pemUsIHNvIHRoYXQgd2UgY2FuIHByb3ZpZGUKKwliZXR0ZXIgc3RhdGlzdGljcywgbGlrZSBub3QgY291bnRpbmcgTk9QUyBhcyBwYXJhbGxlbAorCWluc3RydWN0aW9ucywgYW5kIHByaW50aW5nIHRvdGFsIGN5Y2xlcy4KKwkoaW5zX3R5cGVfY291bnRlcnMpOiBNYWtlIHVuc2lnbmVkIGxvbmcuCisJKGxlZnRfbm9wcyxyaWdodF9ub3BzKTogRm9sZCBpbnRvIGluc190eXBlX2NvdW50ZXJzLgorCisJKiBzaW1vcHMuYyAodHJhY2VfaW5wdXRfZnVuYyk6IFByaW50IG5ldyBpbnN0cnVjdGlvbiB0eXBlcy4KKwlIYW5kbGUgT1BfUjJSMyBhcyBpbnB1dCB0eXBlcy4KKwkoT1BfezM4MDAwMDAwLDcwMDB9KTogQ29ycmVjdGx5IHNpZ24gZXh0ZW5kIGJ5dGVzLgorCShPUF81RTAwKTogRG9uJ3QgY291bnQgTk9QcyBhcyBwYXJhbGxlbCBpbnN0cnVjdGlvbnMuCisJKE9QXzQ2MEIpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgorCShPUF81RjAwKTogRGl0dG8uCisKKwkqIGludGVycC5jIChpbnNfdHlwZV9jb3VudGVycyk6IE1ha2UgdW5zaWduZWQgbG9uZy4KKwkobGVmdF9ub3BzLHJpZ2h0X25vcHMpOiBEZWxldGUuCisJKG1vc3QgZnVuY3Rpb25zKTogQWRkIHByb3RvdHlwZXMuCisJKElOTElORSk6IElmIEdDQyBhbmQgb3B0aW1pemUgZGVmaW5lIGFzIF9faW5saW5lX18uCisJKHssbG9va3VwX31oYXNoLGdldF9vcGVyYW5kcyk6IERlY2xhcmUgYXMgSU5MSU5FLgorCShkb19wYXJhbGxlbCk6IENvdW50IGNvbmRpdGlvbmFsIG9wZXJhdGlvbnMuCisJKGFkZF9jb21tYXMpOiBOZXcgZnVuY3Rpb24sIHRvIGFkZCBjb21tYXMgZXZlcnkgMyBkaWdpdHMuCisJKHNpbV9zaXplKTogQ2FsbCBhZGRfY29tbWFzIHRvIHByaW50IG51bWJlcnMuCisJKHNpbV97b3BlbixyZXN1bWV9KTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZXMuCisJKHNpbV9pbmZvKTogUHJvdmlkZSBiZXR0ZXIgc3RhdGlzdGljcy4KKwkoc2ltX3JlYWQpOiBBZGQgaW50IHJldHVybiB0eXBlLgorCitNb24gT2N0IDIxIDE2OjE2OjI2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX3Jlc3VtZSk6IENoYW5nZSB0aGUgd2F5IHNpbmdsZS1zdGVwcGluZyBhbmQgZXhjZXB0aW9ucworIAlhcmUgaGFuZGxlZCBzbyBzaW5nbGUtc3RlcHBpbmcgd29ya3MgYWdhaW4uCisKK1RodSBPY3QgMTcgMTI6MjQ6MTYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBlbmRpYW4uYzogT3B0aW1pemUgc2ltdWxhdGVkIGxvYWRzL3N0b3JlcyBvbiB4ODYsIEFJWCwgYW5kIGJpZworCWVuZGlhbiBob3N0cy4KKworCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0tYnN3YXApOiBOZXcgc3dpdGNoIHRvIGVuYWJsZSB1c2luZworCXRoZSBCU1dBUCBpbnN0cnVjdGlvbiBvbiB4ODYncy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworCSogTWFrZWZpbGUuaW4gKHtTV0FQLENPTkZJR31fQ0ZMQUdTKTogQWRkIC0tZW5hYmxlLXNpbS1ic3dhcAorCXN1cHBvcnQuCisKK1dlZCBPY3QgMTYgMTM6NTA6MDYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBlbmRpYW4uYzogTmV3IGZpbGUuICBNb3ZlIGVuZGlhbiBmdW5jdGlvbnMgaGVyZSBmcm9tIGludGVycC5jLgorCU9wdGltaXplIGNvZGUsIGFuZCBtYWtlIGl0IHdvcmsgYXMgZWl0aGVyIGlubGluZSBmdW5jdGlvbnMgb3IgYXMgYQorCXNlcGFyYXRlIGZpbGUuCisKKwkqIGludGVycC5jOiBNb3ZlIGVuZGlhbiBmdW5jdGlvbnMgZnJvbSBoZXJlIHRvIGVuZGlhbi5jLgorCisJKiBNYWtlZmlsZS5pbiAoSU5DTFVERSk6IEFkZCBlbmRpYW4uYy4KKwkocnVuLGxpYnNpbS5hKTogQWRkIGRlcGVuZGVuY3kgb24gZW5kaWFuLm8uCisJKGVuZGlhbi5vKTogQWRkIGRlcGVuZGVuY3kuCisKKwkqIGQxMHZfc2ltLmggKHJlYWQvd3JpdGUgc3VwcG9ydCk6IEFsd2F5cyBnbyB0aHJvdWdoIHRoZSBtYWNoaW5lCisJaW5kZXBlbmRlbnQgZW5kaWFuIGZ1bmN0aW9ucy4gIElmIGNvbXBpbGluZyB3aXRoIEdDQyBhbmQKKwlvcHRpbWl6aW5nLCBpbmNsdWRlIGVuZGlhbi5jIHNvIHRoZSBlbmRpYW4gZnVuY3Rpb25zIGFyZSBpbmxpbmVkLgorCisJKiBzaW1vcHMuYyAoT1BfNUYwMCk6IENvcnJlY3QgdHJhY2luZyBvZiBhY2N1bXVsYXRvcnMuCQorCitUdWUgT2N0IDE1IDEwOjU3OjUwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogc2ltb3BzLmMgKE9QXzVGMDApOiBBZGQgc3VwcG9ydCBmb3IgZ2V0cGlkLCBraWxsIHN5c3RlbSBjYWxscy4KKworCSogaW50ZXJwLmMgKGRvX3syX3Nob3J0LHBhcmFsbGVsfSk6IElmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQsCisJZG9uJ3QgZXhlY3V0ZSB0aGUgc2Vjb25kIGluc3RydWN0aW9uLgorCitTYXQgT2N0IDEyIDIyOjE3OjQzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogc2ltb3BzLmMgKE9QX3szMTAwMDAwMCw2NjAxLDYyMDEsNjIwMH0pOiBTdG9yZSBhZGRyZXNzIGluIGEKKwl0ZW1wb3JhcnkgaW4gY2FzZSB0aGUgcmVnaXN0ZXIgaXMgb3ZlcnJpZGVuIHdoZW4gbG9hZGluZy4KKwkoT1BfNjIwMCk6IE91dHB1dCB0eXBlIGlzIE9QX0RSRUcgZm9yIHRyYWNpbmcuCisKK0ZyaSBPY3QgIDQgMjM6NDY6MTggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBkMTB2X3NpbS5oIChzdHJ1Y3QgX3N0YXRlKTogQWRkIG1lbV97bWluLG1heH0gZmllbGRzLgorCisJKiBpbnRlcnAuYyAoc2ltX3NpemUpOiBJbml0aWFsaXplIG1lbV97bWluLG1heH0gZmllbGRzLgorCShzaW1fd3JpdGUpOiBVcGRhdGUgbWVtX3ttaW4sbWF4fSBmaWVsZHMuCisJKHNpbV9yZXN1bWUpOiBJZiBQQyBpcyBub3QgaW4gdGhlIG1pbmltdW0vbWF4aW11bSBtZW1vcnkgcmFuZ2UsCisJYWJvcnQuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBQcmVzZXJ2ZSBtZW1fe21pbixtYXh9IGZpZWxkcy4KKworRnJpIFNlcCAyNyAxMzoxMTo1OCAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF81RjAwKTogQWRkIHN1cHBvcnQgZm9yIHRpbWUoKSBzeXN0ZW0gY2FsbC4KKworV2VkIFNlcCAyNSAxNjozMTo0MSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF97NkUwMSw2QTAxLDZFMUYsNkEwMH0pOiBQcmludCBib3RoIHdvcmRzIGJlaW5nCisJc3RvcmVkIGlmIHRyYWNpbmcuCisJKE9QXzVGMDAsdHJhY2Vfe2luLG91dH1wdXRfZnVuYyk6IEFkZCBmaW5lciBncmFpbiB0cmFjaW5nIGZvcgorCXN5c3RlbSBjYWxscy4KKworTW9uIFNlcCAyMyAxNzo1NTozMCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChvcF90eXBlcyk6IEFkZCBPUF97Q09OU1RBTlQ4LFIyLFIzfS4KKwkodHJhY2VfaW5wdXRfZnVuYyk6IEFkZCBzdXBwb3J0IGZvciAgT1Bfe0NPTlNUQU5UOCxSMixSM30uCisJKE9QX3s0OTAwLDI0ODAwMDAwLDQ4MDAsNEEwMCw0QjAwLDREMDAsNEMwMH0pOiBBZGQgT1BfUjIgYW5kIE9QX1IzCisJdG8gY2FsbC9zdWJyb3V0aW5lIHJldHVybnMgdG8gdHJhY2UgdGhlIGZpcnN0IHR3byBhcmd1bWVudHMgYW5kCisJdGhlIHJldHVybiB2YWx1ZS4gIEZvciBzbWFsbCBqdW1wcywgdXNlIENPTlNUQU5UOCwgbm90IENPTlNUQU5UMTYuCisKK0ZyaSBTZXAgMjAgMTU6MzY6NDUgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fY3JlYXRlX2luZmVyaW9yKTogUmVpbml0aWFsaXplIFN0YXRlIGV2ZXJ5IHRpbWUgCisJc2ltX2NyZWF0ZV9pbmZlcmlvcigpIGlzIGNhbGxlZC4KKworVGh1IFNlcCAxOSAyMTozODoyMCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnppcGxpbmsubmV0PgorCisJKiBzaW1vcHMuYyAoT1BfezQwMSwyMDAwMDAwLDYwMSwzMDAwMDAwLDIzMDAwMDAwfSk6IEdldCBzaWduIHJpZ2h0CisJb24gY29tcGFyaXNvbnMuCisJKE9QXzQwMSk6IEZpeCB0cmFjaW5nIGluZm9ybWF0aW9uLgorCitUaHUgU2VwIDE5IDEwOjMwOjIyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogc2ltb3BzLmMgKFNJWkVfe1BDLExJTkVfTlVNQkVSfSk6IE5ldyBkZWZhdWx0IHNpemVzIGZvciBvdXRwdXQuCisJKHRyYWNlX2lucHV0X2Z1bmMpOiBVc2UgdGhlbS4KKwkodHJhY2VfaW5wdXRfZnVuYyk6IE1ha2Ugc3VyZSB0aGVyZSBpcyBhIHRyYWlsaW5nIHNwYWNlIGFmdGVyIHRoZQorCWluc3RydWN0aW9uLgorCShPUF82MjAwKTogRml4IHRyYWNpbmcgaW5mby4KKworCSogTWFrZWZpbGUuaW4gKHJ1bik6IEFkZCBkZXBlbmRlbmNpZXMgb24gbGliYmZkLmEgYW5kCisJbGliaWJlcml0eS5hLgorCitXZWQgU2VwIDE4IDA5OjEzOjI1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZDEwdl9zaW0uaCAoREVCVUdfSU5TVFJVQ1RJT04pOiBOZXcgZGVidWcgdmFsdWUgdG8gaW5jbHVkZSBsaW5lCisJbnVtYmVycyBhbmQgZnVuY3Rpb24gbmFtZXMgaW4gZGVidWcgdHJhY2UuCisJKERFQlVHKTogSWYgbm90IGRlZmluZWQsIHNldCB0byBERUJVR19UUkFDRSwgREVCVUdfVkFMVUVTLCBhbmQKKwlERUJVR19MSU5FX05VTUJFUi4gCisJKFNJR19EMTBWX3tTVE9QLEVYSVR9KTogVmFsdWVzIHRvIHJlcHJlc2VudCB0aGUgc3RvcCBpbnN0cnVjdGlvbgorCWFuZCBleGl0IHN5c3RlbSBjYWxsIHRyYXAgYmVpbmcgZXhlY3V0ZWQuCisKKwkqIGludGVycC5jIChzaW1fc3RvcF9yZWFzb24pOiBTZXQgZXhpdCBjb2RlIGNvcnJlY3RseSBmb3Igc3RvcAorCWluc3RydWN0aW9uIGFuZCBleGl0IHN5c3RlbSBjYWxsIHRyYXAuCisKKwkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtc2ltLWNmbGFncyk6IFJlbW92ZSB0cmFjZSBjYXNlLgorCSgtLWVuYWJsZS1zaW0tZGVidWcpOiBOZXcgc3dpdGNoIHRvIHNldCB0aGUgZGVidWcgdmFsdWVzLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisJKiBzaW1vcHMuYyAodHJhY2Vfe2lucHV0LG91dHB1dH1fZnVuYyk6IFJlbmFtZSBmcm9tCisJdHJhY2Vfe2lucHV0LG91dHB1dH0uCisJKHRyYWNlX3tpbnB1dCxvdXRwdXR9KTogQ2FsbCB0cmFjZV97aW5wdXQsb3V0cHV0fV9mdW5jIGlmCisJZDEwdl9kZWJ1ZyBpcyBub24temVyby4KKwkoU0laRV9JTlNUUlVDVElPTik6IEN1dCBkb3duIHRvIDguCisJKFNJWkVfT1BFUkFORFMpOiBDdXQgZG93biB0byAxOC4KKwkoU0laRV9MT0NBVElPTik6IE5ldyB2YWx1ZSBmb3Igc2l6ZSBvZiBsaW5lIG51bWJlciwgZnVuY3Rpb24gbmFtZQorCWZpZWxkLgorCShpbml0X3RleHRfcCx0ZXh0eyxfc3RhcnQsX2VuZH0pOiBOZXcgc3RhdGljIHZhcmlhYmxlcyBmb3IKKwlwcmludGluZyBsaW5lIG51bWJlciBhbmQgZnVuY3Rpb24gbmFtZS4KKwkoZXhlY19iZmQpOiBOZXcgZXh0ZXJuYWwgdGhhdCBydW4uYyBzZXRzLgorCSh0cmFjZV9pbnB1dF9mdW5jKTogUHJpbnQgbGluZSBudW1iZXIgYW5kIGZ1bmN0aW9uIG5hbWUgaWYKKwlhdmFpbGFibGUgYW5kIGlmIGRlc2lyZWQuCisJKE9QXzRFMDkpOiBEb24ndCBwcmludCBvdXQgREJUIG1lc3NhZ2UuCisJKE9QXzVGRTApOiBTZXQgZXhjZXB0aW9uIGZpZWxkIHRvIFNJR19EMTBWX1NUT1AuCisJKE9QXzVGMDApOiBTZXQgZXhjZXB0aW9uIGZpZWxkIHRvIFNJR19EMTBWX0VYSVQuCQorCitTYXQgU2VwIDE0IDIyOjE4OjQzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKGRvXzJfc2hvcnQpOiBJZiB0aGUgaW5zdHJ1Y3Rpb24gZW5jb2RlcyBqdW1wLT5pbnMsCisJZG9uJ3QgZG8gdGhlIHNlY29uZCBpbnN0cnVjdGlvbiBpZiB0aGUganVtcCBzdWNjZWVkcy4KKworRnJpIFNlcCAxMyAyMjozNToxOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF81RjAwKTogVXNlIHVua25vd24gdHJhcHMgdG8gcHJpbnQgYWxsIEdQUnMsCisJYWNjdW11bGF0b3JzLCBQQywgYW5kIEYwL0YxL0MgZmxhZ3MuCisKK1RodSBTZXAgMTIgMTI6NTA6MTEgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAoT1BfNUYwMCk6IEZpeCBwcm9ibGVtcyB3aXRoIHN5c3RlbSBjYWxscy4KKworVGh1IFNlcCAxMiAxMjoxOToyOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF81RjAwKTogQ29ycmVjdCB0cmFjaW5nIGluZm9ybWF0aW9uIGZvciB0cmFwLgorCitXZWQgU2VwIDExIDE4OjU1OjUwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKENTRUFSQ0gpOiBDb3JyZWN0bHkgZmluZCBvcGNvZGVzIGRpcmVjdG9yeS4KKworTW9uIFNlcCAgOSAxMzoyNzoyNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jICh0cmFjZV9vdXRwdXQpOiBQcm9wZXJseSBhbGlnbiBhY2N1bXVsYXRvciBvdXRwdXQuCisJKE9QXzN7MCwyLDR9MDApOiBQcm9wZXJseSBwYXJlbnRoZXNpemUgdGVzdCBleHByZXNzaW9uLiAgQWRkIGVycm9yCisJaWYgc2hpZnQgY291bnQgaXMgdG9vIGhpZ2guCisJKE9QXzRFezAwLDAyLDA0LDIwLDIyLDQwLDQyfSk6IE1ha2UgdGVzdHMgYWdyZWUgd2l0aCBib29rLgorCShPUF80RTA5KTogTWFrZSBjcGZnIHByb3Blcmx5IHRyYWNlIHRoZSBpbnB1dCBmbGFncy4KKwkob3BfdHlwZXMpOiBBZGQgT1BfRkxBR19PVVRQVVQuCisJKHRyYWNlX3tpbnB1dCxvdXRwdXR9KTogU3VwcG9ydCBPUF9GTEFHX09VVFBVVC4KKwkoT1BfMzEwMDAwMDApOiBUaGlzIGxkMncgdmFyaWVudCBpcyBhIDE2LWJpdCBtZW1vcnkgcmVmZXJlbmNlLCBub3QKKwlhbiA4LWJpdCBtZW1vcnkgcmVmZXJlbmNlIGluc3RydWN0aW9uIGZvciB0cmFjaW5nIHB1cnBvc2VzLgorCShPUF8yMDEpOiBBZGRpIG5lZWRzIHRvIHNldCB0aGUgY2FycnkuCisKK0ZyaSBTZXAgIDYgMTc6NTY6MTcgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF8yNjAwLCBPUF8yNjAxKTogQ2hhbmdlZCBtaW4gYW5kIG1heCBjb21wYXJpc29ucworCXRvIHVzZSBzaWduZWQgcmVnaXN0ZXIgdmFsdWVzLgorCitXZWQgU2VwICA0IDExOjM1OjE3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZDEwdl9zaW0uaCAoREVCVUdfKik6IEFkZCBiaXQgZmxhZ3MgZm9yIGNvbnRyb2xsaW5nIGRlYnVnCisJb3V0cHV0LgorCShfaW5zX3R5cGUpOiBOZXcgZW51bWVyYXRpb24gdG8gc3BlY2lmeSB3aGljaCBjb250YWluZXIgYW4KKwlpbnN0cnVjdGlvbiBpcyBpbiwgYW5kIHdoZXRoZXIgaXQgaXMgcGFydCBvZiBhIHBhcmFsbGVsIG9wZXJhdGlvbi4KKwkoX3N0YXRlKTogQWRkIGluc190eXBlIGZpZWxkLgorCSh7LHV9aW50ezgsMTYsMzIsNjR9KTogVXNlIGxpbWl0cy5oIHRvIHNpemUgdGhlIGFwcHJvcHJpYXRlIHR5cGVzLgorCShpbnNfdHlwZV9jb3VudGVycyk6IENvdW50ZXJzIGZvciB0aGUgdmFyaW91cyBpbnN0cnVjdGlvbiB0eXBlcy4KKwkoe2xlZnQscmlnaHR9X25vcHMpOiBDb3VudGVycyBmb3IgdGhlIG51bWJlciBvZiBub3BzIGluIGVhY2gKKwljb250YWluZXIuCisJKGQxMHZfZGVidWcpOiBOZXcgdmFyaWFibGUgdG8gaW5kaWNhdGUgd2hldGhlciBkZWJ1Z2dpbmcgaXMgdHVybmVkCisJb24uCisKKwkqIHNpbW9wcy5jOiAoYWxsIGZ1bmN0aW9ucyk6IENoYW5nZSBhbGwgI2lmZGVmIERFQlVHIGNvZGUgc28gdGhhdAorCXRoZSBpbnB1dCBhbmQgb3V0cHV0IHZhbHVlcyBjYW4gYmUgdHJhY2VkLCBhbG9uZyB3aXRoIHRoZQorCWluc3RydWN0aW9uIHR5cGUuICBNYWtlIHRoZSAtdCBvcHRpb24gZW5hYmxlIHRyYWNpbmcuCisJKGFsbCBmdW5jdGlvbnMpOiBDaGFuZ2UgcHJpbnRmIGNhbGxzIHRvIHVzZSB0aGUgcHJpbnRmX2ZpbHRlcmVkCisJZnVuY3Rpb24gaW4gdGhlIGNhbGxiYWNrIHRhYmxlLgorCisJKiBpbnRlcnAuYyAoX2xlZnRyaWdodCk6IE5ldyBlbnVtZXJhdGlvbiB0byBzYXkgd2hldGhlciAyIHNob3J0CisJaW5zdHJ1Y3Rpb25zIGFyZSBkb25lIGxlZnQgZmlyc3Qgb3IgcmlnaHQgZmlyc3QuCisJKGRvX3tsb25nLDJfc2hvcnQscGFyYWxsZWx9KTogSW5kaWNhdGUgaW4gdGhlIG1hY2hpbmUgc3RhdGUgd2hpY2gKKwl0eXBlIG9mIGluc3RydWN0aW9uIHRoaXMgaXMuICBDb3VudCBlYWNoIG9mIHRoZSB0eXBlcyBvZgorCWluc3RydWN0aW9ucyBleGVjdXRlZC4KKwkoc2ltX3NpemUpOiBPbmx5IHByaW50IHRoZSBtZW1vcnkgc2l6ZXMgaWYgREVCVUdfTUVNU0laRSBkZWJ1ZworCWZsYWcgaXMgc2V0LgorCShzaW1fcmVzdW1lKTogUGFzcyBsZWZ0L3JpZ2h0IGluZGljYXRpb24gdG8gZG9fMl9zaG9ydC4KKwkoYWxsIGZ1bmN0aW9ucyk6IENoYW5nZSBwcmludGYgY2FsbHMgdG8gdXNlIHRoZSBwcmludGZfZmlsdGVyZWQKKwlmdW5jdGlvbiBpbiB0aGUgY2FsbGJhY2sgdGFibGUuCisJKHNpbV90cmFjZSk6IFR1cm4gb24gZGVidWcgZmxhZyBpZiBERUJVRyB3YXMgZGVmaW5lZCwgYW5kIGNhbGwKKwlzaW1fcmVzdW1lLgorCShzaW1faW5mbyk6IFByaW50IG91dCBzdGF0aXN0aWNzIG9uIGluc3RydWN0aW9ucy4KKwkoc2ltX3t0cmFjZSxjcmVhdGVfaW5mZXJpb3J9KTogRWxpbWluYXRlIGV4dHJhbmVvdXMgb3V0cHV0IHVubGVzcworCWRlYnVnZ2luZy4KKwkoc2ltX29wZW4pOiBJZiBhcmdzID09IC10IGFuZCBERUJVRyB3YXMgZGVmaW5lZCwgc2V0IGQxMHZfZGVidWcuCisJT25seSBpbml0aWFsaXplIHRoZSBoYXNoIHRhYmxlIHRoZSBmaXJzdCB0aW1lIHNpbV9vcGVuIGlzIGNhbGxlZC4KKworCSogTWFrZWZpbGUuaW46IE1ha2Ugb2JqZWN0cyBkZXBlbmQgb24gZDEwdl9zaW0uaC4KKwkoeyxTSU1ffUNGTEFHUyk6IEluY2x1ZGUgY29uZmlndXJlIGRlcGVuZGVudCBzd2l0Y2hlcy4gIFNldHRpbmcKKwlDRkxBR1MgZG9lcyBub3Qgb3ZlcnJpZGUgaG9zdC90YXJnZXQgZGVmaW5lcyBvciBTSU1fQ0ZMQUdTLgorCShDQ19GT1JfQlVJTEQsZ2VuY29kZSk6IFVzZSBDQ19GT1JfQlVJTEQgdG8gY29tcGlsZSBnZW5jb2RlLgorCShydW4pOiBCeSBkZWZhdWx0LCB0aGUgbWF0aCBsaWJyYXJ5IGlzIG5vdCBuZWVkZWQgdG8gYmUgbGlua2VkCisJaW4uCisJKHtCRkQsTElCSUJFUlRZfV9MSUIpOiBEZWZpbmUgYXMgdmFyaWFibGVzIHNvIHRoZXkgY2FuIGJlCisJb3ZlcnJpZGRlbi4KKwkoVlBBVEgpOiBEb24ndCBzZXQgdG8gYW55dGhpbmcgYnV0IEBzcmNkaXJAIHRvIHdvcmsgd2l0aCBub24tR05VCisJbWFrZXMuCisJKHtydW4sY2FsbGJhY2t9Lm8pOiBQcm92aWRlIGV4cGxpY2l0IHBhdGhzIHRvIHRoZWlyIGFwcHJvcHJpYXRlCisJc291cmNlIGRpcmVjdG9yaWVzLgorCShnZW5jb2Rleywub30sZDEwdi1vcGMubyk6IFNwbGl0IGNvbXBpbGF0aW9uIGludG8gY3JlYXRpbmcgb2JqZWN0CisJYW5kIGxpbmtpbmcuICBJbnN0ZWFkIG9mIGxpbmtpbmcgaW4gbGlib3Bjb2Rlcy5hLCBqdXN0IGNvbXBpbGUKKwlkMTB2LW9wYy5vIGRpcmVjdGx5IHRvIGhhbmRsZSBjYW5hZGlhbiBjcm9zcy4KKwkoQ1NFQVJDSCk6IEFkZCBvcGNvZGVzIGRpcmVjdG9yeS4KKworCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0tY2ZsYWdzKTogTmV3IHN3aXRjaCB0byBhbGxvdyB1c2VyIHRvCisJc2V0IHRoZSBkZWZhdWx0cy4KKwkoQ0NfRk9SX0JVSUxEKTogRGVhbCB3aXRoIGNhbmFkaWFuIGNyb3NzZXMuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKK1dlZCBTZXAgMDQgMDQ6NDU6MzQgMTk5NiAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBzaW1vcHMuYzogSW5jbHVkZSBjb3JyZWN0IHN5c2NhbGwuaCBmb3IgZDEwdiwgbm90IGhvc3Qncy4KKwlGaXggI2lmZGVmIFNZU19zdGF0LgorCitUdWUgU2VwICAzIDE0OjAwOjA0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogc2ltb3BzLmMgKE9QXzVGMDApOiBXcmFwIGFsbCBTWVNfeHh4IHRyYXBzIHdpdGggI2lmZGVmLgorCUFkZCB0cmFwIDIgdG8gYmUgcHJpbnRmIGFuZCB0cmFwIDMgdG8gYmUgcHV0Y2hhci4KKworV2VkIEF1ZyAyOCAyMTo0MjozNCAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluLCBkMTB2X3NpbS5oLCBpbnRlcnAuYywgc2ltb3BzLmM6IEFkZCBzdXBwb3J0CisJZm9yIGxvdy1sZXZlbCBzeXN0ZW0gY2FsbHMuCisKK1dlZCBBdWcgMjggMTc6MzM6MTkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluLCBkMTB2X3NpbS5oLCBpbnRlcnAuYzogRml4IGJ5dGUtb3JkZXIgcHJvYmxlbXMuCisKK01vbiBBdWcgMjYgMTg6MzA6MjggMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIGQxMHZfc2ltLmggKFNFWFQzMik6IEFkZGVkLgorCSogaW50ZXJwLmM6IENvbW1lbnRlZCBvdXQgcHJpbnRmcy4KKwkqIHNpbW9wcy5jOiAgRml4ZWQgZXJyb3IgaW4gc2IgYW5kIHN0MncuIAorCitUaHUgQXVnIDE1IDEzOjMwOjAzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiwgZDEwdl9zaW0uaCwgaW50ZXJwLmMsIHNpbW9wcy5jOiBBZGRlZCByZW1haW5pbmcKKwlEU1AgaW5zdHJ1Y3Rpb25zLiAgQWRkZWQgbW9kdWxvIGFkZHJlc3NpbmcuCisKK1N1biBBdWcgMTEgMTI6NTc6MTUgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluLCBkMTB2X3NpbS5oLCBpbnRlcnAuYywgc2ltb3BzLmM6IFNuYXBzaG90LgorCitGcmkgQXVnICAyIDE3OjQ0OjI0IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgorCisJKiBkMTB2X3NpbS5oLCBzaW1vcHMuYzogU25hcHNob3QuCisKK1RodSBBdWcgIDEgMTc6MDU6MjQgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+CisKKwkqIENoYW5nZUxvZywgTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluLCBkMTB2X3NpbS5oLCAKKwlnZW5jb2RlLmMsIGludGVycC5jLCBzaW1vcHMuYzogQ3JlYXRlZC4KKwpkaWZmIC0tZ2l0IGEvc2ltL2QxMHYvTWFrZWZpbGUuaW4gYi9zaW0vZDEwdi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzMyMzI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2QxMHYvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw1MiBAQAorIyAgICBNYWtlZmlsZSB0ZW1wbGF0ZSBmb3IgQ29uZmlndXJlIGZvciB0aGUgRDEwdiBzaW0gbGlicmFyeS4KKyMgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIyBDT01NT05fUFJFX0NPTkZJR19GUkFHCisKK1NJTV9PQkpTID0gaW50ZXJwLm8gdGFibGUubyBzaW1vcHMubyBlbmRpYW4ubyBzaW0tbG9hZC5vCitTSU1fRVhUUkFfQ0xFQU4gPSBjbGVhbi1leHRyYQorCitJTkNMVURFID0gZDEwdl9zaW0uaCAkKHNyY3Jvb3QpL2luY2x1ZGUvY2FsbGJhY2suaCB0YXJnLXZhbHMuaCBlbmRpYW4uYworCisjIFRoaXMgc2VsZWN0cyB0aGUgZDEwdiBuZXdsaWIvbGliZ2xvc3Mgc3lzY2FsbCBkZWZpbml0aW9ucy4KK05MX1RBUkdFVCA9IC1ETkxfVEFSR0VUX2QxMHYKKworIyMgQ09NTU9OX1BPU1RfQ09ORklHX0ZSQUcKKworc2ltb3BzLmg6IGdlbmNvZGUKKwkuL2dlbmNvZGUgLWggPiRACisKK3RhYmxlLmM6IGdlbmNvZGUgc2ltb3BzLmgKKwkuL2dlbmNvZGUgPiRACisKK2dlbmNvZGUubzogZ2VuY29kZS5jICQoSU5DTFVERSkKKwkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS9nZW5jb2RlLmMKKworZDEwdi1vcGMubzogJChzcmNkaXIpLy4uLy4uL29wY29kZXMvZDEwdi1vcGMuYworCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgLWMgJChzcmNkaXIpLy4uLy4uL29wY29kZXMvZDEwdi1vcGMuYworCitnZW5jb2RlOiBnZW5jb2RlLm8gZDEwdi1vcGMubworCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgLW8gZ2VuY29kZSBnZW5jb2RlLm8gZDEwdi1vcGMubyAkKEJVSUxEX0xJQikKKworY2xlYW4tZXh0cmE6CisJcm0gLWYgdGFibGUuYyBzaW1vcHMuaCBnZW5jb2RlCisKK2ludGVycC5vOiBpbnRlcnAuYyB0YWJsZS5jICQoSU5DTFVERSkKK3NpbW9wcy5vOiBzaW1vcHMuYyAkKElOQ0xVREUpCitlbmRpYW4ubzogZW5kaWFuLmMgJChJTkNMVURFKQordGFibGUubzogdGFibGUuYwpkaWZmIC0tZ2l0IGEvc2ltL2QxMHYvYWNjb25maWcuaCBiL3NpbS9kMTB2L2FjY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliODdhMQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9kMTB2L2FjY29uZmlnLmgKQEAgLTAsMCArMSwxNSBAQAorCisvKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KKyN1bmRlZiBFTkFCTEVfTkxTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0NBVEdFVFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCmRpZmYgLS1naXQgYS9zaW0vZDEwdi9jb25maWcuaW4gYi9zaW0vZDEwdi9jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY4N2EyYgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9kMTB2L2NvbmZpZy5pbgpAQCAtMCwwICsxLDE1OCBAQAorLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCisjdW5kZWYgQ19BTExPQ0EKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCisjdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCisjdW5kZWYgSEFWRV9BTExPQ0EKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCisjdW5kZWYgaW5saW5lCisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgb2ZmX3QKKworLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCisjdW5kZWYgX1BPU0lYX1NPVVJDRQorCisvKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoaW50IG9yIHZvaWQpLiAgKi8KKyN1bmRlZiBSRVRTSUdUWVBFCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIHNpemVfdAorCisvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKKyAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgorIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgorICovCisjdW5kZWYgU1RBQ0tfRElSRUNUSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19zZXRmcHVjdyBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX1NFVEZQVUNXCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0RDR0VUVEVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRDV0QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRQQUdFU0laRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHJ1c2FnZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRSVVNBR0UKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfTVVOTUFQCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1BVVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VUTE9DQUxFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lnYWN0aW9uIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NJR0FDVElPTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0hSCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGltZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9USU1FCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfQVJHWl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZnB1X2NvbnRyb2wuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfRlBVX0NPTlRST0xfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9NQUxMT0NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9OTF9UWVBFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVkFMVUVTX0gKZGlmZiAtLWdpdCBhL3NpbS9kMTB2L2NvbmZpZ3VyZSBiL3NpbS9kMTB2L2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jM2I5NmNmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2QxMHYvY29uZmlndXJlCkBAIC0wLDAgKzEsMzkxNyBAQAorIyEgL2Jpbi9zaAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCisjIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCisKKyMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDMKKworCisKKworCisjIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCisKKworIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCisKKworIyBDaGVjayB0byBzZWUgaWYgd2UncmUgcnVubmluZyB1bmRlciBDeWd3aW4zMiwgd2l0aG91dCB1c2luZworIyBBQ19DQU5PTklDQUxfKi4gIElmIHNvLCBzZXQgb3V0cHV0IHZhcmlhYmxlIENZR1dJTjMyIHRvICJ5ZXMiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICJubyIuCisKKworCisjIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIFdpbjMyLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgRVhFRVhUIHRvICIuZXhlIi4KKyMgT3RoZXJ3aXNlIHNldCBpdCB0byAiIi4KKworCisKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCithY19oZWxwPSIkYWNfaGVscAorICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQkJRW5hYmxlIGRldmVsb3BlciBmdW5jdGlvbmFsaXR5LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1ic3dhcAkJCVVzZSBIb3N0IHNwZWNpZmljIEJTV0FQIGluc3RydWN0aW9uLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1jZmxhZ3M9b3B0cwkJRXh0cmEgQ0ZMQUdTIGZvciB1c2UgaW4gYnVpbGRpbmcgc2ltdWxhdG9yIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWRlYnVnPW9wdHMJCUVuYWJsZSBkZWJ1Z2dpbmcgZmxhZ3MiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tc3RkaW8JCQlTcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIHN0ZGlvIGZvciBjb25zb2xlIGlucHV0L291dHB1dC4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tdHJhY2U9b3B0cwkJRW5hYmxlIHRyYWNpbmcgZmxhZ3MiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tcHJvZmlsZT1vcHRzCQlFbmFibGUgcHJvZmlsaW5nIGZsYWdzIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtYnVpbGQtd2FybmluZ3NbPUxJU1RdCQlFbmFibGUgYnVpbGQtdGltZSBjb21waWxlciB3YXJuaW5ncyIKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2J1aWxkPU5PTkUKK2NhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2V4ZWNfcHJlZml4PU5PTkUKK2hvc3Q9Tk9ORQorbm9fY3JlYXRlPQorbm9ub3B0PU5PTkUKK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3RhcmdldD1OT05FCit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorc3ViZGlycz0KK01GTEFHUz0gTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT1NYWtlZmlsZS5pbgorCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2FjX2V4ZWV4dD0KK2FjX29iamV4dD1vCitpZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KKyAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKyAgICBhY19uPSBhY19jPScKKycgYWNfdD0nCScKKyAgZWxzZQorICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKyAgZmkKK2Vsc2UKKyAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CitmaQorCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY3OTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAorICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgorICBDUFA9IiR7Q0MtY2N9IC1FIgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA2OTQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjcwMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzExICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDcyOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NzM0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPS9saWIvY3BwCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKKyAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCitlbHNlCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKK2VjaG8gIiRhY190IiIkQ1BQIiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc1OTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1CitzZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgorYWxsOgorCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCitFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCitpZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcworZWxzZQorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0bWFrZQorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgU0VUX01BS0U9CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Nzg2OiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1CitpZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKKyAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQordGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKK0VPRgorCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0M9IiRDQyAtcG9zaXgiCisgIGVsc2UKKyAgICBDQz0iJENDIC1YcCIKKyAgZmkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgIElTQz0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4MDc6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDgxMiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODIwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDgzNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4NTUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODc2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCitpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOworZXhpdCAoMCk7IH0KKworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjg4NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICA6CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBTVERDX0hFQURFUlMgMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5MTE6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgOTE2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKy8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCit0eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7CisvKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLworY2hhciBjb25zdCAqY29uc3QgKmNjcDsKK2NoYXIgKipwOworLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3N0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKK3N0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OworLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgorICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCisgICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLworY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOworY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOworLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KKysrY2NwOworcCA9IChjaGFyKiopIGNjcDsKK2NjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOworeyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgY2hhciAqdDsKKyAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKKworICAqdCsrID0gMDsKK30KK3sgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCisgIGludCB4W10gPSB7MjUsIDE3fTsKKyAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKKyAgKytmb287Cit9Cit7IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KKyAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7CisgIGlwdHIgcCA9IDA7CisgICsrcDsKK30KK3sgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZworICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCisgIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07CisgIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKK30KK3sgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCisgIGNvbnN0IGludCBmb28gPSAxMDsKK30KKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk2NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBjb25zdCAKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5ODY6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfY3ZfY19pbmxpbmU9bm8KK2ZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgOTkzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7Cit9ICRhY19rdyBmb28oKSB7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAwMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitmaQorcm0gLWYgY29uZnRlc3QqCitkb25lCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKK2Nhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KKyAgaW5saW5lIHwgeWVzKSA7OworICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGlubGluZSAKK0VPRgorIDs7CisgICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCitFT0YKKyA7OworZXNhYworCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwMjY6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwMzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgb2ZmX3QgbG9uZworRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwNTk6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA2NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAic2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZAorRU9GCisKK2ZpCisKKyMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCisjIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwOTQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDk5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhbGxvY2EuaD4KK2ludCBtYWluKCkgeworY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTI3OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExMzIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZWxzZQorIyBpZmRlZiBfTVNDX1ZFUgorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgZWxzZQorIyAgaWYgSEFWRV9BTExPQ0FfSAorIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KK2NoYXIgKmFsbG9jYSAoKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE2MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0EgMQorRU9GCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KKyAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKKyAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCisgICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAorICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KKyAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIENfQUxMT0NBIDEKK0VPRgorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExOTI6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTk3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKK3dlYmVjcmF5CisjZWxzZQord2Vub3RiZWNyYXkKKyNlbmRpZgorCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9vc19jcmF5PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCitmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIyMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTIyNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjUwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCitFT0YKKworICBicmVhaworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2RvbmUKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyNzc6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjg1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK2ZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCit7CisgIHN0YXRpYyBjaGFyICphZGRyID0gMDsKKyAgYXV0byBjaGFyIGR1bW15OworICBpZiAoYWRkciA9PSAwKQorICAgIHsKKyAgICAgIGFkZHIgPSAmZHVtbXk7CisgICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKK30KK21haW4gKCkKK3sKKyAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQorZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KK0VPRgorCitmaQorCitmb3IgYWNfaGRyIGluIHVuaXN0ZC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTMyOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzMzQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTM2ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM3MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDIxOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNDI5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCisgICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKKwltbWFwIHByaXZhdGUgbm90IGZpeGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisJbW1hcCBzaGFyZWQgbm90IGZpeGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKKyAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKKyAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQorICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQorICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCisgICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQorICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKKyAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgorCisgICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCisgICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgorICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCisgICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisvKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCisjaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKyMgaWZkZWYgSEFWRV9VTklTVERfSAorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGVuZGlmCisKKy8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCisjIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisjIGVuZGlmCisKKyMgaWZkZWYgX1NDX1BBR0VTSVpFCisjICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKKyMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKyMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCisjICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKKyMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgICAgaWZkZWYgTkJQRworIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQorIyAgICAgaWZuZGVmIENMU0laRQorIyAgICAgIGRlZmluZSBDTFNJWkUgMQorIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCisjICAgIGVsc2UgLyogbm8gTkJQRyAqLworIyAgICAgaWZkZWYgTkJQQworIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKKyMgICAgIGVsc2UgLyogbm8gTkJQQyAqLworIyAgICAgIGlmZGVmIFBBR0VTSVpFCisjICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCisjICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KKyMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KKyMgICAgZW5kaWYgLyogbm8gTkJQRyAqLworIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCisjICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLworCisjZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9CisjZWxzZQorY2hhciAqbWFsbG9jKCk7CisjZW5kaWYKKworaW50CittYWluKCkKK3sKKwljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKKwlpbnQgaSwgcGFnZXNpemU7CisJaW50IGZkOworCisJcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOworCisJLyoKKwkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCisJICovCisJZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKKwl1bWFzaygwKTsKKwlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKworCS8qCisJICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCisJICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAorCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCisJICovCisJZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEyKQorCQlleGl0KDEpOworCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKKwlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQorCQkJZXhpdCgxKTsKKworCS8qCisJICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKKwkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCisJICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCisJICovCisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7CisJZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YTMpCisJCWV4aXQoMSk7CisJaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCisJCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOworCWV4aXQoMCk7Cit9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTU1BUCAxCitFT0YKKworZmkKKworCisjIGF1dG9jb25mLmluZm8gc2F5cyB0aGlzIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgQUNfSU5JVC4KKworCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCithY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKK2FjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisKKyMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgorIyBUaGUgaW5wdXRzIGFyZToKKyMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAorIworIyBUaGUgcnVsZXMgYXJlOgorIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKKyMgICAgc2FtZSB0aW1lLgorIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KKyMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAorIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KKyMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KKyMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCisKKyMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KKyMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KK2Nhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgorTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OworKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCisKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgoraWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2NDI6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorCitob3N0X2FsaWFzPSRob3N0CitjYXNlICIkaG9zdF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKQorICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKKyAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaSA7OworICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKK2hvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY2MzogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKwordGFyZ2V0X2FsaWFzPSR0YXJnZXQKK2Nhc2UgIiR0YXJnZXRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKwordGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAordGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK3RhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCit0YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY4MTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorCitidWlsZF9hbGlhcz0kYnVpbGQKK2Nhc2UgIiRidWlsZF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKK2J1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitidWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgorCit0ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCisgIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKKyAgICBOT05FTk9ORXMseCx4LCAmJgorICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCisKK2lmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQorZWxzZQorICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCisgIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKK3MsXFwsXFxcXCxnOyBzLFwkLCQkLGcKK0VPRl9TRUQKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKKyAgcm0gLWYgY29uZnRlc3RzZWQKK2ZpCit0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KK3Rlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKworIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgordGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3MjU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3NTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODA0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorIDs7CisgICAgZXNhYworICBmaQorICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODM1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxODQ1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK21haW4oKXtyZXR1cm4oMCk7fQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4NDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcworICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCisgIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KKyAgZWxzZQorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCisgIGZpCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODY5OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1CitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTg3NDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg4MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2N2X3Byb2dfZ2NjPXllcworZWxzZQorICBhY19jdl9wcm9nX2djYz1ubworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKKworaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorCithY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKK2FjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTAyOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYworaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19nPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQorCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5NDU6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisKKyMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KK2lmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisgIENDX0ZPUl9CVUlMRD0nJChDQyknCitlbHNlCisgIENDX0ZPUl9CVUlMRD1nY2MKK2ZpCisKKworCisKK0FSPSR7QVItYXJ9CisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjAxMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKK2ZpCitmaQorUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworQUxMX0xJTkdVQVM9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAordW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDQ1OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjA1MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjA1NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAorX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwODU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIwOTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjExMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCisgICAgIGZvciBhY19mdW5jIGluIHN0cGNweQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjE0MjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjE0NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmaQorICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KKyAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1RQQ1BZIDEKK0VPRgorCisgICBmaQorCisgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyMDQ6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjIwOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bG9jYWxlLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiBMQ19NRVNTQUdFUworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgorICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQorRU9GCisKKyAgICBmaQorICBmaQorICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjM3OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCisgIFVTRV9OTFM9JGVuYWJsZXZhbAorZWxzZQorICBVU0VfTkxTPXllcworZmkKKworICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgorICAgIAorCisgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KKworICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEVOQUJMRV9OTFMgMQorRU9GCisKKyAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyNTc6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKK2Vsc2UKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubworZmkKKworICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2CisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KKwlubHNfY3ZfaGVhZGVyX2xpYmd0PQorCUNBVE9CSkVYVD1OT05FCisKKwlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjI3NjogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjI4MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjg2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjMwMzogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzA4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzE1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKwkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMzE6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQorYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1saW50bCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzM5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgYmluZHRleHRkb21haW4oKTsKKworaW50IG1haW4oKSB7CitiaW5kdGV4dGRvbWFpbigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM1MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjM2NjogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzcxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM3ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0dFVFRFWFQgMQorRU9GCisKKwkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0MDY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisJICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgorCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0NDA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI0NDUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQ5NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjUzMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNTYyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CitleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CisJCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9LmdtbworCQkgICBEQVRBRElSTkFNRT1zaGFyZQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9Lm1vCisJCSAgIERBVEFESVJOQU1FPWxpYgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCQlJTlNUT0JKRVhUPS5tbworCSAgICAgIGZpCisJICAgIGZpCisJCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisJICAgICAgICAKKyAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KKwkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCisgICAgICAgIGZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjYwMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KKwlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2MzY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2NzE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KKwkgIDogOworCWVsc2UKKwkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCisgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKKyAgICBkb25lCisKKyAgICAgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgIAorCisgICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCisgICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCisgICAgICAgTElOR1VBUz0KKyAgICAgZWxzZQorICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3NjE6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQorICAgICAgIE5FV19MSU5HVUFTPQorICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbworICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgorICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7CisgICAgICAgICBlc2FjCisgICAgICAgZG9uZQorICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCisgICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2CisgICAgIGZpCisKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCisgICAgIGZpCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKKyAgIGVsc2UKKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAorLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgorICAgZmkKKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgorICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KKwkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3ODk6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI3OTQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc5OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIG1zZ2Zvcm1hdD1saW51eAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK21zZ2Zvcm1hdD14b3BlbgorZmkKKworCisJICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCisgICAgICBmaQorICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCisJICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICAKKyAgIAorCisgICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCisgICAKKworICAgICAgbD0KKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgCisKKyMgQ2hlY2sgZm9yIGNvbW1vbiBoZWFkZXJzLgorIyBGSVhNRTogU2VlbXMgdG8gbWUgdGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgZm9yIGkzODYtd2luZG93cyBob3N0cy4KKyMgQXQgb25lIHBvaW50IHRoZXJlIHdlcmUgaGFyZGNvZGVkIEFDX0RFRklORSdzIGlmICR7aG9zdH0gPSBpMzg2LSotd2luZG93cyouCitmb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB1bmlzdGQuaCB0aW1lLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyODY4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjg3MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg3ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19oZHIgaW4gc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5MDg6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTEzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTE4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2hkciBpbiBmY250bC5oIGZwdV9jb250cm9sLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTQ4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjk1MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk1ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHJ1c2FnZSB0aW1lIHNpZ2FjdGlvbiBfX3NldGZwdWN3CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTg3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTkyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworIyBDaGVjayBmb3Igc29ja2V0IGxpYnJhcmllcworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMwNDI6IGNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nYmluZCB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxzb2NrZXQgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzA1MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGJpbmQoKTsKKworaW50IG1haW4oKSB7CitiaW5kKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDYxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHNvY2tldCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9saWIgMQorRU9GCisKKyAgTElCUz0iLWxzb2NrZXQgJExJQlMiCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzA4OTogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQorYWNfbGliX3Zhcj1gZWNobyBuc2wnXydnZXRob3N0YnluYW1lIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbG5zbCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDk3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZ2V0aG9zdGJ5bmFtZSgpOworCitpbnQgbWFpbigpIHsKK2dldGhvc3RieW5hbWUoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbnNsIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2xpYiAxCitFT0YKKworICBMSUJTPSItbG5zbCAkTElCUyIKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0CisKKworCitVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlNQUlOVD0iIiBVU0VfTUFJTlRBSU5FUl9NT0RFPXllcyA7OworICBubykJTUFJTlQ9IiMiIDs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLW1haW50YWluZXItbW9kZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IE1BSU5UPSIjIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQorZmkKK2Vsc2UKKyAgTUFJTlQ9IiMiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSAtRFVTRV9CU1dBUD0xIjs7CisgIG5vKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0wIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1ic3dhcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ic3dhcD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9ic3dhcD0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY2ZsYWdzIG9yIC0tZGlzYWJsZS1zaW0tY2ZsYWdzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jZmxhZ3MiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQkgc2ltX2NmbGFncz0iLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIjs7CisgIHRyYWNlKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJQbGVhc2UgdXNlIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpbnN0ZWFkLiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2NmbGFncz0iIjs7CisgIG5vKQkgc2ltX2NmbGFncz0iIjs7CisgICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2NmbGFncz0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVidWcgb3IgLS1kaXNhYmxlLXNpbS1kZWJ1ZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWJ1ZyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpIHNpbV9kZWJ1Zz0iLURERUJVRz03IC1EV0lUSF9ERUJVRz03Ijs7CisgIG5vKSAgc2ltX2RlYnVnPSItRERFQlVHPTAgLURXSVRIX0RFQlVHPTAiOzsKKyAgKikgICBzaW1fZGVidWc9Ii1EREVCVUc9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfREVCVUc9Jygke2VuYWJsZXZhbH0pJyI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWJ1ZyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIGRlYnVnID0gJHNpbV9kZWJ1ZyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2RlYnVnPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zdGRpbyBvciAtLWRpc2FibGUtc2ltLXN0ZGlvIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zdGRpbytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N0ZGlvIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7CisgIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zdGRpbyIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGlvPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkaW8iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHN0ZGlvIGZsYWdzID0gJHNpbV9zdGRpbyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3N0ZGlvPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS10cmFjZSBvciAtLWRpc2FibGUtc2ltLXRyYWNlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV90cmFjZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3RyYWNlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3RyYWNlPSItRFRSQUNFPTEgLURXSVRIX1RSQUNFPS0xIjs7CisgIG5vKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MCAtRFdJVEhfVFJBQ0U9MCI7OworICBbLTAtOV0qKQorCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fdHJhY2U9IiIKKwlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKwkgIGlmIHRlc3QgeCIkc2ltX3RyYWNlIiA9IHg7IHRoZW4KKwkgICAgc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9JyhUUkFDRV8keCIKKwkgIGVsc2UKKwkgICAgc2ltX3RyYWNlPSIke3NpbV90cmFjZX18VFJBQ0VfJHgiCisJICBmaQorCWRvbmUKKwlzaW1fdHJhY2U9IiRzaW1fdHJhY2UpJyIgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSB0cmFjZSA9ICRzaW1fdHJhY2UiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV90cmFjZT0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcHJvZmlsZSBvciAtLWRpc2FibGUtc2ltLXByb2ZpbGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3Byb2ZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9wcm9maWxlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7CisgIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OworICBbLTAtOV0qKQorCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fcHJvZmlsZT0iIgorCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbworCSAgaWYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgPSB4OyB0aGVuCisJICAgIHNpbV9wcm9maWxlPSItRFdJVEhfUFJPRklMRT0nKFBST0ZJTEVfJHgiCisJICBlbHNlCisJICAgIHNpbV9wcm9maWxlPSIke3NpbV9wcm9maWxlfXxQUk9GSUxFXyR4IgorCSAgZmkKKwlkb25lCisJc2ltX3Byb2ZpbGU9IiRzaW1fcHJvZmlsZSknIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9wcm9maWxlIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gcHJvZmlsZSA9ICRzaW1fcHJvZmlsZSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3Byb2ZpbGU9IiIKK2ZpCisKKworCitlY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMyODQ6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMjg5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBzaWduYWwKKyN1bmRlZiBzaWduYWwKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7CisjZWxzZQordm9pZCAoKnNpZ25hbCAoKSkgKCk7CisjZW5kaWYKKworaW50IG1haW4oKSB7CitpbnQgaTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzA2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpZ25hbD1pbnQKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCitFT0YKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzMyNjogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkQ1lHV0lOMzIiID0geWVzOyB0aGVuCithbV9jdl9leGVleHQ9LmV4ZQorZWxzZQorY2F0ID4gYW1fY190ZXN0LmMgPDwgJ0VPRicKK2ludCBtYWluKCkgeworLyogTm90aGluZyBuZWVkZWQgaGVyZSAqLworfQorRU9GCiske0NDLWNjfSAtbyBhbV9jX3Rlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgYW1fY190ZXN0LmMgJExJQlMgMT4mNQorYW1fY3ZfZXhlZXh0PWBscyBhbV9jX3Rlc3QuKiB8IGdyZXAgLXYgYW1fY190ZXN0LmMgfCBzZWQgLWUgcy9hbV9jX3Rlc3QvL2AKK3JtIC1mIGFtX2NfdGVzdCoKK2ZpCisKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iID0geCAmJiBhbV9jdl9leGVleHQ9bm8KK2ZpCitFWEVFWFQ9IiIKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthbV9jdl9leGVleHR9CitlY2hvICIkYWNfdCIiJHthbV9jdl9leGVleHR9IiAxPiY2CisKKworc2ltX2xpbmtfZmlsZXM9CitzaW1fbGlua19saW5rcz0KKworc2ltX2xpbmtfbGlua3M9dGNvbmZpZy5oCitpZiB0ZXN0IC1mICR7c3JjZGlyfS90Y29uZmlnLmluCit0aGVuCisgIHNpbV9saW5rX2ZpbGVzPXRjb25maWcuaW4KK2Vsc2UKKyAgc2ltX2xpbmtfZmlsZXM9Li4vY29tbW9uL3Rjb25maWcuaW4KK2ZpCisKKyMgdGFyZy12YWxzLmRlZiBwb2ludHMgdG8gdGhlIGxpYmMgbWFjcm8gZGVzY3JpcHRpb24gZmlsZS4KK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyotKi0qKSBUQVJHX1ZBTFNfREVGPS4uL2NvbW1vbi9ubHR2YWxzLmRlZiA7OworZXNhYworc2ltX2xpbmtfZmlsZXM9IiR7c2ltX2xpbmtfZmlsZXN9ICR7VEFSR19WQUxTX0RFRn0iCitzaW1fbGlua19saW5rcz0iJHtzaW1fbGlua19saW5rc30gdGFyZy12YWxzLmRlZiIKKworCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWJ1aWxkLXdhcm5pbmdzIG9yIC0tZGlzYWJsZS1idWlsZC13YXJuaW5ncyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9idWlsZF93YXJuaW5ncytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfYnVpbGRfd2FybmluZ3MiCisgIGJ1aWxkX3dhcm5pbmdzPSItV2FsbCAtV3BvaW50ZXItYXJpdGggLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAtV21pc3NpbmctZGVjbGFyYXRpb25zIgorY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCTs7CisgIG5vKQlidWlsZF93YXJuaW5ncz0iLXciOzsKKyAgLCopICAgdD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgCisJYnVpbGRfd2FybmluZ3M9IiR7YnVpbGRfd2FybmluZ3N9ICR7dH0iOzsKKyAgKiwpICAgdD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgCisJYnVpbGRfd2FybmluZ3M9IiR7dH0gJHtidWlsZF93YXJuaW5nc30iOzsKKyAgKikJYnVpbGRfd2FybmluZ3M9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkYnVpbGRfd2FybmluZ3MiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHdhcm5pbmcgZmxhZ3MgPSAkYnVpbGRfd2FybmluZ3MiIDY+JjEKK2ZpCitlbHNlCisgIGJ1aWxkX3dhcm5pbmdzPSIiCitmaQorCisKK2ZvciBhY19oZHIgaW4gdW5pc3RkLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMzk2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzQwMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MzQwNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworCisKKwordHJhcCAnJyAxIDIgMTUKK2NhdCA+IGNvbmZjYWNoZSA8PFxFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgorIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAorIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCisjIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgorIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCisjIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgorIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCisjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworRU9GCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKyhzZXQpIDI+JjEgfAorICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjEgfCBncmVwIGFjX3NwYWNlYCBpbgorICAqYWNfc3BhY2U9XCAqKQorICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCisgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICBzZWQgLW4gXAorICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKKyAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKyAgICA7OworICAqKQorICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJworICAgIDs7CisgIGVzYWMgPj4gY29uZmNhY2hlCitpZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKyMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCitmaQorCit0cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKKyMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgorOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorCitlY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCitybSAtZiAkQ09ORklHX1NUQVRVUworY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyMhIC9iaW4vc2gKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCisjIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIworIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKKyMKKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCithY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgorZm9yIGFjX29wdGlvbgorZG8KKyAgY2FzZSAiXCRhY19vcHRpb24iIGluCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKKyAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCisgICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQHNpbV9lbnZpcm9ubWVudEAlJHNpbV9lbnZpcm9ubWVudCVnCitzJUBzaW1fYWxpZ25tZW50QCUkc2ltX2FsaWdubWVudCVnCitzJUBzaW1fYXNzZXJ0QCUkc2ltX2Fzc2VydCVnCitzJUBzaW1fYml0c2l6ZUAlJHNpbV9iaXRzaXplJWcKK3MlQHNpbV9lbmRpYW5AJSRzaW1fZW5kaWFuJWcKK3MlQHNpbV9ob3N0ZW5kaWFuQCUkc2ltX2hvc3RlbmRpYW4lZworcyVAc2ltX2Zsb2F0QCUkc2ltX2Zsb2F0JWcKK3MlQHNpbV9zY2FjaGVAJSRzaW1fc2NhY2hlJWcKK3MlQHNpbV9kZWZhdWx0X21vZGVsQCUkc2ltX2RlZmF1bHRfbW9kZWwlZworcyVAc2ltX2h3X2NmbGFnc0AlJHNpbV9od19jZmxhZ3MlZworcyVAc2ltX2h3X29ianNAJSRzaW1faHdfb2JqcyVnCitzJUBzaW1faHdAJSRzaW1faHclZworcyVAc2ltX2lubGluZUAlJHNpbV9pbmxpbmUlZworcyVAc2ltX3BhY2thZ2VzQCUkc2ltX3BhY2thZ2VzJWcKK3MlQHNpbV9yZWdwYXJtQCUkc2ltX3JlZ3Bhcm0lZworcyVAc2ltX3Jlc2VydmVkX2JpdHNAJSRzaW1fcmVzZXJ2ZWRfYml0cyVnCitzJUBzaW1fc21wQCUkc2ltX3NtcCVnCitzJUBzaW1fc3RkY2FsbEAlJHNpbV9zdGRjYWxsJWcKK3MlQHNpbV94b3JfZW5kaWFuQCUkc2ltX3hvcl9lbmRpYW4lZworcyVAYnVpbGRfd2FybmluZ3NAJSRidWlsZF93YXJuaW5ncyVnCitzJUBTSEVMTEAlJFNIRUxMJWcKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBob3N0QCUkaG9zdCVnCitzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCitzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKK3MlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZworcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKK3MlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCitzJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCitzJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCitzJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZworcyVAYnVpbGRAJSRidWlsZCVnCitzJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKK3MlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCitzJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZworcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCitzJUBDQ0AlJENDJWcKK3MlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCitzJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZworcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKK3MlQEhERUZJTkVTQCUkSERFRklORVMlZworcyVAQVJAJSRBUiVnCitzJUBSQU5MSUJAJSRSQU5MSUIlZworcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCitzJUBDUFBAJSRDUFAlZworcyVAQUxMT0NBQCUkQUxMT0NBJWcKK3MlQFVTRV9OTFNAJSRVU0VfTkxTJWcKK3MlQE1TR0ZNVEAlJE1TR0ZNVCVnCitzJUBHTVNHRk1UQCUkR01TR0ZNVCVnCitzJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKK3MlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZworcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCitzJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZworcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCitzJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKK3MlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKK3MlQElOVExERVBTQCUkSU5UTERFUFMlZworcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCitzJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKK3MlQFBPRklMRVNAJSRQT0ZJTEVTJWcKK3MlQFBPU1VCQCUkUE9TVUIlZworcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZworcyVAR1RfTk9AJSRHVF9OTyVnCitzJUBHVF9ZRVNAJSRHVF9ZRVMlZworcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZworcyVAbEAlJGwlZworcyVATUFJTlRAJSRNQUlOVCVnCitzJUBzaW1fYnN3YXBAJSRzaW1fYnN3YXAlZworcyVAc2ltX2NmbGFnc0AlJHNpbV9jZmxhZ3MlZworcyVAc2ltX2RlYnVnQCUkc2ltX2RlYnVnJWcKK3MlQHNpbV9zdGRpb0AlJHNpbV9zdGRpbyVnCitzJUBzaW1fdHJhY2VAJSRzaW1fdHJhY2UlZworcyVAc2ltX3Byb2ZpbGVAJSRzaW1fcHJvZmlsZSVnCitzJUBFWEVFWFRAJSRFWEVFWFQlZworCitDRU9GCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCithY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KK2FjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfbW9yZV9saW5lcz06CithY19zZWRfY21kcz0iIgord2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZmkKKyAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGVsc2UKKyAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGZpCisgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCisgICAgYWNfYmVnPSRhY19lbmQKKyAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgIGFjX3NlZF9jbWRzPWNhdAorZmkKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4ifQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KKworICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgIC4pICBzcmNkaXI9LgorICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgorICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7CisgIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgorICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgZXNhYworCisgIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgorICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKKyAgcm0gLWYgIiRhY19maWxlIgorICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorIyAkY29uZmlndXJlX2lucHV0IiA7OworICAqKSBhY19jb21zdWI9IDs7CisgIGVzYWMKKworICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBzZWQgLWUgIiRhY19jb21zdWIKK3MlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCitzJUBzcmNkaXJAJSRzcmNkaXIlZworcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworcyVASU5TVEFMTEAlJElOU1RBTEwlZworIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQorZmk7IGRvbmUKK3JtIC1mIGNvbmZ0ZXN0LnMqCisKKyMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCisjIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCisjCisjIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCithY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKK2FjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJworYWNfZEM9J1wzJworYWNfZEQ9JyVnJworIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCithY191Qz0nICcKK2FjX3VEPSdcNCVnJworIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKK2FjX2VDPScgJworYWNfZUQ9JyVnJworCitpZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZmkKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKKworICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAorICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KKworRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCisjIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCitybSAtZiBjb25mdGVzdC52YWxzCitjYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCitzL1tcXCYlXS9cXCYvZworcyVbXFwkYF0lXFwmJWcKK3MlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCitzJWFjX2QlYWNfdSVncAorcyVhY191JWFjX2UlZ3AKK0VPRgorc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscworcm0gLWYgY29uZnRlc3QuaGRyCisKKyMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKKyMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCitzJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQorRU9GCisKKyMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgorIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KKworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgOgorZG8KKyAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAorICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCisgIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKKyAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCisgIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUworICBlY2hvICdDRU9GCisgIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0CisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgorJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKKyAgcm0gLWYgY29uZnRlc3QudmFscworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKKyAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCisgIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCisgICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgorICAgIHJtIC1mIGNvbmZ0ZXN0LmgKKyAgZWxzZQorICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgZmkKKyAgICBybSAtZiAkYWNfZmlsZQorICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKKyAgZmkKK2ZpOyBkb25lCisKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKK2FjX3NvdXJjZXM9IiRzaW1fbGlua19maWxlcyIKK2FjX2Rlc3RzPSIkc2ltX2xpbmtfbGlua3MiCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorc3JjZGlyPSRhY19naXZlbl9zcmNkaXIKK3doaWxlIHRlc3QgLW4gIiRhY19zb3VyY2VzIjsgZG8KKyAgc2V0ICRhY19kZXN0czsgYWNfZGVzdD0kMTsgc2hpZnQ7IGFjX2Rlc3RzPSQqCisgIHNldCAkYWNfc291cmNlczsgYWNfc291cmNlPSQxOyBzaGlmdDsgYWNfc291cmNlcz0kKgorCisgIGVjaG8gImxpbmtpbmcgJHNyY2Rpci8kYWNfc291cmNlIHRvICRhY19kZXN0IgorCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY19zb3VyY2U7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRzcmNkaXIvJGFjX3NvdXJjZTogRmlsZSBub3QgZm91bmQiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorICBybSAtZiAkYWNfZGVzdAorCisgICMgTWFrZSByZWxhdGl2ZSBzeW1saW5rcy4KKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rlc3RfZGlyPWBlY2hvICRhY19kZXN0fHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAiJGFjX2Rlc3QiICYmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGRlc3QgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kZXN0X2RpciIgJiYgbWtkaXIgIiRhY19kZXN0X2RpciIKKyAgICBhY19kZXN0X2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGVzdF9kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rlc3RfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kZXN0X2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kZXN0X2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJHNyY2RpciIgaW4KKyAgWy8kXSopIGFjX3JlbF9zb3VyY2U9IiRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKKyAgKikgYWNfcmVsX3NvdXJjZT0iJGFjX2RvdHMkc3JjZGlyLyRhY19zb3VyY2UiIDs7CisgIGVzYWMKKworICAjIE1ha2UgYSBzeW1saW5rIGlmIHBvc3NpYmxlOyBvdGhlcndpc2UgdHJ5IGEgaGFyZCBsaW5rLgorICBpZiBsbiAtcyAkYWNfcmVsX3NvdXJjZSAkYWNfZGVzdCAyPi9kZXYvbnVsbCB8fAorICAgIGxuICRzcmNkaXIvJGFjX3NvdXJjZSAkYWNfZGVzdDsgdGhlbiA6CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgbGluayAkYWNfZGVzdCB0byAkc3JjZGlyLyRhY19zb3VyY2UiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZG9uZQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitjYXNlICJ4JENPTkZJR19GSUxFUyIgaW4KKyB4TWFrZWZpbGUqKQorICAgZWNobyAiTWVyZ2luZyBNYWtlZmlsZS5zaW0rTWFrZS1jb21tb24uc2ltIGludG8gTWFrZWZpbGUgLi4uIgorICAgcm0gLWYgTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcCBNYWtlZmlsZQorICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QUkVfLywvXiMjIEVuZCBDT01NT05fUFJFXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTEudG1wCisgICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BPU1RfLywvXiMjIEVuZCBDT01NT05fUE9TVF8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0yLnRtcAorICAgc2VkIC1lICcvXiMjIENPTU1PTl9QUkVfLyByIE1ha2VzaW0xLnRtcCcgXAorCS1lICcvXiMjIENPTU1PTl9QT1NUXy8gciBNYWtlc2ltMi50bXAnIFwKKwk8TWFrZWZpbGUuc2ltID5NYWtlZmlsZQorICAgcm0gLWYgTWFrZWZpbGUuc2ltIE1ha2UtY29tbW9uLnNpbSBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wCisgICA7OworIGVzYWMKKyBjYXNlICJ4JENPTkZJR19IRUFERVJTIiBpbiB4Y29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjCisKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCisKZGlmZiAtLWdpdCBhL3NpbS9kMTB2L2NvbmZpZ3VyZS5pbiBiL3NpbS9kMTB2L2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGViZjY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2QxMHYvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsMTMgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Lgorc2luY2x1ZGUoLi4vY29tbW9uL2FjbG9jYWwubTQpCitBQ19QUkVSRVEoMi41KWRubAorQUNfSU5JVChNYWtlZmlsZS5pbikKKworU0lNX0FDX0NPTU1PTgorCitTSU1fQUNfT1BUSU9OX1dBUk5JTkdTCisKK0FDX0NIRUNLX0hFQURFUlModW5pc3RkLmgpCisKKworU0lNX0FDX09VVFBVVApkaWZmIC0tZ2l0IGEvc2ltL2QxMHYvZDEwdl9zaW0uaCBiL3NpbS9kMTB2L2QxMHZfc2ltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3ZTAyZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9kMTB2L2QxMHZfc2ltLmgKQEAgLTAsMCArMSw0NTIgQEAKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgIm9wY29kZS9kMTB2LmgiCisjaW5jbHVkZSAiYmZkLmgiCisKKyNkZWZpbmUgREVCVUdfVFJBQ0UJCTB4MDAwMDAwMDEKKyNkZWZpbmUgREVCVUdfVkFMVUVTCQkweDAwMDAwMDAyCisjZGVmaW5lIERFQlVHX0xJTkVfTlVNQkVSCTB4MDAwMDAwMDQKKyNkZWZpbmUgREVCVUdfTUVNU0laRQkJMHgwMDAwMDAwOAorI2RlZmluZSBERUJVR19JTlNUUlVDVElPTgkweDAwMDAwMDEwCisjZGVmaW5lIERFQlVHX1RSQVAJCTB4MDAwMDAwMjAKKworI2lmbmRlZglERUJVRworI2RlZmluZQlERUJVRyAoREVCVUdfVFJBQ0UgfCBERUJVR19WQUxVRVMgfCBERUJVR19MSU5FX05VTUJFUikKKyNlbmRpZgorCitleHRlcm4gaW50IGQxMHZfZGVidWc7CisKKyNpbmNsdWRlICJyZW1vdGUtc2ltLmgiCisjaW5jbHVkZSAic2ltLWNvbmZpZy5oIgorI2luY2x1ZGUgInNpbS10eXBlcy5oIgorCit0eXBlZGVmIHVuc2lnbmVkOCB1aW50ODsKK3R5cGVkZWYgdW5zaWduZWQxNiB1aW50MTY7Cit0eXBlZGVmIHNpZ25lZDE2IGludDE2OwordHlwZWRlZiB1bnNpZ25lZDMyIHVpbnQzMjsKK3R5cGVkZWYgc2lnbmVkMzIgaW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkNjQgdWludDY0OwordHlwZWRlZiBzaWduZWQ2NCBpbnQ2NDsKKworLyogRklYTUU6IEQxMFYgZGVmaW5lcyAqLwordHlwZWRlZiB1aW50MTYgcmVnX3Q7CisKK3N0cnVjdCBzaW1vcHMgCit7CisgIGxvbmcgb3Bjb2RlOworICBpbnQgIGlzX2xvbmc7CisgIGxvbmcgbWFzazsKKyAgaW50IGZvcm1hdDsKKyAgaW50IGN5Y2xlczsKKyAgaW50IHVuaXQ7CisgIGludCBleGVjX3R5cGU7CisgIHZvaWQgKCpmdW5jKSgpOworICBpbnQgbnVtb3BzOworICBpbnQgb3BlcmFuZHNbOV07Cit9OworCitlbnVtIF9pbnNfdHlwZQoreworICBJTlNfVU5LTk9XTiwJCQkvKiB1bmtub3duIGluc3RydWN0aW9uICovCisgIElOU19DT05EX1RSVUUsCQkvKiAjIHRpbWVzIEVYRXh4eCBleGVjdXRlZCBvdGhlciBpbnN0cnVjdGlvbiAqLworICBJTlNfQ09ORF9GQUxTRSwJCS8qICMgdGltZXMgRVhFeHh4IGRpZCBub3QgZXhlY3V0ZSBvdGhlciBpbnN0cnVjdGlvbiAqLworICBJTlNfQ09ORF9KVU1QLAkJLyogIyB0aW1lcyBKVU1QIHNraXBwZWQgb3RoZXIgaW5zdHJ1Y3Rpb24gKi8KKyAgSU5TX0NZQ0xFUywJCQkvKiAjIGN5Y2xlcyAqLworICBJTlNfTE9ORywJCQkvKiBsb25nIGluc3RydWN0aW9uIChib3RoIGNvbnRhaW5lcnMsIGllIEZNID09IDExKSAqLworICBJTlNfTEVGVFJJR0hULAkJLyogIyB0aW1lcyBpbnN0cnVjdGlvbiBlbmNvZGVkIGFzIEwgLT4gUiAoaWUsIEZNID09IDAxKSAqLworICBJTlNfUklHSFRMRUZULAkJLyogIyB0aW1lcyBpbnN0cnVjdGlvbiBlbmNvZGVkIGFzIEwgPC0gUiAoaWUsIEZNID09IDEwKSAqLworICBJTlNfUEFSQUxMRUwsCQkJLyogIyB0aW1lcyBpbnN0cnVjdGlvbiBlbmNvZGVkIGFzIEwgfHwgUiAoaWUsIFJNID09IDAwKSAqLworCisgIElOU19MRUZULAkJCS8qIG5vcm1hbCBsZWZ0IGluc3RydWN0aW9ucyAqLworICBJTlNfTEVGVF9QQVJBTExFTCwJCS8qIGxlZnQgc2lkZSBvZiB8fCAqLworICBJTlNfTEVGVF9DT05EX1RFU1QsCQkvKiBFWEV4eCB0ZXN0IG9uIGxlZnQgc2lkZSAqLworICBJTlNfTEVGVF9DT05EX0VYRSwJCS8qIGV4ZWN1dGlvbiBhZnRlciBFWEV4eHggdGVzdCBvbiByaWdodCBzaWRlIHN1Y2NlZWRlZCAqLworICBJTlNfTEVGVF9OT1BTLAkJLyogTk9QIG9uIGxlZnQgc2lkZSAqLworCisgIElOU19SSUdIVCwJCQkvKiBub3JtYWwgcmlnaHQgaW5zdHJ1Y3Rpb25zICovCisgIElOU19SSUdIVF9QQVJBTExFTCwJCS8qIHJpZ2h0IHNpZGUgb2YgfHwgKi8KKyAgSU5TX1JJR0hUX0NPTkRfVEVTVCwJCS8qIEVYRXh4IHRlc3Qgb24gcmlnaHQgc2lkZSAqLworICBJTlNfUklHSFRfQ09ORF9FWEUsCQkvKiBleGVjdXRpb24gYWZ0ZXIgRVhFeHh4IHRlc3Qgb24gbGVmdCBzaWRlIHN1Y2NlZWRlZCAqLworICBJTlNfUklHSFRfTk9QUywJCS8qIE5PUCBvbiByaWdodCBzaWRlICovCisKKyAgSU5TX01BWAorfTsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX01BWCBdOworCitlbnVtIHsKKyAgU1BfSURYID0gMTUsCit9OworCisvKiBXcml0ZS1iYWNrIHNsb3RzICovCit1bmlvbiBzbG90X2RhdGEgeworICB1bnNpZ25lZF8xIF8xOworICB1bnNpZ25lZF8yIF8yOworICB1bnNpZ25lZF80IF80OworICB1bnNpZ25lZF84IF84OworfTsKK3N0cnVjdCBzbG90IHsKKyAgdm9pZCAqZGVzdDsKKyAgaW50IHNpemU7CisgIHVuaW9uIHNsb3RfZGF0YSBkYXRhOworICB1bmlvbiBzbG90X2RhdGEgbWFzazsKK307CitlbnVtIHsKKyBOUl9TTE9UUyA9IDE2LAorfTsKKyNkZWZpbmUgU0xPVCAoU3RhdGUuc2xvdCkKKyNkZWZpbmUgU0xPVF9OUiAoU3RhdGUuc2xvdF9ucikKKyNkZWZpbmUgU0xPVF9QRU5EX01BU0soREVTVCwgTVNLLCBWQUwpIFwKKyAgZG8gXAorICAgIHsgXAorICAgICAgU0xPVFtTTE9UX05SXS5kZXN0ID0gJihERVNUKTsgXAorICAgICAgU0xPVFtTTE9UX05SXS5zaXplID0gc2l6ZW9mIChERVNUKTsgXAorICAgICAgc3dpdGNoIChzaXplb2YgKERFU1QpKSBcCisgICAgICAgIHsgXAorICAgICAgICBjYXNlIDE6IFwKKyAgICAgICAgICBTTE9UW1NMT1RfTlJdLmRhdGEuXzEgPSAodW5zaWduZWRfMSkgKFZBTCk7IFwKKyAgICAgICAgICBTTE9UW1NMT1RfTlJdLm1hc2suXzEgPSAodW5zaWduZWRfMSkgKE1TSyk7IFwKKyAgICAgICAgICBicmVhazsgXAorICAgICAgICBjYXNlIDI6IFwKKyAgICAgICAgICBTTE9UW1NMT1RfTlJdLmRhdGEuXzIgPSAodW5zaWduZWRfMikgKFZBTCk7IFwKKyAgICAgICAgICBTTE9UW1NMT1RfTlJdLm1hc2suXzIgPSAodW5zaWduZWRfMikgKE1TSyk7IFwKKyAgICAgICAgICBicmVhazsgXAorICAgICAgICBjYXNlIDQ6IFwKKyAgICAgICAgICBTTE9UW1NMT1RfTlJdLmRhdGEuXzQgPSAodW5zaWduZWRfNCkgKFZBTCk7IFwKKyAgICAgICAgICBTTE9UW1NMT1RfTlJdLm1hc2suXzQgPSAodW5zaWduZWRfNCkgKE1TSyk7IFwKKyAgICAgICAgICBicmVhazsgXAorICAgICAgICBjYXNlIDg6IFwKKyAgICAgICAgICBTTE9UW1NMT1RfTlJdLmRhdGEuXzggPSAodW5zaWduZWRfOCkgKFZBTCk7IFwKKyAgICAgICAgICBTTE9UW1NMT1RfTlJdLm1hc2suXzggPSAodW5zaWduZWRfOCkgKE1TSyk7IFwKKyAgICAgICAgICBicmVhazsgXAorICAgICAgICB9IFwKKyAgICAgIFNMT1RfTlIgPSAoU0xPVF9OUiArIDEpOyBcCisgICAgfSBcCisgIHdoaWxlICgwKQorI2RlZmluZSBTTE9UX1BFTkQoREVTVCwgVkFMKSBTTE9UX1BFTkRfTUFTSyhERVNULCAwLCBWQUwpCisjZGVmaW5lIFNMT1RfRElTQ0FSRCgpIChTTE9UX05SID0gMCkKKyNkZWZpbmUgU0xPVF9GTFVTSCgpIFwKKyAgZG8gXAorICAgIHsgXAorICAgICAgaW50IGk7IFwKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBTTE9UX05SOyBpKyspIFwKKwl7IFwKKwkgIHN3aXRjaCAoU0xPVFtpXS5zaXplKSBcCisJICAgIHsgXAorCSAgICBjYXNlIDE6IFwKKwkgICAgICAqKHVuc2lnbmVkXzEqKSBTTE9UW2ldLmRlc3QgJj0gU0xPVFtpXS5tYXNrLl8xOyBcCisJICAgICAgKih1bnNpZ25lZF8xKikgU0xPVFtpXS5kZXN0IHw9IFNMT1RbaV0uZGF0YS5fMTsgXAorCSAgICAgIGJyZWFrOyBcCisJICAgIGNhc2UgMjogXAorCSAgICAgICoodW5zaWduZWRfMiopIFNMT1RbaV0uZGVzdCAmPSBTTE9UW2ldLm1hc2suXzI7IFwKKwkgICAgICAqKHVuc2lnbmVkXzIqKSBTTE9UW2ldLmRlc3QgfD0gU0xPVFtpXS5kYXRhLl8yOyBcCisJICAgICAgYnJlYWs7IFwKKwkgICAgY2FzZSA0OiBcCisJICAgICAgKih1bnNpZ25lZF80KikgU0xPVFtpXS5kZXN0ICY9IFNMT1RbaV0ubWFzay5fNDsgXAorCSAgICAgICoodW5zaWduZWRfNCopIFNMT1RbaV0uZGVzdCB8PSBTTE9UW2ldLmRhdGEuXzQ7IFwKKwkgICAgICBicmVhazsgXAorCSAgICBjYXNlIDg6IFwKKwkgICAgICAqKHVuc2lnbmVkXzgqKSBTTE9UW2ldLmRlc3QgJj0gU0xPVFtpXS5tYXNrLl84OyBcCisJICAgICAgKih1bnNpZ25lZF84KikgU0xPVFtpXS5kZXN0IHw9IFNMT1RbaV0uZGF0YS5fODsgXAorCSAgICAgIGJyZWFrOyBcCisJICAgIH0gXAorICAgICAgICB9IFwKKyAgICAgIFNMT1RfTlIgPSAwOyBcCisgICAgfSBcCisgIHdoaWxlICgwKQorI2RlZmluZSBTTE9UX0RVTVAoKSBcCisgIGRvIFwKKyAgICB7IFwKKyAgICAgIGludCBpOyBcCisgICAgICBmb3IgKGkgPSAwOyBpIDwgU0xPVF9OUjsgaSsrKSBcCisJeyBcCisJICBzd2l0Y2ggKFNMT1RbaV0uc2l6ZSkgXAorCSAgICB7IFwKKwkgICAgY2FzZSAxOiBcCisgICAgICAgICAgICAgIHByaW50ZiAoIlNMT1QgJWQgKjB4JTA4bHggJiAweCUwMnggfCAweCUwMnhcbiIsIGksIFwKKwkJICAgICAgKGxvbmcpIFNMT1RbaV0uZGVzdCwgXAorICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgU0xPVFtpXS5tYXNrLl8xLCBcCisgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBTTE9UW2ldLmRhdGEuXzEpOyBcCisJICAgICAgYnJlYWs7IFwKKwkgICAgY2FzZSAyOiBcCisgICAgICAgICAgICAgIHByaW50ZiAoIlNMT1QgJWQgKjB4JTA4bHggJiAweCUwNHggfCAweCUwNHhcbiIsIGksIFwKKwkJICAgICAgKGxvbmcpIFNMT1RbaV0uZGVzdCwgXAorICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgU0xPVFtpXS5tYXNrLl8yLCBcCisgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBTTE9UW2ldLmRhdGEuXzIpOyBcCisJICAgICAgYnJlYWs7IFwKKwkgICAgY2FzZSA0OiBcCisgICAgICAgICAgICAgIHByaW50ZiAoIlNMT1QgJWQgKjB4JTA4bHggJiAweCUwOHggfCAweCUwOHhcbiIsIGksIFwKKwkJICAgICAgKGxvbmcpIFNMT1RbaV0uZGVzdCwgXAorICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgU0xPVFtpXS5tYXNrLl80LCBcCisgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBTTE9UW2ldLmRhdGEuXzQpOyBcCisJICAgICAgYnJlYWs7IFwKKwkgICAgY2FzZSA4OiBcCisgICAgICAgICAgICAgIHByaW50ZiAoIlNMT1QgJWQgKjB4JTA4bHggJiAweCUwOHglMDh4IHwgMHglMDh4JTA4eFxuIiwgaSwgXAorCQkgICAgICAobG9uZykgU0xPVFtpXS5kZXN0LCBcCisgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSAoU0xPVFtpXS5tYXNrLl84ID4+IDMyKSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpIFNMT1RbaV0ubWFzay5fOCwgXAorICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgKFNMT1RbaV0uZGF0YS5fOCA+PiAzMiksICBcCisgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBTTE9UW2ldLmRhdGEuXzgpOyBcCisJICAgICAgYnJlYWs7IFwKKwkgICAgfSBcCisgICAgICAgIH0gXAorICAgIH0gXAorICB3aGlsZSAoMCkKKworc3RydWN0IF9zdGF0ZQoreworICByZWdfdCByZWdzWzE2XTsJCS8qIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgR1BSKE4pIChTdGF0ZS5yZWdzWyhOKV0gKyAwKQorI2RlZmluZSBTRVRfR1BSKE4sVkFMKSBTTE9UX1BFTkQgKFN0YXRlLnJlZ3NbKE4pXSwgKFZBTCkpCisKKyNkZWZpbmUgR1BSMzIoTikgKCgoKHVpbnQzMikgU3RhdGUucmVnc1soTikgKyAwXSkgPDwgMTYpIFwKKwkJICB8ICh1aW50MTYpIFN0YXRlLnJlZ3NbKE4pICsgMV0pCisjZGVmaW5lIFNFVF9HUFIzMihOLFZBTCkgZG8geyBTRVRfR1BSIChPUFswXSArIDAsIChWQUwpID4+IDE2KTsgU0VUX0dQUiAoT1BbMF0gKyAxLCAoVkFMKSk7IH0gd2hpbGUgKDApCisKKyAgcmVnX3QgY3JlZ3NbMTZdOwkJLyogY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ1JFRyhOKSAoU3RhdGUuY3JlZ3NbKE4pXSArIDApCisjZGVmaW5lIFNFVF9DUkVHKE4sVkFMKSBtb3ZlX3RvX2NyICgoTiksIDAsIChWQUwpKQorCisgIHJlZ190IHNwWzJdOyAgICAgICAgICAgICAgICAgIC8qIGhvbGRpbmcgYXJlYSBmb3IgU1BJKDApL1NQVSgxKSAqLworI2RlZmluZSBIRUxEX1NQKE4pIChTdGF0ZS5zcFsoTildICsgMCkKKyNkZWZpbmUgU0VUX0hFTERfU1AoTixWQUwpIFNMT1RfUEVORCAoU3RhdGUuc3BbKE4pXSwgKFZBTCkpCisKKyAgaW50NjQgYVsyXTsJCQkvKiBhY2N1bXVsYXRvcnMgKi8KKyNkZWZpbmUgQUNDKE4pIChTdGF0ZS5hWyhOKV0gKyAwKQorI2RlZmluZSBTRVRfQUNDKE4sVkFMKSBTTE9UX1BFTkQgKFN0YXRlLmFbKE4pXSwgKFZBTCkgJiBNQVNLNDApCisKKyAgLyogd3JpdGViYWNrIGluZm8gKi8KKyAgc3RydWN0IHNsb3Qgc2xvdFtOUl9TTE9UU107CisgIGludCBzbG90X25yOworCisgIC8qIHRyYWNlIGRhdGEgKi8KKyAgc3RydWN0IHsKKyAgICB1aW50MTYgcHN3OworICB9IHRyYWNlOworCisgIHVpbnQ4IGV4ZTsKKyAgaW50CWV4Y2VwdGlvbjsKKyAgaW50CXBjX2NoYW5nZWQ7CisKKyAgLyogTk9URTogZXZlcnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaXMgbm90IHJlc2V0IGJ5IHNpbV9jcmVhdGVfaW5mZXJpb3IoKSAqLworICB1aW50OCAqaW1lbTsKKyAgdWludDggKmRtZW07CisgIHVpbnQ4ICp1bWVtWzEyOF07CisgIGVudW0gX2luc190eXBlIGluc190eXBlOworCit9IFN0YXRlOworCisKK2V4dGVybiBob3N0X2NhbGxiYWNrICpkMTB2X2NhbGxiYWNrOworZXh0ZXJuIHVpbnQxNiBPUFs0XTsKK2V4dGVybiBzdHJ1Y3Qgc2ltb3BzIFNpbW9wc1tdOworZXh0ZXJuIGFzZWN0aW9uICp0ZXh0OworZXh0ZXJuIGJmZF92bWEgdGV4dF9zdGFydDsKK2V4dGVybiBiZmRfdm1hIHRleHRfZW5kOworZXh0ZXJuIGJmZCAqcHJvZ19iZmQ7CisKK2VudW0KK3sKKyAgUFNXX0NSID0gMCwKKyAgQlBTV19DUiA9IDEsCisgIFBDX0NSID0gMiwKKyAgQlBDX0NSID0gMywKKyAgRFBTV19DUiA9IDQsCisgIERQQ19DUiA9IDUsCisgIFJQVF9DX0NSID0gNywKKyAgUlBUX1NfQ1IgPSA4LAorICBSUFRfRV9DUiA9IDksCisgIE1PRF9TX0NSID0gMTAsCisgIE1PRF9FX0NSID0gMTEsCisgIElCQV9DUiA9IDE0LAorfTsKKworZW51bQoreworICBQU1dfU01fQklUID0gMHg4MDAwLAorICBQU1dfRUFfQklUID0gMHgyMDAwLAorICBQU1dfREJfQklUID0gMHgxMDAwLAorICBQU1dfRE1fQklUID0gMHgwODAwLAorICBQU1dfSUVfQklUID0gMHgwNDAwLAorICBQU1dfUlBfQklUID0gMHgwMjAwLAorICBQU1dfTURfQklUID0gMHgwMTAwLAorICBQU1dfRlhfQklUID0gMHgwMDgwLAorICBQU1dfU1RfQklUID0gMHgwMDQwLAorICBQU1dfRjBfQklUID0gMHgwMDA4LAorICBQU1dfRjFfQklUID0gMHgwMDA0LAorICBQU1dfQ19CSVQgPSAgMHgwMDAxLAorfTsKKworI2RlZmluZSBQU1cgQ1JFRyAoUFNXX0NSKQorI2RlZmluZSBTRVRfUFNXKFZBTCkgU0VUX0NSRUcgKFBTV19DUiwgKFZBTCkpCisjZGVmaW5lIFNFVF9QU1dfQklUKE1BU0ssVkFMKSBtb3ZlX3RvX2NyIChQU1dfQ1IsIH4oTUFTSyksIChWQUwpID8gKE1BU0spIDogMCkKKworI2RlZmluZSBQU1dfU00gKChQU1cgJiBQU1dfU01fQklUKSAhPSAwKQorI2RlZmluZSBTRVRfUFNXX1NNKFZBTCkgU0VUX1BTV19CSVQgKFBTV19TTV9CSVQsIChWQUwpKQorCisjZGVmaW5lIFBTV19FQSAoKFBTVyAmIFBTV19FQV9CSVQpICE9IDApCisjZGVmaW5lIFNFVF9QU1dfRUEoVkFMKSBTRVRfUFNXX0JJVCAoUFNXX0VBX0JJVCwgKFZBTCkpCisKKyNkZWZpbmUgUFNXX0RCICgoUFNXICYgUFNXX0RCX0JJVCkgIT0gMCkKKyNkZWZpbmUgU0VUX1BTV19EQihWQUwpIFNFVF9QU1dfQklUIChQU1dfREJfQklULCAoVkFMKSkKKworI2RlZmluZSBQU1dfRE0gKChQU1cgJiBQU1dfRE1fQklUKSAhPSAwKQorI2RlZmluZSBTRVRfUFNXX0RNKFZBTCkgU0VUX1BTV19CSVQgKFBTV19ETV9CSVQsIChWQUwpKQorCisjZGVmaW5lIFBTV19JRSAoKFBTVyAmIFBTV19JRV9CSVQpICE9IDApCisjZGVmaW5lIFNFVF9QU1dfSUUoVkFMKSBTRVRfUFNXX0JJVCAoUFNXX0lFX0JJVCwgKFZBTCkpCisKKyNkZWZpbmUgUFNXX1JQICgoUFNXICYgUFNXX1JQX0JJVCkgIT0gMCkKKyNkZWZpbmUgU0VUX1BTV19SUChWQUwpIFNFVF9QU1dfQklUIChQU1dfUlBfQklULCAoVkFMKSkKKworI2RlZmluZSBQU1dfTUQgKChQU1cgJiBQU1dfTURfQklUKSAhPSAwKQorI2RlZmluZSBTRVRfUFNXX01EKFZBTCkgU0VUX1BTV19CSVQgKFBTV19NRF9CSVQsIChWQUwpKQorCisjZGVmaW5lIFBTV19GWCAoKFBTVyAmIFBTV19GWF9CSVQpICE9IDApCisjZGVmaW5lIFNFVF9QU1dfRlgoVkFMKSBTRVRfUFNXX0JJVCAoUFNXX0ZYX0JJVCwgKFZBTCkpCisKKyNkZWZpbmUgUFNXX1NUICgoUFNXICYgUFNXX1NUX0JJVCkgIT0gMCkKKyNkZWZpbmUgU0VUX1BTV19TVChWQUwpIFNFVF9QU1dfQklUIChQU1dfU1RfQklULCAoVkFMKSkKKworI2RlZmluZSBQU1dfRjAgKChQU1cgJiBQU1dfRjBfQklUKSAhPSAwKQorI2RlZmluZSBTRVRfUFNXX0YwKFZBTCkgU0VUX1BTV19CSVQgKFBTV19GMF9CSVQsIChWQUwpKQorCisjZGVmaW5lIFBTV19GMSAoKFBTVyAmIFBTV19GMV9CSVQpICE9IDApCisjZGVmaW5lIFNFVF9QU1dfRjEoVkFMKSBTRVRfUFNXX0JJVCAoUFNXX0YxX0JJVCwgKFZBTCkpCisKKyNkZWZpbmUgUFNXX0MgKChQU1cgJiBQU1dfQ19CSVQpICE9IDApCisjZGVmaW5lIFNFVF9QU1dfQyhWQUwpIFNFVF9QU1dfQklUIChQU1dfQ19CSVQsIChWQUwpKQorCisvKiBTZWUgc2ltb3BzYy46bW92ZV90b19jcigpIGZvciByZWdpc3RlcnMgdGhhdCBjYW4gbm90IGJlIHJlYWQtZnJvbQorICAgb3IgYXNzaWduZWQtdG8gZGlyZWN0bHkgKi8KKworI2RlZmluZSBQQwlDUkVHIChQQ19DUikKKyNkZWZpbmUgU0VUX1BDKFZBTCkgU0VUX0NSRUcgKFBDX0NSLCAoVkFMKSkKKworI2RlZmluZSBCUFNXCUNSRUcgKEJQU1dfQ1IpCisjZGVmaW5lIFNFVF9CUFNXKFZBTCkgU0VUX0NSRUcgKEJQU1dfQ1IsIChWQUwpKQorCisjZGVmaW5lIEJQQwlDUkVHIChCUENfQ1IpCisjZGVmaW5lIFNFVF9CUEMoVkFMKSBTRVRfQ1JFRyAoQlBDX0NSLCAoVkFMKSkKKworI2RlZmluZSBEUFNXCUNSRUcgKERQU1dfQ1IpCisjZGVmaW5lIFNFVF9EUFNXKFZBTCkgU0VUX0NSRUcgKERQU1dfQ1IsIChWQUwpKQorCisjZGVmaW5lIERQQwlDUkVHIChEUENfQ1IpCisjZGVmaW5lIFNFVF9EUEMoVkFMKSBTRVRfQ1JFRyAoRFBDX0NSLCAoVkFMKSkKKworI2RlZmluZSBSUFRfQwlDUkVHIChSUFRfQ19DUikKKyNkZWZpbmUgU0VUX1JQVF9DKFZBTCkgU0VUX0NSRUcgKFJQVF9DX0NSLCAoVkFMKSkKKworI2RlZmluZSBSUFRfUwlDUkVHIChSUFRfU19DUikKKyNkZWZpbmUgU0VUX1JQVF9TKFZBTCkgU0VUX0NSRUcgKFJQVF9TX0NSLCAoVkFMKSkKKworI2RlZmluZSBSUFRfRQlDUkVHIChSUFRfRV9DUikKKyNkZWZpbmUgU0VUX1JQVF9FKFZBTCkgU0VUX0NSRUcgKFJQVF9FX0NSLCAoVkFMKSkKKworI2RlZmluZSBNT0RfUwlDUkVHIChNT0RfU19DUikKKyNkZWZpbmUgU0VUX01PRF9TKFZBTCkgU0VUX0NSRUcgKE1PRF9TX0NSLCAoVkFMKSkKKworI2RlZmluZSBNT0RfRQlDUkVHIChNT0RfRV9DUikKKyNkZWZpbmUgU0VUX01PRF9FKFZBTCkgU0VUX0NSRUcgKE1PRF9FX0NSLCAoVkFMKSkKKworI2RlZmluZSBJQkEJQ1JFRyAoSUJBX0NSKQorI2RlZmluZSBTRVRfSUJBKFZBTCkgU0VUX0NSRUcgKElCQV9DUiwgKFZBTCkpCisKKworI2RlZmluZSBTSUdfRDEwVl9TVE9QCS0xCisjZGVmaW5lIFNJR19EMTBWX0VYSVQJLTIKKworI2RlZmluZSBTRVhUMyh4KQkoKCgoeCkmMHg3KV4ofjMpKSs0KQkKKworLyogc2lnbi1leHRlbmQgYSA0LWJpdCBudW1iZXIgKi8KKyNkZWZpbmUgU0VYVDQoeCkJKCgoKHgpJjB4ZileKH43KSkrOCkJCisKKy8qIHNpZ24tZXh0ZW5kIGFuIDgtYml0IG51bWJlciAqLworI2RlZmluZSBTRVhUOCh4KQkoKCgoeCkmMHhmZileKH4weDdmKSkrMHg4MCkKKworLyogc2lnbi1leHRlbmQgYSAxNi1iaXQgbnVtYmVyICovCisjZGVmaW5lIFNFWFQxNih4KQkoKCgoeCkmMHhmZmZmKV4ofjB4N2ZmZikpKzB4ODAwMCkKKworLyogc2lnbi1leHRlbmQgYSAzMi1iaXQgbnVtYmVyICovCisjZGVmaW5lIFNFWFQzMih4KQkoKCgoeCkmU0lHTkVENjQoMHhmZmZmZmZmZikpXih+U0lHTkVENjQoMHg3ZmZmZmZmZikpKStTSUdORUQ2NCgweDgwMDAwMDAwKSkKKworLyogc2lnbiBleHRlbmQgYSA0MCBiaXQgbnVtYmVyICovCisjZGVmaW5lIFNFWFQ0MCh4KQkoKCgoeCkmU0lHTkVENjQoMHhmZmZmZmZmZmZmKSleKH5TSUdORUQ2NCgweDdmZmZmZmZmZmYpKSkrU0lHTkVENjQoMHg4MDAwMDAwMDAwKSkKKworLyogc2lnbiBleHRlbmQgYSA0NCBiaXQgbnVtYmVyICovCisjZGVmaW5lIFNFWFQ0NCh4KQkoKCgoeCkmU0lHTkVENjQoMHhmZmZmZmZmZmZmZikpXih+U0lHTkVENjQoMHg3ZmZmZmZmZmZmZikpKStTSUdORUQ2NCgweDgwMDAwMDAwMDAwKSkKKworLyogc2lnbiBleHRlbmQgYSA1NiBiaXQgbnVtYmVyICovCisjZGVmaW5lIFNFWFQ1Nih4KQkoKCgoeCkmU0lHTkVENjQoMHhmZmZmZmZmZmZmZmZmZikpXih+U0lHTkVENjQoMHg3ZmZmZmZmZmZmZmZmZikpKStTSUdORUQ2NCgweDgwMDAwMDAwMDAwMDAwKSkKKworLyogc2lnbiBleHRlbmQgYSA2MCBiaXQgbnVtYmVyICovCisjZGVmaW5lIFNFWFQ2MCh4KQkoKCgoeCkmU0lHTkVENjQoMHhmZmZmZmZmZmZmZmZmZmYpKV4oflNJR05FRDY0KDB4N2ZmZmZmZmZmZmZmZmZmKSkpK1NJR05FRDY0KDB4ODAwMDAwMDAwMDAwMDAwKSkKKworI2RlZmluZSBNQVgzMglTSUdORUQ2NCgweDdmZmZmZmZmKQorI2RlZmluZSBNSU4zMglTSUdORUQ2NCgweGZmODAwMDAwMDApCisjZGVmaW5lIE1BU0szMglTSUdORUQ2NCgweGZmZmZmZmZmKQorI2RlZmluZSBNQVNLNDAJU0lHTkVENjQoMHhmZmZmZmZmZmZmKQorCisvKiBUaGUgYWxpZ25tZW50IG9mIE1PRF9FIGluIHRoZSBmb2xsb3dpbmcgbWFjcm8gZGVwZW5kcyB1cG9uICJpIgorICAgYWx3YXlzIGJlaW5nIGEgcG93ZXIgb2YgMi4gKi8KKyNkZWZpbmUgSU5DX0FERFIoeCxpKSBcCitkbyBcCisgIHsgXAorICAgIGlmIChQU1dfTUQgJiYgR1BSICh4KSA9PSAoTU9EX0UgJiB+KChpKSAtIDEpKSkgXAorICAgICAgU0VUX0dQUiAoeCwgTU9EX1MpOyBcCisgICAgZWxzZSBcCisgICAgICBTRVRfR1BSICh4LCBHUFIgKHgpICsgKGkpKTsgXAorICB9IFwKK3doaWxlICgwKQorCitleHRlcm4gdWludDggKmRtZW1fYWRkciBQQVJBTVMgKCh1aW50MzIpKTsKK2V4dGVybiB1aW50OCAqaW1lbV9hZGRyIFBBUkFNUyAoKHVpbnQzMikpOworZXh0ZXJuIGJmZF92bWEgZGVjb2RlX3BjIFBBUkFNUyAoKHZvaWQpKTsKKworI2RlZmluZQlSQih4KQkoKihkbWVtX2FkZHIoeCkpKQorI2RlZmluZSBTQihhZGRyLGRhdGEpCSggUkIoYWRkcikgPSAoZGF0YSAmIDB4ZmYpKQorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX09QVElNSVpFX18pICYmICFkZWZpbmVkKE5PX0VORElBTl9JTkxJTkUpCisjZGVmaW5lIEVORElBTl9JTkxJTkUgc3RhdGljIF9faW5saW5lX18KKyNpbmNsdWRlICJlbmRpYW4uYyIKKyN1bmRlZiBFTkRJQU5fSU5MSU5FCisKKyNlbHNlCitleHRlcm4gdWludDMyIGdldF9sb25nd29yZCBQQVJBTVMgKCh1aW50OCAqKSk7CitleHRlcm4gdWludDE2IGdldF93b3JkIFBBUkFNUyAoKHVpbnQ4ICopKTsKK2V4dGVybiBpbnQ2NCBnZXRfbG9uZ2xvbmcgUEFSQU1TICgodWludDggKikpOworZXh0ZXJuIHZvaWQgd3JpdGVfd29yZCBQQVJBTVMgKCh1aW50OCAqYWRkciwgdWludDE2IGRhdGEpKTsKK2V4dGVybiB2b2lkIHdyaXRlX2xvbmd3b3JkIFBBUkFNUyAoKHVpbnQ4ICphZGRyLCB1aW50MzIgZGF0YSkpOworZXh0ZXJuIHZvaWQgd3JpdGVfbG9uZ2xvbmcgUEFSQU1TICgodWludDggKmFkZHIsIGludDY0IGRhdGEpKTsKKyNlbmRpZgorCisjZGVmaW5lIFNXKGFkZHIsZGF0YSkJCXdyaXRlX3dvcmQoZG1lbV9hZGRyKGFkZHIpLGRhdGEpCisjZGVmaW5lIFJXKHgpCQkJZ2V0X3dvcmQoZG1lbV9hZGRyKHgpKQorI2RlZmluZSBTTFcoYWRkcixkYXRhKSAgCXdyaXRlX2xvbmd3b3JkKGRtZW1fYWRkcihhZGRyKSxkYXRhKQorI2RlZmluZSBSTFcoeCkJCQlnZXRfbG9uZ3dvcmQoZG1lbV9hZGRyKHgpKQorI2RlZmluZSBSRUFEXzE2KHgpCQlnZXRfd29yZCh4KQorI2RlZmluZSBXUklURV8xNihhZGRyLGRhdGEpCXdyaXRlX3dvcmQoYWRkcixkYXRhKQorI2RlZmluZSBSRUFEXzY0KHgpCQlnZXRfbG9uZ2xvbmcoeCkKKyNkZWZpbmUgV1JJVEVfNjQoYWRkcixkYXRhKQl3cml0ZV9sb25nbG9uZyhhZGRyLGRhdGEpCisKKyNkZWZpbmUgSU1BUDAJCQlSVygweGZmMDApCisjZGVmaW5lIElNQVAxCQkJUlcoMHhmZjAyKQorI2RlZmluZSBETUFQCQkJUlcoMHhmZjA0KQorI2RlZmluZSBTRVRfSU1BUDAoeCkJCVNXKDB4ZmYwMCx4KQorI2RlZmluZSBTRVRfSU1BUDEoeCkJCVNXKDB4ZmYwMix4KQorI2RlZmluZSBTRVRfRE1BUCh4KQkJU1coMHhmZjA0LHgpCisKKyNkZWZpbmUgSk1QKHgpCQkJZG8geyBTRVRfUEMgKHgpOyBTdGF0ZS5wY19jaGFuZ2VkID0gMTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBSSUVfVkVDVE9SX1NUQVJUIDB4ZmZjMgorI2RlZmluZSBBRV9WRUNUT1JfU1RBUlQgMHhmZmMzCisjZGVmaW5lIFRSQVBfVkVDVE9SX1NUQVJUIDB4ZmZjNAkvKiB2ZWN0b3IgZm9yIHRyYXAgMCAqLworI2RlZmluZSBEQlRfVkVDVE9SX1NUQVJUIDB4ZmZkNAorI2RlZmluZSBTREJUX1ZFQ1RPUl9TVEFSVCAweGZmZDUKKworZXh0ZXJuIHJlZ190IG1vdmVfdG9fY3IgUEFSQU1TICgoaW50IGNyLCByZWdfdCBtYXNrLCByZWdfdCB2YWwpKTsKZGlmZiAtLWdpdCBhL3NpbS9kMTB2L2VuZGlhbi5jIGIvc2ltL2QxMHYvZW5kaWFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmNTAzZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9kMTB2L2VuZGlhbi5jCkBAIC0wLDAgKzEsMTM3IEBACisvKiBJZiB3ZSdyZSBiZWluZyBjb21waWxlZCBhcyBhIC5jIGZpbGUsIHJhdGhlciB0aGFuIGJlaW5nIGluY2x1ZGVkIGluCisgICBkMTB2X3NpbS5oLCB0aGVuIEVORElBTl9JTkxJTkUgd29uJ3QgYmUgZGVmaW5lZCB5ZXQuICAqLworCisjaWZuZGVmIEVORElBTl9JTkxJTkUKKyNkZWZpbmUgTk9fRU5ESUFOX0lOTElORQorI2luY2x1ZGUgImQxMHZfc2ltLmgiCisjZGVmaW5lIEVORElBTl9JTkxJTkUKKyNlbmRpZgorCitFTkRJQU5fSU5MSU5FIHVpbnQxNgorZ2V0X3dvcmQgKHgpCisgICAgICB1aW50OCAqeDsKK3sKKyNpZiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2k0ODZfXykgfHwgZGVmaW5lZChfX2k1ODZfXykgfHwgZGVmaW5lZChfX2k2ODZfXykpICYmIGRlZmluZWQoX19HTlVDX18pCisKKyAgdW5zaWduZWQgc2hvcnQgd29yZCA9ICoodW5zaWduZWQgc2hvcnQgKil4OworICBfX2FzbV9fICgieGNoZ2IgJWIwLCVoMCIgOiAiPXEiICh3b3JkKSA6ICIwIiAod29yZCkpOworICByZXR1cm4gd29yZDsKKworI2VsaWYgZGVmaW5lZChXT1JEU19CSUdFTkRJQU4pCisgIC8qIEl0IGlzIHNhZmUgdG8gZG8gdGhpcyBvbiBiaWcgZW5kaWFuIGhvc3RzLCBzaW5jZSB0aGUgZDEwdiByZXF1aXJlcyB0aGF0IHdvcmRzIGJlCisgICAgIGFsaWduZWQgb24gMTYtYml0IGJvdW5kYXJpZXMuICAqLworICByZXR1cm4gKih1aW50MTYgKil4OworCisjZWxzZQorICByZXR1cm4gKCh1aW50MTYpeFswXTw8OCkgKyB4WzFdOworI2VuZGlmCit9CisKK0VORElBTl9JTkxJTkUgdWludDMyCitnZXRfbG9uZ3dvcmQgKHgpCisgICAgICB1aW50OCAqeDsKK3sKKyNpZiAoZGVmaW5lZChfX2k0ODZfXykgfHwgZGVmaW5lZChfX2k1ODZfXykgfHwgZGVmaW5lZChfX2k2ODZfXykpICYmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoVVNFX0JTV0FQKQorCisgIHVuc2lnbmVkIGludCBsb25nX3dvcmQgPSAqKHVuc2lnbmVkICopeDsKKyAgX19hc21fXyAoImJzd2FwICUwIiA6ICI9ciIgKGxvbmdfd29yZCkgOiAiMCIgKGxvbmdfd29yZCkpOworICByZXR1cm4gbG9uZ193b3JkOworCisjZWxpZiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2k0ODZfXykgfHwgZGVmaW5lZChfX2k1ODZfXykgfHwgZGVmaW5lZChfX2k2ODZfXykpICYmIGRlZmluZWQoX19HTlVDX18pCisKKyAgdW5zaWduZWQgaW50IGxvbmdfd29yZCA9ICoodW5zaWduZWQgKil4OworICBfX2FzbV9fKCJ4Y2hnYiAlYjAsJWgwXG5cdCIJCS8qIHN3YXAgbG93ZXIgYnl0ZXMJKi8KKwkgICJyb3JsICQxNiwlMFxuXHQiCQkvKiBzd2FwIHdvcmRzCQkqLworCSAgInhjaGdiICViMCwlaDAiCQkvKiBzd2FwIGhpZ2hlciBieXRlcwkqLworCSAgOiI9cSIgKGxvbmdfd29yZCkKKwkgIDogIjAiIChsb25nX3dvcmQpKTsKKworICByZXR1cm4gbG9uZ193b3JkOworCisjZWxpZiAoZGVmaW5lZChfUE9XRVIpICYmIGRlZmluZWQoX0FJWCkpIHx8IChkZWZpbmVkKF9fUFBDX18pICYmIGRlZmluZWQoX19CSUdfRU5ESUFOX18pKQorICAvKiBQb3dlciAmIFBvd2VyUEMgY29tcHV0ZXJzIGluIGJpZyBlbmRpYW4gbW9kZSBjYW4gaGFuZGxlIHVuYWxpZ25lZCBsb2FkcyZzdG9yZXMgKi8KKyAgcmV0dXJuICoodWludDMyICopeDsKKworI2VsaWYgZGVmaW5lZChXT1JEU19CSUdFTkRJQU4pCisgIC8qIGxvbmcgd29yZHMgbXVzdCBiZSBhbGlnbmVkIG9uIGF0IGxlYXN0IDE2LWJpdCBib3VuZGFyaWVzLCBzbyB0aGlzIHNob3VsZCBiZSBzYWZlLiAgKi8KKyAgcmV0dXJuICgoKHVpbnQzMikgKih1aW50MTYgKil4KTw8MTYpIHwgKCh1aW50MzIpICoodWludDE2ICopKHgrMikpOworCisjZWxzZQorICByZXR1cm4gKCh1aW50MzIpeFswXTw8MjQpICsgKCh1aW50MzIpeFsxXTw8MTYpICsgKCh1aW50MzIpeFsyXTw8OCkgKyAoKHVpbnQzMil4WzNdKTsKKyNlbmRpZgorfQorCitFTkRJQU5fSU5MSU5FIGludDY0CitnZXRfbG9uZ2xvbmcgKHgpCisgICAgICB1aW50OCAqeDsKK3sKKyAgdWludDMyIHRvcCA9IGdldF9sb25nd29yZCAoeCk7CisgIHVpbnQzMiBib3R0b20gPSBnZXRfbG9uZ3dvcmQgKHgrNCk7CisgIHJldHVybiAoKChpbnQ2NCl0b3ApPDwzMikgfCAoaW50NjQpYm90dG9tOworfQorCitFTkRJQU5fSU5MSU5FIHZvaWQKK3dyaXRlX3dvcmQgKGFkZHIsIGRhdGEpCisgICAgIHVpbnQ4ICphZGRyOworICAgICB1aW50MTYgZGF0YTsKK3sKKyNpZiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2k0ODZfXykgfHwgZGVmaW5lZChfX2k1ODZfXykgfHwgZGVmaW5lZChfX2k2ODZfXykpICYmIGRlZmluZWQoX19HTlVDX18pCisKKyAgX19hc21fXyAoInhjaGdiICViMCwlaDAiIDogIj1xIiAoZGF0YSkgOiAiMCIgKGRhdGEpKTsKKyAgKih1aW50MTYgKilhZGRyID0gZGF0YTsKKworI2VsaWYgZGVmaW5lZChXT1JEU19CSUdFTkRJQU4pCisgIC8qIEl0IGlzIHNhZmUgdG8gZG8gdGhpcyBvbiBiaWcgZW5kaWFuIGhvc3RzLCBzaW5jZSB0aGUgZDEwdiByZXF1aXJlcyB0aGF0IHdvcmRzIGJlCisgICAgIGFsaWduZWQgb24gMTYtYml0IGJvdW5kYXJpZXMuICAqLworICAqKHVpbnQxNiAqKWFkZHIgPSBkYXRhOworCisjZWxzZQorICBhZGRyWzBdID0gKGRhdGEgPj4gOCkgJiAweGZmOworICBhZGRyWzFdID0gZGF0YSAmIDB4ZmY7CisjZW5kaWYKK30KKworRU5ESUFOX0lOTElORSB2b2lkCit3cml0ZV9sb25nd29yZCAoYWRkciwgZGF0YSkKKyAgICAgdWludDggKmFkZHI7CisgICAgIHVpbnQzMiBkYXRhOworeworI2lmIChkZWZpbmVkKF9faTQ4Nl9fKSB8fCBkZWZpbmVkKF9faTU4Nl9fKSB8fCBkZWZpbmVkKF9faTY4Nl9fKSkgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChVU0VfQlNXQVApCisKKyAgX19hc21fXyAoImJzd2FwICUwIiA6ICI9ciIgKGRhdGEpIDogIjAiIChkYXRhKSk7CisgICoodWludDMyICopYWRkciA9IGRhdGE7CisKKyNlbGlmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9faTQ4Nl9fKSB8fCBkZWZpbmVkKF9faTU4Nl9fKSB8fCBkZWZpbmVkKF9faTY4Nl9fKSkgJiYgZGVmaW5lZChfX0dOVUNfXykKKworICBfX2FzbV9fKCJ4Y2hnYiAlYjAsJWgwXG5cdCIJCS8qIHN3YXAgbG93ZXIgYnl0ZXMJKi8KKwkgICJyb3JsICQxNiwlMFxuXHQiCQkvKiBzd2FwIHdvcmRzCQkqLworCSAgInhjaGdiICViMCwlaDAiCQkvKiBzd2FwIGhpZ2hlciBieXRlcwkqLworCSAgOiI9cSIgKGRhdGEpCisJICA6ICIwIiAoZGF0YSkpOworCisgICoodWludDMyICopYWRkciA9IGRhdGE7CisKKyNlbGlmIChkZWZpbmVkKF9QT1dFUikgJiYgZGVmaW5lZChfQUlYKSkgfHwgKGRlZmluZWQoX19QUENfXykgJiYgZGVmaW5lZChfX0JJR19FTkRJQU5fXykpCisgIC8qIFBvd2VyICYgUG93ZXJQQyBjb21wdXRlcnMgaW4gYmlnIGVuZGlhbiBtb2RlIGNhbiBoYW5kbGUgdW5hbGlnbmVkIGxvYWRzJnN0b3JlcyAqLworICAqKHVpbnQzMiAqKWFkZHIgPSBkYXRhOworCisjZWxpZiBkZWZpbmVkKFdPUkRTX0JJR0VORElBTikKKyAgKih1aW50MTYgKilhZGRyID0gKHVpbnQxNikoZGF0YSA+PiAxNik7CisgICoodWludDE2ICopKGFkZHIgKyAyKSA9ICh1aW50MTYpZGF0YTsKKworI2Vsc2UKKyAgYWRkclswXSA9IChkYXRhID4+IDI0KSAmIDB4ZmY7CisgIGFkZHJbMV0gPSAoZGF0YSA+PiAxNikgJiAweGZmOworICBhZGRyWzJdID0gKGRhdGEgPj4gOCkgJiAweGZmOworICBhZGRyWzNdID0gZGF0YSAmIDB4ZmY7CisjZW5kaWYKK30KKworRU5ESUFOX0lOTElORSB2b2lkCit3cml0ZV9sb25nbG9uZyAoYWRkciwgZGF0YSkKKyAgICAgdWludDggKmFkZHI7CisgICAgIGludDY0IGRhdGE7Cit7CisgIHdyaXRlX2xvbmd3b3JkIChhZGRyLCAodWludDMyKShkYXRhID4+IDMyKSk7CisgIHdyaXRlX2xvbmd3b3JkIChhZGRyKzQsICh1aW50MzIpZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9zaW0vZDEwdi9nZW5jb2RlLmMgYi9zaW0vZDEwdi9nZW5jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxMjY5YgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9kMTB2L2dlbmNvZGUuYwpAQCAtMCwwICsxLDE1NiBAQAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAib3Bjb2RlL2QxMHYuaCIKKworc3RhdGljIHZvaWQgd3JpdGVfaGVhZGVyIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHdyaXRlX29wY29kZXMgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgd3JpdGVfdGVtcGxhdGUgUEFSQU1TICgodm9pZCkpOworCitpbnQKK21haW4gKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICphcmd2W107Cit7CisgIGlmICgoYXJnYyA+IDEpICYmIChzdHJjbXAgKGFyZ3ZbMV0sIi1oIikgPT0gMCkpCisgICAgd3JpdGVfaGVhZGVyKCk7CisgIGVsc2UgaWYgKChhcmdjID4gMSkgJiYgKHN0cmNtcCAoYXJndlsxXSwiLXQiKSA9PSAwKSkKKyAgICB3cml0ZV90ZW1wbGF0ZSAoKTsKKyAgZWxzZQorICAgIHdyaXRlX29wY29kZXMoKTsKKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQKK3dyaXRlX2hlYWRlciAoKQoreworICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTsKKworICBmb3IgKG9wY29kZSA9IChzdHJ1Y3QgZDEwdl9vcGNvZGUgKilkMTB2X29wY29kZXM7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCisgICAgaWYgKG9wY29kZS0+Zm9ybWF0ICE9IE9QQ09ERV9GQUtFKQorICAgICAgcHJpbnRmKCJ2b2lkIE9QXyVYIFBBUkFNUyAoKHZvaWQpKTtcdFx0LyogJXMgKi9cbiIsb3Bjb2RlLT5vcGNvZGUsIG9wY29kZS0+bmFtZSk7Cit9CisKKworLyogd3JpdGVfdGVtcGxhdGUgY3JlYXRlcyBhIGZpbGUgYWxsIHJlcXVpcmVkIGZ1bmN0aW9ucywgcmVhZHkgKi8KKy8qIHRvIGJlIGZpbGxlZCBvdXQgKi8KKworc3RhdGljIHZvaWQKK3dyaXRlX3RlbXBsYXRlICgpCit7CisgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlOworICBpbnQgaSxqOworCisgIHByaW50ZiAoIiNpbmNsdWRlIFwiZDEwdl9zaW0uaFwiXG4iKTsKKyAgcHJpbnRmICgiI2luY2x1ZGUgXCJzaW1vcHMuaFwiXG4iKTsKKworICBmb3IgKG9wY29kZSA9IChzdHJ1Y3QgZDEwdl9vcGNvZGUgKilkMTB2X29wY29kZXM7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCisgICAgeworICAgICAgaWYgKG9wY29kZS0+Zm9ybWF0ICE9IE9QQ09ERV9GQUtFKQorCXsKKwkgIHByaW50ZigiLyogJXMgKi9cbnZvaWRcbk9QXyVYICgpXG57XG4iLG9wY29kZS0+bmFtZSxvcGNvZGUtPm9wY29kZSk7CisJICAKKwkgIC8qIGNvdW50IG9wZXJhbmRzICovCisJICBqID0gMDsKKwkgIGZvciAoaT0wO2k8NjtpKyspCisJICAgIHsKKwkgICAgICBpbnQgZmxhZ3MgPSBkMTB2X29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzOworCSAgICAgIGlmICgoZmxhZ3MgJiBPUEVSQU5EX1JFRykgfHwgKGZsYWdzICYgT1BFUkFORF9OVU0pIHx8IChmbGFncyAmIE9QRVJBTkRfQUREUikpCisJCWorKzsKKwkgICAgfQorCSAgc3dpdGNoIChqKQorCSAgICB7CisJICAgIGNhc2UgMDoKKwkgICAgICBwcmludGYgKCJwcmludGYoXCIgICAlc1xcblwiKTtcbiIsb3Bjb2RlLT5uYW1lKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAxOgorCSAgICAgIHByaW50ZiAoInByaW50ZihcIiAgICVzXFx0JSV4XFxuXCIsT1BbMF0pO1xuIixvcGNvZGUtPm5hbWUpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIDI6CisJICAgICAgcHJpbnRmICgicHJpbnRmKFwiICAgJXNcXHQlJXgsJSV4XFxuXCIsT1BbMF0sT1BbMV0pO1xuIixvcGNvZGUtPm5hbWUpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIDM6CisJICAgICAgcHJpbnRmICgicHJpbnRmKFwiICAgJXNcXHQlJXgsJSV4LCUleFxcblwiLE9QWzBdLE9QWzFdLE9QWzJdKTtcbiIsb3Bjb2RlLT5uYW1lKTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsIlRvbyBtYW55IG9wZXJhbmRzOiAlZFxuIixqKTsKKwkgICAgfQorCSAgcHJpbnRmICgifVxuXG4iKTsKKwl9CisgICAgfQorfQorCisKK2xvbmcgT3Bjb2Rlc1s1MTJdOworc3RhdGljIGludCBjdXJvcD0wOworCitjaGVja19vcGNvZGVzKCBsb25nIG9wKQoreworICBpbnQgaTsKKworICBmb3IgKGk9MDtpPGN1cm9wO2krKykKKyAgICBpZiAoT3Bjb2Rlc1tpXSA9PSBvcCkKKyAgICAgIGZwcmludGYoc3RkZXJyLCJEVVBMSUNBVEUgT1BDT0RFUzogJXhcbiIsb3ApOworfQorCisKK3N0YXRpYyB2b2lkCit3cml0ZV9vcGNvZGVzICgpCit7CisgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlOworICBpbnQgaSwgajsKKyAgCisgIC8qIHdyaXRlIG91dCBvcGNvZGUgdGFibGUgKi8KKyAgcHJpbnRmICgiI2luY2x1ZGUgXCJkMTB2X3NpbS5oXCJcbiIpOworICBwcmludGYgKCIjaW5jbHVkZSBcInNpbW9wcy5oXCJcblxuIik7CisgIHByaW50ZiAoInN0cnVjdCBzaW1vcHMgU2ltb3BzW10gPSB7XG4iKTsKKyAgCisgIGZvciAob3Bjb2RlID0gKHN0cnVjdCBkMTB2X29wY29kZSAqKWQxMHZfb3Bjb2Rlczsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKKyAgICB7CisgICAgICBpZiAob3Bjb2RlLT5mb3JtYXQgIT0gT1BDT0RFX0ZBS0UpCisJeworCSAgcHJpbnRmICgiICB7ICVsZCwlZCwlbGQsJWQsJWQsJWQsJWQsT1BfJVgsIiwgb3Bjb2RlLT5vcGNvZGUsIAorCQkgIChvcGNvZGUtPmZvcm1hdCAmIExPTkdfT1BDT0RFKSA/IDEgOiAwLCBvcGNvZGUtPm1hc2ssIG9wY29kZS0+Zm9ybWF0LCAKKwkJICBvcGNvZGUtPmN5Y2xlcywgb3Bjb2RlLT51bml0LCBvcGNvZGUtPmV4ZWNfdHlwZSwgb3Bjb2RlLT5vcGNvZGUpOworICAgICAgCisJICAvKiBSRU1PVkUgTUUgKi8KKwkgIGNoZWNrX29wY29kZXMgKG9wY29kZS0+b3Bjb2RlKTsKKwkgIE9wY29kZXNbY3Vyb3ArK10gPSBvcGNvZGUtPm9wY29kZTsKKworCSAgaiA9IDA7CisJICBmb3IgKGk9MDtpPDY7aSsrKQorCSAgICB7CisJICAgICAgaW50IGZsYWdzID0gZDEwdl9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKKwkgICAgICBpZiAoKGZsYWdzICYgT1BFUkFORF9SRUcpIHx8IChmbGFncyAmIE9QRVJBTkRfTlVNKSB8fCAoZmxhZ3MgJiBPUEVSQU5EX0FERFIpKQorCQlqKys7CisJICAgIH0KKwkgIHByaW50ZiAoIiVkLCIsaik7CisJICAKKwkgIGogPSAwOworCSAgZm9yIChpPTA7aTw2O2krKykKKwkgICAgeworCSAgICAgIGludCBmbGFncyA9IGQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3M7CisJICAgICAgaW50IHNoaWZ0ID0gZDEwdl9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5zaGlmdDsKKwkgICAgICBpZiAoKGZsYWdzICYgT1BFUkFORF9SRUcpIHx8IChmbGFncyAmIE9QRVJBTkRfTlVNKXx8IChmbGFncyAmIE9QRVJBTkRfQUREUikpCisJCXsKKwkJICBpZiAoaiA9PSAwKQorCQkgICAgcHJpbnRmICgieyIpOworCQkgIGVsc2UKKwkJICAgIHByaW50ZiAoIiwgIik7CisJCSAgaWYgKChmbGFncyAmIE9QRVJBTkRfUkVHKSAmJiAob3Bjb2RlLT5mb3JtYXQgPT0gTE9OR19MKSkKKwkJICAgIHNoaWZ0ICs9IDE1OworCQkgIHByaW50ZiAoIiVkLCVkLCVkIixzaGlmdCxkMTB2X29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmJpdHMsZmxhZ3MpOworCQkgIGogPSAxOworCQl9CisJICAgIH0KKwkgIGlmIChqKQorCSAgICBwcmludGYgKCJ9Iik7CisJICBwcmludGYgKCJ9LFxuIik7CisJfQorICAgIH0KKyAgcHJpbnRmICgieyAwLDAsMCwwLDAsMCwwLCh2b2lkICgqKSh2b2lkKSkwLDAsezAsMCwwfX0sXG59O1xuIik7Cit9CmRpZmYgLS1naXQgYS9zaW0vZDEwdi9pbnRlcnAuYyBiL3NpbS9kMTB2L2ludGVycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3Yzk2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZDEwdi9pbnRlcnAuYwpAQCAtMCwwICsxLDEwODYgQEAKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIKKworI2luY2x1ZGUgImQxMHZfc2ltLmgiCisKKyNkZWZpbmUgSU1FTV9TSVpFIDE4CQkvKiBEMTBWIGluc3RydWN0aW9uIG1lbW9yeSBzaXplIGlzIDE4IGJpdHMgKi8KKyNkZWZpbmUgRE1FTV9TSVpFIDE2CQkvKiBEYXRhIG1lbW9yeSBpcyA2NEsgKGJ1dCBvbmx5IDMySyBpbnRlcm5hbCBSQU0pICovCisjZGVmaW5lIFVNRU1fU0laRSAxNwkJLyogRWFjaCB1bmlmaWVkIG1lbW9yeSBzZWdtZW50IGlzIDE3IGJpdHMgKi8KKyNkZWZpbmUgVU1FTV9TRUdNRU5UUyAxMjgJLyogTnVtYmVyIG9mIHNlZ21lbnRzIGluIHVuaWZpZWQgbWVtb3J5IHJlZ2lvbiAqLworCitlbnVtIF9sZWZ0cmlnaHQgeyBMRUZUX0ZJUlNULCBSSUdIVF9GSVJTVCB9OworCitzdGF0aWMgY2hhciAqbXluYW1lOworc3RhdGljIFNJTV9PUEVOX0tJTkQgc2ltX2tpbmQ7CitpbnQgZDEwdl9kZWJ1ZzsKK2hvc3RfY2FsbGJhY2sgKmQxMHZfY2FsbGJhY2s7Cit1bnNpZ25lZCBsb25nIGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19NQVggXTsKKwordWludDE2IE9QWzRdOworCitzdGF0aWMgaW50IGluaXRfdGV4dF9wID0gMDsKKy8qIG5vbi16ZXJvIGlmIHdlIG9wZW5lZCBwcm9nX2JmZCAqLworc3RhdGljIGludCBwcm9nX2JmZF93YXNfb3BlbmVkX3A7CitiZmQgKnByb2dfYmZkOworYXNlY3Rpb24gKnRleHQ7CitiZmRfdm1hIHRleHRfc3RhcnQ7CitiZmRfdm1hIHRleHRfZW5kOworCitzdGF0aWMgbG9uZyBoYXNoIFBBUkFNUyAoKGxvbmcgaW5zbiwgaW50IGZvcm1hdCkpOworc3RhdGljIHN0cnVjdCBoYXNoX2VudHJ5ICpsb29rdXBfaGFzaCBQQVJBTVMgKCh1aW50MzIgaW5zLCBpbnQgc2l6ZSkpOworc3RhdGljIHZvaWQgZ2V0X29wZXJhbmRzIFBBUkFNUyAoKHN0cnVjdCBzaW1vcHMgKnMsIHVpbnQzMiBpbnMpKTsKK3N0YXRpYyB2b2lkIGRvX2xvbmcgUEFSQU1TICgodWludDMyIGlucykpOworc3RhdGljIHZvaWQgZG9fMl9zaG9ydCBQQVJBTVMgKCh1aW50MTYgaW5zMSwgdWludDE2IGluczIsIGVudW0gX2xlZnRyaWdodCBsZWZ0cmlnaHQpKTsKK3N0YXRpYyB2b2lkIGRvX3BhcmFsbGVsIFBBUkFNUyAoKHVpbnQxNiBpbnMxLCB1aW50MTYgaW5zMikpOworc3RhdGljIGNoYXIgKmFkZF9jb21tYXMgUEFSQU1TICgoY2hhciAqYnVmLCBpbnQgc2l6ZW9mX2J1ZiwgdW5zaWduZWQgbG9uZyB2YWx1ZSkpOworZXh0ZXJuIHZvaWQgc2ltX3NldF9wcm9maWxlIFBBUkFNUyAoKGludCBuKSk7CitleHRlcm4gdm9pZCBzaW1fc2V0X3Byb2ZpbGVfc2l6ZSBQQVJBTVMgKChpbnQgbikpOworCisjaWZuZGVmIElOTElORQorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19PUFRJTUlaRV9fKQorI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXworI2Vsc2UKKyNkZWZpbmUgSU5MSU5FCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9IQVNIICA2Mworc3RydWN0IGhhc2hfZW50cnkKK3sKKyAgc3RydWN0IGhhc2hfZW50cnkgKm5leHQ7CisgIHVpbnQzMiBvcGNvZGU7CisgIHVpbnQzMiBtYXNrOworICBpbnQgc2l6ZTsKKyAgc3RydWN0IHNpbW9wcyAqb3BzOworfTsKKworc3RydWN0IGhhc2hfZW50cnkgaGFzaF90YWJsZVtNQVhfSEFTSCsxXTsKKworSU5MSU5FIHN0YXRpYyBsb25nIAoraGFzaChpbnNuLCBmb3JtYXQpCisgICAgIGxvbmcgaW5zbjsKKyAgICAgaW50IGZvcm1hdDsKK3sKKyAgaWYgKGZvcm1hdCAmIExPTkdfT1BDT0RFKQorICAgIHJldHVybiAoKGluc24gJiAweDNGMDAwMDAwKSA+PiAyNCk7CisgIGVsc2UKKyAgICByZXR1cm4oKGluc24gJiAweDdFMDApID4+IDkpOworfQorCitJTkxJTkUgc3RhdGljIHN0cnVjdCBoYXNoX2VudHJ5ICoKK2xvb2t1cF9oYXNoIChpbnMsIHNpemUpCisgICAgIHVpbnQzMiBpbnM7CisgICAgIGludCBzaXplOworeworICBzdHJ1Y3QgaGFzaF9lbnRyeSAqaDsKKworICBpZiAoc2l6ZSkKKyAgICBoID0gJmhhc2hfdGFibGVbKGlucyAmIDB4M0YwMDAwMDApID4+IDI0XTsKKyAgZWxzZQorICAgIGggPSAmaGFzaF90YWJsZVsoaW5zICYgMHg3RTAwKSA+PiA5XTsKKworICB3aGlsZSAoKGlucyAmIGgtPm1hc2spICE9IGgtPm9wY29kZSB8fCBoLT5zaXplICE9IHNpemUpCisgICAgeworICAgICAgaWYgKGgtPm5leHQgPT0gTlVMTCkKKwl7CisJICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJFUlJPUiBsb29raW5nIHVwIGhhc2ggZm9yICV4IGF0IFBDICV4XG4iLGlucywgUEMpOworCSAgZXhpdCAoMSk7CisJfQorICAgICAgaCA9IGgtPm5leHQ7CisgICAgfQorICByZXR1cm4gKGgpOworfQorCitJTkxJTkUgc3RhdGljIHZvaWQKK2dldF9vcGVyYW5kcyAoc3RydWN0IHNpbW9wcyAqcywgdWludDMyIGlucykKK3sKKyAgaW50IGksIHNoaWZ0LCBiaXRzLCBmbGFnczsKKyAgdWludDMyIG1hc2s7CisgIGZvciAoaT0wOyBpIDwgcy0+bnVtb3BzOyBpKyspCisgICAgeworICAgICAgc2hpZnQgPSBzLT5vcGVyYW5kc1szKmldOworICAgICAgYml0cyA9IHMtPm9wZXJhbmRzWzMqaSsxXTsKKyAgICAgIGZsYWdzID0gcy0+b3BlcmFuZHNbMyppKzJdOworICAgICAgbWFzayA9IDB4N0ZGRkZGRkYgPj4gKDMxIC0gYml0cyk7CisgICAgICBPUFtpXSA9IChpbnMgPj4gc2hpZnQpICYgbWFzazsKKyAgICB9CisgIC8qIEZJWE1FOiBmb3IgdHJhY2luZywgdXBkYXRlIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZCBlYWNoCisgICAgIGluc3RydWN0aW9uIGRlY29kZSBjeWNsZSAqLworICBTdGF0ZS50cmFjZS5wc3cgPSBQU1c7Cit9CisKK2JmZF92bWEKK2RlY29kZV9wYyAoKQoreworICBhc2VjdGlvbiAqczsKKyAgaWYgKCFpbml0X3RleHRfcCAmJiBwcm9nX2JmZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGluaXRfdGV4dF9wID0gMTsKKyAgICAgIGZvciAocyA9IHByb2dfYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCisJaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKHByb2dfYmZkLCBzKSwgIi50ZXh0IikgPT0gMCkKKwkgIHsKKwkgICAgdGV4dCA9IHM7CisJICAgIHRleHRfc3RhcnQgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChwcm9nX2JmZCwgcyk7CisJICAgIHRleHRfZW5kID0gdGV4dF9zdGFydCArIGJmZF9zZWN0aW9uX3NpemUgKHByb2dfYmZkLCBzKTsKKwkgICAgYnJlYWs7CisJICB9CisgICAgfQorCisgIHJldHVybiAoUEMgPDwgMikgKyB0ZXh0X3N0YXJ0OworfQorCitzdGF0aWMgdm9pZAorZG9fbG9uZyAoaW5zKQorICAgICB1aW50MzIgaW5zOworeworICBzdHJ1Y3QgaGFzaF9lbnRyeSAqaDsKKyNpZmRlZiBERUJVRworICBpZiAoKGQxMHZfZGVidWcgJiBERUJVR19JTlNUUlVDVElPTikgIT0gMCkKKyAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJkb19sb25nIDB4JXhcbiIsIGlucyk7CisjZW5kaWYKKyAgaCA9IGxvb2t1cF9oYXNoIChpbnMsIDEpOworICBnZXRfb3BlcmFuZHMgKGgtPm9wcywgaW5zKTsKKyAgU3RhdGUuaW5zX3R5cGUgPSBJTlNfTE9ORzsKKyAgaW5zX3R5cGVfY291bnRlcnNbIChpbnQpU3RhdGUuaW5zX3R5cGUgXSsrOworICAoaC0+b3BzLT5mdW5jKSgpOworfQorCitzdGF0aWMgdm9pZAorZG9fMl9zaG9ydCAoaW5zMSwgaW5zMiwgbGVmdHJpZ2h0KQorICAgICB1aW50MTYgaW5zMSwgaW5zMjsKKyAgICAgZW51bSBfbGVmdHJpZ2h0IGxlZnRyaWdodDsKK3sKKyAgc3RydWN0IGhhc2hfZW50cnkgKmg7CisgIGVudW0gX2luc190eXBlIGZpcnN0LCBzZWNvbmQ7CisKKyNpZmRlZiBERUJVRworICBpZiAoKGQxMHZfZGVidWcgJiBERUJVR19JTlNUUlVDVElPTikgIT0gMCkKKyAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJkb18yX3Nob3J0IDB4JXggKCVzKSAtPiAweCV4XG4iLAorCQkJCSAgICAgICBpbnMxLCAobGVmdHJpZ2h0KSA/ICJsZWZ0IiA6ICJyaWdodCIsIGluczIpOworI2VuZGlmCisKKyAgaWYgKGxlZnRyaWdodCA9PSBMRUZUX0ZJUlNUKQorICAgIHsKKyAgICAgIGZpcnN0ID0gSU5TX0xFRlQ7CisgICAgICBzZWNvbmQgPSBJTlNfUklHSFQ7CisgICAgICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfTEVGVFJJR0hUIF0rKzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmaXJzdCA9IElOU19SSUdIVDsKKyAgICAgIHNlY29uZCA9IElOU19MRUZUOworICAgICAgaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX1JJR0hUTEVGVCBdKys7CisgICAgfQorCisgIC8qIElzc3VlIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiAqLworICBoID0gbG9va3VwX2hhc2ggKGluczEsIDApOworICBnZXRfb3BlcmFuZHMgKGgtPm9wcywgaW5zMSk7CisgIFN0YXRlLmluc190eXBlID0gZmlyc3Q7CisgIGluc190eXBlX2NvdW50ZXJzWyAoaW50KVN0YXRlLmluc190eXBlIF0rKzsKKyAgKGgtPm9wcy0+ZnVuYykoKTsKKworICAvKiBJc3N1ZSB0aGUgc2Vjb25kIGluc3RydWN0aW9uIChpZiB0aGUgUEMgaGFzbid0IGNoYW5nZWQpICovCisgIGlmICghU3RhdGUucGNfY2hhbmdlZCAmJiAhU3RhdGUuZXhjZXB0aW9uKQorICAgIHsKKyAgICAgIC8qIGZpbmlzaCBhbnkgZXhpc3RpbmcgaW5zdHJ1Y3Rpb25zICovCisgICAgICBTTE9UX0ZMVVNIICgpOworICAgICAgaCA9IGxvb2t1cF9oYXNoIChpbnMyLCAwKTsKKyAgICAgIGdldF9vcGVyYW5kcyAoaC0+b3BzLCBpbnMyKTsKKyAgICAgIFN0YXRlLmluc190eXBlID0gc2Vjb25kOworICAgICAgaW5zX3R5cGVfY291bnRlcnNbIChpbnQpU3RhdGUuaW5zX3R5cGUgXSsrOworICAgICAgaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX0NZQ0xFUyBdKys7CisgICAgICAoaC0+b3BzLT5mdW5jKSgpOworICAgIH0KKyAgZWxzZSBpZiAoIVN0YXRlLmV4Y2VwdGlvbikKKyAgICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfQ09ORF9KVU1QIF0rKzsKK30KKworc3RhdGljIHZvaWQKK2RvX3BhcmFsbGVsIChpbnMxLCBpbnMyKQorICAgICB1aW50MTYgaW5zMSwgaW5zMjsKK3sKKyAgc3RydWN0IGhhc2hfZW50cnkgKmgxLCAqaDI7CisjaWZkZWYgREVCVUcKKyAgaWYgKChkMTB2X2RlYnVnICYgREVCVUdfSU5TVFJVQ1RJT04pICE9IDApCisgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiZG9fcGFyYWxsZWwgMHgleCB8fCAweCV4XG4iLCBpbnMxLCBpbnMyKTsKKyNlbmRpZgorICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfUEFSQUxMRUwgXSsrOworICBoMSA9IGxvb2t1cF9oYXNoIChpbnMxLCAwKTsKKyAgaDIgPSBsb29rdXBfaGFzaCAoaW5zMiwgMCk7CisKKyAgaWYgKGgxLT5vcHMtPmV4ZWNfdHlwZSA9PSBQQVJPTkxZKQorICAgIHsKKyAgICAgIGdldF9vcGVyYW5kcyAoaDEtPm9wcywgaW5zMSk7CisgICAgICBTdGF0ZS5pbnNfdHlwZSA9IElOU19MRUZUX0NPTkRfVEVTVDsKKyAgICAgIGluc190eXBlX2NvdW50ZXJzWyAoaW50KVN0YXRlLmluc190eXBlIF0rKzsKKyAgICAgIChoMS0+b3BzLT5mdW5jKSgpOworICAgICAgaWYgKFN0YXRlLmV4ZSkKKwl7CisJICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfQ09ORF9UUlVFIF0rKzsKKwkgIGdldF9vcGVyYW5kcyAoaDItPm9wcywgaW5zMik7CisJICBTdGF0ZS5pbnNfdHlwZSA9IElOU19SSUdIVF9DT05EX0VYRTsKKwkgIGluc190eXBlX2NvdW50ZXJzWyAoaW50KVN0YXRlLmluc190eXBlIF0rKzsKKwkgIChoMi0+b3BzLT5mdW5jKSgpOworCX0KKyAgICAgIGVsc2UKKwlpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfQ09ORF9GQUxTRSBdKys7CisgICAgfQorICBlbHNlIGlmIChoMi0+b3BzLT5leGVjX3R5cGUgPT0gUEFST05MWSkKKyAgICB7CisgICAgICBnZXRfb3BlcmFuZHMgKGgyLT5vcHMsIGluczIpOworICAgICAgU3RhdGUuaW5zX3R5cGUgPSBJTlNfUklHSFRfQ09ORF9URVNUOworICAgICAgaW5zX3R5cGVfY291bnRlcnNbIChpbnQpU3RhdGUuaW5zX3R5cGUgXSsrOworICAgICAgKGgyLT5vcHMtPmZ1bmMpKCk7CisgICAgICBpZiAoU3RhdGUuZXhlKQorCXsKKwkgIGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19DT05EX1RSVUUgXSsrOworCSAgZ2V0X29wZXJhbmRzIChoMS0+b3BzLCBpbnMxKTsKKwkgIFN0YXRlLmluc190eXBlID0gSU5TX0xFRlRfQ09ORF9FWEU7CisJICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClTdGF0ZS5pbnNfdHlwZSBdKys7CisJICAoaDEtPm9wcy0+ZnVuYykoKTsKKwl9CisgICAgICBlbHNlCisJaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX0NPTkRfRkFMU0UgXSsrOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGdldF9vcGVyYW5kcyAoaDEtPm9wcywgaW5zMSk7CisgICAgICBTdGF0ZS5pbnNfdHlwZSA9IElOU19MRUZUX1BBUkFMTEVMOworICAgICAgaW5zX3R5cGVfY291bnRlcnNbIChpbnQpU3RhdGUuaW5zX3R5cGUgXSsrOworICAgICAgKGgxLT5vcHMtPmZ1bmMpKCk7CisgICAgICBpZiAoIVN0YXRlLmV4Y2VwdGlvbikKKwl7CisJICBnZXRfb3BlcmFuZHMgKGgyLT5vcHMsIGluczIpOworCSAgU3RhdGUuaW5zX3R5cGUgPSBJTlNfUklHSFRfUEFSQUxMRUw7CisJICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClTdGF0ZS5pbnNfdHlwZSBdKys7CisJICAoaDItPm9wcy0+ZnVuYykoKTsKKwl9CisgICAgfQorfQorIAorc3RhdGljIGNoYXIgKgorYWRkX2NvbW1hcyhidWYsIHNpemVvZl9idWYsIHZhbHVlKQorICAgICBjaGFyICpidWY7CisgICAgIGludCBzaXplb2ZfYnVmOworICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOworeworICBpbnQgY29tbWEgPSAzOworICBjaGFyICplbmRidWYgPSBidWYgKyBzaXplb2ZfYnVmIC0gMTsKKworICAqLS1lbmRidWYgPSAnXDAnOworICBkbyB7CisgICAgaWYgKGNvbW1hLS0gPT0gMCkKKyAgICAgIHsKKwkqLS1lbmRidWYgPSAnLCc7CisJY29tbWEgPSAyOworICAgICAgfQorCisgICAgKi0tZW5kYnVmID0gKHZhbHVlICUgMTApICsgJzAnOworICB9IHdoaWxlICgodmFsdWUgLz0gMTApICE9IDApOworCisgIHJldHVybiBlbmRidWY7Cit9CisKK3ZvaWQKK3NpbV9zaXplIChwb3dlcikKKyAgICAgaW50IHBvd2VyOworCit7CisgIGludCBpOworCisgIGlmIChTdGF0ZS5pbWVtKQorICAgIHsKKyAgICAgIGZvciAoaT0wO2k8VU1FTV9TRUdNRU5UUztpKyspCisJeworCSAgaWYgKFN0YXRlLnVtZW1baV0pCisJICAgIHsKKwkgICAgICBmcmVlIChTdGF0ZS51bWVtW2ldKTsKKwkgICAgICBTdGF0ZS51bWVtW2ldID0gTlVMTDsKKwkgICAgfQorCX0KKyAgICAgIGZyZWUgKFN0YXRlLmltZW0pOworICAgICAgZnJlZSAoU3RhdGUuZG1lbSk7CisgICAgfQorCisgIFN0YXRlLmltZW0gPSAodWludDggKiljYWxsb2MoMSwxPDxJTUVNX1NJWkUpOworICBTdGF0ZS5kbWVtID0gKHVpbnQ4ICopY2FsbG9jKDEsMTw8RE1FTV9TSVpFKTsKKyAgZm9yIChpPTE7aTwoVU1FTV9TRUdNRU5UUy0xKTtpKyspCisgICAgU3RhdGUudW1lbVtpXSA9IE5VTEw7CisgIFN0YXRlLnVtZW1bMF0gPSAodWludDggKiljYWxsb2MoMSwxPDxVTUVNX1NJWkUpOworICBTdGF0ZS51bWVtWzFdID0gKHVpbnQ4ICopY2FsbG9jKDEsMTw8VU1FTV9TSVpFKTsKKyAgU3RhdGUudW1lbVsyXSA9ICh1aW50OCAqKWNhbGxvYygxLDE8PFVNRU1fU0laRSk7CisgIFN0YXRlLnVtZW1bVU1FTV9TRUdNRU5UUy0xXSA9ICh1aW50OCAqKWNhbGxvYygxLDE8PFVNRU1fU0laRSk7CisgIGlmICghU3RhdGUuaW1lbSB8fCAhU3RhdGUuZG1lbSB8fCAhU3RhdGUudW1lbVswXSB8fCAhU3RhdGUudW1lbVsxXSB8fCAhU3RhdGUudW1lbVsyXSB8fCAhU3RhdGUudW1lbVtVTUVNX1NFR01FTlRTLTFdICkKKyAgICB7CisgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4iKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICAKKyNpZmRlZiBERUJVRworICBpZiAoKGQxMHZfZGVidWcgJiBERUJVR19NRU1TSVpFKSAhPSAwKQorICAgIHsKKyAgICAgIGNoYXIgYnVmZmVyWzIwXTsKKyAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywKKwkJCQkJICJBbGxvY2F0ZWQgJXMgYnl0ZXMgaW5zdHJ1Y3Rpb24gbWVtb3J5IGFuZFxuIiwKKwkJCQkJIGFkZF9jb21tYXMgKGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCAoMVVMPDxJTUVNX1NJWkUpKSk7CisKKyAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIiAgICAgICAgICAlcyBieXRlcyBkYXRhIG1lbW9yeS5cbiIsCisJCQkJCSBhZGRfY29tbWFzIChidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwgKDFVTDw8SU1FTV9TSVpFKSkpOworICAgIH0KKyNlbmRpZgorfQorCisvKiBUcmFuc2ZlciBkYXRhIHRvL2Zyb20gc2ltdWxhdGVkIG1lbW9yeS4gIFNpbmNlIGEgYnVnIGluIGVpdGhlciB0aGUKKyAgIHNpbXVsYXRlZCBwcm9ncmFtIG9yIGluIGdkYiBvciB0aGUgc2ltdWxhdG9yIGl0c2VsZiBtYXkgY2F1c2UgYQorICAgYm9ndXMgYWRkcmVzcyB0byBiZSBwYXNzZWQgaW4sIHdlIG5lZWQgdG8gZG8gc29tZSBzYW5pdHkgY2hlY2tpbmcKKyAgIG9uIGFkZHJlc3NlcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgd2l0aGluIGJvdW5kcy4gIFdoZW4gYW4gYWRkcmVzcworICAgZmFpbHMgdGhlIGJvdW5kcyBjaGVjaywgdHJlYXQgaXQgYXMgYSB6ZXJvIGxlbmd0aCByZWFkL3dyaXRlIHJhdGhlcgorICAgdGhhbiBhYm9ydGluZyB0aGUgZW50aXJlIHJ1bi4gKi8KKworc3RhdGljIGludAoreGZlcl9tZW0gKFNJTV9BRERSIGFkZHIsCisJICB1bnNpZ25lZCBjaGFyICpidWZmZXIsCisJICBpbnQgc2l6ZSwKKwkgIGludCB3cml0ZV9wKQoreworICB1bnNpZ25lZCBjaGFyICptZW1vcnk7CisgIGludCBzZWdtZW50ID0gKChhZGRyID4+IDI0KSAmIDB4ZmYpOworICBhZGRyID0gKGFkZHIgJiAweDAwZmZmZmZmKTsKKworI2lmZGVmIERFQlVHCisgIGlmICgoZDEwdl9kZWJ1ZyAmIERFQlVHX0lOU1RSVUNUSU9OKSAhPSAwKQorICAgIHsKKyAgICAgIGlmICh3cml0ZV9wKQorCXsKKwkgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgInNpbV93cml0ZSAlZCBieXRlcyB0byAweCUwMng6JTA2eFxuIiwgc2l6ZSwgc2VnbWVudCwgYWRkcik7CisJfQorICAgICAgZWxzZQorCXsKKwkgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgInNpbV9yZWFkICVkIGJ5dGVzIGZyb20gMHglMng6JTZ4XG4iLCBzaXplLCBzZWdtZW50LCBhZGRyKTsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgLyogdG8gYWNjZXNzIGRhdGEsIHdlIHVzZSB0aGUgZm9sbG93aW5nIG1hcHBpbmcgCisgICAgICAweDAweHh4eHh4OiBMb2dpY2FsIGRhdGEgYWRkcmVzcyBzZWdtZW50ICAgICAgICAoRE1BUCB0cmFuc2xhdGVkIG1lbW9yeSkKKyAgICAgIDB4MDF4eHh4eHg6IExvZ2ljYWwgaW5zdHJ1Y3Rpb24gYWRkcmVzcyBzZWdtZW50IChJTUFQIHRyYW5zbGF0ZWQgbWVtb3J5KQorICAgICAgMHgxMHh4eHh4eDogUGh5c2ljYWwgZGF0YSBtZW1vcnkgc2VnbWVudCAgICAgICAgKE9uLWNoaXAgZGF0YSBtZW1vcnkpCisgICAgICAweDExeHh4eHh4OiBQaHlzaWNhbCBpbnN0cnVjdGlvbiBtZW1vcnkgc2VnbWVudCAoT24tY2hpcCBpbnNuIG1lbW9yeSkKKyAgICAgIDB4MTJ4eHh4eHg6IFBoaXNpY2FsIHVuaWZpZWQgbWVtb3J5IHNlZ21lbnQgICAgIChVbmlmaWVkIG1lbW9yeSkKKyAgICovCisKKyAgc3dpdGNoIChzZWdtZW50KQorICAgIHsKKyAgICBjYXNlIDB4MDA6IC8qIERNQVAgdHJhbnNsYXRlZCBtZW1vcnkgKi8KKyAgICAgIHsKKwlpbnQgYnl0ZTsKKwlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgc2l6ZTsgYnl0ZSsrKQorCSAgeworCSAgICB1aW50OCAqbWVtID0gZG1lbV9hZGRyIChhZGRyICsgYnl0ZSk7CisJICAgIGlmIChtZW0gPT0gTlVMTCkKKwkgICAgICByZXR1cm4gYnl0ZTsKKwkgICAgZWxzZSBpZiAod3JpdGVfcCkKKwkgICAgICAqbWVtID0gYnVmZmVyW2J5dGVdOworCSAgICBlbHNlCisJICAgICAgYnVmZmVyW2J5dGVdID0gKm1lbTsKKwkgIH0KKwlyZXR1cm4gYnl0ZTsKKyAgICAgIH0KKworICAgIGNhc2UgMHgwMTogLyogSU1BUCB0cmFuc2xhdGVkIG1lbW9yeSAqLworICAgICAgeworCWludCBieXRlOworCWZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBzaXplOyBieXRlKyspCisJICB7CisJICAgIHVpbnQ4ICptZW0gPSBpbWVtX2FkZHIgKGFkZHIgKyBieXRlKTsKKwkgICAgaWYgKG1lbSA9PSBOVUxMKQorCSAgICAgIHJldHVybiBieXRlOworCSAgICBlbHNlIGlmICh3cml0ZV9wKQorCSAgICAgICptZW0gPSBidWZmZXJbYnl0ZV07CisJICAgIGVsc2UKKwkgICAgICBidWZmZXJbYnl0ZV0gPSAqbWVtOworCSAgfQorCXJldHVybiBieXRlOworICAgICAgfQorCisgICAgY2FzZSAweDEwOiAvKiBPbi1jaGlwIGRhdGEgbWVtb3J5ICovCisgICAgICB7CisJYWRkciAmPSAoKDEgPDwgRE1FTV9TSVpFKSAtIDEpOworCWlmICgoYWRkciArIHNpemUpID4gKDEgPDwgRE1FTV9TSVpFKSkKKwkgIHsKKwkgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiRVJST1I6IGRhdGEgYWRkcmVzcyAweCV4IGlzIG91dHNpZGUgcmFuZ2UgMC0weCV4LlxuIiwKKwkJCQkJICAgICAgIGFkZHIgKyBzaXplIC0gMSwgKDEgPDwgRE1FTV9TSVpFKSAtIDEpOworCSAgICByZXR1cm4gKDApOworCSAgfQorCW1lbW9yeSA9IFN0YXRlLmRtZW0gKyBhZGRyOworCWJyZWFrOworICAgICAgfQorCisgICAgY2FzZSAweDExOiAvKiBPbi1jaGlwIGluc24gbWVtb3J5ICovCisgICAgICB7CisJYWRkciAmPSAoKDEgPDwgSU1FTV9TSVpFKSAtIDEpOworCWlmICgoYWRkciArIHNpemUpID4gKDEgPDwgSU1FTV9TSVpFKSkKKwkgIHsKKwkgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiRVJST1I6IGluc3RydWN0aW9uIGFkZHJlc3MgMHgleCBpcyBvdXRzaWRlIHJhbmdlIDAtMHgleC5cbiIsCisJCQkJCSAgICAgICBhZGRyICsgc2l6ZSAtIDEsICgxIDw8IElNRU1fU0laRSkgLSAxKTsKKwkgICAgcmV0dXJuICgwKTsKKwkgIH0KKwltZW1vcnkgPSBTdGF0ZS5pbWVtICsgYWRkcjsKKwlicmVhazsKKyAgICAgIH0KKworICAgIGNhc2UgMHgxMjogLyogVW5pZmllZCBtZW1vcnkgKi8KKyAgICAgIHsKKwlpbnQgc3RhcnRzZWdtZW50LCBzdGFydG9mZnNldDsJLyogU2VnbWVudCBhbmQgb2Zmc2V0IHdpdGhpbiBzZWdtZW50IHdoZXJlIHhmZXIgc3RhcnRzICovCisJaW50IGVuZHNlZ21lbnQsIGVuZG9mZnNldDsJLyogU2VnbWVudCBhbmQgb2Zmc2V0IHdpdGhpbiBzZWdtZW50IHdoZXJlIHhmZXIgZW5kcyAqLworCQorCXN0YXJ0c2VnbWVudCA9IGFkZHIgPj4gVU1FTV9TSVpFOworCXN0YXJ0b2Zmc2V0ID0gYWRkciAmICgoMSA8PCBVTUVNX1NJWkUpIC0gMSk7CisJZW5kc2VnbWVudCA9IChhZGRyICsgc2l6ZSkgPj4gVU1FTV9TSVpFOworCWVuZG9mZnNldCA9IChhZGRyICsgc2l6ZSkgJiAoKDEgPDwgVU1FTV9TSVpFKSAtIDEpOworCQorCS8qIEZJWE1FOiBXZSBkbyBub3QgY3VycmVudGx5IGltcGxlbWVudCB4ZmVycyBhY3Jvc3Mgc2VnbWVudHMsCisgICAgICAgICAgIHNvIGRldGVjdCB0aGlzIGNhc2UgYW5kIGZhaWwgZ3JhY2VmdWxseS4gKi8KKwkKKwlpZiAoKHN0YXJ0c2VnbWVudCAhPSBlbmRzZWdtZW50KSAmJiAhKChlbmRzZWdtZW50ID09IChzdGFydHNlZ21lbnQgKyAxKSkgJiYgZW5kb2Zmc2V0ID09IDApKQorCSAgeworCSAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJFUlJPUjogVW5pbXBsZW1lbnRlZCBzdXBwb3J0IGZvciB0cmFuc2ZlcnMgYWNyb3NzIHVuaWZpZWQgbWVtb3J5IHNlZ21lbnQgYm91bmRhcmllc1xuIik7CisJICAgIHJldHVybiAoMCk7CisJICB9CisJaWYgKCFTdGF0ZS51bWVtW3N0YXJ0c2VnbWVudF0pCisJICB7CisjaWZkZWYgREVCVUcKKwkgICAgaWYgKChkMTB2X2RlYnVnICYgREVCVUdfTUVNU0laRSkgIT0gMCkKKwkgICAgICB7CisJCSgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywiQWxsb2NhdGluZyAlcyBieXRlcyB1bmlmaWVkIG1lbW9yeSB0byByZWdpb24gJWRcbiIsCisJCQkJCQkgICBhZGRfY29tbWFzIChidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwgKDFVTDw8SU1FTV9TSVpFKSksIHN0YXJ0c2VnbWVudCk7CisJICAgICAgfQorI2VuZGlmCisJICAgIFN0YXRlLnVtZW1bc3RhcnRzZWdtZW50XSA9ICh1aW50OCAqKWNhbGxvYygxLDE8PFVNRU1fU0laRSk7CisJICB9CisJaWYgKCFTdGF0ZS51bWVtW3N0YXJ0c2VnbWVudF0pCisJICB7CisJICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIkVSUk9SOiBNZW1vcnkgYWxsb2NhdGlvbiBvZiAweCV4IGJ5dGVzIGZhaWxlZC5cbiIsIDE8PFVNRU1fU0laRSk7CisJICAgIHJldHVybiAoMCk7CisJICB9CisJbWVtb3J5ID0gU3RhdGUudW1lbVtzdGFydHNlZ21lbnRdICsgc3RhcnRvZmZzZXQ7CisJYnJlYWs7CisgICAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgeworCSgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIkVSUk9SOiBhZGRyZXNzIDB4JWx4IGlzIG5vdCBpbiB2YWxpZCByYW5nZVxuIiwgKGxvbmcpIGFkZHIpOworIAkoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIweDAweHh4eHh4OiAgTG9naWNhbCBkYXRhIGFkZHJlc3Mgc2VnbWVudAkJKERNQVAgdHJhbnNsYXRlZCBtZW1vcnkpXG4iKTsKKyAJKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiMHgwMXh4eHh4eDogIExvZ2ljYWwgaW5zdHJ1Y3Rpb24gYWRkcmVzcyBzZWdtZW50CShJTUFQIHRyYW5zbGF0ZWQgbWVtb3J5KVxuIik7CisgCSgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIjB4MTB4eHh4eHg6ICBQaHlzaWNhbCBkYXRhIG1lbW9yeSBzZWdtZW50CQkoT24tY2hpcCBkYXRhIG1lbW9yeSlcbiIpOworIAkoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIweDExeHh4eHh4OiAgUGh5c2ljYWwgaW5zdHJ1Y3Rpb24gbWVtb3J5IHNlZ21lbnQJKE9uLWNoaXAgaW5zbiBtZW1vcnkpXG4iKTsKKyAJKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiMHgxMnh4eHh4eDogIFBoaXNpY2FsIHVuaWZpZWQgbWVtb3J5IHNlZ21lbnQJCShVbmlmaWVkIG1lbW9yeSlcbiIpOworCXJldHVybiAoMCk7CisgICAgICB9CisgICAgfQorCisgIGlmICh3cml0ZV9wKQorICAgIHsKKyAgICAgIG1lbWNweSAobWVtb3J5LCBidWZmZXIsIHNpemUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1lbWNweSAoYnVmZmVyLCBtZW1vcnksIHNpemUpOworICAgIH0KKworICByZXR1cm4gc2l6ZTsKK30KKworCitpbnQKK3NpbV93cml0ZSAoc2QsIGFkZHIsIGJ1ZmZlciwgc2l6ZSkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIFNJTV9BRERSIGFkZHI7CisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKyAgICAgaW50IHNpemU7Cit7CisgIC8qIEZJWE1FOiB0aGlzIHNob3VsZCBiZSBwZXJmb3JtaW5nIGEgdmlydHVhbCB0cmFuc2ZlciAqLworICByZXR1cm4geGZlcl9tZW0oIGFkZHIsIGJ1ZmZlciwgc2l6ZSwgMSk7Cit9CisKK2ludAorc2ltX3JlYWQgKHNkLCBhZGRyLCBidWZmZXIsIHNpemUpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBTSU1fQUREUiBhZGRyOworICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgICAgIGludCBzaXplOworeworICAvKiBGSVhNRTogdGhpcyBzaG91bGQgYmUgcGVyZm9ybWluZyBhIHZpcnR1YWwgdHJhbnNmZXIgKi8KKyAgcmV0dXJuIHhmZXJfbWVtKCBhZGRyLCBidWZmZXIsIHNpemUsIDApOworfQorCisKK1NJTV9ERVNDCitzaW1fb3BlbiAoa2luZCwgY2FsbGJhY2ssIGFiZmQsIGFyZ3YpCisgICAgIFNJTV9PUEVOX0tJTkQga2luZDsKKyAgICAgaG9zdF9jYWxsYmFjayAqY2FsbGJhY2s7CisgICAgIHN0cnVjdCBfYmZkICphYmZkOworICAgICBjaGFyICoqYXJndjsKK3sKKyAgc3RydWN0IHNpbW9wcyAqczsKKyAgc3RydWN0IGhhc2hfZW50cnkgKmg7CisgIHN0YXRpYyBpbnQgaW5pdF9wID0gMDsKKyAgY2hhciAqKnA7CisKKyAgc2ltX2tpbmQgPSBraW5kOworICBkMTB2X2NhbGxiYWNrID0gY2FsbGJhY2s7CisgIG15bmFtZSA9IGFyZ3ZbMF07CisKKyAgZm9yIChwID0gYXJndiArIDE7ICpwOyArK3ApCisgICAgeworI2lmZGVmIERFQlVHCisgICAgICBpZiAoc3RyY21wICgqcCwgIi10IikgPT0gMCkKKwlkMTB2X2RlYnVnID0gREVCVUc7CisgICAgICBlbHNlCisjZW5kaWYKKwkoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJFUlJPUjogdW5zdXBwb3J0ZWQgb3B0aW9uKHMpOiAlc1xuIiwqcCk7CisgICAgfQorICAKKyAgLyogcHV0IGFsbCB0aGUgb3Bjb2RlcyBpbiB0aGUgaGFzaCB0YWJsZSAqLworICBpZiAoIWluaXRfcCsrKQorICAgIHsKKyAgICAgIGZvciAocyA9IFNpbW9wczsgcy0+ZnVuYzsgcysrKQorCXsKKwkgIGggPSAmaGFzaF90YWJsZVtoYXNoKHMtPm9wY29kZSxzLT5mb3JtYXQpXTsKKyAgICAgIAorCSAgLyogZ28gdG8gdGhlIGxhc3QgZW50cnkgaW4gdGhlIGNoYWluICovCisJICB3aGlsZSAoaC0+bmV4dCkKKwkgICAgaCA9IGgtPm5leHQ7CisKKwkgIGlmIChoLT5vcHMpCisJICAgIHsKKwkgICAgICBoLT5uZXh0ID0gKHN0cnVjdCBoYXNoX2VudHJ5ICopIGNhbGxvYygxLHNpemVvZihzdHJ1Y3QgaGFzaF9lbnRyeSkpOworCSAgICAgIGlmICghaC0+bmV4dCkKKwkJcGVycm9yICgibWFsbG9jIGZhaWx1cmUiKTsKKworCSAgICAgIGggPSBoLT5uZXh0OworCSAgICB9CisJICBoLT5vcHMgPSBzOworCSAgaC0+bWFzayA9IHMtPm1hc2s7CisJICBoLT5vcGNvZGUgPSBzLT5vcGNvZGU7CisJICBoLT5zaXplID0gcy0+aXNfbG9uZzsKKwl9CisgICAgfQorCisgIC8qIHJlc2V0IHRoZSBwcm9jZXNzb3Igc3RhdGUgKi8KKyAgaWYgKCFTdGF0ZS5pbWVtKQorICAgIHNpbV9zaXplKDEpOworICBzaW1fY3JlYXRlX2luZmVyaW9yICgoU0lNX0RFU0MpIDEsIE5VTEwsIE5VTEwsIE5VTEwpOworCisgIC8qIEZ1ZGdlIG91ciBkZXNjcmlwdG9yLiAgKi8KKyAgcmV0dXJuIChTSU1fREVTQykgMTsKK30KKworCit2b2lkCitzaW1fY2xvc2UgKHNkLCBxdWl0dGluZykKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCBxdWl0dGluZzsKK3sKKyAgaWYgKHByb2dfYmZkICE9IE5VTEwgJiYgcHJvZ19iZmRfd2FzX29wZW5lZF9wKQorICAgIHsKKyAgICAgIGJmZF9jbG9zZSAocHJvZ19iZmQpOworICAgICAgcHJvZ19iZmQgPSBOVUxMOworICAgICAgcHJvZ19iZmRfd2FzX29wZW5lZF9wID0gMDsKKyAgICB9Cit9CisKK3ZvaWQKK3NpbV9zZXRfcHJvZmlsZSAobikKKyAgICAgaW50IG47Cit7CisgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgInNpbV9zZXRfcHJvZmlsZSAlZFxuIixuKTsKK30KKwordm9pZAorc2ltX3NldF9wcm9maWxlX3NpemUgKG4pCisgICAgIGludCBuOworeworICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJzaW1fc2V0X3Byb2ZpbGVfc2l6ZSAlZFxuIixuKTsKK30KKworCit1aW50OCAqCitkbWVtX2FkZHIoIGFkZHIgKQorICAgICB1aW50MzIgYWRkcjsKK3sKKyAgaW50IHNlZzsKKworICBhZGRyICY9IDB4ZmZmZjsKKworICBpZiAoYWRkciA+IDB4YmZmZikKKyAgICB7CisgICAgICBpZiAoIChhZGRyICYgMHhmZmYwKSAhPSAweGZmMDApCisJeworCSAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiRGF0YSBhZGRyZXNzIDB4JWx4IGlzIGluIEkvTyBzcGFjZSwgcGMgPSAweCVseC5cbiIsCisJCQkJCSAgICAgKGxvbmcpYWRkciwgKGxvbmcpZGVjb2RlX3BjICgpKTsKKwkgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR0JVUzsKKwl9CisKKyAgICAgIHJldHVybiBTdGF0ZS5kbWVtICsgYWRkcjsKKyAgICB9CisgIAorICBpZiAoYWRkciA+IDB4N2ZmZikKKyAgICB7CisgICAgICBpZiAoRE1BUCAmIDB4MTAwMCkKKwl7CisJICAvKiBpbnN0cnVjdGlvbiBtZW1vcnkgKi8KKyAJICByZXR1cm4gKERNQVAgJiAweGYpICogMHg0MDAwICsgU3RhdGUuaW1lbSArIChhZGRyIC0gMHg4MDAwKTsKKwl9CisgICAgICBlbHNlIAorCXsKKwkgIC8qIHVuaWZpZWQgbWVtb3J5ICovCisJICAvKiB0aGlzIGlzIHVnbHkgYmVjYXVzZSB3ZSBhbGxvY2F0ZSB1bmlmaWVkIG1lbW9yeSBpbiAxMjhLIHNlZ21lbnRzIGFuZCAqLworCSAgLyogZG1hcCBhZGRyZXNzZXMgMTZrIHNlZ21lbnRzICovCisJICBzZWcgPSAoRE1BUCAmIDB4M2ZmKSA+PiAzOworCSAgaWYgKFN0YXRlLnVtZW1bc2VnXSA9PSBOVUxMKQorCSAgICB7CisjaWZkZWYgREVCVUcKKwkgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssIkFsbG9jYXRpbmcgJWQgYnl0ZXMgdW5pZmllZCBtZW1vcnkgdG8gcmVnaW9uICVkXG4iLCAxPDxVTUVNX1NJWkUsIHNlZyk7CisjZW5kaWYKKwkgICAgICBTdGF0ZS51bWVtW3NlZ10gPSAodWludDggKiljYWxsb2MoMSwxPDxVTUVNX1NJWkUpOworCSAgICAgIGlmICghU3RhdGUudW1lbVtzZWddKQorCQl7CisJCSAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAKKwkJICAgICAgIkVSUk9SOiAgYWxsb2MgZmFpbGVkLiB1bmlmaWVkIG1lbW9yeSByZWdpb24gJWQgdW5tYXBwZWQsIHBjID0gMHglbHhcbiIsIAorCQkgICAgICBzZWcsIChsb25nKWRlY29kZV9wYyAoKSk7CisJCSAgU3RhdGUuZXhjZXB0aW9uID0gU0lHQlVTOworCQl9CisJICAgIH0KKwkgIHJldHVybiBTdGF0ZS51bWVtW3NlZ10gKyAoRE1BUCAmIDcpICogMHg0MDAwICsgKGFkZHIgLSAweDgwMDApOworCX0KKyAgICB9CisgIHJldHVybiBTdGF0ZS5kbWVtICsgYWRkcjsKK30KKworCit1aW50OCAqCitpbWVtX2FkZHIgKHVpbnQzMiBwYykKK3sKKyAgdWludDE2IGltYXA7CisKKyAgaWYgKHBjICYgMHgyMDAwMCkKKyAgICBpbWFwID0gSU1BUDE7CisgIGVsc2UKKyAgICBpbWFwID0gSU1BUDA7CisgIAorICBpZiAoaW1hcCAmIDB4MTAwMCkKKyAgICByZXR1cm4gU3RhdGUuaW1lbSArIHBjOworCisgIGlmIChTdGF0ZS51bWVtW2ltYXAgJiAweGZmXSA9PSBOVUxMKQorICAgIHJldHVybiAwOworCisgIC8qIERpc2NhcmQgdXBwZXIgYml0KHMpIG9mIFBDIGluIGNhc2UgSU1BUDEgc2VsZWN0cyB1bmlmaWVkIG1lbW9yeS4gKi8KKyAgcGMgJj0gKDEgPDwgVU1FTV9TSVpFKSAtIDE7CisKKyAgcmV0dXJuIFN0YXRlLnVtZW1baW1hcCAmIDB4ZmZdICsgcGM7Cit9CisKKworc3RhdGljIGludCBzdG9wX3NpbXVsYXRvciA9IDA7CisKK2ludAorc2ltX3N0b3AgKHNkKQorICAgICBTSU1fREVTQyBzZDsKK3sKKyAgc3RvcF9zaW11bGF0b3IgPSAxOworICByZXR1cm4gMTsKK30KKworCisvKiBSdW4gKG9yIHJlc3VtZSkgdGhlIHByb2dyYW0uICAqLwordm9pZAorc2ltX3Jlc3VtZSAoc2QsIHN0ZXAsIHNpZ2duYWwpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgc3RlcCwgc2lnZ25hbDsKK3sKKyAgdWludDMyIGluc3Q7CisgIHVpbnQ4ICppYWRkcjsKKworLyogICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJzaW1fcmVzdW1lICglZCwlZCkgIFBDPTB4JXhcbiIsc3RlcCxzaWdnbmFsLFBDKTsgKi8KKyAgU3RhdGUuZXhjZXB0aW9uID0gMDsKKyAgaWYgKHN0ZXApCisgICAgc2ltX3N0b3AgKHNkKTsKKworICBkbworICAgIHsKKyAgICAgIGlhZGRyID0gaW1lbV9hZGRyICgodWludDMyKVBDIDw8IDIpOworICAgICAgaWYgKGlhZGRyID09IE5VTEwpCisgCXsKKyAJICBTdGF0ZS5leGNlcHRpb24gPSBTSUdCVVM7CisgCSAgYnJlYWs7CisgCX0KKyAKKyAgICAgIGluc3QgPSBnZXRfbG9uZ3dvcmQoIGlhZGRyICk7IAorIAorICAgICAgU3RhdGUucGNfY2hhbmdlZCA9IDA7CisgICAgICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfQ1lDTEVTIF0rKzsKKyAgICAgIAorICAgICAgc3dpdGNoIChpbnN0ICYgMHhDMDAwMDAwMCkKKwl7CisJY2FzZSAweEMwMDAwMDAwOgorCSAgLyogbG9uZyBpbnN0cnVjdGlvbiAqLworCSAgZG9fbG9uZyAoaW5zdCAmIDB4M0ZGRkZGRkYpOworCSAgYnJlYWs7CisJY2FzZSAweDgwMDAwMDAwOgorCSAgLyogUiAtPiBMICovCisJICBkb18yX3Nob3J0ICggaW5zdCAmIDB4N0ZGRiwgKGluc3QgJiAweDNGRkY4MDAwKSA+PiAxNSwgUklHSFRfRklSU1QpOworCSAgYnJlYWs7CisJY2FzZSAweDQwMDAwMDAwOgorCSAgLyogTCAtPiBSICovCisJICBkb18yX3Nob3J0ICgoaW5zdCAmIDB4M0ZGRjgwMDApID4+IDE1LCBpbnN0ICYgMHg3RkZGLCBMRUZUX0ZJUlNUKTsKKwkgIGJyZWFrOworCWNhc2UgMDoKKwkgIGRvX3BhcmFsbGVsICgoaW5zdCAmIDB4M0ZGRjgwMDApID4+IDE1LCBpbnN0ICYgMHg3RkZGKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIAorICAgICAgLyogSWYgdGhlIFBDIG9mIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIG1hdGNoZXMgUlBUX0UgdGhlbgorCSBzY2hlZHVsZSBhIGJyYW5jaCB0byB0aGUgbG9vcCBzdGFydC4gIElmIG9uZSBvZiB0aG9zZQorCSBpbnN0cnVjdGlvbnMgaGFwcGVucyB0byBiZSBhIGJyYW5jaCwgdGhhbiB0aGF0IGluc3RydWN0aW9uCisJIHdpbGwgYmUgaWdub3JlZCAqLworICAgICAgaWYgKCFTdGF0ZS5wY19jaGFuZ2VkKQorCXsKKwkgIGlmIChQU1dfUlAgJiYgUEMgPT0gUlBUX0UpCisJICAgIHsKKwkgICAgICAvKiBOb3RlOiBUaGUgYmVoYXZvdXIgb2YgYSBicmFuY2ggaW5zdHJ1Y3Rpb24gYXQgUlBUX0UKKwkJIGlzIGltcGxlbWVudGF0aW9uIGRlcGVuZGFudCwgdGhpcyBzaW11bGF0b3IgdGFrZXMgdGhlCisJCSBicmFuY2guICBCcmFuY2hpbmcgdG8gUlBUX0UgaXMgdmFsaWQsIHRoZSBpbnN0cnVjdGlvbgorCQkgbXVzdCBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIGxvb3AgaXMgdGFrZW4uICAqLworCSAgICAgIGlmIChSUFRfQyA9PSAxKQorCQl7CisJCSAgU0VUX1BTV19SUCAoMCk7CisJCSAgU0VUX1JQVF9DICgwKTsKKwkJICBTRVRfUEMgKFBDICsgMSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBTRVRfUlBUX0MgKFJQVF9DIC0gMSk7CisJCSAgU0VUX1BDIChSUFRfUyk7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICBTRVRfUEMgKFBDICsgMSk7CisJfQkgIAorICAgICAgCisgICAgICAvKiBDaGVjayBmb3IgYSBicmVha3BvaW50IHRyYXAgb24gdGhpcyBpbnN0cnVjdGlvbi4gIFRoaXMKKwkgb3ZlcnJpZGVzIGFueSBwZW5kaW5nIGJyYW5jaGVzIG9yIGxvb3BzICovCisgICAgICBpZiAoUFNXX0RCICYmIFBDID09IElCQSkKKwl7CisJICBTRVRfQlBDIChQQyk7CisJICBTRVRfQlBTVyAoUFNXKTsKKwkgIFNFVF9QU1cgKFBTVyAmIFBTV19TTV9CSVQpOworCSAgU0VUX1BDIChTREJUX1ZFQ1RPUl9TVEFSVCk7CisJfQorCisgICAgICAvKiBXcml0ZWJhY2sgYWxsIHRoZSBEQVRBIC8gUEMgY2hhbmdlcyAqLworICAgICAgU0xPVF9GTFVTSCAoKTsKKworICAgIH0KKyAgd2hpbGUgKCAhU3RhdGUuZXhjZXB0aW9uICYmICFzdG9wX3NpbXVsYXRvcik7CisgIAorICBpZiAoc3RlcCAmJiAhU3RhdGUuZXhjZXB0aW9uKQorICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR1RSQVA7Cit9CisKK2ludAorc2ltX3RyYWNlIChzZCkKKyAgICAgU0lNX0RFU0Mgc2Q7Cit7CisjaWZkZWYgREVCVUcKKyAgZDEwdl9kZWJ1ZyA9IERFQlVHOworI2VuZGlmCisgIHNpbV9yZXN1bWUgKHNkLCAwLCAwKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQKK3NpbV9pbmZvIChzZCwgdmVyYm9zZSkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCB2ZXJib3NlOworeworICBjaGFyIGJ1ZjFbNDBdOworICBjaGFyIGJ1ZjJbNDBdOworICBjaGFyIGJ1ZjNbNDBdOworICBjaGFyIGJ1ZjRbNDBdOworICBjaGFyIGJ1ZjVbNDBdOworICB1bnNpZ25lZCBsb25nIGxlZnQJCT0gaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX0xFRlQgXSArIGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19MRUZUX0NPTkRfRVhFIF07CisgIHVuc2lnbmVkIGxvbmcgbGVmdF9ub3BzCT0gaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX0xFRlRfTk9QUyBdOworICB1bnNpZ25lZCBsb25nIGxlZnRfcGFyYWxsZWwJPSBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfTEVGVF9QQVJBTExFTCBdOworICB1bnNpZ25lZCBsb25nIGxlZnRfY29uZAk9IGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19MRUZUX0NPTkRfVEVTVCBdOworICB1bnNpZ25lZCBsb25nIGxlZnRfdG90YWwJPSBsZWZ0ICsgbGVmdF9wYXJhbGxlbCArIGxlZnRfY29uZCArIGxlZnRfbm9wczsKKworICB1bnNpZ25lZCBsb25nIHJpZ2h0CQk9IGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19SSUdIVCBdICsgaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX1JJR0hUX0NPTkRfRVhFIF07CisgIHVuc2lnbmVkIGxvbmcgcmlnaHRfbm9wcwk9IGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19SSUdIVF9OT1BTIF07CisgIHVuc2lnbmVkIGxvbmcgcmlnaHRfcGFyYWxsZWwJPSBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfUklHSFRfUEFSQUxMRUwgXTsKKyAgdW5zaWduZWQgbG9uZyByaWdodF9jb25kCT0gaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX1JJR0hUX0NPTkRfVEVTVCBdOworICB1bnNpZ25lZCBsb25nIHJpZ2h0X3RvdGFsCT0gcmlnaHQgKyByaWdodF9wYXJhbGxlbCArIHJpZ2h0X2NvbmQgKyByaWdodF9ub3BzOworCisgIHVuc2lnbmVkIGxvbmcgdW5rbm93bgkJPSBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfVU5LTk9XTiBdOworICB1bnNpZ25lZCBsb25nIGluc19sb25nCT0gaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX0xPTkcgXTsKKyAgdW5zaWduZWQgbG9uZyBwYXJhbGxlbAk9IGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19QQVJBTExFTCBdOworICB1bnNpZ25lZCBsb25nIGxlZnRyaWdodAk9IGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19MRUZUUklHSFQgXTsKKyAgdW5zaWduZWQgbG9uZyByaWdodGxlZnQJPSBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfUklHSFRMRUZUIF07CisgIHVuc2lnbmVkIGxvbmcgY29uZF90cnVlCT0gaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX0NPTkRfVFJVRSBdOworICB1bnNpZ25lZCBsb25nIGNvbmRfZmFsc2UJPSBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfQ09ORF9GQUxTRSBdOworICB1bnNpZ25lZCBsb25nIGNvbmRfanVtcAk9IGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19DT05EX0pVTVAgXTsKKyAgdW5zaWduZWQgbG9uZyBjeWNsZXMJCT0gaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX0NZQ0xFUyBdOworICB1bnNpZ25lZCBsb25nIHRvdGFsCQk9ICh1bmtub3duICsgbGVmdF90b3RhbCArIHJpZ2h0X3RvdGFsICsgaW5zX2xvbmcpOworCisgIGludCBzaXplCQkJPSBzdHJsZW4gKGFkZF9jb21tYXMgKGJ1ZjEsIHNpemVvZiAoYnVmMSksIHRvdGFsKSk7CisgIGludCBwYXJhbGxlbF9zaXplCQk9IHN0cmxlbiAoYWRkX2NvbW1hcyAoYnVmMSwgc2l6ZW9mIChidWYxKSwKKwkJCQkJCSAgICAgIChsZWZ0X3BhcmFsbGVsID4gcmlnaHRfcGFyYWxsZWwpID8gbGVmdF9wYXJhbGxlbCA6IHJpZ2h0X3BhcmFsbGVsKSk7CisgIGludCBjb25kX3NpemUJCQk9IHN0cmxlbiAoYWRkX2NvbW1hcyAoYnVmMSwgc2l6ZW9mIChidWYxKSwgKGxlZnRfY29uZCA+IHJpZ2h0X2NvbmQpID8gbGVmdF9jb25kIDogcmlnaHRfY29uZCkpOworICBpbnQgbm9wX3NpemUJCQk9IHN0cmxlbiAoYWRkX2NvbW1hcyAoYnVmMSwgc2l6ZW9mIChidWYxKSwgKGxlZnRfbm9wcyA+IHJpZ2h0X25vcHMpID8gbGVmdF9ub3BzIDogcmlnaHRfbm9wcykpOworICBpbnQgbm9ybWFsX3NpemUJCT0gc3RybGVuIChhZGRfY29tbWFzIChidWYxLCBzaXplb2YgKGJ1ZjEpLCAobGVmdCA+IHJpZ2h0KSA/IGxlZnQgOiByaWdodCkpOworCisgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywKKwkJCQkgICAgICJleGVjdXRlZCAlKnMgbGVmdCAgaW5zdHJ1Y3Rpb24ocyksICUqcyBub3JtYWwsICUqcyBwYXJhbGxlbCwgJSpzIEVYRXh4eCwgJSpzIG5vcHNcbiIsCisJCQkJICAgICBzaXplLCBhZGRfY29tbWFzIChidWYxLCBzaXplb2YgKGJ1ZjEpLCBsZWZ0X3RvdGFsKSwKKwkJCQkgICAgIG5vcm1hbF9zaXplLCBhZGRfY29tbWFzIChidWYyLCBzaXplb2YgKGJ1ZjIpLCBsZWZ0KSwKKwkJCQkgICAgIHBhcmFsbGVsX3NpemUsIGFkZF9jb21tYXMgKGJ1ZjMsIHNpemVvZiAoYnVmMyksIGxlZnRfcGFyYWxsZWwpLAorCQkJCSAgICAgY29uZF9zaXplLCBhZGRfY29tbWFzIChidWY0LCBzaXplb2YgKGJ1ZjQpLCBsZWZ0X2NvbmQpLAorCQkJCSAgICAgbm9wX3NpemUsIGFkZF9jb21tYXMgKGJ1ZjUsIHNpemVvZiAoYnVmNSksIGxlZnRfbm9wcykpOworCisgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywKKwkJCQkgICAgICJleGVjdXRlZCAlKnMgcmlnaHQgaW5zdHJ1Y3Rpb24ocyksICUqcyBub3JtYWwsICUqcyBwYXJhbGxlbCwgJSpzIEVYRXh4eCwgJSpzIG5vcHNcbiIsCisJCQkJICAgICBzaXplLCBhZGRfY29tbWFzIChidWYxLCBzaXplb2YgKGJ1ZjEpLCByaWdodF90b3RhbCksCisJCQkJICAgICBub3JtYWxfc2l6ZSwgYWRkX2NvbW1hcyAoYnVmMiwgc2l6ZW9mIChidWYyKSwgcmlnaHQpLAorCQkJCSAgICAgcGFyYWxsZWxfc2l6ZSwgYWRkX2NvbW1hcyAoYnVmMywgc2l6ZW9mIChidWYzKSwgcmlnaHRfcGFyYWxsZWwpLAorCQkJCSAgICAgY29uZF9zaXplLCBhZGRfY29tbWFzIChidWY0LCBzaXplb2YgKGJ1ZjQpLCByaWdodF9jb25kKSwKKwkJCQkgICAgIG5vcF9zaXplLCBhZGRfY29tbWFzIChidWY1LCBzaXplb2YgKGJ1ZjUpLCByaWdodF9ub3BzKSk7CisKKyAgaWYgKGluc19sb25nKQorICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywKKwkJCQkgICAgICAgImV4ZWN1dGVkICUqcyBsb25nIGluc3RydWN0aW9uKHMpXG4iLAorCQkJCSAgICAgICBzaXplLCBhZGRfY29tbWFzIChidWYxLCBzaXplb2YgKGJ1ZjEpLCBpbnNfbG9uZykpOworCisgIGlmIChwYXJhbGxlbCkKKyAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssCisJCQkJICAgICAgICJleGVjdXRlZCAlKnMgcGFyYWxsZWwgaW5zdHJ1Y3Rpb24ocylcbiIsCisJCQkJICAgICAgIHNpemUsIGFkZF9jb21tYXMgKGJ1ZjEsIHNpemVvZiAoYnVmMSksIHBhcmFsbGVsKSk7CisKKyAgaWYgKGxlZnRyaWdodCkKKyAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssCisJCQkJICAgICAgICJleGVjdXRlZCAlKnMgaW5zdHJ1Y3Rpb24ocykgZW5jb2RlZCBMLT5SXG4iLAorCQkJCSAgICAgICBzaXplLCBhZGRfY29tbWFzIChidWYxLCBzaXplb2YgKGJ1ZjEpLCBsZWZ0cmlnaHQpKTsKKworICBpZiAocmlnaHRsZWZ0KQorICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywKKwkJCQkgICAgICAgImV4ZWN1dGVkICUqcyBpbnN0cnVjdGlvbihzKSBlbmNvZGVkIFItPkxcbiIsCisJCQkJICAgICAgIHNpemUsIGFkZF9jb21tYXMgKGJ1ZjEsIHNpemVvZiAoYnVmMSksIHJpZ2h0bGVmdCkpOworCisgIGlmICh1bmtub3duKQorICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywKKwkJCQkgICAgICAgImV4ZWN1dGVkICUqcyB1bmtub3duIGluc3RydWN0aW9uKHMpXG4iLAorCQkJCSAgICAgICBzaXplLCBhZGRfY29tbWFzIChidWYxLCBzaXplb2YgKGJ1ZjEpLCB1bmtub3duKSk7CisKKyAgaWYgKGNvbmRfdHJ1ZSkKKyAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssCisJCQkJICAgICAgICJleGVjdXRlZCAlKnMgaW5zdHJ1Y3Rpb24ocykgZHVlIHRvIEVYRXh4eCBjb25kaXRpb24gYmVpbmcgdHJ1ZVxuIiwKKwkJCQkgICAgICAgc2l6ZSwgYWRkX2NvbW1hcyAoYnVmMSwgc2l6ZW9mIChidWYxKSwgY29uZF90cnVlKSk7CisKKyAgaWYgKGNvbmRfZmFsc2UpCisgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLAorCQkJCSAgICAgICAic2tpcHBlZCAgJSpzIGluc3RydWN0aW9uKHMpIGR1ZSB0byBFWEV4eHggY29uZGl0aW9uIGJlaW5nIGZhbHNlXG4iLAorCQkJCSAgICAgICBzaXplLCBhZGRfY29tbWFzIChidWYxLCBzaXplb2YgKGJ1ZjEpLCBjb25kX2ZhbHNlKSk7CisKKyAgaWYgKGNvbmRfanVtcCkKKyAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssCisJCQkJICAgICAgICJza2lwcGVkICAlKnMgaW5zdHJ1Y3Rpb24ocykgZHVlIHRvIGNvbmRpdGlvbmFsIGJyYW5jaCBzdWNjZWVkaW5nXG4iLAorCQkJCSAgICAgICBzaXplLCBhZGRfY29tbWFzIChidWYxLCBzaXplb2YgKGJ1ZjEpLCBjb25kX2p1bXApKTsKKworICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssCisJCQkJICAgICAiZXhlY3V0ZWQgJSpzIGN5Y2xlKHMpXG4iLAorCQkJCSAgICAgc2l6ZSwgYWRkX2NvbW1hcyAoYnVmMSwgc2l6ZW9mIChidWYxKSwgY3ljbGVzKSk7CisKKyAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLAorCQkJCSAgICAgImV4ZWN1dGVkICUqcyB0b3RhbCBpbnN0cnVjdGlvbnNcbiIsCisJCQkJICAgICBzaXplLCBhZGRfY29tbWFzIChidWYxLCBzaXplb2YgKGJ1ZjEpLCB0b3RhbCkpOworfQorCitTSU1fUkMKK3NpbV9jcmVhdGVfaW5mZXJpb3IgKHNkLCBhYmZkLCBhcmd2LCBlbnYpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKKyAgICAgY2hhciAqKmFyZ3Y7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGJmZF92bWEgc3RhcnRfYWRkcmVzczsKKworICAvKiByZXNldCBhbGwgc3RhdGUgaW5mb3JtYXRpb24gKi8KKyAgbWVtc2V0ICgmU3RhdGUucmVncywgMCwgKGludCkmU3RhdGUuaW1lbSAtIChpbnQpJlN0YXRlLnJlZ3NbMF0pOworCisgIGlmIChhcmd2KQorICAgIHsKKyAgICAgIC8qIGEgaGFjayB0byBzZXQgcjAvcjEgd2l0aCBhcmdjL2FyZ3YgKi8KKyAgICAgIC8qIHNvbWUgaGlnaCBtZW1vcnkgdGhhdCB3b24ndCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgc3RhY2sgc29vbiAqLworICAgICAgYmZkX3ZtYSBhZGRyID0gMHg3QzAwOworICAgICAgaW50IHAgPSAyMDsKKyAgICAgIGludCBpID0gMDsKKyAgICAgIHdoaWxlIChhcmd2W2ldKQorIAl7CisgCSAgaW50IHNpemUgPSBzdHJsZW4gKGFyZ3ZbaV0pICsgMTsKKyAJICBTVyAoYWRkciArIDIqaSwgYWRkciArIHApOyAKKyAJICBzaW1fd3JpdGUgKHNkLCBhZGRyICsgMCwgYXJndltpXSwgc2l6ZSk7CisgCSAgcCArPSBzaXplOworIAkgIGkrKzsKKyAJfQorICAgICAgU0VUX0dQUiAoMCwgYWRkcik7CisgICAgICBTRVRfR1BSICgxLCBpKTsKKyAgICB9CisKKyAgLyogc2V0IFBDICovCisgIGlmIChhYmZkICE9IE5VTEwpCisgICAgc3RhcnRfYWRkcmVzcyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CisgIGVsc2UKKyAgICBzdGFydF9hZGRyZXNzID0gMHhmZmMwIDw8IDI7CisjaWZkZWYgREVCVUcKKyAgaWYgKGQxMHZfZGVidWcpCisgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAic2ltX2NyZWF0ZV9pbmZlcmlvcjogIFBDPTB4JWx4XG4iLCAobG9uZykgc3RhcnRfYWRkcmVzcyk7CisjZW5kaWYKKyAgU0VUX0NSRUcgKFBDX0NSLCBzdGFydF9hZGRyZXNzID4+IDIpOworCisgIC8qIGNwdSByZXNldHMgaW1hcDAgdG8gMCBhbmQgaW1hcDEgdG8gMHg3ZiwgYnV0IEQxMFYtRVZBIGJvYXJkICovCisgIC8qIHJlc2V0cyBpbWFwMCBhbmQgaW1hcDEgdG8gMHgxMDAwLiAqLworICBpZiAoMSkKKyAgICB7CisgICAgICBTRVRfSU1BUDAgKDB4MDAwMCk7CisgICAgICBTRVRfSU1BUDEgKDB4MDA3Zik7CisgICAgICBTRVRfRE1BUCAoMHgwMDAwKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBTRVRfSU1BUDAgKDB4MTAwMCk7CisgICAgICBTRVRfSU1BUDEgKDB4MTAwMCk7CisgICAgICBTRVRfRE1BUCgwKTsKKyAgICB9CisKKyAgU0xPVF9GTFVTSCAoKTsKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworCit2b2lkCitzaW1fc2V0X2NhbGxiYWNrcyAocCkKKyAgICAgaG9zdF9jYWxsYmFjayAqcDsKK3sKKyAgZDEwdl9jYWxsYmFjayA9IHA7Cit9CisKK3ZvaWQKK3NpbV9zdG9wX3JlYXNvbiAoc2QsIHJlYXNvbiwgc2lncmMpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBlbnVtIHNpbV9zdG9wICpyZWFzb247CisgICAgIGludCAqc2lncmM7Cit7CisvKiAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgInNpbV9zdG9wX3JlYXNvbjogIFBDPTB4JXhcbiIsUEM8PDIpOyAqLworCisgIHN3aXRjaCAoU3RhdGUuZXhjZXB0aW9uKQorICAgIHsKKyAgICBjYXNlIFNJR19EMTBWX1NUT1A6CQkJLyogc3RvcCBpbnN0cnVjdGlvbiAqLworICAgICAgKnJlYXNvbiA9IHNpbV9leGl0ZWQ7CisgICAgICAqc2lncmMgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNJR19EMTBWX0VYSVQ6CQkJLyogZXhpdCB0cmFwICovCisgICAgICAqcmVhc29uID0gc2ltX2V4aXRlZDsKKyAgICAgICpzaWdyYyA9IEdQUiAoMCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CQkJCS8qIHNvbWUgc2lnbmFsICovCisgICAgICAqcmVhc29uID0gc2ltX3N0b3BwZWQ7CisgICAgICBpZiAoc3RvcF9zaW11bGF0b3IgJiYgIVN0YXRlLmV4Y2VwdGlvbikKKwkqc2lncmMgPSBTSUdJTlQ7CisgICAgICBlbHNlCisJKnNpZ3JjID0gU3RhdGUuZXhjZXB0aW9uOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHN0b3Bfc2ltdWxhdG9yID0gMDsKK30KKworaW50CitzaW1fZmV0Y2hfcmVnaXN0ZXIgKHNkLCBybiwgbWVtb3J5LCBsZW5ndGgpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgcm47CisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgaWYgKHJuID4gMzQpCisgICAgV1JJVEVfNjQgKG1lbW9yeSwgQUNDIChybi0zNSkpOworICBlbHNlIGlmIChybiA9PSAzMikKKyAgICBXUklURV8xNiAobWVtb3J5LCBJTUFQMCk7CisgIGVsc2UgaWYgKHJuID09IDMzKQorICAgIFdSSVRFXzE2IChtZW1vcnksIElNQVAxKTsKKyAgZWxzZSBpZiAocm4gPT0gMzQpCisgICAgV1JJVEVfMTYgKG1lbW9yeSwgRE1BUCk7CisgIGVsc2UgaWYgKHJuID49IDE2KQorICAgIFdSSVRFXzE2IChtZW1vcnksIENSRUcgKHJuIC0gMTYpKTsKKyAgZWxzZQorICAgIFdSSVRFXzE2IChtZW1vcnksIEdQUiAocm4pKTsKKyAgcmV0dXJuIC0xOworfQorIAoraW50CitzaW1fc3RvcmVfcmVnaXN0ZXIgKHNkLCBybiwgbWVtb3J5LCBsZW5ndGgpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgcm47CisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgaWYgKHJuID4gMzQpCisgICAgU0VUX0FDQyAocm4tMzUsIFJFQURfNjQgKG1lbW9yeSkgJiBNQVNLNDApOworICBlbHNlIGlmIChybiA9PSAzNCkKKyAgICBTRVRfRE1BUCggUkVBRF8xNihtZW1vcnkpICk7CisgIGVsc2UgaWYgKHJuID09IDMzKQorICAgIFNFVF9JTUFQMSggUkVBRF8xNihtZW1vcnkpICk7CisgIGVsc2UgaWYgKHJuID09IDMyKQorICAgIFNFVF9JTUFQMCggUkVBRF8xNihtZW1vcnkpICk7CisgIGVsc2UgaWYgKHJuID49IDE2KQorICAgIFNFVF9DUkVHIChybiAtIDE2LCBSRUFEXzE2IChtZW1vcnkpKTsKKyAgZWxzZQorICAgIFNFVF9HUFIgKHJuLCBSRUFEXzE2IChtZW1vcnkpKTsKKyAgU0xPVF9GTFVTSCAoKTsKKyAgcmV0dXJuIC0xOworfQorCisKK3ZvaWQKK3NpbV9kb19jb21tYW5kIChzZCwgY21kKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgY2hhciAqY21kOworeyAKKyAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAic2ltX2RvX2NvbW1hbmQ6ICVzXG4iLGNtZCk7Cit9CisKK1NJTV9SQworc2ltX2xvYWQgKHNkLCBwcm9nLCBhYmZkLCBmcm9tX3R0eSkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGNoYXIgKnByb2c7CisgICAgIGJmZCAqYWJmZDsKKyAgICAgaW50IGZyb21fdHR5OworeworICBleHRlcm4gYmZkICpzaW1fbG9hZF9maWxlICgpOyAvKiA/Pz8gRG9uJ3Qga25vdyB3aGVyZSB0aGlzIHNob3VsZCBsaXZlLiAgKi8KKworICBpZiAocHJvZ19iZmQgIT0gTlVMTCAmJiBwcm9nX2JmZF93YXNfb3BlbmVkX3ApCisgICAgeworICAgICAgYmZkX2Nsb3NlIChwcm9nX2JmZCk7CisgICAgICBwcm9nX2JmZF93YXNfb3BlbmVkX3AgPSAwOworICAgIH0KKyAgcHJvZ19iZmQgPSBzaW1fbG9hZF9maWxlIChzZCwgbXluYW1lLCBkMTB2X2NhbGxiYWNrLCBwcm9nLCBhYmZkLAorCQkJICAgIHNpbV9raW5kID09IFNJTV9PUEVOX0RFQlVHLAorCQkJICAgIDEvKkxNQSovLCBzaW1fd3JpdGUpOworICBpZiAocHJvZ19iZmQgPT0gTlVMTCkKKyAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisgIHByb2dfYmZkX3dhc19vcGVuZWRfcCA9IGFiZmQgPT0gTlVMTDsKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30gCmRpZmYgLS1naXQgYS9zaW0vZDEwdi9zaW1vcHMuYyBiL3NpbS9kMTB2L3NpbW9wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NGJhNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZDEwdi9zaW1vcHMuYwpAQCAtMCwwICsxLDMyNTIgQEAKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImQxMHZfc2ltLmgiCisjaW5jbHVkZSAic2ltb3BzLmgiCisjaW5jbHVkZSAidGFyZy12YWxzLmgiCisKK2V4dGVybiBjaGFyICpzdHJyY2hyICgpOworCitlbnVtIG9wX3R5cGVzIHsKKyAgT1BfVk9JRCwKKyAgT1BfUkVHLAorICBPUF9SRUdfT1VUUFVULAorICBPUF9EUkVHLAorICBPUF9EUkVHX09VVFBVVCwKKyAgT1BfQUNDVU0sCisgIE9QX0FDQ1VNX09VVFBVVCwKKyAgT1BfQUNDVU1fUkVWRVJTRSwKKyAgT1BfQ1IsCisgIE9QX0NSX09VVFBVVCwKKyAgT1BfQ1JfUkVWRVJTRSwKKyAgT1BfRkxBRywKKyAgT1BfRkxBR19PVVRQVVQsCisgIE9QX0NPTlNUQU5UMTYsCisgIE9QX0NPTlNUQU5UOCwKKyAgT1BfQ09OU1RBTlQzLAorICBPUF9DT05TVEFOVDQsCisgIE9QX01FTVJFRiwKKyAgT1BfTUVNUkVGMiwKKyAgT1BfUE9TVERFQywKKyAgT1BfUE9TVElOQywKKyAgT1BfUFJFREVDLAorICBPUF9SMCwKKyAgT1BfUjEsCisgIE9QX1IyLAorfTsKKworCitlbnVtIHsKKyAgUFNXX01BU0sgPSAoUFNXX1NNX0JJVAorCSAgICAgIHwgUFNXX0VBX0JJVAorCSAgICAgIHwgUFNXX0RCX0JJVAorCSAgICAgIHwgUFNXX0RNX0JJVAorCSAgICAgIHwgUFNXX0lFX0JJVAorCSAgICAgIHwgUFNXX1JQX0JJVAorCSAgICAgIHwgUFNXX01EX0JJVAorCSAgICAgIHwgUFNXX0ZYX0JJVAorCSAgICAgIHwgUFNXX1NUX0JJVAorCSAgICAgIHwgUFNXX0YwX0JJVAorCSAgICAgIHwgUFNXX0YxX0JJVAorCSAgICAgIHwgUFNXX0NfQklUKSwKK307CisKK3JlZ190Cittb3ZlX3RvX2NyIChpbnQgY3IsIHJlZ190IG1hc2ssIHJlZ190IHZhbCkKK3sKKyAgLyogQSBNQVNLIGJpdCBpcyBzZXQgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIENSIHNob3VsZAorICAgICBiZSBsZWZ0IGFsb25lICovCisgIC8qIFRoaXMgYXNzdW1lcyB0aGF0IChWQUwgJiBNQVNLKSA9PSAwICovCisgIHN3aXRjaCAoY3IpCisgICAgeworICAgIGNhc2UgUFNXX0NSOgorICAgICAgdmFsICY9IFBTV19NQVNLOworICAgICAgaWYgKChtYXNrICYgUFNXX1NNX0JJVCkgPT0gMCkKKwl7CisJICBpbnQgbmV3X3NtID0gKHZhbCAmIFBTV19TTV9CSVQpICE9IDA7CisJICBTRVRfSEVMRF9TUCAoUFNXX1NNLCBHUFIgKFNQX0lEWCkpOyAvKiBzYXZlIG9sZCBTUCAqLworCSAgaWYgKFBTV19TTSAhPSBuZXdfc20pCisJICAgIFNFVF9HUFIgKFNQX0lEWCwgSEVMRF9TUCAobmV3X3NtKSk7IC8qIHJlc3RvcmUgbmV3IFNQICovCisJfQorICAgICAgaWYgKChtYXNrICYgKFBTV19TVF9CSVQgfCBQU1dfRlhfQklUKSkgPT0gMCkKKwl7CisJICBpZiAodmFsICYgUFNXX1NUX0JJVCAmJiAhKHZhbCAmIFBTV19GWF9CSVQpKQorCSAgICB7CisJICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpCisJCShkMTB2X2NhbGxiYWNrLAorCQkgIkVSUk9SIGF0IFBDIDB4JXg6IFNUIGNhbiBvbmx5IGJlIHNldCB3aGVuIEZYIGlzIHNldC5cbiIsCisJCSBQQzw8Mik7CisJICAgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHSUxMOworCSAgICB9CisJfQorICAgICAgLyoga2VlcCBhbiB1cC10by1kYXRlIHBzdyBhcm91bmQgZm9yIHRyYWNpbmcgKi8KKyAgICAgIFN0YXRlLnRyYWNlLnBzdyA9IChTdGF0ZS50cmFjZS5wc3cgJiBtYXNrKSB8IHZhbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQlBTV19DUjoKKyAgICBjYXNlIERQU1dfQ1I6CisgICAgICB2YWwgJj0gUFNXX01BU0s7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PRF9TX0NSOgorICAgIGNhc2UgTU9EX0VfQ1I6CisgICAgICB2YWwgJj0gfjE7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICAvKiBvbmx5IGlzc3VlIGFuIHVwZGF0ZSBpZiB0aGUgcmVnaXN0ZXIgaXMgYmVpbmcgY2hhbmdlZCAqLworICBpZiAoKFN0YXRlLmNyZWdzW2NyXSAmIH5tYXNrKSAhPSB2YWwpCisgICAgU0xPVF9QRU5EX01BU0sgKFN0YXRlLmNyZWdzW2NyXSwgbWFzaywgdmFsKTsKKyAgcmV0dXJuIHZhbDsKK30KKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCB0cmFjZV9pbnB1dF9mdW5jIFBBUkFNUyAoKGNoYXIgKm5hbWUsCisJCQkJICAgICAgZW51bSBvcF90eXBlcyBpbjEsCisJCQkJICAgICAgZW51bSBvcF90eXBlcyBpbjIsCisJCQkJICAgICAgZW51bSBvcF90eXBlcyBpbjMpKTsKKworI2RlZmluZSB0cmFjZV9pbnB1dChuYW1lLCBpbjEsIGluMiwgaW4zKSBkbyB7IGlmIChkMTB2X2RlYnVnKSB0cmFjZV9pbnB1dF9mdW5jIChuYW1lLCBpbjEsIGluMiwgaW4zKTsgfSB3aGlsZSAoMCkKKworI2lmbmRlZiBTSVpFX0lOU1RSVUNUSU9OCisjZGVmaW5lIFNJWkVfSU5TVFJVQ1RJT04gOAorI2VuZGlmCisKKyNpZm5kZWYgU0laRV9PUEVSQU5EUworI2RlZmluZSBTSVpFX09QRVJBTkRTIDE4CisjZW5kaWYKKworI2lmbmRlZiBTSVpFX1ZBTFVFUworI2RlZmluZSBTSVpFX1ZBTFVFUyAxMworI2VuZGlmCisKKyNpZm5kZWYgU0laRV9MT0NBVElPTgorI2RlZmluZSBTSVpFX0xPQ0FUSU9OIDIwCisjZW5kaWYKKworI2lmbmRlZiBTSVpFX1BDCisjZGVmaW5lIFNJWkVfUEMgNgorI2VuZGlmCisKKyNpZm5kZWYgU0laRV9MSU5FX05VTUJFUgorI2RlZmluZSBTSVpFX0xJTkVfTlVNQkVSIDQKKyNlbmRpZgorCitzdGF0aWMgdm9pZAordHJhY2VfaW5wdXRfZnVuYyAobmFtZSwgaW4xLCBpbjIsIGluMykKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgZW51bSBvcF90eXBlcyBpbjE7CisgICAgIGVudW0gb3BfdHlwZXMgaW4yOworICAgICBlbnVtIG9wX3R5cGVzIGluMzsKK3sKKyAgY2hhciAqY29tbWE7CisgIGVudW0gb3BfdHlwZXMgaW5bM107CisgIGludCBpOworICBjaGFyIGJ1ZlsxMDI0XTsKKyAgY2hhciAqcDsKKyAgbG9uZyB0bXA7CisgIGNoYXIgKnR5cGU7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICBjb25zdCBjaGFyICpmdW5jdGlvbm5hbWU7CisgIHVuc2lnbmVkIGludCBsaW5lbnVtYmVyOworICBiZmRfdm1hIGJ5dGVfcGM7CisKKyAgaWYgKChkMTB2X2RlYnVnICYgREVCVUdfVFJBQ0UpID09IDApCisgICAgcmV0dXJuOworCisgIHN3aXRjaCAoU3RhdGUuaW5zX3R5cGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBJTlNfVU5LTk9XTjoJCXR5cGUgPSAiID8iOyBicmVhazsKKyAgICBjYXNlIElOU19MRUZUOgkJdHlwZSA9ICIgTCI7IGJyZWFrOworICAgIGNhc2UgSU5TX1JJR0hUOgkJdHlwZSA9ICIgUiI7IGJyZWFrOworICAgIGNhc2UgSU5TX0xFRlRfUEFSQUxMRUw6CXR5cGUgPSAiKkwiOyBicmVhazsKKyAgICBjYXNlIElOU19SSUdIVF9QQVJBTExFTDoJdHlwZSA9ICIqUiI7IGJyZWFrOworICAgIGNhc2UgSU5TX0xFRlRfQ09ORF9URVNUOgl0eXBlID0gIj9MIjsgYnJlYWs7CisgICAgY2FzZSBJTlNfUklHSFRfQ09ORF9URVNUOgl0eXBlID0gIj9SIjsgYnJlYWs7CisgICAgY2FzZSBJTlNfTEVGVF9DT05EX0VYRToJdHlwZSA9ICImTCI7IGJyZWFrOworICAgIGNhc2UgSU5TX1JJR0hUX0NPTkRfRVhFOgl0eXBlID0gIiZSIjsgYnJlYWs7CisgICAgY2FzZSBJTlNfTE9ORzoJCXR5cGUgPSAiIEIiOyBicmVhazsKKyAgICB9CisKKyAgaWYgKChkMTB2X2RlYnVnICYgREVCVUdfTElORV9OVU1CRVIpID09IDApCisgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLAorCQkJCSAgICAgICAiMHglLip4ICVzOiAlLSpzICIsCisJCQkJICAgICAgIFNJWkVfUEMsICh1bnNpZ25lZClQQywKKwkJCQkgICAgICAgdHlwZSwKKwkJCQkgICAgICAgU0laRV9JTlNUUlVDVElPTiwgbmFtZSk7CisKKyAgZWxzZQorICAgIHsKKyAgICAgIGJ1ZlswXSA9ICdcMCc7CisgICAgICBieXRlX3BjID0gZGVjb2RlX3BjICgpOworICAgICAgaWYgKHRleHQgJiYgYnl0ZV9wYyA+PSB0ZXh0X3N0YXJ0ICYmIGJ5dGVfcGMgPCB0ZXh0X2VuZCkKKwl7CisJICBmaWxlbmFtZSA9IChjb25zdCBjaGFyICopMDsKKwkgIGZ1bmN0aW9ubmFtZSA9IChjb25zdCBjaGFyICopMDsKKwkgIGxpbmVudW1iZXIgPSAwOworCSAgaWYgKGJmZF9maW5kX25lYXJlc3RfbGluZSAocHJvZ19iZmQsIHRleHQsIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKTAsIGJ5dGVfcGMgLSB0ZXh0X3N0YXJ0LAorCQkJCSAgICAgJmZpbGVuYW1lLCAmZnVuY3Rpb25uYW1lLCAmbGluZW51bWJlcikpCisJICAgIHsKKwkgICAgICBwID0gYnVmOworCSAgICAgIGlmIChsaW5lbnVtYmVyKQorCQl7CisJCSAgc3ByaW50ZiAocCwgIiMlLSpkICIsIFNJWkVfTElORV9OVU1CRVIsIGxpbmVudW1iZXIpOworCQkgIHAgKz0gc3RybGVuIChwKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHNwcmludGYgKHAsICIlLSpzICIsIFNJWkVfTElORV9OVU1CRVIrMSwgIi0tLSIpOworCQkgIHAgKz0gU0laRV9MSU5FX05VTUJFUisyOworCQl9CisKKwkgICAgICBpZiAoZnVuY3Rpb25uYW1lKQorCQl7CisJCSAgc3ByaW50ZiAocCwgIiVzICIsIGZ1bmN0aW9ubmFtZSk7CisJCSAgcCArPSBzdHJsZW4gKHApOworCQl9CisJICAgICAgZWxzZSBpZiAoZmlsZW5hbWUpCisJCXsKKwkJICBjaGFyICpxID0gc3RycmNociAoZmlsZW5hbWUsICcvJyk7CisJCSAgc3ByaW50ZiAocCwgIiVzICIsIChxKSA/IHErMSA6IGZpbGVuYW1lKTsKKwkJICBwICs9IHN0cmxlbiAocCk7CisJCX0KKworCSAgICAgIGlmICgqcCA9PSAnICcpCisJCSpwID0gJ1wwJzsKKwkgICAgfQorCX0KKworICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLAorCQkJCQkgIjB4JS4qeCAlczogJS0qLipzICUtKnMgIiwKKwkJCQkJIFNJWkVfUEMsICh1bnNpZ25lZClQQywKKwkJCQkJIHR5cGUsCisJCQkJCSBTSVpFX0xPQ0FUSU9OLCBTSVpFX0xPQ0FUSU9OLCBidWYsCisJCQkJCSBTSVpFX0lOU1RSVUNUSU9OLCBuYW1lKTsKKyAgICB9CisKKyAgaW5bMF0gPSBpbjE7CisgIGluWzFdID0gaW4yOworICBpblsyXSA9IGluMzsKKyAgY29tbWEgPSAiIjsKKyAgcCA9IGJ1ZjsKKyAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICB7CisgICAgICBzd2l0Y2ggKGluW2ldKQorCXsKKwljYXNlIE9QX1ZPSUQ6CisJY2FzZSBPUF9SMDoKKwljYXNlIE9QX1IxOgorCWNhc2UgT1BfUjI6CisJICBicmVhazsKKworCWNhc2UgT1BfUkVHOgorCWNhc2UgT1BfUkVHX09VVFBVVDoKKwljYXNlIE9QX0RSRUc6CisJY2FzZSBPUF9EUkVHX09VVFBVVDoKKwkgIHNwcmludGYgKHAsICIlc3IlZCIsIGNvbW1hLCBPUFtpXSk7CisJICBwICs9IHN0cmxlbiAocCk7CisJICBjb21tYSA9ICIsIjsKKwkgIGJyZWFrOworCisJY2FzZSBPUF9DUjoKKwljYXNlIE9QX0NSX09VVFBVVDoKKwljYXNlIE9QX0NSX1JFVkVSU0U6CisJICBzcHJpbnRmIChwLCAiJXNjciVkIiwgY29tbWEsIE9QW2ldKTsKKwkgIHAgKz0gc3RybGVuIChwKTsKKwkgIGNvbW1hID0gIiwiOworCSAgYnJlYWs7CisKKwljYXNlIE9QX0FDQ1VNOgorCWNhc2UgT1BfQUNDVU1fT1VUUFVUOgorCWNhc2UgT1BfQUNDVU1fUkVWRVJTRToKKwkgIHNwcmludGYgKHAsICIlc2ElZCIsIGNvbW1hLCBPUFtpXSk7CisJICBwICs9IHN0cmxlbiAocCk7CisJICBjb21tYSA9ICIsIjsKKwkgIGJyZWFrOworCisJY2FzZSBPUF9DT05TVEFOVDE2OgorCSAgc3ByaW50ZiAocCwgIiVzJWQiLCBjb21tYSwgT1BbaV0pOworCSAgcCArPSBzdHJsZW4gKHApOworCSAgY29tbWEgPSAiLCI7CisJICBicmVhazsKKworCWNhc2UgT1BfQ09OU1RBTlQ4OgorCSAgc3ByaW50ZiAocCwgIiVzJWQiLCBjb21tYSwgU0VYVDgoT1BbaV0pKTsKKwkgIHAgKz0gc3RybGVuIChwKTsKKwkgIGNvbW1hID0gIiwiOworCSAgYnJlYWs7CisKKwljYXNlIE9QX0NPTlNUQU5UNDoKKwkgIHNwcmludGYgKHAsICIlcyVkIiwgY29tbWEsIFNFWFQ0KE9QW2ldKSk7CisJICBwICs9IHN0cmxlbiAocCk7CisJICBjb21tYSA9ICIsIjsKKwkgIGJyZWFrOworCisJY2FzZSBPUF9DT05TVEFOVDM6CisJICBzcHJpbnRmIChwLCAiJXMlZCIsIGNvbW1hLCBTRVhUMyhPUFtpXSkpOworCSAgcCArPSBzdHJsZW4gKHApOworCSAgY29tbWEgPSAiLCI7CisJICBicmVhazsKKworCWNhc2UgT1BfTUVNUkVGOgorCSAgc3ByaW50ZiAocCwgIiVzQHIlZCIsIGNvbW1hLCBPUFtpXSk7CisJICBwICs9IHN0cmxlbiAocCk7CisJICBjb21tYSA9ICIsIjsKKwkgIGJyZWFrOworCisJY2FzZSBPUF9NRU1SRUYyOgorCSAgc3ByaW50ZiAocCwgIiVzQCglZCxyJWQpIiwgY29tbWEsIChpbnQxNilPUFtpXSwgT1BbaSsxXSk7CisJICBwICs9IHN0cmxlbiAocCk7CisJICBjb21tYSA9ICIsIjsKKwkgIGJyZWFrOworCisJY2FzZSBPUF9QT1NUSU5DOgorCSAgc3ByaW50ZiAocCwgIiVzQHIlZCsiLCBjb21tYSwgT1BbaV0pOworCSAgcCArPSBzdHJsZW4gKHApOworCSAgY29tbWEgPSAiLCI7CisJICBicmVhazsKKworCWNhc2UgT1BfUE9TVERFQzoKKwkgIHNwcmludGYgKHAsICIlc0ByJWQtIiwgY29tbWEsIE9QW2ldKTsKKwkgIHAgKz0gc3RybGVuIChwKTsKKwkgIGNvbW1hID0gIiwiOworCSAgYnJlYWs7CisKKwljYXNlIE9QX1BSRURFQzoKKwkgIHNwcmludGYgKHAsICIlc0AtciVkIiwgY29tbWEsIE9QW2ldKTsKKwkgIHAgKz0gc3RybGVuIChwKTsKKwkgIGNvbW1hID0gIiwiOworCSAgYnJlYWs7CisKKwljYXNlIE9QX0ZMQUc6CisJY2FzZSBPUF9GTEFHX09VVFBVVDoKKwkgIGlmIChPUFtpXSA9PSAwKQorCSAgICBzcHJpbnRmIChwLCAiJXNmMCIsIGNvbW1hKTsKKworCSAgZWxzZSBpZiAoT1BbaV0gPT0gMSkKKwkgICAgc3ByaW50ZiAocCwgIiVzZjEiLCBjb21tYSk7CisKKwkgIGVsc2UKKwkgICAgc3ByaW50ZiAocCwgIiVzYyIsIGNvbW1hKTsKKworCSAgcCArPSBzdHJsZW4gKHApOworCSAgY29tbWEgPSAiLCI7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGlmICgoZDEwdl9kZWJ1ZyAmIERFQlVHX1ZBTFVFUykgPT0gMCkKKyAgICB7CisgICAgICAqcCsrID0gJ1xuJzsKKyAgICAgICpwID0gJ1wwJzsKKyAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIiVzIiwgYnVmKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqcCA9ICdcMCc7CisgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIlLSpzIiwgU0laRV9PUEVSQU5EUywgYnVmKTsKKworICAgICAgcCA9IGJ1ZjsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJeworCSAgYnVmWzBdID0gJ1wwJzsKKwkgIHN3aXRjaCAoaW5baV0pCisJICAgIHsKKwkgICAgY2FzZSBPUF9WT0lEOgorCSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIiUqcyIsIFNJWkVfVkFMVUVTLCAiIik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBPUF9SRUdfT1VUUFVUOgorCSAgICBjYXNlIE9QX0RSRUdfT1VUUFVUOgorCSAgICBjYXNlIE9QX0NSX09VVFBVVDoKKwkgICAgY2FzZSBPUF9BQ0NVTV9PVVRQVVQ6CisJICAgIGNhc2UgT1BfRkxBR19PVVRQVVQ6CisJICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiJSpzIiwgU0laRV9WQUxVRVMsICItLS0iKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIE9QX1JFRzoKKwkgICAgY2FzZSBPUF9NRU1SRUY6CisJICAgIGNhc2UgT1BfUE9TVERFQzoKKwkgICAgY2FzZSBPUF9QT1NUSU5DOgorCSAgICBjYXNlIE9QX1BSRURFQzoKKwkgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIlKnMweCUuNHgiLCBTSVpFX1ZBTFVFUy02LCAiIiwKKwkJCQkJCSAodWludDE2KSBHUFIgKE9QW2ldKSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBPUF9EUkVHOgorCSAgICAgIHRtcCA9IChsb25nKSgoKCh1aW50MzIpIEdQUiAoT1BbaV0pKSA8PCAxNikgfCAoKHVpbnQzMikgR1BSIChPUFtpXSArIDEpKSk7CisJICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiJSpzMHglLjhseCIsIFNJWkVfVkFMVUVTLTEwLCAiIiwgdG1wKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIE9QX0NSOgorCSAgICBjYXNlIE9QX0NSX1JFVkVSU0U6CisJICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiJSpzMHglLjR4IiwgU0laRV9WQUxVRVMtNiwgIiIsCisJCQkJCQkgKHVpbnQxNikgQ1JFRyAoT1BbaV0pKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIE9QX0FDQ1VNOgorCSAgICBjYXNlIE9QX0FDQ1VNX1JFVkVSU0U6CisJICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiJSpzMHglLjJ4JS44bHgiLCBTSVpFX1ZBTFVFUy0xMiwgIiIsCisJCQkJCQkgKChpbnQpKEFDQyAoT1BbaV0pID4+IDMyKSAmIDB4ZmYpLAorCQkJCQkJICgodW5zaWduZWQgbG9uZykgQUNDIChPUFtpXSkpICYgMHhmZmZmZmZmZik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBPUF9DT05TVEFOVDE2OgorCSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIiUqczB4JS40eCIsIFNJWkVfVkFMVUVTLTYsICIiLAorCQkJCQkJICh1aW50MTYpT1BbaV0pOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgT1BfQ09OU1RBTlQ0OgorCSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIiUqczB4JS40eCIsIFNJWkVfVkFMVUVTLTYsICIiLAorCQkJCQkJICh1aW50MTYpU0VYVDQoT1BbaV0pKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIE9QX0NPTlNUQU5UODoKKwkgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIlKnMweCUuNHgiLCBTSVpFX1ZBTFVFUy02LCAiIiwKKwkJCQkJCSAodWludDE2KVNFWFQ4KE9QW2ldKSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBPUF9DT05TVEFOVDM6CisJICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiJSpzMHglLjR4IiwgU0laRV9WQUxVRVMtNiwgIiIsCisJCQkJCQkgKHVpbnQxNilTRVhUMyhPUFtpXSkpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgT1BfRkxBRzoKKwkgICAgICBpZiAoT1BbaV0gPT0gMCkKKwkJKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiJSpzRjAgPSAlZCIsIFNJWkVfVkFMVUVTLTYsICIiLAorCQkJCQkJICAgUFNXX0YwICE9IDApOworCisJICAgICAgZWxzZSBpZiAoT1BbaV0gPT0gMSkKKwkJKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiJSpzRjEgPSAlZCIsIFNJWkVfVkFMVUVTLTYsICIiLAorCQkJCQkJICAgUFNXX0YxICE9IDApOworCisJICAgICAgZWxzZQorCQkoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIlKnNDID0gJWQiLCBTSVpFX1ZBTFVFUy01LCAiIiwKKwkJCQkJCSAgIFBTV19DICE9IDApOworCisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBPUF9NRU1SRUYyOgorCSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIiUqczB4JS40eCIsIFNJWkVfVkFMVUVTLTYsICIiLAorCQkJCQkJICh1aW50MTYpT1BbaV0pOworCSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIiUqczB4JS40eCIsIFNJWkVfVkFMVUVTLTYsICIiLAorCQkJCQkJICh1aW50MTYpR1BSIChPUFtpICsgMV0pKTsKKwkgICAgICBpKys7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBPUF9SMDoKKwkgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIlKnMweCUuNHgiLCBTSVpFX1ZBTFVFUy02LCAiIiwKKwkJCQkJCSAodWludDE2KSBHUFIgKDApKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIE9QX1IxOgorCSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIiUqczB4JS40eCIsIFNJWkVfVkFMVUVTLTYsICIiLAorCQkJCQkJICh1aW50MTYpIEdQUiAoMSkpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgT1BfUjI6CisJICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiJSpzMHglLjR4IiwgU0laRV9WQUxVRVMtNiwgIiIsCisJCQkJCQkgKHVpbnQxNikgR1BSICgyKSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgfQorCX0KKyAgICB9CisKKyAgKCpkMTB2X2NhbGxiYWNrLT5mbHVzaF9zdGRvdXQpIChkMTB2X2NhbGxiYWNrKTsKK30KKworc3RhdGljIHZvaWQKK2RvX3RyYWNlX291dHB1dF9mbHVzaCAodm9pZCkKK3sKKyAgKCpkMTB2X2NhbGxiYWNrLT5mbHVzaF9zdGRvdXQpIChkMTB2X2NhbGxiYWNrKTsKK30KKworc3RhdGljIHZvaWQKK2RvX3RyYWNlX291dHB1dF9maW5pc2ggKHZvaWQpCit7CisgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywKKwkJCQkgICAgICIgRjA9JWQgRjE9JWQgQz0lZFxuIiwKKwkJCQkgICAgIChTdGF0ZS50cmFjZS5wc3cgJiBQU1dfRjBfQklUKSAhPSAwLAorCQkJCSAgICAgKFN0YXRlLnRyYWNlLnBzdyAmIFBTV19GMV9CSVQpICE9IDAsCisJCQkJICAgICAoU3RhdGUudHJhY2UucHN3ICYgUFNXX0NfQklUKSAhPSAwKTsKKyAgKCpkMTB2X2NhbGxiYWNrLT5mbHVzaF9zdGRvdXQpIChkMTB2X2NhbGxiYWNrKTsKK30KKworc3RhdGljIHZvaWQKK3RyYWNlX291dHB1dF80MCAodWludDY0IHZhbCkKK3sKKyAgaWYgKChkMTB2X2RlYnVnICYgKERFQlVHX1RSQUNFIHwgREVCVUdfVkFMVUVTKSkgPT0gKERFQlVHX1RSQUNFIHwgREVCVUdfVkFMVUVTKSkKKyAgICB7CisgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssCisJCQkJCSAiIDo6ICUqczB4JS4yeCUuOGx4IiwKKwkJCQkJIFNJWkVfVkFMVUVTIC0gMTIsCisJCQkJCSAiIiwKKwkJCQkJICgoaW50KSh2YWwgPj4gMzIpICYgMHhmZiksCisJCQkJCSAoKHVuc2lnbmVkIGxvbmcpIHZhbCkgJiAweGZmZmZmZmZmKTsKKyAgICAgIGRvX3RyYWNlX291dHB1dF9maW5pc2ggKCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAordHJhY2Vfb3V0cHV0XzMyICh1aW50MzIgdmFsKQoreworICBpZiAoKGQxMHZfZGVidWcgJiAoREVCVUdfVFJBQ0UgfCBERUJVR19WQUxVRVMpKSA9PSAoREVCVUdfVFJBQ0UgfCBERUJVR19WQUxVRVMpKQorICAgIHsKKyAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywKKwkJCQkJICIgOjogJSpzMHglLjh4IiwKKwkJCQkJIFNJWkVfVkFMVUVTIC0gMTAsCisJCQkJCSAiIiwKKwkJCQkJIChpbnQpIHZhbCk7CisgICAgICBkb190cmFjZV9vdXRwdXRfZmluaXNoICgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3RyYWNlX291dHB1dF8xNiAodWludDE2IHZhbCkKK3sKKyAgaWYgKChkMTB2X2RlYnVnICYgKERFQlVHX1RSQUNFIHwgREVCVUdfVkFMVUVTKSkgPT0gKERFQlVHX1RSQUNFIHwgREVCVUdfVkFMVUVTKSkKKyAgICB7CisgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssCisJCQkJCSAiIDo6ICUqczB4JS40eCIsCisJCQkJCSBTSVpFX1ZBTFVFUyAtIDYsCisJCQkJCSAiIiwKKwkJCQkJIChpbnQpIHZhbCk7CisgICAgICBkb190cmFjZV9vdXRwdXRfZmluaXNoICgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3RyYWNlX291dHB1dF92b2lkICgpCit7CisgIGlmICgoZDEwdl9kZWJ1ZyAmIChERUJVR19UUkFDRSB8IERFQlVHX1ZBTFVFUykpID09IChERUJVR19UUkFDRSB8IERFQlVHX1ZBTFVFUykpCisgICAgeworICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiXG4iKTsKKyAgICAgIGRvX3RyYWNlX291dHB1dF9mbHVzaCAoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit0cmFjZV9vdXRwdXRfZmxhZyAoKQoreworICBpZiAoKGQxMHZfZGVidWcgJiAoREVCVUdfVFJBQ0UgfCBERUJVR19WQUxVRVMpKSA9PSAoREVCVUdfVFJBQ0UgfCBERUJVR19WQUxVRVMpKQorICAgIHsKKyAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywKKwkJCQkJICIgOjogJSpzIiwKKwkJCQkJIFNJWkVfVkFMVUVTLAorCQkJCQkgIiIpOworICAgICAgZG9fdHJhY2Vfb3V0cHV0X2ZpbmlzaCAoKTsKKyAgICB9Cit9CisKKworCisKKyNlbHNlCisjZGVmaW5lIHRyYWNlX2lucHV0KE5BTUUsIElOMSwgSU4yLCBJTjMpCisjZGVmaW5lIHRyYWNlX291dHB1dChSRVNVTFQpCisjZW5kaWYKKworLyogYWJzICovCit2b2lkCitPUF80NjA3ICgpCit7CisgIGludDE2IHRtcDsKKyAgdHJhY2VfaW5wdXQgKCJhYnMiLCBPUF9SRUcsIE9QX1ZPSUQsIE9QX1ZPSUQpOworICBTRVRfUFNXX0YxIChQU1dfRjApOworICB0bXAgPSBHUFIoT1BbMF0pOworICBpZiAodG1wIDwgMCkKKyAgICB7CisgICAgICB0bXAgPSAtIHRtcDsKKyAgICAgIFNFVF9QU1dfRjAgKDEpOworICAgIH0KKyAgZWxzZQorICAgIFNFVF9QU1dfRjAgKDApOworICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBhYnMgKi8KK3ZvaWQKK09QXzU2MDcgKCkKK3sKKyAgaW50NjQgdG1wOworICB0cmFjZV9pbnB1dCAoImFicyIsIE9QX0FDQ1VNLCBPUF9WT0lELCBPUF9WT0lEKTsKKyAgU0VUX1BTV19GMSAoUFNXX0YwKTsKKworICB0bXAgPSBTRVhUNDAgKEFDQyAoT1BbMF0pKTsKKyAgaWYgKHRtcCA8IDAgKQorICAgIHsKKyAgICAgIHRtcCA9IC0gdG1wOworICAgICAgaWYgKFBTV19TVCkKKwl7CisJICBpZiAodG1wID4gU0VYVDQwKE1BWDMyKSkKKwkgICAgdG1wID0gKE1BWDMyKTsKKwkgIGVsc2UgaWYgKHRtcCA8IFNFWFQ0MChNSU4zMikpCisJICAgIHRtcCA9IChNSU4zMik7CisJICBlbHNlCisJICAgIHRtcCA9ICh0bXAgJiBNQVNLNDApOworCX0KKyAgICAgIGVsc2UKKwl0bXAgPSAodG1wICYgTUFTSzQwKTsKKyAgICAgIFNFVF9QU1dfRjAgKDEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHRtcCA9ICh0bXAgJiBNQVNLNDApOworICAgICAgU0VUX1BTV19GMCAoMCk7CisgICAgfQorICBTRVRfQUNDIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOworfQorCisvKiBhZGQgKi8KK3ZvaWQKK09QXzIwMCAoKQoreworICB1aW50MTYgYSA9IEdQUiAoT1BbMF0pOworICB1aW50MTYgYiA9IEdQUiAoT1BbMV0pOworICB1aW50MTYgdG1wID0gKGEgKyBiKTsKKyAgdHJhY2VfaW5wdXQgKCJhZGQiLCBPUF9SRUcsIE9QX1JFRywgT1BfVk9JRCk7CisgIFNFVF9QU1dfQyAoYSA+IHRtcCk7CisgIFNFVF9HUFIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Cit9CisKKy8qIGFkZCAqLwordm9pZAorT1BfMTIwMSAoKQoreworICBpbnQ2NCB0bXA7CisgIHRtcCA9IFNFWFQ0MChBQ0MgKE9QWzBdKSkgKyAoU0VYVDE2IChHUFIgKE9QWzFdKSkgPDwgMTYgfCBHUFIgKE9QWzFdICsgMSkpOworCisgIHRyYWNlX2lucHV0ICgiYWRkIiwgT1BfQUNDVU0sIE9QX1JFRywgT1BfVk9JRCk7CisgIGlmIChQU1dfU1QpCisgICAgeworICAgICAgaWYgKHRtcCA+IFNFWFQ0MChNQVgzMikpCisJdG1wID0gKE1BWDMyKTsKKyAgICAgIGVsc2UgaWYgKHRtcCA8IFNFWFQ0MChNSU4zMikpCisJdG1wID0gKE1JTjMyKTsKKyAgICAgIGVsc2UKKwl0bXAgPSAodG1wICYgTUFTSzQwKTsKKyAgICB9CisgIGVsc2UKKyAgICB0bXAgPSAodG1wICYgTUFTSzQwKTsKKyAgU0VUX0FDQyAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF80MCAodG1wKTsKK30KKworLyogYWRkICovCit2b2lkCitPUF8xMjAzICgpCit7CisgIGludDY0IHRtcDsKKyAgdG1wID0gU0VYVDQwKEFDQyAoT1BbMF0pKSArIFNFWFQ0MChBQ0MgKE9QWzFdKSk7CisKKyAgdHJhY2VfaW5wdXQgKCJhZGQiLCBPUF9BQ0NVTSwgT1BfQUNDVU0sIE9QX1ZPSUQpOworICBpZiAoUFNXX1NUKQorICAgIHsKKyAgICAgIGlmICh0bXAgPiBTRVhUNDAoTUFYMzIpKQorCXRtcCA9IChNQVgzMik7CisgICAgICBlbHNlIGlmICh0bXAgPCBTRVhUNDAoTUlOMzIpKQorCXRtcCA9IChNSU4zMik7CisgICAgICBlbHNlCisJdG1wID0gKHRtcCAmIE1BU0s0MCk7CisgICAgfQorICBlbHNlCisgICAgdG1wID0gKHRtcCAmIE1BU0s0MCk7CisgIFNFVF9BQ0MgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Cit9CisKKy8qIGFkZDJ3ICovCit2b2lkCitPUF8xMjAwICgpCit7CisgIHVpbnQzMiB0bXA7CisgIHVpbnQzMiBhID0gKEdQUiAoT1BbMF0pKSA8PCAxNiB8IEdQUiAoT1BbMF0gKyAxKTsKKyAgdWludDMyIGIgPSAoR1BSIChPUFsxXSkpIDw8IDE2IHwgR1BSIChPUFsxXSArIDEpOworICB0cmFjZV9pbnB1dCAoImFkZDJ3IiwgT1BfRFJFRywgT1BfRFJFRywgT1BfVk9JRCk7CisgIHRtcCA9IGEgKyBiOworICBTRVRfUFNXX0MgKHRtcCA8IGEpOworICBTRVRfR1BSIChPUFswXSArIDAsICh0bXAgPj4gMTYpKTsKKyAgU0VUX0dQUiAoT1BbMF0gKyAxLCAodG1wICYgMHhGRkZGKSk7CisgIHRyYWNlX291dHB1dF8zMiAodG1wKTsKK30KKworLyogYWRkMyAqLwordm9pZAorT1BfMTAwMDAwMCAoKQoreworICB1aW50MTYgYSA9IEdQUiAoT1BbMV0pOworICB1aW50MTYgYiA9IE9QWzJdOworICB1aW50MTYgdG1wID0gKGEgKyBiKTsKKyAgdHJhY2VfaW5wdXQgKCJhZGQzIiwgT1BfUkVHX09VVFBVVCwgT1BfUkVHLCBPUF9DT05TVEFOVDE2KTsKKyAgU0VUX1BTV19DICh0bXAgPCBhKTsKKyAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF8xNiAodG1wKTsKK30KKworLyogYWRkYWMzICovCit2b2lkCitPUF8xNzAwMDIwMCAoKQoreworICBpbnQ2NCB0bXA7CisgIHRtcCA9IFNFWFQ0MChBQ0MgKE9QWzJdKSkgKyBTRVhUNDAgKChHUFIgKE9QWzFdKSA8PCAxNikgfCBHUFIgKE9QWzFdICsgMSkpOworCisgIHRyYWNlX2lucHV0ICgiYWRkYWMzIiwgT1BfRFJFR19PVVRQVVQsIE9QX0RSRUcsIE9QX0FDQ1VNKTsKKyAgU0VUX0dQUiAoT1BbMF0gKyAwLCAoKHRtcCA+PiAxNikgJiAweGZmZmYpKTsKKyAgU0VUX0dQUiAoT1BbMF0gKyAxLCAodG1wICYgMHhmZmZmKSk7CisgIHRyYWNlX291dHB1dF8zMiAodG1wKTsKK30KKworLyogYWRkYWMzICovCit2b2lkCitPUF8xNzAwMDIwMiAoKQoreworICBpbnQ2NCB0bXA7CisgIHRtcCA9IFNFWFQ0MChBQ0MgKE9QWzFdKSkgKyBTRVhUNDAoQUNDIChPUFsyXSkpOworCisgIHRyYWNlX2lucHV0ICgiYWRkYWMzIiwgT1BfRFJFR19PVVRQVVQsIE9QX0FDQ1VNLCBPUF9BQ0NVTSk7CisgIFNFVF9HUFIgKE9QWzBdICsgMCwgKHRtcCA+PiAxNikgJiAweGZmZmYpOworICBTRVRfR1BSIChPUFswXSArIDEsIHRtcCAmIDB4ZmZmZik7CisgIHRyYWNlX291dHB1dF8zMiAodG1wKTsKK30KKworLyogYWRkYWMzcyAqLwordm9pZAorT1BfMTcwMDEyMDAgKCkKK3sKKyAgaW50NjQgdG1wOworICBTRVRfUFNXX0YxIChQU1dfRjApOworCisgIHRyYWNlX2lucHV0ICgiYWRkYWMzcyIsIE9QX0RSRUdfT1VUUFVULCBPUF9EUkVHLCBPUF9BQ0NVTSk7CisgIHRtcCA9IFNFWFQ0MCAoQUNDIChPUFsyXSkpICsgU0VYVDQwICgoR1BSIChPUFsxXSkgPDwgMTYpIHwgR1BSIChPUFsxXSArIDEpKTsKKyAgaWYgKHRtcCA+IFNFWFQ0MChNQVgzMikpCisgICAgeworICAgICAgdG1wID0gKE1BWDMyKTsKKyAgICAgIFNFVF9QU1dfRjAgKDEpOworICAgIH0gICAgICAKKyAgZWxzZSBpZiAodG1wIDwgU0VYVDQwKE1JTjMyKSkKKyAgICB7CisgICAgICB0bXAgPSAoTUlOMzIpOworICAgICAgU0VUX1BTV19GMCAoMSk7CisgICAgfSAgICAgIAorICBlbHNlCisgICAgeworICAgICAgU0VUX1BTV19GMCAoMCk7CisgICAgfSAgICAgIAorICBTRVRfR1BSIChPUFswXSArIDAsICh0bXAgPj4gMTYpICYgMHhmZmZmKTsKKyAgU0VUX0dQUiAoT1BbMF0gKyAxLCAodG1wICYgMHhmZmZmKSk7CisgIHRyYWNlX291dHB1dF8zMiAodG1wKTsKK30KKworLyogYWRkYWMzcyAqLwordm9pZAorT1BfMTcwMDEyMDIgKCkKK3sKKyAgaW50NjQgdG1wOworICBTRVRfUFNXX0YxIChQU1dfRjApOworCisgIHRyYWNlX2lucHV0ICgiYWRkYWMzcyIsIE9QX0RSRUdfT1VUUFVULCBPUF9BQ0NVTSwgT1BfQUNDVU0pOworICB0bXAgPSBTRVhUNDAoQUNDIChPUFsxXSkpICsgU0VYVDQwKEFDQyAoT1BbMl0pKTsKKyAgaWYgKHRtcCA+IFNFWFQ0MChNQVgzMikpCisgICAgeworICAgICAgdG1wID0gKE1BWDMyKTsKKyAgICAgIFNFVF9QU1dfRjAgKDEpOworICAgIH0gICAgICAKKyAgZWxzZSBpZiAodG1wIDwgU0VYVDQwKE1JTjMyKSkKKyAgICB7CisgICAgICB0bXAgPSAoTUlOMzIpOworICAgICAgU0VUX1BTV19GMCAoMSk7CisgICAgfSAgICAgIAorICBlbHNlCisgICAgeworICAgICAgU0VUX1BTV19GMCAoMCk7CisgICAgfSAgICAgIAorICBTRVRfR1BSIChPUFswXSArIDAsICh0bXAgPj4gMTYpICYgMHhmZmZmKTsKKyAgU0VUX0dQUiAoT1BbMF0gKyAxLCAodG1wICYgMHhmZmZmKSk7CisgIHRyYWNlX291dHB1dF8zMiAodG1wKTsKK30KKworLyogYWRkaSAqLwordm9pZAorT1BfMjAxICgpCit7CisgIHVpbnQxNiBhID0gR1BSIChPUFswXSk7CisgIHVpbnQxNiBiOworICB1aW50MTYgdG1wOworICBpZiAoT1BbMV0gPT0gMCkKKyAgICBPUFsxXSA9IDE2OworICBiID0gT1BbMV07CisgIHRtcCA9IChhICsgYik7CisgIHRyYWNlX2lucHV0ICgiYWRkaSIsIE9QX1JFRywgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCk7CisgIFNFVF9QU1dfQyAodG1wIDwgYSk7CisgIFNFVF9HUFIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Cit9CisKKy8qIGFuZCAqLwordm9pZAorT1BfQzAwICgpCit7CisgIHVpbnQxNiB0bXAgPSBHUFIgKE9QWzBdKSAmIEdQUiAoT1BbMV0pOworICB0cmFjZV9pbnB1dCAoImFuZCIsIE9QX1JFRywgT1BfUkVHLCBPUF9WT0lEKTsKKyAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF8xNiAodG1wKTsKK30KKworLyogYW5kMyAqLwordm9pZAorT1BfNjAwMDAwMCAoKQoreworICB1aW50MTYgdG1wID0gR1BSIChPUFsxXSkgJiBPUFsyXTsKKyAgdHJhY2VfaW5wdXQgKCJhbmQzIiwgT1BfUkVHX09VVFBVVCwgT1BfUkVHLCBPUF9DT05TVEFOVDE2KTsKKyAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF8xNiAodG1wKTsKK30KKworLyogYmNscmkgKi8KK3ZvaWQKK09QX0MwMSAoKQoreworICBpbnQxNiB0bXA7CisgIHRyYWNlX2lucHV0ICgiYmNscmkiLCBPUF9SRUcsIE9QX0NPTlNUQU5UMTYsIE9QX1ZPSUQpOworICB0bXAgPSAoR1BSIChPUFswXSkgJn4oMHg4MDAwID4+IE9QWzFdKSk7CisgIFNFVF9HUFIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Cit9CisKKy8qIGJsLnMgKi8KK3ZvaWQKK09QXzQ5MDAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJibC5zIiwgT1BfQ09OU1RBTlQ4LCBPUF9SMCwgT1BfUjEpOworICBTRVRfR1BSICgxMywgUEMgKyAxKTsKKyAgSk1QKCBQQyArIFNFWFQ4IChPUFswXSkpOworICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKK30KKworLyogYmwubCAqLwordm9pZAorT1BfMjQ4MDAwMDAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJibC5sIiwgT1BfQ09OU1RBTlQxNiwgT1BfUjAsIE9QX1IxKTsKKyAgU0VUX0dQUiAoMTMsIChQQyArIDEpKTsKKyAgSk1QIChQQyArIE9QWzBdKTsKKyAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Cit9CisKKy8qIGJub3RpICovCit2b2lkCitPUF9BMDEgKCkKK3sKKyAgaW50MTYgdG1wOworICB0cmFjZV9pbnB1dCAoImJub3RpIiwgT1BfUkVHLCBPUF9DT05TVEFOVDE2LCBPUF9WT0lEKTsKKyAgdG1wID0gKEdQUiAoT1BbMF0pIF4gKDB4ODAwMCA+PiBPUFsxXSkpOworICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBicmEucyAqLwordm9pZAorT1BfNDgwMCAoKQoreworICB0cmFjZV9pbnB1dCAoImJyYS5zIiwgT1BfQ09OU1RBTlQ4LCBPUF9WT0lELCBPUF9WT0lEKTsKKyAgSk1QIChQQyArIFNFWFQ4IChPUFswXSkpOworICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKK30KKworLyogYnJhLmwgKi8KK3ZvaWQKK09QXzI0MDAwMDAwICgpCit7CisgIHRyYWNlX2lucHV0ICgiYnJhLmwiLCBPUF9DT05TVEFOVDE2LCBPUF9WT0lELCBPUF9WT0lEKTsKKyAgSk1QIChQQyArIE9QWzBdKTsKKyAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Cit9CisKKy8qIGJyZjBmLnMgKi8KK3ZvaWQKK09QXzRBMDAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJicmYwZi5zIiwgT1BfQ09OU1RBTlQ4LCBPUF9WT0lELCBPUF9WT0lEKTsKKyAgaWYgKCFQU1dfRjApCisgICAgSk1QIChQQyArIFNFWFQ4IChPUFswXSkpOworICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKK30KKworLyogYnJmMGYubCAqLwordm9pZAorT1BfMjUwMDAwMDAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJicmYwZi5sIiwgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCwgT1BfVk9JRCk7CisgIGlmICghUFNXX0YwKQorICAgIEpNUCAoUEMgKyBPUFswXSk7CisgIHRyYWNlX291dHB1dF9mbGFnICgpOworfQorCisvKiBicmYwdC5zICovCit2b2lkCitPUF80QjAwICgpCit7CisgIHRyYWNlX2lucHV0ICgiYnJmMHQucyIsIE9QX0NPTlNUQU5UOCwgT1BfVk9JRCwgT1BfVk9JRCk7CisgIGlmIChQU1dfRjApCisgICAgSk1QIChQQyArIFNFWFQ4IChPUFswXSkpOworICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKK30KKworLyogYnJmMHQubCAqLwordm9pZAorT1BfMjU4MDAwMDAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJicmYwdC5sIiwgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCwgT1BfVk9JRCk7CisgIGlmIChQU1dfRjApCisgICAgSk1QIChQQyArIE9QWzBdKTsKKyAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Cit9CisKKy8qIGJzZXRpICovCit2b2lkCitPUF84MDEgKCkKK3sKKyAgaW50MTYgdG1wOworICB0cmFjZV9pbnB1dCAoImJzZXRpIiwgT1BfUkVHLCBPUF9DT05TVEFOVDE2LCBPUF9WT0lEKTsKKyAgdG1wID0gKEdQUiAoT1BbMF0pIHwgKDB4ODAwMCA+PiBPUFsxXSkpOworICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBidHN0aSAqLwordm9pZAorT1BfRTAxICgpCit7CisgIHRyYWNlX2lucHV0ICgiYnRzdGkiLCBPUF9SRUcsIE9QX0NPTlNUQU5UMTYsIE9QX1ZPSUQpOworICBTRVRfUFNXX0YxIChQU1dfRjApOworICBTRVRfUFNXX0YwICgoR1BSIChPUFswXSkgJiAoMHg4MDAwID4+IE9QWzFdKSkgPyAxIDogMCk7CisgIHRyYWNlX291dHB1dF9mbGFnICgpOworfQorCisvKiBjbHJhYyAqLwordm9pZAorT1BfNTYwMSAoKQoreworICB0cmFjZV9pbnB1dCAoImNscmFjIiwgT1BfQUNDVU1fT1VUUFVULCBPUF9WT0lELCBPUF9WT0lEKTsKKyAgU0VUX0FDQyAoT1BbMF0sIDApOworICB0cmFjZV9vdXRwdXRfNDAgKDApOworfQorCisvKiBjbXAgKi8KK3ZvaWQKK09QXzYwMCAoKQoreworICB0cmFjZV9pbnB1dCAoImNtcCIsIE9QX1JFRywgT1BfUkVHLCBPUF9WT0lEKTsKKyAgU0VUX1BTV19GMSAoUFNXX0YwKTsKKyAgU0VUX1BTV19GMCAoKChpbnQxNikoR1BSIChPUFswXSkpIDwgKGludDE2KShHUFIgKE9QWzFdKSkpID8gMSA6IDApOworICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKK30KKworLyogY21wICovCit2b2lkCitPUF8xNjAzICgpCit7CisgIHRyYWNlX2lucHV0ICgiY21wIiwgT1BfQUNDVU0sIE9QX0FDQ1VNLCBPUF9WT0lEKTsKKyAgU0VUX1BTV19GMSAoUFNXX0YwKTsKKyAgU0VUX1BTV19GMCAoKFNFWFQ0MChBQ0MgKE9QWzBdKSkgPCBTRVhUNDAoQUNDIChPUFsxXSkpKSA/IDEgOiAwKTsKKyAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Cit9CisKKy8qIGNtcGVxICovCit2b2lkCitPUF80MDAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJjbXBlcSIsIE9QX1JFRywgT1BfUkVHLCBPUF9WT0lEKTsKKyAgU0VUX1BTV19GMSAoUFNXX0YwKTsKKyAgU0VUX1BTV19GMCAoKEdQUiAoT1BbMF0pID09IEdQUiAoT1BbMV0pKSA/IDEgOiAwKTsKKyAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Cit9CisKKy8qIGNtcGVxICovCit2b2lkCitPUF8xNDAzICgpCit7CisgIHRyYWNlX2lucHV0ICgiY21wZXEiLCBPUF9BQ0NVTSwgT1BfQUNDVU0sIE9QX1ZPSUQpOworICBTRVRfUFNXX0YxIChQU1dfRjApOworICBTRVRfUFNXX0YwICgoKEFDQyAoT1BbMF0pICYgTUFTSzQwKSA9PSAoQUNDIChPUFsxXSkgJiBNQVNLNDApKSA/IDEgOiAwKTsKKyAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Cit9CisKKy8qIGNtcGVxaS5zICovCit2b2lkCitPUF80MDEgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJjbXBlcWkucyIsIE9QX1JFRywgT1BfQ09OU1RBTlQ0LCBPUF9WT0lEKTsKKyAgU0VUX1BTV19GMSAoUFNXX0YwKTsKKyAgU0VUX1BTV19GMCAoKEdQUiAoT1BbMF0pID09IChyZWdfdCkgU0VYVDQgKE9QWzFdKSkgPyAxIDogMCk7ICAKKyAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Cit9CisKKy8qIGNtcGVxaS5sICovCit2b2lkCitPUF8yMDAwMDAwICgpCit7CisgIHRyYWNlX2lucHV0ICgiY21wZXFpLmwiLCBPUF9SRUcsIE9QX0NPTlNUQU5UMTYsIE9QX1ZPSUQpOworICBTRVRfUFNXX0YxIChQU1dfRjApOworICBTRVRfUFNXX0YwICgoR1BSIChPUFswXSkgPT0gKHJlZ190KU9QWzFdKSA/IDEgOiAwKTsgIAorICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKK30KKworLyogY21waS5zICovCit2b2lkCitPUF82MDEgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJjbXBpLnMiLCBPUF9SRUcsIE9QX0NPTlNUQU5UNCwgT1BfVk9JRCk7CisgIFNFVF9QU1dfRjEgKFBTV19GMCk7CisgIFNFVF9QU1dfRjAgKCgoaW50MTYpKEdQUiAoT1BbMF0pKSA8IChpbnQxNilTRVhUNChPUFsxXSkpID8gMSA6IDApOyAgCisgIHRyYWNlX291dHB1dF9mbGFnICgpOworfQorCisvKiBjbXBpLmwgKi8KK3ZvaWQKK09QXzMwMDAwMDAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJjbXBpLmwiLCBPUF9SRUcsIE9QX0NPTlNUQU5UMTYsIE9QX1ZPSUQpOworICBTRVRfUFNXX0YxIChQU1dfRjApOworICBTRVRfUFNXX0YwICgoKGludDE2KShHUFIgKE9QWzBdKSkgPCAoaW50MTYpKE9QWzFdKSkgPyAxIDogMCk7ICAKKyAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Cit9CisKKy8qIGNtcHUgKi8KK3ZvaWQKK09QXzQ2MDAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJjbXB1IiwgT1BfUkVHLCBPUF9SRUcsIE9QX1ZPSUQpOworICBTRVRfUFNXX0YxIChQU1dfRjApOworICBTRVRfUFNXX0YwICgoR1BSIChPUFswXSkgPCBHUFIgKE9QWzFdKSkgPyAxIDogMCk7ICAKKyAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Cit9CisKKy8qIGNtcHVpICovCit2b2lkCitPUF8yMzAwMDAwMCAoKQoreworICB0cmFjZV9pbnB1dCAoImNtcHVpIiwgT1BfUkVHLCBPUF9DT05TVEFOVDE2LCBPUF9WT0lEKTsKKyAgU0VUX1BTV19GMSAoUFNXX0YwKTsKKyAgU0VUX1BTV19GMCAoKEdQUiAoT1BbMF0pIDwgKHJlZ190KU9QWzFdKSA/IDEgOiAwKTsgIAorICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKK30KKworLyogY3BmZyAqLwordm9pZAorT1BfNEUwOSAoKQoreworICB1aW50OCB2YWw7CisgIAorICB0cmFjZV9pbnB1dCAoImNwZmciLCBPUF9GTEFHX09VVFBVVCwgT1BfRkxBRywgT1BfVk9JRCk7CisgIAorICBpZiAoT1BbMV0gPT0gMCkKKyAgICB2YWwgPSBQU1dfRjA7CisgIGVsc2UgaWYgKE9QWzFdID09IDEpCisgICAgdmFsID0gUFNXX0YxOworICBlbHNlCisgICAgdmFsID0gUFNXX0M7CisgIGlmIChPUFswXSA9PSAwKQorICAgIFNFVF9QU1dfRjAgKHZhbCk7CisgIGVsc2UKKyAgICBTRVRfUFNXX0YxICh2YWwpOworCisgIHRyYWNlX291dHB1dF9mbGFnICgpOworfQorCisvKiBkYnQgKi8KK3ZvaWQKK09QXzVGMjAgKCkKK3sKKyAgLyogZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKGQxMHZfY2FsbGJhY2ssICIqKioqKiBEQlQgKioqKiogIFBDPSV4XG4iLFBDKTsgKi8KKworICAvKiBHREIgdXNlcyB0aGUgaW5zdHJ1Y3Rpb24gcGFpciBgYGRidCB8fCBub3AnJyBhcyBhIGJyZWFrLXBvaW50LgorICAgICBUaGUgY29uZGl0aW9uYWwgYmVsb3cgaXMgZm9yIGVpdGhlciBvZiB0aGUgaW5zdHJ1Y3Rpb24gcGFpcnMKKyAgICAgYGBkYnQgLT4gWFhYJycgb3IgYGBkYnQgPC0gWFhYJycgYW5kIHRyZWF0cyB0aGVtIGFzIGFzIGNhc2VzCisgICAgIHdoZXJlIHRoZSBkYnQgaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIGludGVycHJldGVkLgorCisgICAgIFRoZSBtb2R1bGUgYHNpbS1icmVhaycgcHJvdmlkZXMgYSBtb3JlIGVmZmVjdGl2ZSBtZWNoYW5pc20gZm9yCisgICAgIGRldGVjdGluZyBHREIgcGxhbnRlZCBicmVha3BvaW50cy4gIFRoZSBjb2RlIGJlbG93IG1heSwKKyAgICAgZXZlbnR1YWxseSwgYmUgY2hhbmdlZCB0byB1c2UgdGhhdCBtZWNoYW5pc20uICovCisKKyAgaWYgKFN0YXRlLmluc190eXBlID09IElOU19MRUZUCisgICAgICB8fCBTdGF0ZS5pbnNfdHlwZSA9PSBJTlNfUklHSFQpCisgICAgeworICAgICAgdHJhY2VfaW5wdXQgKCJkYnQiLCBPUF9WT0lELCBPUF9WT0lELCBPUF9WT0lEKTsKKyAgICAgIFNFVF9EUEMgKFBDICsgMSk7CisgICAgICBTRVRfRFBTVyAoUFNXKTsKKyAgICAgIFNFVF9QU1cgKFBTV19ETV9CSVQgfCAoUFNXICYgKFBTV19GMF9CSVQgfCBQU1dfRjFfQklUIHwgUFNXX0NfQklUKSkpOworICAgICAgSk1QIChEQlRfVkVDVE9SX1NUQVJUKTsKKyAgICAgIHRyYWNlX291dHB1dF92b2lkICgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR1RSQVA7CisgICAgfQorfQorCisvKiBkaXZzICovCit2b2lkCitPUF8xNDAwMjgwMCAoKQoreworICB1aW50MTYgZm9vLCB0bXAsIHRtcGY7CisgIHVpbnQxNiBoaTsKKyAgdWludDE2IGxvOworCisgIHRyYWNlX2lucHV0ICgiZGl2cyIsIE9QX0RSRUcsIE9QX1JFRywgT1BfVk9JRCk7CisgIGZvbyA9IChHUFIgKE9QWzBdKSA8PCAxKSB8IChHUFIgKE9QWzBdICsgMSkgPj4gMTUpOworICB0bXAgPSAoaW50MTYpZm9vIC0gKGludDE2KShHUFIgKE9QWzFdKSk7CisgIHRtcGYgPSAoZm9vID49IEdQUiAoT1BbMV0pKSA/IDEgOiAwOworICBoaSA9ICgodG1wZiA9PSAxKSA/IHRtcCA6IGZvbyk7CisgIGxvID0gKChHUFIgKE9QWzBdICsgMSkgPDwgMSkgfCB0bXBmKTsKKyAgU0VUX0dQUiAoT1BbMF0gKyAwLCBoaSk7CisgIFNFVF9HUFIgKE9QWzBdICsgMSwgbG8pOworICB0cmFjZV9vdXRwdXRfMzIgKCgodWludDMyKSBoaSA8PCAxNikgfCBsbyk7Cit9CisKKy8qIGV4ZWYwZiAqLwordm9pZAorT1BfNEUwNCAoKQoreworICB0cmFjZV9pbnB1dCAoImV4ZWYwZiIsIE9QX1ZPSUQsIE9QX1ZPSUQsIE9QX1ZPSUQpOworICBTdGF0ZS5leGUgPSAoUFNXX0YwID09IDApOworICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKK30KKworLyogZXhlZjB0ICovCit2b2lkCitPUF80RTI0ICgpCit7CisgIHRyYWNlX2lucHV0ICgiZXhlZjB0IiwgT1BfVk9JRCwgT1BfVk9JRCwgT1BfVk9JRCk7CisgIFN0YXRlLmV4ZSA9IChQU1dfRjAgIT0gMCk7CisgIHRyYWNlX291dHB1dF9mbGFnICgpOworfQorCisvKiBleGVmMWYgKi8KK3ZvaWQKK09QXzRFNDAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJleGVmMWYiLCBPUF9WT0lELCBPUF9WT0lELCBPUF9WT0lEKTsKKyAgU3RhdGUuZXhlID0gKFBTV19GMSA9PSAwKTsKKyAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Cit9CisKKy8qIGV4ZWYxdCAqLwordm9pZAorT1BfNEU0MiAoKQoreworICB0cmFjZV9pbnB1dCAoImV4ZWYxdCIsIE9QX1ZPSUQsIE9QX1ZPSUQsIE9QX1ZPSUQpOworICBTdGF0ZS5leGUgPSAoUFNXX0YxICE9IDApOworICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKK30KKworLyogZXhlZmFmICovCit2b2lkCitPUF80RTAwICgpCit7CisgIHRyYWNlX2lucHV0ICgiZXhlZmFmIiwgT1BfVk9JRCwgT1BfVk9JRCwgT1BfVk9JRCk7CisgIFN0YXRlLmV4ZSA9IChQU1dfRjAgPT0gMCkgJiAoUFNXX0YxID09IDApOworICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKK30KKworLyogZXhlZmF0ICovCit2b2lkCitPUF80RTAyICgpCit7CisgIHRyYWNlX2lucHV0ICgiZXhlZmF0IiwgT1BfVk9JRCwgT1BfVk9JRCwgT1BfVk9JRCk7CisgIFN0YXRlLmV4ZSA9IChQU1dfRjAgPT0gMCkgJiAoUFNXX0YxICE9IDApOworICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKK30KKworLyogZXhldGFmICovCit2b2lkCitPUF80RTIwICgpCit7CisgIHRyYWNlX2lucHV0ICgiZXhldGFmIiwgT1BfVk9JRCwgT1BfVk9JRCwgT1BfVk9JRCk7CisgIFN0YXRlLmV4ZSA9IChQU1dfRjAgIT0gMCkgJiAoUFNXX0YxID09IDApOworICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKK30KKworLyogZXhldGF0ICovCit2b2lkCitPUF80RTIyICgpCit7CisgIHRyYWNlX2lucHV0ICgiZXhldGF0IiwgT1BfVk9JRCwgT1BfVk9JRCwgT1BfVk9JRCk7CisgIFN0YXRlLmV4ZSA9IChQU1dfRjAgIT0gMCkgJiAoUFNXX0YxICE9IDApOworICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKK30KKworLyogZXhwICovCit2b2lkCitPUF8xNTAwMkEwMCAoKQoreworICB1aW50MzIgdG1wLCBmb287CisgIGludCBpOworCisgIHRyYWNlX2lucHV0ICgiZXhwIiwgT1BfUkVHX09VVFBVVCwgT1BfRFJFRywgT1BfVk9JRCk7CisgIGlmICgoKGludDE2KUdQUiAoT1BbMV0pKSA+PSAwKQorICAgIHRtcCA9IChHUFIgKE9QWzFdKSA8PCAxNikgfCBHUFIgKE9QWzFdICsgMSk7CisgIGVsc2UKKyAgICB0bXAgPSB+KChHUFIgKE9QWzFdKSA8PCAxNikgfCBHUFIgKE9QWzFdICsgMSkpOworICAKKyAgZm9vID0gMHg0MDAwMDAwMDsKKyAgZm9yIChpPTE7aTwxNztpKyspCisgICAgeworICAgICAgaWYgKHRtcCAmIGZvbykKKwl7CisJICBTRVRfR1BSIChPUFswXSwgKGkgLSAxKSk7CisJICB0cmFjZV9vdXRwdXRfMTYgKGkgLSAxKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBmb28gPj49IDE7CisgICAgfQorICBTRVRfR1BSIChPUFswXSwgMTYpOworICB0cmFjZV9vdXRwdXRfMTYgKDE2KTsKK30KKworLyogZXhwICovCit2b2lkCitPUF8xNTAwMkEwMiAoKQoreworICBpbnQ2NCB0bXAsIGZvbzsKKyAgaW50IGk7CisKKyAgdHJhY2VfaW5wdXQgKCJleHAiLCBPUF9SRUdfT1VUUFVULCBPUF9BQ0NVTSwgT1BfVk9JRCk7CisgIHRtcCA9IFNFWFQ0MChBQ0MgKE9QWzFdKSk7CisgIGlmICh0bXAgPCAwKQorICAgIHRtcCA9IH50bXAgJiBNQVNLNDA7CisgIAorICBmb28gPSAweDQwMDAwMDAwMDBMTDsKKyAgZm9yIChpPTE7aTwyNTtpKyspCisgICAgeworICAgICAgaWYgKHRtcCAmIGZvbykKKwl7CisJICBTRVRfR1BSIChPUFswXSwgaSAtIDkpOworCSAgdHJhY2Vfb3V0cHV0XzE2IChpIC0gOSk7CisJICByZXR1cm47CisJfQorICAgICAgZm9vID4+PSAxOworICAgIH0KKyAgU0VUX0dQUiAoT1BbMF0sIDE2KTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICgxNik7Cit9CisKKy8qIGpsICovCit2b2lkCitPUF80RDAwICgpCit7CisgIHRyYWNlX2lucHV0ICgiamwiLCBPUF9SRUcsIE9QX1IwLCBPUF9SMSk7CisgIFNFVF9HUFIgKDEzLCBQQyArIDEpOworICBKTVAgKEdQUiAoT1BbMF0pKTsKKyAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Cit9CisKKy8qIGptcCAqLwordm9pZAorT1BfNEMwMCAoKQoreworICB0cmFjZV9pbnB1dCAoImptcCIsIE9QX1JFRywKKwkgICAgICAgKE9QWzBdID09IDEzKSA/IE9QX1IwIDogT1BfVk9JRCwKKwkgICAgICAgKE9QWzBdID09IDEzKSA/IE9QX1IxIDogT1BfVk9JRCk7CisKKyAgSk1QIChHUFIgKE9QWzBdKSk7CisgIHRyYWNlX291dHB1dF92b2lkICgpOworfQorCisvKiBsZCAqLwordm9pZAorT1BfMzAwMDAwMDAgKCkKK3sKKyAgdWludDE2IHRtcDsKKyAgdHJhY2VfaW5wdXQgKCJsZCIsIE9QX1JFR19PVVRQVVQsIE9QX01FTVJFRjIsIE9QX1ZPSUQpOworICB0bXAgPSBSVyAoT1BbMV0gKyBHUFIgKE9QWzJdKSk7CisgIFNFVF9HUFIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Cit9CisKKy8qIGxkICovCit2b2lkCitPUF82NDAxICgpCit7CisgIHVpbnQxNiB0bXA7CisgIHRyYWNlX2lucHV0ICgibGQiLCBPUF9SRUdfT1VUUFVULCBPUF9QT1NUREVDLCBPUF9WT0lEKTsKKyAgdG1wID0gUlcgKEdQUiAoT1BbMV0pKTsKKyAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7CisgIGlmIChPUFswXSAhPSBPUFsxXSkKKyAgICBJTkNfQUREUiAoT1BbMV0sIC0yKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBsZCAqLwordm9pZAorT1BfNjAwMSAoKQoreworICB1aW50MTYgdG1wOworICB0cmFjZV9pbnB1dCAoImxkIiwgT1BfUkVHX09VVFBVVCwgT1BfUE9TVElOQywgT1BfVk9JRCk7CisgIHRtcCA9IFJXIChHUFIgKE9QWzFdKSk7CisgIFNFVF9HUFIgKE9QWzBdLCB0bXApOworICBpZiAoT1BbMF0gIT0gT1BbMV0pCisgICAgSU5DX0FERFIgKE9QWzFdLCAyKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBsZCAqLwordm9pZAorT1BfNjAwMCAoKQoreworICB1aW50MTYgdG1wOworICB0cmFjZV9pbnB1dCAoImxkIiwgT1BfUkVHX09VVFBVVCwgT1BfTUVNUkVGLCBPUF9WT0lEKTsKKyAgdG1wID0gUlcgKEdQUiAoT1BbMV0pKTsKKyAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF8xNiAodG1wKTsKK30KKworLyogbGQydyAqLwordm9pZAorT1BfMzEwMDAwMDAgKCkKK3sKKyAgaW50MzIgdG1wOworICB1aW50MTYgYWRkciA9IEdQUiAoT1BbMl0pOworICB0cmFjZV9pbnB1dCAoImxkMnciLCBPUF9SRUdfT1VUUFVULCBPUF9NRU1SRUYyLCBPUF9WT0lEKTsKKyAgdG1wID0gUkxXIChPUFsxXSArIGFkZHIpOworICBTRVRfR1BSMzIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMzIgKHRtcCk7Cit9CisKKy8qIGxkMncgKi8KK3ZvaWQKK09QXzY2MDEgKCkKK3sKKyAgdWludDE2IGFkZHIgPSBHUFIgKE9QWzFdKTsKKyAgaW50MzIgdG1wOworICB0cmFjZV9pbnB1dCAoImxkMnciLCBPUF9SRUdfT1VUUFVULCBPUF9QT1NUREVDLCBPUF9WT0lEKTsKKyAgdG1wID0gUkxXIChhZGRyKTsKKyAgU0VUX0dQUjMyIChPUFswXSwgdG1wKTsKKyAgSU5DX0FERFIgKE9QWzFdLCAtNCk7CisgIHRyYWNlX291dHB1dF8zMiAodG1wKTsKK30KKworLyogbGQydyAqLwordm9pZAorT1BfNjIwMSAoKQoreworICBpbnQzMiB0bXA7CisgIHVpbnQxNiBhZGRyID0gR1BSIChPUFsxXSk7CisgIHRyYWNlX2lucHV0ICgibGQydyIsIE9QX1JFR19PVVRQVVQsIE9QX1BPU1RJTkMsIE9QX1ZPSUQpOworICB0bXAgPSBSTFcgKGFkZHIpOworICBTRVRfR1BSMzIgKE9QWzBdLCB0bXApOworICBJTkNfQUREUiAoT1BbMV0sIDQpOworICB0cmFjZV9vdXRwdXRfMzIgKHRtcCk7Cit9CisKKy8qIGxkMncgKi8KK3ZvaWQKK09QXzYyMDAgKCkKK3sKKyAgdWludDE2IGFkZHIgPSBHUFIgKE9QWzFdKTsKKyAgaW50MzIgdG1wOworICB0cmFjZV9pbnB1dCAoImxkMnciLCBPUF9SRUdfT1VUUFVULCBPUF9NRU1SRUYsIE9QX1ZPSUQpOworICB0bXAgPSBSTFcgKGFkZHIgKyAwKTsKKyAgU0VUX0dQUjMyIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzMyICh0bXApOworfQorCisvKiBsZGIgKi8KK3ZvaWQKK09QXzM4MDAwMDAwICgpCit7CisgIGludDE2IHRtcDsKKyAgdHJhY2VfaW5wdXQgKCJsZGIiLCBPUF9SRUdfT1VUUFVULCBPUF9NRU1SRUYyLCBPUF9WT0lEKTsKKyAgdG1wID0gU0VYVDggKFJCIChPUFsxXSArIEdQUiAoT1BbMl0pKSk7CisgIFNFVF9HUFIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Cit9CisKKy8qIGxkYiAqLwordm9pZAorT1BfNzAwMCAoKQoreworICBpbnQxNiB0bXA7CisgIHRyYWNlX2lucHV0ICgibGRiIiwgT1BfUkVHX09VVFBVVCwgT1BfTUVNUkVGLCBPUF9WT0lEKTsKKyAgdG1wID0gU0VYVDggKFJCIChHUFIgKE9QWzFdKSkpOworICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBsZGkucyAqLwordm9pZAorT1BfNDAwMSAoKQoreworICBpbnQxNiB0bXA7CisgIHRyYWNlX2lucHV0ICgibGRpLnMiLCBPUF9SRUdfT1VUUFVULCBPUF9DT05TVEFOVDQsIE9QX1ZPSUQpOworICB0bXAgPSBTRVhUNCAoT1BbMV0pOworICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBsZGkubCAqLwordm9pZAorT1BfMjAwMDAwMDAgKCkKK3sKKyAgaW50MTYgdG1wOworICB0cmFjZV9pbnB1dCAoImxkaS5sIiwgT1BfUkVHX09VVFBVVCwgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCk7CisgIHRtcCA9IE9QWzFdOworICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBsZHViICovCit2b2lkCitPUF8zOTAwMDAwMCAoKQoreworICBpbnQxNiB0bXA7CisgIHRyYWNlX2lucHV0ICgibGR1YiIsIE9QX1JFR19PVVRQVVQsIE9QX01FTVJFRjIsIE9QX1ZPSUQpOworICB0bXAgPSBSQiAoT1BbMV0gKyBHUFIgKE9QWzJdKSk7CisgIFNFVF9HUFIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Cit9CisKKy8qIGxkdWIgKi8KK3ZvaWQKK09QXzcyMDAgKCkKK3sKKyAgaW50MTYgdG1wOworICB0cmFjZV9pbnB1dCAoImxkdWIiLCBPUF9SRUdfT1VUUFVULCBPUF9NRU1SRUYsIE9QX1ZPSUQpOworICB0bXAgPSBSQiAoR1BSIChPUFsxXSkpOworICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBtYWMgKi8KK3ZvaWQKK09QXzJBMDAgKCkKK3sKKyAgaW50NjQgdG1wOworCisgIHRyYWNlX2lucHV0ICgibWFjIiwgT1BfQUNDVU0sIE9QX1JFRywgT1BfUkVHKTsKKyAgdG1wID0gU0VYVDQwICgoaW50MTYpKEdQUiAoT1BbMV0pKSAqIChpbnQxNikoR1BSIChPUFsyXSkpKTsKKworICBpZiAoUFNXX0ZYKQorICAgIHRtcCA9IFNFWFQ0MCggKHRtcCA8PCAxKSAmIE1BU0s0MCk7CisKKyAgaWYgKFBTV19TVCAmJiB0bXAgPiBTRVhUNDAoTUFYMzIpKQorICAgIHRtcCA9IChNQVgzMik7CisKKyAgdG1wICs9IFNFWFQ0MCAoQUNDIChPUFswXSkpOworICBpZiAoUFNXX1NUKQorICAgIHsKKyAgICAgIGlmICh0bXAgPiBTRVhUNDAoTUFYMzIpKQorCXRtcCA9IChNQVgzMik7CisgICAgICBlbHNlIGlmICh0bXAgPCBTRVhUNDAoTUlOMzIpKQorCXRtcCA9IChNSU4zMik7CisgICAgICBlbHNlCisJdG1wID0gKHRtcCAmIE1BU0s0MCk7CisgICAgfQorICBlbHNlCisgICAgdG1wID0gKHRtcCAmIE1BU0s0MCk7CisgIFNFVF9BQ0MgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Cit9CisKKy8qIG1hY3N1ICovCit2b2lkCitPUF8xQTAwICgpCit7CisgIGludDY0IHRtcDsKKworICB0cmFjZV9pbnB1dCAoIm1hY3N1IiwgT1BfQUNDVU0sIE9QX1JFRywgT1BfUkVHKTsKKyAgdG1wID0gU0VYVDQwICgoaW50MTYpIEdQUiAoT1BbMV0pICogR1BSIChPUFsyXSkpOworICBpZiAoUFNXX0ZYKQorICAgIHRtcCA9IFNFWFQ0MCAoKHRtcCA8PCAxKSAmIE1BU0s0MCk7CisgIHRtcCA9ICgoU0VYVDQwIChBQ0MgKE9QWzBdKSkgKyB0bXApICYgTUFTSzQwKTsKKyAgU0VUX0FDQyAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF80MCAodG1wKTsKK30KKworLyogbWFjdSAqLwordm9pZAorT1BfM0EwMCAoKQoreworICB1aW50NjQgdG1wOworICB1aW50MzIgc3JjMTsKKyAgdWludDMyIHNyYzI7CisKKyAgdHJhY2VfaW5wdXQgKCJtYWN1IiwgT1BfQUNDVU0sIE9QX1JFRywgT1BfUkVHKTsKKyAgc3JjMSA9ICh1aW50MTYpIEdQUiAoT1BbMV0pOworICBzcmMyID0gKHVpbnQxNikgR1BSIChPUFsyXSk7CisgIHRtcCA9IHNyYzEgKiBzcmMyOworICBpZiAoUFNXX0ZYKQorICAgIHRtcCA9ICh0bXAgPDwgMSk7CisgIHRtcCA9ICgoQUNDIChPUFswXSkgKyB0bXApICYgTUFTSzQwKTsKKyAgU0VUX0FDQyAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF80MCAodG1wKTsKK30KKworLyogbWF4ICovCit2b2lkCitPUF8yNjAwICgpCit7CisgIGludDE2IHRtcDsKKyAgdHJhY2VfaW5wdXQgKCJtYXgiLCBPUF9SRUcsIE9QX1JFRywgT1BfVk9JRCk7CisgIFNFVF9QU1dfRjEgKFBTV19GMCk7CisgIGlmICgoaW50MTYpIEdQUiAoT1BbMV0pID4gKGludDE2KUdQUiAoT1BbMF0pKQorICAgIHsKKyAgICAgIHRtcCA9IEdQUiAoT1BbMV0pOworICAgICAgU0VUX1BTV19GMCAoMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdG1wID0gR1BSIChPUFswXSk7CisgICAgICBTRVRfUFNXX0YwICgwKTsgICAgCisgICAgfQorICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBtYXggKi8KK3ZvaWQKK09QXzM2MDAgKCkKK3sKKyAgaW50NjQgdG1wOworCisgIHRyYWNlX2lucHV0ICgibWF4IiwgT1BfQUNDVU0sIE9QX0RSRUcsIE9QX1ZPSUQpOworICBTRVRfUFNXX0YxIChQU1dfRjApOworICB0bXAgPSBTRVhUMTYgKEdQUiAoT1BbMV0pKSA8PCAxNiB8IEdQUiAoT1BbMV0gKyAxKTsKKyAgaWYgKHRtcCA+IFNFWFQ0MCAoQUNDIChPUFswXSkpKQorICAgIHsKKyAgICAgIHRtcCA9ICh0bXAgJiBNQVNLNDApOworICAgICAgU0VUX1BTV19GMCAoMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdG1wID0gQUNDIChPUFswXSk7CisgICAgICBTRVRfUFNXX0YwICgwKTsKKyAgICB9CisgIFNFVF9BQ0MgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Cit9CisKKy8qIG1heCAqLwordm9pZAorT1BfMzYwMiAoKQoreworICBpbnQ2NCB0bXA7CisgIHRyYWNlX2lucHV0ICgibWF4IiwgT1BfQUNDVU0sIE9QX0FDQ1VNLCBPUF9WT0lEKTsKKyAgU0VUX1BTV19GMSAoUFNXX0YwKTsKKyAgaWYgKFNFWFQ0MCAoQUNDIChPUFsxXSkpID4gU0VYVDQwIChBQ0MgKE9QWzBdKSkpCisgICAgeworICAgICAgdG1wID0gQUNDIChPUFsxXSk7CisgICAgICBTRVRfUFNXX0YwICgxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB0bXAgPSBBQ0MgKE9QWzBdKTsKKyAgICAgIFNFVF9QU1dfRjAgKDApOworICAgIH0KKyAgU0VUX0FDQyAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF80MCAodG1wKTsKK30KKworCisvKiBtaW4gKi8KK3ZvaWQKK09QXzI2MDEgKCkKK3sKKyAgaW50MTYgdG1wOworICB0cmFjZV9pbnB1dCAoIm1pbiIsIE9QX1JFRywgT1BfUkVHLCBPUF9WT0lEKTsKKyAgU0VUX1BTV19GMSAoUFNXX0YwKTsKKyAgaWYgKChpbnQxNilHUFIgKE9QWzFdKSA8IChpbnQxNilHUFIgKE9QWzBdKSkKKyAgICB7CisgICAgICB0bXAgPSBHUFIgKE9QWzFdKTsKKyAgICAgIFNFVF9QU1dfRjAgKDEpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHRtcCA9IEdQUiAoT1BbMF0pOworICAgICAgU0VUX1BTV19GMCAoMCk7ICAgIAorICAgIH0KKyAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF8xNiAodG1wKTsKK30KKworLyogbWluICovCit2b2lkCitPUF8zNjAxICgpCit7CisgIGludDY0IHRtcDsKKworICB0cmFjZV9pbnB1dCAoIm1pbiIsIE9QX0FDQ1VNLCBPUF9EUkVHLCBPUF9WT0lEKTsKKyAgU0VUX1BTV19GMSAoUFNXX0YwKTsKKyAgdG1wID0gU0VYVDE2IChHUFIgKE9QWzFdKSkgPDwgMTYgfCBHUFIgKE9QWzFdICsgMSk7CisgIGlmICh0bXAgPCBTRVhUNDAoQUNDIChPUFswXSkpKQorICAgIHsKKyAgICAgIHRtcCA9ICh0bXAgJiBNQVNLNDApOworICAgICAgU0VUX1BTV19GMCAoMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdG1wID0gQUNDIChPUFswXSk7CisgICAgICBTRVRfUFNXX0YwICgwKTsKKyAgICB9CisgIFNFVF9BQ0MgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Cit9CisKKy8qIG1pbiAqLwordm9pZAorT1BfMzYwMyAoKQoreworICBpbnQ2NCB0bXA7CisgIHRyYWNlX2lucHV0ICgibWluIiwgT1BfQUNDVU0sIE9QX0FDQ1VNLCBPUF9WT0lEKTsKKyAgU0VUX1BTV19GMSAoUFNXX0YwKTsKKyAgaWYgKFNFWFQ0MChBQ0MgKE9QWzFdKSkgPCBTRVhUNDAoQUNDIChPUFswXSkpKQorICAgIHsKKyAgICAgIHRtcCA9IEFDQyAoT1BbMV0pOworICAgICAgU0VUX1BTV19GMCAoMSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdG1wID0gQUNDIChPUFswXSk7CisgICAgICBTRVRfUFNXX0YwICgwKTsKKyAgICB9CisgIFNFVF9BQ0MgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Cit9CisKKy8qIG1zYiAqLwordm9pZAorT1BfMjgwMCAoKQoreworICBpbnQ2NCB0bXA7CisKKyAgdHJhY2VfaW5wdXQgKCJtc2IiLCBPUF9BQ0NVTSwgT1BfUkVHLCBPUF9SRUcpOworICB0bXAgPSBTRVhUNDAgKChpbnQxNikoR1BSIChPUFsxXSkpICogKGludDE2KShHUFIgKE9QWzJdKSkpOworCisgIGlmIChQU1dfRlgpCisgICAgdG1wID0gU0VYVDQwICgodG1wIDw8IDEpICYgTUFTSzQwKTsKKworICBpZiAoUFNXX1NUICYmIHRtcCA+IFNFWFQ0MChNQVgzMikpCisgICAgdG1wID0gKE1BWDMyKTsKKworICB0bXAgPSBTRVhUNDAoQUNDIChPUFswXSkpIC0gdG1wOworICBpZiAoUFNXX1NUKQorICAgIHsKKyAgICAgIGlmICh0bXAgPiBTRVhUNDAoTUFYMzIpKQorCXRtcCA9IChNQVgzMik7CisgICAgICBlbHNlIGlmICh0bXAgPCBTRVhUNDAoTUlOMzIpKQorCXRtcCA9IChNSU4zMik7CisgICAgICBlbHNlCisJdG1wID0gKHRtcCAmIE1BU0s0MCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdG1wID0gKHRtcCAmIE1BU0s0MCk7CisgICAgfQorICBTRVRfQUNDIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOworfQorCisvKiBtc2JzdSAqLwordm9pZAorT1BfMTgwMCAoKQoreworICBpbnQ2NCB0bXA7CisKKyAgdHJhY2VfaW5wdXQgKCJtc2JzdSIsIE9QX0FDQ1VNLCBPUF9SRUcsIE9QX1JFRyk7CisgIHRtcCA9IFNFWFQ0MCAoKGludDE2KUdQUiAoT1BbMV0pICogR1BSIChPUFsyXSkpOworICBpZiAoUFNXX0ZYKQorICAgIHRtcCA9IFNFWFQ0MCggKHRtcCA8PCAxKSAmIE1BU0s0MCk7CisgIHRtcCA9ICgoU0VYVDQwIChBQ0MgKE9QWzBdKSkgLSB0bXApICYgTUFTSzQwKTsKKyAgU0VUX0FDQyAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF80MCAodG1wKTsKK30KKworLyogbXNidSAqLwordm9pZAorT1BfMzgwMCAoKQoreworICB1aW50NjQgdG1wOworICB1aW50MzIgc3JjMTsKKyAgdWludDMyIHNyYzI7CisKKyAgdHJhY2VfaW5wdXQgKCJtc2J1IiwgT1BfQUNDVU0sIE9QX1JFRywgT1BfUkVHKTsKKyAgc3JjMSA9ICh1aW50MTYpIEdQUiAoT1BbMV0pOworICBzcmMyID0gKHVpbnQxNikgR1BSIChPUFsyXSk7CisgIHRtcCA9IHNyYzEgKiBzcmMyOworICBpZiAoUFNXX0ZYKQorICAgIHRtcCA9ICh0bXAgPDwgMSk7CisgIHRtcCA9ICgoQUNDIChPUFswXSkgLSB0bXApICYgTUFTSzQwKTsKKyAgU0VUX0FDQyAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF80MCAodG1wKTsKK30KKworLyogbXVsICovCit2b2lkCitPUF8yRTAwICgpCit7CisgIGludDE2IHRtcDsKKyAgdHJhY2VfaW5wdXQgKCJtdWwiLCBPUF9SRUcsIE9QX1JFRywgT1BfVk9JRCk7CisgIHRtcCA9IEdQUiAoT1BbMF0pICogR1BSIChPUFsxXSk7CisgIFNFVF9HUFIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Cit9CisKKy8qIG11bHggKi8KK3ZvaWQKK09QXzJDMDAgKCkKK3sKKyAgaW50NjQgdG1wOworCisgIHRyYWNlX2lucHV0ICgibXVseCIsIE9QX0FDQ1VNX09VVFBVVCwgT1BfUkVHLCBPUF9SRUcpOworICB0bXAgPSBTRVhUNDAgKChpbnQxNikoR1BSIChPUFsxXSkpICogKGludDE2KShHUFIgKE9QWzJdKSkpOworCisgIGlmIChQU1dfRlgpCisgICAgdG1wID0gU0VYVDQwICgodG1wIDw8IDEpICYgTUFTSzQwKTsKKworICBpZiAoUFNXX1NUICYmIHRtcCA+IFNFWFQ0MChNQVgzMikpCisgICAgdG1wID0gKE1BWDMyKTsKKyAgZWxzZQorICAgIHRtcCA9ICh0bXAgJiBNQVNLNDApOworICBTRVRfQUNDIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOworfQorCisvKiBtdWx4c3UgKi8KK3ZvaWQKK09QXzFDMDAgKCkKK3sKKyAgaW50NjQgdG1wOworCisgIHRyYWNlX2lucHV0ICgibXVseHN1IiwgT1BfQUNDVU1fT1VUUFVULCBPUF9SRUcsIE9QX1JFRyk7CisgIHRtcCA9IFNFWFQ0MCAoKGludDE2KShHUFIgKE9QWzFdKSkgKiBHUFIgKE9QWzJdKSk7CisKKyAgaWYgKFBTV19GWCkKKyAgICB0bXAgPDw9IDE7CisgIHRtcCA9ICh0bXAgJiBNQVNLNDApOworICBTRVRfQUNDIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOworfQorCisvKiBtdWx4dSAqLwordm9pZAorT1BfM0MwMCAoKQoreworICB1aW50NjQgdG1wOworICB1aW50MzIgc3JjMTsKKyAgdWludDMyIHNyYzI7CisKKyAgdHJhY2VfaW5wdXQgKCJtdWx4dSIsIE9QX0FDQ1VNX09VVFBVVCwgT1BfUkVHLCBPUF9SRUcpOworICBzcmMxID0gKHVpbnQxNikgR1BSIChPUFsxXSk7CisgIHNyYzIgPSAodWludDE2KSBHUFIgKE9QWzJdKTsKKyAgdG1wID0gc3JjMSAqIHNyYzI7CisgIGlmIChQU1dfRlgpCisgICAgdG1wIDw8PSAxOworICB0bXAgPSAodG1wICYgTUFTSzQwKTsKKyAgU0VUX0FDQyAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF80MCAodG1wKTsKK30KKworLyogbXYgKi8KK3ZvaWQKK09QXzQwMDAgKCkKK3sKKyAgaW50MTYgdG1wOworICB0cmFjZV9pbnB1dCAoIm12IiwgT1BfUkVHX09VVFBVVCwgT1BfUkVHLCBPUF9WT0lEKTsKKyAgdG1wID0gR1BSIChPUFsxXSk7CisgIFNFVF9HUFIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Cit9CisKKy8qIG12MncgKi8KK3ZvaWQKK09QXzUwMDAgKCkKK3sKKyAgaW50MzIgdG1wOworICB0cmFjZV9pbnB1dCAoIm12MnciLCBPUF9EUkVHX09VVFBVVCwgT1BfRFJFRywgT1BfVk9JRCk7CisgIHRtcCA9IEdQUjMyIChPUFsxXSk7CisgIFNFVF9HUFIzMiAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF8zMiAodG1wKTsKK30KKworLyogbXYyd2ZhYyAqLwordm9pZAorT1BfM0UwMCAoKQoreworICBpbnQzMiB0bXA7CisgIHRyYWNlX2lucHV0ICgibXYyd2ZhYyIsIE9QX0RSRUdfT1VUUFVULCBPUF9BQ0NVTSwgT1BfVk9JRCk7CisgIHRtcCA9IEFDQyAoT1BbMV0pOworICBTRVRfR1BSMzIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMzIgKHRtcCk7Cit9CisKKy8qIG12Mnd0YWMgKi8KK3ZvaWQKK09QXzNFMDEgKCkKK3sKKyAgaW50NjQgdG1wOworICB0cmFjZV9pbnB1dCAoIm12Mnd0YWMiLCBPUF9EUkVHLCBPUF9BQ0NVTV9PVVRQVVQsIE9QX1ZPSUQpOworICB0bXAgPSAoKFNFWFQxNiAoR1BSIChPUFswXSkpIDw8IDE2IHwgR1BSIChPUFswXSArIDEpKSAmIE1BU0s0MCk7CisgIFNFVF9BQ0MgKE9QWzFdLCB0bXApOworICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Cit9CisKKy8qIG12YWMgKi8KK3ZvaWQKK09QXzNFMDMgKCkKK3sKKyAgaW50NjQgdG1wOworICB0cmFjZV9pbnB1dCAoIm12YWMiLCBPUF9BQ0NVTV9PVVRQVVQsIE9QX0FDQ1VNLCBPUF9WT0lEKTsKKyAgdG1wID0gQUNDIChPUFsxXSk7CisgIFNFVF9BQ0MgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Cit9CisKKy8qIG12YiAqLwordm9pZAorT1BfNTQwMCAoKQoreworICBpbnQxNiB0bXA7CisgIHRyYWNlX2lucHV0ICgibXZiIiwgT1BfUkVHX09VVFBVVCwgT1BfUkVHLCBPUF9WT0lEKTsKKyAgdG1wID0gU0VYVDggKEdQUiAoT1BbMV0pICYgMHhmZik7CisgIFNFVF9HUFIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Cit9CisKKy8qIG12ZjBmICovCit2b2lkCitPUF80NDAwICgpCit7CisgIGludDE2IHRtcDsKKyAgdHJhY2VfaW5wdXQgKCJtZjBmIiwgT1BfUkVHX09VVFBVVCwgT1BfUkVHLCBPUF9WT0lEKTsKKyAgaWYgKFBTV19GMCA9PSAwKQorICAgIHsKKyAgICAgIHRtcCA9IEdQUiAoT1BbMV0pOworICAgICAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7CisgICAgfQorICBlbHNlCisgICAgdG1wID0gR1BSIChPUFswXSk7CisgIHRyYWNlX291dHB1dF8xNiAodG1wKTsKK30KKworLyogbXZmMHQgKi8KK3ZvaWQKK09QXzQ0MDEgKCkKK3sKKyAgaW50MTYgdG1wOworICB0cmFjZV9pbnB1dCAoIm1mMHQiLCBPUF9SRUdfT1VUUFVULCBPUF9SRUcsIE9QX1ZPSUQpOworICBpZiAoUFNXX0YwKQorICAgIHsKKyAgICAgIHRtcCA9IEdQUiAoT1BbMV0pOworICAgICAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7CisgICAgfQorICBlbHNlCisgICAgdG1wID0gR1BSIChPUFswXSk7CisgIHRyYWNlX291dHB1dF8xNiAodG1wKTsKK30KKworLyogbXZmYWNnICovCit2b2lkCitPUF8xRTA0ICgpCit7CisgIGludDE2IHRtcDsKKyAgdHJhY2VfaW5wdXQgKCJtdmZhY2ciLCBPUF9SRUdfT1VUUFVULCBPUF9BQ0NVTSwgT1BfVk9JRCk7CisgIHRtcCA9ICgoQUNDIChPUFsxXSkgPj4gMzIpICYgMHhmZik7CisgIFNFVF9HUFIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Cit9CisKKy8qIG12ZmFjaGkgKi8KK3ZvaWQKK09QXzFFMDAgKCkKK3sKKyAgaW50MTYgdG1wOworICB0cmFjZV9pbnB1dCAoIm12ZmFjaGkiLCBPUF9SRUdfT1VUUFVULCBPUF9BQ0NVTSwgT1BfVk9JRCk7CisgIHRtcCA9IChBQ0MgKE9QWzFdKSA+PiAxNik7ICAKKyAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7ICAKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBtdmZhY2xvICovCit2b2lkCitPUF8xRTAyICgpCit7CisgIGludDE2IHRtcDsKKyAgdHJhY2VfaW5wdXQgKCJtdmZhY2xvIiwgT1BfUkVHX09VVFBVVCwgT1BfQUNDVU0sIE9QX1ZPSUQpOworICB0bXAgPSBBQ0MgKE9QWzFdKTsKKyAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF8xNiAodG1wKTsKK30KKworLyogbXZmYyAqLwordm9pZAorT1BfNTIwMCAoKQoreworICBpbnQxNiB0bXA7CisgIHRyYWNlX2lucHV0ICgibXZmYyIsIE9QX1JFR19PVVRQVVQsIE9QX0NSLCBPUF9WT0lEKTsKKyAgdG1wID0gQ1JFRyAoT1BbMV0pOworICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBtdnRhY2cgKi8KK3ZvaWQKK09QXzFFNDEgKCkKK3sKKyAgaW50NjQgdG1wOworICB0cmFjZV9pbnB1dCAoIm12dGFjZyIsIE9QX1JFRywgT1BfQUNDVU0sIE9QX1ZPSUQpOworICB0bXAgPSAoKEFDQyAoT1BbMV0pICYgTUFTSzMyKQorCSB8ICgoaW50NjQpKEdQUiAoT1BbMF0pICYgMHhmZikgPDwgMzIpKTsKKyAgU0VUX0FDQyAoT1BbMV0sIHRtcCk7CisgIHRyYWNlX291dHB1dF80MCAodG1wKTsKK30KKworLyogbXZ0YWNoaSAqLwordm9pZAorT1BfMUUwMSAoKQoreworICB1aW50NjQgdG1wOworICB0cmFjZV9pbnB1dCAoIm12dGFjaGkiLCBPUF9SRUcsIE9QX0FDQ1VNLCBPUF9WT0lEKTsKKyAgdG1wID0gQUNDIChPUFsxXSkgJiAweGZmZmY7CisgIHRtcCA9ICgoU0VYVDE2IChHUFIgKE9QWzBdKSkgPDwgMTYgfCB0bXApICYgTUFTSzQwKTsKKyAgU0VUX0FDQyAoT1BbMV0sIHRtcCk7CisgIHRyYWNlX291dHB1dF80MCAodG1wKTsKK30KKworLyogbXZ0YWNsbyAqLwordm9pZAorT1BfMUUyMSAoKQoreworICBpbnQ2NCB0bXA7CisgIHRyYWNlX2lucHV0ICgibXZ0YWNsbyIsIE9QX1JFRywgT1BfQUNDVU0sIE9QX1ZPSUQpOworICB0bXAgPSAoKFNFWFQxNiAoR1BSIChPUFswXSkpKSAmIE1BU0s0MCk7CisgIFNFVF9BQ0MgKE9QWzFdLCB0bXApOworICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Cit9CisKKy8qIG12dGMgKi8KK3ZvaWQKK09QXzU2MDAgKCkKK3sKKyAgaW50MTYgdG1wOworICB0cmFjZV9pbnB1dCAoIm12dGMiLCBPUF9SRUcsIE9QX0NSX09VVFBVVCwgT1BfVk9JRCk7CisgIHRtcCA9IEdQUiAoT1BbMF0pOworICB0bXAgPSBTRVRfQ1JFRyAoT1BbMV0sIHRtcCk7CisgIHRyYWNlX291dHB1dF8xNiAodG1wKTsKK30KKworLyogbXZ1YiAqLwordm9pZAorT1BfNTQwMSAoKQoreworICBpbnQxNiB0bXA7CisgIHRyYWNlX2lucHV0ICgibXZ1YiIsIE9QX1JFR19PVVRQVVQsIE9QX1JFRywgT1BfVk9JRCk7CisgIHRtcCA9IChHUFIgKE9QWzFdKSAmIDB4ZmYpOworICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBuZWcgKi8KK3ZvaWQKK09QXzQ2MDUgKCkKK3sKKyAgaW50MTYgdG1wOworICB0cmFjZV9pbnB1dCAoIm5lZyIsIE9QX1JFRywgT1BfVk9JRCwgT1BfVk9JRCk7CisgIHRtcCA9IC0gR1BSIChPUFswXSk7CisgIFNFVF9HUFIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Cit9CisKKy8qIG5lZyAqLwordm9pZAorT1BfNTYwNSAoKQoreworICBpbnQ2NCB0bXA7CisKKyAgdHJhY2VfaW5wdXQgKCJuZWciLCBPUF9BQ0NVTSwgT1BfVk9JRCwgT1BfVk9JRCk7CisgIHRtcCA9IC1TRVhUNDAoQUNDIChPUFswXSkpOworICBpZiAoUFNXX1NUKQorICAgIHsKKyAgICAgIGlmICh0bXAgPiBTRVhUNDAoTUFYMzIpKQorCXRtcCA9IChNQVgzMik7CisgICAgICBlbHNlIGlmICh0bXAgPCBTRVhUNDAoTUlOMzIpKQorCXRtcCA9IChNSU4zMik7CisgICAgICBlbHNlCisJdG1wID0gKHRtcCAmIE1BU0s0MCk7CisgICAgfQorICBlbHNlCisgICAgdG1wID0gKHRtcCAmIE1BU0s0MCk7CisgIFNFVF9BQ0MgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfNDAgKHRtcCk7Cit9CisKKworLyogbm9wICovCit2b2lkCitPUF81RTAwICgpCit7CisgIHRyYWNlX2lucHV0ICgibm9wIiwgT1BfVk9JRCwgT1BfVk9JRCwgT1BfVk9JRCk7CisKKyAgaW5zX3R5cGVfY291bnRlcnNbIChpbnQpU3RhdGUuaW5zX3R5cGUgXS0tOwkvKiBkb24ndCBjb3VudCBub3BzIGFzIG5vcm1hbCBpbnN0cnVjdGlvbnMgKi8KKyAgc3dpdGNoIChTdGF0ZS5pbnNfdHlwZSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19VTktOT1dOIF0rKzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBJTlNfTEVGVF9QQVJBTExFTDoKKyAgICAgIC8qIERvbid0IGNvdW50IGEgcGFyYWxsZWwgb3AgdGhhdCBpbmNsdWRlcyBhIE5PUCBhcyBhIHRydWUgcGFyYWxsZWwgb3AgKi8KKyAgICAgIGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19SSUdIVF9QQVJBTExFTCBdLS07CisgICAgICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfUklHSFQgXSsrOworICAgICAgaW5zX3R5cGVfY291bnRlcnNbIChpbnQpSU5TX0xFRlRfTk9QUyBdKys7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSU5TX0xFRlQ6CisgICAgY2FzZSBJTlNfTEVGVF9DT05EX0VYRToKKyAgICAgIGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19MRUZUX05PUFMgXSsrOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIElOU19SSUdIVF9QQVJBTExFTDoKKyAgICAgIC8qIERvbid0IGNvdW50IGEgcGFyYWxsZWwgb3AgdGhhdCBpbmNsdWRlcyBhIE5PUCBhcyBhIHRydWUgcGFyYWxsZWwgb3AgKi8KKyAgICAgIGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19MRUZUX1BBUkFMTEVMIF0tLTsKKyAgICAgIGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19MRUZUIF0rKzsKKyAgICAgIGluc190eXBlX2NvdW50ZXJzWyAoaW50KUlOU19SSUdIVF9OT1BTIF0rKzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBJTlNfUklHSFQ6CisgICAgY2FzZSBJTlNfUklHSFRfQ09ORF9FWEU6CisgICAgICBpbnNfdHlwZV9jb3VudGVyc1sgKGludClJTlNfUklHSFRfTk9QUyBdKys7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Cit9CisKKy8qIG5vdCAqLwordm9pZAorT1BfNDYwMyAoKQoreworICBpbnQxNiB0bXA7CisgIHRyYWNlX2lucHV0ICgibm90IiwgT1BfUkVHLCBPUF9WT0lELCBPUF9WT0lEKTsKKyAgdG1wID0gfkdQUiAoT1BbMF0pOyAgCisgIFNFVF9HUFIgKE9QWzBdLCB0bXApOyAgCisgIHRyYWNlX291dHB1dF8xNiAodG1wKTsKK30KKworLyogb3IgKi8KK3ZvaWQKK09QXzgwMCAoKQoreworICBpbnQxNiB0bXA7CisgIHRyYWNlX2lucHV0ICgib3IiLCBPUF9SRUcsIE9QX1JFRywgT1BfVk9JRCk7CisgIHRtcCA9IChHUFIgKE9QWzBdKSB8IEdQUiAoT1BbMV0pKTsKKyAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF8xNiAodG1wKTsKK30KKworLyogb3IzICovCit2b2lkCitPUF80MDAwMDAwICgpCit7CisgIGludDE2IHRtcDsKKyAgdHJhY2VfaW5wdXQgKCJvcjMiLCBPUF9SRUdfT1VUUFVULCBPUF9SRUcsIE9QX0NPTlNUQU5UMTYpOworICB0bXAgPSAoR1BSIChPUFsxXSkgfCBPUFsyXSk7CisgIFNFVF9HUFIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Cit9CisKKy8qIHJhYyAqLwordm9pZAorT1BfNTIwMSAoKQoreworICBpbnQ2NCB0bXA7CisgIGludCBzaGlmdCA9IFNFWFQzIChPUFsyXSk7CisKKyAgdHJhY2VfaW5wdXQgKCJyYWMiLCBPUF9EUkVHX09VVFBVVCwgT1BfQUNDVU0sIE9QX0NPTlNUQU5UMyk7CisgIGlmIChPUFsxXSAhPSAwKQorICAgIHsKKyAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywKKwkJCQkJICJFUlJPUiBhdCBQQyAweCV4OiBpbnN0cnVjdGlvbiBvbmx5IHZhbGlkIGZvciBBMFxuIiwKKwkJCQkJIFBDPDwyKTsKKyAgICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR0lMTDsKKyAgICB9CisKKyAgU0VUX1BTV19GMSAoUFNXX0YwKTsKKyAgdG1wID0gU0VYVDU2ICgoQUNDICgwKSA8PCAxNikgfCAoQUNDICgxKSAmIDB4ZmZmZikpOworICBpZiAoc2hpZnQgPj0wKQorICAgIHRtcCA8PD0gc2hpZnQ7CisgIGVsc2UKKyAgICB0bXAgPj49IC1zaGlmdDsKKyAgdG1wICs9IDB4ODAwMDsKKyAgdG1wID4+PSAxNjsgLyogbG9vayBhdCBiaXRzIDA6NDMgKi8KKyAgaWYgKHRtcCA+IFNFWFQ0NCAoU0lHTkVENjQgKDB4MDAwN2ZmZmZmZmYpKSkKKyAgICB7CisgICAgICB0bXAgPSAweDdmZmZmZmZmOworICAgICAgU0VUX1BTV19GMCAoMSk7CisgICAgfSAKKyAgZWxzZSBpZiAodG1wIDwgU0VYVDQ0IChTSUdORUQ2NCAoMHhmZmY4MDAwMDAwMCkpKQorICAgIHsKKyAgICAgIHRtcCA9IDB4ODAwMDAwMDA7CisgICAgICBTRVRfUFNXX0YwICgxKTsKKyAgICB9IAorICBlbHNlCisgICAgeworICAgICAgU0VUX1BTV19GMCAoMCk7CisgICAgfQorICBTRVRfR1BSMzIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMzIgKHRtcCk7Cit9CisKKy8qIHJhY2hpICovCit2b2lkCitPUF80MjAxICgpCit7CisgIHNpZ25lZDY0IHRtcDsKKyAgaW50IHNoaWZ0ID0gU0VYVDMgKE9QWzJdKTsKKworICB0cmFjZV9pbnB1dCAoInJhY2hpIiwgT1BfUkVHX09VVFBVVCwgT1BfQUNDVU0sIE9QX0NPTlNUQU5UMyk7CisgIFNFVF9QU1dfRjEgKFBTV19GMCk7CisgIGlmIChzaGlmdCA+PTApCisgICAgdG1wID0gU0VYVDQwIChBQ0MgKE9QWzFdKSkgPDwgc2hpZnQ7CisgIGVsc2UKKyAgICB0bXAgPSBTRVhUNDAgKEFDQyAoT1BbMV0pKSA+PiAtc2hpZnQ7CisgIHRtcCArPSAweDgwMDA7CisKKyAgaWYgKHRtcCA+IFNFWFQ0NCAoU0lHTkVENjQgKDB4MDAwN2ZmZmZmZmYpKSkKKyAgICB7CisgICAgICB0bXAgPSAweDdmZmY7CisgICAgICBTRVRfUFNXX0YwICgxKTsKKyAgICB9CisgIGVsc2UgaWYgKHRtcCA8IFNFWFQ0NCAoU0lHTkVENjQgKDB4ZmZmODAwMDAwMDApKSkKKyAgICB7CisgICAgICB0bXAgPSAweDgwMDA7CisgICAgICBTRVRfUFNXX0YwICgxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB0bXAgPSAodG1wID4+IDE2KTsKKyAgICAgIFNFVF9QU1dfRjAgKDApOworICAgIH0KKyAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF8xNiAodG1wKTsKK30KKworLyogcmVwICovCit2b2lkCitPUF8yNzAwMDAwMCAoKQoreworICB0cmFjZV9pbnB1dCAoInJlcCIsIE9QX1JFRywgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCk7CisgIFNFVF9SUFRfUyAoUEMgKyAxKTsKKyAgU0VUX1JQVF9FIChQQyArIE9QWzFdKTsKKyAgU0VUX1JQVF9DIChHUFIgKE9QWzBdKSk7CisgIFNFVF9QU1dfUlAgKDEpOworICBpZiAoR1BSIChPUFswXSkgPT0gMCkKKyAgICB7CisgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJFUlJPUjogcmVwIHdpdGggY291bnQ9MCBpcyBpbGxlZ2FsLlxuIik7CisgICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdJTEw7CisgICAgfQorICBpZiAoT1BbMV0gPCA0KQorICAgIHsKKyAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIkVSUk9SOiByZXAgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IDQgaW5zdHJ1Y3Rpb25zLlxuIik7CisgICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdJTEw7CisgICAgfQorICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKK30KKworLyogcmVwaSAqLwordm9pZAorT1BfMkYwMDAwMDAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJyZXBpIiwgT1BfQ09OU1RBTlQxNiwgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCk7CisgIFNFVF9SUFRfUyAoUEMgKyAxKTsKKyAgU0VUX1JQVF9FIChQQyArIE9QWzFdKTsKKyAgU0VUX1JQVF9DIChPUFswXSk7CisgIFNFVF9QU1dfUlAgKDEpOworICBpZiAoT1BbMF0gPT0gMCkKKyAgICB7CisgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJFUlJPUjogcmVwaSB3aXRoIGNvdW50PTAgaXMgaWxsZWdhbC5cbiIpOworICAgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHSUxMOworICAgIH0KKyAgaWYgKE9QWzFdIDwgNCkKKyAgICB7CisgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJFUlJPUjogcmVwaSBtdXN0IGluY2x1ZGUgYXQgbGVhc3QgNCBpbnN0cnVjdGlvbnMuXG4iKTsKKyAgICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR0lMTDsKKyAgICB9CisgIHRyYWNlX291dHB1dF92b2lkICgpOworfQorCisvKiBydGQgKi8KK3ZvaWQKK09QXzVGNjAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJydGQiLCBPUF9WT0lELCBPUF9WT0lELCBPUF9WT0lEKTsKKyAgU0VUX0NSRUcgKFBTV19DUiwgRFBTVyk7CisgIEpNUChEUEMpOworICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKK30KKworLyogcnRlICovCit2b2lkCitPUF81RjQwICgpCit7CisgIHRyYWNlX2lucHV0ICgicnRlIiwgT1BfVk9JRCwgT1BfVk9JRCwgT1BfVk9JRCk7CisgIFNFVF9DUkVHIChQU1dfQ1IsIEJQU1cpOworICBKTVAoQlBDKTsKKyAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Cit9CisKKy8qIHNhZGQgKi8KK3ZvaWQKK09QXzEyMjMgKCkKK3sKKyAgaW50NjQgdG1wOworCisgIHRyYWNlX2lucHV0ICgic2FkZCIsIE9QX0FDQ1VNLCBPUF9BQ0NVTSwgT1BfVk9JRCk7CisgIHRtcCA9IFNFWFQ0MChBQ0MgKE9QWzBdKSkgKyAoU0VYVDQwKEFDQyAoT1BbMV0pKSA+PiAxNik7CisgIGlmIChQU1dfU1QpCisgICAgeworICAgICAgaWYgKHRtcCA+IFNFWFQ0MChNQVgzMikpCisJdG1wID0gKE1BWDMyKTsKKyAgICAgIGVsc2UgaWYgKHRtcCA8IFNFWFQ0MChNSU4zMikpCisJdG1wID0gKE1JTjMyKTsKKyAgICAgIGVsc2UKKwl0bXAgPSAodG1wICYgTUFTSzQwKTsKKyAgICB9CisgIGVsc2UKKyAgICB0bXAgPSAodG1wICYgTUFTSzQwKTsKKyAgU0VUX0FDQyAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF80MCAodG1wKTsKK30KKworLyogc2V0ZjBmICovCit2b2lkCitPUF80NjExICgpCit7CisgIGludDE2IHRtcDsKKyAgdHJhY2VfaW5wdXQgKCJzZXRmMGYiLCBPUF9SRUdfT1VUUFVULCBPUF9WT0lELCBPUF9WT0lEKTsKKyAgdG1wID0gKChQU1dfRjAgPT0gMCkgPyAxIDogMCk7CisgIFNFVF9HUFIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Cit9CisKKy8qIHNldGYwdCAqLwordm9pZAorT1BfNDYxMyAoKQoreworICBpbnQxNiB0bXA7CisgIHRyYWNlX2lucHV0ICgic2V0ZjB0IiwgT1BfUkVHX09VVFBVVCwgT1BfVk9JRCwgT1BfVk9JRCk7CisgIHRtcCA9ICgoUFNXX0YwID09IDEpID8gMSA6IDApOworICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBzbGVlcCAqLwordm9pZAorT1BfNUZDMCAoKQoreworICB0cmFjZV9pbnB1dCAoInNsZWVwIiwgT1BfVk9JRCwgT1BfVk9JRCwgT1BfVk9JRCk7CisgIFNFVF9QU1dfSUUgKDEpOworICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKK30KKworLyogc2xsICovCit2b2lkCitPUF8yMjAwICgpCit7CisgIGludDE2IHRtcDsKKyAgdHJhY2VfaW5wdXQgKCJzbGwiLCBPUF9SRUcsIE9QX1JFRywgT1BfVk9JRCk7CisgIHRtcCA9IChHUFIgKE9QWzBdKSA8PCAoR1BSIChPUFsxXSkgJiAweGYpKTsKKyAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF8xNiAodG1wKTsKK30KKworLyogc2xsICovCit2b2lkCitPUF8zMjAwICgpCit7CisgIGludDY0IHRtcDsKKyAgdHJhY2VfaW5wdXQgKCJzbGwiLCBPUF9BQ0NVTSwgT1BfUkVHLCBPUF9WT0lEKTsKKyAgaWYgKChHUFIgKE9QWzFdKSAmIDMxKSA8PSAxNikKKyAgICB0bXAgPSBTRVhUNDAgKEFDQyAoT1BbMF0pKSA8PCAoR1BSIChPUFsxXSkgJiAzMSk7CisgIGVsc2UKKyAgICB7CisgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJFUlJPUjogc2hpZnQgdmFsdWUgJWQgdG9vIGxhcmdlLlxuIiwgR1BSIChPUFsxXSkgJiAzMSk7CisgICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdJTEw7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChQU1dfU1QpCisgICAgeworICAgICAgaWYgKHRtcCA+IFNFWFQ0MChNQVgzMikpCisJdG1wID0gKE1BWDMyKTsKKyAgICAgIGVsc2UgaWYgKHRtcCA8IFNFWFQ0MChNSU4zMikpCisJdG1wID0gKE1JTjMyKTsKKyAgICAgIGVsc2UKKwl0bXAgPSAodG1wICYgTUFTSzQwKTsKKyAgICB9CisgIGVsc2UKKyAgICB0bXAgPSAodG1wICYgTUFTSzQwKTsKKyAgU0VUX0FDQyAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF80MCAodG1wKTsKK30KKworLyogc2xsaSAqLwordm9pZAorT1BfMjIwMSAoKQoreworICBpbnQxNiB0bXA7CisgIHRyYWNlX2lucHV0ICgic2xsaSIsIE9QX1JFRywgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCk7CisgIHRtcCA9IChHUFIgKE9QWzBdKSA8PCBPUFsxXSk7CisgIFNFVF9HUFIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Cit9CisKKy8qIHNsbGkgKi8KK3ZvaWQKK09QXzMyMDEgKCkKK3sKKyAgaW50NjQgdG1wOworCisgIGlmIChPUFsxXSA9PSAwKQorICAgIE9QWzFdID0gMTY7CisKKyAgdHJhY2VfaW5wdXQgKCJzbGxpIiwgT1BfQUNDVU0sIE9QX0NPTlNUQU5UMTYsIE9QX1ZPSUQpOworICB0bXAgPSBTRVhUNDAoQUNDIChPUFswXSkpIDw8IE9QWzFdOworCisgIGlmIChQU1dfU1QpCisgICAgeworICAgICAgaWYgKHRtcCA+IFNFWFQ0MChNQVgzMikpCisJdG1wID0gKE1BWDMyKTsKKyAgICAgIGVsc2UgaWYgKHRtcCA8IFNFWFQ0MChNSU4zMikpCisJdG1wID0gKE1JTjMyKTsKKyAgICAgIGVsc2UKKwl0bXAgPSAodG1wICYgTUFTSzQwKTsKKyAgICB9CisgIGVsc2UKKyAgICB0bXAgPSAodG1wICYgTUFTSzQwKTsKKyAgU0VUX0FDQyAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF80MCAodG1wKTsKK30KKworLyogc2x4ICovCit2b2lkCitPUF80NjBCICgpCit7CisgIGludDE2IHRtcDsKKyAgdHJhY2VfaW5wdXQgKCJzbHgiLCBPUF9SRUcsIE9QX0ZMQUcsIE9QX1ZPSUQpOworICB0bXAgPSAoKEdQUiAoT1BbMF0pIDw8IDEpIHwgUFNXX0YwKTsKKyAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF8xNiAodG1wKTsKK30KKworLyogc3JhICovCit2b2lkCitPUF8yNDAwICgpCit7CisgIGludDE2IHRtcDsKKyAgdHJhY2VfaW5wdXQgKCJzcmEiLCBPUF9SRUcsIE9QX1JFRywgT1BfVk9JRCk7CisgIHRtcCA9ICgoKGludDE2KShHUFIgKE9QWzBdKSkpID4+IChHUFIgKE9QWzFdKSAmIDB4ZikpOworICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBzcmEgKi8KK3ZvaWQKK09QXzM0MDAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJzcmEiLCBPUF9BQ0NVTSwgT1BfUkVHLCBPUF9WT0lEKTsKKyAgaWYgKChHUFIgKE9QWzFdKSAmIDMxKSA8PSAxNikKKyAgICB7CisgICAgICBpbnQ2NCB0bXAgPSAoKFNFWFQ0MChBQ0MgKE9QWzBdKSkgPj4gKEdQUiAoT1BbMV0pICYgMzEpKSAmIE1BU0s0MCk7CisgICAgICBTRVRfQUNDIChPUFswXSwgdG1wKTsKKyAgICAgIHRyYWNlX291dHB1dF80MCAodG1wKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJFUlJPUjogc2hpZnQgdmFsdWUgJWQgdG9vIGxhcmdlLlxuIiwgR1BSIChPUFsxXSkgJiAzMSk7CisgICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdJTEw7CisgICAgICByZXR1cm47CisgICAgfQorfQorCisvKiBzcmFpICovCit2b2lkCitPUF8yNDAxICgpCit7CisgIGludDE2IHRtcDsKKyAgdHJhY2VfaW5wdXQgKCJzcmFpIiwgT1BfUkVHLCBPUF9DT05TVEFOVDE2LCBPUF9WT0lEKTsKKyAgdG1wID0gKCgoaW50MTYpKEdQUiAoT1BbMF0pKSkgPj4gT1BbMV0pOworICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBzcmFpICovCit2b2lkCitPUF8zNDAxICgpCit7CisgIGludDY0IHRtcDsKKyAgaWYgKE9QWzFdID09IDApCisgICAgT1BbMV0gPSAxNjsKKworICB0cmFjZV9pbnB1dCAoInNyYWkiLCBPUF9BQ0NVTSwgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCk7CisgIHRtcCA9ICgoU0VYVDQwKEFDQyAoT1BbMF0pKSA+PiBPUFsxXSkgJiBNQVNLNDApOworICBTRVRfQUNDIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOworfQorCisvKiBzcmwgKi8KK3ZvaWQKK09QXzIwMDAgKCkKK3sKKyAgaW50MTYgdG1wOworICB0cmFjZV9pbnB1dCAoInNybCIsIE9QX1JFRywgT1BfUkVHLCBPUF9WT0lEKTsKKyAgdG1wID0gKEdQUiAoT1BbMF0pID4+ICAoR1BSIChPUFsxXSkgJiAweGYpKTsKKyAgU0VUX0dQUiAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF8xNiAodG1wKTsKK30KKworLyogc3JsICovCit2b2lkCitPUF8zMDAwICgpCit7CisgIHRyYWNlX2lucHV0ICgic3JsIiwgT1BfQUNDVU0sIE9QX1JFRywgT1BfVk9JRCk7CisgIGlmICgoR1BSIChPUFsxXSkgJiAzMSkgPD0gMTYpCisgICAgeworICAgICAgaW50NjQgdG1wID0gKCh1aW50NjQpKChBQ0MgKE9QWzBdKSAmIE1BU0s0MCkgPj4gKEdQUiAoT1BbMV0pICYgMzEpKSk7CisgICAgICBTRVRfQUNDIChPUFswXSwgdG1wKTsKKyAgICAgIHRyYWNlX291dHB1dF80MCAodG1wKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJFUlJPUjogc2hpZnQgdmFsdWUgJWQgdG9vIGxhcmdlLlxuIiwgR1BSIChPUFsxXSkgJiAzMSk7CisgICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdJTEw7CisgICAgICByZXR1cm47CisgICAgfQorCit9CisKKy8qIHNybGkgKi8KK3ZvaWQKK09QXzIwMDEgKCkKK3sKKyAgaW50MTYgdG1wOworICB0cmFjZV9pbnB1dCAoInNybGkiLCBPUF9SRUcsIE9QX0NPTlNUQU5UMTYsIE9QX1ZPSUQpOworICB0bXAgPSAoR1BSIChPUFswXSkgPj4gT1BbMV0pOworICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBzcmxpICovCit2b2lkCitPUF8zMDAxICgpCit7CisgIGludDY0IHRtcDsKKyAgaWYgKE9QWzFdID09IDApCisgICAgT1BbMV0gPSAxNjsKKworICB0cmFjZV9pbnB1dCAoInNybGkiLCBPUF9BQ0NVTSwgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCk7CisgIHRtcCA9ICgodWludDY0KShBQ0MgKE9QWzBdKSAmIE1BU0s0MCkgPj4gT1BbMV0pOworICBTRVRfQUNDIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOworfQorCisvKiBzcnggKi8KK3ZvaWQKK09QXzQ2MDkgKCkKK3sKKyAgdWludDE2IHRtcDsKKyAgdHJhY2VfaW5wdXQgKCJzcngiLCBPUF9SRUcsIE9QX0ZMQUcsIE9QX1ZPSUQpOworICB0bXAgPSBQU1dfRjAgPDwgMTU7CisgIHRtcCA9ICgoR1BSIChPUFswXSkgPj4gMSkgfCB0bXApOworICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiBzdCAqLwordm9pZAorT1BfMzQwMDAwMDAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJzdCIsIE9QX1JFRywgT1BfTUVNUkVGMiwgT1BfVk9JRCk7CisgIFNXIChPUFsxXSArIEdQUiAoT1BbMl0pLCBHUFIgKE9QWzBdKSk7CisgIHRyYWNlX291dHB1dF92b2lkICgpOworfQorCisvKiBzdCAqLwordm9pZAorT1BfNjgwMCAoKQoreworICB0cmFjZV9pbnB1dCAoInN0IiwgT1BfUkVHLCBPUF9NRU1SRUYsIE9QX1ZPSUQpOworICBTVyAoR1BSIChPUFsxXSksIEdQUiAoT1BbMF0pKTsKKyAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Cit9CisKKy8qIHN0ICovCit2b2lkCitPUF82QzFGICgpCit7CisgIHVpbnQxNiBhZGRyID0gR1BSIChPUFsxXSkgLSAyOworICB0cmFjZV9pbnB1dCAoInN0IiwgT1BfUkVHLCBPUF9QUkVERUMsIE9QX1ZPSUQpOworICBpZiAoT1BbMV0gIT0gMTUpCisgICAgeworICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiRVJST1I6IGNhbm5vdCBwcmUtZGVjcmVtZW50IGFueSByZWdpc3RlcnMgYnV0IHIxNSAoU1ApLlxuIik7CisgICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdJTEw7CisgICAgICByZXR1cm47CisgICAgfQorICBTVyAoYWRkciwgR1BSIChPUFswXSkpOworICBTRVRfR1BSIChPUFsxXSwgYWRkcik7CisgIHRyYWNlX291dHB1dF92b2lkICgpOworfQorCisvKiBzdCAqLwordm9pZAorT1BfNjgwMSAoKQoreworICB0cmFjZV9pbnB1dCAoInN0IiwgT1BfUkVHLCBPUF9QT1NUSU5DLCBPUF9WT0lEKTsKKyAgU1cgKEdQUiAoT1BbMV0pLCBHUFIgKE9QWzBdKSk7CisgIElOQ19BRERSIChPUFsxXSwgMik7CisgIHRyYWNlX291dHB1dF92b2lkICgpOworfQorCisvKiBzdCAqLwordm9pZAorT1BfNkMwMSAoKQoreworICB0cmFjZV9pbnB1dCAoInN0IiwgT1BfUkVHLCBPUF9QT1NUREVDLCBPUF9WT0lEKTsKKyAgaWYgKCBPUFsxXSA9PSAxNSApCisgICAgeworICAgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiRVJST1I6IGNhbm5vdCBwb3N0LWRlY3JlbWVudCByZWdpc3RlciByMTUgKFNQKS5cbiIpOworICAgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHSUxMOworICAgICAgcmV0dXJuOworICAgIH0KKyAgU1cgKEdQUiAoT1BbMV0pLCBHUFIgKE9QWzBdKSk7CisgIElOQ19BRERSIChPUFsxXSwgLTIpOworICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKK30KKworLyogc3QydyAqLwordm9pZAorT1BfMzUwMDAwMDAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJzdDJ3IiwgT1BfRFJFRywgT1BfTUVNUkVGMiwgT1BfVk9JRCk7CisgIFNXIChHUFIgKE9QWzJdKSsgT1BbMV0gKyAwLCBHUFIgKE9QWzBdICsgMCkpOworICBTVyAoR1BSIChPUFsyXSkrIE9QWzFdICsgMiwgR1BSIChPUFswXSArIDEpKTsKKyAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Cit9CisKKy8qIHN0MncgKi8KK3ZvaWQKK09QXzZBMDAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJzdDJ3IiwgT1BfRFJFRywgT1BfTUVNUkVGLCBPUF9WT0lEKTsKKyAgU1cgKEdQUiAoT1BbMV0pICsgMCwgR1BSIChPUFswXSArIDApKTsKKyAgU1cgKEdQUiAoT1BbMV0pICsgMiwgR1BSIChPUFswXSArIDEpKTsKKyAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Cit9CisKKy8qIHN0MncgKi8KK3ZvaWQKK09QXzZFMUYgKCkKK3sKKyAgdWludDE2IGFkZHIgPSBHUFIgKE9QWzFdKSAtIDQ7CisgIHRyYWNlX2lucHV0ICgic3QydyIsIE9QX0RSRUcsIE9QX1BSRURFQywgT1BfVk9JRCk7CisgIGlmICggT1BbMV0gIT0gMTUgKQorICAgIHsKKyAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIkVSUk9SOiBjYW5ub3QgcHJlLWRlY3JlbWVudCBhbnkgcmVnaXN0ZXJzIGJ1dCByMTUgKFNQKS5cbiIpOworICAgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHSUxMOworICAgICAgcmV0dXJuOworICAgIH0KKyAgU1cgKGFkZHIgKyAwLCBHUFIgKE9QWzBdICsgMCkpOworICBTVyAoYWRkciArIDIsIEdQUiAoT1BbMF0gKyAxKSk7CisgIFNFVF9HUFIgKE9QWzFdLCBhZGRyKTsKKyAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Cit9CisKKy8qIHN0MncgKi8KK3ZvaWQKK09QXzZBMDEgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJzdDJ3IiwgT1BfRFJFRywgT1BfUE9TVElOQywgT1BfVk9JRCk7CisgIFNXIChHUFIgKE9QWzFdKSArIDAsIEdQUiAoT1BbMF0gKyAwKSk7CisgIFNXIChHUFIgKE9QWzFdKSArIDIsIEdQUiAoT1BbMF0gKyAxKSk7CisgIElOQ19BRERSIChPUFsxXSwgNCk7CisgIHRyYWNlX291dHB1dF92b2lkICgpOworfQorCisvKiBzdDJ3ICovCit2b2lkCitPUF82RTAxICgpCit7CisgIHRyYWNlX2lucHV0ICgic3QydyIsIE9QX0RSRUcsIE9QX1BPU1RERUMsIE9QX1ZPSUQpOworICBpZiAoIE9QWzFdID09IDE1ICkKKyAgICB7CisgICAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJFUlJPUjogY2Fubm90IHBvc3QtZGVjcmVtZW50IHJlZ2lzdGVyIHIxNSAoU1ApLlxuIik7CisgICAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdJTEw7CisgICAgICByZXR1cm47CisgICAgfQorICBTVyAoR1BSIChPUFsxXSkgKyAwLCBHUFIgKE9QWzBdICsgMCkpOworICBTVyAoR1BSIChPUFsxXSkgKyAyLCBHUFIgKE9QWzBdICsgMSkpOworICBJTkNfQUREUiAoT1BbMV0sIC00KTsKKyAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Cit9CisKKy8qIHN0YiAqLwordm9pZAorT1BfM0MwMDAwMDAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJzdGIiLCBPUF9SRUcsIE9QX01FTVJFRjIsIE9QX1ZPSUQpOworICBTQiAoR1BSIChPUFsyXSkgKyBPUFsxXSwgR1BSIChPUFswXSkpOworICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKK30KKworLyogc3RiICovCit2b2lkCitPUF83ODAwICgpCit7CisgIHRyYWNlX2lucHV0ICgic3RiIiwgT1BfUkVHLCBPUF9NRU1SRUYsIE9QX1ZPSUQpOworICBTQiAoR1BSIChPUFsxXSksIEdQUiAoT1BbMF0pKTsKKyAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7Cit9CisKKy8qIHN0b3AgKi8KK3ZvaWQKK09QXzVGRTAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJzdG9wIiwgT1BfVk9JRCwgT1BfVk9JRCwgT1BfVk9JRCk7CisgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR19EMTBWX1NUT1A7CisgIHRyYWNlX291dHB1dF92b2lkICgpOworfQorCisvKiBzdWIgKi8KK3ZvaWQKK09QXzAgKCkKK3sKKyAgdWludDE2IGEgPSBHUFIgKE9QWzBdKTsKKyAgdWludDE2IGIgPSBHUFIgKE9QWzFdKTsKKyAgdWludDE2IHRtcCA9IChhIC0gYik7CisgIHRyYWNlX2lucHV0ICgic3ViIiwgT1BfUkVHLCBPUF9SRUcsIE9QX1ZPSUQpOworICAvKiBzZWUgLi4vY29tbW9uL3NpbS1hbHUuaCBmb3IgYSBtb3JlIGV4dGVuc2l2ZSBkaXNjdXNzaW9uIG9uIGhvdyB0bworICAgICBjb21wdXRlIHRoZSBjYXJyeS9vdmVyZmxvdyBiaXRzLiAqLworICBTRVRfUFNXX0MgKGEgPj0gYik7CisgIFNFVF9HUFIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMTYgKHRtcCk7Cit9CisKKy8qIHN1YiAqLwordm9pZAorT1BfMTAwMSAoKQoreworICBpbnQ2NCB0bXA7CisKKyAgdHJhY2VfaW5wdXQgKCJzdWIiLCBPUF9BQ0NVTSwgT1BfRFJFRywgT1BfVk9JRCk7CisgIHRtcCA9IFNFWFQ0MChBQ0MgKE9QWzBdKSkgLSAoU0VYVDE2IChHUFIgKE9QWzFdKSkgPDwgMTYgfCBHUFIgKE9QWzFdICsgMSkpOworICBpZiAoUFNXX1NUKQorICAgIHsKKyAgICAgIGlmICh0bXAgPiBTRVhUNDAoTUFYMzIpKQorCXRtcCA9IChNQVgzMik7CisgICAgICBlbHNlIGlmICh0bXAgPCBTRVhUNDAoTUlOMzIpKQorCXRtcCA9IChNSU4zMik7CisgICAgICBlbHNlCisJdG1wID0gKHRtcCAmIE1BU0s0MCk7CisgICAgfQorICBlbHNlCisgICAgdG1wID0gKHRtcCAmIE1BU0s0MCk7CisgIFNFVF9BQ0MgKE9QWzBdLCB0bXApOworCisgIHRyYWNlX291dHB1dF80MCAodG1wKTsKK30KKworLyogc3ViICovCisKK3ZvaWQKK09QXzEwMDMgKCkKK3sKKyAgaW50NjQgdG1wOworCisgIHRyYWNlX2lucHV0ICgic3ViIiwgT1BfQUNDVU0sIE9QX0FDQ1VNLCBPUF9WT0lEKTsKKyAgdG1wID0gU0VYVDQwKEFDQyAoT1BbMF0pKSAtIFNFWFQ0MChBQ0MgKE9QWzFdKSk7CisgIGlmIChQU1dfU1QpCisgICAgeworICAgICAgaWYgKHRtcCA+IFNFWFQ0MChNQVgzMikpCisJdG1wID0gKE1BWDMyKTsKKyAgICAgIGVsc2UgaWYgKHRtcCA8IFNFWFQ0MChNSU4zMikpCisJdG1wID0gKE1JTjMyKTsKKyAgICAgIGVsc2UKKwl0bXAgPSAodG1wICYgTUFTSzQwKTsKKyAgICB9CisgIGVsc2UKKyAgICB0bXAgPSAodG1wICYgTUFTSzQwKTsKKyAgU0VUX0FDQyAoT1BbMF0sIHRtcCk7CisKKyAgdHJhY2Vfb3V0cHV0XzQwICh0bXApOworfQorCisvKiBzdWIydyAqLwordm9pZAorT1BfMTAwMCAoKQoreworICB1aW50MzIgdG1wLCBhLCBiOworCisgIHRyYWNlX2lucHV0ICgic3ViMnciLCBPUF9EUkVHLCBPUF9EUkVHLCBPUF9WT0lEKTsKKyAgYSA9ICh1aW50MzIpKChHUFIgKE9QWzBdKSA8PCAxNikgfCBHUFIgKE9QWzBdICsgMSkpOworICBiID0gKHVpbnQzMikoKEdQUiAoT1BbMV0pIDw8IDE2KSB8IEdQUiAoT1BbMV0gKyAxKSk7CisgIC8qIHNlZSAuLi9jb21tb24vc2ltLWFsdS5oIGZvciBhIG1vcmUgZXh0ZW5zaXZlIGRpc2N1c3Npb24gb24gaG93IHRvCisgICAgIGNvbXB1dGUgdGhlIGNhcnJ5L292ZXJmbG93IGJpdHMgKi8KKyAgdG1wID0gYSAtIGI7CisgIFNFVF9QU1dfQyAoYSA+PSBiKTsKKyAgU0VUX0dQUjMyIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzMyICh0bXApOworfQorCisvKiBzdWJhYzMgKi8KK3ZvaWQKK09QXzE3MDAwMDAwICgpCit7CisgIGludDY0IHRtcDsKKworICB0cmFjZV9pbnB1dCAoInN1YmFjMyIsIE9QX0RSRUdfT1VUUFVULCBPUF9EUkVHLCBPUF9BQ0NVTSk7CisgIHRtcCA9IFNFWFQ0MCAoKEdQUiAoT1BbMV0pIDw8IDE2KSB8IEdQUiAoT1BbMV0gKyAxKSkgLSBTRVhUNDAgKEFDQyAoT1BbMl0pKTsKKyAgU0VUX0dQUjMyIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzMyICh0bXApOworfQorCisvKiBzdWJhYzMgKi8KK3ZvaWQKK09QXzE3MDAwMDAyICgpCit7CisgIGludDY0IHRtcDsKKworICB0cmFjZV9pbnB1dCAoInN1YmFjMyIsIE9QX0RSRUdfT1VUUFVULCBPUF9BQ0NVTSwgT1BfQUNDVU0pOworICB0bXAgPSBTRVhUNDAgKEFDQyAoT1BbMV0pKSAtIFNFWFQ0MChBQ0MgKE9QWzJdKSk7CisgIFNFVF9HUFIzMiAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF8zMiAodG1wKTsKK30KKworLyogc3ViYWMzcyAqLwordm9pZAorT1BfMTcwMDEwMDAgKCkKK3sKKyAgaW50NjQgdG1wOworCisgIHRyYWNlX2lucHV0ICgic3ViYWMzcyIsIE9QX0RSRUdfT1VUUFVULCBPUF9EUkVHLCBPUF9BQ0NVTSk7CisgIFNFVF9QU1dfRjEgKFBTV19GMCk7CisgIHRtcCA9IFNFWFQ0MCAoKEdQUiAoT1BbMV0pIDw8IDE2KSB8IEdQUiAoT1BbMV0gKyAxKSkgLSBTRVhUNDAoQUNDIChPUFsyXSkpOworICBpZiAodG1wID4gU0VYVDQwKE1BWDMyKSkKKyAgICB7CisgICAgICB0bXAgPSAoTUFYMzIpOworICAgICAgU0VUX1BTV19GMCAoMSk7CisgICAgfSAgICAgIAorICBlbHNlIGlmICh0bXAgPCBTRVhUNDAoTUlOMzIpKQorICAgIHsKKyAgICAgIHRtcCA9IChNSU4zMik7CisgICAgICBTRVRfUFNXX0YwICgxKTsKKyAgICB9ICAgICAgCisgIGVsc2UKKyAgICB7CisgICAgICBTRVRfUFNXX0YwICgwKTsKKyAgICB9ICAgICAgCisgIFNFVF9HUFIzMiAoT1BbMF0sIHRtcCk7CisgIHRyYWNlX291dHB1dF8zMiAodG1wKTsKK30KKworLyogc3ViYWMzcyAqLwordm9pZAorT1BfMTcwMDEwMDIgKCkKK3sKKyAgaW50NjQgdG1wOworCisgIHRyYWNlX2lucHV0ICgic3ViYWMzcyIsIE9QX0RSRUdfT1VUUFVULCBPUF9BQ0NVTSwgT1BfQUNDVU0pOworICBTRVRfUFNXX0YxIChQU1dfRjApOworICB0bXAgPSBTRVhUNDAoQUNDIChPUFsxXSkpIC0gU0VYVDQwKEFDQyAoT1BbMl0pKTsKKyAgaWYgKHRtcCA+IFNFWFQ0MChNQVgzMikpCisgICAgeworICAgICAgdG1wID0gKE1BWDMyKTsKKyAgICAgIFNFVF9QU1dfRjAgKDEpOworICAgIH0gICAgICAKKyAgZWxzZSBpZiAodG1wIDwgU0VYVDQwKE1JTjMyKSkKKyAgICB7CisgICAgICB0bXAgPSAoTUlOMzIpOworICAgICAgU0VUX1BTV19GMCAoMSk7CisgICAgfSAgICAgIAorICBlbHNlCisgICAgeworICAgICAgU0VUX1BTV19GMCAoMCk7CisgICAgfSAgICAgIAorICBTRVRfR1BSMzIgKE9QWzBdLCB0bXApOworICB0cmFjZV9vdXRwdXRfMzIgKHRtcCk7Cit9CisKKy8qIHN1YmkgKi8KK3ZvaWQKK09QXzEgKCkKK3sKKyAgdW5zaWduZWQgdG1wOworICBpZiAoT1BbMV0gPT0gMCkKKyAgICBPUFsxXSA9IDE2OworCisgIHRyYWNlX2lucHV0ICgic3ViaSIsIE9QX1JFRywgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCk7CisgIC8qIHNlZSAuLi9jb21tb24vc2ltLWFsdS5oIGZvciBhIG1vcmUgZXh0ZW5zaXZlIGRpc2N1c3Npb24gb24gaG93IHRvCisgICAgIGNvbXB1dGUgdGhlIGNhcnJ5L292ZXJmbG93IGJpdHMuICovCisgIC8qIHNpbmNlIE9QWzFdIGlzIG5ldmVyIDw9IDAsIC1PUFsxXSA9PSB+T1BbMV0rMSBjYW4gbmV2ZXIgb3ZlcmZsb3cgKi8KKyAgdG1wID0gKCh1bnNpZ25lZCkodW5zaWduZWQxNikgR1BSIChPUFswXSkKKwkgKyAodW5zaWduZWQpKHVuc2lnbmVkMTYpICggLSBPUFsxXSkpOworICBTRVRfUFNXX0MgKHRtcCA+PSAoMSA8PCAxNikpOworICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiB0cmFwICovCit2b2lkCitPUF81RjAwICgpCit7CisgIHRyYWNlX2lucHV0ICgidHJhcCIsIE9QX0NPTlNUQU5UNCwgT1BfVk9JRCwgT1BfVk9JRCk7CisgIHRyYWNlX291dHB1dF92b2lkICgpOworCisgIHN3aXRjaCAoT1BbMF0pCisgICAgeworICAgIGRlZmF1bHQ6CisjaWYgKERFQlVHICYgREVCVUdfVFJBUCkgPT0gMAorICAgICAgeworCXVpbnQxNiB2ZWMgPSBPUFswXSArIFRSQVBfVkVDVE9SX1NUQVJUOworCVNFVF9CUEMgKFBDICsgMSk7CisJU0VUX0JQU1cgKFBTVyk7CisJU0VUX1BTVyAoUFNXICYgUFNXX1NNX0JJVCk7CisJSk1QICh2ZWMpOworCWJyZWFrOworICAgICAgfQorI2Vsc2UJCQkvKiBpZiBkZWJ1Z2dpbmcgdXNlIHRyYXAgdG8gcHJpbnQgcmVnaXN0ZXJzICovCisgICAgICB7CisJaW50IGk7CisJc3RhdGljIGludCBmaXJzdF90aW1lID0gMTsKKworCWlmIChmaXJzdF90aW1lKQorCSAgeworCSAgICBmaXJzdF90aW1lID0gMDsKKwkgICAgKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiVHJhcCAgIyAgICAgUEMgIik7CisJICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCSAgICAgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIiAgJXNyJWQiLCAoaSA+IDkpID8gIiIgOiAiICIsIGkpOworCSAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIgICAgICAgICBhMCAgICAgICAgIGExIGYwIGYxIGNcbiIpOworCSAgfQorCisJKCpkMTB2X2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChkMTB2X2NhbGxiYWNrLCAiVHJhcCAlMmQgMHglLjR4OiIsIChpbnQpT1BbMF0sIChpbnQpUEMpOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICIgJS40eCIsIChpbnQpIEdQUiAoaSkpOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkgICgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIiAlLjJ4JS44bHgiLAorCQkJCQkgICAgICgoaW50KShBQ0MgKGkpID4+IDMyKSAmIDB4ZmYpLAorCQkJCQkgICAgICgodW5zaWduZWQgbG9uZykgQUNDIChpKSkgJiAweGZmZmZmZmZmKTsKKworCSgqZDEwdl9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoZDEwdl9jYWxsYmFjaywgIiAgJWQgICVkICVkXG4iLAorCQkJCQkgICBQU1dfRjAgIT0gMCwgUFNXX0YxICE9IDAsIFBTV19DICE9IDApOworCSgqZDEwdl9jYWxsYmFjay0+Zmx1c2hfc3Rkb3V0KSAoZDEwdl9jYWxsYmFjayk7CisJYnJlYWs7CisgICAgICB9CisjZW5kaWYKKyAgICBjYXNlIDE1OgkJCS8qIG5ldyBzeXN0ZW0gY2FsbCB0cmFwICovCisgICAgICAvKiBUcmFwIDE1IGlzIHVzZWQgZm9yIHNpbXVsYXRpbmcgbG93LWxldmVsIEkvTyAqLworICAgICAgeworCXVuc2lnbmVkMzIgcmVzdWx0ID0gMDsKKwllcnJubyA9IDA7CisKKy8qIFJlZ2lzdGVycyBwYXNzZWQgdG8gdHJhcCAwICovCisKKyNkZWZpbmUgRlVOQyAgIEdQUiAoNCkJLyogZnVuY3Rpb24gbnVtYmVyICovCisjZGVmaW5lIFBBUk0xICBHUFIgKDApCS8qIG9wdGlvbmFsIHBhcm0gMSAqLworI2RlZmluZSBQQVJNMiAgR1BSICgxKQkvKiBvcHRpb25hbCBwYXJtIDIgKi8KKyNkZWZpbmUgUEFSTTMgIEdQUiAoMikJLyogb3B0aW9uYWwgcGFybSAzICovCisjZGVmaW5lIFBBUk00ICBHUFIgKDMpCS8qIG9wdGlvbmFsIHBhcm0gMyAqLworCisvKiBSZWdpc3RlcnMgc2V0IGJ5IHRyYXAgMCAqLworCisjZGVmaW5lIFJFVFZBTChYKSAgIGRvIHsgcmVzdWx0ID0gKFgpOyBTRVRfR1BSICgwLCByZXN1bHQpOyB9IHdoaWxlICgwKQorI2RlZmluZSBSRVRWQUwzMihYKSBkbyB7IHJlc3VsdCA9IChYKTsgU0VUX0dQUiAoMCwgcmVzdWx0ID4+IDE2KTsgU0VUX0dQUiAoMSwgcmVzdWx0KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgUkVURVJSKFgpIFNFVF9HUFIgKDQsIChYKSkJCS8qIHJldHVybiBlcnJvciBjb2RlICovCisKKy8qIFR1cm4gYSBwb2ludGVyIGluIGEgcmVnaXN0ZXIgaW50byBhIHBvaW50ZXIgaW50byByZWFsIG1lbW9yeS4gKi8KKworI2RlZmluZSBNRU1QVFIoeCkgKChjaGFyICopKGRtZW1fYWRkcih4KSkpCisKKwlzd2l0Y2ggKEZVTkMpCisJICB7CisjaWYgIWRlZmluZWQoX19HTzMyX18pICYmICFkZWZpbmVkKF9XSU4zMikKKwkgIGNhc2UgVEFSR0VUX1NZU19mb3JrOgorCSAgICB0cmFjZV9pbnB1dCAoIjxmb3JrPiIsIE9QX1ZPSUQsIE9QX1ZPSUQsIE9QX1ZPSUQpOworCSAgICBSRVRWQUwgKGZvcmsgKCkpOworCSAgICB0cmFjZV9vdXRwdXRfMTYgKHJlc3VsdCk7CisJICAgIGJyZWFrOworCisjZGVmaW5lIGdldHBpZCgpIDQ3CisJICBjYXNlIFRBUkdFVF9TWVNfZ2V0cGlkOgorCSAgICB0cmFjZV9pbnB1dCAoIjxnZXRwaWQ+IiwgT1BfVk9JRCwgT1BfVk9JRCwgT1BfVk9JRCk7CisJICAgIFJFVFZBTCAoZ2V0cGlkICgpKTsKKwkgICAgdHJhY2Vfb3V0cHV0XzE2IChyZXN1bHQpOworCSAgICBicmVhazsKKworCSAgY2FzZSBUQVJHRVRfU1lTX2tpbGw6CisJICAgIHRyYWNlX2lucHV0ICgiPGtpbGw+IiwgT1BfUjAsIE9QX1IxLCBPUF9WT0lEKTsKKwkgICAgaWYgKFBBUk0xID09IGdldHBpZCAoKSkKKwkgICAgICB7CisJCXRyYWNlX291dHB1dF92b2lkICgpOworCQlTdGF0ZS5leGNlcHRpb24gPSBQQVJNMjsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCWludCBvc19zaWcgPSAtMTsKKwkJc3dpdGNoIChQQVJNMikKKwkJICB7CisjaWZkZWYgU0lHSFVQCisJCSAgY2FzZSAxOiBvc19zaWcgPSBTSUdIVVA7CWJyZWFrOworI2VuZGlmCisjaWZkZWYgU0lHSU5UCisJCSAgY2FzZSAyOiBvc19zaWcgPSBTSUdJTlQ7CWJyZWFrOworI2VuZGlmCisjaWZkZWYgU0lHUVVJVAorCQkgIGNhc2UgMzogb3Nfc2lnID0gU0lHUVVJVDsJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBTSUdJTEwKKwkJICBjYXNlIDQ6IG9zX3NpZyA9IFNJR0lMTDsJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBTSUdUUkFQCisJCSAgY2FzZSA1OiBvc19zaWcgPSBTSUdUUkFQOwlicmVhazsKKyNlbmRpZgorI2lmZGVmIFNJR0FCUlQKKwkJICBjYXNlIDY6IG9zX3NpZyA9IFNJR0FCUlQ7CWJyZWFrOworI2VsaWYgZGVmaW5lZChTSUdJT1QpCisJCSAgY2FzZSA2OiBvc19zaWcgPSBTSUdJT1Q7CWJyZWFrOworI2VuZGlmCisjaWZkZWYgU0lHRU1UCisJCSAgY2FzZSA3OiBvc19zaWcgPSBTSUdFTVQ7CWJyZWFrOworI2VuZGlmCisjaWZkZWYgU0lHRlBFCisJCSAgY2FzZSA4OiBvc19zaWcgPSBTSUdGUEU7CWJyZWFrOworI2VuZGlmCisjaWZkZWYgU0lHS0lMTAorCQkgIGNhc2UgOTogb3Nfc2lnID0gU0lHS0lMTDsJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBTSUdCVVMKKwkJICBjYXNlIDEwOiBvc19zaWcgPSBTSUdCVVM7CWJyZWFrOworI2VuZGlmCisjaWZkZWYgU0lHU0VHVgorCQkgIGNhc2UgMTE6IG9zX3NpZyA9IFNJR1NFR1Y7CWJyZWFrOworI2VuZGlmCisjaWZkZWYgU0lHU1lTCisJCSAgY2FzZSAxMjogb3Nfc2lnID0gU0lHU1lTOwlicmVhazsKKyNlbmRpZgorI2lmZGVmIFNJR1BJUEUKKwkJICBjYXNlIDEzOiBvc19zaWcgPSBTSUdQSVBFOwlicmVhazsKKyNlbmRpZgorI2lmZGVmIFNJR0FMUk0KKwkJICBjYXNlIDE0OiBvc19zaWcgPSBTSUdBTFJNOwlicmVhazsKKyNlbmRpZgorI2lmZGVmIFNJR1RFUk0KKwkJICBjYXNlIDE1OiBvc19zaWcgPSBTSUdURVJNOwlicmVhazsKKyNlbmRpZgorI2lmZGVmIFNJR1VSRworCQkgIGNhc2UgMTY6IG9zX3NpZyA9IFNJR1VSRzsJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBTSUdTVE9QCisJCSAgY2FzZSAxNzogb3Nfc2lnID0gU0lHU1RPUDsJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBTSUdUU1RQCisJCSAgY2FzZSAxODogb3Nfc2lnID0gU0lHVFNUUDsJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBTSUdDT05UCisJCSAgY2FzZSAxOTogb3Nfc2lnID0gU0lHQ09OVDsJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBTSUdDSExECisJCSAgY2FzZSAyMDogb3Nfc2lnID0gU0lHQ0hMRDsJYnJlYWs7CisjZWxpZiBkZWZpbmVkKFNJR0NMRCkKKwkJICBjYXNlIDIwOiBvc19zaWcgPSBTSUdDTEQ7CWJyZWFrOworI2VuZGlmCisjaWZkZWYgU0lHVFRJTgorCQkgIGNhc2UgMjE6IG9zX3NpZyA9IFNJR1RUSU47CWJyZWFrOworI2VuZGlmCisjaWZkZWYgU0lHVFRPVQorCQkgIGNhc2UgMjI6IG9zX3NpZyA9IFNJR1RUT1U7CWJyZWFrOworI2VuZGlmCisjaWZkZWYgU0lHSU8KKwkJICBjYXNlIDIzOiBvc19zaWcgPSBTSUdJTzsJYnJlYWs7CisjZWxpZiBkZWZpbmVkIChTSUdQT0xMKQorCQkgIGNhc2UgMjM6IG9zX3NpZyA9IFNJR1BPTEw7CWJyZWFrOworI2VuZGlmCisjaWZkZWYgU0lHWENQVQorCQkgIGNhc2UgMjQ6IG9zX3NpZyA9IFNJR1hDUFU7CWJyZWFrOworI2VuZGlmCisjaWZkZWYgU0lHWEZTWgorCQkgIGNhc2UgMjU6IG9zX3NpZyA9IFNJR1hGU1o7CWJyZWFrOworI2VuZGlmCisjaWZkZWYgU0lHVlRBTFJNCisJCSAgY2FzZSAyNjogb3Nfc2lnID0gU0lHVlRBTFJNOwlicmVhazsKKyNlbmRpZgorI2lmZGVmIFNJR1BST0YKKwkJICBjYXNlIDI3OiBvc19zaWcgPSBTSUdQUk9GOwlicmVhazsKKyNlbmRpZgorI2lmZGVmIFNJR1dJTkNICisJCSAgY2FzZSAyODogb3Nfc2lnID0gU0lHV0lOQ0g7CWJyZWFrOworI2VuZGlmCisjaWZkZWYgU0lHTE9TVAorCQkgIGNhc2UgMjk6IG9zX3NpZyA9IFNJR0xPU1Q7CWJyZWFrOworI2VuZGlmCisjaWZkZWYgU0lHVVNSMQorCQkgIGNhc2UgMzA6IG9zX3NpZyA9IFNJR1VTUjE7CWJyZWFrOworI2VuZGlmCisjaWZkZWYgU0lHVVNSMgorCQkgIGNhc2UgMzE6IG9zX3NpZyA9IFNJR1VTUjI7CWJyZWFrOworI2VuZGlmCisJCSAgfQorCisJCWlmIChvc19zaWcgPT0gLTEpCisJCSAgeworCQkgICAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7CisJCSAgICAoKmQxMHZfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKGQxMHZfY2FsbGJhY2ssICJVbmtub3duIHNpZ25hbCAlZFxuIiwgUEFSTTIpOworCQkgICAgKCpkMTB2X2NhbGxiYWNrLT5mbHVzaF9zdGRvdXQpIChkMTB2X2NhbGxiYWNrKTsKKwkJICAgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR0lMTDsKKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICBSRVRWQUwgKGtpbGwgKFBBUk0xLCBQQVJNMikpOworCQkgICAgdHJhY2Vfb3V0cHV0XzE2IChyZXN1bHQpOworCQkgIH0KKwkgICAgICB9CisJICAgIGJyZWFrOworCisJICBjYXNlIFRBUkdFVF9TWVNfZXhlY3ZlOgorCSAgICB0cmFjZV9pbnB1dCAoIjxleGVjdmU+IiwgT1BfUjAsIE9QX1IxLCBPUF9SMik7CisJICAgIFJFVFZBTCAoZXhlY3ZlIChNRU1QVFIgKFBBUk0xKSwgKGNoYXIgKiopIE1FTVBUUiAoUEFSTTIpLAorCQkJICAgICAoY2hhciAqKilNRU1QVFIgKFBBUk0zKSkpOworCSAgICB0cmFjZV9vdXRwdXRfMTYgKHJlc3VsdCk7CisJICAgIGJyZWFrOworCisjaWZkZWYgVEFSR0VUX1NZU19leGVjdgorCSAgY2FzZSBUQVJHRVRfU1lTX2V4ZWN2OgorCSAgICB0cmFjZV9pbnB1dCAoIjxleGVjdj4iLCBPUF9SMCwgT1BfUjEsIE9QX1ZPSUQpOworCSAgICBSRVRWQUwgKGV4ZWN2ZSAoTUVNUFRSIChQQVJNMSksIChjaGFyICoqKSBNRU1QVFIgKFBBUk0yKSwgTlVMTCkpOworCSAgICB0cmFjZV9vdXRwdXRfMTYgKHJlc3VsdCk7CisJICAgIGJyZWFrOworI2VuZGlmCisKKwkgIGNhc2UgVEFSR0VUX1NZU19waXBlOgorCSAgICB7CisJICAgICAgcmVnX3QgYnVmOworCSAgICAgIGludCBob3N0X2ZkWzJdOworCisJICAgICAgdHJhY2VfaW5wdXQgKCI8cGlwZT4iLCBPUF9SMCwgT1BfVk9JRCwgT1BfVk9JRCk7CisJICAgICAgYnVmID0gUEFSTTE7CisJICAgICAgUkVUVkFMIChwaXBlIChob3N0X2ZkKSk7CisJICAgICAgU1cgKGJ1ZiwgaG9zdF9mZFswXSk7CisJICAgICAgYnVmICs9IHNpemVvZih1aW50MTYpOworCSAgICAgIFNXIChidWYsIGhvc3RfZmRbMV0pOworCSAgICAgIHRyYWNlX291dHB1dF8xNiAocmVzdWx0KTsKKwkgICAgfQorCSAgYnJlYWs7CisKKyNpZiAwCisjaWZkZWYgVEFSR0VUX1NZU193YWl0CisJICBjYXNlIFRBUkdFVF9TWVNfd2FpdDoKKwkgICAgeworCSAgICAgIGludCBzdGF0dXM7CisJICAgICAgdHJhY2VfaW5wdXQgKCI8d2FpdD4iLCBPUF9SMCwgT1BfVk9JRCwgT1BfVk9JRCk7CisJICAgICAgUkVUVkFMICh3YWl0ICgmc3RhdHVzKSk7CisJICAgICAgaWYgKFBBUk0xKQorCQlTVyAoUEFSTTEsIHN0YXR1cyk7CisJICAgICAgdHJhY2Vfb3V0cHV0XzE2IChyZXN1bHQpOworCSAgICB9CisJICBicmVhazsKKyNlbmRpZgorI2VuZGlmCisjZWxzZQorCSAgY2FzZSBUQVJHRVRfU1lTX2dldHBpZDoKKwkgICAgdHJhY2VfaW5wdXQgKCI8Z2V0cGlkPiIsIE9QX1ZPSUQsIE9QX1ZPSUQsIE9QX1ZPSUQpOworCSAgICBSRVRWQUwgKDEpOworCSAgICB0cmFjZV9vdXRwdXRfMTYgKHJlc3VsdCk7CisJICAgIGJyZWFrOworCisJICBjYXNlIFRBUkdFVF9TWVNfa2lsbDoKKwkgICAgdHJhY2VfaW5wdXQgKCI8a2lsbD4iLCBPUF9SRUcsIE9QX1JFRywgT1BfVk9JRCk7CisJICAgIHRyYWNlX291dHB1dF92b2lkICgpOworCSAgICBTdGF0ZS5leGNlcHRpb24gPSBQQVJNMjsKKwkgICAgYnJlYWs7CisjZW5kaWYKKworCSAgY2FzZSBUQVJHRVRfU1lTX3JlYWQ6CisJICAgIHRyYWNlX2lucHV0ICgiPHJlYWQ+IiwgT1BfUjAsIE9QX1IxLCBPUF9SMik7CisJICAgIFJFVFZBTCAoZDEwdl9jYWxsYmFjay0+cmVhZCAoZDEwdl9jYWxsYmFjaywgUEFSTTEsIE1FTVBUUiAoUEFSTTIpLAorCQkJCQkgIFBBUk0zKSk7CisJICAgIHRyYWNlX291dHB1dF8xNiAocmVzdWx0KTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgVEFSR0VUX1NZU193cml0ZToKKwkgICAgdHJhY2VfaW5wdXQgKCI8d3JpdGU+IiwgT1BfUjAsIE9QX1IxLCBPUF9SMik7CisJICAgIGlmIChQQVJNMSA9PSAxKQorCSAgICAgIFJFVFZBTCAoKGludClkMTB2X2NhbGxiYWNrLT53cml0ZV9zdGRvdXQgKGQxMHZfY2FsbGJhY2ssCisJCQkJCQkJIE1FTVBUUiAoUEFSTTIpLCBQQVJNMykpOworCSAgICBlbHNlCisJICAgICAgUkVUVkFMICgoaW50KWQxMHZfY2FsbGJhY2stPndyaXRlIChkMTB2X2NhbGxiYWNrLCBQQVJNMSwKKwkJCQkJCSAgTUVNUFRSIChQQVJNMiksIFBBUk0zKSk7CisJICAgIHRyYWNlX291dHB1dF8xNiAocmVzdWx0KTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgVEFSR0VUX1NZU19sc2VlazoKKwkgICAgdHJhY2VfaW5wdXQgKCI8bHNlZWs+IiwgT1BfUjAsIE9QX1IxLCBPUF9SMik7CisJICAgIFJFVFZBTDMyIChkMTB2X2NhbGxiYWNrLT5sc2VlayAoZDEwdl9jYWxsYmFjaywgUEFSTTEsCisJCQkJCSAgICAoKCgodW5zaWduZWQgbG9uZykgUEFSTTIpIDw8IDE2KQorCQkJCQkgICAgIHx8ICh1bnNpZ25lZCBsb25nKSBQQVJNMyksCisJCQkJCSAgICBQQVJNNCkpOworCSAgICB0cmFjZV9vdXRwdXRfMzIgKHJlc3VsdCk7CisJICAgIGJyZWFrOworCisJICBjYXNlIFRBUkdFVF9TWVNfY2xvc2U6CisJICAgIHRyYWNlX2lucHV0ICgiPGNsb3NlPiIsIE9QX1IwLCBPUF9WT0lELCBPUF9WT0lEKTsKKwkgICAgUkVUVkFMIChkMTB2X2NhbGxiYWNrLT5jbG9zZSAoZDEwdl9jYWxsYmFjaywgUEFSTTEpKTsKKwkgICAgdHJhY2Vfb3V0cHV0XzE2IChyZXN1bHQpOworCSAgICBicmVhazsKKworCSAgY2FzZSBUQVJHRVRfU1lTX29wZW46CisJICAgIHRyYWNlX2lucHV0ICgiPG9wZW4+IiwgT1BfUjAsIE9QX1IxLCBPUF9SMik7CisJICAgIFJFVFZBTCAoZDEwdl9jYWxsYmFjay0+b3BlbiAoZDEwdl9jYWxsYmFjaywgTUVNUFRSIChQQVJNMSksIFBBUk0yKSk7CisJICAgIHRyYWNlX291dHB1dF8xNiAocmVzdWx0KTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgVEFSR0VUX1NZU19leGl0OgorCSAgICB0cmFjZV9pbnB1dCAoIjxleGl0PiIsIE9QX1IwLCBPUF9WT0lELCBPUF9WT0lEKTsKKwkgICAgU3RhdGUuZXhjZXB0aW9uID0gU0lHX0QxMFZfRVhJVDsKKwkgICAgdHJhY2Vfb3V0cHV0X3ZvaWQgKCk7CisJICAgIGJyZWFrOworCisJICBjYXNlIFRBUkdFVF9TWVNfc3RhdDoKKwkgICAgdHJhY2VfaW5wdXQgKCI8c3RhdD4iLCBPUF9SMCwgT1BfUjEsIE9QX1ZPSUQpOworCSAgICAvKiBzdGF0IHN5c3RlbSBjYWxsICovCisJICAgIHsKKwkgICAgICBzdHJ1Y3Qgc3RhdCBob3N0X3N0YXQ7CisJICAgICAgcmVnX3QgYnVmOworCisJICAgICAgUkVUVkFMIChzdGF0IChNRU1QVFIgKFBBUk0xKSwgJmhvc3Rfc3RhdCkpOworCisJICAgICAgYnVmID0gUEFSTTI7CisKKwkgICAgICAvKiBUaGUgaGFyZC1jb2RlZCBvZmZzZXRzIGFuZCBzaXplcyB3ZXJlIGRldGVybWluZWQgYnkgdXNpbmcKKwkgICAgICAgKiB0aGUgRDEwViBjb21waWxlciBvbiBhIHRlc3QgcHJvZ3JhbSB0aGF0IHVzZWQgc3RydWN0IHN0YXQuCisJICAgICAgICovCisJICAgICAgU1cgIChidWYsICAgIGhvc3Rfc3RhdC5zdF9kZXYpOworCSAgICAgIFNXICAoYnVmKzIsICBob3N0X3N0YXQuc3RfaW5vKTsKKwkgICAgICBTVyAgKGJ1Zis0LCAgaG9zdF9zdGF0LnN0X21vZGUpOworCSAgICAgIFNXICAoYnVmKzYsICBob3N0X3N0YXQuc3RfbmxpbmspOworCSAgICAgIFNXICAoYnVmKzgsICBob3N0X3N0YXQuc3RfdWlkKTsKKwkgICAgICBTVyAgKGJ1ZisxMCwgaG9zdF9zdGF0LnN0X2dpZCk7CisJICAgICAgU1cgIChidWYrMTIsIGhvc3Rfc3RhdC5zdF9yZGV2KTsKKwkgICAgICBTTFcgKGJ1ZisxNiwgaG9zdF9zdGF0LnN0X3NpemUpOworCSAgICAgIFNMVyAoYnVmKzIwLCBob3N0X3N0YXQuc3RfYXRpbWUpOworCSAgICAgIFNMVyAoYnVmKzI4LCBob3N0X3N0YXQuc3RfbXRpbWUpOworCSAgICAgIFNMVyAoYnVmKzM2LCBob3N0X3N0YXQuc3RfY3RpbWUpOworCSAgICB9CisJICAgIHRyYWNlX291dHB1dF8xNiAocmVzdWx0KTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgVEFSR0VUX1NZU19jaG93bjoKKwkgICAgdHJhY2VfaW5wdXQgKCI8Y2hvd24+IiwgT1BfUjAsIE9QX1IxLCBPUF9SMik7CisJICAgIFJFVFZBTCAoY2hvd24gKE1FTVBUUiAoUEFSTTEpLCBQQVJNMiwgUEFSTTMpKTsKKwkgICAgdHJhY2Vfb3V0cHV0XzE2IChyZXN1bHQpOworCSAgICBicmVhazsKKworCSAgY2FzZSBUQVJHRVRfU1lTX2NobW9kOgorCSAgICB0cmFjZV9pbnB1dCAoIjxjaG1vZD4iLCBPUF9SMCwgT1BfUjEsIE9QX1IyKTsKKwkgICAgUkVUVkFMIChjaG1vZCAoTUVNUFRSIChQQVJNMSksIFBBUk0yKSk7CisJICAgIHRyYWNlX291dHB1dF8xNiAocmVzdWx0KTsKKwkgICAgYnJlYWs7CisKKyNpZiAwCisjaWZkZWYgVEFSR0VUX1NZU191dGltZQorCSAgY2FzZSBUQVJHRVRfU1lTX3V0aW1lOgorCSAgICB0cmFjZV9pbnB1dCAoIjx1dGltZT4iLCBPUF9SMCwgT1BfUjEsIE9QX1IyKTsKKwkgICAgLyogQ2FzdCB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHZvaWQgKiwgdG8gYXZvaWQgdHlwZSBtaXNtYXRjaAorCSAgICAgICBpZiBhIHByb3RvdHlwZSBpcyBwcmVzZW50LiAgKi8KKwkgICAgUkVUVkFMICh1dGltZSAoTUVNUFRSIChQQVJNMSksICh2b2lkICopIE1FTVBUUiAoUEFSTTIpKSk7CisJICAgIHRyYWNlX291dHB1dF8xNiAocmVzdWx0KTsKKwkgICAgYnJlYWs7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgMAorI2lmZGVmIFRBUkdFVF9TWVNfdGltZQorCSAgY2FzZSBUQVJHRVRfU1lTX3RpbWU6CisJICAgIHRyYWNlX2lucHV0ICgiPHRpbWU+IiwgT1BfUjAsIE9QX1IxLCBPUF9SMik7CisJICAgIFJFVFZBTDMyICh0aW1lIChQQVJNMSA/IE1FTVBUUiAoUEFSTTEpIDogTlVMTCkpOworCSAgICB0cmFjZV9vdXRwdXRfMzIgKHJlc3VsdCk7CisJICAgIGJyZWFrOworI2VuZGlmCisjZW5kaWYKKwkgICAgCisJICBkZWZhdWx0OgorCSAgICBkMTB2X2NhbGxiYWNrLT5lcnJvciAoZDEwdl9jYWxsYmFjaywgIlVua25vd24gc3lzY2FsbCAlZCIsIEZVTkMpOworCSAgfQorCWlmICgodWludDE2KSByZXN1bHQgPT0gKHVpbnQxNikgLTEpCisJICBSRVRFUlIgKGQxMHZfY2FsbGJhY2stPmdldF9lcnJubyhkMTB2X2NhbGxiYWNrKSk7CisJZWxzZQorCSAgUkVURVJSICgwKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICB9Cit9CisKKy8qIHRzdDBpICovCit2b2lkCitPUF83MDAwMDAwICgpCit7CisgIHRyYWNlX2lucHV0ICgidHN0MGkiLCBPUF9SRUcsIE9QX0NPTlNUQU5UMTYsIE9QX1ZPSUQpOworICBTRVRfUFNXX0YxIChQU1dfRjApOzsKKyAgU0VUX1BTV19GMCAoKEdQUiAoT1BbMF0pICYgT1BbMV0pID8gMSA6IDApOworICB0cmFjZV9vdXRwdXRfZmxhZyAoKTsKK30KKworLyogdHN0MWkgKi8KK3ZvaWQKK09QX0YwMDAwMDAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJ0c3QxaSIsIE9QX1JFRywgT1BfQ09OU1RBTlQxNiwgT1BfVk9JRCk7CisgIFNFVF9QU1dfRjEgKFBTV19GMCk7CisgIFNFVF9QU1dfRjAgKCh+KEdQUiAoT1BbMF0pKSAmIE9QWzFdKSA/IDEgOiAwKTsKKyAgdHJhY2Vfb3V0cHV0X2ZsYWcgKCk7Cit9CisKKy8qIHdhaXQgKi8KK3ZvaWQKK09QXzVGODAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJ3YWl0IiwgT1BfVk9JRCwgT1BfVk9JRCwgT1BfVk9JRCk7CisgIFNFVF9QU1dfSUUgKDEpOworICB0cmFjZV9vdXRwdXRfdm9pZCAoKTsKK30KKworLyogeG9yICovCit2b2lkCitPUF9BMDAgKCkKK3sKKyAgaW50MTYgdG1wOworICB0cmFjZV9pbnB1dCAoInhvciIsIE9QX1JFRywgT1BfUkVHLCBPUF9WT0lEKTsKKyAgdG1wID0gKEdQUiAoT1BbMF0pIF4gR1BSIChPUFsxXSkpOworICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCisvKiB4b3IzICovCit2b2lkCitPUF81MDAwMDAwICgpCit7CisgIGludDE2IHRtcDsKKyAgdHJhY2VfaW5wdXQgKCJ4b3IzIiwgT1BfUkVHX09VVFBVVCwgT1BfUkVHLCBPUF9DT05TVEFOVDE2KTsKKyAgdG1wID0gKEdQUiAoT1BbMV0pIF4gT1BbMl0pOworICBTRVRfR1BSIChPUFswXSwgdG1wKTsKKyAgdHJhY2Vfb3V0cHV0XzE2ICh0bXApOworfQorCmRpZmYgLS1naXQgYS9zaW0vZDMwdi9DaGFuZ2VMb2cgYi9zaW0vZDMwdi9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4ZDg5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9kMzB2L0NoYW5nZUxvZwpAQCAtMCwwICsxLDEzMzMgQEAKKzE5OTktMDEtMTIgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGVuZ2luZS5jICh1bnF1ZXVlX3dyaXRlcyk6IE1ha2UgUFNXIGNvbmZsaWN0IHJlc29sdXRpb24gY29kZQorIAljb25kaXRpb25hbCAtIGRpc2FibGUgaXQgZm9yIE1WVFNZUyB8fCBpbnNuIGNhc2UuCisJCisxOTk5LTAxLTExICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChkb19zYXRoKTogRHJhaW4gUFNXIHdyaXRlIHF1ZXVlIGJlZm9yZSBQU1dfU19GTEFHCisgCXVwZGF0ZS4KKwkqIGVuZ2luZS5jICh1bnF1ZXVlX3dyaXRlcyk6IE1ha2Ugbm9uLXN0YXRpYy4gIFJlbW92ZSBQU1dfVi9WQQorCXNwZWNpYWwgY2FzZS4KKwkoZG9fcGFyYWxsZWwpOiBEb24ndCBkcmFpbiBQU1cgd3JpdGUgcXVldWUgZm9yIE1WVFNZUyB8fCBpbnNuLgorCisxOTk5LTAxLTA3ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChkb19sZDJoKTogU2lnbi1leHRlbmQgbG9hZGVkIGhhbGYtd29yZHMuCisKKzE5OTktMDEtMDUgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGRvX2xkMmgpOiBSZWFkIG1lbW9yeSBpbiB3b3JkIHVuaXRzLgorCShkb19sZDRiaCk6IERpdHRvLiAgQ29ycmVjdCBzaWduIGV4dGVuc2lvbi4KKwkoZG9fbGQ0Ymh1KTogRGl0dG8uCisJKGRvX3N0MmgpOiBXcml0ZSBtZW1vcnkgaW4gd29yZCB1bml0cy4KKwkoZG9fc3Q0aGIpOiBEaXR0by4KKwkoc3Q0aGIpOiBDb3JyZWN0IG1uZW1vbmljIGluIGlnZW4gdGVtcGxhdGUuCisKKzE5OTgtMTItMDggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnM6IChkb19sZDJoKTogRG9uJ3QgdXBkYXRlIFIwIG5vciBSMSBmb3IgZG91YmxlLXdvcmQgaW5zbi4KKwkoZG9fbGQydyk6IERpdHRvLgorIAkoZG9fbGQ0YmgpOiBEaXR0by4KKyAJKGRvX2xkNGJodSk6IERpdHRvLgorIAkoZG9fbXVseDJoKTogRGl0dG8uCisKKzE5OTgtMTItMDMgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGRvX3JlcGVhdCk6IERvbid0IHNldCBSUCBmb3IgcmVwZWF0IGNvdW50IDEuCisKKzE5OTgtMTItMDMgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGRvX3NyYyk6IFRyZWF0IHNoaWZ0IGNvdW50IC0zMiBuYXR1cmFsbHkgaW5zdGVhZCBvZgorCXByb2R1Y2luZyB6ZXJvIHJlc3VsdC4KKworMTk5OC0xMS0yMiAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAoZG9fc3JjKTogTGltaXQgU1JDIHNoaWZ0IGNvdW50IHRvIC0zMiAuLiAzMS4KKworMTk5OC0xMS0xNiAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAoZGJ0KTogRGVmZXIgUFNXL0RQU1cgdXBkYXRlIHdpdGggbmV3IERJRF9UUkFQIGNvZGUgMi4gIAorCSogZW5naW5lLmMgKHVucXVldWVfd3JpdGVzKTogUGVyZm9ybSBEQlQgcHJvY2Vzc2luZyBvbiBQU1cvRFBTVyBoZXJlLgorCisxOTk4LTExLTEyICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBjcHUuaCAoX3NpbV9jcHUpOiBSZW1vdmVkIGlzX2RlbGF5ZWRfY2FsbCBmaWVsZCwgYW5kIGFzc29jaWF0ZWQKKyAJUlBUX0lTX0NBTEwgbWFjcm8uICAKKwkqIHNpbS1jYWxscy5jIChzaW1fY3JlYXRlX2luZmVyaW9yKTogRG9uJ3QgaW5pdGlhbGl6ZSBpc19kZWxheWVkX2NhbGwuCisJKiBkMzB2LWluc25zIChkb19kYnJhKTogRG9uJ3QgY2xlYXIgUlBUX0lTX0NBTEwuIChkb19kYnJhaSk6IERpdHRvLiAKKwkoZG9fZGptcCk6IERpdHRvLiAoZG9fZGptcGkpOiBEaXR0by4gKGRvX3JlcGVhdCk6IERpdHRvLiAKKwkqIGQzMHYtaW5zbnMgKGRvX2Ric3IpOiBEb24ndCBzZXQgUlBUX0lTX0NBTEwsIGJ1dCBzZXQgUjYyIGluc3RlYWQuIAorCShkb19kYnNyaSk6IERpdHRvLiAoZG9fZGpzcik6IERpdG8uIChkb19kanNyaSk6IERpdHRvLgorCSogZW5naW5lLmMgKHNpbV9lbmdpbmVfcnVuKTogUmVtb3ZlIGNvbmRpdGlvbmFsIHNldHRpbmcgb2YgUjYyIGJhc2VkIAorCXVwb24gUlBUX0lTX0NBTEwuCisJCisxOTk4LTExLTA4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBzaW0tY2FsbHMuYyAoc2ltX29wZW4pOiBBZGQgZHVtbXkgbWVtb3J5IHJhbmdlIG92ZXIgY29udHJvbAorCXJlZ2lzdGVyIHJlZ2lvbiAoMHg0MDAwMDAwMC4uMHg0MDAwRkZGRikuCisgCisxOTk4LTExLTA2ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChkb19tdmZhY2MpOiBVc2UgbG9vcCB0byBsaW1pdCBzaGlmdCBjb3VudCB0byA2MyAuLiAwLgorCitUdWUgT2N0IDEzIDExOjAxOjE2IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGRvX3NyYSxkb19zcmFoLGRvX3NybCxkb19zcmxoKTogTWFrZSBzaGlmdAorIAljb3VudCAtMzIgdG8gcHJvZHVjZSB6ZXJvIHJlc3VsdC4KKwkoZG9fc3JjKTogRGl0dG8gZm9yIHNoaWZ0IGNvdW50ID09IC02NC4KKworTW9uIE9jdCAxMiAyMzowNDoxMSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChST1QpOiBVc2UgMHgxZiBiaXQgbWFzayBmb3Igcm90YXRlIGNvdW50IG1hc2tpbmcuCisJKGRvX3NyYSxkb19zcmwpOiBVc2UgbG9vcCB0byBsaW1pdCBzaGlmdCBjb3VudCB0byAtMzIgLi4gMzEuCisJKGRvX3NyYWgsZG9fc3JsaCk6IFVzZSBsb29wIHRvIGxpbWl0IHNoaWZ0IGNvdW50IHRvIC0zMiAuLiAzMS4KKwkoc3JhMmgsc3JsMmgpOiBVc2UgbG9vcCB0byBsaW1pdCBzaGlmdCBjb3VudCB0byAtMTYgLi4gMTUuCisJKGRvX3NyYyk6IFVzZSBsb29wIHRvIGxpbWl0IHNoaWZ0IGNvdW50IHRvIC02NCAuLiA2My4KKworRnJpIE9jdCAgOSAxNjo0Njo1MiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzaW0tY2FsbHMuYyAoZ2V0X2luc25fbmFtZSk6IE5ldyBmbi4KKwkoc2ltX29wZW4pOiBJbml0aWFsaXplIENQVV9JTlNOX05BTUUsQ1BVX01BWF9JTlNOUy4KKwkqIHNpbS1tYWluLmggKE1BWF9JTlNOUyxJTlNOX05BTUUpOiBEZWxldGUuCisKK01vbiBTZXAgMjggMTA6NDM6MjggMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAoZG9fc3JhLGRvX3NyYWgsZG9fc3JsLGRvX3NybGgsUk9ULGRvX3NyYyk6IFVzZQorCWNvcnJlY3QgTVNCIGJpdCBudW1iZXJzIGZvciBzaWduIGV4dGVuc2lvbiBtYXNrcy4KKworRnJpIFNlcCAyNSAxNzozMjoyNyAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBlbmdpbmUuYyAoZG9fcGFyYWxsZWwpOiBVbnF1ZXVlIHdyaXRlcyBpZiBNVSBpbnN0cnVjdGlvbiB3YXMKKwlhIE1WVFNZUywgYXMgaWRlbnRpZmllZCBieSBpdHMgbGVmdF9raWxsc19yaWdodF9wIHNpZGUtZWZmZWN0LgorCitGcmkgU2VwIDI1IDEyOjMxOjM0IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGRvX3NyYSxkb19zcmFoLGRvX3NybCxkb19zcmxoLFJPVCxkb19zcmMpOiBNYXNrCisgCXNoaWZ0L3JvdGF0ZSBjb3VudHMgdG8gbnVtYmVyIG9mIGJpdHMgaW4gd2lkdGggb2Ygb3BlcmFuZDsgbm8KKyAJbG9uZ2VyIHNhdHVyYXRlIGF0IG1heGltYS4KKworVHVlIEp1bCAxNCAxODozOToyMyAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBjcHUuaCAobGVmdF9raWxsc19yaWdodF9wKTogTmV3IGZsYWcgZm9yIG5vbi1icmFuY2ggaW5zdHJ1Y3Rpb25zCisJdGhhdCwgd2hlbiBleGVjdXRlZCBpbiBsZWZ0IHNsb3Qgb2YgYSAtPiBzZXF1ZW50aWFsIHBhaXIsIGtpbGwgdGhlCisJcmlnaHQgc2xvdC4KKwkqIGQzMHYtaW5zbnMgKG12dHN5cyk6IFNldCBmbGFnIGZvciBQU1cvUFNXaC9QU1dsL0ZMQUcgb3BlcmFuZHMuCisJKiBlbmdpbmUuYyAoZG9fMl9zaG9ydCk6IFJlc3BlY3QgZmxhZy4KKwkKK1RodSBKdW4gIDQgMTY6NDg6NTggMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGRvX3RyYXApOiBkb24ndCBzYXZlIHRoZSBiUFNXIGFuZCBQU1cgYmFzZWQgb24KKwljdXJyZW50IHZhbHVlcyBiZWNhdXNlIGFuIGluc3RydWN0aW9uIGRvbmUgaW4gcGFyYWxsZWwgd2l0aAorCXRoZSB0cmFwIG1pZ2h0IGNoYW5nZSB0aGVtLCBpbnN0ZWFkIHNldCBhIGZsYWcgZG8gdGhhdAorCXVucXVldWVfd3JpdGVzIHdpbGwgdGFrZSBjYXJlIG9mIGl0LgorCSogZW5naW5lLmMgKHVucXVldWVfd3JpdGVzKTogZmluaXNoIHRyYXAgaGFuZGxpbmcKKwkqIGNwdS5oIChfc2ltX2NwdSk6IGFkZCBuZXcgZmllbGQgZGlkX3RyYXAgYW5kIGEgbWFjcm8gRElEX1RSQVAKKwl0byBtYWtlIHVzZSBvZiBpdDsgc2V0IGJ5IGRvX3RyYXAsIHRlc3RlZCBhbmQgY2xlYXJlZCBieQorCXVucXVldWVfd3JpdGVzLgorCitUdWUgTWF5IDE5IDE2OjA3OjA0IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGVuZ2luZS5jICh1bnF1ZXVlX3dyaXRlcyk6IFN1cHByZXNzIHRoZSBhbGwgZW5xdWV1ZWQgd3JpdGVzIHRvCisgCXRoZSBzYW1lIGZsYWdzIGluIFBTVyBleGNlcHQgdGhlIGxhc3QuCisKK0ZyaSBNYXkgMTUgMTE6Mzg6NTkgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAoUkVUSSk6IENvcnJlY3QgaW5zdHJ1Y3Rpb24gc3BlbGxpbmcgdG8gInJlaXQiLgorCitUaHUgTWF5IDE0IDA5OjM0OjIwIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGRidCk6IEhhbmRsZSBEQlQgYXQgZW5kIG9mIHJlcGVhdCBibG9jay4KKwkoZG9fdHJhcCwgZGJ0KTogQ2xlYXIgUFNXX1JQIGlmIGF0IGVuZCBvZiByZXBlYXQgYmxvY2suCisKK1RodSBNYXkgMTQgMDc6NDE6NDEgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZW5naW5lLmMgKHNpbV9lbmdpbmVfcnVuKTogVHJpZ2dlciBEREJUIGJhc2VkIG9uIHByZXZpb3VzIFBDLAorIAlpbnN0ZWFkIG9mIG5leHQgUEMuCisKK1dlZCBNYXkgMTMgMTE6MDM6NDAgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZW5naW5lLmMgKHNpbV9lbmdpbmVfcnVuKTogTW92ZSBEREJUIGhhbmRsaW5nIGFmdGVyIGluc3RydWN0aW9uCisgCWRlY29kZS9leGVjdXRlIHN0YWdlLgorCitUdWUgTWF5IDEyIDEyOjE0OjUzIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGRvX3NhdCopOiBDb3JyZWN0ICJzYXR1cmF0ZSB0byAwIGJpdHMiIHBhdGNoIHRvCisgCXByb3Blcmx5IGhhbmRsZSBuZWdhdGl2ZSBzYXR1cmF0aW9uIGlucHV0cy4KKworVHVlIE1heSAxMiAxMToxMToyNiAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBlbmdpbmUuYyAoc2ltX2VuZ2luZV9ydW4pOiBEZWNyZW1lbnQgUlBUX0Mgb25seSB1bmRlciBtb3JlCisgCXJlc3RyaWN0ZWQgY29uZGl0aW9ucy4KKworTW9uIE1heSAxMSAxNzozMzo0NiAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChkb19zYXQqKTogTWFrZSAic2F0dXJhdGUgdG8gMCBiaXRzIiBwYXNzIHRocm91Z2ggZGF0YQorIAl1bmNoYW5nZWQuCisKK01vbiBNYXkgMTEgMTY6Mjc6MDQgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZW5naW5lLmMgKHNpbV9lbmdpbmVfcnVuKTogSW1wbGVtZW50IEREQlQgKGRlYnVnZ2VyIGRlYnVnIHRyYXApCisJZnVuY3Rpb25hbGl0eS4KKworRnJpIE1heSAgOCAxNjo0NDoxOSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChkb190cmFwKTogU2V0IGJQQyB0byBSUFRfUyBpZiB0cmFwIGlzIGxhc3QKKwlpbnN0cnVjdGlvbiBpbiByZXBlYXQgYmxvY2suCisJKGJzciovanNyKik6IFNldCBSNjIgKExJTkspIHRvIFJQVF9TIGlmIHN1YnJvdXRpbmUgYnJhbmNoCisJaXMgbGFzdCBpbnN0cnVjdGlvbiBpbiByZXBlYXQgYmxvY2suCisKK0ZyaSBNYXkgIDggMTE6MDY6NTAgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAoZG9fc2F0aCk6IFF1ZXJ5L3VwZGF0ZSBGNC9QU1dfUyB1c2luZyBwcm9wZXIgZmxhZworIAltYWNyby4KKwkqIGNwdS5oIChQU1dfU19GTEFHKTogTmV3IGZsYWcgbnVtYmVyIGZvciBQU1dfUyBzdGF0dXMgYml0LgorCitXZWQgTWF5ICA2IDE5OjQwOjU2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNpbS1tYWluLmggKElOU05fTkFNRSk6IE5ldyBhcmcgYGNwdScuCisKK0ZyaSBNYXkgIDEgMTQ6MjQ6MzAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zOiBGaXggcGFyYW1ldGVyIGxpc3QgdG8gc2ltX2VuZ2luZV9hYm9ydC4KKworVGh1IEFwciAzMCAxNDoyODowMCAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAoZG9fc2F0aCk6IEFkZCBhZGRpdGlvbmFsIGFyZ3VtZW50IHRoYXQgZGV0ZXJtaW5lcworCXdoZXRoZXIgb3Igbm90IHRoZSBGNCAoUFNXX1MpIGJpdCBpbiB0aGUgUFNXIGlzIHVwZGF0ZWQuCisJKFNBVDJIKTogRG8gbm90IHVwZGF0ZSBQU1dfUyBiaXQuCisJKFNBVEhwKTogRG8gdXBkYXRlIFBTV19TIGJpdC4KKworVHVlIEFwciAyOCAyMzozNjowMCAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAoU1JBSHAsIFNSTEhwKTogIEltbWVkaWF0ZSB2YWx1ZXMgYXJlIHNpZ25lZCA2IGJpdAorCXZhbHVlcywgbm90IDUgYml0IHZhbHVlcy4KKworV2VkIEFwciAyOSAxMjo1Nzo1NSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChkb19pbmNyKTogQ2hlY2sgbW9kdWxhciBhcml0aG1ldGljIGxpbWl0cyBhZnRlcgorIAlwb3N0aW5jcmVtZW50L3Bvc3RkZWNyZW1lbnQsIHJhdGhlciB0aGFuIGJlZm9yZSwgdG8gbWF0Y2gKKyAJZXJyb25lb3VzIGhhcmR3YXJlIGJlaGF2aW9yLgorCitUdWUgQXByIDI4IDE4OjMzOjMxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK01vbiBBcHIgMjcgMTk6NDI6MDAgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGRvX3RyYXApOiBDbGVhciBhbGwgYml0cyBpbiBQU1cgZXhjZXB0IFNNIGFuZCBEQi4KKworTW9uIEFwciAyNyAxNDo1NTowMCAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAoZG9fbXVseDJoKTogTG93IG9yZGVyIHJlc3VsdHMgZ28gaW4gcmErMSwgaGlnaAorCW9yZGVyIGluIHJhLgorCitNb24gQXByIDI3IDE0OjQyOjAwIDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChkb19tdWx4MmgpOiBSZXdyaXRlIHRvIGRvIHByb3BlciAzMiBiaXQgc2lnbmVkCisJbXVsdGlwbHkgb2YgaGlnaCBhbmQgbG93IGZpZWxkcyBmcm9tIG9wZXJhbmRzLgorCitTdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitTdW4gQXByIDI2IDE1OjIwOjIwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogYWNjb25maWcuaDogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KKworRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworRnJpIEFwciAyNCAxMToyMDowMCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBzaW5jbHVkZS4KKworV2VkIEFwciAyMiAyMToyMzowMCAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogaWMtZDMwdiAoUmJVLCBSY1UpOiBVbnNpZ25lZCB2ZXJzaW9ucyBvZiBSYiBhbmQgUmMuCisJKiBkMzB2LWluc25zIChNVlRBQ0MpOiBVc2UgbmV3IFJiVSBhbmQgUmNVIG1hY3Jvcy4KKworV2VkIEFwciAyMiAyMDo1MjowMCAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogaWMtZDMwdiAoUmJIVSxSYkxVKTogVW5zaWduZWQgdmVyc2lvbnMgb2YgUmJIIGFuZCBSYkwuCisJKiBkMzB2LWluc25zIChTUkwySCk6IFVzZSBuZXcgUmJIVSBhbmQgUmJMVSBtYWNyb3MgaW5zdGVhZCBvZgorCVJiSCBhbmQgUmJMLgorCitNb24gQXByIDEzIDE2OjU5OjAwIDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChkb19zcmwpOiBBdm9pZCB1bmRlZmluZWQgYmVoYXZpb3Igb2YgaG9zdCBjb21waWxlcgorCXdoZW4gc2hpZnRpbmcgbGVmdCBieSBtb3JlIHRoYW4gMzEgYml0cy4KKworVHVlIEFwciAgNyAxODowOTowMCAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZW5naW5lLmMgKHNpbV9lbmdpbmVfcnVuKTogUmVtb3ZlIGF0X2xvb3BfZW5kIHZhcmlhYmxlLiBBZGQKKwlycF93YXNfc2V0IGFuZCBycHRfY193YXNfbm9uemVybyB2YXJpYWJsZXMuICBNYWpvciByZXN0cnVjdHVyaW5nIG9mCisJY29kZSBiZWZvcmUgYW5kIGFmdGVyIGluc3RydWN0aW9uIGV4ZWN1dGlvbiB0byBwcm9wZXJseSBoYW5kbGUgc3RhdGUKKwlvZiB0aGUgUlAgYml0IGluIHRoZSBQU1csIHRoZSB2YWx1ZSBpbiBSUFRfQywgYW5kIG90aGVyIGxvb3AgcmVsYXRlZAorCXByb2JsZW1zLgorCitTYXQgQXByICA0IDIwOjM2OjI1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitGcmkgQXByICAzIDE1OjI2OjAwIDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChkb190cmFwKTogVXNlIG9mZnNldCBmcm9tIEVJVF9WQiByYXRoZXIgdGhhbiBoYXJkY29kZWQKKwlCQVNFX0FERFJFU1MgY29uc3RhbnQuCisJKiBjcHUuaCAoQkFTRV9BRERSRVNTKTogUmVtb3ZlIGNvbnN0YW50IG5vdCB1c2VkIGFueSBsb25nZXIuCisKK0ZyaSBBcHIgIDMgMTQ6NDI6MDAgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGNwdS5oIChFSVRfVkIpOiBEZWZpbmUgbWFjcm8gdG8gYWNjZXNzIEVJVF9WQiByZWdpc3Rlci4KKwkoRUlUX1ZCX0RFRkFVTFQpOiBEZWZpbmUgdmFsdWUgb2YgRUlUX1ZCIHJlZ2lzdGVyIGFmdGVyIHJlc2V0LgorCSogc2ltLWNhbGxzLmMgKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBTZXQgRUlUX1ZCIHRvIEVJVF9WQl9ERUZBVUxULgorCitUdWUgTWFyIDMxIDE5OjAwOjAwIDE5OTggIEZyZWQgRmlzaCA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGRvX2RicmFpKTogUlBUX1MgaXMgY2lhIHBsdXMgcGNkaXNwIHJhdGhlciB0aGFuCisJanVzdCBwY2Rpc3AuCisKK01vbiBNYXIgMzAgMjA6MzA6MDAgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGVuZ2luZS5jIChzaW1fZW5naW5lX3J1bik6IEFkZCBhdF9sb29wX2VuZC4gIFJld29yayBlbmQgb2YgbG9vcAorCWNvZGUgdG8gdXNlIHRoaXMgdG8gYm90aCByZXNldCBQU1dfUlAgd2hlbiBuZWVkZWQgYW5kIHRvIHNldCBQQworCXRvIFJQVF9TIGZvciBhbm90aGVyIHBhc3MgdGhyb3VnaCB0aGUgbG9vcC4KKworTW9uIE1hciAzMCAxNjoxMjowMCAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogZW5naW5lLmMgKHNpbV9lbmdpbmVfcnVuKTogQ2hhbmdlIGNvZGUgdGhhdCBoYW5kbGVzIFJQVF8qIHJlZ3MKKwlhbmQgUFNXX1JQIGJpdCBpbiBQU1cgc28gdGhhdCBQU1dfUlAgaXMgYWx3YXlzIHNldCB3aGlsZSBleGVjdXRpbmcKKwl0aGUgbG9vcCBhbmQgbG9vcCB0ZXJtaW5hdGVzIHVwb24gY29tcGxldGlvbiBvZiB0aGUgcGFzcyBmb3Igd2hpY2gKKwlSUFRfQyBpcyB6ZXJvLiAgTW9yZSBjbG9zZWx5IGZvbGxvdyBsb2dpYyBpbiBhcmNoaXRlY3R1cmUgbWFudWFsLgorCitGcmkgTWFyIDI3IDE2OjE1OjUyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgTWFyIDI1IDEyOjM1OjI5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUaHUgTWFyIDE5IDAwOjI1OjQzIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWNhbGxzLmMgKHNpbV9vcGVuKTogTW92ZSBtZW1vcnktcmVnaW9uIGNvbW1hbmRzIGJhY2sgdG8KKyAJYmVmb3JlIHRoZSBjYWxsIHRvIHNpbV9wYXJzZV9hcmdzLgorCShkMzB2X29wdGlvbl9oYW5kbGVyKTogSW1wbGVtZW50IGV4dG1lbS1zaXplIG9wdGlvbiB1c2luZworIAltZW1vcnktZGVsZXRlIGFuZCBtZW1vcnktcmVnaW9uIGNvbW1hbmRzLgorCisJKiBzaW0tY2FsbHMuYyAoZDMwdl9vcHRpb25faGFuZGxlcik6IFVzZSBBTlNJLUMgYXJndW1lbnQgbGlzdCwKKyAJY29ycmVjdCBudW1iZXIgYW5kIHR5cGUgb2YgYXJndW1lbnRzLgorCQorV2VkIE1hciAxOCAxMjozODoxMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIE1hciAxMSAxMzo1NjozMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGFsdS5oIChJTUVNLCBNRU0sIFNUT1JFKTogUmVwbGFjZSBzaW1fY29yZV8qX21hcCB3aXRoIGV4ZWNfbWFwLAorIAlyZWFkX21hcCBhbmQgd3JpdGVfbWFwIHJlc3AuCisKKwkqIGNwdS5jIChkMzB2X3JlYWRfbWVtLCBkMzB2X3dyaXRlX21lbSk6IERpdHRvLgorCitNb24gTWFyICAyIDEzOjM0OjA4IDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChkb19yZXBlYXQpOiBBYm9ydCByZXBlYXQgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZQorCWEgcmVwZWF0IGNvdW50IG9mIHplcm8uCisKK0ZyaSBGZWIgMjcgMTg6NDQ6MTIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc2ltLWNhbGxzLmMgKHNpbV9vcGVuKTogVXBkYXRlIGNhbGwgdG8gc2ltX2FkZF9vcHRpb25fdGFibGUuCisKK1RodSBGZWIgMjYgMTg6MzQ6MzEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tY2FsbHMuYyAoc2ltX2luZm8pOiBEZWxldGUuCisKK1dlZCBGZWIgMjUgMTQ6NDQ6NTggMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKG12dHN5cyk6IElmIG1vdmluZyB0byBFSVRfVkIgcmVnaXN0ZXIsIGFuZCB3aXRoCisJdmFsaWQgYml0cy4gIE9wdGltaXplIGNvZGUgc29tZXdoYXQuCisKKwkqIGNwdS5oIChlaXRfdmVjdG9yX2Jhc2VfY3IpOiBOZXcgQ1Igd2UgbmVlZCB0byBzcGVjaWFsIGNhc2UuCisJKEVJVF9WQUxJRCk6IFZhbGlkIGJpdHMgZm9yIEVJVF9WQiByZWdpc3Rlci4KKwkKKwkqIGQzMHYtaW5zbnMgKG12e2YsdH1zeXMpOiBXaGVuIG1vdmluZyB0by9mcm9tIFBTV0gsIHRoZSB2YWx1ZSBpcworCWluIHRoZSBsb3cgMTYgYml0cyBvZiB0aGUgcmVnaXN0ZXIuCisKKwkqIGQzMHYtaW5zbnMgKGRvX3NyYSk6IFVzZSBhIGNvbW1vbiBXUklURTMyX1FVRVVFIHRvIHdyaXRlIGJhY2sKKwlyZXN1bHRzLgorCShkb19zcnthLGx9aCk6IERvIHNoaWZ0IGluIDMyIGJpdHMsIG9ubHkgdHJ1bmNhdGUgd2hlbiB3cml0aW5nCisJcmVzdWx0IGJhY2sgdG8gdGhlIHJlZ2lzdGVycy4KKworVHVlIEZlYiAyNCAxODowOTo1MiAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKHRtcC1pZ2VuKTogVXNlIC1HIGdlbi16ZXJvLXIwIG9wdGlvbiB0byBmb3JjZQorCXIwIHRvIGFsd2F5cyBiZSB6ZXJvLgorCSogY3B1LmggKEdQUl9TRVQpOiBEZWZpbmUuCisKK1R1ZSBGZWIgMjQgMTQ6MTI6NTcgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGRvX3NhdGgpOiBEbyBzYXR1cmF0aW9uIGluIDMyIGJpdHMsIGJlZm9yZQorCWNvbnZlcnRpbmcgdG8gMTYuCisJKHNhdHssMmgseixocH0pOiBVc2UgaW1tXzUsIG5vdCBpbW0gdG8gZ2V0IHByb3BlciB6ZXJvIGV4dGVuZC4KKwkoZG9fc2F0aF9wKTogRGVsZXRlLCBubyBsb25nZXIgdXNlZC4KKwkoc2F0aHApOiBDYWxsIGRvX3NhdGgsIG5vdCBkb19zYXRoX3AuCisKK01vbiBGZWIgMjMgMTU6NTU6MTQgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGlsbGVnYWwsd3Jvbmdfc2xvdCk6IFByaW50IFxuIGFmdGVyIFBDIGFuZCBiZWZvcmUgd2UKKwljYWxsIHNpbV9lbmdpbmVfaGFsdC4KKwkoc3J7YSxsfWhwKTogSW1wbGVtZW50IG1pc3NpbmcgaW5zdHJ1Y3Rpb25zLgorCShkb190cmFwKTogUHJpbnQgaGlnaCBvcmRlciBQU1cgYml0cyBpbiBodW1hbiByZWFkYWJsZSBmYXNoaW9uLgorCShkb197ZGJyYXssaX0sZGJzcnssaX0sZGptcHssaX0sZGpzcnssaX0scmVwZWF0fSk6IFNldCBQU1cgYml0IFJQLgorCisJKiBhbHUuaCAoUFNXX1NFVF9RVUVVRSk6IE5ldyBtYWNybyB0byBzZXQgUFNXIGJpdHMuCisKKwkqIGVuZ2luZS5jIChzaW1fZW5naW5lX3J1bik6IENoZWNrIGZvciBSUCBiaXQgYmVpbmcgc2V0LCBub3QgUlBUX0MKKwliZWluZyA+IDAuICBJZiBSUFRfQyBpcyBkZWNyZW1lbnRlZCB0byAwLCBjbGVhciBQU1cgUlAgYml0LgorCitGcmkgRmViIDIwIDEwOjEzOjM0IDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBjcHUuaCAoQkFTRV9BRERSRVNTKTogQ2hhbmdlIGZyb20gMHhmZmZmZjAwMCB0byAweGZmZmZmMDIwLgorCitUdWUgRmViIDE3IDEyOjM5OjUyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWNhbGxzLmMgKHNpbV9zdG9yZV9yZWdpc3Rlciwgc2ltX2ZldGNoX3JlZ2lzdGVyKTogUGFzcyBpbgorIAlsZW5ndGggcGFyYW1ldGVyLiAgUmV0dXJuIC0xLgorCitGcmkgRmViICA2IDE3OjM5OjU0IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChkb19kYnJhaSk6IENvcnJlY3QgdHlwbywgdXNlIHNoaWZ0LCBub3QgY29tcGFyaXNvbi4KKworU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworRnJpIEphbiAzMCAwODoyOToyMCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGVuZ2luZS5jIChzaW1fZW5naW5lX3J1bik6IEFkZCBwYXJhbWV0ZXIgbnJfY3B1cy4KKworRnJpIEphbiAzMCAxNzowOTozNyAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAoanNydHpyKTogQ2hlY2sgZm9yIHJlZ2lzdGVyID09IDAsIG5vdCAhPSAwLgorCitXZWQgSmFuIDIxIDE3OjUyOjA0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZW5naW5lLmMgKGRvX3N0YWNrX3N3YXApOiBNYWtlIHR5cGUgb2YgbmV3X3NwIHVuc2lnbmVkLgorCitNb24gSmFuIDE5IDIyOjI2OjI5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gSmFuICA1IDE2OjA0OjE3IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAc2FuZ3VpbmUuY3lnbnVzLmNvbT4KKworCSogc2ltLWNhbGxzLmMgKHNpbV9pbmZvKTogQ2FsbCBwcm9maWxlX3ByaW50LgorCisJKiBzaW0tbWFpbi5oOiBFbmFibGUgaW5zdHJ1Y3Rpb24gcHJvZmlsaW5nLgorCitUaHUgRGVjIDE4IDEyOjIxOjM4IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBhbHUuaCAoQUxVezE2LDMyfV9FTkQpOiBDaGFuZ2Ugc2V0dGluZyBQU1cgdG8gb25seSBzZXQgdGhlIGNhcnJ5CisJYW5kIG92ZXJmbG93IGJpdHMuICBEb24ndCBsb29rIGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIFBTVy4KKwkoUFNXX0ZMQUdfU0VUX1FVRVVFKTogT25seSBxdWV1ZSB1cCBzZXR0aW5nIHRoZSBwYXJ0aWN1bGFyIGJpdCBpbgorCXF1ZXN0aW9uLiAgRG9uJ3QgbG9vayBhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiBQU1cuCisKKwkqIGQzMHYtaW5zbnM6IEFsbCBpbnN0cnVjdGlvbnMgdGhhdCBzZXQgdGhlIFBTVywgd2lsbCBvbmx5IHF1ZXVlCisJdXAgdGhlIHBhcnRpY3VsYXIgYml0cyBpbiBxdWVzdGlvbiB0aGF0IHdlcmUgc2V0IGJ5IHRoZQorCWluc3RydWN0aW9uLiAgRG9uJ3QgbG9vayBhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiBQU1cuCisKK1dlZCBEZWMgMTcgMTE6NDE6NDQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNwdS5oIChQU1dfVkFMSUQpOiBBbGxvdyBFQS9EQiB0byBiZSBzZXQgaW4gdGhlIFBTVy4KKwkoRFBTV19WQUxJRCk6IExpa2UgUFNXX1ZBTElELCBidXQgaXQgYWxsb3dzIHRoZSBEUyBiaXQgdG8gYmUgc2V0LgorCisJKiBlbmdpbmUuYyAodHJhY2VfYWx1MzIpOiBXaGVuIGNoYW5naW5nIEJQU1cvRFBTVywgcHJpbnQgdGhlCisJc3BlY2lhbCBQU1cgYml0cy4KKworCSogZDMwdi1pbnNucyAoZG9fY21wX2NjKTogRml4IGNtcHBzIGFuZCBjbXBuZy4KKwkoZG9fY21weyx1fV9jYyk6IFByaW50IHdoaWNoIGNjIHZhbHVlIHdhcyB1c2VkIGlmIG5vdCBpbiBzd2l0Y2gKKwlzdGF0ZW1lbnQuCisJKGRvX2NtcHVfY2MpOiBSZW1vdmUgaWxsZWdhbCBjYXNlcyBDTVBVe0VRLE5FLFBTLE5HfS4KKwkobXZ0c3lzKTogV2hlbiBzZXR0aW5nIEJQU1cgb3IgRFBTVywgYW5kIHdpdGggRFBTV19WQUxJRC4KKworVHVlIERlYyAxNiAxODoxNzoyNiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAobXVseDJoKTogQWRkIG1pc3NpbmcgaW5zdHJ1Y3Rpb24uICBDb21wbGFpbiBpZgorCXJlZ2lzdGVyIGlzIG5vdCBldmVuLgorCShkb197YWRkLHN1Yn1oX3BwcCk6IEdldCBjb3JyZWN0IGhpZ2gvbG93IHZhbHVlcy4gIEFsc28gY29ycmVjdGx5CisJaGFuZGxlIHNob3J0IGltbWVkaWF0ZXMuCisJKGRvX2xkezJ3LDRiaH0pOiBEb24ndCBsb2FkIHIwIGlmIHJhID09IDAuCisKKwkqIGVuZ2luZS5jIChkMzB2X2ludGVycnVwdF9ldmVudCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKwkodW5xdWV1ZV93cml0ZXMpOiBEaXR0by4KKworTW9uIERlYyAxNSAyMzoxNzoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1NhdCBEZWMgMTMgMjM6NDA6MTcgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNwdS5oIChfd3JpdGV7MzIsNjR9KTogTmV3IHN0cnVjdHVyZXMgZm9yIGtlZXBpbmcgdHJhY2sgb2YKKwlxdWV1ZWQgd3JpdGVzIHRvIHJlZ2lzdGVycy4KKwkoX3NpbV9jcHUpOiBBZGQgX3dyaXRlezMyLDY0fSBzdHJ1Y3R1cmVzLiAgTWFrZSBpc19kZWxheWVkX2NhbGwKKwl1bnNpZ25lZDMyIGFsc28uCisJKFdSSVRFezMyLDY0fSopOiBOZXcgbWFjcm9zIGZvciBxdWV1ZWluZyB1cCB3cml0ZXMgdG8gcmVnaXN0ZXJzLgorCisJKiBhbHUuaCAoQUxVMTZfRU5EKTogVGFrZSBmaWVsZCB0aGF0IHNheXMgd2hldGhlciB3ZSBhcmUgc2V0dGluZworCXRoZSBoaWdoIG9yIGxvdyBoYWxmIHdvcmQuICBRdWV1ZSB1cCBjaGFuZ2VzIHRvIHJlZ2lzdGVycy4KKwkoQUxVMzJfRU5EKTogUXVldWUgdXAgY2hhbmdlcyB0byByZWdpc3RlcnMuCisJKFBTV19GTEFHX1NFVF9RVUVVRSk6IExpa2UgUFNXX0ZMQUdfU0VULCBleGNlcHQgcXVldWVzIGl0IHVwLgorCisJKiBzaW0tbWFpbi5oIChkb19zdGFja19zd2FwKTogUmVtb3ZlIGRlY2xhcmF0aW9uLgorCisJKiBlbmdpbmUuYyAoZG9fc3RhY2tfc3dhcCk6IE1ha2Ugc3RhdGljLgorCSh1bnF1ZXVlX3dyaXRlcyk6IE5ldyBmdW5jdGlvbiB0byB1bnF1ZXVlIGFsbCBjaGFuZ2VzIHRvIDMyIGFuZCA2NAorCWJpdCByZWdpc3RlcnMgaW4gb3JkZXIuICBJbXBsZW1lbnQgLS10cmFjZS1hbHUuICBSZXNldCBoaWdoIHdhdGVyCisJbWFya3MgZm9yICMgb2YgcXVldWVkIHJlZ2lzdGVycy4gIElmIFBTVyBjaGFuZ2VkLCBwb3NzaWJseSB1cGRhdGUKKwlzdGFjayBwb2ludGVyLgorCShkb197bG9uZywyX3Nob3J0LHBhcmFsbGVsfSk6IFVucXVldWUgcmVnaXN0ZXIgd3JpdGVzIGF0IHRoZQorCWFwcHJvcHJpYXRlIHRpbWUuCisKKwkqIGQzMHYtaW5zbnM6IE1vZGlmeSBhbGwgaW5zbnMgdG8gcXVldWUgY2hhbmdlcyB0byByZWdpc3RlcnMsCisJcmF0aGVyIHRoYW4gZG8gdGhlbSBpbW1lZGlhdGVseSBzbyB0aGF0IHBhcmFsbGVsIGluc3RydWN0aW9ucyBnZXQKKwl0aGUgcmlnaHQgdmFsdWVzIGZvciBpbnB1dHMuICBSZXdyaXRlIDE2IGJpdCBvcGVyYXRpb25zIHRvIGJlIGRvbmUKKwlpbiB0ZXJtcyBvZiBtYXNrZWQgMzIgYml0IHJlZ2lzdGVycy4gIERvbid0IGNhbGwgZG9fc3RhY2tfc3dhcCBhbnkKKwltb3JlIGhlcmUuCisKK1RodSBEZWMgMTEgMTA6MDY6MDIgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIHNpbS1jYWxscy5jIChkMzB2X29wdGlvbl9oYW5kbGVyKTogQWRkIHN1cHBvcnQgZm9yIC0tZXh0bWVtLXNpemUKKwl0byBzaXplIGV4dGVybmFsIG1lbW9yeS4KKwkoc2ltX29wZW4pOiBEaXR0by4gIERlZmF1bHQgaWYgbm8gLS1leHRtZW0tc2l6ZSBvcHRpb24gaXMgOCBtZWcuCisKK1dlZCBEZWMgMTAgMDE6MDg6MjQgMTk5NyAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChkb19yb3QyaCk6IENsaXAgcm90YXRlIGFtb3VudHMgdG8gZm91ciBiaXRzLiAgVGhlCisgCXVwcGVyIGJpdHMsIGFuZCB0aGUgc2lnbiBvZiB0aGUgcm90YXRpb24gYW1vdW50LCBhcmUgcmVkIGhlcnJpbmdzLgorCShkb19zcmEsIGRvX3NybCk6IEhhbmRsZSBzaGlmdHMgZ3JlYXRlciB0aGFuIDMyIGJpdHMuCisJKGRvX3NyYWgsIGRvX3NyYWwpOiBQcm9wZXJseSBzaWduLWV4dGVuZCB2YWx1ZSBhbmQgc2hpZnQgYW1vdW50LgorCUhhbmRsZSBzaGlmdHMgbGFyZ2VyIHRoYW4gMTYgYml0cy4KKworVGh1IERlYyAgNCAwOToyMTowNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK01vbiBEZWMgIDEgMTU6MTA6NDQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGRvX3N1YjJoKTogRm9yIHNob3J0IGluc3RydWN0aW9uLCBjb3JyZWN0bHkKKwlkdXBwbGljYXRlIGxvd2VyIDE2IGJpdHMgb2YgaW1tZWRpYXRlIGluIHVwcGVyIDE2IGJpdHMuCisJKHNhdDJ6KTogRml4IHR5cG8gdGhhdCBpZ25vcmVkIHRoZSB1cHBlciBoYWxmIG9mIHRoZSByZWdpc3Rlci4KKwkoZG9fc2F0eik6IElmIDwgMCwgc2V0ICpyYSB0byAwLCBpZiBub3QgY2FsbCBkb19zYXQuCisJKG12dHN5cyk6IEJlZm9yZSBzZXR0aW5nIFBTVywgYW5kIHdpdGggUFNXX1ZBTElELgorCisJKiBjcHUuaCAoUFNXX1ZBTElEKTogTWFzayBmb3IgYml0cyBpbiBQU1cgdGhhdCBpcyB2YWxpZC4KKworTW9uIERlYyAgMSAxNTowNTowMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisJCisJKiBkMzB2LWluc25zIChkb190cmFwKTogUGFjaWZ5IEdDQyAtIGNvcnJlY3QgdHlwZSBvZiAlbGQgYXJnIGluCisgCXByaW50ZiwgcmV0dXJuIGR1bW15IGF0IGVuZC4KKwkKK01vbiBEZWMgIDEgMTU6MDU6MDMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChkb19hZGQsIGRvX2FkZGhfcHBwLCBkb19hZGRzKTogUmVwbGFjZSBBTFVfQUREIHdpdGgKKyAJQUxVX0FEREMuCisJKGRvX2FkZGMpOiBSZXBsYWNlIEFMVV9TRVRfQ0FSUlkgLyBBTFVfQUREX0NBIHdpdGggQUxVX0FERENfQy4KKwkoZG9fc3ViLCBkb19zdWJoX3BwcCk6IFJlcGxhY2UgQUxVX1NVQiB3aXRoIEFMVV9TVUJCLgorCShkb19zdWJiKTogUmVwbGFjZSBBTFVfU0VUX0NBUlJZIC8gQUxVX1NVQl9DQSB3aXRoIEFMVV9TVUJCX0IuCisKKwkqIGFsdS5oIChBTFUxNl9FTkQpOiBVc2UgQUxVMTZfSEFEX0NBUlJZX0JPUlJPVyBpbnN0ZWFkIG9mCisgCUFMVTE2X0hBRF9DQVJSWS4KKwkoQUxVMzJfRU5EKTogRGl0dG8uCisKKwkqIHNpbS1tYWluLmggKHN0cmluZy5oLCBzdHJpbmdzLmgpOiBJbmNsdWRlLgorCQorCSogc2ltLWNhbGxzLmM6IERlbGV0ZSBpbmNsdXNpb24gb2Ygc3RyaW5nLmggYW5kIHN0cmluZ3MuaC4KKwkKK1N1biBOb3YgMzAgMTc6Mjk6MjUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtc2ltLXRyYXBkdW1wKTogTmV3IHN3aXRjaCB0byBjb250cm9sCisJd2hldGhlciB0cmFwcyAwLi4zMCBkdW1wIG91dCB0aGUgcmVnaXN0ZXJzIG9yIGRvIHRoZSByZWFsIHRyYXAuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKwkqIE1ha2VmaWxlLmluIChTSU1fRVhUUkFfQ0xGQUdTKTogQWRkIC1EVFJBUERVTVA9ezAsMX0gaWYKKwlhcHByb3ByaWF0ZSAtLXtlbixkaXN9YWJsZS1zaW0tdHJhcGR1bXAgaXMgZG9uZS4KKworCSogc2ltLWNhbGxzLmMgKE9QVElPTl9UUkFDRV9DQUxMKTogUmVuYW1lIGZyb20gT1BUSU9OX0NBTExfVFJBQ0UuCisJKE9QVElPTl9UUkFDRV9UUkFQRFVNUCk6IE5ldyBvcHRpb24gZm9yIC0tdHJhY2UtdHJhcGR1bXAuCisJKGQzMHZfb3B0aW9uX2hhbmRsZXIpOiBBZGQgc3VwcG9ydCBmb3IgLS10cmFjZS10cmFwZHVtcC4KKwkoZDMwdl9vcHRpb25zKTogRGl0dG8uCisJKHNpbV9vcGVuKTogRGl0dG8uCisKKwkqIGQzMHYtaW5zbnMgKGRvX3RyYXApOiBEbyByZWdpc3RlciBkdW1wIGlmIC0tdHJhY2UtdHJhcGR1bXAgYW5kCisJbm90IHRoZSBzeXN0ZW0gY2FsbCB0cmFwLiAgUmVtb3ZlIHN1cHBvcnQgZm9yIGNhbGxpbmcgb2xkIGZ1bmN0aW9uCisJc2ltX2lvX3N5c2NhbGxzLgorCitTYXQgTm92IDI5IDE4OjU0OjU1IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjcHUuaCAoX3NpbV9jcHUpOiBBZGQgdHJhY2VfY2FsbF9wLCB0cmFjZV9hY3Rpb24gZmllbGRzLgorCShUUkFDRV9DQUxMX1ApOiBOb24temVybyBpZiAtLXRyYWNlLWNhbGwuCisJKFRSQUNFX0FDVElPTik6IE5vbi16ZXJvIGlmIHRoZXJlIGlzIGEgdHJhY2luZyBhY3Rpb24gYXQgdGhlIGVuZAorCW9mIHByb2Nlc3NpbmcgYW4gaW5zdHJ1Y3Rpb24gYm91bmRhcnkuCisJKFRSQUNFX0FDVElPTl97Q0FMTCxSRVRVUk59KTogQml0cyB0byBzYXkgdHJhY2UgY2FsbCAmIHJldHVybi4KKwkoZDMwdl9uZXh0X2luc24pOiBEZWxldGUsIG5vdyB0cmFjZV9hY3Rpb24gZmllbGQgaW4gY3B1IHN0YXRlLgorCisJKiBjcHUuYyAoZDMwdl9uZXh0X2luc24pOiBEZWxldGUsIG5vdyB0cmFjZV9hY3Rpb24gZmllbGQgaW4gY3B1CisJc3RhdGUuCisJKHJldHVybl9vY2N1cnJlZCk6IE1pbmltdW0gc2F2ZWQgcmVnaXN0ZXIgdG8gY2hlY2sgaXMgbm93IDM0LgorCisJKiBlbmdpbmUuYyAoc2ltX2VuZ2luZV9ydW4pOiBDaGFuZ2UgY2FsbCB0cmFjaW5nIHRvIHVzZQorCXRyYWNlX2FjdGlvbiBmaWVsZCBpbiBjcHUgc3RhdGUuCisKKwkqIHNpbS1jYWxscy5jIChkMzB2X29wdGlvbl9oYW5kbGVyKTogSGFuZGxlIGQzMHYgc3BlY2lmaWMgb3B0aW9ucy4KKwkoZDMwdl9vcHRpb25zKTogRDMwViBzcGVjaWZpYyBvcHRpb25zLiAgUmlnaHQgbm93LCAtLXRyYWNlLWNhbGwuCisJKHNpbV9vcGVuKTogUmVnaXN0ZXIgZDMwdiBzcGVjaWZpYyBvcHRpb25zLgorCisJKiBkMzB2LWluc25zIChjYWxsLCByZXR1cm4gaW5zbnMpOiBNb3ZlIC0tdHJhY2UtZGVidWcgY2FsbC9yZXR1cm4KKwl0cmFjaW5nIGFjdGlvbiB0byBkMzB2IHNwZWNpZmljIC0tdHJhY2UtY2FsbCBvcHRpb24uCisKK0ZyaSBOb3YgMjggMjA6MTI6NDggMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNwdS5oIChDUkVHKTogUmVuYW1lIGZyb20gQ1IuCisKKwkqIGQzMHYtaW5zbnMgKGRvX3thZGRjLHN1YmJ9KTogRXhwbGljaXRseSBpbXBvcnQgdGhlIGNhcnJ5IGJpdC4KKwkoZG9fdHJhcCk6IFVzZSBDUkVHLCBub3QgQ1IuICBTd2l0Y2ggdG8gdXNpbmcgY2Jfc3lzY2FsbC4KKworVGh1IE5vdiAyNyAxOToyNTo0MyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY3B1LmggKEFDQyk6IERlZmluZSBhcyBzaG9ydCBjdXQgdG8gYWNjdW11bGF0b3JzLgorCisJKiBkMzB2LWluc25zIChkb19yb3QpOiBEZWxldGUgZXhwbGljaXQgZnVuY3Rpb24sIHVzZSBST1QzMiB0byBkbworCXJvdGF0ZSBpbnN0cnVjdGlvbi4KKwkoZG9fdHJhcCk6IE1ha2UgdHJhcCAzMCBwcmludCBvdXQgYWNjdW11bGF0b3JzIGFuZCBmaXJzdCAxNgorCWNvbnRyb2wgcmVnaXN0ZXJzIGFzIHdlbGwuCisJKGRvX2F2Zyk6IFNpZ24gZXh0ZW5kIHRvIDY0IGJpdCB0eXBlIGJlZm9yZSBkb2luZyBhZGQvc2hpZnQuCisJKGRvX2F2ZzJoKTogU2lnbiBleHRlbmQgMTYgYml0IGNodW5rcyBiZWZvcmUgZG9pbmcgYWRkL3NoaWZ0LgorCitXZWQgTm92IDI2IDE1OjIwOjI0IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChOTF9UQVJHRVQpOiBEZWZpbmUuCisKK1dlZCBOb3YgMjYgMTY6NTU6MzggMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNwdS5oIChkMzB2X25leHRfaW5zbik6IE5ldyBmbGFnIGZvciB0aGluZ3Mgd2UgYXJlIHN1cHBvc2VkIHRvCisJdHJhY2UgYmV0d2VlbiBpbnN0cnVjdGlvbiB3b3Jkcy4KKwkoe2NhbGwscmV0dXJufV9vY2N1cnJlZCk6IFJlbW92ZSBpbmRleCBhcmd1bWVudC4KKwkoZDMwdl97cmVhZCx3cml0ZX1fbWVtKTogQWRkIGRlY2xhcmF0aW9ucy4KKworCSogY3B1LmMgKGQzMHZfbmV4dF9pbnNuKTogTmV3IGZsYWcgZm9yIHRoaW5ncyB3ZSBhcmUgc3VwcG9zZWQgdG8KKwl0cmFjZSBiZXR3ZWVuIGluc3RydWN0aW9uIHdvcmRzLgorCSh7Y2FsbCxyZXR1cm59X29jY3VycmVkKTogUmVtb3ZlIGluZGV4IGFyZ3VtZW50LgorCShkMzB2X3tyZWFkLHdyaXRlfV9tZW0pOiBOZXcgZnVuY3Rpb25zIGZvciByZWFkaW5nL3dyaXRpbmcKKwlzaW11bGF0ZWQgbWVtb3J5IGluIHRoZSBuZXcgY29tbW9uIHN5c3RlbSBjYWxsIHN1cHBvcnQuCisKKwkqIGQzMHYtaW5zbnM6IFNldCBlbWFjcyBDIG1vZGUuCisJKGNhbGwvcmV0dXJuIGluc25zKTogU2V0IGJpdCB0byB0cmFjZSBjYWxsIGF0IGluc3RydWN0aW9uCisJYm91bmRhcnksIHJhdGhlciB0aGFuIGRvaW5nIGl0IGhlcmUuCisJKGRvX3RyYXApOiBTZXQgdXAgdG8gdXNlIG5ldyBjb21tb24gc3lzdGVtIGNhbGwgaW50ZXJmYWNlLgorCisJKiBlbmdpbmUuYyAoc2ltX2VuZ2luZV9ydW4pOiBJZiBkMzB2X25leHRfaW5zbiBpcyBub24gemVybywgZG8KKwlmdW5jdGlvbiBjYWxsL3JldHVybiB0cmFjaW5nLgorCitNb24gTm92IDI0IDE2OjQwOjQ5IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChibm90KTogQ29ycmVjdGx5IHJlc2V0IGJpdCBpbiBxdWVzdGlvbi4KKwkoZG9fdHJhcCk6IFVzZSBjb21tb24gc3lzdGVtIGNhbGwgZW11bGF0aW9uIHN1cHBvcnQsIHJhdGhlciB0aGFuCisJb3VyIGhvbWUgZ3Jvd24gc3VwcG9ydC4KKworU3VuIE5vdiAyMyAyMjo0NzoyMCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAobXZmYWNjKTogSW1tZWRpYXRlIGZpZWxkIGlzIHVuc2lnbmVkLCBhbGxvd2luZworCXNoaWZ0cyBvZiB1cCB0byA2MyB0byBiZSBlbmNvZGVkLiAgQWxzbyBkbyBzaGlmdCBzaWduZWQsIHJhdGhlcgorCXRoYW4gdW5zaWduZWQuCisKKwkqIGljLWQzMHYgKElNTV82Uyk6IEFkZCBmaWVsZCBmb3IgNiBiaXQgdW5zaWduZWQgY29uc3RhbnRzLgorCisJKiBkMzB2LWluc25zIChjbXB1KTogU2hvcnQgY21wdSB6ZXJvIGV4dGVuZHMgaW1tZWRpYXRlLCBub3Qgc2lnbgorCWV4dGVuZHMuCisKK1NhdCBOb3YgMjIgMTk6MDQ6MzQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChpbGxlZ2FsLCB3cm9uZ19zbG90KTogUmVwbGFjZSBTSUdJTEwgd2l0aAorIAlTSU1fU0lHSUxMLgorCisJKiBzaW0tY2FsbHMuYyAoc2lnbmFsLmgpOiBEbyBub3QgaW5jbHVkZSwgcmVwbGFjZWQgYnkKKyAJc2ltLXNpZ25hbC5oLgorCisJKiBzaW0tbWFpbi5oIChzaWduYWwuaCk6IERvIG5vdCBpbmNsdWRlLCBpbmNsdWRlIHNpbS1zaWduYWwuaAorIAlpbnN0ZWFkLgorCitGcmkgTm92IDIxIDA5OjMzOjU0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY3B1LmMgKGNhbGxfb2NjdXJyZWQpOiBVc2UgWkFMTE9DIGluc3RlYWQgb2YgeG1hbGxvYy4KKwkocmV0dXJuX29jY3VycmVkKTogVXNlIHpmcmVlIGluc3RlYWQgb2YgZnJlZS4KKworV2VkIE5vdiAxOSAxMzoyODowOSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKHtsLHN9X3tzdXBwb3J0LHNlbWFudGljc30ubyk6IERlcGVuZCBvbiB0aGUgaW5jbHVkZQorCWZpbGVzIGluICQoRU5HSU5FX0gpLgorCisJKiBkMzB2LWluc25zIChkb197YWRkLGFkZGMsc3ViLHN1YmJ9KTogQUxVX3tBREQsU1VCfV9DQSBub3cgdGFrZXMKKwlhIFZBTCBhcmd1bWVudCB0byBhZGQvc3VidHJhY3QgYWxvbmcgd2l0aCB0aGUgY2FycnkuCisKK1R1ZSBOb3YgMTggMTU6MzM6NDggMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFNJTV9PQkpTKTogVXNlICQoU0lNX05FV19DT01NT05fT0JKUykuCisKK1R1ZSBOb3YgMTggMTM6NTY6MTUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGRvX3RyYXApOiBDaGFuZ2UgdG8gbmV3IHN5c3RlbSBjYWxsIG51bWJlcnMuICBBZGQKKwlyZWFkIGVtdWxhdGlvbi4KKworTW9uIE5vdiAxNyAxNDo0Mzo0NSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAobXVseCk6IEFkZCBtdWx4IGluc3RydWN0aW9uLgorCitTdW4gTm92IDE2IDE5OjA2OjU2IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjcHUuYyAoe2NhbGwscmV0dXJufV9vY2N1cnJlZCk6IE5ldyB0cmFjZSBmdW5jdGlvbnMgdG8gbWFyaworCWZ1bmN0aW9uIGNhbGxzIGFuZCByZXR1cm5zIGFuZCBjaGVjayB3aGV0aGVyIGFsbCBzYXZlZCByZWdpc3RlcnMKKwlyZWFsbHkgd2VyZSBzYXZlZC4KKworCSogY3B1LmggKHtjYWxsLHJldHVybn1fb2NjdXJyZWQpOiBBZGQgZGVjbGFyYXRpb24uCisKKwkqIGQzMHYtaW5zbnMgKHtic3IsIGpzcn0gcGF0dGVybnMpOiBDYWxsIGNhbGxfb2NjdXJyZWQgaWYKKwktLXRyYWNlLWRlYnVnIHRvIHRyYWNlIGZ1bmN0aW9uIGNhbGxzLgorCShqbXAgcmVnaXN0ZXIgcGF0dGVybik6IElmIHRoaXMgaXMgYSBqdW1wIHI2MiBhbmQgLS10cmFjZS1kZWJ1ZywKKwljYWxsIHJldHVybl9vY2N1cnJlZCB0byB0cmFjZSBmdW5jdGlvbiBjYWxscy4KKwkoYnNye3Rueix0enJ9KTogTW92ZSBzZXR0aW5nIHI2MiBpbnNpZGUgY29uZGl0aW9uYWwgYWdhaW5zdCByZWcuCisJKGRvX2xkMncpOiBHcmFiIG1lbW9yeSBpbiA2NC1iaXQgY2h1bmssIHRvIGNoZWNrIGFsaWdubWVudC4KKwkoZG9fc3Qydyk6IERpdHRvLgorCitTYXQgTm92IDE1IDIwOjU3OjU3IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zOiBVbmRvIGNoYW5nZXMgZnJvbSBOb3YuIDExLCBhbGxvd2luZyBmb3Igb2RkIHJlZ2lzdGVyCisJcGFpcnMsIHNpbmNlIHRoZSBtYWNoaW5lIGRvZXNuJ3Qgc3VwcG9ydCBzdWNoIHVzYWdlLiAgVHJhcCBvbiBvZGQKKwlyZWdpc3RlcnMsIHJhdGhlciB0aGFuIGdpdmUgYSB3YXJuaW5nLiAgS2VlcCBkb19zcmMgYW5kIGRvX3RyYXAKKwljaGFuZ2VzLgorCitGcmkgTm92IDE0IDExOjU5OjI5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAoZG9fdHJhcCk6IFBhY2lmeSBjb21waWxlciB3YXJuaW5ncyBmb3IgcHJpbnRmIGNhbGxzLgorCitUdWUgTm92IDExIDE4OjI2OjAzIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChub3RfcjYzX3JlZyk6IFJlbmFtZSBmcm9tIG1ha2VfZXZlbl9yZWcsIG9ubHkgY2hlY2sKKwlmb3IgcmVnaXN0ZXIgYmVpbmcgcjYzLiAgQ2hhbmdlIGNhbGxlcnMgbGQye2gsd30sIGxkNGJoeyx1fS4KKwkoZ2V0X3JlZ19ub3RfcjYzKTogUmVuYW1lIGZyb20gZ2V0X2V2ZW5fcmVnLCBhbmQgb25seSBjaGVjayBmb3IKKwlyZWdpc3RlciByNjMuICBDaGFuZ2UgY2FsbGVycyBzdDJ7dyxofSwgc3Q0Yi4KKwkoZG9fc3JjKTogQ29ycmVjdCByZWdpc3RlciBwYWlyIGZvciBzaGlmdCBsZWZ0LgorCShkb190cmFwKTogVGVtcG9yYXJpbHkgbWFrZSB0cmFwIDMwIHByaW50IG91dCB0aGUgcmVnaXN0ZXJzLgorCitUdWUgTm92ICA0IDA4OjUxOjIyIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChkb190cmFwKTogTWFrZSB0cmFwIDMxIGJlIHVzZWQgZm9yIHN5c3RlbSBjYWxscy4KKwlBZGQgcHJpbWl0aXZlIHdyaXRlIGFuZCBleGl0IHN5c3RlbSBjYWxscy4KKworCSogTWFrZWZpbGUgKEZJTFRFUik6IE5ldyBtYWtlIHZhcmlhYmxlIHRvIGZpbHRlciBvdXQga25vd24gaWdlbgorCXdhcm5pbmdzLgorCSh0bXAtaWdlbik6IEFkZCAkKEZJTFRFUikgb24gYWxsIDMgaW52b2NhdGlvbnMgb2YgaWdlbiB0byBmaWx0ZXIKKwlvdXQgd2FybmluZ3MgdGhhdCBzaG91bGQgYmUgaWdub3JlZCBieSBkZWZhdWx0LgorCitGcmkgT2N0IDMxIDE5OjM2OjUxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWNhbGxzLmMgKHNpbV9vcGVuKTogQ2hhbmdlIEVJVCB0byBtZW1vcnkgcmVnaW9uLgorCitGcmkgT2N0IDE3IDE2OjUxOjMxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogYWx1LmggKEFMVTE2X0VORCk6IEdldCByZXN1bHQgZnJvbSBBTFUxNl9PVkVSRkxPV19SRVNVTFQuCisJKEFMVTMyX0VORCk6IEdldCByZXN1bHQgZnJvbSBBTFUzMl9PVkVSRkxPV19SRVNVTFQuCisKK0ZyaSBPY3QgIDMgMDk6Mjg6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK01vbiBTZXAgMjkgMTU6MjM6MzUgMTk5NyAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmFieWxvbi01LmN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKE1WRlNZUyBNVlRTWVMpOiAgRml4IGJpdCBwYXR0ZXJucyBzbyB0aGF0IHRoZXNlCisJaW5zdHJ1Y3Rpb25zIGdldCByZWNvZ25pc2VkLgorCitXZWQgU2VwIDI0IDE3OjM4OjU3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgU2VwIDI0IDE3OjUxOjQzIDE5OTcgIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiAgQWRkIHNpbS1icmVhay5vLgorCSogKElOQ0xVREVfREVQUyk6ICBBZGQgdGNvbmZpZy5oLgorCSogYWx1LmggKE1FTSBTVE9SRSk6ICBDaGFuZ2UgdG8gc2ltX2NvcmVfcmVhZC93cml0ZV91bmFsaWduZWQgdG8KKwlhbGxvdyBmb3IgdHJhcHBpbmcgdW5hbGlnbmVkIGFjY2Vzc2VzLgorCSogY3B1Lmg6ICBEZWZpbmUgU0lNX0JSRUFLUE9JTlQgYXMgc3lzY2FsbCA1IGZvciBpbnRyaW5zaWMgYnJlYWtwb2ludAorCW1lY2hhbmlzbS4KKwkqIGQzMHYtaW5zbiAoc2hvcnQgc3lzY2FsbCk6ICBVc2Ugc3lzY2FsbCA1IGZvciBicmVha3BvaW50IGluc24uCisJKiBzaW0tY2FsbHMuYyAoc2ltX2ZldGNoX3JlZ2lzdGVyIHNpbV9zdG9yZV9yZWdpc3Rlcik6ICBJbXBsZW1lbnQuCisJKiB0Y29uZmlnLmluOiAgRGVmaW5lIFNJTV9IQVZFX0JSRUFLUE9JTlRTIHRvIGVuYWJsZSBpbnRyaW5zaWMKKwlicmVha3BvaW50IG1lY2hhbmlzbS4KKwkKK1R1ZSBTZXAgMjMgMTE6MDQ6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1R1ZSBTZXAgMjMgMTA6MTk6NTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoU0lNX1dBUk5JTkdTLCBTSU1fQUxJR05NRU5ULCBTSU1fRU5ESUFOLAorIAlTSU1fSE9TVEVORElBTiwgU0lNX1JFU0VSVkVEX0JJVFMpOiBEZWxldGUsIG1vdmVkIHRvIGNvbW1vbi4KKwkoU0lNX0VYVFJBX0NGTEFHUyk6IFVwZGF0ZS4KKwkKK01vbiBTZXAgMjIgMTE6NDY6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFNwZWNpZnkgc3RyaWN0IGFsaWdubWVudC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworRnJpIFNlcCAxOSAxNzo0NToyNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIFNlcCAxNSAxNzozNjoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworRnJpIFNlcCAxMiAxNjoxMzowNCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKyAgICAgICAgKiBzaW0tY2FsbHMuYyAoc2ltX29wZW4pOiBDaGFuZ2UgbWVtb3J5IHRvCisgICAgICAgIGludGVybmFsIGluc3QuIFJBTSBoJzAwMDAwMDAwLWgnMDAwMGZmZmYgKDY0S0IpCisgICAgICAgIGludGVybmFsIGRhdGEgUkFNICBoJzIwMDAwMDAwLWgnMjAwMDdmZmYgKDMyS0IpCisgICAgICAgIGV4dGVybmFsIFJBTSAgICAgICBoJzgwMDAwMDAwLWgnODAzZmZmZmYgKDRNQikKKyAgICAgICAgRUlUICAgICAgICAgICAgICAgIGgnZmZmZmYwMDAtaCdmZmZmZmZmZgorCisKK1RodSBTZXAgMTEgMDg6NTk6MzQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgc2ltLWhydy5vIG1vZHVsZS4KKworCSogc2ltLWNhbGxzLmMgKHNpbV9yZWFkKTogRGVsZXRlLiB1c2Ugc2ltLWhydy4KKwkoc2ltX3dyaXRlKTogRGVsZXRlLCB1c2Ugc2ltLWhydy4KKwkKKworVHVlIFNlcCAgOSAwMTozNjoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGljLWQzMHYgKGltbV81KTogVXBkYXRlIG5yIGFyZ3MgcGFzc2VkIHRvIExTTUFTS0VELgorCisJKiBkMzB2LWluc25zIChkb19zYXQsIGRvX3NhdGgsIGRvX3NhdGhfcCwgZG9fc2F0eiwgZG9fc2F0emgpOiBGaXgsCisgCWNvbXB1dGluZyB0aGUgbWF4IHNhdCB2YWx1ZSBpbmNvcnJlY3RseS4KKworVGh1IFNlcCAgNCAxNzoyMToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmE+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworRnJpIFNlcCAgNSAwOToxNTozMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGRvX21hYywgZG9fbWFjcywgZG9fbXN1YiwgZG9fbXVseHMpOiBVc2UgZXhwbGljaXQKKyAJdHlwZSBjYXN0IGluc3RlYWQgb2YgU0lHTkVENjQgbWFjcm8uCisKK1RodSBTZXAgIDQgMTA6Mjg6NDUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBJbmNsdWRlIHNpbS1tZW1vcHQubyBtb2R1bGUuCisKKwkqIHNpbS1jYWxscy5jIChzaW1fb3Blbik6IFBhc3MgemVybyBtb2R1bG8gYXJnIHRvIHNpbV9jb3JlX2F0dGFjaAorIAljYWxscy4KKwkoc2ltX29wZW4pOiBJZiBubyBtZW1vcnksIHVzZSBtZW1vcnkgY29tbWFuZHMgdG8gZXN0YWJsaXNoIGQzMHYKKyAJcmFtLgorCShkMzB2X29wdGlvbl9oYW5kbGVyKTogRGVsZXRlLCByZXBsYXNlZCBieSBzaW0tbWVtb3B0LmMuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBDYWxsIHNpbV9tb2R1bGVfaW5pdC4KKworCSogc2ltLW1haW4uaCAoc3RydWN0IHNpbV9zdGF0ZSk6IFJlbW92ZSBtZW1iZXJzIGVpdF9yYW0sCisgCXNpemVvZl9laXRfcmFtLCBleHRlcm5hbF9yYW0sIGJhc2VvZl9leHRlcm5hbF9yYW0sCisgCXNpemVvZl9leHRlcm5hbF9yYW0uIFVzaW5nIGdlbmVyaWMgbWVtb3J5IG1vZGVsIGluc3RlYWQuCisKK01vbiBTZXAgIDEgMTE6MDQ6MDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tY2FsbHMuYyAoc2ltX29wZW4pOiBVc2Ugc2ltX3N0YXRlX2FsbG9jLgorCitTYXQgQXVnIDMwIDEwOjAxOjUxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLW1haW4uaCAoSU5WQUxJRF9JTlNUUlVDVElPTl9BRERSRVNTKTogRGVmaW5lLgorCisJKiBlbmdpbmUuYyAoZG9fMl9zaG9ydCk6IENvbXBhcmUgd2l0aCBJTlZBTElEX0lOU1RSVUNUSU9OX0FERFJFU1MKKyAJbm90IC0xLgorCitXZWQgQXVnIDI3IDE4OjEzOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworV2VkIEF1ZyAyNyAxMzo0MTo1NCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1jYWxscy5jIChzaW1fb3Blbik6IEFkZCBjYWxsIHRvIHNpbV9hbmFseXplX3Byb2dyYW0sIHVwZGF0ZQorIAljYWxsIHRvIHNpbV9jb25maWcuCisKKwkqIHNpbS1jYWxscy5jIChzaW1fY3JlYXRlX2luZmVyaW9yKTogQWRkIEFCRkQgYXJndW1lbnQuCisgIAlJbml0aWFsaXplIENQVSByZWdpc3RlcnMgaW5jbHVkaW5nIFBDLgorCShzaW1fbG9hZCk6IERlbGV0ZSwgdXNpbmcgc2ltLWhsb2FkLgorCisJKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgc2ltLWhsb2FkLm8gbW9kdWxlLgorCitNb24gQXVnIDI1IDE3OjUwOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworTW9uIEF1ZyAyNSAxNTo0MTo0NCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1jYWxscy5jIChzaW1fb3Blbik6IEFkZCBBQkZEIGFyZ3VtZW50LgorCShzaW1fb3Blbik6IE1vdmUgc2ltX2NvbmZpZyBjYWxsIHRvIGFmdGVyIHNpbV9wYXJzZV9hcmdzLgorCShzaW1fb3Blbik6IENoZWNrIHNpbV9jb25maWcgcmV0dXJuIHN0YXR1cy4KKworRnJpIEF1ZyAyMiAxNjozODo1OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGRvX3N1YmhfcHBwKTogQ29ycmVjdCBuYW1lLCB3YXMgZG9fc3ViX3BwcC4KKwkoZG9fc3ViaF9wcHApOiBDb21wdXRlIHJjPXJiLXNyYyBpbnN0ZWFkIG9mIHNyYy1yYi4KKwkoZG9fYWRkaF9wcHApOiBEaXR0by4KKwkKK0ZyaSBKdW4gMjcgMTQ6NDM6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChtdmZzeXMsIG12dHN5cyk6IFN3aXRjaCBpbnN0cnVjdGlvbiBlbmNvZGluZ3MsIHdhcworIAl3cm9uZy4gIFVwZGF0ZSBoYW5kbGluZyBvZiBQU1dbRFNdIGJpdC4KKwkoZGJ0KTogRml4IGRlYnVnIHRyYXAgYWRkcmVzcy4KKworCSogY3B1LmggKE5SX0NPTlRST0xfUkVHSVNURVJTKTogQWxsb3cgdGhlIGZ1bGwgNjQgcmVnaXN0ZXJzLgorCitUdWUgSnVuIDI0IDEyOjQxOjU1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAoREJULCBSVEQpOiBTd2FwIHRoZSBzdGFjayBhZnRlciB1cGRhdGluZyB0aGUgUFNXLgorCShEQlQpOiBVc2UgUFNXX1NFVCB0byB1cGRhdGUgUFNXLgorCQorCSogYWx1LmggKEFMVTE2X0VORCk6IENoZWNrIGZvciAxNiBiaXQgY2FycnkgYW5kIG5vdCAzMiBiaXQuCisKK1R1ZSBKdW4gMjQgMTI6MTY6MTQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMi5jeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChwcHAsIGNjYywgcHAsIFhYLCBwKTogVXBkYXRlIGZvcm1hdCBmdW5jdGlvbnMgc28KKyAJdGhhdCB0aGV5IGFyZSBvZiBjbGFzcyAlcyBpbnN0ZWFkIG9mIGNsYXNzIGZ1bmN0aW9uLgorCitUdWUgSnVuIDEwIDEyOjI2OjM5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLW1haW4uaCAoZW5naW5lX2Vycm9yLCBlbmdpbmVfcmVzdGFydCwgZW5naW5lX2hhbHQsCisgCWVuZ2luZV9ydW5fdW50aWxfc3RvcCk6IERlbGV0ZSBwcm90b3R5cGVzLiAgRnVuY3Rpb25zIGRlbGV0ZWQKKyAJZWFybGllci4KKwkoZG9faW50ZXJydXB0X2hhbmRsZXIpOiBBZGQgcHJvdG90eXBlLgorCShzaW1fc3RhdGUpOiBBZGQgcGVuZGluZ19ldmVudCBtZW1iZXIgdG8gc3RydWN0LgorCisJKiBzaW0tY2FsbHMuYyAoc2ltX29wZW4pOiBDb25maWd1cmUgaW50ZXJydXB0IGhhbmRsZXIuCisJKiBlbmdpbmUuYyAoZDMwdl9pbnRlcnJ1cHRfZXZlbnQpOiBOZXcgZnVuY3Rpb24uICBEZWxpdmVyIGV4dGVybmFsCisgCWludGVycnVwdCB0byBwcm9jZXNzb3IuCisKKwkqIGQzMHYtaW5zbnMgKGRvX3N0YWNrX3N3YXApOiBNb3ZlIGZ1bmN0aW9uIGZyb20gaGVyZS4KKwkqIGVuZ2luZS5jIChkb19zdGFja19zd2FwKTogVG8gaGVyZS4KKwkqIHNpbS1tYWluLmggKGRvX3N0YWNrX3N3YXApOiBBZGQgcHJvdG90eXBlLgorCQorCSogY3B1LmggKHJlZ2lzdGVycyk6IENoYW5nZSBjdXJyZW50X3NwIHRvIGFuIGludC4KKwkqIGQzMHYtaW5zbiAoZG9fc3RhY2tfc3dhcCk6IFVwZGF0ZS4KKwkKK1RodSBKdW4gIDUgMTI6NTQ6MzUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChMRCosIFNUKik6IERpc2FzZW1ibGUgWFggPT0gMCBhcyBpbW1lZCB2ZXJzaW9uIG9mCisgCWluc3RydWN0aW9uLgorCShzdHJfWFhYKTogRml4IGNhc2Ugb2YgWFggPT0gMyAtIHJldHVybiAiLSIuCisKK1RodSBKdW4gIDUgMTI6NTQ6MzUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBlbmdpbmUuYyAoc2ltX2VuZ2luZV9ydW4pOiBJc3N1aW5nIEwtPlIgYW5kIFItPkwgaW5zdHJ1Y3Rpb25zIGluCisgCXdyb25nIG9yZGVyLgorCisJKiBkMzB2LWluc24gKENNUFVjYyBpbW0gbG9uZyk6IFdpdGggb2YgUkIgZmllbGQgc2hvdWxkIGJlIDYgbm90CisgCXRocmVlLgorCShNVUwsIE1VTDJILCBNVUxIWCk6IFggZmllbGQgMDEgaW5zdGVhZCBvZiAxMC4KKworVGh1IEp1biAgNSAxMjo1NDozNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKG12dHN5cyk6IERvbid0IG1vZGlmeSBEUyBiaXQgd2hlbiB3cml0aW5nIHRvIFBTVy4KKwkoZGJ0LCBydGQpOiBOZXcgaW5zdHJ1Y3Rpb25zLgorCisJKiBjcHUuaCAoTlJfQ09OVFJPTF9SRUdJU1RFUlMpOiBOb3cgMTUuCisJKGRlYnVnX3Byb2dyYW1fc3RhdHVzX3dvcmRfY3IsIGRlYnVnX3Byb2dyYW1fY291bnRlcl9jcik6IEFkZAorIAlkZWJ1ZyBjb250cm9sIHJlZ2lzdGVycy4gUmVudW1iZXIgb3RoZXIgY29udHJvbCByZWdpc3RlcnMuCisJKFBTV19EUyk6IE5ldyBQU1cgYml0LgorCShEUEMsIERQU1cpOiBEZWZpbmUuCisKK1dlZCBNYXkgMjggMTM6NDU6NDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBlbmdpbmUuYyAoc2ltX2VuZ2luZV9ydW4pOiBDaGVjayB0aGUgZXZlbnQgcXVldWUgb24gZXZlcnkgY3ljbGUuCisKKwkqIHNpbS1jYWxscy5jIChzaW1fc2l6ZSk6IERlbGV0ZS4KKwkoc2ltX2RvX2NvbW1hbmQpOiBDYWxsIHNpbV9hcmdzX2NvbW1hbmQuCisJKHNpbV9vcGVuKTogTW92ZSBlaXRfcmFtIGFuZCBzaXplb2ZfZWl0X3JhbSB0byBzaW1fc3RhdGUgc3RydWN0LgorCShzaW11bGF0aW9uKTogRGVsZXRlIGdsb2JhbCBub3cgZGVwZW5kIG9uIHNkIGFyZ3VtZW50LgorCShzaW1fb3Blbik6IEluaXRpYWxpemUgc2ltLXdhdGNoLgorCShkMzB2X29wdGlvbl9oYW5kbGVyKTogTmV3IGZ1bmN0aW9uLCBwYXJzZSBtZW0tc2l6ZSBhcmd1bWVudC4KKworVHVlIE1heSAyNyAxNDowMzozOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1jYWxscy5jIChzaW1fc2V0X2NhbGxiYWNrcyk6IERlbGV0ZS4KKwkoc2ltX3dyaXRlKTogUGFzcyBOVUxMIGNwdSBhcmcgdG8gc2ltX2NvcmVfd3JpdGVfYnVmZmVyLgorCisJKiBlbmdpbmUuYyAoZW5naW5lX2luaXQpOiBEZWxldGUuICBIYW5kbGVkIGluIHNpbV9vcGVuLgorCShlbmdpbmVfY3JlYXRlKTogRGl0dG8uCisJCitUdWUgTWF5IDIwIDEwOjE1OjM1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWNhbGxzLmMgKHNpbV9vcGVuKTogQWRkIGNhbGxiYWNrIGFyZ3VtZW50LgorCShzaW1fc2V0X2NhbGxiYWNrcyk6IERlbGV0ZSBTSU1fREVTQyBhcmd1bWVudC4KKworTW9uIE1heSAxOSAxNDo1OTozMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1jYWxscy5jIChzaW1fb3Blbik6IFNldCB0aGUgc2ltLmJhc2UgbWFnaWMgbnVtYmVyLgorCitGcmkgTWF5IDE2IDE1OjI1OjU5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNuczogUmVwbGFjZSBlbmdpbmVfZXJyb3Igd2l0aCBjb21tb24gc2ltX2VuZ2luZV9hYm9ydC4KKwkqIGNwdS5jIChpc19jb25kaXRpb25fb2ssIGlzX3dyb25nX3Nsb3QpOiBEaXR0by4KKworCSogZW5naW5lLmMgKGVuZ2luZV9ydW5fdW50aWxfc3RvcCk6IFJlbmFtZSB0aGlzLgorCShzaW1fZW5naW5lX3J1bik6IFRvIHRoaXMuIFNpbXBsaWZ5IC0gbW9zdCBtb3ZlZCB0byBjb21tb24uCisKKwkqIHNpbS1jYWxscy5jIChzaW1fc3RvcF9yZWFzb24sIHNpbV9yZXN1bWUsIHNpbV9zdG9wKToKKyAJRGVsZXRlLiBSZXBsYWNlZCBieSBjb21tb24gY29kZS4KKworCSogZW5naW5lLmMgKGVuZ2luZV9lcnJvciwgZW5naW5lX3Jlc3RhcnQsIGVuZ2luZV9oYWx0KTogRGl0dG8uCisJCisJKiBzaW0tbWFpbi5oIChTSU1fRU5HSU5FX1JFU1RBUlRfSE9PSywgU0lNX0VOR0lORV9IQUxUX0hPT0spOgorIAlEZWZpbmUgYXMgTk9Qcy4KKworTW9uIE1heSAgNSAyMzowNTo0MSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGFsdS5oIChJTUVNLCBNRU0sIFNUT1JFKTogVXBkYXRlIHRvIHJlZmxlY3QgY2hhbmdlcyB0byBjb3JlIGluCisgCS4uL2NvbW1vbi4KKwkqIHNpbS1jYWxscy5jIChzaW1fb3Blbik6IERpdHRvLgorCisJKiBhbHUuaCwgY3B1LmgsIGNwdS5jLCBkMzB2LWluc24sIGRjLXNob3J0OiBDbGVhbiB1cCBjb3B5cmlnaHQKKyAJbm90aWNlLgorCitGcmkgTWF5ICAyIDEyOjAxOjM4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWNhbGxzLmMgKHNpbS1vcHRpb25zLmgsIHNpbS11dGlscy5oKTogSW5jbHVkZS4KKwkqIE1ha2VmaWxlLmluIChzaW0tY2FsbHMubyk6IEFkZCBkZXBlbmRlbmNpZXMuCisKKwkqIGQzMHYtaW5zbnMgKGFkZHJlc3Nfd29yZCk6IFJlbW92ZSBjaWEgYXJndW1lbnQgZnJvbSBzdXBwb3J0CisgCWZ1bmN0aW9ucywgaWdlbiBub3cgZG9lcyB0aGlzIGF1dG9tYXRpY2FsbHkuCisKKwkqIE1ha2VmaWxlLmluICh0bXAtaWdlbik6IEluY2x1ZGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gaW4KKyAJZ2VuZXJhdGVkIGZpbGVzLgorCisJKiBzaW0tbWFpbi5oIChTSU1fREVTQyk6IFJlbW92ZSBzaW1fZXZlbnRzIGFuZCBzaW1fY29yZSwgbW92ZWQgdG8KKyAJc2ltdWxhdG9yIGJhc2UgdHlwZSBzaW1fc3RhdGVfYmFzZS4KKwkoc2ltLWNvcmUuaCwgc2ltLWV2ZW50cy5oLCBzaW0taW8uaCk6IFJlcGxhY2Ugd2l0aCAjaW5jbHVkZQorCSJzaW0tYmFzZS5oIi4KKworCSogc2ltLW1haW4uaCAoc2ltX3N0YXRlKTogVHJhY2sgcmVjb21lbmRhdGlvbnMgaW4gY29tbW9uCisgCWRpcmVjdG9yeS4KKyAgCSogY3B1LmggKHNpbV9jcHUpOiBEaXR0by4KKyAgCSogZW5naW5lLmMgKGRvXzJfc2hvcnQsIGRvX3BhcmFsbGVsKTogRGl0dG8uCisJKiBjcHUuaCAoR1BSKTogRGl0dG8uCisJKiBhbHUuaCAoTUVNLCBJTUVNLCBTVE9SRSk6IERpdHRvLgorCSogY3B1LmMgKGlzX3dyb25nX3Nsb3QpOiBEaXR0by4KKwkqIGljLWQzMHYgKEFhLCBBYik6IERpdHRvLgorCitUaHUgQXByIDI0IDAwOjM5OjUxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbW9kdWxlLm8sIHNpbS1wcm9maWxlLm8uCisJKiBzaW0tY2FsbHMuYyAoc2ltX29wZW4pOiBDYWxsIHNpbV9tb2R1bGVfdW5pbnN0YWxsIGlmIGFyZ3VtZW50CisJcGFyc2luZyBmYWlscy4gIENhbGwgc2ltX3Bvc3RfYXJndl9pbml0LgorCShzaW1fY2xvc2UpOiBDYWxsIHNpbV9tb2R1bGVfdW5pbnN0YWxsLgorCitGcmkgQXByIDE4IDEzOjQ0OjQ4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWNhbGxzLmMgKHNpbV9zdG9wKTogTmV3IGZ1bmN0aW9uLgorCitUaHUgQXByIDE3IDAyOjU3OjU1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbG9hZC5vLCBzaW0tb3B0aW9ucy5vLCBzaW0tdHJhY2Uuby4KKwkoU0lNX0VYVFJBX3tMSUJTLExJQkRFUFMsQUxMLElOU1RBTEx9KTogRGVsZXRlLgorCShTSU1fUlVOX09CSlMpOiBDaGFuZ2UgZnJvbSBydW4ubyB0byBucnVuLm8uCisJKiBjcHUuaCAoc2ltX2NwdSk6IE5ldyBtZW1iZXIgYmFzZS4gIERlbGV0ZSBtZW1iZXJzIHRyYWNlLCBzZC4KKwkoY3B1X3RyYWNlcyk6IERlbGV0ZS4KKwkqIGVuZ2luZS5jIChlbmdpbmVfaW5pdCk6IFNldCBiYWNrbGluayBmcm9tIGNwdSB0byBzdGF0ZS4KKwkqIHNpbS1jYWxscy5jOiAjaW5jbHVkZSBiZmQuaC4KKwkoc2ltX29wZW4pOiBTZXQgU1RBVEVfT1BFTl9LSU5ELiAgQ2FsbCBzaW1fcHJlX2FyZ3ZfaW5pdCwKKwlzaW1fcGFyc2VfYXJncy4KKwkoc2ltX2xvYWQpOiBSZXR1cm4gU0lNX1JDLiAgTmV3IGFyZyBhYmZkLgorCUNhbGwgc2ltX2xvYWRfZmlsZSB0byBsb2FkIGZpbGUgaW50byBzaW11bGF0b3IuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBSZXR1cm4gU0lNX1JDLiAgRGVsZXRlIGFyZyBzdGFydF9hZGRyZXNzLgorCShzaW1fdHJhY2UpOiBEZWxldGUuCisJKiBzaW0tbWFpbi5oIChzdHJ1Y3Qgc2ltX3N0YXRlKTogc2ltX3N0YXRlX2Jhc2UgaXMgdHlwZWRlZiBub3cuCisJKFNUQVRFX0NQVSk6IERlZmluZS4KKworTW9uIEFwciAgNyAxNTo0NTowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworV2VkIEFwciAgMiAxNTowNjoyOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoU0lNX0VYVFJBX0RFUFMpOiBEZWZpbmUuCisJKFNJTV9PQkpTKTogQWRkIHNpbS11dGlscy5vLgorCShTSU1fR0VOKTogRGVsZXRlIHRtcC1jb21tb24uCisJKFNJTV9FWFRSQV9DTEVBTik6IERlbGV0ZSBjbGVhbi1jb21tb24uCisJKEJVSUxUX1NSQ19GUk9NX0NPTU1PTik6IE1vdmVkIHRvIC4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbi4KKwkodG1wLWNvbW1vbixjbGVhbi1jb21tb24pOiBEZWxldGUuCisJKEVOR0lORV9IKTogc2ltLXN0YXRlLmggcmVuYW1lZCB0byBzaW0tbWFpbi5oLgorCShjbGVhbi1pZ2VuKTogRGVsZXRlIHRtcC1pbnNucy4KKworCSogY3B1LmM6IHNpbS1zdGF0ZS5oIHJlbmFtZWQgdG8gc2ltLW1haW4uaC4KKwkqIGVuZ2luZS5jOiBMaWtld2lzZS4KKwkqIHNpbS1jYWxscy5jOiBMaWtld2lzZS4KKwkoemFsbG9jLHpmcmVlKTogTW92ZWQgdG8gLi4vY29tbW9uL3NpbS11dGlscy5jLgorCSogc2ltLW1haW4uaDogUmVuYW1lZCBmcm9tIHNpbS1zdGF0ZS5oLgorCisJKiBzaW0tY2FsbHMuYyAoc2ltX29wZW4pOiBOZXcgYXJnIGBraW5kJy4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgQXByICAyIDE0OjM0OjE5IDE5OTcgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgQXByICAyIDExOjEzOjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBMaW5rIGluIHRoZSByZWNlbnRseSBhZGRlZCBzaW0tY29uZmlnLm8KKworCSogZW5naW5lLmMgKGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIsIGN1cnJlbnRfaG9zdF9ieXRlX29yZGVyLAorIAljdXJyZW50X2Vudmlyb25tZW50LCBjdXJyZW50X2FsaWdubWVudCwgY3VycmVudF9mbG9hdGluZ19wb2ludCwKKyAJY3VycmVudF9tb2RlbF9pc3N1ZSwgY3VycmVudF9zdGRpbyk6IERlbGV0ZSwgbW92ZWQgdG8KKyAJLi4vY29tbW9uL3NpbS1jb25maWcuYworCitNb24gTWFyIDI0IDE0OjUwOjMwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBkMzB2LWluc25zIChkb19sZHcpOiBMb2FkIDQgYnl0ZXMgbm90IDIuCisJKGRvX2luY3IsIExEKiwgU1QqKTogSW5jcmVtZW50IHJlZ2lzdGVyIG5vdCBpdHMgdmFsdWUuCisKK01vbiBNYXIgMjQgMDk6NTk6NTMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGNwdS5jIChpc193cm9uZ19zbG90KTogRGl0dG8uCisJKGlzX2NvbmRpdGlvbl9vayk6IERpdHRvLgorCisJKiBzaW0tY2FsbHMuYyAoc2ltX3RyYWNlKTogRGl0dG8uCisKKwkqIGVuZ2luZS5jIChlbmdpbmVfaW5pdCk6IERpdHRvLgorCShkb18yX3Nob3J0KTogRGl0dG8uCisJKGVuZ2luZV9ydW5fdW50aWxfc3RvcCk6IERpdHRvLgorCisJKiBkMzB2LWluc25zICh2b2lkKTogVXBkYXRlLiBGb3IgZnVuY3Rpb25zLCByZW1vdmUgYFNJTV9ERVNDIHNkJworIAlhbmQgYGNwdSAqcHJvY2Vzc29yJyBhcmd1bWVudHMgYXMgaWdlbiBub3cgaGFuZGxlcyB0aGlzLgorCisJKiBjcHUuaDogUmVuYW1lIHN0cnVjdCBfY3B1IHRvIHN0cnVjdCBfc2ltX2NwdS4gUmVuYW1lIHZhcmlhYmxlCisgCXByb2Nlc3NvciB0byBjcHUuCisKKwkqIHNpbS1zdGF0ZS5oOiBVcGRhdGUuCisKK0ZyaSBNYXIgMjEgMTI6NTI6MTIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGRvX3NhdCk6IENvcnJlY3QgY2FsY3VsYXRpb24gb2Ygc2F0dXJhdGUgbG93ZXIKKyAJYm91bmQuCisJKGRvX3NhdGgpOiBEaXR0by4KKwkoZG9fc2F0emgsIGRvX3NhdHopOiBBcmd1bWVudHMgc2hvdWxkIGJlIHNpZ25lZC4KKwkKKwkqIHNpbS1jYWxscy5jICh6YWxsb2MpOiBVc2UgbWFsbG9jKCkgaW5zdGVhZCBvZiB4bWFsbG9jKCkgZm9yCisgCW1vbWVudC4KKwkoZmlsdGVyX2ZpbGVuYW1lKTogRHJvcC4KKworCSogY3B1LmggKGlzX3dyb25nX3Nsb3QpOiBDb3JyZWN0IGRlY2xhcmF0aW9uIG5hbWUgLSB3YXMKKyAJaXNfdmFsaWRfc2xvdC4KKworCSogZW5naW5lLmMgKGRvX3BhcmFsbGVsKTogUGxpY2F0ZSBHQ0MuCisJKGVuZ2luZV9lcnJvcik6IERpdHRvLgorCShlbmdpbmVfcnVuX3VudGlsX3N0b3ApOiBEaXR0by4KKwkqIGNwdS5jIChpc193cm9uZ19zbG90KTogRGl0dG8uCisJKGlzX2NvbmRpdGlvbl9vayk6IERpdHRvLgorCSogc2ltLWNhbGxzLmMgKHNpbV9zaXplKTogRGl0dG8uCisJKHNpbV9yZWFkKTogRGl0dG8uCisJKHNpbV90cmFjZSk6IERpdHRvLgorCQorCSogZW5naW5lLmgsIGVuZ2luZS5jIChlbmdpbmVfY3JlYXRlKTogQWRkIG1pc3NpbmcgcHJvdG90eXBlIHRvCisgCWhlYWRlciBmaWxlLiAgQ2xlYW4gdXAgbWlzc2luZyB2YXJpYWJsZXMuCisKKwkqIGNvbmZpZ3VyZS5pbiAodW5pc3RkLmgsIHN0cmluZy5oLCBzdHJpbmdzLmgpOiBDb25maWd1cmUgaW4uCisJKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KKworVGh1IE1hciAyMCAxOTo0MDoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAodm9pZCk6IFByb3ZpZGUgYSBzZWNvbmQgZW11bCBpbnN0cnVjdGlvbiB1c2luZyBhCisgCWJyYW5jaCBwcmVmaXguCisKK1R1ZSBNYXIgMTggMjA6NTE6NDIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbiAoZG9fc2F0Kik6IFBhc3MgYWxsIG5lY2Vzc2FyeSBhcmdzLgorCQorVHVlIE1hciAxOCAxODo0OToxMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAoU0FUKik6IElzc3VlIHdhcm5pbmcgd2hlbiBiaXQgb3ZlcmZsb3cuCisJKEVNVUwpOiBFeGl0IHdpdGggR1BSWzJdIG5vdCAyLgorCitUdWUgTWFyIDE4IDE0OjI0OjA5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBzaW0tc3RhdGUuaDogTmV3IGZpbGUgcmVuYW1lIGVuZ2luZS5oLgorCShzaW1fc3RhdGUpOiBSZW5hbWUgZW5naW5lIHN0cnV0IHRvIHNpbV9zdGF0ZSwgcmVuYW1lIGV2ZW50cyBhbmQKKyAJY29yZSBtZW1iZXJzLgorCQorCSogZW5naW5lLmM6IFVwZGF0ZS4KKwkqIGNwdS5oLCBjcHUuYzogRGl0dG8uCisJKiBhbHUuaDogRGl0dG8uCisJKiBkMzB2LWluc25zOiBEaXR0by4KKwkqIHNpbS1jYWxscy5jOiBEaXR0by4KKworCSogTWFrZWZpbGUuaW4gKHNpbS0qLmMpOiBNb3ZlZCB0byAuLi9jb21tb24uCisKK1R1ZSBNYXIgMTggMTA6Mzk6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnMgKGRvX21hYyk6IEFkZGluZyB3cm9uZyByZWdpc3Rlci4KKwkoZG9fbWFjcyk6IERpdHRvLgorCShkb19tc3ViKTogRGl0dG8uCisJKGRvX21zdWJzKTogRGl0dG8uCisKKwkqIGljLWQzMHY6IFB1dCBiYWNrIGRlZmluaXRpb25zIG9mIFJhSCwgUmFMLCBldC5hbC4KKwkoZG9fc3JhMmgsIGRvX3NyYWgpOiBVc2UuCisJKGRvX3NybDJoLCBkb19zcmxoKTogVXNlLgorCQorCSogZDMwdi1pbnNucyAoU0FULCBTQVQySCwgU0FUcCwgU0FUWik6IEltcGxlbWVudCBzYXR1cmF0ZS4KKworVHVlIE1hciAxOCAwMzowMToyNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNuczogU3BlY2lmeSB3aWxkIGluc3RlZCBvZiByZXNlcnZlZCBiaXRzLgorCSh2b2lkKTogCisKK01vbiBNYXIgMTcgMTU6MTA6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCisKK01vbiBNYXIgMTcgMTQ6MzU6MzcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChTSU1fRVhUUkFfQ0ZMQUdTKSwgY29uZmlndXJlLmluOiBJbmNsdWRlIFNJTV8qCisgCW9wdGlvbnMuIEFsbG93IFJFU0VSVkVEX0JJVFMgdG8gYmUgY29uZmlndXJlZC4KKwkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCisJCisJKiBNYWtlZmlsZS5pbiAoc2ltLSouaCk6IERyb3AsIG5vdCBuZWVkZWQuCisJKHNpbS0qLmMpOiBNYWtlIGVhY2ggZXhwbGljaXQgc28gdGhhdCB0aGV5IGF1dG9tYXRpY2FsbHkgdXBkYXRlLgorCitTYXQgTWFyIDE1IDAyOjM0OjMwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBpYy1kMzB2IChpbW0gbG9uZyk6IEluY29ycmVjdCBjYWxjdWxhdGlvbi4KKworCSogZDMwdi1pbnNucyAoRU1VTCk6IEZpbmlzaCBleGl0LCB3cml0ZS1zdHJpbmcgZW11bC1jYWxsLgorCisJKiBzaW0tY2FsbHMuYyAoc2ltX3RyYWNlKTogSGF2ZSBzaW0tdHJhY2UgZW5hYmxlIGJhc2ljIGluc3RydWN0aW9uCisgCXRyYWNpbmcuCisKK1NhdCBNYXIgMTUgMDI6MTA6MzEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRW5hYmxlIGNvbW1vbiBvcHRpb25zIC0gZW5kaWFuLCBpbmxpbmUgYW5kCisgCXdhcm5pbmdzLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCQorRnJpIE1hciAxNCAxNjoxMTo1MCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGNwdS5vKTogVXBkYXRlIGRlcGVuZGVuY2llcy4KKwkqIGNwdS5jIChpc19jb25kaXRpb25fb2spOiBVcGRhdGUgUFNXIGJpdCBtYW5pcHVsYXRpb25zLgorCitGcmkgTWFyIDE0IDEyOjQ5OjIwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEF1dG9jb25maWcgbTQKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworCSogTWFrZWZpbGUuaW46IFVzZSBtNCB0byBwcmVwcm9jZXNzIGQzMHYtaW5zbnMuCisJKiBkMzB2LWluc246IEFkanVzdC4KKworVGh1IE1hciAxMyAxMjo0NDo1NCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzaW0tY2FsbHMuYyAoc2ltX29wZW4pOiBOZXcgU0lNX0RFU0MgcmVzdWx0LiAgQXJndW1lbnQgaXMgbm93CisJaW4gYXJndiBmb3JtLgorCShvdGhlciBzaW1fKik6IE5ldyBTSU1fREVTQyBhcmd1bWVudC4KKworV2VkIE1hciAxMiAxOTowNTo0NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogc2ltLWNhbGxzLmMgKHNpbV9vcGVuKTogQ3JlYXRlIGFsbCB0aGUgZDMwdiBSQU0gYmxvY2tzLgorCisJKiBlbmdpbmUuYyAoZW5naW5lX3J1bl91bnRpbF9zdG9wKTogSGFuZGxlIGRlbGF5ZWQgc3Vicm91dGluZQorIAljYWxsLgorCSogZDMwdi1pbnNuOiBEaXR0by4KKwkKKwkqIGljLWQzMHY6IEZvciBSYiBhbmQgUmMgYWx3YXlzIHJldHVybiB0aGUgdmFsdWUgYW5kIG5vdCB0aGUKKyAJZXF1YXRpb24uCisJKiBkMzB2LWluc246IFVzZS4KKwkKKwkqIGljLWQzMHYgKHZhbF9SYSk6IFJldHVybnMgMCBvciBSQS4KKwkqIGQzMHYtaW5zbjogVXNlLgorCQorCSogZDMwdi1pbnNuIChtYWtlX2V2ZW5fcmVnLCBnZXRfZXZlbl9yZWcpOiBOZXcgZnVuY3Rpb25zLiBGb3JjZQorIAl0aGUgcmVnaXN0ZXIgaW5kZXggdG8gYmUgZXZlbiwgaXNzdXNpbmcgYSB3YXJuaW5nIGlmIGl0IHdhcyBub3QuCisJKExEKiwgU1QqKTogVXNlLgorCQorV2VkIE1hciAxMiAxNDo1NzoyNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAoZG9fdHJhcCk6IEltcGxlbWVudCBUUkFQIGluc3RydWN0aW9uLgorCisJKiBhbHUuaCAoUFNXX0YsIFBTV19GTEFHX1ZBTCwgUFNXX0ZMQUdfU0VUKTogTmV3IG1hY3JvLCBtYXAgZmxhZworIAlvbnRvIFBTVyBiaXQuCisJKiBpYy1kMzB2OiBEcm9wIEYqIGV4cHJlc3Npb25zLgorCSogZDMwdi1pbnNuOiBVc2UgbW9yZSBleHBsaWNpdCBQU1dfRkxBR18gb3BzLgorCSogY3B1LmggKFBTV18qKTogUmVkbyBQU1cgYml0IHZhbHVlcy4KKwkqIGFsdS5oIChBTFUqX0VORCk6IFVwZGF0ZS4gRml4IHNldHRpbmcgb2Ygb3ZlcmZsb3cgLSBsb2dpYyB3YXMKKyAJYmFja3dhcmRzLgorCQorCSogZDMwdi1pbnNuIChNVkZTWVMsIE1WVFNZUyk6IEltcGxlbWVudC4KKwkqIGNwdS5oIChQU1dILCBQU1dMKTogTmV3IG1hY3JvcyBmb3IgaGlnaCwgbG93IHdvcmQgb2YgUFNXLgorCQorV2VkIE1hciAxMiAxNDoxMjoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogY3B1LmggKFJQVF9JU19DQUxMKTogTmV3IG1hY3JvIGZvciBwcm9jZXNzb3IgZmllbGQKKyAJaXNfZGVsYXllZF9jYWxsLiAgVGhhdCBpbiB0dXJuIHVzZWQgYXMgYSBmbGFnIHRvIGluZGljYXRlIGlmIGEKKyAJZGVsYXllZCBicmFuY2ggb3IgZGVsYXllZCBjYWxsIGlzIHRvIG9jY3VyZS4KKwkqIGQzMHYtaW5zbnMgKGRvX2RicmEpOiBTZXQvY2xlYXIgUlBUX0lTX0NBTEw7CisJKGRvX2RicmFpKTogRGl0dG8uCisJKGRvX2Ric3IpOiBEaXR0by4KKwkoZG9fZGJzcik6IERpdHRvLgorCShkb19kam1wKTogRGl0dG8uCisJKGRvX2RqbXBpKTogRG90dG8uCisJKGRvX2Rqc3IpOiBEaXR0by4KKwkoZG9fZGpzcmkpOiBEaXR0by4KKwkodm9pZCk6IAorCisJKiBkMzB2LWluc24gKGRvX2luY3IpOiBGaW5pc2ggLSBoYW5kbGUgbW9kdWxvIHJlZ2lzdGVycy4KKwkKKwkqIGQzMHYtaW5zbnMgKENNUFUpOiBJbmNsdWRlIGFsbCBwb3NzaWJsZSBjb21wYXJlCisgCW9wZXJhdGlvbnMuIElzc3VlIGEgd2FybmluZyB3aGVyZSBvcCBkZWZpbmVkIGJ5IHRoZSBwcm9jZXNzb3IKKyAJc3BlYy4KKwkKK1dlZCBNYXIgMTIgMTM6NTU6NTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGQzMHYtaW5zbnM6IEFkZCBhIG5ldyBpbnN0cnVjdGlvbiBjbGFzcyBfRU1VTCBhbmQgYSBuZXcKKyAJaW5zdHJ1Y3Rpb24gRU1VTCB0aGF0IGVtdWxhdGVzIGEgZmV3IGJhc2ljIElPIG9wZXJhdGlvbnMuCisKKwkqIE1ha2VmaWxlLmluICh0bXAtaWdlbik6IEZpbHRlciBpbiBlbXVsIGluc3RydWN0aW9ucy4KKworRnJpIE1hciAgNyAyMDozMjoxMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogZDMwdi1pbnNucyAodm9pZCk6IEZpbGwgaW4gdGhlIGdhcHMuCisKK1dlZCBGZWIgMjYgMDk6MzE6MTAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCisJKiBNYWtlZmlsZS5pbiAodG1wLWlnZW4pOiBJbmNsdWRlIGljLWQzMHYgaW4gZGVwZW5kZW5jaWVzLgorCisJKiBpYy1kMzB2IChjYWNoZSk6IFVwZGF0ZSB0byB1c2UgSF93b3JkLCBMX3dvcmQgYWRkZWQgdG8KKyAJc2ltLWVuZGlhbi5oLgorCitUdWUgRmViIDI1IDE1OjI2OjUxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogTWFrZWZpbGUuaW4gKHRtcC1pZ2VuKTogQ29ycmVjdGx5IHJ1biAkKE1BS0UpLgorCitUaHUgRmViIDIwIDIwOjMwOjMxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY3JpdHRlcnMuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEZST01fSUdFTiwgRlJPTV9DT01NT04pOiBNYWtlIHRoZSBpZ2VuIGdlbmVyYXRlZAorIAlmaWxlcyBkZXBlbmRhbnQgb24gdG1wLWlnZW4uIERlZmluZSBFTkdJTkVfSC4KKwkKK1N1biBGZWIgMTYgMTY6NDI6NDggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjcml0dGVycy5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IE5ldyBmaWxlIC0gZm9sbG93IERvdWcgRXZhbnMgaW5zdHJ1Y3Rpb25zLgorCSogTWFrZWZpbGUuaW46IERpdHRvLgorCmRpZmYgLS1naXQgYS9zaW0vZDMwdi9NYWtlZmlsZS5pbiBiL3NpbS9kMzB2L01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NjNiZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZDMwdi9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDIxNyBAQAorIyAgIE1pdHN1YmlzaGkgRWxlY3RyaWMgQ29ycC4gRDMwViBTaW11bGF0b3IuCisjICAgQ29weXJpZ2h0IChDKSAxOTk3LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKyMgCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKK000PSBATTRACisKKworIyMgQ09NTU9OX1BSRV9DT05GSUdfRlJBRworCisjIFRoZXNlIHZhcmlhYmxlcyBhcmUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZXMgaW4gQ09NTU9OX1BSRV9DT05GSUdfRlJBRy4KKyMgV2Ugb3ZlcnJpZGUgdGhlIG9uZXMgd2UgbmVlZCB0byBoZXJlLgorIyBOb3QgYWxsIG9mIHRoZXNlIG5lZWQgdG8gYmUgbWVudGlvbmVkLCBvbmx5IHRoZSBuZWNlc3Nhcnkgb25lcy4KKworIyBMaXN0IG9mIG9iamVjdCBmaWxlcywgbGVzcyBjb21tb24gcGFydHMuCitTSU1fT0JKUyA9IFwKKwkkKFNJTV9ORVdfQ09NTU9OX09CSlMpIFwKKwllbmdpbmUubyBjcHUubyBcCisJc19zdXBwb3J0Lm8gbF9zdXBwb3J0Lm8gXAorCXNfaWRlY29kZS5vIGxfaWRlY29kZS5vICBcCisJc19zZW1hbnRpY3MubyBsX3NlbWFudGljcy5vIFwKKwlzaW0tY2FsbHMubyBpdGFibGUubyBcCisJc2ltLWhsb2FkLm8gXAorCXNpbS1ocncubyBcCisJc2ltLWVuZ2luZS5vIFwKKwlzaW0tc3RvcC5vIFwKKwlzaW0tcmVhc29uLm8gXAorCXNpbS1yZXN1bWUubworCisjIExpc3Qgb2YgZXh0cmEgZGVwZW5kZW5jaWVzLgorIyBHZW5lcmFsbHkgdGhpcyBjb25zaXN0cyBvZiBzaW11bGF0b3Igc3BlY2lmaWMgZmlsZXMgaW5jbHVkZWQgYnkgc2ltLW1haW4uaC4KK1NJTV9FWFRSQV9ERVBTID0gaXRhYmxlLmggc19pZGVjb2RlLmggbF9pZGVjb2RlLmggY3B1LmggYWx1LmgKKworIyBMaXN0IG9mIGdlbmVyYXRvcnMKK1NJTV9HRU49dG1wLWlnZW4KKworIyBMaXN0IG9mIGV4dHJhIGZsYWdzIHRvIGFsd2F5cyBwYXNzIHRvICQoQ0MpLgorU0lNX0VYVFJBX0NGTEFHUyA9IEBzaW1fdHJhcGR1bXBACisKKyMgTGlzdCBvZiBtYWluIG9iamVjdCBmaWxlcyBmb3IgYHJ1bicuCitTSU1fUlVOX09CSlMgPSBucnVuLm8KKworIyBEZXBlbmRlbmN5IG9mIGBjbGVhbicgdG8gY2xlYW4gYW55IGV4dHJhIGZpbGVzLgorU0lNX0VYVFJBX0NMRUFOID0gY2xlYW4taWdlbgorCisjIFRoaXMgc2VsZWN0cyB0aGUgZDMwdiBuZXdsaWIvbGliZ2xvc3Mgc3lzY2FsbCBkZWZpbml0aW9ucy4KK05MX1RBUkdFVD0tRE5MX1RBUkdFVF9kMzB2CisKKyMjIENPTU1PTl9QT1NUX0NPTkZJR19GUkFHCisKK01BSU5fSU5DTFVERV9ERVBTID0gdGNvbmZpZy5oCitJTkNMVURFX0RFUFMgPSAkKE1BSU5fSU5DTFVERV9ERVBTKSAkKFNJTV9FWFRSQV9ERVBTKQorCisjIFJ1bGVzIG5lZWQgdG8gYnVpbGQgJChTSU1fT0JKUyksIHBsdXMgd2hhdGV2ZXIgZWxzZSB0aGUgdGFyZ2V0IHdhbnRzLgorCisjIC4uLiB0YXJnZXQgc3BlY2lmaWMgcnVsZXMgLi4uCisKKyMgRmlsdGVyIHRvIGVsaW1pbmF0ZSBrbm93biB3YXJuaW5ncworRklMVEVSID0gMj4mMSB8IGVncmVwIC12ICJEaXNjYXJkaW5nIGluc3RydWN0aW9ufGluc3RydWN0aW9uIGZpZWxkIG9mIHR5cGUgXGBjb21wdXRlXCcgY2hhbmdlZCB0byBcYGNhY2hlXCd8SW5zdHJ1Y3Rpb24gZm9ybWF0IGlzIG5vdCA2NCBiaXRzIHdpZGUiCisKK0JVSUxUX1NSQ19GUk9NX0lHRU4gPSBcCisJc19pY2FjaGUuaCBcCisJc19pY2FjaGUuYyBcCisJc19pZGVjb2RlLmggXAorCXNfaWRlY29kZS5jIFwKKwlzX3NlbWFudGljcy5oIFwKKwlzX3NlbWFudGljcy5jIFwKKwlzX21vZGVsLmggXAorCXNfbW9kZWwuYyBcCisJc19zdXBwb3J0LmggXAorCXNfc3VwcG9ydC5jIFwKKwlsX2ljYWNoZS5oIFwKKwlsX2ljYWNoZS5jIFwKKwlsX2lkZWNvZGUuaCBcCisJbF9pZGVjb2RlLmMgXAorCWxfc2VtYW50aWNzLmggXAorCWxfc2VtYW50aWNzLmMgXAorCWxfbW9kZWwuaCBcCisJbF9tb2RlbC5jIFwKKwlsX3N1cHBvcnQuaCBcCisJbF9zdXBwb3J0LmMgXAorCWl0YWJsZS5oIGl0YWJsZS5jCiskKEJVSUxUX1NSQ19GUk9NX0lHRU4pOiB0bXAtaWdlbgorIworCisuUEhPTlk6IGNsZWFuLWlnZW4KK2NsZWFuLWlnZW46CisJcm0gLWYgJChCVUlMVF9TUkNfRlJPTV9JR0VOKQorCXJtIC1mIHRtcC1pZ2VuIHRtcC1pbnNucworCisuLi9pZ2VuL2lnZW46CisJY2QgLi4vaWdlbiAmJiAkKE1BS0UpCisKK3RtcC1pZ2VuOiAkKHNyY2RpcikvZGMtc2hvcnQgJChzcmNkaXIpL2QzMHYtaW5zbnMgJChzcmNkaXIpL2ljLWQzMHYgLi4vaWdlbi9pZ2VuCisJY2QgLi4vaWdlbiAmJiAkKE1BS0UpCisJZWNobyAiIyAxIFwiJChzcmNkaXIpL2QzMHYtaW5zbnNcIiIgPiB0bXAtaW5zbnMKKwkkKE00KSA8ICQoc3JjZGlyKS9kMzB2LWluc25zID4+IHRtcC1pbnNucyAKKwlAZWNobyAiR2VuZXJhdGluZyBzaG9ydCB2ZXJzaW9uIC4uLiIKKwkuLi9pZ2VuL2lnZW4gXAorCQktRyBnZW4temVyby1yMCBcCisJCS1HIGRpcmVjdC1hY2Nlc3MgXAorCQktRyBkZWZhdWx0LW5pYS1taW51cy1vbmUgXAorCQktRyBjb25kaXRpb25hbC1pc3N1ZSBcCisJCS1HIHZlcmlmeS1zbG90IFwKKwkJLUcgZmllbGQtd2lkdGhzIFwKKwkJLUYgc2hvcnQsZW11bCBcCisJCS1CIDMyIFwKKwkJLVAgInNfIiBcCisJCS1vICQoc3JjZGlyKS9kYy1zaG9ydCBcCisJCS1rICQoc3JjZGlyKS9pYy1kMzB2IFwKKwkJLW4gJChzcmNkaXIpL2QzMHYtaW5zbnMgLWkgdG1wLWluc25zIFwKKwkJLW4gc19pY2FjaGUuaCAgICAtaGMgdG1wLWljYWNoZS5oIFwKKwkJLW4gc19pY2FjaGUuYyAgICAtYyAgdG1wLWljYWNoZS5jIFwKKwkJLW4gc19zZW1hbnRpY3MuaCAtaHMgdG1wLXNlbWFudGljcy5oIFwKKwkJLW4gc19zZW1hbnRpY3MuYyAtcyAgdG1wLXNlbWFudGljcy5jIFwKKwkJLW4gc19pZGVjb2RlLmggICAtaGQgdG1wLWlkZWNvZGUuaCBcCisJCS1uIHNfaWRlY29kZS5jICAgLWQgIHRtcC1pZGVjb2RlLmMgXAorCQktbiBzX21vZGVsLmggICAgIC1obSB0bXAtbW9kZWwuaCBcCisJCS1uIHNfbW9kZWwuYyAgICAgLW0gIHRtcC1tb2RlbC5jIFwKKwkJLW4gc19zdXBwb3J0LmggICAtaGYgdG1wLXN1cHBvcnQuaCBcCisJCS1uIHNfc3VwcG9ydC5jICAgLWYgIHRtcC1zdXBwb3J0LmMgJChGSUxURVIpCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pY2FjaGUuaCBzX2ljYWNoZS5oCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pY2FjaGUuYyBzX2ljYWNoZS5jCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pZGVjb2RlLmggc19pZGVjb2RlLmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWlkZWNvZGUuYyBzX2lkZWNvZGUuYworCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc2VtYW50aWNzLmggc19zZW1hbnRpY3MuaAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc2VtYW50aWNzLmMgc19zZW1hbnRpY3MuYworCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtbW9kZWwuaCBzX21vZGVsLmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLW1vZGVsLmMgc19tb2RlbC5jCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zdXBwb3J0Lmggc19zdXBwb3J0LmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXN1cHBvcnQuYyBzX3N1cHBvcnQuYworCUBlY2hvICJHZW5lcmF0aW5nIGxvbmcgdmVyc2lvbiAuLi4iCisJLi4vaWdlbi9pZ2VuIFwKKwkJLUcgZ2VuLXplcm8tcjAgXAorCQktRyBkaXJlY3QtYWNjZXNzIFwKKwkJLUcgZGVmYXVsdC1uaWEtbWludXMtb25lIFwKKwkJLUcgY29uZGl0aW9uYWwtaXNzdWUgXAorCQktRyBmaWVsZC13aWR0aHMgXAorCQktRiBsb25nLGVtdWwgXAorCQktQiA2NCBcCisJCS1QICJsXyIgXAorCQktbyAkKHNyY2RpcikvZGMtc2hvcnQgXAorCQktayAkKHNyY2RpcikvaWMtZDMwdiBcCisJCS1pIHRtcC1pbnNucyBcCisJCS1uIGxfaWNhY2hlLmggICAgLWhjIHRtcC1pY2FjaGUuaCBcCisJCS1uIGxfaWNhY2hlLmMgICAgLWMgIHRtcC1pY2FjaGUuYyBcCisJCS1uIGxfc2VtYW50aWNzLmggLWhzIHRtcC1zZW1hbnRpY3MuaCBcCisJCS1uIGxfc2VtYW50aWNzLmMgLXMgIHRtcC1zZW1hbnRpY3MuYyBcCisJCS1uIGxfaWRlY29kZS5oICAgLWhkIHRtcC1pZGVjb2RlLmggXAorCQktbiBsX2lkZWNvZGUuYyAgIC1kICB0bXAtaWRlY29kZS5jIFwKKwkJLW4gbF9tb2RlbC5oICAgICAtaG0gdG1wLW1vZGVsLmggXAorCQktbiBsX21vZGVsLmMgICAgIC1tICB0bXAtbW9kZWwuYyBcCisJCS1uIGxfc3VwcG9ydC5oICAgLWhmIHRtcC1zdXBwb3J0LmggXAorCQktbiBsX3N1cHBvcnQuYyAgIC1mICB0bXAtc3VwcG9ydC5jICQoRklMVEVSKQorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWNhY2hlLmggbF9pY2FjaGUuaAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWNhY2hlLmMgbF9pY2FjaGUuYworCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWRlY29kZS5oIGxfaWRlY29kZS5oCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pZGVjb2RlLmMgbF9pZGVjb2RlLmMKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXNlbWFudGljcy5oIGxfc2VtYW50aWNzLmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXNlbWFudGljcy5jIGxfc2VtYW50aWNzLmMKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLW1vZGVsLmggbF9tb2RlbC5oCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1tb2RlbC5jIGxfbW9kZWwuYworCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc3VwcG9ydC5oIGxfc3VwcG9ydC5oCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zdXBwb3J0LmMgbF9zdXBwb3J0LmMKKwlAZWNobyAiR2VuZXJhdGluZyBpbnN0cnVjdGlvbiBkYXRhYmFzZSAuLi4iCisJLi4vaWdlbi9pZ2VuIFwKKwkJLUcgZmllbGQtd2lkdGhzIFwKKwkJLUYgc2hvcnQsbG9uZyxlbXVsIFwKKwkJLUIgNjQgXAorCQktbyAkKHNyY2RpcikvZGMtc2hvcnQgXAorCQktayAkKHNyY2RpcikvaWMtZDMwdiBcCisJCS1pIHRtcC1pbnNucyBcCisJCS1uIGl0YWJsZS5oICAgIC1odCB0bXAtaXRhYmxlLmggXAorCQktbiBpdGFibGUuYyAgICAtdCAgdG1wLWl0YWJsZS5jICQoRklMVEVSKQorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaXRhYmxlLmggaXRhYmxlLmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWl0YWJsZS5jIGl0YWJsZS5jCisJdG91Y2ggdG1wLWlnZW4KKworRU5HSU5FX0ggPSBcCisJc2ltLW1haW4uaCBcCisJJChzcmNkaXIpLy4uL2NvbW1vbi9zaW0tYmFzaWNzLmggXAorCWNvbmZpZy5oIFwKKwkkKHNyY2RpcikvLi4vY29tbW9uL3NpbS1jb25maWcuaCBcCisJJChzcmNkaXIpLy4uL2NvbW1vbi9zaW0taW5saW5lLmggXAorCSQoc3JjZGlyKS8uLi9jb21tb24vc2ltLXR5cGVzLmggXAorCSQoc3JjZGlyKS8uLi9jb21tb24vc2ltLWJpdHMuaCBcCisJJChzcmNkaXIpLy4uL2NvbW1vbi9zaW0tZW5kaWFuLmggXAorCWl0YWJsZS5oIFwKKwlsX2lkZWNvZGUuaCBzX2lkZWNvZGUuaCBcCisJY3B1LmggXAorCWFsdS5oIFwKKwkkKHNyY2RpcikvLi4vY29tbW9uL3NpbS1hbHUuaCBcCisJJChzcmNkaXIpLy4uL2NvbW1vbi9zaW0tY29yZS5oIFwKKwkkKHNyY2RpcikvLi4vY29tbW9uL3NpbS1ldmVudHMuaCBcCisKK2VuZ2luZS5vOiBlbmdpbmUuYyAkKEVOR0lORV9IKQorc2ltLWNhbGxzLm86IHNpbS1jYWxscy5jICQoRU5HSU5FX0gpICQoc3JjZGlyKS8uLi9jb21tb24vc2ltLXV0aWxzLmggJChzcmNkaXIpLy4uL2NvbW1vbi9zaW0tb3B0aW9ucy5oCitjcHUubzogY3B1LmMgJChFTkdJTkVfSCkKK3Nfc3VwcG9ydC5vOiBzX3N1cHBvcnQuYyAkKEVOR0lORV9IKQorbF9zdXBwb3J0Lm86IGxfc3VwcG9ydC5jICQoRU5HSU5FX0gpCitzX3NlbWFudGljcy5vOiBzX3NlbWFudGljcy5jICQoRU5HSU5FX0gpCitsX3NlbWFudGljcy5vOiBsX3NlbWFudGljcy5jICQoRU5HSU5FX0gpCmRpZmYgLS1naXQgYS9zaW0vZDMwdi9hY2NvbmZpZy5oIGIvc2ltL2QzMHYvYWNjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWI4N2ExCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2QzMHYvYWNjb25maWcuaApAQCAtMCwwICsxLDE1IEBACisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgY2F0Z2V0cyBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfQ0FUR0VUUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCisjdW5kZWYgSEFWRV9HRVRURVhUCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLworI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKZGlmZiAtLWdpdCBhL3NpbS9kMzB2L2FsdS5oIGIvc2ltL2QzMHYvYWx1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5ZWUzZgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9kMzB2L2FsdS5oCkBAIC0wLDAgKzEsMTA2IEBACisvKiBNaXRzdWJpc2hpIEVsZWN0cmljIENvcnAuIEQzMFYgU2ltdWxhdG9yLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2lmbmRlZiBfRDMwVl9BTFVfSF8KKyNkZWZpbmUgX0QzMFZfQUxVX0hfCisKKyNkZWZpbmUgQUxVX0NBUlJZIChQU1dfVkFMKFBTV19DKSAhPSAwKQorCisjaW5jbHVkZSAic2ltLWFsdS5oIgorCisjZGVmaW5lIEFMVTE2X0VORChUQVJHLCBISUdIKQkJCQkJCVwKK3sJCQkJCQkJCQlcCisgIHVuc2lnbmVkMzIgbWFzaywgdmFsdWU7CQkJCQkJXAorICBpZiAoQUxVMTZfSEFEX09WRVJGTE9XKSB7CQkJCQkJXAorICAgIG1hc2sgPSBCSVQzMiAoUFNXX1YpIHwgQklUMzIgKFBTV19WQSkgfCBCSVQzMiAoUFNXX0MpOwkJXAorICAgIHZhbHVlID0gQklUMzIgKFBTV19WKSB8IEJJVDMyIChQU1dfVkEpOwkJCQlcCisgIH0JCQkJCQkJCQlcCisgIGVsc2UgewkJCQkJCQkJXAorICAgIG1hc2sgPSBCSVQzMiAoUFNXX1YpIHwgQklUMzIgKFBTV19DKTsJCQkJXAorICAgIHZhbHVlID0gMDsJCQkJCQkJCVwKKyAgfQkJCQkJCQkJCVwKKyAgaWYgKEFMVTE2X0hBRF9DQVJSWV9CT1JST1cpCQkJCQkJXAorICAgIHZhbHVlIHw9IEJJVDMyIChQU1dfQyk7CQkJCQkJXAorICBpZiAoSElHSCkJCQkJCQkJCVwKKyAgICBXUklURTMyX1FVRVVFX01BU0sgKFRBUkcsIEFMVTE2X09WRVJGTE9XX1JFU1VMVDw8MTYsIDB4ZmZmZjAwMDApOwlcCisgIGVsc2UJCQkJCQkJCQlcCisgICAgV1JJVEUzMl9RVUVVRV9NQVNLIChUQVJHLCBBTFUxNl9PVkVSRkxPV19SRVNVTFQsIDB4MDAwMGZmZmYpOwlcCisgIFdSSVRFMzJfUVVFVUVfTUFTSyAoJlBTVywgdmFsdWUsIG1hc2spOwkJCQlcCit9CisKKyNkZWZpbmUgQUxVMzJfRU5EKFRBUkcpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisgIHVuc2lnbmVkMzIgbWFzaywgdmFsdWU7CQkJCQkJXAorICBpZiAoQUxVMzJfSEFEX09WRVJGTE9XKSB7CQkJCQkJXAorICAgIG1hc2sgPSBCSVQzMiAoUFNXX1YpIHwgQklUMzIgKFBTV19WQSkgfCBCSVQzMiAoUFNXX0MpOwkJXAorICAgIHZhbHVlID0gQklUMzIgKFBTV19WKSB8IEJJVDMyIChQU1dfVkEpOwkJCQlcCisgIH0JCQkJCQkJCQlcCisgIGVsc2UgewkJCQkJCQkJXAorICAgIG1hc2sgPSBCSVQzMiAoUFNXX1YpIHwgQklUMzIgKFBTV19DKTsJCQkJXAorICAgIHZhbHVlID0gMDsJCQkJCQkJCVwKKyAgfQkJCQkJCQkJCVwKKyAgaWYgKEFMVTMyX0hBRF9DQVJSWV9CT1JST1cpCQkJCQkJXAorICAgIHZhbHVlIHw9IEJJVDMyIChQU1dfQyk7CQkJCQkJXAorICBXUklURTMyX1FVRVVFIChUQVJHLCBBTFUzMl9PVkVSRkxPV19SRVNVTFQpOwkJCQlcCisgIFdSSVRFMzJfUVVFVUVfTUFTSyAoJlBTVywgdmFsdWUsIG1hc2spOwkJCQlcCit9CisKKyNkZWZpbmUgQUxVX0VORChUQVJHKSBBTFUzMl9FTkQoVEFSRykKKworCisvKiBQU1cgJiBGbGFnIG1hbmlwdWxhdGlvbiAqLworCisjZGVmaW5lIFBTV19TRVQoQklULFZBTCkgQkxJVDMyKFBTVywgKEJJVCksIChWQUwpKQorI2RlZmluZSBQU1dfVkFMKEJJVCkgRVhUUkFDVEVEMzIoUFNXLCAoQklUKSwgKEJJVCkpCisKKyNkZWZpbmUgUFNXX0YoRkxBRykgKDE3ICsgKChGTEFHKSAlIDgpICogMikKKyNkZWZpbmUgUFNXX0ZMQUdfU0VUKEZMQUcsVkFMKSBQU1dfU0VUKFBTV19GKEZMQUcpLCBWQUwpCisjZGVmaW5lIFBTV19GTEFHX1ZBTChGTEFHKSBQU1dfVkFMKFBTV19GKEZMQUcpKQorCisjZGVmaW5lIFBTV19TRVRfUVVFVUUoQklULFZBTCkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICB1bnNpZ25lZDMyIG1hc2sgPSBCSVQzMiAoQklUKTsJCQkJCVwKKyAgdW5zaWduZWQzMiBiaXR2YWwgPSAoVkFMKSA/IG1hc2sgOiAwOwkJCQkJXAorICBXUklURTMyX1FVRVVFX01BU0sgKCZQU1csIGJpdHZhbCwgbWFzayk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUFNXX0ZMQUdfU0VUX1FVRVVFKEZMQUcsVkFMKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgdW5zaWduZWQzMiBtYXNrID0gQklUMzIgKFBTV19GIChGTEFHKSk7CQkJCVwKKyAgdW5zaWduZWQzMiBiaXR2YWwgPSAoVkFMKSA/IG1hc2sgOiAwOwkJCQkJXAorICBXUklURTMyX1FVRVVFX01BU0sgKCZQU1csIGJpdHZhbCwgbWFzayk7CQkJCVwKK30gd2hpbGUgKDApCisKKy8qIEJyaW5nIGRhdGEgaW4gZnJvbSB0aGUgY29sZCAqLworCisjZGVmaW5lIElNRU0oRUEpIFwKKyhzaW1fY29yZV9yZWFkXzgoU1RBVEVfQ1BVIChzZCwgMCksIGNpYSwgZXhlY19tYXAsIChFQSkpKQorCisjZGVmaW5lIE1FTShTSUdOLCBFQSwgTlJfQllURVMpIFwKKygoU0lHTiMjXyMjTlJfQllURVMpIHNpbV9jb3JlX3JlYWRfdW5hbGlnbmVkXyMjTlJfQllURVMoU1RBVEVfQ1BVIChzZCwgMCksIGNpYSwgcmVhZF9tYXAsIChFQSkpKQorCisjZGVmaW5lIFNUT1JFKEVBLCBOUl9CWVRFUywgVkFMKSBcCitkbyB7IFwKKyAgc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkXyMjTlJfQllURVMoU1RBVEVfQ1BVIChzZCwgMCksIGNpYSwgd3JpdGVfbWFwLCAoRUEpLCAoVkFMKSk7IFwKK30gd2hpbGUgKDApCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vZDMwdi9jb25maWcuaW4gYi9zaW0vZDMwdi9jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyM2I4NgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9kMzB2L2NvbmZpZy5pbgpAQCAtMCwwICsxLDE2MiBAQAorLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCisjdW5kZWYgQ19BTExPQ0EKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCisjdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCisjdW5kZWYgSEFWRV9BTExPQ0EKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCisjdW5kZWYgaW5saW5lCisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgb2ZmX3QKKworLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCisjdW5kZWYgX1BPU0lYX1NPVVJDRQorCisvKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoaW50IG9yIHZvaWQpLiAgKi8KKyN1bmRlZiBSRVRTSUdUWVBFCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIHNpemVfdAorCisvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKKyAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgorIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgorICovCisjdW5kZWYgU1RBQ0tfRElSRUNUSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIERlZmluZSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAorICAgYnl0ZSBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCBhbmQgVkFYKS4gICovCisjdW5kZWYgV09SRFNfQklHRU5ESUFOCisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19zZXRmcHVjdyBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX1NFVEZQVUNXCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0RDR0VUVEVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRDV0QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRQQUdFU0laRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHJ1c2FnZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRSVVNBR0UKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfTVVOTUFQCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1BVVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VUTE9DQUxFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lnYWN0aW9uIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NJR0FDVElPTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0hSCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGltZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9USU1FCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfQVJHWl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZnB1X2NvbnRyb2wuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfRlBVX0NPTlRST0xfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9NQUxMT0NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9OTF9UWVBFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVkFMVUVTX0gKZGlmZiAtLWdpdCBhL3NpbS9kMzB2L2NvbmZpZ3VyZSBiL3NpbS9kMzB2L2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZTc4N2FlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2QzMHYvY29uZmlndXJlCkBAIC0wLDAgKzEsNDI2NCBAQAorIyEgL2Jpbi9zaAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCisjIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCisKKyMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDMKKworCisKKworCisjIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCisKKworIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCisKKworIyBDaGVjayB0byBzZWUgaWYgd2UncmUgcnVubmluZyB1bmRlciBDeWd3aW4zMiwgd2l0aG91dCB1c2luZworIyBBQ19DQU5PTklDQUxfKi4gIElmIHNvLCBzZXQgb3V0cHV0IHZhcmlhYmxlIENZR1dJTjMyIHRvICJ5ZXMiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICJubyIuCisKKworCisjIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIFdpbjMyLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgRVhFRVhUIHRvICIuZXhlIi4KKyMgT3RoZXJ3aXNlIHNldCBpdCB0byAiIi4KKworCisKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCithY19oZWxwPSIkYWNfaGVscAorICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQkJRW5hYmxlIGRldmVsb3BlciBmdW5jdGlvbmFsaXR5LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1ic3dhcAkJCVVzZSBIb3N0IHNwZWNpZmljIEJTV0FQIGluc3RydWN0aW9uLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1jZmxhZ3M9b3B0cwkJRXh0cmEgQ0ZMQUdTIGZvciB1c2UgaW4gYnVpbGRpbmcgc2ltdWxhdG9yIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWRlYnVnPW9wdHMJCUVuYWJsZSBkZWJ1Z2dpbmcgZmxhZ3MiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tc3RkaW8JCQlTcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIHN0ZGlvIGZvciBjb25zb2xlIGlucHV0L291dHB1dC4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tdHJhY2U9b3B0cwkJRW5hYmxlIHRyYWNpbmcgZmxhZ3MiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tcHJvZmlsZT1vcHRzCQlFbmFibGUgcHJvZmlsaW5nIGZsYWdzIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWlubGluZT1pbmxpbmVzCQlTcGVjaWZ5IHdoaWNoIGZ1bmN0aW9ucyBzaG91bGQgYmUgaW5saW5lZC4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZW5kaWFuPWVuZGlhbgkJU3BlY2lmeSB0YXJnZXQgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWFsaWdubWVudD1hbGlnbgkJU3BlY2lmeSBzdHJpY3QsICBub25zdHJpY3Qgb3IgZm9yY2VkIGFsaWdubWVudCBvZiBtZW1vcnkgYWNjZXNzZXMuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW49ZW5kCQlTcGVjaWZ5IGhvc3QgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtYnVpbGQtd2FybmluZ3NbPUxJU1RdCQlFbmFibGUgYnVpbGQtdGltZSBjb21waWxlciB3YXJuaW5ncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1yZXNlcnZlZC1iaXRzCQlTcGVjaWZ5IHdoZXRoZXIgdG8gY2hlY2sgcmVzZXJ2ZWQgYml0cyBpbiBpbnN0cnVjdGlvbi4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tdHJhcGR1bXAJCU1ha2UgdW5rbm93biB0cmFwcyBkdW1wIHRoZSByZWdpc3RlcnMiCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCisgICAgZXhpdCAwIDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Li9jb25maWcubG9nCisKK2VjaG8gIlwKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorIiAxPiY1CisKKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCithY19jb25maWd1cmVfYXJncz0KK2ZvciBhY19hcmcKK2RvCisgIGNhc2UgIiRhY19hcmciIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBlc2FjCitkb25lCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKyMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCisjIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCitpZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID4gY29uZmRlZnMuaAorCisjIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0CisjIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCithY19leGVleHQ9CithY19vYmpleHQ9bworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2OTE6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBDUFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKKyAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KKyAgQ1BQPSIke0NDLWNjfSAtRSIKKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzA2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MTI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDcyMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NzI5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3NDAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjc0NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0vbGliL2NwcAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCisgIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgorZWxzZQorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCitlY2hvICIkYWNfdCIiJENQUCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3NzE6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQorc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKK2FsbDoKKwlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJworRU9GCisjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KK2V2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAoraWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKK2Vsc2UKKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KK2ZpCitybSAtZiBjb25mdGVzdG1ha2UKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIFNFVF9NQUtFPQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc5ODogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQoraWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCisgIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKK3RoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCitFT0YKKworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENDPSIkQ0MgLXBvc2l4IgorICBlbHNlCisgICAgQ0M9IiRDQyAtWHAiCisgIGZpCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBJU0M9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODE5OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4MjQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjgzMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4NDkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODY3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICA6CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDg4OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQoraWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKK2V4aXQgKDApOyB9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4OTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgOgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTIzOiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDkyOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwordHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OworLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK2NoYXIgY29uc3QgKmNvbnN0ICpjY3A7CitjaGFyICoqcDsKKy8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCitzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CitzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKKy8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KKyAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQorICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KK2NvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKK2NjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKy8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCisrK2NjcDsKK3AgPSAoY2hhcioqKSBjY3A7CitjY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKK3sgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgKnQ7CisgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7CisKKyAgKnQrKyA9IDA7Cit9Cit7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLworICBpbnQgeFtdID0gezI1LCAxN307CisgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICsrZm9vOworfQoreyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOworICBpcHRyIHAgPSAwOworICArK3A7Cit9Cit7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKKyAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OworICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Cit9Cit7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLworICBjb25zdCBpbnQgZm9vID0gMTA7Cit9CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5Nzc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgY29uc3QgCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTk4OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX2N2X2NfaW5saW5lPW5vCitmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwMDUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK30gJGFjX2t3IGZvbygpIHsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDEyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhaworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2RvbmUKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgorY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgorICBpbmxpbmUgfCB5ZXMpIDs7CisgIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgaW5saW5lIAorRU9GCisgOzsKKyAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKK0VPRgorIDs7Citlc2FjCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTAzODogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA0MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAib2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBvZmZfdCBsb25nCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA3MTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDc2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCitFT0YKKworZmkKKworIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKKyMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTEwNjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExMTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFsbG9jYS5oPgoraW50IG1haW4oKSB7CitjaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTExODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExMzk6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTE0NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBIQVZFX0FMTE9DQV9ICisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLworY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKK2ludCBtYWluKCkgeworY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTcyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQSAxCitFT0YKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgorICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucworICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKKyAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCisgICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgorICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgQ19BTExPQ0EgMQorRU9GCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIwNDogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyMDkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQord2ViZWNyYXkKKyNlbHNlCit3ZW5vdGJlY3JheQorI2VuZGlmCisKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KK2ZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjM0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjM5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKK0VPRgorCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZG9uZQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTI4OTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyOTcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorZmluZF9zdGFja19kaXJlY3Rpb24gKCkKK3sKKyAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOworICBhdXRvIGNoYXIgZHVtbXk7CisgIGlmIChhZGRyID09IDApCisgICAgeworICAgICAgYWRkciA9ICZkdW1teTsKKyAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOworfQorbWFpbiAoKQoreworICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgorRU9GCisKK2ZpCisKK2ZvciBhY19oZHIgaW4gdW5pc3RkLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzQxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM0NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTM1MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzgwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMzg1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0MzM6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE0NDEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisvKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KKyAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgorCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKwltbWFwIHNoYXJlZCBub3QgZml4ZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisgICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQorICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAorICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5CisgICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCisgICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKKyAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCisgICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAorICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCisKKyAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KKyAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6CisgICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKKyAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKy8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KKyNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQorIyBpZmRlZiBIQVZFX1VOSVNURF9ICisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgZW5kaWYKKworLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KKyMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKKyMgZW5kaWYKKworIyBpZmRlZiBfU0NfUEFHRVNJWkUKKyMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQorIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLworIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKKyMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQorIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgICBpZmRlZiBOQlBHCisjICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCisjICAgICBpZm5kZWYgQ0xTSVpFCisjICAgICAgZGVmaW5lIENMU0laRSAxCisjICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KKyMgICAgZWxzZSAvKiBubyBOQlBHICovCisjICAgICBpZmRlZiBOQlBDCisjICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQworIyAgICAgZWxzZSAvKiBubyBOQlBDICovCisjICAgICAgaWZkZWYgUEFHRVNJWkUKKyMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKKyMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLworIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLworIyAgICBlbmRpZiAvKiBubyBOQlBHICovCisjICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KKyMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCisKKyNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KKyNlbHNlCitjaGFyICptYWxsb2MoKTsKKyNlbmRpZgorCitpbnQKK21haW4oKQoreworCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOworCWludCBpLCBwYWdlc2l6ZTsKKwlpbnQgZmQ7CisKKwlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisKKwkvKgorCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KKwkgKi8KKwlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YSArIGkpID0gcmFuZCgpOworCXVtYXNrKDApOworCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCisJLyoKKwkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKKwkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCisJICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KKwkgKi8KKwlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgxKTsKKwlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOworCWlmICghZGF0YTIpCisJCWV4aXQoMSk7CisJZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOworCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCisJCQlleGl0KDEpOworCisJLyoKKwkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQorCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KKwkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKKwlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhMykKKwkJZXhpdCgxKTsKKwlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKKwkJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCXVubGluaygiY29uZnRlc3RtbWFwIik7CisJZXhpdCgwKTsKK30KKworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1ODE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9NTUFQIDEKK0VPRgorCitmaQorCisKKyMgYXV0b2NvbmYuaW5mbyBzYXlzIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCByaWdodCBhZnRlciBBQ19JTklULgorCisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY1NDogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisKK2hvc3RfYWxpYXM9JGhvc3QKK2Nhc2UgIiRob3N0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpCisgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpIDs7CisgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2hvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAoraG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjc1OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorCit0YXJnZXRfYWxpYXM9JHRhcmdldAorY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCit0YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCit0YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjkzOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9CitlbHNlCisgICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KKyAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAorcyxcXCxcXFxcLGc7IHMsXCQsJCQsZworRU9GX1NFRAorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgorICBybSAtZiBjb25mdGVzdHNlZAorZmkKK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorCisjIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCit0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTczNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTc2NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19wcm9nX3JlamVjdGVkPW5vCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworCWNvbnRpbnVlCisgICAgICBmaQorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KKyAgICAqd2luMzIqIHwgKldJTjMyKikKKyAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4MTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4NDc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE4NTcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorbWFpbigpe3JldHVybigwKTt9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg2MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCisgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKyAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubworICBlbHNlCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKKyAgZmkKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4ODE6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgorY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODg2OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19HTlVDX18KKyAgeWVzOworI2VuZGlmCitFT0YKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODk1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5MTQ6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCitpZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBhY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTk1NzogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCisgICAgY2FzZSAiJGFjX2Rpci8iIGluCisgICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7CisgICAgKikKKyAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAgICMgYnkgZGVmYXVsdC4KKyAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbHNlCisJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKKwkgICAgYnJlYWsgMgorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9JRlMiCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKyAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCisgICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCisgIGZpCitmaQorZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKKworIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgoraWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KKyAgQ0NfRk9SX0JVSUxEPSckKENDKScKK2Vsc2UKKyAgQ0NfRk9SX0JVSUxEPWdjYworZmkKKworCisKKworQVI9JHtBUi1hcn0KKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDIzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgorZmkKK2ZpCitSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCitBTExfTElOR1VBUz0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCit1bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwNTc6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMDYyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDY3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCitfX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjA5NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjEwMiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTI1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KKyAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMTU0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMTU5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxODI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgIGZpCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgorICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TVFBDUFkgMQorRU9GCisKKyAgIGZpCisKKyAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjIxNjogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMjIxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsb2NhbGUuaD4KK2ludCBtYWluKCkgeworcmV0dXJuIExDX01FU1NBR0VTCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIyODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2CisgICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCisgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCitFT0YKKworICAgIGZpCisgIGZpCisgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyNDk6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1CisgICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKKyAgVVNFX05MUz0kZW5hYmxldmFsCitlbHNlCisgIFVTRV9OTFM9eWVzCitmaQorCisgICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2CisgICAgCisKKyAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubworCisgICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgRU5BQkxFX05MUyAxCitFT0YKKworICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjI2OTogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1CisgICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAorZWxzZQorICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCitmaQorCisgICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKKworICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQorCW5sc19jdl9oZWFkZXJfbGliZ3Q9CisJQ0FUT0JKRVhUPU5PTkUKKworCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjg4OiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMjkzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIyOTg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzE1OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzMjAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpYmludGwuaD4KK2ludCBtYWluKCkgeworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMjc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgorCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjM0MzogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1CithY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxpbnRsICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzNTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBiaW5kdGV4dGRvbWFpbigpOworCitpbnQgbWFpbigpIHsKK2JpbmR0ZXh0ZG9tYWluKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzYyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzc4OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzODMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzkwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJICAgZmkKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCisJICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCisJICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfR0VUVEVYVCAxCitFT0YKKworCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQxODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KKwlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKKyAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKwkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCisJCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQ1MjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjQ1NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDgwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTA3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRHTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgID86LyopCQkJIAorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgorICA7OworZXNhYworZmkKK0dNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCitpZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTQyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkWEdFVFRFWFQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKKyAgOzsKK2VzYWMKK2ZpCitYR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCitpZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI1NzQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKKwkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1ODI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0uZ21vCisJCSAgIERBVEFESVJOQU1FPXNoYXJlCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0ubW8KKwkJICAgREFUQURJUk5BTUU9bGliCitmaQorcm0gLWYgY29uZnRlc3QqCisJCUlOU1RPQkpFWFQ9Lm1vCisJICAgICAgZmkKKwkgICAgZmkKKwkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKwkgICAgICAgIAorICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgorCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNjE0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKKyAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjY0ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjY4MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAKKwlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICAgICAgQ0FUT0JKRVhUPS5nbW8KKyAgICAgICAgSU5TVE9CSkVYVD0ubW8KKyAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKKwlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJworCUlOVExMSUJTPSRJTlRMREVQUworCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAorICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCisgICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgorCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgorCSAgOiA7CisJZWxzZQorCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgorCSAgWEdFVFRFWFQ9IjoiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgorICAgICAgUE9TVUI9cG8KKyAgICBlbHNlCisgICAgICBEQVRBRElSTkFNRT1zaGFyZQorICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKKyAgICBmaQorCisgICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJworICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCisgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgorICAgICAgVVNFX05MUz15ZXMKKyAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgIGZpCisKKyAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKKyAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgorICAgIGRvbmUKKworICAgICAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgCisKKyAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KKyAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KKyAgICAgICBMSU5HVUFTPQorICAgICBlbHNlCisgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjc3MzogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1CisgICAgICAgTkVXX0xJTkdVQVM9CisgICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCisgICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCisgICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKKyAgICAgICAgIGVzYWMKKyAgICAgICBkb25lCisgICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKKyAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKKyAgICAgZmkKKworICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgorICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKKyAgICAgZmkKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgorICAgZWxzZQorICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCisvKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCisgICBmaQorICAgCisKKyAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgorCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjgwMTogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjgwNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODExOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgbXNnZm9ybWF0PWxpbnV4CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorbXNnZm9ybWF0PXhvcGVuCitmaQorCisKKwkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKKyAgICAgIGZpCisgICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKKwkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAorICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCisgICAgIEdUX05PPSIjTk8jIgorICAgICBHVF9ZRVM9CisgICBlbHNlCisgICAgIEdUX05PPQorICAgICBHVF9ZRVM9IiNZRVMjIgorICAgZmkKKyAgIAorICAgCisKKyAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKKyAgIAorCisgICAgICBsPQorICAgCisKKyAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgorICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbworICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KKwkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KKwkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgorCSBlbHNlCisJICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKKwkgZmkKKyAgICAgIGVsc2UKKwkgcG9zcmNwcmVmaXg9Ii4uLyIKKyAgICAgIGZpCisgICAgICBybSAtZiBwby9QT1RGSUxFUworICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCisJIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCisgICBmaQorICAKKworIyBDaGVjayBmb3IgY29tbW9uIGhlYWRlcnMuCisjIEZJWE1FOiBTZWVtcyB0byBtZSB0aGlzIGNhbiBjYXVzZSBwcm9ibGVtcyBmb3IgaTM4Ni13aW5kb3dzIGhvc3RzLgorIyBBdCBvbmUgcG9pbnQgdGhlcmUgd2VyZSBoYXJkY29kZWQgQUNfREVGSU5FJ3MgaWYgJHtob3N0fSA9IGkzODYtKi13aW5kb3dzKi4KK2ZvciBhY19oZHIgaW4gc3RkbGliLmggc3RyaW5nLmggc3RyaW5ncy5oIHVuaXN0ZC5oIHRpbWUuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI4ODA6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyODg1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODkwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2hkciBpbiBzeXMvdGltZS5oIHN5cy9yZXNvdXJjZS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjkyMDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI5MjUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI5MzA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfaGRyIGluIGZjbnRsLmggZnB1X2NvbnRyb2wuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5NjA6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTY1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTcwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2Z1bmMgaW4gZ2V0cnVzYWdlIHRpbWUgc2lnYWN0aW9uIF9fc2V0ZnB1Y3cKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5OTk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMwMDQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAyNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisjIENoZWNrIGZvciBzb2NrZXQgbGlicmFyaWVzCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZCBpbiAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzA1NDogY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiID4mNQorYWNfbGliX3Zhcj1gZWNobyBzb2NrZXQnXydiaW5kIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbHNvY2tldCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDYyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgYmluZCgpOworCitpbnQgbWFpbigpIHsKK2JpbmQoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gc29ja2V0IHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2xpYiAxCitFT0YKKworICBMSUJTPSItbHNvY2tldCAkTElCUyIKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMTAxOiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIgPiY1CithY19saWJfdmFyPWBlY2hvIG5zbCdfJ2dldGhvc3RieW5hbWUgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sbnNsICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMxMDkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBnZXRob3N0YnluYW1lKCk7CisKK2ludCBtYWluKCkgeworZ2V0aG9zdGJ5bmFtZSgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzEyMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBuc2wgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKKyAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfbGliIDEKK0VPRgorCisgIExJQlM9Ii1sbnNsICRMSUJTIgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisuICR7c3JjZGlyfS8uLi8uLi9iZmQvY29uZmlndXJlLmhvc3QKKworCisKK1VTRV9NQUlOVEFJTkVSX01PREU9bm8KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCU1BSU5UPSIiIFVTRV9NQUlOVEFJTkVSX01PREU9eWVzIDs7CisgIG5vKQlNQUlOVD0iIyIgOzsKKyAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgTUFJTlQ9IiMiIDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkTUFJTlQiID0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgbWFpbnRhaW5lciBtb2RlIiA2PiYxCitmaQorZWxzZQorICBNQUlOVD0iIyIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWJzd2FwIG9yIC0tZGlzYWJsZS1zaW0tYnN3YXAgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2Jzd2FwK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fYnN3YXAiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0xIC1EVVNFX0JTV0FQPTEiOzsKKyAgbm8pCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTAiOzsKKyAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLWJzd2FwIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2Jzd2FwPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYnN3YXAiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGJzd2FwIGZsYWdzID0gJHNpbV9ic3dhcCIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2Jzd2FwPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1jZmxhZ3Mgb3IgLS1kaXNhYmxlLXNpbS1jZmxhZ3Mgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2NmbGFncytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2NmbGFncyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCSBzaW1fY2ZsYWdzPSItTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIiOzsKKyAgdHJhY2UpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlBsZWFzZSB1c2UgLS1lbmFibGUtc2ltLWRlYnVnIGluc3RlYWQuIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fY2ZsYWdzPSIiOzsKKyAgbm8pCSBzaW1fY2ZsYWdzPSIiOzsKKyAgKikJIHNpbV9jZmxhZ3M9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2NmbGFncyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIGNmbGFncyA9ICRzaW1fY2ZsYWdzIiA2PiYxCitmaQorZWxzZQorICBzaW1fY2ZsYWdzPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1kZWJ1ZyBvciAtLWRpc2FibGUtc2ltLWRlYnVnIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9kZWJ1ZytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2RlYnVnIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykgc2ltX2RlYnVnPSItRERFQlVHPTcgLURXSVRIX0RFQlVHPTciOzsKKyAgbm8pICBzaW1fZGVidWc9Ii1EREVCVUc9MCAtRFdJVEhfREVCVUc9MCI7OworICAqKSAgIHNpbV9kZWJ1Zz0iLURERUJVRz0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9ERUJVRz0nKCR7ZW5hYmxldmFsfSknIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2RlYnVnIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gZGVidWcgPSAkc2ltX2RlYnVnIiA2PiYxCitmaQorZWxzZQorICBzaW1fZGVidWc9IiIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXN0ZGlvIG9yIC0tZGlzYWJsZS1zaW0tc3RkaW8gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3N0ZGlvK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fc3RkaW8iCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET19VU0VfU1RESU8iOzsKKyAgbm8pCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPTlRfVVNFX1NURElPIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLXN0ZGlvIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fc3RkaW89IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zdGRpbyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc3RkaW8gZmxhZ3MgPSAkc2ltX3N0ZGlvIiA2PiYxCitmaQorZWxzZQorICBzaW1fc3RkaW89IiIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXRyYWNlIG9yIC0tZGlzYWJsZS1zaW0tdHJhY2Ugd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3RyYWNlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fdHJhY2UiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MSAtRFdJVEhfVFJBQ0U9LTEiOzsKKyAgbm8pCXNpbV90cmFjZT0iLURUUkFDRT0wIC1EV0lUSF9UUkFDRT0wIjs7CisgIFstMC05XSopCisJc2ltX3RyYWNlPSItRFRSQUNFPScoJHtlbmFibGV2YWx9KScgLURXSVRIX1RSQUNFPScoJHtlbmFibGV2YWx9KSciOzsKKyAgW2Etel0qKQorCXNpbV90cmFjZT0iIgorCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbworCSAgaWYgdGVzdCB4IiRzaW1fdHJhY2UiID0geDsgdGhlbgorCSAgICBzaW1fdHJhY2U9Ii1EV0lUSF9UUkFDRT0nKFRSQUNFXyR4IgorCSAgZWxzZQorCSAgICBzaW1fdHJhY2U9IiR7c2ltX3RyYWNlfXxUUkFDRV8keCIKKwkgIGZpCisJZG9uZQorCXNpbV90cmFjZT0iJHNpbV90cmFjZSknIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV90cmFjZSIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIHRyYWNlID0gJHNpbV90cmFjZSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3RyYWNlPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1wcm9maWxlIG9yIC0tZGlzYWJsZS1zaW0tcHJvZmlsZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fcHJvZmlsZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3Byb2ZpbGUiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTEgLURXSVRIX1BST0ZJTEU9LTEiOzsKKyAgbm8pCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9MCAtRFdJVEhfUFJPRklMRT0wIjs7CisgIFstMC05XSopCisJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9QUk9GSUxFPScoJHtlbmFibGV2YWx9KSciOzsKKyAgW2Etel0qKQorCXNpbV9wcm9maWxlPSIiCisJZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCisJICBpZiB0ZXN0IHgiJHNpbV9wcm9maWxlIiA9IHg7IHRoZW4KKwkgICAgc2ltX3Byb2ZpbGU9Ii1EV0lUSF9QUk9GSUxFPScoUFJPRklMRV8keCIKKwkgIGVsc2UKKwkgICAgc2ltX3Byb2ZpbGU9IiR7c2ltX3Byb2ZpbGV9fFBST0ZJTEVfJHgiCisJICBmaQorCWRvbmUKKwlzaW1fcHJvZmlsZT0iJHNpbV9wcm9maWxlKSciIDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBwcm9maWxlID0gJHNpbV9wcm9maWxlIiA2PiYxCitmaQorZWxzZQorICBzaW1fcHJvZmlsZT0iIgorZmkKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzI5NjogY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpZ25hbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMzMDEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2lmZGVmIHNpZ25hbAorI3VuZGVmIHNpZ25hbAorI2VuZGlmCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgdm9pZCAoKnNpZ25hbCAoaW50LCB2b2lkICgqKShpbnQpKSkoaW50KTsKKyNlbHNlCit2b2lkICgqc2lnbmFsICgpKSAoKTsKKyNlbmRpZgorCitpbnQgbWFpbigpIHsKK2ludCBpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzMTg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpZ25hbD12b2lkCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2lnbmFsPWludAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpZ25hbCIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgUkVUU0lHVFlQRSAkYWNfY3ZfdHlwZV9zaWduYWwKK0VPRgorCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMzM4OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRDWUdXSU4zMiIgPSB5ZXM7IHRoZW4KK2FtX2N2X2V4ZWV4dD0uZXhlCitlbHNlCitjYXQgPiBhbV9jX3Rlc3QuYyA8PCAnRU9GJworaW50IG1haW4oKSB7CisvKiBOb3RoaW5nIG5lZWRlZCBoZXJlICovCit9CitFT0YKKyR7Q0MtY2N9IC1vIGFtX2NfdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBhbV9jX3Rlc3QuYyAkTElCUyAxPiY1CithbV9jdl9leGVleHQ9YGxzIGFtX2NfdGVzdC4qIHwgZ3JlcCAtdiBhbV9jX3Rlc3QuYyB8IHNlZCAtZSBzL2FtX2NfdGVzdC8vYAorcm0gLWYgYW1fY190ZXN0KgorZmkKKwordGVzdCB4IiR7YW1fY3ZfZXhlZXh0fSIgPSB4ICYmIGFtX2N2X2V4ZWV4dD1ubworZmkKK0VYRUVYVD0iIgordGVzdCB4IiR7YW1fY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FtX2N2X2V4ZWV4dH0KK2VjaG8gIiRhY190IiIke2FtX2N2X2V4ZWV4dH0iIDE+JjYKKworCitzaW1fbGlua19maWxlcz0KK3NpbV9saW5rX2xpbmtzPQorCitzaW1fbGlua19saW5rcz10Y29uZmlnLmgKK2lmIHRlc3QgLWYgJHtzcmNkaXJ9L3Rjb25maWcuaW4KK3RoZW4KKyAgc2ltX2xpbmtfZmlsZXM9dGNvbmZpZy5pbgorZWxzZQorICBzaW1fbGlua19maWxlcz0uLi9jb21tb24vdGNvbmZpZy5pbgorZmkKKworIyB0YXJnLXZhbHMuZGVmIHBvaW50cyB0byB0aGUgbGliYyBtYWNybyBkZXNjcmlwdGlvbiBmaWxlLgorY2FzZSAiJHt0YXJnZXR9IiBpbgorKi0qLSopIFRBUkdfVkFMU19ERUY9Li4vY29tbW9uL25sdHZhbHMuZGVmIDs7Citlc2FjCitzaW1fbGlua19maWxlcz0iJHtzaW1fbGlua19maWxlc30gJHtUQVJHX1ZBTFNfREVGfSIKK3NpbV9saW5rX2xpbmtzPSIke3NpbV9saW5rX2xpbmtzfSB0YXJnLXZhbHMuZGVmIgorCisKKworZm9yIGFjX3Byb2cgaW4gZ200IGdudW00IG00CitkbworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzM4NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX000JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE00IiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NND0iJE00IiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfTTQ9IiRNNCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX000PSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICA7OworZXNhYworZmkKK000PSIkYWNfY3ZfcGF0aF9NNCIKK2lmIHRlc3QgLW4gIiRNNCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRNNCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK3Rlc3QgLW4gIiRNNCIgJiYgYnJlYWsKK2RvbmUKK3Rlc3QgLW4gIiRNNCIgfHwgTTQ9Im00IgorCisKKworZGVmYXVsdF9zaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWlubGluZSBvciAtLWRpc2FibGUtc2ltLWlubGluZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1faW5saW5lK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1faW5saW5lIgorICBzaW1faW5saW5lPSIiCitjYXNlICIkZW5hYmxldmFsIiBpbgorICBubykJCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCI7OworICAwKQkJc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIjs7CisgIHllcyB8IDIpCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9QUxMX0NfSU5MSU5FIjs7CisgIDEpCQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPUlOTElORV9MT0NBTFMiOzsKKyAgKikgZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCisgICAgICAgbmV3X2ZsYWc9IiIKKyAgICAgICBjYXNlICIkeCIgaW4KKwkgKl9JTkxJTkU9KikJbmV3X2ZsYWc9Ii1EJHgiOzsKKwkgKj0qKQkJbmV3X2ZsYWc9YGVjaG8gIiR4IiB8IHNlZCAtZSAicy89L19JTkxJTkU9LyIgLWUgInMvXi8tRC8iYDs7CisJICpfSU5MSU5FKQluZXdfZmxhZz0iLUQkeD1BTExfQ19JTkxJTkUiOzsKKwkgKikJCW5ld19mbGFnPSItRCR4IiJfSU5MSU5FPUFMTF9DX0lOTElORSI7OworICAgICAgIGVzYWMKKyAgICAgICBpZiB0ZXN0IHgiJHNpbV9pbmxpbmUiID0geCIiOyB0aGVuCisJIHNpbV9pbmxpbmU9IiRuZXdfZmxhZyIKKyAgICAgICBlbHNlCisJIHNpbV9pbmxpbmU9IiRzaW1faW5saW5lICRuZXdfZmxhZyIKKyAgICAgICBmaQorICAgICBkb25lOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1faW5saW5lIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBpbmxpbmUgZmxhZ3MgPSAkc2ltX2lubGluZSIgNj4mMQorZmkKK2Vsc2UKKyAgCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICBpZiB0ZXN0IHgiJEdDQyIgIT0gIngiIC1hIHgiJHtkZWZhdWx0X3NpbV9pbmxpbmV9IiAhPSAieCIgOyB0aGVuCisgICAgc2ltX2lubGluZT0iJHtkZWZhdWx0X3NpbV9pbmxpbmV9IgorICAgIGlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KKyAgICAgIGVjaG8gIlNldHRpbmcgaW5saW5lIGZsYWdzID0gJHNpbV9pbmxpbmUiIDY+JjEKKyAgICBmaQorICBlbHNlCisgICAgc2ltX2lubGluZT0iIgorICBmaQorZWxzZQorICBzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCitmaQorZmkKKworCit3aXJlX2VuZGlhbj0iQklHX0VORElBTiIKK2RlZmF1bHRfZW5kaWFuPSIiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWVuZGlhbiBvciAtLWRpc2FibGUtc2ltLWVuZGlhbiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fZW5kaWFuK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZW5kaWFuIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIGIqfEIqKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9QklHX0VORElBTiI7OworICBsKnxMKikgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iOzsKKyAgeWVzKQkgaWYgdGVzdCB4IiR3aXJlX2VuZGlhbiIgIT0geDsgdGhlbgorCSAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0ke3dpcmVfZW5kaWFufSIKKwkgZWxzZQorICAgICAgICAgICBpZiB0ZXN0IHgiJGRlZmF1bHRfZW5kaWFuIiAhPSB4OyB0aGVuCisJICAgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9JHtkZWZhdWx0X2VuZGlhbn0iCisJICAgZWxzZQorCSAgICAgZWNobyAiTm8gaGFyZC13aXJlZCBlbmRpYW4gZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2CisJICAgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9MCIKKwkgICBmaQorCSBmaTs7CisgIG5vKQkgaWYgdGVzdCB4IiRkZWZhdWx0X2VuZGlhbiIgIT0geDsgdGhlbgorCSAgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPSR7ZGVmYXVsdF9lbmRpYW59IgorCSBlbHNlCisJICAgaWYgdGVzdCB4IiR3aXJlX2VuZGlhbiIgIT0geDsgdGhlbgorCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9JHt3aXJlX2VuZGlhbn0iCisJICAgZWxzZQorCSAgICAgZWNobyAiTm8gZGVmYXVsdCBlbmRpYW4gZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2CisJICAgICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0wIgorCSAgIGZpCisJIGZpOzsKKyAgKikJIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBmb3IgLS1lbmFibGUtc2ltLWVuZGlhbiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2VuZGlhbj0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2VuZGlhbiIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgZW5kaWFuIGZsYWdzID0gJHNpbV9lbmRpYW4iIDY+JjEKK2ZpCitlbHNlCisgIGlmIHRlc3QgeCIkZGVmYXVsdF9lbmRpYW4iICE9IHg7IHRoZW4KKyAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9JHtkZWZhdWx0X2VuZGlhbn0iCitlbHNlCisgIGlmIHRlc3QgeCIkd2lyZV9lbmRpYW4iICE9IHg7IHRoZW4KKyAgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9JHt3aXJlX2VuZGlhbn0iCisgIGVsc2UKKyAgICBzaW1fZW5kaWFuPQorICBmaQorZmkKK2ZpCisKK3dpcmVfYWxpZ25tZW50PSJTVFJJQ1RfQUxJR05NRU5UIgorZGVmYXVsdF9hbGlnbm1lbnQ9IiIKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQgb3IgLS1kaXNhYmxlLXNpbS1hbGlnbm1lbnQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2FsaWdubWVudCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2FsaWdubWVudCIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICBzdHJpY3QgfCBTVFJJQ1QpICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9U1RSSUNUX0FMSUdOTUVOVCI7OworICBub25zdHJpY3QgfCBOT05TVFJJQ1QpIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9Tk9OU1RSSUNUX0FMSUdOTUVOVCI7OworICBmb3JjZWQgfCBGT1JDRUQpICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9Rk9SQ0VEX0FMSUdOTUVOVCI7OworICB5ZXMpIGlmIHRlc3QgeCIkd2lyZV9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKwkgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0ke3dpcmVfYWxpZ25tZW50fSIKKyAgICAgICBlbHNlCisgICAgICAgICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCisgICAgICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCisgICAgICAgICBlbHNlCisJICAgZWNobyAiTm8gaGFyZC13aXJlZCBhbGlnbm1lbnQgZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2CisJICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0wIgorICAgICAgICAgZmkKKyAgICAgICBmaTs7CisgIG5vKSAgaWYgdGVzdCB4IiRkZWZhdWx0X2FsaWdubWVudCIgIT0geDsgdGhlbgorCSBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCisgICAgICAgZWxzZQorICAgICAgICAgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgorCSAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke3dpcmVfYWxpZ25tZW50fSIKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgZWNobyAiTm8gZGVmYXVsdCBhbGlnbm1lbnQgZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2CisgICAgICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0wIgorICAgICAgICAgZmkKKyAgICAgICBmaTs7CisgICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tYWxpZ25tZW50IiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYWxpZ25tZW50PSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYWxpZ25tZW50IiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBhbGlnbm1lbnQgZmxhZ3MgPSAkc2ltX2FsaWdubWVudCIgNj4mMQorZmkKK2Vsc2UKKyAgaWYgdGVzdCB4IiRkZWZhdWx0X2FsaWdubWVudCIgIT0geDsgdGhlbgorICBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCitlbHNlCisgIGlmIHRlc3QgeCIkd2lyZV9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKyAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgorICBlbHNlCisgICAgc2ltX2FsaWdubWVudD0KKyAgZmkKK2ZpCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbiBvciAtLWRpc2FibGUtc2ltLWhvc3RlbmRpYW4gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2hvc3RlbmRpYW4rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ob3N0ZW5kaWFuIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIG5vKQkgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9MCI7OworICBiKnxCKikgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9QklHX0VORElBTiI7OworICBsKnxMKikgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiI7OworICAqKQkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2hvc3RlbmRpYW49IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ob3N0ZW5kaWFuIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBob3N0ZW5kaWFuIGZsYWdzID0gJHNpbV9ob3N0ZW5kaWFuIiA2PiYxCitmaQorZWxzZQorICAKK2lmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM1Nzg6IGNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4iID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfYmlnZW5kaWFuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bgorIyBTZWUgaWYgc3lzL3BhcmFtLmggZGVmaW5lcyB0aGUgQllURV9PUkRFUiBtYWNyby4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM1ODUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgoraW50IG1haW4oKSB7CisKKyNpZiAhQllURV9PUkRFUiB8fCAhQklHX0VORElBTiB8fCAhTElUVExFX0VORElBTgorIGJvZ3VzIGVuZGlhbiBtYWNyb3MKKyNlbmRpZgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1OTY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICAjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIEJJR19FTkRJQU4gb3Igbm90LgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzYwMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CitpbnQgbWFpbigpIHsKKworI2lmIEJZVEVfT1JERVIgIT0gQklHX0VORElBTgorIG5vdCBiaWcgZW5kaWFuCisjZW5kaWYKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjExOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfYmlnZW5kaWFuPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgoraWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZyIgMT4mMjsgZXhpdCAxOyB9CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM2MzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorbWFpbiAoKSB7CisgIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KKyAgdW5pb24KKyAgeworICAgIGxvbmcgbDsKKyAgICBjaGFyIGNbc2l6ZW9mIChsb25nKV07CisgIH0gdTsKKyAgdS5sID0gMTsKKyAgZXhpdCAodS5jW3NpemVvZiAobG9uZykgLSAxXSA9PSAxKTsKK30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2NfYmlnZW5kaWFuPW5vCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfYmlnZW5kaWFuIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKK0VPRgorCitmaQorCisgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0geWVzOyB0aGVuCisgICAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9QklHX0VORElBTiIKKyAgZWxzZQorICAgIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iCisgIGZpCitlbHNlCisgIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPTAiCitmaQorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtYnVpbGQtd2FybmluZ3Mgb3IgLS1kaXNhYmxlLWJ1aWxkLXdhcm5pbmdzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2J1aWxkX3dhcm5pbmdzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9idWlsZF93YXJuaW5ncyIKKyAgYnVpbGRfd2FybmluZ3M9Ii1XYWxsIC1XcG9pbnRlci1hcml0aCAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMiCitjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJOzsKKyAgbm8pCWJ1aWxkX3dhcm5pbmdzPSItdyI7OworICAsKikgICB0PWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImAKKwlidWlsZF93YXJuaW5ncz0iJHtidWlsZF93YXJuaW5nc30gJHt0fSI7OworICAqLCkgICB0PWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImAKKwlidWlsZF93YXJuaW5ncz0iJHt0fSAke2J1aWxkX3dhcm5pbmdzfSI7OworICAqKQlidWlsZF93YXJuaW5ncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRidWlsZF93YXJuaW5ncyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgd2FybmluZyBmbGFncyA9ICRidWlsZF93YXJuaW5ncyIgNj4mMQorZmkKK2Vsc2UKKyAgYnVpbGRfd2FybmluZ3M9IiIKK2ZpCisKKworZGVmYXVsdF9zaW1fcmVzZXJ2ZWRfYml0cz0iMSIKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cyBvciAtLWRpc2FibGUtc2ltLXJlc2VydmVkLWJpdHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3Jlc2VydmVkX2JpdHMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9yZXNlcnZlZF9iaXRzIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3Jlc2VydmVkX2JpdHM9Ii1EV0lUSF9SRVNFUlZFRF9CSVRTPTEiOzsKKyAgbm8pCXNpbV9yZXNlcnZlZF9iaXRzPSItRFdJVEhfUkVTRVJWRURfQklUUz0wIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1yZXNlcnZlZC1iaXRzIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3Jlc2VydmVkX2JpdHM9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9yZXNlcnZlZF9iaXRzIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyByZXNlcnZlZCBmbGFncyA9ICRzaW1fcmVzZXJ2ZWRfYml0cyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3Jlc2VydmVkX2JpdHM9Ii1EV0lUSF9SRVNFUlZFRF9CSVRTPSR7ZGVmYXVsdF9zaW1fcmVzZXJ2ZWRfYml0c30iCitmaQorCisKKworCisjCisjIEVuYWJsZSBtYWtpbmcgdW5rbm93biB0cmFwcyBkdW1wIG91dCByZWdpc3RlcnMKKyMKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tdHJhcGR1bXAgb3IgLS1kaXNhYmxlLXNpbS10cmFwZHVtcCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fdHJhcGR1bXArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV90cmFwZHVtcCIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpIHNpbV90cmFwZHVtcD0iLURUUkFQRFVNUD0xIjs7CisgIG5vKSAgc2ltX3RyYXBkdW1wPSItRFRSQVBEVU1QPTAiOzsKKyAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS10cmFwZHVtcCIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3RyYXBkdW1wPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhcGR1bXAiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbV90cmFwZHVtcCA9ICRzaW1fdHJhcGR1bXAiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV90cmFwZHVtcD0iIgorZmkKKworCitmb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHVuaXN0ZC5oIHN0cmluZy5oIHN0cmluZ3MuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM3NDE6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNzQ2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzUxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisKKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCithY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAc2ltX2Vudmlyb25tZW50QCUkc2ltX2Vudmlyb25tZW50JWcKK3MlQHNpbV9hbGlnbm1lbnRAJSRzaW1fYWxpZ25tZW50JWcKK3MlQHNpbV9hc3NlcnRAJSRzaW1fYXNzZXJ0JWcKK3MlQHNpbV9iaXRzaXplQCUkc2ltX2JpdHNpemUlZworcyVAc2ltX2VuZGlhbkAlJHNpbV9lbmRpYW4lZworcyVAc2ltX2hvc3RlbmRpYW5AJSRzaW1faG9zdGVuZGlhbiVnCitzJUBzaW1fZmxvYXRAJSRzaW1fZmxvYXQlZworcyVAc2ltX3NjYWNoZUAlJHNpbV9zY2FjaGUlZworcyVAc2ltX2RlZmF1bHRfbW9kZWxAJSRzaW1fZGVmYXVsdF9tb2RlbCVnCitzJUBzaW1faHdfY2ZsYWdzQCUkc2ltX2h3X2NmbGFncyVnCitzJUBzaW1faHdfb2Jqc0AlJHNpbV9od19vYmpzJWcKK3MlQHNpbV9od0AlJHNpbV9odyVnCitzJUBzaW1faW5saW5lQCUkc2ltX2lubGluZSVnCitzJUBzaW1fcGFja2FnZXNAJSRzaW1fcGFja2FnZXMlZworcyVAc2ltX3JlZ3Bhcm1AJSRzaW1fcmVncGFybSVnCitzJUBzaW1fcmVzZXJ2ZWRfYml0c0AlJHNpbV9yZXNlcnZlZF9iaXRzJWcKK3MlQHNpbV9zbXBAJSRzaW1fc21wJWcKK3MlQHNpbV9zdGRjYWxsQCUkc2ltX3N0ZGNhbGwlZworcyVAc2ltX3hvcl9lbmRpYW5AJSRzaW1feG9yX2VuZGlhbiVnCitzJUBidWlsZF93YXJuaW5nc0AlJGJ1aWxkX3dhcm5pbmdzJWcKK3MlQFNIRUxMQCUkU0hFTEwlZworcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBERUZTQCUkREVGUyVnCitzJUBMREZMQUdTQCUkTERGTEFHUyVnCitzJUBMSUJTQCUkTElCUyVnCitzJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKK3MlQHByZWZpeEAlJHByZWZpeCVnCitzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCitzJUBiaW5kaXJAJSRiaW5kaXIlZworcyVAc2JpbmRpckAlJHNiaW5kaXIlZworcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworcyVAZGF0YWRpckAlJGRhdGFkaXIlZworcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZworcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCitzJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCitzJUBsaWJkaXJAJSRsaWJkaXIlZworcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworcyVAaW5mb2RpckAlJGluZm9kaXIlZworcyVAbWFuZGlyQCUkbWFuZGlyJWcKK3MlQGhvc3RAJSRob3N0JWcKK3MlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKK3MlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCitzJUBob3N0X29zQCUkaG9zdF9vcyVnCitzJUB0YXJnZXRAJSR0YXJnZXQlZworcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKK3MlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKK3MlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKK3MlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCitzJUBidWlsZEAlJGJ1aWxkJWcKK3MlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZworcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKK3MlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCitzJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKK3MlQENDQCUkQ0MlZworcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKK3MlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCitzJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZworcyVASERFRklORVNAJSRIREVGSU5FUyVnCitzJUBBUkAlJEFSJWcKK3MlQFJBTkxJQkAlJFJBTkxJQiVnCitzJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKK3MlQENQUEAlJENQUCVnCitzJUBBTExPQ0FAJSRBTExPQ0ElZworcyVAVVNFX05MU0AlJFVTRV9OTFMlZworcyVATVNHRk1UQCUkTVNHRk1UJWcKK3MlQEdNU0dGTVRAJSRHTVNHRk1UJWcKK3MlQFhHRVRURVhUQCUkWEdFVFRFWFQlZworcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCitzJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKK3MlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCitzJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKK3MlQEdNT0ZJTEVTQCUkR01PRklMRVMlZworcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZworcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCitzJUBJTlRMTElCU0AlJElOVExMSUJTJWcKK3MlQElOVExPQkpTQCUkSU5UTE9CSlMlZworcyVAUE9GSUxFU0AlJFBPRklMRVMlZworcyVAUE9TVUJAJSRQT1NVQiVnCitzJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCitzJUBHVF9OT0AlJEdUX05PJWcKK3MlQEdUX1lFU0AlJEdUX1lFUyVnCitzJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCitzJUBsQCUkbCVnCitzJUBNQUlOVEAlJE1BSU5UJWcKK3MlQHNpbV9ic3dhcEAlJHNpbV9ic3dhcCVnCitzJUBzaW1fY2ZsYWdzQCUkc2ltX2NmbGFncyVnCitzJUBzaW1fZGVidWdAJSRzaW1fZGVidWclZworcyVAc2ltX3N0ZGlvQCUkc2ltX3N0ZGlvJWcKK3MlQHNpbV90cmFjZUAlJHNpbV90cmFjZSVnCitzJUBzaW1fcHJvZmlsZUAlJHNpbV9wcm9maWxlJWcKK3MlQEVYRUVYVEAlJEVYRUVYVCVnCitzJUBNNEAlJE00JWcKK3MlQHNpbV90cmFwZHVtcEAlJHNpbV90cmFwZHVtcCVnCisKK0NFT0YKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KK2FjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCithY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19tb3JlX2xpbmVzPToKK2FjX3NlZF9jbWRzPSIiCit3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBmaQorICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCisgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZWxzZQorICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZmkKKyAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKyAgICBhY19iZWc9JGFjX2VuZAorICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgYWNfc2VkX2NtZHM9Y2F0CitmaQorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitDT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKyAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCisgIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCitzJUBJTlNUQUxMQCUkSU5TVEFMTCVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKKyMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyMKKyMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KK2FjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJworYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCithY19kQz0nXDMnCithY19kRD0nJWcnCisjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKK2FjX3VDPScgJworYWNfdUQ9J1w0JWcnCisjIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY19lQj0nJCVcMSNcMmRlZmluZVwzJworYWNfZUM9JyAnCithY19lRD0nJWcnCisKK2lmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmaQorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQorCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0CisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgorCitFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKKyMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKK2NhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKK3MvW1xcJiVdL1xcJi9nCitzJVtcXCRgXSVcXCYlZworcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKK3MlYWNfZCVhY191JWdwCitzJWFjX3UlYWNfZSVncAorRU9GCitzZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCitybSAtZiBjb25mdGVzdC5oZHIKKworIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgorIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCitjYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKK3MlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCitFT0YKKworIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCisjIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgorCitybSAtZiBjb25mdGVzdC50YWlsCit3aGlsZSA6CitkbworICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCisgICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KKyAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQorICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KKyAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCisnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAorICBybSAtZiBjb25mdGVzdC52YWxzCisgIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscworZG9uZQorcm0gLWYgY29uZnRlc3QudmFscworCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAorICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKKyAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCisgICAgcm0gLWYgY29uZnRlc3QuaAorICBlbHNlCisgICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBmaQorICAgIHJtIC1mICRhY19maWxlCisgICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQorICBmaQorZmk7IGRvbmUKKworRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorYWNfc291cmNlcz0iJHNpbV9saW5rX2ZpbGVzIgorYWNfZGVzdHM9IiRzaW1fbGlua19saW5rcyIKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitzcmNkaXI9JGFjX2dpdmVuX3NyY2Rpcgord2hpbGUgdGVzdCAtbiAiJGFjX3NvdXJjZXMiOyBkbworICBzZXQgJGFjX2Rlc3RzOyBhY19kZXN0PSQxOyBzaGlmdDsgYWNfZGVzdHM9JCoKKyAgc2V0ICRhY19zb3VyY2VzOyBhY19zb3VyY2U9JDE7IHNoaWZ0OyBhY19zb3VyY2VzPSQqCisKKyAgZWNobyAibGlua2luZyAkc3JjZGlyLyRhY19zb3VyY2UgdG8gJGFjX2Rlc3QiCisKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3NvdXJjZTsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBGaWxlIG5vdCBmb3VuZCIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCisgIHJtIC1mICRhY19kZXN0CisKKyAgIyBNYWtlIHJlbGF0aXZlIHN5bWxpbmtzLgorICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGVzdF9kaXI9YGVjaG8gJGFjX2Rlc3R8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9ICIkYWNfZGVzdCIgJiYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZGVzdCBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2Rlc3RfZGlyIiAmJiBta2RpciAiJGFjX2Rlc3RfZGlyIgorICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kZXN0X2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGVzdF9kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rlc3RfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkc3JjZGlyIiBpbgorICBbLyRdKikgYWNfcmVsX3NvdXJjZT0iJHNyY2Rpci8kYWNfc291cmNlIiA7OworICAqKSBhY19yZWxfc291cmNlPSIkYWNfZG90cyRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKKyAgZXNhYworCisgICMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGU7IG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsuCisgIGlmIGxuIC1zICRhY19yZWxfc291cmNlICRhY19kZXN0IDI+L2Rldi9udWxsIHx8CisgICAgbG4gJHNyY2Rpci8kYWNfc291cmNlICRhY19kZXN0OyB0aGVuIDoKKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBsaW5rICRhY19kZXN0IHRvICRzcmNkaXIvJGFjX3NvdXJjZSIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitkb25lCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2Nhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgorIHhNYWtlZmlsZSopCisgICBlY2hvICJNZXJnaW5nIE1ha2VmaWxlLnNpbStNYWtlLWNvbW1vbi5zaW0gaW50byBNYWtlZmlsZSAuLi4iCisgICBybSAtZiBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wIE1ha2VmaWxlCisgICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BSRV8vLC9eIyMgRW5kIENPTU1PTl9QUkVfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMS50bXAKKyAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUE9TVF8vLC9eIyMgRW5kIENPTU1PTl9QT1NUXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTIudG1wCisgICBzZWQgLWUgJy9eIyMgQ09NTU9OX1BSRV8vIHIgTWFrZXNpbTEudG1wJyBcCisJLWUgJy9eIyMgQ09NTU9OX1BPU1RfLyByIE1ha2VzaW0yLnRtcCcgXAorCTxNYWtlZmlsZS5zaW0gPk1ha2VmaWxlCisgICBybSAtZiBNYWtlZmlsZS5zaW0gTWFrZS1jb21tb24uc2ltIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAKKyAgIDs7CisgZXNhYworIGNhc2UgIngkQ09ORklHX0hFQURFUlMiIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWMKKworZXhpdCAwCitFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCitybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwordGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisKKwpkaWZmIC0tZ2l0IGEvc2ltL2QzMHYvY29uZmlndXJlLmluIGIvc2ltL2QzMHYvY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MGFhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZDMwdi9jb25maWd1cmUuaW4KQEAgLTAsMCArMSw0MCBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitzaW5jbHVkZSguLi9jb21tb24vYWNsb2NhbC5tNCkKK0FDX1BSRVJFUSgyLjUpZG5sCitBQ19JTklUKE1ha2VmaWxlLmluKQorCitTSU1fQUNfQ09NTU9OCisKK2RubCBGaW5kIGEgdmVyc2lvbm4gb2YgbTQgdG8gdXNlIGFzIGEgcHJlcHJvY2Vzc29yCitBQ19QQVRIX1BST0dTKE00LCBnbTQgZ251bTQgbTQsIG00KQorCitkbmwgT3B0aW9ucyBhdmFpbGFibGUgaW4gdGhpcyBtb2R1bGUKK1NJTV9BQ19PUFRJT05fSU5MSU5FKDApCitTSU1fQUNfT1BUSU9OX0VORElBTihCSUdfRU5ESUFOKQorU0lNX0FDX09QVElPTl9BTElHTk1FTlQoU1RSSUNUX0FMSUdOTUVOVCkKK1NJTV9BQ19PUFRJT05fSE9TVEVORElBTgorU0lNX0FDX09QVElPTl9XQVJOSU5HUworU0lNX0FDX09QVElPTl9SRVNFUlZFRF9CSVRTKDEpCisKK0FDX1NVQlNUKE00KQorCisjCisjIEVuYWJsZSBtYWtpbmcgdW5rbm93biB0cmFwcyBkdW1wIG91dCByZWdpc3RlcnMKKyMKK0FDX0FSR19FTkFCTEUoc2ltLXRyYXBkdW1wLAorWyAgLS1lbmFibGUtc2ltLXRyYXBkdW1wCQlNYWtlIHVua25vd24gdHJhcHMgZHVtcCB0aGUgcmVnaXN0ZXJzXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykgc2ltX3RyYXBkdW1wPSItRFRSQVBEVU1QPTEiOzsKKyAgbm8pICBzaW1fdHJhcGR1bXA9Ii1EVFJBUERVTVA9MCI7OworICAqKSAgIEFDX01TR19FUlJPUigiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tdHJhcGR1bXAiKTsgc2ltX3RyYXBkdW1wPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhcGR1bXAiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbV90cmFwZHVtcCA9ICRzaW1fdHJhcGR1bXAiIDY+JjEKK2ZpXSxbc2ltX3RyYXBkdW1wPSIiXSlkbmwKK0FDX1NVQlNUKHNpbV90cmFwZHVtcCkKKworZG5sIEZvciBVTklYIGVtdWxhdGlvbgorQUNfQ0hFQ0tfSEVBREVSUyhzdGRsaWIuaCB1bmlzdGQuaCBzdHJpbmcuaCBzdHJpbmdzLmgpCisKKworU0lNX0FDX09VVFBVVApkaWZmIC0tZ2l0IGEvc2ltL2QzMHYvY3B1LmMgYi9zaW0vZDMwdi9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTRhOTUxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2QzMHYvY3B1LmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qIE1pdHN1YmlzaGkgRWxlY3RyaWMgQ29ycC4gRDMwViBTaW11bGF0b3IuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisjaWZuZGVmIF9DUFVfQ18KKyNkZWZpbmUgX0NQVV9DXworCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKworDAoraW50Citpc193cm9uZ19zbG90IChTSU1fREVTQyBzZCwKKwkgICAgICAgYWRkcmVzc193b3JkIGNpYSwKKwkgICAgICAgaXRhYmxlX2luZGV4IGluZGV4KQoreworICBzd2l0Y2ggKFNUQVRFX0NQVSAoc2QsIDApLT51bml0KQorICAgIHsKKyAgICBjYXNlIG1lbW9yeV91bml0OgorICAgICAgcmV0dXJuICFpdGFibGVbaW5kZXhdLm9wdGlvbltpdGFibGVfb3B0aW9uX211XTsKKyAgICBjYXNlIGludGVnZXJfdW5pdDoKKyAgICAgIHJldHVybiAhaXRhYmxlW2luZGV4XS5vcHRpb25baXRhYmxlX29wdGlvbl9pdV07CisgICAgY2FzZSBhbnlfdW5pdDoKKyAgICAgIHJldHVybiAwOworICAgIGRlZmF1bHQ6CisgICAgICBzaW1fZW5naW5lX2Fib3J0IChzZCwgU1RBVEVfQ1BVIChzZCwgMCksIGNpYSwKKwkJCSJpbnRlcm5hbCBlcnJvciAtIGlzX3dyb25nX3Nsb3QgLSBiYWQgc3dpdGNoIik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitpbnQKK2lzX2NvbmRpdGlvbl9vayAoU0lNX0RFU0Mgc2QsCisJCSBhZGRyZXNzX3dvcmQgY2lhLAorCQkgaW50IGNvbmQpCit7CisgIHN3aXRjaCAoY29uZCkKKyAgICB7CisgICAgY2FzZSAweDA6CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIDB4MToKKyAgICAgIHJldHVybiBQU1dfVkFMKFBTV19GMCk7CisgICAgY2FzZSAweDI6CisgICAgICByZXR1cm4gIVBTV19WQUwoUFNXX0YwKTsKKyAgICBjYXNlIDB4MzoKKyAgICAgIHJldHVybiBQU1dfVkFMKFBTV19GMSk7CisgICAgY2FzZSAweDQ6CisgICAgICByZXR1cm4gIVBTV19WQUwoUFNXX0YxKTsKKyAgICBjYXNlIDB4NToKKyAgICAgIHJldHVybiBQU1dfVkFMKFBTV19GMCkgJiYgUFNXX1ZBTChQU1dfRjEpOworICAgIGNhc2UgMHg2OgorICAgICAgcmV0dXJuIFBTV19WQUwoUFNXX0YwKSAmJiAhUFNXX1ZBTChQU1dfRjEpOworICAgIGNhc2UgMHg3OgorICAgICAgc2ltX2VuZ2luZV9hYm9ydCAoc2QsIFNUQVRFX0NQVSAoc2QsIDApLCBjaWEsCisJCQkiaXNfY29uZGl0aW9uX29rIC0gYmFkIGluc3RydWN0aW9uIGNvbmRpdGlvbiBiaXRzIik7CisgICAgICByZXR1cm4gMDsKKyAgICBkZWZhdWx0OgorICAgICAgc2ltX2VuZ2luZV9hYm9ydCAoc2QsIFNUQVRFX0NQVSAoc2QsIDApLCBjaWEsCisJCQkiaW50ZXJuYWwgZXJyb3IgLSBpc19jb25kaXRpb25fb2sgLSBiYWQgc3dpdGNoIik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorDAorLyogSWYgLS10cmFjZS1jYWxsLCB0cmFjZSBjYWxscywgcmVtZW1iZXJpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YKKyAgIHJlZ2lzdGVycy4gICovCisKK3R5cGVkZWYgc3RydWN0IF9jYWxsX3N0YWNrIHsKKyAgc3RydWN0IF9jYWxsX3N0YWNrICpwcmV2OworICByZWdpc3RlcnMgcmVnczsKK30gY2FsbF9zdGFjazsKKworc3RhdGljIGNhbGxfc3RhY2sgKmNhbGxfc3RhY2tfaGVhZCA9IChjYWxsX3N0YWNrICopMDsKK3N0YXRpYyBpbnQgY2FsbF9kZXB0aCA9IDA7CisKK3ZvaWQgY2FsbF9vY2N1cnJlZCAoU0lNX0RFU0Mgc2QsCisJCSAgICBzaW1fY3B1ICpjcHUsCisJCSAgICBhZGRyZXNzX3dvcmQgY2lhLAorCQkgICAgYWRkcmVzc193b3JkIG5pYSkKK3sKKyAgY2FsbF9zdGFjayAqcHRyID0gWkFMTE9DIChjYWxsX3N0YWNrKTsKKyAgcHRyLT5yZWdzID0gY3B1LT5yZWdzOworICBwdHItPnByZXYgPSBjYWxsX3N0YWNrX2hlYWQ7CisgIGNhbGxfc3RhY2tfaGVhZCA9IHB0cjsKKworICB0cmFjZV9vbmVfaW5zbiAoc2QsIGNwdSwgbmlhLCAxLCAiIiwgMCwgImNhbGwiLAorCQkgICJEZXB0aCAlM2QsIFJldHVybiAweCUuOGx4LCBBcmdzIDB4JS44bHggMHglLjhseCIsCisJCSAgKytjYWxsX2RlcHRoLCAodW5zaWduZWQgbG9uZyljaWErOCwgKHVuc2lnbmVkIGxvbmcpR1BSWzJdLAorCQkgICh1bnNpZ25lZCBsb25nKUdQUlszXSk7Cit9CisKKy8qIElmIC0tdHJhY2UtY2FsbCwgdHJhY2UgcmV0dXJucywgY2hlY2tpbmcgaWYgYW55IHNhdmVkIHJlZ2lzdGVyIHdhcyBjaGFuZ2VkLiAgKi8KKwordm9pZCByZXR1cm5fb2NjdXJyZWQgKFNJTV9ERVNDIHNkLAorCQkgICAgICBzaW1fY3B1ICpjcHUsCisJCSAgICAgIGFkZHJlc3Nfd29yZCBjaWEsCisJCSAgICAgIGFkZHJlc3Nfd29yZCBuaWEpCit7CisgIGNoYXIgYnVmZmVyWzEwMjRdOworICBjaGFyICpidWZfcHRyID0gYnVmZmVyOworICBjYWxsX3N0YWNrICpwdHIgPSBjYWxsX3N0YWNrX2hlYWQ7CisgIGludCByZWdubzsKKyAgY2hhciAqcHJlZml4ID0gIiwgUmVnaXN0ZXJzIHRoYXQgZGlmZmVyOiAiOworCisgICpidWZfcHRyID0gJ1wwJzsKKyAgZm9yIChyZWdubyA9IDM0OyByZWdubyA8PSA2MzsgcmVnbm8rKykgeworICAgIGlmIChjcHUtPnJlZ3MuZ2VuZXJhbF9wdXJwb3NlW3JlZ25vXSAhPSBwdHItPnJlZ3MuZ2VuZXJhbF9wdXJwb3NlW3JlZ25vXSkgeworICAgICAgc3ByaW50ZiAoYnVmX3B0ciwgIiVzciVkIiwgcHJlZml4LCByZWdubyk7CisgICAgICBidWZfcHRyICs9IHN0cmxlbiAoYnVmX3B0cik7CisgICAgICBwcmVmaXggPSAiICI7CisgICAgfQorICB9CisKKyAgaWYgKGNwdS0+cmVncy5hY2N1bXVsYXRvclsxXSAhPSBwdHItPnJlZ3MuYWNjdW11bGF0b3JbMV0pIHsKKyAgICBzcHJpbnRmIChidWZfcHRyLCAiJXNhMSIsIHByZWZpeCk7CisgICAgYnVmX3B0ciArPSBzdHJsZW4gKGJ1Zl9wdHIpOworICAgIHByZWZpeCA9ICIgIjsKKyAgfQorCisgIHRyYWNlX29uZV9pbnNuIChzZCwgY3B1LCBjaWEsIDEsICIiLCAwLCAicmV0dXJuIiwKKwkJICAiRGVwdGggJTNkLCBSZXR1cm4gMHglLjhseCwgUmV0LiAweCUuOGx4IDB4JS44bHglcyIsCisJCSAgY2FsbF9kZXB0aC0tLCAodW5zaWduZWQgbG9uZyluaWEsICh1bnNpZ25lZCBsb25nKUdQUlsyXSwKKwkJICAodW5zaWduZWQgbG9uZylHUFJbM10sIGJ1ZmZlcik7CisKKyAgY2FsbF9zdGFja19oZWFkID0gcHRyLT5wcmV2OworICB6ZnJlZSAocHRyKTsKK30KKworDAorLyogUmVhZC93cml0ZSBmdW5jdGlvbnMgZm9yIHN5c3RlbSBjYWxsIGludGVyZmFjZS4gICovCitpbnQKK2QzMHZfcmVhZF9tZW0gKGhvc3RfY2FsbGJhY2sgKmNiLAorCSAgICAgICBzdHJ1Y3QgY2Jfc3lzY2FsbCAqc2MsCisJICAgICAgIHVuc2lnbmVkIGxvbmcgdGFkZHIsCisJICAgICAgIGNoYXIgKmJ1ZiwKKwkgICAgICAgaW50IGJ5dGVzKQoreworICBTSU1fREVTQyBzZCA9IChTSU1fREVTQykgc2MtPnAxOworICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCAwKTsKKworICByZXR1cm4gc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLCBjcHUsIHJlYWRfbWFwLCBidWYsIHRhZGRyLCBieXRlcyk7Cit9CisKK2ludAorZDMwdl93cml0ZV9tZW0gKGhvc3RfY2FsbGJhY2sgKmNiLAorCQlzdHJ1Y3QgY2Jfc3lzY2FsbCAqc2MsCisJCXVuc2lnbmVkIGxvbmcgdGFkZHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJaW50IGJ5dGVzKQoreworICBTSU1fREVTQyBzZCA9IChTSU1fREVTQykgc2MtPnAxOworICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCAwKTsKKworICByZXR1cm4gc2ltX2NvcmVfd3JpdGVfYnVmZmVyIChzZCwgY3B1LCB3cml0ZV9tYXAsIGJ1ZiwgdGFkZHIsIGJ5dGVzKTsKK30KKworI2VuZGlmIC8qIF9DUFVfQ18gKi8KZGlmZiAtLWdpdCBhL3NpbS9kMzB2L2NwdS5oIGIvc2ltL2QzMHYvY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5MGU2MQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9kMzB2L2NwdS5oCkBAIC0wLDAgKzEsMjQyIEBACisvKiBNaXRzdWJpc2hpIEVsZWN0cmljIENvcnAuIEQzMFYgU2ltdWxhdG9yLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2lmbmRlZiBfQ1BVX0hfCisjZGVmaW5lIF9DUFVfSF8KKworZW51bSB7CisgIE5SX0dFTkVSQUxfUFVSUE9TRV9SRUdJU1RFUlMgPSA2NCwKKyAgTlJfQ09OVFJPTF9SRUdJU1RFUlMgPSA2NCwKKyAgTlJfQUNDVU1VTEFUT1JTID0gMiwKKyAgU1RBQ0tfUE9JTlRFUl9HUFIgPSA2MywKKyAgTlJfU1RBQ0tfUE9JTlRFUlMgPSAyLAorfTsKKworZW51bSB7CisgIHByb2Nlc3Nvcl9zdGF0dXNfd29yZF9jciA9IDAsCisgIGJhY2t1cF9wcm9jZXNzb3Jfc3RhdHVzX3dvcmRfY3IgPSAxLAorICBwcm9ncmFtX2NvdW50ZXJfY3IgPSAyLAorICBiYWNrdXBfcHJvZ3JhbV9jb3VudGVyX2NyID0gMywKKyAgZGVidWdfYmFja3VwX3Byb2Nlc3Nvcl9zdGF0dXNfd29yZF9jciA9IDQsCisgIGRlYnVnX2JhY2t1cF9wcm9ncmFtX2NvdW50ZXJfY3IgPSA1LAorICByZXNlcnZlZF82X2NyID0gNiwKKyAgcmVwZWF0X2NvdW50X2NyID0gNywKKyAgcmVwZWF0X3N0YXJ0X2FkZHJlc3NfY3IgPSA4LAorICByZXBlYXRfZW5kX2FkZHJlc3NfY3IgPSA5LAorICBtb2R1bG9fc3RhcnRfYWRkcmVzc19jciA9IDEwLAorICBtb2R1bG9fZW5kX2FkZHJlc3NfY3IgPSAxMSwKKyAgaW5zdHJ1Y3Rpb25fYnJlYWtfYWRkcmVzc19jciA9IDE0LAorICBlaXRfdmVjdG9yX2Jhc2VfY3IgPSAxNSwKK307CisKKworZW51bSB7CisgIFBTV19TTSA9IDAsCisgIFBTV19FQSA9IDIsCisgIFBTV19EQiA9IDMsCisgIFBTV19EUyA9IDQsCisgIFBTV19JRSA9IDUsCisgIFBTV19SUCA9IDYsCisgIFBTV19NRCA9IDcsCisgIFBTV19GMCA9IDE3LAorICBQU1dfRjEgPSAxOSwKKyAgUFNXX0YyID0gMjEsCisgIFBTV19GMyA9IDIzLAorICBQU1dfUyA9IDI1LAorICBQU1dfViA9IDI3LAorICBQU1dfVkEgPSAyOSwKKyAgUFNXX0MgPSAzMSwKK307CisKKy8qIGFsaWFzZXMgZm9yIFBTVyBmbGFnIG51bWJlcnMgKEYwLi5GNykgKi8KK2VudW0KK3sKKyAgUFNXX1NfRkxBRyA9IDQsCit9OworCit0eXBlZGVmIHN0cnVjdCBfcmVnaXN0ZXJzIHsKKyAgdW5zaWduZWQzMiBnZW5lcmFsX3B1cnBvc2VbTlJfR0VORVJBTF9QVVJQT1NFX1JFR0lTVEVSU107CisgIC8qIGtlZXAgdHJhY2sgb2YgdGhlIHN0YWNrIHBvaW50ZXIgKi8KKyAgdW5zaWduZWQzMiBzcFtOUl9TVEFDS19QT0lOVEVSU107IC8qIHN3YXAgd2l0aCBTUCAqLworICB1bnNpZ25lZDMyIGN1cnJlbnRfc3A7CisgIHVuc2lnbmVkMzIgY29udHJvbFtOUl9DT05UUk9MX1JFR0lTVEVSU107CisgIHVuc2lnbmVkNjQgYWNjdW11bGF0b3JbTlJfQUNDVU1VTEFUT1JTXTsKK30gcmVnaXN0ZXJzOworCit0eXBlZGVmIGVudW0gX2NwdV91bml0cyB7CisgIG1lbW9yeV91bml0LAorICBpbnRlZ2VyX3VuaXQsCisgIGFueV91bml0LAorfSBjcHVfdW5pdHM7CisKKy8qIEluIG9yZGVyIHRvIHN1cHBvcnQgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zLCB3aGljaCBvbmUgaW5zdHJ1Y3Rpb24gY2FuIGJlCisgICB3cml0aW5nIHRvIGEgcmVnaXN0ZXIgdGhhdCBpcyB1c2VkIGFzIGlucHV0IHRvIGFub3RoZXIsIHF1ZXVlIHVwIHRoZQorICAgd3JpdGVzIHRvIHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9uIGJvdW5kYXJpZXMuICAqLworCisjZGVmaW5lIE1BWF9XUklURTMyCTE2CisjZGVmaW5lIE1BWF9XUklURTY0CTIKKworc3RydWN0IF93cml0ZTMyIHsKKyAgaW50IG51bTsJCQkJLyogIyBvZiAzMi1iaXQgd3JpdGVzIHF1ZXVlZCB1cCAqLworICB1bnNpZ25lZDMyIHZhbHVlW01BWF9XUklURTMyXTsJLyogdmFsdWUgdG8gd3JpdGUgKi8KKyAgdW5zaWduZWQzMiBtYXNrW01BWF9XUklURTMyXTsJCS8qIG1hc2sgdG8gdXNlICovCisgIHVuc2lnbmVkMzIgKnB0cltNQVhfV1JJVEUzMl07CQkvKiBhZGRyZXNzIHRvIHdyaXRlIHRvICovCit9OworCitzdHJ1Y3QgX3dyaXRlNjQgeworICBpbnQgbnVtOwkJCQkvKiAjIG9mIDY0LWJpdCB3cml0ZXMgcXVldWVkIHVwICovCisgIHVuc2lnbmVkNjQgdmFsdWVbTUFYX1dSSVRFNjRdOwkvKiB2YWx1ZSB0byB3cml0ZSAqLworICB1bnNpZ25lZDY0ICpwdHJbTUFYX1dSSVRFNjRdOwkJLyogYWRkcmVzcyB0byB3cml0ZSB0byAqLworfTsKKworc3RydWN0IF9zaW1fY3B1IHsKKyAgY3B1X3VuaXRzIHVuaXQ7CisgIHJlZ2lzdGVycyByZWdzOworICBzaW1fY3B1X2Jhc2UgYmFzZTsKKyAgaW50IHRyYWNlX2NhbGxfcDsJCQkvKiBXaGV0aGVyIHRvIGRvIGNhbGwgdHJhY2luZy4gICovCisgIGludCB0cmFjZV90cmFwX3A7CQkJLyogSWYgdW5rbm93biB0cmFwcyBkdW1wIG91dCB0aGUgcmVncyAqLworICBpbnQgdHJhY2VfYWN0aW9uOwkJCS8qIHRyYWNlIGJpdHMgYXQgZW5kIG9mIGluc3RydWN0aW9ucyAqLworICBpbnQgbGVmdF9raWxsc19yaWdodF9wOyAgICAgICAgICAgICAgIC8qIGxlZnQgaW5zbiBraWxscyBpbnNuIGluIHJpZ2h0IHNsb3Qgb2YgLT4gKi8KKyAgaW50IGRpZF90cmFwOwkJCQkvKiB3ZSBkaWQgYSB0cmFwICYgbmVlZCB0byBmaW5pc2ggaXQgKi8KKyAgc3RydWN0IF93cml0ZTMyIHdyaXRlMzI7CQkvKiBxdWV1ZWQgdXAgMzItYml0IHdyaXRlcyAqLworICBzdHJ1Y3QgX3dyaXRlNjQgd3JpdGU2NDsJCS8qIHF1ZXVlZCB1cCA2NC1iaXQgd3JpdGVzICovCit9OworCisjZGVmaW5lIFBDCShTVEFURV9DUFUgKHNkLCAwKS0+cmVncy5jb250cm9sW3Byb2dyYW1fY291bnRlcl9jcl0pCisjZGVmaW5lIFBTVyAJKFNUQVRFX0NQVSAoc2QsIDApLT5yZWdzLmNvbnRyb2xbcHJvY2Vzc29yX3N0YXR1c193b3JkX2NyXSkKKyNkZWZpbmUgUFNXTCAgICAoKkFMMl80KCZQU1cpKQorI2RlZmluZSBQU1dIICAgICgqQUgyXzQoJlBTVykpCisjZGVmaW5lIERQU1cgCShTVEFURV9DUFUgKHNkLCAwKS0+cmVncy5jb250cm9sW2RlYnVnX2JhY2t1cF9wcm9jZXNzb3Jfc3RhdHVzX3dvcmRfY3JdKQorI2RlZmluZSBEUEMgCShTVEFURV9DUFUgKHNkLCAwKS0+cmVncy5jb250cm9sW2RlYnVnX2JhY2t1cF9wcm9ncmFtX2NvdW50ZXJfY3JdKQorI2RlZmluZSBiUEMgCShTVEFURV9DUFUgKHNkLCAwKS0+cmVncy5jb250cm9sW2JhY2t1cF9wcm9ncmFtX2NvdW50ZXJfY3JdKQorI2RlZmluZSBiUFNXIAkoU1RBVEVfQ1BVIChzZCwgMCktPnJlZ3MuY29udHJvbFtiYWNrdXBfcHJvY2Vzc29yX3N0YXR1c193b3JkX2NyXSkKKyNkZWZpbmUgUlBUX0MgCShTVEFURV9DUFUgKHNkLCAwKS0+cmVncy5jb250cm9sW3JlcGVhdF9jb3VudF9jcl0pCisjZGVmaW5lIFJQVF9TIAkoU1RBVEVfQ1BVIChzZCwgMCktPnJlZ3MuY29udHJvbFtyZXBlYXRfc3RhcnRfYWRkcmVzc19jcl0pCisjZGVmaW5lIFJQVF9FIAkoU1RBVEVfQ1BVIChzZCwgMCktPnJlZ3MuY29udHJvbFtyZXBlYXRfZW5kX2FkZHJlc3NfY3JdKQorI2RlZmluZSBNT0RfUyAJKFNUQVRFX0NQVSAoc2QsIDApLT5yZWdzLmNvbnRyb2xbbW9kdWxvX3N0YXJ0X2FkZHJlc3NfY3JdKQorI2RlZmluZSBNT0RfRSAJKFNUQVRFX0NQVSAoc2QsIDApLT5yZWdzLmNvbnRyb2xbbW9kdWxvX2VuZF9hZGRyZXNzX2NyXSkKKyNkZWZpbmUgSUJBIAkoU1RBVEVfQ1BVIChzZCwgMCktPnJlZ3MuY29udHJvbFtpbnN0cnVjdGlvbl9icmVha19hZGRyZXNzX2NyXSkKKyNkZWZpbmUgRUlUX1ZCCShTVEFURV9DUFUgKHNkLCAwKS0+cmVncy5jb250cm9sW2VpdF92ZWN0b3JfYmFzZV9jcl0pCisjZGVmaW5lIEdQUgkoU1RBVEVfQ1BVIChzZCwgMCktPnJlZ3MuZ2VuZXJhbF9wdXJwb3NlKQorI2RlZmluZSBHUFJfU0VUKE4sVkFMKSAoR1BSWyhOKV0gPSAoVkFMKSkKKyNkZWZpbmUgQUNDCShTVEFURV9DUFUgKHNkLCAwKS0+cmVncy5hY2N1bXVsYXRvcikKKyNkZWZpbmUgQ1JFRwkoU1RBVEVfQ1BVIChzZCwgMCktPnJlZ3MuY29udHJvbCkKKyNkZWZpbmUgU1AgICAgICAoR1BSW1NUQUNLX1BPSU5URVJfR1BSXSkKKyNkZWZpbmUgVFJBQ0VfQ0FMTF9QIChTVEFURV9DUFUgKHNkLCAwKS0+dHJhY2VfY2FsbF9wKQorI2RlZmluZSBUUkFDRV9UUkFQX1AgKFNUQVRFX0NQVSAoc2QsIDApLT50cmFjZV90cmFwX3ApCisjZGVmaW5lIFRSQUNFX0FDVElPTiAoU1RBVEVfQ1BVIChzZCwgMCktPnRyYWNlX2FjdGlvbikKKyNkZWZpbmUgICAgIFRSQUNFX0FDVElPTl9DQUxMCTB4MDAwMDAwMDEJLyogY2FsbCBvY2N1cnJlZCAqLworI2RlZmluZSAgICAgVFJBQ0VfQUNUSU9OX1JFVFVSTgkweDAwMDAwMDAyCS8qIHJldHVybiBvY2N1cnJlZCAqLworCisjZGVmaW5lIFdSSVRFMzIgKFNUQVRFX0NQVSAoc2QsIDApLT53cml0ZTMyKQorI2RlZmluZSBXUklURTMyX05VTQkgKFdSSVRFMzIubnVtKQorI2RlZmluZSBXUklURTMyX1BUUihOKQkgKFdSSVRFMzIucHRyW05dKQorI2RlZmluZSBXUklURTMyX01BU0soTikJIChXUklURTMyLm1hc2tbTl0pCisjZGVmaW5lIFdSSVRFMzJfVkFMVUUoTikgKFdSSVRFMzIudmFsdWVbTl0pCisjZGVmaW5lIFdSSVRFMzJfUVVFVUUoUFRSLCBWQUxVRSkgV1JJVEUzMl9RVUVVRV9NQVNLIChQVFIsIFZBTFVFLCAweGZmZmZmZmZmKQorCisjZGVmaW5lIFdSSVRFMzJfUVVFVUVfTUFTSyhQVFIsIFZBTFVFLCBNQVNLKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICBpbnQgX251bSA9IFdSSVRFMzJfTlVNOwkJCQkJCVwKKyAgaWYgKF9udW0gPj0gTUFYX1dSSVRFMzIpCQkJCQkJXAorICAgIHNpbV9lbmdpbmVfYWJvcnQgKHNkLCBTVEFURV9DUFUgKHNkLCAwKSwgY2lhLAkJCVwKKwkJICAgICAgIlRvbyBtYW55IHF1ZXVlZCAzMi1iaXQgd3JpdGVzIik7CQkJXAorICBXUklURTMyX1BUUihfbnVtKSA9IFBUUjsJCQkJCQlcCisgIFdSSVRFMzJfVkFMVUUoX251bSkgPSBWQUxVRTsJCQkJCQlcCisgIFdSSVRFMzJfTUFTSyhfbnVtKSA9IE1BU0s7CQkJCQkJXAorICBXUklURTMyX05VTSA9IF9udW0rMTsJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBESURfVFJBUAkoU1RBVEVfQ1BVIChzZCwgMCktPmRpZF90cmFwKQorCisjZGVmaW5lIFdSSVRFNjQgKFNUQVRFX0NQVSAoc2QsIDApLT53cml0ZTY0KQorI2RlZmluZSBXUklURTY0X05VTQkgKFdSSVRFNjQubnVtKQorI2RlZmluZSBXUklURTY0X1BUUihOKQkgKFdSSVRFNjQucHRyW05dKQorI2RlZmluZSBXUklURTY0X1ZBTFVFKE4pIChXUklURTY0LnZhbHVlW05dKQorI2RlZmluZSBXUklURTY0X1FVRVVFKFBUUiwgVkFMVUUpCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICBpbnQgX251bSA9IFdSSVRFNjRfTlVNOwkJCQkJCVwKKyAgaWYgKF9udW0gPj0gTUFYX1dSSVRFNjQpCQkJCQkJXAorICAgIHNpbV9lbmdpbmVfYWJvcnQgKHNkLCBTVEFURV9DUFUgKHNkLCAwKSwgY2lhLAkJCVwKKwkJICAgICAgIlRvbyBtYW55IHF1ZXVlZCA2NC1iaXQgd3JpdGVzIik7CQkJXAorICBXUklURTY0X1BUUihfbnVtKSA9IFBUUjsJCQkJCQlcCisgIFdSSVRFNjRfVkFMVUUoX251bSkgPSBWQUxVRTsJCQkJCQlcCisgIFdSSVRFNjRfTlVNID0gX251bSsxOwkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERQU1dfVkFMSUQJMHhiZjAwNTU1NQorI2RlZmluZSBQU1dfVkFMSUQJMHhiNzAwNTU1NQorI2RlZmluZSBFSVRfVkFMSUQJMHhmZmZmZjAwMAkvKiBGcm9tIHBhZ2UgNy00IG9mIEQzMFYvTVBFRyBhcmNoLiBtYW51YWwgICovCisjZGVmaW5lIEVJVF9WQl9ERUZBVUxUCTB4ZmZmZmYwMDAJLyogVmFsdWUgb2YgdGhlIEVJVF9WQiByZWdpc3RlciBhZnRlciByZXNldCAqLworCisvKiBWZXJpZnkgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gaXMgaW4gdGhlIGNvcnJlY3Qgc2xvdCAqLworCisjZGVmaW5lIElTX1dST05HX1NMT1QgaXNfd3Jvbmdfc2xvdChzZCwgY2lhLCBNWV9JTkRFWCkKK2V4dGVybiBpbnQgaXNfd3Jvbmdfc2xvdAorKFNJTV9ERVNDIHNkLAorIGFkZHJlc3Nfd29yZCBjaWEsCisgaXRhYmxlX2luZGV4IGluZGV4KTsKKworI2RlZmluZSBJU19DT05ESVRJT05fT0sgaXNfY29uZGl0aW9uX29rKHNkLCBjaWEsIENDQykKK2V4dGVybiBpbnQgaXNfY29uZGl0aW9uX29rCisoU0lNX0RFU0Mgc2QsCisgYWRkcmVzc193b3JkIGNpYSwKKyBpbnQgY29uZCk7CisKKyNkZWZpbmUgU0lNX0hBVkVfQlJFQUtQT0lOVFMJLyogVHVybiBvbiBpbnRlcm5hbCBicmVha3BvaW50IG1vZHVsZSAqLworCisvKiBJbnRlcm5hbCBicmVha3BvaW50IGluc3RydWN0aW9uIGlzIHN5c2NhbGwgNSAqLworI2RlZmluZSBTSU1fQlJFQUtQT0lOVCB7MHgwZSwgMHgwMCwgMHgwMCwgMHgwNX0KKyNkZWZpbmUgU0lNX0JSRUFLUE9JTlRfU0laRSAoNCkKKworLyogQ2FsbCBvY2N1cnJlZCAqLworZXh0ZXJuIHZvaWQgY2FsbF9vY2N1cnJlZAorKFNJTV9ERVNDIHNkLAorIHNpbV9jcHUgKmNwdSwKKyBhZGRyZXNzX3dvcmQgY2lhLAorIGFkZHJlc3Nfd29yZCBuaWEpOworCisvKiBSZXR1cm4gb2NjdXJyZWQgKi8KK2V4dGVybiB2b2lkIHJldHVybl9vY2N1cnJlZAorKFNJTV9ERVNDIHNkLAorIHNpbV9jcHUgKmNwdSwKKyBhZGRyZXNzX3dvcmQgY2lhLAorIGFkZHJlc3Nfd29yZCBuaWEpOworCisvKiBXaGV0aGVyIHRvIGRvIGNhbGwgdHJhY2luZy4gICovCitleHRlcm4gaW50IGQzMHZfY2FsbF90cmFjZV9wOworCisvKiBSZWFkL3dyaXRlIGZ1bmN0aW9ucyBmb3Igc3lzdGVtIGNhbGwgaW50ZXJmYWNlLiAgKi8KK2V4dGVybiBpbnQgZDMwdl9yZWFkX21lbQorKGhvc3RfY2FsbGJhY2sgKmNiLAorIHN0cnVjdCBjYl9zeXNjYWxsICpzYywKKyB1bnNpZ25lZCBsb25nIHRhZGRyLAorIGNoYXIgKmJ1ZiwKKyBpbnQgYnl0ZXMpOworCitleHRlcm4gaW50IGQzMHZfd3JpdGVfbWVtCisoaG9zdF9jYWxsYmFjayAqY2IsCisgc3RydWN0IGNiX3N5c2NhbGwgKnNjLAorIHVuc2lnbmVkIGxvbmcgdGFkZHIsCisgY29uc3QgY2hhciAqYnVmLAorIGludCBieXRlcyk7CisKKyNlbmRpZiAvKiBfQ1BVX0hfICovCmRpZmYgLS1naXQgYS9zaW0vZDMwdi9kMzB2LWluc25zIGIvc2ltL2QzMHYvZDMwdi1pbnNucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGM0ZjZiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2QzMHYvZDMwdi1pbnNucwpAQCAtMCwwICsxLDI0MjIgQEAKKy8vICAtKi0gQyAtKi0KKy8vICBNaXRzdWJpc2hpIEVsZWN0cmljIENvcnAuIEQzMFYgU2ltdWxhdG9yLgorLy8gIENvcHlyaWdodCAoQykgMTk5NywgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLyAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucyBJbmMuCisvLworLy8gIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKy8vCisvLyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy8vICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorLy8gIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisvLyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisvLworCisKK2RlZmluZSggX0JSQSwgIGAxLiosQ0NDLDAwMCcpCitkZWZpbmUoIF9MT0dJQywgYDEuKixDQ0MsMDAxJykKK2RlZmluZSggX0lNRU0sIGAxLiosQ0NDLDAxMCcpCitkZWZpbmUoIF9JQUxVMSwgYDEuKixDQ0MsMTAwJykKK2RlZmluZShfSUFMVTIsIGAxLiosQ0NDLDEwMScpCisKKworCitkZWZpbmUoX0lNTTYsIGA2LklNTV82UycpCitkZWZpbmUoX0lNTTEyLCBgMTIuSU1NXzEyUycpCitkZWZpbmUoX0lNTTE4LCBgMTguSU1NXzE4UycpCitkZWZpbmUoX0lNTTMyLCBgNi5JTU1fNkwsKiwwMDAsOC5JTU1fOEwsMDAsMTguSU1NXzE4TCcpCisKKworCisvLyBUaGUgZm9sbG93aW5nIGlzIGNhbGxlZCB3aGVuIGV2ZXIgYW4gaWxsZWdhbCBpbnN0cnVjdGlvbiBpcworLy8gZW5jb3VudGVyZWQKKzo6aW50ZXJuYWw6OmlsbGVnYWwKKwlzaW1faW9fZXByaW50ZiAoc2QsICJpbGxlZ2FsIGluc3RydWN0aW9uIGF0IDB4JWx4XG4iLCBjaWEpOworCXNpbV9lbmdpbmVfaGFsdCAoU0QsIENQVSwgTlVMTCwgY2lhLCBzaW1fc2lnbmFsbGVkLCBTSU1fU0lHSUxMKTsKKworLy8gVGhlIGZvbGxvd2luZyBpcyBjYWxsZWQgd2hlbiBldmVyIGFuIGluc3RydWN0aW9uIGluIHRoZSB3cm9uZworLy8gc2xvdCBpcyBlbmNvdW50ZXJlZC4KKzo6aW50ZXJuYWw6Ondyb25nX3Nsb3QKKwlzaW1faW9fZXByaW50ZiAoc2QsICJ3cm9uZyBzbG90IGF0IDB4JWx4XG4iLCBjaWEpOworCXNpbV9lbmdpbmVfaGFsdCAoU0QsIENQVSwgTlVMTCwgY2lhLCBzaW1fc2lnbmFsbGVkLCBTSU1fU0lHSUxMKTsKKworCisKKy8vIFNvbWV0aGluZyBpbGxlZ2FsIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29udGFjdCB0aGUgc2ltdWxhdG9yIGVtdWwKKy8vIGxpYnJhcnkuCitkZWZpbmUoX0VNVUwsIGAxLiosQ0NDLDExMScpCisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19lbXVsOmludCBpbW0KKwkvKiB0ZW1wIGhhY2sgLSBsYXRlciByZXBsYWNlIHdpdGggcmVhbCBpbnRlcmZhY2UgKi8KKwllbnVtIHsKKwkgIHBhcmFtMSA9IDIsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQKKwl9OworCXN3aXRjaCAoaW1tKSB7CisJY2FzZSAwOgorCSAgeworCSAgICBzaW1fZW5naW5lX2Fib3J0IChTRCwgQ1BVLCBjaWEsICJVTklYIGNhbGwgZW11bGF0aW9uIHVuc3VwcG9ydGVkIik7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgMToKKwkgIC8qIFRyYXAgMSAtIHByaW50cyBhIHN0cmluZyAqLworCSAgeworCSAgICBhZGRyZXNzX3dvcmQgc3RyID0gR1BSW3BhcmFtMV07CisJICAgIGNoYXIgY2hyOworCSAgICB3aGlsZSAoMSkgeworCSAgICAgIGNociA9IE1FTSAodW5zaWduZWQsIHN0ciwgMSk7CisJICAgIGlmIChjaHIgPT0gJ1wwJykgYnJlYWs7CisJICAgICAgc2ltX2lvX3dyaXRlX3N0ZG91dCAoc2QsICZjaHIsIHNpemVvZiBjaHIpOworCSAgICAgIHN0cisrOworCSAgICB9CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgMzoKKwkgIC8qIFRyYXAgMyAtIHdyaXRlcyBhIGNoYXJhY3RlciAqLworCSAgeworCSAgICBjaGFyIGNociA9IEdQUltwYXJhbTFdOworCSAgICBzaW1faW9fd3JpdGVfc3Rkb3V0IChzZCwgJmNociwgc2l6ZW9mIGNocik7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgNDoKKwkgIC8qIFRyYXAgNCBleGl0cyB3aXRoIHN0YXR1cyBpbiBbcGFyYW0xXSAqLworCSAgeworCSAgICBzaW1fZW5naW5lX2hhbHQgKFNELCBDUFUsIE5VTEwsIGNpYSwgc2ltX2V4aXRlZCwgR1BSW3BhcmFtMV0pOworCSAgICBicmVhazsKKwkgIH0KKwljYXNlIDU6CisJICAvKiBUcmFwIDUgYnJlYWtwb2ludHMuICBJZiB0aGUgYnJlYWtwb2ludCBzeXN0ZW0ga25vd3MgYWJvdXQgdGhpcywgaXQKKwkgICAgIHdvbid0IHJldHVybi4gIE90aGVyd2lzZSwgd2UgZmFsbCB0aHJvdWdoIHRvIHRyZWF0IHRoaXMgYXMgYW4KKwkgICAgIHVua25vd24gaW5zdHJ1Y3Rpb24uICAqLworCSAgeworCSAgICBzaW1faGFuZGxlX2JyZWFrcG9pbnQgKFNELCBDUFUsIGNpYSk7CisJICAvKiBGYWxsIHRocm91Z2ggdG8gZGVmYXVsdCBjYXNlLiovCisJICB9CisJZGVmYXVsdDoKKwkgIHNpbV9lbmdpbmVfYWJvcnQgKFNELCBDUFUsIGNpYSwgIlVua25vd24gbW9uaXRvciBjYWxsICVkIiwgaW1tKTsKKwl9CisKK19FTVVMLDAwMDAwLDAwLDYuKiw2LiosSU1NXzZTOkVNVUw6c2hvcnQsZW11bDppdSxtdTpFTVVMCisic3lzY2FsbCA8aW1tPiIKKwlkb19lbXVsIChfU0QsIGltbSk7CitfQlJBLDAwMDAwLDAwLDYuKiosNi4qKixfSU1NMzI6QlJBOmxvbmc6aXUsbXU6RU1VTCBsb25nCisic3lzY2FsbCA8aW1tPiIKKwlkb19lbXVsIChfU0QsIGltbSk7CisKKy8vIEFCUworCitfSUFMVTEsMDEwMDAsMDAsNi5SQSw2LlJCLDYuKio6SUFMVTE6c2hvcnQ6aXUsbXU6QUJTCisiYWJzIHI8UkE+LCByPFJCPiIKKwlXUklURTMyX1FVRVVFIChSYSwgYWJzKFJiKSk7CisKKworCisvLyBBREQKKwordm9pZDo6ZnVuY3Rpb246OmRvX2FkZDp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBpbW0KKwlBTFVfQkVHSU4ocmIpOworCUFMVV9BRERDKGltbSk7CisJQUxVX0VORChyYSk7CisKK19JQUxVMSwwMDAwMCwwMCw2LlJBLDYuUkIsNi5SQzpJQUxVMTpzaG9ydDppdSxtdTpBREQKKyJhZGQgcjxSQT4sIHI8UkI+LCByPFJDPiIKKwlkb19hZGQgKF9TRCwgUmEsIFJiLCBSYyk7CitfSUFMVTEsMDAwMDAsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUxOnNob3J0Oml1LG11OkFERCBpbW0KKyJhZGQgcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19hZGQgKF9TRCwgUmEsIFJiLCBpbW0pOworX0lBTFUxLDAwMDAwLDEwLDYuUkEsNi5SQixfSU1NMzI6SUFMVTE6bG9uZzppdSxtdTpBREQgaW1tIGxvbmcKKyJhZGQgcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19hZGQgKF9TRCwgUmEsIFJiLCBpbW0pOworCisKKworLy8gQUREMkgKKwordm9pZDo6ZnVuY3Rpb246OmRvX2FkZDJoOnNpZ25lZDMyICpyYSwgc2lnbmVkMzIgcmIsIHNpZ25lZDMyIGltbQorCXVuc2lnbmVkMTYgYWgyID0gVkgyXzQocmIpICsgVkgyXzQoaW1tKTsKKwl1bnNpZ25lZDE2IGFsMiA9IFZMMl80KHJiKSArIFZMMl80KGltbSk7CisJV1JJVEUzMl9RVUVVRSAocmEsIChhaDIgPDwgMTYpIHwgYWwyKTsKKworX0lBTFUxLDAwMDAxLDAwLDYuUkEsNi5SQiw2LlJDOklBTFUxOnNob3J0Oml1LG11OkFERDJICisiYWRkMmggcjxSQT4sIHI8UkI+LCByPFJDPiIKKwlkb19hZGQyaCAoX1NELCBSYSwgUmIsIFJjKTsKK19JQUxVMSwwMDAwMSwxMCw2LlJBLDYuUkIsX0lNTTY6SUFMVTE6c2hvcnQ6aXUsbXU6QUREMkggaW1tCisiYWRkMmggcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19hZGQyaCAoX1NELCBSYSwgUmIsIGltbUhMKTsKK19JQUxVMSwwMDAwMSwxMCw2LlJBLDYuUkIsX0lNTTMyOklBTFUxOmxvbmc6aXUsbXU6QUREMkggaW1tIGxvbmcKKyJhZGQyaCByPFJBPiwgcjxSQj4sIDxpbW0+IgorCWRvX2FkZDJoIChfU0QsIFJhLCBSYiwgaW1tKTsKKworCisKKy8vIEFEREMKKwordm9pZDo6ZnVuY3Rpb246OmRvX2FkZGM6dW5zaWduZWQzMiAqcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgaW1tCisJQUxVX0JFR0lOKHJiKTsKKwlBTFVfQUREQ19DKGltbSwgQUxVX0NBUlJZKTsKKwlBTFVfRU5EKHJhKTsKKworX0lBTFUxLDAwMTAwLDAwLDYuUkEsNi5SQiw2LlJDOklBTFUxOnNob3J0Oml1LG11OkFEREMKKyJhZGRjIHI8UkE+LCByPFJCPiwgcjxSQz4iCisJZG9fYWRkYyAoX1NELCBSYSwgUmIsIFJjKTsKK19JQUxVMSwwMDEwMCwxMCw2LlJBLDYuUkIsX0lNTTY6SUFMVTE6c2hvcnQ6aXUsbXU6QUREQyBpbW0KKyJhZGRjIHI8UkE+LCByPFJCPiwgPGltbT4iCisJZG9fYWRkYyAoX1NELCBSYSwgUmIsIGltbSk7CitfSUFMVTEsMDAxMDAsMTAsNi5SQSw2LlJCLF9JTU0zMjpJQUxVMTpsb25nOml1LG11OkFEREMgaW1tIGxvbmcKKyJhZGRjIHI8UkE+LCByPFJCPiwgPGltbT4iCisJZG9fYWRkYyAoX1NELCBSYSwgUmIsIGltbSk7CisKKworCisvLyBBRERIcHBwCisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19hZGRoX3BwcDppbnQgcHBwLCB1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKKwlzd2l0Y2ggKHBwcCkgeworCWNhc2UgMHgwOiAvKiBMTEwgKi8KKwkgIHsKKwkgIEFMVTE2X0JFR0lOKFZMMl80KHJiKSk7CisJICBBTFUxNl9BRERDKFZMMl80KHNyYykpOworCSAgQUxVMTZfRU5EKHJhLCAwKTsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgMHgxOiAvKiBMTEggKi8KKwkgIHsKKwkgIEFMVTE2X0JFR0lOKFZMMl80KHJiKSk7CisJICBBTFUxNl9BRERDKFZIMl80KHNyYykpOworCSAgQUxVMTZfRU5EKHJhLCAwKTsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgMHgyOiAvKiBMSEwgKi8KKwkgIHsKKwkgIEFMVTE2X0JFR0lOKFZIMl80KHJiKSk7CisJICBBTFUxNl9BRERDKFZMMl80KHNyYykpOworCSAgQUxVMTZfRU5EKHJhLCAwKTsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgMHgzOiAvKiBMSEggKi8KKwkgIHsKKwkgIEFMVTE2X0JFR0lOKFZIMl80KHJiKSk7CisJICBBTFUxNl9BRERDKFZIMl80KHNyYykpOworCSAgQUxVMTZfRU5EKHJhLCAwKTsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgMHg0OiAvKiBITEwgKi8KKwkgIHsKKwkgIEFMVTE2X0JFR0lOKFZMMl80KHJiKSk7CisJICBBTFUxNl9BRERDKFZMMl80KHNyYykpOworCSAgQUxVMTZfRU5EKHJhLCAxKTsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgMHg1OiAvKiBITEggKi8KKwkgIHsKKwkgIEFMVTE2X0JFR0lOKFZMMl80KHJiKSk7CisJICBBTFUxNl9BRERDKFZIMl80KHNyYykpOworCSAgQUxVMTZfRU5EKHJhLCAxKTsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgMHg2OiAvKiBISEwgKi8KKwkgIHsKKwkgIEFMVTE2X0JFR0lOKFZIMl80KHJiKSk7CisJICBBTFUxNl9BRERDKFZMMl80KHNyYykpOworCSAgQUxVMTZfRU5EKHJhLCAxKTsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgMHg3OiAvKiBISEggKi8KKwkgIHsJCisJICBBTFUxNl9CRUdJTihWSDJfNChyYikpOworCSAgQUxVMTZfQUREQyhWSDJfNChzcmMpKTsKKwkgIEFMVTE2X0VORChyYSwgMSk7CisJICB9CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgc2ltX2VuZ2luZV9hYm9ydCAoU0QsIENQVSwgY2lhLCAiZG9fYWRkaF9wcHAgLSBpbnRlcm5hbCBlcnJvciAtIGJhZCBzd2l0Y2giKTsKKwl9Cis6OiVzOjpwcHA6aW50IHBwcAorCXN3aXRjaCAocHBwKQorCSAgeworCSAgY2FzZSAweDA6IHJldHVybiAibGxsIjsKKwkgIGNhc2UgMHgxOiByZXR1cm4gImxsaCI7CisJICBjYXNlIDB4MjogcmV0dXJuICJsaGwiOworCSAgY2FzZSAweDM6IHJldHVybiAibGhoIjsKKwkgIGNhc2UgMHg0OiByZXR1cm4gImhsbCI7CisJICBjYXNlIDB4NTogcmV0dXJuICJobGgiOworCSAgY2FzZSAweDY6IHJldHVybiAiaGhsIjsKKwkgIGNhc2UgMHg3OiByZXR1cm4gImhoaCI7CisJICBkZWZhdWx0OiByZXR1cm4gIj8iOworCSAgfQorCitfSUFMVTEsMTAscHBwLDAwLDYuUkEsNi5SQiw2LlJDOklBTFUxOnNob3J0Oml1LG11OkFEREhwcHAKKyJhZGRoJXM8cHBwPiByPFJBPiwgcjxSQj4sIHI8UkM+IgorCWRvX2FkZGhfcHBwKF9TRCwgcHBwLCBSYSwgUmIsIFJjKTsKK19JQUxVMSwxMCxwcHAsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUxOnNob3J0Oml1LG11OkFEREhwcHAgaW1tCisiYWRkaCVzPHBwcD4gcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19hZGRoX3BwcChfU0QsIHBwcCwgUmEsIFJiLCBpbW1ITCk7CitfSUFMVTEsMTAscHBwLDEwLDYuUkEsNi5SQixfSU1NMzI6SUFMVTE6bG9uZzppdSxtdTpBRERIcHBwIGltbSBsb25nCisiYWRkaCVzPHBwcD4gcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19hZGRoX3BwcChfU0QsIHBwcCwgUmEsIFJiLCBpbW0pOworCisKKworLy8gQUREUworCit2b2lkOjpmdW5jdGlvbjo6ZG9fYWRkczp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBpbW0KKwlBTFVfQkVHSU4ocmIpOworCUFMVV9BRERDKEVYVFJBQ1RFRDMyKGltbSwgMCwgMCkpOworCUFMVV9FTkQocmEpOworCitfSUFMVTEsMDAxMTAsMDAsNi5SQSw2LlJCLDYuUkM6SUFMVTE6c2hvcnQ6aXUsbXU6QUREUworImFkZHMgcjxSQT4sIHI8UkI+LCByPFJDPiIKKwlkb19hZGRzIChfU0QsIFJhLCBSYiwgUmMpOworX0lBTFUxLDAwMTEwLDEwLDYuUkEsNi5SQixfSU1NNjpJQUxVMTpzaG9ydDppdSxtdTpBRERTIGltbQorImFkZHMgcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19hZGRzIChfU0QsIFJhLCBSYiwgaW1tKTsKK19JQUxVMSwwMDExMCwxMCw2LlJBLDYuUkIsX0lNTTMyOklBTFUxOmxvbmc6aXUsbXU6QUREUyBpbW0gbG9uZworImFkZHMgcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19hZGRzIChfU0QsIFJhLCBSYiwgaW1tKTsKKworCisKKy8vIEFERFMySAorCit2b2lkOjpmdW5jdGlvbjo6ZG9fYWRkczJoOnVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIGltbUhMCisJdW5zaWduZWQxNiBoaWdoID0gVkgyXzQocmIpICsgRVhUUkFDVEVEMzIoaW1tSEwsIDAsIDApOworCXVuc2lnbmVkMTYgbG93ID0gVkwyXzQocmIpICsgRVhUUkFDVEVEMzIoaW1tSEwsIDE2LCAxNik7CisJV1JJVEUzMl9RVUVVRSAocmEsIChoaWdoIDw8IDE2KSB8IGxvdyk7CisKK19JQUxVMSwwMDExMSwwMCw2LlJBLDYuUkIsNi5SQzpJQUxVMTpzaG9ydDppdSxtdTpBRERTMkgKKyJhZGRzMmggcjxSQT4sIHI8UkI+LCByPFJDPiIKKwlkb19hZGRzMmggKF9TRCwgUmEsIFJiLCBSYyk7CitfSUFMVTEsMDAxMTEsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUxOnNob3J0Oml1LG11OkFERFMySCBpbW0KKyJhZGRzMmggcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19hZGRzMmggKF9TRCwgUmEsIFJiLCBpbW1ITCk7CitfSUFMVTEsMDAxMTEsMTAsNi5SQSw2LlJCLF9JTU0zMjpJQUxVMTpsb25nOml1LG11OkFERFMySCBpbW0gbG9uZworImFkZHMyaCByPFJBPiwgcjxSQj4sIDxpbW0+IgorCWRvX2FkZHMyaCAoX1NELCBSYSwgUmIsIGltbSk7CisKKworCisvLyBBTkQKKworX0xPR0lDLDExMDAwLDAwLDYuUkEsNi5SQiw2LlJDOkxPR0lDOnNob3J0Oml1LG11OkFORAorImFuZCByPFJBPiwgcjxSQj4sIHI8UkM+IgorCVdSSVRFMzJfUVVFVUUgKFJhLCBSYiAmIFJjKTsKK19MT0dJQywxMTAwMCwxMCw2LlJBLDYuUkIsX0lNTTY6TE9HSUM6c2hvcnQ6aXUsbXU6QU5EIGltbQorImFuZCByPFJBPiwgcjxSQj4sIDxpbW0+IgorCVdSSVRFMzJfUVVFVUUgKFJhLCBSYiAmIGltbSk7CitfTE9HSUMsMTEwMDAsMTAsNi5SQSw2LlJCLF9JTU0zMjpMT0dJQzpsb25nOml1LG11OkFORCBpbW0gbG9uZworImFuZCByPFJBPiwgcjxSQj4sIDxpbW0+IgorCVdSSVRFMzJfUVVFVUUgKFJhLCBSYiAmIGltbSk7CisKKworLy8gQU5ERkcKKworX0xPR0lDLDAxMDAwLDAwLCoqKiwzLkZBLCoqKiwzLkZCLCoqKiwzLkZDOkxPR0lDOnNob3J0Oml1LG11OkxvZ2ljYWwgQU5EIEZsYWdzCisiYW5kZmcgZjxGQT4sIGY8RkI+LCBmPEZDPiIKKwlQU1dfRkxBR19TRVRfUVVFVUUoRkEsIFBTV19GTEFHX1ZBTChGQikgJiBQU1dfRkxBR19WQUwoRkMpKTsKK19MT0dJQywwMTAwMCwxMCwqKiosMy5GQSwqKiosMy5GQixfSU1NNjpMT0dJQzpzaG9ydDppdSxtdTpMb2dpY2FsIEFORCBGbGFncyBpbW0KKyJhbmRmZyBmPEZBPiwgZjxGQj4sIDxpbW1fNj4iCisJUFNXX0ZMQUdfU0VUX1FVRVVFKEZBLCBQU1dfRkxBR19WQUwoRkIpICYgKGltbV82ICYgMSkpOworCisKKworLy8gQVZHCisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19hdmc6dW5zaWduZWQzMiAqcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgaW1tCisJV1JJVEUzMl9RVUVVRSAocmEsICgoc2lnbmVkNjQpKHNpZ25lZDMyKXJiICsgKHNpZ25lZDY0KShzaWduZWQzMilpbW0gKyAxKSA+PiAxKTsKKworX0lBTFUxLDAxMDEwLDAwLDYuUkEsNi5SQiw2LlJDOklBTFUxOnNob3J0Oml1LG11OkFWRworImF2ZyByPFJBPiwgcjxSQj4sIHI8UkM+IgorCWRvX2F2ZyAoX1NELCBSYSwgUmIsIFJjKTsKK19JQUxVMSwwMTAxMCwxMCw2LlJBLDYuUkIsX0lNTTY6SUFMVTE6c2hvcnQ6aXUsbXU6QVZHIGltbQorImF2ZyByPFJBPiwgcjxSQj4sIDxpbW0+IgorCWRvX2F2ZyAoX1NELCBSYSwgUmIsIGltbSk7CitfSUFMVTEsMDEwMTAsMTAsNi5SQSw2LlJCLF9JTU0zMjpJQUxVMTpsb25nOml1LG11OkFWRyBpbW0gbG9uZworImF2ZyByPFJBPiwgcjxSQj4sIDxpbW0+IgorCWRvX2F2ZyAoX1NELCBSYSwgUmIsIGltbSk7CisKKworCisvLyBBVkcySAorCit2b2lkOjpmdW5jdGlvbjo6ZG9fYXZnMmg6dW5zaWduZWQzMiAqcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgaW1tCisJdW5zaWduZWQxNiBoaWdoID0gKChzaWduZWQzMikoc2lnbmVkMTYpVkgyXzQocmIpICsgKHNpZ25lZDMyKShzaWduZWQxNilWSDJfNChpbW0pICsgMSkgPj4gMTsKKwl1bnNpZ25lZDE2IGxvdyAgPSAoKHNpZ25lZDMyKShzaWduZWQxNilWTDJfNChyYikgKyAoc2lnbmVkMzIpKHNpZ25lZDE2KVZMMl80KGltbSkgKyAxKSA+PiAxOworCVdSSVRFMzJfUVVFVUUgKHJhLCAoaGlnaCA8PCAxNikgfCBsb3cpOworCitfSUFMVTEsMDEwMTEsMDAsNi5SQSw2LlJCLDYuUkM6SUFMVTE6c2hvcnQ6aXUsbXU6QVZHMkgKKyJhdmcyaCByPFJBPiwgcjxSQj4sIHI8UkM+IgorCWRvX2F2ZzJoIChfU0QsIFJhLCBSYiwgUmMpOworX0lBTFUxLDAxMDExLDEwLDYuUkEsNi5SQixfSU1NNjpJQUxVMTpzaG9ydDppdSxtdTpBVkcySCBpbW0KKyJhdmcyaCByPFJBPiwgcjxSQj4sIDxpbW0+IgorCWRvX2F2ZzJoIChfU0QsIFJhLCBSYiwgaW1tSEwpOworX0lBTFUxLDAxMDExLDEwLDYuUkEsNi5SQixfSU1NMzI6SUFMVTE6bG9uZzppdSxtdTpBVkcySCBpbW0gbG9uZworImF2ZzJoIHI8UkE+LCByPFJCPiwgPGltbT4iCisJZG9fYXZnMmggKF9TRCwgUmEsIFJiLCBpbW0pOworCisKKworLy8gQkNMUgorCitfTE9HSUMsMDAwMTEsMDAsNi5SQSw2LlJCLDYuUkM6TE9HSUM6c2hvcnQ6aXUsbXU6QkNMUgorImJjbHIgcjxSQT4sIHI8UkI+LCByPFJDPiIKKwlXUklURTMyX1FVRVVFKFJhLCBSYiAmIH5CSVQzMigoUmMpICUgMzIpKTsKK19MT0dJQywwMDAxMSwxMCw2LlJBLDYuUkIsX0lNTTY6TE9HSUM6c2hvcnQ6aXUsbXU6QkNMUiBpbW0KKyJiY2xyIHI8UkE+LCByPFJCPiwgPGltbT4iCisJV1JJVEUzMl9RVUVVRShSYSwgUmIgJiB+QklUMzIoKGltbSkgJSAzMikpOworCisKKworLy8gQk5PVAorCitfTE9HSUMsMDAwMDEsMDAsNi5SQSw2LlJCLDYuUkM6TE9HSUM6c2hvcnQ6aXUsbXU6Qk5PVAorImJub3QgcjxSQT4sIHI8UkI+LCByPFJDPiIKKwlXUklURTMyX1FVRVVFIChSYSwgUmIgXiBCSVQzMigoUmMpICUgMzIpKTsKK19MT0dJQywwMDAwMSwxMCw2LlJBLDYuUkIsX0lNTTY6TE9HSUM6c2hvcnQ6aXUsbXU6Qk5PVCBpbW0KKyJibm90IHI8UkE+LCByPFJCPiwgPGltbT4iCisJV1JJVEUzMl9RVUVVRSAoUmEsIFJiIF4gQklUMzIoKGltbSkgJSAzMikpOworCisKKworLy8gQlJBCisKK19CUkEsMDAwMDAsMDAsNi4qKiw2LioqLDYuUkM6QlJBOnNob3J0Om11OkJSQQorImJyYSByPFJDPiIKKwluaWEgPSBjaWEgKyBwY2Rpc3A7CitfQlJBLDAwMDAwLDEwLF9JTU0xODpCUkE6c2hvcnQ6bXU6QlJBIGltbQorImJyYSA8cGNkaXNwPiIKKwluaWEgPSBjaWEgKyBwY2Rpc3A7CitfQlJBLDAwMDAwLDEwLDYuKiosNi4qKixfSU1NMzI6QlJBOmxvbmc6bXU6QlJBIGltbSBsb25nCisiYnJhIDxwY2Rpc3A+IgorCW5pYSA9IGNpYSArIHBjZGlzcDsKKworCisKKy8vIEJSQVROWgorCitfQlJBLDAwMTAwLDAxLDYuUkEsNi4qKiw2LlJDOkJSQTpzaG9ydDptdTpCUkFUTloKKyJicmF0bnogcjxSQz4iCisJaWYgKCpSYSAhPSAwKQorCSAgbmlhID0gY2lhICsgcGNkaXNwOworX0JSQSwwMDEwMCwxMSw2LlJBLF9JTU0xMjpCUkE6c2hvcnQ6bXU6QlJBVE5aIGltbQorImJyYXRueiA8cGNkaXNwPiIKKwlpZiAoKlJhICE9IDApCisJICBuaWEgPSBjaWEgKyBwY2Rpc3A7CitfQlJBLDAwMTAwLDExLDYuUkEsNi4qKixfSU1NMzI6QlJBOmxvbmc6bXU6QlJBVE5aIGltbSBsb25nCisiYnJhdG56IDxwY2Rpc3A+IgorCWlmICgqUmEgIT0gMCkKKwkgIG5pYSA9IGNpYSArIHBjZGlzcDsKKworCisKKy8vIEJSQVRaUgorCitfQlJBLDAwMTAwLDAwLDYuUkEsNi4qKiw2LlJDOkJSQTpzaG9ydDptdTpCUkFUWlIKKyJicmF0enIgcjxSQz4iCisJaWYgKHZhbF9SYSA9PSAwKQorCSAgbmlhID0gY2lhICsgcGNkaXNwOworX0JSQSwwMDEwMCwxMCw2LlJBLF9JTU0xMjpCUkE6c2hvcnQ6bXU6QlJBVFpSIGltbQorImJyYXR6ciA8cGNkaXNwPiIKKwlpZiAodmFsX1JhID09IDApCisJICBuaWEgPSBjaWEgKyBwY2Rpc3A7CitfQlJBLDAwMTAwLDEwLDYuUkEsNi4qKixfSU1NMzI6QlJBOmxvbmc6bXU6QlJBVFpSIGltbSBsb25nCisiYnJhdHpyIDxwY2Rpc3A+IgorCWlmICh2YWxfUmEgPT0gMCkKKwkgIG5pYSA9IGNpYSArIHBjZGlzcDsKKworCisKKy8vIEJTRVQKKworX0xPR0lDLDAwMDEwLDAwLDYuUkEsNi5SQiw2LlJDOkxPR0lDOnNob3J0Oml1LG11OkJTRVQKKyJic2V0IHI8UkE+LCByPFJCPiwgcjxSQz4iCisJV1JJVEUzMl9RVUVVRSAoUmEsIFJiIHwgQklUMzIoKFJjKSAlIDMyKSk7CitfTE9HSUMsMDAwMTAsMTAsNi5SQSw2LlJCLF9JTU02OkxPR0lDOnNob3J0Oml1LG11OkJTRVQgaW1tCisiYnNldCByPFJBPiwgcjxSQj4sIDxpbW0+IgorCVdSSVRFMzJfUVVFVUUgKFJhLCBSYiB8IEJJVDMyKChpbW0pICUgMzIpKTsKKworCisKKy8vIEJTUgorCitfQlJBLDAwMDEwLDAwLDYuKiosNi4qKiw2LlJDOkJSQTpzaG9ydDptdTpCU1IKKyJic3IgcjxSQz4iCisJaWYgKGNpYSA9PSBSUFRfRSAmJiBQU1dfVkFMIChQU1dfUlApKQorCSAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIFJQVF9TKTsKKwllbHNlCisJICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgY2lhICsgOCk7CisJbmlhID0gY2lhICsgcGNkaXNwOworCWlmIChUUkFDRV9DQUxMX1ApCisJICBUUkFDRV9BQ1RJT04gfD0gVFJBQ0VfQUNUSU9OX0NBTEw7CitfQlJBLDAwMDEwLDEwLF9JTU0xODpCUkE6c2hvcnQ6bXU6QlNSIGltbQorImJzciA8cGNkaXNwPiIKKwlpZiAoY2lhID09IFJQVF9FICYmIFBTV19WQUwgKFBTV19SUCkpCisJICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgUlBUX1MpOworCWVsc2UKKwkgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBjaWEgKyA4KTsKKwluaWEgPSBjaWEgKyBwY2Rpc3A7CisJaWYgKFRSQUNFX0NBTExfUCkKKwkgIFRSQUNFX0FDVElPTiB8PSBUUkFDRV9BQ1RJT05fQ0FMTDsKK19CUkEsMDAwMTAsMTAsNi4qKiw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpCU1IgaW1tIGxvbmcKKyJic3IgPHBjZGlzcD4iCisJaWYgKGNpYSA9PSBSUFRfRSAmJiBQU1dfVkFMIChQU1dfUlApKQorCSAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIFJQVF9TKTsKKwllbHNlCisJICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgY2lhICsgOCk7CisJbmlhID0gY2lhICsgcGNkaXNwOworCWlmIChUUkFDRV9DQUxMX1ApCisJICBUUkFDRV9BQ1RJT04gfD0gVFJBQ0VfQUNUSU9OX0NBTEw7CisKKworLy8gQlNSVE5aCisKK19CUkEsMDAxMTAsMDEsNi5SQSw2LioqLDYuUkM6QlJBOnNob3J0Om11OkJTUlROWgorImJzcnRueiByPFJDPiIKKwlpZiAodmFsX1JhICE9IDApIHsKKwkgIGlmIChjaWEgPT0gUlBUX0UgJiYgUFNXX1ZBTCAoUFNXX1JQKSkKKwkgICAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIFJQVF9TKTsKKwkgIGVsc2UKKwkgICAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIGNpYSArIDgpOworCSAgbmlhID0gY2lhICsgcGNkaXNwOworCSAgaWYgKFRSQUNFX0NBTExfUCkKKwkgICAgVFJBQ0VfQUNUSU9OIHw9IFRSQUNFX0FDVElPTl9DQUxMOworCX0KKworX0JSQSwwMDExMCwxMSw2LlJBLF9JTU0xMjpCUkE6c2hvcnQ6bXU6QlNSVE5aIGltbQorImJzcnRueiA8cGNkaXNwPiIKKwlpZiAodmFsX1JhICE9IDApIHsKKwkgIGlmIChjaWEgPT0gUlBUX0UgJiYgUFNXX1ZBTCAoUFNXX1JQKSkKKwkgICAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIFJQVF9TKTsKKwkgIGVsc2UKKwkgICAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIGNpYSArIDgpOworCSAgbmlhID0gY2lhICsgcGNkaXNwOworCSAgaWYgKFRSQUNFX0NBTExfUCkKKwkgICAgVFJBQ0VfQUNUSU9OIHw9IFRSQUNFX0FDVElPTl9DQUxMOworCX0KKworX0JSQSwwMDExMCwxMSw2LlJBLDYuKiosX0lNTTMyOkJSQTpsb25nOm11OkJTUlROWiBpbW0gbG9uZworImJzcnRueiA8cGNkaXNwPiIKKwlpZiAodmFsX1JhICE9IDApIHsKKwkgIGlmIChjaWEgPT0gUlBUX0UgJiYgUFNXX1ZBTCAoUFNXX1JQKSkKKwkgICAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIFJQVF9TKTsKKwkgIGVsc2UKKwkgICAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIGNpYSArIDgpOworCSAgbmlhID0gY2lhICsgcGNkaXNwOworCSAgaWYgKFRSQUNFX0NBTExfUCkKKwkgICAgVFJBQ0VfQUNUSU9OIHw9IFRSQUNFX0FDVElPTl9DQUxMOworCX0KKworCisvLyBCU1JUWlIKKworX0JSQSwwMDExMCwwMCw2LlJBLDYuKiosNi5SQzpCUkE6c2hvcnQ6bXU6QlNSVFpSCisiYnNydHpyIHI8UkM+IgorCWlmICh2YWxfUmEgPT0gMCkgeworCSAgaWYgKGNpYSA9PSBSUFRfRSAmJiBQU1dfVkFMIChQU1dfUlApKQorCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgUlBUX1MpOworCSAgZWxzZQorCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgY2lhICsgOCk7CisJICBuaWEgPSBjaWEgKyBwY2Rpc3A7CisJICBpZiAoVFJBQ0VfQ0FMTF9QKQorCSAgICBUUkFDRV9BQ1RJT04gfD0gVFJBQ0VfQUNUSU9OX0NBTEw7CisJfQorCitfQlJBLDAwMTEwLDEwLDYuUkEsX0lNTTEyOkJSQTpzaG9ydDptdTpCU1JUWlIgaW1tCisiYnNydHpyIDxwY2Rpc3A+IgorCWlmICh2YWxfUmEgPT0gMCkgeworCSAgaWYgKGNpYSA9PSBSUFRfRSAmJiBQU1dfVkFMIChQU1dfUlApKQorCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgUlBUX1MpOworCSAgZWxzZQorCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgY2lhICsgOCk7CisJICBuaWEgPSBjaWEgKyBwY2Rpc3A7CisJICBpZiAoVFJBQ0VfQ0FMTF9QKQorCSAgICBUUkFDRV9BQ1RJT04gfD0gVFJBQ0VfQUNUSU9OX0NBTEw7CisJfQorCitfQlJBLDAwMTEwLDEwLDYuUkEsNi4qKixfSU1NMzI6QlJBOmxvbmc6bXU6QlNSVFpSIGltbSBsb25nCisiYnNydHpyIDxwY2Rpc3A+IgorCWlmICh2YWxfUmEgPT0gMCkgeworCSAgaWYgKGNpYSA9PSBSUFRfRSAmJiBQU1dfVkFMIChQU1dfUlApKQorCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgUlBUX1MpOworCSAgZWxzZQorCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgY2lhICsgOCk7CisJICBuaWEgPSBjaWEgKyBwY2Rpc3A7CisJICBpZiAoVFJBQ0VfQ0FMTF9QKQorCSAgICBUUkFDRV9BQ1RJT04gfD0gVFJBQ0VfQUNUSU9OX0NBTEw7CisJfQorCisKKy8vIEJUU1QKKworX0xPR0lDLDAwMDAwLDAwLCoqKiwzLkZBLDYuUkIsNi5SQzpMT0dJQzpzaG9ydDppdSxtdTpCVFNUCisiYnRzdCBmPEZBPiwgcjxSQj4sIHI8UkM+IgorCWludCBiaXQgPSAoUmMpICUgMzI7CisJUFNXX0ZMQUdfU0VUX1FVRVVFKEZBLCBNQVNLRUQzMihSYiwgYml0LCBiaXQpKTsKK19MT0dJQywwMDAwMCwxMCwqKiosMy5GQSw2LlJCLF9JTU02OkxPR0lDOnNob3J0Oml1LG11OkJUU1QgaW1tCisiYnRzdCBmPEZBPiwgcjxSQj4sIDxpbW0+IgorCWludCBiaXQgPSBpbW0gJSAzMjsKKwlQU1dfRkxBR19TRVRfUVVFVUUoRkEsIE1BU0tFRDMyKFJiLCBiaXQsIGJpdCkpOworCisKKworLy8gQ01QY2MKKwordm9pZDo6ZnVuY3Rpb246OmRvX2NtcF9jYzppbnQgY2MsIGludCBmYSwgc2lnbmVkMzIgcmIsIHNpZ25lZDMyIHJjCisJaW50IHZhbHVlID0gMDsKKwlzd2l0Y2ggKGNjKSB7CisJY2FzZSAwOiAvKiBFUSAqLworCSAgdmFsdWUgPSAocmIgPT0gcmMpOworCSAgYnJlYWs7CisJY2FzZSAxOiAvKiBORSAqLworCSAgdmFsdWUgPSAocmIgIT0gcmMpOworCSAgYnJlYWs7CisJY2FzZSAyOiAvKiBHVCAqLworCSAgdmFsdWUgPSAocmIgPiByYyk7CisJICBicmVhazsKKwljYXNlIDM6IC8qIEdFICovCisJICB2YWx1ZSA9IChyYiA+PSByYyk7CisJICBicmVhazsKKwljYXNlIDQ6IC8qIExUICovCisJICB2YWx1ZSA9IChyYiA8IHJjKTsKKwkgIGJyZWFrOworCWNhc2UgNTogLyogTEUgKi8KKwkgIHZhbHVlID0gKHJiIDw9IHJjKTsKKwkgIGJyZWFrOworCWNhc2UgNjogLyogUFMgKi8KKwkgIHZhbHVlID0gKChyYiA+PSAwKSAmJiAocmMgPj0gMCkpOworCSAgYnJlYWs7CisJY2FzZSA3OiAvKiBORyAqLworCSAgdmFsdWUgPSAoKHJiIDwgMCkgJiYgKHJjIDwgMCkpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHNpbV9lbmdpbmVfYWJvcnQgKFNELCBDUFUsIGNpYSwgImRvX2NtcF9jYyAtIGludGVybmFsIGVycm9yIC0gYmFkIHN3aXRjaCAoJWQpIiwgY2MpOworCX0KKwlQU1dfRkxBR19TRVRfUVVFVUUoZmEsIHZhbHVlKTsKKworOjolczo6Y2NjOmludCBjY2MKKwlzd2l0Y2ggKGNjYykKKwkgIHsKKwkgIGNhc2UgMDogcmV0dXJuICJlcSI7CisJICBjYXNlIDE6IHJldHVybiAibmUiOworCSAgY2FzZSAyOiByZXR1cm4gImd0IjsKKwkgIGNhc2UgMzogcmV0dXJuICJnZSI7CisJICBjYXNlIDQ6IHJldHVybiAibHQiOworCSAgY2FzZSA1OiByZXR1cm4gImxlIjsKKwkgIGNhc2UgNjogcmV0dXJuICJwcyI7CisJICBjYXNlIDc6IHJldHVybiAibmciOworCSAgZGVmYXVsdDogcmV0dXJuICI/IjsKKwkgIH0KKworX0xPR0lDLDAxMTAwLDAwLGNjYywzLkZBLDYuUkIsNi5SQzpMT0dJQzpzaG9ydDppdSxtdTpDTVBjYworImNtcCVzPGNjYz4gZjxGQT4sIHI8UkI+LCByPFJDPiIKKwlkb19jbXBfY2MoX1NELCBjY2MsIEZBLCBSYiwgUmMpOworX0xPR0lDLDAxMTAwLDEwLGNjYywzLkZBLDYuUkIsX0lNTTY6TE9HSUM6c2hvcnQ6aXUsbXU6Q01QY2MgaW1tCisiY21wJXM8Y2NjPiBmPEZBPiwgcjxSQj4sIDxpbW0+IgorCWRvX2NtcF9jYyhfU0QsIGNjYywgRkEsIFJiLCBpbW0pOworX0xPR0lDLDAxMTAwLDEwLGNjYywzLkZBLDYuUkIsX0lNTTMyOkxPR0lDOmxvbmc6aXUsbXU6Q01QY2MgaW1tIGxvbmcKKyJjbXAlczxjY2M+IGY8RkE+LCByPFJCPiwgPGltbT4iCisJZG9fY21wX2NjKF9TRCwgY2NjLCBGQSwgUmIsIGltbSk7CisKKworCisvLyBDTVBVY2MKKwordm9pZDo6ZnVuY3Rpb246OmRvX2NtcHVfY2M6aW50IGNjLCBpbnQgZmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgcmMKKwlpbnQgdmFsdWUgPSAwOworCXN3aXRjaCAoY2MpIHsKKwljYXNlIDI6IC8qIEdUICovCisJICB2YWx1ZSA9IChyYiA+IHJjKTsKKwkgIGJyZWFrOworCWNhc2UgMzogLyogR0UgKi8KKwkgIHZhbHVlID0gKHJiID49IHJjKTsKKwkgIGJyZWFrOworCWNhc2UgNDogLyogTFQgKi8KKwkgIHZhbHVlID0gKHJiIDwgcmMpOworCSAgYnJlYWs7CisJY2FzZSA1OiAvKiBMRSAqLworCSAgdmFsdWUgPSAocmIgPD0gcmMpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHNpbV9lbmdpbmVfYWJvcnQgKFNELCBDUFUsIGNpYSwgImRvX2NtcHVfY2MgLSBpbnRlcm5hbCBlcnJvciAtIGJhZCBzd2l0Y2ggKCVkKSIsIGNjKTsKKwl9CisJUFNXX0ZMQUdfU0VUX1FVRVVFKGZhLCB2YWx1ZSk7CisKK19MT0dJQywwMTEwMSwwMCxjY2MsMy5GQSw2LlJCLDYuUkM6TE9HSUM6c2hvcnQ6aXUsbXU6Q01QVWNjCisiY21wdSVzPGNjYz4gZjxGQT4sIHI8UkI+LCByPFJDPiIKKwlkb19jbXB1X2NjKF9TRCwgY2NjLCBGQSwgUmIsIFJjKTsKK19MT0dJQywwMTEwMSwxMCxjY2MsMy5GQSw2LlJCLF9JTU02OkxPR0lDOnNob3J0Oml1LG11OkNNUFVjYyBpbW0KKyJjbXB1JXM8Y2NjPiBmPEZBPiwgcjxSQj4sIDxpbW0+IgorCWRvX2NtcHVfY2MoX1NELCBjY2MsIEZBLCBSYiwgaW1tXzZ1KTsKK19MT0dJQywwMTEwMSwxMCxjY2MsMy5GQSw2LlJCLF9JTU0zMjpMT0dJQzpsb25nOml1LG11OkNNUFVjYyBpbW0gbG9uZworImNtcHUlczxjY2M+IGY8RkE+LCByPFJCPiwgPGltbT4iCisJZG9fY21wdV9jYyhfU0QsIGNjYywgRkEsIFJiLCBpbW0pOworCisKKworLy8gREJSQQorCit2b2lkOjpmdW5jdGlvbjo6ZG9fZGJyYTphZGRyZXNzX3dvcmQgcGNkaXNwLCB1bnNpZ25lZDMyIHJhCisJUFNXX1NFVF9RVUVVRSAoUFNXX1JQLCAxKTsKKwlXUklURTMyX1FVRVVFICgmUlBUX0MsIDEpOworCVdSSVRFMzJfUVVFVUUgKCZSUFRfUywgY2lhICsgcGNkaXNwKTsKKwlXUklURTMyX1FVRVVFICgmUlBUX0UsIGNpYSArIChyYSAmIH4weDcpKTsKKworX0JSQSwxMDAwMCwwMCw2LlJBLDYuKiosNi5SQzpCUkE6c2hvcnQ6bXU6REJSQQorImRicmEgcjxSQT4sIHI8UkM+IgorCWRvX2RicmEoX1NELCBwY2Rpc3AsIHZhbF9SYSk7CitfQlJBLDEwMDAwLDEwLDYuUkEsX0lNTTEyOkJSQTpzaG9ydDptdTpEQlJBIGltbQorImRicmEgcjxSQT4sIDxwY2Rpc3A+IgorCWRvX2RicmEoX1NELCBwY2Rpc3AsIHZhbF9SYSk7CitfQlJBLDEwMDAwLDEwLDYuUkEsNi4qKixfSU1NMzI6QlJBOmxvbmc6bXU6REJSQSBpbW0gbG9uZworImRicmEgcjxSQT4sIDxwY2Rpc3A+IgorCWRvX2RicmEoX1NELCBwY2Rpc3AsIHZhbF9SYSk7CisKKworCisvLyBEQlJBSQorCit2b2lkOjpmdW5jdGlvbjo6ZG9fZGJyYWk6YWRkcmVzc193b3JkIHBjZGlzcCwgdW5zaWduZWQzMiBpbW0KKwlQU1dfU0VUX1FVRVVFIChQU1dfUlAsIDEpOworCVdSSVRFMzJfUVVFVUUgKCZSUFRfQywgMSk7CisJV1JJVEUzMl9RVUVVRSAoJlJQVF9TLCBjaWEgKyBwY2Rpc3ApOworCVdSSVRFMzJfUVVFVUUgKCZSUFRfRSwgY2lhICsgKGltbSA8PCAzKSk7CisKK19CUkEsMTAxMDAsMDAsNi5JTU1fNiw2LioqLDYuUkM6QlJBOnNob3J0Om11OkRCUkFJCisiZGJyYWkgPElNTV82PiwgcjxSQz4iCisJZG9fZGJyYWkoX1NELCBwY2Rpc3AsIElNTV82KTsKK19CUkEsMTAxMDAsMTAsNi5JTU1fNixfSU1NMTI6QlJBOnNob3J0Om11OkRCUkFJIGltbQorImRicmFpIDxJTU1fNj4sIDxwY2Rpc3A+IgorCWRvX2RicmFpKF9TRCwgcGNkaXNwLCBJTU1fNik7CitfQlJBLDEwMTAwLDEwLDYuSU1NXzYsNi4qKixfSU1NMzI6QlJBOmxvbmc6bXU6REJSQUkgaW1tIGxvbmcKKyJkYnJhaSA8SU1NXzY+LCA8cGNkaXNwPiIKKwlkb19kYnJhaShfU0QsIHBjZGlzcCwgSU1NXzYpOworCisKKworLy8gREJTUgorCit2b2lkOjpmdW5jdGlvbjo6ZG9fZGJzcjphZGRyZXNzX3dvcmQgcGNkaXNwLCB1bnNpZ25lZDMyIHJhCisJUFNXX1NFVF9RVUVVRSAoUFNXX1JQLCAxKTsKKwlXUklURTMyX1FVRVVFICgmUlBUX0MsIDEpOworCVdSSVRFMzJfUVVFVUUgKCZSUFRfUywgY2lhICsgcGNkaXNwKTsKKwlXUklURTMyX1FVRVVFICgmUlBUX0UsIGNpYSArIHJhKTsKKwlXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgY2lhICsgcmEgKyA4KTsKKworX0JSQSwxMDAxMCwwMCw2LlJBLDYuKiosNi5SQzpCUkE6c2hvcnQ6bXU6REJTUgorImRic3IgcjxSQT4sIHI8UkM+IgorCWRvX2Ric3IoX1NELCBwY2Rpc3AsIHZhbF9SYSk7CitfQlJBLDEwMDEwLDEwLDYuUkEsX0lNTTEyOkJSQTpzaG9ydDptdTpEQlNSIGltbQorImRic3IgcjxSQT4sIDxwY2Rpc3A+IgorCWRvX2Ric3IoX1NELCBwY2Rpc3AsIHZhbF9SYSk7CitfQlJBLDEwMDEwLDEwLDYuUkEsNi4qKixfSU1NMzI6QlJBOmxvbmc6bXU6REJTUiBpbW0gbG9uZworImRic3IgcjxSQT4sIDxwY2Rpc3A+IgorCWRvX2Ric3IoX1NELCBwY2Rpc3AsIHZhbF9SYSk7CisKKworCisvLyBEQlNSSQorCit2b2lkOjpmdW5jdGlvbjo6ZG9fZGJzcmk6YWRkcmVzc193b3JkIHBjZGlzcCwgdW5zaWduZWQzMiBpbW0KKwlQU1dfU0VUX1FVRVVFIChQU1dfUlAsIDEpOworCVdSSVRFMzJfUVVFVUUgKCZSUFRfQywgMSk7CisJV1JJVEUzMl9RVUVVRSAoJlJQVF9TLCBjaWEgKyBwY2Rpc3ApOworCVdSSVRFMzJfUVVFVUUgKCZSUFRfRSwgY2lhICsgKGltbSA8PCAzKSk7CisJV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIGNpYSArIChpbW0gPDwgMykgKyA4KTsKKworX0JSQSwxMDExMCwwMCw2LklNTV82LDYuKiosNi5SQzpCUkE6c2hvcnQ6bXU6REJTUkkKKyJkYnNyaSA8SU1NXzY+LCByPFJDPiIKKwlkb19kYnNyaShfU0QsIHBjZGlzcCwgSU1NXzYpOworX0JSQSwxMDExMCwxMCw2LklNTV82LF9JTU0xMjpCUkE6c2hvcnQ6bXU6REJTUkkgaW1tCisiZGJzcmkgPElNTV82PiwgPHBjZGlzcD4iCisJZG9fZGJzcmkoX1NELCBwY2Rpc3AsIElNTV82KTsKK19CUkEsMTAxMTAsMTAsNi5JTU1fNiw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpEQlNSSSBpbW0gbG9uZworImRic3JpIDxJTU1fNj4sIDxwY2Rpc3A+IgorCWRvX2Ric3JpKF9TRCwgcGNkaXNwLCBJTU1fNik7CisKKworCisvLyBEQlQKKworCitfQlJBLDAxMDExLDAwLDYuKiosNi4qKiw2LioqOkJSQTpzaG9ydDptdTpEQlQKKyJkYnQiCisJaWYgKGNpYSA9PSBSUFRfRSAmJiBQU1dfVkFMIChQU1dfUlApKQorCSAgeworCSAgICBXUklURTMyX1FVRVVFICgmRFBDLCBSUFRfUyk7CisJICAgIGlmIChSUFRfQyA9PSAwKQorCSAgICAgIFBTV19TRVQgKFBTV19SUCwgMCk7CisJICB9CisJZWxzZQorCSAgV1JJVEUzMl9RVUVVRSAoJkRQQywgY2lhICsgOCk7CisJRElEX1RSQVAgPSAyOworCW5pYSA9IDB4ZmZmZmYxMjA7IC8qIGRlYnVnX3RyYXBfYWRkcmVzcyAqLworCisvLyBESk1QCisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19kam1wOmFkZHJlc3Nfd29yZCBwY2Rpc3AsIHVuc2lnbmVkMzIgcmEKKwlQU1dfU0VUX1FVRVVFIChQU1dfUlAsIDEpOworCVdSSVRFMzJfUVVFVUUgKCZSUFRfQywgMSk7CisJV1JJVEUzMl9RVUVVRSAoJlJQVF9TLCBwY2Rpc3ApOworCVdSSVRFMzJfUVVFVUUgKCZSUFRfRSwgY2lhICsgKHJhICYgfjB4NykpOworCitfQlJBLDEwMDAxLDAwLDYuUkEsNi4qKiw2LlJDOkJSQTpzaG9ydDptdTpESk1QCisiZGptcCByPFJBPiwgcjxSQz4iCisJZG9fZGptcChfU0QsIHBjZGlzcCwgdmFsX1JhKTsKK19CUkEsMTAwMDEsMTAsNi5SQSxfSU1NMTI6QlJBOnNob3J0Om11OkRKTVAgaW1tCisiZGptcCByPFJBPiwgPHBjZGlzcD4iCisJZG9fZGptcChfU0QsIHBjZGlzcCwgdmFsX1JhKTsKK19CUkEsMTAwMDEsMTAsNi5SQSw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpESk1QIGltbSBsb25nCisiZGptcCByPFJBPiwgPHBjZGlzcD4iCisJZG9fZGptcChfU0QsIHBjZGlzcCwgdmFsX1JhKTsKKworCisKKy8vIERKTVBJCisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19kam1waTphZGRyZXNzX3dvcmQgcGNkaXNwLCB1bnNpZ25lZDMyIGltbQorCVBTV19TRVRfUVVFVUUgKFBTV19SUCwgMSk7CisJV1JJVEUzMl9RVUVVRSAoJlJQVF9DLCAxKTsKKwlXUklURTMyX1FVRVVFICgmUlBUX1MsIHBjZGlzcCk7CisJV1JJVEUzMl9RVUVVRSAoJlJQVF9FLCBjaWEgKyAoaW1tIDw8IDMpKTsKKworX0JSQSwxMDEwMSwwMCw2LklNTV82LDYuKiosNi5SQzpCUkE6c2hvcnQ6bXU6REpNUEkKKyJkam1waSA8SU1NXzY+LCByPFJDPiIKKwlkb19kam1waShfU0QsIHBjZGlzcCwgSU1NXzYpOworX0JSQSwxMDEwMSwxMCw2LklNTV82LF9JTU0xMjpCUkE6c2hvcnQ6bXU6REpNUEkgaW1tCisiZGptcGkgPElNTV82PiwgPHBjZGlzcD4iCisJZG9fZGptcGkoX1NELCBwY2Rpc3AsIElNTV82KTsKK19CUkEsMTAxMDEsMTAsNi5JTU1fNiw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpESk1QSSBpbW0gbG9uZworImRqbXBpIDxJTU1fNj4sIDxwY2Rpc3A+IgorCWRvX2RqbXBpKF9TRCwgcGNkaXNwLCBJTU1fNik7CisKKworCisvLyBESlNSCisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19kanNyOmFkZHJlc3Nfd29yZCBwY2Rpc3AsIHVuc2lnbmVkMzIgcmEKKwlQU1dfU0VUX1FVRVVFIChQU1dfUlAsIDEpOworCVdSSVRFMzJfUVVFVUUgKCZSUFRfQywgMSk7CisJV1JJVEUzMl9RVUVVRSAoJlJQVF9TLCBwY2Rpc3ApOworCVdSSVRFMzJfUVVFVUUgKCZSUFRfRSwgY2lhICsgKHJhICYgfjB4NykpOworCVdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBjaWEgKyAocmEgJiB+MHg3KSArIDgpOworCitfQlJBLDEwMDExLDAwLDYuUkEsNi4qKiw2LlJDOkJSQTpzaG9ydDptdTpESlNSCisiZGpzciByPFJBPiwgcjxSQz4iCisJZG9fZGpzcihfU0QsIHBjZGlzcCwgdmFsX1JhKTsKK19CUkEsMTAwMTEsMTAsNi5SQSxfSU1NMTI6QlJBOnNob3J0Om11OkRKU1IgaW1tCisiZGpzciByPFJBPiwgPHBjZGlzcD4iCisJZG9fZGpzcihfU0QsIHBjZGlzcCwgdmFsX1JhKTsKK19CUkEsMTAwMTEsMTAsNi5SQSw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpESlNSIGltbSBsb25nCisiZGpzciByPFJBPiwgPHBjZGlzcD4iCisJZG9fZGpzcihfU0QsIHBjZGlzcCwgdmFsX1JhKTsKKworCisKKy8vIERKU1JJCisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19kanNyaTphZGRyZXNzX3dvcmQgcGNkaXNwLCB1bnNpZ25lZDMyIGltbQorCVBTV19TRVRfUVVFVUUgKFBTV19SUCwgMSk7CisJV1JJVEUzMl9RVUVVRSAoJlJQVF9DLCAxKTsKKwlXUklURTMyX1FVRVVFICgmUlBUX1MsIHBjZGlzcCk7CisJV1JJVEUzMl9RVUVVRSAoJlJQVF9FLCBjaWEgKyAoaW1tIDw8IDMpKTsKKwlXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgY2lhICsgKGltbSA8PCAzKSArIDgpOworCitfQlJBLDEwMTExLDAwLDYuSU1NXzYsNi4qKiw2LlJDOkJSQTpzaG9ydDptdTpESlNSSQorImRqc3JpIDxJTU1fNj4sIHI8UkM+IgorCWRvX2Rqc3JpKF9TRCwgcGNkaXNwLCBJTU1fNik7CitfQlJBLDEwMTExLDEwLDYuSU1NXzYsX0lNTTEyOkJSQTpzaG9ydDptdTpESlNSSSBpbW0KKyJkanNyaSA8SU1NXzY+LCA8cGNkaXNwPiIKKwlkb19kanNyaShfU0QsIHBjZGlzcCwgSU1NXzYpOworX0JSQSwxMDExMSwxMCw2LklNTV82LDYuKiosX0lNTTMyOkJSQTpsb25nOm11OkRKU1JJIGltbSBsb25nCisiZGpzcmkgPElNTV82PiwgPHBjZGlzcD4iCisJZG9fZGpzcmkoX1NELCBwY2Rpc3AsIElNTV82KTsKKworCisKKy8vIEpNUAorCitfQlJBLDAwMDAxLDAwLDYuKiosNi4qKiw2LlJDOkJSQTpzaG9ydDptdTpKTVAKKyJqbXAgcjxSQz4iCisJbmlhID0gcGNhZGRyOworCWlmIChSQyA9PSA2MiAmJiBUUkFDRV9DQUxMX1ApCisJICBUUkFDRV9BQ1RJT04gfD0gVFJBQ0VfQUNUSU9OX1JFVFVSTjsKK19CUkEsMDAwMDEsMTAsX0lNTTE4OkJSQTpzaG9ydDptdTpKTVAgaW1tCisiam1wIDxwY2Rpc3A+IgorCW5pYSA9IHBjYWRkcjsKK19CUkEsMDAwMDEsMTAsNi4qKiw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpKTVAgaW1tIGxvbmcKKyJqbXAgPHBjZGlzcD4iCisJbmlhID0gcGNhZGRyOworCisKKworLy8gSk1QVE5aCisKK19CUkEsMDAxMDEsMDEsNi5SQSw2LioqLDYuUkM6QlJBOnNob3J0Om11OkpNUFROWgorImptcHRueiByPFJDPiIKKwlpZiAodmFsX1JhICE9IDApCisJICBuaWEgPSBwY2FkZHI7CitfQlJBLDAwMTAxLDExLDYuUkEsX0lNTTEyOkJSQTpzaG9ydDptdTpKTVBUTlogaW1tCisiam1wdG56IDxwY2Rpc3A+IgorCWlmICh2YWxfUmEgIT0gMCkKKwkgIG5pYSA9IHBjYWRkcjsKK19CUkEsMDAxMDEsMTEsNi5SQSw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpKTVBUTlogaW1tIGxvbmcKKyJqbXB0bnogPHBjZGlzcD4iCisJaWYgKHZhbF9SYSAhPSAwKQorCSAgbmlhID0gcGNhZGRyOworCisKKworLy8gSk1QVFpSCisKK19CUkEsMDAxMDEsMDAsNi5SQSw2LioqLDYuUkM6QlJBOnNob3J0Om11OkpNUFRaUgorImptcHR6ciByPFJDPiIKKwlpZiAodmFsX1JhID09IDApCisJICBuaWEgPSBwY2FkZHI7CitfQlJBLDAwMTAxLDEwLDYuUkEsX0lNTTEyOkJSQTpzaG9ydDptdTpKTVBUWlIgaW1tCisiam1wdHpyIDxwY2Rpc3A+IgorCWlmICh2YWxfUmEgPT0gMCkKKwkgIG5pYSA9IHBjYWRkcjsKK19CUkEsMDAxMDEsMTAsNi5SQSw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpKTVBUWlIgaW1tIGxvbmcKKyJqbXB0enIgPHBjZGlzcD4iCisJaWYgKHZhbF9SYSA9PSAwKQorCSAgbmlhID0gcGNhZGRyOworCisKKworLy8gSk9JTnBwIAorCit2b2lkOjpmdW5jdGlvbjo6ZG9fam9pbl9wcDppbnQgcHAsIHVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIHNyYworCXN3aXRjaCAocHApIHsKKwljYXNlIDB4MDogLyogTEwgKi8KKwkgIFdSSVRFMzJfUVVFVUUgKHJhLCAoKHVuc2lnbmVkMzIpVkwyXzQocmIpIDw8IDE2KSB8IFZMMl80KHNyYykpOworCSAgYnJlYWs7CisJY2FzZSAweDE6IC8qIExIICovCisJICBXUklURTMyX1FVRVVFIChyYSwgKCh1bnNpZ25lZDMyKVZMMl80KHJiKSA8PCAxNikgfCBWSDJfNChzcmMpKTsKKwkgIGJyZWFrOworCWNhc2UgMHgyOiAvKiBITCAqLworCSAgV1JJVEUzMl9RVUVVRSAocmEsICgodW5zaWduZWQzMilWSDJfNChyYikgPDwgMTYpIHwgVkwyXzQoc3JjKSk7CisJICBicmVhazsKKwljYXNlIDB4MzogLyogSEggKi8KKwkgIFdSSVRFMzJfUVVFVUUgKHJhLCAoKHVuc2lnbmVkMzIpVkgyXzQocmIpIDw8IDE2KSB8IFZIMl80KHNyYykpOworCSAgYnJlYWs7CisJfQorCis6OiVzOjpwcDppbnQgcHAKKwlzd2l0Y2ggKHBwKQorCSAgeworCSAgY2FzZSAweDA6IHJldHVybiAibGwiOworCSAgY2FzZSAweDE6IHJldHVybiAibGgiOworCSAgY2FzZSAweDI6IHJldHVybiAiaGwiOworCSAgY2FzZSAweDM6IHJldHVybiAiaGgiOworCSAgZGVmYXVsdDogcmV0dXJuICI/IjsKKwkgIH0KKworX0lBTFUxLDAxMSxwcCwwMCw2LlJBLDYuUkIsNi5SQzpJQUxVMTpzaG9ydDppdSxtdTpKT0lOcHAKKyJqb2luJXM8cHA+IHI8UkE+LCByPFJCPiwgcjxSQz4iCisJZG9fam9pbl9wcChfU0QsIHBwLCBSYSwgUmIsIFJjKTsKK19JQUxVMSwwMTEscHAsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUxOnNob3J0Oml1LG11OkpPSU5wcCBpbW0KKyJqb2luJXM8cHA+IHI8UkE+LCByPFJCPiwgPGltbT4iCisJZG9fam9pbl9wcChfU0QsIHBwLCBSYSwgUmIsIGltbUhMKTsKK19JQUxVMSwwMTEscHAsMTAsNi5SQSw2LlJCLF9JTU0zMjpJQUxVMTpsb25nOml1LG11OkpPSU5wcCBpbW0gbG9uZworImpvaW4lczxwcD4gcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19qb2luX3BwKF9TRCwgcHAsIFJhLCBSYiwgaW1tSEwpOworCisKKworLy8gSlNSCisKK19CUkEsMDAwMTEsMDAsNi4qKiw2LioqLDYuUkM6QlJBOnNob3J0Om11OkpTUgorImpzciByPFJDPiIKKwlpZiAoY2lhID09IFJQVF9FICYmIFBTV19WQUwgKFBTV19SUCkpCisJICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgUlBUX1MpOworCWVsc2UKKwkgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBjaWEgKyA4KTsKKwlpZiAoVFJBQ0VfQ0FMTF9QKQorCSAgVFJBQ0VfQUNUSU9OIHw9IFRSQUNFX0FDVElPTl9DQUxMOworCXJldHVybiBwY2FkZHI7CitfQlJBLDAwMDExLDEwLF9JTU0xODpCUkE6c2hvcnQ6bXU6SlNSIGltbQorImpzciA8cGNkaXNwPiIKKwlpZiAoY2lhID09IFJQVF9FICYmIFBTV19WQUwgKFBTV19SUCkpCisJICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgUlBUX1MpOworCWVsc2UKKwkgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBjaWEgKyA4KTsKKwlpZiAoVFJBQ0VfQ0FMTF9QKQorCSAgVFJBQ0VfQUNUSU9OIHw9IFRSQUNFX0FDVElPTl9DQUxMOworCXJldHVybiBwY2FkZHI7CitfQlJBLDAwMDExLDEwLDYuKiosNi4qKixfSU1NMzI6QlJBOmxvbmc6bXU6SlNSIGltbSBsb25nCisianNyIDxwY2Rpc3A+IgorCWlmIChjaWEgPT0gUlBUX0UgJiYgUFNXX1ZBTCAoUFNXX1JQKSkKKwkgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBSUFRfUyk7CisJZWxzZQorCSAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIGNpYSArIDgpOworCWlmIChUUkFDRV9DQUxMX1ApCisJICBUUkFDRV9BQ1RJT04gfD0gVFJBQ0VfQUNUSU9OX0NBTEw7CisJcmV0dXJuIHBjYWRkcjsKKworCisvLyBKU1JUTloKKworX0JSQSwwMDExMSwwMSw2LlJBLDYuKiosNi5SQzpCUkE6c2hvcnQ6bXU6SlNSVE5aCisianNydG56IHI8UkM+IgorCWlmICh2YWxfUmEgIT0gMCkgeworCSAgaWYgKGNpYSA9PSBSUFRfRSAmJiBQU1dfVkFMIChQU1dfUlApKQorCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgUlBUX1MpOworCSAgZWxzZQorCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgY2lhICsgOCk7CisJICBuaWEgPSBwY2FkZHI7CisJICBpZiAoVFJBQ0VfQ0FMTF9QKQorCSAgICBUUkFDRV9BQ1RJT04gfD0gVFJBQ0VfQUNUSU9OX0NBTEw7CisJfQorX0JSQSwwMDExMSwxMSw2LlJBLF9JTU0xMjpCUkE6c2hvcnQ6bXU6SlNSVE5aIGltbQorImpzcnRueiA8cGNkaXNwPiIKKwlpZiAodmFsX1JhICE9IDApIHsKKwkgIGlmIChjaWEgPT0gUlBUX0UgJiYgUFNXX1ZBTCAoUFNXX1JQKSkKKwkgICAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIFJQVF9TKTsKKwkgIGVsc2UKKwkgICAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIGNpYSArIDgpOworCSAgbmlhID0gcGNhZGRyOworCSAgaWYgKFRSQUNFX0NBTExfUCkKKwkgICAgVFJBQ0VfQUNUSU9OIHw9IFRSQUNFX0FDVElPTl9DQUxMOworCX0KK19CUkEsMDAxMTEsMTEsNi5SQSw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpKU1JUTlogaW1tIGxvbmcKKyJqc3J0bnogPHBjZGlzcD4iCisJaWYgKHZhbF9SYSAhPSAwKSB7CisJICBpZiAoY2lhID09IFJQVF9FICYmIFBTV19WQUwgKFBTV19SUCkpCisJICAgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBSUFRfUyk7CisJICBlbHNlCisJICAgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBjaWEgKyA4KTsKKwkgIG5pYSA9IHBjYWRkcjsKKwkgIGlmIChUUkFDRV9DQUxMX1ApCisJICAgIFRSQUNFX0FDVElPTiB8PSBUUkFDRV9BQ1RJT05fQ0FMTDsKKwl9CisKKworCisvLyBKU1JUWlIKKworX0JSQSwwMDExMSwwMCw2LlJBLDYuKiosNi5SQzpCUkE6c2hvcnQ6bXU6SlNSVFpSCisianNydHpyIHI8UkM+IgorCWlmICh2YWxfUmEgPT0gMCkgeworCSAgaWYgKGNpYSA9PSBSUFRfRSAmJiBQU1dfVkFMIChQU1dfUlApKQorCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgUlBUX1MpOworCSAgZWxzZQorCSAgICBXUklURTMyX1FVRVVFICgmR1BSWzYyXSwgY2lhICsgOCk7CisJICBuaWEgPSBwY2FkZHI7CisJICBpZiAoVFJBQ0VfQ0FMTF9QKQorCSAgICBUUkFDRV9BQ1RJT04gfD0gVFJBQ0VfQUNUSU9OX0NBTEw7CisJfQorX0JSQSwwMDExMSwxMCw2LlJBLF9JTU0xMjpCUkE6c2hvcnQ6bXU6SlNSVFpSIGltbQorImpzcnR6ciA8cGNkaXNwPiIKKwlpZiAodmFsX1JhID09IDApIHsKKwkgIGlmIChjaWEgPT0gUlBUX0UgJiYgUFNXX1ZBTCAoUFNXX1JQKSkKKwkgICAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIFJQVF9TKTsKKwkgIGVsc2UKKwkgICAgV1JJVEUzMl9RVUVVRSAoJkdQUls2Ml0sIGNpYSArIDgpOworCSAgbmlhID0gcGNhZGRyOworCSAgaWYgKFRSQUNFX0NBTExfUCkKKwkgICAgVFJBQ0VfQUNUSU9OIHw9IFRSQUNFX0FDVElPTl9DQUxMOworCX0KK19CUkEsMDAxMTEsMTAsNi5SQSw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpKU1JUWlIgaW1tIGxvbmcKKyJqc3J0enIgPHBjZGlzcD4iCisJaWYgKHZhbF9SYSA9PSAwKSB7CisJICBpZiAoY2lhID09IFJQVF9FICYmIFBTV19WQUwgKFBTV19SUCkpCisJICAgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBSUFRfUyk7CisJICBlbHNlCisJICAgIFdSSVRFMzJfUVVFVUUgKCZHUFJbNjJdLCBjaWEgKyA4KTsKKwkgIG5pYSA9IHBjYWRkcjsKKwkgIGlmIChUUkFDRV9DQUxMX1ApCisJICAgIFRSQUNFX0FDVElPTiB8PSBUUkFDRV9BQ1RJT05fQ0FMTDsKKwl9CisKKworCisvLyBQb3N0IGluY3JlbWVudAorCit2b2lkOjpmdW5jdGlvbjo6ZG9faW5jcjppbnQgeCwgdW5zaWduZWQzMiAqcmIsIGludCBkZWx0YQorCXVuc2lnbmVkMzIgbmV4dF9yYjsKKwlpZiAoeCA9PSAxKQorCSAgbmV4dF9yYiA9ICpyYiArIGRlbHRhOworCWVsc2UgaWYgKHggPT0gMykKKwkgIG5leHRfcmIgPSAqcmIgLSBkZWx0YTsKKwllbHNlCisJICBuZXh0X3JiID0gKnJiOyAvKiB2YWx1ZSBub3QgdXNlZCAqLworCS8qIEhXIGVycmF0dW06IGNoZWNrIHZhbHVlIGFmdGVyIGluY3JlbWVudGluZyAqLworCWlmIChuZXh0X3JiID09IE1PRF9FCisJICAgICYmICh4ID09IDEgfHwgeCA9PSAzKQorCSAgICAmJiAoUFNXX1ZBTChQU1dfTUQpKSkgeworCSAgV1JJVEUzMl9RVUVVRSAocmIsIE1PRF9TKTsKKwl9CisJZWxzZSBpZiAoeCA9PSAxIHx8IHggPT0gMykKKwkgIFdSSVRFMzJfUVVFVUUgKHJiLCBuZXh0X3JiKTsKKworLy8gTEQySAorCitpbnQ6OmZ1bmN0aW9uOjptYWtlX2V2ZW5fcmVnOmludCByZWcsIGNvbnN0IGNoYXIgKm5hbWUKKwlpZiAocmVnICYgMSkKKwkgIHNpbV9lbmdpbmVfYWJvcnQgKFNELCBDUFUsIGNpYSwKKwkJCSAgICAiMHglbHg6JXMgb2RkIHJlZ2lzdGVyIChyJWQpIHVzZWQgaW4gbXVsdGktd29yZCBsb2FkL211bHgyaCIsCisJCQkgICAgY2lhLCBuYW1lLCByZWcpOworCXJldHVybiByZWc7CisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19sZDJoOmludCByYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKKwlzaWduZWQzMiBtZW07CisJcmEgPSBtYWtlX2V2ZW5fcmVnKF9TRCwgcmEsICJMRDJIIik7CisJbWVtID0gTUVNKHNpZ25lZCwgcmIgKyBzcmMsIDQpOworCWlmIChyYSAhPSAwKQorCXsKKwkgIFdSSVRFMzJfUVVFVUUgKCZHUFJbcmEgKyAwXSwgU0VYVDMyKEVYVFJBQ1RFRDMyKG1lbSwgMCwgMTUpLCAxNikpOworCSAgV1JJVEUzMl9RVUVVRSAoJkdQUltyYSArIDFdLCBTRVhUMzIoRVhUUkFDVEVEMzIobWVtLCAxNiwgMzEpLCAxNikpOworCX0KKworOjolczo6WFg6aW50IFhYCisJc3dpdGNoIChYWCkKKwkgIHsKKwkgIGNhc2UgMDogcmV0dXJuICIiOworCSAgY2FzZSAxOiByZXR1cm4gIisiOworCSAgY2FzZSAzOiByZXR1cm4gIi0iOworCSAgZGVmYXVsdDogcmV0dXJuICI/IjsKKwkgIH0KKworX0lNRU0sMDAwMTEsWFgsNi5SQSw2LlJCLDYuU1JDXzY6SU1FTTpzaG9ydDptdTpMRDJICisibGQyaCByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKKyJsZDJoIHI8UkE+LCBAKHI8UkI+JXM8WFg+LCByPFNSQ182PikiCisJZG9fbGQyaChfU0QsIFJBLCBSYiwgc3JjKTsKKwlkb19pbmNyKF9TRCwgWFgsICZHUFJbUkJdLCA0KTsKK19JTUVNLDAwMDExLDEwLDYuUkEsNi5SQixfSU1NMzI6SU1FTTpsb25nOm11OkxEMkggbG9uZworImxkMmggcjxSQT4sIEAocjxSQj4sIDxpbW0+KSIKKwlkb19sZDJoKF9TRCwgUkEsIFJiLCBpbW0pOworCisKKworLy8gTEQyVworCit2b2lkOjpmdW5jdGlvbjo6ZG9fbGQydzppbnQgcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgc3JjCisJdW5zaWduZWQ2NCBtZW07CisJcmEgPSBtYWtlX2V2ZW5fcmVnKF9TRCwgcmEsICJMRDJXIik7CisJbWVtID0gTUVNKHVuc2lnbmVkLCByYiArIHNyYywgOCk7CisJaWYgKHJhICE9IDApCisJeworCSAgV1JJVEUzMl9RVUVVRSAoJkdQUltyYSArIDBdLCBFWFRSQUNURUQ2NCAobWVtLCAwLCAzMSkpOworCSAgV1JJVEUzMl9RVUVVRSAoJkdQUltyYSArIDFdLCBFWFRSQUNURUQ2NCAobWVtLCAzMiwgNjMpKTsKKwl9CisKK19JTUVNLDAwMTEwLFhYLDYuUkEsNi5SQiw2LlNSQ182OklNRU06c2hvcnQ6bXU6TDJXCisibGQydyByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKKyJsZDJ3IHI8UkE+LCBAKHI8UkI+JXM8WFg+LCByPFNSQ182PikiCisJZG9fbGQydyhfU0QsIFJBLCBSYiwgc3JjKTsKKwlkb19pbmNyKF9TRCwgWFgsICZHUFJbUkJdLCA4KTsKK19JTUVNLDAwMTEwLDEwLDYuUkEsNi5SQixfSU1NMzI6SU1FTTpsb25nOm11OkwyVyBsb25nCisibGQydyByPFJBPiwgQChyPFJCPiwgPGltbT4pIgorCWRvX2xkMncoX1NELCBSQSwgUmIsIGltbSk7CisKKworCisvLyBMRDRCSAorCit2b2lkOjpmdW5jdGlvbjo6ZG9fbGQ0Ymg6dW5zaWduZWQzMiByYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKKwl1bnNpZ25lZDE2IGwxLCBsMiwgaDEsIGgyOworCXVuc2lnbmVkMzIgbWVtOworCXJhID0gbWFrZV9ldmVuX3JlZyhfU0QsIHJhLCAiTEQ0QkgiKTsKKwltZW0gPSBNRU0odW5zaWduZWQsIHJiICsgc3JjLCA0KTsKKwloMSA9IFNFWFQxNihFWFRSQUNURUQzMihtZW0sIDAsIDcpLCA4KTsKKwlsMSA9IFNFWFQxNihFWFRSQUNURUQzMihtZW0sIDgsIDE1KSwgOCk7CisJaDIgPSBTRVhUMTYoRVhUUkFDVEVEMzIobWVtLCAxNiwgMjMpLCA4KTsKKwlsMiA9IFNFWFQxNihFWFRSQUNURUQzMihtZW0sIDI0LCAzMSksIDgpOworCWlmIChyYSAhPSAwKQorCXsKKwkgIFdSSVRFMzJfUVVFVUUgKCZHUFJbcmEgKyAwXSwgKGgxIDw8IDE2KSB8IGwxKTsKKwkgIFdSSVRFMzJfUVVFVUUgKCZHUFJbcmEgKyAxXSwgKGgyIDw8IDE2KSB8IGwyKTsKKwl9CisKK19JTUVNLDAwMTAxLFhYLDYuUkEsNi5SQiw2LlNSQ182OklNRU06c2hvcnQ6bXU6TEQ0QkgKKyJsZDRiaCByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKKyJsZDRiaCByPFJBPiwgQChyPFJCPiVzPFhYPiwgcjxTUkNfNj4pIgorCWRvX2xkNGJoKF9TRCwgUkEsIFJiLCBzcmMpOworCWRvX2luY3IoX1NELCBYWCwgJkdQUltSQl0sIDQpOworX0lNRU0sMDAxMDEsMTAsNi5SQSw2LlJCLF9JTU0zMjpJTUVNOmxvbmc6bXU6TEQ0QkggbG9uZworImxkNGJoIHI8UkE+LCBAKHI8UkI+LCA8aW1tPikiCisJZG9fbGQ0YmgoX1NELCBSQSwgUmIsIGltbSk7CisKKworCisvLyBMRDRCSFUKKwordm9pZDo6ZnVuY3Rpb246OmRvX2xkNGJodTp1bnNpZ25lZDMyIHJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIHNyYworCXVuc2lnbmVkMTYgbDEsIGwyLCBoMSwgaDI7CisJdW5zaWduZWQzMiBtZW07CisJcmEgPSBtYWtlX2V2ZW5fcmVnKF9TRCwgcmEsICJMRDRCSCIpOworCW1lbSA9IE1FTShzaWduZWQsIHJiICsgc3JjLCA0KTsKKwloMSA9IEVYVFJBQ1RFRDMyKG1lbSwgMCwgNyk7CisJbDEgPSBFWFRSQUNURUQzMihtZW0sIDgsIDE1KTsKKwloMiA9IEVYVFJBQ1RFRDMyKG1lbSwgMTYsIDIzKTsKKwlsMiA9IEVYVFJBQ1RFRDMyKG1lbSwgMjQsIDMxKTsKKwlpZiAocmEgIT0gMCkKKwl7CisJICBXUklURTMyX1FVRVVFICgmR1BSW3JhICsgMF0sIChoMSA8PCAxNikgfCBsMSk7CisJICBXUklURTMyX1FVRVVFICgmR1BSW3JhICsgMV0sIChoMiA8PCAxNikgfCBsMik7CisJfQorCitfSU1FTSwwMTEwMSxYWCw2LlJBLDYuUkIsNi5TUkNfNjpJTUVNOnNob3J0Om11OkxENEJIVQorImxkNGhidSByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKKyJsZDRoYnUgcjxSQT4sIEAocjxSQj4lczxYWD4sIHI8U1JDXzY+KSIKKwlkb19sZDRiaHUoX1NELCBSQSwgUmIsIHNyYyk7CisJZG9faW5jcihfU0QsIFhYLCAmR1BSW1JCXSwgNCk7CitfSU1FTSwwMTEwMSwxMCw2LlJBLDYuUkIsX0lNTTMyOklNRU06bG9uZzptdTpMRDRCSFUgbG9uZworImxkNGhidSByPFJBPiwgQChyPFJCPiwgPGltbT4pIgorCWRvX2xkNGJodShfU0QsIFJBLCBSYiwgaW1tKTsKKworCisKKy8vIExEQgorCit2b2lkOjpmdW5jdGlvbjo6ZG9fbGRiOnVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIHNyYworCVdSSVRFMzJfUVVFVUUgKHJhLCBNRU0oc2lnbmVkLCByYiArIHNyYywgMSkpOworCitfSU1FTSwwMDAwMCxYWCw2LlJBLDYuUkIsNi5TUkNfNjpJTUVNOnNob3J0Om11OkxEQgorImxkYiByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKKyJsZGIgcjxSQT4sIEAocjxSQj4lczxYWD4sIHI8U1JDXzY+KSIKKwlkb19sZGIoX1NELCBSYSwgUmIsIHNyYyk7CisJZG9faW5jcihfU0QsIFhYLCAmR1BSW1JCXSwgMSk7CitfSU1FTSwwMDAwMCwxMCw2LlJBLDYuUkIsX0lNTTMyOklNRU06bG9uZzptdTpMREIgbG9uZworImxkYiByPFJBPiwgQChyPFJCPiwgPGltbT4pIgorCWRvX2xkYihfU0QsIFJhLCBSYiwgaW1tKTsKKworCisKKy8vIExEQlUKKwordm9pZDo6ZnVuY3Rpb246OmRvX2xkYnU6dW5zaWduZWQzMiAqcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgc3JjCisJV1JJVEUzMl9RVUVVRSAocmEsIE1FTSh1bnNpZ25lZCwgcmIgKyBzcmMsIDEpKTsKKworX0lNRU0sMDEwMDEsWFgsNi5SQSw2LlJCLDYuU1JDXzY6SU1FTTpzaG9ydDptdTpMREJVCisibGRidSByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKKyJsZGJ1IHI8UkE+LCBAKHI8UkI+JXM8WFg+LCByPFNSQ182PikiCisJZG9fbGRidShfU0QsIFJhLCBSYiwgc3JjKTsKKwlkb19pbmNyKF9TRCwgWFgsICZHUFJbUkJdLCAxKTsKK19JTUVNLDAxMDAxLDEwLDYuUkEsNi5SQixfSU1NMzI6SU1FTTpsb25nOm11OkxEQlUgbG9uZworImxkYnUgcjxSQT4sIEAocjxSQj4sIDxpbW0+KSIKKwlkb19sZGJ1KF9TRCwgUmEsIFJiLCBpbW0pOworCisKKworLy8gTERICisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19sZGg6dW5zaWduZWQzMiAqcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgc3JjCisJV1JJVEUzMl9RVUVVRSAocmEsIE1FTShzaWduZWQsIHJiICsgc3JjLCAyKSk7CisKK19JTUVNLDAwMDEwLFhYLDYuUkEsNi5SQiw2LlNSQ182OklNRU06c2hvcnQ6bXU6TERICisibGRoIHI8UkE+LCBAKHI8UkI+LCA8U1JDXzY+KSI6WFggPT0gMAorImxkaCByPFJBPiwgQChyPFJCPiVzPFhYPiwgcjxTUkNfNj4pIgorCWRvX2xkaChfU0QsIFJhLCBSYiwgc3JjKTsKKwlkb19pbmNyKF9TRCwgWFgsICZHUFJbUkJdLCAyKTsKK19JTUVNLDAwMDEwLDEwLDYuUkEsNi5SQixfSU1NMzI6SU1FTTpsb25nOm11OkxESCBsb25nCisibGRoIHI8UkE+LCBAKHI8UkI+LCA8aW1tPikiCisJZG9fbGRoKF9TRCwgUmEsIFJiLCBpbW0pOworCisKKworLy8gTERISAorCit2b2lkOjpmdW5jdGlvbjo6ZG9fbGRoaDp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKKwlXUklURTMyX1FVRVVFIChyYSwgTUVNKHNpZ25lZCwgcmIgKyBzcmMsIDIpIDw8IDE2KTsKKworX0lNRU0sMDAwMDEsWFgsNi5SQSw2LlJCLDYuU1JDXzY6SU1FTTpzaG9ydDptdTpMREhICisibGRoaCByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKKyJsZGhoIHI8UkE+LCBAKHI8UkI+JXM8WFg+LCByPFNSQ182PikiCisJZG9fbGRoaChfU0QsIFJhLCBSYiwgc3JjKTsKKwlkb19pbmNyKF9TRCwgWFgsICZHUFJbUkJdLCAyKTsKK19JTUVNLDAwMDAxLDEwLDYuUkEsNi5SQixfSU1NMzI6SU1FTTpsb25nOm11OkxESEggbG9uZworImxkaGggcjxSQT4sIEAocjxSQj4sIDxpbW0+KSIKKwlkb19sZGhoKF9TRCwgUmEsIFJiLCBpbW0pOworCisKKworLy8gTERIVQorCit2b2lkOjpmdW5jdGlvbjo6ZG9fbGRodTp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKKwlXUklURTMyX1FVRVVFIChyYSwgTUVNKHVuc2lnbmVkLCByYiArIHNyYywgMikpOworCitfSU1FTSwwMTAxMCxYWCw2LlJBLDYuUkIsNi5TUkNfNjpJTUVNOnNob3J0Om11OkxESFUKKyJsZGh1IHI8UkE+LCBAKHI8UkI+LCA8U1JDXzY+KSI6WFggPT0gMAorImxkaHUgcjxSQT4sIEAocjxSQj4lczxYWD4sIHI8U1JDXzY+KSIKKwlkb19sZGh1KF9TRCwgUmEsIFJiLCBzcmMpOworCWRvX2luY3IoX1NELCBYWCwgJkdQUltSQl0sIDIpOworX0lNRU0sMDEwMTAsMTAsNi5SQSw2LlJCLF9JTU0zMjpJTUVNOmxvbmc6bXU6TERIVSBsb25nCisibGRodSByPFJBPiwgQChyPFJCPiwgPGltbT4pIgorCWRvX2xkaHUoX1NELCBSYSwgUmIsIGltbSk7CisKKworCisvLyBMRFcKKwordm9pZDo6ZnVuY3Rpb246OmRvX2xkdzp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKKwlXUklURTMyX1FVRVVFIChyYSwgTUVNKHNpZ25lZCwgcmIgKyBzcmMsIDQpKTsKKworX0lNRU0sMDAxMDAsWFgsNi5SQSw2LlJCLDYuU1JDXzY6SU1FTTpzaG9ydDptdTpMRFcKKyJsZHcgcjxSQT4sIEAocjxSQj4sIDxTUkNfNj4pIjpYWCA9PSAwCisibGR3IHI8UkE+LCBAKHI8UkI+JXM8WFg+LCByPFNSQ182PikiCisJZG9fbGR3KF9TRCwgUmEsIFJiLCBzcmMpOworCWRvX2luY3IoX1NELCBYWCwgJkdQUltSQl0sIDQpOworX0lNRU0sMDAxMDAsMTAsNi5SQSw2LlJCLF9JTU0zMjpJTUVNOmxvbmc6bXU6TERXIGxvbmcKKyJsZHcgcjxSQT4sIEAocjxSQj4sIDxpbW0+KSIKKwlkb19sZHcoX1NELCBSYSwgUmIsIGltbSk7CisKKworCisvLyBNQUNhCisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19tYWM6dW5zaWduZWQ2NCAqYWEsIHVuc2lnbmVkMzIgKnJhLCBzaWduZWQzMiByYiwgc2lnbmVkMzIgc3JjCisJdW5zaWduZWQ2NCBhY2N1bSA9ICphYTsKKwlhY2N1bSArPSAoc2lnbmVkNjQpIChyYikgKiAoc2lnbmVkNjQpIChzcmMpOworCVdSSVRFNjRfUVVFVUUgKGFhLCBhY2N1bSk7CisJV1JJVEUzMl9RVUVVRSAocmEsIEVYVFJBQ1RFRDY0KGFjY3VtLCAzMiwgNjMpKTsKKworX0lBTFUyLDEwMTAwLDAsMS5BQSw2LlJBLDYuUkIsNi5SQzpJQUxVMjpzaG9ydDppdTpNQUNhCisibWFjPEFBPiByPFJBPiwgcjxSQj4sIHI8UkM+IgorCWRvX21hYyhfU0QsIEFhLCBSYSwgUmIsIFJjKTsJCitfSUFMVTIsMTAxMDAsMSwxLkFBLDYuUkEsNi5SQixfSU1NNjpJQUxVMjpzaG9ydDppdTpNQUNhIGltbQorIm1hYzxBQT4gcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19tYWMoX1NELCBBYSwgUmEsIFJiLCBpbW0pOworCisKKworLy8gTUFDU2EKKwordm9pZDo6ZnVuY3Rpb246OmRvX21hY3M6dW5zaWduZWQ2NCAqYWEsIHVuc2lnbmVkMzIgKnJhLCBzaWduZWQzMiByYiwgc2lnbmVkMzIgc3JjCisJdW5zaWduZWQ2NCBhY2N1bSA9ICphYTsKKwlhY2N1bSArPSAoKHNpZ25lZDY0KSAocmIpICogKHNpZ25lZDY0KSAoc3JjKSkgPDwgMTsKKwlXUklURTY0X1FVRVVFIChhYSwgYWNjdW0pOworCVdSSVRFMzJfUVVFVUUgKHJhLCBFWFRSQUNURUQ2NChhY2N1bSwgMCwgMzEpKTsKKworX0lBTFUyLDEwMTAxLDAsMS5BQSw2LlJBLDYuUkIsNi5SQzpJQUxVMjpzaG9ydDppdTpNQUNTYQorIm1hY3M8QUE+IHI8UkE+LCByPFJCPiwgcjxSQz4iCisJZG9fbWFjcyhfU0QsIEFhLCBSYSwgUmIsIFJjKTsJCitfSUFMVTIsMTAxMDEsMSwxLkFBLDYuUkEsNi5SQixfSU1NNjpJQUxVMjpzaG9ydDppdTpNQUNTYSBpbW0KKyJtYWNzPEFBPiByPFJBPiwgcjxSQj4sIDxpbW0+IgorCWRvX21hY3MoX1NELCBBYSwgUmEsIFJiLCBpbW0pOworCisKKworLy8gTU9EREVDIHwgTU9ESU5DCisKK19JTUVNLDAwMTExLDExLDYuKiosNi5SQixfSU1NNjpJTUVNOnNob3J0Om11Ok1PRERFQworIm1vZGRlYyByPFJCPiwgPGltbT4iCisJZG9faW5jcihfU0QsIDMvKjBiMTEqLywgJkdQUltSQl0sIGltbV81KTsJCitfSU1FTSwwMDExMSwwMSw2LioqLDYuUkIsX0lNTTY6SU1FTTpzaG9ydDptdTpNT0RJTkMKKyJtb2RpbmMgcjxSQj4sIDxpbW0+IgorCWRvX2luY3IoX1NELCAxLyowYjAxKi8sICZHUFJbUkJdLCBpbW1fNSk7CQorCisKKworLy8gTVNVQmEKKwordm9pZDo6ZnVuY3Rpb246OmRvX21zdWI6dW5zaWduZWQ2NCAqYWEsIHVuc2lnbmVkMzIgKnJhLCBzaWduZWQzMiByYiwgc2lnbmVkMzIgc3JjCisJdW5zaWduZWQ2NCBhY2N1bSA9ICphYTsKKwlhY2N1bSAtPSAoc2lnbmVkNjQpIChyYikgKiAoc2lnbmVkNjQpIChzcmMpOworCVdSSVRFNjRfUVVFVUUgKGFhLCBhY2N1bSk7CisJV1JJVEUzMl9RVUVVRSAocmEsIEVYVFJBQ1RFRDY0KGFjY3VtLCAzMiwgNjMpKTsKKworX0lBTFUyLDEwMTEwLDAsMS5BQSw2LlJBLDYuUkIsNi5SQzpJQUxVMjpzaG9ydDppdTpNU1VCYQorIm1zdWI8QUE+IHI8UkE+LCByPFJCPiwgcjxSQz4iCisJZG9fbXN1YihfU0QsIEFhLCBSYSwgUmIsIFJjKTsJCitfSUFMVTIsMTAxMTAsMSwxLkFBLDYuUkEsNi5SQixfSU1NNjpJQUxVMjpzaG9ydDppdTpNU1VCYSBpbW0KKyJtc3ViPEFBPiByPFJBPiwgcjxSQj4sIDxpbW0+IgorCWRvX21zdWIoX1NELCBBYSwgUmEsIFJiLCBpbW0pOworCisKKworLy8gTVNVQlNhCisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19tc3Viczp1bnNpZ25lZDY0ICphYSwgdW5zaWduZWQzMiAqcmEsIHNpZ25lZDMyIHJiLCBzaWduZWQzMiBzcmMKKwl1bnNpZ25lZDY0IGFjY3VtID0gKmFhOworCWFjY3VtIC09ICgoc2lnbmVkNjQpIChyYikgKiAoc2lnbmVkNjQpIChzcmMpKSA8PCAxOworCVdSSVRFNjRfUVVFVUUgKGFhLCBhY2N1bSk7CisJV1JJVEUzMl9RVUVVRSAocmEsIEVYVFJBQ1RFRDY0KGFjY3VtLCAwLCAzMSkpOworCitfSUFMVTIsMTAxMTEsMCwxLkFBLDYuUkEsNi5SQiw2LlJDOklBTFUyOnNob3J0Oml1Ok1TVUJTYQorIm1zdWJzPEFBPiByPFJBPiwgcjxSQj4sIHI8UkM+IgorCWRvX21zdWJzKF9TRCwgQWEsIFJhLCBSYiwgUmMpOwkKK19JQUxVMiwxMDExMSwxLDEuQUEsNi5SQSw2LlJCLF9JTU02OklBTFUyOnNob3J0Oml1Ok1TVUJTYSBpbW0KKyJtc3ViczxBQT4gcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19tc3VicyhfU0QsIEFhLCBSYSwgUmIsIGltbSk7CisKKworCisvLyBNVUwKKwordm9pZDo6ZnVuY3Rpb246OmRvX211bDp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKKwlXUklURTMyX1FVRVVFIChyYSwgcmIgKiBzcmMpOworCitfSUFMVTIsMTAwMDAsMDAsNi5SQSw2LlJCLDYuUkM6SUFMVTI6c2hvcnQ6aXU6TVVMCisibXVsIHI8UkE+LCByPFJCPiwgcjxSQz4iCisJZG9fbXVsKF9TRCwgUmEsIFJiLCBSYyk7CQorX0lBTFUyLDEwMDAwLDEwLDYuUkEsNi5SQixfSU1NNjpJQUxVMjpzaG9ydDppdTpNVUwgaW1tCisibXVsIHI8UkE+LCByPFJCPiwgPGltbT4iCisJZG9fbXVsKF9TRCwgUmEsIFJiLCBpbW0pOworCisKKworLy8gTVVMMkgKKwordm9pZDo6ZnVuY3Rpb246OmRvX211bDJoOnVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIHNyYworCXVuc2lnbmVkMTYgaGlnaCA9IFZIMl80KHJiKSAqIFZIMl80KHNyYyk7CisJdW5zaWduZWQxNiBsb3cgID0gVkwyXzQocmIpICogVkwyXzQoc3JjKTsKKwlXUklURTMyX1FVRVVFIChyYSwgKGhpZ2ggPDwgMTYpIHwgbG93KTsKKworX0lBTFUyLDAwMDAwLDAwLDYuUkEsNi5SQiw2LlJDOklBTFUyOnNob3J0Oml1Ok1VTDJICisibXVsMmggcjxSQT4sIHI8UkI+LCByPFJDPiIKKwlkb19tdWwyaChfU0QsIFJhLCBSYiwgUmMpOwkKK19JQUxVMiwwMDAwMCwxMCw2LlJBLDYuUkIsX0lNTTY6SUFMVTI6c2hvcnQ6aXU6TVVMMkggaW1tCisibXVsMmggcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19tdWwyaChfU0QsIFJhLCBSYiwgaW1tSEwpOworCisKKworLy8gTVVMWAorCit2b2lkOjpmdW5jdGlvbjo6ZG9fbXVseDp1bnNpZ25lZDY0ICphYSwgc2lnbmVkMzIgcmIsIHNpZ25lZDMyIHNyYworCVdSSVRFNjRfUVVFVUUgKGFhLCAoc2lnbmVkNjQpIChyYikgKiAoc2lnbmVkNjQpIChzcmMpKTsKKworX0lBTFUyLDExMDAwLDAwLDUuKiwxLkFBLDYuUkIsNi5SQzpJQUxVMjpzaG9ydDppdTpNVUxYCisibXVseCBhPEFBPiwgcjxSQj4sIHI8UkM+IgorCWRvX211bHgoX1NELCBBYSwgUmIsIFJjKTsJCitfSUFMVTIsMTEwMDAsMTAsNS4qLDEuQUEsNi5SQixfSU1NNjpJQUxVMjpzaG9ydDppdTpNVUxYIGltbQorIm11bHggYTxBQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19tdWx4KF9TRCwgQWEsIFJiLCBpbW0pOworCisKKy8vIE1VTFgySAorCit2b2lkOjpmdW5jdGlvbjo6ZG9fbXVseDJoOmludCByYSwgc2lnbmVkMzIgcmIsIHNpZ25lZDMyIHNyYywgaW50IGhpZ2gKKwlzaWduZWQzMiByZXN1bHQgPSByYiAqIHNyYzsKKwlpZiAoIWhpZ2gpCisJICB7CisJICAgIHJhID0gbWFrZV9ldmVuX3JlZyhfU0QsIHJhLCAiTVVMWDJIIik7CisJICAgIGlmIChyYSAhPSAwKQorCSAgICAgIFdSSVRFMzJfUVVFVUUgKCZHUFJbcmErMV0sIHJlc3VsdCk7CisJICB9CisJZWxzZSBpZiAocmEgIT0gMCkKKwkgIHsKKwkgICAgICBXUklURTMyX1FVRVVFICgmR1BSW3JhKzBdLCByZXN1bHQpOworCSAgfQorCitfSUFMVTIsMDAwMDEsMDAsNi5SQSw2LlJCLDYuUkM6SUFMVTI6c2hvcnQ6aXU6TVVMWDJICisibXVsMmggcjxSQT4sIHI8UkI+LCByPFJDPiIKKwlkb19tdWx4MmgoX1NELCBSQSwgUmJILCBSY0gsIDEpOworCWRvX211bHgyaChfU0QsIFJBLCBSYkwsIFJjTCwgMCk7CitfSUFMVTIsMDAwMDEsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUyOnNob3J0Oml1Ok1VTFgySCBpbW0KKyJtdWwyaCByPFJBPiwgcjxSQj4sIDxpbW0+IgorCWRvX211bHgyaChfU0QsIFJBLCBSYkgsIGltbSwgMSk7CisJZG9fbXVseDJoKF9TRCwgUkEsIFJiTCwgaW1tLCAwKTsKKworLy8gTVVMSFhwcAorCit2b2lkOjpmdW5jdGlvbjo6ZG9fbXVsaHg6aW50IHBwLCB1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKKwlzaWduZWQzMiB2YWx1ZSA9IDA7CisJc3dpdGNoIChwcCkgeworCWNhc2UgMDogLyogTEwgKi8KKwkgIHZhbHVlID0gU0VYVDMyKFZMMl80KHJiKSwgMTYpICogU0VYVDMyKFZMMl80KHNyYyksIDE2KTsKKwkgIGJyZWFrOworCWNhc2UgMTogLyogTEggKi8KKwkgIHZhbHVlID0gU0VYVDMyKFZMMl80KHJiKSwgMTYpICogU0VYVDMyKFZIMl80KHNyYyksIDE2KTsKKwkgIGJyZWFrOworCWNhc2UgMjogLyogSEwgKi8KKwkgIHZhbHVlID0gU0VYVDMyKFZIMl80KHJiKSwgMTYpICogU0VYVDMyKFZMMl80KHNyYyksIDE2KTsKKwkgIGJyZWFrOworCWNhc2UgMzogLyogSEggKi8KKwkgIHZhbHVlID0gU0VYVDMyKFZIMl80KHJiKSwgMTYpICogU0VYVDMyKFZIMl80KHNyYyksIDE2KTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBzaW1fZW5naW5lX2Fib3J0IChTRCwgQ1BVLCBjaWEsICJkb19tdWxoeCAtIGludGVybmFsIGVycm9yIC0gYmFkIHN3aXRjaCIpOworCX0KKwlXUklURTMyX1FVRVVFIChyYSwgdmFsdWUpOworCitfSUFMVTIsMDAxLHBwLDAwLDYuUkEsNi5SQiw2LlJDOklBTFUyOnNob3J0Oml1Ok1VTEhYcHAKKyJtdWxoeCVzPHBwPiByPFJBPiwgcjxSQj4sIHI8UkM+IgorCWRvX211bGh4KF9TRCwgcHAsIFJhLCBSYiwgUmMpOwkKK19JQUxVMiwwMDEscHAsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUyOnNob3J0Oml1Ok1VTEhYcHAgaW1tCisibXVsaHglczxwcD4gcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19tdWxoeChfU0QsIHBwLCBSYSwgUmIsIGltbUhMKTsKKworCisKKy8vIE1VTFhTCisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19tdWx4czp1bnNpZ25lZDY0ICphYSwgc2lnbmVkMzIgcmIsIHNpZ25lZDMyIHNyYworCVdSSVRFNjRfUVVFVUUgKGFhLCAoKHNpZ25lZDY0KSAocmIpICogKHNpZ25lZDY0KSAoc3JjKSkgPDwgMSk7CisKK19JQUxVMiwxMTAwMSwwMCw1LiosMS5BQSw2LlJCLDYuUkM6SUFMVTI6c2hvcnQ6aXU6TVVMWFMKKyJtdWx4cyBhPEFBPiwgcjxSQj4sIHI8UkM+IgorCWRvX211bHhzKF9TRCwgQWEsIFJiLCBSYyk7CQorX0lBTFUyLDExMDAxLDEwLDUuKiwxLkFBLDYuUkIsX0lNTTY6SUFMVTI6c2hvcnQ6aXU6TVVMWFMgaW1tCisibXVseHMgYTxBQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19tdWx4cyhfU0QsIEFhLCBSYiwgaW1tKTsKKworCisKKy8vIE1WRkFDQworCit2b2lkOjpmdW5jdGlvbjo6ZG9fbXZmYWNjOnVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDY0IGFiLCB1bnNpZ25lZDMyIHNyYworCXdoaWxlIChzcmMgPiA2Mykgc3JjIC09IDY0OworCVdSSVRFMzJfUVVFVUUgKHJhLCAoKHNpZ25lZDY0KWFiKSA+PiBzcmMpOworCitfSUFMVTIsMTExMTEsMDAsNi5SQSw1LiosMS5BQiw2LlJDOklBTFUyOnNob3J0Oml1Ok1WRkFDQworIm12ZmFjYyByPFJBPiwgYTxBQj4sIHI8UkM+IgorCWRvX212ZmFjYyhfU0QsIFJhLCAqQWIsIFJjKTsJCitfSUFMVTIsMTExMTEsMTAsNi5SQSw1LiosMS5BQixfSU1NNjpJQUxVMjpzaG9ydDppdTpNVkZBQ0MgaW1tCisibXZmYWNjIHI8UkE+LCBhPEFCPiwgPGltbT4iCisJZG9fbXZmYWNjKF9TRCwgUmEsICpBYiwgaW1tXzZ1KTsKKworCisKKy8vIE1WRlNZUworCitfQlJBLDExMTEwLDAwLDYuUkEsNi5DUiw2LklEOkJSQTpzaG9ydDptdTpNVkZTWVMKKyJtdmZzeXMgcjxSQT4sIGNyPENSPiIKKwlzd2l0Y2ggKElEKSB7CisJY2FzZSAwOgorCSAgaWYgKENSID49IE5SX0NPTlRST0xfUkVHSVNURVJTKQorCSAgICBzaW1fZW5naW5lX2Fib3J0IChTRCwgQ1BVLCBjaWEsICJGSVhNRSAtIGlsbGVnYWwgQ1IiKTsKKwkgIGVsc2UKKwkgICAgV1JJVEUzMl9RVUVVRSAoUmEsIChDUFUpLT5yZWdzLmNvbnRyb2xbQ1JdKTsKKwkgIGJyZWFrOworCWNhc2UgMToKKwkgIFdSSVRFMzJfUVVFVUUgKFJhLCBQU1dMKTsKKwkgIGJyZWFrOworCWNhc2UgMjoKKwkgIFdSSVRFMzJfUVVFVUUgKFJhLCBFWFRSQUNURUQzMihQU1dILCAxNiwgMzEpKTsKKwkgIGJyZWFrOworCWNhc2UgMzoKKwkgIFdSSVRFMzJfUVVFVUUgKFJhLCBQU1dfRkxBR19WQUwoQ1IpKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBzaW1fZW5naW5lX2Fib3J0IChTRCwgQ1BVLCBjaWEsICJGSVhNRSAtIGlsbGVnYWwgSUQiKTsKKwl9CisKKworCisvLyBNVlRBQ0MKKworX0lBTFUyLDAxMTExLDAwLDUuKiwxLkFBLDYuUkIsNi5SQzpJQUxVMjpzaG9ydDppdTpNVlRBQ0MKKyJtdnRhY2MgYTxBQT4sIHI8UkI+LCByPFJDPiIKKwlXUklURTY0X1FVRVVFIChBYSwgSU5TRVJURUQ2NChSYlUsIDAsIDMxKSB8IChSY1UpKTsKKworCisKKy8vIE1WVFNZUworCitfQlJBLDAxMTEwLDAwLDYuQ1IsNi5SQiw2LklEOkJSQTpzaG9ydDptdTpNVlRTWVMKKyJtdnRzeXMgY3I8Q1I+LCByPFJCPiIKKwlzd2l0Y2ggKElEKSB7CisJY2FzZSAwOgkJCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkgIGlmIChDUiA+PSBOUl9DT05UUk9MX1JFR0lTVEVSUykKKwkgICAgc2ltX2VuZ2luZV9hYm9ydCAoU0QsIENQVSwgY2lhLCAiRklYTUUgLSBpbGxlZ2FsIENSIik7CisJICBlbHNlCisJICAgIHsKKwkgICAgICB1bnNpZ25lZDMyIHZhbHVlID0gUmI7CisJICAgICAgaWYgKENSID09IHByb2Nlc3Nvcl9zdGF0dXNfd29yZF9jcikKKwkJeworCQkgIHVuc2lnbmVkMzIgZHMgPSBQU1cgJiBCSVQzMiAoUFNXX0RTKTsJLyogcHJlc2VydmUgZHMgKi8KKwkJICB2YWx1ZSA9IGRzIHwgKHZhbHVlICYgUFNXX1ZBTElEKTsKKwkJICBDUFUtPmxlZnRfa2lsbHNfcmlnaHRfcCA9IDE7CisJCX0KKwkgICAgICBlbHNlIGlmIChDUiA9PSBiYWNrdXBfcHJvY2Vzc29yX3N0YXR1c193b3JkX2NyCisJCSAgICAgICB8fCBDUiA9PSBkZWJ1Z19iYWNrdXBfcHJvY2Vzc29yX3N0YXR1c193b3JkX2NyKQorCQl2YWx1ZSAmPSBEUFNXX1ZBTElEOworCSAgICAgIGVsc2UgaWYgKENSID09IGVpdF92ZWN0b3JfYmFzZV9jcikKKwkJdmFsdWUgJj0gRUlUX1ZBTElEOworCSAgICAgIFdSSVRFMzJfUVVFVUUgKCYoQ1BVKS0+cmVncy5jb250cm9sW0NSXSwgdmFsdWUpOworCSAgICB9CisJICBicmVhazsKKwljYXNlIDE6CQkJLyogUFNXTCAqLworCSAgV1JJVEUzMl9RVUVVRV9NQVNLICgmUFNXLCBFWFRSQUNURUQzMihSYiwgMTYsIDMxKSwKKwkJCSAgICAgIFBTV19WQUxJRCAmIDB4MDAwMGZmZmYpOworCSAgQ1BVLT5sZWZ0X2tpbGxzX3JpZ2h0X3AgPSAxOworCSAgYnJlYWs7CisJY2FzZSAyOgkJCS8qIFBTV0ggKi8KKwkgIHsKKwkgICAgdW5zaWduZWQzMiBkcyA9IFBTVyAmIEJJVDMyIChQU1dfRFMpOwkvKiBwcmVzZXJ2ZSBkcyAqLworCSAgICBXUklURTMyX1FVRVVFX01BU0sgKCZQU1csIChFWFRSQUNURUQzMihSYiwgMTYsIDMxKSA8PCAxNikgfCBkcywKKwkJCQkoUFNXX1ZBTElEIHwgZHMpICYgMHhmZmZmMDAwMCk7CisJICAgIENQVS0+bGVmdF9raWxsc19yaWdodF9wID0gMTsKKwkgIH0KKwkgIGJyZWFrOworCWNhc2UgMzoJCQkvKiBGTEFHICovCisJICBQU1dfRkxBR19TRVRfUVVFVUUoQ1IsIFJiICYgMSk7CisJICBDUFUtPmxlZnRfa2lsbHNfcmlnaHRfcCA9IDE7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgc2ltX2VuZ2luZV9hYm9ydCAoU0QsIENQVSwgY2lhLCAiRklYTUUgLSBpbGxlZ2FsIElEIik7CisJfQorCisKKworLy8gTk9QCisKK19CUkEsMDExMTEsMDAsNi4qKiw2LioqLDYuKio6QlJBOnNob3J0Oml1LG11Ok5PUAorIm5vcCIKKwkvKiBOT1AgKi87CisKKworLy8gTk9UCisKK19MT0dJQywxMTAwMSwwMCw2LlJBLDYuUkIsNi4qOkxPR0lDOnNob3J0Oml1LG11Ok5PVAorIm5vdCByPFJBPiwgcjxSQj4iCisJV1JJVEUzMl9RVUVVRSAoUmEsIH5SYik7CisKKworCisvLyBOT1RGRworCitfTE9HSUMsMDEwMDEsMDAsKioqLDMuRkEsKioqLDMuRkIsKioqLDMuRkM6TE9HSUM6c2hvcnQ6aXUsbXU6Tk9URkcKKyJub3RmZyBmPEZBPiwgZjxGQj4iCisJUFNXX0ZMQUdfU0VUX1FVRVVFKEZBLCAhUFNXX0ZMQUdfVkFMKEZCKSk7CisKKworLy8gT1IKKworX0xPR0lDLDExMDEwLDAwLDYuUkEsNi5SQiw2LlJDOkxPR0lDOnNob3J0Oml1LG11Ok9SCisib3IgcjxSQT4sIHI8UkI+LCByPFJDPiIKKwlXUklURTMyX1FVRVVFIChSYSwgUmIgfCBSYyk7CitfTE9HSUMsMTEwMTAsMTAsNi5SQSw2LlJCLF9JTU02OkxPR0lDOnNob3J0Oml1LG11Ok9SIGltbQorIm9yIHI8UkE+LCByPFJCPiwgPGltbT4iCisJV1JJVEUzMl9RVUVVRSAoUmEsIFJiIHwgaW1tKTsKK19MT0dJQywxMTAxMCwxMCw2LlJBLDYuUkIsX0lNTTMyOkxPR0lDOmxvbmc6aXUsbXU6T1IgaW1tIGxvbmcKKyJvciByPFJBPiwgcjxSQj4sIDxpbW0+IgorCVdSSVRFMzJfUVVFVUUgKFJhLCBSYiB8IGltbSk7CisKKworCisvLyBPUkZHCisKK19MT0dJQywwMTAxMCwwMCwqKiosMy5GQSwqKiosMy5GQiwqKiosMy5GQzpMT0dJQzpzaG9ydDppdSxtdTpPUkZHCisib3JmZyBmPEZBPiwgZjxGQj4sIGY8RkM+IgorCVBTV19GTEFHX1NFVF9RVUVVRShGQSwgUFNXX0ZMQUdfVkFMKEZCKSB8IFBTV19GTEFHX1ZBTChGQykpOworX0xPR0lDLDAxMDEwLDEwLCoqKiwzLkZBLCoqKiwzLkZCLF9JTU02OkxPR0lDOnNob3J0Oml1LG11Ok9SRkcgaW1tCisib3JmZyBmPEZBPiwgZjxGQj4sIDxpbW0+IgorCVBTV19GTEFHX1NFVF9RVUVVRShGQSwgUFNXX0ZMQUdfVkFMKEZCKSB8IChpbW1fNiAmIDEpKTsKKworCisKKy8vIFJFSVQKKworX0JSQSwwMTAwMCwwMCw2LioqLDYuKiosNi4qKjpCUkE6c2hvcnQ6bXU6UkVJVAorInJlaXQiCisJV1JJVEUzMl9RVUVVRSAoJlBTVywgYlBTVyk7CisJbmlhID0gYlBDOworCisKKworCisvLyBSRVBFQVQKKwordm9pZDo6ZnVuY3Rpb246OmRvX3JlcGVhdDp1bnNpZ25lZDMyIGNvdW50LCBhZGRyZXNzX3dvcmQgcGNhZGRyCisJaWYgKGNvdW50ID09IDApCisJICBzaW1fZW5naW5lX2Fib3J0IChTRCwgQ1BVLCBjaWEsICJSRVBFQVQgd2l0aCByYT0wIGFuZCBSRVBFQVRJIHdpdGggaW1tID0gMCBpcyBmb3JiaWRkZW4uIik7CisJaWYgKGNvdW50ID4gMSkKKwkgIFBTV19TRVRfUVVFVUUgKFBTV19SUCwgMSk7CisJV1JJVEUzMl9RVUVVRSAoJlJQVF9DLCBjb3VudCAtIDEpOworCVdSSVRFMzJfUVVFVUUgKCZSUFRfUywgY2lhICsgOCk7CisJV1JJVEUzMl9RVUVVRSAoJlJQVF9FLCBjaWEgKyBwY2FkZHIpOworCitfQlJBLDExMDAwLDAwLDYuUkEsNi4qKiw2LlJDOkJSQTpzaG9ydDptdTpSRVBFQVQKKyJyZXBlYXQgcjxSQT4sIHI8UkM+IgorCWRvX3JlcGVhdChfU0QsIHZhbF9SYSwgcGNhZGRyKTsKK19CUkEsMTEwMDAsMTAsNi5SQSxfSU1NMTI6QlJBOnNob3J0Om11OlJFUEVBVCBpbW0KKyJyZXBlYXQgcjxSQT4sIDxwY2FkZHI+IgorCWRvX3JlcGVhdChfU0QsIHZhbF9SYSwgcGNhZGRyKTsKK19CUkEsMTEwMDAsMTAsNi5SQSw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpSRVBFQVQgaW1tIGxvbmcKKyJyZXBlYXQgcjxSQT4sIDxwY2FkZHI+IgorCWRvX3JlcGVhdChfU0QsIHZhbF9SYSwgcGNhZGRyKTsKKworCisKKworLy8gUkVQRUFUSQorCitfQlJBLDExMDEwLDAwLDYuSU1NXzYsNi4qKiw2LlJDOkJSQTpzaG9ydDptdTpSRVBFQVRJCisicmVwZWF0aSA8SU1NXzY+LCByPFJDPiIKKwlkb19yZXBlYXQoX1NELCBJTU1fNiwgcGNhZGRyKTsKK19CUkEsMTEwMTAsMTAsNi5JTU1fNixfSU1NMTI6QlJBOnNob3J0Om11OlJFUEVBVEkgaW1tCisicmVwZWF0aSA8SU1NXzY+LCA8cGNhZGRyPiIKKwlkb19yZXBlYXQoX1NELCBJTU1fNiwgcGNhZGRyKTsKK19CUkEsMTEwMTAsMTAsNi5JTU1fNiw2LioqLF9JTU0zMjpCUkE6bG9uZzptdTpSRVBFQVRJIGltbSBsb25nCisicmVwZWF0aSA8SU1NXzY+LCA8cGNhZGRyPiIKKwlkb19yZXBlYXQoX1NELCBJTU1fNiwgcGNhZGRyKTsKKworCisKKworLy8gUlRECisKK19CUkEsMDEwMTAsMDAsNi4qLDYuKiw2Lio6QlJBOnNob3J0Om11OlJURAorInJ0ZCIKKwlXUklURTMyX1FVRVVFICgmUFNXLCBEUFNXKTsKKwluaWEgPSBEUEM7CisKKworCisKKy8vIFJPVAorCitfTE9HSUMsMTAxMDAsMDAsNi5SQSw2LlJCLDYuUkM6TE9HSUM6c2hvcnQ6aXUsbXU6Uk9UCisicm90IHI8UkE+LCByPFJCPiwgcjxSQz4iCisJV1JJVEUzMl9RVUVVRSAoUmEsIFJPVDMyKFJiLCBSYyAmIDB4MWYpKTsKK19MT0dJQywxMDEwMCwxMCw2LlJBLDYuUkIsX0lNTTY6TE9HSUM6c2hvcnQ6aXUsbXU6Uk9UIGltbQorInJvdCByPFJBPiwgcjxSQj4sIDxpbW0+IgorCVdSSVRFMzJfUVVFVUUgKFJhLCBST1QzMihSYiwgaW1tICYgMHgxZikpOworCisKKworCisvLyBST1QySAorCit2b2lkOjpmdW5jdGlvbjo6ZG9fcm90Mmg6dW5zaWduZWQzMiAqcmEsIHVuc2lnbmVkMzIgcmIsIHNpZ25lZDMyIHNyYworCXVuc2lnbmVkMTYgaGlnaCA9IFJPVFIxNihWSDJfNChyYiksIFZIMl80KHNyYykgJiAweGYpOworCXVuc2lnbmVkMTYgbG93ICA9IFJPVFIxNihWTDJfNChyYiksIFZMMl80KHNyYykgJiAweGYpOworCVdSSVRFMzJfUVVFVUUgKHJhLCAoaGlnaCA8PCAxNikgfCBsb3cpOworCitfTE9HSUMsMTAxMDEsMDAsNi5SQSw2LlJCLDYuUkM6TE9HSUM6c2hvcnQ6aXUsbXU6Uk9UMkgKKyJyb3QyaCByPFJBPiwgcjxSQj4sIHI8UkM+IgorCWRvX3JvdDJoKF9TRCwgUmEsIFJiLCBSYyk7CitfTE9HSUMsMTAxMDEsMTAsNi5SQSw2LlJCLF9JTU02OkxPR0lDOnNob3J0Oml1LG11OlJPVDJIIGltbQorInJvdDJoIHI8UkE+LCByPFJCPiwgPGltbT4iCisJZG9fcm90MmgoX1NELCBSYSwgUmIsIGltbUhMKTsKKworCisKKworLy8gU0FUCisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19zYXQ6c2lnbmVkMzIgKnJhLCBzaWduZWQzMiByYiwgc2lnbmVkMzIgc3JjCisJaW50IGJpdHMgPSBMU01BU0tFRDMyKHNyYywgNCwgMCk7IC8qIDUgKi8KKwlzaWduZWQzMiBzYXQgPSBMU01BU0szMihiaXRzLCAwKSA+PiAyOworCXNpZ25lZDMyIG5zYXQgPSB+c2F0OworCXNpZ25lZDMyIHZhbHVlOworCWlmIChiaXRzICE9IHNyYykKKwkgIHNpbV9pb19lcHJpbnRmIChzZCwgIndhcm5pbmc6IDB4JWx4OlNBVCBiaXQgb3ZlcmZsb3dcbiIsIGNpYSk7CisJaWYgKGJpdHMgPT0gMCkKKwkgIHZhbHVlID0gcmI7CisJZWxzZSBpZiAocmIgPj0gc2F0KQorCSAgdmFsdWUgPSBzYXQ7CisJZWxzZSBpZiAocmIgPD0gbnNhdCkKKwkgIHZhbHVlID0gbnNhdDsKKwllbHNlCisJICB2YWx1ZSA9IHJiOworCVdSSVRFMzJfUVVFVUUgKHJhLCB2YWx1ZSk7CisKK19JQUxVMiwwMTAwMCwwMCw2LlJBLDYuUkIsNi5SQzpJQUxVMjpzaG9ydDppdTpTQVQKKyJzYXQgcjxSQT4sIHI8UkI+LCByPFJDPiIKKwlkb19zYXQoX1NELCBSYSwgUmIsIFJjKTsKK19JQUxVMiwwMTAwMCwxMCw2LlJBLDYuUkIsX0lNTTY6SUFMVTI6c2hvcnQ6aXU6U0FUIGltbQorInNhdCByPFJBPiwgcjxSQj4sIDxpbW0+IgorCWRvX3NhdChfU0QsIFJhLCBSYiwgaW1tXzUpOworCisKKworCisvLyBTQVQySAorCit2b2lkOjpmdW5jdGlvbjo6ZG9fc2F0aDpzaWduZWQzMiAqcmEsIHNpZ25lZDMyIHJiLCBzaWduZWQzMiBzcmMsIGludCBoaWdoLCBpbnQgdXBkYXRlc19mNAorCWludCBiaXRzID0gTFNNQVNLRUQzMihzcmMsIDQsIDApOyAvKiA1ICovCisJc2lnbmVkMzIgc2F0ID0gTFNNQVNLMzIoYml0cywgMCkgPj4gMjsKKwlzaWduZWQzMiBuc2F0ID0gfnNhdDsKKwlzaWduZWQzMiB2YWx1ZTsKKwlpZiAoYml0cyAhPSBzcmMpCisJICBzaW1faW9fZXByaW50ZiAoc2QsICJ3YXJuaW5nOiAweCVseDpTQVQgYml0IG92ZXJmbG93XG4iLCBjaWEpOworCWlmIChiaXRzID09IDApCisJICB2YWx1ZSA9IHJiOworCWVsc2UgaWYgKHJiID49IHNhdCkKKwkgIHZhbHVlID0gc2F0OworCWVsc2UgaWYgKHJiIDw9IG5zYXQpCisJICB2YWx1ZSA9IG5zYXQ7CisJZWxzZQorCSAgdmFsdWUgPSByYjsKKwlpZiAoaGlnaCkKKwkgIFdSSVRFMzJfUVVFVUVfTUFTSyAocmEsIHZhbHVlIDw8IDE2LCAweGZmZmYwMDAwKTsKKwllbHNlCisJICBXUklURTMyX1FVRVVFX01BU0sgKHJhLCB2YWx1ZSwgMHgwMDAwZmZmZik7CisJaWYgKHVwZGF0ZXNfZjQpCisJICB7CisJICAgIC8qIGlmIE1VIGluc3RydWN0aW9uIHdhcyBhIE1WVFNZUyAobGtyKSwgdW5xdWV1ZSByZWdpc3RlciB3cml0ZXMgbm93ICovCisJICAgIGlmKFNUQVRFX0NQVSAoc2QsIDApLT5sZWZ0X2tpbGxzX3JpZ2h0X3ApCisJICAgICAgdW5xdWV1ZV93cml0ZXMgKHNkLCBTVEFURV9DUFUgKHNkLCAwKSwgY2lhKTsKKwkgICAgUFNXX0ZMQUdfU0VUX1FVRVVFKFBTV19TX0ZMQUcsIFBTV19GTEFHX1ZBTChQU1dfU19GTEFHKSBeICh2YWx1ZSAmIDEpKTsKKwkgIH0KKworX0lBTFUyLDAxMDAxLDAwLDYuUkEsNi5SQiw2LlJDOklBTFUyOnNob3J0Oml1OlNBVDJICisic2F0MmggcjxSQT4sIHI8UkI+LCByPFJDPiIKKwlkb19zYXRoKF9TRCwgUmEsIFJiSCwgUmNILCAxLCAwKTsKKwlkb19zYXRoKF9TRCwgUmEsIFJiTCwgUmNMLCAwLCAwKTsKK19JQUxVMiwwMTAwMSwxMCw2LlJBLDYuUkIsX0lNTTY6SUFMVTI6c2hvcnQ6aXU6U0FUMkggaW1tCisic2F0MmggcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19zYXRoKF9TRCwgUmEsIFJiSCwgaW1tXzUsIDEsIDApOworCWRvX3NhdGgoX1NELCBSYSwgUmJMLCBpbW1fNSwgMCwgMCk7CisKKworCisKKy8vIFNBVEhwCisKKzo6JXM6OnA6aW50IHAKKwlzd2l0Y2ggKHApCisJICB7CisJICBjYXNlIDA6IHJldHVybiAibCI7CisJICBjYXNlIDE6IHJldHVybiAiaCI7CisJICBkZWZhdWx0OiByZXR1cm4gIj8iOworCSAgfQorCitfSUFMVTIsMTExMCxwLDAwLDYuUkEsNi5SQiw2LlJDOklBTFUyOnNob3J0Oml1OlNBVEhQCisic2F0aCVzPHA+IHI8UkE+LCByPFJCPiwgcjxSQz4iCisJZG9fc2F0aChfU0QsIFJhLCBSYiwgUmMsIHAsIDEpOworX0lBTFUyLDExMTAscCwxMCw2LlJBLDYuUkIsX0lNTTY6SUFMVTI6c2hvcnQ6aXU6U0FUSFAgaW1tCisic2F0aCVzPHA+IHI8UkE+LCByPFJCPiwgPGltbT4iCisJZG9fc2F0aChfU0QsIFJhLCBSYiwgaW1tXzUsIHAsIDEpOworCisKKworLy8gU0FUWgorCit2b2lkOjpmdW5jdGlvbjo6ZG9fc2F0ejpzaWduZWQzMiAqcmEsIHNpZ25lZDMyIHJiLCBzaWduZWQzMiBzcmMKKwlpZiAocmIgPCAwKQorCSAgV1JJVEUzMl9RVUVVRSAocmEsIDApOworCWVsc2UKKwkgIGRvX3NhdCAoX1NELCByYSwgcmIsIHNyYyk7CisKK19JQUxVMiwwMTAxMCwwMCw2LlJBLDYuUkIsNi5SQzpJQUxVMjpzaG9ydDppdTpTQVRaCisic2F0eiByPFJBPiwgcjxSQj4sIHI8UkM+IgorCWRvX3NhdHooX1NELCBSYSwgUmIsIFJjKTsKK19JQUxVMiwwMTAxMCwxMCw2LlJBLDYuUkIsX0lNTTY6SUFMVTI6c2hvcnQ6aXU6U0FUWiBpbW0KKyJzYXR6IHI8UkE+LCByPFJCPiwgPGltbT4iCisJZG9fc2F0eihfU0QsIFJhLCBSYiwgaW1tXzUpOworCisKKworCisvLyBTQVRaMkgKKwordm9pZDo6ZnVuY3Rpb246OmRvX3NhdHpoOnNpZ25lZDMyICpyYSwgc2lnbmVkMTYgcmIsIHNpZ25lZDMyIHNyYywgaW50IGhpZ2gKKwlpbnQgYml0cyA9IExTTUFTS0VEMzIoc3JjLCAzLCAwKTsgLyo0Ki8KKwlzaWduZWQxNiBzYXQgPSBMU01BU0sxNihiaXRzLCAwKSA+PiAyOworCXNpZ25lZDE2IG5zYXQgPSAwOworCXNpZ25lZDE2IHZhbHVlOworCWlmIChiaXRzICE9IHNyYykKKwkgIHNpbV9pb19lcHJpbnRmIChzZCwgIndhcm5pbmc6IDB4JWx4OlNBVFoySCBiaXQgb3ZlcmZsb3dcbiIsIGNpYSk7CisJaWYgKGJpdHMgPT0gMCAmJiByYiA+IHNhdCkKKwkgIHZhbHVlID0gcmI7CisJZWxzZSBpZiAocmIgPiBzYXQpCisJICB2YWx1ZSA9IHNhdDsKKwllbHNlIGlmIChyYiA8IG5zYXQpCisJICB2YWx1ZSA9IG5zYXQ7CisJZWxzZQorCSAgdmFsdWUgPSByYjsKKwlpZiAoaGlnaCkKKwkgIFdSSVRFMzJfUVVFVUVfTUFTSyAocmEsIHZhbHVlIDw8IDE2LCAweGZmZmYwMDAwKTsKKwllbHNlCisJICBXUklURTMyX1FVRVVFX01BU0sgKHJhLCB2YWx1ZSwgMHgwMDAwZmZmZik7CisKKworX0lBTFUyLDAxMDExLDAwLDYuUkEsNi5SQiw2LlJDOklBTFUyOnNob3J0Oml1OlNBVFoySAorInNhdHoyaCByPFJBPiwgcjxSQj4sIHI8UkM+IgorCWRvX3NhdHpoKF9TRCwgUmEsIFJiSCwgUmNILCAxKTsKKwlkb19zYXR6aChfU0QsIFJhLCBSYkwsIFJjTCwgMCk7CitfSUFMVTIsMDEwMTEsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUyOnNob3J0Oml1OlNBVFoySCBpbW0KKyJzYXR6MmggcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19zYXR6aChfU0QsIFJhLCBSYkgsIGltbSwgMSk7CisJZG9fc2F0emgoX1NELCBSYSwgUmJMLCBpbW0sIDApOworCisKKworCisvLyBTUkEKKwordm9pZDo6ZnVuY3Rpb246OmRvX3NyYTp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgc2lnbmVkMzIgc3JjCisJdW5zaWduZWQzMiB2YWx1ZTsKKwl3aGlsZSAoc3JjID4gMzEpIHNyYyAtPSAzMjsKKwl3aGlsZSAoc3JjIDwgLTMyKSBzcmMgKz0gMzI7CisJaWYgKHNyYyA+PSAwKQorCSAgdmFsdWUgPSAoc2lnbmVkMzIpcmIgPj4gc3JjOworCWVsc2UgaWYgKHNyYyA9PSAtMzIpCisJICB2YWx1ZSA9IDA7CisJZWxzZQorCSAgdmFsdWUgPSByYiA8PCAtc3JjOworCVdSSVRFMzJfUVVFVUUgKHJhLCB2YWx1ZSk7CisKK19MT0dJQywxMDAwMCwwMCw2LlJBLDYuUkIsNi5SQzpMT0dJQzpzaG9ydDppdSxtdTpTUkEKKyJzcmEgcjxSQT4sIHI8UkI+LCByPFJDPiIKKwlkb19zcmEoX1NELCBSYSwgUmIsIFJjKTsKK19MT0dJQywxMDAwMCwxMCw2LlJBLDYuUkIsX0lNTTY6TE9HSUM6c2hvcnQ6aXUsbXU6U1JBIGltbQorInNyYSByPFJBPiwgcjxSQj4sIDxpbW0+IgorCWRvX3NyYShfU0QsIFJhLCBSYiwgaW1tKTsKKworCisKKworLy8gU1JBSHAKKwordm9pZDo6ZnVuY3Rpb246OmRvX3NyYWg6dW5zaWduZWQzMiAqcmEsIHVuc2lnbmVkMzIgcmIsIGludCBzcmMsIGludCBoaWdoCisJdW5zaWduZWQzMiB2YWx1ZTsKKwl3aGlsZSAoc3JjID4gMzEpIHNyYyAtPSAzMjsKKwl3aGlsZSAoc3JjIDwgLTMyKSBzcmMgKz0gMzI7CisJaWYgKHNyYyA+PSAwKQorCSAgdmFsdWUgPSAoc2lnbmVkMzIpcmIgPj4gc3JjOworCWVsc2UgaWYgKHNyYyA9PSAtMzIpCisJICB2YWx1ZSA9IDA7CisJZWxzZQorCSAgdmFsdWUgPSByYiA8PCAtc3JjOworCWlmIChoaWdoKQorCSAgV1JJVEUzMl9RVUVVRV9NQVNLIChyYSwgdmFsdWUgPDwgMTYsIDB4ZmZmZjAwMDApOworCWVsc2UKKwkgIFdSSVRFMzJfUVVFVUVfTUFTSyAocmEsIHZhbHVlLCAweDAwMDBmZmZmKTsKKworX0xPR0lDLDAwMTAscCwwMCw2LlJBLDYuUkIsNi5SQzpMT0dJQzpzaG9ydDppdSxtdTpTUkFIUAorInNyYWglczxwPiByPFJBPiwgcjxSQj4sIHI8UkM+IgorCWRvX3NyYWgoX1NELCBSYSwgUmIsIFJjLCBwKTsKK19MT0dJQywwMDEwLHAsMTAsNi5SQSw2LlJCLF9JTU02OkxPR0lDOnNob3J0Oml1LG11OlNSQUhQIGltbQorInNyYWglczxwPiByPFJBPiwgcjxSQj4sIDxpbW0+IgorCWRvX3NyYWgoX1NELCBSYSwgUmIsIGltbSwgcCk7CisKKworCisKKy8vIFNSQTJICisKK19MT0dJQywxMDAwMSwwMCw2LlJBLDYuUkIsNi5SQzpMT0dJQzpzaG9ydDppdSxtdTpTUkEySAorInNyYTJoIHI8UkE+LCByPFJCPiwgcjxSQz4iCisJc2lnbmVkMzIgc3JjSCA9IFJjSDsKKwlzaWduZWQzMiBzcmNMID0gUmNMOworCXdoaWxlIChzcmNIID4gMTUpIHNyY0ggLT0gMTY7CisJd2hpbGUgKHNyY0ggPCAtMTYpIHNyY0ggKz0gMTY7CisJd2hpbGUgKHNyY0wgPiAxNSkgc3JjTCAtPSAxNjsKKwl3aGlsZSAoc3JjTCA8IC0xNikgc3JjTCArPSAxNjsKKwlkb19zcmFoKF9TRCwgUmEsIFJiSCwgc3JjSCwgMSk7CisJZG9fc3JhaChfU0QsIFJhLCBSYkwsIHNyY0wsIDApOworX0xPR0lDLDEwMDAxLDEwLDYuUkEsNi5SQixfSU1NNjpMT0dJQzpzaG9ydDppdSxtdTpTUkEySCBpbW0KKyJzcmEyaCByPFJBPiwgcjxSQj4sIDxpbW0+IgorCXNpZ25lZDMyIHNyYyA9IGltbTsKKwl3aGlsZSAoc3JjID4gMTUpIHNyYyAtPSAxNjsKKwl3aGlsZSAoc3JjIDwgLTE2KSBzcmMgKz0gMTY7CisJZG9fc3JhaChfU0QsIFJhLCBSYkgsIHNyYywgMSk7CisJZG9fc3JhaChfU0QsIFJhLCBSYkwsIHNyYywgMCk7CisKKworCisKKy8vIFNSQworCit2b2lkOjpmdW5jdGlvbjo6ZG9fc3JjOnVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDMyIHJiLCBpbnQgc3JjCisJdW5zaWduZWQzMiB2YWx1ZTsKKwl1bnNpZ25lZDY0IG9wZXJhbmQ7CisJdW5zaWduZWQ2NCBzaGlmdGVkOworCXdoaWxlIChzcmMgPiAzMSkgc3JjIC09IDMyOworCXdoaWxlIChzcmMgPCAtMzIpIHNyYyArPSAzMjsKKwlpZiAoc3JjID49IDApCisJICB7CisJICAgIG9wZXJhbmQgPSAoSU5TRVJURUQ2NChyYiwgMCwgMzEpIHwgSU5TRVJURUQ2NCgqcmEsIDMyLCA2MykpOworCSAgICBzaGlmdGVkID0gb3BlcmFuZCA+PiBzcmM7CisJICAgIHZhbHVlID0gRVhUUkFDVEVENjQoc2hpZnRlZCwgMzIsIDYzKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIG9wZXJhbmQgPSAoSU5TRVJURUQ2NCgqcmEsIDAsIDMxKSB8IElOU0VSVEVENjQocmIsIDMyLCA2MykpOworCSAgICBzaGlmdGVkID0gb3BlcmFuZCA8PCAtc3JjOworCSAgICB2YWx1ZSA9IEVYVFJBQ1RFRDY0KHNoaWZ0ZWQsIDAsIDMxKTsKKwkgIH0KKwlXUklURTMyX1FVRVVFIChyYSwgdmFsdWUpOworCitfTE9HSUMsMTAxMTAsMDAsNi5SQSw2LlJCLDYuUkM6TE9HSUM6c2hvcnQ6aXUsbXU6U1JDCisic3JjIHI8UkE+LCByPFJCPiwgcjxSQz4iCisJZG9fc3JjKF9TRCwgUmEsIFJiLCBSYyk7CitfTE9HSUMsMTAxMTAsMTAsNi5SQSw2LlJCLF9JTU02OkxPR0lDOnNob3J0Oml1LG11OlNSQyBpbW0KKyJzcmMgcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19zcmMoX1NELCBSYSwgUmIsIGltbSk7CisKKworCisKKy8vIFNSTAorCit2b2lkOjpmdW5jdGlvbjo6ZG9fc3JsOnVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDMyIHJiLCBpbnQgc3JjCisJdW5zaWduZWQzMiB2YWx1ZTsKKwl3aGlsZSAoc3JjID4gMzEpIHNyYyAtPSAzMjsKKwl3aGlsZSAoc3JjIDwgLTMyKSBzcmMgKz0gMzI7CisJaWYgKHNyYyA+PSAwKQorCSAgdmFsdWUgPSAodW5zaWduZWQzMilyYiA+PiBzcmM7CisJZWxzZSBpZiAoc3JjID09IC0zMikKKwkgIHZhbHVlID0gMDsKKwllbHNlCisJICB2YWx1ZSA9ICh1bnNpZ25lZDMyKXJiIDw8IC1zcmM7CisJV1JJVEUzMl9RVUVVRSAocmEsIHZhbHVlKTsKKworX0xPR0lDLDEwMDEwLDAwLDYuUkEsNi5SQiw2LlJDOkxPR0lDOnNob3J0Oml1LG11OlNSTAorInNybCByPFJBPiwgcjxSQj4sIHI8UkM+IgorCWRvX3NybChfU0QsIFJhLCBSYiwgUmMpOworX0xPR0lDLDEwMDEwLDEwLDYuUkEsNi5SQixfSU1NNjpMT0dJQzpzaG9ydDppdSxtdTpTUkwgaW1tCisic3JsIHI8UkE+LCByPFJCPiwgPGltbT4iCisJZG9fc3JsKF9TRCwgUmEsIFJiLCBpbW0pOworCisKKworCisvLyBTUkxIcAorCit2b2lkOjpmdW5jdGlvbjo6ZG9fc3JsaDp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgaW50IHNyYywgaW50IGhpZ2gKKwl1bnNpZ25lZDMyIHZhbHVlOworCXdoaWxlIChzcmMgPiAzMSkgc3JjIC09IDMyOworCXdoaWxlIChzcmMgPCAtMzIpIHNyYyArPSAzMjsKKwlpZiAoc3JjID49IDApCisJICB2YWx1ZSA9IHJiID4+IHNyYzsKKwllbHNlIGlmIChzcmMgPT0gLTMyKQorCSAgdmFsdWUgPSAwOworCWVsc2UKKwkgIHZhbHVlID0gcmIgPDwgLXNyYzsKKwlpZiAoaGlnaCkKKwkgIFdSSVRFMzJfUVVFVUVfTUFTSyAocmEsIHZhbHVlIDw8IDE2LCAweGZmZmYwMDAwKTsKKwllbHNlCisJICBXUklURTMyX1FVRVVFX01BU0sgKHJhLCB2YWx1ZSwgMHgwMDAwZmZmZik7CisKK19MT0dJQywwMDExLHAsMDAsNi5SQSw2LlJCLDYuUkM6TE9HSUM6c2hvcnQ6aXUsbXU6U1JMSFAKKyJzcmxoJXM8cD4gcjxSQT4sIHI8UkI+LCByPFJDPiIKKwlkb19zcmxoKF9TRCwgUmEsIFJiLCBSYywgcCk7CitfTE9HSUMsMDAxMSxwLDEwLDYuUkEsNi5SQixfSU1NNjpMT0dJQzpzaG9ydDppdSxtdTpTUkxIUCBpbW0KKyJzcmxoJXM8cD4gcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19zcmxoKF9TRCwgUmEsIFJiLCBpbW0sIHApOworCisKKy8vIFNSTDJICisKK19MT0dJQywxMDAxMSwwMCw2LlJBLDYuUkIsNi5SQzpMT0dJQzpzaG9ydDppdSxtdTpTUkwySAorInNybDJoIHI8UkE+LCByPFJCPiwgcjxSQz4iCisJc2lnbmVkMzIgc3JjSCA9IFJjSDsKKwlzaWduZWQzMiBzcmNMID0gUmNMOworCXdoaWxlIChzcmNIID4gMTUpIHNyY0ggLT0gMTY7CisJd2hpbGUgKHNyY0ggPCAtMTYpIHNyY0ggKz0gMTY7CisJd2hpbGUgKHNyY0wgPiAxNSkgc3JjTCAtPSAxNjsKKwl3aGlsZSAoc3JjTCA8IC0xNikgc3JjTCArPSAxNjsKKwlkb19zcmxoKF9TRCwgUmEsIFJiSFUsIHNyY0gsIDEpOworCWRvX3NybGgoX1NELCBSYSwgUmJMVSwgc3JjTCwgMCk7CitfTE9HSUMsMTAwMTEsMTAsNi5SQSw2LlJCLF9JTU02OkxPR0lDOnNob3J0Oml1LG11OlNSTDJIIGltbQorInNybDJoIHI8UkE+LCByPFJCPiwgPGltbT4iCisJc2lnbmVkMzIgc3JjID0gaW1tOworCXdoaWxlIChzcmMgPiAxNSkgc3JjIC09IDE2OworCXdoaWxlIChzcmMgPCAtMTYpIHNyYyArPSAxNjsKKwlkb19zcmxoKF9TRCwgUmEsIFJiSFUsIHNyYywgMSk7CisJZG9fc3JsaChfU0QsIFJhLCBSYkxVLCBzcmMsIDApOworCisKKworCisvLyBTVDJICisKK3ZvaWQ6OmZ1bmN0aW9uOjpnZXRfZXZlbl9yZWc6aW50ICpyZWcsIHVuc2lnbmVkMzIgKnIwLCBjb25zdCBjaGFyICpuYW1lCisJaWYgKCpyZWcgJiAxKQorCSAgc2ltX2VuZ2luZV9hYm9ydCAoU0QsIENQVSwgY2lhLAorCQkJICAgICIweCVseDolcyBvZGQgcmVnaXN0ZXIgKHIlZCkgdXNlZCBpbiBtdWx0aS13b3JkIHN0b3JlIiwKKwkJCSAgICAobG9uZykgY2lhLCBuYW1lLCAqcmVnKTsKKwlpZiAoKnJlZyA9PSAwKQorCSAgKnIwID0gMDsKKwllbHNlCisJICAqcjAgPSBHUFJbKnJlZ107CisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19zdDJoOmludCByYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKKwl1bnNpZ25lZDMyIHZhbF9yYTsKKwl1bnNpZ25lZDMyIG1lbTsKKwlnZXRfZXZlbl9yZWcoX1NELCAmcmEsICZ2YWxfcmEsICJTVDJIIik7CisJbWVtID0gSU5TRVJURUQzMih2YWxfcmEsIDAsIDE1KSB8CisJICAgICAgSU5TRVJURUQzMihHUFJbcmEgKyAxXSwgMTYsIDMxKTsKKwlTVE9SRShyYiArIHNyYywgNCwgbWVtKTsKKworX0lNRU0sMTAwMTEsWFgsNi5SQSw2LlJCLDYuU1JDXzY6SU1FTTpzaG9ydDptdTpTVDJICisic3QyaCByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKKyJzdDJoIHI8UkE+LCBAKHI8UkI+JXM8WFg+LCByPFNSQ182PikiCisJZG9fc3QyaChfU0QsIFJBLCBSYiwgc3JjKTsKKwlkb19pbmNyKF9TRCwgWFgsICZHUFJbUkJdLCA0KTsKK19JTUVNLDEwMDExLDEwLDYuUkEsNi5SQixfSU1NMzI6SU1FTTpsb25nOm11OlNUMkggbG9uZworInN0MmggcjxSQT4sIEAocjxSQj4sIDxpbW0+KSIKKwlkb19zdDJoKF9TRCwgUkEsIFJiLCBpbW0pOworCisKKworLy8gU1QyVworCit2b2lkOjpmdW5jdGlvbjo6ZG9fc3QydzppbnQgcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgc3JjCisJdW5zaWduZWQzMiB2YWxfcmE7CisJdW5zaWduZWQ2NCBtZW07CisJZ2V0X2V2ZW5fcmVnKF9TRCwgJnJhLCAmdmFsX3JhLCAiU1QyVyIpOworCW1lbSA9IElOU0VSVEVENjQodmFsX3JhLCAwLCAzMSkgfCBJTlNFUlRFRDY0KEdQUltyYSArIDFdLCAzMiwgNjMpOworCVNUT1JFKHJiICsgc3JjLCA4LCBtZW0pOworCitfSU1FTSwxMDExMCxYWCw2LlJBLDYuUkIsNi5TUkNfNjpJTUVNOnNob3J0Om11OlNUMlcKKyJzdDJ3IHI8UkE+LCBAKHI8UkI+LCA8U1JDXzY+KSI6WFggPT0gMAorInN0MncgcjxSQT4sIEAocjxSQj4lczxYWD4sIHI8U1JDXzY+KSIKKwlkb19zdDJ3KF9TRCwgUkEsIFJiLCBzcmMpOworCWRvX2luY3IoX1NELCBYWCwgJkdQUltSQl0sIDgpOworX0lNRU0sMTAxMTAsMTAsNi5SQSw2LlJCLF9JTU0zMjpJTUVNOmxvbmc6bXU6U1QyVyBsb25nCisic3QydyByPFJBPiwgQChyPFJCPiwgPGltbT4pIgorCWRvX3N0MncoX1NELCBSQSwgUmIsIGltbSk7CisKKworCisvLyBTVDRIQgorCit2b2lkOjpmdW5jdGlvbjo6ZG9fc3Q0aGI6aW50IHJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIHNyYworCXVuc2lnbmVkMzIgdmFsX3JhOworCXVuc2lnbmVkMzIgbWVtOworCWdldF9ldmVuX3JlZyhfU0QsICZyYSwgJnZhbF9yYSwgIlNUNEhCIik7CisJbWVtID0gSU5TRVJURUQzMihFWFRSQUNURUQzMih2YWxfcmEsIDgsIDE1KSwgMCwgNykgfAorCSAgICAgIElOU0VSVEVEMzIoRVhUUkFDVEVEMzIodmFsX3JhLCAyNCwgMzEpLCA4LCAxNSkgfAorCSAgICAgIElOU0VSVEVEMzIoRVhUUkFDVEVEMzIoR1BSW3JhICsgMV0sIDgsIDE1KSwgMTYsIDIzKSB8CisJICAgICAgSU5TRVJURUQzMihFWFRSQUNURUQzMihHUFJbcmEgKyAxXSwgMjQsIDMxKSwgMjQsIDMxKTsKKwlTVE9SRShyYiArIHNyYywgNCwgbWVtKTsKKworX0lNRU0sMTAxMDEsWFgsNi5SQSw2LlJCLDYuU1JDXzY6SU1FTTpzaG9ydDptdTpTVDRIQgorInN0NGhiIHI8UkE+LCBAKHI8UkI+LCA8U1JDXzY+KSI6WFggPT0gMAorInN0NGhiIHI8UkE+LCBAKHI8UkI+JXM8WFg+LCByPFNSQ182PikiCisJZG9fc3Q0aGIoX1NELCBSQSwgUmIsIHNyYyk7CisJZG9faW5jcihfU0QsIFhYLCAmR1BSW1JCXSwgNCk7CitfSU1FTSwxMDEwMSwxMCw2LlJBLDYuUkIsX0lNTTMyOklNRU06bG9uZzptdTpTVDRIQiBsb25nCisic3Q0aGIgcjxSQT4sIEAocjxSQj4sIDxpbW0+KSIKKwlkb19zdDRoYihfU0QsIFJBLCBSYiwgaW1tKTsKKworCisKKy8vIFNUQgorCit2b2lkOjpmdW5jdGlvbjo6ZG9fc3RiOnVuc2lnbmVkMzIgcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgc3JjCisJU1RPUkUocmIgKyBzcmMsIDEsIEVYVFJBQ1RFRDMyKHJhLCAyNCwgMzEpKTsKKworX0lNRU0sMTAwMDAsWFgsNi5SQSw2LlJCLDYuU1JDXzY6SU1FTTpzaG9ydDptdTpTVEIKKyJzdGIgcjxSQT4sIEAocjxSQj4sIDxTUkNfNj4pIjpYWCA9PSAwCisic3RiIHI8UkE+LCBAKHI8UkI+JXM8WFg+LCByPFNSQ182PikiCisJZG9fc3RiKF9TRCwgdmFsX1JhLCBSYiwgc3JjKTsKKwlkb19pbmNyKF9TRCwgWFgsICZHUFJbUkJdLCAxKTsKK19JTUVNLDEwMDAwLDEwLDYuUkEsNi5SQixfSU1NMzI6SU1FTTpsb25nOm11OlNUQiBsb25nCisic3RiIHI8UkE+LCBAKHI8UkI+LCA8aW1tPikiCisJZG9fc3RiKF9TRCwgdmFsX1JhLCBSYiwgaW1tKTsKKworCisKKy8vIFNUSAorCit2b2lkOjpmdW5jdGlvbjo6ZG9fc3RoOnVuc2lnbmVkMzIgcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgc3JjCisJU1RPUkUocmIgKyBzcmMsIDIsIEVYVFJBQ1RFRDMyKHJhLCAxNiwgMzEpKTsKKworX0lNRU0sMTAwMTAsWFgsNi5SQSw2LlJCLDYuU1JDXzY6SU1FTTpzaG9ydDptdTpTVEgKKyJzdGggcjxSQT4sIEAocjxSQj4sIDxTUkNfNj4pIjpYWCA9PSAwCisic3RoIHI8UkE+LCBAKHI8UkI+JXM8WFg+LCByPFNSQ182PikiCisJZG9fc3RoKF9TRCwgdmFsX1JhLCBSYiwgc3JjKTsKKwlkb19pbmNyKF9TRCwgWFgsICZHUFJbUkJdLCAyKTsKK19JTUVNLDEwMDEwLDEwLDYuUkEsNi5SQixfSU1NMzI6SU1FTTpsb25nOm11OlNUSCBsb25nCisic3RoIHI8UkE+LCBAKHI8UkI+LCA8aW1tPikiCisJZG9fc3RoKF9TRCwgdmFsX1JhLCBSYiwgaW1tKTsKKworCisKKy8vIFNUSEgKKwordm9pZDo6ZnVuY3Rpb246OmRvX3N0aGg6dW5zaWduZWQzMiByYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKKwlTVE9SRShyYiArIHNyYywgMiwgRVhUUkFDVEVEMzIocmEsIDAsIDE1KSk7CisKK19JTUVNLDEwMDAxLFhYLDYuUkEsNi5SQiw2LlNSQ182OklNRU06c2hvcnQ6bXU6U1RISAorInN0aGggcjxSQT4sIEAocjxSQj4sIDxTUkNfNj4pIjpYWCA9PSAwCisic3RoaCByPFJBPiwgQChyPFJCPiVzPFhYPiwgcjxTUkNfNj4pIgorCWRvX3N0aGgoX1NELCB2YWxfUmEsIFJiLCBzcmMpOworCWRvX2luY3IoX1NELCBYWCwgJkdQUltSQl0sIDIpOworX0lNRU0sMTAwMDEsMTAsNi5SQSw2LlJCLF9JTU0zMjpJTUVNOmxvbmc6bXU6U1RISCBsb25nCisic3RoaCByPFJBPiwgQChyPFJCPiwgPGltbT4pIgorCWRvX3N0aGgoX1NELCB2YWxfUmEsIFJiLCBpbW0pOworCisKKworLy8gU1RXCisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19zdHc6dW5zaWduZWQzMiByYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBzcmMKKwlTVE9SRShyYiArIHNyYywgNCwgcmEpOworCitfSU1FTSwxMDEwMCxYWCw2LlJBLDYuUkIsNi5TUkNfNjpJTUVNOnNob3J0Om11OlNUVworInN0dyByPFJBPiwgQChyPFJCPiwgPFNSQ182PikiOlhYID09IDAKKyJzdHcgcjxSQT4sIEAocjxSQj4lczxYWD4sIHI8U1JDXzY+KSIKKwlkb19zdHcoX1NELCB2YWxfUmEsIFJiLCBzcmMpOworCWRvX2luY3IoX1NELCBYWCwgJkdQUltSQl0sIDQpOworX0lNRU0sMTAxMDAsMTAsNi5SQSw2LlJCLF9JTU0zMjpJTUVNOmxvbmc6bXU6U1RXIGxvbmcKKyJzdHcgcjxSQT4sIEAocjxSQj4sIDxpbW0+KSIKKwlkb19zdHcoX1NELCB2YWxfUmEsIFJiLCBpbW0pOworCisKKworLy8gU1VCCisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19zdWI6dW5zaWduZWQzMiAqcmEsIHVuc2lnbmVkMzIgcmIsIHVuc2lnbmVkMzIgaW1tCisJQUxVX0JFR0lOKHJiKTsKKwlBTFVfU1VCQihpbW0pOworCUFMVV9FTkQocmEpOworCitfSUFMVTEsMDAwMTAsMDAsNi5SQSw2LlJCLDYuUkM6SUFMVTE6c2hvcnQ6aXUsbXU6U1VCCisic3ViIHI8UkE+LCByPFJCPiwgcjxSQz4iCisJZG9fc3ViIChfU0QsIFJhLCBSYiwgUmMpOworX0lBTFUxLDAwMDEwLDEwLDYuUkEsNi5SQixfSU1NNjpJQUxVMTpzaG9ydDppdSxtdTpTVUIgaW1tCisic3ViIHI8UkE+LCByPFJCPiwgPGltbT4iCisJZG9fc3ViIChfU0QsIFJhLCBSYiwgaW1tKTsKK19JQUxVMSwwMDAxMCwxMCw2LlJBLDYuUkIsX0lNTTMyOklBTFUxOmxvbmc6aXUsbXU6U1VCIGltbSBsb25nCisic3ViIHI8UkE+LCByPFJCPiwgPGltbT4iCisJZG9fc3ViIChfU0QsIFJhLCBSYiwgaW1tKTsKKworCisKKy8vIFNVQjJICisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19zdWIyaDp1bnNpZ25lZDMyICpyYSwgdW5zaWduZWQzMiByYiwgdW5zaWduZWQzMiBpbW0KKwl1bnNpZ25lZDE2IGhpZ2ggPSBWSDJfNChyYikgLSBWSDJfNChpbW0pOworCXVuc2lnbmVkMTYgbG93ICA9IFZMMl80KHJiKSAtIFZMMl80KGltbSk7CisJV1JJVEUzMl9RVUVVRSAocmEsIChoaWdoIDw8IDE2KSB8IGxvdyk7CisKK19JQUxVMSwwMDAxMSwwMCw2LlJBLDYuUkIsNi5SQzpJQUxVMTpzaG9ydDppdSxtdTpTVUIySAorInN1YjJoIHI8UkE+LCByPFJCPiwgcjxSQz4iCisJZG9fc3ViMmggKF9TRCwgUmEsIFJiLCBSYyk7CitfSUFMVTEsMDAwMTEsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUxOnNob3J0Oml1LG11OlNVQjJIIGltbQorInN1YjJoIHI8UkE+LCByPFJCPiwgPGltbT4iCisJZG9fc3ViMmggKF9TRCwgUmEsIFJiLCBpbW1ITCk7CitfSUFMVTEsMDAwMTEsMTAsNi5SQSw2LlJCLF9JTU0zMjpJQUxVMTpsb25nOml1LG11OlNVQjJIIGltbSBsb25nCisic3ViMmggcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19zdWIyaCAoX1NELCBSYSwgUmIsIGltbSk7CisKKworCisvLyBTVUJCCisKK3ZvaWQ6OmZ1bmN0aW9uOjpkb19zdWJiOnVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIGltbQorCUFMVV9CRUdJTihyYik7CisJQUxVX1NVQkJfQihpbW0sIEFMVV9DQVJSWSk7CisJQUxVX0VORChyYSk7CisJCitfSUFMVTEsMDAxMDEsMDAsNi5SQSw2LlJCLDYuUkM6SUFMVTE6c2hvcnQ6aXUsbXU6U1VCQgorInN1YmIgcjxSQT4sIHI8UkI+LCByPFJDPiIKKwlkb19zdWJiIChfU0QsIFJhLCBSYiwgUmMpOworX0lBTFUxLDAwMTAxLDEwLDYuUkEsNi5SQixfSU1NNjpJQUxVMTpzaG9ydDppdSxtdTpTVUJCIGltbQorInN1YmIgcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19zdWJiIChfU0QsIFJhLCBSYiwgaW1tKTsKK19JQUxVMSwwMDEwMSwxMCw2LlJBLDYuUkIsX0lNTTMyOklBTFUxOmxvbmc6aXUsbXU6U1VCQiBpbW0gbG9uZworInN1YmIgcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19zdWJiIChfU0QsIFJhLCBSYiwgaW1tKTsKKworCisKKy8vIFNVQkhwcHAKKwordm9pZDo6ZnVuY3Rpb246OmRvX3N1YmhfcHBwOmludCBwcHAsIHVuc2lnbmVkMzIgKnJhLCB1bnNpZ25lZDMyIHJiLCB1bnNpZ25lZDMyIHNyYworCXN3aXRjaCAocHBwKSB7CisJY2FzZSAweDA6IC8qIExMTCAqLworCSAgeworCSAgQUxVMTZfQkVHSU4oVkwyXzQocmIpKTsKKwkgIEFMVTE2X1NVQkIoVkwyXzQoc3JjKSk7CisJICBBTFUxNl9FTkQocmEsIDApOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSAweDE6IC8qIExMSCAqLworCSAgeworCSAgQUxVMTZfQkVHSU4oVkwyXzQocmIpKTsKKwkgIEFMVTE2X1NVQkIoVkgyXzQoc3JjKSk7CisJICBBTFUxNl9FTkQocmEsIDApOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSAweDI6IC8qIExITCAqLworCSAgeworCSAgQUxVMTZfQkVHSU4oVkgyXzQocmIpKTsKKwkgIEFMVTE2X1NVQkIoVkwyXzQoc3JjKSk7CisJICBBTFUxNl9FTkQocmEsIDApOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSAweDM6IC8qIExISCAqLworCSAgeworCSAgQUxVMTZfQkVHSU4oVkgyXzQocmIpKTsKKwkgIEFMVTE2X1NVQkIoVkgyXzQoc3JjKSk7CisJICBBTFUxNl9FTkQocmEsIDApOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSAweDQ6IC8qIEhMTCAqLworCSAgeworCSAgQUxVMTZfQkVHSU4oVkwyXzQocmIpKTsKKwkgIEFMVTE2X1NVQkIoVkwyXzQoc3JjKSk7CisJICBBTFUxNl9FTkQocmEsIDEpOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSAweDU6IC8qIEhMSCAqLworCSAgeworCSAgQUxVMTZfQkVHSU4oVkwyXzQocmIpKTsKKwkgIEFMVTE2X1NVQkIoVkgyXzQoc3JjKSk7CisJICBBTFUxNl9FTkQocmEsIDEpOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSAweDY6IC8qIEhITCAqLworCSAgeworCSAgQUxVMTZfQkVHSU4oVkgyXzQocmIpKTsKKwkgIEFMVTE2X1NVQkIoVkwyXzQoc3JjKSk7CisJICBBTFUxNl9FTkQocmEsIDEpOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSAweDc6IC8qIEhISCAqLworCSAgeworCSAgQUxVMTZfQkVHSU4oVkgyXzQocmIpKTsKKwkgIEFMVTE2X1NVQkIoVkgyXzQoc3JjKSk7CisJICBBTFUxNl9FTkQocmEsIDEpOworCSAgfQorCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHNpbV9lbmdpbmVfYWJvcnQgKFNELCBDUFUsIGNpYSwgImRvX3N1YmhfcHBwIC0gaW50ZXJuYWwgZXJyb3IgLSBiYWQgc3dpdGNoIik7CisJfQorCitfSUFMVTEsMTEscHBwLDAwLDYuUkEsNi5SQiw2LlJDOklBTFUxOnNob3J0Oml1LG11OlNVQkhwcHAKKyJzdWJoJXM8cHBwPiByPFJBPiwgcjxSQj4sIHI8UkM+IgorCWRvX3N1YmhfcHBwKF9TRCwgcHBwLCBSYSwgUmIsIFJjKTsKK19JQUxVMSwxMSxwcHAsMTAsNi5SQSw2LlJCLF9JTU02OklBTFUxOnNob3J0Oml1LG11OlNVQkhwcHAgaW1tCisic3ViaCVzPHBwcD4gcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19zdWJoX3BwcChfU0QsIHBwcCwgUmEsIFJiLCBpbW1ITCk7CitfSUFMVTEsMTEscHBwLDEwLDYuUkEsNi5SQixfSU1NMzI6SUFMVTE6bG9uZzppdSxtdTpTVUJIcHBwIGltbSBsb25nCisic3ViaCVzPHBwcD4gcjxSQT4sIHI8UkI+LCA8aW1tPiIKKwlkb19zdWJoX3BwcChfU0QsIHBwcCwgUmEsIFJiLCBpbW0pOworCisKKworLy8gVFJBUAorCithZGRyZXNzX3dvcmQ6OmZ1bmN0aW9uOjpkb190cmFwOmFkZHJlc3Nfd29yZCB0cmFwX3ZlY3RvciwgYWRkcmVzc193b3JkIG5pYQorCS8qIFN0ZWFsIHRyYXAgMzEgZm9yIGRvaW5nIHN5c3RlbSBjYWxscyAqLworCS8qIFN5c3RlbSBjYWxscyBhcmUgZGVmaW5lZCBpbiBsaWJnbG9zcy9kMzB2L3N5c2NhbGwuaC4gICovCisJaWYgKHRyYXBfdmVjdG9yID09IEVJVF9WQiArIDB4MjAgKyAoMzEgPDwgMykpCisJICB7CisJICAgIGVudW0geyBQQVJNMSA9IDIsIFBBUk0yLCBQQVJNMywgUEFSTTQsIEZVTkMgfTsKKwkgICAgaWYgKEdQUltGVU5DXSA9PSAxKQkJLyogZXhpdCAqLworCSAgICAgIHsKKwkgICAgICAgIHNpbV9lbmdpbmVfaGFsdCAoc2QsIFNUQVRFX0NQVSAoc2QsIDApLCBOVUxMLCBjaWEsIHNpbV9leGl0ZWQsCisJCSAgCSAgICAgICAgIEdQUltQQVJNMV0pOworCSAgICAgICAgcmV0dXJuIC0xOyAvKiBkdW1teSAqLworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJQ0JfU1lTQ0FMTCBzeXNjYWxsOworCisJCUNCX1NZU0NBTExfSU5JVCAoJnN5c2NhbGwpOworCQlzeXNjYWxsLmFyZzEgPSBHUFJbUEFSTTFdOworCQlzeXNjYWxsLmFyZzIgPSBHUFJbUEFSTTJdOworCQlzeXNjYWxsLmFyZzMgPSBHUFJbUEFSTTNdOworCQlzeXNjYWxsLmFyZzQgPSBHUFJbUEFSTTRdOworCQlzeXNjYWxsLmZ1bmMgPSBHUFJbRlVOQ107CisJCXN5c2NhbGwucDEgPSAoUFRSKSBTRDsKKwkJc3lzY2FsbC5yZWFkX21lbSA9IGQzMHZfcmVhZF9tZW07CisJCXN5c2NhbGwud3JpdGVfbWVtID0gZDMwdl93cml0ZV9tZW07CisKKwkJV1JJVEUzMl9RVUVVRSAoJkdQUltQQVJNMV0sCisJCQkgICAgICAgKChjYl9zeXNjYWxsIChTVEFURV9DQUxMQkFDSyAoU0QpLCAmc3lzY2FsbCkKKwkJCQkgPT0gQ0JfUkNfT0spCisJCQkJPyBzeXNjYWxsLnJlc3VsdAorCQkJCTogLXN5c2NhbGwuZXJyY29kZSkpOworCQlyZXR1cm4gbmlhOworCSAgICAgIH0KKwkgIH0KKwllbHNlIGlmIChUUkFDRV9UUkFQX1ApCisJICB7CisJICAgIGludCByZWcsIGk7CisJICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlxuVHJhcCAlbGQ6XG4iLCAobG9uZykgKCh0cmFwX3ZlY3RvciAtIChFSVRfVkIgKyAweDIwKSkgPj4gMykpOworCSAgICBmb3IgKHJlZyA9IDA7IHJlZyA8IE5SX0dFTkVSQUxfUFVSUE9TRV9SRUdJU1RFUlM7IHJlZyArPSA4KQorCSAgICAgIHsKKwkJc2ltX2lvX2VwcmludGYgKHNkLCAiciUuMmQgIC0gciUuMmQ6ICIsIHJlZywgcmVnKzcpOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkgIHNpbV9pb19lcHJpbnRmIChzZCwgIiAweCUuOGx4IiwgKGxvbmcpIEdQUltyZWcraV0pOworCQlzaW1faW9fZXByaW50ZiAoc2QsICJcbiIpOworCSAgICAgIH0KKworCSAgICBmb3IgKHJlZyA9IDA7IHJlZyA8IDE2OyByZWcgKz0gOCkKKwkgICAgICB7CisJCXNpbV9pb19lcHJpbnRmIChzZCwgImNyJS4yZCAtIGNyJS4yZDoiLCByZWcsIHJlZys3KTsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJICBzaW1faW9fZXByaW50ZiAoc2QsICIgMHglLjhseCIsIChsb25nKSBDUkVHW3JlZytpXSk7CisJCXNpbV9pb19lcHJpbnRmIChzZCwgIlxuIik7CisJICAgICAgfQorCisJICAgIHNpbV9pb19lcHJpbnRmIChzZCwgImEwICAgLSBhMTogICIpOworCSAgICBmb3IgKHJlZyA9IDA7IHJlZyA8IE5SX0FDQ1VNVUxBVE9SUzsgcmVnKyspCisJICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiIDB4JS44bHggMHglLjhseCIsCisJCQkgICAgICAobG9uZylFWFRSQUNURUQ2NChBQ0NbcmVnXSwgMCwgMzEpLAorCQkJICAgICAgKGxvbmcpRVhUUkFDVEVENjQoQUNDW3JlZ10sIDMyLCA2MykpOworCSAgICBzaW1faW9fZXByaW50ZiAoc2QsICJcbiIpOworCisJICAgIHNpbV9pb19lcHJpbnRmIChzZCwgImYwICAgLSBmNzogICIpOworCSAgICBzaW1faW9fZXByaW50ZiAoc2QsICIgICAgIChmMCkgJWQiLCAoaW50KSBQU1dfVkFMKFBTV19GMCkpOworCSAgICBzaW1faW9fZXByaW50ZiAoc2QsICIgICAgIChmMSkgJWQiLCAoaW50KSBQU1dfVkFMKFBTV19GMSkpOworCSAgICBzaW1faW9fZXByaW50ZiAoc2QsICIgICAgIChmMikgJWQiLCAoaW50KSBQU1dfVkFMKFBTV19GMikpOworCSAgICBzaW1faW9fZXByaW50ZiAoc2QsICIgICAgIChmMykgJWQiLCAoaW50KSBQU1dfVkFMKFBTV19GMykpOworCSAgICBzaW1faW9fZXByaW50ZiAoc2QsICIgICAgICAocykgJWQiLCAoaW50KSBQU1dfVkFMKFBTV19TKSk7CisJICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIiAgICAgICh2KSAlZCIsIChpbnQpIFBTV19WQUwoUFNXX1YpKTsKKwkgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiICAgICAodmEpICVkIiwgKGludCkgUFNXX1ZBTChQU1dfVkEpKTsKKwkgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiICAgICAgKGMpICVkXG4iLCAoaW50KSBQU1dfVkFMKFBTV19DKSk7CisKKwkgICAgc2ltX2lvX2VwcmludGYgKHNkLCAicHN3aDogICAgICAgIik7CisJICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIiAgICAgKHNtKSAlZCIsIChpbnQpIFBTV19WQUwoUFNXX1NNKSk7CisJICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIiAgICAgKGVhKSAlZCIsIChpbnQpIFBTV19WQUwoUFNXX0VBKSk7CisJICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIiAgICAgKGllKSAlZCIsIChpbnQpIFBTV19WQUwoUFNXX0lFKSk7CisJICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIiAgICAgKHJwKSAlZCIsIChpbnQpIFBTV19WQUwoUFNXX1JQKSk7CisJICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIiAgICAgKG1kKSAlZCIsIChpbnQpIFBTV19WQUwoUFNXX01EKSk7CisKKwkgICAgaWYgKFBTV19WQUwoUFNXX0RCKSkKKwkgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICIgICAgIChkYikgJWQiLCAoaW50KSBQU1dfVkFMKFBTV19EQikpOworCisJICAgIGlmIChQU1dfVkFMKFBTV19EUykpCisJICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiICAgICAoZHMpICVkIiwgKGludCkgUFNXX1ZBTChQU1dfRFMpKTsKKworCSAgICBzaW1faW9fZXByaW50ZiAoc2QsICJcbiIpOworCSAgICByZXR1cm4gbmlhOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgaWYoUFNXX1ZBTChQU1dfUlApICYmIFJQVF9FID09IGNpYSkKKwkgICAgICB7CisJCVdSSVRFMzJfUVVFVUUgKCZiUEMsIFJQVF9TKTsKKwkJaWYgKFJQVF9DID09IDApCisJCSAgUFNXX1NFVCAoUFNXX1JQLCAwKTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICBXUklURTMyX1FVRVVFICgmYlBDLCBjaWEgKyA4KTsKKwkgICAgRElEX1RSQVAgPSAxOworCSAgICByZXR1cm4gdHJhcF92ZWN0b3I7CisJICB9CisKK19CUkEsMDEwMDEsMDAsNi4qKiw2LioqLDYuUkM6QlJBOnNob3J0Om11OlRSQVAKKyJ0cmFwIHI8UkM+IgorCW5pYSA9IGRvX3RyYXAgKF9TRCwgRUlUX1ZCICsgMHgyMCArIE1BU0tFRDMyKFJjLCAyNCwgMjgpLCBuaWEpOworX0JSQSwwMTAwMSwxMCw2LioqLDYuKiosX0lNTTY6QlJBOnNob3J0Om11OlRSQVAgaW1tCisidHJhcCA8aW1tPiIKKwluaWEgPSBkb190cmFwIChfU0QsIEVJVF9WQiArIDB4MjAgKyAoaW1tXzUgPDwgMyksIG5pYSk7CisKKworCisvLyBYT1IKKworX0xPR0lDLDExMDExLDAwLDYuUkEsNi5SQiw2LlJDOkxPR0lDOnNob3J0Oml1LG11OlhPUgorInhvciByPFJBPiwgcjxSQj4sIHI8UkM+IgorCVdSSVRFMzJfUVVFVUUgKFJhLCBSYiBeIFJjKTsKK19MT0dJQywxMTAxMSwxMCw2LlJBLDYuUkIsX0lNTTY6TE9HSUM6c2hvcnQ6aXUsbXU6WE9SIGltbQorInhvciByPFJBPiwgcjxSQj4sIDxpbW0+IgorCVdSSVRFMzJfUVVFVUUgKFJhLCBSYiBeIGltbSk7CitfTE9HSUMsMTEwMTEsMTAsNi5SQSw2LlJCLF9JTU0zMjpMT0dJQzpsb25nOml1LG11OlhPUiBpbW0gbG9uZworInhvciByPFJBPiwgcjxSQj4sIDxpbW0+IgorCVdSSVRFMzJfUVVFVUUgKFJhLCBSYiBeIGltbSk7CisKKworCisvLyBYT1JGRworCitfTE9HSUMsMDEwMTEsMDAsKioqLDMuRkEsKioqLDMuRkIsKioqLDMuRkM6TE9HSUM6c2hvcnQ6aXUsbXU6WE9SRkcKKyJ4b3JmZyBmPEZBPiwgZjxGQj4sIGY8RkM+IgorCVBTV19GTEFHX1NFVF9RVUVVRShGQSwgUFNXX0ZMQUdfVkFMKEZCKSBeIFBTV19GTEFHX1ZBTChGQykpOworX0xPR0lDLDAxMDExLDEwLCoqKiwzLkZBLCoqKiwzLkZCLF9JTU02OkxPR0lDOnNob3J0Oml1LG11OlhPUkZHIGltbQorInhvcmZnIGY8RkE+LCBmPEZCPiwgPGltbV82PiIKKwlQU1dfRkxBR19TRVRfUVVFVUUoRkEsIFBTV19GTEFHX1ZBTChGQikgXiAoaW1tXzYgJiAxKSk7CisKKworCmRpZmYgLS1naXQgYS9zaW0vZDMwdi9kYy1zaG9ydCBiL3NpbS9kMzB2L2RjLXNob3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NTFkZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZDMwdi9kYy1zaG9ydApAQCAtMCwwICsxLDIyIEBACisvLworLy8gIE1pdHN1YmlzaGkgRWxlY3RyaWMgQ29ycC4gRDMwViBTaW11bGF0b3IuCisvLyAgQ29weXJpZ2h0IChDKSAxOTk3LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zIEluYy4KKy8vCisvLyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorLy8KKy8vICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLy8gIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisvLyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKy8vICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisvLyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKy8vCitzd2l0Y2g6IDQ6IDEzOiA0OiAxMwpkaWZmIC0tZ2l0IGEvc2ltL2QzMHYvZW5naW5lLmMgYi9zaW0vZDMwdi9lbmdpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDJhMmY1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2QzMHYvZW5naW5lLmMKQEAgLTAsMCArMSw0OTMgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisgICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBFTkdJTkVfQworI2RlZmluZSBFTkdJTkVfQworCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitkb19zdGFja19zd2FwIChTSU1fREVTQyBzZCkKK3sKKyAgc2ltX2NwdSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgMCk7CisgIHVuc2lnbmVkIG5ld19zcCA9IChQU1dfVkFMKFBTV19TTSkgIT0gMCk7CisgIGlmIChjcHUtPnJlZ3MuY3VycmVudF9zcCAhPSBuZXdfc3ApCisgICAgeworICAgICAgY3B1LT5yZWdzLnNwW2NwdS0+cmVncy5jdXJyZW50X3NwXSA9IFNQOworICAgICAgY3B1LT5yZWdzLmN1cnJlbnRfc3AgPSBuZXdfc3A7CisgICAgICBTUCA9IGNwdS0+cmVncy5zcFtjcHUtPnJlZ3MuY3VycmVudF9zcF07CisgICAgfQorfQorCisjaWYgV0lUSF9UUkFDRQorLyogSW1wbGVtZW50IEFMVSB0cmFjaW5nIG9mIDMyLWJpdCByZWdpc3RlcnMuICAqLworc3RhdGljIHZvaWQKK3RyYWNlX2FsdTMyIChTSU1fREVTQyBzZCwKKwkgICAgIHNpbV9jcHUgKmNwdSwKKwkgICAgIGFkZHJlc3Nfd29yZCBjaWEsCisJICAgICB1bnNpZ25lZDMyICpwdHIpCit7CisgIHVuc2lnbmVkMzIgdmFsdWUgPSAqcHRyOworCisgIGlmIChwdHIgPj0gJkdQUlswXSAmJiBwdHIgPD0gJkdQUltOUl9HRU5FUkFMX1BVUlBPU0VfUkVHSVNURVJTXSkKKyAgICB0cmFjZV9vbmVfaW5zbiAoc2QsIGNwdSwgY2lhLCAxLCAiZW5naW5lLmMiLCBfX0xJTkVfXywgImFsdSIsCisJCSAgICAiU2V0IHJlZ2lzdGVyIHIlLTJkID0gMHglLjhseCAoJWxkKSIsCisJCSAgICBwdHIgLSAmR1BSWzBdLCAobG9uZyl2YWx1ZSwgKGxvbmcpdmFsdWUpOworCisgIGVsc2UgaWYgKHB0ciA9PSAmUFNXIHx8IHB0ciA9PSAmYlBTVyB8fCBwdHIgPT0gJkRQU1cpCisgICAgdHJhY2Vfb25lX2luc24gKHNkLCBjcHUsIGNpYSwgMSwgImVuZ2luZS5jIiwgX19MSU5FX18sICJhbHUiLAorCQkgICAgIlNldCByZWdpc3RlciAlcyA9IDB4JS44bHglcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMiLAorCQkgICAgKHB0ciA9PSAmUFNXKSA/ICJwc3ciIDogKChwdHIgPT0gJmJQU1cpID8gImJwc3ciIDogImRwc3ciKSwKKwkJICAgIChsb25nKXZhbHVlLAorCQkgICAgKHZhbHVlICYgKDB4ODAwMDAwMDAgPj4gUFNXX1NNKSkgPyAiLCBzbSIgOiAiIiwKKwkJICAgICh2YWx1ZSAmICgweDgwMDAwMDAwID4+IFBTV19FQSkpID8gIiwgZWEiIDogIiIsCisJCSAgICAodmFsdWUgJiAoMHg4MDAwMDAwMCA+PiBQU1dfREIpKSA/ICIsIGRiIiA6ICIiLAorCQkgICAgKHZhbHVlICYgKDB4ODAwMDAwMDAgPj4gUFNXX0RTKSkgPyAiLCBkcyIgOiAiIiwKKwkJICAgICh2YWx1ZSAmICgweDgwMDAwMDAwID4+IFBTV19JRSkpID8gIiwgaWUiIDogIiIsCisJCSAgICAodmFsdWUgJiAoMHg4MDAwMDAwMCA+PiBQU1dfUlApKSA/ICIsIHJwIiA6ICIiLAorCQkgICAgKHZhbHVlICYgKDB4ODAwMDAwMDAgPj4gUFNXX01EKSkgPyAiLCBtZCIgOiAiIiwKKwkJICAgICh2YWx1ZSAmICgweDgwMDAwMDAwID4+IFBTV19GMCkpID8gIiwgZjAiIDogIiIsCisJCSAgICAodmFsdWUgJiAoMHg4MDAwMDAwMCA+PiBQU1dfRjEpKSA/ICIsIGYxIiA6ICIiLAorCQkgICAgKHZhbHVlICYgKDB4ODAwMDAwMDAgPj4gUFNXX0YyKSkgPyAiLCBmMiIgOiAiIiwKKwkJICAgICh2YWx1ZSAmICgweDgwMDAwMDAwID4+IFBTV19GMykpID8gIiwgZjMiIDogIiIsCisJCSAgICAodmFsdWUgJiAoMHg4MDAwMDAwMCA+PiBQU1dfUykpICA/ICIsIHMiICA6ICIiLAorCQkgICAgKHZhbHVlICYgKDB4ODAwMDAwMDAgPj4gUFNXX1YpKSAgPyAiLCB2IiAgOiAiIiwKKwkJICAgICh2YWx1ZSAmICgweDgwMDAwMDAwID4+IFBTV19WQSkpID8gIiwgdmEiIDogIiIsCisJCSAgICAodmFsdWUgJiAoMHg4MDAwMDAwMCA+PiBQU1dfQykpICA/ICIsIGMiICA6ICIiKTsKKworICBlbHNlIGlmIChwdHIgPj0gJkNSRUdbMF0gJiYgcHRyIDw9ICZDUkVHW05SX0NPTlRST0xfUkVHSVNURVJTXSkKKyAgICB0cmFjZV9vbmVfaW5zbiAoc2QsIGNwdSwgY2lhLCAxLCAiZW5naW5lLmMiLCBfX0xJTkVfXywgImFsdSIsCisJCSAgICAiU2V0IHJlZ2lzdGVyIGNyJWQgPSAweCUuOGx4ICglbGQpIiwKKwkJICAgIHB0ciAtICZDUkVHWzBdLCAobG9uZyl2YWx1ZSwgKGxvbmcpdmFsdWUpOworfQorCisvKiBJbXBsZW1lbnQgQUxVIHRyYWNpbmcgb2YgMzItYml0IHJlZ2lzdGVycy4gICovCitzdGF0aWMgdm9pZAordHJhY2VfYWx1NjQgKFNJTV9ERVNDIHNkLAorCSAgICAgc2ltX2NwdSAqY3B1LAorCSAgICAgYWRkcmVzc193b3JkIGNpYSwKKwkgICAgIHVuc2lnbmVkNjQgKnB0cikKK3sKKyAgdW5zaWduZWQ2NCB2YWx1ZSA9ICpwdHI7CisKKyAgaWYgKHB0ciA+PSAmQUNDWzBdICYmIHB0ciA8PSAmQUNDW05SX0FDQ1VNVUxBVE9SU10pCisgICAgdHJhY2Vfb25lX2luc24gKHNkLCBjcHUsIGNpYSwgMSwgImVuZ2luZS5jIiwgX19MSU5FX18sICJhbHUiLAorCQkgICAgIlNldCByZWdpc3RlciBhJS0yZCA9IDB4JS44bHggMHglLjhseCIsCisJCSAgICBwdHIgLSAmQUNDWzBdLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkMzIpKHZhbHVlID4+IDMyKSwKKwkJICAgICh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZDMyKXZhbHVlKTsKKworfQorI2VuZGlmCisKKy8qIFByb2Nlc3MgYWxsIG9mIHRoZSBxdWV1ZWQgdXAgd3JpdGVzIGluIG9yZGVyIG5vdyAqLwordm9pZAordW5xdWV1ZV93cml0ZXMgKFNJTV9ERVNDIHNkLAorCQlzaW1fY3B1ICpjcHUsCisJCWFkZHJlc3Nfd29yZCBjaWEpCit7CisgIGludCBpLCBudW07CisgIGludCBkaWRfcHN3ID0gMDsKKyAgdW5zaWduZWQzMiAqcHN3X2FkZHIgPSAmUFNXOworCisgIG51bSA9IFdSSVRFMzJfTlVNOworICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisgICAgeworICAgICAgdW5zaWduZWQzMiBtYXNrID0gV1JJVEUzMl9NQVNLIChpKTsKKyAgICAgIHVuc2lnbmVkMzIgKnB0ciA9IFdSSVRFMzJfUFRSIChpKTsKKyAgICAgIHVuc2lnbmVkMzIgdmFsdWUgPSAoKnB0ciAmIH5tYXNrKSB8IChXUklURTMyX1ZBTFVFIChpKSAmIG1hc2spOworICAgICAgaW50IGo7CisKKyAgICAgIGlmIChwdHIgPT0gcHN3X2FkZHIpCisgICAgICAgeworCSAgLyogSWYgTVUgaW5zdHJ1Y3Rpb24gd2FzIG5vdCBhIE1WVFNZUyAobGtyKSwgcmVzb2x2ZSBQU1cKKyAgICAgICAgICAgICBjb250ZW50aW9uIGluIGZhdm91ciBvZiBJVS4gKi8KKwkgIGlmKCEgU1RBVEVfQ1BVIChzZCwgMCktPmxlZnRfa2lsbHNfcmlnaHRfcCkKKwkgICAgeworCSAgICAgIC8qIERldGVjdCBjb250ZW50aW9uIGluIHBhcmFsbGVsIHdyaXRlcyB0byB0aGUgc2FtZSBQU1cgZmxhZ3MuCisJCSBUaGUgaGFyZHdhcmUgYWxsb3dzIHRoZSB1cGRhdGVzIGZyb20gSVUgdG8gcHJldmFpbCBvdmVyCisJCSB0aG9zZSBmcm9tIE1VLiAqLworCSAgICAgIAorCSAgICAgIHVuc2lnbmVkMzIgZmxhZ19iaXRzID0KKwkJQklUMzIgKFBTV19GMCkgfCBCSVQzMiAoUFNXX0YxKSB8CisJCUJJVDMyIChQU1dfRjIpIHwgQklUMzIgKFBTV19GMykgfAorCQlCSVQzMiAoUFNXX1MpIHwgQklUMzIgKFBTV19WKSB8CisJCUJJVDMyIChQU1dfVkEpIHwgQklUMzIgKFBTV19DKTsKKwkgICAgICB1bnNpZ25lZDMyIG15X2ZsYWdfYml0cyA9IG1hc2sgJiBmbGFnX2JpdHM7CisJICAgICAgCisJICAgICAgZm9yIChqID0gaSArIDE7IGogPCBudW07IGorKykKKwkJaWYgKFdSSVRFMzJfUFRSIChqKSA9PSBwc3dfYWRkciAmJiAvKiB3cml0ZSB0byBQU1cgKi8KKwkJICAgIFdSSVRFMzJfTUFTSyAoaikgJiBteV9mbGFnX2JpdHMpICAvKiBzb21lIG9mIHRoZSBzYW1lIGZsYWdzICovCisJCSAgeworCQkgICAgLyogUmVjb21wdXRlIGxvY2FsIG1hc2sgJiB2YWx1ZSwgdG8gc3VwcHJlc3MgdGhpcworCQkgICAgICAgZWFybGllciB3cml0ZSB0byB0aGUgc2FtZSBmbGFnIGJpdHMuICovCisJCSAgICAKKwkJICAgIHVuc2lnbmVkMzIgbmV3X21hc2sgPSBtYXNrICYgfihXUklURTMyX01BU0sgKGopICYgbXlfZmxhZ19iaXRzKTsKKwkJICAgIAorCQkgICAgLyogVGhlcmUgaXMgYSBzcGVjaWFsIGNhc2UgZm9yIHRoZSBWQSAoYWNjdW11bGF0ZWQKKwkJICAgICAgIG92ZXJmbG93KSBmbGFnLCBpbiB0aGF0IGl0IGlzIG9ubHkgaW5jbHVkZWQgaW4gdGhlCisJCSAgICAgICBzZWNvbmQgaW5zdHJ1Y3Rpb24ncyBtYXNrIGlmIHRoZSBvdmVyZmxvdworCQkgICAgICAgb2NjdXJyZWQuICBZZXQgdGhlIGhhcmR3YXJlIHN0aWxsIHN1cHByZXNzZXMgdGhlCisJCSAgICAgICBmaXJzdCBpbnN0cnVjdGlvbidzIHVwZGF0ZSB0byBWQS4gIFNvIHdlIGtsdWRnZQorCQkgICAgICAgdGhpcyBieSBpbmZlcnJpbmcgUFNXX1YgLT4gUFNXX1ZBIGZvciB0aGUgc2Vjb25kCisJCSAgICAgICBpbnN0cnVjdGlvbi4gKi8KKwkJICAgIAorCQkgICAgaWYgKFdSSVRFMzJfTUFTSyAoaikgJiBCSVQzMiAoUFNXX1YpKQorCQkgICAgICB7CisJCQluZXdfbWFzayAmPSB+QklUMzIgKFBTV19WQSk7CisJCSAgICAgIH0KKwkJICAgIAorCQkgICAgdmFsdWUgPSAoKnB0ciAmIH5uZXdfbWFzaykgfCAoV1JJVEUzMl9WQUxVRSAoaSkgJiBuZXdfbWFzayk7CisJCSAgfQorCSAgICB9CisJICAKKyAgICAgICAgIGRpZF9wc3cgPSAxOworICAgICAgIH0KKworICAgICAgKnB0ciA9IHZhbHVlOworCisjaWYgV0lUSF9UUkFDRQorICAgICAgaWYgKFRSQUNFX0FMVV9QIChjcHUpKQorCXRyYWNlX2FsdTMyIChzZCwgY3B1LCBjaWEsIHB0cik7CisjZW5kaWYKKyAgICB9CisKKyAgbnVtID0gV1JJVEU2NF9OVU07CisgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKyAgICB7CisgICAgICB1bnNpZ25lZDY0ICpwdHIgPSBXUklURTY0X1BUUiAoaSk7CisgICAgICAqcHRyID0gV1JJVEU2NF9WQUxVRSAoaSk7CisKKyNpZiBXSVRIX1RSQUNFCisgICAgICBpZiAoVFJBQ0VfQUxVX1AgKGNwdSkpCisJdHJhY2VfYWx1NjQgKHNkLCBjcHUsIGNpYSwgcHRyKTsKKyNlbmRpZgorICAgIH0KKworICBXUklURTMyX05VTSA9IDA7CisgIFdSSVRFNjRfTlVNID0gMDsKKworICBpZiAoRElEX1RSQVAgPT0gMSkgLyogb3JkaW5hcnkgdHJhcCAqLworICAgIHsKKyAgICAgIGJQU1cgPSBQU1c7CisgICAgICBQU1cgJj0gKEJJVDMyIChQU1dfREIpIHwgQklUMzIgKFBTV19TTSkpOworICAgICAgZGlkX3BzdyA9IDE7CisgICAgfQorICBlbHNlIGlmIChESURfVFJBUCA9PSAyKSAvKiBkZWJ1ZyB0cmFwICovCisgICAgeworICAgICAgRFBTVyA9IFBTVzsKKyAgICAgIFBTVyAmPSBCSVQzMiAoUFNXX0RTKTsKKyAgICAgIFBTVyB8PSBCSVQzMiAoUFNXX0RTKTsKKyAgICAgIGRpZF9wc3cgPSAxOworICAgIH0KKyAgRElEX1RSQVAgPSAwOworCisgIGlmIChkaWRfcHN3KQorICAgIGRvX3N0YWNrX3N3YXAgKHNkKTsKK30KKworCisvKiBTSU1VTEFURSBJTlNUUlVDVElPTlMsIHZhcmlvdXMgZGlmZmVyZW50IHdheXMgb2YgYWNoaWV2aW5nIHRoZSBzYW1lCisgICB0aGluZyAqLworCitzdGF0aWMgYWRkcmVzc193b3JkCitkb19sb25nIChTSU1fREVTQyBzZCwKKwkgbF9pbnN0cnVjdGlvbl93b3JkIGluc3RydWN0aW9uLAorCSBhZGRyZXNzX3dvcmQgY2lhKQoreworICBhZGRyZXNzX3dvcmQgbmlhID0gbF9pZGVjb2RlX2lzc3VlKHNkLAorCQkJCSAgICAgaW5zdHJ1Y3Rpb24sCisJCQkJICAgICBjaWEpOworCisgIHVucXVldWVfd3JpdGVzIChzZCwgU1RBVEVfQ1BVIChzZCwgMCksIGNpYSk7CisgIHJldHVybiBuaWE7Cit9CisKK3N0YXRpYyBhZGRyZXNzX3dvcmQKK2RvXzJfc2hvcnQgKFNJTV9ERVNDIHNkLAorCSAgICBzX2luc3RydWN0aW9uX3dvcmQgaW5zbjEsCisJICAgIHNfaW5zdHJ1Y3Rpb25fd29yZCBpbnNuMiwKKwkgICAgY3B1X3VuaXRzIHVuaXQsCisJICAgIGFkZHJlc3Nfd29yZCBjaWEpCit7CisgIGFkZHJlc3Nfd29yZCBuaWE7CisKKyAgLyogcnVuIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiAqLworICBTVEFURV9DUFUgKHNkLCAwKS0+dW5pdCA9IHVuaXQ7CisgIFNUQVRFX0NQVSAoc2QsIDApLT5sZWZ0X2tpbGxzX3JpZ2h0X3AgPSAwOworICBuaWEgPSBzX2lkZWNvZGVfaXNzdWUoc2QsCisJCQlpbnNuMSwKKwkJCWNpYSk7CisKKyAgdW5xdWV1ZV93cml0ZXMgKHNkLCBTVEFURV9DUFUgKHNkLCAwKSwgY2lhKTsKKworICAvKiBPbmx5IGRvIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gaWYgdGhlIFBDIGhhcyBub3QgY2hhbmdlZCAqLworICBpZiAoKG5pYSA9PSBJTlZBTElEX0lOU1RSVUNUSU9OX0FERFJFU1MpICYmCisgICAgICAoISBTVEFURV9DUFUgKHNkLCAwKS0+bGVmdF9raWxsc19yaWdodF9wKSkgeworICAgIFNUQVRFX0NQVSAoc2QsIDApLT51bml0ID0gYW55X3VuaXQ7CisgICAgbmlhID0gc19pZGVjb2RlX2lzc3VlIChzZCwKKwkJCSAgIGluc24yLAorCQkJICAgY2lhKTsKKworICAgIHVucXVldWVfd3JpdGVzIChzZCwgU1RBVEVfQ1BVIChzZCwgMCksIGNpYSk7CisgIH0KKworICBTVEFURV9DUFUgKHNkLCAwKS0+bGVmdF9raWxsc19yaWdodF9wID0gMDsKKyAgcmV0dXJuIG5pYTsKK30KKworc3RhdGljIGFkZHJlc3Nfd29yZAorZG9fcGFyYWxsZWwgKFNJTV9ERVNDIHNkLAorCSAgICAgc19pbnN0cnVjdGlvbl93b3JkIGxlZnRfaW5zbiwKKwkgICAgIHNfaW5zdHJ1Y3Rpb25fd29yZCByaWdodF9pbnNuLAorCSAgICAgYWRkcmVzc193b3JkIGNpYSkKK3sKKyAgYWRkcmVzc193b3JkIG5pYV9sZWZ0OworICBhZGRyZXNzX3dvcmQgbmlhX3JpZ2h0OworICBhZGRyZXNzX3dvcmQgbmlhOworCisgIC8qIHJ1biB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gKi8KKyAgU1RBVEVfQ1BVIChzZCwgMCktPnVuaXQgPSBtZW1vcnlfdW5pdDsKKyAgU1RBVEVfQ1BVIChzZCwgMCktPmxlZnRfa2lsbHNfcmlnaHRfcCA9IDA7CisgIG5pYV9sZWZ0ID0gc19pZGVjb2RlX2lzc3VlKHNkLAorCQkJICAgICBsZWZ0X2luc24sCisJCQkgICAgIGNpYSk7CisKKyAgLyogcnVuIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gKi8KKyAgU1RBVEVfQ1BVIChzZCwgMCktPnVuaXQgPSBpbnRlZ2VyX3VuaXQ7CisgIG5pYV9yaWdodCA9IHNfaWRlY29kZV9pc3N1ZShzZCwKKwkJCSAgICAgIHJpZ2h0X2luc24sCisJCQkgICAgICBjaWEpOworCisgIC8qIG1lcmdlIHRoZSBQQydzICovCisgIGlmIChuaWFfbGVmdCA9PSBJTlZBTElEX0lOU1RSVUNUSU9OX0FERFJFU1MpIHsKKyAgICBpZiAobmlhX3JpZ2h0ID09IElOVkFMSURfSU5TVFJVQ1RJT05fQUREUkVTUykKKyAgICAgIG5pYSA9IElOVkFMSURfSU5TVFJVQ1RJT05fQUREUkVTUzsKKyAgICBlbHNlCisgICAgICBuaWEgPSBuaWFfcmlnaHQ7CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKG5pYV9yaWdodCA9PSBJTlZBTElEX0lOU1RSVUNUSU9OX0FERFJFU1MpCisgICAgICBuaWEgPSBuaWFfbGVmdDsKKyAgICBlbHNlIHsKKyAgICAgIHNpbV9lbmdpbmVfYWJvcnQgKHNkLCBTVEFURV9DUFUgKHNkLCAwKSwgY2lhLCAicGFyYWxsZWwganVtcHMiKTsKKyAgICAgIG5pYSA9IElOVkFMSURfSU5TVFJVQ1RJT05fQUREUkVTUzsKKyAgICB9CisgIH0KKworICB1bnF1ZXVlX3dyaXRlcyAoc2QsIFNUQVRFX0NQVSAoc2QsIDApLCBjaWEpOworICByZXR1cm4gbmlhOworfQorCisKK3R5cGVkZWYgZW51bSB7CisgIHBfaW5zbiA9IDAsCisgIGxvbmdfaW5zbiA9IDMsCisgIGxfcl9pbnNuID0gMSwKKyAgcl9sX2luc24gPSAyLAorfSBpbnN0cnVjdGlvbl90eXBlczsKKworU1RBVElDX0lOTElORSBpbnN0cnVjdGlvbl90eXBlcworaW5zdHJ1Y3Rpb25fdHlwZShsX2luc3RydWN0aW9uX3dvcmQgaW5zbikKK3sKKyAgaW50IGZtMCA9IE1BU0tFRDY0KGluc24sIDAsIDApICE9IDA7CisgIGludCBmbTEgPSBNQVNLRUQ2NChpbnNuLCAzMiwgMzIpICE9IDA7CisgIHJldHVybiAoKGZtMCA8PCAxKSB8IGZtMSk7Cit9CisKKworCit2b2lkCitzaW1fZW5naW5lX3J1biAoU0lNX0RFU0Mgc2QsCisJCWludCBsYXN0X2NwdV9uciwKKwkJaW50IG5yX2NwdXMsCisJCWludCBzaWdnbmFsKQoreworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBhZGRyZXNzX3dvcmQgY2lhID0gUEM7CisgICAgICBhZGRyZXNzX3dvcmQgbmlhOworICAgICAgbF9pbnN0cnVjdGlvbl93b3JkIGluc24gPSBJTUVNKGNpYSk7CisgICAgICBpbnQgcnBfd2FzX3NldDsKKyAgICAgIGludCBycHRfY193YXNfbm9uemVybzsKKworICAgICAgLyogQmVmb3JlIGV4ZWN1dGluZyB0aGUgaW5zdHJ1Y3Rpb24sIHdlIG5lZWQgdG8gdGVzdCB3aGV0aGVyIG9yCisJIG5vdCBSUFRfQyBpcyBncmVhdGVyIHRoYW4gemVybywgYW5kIHNhdmUgdGhhdCBzdGF0ZSBmb3IgdXNlCisJIGFmdGVyIGV4ZWN1dGluZyB0aGUgaW5zdHJ1Y3Rpb24uICBJbiBwYXJ0aWN1bGFyLCB3ZSBuZWVkIHRvCisJIG5vdCBjYXJlIHdoZXRoZXIgdGhlIGluc3RydWN0aW9uIGNoYW5nZXMgUlBUX0MgaXRzZWxmLiAqLworCisgICAgICBycHRfY193YXNfbm9uemVybyA9IChSUFRfQyA+IDApOworCisgICAgICAvKiBCZWZvcmUgZXhlY3V0aW5nIHRoZSBpbnN0cnVjdGlvbiwgd2UgbmVlZCB0byBjaGVjayB0byBzZWUgaWYKKwkgd2UgaGF2ZSB0byBkZWNyZW1lbnQgUlBUX0MsIHRoZSByZXBlYXQgY291bnQgcmVnaXN0ZXIuICBEbyB0aGlzCisJIGlmIFBDID09IFJQVF9FLCBidXQgb25seSBpZiB3ZSBhcmUgaW4gYW4gYWN0aXZlIHJlcGVhdCBibG9jay4gKi8KKworICAgICAgaWYgKFBDID09IFJQVF9FICYmCisJICAoUlBUX0MgPiAwIHx8IFBTV19WQUwgKFBTV19SUCkgIT0gMCkpCisJeworCSAgUlBUX0MgLS07CisJfQorICAgICAgCisgICAgICAvKiBOb3cgZXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24gYXQgUEMgKi8KKworICAgICAgc3dpdGNoIChpbnN0cnVjdGlvbl90eXBlIChpbnNuKSkKKwl7CisJY2FzZSBsb25nX2luc246CisJICBuaWEgPSBkb19sb25nIChzZCwgaW5zbiwgY2lhKTsKKwkgIGJyZWFrOworCWNhc2Ugcl9sX2luc246CisJICAvKiBMIDwtIFIgKi8KKwkgIG5pYSA9IGRvXzJfc2hvcnQgKHNkLCBpbnNuLCBpbnNuID4+IDMyLCBpbnRlZ2VyX3VuaXQsIGNpYSk7CisJICBicmVhazsKKwljYXNlIGxfcl9pbnNuOgorCSAgLyogTCAtPiBSICovCisJICBuaWEgPSBkb18yX3Nob3J0IChzZCwgaW5zbiA+PiAzMiwgaW5zbiwgbWVtb3J5X3VuaXQsIGNpYSk7CisJICBicmVhazsKKwljYXNlIHBfaW5zbjoKKwkgIG5pYSA9IGRvX3BhcmFsbGVsIChzZCwgaW5zbiA+PiAzMiwgaW5zbiwgY2lhKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBzaW1fZW5naW5lX2Fib3J0IChzZCwgU1RBVEVfQ1BVIChzZCwgMCksIGNpYSwKKwkJCSAgICAiaW50ZXJuYWwgZXJyb3IgLSBlbmdpbmVfcnVuX3VudGlsX3N0b3AgLSBiYWQgc3dpdGNoIik7CisJICBuaWEgPSAtMTsKKwl9CisKKyAgICAgIGlmIChUUkFDRV9BQ1RJT04pCisJeworCSAgaWYgKFRSQUNFX0FDVElPTiAmIFRSQUNFX0FDVElPTl9DQUxMKQorCSAgICBjYWxsX29jY3VycmVkIChzZCwgU1RBVEVfQ1BVIChzZCwgMCksIGNpYSwgbmlhKTsKKworCSAgaWYgKFRSQUNFX0FDVElPTiAmIFRSQUNFX0FDVElPTl9SRVRVUk4pCisJICAgIHJldHVybl9vY2N1cnJlZCAoc2QsIFNUQVRFX0NQVSAoc2QsIDApLCBjaWEsIG5pYSk7CisKKwkgIFRSQUNFX0FDVElPTiA9IDA7CisJfQorCisgICAgICAvKiBDaGVjayBub3cgdG8gc2VlIGlmIHdlIG5lZWQgdG8gcmVzZXQgdGhlIFJQIGJpdCBpbiB0aGUgUFNXLgorCSBUaGVyZSBhcmUgdGhyZWUgY29uZGl0aW9ucyBmb3IgdGhpcywgdGhlIFJQIGJpdCBpcyBhbHJlYWR5CisJIHNldCAoanVzdCBhIHNwZWVkIG9wdGltaXphdGlvbiksIHRoZSBpbnN0cnVjdGlvbiB3ZSBqdXN0CisJIGV4ZWN1dGVkIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uIGluIHRoZSBsb29wLCBhbmQgdGhlIHJlcGVhdAorCSBjb3VudCBpcyBjdXJyZW50bHkgemVyby4gKi8KKworICAgICAgcnBfd2FzX3NldCA9IFBTV19WQUwgKFBTV19SUCk7CisgICAgICBpZiAocnBfd2FzX3NldCAmJiAoUEMgPT0gUlBUX0UpICYmIFJQVF9DID09IDApCisJeworCSAgUFNXX1NFVCAoUFNXX1JQLCAwKTsKKwl9CisKKyAgICAgIC8qIE5vdyB1cGRhdGUgdGhlIFBDLiAgSWYgd2UganVzdCBleGVjdXRlZCBhIGp1bXAgaW5zdHJ1Y3Rpb24sCisJIHRoYXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGV2ZXJ5dGhpbmcgZWxzZS4gIE5leHQgY29tZXMKKwkgYnJhbmNoaW5nIGJhY2sgdG8gUlBUX1MgYXMgYSByZXN1bHQgb2YgYSBsb29wLiAgRmluYWxseSwgdGhlCisJIGRlZmF1bHQgaXMgdG8gc2ltcGx5IGFkdmFuY2UgdG8gdGhlIG5leHQgaW5saW5lCisJIGluc3RydWN0aW9uLiAqLworCisgICAgICBpZiAobmlhICE9IElOVkFMSURfSU5TVFJVQ1RJT05fQUREUkVTUykKKwl7CisJICBQQyA9IG5pYTsKKwl9CisgICAgICBlbHNlIGlmIChycF93YXNfc2V0ICYmIHJwdF9jX3dhc19ub256ZXJvICYmIChQQyA9PSBSUFRfRSkpCisJeworCSAgUEMgPSBSUFRfUzsKKwl9CisgICAgICBlbHNlCisJeworCSAgUEMgPSBjaWEgKyA4OworCX0KKworICAgICAgLyogQ2hlY2sgZm9yIEREQlQgKGRlYnVnZ2VyIGRlYnVnIHRyYXApIGNvbmRpdGlvbi4gIERvIHRoaXMgYWZ0ZXIKKwkgdGhlIHJlcGVhdCBibG9jayBjaGVja3Mgc28gdGhlIGV4Y3Vyc2lvbiB0byB0aGUgdHJhcCBoYW5kbGVyIGRvZXMKKwkgbm90IGFsdGVyIGxvb3Bpbmcgc3RhdGUuICovCisKKyAgICAgIGlmIChjaWEgPT0gSUJBICYmIFBTV19WQUwgKFBTV19EQikpCisJeworCSAgRFBDID0gUEM7CisJICBQU1dfU0VUIChQU1dfRUEsIDEpOworCSAgRFBTVyA9IFBTVzsKKwkgIC8qIGNsZWFyIGFsbCBiaXRzIGluIFBTVyBleGNlcHQgU00gKi8KKwkgIFBTVyAmPSBCSVQzMiAoUFNXX1NNKTsKKwkgIC8qIGFkZCBEUyBiaXQgKi8KKwkgIFBTVyB8PSBCSVQzMiAoUFNXX0RTKTsKKwkgIC8qIGRpc3BhdGNoIHRvIEREQlQgaGFuZGxlciAqLworCSAgUEMgPSAweGZmZmZmMTI4OyAvKiBkZWJ1Z2dlcl9kZWJ1Z190cmFwX2FkZHJlc3MgKi8KKwl9CisKKyAgICAgIC8qIHByb2Nlc3MgYW55IGV2ZW50cyAqLworICAgICAgLyogRklYTUUgLSBzaG91bGQgTC0+UiBvciBMPC1SIGluc25zIGNvdW50IGFzIHR3byBjeWNsZXM/ICovCisgICAgICBpZiAoc2ltX2V2ZW50c190aWNrIChzZCkpCisJeworCSAgc2ltX2V2ZW50c19wcm9jZXNzIChzZCk7CisJfQorICAgIH0gIAorfQorCisKKy8qIGQzMHYgZXh0ZXJuYWwgaW50ZXJydXB0IGhhbmRsZXIuCisKKyAgIE5vdGU6IFRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgcHJvcGVyIGludGVycnVwdCBkZWxpdmVyeQorICAgbWVjaGFuaXNtLiAgVGhpcyBpbnRlcnJ1cHQgbWVjaGFuaXNtIGRpc2NhcmRzIGxhdGVyIGludGVycnVwdHMgaWYKKyAgIGFuIGVhcmxpZXIgaW50ZXJydXB0IGhhc24ndCBiZWVuIGRlbGl2ZXJlZC4KKworICAgTm90ZTogVGhpcyBpbnRlcnJ1cHQgbWVjaGFuaXNtIGRvZXMgbm90IHJlc2V0IGl0cyBzZWxmIHdoZW4gdGhlCisgICBzaW11bGF0b3IgaXMgcmUtb3BlbmVkLiAqLworCit2b2lkCitkMzB2X2ludGVycnVwdF9ldmVudCAoU0lNX0RFU0Mgc2QsCisJCSAgICAgIHZvaWQgKmRhdGEpCit7CisgIGlmIChQU1dfVkFMIChQU1dfSUUpKQorICAgIC8qIGludGVycnVwdHMgbm90IG1hc2tlZCAqLworICAgIHsKKyAgICAgIC8qIHNjcnViIGFueSBwZW5kaW5nIGludGVycnVwdCAqLworICAgICAgaWYgKHNkLT5wZW5kaW5nX2ludGVycnVwdCAhPSBOVUxMKQorCXNpbV9ldmVudHNfZGVzY2hlZHVsZSAoc2QsIHNkLT5wZW5kaW5nX2ludGVycnVwdCk7CisgICAgICAvKiBkZWxpdmVyICovCisgICAgICBiUFNXID0gUFNXOworICAgICAgYlBDID0gUEM7CisgICAgICBQU1cgPSAwOworICAgICAgUEMgPSAweGZmZmZmMTM4OyAvKiBleHRlcm5hbCBpbnRlcnJ1cHQgKi8KKyAgICAgIGRvX3N0YWNrX3N3YXAgKHNkKTsKKyAgICB9CisgIGVsc2UgaWYgKHNkLT5wZW5kaW5nX2ludGVycnVwdCA9PSBOVUxMKQorICAgIC8qIGludGVycnVwdHMgbWFza2VkIGFuZCBubyBpbnRlcnJ1cHQgcGVuZGluZyAqLworICAgIHsKKyAgICAgIHNkLT5wZW5kaW5nX2ludGVycnVwdCA9IHNpbV9ldmVudHNfc2NoZWR1bGUgKHNkLCAxLAorCQkJCQkJICAgZDMwdl9pbnRlcnJ1cHRfZXZlbnQsCisJCQkJCQkgICBkYXRhKTsKKyAgICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2QzMHYvaWMtZDMwdiBiL3NpbS9kMzB2L2ljLWQzMHYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhMTg0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9kMzB2L2ljLWQzMHYKQEAgLTAsMCArMSw4MCBAQAorIyBJbnN0cnVjdGlvbiBjYWNoZSBydWxlcworIworIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisjCisjICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworY29tcHV0ZTpSQTpSQTo6Citjb21wdXRlOlJBOlJhOnNpZ25lZDMyICo6KCZHUFJbUkFdKQorY29tcHV0ZTpSQTpSYUg6c2lnbmVkMTYgKjpBSDJfNChSYSkKK2NvbXB1dGU6UkE6UmFMOnNpZ25lZDE2ICo6QUwyXzQoUmEpCitjb21wdXRlOlJBOnZhbF9SYTpzaWduZWQzMjooUkEgPT0gMCA/IDAgOiBHUFJbUkFdKQorIworY29tcHV0ZTpSQjpSQjo6Citjb21wdXRlOlJCOlJiOnNpZ25lZDMyOihSQiA9PSAwID8gMCA6IEdQUltSQl0pCitjb21wdXRlOlJCOlJiVTp1bnNpZ25lZDMyOihSQiA9PSAwID8gMCA6IEdQUltSQl0pCitjb21wdXRlOlJCOlJiSDpzaWduZWQxNjpWSDJfNChSYikKK2NvbXB1dGU6UkI6UmJMOnNpZ25lZDE2OlZMMl80KFJiKQorY29tcHV0ZTpSQjpSYkhVOnVuc2lnbmVkMTY6VkgyXzQoUmIpCitjb21wdXRlOlJCOlJiTFU6dW5zaWduZWQxNjpWTDJfNChSYikKKyMKK2NvbXB1dGU6UkM6UkM6OgorY29tcHV0ZTpSQzpSYzpzaWduZWQzMjooUkMgPT0gMCA/IDAgOiBHUFJbUkNdKQorY29tcHV0ZTpSQzpSY1U6dW5zaWduZWQzMjooUkMgPT0gMCA/IDAgOiBHUFJbUkNdKQorY29tcHV0ZTpSQzpSY0g6c2lnbmVkMTY6VkgyXzQoUmMpCitjb21wdXRlOlJDOlJjTDpzaWduZWQxNjpWTDJfNChSYykKKyMKKyMKK2NvbXB1dGU6SU1NXzZTOklNTV82Uzo6Citjb21wdXRlOklNTV82UzppbW06c2lnbmVkMzI6U0VYVDMyKElNTV82UywgMzIgLSA2KQorIyBOQiAtIGZvciBzaG9ydCBpbW1bSExdIGFyZSB0aGUgc2FtZSB2YWx1ZQorY29tcHV0ZTpJTU1fNlM6aW1tSEw6c2lnbmVkMzI6KChpbW0gPDwgMTYpIHwgTUFTS0VEMzIoaW1tLCAxNiwgMzEpKQorY29tcHV0ZTpJTU1fNlM6aW1tSDpzaWduZWQzMjppbW0KK2NvbXB1dGU6SU1NXzZTOmltbUw6c2lnbmVkMzI6aW1tCitjb21wdXRlOklNTV82UzppbW1fNjpzaWduZWQzMjpJTU1fNlMKK2NvbXB1dGU6SU1NXzZTOmltbV81OnNpZ25lZDMyOkxTTUFTS0VEMzIoSU1NXzZTLCA0LCAwKQorY29tcHV0ZTpJTU1fNlM6aW1tXzZ1OnVuc2lnbmVkMzI6KElNTV82UyAmIDB4M2YpCisjCitjb21wdXRlOlJDOnBjZGlzcDpzaWduZWQzMjooUmMgJiB+MHg3KQorY29tcHV0ZTpSQzpwY2FkZHI6c2lnbmVkMzI6cGNkaXNwCisjCitjb21wdXRlOklNTV8xOFM6SU1NXzE4Uzo6Citjb21wdXRlOklNTV8xOFM6cGNkaXNwOnNpZ25lZDMyOihTRVhUMzIoSU1NXzE4UywgMzIgLSAxOCkgPDwgMykKK2NvbXB1dGU6SU1NXzE4UzpwY2FkZHI6c2lnbmVkMzI6cGNkaXNwCitjb21wdXRlOklNTV8xMlM6SU1NXzEyUzo6Citjb21wdXRlOklNTV8xMlM6cGNkaXNwOnNpZ25lZDMyOihTRVhUMzIoSU1NXzEyUywgMzIgLSAxMikgPDwgMykKK2NvbXB1dGU6SU1NXzEyUzpwY2FkZHI6c2lnbmVkMzI6cGNkaXNwCisjCitjb21wdXRlOklNTV84TDpJTU1fOEw6OgorY29tcHV0ZTpJTU1fMThMOklNTV8xOEw6OgorY29tcHV0ZTpJTU1fNkw6SU1NXzZMOjoKK2NvbXB1dGU6SU1NXzZMOmltbTpzaWduZWQzMjooKCgoSU1NXzZMIDw8IDgpIHwgSU1NXzhMKSA8PCAxOCkgfCBJTU1fMThMKQorY29tcHV0ZTpJTU1fNkw6aW1tSEw6c2lnbmVkMzI6aW1tCitjb21wdXRlOklNTV82TDppbW1IOnNpZ25lZDMyOkVYVFJBQ1RFRDMyKGltbSwgMCwgMTUpCitjb21wdXRlOklNTV82TDppbW1MOnNpZ25lZDMyOkVYVFJBQ1RFRDMyKGltbSwgMTYsIDMxKQorY29tcHV0ZTpJTU1fNkw6cGNkaXNwOnNpZ25lZDMyOihpbW0gJiB+MHg3KQorY29tcHV0ZTpJTU1fNkw6cGNhZGRyOnNpZ25lZDMyOnBjZGlzcAorIworIworY29tcHV0ZTpTUkNfNjpTUkNfNjo6Citjb21wdXRlOlNSQ182OnNyYzp1bnNpZ25lZDMyOihYWCA9PSAyID8gU0VYVDMyKFNSQ182LCAzMiAtIDYpIDogR1BSW1NSQ182XSkKKyMKKyMKK2NvbXB1dGU6QUE6QUE6OgorY29tcHV0ZTpBQTpBYTp1bnNpZ25lZDY0KjooKENQVSktPnJlZ3MuYWNjdW11bGF0b3IgKyBBQSkKK2NvbXB1dGU6QUI6QUI6OgorY29tcHV0ZTpBQjpBYjp1bnNpZ25lZDY0KjooKENQVSktPnJlZ3MuYWNjdW11bGF0b3IgKyBBQikKZGlmZiAtLWdpdCBhL3NpbS9kMzB2L3NpbS1jYWxscy5jIGIvc2ltL2QzMHYvc2ltLWNhbGxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMxOTUyOQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9kMzB2L3NpbS1jYWxscy5jCkBAIC0wLDAgKzEsMzY0IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorICAgIENvcHlyaWdodCAoQykgMTk5NywgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJzaW0tb3B0aW9ucy5oIgorCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic2ltLXV0aWxzLmgiCisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh0bWVtX3NpemUgPSAxMDI0KjEwMjQqODsJLyogOCBtZWcgaXMgdGhlIG1heGltdW0gbGlzdGVkIGluIHRoZSBhcmNoLiBtYW51YWwgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKiBnZXRfaW5zbl9uYW1lIChzaW1fY3B1ICosIGludCk7CisKKyNkZWZpbmUgU0lNX0FERFIgdW5zaWduZWQKKworCisjZGVmaW5lIE9QVElPTl9UUkFDRV9DQUxMCTIwMAorI2RlZmluZSBPUFRJT05fVFJBQ0VfVFJBUERVTVAJMjAxCisjZGVmaW5lIE9QVElPTl9FWFRNRU1fU0laRQkyMDIKKworc3RhdGljIFNJTV9SQworZDMwdl9vcHRpb25faGFuZGxlciAoU0lNX0RFU0Mgc2QsCisJCSAgICAgc2ltX2NwdSAqY3B1LAorCQkgICAgIGludCBvcHQsCisJCSAgICAgY2hhciAqYXJnLAorCQkgICAgIGludCBjb21tYW5kX3ApCit7CisgIGNoYXIgKnN1ZmZpeDsKKworICBzd2l0Y2ggKG9wdCkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRJT05fVFJBQ0VfQ0FMTDoKKyAgICAgIGlmIChhcmcgPT0gTlVMTCB8fCBzdHJjbXAgKGFyZywgInllcyIpID09IDAgfHwgc3RyY21wIChhcmcsICJvbiIpID09IDApCisJVFJBQ0VfQ0FMTF9QID0gMTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAibm8iKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAib2ZmIikgPT0gMCkKKwlUUkFDRV9DQUxMX1AgPSAwOworICAgICAgZWxzZQorCXsKKwkgIHNpbV9pb19lcHJpbnRmIChzZCwgIlVucmVjb25pemVkIC0tdHJhY2UtY2FsbCBvcHRpb24gYCVzJ1xuIiwgYXJnKTsKKwkgIHJldHVybiBTSU1fUkNfRkFJTDsKKwl9CisgICAgICByZXR1cm4gU0lNX1JDX09LOworCisgICAgY2FzZSBPUFRJT05fVFJBQ0VfVFJBUERVTVA6CisgICAgICBpZiAoYXJnID09IE5VTEwgfHwgc3RyY21wIChhcmcsICJ5ZXMiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAib24iKSA9PSAwKQorCVRSQUNFX1RSQVBfUCA9IDE7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIm5vIikgPT0gMCB8fCBzdHJjbXAgKGFyZywgIm9mZiIpID09IDApCisJVFJBQ0VfVFJBUF9QID0gMDsKKyAgICAgIGVsc2UKKwl7CisJICBzaW1faW9fZXByaW50ZiAoc2QsICJVbnJlY29uaXplZCAtLXRyYWNlLWNhbGwgb3B0aW9uIGAlcydcbiIsIGFyZyk7CisJICByZXR1cm4gU0lNX1JDX0ZBSUw7CisJfQorICAgICAgcmV0dXJuIFNJTV9SQ19PSzsKKworICAgIGNhc2UgT1BUSU9OX0VYVE1FTV9TSVpFOgorICAgICAgaWYgKGFyZyA9PSBOVUxMIHx8ICFpc2RpZ2l0ICgqYXJnKSkKKwl7CisJICBzaW1faW9fZXByaW50ZiAoc2QsICJJbnZhbGlkIG1lbW9yeSBzaXplIGAlcyciLCBhcmcpOworCSAgcmV0dXJuIFNJTV9SQ19GQUlMOworCX0KKworICAgICAgc3VmZml4ID0gYXJnOworICAgICAgZXh0bWVtX3NpemUgPSBzdHJ0b2wgKGFyZywgJnN1ZmZpeCwgMCk7CisgICAgICBpZiAoKnN1ZmZpeCA9PSAnbScgfHwgKnN1ZmZpeCA9PSAnTScpCisJZXh0bWVtX3NpemUgPDw9IDIwOworICAgICAgZWxzZSBpZiAoKnN1ZmZpeCA9PSAnaycgfHwgKnN1ZmZpeCA9PSAnSycpCisJZXh0bWVtX3NpemUgPDw9IDEwOworICAgICAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSBkZWxldGUgMHg4MDAwMDAwMCIpOworICAgICAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSByZWdpb24gMHg4MDAwMDAwMCwweCVseCIsIGV4dG1lbV9zaXplKTsKKworICAgICAgcmV0dXJuIFNJTV9SQ19PSzsKKyAgICB9CisKKyAgc2ltX2lvX2VwcmludGYgKHNkLCAiVW5rbm93biBvcHRpb24gKCVkKVxuIiwgb3B0KTsKKyAgcmV0dXJuIFNJTV9SQ19GQUlMOworfQorCitzdGF0aWMgY29uc3QgT1BUSU9OIGQzMHZfb3B0aW9uc1tdID0KK3sKKyAgeyB7InRyYWNlLWNhbGwiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RSQUNFX0NBTEx9LAorICAgICAgJ1wwJywgIm9ufG9mZiIsICJFbmFibGUgdHJhY2luZyBvZiBjYWxscyBhbmQgcmV0dXJucywgY2hlY2tpbmcgc2F2ZWQgcmVnaXN0ZXJzIiwKKyAgICAgIGQzMHZfb3B0aW9uX2hhbmRsZXIgfSwKKyAgeyB7InRyYWNlLXRyYXBkdW1wIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFDRV9UUkFQRFVNUH0sCisgICAgICAnXDAnLCAib258b2ZmIiwKKyNpZiBUUkFQRFVNUAorICAgICJUcmFwcyAwLi4zMCBkdW1wIG91dCBhbGwgb2YgdGhlIHJlZ2lzdGVycyAoZGVmYXVsdHMgb24pIiwKKyNlbHNlCisgICAgIlRyYXBzIDAuLjMwIGR1bXAgb3V0IGFsbCBvZiB0aGUgcmVnaXN0ZXJzIiwKKyNlbmRpZgorICAgICAgZDMwdl9vcHRpb25faGFuZGxlciB9LAorICB7IHsiZXh0bWVtLXNpemUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYVE1FTV9TSVpFfSwKKyAgICAnXDAnLCAic2l6ZSIsICJDaGFuZ2Ugc2l6ZSBvZiBleHRlcm5hbCBtZW1vcnksIGRlZmF1bHQgOCBtZWciLAorICAgIGQzMHZfb3B0aW9uX2hhbmRsZXIgfSwKKyAgeyB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9LCAnXDAnLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKKy8qIFJldHVybiBuYW1lIG9mIGFuIGluc24sIHVzZWQgYnkgaW5zbiBwcm9maWxpbmcuICAqLworCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfaW5zbl9uYW1lIChzaW1fY3B1ICpjcHUsIGludCBpKQoreworICByZXR1cm4gaXRhYmxlW2ldLm5hbWU7Cit9CisKKy8qIFN0cnVjdHVyZXMgdXNlZCBieSB0aGUgc2ltdWxhdG9yLCBmb3IgZ2RiIGp1c3QgaGF2ZSBzdGF0aWMgc3RydWN0dXJlcyAqLworCitTSU1fREVTQworc2ltX29wZW4gKFNJTV9PUEVOX0tJTkQga2luZCwKKwkgIGhvc3RfY2FsbGJhY2sgKmNhbGxiYWNrLAorCSAgc3RydWN0IF9iZmQgKmFiZmQsCisJICBjaGFyICoqYXJndikKK3sKKyAgU0lNX0RFU0Mgc2QgPSBzaW1fc3RhdGVfYWxsb2MgKGtpbmQsIGNhbGxiYWNrKTsKKworICAvKiBGSVhNRTogd2F0Y2hwb2ludHMgY29kZSBzaG91bGRuJ3QgbmVlZCB0aGlzICovCisgIFNUQVRFX1dBVENIUE9JTlRTIChzZCktPnBjID0gJihQQyk7CisgIFNUQVRFX1dBVENIUE9JTlRTIChzZCktPnNpemVvZl9wYyA9IHNpemVvZiAoUEMpOworICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5pbnRlcnJ1cHRfaGFuZGxlciA9IGQzMHZfaW50ZXJydXB0X2V2ZW50OworCisgIC8qIEluaXRpYWxpemUgdGhlIG1lY2hhbmlzbSBmb3IgZG9pbmcgaW5zbiBwcm9maWxpbmcuICAqLworICBDUFVfSU5TTl9OQU1FIChTVEFURV9DUFUgKHNkLCAwKSkgPSBnZXRfaW5zbl9uYW1lOworICBDUFVfTUFYX0lOU05TIChTVEFURV9DUFUgKHNkLCAwKSkgPSBucl9pdGFibGVfZW50cmllczsKKworI2lmZGVmIFRSQVBEVU1QCisgIFRSQUNFX1RSQVBfUCA9IFRSQVBEVU1QOworI2VuZGlmCisKKyAgaWYgKHNpbV9wcmVfYXJndl9pbml0IChzZCwgYXJndlswXSkgIT0gU0lNX1JDX09LKQorICAgIHJldHVybiAwOworICBzaW1fYWRkX29wdGlvbl90YWJsZSAoc2QsIE5VTEwsIGQzMHZfb3B0aW9ucyk7CisKKyAgLyogTWVtb3J5IGFuZCBFRVBST00gKi8KKyAgLyogaW50ZXJuYWwgaW5zdHJ1Y3Rpb24gUkFNIC0gZml4ZWQgKi8KKyAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSByZWdpb24gMCwweDEwMDAwIik7CisgIC8qIGludGVybmFsIGRhdGEgUkFNIC0gZml4ZWQgKi8KKyAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSByZWdpb24gMHgyMDAwMDAwMCwweDgwMDAiKTsKKyAgLyogY29udHJvbCByZWdpc3RlciBkdW1teSBhcmVhICovCisgIHNpbV9kb19jb21tYW5kZiAoc2QsICJtZW1vcnkgcmVnaW9uIDB4NDAwMDAwMDAsMHgxMDAwMCIpOworICAvKiBleHRlcm5hbCBSQU0gKi8KKyAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSByZWdpb24gMHg4MDAwMDAwMCwweCVseCIsIGV4dG1lbV9zaXplKTsKKyAgLyogRUlUIFJBTSAqLworICBzaW1fZG9fY29tbWFuZGYgKHNkLCAibWVtb3J5IHJlZ2lvbiAweGZmZmZmMDAwLDB4MTAwMCIpOworCisgIC8qIGdldG9wdCB3aWxsIHByaW50IHRoZSBlcnJvciBtZXNzYWdlIHNvIHdlIGp1c3QgaGF2ZSB0byBleGl0IGlmIHRoaXMgZmFpbHMuCisgICAgIEZJWE1FOiBIbW1tLi4uICBpbiB0aGUgY2FzZSBvZiBnZGIgd2UgbmVlZCBnZXRvcHQgdG8gY2FsbAorICAgICBwcmludF9maWx0ZXJlZC4gICovCisgIGlmIChzaW1fcGFyc2VfYXJncyAoc2QsIGFyZ3YpICE9IFNJTV9SQ19PSykKKyAgICB7CisgICAgICAvKiBVbmluc3RhbGwgdGhlIG1vZHVsZXMgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLAorCSBmaWxlIGRlc2NyaXB0b3IgbGVha3MsIGV0Yy4gICovCisgICAgICBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoc2QpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIGNoZWNrIGZvci9lc3RhYmxpc2ggdGhlIGEgcmVmZXJlbmNlIHByb2dyYW0gaW1hZ2UgKi8KKyAgaWYgKHNpbV9hbmFseXplX3Byb2dyYW0gKHNkLAorCQkJICAgKFNUQVRFX1BST0dfQVJHViAoc2QpICE9IE5VTEwKKwkJCSAgICA/ICpTVEFURV9QUk9HX0FSR1YgKHNkKQorCQkJICAgIDogTlVMTCksCisJCQkgICBhYmZkKSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBlc3RhYmxpc2ggYW55IHJlbWFpbmluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKyAgaWYgKHNpbV9jb25maWcgKHNkKSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoc2ltX3Bvc3RfYXJndl9pbml0IChzZCkgIT0gU0lNX1JDX09LKQorICAgIHsKKyAgICAgIC8qIFVuaW5zdGFsbCB0aGUgbW9kdWxlcyB0byBhdm9pZCBtZW1vcnkgbGVha3MsCisJIGZpbGUgZGVzY3JpcHRvciBsZWFrcywgZXRjLiAgKi8KKyAgICAgIHNpbV9tb2R1bGVfdW5pbnN0YWxsIChzZCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIHNkOworfQorCisKK3ZvaWQKK3NpbV9jbG9zZSAoU0lNX0RFU0Mgc2QsIGludCBxdWl0dGluZykKK3sKKyAgLyogVW5pbnN0YWxsIHRoZSBtb2R1bGVzIHRvIGF2b2lkIG1lbW9yeSBsZWFrcywKKyAgICAgZmlsZSBkZXNjcmlwdG9yIGxlYWtzLCBldGMuICAqLworICBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoc2QpOworfQorCisKK1NJTV9SQworc2ltX2NyZWF0ZV9pbmZlcmlvciAoU0lNX0RFU0Mgc2QsCisJCSAgICAgc3RydWN0IF9iZmQgKmFiZmQsCisJCSAgICAgY2hhciAqKmFyZ3YsCisJCSAgICAgY2hhciAqKmVudnApCit7CisgIC8qIGNsZWFyIGFsbCByZWdpc3RlcnMgKi8KKyAgbWVtc2V0ICgmU1RBVEVfQ1BVIChzZCwgMCktPnJlZ3MsIDAsIHNpemVvZiAoU1RBVEVfQ1BVIChzZCwgMCktPnJlZ3MpKTsKKyAgRUlUX1ZCID0gRUlUX1ZCX0RFRkFVTFQ7CisgIFNUQVRFX0NQVSAoc2QsIDApLT51bml0ID0gYW55X3VuaXQ7CisgIHNpbV9tb2R1bGVfaW5pdCAoc2QpOworICBpZiAoYWJmZCAhPSBOVUxMKQorICAgIFBDID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKKyAgZWxzZQorICAgIFBDID0gMHhmZmZmZjAwMDsgLyogcmVzZXQgdmFsdWUgKi8KKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKwordm9pZAorc2ltX2RvX2NvbW1hbmQgKFNJTV9ERVNDIHNkLCBjaGFyICpjbWQpCit7CisgIGlmIChzaW1fYXJnc19jb21tYW5kIChzZCwgY21kKSAhPSBTSU1fUkNfT0spCisgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJVbmtub3duIGNvbW1hbmQgYCVzJ1xuIiwgY21kKTsKK30KKworLyogVGhlIGZvbGxvd2luZyByZWdpc3RlciBkZWZpbml0aW9ucyB3ZXJlIHJpcHBlZCBvZmYgZnJvbQorICAgZ2RiL2NvbmZpZy90bS1kMzB2LmguICBJZiBhbnkgb2YgdGhvc2UgZGVmcyBjaGFuZ2VzLCB0aGlzIHRhYmxlIG5lZWRzIHRvCisgICBiZSB1cGRhdGVkLiAgKi8KKworI2RlZmluZSBOVU1fUkVHUyA4NgorCisjZGVmaW5lIFIwX1JFR05VTQkwCisjZGVmaW5lIEZQX1JFR05VTQkxMQorI2RlZmluZSBMUl9SRUdOVU0gCTYyCisjZGVmaW5lIFNQX1JFR05VTSAJNjMKKyNkZWZpbmUgU1BJX1JFR05VTQk2NAkvKiBJbnRlcnJ1cHQgc3RhY2sgcG9pbnRlciAqLworI2RlZmluZSBTUFVfUkVHTlVNCTY1CS8qIFVzZXIgc3RhY2sgcG9pbnRlciAqLworI2RlZmluZSBDUkVHU19TVEFSVAk2NgorCisjZGVmaW5lIFBTV19SRUdOVU0gCShDUkVHU19TVEFSVCArIDApIC8qIHBzdywgYnBzdywgb3IgZHBzdz8/PyAqLworI2RlZmluZSAgICBQU1dfU00gMHg4MDAwMDAwMAkvKiBTdGFjayBtb2RlOiAwID09IGludGVycnVwdCAoU1BJKSwKKwkJCQkJICAgICAgIDEgPT0gdXNlciAoU1BVKSAqLworI2RlZmluZSBCUFNXX1JFR05VTQkoQ1JFR1NfU1RBUlQgKyAxKSAvKiBCYWNrdXAgUFNXIChvbiBpbnRlcnJ1cHQpICovCisjZGVmaW5lIFBDX1JFR05VTSAJKENSRUdTX1NUQVJUICsgMikgLyogcGMsIGJwYywgb3IgZHBjPz8/ICovCisjZGVmaW5lIEJQQ19SRUdOVU0gCShDUkVHU19TVEFSVCArIDMpIC8qIEJhY2t1cCBQQyAob24gaW50ZXJydXB0KSAqLworI2RlZmluZSBEUFNXX1JFR05VTQkoQ1JFR1NfU1RBUlQgKyA0KSAvKiBCYWNrdXAgUFNXIChvbiBkZWJ1ZyB0cmFwKSAqLworI2RlZmluZSBEUENfUkVHTlVNIAkoQ1JFR1NfU1RBUlQgKyA1KSAvKiBCYWNrdXAgUEMgKG9uIGRlYnVnIHRyYXApICovCisjZGVmaW5lIFJQVF9DX1JFR05VTQkoQ1JFR1NfU1RBUlQgKyA3KSAvKiBMb29wIGNvdW50ICovCisjZGVmaW5lIFJQVF9TX1JFR05VTQkoQ1JFR1NfU1RBUlQgKyA4KSAvKiBMb29wIHN0YXJ0IGFkZHJlc3MqLworI2RlZmluZSBSUFRfRV9SRUdOVU0JKENSRUdTX1NUQVJUICsgOSkgLyogTG9vcCBlbmQgYWRkcmVzcyAqLworI2RlZmluZSBNT0RfU19SRUdOVU0JKENSRUdTX1NUQVJUICsgMTApCisjZGVmaW5lIE1PRF9FX1JFR05VTQkoQ1JFR1NfU1RBUlQgKyAxMSkKKyNkZWZpbmUgSUJBX1JFR05VTQkoQ1JFR1NfU1RBUlQgKyAxNCkgLyogSW5zdHJ1Y3Rpb24gYnJlYWsgYWRkcmVzcyAqLworI2RlZmluZSBFSVRfVkJfUkVHTlVNCShDUkVHU19TVEFSVCArIDE1KSAvKiBWZWN0b3IgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIElOVF9TX1JFR05VTQkoQ1JFR1NfU1RBUlQgKyAxNikgLyogSW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBJTlRfTV9SRUdOVU0JKENSRUdTX1NUQVJUICsgMTcpIC8qIEludGVycnVwdCBtYXNrICovCisjZGVmaW5lIEEwX1JFR05VTSAJODQKKyNkZWZpbmUgQTFfUkVHTlVNIAk4NQorCitpbnQKK3NpbV9mZXRjaF9yZWdpc3RlciAoc2QsIHJlZ25vLCBidWYsIGxlbmd0aCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCByZWdubzsKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgICBpbnQgbGVuZ3RoOworeworICBpZiAocmVnbm8gPCBBMF9SRUdOVU0pCisgICAgeworICAgICAgdW5zaWduZWQzMiByZWc7CisKKyAgICAgIGlmIChyZWdubyA8PSBSMF9SRUdOVU0gKyA2MykKKwlyZWcgPSBzZC0+Y3B1WzBdLnJlZ3MuZ2VuZXJhbF9wdXJwb3NlW3JlZ25vXTsKKyAgICAgIGVsc2UgaWYgKHJlZ25vIDw9IFNQVV9SRUdOVU0pCisJcmVnID0gc2QtPmNwdVswXS5yZWdzLnNwW3JlZ25vIC0gU1BJX1JFR05VTV07CisgICAgICBlbHNlCisJcmVnID0gc2QtPmNwdVswXS5yZWdzLmNvbnRyb2xbcmVnbm8gLSBDUkVHU19TVEFSVF07CisKKyAgICAgIGJ1ZlswXSA9IHJlZyA+PiAyNDsKKyAgICAgIGJ1ZlsxXSA9IHJlZyA+PiAxNjsKKyAgICAgIGJ1ZlsyXSA9IHJlZyA+PiA4OworICAgICAgYnVmWzNdID0gcmVnOworICAgIH0KKyAgZWxzZSBpZiAocmVnbm8gPCBOVU1fUkVHUykKKyAgICB7CisgICAgICB1bnNpZ25lZDMyIHJlZzsKKworICAgICAgcmVnID0gc2QtPmNwdVswXS5yZWdzLmFjY3VtdWxhdG9yW3JlZ25vIC0gQTBfUkVHTlVNXSA+PiAzMjsKKworICAgICAgYnVmWzBdID0gcmVnID4+IDI0OworICAgICAgYnVmWzFdID0gcmVnID4+IDE2OworICAgICAgYnVmWzJdID0gcmVnID4+IDg7CisgICAgICBidWZbM10gPSByZWc7CisKKyAgICAgIHJlZyA9IHNkLT5jcHVbMF0ucmVncy5hY2N1bXVsYXRvcltyZWdubyAtIEEwX1JFR05VTV07CisKKyAgICAgIGJ1Zls0XSA9IHJlZyA+PiAyNDsKKyAgICAgIGJ1Zls1XSA9IHJlZyA+PiAxNjsKKyAgICAgIGJ1Zls2XSA9IHJlZyA+PiA4OworICAgICAgYnVmWzddID0gcmVnOworICAgIH0KKyAgZWxzZQorICAgIGFib3J0ICgpOworICByZXR1cm4gLTE7Cit9CisKK2ludAorc2ltX3N0b3JlX3JlZ2lzdGVyIChzZCwgcmVnbm8sIGJ1ZiwgbGVuZ3RoKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgaW50IHJlZ25vOworICAgICB1bnNpZ25lZCBjaGFyICpidWY7CisgICAgIGludCBsZW5ndGg7Cit7CisgIGlmIChyZWdubyA8IEEwX1JFR05VTSkKKyAgICB7CisgICAgICB1bnNpZ25lZDMyIHJlZzsKKworICAgICAgcmVnID0gKGJ1ZlswXSA8PCAyNCkgfCAoYnVmWzFdIDw8IDE2KSB8IChidWZbMl0gPDwgOCkgfCBidWZbM107CisKKyAgICAgIGlmIChyZWdubyA8PSBSMF9SRUdOVU0gKyA2MykKKwlzZC0+Y3B1WzBdLnJlZ3MuZ2VuZXJhbF9wdXJwb3NlW3JlZ25vXSA9IHJlZzsKKyAgICAgIGVsc2UgaWYgKHJlZ25vIDw9IFNQVV9SRUdOVU0pCisJc2QtPmNwdVswXS5yZWdzLnNwW3JlZ25vIC0gU1BJX1JFR05VTV0gPSByZWc7CisgICAgICBlbHNlCisJc2QtPmNwdVswXS5yZWdzLmNvbnRyb2xbcmVnbm8gLSBDUkVHU19TVEFSVF0gPSByZWc7CisgICAgfQorICBlbHNlIGlmIChyZWdubyA8IE5VTV9SRUdTKQorICAgIHsKKyAgICAgIHVuc2lnbmVkMzIgcmVnOworCisgICAgICByZWcgPSAoYnVmWzBdIDw8IDI0KSB8IChidWZbMV0gPDwgMTYpIHwgKGJ1ZlsyXSA8PCA4KSB8IGJ1ZlszXTsKKworICAgICAgc2QtPmNwdVswXS5yZWdzLmFjY3VtdWxhdG9yW3JlZ25vIC0gQTBfUkVHTlVNXSA9ICh1bnNpZ25lZDY0KXJlZyA8PCAzMjsKKworICAgICAgcmVnID0gKGJ1Zls0XSA8PCAyNCkgfCAoYnVmWzVdIDw8IDE2KSB8IChidWZbNl0gPDwgOCkgfCBidWZbN107CisKKyAgICAgIHNkLT5jcHVbMF0ucmVncy5hY2N1bXVsYXRvcltyZWdubyAtIEEwX1JFR05VTV0gfD0gcmVnOworICAgIH0KKyAgZWxzZQorICAgIGFib3J0ICgpOworICByZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9zaW0vZDMwdi9zaW0tbWFpbi5oIGIvc2ltL2QzMHYvc2ltLW1haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGI4YWEwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2QzMHYvc2ltLW1haW4uaApAQCAtMCwwICsxLDgyIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorICAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgX1NJTV9NQUlOX0hfCisjZGVmaW5lIF9TSU1fTUFJTl9IXworCisvKiBUaGlzIHNpbXVsYXRvciBzdXBvcnRzIHdhdGNocG9pbnRzICovCisjZGVmaW5lIFdJVEhfV0FUQ0hQT0lOVFMgMQorCisjaW5jbHVkZSAic2ltLWJhc2ljcy5oIgorI2luY2x1ZGUgInNpbS1zaWduYWwuaCIKKworLyogbmVlZGVkICovCit0eXBlZGVmIGFkZHJlc3Nfd29yZCBzaW1fY2lhOworI2RlZmluZSBJTlZBTElEX0lOU1RSVUNUSU9OX0FERFJFU1MgKChhZGRyZXNzX3dvcmQpIDAgLSAxKQorCisvKiBUaGlzIHNpbXVsYXRvciBkb2Vzbid0IGNhY2hlIGFueXRoaW5nIHNvIG5vIHNhdmluZyBvZiBjb250ZXh0IGlzCisgICBuZWVkZWQgZHVyaW5nIGVpdGhlciBvZiBhIGhhbHQgb3IgcmVzdGFydCAqLworI2RlZmluZSBTSU1fRU5HSU5FX0hBTFRfSE9PSyhTRCxDUFUsQ0lBKSB3aGlsZSAoMCkKKyNkZWZpbmUgU0lNX0VOR0lORV9SRVNUQVJUX0hPT0soU0QsQ1BVLENJQSkgd2hpbGUgKDApCisKKyNpbmNsdWRlICJzaW0tYmFzZS5oIgorCisvKiBUaGVzZSBhcmUgZ2VuZXJhdGVkIGZpbGVzLiAgKi8KKyNpbmNsdWRlICJpdGFibGUuaCIKKyNpbmNsdWRlICJzX2lkZWNvZGUuaCIKKyNpbmNsdWRlICJsX2lkZWNvZGUuaCIKKworI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgImFsdS5oIgorCisKK3N0cnVjdCBzaW1fc3RhdGUgeworCisgIHNpbV9ldmVudCAqcGVuZGluZ19pbnRlcnJ1cHQ7CisKKyAgLyogdGhlIHByb2Nlc3NvcnMgcHJvcGVyICovCisgIHNpbV9jcHUgY3B1W01BWF9OUl9QUk9DRVNTT1JTXTsKKyNpZiAoV0lUSF9TTVApCisjZGVmaW5lIFNUQVRFX0NQVShzZCwgbikgKCYoc2QpLT5jcHVbbl0pCisjZWxzZQorI2RlZmluZSBTVEFURV9DUFUoc2QsIG4pICgmKHNkKS0+Y3B1WzBdKQorI2VuZGlmCisKKyAgLyogVGhlIGJhc2UgY2xhc3MuICAqLworICBzaW1fc3RhdGVfYmFzZSBiYXNlOworCit9OworCisKKy8qIGRlbGl2ZXIgYW4gaW50ZXJydXB0ICovCitzaW1fZXZlbnRfaGFuZGxlciBkMzB2X2ludGVycnVwdF9ldmVudDsKKworCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU0lNX01BSU5fSF8gKi8KZGlmZiAtLWdpdCBhL3NpbS9kMzB2L3Rjb25maWcuaW4gYi9zaW0vZDMwdi90Y29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NDJiMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZDMwdi90Y29uZmlnLmluCkBAIC0wLDAgKzEsNCBAQAorLyogRDMwViB0YXJnZXQgY29uZmlndXJhdGlvbiBmaWxlLiAgLSotIEMgLSotICovCisKKy8qIERlZmluZSB0aGlzIHRvIGVuYWJsZSB0aGUgaW50cmluc2ljIGJyZWFrcG9pbnQgbWVjaGFuaXNtLiAqLworI2RlZmluZSBTSU1fSEFWRV9CUkVBS1BPSU5UUwpkaWZmIC0tZ2l0IGEvc2ltL2VyYzMyL0NoYW5nZUxvZyBiL3NpbS9lcmMzMi9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkwOGE1MAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9lcmMzMi9DaGFuZ2VMb2cKQEAgLTAsMCArMSw1NzYgQEAKKzE5OTktMDItMTEgIEh1Z28gVHlzb24gIDxobXRAY3lnbnVzLmNvLnVrPgorCisJKiBleGVjLmMgKGRpc3BhdGNoX2luc3RydWN0aW9uKTogCisJQ29ycmVjdCB0aGUgc2Vuc2Ugb2YgdGhlCisJICAgICAgICAgIGlmICghc3BhcmNsaXRlKSB7CisJCSAgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1VOSU1QOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCSAgfQorCWNsYXVzZSB0aGF0IGhhcyBiZWVuIHBhc3RlZCBhcm91bmQ6IGl0J3MgY29ycmVjdCBpbiB0aGUgU0NBTiBhbmQKKwlESVZTY2MgKGRpdmlkZSBzdGVwKSBjYXNlcyAod2hlcmUgaXQgd2FzIHByb2JhYmx5IG9yaWdpbmFsbHkKKwl3cml0dGVuPyksIGJ1dCByZXZlcnNlZCBpbiB0aGUgU0RJViwgU0RJVmNjLCBVRElWLCBVRElWY2MgY2FzZXMKKwlpZS4gaW5zdHJ1Y3Rpb25zIG9ubHkgaW4gdGhlIFNQQVJDIFY4IG9yIFNQQVJDbGl0ZSA4NngKKwlhcmNoaXRlY3R1cmVzLiAgSXQgd2FzIGFsc28gcHJlc2VudCB3aGVuIG5vdCByZXF1aXJlZCBmb3IgU01VTCwKKwlTTVVMY2MsIFVNVUwsIFVNVUxjYyBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgcHJlc2VudCBpbiBhbGwKKwlhcmNoaXRlY3R1cmVzLgorCisxOTk5LTAxLTI1ICBIdWdvIFR5c29uICA8aG10QGN5Z251cy5jby51az4KKworCSogaW50ZXJmLmMgKHJ1bl9zaW0pOiBGaXggYSBidWcgaW4gdGhlIG1haW4gbG9vcCdzIGhhbmRsaW5nIG9mCisJYW5udWxsZWQgZGVsYXkgc2xvdCBpbnN0cnVjdGlvbnMuICBUaGVyZSBpcyBwcmVjZWRlbnQgZm9yIHRoaXMKKwljaGFuZ2U7IHRoZSBfb3RoZXJfIG1haW4gbG9vcCBpbiBzaXMuYyBnZXRzIGl0IHJpZ2h0IGFjY29yZGluZyB0bworCW15IHJlYWRpbmcgb2YgdGhlIGNvZGUuCisKKwlUaGUgYnVnIGlzOiBpZiBhbiBpbnRlcnJ1cHQgaGFwcGVucyB3aGVuIHRoZSBuZXh0IGluc3RydWN0aW9uCisJKGF0IHNyZWdzLT5wYykgaXMgYW5udWxsZWQsIHRoZSB0cmFwIGlzIHRha2VuIChieSBleGVjdXRlX3RyYXAoKSkKKwl3aXRoIHRoZSBjdXJyZW50IHZhbHVlcyBvZiBQQyBhbmQgTlBDLCBzbyB3aGVuIHRoZSB0cmFwIHJldHVybnMsCisJdGhlIGFubnVsbGVkIGluc3RydWN0aW9uIGlzIGluZGVlZCBleGVjdXRlZC4gIEFub3RoZXIgZ2l2ZWF3YXkgaXMKKwl0aGF0IHRoZSBhbm51bCBmbGFnIGlzIGNsZWFyZWQgaW4gZXhlY3V0ZV90cmFwKCk6IHRoZSBpbmZvcm1hdGlvbgorCWlzIGRlbW9uc3RyYWJseSBkaXNjYXJkZWQuCisKKwlUaGUgc29sdXRpb24gaXM6IHBlcmZvcm0gYW5udWxsaW5nIGJlZm9yZSBsb29raW5nIGZvciB0cmFwcywgaW4KKwlmYWN0IGl0J3MgbmVhdGVyIHRvIGRvIGFubnVsbGluZywgc2VlIGlmIHRoZXJlJ3MgYW4gaW50ZXJydXB0IGFuZAorCWlmIG5vdCwgZG8gdGhlIGluc3RydWN0aW9uLCB0aGVuIGhhbmRsZSB0cmFwcyBiZSB0aGV5IGdlbmVyYXRlZCBieQorCWludGVycnVwdHMgcGVuZGluZyBvciBieSB0aGUgaW5zdHJ1Y3Rpb24gd2UgbWlnaHQganVzdCBoYXZlIGRvbmUuCisJVGhhdCdzIHdoYXQgdGhlIHNpcy5jIG9uZSBkb2VzLgorCisxOTk5LTAxLTIwICBIdWdvIFR5c29uICA8aG10QGN5Z251cy5jby51az4KKworCSogc2lzLmg6IEFkZCBhc3IxNyByZWdpc3RlciBmb3Igc3VwcG9ydCBvZiBTcGFyY0xJVEUgKGF0IGxlYXN0IHRoZQorCUhpdGFjaGkgb25lcyBJIGZpbmQgYmVmb3JlIG1lKQorCisJKiBleGVjLmMgKGRpc3BhdGNoX2luc3RydWN0aW9uKTogQ2FzZSBXUlk6IEFsbG93IHdyaXRlIG9mIGFzcjE3IGlmCisJc3BhcmNsaXRlLiAgT3RoZXIgQVNSIG51bWJlcnMgdGhhbiAxNyBvciAwIChZKSB0cmFwIG91dC4KKwlDYXNlIFJEWTogQWxsb3cgcmVhZCBvZiBhc3IxNyBpZiBzcGFyY2xpdGUuICBPdGhlciBBU1JzIGRpdHRvLgorCShleGVjdXRlX3RyYXApOiBEbyBzaW5nbGUtdmVjdG9yLXRyYXBwaW5nIGlmIGFzcjE3IGJpdCAwIGlzIHNldC4KKwkoaW5pdF9yZWdzKTogSW5pdGlhbGl6ZSB5IGFuZCBhc3IxNy4KKwlOQjogSW4gaW5zdHJ1Y3Rpb24tc2V0IHNwYWNlLCB0aGUgWSByZWdpc3RlciBpcyBhc3IwOyB0aGUKKwlpbnN0cnVjdGlvbnMgaGF2ZSBkaWZmZXJlbnQgbmFtZXMgZm9yIGh1bWFuIHJlYXNvbnMgb25seS4KKworCSogc2lzLmM6CisJKiBpbnRlcmYuYzogU2V0IGJvb2xlYW4gbW9kZSB2YXJpYWJsZSBkdW1iaW8gaWYgaW52b2tlZCB3aXRoCisJYXJndW1lbnQgIi1kdW1iaW8iIGFuZCBtZW50aW9uIGl0IG9mIHZlcmJvc2UuCisJKiBlcmMzMi5jOiBpZiAiZHVtYmlvIiBpcyBzZXQsIGRvIG5vdCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhCisJdGVybWluYWwgdHlwZSBkZXZpY2UgYXR0YWNoZWQgdG8gc3RkaW4vc3Rkb3V0LiAgRG8gbm90IHNldAorCWJ1ZmZlcmluZyBvciBtZXNzIHdpdGggdGNzZXRhdHRyIG9yIGRvIGFueSByZWFkIG9wZXJhdGlvbnMgaW4KKwlvcmRlciB0byBtYWtlIFVBUlQgaW50ZXJydXB0czsgbm90IGlucHV0IGRhdGEgaXMgc3VwcG9ydGVkLgorCVRoaXMgaXMgbmVjZXNzYXJ5IHRvIGFsbG93IHRoZSBzaW0gdG8gYmUgdXNlZCB3aXRoaW4gdGhlIGVDb3MKKwl0ZXN0aW5nIGluZnJhc3RydWN0dXJlIHdoZXJlIHN0ZGluL3N0ZG91dCBhcmUgcGlwZXMgdG8gYSBUQ0wKKwlwcm9ncmFtOyB0aGUgc2ltIGhhbmdzIG90aGVyd2lzZS4KKworVGh1IEp1bCAyMyAwNzoxNzowMyAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGV4ZWMuYyAoZGlzcGF0Y2hfaW5zdHJ1Y3Rpb24pOiBBZGQgU1BBUkNsaXRlICdzY2FuJyBpbnN0cnVjdGlvbi4KKworVHVlIEp1bCAgNyAyMToxMjo0MSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGZ1bmMuYyAoYmZkX2xvYWQpOiBBZGQgc3BlY2lhbCBoYW5kbGluZyBvZiBhLm91dCBleGVjdXRhYmxlcy4KKworU2F0IEp1biAxMyAwODozMzoyNSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGZ1bmMuYyAoYmZkX2xvYWQpOiBQcmludCBjb3JyZWN0IGVuZGlhbm5lc3MuCisJKiBpbnRlcmYuYyAocnVuX3NpbSk6IFByaW50IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpZiB2ZXJib3NpdHkgbGV2ZWwKKwlpcyBncmVhdGVyIHRoYW4gMi4KKwkoc2ltX29wZW4pOiBSZXBlYXRlZCAtdiBvcHRpb25zIG5vdyBpbmNyZW1lbnQgdmVyYm9zaXR5IGxldmVsLgorCShzaW1fc3RvcmVfcmVnaXN0ZXIpOiBIYW5kbGUgbGl0dGxlLWVuZGlhbiBjYXNlLgorCShmbHVzaF93aW5kb3cpOiBQcmludCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaWYgdmVyYm9zaXR5IGxldmVsCisJaXMgZ3JlYXRlciB0aGVuIDIuCisKK1R1ZSBKdW4gIDIgMTU6MjA6MzUgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBpbnRlcmYuYyAoc2ltX29wZW4pOiBVc2UgcmV2YW1wZWQgbWVtb3J5X3JlYWQsIHdoaWNoIG1ha2VzCisJYnl0ZS1zd2FwcGluZyB1bm5lY2Vzc2FyeS4gIEFkZCAtc3BhcmNsaXRlLWJvYXJkIG9wdGlvbiBmb3IKKwllbXVsYXRpbmcgUkFNIGZvdW5kIG9uIHR5cGljYWwgU1BBUkNsaXRlIGJvYXJkcy4gIFByaW50CisJZXJyb3IgbWVzc2FnZSBmb3IgdW5yZWNvZ25pemVkIG9wdGlvbi4KKwkqIGVyYzMyLmM6IENoYW5nZSBSQU0gYWRkcmVzcyBhbmQgc2l6ZSBmcm9tIGNvbnN0YW50cyB0byB2YXJpYWJsZXMsCisJdG8gYWxsb3cgZW11bGF0aW9uIG9mIFNQQVJDbGl0ZSBib2FyZCBSQU0uCisJKGZldGNoX2J5dGVzLCBzdG9yZV9ieXRlcyk6IE5ldyBoZWxwZXIgZnVuY3Rpb25zIGZvciByZXZhbXBlZAorCW1lbWVtb3J5X3JlYWQgYW5kIG1lbW9yeV93cml0ZS4KKwkobWVtb3J5X3JlYWQsIG1lbW9yeV93cml0ZSk6IFJld3JpdGUgdG8gc3RvcmUgYnl0ZXMgaW4gdGFyZ2V0CisJYnl0ZSBvcmRlciBpbnN0ZWFkIG9mIHN0b3Jpbmcgd29yZHMgaW4gaG9zdCBieXRlIG9yZGVyOyB0aGlzCisJZ3JlYXRseSBzaW1wbGlmaWVzIHN1cHBvcnQgb2YgbGl0dGxlLWVuZGlhbiBwcm9ncmFtcy4KKwkoZ2V0X21lbV9wdHIpOiBSZW1vdmUgdW5uZWNlc3NhcnkgYnl0ZSBwYXJhbWV0ZXIuCisJKHNpc19tZW1vcnlfd3JpdGUsIHNpc19tZW1vcnlfcmVhZCk6IFN0b3JlIHdvcmRzIGluIHRhcmdldAorCWJ5dGUgb3JkZXIgaW5zdGVhZCBvZiBob3N0IGJ5dGUgb3JkZXIuCisJKGJ5dGVfc3dhcF93b3Jkcyk6IFJlbW92ZSwgbm8gbG9uZ2VyIG5lZWRlZC4KKwkqIHNpcy5oICgoYnl0ZV9zd2FwX3dvcmRzKTogUmVtb3ZlIGRlY2xhcmF0aW9uLCBubyBsb25nZXIgbmVlZGVkLgorCShtZW1vcnlfcmVhZCk6IEFkZCBuZXcgc3ogcGFyYW1ldGVyLgorCSogc2lzLmMgKHJ1bl9zaW0pOiBVc2UgcmV2YW1wZWQgbWVtb3J5X3JlYWQsIHdoaWNoIG1ha2VzCisJYnl0ZS1zd2FwcGluZyB1bm5lY2Vzc2FyeS4KKwkqIGV4ZWMuYyAoZGlzcGF0Y2hfaW5zdHJ1Y3Rpb24pOiBVc2UgcmV2YW1wZWQgbWVtb3J5X3JlYWQsIHdoaWNoCisJbWFrZXMgYnl0ZS1zd2FwcGluZyBhbmQgZG91YmxlLXdvcmQgZmV0Y2hpbmcgdW5uZWNlc3NhcnkuCisJKiBmdW5jLmMgKHNwYXJjbGl0ZV9ib2FyZCk6IERlY2xhcmUgbmV3IHZhcmlhYmxlLgorCShnZXRfcmVnaSk6IEhhbmRsZSBsaXR0bGUtZW5kaWFuIGRhdGEuCisJKGJmZF9sb2FkKTogUmVjb2duaXplIGxpdHRsZS1lbmRpYW4gU1BBUkNsaXRlIGFzIGhhdmluZworCWxpdHRsZS1lbmRpYW4gZGF0YS4KKwkKK0ZyaSBNYXkgMjIgMTQ6MjM6MTYgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBlcmMzMi5jIChwb3J0X2luaXQpOiBQcmludCBtZXNzYWdlcyBvbmx5IGlmIHNpc192ZXJib3NlIGlzIHRydWUuCisJKiBmdW5jLmMgKGJmZF9sb2FkKTogRGl0dG8uCisJKiBpbnRlcmYuYyAoc2ltX29wZW4pOiBEaXR0by4KKworVGh1IE1heSAxNCAyMzoxMDo0OCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIHNpcy5oICh1aW50NjQsIGludDY0KTogRGVmaW5lLgorCSogZXhlYy5jIChTRElWLCBTRElWQ0MsIFVESVYsIFVESVZDQyk6IERlZmluZSBuZXcgb3Bjb2Rlcy4KKwkqIChtdWw2NCk6IFNpbXBsaWZ5IGNhbGN1bGF0aW9uIG9mIG5lZ2F0aXZlIHJlc3VsdC4KKwkqIChkaXY2NCk6IE5ldyBoZWxwZXIgZnVuY3Rpb24gZm9yIDY0LWJpdCBkaXZpc2lvbi4KKwkqIChkaXNwYXRjaF9pbnN0cnVjdGlvbik6IEFkZCBlbXVsYXRpb24gb2YgU0RJViwgU0RJVkNDLCBVRElWLAorCWFuZCBVRElWQ0MuCisJCitXZWQgTWF5IDEzIDE0OjU5OjU0IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogZXJjMzIuYyAoY2xvc2VfcG9ydCk6IERvbid0IGNsb3NlIHN0ZGluOyBpdCBraWxscyBHREIuCisJKGJ5dGVfc3dhcF93b3Jkcyk6IE5ldyBmdW5jdGlvbi4KKwkqIHNpcy5oOiAoYnl0ZV9zd2FwX3dvcmRzKTogRGVjbGFyZS4KKwkqIGludGVyZi5jIChydW5fc2ltKTogQWx3YXlzIGZldGNoIGluc3RydWN0aW9ucyBhcyBiaWctZW5kaWFuLgorCSogc2lzLmMgKHJ1bl9zaW0pOiBEaXR0by4KKworVHVlIEFwciAyOCAxODozMzozMSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitTdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitTdW4gQXByIDI2IDE1OjIwOjE3IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogYWNjb25maWcuaDogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KKworRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworRnJpIEFwciAyNCAxMToxOTo1MiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBzaW5jbHVkZS4KKworU2F0IEFwciAxOCAxMjowMDoxNiAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGZ1bmMuYyAoZGlzcF9mcHUpOiBGaXggYnVpbGQgcHJvYmxlbSBvbiBiaWctZW5kaWFuIGhvc3RzLgorCitXZWQgQXByICA4IDE5OjMzOjM0IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogZXJjMzIuYyAoc2ltX3N0b3ApOiBIYW5kbGUgU0lHSU5UIGdyYWNlZnVsbHkuCisJKiBpbnRlcmYuYyAoc2ltX29wZW4pOiBEb24ndCBjYXRjaCBTSUdJTlQ7IEdEQiB3aWxsIGRvIHRoYXQgZm9yIHVzLgorCitXZWQgQXByICA4IDE4OjI5OjQwIDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogZXhlYy5jIChkaXNwYXRjaF9pbnN0cnVjdGlvbik6IENoYW5nZSBob3cgY2Fycnkgb3V0IGlzIGNhbGN1bGF0ZWQKKwlpbiBESVZTQ0MuICBBZGQgZW11bGF0aW9uIG9mIFNNVUxDQywgVU1VTCwgYW5kIFVNVUxDQy4KKworU2F0IEFwciAgNCAyMDozNjoyNSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIEFwciAgMSAyMToxOToxOCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGVuZC5jOiBVcGRhdGUgdG8gdmVyc2lvbiAyLjcuNSwgZml4IGNvbXBpbGVyIHdhcm5pbmdzIGFuZCBidWdzLgorCSogZXJjMzIuYzogRGl0dG8uCisJKiBleGVjLmM6IERpdHRvLgorCSogZmxvYXQuYzogRGl0dG8uCisJKiBmdW5jLmM6IERpdHRvLgorCSogaGVscC5jOiBEaXR0by4KKwkqIGludGVyZi5jOiBEaXR0by4KKwkqIHNpcy5jOiBEaXR0by4KKwkqIHNpcy5oOiBEaXR0by4KKworRnJpIE1hciAyNyAxNjoxNTo1MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIE1hciAyNSAxMjozNToyOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIE1hciAxOCAxMjozODoxMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVHVlIEZlYiAxNyAxMjo0MToxMSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVyZi5jIChzaW1fc3RvcmVfcmVnaXN0ZXIsIHNpbV9mZXRjaF9yZWdpc3Rlcik6IFBhc3MgaW4KKyAJbGVuZ3RoIHBhcmFtZXRlci4gIFJldHVybiAtMS4KKworU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIEphbiAxOSAyMjoyNjoyOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmE+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIERlYyAxNSAyMzoxNzoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1RodSBEZWMgIDQgMDk6MjE6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitGcmkgT2N0ICAzIDA5OjI4OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgU2VwIDI0IDE3OjM4OjU3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgU2VwIDIzIDExOjA0OjM4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gU2VwIDIyIDExOjQ2OjIwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitGcmkgU2VwIDE5IDE3OjQ1OjI1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gU2VwIDE1IDE3OjM2OjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgQXVnIDI3IDE4OjEzOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworVHVlIEF1ZyAyNiAxMDozODoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGZsb2F0LmMgKF9fc2V0ZnB1Y3cpOiBDb21waWxlIG9uIGFueSBpMzg2IHRhcmdldC4gIE5vdCBqdXN0IE5ULgorCisJKiBpbnRlcmYuYyAoc2ltX2tpbGwpOiBEZWxldGUuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBBZGQgQUJGRCBhcmd1bWVudC4gIEluaXRpYWxpemUgUEMgZnJvbSBBQkZECisgCWFyZ3VtZW50LgorCShzaW1fbG9hZCk6IERvbid0IHNhdmUgc3RhcnQgYWRkcmVzcy4KKwkoc3RhcnRfYWRkcmVzcyk6IERlbGV0ZSB2YXJpYWJsZS4KKworTW9uIEF1ZyAyNSAxNzo1MDoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK01vbiBBdWcgMjUgMTY6MTk6NDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcmYuYyAoc2ltX29wZW4pOiBBZGQgQUJGRCBhcmd1bWVudC4gQ2hhbmdlIEFSR1YgdG8gUEFSR1YuCisKK01vbiBKdW4gMzAgMTE6NDU6MjUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtc2lzKTogQ2hhbmdlICQoc3JjZGlyKS9zaXMgdG8gc2lzLgorCitXZWQgTWF5IDI4IDA5OjQ2OjEzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJmLmMgKHNpbV9zZXRfY2FsbGJhY2tzKTogRHJvcCBTRCBhcmd1bWVudCAtIG5vdCBhcHBsaWNhYmxlLgorCShzaW1fb3Blbik6IEFkZCBjYWxsYmFjayBhcmcsIHNhdmUgaXQuCisKK1RodSBBcHIgMjQgMDA6Mzk6NTEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgQXByIDIyIDExOjA1OjAxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGludGVyZi5jIChzaW1fb3Blbik6IFVuZG8gcGF0Y2ggdG8gYWRkIC1FIHN1cHBvcnQuCisKK1RodSBBcHIgMTcgMDM6MDM6NTYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogaW50ZXJmLmMgKHNpbV9vcGVuKTogSWdub3JlIC1FIGFyZy4KKwkoc3RhcnRfYWRkcmVzcyk6IE5ldyBzdGF0aWMgbG9jYWwuCisJKHNpbV9sb2FkKTogUmV0dXJuIFNJTV9SQy4gIE5ldyBhcmcgYWJmZC4gIFNldCBzdGFydF9hZGRyZXNzIGZyb20gYmZkLgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogUmV0dXJuIFNJTV9SQy4gIERlbGV0ZSBhcmcgc3RhcnRfYWRkcmVzcy4KKworVHVlIEFwciAxNSAxNToxNjoxMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNpcyk6IERlcGVuZCB1cG9uIGluc3RhbGxkaXJzLiAgVXNlCisJJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSBkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcKKwkkKElOU1RBTExfWEZPUk0pLgorCitNb24gQXByICA3IDE1OjQ1OjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitXZWQgQXByICAyIDE1OjA2OjI4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGludGVyZi5jIChzaW1fb3Blbik6IE5ldyBhcmcgYGtpbmQnLgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBBcHIgIDIgMTQ6MzQ6MTkgMTk5NyBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK01vbiBNYXIgMTcgMTU6MTA6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCisKK1RodSBNYXIgMTMgMTI6NDY6MDQgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogaW50ZXJmLmMgKHNpbV9vcGVuKTogTmV3IFNJTV9ERVNDIHJlc3VsdC4gIEFyZ3VtZW50IGlzIG5vdyBpbgorCWFyZ3YgZm9ybS4KKwkob3RoZXIgc2ltXyopOiBOZXcgU0lNX0RFU0MgYXJndW1lbnQuCisKK1R1ZSBGZWIgIDQgMTM6MzU6MjAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKEBDT01NT05fTUFLRUZJTEVfRlJBRyk6IFVzZQorCUNPTU1PTl97UFJFLFBPU1R9X0NPTkZJR19GUkFHIGluc3RlYWQuCisJKiBjb25maWd1cmUuaW46IHNpbmNsdWRlIC4uL2NvbW1vbi9hY2xvY2FsLm00LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworVGh1IEphbiAyMyAxMTo0NjoyMyAxOTk3ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBjb25maWd1cmUgY29uZmlndXJlLmluIE1ha2VmaWxlLmluOiAgVXBkYXRlIHRvIG5ldyBjb25maWd1cmUKKwlzY2hlbWUgd2hpY2ggaXMgbW9yZSBjb21wYXRpYmxlIHdpdGggV2luR0RCIGJ1aWxkcy4KKwkqIGNvbmZpZ3VyZS5pbjogIEltcHJvdmUgY29tbWVudCBvbiBob3cgdG8gcnVuIGF1dG9jb25mLgorCSogY29uZmlndXJlOiAgUmUtcnVuIGF1dG9jb25mIHRvIGdldCBuZXcgLi4vY29tbW9uL2FjbG9jYWwubTQuCisJKiBNYWtlZmlsZS5pbjogIFVzZSBhdXRvY29uZiBzdWJzdGl0dXRpb24gdG8gaW5zdGFsbCBjb21tb24KKwltYWtlZmlsZSBmcmFnbWVudC4KKworV2VkIERlYyAgNCAxODoyNTowNCAxOTk2ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgorCisJKiBpbnRlcmYuYyAocnVuX3NpbSk6IFN0b3AgdGhlIHNpbXVsYXRvciBhbmQgcmVzZXQgdGhlIHN0ZGlvIGFmdGVyCisJYnJlYWtwb2ludHMuCisKK1R1ZSBEZWMgIDMgMTE6NTQ6MzcgMTk5NiAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBMb29rIGZvciBsaWJ0ZXJtY2FwLmEuCisJKiBNYWtlZmlsZS5pbjogT25seSBsaW5rIGluIC1sdGVybWNhcCBpZiBpdCBleGlzdHMuCisJKiBlcmMzMi5jOiBVcGRhdGUgdG8gdmVyc2lvbiAyLjZhLiBGaXggdWFydCBoYW5kbGluZy4KKwkqIGV4ZWMuYzogVXBkYXRlIHRvIHZlcnNpb24gMi42YS4gQWRkIHNwYXJjbGl0ZSBzdXBwb3J0LgorCSogZmxvYXQuYzogVXBkYXRlIHRvIHZlcnNpb24gMi42YS4gQ29udmVydCBjb21tZW50cyB0bworCXByZXByb2Nlc3NvciB3YXJuaW5ncy4gQWRkIF9fc2V0ZnB1Y3coKSBmb3IgaTM4NSBob3N0cyBzbyBmbG9hdGluZworCXBvaW50IGV4Y2VwdGlvbnMgd29yayBvbiB3aW4zMi4KKwkqIGZ1bmMuYzogVXBkYXRlIHRvIHZlcnNpb24gMi42YS4gRml4IHVhcnQgaGFuZGxpbmcsIGFkZCBzdXBwb3J0CisJZm9yIHVzZXIgZXJyb3IgdHJhcHMuCisJKiBoZWxwLmM6IFVwZGF0ZSB0byB2ZXJzaW9uIDIuNmEuIEFkZCBoZWxwIG5vdGUgb24gdXNlciBlcnJvcgorCXRyYXBzLgorCSogaW50ZXJmLmM6IFVwZGF0ZSB0byB2ZXJzaW9uIDIuNmEuIEZpeCB1YXJ0IGhhbmRsaW5nLCBhbmQgYWRkCisJc3BhcmNsaXRlIHN1cHBvcnQuCisJKiBleGFtcGxlcy9nY2N4OiBVc2Ugc3BhcmNsaXRlIGNyb3NzIGNvbXBpbGVyLCBub3QgbmF0aXZlIGdjYy4KKwkqIGV4YW1wbGVzL3NydDAuUzogVXNlICJtb3YiIHJhdGhlciB0aGFuICJ3ciIgZm9yIG1hbmlwdWxhdGluZworCXRoZSBwc3IgcmVnaXN0ZXIuCisKK01vbiBOb3YgMjUgMDg6Mjg6MTAgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChydW4ubyk6IFJlbW92ZSB0aGlzIHJ1bGUsIGl0IGhpZGVzIHRoZSBvbmUgaW4KKwkuLi9jb21tb24vTWFrZS1jb21tb24uaW4gdGhhdCBjb3JyZWN0bHkgcmVmZXJlbmNlcyB0aGUgc291cmNlCisJaW4gdGhlIHNpYmxpbmcgLi4vY29tbW9uIGRpcmVjdG9yeS4KKworV2VkIE5vdiAyMCAwMTozMDoxMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogRGVsZXRlIHN0dWZmIG1vdmVkIHRvIC4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbi4KKwkoU0lNX3tPQkpTLEVYVFJBX0xJQlMsRVhUUkFfTElCREVQUyxFWFRSQV9BTEwsRVhUUkFfSU5TVEFMTH0pOiBEZWZpbmUuCisJKFNJTV97RVhUUkFfQ0xFQU4sRVhUUkFfQ0ZMQUdTfSk6IERlZmluZS4KKwkqIGNvbmZpZ3VyZS5pbjogU2ltcGxpZnkgdXNpbmcgbWFjcm9zIGluIC4uL2NvbW1vbi9hY2xvY2FsLm00LgorCUNhbGwgQUNfQ0hFQ0tfSEVBREVSUyhzdGRsaWIuaCkuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogY29uZmlnLmluOiBOZXcgZmlsZS4KKwkqIGZ1bmMuYyAoc2ltX3NldF9jYWxsYmFja3MpOiBEZWxldGUsIG1vdmVkIHRvCisJKiBpbnRlcmYuYyAoc2ltX3NldF9jYWxsYmFja3MpOiBoZXJlLgorCShzaW1fY2FsbGJhY2spOiBOZXcgZ2xvYmFsLgorCVJld3JpdGUgYWxsIGNhbGxzIHRvIHByaW50Zl9maWx0ZXJlZCB0byBnbyB0aHJvdWdoIGNhbGxiYWNrLgorCShzaW1fc2l6ZSxzaW1fdHJhY2UpOiBOZXcgZnVuY3Rpb25zLgorCShzaW1fe2luc2VydCxyZW1vdmV9X2JyZWFrcG9pbnQpOiAjaWYgMCBvdXQuCisJKiBzaXMuYzogI2luY2x1ZGUgImNvbmZpZy5oIi4gICNpbmNsdWRlIDxzdGRsaWIuaD4gaWYgcHJlc2VudC4KKwkobWFpbik6IENvZXJjZSBmcHJpbnRmIGFyZyB0byBJTklUX0RJU0FTU0VNQkxFX0lORk8gdG8gZnByaW50Zl9mdHlwZS4KKwkqIHNpcy5oOiAjaW5jbHVkZSAiY2FsbGJhY2suaCIuCisJKiBydW4uYzogRGVsZXRlZCwgdXNpbmcgb25lIGluIC4uL2NvbW1vbiBub3cuCisKK1RodSBPY3QgIDMgMTY6MTI6MDMgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKKworCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogTW92ZSBjb25maWcubG9nIHRvIGRpc3RjbGVhbi4KKworV2VkIE9jdCAgMiAxNjo1Nzo1NyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQorCisJKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiBBbHNvIHJlbW92ZSBjb25maWcubG9nLgorCitTYXQgU2VwIDE0IDAwOjAwOjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9CVUlMRCk6IE5ldyB2YXJpYWJsZS4KKwkoQVIsIEFSX0ZMQUdTLCBCSVNPTiwgTUFLRUlORk8pOiBSZW1vdmUgZHVwbGljYXRlIHZhcmlhYmxlcy4KKwkoUkFOTElCLCBDQyk6IExpa2V3aXNlLgorCShlbmQpOiBVc2UgJChDQ19GT1JfQlVJTEQpLCBub3QgJChDQykuCisJKiBjb25maWd1cmUuaW46IFNldCBDQ19GT1JfQlVJTEQuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisKK1N1biBTZXAgIDggMTQ6MDQ6MzcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogZXJjMzIuYyAocG9ydF9pbml0KTogIERpc2FibGUgdGhpcyBmb3IgX19HTzMyX18gKGdvdCBubyBwdHkncworCXRoZXJlIGVpdGhlci4uLikuCisKK01vbiBBdWcgMTIgMTc6MDQ6NTggMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogZXJjMzIuYzogIERvbid0IGluY2x1ZGUgc3lzL2lvY3RsLmggb3Igc3lzL2ZpbGUuaC4gIFRoZXkgYXJlbid0CisJbmVjZXNzYXJ5LgorCSogKHBvcnRfaW5pdCk6ICBEb24ndCBldmVuICp0cnkqIHRvIG9wZW4gcHR5J3MgdW5kZXIgX1dJTjMyLgorCSogVXNlIFNJTV9BRERSLCBub3QgY2FkZHJfdCBmb3IgZGVjbGFyaW5nIHZhcnMgdGhhdCBob2xkIGFkZHJlc3Nlcy4KKwkqIGZsb2F0LmM6ICBHZXQgcmlkIG9mICN3YXJuaW5nLiAgTWFrZXMgTWljcm9zb2Z0IEMgYmFyZi4KKwkqIGludGVyZi5jIChzaW1fb3Blbik6ICBDYXN0IGZwcmludGYgdG8gKGZwcmludGZfZnR5cGUpIHRvIGZpeAorCWNvbXBpbGVyIHdhcm5pbmcuCisJKiAoc2ltX2xvYWQgc2ltX2NyZWF0ZV9pbmZlcmlvciBzaW1fcmVhZCk6ICBVc2UgcHJvdG90eXBlcyBvbmx5IGluCisJZGVjbHMsIG5vdCBkZWZzLgorCSogR2V0IHJpZCBvZiBlbnVtIHNpbV9zdG9wLiAgSXQncyBkZWZpbmVkIGluIHJlbW90ZS1zaW0uaC4KKwkqIChzaW1fc3RvcF9yZWFzb24pOiAgRGVmaW5lIFNJR1RSQVAgaWYgX1dJTjMyLgorCSogc2lzLmg6ICBJbmNsdWRlIGFuc2lkZWNsLmggYW5kIHJlbW90ZS1zaW0uaC4KKworV2VkIEp1bCAgMyAxNjowNToyMyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQorCisJKiBlcmMzMi5jIChtZWNfcmVzZXQgbWVjX3JlYWQgbWVjX3dyaXRlIG1lbW9yeV9yZWFkIG1lbW9yeV93cml0ZSksCisJc2lzLmg6ICBHZXQgcmlkIG9mIGFsbCB1c2VzIG9mIGxvbmcgbG9uZydzLgorCSogKGNsb3NlX3BvcnQgcmVhZF91YXJ0IHdyaXRlX3VhcnQgdWFydGFfdHgpOiAgRG9uJ3Qgc2VnIGZhdWx0CisJd2hlbiBjYW4ndCBvcGVuIHB0eSdzLgorCSogZXhlYy5jOiAgQWRkIHR3byBuZXcgaW5zdHJ1Y3Rpb25zOiBzbXVsLCBhbmQgZGl2c2NjLgorCSogaW50ZXJmLmMgKGZsdXNoX3dpbmRvd3MpOiAgTmV3IHJvdXRpbmUgdG8gZmx1c2ggdGhlIHJlZ2lzdGVyCisJd2luZG93cyBvdXQgdG8gdGhlIHN0YWNrIGp1c3QgYmVmb3JlIHJldHVybmluZyB0byBHREIuICBNYWtlcworCWJhY2t0cmFjZXMgd29yayBtdWNoIGJldHRlci4KKworV2VkIEp1biAyNiAxMjoxOToxMSAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQorCisgICAgICAgICogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsCisgICAgICAgIElOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCisgICAgICAgIChkb2NkaXIsIG9sZGluY2x1ZGVkaXIpOiBSZW1vdmVkLgorICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KKyAgICAgICAgKEFDX1BST0dfSU5TVEFMTCk6IEFkZGVkLgorICAgICAgICAqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworTW9uIEp1biAyNCAxNDoxOTowNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19QUk9HX0NDIGJlZm9yZSBydW5uaW5nIGNvbmZpZ3VyZS5ob3N0LgorCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMC4KKworVHVlIEp1biAgNCAxMDozNzoxMiAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNzazMuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEb24ndCBjaGVjayB0byBzZWUgaWYgdG9vbGRpciBleGlzdHMuCisJTWFrZSAkKHRvb2xkaXIpIGFuZCAkKHRvb2xkaXIpL2Jpbi4KKworTW9uIEp1biAgMyAxMjozMzozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChlbmQuaCk6IFVzZSBleHBsaWNpdCAuLyB3aGVuIHJ1bm5pbmcgZW5kLgorCitTdW4gTWF5IDE5IDIxOjA1OjMxIDE5OTYgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+CisKKwkqIGZ1bmMuYyhiZmRfbG9hZCk6IERvbid0IHRyeSB0byBwcmludCB0aGUgZmlsZW5hbWUgaWYgdGhlIHBmYmQgaXMKKwlOVUxMLgorCSogaW50ZXJmLmMoc2ltX2xvYWQpOiBQYXNzIHRoZSB3aG9sZSBzdHJpbmcsIG5vdCBqdXN0IHRoZSBmaXJzdAorCWJ5dGUuCisKK1ZlcnNpb24gMi4xIDI2LTAyLTk2CistLS0tLS0tLS0tLS0tLS0tLS0tLQorIAorKiBGaXhlZCBidWcgaW4gImdvIiBjb21tYW5kLgorIAordmVyc2lvbiAyLjAgMDUtMDItOTYKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogRml4ZWQgYnVnIGluIGludGVycnVwdCBmb3JjZSByZWdpc3RlciAoZXJjMzIuYykuCisKKyogQ2hhbmdlIGZpbGUgbG9hZCBmdW5jdGlvbiB0byB1c2UgYmZkX29wZW5yLgorCisqIFNJUyBzaG91bGQgbm93IGJlIGVuZGlhbiBpbmRlcGVuZGVudC4KKwordmVyc2lvbiAxLjggMjQtMTEtOTUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogRml4ZWQgRlBVIHRpbWluZyAtIHNvbWUgc2VxdWVuY2VzIG9mIEZQVSBpbnN0cnVjdGlvbnMgZGlkIG5vdCBjYWxjdWxhdGUKKyAgdGhlIHJlc291cmNlIGRlcGVuZGVuY2llcyByaWdodC4KKworKiBDb3JyZWN0ZWQgU1RERlEgd2hlbiBxbmUgPSAwIChhZ2FpbiEpLiBUaGUgZnR0IGlzIHNldCB0byBzZXF1ZW5jZV9lcnJvcgorICBidXQgbm8gRlBVIHRyYXAgaXMgZ2VuZXJhdGVkLgorCit2ZXJzaW9uIDEuNy4xIDMxLTEwLTk1CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIENvcnJlY3RlZCBTVERGUSB3aGVuIHFuZSA9IDAuIE5vdywgYSB0cmFwIGlzIGltbWlkaWF0ZWx5IGdlbmVyYXRlZCBidXQKKyAgdGhlIEZQVSBzdGF5cyBpbiBleGVjdXRlIG1vZGUuCisKKyogQ29ycmVjdGVkIEpNUEwgYW5kIFJFVFQgdGltaW5nICh0aGVzZSBpbnN0cnVjdGlvbnMgdGFrZXMgdHdvIGN5Y2xlcykuCisKKwordmVyc2lvbiAxLjcgMjUtMTAtOTUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogSW50ZXJydXB0IGR1cmluZyBhbm51bGVkIGluc3RydWN0aW9uIGNvcnJ1cHRlZCByZXR1cm4gYWRkcmVzcyAtIGZpeGVkLgorCisKK3ZlcnNpb24gMS42LjIgMjUtMTAtOTUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogQWRkZWQgLURGQVNUX1VBUlQgdG8gTWFrZWZpbGUKKyAKKwordmVyc2lvbiAxLjYuMSAyNC0xMC05NQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAKKyogRml4ZWQgYnVnIGluIFNUREZRIHdoaWNoIGNhdXNlZCBidXMgZXJyb3IKKworCit2ZXJzaW9uIDEuNiAwMi0xMC05NQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAKKyogTW9kaWZpZWQgc3J0MC5zIHRvIGluY2x1ZGUgY29kZSB0aGF0IGluaXRpYXRlcyByZWdpc3RlcnMgaW4gSVUgYW5kIEZQVQorICBhbmQgaW5pdGlhbGl6ZXMgdGhlIGRhdGEgc2VnbWVudC4gVGhlIHNpbXVsYXRvciAnbG9hZCcgY29tbWFuZCBkb2VzIG5vdAorICBsb25nZXIgaW5pdGlhbGl6ZSB0aGUgZGF0YSBzZWdtZW50IQorCisqIENvcnJlY3RlZCBNRUMgdGltZXIgb3BlcmF0aW9uOyBzY2FsZXJzIG5vdyBkaXZpZGUgdGhlIGZyZXF1ZW5jeSBieSAKKyAgKHNjYWxlcl92YWx1ZSArIDEpLgorCisqIE1FQyBicmVha3BvaW50cyBhcmUgbm90IGNoZWNrZWQgZHVyaW5nIHN0b3JlIG9wZXJhdGlvbgorCisKK3ZlcnNpb24gMS41IDE0LTA5LTk1CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgY3ljbGUgY291bnRpbmcgZm9yIElVICYgRlBVIGluc3RydWN0aW9ucy4KKworKiBGaXhlZCBidWcgdGhhdCBhbGxvd2VkIGFuIGFubnVsZWQgaW5zdHJ1Y3Rpb24gdG8gY2F1c2UgbWVtb3J5IGV4Y2VwdGlvbi4KKworKiBUaGUgKndzIHBhcmFtZXRlciBpbiBtZW0uYyBzaG91bGQgbm93IGNvbnRhaW4gdGhlIG51bWJlciBvZiB3YWl0c3RhdGVzCisgIHJlcXVpcmVkIGJ5IHRoZSBtZW1vcnkgYWNjZXNzICh3YXMgdG90YWwgbnVtYmVyIG9mIGN5Y2xlcykuCisKKyogVGhlIHN1cHBsaWVkIHNydDAucyBub3cgY2xlYXJzIHRoZSBCU1MgKHRoYW5rcyBKb2VsKS4KKwordmVyc2lvbiAxLjQgMjItMDgtOTUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogQWRkZWQgYSAnLWcnIHN3aXRjaCB0byBlbmFibGUvZGlzYWJsZSB0aGUgR05VIHJlYWRsaW5lKCksIHdoaWNoIGNhdXNlCitzb21lIHByb2JsZW1zIG9uIHNvbGFyaXMgMi54IG1hY2hpbmVzLgorCisqIEVuYWJsZWQgTUVDIHdhdGNocG9pbnQgYW5kIGJyZWFrcG9pbnQgZnVuY3Rpb24gdG8gbWVtLmMuIFBlcmZvcm1hbmNlIAorbWF5IHN1ZmZlciBhIGJpdCAuLi4KKworTk9URTogVGhlIFVBUlRzIGFyZSBub3cgY29ubmVjdGVkIHRvIC9kZXYvdHR5cGMgYW5kIC9kZXYvdHR5cGQuCisKK3ZlcnNpb24gMS4zIDI2LTA3LTk1CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIEZpeGVkIGJ1ZyBpbiBtdWxzY2MgaW5zdHJ1Y3Rpb24gKGhvdyBjb3VsZCB0aGF0IGV2ZXIgaGF2ZSB3b3JrZWQ/KQorCisqIEZpeGVkIGJ1ZyBpbiBVQVJUIEIgKGZsdXNoZWQgY2hhcmFjdGVycyBvbiBVQVJUIEEpLCB0aGFua3MgUGF1bC4KKwordmVyc2lvbiAxLjIgMTMtMDctOTUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogRml4ZWQgYnVnIGluIGludGVycnVwdCBoYW5kbGluZyAod3JvbmcgaW50ZXJydXB0IHNlbGVjdGVkIHdoZW4gbW9yZSB0aGF0CitvbmUgaW50ZXJydXB0IHBlbmRpbmcpCisKKyogRml4ZWQgdXBkYXRpbmcgb2YgY29uZGl0aW9uIGNvZGVzIGR1cmluZyBsb2dpY2FsIGluc3RydWN0aW9ucyAoY2FycnkgYW5kCitvdmVyZmxvdyB3ZXJlIG5vdCByZXNldCkKKworKiBGaXhlZCBidWcgaW4gV1JUQlIgKHR0IGZpZWxkIHdhcyB3cm9uZ2x5IG92ZXItd3JpdHRlbikKKwordmVyc2lvbiAxLjEgMDctMDctOTUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogRml4ZWQgc2V2ZXJhbCBidWdzIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgY2FsbGJhY2sgcm91dGluZXMuCisocmVwb3J0ZWQgYnkgUGF1bCBXYXJyZW4sIEFsc3lzKQpkaWZmIC0tZ2l0IGEvc2ltL2VyYzMyL01ha2VmaWxlLmluIGIvc2ltL2VyYzMyL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MDY0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZXJjMzIvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw3NSBAQAorIyAgICBNYWtlZmlsZSB0ZW1wbGF0ZSBmb3IgQ29uZmlndXJlIGZvciB0aGUgZXJjMzJzaW0gbGlicmFyeS4KKyMgICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0CisjICAgIE1vZGlmaWVkIGJ5IEouR2Fpc2xlciBFU0EvRVNURUMKKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworIyMgQ09NTU9OX1BSRV9DT05GSUdfRlJBRworCitURVJNQ0FQX0xJQiA9IEBURVJNQ0FQQAorCitTSU1fT0JKUyA9IGV4ZWMubyBlcmMzMi5vIGZ1bmMubyBoZWxwLm8gZmxvYXQubyBpbnRlcmYubworU0lNX0VYVFJBX0xJQlMgPSAuLi8uLi9yZWFkbGluZS9saWJyZWFkbGluZS5hICAkKFRFUk1DQVBfTElCKSAtbG0KK1NJTV9FWFRSQV9MSUJERVBTID0gLi4vLi4vcmVhZGxpbmUvbGlicmVhZGxpbmUuYQorU0lNX0VYVFJBX0FMTCA9IHNpcworU0lNX0VYVFJBX0lOU1RBTEwgPSBpbnN0YWxsLXNpcworU0lNX0VYVFJBX0NMRUFOID0gY2xlYW4tc2lzCisKKyMgVUFSVFMgcnVuIGF0IGFib3V0IDExNTIwMCBiYXVkIChzaW11bGF0b3IgdGltZSkuIEFkZCAtREZBU1RfVUFSVCB0bworIyBDRkxBR1MgaWYgZmFzdGVyIChpbmZpbml0ZSkgVUFSVCBzcGVlZCBpcyBkZXNpcmVkLiBNaWdodCBhZmZlY3QgdGhlCisjIGJlaGF2aW91ciBvZiBVQVJUIGludGVycnVwdCByb3V0aW5lcyAuLi4KK1NJTV9FWFRSQV9DRkxBR1MgPSAtRFNUQVQgLURGQVNUX1VBUlQgLURJVVJFVjAgLURNRUNSRVYwCisKKyMjIENPTU1PTl9QT1NUX0NPTkZJR19GUkFHCisKKyMgYHNpcycgZG9lc24ndCBuZWVkIGludGVyZi5vLgorU0lTX09GSUxFUyA9IGV4ZWMubyBlcmMzMi5vIGZ1bmMubyBoZWxwLm8gZmxvYXQubworCitzaXM6IHNpcy5vICQoU0lTX09GSUxFUykgJChDT01NT05fT0JKUykgJChMSUJERVBTKQorCSQoQ0MpICQoQUxMX0NGTEFHUykgLW8gc2lzIFwKKwkgIHNpcy5vICQoU0lTX09GSUxFUykgJChDT01NT05fT0JKUykgJChFWFRSQV9MSUJTKQorCisjIEZJWE1FOiBUaGlzIGNvbXB1dGVzIHRoZSBidWlsZCBob3N0J3MgZW5kaWFubmVzcywgZG9lc24ndCBpdD8KKyMgVGhlcmUgaXMgQUNfQ19CSUdFTkRJQU4gYnV0IGl0IGRvZXNuJ3QgaGFuZGxlIGZsb2F0IGVuZGlhbm5lc3MuCisjIFtBcmUgaW50L2Zsb2F0IGVuZGlhbnMgZXZlcnkgZGlmZmVyZW50IG9uIGEgc3BhcmM/XQorZW5kOiAkKHNyY2RpcikvZW5kLmMKKwkkKENDX0ZPUl9CVUlMRCkgJChzcmNkaXIpL2VuZC5jIC1vIGVuZAorZW5kLmg6IGVuZAorCS4vZW5kID4gZW5kLmgKKworIyBDb3B5IHRoZSBmaWxlcyBpbnRvIGRpcmVjdG9yaWVzIHdoZXJlIHRoZXkgd2lsbCBiZSBydW4uCitpbnN0YWxsLXNpczogaW5zdGFsbGRpcnMKKwluPWBlY2hvIHNpcyB8IHNlZCAnJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSdgOyBcCisJJChJTlNUQUxMX1BST0dSQU0pIHNpcyAkKGJpbmRpcikvJCRuCisKK2NsZWFuLXNpczoKKwlybSAtZiBzaXMgZW5kIGVuZC5oCisKK2NvbmZpZ3VyZToKKwlAZWNobyAiUmVidWlsZGluZyBjb25maWd1cmUuLi4iCisJaWYgWyB4IiR7c3JjZGlyfSIgPSB4IkBzcmNkaXJAIiBdIDsgdGhlbiBcCisJICBzcmNkaXI9LiA7IGV4cG9ydCBzcmNkaXIgOyBcCisJZWxzZSB0cnVlIDsgZmkgOyBcCisJKGNkICQke3NyY2Rpcn07IGF1dG9jb25mIC0tbG9jYWxkaXI9Li4vY29tbW9uKQorCisjIENpcmN1bXZlbnQgU3VuIE1ha2UgYnVnIHdpdGggVlBBVEguCitlcmMzMi5vOiBlcmMzMi5jIHNpcy5oIGVuZC5oCitleGVjLm86IGV4ZWMuYyBzaXMuaCBlbmQuaAorZmxvYXQubzogZmxvYXQuYyBzaXMuaCBlbmQuaAorZnVuYy5vOiBmdW5jLmMKK2hlbHAubzogaGVscC5jCitpbnRlcmYubzogaW50ZXJmLmMgc2lzLmggZW5kLmggCitzaXMubzogc2lzLmMgc2lzLmggZW5kLmgKZGlmZiAtLWdpdCBhL3NpbS9lcmMzMi9ORVdTIGIvc2ltL2VyYzMyL05FV1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyNGI3YgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9lcmMzMi9ORVdTCkBAIC0wLDAgKzEsMTA4IEBACisKK3ZlcnNpb24gMi4wIDA1LTAyLTk2CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIFN3aXRjaGVkIHRvIGJmZCBsaWJyYXJ5LiBBbnkgc3VwcG9ydGVkIGZvcm1hdCAoZWxmLCBjb2ZmLCAuLi4pIGNhbiBiZSB1c2VkLgorKiBUaGUgVUFSVCBkZXZpY2VzIGNhbiBiZSBzZXQgdGhyb3VnaCAtdWFydDEgYW5kIC11YXJ0MiBzd2l0Y2hlcy4KKyogU3dpdGNoZWQgdG8gR05VIHJlYWRsaW5lLgorKiBBZGRlZCAtYyBvcHRpb24gdG8gcnVuIGJhdGNoIGZpbGVzIGF0IHN0YXJ0dXAKKyogJ3JlZycgY29tbWFuZCBjYW4gc2hvdyBkaWZmZXJlbnQgcmVnaXN0ZXIgd2luZG93cyAoZWcgJ3JlZyB3MycpLgorKiBVc2UgJ2hlbHAnIGZvciBvbmxpbmUgaGVscCBvbiBzaW11bGF0b3IgY29tbWFuZHMKKwordmVyc2lvbiAxLjguMSAyMC0wMS05NgorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBhZGRlZCAtbWV2cmV2MCBzd2l0Y2ggdG8gc2ltdWxhdGUgTUVDIHJldi4wIGJ1Z3MgaW4gdGltZXIgYW5kIHVhcnQKKworKiBhZGRlZCAtaXVyZXYwIHN3aXRjaCB0byBzaW11bGF0ZSBJVSByZXYuMCBqbXBsL3Jlc3RvcmUgYnVnCisKKyogQWRkZWQgc2lzIGNvbW1hbmQgJ2JhdGNoJyB0byBydW4gYmF0Y2ggZmlsZXMKKworCit2ZXJzaW9uIDEuOCAzMC0xMC05NQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBBZGRlZCBzLXJlY29yZCBzdXBwb3J0LiBVc2UgdGhlICctcycgc3dpdGNoIHdpdGggc2lzIG9yIHRoZSAnbG9hZCcgY29tbWFuZC4KKworKiBJVSBsb2FkIGRlcGVuZGVuY2llcyBhcmUgbm93IG1vZGVsbGVkCisKK3ZlcnNpb24gMS43IDMwLTEwLTk1CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIFBvd2VyLWRvd24gbW9kZSBpbXBsZW1lbnRlZCBpbiBlcmMzMi5jLgorICAKKyogUGVyZm9ybWFuY2UgZGlzcGxheSBzaG93cyB0aGUgcmF0aW8gYmV0d2VlbiBzaW11bGF0b3ItdGltZSBhbmQgcmVhbC10aW1lLgorCisKK3ZlcnNpb24gMS42LjIgMjUtMTAtOTUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogVGhlIFVBUlRzIGNhbiBub3cgYmUgcnVuIGF0IGEgZ2l2ZW4gc3BlZWQgKHNpbXVsYXRvciB0aW1lKSB0byBiZXR0ZXIKKyAgc2ltdWxhdGUgdGhlIGJlaGF2aW91ciBvZiBpbnRlcnJ1cHQgcm91dGluZXMuIFRoZSAidHJ1ZSBtb2RlIiBpcworICBzZWxlY3RlZCB0aHJvdWdoIGEgY29tcGlsZSBzd2l0Y2ggaW4gdGhlIG1ha2VmaWxlLgorCisKK3ZlcnNpb24gMS42IDI4LTA5LTk1CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIE1ham9yIHJlb3JnYW5pc2F0aW9uIG9mIHRoZSBjb2RlLiBtZWMuYyBhbmQgbWVtLmMgbWVyZ2VkIGludG8gZXJjMzIuYy4KKworKiBUaGUgbG9hZCBjb21tYW5kIGRvZXMgTk9UIGxvbmdlciBsb2FkIHRoZSBpbml0aWFsaXNlZCBkYXRhIGF0IGFuIGFkZHJlc3MKKyAgZGVmaW5lZCBieSAuYmRhdGEuIFRoaXMgaXMgZG9uZSBpbiBzcnQwLnMgdXNpbmcgX2Vudmlyb24uCisKKyogQWRkaXRpb25hbCBNRUMgZnVuY3Rpb25hbGxpdHkgYWRkZWQgLSBzb2Z0d2FyZSByZXNldCwgbWVtb3J5IGFjY2VzcworICBwcm90ZWN0aW9uIGFuZCB3YWl0c3RhdGUgY29uZmlndXJhdGlvbiByZWdpc3Rlci4KKworKiBpbnRlcmYuYyAtIGEgR0RCIGludGVyZmFjZSBhZGRlZAorCisqIC12IHN3aXRjaCAodmVyYm9zZSkgYWRkZWQKKwordmVyc2lvbiAxLjUgMTQtMDktOTUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogQWRkZWQgYSBpbnN0cnVjdGlvbiB0cmFjZSBidWZmZXIsIGVuYWJsZWQgdGhyb3VnaCB0aGUgJ2hpc3QnIGNvbW1hbmQuCisKKyogQWRkZWQgYSAncGVyZicgY29tbWFuZCB0byBkaXNwbGF5IHN0YXRpc3RpY3Mgc3VjaCBhcyBpbnN0cnVjdGlvbiBtaXgsCisgIENQSSwgRlBVIGhvbGRzIGV0Yy4KKworKiBBZGRlZCAtbmZwIHN3aXRjaCB0byBkaXNhYmxlIEZQVS4KKworKiBBZGRlZCAtZnJlcSBzd2l0Y2ggdG8gc2V0IHNpbXVsYXRlZCBmcmVxdWVuY3kuCisKK3ZlcnNpb24gMS40IDIyLTA4LTk1CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIEEgLWcgaXMgcHJvdmlkZWQgZm9yIHRob3NlIHdobyBoYXZlIHByb2JsZW1zIHdpdGggR05VIHJlYWRsaW5lKCkuIAorCit2ZXJzaW9uIDEuMyAyNi0wNy05NQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBObyBtYWpvciBuZXdzLCBqdXN0IGEgYnVnIGZpeCByZWxlYXNlIC4uLgorCisKK3ZlcnNpb24gMS4yIDEzLTA3LTk1CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIEFkZGVkIHNldHRpbmcgb2YgSVUgcmVnaXN0ZXJzIHRocm91Z2ggdGhlICdyZWcnIGNvbW1hbmQuIFNlZSBSRUFETUUuCisKKyogVGhlIEdOVSByZWFkbGluZSgpIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIGNvbW1hbmQgaW5wdXQuIEhvd2V2ZXIsIGEKK2N0cmwtRCBzdGlsbCBraWxscyB0aGUgc2ltdWxhdG9yIC4uLgorCisKK3ZlcnNpb24gMS4xIDA3LTA3LTk1CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyogQWRkZWQgYSAnZ28nIGNvbW1hbmQKKworKiBBZGRlZCBjeWNsZSBjb3VudGluZyBmb3IgaW50ZXJydXB0IG92ZXJoZWFkLgorCisqIEZ1bmN0aW9uICdnZXRfbWVtX3B0cicgdGFrZXMgb25lIG1vcmUgcGFyYW1ldGVyIHRvIGF2b2lkIHNlZ21lbnRhdGlvbiAKKyAgIGZhdWx0cyBpZiBhLm91dCBmaWxlcyBhcmUgbG9hZGVkIG91dHNpZGUgdGhlIHNpbXVsYXRlZCBtZW1vcnkuIFNlZSBSRUFETUUuCisKKyogQWRkZWQgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIHNpbV9zdG9wKCkuCisKKyogQWRkZWQgYSByZXNldCBjb21tYW5kLiBTZWUgUkVBRE1FLgorCisqIEltcGxlbWVudGVkIGJ1ZmZlcmVkIG91dHB1dCBmb3IgTUVDIHVhcnRzIHRvIGltcHJvdmUgb3V0cHV0IHNwZWVkLgorCmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvUkVBRE1FLmVyYzMyIGIvc2ltL2VyYzMyL1JFQURNRS5lcmMzMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDEzNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2VyYzMyL1JFQURNRS5lcmMzMgpAQCAtMCwwICsxLDEzMCBAQAorCisxLiBNRUMgYW5kIEVSQzMyIGVtdWxhdGlvbgorCitUaGUgZmlsZSAnZXJjMzIuYycgY29udGFpbnMgYSBtb2RlbCBvZiB0aGUgTUVDLCA1MTIgSyByb20gYW5kIDQgTSByYW0uCisKK1RoZSBmb2xsb3dpbmcgcGFyYWdyYXBocyBvdXRsaW5lIHRoZSBpbXBsZW1lbnRlZCBNRUMgZnVuY3Rpb25zLgorCisxLjEgVUFSVHMKKworVGhlIFVBUlRzIGFyZSBjb25uZWN0ZWQgdG8gdHdvIHBzZXVkby1kZXZpY2VzLCAvZGV2L3R0eXBjIGFuZCAvZGV2L3R0eXBkLgorVGhlIGZvbGxvd2luZyByZWdpc3RlcnMgYXJlIGltcGxlbWV0ZWQ6CisKKy0gVUFSVCBBIFJYIGFuZCBUWCByZWdpc3RlcgkoMHgwMWY4MDBlMCkKKy0gVUFSVCBCIFJYIGFuZCBUWCByZWdpc3RlcgkoMHgwMWY4MDBlNCkKKy0gVUFSVCBzdGF0dXMgcmVnaXN0ZXIJCSgweDAxZjgwMGU4KQorCitUbyBzcGVlZCB1cCBzaW11bGF0aW9uLCB0aGUgVUFSVHMgb3BlcmF0ZSBhdCBhcHByb3hpbWF0ZWx5IDExNTIwMCBiYXVkLiAKK1RoZSBVQVJUcyBnZW5lcmF0ZSBpbnRlcnJ1cHQgNCBhbmQgNSBhZnRlciBlYWNoIHJlY2VpdmVkIG9yIHRyYW5zbWl0dGVkIAorY2hhcmFjdGVyLiAgVGhlIGVycm9yIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgaWYgb3ZlcmZsb3cgb2NjdXJzIC0gb3RoZXIKK2Vycm9ycyBjYW5ub3Qgb2NjdXJlLgorCisxLjIgUmVhbC10aW1lIGNsb2NrIGFuZCBnZW5lcmFsIHB1cG9zZSB0aW1lciBBCisKK1RoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzIGFyZSBpbXBsZW1ldGVkOgorCistIFJlYWwtdGltZSBjbG9jayB0aW1lcgkJCQkoMHgwMWY4MDA4MCwgcmVhZC1vbmx5KQorLSBSZWFsLXRpbWUgY2xvY2sgc2NhbGVyIHByb2dyYW0gcmVnaXN0ZXIgCSgweDAxZjgwMDg0LCB3cml0ZS1vbmx5KQorLSBSZWFsLXRpbWUgY2xvY2sgY291bnRlciBwcm9ncmFtIHJlZ2lzdGVyIAkoMHgwMWY4MDA4MCwgd3JpdGUtb25seSkKKworLSBHZW5lYXJsIHB1cG9zZSB0aW1lciAJCQkJKDB4MDFmODAwODgsIHJlYWQtb25seSkKKy0gUmVhbC10aW1lIGNsb2NrIHNjYWxlciBwcm9ncmFtIHJlZ2lzdGVyIAkoMHgwMWY4MDA4Yywgd3JpdGUtb25seSkKKy0gR2VuZXJhbCBwdXJwb3NlIHRpbWVyIGNvdW50ZXIgcHJvZy4gcmVnaXN0ZXIgCSgweDAxZjgwMDg4LCB3cml0ZS1vbmx5KQorCistIFRpbWVyIGNvbnRyb2wgcmVnaXN0ZXIJCQkoMHgwMWY4MDA5OCwgd3JpdGUtb25seSkKKworMS4zIEludGVycnVwdCBjb250cm9sbGVyCisKK1RoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBpcyBpbXBsZW1lbnRlZCBhcyBpbiB0aGUgTUVDIHNwZWNpZmljYXRpb24gd2l0aAordGhlIGV4Y2VwdGlvbiBvZiB0aGUgaW50ZXJydXB0IHNoYXBlIHJlZ2lzdGVyLiBTaW5jZSBleHRlcm5hbCBpbnRlcnJ1cHRzCithcmUgbm90IHBvc3NpYmxlLCB0aGUgaW50ZXJydXB0IHNoYXBlIHJlZ2lzdGVyIGlzIG5vdCBpbXBsZW1lbnRlZC4gVGhlCitvbmx5IGludGVybmFsIGludGVycnVwdHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGFyZSB0aGUgcmVhbC10aW1lIGNsb2NrLCAKK3RoZSBnZW5lcmFsIHB1cnBvc2UgdGltZXIgYW5kIFVBUlRzLiBIb3dldmVyLCBhbGwgMTUgaW50ZXJydXB0cworY2FuIGJlIHRlc3RlZCB2aWEgdGhlIGludGVycnVwdCBmb3JjZSByZWdpc3Rlci4KKworVGhlIGZvbGxvd2luZyByZWdpc3RlcnMgYXJlIGltcGxlbWV0ZWQ6CisKKy0gSW50ZXJydXB0IHBlbmRpbmcgcmVnaXN0ZXIJCSAgICAgICAoMHgwMWY4MDA0OCwgcmVhZC1vbmx5KQorLSBJbnRlcnJ1cHQgbWFzayByZWdpc3RlcgkJICAgICAgICgweDAxZjgwMDRjLCByZWFkLXdyaXRlKQorLSBJbnRlcnJ1cHQgY2xlYXIgcmVnaXN0ZXIJCSAgICAgICAoMHgwMWY4MDA1MCwgd3JpdGUtb25seSkKKy0gSW50ZXJydXB0IGZvcmNlIHJlZ2lzdGVyCQkgICAgICAgKDB4MDFmODAwNTQsIHJlYWQtd3JpdGUpCisKKzEuNCBCcmVha3BvaW50IGFuZCB3YXRjaHBvaW50IHJlZ2lzdGVyCisKK1RoZSBicmVha3BvaW50IGFuZCB3YXRjaHBvaW50IGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYXMgaW4gdGhlIE1FQworc3BlY2lmaWNhdGlvbi4gVHJhcHMgYXJlIGNvcnJlY3RseSBnZW5lcmF0ZWQsIGFuZCB0aGUgc3lzdGVtIGZhdWx0IHN0YXR1cworcmVnaXN0ZXIgaXMgdXBkYXRlZCBhY2NvcmRpbmdseS4gSW1wbGVtZXRlZCByZWdpc3RlcnMgYXJlOgorCistIERlYnVnIGNvbnRyb2wgcmVnaXN0ZXIJCQkoMHgwMWY4MDBjMCwgcmVhZC13cml0ZSkKKy0gQnJlYWtwb2ludCByZWdpc3RlcgkJCQkoMHgwMWY4MDBjNCwgd3JpdGUtb25seSkKKy0gV2F0Y2hwb2ludCByZWdpc3RlcgkJCQkoMHgwMWY4MDBjOCwgd3JpdGUtb25seSkKKy0gU3lzdGVtIGZhdWx0IHN0YXR1cyByZWdpc3RlcgkJCSgweDAxZjgwMGEwLCByZWFkLXdyaXRlKQorLSBGaXJ0cyBmYWlsaW5nIGFkZHJlc3MgcmVnaXN0ZXIJCSgweDAxZjgwMGE0LCByZWFkLXdyaXRlKQorCisKKzEuNSBNZW1vcnkgaW50ZXJmYWNlCisKK1RoZSBmb2xsb3dpbmcgbWVtb3J5IGFyZWFzIGFyZSB2YWxpZCBmb3IgdGhlIEVSQzMyIHNpbXVsYXRvcjoKKworMHgwMDAwMDAwMCAtIDB4MDAwODAwMDAJCVJPTSAoNTEyIEtieXRlLCBsb2FkZWQgYXQgc3RhcnQtdXApCisweDAyMDAwMDAwIC0gMHgwMjQwMDAwMAkJUkFNICg0IE1ieXRlLCBpbml0aWFsaXNlZCB0byAweDApCisweDAxZjgwMDAwIC0gMHgwMWY4MDBmZgkJTUVDIHJlZ2lzdGVycworCitBY2Nlc3MgdG8gdW5pbXBsZW1lbnRlZCBNRUMgcmVnaXN0ZXJzIG9yIG5vbi1leGlzdGluZyBtZW1vcnkgd2lsbCByZXN1bHQKK2luIGEgbWVtb3J5IGV4Y2VwdGlvbiB0cmFwLiBIb3dldmVyLCBhY2Nlc3MgdG8gdW5pbXBsZW1lbnRlZCBNRUMgcmVnaXN0ZXJzCitpbiB0aGUgYXJlYSAweDAxZjgwMDAwIC0gMHgwMWY4MDEwMCB3aWxsIG5vdCBjYXVzZSBhIG1lbW9yeSBleGNlcHRpb24gdHJhcC4KK1RoZSB3cml0dGVuIHZhbHVlIHdpbGwgYmUgc3RvcmVkIGluIGEgcmVnaXN0ZXIgYW5kIGNhbiBiZSByZWFkIGJhY2suIEl0Citkb2VzIGhvd2V2ZXIgbm90IGFmZmVjdCB0aGUgZnVuY3Rpb24gaW4gYW55IHdheS4gCisKK1RoZSBtZW1vcnkgY29uZmlndWFydGlvbiByZWdpc3RlciBpcyB1c2VkIHRvIGRlZmluZSBhdmFpbGFibGUgbWVtb3J5CitpbiB0aGUgc3lzdGVtLiBUaGUgZmllbGRzIFJTSVogYW5kIFBTSVogYXJlIHVzZWQgdG8gc2V0IFJBTSBhbmQgUk9NCitzaXplLCB0aGUgcmVtYWluaW5nIGZpZWxkcyBhcmUgbm90IHVzZWQuICBOT1RFOiBhZnRlciByZXNldCwgdGhlIE1FQyAKK2lzIHNldCB0byBkZWNvZGUgNCBLYnl0ZSBvZiBST00gYW5kIDI1NiBLYnl0ZSBvZiBSQU0uIFRoZSBtZW1vcnkgCitjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGhhcyB0byBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIGF2YWlsYWJsZSBtZW1vcnkuIAorCitUaGUgd2FpdHN0YXRlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaXMgdXNlZCB0byBnZW5lcmF0ZSB3YWl0c3RhdGVzLiAKK1RoaXMgcmVnaXN0ZXIgbXVzdCBhbHNvIGJlIHVwZGF0ZWQgd2l0aCB0aGUgY29ycmVjdCBjb25maWd1cmF0aW9uIGFmdGVyIAorcmVzZXQuCisKK1RoZSBtZW1vcnkgcHJvdGVjdGlvbiBzY2hlbWUgaXMgaW1wbGVtZW50ZWQgLSBpdCBpcyBlbmFibGVkIHRocm91Z2ggYml0IDMKK2luIHRoZSBNRUMgY29udHJvbCByZWdpc3Rlci4KKworVGhlIGZvbGxvd2luZyByZWdpc3RlcnMgYXJlIGltcGxlbWV0ZWQ6CisKKy0gTUVDIGNvbnRyb2wgcmVnaXN0ZXIgKGJpdCAzIG9ubHkpCQkoMHgwMWY4MDAwMCwgcmVhZC13cml0ZSkKKy0gTWVtb3J5IGNvbnRyb2wgcmVnaXN0ZXIJCQkoMHgwMWY4MDAxMCwgcmVhZC13cml0ZSkKKy0gV2FpdHN0YXRlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIJCSgweDAxZjgwMDE4LCByZWFkLXdyaXRlKQorLSBNZW1vcnkgYWNjZXNzIHJlZ2lzdGVyIDAJCQkoMHgwMWY4MDAyMCwgcmVhZC13cml0ZSkKKy0gTWVtb3J5IGFjY2VzcyByZWdpc3RlciAxCQkJKDB4MDFmODAwMjQsIHJlYWQtd3JpdGUpCisKKzEuNiBXYXRjaGRvZworCitUaGUgd2F0Y2hkb2cgaXMgaW1wbGVtZW50ZWQgYXMgaW4gdGhlIHNwZWNpZmljYXRpb24uIFRoZSBpbnB1dCBjbG9jayBpcworYWx3YXlzIHRoZSBzeXN0ZW0gY2xvY2sgcmVnYXJkc2xlc3Mgb2YgV0RDUyBiaXQgaW4gbWVjIGNvbmZpZ3VyYXRpb24gCityZWdpc3Rlci4KKworVGhlIGZvbGxvd2luZyByZWdpc3RlcnMgYXJlIGltcGxlbWV0ZWQ6CisgCistIFdhdGNoZG9nIHByb2dyYW0gYW5kIGFja25vd2xlZGdlIHJlZ2lzdGVyCSgweDAxZjgwMDYwLCB3cml0ZS1vbmx5KQorLSBXYXRjaGRvZyB0cmFwIGRvb3Igc2V0IHJlZ2lzdGVyCQkoMHgwMWY4MDA2NCwgd3JpdGUtb25seSkKKworMS43IFNvZnR3YXJlIHJlc2V0IHJlZ2lzdGVyCisKK0ltcGxlbWVudGVkIGFzIGluIHRoZSBzcGVjaWZpY2F0aW9uICgweDAxZjgwMDAwNCwgd3JpdGUtb25seSkuCisKKzEuOCBQb3dlci1kb3duIG1vZGUKKworVGhlIHBvd2VyLWRvd24gcmVnaXN0ZXIgKDB4MDFmODAwMDA4KSBpcyBpbXBsZW1lbnRlZCBhcyBpbiB0aGUgc3BlY2lmaWNhdGlvbi4KK0hvd2V2ZXIsIGlmIHRoZSBzaW11bGF0b3IgZXZlbnQgcXVldWUgaXMgZW1wdHksIHBvd2VyLWRvd24gbW9kZSBpcyBub3QKK2VudGVyZWQgc2luY2Ugbm8gaW50ZXJydXB0IHdvdWxkIGJlIGdlbmVyYXRlZCB0byBleGl0IGZyb20gdGhlIG1vZGUuIEEKK0N0cmwtQyBpbiB0aGUgc2ltdWxhdG9yIHdpbmRvdyB3aWxsIGV4aXQgdGhlIHBvd2VyLWRvd24gbW9kZS4KKworMS45IE1FQyBjb250cm9sIHJlZ2lzdGVyCisKK1RoZSBmb2xsb3dpbmcgYml0cyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIE1FQyBjb250cm9sIHJlZ2lzdGVyOgorCitCaXQJTmFtZQlGdW5jdGlvbgorMAlQUkQJUG93ZXItZG93biBtb2RlIGVuYWJsZQorMQlTV1IJU29mdCByZXNldCBlbmFibGUKKzMJQVBSCUFjY2VzcyBwcm90ZWN0aW9uIGVuYWJsZQorCmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvUkVBRE1FLmdkYiBiL3NpbS9lcmMzMi9SRUFETUUuZ2RiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOWZjYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZXJjMzIvUkVBRE1FLmdkYgpAQCAtMCwwICsxLDY3IEBACitIb3cgdG8gdXNlIFNJUyB3aXRoIEdEQgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMS4gQnVpbGRpbmcgR0RCIHdpdGggU0lTCisKK1RvIGJ1aWxkIEdEQiB3aXRoIHRoZSBTSVMvRVJDMzIgc2ltdWxhdG9yLCBjb25maWd1cmUgd2l0aCBvcHRpb24KKyctLXRhcmdldCBzcGFyYy1lcmMzMi1hb3V0JyBhbmQgYnVpbGQgYXMgdXN1YWwuCisKKzIuIEF0dGFjaGluZyB0aGUgc2ltdWxhdG9yCisKK1RvIGF0dGFjaCBHREIgdG8gdGhlIHNpbXVsYXRvciwgdXNlOgorCit0YXJnZXQgc2ltIFtvcHRpb25zXSBbZmlsZXNdCisKK1RoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkOgorCisgLW5mcAkJRGlzYWJsZSBGUFUuIEZQb3BzIHdpbGwgY2F1c2UgYW4gRlBVIGRpc2FibGVkIHRyYXAuCisKKyAtZnJlcSA8Zj4JU2V0IHRoZSBzaW11bGF0ZWQgInN5c3RlbSBjbG9jayIgdG8gPGY+IE1Iei4KKworIC12CQlWZXJib3NlIG1vZGUuCisKKyAtbm9nZGIJCURpc2FibGUgR0RCIGJyZWFrcG9pbnQgaGFuZGxpbmcgKHNlZSBiZWxvdykKKworVGhlIGxpc3RlZCBbZmlsZXNdIGFyZSBleHBlY3RlZCB0byBiZSBpbiBhb3V0IGZvcm1hdCBhbmQgd2lsbCBiZQorbG9hZGVkIGluIHRoZSBzaW11bGF0b3IgbWVtb3J5IHByaW9yLiBUaGlzIGNvdWxkIGJlIHVzZWQgdG8gbG9hZAorYSBib290IGJsb2NrIGF0IGFkZHJlc3MgMHgwIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgdG8gcnVuCitmcm9tIFJBTSAoMHgyMDAwMDAwKS4KKworVG8gc3RhcnQgZGVidWdnaW5nIGEgcHJvZ3JhbSB0eXBlICdsb2FkIDxwcm9ncmFtPicgYW5kIGRlYnVnIGFzCit1c3VhbC4gCisKK1RoZSBuYXRpdmUgc2ltdWxhdG9yIGNvbW1hbmRzIGNhbiBiZSByZWFjaGVkIHVzaW5nIHRoZSBHREIgJ3NpbScKK2NvbW1hbmQ6CisKK3NpbSA8c2lzX2NvbW1hbmQ+CisKK0RpcmVjdCBzaW11bGF0b3IgY29tbWFuZHMgZHVyaW5nIGEgR0RCIHNlc3Npb24gbXVzdCBiZSBpc3N1ZWQKK3dpdGggY2FyZSBub3QgdG8gZGlzdHVyYiBHREIncyBvcGVyYXRpb24gLi4uIAorCitGb3IgaW5mbyBvbiBzdXBwb3J0ZWQgRVJDMzIgZnVuY3Rpb25hbGl0eSwgc2VlIFJFQURNRS5zaXMuCisKKworMy4gTG9hZGluZyBhb3V0IGZpbGVzCisKK1RoZSBHREIgbG9hZCBjb21tYW5kIGxvYWRzIGFuIGFvdXQgZmlsZSBpbnRvIHRoZSBzaW11bGF0b3IKK21lbW9yeSB3aXRoIHRoZSBkYXRhIHNlY3Rpb24gc3RhcnRpbmcgZGlyZWN0bHkgYWZ0ZXIgdGhlIHRleHQKK3NlY3Rpb24gcmVnYXJkbGVzcyBvZiB3aWNoIHN0YXJ0IGFkZHJlc3Mgd2FzIHNwZWNpZmllZCBmb3IgdGhlIGRhdGEKK2F0IGxpbmsgdGltZSEgVGhpcyBtZWFucyB0aGF0IHlvdXIgYXBwbGljYXRpb25zIGVpdGhlciBoYXMgdG8gaW5jbHVkZQorYSByb3V0aW5lIHRoYXQgaW5pdGlhbGlzZSB0aGUgZGF0YSBzZWdtZW50IGF0IHRoZSBwcm9wZXIgYWRkcmVzcyBvcgorbGluayB3aXRoIHRoZSBkYXRhIHBsYWNlZCBkaXJlY3RseSBhZnRlciB0aGUgdGV4dCBzZWN0aW9uLgorCitBIGNvcHlpbmcgcm91dGluZSBpcyBmYWlybHkgc2ltcGxlLCBqdXN0IGNvcHkgYWxsIGRhdGEgYmV0d2VlbgorX2V0ZXh0IGFuZCBfZGF0YSB0byBhIG1lbW9yeSBsb2FjdGlvbiBzdGFydGluZyBhdCBfZW52aXJvbi4gVGhpcworc2hvdWxkIGJlIGRvbmUgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgYnNzIGlzIGNsZWFyZWQgKGluIHNydDAucykuCisKKworNC4gR0RCIGJyZWFrcG9pbnQgaGFuZGxpbmcKKworR0RCIGluc2VydHMgYnJlYWtwb2ludCBpbiB0aGUgZm9ybSBvZiB0aGUgJ3RhIDEnIGluc3RydWN0aW9uLiBUaGUKK0dEQi1pbnRlZ3JhdGVkIHNpbXVsYXRvciB3aWxsIHRoZXJlZm9yZSByZWNvZ25pemUgdGhlIGJyZWFrcG9pbnQKK2luc3RydWN0aW9uIGFuZCByZXR1cm4gY29udHJvbCB0byBHREIuIElmIHRoZSBhcHBsaWNhdGlvbiB1c2VzCisndGEgMScsIHRoZSBicmVha3BvaW50IGRldGVjdGlvbiBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgLW5vZ2RiCitzd2l0Y2guIEluIHRoaXMgY2FzZSBob3dldmVyLCBHREIgYnJlYWtwb2ludHMgd2lsbCBub3Qgd29yay4KKworCitSZXBvcnQgcHJvYmxlbXMgdG8gSmlyaSBHYWlzbGVyIEVTQS9FU1RFQyAoamdhaXNAd2QuZXN0ZWMuZXNhLm5sKQpkaWZmIC0tZ2l0IGEvc2ltL2VyYzMyL1JFQURNRS5zaXMgYi9zaW0vZXJjMzIvUkVBRE1FLnNpcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTE5ZjAzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2VyYzMyL1JFQURNRS5zaXMKQEAgLTAsMCArMSwzNTYgQEAKKworU0lTIC0gU3BhcmMgSW5zdHJ1Y3Rpb24gU2ltdWxhdG9yIFJFQURNRSBmaWxlICAodjIuMCwgMDUtMDItMTk5NikKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMS4gSW50cm9kdWN0aW9uCisKK1RoZSBTSVMgaXMgYSBTUEFSQyBWNyBhcmNoaXRlY3R1cmUgc2ltdWxhdG9yLiBJdCBjb25zaXN0IG9mIHR3byBwYXJ0cywKK3RoZSBzaW11bGF0b3IgY29yZSBhbmQgYSB1c2VyIGRlZmluZWQgbWVtb3J5IG1vZHVsZS4gVGhlIHNpbXVsYXRvcgorY29yZSBleGVjdXRlcyB0aGUgaW5zdHJ1Y3Rpb25zIHdoaWxlIHRoZSBtZW1vcnkgbW9kdWxlIGVtdWxhdGVzIG1lbW9yeQorYW5kIHBlcmlwaGVyYWxzLiAKKworMi4gVXNhZ2UKKworVGhlIHNpbXVsYXRvciBpcyBzdGFydGVkIGFzIGZvbGxvd3M6IAorCitzaXMgWy11YXJ0MSB1YXJ0X2RldmljZTFdIFstdWFydDIgdWFydF9kZXZpY2UyXSAKKyAgICBbLW5mcF0gWy1mcmVxIGZyZXF1ZW5jeV0gWy1jIGJhdGNoX2ZpbGVdIFtmaWxlc10gCisKK1RoZSBkZWZhdWx0IHVhcnQgZGV2aWNlcyBmb3IgU0lTIGFyZSAvZGV2L3B0eXBjIGFuZCAvZGV2L3B0eXBkLiBUaGUKKy11YXJ0WzEsMl0gc3dpdGNoIGNhbiBiZSB1c2VkIHRvIGNvbm5lY3QgdGhlIHVhcnRzIHRvIG90aGVyIGRldmljZXMuCitVc2UgJ3RpcCAvZGV2L3R0eXBjJyAgdG8gY29ubmVjdCBhIHRlcm1pbmFsIGVtdWxhdG9yIHRvIHRoZSB1YXJ0cy4KK1RoZSAnLW5mcCcgd2lsbCBkaXNhYmxlIHRoZSBzaW11bGF0ZWQgRlBVLCBzbyBlYWNoIEZQVSBpbnN0cnVjdGlvbiB3aWxsCitnZW5lcmF0ZSBhIEZQVSBkaXNhYmxlZCB0cmFwLiBUaGUgJy1mcmVxJyBzd2l0Y2ggY2FuIGJlIHVzZWQgdG8gZGVmaW5lCit3aGljaCAiZnJlcXVlbmN5IiB0aGUgc2ltdWxhdG9yIHJ1bnMgYXQuIFRoaXMgaXMgdXNlZCBieSB0aGUgJ3BlcmYnCitjb21tYW5kIHRvIGNhbGN1bGF0ZWQgdGhlIE1JUFMgZmlndXJlIGZvciBhIHBhcnRpY3VsYXIgY29uZmlndXJhdGlvbi4KK1RoZSBnaXZlIGZyZXF1ZW5jeSBtdXN0IGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgZnJlcXVlbmN5IGluIE1Iei4KKworVGhlIC1jIG9wdGlvbiBpbmRpY2F0ZXMgdGhhdCBzaXMgY29tbWFuZHMgc2hvdWxkIGJlIHJlYWQgZnJvbSAnYmF0Y2hfZmlsZScgCithdCBzdGFydHVwLgorCitGaWxlcyB0byBiZSBsb2FkZWQgbXVzdCBiZSBpbiBvbmUgb2YgdGhlIHN1cHBvcnRlZCBmb3JtYXRzIChzZWUgSU5TVEFMTEFUSU9OKSwKK2FuZCB3aWxsIGJlIGxvYWRlZCBpbnRvIHRoZSBzaW11bGF0ZWQgbWVtb3J5LiBUaGUgZmlsZSBmb3JtYXRzIGFyZQorYXV0b21hdGljYWxseSByZWNvZ25pc2VkLgorCitUaGUgc2NyaXB0ICdzdGFydHNpbScgd2lsbCBzdGFydCB0aGUgc2ltdWxhdG9yIGluIG9uZSB4dGVybSB3aW5kb3cgYW5kCitvcGVuIGEgdGVybWluYWwgZW11bGF0b3IgKHRpcCkgY29ubmVjdGVkIHRvIHRoZSBVQVJUIEEgaW4gYSBzZWNvbmQKK3h0ZXJtIHdpbmRvdy4gQmVsb3cgaXMgZGVzY3JpcHRpb24gb2YgY29tbWFuZHMgIHRoYXQgYXJlIHJlY29nbml6ZWQgYnkgCit0aGUgc2ltdWxhdG9yLiBUaGUgY29tbWFuZC1saW5lIGlzIHBhcnNlZCB1c2luZyBHTlUgcmVhZGxpbmUuIEEgY29tbWFuZAoraGlzdG9yeSBvZiA2NCBjb21tYW5kcyBpcyBtYWludGFpbmVkLiBVc2UgdGhlIHVwL2Rvd24gYXJyb3dzIHRvIHJlY2FsbAorcHJldmlvdXMgY29tbWFuZHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgcmVhZGxpbmUgZG9jdW1lbnRhdGlvbi4KKworYmF0Y2ggPGZpbGU+CisKK0V4ZWN1dGUgYSBiYXRjaCBmaWxlIG9mIFNJUyBjb21tYW5kcy4KKworK2JwIDxhZGRyZXNzPgorCitBZGRzIGFuIGJyZWFrcG9pbnQgYXQgYWRkcmVzcyA8YWRkcmVzcz4uCisKK2JwCisKK1ByaW50cyBhbGwgYnJlYWtwb2ludHMKKworLWJwIDxudW0+CisKK0RlbGV0ZXMgYnJlYWtwb2ludCA8bnVtPi4gVXNlICdicCcgdG8gc2VlIHdoaWNoIG51bWJlciBpcyBhc3NpZ25lZCB0byB0aGUgCiticmVha3BvaW50cy4KKworY29udCBbaW5zdF9jb3VudF0KKworQ29udGludWUgZXhlY3V0aW9uIGF0IHByZXNlbnQgcG9zaXRpb24sIG9wdGlvbmFsbHkgZm9yIFtpbnN0X2NvdW50XSAKK2luc3RydWN0aW9ucy4KKworZGlzIFthZGRyXSBbY291bnRdCisKK0Rpc2Fzc2VtYmxlIFtjb3VudF0gaW5zdHJ1Y3Rpb25zIGF0IGFkZHJlc3MgW2FkZHJdLiBEZWZhdWx0IHZhbHVlcyBmb3IKK2NvdW50IGlzIDE2IGFuZCBhZGRyIGlzIHRoZSBwcmVzZW50IGFkZHJlc3MuCisKK2VjaG8gPHN0cmluZz4KKworUHJpbnQgPHN0cmluZz4gdG8gdGhlIHNpbXVsYXRvciB3aW5kb3cuCisKK2Zsb2F0CisKK1ByaW50cyB0aGUgRlBVIHJlZ2lzdGVycworCitnbyA8YWRkcmVzcz4gW2luc3RfY291bnRdCisKK1RoZSBnbyBjb21tYW5kIHdpbGwgc2V0IHBjIHRvIDxhZGRyZXNzPiBhbmQgbnBjIHRvIDxhZGRyZXNzPiArIDQsIGFuZCBzdGFydAorZXhlY3V0aW9uLiBObyBvdGhlciBpbml0aWFsaXNhdGlvbiB3aWxsIGJlIGRvbmUuIElmIGluc3RfY291bnQgaXMgZ2l2ZW4sIAorZXhlY3V0aW9uIHdpbGwgc3RvcCBhZnRlciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBpbnN0cnVjdGlvbnMuCisKK2hlbHAKKworUHJpbnQgYSBzbWFsbCBoZWxwIG1lbnUgZm9yIHRoZSBTSVMgY29tbWFuZHMuCisKK2hpc3QgW3RyYWNlX2xlbmd0aF0KKworRW5hYmxlIHRoZSBpbnN0cnVjdGlvbiB0cmFjZSBidWZmZXIuIFRoZSAndHJhY2VfbGVuZ3RoJyBsYXN0IGV4ZWN1dGVkIAoraW5zdHJ1Y3Rpb25zIHdpbGwgYmUgcGxhY2VkIGluIHRoZSB0cmFjZSBidWZmZXIuIEEgJ2hpc3QnIGNvbW1hbmQgd2l0aG91dCAKK2EgdHJhY2VfbGVuZ3RoIHdpbGwgZGlzcGxheSB0aGUgdHJhY2UgYnVmZmVyLiBTcGVjaWZ5aW5nIGEgemVybyB0cmFjZSAKK2xlbmd0aCB3aWxsIGRpc2FibGUgdGhlIHRyYWNlIGJ1ZmZlci4KKworbG9hZCAgPGZpbGVfbmFtZT4KKworTG9hZHMgYSBmaWxlIGludG8gc2ltdWxhdG9yIG1lbW9yeS4gCisKK21lbSBbYWRkcl0gW2NvdW50XQorCitEaXNwbGF5IG1lbW9yeSBhdCBbYWRkcl0gZm9yIFtjb3VudF0gYnl0ZXMuIFNhbWUgZGVmYXVsdCB2YWx1ZXMgYXMgYWJvdmUuCisKK3F1aXQKKworRXhpdHMgdGhlIHNpbXVsYXRvci4KKworcGVyZiBbcmVzZXRdCisKK1RoZSAncGVyZicgY29tbWFuZCB3aWxsIGRpc3BsYXkgdmFyaW91cyBleGVjdXRpb24gc3RhdGlzdGljcy4gQSAncGVyZiByZXNldCcgCitjb21tYW5kIHdpbGwgcmVzZXQgdGhlIHN0YXRpc3RpY3MuIFRoaXMgY2FuIGJlIHVzZWQgaWYgc3RhdGlzdGljcyBzaGFsbCAKK2JlIGNhbGN1bGF0ZWQgb25seSBvdmVyIGEgcGFydCBvZiB0aGUgcHJvZ3JhbS4gVGhlICdydW4nIGFuZCAncmVzZXQnIAorY29tbWFuZCBhbHNvIHJlc2V0cyB0aGUgc3RhdGlzdGljIGluZm9ybWF0aW9uLgorCityZWcgW3JlZ19uYW1lXSBbdmFsdWVdCisKK1ByaW50cyBhbmQgc2V0cyB0aGUgSVUgcmVnaXRlcnMuICdyZWcnIHdpdGhvdXQgcGFyYW1ldGVycyBwcmludHMgdGhlIElVCityZWdpc3RlcnMuICdyZWcgW3JlZ19uYW1lXSBbdmFsdWVdJyBzZXRzIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lzdGVyIHRvCitbdmFsdWVdLiBWYWxpZCByZWdpc3RlciBuYW1lcyBhcmUgcHNyLCB0YnIsIHdpbSwgeSwgZzEtZzcsIG8wLW83IGFuZAorbDAtbDcuCisKK3Jlc2V0CisKK1BlcmZvcm1zIGEgcG93ZXItb24gcmVzZXQuIFRoaXMgY29tbWFuZCBpcyBlcXVhbCB0byAncnVuIDAnLgorCitydW4gW2luc3RfY291bnRdCisKK1Jlc2V0cyB0aGUgc2ltdWxhdG9yIGFuZCBzdGFydHMgZXhlY3V0aW9uIGZyb20gYWRkcmVzcyAwLiBJZiBhbiBpbnN0cnVjdGlvbgorY291bnQgaXMgZ2l2ZW4gKGluc3RfY291bnQpLCB0aGUgc2ltdWxhdG9yIHdpbGwgc3RvcCBhZnRlciB0aGUgc3BlY2lmaWVkIAorbnVtYmVyIG9mIGluc3RydWN0aW9ucy4gVGhlIGV2ZW50IHF1ZXVlIGlzIGVtcHRpZWQgYnV0IGFueSBzZXQgYnJlYWtwb2ludHMKK3JlbWFpbi4KKworc3RlcAorCitFcXVhbCB0byAndHJhY2UgMScKKwordHJhIFtpbnN0X2NvdW50XQorCitTdGFydHMgdGhlIHNpbXVsYXRvciBhdCB0aGUgcHJlc2VudCBwb3NpdGlvbiBhbmQgcHJpbnRzIGVhY2ggaW5zdHJ1Y3Rpb24KK2l0IGV4ZWN1dGVzLiBJZiBhbiBpbnN0cnVjdGlvbiBjb3VudCBpcyBnaXZlbiAoaW5zdF9jb3VudCksIHRoZSBzaW11bGF0b3IgCit3aWxsIHN0b3AgYWZ0ZXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLgorCitUeXBpbmcgYSAnQ3RybC1DJyB3aWxsIGludGVycnVwdCBhIHJ1bm5pbmcgc2ltdWxhdG9yLiAKKworU2hvcnQgZm9ybXMgb2YgdGhlIGNvbW1hbmRzIGFyZSBhbGxvd2VkLCBlLmcgJ2MnICdjbycgb3IgJ2NvbicgYXJlIGFsbAoraW50ZXJwcmV0ZWQgYXMgJ2NvbnQnLiAKKworCiszLiBTaW11bGF0b3IgY29yZQorCitUaGUgU0lTIGVtdWxhdGVzIHRoZSBiZWhhdmlvciBvZiB0aGUgOTBDNjAxRSBhbmQgOTBDNjAyRSBzcGFyYyBJVSBhbmQKK0ZQVSBmcm9tIE1hdHJhIE1IUy4gVGhlc2UgYXJlIHJvdWdobHkgZXF1aXZhbGVudCB0byB0aGUgQ3lwcmVzcyBDNjAxCithbmQgQzYwMi4gIFRoZSBzaW11bGF0b3IgaXMgY3ljbGUgdHJ1ZSwgaS5lIGEgc2ltdWxhdG9yIHRpbWUgaXMKK21haW50YWluZWQgYW5kIGlucmVtZW50ZWQgYWNjb3JkaW5nIHRoZSBJVSBhbmQgRlBVIGluc3RydWN0aW9uIHRpbWluZy4KK1RoZSBwYXJhbGxlbCBleGVjdXRpb24gYmV0d2VlbiB0aGUgSVUgYW5kIEZQVSBpcyBtb2RlbGxlZCwgYXMgd2VsbCBhcworc3RhbGxzIGR1ZSB0byBvcGVyYW5kIGRlcGVuZGVuY2llcyAoRlBVKS4gVGhlIGNvcmUgaW50ZXJhY3RzIHdpdGggdGhlCit1c2VyLWRlZmluZWQgbWVtb3J5IG1vZHVsZXMgdGhyb3VnaCBhIG51bWJlciBvZiBmdW5jdGlvbnMuIFRoZSBtZW1vcnkKK21vZHVsZSBtdXN0IHByb3ZpZGUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CisKK2ludCBtZW1vcnlfcmVhZChhc2ksYWRkcixkYXRhLHdzKQoraW50IGFzaTsKK3Vuc2lnbmVkIGludCBhZGRyOwordW5zaWduZWQgaW50ICpkYXRhOworaW50ICp3czsKKworaW50IG1lbW9yeV93cml0ZShhc2ksYWRkcixkYXRhLHN6LHdzKQoraW50IGFzaTsKK3Vuc2lnbmVkIGludCBhZGRyOwordW5zaWduZWQgaW50ICpkYXRhOworaW50IHN6OworaW50ICp3czsKKworaW50IHNpc19tZW1vcnlfcmVhZChhZGRyLCBkYXRhLCBsZW5ndGgpCit1bnNpZ25lZCBpbnQgYWRkcjsKK2NoYXIgICAqZGF0YTsKK3Vuc2lnbmVkIGludCBsZW5ndGg7CisKK2ludCBzaXNfbWVtb3J5X3dyaXRlKGFkZHIsIGRhdGEsIGxlbmd0aCkKK3Vuc2lnbmVkIGludCBhZGRyOworY2hhciAgICAqZGF0YTsKK3Vuc2lnbmVkIGludCBsZW5ndGg7CisKK2ludCBpbml0X3NpbSgpCisKK2ludCByZXNldCgpCisKK2ludCBlcnJvcl9tb2RlKHBjKQordW5zaWduZWQgaW50IHBjOworCittZW1vcnlfcmVhZCgpIGlzIHVzZWQgYnkgdGhlIHNpbXVsYXRvciB0byBmZXRjaCBpbnN0cnVjdGlvbnMgYW5kCitvcGVyYW5kcy4gIFRoZSBhZGRyZXNzIHNwYWNlIGlkZW50aWZpZXIgKGFzaSkgYW5kIGFkZHJlc3MgaXMgcGFzc2VkIGFzCitwYXJhbWV0ZXJzLiBUaGUgcmVhZCBkYXRhIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUgZGF0YSBwb2ludGVyCisoKmRhdGEpIGFuZCB0aGUgbnVtYmVyIG9mIHdhaXRzdGF0ZSB0byAqd3MuICdtZW1vcnlfcmVhZCcgc2hvdWxkIHJldHVybgorMCBvbiBzdWNjZXNzIGFuZCAxIG9uIGZhaWx1cmUuIEEgZmFpbHVyZSB3aWxsIGNhdXNlIGEgZGF0YSBvcgoraW5zdHJ1Y3Rpb24gZmV0Y2ggdHJhcC4gbWVtb3J5X3JlYWQoKSBhbHdheXMgcmVhZHMgb25lIDMyLWJpdCB3b3JkLgorCitzaXNfbWVtb3J5X3JlYWQoKSBpcyB1c2VkIGJ5IHRoZSBzaW11bGF0b3IgdG8gZGlzcGxheSBhbmQgZGlzYXNzZW1ibGUKK21lbW9yeSBjb250YW50cy4gVGhlIGZ1bmN0aW9uIHNob3VsZCBjb3B5ICdsZW5ndGgnIGJ5dGVzIG9mIHRoZSBzaW11bGF0ZWQKK21lbW9yeSBzdGFydGluZyBhdCAnYWRkcicgdG8gJypkYXRhJy4KK1RoZSBzaXNfbWVtb3J5X3JlYWQoKSBzaG91bGQgcmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBvbiBmYWlsdXJlLgorRmFpbHVyZSBzaG91bGQgb25seSBiZSBpbmRpY2F0ZWQgaWYgYWNjZXNzIHRvIHVuaW1wbGVtZW50ZWQgbWVtb3J5IGlzIGF0dGVtcHRlZC4KKworbWVtb3J5X3dyaXRlKCkgaXMgdXNlZCB0byB3cml0ZSB0byBtZW1vcnkuIEluIGFkZGl0aW9uIHRvIHRoZSBhc2kKK2FuZCBhZGRyZXNzIHBhcmFtZXRlcnMsIHRoZSBzaXplIG9mIHRoZSB3cml0dGVuIGRhdGEgaXMgZ2l2ZW4gYnkgJ3N6Jy4KK1RoZSBwb2ludGVyICpkYXRhIHBvaW50cyB0byB0aGUgZGF0YSB0byBiZSB3cml0dGVuLiBUaGUgJ3N6JyBpcyBjb2RlZAorYXMgZm9sbG93czoKKworICBzeglhY2Nlc3MgdHlwZQorICAwCSAgYnl0ZQorICAxCSAgaGFsZndvcmQKKyAgMgkgIHdvcmQKKyAgMwkgIGRvdWJsZS13b3JkCisKK0lmIGEgZG91YmxlIHdvcmQgaXMgd3JpdHRlbiwgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgd29yZCBpcyBpbiBkYXRhWzBdIGFuZAordGhlIGxlYXN0IHNpZ25pZmljYW50IGluIGRhdGFbMV0uCisKK3Npc19tZW1vcnlfd3JpdGUoKSBpcyB1c2VkIGJ5IHRoZSBzaW11bGF0b3IgZHVyaW5nIGxvYWRpbmcgb2YgcHJvZ3JhbXMuCitUaGUgZnVuY3Rpb24gc2hvdWxkIGNvcHkgJ2xlbmd0aCcgYnl0ZXMgZnJvbSAqZGF0YSB0byB0aGUgc2ltdWxhdGVkCittZW1vcnkgc3RhcnRpbmcgYXQgJ2FkZHInLiBzaXNfbWVtb3J5X3dyaXRlKCkgc2hvdWxkIHJldHVybiAxIG9uIAorc3VjY2VzcyBhbmQgMCBvbiBmYWlsdXJlLiBGYWlsdXJlIHNob3VsZCBvbmx5IGJlIGluZGljYXRlZCBpZiBhY2Nlc3MgCit0byB1bmltcGxlbWVudGVkIG1lbW9yeSBpcyBhdHRlbXB0ZWQuIFNlZSBlcmMzMi5jIGZvciBtb3JlIGRldGFpbHMgCitvbiBob3cgdG8gZGVmaW5lIHRoZSBtZW1vcnkgZW11bGF0aW9uIGZ1bmN0aW9ucy4KKworVGhlICdpbml0X3NpbScgaXMgY2FsbGVkIG9uY2Ugd2hlbiB0aGUgc2ltdWxhdG9yIGlzIHN0YXJ0ZWQuIFRoaXMgZnVuY3Rpb24KK3Nob3VsZCBiZSB1c2VkIHRvIHBlcmZvcm0gaW5pdGlhbGlzYXRpb25zIG9mIHVzZXIgZGVmaW5lZCBtZW1vcnkgb3IgCitwZXJpcGhlcmFscyB0aGF0IG9ubHkgaGF2ZSB0byBiZSBkb25lIG9uY2UsIHN1Y2ggYXMgb3BlbmluZyBmaWxlcyBldGMuCisKK1RoZSAncmVzZXQnIGlzIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBzaW11bGF0b3IgaXMgcmVzZXQsIGkuZS4gd2hlbiBhCisncnVuJyBjb21tYW5kIGlzIGdpdmVuLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIHRvIHNpbXVsYXRlIGEgcG93ZXIKK29uIHJlc2V0IG9mIG1lbW9yeSBhbmQgcGVyaXBoZXJhbHMuCisKK2Vycm9yX21vZGUoKSBpcyBjYWxsZWQgYnkgdGhlIHNpbXVsYXRvciB3aGVuIHRoZSBJVSBnb2VzIGludG8gZXJyb3IgbW9kZSwKK3R5cGljYWxseSBpZiBhIHRyYXAgaXMgY2F1c2VkIHdoZW4gdHJhcHMgYXJlIGRpc2FibGVkLiBUaGUgbWVtb3J5IG1vZHVsZQorY2FuIHRoZW4gdGFrZSBhY3Rpb25zLCBzdWNoIGFzIGlzc3VlIGEgcmVzZXQuCisKK3N5c19yZXNldCgpIGNhbiBiZSBjYWxsZWQgYnkgdGhlIG1lbW9yeSBtb2R1bGUgdG8gcmVzZXQgdGhlIHNpbXVsYXRvci4gQQorcmVzZXQgd2lsbCBlbXB0eSB0aGUgZXZlbnQgcXVldWUgYW5kIHBlcmZvcm0gYSBwb3dlci1vbiByZXNldC4KKworNC4gRXZlbnRzIGFuZCBpbnRlcnJ1cHRzCisKK1RoZSBzaW11bGF0b3Igc3VwcG9ydHMgYW4gZXZlbnQgcXVldWUgYW5kIHRoZSBnZW5lcmF0aW9uIG9mIHByb2Nlc3NvcgoraW50ZXJydXB0cy4gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSB0byB0aGUgdXNlci1kZWZpbmVkCittZW1vcnkgbW9kdWxlOgorCitldmVudChjZnVuYyxhcmcsZGVsdGEpCit2b2lkICgqY2Z1bmMpKCk7CitpbnQgYXJnOwordW5zaWduZWQgaW50IGRlbHRhOworCitzZXRfaW50KGxldmVsLGNhbGxiYWNrLGFyZykKK2ludCBsZXZlbDsKK3ZvaWQgKCpjYWxsYmFjaykoKTsKK2ludCBhcmc7CisKK2NsZWFyX2ludChsZXZlbCkKK2ludCBsZXZlbDsKKworc2ltX3N0b3AoKQorCitUaGUgJ2V2ZW50JyBmdW5jdGlvbnMgd2lsbCBzY2hlZHVsZSB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbiAnY2Z1bmMnCithdCB0aW1lICdub3cgKyBkZWx0YScgY2xvY2sgY3ljbGVzLiBUaGUgcGFyYW1ldGVyICdhcmcnIGlzIHBhc3NlZCBhcyBhIAorcGFyYW1ldGVyIHRvICdjZnVuYycuCisKK1RoZSAnc2V0X2ludCcgZnVuY3Rpb24gc2V0IHRoZSBwcm9jZXNzb3IgaW50ZXJydXB0ICdsZXZlbCcuIFdoZW4gdGhlIGludGVycnVwdAoraXMgdGFrZW4sIHRoZSBmdW5jdGlvbiAnY2FsbGJhY2snIGlzIGNhbGxlZCB3aXRoIHRoZSBhcmd1bWVudCAnYXJnJy4gVGhpcword2lsbCBhbHNvIGNsZWFyIHRoZSBpbnRlcnJ1cHQuIEFuIGludGVycnVwdCBjYW4gYmUgY2xlYXJlZCBiZWZvcmUgaXQgaXMKK3Rha2VuIGJ5IGNhbGxpbmcgJ2NsZWFyX2ludCcgd2l0aCB0aGUgYXBwcm9wcmlhdGUgaW50ZXJydXB0IGxldmVsLgorCitUaGUgc2ltX3N0b3AgZnVuY3Rpb24gaXMgY2FsbGVkIGVhY2ggdGltZSB0aGUgc2ltdWxhdG9yIHN0b3BzIGV4ZWN1dGlvbi4KK0l0IGNhbiBiZSB1c2VkIHRvIGZsdXNoIGJ1ZmZlcmVkIGRldmljZXMgdG8gZ2V0IGEgY2xlYW4gc3RhdGUgZHVyaW5nCitzaW5nbGUgc3RlcHBpbmcgZXRjLgorCitTZWUgJ2VyYzMyLmMnIGZvciBleGFtcGxlcyBvbiBob3cgdG8gdXNlIGV2ZW50cyBhbmQgaW50ZXJydXB0cy4KKworNS4gTWVtb3J5IG1vZHVsZQorCitUaGUgc3VwcGxpZWQgbWVtb3J5IG1vZHVsZSAoZXJjMzIuYykgZW11bGF0ZXMgdGhlIGZ1bmN0aW9ucyBvZiBtZW1vcnkgYW5kCit0aGUgTUVDIGFzaWMgZGV2ZWxvcGVkIGZvciB0aGUgOTBDNjAxLzIuIEl0IGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorCisqIFVBUlQgQSAmIEIKKyogUmVhbC10aW1lIGNsb2NrCisqIEdlbmVyYWwgcHVycG9zZSB0aW1lcgorKiBJbnRlcnJ1cHQgY29udHJvbGxlcgorKiBCcmVha3BvaW50IHJlZ2lzdGVyCisqIFdhdGNocG9pbnQgcmVnaXN0ZXIKKyogNTEyIEtieXRlIFJPTQorKiA0IE1ieXRlIFJBTQorCitTZWUgUkVBRE1FLmVyYzMyIG9uIGhvdyB0aGUgTUVDIGZ1bmN0aW9ucyBhcmUgZW11bGF0ZWQuICBGb3IgYSBkZXRhaWxlZCBNRUMKK3NwZWNpZmljYXRpb24sIGxvb2sgYXQgdGhlIEVSQzMyIGhvbWUgcGFnZSBhdCBVUkw6CisKK2h0dHA6Ly93d3cuZXN0ZWMuZXNhLm5sL3dzbXd3dy9lcmMzMgorCis2LiBDb21waWxlIGFuZCBsaW5raW5nIHByb2dyYW1zCisKK1RoZSBkaXJlY3RvcnkgJ2V4YW1wbGVzJyBjb250YWluIHNvbWUgY29kZSBmcmFnbWVudHMgZm9yIFNJUy4KK1RoZSBzY3JpcHQgZ2NjeCBpbmRpY2F0ZXMgaG93IHRoZSBuYXRpdmUgc3Vub3MgZ2NjIGFuZCBsaW5rZXIgY2FuIGJlIHVzZWQKK3RvIHByb2R1Y2UgZXhlY3V0YWJsZXMgZm9yIHRoZSBzaW11bGF0b3IuIFRvIGNvbXBpbGUgYW5kIGxpbmsgdGhlIHByb3ZpZGVkCisnaGVsbG8uYycsIHR5cGUgJ2djY3ggaGVsbG8uYycuIFRoaXMgd2lsbCBidWlsZCB0aGUgZXhlY3V0YWJsZSAnaGVsbG8nLgorU3RhcnQgdGhlIHNpbXVsYXRvciBieSBydW5uaW5nICdzdGFydHNpbSBoZWxsbycsIGFuZCBpc3N1ZSB0aGUgY29tbWFuZCAncnVuLgorQWZ0ZXIgdGhlIHByb2dyYW0gaXMgdGVybWluYXRlZCwgdGhlIElVIHdpbGwgYmUgZm9yY2UgdG8gZXJyb3IgbW9kZSB0aHJvdWdoCithIHNvZnR3YXJlIHRyYXAgYW5kIGhhbHQuIAorCitUaGUgcHJvZ3JhbXMgYXJlIGxpbmtlZCB3aXRoIGEgc3RhcnQtdXAgZmlsZSwgc3J0MC5TLiBUaGlzIGZpbGUgaW5jbHVkZXMKK3RoZSB0cmFwdGFibGUgYW5kIHdpbmRvdyB1bmRlcmZsb3cvb3ZlcmZsb3cgdHJhcCByb3V0aW5lcy4KKworNy4gSVUgYW5kIEZQVSBpbnN0cnVjdGlvbiB0aW1pbmcuCisKK1RoZSBzaW11bGF0b3IgcHJvdmlkZXMgY3ljbGUgdHJ1ZSBzaW11bGF0aW9uLiBUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzCit0aGUgZW11bGF0ZWQgaW5zdHJ1Y3Rpb24gdGltaW5nIGZvciA5MEM2MDFFICYgOTBDNjAyRToKKworSW5zdHJ1Y3Rpb25zCSAgICAgIEN5Y2xlcworCitqbXBsLCByZXR0CQkyCitsb2FkCQkJMgorc3RvcmUJCQkzCitsb2FkIGRvdWJsZQkJMworc3RvcmUgZG91YmxlCQk0CitvdGhlciBpbnRlZ2VyIG9wcwkxCitmYWJzCQkJMgorZmFkZHMJCQk0CitmYWRkZAkJCTQKK2ZjbXBzCQkJNAorZmNtcGQJCQk0CitmZGl2cwkJCTIwCitmZGl2ZAkJCTM1CitmbW92cwkJCTIKK2ZtdWxzCQkJNQorZm11bGQJCQk5CitmbmVncwkJCTIKK2ZzcXJ0cwkJCTM3Citmc3FydGQJCQk2NQorZnN1YnMJCQk0Citmc3ViZAkJCTQKK2ZkdG9pCQkJNworZmRvdHMJCQkzCitmaXRvcwkJCTYKK2ZpdG9kCQkJNgorZnN0b2kJCQk2Citmc3RvZAkJCTIKKworVGhlIHBhcmFsbGVsIG9wZXJhdGlvbiBiZXR3ZWVuIHRoZSBJVSBhbmQgRlBVIGlzIG1vZGVsbGVkLiBUaGlzIG1lYW5zCit0aGF0IGEgRlBVIGluc3RydWN0aW9uIHdpbGwgZXhlY3V0ZSBpbiBwYXJhbGxlbCB3aXRoIG90aGVyIGluc3RydWN0aW9ucyBhcworbG9uZyBhcyBubyBkYXRhIG9yIHJlc291cmNlIGRlcGVuZGVuY3kgaXMgZGV0ZWN0ZWQuIFNlZSB0aGUgOTBDNjAyRSBkYXRhCitzaGVldCBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgZGVwZW5kZW5jaWVzLiBUcmFjaW5nIHVzaW5nIHRoZSAndHJhY2UnCitjb21tYW5kIHdpbGwgZGlzcGxheSB0aGUgY3VycmVudCBzaW11bGF0b3IgdGltZSBpbiB0aGUgbGVmdCBjb2x1bW4uIFRoaXMKK3RpbWUgaW5kaWNhdGVzIHdoZW4gdGhlIGluc3RydWN0aW9uIGlzIGZldGNoZWQuIElmIGEgZGVwZW5kZW5jeSBpcyBkZXRldGVjdGVkLAordGhlIGZvbGxvd2luZyBmZXRjaCB3aWxsIGJlIGRlbGF5ZWQgdW50aWwgdGhlIGNvbmZsaWN0IGlzIHJlc29sdmVkLgorCitUaGUgbG9hZCBkZXBlbmRlbmN5IGluIHRoZSA5MEM2MDFFIGlzIGFsc28gbW9kZWxsZWQgLSBpZiB0aGUgZGVzdGluYXRpb24gCityZWdpc3RlciBvZiBhIGxvYWQgaW5zdHJ1Y3Rpb24gaXMgdXNlZCBieSB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uLCBhbiAKK2lkbGUgY3ljbGUgaXMgaW5zZXJ0ZWQuCisKKzguIEZQVSBpbXBsZW1lbnRhdGlvbgorCitUaGUgc2ltdWxhdG9yIG1hcHMgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBvbiB0aGUgaG9zdHMgZmxvYXRpbmcgcG9pbnQKK2NhcGFiaWxpdGllcy4gVGhpcyBtZWFucyB0aGF0IGFjY3VyYWN5IGFuZCBnZW5lcmF0aW9uIG9mIElFRUUgZXhjZXB0aW9ucyBpcyAKK2hvc3QgZGVwZW5kZW50LgpkaWZmIC0tZ2l0IGEvc2ltL2VyYzMyL2FjY29uZmlnLmggYi9zaW0vZXJjMzIvYWNjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWI4N2ExCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2VyYzMyL2FjY29uZmlnLmgKQEAgLTAsMCArMSwxNSBAQAorCisvKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KKyN1bmRlZiBFTkFCTEVfTkxTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0NBVEdFVFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvY29uZmlnLmluIGIvc2ltL2VyYzMyL2NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjg3YTJiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2VyYzMyL2NvbmZpZy5pbgpAQCAtMCwwICsxLDE1OCBAQAorLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCisjdW5kZWYgQ19BTExPQ0EKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCisjdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCisjdW5kZWYgSEFWRV9BTExPQ0EKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCisjdW5kZWYgaW5saW5lCisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgb2ZmX3QKKworLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCisjdW5kZWYgX1BPU0lYX1NPVVJDRQorCisvKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoaW50IG9yIHZvaWQpLiAgKi8KKyN1bmRlZiBSRVRTSUdUWVBFCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIHNpemVfdAorCisvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKKyAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgorIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgorICovCisjdW5kZWYgU1RBQ0tfRElSRUNUSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19zZXRmcHVjdyBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX1NFVEZQVUNXCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0RDR0VUVEVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRDV0QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRQQUdFU0laRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHJ1c2FnZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRSVVNBR0UKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfTVVOTUFQCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1BVVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VUTE9DQUxFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lnYWN0aW9uIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NJR0FDVElPTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0hSCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGltZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9USU1FCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfQVJHWl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZnB1X2NvbnRyb2wuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfRlBVX0NPTlRST0xfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9NQUxMT0NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9OTF9UWVBFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVkFMVUVTX0gKZGlmZiAtLWdpdCBhL3NpbS9lcmMzMi9jb25maWd1cmUgYi9zaW0vZXJjMzIvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc5M2FjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZXJjMzIvY29uZmlndXJlCkBAIC0wLDAgKzEsMzkzMiBAQAorIyEgL2Jpbi9zaAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCisjIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCisKKyMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDMKKworCisKKworCisjIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCisKKworIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCisKKworIyBDaGVjayB0byBzZWUgaWYgd2UncmUgcnVubmluZyB1bmRlciBDeWd3aW4zMiwgd2l0aG91dCB1c2luZworIyBBQ19DQU5PTklDQUxfKi4gIElmIHNvLCBzZXQgb3V0cHV0IHZhcmlhYmxlIENZR1dJTjMyIHRvICJ5ZXMiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICJubyIuCisKKworCisjIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIFdpbjMyLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgRVhFRVhUIHRvICIuZXhlIi4KKyMgT3RoZXJ3aXNlIHNldCBpdCB0byAiIi4KKworCisKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCithY19oZWxwPSIkYWNfaGVscAorICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQkJRW5hYmxlIGRldmVsb3BlciBmdW5jdGlvbmFsaXR5LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1ic3dhcAkJCVVzZSBIb3N0IHNwZWNpZmljIEJTV0FQIGluc3RydWN0aW9uLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1jZmxhZ3M9b3B0cwkJRXh0cmEgQ0ZMQUdTIGZvciB1c2UgaW4gYnVpbGRpbmcgc2ltdWxhdG9yIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWRlYnVnPW9wdHMJCUVuYWJsZSBkZWJ1Z2dpbmcgZmxhZ3MiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tc3RkaW8JCQlTcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIHN0ZGlvIGZvciBjb25zb2xlIGlucHV0L291dHB1dC4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tdHJhY2U9b3B0cwkJRW5hYmxlIHRyYWNpbmcgZmxhZ3MiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tcHJvZmlsZT1vcHRzCQlFbmFibGUgcHJvZmlsaW5nIGZsYWdzIgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorYWNfbWF4X2hlcmVfbGluZXM9MTIKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19wcm9nPSQwCisgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCisKKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgLiAkY2FjaGVfZmlsZQorZWxzZQorICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgPiAkY2FjaGVfZmlsZQorZmkKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworYWNfZXhlZXh0PQorYWNfb2JqZXh0PW8KK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCitlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Njc3OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0CisgICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCisgIENQUD0iJHtDQy1jY30gLUUiCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDY5MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Njk4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3MDkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjcxNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzI2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MzI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9L2xpYi9jcHAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzU3OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKK3NldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCithbGw6CisJQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKK0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCitldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKK2lmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCitlbHNlCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCitmaQorcm0gLWYgY29uZnRlc3RtYWtlCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBTRVRfTUFLRT0KK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3ODQ6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKK2lmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgorICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQorRU9GCisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDQz0iJENDIC1wb3NpeCIKKyAgZWxzZQorICAgIENDPSIkQ0MgLVhwIgorICBmaQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgSVNDPQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjgwNTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODEwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MTg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODM1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDg1MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4NzQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKK2ludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKK2lmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7CitleGl0ICgwKTsgfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODg1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNURENfSEVBREVSUyAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkwOTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5MTQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKworLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3R5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKKy8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCitjaGFyIGNvbnN0ICpjb25zdCAqY2NwOworY2hhciAqKnA7CisvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Oworc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07CisvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KKyAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCitjb25zdCBjaGFyICpnID0gInN0cmluZyI7CitjY3AgPSAmZyArIChnID8gZy1nIDogMCk7CisvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLworKytjY3A7CitwID0gKGNoYXIqKikgY2NwOworY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Cit7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLworICBjaGFyICp0OworICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOworCisgICp0KysgPSAwOworfQoreyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KKyAgaW50IHhbXSA9IHsyNSwgMTd9OworICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOworICArK2ZvbzsKK30KK3sgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLworICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKKyAgaXB0ciBwID0gMDsKKyAgKytwOworfQoreyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCisgICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KKyAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKKyAgc3RydWN0IHMgKmI7IGItPmogPSA1OworfQoreyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KKyAgY29uc3QgaW50IGZvbyA9IDEwOworfQorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTYzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGNvbnN0IAorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjk4NDogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19jdl9jX2lubGluZT1ubworZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbworICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5OTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK30gJGFjX2t3IGZvbygpIHsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5OTg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZG9uZQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2CitjYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCisgIGlubGluZSB8IHllcykgOzsKKyAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBpbmxpbmUgCitFT0YKKyA7OworICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQorRU9GCisgOzsKK2VzYWMKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDI0OiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDI5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIG9mZl90IGxvbmcKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDU3OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwNjIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgInNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2l6ZV90PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2l6ZV90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBzaXplX3QgdW5zaWduZWQKK0VPRgorCitmaQorCisjIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcworIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDkyOiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA5NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YWxsb2NhLmg+CitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTEyNTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTMwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorI2Vsc2UKKyMgaWZkZWYgX01TQ19WRVIKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjIGVsc2UKKyMgIGlmIEhBVkVfQUxMT0NBX0gKKyMgICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgIGVsc2UKKyMgICBpZmRlZiBfQUlYCisgI3ByYWdtYSBhbGxvY2EKKyMgICBlbHNlCisjICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCitjaGFyICphbGxvY2EgKCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworaW50IG1haW4oKSB7CitjaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBIDEKK0VPRgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCisgICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCisgICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgorICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKKyAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCisgIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBDX0FMTE9DQSAxCitFT0YKKworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTkwOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTE5NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCit3ZWJlY3JheQorI2Vsc2UKK3dlbm90YmVjcmF5CisjZW5kaWYKKworRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9vc19jcmF5PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgoraWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgorZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbworICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyMjA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyMjUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYworRU9GCisKKyAgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitkb25lCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjc1OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTI4MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCitmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKQoreworICBzdGF0aWMgY2hhciAqYWRkciA9IDA7CisgIGF1dG8gY2hhciBkdW1teTsKKyAgaWYgKGFkZHIgPT0gMCkKKyAgICB7CisgICAgICBhZGRyID0gJmR1bW15OworICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Cit9CittYWluICgpCit7CisgIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKK30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCitFT0YKKworZmkKKworZm9yIGFjX2hkciBpbiB1bmlzdGQuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzMjc6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMzMyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzM3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzNjY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzNzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM5NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTQxOTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTQyNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKy8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgorICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6CisJbW1hcCBwcml2YXRlIG5vdCBmaXhlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKyAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCisgICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50CisgICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKKyAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKKyAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQorICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKKyAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0CisgICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KKworICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgorICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKKyAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQorICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLworI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCisjIGlmZGVmIEhBVkVfVU5JU1REX0gKKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBlbmRpZgorCisvKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLworIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQorIyBlbmRpZgorCisjIGlmZGVmIF9TQ19QQUdFU0laRQorIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCisjIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCisjICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICAgaWZkZWYgRVhFQ19QQUdFU0laRQorIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCisjICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICAgIGlmZGVmIE5CUEcKKyMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKKyMgICAgIGlmbmRlZiBDTFNJWkUKKyMgICAgICBkZWZpbmUgQ0xTSVpFIDEKKyMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLworIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KKyMgICAgIGlmZGVmIE5CUEMKKyMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCisjICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KKyMgICAgICBpZmRlZiBQQUdFU0laRQorIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQorIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCisjICAgICBlbmRpZiAvKiBubyBOQlBDICovCisjICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KKyMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLworIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKworI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQorI2Vsc2UKK2NoYXIgKm1hbGxvYygpOworI2VuZGlmCisKK2ludAorbWFpbigpCit7CisJY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7CisJaW50IGksIHBhZ2VzaXplOworCWludCBmZDsKKworCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKKworCS8qCisJICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgorCSAqLworCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJKihkYXRhICsgaSkgPSByYW5kKCk7CisJdW1hc2soMCk7CisJZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgxKTsKKwlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKwkJZXhpdCgxKTsKKwljbG9zZShmZCk7CisKKwkvKgorCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAorCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKKwkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgorCSAqLworCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7CisJaWYgKCFkYXRhMikKKwkJZXhpdCgxKTsKKwlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7CisJaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKKwkJCWV4aXQoMSk7CisKKwkvKgorCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCisJICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgorCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOworCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEzKQorCQlleGl0KDEpOworCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQorCQkJZXhpdCgxKTsKKwljbG9zZShmZCk7CisJdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKKwlleGl0KDApOworfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU2NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX01NQVAgMQorRU9GCisKK2ZpCisKKworIyBhdXRvY29uZi5pbmZvIHNheXMgdGhpcyBzaG91bGQgYmUgY2FsbGVkIHJpZ2h0IGFmdGVyIEFDX0lOSVQuCisKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworCisjIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KKyMgVGhlIGlucHV0cyBhcmU6CisjICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKKyMKKyMgVGhlIHJ1bGVzIGFyZToKKyMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCisjICAgIHNhbWUgdGltZS4KKyMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCisjIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKKyMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCisjIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCisjIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgorCisjIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCisjIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCitjYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KK05PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKKyopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KK2lmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKK2Vsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjQwOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKKworaG9zdF9hbGlhcz0kaG9zdAorY2FzZSAiJGhvc3RfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkKKyAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6CisgICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkgOzsKKyAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCitob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkaG9zdCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2NjE6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1CisKK3RhcmdldF9hbGlhcz0kdGFyZ2V0CitjYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK3RhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKK3RhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCit0YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAordGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2Nzk6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKworYnVpbGRfYWxpYXM9JGJ1aWxkCitjYXNlICIkYnVpbGRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2J1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCitidWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2J1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAorYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKKwordGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgorICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCisgICAgTk9ORU5PTkVzLHgseCwgJiYKKyAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQorCitpZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KK2Vsc2UKKyAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCitzLFxcLFxcXFwsZzsgcyxcJCwkJCxnCitFT0ZfU0VECisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCisgIHJtIC1mIGNvbmZ0ZXN0c2VkCitmaQordGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCit0ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisKKyMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KK3Rlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzIzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzUyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisgICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisJY29udGludWUKKyAgICAgIGZpCisgICAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2lmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgc2hpZnQKKyAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJEAiCisgIGZpCitmaQorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgorICAgICp3aW4zMiogfCAqV0lOMzIqKQorICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTgwMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJjbCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKyA7OworICAgIGVzYWMKKyAgZmkKKyAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTgzMzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTg0MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCittYWluKCl7cmV0dXJuKDApO30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODQ3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKyAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisgIGVsc2UKKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcworICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KK2ZpCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTg2NzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Citjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4NzI6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKKyNpZmRlZiBfX0dOVUNfXworICB5ZXM7CisjZW5kaWYKK0VPRgoraWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4ODE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhY19jdl9wcm9nX2djYz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19nY2M9bm8KK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2CisKK2lmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCisgIEdDQz15ZXMKK2Vsc2UKKyAgR0NDPQorZmkKKworYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCithY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKK0NGTEFHUz0KK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTkwMDogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKK2lmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfY2NfZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTQzOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KKyAgICBjYXNlICIkYWNfZGlyLyIgaW4KKyAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKKyAgICAqKQorICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKyAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICAgIyBieSBkZWZhdWx0LgorICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbworICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisgICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJICAgIDoKKwkgIGVsc2UKKwkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgorCSAgICBicmVhayAyCisJICBmaQorCWZpCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX0lGUyIKKworZmkKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQorICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KKyAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKKyAgZmkKK2ZpCitlY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworCisjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJworZWxzZQorICBDQ19GT1JfQlVJTEQ9Z2NjCitmaQorCisKKworCitBUj0ke0FSLWFyfQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwMDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKK0FMTF9MSU5HVUFTPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKK3VuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjA0MzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIwNDggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNTM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKK19fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDgzOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMDg4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgorICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIxNDA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIxNDUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworICAgZmkKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCisgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NUUENQWSAxCitFT0YKKworICAgZmkKKworICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjAyOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIyMDcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxvY2FsZS5oPgoraW50IG1haW4oKSB7CityZXR1cm4gTENfTUVTU0FHRVMKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjE0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKKyAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKK0VPRgorCisgICAgZmkKKyAgZmkKKyAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjIzNTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgorICBVU0VfTkxTPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX05MUz15ZXMKK2ZpCisKKyAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKKyAgICAKKworICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCisKKyAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBFTkFCTEVfTkxTIDEKK0VPRgorCisgICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjU1OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgorICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCitlbHNlCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KK2ZpCisKKyAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgorCisgICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9CisJbmxzX2N2X2hlYWRlcl9saWJndD0KKwlDQVRPQkpFWFQ9Tk9ORQorCisJYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyNzQ6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIyNzkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpYmludGwuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjI4NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMDE6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjMwNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgoraW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMxMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2CisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCisJICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzI5OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbGludGwgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjMzNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGJpbmR0ZXh0ZG9tYWluKCk7CisKK2ludCBtYWluKCkgeworYmluZHRleHRkb21haW4oKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzNjQ6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjM2OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkgICBmaQorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKKwkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KKwkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9HRVRURVhUIDEKK0VPRgorCisJICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNDA0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgorICA7OworZXNhYworZmkKK01TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgoraWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KKwkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNDM4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNDQzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0OTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI1Mjg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjU2MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ0FUT0JKRVhUPS5nbW8KKwkJICAgREFUQURJUk5BTUU9c2hhcmUKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ0FUT0JKRVhUPS5tbworCQkgICBEQVRBRElSTkFNRT1saWIKK2ZpCitybSAtZiBjb25mdGVzdCoKKwkJSU5TVE9CSkVYVD0ubW8KKwkgICAgICBmaQorCSAgICBmaQorCQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworCSAgICAgICAgCisgICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCisJICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcworICAgICAgICBmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KKyAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgorICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2MDA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgorICA7OworZXNhYworZmkKK01TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgoraWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNjM0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRHTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgID86LyopCQkJIAorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgorICA7OworZXNhYworZmkKK0dNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCitpZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNjY5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkWEdFVFRFWFQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKKyAgOzsKK2VzYWMKK2ZpCitYR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCitpZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgIAorCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgICAgICBDQVRPQkpFWFQ9LmdtbworICAgICAgICBJTlNUT0JKRVhUPS5tbworICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQorCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCisJSU5UTExJQlM9JElOVExERVBTCisJTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCisgICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKKyAgICAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCisJCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCisJICA6IDsKKwllbHNlCisJICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2CisJICBYR0VUVEVYVD0iOiIKKwlmaQorICAgICAgZmkKKworICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCisgICAgICBQT1NVQj1wbworICAgIGVsc2UKKyAgICAgIERBVEFESVJOQU1FPXNoYXJlCisgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCisgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgIGZpCisKKyAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCisgICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KKyAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCisgICAgICBVU0VfTkxTPXllcworICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgZmkKKworICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KKyAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgorICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCisgICAgZG9uZQorCisgICAgICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAKKworICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgorICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgorICAgICAgIExJTkdVQVM9CisgICAgIGVsc2UKKyAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNzU5OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKKyAgICAgICBORVdfTElOR1VBUz0KKyAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KKyAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KKyAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OworICAgICAgICAgZXNhYworICAgICAgIGRvbmUKKyAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUworICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgorICAgICBmaQorCisgICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCisgICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQorICAgICBmaQorICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCisgICBlbHNlCisgICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKKy8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKKyAgIGZpCisgICAKKworICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCisJIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNzg3OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNzkyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI3OTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBtc2dmb3JtYXQ9bGludXgKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Cittc2dmb3JtYXQ9eG9wZW4KK2ZpCisKKworCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAorICAgICAgZmkKKyAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAorCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KKyAgICAgR1RfTk89IiNOTyMiCisgICAgIEdUX1lFUz0KKyAgIGVsc2UKKyAgICAgR1RfTk89CisgICAgIEdUX1lFUz0iI1lFUyMiCisgICBmaQorICAgCisgICAKKworICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgorICAgCisKKyAgICAgIGw9CisgICAKKworICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCisgICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCisgICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgorCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgorCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCisJIGVsc2UKKwkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgorCSBmaQorICAgICAgZWxzZQorCSBwb3NyY3ByZWZpeD0iLi4vIgorICAgICAgZmkKKyAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCisgICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKKwkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKKyAgIGZpCisgIAorCisjIENoZWNrIGZvciBjb21tb24gaGVhZGVycy4KKyMgRklYTUU6IFNlZW1zIHRvIG1lIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIGZvciBpMzg2LXdpbmRvd3MgaG9zdHMuCisjIEF0IG9uZSBwb2ludCB0aGVyZSB3ZXJlIGhhcmRjb2RlZCBBQ19ERUZJTkUncyBpZiAke2hvc3R9ID0gaTM4Ni0qLXdpbmRvd3MqLgorZm9yIGFjX2hkciBpbiBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdW5pc3RkLmggdGltZS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjg2NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI4NzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI4NzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfaGRyIGluIHN5cy90aW1lLmggc3lzL3Jlc291cmNlLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTA2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjkxMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjkxNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19oZHIgaW4gZmNudGwuaCBmcHVfY29udHJvbC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjk0NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI5NTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI5NTY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXRydXNhZ2UgdGltZSBzaWdhY3Rpb24gX19zZXRmcHVjdworZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjk4NTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjk5MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDEzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisKKyMgQ2hlY2sgZm9yIHNvY2tldCBsaWJyYXJpZXMKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMDQwOiBjaGVja2luZyBmb3IgYmluZCBpbiAtbHNvY2tldCIgPiY1CithY19saWJfdmFyPWBlY2hvIHNvY2tldCdfJ2JpbmQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sc29ja2V0ICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMwNDggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBiaW5kKCk7CisKK2ludCBtYWluKCkgeworYmluZCgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA1OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBzb2NrZXQgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKKyAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfbGliIDEKK0VPRgorCisgIExJQlM9Ii1sc29ja2V0ICRMSUJTIgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMwODc6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gbnNsJ18nZ2V0aG9zdGJ5bmFtZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxuc2wgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzA5NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGdldGhvc3RieW5hbWUoKTsKKworaW50IG1haW4oKSB7CitnZXRob3N0YnluYW1lKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIG5zbCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9saWIgMQorRU9GCisKKyAgTElCUz0iLWxuc2wgJExJQlMiCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKy4gJHtzcmNkaXJ9Ly4uLy4uL2JmZC9jb25maWd1cmUuaG9zdAorCisKKworVVNFX01BSU5UQUlORVJfTU9ERT1ubworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJTUFJTlQ9IiIgVVNFX01BSU5UQUlORVJfTU9ERT15ZXMgOzsKKyAgbm8pCU1BSU5UPSIjIiA7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBNQUlOVD0iIyIgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRNQUlOVCIgPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBtYWludGFpbmVyIG1vZGUiIDY+JjEKK2ZpCitlbHNlCisgIE1BSU5UPSIjIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYnN3YXAgb3IgLS1kaXNhYmxlLXNpbS1ic3dhcCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fYnN3YXArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ic3dhcCIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTEgLURVU0VfQlNXQVA9MSI7OworICBubykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MCI7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYnN3YXAgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYnN3YXA9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ic3dhcCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgYnN3YXAgZmxhZ3MgPSAkc2ltX2Jzd2FwIiA2PiYxCitmaQorZWxzZQorICBzaW1fYnN3YXA9IiIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWNmbGFncyBvciAtLWRpc2FibGUtc2ltLWNmbGFncyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fY2ZsYWdzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fY2ZsYWdzIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJIHNpbV9jZmxhZ3M9Ii1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciI7OworICB0cmFjZSkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiUGxlYXNlIHVzZSAtLWVuYWJsZS1zaW0tZGVidWcgaW5zdGVhZC4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9jZmxhZ3M9IiI7OworICBubykJIHNpbV9jZmxhZ3M9IiI7OworICAqKQkgc2ltX2NmbGFncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fY2ZsYWdzIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gY2ZsYWdzID0gJHNpbV9jZmxhZ3MiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9jZmxhZ3M9IiIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWRlYnVnIG9yIC0tZGlzYWJsZS1zaW0tZGVidWcgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZGVidWciCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKSBzaW1fZGVidWc9Ii1EREVCVUc9NyAtRFdJVEhfREVCVUc9NyI7OworICBubykgIHNpbV9kZWJ1Zz0iLURERUJVRz0wIC1EV0lUSF9ERUJVRz0wIjs7CisgICopICAgc2ltX2RlYnVnPSItRERFQlVHPScoJHtlbmFibGV2YWx9KScgLURXSVRIX0RFQlVHPScoJHtlbmFibGV2YWx9KSciOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVidWciICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBkZWJ1ZyA9ICRzaW1fZGVidWciIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9kZWJ1Zz0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tc3RkaW8gb3IgLS1kaXNhYmxlLXNpbS1zdGRpbyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fc3RkaW8rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9zdGRpbyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPX1VTRV9TVERJTyI7OworICBubykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9OVF9VU0VfU1RESU8iOzsKKyAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tc3RkaW8iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9zdGRpbz0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3N0ZGlvIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzdGRpbyBmbGFncyA9ICRzaW1fc3RkaW8iIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9zdGRpbz0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tdHJhY2Ugb3IgLS1kaXNhYmxlLXNpbS10cmFjZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fdHJhY2Urc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV90cmFjZSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV90cmFjZT0iLURUUkFDRT0xIC1EV0lUSF9UUkFDRT0tMSI7OworICBubykJc2ltX3RyYWNlPSItRFRSQUNFPTAgLURXSVRIX1RSQUNFPTAiOzsKKyAgWy0wLTldKikKKwlzaW1fdHJhY2U9Ii1EVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyI7OworICBbYS16XSopCisJc2ltX3RyYWNlPSIiCisJZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCisJICBpZiB0ZXN0IHgiJHNpbV90cmFjZSIgPSB4OyB0aGVuCisJICAgIHNpbV90cmFjZT0iLURXSVRIX1RSQUNFPScoVFJBQ0VfJHgiCisJICBlbHNlCisJICAgIHNpbV90cmFjZT0iJHtzaW1fdHJhY2V9fFRSQUNFXyR4IgorCSAgZmkKKwlkb25lCisJc2ltX3RyYWNlPSIkc2ltX3RyYWNlKSciIDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3RyYWNlIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gdHJhY2UgPSAkc2ltX3RyYWNlIiA2PiYxCitmaQorZWxzZQorICBzaW1fdHJhY2U9IiIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXByb2ZpbGUgb3IgLS1kaXNhYmxlLXNpbS1wcm9maWxlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9wcm9maWxlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fcHJvZmlsZSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSI7OworICBubykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0wIC1EV0lUSF9QUk9GSUxFPTAiOzsKKyAgWy0wLTldKikKKwlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPScoJHtlbmFibGV2YWx9KScgLURXSVRIX1BST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyI7OworICBbYS16XSopCisJc2ltX3Byb2ZpbGU9IiIKKwlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKwkgIGlmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiID0geDsgdGhlbgorCSAgICBzaW1fcHJvZmlsZT0iLURXSVRIX1BST0ZJTEU9JyhQUk9GSUxFXyR4IgorCSAgZWxzZQorCSAgICBzaW1fcHJvZmlsZT0iJHtzaW1fcHJvZmlsZX18UFJPRklMRV8keCIKKwkgIGZpCisJZG9uZQorCXNpbV9wcm9maWxlPSIkc2ltX3Byb2ZpbGUpJyIgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIHByb2ZpbGUgPSAkc2ltX3Byb2ZpbGUiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9wcm9maWxlPSIiCitmaQorCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMjgyOiBjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2lnbmFsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzI4NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaWZkZWYgc2lnbmFsCisjdW5kZWYgc2lnbmFsCisjZW5kaWYKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB2b2lkICgqc2lnbmFsIChpbnQsIHZvaWQgKCopKGludCkpKShpbnQpOworI2Vsc2UKK3ZvaWQgKCpzaWduYWwgKCkpICgpOworI2VuZGlmCisKK2ludCBtYWluKCkgeworaW50IGk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMwNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2lnbmFsPXZvaWQKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9aW50CitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2lnbmFsIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBSRVRTSUdUWVBFICRhY19jdl90eXBlX3NpZ25hbAorRU9GCisKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMzMjQ6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJENZR1dJTjMyIiA9IHllczsgdGhlbgorYW1fY3ZfZXhlZXh0PS5leGUKK2Vsc2UKK2NhdCA+IGFtX2NfdGVzdC5jIDw8ICdFT0YnCitpbnQgbWFpbigpIHsKKy8qIE5vdGhpbmcgbmVlZGVkIGhlcmUgKi8KK30KK0VPRgorJHtDQy1jY30gLW8gYW1fY190ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGFtX2NfdGVzdC5jICRMSUJTIDE+JjUKK2FtX2N2X2V4ZWV4dD1gbHMgYW1fY190ZXN0LiogfCBncmVwIC12IGFtX2NfdGVzdC5jIHwgc2VkIC1lIHMvYW1fY190ZXN0Ly9gCitybSAtZiBhbV9jX3Rlc3QqCitmaQorCit0ZXN0IHgiJHthbV9jdl9leGVleHR9IiA9IHggJiYgYW1fY3ZfZXhlZXh0PW5vCitmaQorRVhFRVhUPSIiCit0ZXN0IHgiJHthbV9jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YW1fY3ZfZXhlZXh0fQorZWNobyAiJGFjX3QiIiR7YW1fY3ZfZXhlZXh0fSIgMT4mNgorCisKK3NpbV9saW5rX2ZpbGVzPQorc2ltX2xpbmtfbGlua3M9CisKK3NpbV9saW5rX2xpbmtzPXRjb25maWcuaAoraWYgdGVzdCAtZiAke3NyY2Rpcn0vdGNvbmZpZy5pbgordGhlbgorICBzaW1fbGlua19maWxlcz10Y29uZmlnLmluCitlbHNlCisgIHNpbV9saW5rX2ZpbGVzPS4uL2NvbW1vbi90Y29uZmlnLmluCitmaQorCisjIHRhcmctdmFscy5kZWYgcG9pbnRzIHRvIHRoZSBsaWJjIG1hY3JvIGRlc2NyaXB0aW9uIGZpbGUuCitjYXNlICIke3RhcmdldH0iIGluCisqLSotKikgVEFSR19WQUxTX0RFRj0uLi9jb21tb24vbmx0dmFscy5kZWYgOzsKK2VzYWMKK3NpbV9saW5rX2ZpbGVzPSIke3NpbV9saW5rX2ZpbGVzfSAke1RBUkdfVkFMU19ERUZ9Igorc2ltX2xpbmtfbGlua3M9IiR7c2ltX2xpbmtfbGlua3N9IHRhcmctdmFscy5kZWYiCisKKworCitmb3IgYWNfaGRyIGluIHN0ZGxpYi5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzM3MjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMzNzcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjMzODI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBtYWluIGluIC1sdGVybWNhcCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzQxMDogY2hlY2tpbmcgZm9yIG1haW4gaW4gLWx0ZXJtY2FwIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gdGVybWNhcCdfJ21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sdGVybWNhcCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNDE4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CittYWluKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDI1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBURVJNQ0FQPS1sdGVybWNhcAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK1RFUk1DQVA9IiIKK2ZpCisKKworCisKKwordHJhcCAnJyAxIDIgMTUKK2NhdCA+IGNvbmZjYWNoZSA8PFxFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgorIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAorIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCisjIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgorIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCisjIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgorIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCisjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworRU9GCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKyhzZXQpIDI+JjEgfAorICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjEgfCBncmVwIGFjX3NwYWNlYCBpbgorICAqYWNfc3BhY2U9XCAqKQorICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCisgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICBzZWQgLW4gXAorICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKKyAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKyAgICA7OworICAqKQorICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJworICAgIDs7CisgIGVzYWMgPj4gY29uZmNhY2hlCitpZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKyMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCitmaQorCit0cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKKyMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgorOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorCitlY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCitybSAtZiAkQ09ORklHX1NUQVRVUworY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyMhIC9iaW4vc2gKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCisjIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIworIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKKyMKKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCithY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgorZm9yIGFjX29wdGlvbgorZG8KKyAgY2FzZSAiXCRhY19vcHRpb24iIGluCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKKyAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCisgICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQHNpbV9lbnZpcm9ubWVudEAlJHNpbV9lbnZpcm9ubWVudCVnCitzJUBzaW1fYWxpZ25tZW50QCUkc2ltX2FsaWdubWVudCVnCitzJUBzaW1fYXNzZXJ0QCUkc2ltX2Fzc2VydCVnCitzJUBzaW1fYml0c2l6ZUAlJHNpbV9iaXRzaXplJWcKK3MlQHNpbV9lbmRpYW5AJSRzaW1fZW5kaWFuJWcKK3MlQHNpbV9ob3N0ZW5kaWFuQCUkc2ltX2hvc3RlbmRpYW4lZworcyVAc2ltX2Zsb2F0QCUkc2ltX2Zsb2F0JWcKK3MlQHNpbV9zY2FjaGVAJSRzaW1fc2NhY2hlJWcKK3MlQHNpbV9kZWZhdWx0X21vZGVsQCUkc2ltX2RlZmF1bHRfbW9kZWwlZworcyVAc2ltX2h3X2NmbGFnc0AlJHNpbV9od19jZmxhZ3MlZworcyVAc2ltX2h3X29ianNAJSRzaW1faHdfb2JqcyVnCitzJUBzaW1faHdAJSRzaW1faHclZworcyVAc2ltX2lubGluZUAlJHNpbV9pbmxpbmUlZworcyVAc2ltX3BhY2thZ2VzQCUkc2ltX3BhY2thZ2VzJWcKK3MlQHNpbV9yZWdwYXJtQCUkc2ltX3JlZ3Bhcm0lZworcyVAc2ltX3Jlc2VydmVkX2JpdHNAJSRzaW1fcmVzZXJ2ZWRfYml0cyVnCitzJUBzaW1fc21wQCUkc2ltX3NtcCVnCitzJUBzaW1fc3RkY2FsbEAlJHNpbV9zdGRjYWxsJWcKK3MlQHNpbV94b3JfZW5kaWFuQCUkc2ltX3hvcl9lbmRpYW4lZworcyVAYnVpbGRfd2FybmluZ3NAJSRidWlsZF93YXJuaW5ncyVnCitzJUBTSEVMTEAlJFNIRUxMJWcKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBob3N0QCUkaG9zdCVnCitzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCitzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKK3MlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZworcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKK3MlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCitzJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCitzJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCitzJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZworcyVAYnVpbGRAJSRidWlsZCVnCitzJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKK3MlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCitzJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZworcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCitzJUBDQ0AlJENDJWcKK3MlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCitzJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZworcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKK3MlQEhERUZJTkVTQCUkSERFRklORVMlZworcyVAQVJAJSRBUiVnCitzJUBSQU5MSUJAJSRSQU5MSUIlZworcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCitzJUBDUFBAJSRDUFAlZworcyVAQUxMT0NBQCUkQUxMT0NBJWcKK3MlQFVTRV9OTFNAJSRVU0VfTkxTJWcKK3MlQE1TR0ZNVEAlJE1TR0ZNVCVnCitzJUBHTVNHRk1UQCUkR01TR0ZNVCVnCitzJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKK3MlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZworcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCitzJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZworcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCitzJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKK3MlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKK3MlQElOVExERVBTQCUkSU5UTERFUFMlZworcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCitzJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKK3MlQFBPRklMRVNAJSRQT0ZJTEVTJWcKK3MlQFBPU1VCQCUkUE9TVUIlZworcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZworcyVAR1RfTk9AJSRHVF9OTyVnCitzJUBHVF9ZRVNAJSRHVF9ZRVMlZworcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZworcyVAbEAlJGwlZworcyVATUFJTlRAJSRNQUlOVCVnCitzJUBzaW1fYnN3YXBAJSRzaW1fYnN3YXAlZworcyVAc2ltX2NmbGFnc0AlJHNpbV9jZmxhZ3MlZworcyVAc2ltX2RlYnVnQCUkc2ltX2RlYnVnJWcKK3MlQHNpbV9zdGRpb0AlJHNpbV9zdGRpbyVnCitzJUBzaW1fdHJhY2VAJSRzaW1fdHJhY2UlZworcyVAc2ltX3Byb2ZpbGVAJSRzaW1fcHJvZmlsZSVnCitzJUBFWEVFWFRAJSRFWEVFWFQlZworcyVAVEVSTUNBUEAlJFRFUk1DQVAlZworCitDRU9GCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCithY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KK2FjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfbW9yZV9saW5lcz06CithY19zZWRfY21kcz0iIgord2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZmkKKyAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGVsc2UKKyAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGZpCisgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCisgICAgYWNfYmVnPSRhY19lbmQKKyAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgIGFjX3NlZF9jbWRzPWNhdAorZmkKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4ifQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KKworICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgIC4pICBzcmNkaXI9LgorICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgorICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7CisgIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgorICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgZXNhYworCisgIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgorICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKKyAgcm0gLWYgIiRhY19maWxlIgorICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorIyAkY29uZmlndXJlX2lucHV0IiA7OworICAqKSBhY19jb21zdWI9IDs7CisgIGVzYWMKKworICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBzZWQgLWUgIiRhY19jb21zdWIKK3MlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCitzJUBzcmNkaXJAJSRzcmNkaXIlZworcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworcyVASU5TVEFMTEAlJElOU1RBTEwlZworIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQorZmk7IGRvbmUKK3JtIC1mIGNvbmZ0ZXN0LnMqCisKKyMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCisjIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCisjCisjIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCithY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKK2FjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJworYWNfZEM9J1wzJworYWNfZEQ9JyVnJworIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCithY191Qz0nICcKK2FjX3VEPSdcNCVnJworIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKK2FjX2VDPScgJworYWNfZUQ9JyVnJworCitpZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZmkKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKKworICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAorICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KKworRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCisjIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCitybSAtZiBjb25mdGVzdC52YWxzCitjYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCitzL1tcXCYlXS9cXCYvZworcyVbXFwkYF0lXFwmJWcKK3MlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCitzJWFjX2QlYWNfdSVncAorcyVhY191JWFjX2UlZ3AKK0VPRgorc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscworcm0gLWYgY29uZnRlc3QuaGRyCisKKyMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKKyMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCitzJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQorRU9GCisKKyMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgorIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KKworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgOgorZG8KKyAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAorICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCisgIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKKyAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCisgIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUworICBlY2hvICdDRU9GCisgIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0CisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgorJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKKyAgcm0gLWYgY29uZnRlc3QudmFscworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKKyAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCisgIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCisgICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgorICAgIHJtIC1mIGNvbmZ0ZXN0LmgKKyAgZWxzZQorICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgZmkKKyAgICBybSAtZiAkYWNfZmlsZQorICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKKyAgZmkKK2ZpOyBkb25lCisKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKK2FjX3NvdXJjZXM9IiRzaW1fbGlua19maWxlcyIKK2FjX2Rlc3RzPSIkc2ltX2xpbmtfbGlua3MiCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorc3JjZGlyPSRhY19naXZlbl9zcmNkaXIKK3doaWxlIHRlc3QgLW4gIiRhY19zb3VyY2VzIjsgZG8KKyAgc2V0ICRhY19kZXN0czsgYWNfZGVzdD0kMTsgc2hpZnQ7IGFjX2Rlc3RzPSQqCisgIHNldCAkYWNfc291cmNlczsgYWNfc291cmNlPSQxOyBzaGlmdDsgYWNfc291cmNlcz0kKgorCisgIGVjaG8gImxpbmtpbmcgJHNyY2Rpci8kYWNfc291cmNlIHRvICRhY19kZXN0IgorCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY19zb3VyY2U7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRzcmNkaXIvJGFjX3NvdXJjZTogRmlsZSBub3QgZm91bmQiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorICBybSAtZiAkYWNfZGVzdAorCisgICMgTWFrZSByZWxhdGl2ZSBzeW1saW5rcy4KKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rlc3RfZGlyPWBlY2hvICRhY19kZXN0fHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAiJGFjX2Rlc3QiICYmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGRlc3QgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kZXN0X2RpciIgJiYgbWtkaXIgIiRhY19kZXN0X2RpciIKKyAgICBhY19kZXN0X2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGVzdF9kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rlc3RfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kZXN0X2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kZXN0X2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJHNyY2RpciIgaW4KKyAgWy8kXSopIGFjX3JlbF9zb3VyY2U9IiRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKKyAgKikgYWNfcmVsX3NvdXJjZT0iJGFjX2RvdHMkc3JjZGlyLyRhY19zb3VyY2UiIDs7CisgIGVzYWMKKworICAjIE1ha2UgYSBzeW1saW5rIGlmIHBvc3NpYmxlOyBvdGhlcndpc2UgdHJ5IGEgaGFyZCBsaW5rLgorICBpZiBsbiAtcyAkYWNfcmVsX3NvdXJjZSAkYWNfZGVzdCAyPi9kZXYvbnVsbCB8fAorICAgIGxuICRzcmNkaXIvJGFjX3NvdXJjZSAkYWNfZGVzdDsgdGhlbiA6CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgbGluayAkYWNfZGVzdCB0byAkc3JjZGlyLyRhY19zb3VyY2UiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZG9uZQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitjYXNlICJ4JENPTkZJR19GSUxFUyIgaW4KKyB4TWFrZWZpbGUqKQorICAgZWNobyAiTWVyZ2luZyBNYWtlZmlsZS5zaW0rTWFrZS1jb21tb24uc2ltIGludG8gTWFrZWZpbGUgLi4uIgorICAgcm0gLWYgTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcCBNYWtlZmlsZQorICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QUkVfLywvXiMjIEVuZCBDT01NT05fUFJFXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTEudG1wCisgICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BPU1RfLywvXiMjIEVuZCBDT01NT05fUE9TVF8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0yLnRtcAorICAgc2VkIC1lICcvXiMjIENPTU1PTl9QUkVfLyByIE1ha2VzaW0xLnRtcCcgXAorCS1lICcvXiMjIENPTU1PTl9QT1NUXy8gciBNYWtlc2ltMi50bXAnIFwKKwk8TWFrZWZpbGUuc2ltID5NYWtlZmlsZQorICAgcm0gLWYgTWFrZWZpbGUuc2ltIE1ha2UtY29tbW9uLnNpbSBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wCisgICA7OworIGVzYWMKKyBjYXNlICJ4JENPTkZJR19IRUFERVJTIiBpbiB4Y29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjCisKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCisKZGlmZiAtLWdpdCBhL3NpbS9lcmMzMi9jb25maWd1cmUuaW4gYi9zaW0vZXJjMzIvY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMzlmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZXJjMzIvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsMTMgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Lgorc2luY2x1ZGUoLi4vY29tbW9uL2FjbG9jYWwubTQpCitBQ19QUkVSRVEoMi41KWRubAorQUNfSU5JVChNYWtlZmlsZS5pbikKKworU0lNX0FDX0NPTU1PTgorCitBQ19DSEVDS19IRUFERVJTKHN0ZGxpYi5oKQorCitBQ19DSEVDS19MSUIodGVybWNhcCwgbWFpbiwgVEVSTUNBUD0tbHRlcm1jYXAsIFRFUk1DQVA9IiIpCitBQ19TVUJTVChURVJNQ0FQKQorCitTSU1fQUNfT1VUUFVUCmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvZW5kLmMgYi9zaW0vZXJjMzIvZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczZmQ3OQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9lcmMzMi9lbmQuYwpAQCAtMCwwICsxLDI2IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50CittYWluKCkKK3sKKworICAgIHVuc2lnbmVkIGludCAgICB1MTsKKyAgICBjaGFyICAgICAgICAgICAqYzsKKyAgICBkb3VibGUgICAgICAgICAgZDE7CisgICAgZmxvYXQgICAgICAgICAgKmYxOworCisgICAgYyA9IChjaGFyICopICZ1MTsKKyAgICB1MSA9IDB4MEY7CisgICAgaWYgKGNbMF0gPT0gMHgwRikKKwlwdXRzKCIjZGVmaW5lIEhPU1RfTElUVExFX0VORElBTlxuIik7CisgICAgZWxzZQorCXB1dHMoIiNkZWZpbmUgSE9TVF9CSUdfRU5ESUFOXG4iKTsKKworICAgIGQxID0gMS4wOworICAgIGYxID0gKGZsb2F0ICopICZkMTsKKyAgICBpZiAoKigoaW50ICopIGYxKSAhPSAweDNmZjAwMDAwKQorCXB1dHMoIiNkZWZpbmUgSE9TVF9MSVRUTEVfRU5ESUFOX0ZMT0FUXG4iKTsKKyAgICBlbHNlCisJcHV0cygiI2RlZmluZSBIT1NUX0JJR19FTkRJQU5fRkxPQVRcbiIpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2ltL2VyYzMyL2VyYzMyLmMgYi9zaW0vZXJjMzIvZXJjMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjNmM2FjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2VyYzMyL2VyYzMyLmMKQEAgLTAsMCArMSwxODg4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgU0lTLgorICogCisgKiBTSVMsIFNQQVJDIGluc3RydWN0aW9uIHNpbXVsYXRvciBWMi41IENvcHlyaWdodCAoQykgMTk5NSBKaXJpIEdhaXNsZXIsCisgKiBFdXJvcGVhbiBTcGFjZSBBZ2VuY3kKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NQorICogTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqIAorICovCisKKy8qIFRoZSBjb250cm9sIHNwYWNlIGRldmljZXMgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAic2lzLmgiCisjaW5jbHVkZSAiZW5kLmgiCisjaW5jbHVkZSAic2ltLWNvbmZpZy5oIgorCitleHRlcm4gaW50ICAgICAgY3RybF9jOworZXh0ZXJuIGludDMyICAgIHNpc192ZXJib3NlOworZXh0ZXJuIGludDMyICAgIHNwYXJjbGl0ZSwgc3BhcmNsaXRlX2JvYXJkOworZXh0ZXJuIGludCAgICAgIHJvbTgsd3JwLHViZW47CitleHRlcm4gY2hhciAgICAgdWFydF9kZXYxW10sIHVhcnRfZGV2MltdOworCitpbnQgZHVtYmlvID0gMDsgLyogbm9ybWFsLCBzbWFydCwgdGVybWluYWwgb3JpZW50ZWQgSU8gYnkgZGVmYXVsdCAqLworCisvKiBNRUMgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1FQ19TVEFSVCAJMHgwMWY4MDAwMAorI2RlZmluZSBNRUNfRU5EIAkweDAxZjgwMTAwCisKKy8qIE1lbW9yeSBleGNlcHRpb24gd2FpdHN0YXRlcyAqLworI2RlZmluZSBNRU1fRVhfV1MgCTEKKworLyogRVJDMzIgYWx3YXlzIGFkZHMgb25lIHdhaXRzdGF0ZSBkdXJpbmcgUkFNIHN0ZCAqLworI2RlZmluZSBTVERfV1MgMQorCisjaWZkZWYgRVJSSU5KCitleHRlcm4gaW50IGVycm1lYzsKKyNlbmRpZgorCisvKiBUaGUgdGFyZ2V0J3MgYnl0ZSBvcmRlciBpcyBiaWctZW5kaWFuIGJ5IGRlZmF1bHQgdW50aWwgd2UgbG9hZCBhCisgICBsaXR0bGUtZW5kaWFuIHByb2dyYW0uICAqLworCitpbnQJY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlciA9IEJJR19FTkRJQU47CisKKyNkZWZpbmUgTUVDX1dTCTAJCS8qIFdhaXRzdGF0ZXMgcGVyIE1FQyBhY2Nlc3MgKDAgd3MpICovCisjZGVmaW5lIE1PSwkwCisKKy8qIE1FQyByZWdpc3RlciBhZGRyZXNzZXMgKi8KKworI2RlZmluZSBNRUNfTUNSCQkweDAwMAorI2RlZmluZSBNRUNfU0ZSICAJMHgwMDQKKyNkZWZpbmUgTUVDX1BXRFIgIAkweDAwOAorI2RlZmluZSBNRUNfTUVNQ0ZHCTB4MDEwCisjZGVmaW5lIE1FQ19JT0NSCTB4MDE0CisjZGVmaW5lIE1FQ19XQ1IJCTB4MDE4CisKKyNkZWZpbmUgTUVDX01BUjAgIAkweDAyMAorI2RlZmluZSBNRUNfTUFSMSAgCTB4MDI0CisKKyNkZWZpbmUgTUVDX1NTQTEgCTB4MDIwCisjZGVmaW5lIE1FQ19TRUExIAkweDAyNAorI2RlZmluZSBNRUNfU1NBMiAJMHgwMjgKKyNkZWZpbmUgTUVDX1NFQTIgCTB4MDJDCisjZGVmaW5lIE1FQ19JU1IJCTB4MDQ0CisjZGVmaW5lIE1FQ19JUFIJCTB4MDQ4CisjZGVmaW5lIE1FQ19JTVIgCTB4MDRDCisjZGVmaW5lIE1FQ19JQ1IgCTB4MDUwCisjZGVmaW5lIE1FQ19JRlIgCTB4MDU0CisjZGVmaW5lIE1FQ19XRE9HICAJMHgwNjAKKyNkZWZpbmUgTUVDX1RSQVBEICAJMHgwNjQKKyNkZWZpbmUgTUVDX1JUQ19DT1VOVEVSCTB4MDgwCisjZGVmaW5lIE1FQ19SVENfUkVMT0FECTB4MDgwCisjZGVmaW5lIE1FQ19SVENfU0NBTEVSCTB4MDg0CisjZGVmaW5lIE1FQ19HUFRfQ09VTlRFUgkweDA4OAorI2RlZmluZSBNRUNfR1BUX1JFTE9BRAkweDA4OAorI2RlZmluZSBNRUNfR1BUX1NDQUxFUgkweDA4QworI2RlZmluZSBNRUNfVElNRVJfQ1RSTAkweDA5OAorI2RlZmluZSBNRUNfU0ZTUgkweDBBMAorI2RlZmluZSBNRUNfRkZBUgkweDBBNAorI2RlZmluZSBNRUNfRVJTUgkweDBCMAorI2RlZmluZSBNRUNfREJHCQkweDBDMAorI2RlZmluZSBNRUNfVENSCQkweDBEMAorCisjZGVmaW5lIE1FQ19CUksJCTB4MEM0CisjZGVmaW5lIE1FQ19XUFIJCTB4MEM4CisKKyNkZWZpbmUgTUVDX1VBUlRBCTB4MEUwCisjZGVmaW5lIE1FQ19VQVJUQgkweDBFNAorI2RlZmluZSBNRUNfVUFSVF9DVFJMCTB4MEU4CisjZGVmaW5lIFNJTV9MT0FECTB4MEYwCisKKy8qIE1lbW9yeSBleGNlcHRpb24gY2F1c2VzICovCisjZGVmaW5lIFBST1RfRVhDCTB4MworI2RlZmluZSBVSU1QX0FDQwkweDQKKyNkZWZpbmUgTUVDX0FDQwkJMHg2CisjZGVmaW5lIFdBVENIX0VYQwkweGEKKyNkZWZpbmUgQlJFQUtfRVhDCTB4YgorCisvKiBTaXplIG9mIFVBUlQgYnVmZmVycyAoYnl0ZXMpICovCisjZGVmaW5lIFVBUlRCVUYJMTAyNAorCisvKiBOdW1iZXIgb2Ygc2ltdWxhdG9yIHRpY2tzIGJldHdlZW4gZmx1c2hpbmcgdGhlIFVBUlRTLiAJICovCisvKiBGb3IgZ29vZCBwZXJmb3JtYW5jZSwga2VlcCBhYm92ZSAxMDAwCQkJICovCisjZGVmaW5lIFVBUlRfRkxVU0hfVElNRQkgIDMwMDAKKworLyogTUVDIHRpbWVyIGNvbnRyb2wgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBUQ1JfR0FDUiAxCisjZGVmaW5lIFRDUl9HQUNMIDIKKyNkZWZpbmUgVENSX0dBU0UgNAorI2RlZmluZSBUQ1JfR0FTTCA4CisjZGVmaW5lIFRDUl9UQ1JDUiAweDEwMAorI2RlZmluZSBUQ1JfVENSQ0wgMHgyMDAKKyNkZWZpbmUgVENSX1RDUlNFIDB4NDAwCisjZGVmaW5lIFRDUl9UQ1JTTCAweDgwMAorCisvKiBOZXcgdWFydCBkZWZpbmVzICovCisjZGVmaW5lIFVBUlRfVFhfVElNRQkxMDAwCisjZGVmaW5lIFVBUlRfUlhfVElNRQkxMDAwCisjZGVmaW5lIFVBUlRBX0RSCTB4MQorI2RlZmluZSBVQVJUQV9TUkUJMHgyCisjZGVmaW5lIFVBUlRBX0hSRQkweDQKKyNkZWZpbmUgVUFSVEFfT1IJMHg0MAorI2RlZmluZSBVQVJUQV9DTFIJMHg4MAorI2RlZmluZSBVQVJUQl9EUgkweDEwMDAwCisjZGVmaW5lIFVBUlRCX1NSRQkweDIwMDAwCisjZGVmaW5lIFVBUlRCX0hSRQkweDQwMDAwCisjZGVmaW5lIFVBUlRCX09SCTB4NDAwMDAwCisjZGVmaW5lIFVBUlRCX0NMUgkweDgwMDAwMAorCisjZGVmaW5lIFVBUlRfRFIJCTB4MTAwCisjZGVmaW5lIFVBUlRfVFNFCTB4MjAwCisjZGVmaW5lIFVBUlRfVEhFCTB4NDAwCisKKy8qIE1FQyByZWdpc3RlcnMgKi8KKworc3RhdGljIGNoYXIgICAgIGZuYW1lWzI1Nl07CitzdGF0aWMgaW50MzIgICAgZmluZCA9IDA7CitzdGF0aWMgdWludDMyICAgbWVjX3NzYVsyXTsJLyogV3JpdGUgcHJvdGVjdGlvbiBzdGFydCBhZGRyZXNzICovCitzdGF0aWMgdWludDMyICAgbWVjX3NlYVsyXTsJLyogV3JpdGUgcHJvdGVjdGlvbiBlbmQgYWRkcmVzcyAqLworc3RhdGljIHVpbnQzMiAgIG1lY193cHJbMl07CS8qIFdyaXRlIHByb3RlY3Rpb24gY29udHJvbCBmaWVsZHMgKi8KK3N0YXRpYyB1aW50MzIgICBtZWNfc2ZzcjsKK3N0YXRpYyB1aW50MzIgICBtZWNfZmZhcjsKK3N0YXRpYyB1aW50MzIgICBtZWNfaXByOworc3RhdGljIHVpbnQzMiAgIG1lY19pbXI7CitzdGF0aWMgdWludDMyICAgbWVjX2lzcjsKK3N0YXRpYyB1aW50MzIgICBtZWNfaWNyOworc3RhdGljIHVpbnQzMiAgIG1lY19pZnI7CitzdGF0aWMgdWludDMyICAgbWVjX21jcjsJLyogTUVDIGNvbnRyb2wgcmVnaXN0ZXIgKi8KK3N0YXRpYyB1aW50MzIgICBtZWNfbWVtY2ZnOwkvKiBNZW1vcnkgY29udHJvbCByZWdpc3RlciAqLworc3RhdGljIHVpbnQzMiAgIG1lY193Y3I7CS8qIE1FQyB3YWl0c3RhdGUgcmVnaXN0ZXIgKi8KK3N0YXRpYyB1aW50MzIgICBtZWNfaW9jcjsJLyogTUVDIElPIGNvbnRyb2wgcmVnaXN0ZXIgKi8KK3N0YXRpYyB1aW50MzIgICBwb3N0ZWRfaXJxOworc3RhdGljIHVpbnQzMiAgIG1lY19lcnNyOwkvKiBNRUMgZXJyb3IgYW5kIHN0YXR1cyByZWdpc3RlciAqLworc3RhdGljIHVpbnQzMiAgIG1lY190Y3I7CS8qIE1FQyB0ZXN0IGNvbXRyb2wgcmVnaXN0ZXIgKi8KKworc3RhdGljIHVpbnQzMiAgIHJ0Y19jb3VudGVyOworc3RhdGljIHVpbnQzMiAgIHJ0Y19yZWxvYWQ7CitzdGF0aWMgdWludDMyICAgcnRjX3NjYWxlcjsKK3N0YXRpYyB1aW50MzIgICBydGNfc2NhbGVyX3N0YXJ0Oworc3RhdGljIHVpbnQzMiAgIHJ0Y19lbmFibGVkOworc3RhdGljIHVpbnQzMiAgIHJ0Y19jcjsKK3N0YXRpYyB1aW50MzIgICBydGNfc2U7CisKK3N0YXRpYyB1aW50MzIgICBncHRfY291bnRlcjsKK3N0YXRpYyB1aW50MzIgICBncHRfcmVsb2FkOworc3RhdGljIHVpbnQzMiAgIGdwdF9zY2FsZXI7CitzdGF0aWMgdWludDMyICAgZ3B0X3NjYWxlcl9zdGFydDsKK3N0YXRpYyB1aW50MzIgICBncHRfZW5hYmxlZDsKK3N0YXRpYyB1aW50MzIgICBncHRfY3I7CitzdGF0aWMgdWludDMyICAgZ3B0X3NlOworCitzdGF0aWMgdWludDMyICAgd2RvZ19zY2FsZXI7CitzdGF0aWMgdWludDMyICAgd2RvZ19jb3VudGVyOworc3RhdGljIHVpbnQzMiAgIHdkb2dfcnN0X2RlbGF5Oworc3RhdGljIHVpbnQzMiAgIHdkb2dfcnN0b247CisKK2VudW0gd2RvZ190eXBlIHsKKyAgICBpbml0LCBkaXNhYmxlZCwgZW5hYmxlZCwgc3RvcHBlZAorfTsKKworc3RhdGljIGVudW0gd2RvZ190eXBlIHdkb2dfc3RhdHVzOworCisKKy8qIFJPTSBzaXplIDEwMjQgS2J5dGUgKi8KKyNkZWZpbmUgUk9NX1NaCSAJMHgxMDAwMDAKKyNkZWZpbmUgUk9NX01BU0sgCTB4MGZmZmZmCisKKy8qIFJBTSBzaXplIDQgTWJ5dGUgKi8KKyNkZWZpbmUgUkFNX1NUQVJUIAkweDAyMDAwMDAwCisjZGVmaW5lIFJBTV9FTkQgCTB4MDI0MDAwMDAKKyNkZWZpbmUgUkFNX01BU0sgCTB4MDAzZmZmZmYKKworLyogU1BBUkNsaXRlIGJvYXJkcyBhbGwgc2VlbSB0byBoYXZlIFJBTSBhdCB0aGUgc2FtZSBwbGFjZS4gKi8KKyNkZWZpbmUgUkFNX1NUQVJUX1NMSVRFCTB4NDAwMDAwMDAKKyNkZWZpbmUgUkFNX0VORF9TTElURSAJMHg0MDQwMDAwMAorI2RlZmluZSBSQU1fTUFTS19TTElURSAJMHgwMDNmZmZmZgorCisvKiBNZW1vcnkgc3VwcG9ydCB2YXJpYWJsZXMgKi8KKworc3RhdGljIHVpbnQzMiAgIG1lbV9yYW1yX3dzOwkvKiBSQU0gcmVhZCB3YWl0c3RhdGVzICovCitzdGF0aWMgdWludDMyICAgbWVtX3JhbXdfd3M7CS8qIFJBTSB3cml0ZSB3YWl0c3RhdGVzICovCitzdGF0aWMgdWludDMyICAgbWVtX3JvbXJfd3M7CS8qIFJPTSByZWFkIHdhaXRzdGF0ZXMgKi8KK3N0YXRpYyB1aW50MzIgICBtZW1fcm9td193czsJLyogUk9NIHdyaXRlIHdhaXRzdGF0ZXMgKi8KK3N0YXRpYyB1aW50MzIJbWVtX3JhbXN0YXJ0OwkvKiBSQU0gc3RhcnQgKi8KK3N0YXRpYyB1aW50MzIJbWVtX3JhbWVuZDsJLyogUkFNIGVuZCAqLworc3RhdGljIHVpbnQzMgltZW1fcmFtbWFzazsJLyogUkFNIGFkZHJlc3MgbWFzayAqLworc3RhdGljIHVpbnQzMiAgIG1lbV9yYW1zejsJLyogUkFNIHNpemUgKi8KK3N0YXRpYyB1aW50MzIgICBtZW1fcm9tc3o7CS8qIFJPTSBzaXplICovCitzdGF0aWMgdWludDMyICAgbWVtX2FjY3Byb3Q7CS8qIFJBTSB3cml0ZSBwcm90ZWN0aW9uIGVuYWJsZWQgKi8KK3N0YXRpYyB1aW50MzIgICBtZW1fYmxvY2twcm90OwkvKiBSQU0gYmxvY2sgd3JpdGUgcHJvdGVjdGlvbiBlbmFibGVkICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCXJvbWJbUk9NX1NaXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCXJhbWJbUkFNX0VORCAtIFJBTV9TVEFSVF07CisKKworLyogVUFSVCBzdXBwb3J0IHZhcmlhYmxlcyAqLworCitzdGF0aWMgaW50MzIgICAgZmQxLCBmZDI7CS8qIGZpbGUgZGVzY3JpcHRvciBmb3IgaW5wdXQgZmlsZSAqLworc3RhdGljIGludDMyICAgIFVjb250cm9sOwkvKiBVQVJUIHN0YXR1cyByZWdpc3RlciAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXFbVUFSVEJVRl0sIGJxW1VBUlRCVUZdOworc3RhdGljIGludDMyICAgIGFudW0sIGFpbmQgPSAwOworc3RhdGljIGludDMyICAgIGJudW0sIGJpbmQgPSAwOworc3RhdGljIGNoYXIgICAgIHdidWZhW1VBUlRCVUZdLCB3YnVmYltVQVJUQlVGXTsKK3N0YXRpYyB1bnNpZ25lZCB3bnVtYTsKK3N0YXRpYyB1bnNpZ25lZCB3bnVtYjsKK3N0YXRpYyBGSUxFICAgICpmMWluLCAqZjFvdXQsICpmMmluLCAqZjJvdXQ7CitzdGF0aWMgc3RydWN0IHRlcm1pb3MgaW9jMSwgaW9jMiwgaW9jb2xkMSwgaW9jb2xkMjsKK3N0YXRpYyBpbnQgICAgICBmMW9wZW4gPSAwLCBmMm9wZW4gPSAwOworCitzdGF0aWMgY2hhciAgICAgdWFydGFfc3JlZywgdWFydGFfaHJlZywgdWFydGJfc3JlZywgdWFydGJfaHJlZzsKK3N0YXRpYyB1aW50MzIgICB1YXJ0X3N0YXRfcmVnOworc3RhdGljIHVpbnQzMiAgIHVhcnRhX2RhdGEsIHVhcnRiX2RhdGE7CisKKyNpZmRlZiBFUkEKK2ludCBlcmEgPSAwOworaW50IGVyYXJlZzsKKyNlbmRpZgorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworCitzdGF0aWMgdm9pZAlkZWNvZGVfZXJzciBQQVJBTVMgKCh2b2lkKSk7CisjaWZkZWYgRVJSSU5KCitzdGF0aWMgdm9pZAlpdWNvbXBlcnIgUEFSQU1TICgodm9pZCkpOworI2VuZGlmCitzdGF0aWMgdm9pZAltZWNwYXJlcnJvciBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZAlkZWNvZGVfbWVtY2ZnIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkCWRlY29kZV93Y3IgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQJZGVjb2RlX21jciBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZAljbG9zZV9wb3J0IFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkCW1lY19yZXNldCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZAltZWNfaW50YWNrIFBBUkFNUyAoKGludDMyIGxldmVsKSk7CitzdGF0aWMgdm9pZAljaGtfaXJxIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkCW1lY19pcnEgUEFSQU1TICgoaW50MzIgbGV2ZWwpKTsKK3N0YXRpYyB2b2lkCXNldF9zZnNyIFBBUkFNUyAoKHVpbnQzMiBmYXVsdCwgdWludDMyIGFkZHIsCisJCQkJICB1aW50MzIgYXNpLCB1aW50MzIgcmVhZCkpOworc3RhdGljIGludDMyCW1lY19yZWFkIFBBUkFNUyAoKHVpbnQzMiBhZGRyLCB1aW50MzIgYXNpLCB1aW50MzIgKmRhdGEpKTsKK3N0YXRpYyBpbnQJbWVjX3dyaXRlIFBBUkFNUyAoKHVpbnQzMiBhZGRyLCB1aW50MzIgZGF0YSkpOworc3RhdGljIHZvaWQJcG9ydF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB1aW50MzIJcmVhZF91YXJ0IFBBUkFNUyAoKHVpbnQzMiBhZGRyKSk7CitzdGF0aWMgdm9pZAl3cml0ZV91YXJ0IFBBUkFNUyAoKHVpbnQzMiBhZGRyLCB1aW50MzIgZGF0YSkpOworc3RhdGljIHZvaWQJZmx1c2hfdWFydCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZAl1YXJ0YV90eCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZAl1YXJ0Yl90eCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZAl1YXJ0X3J4IFBBUkFNUyAoKGNhZGRyX3QgYXJnKSk7CitzdGF0aWMgdm9pZAl1YXJ0X2ludHIgUEFSQU1TICgoY2FkZHJfdCBhcmcpKTsKK3N0YXRpYyB2b2lkCXVhcnRfaXJxX3N0YXJ0IFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkCXdkb2dfaW50ciBQQVJBTVMgKChjYWRkcl90IGFyZykpOworc3RhdGljIHZvaWQJd2RvZ19zdGFydCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZAlydGNfaW50ciBQQVJBTVMgKChjYWRkcl90IGFyZykpOworc3RhdGljIHZvaWQJcnRjX3N0YXJ0IFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB1aW50MzIJcnRjX2NvdW50ZXJfcmVhZCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZAlydGNfc2NhbGVyX3NldCBQQVJBTVMgKCh1aW50MzIgdmFsKSk7CitzdGF0aWMgdm9pZAlydGNfcmVsb2FkX3NldCBQQVJBTVMgKCh1aW50MzIgdmFsKSk7CitzdGF0aWMgdm9pZAlncHRfaW50ciBQQVJBTVMgKChjYWRkcl90IGFyZykpOworc3RhdGljIHZvaWQJZ3B0X3N0YXJ0IFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB1aW50MzIJZ3B0X2NvdW50ZXJfcmVhZCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZAlncHRfc2NhbGVyX3NldCBQQVJBTVMgKCh1aW50MzIgdmFsKSk7CitzdGF0aWMgdm9pZAlncHRfcmVsb2FkX3NldCBQQVJBTVMgKCh1aW50MzIgdmFsKSk7CitzdGF0aWMgdm9pZAl0aW1lcl9jdHJsIFBBUkFNUyAoKHVpbnQzMiB2YWwpKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKKwkJZ2V0X21lbV9wdHIgUEFSQU1TICgodWludDMyIGFkZHIsIHVpbnQzMiBzaXplKSk7CisKK3N0YXRpYyB2b2lkCWZldGNoX2J5dGVzIFBBUkFNUyAoKGludCBhc2ksIHVuc2lnbmVkIGNoYXIgKm1lbSwKKwkJCQkgICAgIHVpbnQzMiAqZGF0YSwgaW50IHN6KSk7CisKK3N0YXRpYyB2b2lkCXN0b3JlX2J5dGVzIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKm1lbSwgdWludDMyICpkYXRhLCBpbnQgc3opKTsKKworZXh0ZXJuIGludAlleHRfaXJsOworCisKKy8qIE9uZS10aW1lIGluaXQgKi8KKwordm9pZAoraW5pdF9zaW0oKQoreworICAgIHBvcnRfaW5pdCgpOworfQorCisvKiBQb3dlci1vbiByZXNldCBpbml0ICovCisKK3ZvaWQKK3Jlc2V0KCkKK3sKKyAgICBtZWNfcmVzZXQoKTsKKyAgICB1YXJ0X2lycV9zdGFydCgpOworICAgIHdkb2dfc3RhcnQoKTsKK30KKworc3RhdGljIHZvaWQKK2RlY29kZV9lcnNyKCkKK3sKKyAgICBpZiAobWVjX2Vyc3IgJiAweDAxKSB7CisJaWYgKCEobWVjX21jciAmIDB4MjApKSB7CisJICAgIGlmIChtZWNfbWNyICYgMHg0MCkgeworCSAgICAgICAgc3lzX3Jlc2V0KCk7CisJICAgICAgICBtZWNfZXJzciA9IDB4ODAwMDsKKwkgICAgICAgIGlmIChzaXNfdmVyYm9zZSkKKwkgICAgICAgICAgICBwcmludGYoIkVycm9yIG1hbmFnZXIgcmVzZXQgLSBJVSBpbiBlcnJvciBtb2RlXG4iKTsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgIHN5c19oYWx0KCk7CisJICAgICAgICBtZWNfZXJzciB8PSAweDIwMDA7CisJICAgICAgICBpZiAoc2lzX3ZlcmJvc2UpCisJICAgICAgICAgICAgcHJpbnRmKCJFcnJvciBtYW5hZ2VyIGhhbHQgLSBJVSBpbiBlcnJvciBtb2RlXG4iKTsKKwkgICAgfQorCX0gZWxzZQorCSAgICBtZWNfaXJxKDEpOworICAgIH0KKyAgICBpZiAobWVjX2Vyc3IgJiAweDA0KSB7CisJaWYgKCEobWVjX21jciAmIDB4MjAwKSkgeworCSAgICBpZiAobWVjX21jciAmIDB4NDAwKSB7CisJICAgICAgICBzeXNfcmVzZXQoKTsKKwkgICAgICAgIG1lY19lcnNyID0gMHg4MDAwOworCSAgICAgICAgaWYgKHNpc192ZXJib3NlKQorCSAgICAgICAgICAgIHByaW50ZigiRXJyb3IgbWFuYWdlciByZXNldCAtIElVIGNvbXBhcmlzb24gZXJyb3JcbiIpOworCSAgICB9IGVsc2UgeworCSAgICAgICAgc3lzX2hhbHQoKTsKKwkgICAgICAgIG1lY19lcnNyIHw9IDB4MjAwMDsKKwkgICAgICAgIGlmIChzaXNfdmVyYm9zZSkKKwkgICAgICAgICAgICBwcmludGYoIkVycm9yIG1hbmFnZXIgaGFsdCAtIElVIGNvbXBhcmlzb24gZXJyb3JcbiIpOworCSAgICB9CisJfSBlbHNlCisJICAgIG1lY19pcnEoMSk7CisgICAgfQorICAgIGlmIChtZWNfZXJzciAmIDB4MjApIHsgCisJaWYgKCEobWVjX21jciAmIDB4MjAwMCkpIHsKKwkgICAgaWYgKG1lY19tY3IgJiAweDQwMDApIHsKKwkgICAgICAgIHN5c19yZXNldCgpOworCSAgICAgICAgbWVjX2Vyc3IgPSAweDgwMDA7CisJICAgICAgICBpZiAoc2lzX3ZlcmJvc2UpCisJICAgICAgICAgICAgcHJpbnRmKCJFcnJvciBtYW5hZ2VyIHJlc2V0IC0gTUVDIGhhcmR3YXJlIGVycm9yXG4iKTsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgIHN5c19oYWx0KCk7CisJICAgICAgICBtZWNfZXJzciB8PSAweDIwMDA7CisJICAgICAgICBpZiAoc2lzX3ZlcmJvc2UpCisJICAgICAgICAgICAgcHJpbnRmKCJFcnJvciBtYW5hZ2VyIGhhbHQgLSBNRUMgaGFyZHdhcmUgZXJyb3JcbiIpOworCSAgICB9CisJfSBlbHNlCisJICAgIG1lY19pcnEoMSk7CisgICAgfQorfQorCisjaWZkZWYgRVJSSU5KCitzdGF0aWMgdm9pZAoraXVjb21wZXJyKCkKK3sKKyAgICBtZWNfZXJzciB8PSAweDA0OworICAgIGRlY29kZV9lcnNyKCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK21lY3BhcmVycm9yKCkKK3sKKyAgICBtZWNfZXJzciB8PSAweDIwOworICAgIGRlY29kZV9lcnNyKCk7Cit9CisKKworLyogSVUgZXJyb3IgbW9kZSBtYW5hZ2VyICovCisKK3ZvaWQKK2Vycm9yX21vZGUocGMpCisgICAgdWludDMyICAgICAgICAgIHBjOworeworCisgICAgbWVjX2Vyc3IgfD0gMHgxOworICAgIGRlY29kZV9lcnNyKCk7Cit9CisKKworLyogQ2hlY2sgbWVtb3J5IHNldHRpbmdzICovCisKK3N0YXRpYyB2b2lkCitkZWNvZGVfbWVtY2ZnKCkKK3sKKyAgICBpZiAocm9tOCkgbWVjX21lbWNmZyAmPSB+MHgyMDAwMDsKKyAgICBlbHNlIG1lY19tZW1jZmcgfD0gMHgyMDAwMDsKKworICAgIG1lbV9yYW1zeiA9ICgyNTYgKiAxMDI0KSA8PCAoKG1lY19tZW1jZmcgPj4gMTApICYgNyk7CisgICAgbWVtX3JvbXN6ID0gKDEyOCAqIDEwMjQpIDw8ICgobWVjX21lbWNmZyA+PiAxOCkgJiA3KTsKKworICAgIGlmIChzcGFyY2xpdGVfYm9hcmQpIHsKKwltZW1fcmFtc3RhcnQgPSBSQU1fU1RBUlRfU0xJVEU7CisJbWVtX3JhbWVuZCA9IFJBTV9FTkRfU0xJVEU7CisJbWVtX3JhbW1hc2sgPSBSQU1fTUFTS19TTElURTsKKyAgICB9CisgICAgZWxzZSB7CisJbWVtX3JhbXN0YXJ0ID0gUkFNX1NUQVJUOworCW1lbV9yYW1lbmQgPSBSQU1fRU5EOworCW1lbV9yYW1tYXNrID0gUkFNX01BU0s7CisgICAgfQorICAgIGlmIChzaXNfdmVyYm9zZSkKKwlwcmludGYoIlJBTSBzdGFydDogMHgleCwgUkFNIHNpemU6ICVkIEssIFJPTSBzaXplOiAlZCBLXG4iLAorCSAgICAgICBtZW1fcmFtc3RhcnQsIG1lbV9yYW1zeiA+PiAxMCwgbWVtX3JvbXN6ID4+IDEwKTsKK30KKworc3RhdGljIHZvaWQKK2RlY29kZV93Y3IoKQoreworICAgIG1lbV9yYW1yX3dzID0gbWVjX3djciAmIDM7CisgICAgbWVtX3JhbXdfd3MgPSAobWVjX3djciA+PiAyKSAmIDM7CisgICAgbWVtX3JvbXJfd3MgPSAobWVjX3djciA+PiA0KSAmIDB4MGY7CisgICAgaWYgKHJvbTgpIHsKKyAgICAJaWYgKG1lbV9yb21yX3dzID4gMCApICBtZW1fcm9tcl93cy0tOworCW1lbV9yb21yX3dzID0gNSArICg0Km1lbV9yb21yX3dzKTsKKyAgICB9CisgICAgbWVtX3JvbXdfd3MgPSAobWVjX3djciA+PiA4KSAmIDB4MGY7CisgICAgaWYgKHNpc192ZXJib3NlKQorCXByaW50ZigiV2FpdHN0YXRlcyA9IFJBTSByZWFkOiAlZCwgUkFNIHdyaXRlOiAlZCwgUk9NIHJlYWQ6ICVkLCBST00gd3JpdGU6ICVkXG4iLAorCSAgICAgICBtZW1fcmFtcl93cywgbWVtX3JhbXdfd3MsIG1lbV9yb21yX3dzLCBtZW1fcm9td193cyk7Cit9CisKK3N0YXRpYyB2b2lkCitkZWNvZGVfbWNyKCkKK3sKKyAgICBtZW1fYWNjcHJvdCA9IChtZWNfd3ByWzBdIHwgbWVjX3dwclsxXSk7CisgICAgbWVtX2Jsb2NrcHJvdCA9IChtZWNfbWNyID4+IDMpICYgMTsKKyAgICBpZiAoc2lzX3ZlcmJvc2UgJiYgbWVtX2FjY3Byb3QpCisJcHJpbnRmKCJNZW1vcnkgYmxvY2sgd3JpdGUgcHJvdGVjdGlvbiBlbmFibGVkXG4iKTsKKyAgICBpZiAobWVjX21jciAmIDB4MDgwMDApIHsKKwltZWNfZXJzciB8PSAweDIwOworCWRlY29kZV9lcnNyKCk7CisgICAgfQorICAgIGlmIChzaXNfdmVyYm9zZSAmJiAobWVjX21jciAmIDIpKQorCXByaW50ZigiU29mdHdhcmUgcmVzZXQgZW5hYmxlZFxuIik7CisgICAgaWYgKHNpc192ZXJib3NlICYmIChtZWNfbWNyICYgMSkpCisJcHJpbnRmKCJQb3dlci1kb3duIG1vZGUgZW5hYmxlZFxuIik7Cit9CisKKy8qIEZsdXNoIHBvcnRzIHdoZW4gc2ltdWxhdG9yIHN0b3BzICovCisKK3ZvaWQKK3NpbV9oYWx0KCkKK3sKKyNpZmRlZiBGQVNUX1VBUlQKKyAgICBmbHVzaF91YXJ0KCk7CisjZW5kaWYKK30KKworaW50CitzaW1fc3RvcChTSU1fREVTQyBzZCkKK3sKKyAgY3RybF9jID0gMTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitjbG9zZV9wb3J0KCkKK3sKKyAgICBpZiAoZjFvcGVuICYmIGYxaW4gIT0gc3RkaW4pCisJZmNsb3NlKGYxaW4pOworICAgIGlmIChmMm9wZW4gJiYgZjJpbiAhPSBzdGRpbikKKwlmY2xvc2UoZjJpbik7Cit9CisKK3ZvaWQKK2V4aXRfc2ltKCkKK3sKKyAgICBjbG9zZV9wb3J0KCk7Cit9CisKK3N0YXRpYyB2b2lkCittZWNfcmVzZXQoKQoreworICAgIGludCAgICAgICAgICAgICBpOworCisgICAgZmluZCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwltZWNfc3NhW2ldID0gbWVjX3NlYVtpXSA9IG1lY193cHJbaV0gPSAwOworICAgIG1lY19tY3IgPSAweDAxMzUwMDE0OworICAgIG1lY19pb2NyID0gMDsKKyAgICBtZWNfc2ZzciA9IDB4MDc4OworICAgIG1lY19mZmFyID0gMDsKKyAgICBtZWNfaXByID0gMDsKKyAgICBtZWNfaW1yID0gMHg3ZmZlOworICAgIG1lY19pc3IgPSAwOworICAgIG1lY19pY3IgPSAwOworICAgIG1lY19pZnIgPSAwOworICAgIG1lY19tZW1jZmcgPSAweDEwMDAwOworICAgIG1lY193Y3IgPSAtMTsKKyAgICBtZWNfZXJzciA9IDA7CQkvKiBNRUMgZXJyb3IgYW5kIHN0YXR1cyByZWdpc3RlciAqLworICAgIG1lY190Y3IgPSAwOwkJLyogTUVDIHRlc3QgY29tdHJvbCByZWdpc3RlciAqLworCisgICAgZGVjb2RlX21lbWNmZygpOworICAgIGRlY29kZV93Y3IoKTsKKyAgICBkZWNvZGVfbWNyKCk7CisKKyAgICBwb3N0ZWRfaXJxID0gMDsKKyAgICB3bnVtYSA9IHdudW1iID0gMDsKKyAgICBhbnVtID0gYWluZCA9IGJudW0gPSBiaW5kID0gMDsKKworICAgIHVhcnRfc3RhdF9yZWcgPSBVQVJUQV9TUkUgfCBVQVJUQV9IUkUgfCBVQVJUQl9TUkUgfCBVQVJUQl9IUkU7CisgICAgdWFydGFfZGF0YSA9IHVhcnRiX2RhdGEgPSBVQVJUX1RIRSB8IFVBUlRfVFNFOworCisgICAgcnRjX2NvdW50ZXIgPSAweGZmZmZmZmZmOworICAgIHJ0Y19yZWxvYWQgPSAweGZmZmZmZmZmOworICAgIHJ0Y19zY2FsZXIgPSAweGZmOworICAgIHJ0Y19lbmFibGVkID0gMDsKKyAgICBydGNfY3IgPSAwOworICAgIHJ0Y19zZSA9IDA7CisKKyAgICBncHRfY291bnRlciA9IDB4ZmZmZmZmZmY7CisgICAgZ3B0X3JlbG9hZCA9IDB4ZmZmZmZmZmY7CisgICAgZ3B0X3NjYWxlciA9IDB4ZmZmZjsKKyAgICBncHRfZW5hYmxlZCA9IDA7CisgICAgZ3B0X2NyID0gMDsKKyAgICBncHRfc2UgPSAwOworCisgICAgd2RvZ19zY2FsZXIgPSAyNTU7CisgICAgd2RvZ19yc3RfZGVsYXkgPSAyNTU7CisgICAgd2RvZ19jb3VudGVyID0gMHhmZmZmOworICAgIHdkb2dfcnN0b24gPSAwOworICAgIHdkb2dfc3RhdHVzID0gaW5pdDsKKworI2lmZGVmIEVSQQorICAgIGVyYXJlZyA9IDA7CisjZW5kaWYKKworfQorCisKKworc3RhdGljIHZvaWQKK21lY19pbnRhY2sobGV2ZWwpCisgICAgaW50MzIgICAgICAgICAgIGxldmVsOworeworICAgIGludCAgICAgICAgICAgICBpcnFfdGVzdDsKKworICAgIGlmIChzaXNfdmVyYm9zZSkKKwlwcmludGYoImludGVycnVwdCAlZCBhY2tub3dsZWRnZWRcbiIsIGxldmVsKTsKKyAgICBpcnFfdGVzdCA9IG1lY190Y3IgJiAweDgwMDAwOworICAgIGlmICgoaXJxX3Rlc3QpICYmIChtZWNfaWZyICYgKDEgPDwgbGV2ZWwpKSkKKwltZWNfaWZyICY9IH4oMSA8PCBsZXZlbCk7CisgICAgZWxzZQorCW1lY19pcHIgJj0gfigxIDw8IGxldmVsKTsKKyAgIGNoa19pcnEoKTsKK30KKworc3RhdGljIHZvaWQKK2Noa19pcnEoKQoreworICAgIGludDMyICAgICAgICAgICBpOworICAgIHVpbnQzMiAgICAgICAgICBpdG1wOworICAgIGludAkJICAgIG9sZF9pcmw7CisKKyAgICBvbGRfaXJsID0gZXh0X2lybDsKKyAgICBpZiAobWVjX3RjciAmIDB4ODAwMDApIGl0bXAgPSBtZWNfaWZyOworICAgIGVsc2UgaXRtcCAgPSAwOworICAgIGl0bXAgPSAoKG1lY19pcHIgfCBpdG1wKSAmIH5tZWNfaW1yKSAmIDB4MGZmZmU7CisgICAgZXh0X2lybCA9IDA7CisgICAgaWYgKGl0bXAgIT0gMCkgeworCWZvciAoaSA9IDE1OyBpID4gMDsgaS0tKSB7CisJICAgIGlmICgoKGl0bXAgPj4gaSkgJiAxKSAhPSAwKSB7CisJCWlmICgoc2lzX3ZlcmJvc2UpICYmIChpID4gb2xkX2lybCkpIAorCQkgICAgcHJpbnRmKCJJVSBpcmw6ICVkXG4iLCBpKTsKKwkJZXh0X2lybCA9IGk7CisJICAgICAgICBzZXRfaW50KGksIG1lY19pbnRhY2ssIGkpOworCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCittZWNfaXJxKGxldmVsKQorICAgIGludDMyICAgICAgICAgICBsZXZlbDsKK3sKKyAgICBtZWNfaXByIHw9ICgxIDw8IGxldmVsKTsKKyAgICBjaGtfaXJxKCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfc2ZzcihmYXVsdCwgYWRkciwgYXNpLCByZWFkKQorICAgIHVpbnQzMiAgICAgICAgICBmYXVsdDsKKyAgICB1aW50MzIgICAgICAgICAgYWRkcjsKKyAgICB1aW50MzIgICAgICAgICAgYXNpOworICAgIHVpbnQzMiAgICAgICAgICByZWFkOworeworICAgIGlmICgoYXNpID09IDB4YSkgfHwgKGFzaSA9PSAweGIpKSB7CisJbWVjX2ZmYXIgPSBhZGRyOworCW1lY19zZnNyID0gKGZhdWx0IDw8IDMpIHwgKCFyZWFkIDw8IDE1KTsKKwltZWNfc2ZzciB8PSAoKG1lY19zZnNyICYgMSkgXiAxKSB8IChtZWNfc2ZzciAmIDEpOworCXN3aXRjaCAoYXNpKSB7CisJY2FzZSAweGE6CisJICAgIG1lY19zZnNyIHw9IDB4MDAwNDsKKwkgICAgYnJlYWs7CisJY2FzZSAweGI6CisJICAgIG1lY19zZnNyIHw9IDB4MTAwNDsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KK30KKworc3RhdGljIGludDMyCittZWNfcmVhZChhZGRyLCBhc2ksIGRhdGEpCisgICAgdWludDMyICAgICAgICAgIGFkZHI7CisgICAgdWludDMyICAgICAgICAgIGFzaTsKKyAgICB1aW50MzIgICAgICAgICAqZGF0YTsKK3sKKworICAgIHN3aXRjaCAoYWRkciAmIDB4MGZmKSB7CisKKyAgICBjYXNlIE1FQ19NQ1I6CQkvKiAweDAwICovCisJKmRhdGEgPSBtZWNfbWNyOworCWJyZWFrOworCisgICAgY2FzZSBNRUNfTUVNQ0ZHOgkJLyogMHgxMCAqLworCSpkYXRhID0gbWVjX21lbWNmZzsKKwlicmVhazsKKworICAgIGNhc2UgTUVDX0lPQ1I6CisJKmRhdGEgPSBtZWNfaW9jcjsJLyogMHgxNCAqLworCWJyZWFrOworCisgICAgY2FzZSBNRUNfU1NBMToJCS8qIDB4MjAgKi8KKwkqZGF0YSA9IG1lY19zc2FbMF0gfCAobWVjX3dwclswXSA8PCAyMyk7CisJYnJlYWs7CisgICAgY2FzZSBNRUNfU0VBMToJCS8qIDB4MjQgKi8KKwkqZGF0YSA9IG1lY19zZWFbMF07CisJYnJlYWs7CisgICAgY2FzZSBNRUNfU1NBMjoJCS8qIDB4MjggKi8KKwkqZGF0YSA9IG1lY19zc2FbMV0gfCAobWVjX3dwclsxXSA8PCAyMyk7CisJYnJlYWs7CisgICAgY2FzZSBNRUNfU0VBMjoJCS8qIDB4MmMgKi8KKwkqZGF0YSA9IG1lY19zZWFbMV07CisJYnJlYWs7CisKKyAgICBjYXNlIE1FQ19JU1I6CQkvKiAweDQ0ICovCisJKmRhdGEgPSBtZWNfaXNyOworCWJyZWFrOworCisgICAgY2FzZSBNRUNfSVBSOgkJLyogMHg0OCAqLworCSpkYXRhID0gbWVjX2lwcjsKKwlicmVhazsKKworICAgIGNhc2UgTUVDX0lNUjoJCS8qIDB4NGMgKi8KKwkqZGF0YSA9IG1lY19pbXI7CisJYnJlYWs7CisKKyAgICBjYXNlIE1FQ19JRlI6CQkvKiAweDU0ICovCisJKmRhdGEgPSBtZWNfaWZyOworCWJyZWFrOworCisgICAgY2FzZSBNRUNfUlRDX0NPVU5URVI6CS8qIDB4ODAgKi8KKwkqZGF0YSA9IHJ0Y19jb3VudGVyX3JlYWQoKTsKKwlicmVhazsKKyAgICBjYXNlIE1FQ19SVENfU0NBTEVSOgkvKiAweDg0ICovCisJaWYgKHJ0Y19lbmFibGVkKQorCSAgICAqZGF0YSA9IHJ0Y19zY2FsZXIgLSAobm93KCkgLSBydGNfc2NhbGVyX3N0YXJ0KTsKKwllbHNlCisJICAgICpkYXRhID0gcnRjX3NjYWxlcjsKKwlicmVhazsKKworICAgIGNhc2UgTUVDX0dQVF9DT1VOVEVSOgkvKiAweDg4ICovCisJKmRhdGEgPSBncHRfY291bnRlcl9yZWFkKCk7CisJYnJlYWs7CisKKyAgICBjYXNlIE1FQ19HUFRfU0NBTEVSOgkvKiAweDhjICovCisJaWYgKHJ0Y19lbmFibGVkKQorCSAgICAqZGF0YSA9IGdwdF9zY2FsZXIgLSAobm93KCkgLSBncHRfc2NhbGVyX3N0YXJ0KTsKKwllbHNlCisJICAgICpkYXRhID0gZ3B0X3NjYWxlcjsKKwlicmVhazsKKworCisgICAgY2FzZSBNRUNfU0ZTUjoJCS8qIDB4QTAgKi8KKwkqZGF0YSA9IG1lY19zZnNyOworCWJyZWFrOworCisgICAgY2FzZSBNRUNfRkZBUjoJCS8qIDB4QTQgKi8KKwkqZGF0YSA9IG1lY19mZmFyOworCWJyZWFrOworCisgICAgY2FzZSBTSU1fTE9BRDoKKwlmbmFtZVtmaW5kXSA9IDA7CisJaWYgKGZpbmQgPT0gMCkKKwkgICAgc3RyY3B5KGZuYW1lLCAic2ltbG9hZCIpOworCWZpbmQgPSBiZmRfbG9hZChmbmFtZSk7CisgCWlmIChmaW5kID09IC0xKSAKKwkgICAgKmRhdGEgPSAwOworCWVsc2UKKwkgICAgKmRhdGEgPSAxOworCWZpbmQgPSAwOworCWJyZWFrOworCisgICAgY2FzZSBNRUNfRVJTUjoJCS8qIDB4QjAgKi8KKwkqZGF0YSA9IG1lY19lcnNyOworCWJyZWFrOworCisgICAgY2FzZSBNRUNfVENSOgkJLyogMHhEMCAqLworCSpkYXRhID0gbWVjX3RjcjsKKwlicmVhazsKKworICAgIGNhc2UgTUVDX1VBUlRBOgkJLyogMHhFMCAqLworICAgIGNhc2UgTUVDX1VBUlRCOgkJLyogMHhFNCAqLworCWlmIChhc2kgIT0gMHhiKSB7CisJICAgIHNldF9zZnNyKE1FQ19BQ0MsIGFkZHIsIGFzaSwgMSk7CisJICAgIHJldHVybiAoMSk7CisJfQorCSpkYXRhID0gcmVhZF91YXJ0KGFkZHIpOworCWJyZWFrOworCisgICAgY2FzZSBNRUNfVUFSVF9DVFJMOgkJLyogMHhFOCAqLworCisJKmRhdGEgPSByZWFkX3VhcnQoYWRkcik7CisJYnJlYWs7CisKKyAgICBkZWZhdWx0OgorCXNldF9zZnNyKE1FQ19BQ0MsIGFkZHIsIGFzaSwgMSk7CisJcmV0dXJuICgxKTsKKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIChNT0spOworfQorCitzdGF0aWMgaW50CittZWNfd3JpdGUoYWRkciwgZGF0YSkKKyAgICB1aW50MzIgICAgICAgICAgYWRkcjsKKyAgICB1aW50MzIgICAgICAgICAgZGF0YTsKK3sKKyAgICBpZiAoc2lzX3ZlcmJvc2UgPiAxKQorCXByaW50ZigiTUVDIHdyaXRlIGE6ICUwOHgsIGQ6ICUwOHhcbiIsYWRkcixkYXRhKTsKKyAgICBzd2l0Y2ggKGFkZHIgJiAweDBmZikgeworCisgICAgY2FzZSBNRUNfTUNSOgorCW1lY19tY3IgPSBkYXRhOworCWRlY29kZV9tY3IoKTsKKyAgICAgICAgaWYgKG1lY19tY3IgJiAweDA4MDAwKSBtZWNwYXJlcnJvcigpOworCWJyZWFrOworCisgICAgY2FzZSBNRUNfU0ZSOgorCWlmIChtZWNfbWNyICYgMHgyKSB7CisJICAgIHN5c19yZXNldCgpOworCSAgICBtZWNfZXJzciA9IDB4NDAwMDsKKyAgICAJICAgIGlmIChzaXNfdmVyYm9zZSkKKwkgICAgCXByaW50ZigiIFNvZnR3YXJlIHJlc2V0IGlzc3VlZFxuIik7CisJfQorCWJyZWFrOworCisgICAgY2FzZSBNRUNfSU9DUjoKKwltZWNfaW9jciA9IGRhdGE7CisgICAgICAgIGlmIChtZWNfaW9jciAmIDB4QzBDMEMwQzApIG1lY3BhcmVycm9yKCk7CisJYnJlYWs7CisKKyAgICBjYXNlIE1FQ19TU0ExOgkJLyogMHgyMCAqLworICAgICAgICBpZiAoZGF0YSAmIDB4RkUwMDAwMDApIG1lY3BhcmVycm9yKCk7CisJbWVjX3NzYVswXSA9IGRhdGEgJiAweDdmZmZmZjsKKwltZWNfd3ByWzBdID0gKGRhdGEgPj4gMjMpICYgMHgwMzsKKwltZW1fYWNjcHJvdCA9IG1lY193cHJbMF0gfHwgbWVjX3dwclsxXTsKKwlpZiAoc2lzX3ZlcmJvc2UgJiYgbWVjX3dwclswXSkKKwkgICAgcHJpbnRmKCJTZWdtZW50IDEgbWVtb3J5IHByb3RlY3Rpb24gZW5hYmxlZCAoMHgwMiUwNnggLSAweDAyJTA2eClcbiIsCisJCSAgIG1lY19zc2FbMF0gPDwgMiwgbWVjX3NlYVswXSA8PCAyKTsKKwlicmVhazsKKyAgICBjYXNlIE1FQ19TRUExOgkJLyogMHgyNCAqLworICAgICAgICBpZiAoZGF0YSAmIDB4RkY4MDAwMDApIG1lY3BhcmVycm9yKCk7CisJbWVjX3NlYVswXSA9IGRhdGEgJiAweDdmZmZmZjsKKwlicmVhazsKKyAgICBjYXNlIE1FQ19TU0EyOgkJLyogMHgyOCAqLworICAgICAgICBpZiAoZGF0YSAmIDB4RkUwMDAwMDApIG1lY3BhcmVycm9yKCk7CisJbWVjX3NzYVsxXSA9IGRhdGEgJiAweDdmZmZmZjsKKwltZWNfd3ByWzFdID0gKGRhdGEgPj4gMjMpICYgMHgwMzsKKwltZW1fYWNjcHJvdCA9IG1lY193cHJbMF0gfHwgbWVjX3dwclsxXTsKKwlpZiAoc2lzX3ZlcmJvc2UgJiYgbWVjX3dwclsxXSkKKwkgICAgcHJpbnRmKCJTZWdtZW50IDIgbWVtb3J5IHByb3RlY3Rpb24gZW5hYmxlZCAoMHgwMiUwNnggLSAweDAyJTA2eClcbiIsCisJCSAgIG1lY19zc2FbMV0gPDwgMiwgbWVjX3NlYVsxXSA8PCAyKTsKKwlicmVhazsKKyAgICBjYXNlIE1FQ19TRUEyOgkJLyogMHgyYyAqLworICAgICAgICBpZiAoZGF0YSAmIDB4RkY4MDAwMDApIG1lY3BhcmVycm9yKCk7CisJbWVjX3NlYVsxXSA9IGRhdGEgJiAweDdmZmZmZjsKKwlicmVhazsKKworICAgIGNhc2UgTUVDX1VBUlRBOgorICAgIGNhc2UgTUVDX1VBUlRCOgorICAgICAgICBpZiAoZGF0YSAmIDB4RkZGRkZGMDApIG1lY3BhcmVycm9yKCk7CisgICAgY2FzZSBNRUNfVUFSVF9DVFJMOgorICAgICAgICBpZiAoZGF0YSAmIDB4RkYwMEZGMDApIG1lY3BhcmVycm9yKCk7CisJd3JpdGVfdWFydChhZGRyLCBkYXRhKTsKKwlicmVhazsKKworICAgIGNhc2UgTUVDX0dQVF9SRUxPQUQ6CisJZ3B0X3JlbG9hZF9zZXQoZGF0YSk7CisJYnJlYWs7CisKKyAgICBjYXNlIE1FQ19HUFRfU0NBTEVSOgorICAgICAgICBpZiAoZGF0YSAmIDB4RkZGRjAwMDApIG1lY3BhcmVycm9yKCk7CisJZ3B0X3NjYWxlcl9zZXQoZGF0YSk7CisJYnJlYWs7CisKKyAgICBjYXNlIE1FQ19USU1FUl9DVFJMOgorICAgICAgICBpZiAoZGF0YSAmIDB4RkZGRkYwRjApIG1lY3BhcmVycm9yKCk7CisJdGltZXJfY3RybChkYXRhKTsKKwlicmVhazsKKworICAgIGNhc2UgTUVDX1JUQ19SRUxPQUQ6CisJcnRjX3JlbG9hZF9zZXQoZGF0YSk7CisJYnJlYWs7CisKKyAgICBjYXNlIE1FQ19SVENfU0NBTEVSOgorICAgICAgICBpZiAoZGF0YSAmIDB4RkZGRkZGMDApIG1lY3BhcmVycm9yKCk7CisJcnRjX3NjYWxlcl9zZXQoZGF0YSk7CisJYnJlYWs7CisKKyAgICBjYXNlIE1FQ19TRlNSOgkJLyogMHhBMCAqLworICAgICAgICBpZiAoZGF0YSAmIDB4RkZGRjA4ODApIG1lY3BhcmVycm9yKCk7CisJbWVjX3Nmc3IgPSAweDc4OworCWJyZWFrOworCisgICAgY2FzZSBNRUNfSVNSOgorICAgICAgICBpZiAoZGF0YSAmIDB4RkZGRkUwMDApIG1lY3BhcmVycm9yKCk7CisJbWVjX2lzciA9IGRhdGE7CisJYnJlYWs7CisKKyAgICBjYXNlIE1FQ19JTVI6CQkvKiAweDRjICovCisKKyAgICAgICAgaWYgKGRhdGEgJiAweEZGRkY4MDAxKSBtZWNwYXJlcnJvcigpOworCW1lY19pbXIgPSBkYXRhICYgMHg3ZmZlOworCWNoa19pcnEoKTsKKwlicmVhazsKKworICAgIGNhc2UgTUVDX0lDUjoJCS8qIDB4NTAgKi8KKworICAgICAgICBpZiAoZGF0YSAmIDB4RkZGRjAwMDEpIG1lY3BhcmVycm9yKCk7CisJbWVjX2lwciAmPSB+ZGF0YSAmIDB4MGZmZmU7CisJY2hrX2lycSgpOworCWJyZWFrOworCisgICAgY2FzZSBNRUNfSUZSOgkJLyogMHg1NCAqLworCisgICAgICAgIGlmIChtZWNfdGNyICYgMHgwODAwMDApIHsKKyAgICAgICAgICAgIGlmIChkYXRhICYgMHhGRkZGMDAwMSkgbWVjcGFyZXJyb3IoKTsKKwkgICAgbWVjX2lmciA9IGRhdGEgJiAweGZmZmU7CisJICAgIGNoa19pcnEoKTsKKwl9CisJYnJlYWs7CisgICAgY2FzZSBTSU1fTE9BRDoKKwlmbmFtZVtmaW5kKytdID0gKGNoYXIpIGRhdGE7CisJYnJlYWs7CisKKworICAgIGNhc2UgTUVDX01FTUNGRzoJCS8qIDB4MTAgKi8KKyAgICAgICAgaWYgKGRhdGEgJiAweEMwRTA4MDAwKSBtZWNwYXJlcnJvcigpOworCW1lY19tZW1jZmcgPSBkYXRhOworCWRlY29kZV9tZW1jZmcoKTsKKwlpZiAobWVjX21lbWNmZyAmIDB4YzBlMDgwMDApCisJICAgIG1lY3BhcmVycm9yKCk7CisJYnJlYWs7CisKKyAgICBjYXNlIE1FQ19XQ1I6CQkvKiAweDE4ICovCisJbWVjX3djciA9IGRhdGE7CisJZGVjb2RlX3djcigpOworCWJyZWFrOworCisgICAgY2FzZSBNRUNfRVJTUjoJCS8qIDB4QjAgKi8KKwlpZiAobWVjX3RjciAmIDB4MTAwMDAwKQorICAgICAgICAgICAgaWYgKGRhdGEgJiAweEZGRkZFRkMwKSBtZWNwYXJlcnJvcigpOworCSAgICBtZWNfZXJzciA9IGRhdGEgJiAweDEwM2Y7CisJYnJlYWs7CisKKyAgICBjYXNlIE1FQ19UQ1I6CQkvKiAweEQwICovCisgICAgICAgIGlmIChkYXRhICYgMHhGRkUxRkZDMCkgbWVjcGFyZXJyb3IoKTsKKwltZWNfdGNyID0gZGF0YSAmIDB4MWUwMDNmOworCWJyZWFrOworCisgICAgY2FzZSBNRUNfV0RPRzoJCS8qIDB4NjAgKi8KKwl3ZG9nX3NjYWxlciA9IChkYXRhID4+IDE2KSAmIDB4MGZmOworCXdkb2dfY291bnRlciA9IGRhdGEgJiAweDBmZmZmOworCXdkb2dfcnN0X2RlbGF5ID0gZGF0YSA+PiAyNDsKKwl3ZG9nX3JzdG9uID0gMDsKKwlpZiAod2RvZ19zdGF0dXMgPT0gc3RvcHBlZCkKKwkgICAgd2RvZ19zdGFydCgpOworCXdkb2dfc3RhdHVzID0gZW5hYmxlZDsKKwlicmVhazsKKworICAgIGNhc2UgTUVDX1RSQVBEOgkJLyogMHg2NCAqLworCWlmICh3ZG9nX3N0YXR1cyA9PSBpbml0KSB7CisJICAgIHdkb2dfc3RhdHVzID0gZGlzYWJsZWQ7CisJICAgIGlmIChzaXNfdmVyYm9zZSkKKwkJcHJpbnRmKCJXYXRjaGRvZyBkaXNhYmxlZFxuIik7CisJfQorCWJyZWFrOworCisgICAgY2FzZSBNRUNfUFdEUjoKKwlpZiAobWVjX21jciAmIDEpCisJICAgIHdhaXRfZm9yX2lycSgpOworCWJyZWFrOworCisgICAgZGVmYXVsdDoKKwlzZXRfc2ZzcihNRUNfQUNDLCBhZGRyLCAweGIsIDApOworCXJldHVybiAoMSk7CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybiAoTU9LKTsKK30KKworCisvKiBNRUMgVUFSVFMgKi8KKworc3RhdGljIGludCAgICAgIGlmZDEgPSAtMSwgaWZkMiA9IC0xLCBvZmQxID0gLTEsIG9mZDIgPSAtMTsKKwordm9pZAoraW5pdF9zdGRpbygpCit7CisgICAgaWYgKGR1bWJpbykKKyAgICAgICAgcmV0dXJuOyAvKiBkbyBub3RoaW5nICovCisgICAgaWYgKCFpZmQxKQorCXRjc2V0YXR0cigwLCBUQ1NBTk9XLCAmaW9jMSk7CisgICAgaWYgKCFpZmQyKQorCXRjc2V0YXR0cigwLCBUQ1NBTk9XLCAmaW9jMik7Cit9CisKK3ZvaWQKK3Jlc3RvcmVfc3RkaW8oKQoreworICAgIGlmIChkdW1iaW8pCisgICAgICAgIHJldHVybjsgLyogZG8gbm90aGluZyAqLworICAgIGlmICghaWZkMSkKKwl0Y3NldGF0dHIoMCwgVENTQU5PVywgJmlvY29sZDEpOworICAgIGlmICghaWZkMikKKwl0Y3NldGF0dHIoMCwgVENTQU5PVywgJmlvY29sZDIpOworfQorCisjZGVmaW5lIERPX1NURElPX1JFQUQoIF9mZF8sIF9idWZfLCBfbGVuXyApICAgICAgICAgIFwKKyAgICAgICAgICAgICAoIGR1bWJpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgPyAoMCkgLyogbm8gYnl0ZXMgcmVhZCwgbm8gZGVsYXkgKi8gICBcCisgICAgICAgICAgICAgICA6IHJlYWQoIF9mZF8sIF9idWZfLCBfbGVuXyApICkKKworCitzdGF0aWMgdm9pZAorcG9ydF9pbml0KCkKK3sKKworICAgIGlmICh1YmVuKSB7CisgICAgZjJpbiA9IHN0ZGluOworICAgIGYxaW4gPSBOVUxMOworICAgIGYyb3V0ID0gc3Rkb3V0OworICAgIGYxb3V0ID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgIGYxaW4gPSBzdGRpbjsKKyAgICBmMmluID0gTlVMTDsKKyAgICBmMW91dCA9IHN0ZG91dDsKKyAgICBmMm91dCA9IE5VTEw7CisgICAgfQorICAgIGlmICh1YXJ0X2RldjFbMF0gIT0gMCkKKwlpZiAoKGZkMSA9IG9wZW4odWFydF9kZXYxLCBPX1JEV1IgfCBPX05PTkJMT0NLKSkgPCAwKSB7CisJICAgIHByaW50ZigiV2FybmluZywgY291bGRuJ3Qgb3BlbiBvdXRwdXQgZGV2aWNlICVzXG4iLCB1YXJ0X2RldjEpOworCX0gZWxzZSB7CisJICAgIGlmIChzaXNfdmVyYm9zZSkKKwkJcHJpbnRmKCJzZXJpYWwgcG9ydCBBIG9uICVzXG4iLCB1YXJ0X2RldjEpOworCSAgICBmMWluID0gZjFvdXQgPSBmZG9wZW4oZmQxLCAicisiKTsKKwkgICAgc2V0YnVmKGYxb3V0LCBOVUxMKTsKKwkgICAgZjFvcGVuID0gMTsKKwl9CisgICAgaWYgKGYxaW4pIGlmZDEgPSBmaWxlbm8oZjFpbik7CisgICAgaWYgKGlmZDEgPT0gMCkgeworCWlmIChzaXNfdmVyYm9zZSkKKwkgICAgcHJpbnRmKCJzZXJpYWwgcG9ydCBBIG9uIHN0ZGluL3N0ZG91dFxuIik7CisgICAgICAgIGlmICghZHVtYmlvKSB7CisgICAgICAgICAgICB0Y2dldGF0dHIoaWZkMSwgJmlvYzEpOworICAgICAgICAgICAgaW9jb2xkMSA9IGlvYzE7CisgICAgICAgICAgICBpb2MxLmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPKTsKKyAgICAgICAgICAgIGlvYzEuY19jY1tWTUlOXSA9IDA7CisgICAgICAgICAgICBpb2MxLmNfY2NbVlRJTUVdID0gMDsKKyAgICAgICAgfQorCWYxb3BlbiA9IDE7CisgICAgfQorCisgICAgaWYgKGYxb3V0KSB7CisJb2ZkMSA9IGZpbGVubyhmMW91dCk7CisgICAgCWlmICghZHVtYmlvICYmIG9mZDEgPT0gMSkgc2V0YnVmKGYxb3V0LCBOVUxMKTsKKyAgICB9CisKKyAgICBpZiAodWFydF9kZXYyWzBdICE9IDApCisJaWYgKChmZDIgPSBvcGVuKHVhcnRfZGV2MiwgT19SRFdSIHwgT19OT05CTE9DSykpIDwgMCkgeworCSAgICBwcmludGYoIldhcm5pbmcsIGNvdWxkbid0IG9wZW4gb3V0cHV0IGRldmljZSAlc1xuIiwgdWFydF9kZXYyKTsKKwl9IGVsc2UgeworCSAgICBpZiAoc2lzX3ZlcmJvc2UpCisJCXByaW50Zigic2VyaWFsIHBvcnQgQiBvbiAlc1xuIiwgdWFydF9kZXYyKTsKKwkgICAgZjJpbiA9IGYyb3V0ID0gZmRvcGVuKGZkMiwgInIrIik7CisJICAgIHNldGJ1ZihmMm91dCwgTlVMTCk7CisJICAgIGYyb3BlbiA9IDE7CisJfQorICAgIGlmIChmMmluKSAgaWZkMiA9IGZpbGVubyhmMmluKTsKKyAgICBpZiAoaWZkMiA9PSAwKSB7CisJaWYgKHNpc192ZXJib3NlKQorCSAgICBwcmludGYoInNlcmlhbCBwb3J0IEIgb24gc3RkaW4vc3Rkb3V0XG4iKTsKKyAgICAgICAgaWYgKCFkdW1iaW8pIHsKKyAgICAgICAgICAgIHRjZ2V0YXR0cihpZmQyLCAmaW9jMik7CisgICAgICAgICAgICBpb2NvbGQyID0gaW9jMjsKKyAgICAgICAgICAgIGlvYzIuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8pOworICAgICAgICAgICAgaW9jMi5jX2NjW1ZNSU5dID0gMDsKKyAgICAgICAgICAgIGlvYzIuY19jY1tWVElNRV0gPSAwOworICAgICAgICB9CisJZjJvcGVuID0gMTsKKyAgICB9CisKKyAgICBpZiAoZjJvdXQpIHsKKwlvZmQyID0gZmlsZW5vKGYyb3V0KTsKKyAgICAgICAgaWYgKCFkdW1iaW8gJiYgb2ZkMiA9PSAxKSBzZXRidWYoZjJvdXQsIE5VTEwpOworICAgIH0KKworICAgIHdudW1hID0gd251bWIgPSAwOworCit9CisKK3N0YXRpYyB1aW50MzIKK3JlYWRfdWFydChhZGRyKQorICAgIHVpbnQzMiAgICAgICAgICBhZGRyOworeworCisgICAgdW5zaWduZWQgICAgICAgIHRtcDsKKworICAgIHRtcCA9IDA7CisgICAgc3dpdGNoIChhZGRyICYgMHhmZikgeworCisgICAgY2FzZSAweEUwOgkJCS8qIFVBUlQgMSAqLworI2lmbmRlZiBfV0lOMzIKKyNpZmRlZiBGQVNUX1VBUlQKKworCWlmIChhaW5kIDwgYW51bSkgeworCSAgICBpZiAoKGFpbmQgKyAxKSA8IGFudW0pCisJCW1lY19pcnEoNCk7CisJICAgIHJldHVybiAoMHg3MDAgfCAodWludDMyKSBhcVthaW5kKytdKTsKKwl9IGVsc2UgeworCSAgICBpZiAoZjFvcGVuKSB7CisJICAgICAgICBhbnVtID0gRE9fU1RESU9fUkVBRChpZmQxLCBhcSwgVUFSVEJVRik7CisJICAgIH0KKwkgICAgaWYgKGFudW0gPiAwKSB7CisJCWFpbmQgPSAwOworCQlpZiAoKGFpbmQgKyAxKSA8IGFudW0pCisJCSAgICBtZWNfaXJxKDQpOworCQlyZXR1cm4gKDB4NzAwIHwgKHVpbnQzMikgYXFbYWluZCsrXSk7CisJICAgIH0gZWxzZSB7CisJCXJldHVybiAoMHg2MDAgfCAodWludDMyKSBhcVthaW5kXSk7CisJICAgIH0KKworCX0KKyNlbHNlCisJdG1wID0gdWFydGFfZGF0YTsKKwl1YXJ0YV9kYXRhICY9IH5VQVJUX0RSOworCXVhcnRfc3RhdF9yZWcgJj0gflVBUlRBX0RSOworCXJldHVybiB0bXA7CisjZW5kaWYKKyNlbHNlCisJcmV0dXJuKDApOworI2VuZGlmCisJYnJlYWs7CisKKyAgICBjYXNlIDB4RTQ6CQkJLyogVUFSVCAyICovCisjaWZuZGVmIF9XSU4zMgorI2lmZGVmIEZBU1RfVUFSVAorCWlmIChiaW5kIDwgYm51bSkgeworCSAgICBpZiAoKGJpbmQgKyAxKSA8IGJudW0pCisJCW1lY19pcnEoNSk7CisJICAgIHJldHVybiAoMHg3MDAgfCAodWludDMyKSBicVtiaW5kKytdKTsKKwl9IGVsc2UgeworCSAgICBpZiAoZjJvcGVuKSB7CisJCWJudW0gPSBET19TVERJT19SRUFEKGlmZDIsIGJxLCBVQVJUQlVGKTsKKwkgICAgfQorCSAgICBpZiAoYm51bSA+IDApIHsKKwkJYmluZCA9IDA7CisJCWlmICgoYmluZCArIDEpIDwgYm51bSkKKwkJICAgIG1lY19pcnEoNSk7CisJCXJldHVybiAoMHg3MDAgfCAodWludDMyKSBicVtiaW5kKytdKTsKKwkgICAgfSBlbHNlIHsKKwkJcmV0dXJuICgweDYwMCB8ICh1aW50MzIpIGJxW2JpbmRdKTsKKwkgICAgfQorCisJfQorI2Vsc2UKKwl0bXAgPSB1YXJ0Yl9kYXRhOworCXVhcnRiX2RhdGEgJj0gflVBUlRfRFI7CisJdWFydF9zdGF0X3JlZyAmPSB+VUFSVEJfRFI7CisJcmV0dXJuIHRtcDsKKyNlbmRpZgorI2Vsc2UKKwlyZXR1cm4oMCk7CisjZW5kaWYKKwlicmVhazsKKworICAgIGNhc2UgMHhFODoJCQkvKiBVQVJUIHN0YXR1cyByZWdpc3RlcgkgKi8KKyNpZm5kZWYgX1dJTjMyCisjaWZkZWYgRkFTVF9VQVJUCisKKwlVY29udHJvbCA9IDA7CisJaWYgKGFpbmQgPCBhbnVtKSB7CisJICAgIFVjb250cm9sIHw9IDB4MDAwMDAwMDE7CisJfSBlbHNlIHsKKwkgICAgaWYgKGYxb3BlbikgeworCSAgICAgICAgYW51bSA9IERPX1NURElPX1JFQUQoaWZkMSwgYXEsIFVBUlRCVUYpOworICAgICAgICAgICAgfQorCSAgICBpZiAoYW51bSA+IDApIHsKKwkJVWNvbnRyb2wgfD0gMHgwMDAwMDAwMTsKKwkJYWluZCA9IDA7CisJCW1lY19pcnEoNCk7CisJICAgIH0KKwl9CisJaWYgKGJpbmQgPCBibnVtKSB7CisJICAgIFVjb250cm9sIHw9IDB4MDAwMTAwMDA7CisJfSBlbHNlIHsKKwkgICAgaWYgKGYyb3BlbikgeworCQlibnVtID0gRE9fU1RESU9fUkVBRChpZmQyLCBicSwgVUFSVEJVRik7CisJICAgIH0KKwkgICAgaWYgKGJudW0gPiAwKSB7CisJCVVjb250cm9sIHw9IDB4MDAwMTAwMDA7CisJCWJpbmQgPSAwOworCQltZWNfaXJxKDUpOworCSAgICB9CisJfQorCisJVWNvbnRyb2wgfD0gMHgwMDA2MDAwNjsKKwlyZXR1cm4gKFVjb250cm9sKTsKKyNlbHNlCisJcmV0dXJuICh1YXJ0X3N0YXRfcmVnKTsKKyNlbmRpZgorI2Vsc2UKKwlyZXR1cm4oMHgwMDA2MDAwNik7CisjZW5kaWYKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWlmIChzaXNfdmVyYm9zZSkKKwkgICAgcHJpbnRmKCJSZWFkIGZyb20gdW5pbXBsZW1lbnRlZCBNRUMgcmVnaXN0ZXIgKCV4KVxuIiwgYWRkcik7CisKKyAgICB9CisgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX3VhcnQoYWRkciwgZGF0YSkKKyAgICB1aW50MzIgICAgICAgICAgYWRkcjsKKyAgICB1aW50MzIgICAgICAgICAgZGF0YTsKK3sKKyAgICB1bnNpZ25lZCBjaGFyICAgYzsKKworICAgIGMgPSAodW5zaWduZWQgY2hhcikgZGF0YTsKKyAgICBzd2l0Y2ggKGFkZHIgJiAweGZmKSB7CisKKyAgICBjYXNlIDB4RTA6CQkJLyogVUFSVCBBICovCisjaWZkZWYgRkFTVF9VQVJUCisJaWYgKGYxb3BlbikgeworCSAgICBpZiAod251bWEgPCBVQVJUQlVGKQorCSAgICAgICAgd2J1ZmFbd251bWErK10gPSBjOworCSAgICBlbHNlIHsKKwkgICAgICAgIHdoaWxlICh3bnVtYSkKKwkJICAgIHdudW1hIC09IGZ3cml0ZSh3YnVmYSwgMSwgd251bWEsIGYxb3V0KTsKKwkgICAgICAgIHdidWZhW3dudW1hKytdID0gYzsKKwkgICAgfQorCX0KKwltZWNfaXJxKDQpOworI2Vsc2UKKwlpZiAodWFydF9zdGF0X3JlZyAmIFVBUlRBX1NSRSkgeworCSAgICB1YXJ0YV9zcmVnID0gYzsKKwkgICAgdWFydF9zdGF0X3JlZyAmPSB+VUFSVEFfU1JFOworCSAgICBldmVudCh1YXJ0YV90eCwgMCwgVUFSVF9UWF9USU1FKTsKKwl9IGVsc2UgeworCSAgICB1YXJ0YV9ocmVnID0gYzsKKwkgICAgdWFydF9zdGF0X3JlZyAmPSB+VUFSVEFfSFJFOworCX0KKyNlbmRpZgorCWJyZWFrOworCisgICAgY2FzZSAweEU0OgkJCS8qIFVBUlQgQiAqLworI2lmZGVmIEZBU1RfVUFSVAorCWlmIChmMm9wZW4pIHsKKwkgICAgaWYgKHdudW1iIDwgVUFSVEJVRikKKwkJd2J1ZmJbd251bWIrK10gPSBjOworCSAgICBlbHNlIHsKKwkJd2hpbGUgKHdudW1iKQorCQkgICAgd251bWIgLT0gZndyaXRlKHdidWZiLCAxLCB3bnVtYiwgZjJvdXQpOworCQl3YnVmYlt3bnVtYisrXSA9IGM7CisJICAgIH0KKwl9CisJbWVjX2lycSg1KTsKKyNlbHNlCisJaWYgKHVhcnRfc3RhdF9yZWcgJiBVQVJUQl9TUkUpIHsKKwkgICAgdWFydGJfc3JlZyA9IGM7CisJICAgIHVhcnRfc3RhdF9yZWcgJj0gflVBUlRCX1NSRTsKKwkgICAgZXZlbnQodWFydGJfdHgsIDAsIFVBUlRfVFhfVElNRSk7CisJfSBlbHNlIHsKKwkgICAgdWFydGJfaHJlZyA9IGM7CisJICAgIHVhcnRfc3RhdF9yZWcgJj0gflVBUlRCX0hSRTsKKwl9CisjZW5kaWYKKwlicmVhazsKKyAgICBjYXNlIDB4RTg6CQkJLyogVUFSVCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNpZm5kZWYgRkFTVF9VQVJUCisJaWYgKGRhdGEgJiBVQVJUQV9DTFIpIHsKKwkgICAgdWFydF9zdGF0X3JlZyAmPSAweEZGRkYwMDAwOworCSAgICB1YXJ0X3N0YXRfcmVnIHw9IFVBUlRBX1NSRSB8IFVBUlRBX0hSRTsKKwl9CisJaWYgKGRhdGEgJiBVQVJUQl9DTFIpIHsKKwkgICAgdWFydF9zdGF0X3JlZyAmPSAweDAwMDBGRkZGOworCSAgICB1YXJ0X3N0YXRfcmVnIHw9IFVBUlRCX1NSRSB8IFVBUlRCX0hSRTsKKwl9CisjZW5kaWYKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWlmIChzaXNfdmVyYm9zZSkKKwkgICAgcHJpbnRmKCJXcml0ZSB0byB1bmltcGxlbWVudGVkIE1FQyByZWdpc3RlciAoJXgpXG4iLCBhZGRyKTsKKworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2ZsdXNoX3VhcnQoKQoreworICAgIHdoaWxlICh3bnVtYSAmJiBmMW9wZW4pCisJd251bWEgLT0gZndyaXRlKHdidWZhLCAxLCB3bnVtYSwgZjFvdXQpOworICAgIHdoaWxlICh3bnVtYiAmJiBmMm9wZW4pCisJd251bWIgLT0gZndyaXRlKHdidWZiLCAxLCB3bnVtYiwgZjJvdXQpOworfQorCisKKworc3RhdGljIHZvaWQKK3VhcnRhX3R4KCkKK3sKKworICAgIHdoaWxlIChmMW9wZW4gJiYgZndyaXRlKCZ1YXJ0YV9zcmVnLCAxLCAxLCBmMW91dCkgIT0gMSk7CisgICAgaWYgKHVhcnRfc3RhdF9yZWcgJiBVQVJUQV9IUkUpIHsKKwl1YXJ0X3N0YXRfcmVnIHw9IFVBUlRBX1NSRTsKKyAgICB9IGVsc2UgeworCXVhcnRhX3NyZWcgPSB1YXJ0YV9ocmVnOworCXVhcnRfc3RhdF9yZWcgfD0gVUFSVEFfSFJFOworCWV2ZW50KHVhcnRhX3R4LCAwLCBVQVJUX1RYX1RJTUUpOworICAgIH0KKyAgICBtZWNfaXJxKDQpOworfQorCitzdGF0aWMgdm9pZAordWFydGJfdHgoKQoreworICAgIHdoaWxlIChmMm9wZW4gJiYgZndyaXRlKCZ1YXJ0Yl9zcmVnLCAxLCAxLCBmMm91dCkgIT0gMSk7CisgICAgaWYgKHVhcnRfc3RhdF9yZWcgJiBVQVJUQl9IUkUpIHsKKwl1YXJ0X3N0YXRfcmVnIHw9IFVBUlRCX1NSRTsKKyAgICB9IGVsc2UgeworCXVhcnRiX3NyZWcgPSB1YXJ0Yl9ocmVnOworCXVhcnRfc3RhdF9yZWcgfD0gVUFSVEJfSFJFOworCWV2ZW50KHVhcnRiX3R4LCAwLCBVQVJUX1RYX1RJTUUpOworICAgIH0KKyAgICBtZWNfaXJxKDUpOworfQorCitzdGF0aWMgdm9pZAordWFydF9yeChhcmcpCisgICAgY2FkZHJfdCAgICAgICAgIGFyZzsKK3sKKyAgICBpbnQzMiAgICAgICAgICAgcnNpemU7CisgICAgY2hhciAgICAgICAgICAgIHJ4ZDsKKworCisgICAgcnNpemUgPSAwOworICAgIGlmIChmMW9wZW4pCisgICAgICAgIHJzaXplID0gRE9fU1RESU9fUkVBRChpZmQxLCAmcnhkLCAxKTsKKyAgICBpZiAocnNpemUgPiAwKSB7CisJdWFydGFfZGF0YSA9IFVBUlRfRFIgfCByeGQ7CisJaWYgKHVhcnRfc3RhdF9yZWcgJiBVQVJUQV9IUkUpCisJICAgIHVhcnRhX2RhdGEgfD0gVUFSVF9USEU7CisJaWYgKHVhcnRfc3RhdF9yZWcgJiBVQVJUQV9TUkUpCisJICAgIHVhcnRhX2RhdGEgfD0gVUFSVF9UU0U7CisJaWYgKHVhcnRfc3RhdF9yZWcgJiBVQVJUQV9EUikgeworCSAgICB1YXJ0X3N0YXRfcmVnIHw9IFVBUlRBX09SOworCSAgICBtZWNfaXJxKDcpOwkJLyogVUFSVCBlcnJvciBpbnRlcnJ1cHQgKi8KKwl9CisJdWFydF9zdGF0X3JlZyB8PSBVQVJUQV9EUjsKKwltZWNfaXJxKDQpOworICAgIH0KKyAgICByc2l6ZSA9IDA7CisgICAgaWYgKGYyb3BlbikKKyAgICAgICAgcnNpemUgPSBET19TVERJT19SRUFEKGlmZDIsICZyeGQsIDEpOworICAgIGlmIChyc2l6ZSkgeworCXVhcnRiX2RhdGEgPSBVQVJUX0RSIHwgcnhkOworCWlmICh1YXJ0X3N0YXRfcmVnICYgVUFSVEJfSFJFKQorCSAgICB1YXJ0Yl9kYXRhIHw9IFVBUlRfVEhFOworCWlmICh1YXJ0X3N0YXRfcmVnICYgVUFSVEJfU1JFKQorCSAgICB1YXJ0Yl9kYXRhIHw9IFVBUlRfVFNFOworCWlmICh1YXJ0X3N0YXRfcmVnICYgVUFSVEJfRFIpIHsKKwkgICAgdWFydF9zdGF0X3JlZyB8PSBVQVJUQl9PUjsKKwkgICAgbWVjX2lycSg3KTsJCS8qIFVBUlQgZXJyb3IgaW50ZXJydXB0ICovCisJfQorCXVhcnRfc3RhdF9yZWcgfD0gVUFSVEJfRFI7CisJbWVjX2lycSg1KTsKKyAgICB9CisgICAgZXZlbnQodWFydF9yeCwgMCwgVUFSVF9SWF9USU1FKTsKK30KKworc3RhdGljIHZvaWQKK3VhcnRfaW50cihhcmcpCisgICAgY2FkZHJfdCAgICAgICAgIGFyZzsKK3sKKyAgICByZWFkX3VhcnQoMHhFOCk7CQkvKiBDaGVjayBmb3IgVUFSVCBpbnRlcnJ1cHRzIGV2ZXJ5IDEwMDAgY2xrICovCisgICAgZmx1c2hfdWFydCgpOwkJLyogRmx1c2ggVUFSVCBwb3J0cyAgICAgICovCisgICAgZXZlbnQodWFydF9pbnRyLCAwLCBVQVJUX0ZMVVNIX1RJTUUpOworfQorCisKK3N0YXRpYyB2b2lkCit1YXJ0X2lycV9zdGFydCgpCit7CisjaWZkZWYgRkFTVF9VQVJUCisgICAgZXZlbnQodWFydF9pbnRyLCAwLCBVQVJUX0ZMVVNIX1RJTUUpOworI2Vsc2UKKyNpZm5kZWYgX1dJTjMyCisgICAgZXZlbnQodWFydF9yeCwgMCwgVUFSVF9SWF9USU1FKTsKKyNlbmRpZgorI2VuZGlmCit9CisKKy8qIFdhdGNoLWRvZyAqLworCitzdGF0aWMgdm9pZAord2RvZ19pbnRyKGFyZykKKyAgICBjYWRkcl90ICAgICAgICAgYXJnOworeworICAgIGlmICh3ZG9nX3N0YXR1cyA9PSBkaXNhYmxlZCkgeworCXdkb2dfc3RhdHVzID0gc3RvcHBlZDsKKyAgICB9IGVsc2UgeworCisJaWYgKHdkb2dfY291bnRlcikgeworCSAgICB3ZG9nX2NvdW50ZXItLTsKKwkgICAgZXZlbnQod2RvZ19pbnRyLCAwLCB3ZG9nX3NjYWxlciArIDEpOworCX0gZWxzZSB7CisJICAgIGlmICh3ZG9nX3JzdG9uKSB7CisJCXByaW50ZigiV2F0Y2hkb2cgcmVzZXQhXG4iKTsKKwkJc3lzX3Jlc2V0KCk7CisJCW1lY19lcnNyID0gMHhDMDAwOworCSAgICB9IGVsc2UgeworCQltZWNfaXJxKDE1KTsKKwkJd2RvZ19yc3RvbiA9IDE7CisJCXdkb2dfY291bnRlciA9IHdkb2dfcnN0X2RlbGF5OworCQlldmVudCh3ZG9nX2ludHIsIDAsIHdkb2dfc2NhbGVyICsgMSk7CisJICAgIH0KKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAord2RvZ19zdGFydCgpCit7CisgICAgZXZlbnQod2RvZ19pbnRyLCAwLCB3ZG9nX3NjYWxlciArIDEpOworICAgIGlmIChzaXNfdmVyYm9zZSkKKwlwcmludGYoIldhdGNoZG9nIHN0YXJ0ZWQsIHNjYWxlciA9ICVkLCBjb3VudGVyID0gJWRcbiIsCisJICAgICAgIHdkb2dfc2NhbGVyLCB3ZG9nX2NvdW50ZXIpOworfQorCisKKy8qIE1FQyB0aW1lcnMgKi8KKworCitzdGF0aWMgdm9pZAorcnRjX2ludHIoYXJnKQorICAgIGNhZGRyX3QgICAgICAgICBhcmc7Cit7CisgICAgaWYgKHJ0Y19jb3VudGVyID09IDApIHsKKworCW1lY19pcnEoMTMpOworCWlmIChydGNfY3IpCisJICAgIHJ0Y19jb3VudGVyID0gcnRjX3JlbG9hZDsKKwllbHNlCisJICAgIHJ0Y19zZSA9IDA7CisgICAgfSBlbHNlCisJcnRjX2NvdW50ZXIgLT0gMTsKKyAgICBpZiAocnRjX3NlKSB7CisJZXZlbnQocnRjX2ludHIsIDAsIHJ0Y19zY2FsZXIgKyAxKTsKKwlydGNfc2NhbGVyX3N0YXJ0ID0gbm93KCk7CisJcnRjX2VuYWJsZWQgPSAxOworICAgIH0gZWxzZSB7CisJaWYgKHNpc192ZXJib3NlKQorCSAgICBwcmludGYoIlJUQyBzdG9wcGVkXG5cciIpOworCXJ0Y19lbmFibGVkID0gMDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitydGNfc3RhcnQoKQoreworICAgIGlmIChzaXNfdmVyYm9zZSkKKwlwcmludGYoIlJUQyBzdGFydGVkIChwZXJpb2QgJWQpXG5cciIsIHJ0Y19zY2FsZXIgKyAxKTsKKyAgICBldmVudChydGNfaW50ciwgMCwgcnRjX3NjYWxlciArIDEpOworICAgIHJ0Y19zY2FsZXJfc3RhcnQgPSBub3coKTsKKyAgICBydGNfZW5hYmxlZCA9IDE7Cit9CisKK3N0YXRpYyB1aW50MzIKK3J0Y19jb3VudGVyX3JlYWQoKQoreworICAgIHJldHVybiAocnRjX2NvdW50ZXIpOworfQorCitzdGF0aWMgdm9pZAorcnRjX3NjYWxlcl9zZXQodmFsKQorICAgIHVpbnQzMiAgICAgICAgICB2YWw7Cit7CisgICAgcnRjX3NjYWxlciA9IHZhbCAmIDB4MGZmOwkvKiBlaWdodC1iaXQgc2NhbGVyIG9ubHkgKi8KK30KKworc3RhdGljIHZvaWQKK3J0Y19yZWxvYWRfc2V0KHZhbCkKKyAgICB1aW50MzIgICAgICAgICAgdmFsOworeworICAgIHJ0Y19yZWxvYWQgPSB2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitncHRfaW50cihhcmcpCisgICAgY2FkZHJfdCAgICAgICAgIGFyZzsKK3sKKyAgICBpZiAoZ3B0X2NvdW50ZXIgPT0gMCkgeworCW1lY19pcnEoMTIpOworCWlmIChncHRfY3IpCisJICAgIGdwdF9jb3VudGVyID0gZ3B0X3JlbG9hZDsKKwllbHNlCisJICAgIGdwdF9zZSA9IDA7CisgICAgfSBlbHNlCisJZ3B0X2NvdW50ZXIgLT0gMTsKKyAgICBpZiAoZ3B0X3NlKSB7CisJZXZlbnQoZ3B0X2ludHIsIDAsIGdwdF9zY2FsZXIgKyAxKTsKKwlncHRfc2NhbGVyX3N0YXJ0ID0gbm93KCk7CisJZ3B0X2VuYWJsZWQgPSAxOworICAgIH0gZWxzZSB7CisJaWYgKHNpc192ZXJib3NlKQorCSAgICBwcmludGYoIkdQVCBzdG9wcGVkXG5cciIpOworCWdwdF9lbmFibGVkID0gMDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitncHRfc3RhcnQoKQoreworICAgIGlmIChzaXNfdmVyYm9zZSkKKwlwcmludGYoIkdQVCBzdGFydGVkIChwZXJpb2QgJWQpXG5cciIsIGdwdF9zY2FsZXIgKyAxKTsKKyAgICBldmVudChncHRfaW50ciwgMCwgZ3B0X3NjYWxlciArIDEpOworICAgIGdwdF9zY2FsZXJfc3RhcnQgPSBub3coKTsKKyAgICBncHRfZW5hYmxlZCA9IDE7Cit9CisKK3N0YXRpYyB1aW50MzIKK2dwdF9jb3VudGVyX3JlYWQoKQoreworICAgIHJldHVybiAoZ3B0X2NvdW50ZXIpOworfQorCitzdGF0aWMgdm9pZAorZ3B0X3NjYWxlcl9zZXQodmFsKQorICAgIHVpbnQzMiAgICAgICAgICB2YWw7Cit7CisgICAgZ3B0X3NjYWxlciA9IHZhbCAmIDB4MGZmZmY7CS8qIDE2LWJpdCBzY2FsZXIgKi8KK30KKworc3RhdGljIHZvaWQKK2dwdF9yZWxvYWRfc2V0KHZhbCkKKyAgICB1aW50MzIgICAgICAgICAgdmFsOworeworICAgIGdwdF9yZWxvYWQgPSB2YWw7Cit9CisKK3N0YXRpYyB2b2lkCit0aW1lcl9jdHJsKHZhbCkKKyAgICB1aW50MzIgICAgICAgICAgdmFsOworeworCisgICAgcnRjX2NyID0gKCh2YWwgJiBUQ1JfVENSQ1IpICE9IDApOworICAgIGlmICh2YWwgJiBUQ1JfVENSQ0wpIHsKKwlydGNfY291bnRlciA9IHJ0Y19yZWxvYWQ7CisgICAgfQorICAgIGlmICh2YWwgJiBUQ1JfVENSU0wpIHsKKyAgICB9CisgICAgcnRjX3NlID0gKCh2YWwgJiBUQ1JfVENSU0UpICE9IDApOworICAgIGlmIChydGNfc2UgJiYgKHJ0Y19lbmFibGVkID09IDApKQorCXJ0Y19zdGFydCgpOworCisgICAgZ3B0X2NyID0gKHZhbCAmIFRDUl9HQUNSKTsKKyAgICBpZiAodmFsICYgVENSX0dBQ0wpIHsKKwlncHRfY291bnRlciA9IGdwdF9yZWxvYWQ7CisgICAgfQorICAgIGlmICh2YWwgJiBUQ1JfR0FDTCkgeworICAgIH0KKyAgICBncHRfc2UgPSAodmFsICYgVENSX0dBU0UpID4+IDI7CisgICAgaWYgKGdwdF9zZSAmJiAoZ3B0X2VuYWJsZWQgPT0gMCkpCisJZ3B0X3N0YXJ0KCk7Cit9CisKKworLyogUmV0cmlldmUgZGF0YSBmcm9tIHRhcmdldCBtZW1vcnkuICBNRU0gcG9pbnRzIHRvIGxvY2F0aW9uIGZyb20gd2hpY2gKKyAgIHRvIHJlYWQgdGhlIGRhdGE7IERBVEEgcG9pbnRzIHRvIHdvcmRzIHdoZXJlIHJldHJpZXZlZCBkYXRhIHdpbGwgYmUKKyAgIHN0b3JlZCBpbiBob3N0IGJ5dGUgb3JkZXIuICBTWiBjb250YWlucyBsb2coMikgb2YgdGhlIG51bWJlciBvZiBieXRlcworICAgdG8gcmV0cmlldmUsIGFuZCBjYW4gYmUgMCAoMSBieXRlKSwgMSAob25lIGhhbGYtd29yZCksIDIgKG9uZSB3b3JkKSwKKyAgIG9yIDMgKHR3byB3b3JkcykuICovCisKK3N0YXRpYyB2b2lkCitmZXRjaF9ieXRlcyAoYXNpLCBtZW0sIGRhdGEsIHN6KQorICAgIGludAkJICAgIGFzaTsKKyAgICB1bnNpZ25lZCBjaGFyICAqbWVtOworICAgIHVpbnQzMgkgICAqZGF0YTsKKyAgICBpbnQJCSAgICBzejsKK3sKKyAgICBpZiAoQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisJfHwgYXNpID09IDggfHwgYXNpID09IDkpIHsKKwlzd2l0Y2ggKHN6KSB7CisJY2FzZSAzOgorCSAgICBkYXRhWzFdID0gICgoKHVpbnQzMikgbWVtWzddKSAmIDB4ZmYpIHwKKwkJICAgICAgKCgoKHVpbnQzMikgbWVtWzZdKSAmIDB4ZmYpIDw8ICA4KSB8CisJCSAgICAgICgoKCh1aW50MzIpIG1lbVs1XSkgJiAweGZmKSA8PCAxNikgfAorCQkgICAgICAoKCgodWludDMyKSBtZW1bNF0pICYgMHhmZikgPDwgMjQpOworCSAgICAvKiBGYWxsIHRocm91Z2ggdG8gMiAqLworCWNhc2UgMjoKKwkgICAgZGF0YVswXSA9ICAoKCh1aW50MzIpIG1lbVszXSkgJiAweGZmKSB8CisJCSAgICAgICgoKCh1aW50MzIpIG1lbVsyXSkgJiAweGZmKSA8PCAgOCkgfAorCQkgICAgICAoKCgodWludDMyKSBtZW1bMV0pICYgMHhmZikgPDwgMTYpIHwKKwkJICAgICAgKCgoKHVpbnQzMikgbWVtWzBdKSAmIDB4ZmYpIDw8IDI0KTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBkYXRhWzBdID0gICgoKHVpbnQzMikgbWVtWzFdKSAmIDB4ZmYpIHwKKwkJICAgICAgKCgoKHVpbnQzMikgbWVtWzBdKSAmIDB4ZmYpIDw8IDgpOworCSAgICBicmVhazsKKwljYXNlIDA6CisJICAgIGRhdGFbMF0gPSBtZW1bMF0gJiAweGZmOworCSAgICBicmVhazsKKwkgICAgCisJfQorICAgIH0gZWxzZSB7CisJc3dpdGNoIChzeikgeworCWNhc2UgMzoKKwkgICAgZGF0YVsxXSA9ICgoKCh1aW50MzIpIG1lbVs3XSkgJiAweGZmKSA8PCAyNCkgfAorCQkgICAgICAoKCgodWludDMyKSBtZW1bNl0pICYgMHhmZikgPDwgMTYpIHwKKwkJICAgICAgKCgoKHVpbnQzMikgbWVtWzVdKSAmIDB4ZmYpIDw8ICA4KSB8CisJCSAgICAgICAoKCh1aW50MzIpIG1lbVs0XSkgJiAweGZmKTsKKwkgICAgLyogRmFsbCB0aHJvdWdoIHRvIDQgKi8KKwljYXNlIDI6CisJICAgIGRhdGFbMF0gPSAoKCgodWludDMyKSBtZW1bM10pICYgMHhmZikgPDwgMjQpIHwKKwkJICAgICAgKCgoKHVpbnQzMikgbWVtWzJdKSAmIDB4ZmYpIDw8IDE2KSB8CisJCSAgICAgICgoKCh1aW50MzIpIG1lbVsxXSkgJiAweGZmKSA8PCAgOCkgfAorCQkgICAgICAgKCgodWludDMyKSBtZW1bMF0pICYgMHhmZik7CisJICAgIGJyZWFrOworCWNhc2UgMToKKwkgICAgZGF0YVswXSA9ICgoKCh1aW50MzIpIG1lbVsxXSkgJiAweGZmKSA8PCAgOCkgfAorCQkgICAgICAgKCgodWludDMyKSBtZW1bMF0pICYgMHhmZik7CisJICAgIGJyZWFrOworCWNhc2UgMDoKKwkgICAgZGF0YVswXSA9IG1lbVswXSAmIDB4ZmY7CisJICAgIGJyZWFrOworCX0KKyAgICB9Cit9CisKKworLyogU3RvcmUgZGF0YSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gIE1FTSBwb2ludHMgdG8gbG9jYXRpb24gdG8gc3RvcmUgZGF0YTsKKyAgIERBVEEgcG9pbnRzIHRvIHdvcmRzIGluIGhvc3QgYnl0ZSBvcmRlciB0byBiZSBzdG9yZWQuICBTWiBjb250YWlucyBsb2coMikKKyAgIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmV0cmlldmUsIGFuZCBjYW4gYmUgMCAoMSBieXRlKSwgMSAob25lIGhhbGYtd29yZCksCisgICAyIChvbmUgd29yZCksIG9yIDMgKHR3byB3b3JkcykuICovCisKK3N0YXRpYyB2b2lkCitzdG9yZV9ieXRlcyAobWVtLCBkYXRhLCBzeikKKyAgICB1bnNpZ25lZCBjaGFyICAqbWVtOworICAgIHVpbnQzMgkgICAqZGF0YTsKKyAgICBpbnQJCSAgICBzejsKK3sKKyAgICBpZiAoQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOKSB7CisJc3dpdGNoIChzeikgeworCWNhc2UgMzoKKwkgICAgbWVtWzddID0gKGRhdGFbMV0gPj4gMjQpICYgMHhmZjsKKwkgICAgbWVtWzZdID0gKGRhdGFbMV0gPj4gMTYpICYgMHhmZjsKKwkgICAgbWVtWzVdID0gKGRhdGFbMV0gPj4gIDgpICYgMHhmZjsKKwkgICAgbWVtWzRdID0gZGF0YVsxXSAmIDB4ZmY7CisJICAgIC8qIEZhbGwgdGhyb3VnaCB0byAyICovCisJY2FzZSAyOgorCSAgICBtZW1bM10gPSAoZGF0YVswXSA+PiAyNCkgJiAweGZmOworCSAgICBtZW1bMl0gPSAoZGF0YVswXSA+PiAxNikgJiAweGZmOworCSAgICAvKiBGYWxsIHRocm91Z2ggdG8gMSAqLworCWNhc2UgMToKKwkgICAgbWVtWzFdID0gKGRhdGFbMF0gPj4gIDgpICYgMHhmZjsKKwkgICAgLyogRmFsbCB0aHJvdWdoIHRvIDAgKi8KKwljYXNlIDA6CisJICAgIG1lbVswXSA9IGRhdGFbMF0gJiAweGZmOworCSAgICBicmVhazsKKwl9CisgICAgfSBlbHNlIHsKKwlzd2l0Y2ggKHN6KSB7CisJY2FzZSAzOgorCSAgICBtZW1bN10gPSBkYXRhWzFdICYgMHhmZjsKKwkgICAgbWVtWzZdID0gKGRhdGFbMV0gPj4gIDgpICYgMHhmZjsKKwkgICAgbWVtWzVdID0gKGRhdGFbMV0gPj4gMTYpICYgMHhmZjsKKwkgICAgbWVtWzRdID0gKGRhdGFbMV0gPj4gMjQpICYgMHhmZjsKKwkgICAgLyogRmFsbCB0aHJvdWdoIHRvIDIgKi8KKwljYXNlIDI6CisJICAgIG1lbVszXSA9IGRhdGFbMF0gJiAweGZmOworCSAgICBtZW1bMl0gPSAoZGF0YVswXSA+PiAgOCkgJiAweGZmOworCSAgICBtZW1bMV0gPSAoZGF0YVswXSA+PiAxNikgJiAweGZmOworCSAgICBtZW1bMF0gPSAoZGF0YVswXSA+PiAyNCkgJiAweGZmOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIG1lbVsxXSA9IGRhdGFbMF0gJiAweGZmOworCSAgICBtZW1bMF0gPSAoZGF0YVswXSA+PiA4KSAmIDB4ZmY7CisJICAgIGJyZWFrOworCWNhc2UgMDoKKwkgICAgbWVtWzBdID0gZGF0YVswXSAmIDB4ZmY7CisJICAgIGJyZWFrOworCSAgICAKKwl9CisgICAgfQorfQorCisKKy8qIE1lbW9yeSBlbXVsYXRpb24gKi8KKworaW50CittZW1vcnlfcmVhZChhc2ksIGFkZHIsIGRhdGEsIHN6LCB3cykKKyAgICBpbnQzMiAgICAgICAgICAgYXNpOworICAgIHVpbnQzMiAgICAgICAgICBhZGRyOworICAgIHVpbnQzMiAgICAgICAgICpkYXRhOworICAgIGludDMyICAgICAgICAgICBzejsKKyAgICBpbnQzMiAgICAgICAgICAqd3M7Cit7CisgICAgaW50MzIgICAgICAgICAgIG1leGM7CisKKyNpZmRlZiBFUlJJTkoKKyAgICBpZiAoZXJybWVjKSB7CisJaWYgKHNpc192ZXJib3NlKQorCSAgICBwcmludGYoIkluc2VydGVkIE1FQyBlcnJvciAlZFxuIixlcnJtZWMpOworCXNldF9zZnNyKGVycm1lYywgYWRkciwgYXNpLCAxKTsKKwlpZiAoZXJybWVjID09IDUpIG1lY3BhcmVycm9yKCk7CisJaWYgKGVycm1lYyA9PSA2KSBpdWNvbXBlcnIoKTsKKwllcnJtZWMgPSAwOworCXJldHVybigxKTsKKyAgICB9CisjZW5kaWY7CisKKyAgICBpZiAoKGFkZHIgPj0gbWVtX3JhbXN0YXJ0KSAmJiAoYWRkciA8IChtZW1fcmFtc3RhcnQgKyBtZW1fcmFtc3opKSkgeworCWZldGNoX2J5dGVzIChhc2ksICZyYW1iW2FkZHIgJiBtZW1fcmFtbWFza10sIGRhdGEsIHN6KTsKKwkqd3MgPSBtZW1fcmFtcl93czsKKwlyZXR1cm4gKDApOworICAgIH0gZWxzZSBpZiAoKGFkZHIgPj0gTUVDX1NUQVJUKSAmJiAoYWRkciA8IE1FQ19FTkQpKSB7CisJbWV4YyA9IG1lY19yZWFkKGFkZHIsIGFzaSwgZGF0YSk7CisJaWYgKG1leGMpIHsKKwkgICAgc2V0X3Nmc3IoTUVDX0FDQywgYWRkciwgYXNpLCAxKTsKKwkgICAgKndzID0gTUVNX0VYX1dTOworCX0gZWxzZSB7CisJICAgICp3cyA9IDA7CisJfQorCXJldHVybiAobWV4Yyk7CisKKyNpZmRlZiBFUkEKKworICAgIH0gZWxzZSBpZiAoZXJhKSB7CisgICAgCWlmICgoYWRkciA8IDB4MTAwMDAwKSB8fCAKKwkgICAgKChhZGRyPj0gMHg4MDAwMDAwMCkgJiYgKGFkZHIgPCAweDgwMTAwMDAwKSkpIHsKKwkgICAgZmV0Y2hfYnl0ZXMgKGFzaSwgJnJvbWJbYWRkciAmIFJPTV9NQVNLXSwgZGF0YSwgc3opOworCSAgICAqd3MgPSA0OworCSAgICByZXR1cm4gKDApOworCX0gZWxzZSBpZiAoKGFkZHIgPj0gMHgxMDAwMDAwMCkgJiYgCisJCSAgIChhZGRyIDwgKDB4MTAwMDAwMDAgKyAoNTEyIDw8IChtZWNfaW9jciAmIDB4MGYpKSkpICYmCisJCSAgIChtZWNfaW9jciAmIDB4MTApKSAgeworCSAgICAqZGF0YSA9IGVyYXJlZzsKKwkgICAgcmV0dXJuICgwKTsKKwl9CisJCisgICAgfSBlbHNlICBpZiAoYWRkciA8IG1lbV9yb21zeikgeworCSAgICBmZXRjaF9ieXRlcyAoYXNpLCAmcm9tYlthZGRyXSwgZGF0YSwgc3opOworCSAgICAqd3MgPSBtZW1fcm9tcl93czsKKwkgICAgcmV0dXJuICgwKTsKKworI2Vsc2UKKyAgICB9IGVsc2UgaWYgKGFkZHIgPCBtZW1fcm9tc3opIHsKKwlmZXRjaF9ieXRlcyAoYXNpLCAmcm9tYlthZGRyXSwgZGF0YSwgc3opOworCSp3cyA9IG1lbV9yb21yX3dzOworCXJldHVybiAoMCk7CisjZW5kaWYKKworICAgIH0KKworICAgIHByaW50ZigiTWVtb3J5IGV4Y2VwdGlvbiBhdCAleCAoaWxsZWdhbCBhZGRyZXNzKVxuIiwgYWRkcik7CisgICAgc2V0X3Nmc3IoVUlNUF9BQ0MsIGFkZHIsIGFzaSwgMSk7CisgICAgKndzID0gTUVNX0VYX1dTOworICAgIHJldHVybiAoMSk7Cit9CisKK2ludAorbWVtb3J5X3dyaXRlKGFzaSwgYWRkciwgZGF0YSwgc3osIHdzKQorICAgIGludDMyICAgICAgICAgICBhc2k7CisgICAgdWludDMyICAgICAgICAgIGFkZHI7CisgICAgdWludDMyICAgICAgICAgKmRhdGE7CisgICAgaW50MzIgICAgICAgICAgIHN6OworICAgIGludDMyICAgICAgICAgICp3czsKK3sKKyAgICB1aW50MzIgICAgICAgICAgYnl0ZV9hZGRyOworICAgIHVpbnQzMiAgICAgICAgICBieXRlX21hc2s7CisgICAgdWludDMyICAgICAgICAgIHdhZGRyOworICAgIHVpbnQzMiAgICAgICAgICpyYW07CisgICAgaW50MzIgICAgICAgICAgIG1leGM7CisgICAgaW50ICAgICAgICAgICAgIGk7CisgICAgaW50ICAgICAgICAgICAgIHdwaGl0WzJdOworCisjaWZkZWYgRVJSSU5KCisgICAgaWYgKGVycm1lYykgeworCWlmIChzaXNfdmVyYm9zZSkKKwkgICAgcHJpbnRmKCJJbnNlcnRlZCBNRUMgZXJyb3IgJWRcbiIsZXJybWVjKTsKKwlzZXRfc2ZzcihlcnJtZWMsIGFkZHIsIGFzaSwgMCk7CisJaWYgKGVycm1lYyA9PSA1KSBtZWNwYXJlcnJvcigpOworCWlmIChlcnJtZWMgPT0gNikgaXVjb21wZXJyKCk7CisJZXJybWVjID0gMDsKKwlyZXR1cm4oMSk7CisgICAgfQorI2VuZGlmOworCisgICAgaWYgKChhZGRyID49IG1lbV9yYW1zdGFydCkgJiYgKGFkZHIgPCAobWVtX3JhbXN0YXJ0ICsgbWVtX3JhbXN6KSkpIHsKKwlpZiAobWVtX2FjY3Byb3QpIHsKKworCSAgICB3YWRkciA9IChhZGRyICYgMHg3ZmZmZmYpID4+IDI7CisJICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCXdwaGl0W2ldID0KKwkJICAgICgoKGFzaSA9PSAweGEpICYmIChtZWNfd3ByW2ldICYgMSkpIHx8CisJCSAgICAgKChhc2kgPT0gMHhiKSAmJiAobWVjX3dwcltpXSAmIDIpKSkgJiYKKwkJICAgICgod2FkZHIgPj0gbWVjX3NzYVtpXSkgJiYgKCh3YWRkciB8IChzeiA9PSAzKSkgPCBtZWNfc2VhW2ldKSk7CisKKwkgICAgaWYgKCgobWVtX2Jsb2NrcHJvdCkgJiYgKHdwaGl0WzBdIHx8IHdwaGl0WzFdKSkgfHwKKwkJKCghbWVtX2Jsb2NrcHJvdCkgJiYKKwkJICEoKG1lY193cHJbMF0gJiYgd3BoaXRbMF0pIHx8IChtZWNfd3ByWzFdICYmIHdwaGl0WzFdKSkKKwkJICkpIHsKKwkJaWYgKHNpc192ZXJib3NlKQorCQkgICAgcHJpbnRmKCJNZW1vcnkgYWNjZXNzIHByb3RlY3Rpb24gZXJyb3IgYXQgMHglMDh4XG4iLCBhZGRyKTsKKwkJc2V0X3Nmc3IoUFJPVF9FWEMsIGFkZHIsIGFzaSwgMCk7CisJCSp3cyA9IE1FTV9FWF9XUzsKKwkJcmV0dXJuICgxKTsKKwkgICAgfQorCX0KKworCXN0b3JlX2J5dGVzICgmcmFtYlthZGRyICYgbWVtX3JhbW1hc2tdLCBkYXRhLCBzeik7CisKKwlzd2l0Y2ggKHN6KSB7CisJY2FzZSAwOgorCWNhc2UgMToKKwkgICAgKndzID0gbWVtX3JhbXdfd3MgKyAzOworCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgICp3cyA9IG1lbV9yYW13X3dzOworCSAgICBicmVhazsKKwljYXNlIDM6CisJICAgICp3cyA9IDIgKiBtZW1fcmFtd193cyArIFNURF9XUzsKKwkgICAgYnJlYWs7CisJfQorCXJldHVybiAoMCk7CisgICAgfSBlbHNlIGlmICgoYWRkciA+PSBNRUNfU1RBUlQpICYmIChhZGRyIDwgTUVDX0VORCkpIHsKKwlpZiAoKHN6ICE9IDIpIHx8IChhc2kgIT0gMHhiKSkgeworCSAgICBzZXRfc2ZzcihNRUNfQUNDLCBhZGRyLCBhc2ksIDApOworCSAgICAqd3MgPSBNRU1fRVhfV1M7CisJICAgIHJldHVybiAoMSk7CisJfQorCW1leGMgPSBtZWNfd3JpdGUoYWRkciwgKmRhdGEpOworCWlmIChtZXhjKSB7CisJICAgIHNldF9zZnNyKE1FQ19BQ0MsIGFkZHIsIGFzaSwgMCk7CisJICAgICp3cyA9IE1FTV9FWF9XUzsKKwl9IGVsc2UgeworCSAgICAqd3MgPSAwOworCX0KKwlyZXR1cm4gKG1leGMpOworCisjaWZkZWYgRVJBCisKKyAgICB9IGVsc2UgaWYgKGVyYSkgeworICAgIAlpZiAoKGVyYXJlZyAmIDIpICYmIAorCSgoYWRkciA8IDB4MTAwMDAwKSB8fCAoKGFkZHIgPj0gMHg4MDAwMDAwMCkgJiYgKGFkZHIgPCAweDgwMTAwMDAwKSkpKSB7CisJICAgIGFkZHIgJj0gUk9NX01BU0s7CisJICAgICp3cyA9IHN6ID09IDMgPyA4IDogNDsKKwkgICAgc3RvcmVfYnl0ZXMgKCZyb21iW2FkZHJdLCBkYXRhLCBzeik7CisgICAgICAgICAgICByZXR1cm4gKDApOworCX0gZWxzZSBpZiAoKGFkZHIgPj0gMHgxMDAwMDAwMCkgJiYgCisJCSAgIChhZGRyIDwgKDB4MTAwMDAwMDAgKyAoNTEyIDw8IChtZWNfaW9jciAmIDB4MGYpKSkpICYmCisJCSAgIChtZWNfaW9jciAmIDB4MTApKSAgeworCSAgICBlcmFyZWcgPSAqZGF0YSAmIDB4MGU7CisJICAgIHJldHVybiAoMCk7CisJfQorCisgICAgfSBlbHNlIGlmICgoYWRkciA8IG1lbV9yb21zeikgJiYgKG1lY19tZW1jZmcgJiAweDEwMDAwKSAmJiAod3JwKSAmJgorICAgICAgICAgICAgICAgKCgobWVjX21lbWNmZyAmIDB4MjAwMDApICYmIChzeiA+IDEpKSB8fCAKKwkJKCEobWVjX21lbWNmZyAmIDB4MjAwMDApICYmIChzeiA9PSAwKSkpKSB7CisKKwkqd3MgPSBtZW1fcm9td193cyArIDE7CisJaWYgKHN6ID09IDMpCisJICAgICp3cyArPSBtZW1fcm9td193cyArIFNURF9XUzsKKwlzdG9yZV9ieXRlcyAoJnJvbWJbYWRkcl0sIGRhdGEsIHN6KTsKKyAgICAgICAgcmV0dXJuICgwKTsKKworI2Vsc2UKKyAgICB9IGVsc2UgaWYgKChhZGRyIDwgbWVtX3JvbXN6KSAmJiAobWVjX21lbWNmZyAmIDB4MTAwMDApICYmICh3cnApICYmCisgICAgICAgICAgICAgICAoKChtZWNfbWVtY2ZnICYgMHgyMDAwMCkgJiYgKHN6ID4gMSkpIHx8IAorCQkoIShtZWNfbWVtY2ZnICYgMHgyMDAwMCkgJiYgKHN6ID09IDApKSkpIHsKKworCSp3cyA9IG1lbV9yb213X3dzICsgMTsKKwlpZiAoc3ogPT0gMykKKyAgICAgICAgICAgICp3cyArPSBtZW1fcm9td193cyArIFNURF9XUzsKKwlzdG9yZV9ieXRlcyAoJnJvbWJbYWRkcl0sIGRhdGEsIHN6KTsKKyAgICAgICAgcmV0dXJuICgwKTsKKworI2VuZGlmCisKKyAgICB9CisJCisgICAgKndzID0gTUVNX0VYX1dTOworICAgIHNldF9zZnNyKFVJTVBfQUNDLCBhZGRyLCBhc2ksIDApOworICAgIHJldHVybiAoMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICAqCitnZXRfbWVtX3B0cihhZGRyLCBzaXplKQorICAgIHVpbnQzMiAgICAgICAgICBhZGRyOworICAgIHVpbnQzMiAgICAgICAgICBzaXplOworeworICAgIGlmICgoYWRkciArIHNpemUpIDwgUk9NX1NaKSB7CisJcmV0dXJuICgmcm9tYlthZGRyXSk7CisgICAgfSBlbHNlIGlmICgoYWRkciA+PSBtZW1fcmFtc3RhcnQpICYmICgoYWRkciArIHNpemUpIDwgbWVtX3JhbWVuZCkpIHsKKwlyZXR1cm4gKCZyYW1iW2FkZHIgJiBtZW1fcmFtbWFza10pOworICAgIH0KKworI2lmZGVmIEVSQQorICAgICAgZWxzZSBpZiAoKGVyYSkgJiYgKChhZGRyIDwweDEwMDAwMCkgfHwgCisJKChhZGRyID49ICh1bnNpZ25lZCkgMHg4MDAwMDAwMCkgJiYgKChhZGRyICsgc2l6ZSkgPCAodW5zaWduZWQpIDB4ODAxMDAwMDApKSkpIHsKKwlyZXR1cm4gKCZyb21iW2FkZHIgJiBST01fTUFTS10pOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuICgoY2hhciAqKSAtMSk7Cit9CisKK2ludAorc2lzX21lbW9yeV93cml0ZShhZGRyLCBkYXRhLCBsZW5ndGgpCisgICAgdWludDMyICAgICAgICAgIGFkZHI7CisgICAgY2hhciAgICAgICAgICAgKmRhdGE7CisgICAgdWludDMyICAgICAgICAgIGxlbmd0aDsKK3sKKyAgICBjaGFyICAgICAgICAgICAqbWVtOworCisgICAgaWYgKChtZW0gPSBnZXRfbWVtX3B0cihhZGRyLCBsZW5ndGgpKSA9PSAoKGNoYXIgKikgLTEpKQorCXJldHVybiAoMCk7CisKKyAgICBtZW1jcHkobWVtLCBkYXRhLCBsZW5ndGgpOworICAgIHJldHVybiAobGVuZ3RoKTsKK30KKworaW50CitzaXNfbWVtb3J5X3JlYWQoYWRkciwgZGF0YSwgbGVuZ3RoKQorICAgIHVpbnQzMiAgICAgICAgICBhZGRyOworICAgIGNoYXIgICAgICAgICAgICpkYXRhOworICAgIHVpbnQzMiAgICAgICAgICBsZW5ndGg7Cit7CisgICAgY2hhciAgICAgICAgICAgKm1lbTsKKworICAgIGlmICgobWVtID0gZ2V0X21lbV9wdHIoYWRkciwgbGVuZ3RoKSkgPT0gKChjaGFyICopIC0xKSkKKwlyZXR1cm4gKDApOworCisgICAgbWVtY3B5KGRhdGEsIG1lbSwgbGVuZ3RoKTsKKyAgICByZXR1cm4gKGxlbmd0aCk7Cit9CmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvZXhlYy5jIGIvc2ltL2VyYzMyL2V4ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjFmYzBjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2VyYzMyL2V4ZWMuYwpAQCAtMCwwICsxLDIwNDEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBTSVMuCisgKiAKKyAqIFNJUywgU1BBUkMgaW5zdHJ1Y3Rpb24gc2ltdWxhdG9yIFYxLjggQ29weXJpZ2h0IChDKSAxOTk1IEppcmkgR2Fpc2xlciwKKyAqIEV1cm9wZWFuIFNwYWNlIEFnZW5jeQorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1CisgKiBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogCisgKi8KKworI2luY2x1ZGUgInNpcy5oIgorI2luY2x1ZGUgImVuZC5oIgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitleHRlcm4gaW50MzIgICAgc2lzX3ZlcmJvc2UsIHNwYXJjbGl0ZTsKK2ludCBleHRfaXJsID0gMDsKKworLyogTG9hZC9zdG9yZSBpbnRlcmxvY2sgZGVsYXkgKi8KKyNkZWZpbmUgRkxTVEhPTEQgMQorCisvKiBMb2FkIGRlbGF5IChkZWxldGUgaWYgdW53YW50ZWQgLSBzcGVlZHMgdXAgc2ltdWxhdGlvbikgKi8KKyNkZWZpbmUgTE9BRF9ERUwgMQorCisjZGVmaW5lIFRfTEQJMgorI2RlZmluZSBUX0xERAkzCisjZGVmaW5lIFRfU1QJMworI2RlZmluZSBUX1NURAk0CisjZGVmaW5lIFRfTERTVAk0CisjZGVmaW5lIFRfSk1QTAkyCisjZGVmaW5lIFRfUkVUVAkyCisKKyNkZWZpbmUgRlNSX1FORSAJMHgyMDAwCisjZGVmaW5lIEZQX0VYRV9NT0RFIDAKKyNkZWZpbmUJRlBfRVhDX1BFICAgMQorI2RlZmluZSBGUF9FWENfTU9ERSAyCisKKyNkZWZpbmUJRkJBCTgKKyNkZWZpbmUJRkJOCTAKKyNkZWZpbmUJRkJORQkxCisjZGVmaW5lCUZCTEcJMgorI2RlZmluZQlGQlVMCTMKKyNkZWZpbmUJRkJMIAk0CisjZGVmaW5lCUZCVUcJNQorI2RlZmluZQlGQkcgCTYKKyNkZWZpbmUJRkJVIAk3CisjZGVmaW5lIEZCQQk4CisjZGVmaW5lIEZCRQk5CisjZGVmaW5lIEZCVUUJMTAKKyNkZWZpbmUgRkJHRQkxMQorI2RlZmluZSBGQlVHRQkxMgorI2RlZmluZSBGQkxFCTEzCisjZGVmaW5lIEZCVUxFCTE0CisjZGVmaW5lIEZCTwkxNQorCisjZGVmaW5lCUZDQ19FIAkwCisjZGVmaW5lCUZDQ19MIAkxCisjZGVmaW5lCUZDQ19HIAkyCisjZGVmaW5lCUZDQ19VIAkzCisKKyNkZWZpbmUgUFNSX0VUIDB4MjAKKyNkZWZpbmUgUFNSX0VGIDB4MTAwMAorI2RlZmluZSBQU1JfUFMgMHg0MAorI2RlZmluZSBQU1JfUyAgMHg4MAorI2RlZmluZSBQU1JfTiAgMHgwODAwMDAwCisjZGVmaW5lIFBTUl9aICAweDA0MDAwMDAKKyNkZWZpbmUgUFNSX1YgIDB4MDIwMDAwMAorI2RlZmluZSBQU1JfQyAgMHgwMTAwMDAwCisjZGVmaW5lIFBTUl9DQyAweDBGMDAwMDAKKyNkZWZpbmUgUFNSX0NXUCAweDcKKyNkZWZpbmUgUFNSX1BJTCAweDBmMDAKKworI2RlZmluZSBJQ0NfTgkoaWNjID4+IDMpCisjZGVmaW5lIElDQ19aCShpY2MgPj4gMikKKyNkZWZpbmUgSUNDX1YJKGljYyA+PiAxKQorI2RlZmluZSBJQ0NfQwkoaWNjKQorCisjZGVmaW5lIEZQX1BSRVMJKHNyZWdzLT5mcHVfcHJlcykKKworI2RlZmluZSBUUkFQX0lFWEMgMQorI2RlZmluZSBUUkFQX1VOSU1QIDIKKyNkZWZpbmUgVFJBUF9QUklWSSAzCisjZGVmaW5lIFRSQVBfRlBESVMgNAorI2RlZmluZSBUUkFQX1dPRkwgNQorI2RlZmluZSBUUkFQX1dVRkwgNgorI2RlZmluZSBUUkFQX1VOQUxJIDcKKyNkZWZpbmUgVFJBUF9GUEVYQyA4CisjZGVmaW5lIFRSQVBfREVYQyA5CisjZGVmaW5lIFRSQVBfVEFHIDEwCisjZGVmaW5lIFRSQVBfRElWMCAweDJhCisKKyNkZWZpbmUgRlNSX1RUCQkweDFDMDAwCisjZGVmaW5lIEZQX0lFRUUJCTB4MDQwMDAKKyNkZWZpbmUgRlBfVU5JTVAJMHgwQzAwMAorI2RlZmluZSBGUF9TRVFfRVJSCTB4MTAwMDAKKworI2RlZmluZQlCSUNDX0JOCQkwCisjZGVmaW5lCUJJQ0NfQkUJCTEKKyNkZWZpbmUJQklDQ19CTEUJMgorI2RlZmluZQlCSUNDX0JMCQkzCisjZGVmaW5lCUJJQ0NfQkxFVQk0CisjZGVmaW5lCUJJQ0NfQkNTCTUKKyNkZWZpbmUJQklDQ19ORUcJNgorI2RlZmluZQlCSUNDX0JWUwk3CisjZGVmaW5lCUJJQ0NfQkEJCTgKKyNkZWZpbmUJQklDQ19CTkUJOQorI2RlZmluZQlCSUNDX0JHCQkxMAorI2RlZmluZQlCSUNDX0JHRQkxMQorI2RlZmluZQlCSUNDX0JHVQkxMgorI2RlZmluZQlCSUNDX0JDQwkxMworI2RlZmluZQlCSUNDX1BPUwkxNAorI2RlZmluZQlCSUNDX0JWQwkxNQorCisjZGVmaW5lIElOU1RfU0lNTTEzIDB4MWZmZgorI2RlZmluZSBJTlNUX1JTMiAgICAweDFmCisjZGVmaW5lIElOU1RfSQkgICAgMHgyMDAwCisjZGVmaW5lIEFERCAJMHgwMAorI2RlZmluZSBBRERDQyAJMHgxMAorI2RlZmluZSBBRERYIAkweDA4CisjZGVmaW5lIEFERFhDQyAJMHgxOAorI2RlZmluZSBUQUREQ0MgCTB4MjAKKyNkZWZpbmUgVFNVQkNDICAweDIxCisjZGVmaW5lIFRBRERDQ1RWIDB4MjIKKyNkZWZpbmUgVFNVQkNDVFYgMHgyMworI2RlZmluZSBJQU5EIAkweDAxCisjZGVmaW5lIElBTkRDQyAJMHgxMQorI2RlZmluZSBJQU5ETiAJMHgwNQorI2RlZmluZSBJQU5ETkNDCTB4MTUKKyNkZWZpbmUgTVVMU2NjIAkweDI0CisjZGVmaW5lIERJVlNjYyAJMHgxRAorI2RlZmluZSBTTVVMCTB4MEIKKyNkZWZpbmUgU01VTENDCTB4MUIKKyNkZWZpbmUgVU1VTAkweDBBCisjZGVmaW5lIFVNVUxDQwkweDFBCisjZGVmaW5lIFNESVYJMHgwRgorI2RlZmluZSBTRElWQ0MJMHgxRgorI2RlZmluZSBVRElWCTB4MEUKKyNkZWZpbmUgVURJVkNDCTB4MUUKKyNkZWZpbmUgSU9SIAkweDAyCisjZGVmaW5lIElPUkNDIAkweDEyCisjZGVmaW5lIElPUk4gCTB4MDYKKyNkZWZpbmUgSU9STkNDIAkweDE2CisjZGVmaW5lIFNMTCAJMHgyNQorI2RlZmluZSBTUkEgCTB4MjcKKyNkZWZpbmUgU1JMIAkweDI2CisjZGVmaW5lIFNVQiAJMHgwNAorI2RlZmluZSBTVUJDQyAJMHgxNAorI2RlZmluZSBTVUJYIAkweDBDCisjZGVmaW5lIFNVQlhDQyAJMHgxQworI2RlZmluZSBJWE5PUiAJMHgwNworI2RlZmluZSBJWE5PUkNDCTB4MTcKKyNkZWZpbmUgSVhPUiAJMHgwMworI2RlZmluZSBJWE9SQ0MgCTB4MTMKKyNkZWZpbmUgU0VUSEkgCTB4MDQKKyNkZWZpbmUgQklDQyAJMHgwMgorI2RlZmluZSBGUEJDQyAJMHgwNgorI2RlZmluZSBSRFkgCTB4MjgKKyNkZWZpbmUgUkRQU1IgCTB4MjkKKyNkZWZpbmUgUkRXSU0gCTB4MkEKKyNkZWZpbmUgUkRUQlIgCTB4MkIKKyNkZWZpbmUgU0NBTiAJMHgyQworI2RlZmluZSBXUlkJMHgzMAorI2RlZmluZSBXUlBTUgkweDMxCisjZGVmaW5lIFdSV0lNCTB4MzIKKyNkZWZpbmUgV1JUQlIJMHgzMworI2RlZmluZSBKTVBMIAkweDM4CisjZGVmaW5lIFJFVFQgCTB4MzkKKyNkZWZpbmUgVElDQyAJMHgzQQorI2RlZmluZSBTQVZFIAkweDNDCisjZGVmaW5lIFJFU1RPUkUgMHgzRAorI2RlZmluZSBMREQJMHgwMworI2RlZmluZSBMRERBCTB4MTMKKyNkZWZpbmUgTEQJMHgwMAorI2RlZmluZSBMREEJMHgxMAorI2RlZmluZSBMREYJMHgyMAorI2RlZmluZSBMRERGCTB4MjMKKyNkZWZpbmUgTERTVFVCCTB4MEQKKyNkZWZpbmUgTERTVFVCQQkweDFECisjZGVmaW5lIExEVUIJMHgwMQorI2RlZmluZSBMRFVCQQkweDExCisjZGVmaW5lIExEU0IJMHgwOQorI2RlZmluZSBMRFNCQQkweDE5CisjZGVmaW5lIExEVUgJMHgwMgorI2RlZmluZSBMRFVIQQkweDEyCisjZGVmaW5lIExEU0gJMHgwQQorI2RlZmluZSBMRFNIQQkweDFBCisjZGVmaW5lIExERlNSCTB4MjEKKyNkZWZpbmUgU1QJMHgwNAorI2RlZmluZSBTVEEJMHgxNAorI2RlZmluZSBTVEIJMHgwNQorI2RlZmluZSBTVEJBCTB4MTUKKyNkZWZpbmUgU1RECTB4MDcKKyNkZWZpbmUgU1REQQkweDE3CisjZGVmaW5lIFNURgkweDI0CisjZGVmaW5lIFNUREZRCTB4MjYKKyNkZWZpbmUgU1RERgkweDI3CisjZGVmaW5lIFNURlNSCTB4MjUKKyNkZWZpbmUgU1RICTB4MDYKKyNkZWZpbmUgU1RIQQkweDE2CisjZGVmaW5lIFNXQVAJMHgwRgorI2RlZmluZSBTV0FQQQkweDFGCisjZGVmaW5lIEZMVVNICTB4M0IKKworI2RlZmluZSBTSUdOX0JJVCAweDgwMDAwMDAwCisKKy8qICMgb2YgY3ljbGVzIG92ZXJoZWFkIHdoZW4gYSB0cmFwIGlzIHRha2VuICovCisjZGVmaW5lIFRSQVBfQyAgMworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworCitzdGF0aWMgdWludDMyCXN1Yl9jYyBQQVJBTVMgKCh1aW50MzIgcHNyLCBpbnQzMiBvcGVyYW5kMSwgaW50MzIgb3BlcmFuZDIsCisJCQkJaW50MzIgcmVzdWx0KSk7CitzdGF0aWMgdWludDMyCWFkZF9jYyBQQVJBTVMgKCh1aW50MzIgcHNyLCBpbnQzMiBvcGVyYW5kMSwgaW50MzIgb3BlcmFuZDIsCisJCQkJaW50MzIgcmVzdWx0KSk7CitzdGF0aWMgdm9pZAlsb2dfY2MgUEFSQU1TICgoaW50MzIgcmVzdWx0LCBzdHJ1Y3QgcHN0YXRlICpzcmVncykpOworc3RhdGljIGludAlmcGV4ZWMgUEFSQU1TICgodWludDMyIG9wMywgdWludDMyIHJkLCB1aW50MzIgcnMxLCB1aW50MzIgcnMyLAorCQkJCXN0cnVjdCBwc3RhdGUgKnNyZWdzKSk7CitzdGF0aWMgaW50CWNoa19hc2kgUEFSQU1TICgoc3RydWN0IHBzdGF0ZSAqc3JlZ3MsIHVpbnQzMiAqYXNpLCB1aW50MzIgb3AzKSk7CisKKworZXh0ZXJuIHN0cnVjdCBlc3RhdGUgZWJhc2U7CitleHRlcm4gaW50MzIgICAgbmZwLGlmdDsKKworI2lmZGVmIEVSUklOSgorZXh0ZXJuIHVpbnQzMiBlcnJ0dCwgZXJyZnR0OworI2VuZGlmCisKK3N0YXRpYyB1aW50MzIKK3N1Yl9jYyhwc3IsIG9wZXJhbmQxLCBvcGVyYW5kMiwgcmVzdWx0KQorICAgIHVpbnQzMiAgICAgICAgICBwc3I7CisgICAgaW50MzIgICAgICAgICAgIG9wZXJhbmQxOworICAgIGludDMyICAgICAgICAgICBvcGVyYW5kMjsKKyAgICBpbnQzMiAgICAgICAgICAgcmVzdWx0OworeworICAgIHBzciA9ICgocHNyICYgflBTUl9OKSB8ICgocmVzdWx0ID4+IDgpICYgUFNSX04pKTsKKyAgICBpZiAocmVzdWx0KQorCXBzciAmPSB+UFNSX1o7CisgICAgZWxzZQorCXBzciB8PSBQU1JfWjsKKyAgICBwc3IgPSAocHNyICYgflBTUl9WKSB8ICgoKChvcGVyYW5kMSAmIH5vcGVyYW5kMiAmIH5yZXN1bHQpIHwKKwkJCSAgICh+b3BlcmFuZDEgJiBvcGVyYW5kMiAmIHJlc3VsdCkpID4+IDEwKSAmIFBTUl9WKTsKKyAgICBwc3IgPSAocHNyICYgflBTUl9DKSB8ICgoKCh+b3BlcmFuZDEgJiBvcGVyYW5kMikgfAorCQkJICgofm9wZXJhbmQxIHwgb3BlcmFuZDIpICYgcmVzdWx0KSkgPj4gMTEpICYgUFNSX0MpOworICAgIHJldHVybiAocHNyKTsKK30KKwordWludDMyCithZGRfY2MocHNyLCBvcGVyYW5kMSwgb3BlcmFuZDIsIHJlc3VsdCkKKyAgICB1aW50MzIgICAgICAgICAgcHNyOworICAgIGludDMyICAgICAgICAgICBvcGVyYW5kMTsKKyAgICBpbnQzMiAgICAgICAgICAgb3BlcmFuZDI7CisgICAgaW50MzIgICAgICAgICAgIHJlc3VsdDsKK3sKKyAgICBwc3IgPSAoKHBzciAmIH5QU1JfTikgfCAoKHJlc3VsdCA+PiA4KSAmIFBTUl9OKSk7CisgICAgaWYgKHJlc3VsdCkKKwlwc3IgJj0gflBTUl9aOworICAgIGVsc2UKKwlwc3IgfD0gUFNSX1o7CisgICAgcHNyID0gKHBzciAmIH5QU1JfVikgfCAoKCgob3BlcmFuZDEgJiBvcGVyYW5kMiAmIH5yZXN1bHQpIHwKKwkJCSAgKH5vcGVyYW5kMSAmIH5vcGVyYW5kMiAmIHJlc3VsdCkpID4+IDEwKSAmIFBTUl9WKTsKKyAgICBwc3IgPSAocHNyICYgflBTUl9DKSB8ICgoKChvcGVyYW5kMSAmIG9wZXJhbmQyKSB8CisJCQkgKChvcGVyYW5kMSB8IG9wZXJhbmQyKSAmIH5yZXN1bHQpKSA+PiAxMSkgJiBQU1JfQyk7CisgICAgcmV0dXJuKHBzcik7Cit9CisKK3N0YXRpYyB2b2lkCitsb2dfY2MocmVzdWx0LCBzcmVncykKKyAgICBpbnQzMiAgICAgICAgICAgcmVzdWx0OworICAgIHN0cnVjdCBwc3RhdGUgICpzcmVnczsKK3sKKyAgICBzcmVncy0+cHNyICY9IH4oUFNSX0NDKTsJLyogWmVybyBDQyBiaXRzICovCisgICAgc3JlZ3MtPnBzciA9IChzcmVncy0+cHNyIHwgKChyZXN1bHQgPj4gOCkgJiBQU1JfTikpOworICAgIGlmIChyZXN1bHQgPT0gMCkKKwlzcmVncy0+cHNyIHw9IFBTUl9aOworfQorCisvKiBBZGQgdHdvIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VycywgYW5kIGNhbGN1bGF0ZSB0aGUgY2Fycnkgb3V0LiAqLworCitzdGF0aWMgdWludDMyCithZGQzMiAodWludDMyIG4xLCB1aW50MzIgbjIsIGludCAqY2FycnkpCit7CisgIHVpbnQzMiByZXN1bHQgPSBuMSArIG4yOworCisgICpjYXJyeSA9IHJlc3VsdCA8IG4xIHx8IHJlc3VsdCA8IG4xOworICByZXR1cm4ocmVzdWx0KTsKK30KKworLyogTXVsdGlwbHkgdHdvIDMyLWJpdCBpbnRlZ2Vycy4gICovCisKK3N0YXRpYyB2b2lkCittdWw2NCAodWludDMyIG4xLCB1aW50MzIgbjIsIHVpbnQzMiAqcmVzdWx0X2hpLCB1aW50MzIgKnJlc3VsdF9sbywgaW50IG1zaWduZWQpCit7CisgIHVpbnQzMiBsbywgbWlkMSwgbWlkMiwgaGksIHJlZ19sbywgcmVnX2hpOworICBpbnQgY2Fycnk7CisgIGludCBzaWduID0gMDsKKworICAvKiBJZiB0aGlzIGlzIGEgc2lnbmVkIG11bHRpcGx5LCBjYWxjdWxhdGUgdGhlIHNpZ24gb2YgdGhlIHJlc3VsdAorICAgICBhbmQgbWFrZSB0aGUgb3BlcmFuZHMgcG9zaXRpdmUuICAqLworICBpZiAobXNpZ25lZCkKKyAgICB7CisgICAgICBzaWduID0gKG4xIF4gbjIpICYgU0lHTl9CSVQ7CisgICAgICBpZiAobjEgJiBTSUdOX0JJVCkKKwluMSA9IC1uMTsKKyAgICAgIGlmIChuMiAmIFNJR05fQklUKQorCW4yID0gLW4yOworICAgICAgCisgICAgfQorICAKKyAgLyogV2UgY2FuIHNwbGl0IHRoZSAzMngzMiBpbnRvIGZvdXIgMTZ4MTYgb3BlcmF0aW9ucy4gVGhpcyBlbnN1cmVzCisgICAgIHRoYXQgd2UgZG8gbm90IGxvc2UgcHJlY2lzaW9uIG9uIDMyYml0IG9ubHkgaG9zdHM6ICovCisgIGxvID0gICAoKG4xICYgMHhGRkZGKSAqIChuMiAmIDB4RkZGRikpOworICBtaWQxID0gKChuMSAmIDB4RkZGRikgKiAoKG4yID4+IDE2KSAmIDB4RkZGRikpOworICBtaWQyID0gKCgobjEgPj4gMTYpICYgMHhGRkZGKSAqIChuMiAmIDB4RkZGRikpOworICBoaSA9ICAgKCgobjEgPj4gMTYpICYgMHhGRkZGKSAqICgobjIgPj4gMTYpICYgMHhGRkZGKSk7CisgIAorICAvKiBXZSBub3cgbmVlZCB0byBhZGQgYWxsIG9mIHRoZXNlIHJlc3VsdHMgdG9nZXRoZXIsIHRha2luZyBjYXJlCisgICAgIHRvIHByb3BvZ2F0ZSB0aGUgY2FycmllcyBmcm9tIHRoZSBhZGRpdGlvbnM6ICovCisgIHJlZ19sbyA9IGFkZDMyIChsbywgKG1pZDEgPDwgMTYpLCAmY2FycnkpOworICByZWdfaGkgPSBjYXJyeTsKKyAgcmVnX2xvID0gYWRkMzIgKHJlZ19sbywgKG1pZDIgPDwgMTYpLCAmY2FycnkpOworICByZWdfaGkgKz0gKGNhcnJ5ICsgKChtaWQxID4+IDE2KSAmIDB4RkZGRikgKyAoKG1pZDIgPj4gMTYpICYgMHhGRkZGKSArIGhpKTsKKworICAvKiBOZWdhdGUgcmVzdWx0IGlmIG5lY2Vzc2FyeS4gKi8KKyAgaWYgKHNpZ24pCisgICAgeworICAgICAgcmVnX2hpID0gfiByZWdfaGk7CisgICAgICByZWdfbG8gPSAtIHJlZ19sbzsKKyAgICAgIGlmIChyZWdfbG8gPT0gMCkKKwlyZWdfaGkrKzsKKyAgICB9CisgIAorICAqcmVzdWx0X2xvID0gcmVnX2xvOworICAqcmVzdWx0X2hpID0gcmVnX2hpOworfQorCisKKy8qIERpdmlkZSBhIDY0LWJpdCBpbnRlZ2VyIGJ5IGEgMzItYml0IGludGVnZXIuICBXZSBjaGVhdCBhbmQgYXNzdW1lCisgICB0aGF0IHRoZSBob3N0IGNvbXBpbGVyIHN1cHBvcnRzIGxvbmcgbG9uZyBvcGVyYXRpb25zLiAgKi8KKworc3RhdGljIHZvaWQKK2RpdjY0ICh1aW50MzIgbjFfaGksIHVpbnQzMiBuMV9sb3csIHVpbnQzMiBuMiwgdWludDMyICpyZXN1bHQsIGludCBtc2lnbmVkKQoreworICB1aW50NjQgbjE7CisKKyAgbjEgPSAoKHVpbnQ2NCkgbjFfaGkpIDw8IDMyOworICBuMSB8PSAoKHVpbnQ2NCkgbjFfbG93KSAmIDB4ZmZmZmZmZmY7CisKKyAgaWYgKG1zaWduZWQpCisgICAgeworICAgICAgaW50NjQgbjFfcyA9IChpbnQ2NCkgbjE7CisgICAgICBpbnQzMiBuMl9zID0gKGludDMyKSBuMjsKKyAgICAgIG4xX3MgPSBuMV9zIC8gbjJfczsKKyAgICAgIG4xID0gKHVpbnQ2NCkgbjFfczsKKyAgICB9CisgIGVsc2UKKyAgICBuMSA9IG4xIC8gbjI7CisKKyAgKnJlc3VsdCA9ICh1aW50MzIpIChuMSAmIDB4ZmZmZmZmZmYpOworfQorCisKK2ludAorZGlzcGF0Y2hfaW5zdHJ1Y3Rpb24oc3JlZ3MpCisgICAgc3RydWN0IHBzdGF0ZSAgKnNyZWdzOworeworCisgICAgdWludDMyICAgICAgICAgIGN3cCwgb3AsIG9wMiwgb3AzLCBhc2ksIHJkLCBjb25kLCByczEsCisgICAgICAgICAgICAgICAgICAgIHJzMjsKKyAgICB1aW50MzIgICAgICAgICAgbGRlcCwgaWNjOworICAgIGludDMyICAgICAgICAgICBvcGVyYW5kMSwgb3BlcmFuZDIsICpyZGQsIHJlc3VsdCwgZWljYywKKyAgICAgICAgICAgICAgICAgICAgbmV3X2N3cDsKKyAgICBpbnQzMiAgICAgICAgICAgcGMsIG5wYywgZGF0YSwgYWRkcmVzcywgd3MsIG1leGMsIGZjYzsKKyAgICBpbnQzMgkgICAgZGRhdGFbMl07CisKKyAgICBzcmVncy0+bmluc3QrKzsKKyAgICBjd3AgPSAoKHNyZWdzLT5wc3IgJiBQU1JfQ1dQKSA8PCA0KTsKKyAgICBvcCA9IHNyZWdzLT5pbnN0ID4+IDMwOworICAgIHBjID0gc3JlZ3MtPm5wYzsKKyAgICBucGMgPSBzcmVncy0+bnBjICsgNDsKKyAgICBvcDMgPSByZCA9IHJzMSA9IG9wZXJhbmQyID0gZWljYyA9IDA7CisgICAgcmRkID0gMDsKKyAgICBpZiAob3AgJiAyKSB7CisKKwlvcDMgPSAoc3JlZ3MtPmluc3QgPj4gMTkpICYgMHgzZjsKKwlyczEgPSAoc3JlZ3MtPmluc3QgPj4gMTQpICYgMHgxZjsKKwlyZCA9IChzcmVncy0+aW5zdCA+PiAyNSkgJiAweDFmOworCisjaWZkZWYgTE9BRF9ERUwKKworCS8qIENoZWNrIGlmIGxvYWQgZGVwZW5kZWN5IGlzIHBvc3NpYmxlICovCisJaWYgKGViYXNlLnNpbXRpbWUgPD0gc3JlZ3MtPmlsZHRpbWUpCisJICAgIGxkZXAgPSAoKChvcDMgJiAweDM4KSAhPSAweDI4KSAmJiAoKG9wMyAmIDB4M2UpICE9IDB4MzQpICYmIChzcmVncy0+aWxkcmVnICE9IDApKTsKKyAgICAgICAgZWxzZQorCSAgICBsZGVwID0gMDsKKwlpZiAoc3JlZ3MtPmluc3QgJiBJTlNUX0kpIHsKKwkgICAgaWYgKGxkZXAgJiYgKHNyZWdzLT5pbGRyZWcgPT0gcnMxKSkKKwkJc3JlZ3MtPmhvbGQrKzsKKwkgICAgb3BlcmFuZDIgPSBzcmVncy0+aW5zdDsKKwkgICAgb3BlcmFuZDIgPSAoKG9wZXJhbmQyIDw8IDE5KSA+PiAxOSk7CS8qIHNpZ24gZXh0ZW5kICovCisJfSBlbHNlIHsKKwkgICAgcnMyID0gc3JlZ3MtPmluc3QgJiBJTlNUX1JTMjsKKwkgICAgaWYgKHJzMiA+IDcpCisJCW9wZXJhbmQyID0gc3JlZ3MtPnJbKGN3cCArIHJzMikgJiAweDdmXTsKKwkgICAgZWxzZQorCQlvcGVyYW5kMiA9IHNyZWdzLT5nW3JzMl07CisJICAgIGlmIChsZGVwICYmICgoc3JlZ3MtPmlsZHJlZyA9PSByczEpIHx8IChzcmVncy0+aWxkcmVnID09IHJzMikpKQorCQlzcmVncy0+aG9sZCsrOworCX0KKyNlbHNlCisJaWYgKHNyZWdzLT5pbnN0ICYgSU5TVF9JKSB7CisJICAgIG9wZXJhbmQyID0gc3JlZ3MtPmluc3Q7CisJICAgIG9wZXJhbmQyID0gKChvcGVyYW5kMiA8PCAxOSkgPj4gMTkpOwkvKiBzaWduIGV4dGVuZCAqLworCX0gZWxzZSB7CisJICAgIHJzMiA9IHNyZWdzLT5pbnN0ICYgSU5TVF9SUzI7CisJICAgIGlmIChyczIgPiA3KQorCQlvcGVyYW5kMiA9IHNyZWdzLT5yWyhjd3AgKyByczIpICYgMHg3Zl07CisJICAgIGVsc2UKKwkJb3BlcmFuZDIgPSBzcmVncy0+Z1tyczJdOworCX0KKyNlbmRpZgorCisJaWYgKHJkID4gNykKKwkgICAgcmRkID0gJihzcmVncy0+clsoY3dwICsgcmQpICYgMHg3Zl0pOworCWVsc2UKKwkgICAgcmRkID0gJihzcmVncy0+Z1tyZF0pOworCWlmIChyczEgPiA3KQorCSAgICByczEgPSBzcmVncy0+clsoY3dwICsgcnMxKSAmIDB4N2ZdOworCWVsc2UKKwkgICAgcnMxID0gc3JlZ3MtPmdbcnMxXTsKKyAgICB9CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgMDoKKwlvcDIgPSAoc3JlZ3MtPmluc3QgPj4gMjIpICYgMHg3OworCXN3aXRjaCAob3AyKSB7CisJY2FzZSBTRVRISToKKwkgICAgcmQgPSAoc3JlZ3MtPmluc3QgPj4gMjUpICYgMHgxZjsKKwkgICAgaWYgKHJkID4gNykKKwkJcmRkID0gJihzcmVncy0+clsoY3dwICsgcmQpICYgMHg3Zl0pOworCSAgICBlbHNlCisJCXJkZCA9ICYoc3JlZ3MtPmdbcmRdKTsKKwkgICAgKnJkZCA9IHNyZWdzLT5pbnN0IDw8IDEwOworCSAgICBicmVhazsKKwljYXNlIEJJQ0M6CisjaWZkZWYgU1RBVAorCSAgICBzcmVncy0+bmJyYW5jaCsrOworI2VuZGlmCisJICAgIGljYyA9IHNyZWdzLT5wc3IgPj4gMjA7CisJICAgIGNvbmQgPSAoKHNyZWdzLT5pbnN0ID4+IDI1KSAmIDB4MGYpOworCSAgICBzd2l0Y2ggKGNvbmQpIHsKKwkgICAgY2FzZSBCSUNDX0JOOgorCQllaWNjID0gMDsKKwkJYnJlYWs7CisJICAgIGNhc2UgQklDQ19CRToKKwkJZWljYyA9IElDQ19aOworCQlicmVhazsKKwkgICAgY2FzZSBCSUNDX0JMRToKKwkJZWljYyA9IElDQ19aIHwgKElDQ19OIF4gSUNDX1YpOworCQlicmVhazsKKwkgICAgY2FzZSBCSUNDX0JMOgorCQllaWNjID0gKElDQ19OIF4gSUNDX1YpOworCQlicmVhazsKKwkgICAgY2FzZSBCSUNDX0JMRVU6CisJCWVpY2MgPSBJQ0NfQyB8IElDQ19aOworCQlicmVhazsKKwkgICAgY2FzZSBCSUNDX0JDUzoKKwkJZWljYyA9IElDQ19DOworCQlicmVhazsKKwkgICAgY2FzZSBCSUNDX05FRzoKKwkJZWljYyA9IElDQ19OOworCQlicmVhazsKKwkgICAgY2FzZSBCSUNDX0JWUzoKKwkJZWljYyA9IElDQ19WOworCQlicmVhazsKKwkgICAgY2FzZSBCSUNDX0JBOgorCQllaWNjID0gMTsKKwkJaWYgKHNyZWdzLT5pbnN0ICYgMHgyMDAwMDAwMCkKKwkJICAgIHNyZWdzLT5hbm51bCA9IDE7CisJCWJyZWFrOworCSAgICBjYXNlIEJJQ0NfQk5FOgorCQllaWNjID0gfihJQ0NfWik7CisJCWJyZWFrOworCSAgICBjYXNlIEJJQ0NfQkc6CisJCWVpY2MgPSB+KElDQ19aIHwgKElDQ19OIF4gSUNDX1YpKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgQklDQ19CR0U6CisJCWVpY2MgPSB+KElDQ19OIF4gSUNDX1YpOworCQlicmVhazsKKwkgICAgY2FzZSBCSUNDX0JHVToKKwkJZWljYyA9IH4oSUNDX0MgfCBJQ0NfWik7CisJCWJyZWFrOworCSAgICBjYXNlIEJJQ0NfQkNDOgorCQllaWNjID0gfihJQ0NfQyk7CisJCWJyZWFrOworCSAgICBjYXNlIEJJQ0NfUE9TOgorCQllaWNjID0gfihJQ0NfTik7CisJCWJyZWFrOworCSAgICBjYXNlIEJJQ0NfQlZDOgorCQllaWNjID0gfihJQ0NfVik7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmIChlaWNjICYgMSkgeworCQlvcGVyYW5kMSA9IHNyZWdzLT5pbnN0OworCQlvcGVyYW5kMSA9ICgob3BlcmFuZDEgPDwgMTApID4+IDgpOwkvKiBzaWduIGV4dGVuZCAqLworCQlucGMgPSBzcmVncy0+cGMgKyBvcGVyYW5kMTsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKHNyZWdzLT5pbnN0ICYgMHgyMDAwMDAwMCkKKwkJICAgIHNyZWdzLT5hbm51bCA9IDE7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBGUEJDQzoKKyNpZmRlZiBTVEFUCisJICAgIHNyZWdzLT5uYnJhbmNoKys7CisjZW5kaWYKKwkgICAgaWYgKCEoKHNyZWdzLT5wc3IgJiBQU1JfRUYpICYmIEZQX1BSRVMpKSB7CisJCXNyZWdzLT50cmFwID0gVFJBUF9GUERJUzsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKGViYXNlLnNpbXRpbWUgPCBzcmVncy0+ZnRpbWUpIHsKKwkJc3JlZ3MtPmZ0aW1lID0gZWJhc2Uuc2ltdGltZSArIHNyZWdzLT5ob2xkOworCSAgICB9CisJICAgIGNvbmQgPSAoKHNyZWdzLT5pbnN0ID4+IDI1KSAmIDB4MGYpOworCSAgICBmY2MgPSAoc3JlZ3MtPmZzciA+PiAxMCkgJiAweDM7CisJICAgIHN3aXRjaCAoY29uZCkgeworCSAgICBjYXNlIEZCTjoKKwkJZWljYyA9IDA7CisJCWJyZWFrOworCSAgICBjYXNlIEZCTkU6CisJCWVpY2MgPSAoZmNjICE9IEZDQ19FKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgRkJMRzoKKwkJZWljYyA9IChmY2MgPT0gRkNDX0wpIHx8IChmY2MgPT0gRkNDX0cpOworCQlicmVhazsKKwkgICAgY2FzZSBGQlVMOgorCQllaWNjID0gKGZjYyA9PSBGQ0NfTCkgfHwgKGZjYyA9PSBGQ0NfVSk7CisJCWJyZWFrOworCSAgICBjYXNlIEZCTDoKKwkJZWljYyA9IChmY2MgPT0gRkNDX0wpOworCQlicmVhazsKKwkgICAgY2FzZSBGQlVHOgorCQllaWNjID0gKGZjYyA9PSBGQ0NfRykgfHwgKGZjYyA9PSBGQ0NfVSk7CisJCWJyZWFrOworCSAgICBjYXNlIEZCRzoKKwkJZWljYyA9IChmY2MgPT0gRkNDX0cpOworCQlicmVhazsKKwkgICAgY2FzZSBGQlU6CisJCWVpY2MgPSAoZmNjID09IEZDQ19VKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgRkJBOgorCQllaWNjID0gMTsKKwkJaWYgKHNyZWdzLT5pbnN0ICYgMHgyMDAwMDAwMCkKKwkJICAgIHNyZWdzLT5hbm51bCA9IDE7CisJCWJyZWFrOworCSAgICBjYXNlIEZCRToKKwkJZWljYyA9ICEoZmNjICE9IEZDQ19FKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgRkJVRToKKwkJZWljYyA9ICEoKGZjYyA9PSBGQ0NfTCkgfHwgKGZjYyA9PSBGQ0NfRykpOworCQlicmVhazsKKwkgICAgY2FzZSBGQkdFOgorCQllaWNjID0gISgoZmNjID09IEZDQ19MKSB8fCAoZmNjID09IEZDQ19VKSk7CisJCWJyZWFrOworCSAgICBjYXNlIEZCVUdFOgorCQllaWNjID0gIShmY2MgPT0gRkNDX0wpOworCQlicmVhazsKKwkgICAgY2FzZSBGQkxFOgorCQllaWNjID0gISgoZmNjID09IEZDQ19HKSB8fCAoZmNjID09IEZDQ19VKSk7CisJCWJyZWFrOworCSAgICBjYXNlIEZCVUxFOgorCQllaWNjID0gIShmY2MgPT0gRkNDX0cpOworCQlicmVhazsKKwkgICAgY2FzZSBGQk86CisJCWVpY2MgPSAhKGZjYyA9PSBGQ0NfVSk7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmIChlaWNjKSB7CisJCW9wZXJhbmQxID0gc3JlZ3MtPmluc3Q7CisJCW9wZXJhbmQxID0gKChvcGVyYW5kMSA8PCAxMCkgPj4gOCk7CS8qIHNpZ24gZXh0ZW5kICovCisJCW5wYyA9IHNyZWdzLT5wYyArIG9wZXJhbmQxOworCSAgICB9IGVsc2UgeworCQlpZiAoc3JlZ3MtPmluc3QgJiAweDIwMDAwMDAwKQorCQkgICAgc3JlZ3MtPmFubnVsID0gMTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIHNyZWdzLT50cmFwID0gVFJBUF9VTklNUDsKKwkgICAgYnJlYWs7CisJfQorCWJyZWFrOworICAgIGNhc2UgMToJCQkvKiBDQUxMICovCisjaWZkZWYgU1RBVAorCXNyZWdzLT5uYnJhbmNoKys7CisjZW5kaWYKKwlzcmVncy0+clsoY3dwICsgMTUpICYgMHg3Zl0gPSBzcmVncy0+cGM7CisJbnBjID0gc3JlZ3MtPnBjICsgKHNyZWdzLT5pbnN0IDw8IDIpOworCWJyZWFrOworCisgICAgY2FzZSAyOgorCWlmICgob3AzID4+IDEpID09IDB4MWEpIHsKKwkgICAgaWYgKCEoKHNyZWdzLT5wc3IgJiBQU1JfRUYpICYmIEZQX1BSRVMpKSB7CisJCXNyZWdzLT50cmFwID0gVFJBUF9GUERJUzsKKwkgICAgfSBlbHNlIHsKKwkJcnMxID0gKHNyZWdzLT5pbnN0ID4+IDE0KSAmIDB4MWY7CisJCXJzMiA9IHNyZWdzLT5pbnN0ICYgMHgxZjsKKwkJc3JlZ3MtPnRyYXAgPSBmcGV4ZWMob3AzLCByZCwgcnMxLCByczIsIHNyZWdzKTsKKwkgICAgfQorCX0gZWxzZSB7CisKKwkgICAgc3dpdGNoIChvcDMpIHsKKwkgICAgY2FzZSBUSUNDOgorCSAgICAgICAgaWNjID0gc3JlZ3MtPnBzciA+PiAyMDsKKwkgICAgICAgIGNvbmQgPSAoKHNyZWdzLT5pbnN0ID4+IDI1KSAmIDB4MGYpOworCSAgICAgICAgc3dpdGNoIChjb25kKSB7CisJCWNhc2UgQklDQ19CTjoKKwkJICAgIGVpY2MgPSAwOworCQkgICAgYnJlYWs7CisJCWNhc2UgQklDQ19CRToKKwkJICAgIGVpY2MgPSBJQ0NfWjsKKwkJICAgIGJyZWFrOworCQljYXNlIEJJQ0NfQkxFOgorCQkgICAgZWljYyA9IElDQ19aIHwgKElDQ19OIF4gSUNDX1YpOworCQkgICAgYnJlYWs7CisJCWNhc2UgQklDQ19CTDoKKwkJICAgIGVpY2MgPSAoSUNDX04gXiBJQ0NfVik7CisJCSAgICBicmVhazsKKwkJY2FzZSBCSUNDX0JMRVU6CisJCSAgICBlaWNjID0gSUNDX0MgfCBJQ0NfWjsKKwkJICAgIGJyZWFrOworCQljYXNlIEJJQ0NfQkNTOgorCQkgICAgZWljYyA9IElDQ19DOworCQkgICAgYnJlYWs7CisJCWNhc2UgQklDQ19ORUc6CisJCSAgICBlaWNjID0gSUNDX047CisJCSAgICBicmVhazsKKwkJY2FzZSBCSUNDX0JWUzoKKwkJICAgIGVpY2MgPSBJQ0NfVjsKKwkJICAgIGJyZWFrOworCSAgICAgICAgY2FzZSBCSUNDX0JBOgorCQkgICAgZWljYyA9IDE7CisJCSAgICBicmVhazsKKwkgICAgICAgIGNhc2UgQklDQ19CTkU6CisJCSAgICBlaWNjID0gfihJQ0NfWik7CisJCSAgICBicmVhazsKKwkgICAgICAgIGNhc2UgQklDQ19CRzoKKwkJICAgIGVpY2MgPSB+KElDQ19aIHwgKElDQ19OIF4gSUNDX1YpKTsKKwkJICAgIGJyZWFrOworCSAgICAgICAgY2FzZSBCSUNDX0JHRToKKwkJICAgIGVpY2MgPSB+KElDQ19OIF4gSUNDX1YpOworCQkgICAgYnJlYWs7CisJICAgICAgICBjYXNlIEJJQ0NfQkdVOgorCQkgICAgZWljYyA9IH4oSUNDX0MgfCBJQ0NfWik7CisJCSAgICBicmVhazsKKwkgICAgICAgIGNhc2UgQklDQ19CQ0M6CisJCSAgICBlaWNjID0gfihJQ0NfQyk7CisJCSAgICBicmVhazsKKwkgICAgICAgIGNhc2UgQklDQ19QT1M6CisJCSAgICBlaWNjID0gfihJQ0NfTik7CisJCSAgICBicmVhazsKKwkgICAgICAgIGNhc2UgQklDQ19CVkM6CisJCSAgICBlaWNjID0gfihJQ0NfVik7CisJCSAgICBicmVhazsKKwkJfQorCQlpZiAoZWljYyAmIDEpIHsKKwkJICAgIHNyZWdzLT50cmFwID0gKDB4ODAgfCAoKHJzMSArIG9wZXJhbmQyKSAmIDB4N2YpKTsKKwkJfQorCQlicmVhazsKKworCSAgICBjYXNlIE1VTFNjYzoKKwkJb3BlcmFuZDEgPQorCQkgICAgKCgoc3JlZ3MtPnBzciAmIFBTUl9WKSBeICgoc3JlZ3MtPnBzciAmIFBTUl9OKSA+PiAyKSkKKwkJICAgICA8PCAxMCkgfCAocnMxID4+IDEpOworCQlpZiAoKHNyZWdzLT55ICYgMSkgPT0gMCkKKwkJICAgIG9wZXJhbmQyID0gMDsKKwkJKnJkZCA9IG9wZXJhbmQxICsgb3BlcmFuZDI7CisJCXNyZWdzLT55ID0gKHJzMSA8PCAzMSkgfCAoc3JlZ3MtPnkgPj4gMSk7CisJCXNyZWdzLT5wc3IgPSBhZGRfY2Moc3JlZ3MtPnBzciwgb3BlcmFuZDEsIG9wZXJhbmQyLCAqcmRkKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgRElWU2NjOgorCQl7CisJCSAgaW50IHNpZ247CisJCSAgdWludDMyIHJlc3VsdCwgcmVtYWluZGVyOworCQkgIGludCBjMCwgeTMxOworCisJCSAgaWYgKCFzcGFyY2xpdGUpIHsKKwkJICAgICBzcmVncy0+dHJhcCA9IFRSQVBfVU5JTVA7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJICB9CisKKwkJICBzaWduID0gKChzcmVncy0+cHNyICYgUFNSX1YpICE9IDApIF4gKChzcmVncy0+cHNyICYgUFNSX04pICE9IDApOworCisJCSAgcmVtYWluZGVyID0gKHNyZWdzLT55IDw8IDEpIHwgKHJzMSA+PiAzMSk7CisKKwkJICAvKiBJZiB0cnVlIHNpZ24gaXMgcG9zaXRpdmUsIGNhbGN1bGF0ZSByZW1haW5kZXIgLSBkaXZpc29yLgorCQkgICAgIE90aGVyd2lzZSwgY2FsY3VsYXRlIHJlbWFpbmRlciArIGRpdmlzb3IuICAqLworCQkgIGlmIChzaWduID09IDApCisJCSAgICBvcGVyYW5kMiA9IH5vcGVyYW5kMiArIDE7CisJCSAgcmVzdWx0ID0gcmVtYWluZGVyICsgb3BlcmFuZDI7CisKKwkJICAvKiBUaGUgU1BBUkNsaXRlIFVzZXIncyBNYW51YWwgaXMgbm90IGNsZWFyIG9uIGhvdworCQkgICAgIHRoZSAiY2Fycnkgb3V0IiBvZiB0aGUgYWJvdmUgQUxVIG9wZXJhdGlvbiBpcyB0bworCQkgICAgIGJlIGNhbGN1bGF0ZWQuICBGcm9tIHRyaWFsIGFuZCBlcnJvciB0ZXN0cworCQkgICAgIG9uIHRoZSB0aGUgY2hpcCBpdHNlbGYsIGl0IGFwcGVhcnMgdGhhdCBpdCBpcworCQkgICAgIGEgbm9ybWFsIGFkZGl0aW9uIGNhcnJ5LCBhbmQgbm90IGEgc3VidHJhY3Rpb24gYm9ycm93LAorCQkgICAgIGV2ZW4gaW4gY2FzZXMgd2hlcmUgdGhlIGRpdmlzb3IgaXMgc3VidHJhY3RlZAorCQkgICAgIGZyb20gdGhlIHJlbWFpbmRlci4gIEZJWE1FOiBnZXQgdGhlIHRydWUgc3RvcnkKKwkJICAgICBmcm9tIEZ1aml0c3UuICovCisJCSAgYzAgPSByZXN1bHQgPCAodWludDMyKSByZW1haW5kZXIKKwkJICAgICAgIHx8IHJlc3VsdCA8ICh1aW50MzIpIG9wZXJhbmQyOworCisJCSAgaWYgKHJlc3VsdCAmIDB4ODAwMDAwMDApCisJCSAgICBzcmVncy0+cHNyIHw9IFBTUl9OOworCQkgIGVsc2UKKwkJICAgIHNyZWdzLT5wc3IgJj0gflBTUl9OOworCisJCSAgeTMxID0gKHNyZWdzLT55ICYgMHg4MDAwMDAwMCkgPT0gMHg4MDAwMDAwMDsKKworCQkgIGlmIChyZXN1bHQgPT0gMCAmJiBzaWduID09IHkzMSkKKwkJICAgIHNyZWdzLT5wc3IgfD0gUFNSX1o7CisJCSAgZWxzZQorCQkgICAgc3JlZ3MtPnBzciAmPSB+UFNSX1o7CisKKwkJICBzaWduID0gKHNpZ24gJiYgIXkzMSkgfHwgKCFjMCAmJiAoc2lnbiB8fCAheTMxKSk7CisKKwkJICBpZiAoc2lnbiBeIChyZXN1bHQgPj4gMzEpKQorCQkgICAgc3JlZ3MtPnBzciB8PSBQU1JfVjsKKwkJICBlbHNlCisJCSAgICBzcmVncy0+cHNyICY9IH5QU1JfVjsKKworCQkgIGlmICghc2lnbikKKwkJICAgIHNyZWdzLT5wc3IgfD0gUFNSX0M7CisJCSAgZWxzZQorCQkgICAgc3JlZ3MtPnBzciAmPSB+UFNSX0M7CisKKwkJICBzcmVncy0+eSA9IHJlc3VsdDsKKworCQkgIGlmIChyZCAhPSAwKQorCQkgICAgKnJkZCA9IChyczEgPDwgMSkgfCAhc2lnbjsKKwkJfQorCQlicmVhazsKKwkgICAgY2FzZSBTTVVMOgorCQl7CisJCSAgbXVsNjQgKHJzMSwgb3BlcmFuZDIsICZzcmVncy0+eSwgcmRkLCAxKTsKKwkJfQorCQlicmVhazsKKwkgICAgY2FzZSBTTVVMQ0M6CisJCXsKKwkJICB1aW50MzIgcmVzdWx0OworCisJCSAgbXVsNjQgKHJzMSwgb3BlcmFuZDIsICZzcmVncy0+eSwgJnJlc3VsdCwgMSk7CisKKwkJICBpZiAocmVzdWx0ICYgMHg4MDAwMDAwMCkKKwkJICAgIHNyZWdzLT5wc3IgfD0gUFNSX047CisJCSAgZWxzZQorCQkgICAgc3JlZ3MtPnBzciAmPSB+UFNSX047CisKKwkJICBpZiAocmVzdWx0ID09IDApCisJCSAgICBzcmVncy0+cHNyIHw9IFBTUl9aOworCQkgIGVsc2UKKwkJICAgIHNyZWdzLT5wc3IgJj0gflBTUl9aOworCisJCSAgKnJkZCA9IHJlc3VsdDsKKwkJfQorCQlicmVhazsKKwkgICAgY2FzZSBVTVVMOgorCQl7CisJCSAgbXVsNjQgKHJzMSwgb3BlcmFuZDIsICZzcmVncy0+eSwgcmRkLCAwKTsKKwkJfQorCQlicmVhazsKKwkgICAgY2FzZSBVTVVMQ0M6CisJCXsKKwkJICB1aW50MzIgcmVzdWx0OworCisJCSAgbXVsNjQgKHJzMSwgb3BlcmFuZDIsICZzcmVncy0+eSwgJnJlc3VsdCwgMCk7CisKKwkJICBpZiAocmVzdWx0ICYgMHg4MDAwMDAwMCkKKwkJICAgIHNyZWdzLT5wc3IgfD0gUFNSX047CisJCSAgZWxzZQorCQkgICAgc3JlZ3MtPnBzciAmPSB+UFNSX047CisKKwkJICBpZiAocmVzdWx0ID09IDApCisJCSAgICBzcmVncy0+cHNyIHw9IFBTUl9aOworCQkgIGVsc2UKKwkJICAgIHNyZWdzLT5wc3IgJj0gflBTUl9aOworCisJCSAgKnJkZCA9IHJlc3VsdDsKKwkJfQorCQlicmVhazsKKwkgICAgY2FzZSBTRElWOgorCQl7CisJCSAgaWYgKHNwYXJjbGl0ZSkgeworCQkgICAgIHNyZWdzLT50cmFwID0gVFJBUF9VTklNUDsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkgIH0KKworCQkgIGlmIChvcGVyYW5kMiA9PSAwKSB7CisJCSAgICBzcmVncy0+dHJhcCA9IFRSQVBfRElWMDsKKwkJICAgIGJyZWFrOworCQkgIH0KKworCQkgIGRpdjY0IChzcmVncy0+eSwgcnMxLCBvcGVyYW5kMiwgcmRkLCAxKTsKKwkJfQorCQlicmVhazsKKwkgICAgY2FzZSBTRElWQ0M6CisJCXsKKwkJICB1aW50MzIgcmVzdWx0OworCisJCSAgaWYgKHNwYXJjbGl0ZSkgeworCQkgICAgIHNyZWdzLT50cmFwID0gVFJBUF9VTklNUDsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkgIH0KKworCQkgIGlmIChvcGVyYW5kMiA9PSAwKSB7CisJCSAgICBzcmVncy0+dHJhcCA9IFRSQVBfRElWMDsKKwkJICAgIGJyZWFrOworCQkgIH0KKworCQkgIGRpdjY0IChzcmVncy0+eSwgcnMxLCBvcGVyYW5kMiwgJnJlc3VsdCwgMSk7CisKKwkJICBpZiAocmVzdWx0ICYgMHg4MDAwMDAwMCkKKwkJICAgIHNyZWdzLT5wc3IgfD0gUFNSX047CisJCSAgZWxzZQorCQkgICAgc3JlZ3MtPnBzciAmPSB+UFNSX047CisKKwkJICBpZiAocmVzdWx0ID09IDApCisJCSAgICBzcmVncy0+cHNyIHw9IFBTUl9aOworCQkgIGVsc2UKKwkJICAgIHNyZWdzLT5wc3IgJj0gflBTUl9aOworCisJCSAgLyogRklYTUU6IHNob3VsZCBzZXQgb3ZlcmZsb3cgZmxhZyBjb3JyZWN0bHkuICAqLworCQkgIHNyZWdzLT5wc3IgJj0gfihQU1JfQyB8IFBTUl9WKTsKKworCQkgICpyZGQgPSByZXN1bHQ7CisJCX0KKwkJYnJlYWs7CisJICAgIGNhc2UgVURJVjoKKwkJeworCQkgIGlmIChzcGFyY2xpdGUpIHsKKwkJICAgICBzcmVncy0+dHJhcCA9IFRSQVBfVU5JTVA7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJICB9CisKKwkJICBpZiAob3BlcmFuZDIgPT0gMCkgeworCQkgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX0RJVjA7CisJCSAgICBicmVhazsKKwkJICB9CisKKwkJICBkaXY2NCAoc3JlZ3MtPnksIHJzMSwgb3BlcmFuZDIsIHJkZCwgMCk7CisJCX0KKwkJYnJlYWs7CisJICAgIGNhc2UgVURJVkNDOgorCQl7CisJCSAgdWludDMyIHJlc3VsdDsKKworCQkgIGlmIChzcGFyY2xpdGUpIHsKKwkJICAgICBzcmVncy0+dHJhcCA9IFRSQVBfVU5JTVA7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJICB9CisKKwkJICBpZiAob3BlcmFuZDIgPT0gMCkgeworCQkgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX0RJVjA7CisJCSAgICBicmVhazsKKwkJICB9CisKKwkJICBkaXY2NCAoc3JlZ3MtPnksIHJzMSwgb3BlcmFuZDIsICZyZXN1bHQsIDApOworCisJCSAgaWYgKHJlc3VsdCAmIDB4ODAwMDAwMDApCisJCSAgICBzcmVncy0+cHNyIHw9IFBTUl9OOworCQkgIGVsc2UKKwkJICAgIHNyZWdzLT5wc3IgJj0gflBTUl9OOworCisJCSAgaWYgKHJlc3VsdCA9PSAwKQorCQkgICAgc3JlZ3MtPnBzciB8PSBQU1JfWjsKKwkJICBlbHNlCisJCSAgICBzcmVncy0+cHNyICY9IH5QU1JfWjsKKworCQkgIC8qIEZJWE1FOiBzaG91bGQgc2V0IG92ZXJmbG93IGZsYWcgY29ycmVjdGx5LiAgKi8KKwkJICBzcmVncy0+cHNyICY9IH4oUFNSX0MgfCBQU1JfVik7CisKKwkJICAqcmRkID0gcmVzdWx0OworCQl9CisJCWJyZWFrOworCSAgICBjYXNlIElYTk9SOgorCQkqcmRkID0gcnMxIF4gfm9wZXJhbmQyOworCQlicmVhazsKKwkgICAgY2FzZSBJWE5PUkNDOgorCQkqcmRkID0gcnMxIF4gfm9wZXJhbmQyOworCQlsb2dfY2MoKnJkZCwgc3JlZ3MpOworCQlicmVhazsKKwkgICAgY2FzZSBJWE9SOgorCQkqcmRkID0gcnMxIF4gb3BlcmFuZDI7CisJCWJyZWFrOworCSAgICBjYXNlIElYT1JDQzoKKwkJKnJkZCA9IHJzMSBeIG9wZXJhbmQyOworCQlsb2dfY2MoKnJkZCwgc3JlZ3MpOworCQlicmVhazsKKwkgICAgY2FzZSBJT1I6CisJCSpyZGQgPSByczEgfCBvcGVyYW5kMjsKKwkJYnJlYWs7CisJICAgIGNhc2UgSU9SQ0M6CisJCSpyZGQgPSByczEgfCBvcGVyYW5kMjsKKwkJbG9nX2NjKCpyZGQsIHNyZWdzKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgSU9STjoKKwkJKnJkZCA9IHJzMSB8IH5vcGVyYW5kMjsKKwkJYnJlYWs7CisJICAgIGNhc2UgSU9STkNDOgorCQkqcmRkID0gcnMxIHwgfm9wZXJhbmQyOworCQlsb2dfY2MoKnJkZCwgc3JlZ3MpOworCQlicmVhazsKKwkgICAgY2FzZSBJQU5ETkNDOgorCQkqcmRkID0gcnMxICYgfm9wZXJhbmQyOworCQlsb2dfY2MoKnJkZCwgc3JlZ3MpOworCQlicmVhazsKKwkgICAgY2FzZSBJQU5ETjoKKwkJKnJkZCA9IHJzMSAmIH5vcGVyYW5kMjsKKwkJYnJlYWs7CisJICAgIGNhc2UgSUFORDoKKwkJKnJkZCA9IHJzMSAmIG9wZXJhbmQyOworCQlicmVhazsKKwkgICAgY2FzZSBJQU5EQ0M6CisJCSpyZGQgPSByczEgJiBvcGVyYW5kMjsKKwkJbG9nX2NjKCpyZGQsIHNyZWdzKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgU1VCOgorCQkqcmRkID0gcnMxIC0gb3BlcmFuZDI7CisJCWJyZWFrOworCSAgICBjYXNlIFNVQkNDOgorCQkqcmRkID0gcnMxIC0gb3BlcmFuZDI7CisJCXNyZWdzLT5wc3IgPSBzdWJfY2Moc3JlZ3MtPnBzciwgcnMxLCBvcGVyYW5kMiwgKnJkZCk7CisJCWJyZWFrOworCSAgICBjYXNlIFNVQlg6CisJCSpyZGQgPSByczEgLSBvcGVyYW5kMiAtICgoc3JlZ3MtPnBzciA+PiAyMCkgJiAxKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgU1VCWENDOgorCQkqcmRkID0gcnMxIC0gb3BlcmFuZDIgLSAoKHNyZWdzLT5wc3IgPj4gMjApICYgMSk7CisJCXNyZWdzLT5wc3IgPSBzdWJfY2Moc3JlZ3MtPnBzciwgcnMxLCBvcGVyYW5kMiwgKnJkZCk7CisJCWJyZWFrOworCSAgICBjYXNlIEFERDoKKwkJKnJkZCA9IHJzMSArIG9wZXJhbmQyOworCQlicmVhazsKKwkgICAgY2FzZSBBRERDQzoKKwkJKnJkZCA9IHJzMSArIG9wZXJhbmQyOworCQlzcmVncy0+cHNyID0gYWRkX2NjKHNyZWdzLT5wc3IsIHJzMSwgb3BlcmFuZDIsICpyZGQpOworCQlicmVhazsKKwkgICAgY2FzZSBBRERYOgorCQkqcmRkID0gcnMxICsgb3BlcmFuZDIgKyAoKHNyZWdzLT5wc3IgPj4gMjApICYgMSk7CisJCWJyZWFrOworCSAgICBjYXNlIEFERFhDQzoKKwkJKnJkZCA9IHJzMSArIG9wZXJhbmQyICsgKChzcmVncy0+cHNyID4+IDIwKSAmIDEpOworCQlzcmVncy0+cHNyID0gYWRkX2NjKHNyZWdzLT5wc3IsIHJzMSwgb3BlcmFuZDIsICpyZGQpOworCQlicmVhazsKKwkgICAgY2FzZSBUQUREQ0M6CisJCSpyZGQgPSByczEgKyBvcGVyYW5kMjsKKwkJc3JlZ3MtPnBzciA9IGFkZF9jYyhzcmVncy0+cHNyLCByczEsIG9wZXJhbmQyLCAqcmRkKTsKKwkJaWYgKChyczEgfCBvcGVyYW5kMikgJiAweDMpCisJCSAgICBzcmVncy0+cHNyIHw9IFBTUl9WOworCQlicmVhazsKKwkgICAgY2FzZSBUU1VCQ0M6CisJCSpyZGQgPSByczEgLSBvcGVyYW5kMjsKKwkJc3JlZ3MtPnBzciA9IHN1Yl9jYyAoc3JlZ3MtPnBzciwgcnMxLCBvcGVyYW5kMiwgKnJkZCk7CisJCWlmICgocnMxIHwgb3BlcmFuZDIpICYgMHgzKQorCQkgICAgc3JlZ3MtPnBzciB8PSBQU1JfVjsKKwkJYnJlYWs7CisJICAgIGNhc2UgVEFERENDVFY6CisJCSpyZGQgPSByczEgKyBvcGVyYW5kMjsKKwkJcmVzdWx0ID0gYWRkX2NjKDAsIHJzMSwgb3BlcmFuZDIsICpyZGQpOworCQlpZiAoKHJzMSB8IG9wZXJhbmQyKSAmIDB4MykKKwkJICAgIHJlc3VsdCB8PSBQU1JfVjsKKwkJaWYgKHJlc3VsdCAmIFBTUl9WKSB7CisJCSAgICBzcmVncy0+dHJhcCA9IFRSQVBfVEFHOworCQl9IGVsc2UgeworCQkgICAgc3JlZ3MtPnBzciA9IChzcmVncy0+cHNyICYgflBTUl9DQykgfCByZXN1bHQ7CisJCX0KKwkJYnJlYWs7CisJICAgIGNhc2UgVFNVQkNDVFY6CisJCSpyZGQgPSByczEgLSBvcGVyYW5kMjsKKwkJcmVzdWx0ID0gYWRkX2NjICgwLCByczEsIG9wZXJhbmQyLCAqcmRkKTsKKwkJaWYgKChyczEgfCBvcGVyYW5kMikgJiAweDMpCisJCSAgICByZXN1bHQgfD0gUFNSX1Y7CisJCWlmIChyZXN1bHQgJiBQU1JfVikKKwkJICB7CisJCSAgICAgIHNyZWdzLT50cmFwID0gVFJBUF9UQUc7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgICBzcmVncy0+cHNyID0gKHNyZWdzLT5wc3IgJiB+UFNSX0NDKSB8IHJlc3VsdDsKKwkJICB9CisJCWJyZWFrOworCSAgICBjYXNlIFNMTDoKKwkJKnJkZCA9IHJzMSA8PCAob3BlcmFuZDIgJiAweDFmKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgU1JMOgorCQkqcmRkID0gcnMxID4+IChvcGVyYW5kMiAmIDB4MWYpOworCQlicmVhazsKKwkgICAgY2FzZSBTUkE6CisJCSpyZGQgPSAoKGludCkgcnMxKSA+PiAob3BlcmFuZDIgJiAweDFmKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgRkxVU0g6CisJCWlmIChpZnQpIHNyZWdzLT50cmFwID0gVFJBUF9VTklNUDsKKwkJYnJlYWs7CisJICAgIGNhc2UgU0FWRToKKwkJbmV3X2N3cCA9ICgoc3JlZ3MtPnBzciAmIFBTUl9DV1ApIC0gMSkgJiBQU1JfQ1dQOworCQlpZiAoc3JlZ3MtPndpbSAmICgxIDw8IG5ld19jd3ApKSB7CisJCSAgICBzcmVncy0+dHJhcCA9IFRSQVBfV09GTDsKKwkJICAgIGJyZWFrOworCQl9CisJCWlmIChyZCA+IDcpCisJCSAgICByZGQgPSAmKHNyZWdzLT5yWygobmV3X2N3cCA8PCA0KSArIHJkKSAmIDB4N2ZdKTsKKwkJKnJkZCA9IHJzMSArIG9wZXJhbmQyOworCQlzcmVncy0+cHNyID0gKHNyZWdzLT5wc3IgJiB+UFNSX0NXUCkgfCBuZXdfY3dwOworCQlicmVhazsKKwkgICAgY2FzZSBSRVNUT1JFOgorCisJCW5ld19jd3AgPSAoKHNyZWdzLT5wc3IgJiBQU1JfQ1dQKSArIDEpICYgUFNSX0NXUDsKKwkJaWYgKHNyZWdzLT53aW0gJiAoMSA8PCBuZXdfY3dwKSkgeworCQkgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1dVRkw7CisJCSAgICBicmVhazsKKwkJfQorCQlpZiAocmQgPiA3KQorCQkgICAgcmRkID0gJihzcmVncy0+clsoKG5ld19jd3AgPDwgNCkgKyByZCkgJiAweDdmXSk7CisJCSpyZGQgPSByczEgKyBvcGVyYW5kMjsKKwkJc3JlZ3MtPnBzciA9IChzcmVncy0+cHNyICYgflBTUl9DV1ApIHwgbmV3X2N3cDsKKwkJYnJlYWs7CisJICAgIGNhc2UgUkRQU1I6CisJCWlmICghKHNyZWdzLT5wc3IgJiBQU1JfUykpIHsKKwkJICAgIHNyZWdzLT50cmFwID0gVFJBUF9QUklWSTsKKwkJICAgIGJyZWFrOworCQl9CisJCSpyZGQgPSBzcmVncy0+cHNyOworCQlicmVhazsKKwkgICAgY2FzZSBSRFk6CisgICAgICAgICAgICAgICAgaWYgKCFzcGFyY2xpdGUpCisgICAgICAgICAgICAgICAgICAgICpyZGQgPSBzcmVncy0+eTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJzMV9pc19hc3IgPSAoc3JlZ3MtPmluc3QgPj4gMTQpICYgMHgxZjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAwID09IHJzMV9pc19hc3IgKQorICAgICAgICAgICAgICAgICAgICAgICAgKnJkZCA9IHNyZWdzLT55OworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggMTcgPT0gcnMxX2lzX2FzciApCisgICAgICAgICAgICAgICAgICAgICAgICAqcmRkID0gc3JlZ3MtPmFzcjE3OworICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyZWdzLT50cmFwID0gVFJBUF9VTklNUDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCQlicmVhazsKKwkgICAgY2FzZSBSRFdJTToKKwkJaWYgKCEoc3JlZ3MtPnBzciAmIFBTUl9TKSkgeworCQkgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1BSSVZJOworCQkgICAgYnJlYWs7CisJCX0KKwkJKnJkZCA9IHNyZWdzLT53aW07CisJCWJyZWFrOworCSAgICBjYXNlIFJEVEJSOgorCQlpZiAoIShzcmVncy0+cHNyICYgUFNSX1MpKSB7CisJCSAgICBzcmVncy0+dHJhcCA9IFRSQVBfUFJJVkk7CisJCSAgICBicmVhazsKKwkJfQorCQkqcmRkID0gc3JlZ3MtPnRicjsKKwkJYnJlYWs7CisJICAgIGNhc2UgV1JQU1I6CisJCWlmICgoc3JlZ3MtPnBzciAmIDB4MWYpID4gNykgeworCQkgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1VOSU1QOworCQkgICAgYnJlYWs7CisJCX0KKwkJaWYgKCEoc3JlZ3MtPnBzciAmIFBTUl9TKSkgeworCQkgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1BSSVZJOworCQkgICAgYnJlYWs7CisJCX0KKwkJc3JlZ3MtPnBzciA9IChyczEgXiBvcGVyYW5kMikgJiAweDAwZjAzZmZmOworCQlicmVhazsKKwkgICAgY2FzZSBXUldJTToKKwkJaWYgKCEoc3JlZ3MtPnBzciAmIFBTUl9TKSkgeworCQkgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1BSSVZJOworCQkgICAgYnJlYWs7CisJCX0KKwkJc3JlZ3MtPndpbSA9IChyczEgXiBvcGVyYW5kMikgJiAweDBmZjsKKwkJYnJlYWs7CisJICAgIGNhc2UgV1JUQlI6CisJCWlmICghKHNyZWdzLT5wc3IgJiBQU1JfUykpIHsKKwkJICAgIHNyZWdzLT50cmFwID0gVFJBUF9QUklWSTsKKwkJICAgIGJyZWFrOworCQl9CisJCXNyZWdzLT50YnIgPSAoc3JlZ3MtPnRiciAmIDB4MDAwMDBmZjApIHwKKwkJICAgICgocnMxIF4gb3BlcmFuZDIpICYgMHhmZmZmZjAwMCk7CisJCWJyZWFrOworCSAgICBjYXNlIFdSWToKKyAgICAgICAgICAgICAgICBpZiAoIXNwYXJjbGl0ZSkKKyAgICAgICAgICAgICAgICAgICAgc3JlZ3MtPnkgPSAocnMxIF4gb3BlcmFuZDIpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIDAgPT0gcmQgKQorICAgICAgICAgICAgICAgICAgICAgICAgc3JlZ3MtPnkgPSAocnMxIF4gb3BlcmFuZDIpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggMTcgPT0gcmQgKQorICAgICAgICAgICAgICAgICAgICAgICAgc3JlZ3MtPmFzcjE3ID0gKHJzMSBeIG9wZXJhbmQyKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmVncy0+dHJhcCA9IFRSQVBfVU5JTVA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwkJYnJlYWs7CisJICAgIGNhc2UgSk1QTDoKKworI2lmZGVmIFNUQVQKKwkJc3JlZ3MtPm5icmFuY2grKzsKKyNlbmRpZgorCQlzcmVncy0+aWNudCA9IFRfSk1QTDsJLyogSk1QTCB0YWtlcyB0d28gY3ljbGVzICovCisJCWlmIChyczEgJiAweDMpIHsKKwkJICAgIHNyZWdzLT50cmFwID0gVFJBUF9VTkFMSTsKKwkJICAgIGJyZWFrOworCQl9CisJCSpyZGQgPSBzcmVncy0+cGM7CisJCW5wYyA9IHJzMSArIG9wZXJhbmQyOworCQlicmVhazsKKwkgICAgY2FzZSBSRVRUOgorCQlhZGRyZXNzID0gcnMxICsgb3BlcmFuZDI7CisJCW5ld19jd3AgPSAoKHNyZWdzLT5wc3IgJiBQU1JfQ1dQKSArIDEpICYgUFNSX0NXUDsKKwkJc3JlZ3MtPmljbnQgPSBUX1JFVFQ7CS8qIFJFVFQgdGFrZXMgdHdvIGN5Y2xlcyAqLworCQlpZiAoc3JlZ3MtPnBzciAmIFBTUl9FVCkgeworCQkgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1VOSU1QOworCQkgICAgYnJlYWs7CisJCX0KKwkJaWYgKCEoc3JlZ3MtPnBzciAmIFBTUl9TKSkgeworCQkgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1BSSVZJOworCQkgICAgYnJlYWs7CisJCX0KKwkJaWYgKHNyZWdzLT53aW0gJiAoMSA8PCBuZXdfY3dwKSkgeworCQkgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1dVRkw7CisJCSAgICBicmVhazsKKwkJfQorCQlpZiAoYWRkcmVzcyAmIDB4MykgeworCQkgICAgc3JlZ3MtPnRyYXAgPSBUUkFQX1VOQUxJOworCQkgICAgYnJlYWs7CisJCX0KKwkJc3JlZ3MtPnBzciA9IChzcmVncy0+cHNyICYgflBTUl9DV1ApIHwgbmV3X2N3cCB8IFBTUl9FVDsKKwkJc3JlZ3MtPnBzciA9CisJCSAgICAoc3JlZ3MtPnBzciAmIH5QU1JfUykgfCAoKHNyZWdzLT5wc3IgJiBQU1JfUFMpIDw8IDEpOworCQlucGMgPSBhZGRyZXNzOworCQlicmVhazsKKworCSAgICBjYXNlIFNDQU46CisJCXsKKwkJICB1aW50MzIgcmVzdWx0LCBtYXNrOworCQkgIGludCBpOworCisJCSAgaWYgKCFzcGFyY2xpdGUpIHsKKwkJICAgICBzcmVncy0+dHJhcCA9IFRSQVBfVU5JTVA7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJICB9CisJCSAgbWFzayA9IChvcGVyYW5kMiAmIDB4ODAwMDAwMDApIHwgKG9wZXJhbmQyID4+IDEpOworCQkgIHJlc3VsdCA9IHJzMSBeIG1hc2s7CisKKwkJICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkgICAgaWYgKHJlc3VsdCAmIDB4ODAwMDAwMDApCisJCSAgICAgIGJyZWFrOworCQkgICAgcmVzdWx0IDw8PSAxOworCQkgIH0KKworCQkgICpyZGQgPSBpID09IDMyID8gNjMgOiBpOworCQl9CisJCWJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJCXNyZWdzLT50cmFwID0gVFJBUF9VTklNUDsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJYnJlYWs7CisgICAgY2FzZSAzOgkJCS8qIExvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zICovCisKKwlhZGRyZXNzID0gcnMxICsgb3BlcmFuZDI7CisKKwlpZiAoc3JlZ3MtPnBzciAmIFBTUl9TKQorCSAgICBhc2kgPSAxMTsKKwkgZWxzZQorCSAgICBhc2kgPSAxMDsKKworCWlmIChvcDMgJiA0KSB7CisJICAgIHNyZWdzLT5pY250ID0gVF9TVDsJLyogU2V0IHN0b3JlIGluc3RydWN0aW9uIGNvdW50ICovCisjaWZkZWYgU1RBVAorCSAgICBzcmVncy0+bnN0b3JlKys7CisjZW5kaWYKKwl9IGVsc2UgeworCSAgICBzcmVncy0+aWNudCA9IFRfTEQ7CS8qIFNldCBsb2FkIGluc3RydWN0aW9uIGNvdW50ICovCisjaWZkZWYgU1RBVAorCSAgICBzcmVncy0+bmxvYWQrKzsKKyNlbmRpZgorCX0KKworCS8qIERlY29kZSBsb2FkL3N0b3JlIGluc3RydWN0aW9ucyAqLworCisJc3dpdGNoIChvcDMpIHsKKwljYXNlIExEREE6CisJICAgIGlmICghY2hrX2FzaShzcmVncywgJmFzaSwgb3AzKSkgYnJlYWs7CisJY2FzZSBMREQ6CisJICAgIGlmIChhZGRyZXNzICYgMHg3KSB7CisJCXNyZWdzLT50cmFwID0gVFJBUF9VTkFMSTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKHJkICYgMSkgeworCQlyZCAmPSAweDFlOworCQlpZiAocmQgPiA3KQorCQkgICAgcmRkID0gJihzcmVncy0+clsoY3dwICsgcmQpICYgMHg3Zl0pOworCQllbHNlCisJCSAgICByZGQgPSAmKHNyZWdzLT5nW3JkXSk7CisJICAgIH0KKwkgICAgbWV4YyA9IG1lbW9yeV9yZWFkKGFzaSwgYWRkcmVzcywgZGRhdGEsIDMsICZ3cyk7CisJICAgIHNyZWdzLT5ob2xkICs9IHdzICogMjsKKwkgICAgc3JlZ3MtPmljbnQgPSBUX0xERDsKKwkgICAgaWYgKG1leGMpIHsKKwkJc3JlZ3MtPnRyYXAgPSBUUkFQX0RFWEM7CisJICAgIH0gZWxzZSB7CisJCXJkZFswXSA9IGRkYXRhWzBdOworCQlyZGRbMV0gPSBkZGF0YVsxXTsKKyNpZmRlZiBTVEFUCisJCXNyZWdzLT5ubG9hZCsrOwkvKiBEb3VibGUgbG9hZCBjb3VudHMgdHdpY2UgKi8KKyNlbmRpZgorCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBMREE6CisJICAgIGlmICghY2hrX2FzaShzcmVncywgJmFzaSwgb3AzKSkgYnJlYWs7CisJY2FzZSBMRDoKKwkgICAgaWYgKGFkZHJlc3MgJiAweDMpIHsKKwkJc3JlZ3MtPnRyYXAgPSBUUkFQX1VOQUxJOworCQlicmVhazsKKwkgICAgfQorCSAgICBtZXhjID0gbWVtb3J5X3JlYWQoYXNpLCBhZGRyZXNzLCAmZGF0YSwgMiwgJndzKTsKKwkgICAgc3JlZ3MtPmhvbGQgKz0gd3M7CisJICAgIGlmIChtZXhjKSB7CisJCXNyZWdzLT50cmFwID0gVFJBUF9ERVhDOworCSAgICB9IGVsc2UgeworCQkqcmRkID0gZGF0YTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIExEU1RVQkE6CisJICAgIGlmICghY2hrX2FzaShzcmVncywgJmFzaSwgb3AzKSkgYnJlYWs7CisJY2FzZSBMRFNUVUI6CisJICAgIG1leGMgPSBtZW1vcnlfcmVhZChhc2ksIGFkZHJlc3MsICZkYXRhLCAwLCAmd3MpOworCSAgICBzcmVncy0+aG9sZCArPSB3czsKKwkgICAgc3JlZ3MtPmljbnQgPSBUX0xEU1Q7CisJICAgIGlmIChtZXhjKSB7CisJCXNyZWdzLT50cmFwID0gVFJBUF9ERVhDOworCQlicmVhazsKKwkgICAgfQorCSAgICAqcmRkID0gZGF0YTsKKwkgICAgZGF0YSA9IDB4MGZmOworCSAgICBtZXhjID0gbWVtb3J5X3dyaXRlKGFzaSwgYWRkcmVzcywgJmRhdGEsIDAsICZ3cyk7CisJICAgIHNyZWdzLT5ob2xkICs9IHdzOworCSAgICBpZiAobWV4YykgeworCQlzcmVncy0+dHJhcCA9IFRSQVBfREVYQzsKKwkgICAgfQorI2lmZGVmIFNUQVQKKwkgICAgc3JlZ3MtPm5sb2FkKys7CisjZW5kaWYKKwkgICAgYnJlYWs7CisJY2FzZSBMRFNCQToKKwljYXNlIExEVUJBOgorCSAgICBpZiAoIWNoa19hc2koc3JlZ3MsICZhc2ksIG9wMykpIGJyZWFrOworCWNhc2UgTERTQjoKKwljYXNlIExEVUI6CisJICAgIG1leGMgPSBtZW1vcnlfcmVhZChhc2ksIGFkZHJlc3MsICZkYXRhLCAwLCAmd3MpOworCSAgICBzcmVncy0+aG9sZCArPSB3czsKKwkgICAgaWYgKG1leGMpIHsKKwkJc3JlZ3MtPnRyYXAgPSBUUkFQX0RFWEM7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmICgob3AzID09IExEU0IpICYmIChkYXRhICYgMHg4MCkpCisJCWRhdGEgfD0gMHhmZmZmZmYwMDsKKwkgICAgKnJkZCA9IGRhdGE7CisJICAgIGJyZWFrOworCWNhc2UgTERTSEE6CisJY2FzZSBMRFVIQToKKwkgICAgaWYgKCFjaGtfYXNpKHNyZWdzLCAmYXNpLCBvcDMpKSBicmVhazsKKwljYXNlIExEU0g6CisJY2FzZSBMRFVIOgorCSAgICBpZiAoYWRkcmVzcyAmIDB4MSkgeworCQlzcmVncy0+dHJhcCA9IFRSQVBfVU5BTEk7CisJCWJyZWFrOworCSAgICB9CisJICAgIG1leGMgPSBtZW1vcnlfcmVhZChhc2ksIGFkZHJlc3MsICZkYXRhLCAxLCAmd3MpOworCSAgICBzcmVncy0+aG9sZCArPSB3czsKKwkgICAgaWYgKG1leGMpIHsKKwkJc3JlZ3MtPnRyYXAgPSBUUkFQX0RFWEM7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmICgob3AzID09IExEU0gpICYmIChkYXRhICYgMHg4MDAwKSkKKwkJZGF0YSB8PSAweGZmZmYwMDAwOworCSAgICAqcmRkID0gZGF0YTsKKwkgICAgYnJlYWs7CisJY2FzZSBMREY6CisJICAgIGlmICghKChzcmVncy0+cHNyICYgUFNSX0VGKSAmJiBGUF9QUkVTKSkgeworCQlzcmVncy0+dHJhcCA9IFRSQVBfRlBESVM7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmIChhZGRyZXNzICYgMHgzKSB7CisJCXNyZWdzLT50cmFwID0gVFJBUF9VTkFMSTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKGViYXNlLnNpbXRpbWUgPCBzcmVncy0+ZnRpbWUpIHsKKwkJaWYgKChzcmVncy0+ZnJkID09IHJkKSB8fCAoc3JlZ3MtPmZyczEgPT0gcmQpIHx8CisJCSAgICAoc3JlZ3MtPmZyczIgPT0gcmQpKQorCQkgICAgc3JlZ3MtPmZob2xkICs9IChzcmVncy0+ZnRpbWUgLSBlYmFzZS5zaW10aW1lKTsKKwkgICAgfQorCSAgICBtZXhjID0gbWVtb3J5X3JlYWQoYXNpLCBhZGRyZXNzLCAmZGF0YSwgMiwgJndzKTsKKwkgICAgc3JlZ3MtPmhvbGQgKz0gd3M7CisJICAgIHNyZWdzLT5mbHJkID0gcmQ7CisJICAgIHNyZWdzLT5sdGltZSA9IGViYXNlLnNpbXRpbWUgKyBzcmVncy0+aWNudCArIEZMU1RIT0xEICsKKwkJc3JlZ3MtPmhvbGQgKyBzcmVncy0+ZmhvbGQ7CisJICAgIGlmIChtZXhjKSB7CisJCXNyZWdzLT50cmFwID0gVFJBUF9ERVhDOworCSAgICB9IGVsc2UgeworCQlzcmVncy0+ZnNbcmRdID0gKigoZmxvYXQzMiAqKSAmIGRhdGEpOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgTERERjoKKwkgICAgaWYgKCEoKHNyZWdzLT5wc3IgJiBQU1JfRUYpICYmIEZQX1BSRVMpKSB7CisJCXNyZWdzLT50cmFwID0gVFJBUF9GUERJUzsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKGFkZHJlc3MgJiAweDcpIHsKKwkJc3JlZ3MtPnRyYXAgPSBUUkFQX1VOQUxJOworCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAoZWJhc2Uuc2ltdGltZSA8IHNyZWdzLT5mdGltZSkgeworCQlpZiAoKChzcmVncy0+ZnJkID4+IDEpID09IChyZCA+PiAxKSkgfHwKKwkJICAgICgoc3JlZ3MtPmZyczEgPj4gMSkgPT0gKHJkID4+IDEpKSB8fAorCQkgICAgKChzcmVncy0+ZnJzMiA+PiAxKSA9PSAocmQgPj4gMSkpKQorCQkgICAgc3JlZ3MtPmZob2xkICs9IChzcmVncy0+ZnRpbWUgLSBlYmFzZS5zaW10aW1lKTsKKwkgICAgfQorCSAgICBtZXhjID0gbWVtb3J5X3JlYWQoYXNpLCBhZGRyZXNzLCBkZGF0YSwgMywgJndzKTsKKwkgICAgc3JlZ3MtPmhvbGQgKz0gd3MgKiAyOworCSAgICBzcmVncy0+aWNudCA9IFRfTEREOworCSAgICBpZiAobWV4YykgeworCQlzcmVncy0+dHJhcCA9IFRSQVBfREVYQzsKKwkgICAgfSBlbHNlIHsKKwkJcmQgJj0gMHgxRTsKKwkJc3JlZ3MtPmZscmQgPSByZDsKKwkJc3JlZ3MtPmZzW3JkXSA9ICooKGZsb2F0MzIgKikgJiBkZGF0YVswXSk7CisjaWZkZWYgU1RBVAorCQlzcmVncy0+bmxvYWQrKzsJLyogRG91YmxlIGxvYWQgY291bnRzIHR3aWNlICovCisjZW5kaWYKKwkJc3JlZ3MtPmZzW3JkICsgMV0gPSAqKChmbG9hdDMyICopICYgZGRhdGFbMV0pOworCQlzcmVncy0+bHRpbWUgPSBlYmFzZS5zaW10aW1lICsgc3JlZ3MtPmljbnQgKyBGTFNUSE9MRCArCisJCQkgICAgICAgc3JlZ3MtPmhvbGQgKyBzcmVncy0+ZmhvbGQ7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBMREZTUjoKKwkgICAgaWYgKGViYXNlLnNpbXRpbWUgPCBzcmVncy0+ZnRpbWUpIHsKKwkJc3JlZ3MtPmZob2xkICs9IChzcmVncy0+ZnRpbWUgLSBlYmFzZS5zaW10aW1lKTsKKwkgICAgfQorCSAgICBpZiAoISgoc3JlZ3MtPnBzciAmIFBTUl9FRikgJiYgRlBfUFJFUykpIHsKKwkJc3JlZ3MtPnRyYXAgPSBUUkFQX0ZQRElTOworCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAoYWRkcmVzcyAmIDB4MykgeworCQlzcmVncy0+dHJhcCA9IFRSQVBfVU5BTEk7CisJCWJyZWFrOworCSAgICB9CisJICAgIG1leGMgPSBtZW1vcnlfcmVhZChhc2ksIGFkZHJlc3MsICZkYXRhLCAyLCAmd3MpOworCSAgICBzcmVncy0+aG9sZCArPSB3czsKKwkgICAgaWYgKG1leGMpIHsKKwkJc3JlZ3MtPnRyYXAgPSBUUkFQX0RFWEM7CisJICAgIH0gZWxzZSB7CisJCXNyZWdzLT5mc3IgPQorCQkgICAgKHNyZWdzLT5mc3IgJiAweDdGRjAwMCkgfCAoZGF0YSAmIH4weDdGRjAwMCk7CisJCXNldF9mc3Ioc3JlZ3MtPmZzcik7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBTVEZTUjoKKwkgICAgaWYgKCEoKHNyZWdzLT5wc3IgJiBQU1JfRUYpICYmIEZQX1BSRVMpKSB7CisJCXNyZWdzLT50cmFwID0gVFJBUF9GUERJUzsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKGFkZHJlc3MgJiAweDMpIHsKKwkJc3JlZ3MtPnRyYXAgPSBUUkFQX1VOQUxJOworCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAoZWJhc2Uuc2ltdGltZSA8IHNyZWdzLT5mdGltZSkgeworCQlzcmVncy0+ZmhvbGQgKz0gKHNyZWdzLT5mdGltZSAtIGViYXNlLnNpbXRpbWUpOworCSAgICB9CisJICAgIG1leGMgPSBtZW1vcnlfd3JpdGUoYXNpLCBhZGRyZXNzLCAmc3JlZ3MtPmZzciwgMiwgJndzKTsKKwkgICAgc3JlZ3MtPmhvbGQgKz0gd3M7CisJICAgIGlmIChtZXhjKSB7CisJCXNyZWdzLT50cmFwID0gVFJBUF9ERVhDOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBTVEE6CisJICAgIGlmICghY2hrX2FzaShzcmVncywgJmFzaSwgb3AzKSkgYnJlYWs7CisJY2FzZSBTVDoKKwkgICAgaWYgKGFkZHJlc3MgJiAweDMpIHsKKwkJc3JlZ3MtPnRyYXAgPSBUUkFQX1VOQUxJOworCQlicmVhazsKKwkgICAgfQorCSAgICBtZXhjID0gbWVtb3J5X3dyaXRlKGFzaSwgYWRkcmVzcywgcmRkLCAyLCAmd3MpOworCSAgICBzcmVncy0+aG9sZCArPSB3czsKKwkgICAgaWYgKG1leGMpIHsKKwkJc3JlZ3MtPnRyYXAgPSBUUkFQX0RFWEM7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBTVEJBOgorCSAgICBpZiAoIWNoa19hc2koc3JlZ3MsICZhc2ksIG9wMykpIGJyZWFrOworCWNhc2UgU1RCOgorCSAgICBtZXhjID0gbWVtb3J5X3dyaXRlKGFzaSwgYWRkcmVzcywgcmRkLCAwLCAmd3MpOworCSAgICBzcmVncy0+aG9sZCArPSB3czsKKwkgICAgaWYgKG1leGMpIHsKKwkJc3JlZ3MtPnRyYXAgPSBUUkFQX0RFWEM7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBTVERBOgorCSAgICBpZiAoIWNoa19hc2koc3JlZ3MsICZhc2ksIG9wMykpIGJyZWFrOworCWNhc2UgU1REOgorCSAgICBpZiAoYWRkcmVzcyAmIDB4NykgeworCQlzcmVncy0+dHJhcCA9IFRSQVBfVU5BTEk7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmIChyZCAmIDEpIHsKKwkJcmQgJj0gMHgxZTsKKwkJaWYgKHJkID4gNykKKwkJICAgIHJkZCA9ICYoc3JlZ3MtPnJbKGN3cCArIHJkKSAmIDB4N2ZdKTsKKwkJZWxzZQorCQkgICAgcmRkID0gJihzcmVncy0+Z1tyZF0pOworCSAgICB9CisJICAgIG1leGMgPSBtZW1vcnlfd3JpdGUoYXNpLCBhZGRyZXNzLCByZGQsIDMsICZ3cyk7CisJICAgIHNyZWdzLT5ob2xkICs9IHdzOworCSAgICBzcmVncy0+aWNudCA9IFRfU1REOworI2lmZGVmIFNUQVQKKwkgICAgc3JlZ3MtPm5zdG9yZSsrOwkvKiBEb3VibGUgc3RvcmUgY291bnRzIHR3aWNlICovCisjZW5kaWYKKwkgICAgaWYgKG1leGMpIHsKKwkJc3JlZ3MtPnRyYXAgPSBUUkFQX0RFWEM7CisJCWJyZWFrOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgU1RERlE6CisJICAgIGlmICgoc3JlZ3MtPnBzciAmIDB4MWYpID4gNykgeworCQlzcmVncy0+dHJhcCA9IFRSQVBfVU5JTVA7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmICghKChzcmVncy0+cHNyICYgUFNSX0VGKSAmJiBGUF9QUkVTKSkgeworCQlzcmVncy0+dHJhcCA9IFRSQVBfRlBESVM7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmIChhZGRyZXNzICYgMHg3KSB7CisJCXNyZWdzLT50cmFwID0gVFJBUF9VTkFMSTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKCEoc3JlZ3MtPmZzciAmIEZTUl9RTkUpKSB7CisJCXNyZWdzLT5mc3IgPSAoc3JlZ3MtPmZzciAmIH5GU1JfVFQpIHwgRlBfU0VRX0VSUjsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgcmRkID0gJihzcmVncy0+ZnBxWzBdKTsKKwkgICAgbWV4YyA9IG1lbW9yeV93cml0ZShhc2ksIGFkZHJlc3MsIHJkZCwgMywgJndzKTsKKwkgICAgc3JlZ3MtPmhvbGQgKz0gd3M7CisJICAgIHNyZWdzLT5pY250ID0gVF9TVEQ7CisjaWZkZWYgU1RBVAorCSAgICBzcmVncy0+bnN0b3JlKys7CS8qIERvdWJsZSBzdG9yZSBjb3VudHMgdHdpY2UgKi8KKyNlbmRpZgorCSAgICBpZiAobWV4YykgeworCQlzcmVncy0+dHJhcCA9IFRSQVBfREVYQzsKKwkJYnJlYWs7CisJICAgIH0gZWxzZSB7CisJCXNyZWdzLT5mc3IgJj0gfkZTUl9RTkU7CisJCXNyZWdzLT5mcHN0YXRlID0gRlBfRVhFX01PREU7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBTVEhBOgorCSAgICBpZiAoIWNoa19hc2koc3JlZ3MsICZhc2ksIG9wMykpIGJyZWFrOworCWNhc2UgU1RIOgorCSAgICBpZiAoYWRkcmVzcyAmIDB4MSkgeworCQlzcmVncy0+dHJhcCA9IFRSQVBfVU5BTEk7CisJCWJyZWFrOworCSAgICB9CisJICAgIG1leGMgPSBtZW1vcnlfd3JpdGUoYXNpLCBhZGRyZXNzLCByZGQsIDEsICZ3cyk7CisJICAgIHNyZWdzLT5ob2xkICs9IHdzOworCSAgICBpZiAobWV4YykgeworCQlzcmVncy0+dHJhcCA9IFRSQVBfREVYQzsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIFNURjoKKwkgICAgaWYgKCEoKHNyZWdzLT5wc3IgJiBQU1JfRUYpICYmIEZQX1BSRVMpKSB7CisJCXNyZWdzLT50cmFwID0gVFJBUF9GUERJUzsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKGFkZHJlc3MgJiAweDMpIHsKKwkJc3JlZ3MtPnRyYXAgPSBUUkFQX1VOQUxJOworCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAoZWJhc2Uuc2ltdGltZSA8IHNyZWdzLT5mdGltZSkgeworCQlpZiAoc3JlZ3MtPmZyZCA9PSByZCkKKwkJICAgIHNyZWdzLT5maG9sZCArPSAoc3JlZ3MtPmZ0aW1lIC0gZWJhc2Uuc2ltdGltZSk7CisJICAgIH0KKwkgICAgbWV4YyA9IG1lbW9yeV93cml0ZShhc2ksIGFkZHJlc3MsICZzcmVncy0+ZnNpW3JkXSwgMiwgJndzKTsKKwkgICAgc3JlZ3MtPmhvbGQgKz0gd3M7CisJICAgIGlmIChtZXhjKSB7CisJCXNyZWdzLT50cmFwID0gVFJBUF9ERVhDOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgU1RERjoKKwkgICAgaWYgKCEoKHNyZWdzLT5wc3IgJiBQU1JfRUYpICYmIEZQX1BSRVMpKSB7CisJCXNyZWdzLT50cmFwID0gVFJBUF9GUERJUzsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKGFkZHJlc3MgJiAweDcpIHsKKwkJc3JlZ3MtPnRyYXAgPSBUUkFQX1VOQUxJOworCQlicmVhazsKKwkgICAgfQorCSAgICByZCAmPSAweDFFOworCSAgICBpZiAoZWJhc2Uuc2ltdGltZSA8IHNyZWdzLT5mdGltZSkgeworCQlpZiAoKHNyZWdzLT5mcmQgPT0gcmQpIHx8IChzcmVncy0+ZnJkICsgMSA9PSByZCkpCisJCSAgICBzcmVncy0+ZmhvbGQgKz0gKHNyZWdzLT5mdGltZSAtIGViYXNlLnNpbXRpbWUpOworCSAgICB9CisJICAgIG1leGMgPSBtZW1vcnlfd3JpdGUoYXNpLCBhZGRyZXNzLCAmc3JlZ3MtPmZzaVtyZF0sIDMsICZ3cyk7CisJICAgIHNyZWdzLT5ob2xkICs9IHdzOworCSAgICBzcmVncy0+aWNudCA9IFRfU1REOworI2lmZGVmIFNUQVQKKwkgICAgc3JlZ3MtPm5zdG9yZSsrOwkvKiBEb3VibGUgc3RvcmUgY291bnRzIHR3aWNlICovCisjZW5kaWYKKwkgICAgaWYgKG1leGMpIHsKKwkJc3JlZ3MtPnRyYXAgPSBUUkFQX0RFWEM7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBTV0FQQToKKwkgICAgaWYgKCFjaGtfYXNpKHNyZWdzLCAmYXNpLCBvcDMpKSBicmVhazsKKwljYXNlIFNXQVA6CisJICAgIGlmIChhZGRyZXNzICYgMHgzKSB7CisJCXNyZWdzLT50cmFwID0gVFJBUF9VTkFMSTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgbWV4YyA9IG1lbW9yeV9yZWFkKGFzaSwgYWRkcmVzcywgJmRhdGEsIDIsICZ3cyk7CisJICAgIHNyZWdzLT5ob2xkICs9IHdzOworCSAgICBpZiAobWV4YykgeworCQlzcmVncy0+dHJhcCA9IFRSQVBfREVYQzsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgbWV4YyA9IG1lbW9yeV93cml0ZShhc2ksIGFkZHJlc3MsIHJkZCwgMiwgJndzKTsKKwkgICAgc3JlZ3MtPmhvbGQgKz0gd3M7CisJICAgIHNyZWdzLT5pY250ID0gVF9MRFNUOworCSAgICBpZiAobWV4YykgeworCQlzcmVncy0+dHJhcCA9IFRSQVBfREVYQzsKKwkJYnJlYWs7CisJICAgIH0gZWxzZQorCQkqcmRkID0gZGF0YTsKKyNpZmRlZiBTVEFUCisJICAgIHNyZWdzLT5ubG9hZCsrOworI2VuZGlmCisJICAgIGJyZWFrOworCisKKwlkZWZhdWx0OgorCSAgICBzcmVncy0+dHJhcCA9IFRSQVBfVU5JTVA7CisJICAgIGJyZWFrOworCX0KKworI2lmZGVmIExPQURfREVMCisKKwlpZiAoIShvcDMgJiA0KSkgeworCSAgICBzcmVncy0+aWxkdGltZSA9IGViYXNlLnNpbXRpbWUgKyBzcmVncy0+aG9sZCArIHNyZWdzLT5pY250OworCSAgICBzcmVncy0+aWxkcmVnID0gcmQ7CisJICAgIGlmICgob3AzIHwgMHgxMCkgPT0gMHgxMykKKwkJc3JlZ3MtPmlsZHJlZyB8PSAxOwkvKiBEb3VibGUgbG9hZCwgb2RkIHJlZ2lzdGVyIGxvYWRlZAorCQkJCQkgKiBsYXN0ICovCisJfQorI2VuZGlmCisJYnJlYWs7CisKKyAgICBkZWZhdWx0OgorCXNyZWdzLT50cmFwID0gVFJBUF9VTklNUDsKKwlicmVhazsKKyAgICB9CisgICAgc3JlZ3MtPmdbMF0gPSAwOworICAgIGlmICghc3JlZ3MtPnRyYXApIHsKKwlzcmVncy0+cGMgPSBwYzsKKwlzcmVncy0+bnBjID0gbnBjOworICAgIH0KKyAgICByZXR1cm4gKDApOworfQorCisjZGVmaW5lIFRfRkFCU3MJCTIKKyNkZWZpbmUgVF9GQUREcwkJNAorI2RlZmluZSBUX0ZBRERkCQk0CisjZGVmaW5lIFRfRkNNUHMJCTQKKyNkZWZpbmUgVF9GQ01QZAkJNAorI2RlZmluZSBUX0ZESVZzCQkyMAorI2RlZmluZSBUX0ZESVZkCQkzNQorI2RlZmluZSBUX0ZNT1ZzCQkyCisjZGVmaW5lIFRfRk1VTHMJCTUKKyNkZWZpbmUgVF9GTVVMZAkJOQorI2RlZmluZSBUX0ZORUdzCQkyCisjZGVmaW5lIFRfRlNRUlRzCTM3CisjZGVmaW5lIFRfRlNRUlRkCTY1CisjZGVmaW5lIFRfRlNVQnMJCTQKKyNkZWZpbmUgVF9GU1VCZAkJNAorI2RlZmluZSBUX0ZkVE9pCQk3CisjZGVmaW5lIFRfRmRUT3MJCTMKKyNkZWZpbmUgVF9GaVRPcwkJNgorI2RlZmluZSBUX0ZpVE9kCQk2CisjZGVmaW5lIFRfRnNUT2kJCTYKKyNkZWZpbmUgVF9Gc1RPZAkJMgorCisjZGVmaW5lIEZBQlNzCTB4MDkKKyNkZWZpbmUgRkFERHMJMHg0MQorI2RlZmluZSBGQUREZAkweDQyCisjZGVmaW5lIEZDTVBzCTB4NTEKKyNkZWZpbmUgRkNNUGQJMHg1MgorI2RlZmluZSBGQ01QRXMJMHg1NQorI2RlZmluZSBGQ01QRWQJMHg1NgorI2RlZmluZSBGRElWcwkweDRECisjZGVmaW5lIEZESVZkCTB4NEUKKyNkZWZpbmUgRk1PVnMJMHgwMQorI2RlZmluZSBGTVVMcwkweDQ5CisjZGVmaW5lIEZNVUxkCTB4NEEKKyNkZWZpbmUgRk5FR3MJMHgwNQorI2RlZmluZSBGU1FSVHMJMHgyOQorI2RlZmluZSBGU1FSVGQJMHgyQQorI2RlZmluZSBGU1VCcwkweDQ1CisjZGVmaW5lIEZTVUJkCTB4NDYKKyNkZWZpbmUgRmRUT2kJMHhEMgorI2RlZmluZSBGZFRPcwkweEM2CisjZGVmaW5lIEZpVE9zCTB4QzQKKyNkZWZpbmUgRmlUT2QJMHhDOAorI2RlZmluZSBGc1RPaQkweEQxCisjZGVmaW5lIEZzVE9kCTB4QzkKKworCitzdGF0aWMgaW50CitmcGV4ZWMob3AzLCByZCwgcnMxLCByczIsIHNyZWdzKQorICAgIHVpbnQzMiAgICAgICAgICBvcDMsIHJkLCByczEsIHJzMjsKKyAgICBzdHJ1Y3QgcHN0YXRlICAqc3JlZ3M7Cit7CisgICAgdWludDMyICAgICAgICAgIG9wZiwgdGVtLCBhY2NleDsKKyAgICBpbnQzMiAgICAgICAgICAgZmNjOworICAgIHVpbnQzMiAgICAgICAgICBsZGFkajsKKworICAgIGlmIChzcmVncy0+ZnBzdGF0ZSA9PSBGUF9FWENfTU9ERSkgeworCXNyZWdzLT5mc3IgPSAoc3JlZ3MtPmZzciAmIH5GU1JfVFQpIHwgRlBfU0VRX0VSUjsKKwlzcmVncy0+ZnBzdGF0ZSA9IEZQX0VYQ19QRTsKKwlyZXR1cm4gKDApOworICAgIH0KKyAgICBpZiAoc3JlZ3MtPmZwc3RhdGUgPT0gRlBfRVhDX1BFKSB7CisJc3JlZ3MtPmZwc3RhdGUgPSBGUF9FWENfTU9ERTsKKwlyZXR1cm4gKFRSQVBfRlBFWEMpOworICAgIH0KKyAgICBvcGYgPSAoc3JlZ3MtPmluc3QgPj4gNSkgJiAweDFmZjsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIEZQb3AgaW4gdGhlIHBpcGUuIElmIHNvLCBoYWx0IHVudGlsIGl0IGlzCisgICAgICogZmluaXNoZWQgYnkgaW5jcmVtZW50aW5nIGZob2xkIHdpdGggdGhlIHJlbWFpbmluZyBleGVjdXRpb24gdGltZQorICAgICAqLworCisgICAgaWYgKGViYXNlLnNpbXRpbWUgPCBzcmVncy0+ZnRpbWUpIHsKKwlzcmVncy0+ZmhvbGQgPSAoc3JlZ3MtPmZ0aW1lIC0gZWJhc2Uuc2ltdGltZSk7CisgICAgfSBlbHNlIHsKKwlzcmVncy0+ZmhvbGQgPSAwOworCisJLyogQ2hlY2sgbG9hZCBkZXBlbmRlbmNpZXMuICovCisKKwlpZiAoZWJhc2Uuc2ltdGltZSA8IHNyZWdzLT5sdGltZSkgeworCisJICAgIC8qIERvbid0IGNoZWNrIHJzMSBpZiBzaW5nbGUgb3BlcmFuZCBpbnN0cnVjdGlvbnMgKi8KKworCSAgICBpZiAoKChvcGYgPj4gNikgPT0gMCkgfHwgKChvcGYgPj4gNikgPT0gMykpCisJCXJzMSA9IDMyOworCisJICAgIC8qIEFkanVzdCBmb3IgZG91YmxlIGZsb2F0cyAqLworCisJICAgIGxkYWRqID0gb3BmICYgMTsKKwkgICAgaWYgKCEoKChzcmVncy0+ZmxyZCAtIHJzMSkgPj4gbGRhZGopICYmICgoc3JlZ3MtPmZscmQgLSByczIpID4+IGxkYWRqKSkpCisJCXNyZWdzLT5maG9sZCsrOworCX0KKyAgICB9CisKKyAgICBzcmVncy0+Zmluc3QrKzsKKworICAgIHNyZWdzLT5mcnMxID0gcnMxOwkJLyogU3RvcmUgc3JjIGFuZCBkc3QgZm9yIGRlcGVuZGVjeSBjaGVjayAqLworICAgIHNyZWdzLT5mcnMyID0gcnMyOworICAgIHNyZWdzLT5mcmQgPSByZDsKKworICAgIHNyZWdzLT5mdGltZSA9IGViYXNlLnNpbXRpbWUgKyBzcmVncy0+aG9sZCArIHNyZWdzLT5maG9sZDsKKworICAgIC8qIFNQQVJDIGlzIGJpZy1lbmRpYW4gLSBzd2FwIGRvdWJsZSBmbG9hdHMgaWYgaG9zdCBpcyBsaXR0bGUtZW5kaWFuICovCisgICAgLyogVGhpcyBpcyB1Z2x5IC0gSSBrbm93IC4uLiAqLworCisgICAgLyogRklYTUU6IHNob3VsZCB1c2UgKENVUlJFTlRfSE9TVF9CWVRFX09SREVSID09IENVUlJFTlRfVEFSR0VUX0JZVEVfT1JERVIpCisgICAgICAgYnV0IHdoYXQgYWJvdXQgbWFjaGluZXMgd2hlcmUgZmxvYXQgdmFsdWVzIGFyZSBkaWZmZXJlbnQgZW5kaWFubmVzcworICAgICAgIGZyb20gaW50ZWdlciB2YWx1ZXM/ICovCisKKyNpZmRlZiBIT1NUX0xJVFRMRV9FTkRJQU5fRkxPQVQKKyAgICByczEgJj0gMHgxZjsKKyAgICBzd2l0Y2ggKG9wZikgeworCWNhc2UgRkFERGQ6CisJY2FzZSBGRElWZDoKKwljYXNlIEZNVUxkOgorCWNhc2UgRlNRUlRkOgorCWNhc2UgRlNVQmQ6CisgICAgICAgIGNhc2UgRkNNUGQ6CisgICAgICAgIGNhc2UgRkNNUEVkOgorCWNhc2UgRmRUT2k6CisJY2FzZSBGZFRPczoKKyAgICAJICAgIHNyZWdzLT5mZHBbcnMxIHwgMV0gPSBzcmVncy0+ZnNbcnMxICYgfjFdOworICAgIAkgICAgc3JlZ3MtPmZkcFtyczEgJiB+MV0gPSBzcmVncy0+ZnNbcnMxIHwgMV07CisgICAgCSAgICBzcmVncy0+ZmRwW3JzMiB8IDFdID0gc3JlZ3MtPmZzW3JzMiAmIH4xXTsKKyAgICAJICAgIHNyZWdzLT5mZHBbcnMyICYgfjFdID0gc3JlZ3MtPmZzW3JzMiB8IDFdOworICAgIGRlZmF1bHQ6CisgICAgfQorI2VuZGlmCisKKyAgICBjbGVhcl9hY2NleCgpOworCisgICAgc3dpdGNoIChvcGYpIHsKKyAgICBjYXNlIEZBQlNzOgorCXNyZWdzLT5mc1tyZF0gPSBmYWJzKHNyZWdzLT5mc1tyczJdKTsKKwlzcmVncy0+ZnRpbWUgKz0gVF9GQUJTczsKKwlzcmVncy0+ZnJzMSA9IDMyOwkvKiByczEgaWdub3JlZCAqLworCWJyZWFrOworICAgIGNhc2UgRkFERHM6CisJc3JlZ3MtPmZzW3JkXSA9IHNyZWdzLT5mc1tyczFdICsgc3JlZ3MtPmZzW3JzMl07CisJc3JlZ3MtPmZ0aW1lICs9IFRfRkFERHM7CisJYnJlYWs7CisgICAgY2FzZSBGQUREZDoKKwlzcmVncy0+ZmRbcmQgPj4gMV0gPSBzcmVncy0+ZmRbcnMxID4+IDFdICsgc3JlZ3MtPmZkW3JzMiA+PiAxXTsKKwlzcmVncy0+ZnRpbWUgKz0gVF9GQUREZDsKKwlicmVhazsKKyAgICBjYXNlIEZDTVBzOgorICAgIGNhc2UgRkNNUEVzOgorCWlmIChzcmVncy0+ZnNbcnMxXSA9PSBzcmVncy0+ZnNbcnMyXSkKKwkgICAgZmNjID0gMzsKKwllbHNlIGlmIChzcmVncy0+ZnNbcnMxXSA8IHNyZWdzLT5mc1tyczJdKQorCSAgICBmY2MgPSAyOworCWVsc2UgaWYgKHNyZWdzLT5mc1tyczFdID4gc3JlZ3MtPmZzW3JzMl0pCisJICAgIGZjYyA9IDE7CisJZWxzZQorCSAgICBmY2MgPSAwOworCXNyZWdzLT5mc3IgfD0gMHgwQzAwOworCXNyZWdzLT5mc3IgJj0gfihmY2MgPDwgMTApOworCXNyZWdzLT5mdGltZSArPSBUX0ZDTVBzOworCXNyZWdzLT5mcmQgPSAzMjsJLyogcmQgaWdub3JlZCAqLworCWlmICgoZmNjID09IDApICYmIChvcGYgPT0gRkNNUEVzKSkgeworCSAgICBzcmVncy0+ZnBzdGF0ZSA9IEZQX0VYQ19QRTsKKwkgICAgc3JlZ3MtPmZzciA9IChzcmVncy0+ZnNyICYgfjB4MUMwMDApIHwgKDEgPDwgMTQpOworCX0KKwlicmVhazsKKyAgICBjYXNlIEZDTVBkOgorICAgIGNhc2UgRkNNUEVkOgorCWlmIChzcmVncy0+ZmRbcnMxID4+IDFdID09IHNyZWdzLT5mZFtyczIgPj4gMV0pCisJICAgIGZjYyA9IDM7CisJZWxzZSBpZiAoc3JlZ3MtPmZkW3JzMSA+PiAxXSA8IHNyZWdzLT5mZFtyczIgPj4gMV0pCisJICAgIGZjYyA9IDI7CisJZWxzZSBpZiAoc3JlZ3MtPmZkW3JzMSA+PiAxXSA+IHNyZWdzLT5mZFtyczIgPj4gMV0pCisJICAgIGZjYyA9IDE7CisJZWxzZQorCSAgICBmY2MgPSAwOworCXNyZWdzLT5mc3IgfD0gMHgwQzAwOworCXNyZWdzLT5mc3IgJj0gfihmY2MgPDwgMTApOworCXNyZWdzLT5mdGltZSArPSBUX0ZDTVBkOworCXNyZWdzLT5mcmQgPSAzMjsJLyogcmQgaWdub3JlZCAqLworCWlmICgoZmNjID09IDApICYmIChvcGYgPT0gRkNNUEVkKSkgeworCSAgICBzcmVncy0+ZnBzdGF0ZSA9IEZQX0VYQ19QRTsKKwkgICAgc3JlZ3MtPmZzciA9IChzcmVncy0+ZnNyICYgfkZTUl9UVCkgfCBGUF9JRUVFOworCX0KKwlicmVhazsKKyAgICBjYXNlIEZESVZzOgorCXNyZWdzLT5mc1tyZF0gPSBzcmVncy0+ZnNbcnMxXSAvIHNyZWdzLT5mc1tyczJdOworCXNyZWdzLT5mdGltZSArPSBUX0ZESVZzOworCWJyZWFrOworICAgIGNhc2UgRkRJVmQ6CisJc3JlZ3MtPmZkW3JkID4+IDFdID0gc3JlZ3MtPmZkW3JzMSA+PiAxXSAvIHNyZWdzLT5mZFtyczIgPj4gMV07CisJc3JlZ3MtPmZ0aW1lICs9IFRfRkRJVmQ7CisJYnJlYWs7CisgICAgY2FzZSBGTU9WczoKKwlzcmVncy0+ZnNbcmRdID0gc3JlZ3MtPmZzW3JzMl07CisJc3JlZ3MtPmZ0aW1lICs9IFRfRk1PVnM7CisJc3JlZ3MtPmZyczEgPSAzMjsJLyogcnMxIGlnbm9yZWQgKi8KKwlicmVhazsKKyAgICBjYXNlIEZNVUxzOgorCXNyZWdzLT5mc1tyZF0gPSBzcmVncy0+ZnNbcnMxXSAqIHNyZWdzLT5mc1tyczJdOworCXNyZWdzLT5mdGltZSArPSBUX0ZNVUxzOworCWJyZWFrOworICAgIGNhc2UgRk1VTGQ6CisJc3JlZ3MtPmZkW3JkID4+IDFdID0gc3JlZ3MtPmZkW3JzMSA+PiAxXSAqIHNyZWdzLT5mZFtyczIgPj4gMV07CisJc3JlZ3MtPmZ0aW1lICs9IFRfRk1VTGQ7CisJYnJlYWs7CisgICAgY2FzZSBGTkVHczoKKwlzcmVncy0+ZnNbcmRdID0gLXNyZWdzLT5mc1tyczJdOworCXNyZWdzLT5mdGltZSArPSBUX0ZORUdzOworCXNyZWdzLT5mcnMxID0gMzI7CS8qIHJzMSBpZ25vcmVkICovCisJYnJlYWs7CisgICAgY2FzZSBGU1FSVHM6CisJaWYgKHNyZWdzLT5mc1tyczJdIDwgMC4wKSB7CisJICAgIHNyZWdzLT5mcHN0YXRlID0gRlBfRVhDX1BFOworCSAgICBzcmVncy0+ZnNyID0gKHNyZWdzLT5mc3IgJiB+RlNSX1RUKSB8IEZQX0lFRUU7CisJICAgIHNyZWdzLT5mc3IgPSAoc3JlZ3MtPmZzciAmIDB4MWYpIHwgMHgxMDsKKwkgICAgYnJlYWs7CisJfQorCXNyZWdzLT5mc1tyZF0gPSBzcXJ0KHNyZWdzLT5mc1tyczJdKTsKKwlzcmVncy0+ZnRpbWUgKz0gVF9GU1FSVHM7CisJc3JlZ3MtPmZyczEgPSAzMjsJLyogcnMxIGlnbm9yZWQgKi8KKwlicmVhazsKKyAgICBjYXNlIEZTUVJUZDoKKwlpZiAoc3JlZ3MtPmZkW3JzMiA+PiAxXSA8IDAuMCkgeworCSAgICBzcmVncy0+ZnBzdGF0ZSA9IEZQX0VYQ19QRTsKKwkgICAgc3JlZ3MtPmZzciA9IChzcmVncy0+ZnNyICYgfkZTUl9UVCkgfCBGUF9JRUVFOworCSAgICBzcmVncy0+ZnNyID0gKHNyZWdzLT5mc3IgJiAweDFmKSB8IDB4MTA7CisJICAgIGJyZWFrOworCX0KKwlzcmVncy0+ZmRbcmQgPj4gMV0gPSBzcXJ0KHNyZWdzLT5mZFtyczIgPj4gMV0pOworCXNyZWdzLT5mdGltZSArPSBUX0ZTUVJUZDsKKwlzcmVncy0+ZnJzMSA9IDMyOwkvKiByczEgaWdub3JlZCAqLworCWJyZWFrOworICAgIGNhc2UgRlNVQnM6CisJc3JlZ3MtPmZzW3JkXSA9IHNyZWdzLT5mc1tyczFdIC0gc3JlZ3MtPmZzW3JzMl07CisJc3JlZ3MtPmZ0aW1lICs9IFRfRlNVQnM7CisJYnJlYWs7CisgICAgY2FzZSBGU1VCZDoKKwlzcmVncy0+ZmRbcmQgPj4gMV0gPSBzcmVncy0+ZmRbcnMxID4+IDFdIC0gc3JlZ3MtPmZkW3JzMiA+PiAxXTsKKwlzcmVncy0+ZnRpbWUgKz0gVF9GU1VCZDsKKwlicmVhazsKKyAgICBjYXNlIEZkVE9pOgorCXNyZWdzLT5mc2lbcmRdID0gKGludCkgc3JlZ3MtPmZkW3JzMiA+PiAxXTsKKwlzcmVncy0+ZnRpbWUgKz0gVF9GZFRPaTsKKwlzcmVncy0+ZnJzMSA9IDMyOwkvKiByczEgaWdub3JlZCAqLworCWJyZWFrOworICAgIGNhc2UgRmRUT3M6CisJc3JlZ3MtPmZzW3JkXSA9IChmbG9hdDMyKSBzcmVncy0+ZmRbcnMyID4+IDFdOworCXNyZWdzLT5mdGltZSArPSBUX0ZkVE9zOworCXNyZWdzLT5mcnMxID0gMzI7CS8qIHJzMSBpZ25vcmVkICovCisJYnJlYWs7CisgICAgY2FzZSBGaVRPczoKKwlzcmVncy0+ZnNbcmRdID0gKGZsb2F0MzIpIHNyZWdzLT5mc2lbcnMyXTsKKwlzcmVncy0+ZnRpbWUgKz0gVF9GaVRPczsKKwlzcmVncy0+ZnJzMSA9IDMyOwkvKiByczEgaWdub3JlZCAqLworCWJyZWFrOworICAgIGNhc2UgRmlUT2Q6CisJc3JlZ3MtPmZkW3JkID4+IDFdID0gKGZsb2F0NjQpIHNyZWdzLT5mc2lbcnMyXTsKKwlzcmVncy0+ZnRpbWUgKz0gVF9GaVRPZDsKKwlzcmVncy0+ZnJzMSA9IDMyOwkvKiByczEgaWdub3JlZCAqLworCWJyZWFrOworICAgIGNhc2UgRnNUT2k6CisJc3JlZ3MtPmZzaVtyZF0gPSAoaW50KSBzcmVncy0+ZnNbcnMyXTsKKwlzcmVncy0+ZnRpbWUgKz0gVF9Gc1RPaTsKKwlzcmVncy0+ZnJzMSA9IDMyOwkvKiByczEgaWdub3JlZCAqLworCWJyZWFrOworICAgIGNhc2UgRnNUT2Q6CisJc3JlZ3MtPmZkW3JkID4+IDFdID0gc3JlZ3MtPmZzW3JzMl07CisJc3JlZ3MtPmZ0aW1lICs9IFRfRnNUT2Q7CisJc3JlZ3MtPmZyczEgPSAzMjsJLyogcnMxIGlnbm9yZWQgKi8KKwlicmVhazsKKworICAgIGRlZmF1bHQ6CisJc3JlZ3MtPmZzciA9IChzcmVncy0+ZnNyICYgfkZTUl9UVCkgfCBGUF9VTklNUDsKKwlzcmVncy0+ZnBzdGF0ZSA9IEZQX0VYQ19QRTsKKyAgICB9CisKKyNpZmRlZiBFUlJJTkoKKyAgICBpZiAoZXJyZnR0KSB7CisJc3JlZ3MtPmZzciA9IChzcmVncy0+ZnNyICYgfkZTUl9UVCkgfCAoZXJyZnR0IDw8IDE0KTsKKwlzcmVncy0+ZnBzdGF0ZSA9IEZQX0VYQ19QRTsKKwlpZiAoc2lzX3ZlcmJvc2UpIHByaW50ZigiSW5zZXJ0ZWQgZnB1IGVycm9yICVYXG4iLGVycmZ0dCk7CisJZXJyZnR0ID0gMDsKKyAgICB9CisjZW5kaWYKKworICAgIGFjY2V4ID0gZ2V0X2FjY2V4KCk7CisKKyNpZmRlZiBIT1NUX0xJVFRMRV9FTkRJQU5fRkxPQVQKKyAgICBzd2l0Y2ggKG9wZikgeworICAgIGNhc2UgRkFERGQ6CisgICAgY2FzZSBGRElWZDoKKyAgICBjYXNlIEZNVUxkOgorICAgIGNhc2UgRlNRUlRkOgorICAgIGNhc2UgRlNVQmQ6CisgICAgY2FzZSBGaVRPZDoKKyAgICBjYXNlIEZzVE9kOgorCXNyZWdzLT5mc1tyZCAmIH4xXSA9IHNyZWdzLT5mZHBbcmQgfCAxXTsKKwlzcmVncy0+ZnNbcmQgfCAxXSA9IHNyZWdzLT5mZHBbcmQgJiB+MV07CisgICAgZGVmYXVsdDoKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoc3JlZ3MtPmZwc3RhdGUgPT0gRlBfRVhDX1BFKSB7CisJc3JlZ3MtPmZwcVswXSA9IHNyZWdzLT5wYzsKKwlzcmVncy0+ZnBxWzFdID0gc3JlZ3MtPmluc3Q7CisJc3JlZ3MtPmZzciB8PSBGU1JfUU5FOworICAgIH0gZWxzZSB7CisJdGVtID0gKHNyZWdzLT5mc3IgPj4gMjMpICYgMHgxZjsKKwlpZiAodGVtICYgYWNjZXgpIHsKKwkgICAgc3JlZ3MtPmZwc3RhdGUgPSBGUF9FWENfUEU7CisJICAgIHNyZWdzLT5mc3IgPSAoc3JlZ3MtPmZzciAmIH5GU1JfVFQpIHwgRlBfSUVFRTsKKwkgICAgc3JlZ3MtPmZzciA9ICgoc3JlZ3MtPmZzciAmIH4weDFmKSB8IGFjY2V4KTsKKwl9IGVsc2UgeworCSAgICBzcmVncy0+ZnNyID0gKCgoKHNyZWdzLT5mc3IgPj4gNSkgfCBhY2NleCkgPDwgNSkgfCBhY2NleCk7CisJfQorCWlmIChzcmVncy0+ZnBzdGF0ZSA9PSBGUF9FWENfUEUpIHsKKwkgICAgc3JlZ3MtPmZwcVswXSA9IHNyZWdzLT5wYzsKKwkgICAgc3JlZ3MtPmZwcVsxXSA9IHNyZWdzLT5pbnN0OworCSAgICBzcmVncy0+ZnNyIHw9IEZTUl9RTkU7CisJfQorICAgIH0KKyAgICBjbGVhcl9hY2NleCgpOworCisgICAgcmV0dXJuICgwKTsKKworCit9CisKK3N0YXRpYyBpbnQKK2Noa19hc2koc3JlZ3MsIGFzaSwgb3AzKQorICAgIHN0cnVjdCBwc3RhdGUgICpzcmVnczsKKyAgICB1aW50MzIgKmFzaSwgb3AzOworCit7CisgICAgaWYgKCEoc3JlZ3MtPnBzciAmIFBTUl9TKSkgeworCXNyZWdzLT50cmFwID0gVFJBUF9QUklWSTsKKwlyZXR1cm4gKDApOworICAgIH0gZWxzZSBpZiAoc3JlZ3MtPmluc3QgJiBJTlNUX0kpIHsKKwlzcmVncy0+dHJhcCA9IFRSQVBfVU5JTVA7CisJcmV0dXJuICgwKTsKKyAgICB9IGVsc2UKKwkqYXNpID0gKHNyZWdzLT5pbnN0ID4+IDUpICYgMHgwZmY7CisgICAgcmV0dXJuKDEpOworfQorCitpbnQKK2V4ZWN1dGVfdHJhcChzcmVncykKKyAgICBzdHJ1Y3QgcHN0YXRlICAqc3JlZ3M7Cit7CisgICAgaW50MzIgICAgICAgICAgIGN3cDsKKworICAgIGlmIChzcmVncy0+dHJhcCA9PSAyNTYpIHsKKwlzcmVncy0+cGMgPSAwOworCXNyZWdzLT5ucGMgPSA0OworCXNyZWdzLT50cmFwID0gMDsKKyAgICB9IGVsc2UgaWYgKHNyZWdzLT50cmFwID09IDI1NykgeworCSAgICByZXR1cm4gKEVSUk9SKTsKKyAgICB9IGVsc2UgeworCisJaWYgKChzcmVncy0+cHNyICYgUFNSX0VUKSA9PSAwKQorCSAgICByZXR1cm4gKEVSUk9SKTsKKworCXNyZWdzLT50YnIgPSAoc3JlZ3MtPnRiciAmIDB4ZmZmZmYwMDApIHwgKHNyZWdzLT50cmFwIDw8IDQpOworCXNyZWdzLT50cmFwID0gMDsKKwlzcmVncy0+cHNyICY9IH5QU1JfRVQ7CisJc3JlZ3MtPnBzciB8PSAoKHNyZWdzLT5wc3IgJiBQU1JfUykgPj4gMSk7CisJc3JlZ3MtPmFubnVsID0gMDsKKwlzcmVncy0+cHNyID0gKCgoc3JlZ3MtPnBzciAmIFBTUl9DV1ApIC0gMSkgJiAweDcpIHwgKHNyZWdzLT5wc3IgJiB+UFNSX0NXUCk7CisJY3dwID0gKChzcmVncy0+cHNyICYgUFNSX0NXUCkgPDwgNCk7CisJc3JlZ3MtPnJbKGN3cCArIDE3KSAmIDB4N2ZdID0gc3JlZ3MtPnBjOworCXNyZWdzLT5yWyhjd3AgKyAxOCkgJiAweDdmXSA9IHNyZWdzLT5ucGM7CisJc3JlZ3MtPnBzciB8PSBQU1JfUzsKKwlzcmVncy0+cGMgPSBzcmVncy0+dGJyOworCXNyZWdzLT5ucGMgPSBzcmVncy0+dGJyICsgNDsKKworICAgICAgICBpZiAoIDAgIT0gKDEgJiBzcmVncy0+YXNyMTcpICkgeworICAgICAgICAgICAgLyogc2luZ2xlIHZlY3RvciB0cmFwcGluZyEgKi8KKyAgICAgICAgICAgIHNyZWdzLT5wYyA9IHNyZWdzLT50YnIgJiAweGZmZmZmMDAwOworICAgICAgICAgICAgc3JlZ3MtPm5wYyA9IHNyZWdzLT5wYyArIDQ7CisgICAgICAgIH0KKworCS8qIEluY3JlYXNlIHNpbXVsYXRvciB0aW1lICovCisJc3JlZ3MtPmljbnQgPSBUUkFQX0M7CisKKyAgICB9CisKKworICAgIHJldHVybiAoMCk7CisKK30KKworZXh0ZXJuIHN0cnVjdCBpcnFjZWxsIGlycWFyclsxNl07CisKK2ludAorY2hlY2tfaW50ZXJydXB0cyhzcmVncykKKyAgICBzdHJ1Y3QgcHN0YXRlICAqc3JlZ3M7Cit7CisjaWZkZWYgRVJSSU5KCisgICAgaWYgKGVycnR0KSB7CisJc3JlZ3MtPnRyYXAgPSBlcnJ0dDsKKwlpZiAoc2lzX3ZlcmJvc2UpIHByaW50ZigiSW5zZXJ0ZWQgZXJyb3IgdHJhcCAweCUwMlhcbiIsZXJydHQpOworCWVycnR0ID0gMDsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICgoZXh0X2lybCkgJiYgKHNyZWdzLT5wc3IgJiBQU1JfRVQpICYmCisJKChleHRfaXJsID09IDE1KSB8fCAoZXh0X2lybCA+IChpbnQpICgoc3JlZ3MtPnBzciAmIFBTUl9QSUwpID4+IDgpKSkpIHsKKwlpZiAoc3JlZ3MtPnRyYXAgPT0gMCkgeworCSAgICBzcmVncy0+dHJhcCA9IDE2ICsgZXh0X2lybDsKKwkgICAgaXJxYXJyW2V4dF9pcmwgJiAweDBmXS5jYWxsYmFjayhpcnFhcnJbZXh0X2lybCAmIDB4MGZdLmFyZyk7CisJICAgIHJldHVybigxKTsKKwl9CisgICAgfQorICAgIHJldHVybigwKTsKK30KKwordm9pZAoraW5pdF9yZWdzKHNyZWdzKQorICAgIHN0cnVjdCBwc3RhdGUgICpzcmVnczsKK3sKKyAgICBzcmVncy0+cGMgPSAwOworICAgIHNyZWdzLT5ucGMgPSA0OworICAgIHNyZWdzLT50cmFwID0gMDsKKyAgICBzcmVncy0+cHNyICY9IDB4MDBmMDNmZGY7CisgICAgc3JlZ3MtPnBzciB8PSAweDA4MDsJLyogU2V0IHN1cGVydmlzb3IgYml0ICovCisgICAgc3JlZ3MtPmJyZWFrcG9pbnQgPSAwOworICAgIHNyZWdzLT5hbm51bCA9IDA7CisgICAgc3JlZ3MtPmZwc3RhdGUgPSBGUF9FWEVfTU9ERTsKKyAgICBzcmVncy0+ZnBxbiA9IDA7CisgICAgc3JlZ3MtPmZ0aW1lID0gMDsKKyAgICBzcmVncy0+bHRpbWUgPSAwOworICAgIHNyZWdzLT5lcnJfbW9kZSA9IDA7CisgICAgZXh0X2lybCA9IDA7CisgICAgc3JlZ3MtPmdbMF0gPSAwOworI2lmZGVmIEhPU1RfTElUVExFX0VORElBTl9GTE9BVAorICAgIHNyZWdzLT5mZHAgPSAoZmxvYXQzMiAqKSBzcmVncy0+ZmQ7CisgICAgc3JlZ3MtPmZzaSA9IChpbnQzMiAqKSBzcmVncy0+ZnM7CisjZWxzZQorICAgIHNyZWdzLT5mcyA9IChmbG9hdDMyICopIHNyZWdzLT5mZDsKKyAgICBzcmVncy0+ZnNpID0gKGludDMyICopIHNyZWdzLT5mZDsKKyNlbmRpZgorICAgIHNyZWdzLT5mc3IgPSAwOworICAgIHNyZWdzLT5mcHVfcHJlcyA9ICFuZnA7CisgICAgc2V0X2ZzcihzcmVncy0+ZnNyKTsKKyAgICBzcmVncy0+YnBoaXQgPSAwOworICAgIHNyZWdzLT5pbGRyZWcgPSAwOworICAgIHNyZWdzLT5pbGR0aW1lID0gMDsKKworICAgIHNyZWdzLT55ID0gMDsKKyAgICBzcmVncy0+YXNyMTcgPSAwOworCisgICAgc3JlZ3MtPnJldHRfZXJyID0gMDsKKyAgICBzcmVncy0+am1wbHRpbWUgPSAwOworfQpkaWZmIC0tZ2l0IGEvc2ltL2VyYzMyL2Zsb2F0LmMgYi9zaW0vZXJjMzIvZmxvYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTJmNDFlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2VyYzMyL2Zsb2F0LmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBTSVMuCisgKgorICogU0lTLCBTUEFSQyBpbnN0cnVjdGlvbiBzaW11bGF0b3IuIENvcHlyaWdodCAoQykgMTk5NSBKaXJpIEdhaXNsZXIsIEV1cm9wZWFuCisgKiBTcGFjZSBBZ2VuY3kKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NQorICogTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKgorICogVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBob3N0IGFuZCB0aGUgc2ltdWxhdGVkCisgKiBGUFUuIElFRUUgdHJhcCBoYW5kbGluZyBpcyBkb25lIGFzIGZvbGxvd3M6IAorICogMS4gSW4gdGhlIGhvc3QsIGFsbCBJRUVFIHRyYXBzIGFyZSBtYXNrZWQKKyAqIDIuIEFmdGVyIGVhY2ggc2ltdWxhdGVkIEZQVSBpbnN0cnVjdGlvbiwgY2hlY2sgaWYgYW55IGV4Y2VwdGlvbiBvY2N1cmVkIAorICogICAgYnkgcmVhZGluZyB0aGUgZXhjZXB0aW9uIGJpdHMgZnJvbSB0aGUgaG9zdCBGUFUgc3RhdHVzIHJlZ2lzdGVyIAorICogICAgKGdldF9hY2NleCgpKS4KKyAqIDMuIFByb3BhZ2F0ZSBhbnkgZXhjZXB0aW9ucyB0byB0aGUgc2ltdWxhdGVkIEZTUi4KKyAqIDQuIENsZWFyIGhvc3QgZXhjZXB0aW9uIGJpdHMKKyAqCisgKgorICogVGhpcyBjYW4gYWxzbyBiZSBkb25lIHVzaW5nIGllZWVfZmxhZ3MoKSBsaWJyYXJ5IHJvdXRpbmUgb24gc3VuLgorICovCisKKyNpbmNsdWRlICJzaXMuaCIKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KKworZXh0ZXJuIHVpbnQzMglfZ2V0X3N3IFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB1aW50MzIJX2dldF9jdyBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZAlfX3NldGZwdWN3IFBBUkFNUyAoKHVuc2lnbmVkIHNob3J0IGZwdV9jb250cm9sKSk7CisKKy8qIFRoaXMgaG9zdCBkZXBlbmRlbnQgcm91dGluZSBzaG91bGQgcmV0dXJuIHRoZSBhY2NydWVkIGV4Y2VwdGlvbnMgKi8KK2ludAorZ2V0X2FjY2V4KCkKK3sKKyNpZmRlZiBzcGFyYworICAgIHJldHVybiAoKF9nZXRfZnNyX3JhdygpID4+IDUpICYgMHgxRik7CisjZWxpZiBpMzg2CisgICAgdWludDMyIGFjY3g7CisKKyAgICBhY2N4ID0gX2dldF9zdygpICYgMHgzZjsKKyAgICBhY2N4ID0gKChhY2N4ICYgMSkgPDwgNCkgfCAoKGFjY3ggJiAyKSA+PiAxKSB8ICgoYWNjeCAmIDQpID4+IDEpIHwKKwkgICAoYWNjeCAmIDgpIHwgKChhY2N4ICYgMTYpID4+IDIpIHwgKChhY2N4ICYgMzIpID4+IDUpOworICAgIHJldHVybihhY2N4KTsKKyNlbHNlCisgICAgcmV0dXJuKDApOworI3dhcm5pbmcgbm8gZnB1IHRyYXAgc3VwcG9ydCBmb3IgdGhpcyB0YXJnZXQKKyNlbmRpZgorCit9CisKKy8qIEhvdyB0byBjbGVhciB0aGUgYWNjcnVlZCBleGNlcHRpb25zICovCit2b2lkCitjbGVhcl9hY2NleCgpCit7CisjaWZkZWYgc3BhcmMKKyAgICBzZXRfZnNyKChfZ2V0X2Zzcl9yYXcoKSAmIH4weDNlMCkpOworI2VsaWYgaTM4NgorICAgIGFzbSgiCisudGV4dAorCWZuY2xleAorCisgICAgIik7CisjZWxzZQorI3dhcm5pbmcgbm8gZnB1IHRyYXAgc3VwcG9ydCBmb3IgdGhpcyB0YXJnZXQKKyNlbmRpZgorfQorCisvKiBIb3cgdG8gbWFwIFNQQVJDIEZTUiBvbnRvIHRoZSBob3N0ICovCit2b2lkCitzZXRfZnNyKGZzcikKK3VpbnQzMiBmc3I7Cit7CisjaWZkZWYgc3BhcmMKKwlfc2V0X2Zzcl9yYXcoZnNyICYgfjB4MGY4MDAwMDApOworI2VsaWYgaTM4NgorICAgICB2b2lkIF9fc2V0ZnB1Y3codW5zaWduZWQgc2hvcnQgZnB1X2NvbnRyb2wpOworICAgICB1aW50MzIgcmF3ZnNyOworCisgICAgIGZzciA+Pj0gMzA7CisgICAgIHN3aXRjaCAoZnNyKSB7CisJY2FzZSAwOiAKKwljYXNlIDI6IGJyZWFrOworCWNhc2UgMTogZnNyID0gMzsKKwljYXNlIDM6IGZzciA9IDE7CisgICAgIH0KKyAgICAgcmF3ZnNyID0gX2dldF9jdygpOworICAgICByYXdmc3IgfD0gKGZzciA8PCAxMCkgfCAweDNmZjsKKyAgICAgX19zZXRmcHVjdyhyYXdmc3IpOworI2Vsc2UKKyN3YXJuaW5nIG5vIGZwdSB0cmFwIHN1cHBvcnQgZm9yIHRoaXMgdGFyZ2V0CisjZW5kaWYKK30KKworCisvKiBIb3N0IGRlcGVuZGVudCBzdXBwb3J0IGZ1bmN0aW9ucyAqLworCisjaWZkZWYgc3BhcmMKKworICAgIGFzbSgiCisKKy50ZXh0CisgICAgICAgIC5hbGlnbiA0CisgICAgICAgIC5nbG9iYWwgX19zZXRfZnNyX3Jhdyxfc2V0X2Zzcl9yYXcKK19fc2V0X2Zzcl9yYXc6Citfc2V0X2Zzcl9yYXc6CisgICAgICAgIHNhdmUgJXNwLC0xMDQsJXNwCisgICAgICAgIHN0ICVpMCxbJWZwKzY4XQorICAgICAgICBsZCBbJWZwKzY4XSwgJWZzcgorICAgICAgICBtb3YgMCwlaTAKKyAgICAgICAgcmV0CisgICAgICAgIHJlc3RvcmUKKyAKKyAgICAgICAgLmFsaWduIDQKKyAgICAgICAgLmdsb2JhbCBfX2dldF9mc3JfcmF3CisgICAgICAgIC5nbG9iYWwgX2dldF9mc3JfcmF3CitfX2dldF9mc3JfcmF3OgorX2dldF9mc3JfcmF3OgorICAgICAgICBzYXZlICVzcCwtMTA0LCVzcAorICAgICAgICBzdCAlZnNyLFslZnArNjhdCisgICAgICAgIGxkIFslZnArNjhdLCAlaTAKKyAgICAgICAgcmV0CisgICAgICAgIHJlc3RvcmUKKyAKKyAgICAiKTsKKworI2VsaWYgaTM4NgorCisgICAgYXNtKCIKKworLnRleHQKKyAgICAgICAgLmFsaWduIDgKKy5nbG9ibCBfZ2V0X3N3LF9fZ2V0X3N3CitfX2dldF9zdzoKK19nZXRfc3c6CisgICAgICAgIHB1c2hsICVlYnAKKyAgICAgICAgbW92bCAlZXNwLCVlYnAKKyAgICAgICAgbW92bCAkMCwlZWF4CisgICAgICAgIGZuc3RzdyAlYXgKKyAgICAgICAgbW92bCAlZWJwLCVlc3AKKyAgICAgICAgcG9wbCAlZWJwCisgICAgICAgIHJldAorCisgICAgICAgIC5hbGlnbiA4CisuZ2xvYmwgX2dldF9jdyxfX2dldF9jdworX19nZXRfY3c6CitfZ2V0X2N3OgorICAgICAgICBwdXNobCAlZWJwCisgICAgICAgIG1vdmwgJWVzcCwlZWJwCisgICAgICAgIHN1YncgJDIsJWVzcAorICAgICAgICBmbnN0Y3cgLTIoJWVicCkKKyAgICAgICAgbW92dyAtMiglZWJwKSwlZWF4CisgICAgICAgIG1vdmwgJWVicCwlZXNwCisgICAgICAgIHBvcGwgJWVicAorICAgICAgICByZXQKKworCisgICAgIik7CisKKworI2Vsc2UKKyN3YXJuaW5nIG5vIGZwdSB0cmFwIHN1cHBvcnQgZm9yIHRoaXMgdGFyZ2V0CisjZW5kaWYKKworI2lmIGkzODYKKy8qICNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fR08zMl9fICovCisvKiBUaGlzIGlzIHNvIGZsb2F0aW5nIGV4Y2VwdGlvbiBoYW5kbGluZyB3b3JrcyBvbiBOVAorICAgVGhlc2UgZGVmaW5pdGlvbnMgYXJlIGZyb20gdGhlIGxpbnV4IGZwdV9jb250cm9sLmgsIHdoaWNoCisgICBkb2Vzbid0IGV4aXN0IG9uIE5ULgorCisgICBkZWZhdWx0IHRvOgorICAgICAtIGV4dGVuZGVkIHByZWNpc2lvbgorICAgICAtIHJvdW5kaW5nIHRvIG5lYXJlc3QKKyAgICAgLSBleGNlcHRpb25zIG9uIG92ZXJmbG93LCB6ZXJvIGRpdmlkZSBhbmQgTmFOCisqLworI2RlZmluZSBfRlBVX0RFRkFVTFQgIDB4MTM3MiAKKyNkZWZpbmUgX0ZQVV9SRVNFUlZFRCAweEYwQzAgIC8qIFJlc2VydmVkIGJpdHMgaW4gY3cgKi8KKworc3RhdGljIHZvaWQKK19fc2V0ZnB1Y3codW5zaWduZWQgc2hvcnQgZnB1X2NvbnRyb2wpCit7CisgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGN3OworCisgIC8qIElmIHVzZXIgc3VwcGxpZWQgX2ZwdV9jb250cm9sLCB1c2UgaXQgISAqLworICBpZiAoIWZwdV9jb250cm9sKQorICB7IAorICAgIC8qIHVzZSBkZWZhdWx0cyAqLworICAgIGZwdV9jb250cm9sID0gX0ZQVV9ERUZBVUxUOworICB9CisgIC8qIEdldCBDb250cm9sIFdvcmQgKi8KKyAgX19hc21fXyB2b2xhdGlsZSAoImZuc3RjdyAlMCIgOiAiPW0iIChjdykgOiApOworICAKKyAgLyogbWFzayBpbiAqLworICBjdyAmPSBfRlBVX1JFU0VSVkVEOworICBjdyA9IGN3IHwgKGZwdV9jb250cm9sICYgfl9GUFVfUkVTRVJWRUQpOworCisgIC8qIHNldCBjdyAqLworICBfX2FzbV9fIHZvbGF0aWxlICgiZmxkY3cgJTAiIDo6ICJtIiAoY3cpKTsKK30KKy8qICNlbmRpZiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvZnVuYy5jIGIvc2ltL2VyYzMyL2Z1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTRiZWViCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2VyYzMyL2Z1bmMuYwpAQCAtMCwwICsxLDExNjIgQEAKKy8qCisgKiBmdW5jLmMsIG1pc2Mgc2ltdWxhdG9yIGZ1bmN0aW9ucy4gVGhpcyBmaWxlIGlzIHBhcnQgb2YgU0lTLgorICogCisgKiBTSVMsIFNQQVJDIGluc3RydWN0aW9uIHNpbXVsYXRvciBWMS44IENvcHlyaWdodCAoQykgMTk5NSBKaXJpIEdhaXNsZXIsCisgKiBFdXJvcGVhbiBTcGFjZSBBZ2VuY3kKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NQorICogTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqIAorICovCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAic2lzLmgiCisjaW5jbHVkZSAiZW5kLmgiCisjaW5jbHVkZSA8ZGlzLWFzbS5oPgorI2luY2x1ZGUgInNpbS1jb25maWcuaCIKKworCisjZGVmaW5lCVZBTCh4KQlzdHJ0b3VsKHgsKGNoYXIgKiopTlVMTCwwKQorCitleHRlcm4gaW50CWN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXI7CitzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyBkaW5mbzsKK3N0cnVjdCBwc3RhdGUgICBzcmVnczsKK2V4dGVybiBzdHJ1Y3QgZXN0YXRlIGViYXNlOworaW50ICAgICAgICAgICAgIGN0cmxfYyA9IDA7CitpbnQgICAgICAgICAgICAgc2lzX3ZlcmJvc2UgPSAwOworY2hhciAgICAgICAgICAgKnNpc192ZXJzaW9uID0gIjIuNy41IjsKK2ludCAgICAgICAgICAgICBuZnAgPSAwOworaW50ICAgICAgICAgICAgIGlmdCA9IDA7CitpbnQgICAgICAgICAgICAgd3JwID0gMDsKK2ludCAgICAgICAgICAgICByb204ID0gMDsKK2ludCAgICAgICAgICAgICB1YmVuID0gMDsKK2ludAkJdGVybXNhdmU7CitpbnQgICAgICAgICAgICAgc3BhcmNsaXRlID0gMDsJCS8qIGVtdWxhdGluZyBTUEFSQ2xpdGUgaW5zdHJ1Y3Rpb25zPyAqLworaW50ICAgICAgICAgICAgIHNwYXJjbGl0ZV9ib2FyZCA9IDA7CS8qIGVtdWxhdGluZyBTUEFSQ2xpdGUgYm9hcmQgUkFNPyAqLworY2hhciAgICAgICAgICAgIHVhcnRfZGV2MVsxMjhdID0gIiI7CitjaGFyICAgICAgICAgICAgdWFydF9kZXYyWzEyOF0gPSAiIjsKK2V4dGVybglpbnQJZXh0X2lybDsKK3VpbnQzMgkJbGFzdF9sb2FkX2FkZHIgPSAwOworCisjaWZkZWYgRVJSSU5KCit1aW50MzIJCWVycmNudCA9IDA7Cit1aW50MzIJCWVycnBlciA9IDA7Cit1aW50MzIJCWVycnR0ID0gMDsKK3VpbnQzMgkJZXJyZnR0ID0gMDsKK3VpbnQzMgkJZXJybWVjID0gMDsKKyNlbmRpZgorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworCitzdGF0aWMgaW50CWJhdGNoIFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgKnNyZWdzLCBjaGFyICpmbmFtZSkpOworc3RhdGljIHZvaWQJc2V0X3JlZ2EgUEFSQU1TICgoc3RydWN0IHBzdGF0ZSAqc3JlZ3MsIGNoYXIgKnJlZywgdWludDMyIHJ2YWwpKTsKK3N0YXRpYyB2b2lkCWRpc3BfcmVnIFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgKnNyZWdzLCBjaGFyICpyZWcpKTsKK3N0YXRpYyB1aW50MzIJbGltY2FsYyBQQVJBTVMgKChmbG9hdDMyIGZyZXEpKTsKK3N0YXRpYyB2b2lkCWludF9oYW5kbGVyIFBBUkFNUyAoKGludDMyIHNpZykpOworc3RhdGljIHZvaWQJaW5pdF9ldmVudCBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgaW50CWRpc3BfZnB1IFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgICpzcmVncykpOworc3RhdGljIHZvaWQJZGlzcF9yZWdzIFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgICpzcmVncywgaW50IGN3cCkpOworc3RhdGljIHZvaWQJZGlzcF9jdHJsIFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgKnNyZWdzKSk7CitzdGF0aWMgdm9pZAlkaXNwX21lbSBQQVJBTVMgKCh1aW50MzIgYWRkciwgdWludDMyIGxlbikpOworCitzdGF0aWMgaW50IAorYmF0Y2goc3JlZ3MsIGZuYW1lKQorICAgIHN0cnVjdCBwc3RhdGUgICpzcmVnczsKKyAgICBjaGFyICAgICAgICAgICAqZm5hbWU7Cit7CisgICAgRklMRSAgICAgICAgICAgKmZwOworICAgIGNoYXIgICAgICAgICAgICBsYnVmWzEwMjRdOworCisgICAgaWYgKChmcCA9IGZvcGVuKGZuYW1lLCAiciIpKSA9PSBOVUxMKSB7CisJZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBvcGVuIGJhdGNoIGZpbGUgJXNcbiIsIGZuYW1lKTsKKwlyZXR1cm4gKDApOworICAgIH0KKyAgICB3aGlsZSAoIWZlb2YoZnApKSB7CisJbGJ1ZlswXSA9IDA7CisJZmdldHMobGJ1ZiwgMTAyMywgZnApOworCWlmICgoc3RybGVuKGxidWYpID4gMCkgJiYgKGxidWZbc3RybGVuKGxidWYpIC0gMV0gPT0gJ1xuJykpCisJICAgIGxidWZbc3RybGVuKGxidWYpIC0gMV0gPSAwOworCXByaW50Zigic2lzPiAlc1xuIiwgbGJ1Zik7CisJZXhlY19jbWQoc3JlZ3MsIGxidWYpOworICAgIH0KKyAgICBmY2xvc2UoZnApOworICAgIHJldHVybiAoMSk7Cit9CisKK3ZvaWQKK3NldF9yZWdpKHNyZWdzLCByZWcsIHJ2YWwpCisgICAgc3RydWN0IHBzdGF0ZSAgKnNyZWdzOworICAgIGludDMyICAgICAgICAgICByZWc7CisgICAgdWludDMyICAgICAgICAgIHJ2YWw7Cit7CisgICAgdWludDMyICAgICAgICAgIGN3cDsKKworICAgIGN3cCA9ICgoc3JlZ3MtPnBzciAmIDB4NykgPDwgNCk7CisgICAgaWYgKChyZWcgPiAwKSAmJiAocmVnIDwgOCkpIHsKKwlzcmVncy0+Z1tyZWddID0gcnZhbDsKKyAgICB9IGVsc2UgaWYgKChyZWcgPj0gOCkgJiYgKHJlZyA8IDMyKSkgeworCXNyZWdzLT5yWyhjd3AgKyByZWcpICYgMHg3Zl0gPSBydmFsOworICAgIH0gZWxzZSBpZiAoKHJlZyA+PSAzMikgJiYgKHJlZyA8IDY0KSkgeworCXNyZWdzLT5mc2lbcmVnIC0gMzJdID0gcnZhbDsKKyAgICB9IGVsc2UgeworCXN3aXRjaCAocmVnKSB7CisJY2FzZSA2NDoKKwkgICAgc3JlZ3MtPnkgPSBydmFsOworCSAgICBicmVhazsKKwljYXNlIDY1OgorCSAgICBzcmVncy0+cHNyID0gcnZhbDsKKwkgICAgYnJlYWs7CisJY2FzZSA2NjoKKwkgICAgc3JlZ3MtPndpbSA9IHJ2YWw7CisJICAgIGJyZWFrOworCWNhc2UgNjc6CisJICAgIHNyZWdzLT50YnIgPSBydmFsOworCSAgICBicmVhazsKKwljYXNlIDY4OgorCSAgICBzcmVncy0+cGMgPSBydmFsOworCSAgICBicmVhazsKKwljYXNlIDY5OgorCSAgICBzcmVncy0+bnBjID0gcnZhbDsKKwkgICAgYnJlYWs7CisJY2FzZSA3MDoKKwkgICAgc3JlZ3MtPmZzciA9IHJ2YWw7CisJICAgIHNldF9mc3IocnZhbCk7CisJICAgIGJyZWFrOworICAgIGRlZmF1bHQ6YnJlYWs7CisJfQorICAgIH0KK30KKwordm9pZAorZ2V0X3JlZ2koc3RydWN0IHBzdGF0ZSAqIHNyZWdzLCBpbnQzMiByZWcsIGNoYXIgKmJ1ZikKK3sKKyAgICB1aW50MzIgICAgICAgICAgY3dwOworICAgIHVpbnQzMiAgICAgICAgICBydmFsID0gMDsKKworICAgIGN3cCA9ICgoc3JlZ3MtPnBzciAmIDB4NykgPDwgNCk7CisgICAgaWYgKChyZWcgPj0gMCkgJiYgKHJlZyA8IDgpKSB7CisJcnZhbCA9IHNyZWdzLT5nW3JlZ107CisgICAgfSBlbHNlIGlmICgocmVnID49IDgpICYmIChyZWcgPCAzMikpIHsKKwlydmFsID0gc3JlZ3MtPnJbKGN3cCArIHJlZykgJiAweDdmXTsKKyAgICB9IGVsc2UgaWYgKChyZWcgPj0gMzIpICYmIChyZWcgPCA2NCkpIHsKKwlydmFsID0gc3JlZ3MtPmZzaVtyZWcgLSAzMl07CisgICAgfSBlbHNlIHsKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgNjQ6CisJICAgIHJ2YWwgPSBzcmVncy0+eTsKKwkgICAgYnJlYWs7CisJY2FzZSA2NToKKwkgICAgcnZhbCA9IHNyZWdzLT5wc3I7CisJICAgIGJyZWFrOworCWNhc2UgNjY6CisJICAgIHJ2YWwgPSBzcmVncy0+d2ltOworCSAgICBicmVhazsKKwljYXNlIDY3OgorCSAgICBydmFsID0gc3JlZ3MtPnRicjsKKwkgICAgYnJlYWs7CisJY2FzZSA2ODoKKwkgICAgcnZhbCA9IHNyZWdzLT5wYzsKKwkgICAgYnJlYWs7CisJY2FzZSA2OToKKwkgICAgcnZhbCA9IHNyZWdzLT5ucGM7CisJICAgIGJyZWFrOworCWNhc2UgNzA6CisJICAgIHJ2YWwgPSBzcmVncy0+ZnNyOworCSAgICBicmVhazsKKyAgICBkZWZhdWx0OmJyZWFrOworCX0KKyAgICB9CisgICAgaWYgKGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIgPT0gQklHX0VORElBTikgeworCWJ1ZlswXSA9IChydmFsID4+IDI0KSAmIDB4MGZmOworCWJ1ZlsxXSA9IChydmFsID4+IDE2KSAmIDB4MGZmOworCWJ1ZlsyXSA9IChydmFsID4+IDgpICYgMHgwZmY7CisJYnVmWzNdID0gcnZhbCAmIDB4MGZmOworICAgIH0KKyAgICBlbHNlIHsKKwlidWZbM10gPSAocnZhbCA+PiAyNCkgJiAweDBmZjsKKwlidWZbMl0gPSAocnZhbCA+PiAxNikgJiAweDBmZjsKKwlidWZbMV0gPSAocnZhbCA+PiA4KSAmIDB4MGZmOworCWJ1ZlswXSA9IHJ2YWwgJiAweDBmZjsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3NldF9yZWdhKHNyZWdzLCByZWcsIHJ2YWwpCisgICAgc3RydWN0IHBzdGF0ZSAgKnNyZWdzOworICAgIGNoYXIgICAgICAgICAgICpyZWc7CisgICAgdWludDMyICAgICAgICAgIHJ2YWw7Cit7CisgICAgdWludDMyICAgICAgICAgIGN3cDsKKyAgICBpbnQzMiAgICAgICAgICAgZXJyID0gMDsKKworICAgIGN3cCA9ICgoc3JlZ3MtPnBzciAmIDB4NykgPDwgNCk7CisgICAgaWYgKHN0cmNtcChyZWcsICJwc3IiKSA9PSAwKQorCXNyZWdzLT5wc3IgPSAocnZhbCA9IChydmFsICYgMHgwMGYwM2ZmZikpOworICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJ0YnIiKSA9PSAwKQorCXNyZWdzLT50YnIgPSAocnZhbCA9IChydmFsICYgMHhmZmZmZmZmMCkpOworICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJ3aW0iKSA9PSAwKQorCXNyZWdzLT53aW0gPSAocnZhbCA9IChydmFsICYgMHgwZmYpKTsKKyAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAieSIpID09IDApCisJc3JlZ3MtPnkgPSBydmFsOworICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJwYyIpID09IDApCisJc3JlZ3MtPnBjID0gcnZhbDsKKyAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAibnBjIikgPT0gMCkKKwlzcmVncy0+bnBjID0gcnZhbDsKKyAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAiZnNyIikgPT0gMCkgeworCXNyZWdzLT5mc3IgPSBydmFsOworCXNldF9mc3IocnZhbCk7CisgICAgfSBlbHNlIGlmIChzdHJjbXAocmVnLCAiZzAiKSA9PSAwKQorCWVyciA9IDI7CisgICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImcxIikgPT0gMCkKKwlzcmVncy0+Z1sxXSA9IHJ2YWw7CisgICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImcyIikgPT0gMCkKKwlzcmVncy0+Z1syXSA9IHJ2YWw7CisgICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImczIikgPT0gMCkKKwlzcmVncy0+Z1szXSA9IHJ2YWw7CisgICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImc0IikgPT0gMCkKKwlzcmVncy0+Z1s0XSA9IHJ2YWw7CisgICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImc1IikgPT0gMCkKKwlzcmVncy0+Z1s1XSA9IHJ2YWw7CisgICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImc2IikgPT0gMCkKKwlzcmVncy0+Z1s2XSA9IHJ2YWw7CisgICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImc3IikgPT0gMCkKKwlzcmVncy0+Z1s3XSA9IHJ2YWw7CisgICAgZWxzZSBpZiAoc3RyY21wKHJlZywgIm8wIikgPT0gMCkKKwlzcmVncy0+clsoY3dwICsgOCkgJiAweDdmXSA9IHJ2YWw7CisgICAgZWxzZSBpZiAoc3RyY21wKHJlZywgIm8xIikgPT0gMCkKKwlzcmVncy0+clsoY3dwICsgOSkgJiAweDdmXSA9IHJ2YWw7CisgICAgZWxzZSBpZiAoc3RyY21wKHJlZywgIm8yIikgPT0gMCkKKwlzcmVncy0+clsoY3dwICsgMTApICYgMHg3Zl0gPSBydmFsOworICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJvMyIpID09IDApCisJc3JlZ3MtPnJbKGN3cCArIDExKSAmIDB4N2ZdID0gcnZhbDsKKyAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAibzQiKSA9PSAwKQorCXNyZWdzLT5yWyhjd3AgKyAxMikgJiAweDdmXSA9IHJ2YWw7CisgICAgZWxzZSBpZiAoc3RyY21wKHJlZywgIm81IikgPT0gMCkKKwlzcmVncy0+clsoY3dwICsgMTMpICYgMHg3Zl0gPSBydmFsOworICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJvNiIpID09IDApCisJc3JlZ3MtPnJbKGN3cCArIDE0KSAmIDB4N2ZdID0gcnZhbDsKKyAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAibzciKSA9PSAwKQorCXNyZWdzLT5yWyhjd3AgKyAxNSkgJiAweDdmXSA9IHJ2YWw7CisgICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImwwIikgPT0gMCkKKwlzcmVncy0+clsoY3dwICsgMTYpICYgMHg3Zl0gPSBydmFsOworICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJsMSIpID09IDApCisJc3JlZ3MtPnJbKGN3cCArIDE3KSAmIDB4N2ZdID0gcnZhbDsKKyAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAibDIiKSA9PSAwKQorCXNyZWdzLT5yWyhjd3AgKyAxOCkgJiAweDdmXSA9IHJ2YWw7CisgICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImwzIikgPT0gMCkKKwlzcmVncy0+clsoY3dwICsgMTkpICYgMHg3Zl0gPSBydmFsOworICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJsNCIpID09IDApCisJc3JlZ3MtPnJbKGN3cCArIDIwKSAmIDB4N2ZdID0gcnZhbDsKKyAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAibDUiKSA9PSAwKQorCXNyZWdzLT5yWyhjd3AgKyAyMSkgJiAweDdmXSA9IHJ2YWw7CisgICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImw2IikgPT0gMCkKKwlzcmVncy0+clsoY3dwICsgMjIpICYgMHg3Zl0gPSBydmFsOworICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJsNyIpID09IDApCisJc3JlZ3MtPnJbKGN3cCArIDIzKSAmIDB4N2ZdID0gcnZhbDsKKyAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAiaTAiKSA9PSAwKQorCXNyZWdzLT5yWyhjd3AgKyAyNCkgJiAweDdmXSA9IHJ2YWw7CisgICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImkxIikgPT0gMCkKKwlzcmVncy0+clsoY3dwICsgMjUpICYgMHg3Zl0gPSBydmFsOworICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJpMiIpID09IDApCisJc3JlZ3MtPnJbKGN3cCArIDI2KSAmIDB4N2ZdID0gcnZhbDsKKyAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAiaTMiKSA9PSAwKQorCXNyZWdzLT5yWyhjd3AgKyAyNykgJiAweDdmXSA9IHJ2YWw7CisgICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImk0IikgPT0gMCkKKwlzcmVncy0+clsoY3dwICsgMjgpICYgMHg3Zl0gPSBydmFsOworICAgIGVsc2UgaWYgKHN0cmNtcChyZWcsICJpNSIpID09IDApCisJc3JlZ3MtPnJbKGN3cCArIDI5KSAmIDB4N2ZdID0gcnZhbDsKKyAgICBlbHNlIGlmIChzdHJjbXAocmVnLCAiaTYiKSA9PSAwKQorCXNyZWdzLT5yWyhjd3AgKyAzMCkgJiAweDdmXSA9IHJ2YWw7CisgICAgZWxzZSBpZiAoc3RyY21wKHJlZywgImk3IikgPT0gMCkKKwlzcmVncy0+clsoY3dwICsgMzEpICYgMHg3Zl0gPSBydmFsOworICAgIGVsc2UKKwllcnIgPSAxOworICAgIHN3aXRjaCAoZXJyKSB7CisgICAgY2FzZSAwOgorCXByaW50ZigiJXMgPSAlZCAoMHglMDh4KVxuIiwgcmVnLCBydmFsLCBydmFsKTsKKwlicmVhazsKKyAgICBjYXNlIDE6CisJcHJpbnRmKCJubyBzdWNoIHJlZ2lzZXI6ICVzXG4iLCByZWcpOworCWJyZWFrOworICAgIGNhc2UgMjoKKwlwcmludGYoImNhbm5vdCBzZXQgZzBcbiIpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJYnJlYWs7CisgICAgfQorCit9CisKK3N0YXRpYyB2b2lkCitkaXNwX3JlZyhzcmVncywgcmVnKQorICAgIHN0cnVjdCBwc3RhdGUgICpzcmVnczsKKyAgICBjaGFyICAgICAgICAgICAqcmVnOworeworICAgIGlmIChzdHJuY21wKHJlZywgInciLDEpID09IDApCisJZGlzcF9yZWdzKHNyZWdzLCBWQUwoJnJlZ1sxXSkpOworfQorCisjaWZkZWYgRVJSSU5KCisKK3ZvaWQKK2VycmluaigpCit7CisgICAgaW50CWVycjsKKworICAgIHN3aXRjaCAoZXJyID0gKHJhbmRvbSgpICUgMTIpKSB7CisJY2FzZSAwOiBlcnJ0dCA9IDB4NjE7IGJyZWFrOworCWNhc2UgMTogZXJydHQgPSAweDYyOyBicmVhazsKKwljYXNlIDI6IGVycnR0ID0gMHg2MzsgYnJlYWs7CisJY2FzZSAzOiBlcnJ0dCA9IDB4NjQ7IGJyZWFrOworCWNhc2UgNDogZXJydHQgPSAweDY1OyBicmVhazsKKwljYXNlIDU6IAorCWNhc2UgNjogCisJY2FzZSA3OiBlcnJmdHQgPSBlcnI7IAorCQlicmVhazsKKwljYXNlIDg6IGVycm1lYyA9IDE7IGJyZWFrOworCWNhc2UgOTogZXJybWVjID0gMjsgYnJlYWs7CisJY2FzZSAxMDogZXJybWVjID0gNTsgYnJlYWs7CisJY2FzZSAxMTogZXJybWVjID0gNjsgYnJlYWs7CisgICAgfQorICAgIGVycmNudCsrOworICAgIGlmIChlcnJwZXIpIGV2ZW50KGVycmluaiwgMCwgKHJhbmRvbSgpJWVycnBlcikpOworfQorCit2b2lkCitlcnJpbmpzdGFydCgpCit7CisgICAgaWYgKGVycnBlcikgZXZlbnQoZXJyaW5qLCAwLCAocmFuZG9tKCklZXJycGVyKSk7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgdWludDMyCitsaW1jYWxjIChmcmVxKQorICAgIGZsb2F0MzIJCWZyZXE7Cit7CisgICAgdWludDMyICAgICAgICAgIHVuaXQsIGxpbTsKKyAgICBkb3VibGUJICAgIGZsaW07CisgICAgY2hhciAgICAgICAgICAgKmNtZDEsICpjbWQyOworCisgICAgdW5pdCA9IDE7CisgICAgbGltID0gLTE7CisgICAgaWYgKChjbWQxID0gc3RydG9rKE5VTEwsICIgXHRcblxyIikpICE9IE5VTEwpIHsKKyAgICAgICAgbGltID0gVkFMKGNtZDEpOworICAgICAgICBpZiAoKGNtZDIgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHN0cmNtcChjbWQyLCJ1cyIpPT0wKSB1bml0ID0gMTsKKyAgICAgIAkgICAgaWYgKHN0cmNtcChjbWQyLCJtcyIpPT0wKSB1bml0ID0gMTAwMDsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoY21kMiwicyIpPT0wKSAgdW5pdCA9IDEwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgZmxpbSA9IChkb3VibGUpIGxpbSAqIChkb3VibGUpIHVuaXQgKiAoZG91YmxlKSBmcmVxICsgCisJICAgKGRvdWJsZSkgZWJhc2Uuc2ltdGltZTsKKyAgICAgICAgaWYgKChmbGltID4gZWJhc2Uuc2ltdGltZSkgJiYgKGZsaW0gPCA0Mjk0OTY3Mjk2LjApKSB7CisgICAgICAgICAgICBsaW0gPSAodWludDMyKSBmbGltOworICAgICAgICB9IGVsc2UgIHsKKyAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gZXhwcmVzc2lvblxuIik7CisgICAgICAgICAgICBsaW0gPSAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKGxpbSk7Cit9CisgICAgCitpbnQKK2V4ZWNfY21kKHNyZWdzLCBjbWQpCisgICAgY2hhciAgICAgICAgICAgKmNtZDsKKyAgICBzdHJ1Y3QgcHN0YXRlICAqc3JlZ3M7Cit7CisgICAgY2hhciAgICAgICAgICAgKmNtZDEsICpjbWQyOworICAgIGludDMyICAgICAgICAgICBzdGF0OworICAgIHVpbnQzMiAgICAgICAgICBsZW4sIGksIGNsZW4sIGo7CisgICAgc3RhdGljIHVpbnQzMiAgIGRhZGRyID0gMDsKKyAgICBjaGFyICAgICAgICAgICAqY21kc2F2ZTsKKworICAgIHN0YXQgPSBPSzsKKyAgICBjbWRzYXZlID0gc3RyZHVwKGNtZCk7CisgICAgaWYgKChjbWQxID0gc3RydG9rKGNtZCwgIiBcdCIpKSAhPSBOVUxMKSB7CisJY2xlbiA9IHN0cmxlbihjbWQxKTsKKwlpZiAoc3RybmNtcChjbWQxLCAiYnAiLCBjbGVuKSA9PSAwKSB7CisJICAgIGZvciAoaSA9IDA7IGkgPCBzcmVncy0+YnB0bnVtOyBpKyspIHsKKwkJcHJpbnRmKCIgICVkIDogMHglMDh4XG4iLCBpICsgMSwgc3JlZ3MtPmJwdHNbaV0pOworCSAgICB9CisJfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICIrYnAiLCBjbGVuKSA9PSAwKSB7CisJICAgIGlmICgoY21kMSA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpKSAhPSBOVUxMKSB7CisJCXNyZWdzLT5icHRzW3NyZWdzLT5icHRudW1dID0gVkFMKGNtZDEpICYgfjB4MzsKKwkJcHJpbnRmKCJhZGRlZCBicmVha3BvaW50ICVkIGF0IDB4JTA4eFxuIiwKKwkJICAgICAgIHNyZWdzLT5icHRudW0gKyAxLCBzcmVncy0+YnB0c1tzcmVncy0+YnB0bnVtXSk7CisJCXNyZWdzLT5icHRudW0gKz0gMTsKKwkgICAgfQorCX0gZWxzZSBpZiAoc3RybmNtcChjbWQxLCAiLWJwIiwgY2xlbikgPT0gMCkgeworCSAgICBpZiAoKGNtZDEgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgIT0gTlVMTCkgeworCQlpID0gVkFMKGNtZDEpIC0gMTsKKwkJaWYgKChpID49IDApICYmIChpIDwgc3JlZ3MtPmJwdG51bSkpIHsKKwkJICAgIHByaW50ZigiZGVsZXRlZCBicmVha3BvaW50ICVkIGF0IDB4JTA4eFxuIiwgaSArIDEsCisJCQkgICBzcmVncy0+YnB0c1tpXSk7CisJCSAgICBmb3IgKDsgaSA8IHNyZWdzLT5icHRudW0gLSAxOyBpKyspIHsKKwkJCXNyZWdzLT5icHRzW2ldID0gc3JlZ3MtPmJwdHNbaSArIDFdOworCQkgICAgfQorCQkgICAgc3JlZ3MtPmJwdG51bSAtPSAxOworCQl9CisJICAgIH0KKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgImJhdGNoIiwgY2xlbikgPT0gMCkgeworCSAgICBpZiAoKGNtZDEgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgPT0gTlVMTCkgeworCQlwcmludGYoIm5vIGZpbGUgc3BlY2lmaWVkXG4iKTsKKwkgICAgfSBlbHNlIHsKKwkJYmF0Y2goc3JlZ3MsIGNtZDEpOworCSAgICB9CisJfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICJjb250IiwgY2xlbikgPT0gMCkgeworCSAgICBpZiAoKGNtZDEgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgPT0gTlVMTCkgeworCQlzdGF0ID0gcnVuX3NpbShzcmVncywgLTEsIDApOworCSAgICB9IGVsc2UgeworCQlzdGF0ID0gcnVuX3NpbShzcmVncywgVkFMKGNtZDEpLCAwKTsKKwkgICAgfQorCSAgICBkYWRkciA9IHNyZWdzLT5wYzsKKwkgICAgc2ltX2hhbHQoKTsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgImRlYnVnIiwgY2xlbikgPT0gMCkgeworCSAgICBpZiAoKGNtZDEgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgIT0gTlVMTCkgeworCQlzaXNfdmVyYm9zZSA9IFZBTChjbWQxKTsKKwkgICAgfQorCSAgICBwcmludGYoIkRlYnVnIGxldmVsID0gJWRcbiIsc2lzX3ZlcmJvc2UpOworCX0gZWxzZSBpZiAoc3RybmNtcChjbWQxLCAiZGlzIiwgY2xlbikgPT0gMCkgeworCSAgICBpZiAoKGNtZDEgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgIT0gTlVMTCkgeworCQlkYWRkciA9IFZBTChjbWQxKTsKKwkgICAgfQorCSAgICBpZiAoKGNtZDIgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgIT0gTlVMTCkgeworCQlsZW4gPSBWQUwoY21kMik7CisJICAgIH0gZWxzZQorCQlsZW4gPSAxNjsKKwkgICAgcHJpbnRmKCJcbiIpOworCSAgICBkaXNfbWVtKGRhZGRyLCBsZW4sICZkaW5mbyk7CisJICAgIHByaW50ZigiXG4iKTsKKwkgICAgZGFkZHIgKz0gbGVuICogNDsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgImVjaG8iLCBjbGVuKSA9PSAwKSB7CisJICAgIGlmICgoY21kMSA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpKSAhPSBOVUxMKSB7CisJCXByaW50ZigiJXNcbiIsICgmY21kc2F2ZVtjbGVuKzFdKSk7CisJICAgIH0KKyNpZmRlZiBFUlJJTkoKKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgImVycm9yIiwgY2xlbikgPT0gMCkgeworCSAgICBpZiAoKGNtZDEgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgIT0gTlVMTCkgeworCQllcnJwZXIgPSBWQUwoY21kMSk7CisJICAgICAgICBpZiAoZXJycGVyKSB7CisJCSAgICBldmVudChlcnJpbmosIDAsIChsZW4gPSAocmFuZG9tKCklZXJycGVyKSkpOworCQkgICAgcHJpbnRmKCJFcnJvciBpbmplY3Rpb24gc3RhcnRlZCB3aXRoIHBlcmlvZCAlZFxuIixsZW4pOworCSAgICAgICAgfSAKKwkgICAgIH0gZWxzZSBwcmludGYoIkluamVjdGVkIGVycm9yczogJWRcbiIsZXJyY250KTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoc3RybmNtcChjbWQxLCAiZmxvYXQiLCBjbGVuKSA9PSAwKSB7CisJICAgIHN0YXQgPSBkaXNwX2ZwdShzcmVncyk7CisJfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICJnbyIsIGNsZW4pID09IDApIHsKKwkgICAgaWYgKChjbWQxID0gc3RydG9rKE5VTEwsICIgXHRcblxyIikpID09IE5VTEwpIHsKKwkJbGVuID0gbGFzdF9sb2FkX2FkZHI7CisJICAgIH0gZWxzZSB7CisJCWxlbiA9IFZBTChjbWQxKTsKKwkgICAgfQorCSAgICBzcmVncy0+cGMgPSBsZW4gJiB+MzsKKwkgICAgc3JlZ3MtPm5wYyA9IHNyZWdzLT5wYyArIDQ7CisJICAgIHByaW50ZigicmVzdW1pbmcgYXQgMHglMDh4XG4iLHNyZWdzLT5wYyk7CisJICAgIGlmICgoY21kMiA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpKSAhPSBOVUxMKSB7CisJCXN0YXQgPSBydW5fc2ltKHNyZWdzLCBWQUwoY21kMiksIDApOworCSAgICB9IGVsc2UgeworCQlzdGF0ID0gcnVuX3NpbShzcmVncywgLTEsIDApOworCSAgICB9CisJICAgIGRhZGRyID0gc3JlZ3MtPnBjOworCSAgICBzaW1faGFsdCgpOworCX0gZWxzZSBpZiAoc3RybmNtcChjbWQxLCAiaGVscCIsIGNsZW4pID09IDApIHsKKwkgICAgZ2VuX2hlbHAoKTsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgImhpc3RvcnkiLCBjbGVuKSA9PSAwKSB7CisJICAgIGlmICgoY21kMSA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpKSAhPSBOVUxMKSB7CisJCXNyZWdzLT5oaXN0bGVuID0gVkFMKGNtZDEpOworCQlpZiAoc3JlZ3MtPmhpc3RidWYgIT0gTlVMTCkKKwkJICAgIGZyZWUoc3JlZ3MtPmhpc3RidWYpOworCQlzcmVncy0+aGlzdGJ1ZiA9IChzdHJ1Y3QgaGlzdHlwZSAqKSBjYWxsb2Moc3JlZ3MtPmhpc3RsZW4sIHNpemVvZihzdHJ1Y3QgaGlzdHlwZSkpOworCQlwcmludGYoInRyYWNlIGhpc3RvcnkgbGVuZ3RoID0gJWRcblxyIiwgc3JlZ3MtPmhpc3RsZW4pOworCQlzcmVncy0+aGlzdGluZCA9IDA7CisKKwkgICAgfSBlbHNlIHsKKwkJaiA9IHNyZWdzLT5oaXN0aW5kOworCQlmb3IgKGkgPSAwOyBpIDwgc3JlZ3MtPmhpc3RsZW47IGkrKykgeworCQkgICAgaWYgKGogPj0gc3JlZ3MtPmhpc3RsZW4pCisJCQlqID0gMDsKKwkJICAgIHByaW50ZigiICU4ZCAiLCBzcmVncy0+aGlzdGJ1ZltqXS50aW1lKTsKKwkJICAgIGRpc19tZW0oc3JlZ3MtPmhpc3RidWZbal0uYWRkciwgMSwgJmRpbmZvKTsKKwkJICAgIGorKzsKKwkJfQorCSAgICB9CisKKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgImxvYWQiLCBjbGVuKSA9PSAwKSB7CisJICAgIGlmICgoY21kMSA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpKSAhPSBOVUxMKSB7CisJCWxhc3RfbG9hZF9hZGRyID0gYmZkX2xvYWQoY21kMSk7CisJCXdoaWxlICgoY21kMSA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpKSAhPSBOVUxMKQorCQkgICAgbGFzdF9sb2FkX2FkZHIgPSBiZmRfbG9hZChjbWQxKTsKKwkgICAgfSBlbHNlIHsKKwkJcHJpbnRmKCJsb2FkOiBubyBmaWxlIHNwZWNpZmllZFxuIik7CisJICAgIH0KKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgIm1lbSIsIGNsZW4pID09IDApIHsKKwkgICAgaWYgKChjbWQxID0gc3RydG9rKE5VTEwsICIgXHRcblxyIikpICE9IE5VTEwpCisJCWRhZGRyID0gVkFMKGNtZDEpOworCSAgICBpZiAoKGNtZDIgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgIT0gTlVMTCkKKwkJbGVuID0gVkFMKGNtZDIpOworCSAgICBlbHNlCisJCWxlbiA9IDY0OworCSAgICBkaXNwX21lbShkYWRkciwgbGVuKTsKKwkgICAgZGFkZHIgKz0gbGVuOworCX0gZWxzZSBpZiAoc3RybmNtcChjbWQxLCAicGVyZiIsIGNsZW4pID09IDApIHsKKwkgICAgY21kMSA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpOworCSAgICBpZiAoKGNtZDEgIT0gTlVMTCkgJiYKKwkJKHN0cm5jbXAoY21kMSwgInJlc2V0Iiwgc3RybGVuKGNtZDEpKSA9PSAwKSkgeworCQlyZXNldF9zdGF0KHNyZWdzKTsKKwkgICAgfSBlbHNlCisJCXNob3dfc3RhdChzcmVncyk7CisJfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICJxdWl0IiwgY2xlbikgPT0gMCkgeworCSAgICBleGl0KDApOworCX0gZWxzZSBpZiAoc3RybmNtcChjbWQxLCAicmVnIiwgY2xlbikgPT0gMCkgeworCSAgICBjbWQxID0gc3RydG9rKE5VTEwsICIgXHRcblxyIik7CisJICAgIGNtZDIgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKTsKKwkgICAgaWYgKGNtZDIgIT0gTlVMTCkKKwkJc2V0X3JlZ2Eoc3JlZ3MsIGNtZDEsIFZBTChjbWQyKSk7CisJICAgIGVsc2UgaWYgKGNtZDEgIT0gTlVMTCkKKwkJZGlzcF9yZWcoc3JlZ3MsIGNtZDEpOworCSAgICBlbHNlIHsKKwkJZGlzcF9yZWdzKHNyZWdzLHNyZWdzLT5wc3IpOworCQlkaXNwX2N0cmwoc3JlZ3MpOworCSAgICB9CisJfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICJyZXNldCIsIGNsZW4pID09IDApIHsKKwkgICAgZWJhc2Uuc2ltdGltZSA9IDA7CisJICAgIHJlc2V0X2FsbCgpOworCSAgICByZXNldF9zdGF0KHNyZWdzKTsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgInJ1biIsIGNsZW4pID09IDApIHsKKwkgICAgZWJhc2Uuc2ltdGltZSA9IDA7CisJICAgIHJlc2V0X2FsbCgpOworCSAgICByZXNldF9zdGF0KHNyZWdzKTsKKwkgICAgaWYgKChjbWQxID0gc3RydG9rKE5VTEwsICIgXHRcblxyIikpID09IE5VTEwpIHsKKwkJc3RhdCA9IHJ1bl9zaW0oc3JlZ3MsIC0xLCAwKTsKKwkgICAgfSBlbHNlIHsKKwkJc3RhdCA9IHJ1bl9zaW0oc3JlZ3MsIFZBTChjbWQxKSwgMCk7CisJICAgIH0KKwkgICAgZGFkZHIgPSBzcmVncy0+cGM7CisJICAgIHNpbV9oYWx0KCk7CisJfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICJzaGVsbCIsIGNsZW4pID09IDApIHsKKwkgICAgaWYgKChjbWQxID0gc3RydG9rKE5VTEwsICIgXHRcblxyIikpICE9IE5VTEwpIHsKKwkJc3lzdGVtKCZjbWRzYXZlW2NsZW5dKTsKKwkgICAgfQorCX0gZWxzZSBpZiAoc3RybmNtcChjbWQxLCAic3RlcCIsIGNsZW4pID09IDApIHsKKwkgICAgc3RhdCA9IHJ1bl9zaW0oc3JlZ3MsIDEsIDEpOworCSAgICBkYWRkciA9IHNyZWdzLT5wYzsKKwkgICAgc2ltX2hhbHQoKTsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kMSwgInRjb250IiwgY2xlbikgPT0gMCkgeworCSAgICBzcmVncy0+dGxpbWl0ID0gbGltY2FsYyhzcmVncy0+ZnJlcSk7CisJICAgIHN0YXQgPSBydW5fc2ltKHNyZWdzLCAtMSwgMCk7CisJICAgIGRhZGRyID0gc3JlZ3MtPnBjOworCSAgICBzaW1faGFsdCgpOworCX0gZWxzZSBpZiAoc3RybmNtcChjbWQxLCAidGdvIiwgY2xlbikgPT0gMCkgeworCSAgICBpZiAoKGNtZDEgPSBzdHJ0b2soTlVMTCwgIiBcdFxuXHIiKSkgPT0gTlVMTCkgeworCQlsZW4gPSBsYXN0X2xvYWRfYWRkcjsKKwkgICAgfSBlbHNlIHsKKwkJbGVuID0gVkFMKGNtZDEpOworCSAgICAgICAgc3JlZ3MtPnRsaW1pdCA9IGxpbWNhbGMoc3JlZ3MtPmZyZXEpOworCSAgICB9CisJICAgIHNyZWdzLT5wYyA9IGxlbiAmIH4zOworCSAgICBzcmVncy0+bnBjID0gc3JlZ3MtPnBjICsgNDsKKwkgICAgcHJpbnRmKCJyZXN1bWluZyBhdCAweCUwOHhcbiIsc3JlZ3MtPnBjKTsKKwkgICAgc3RhdCA9IHJ1bl9zaW0oc3JlZ3MsIC0xLCAwKTsKKwkgICAgZGFkZHIgPSBzcmVncy0+cGM7CisJICAgIHNpbV9oYWx0KCk7CisJfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICJ0bGltaXQiLCBjbGVuKSA9PSAwKSB7CisJICAgc3JlZ3MtPnRsaW1pdCA9IGxpbWNhbGMoc3JlZ3MtPmZyZXEpOworCSAgIGlmIChzcmVncy0+dGxpbWl0ICE9ICh1aW50MzIpIC0xKQorICAgICAgICAgICAgICBwcmludGYoInNpbXVsYXRpb24gbGltaXQgPSAldSAoJS4zZiBtcylcbiIsKHVpbnQzMikgc3JlZ3MtPnRsaW1pdCwKKwkJc3JlZ3MtPnRsaW1pdCAvIHNyZWdzLT5mcmVxIC8gMTAwMCk7CisJfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICJ0cmEiLCBjbGVuKSA9PSAwKSB7CisJICAgIGlmICgoY21kMSA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpKSA9PSBOVUxMKSB7CisJCXN0YXQgPSBydW5fc2ltKHNyZWdzLCAtMSwgMSk7CisJICAgIH0gZWxzZSB7CisJCXN0YXQgPSBydW5fc2ltKHNyZWdzLCBWQUwoY21kMSksIDEpOworCSAgICB9CisJICAgIHByaW50ZigiXG4iKTsKKwkgICAgZGFkZHIgPSBzcmVncy0+cGM7CisJICAgIHNpbV9oYWx0KCk7CisJfSBlbHNlIGlmIChzdHJuY21wKGNtZDEsICJ0cnVuIiwgY2xlbikgPT0gMCkgeworCSAgICBlYmFzZS5zaW10aW1lID0gMDsKKwkgICAgcmVzZXRfYWxsKCk7CisJICAgIHJlc2V0X3N0YXQoc3JlZ3MpOworCSAgICBzcmVncy0+dGxpbWl0ID0gbGltY2FsYyhzcmVncy0+ZnJlcSk7CisJICAgIHN0YXQgPSBydW5fc2ltKHNyZWdzLCAtMSwgMCk7CisJICAgIGRhZGRyID0gc3JlZ3MtPnBjOworCSAgICBzaW1faGFsdCgpOworCX0gZWxzZQorCSAgICBwcmludGYoInN5bnRheCBlcnJvclxuIik7CisgICAgfQorICAgIGlmIChjbWRzYXZlICE9IE5VTEwpCisJZnJlZShjbWRzYXZlKTsKKyAgICByZXR1cm4gKHN0YXQpOworfQorCisKK3ZvaWQKK3Jlc2V0X3N0YXQoc3JlZ3MpCisgICAgc3RydWN0IHBzdGF0ZSAgKnNyZWdzOworeworICAgIHNyZWdzLT50b3R0aW1lID0gMDsKKyAgICBzcmVncy0+cHdkdGltZSA9IDA7CisgICAgc3JlZ3MtPm5pbnN0ID0gMDsKKyAgICBzcmVncy0+ZmhvbGR0ID0gMDsKKyAgICBzcmVncy0+aG9sZHQgPSAwOworICAgIHNyZWdzLT5pY250dCA9IDA7CisgICAgc3JlZ3MtPmZpbnN0ID0gMDsKKyAgICBzcmVncy0+bnN0b3JlID0gMDsKKyAgICBzcmVncy0+bmxvYWQgPSAwOworICAgIHNyZWdzLT5uYnJhbmNoID0gMDsKKyAgICBzcmVncy0+c2ltc3RhcnQgPSBlYmFzZS5zaW10aW1lOworCit9CisKK3ZvaWQKK3Nob3dfc3RhdChzcmVncykKKyAgICBzdHJ1Y3QgcHN0YXRlICAqc3JlZ3M7Cit7CisgICAgdWludDMyICAgICAgICAgIGlpbnN0OworICAgIHVpbnQzMiAgICAgICAgICBzdGltZSwgdG90dGltZTsKKworICAgIGlmIChzcmVncy0+dG90dGltZSA9PSAwKSB0b3R0aW1lID0gMTsgZWxzZSB0b3R0aW1lID0gc3JlZ3MtPnRvdHRpbWU7CisgICAgc3RpbWUgPSBlYmFzZS5zaW10aW1lIC0gc3JlZ3MtPnNpbXN0YXJ0OwkvKiBUb3RhbCBzaW11bGF0ZWQgdGltZSAqLworI2lmZGVmIFNUQVQKKworICAgIGlpbnN0ID0gc3JlZ3MtPm5pbnN0IC0gc3JlZ3MtPmZpbnN0IC0gc3JlZ3MtPm5sb2FkIC0gc3JlZ3MtPm5zdG9yZSAtCisJc3JlZ3MtPm5icmFuY2g7CisjZW5kaWYKKworICAgIHByaW50ZigiXG4gQ3ljbGVzICAgICAgIDogJTlkXG5cciIsIGViYXNlLnNpbXRpbWUgLSBzcmVncy0+c2ltc3RhcnQpOworICAgIHByaW50ZigiIEluc3RydWN0aW9ucyA6ICU5ZFxuIiwgc3JlZ3MtPm5pbnN0KTsKKworI2lmZGVmIFNUQVQKKyAgICBwcmludGYoIiAgIGludGVnZXIgICAgOiAlOS4yZiAlJVxuIiwgMTAwLjAgKiAoZmxvYXQpIGlpbnN0IC8gKGZsb2F0KSBzcmVncy0+bmluc3QpOworICAgIHByaW50ZigiICAgbG9hZCAgICAgICA6ICU5LjJmICUlXG4iLAorCSAgIDEwMC4wICogKGZsb2F0KSBzcmVncy0+bmxvYWQgLyAoZmxvYXQpIHNyZWdzLT5uaW5zdCk7CisgICAgcHJpbnRmKCIgICBzdG9yZSAgICAgIDogJTkuMmYgJSVcbiIsCisJICAgMTAwLjAgKiAoZmxvYXQpIHNyZWdzLT5uc3RvcmUgLyAoZmxvYXQpIHNyZWdzLT5uaW5zdCk7CisgICAgcHJpbnRmKCIgICBicmFuY2ggICAgIDogJTkuMmYgJSVcbiIsCisJICAgMTAwLjAgKiAoZmxvYXQpIHNyZWdzLT5uYnJhbmNoIC8gKGZsb2F0KSBzcmVncy0+bmluc3QpOworICAgIHByaW50ZigiICAgZmxvYXQgICAgICA6ICU5LjJmICUlXG4iLAorCSAgIDEwMC4wICogKGZsb2F0KSBzcmVncy0+Zmluc3QgLyAoZmxvYXQpIHNyZWdzLT5uaW5zdCk7CisgICAgcHJpbnRmKCIgSW50ZWdlciBDUEkgIDogJTkuMmZcbiIsCisJICAgKChmbG9hdCkgKHN0aW1lIC0gc3JlZ3MtPnB3ZHRpbWUgLSBzcmVncy0+ZmhvbGR0IC0gc3JlZ3MtPmZpbnN0KSkKKwkgICAvCisJICAgKGZsb2F0KSAoc3JlZ3MtPm5pbnN0IC0gc3JlZ3MtPmZpbnN0KSk7CisgICAgcHJpbnRmKCIgRmxvYXQgQ1BJICAgIDogJTkuMmZcbiIsCisJICAgKChmbG9hdCkgc3JlZ3MtPmZob2xkdCAvIChmbG9hdCkgc3JlZ3MtPmZpbnN0KSArIDEuMCk7CisjZW5kaWYKKyAgICBwcmludGYoIiBPdmVyYWxsIENQSSAgOiAlOS4yZlxuIiwKKwkgICAoZmxvYXQpIChzdGltZSAtIHNyZWdzLT5wd2R0aW1lKSAvIChmbG9hdCkgc3JlZ3MtPm5pbnN0KTsKKyAgICBwcmludGYoIlxuIEVSQzMyIHBlcmZvcm1hbmNlICglNC4xZiBNSHopOiAlNS4yZiBNT1BTICglNS4yZiBNSVBTLCAlNS4yZiBNRkxPUFMpXG4iLAorCSAgIHNyZWdzLT5mcmVxLCBzcmVncy0+ZnJlcSAqIChmbG9hdCkgc3JlZ3MtPm5pbnN0IC8gKGZsb2F0KSAoc3RpbWUgLSBzcmVncy0+cHdkdGltZSksCisJICAgc3JlZ3MtPmZyZXEgKiAoZmxvYXQpIChzcmVncy0+bmluc3QgLSBzcmVncy0+Zmluc3QpIC8KKwkgICAoZmxvYXQpIChzdGltZSAtIHNyZWdzLT5wd2R0aW1lKSwKKyAgICAgc3JlZ3MtPmZyZXEgKiAoZmxvYXQpIHNyZWdzLT5maW5zdCAvIChmbG9hdCkgKHN0aW1lIC0gc3JlZ3MtPnB3ZHRpbWUpKTsKKyAgICBwcmludGYoIiBTaW11bGF0ZWQgRVJDMzIgdGltZSAgICAgICAgOiAlNS4yZiBtc1xuIiwgKGZsb2F0KSAoZWJhc2Uuc2ltdGltZSAtIHNyZWdzLT5zaW1zdGFydCkgLyAxMDAwLjAgLyBzcmVncy0+ZnJlcSk7CisgICAgcHJpbnRmKCIgUHJvY2Vzc29yIHV0aWxpc2F0aW9uICAgICAgIDogJTUuMmYgJSVcbiIsIDEwMC4wICogKDEuMCAtICgoZmxvYXQpIHNyZWdzLT5wd2R0aW1lIC8gKGZsb2F0KSBzdGltZSkpKTsKKyAgICBwcmludGYoIiBSZWFsLXRpbWUgLyBzaW11bGF0b3ItdGltZSAgOiAxLyUuMmYgXG4iLAorICAgICAgKChmbG9hdCkgc3JlZ3MtPnRvdHRpbWUpIC8gKChmbG9hdCkgKHN0aW1lKSAvIChzcmVncy0+ZnJlcSAqIDEuMEU2KSkpOworICAgIHByaW50ZigiIFNpbXVsYXRvciBwZXJmb3JtYW5jZSAgICAgICA6ICVkIEtJUFNcbiIsc3JlZ3MtPm5pbnN0L3RvdHRpbWUvMTAwMCk7CisgICAgcHJpbnRmKCIgVXNlZCB0aW1lIChzeXMgKyB1c2VyKSAgICAgIDogJTNkIHNcblxuIiwgc3JlZ3MtPnRvdHRpbWUpOworfQorCisKKwordm9pZAoraW5pdF9icHQoc3JlZ3MpCisgICAgc3RydWN0IHBzdGF0ZSAgKnNyZWdzOworeworICAgIHNyZWdzLT5icHRudW0gPSAwOworICAgIHNyZWdzLT5oaXN0bGVuID0gMDsKKyAgICBzcmVncy0+aGlzdGluZCA9IDA7CisgICAgc3JlZ3MtPmhpc3RidWYgPSBOVUxMOworICAgIHNyZWdzLT50bGltaXQgPSAtMTsKK30KKworc3RhdGljIHZvaWQKK2ludF9oYW5kbGVyKHNpZykKKyAgICBpbnQzMiAgICAgICAgICAgc2lnOworeworICAgIGlmIChzaWcgIT0gMikKKwlwcmludGYoIlxuXG4gU2lnbmFsIGhhbmRsZXIgZXJyb3IgICglZClcblxuIiwgc2lnKTsKKyAgICBjdHJsX2MgPSAxOworfQorCit2b2lkCitpbml0X3NpZ25hbHMoKQoreworICAgIHR5cGVkZWYgdm9pZCAgICAoKlBGSSkgKCk7CisgICAgc3RhdGljIFBGSSAgICAgIGludF90YWJbMl07CisKKyAgICBpbnRfdGFiWzBdID0gc2lnbmFsKFNJR1RFUk0sIGludF9oYW5kbGVyKTsKKyAgICBpbnRfdGFiWzFdID0gc2lnbmFsKFNJR0lOVCwgaW50X2hhbmRsZXIpOworfQorCisKK2V4dGVybiBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyBkaW5mbzsKKworc3RydWN0IGVzdGF0ZSAgIGViYXNlOworc3RydWN0IGV2Y2VsbCAgIGV2YnVmW0VWRU5UX01BWF07CitzdHJ1Y3QgaXJxY2VsbCAgaXJxYXJyWzE2XTsKKworc3RhdGljIGludAorZGlzcF9mcHUoc3JlZ3MpCisgICAgc3RydWN0IHBzdGF0ZSAgKnNyZWdzOworeworCisgICAgaW50ICAgICAgICAgaTsKKyAgICBmbG9hdAl0OworCisgICAgcHJpbnRmKCJcbiBmc3I6ICUwOFhcblxuIiwgc3JlZ3MtPmZzcik7CisKKyNpZmRlZiBIT1NUX0xJVFRMRV9FTkRJQU5fRkxPQVQKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKyAgICAgIHNyZWdzLT5mZHBbaSBeIDFdID0gc3JlZ3MtPmZzW2ldOworI2VuZGlmCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCXQgPSBzcmVncy0+ZnNbaV07CisJcHJpbnRmKCIgZiUwMmQgICUwOHggICUxNGUgICIsIGksIHNyZWdzLT5mc2lbaV0sIHNyZWdzLT5mc1tpXSk7CisJaWYgKCEoaSAmIDEpKQorCSAgICBwcmludGYoIiUxNGVcbiIsIHNyZWdzLT5mZFtpID4+IDFdKTsKKwllbHNlCisJICAgIHByaW50ZigiXG4iKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworICAgIHJldHVybiAoT0spOworfQorCitzdGF0aWMgdm9pZAorZGlzcF9yZWdzKHNyZWdzLGN3cCkKKyAgICBzdHJ1Y3QgcHN0YXRlICAqc3JlZ3M7CisgICAgaW50IGN3cDsKK3sKKworICAgIGludCAgICAgICAgICAgaTsKKworICAgIGN3cCA9ICgoY3dwICYgMHg3KSA8PCA0KTsKKyAgICBwcmludGYoIlxuXHQgIElOUyAgICAgICBMT0NBTFMgICAgICBPVVRTICAgICBHTE9CQUxTXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJcHJpbnRmKCIgICAlZDogICUwOFggICAlMDhYICAgJTA4WCAgICUwOFhcbiIsIGksCisJICAgICAgIHNyZWdzLT5yWyhjd3AgKyBpICsgMjQpICYgMHg3Zl0sCisJICAgIHNyZWdzLT5yWyhjd3AgKyBpICsgMTYpICYgMHg3Zl0sIHNyZWdzLT5yWyhjd3AgKyBpICsgOCkgJiAweDdmXSwKKwkgICAgICAgc3JlZ3MtPmdbaV0pOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2Rpc3BfY3RybChzcmVncykKKyAgICBzdHJ1Y3QgcHN0YXRlICAqc3JlZ3M7Cit7CisKKyAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgICBpWzRdOworCisgICAgcHJpbnRmKCJcbiBwc3I6ICUwOFggICB3aW06ICUwOFggICB0YnI6ICUwOFggICB5OiAlMDhYXG4iLAorCSAgIHNyZWdzLT5wc3IsIHNyZWdzLT53aW0sIHNyZWdzLT50YnIsIHNyZWdzLT55KTsKKyAgICBzaXNfbWVtb3J5X3JlYWQoc3JlZ3MtPnBjLCBpLCA0KTsKKyAgICBwcmludGYoIlxuICBwYzogJTA4WCA9ICUwMlglMDJYJTAyWCUwMlggICAgIiwgc3JlZ3MtPnBjLGlbMF0saVsxXSxpWzJdLGlbM10pOworICAgIHByaW50X2luc25fc3BhcmMoc3JlZ3MtPnBjLCAmZGluZm8pOworICAgIHNpc19tZW1vcnlfcmVhZChzcmVncy0+bnBjLCBpLCA0KTsKKyAgICBwcmludGYoIlxuIG5wYzogJTA4WCA9ICUwMlglMDJYJTAyWCUwMlggICAgIixzcmVncy0+bnBjLGlbMF0saVsxXSxpWzJdLGlbM10pOworICAgIHByaW50X2luc25fc3BhcmMoc3JlZ3MtPm5wYywgJmRpbmZvKTsKKyAgICBpZiAoc3JlZ3MtPmVycl9tb2RlKQorCXByaW50ZigiXG4gSVUgaW4gZXJyb3IgbW9kZSIpOworICAgIHByaW50ZigiXG5cbiIpOworfQorCitzdGF0aWMgdm9pZAorZGlzcF9tZW0oYWRkciwgbGVuKQorICAgIHVpbnQzMiAgICAgICAgICBhZGRyOworICAgIHVpbnQzMiAgICAgICAgICBsZW47Cit7CisKKyAgICB1aW50MzIgICAgICAgICAgaTsKKyAgICB1bnNpZ25lZCBjaGFyICAgZGF0YVs0XTsKKyAgICB1aW50MzIgICAgICAgICAgbWVtWzRdLCBqOworICAgIGNoYXIgICAgICAgICAgICpwOworCisgICAgZm9yIChpID0gYWRkciAmIH4zOyBpIDwgKChhZGRyICsgbGVuKSAmIH4zKTsgaSArPSAxNikgeworCXByaW50ZigiXG4gJThYICAiLCBpKTsKKwlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisJICAgIHNpc19tZW1vcnlfcmVhZCgoaSArIChqICogNCkpLCBkYXRhLCA0KTsKKwkgICAgcHJpbnRmKCIlMDJ4JTAyeCUwMnglMDJ4ICAiLCBkYXRhWzBdLGRhdGFbMV0sZGF0YVsyXSxkYXRhWzNdKTsKKwkgICAgbWVtW2pdID0gKigoaW50ICopICZkYXRhKTsKKwl9CisJcHJpbnRmKCIgICIpOworCXAgPSAoY2hhciAqKSBtZW07CisJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKwkgICAgaWYgKGlzcHJpbnQocFtqXSkpCisJCXB1dGNoYXIocFtqXSk7CisJICAgIGVsc2UKKwkJcHV0Y2hhcignLicpOworCX0KKyAgICB9CisgICAgcHJpbnRmKCJcblxuIik7Cit9CisKK3ZvaWQKK2Rpc19tZW0oYWRkciwgbGVuLCBpbmZvKQorICAgIHVpbnQzMiAgICAgICAgICBhZGRyOworICAgIHVpbnQzMiAgICAgICAgICBsZW47CisgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisgICAgdWludDMyICAgICAgICAgIGk7CisgICAgdW5zaWduZWQgY2hhciAgIGRhdGFbNF07CisKKyAgICBmb3IgKGkgPSBhZGRyICYgLTM7IGkgPCAoKGFkZHIgJiAtMykgKyAobGVuIDw8IDIpKTsgaSArPSA0KSB7CisJc2lzX21lbW9yeV9yZWFkKGksIGRhdGEsIDQpOworCXByaW50ZigiICUwOHggICUwMnglMDJ4JTAyeCUwMnggICIsIGksIGRhdGFbMF0sZGF0YVsxXSxkYXRhWzJdLGRhdGFbM10pOworCXByaW50X2luc25fc3BhcmMoaSwgaW5mbyk7CisgICAgICAgIGlmIChpID49IDB4ZmZmZmZmZmMpIGJyZWFrOworCXByaW50ZigiXG4iKTsKKyAgICB9Cit9CisKK2ludAorYnVmZmVyX3JlYWRfbWVtb3J5KGFkZHIsIGJ1ZmZlciwgc2l6ZSwgaW5mbykKKyAgICBiZmRfdm1hICAgICAgICAgYWRkcjsKKyAgICBiZmRfYnl0ZSAgICAgICAqYnVmZmVyOworICAgIGludDMyICAgICAgICAgICBzaXplOworICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOworeworICAgIGlmIChzaXplID09IHNpc19tZW1vcnlfcmVhZChhZGRyLCBidWZmZXIsIHNpemUpKQorCXJldHVybiAoMCk7CisgICAgZWxzZQorCXJldHVybiAoMSk7Cit9CisKK3ZvaWQKK3BlcnJvcl9tZW1vcnkoc3RhdHVzLCBhZGRyLCBpbmZvKQorICAgIGludDMyICAgICAgICAgICBzdGF0dXM7CisgICAgYmZkX3ZtYSAgICAgICAgIGFkZHI7CisgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisKKyAgICBwcmludGYoIkNvdWxkIG5vdCByZWFkIGFkZHJlc3MgMHglMDh4XG4iLCAodW5zaWduZWQgaW50KSBhZGRyKTsKK30KKwordm9pZAorZ2VuZXJpY19wcmludF9hZGRyZXNzKGFkZHIsIGluZm8pCisgICAgYmZkX3ZtYSAgICAgICAgIGFkZHI7CisgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Cit7CisKKyAgICBwcmludGYoIjB4JXgiLCAodW5zaWduZWQgaW50KSBhZGRyKTsKK30KKworLyogSnVzdCByZXR1cm4gdGhlIGdpdmVuIGFkZHJlc3MuICAqLworCitpbnQKK2dlbmVyaWNfc3ltYm9sX2F0X2FkZHJlc3MgKGFkZHIsIGluZm8pCisgICAgIGJmZF92bWEgYWRkcjsKKyAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvOworeworICByZXR1cm4gMTsKK30KKworCisvKiBBZGQgZXZlbnQgdG8gZXZlbnQgcXVldWUgKi8KKwordm9pZAorZXZlbnQoY2Z1bmMsIGFyZywgZGVsdGEpCisgICAgdm9pZCAgICAgICAgICAgICgqY2Z1bmMpICgpOworICAgIGludDMyICAgICAgICAgICBhcmc7CisgICAgdWludDMyICAgICAgICAgIGRlbHRhOworeworICAgIHN0cnVjdCBldmNlbGwgICpldjEsICpldmluczsKKworICAgIGlmIChlYmFzZS5mcmVlcSA9PSBOVUxMKSB7CisJcHJpbnRmKCJFcnJvciwgdG9vIG1hbnkgZXZlbnRzIGluIGV2ZW50IHF1ZXVlXG4iKTsKKwlyZXR1cm47CisgICAgfQorICAgIGV2MSA9ICZlYmFzZS5lcTsKKyAgICBkZWx0YSArPSBlYmFzZS5zaW10aW1lOworICAgIHdoaWxlICgoZXYxLT5ueHQgIT0gTlVMTCkgJiYgKGV2MS0+bnh0LT50aW1lIDw9IGRlbHRhKSkgeworCWV2MSA9IGV2MS0+bnh0OworICAgIH0KKyAgICBpZiAoZXYxLT5ueHQgPT0gTlVMTCkgeworCWV2MS0+bnh0ID0gZWJhc2UuZnJlZXE7CisJZWJhc2UuZnJlZXEgPSBlYmFzZS5mcmVlcS0+bnh0OworCWV2MS0+bnh0LT5ueHQgPSBOVUxMOworICAgIH0gZWxzZSB7CisJZXZpbnMgPSBlYmFzZS5mcmVlcTsKKwllYmFzZS5mcmVlcSA9IGViYXNlLmZyZWVxLT5ueHQ7CisJZXZpbnMtPm54dCA9IGV2MS0+bnh0OworCWV2MS0+bnh0ID0gZXZpbnM7CisgICAgfQorICAgIGV2MS0+bnh0LT50aW1lID0gZGVsdGE7CisgICAgZXYxLT5ueHQtPmNmdW5jID0gY2Z1bmM7CisgICAgZXYxLT5ueHQtPmFyZyA9IGFyZzsKK30KKworI2lmIDAJLyogYXBwYXJlbnRseSBub3QgdXNlZCAqLwordm9pZAorc3RvcF9ldmVudCgpCit7Cit9CisjZW5kaWYKKwordm9pZAoraW5pdF9ldmVudCgpCit7CisgICAgaW50MzIgICAgICAgICAgIGk7CisKKyAgICBlYmFzZS5lcS5ueHQgPSBOVUxMOworICAgIGViYXNlLmZyZWVxID0gZXZidWY7CisgICAgZm9yIChpID0gMDsgaSA8IEVWRU5UX01BWDsgaSsrKSB7CisJZXZidWZbaV0ubnh0ID0gJmV2YnVmW2kgKyAxXTsKKyAgICB9CisgICAgZXZidWZbRVZFTlRfTUFYIC0gMV0ubnh0ID0gTlVMTDsKK30KKwordm9pZAorc2V0X2ludChsZXZlbCwgY2FsbGJhY2ssIGFyZykKKyAgICBpbnQzMiAgICAgICAgICAgbGV2ZWw7CisgICAgdm9pZCAgICAgICAgICAgICgqY2FsbGJhY2spICgpOworICAgIGludDMyICAgICAgICAgICBhcmc7Cit7CisgICAgaXJxYXJyW2xldmVsICYgMHgwZl0uY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICBpcnFhcnJbbGV2ZWwgJiAweDBmXS5hcmcgPSBhcmc7Cit9CisKKy8qIEFkdmFuY2Ugc2ltdWxhdG9yIHRpbWUgKi8KKwordm9pZAorYWR2YW5jZV90aW1lKHNyZWdzKQorICAgIHN0cnVjdCBwc3RhdGUgICpzcmVnczsKK3sKKworICAgIHN0cnVjdCBldmNlbGwgICpldnJlbTsKKyAgICB2b2lkICAgICAgICAgICAgKCpjZnVuYykgKCk7CisgICAgdWludDMyICAgICAgICAgIGFyZywgZW5kdGltZTsKKworI2lmZGVmIFNUQVQKKyAgICBzcmVncy0+ZmhvbGR0ICs9IHNyZWdzLT5maG9sZDsKKyAgICBzcmVncy0+aG9sZHQgKz0gc3JlZ3MtPmhvbGQ7CisgICAgc3JlZ3MtPmljbnR0ICs9IHNyZWdzLT5pY250OworI2VuZGlmCisKKyAgICBlbmR0aW1lID0gZWJhc2Uuc2ltdGltZSArIHNyZWdzLT5pY250ICsgc3JlZ3MtPmhvbGQgKyBzcmVncy0+ZmhvbGQ7CisKKyAgICB3aGlsZSAoKGViYXNlLmVxLm54dC0+dGltZSA8PSAoZW5kdGltZSkpICYmIChlYmFzZS5lcS5ueHQgIT0gTlVMTCkpIHsKKwllYmFzZS5zaW10aW1lID0gZWJhc2UuZXEubnh0LT50aW1lOworCWNmdW5jID0gZWJhc2UuZXEubnh0LT5jZnVuYzsKKwlhcmcgPSBlYmFzZS5lcS5ueHQtPmFyZzsKKwlldnJlbSA9IGViYXNlLmVxLm54dDsKKwllYmFzZS5lcS5ueHQgPSBlYmFzZS5lcS5ueHQtPm54dDsKKwlldnJlbS0+bnh0ID0gZWJhc2UuZnJlZXE7CisJZWJhc2UuZnJlZXEgPSBldnJlbTsKKwljZnVuYyhhcmcpOworICAgIH0KKyAgICBlYmFzZS5zaW10aW1lID0gZW5kdGltZTsKKworfQorCit1aW50MzIKK25vdygpCit7CisgICAgcmV0dXJuKGViYXNlLnNpbXRpbWUpOworfQorCisKKy8qIEFkdmFuY2UgdGltZSB1bnRpbCBhbiBleHRlcm5hbCBpbnRlcnJ1cHQgaXMgc2VlbiAqLworCitpbnQKK3dhaXRfZm9yX2lycSgpCit7CisgICAgc3RydWN0IGV2Y2VsbCAgKmV2cmVtOworICAgIHZvaWQgICAgICAgICAgICAoKmNmdW5jKSAoKTsKKyAgICBpbnQzMiAgICAgICAgICAgYXJnLCBlbmR0aW1lOworCisgICAgaWYgKGViYXNlLmVxLm54dCA9PSBOVUxMKQorCXByaW50ZigiV2FybmluZzogZXZlbnQgcXVldWUgZW1wdHkgLSBwb3dlci1kb3duIG1vZGUgbm90IGVudGVyZWRcbiIpOworICAgIGVuZHRpbWUgPSBlYmFzZS5zaW10aW1lOworICAgIHdoaWxlICghZXh0X2lybCAmJiAoZWJhc2UuZXEubnh0ICE9IE5VTEwpKSB7CisJZWJhc2Uuc2ltdGltZSA9IGViYXNlLmVxLm54dC0+dGltZTsKKwljZnVuYyA9IGViYXNlLmVxLm54dC0+Y2Z1bmM7CisJYXJnID0gZWJhc2UuZXEubnh0LT5hcmc7CisJZXZyZW0gPSBlYmFzZS5lcS5ueHQ7CisJZWJhc2UuZXEubnh0ID0gZWJhc2UuZXEubnh0LT5ueHQ7CisJZXZyZW0tPm54dCA9IGViYXNlLmZyZWVxOworCWViYXNlLmZyZWVxID0gZXZyZW07CisJY2Z1bmMoYXJnKTsKKwlpZiAoY3RybF9jKSB7CisJICAgIHByaW50ZigiXGJ3YXJuaW5nOiBwb3dlci1kb3duIG1vZGUgaW50ZXJydXB0ZWRcbiIpOworCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIHNyZWdzLnB3ZHRpbWUgKz0gZWJhc2Uuc2ltdGltZSAtIGVuZHRpbWU7CisgICAgcmV0dXJuIChlYmFzZS5zaW10aW1lIC0gZW5kdGltZSk7Cit9CisKK2ludAorY2hlY2tfYnB0KHNyZWdzKQorICAgIHN0cnVjdCBwc3RhdGUgICpzcmVnczsKK3sKKyAgICBpbnQzMiAgICAgICAgICAgaTsKKworICAgIGlmICgoc3JlZ3MtPmJwaGl0KSB8fCAoc3JlZ3MtPmFubnVsKSkKKwlyZXR1cm4gKDApOworICAgIGZvciAoaSA9IDA7IGkgPCAoaW50MzIpIHNyZWdzLT5icHRudW07IGkrKykgeworCWlmIChzcmVncy0+cGMgPT0gc3JlZ3MtPmJwdHNbaV0pCisJICAgIHJldHVybiAoQlBUX0hJVCk7CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKK3ZvaWQKK3Jlc2V0X2FsbCgpCit7CisgICAgaW5pdF9ldmVudCgpOwkJLyogQ2xlYXIgZXZlbnQgcXVldWUgKi8KKyAgICBpbml0X3JlZ3MoJnNyZWdzKTsKKyAgICByZXNldCgpOworI2lmZGVmIEVSUklOSgorICAgIGVycmluanN0YXJ0KCk7CisjZW5kaWYKK30KKwordm9pZAorc3lzX3Jlc2V0KCkKK3sKKyAgICByZXNldF9hbGwoKTsKKyAgICBzcmVncy50cmFwID0gMjU2OwkJLyogRm9yY2UgZmFrZSByZXNldCB0cmFwICovCit9CisKK3ZvaWQKK3N5c19oYWx0KCkKK3sKKyAgICBzcmVncy50cmFwID0gMjU3OyAgICAgICAgICAgLyogRm9yY2UgZmFrZSBoYWx0IHRyYXAgKi8KK30KKworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisKKyNpZmRlZiBBTlNJX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8dmFyYXJncy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKyNpbmNsdWRlICJiZmQuaCIKKworI2RlZmluZSBtaW4oQSwgQikgKCgoQSkgPCAoQikpID8gKEEpIDogKEIpKQorI2RlZmluZSBMT0FEX0FERFJFU1MgMAorCitpbnQKK2JmZF9sb2FkKGZuYW1lKQorICAgIGNoYXIgICAgICAgICAgICpmbmFtZTsKK3sKKyAgICBhc2VjdGlvbiAgICAgICAqc2VjdGlvbjsKKyAgICBiZmQgICAgICAgICAgICAqcGJmZDsKKyAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2g7CisKKyAgICBwYmZkID0gYmZkX29wZW5yKGZuYW1lLCAwKTsKKworICAgIGlmIChwYmZkID09IE5VTEwpIHsKKwlwcmludGYoIm9wZW4gb2YgJXMgZmFpbGVkXG4iLCBmbmFtZSk7CisJcmV0dXJuICgtMSk7CisgICAgfQorICAgIGlmICghYmZkX2NoZWNrX2Zvcm1hdChwYmZkLCBiZmRfb2JqZWN0KSkgeworCXByaW50ZigiZmlsZSAlcyAgZG9lc24ndCBzZWVtIHRvIGJlIGFuIG9iamVjdCBmaWxlXG4iLCBmbmFtZSk7CisJcmV0dXJuICgtMSk7CisgICAgfQorCisgICAgYXJjaCA9IGJmZF9nZXRfYXJjaF9pbmZvIChwYmZkKTsKKyAgICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKHBiZmQpIHx8IGFyY2gtPm1hY2ggPT0gYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlKQorICAgICAgICBjdXJyZW50X3RhcmdldF9ieXRlX29yZGVyID0gTElUVExFX0VORElBTjsKKyAgICBlbHNlCisJY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlciA9IEJJR19FTkRJQU47CisgICAgaWYgKHNpc192ZXJib3NlKQorCXByaW50ZigiZmlsZSAlcyBpcyAlcy1lbmRpYW4uXG4iLCBmbmFtZSwKKwkgICAgICAgY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlciA9PSBCSUdfRU5ESUFOID8gImJpZyIgOiAibGl0dGxlIik7CisKKyAgICBpZiAoc2lzX3ZlcmJvc2UpCisJcHJpbnRmKCJsb2FkaW5nICVzOiIsIGZuYW1lKTsKKyAgICBmb3IgKHNlY3Rpb24gPSBwYmZkLT5zZWN0aW9uczsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpIHsKKwlpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzKHBiZmQsIHNlY3Rpb24pICYgU0VDX0FMTE9DKSB7CisJICAgIGJmZF92bWEgICAgICAgICBzZWN0aW9uX2FkZHJlc3M7CisJICAgIHVuc2lnbmVkIGxvbmcgICBzZWN0aW9uX3NpemU7CisJICAgIGNvbnN0IGNoYXIgICAgICpzZWN0aW9uX25hbWU7CisKKwkgICAgc2VjdGlvbl9uYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUocGJmZCwgc2VjdGlvbik7CisKKwkgICAgc2VjdGlvbl9hZGRyZXNzID0gYmZkX2dldF9zZWN0aW9uX3ZtYShwYmZkLCBzZWN0aW9uKTsKKwkgICAgLyoKKwkgICAgICogQWRqdXN0IHNlY3Rpb25zIGZyb20gYS5vdXQgZmlsZXMsIHNpbmNlIHRoZXkgZG9uJ3QgY2FycnkgdGhlaXIKKwkgICAgICogYWRkcmVzc2VzIHdpdGguCisJICAgICAqLworCSAgICBpZiAoYmZkX2dldF9mbGF2b3VyKHBiZmQpID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKSB7CisJCWlmIChzdHJjbXAgKHNlY3Rpb25fbmFtZSwgIi50ZXh0IikgPT0gMCkKKwkJICAgIHNlY3Rpb25fYWRkcmVzcyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAocGJmZCk7CisJCWVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbl9uYW1lLCAiLmRhdGEiKSA9PSAwKSB7CisJCSAgICAvKiBSZWFkIHRoZSBmaXJzdCA4IGJ5dGVzIG9mIHRoZSBkYXRhIHNlY3Rpb24uCisJCSAgICAgICBUaGVyZSBzaG91bGQgYmUgdGhlIHN0cmluZyAnRGFUYScgZm9sbG93ZWQgYnkKKwkJICAgICAgIGEgd29yZCBjb250YWluaW5nIHRoZSBhY3R1YWwgc2VjdGlvbiBhZGRyZXNzLiAqLworCQkgICAgc3RydWN0IGRhdGFfbWFya2VyCisJCSAgICB7CisJCQljaGFyIHNpZ25hdHVyZVs0XTsJLyogJ0RhVGEnICovCisJCQl1bnNpZ25lZCBjaGFyIHNkYXRhWzRdOwkvKiAmc2RhdGEgKi8KKwkJICAgIH0gbWFya2VyOworCQkgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChwYmZkLCBzZWN0aW9uLCAmbWFya2VyLCAwLAorCQkJCQkgICAgICBzaXplb2YgKG1hcmtlcikpOworCQkgICAgaWYgKHN0cm5jbXAgKG1hcmtlci5zaWduYXR1cmUsICJEYVRhIiwgNCkgPT0gMCkKKwkJICAgICAgeworCQkJaWYgKGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIgPT0gQklHX0VORElBTikKKwkJCSAgc2VjdGlvbl9hZGRyZXNzID0gYmZkX2dldGIzMiAobWFya2VyLnNkYXRhKTsKKwkJCWVsc2UKKwkJCSAgc2VjdGlvbl9hZGRyZXNzID0gYmZkX2dldGwzMiAobWFya2VyLnNkYXRhKTsKKwkJICAgICAgfQorCQl9CisJICAgIH0KKworCSAgICBzZWN0aW9uX3NpemUgPSBiZmRfc2VjdGlvbl9zaXplKHBiZmQsIHNlY3Rpb24pOworCisJICAgIGlmIChzaXNfdmVyYm9zZSkKKwkJcHJpbnRmKCJcbnNlY3Rpb24gJXMgYXQgMHglMDhseCAoMHglbHggYnl0ZXMpIiwKKwkJICAgICAgIHNlY3Rpb25fbmFtZSwgc2VjdGlvbl9hZGRyZXNzLCBzZWN0aW9uX3NpemUpOworCisJICAgIC8qIFRleHQsIGRhdGEgb3IgbGl0ICovCisJICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MocGJmZCwgc2VjdGlvbikgJiBTRUNfTE9BRCkgeworCQlmaWxlX3B0ciAgICAgICAgZnB0cjsKKworCQlmcHRyID0gMDsKKworCQl3aGlsZSAoc2VjdGlvbl9zaXplID4gMCkgeworCQkgICAgY2hhciAgICAgICAgICAgIGJ1ZmZlclsxMDI0XTsKKwkJICAgIGludCAgICAgICAgICAgICBjb3VudDsKKworCQkgICAgY291bnQgPSBtaW4oc2VjdGlvbl9zaXplLCAxMDI0KTsKKworCQkgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKHBiZmQsIHNlY3Rpb24sIGJ1ZmZlciwgZnB0ciwgY291bnQpOworCisJCSAgICBzaXNfbWVtb3J5X3dyaXRlKHNlY3Rpb25fYWRkcmVzcywgYnVmZmVyLCBjb3VudCk7CisKKwkJICAgIHNlY3Rpb25fYWRkcmVzcyArPSBjb3VudDsKKwkJICAgIGZwdHIgKz0gY291bnQ7CisJCSAgICBzZWN0aW9uX3NpemUgLT0gY291bnQ7CisJCX0KKwkgICAgfSBlbHNlCQkvKiBCU1MgKi8KKwkJaWYgKHNpc192ZXJib3NlKQorCQkgICAgcHJpbnRmKCIobm90IGxvYWRlZCkiKTsKKwl9CisgICAgfQorICAgIGlmIChzaXNfdmVyYm9zZSkKKwlwcmludGYoIlxuIik7CisKKyAgICByZXR1cm4oYmZkX2dldF9zdGFydF9hZGRyZXNzIChwYmZkKSk7Cit9CmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvaGVscC5jIGIvc2ltL2VyYzMyL2hlbHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTdlZTdjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2VyYzMyL2hlbHAuYwpAQCAtMCwwICsxLDQwIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJzaXMuaCIKKwordm9pZAordXNhZ2UoKQoreworCisgICAgcHJpbnRmKCJ1c2FnZTogc2lzIFstdWFydDEgdWFydF9kZXZpY2UxXSBbLXVhcnQyIHVhcnRfZGV2aWNlMl1cbiIpOworICAgIHByaW50ZigiWy1uZnBdIFstZnJlcSBmcmVxdWVuY3ldIFstYyBiYXRjaF9maWxlXSBbZmlsZXNdXG4iKTsKKyAgICBwcmludGYoIlstc3BhcmNsaXRlXSBbLWR1bWJpb11cbiIpOworfQorCit2b2lkCitnZW5faGVscCgpCit7CisKKyAgcHJpbnRmKCJcbiBiYXRjaCA8ZmlsZT4gICAgICAgICAgZXhlY3V0ZSBhIGJhdGNoIGZpbGUgb2YgU0lTIGNvbW1hbmRzXG4iKTsKKyAgICBwcmludGYoIiArYnAgPGFkZHI+ICAgICAgICAgICAgYWRkIGEgYnJlYWtwb2ludCBhdCA8YWRkcj5cbiIpOworICAgIHByaW50ZigiIC1icCA8bnVtPiAgICAgICAgICAgICBkZWxldGUgYnJlYWtwb2ludCA8bnVtPlxuIik7CisgICAgcHJpbnRmKCIgYnAgICAgICAgICAgICAgICAgICAgIHByaW50IGFsbCBicmVha3BvaW50c1xuIik7CisgICAgcHJpbnRmKCIgY29udCBbaWNudF0gICAgICAgICAgIGNvbnRpbnVlIGV4ZWN1dGlvbiBmb3IgW2ljbnRdIGluc3RydWN0aW9uc1xuIik7CisgICAgcHJpbnRmKCIgZGViIDxsZXZlbD4gICAgICAgICAgIHNldCBkZWJ1ZyBsZXZlbFxuIik7CisgICAgcHJpbnRmKCIgZGlzIFthZGRyXSBbY291bnRdICAgIGRpc2Fzc2VtYmxlIFtjb3VudF0gaW5zdHJ1Y3Rpb25zIGF0IGFkZHJlc3MgW2FkZHJdXG4iKTsKKyAgICBwcmludGYoIiBlY2hvIDxzdHJpbmc+ICAgICAgICAgcHJpbnQgPHN0cmluZz4gdG8gdGhlIHNpbXVsYXRvciB3aW5kb3dcbiIpOworI2lmZGVmIEVSUklOSgorICAgIHByaW50ZigiIGVycm9yIDxwZXJpb2Q+ICAgICAgICBpbmplY3QgZXJyb3IgdHJhcHMgaW4gSVUgYW5kIEZQVVxuIik7CisjZW5kaWYKKyAgICBwcmludGYoIiBmbG9hdCAgICAgICAgICAgICAgICAgcHJpbnQgdGhlIEZQVSByZWdpc3RlcnNcbiIpOworICAgIHByaW50ZigiIGdvIDxhZGRyPiBbaWNudF0gICAgICBzdGFydCBleGVjdXRpb24gYXQgPGFkZHI+IGZvciBbaWNudF0gaW5zdHJ1Y3Rpb25zXG4iKTsKKyAgICBwcmludGYoIiBoaXN0IFt0cmFjZV9sZW5ndGhdICAgZW5hYmxlL3Nob3cgdHJhY2UgaGlzdG9yeVxuIik7CisgICAgcHJpbnRmKCIgbG9hZCAgPGZpbGVfbmFtZT4gICAgIGxvYWQgYSBmaWxlIGludG8gc2ltdWxhdG9yIG1lbW9yeVxuIik7CisgICAgcHJpbnRmKCIgbWVtIFthZGRyXSBbY291bnRdICAgIGRpc3BsYXkgbWVtb3J5IGF0IFthZGRyXSBmb3IgW2NvdW50XSBieXRlc1xuIik7CisgICAgcHJpbnRmKCIgcXVpdCAgICAgICAgICAgICAgICAgIGV4aXQgdGhlIHNpbXVsYXRvclxuIik7CisgICAgcHJpbnRmKCIgcGVyZiBbcmVzZXRdICAgICAgICAgIHNob3cvcmVzZXQgcGVyZm9ybWFuY2Ugc3RhdGlzdGljc1xuIik7CisgICAgcHJpbnRmKCIgcmVnIFt3PDAtNz5dICAgICAgICAgIHNob3cgaW50ZWdlciByZWdpc3RlcnMgKG9yIHdpbmRvd3MsIGVnICdyZSB3MicpXG4iKTsKKyAgICBwcmludGYoIiBydW4gW2luc3RfY291bnRdICAgICAgcmVzZXQgYW5kIHN0YXJ0IGV4ZWN1dGlvbiBmb3IgW2ljbnRdIGluc3RydWN0aW9uXG4iKTsKKyAgICBwcmludGYoIiBzdGVwICAgICAgICAgICAgICAgICAgc2luZ2xlIHN0ZXBcbiIpOworICAgIHByaW50ZigiIHRyYSBbaW5zdF9jb3VudF0gICAgICB0cmFjZSBbaW5zdF9jb3VudF0gaW5zdHJ1Y3Rpb25zXG4iKTsKKyAgICBwcmludGYoIlxuIHR5cGUgQ3RybC1DIHRvIGludGVycnVwdCBleGVjdXRpb25cblxuIik7Cit9CmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvaW50ZXJmLmMgYi9zaW0vZXJjMzIvaW50ZXJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhNzgxZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9lcmMzMi9pbnRlcmYuYwpAQCAtMCwwICsxLDUyNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFNJUy4KKyAqIAorICogU0lTLCBTUEFSQyBpbnN0cnVjdGlvbiBzaW11bGF0b3IgVjEuNiBDb3B5cmlnaHQgKEMpIDE5OTUgSmlyaSBHYWlzbGVyLAorICogRXVyb3BlYW4gU3BhY2UgQWdlbmN5CisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUKKyAqIE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAKKyAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSAic2lzLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSA8ZGlzLWFzbS5oPgorI2luY2x1ZGUgInNpbS1jb25maWcuaCIKKworI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIKKworI2lmbmRlZiBmcHJpbnRmCitleHRlcm4gICAgICAgICAgZnByaW50ZigpOworI2VuZGlmCisKKyNkZWZpbmUgUFNSX0NXUCAweDcKKworI2RlZmluZQlWQUwoeCkJc3RydG9sKHgsKGNoYXIgKiopTlVMTCwwKQorCitleHRlcm4gY2hhciAgICoqYnVpbGRhcmd2KGNoYXIgKmlucHV0KTsKKworZXh0ZXJuIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvIGRpbmZvOworZXh0ZXJuIHN0cnVjdCBwc3RhdGUgc3JlZ3M7CitleHRlcm4gc3RydWN0IGVzdGF0ZSBlYmFzZTsKKworZXh0ZXJuIGludAljdXJyZW50X3RhcmdldF9ieXRlX29yZGVyOworZXh0ZXJuIGludCAgICAgIGN0cmxfYzsKK2V4dGVybiBpbnQgICAgICBuZnA7CitleHRlcm4gaW50ICAgICAgaWZ0OworZXh0ZXJuIGludCAgICAgIHJvbTg7CitleHRlcm4gaW50ICAgICAgd3JwOworZXh0ZXJuIGludCAgICAgIHViZW47CitleHRlcm4gaW50ICAgICAgc2lzX3ZlcmJvc2U7CitleHRlcm4gY2hhciAgICAqc2lzX3ZlcnNpb247CitleHRlcm4gc3RydWN0IGVzdGF0ZSBlYmFzZTsKK2V4dGVybiBzdHJ1Y3QgZXZjZWxsIGV2YnVmW107CitleHRlcm4gc3RydWN0IGlycWNlbGwgaXJxYXJyW107CitleHRlcm4gaW50ICAgICAgaXJxcGVuZCwgZXh0X2lybDsKK2V4dGVybiBpbnQgICAgICBzcGFyY2xpdGU7CitleHRlcm4gaW50ICAgICAgZHVtYmlvOworZXh0ZXJuIGludCAgICAgIHNwYXJjbGl0ZV9ib2FyZDsKK2V4dGVybiBpbnQgICAgICB0ZXJtc2F2ZTsKK2V4dGVybiBjaGFyICAgICB1YXJ0X2RldjFbXSwgdWFydF9kZXYyW107CisKK2ludCAgICAgICAgICAgICBzaXNfZ2RiX2JyZWFrID0gMTsKKworaG9zdF9jYWxsYmFjayAqc2ltX2NhbGxiYWNrOworCitpbnQKK3J1bl9zaW0oc3JlZ3MsIGljb3VudCwgZGlzKQorICAgIHN0cnVjdCBwc3RhdGUgICpzcmVnczsKKyAgICB1bnNpZ25lZCBpbnQgICAgaWNvdW50OworICAgIGludCAgICAgICAgICAgICBkaXM7Cit7CisgICAgaW50ICAgICAgICAgICAgIG1leGMsIGlycTsKKworICAgIGlmIChzaXNfdmVyYm9zZSkKKwkoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLCAicmVzdW1pbmcgYXQgJXhcbiIsCisJCQkJCSAgc3JlZ3MtPnBjKTsKKyAgIGluaXRfc3RkaW8oKTsKKyAgIHNyZWdzLT5zdGFydHRpbWUgPSB0aW1lKE5VTEwpOworICAgaXJxID0gMDsKKyAgIHdoaWxlICghc3JlZ3MtPmVycl9tb2RlICYgKGljb3VudCA+IDApKSB7CisKKwlzcmVncy0+ZmhvbGQgPSAwOworCXNyZWdzLT5ob2xkID0gMDsKKwlzcmVncy0+aWNudCA9IDE7CisKKyAgICAgICAgaWYgKHNyZWdzLT5wc3IgJiAweDA4MCkKKyAgICAgICAgICAgIHNyZWdzLT5hc2kgPSA4OworICAgICAgICBlbHNlCisgICAgICAgICAgICBzcmVncy0+YXNpID0gOTsKKworI2lmIDAJLyogREVMRVRFIE1FISBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkgKi8KKyAgICAgICAgaWYgKHNpc192ZXJib3NlID4gMSkKKyAgICAgICAgICAgIGlmIChzcmVncy0+cGMgPT0gMCB8fCBzcmVncy0+bnBjID09IDApCisgICAgICAgICAgICAgICAgcHJpbnRmICgiYm9ndXMgcGMgb3IgbnBjXG4iKTsKKyNlbmRpZgorICAgICAgICBtZXhjID0gbWVtb3J5X3JlYWQoc3JlZ3MtPmFzaSwgc3JlZ3MtPnBjLCAmc3JlZ3MtPmluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAmc3JlZ3MtPmhvbGQpOworI2lmIDEJLyogREVMRVRFIE1FISBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkgKi8KKyAgICAgICAgaWYgKHNpc192ZXJib3NlID4gMikKKyAgICAgICAgICAgIHByaW50ZigicGMgJXgsIG5wICV4LCBzcCAleCwgZnAgJXgsIHdtICV4LCBjdyAleCwgaSAlMDh4XG4iLAorICAgICAgICAgICAgICAgICAgIHNyZWdzLT5wYywgc3JlZ3MtPm5wYywKKyAgICAgICAgICAgICAgICAgICBzcmVncy0+clsoKChzcmVncy0+cHNyICYgNykgPDwgNCkgKyAxNCkgJiAweDdmXSwKKyAgICAgICAgICAgICAgICAgICBzcmVncy0+clsoKChzcmVncy0+cHNyICYgNykgPDwgNCkgKyAzMCkgJiAweDdmXSwKKyAgICAgICAgICAgICAgICAgICBzcmVncy0+d2ltLAorICAgICAgICAgICAgICAgICAgIHNyZWdzLT5wc3IgJiA3LAorICAgICAgICAgICAgICAgICAgIHNyZWdzLT5pbnN0KTsKKyNlbmRpZgorICAgICAgICBpZiAoc3JlZ3MtPmFubnVsKSB7CisgICAgICAgICAgICBzcmVncy0+YW5udWwgPSAwOworICAgICAgICAgICAgc3JlZ3MtPmljbnQgPSAxOworICAgICAgICAgICAgc3JlZ3MtPnBjID0gc3JlZ3MtPm5wYzsKKyAgICAgICAgICAgIHNyZWdzLT5ucGMgPSBzcmVncy0+bnBjICsgNDsKKyAgICAgICAgfSBlbHNlIHsKKwkgICAgaWYgKGV4dF9pcmwpIGlycSA9IGNoZWNrX2ludGVycnVwdHMoc3JlZ3MpOworCSAgICBpZiAoIWlycSkgeworCQlpZiAobWV4YykgeworCQkgICAgc3JlZ3MtPnRyYXAgPSBJX0FDQ19FWEM7CisJCX0gZWxzZSB7CisJCSAgICBpZiAoKHNpc19nZGJfYnJlYWspICYmIChzcmVncy0+aW5zdCA9PSAweDkxZDAyMDAxKSkgeworCQkJaWYgKHNpc192ZXJib3NlKQorCQkJICAgICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssCisJCQkJCQkJICAgICAgIlNXIEJQIGhpdCBhdCAleFxuIiwgc3JlZ3MtPnBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpbV9oYWx0KCk7CisJCQlyZXN0b3JlX3N0ZGlvKCk7CisJCQljbGVhcmVycihzdGRpbik7CisJCQlyZXR1cm4gKEJQVF9ISVQpOworCQkgICAgfSBlbHNlCisJCQlkaXNwYXRjaF9pbnN0cnVjdGlvbihzcmVncyk7CisJCX0KKwkJaWNvdW50LS07CisJICAgIH0KKwkgICAgaWYgKHNyZWdzLT50cmFwKSB7CisgICAgICAgICAgICAgICAgaXJxID0gMDsKKwkJc3JlZ3MtPmVycl9tb2RlID0gZXhlY3V0ZV90cmFwKHNyZWdzKTsKKwkgICAgfQorCX0KKwlhZHZhbmNlX3RpbWUoc3JlZ3MpOworCWlmIChjdHJsX2MpIHsKKwkgICAgaWNvdW50ID0gMDsKKwl9CisgICAgfQorICAgIHNpbV9oYWx0KCk7CisgICAgc3JlZ3MtPnRvdHRpbWUgKz0gdGltZShOVUxMKSAtIHNyZWdzLT5zdGFydHRpbWU7CisgICAgcmVzdG9yZV9zdGRpbygpOworICAgIGNsZWFyZXJyKHN0ZGluKTsKKyAgICBpZiAoc3JlZ3MtPmVycl9tb2RlKQorCWVycm9yX21vZGUoc3JlZ3MtPnBjKTsKKyAgICBpZiAoc3JlZ3MtPmVycl9tb2RlKQorCXJldHVybiAoRVJST1IpOworICAgIGlmIChzcmVncy0+YnBoaXQpIHsKKwlpZiAoc2lzX3ZlcmJvc2UpCisJICAgICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssCisJCQkJCSAgICAgICJIVyBCUCBoaXQgYXQgJXhcbiIsIHNyZWdzLT5wYyk7CisJcmV0dXJuIChCUFRfSElUKTsKKyAgICB9CisgICAgaWYgKGN0cmxfYykgeworCWN0cmxfYyA9IDA7CisJcmV0dXJuIChDVFJMX0MpOworICAgIH0KKyAgICByZXR1cm4gKFRJTUVfT1VUKTsKK30KKwordm9pZAorc2ltX3NldF9jYWxsYmFja3MgKHB0cikKKyAgICAgaG9zdF9jYWxsYmFjayAqcHRyOworeworICBzaW1fY2FsbGJhY2sgPSBwdHI7Cit9CisKK3ZvaWQKK3NpbV9zaXplIChtZW1zaXplKQorICAgICBpbnQgbWVtc2l6ZTsKK3sKK30KKworU0lNX0RFU0MKK3NpbV9vcGVuIChraW5kLCBjYWxsYmFjaywgYWJmZCwgYXJndikKKyAgICAgU0lNX09QRU5fS0lORCBraW5kOworICAgICBzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1Y3QgKmNhbGxiYWNrOworICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisKKyAgICBpbnQgICAgICAgICAgICAgYXJnYyA9IDA7CisgICAgaW50ICAgICAgICAgICAgIHN0YXQgPSAxOworICAgIGludCAgICAgICAgICAgICBmcmVxID0gMDsKKworICAgIHNpbV9jYWxsYmFjayA9IGNhbGxiYWNrOworCisgICAgd2hpbGUgKGFyZ3ZbYXJnY10pCisgICAgICBhcmdjKys7CisgICAgd2hpbGUgKHN0YXQgPCBhcmdjKSB7CisJaWYgKGFyZ3Zbc3RhdF1bMF0gPT0gJy0nKSB7CisJICAgIGlmIChzdHJjbXAoYXJndltzdGF0XSwgIi12IikgPT0gMCkgeworCQlzaXNfdmVyYm9zZSsrOworCSAgICB9IGVsc2UKKwkgICAgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLW5mcCIpID09IDApIHsKKwkJbmZwID0gMTsKKwkgICAgfSBlbHNlCisgICAgICAgICAgICBpZiAoc3RyY21wKGFyZ3Zbc3RhdF0sICItaWZ0IikgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmdCA9IDE7CisJICAgIH0gZWxzZQorCSAgICBpZiAoc3RyY21wKGFyZ3Zbc3RhdF0sICItc3BhcmNsaXRlIikgPT0gMCkgeworCQlzcGFyY2xpdGUgPSAxOworCSAgICB9IGVsc2UKKwkgICAgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLXNwYXJjbGl0ZS1ib2FyZCIpID09IDApIHsKKwkJc3BhcmNsaXRlX2JvYXJkID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSAKKyAgICAgICAgICAgIGlmIChzdHJjbXAoYXJndltzdGF0XSwgIi1kdW1iaW8iKSA9PSAwKSB7CisJCWR1bWJpbyA9IDE7CisJICAgIH0gZWxzZQorICAgICAgICAgICAgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLXdycCIpID09IDApIHsKKyAgICAgICAgICAgICAgICB3cnAgPSAxOworCSAgICB9IGVsc2UKKyAgICAgICAgICAgIGlmIChzdHJjbXAoYXJndltzdGF0XSwgIi1yb204IikgPT0gMCkgeworICAgICAgICAgICAgICAgIHJvbTggPSAxOworCSAgICB9IGVsc2UgCisgICAgICAgICAgICBpZiAoc3RyY21wKGFyZ3Zbc3RhdF0sICItdWJlbiIpID09IDApIHsKKyAgICAgICAgICAgICAgICB1YmVuID0gMTsKKwkgICAgfSBlbHNlIAorCSAgICBpZiAoc3RyY21wKGFyZ3Zbc3RhdF0sICItdWFydDEiKSA9PSAwKSB7CisJCWlmICgoc3RhdCArIDEpIDwgYXJnYykKKwkJICAgIHN0cmNweSh1YXJ0X2RldjEsIGFyZ3ZbKytzdGF0XSk7CisJICAgIH0gZWxzZQorCSAgICBpZiAoc3RyY21wKGFyZ3Zbc3RhdF0sICItdWFydDIiKSA9PSAwKSB7CisJCWlmICgoc3RhdCArIDEpIDwgYXJnYykKKwkJICAgIHN0cmNweSh1YXJ0X2RldjIsIGFyZ3ZbKytzdGF0XSk7CisJICAgIH0gZWxzZQorCSAgICBpZiAoc3RyY21wKGFyZ3Zbc3RhdF0sICItbm9nZGIiKSA9PSAwKSB7CisJCXNpc19nZGJfYnJlYWsgPSAwOworCSAgICB9IGVsc2UKKwkgICAgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLWZyZXEiKSA9PSAwKSB7CisJCWlmICgoc3RhdCArIDEpIDwgYXJnYykgeworCQkgICAgZnJlcSA9IFZBTChhcmd2Wysrc3RhdF0pOworCQl9CisJICAgIH0gZWxzZSB7CisJCSgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssCisJCQkJCQkgICJ1bmtub3duIG9wdGlvbiAlc1xuIiwKKwkJCQkJCSAgYXJndltzdGF0XSk7CisJICAgIH0KKwl9IGVsc2UKKwkgICAgYmZkX2xvYWQoYXJndltzdGF0XSk7CisJc3RhdCsrOworICAgIH0KKworICAgIGlmIChzaXNfdmVyYm9zZSkgeworCSgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssICJcbiBTSVMgLSBTUEFSQyBpbnN0cnVjdGlvbiBzaW11bGF0b3IgJXNcbiIsIHNpc192ZXJzaW9uKTsKKwkoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLCAiIEJ1Zy1yZXBvcnRzIHRvIEppcmkgR2Fpc2xlciBFU0EvRVNURUMgKGpnYWlzQHdkLmVzdGVjLmVzYS5ubClcbiIpOworCWlmIChuZnApCisJICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLCAibm8gRlBVXG4iKTsKKwlpZiAoc3BhcmNsaXRlKQorCSAgKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywgInNpbXVsYXRpbmcgU3BhcmNsaXRlXG4iKTsKKwlpZiAoZHVtYmlvKQorCSAgKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywgImR1bWIgSU8gKG5vIGlucHV0LCBkdW1iIG91dHB1dClcbiIpOworCWlmIChzaXNfZ2RiX2JyZWFrID09IDApCisJICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLCAiZGlzYWJsaW5nIEdEQiB0cmFwIGhhbmRsaW5nIGZvciBicmVha3BvaW50c1xuIik7CisJaWYgKGZyZXEpCisJICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLCAiIEVSQzMyIGZyZXEgJWQgTWh6XG4iLCBmcmVxKTsKKyAgICB9CisKKyAgICBzcmVncy5mcmVxID0gZnJlcSA/IGZyZXEgOiAxNTsKKyAgICB0ZXJtc2F2ZSA9IGZjbnRsKDAsIEZfR0VURkwsIDApOworICAgIElOSVRfRElTQVNTRU1CTEVfSU5GTyhkaW5mbywgc3Rkb3V0LChmcHJpbnRmX2Z0eXBlKWZwcmludGYpOworICAgIGRpbmZvLmVuZGlhbiA9IEJGRF9FTkRJQU5fQklHOworICAgIHJlc2V0X2FsbCgpOworICAgIGViYXNlLnNpbXRpbWUgPSAwOworICAgIGluaXRfc2ltKCk7CisgICAgaW5pdF9icHQoJnNyZWdzKTsKKyAgICByZXNldF9zdGF0KCZzcmVncyk7CisKKyAgICAvKiBGdWRnZSBvdXIgZGVzY3JpcHRvciBmb3Igbm93LiAgKi8KKyAgICByZXR1cm4gKFNJTV9ERVNDKSAxOworfQorCit2b2lkCitzaW1fY2xvc2Uoc2QsIHF1aXR0aW5nKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgaW50IHF1aXR0aW5nOworeworCisgICAgZXhpdF9zaW0oKTsKKyAgICBmY250bCgwLCBGX1NFVEZMLCB0ZXJtc2F2ZSk7CisKK307CisKK1NJTV9SQworc2ltX2xvYWQoc2QsIHByb2csIGFiZmQsIGZyb21fdHR5KQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgY2hhciAqcHJvZzsKKyAgICAgYmZkICphYmZkOworICAgICBpbnQgZnJvbV90dHk7Cit7CisgICAgYmZkX2xvYWQgKHByb2cpOworICAgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKK1NJTV9SQworc2ltX2NyZWF0ZV9pbmZlcmlvcihzZCwgYWJmZCwgYXJndiwgZW52KQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgc3RydWN0IF9iZmQgKmFiZmQ7CisgICAgIGNoYXIgKiphcmd2OworICAgICBjaGFyICoqZW52OworeworICAgIGJmZF92bWEgc3RhcnRfYWRkcmVzcyA9IDA7CisgICAgaWYgKGFiZmQgIT0gTlVMTCkKKyAgICAgIHN0YXJ0X2FkZHJlc3MgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOworCisgICAgZWJhc2Uuc2ltdGltZSA9IDA7CisgICAgcmVzZXRfYWxsKCk7CisgICAgcmVzZXRfc3RhdCgmc3JlZ3MpOworICAgIHNyZWdzLnBjID0gc3RhcnRfYWRkcmVzcyAmIH4zOworICAgIHNyZWdzLm5wYyA9IHNyZWdzLnBjICsgNDsKKyAgICByZXR1cm4gU0lNX1JDX09LOworfQorCitpbnQKK3NpbV9zdG9yZV9yZWdpc3RlcihzZCwgcmVnbm8sIHZhbHVlLCBsZW5ndGgpCisgICAgU0lNX0RFU0Mgc2Q7CisgICAgaW50ICAgICAgICAgICAgIHJlZ25vOworICAgIHVuc2lnbmVkIGNoYXIgICp2YWx1ZTsKKyAgICBpbnQgbGVuZ3RoOworeworICAgIC8qIEZJWE1FOiBSZXZpZXcgdGhlIGNvbXB1dGF0aW9uIG9mIHJlZ3ZhbC4gICovCisgICAgaW50IHJlZ3ZhbDsKKyAgICBpZiAoY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlciA9PSBCSUdfRU5ESUFOKQorCXJlZ3ZhbCA9ICh2YWx1ZVswXSA8PCAyNCkgfCAodmFsdWVbMV0gPDwgMTYpCisJCSB8ICh2YWx1ZVsyXSA8PCA4KSB8IHZhbHVlWzNdOworICAgIGVsc2UKKwlyZWd2YWwgPSAodmFsdWVbM10gPDwgMjQpIHwgKHZhbHVlWzJdIDw8IDE2KQorCQkgfCAodmFsdWVbMV0gPDwgOCkgfCB2YWx1ZVswXTsKKyAgICBzZXRfcmVnaSgmc3JlZ3MsIHJlZ25vLCByZWd2YWwpOworICAgIHJldHVybiAtMTsKK30KKworCitpbnQKK3NpbV9mZXRjaF9yZWdpc3RlcihzZCwgcmVnbm8sIGJ1ZiwgbGVuZ3RoKQorICAgICBTSU1fREVTQyBzZDsKKyAgICBpbnQgICAgICAgICAgICAgcmVnbm87CisgICAgdW5zaWduZWQgY2hhciAgKmJ1ZjsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgICBnZXRfcmVnaSgmc3JlZ3MsIHJlZ25vLCBidWYpOworICAgIHJldHVybiAtMTsKK30KKworaW50CitzaW1fd3JpdGUoc2QsIG1lbSwgYnVmLCBsZW5ndGgpCisgICAgIFNJTV9ERVNDIHNkOworICAgIFNJTV9BRERSICAgICAgICAgICAgIG1lbTsKKyAgICB1bnNpZ25lZCBjaGFyICAqYnVmOworICAgIGludCAgICAgICAgICAgICBsZW5ndGg7Cit7CisgICAgcmV0dXJuIChzaXNfbWVtb3J5X3dyaXRlKG1lbSwgYnVmLCBsZW5ndGgpKTsKK30KKworaW50CitzaW1fcmVhZChzZCwgbWVtLCBidWYsIGxlbmd0aCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIFNJTV9BRERSIG1lbTsKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgICBpbnQgbGVuZ3RoOworeworICAgIHJldHVybiAoc2lzX21lbW9yeV9yZWFkKG1lbSwgYnVmLCBsZW5ndGgpKTsKK30KKwordm9pZAorc2ltX2luZm8oc2QsIHZlcmJvc2UpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgdmVyYm9zZTsKK3sKKyAgICBzaG93X3N0YXQoJnNyZWdzKTsKK30KKworaW50ICAgICAgICAgICAgIHNpbXN0YXQgPSBPSzsKKwordm9pZAorc2ltX3N0b3BfcmVhc29uKHNkLCByZWFzb24sIHNpZ3JjKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgZW51bSBzaW1fc3RvcCAqIHJlYXNvbjsKKyAgICAgaW50ICpzaWdyYzsKK3sKKworICAgIHN3aXRjaCAoc2ltc3RhdCkgeworCWNhc2UgQ1RSTF9DOgorCSpyZWFzb24gPSBzaW1fc3RvcHBlZDsKKwkqc2lncmMgPSBTSUdJTlQ7CisJYnJlYWs7CisgICAgY2FzZSBPSzoKKyAgICBjYXNlIFRJTUVfT1VUOgorICAgIGNhc2UgQlBUX0hJVDoKKwkqcmVhc29uID0gc2ltX3N0b3BwZWQ7CisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIFNJR1RSQVAgNQorI2VuZGlmCisJKnNpZ3JjID0gU0lHVFJBUDsKKwlicmVhazsKKyAgICBjYXNlIEVSUk9SOgorCSpzaWdyYyA9IDA7CisJKnJlYXNvbiA9IHNpbV9leGl0ZWQ7CisgICAgfQorICAgIGN0cmxfYyA9IDA7CisgICAgc2ltc3RhdCA9IE9LOworfQorCisvKiBGbHVzaCBhbGwgcmVnaXN0ZXIgd2luZG93cyBvdXQgdG8gdGhlIHN0YWNrLiAgU3RhcnRpbmcgYWZ0ZXIgdGhlIGludmFsaWQKKyAgIHdpbmRvdywgZmx1c2ggYWxsIHdpbmRvd3MgdXAgdG8sIGFuZCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgd2luZG93LiAgVGhpcworICAgYWxsb3dzIEdEQiB0byBkbyBiYWNrdHJhY2VzIGFuZCBsb29rIGF0IGxvY2FsIHZhcmlhYmxlcyBmb3IgZnJhbWVzIHRoYXQKKyAgIGFyZSBzdGlsbCBpbiB0aGUgcmVnaXN0ZXIgd2luZG93cy4gIE5vdGUgdGhhdCBzdHJpY3RseSBzcGVha2luZywgdGhpcworICAgYmVoYXZpb3IgaXMgKndyb25nKiBmb3Igc2V2ZXJhbCByZWFzb25zLiAgRmlyc3QsIGl0IGRvZXNuJ3QgdXNlIHRoZSB3aW5kb3cKKyAgIG92ZXJmbG93IGhhbmRsZXJzLiAgSXQgdGhlcmVmb3JlIGFzc3VtZXMgc3RhbmRhcmQgZnJhbWUgbGF5b3V0cyBhbmQgd2luZG93CisgICBoYW5kbGluZyBwb2xpY2llcy4gIFNlY29uZCwgaXQgY2hhbmdlcyBzeXN0ZW0gc3RhdGUgYmVoaW5kIHRoZSBiYWNrIG9mIHRoZQorICAgdGFyZ2V0IHByb2dyYW0uICBJIGV4cGVjdCB0aGlzIHRvIG1haW5seSBwb3NlIHByb2JsZW1zIHdoZW4gZGVidWdnaW5nIHRyYXAKKyAgIGhhbmRsZXJzLgorKi8KKworc3RhdGljIHZvaWQKK2ZsdXNoX3dpbmRvd3MgKCkKK3sKKyAgaW50IGludndpbjsKKyAgaW50IGN3cDsKKyAgaW50IHdpbjsKKyAgaW50IHdzOworCisgIC8qIEtlZXAgY3VycmVudCB3aW5kb3cgaGFuZHkgKi8KKworICBjd3AgPSBzcmVncy5wc3IgJiBQU1JfQ1dQOworCisgIC8qIENhbGN1bGF0ZSB0aGUgaW52YWxpZCB3aW5kb3cgZnJvbSB0aGUgd2ltLiAqLworCisgIGZvciAoaW52d2luID0gMDsgaW52d2luIDw9IFBTUl9DV1A7IGludndpbisrKQorICAgIGlmICgoc3JlZ3Mud2ltID4+IGludndpbikgJiAxKQorICAgICAgYnJlYWs7CisKKyAgLyogU3RhcnQgc2F2aW5nIHdpdGggdGhlIHdpbmRvdyBhZnRlciB0aGUgaW52YWxpZCB3aW5kb3cuICovCisKKyAgaW52d2luID0gKGludndpbiAtIDEpICYgUFNSX0NXUDsKKworICBmb3IgKHdpbiA9IGludndpbjsgOyB3aW4gPSAod2luIC0gMSkgJiBQU1JfQ1dQKQorICAgIHsKKyAgICAgIHVpbnQzMiBzcDsKKyAgICAgIGludCBpOworCisgICAgICBzcCA9IHNyZWdzLnJbKHdpbiAqIDE2ICsgMTQpICYgMHg3Zl07CisjaWYgMQorICAgICAgaWYgKHNpc192ZXJib3NlID4gMikgeworCXVpbnQzMiBmcCA9IHNyZWdzLnJbKHdpbiAqIDE2ICsgMzApICYgMHg3Zl07CisJcHJpbnRmKCJmbHVzaF93aW5kb3c6IHdpbiAlZCwgc3AgJXgsIGZwICV4XG4iLCB3aW4sIHNwLCBmcCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJbWVtb3J5X3dyaXRlICgxMSwgc3AgKyA0ICogaSwgJnNyZWdzLnJbKHdpbiAqIDE2ICsgMTYgKyBpKSAmIDB4N2ZdLCAyLAorCQkgICAgICAmd3MpOworCisgICAgICBpZiAod2luID09IGN3cCkKKwlicmVhazsKKyAgICB9Cit9CisKK3ZvaWQKK3NpbV9yZXN1bWUoU0lNX0RFU0Mgc2QsIGludCBzdGVwLCBpbnQgc2lnZ25hbCkKK3sKKyAgICBzaW1zdGF0ID0gcnVuX3NpbSgmc3JlZ3MsIC0xLCAwKTsKKworICAgIGlmIChzaXNfZ2RiX2JyZWFrKSBmbHVzaF93aW5kb3dzICgpOworfQorCitpbnQKK3NpbV90cmFjZSAoc2QpCisgICAgIFNJTV9ERVNDIHNkOworeworICAvKiBGSVhNRTogdW5maW5pc2hlZCAqLworICBzaW1fcmVzdW1lIChzZCwgMCwgMCk7CisgIHJldHVybiAxOworfQorCit2b2lkCitzaW1fZG9fY29tbWFuZChzZCwgY21kKQorICAgICBTSU1fREVTQyBzZDsKKyAgICBjaGFyICAgICAgICAgICAqY21kOworeworICAgIGV4ZWNfY21kKCZzcmVncywgY21kKTsKK30KKworI2lmIDAgLyogRklYTUU6IFRoZXNlIHNob3VsZG4ndCBleGlzdC4gICovCisKK2ludAorc2ltX2luc2VydF9icmVha3BvaW50KGludCBhZGRyKQoreworICAgIGlmIChzcmVncy5icHRudW0gPCBCUFRfTUFYKSB7CisJc3JlZ3MuYnB0c1tzcmVncy5icHRudW1dID0gYWRkciAmIH4weDM7CisJc3JlZ3MuYnB0bnVtKys7CisJaWYgKHNpc192ZXJib3NlKQorCSAgICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLCAiaW5zZXJ0ZWQgSFcgQlAgYXQgJXhcbiIsIGFkZHIpOworCXJldHVybiAwOworICAgIH0gZWxzZQorCXJldHVybiAxOworfQorCitpbnQKK3NpbV9yZW1vdmVfYnJlYWtwb2ludChpbnQgYWRkcikKK3sKKyAgICBpbnQgICAgICAgICAgICAgaSA9IDA7CisKKyAgICB3aGlsZSAoKGkgPCBzcmVncy5icHRudW0pICYmIChzcmVncy5icHRzW2ldICE9IGFkZHIpKQorCWkrKzsKKyAgICBpZiAoYWRkciA9PSBzcmVncy5icHRzW2ldKSB7CisJZm9yICg7IGkgPCBzcmVncy5icHRudW0gLSAxOyBpKyspCisJICAgIHNyZWdzLmJwdHNbaV0gPSBzcmVncy5icHRzW2kgKyAxXTsKKwlzcmVncy5icHRudW0gLT0gMTsKKwlpZiAoc2lzX3ZlcmJvc2UpCisJICAgICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssICJyZW1vdmVkIEhXIEJQIGF0ICV4XG4iLCBhZGRyKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL2VyYzMyL3Npcy5jIGIvc2ltL2VyYzMyL3Npcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1Njc4ODEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZXJjMzIvc2lzLmMKQEAgLTAsMCArMSwzMTAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBTSVMuCisgKiAKKyAqIFNJUywgU1BBUkMgaW5zdHJ1Y3Rpb24gc2ltdWxhdG9yLiBDb3B5cmlnaHQgKEMpIDE5OTUgSmlyaSBHYWlzbGVyLCBFdXJvcGVhbgorICogU3BhY2UgQWdlbmN5CisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUKKyAqIE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSAic2lzLmgiCisjaW5jbHVkZSA8ZGlzLWFzbS5oPgorI2luY2x1ZGUgInNpbS1jb25maWcuaCIKKworI2lmbmRlZiBmcHJpbnRmCitleHRlcm4gICAgICAgICAgZnByaW50ZigpOworI2VuZGlmCisKKyNkZWZpbmUJVkFMKHgpCXN0cnRvbCh4LChjaGFyICoqKU5VTEwsMCkKKworLyogU3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIGZyb20gcmVhZGxpbmUgbGlicmFyeSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNoYXIgKmxpbmU7CisgIGNoYXIgKmRhdGE7Cit9IEhJU1RfRU5UUlk7CisKK2V4dGVybiBjaGFyICoJcmVhZGxpbmUgUEFSQU1TICgoY2hhciAqcHJvbXB0KSk7CitleHRlcm4gdm9pZAl1c2luZ19oaXN0b3J5IFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiB2b2lkCWFkZF9oaXN0b3J5IFBBUkFNUyAoKGNoYXIgKnN0cmluZykpOworZXh0ZXJuIEhJU1RfRU5UUlkgKnJlbW92ZV9oaXN0b3J5IFBBUkFNUyAoKGludCB3aGljaCkpOworCisKKworLyogQ29tbWFuZCBoaXN0b3J5IGJ1ZmZlciBsZW5ndGggLSBNVVNUIGJlIGJpbmFyeSAqLworI2RlZmluZSBISVNUX0xFTgk2NAorCitleHRlcm4gc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gZGluZm87CitleHRlcm4gc3RydWN0IHBzdGF0ZSBzcmVnczsKK2V4dGVybiBzdHJ1Y3QgZXN0YXRlIGViYXNlOworCitleHRlcm4gaW50ICAgICAgY3RybF9jOworZXh0ZXJuIGludCAgICAgIG5mcDsKK2V4dGVybiBpbnQgICAgICBpZnQ7CitleHRlcm4gaW50ICAgICAgd3JwOworZXh0ZXJuIGludCAgICAgIHJvbTg7CitleHRlcm4gaW50ICAgICAgdWJlbjsKK2V4dGVybiBpbnQgICAgICBzaXNfdmVyYm9zZTsKK2V4dGVybiBjaGFyICAgICpzaXNfdmVyc2lvbjsKK2V4dGVybiBzdHJ1Y3QgZXN0YXRlIGViYXNlOworZXh0ZXJuIHN0cnVjdCBldmNlbGwgZXZidWZbXTsKK2V4dGVybiBzdHJ1Y3QgaXJxY2VsbCBpcnFhcnJbXTsKK2V4dGVybiBpbnQgICAgICBpcnFwZW5kLCBleHRfaXJsOworZXh0ZXJuIGludCAgICAgIHRlcm1zYXZlOworZXh0ZXJuIGludCAgICAgIHNwYXJjbGl0ZTsKK2V4dGVybiBpbnQgICAgICBkdW1iaW87CitleHRlcm4gY2hhciAgICAgdWFydF9kZXYxW107CitleHRlcm4gY2hhciAgICAgdWFydF9kZXYyW107CitleHRlcm4gdWludDMyICAgbGFzdF9sb2FkX2FkZHI7CisKKyNpZmRlZiBFUkEKK2V4dGVybiBpbnQgZXJhOworI2VuZGlmCisKK2ludAorcnVuX3NpbShzcmVncywgaWNvdW50LCBkaXMpCisgICAgc3RydWN0IHBzdGF0ZSAgKnNyZWdzOworICAgIHVuc2lnbmVkIGludCAgICBpY291bnQ7CisgICAgaW50ICAgICAgICAgICAgIGRpczsKK3sKKyAgICBpbnQgICAgICAgICAgICAgaXJxLCBtZXhjLCBkZWIsIGFzaTsKKworICAgIHNyZWdzLT5zdGFydHRpbWUgPSB0aW1lKE5VTEwpOworICAgIGluaXRfc3RkaW8oKTsKKyAgICBpZiAoc3JlZ3MtPmVycl9tb2RlKSBpY291bnQgPSAwOworICAgIGRlYiA9IGRpcyB8fCBzcmVncy0+aGlzdGxlbiB8fCBzcmVncy0+YnB0bnVtOworICAgIGlycSA9IDA7CisgICAgd2hpbGUgKGljb3VudCA+IDApIHsKKworCWlmIChzcmVncy0+cHNyICYgMHgwODApCisJICAgIGFzaSA9IDk7CisgICAJZWxzZQorCSAgICBhc2kgPSA4OworCW1leGMgPSBtZW1vcnlfcmVhZChhc2ksIHNyZWdzLT5wYywgJnNyZWdzLT5pbnN0LCAyLCAmc3JlZ3MtPmhvbGQpOworCXNyZWdzLT5pY250ID0gMTsKKwlpZiAoc3JlZ3MtPmFubnVsKSB7CisJICAgIHNyZWdzLT5hbm51bCA9IDA7CisJICAgIHNyZWdzLT5wYyA9IHNyZWdzLT5ucGM7CisJICAgIHNyZWdzLT5ucGMgPSBzcmVncy0+bnBjICsgNDsKKwl9IGVsc2UgeworCSAgICBzcmVncy0+ZmhvbGQgPSAwOworCSAgICBpZiAoZXh0X2lybCkgaXJxID0gY2hlY2tfaW50ZXJydXB0cyhzcmVncyk7CisJICAgIGlmICghaXJxKSB7CisJCWlmIChtZXhjKSB7CisJCSAgICBzcmVncy0+dHJhcCA9IElfQUNDX0VYQzsKKwkJfSBlbHNlIHsKKwkJICAgIGlmIChkZWIpIHsKKwkgICAgCQlpZiAoKHNyZWdzLT5icGhpdCA9IGNoZWNrX2JwdChzcmVncykpICE9IDApIHsKKyAgICAgICAgICAgIAkJICAgIHJlc3RvcmVfc3RkaW8oKTsKKwkgICAgCQkgICAgcmV0dXJuIChCUFRfSElUKTsKKwkgICAgCQl9CisJCSAgICAgICAgaWYgKHNyZWdzLT5oaXN0bGVuKSB7CisJCQkgICAgc3JlZ3MtPmhpc3RidWZbc3JlZ3MtPmhpc3RpbmRdLmFkZHIgPSBzcmVncy0+cGM7CisJCQkgICAgc3JlZ3MtPmhpc3RidWZbc3JlZ3MtPmhpc3RpbmRdLnRpbWUgPSBlYmFzZS5zaW10aW1lOworCQkJICAgIHNyZWdzLT5oaXN0aW5kKys7CisJCQkgICAgaWYgKHNyZWdzLT5oaXN0aW5kID49IHNyZWdzLT5oaXN0bGVuKQorCQkJICAgICAgICBzcmVncy0+aGlzdGluZCA9IDA7CisJCSAgICAgICAgfQorCQkgICAgICAgIGlmIChkaXMpIHsKKwkJCSAgICBwcmludGYoIiAlOHUgIiwgZWJhc2Uuc2ltdGltZSk7CisJCQkgICAgZGlzX21lbShzcmVncy0+cGMsIDEsICZkaW5mbyk7CisJCSAgICAgICAgfQorCQkgICAgfQorCQkgICAgZGlzcGF0Y2hfaW5zdHJ1Y3Rpb24oc3JlZ3MpOworCQkgICAgaWNvdW50LS07CisJCX0KKwkgICAgfQorCSAgICBpZiAoc3JlZ3MtPnRyYXApIHsKKwkJaXJxID0gMDsKKwkJc3JlZ3MtPmVycl9tb2RlID0gZXhlY3V0ZV90cmFwKHNyZWdzKTsKKyAgICAgICAgCWlmIChzcmVncy0+ZXJyX21vZGUpIHsKKwkgICAgICAgICAgICBlcnJvcl9tb2RlKHNyZWdzLT5wYyk7CisJICAgICAgICAgICAgaWNvdW50ID0gMDsKKwkgICAgICAgIH0KKwkgICAgfQorCX0KKwlhZHZhbmNlX3RpbWUoc3JlZ3MpOworCWlmIChjdHJsX2MgfHwgKHNyZWdzLT50bGltaXQgPD0gZWJhc2Uuc2ltdGltZSkpIHsKKwkgICAgaWNvdW50ID0gMDsKKwkgICAgaWYgKHNyZWdzLT50bGltaXQgPD0gZWJhc2Uuc2ltdGltZSkgc3JlZ3MtPnRsaW1pdCA9IC0xOworCX0KKyAgICB9CisgICAgc3JlZ3MtPnRvdHRpbWUgKz0gdGltZShOVUxMKSAtIHNyZWdzLT5zdGFydHRpbWU7CisgICAgcmVzdG9yZV9zdGRpbygpOworICAgIGlmIChzcmVncy0+ZXJyX21vZGUpCisJcmV0dXJuIChFUlJPUik7CisgICAgaWYgKGN0cmxfYykgeworCWN0cmxfYyA9IDA7CisJcmV0dXJuIChDVFJMX0MpOworICAgIH0KKyAgICByZXR1cm4gKFRJTUVfT1VUKTsKK30KKworaW50CittYWluKGFyZ2MsIGFyZ3YpCisgICAgaW50ICAgICAgICAgICAgIGFyZ2M7CisgICAgY2hhciAgICAgICAgICAqKmFyZ3Y7Cit7CisKKyAgICBpbnQgICAgICAgICAgICAgY29udCA9IDE7CisgICAgaW50ICAgICAgICAgICAgIHN0YXQgPSAxOworICAgIGludCAgICAgICAgICAgICBmcmVxID0gMTQ7CisgICAgaW50ICAgICAgICAgICAgIGNvcHQgPSAwOworCisgICAgY2hhciAgICAgICAgICAgKmNmaWxlLCAqYmFjbWQ7CisgICAgY2hhciAgICAgICAgICAgKmNtZHFbSElTVF9MRU5dOworICAgIGludCAgICAgICAgICAgICBjbWRpID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgaTsKKworICAgIGNmaWxlID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKwljbWRxW2ldID0gMDsKKyAgICBwcmludGYoIlxuIFNJUyAtIFNQQVJDIGludHJ1Y3Rpb24gc2ltdWxhdG9yICVzLCAgY29weXJpZ2h0IEppcmkgR2Fpc2xlciAxOTk1XG4iLCBzaXNfdmVyc2lvbik7CisgICAgcHJpbnRmKCIgQnVnLXJlcG9ydHMgdG8gamdhaXNAd2QuZXN0ZWMuZXNhLm5sXG5cbiIpOworICAgIHdoaWxlIChzdGF0IDwgYXJnYykgeworCWlmIChhcmd2W3N0YXRdWzBdID09ICctJykgeworCSAgICBpZiAoc3RyY21wKGFyZ3Zbc3RhdF0sICItdiIpID09IDApIHsKKwkJc2lzX3ZlcmJvc2UgPSAxOworCSAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLWMiKSA9PSAwKSB7CisJCWlmICgoc3RhdCArIDEpIDwgYXJnYykgeworCQkgICAgY29wdCA9IDE7CisJCSAgICBjZmlsZSA9IGFyZ3ZbKytzdGF0XTsKKwkJfQorCSAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLW5mcCIpID09IDApCisJCW5mcCA9IDE7CisJICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLWlmdCIpID09IDApCisJCWlmdCA9IDE7CisJICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLXdycCIpID09IDApCisJCXdycCA9IDE7CisJICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLXJvbTgiKSA9PSAwKQorCQlyb204ID0gMTsKKwkgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3Zbc3RhdF0sICItdWJlbiIpID09IDApCisJCXViZW4gPSAxOworCSAgICBlbHNlIGlmIChzdHJjbXAoYXJndltzdGF0XSwgIi11YXJ0MSIpID09IDApIHsKKwkJaWYgKChzdGF0ICsgMSkgPCBhcmdjKQorCQkgICAgc3RyY3B5KHVhcnRfZGV2MSwgYXJndlsrK3N0YXRdKTsKKwkgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJndltzdGF0XSwgIi11YXJ0MiIpID09IDApIHsKKwkJaWYgKChzdGF0ICsgMSkgPCBhcmdjKQorCQkgICAgc3RyY3B5KHVhcnRfZGV2MiwgYXJndlsrK3N0YXRdKTsKKwkgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJndltzdGF0XSwgIi1mcmVxIikgPT0gMCkgeworCQlpZiAoKHN0YXQgKyAxKSA8IGFyZ2MpCisJCSAgICBmcmVxID0gVkFMKGFyZ3ZbKytzdGF0XSk7CisJICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZ3Zbc3RhdF0sICItc3BhcmNsaXRlIikgPT0gMCkgeworCQlzcGFyY2xpdGUgPSAxOworI2lmZGVmIEVSQQorCSAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2W3N0YXRdLCAiLWVyYSIpID09IDApIHsKKwkJZXJhID0gMTsKKyNlbmRpZgorICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJndltzdGF0XSwgIi1kdW1iaW8iKSA9PSAwKSB7CisJCWR1bWJpbyA9IDE7CisJICAgIH0gZWxzZSB7CisJCXByaW50ZigidW5rbm93biBvcHRpb24gJXNcbiIsIGFyZ3Zbc3RhdF0pOworCQl1c2FnZSgpOworCQlleGl0KDEpOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgbGFzdF9sb2FkX2FkZHIgPSBiZmRfbG9hZChhcmd2W3N0YXRdKTsKKwl9CisJc3RhdCsrOworICAgIH0KKyAgICBpZiAobmZwKQorCXByaW50ZigiRlBVIGRpc2FibGVkXG4iKTsKKyNpZmRlZiBFUkEKKyAgICBpZiAoZXJhKQorCXByaW50ZigiRVJBIEVDQyBlbXVsYXRpb24gZW5hYmxlZFxuIik7CisjZW5kaWYKKyAgICBzcmVncy5mcmVxID0gZnJlcTsKKworICAgIElOSVRfRElTQVNTRU1CTEVfSU5GTyhkaW5mbywgc3Rkb3V0LCAoZnByaW50Zl9mdHlwZSkgZnByaW50Zik7CisgICAgZGluZm8uZW5kaWFuID0gQkZEX0VORElBTl9CSUc7CisKKyAgICB0ZXJtc2F2ZSA9IGZjbnRsKDAsIEZfR0VURkwsIDApOworICAgIHVzaW5nX2hpc3RvcnkoKTsKKyAgICBpbml0X3NpZ25hbHMoKTsKKyAgICBlYmFzZS5zaW10aW1lID0gMDsKKyAgICByZXNldF9hbGwoKTsKKyAgICBpbml0X2JwdCgmc3JlZ3MpOworICAgIGluaXRfc2ltKCk7CisjaWZkZWYgU1RBVAorICAgIHJlc2V0X3N0YXQoJnNyZWdzKTsKKyNlbmRpZgorCisgICAgaWYgKGNvcHQpIHsKKwliYWNtZCA9IChjaGFyICopIG1hbGxvYygyNTYpOworCXN0cmNweShiYWNtZCwgImJhdGNoICIpOworCXN0cmNhdChiYWNtZCwgY2ZpbGUpOworCWV4ZWNfY21kKCZzcmVncywgYmFjbWQpOworICAgIH0KKyAgICB3aGlsZSAoY29udCkgeworCisJaWYgKGNtZHFbY21kaV0gIT0gMCkgeworI2lmIDAKKwkgICAgcmVtb3ZlX2hpc3RvcnkoY21kcVtjbWRpXSk7CisjZWxzZQorCSAgICByZW1vdmVfaGlzdG9yeShjbWRpKTsKKyNlbmRpZgorCSAgICBmcmVlKGNtZHFbY21kaV0pOworCSAgICBjbWRxW2NtZGldID0gMDsKKwl9CisJY21kcVtjbWRpXSA9IHJlYWRsaW5lKCJzaXM+ICIpOworCWlmIChjbWRxW2NtZGldICYmICpjbWRxW2NtZGldKQorCSAgICBhZGRfaGlzdG9yeShjbWRxW2NtZGldKTsKKwlpZiAoY21kcVtjbWRpXSkKKwkgICAgc3RhdCA9IGV4ZWNfY21kKCZzcmVncywgY21kcVtjbWRpXSk7CisJZWxzZSB7CisJICAgIHB1dHMoIlxuIik7CisJICAgIGV4aXQoMCk7CisJfQorCXN3aXRjaCAoc3RhdCkgeworCWNhc2UgT0s6CisJICAgIGJyZWFrOworCWNhc2UgQ1RSTF9DOgorCSAgICBwcmludGYoIlxiXGJJbnRlcnJ1cHQhXG4iKTsKKwljYXNlIFRJTUVfT1VUOgorCSAgICBwcmludGYoIiBTdG9wcGVkIGF0IHRpbWUgJWQgKCUuM2YgbXMpXG4iLCBlYmFzZS5zaW10aW1lLCAKKwkgICAgICAoKGRvdWJsZSkgZWJhc2Uuc2ltdGltZSAvIChkb3VibGUpIHNyZWdzLmZyZXEpIC8gMTAwMC4wKTsKKwkgICAgYnJlYWs7CisJY2FzZSBCUFRfSElUOgorCSAgICBwcmludGYoImJyZWFrcG9pbnQgYXQgMHglMDh4IHJlYWNoZWRcbiIsIHNyZWdzLnBjKTsKKwkgICAgc3JlZ3MuYnBoaXQgPSAxOworCSAgICBicmVhazsKKwljYXNlIEVSUk9SOgorCSAgICBwcmludGYoIklVIGluIGVycm9yIG1vZGUgKCVkKVxuIiwgc3JlZ3MudHJhcCk7CisJICAgIHN0YXQgPSAwOworCSAgICBwcmludGYoIiAlOGQgIiwgZWJhc2Uuc2ltdGltZSk7CisJICAgIGRpc19tZW0oc3JlZ3MucGMsIDEsICZkaW5mbyk7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIGJyZWFrOworCX0KKwljdHJsX2MgPSAwOworCXN0YXQgPSBPSzsKKworCWNtZGkgPSAoY21kaSArIDEpICYgKEhJU1RfTEVOIC0gMSk7CisKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3NpbS9lcmMzMi9zaXMuaCBiL3NpbS9lcmMzMi9zaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTg5NWMwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2VyYzMyL3Npcy5oCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgU0lTLgorICogCisgKiBFUkMzMlNJTSwgU1BBUkMgaW5zdHJ1Y3Rpb24gc2ltdWxhdG9yLiBDb3B5cmlnaHQgKEMpIDE5OTUgSmlyaSBHYWlzbGVyLAorICogRXVyb3BlYW4gU3BhY2UgQWdlbmN5CisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUKKyAqIE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAKKyAqLworCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIKKworI2luY2x1ZGUgImVuZC5oIgorCisjZGVmaW5lIElfQUNDX0VYQyAxCisKKy8qIE1heGltdW0gZXZlbnRzIGluIGV2ZW50IHF1ZXVlICovCisjZGVmaW5lIEVWRU5UX01BWAkyNTYKKworLyogTWF4aW11bSAjIG9mIGZsb2F0aW5nIHBvaW50IHF1ZXVlICovCisjZGVmaW5lIEZQVVFOCTEKKworLyogTWF4aW11bSAjIG9mIGJyZWFrcG9pbnRzICovCisjZGVmaW5lIEJQVF9NQVgJMjU2CisKK3N0cnVjdCBoaXN0eXBlIHsKKyAgICB1bnNpZ25lZCAgICAgICAgYWRkcjsKKyAgICB1bnNpZ25lZCAgICAgICAgdGltZTsKK307CisKKy8qIHR5cGUgZGVmaW5pdGlvbnMgKi8KKwordHlwZWRlZiBzaG9ydCBpbnQgaW50MTY7CS8qIDE2LWJpdCBzaWduZWQgaW50ICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCB1aW50MTY7CS8qIDE2LWJpdCB1bnNpZ25lZCBpbnQgKi8KK3R5cGVkZWYgaW50ICAgICBpbnQzMjsJCS8qIDMyLWJpdCBzaWduZWQgaW50ICovCit0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzI7CS8qIDMyLWJpdCB1bnNpZ25lZCBpbnQgKi8KK3R5cGVkZWYgZmxvYXQgICBmbG9hdDMyOwkvKiAzMi1iaXQgZmxvYXQgKi8KK3R5cGVkZWYgZG91YmxlICBmbG9hdDY0OwkvKiA2NC1iaXQgZmxvYXQgKi8KKworLyogRklYTUU6IHdoYXQgYWJvdXQgaG9zdCBjb21waWxlcnMgdGhhdCBkb24ndCBzdXBwb3J0IDY0LWJpdCBpbnRzPyAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0OyAvKiA2NC1iaXQgdW5zaWduZWQgaW50ICovCit0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NDsJLyogNjQtYml0IHNpZ25lZCBpbnQgKi8KKworc3RydWN0IHBzdGF0ZSB7CisKKyAgICBmbG9hdDY0ICAgICAgICAgZmRbMTZdOwkvKiBGUFUgcmVnaXN0ZXJzICovCisjaWZkZWYgSE9TVF9MSVRUTEVfRU5ESUFOX0ZMT0FUCisgICAgZmxvYXQzMiAgICAgICAgIGZzWzMyXTsKKyAgICBmbG9hdDMyICAgICAgICAqZmRwOworI2Vsc2UKKyAgICBmbG9hdDMyICAgICAgICAqZnM7CisjZW5kaWYKKyAgICBpbnQzMiAgICAgICAgICAqZnNpOworICAgIHVpbnQzMiAgICAgICAgICBmc3I7CisgICAgaW50MzIgICAgICAgICAgIGZwc3RhdGU7CisgICAgdWludDMyICAgICAgICAgIGZwcVtGUFVRTiAqIDJdOworICAgIHVpbnQzMiAgICAgICAgICBmcHFuOworICAgIHVpbnQzMiAgICAgICAgICBmdGltZTsKKyAgICB1aW50MzIgICAgICAgICAgZmxyZDsKKyAgICB1aW50MzIgICAgICAgICAgZnJkOworICAgIHVpbnQzMiAgICAgICAgICBmcnMxOworICAgIHVpbnQzMiAgICAgICAgICBmcnMyOworICAgIHVpbnQzMiAgICAgICAgICBmcHVfcHJlczsJLyogRlBVIHByZXNlbnQgKDAgPSBObywgMSA9IFllcykgKi8KKworICAgIHVpbnQzMiAgICAgICAgICBwc3I7CS8qIElVIHJlZ2lzdGVycyAqLworICAgIHVpbnQzMiAgICAgICAgICB0YnI7CisgICAgdWludDMyICAgICAgICAgIHdpbTsKKyAgICB1aW50MzIgICAgICAgICAgZ1s4XTsKKyAgICB1aW50MzIgICAgICAgICAgclsxMjhdOworICAgIHVpbnQzMiAgICAgICAgICB5OworICAgIHVpbnQzMiAgICAgICAgICBhc3IxNzsgICAgICAvKiBTaW5nbGUgdmVjdG9yIHRyYXBwaW5nICovCisgICAgdWludDMyICAgICAgICAgIHBjLCBucGM7CisKKworICAgIHVpbnQzMiAgICAgICAgICB0cmFwOwkvKiBDdXJyZW50IHRyYXAgdHlwZSAqLworICAgIHVpbnQzMiAgICAgICAgICBhbm51bDsJLyogSW5zdHJ1Y3Rpb24gYW5udWwgKi8KKyAgICB1aW50MzIgICAgICAgICAgZGF0YTsJLyogTG9hZGVkIGRhdGEJICAgICAqLworICAgIHVpbnQzMiAgICAgICAgICBpbnN0OwkvKiBDdXJyZW50IGluc3RydWN0aW9uICovCisgICAgdWludDMyICAgICAgICAgIGFzaTsJLyogQ3VycmVudCBBU0kgKi8KKyAgICB1aW50MzIgICAgICAgICAgZXJyX21vZGU7CS8qIElVIGVycm9yIG1vZGUgKi8KKyAgICB1aW50MzIgICAgICAgICAgYnJlYWtwb2ludDsKKyAgICB1aW50MzIgICAgICAgICAgYnB0bnVtOworICAgIHVpbnQzMiAgICAgICAgICBicGhpdDsKKyAgICB1aW50MzIgICAgICAgICAgYnB0c1tCUFRfTUFYXTsJLyogQnJlYWtwb2ludHMgKi8KKworICAgIHVpbnQzMiAgICAgICAgICBsdGltZTsJLyogTG9hZCBpbnRlcmxvY2sgdGltZSAqLworICAgIHVpbnQzMiAgICAgICAgICBob2xkOwkvKiBJVSBob2xkIGN5Y2xlcyBpbiBjdXJyZW50IGluc3QgKi8KKyAgICB1aW50MzIgICAgICAgICAgZmhvbGQ7CS8qIEZQVSBob2xkIGN5Y2xlcyBpbiBjdXJyZW50IGluc3QgKi8KKyAgICB1aW50MzIgICAgICAgICAgaWNudDsJLyogSW5zdHJ1Y3Rpb24gY3ljbGVzIGluIGN1cnIgaW5zdCAqLworCisgICAgdWludDMyICAgICAgICAgIGhpc3RsZW47CS8qIFRyYWNlIGhpc3RvcnkgbWFuYWdlbWVudCAqLworICAgIHVpbnQzMiAgICAgICAgICBoaXN0aW5kOworICAgIHN0cnVjdCBoaXN0eXBlICpoaXN0YnVmOworICAgIGZsb2F0MzIgICAgICAgICBmcmVxOwkvKiBTaW11bGF0ZWQgcHJvY2Vzc29yIGZyZXF1ZW5jeSAqLworCisKKyAgICB1aW50MzIgICAgICAgICAgdG90dGltZTsKKyAgICB1aW50MzIgICAgICAgICAgbmluc3Q7CisgICAgdWludDMyICAgICAgICAgIGZob2xkdDsKKyAgICB1aW50MzIgICAgICAgICAgaG9sZHQ7CisgICAgdWludDMyICAgICAgICAgIGljbnR0OworICAgIHVpbnQzMiAgICAgICAgICBmaW5zdDsKKyAgICB1aW50MzIgICAgICAgICAgc2ltc3RhcnQ7CisgICAgdWludDMyICAgICAgICAgIHN0YXJ0dGltZTsKKyAgICB1aW50MzIgICAgICAgICAgdGxpbWl0OwkvKiBTaW11bGF0aW9uIHRpbWUgbGltaXQgKi8KKyAgICB1aW50MzIgICAgICAgICAgcHdkdGltZTsJLyogQ3ljbGVzIGluIHBvd2VyLWRvd24gbW9kZSAqLworICAgIHVpbnQzMiAgICAgICAgICBuc3RvcmU7CS8qIE51bWJlciBvZiBsb2FkIGluc3RydWN0aW9ucyAqLworICAgIHVpbnQzMiAgICAgICAgICBubG9hZDsJLyogTnVtYmVyIG9mIHN0b3JlIGluc3RydWN0aW9ucyAqLworICAgIHVpbnQzMiAgICAgICAgICBuYW5udWw7CS8qIE51bWJlciBvZiBhbm51bGVkIGluc3RydWN0aW9ucyAqLworICAgIHVpbnQzMiAgICAgICAgICBuYnJhbmNoOwkvKiBOdW1iZXIgb2YgYnJhbmNoIGluc3RydWN0aW9ucyAqLworICAgIHVpbnQzMiAgICAgICAgICBpbGRyZWc7CS8qIERlc3RpbmF0aW9uIG9mIGxhc3QgbG9hZCBpbnN0cnVjdGlvbiAqLworICAgIHVpbnQzMiAgICAgICAgICBpbGR0aW1lOwkvKiBMYXN0IHRpbWUgcG9pbnQgZm9yIGxvYWQgZGVwZW5kZW5jeSAqLworCisgICAgaW50ICAgICAgICAgICAgIHJldHRfZXJyOwkvKiBJVSBpbiBqbXBsL3Jlc3RvcmUgZXJyb3Igc3RhdGUgKFJldi4wKSAqLworICAgIGludCAgICAgICAgICAgICBqbXBsdGltZTsKK307CisKK3N0cnVjdCBldmNlbGwgeworICAgIHZvaWQgICAgICAgICAgICAoKmNmdW5jKSAoKTsKKyAgICBpbnQzMiAgICAgICAgICAgYXJnOworICAgIHVpbnQzMiAgICAgICAgICB0aW1lOworICAgIHN0cnVjdCBldmNlbGwgICpueHQ7Cit9OworCitzdHJ1Y3QgZXN0YXRlIHsKKyAgICBzdHJ1Y3QgZXZjZWxsICAgZXE7CisgICAgc3RydWN0IGV2Y2VsbCAgKmZyZWVxOworICAgIHVpbnQzMiAgICAgICAgICBzaW10aW1lOworfTsKKworc3RydWN0IGlycWNlbGwgeworICAgIHZvaWQgICAgICAgICAgICAoKmNhbGxiYWNrKSAoKTsKKyAgICBpbnQzMiAgICAgICAgICAgYXJnOworfTsKKworCisjZGVmaW5lIE9LIDAKKyNkZWZpbmUgVElNRV9PVVQgMQorI2RlZmluZSBCUFRfSElUIDIKKyNkZWZpbmUgRVJST1IgMworI2RlZmluZSBDVFJMX0MgNAorCisvKiBQcm90b3R5cGVzICAqLworCisvKiBlcmMzMi5jICovCitleHRlcm4gdm9pZAlpbml0X3NpbSBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZAlyZXNldCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZAllcnJvcl9tb2RlIFBBUkFNUyAoKHVpbnQzMiBwYykpOworZXh0ZXJuIHZvaWQJc2ltX2hhbHQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQJZXhpdF9zaW0gUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQJaW5pdF9zdGRpbyBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZAlyZXN0b3JlX3N0ZGlvIFBBUkFNUyAoKHZvaWQpKTsKK2V4dGVybiBpbnQJbWVtb3J5X3JlYWQgUEFSQU1TICgoaW50MzIgYXNpLCB1aW50MzIgYWRkciwgdWludDMyICpkYXRhLAorCQkJCSAgICAgaW50MzIgc3osIGludDMyICp3cykpOworZXh0ZXJuIGludAltZW1vcnlfd3JpdGUgUEFSQU1TICgoaW50MzIgYXNpLCB1aW50MzIgYWRkciwgdWludDMyICpkYXRhLAorCQkJCSAgICBpbnQzMiBzeiwgaW50MzIgKndzKSk7CitleHRlcm4gaW50CXNpc19tZW1vcnlfd3JpdGUgUEFSQU1TICgodWludDMyIGFkZHIsIGNoYXIgKmRhdGEsCisJCQkJCSAgdWludDMyIGxlbmd0aCkpOworZXh0ZXJuIGludAlzaXNfbWVtb3J5X3JlYWQgUEFSQU1TICgodWludDMyIGFkZHIsIGNoYXIgKmRhdGEsCisJCQkJCSB1aW50MzIgbGVuZ3RoKSk7CisKKy8qIGZ1bmMuYyAqLworZXh0ZXJuIHZvaWQJc2V0X3JlZ2kgUEFSQU1TICgoc3RydWN0IHBzdGF0ZSAqc3JlZ3MsIGludDMyIHJlZywKKwkJCQkgIHVpbnQzMiBydmFsKSk7CitleHRlcm4gdm9pZAlnZXRfcmVnaSBQQVJBTVMgKChzdHJ1Y3QgcHN0YXRlICpzcmVncywgaW50MzIgcmVnLCBjaGFyICpidWYpKTsKK2V4dGVybiBpbnQJZXhlY19jbWQgUEFSQU1TICgoc3RydWN0IHBzdGF0ZSAqc3JlZ3MsIGNoYXIgKmNtZCkpOworZXh0ZXJuIHZvaWQJcmVzZXRfc3RhdCBQQVJBTVMgKChzdHJ1Y3QgcHN0YXRlICAqc3JlZ3MpKTsKK2V4dGVybiB2b2lkCXNob3dfc3RhdCBQQVJBTVMgKChzdHJ1Y3QgcHN0YXRlICAqc3JlZ3MpKTsKK2V4dGVybiB2b2lkCWluaXRfYnB0IFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgICpzcmVncykpOworZXh0ZXJuIHZvaWQJaW5pdF9zaWduYWxzIFBBUkFNUyAoKHZvaWQpKTsKKworc3RydWN0IGRpc2Fzc2VtYmxlX2luZm87CitleHRlcm4gdm9pZAlkaXNfbWVtIFBBUkFNUyAoKHVpbnQzMiBhZGRyLCB1aW50MzIgbGVuLAorCQkJCSBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykpOworZXh0ZXJuIHZvaWQJZXZlbnQgUEFSQU1TICgodm9pZCAoKmNmdW5jKSAoKSwgaW50MzIgYXJnLCB1aW50MzIgZGVsdGEpKTsKK2V4dGVybiB2b2lkCXNldF9pbnQgUEFSQU1TICgoaW50MzIgbGV2ZWwsIHZvaWQgKCpjYWxsYmFjaykgKCksIGludDMyIGFyZykpOworZXh0ZXJuIHZvaWQJYWR2YW5jZV90aW1lIFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgICpzcmVncykpOworZXh0ZXJuIHVpbnQzMglub3cgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIGludAl3YWl0X2Zvcl9pcnEgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIGludAljaGVja19icHQgUEFSQU1TICgoc3RydWN0IHBzdGF0ZSAqc3JlZ3MpKTsKK2V4dGVybiB2b2lkCXJlc2V0X2FsbCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZAlzeXNfcmVzZXQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIHZvaWQJc3lzX2hhbHQgUEFSQU1TICgodm9pZCkpOworZXh0ZXJuIGludAliZmRfbG9hZCBQQVJBTVMgKChjaGFyICpmbmFtZSkpOworCisvKiBleGVjLmMgKi8KK2V4dGVybiBpbnQJZGlzcGF0Y2hfaW5zdHJ1Y3Rpb24gUEFSQU1TICgoc3RydWN0IHBzdGF0ZSAqc3JlZ3MpKTsKK2V4dGVybiBpbnQJZXhlY3V0ZV90cmFwIFBBUkFNUyAoKHN0cnVjdCBwc3RhdGUgKnNyZWdzKSk7CitleHRlcm4gaW50CWNoZWNrX2ludGVycnVwdHMgUEFSQU1TICgoc3RydWN0IHBzdGF0ZSAgKnNyZWdzKSk7CitleHRlcm4gdm9pZAlpbml0X3JlZ3MgUEFSQU1TICgoc3RydWN0IHBzdGF0ZSAqc3JlZ3MpKTsKKworLyogaW50ZXJmLmMgKi8KK2V4dGVybiBpbnQJcnVuX3NpbSBQQVJBTVMgKChzdHJ1Y3QgcHN0YXRlICpzcmVncywKKwkJCQkgdW5zaWduZWQgaW50IGljb3VudCwgaW50IGRpcykpOworCisvKiBmbG9hdC5jICovCitleHRlcm4gaW50CWdldF9hY2NleCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZAljbGVhcl9hY2NleCBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZAlzZXRfZnNyIFBBUkFNUyAoKHVpbnQzMiBmc3IpKTsKKworLyogaGVscC5jICovCitleHRlcm4gdm9pZAl1c2FnZSBQQVJBTVMgKCh2b2lkKSk7CitleHRlcm4gdm9pZAlnZW5faGVscCBQQVJBTVMgKCh2b2lkKSk7CmRpZmYgLS1naXQgYS9zaW0vZXJjMzIvc3RhcnRzaW0gYi9zaW0vZXJjMzIvc3RhcnRzaW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5YjQxYwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9lcmMzMi9zdGFydHNpbQpAQCAtMCwwICsxLDQgQEAKKyMKK3h0ZXJtIC1lIHNpcyAkKiAmCit4dGVybSAtZSB0aXAgL2Rldi90dHlwYyAmCisKZGlmZiAtLWdpdCBhL3NpbS9mcjMwL0NoYW5nZUxvZyBiL3NpbS9mcjMwL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDM5OWFhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2ZyMzAvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMjg3IEBACisxOTk5LTAyLTA5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChTSU1fRVhUUkFfREVQUyk6IEFkZCBmcjMwLWRlc2MuaCwgZGVsZXRlIGNwdS1vcGMuaC4KKwkqIGNvbmZpZ3VyZS5pbiAoc2ltX2xpbmtfZmlsZXMsc2ltX2xpbmtfbGlua3MpOiBEZWxldGUuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBkZWNvZGUuYyxkZWNvZGUuaCxtb2RlbC5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVidWlsZC4KKwkqIGZyMzAuYyAoZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSk6IENHRU5fSU5TTl9BVFRSIHJlbmFtZWQgdG8KKwlDR0VOX0lOU05fQVRUUl9WQUxVRS4KKwkqIG1sb29wLmluIChleHRyYWN0LXBiYik6IERpdHRvLiBVc2UgaWRlc2MtPmxlbmd0aCB0byBnZXQgaW5zbiBsZW5ndGguCisJKiBzaW0taWYuYyAoc2ltX29wZW4pOiBmcjMwX2NnZW5fY3B1X29wZW4gcmVuYW1lZCBmcm9tCisJZnIzMF9jZ2VuX29wY29kZV9vcGVuLiAgU2V0IGRpc2Fzc2VtYmxlci4KKwkoc2ltX2Nsb3NlKTogZnIzMF9jZ2VuX2NwdV9vcGVuIHJlbmFtZWQgZnJvbSBmcjMwX2NnZW5fb3Bjb2RlX29wZW4uCisJKiBzaW0tbWFpbi5oOiBEb24ndCBpbmNsdWRlIGNwdS1vcGMuaCxjcHUtc2ltLmguIEluY2x1ZGUKKwlmcjMwLWRlc2MuaCxmcjMwLW9wYy5oLGZyMzAtc2ltLmguCisKKzE5OTktMDEtMjcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogY3B1LmgsZGVjb2RlLmMsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlYnVpbGQuCisKKzE5OTktMDEtMTUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogY3B1LmgsZGVjb2RlLmgsbW9kZWwuYzogUmVnZW5lcmF0ZS4KKwkqIGZyMzAuYyAoZnIzMGJmX21vZGVsX2luc25fYmVmb3JlKTogQ2xlYXIgbG9hZF9yZWdzX3BlbmRpbmcuCisJKGZyMzBiZl9tb2RlbF9pbnNuX2FmdGVyKTogQ29weSBsb2FkX3JlZ3NfcGVuZGluZyB0byBsb2FkX3JlZ3MuCisJKGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjKTogQ2hlY2sgZm9yIGxvYWQgc3RhbGxzLgorCShmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfe2N0aSxsb2FkLHN0b3JlfSk6IERpdHRvLgorCisxOTk5LTAxLTE0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGFyY2guYyxhcmNoLmgsY3B1YWxsLmg6IFJlZ2VuZXJhdGUuCisJKiBjcHUuYyxjcHUuaCxkZWNvZGUuYyxkZWNvZGUuaCxtb2RlbC5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KKwkqIGRldmljZXMuYyAoZGV2aWNlX2lvX3dyaXRlX2J1ZmZlcik6IFJlbW92ZSBzb21lIG0zMnIgY3J1ZnQuCisJKiBmcjMwLXNpbS5oIChGUjMwX01JU0NfUFJPRklMRSk6IERlbGV0ZSwgcGx1cyBzdXBwb3J0aW5nIG1hY3Jvcy4KKwkoRUlUXyosTVNQUl8qLE1MQ1JfKixNUE1SXyopOiBEZWxldGUsIG0zMnIgY3J1ZnQuCisJKiBmcjMwLmMgKGZyMzBiZl9tb2RlbF9pbnNuX2FmdGVyKTogVXBkYXRlIGN5Y2xlIGNvdW50cy4KKwkoY2hlY2tfbG9hZF9zdGFsbCk6IE5ldyBmdW5jdGlvbi4KKwkoZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMpOiBVcGRhdGUgYXJndW1lbnQgbGlzdC4KKwkoZnIzMGJmX21vZGVsX2ZyMzBfMV91X3tjdGksbG9hZCxzdG9yZSxsZG0sc3RtfSk6IE5ldyBmdW5jdGlvbnMuCisJKiBzaW0taWYuYyAoc2ltX29wZW4pOiBDb21tZW50IG91dCBtZW1vcnkgbWFwcGVkIGRldmljZSBhbGxvY2F0aW9uLgorCURlbGV0ZSBGUjMwX01JU0NfUFJPRklMRSBoYW5kbGluZy4KKwkocHJpbnRfZnIzMF9taXNjX2NwdSk6IERlbGV0ZS4KKwkqIHNpbS1tYWluLmggKF9zaW1fY3B1KTogRGVsZXRlIG1lbWJlciBmcjMwX21pc2NfcHJvZmlsZS4KKwkqIHRyYXBzLmMgKHNpbV9lbmdpbmVfaW52YWxpZF9pbnNuKTogUENBRERSLT5JQUREUi4KKworMTk5OS0wMS0xMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoZnIzMC1jbGVhbik6IHJtIGVuZy5oLgorCisJKiBzaW0tbWFpbi5oOiBEZWxldGUgaW5jbHVzaW9uIG9mIGFuc2lkZWNsLmguCisJSW5jbHVkZSBzaW0tYmFzaWNzLmggYmVmb3JlIGNnZW4tdHlwZXMuaC4KKwlEZWxldGUgaW5jbHVzaW9uIG9mIGNnZW4tc2NhY2hlLmgsY2dlbi1jcHUuaCxjZ2VuLXRyYWNlLmgsY3B1YWxsLmguCisJKiBjcHUuaCxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCisKKzE5OTktMDEtMDUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKE1BSU5fSU5DTFVERV9ERVBTKTogRGVsZXRlLgorCShJTkNMVURFX0RFUFMsT1BTX0lOQ0xVREVfREVQUyk6IERlbGV0ZS4KKwkoc2ltLWlmLm8sYXJjaC5vLGRldmljZXMubyk6IFVzZSBTSU1fTUFJTl9ERVBTLgorCShGUjMwQkZfSU5DTFVERV9ERVBTKTogVXNlIENHRU5fTUFJTl9DUFVfREVQUy4KKwkobWxvb3AubyxjcHUubyxkZWNvZGUubyxzZW0ubyxtb2RlbC5vKTogU2ltcGxpZnkgZGVwZW5kZW5jaWVzLgorCSogY3B1LmMsY3B1LmgsZGVjb2RlLmMsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCisJKiBmcjMwLXNpbS5oIChmcjMwYmZfaF9zYml0X1tnc11ldF9oYW5kbGVyKTogRGVjbGFyZS4KKwkoW0dTXUVUX0hfU0JJVCk6IERlZmluZS4KKwkoZnIzMGJmX2hfY2NyX1tnc11ldF9oYW5kbGVyKTogRGVjbGFyZS4KKwkoW0dTXUVUX0hfQ0NSKTogRGVmaW5lLgorCShmcjMwYmZfaF9zY3JfW2dzXWV0X2hhbmRsZXIpOiBEZWNsYXJlLgorCShbR1NdRVRfSF9TQ1IpOiBEZWZpbmUuCisJKGZyMzBiZl9oX2lsbV9bZ3NdZXRfaGFuZGxlcik6IERlY2xhcmUuCisJKFtHU11FVF9IX0lMTSk6IERlZmluZS4KKwkoZnIzMGJmX2hfcHNfW2dzXWV0X2hhbmRsZXIpOiBEZWNsYXJlLgorCShbR1NdRVRfSF9QUyk6IERlZmluZS4KKwkoZnIzMGJmX2hfZHJfW2dzXWV0X2hhbmRsZXIpOiBEZWNsYXJlLgorCShbR1NdRVRfSF9EUik6IERlZmluZS4KKwkqIGZyMzAuYyAoYWxsIHJlZ2lzdGVyIGFjY2VzcyBmbnMpOiBSZW5hbWUgdG8gLi4uX2hhbmRsZXIuCisJKGZyMzBiZl9oXypfZ2V0X2hhbmRsZXIsZnIzMGJmX2hfKl9zZXRfaGFuZGxlcik6IFJld3JpdGUgdG8gdXNlCisJQ1BVIG9yIEdFVF9IX0ZPTy9TRVRfSF9GT08gYWNjZXNzIG1hY3JvcyBhcyBhcHByb3ByaWF0ZS4KKwkqIHNpbS1pZi5jIChzaW1fb3Blbik6IE1vZGVsIHByb2JpbmcgY29kZSBtb3ZlZCB0byBzaW0tbW9kZWwuYy4KKworRnJpIERlYyAxOCAxNzowOTozNCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIGZyMzAuYyAoZnIzMGJmX3N0b3JlX3JlZ2lzdGVyKTogQ2FsbCBhX2ZyMzBfaF9kcl9zZXQgZm9yCisJZGVkaWNhdGVkIHJlZ2lzdGVycy4KKworVGh1IERlYyAxNyAxNzoxNzo0OCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KKworVHVlIERlYyAxNSAxNzozOTo1OSAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIHRyYXBzLmMgKHNldHVwX2ludCk6IENvcnJlY3QgY2FsbHMgdG8gU0VUTUVNU0kuCisJKGZyMzBfaW50KTogTXVzdCBjYWxjdWxhdGUgbmV3IHBjIGFmdGVyIHNhdmluZyBvbGQgb25lLgorCSogZnIzMC5jIChmcjMwYmZfaF9zYml0X2dldCk6IE5ldyBmdW5jdGlvbi4KKwkoZnIzMGJmX2hfc2JpdF9zZXQpOiBOZXcgZnVuY3Rpb24uCisJKGZyMzBiZl9oX2Njcl9zZXQpOiBVc2UgZnIzMGJmX2hfc2JpdF9zZXQgYW5kIG1vdmUgc3RhY2sgc3dpdGNoaW5nCisJbG9naWMgdG8gdGhhdCBmdW5jdGlvbi4KKwkqIGNwdS5bY2hdLGRlY29kZS5jLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgorCisxOTk4LTEyLTE0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogLS1lbmFibGUtY2dlbi1tYWludCBtb3ZlZCB0byBjb21tb24vYWNsb2NhbC5tNC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworCSogc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgorCisJKiB0cmFwcy5jIChzZXR1cF9pbnQpOiBVc2UgZW51bXMgZm9yIHJlZ2lzdGVyIG51bWJlcnMuCisJKGZyMzBfaW50KTogRGl0dG8uCisKKzE5OTgtMTItMTQgIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogY3B1LmgsZGVjb2RlLltjaF0sbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCisKK1RodSBEZWMgMTAgMTg6NDM6MTMgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBhcmNoLltjaF0sY3B1LltjaF0sZGVjb2RlLmMsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCisJKiBmcjMwLmMgKGZyMzBiZl9oX3Njcl9nZXQpOiBJbXBsZW1lbnQgYXMgc2VwYXJhdGUgYml0cy4KKwkoZnIzMGJmX2hfc2NyX3NldCk6IEltcGxlbWVudCBhcyBzZXBhcmF0ZSBiaXRzLgorCitXZWQgRGVjICA5IDEzOjI1OjM3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNwdS5oLGRlY29kZS5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KKworVHVlIERlYyAgOCAxMzoxNToyMyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIGNwdS5oLGRlY29kZS5jLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgorCitNb24gRGVjICA3IDE0OjM1OjIzIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogdHJhcHMuYyAoZnIzMF9pbnRlKTogTmV3IGZ1bmN0aW9uLgorCSogY3B1LmgsZGVjb2RlLmMsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCisKKzE5OTgtMTItMDUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogY3B1LmgsY3B1YWxsLmgsZGVjb2RlLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgorCSogbWxvb3AuaW4gKGV4dHJhY3QpOiBNYWtlIHN0YXRpYyBpbmxpbmUuICBSZXdyaXRlLgorCShleGVjdXRlKTogQ2hlY2sgQVJHQlVGX1BST0ZJTEVfUCBiZWZvcmUgcHJvZmlsaW5nLgorCVVwZGF0ZSBjYWxscyB0byBUUkFDRV9JTlNOX0lOSVQsVFJBQ0VfSU5TTl9GSU5JLgorCitGcmkgRGVjICA0IDE2OjE4OjI1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNlbS5jLHNlbS1zd2l0Y2guYzogUmVnZW5lcmF0ZS4KKwkqIGNwdS5oLGRlY29kZS5jOiBSZWdlbmVyYXRlLgorCitGcmkgRGVjICA0IDE3OjA5OjI3IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogY3B1LmgsZGVjb2RlLmMsZGVjb2RlLmgsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCisKK0ZyaSBEZWMgIDQgMDA6MjI6NDMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY3B1LmgsZGVjb2RlLmMsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCisKK1RodSBEZWMgIDMgMTc6MzM6MTYgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBmcjMwLmMgKGZyMzBiZl9oX2Njcl9nZXQpOiBOZXcgZnVuY3Rpb24uCisJKGZyMzBiZl9oX2Njcl9zZXQpOiBOZXcgZnVuY3Rpb24uCisJKGZyMzBiZl9oX3BzX2dldCk6IFVzZSBjY3IgYWNjZXNzIGZ1bmN0aW9uLgorCShmcjMwYmZfaF9wc19zZXQpOiBVc2UgY2NyIGFjY2VzcyBmdW5jdGlvbi4KKwkoZnIzMGJmX2hfc2NyX2dldCk6IE5ldyBmdW5jdGlvbi4KKwkoZnIzMGJmX2hfc2NyX3NldCk6IE5ldyBmdW5jdGlvbi4KKwkoZnIzMGJmX2hfaWxtX2dldCk6IE5ldyBmdW5jdGlvbi4KKwkoZnIzMGJmX2hfaWxtX3NldCk6IE5ldyBmdW5jdGlvbgorCShmcjMwYmZfaF9wc19nZXQpOiBJbXBsZW1lbnQgc3JjIGFuZCBpbG0uCisJKGZyMzBiZl9oX3BzX3NldCk6IEltcGxlbWVudCBzcmMgYW5kIGlsbS4KKworCSogYXJjaC5jLGFyY2guaCxjcHUuaCxkZWNvZGUuYyxkZWNvZGUuaCxtb2RlbC5jLAorCXNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KKworVGh1IERlYyAgMyAwMDoxNToxMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjcHUuaCxkZWNvZGUuYyxtb2RlbC5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KKworMTk5OC0xMS0zMCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBtbG9vcC5pbiAoZXh0cmFjdC1wYmIpOiBBZGQgZGVsYXkgc2xvdCBzdXBwb3J0LgorCSogY3B1LmgsZGVjb2RlLmMsZGVjb2RlLmgsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCisKK1RodSBOb3YgMjYgMTE6Mjg6MzAgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBjcHUuaCxkZWNvZGUuYyxtb2RlbC5jLHNlbS5jLHNlbS1zd2l0Y2guYzogUmVnZW5lcmF0ZWQuCisKK01vbiBOb3YgMjMgMTg6MzA6MzYgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBjcHUuaCxkZWNvZGUuYyxtb2RlbC5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZWQuCisKKzE5OTgtMTEtMjAgIERvdWcgRXZhbnMgIDxkZXZhbnNAdG9ib3IudG8uY3lnbnVzLmNvbT4KKworCSogZnIzMC1zaW0uaCAoKi1SRUdOVU0pOiBTeW5jIHVwIHdpdGggZ2RiLgorCSogZnIzMC5jIChkZWNvZGVfZ2RiX2RyX3JlZ251bSk6IE5ldyBmdW5jdGlvbi4KKwkoZnIzMGJmX2ZldGNoX3JlZ2lzdGVyKTogSW1wbGVtZW50LgorCShmcjMwYmZfc3RvcmVfcmVnaXN0ZXIpOiBEaXR0by4KKwkoZnIzMGJmX2hfcHNfZ2V0LGZyMzBiZl9oX3BzX3NldCk6IERpdHRvLgorCShmcjMwYmZfaF9kcl9nZXQsZnIzMGJmX2hfZHJfc2V0KTogTmV3IGZ1bmN0aW9ucy4KKwkqIHNlbS1zd2l0Y2guYyxzZW0uYzogUmVidWlsZC4KKwkqIHRyYXBzLmMgKHNldHVwX2ludCk6IE5ldyBmdW5jdGlvbgorCShmcjMwX2ludCk6IEhhbmRsZSBhbGwgaW50IGluc24gcHJvY2Vzc2luZyBoZXJlLgorCURvbid0IHNhdmUgcHMscGMgaWYgYnJlYWtwb2ludCB0cmFwLgorCSogY3B1LmMsY3B1LmgsZGVjb2RlLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgorCitUaHUgTm92IDE5IDE2OjA1OjA5IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogdHJhcHMuYyAoZnIzMF9pbnQpOiBDb3JyZWN0IHJlZ2lzdGVyIHVzYWdlLgorCSogYXJjaC5jOiBSZWdlbmVyYXRlZC4KKwkqIGFyY2guaDogUmVnZW5lcmF0ZWQuCisJKiBjcHUuYzogUmVnZW5lcmF0ZWQuCisJKiBjcHUuaDogUmVnZW5lcmF0ZWQuCisJKiBkZWNvZGUuYzogUmVnZW5lcmF0ZWQuCisJKiBkZWNvZGUuaDogUmVnZW5lcmF0ZWQuCisJKiBtb2RlbC5jOiBSZWdlbmVyYXRlZC4KKwkqIHNlbS1zd2l0Y2guYzogUmVnZW5lcmF0ZWQuCisJKiBzZW0uYzogUmVnZW5lcmF0ZWQuCisKK1dlZCBOb3YgMTggMjE6Mzk6MzcgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBmcjMwLXNpbS5oIChUUkFQX1NZU0NBTEwsIFRSQVBfQlJFQUtQT0lOVCk6IFJlZGVmaW5lIGZvciBmcjMwLgorCSogZnIzMC5jIChmcjMwYmZfaF9wc19nZXQpOiBOZXcgZnVuY3Rpb24uCisJKGZyMzBiZl9oX3BzX3NldCk6IE5ldyBmdW5jdGlvbi4KKwkqIG1sb29wLmluOiBTZXQgdXAgZmFzdC1wYmIgbW9kZWwgZm9yIGZyMzAuCisJKiB0cmFwcy5jIChmcjMwX2ludCk6IE5ldyBmdW5jdGlvbi4KKwkqIGFyY2guYzogUmVnZW5lcmF0ZWQuCisJKiBhcmNoLmg6IFJlZ2VuZXJhdGVkLgorCSogY3B1LmM6IFJlZ2VuZXJhdGVkLgorCSogY3B1Lmg6IFJlZ2VuZXJhdGVkLgorCSogZGVjb2RlLmM6IFJlZ2VuZXJhdGVkLgorCSogbW9kZWwuYzogUmVnZW5lcmF0ZWQuCisJKiBzZW0tc3dpdGNoLmM6IFJlZ2VuZXJhdGVkLgorCSogc2VtLmM6IFJlZ2VuZXJhdGVkLgorCisxOTk4LTExLTE4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChGUjMwX09CSlMpOiBEZWxldGUgZXh0cmFjdC5vLgorCShGUjMwQkZfSU5DTFVERV9ERVBTKTogQWRkIGNnZW4tZW5naW5lLmguCisJKGV4dHJhY3Qubyk6IERlbGV0ZSBydWxlIGZvci4KKwkqIG1sb29wLmluOiBSZXdyaXRlLgorCSogY3B1LmMsY3B1LmgsZGVjb2RlLmMsZGVjb2RlLmgsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlYnVpbGQuCisKK1dlZCBOb3YgMTggMTE6MzE6MjEgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBzZW0tc3dpdGNoLmM6IFJlZ2VuZXJhdGVkLgorCSogc2VtLmM6IFJlZ2VuZXJhdGVkLgorCitNb24gTm92IDE2IDE5OjIzOjQ0IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogYXJjaC5jOiBSZWdlbmVyYXRlZC4KKwkqIGFyY2guaDogUmVnZW5lcmF0ZWQuCisJKiBjcHUuYzogUmVnZW5lcmF0ZWQuCisJKiBjcHUuaDogUmVnZW5lcmF0ZWQuCisJKiBkZWNvZGUuYzogUmVnZW5lcmF0ZWQuCisJKiBkZWNvZGUuaDogUmVnZW5lcmF0ZWQuCisJKiBleHRyYWN0LmM6IFJlZ2VuZXJhdGVkLgorCSogbW9kZWwuYzogUmVnZW5lcmF0ZWQuCisJKiBzZW0tc3dpdGNoLmM6IFJlZ2VuZXJhdGVkLgorCSogc2VtLmM6IFJlZ2VuZXJhdGVkLgorCitUaHUgTm92IDEyIDE5OjI3OjUwIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogYXJjaC5jOiBSZWdlbmVyYXRlZC4KKwkqIGFyY2guaDogUmVnZW5lcmF0ZWQuCisJKiBjcHUuYzogUmVnZW5lcmF0ZWQuCisJKiBjcHUuaDogUmVnZW5lcmF0ZWQuCisJKiBkZWNvZGUuYzogUmVnZW5lcmF0ZWQuCisJKiBkZWNvZGUuaDogUmVnZW5lcmF0ZWQuCisJKiBleHRyYWN0LmM6IFJlZ2VuZXJhdGVkLgorCSogbW9kZWwuYzogUmVnZW5lcmF0ZWQuCisJKiBzZW0tc3dpdGNoLmM6IFJlZ2VuZXJhdGVkLgorCSogc2VtLmM6IFJlZ2VuZXJhdGVkLgorCSogZnIzMC5jOiBHZXQgcmlkIG9mIHVudXNlZCBmdW5jdGlvbnMuCisKK01vbiBOb3YgIDkgMTg6MjU6NDcgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBhcmNoLmM6IFJlZ2VuZXJhdGVkLgorCSogYXJjaC5oOiBSZWdlbmVyYXRlZC4KKwkqIGNwdS5jOiBSZWdlbmVyYXRlZC4KKwkqIGNwdS5oOiBSZWdlbmVyYXRlZC4KKwkqIGRlY29kZS5jOiBSZWdlbmVyYXRlZC4KKwkqIGRlY29kZS5oOiBSZWdlbmVyYXRlZC4KKwkqIGV4dHJhY3QuYzogUmVnZW5lcmF0ZWQuCisJKiBtb2RlbC5jOiBSZWdlbmVyYXRlZC4KKwkqIHNlbS1zd2l0Y2guYzogUmVnZW5lcmF0ZWQuCisJKiBzZW0uYzogUmVnZW5lcmF0ZWQuCisJKiBmcjMwLmM6IEdldCByaWQgb2YgbTMyciBzdHVmZi4gRmxlc2ggb3V0IGZyMzAgc3R1ZmYuCisKK1RodSBOb3YgIDUgMTU6MjY6MjIgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBjcHUuaDogUmVnZW5lcmF0ZWQuCisKK1R1ZSBPY3QgMjcgMTU6Mzk6NDggMTk5NiAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBEaXJlY3RvcnkgY3JlYXRlZC4KZGlmZiAtLWdpdCBhL3NpbS9mcjMwL01ha2VmaWxlLmluIGIvc2ltL2ZyMzAvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3MzEyZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9mcjMwL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsOTAgQEAKKyMgTWFrZWZpbGUgdGVtcGxhdGUgZm9yIENvbmZpZ3VyZSBmb3IgdGhlIGZyMzAgc2ltdWxhdG9yCisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMjIENPTU1PTl9QUkVfQ09ORklHX0ZSQUcKKworRlIzMF9PQkpTID0gZnIzMC5vIGNwdS5vIGRlY29kZS5vIHNlbS5vIG1vZGVsLm8gbWxvb3AubworCitDT05GSUdfREVWSUNFUyA9IGR2LXNvY2tzZXIubworQ09ORklHX0RFVklDRVMgPQorCitTSU1fT0JKUyA9IFwKKwkkKFNJTV9ORVdfQ09NTU9OX09CSlMpIFwKKwlzaW0tY3B1Lm8gXAorCXNpbS1obG9hZC5vIFwKKwlzaW0taHJ3Lm8gXAorCXNpbS1tb2RlbC5vIFwKKwlzaW0tcmVnLm8gXAorCWNnZW4tdXRpbHMubyBjZ2VuLXRyYWNlLm8gY2dlbi1zY2FjaGUubyBcCisJY2dlbi1ydW4ubyBzaW0tcmVhc29uLm8gc2ltLWVuZ2luZS5vIHNpbS1zdG9wLm8gXAorCXNpbS1pZi5vIGFyY2gubyBcCisJJChGUjMwX09CSlMpIFwKKwl0cmFwcy5vIGRldmljZXMubyBcCisJJChDT05GSUdfREVWSUNFUykKKworIyBFeHRyYSBoZWFkZXJzIGluY2x1ZGVkIGJ5IHNpbS1tYWluLmguCitTSU1fRVhUUkFfREVQUyA9IFwKKwkkKENHRU5fSU5DTFVERV9ERVBTKSBcCisJYXJjaC5oIGNwdWFsbC5oIGZyMzAtc2ltLmggJChzcmNkaXIpLy4uLy4uL29wY29kZXMvZnIzMC1kZXNjLmgKKworU0lNX0VYVFJBX0NGTEFHUyA9CisKK1NJTV9SVU5fT0JKUyA9IG5ydW4ubworU0lNX0VYVFJBX0NMRUFOID0gZnIzMC1jbGVhbgorCisjIFRoaXMgc2VsZWN0cyB0aGUgZnIzMCBuZXdsaWIvbGliZ2xvc3Mgc3lzY2FsbCBkZWZpbml0aW9ucy4KK05MX1RBUkdFVCA9IC1ETkxfVEFSR0VUX2ZyMzAKKworIyMgQ09NTU9OX1BPU1RfQ09ORklHX0ZSQUcKKworYXJjaCA9IGZyMzAKKworc2ltLWlmLm86IHNpbS1pZi5jICQoU0lNX01BSU5fREVQUykgJChzcmNkaXIpLy4uL2NvbW1vbi9zaW0tY29yZS5oCisKK2FyY2gubzogYXJjaC5jICQoU0lNX01BSU5fREVQUykKKworZGV2aWNlcy5vOiBkZXZpY2VzLmMgJChTSU1fTUFJTl9ERVBTKQorCisjIEZSMzAgb2JqcworCitGUjMwQkZfSU5DTFVERV9ERVBTID0gXAorCSQoQ0dFTl9NQUlOX0NQVV9ERVBTKSBcCisJY3B1LmggZGVjb2RlLmggZW5nLmgKKworZnIzMC5vOiBmcjMwLmMgJChGUjMwQkZfSU5DTFVERV9ERVBTKQorCisjIEZJWE1FOiBVc2Ugb2YgYG1vbm8nIGlzIHdpcC4KK21sb29wLmMgZW5nLmg6IHN0YW1wLW1sb29wCitzdGFtcC1tbG9vcDogJChzcmNkaXIpLy4uL2NvbW1vbi9nZW5tbG9vcC5zaCBtbG9vcC5pbiBNYWtlZmlsZQorCSQoU0hFTEwpICQoc3JjY29tKS9nZW5tbG9vcC5zaCBcCisJCS1tb25vIC1mYXN0IC1wYmIgLXN3aXRjaCBzZW0tc3dpdGNoLmMgXAorCQktY3B1IGZyMzBiZiAtaW5maWxlICQoc3JjZGlyKS9tbG9vcC5pbgorCSQoU0hFTEwpICQoc3Jjcm9vdCkvbW92ZS1pZi1jaGFuZ2UgZW5nLmhpbiBlbmcuaAorCSQoU0hFTEwpICQoc3Jjcm9vdCkvbW92ZS1pZi1jaGFuZ2UgbWxvb3AuY2luIG1sb29wLmMKKwl0b3VjaCBzdGFtcC1tbG9vcAorbWxvb3AubzogbWxvb3AuYyBzZW0tc3dpdGNoLmMgJChGUjMwQkZfSU5DTFVERV9ERVBTKQorCitjcHUubzogY3B1LmMgJChGUjMwQkZfSU5DTFVERV9ERVBTKQorZGVjb2RlLm86IGRlY29kZS5jICQoRlIzMEJGX0lOQ0xVREVfREVQUykKK3NlbS5vOiBzZW0uYyAkKEZSMzBCRl9JTkNMVURFX0RFUFMpCittb2RlbC5vOiBtb2RlbC5jICQoRlIzMEJGX0lOQ0xVREVfREVQUykKKworZnIzMC1jbGVhbjoKKwlybSAtZiBtbG9vcC5jIGVuZy5oIHN0YW1wLW1sb29wCisJcm0gLWYgdG1wLSoKKwpkaWZmIC0tZ2l0IGEvc2ltL2ZyMzAvUkVBRE1FIGIvc2ltL2ZyMzAvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YmYzMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZnIzMC9SRUFETUUKQEAgLTAsMCArMSwxNCBAQAorVGhpcyBpcyB0aGUgZnIzMCBzaW11bGF0b3IgZGlyZWN0b3J5LgorCitJdCBpcyBzdGlsbCB3b3JrLWluLXByb2dyZXNzLiAgVGhlIGN1cnJlbnQgc291cmNlcyBhcmUgcmVhc29uYWJseQord2VsbCB0ZXN0ZWQgYW5kIGxvdHMgb2YgZmVhdHVyZXMgYXJlIGluLiAgSG93ZXZlciwgdGhlcmUncyBsb3RzCittb3JlIHlldCB0byBjb21lLgorCitUaGVyZSBhcmUgbG90cyBvZiBtYWNoaW5lIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSEKK1RoZXkgYXJlIG9ubHkgZ2VuZXJhdGVkIGlmIHlvdSBjb25maWd1cmUgd2l0aCAtLWVuYWJsZS1jZ2VuLW1haW50LAorc2ltaWxhciBpbiBiZWhhdmlvdXIgdG8gTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZSB1bmRlciBhdXRvbWFrZS9hdXRvY29uZi4KKworRm9yIGRldGFpbHMgb24gdGhlIGdlbmVyYXRvciwgc2VlIC4uLy4uL2NnZW4uCisKK2Rldm8vY2dlbiBpc24ndCBwYXJ0IG9mIHRoZSBjb21wLXRvb2xzIG1vZHVsZSB5ZXQuCitZb3UnbGwgbmVlZCB0byBjaGVjayBpdCBvdXQgbWFudWFsbHkgKGFsc28gYWtpbiB0byBhdXRvbWFrZS9hdXRvY29uZikuCmRpZmYgLS1naXQgYS9zaW0vZnIzMC9UT0RPIGIvc2ltL2ZyMzAvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTRjNzYwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2ZyMzAvVE9ETwpAQCAtMCwwICsxLDE0IEBACittMzJyLWluaGVyaXRlZCBzdHVmZj8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0gaGVhZGVyIGZpbGUgZGVwZW5kZW5jaWVzIHJldmlzaXQKKy0gaG9va3MgY2xlYW51cAorLSB0ZXN0c3VpdGVzCistIEZJWE1FJ3MKKworCittMzJyIHN0dWZmPworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSBtZW1vcnkgYWNjZXNzZXMgc3RpbGwgdGVzdCBpZiBwcm9maWxpbmcgaXMgb24gZXZlbiBpbiBmYXN0IG1vZGUKKy0gaGF2ZSBzZW1hbnRpYyBjb2RlIHVzZSBHL1NFVF9IX0ZPTyBpZiBub3QgZGVmYXVsdCBbaW5jbCBmdW4tYWNjZXNzXQorLSBoYXZlIEcvU0VUX0hfRk9PIG1hY3JvcyBjYWxsIGZ1bmN0aW9uIGlmIGZ1bi1hY2Nlc3MKKy0gLS0+IGNhbiBhbHdheXMgdXNlIEcvU19IX0ZPTyBtYWNyb3MKZGlmZiAtLWdpdCBhL3NpbS9mcjMwL2FyY2guYyBiL3NpbS9mcjMwL2FyY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjZlMjNlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2ZyMzAvYXJjaC5jCkBAIC0wLDAgKzEsNjk1IEBACisvKiBTaW11bGF0b3Igc3VwcG9ydCBmb3IgZnIzMC4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAiYmZkLmgiCisKK2NvbnN0IE1BQ0ggKnNpbV9tYWNoc1tdID0KK3sKKyNpZmRlZiBIQVZFX0NQVV9GUjMwQkYKKyAgJiBmcjMwX21hY2gsCisjZW5kaWYKKyAgMAorfTsKKworLyogR2V0IHRoZSB2YWx1ZSBvZiBoLXBjLiAgKi8KKworVVNJCithX2ZyMzBfaF9wY19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9GUjMwQkYKKyAgICBjYXNlIGJmZF9tYWNoX2ZyMzAgOiAKKyAgICAgIHJldHVybiBmcjMwYmZfaF9wY19nZXQgKGN1cnJlbnRfY3B1KTsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC1wYy4gICovCisKK3ZvaWQKK2FfZnIzMF9oX3BjX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVTSSBuZXd2YWwpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX0ZSMzBCRgorICAgIGNhc2UgYmZkX21hY2hfZnIzMCA6IAorICAgICAgZnIzMGJmX2hfcGNfc2V0IChjdXJyZW50X2NwdSwgbmV3dmFsKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1nci4gICovCisKK1NJCithX2ZyMzBfaF9ncl9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vKQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9GUjMwQkYKKyAgICBjYXNlIGJmZF9tYWNoX2ZyMzAgOiAKKyAgICAgIHJldHVybiBmcjMwYmZfaF9ncl9nZXQgKGN1cnJlbnRfY3B1LCByZWdubyk7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtZ3IuICAqLworCit2b2lkCithX2ZyMzBfaF9ncl9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vLCBTSSBuZXd2YWwpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX0ZSMzBCRgorICAgIGNhc2UgYmZkX21hY2hfZnIzMCA6IAorICAgICAgZnIzMGJmX2hfZ3Jfc2V0IChjdXJyZW50X2NwdSwgcmVnbm8sIG5ld3ZhbCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtY3IuICAqLworCitTSQorYV9mcjMwX2hfY3JfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubykKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfRlIzMEJGCisgICAgY2FzZSBiZmRfbWFjaF9mcjMwIDogCisgICAgICByZXR1cm4gZnIzMGJmX2hfY3JfZ2V0IChjdXJyZW50X2NwdSwgcmVnbm8pOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLWNyLiAgKi8KKwordm9pZAorYV9mcjMwX2hfY3Jfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubywgU0kgbmV3dmFsKQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9GUjMwQkYKKyAgICBjYXNlIGJmZF9tYWNoX2ZyMzAgOiAKKyAgICAgIGZyMzBiZl9oX2NyX3NldCAoY3VycmVudF9jcHUsIHJlZ25vLCBuZXd2YWwpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWRyLiAgKi8KKworU0kKK2FfZnIzMF9oX2RyX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVJTlQgcmVnbm8pCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX0ZSMzBCRgorICAgIGNhc2UgYmZkX21hY2hfZnIzMCA6IAorICAgICAgcmV0dXJuIGZyMzBiZl9oX2RyX2dldCAoY3VycmVudF9jcHUsIHJlZ25vKTsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC1kci4gICovCisKK3ZvaWQKK2FfZnIzMF9oX2RyX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVJTlQgcmVnbm8sIFNJIG5ld3ZhbCkKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfRlIzMEJGCisgICAgY2FzZSBiZmRfbWFjaF9mcjMwIDogCisgICAgICBmcjMwYmZfaF9kcl9zZXQgKGN1cnJlbnRfY3B1LCByZWdubywgbmV3dmFsKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1wcy4gICovCisKK1VTSQorYV9mcjMwX2hfcHNfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfRlIzMEJGCisgICAgY2FzZSBiZmRfbWFjaF9mcjMwIDogCisgICAgICByZXR1cm4gZnIzMGJmX2hfcHNfZ2V0IChjdXJyZW50X2NwdSk7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtcHMuICAqLworCit2b2lkCithX2ZyMzBfaF9wc19zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVU0kgbmV3dmFsKQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9GUjMwQkYKKyAgICBjYXNlIGJmZF9tYWNoX2ZyMzAgOiAKKyAgICAgIGZyMzBiZl9oX3BzX3NldCAoY3VycmVudF9jcHUsIG5ld3ZhbCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtcjEzLiAgKi8KKworU0kKK2FfZnIzMF9oX3IxM19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9GUjMwQkYKKyAgICBjYXNlIGJmZF9tYWNoX2ZyMzAgOiAKKyAgICAgIHJldHVybiBmcjMwYmZfaF9yMTNfZ2V0IChjdXJyZW50X2NwdSk7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtcjEzLiAgKi8KKwordm9pZAorYV9mcjMwX2hfcjEzX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNJIG5ld3ZhbCkKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfRlIzMEJGCisgICAgY2FzZSBiZmRfbWFjaF9mcjMwIDogCisgICAgICBmcjMwYmZfaF9yMTNfc2V0IChjdXJyZW50X2NwdSwgbmV3dmFsKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1yMTQuICAqLworCitTSQorYV9mcjMwX2hfcjE0X2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX0ZSMzBCRgorICAgIGNhc2UgYmZkX21hY2hfZnIzMCA6IAorICAgICAgcmV0dXJuIGZyMzBiZl9oX3IxNF9nZXQgKGN1cnJlbnRfY3B1KTsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC1yMTQuICAqLworCit2b2lkCithX2ZyMzBfaF9yMTRfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0kgbmV3dmFsKQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9GUjMwQkYKKyAgICBjYXNlIGJmZF9tYWNoX2ZyMzAgOiAKKyAgICAgIGZyMzBiZl9oX3IxNF9zZXQgKGN1cnJlbnRfY3B1LCBuZXd2YWwpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogR2V0IHRoZSB2YWx1ZSBvZiBoLXIxNS4gICovCisKK1NJCithX2ZyMzBfaF9yMTVfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfRlIzMEJGCisgICAgY2FzZSBiZmRfbWFjaF9mcjMwIDogCisgICAgICByZXR1cm4gZnIzMGJmX2hfcjE1X2dldCAoY3VycmVudF9jcHUpOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLXIxNS4gICovCisKK3ZvaWQKK2FfZnIzMF9oX3IxNV9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTSSBuZXd2YWwpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX0ZSMzBCRgorICAgIGNhc2UgYmZkX21hY2hfZnIzMCA6IAorICAgICAgZnIzMGJmX2hfcjE1X3NldCAoY3VycmVudF9jcHUsIG5ld3ZhbCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtbmJpdC4gICovCisKK0JJCithX2ZyMzBfaF9uYml0X2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX0ZSMzBCRgorICAgIGNhc2UgYmZkX21hY2hfZnIzMCA6IAorICAgICAgcmV0dXJuIGZyMzBiZl9oX25iaXRfZ2V0IChjdXJyZW50X2NwdSk7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtbmJpdC4gICovCisKK3ZvaWQKK2FfZnIzMF9oX25iaXRfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgQkkgbmV3dmFsKQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9GUjMwQkYKKyAgICBjYXNlIGJmZF9tYWNoX2ZyMzAgOiAKKyAgICAgIGZyMzBiZl9oX25iaXRfc2V0IChjdXJyZW50X2NwdSwgbmV3dmFsKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC16Yml0LiAgKi8KKworQkkKK2FfZnIzMF9oX3piaXRfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfRlIzMEJGCisgICAgY2FzZSBiZmRfbWFjaF9mcjMwIDogCisgICAgICByZXR1cm4gZnIzMGJmX2hfemJpdF9nZXQgKGN1cnJlbnRfY3B1KTsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC16Yml0LiAgKi8KKwordm9pZAorYV9mcjMwX2hfemJpdF9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBCSSBuZXd2YWwpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX0ZSMzBCRgorICAgIGNhc2UgYmZkX21hY2hfZnIzMCA6IAorICAgICAgZnIzMGJmX2hfemJpdF9zZXQgKGN1cnJlbnRfY3B1LCBuZXd2YWwpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogR2V0IHRoZSB2YWx1ZSBvZiBoLXZiaXQuICAqLworCitCSQorYV9mcjMwX2hfdmJpdF9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9GUjMwQkYKKyAgICBjYXNlIGJmZF9tYWNoX2ZyMzAgOiAKKyAgICAgIHJldHVybiBmcjMwYmZfaF92Yml0X2dldCAoY3VycmVudF9jcHUpOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLXZiaXQuICAqLworCit2b2lkCithX2ZyMzBfaF92Yml0X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIEJJIG5ld3ZhbCkKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfRlIzMEJGCisgICAgY2FzZSBiZmRfbWFjaF9mcjMwIDogCisgICAgICBmcjMwYmZfaF92Yml0X3NldCAoY3VycmVudF9jcHUsIG5ld3ZhbCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtY2JpdC4gICovCisKK0JJCithX2ZyMzBfaF9jYml0X2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX0ZSMzBCRgorICAgIGNhc2UgYmZkX21hY2hfZnIzMCA6IAorICAgICAgcmV0dXJuIGZyMzBiZl9oX2NiaXRfZ2V0IChjdXJyZW50X2NwdSk7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtY2JpdC4gICovCisKK3ZvaWQKK2FfZnIzMF9oX2NiaXRfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgQkkgbmV3dmFsKQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9GUjMwQkYKKyAgICBjYXNlIGJmZF9tYWNoX2ZyMzAgOiAKKyAgICAgIGZyMzBiZl9oX2NiaXRfc2V0IChjdXJyZW50X2NwdSwgbmV3dmFsKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1pYml0LiAgKi8KKworQkkKK2FfZnIzMF9oX2liaXRfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfRlIzMEJGCisgICAgY2FzZSBiZmRfbWFjaF9mcjMwIDogCisgICAgICByZXR1cm4gZnIzMGJmX2hfaWJpdF9nZXQgKGN1cnJlbnRfY3B1KTsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC1pYml0LiAgKi8KKwordm9pZAorYV9mcjMwX2hfaWJpdF9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBCSSBuZXd2YWwpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX0ZSMzBCRgorICAgIGNhc2UgYmZkX21hY2hfZnIzMCA6IAorICAgICAgZnIzMGJmX2hfaWJpdF9zZXQgKGN1cnJlbnRfY3B1LCBuZXd2YWwpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogR2V0IHRoZSB2YWx1ZSBvZiBoLXNiaXQuICAqLworCitCSQorYV9mcjMwX2hfc2JpdF9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9GUjMwQkYKKyAgICBjYXNlIGJmZF9tYWNoX2ZyMzAgOiAKKyAgICAgIHJldHVybiBmcjMwYmZfaF9zYml0X2dldCAoY3VycmVudF9jcHUpOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLXNiaXQuICAqLworCit2b2lkCithX2ZyMzBfaF9zYml0X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIEJJIG5ld3ZhbCkKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfRlIzMEJGCisgICAgY2FzZSBiZmRfbWFjaF9mcjMwIDogCisgICAgICBmcjMwYmZfaF9zYml0X3NldCAoY3VycmVudF9jcHUsIG5ld3ZhbCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtdGJpdC4gICovCisKK0JJCithX2ZyMzBfaF90Yml0X2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX0ZSMzBCRgorICAgIGNhc2UgYmZkX21hY2hfZnIzMCA6IAorICAgICAgcmV0dXJuIGZyMzBiZl9oX3RiaXRfZ2V0IChjdXJyZW50X2NwdSk7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtdGJpdC4gICovCisKK3ZvaWQKK2FfZnIzMF9oX3RiaXRfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgQkkgbmV3dmFsKQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9GUjMwQkYKKyAgICBjYXNlIGJmZF9tYWNoX2ZyMzAgOiAKKyAgICAgIGZyMzBiZl9oX3RiaXRfc2V0IChjdXJyZW50X2NwdSwgbmV3dmFsKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1kMGJpdC4gICovCisKK0JJCithX2ZyMzBfaF9kMGJpdF9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9GUjMwQkYKKyAgICBjYXNlIGJmZF9tYWNoX2ZyMzAgOiAKKyAgICAgIHJldHVybiBmcjMwYmZfaF9kMGJpdF9nZXQgKGN1cnJlbnRfY3B1KTsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC1kMGJpdC4gICovCisKK3ZvaWQKK2FfZnIzMF9oX2QwYml0X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIEJJIG5ld3ZhbCkKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfRlIzMEJGCisgICAgY2FzZSBiZmRfbWFjaF9mcjMwIDogCisgICAgICBmcjMwYmZfaF9kMGJpdF9zZXQgKGN1cnJlbnRfY3B1LCBuZXd2YWwpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWQxYml0LiAgKi8KKworQkkKK2FfZnIzMF9oX2QxYml0X2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX0ZSMzBCRgorICAgIGNhc2UgYmZkX21hY2hfZnIzMCA6IAorICAgICAgcmV0dXJuIGZyMzBiZl9oX2QxYml0X2dldCAoY3VycmVudF9jcHUpOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLWQxYml0LiAgKi8KKwordm9pZAorYV9mcjMwX2hfZDFiaXRfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgQkkgbmV3dmFsKQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9GUjMwQkYKKyAgICBjYXNlIGJmZF9tYWNoX2ZyMzAgOiAKKyAgICAgIGZyMzBiZl9oX2QxYml0X3NldCAoY3VycmVudF9jcHUsIG5ld3ZhbCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtY2NyLiAgKi8KKworVVFJCithX2ZyMzBfaF9jY3JfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfRlIzMEJGCisgICAgY2FzZSBiZmRfbWFjaF9mcjMwIDogCisgICAgICByZXR1cm4gZnIzMGJmX2hfY2NyX2dldCAoY3VycmVudF9jcHUpOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLWNjci4gICovCisKK3ZvaWQKK2FfZnIzMF9oX2Njcl9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVUUkgbmV3dmFsKQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9GUjMwQkYKKyAgICBjYXNlIGJmZF9tYWNoX2ZyMzAgOiAKKyAgICAgIGZyMzBiZl9oX2Njcl9zZXQgKGN1cnJlbnRfY3B1LCBuZXd2YWwpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogR2V0IHRoZSB2YWx1ZSBvZiBoLXNjci4gICovCisKK1VRSQorYV9mcjMwX2hfc2NyX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX0ZSMzBCRgorICAgIGNhc2UgYmZkX21hY2hfZnIzMCA6IAorICAgICAgcmV0dXJuIGZyMzBiZl9oX3Njcl9nZXQgKGN1cnJlbnRfY3B1KTsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC1zY3IuICAqLworCit2b2lkCithX2ZyMzBfaF9zY3Jfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVVFJIG5ld3ZhbCkKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfRlIzMEJGCisgICAgY2FzZSBiZmRfbWFjaF9mcjMwIDogCisgICAgICBmcjMwYmZfaF9zY3Jfc2V0IChjdXJyZW50X2NwdSwgbmV3dmFsKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1pbG0uICAqLworCitVUUkKK2FfZnIzMF9oX2lsbV9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9GUjMwQkYKKyAgICBjYXNlIGJmZF9tYWNoX2ZyMzAgOiAKKyAgICAgIHJldHVybiBmcjMwYmZfaF9pbG1fZ2V0IChjdXJyZW50X2NwdSk7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtaWxtLiAgKi8KKwordm9pZAorYV9mcjMwX2hfaWxtX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVRSSBuZXd2YWwpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX0ZSMzBCRgorICAgIGNhc2UgYmZkX21hY2hfZnIzMCA6IAorICAgICAgZnIzMGJmX2hfaWxtX3NldCAoY3VycmVudF9jcHUsIG5ld3ZhbCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zaW0vZnIzMC9hcmNoLmggYi9zaW0vZnIzMC9hcmNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JkZTExZAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9mcjMwL2FyY2guaApAQCAtMCwwICsxLDg3IEBACisvKiBTaW11bGF0b3IgaGVhZGVyIGZvciBmcjMwLgorCitUSElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgorCitDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisqLworCisjaWZuZGVmIEZSMzBfQVJDSF9ICisjZGVmaW5lIEZSMzBfQVJDSF9ICisKKyNkZWZpbmUgVEFSR0VUX0JJR19FTkRJQU4gMQorCisvKiBDb3ZlciBmbnMgZm9yIHJlZ2lzdGVyIGFjY2Vzcy4gICovCitVU0kgYV9mcjMwX2hfcGNfZ2V0IChTSU1fQ1BVICopOwordm9pZCBhX2ZyMzBfaF9wY19zZXQgKFNJTV9DUFUgKiwgVVNJKTsKK1NJIGFfZnIzMF9oX2dyX2dldCAoU0lNX0NQVSAqLCBVSU5UKTsKK3ZvaWQgYV9mcjMwX2hfZ3Jfc2V0IChTSU1fQ1BVICosIFVJTlQsIFNJKTsKK1NJIGFfZnIzMF9oX2NyX2dldCAoU0lNX0NQVSAqLCBVSU5UKTsKK3ZvaWQgYV9mcjMwX2hfY3Jfc2V0IChTSU1fQ1BVICosIFVJTlQsIFNJKTsKK1NJIGFfZnIzMF9oX2RyX2dldCAoU0lNX0NQVSAqLCBVSU5UKTsKK3ZvaWQgYV9mcjMwX2hfZHJfc2V0IChTSU1fQ1BVICosIFVJTlQsIFNJKTsKK1VTSSBhX2ZyMzBfaF9wc19nZXQgKFNJTV9DUFUgKik7Cit2b2lkIGFfZnIzMF9oX3BzX3NldCAoU0lNX0NQVSAqLCBVU0kpOworU0kgYV9mcjMwX2hfcjEzX2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgYV9mcjMwX2hfcjEzX3NldCAoU0lNX0NQVSAqLCBTSSk7CitTSSBhX2ZyMzBfaF9yMTRfZ2V0IChTSU1fQ1BVICopOwordm9pZCBhX2ZyMzBfaF9yMTRfc2V0IChTSU1fQ1BVICosIFNJKTsKK1NJIGFfZnIzMF9oX3IxNV9nZXQgKFNJTV9DUFUgKik7Cit2b2lkIGFfZnIzMF9oX3IxNV9zZXQgKFNJTV9DUFUgKiwgU0kpOworQkkgYV9mcjMwX2hfbmJpdF9nZXQgKFNJTV9DUFUgKik7Cit2b2lkIGFfZnIzMF9oX25iaXRfc2V0IChTSU1fQ1BVICosIEJJKTsKK0JJIGFfZnIzMF9oX3piaXRfZ2V0IChTSU1fQ1BVICopOwordm9pZCBhX2ZyMzBfaF96Yml0X3NldCAoU0lNX0NQVSAqLCBCSSk7CitCSSBhX2ZyMzBfaF92Yml0X2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgYV9mcjMwX2hfdmJpdF9zZXQgKFNJTV9DUFUgKiwgQkkpOworQkkgYV9mcjMwX2hfY2JpdF9nZXQgKFNJTV9DUFUgKik7Cit2b2lkIGFfZnIzMF9oX2NiaXRfc2V0IChTSU1fQ1BVICosIEJJKTsKK0JJIGFfZnIzMF9oX2liaXRfZ2V0IChTSU1fQ1BVICopOwordm9pZCBhX2ZyMzBfaF9pYml0X3NldCAoU0lNX0NQVSAqLCBCSSk7CitCSSBhX2ZyMzBfaF9zYml0X2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgYV9mcjMwX2hfc2JpdF9zZXQgKFNJTV9DUFUgKiwgQkkpOworQkkgYV9mcjMwX2hfdGJpdF9nZXQgKFNJTV9DUFUgKik7Cit2b2lkIGFfZnIzMF9oX3RiaXRfc2V0IChTSU1fQ1BVICosIEJJKTsKK0JJIGFfZnIzMF9oX2QwYml0X2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgYV9mcjMwX2hfZDBiaXRfc2V0IChTSU1fQ1BVICosIEJJKTsKK0JJIGFfZnIzMF9oX2QxYml0X2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgYV9mcjMwX2hfZDFiaXRfc2V0IChTSU1fQ1BVICosIEJJKTsKK1VRSSBhX2ZyMzBfaF9jY3JfZ2V0IChTSU1fQ1BVICopOwordm9pZCBhX2ZyMzBfaF9jY3Jfc2V0IChTSU1fQ1BVICosIFVRSSk7CitVUUkgYV9mcjMwX2hfc2NyX2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgYV9mcjMwX2hfc2NyX3NldCAoU0lNX0NQVSAqLCBVUUkpOworVVFJIGFfZnIzMF9oX2lsbV9nZXQgKFNJTV9DUFUgKik7Cit2b2lkIGFfZnIzMF9oX2lsbV9zZXQgKFNJTV9DUFUgKiwgVVFJKTsKKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgbW9kZWwgdHlwZXMuICAqLwordHlwZWRlZiBlbnVtIG1vZGVsX3R5cGUgeworICBNT0RFTF9GUjMwXzEsIE1PREVMX01BWAorfSBNT0RFTF9UWVBFOworCisjZGVmaW5lIE1BWF9NT0RFTFMgKChpbnQpIE1PREVMX01BWCkKKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgdW5pdCB0eXBlcy4gICovCit0eXBlZGVmIGVudW0gdW5pdF90eXBlIHsKKyAgVU5JVF9OT05FLCBVTklUX0ZSMzBfMV9VX1NUTSwgVU5JVF9GUjMwXzFfVV9MRE0sIFVOSVRfRlIzMF8xX1VfU1RPUkUKKyAsIFVOSVRfRlIzMF8xX1VfTE9BRCwgVU5JVF9GUjMwXzFfVV9DVEksIFVOSVRfRlIzMF8xX1VfRVhFQywgVU5JVF9NQVgKK30gVU5JVF9UWVBFOworCisjZGVmaW5lIE1BWF9VTklUUyAoMykKKworI2VuZGlmIC8qIEZSMzBfQVJDSF9IICovCmRpZmYgLS1naXQgYS9zaW0vZnIzMC9jb25maWcuaW4gYi9zaW0vZnIzMC9jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyM2I4NgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9mcjMwL2NvbmZpZy5pbgpAQCAtMCwwICsxLDE2MiBAQAorLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCisjdW5kZWYgQ19BTExPQ0EKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCisjdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCisjdW5kZWYgSEFWRV9BTExPQ0EKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCisjdW5kZWYgaW5saW5lCisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgb2ZmX3QKKworLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCisjdW5kZWYgX1BPU0lYX1NPVVJDRQorCisvKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoaW50IG9yIHZvaWQpLiAgKi8KKyN1bmRlZiBSRVRTSUdUWVBFCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIHNpemVfdAorCisvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKKyAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgorIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgorICovCisjdW5kZWYgU1RBQ0tfRElSRUNUSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIERlZmluZSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAorICAgYnl0ZSBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCBhbmQgVkFYKS4gICovCisjdW5kZWYgV09SRFNfQklHRU5ESUFOCisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19zZXRmcHVjdyBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX1NFVEZQVUNXCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0RDR0VUVEVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRDV0QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRQQUdFU0laRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHJ1c2FnZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRSVVNBR0UKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfTVVOTUFQCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1BVVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VUTE9DQUxFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lnYWN0aW9uIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NJR0FDVElPTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0hSCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGltZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9USU1FCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfQVJHWl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZnB1X2NvbnRyb2wuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfRlBVX0NPTlRST0xfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9NQUxMT0NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9OTF9UWVBFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVkFMVUVTX0gKZGlmZiAtLWdpdCBhL3NpbS9mcjMwL2NvbmZpZ3VyZSBiL3NpbS9mcjMwL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzA2M2FkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2ZyMzAvY29uZmlndXJlCkBAIC0wLDAgKzEsNDIyMiBAQAorIyEgL2Jpbi9zaAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCisjIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCisKKyMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDMKKworCisKKworCisjIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCisKKworIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCisKKworIyBDaGVjayB0byBzZWUgaWYgd2UncmUgcnVubmluZyB1bmRlciBDeWd3aW4zMiwgd2l0aG91dCB1c2luZworIyBBQ19DQU5PTklDQUxfKi4gIElmIHNvLCBzZXQgb3V0cHV0IHZhcmlhYmxlIENZR1dJTjMyIHRvICJ5ZXMiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICJubyIuCisKKworCisjIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIFdpbjMyLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgRVhFRVhUIHRvICIuZXhlIi4KKyMgT3RoZXJ3aXNlIHNldCBpdCB0byAiIi4KKworCisKKworCisKKyMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZW5kaWFuPWVuZGlhbgkJU3BlY2lmeSB0YXJnZXQgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWFsaWdubWVudD1hbGlnbgkJU3BlY2lmeSBzdHJpY3QsICBub25zdHJpY3Qgb3IgZm9yY2VkIGFsaWdubWVudCBvZiBtZW1vcnkgYWNjZXNzZXMuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW49ZW5kCQlTcGVjaWZ5IGhvc3QgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLXNjYWNoZT1zaXplCQlTcGVjaWZ5IHNpbXVsYXRvciBleGVjdXRpb24gY2FjaGUgc2l6ZS4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZGVmYXVsdC1tb2RlbD1tb2RlbAlTcGVjaWZ5IGRlZmF1bHQgbW9kZWwgdG8gc2ltdWxhdGUuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWVudmlyb25tZW50PWVudmlyb25tZW50CVNwZWNpZnkgbWl4ZWQsIHVzZXIsIHZpcnR1YWwgb3Igb3BlcmF0aW5nIGVudmlyb25tZW50LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLWNnZW4tbWFpbnRbPURJUl0gICAgYnVpbGQgY2dlbiBnZW5lcmF0ZWQgZmlsZXMiCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19wcm9nPSQwCisgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCisKKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgLiAkY2FjaGVfZmlsZQorZWxzZQorICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgPiAkY2FjaGVfZmlsZQorZmkKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworYWNfZXhlZXh0PQorYWNfb2JqZXh0PW8KK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCitlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjkzOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0CisgICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCisgIENQUD0iJHtDQy1jY30gLUUiCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDcwOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NzE0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3MjUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjczMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzQyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NDg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9L2xpYi9jcHAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzczOiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKK3NldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCithbGw6CisJQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKK0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCitldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKK2lmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCitlbHNlCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCitmaQorcm0gLWYgY29uZnRlc3RtYWtlCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBTRVRfTUFLRT0KK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4MDA6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKK2lmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgorICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQorRU9GCisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDQz0iJENDIC1wb3NpeCIKKyAgZWxzZQorICAgIENDPSIkQ0MgLVhwIgorICBmaQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgSVNDPQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjgyMTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODI2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODUxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDg2OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4OTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKK2ludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKK2lmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7CitleGl0ICgwKTsgfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTAxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNURENfSEVBREVSUyAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkyNTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5MzAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKworLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3R5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKKy8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCitjaGFyIGNvbnN0ICpjb25zdCAqY2NwOworY2hhciAqKnA7CisvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Oworc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07CisvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KKyAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCitjb25zdCBjaGFyICpnID0gInN0cmluZyI7CitjY3AgPSAmZyArIChnID8gZy1nIDogMCk7CisvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLworKytjY3A7CitwID0gKGNoYXIqKikgY2NwOworY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Cit7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLworICBjaGFyICp0OworICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOworCisgICp0KysgPSAwOworfQoreyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KKyAgaW50IHhbXSA9IHsyNSwgMTd9OworICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOworICArK2ZvbzsKK30KK3sgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLworICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKKyAgaXB0ciBwID0gMDsKKyAgKytwOworfQoreyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCisgICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KKyAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKKyAgc3RydWN0IHMgKmI7IGItPmogPSA1OworfQoreyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KKyAgY29uc3QgaW50IGZvbyA9IDEwOworfQorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTc5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGNvbnN0IAorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwMDA6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfY3ZfY19pbmxpbmU9bm8KK2ZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTAwNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworfSAkYWNfa3cgZm9vKCkgeworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwMTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZG9uZQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2CitjYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCisgIGlubGluZSB8IHllcykgOzsKKyAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBpbmxpbmUgCitFT0YKKyA7OworICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQorRU9GCisgOzsKK2VzYWMKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDQwOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDQ1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgb2ZmX3QgbG9uZworRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwNzM6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA3OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCitFT0YKKworZmkKKworIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKKyMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTEwODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExMTMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFsbG9jYS5oPgoraW50IG1haW4oKSB7CitjaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEyMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExNDE6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTE0NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBIQVZFX0FMTE9DQV9ICisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLworY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKK2ludCBtYWluKCkgeworY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTc0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQSAxCitFT0YKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgorICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucworICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKKyAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCisgICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgorICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgQ19BTExPQ0EgMQorRU9GCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIwNjogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyMTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQord2ViZWNyYXkKKyNlbHNlCit3ZW5vdGJlY3JheQorI2VuZGlmCisKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KK2ZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjM2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjQxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNjQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKK0VPRgorCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZG9uZQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTI5MTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyOTkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorZmluZF9zdGFja19kaXJlY3Rpb24gKCkKK3sKKyAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOworICBhdXRvIGNoYXIgZHVtbXk7CisgIGlmIChhZGRyID09IDApCisgICAgeworICAgICAgYWRkciA9ICZkdW1teTsKKyAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOworfQorbWFpbiAoKQoreworICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMxODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgorRU9GCisKK2ZpCisKK2ZvciBhY19oZHIgaW4gdW5pc3RkLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzQzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTM1MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzgyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMzg3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0MzU6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE0NDMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisvKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KKyAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgorCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKwltbWFwIHNoYXJlZCBub3QgZml4ZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisgICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQorICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAorICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5CisgICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCisgICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKKyAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCisgICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAorICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCisKKyAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KKyAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6CisgICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKKyAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKy8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KKyNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQorIyBpZmRlZiBIQVZFX1VOSVNURF9ICisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgZW5kaWYKKworLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KKyMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKKyMgZW5kaWYKKworIyBpZmRlZiBfU0NfUEFHRVNJWkUKKyMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQorIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLworIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKKyMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQorIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgICBpZmRlZiBOQlBHCisjICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCisjICAgICBpZm5kZWYgQ0xTSVpFCisjICAgICAgZGVmaW5lIENMU0laRSAxCisjICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KKyMgICAgZWxzZSAvKiBubyBOQlBHICovCisjICAgICBpZmRlZiBOQlBDCisjICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQworIyAgICAgZWxzZSAvKiBubyBOQlBDICovCisjICAgICAgaWZkZWYgUEFHRVNJWkUKKyMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKKyMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLworIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLworIyAgICBlbmRpZiAvKiBubyBOQlBHICovCisjICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KKyMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCisKKyNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KKyNlbHNlCitjaGFyICptYWxsb2MoKTsKKyNlbmRpZgorCitpbnQKK21haW4oKQoreworCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOworCWludCBpLCBwYWdlc2l6ZTsKKwlpbnQgZmQ7CisKKwlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisKKwkvKgorCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KKwkgKi8KKwlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YSArIGkpID0gcmFuZCgpOworCXVtYXNrKDApOworCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCisJLyoKKwkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKKwkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCisJICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KKwkgKi8KKwlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgxKTsKKwlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOworCWlmICghZGF0YTIpCisJCWV4aXQoMSk7CisJZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOworCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCisJCQlleGl0KDEpOworCisJLyoKKwkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQorCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KKwkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKKwlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhMykKKwkJZXhpdCgxKTsKKwlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKKwkJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCXVubGluaygiY29uZnRlc3RtbWFwIik7CisJZXhpdCgwKTsKK30KKworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1ODM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9NTUFQIDEKK0VPRgorCitmaQorCisKKyMgYXV0b2NvbmYuaW5mbyBzYXlzIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCByaWdodCBhZnRlciBBQ19JTklULgorCisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY1NjogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisKK2hvc3RfYWxpYXM9JGhvc3QKK2Nhc2UgIiRob3N0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpCisgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpIDs7CisgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2hvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAoraG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjc3OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorCit0YXJnZXRfYWxpYXM9JHRhcmdldAorY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCit0YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCit0YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjk1OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9CitlbHNlCisgICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KKyAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAorcyxcXCxcXFxcLGc7IHMsXCQsJCQsZworRU9GX1NFRAorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgorICBybSAtZiBjb25mdGVzdHNlZAorZmkKK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorCisjIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCit0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTczOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTc2OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19wcm9nX3JlamVjdGVkPW5vCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworCWNvbnRpbnVlCisgICAgICBmaQorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KKyAgICAqd2luMzIqIHwgKldJTjMyKikKKyAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4MjA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4NTI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCisKKyNsaW5lIDE4NjMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCittYWluKCl7cmV0dXJuKDApO30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKyAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisgIGVsc2UKKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcworICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4OTQ6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgorY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODk5OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19HTlVDX18KKyAgeWVzOworI2VuZGlmCitFT0YKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTA4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5Mjc6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCitpZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBhY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTk3MDogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCisgICAgY2FzZSAiJGFjX2Rpci8iIGluCisgICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7CisgICAgKikKKyAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAgICMgYnkgZGVmYXVsdC4KKyAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbHNlCisJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKKwkgICAgYnJlYWsgMgorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9JRlMiCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKyAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCisgICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCisgIGZpCitmaQorZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworCisjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJworZWxzZQorICBDQ19GT1JfQlVJTEQ9Z2NjCitmaQorCisKKworCitBUj0ke0FSLWFyfQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwMzg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKK0FMTF9MSU5HVUFTPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKK3VuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjA3MzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIwNzggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIwODM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKK19fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMTEzOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMTE4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxNDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgorICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIxNzA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIxNzUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE5ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworICAgZmkKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCisgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NUUENQWSAxCitFT0YKKworICAgZmkKKworICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjMyOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIyMzcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxvY2FsZS5oPgoraW50IG1haW4oKSB7CityZXR1cm4gTENfTUVTU0FHRVMKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKKyAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKK0VPRgorCisgICAgZmkKKyAgZmkKKyAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjI2NTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgorICBVU0VfTkxTPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX05MUz15ZXMKK2ZpCisKKyAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKKyAgICAKKworICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCisKKyAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBFTkFCTEVfTkxTIDEKK0VPRgorCisgICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjg1OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgorICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCitlbHNlCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KK2ZpCisKKyAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgorCisgICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9CisJbmxzX2N2X2hlYWRlcl9saWJndD0KKwlDQVRPQkpFWFQ9Tk9ORQorCisJYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMDQ6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzMDkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpYmludGwuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjMxNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMzE6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjMzNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgoraW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2CisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCisJICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzU5OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbGludGwgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjM2NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGJpbmR0ZXh0ZG9tYWluKCk7CisKK2ludCBtYWluKCkgeworYmluZHRleHRkb21haW4oKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzOTQ6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjM5OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkgICBmaQorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKKwkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KKwkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9HRVRURVhUIDEKK0VPRgorCisJICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNDM0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgorICA7OworZXNhYworZmkKK01TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgoraWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KKwkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNDY4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNDczICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0OTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI1MjM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgorICA7OworZXNhYworZmkKK0dNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCitpZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTU5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkWEdFVFRFWFQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKKyAgOzsKK2VzYWMKK2ZpCitYR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCitpZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI1OTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKKwkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1OTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0uZ21vCisJCSAgIERBVEFESVJOQU1FPXNoYXJlCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0ubW8KKwkJICAgREFUQURJUk5BTUU9bGliCitmaQorcm0gLWYgY29uZnRlc3QqCisJCUlOU1RPQkpFWFQ9Lm1vCisJICAgICAgZmkKKwkgICAgZmkKKwkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKwkgICAgICAgIAorICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgorCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNjMxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKKyAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjY2NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3MDE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KKwkgIDogOworCWVsc2UKKwkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCisgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKKyAgICBkb25lCisKKyAgICAgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgIAorCisgICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCisgICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCisgICAgICAgTElOR1VBUz0KKyAgICAgZWxzZQorICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3OTE6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQorICAgICAgIE5FV19MSU5HVUFTPQorICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbworICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgorICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7CisgICAgICAgICBlc2FjCisgICAgICAgZG9uZQorICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCisgICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2CisgICAgIGZpCisKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCisgICAgIGZpCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKKyAgIGVsc2UKKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAorLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgorICAgZmkKKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgorICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KKwkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI4MTk6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI4MjQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjgyOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIG1zZ2Zvcm1hdD1saW51eAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK21zZ2Zvcm1hdD14b3BlbgorZmkKKworCisJICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCisgICAgICBmaQorICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCisJICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICAKKyAgIAorCisgICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCisgICAKKworICAgICAgbD0KKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgCisKKyMgQ2hlY2sgZm9yIGNvbW1vbiBoZWFkZXJzLgorIyBGSVhNRTogU2VlbXMgdG8gbWUgdGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgZm9yIGkzODYtd2luZG93cyBob3N0cy4KKyMgQXQgb25lIHBvaW50IHRoZXJlIHdlcmUgaGFyZGNvZGVkIEFDX0RFRklORSdzIGlmICR7aG9zdH0gPSBpMzg2LSotd2luZG93cyouCitmb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB1bmlzdGQuaCB0aW1lLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyODk4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjkwMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjkwODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19oZHIgaW4gc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5Mzg6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTQzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTQ4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2hkciBpbiBmY250bC5oIGZwdV9jb250cm9sLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTc4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjk4MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk4ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19oZHIgaW4gZGxmY24uaCBlcnJuby5oIHN5cy9zdGF0LmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMDE4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzAyMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MzAyODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHJ1c2FnZSB0aW1lIHNpZ2FjdGlvbiBfX3NldGZwdWN3CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMDU3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDYyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwODU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworIyBDaGVjayBmb3Igc29ja2V0IGxpYnJhcmllcworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMxMTI6IGNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nYmluZCB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxzb2NrZXQgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzEyMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGJpbmQoKTsKKworaW50IG1haW4oKSB7CitiaW5kKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTMxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHNvY2tldCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9saWIgMQorRU9GCisKKyAgTElCUz0iLWxzb2NrZXQgJExJQlMiCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzE1OTogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQorYWNfbGliX3Zhcj1gZWNobyBuc2wnXydnZXRob3N0YnluYW1lIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbG5zbCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMTY3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZ2V0aG9zdGJ5bmFtZSgpOworCitpbnQgbWFpbigpIHsKK2dldGhvc3RieW5hbWUoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbnNsIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2xpYiAxCitFT0YKKworICBMSUJTPSItbG5zbCAkTElCUyIKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0CisKKworCitVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlNQUlOVD0iIiBVU0VfTUFJTlRBSU5FUl9NT0RFPXllcyA7OworICBubykJTUFJTlQ9IiMiIDs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLW1haW50YWluZXItbW9kZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IE1BSU5UPSIjIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQorZmkKK2Vsc2UKKyAgTUFJTlQ9IiMiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSAtRFVTRV9CU1dBUD0xIjs7CisgIG5vKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0wIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1ic3dhcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ic3dhcD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9ic3dhcD0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY2ZsYWdzIG9yIC0tZGlzYWJsZS1zaW0tY2ZsYWdzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jZmxhZ3MiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQkgc2ltX2NmbGFncz0iLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIjs7CisgIHRyYWNlKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJQbGVhc2UgdXNlIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpbnN0ZWFkLiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2NmbGFncz0iIjs7CisgIG5vKQkgc2ltX2NmbGFncz0iIjs7CisgICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2NmbGFncz0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVidWcgb3IgLS1kaXNhYmxlLXNpbS1kZWJ1ZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWJ1ZyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpIHNpbV9kZWJ1Zz0iLURERUJVRz03IC1EV0lUSF9ERUJVRz03Ijs7CisgIG5vKSAgc2ltX2RlYnVnPSItRERFQlVHPTAgLURXSVRIX0RFQlVHPTAiOzsKKyAgKikgICBzaW1fZGVidWc9Ii1EREVCVUc9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfREVCVUc9Jygke2VuYWJsZXZhbH0pJyI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWJ1ZyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIGRlYnVnID0gJHNpbV9kZWJ1ZyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2RlYnVnPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zdGRpbyBvciAtLWRpc2FibGUtc2ltLXN0ZGlvIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zdGRpbytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N0ZGlvIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7CisgIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zdGRpbyIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGlvPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkaW8iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHN0ZGlvIGZsYWdzID0gJHNpbV9zdGRpbyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3N0ZGlvPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS10cmFjZSBvciAtLWRpc2FibGUtc2ltLXRyYWNlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV90cmFjZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3RyYWNlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3RyYWNlPSItRFRSQUNFPTEgLURXSVRIX1RSQUNFPS0xIjs7CisgIG5vKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MCAtRFdJVEhfVFJBQ0U9MCI7OworICBbLTAtOV0qKQorCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fdHJhY2U9IiIKKwlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKwkgIGlmIHRlc3QgeCIkc2ltX3RyYWNlIiA9IHg7IHRoZW4KKwkgICAgc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9JyhUUkFDRV8keCIKKwkgIGVsc2UKKwkgICAgc2ltX3RyYWNlPSIke3NpbV90cmFjZX18VFJBQ0VfJHgiCisJICBmaQorCWRvbmUKKwlzaW1fdHJhY2U9IiRzaW1fdHJhY2UpJyIgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSB0cmFjZSA9ICRzaW1fdHJhY2UiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV90cmFjZT0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcHJvZmlsZSBvciAtLWRpc2FibGUtc2ltLXByb2ZpbGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3Byb2ZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9wcm9maWxlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7CisgIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OworICBbLTAtOV0qKQorCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fcHJvZmlsZT0iIgorCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbworCSAgaWYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgPSB4OyB0aGVuCisJICAgIHNpbV9wcm9maWxlPSItRFdJVEhfUFJPRklMRT0nKFBST0ZJTEVfJHgiCisJICBlbHNlCisJICAgIHNpbV9wcm9maWxlPSIke3NpbV9wcm9maWxlfXxQUk9GSUxFXyR4IgorCSAgZmkKKwlkb25lCisJc2ltX3Byb2ZpbGU9IiRzaW1fcHJvZmlsZSknIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9wcm9maWxlIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gcHJvZmlsZSA9ICRzaW1fcHJvZmlsZSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3Byb2ZpbGU9IiIKK2ZpCisKKworCitlY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMzNTQ6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMzU5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBzaWduYWwKKyN1bmRlZiBzaWduYWwKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7CisjZWxzZQordm9pZCAoKnNpZ25hbCAoKSkgKCk7CisjZW5kaWYKKworaW50IG1haW4oKSB7CitpbnQgaTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzc2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpZ25hbD1pbnQKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCitFT0YKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzM5NjogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkQ1lHV0lOMzIiID0geWVzOyB0aGVuCithbV9jdl9leGVleHQ9LmV4ZQorZWxzZQorY2F0ID4gYW1fY190ZXN0LmMgPDwgJ0VPRicKK2ludCBtYWluKCkgeworLyogTm90aGluZyBuZWVkZWQgaGVyZSAqLworfQorRU9GCiske0NDLWNjfSAtbyBhbV9jX3Rlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgYW1fY190ZXN0LmMgJExJQlMgMT4mNQorYW1fY3ZfZXhlZXh0PWBscyBhbV9jX3Rlc3QuKiB8IGdyZXAgLXYgYW1fY190ZXN0LmMgfCBzZWQgLWUgcy9hbV9jX3Rlc3QvL2AKK3JtIC1mIGFtX2NfdGVzdCoKK2ZpCisKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iID0geCAmJiBhbV9jdl9leGVleHQ9bm8KK2ZpCitFWEVFWFQ9IiIKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthbV9jdl9leGVleHR9CitlY2hvICIkYWNfdCIiJHthbV9jdl9leGVleHR9IiAxPiY2CisKKworc2ltX2xpbmtfZmlsZXM9CitzaW1fbGlua19saW5rcz0KKworc2ltX2xpbmtfbGlua3M9dGNvbmZpZy5oCitpZiB0ZXN0IC1mICR7c3JjZGlyfS90Y29uZmlnLmluCit0aGVuCisgIHNpbV9saW5rX2ZpbGVzPXRjb25maWcuaW4KK2Vsc2UKKyAgc2ltX2xpbmtfZmlsZXM9Li4vY29tbW9uL3Rjb25maWcuaW4KK2ZpCisKKyMgdGFyZy12YWxzLmRlZiBwb2ludHMgdG8gdGhlIGxpYmMgbWFjcm8gZGVzY3JpcHRpb24gZmlsZS4KK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyotKi0qKSBUQVJHX1ZBTFNfREVGPS4uL2NvbW1vbi9ubHR2YWxzLmRlZiA7OworZXNhYworc2ltX2xpbmtfZmlsZXM9IiR7c2ltX2xpbmtfZmlsZXN9ICR7VEFSR19WQUxTX0RFRn0iCitzaW1fbGlua19saW5rcz0iJHtzaW1fbGlua19saW5rc30gdGFyZy12YWxzLmRlZiIKKworCisKKword2lyZV9lbmRpYW49IkJJR19FTkRJQU4iCitkZWZhdWx0X2VuZGlhbj0iIgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1lbmRpYW4gb3IgLS1kaXNhYmxlLXNpbS1lbmRpYW4gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2VuZGlhbitzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2VuZGlhbiIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICBiKnxCKikgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPUJJR19FTkRJQU4iOzsKKyAgbCp8TCopIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIjs7CisgIHllcykJIGlmIHRlc3QgeCIkd2lyZV9lbmRpYW4iICE9IHg7IHRoZW4KKwkgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9JHt3aXJlX2VuZGlhbn0iCisJIGVsc2UKKyAgICAgICAgICAgaWYgdGVzdCB4IiRkZWZhdWx0X2VuZGlhbiIgIT0geDsgdGhlbgorCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPSR7ZGVmYXVsdF9lbmRpYW59IgorCSAgIGVsc2UKKwkgICAgIGVjaG8gIk5vIGhhcmQtd2lyZWQgZW5kaWFuIGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgorCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPTAiCisJICAgZmkKKwkgZmk7OworICBubykJIGlmIHRlc3QgeCIkZGVmYXVsdF9lbmRpYW4iICE9IHg7IHRoZW4KKwkgICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0ke2RlZmF1bHRfZW5kaWFufSIKKwkgZWxzZQorCSAgIGlmIHRlc3QgeCIkd2lyZV9lbmRpYW4iICE9IHg7IHRoZW4KKwkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPSR7d2lyZV9lbmRpYW59IgorCSAgIGVsc2UKKwkgICAgIGVjaG8gIk5vIGRlZmF1bHQgZW5kaWFuIGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgorCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9MCIKKwkgICBmaQorCSBmaTs7CisgICopCSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1lbmRpYW4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9lbmRpYW49IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9lbmRpYW4iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGVuZGlhbiBmbGFncyA9ICRzaW1fZW5kaWFuIiA2PiYxCitmaQorZWxzZQorICBpZiB0ZXN0IHgiJGRlZmF1bHRfZW5kaWFuIiAhPSB4OyB0aGVuCisgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPSR7ZGVmYXVsdF9lbmRpYW59IgorZWxzZQorICBpZiB0ZXN0IHgiJHdpcmVfZW5kaWFuIiAhPSB4OyB0aGVuCisgICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPSR7d2lyZV9lbmRpYW59IgorICBlbHNlCisgICAgc2ltX2VuZGlhbj0KKyAgZmkKK2ZpCitmaQorCit3aXJlX2FsaWdubWVudD0iTk9OU1RSSUNUX0FMSUdOTUVOVCIKK2RlZmF1bHRfYWxpZ25tZW50PSIiCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYWxpZ25tZW50IG9yIC0tZGlzYWJsZS1zaW0tYWxpZ25tZW50IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9hbGlnbm1lbnQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9hbGlnbm1lbnQiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgc3RyaWN0IHwgU1RSSUNUKSAgICAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPVNUUklDVF9BTElHTk1FTlQiOzsKKyAgbm9uc3RyaWN0IHwgTk9OU1RSSUNUKSBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPU5PTlNUUklDVF9BTElHTk1FTlQiOzsKKyAgZm9yY2VkIHwgRk9SQ0VEKSAgICAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPUZPUkNFRF9BTElHTk1FTlQiOzsKKyAgeWVzKSBpZiB0ZXN0IHgiJHdpcmVfYWxpZ25tZW50IiAhPSB4OyB0aGVuCisJIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9JHt3aXJlX2FsaWdubWVudH0iCisgICAgICAgZWxzZQorICAgICAgICAgaWYgdGVzdCB4IiRkZWZhdWx0X2FsaWdubWVudCIgIT0geDsgdGhlbgorICAgICAgICAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPSR7ZGVmYXVsdF9hbGlnbm1lbnR9IgorICAgICAgICAgZWxzZQorCSAgIGVjaG8gIk5vIGhhcmQtd2lyZWQgYWxpZ25tZW50IGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgorCSAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9MCIKKyAgICAgICAgIGZpCisgICAgICAgZmk7OworICBubykgIGlmIHRlc3QgeCIkZGVmYXVsdF9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKwkgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPSR7ZGVmYXVsdF9hbGlnbm1lbnR9IgorICAgICAgIGVsc2UKKyAgICAgICAgIGlmIHRlc3QgeCIkd2lyZV9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKwkgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9JHt3aXJlX2FsaWdubWVudH0iCisgICAgICAgICBlbHNlCisgICAgICAgICAgIGVjaG8gIk5vIGRlZmF1bHQgYWxpZ25tZW50IGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgorICAgICAgICAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9MCIKKyAgICAgICAgIGZpCisgICAgICAgZmk7OworICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWFsaWdubWVudCIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2FsaWdubWVudD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2FsaWdubWVudCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgYWxpZ25tZW50IGZsYWdzID0gJHNpbV9hbGlnbm1lbnQiIDY+JjEKK2ZpCitlbHNlCisgIGlmIHRlc3QgeCIkZGVmYXVsdF9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKyAgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPSR7ZGVmYXVsdF9hbGlnbm1lbnR9IgorZWxzZQorICBpZiB0ZXN0IHgiJHdpcmVfYWxpZ25tZW50IiAhPSB4OyB0aGVuCisgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0ke3dpcmVfYWxpZ25tZW50fSIKKyAgZWxzZQorICAgIHNpbV9hbGlnbm1lbnQ9CisgIGZpCitmaQorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW4gb3IgLS1kaXNhYmxlLXNpbS1ob3N0ZW5kaWFuIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ob3N0ZW5kaWFuK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1faG9zdGVuZGlhbiIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICBubykJIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPTAiOzsKKyAgYip8QiopIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUJJR19FTkRJQU4iOzsKKyAgbCp8TCopIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iOzsKKyAgKikJIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBmb3IgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ob3N0ZW5kaWFuPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1faG9zdGVuZGlhbiIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgaG9zdGVuZGlhbiBmbGFncyA9ICRzaW1faG9zdGVuZGlhbiIgNj4mMQorZmkKK2Vsc2UKKyAgCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNTUwOiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2JpZ2VuZGlhbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KKyMgU2VlIGlmIHN5cy9wYXJhbS5oIGRlZmluZXMgdGhlIEJZVEVfT1JERVIgbWFjcm8uCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNTU3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KK2ludCBtYWluKCkgeworCisjaWYgIUJZVEVfT1JERVIgfHwgIUJJR19FTkRJQU4gfHwgIUxJVFRMRV9FTkRJQU4KKyBib2d1cyBlbmRpYW4gbWFjcm9zCisjZW5kaWYKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTY4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBCSUdfRU5ESUFOIG9yIG5vdC4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM1NzIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgoraW50IG1haW4oKSB7CisKKyNpZiBCWVRFX09SREVSICE9IEJJR19FTkRJQU4KKyBub3QgYmlnIGVuZGlhbgorI2VuZGlmCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU4MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2lmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmciIDE+JjI7IGV4aXQgMTsgfQorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNjAzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK21haW4gKCkgeworICAvKiBBcmUgd2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4/ICBGcm9tIEhhcmJpc29uJlN0ZWVsZS4gICovCisgIHVuaW9uCisgIHsKKyAgICBsb25nIGw7CisgICAgY2hhciBjW3NpemVvZiAobG9uZyldOworICB9IHU7CisgIHUubCA9IDE7CisgIGV4aXQgKHUuY1tzaXplb2YgKGxvbmcpIC0gMV0gPT0gMSk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzYxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2JpZ2VuZGlhbiIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCitFT0YKKworZmkKKworICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHllczsgdGhlbgorICAgIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUJJR19FTkRJQU4iCisgIGVsc2UKKyAgICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIgorICBmaQorZWxzZQorICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj0wIgorZmkKK2ZpCisKKworZGVmYXVsdF9zaW1fc2NhY2hlPSIxNjM4NCIKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tc2NhY2hlIG9yIC0tZGlzYWJsZS1zaW0tc2NhY2hlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zY2FjaGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9zY2FjaGUiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fc2NhY2hlPSItRFdJVEhfU0NBQ0hFPSR7ZGVmYXVsdF9zaW1fc2NhY2hlfSI7OworICBubykJc2ltX3NjYWNoZT0iLURXSVRIX1NDQUNIRT0wIiA7OworICBbMC05XSopIHNpbV9jYWNoZT0ke2VuYWJsZXZhbH07OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJCYWQgdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLXNjYWNoZSIiIDE+JjI7IGV4aXQgMTsgfTsKKwlzaW1fc2NhY2hlPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc2NhY2hlIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzY2FjaGUgc2l6ZSA9ICRzaW1fc2NhY2hlIiA2PiYxCitmaQorZWxzZQorICBzaW1fc2NhY2hlPSItRFdJVEhfU0NBQ0hFPSR7ZGVmYXVsdF9zaW1fc2NhY2hlfSIKK2ZpCisKKworCitkZWZhdWx0X3NpbV9kZWZhdWx0X21vZGVsPSJmcjMwLTEiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWRlZmF1bHQtbW9kZWwgb3IgLS1kaXNhYmxlLXNpbS1kZWZhdWx0LW1vZGVsIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9kZWZhdWx0X21vZGVsK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZGVmYXVsdF9tb2RlbCIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXN8bm8pIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIk1pc3NpbmcgYXJndW1lbnQgdG8gLS1lbmFibGUtc2ltLWRlZmF1bHQtbW9kZWwiIiAxPiYyOyBleGl0IDE7IH07OworICAqKQlzaW1fZGVmYXVsdF9tb2RlbD0iLURXSVRIX0RFRkFVTFRfTU9ERUw9J1wiJHtlbmFibGV2YWx9XCInIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2RlZmF1bHRfbW9kZWwiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGRlZmF1bHQgbW9kZWwgPSAkc2ltX2RlZmF1bHRfbW9kZWwiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9kZWZhdWx0X21vZGVsPSItRFdJVEhfREVGQVVMVF9NT0RFTD0nXCIke2RlZmF1bHRfc2ltX2RlZmF1bHRfbW9kZWx9XCInIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZW52aXJvbm1lbnQgb3IgLS1kaXNhYmxlLXNpbS1lbnZpcm9ubWVudCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fZW52aXJvbm1lbnQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9lbnZpcm9ubWVudCIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICBhbGwgfCBBTEwpICAgICAgICAgICAgIHNpbV9lbnZpcm9ubWVudD0iLURXSVRIX0VOVklST05NRU5UPUFMTF9FTlZJUk9OTUVOVCI7OworICB1c2VyIHwgVVNFUikgICAgICAgICAgIHNpbV9lbnZpcm9ubWVudD0iLURXSVRIX0VOVklST05NRU5UPVVTRVJfRU5WSVJPTk1FTlQiOzsKKyAgdmlydHVhbCB8IFZJUlRVQUwpICAgICBzaW1fZW52aXJvbm1lbnQ9Ii1EV0lUSF9FTlZJUk9OTUVOVD1WSVJUVUFMX0VOVklST05NRU5UIjs7CisgIG9wZXJhdGluZyB8IE9QRVJBVElORykgc2ltX2Vudmlyb25tZW50PSItRFdJVEhfRU5WSVJPTk1FTlQ9T1BFUkFUSU5HX0VOVklST05NRU5UIjs7CisgICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tZW52aXJvbm1lbnQiIiAxPiYyOyBleGl0IDE7IH07CisgICAgICAgc2ltX2Vudmlyb25tZW50PSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZW52aXJvbm1lbnQiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBlbnZpcm9ubWVudCA9ICRzaW1fZW52aXJvbm1lbnQiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9lbnZpcm9ubWVudD0iLURXSVRIX0VOVklST05NRU5UPUFMTF9FTlZJUk9OTUVOVCIKK2ZpCisKKworY2dlbl9tYWludD1ubworY2dlbj0uLi8uLi9jZ2VuL2NnZW4KK2NnZW5kaXI9JyQoc3JjZGlyKS8uLi8uLi9jZ2VuJworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWNnZW4tbWFpbnQgb3IgLS1kaXNhYmxlLWNnZW4tbWFpbnQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfY2dlbl9tYWludCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfY2dlbl9tYWludCIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCWNnZW5fbWFpbnQ9eWVzIDs7CisgIG5vKQljZ2VuX21haW50PW5vIDs7CisgICopCisJIyBhcmd1bWVudCBpcyBjZ2VuIGluc3RhbGwgZGlyZWN0b3J5IChub3QgaW1wbGVtZW50ZWQgeWV0KS4KKwkjIEhhdmluZyBhIGBzaGFyZScgZGlyZWN0b3J5IG1pZ2h0IGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSAuc2NtLAorCSMgLmNwdSwgZXRjLiBmaWxlcy4KKwljZ2VuZGlyPSR7Y2dlbl9tYWludH0vbGliL2NnZW4KKwljZ2VuPSR7Y2dlbmRpcn0vYmluL2NnZW4KKwk7OworZXNhYworZmkKK2lmIHRlc3QgeCR7Y2dlbl9tYWludH0gIT0geG5vIDsgdGhlbgorICBDR0VOX01BSU5UPScnCitlbHNlCisgIENHRU5fTUFJTlQ9JyMnCitmaQorCisKKworCisKKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQHNpbV9lbnZpcm9ubWVudEAlJHNpbV9lbnZpcm9ubWVudCVnCitzJUBzaW1fYWxpZ25tZW50QCUkc2ltX2FsaWdubWVudCVnCitzJUBzaW1fYXNzZXJ0QCUkc2ltX2Fzc2VydCVnCitzJUBzaW1fYml0c2l6ZUAlJHNpbV9iaXRzaXplJWcKK3MlQHNpbV9lbmRpYW5AJSRzaW1fZW5kaWFuJWcKK3MlQHNpbV9ob3N0ZW5kaWFuQCUkc2ltX2hvc3RlbmRpYW4lZworcyVAc2ltX2Zsb2F0QCUkc2ltX2Zsb2F0JWcKK3MlQHNpbV9zY2FjaGVAJSRzaW1fc2NhY2hlJWcKK3MlQHNpbV9kZWZhdWx0X21vZGVsQCUkc2ltX2RlZmF1bHRfbW9kZWwlZworcyVAc2ltX2h3X2NmbGFnc0AlJHNpbV9od19jZmxhZ3MlZworcyVAc2ltX2h3X29ianNAJSRzaW1faHdfb2JqcyVnCitzJUBzaW1faHdAJSRzaW1faHclZworcyVAc2ltX2lubGluZUAlJHNpbV9pbmxpbmUlZworcyVAc2ltX3BhY2thZ2VzQCUkc2ltX3BhY2thZ2VzJWcKK3MlQHNpbV9yZWdwYXJtQCUkc2ltX3JlZ3Bhcm0lZworcyVAc2ltX3Jlc2VydmVkX2JpdHNAJSRzaW1fcmVzZXJ2ZWRfYml0cyVnCitzJUBzaW1fc21wQCUkc2ltX3NtcCVnCitzJUBzaW1fc3RkY2FsbEAlJHNpbV9zdGRjYWxsJWcKK3MlQHNpbV94b3JfZW5kaWFuQCUkc2ltX3hvcl9lbmRpYW4lZworcyVAYnVpbGRfd2FybmluZ3NAJSRidWlsZF93YXJuaW5ncyVnCitzJUBTSEVMTEAlJFNIRUxMJWcKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVARkZMQUdTQCUkRkZMQUdTJWcKK3MlQERFRlNAJSRERUZTJWcKK3MlQExERkxBR1NAJSRMREZMQUdTJWcKK3MlQExJQlNAJSRMSUJTJWcKK3MlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworcyVAcHJlZml4QCUkcHJlZml4JWcKK3MlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKK3MlQGJpbmRpckAlJGJpbmRpciVnCitzJUBzYmluZGlyQCUkc2JpbmRpciVnCitzJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCitzJUBkYXRhZGlyQCUkZGF0YWRpciVnCitzJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCitzJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKK3MlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKK3MlQGxpYmRpckAlJGxpYmRpciVnCitzJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCitzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCitzJUBpbmZvZGlyQCUkaW5mb2RpciVnCitzJUBtYW5kaXJAJSRtYW5kaXIlZworcyVAaG9zdEAlJGhvc3QlZworcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZworcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCitzJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKK3MlQGhvc3Rfb3NAJSRob3N0X29zJWcKK3MlQHRhcmdldEAlJHRhcmdldCVnCitzJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZworcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZworcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZworcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKK3MlQGJ1aWxkQCUkYnVpbGQlZworcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCitzJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZworcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKK3MlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZworcyVAQ0NAJSRDQyVnCitzJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZworcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCitzJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZworcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKK3MlQEhERUZJTkVTQCUkSERFRklORVMlZworcyVAQVJAJSRBUiVnCitzJUBSQU5MSUJAJSRSQU5MSUIlZworcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCitzJUBDUFBAJSRDUFAlZworcyVAQUxMT0NBQCUkQUxMT0NBJWcKK3MlQFVTRV9OTFNAJSRVU0VfTkxTJWcKK3MlQE1TR0ZNVEAlJE1TR0ZNVCVnCitzJUBHTVNHRk1UQCUkR01TR0ZNVCVnCitzJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKK3MlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZworcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCitzJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZworcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCitzJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKK3MlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKK3MlQElOVExERVBTQCUkSU5UTERFUFMlZworcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCitzJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKK3MlQFBPRklMRVNAJSRQT0ZJTEVTJWcKK3MlQFBPU1VCQCUkUE9TVUIlZworcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZworcyVAR1RfTk9AJSRHVF9OTyVnCitzJUBHVF9ZRVNAJSRHVF9ZRVMlZworcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZworcyVAbEAlJGwlZworcyVATUFJTlRAJSRNQUlOVCVnCitzJUBzaW1fYnN3YXBAJSRzaW1fYnN3YXAlZworcyVAc2ltX2NmbGFnc0AlJHNpbV9jZmxhZ3MlZworcyVAc2ltX2RlYnVnQCUkc2ltX2RlYnVnJWcKK3MlQHNpbV9zdGRpb0AlJHNpbV9zdGRpbyVnCitzJUBzaW1fdHJhY2VAJSRzaW1fdHJhY2UlZworcyVAc2ltX3Byb2ZpbGVAJSRzaW1fcHJvZmlsZSVnCitzJUBFWEVFWFRAJSRFWEVFWFQlZworcyVAQ0dFTl9NQUlOVEAlJENHRU5fTUFJTlQlZworcyVAY2dlbmRpckAlJGNnZW5kaXIlZworcyVAY2dlbkAlJGNnZW4lZworCitDRU9GCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCithY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KK2FjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfbW9yZV9saW5lcz06CithY19zZWRfY21kcz0iIgord2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZmkKKyAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGVsc2UKKyAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGZpCisgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCisgICAgYWNfYmVnPSRhY19lbmQKKyAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgIGFjX3NlZF9jbWRzPWNhdAorZmkKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4ifQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KKworICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgIC4pICBzcmNkaXI9LgorICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgorICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7CisgIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgorICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgZXNhYworCisgIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgorICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKKyAgcm0gLWYgIiRhY19maWxlIgorICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorIyAkY29uZmlndXJlX2lucHV0IiA7OworICAqKSBhY19jb21zdWI9IDs7CisgIGVzYWMKKworICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBzZWQgLWUgIiRhY19jb21zdWIKK3MlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCitzJUBzcmNkaXJAJSRzcmNkaXIlZworcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworcyVASU5TVEFMTEAlJElOU1RBTEwlZworIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQorZmk7IGRvbmUKK3JtIC1mIGNvbmZ0ZXN0LnMqCisKKyMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCisjIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCisjCisjIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCithY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKK2FjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJworYWNfZEM9J1wzJworYWNfZEQ9JyVnJworIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCithY191Qz0nICcKK2FjX3VEPSdcNCVnJworIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKK2FjX2VDPScgJworYWNfZUQ9JyVnJworCitpZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZmkKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKKworICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAorICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KKworRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCisjIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCitybSAtZiBjb25mdGVzdC52YWxzCitjYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCitzL1tcXCYlXS9cXCYvZworcyVbXFwkYF0lXFwmJWcKK3MlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCitzJWFjX2QlYWNfdSVncAorcyVhY191JWFjX2UlZ3AKK0VPRgorc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscworcm0gLWYgY29uZnRlc3QuaGRyCisKKyMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKKyMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCitzJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQorRU9GCisKKyMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgorIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KKworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgOgorZG8KKyAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAorICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCisgIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKKyAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCisgIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUworICBlY2hvICdDRU9GCisgIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0CisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgorJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKKyAgcm0gLWYgY29uZnRlc3QudmFscworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKKyAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCisgIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCisgICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgorICAgIHJtIC1mIGNvbmZ0ZXN0LmgKKyAgZWxzZQorICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgZmkKKyAgICBybSAtZiAkYWNfZmlsZQorICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKKyAgZmkKK2ZpOyBkb25lCisKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKK2FjX3NvdXJjZXM9IiRzaW1fbGlua19maWxlcyIKK2FjX2Rlc3RzPSIkc2ltX2xpbmtfbGlua3MiCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorc3JjZGlyPSRhY19naXZlbl9zcmNkaXIKK3doaWxlIHRlc3QgLW4gIiRhY19zb3VyY2VzIjsgZG8KKyAgc2V0ICRhY19kZXN0czsgYWNfZGVzdD0kMTsgc2hpZnQ7IGFjX2Rlc3RzPSQqCisgIHNldCAkYWNfc291cmNlczsgYWNfc291cmNlPSQxOyBzaGlmdDsgYWNfc291cmNlcz0kKgorCisgIGVjaG8gImxpbmtpbmcgJHNyY2Rpci8kYWNfc291cmNlIHRvICRhY19kZXN0IgorCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY19zb3VyY2U7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRzcmNkaXIvJGFjX3NvdXJjZTogRmlsZSBub3QgZm91bmQiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorICBybSAtZiAkYWNfZGVzdAorCisgICMgTWFrZSByZWxhdGl2ZSBzeW1saW5rcy4KKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rlc3RfZGlyPWBlY2hvICRhY19kZXN0fHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAiJGFjX2Rlc3QiICYmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGRlc3QgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kZXN0X2RpciIgJiYgbWtkaXIgIiRhY19kZXN0X2RpciIKKyAgICBhY19kZXN0X2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGVzdF9kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rlc3RfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kZXN0X2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kZXN0X2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJHNyY2RpciIgaW4KKyAgWy8kXSopIGFjX3JlbF9zb3VyY2U9IiRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKKyAgKikgYWNfcmVsX3NvdXJjZT0iJGFjX2RvdHMkc3JjZGlyLyRhY19zb3VyY2UiIDs7CisgIGVzYWMKKworICAjIE1ha2UgYSBzeW1saW5rIGlmIHBvc3NpYmxlOyBvdGhlcndpc2UgdHJ5IGEgaGFyZCBsaW5rLgorICBpZiBsbiAtcyAkYWNfcmVsX3NvdXJjZSAkYWNfZGVzdCAyPi9kZXYvbnVsbCB8fAorICAgIGxuICRzcmNkaXIvJGFjX3NvdXJjZSAkYWNfZGVzdDsgdGhlbiA6CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgbGluayAkYWNfZGVzdCB0byAkc3JjZGlyLyRhY19zb3VyY2UiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZG9uZQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitjYXNlICJ4JENPTkZJR19GSUxFUyIgaW4KKyB4TWFrZWZpbGUqKQorICAgZWNobyAiTWVyZ2luZyBNYWtlZmlsZS5zaW0rTWFrZS1jb21tb24uc2ltIGludG8gTWFrZWZpbGUgLi4uIgorICAgcm0gLWYgTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcCBNYWtlZmlsZQorICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QUkVfLywvXiMjIEVuZCBDT01NT05fUFJFXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTEudG1wCisgICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BPU1RfLywvXiMjIEVuZCBDT01NT05fUE9TVF8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0yLnRtcAorICAgc2VkIC1lICcvXiMjIENPTU1PTl9QUkVfLyByIE1ha2VzaW0xLnRtcCcgXAorCS1lICcvXiMjIENPTU1PTl9QT1NUXy8gciBNYWtlc2ltMi50bXAnIFwKKwk8TWFrZWZpbGUuc2ltID5NYWtlZmlsZQorICAgcm0gLWYgTWFrZWZpbGUuc2ltIE1ha2UtY29tbW9uLnNpbSBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wCisgICA7OworIGVzYWMKKyBjYXNlICJ4JENPTkZJR19IRUFERVJTIiBpbiB4Y29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjCisKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCisKZGlmZiAtLWdpdCBhL3NpbS9mcjMwL2NvbmZpZ3VyZS5pbiBiL3NpbS9mcjMwL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzI1ZGZjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2ZyMzAvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsMTYgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Lgorc2luY2x1ZGUoLi4vY29tbW9uL2FjbG9jYWwubTQpCitBQ19QUkVSRVEoMi41KWRubAorQUNfSU5JVChNYWtlZmlsZS5pbikKKworU0lNX0FDX0NPTU1PTgorCitTSU1fQUNfT1BUSU9OX0VORElBTihCSUdfRU5ESUFOKQorU0lNX0FDX09QVElPTl9BTElHTk1FTlQoTk9OU1RSSUNUX0FMSUdOTUVOVCkKK1NJTV9BQ19PUFRJT05fSE9TVEVORElBTgorU0lNX0FDX09QVElPTl9TQ0FDSEUoMTYzODQpCitTSU1fQUNfT1BUSU9OX0RFRkFVTFRfTU9ERUwoZnIzMC0xKQorU0lNX0FDX09QVElPTl9FTlZJUk9OTUVOVAorU0lNX0FDX09QVElPTl9DR0VOX01BSU5UCisKK1NJTV9BQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3NpbS9mcjMwL2NwdS5jIGIvc2ltL2ZyMzAvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMzOWE5MwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9mcjMwL2NwdS5jCkBAIC0wLDAgKzEsMzU2IEBACisvKiBNaXNjLiBzdXBwb3J0IGZvciBDUFUgZmFtaWx5IGZyMzBiZi4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2RlZmluZSBXQU5UX0NQVSBmcjMwYmYKKyNkZWZpbmUgV0FOVF9DUFVfRlIzMEJGCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtcGMuICAqLworCitVU0kKK2ZyMzBiZl9oX3BjX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHJldHVybiBDUFUgKGhfcGMpOworfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC1wYy4gICovCisKK3ZvaWQKK2ZyMzBiZl9oX3BjX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVTSSBuZXd2YWwpCit7CisgIENQVSAoaF9wYykgPSBuZXd2YWw7Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1nci4gICovCisKK1NJCitmcjMwYmZfaF9ncl9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vKQoreworICByZXR1cm4gQ1BVIChoX2dyW3JlZ25vXSk7Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLWdyLiAgKi8KKwordm9pZAorZnIzMGJmX2hfZ3Jfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubywgU0kgbmV3dmFsKQoreworICBDUFUgKGhfZ3JbcmVnbm9dKSA9IG5ld3ZhbDsKK30KKworLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWNyLiAgKi8KKworU0kKK2ZyMzBiZl9oX2NyX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVJTlQgcmVnbm8pCit7CisgIHJldHVybiBDUFUgKGhfY3JbcmVnbm9dKTsKK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtY3IuICAqLworCit2b2lkCitmcjMwYmZfaF9jcl9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vLCBTSSBuZXd2YWwpCit7CisgIENQVSAoaF9jcltyZWdub10pID0gbmV3dmFsOworfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtZHIuICAqLworCitTSQorZnIzMGJmX2hfZHJfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubykKK3sKKyAgcmV0dXJuIEdFVF9IX0RSIChyZWdubyk7Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLWRyLiAgKi8KKwordm9pZAorZnIzMGJmX2hfZHJfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubywgU0kgbmV3dmFsKQoreworICBTRVRfSF9EUiAocmVnbm8sIG5ld3ZhbCk7Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1wcy4gICovCisKK1VTSQorZnIzMGJmX2hfcHNfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKK3sKKyAgcmV0dXJuIEdFVF9IX1BTICgpOworfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC1wcy4gICovCisKK3ZvaWQKK2ZyMzBiZl9oX3BzX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVTSSBuZXd2YWwpCit7CisgIFNFVF9IX1BTIChuZXd2YWwpOworfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtcjEzLiAgKi8KKworU0kKK2ZyMzBiZl9oX3IxM19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICByZXR1cm4gQ1BVIChoX3IxMyk7Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLXIxMy4gICovCisKK3ZvaWQKK2ZyMzBiZl9oX3IxM19zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTSSBuZXd2YWwpCit7CisgIENQVSAoaF9yMTMpID0gbmV3dmFsOworfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtcjE0LiAgKi8KKworU0kKK2ZyMzBiZl9oX3IxNF9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICByZXR1cm4gQ1BVIChoX3IxNCk7Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLXIxNC4gICovCisKK3ZvaWQKK2ZyMzBiZl9oX3IxNF9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTSSBuZXd2YWwpCit7CisgIENQVSAoaF9yMTQpID0gbmV3dmFsOworfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtcjE1LiAgKi8KKworU0kKK2ZyMzBiZl9oX3IxNV9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICByZXR1cm4gQ1BVIChoX3IxNSk7Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLXIxNS4gICovCisKK3ZvaWQKK2ZyMzBiZl9oX3IxNV9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTSSBuZXd2YWwpCit7CisgIENQVSAoaF9yMTUpID0gbmV3dmFsOworfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtbmJpdC4gICovCisKK0JJCitmcjMwYmZfaF9uYml0X2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHJldHVybiBDUFUgKGhfbmJpdCk7Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLW5iaXQuICAqLworCit2b2lkCitmcjMwYmZfaF9uYml0X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIEJJIG5ld3ZhbCkKK3sKKyAgQ1BVIChoX25iaXQpID0gbmV3dmFsOworfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtemJpdC4gICovCisKK0JJCitmcjMwYmZfaF96Yml0X2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHJldHVybiBDUFUgKGhfemJpdCk7Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLXpiaXQuICAqLworCit2b2lkCitmcjMwYmZfaF96Yml0X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIEJJIG5ld3ZhbCkKK3sKKyAgQ1BVIChoX3piaXQpID0gbmV3dmFsOworfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtdmJpdC4gICovCisKK0JJCitmcjMwYmZfaF92Yml0X2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHJldHVybiBDUFUgKGhfdmJpdCk7Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLXZiaXQuICAqLworCit2b2lkCitmcjMwYmZfaF92Yml0X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIEJJIG5ld3ZhbCkKK3sKKyAgQ1BVIChoX3ZiaXQpID0gbmV3dmFsOworfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtY2JpdC4gICovCisKK0JJCitmcjMwYmZfaF9jYml0X2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHJldHVybiBDUFUgKGhfY2JpdCk7Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLWNiaXQuICAqLworCit2b2lkCitmcjMwYmZfaF9jYml0X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIEJJIG5ld3ZhbCkKK3sKKyAgQ1BVIChoX2NiaXQpID0gbmV3dmFsOworfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtaWJpdC4gICovCisKK0JJCitmcjMwYmZfaF9pYml0X2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHJldHVybiBDUFUgKGhfaWJpdCk7Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLWliaXQuICAqLworCit2b2lkCitmcjMwYmZfaF9pYml0X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIEJJIG5ld3ZhbCkKK3sKKyAgQ1BVIChoX2liaXQpID0gbmV3dmFsOworfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtc2JpdC4gICovCisKK0JJCitmcjMwYmZfaF9zYml0X2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHJldHVybiBHRVRfSF9TQklUICgpOworfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC1zYml0LiAgKi8KKwordm9pZAorZnIzMGJmX2hfc2JpdF9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBCSSBuZXd2YWwpCit7CisgIFNFVF9IX1NCSVQgKG5ld3ZhbCk7Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC10Yml0LiAgKi8KKworQkkKK2ZyMzBiZl9oX3RiaXRfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKK3sKKyAgcmV0dXJuIENQVSAoaF90Yml0KTsKK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtdGJpdC4gICovCisKK3ZvaWQKK2ZyMzBiZl9oX3RiaXRfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgQkkgbmV3dmFsKQoreworICBDUFUgKGhfdGJpdCkgPSBuZXd2YWw7Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1kMGJpdC4gICovCisKK0JJCitmcjMwYmZfaF9kMGJpdF9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICByZXR1cm4gQ1BVIChoX2QwYml0KTsKK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtZDBiaXQuICAqLworCit2b2lkCitmcjMwYmZfaF9kMGJpdF9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBCSSBuZXd2YWwpCit7CisgIENQVSAoaF9kMGJpdCkgPSBuZXd2YWw7Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1kMWJpdC4gICovCisKK0JJCitmcjMwYmZfaF9kMWJpdF9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICByZXR1cm4gQ1BVIChoX2QxYml0KTsKK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtZDFiaXQuICAqLworCit2b2lkCitmcjMwYmZfaF9kMWJpdF9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBCSSBuZXd2YWwpCit7CisgIENQVSAoaF9kMWJpdCkgPSBuZXd2YWw7Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1jY3IuICAqLworCitVUUkKK2ZyMzBiZl9oX2Njcl9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICByZXR1cm4gR0VUX0hfQ0NSICgpOworfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC1jY3IuICAqLworCit2b2lkCitmcjMwYmZfaF9jY3Jfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVVFJIG5ld3ZhbCkKK3sKKyAgU0VUX0hfQ0NSIChuZXd2YWwpOworfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtc2NyLiAgKi8KKworVVFJCitmcjMwYmZfaF9zY3JfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKK3sKKyAgcmV0dXJuIEdFVF9IX1NDUiAoKTsKK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtc2NyLiAgKi8KKwordm9pZAorZnIzMGJmX2hfc2NyX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVRSSBuZXd2YWwpCit7CisgIFNFVF9IX1NDUiAobmV3dmFsKTsKK30KKworLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWlsbS4gICovCisKK1VRSQorZnIzMGJmX2hfaWxtX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHJldHVybiBHRVRfSF9JTE0gKCk7Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLWlsbS4gICovCisKK3ZvaWQKK2ZyMzBiZl9oX2lsbV9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVUUkgbmV3dmFsKQoreworICBTRVRfSF9JTE0gKG5ld3ZhbCk7Cit9CisKKy8qIFJlY29yZCB0cmFjZSByZXN1bHRzIGZvciBJTlNOLiAgKi8KKwordm9pZAorZnIzMGJmX3JlY29yZF90cmFjZV9yZXN1bHRzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgQ0dFTl9JTlNOICppbnNuLAorCQkJICAgIGludCAqaW5kaWNlcywgVFJBQ0VfUkVDT1JEICp0cikKK3sKK30KZGlmZiAtLWdpdCBhL3NpbS9mcjMwL2NwdS5oIGIvc2ltL2ZyMzAvY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEwMjg2MwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9mcjMwL2NwdS5oCkBAIC0wLDAgKzEsMTI0NCBAQAorLyogQ1BVIGZhbWlseSBoZWFkZXIgZm9yIGZyMzBiZi4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2lmbmRlZiBDUFVfRlIzMEJGX0gKKyNkZWZpbmUgQ1BVX0ZSMzBCRl9ICisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGluc3RydWN0aW9ucyB0aGF0IGFyZSBmZXRjaGVkIGF0IGEgdGltZS4KKyAgIFRoaXMgaXMgZm9yIExJVyB0eXBlIGluc3RydWN0aW9ucyBzZXRzIChlLmcuIG0zMnIpLiAgKi8KKyNkZWZpbmUgTUFYX0xJV19JTlNOUyAxCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGluc3RydWN0aW9ucyB0aGF0IGNhbiBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbC4gICovCisjZGVmaW5lIE1BWF9QQVJBTExFTF9JTlNOUyAxCisKKy8qIENQVSBzdGF0ZSBpbmZvcm1hdGlvbi4gICovCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIEhhcmR3YXJlIGVsZW1lbnRzLiAgKi8KKyAgc3RydWN0IHsKKyAgLyogcHJvZ3JhbSBjb3VudGVyICovCisgIFVTSSBoX3BjOworI2RlZmluZSBHRVRfSF9QQygpIENQVSAoaF9wYykKKyNkZWZpbmUgU0VUX0hfUEMoeCkgKENQVSAoaF9wYykgPSAoeCkpCisgIC8qIGdlbmVyYWwgcmVnaXN0ZXJzICovCisgIFNJIGhfZ3JbMTZdOworI2RlZmluZSBHRVRfSF9HUihhMSkgQ1BVIChoX2dyKVthMV0KKyNkZWZpbmUgU0VUX0hfR1IoYTEsIHgpIChDUFUgKGhfZ3IpW2ExXSA9ICh4KSkKKyAgLyogY29wcm9jZXNzb3IgcmVnaXN0ZXJzICovCisgIFNJIGhfY3JbMTZdOworI2RlZmluZSBHRVRfSF9DUihhMSkgQ1BVIChoX2NyKVthMV0KKyNkZWZpbmUgU0VUX0hfQ1IoYTEsIHgpIChDUFUgKGhfY3IpW2ExXSA9ICh4KSkKKyAgLyogZGVkaWNhdGVkIHJlZ2lzdGVycyAqLworICBTSSBoX2RyWzZdOworLyogR0VUX0hfRFIgbWFjcm8gdXNlci13cml0dGVuICovCisvKiBTRVRfSF9EUiBtYWNybyB1c2VyLXdyaXR0ZW4gKi8KKyAgLyogcHJvZ3JhbSBzdGF0dXMgKi8KKyAgVVNJIGhfcHM7CisvKiBHRVRfSF9QUyBtYWNybyB1c2VyLXdyaXR0ZW4gKi8KKy8qIFNFVF9IX1BTIG1hY3JvIHVzZXItd3JpdHRlbiAqLworICAvKiBHZW5lcmFsIFJlZ2lzdGVyIDEzIGV4cGxpY2l0ZWx5IHJlcXVpcmVkICovCisgIFNJIGhfcjEzOworI2RlZmluZSBHRVRfSF9SMTMoKSBDUFUgKGhfcjEzKQorI2RlZmluZSBTRVRfSF9SMTMoeCkgKENQVSAoaF9yMTMpID0gKHgpKQorICAvKiBHZW5lcmFsIFJlZ2lzdGVyIDE0IGV4cGxpY2l0ZWx5IHJlcXVpcmVkICovCisgIFNJIGhfcjE0OworI2RlZmluZSBHRVRfSF9SMTQoKSBDUFUgKGhfcjE0KQorI2RlZmluZSBTRVRfSF9SMTQoeCkgKENQVSAoaF9yMTQpID0gKHgpKQorICAvKiBHZW5lcmFsIFJlZ2lzdGVyIDE1IGV4cGxpY2l0ZWx5IHJlcXVpcmVkICovCisgIFNJIGhfcjE1OworI2RlZmluZSBHRVRfSF9SMTUoKSBDUFUgKGhfcjE1KQorI2RlZmluZSBTRVRfSF9SMTUoeCkgKENQVSAoaF9yMTUpID0gKHgpKQorICAvKiBuZWdhdGl2ZSAgICAgICAgIGJpdCAqLworICBCSSBoX25iaXQ7CisjZGVmaW5lIEdFVF9IX05CSVQoKSBDUFUgKGhfbmJpdCkKKyNkZWZpbmUgU0VUX0hfTkJJVCh4KSAoQ1BVIChoX25iaXQpID0gKHgpKQorICAvKiB6ZXJvICAgICAgICAgICAgIGJpdCAqLworICBCSSBoX3piaXQ7CisjZGVmaW5lIEdFVF9IX1pCSVQoKSBDUFUgKGhfemJpdCkKKyNkZWZpbmUgU0VUX0hfWkJJVCh4KSAoQ1BVIChoX3piaXQpID0gKHgpKQorICAvKiBvdmVyZmxvdyAgICAgICAgIGJpdCAqLworICBCSSBoX3ZiaXQ7CisjZGVmaW5lIEdFVF9IX1ZCSVQoKSBDUFUgKGhfdmJpdCkKKyNkZWZpbmUgU0VUX0hfVkJJVCh4KSAoQ1BVIChoX3ZiaXQpID0gKHgpKQorICAvKiBjYXJyeSAgICAgICAgICAgIGJpdCAqLworICBCSSBoX2NiaXQ7CisjZGVmaW5lIEdFVF9IX0NCSVQoKSBDUFUgKGhfY2JpdCkKKyNkZWZpbmUgU0VUX0hfQ0JJVCh4KSAoQ1BVIChoX2NiaXQpID0gKHgpKQorICAvKiBpbnRlcnJ1cHQgZW5hYmxlIGJpdCAqLworICBCSSBoX2liaXQ7CisjZGVmaW5lIEdFVF9IX0lCSVQoKSBDUFUgKGhfaWJpdCkKKyNkZWZpbmUgU0VUX0hfSUJJVCh4KSAoQ1BVIChoX2liaXQpID0gKHgpKQorICAvKiBzdGFjayAgICAgICAgICAgIGJpdCAqLworICBCSSBoX3NiaXQ7CisvKiBHRVRfSF9TQklUIG1hY3JvIHVzZXItd3JpdHRlbiAqLworLyogU0VUX0hfU0JJVCBtYWNybyB1c2VyLXdyaXR0ZW4gKi8KKyAgLyogdHJhY2UgdHJhcCAgICAgICBiaXQgKi8KKyAgQkkgaF90Yml0OworI2RlZmluZSBHRVRfSF9UQklUKCkgQ1BVIChoX3RiaXQpCisjZGVmaW5lIFNFVF9IX1RCSVQoeCkgKENQVSAoaF90Yml0KSA9ICh4KSkKKyAgLyogZGl2aXNpb24gMCAgICAgICBiaXQgKi8KKyAgQkkgaF9kMGJpdDsKKyNkZWZpbmUgR0VUX0hfRDBCSVQoKSBDUFUgKGhfZDBiaXQpCisjZGVmaW5lIFNFVF9IX0QwQklUKHgpIChDUFUgKGhfZDBiaXQpID0gKHgpKQorICAvKiBkaXZpc2lvbiAxICAgICAgIGJpdCAqLworICBCSSBoX2QxYml0OworI2RlZmluZSBHRVRfSF9EMUJJVCgpIENQVSAoaF9kMWJpdCkKKyNkZWZpbmUgU0VUX0hfRDFCSVQoeCkgKENQVSAoaF9kMWJpdCkgPSAoeCkpCisgIC8qIGNvbmRpdGlvbiBjb2RlICAgYml0cyAqLworICBVUUkgaF9jY3I7CisvKiBHRVRfSF9DQ1IgbWFjcm8gdXNlci13cml0dGVuICovCisvKiBTRVRfSF9DQ1IgbWFjcm8gdXNlci13cml0dGVuICovCisgIC8qIHN5c3RlbSBjb25kaXRpb24gYml0cyAqLworICBVUUkgaF9zY3I7CisvKiBHRVRfSF9TQ1IgbWFjcm8gdXNlci13cml0dGVuICovCisvKiBTRVRfSF9TQ1IgbWFjcm8gdXNlci13cml0dGVuICovCisgIC8qIGludGVycnVwdCBsZXZlbCAgbWFzayAqLworICBVUUkgaF9pbG07CisvKiBHRVRfSF9JTE0gbWFjcm8gdXNlci13cml0dGVuICovCisvKiBTRVRfSF9JTE0gbWFjcm8gdXNlci13cml0dGVuICovCisgIH0gaGFyZHdhcmU7CisjZGVmaW5lIENQVV9DR0VOX0hXKGNwdSkgKCYgKGNwdSktPmNwdV9kYXRhLmhhcmR3YXJlKQorfSBGUjMwQkZfQ1BVX0RBVEE7CisKKy8qIENvdmVyIGZucyBmb3IgcmVnaXN0ZXIgYWNjZXNzLiAgKi8KK1VTSSBmcjMwYmZfaF9wY19nZXQgKFNJTV9DUFUgKik7Cit2b2lkIGZyMzBiZl9oX3BjX3NldCAoU0lNX0NQVSAqLCBVU0kpOworU0kgZnIzMGJmX2hfZ3JfZ2V0IChTSU1fQ1BVICosIFVJTlQpOwordm9pZCBmcjMwYmZfaF9ncl9zZXQgKFNJTV9DUFUgKiwgVUlOVCwgU0kpOworU0kgZnIzMGJmX2hfY3JfZ2V0IChTSU1fQ1BVICosIFVJTlQpOwordm9pZCBmcjMwYmZfaF9jcl9zZXQgKFNJTV9DUFUgKiwgVUlOVCwgU0kpOworU0kgZnIzMGJmX2hfZHJfZ2V0IChTSU1fQ1BVICosIFVJTlQpOwordm9pZCBmcjMwYmZfaF9kcl9zZXQgKFNJTV9DUFUgKiwgVUlOVCwgU0kpOworVVNJIGZyMzBiZl9oX3BzX2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgZnIzMGJmX2hfcHNfc2V0IChTSU1fQ1BVICosIFVTSSk7CitTSSBmcjMwYmZfaF9yMTNfZ2V0IChTSU1fQ1BVICopOwordm9pZCBmcjMwYmZfaF9yMTNfc2V0IChTSU1fQ1BVICosIFNJKTsKK1NJIGZyMzBiZl9oX3IxNF9nZXQgKFNJTV9DUFUgKik7Cit2b2lkIGZyMzBiZl9oX3IxNF9zZXQgKFNJTV9DUFUgKiwgU0kpOworU0kgZnIzMGJmX2hfcjE1X2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgZnIzMGJmX2hfcjE1X3NldCAoU0lNX0NQVSAqLCBTSSk7CitCSSBmcjMwYmZfaF9uYml0X2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgZnIzMGJmX2hfbmJpdF9zZXQgKFNJTV9DUFUgKiwgQkkpOworQkkgZnIzMGJmX2hfemJpdF9nZXQgKFNJTV9DUFUgKik7Cit2b2lkIGZyMzBiZl9oX3piaXRfc2V0IChTSU1fQ1BVICosIEJJKTsKK0JJIGZyMzBiZl9oX3ZiaXRfZ2V0IChTSU1fQ1BVICopOwordm9pZCBmcjMwYmZfaF92Yml0X3NldCAoU0lNX0NQVSAqLCBCSSk7CitCSSBmcjMwYmZfaF9jYml0X2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgZnIzMGJmX2hfY2JpdF9zZXQgKFNJTV9DUFUgKiwgQkkpOworQkkgZnIzMGJmX2hfaWJpdF9nZXQgKFNJTV9DUFUgKik7Cit2b2lkIGZyMzBiZl9oX2liaXRfc2V0IChTSU1fQ1BVICosIEJJKTsKK0JJIGZyMzBiZl9oX3NiaXRfZ2V0IChTSU1fQ1BVICopOwordm9pZCBmcjMwYmZfaF9zYml0X3NldCAoU0lNX0NQVSAqLCBCSSk7CitCSSBmcjMwYmZfaF90Yml0X2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgZnIzMGJmX2hfdGJpdF9zZXQgKFNJTV9DUFUgKiwgQkkpOworQkkgZnIzMGJmX2hfZDBiaXRfZ2V0IChTSU1fQ1BVICopOwordm9pZCBmcjMwYmZfaF9kMGJpdF9zZXQgKFNJTV9DUFUgKiwgQkkpOworQkkgZnIzMGJmX2hfZDFiaXRfZ2V0IChTSU1fQ1BVICopOwordm9pZCBmcjMwYmZfaF9kMWJpdF9zZXQgKFNJTV9DUFUgKiwgQkkpOworVVFJIGZyMzBiZl9oX2Njcl9nZXQgKFNJTV9DUFUgKik7Cit2b2lkIGZyMzBiZl9oX2Njcl9zZXQgKFNJTV9DUFUgKiwgVVFJKTsKK1VRSSBmcjMwYmZfaF9zY3JfZ2V0IChTSU1fQ1BVICopOwordm9pZCBmcjMwYmZfaF9zY3Jfc2V0IChTSU1fQ1BVICosIFVRSSk7CitVUUkgZnIzMGJmX2hfaWxtX2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgZnIzMGJmX2hfaWxtX3NldCAoU0lNX0NQVSAqLCBVUUkpOworCisvKiBUaGVzZSBtdXN0IGJlIGhhbmQtd3JpdHRlbi4gICovCitleHRlcm4gQ1BVUkVHX0ZFVENIX0ZOIGZyMzBiZl9mZXRjaF9yZWdpc3RlcjsKK2V4dGVybiBDUFVSRUdfU1RPUkVfRk4gZnIzMGJmX3N0b3JlX3JlZ2lzdGVyOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQgbG9hZF9yZWdzOworICBVSU5UIGxvYWRfcmVnc19wZW5kaW5nOworfSBNT0RFTF9GUjMwXzFfREFUQTsKKwordW5pb24gc2VtX2ZpZWxkcyB7CisgICAgc3RydWN0IHsgLyogZW1wdHkgc2Zvcm1hdCBmb3IgdW5zcGVjaWZpZWQgZmllbGQgbGlzdCAqLworICAgICAgaW50IGVtcHR5OworICAgIH0gZm10X2VtcHR5OworICAgIHN0cnVjdCB7IC8qIGUuZy4gYWRkICRSaiwkUmkgKi8KKyAgICAgIFNJICogaV9SaTsKKyAgICAgIFNJICogaV9SajsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JqOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfUmk7CisgICAgfSBmbXRfYWRkOworICAgIHN0cnVjdCB7IC8qIGUuZy4gYWRkICR1NCwkUmkgKi8KKyAgICAgIFVJTlQgZl91NDsKKyAgICAgIFNJICogaV9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9SaTsKKyAgICB9IGZtdF9hZGRpOworICAgIHN0cnVjdCB7IC8qIGUuZy4gYWRkMiAkbTQsJFJpICovCisgICAgICBTSSBmX200OworICAgICAgU0kgKiBpX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X1JpOworICAgIH0gZm10X2FkZDI7CisgICAgc3RydWN0IHsgLyogZS5nLiBhZGRjICRSaiwkUmkgKi8KKyAgICAgIFNJICogaV9SaTsKKyAgICAgIFNJICogaV9SajsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JqOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfUmk7CisgICAgfSBmbXRfYWRkYzsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGFkZG4gJFJqLCRSaSAqLworICAgICAgU0kgKiBpX1JpOworICAgICAgU0kgKiBpX1JqOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmo7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9SaTsKKyAgICB9IGZtdF9hZGRuOworICAgIHN0cnVjdCB7IC8qIGUuZy4gYWRkbiAkdTQsJFJpICovCisgICAgICBVSU5UIGZfdTQ7CisgICAgICBTSSAqIGlfUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfUmk7CisgICAgfSBmbXRfYWRkbmk7CisgICAgc3RydWN0IHsgLyogZS5nLiBhZGRuMiAkbTQsJFJpICovCisgICAgICBTSSBmX200OworICAgICAgU0kgKiBpX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X1JpOworICAgIH0gZm10X2FkZG4yOworICAgIHN0cnVjdCB7IC8qIGUuZy4gY21wICRSaiwkUmkgKi8KKyAgICAgIFNJICogaV9SaTsKKyAgICAgIFNJICogaV9SajsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JqOworICAgIH0gZm10X2NtcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGNtcCAkdTQsJFJpICovCisgICAgICBVSU5UIGZfdTQ7CisgICAgICBTSSAqIGlfUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgIH0gZm10X2NtcGk7CisgICAgc3RydWN0IHsgLyogZS5nLiBjbXAyICRtNCwkUmkgKi8KKyAgICAgIFNJIGZfbTQ7CisgICAgICBTSSAqIGlfUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgIH0gZm10X2NtcDI7CisgICAgc3RydWN0IHsgLyogZS5nLiBhbmQgJFJqLCRSaSAqLworICAgICAgU0kgKiBpX1JpOworICAgICAgU0kgKiBpX1JqOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmo7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9SaTsKKyAgICB9IGZtdF9hbmQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBhbmQgJFJqLEAkUmkgKi8KKyAgICAgIFNJICogaV9SaTsKKyAgICAgIFNJICogaV9SajsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JqOworICAgIH0gZm10X2FuZG07CisgICAgc3RydWN0IHsgLyogZS5nLiBhbmRoICRSaixAJFJpICovCisgICAgICBTSSAqIGlfUmk7CisgICAgICBTSSAqIGlfUmo7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SajsKKyAgICB9IGZtdF9hbmRoOworICAgIHN0cnVjdCB7IC8qIGUuZy4gYW5kYiAkUmosQCRSaSAqLworICAgICAgU0kgKiBpX1JpOworICAgICAgU0kgKiBpX1JqOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmo7CisgICAgfSBmbXRfYW5kYjsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGJhbmRsICR1NCxAJFJpICovCisgICAgICBVSU5UIGZfdTQ7CisgICAgICBTSSAqIGlfUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgIH0gZm10X2JhbmRsOworICAgIHN0cnVjdCB7IC8qIGUuZy4gYnRzdGwgJHU0LEAkUmkgKi8KKyAgICAgIFVJTlQgZl91NDsKKyAgICAgIFNJICogaV9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7CisgICAgfSBmbXRfYnRzdGw7CisgICAgc3RydWN0IHsgLyogZS5nLiBtdWwgJFJqLCRSaSAqLworICAgICAgU0kgKiBpX1JpOworICAgICAgU0kgKiBpX1JqOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmo7CisgICAgfSBmbXRfbXVsOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbXVsdSAkUmosJFJpICovCisgICAgICBTSSAqIGlfUmk7CisgICAgICBTSSAqIGlfUmo7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SajsKKyAgICB9IGZtdF9tdWx1OworICAgIHN0cnVjdCB7IC8qIGUuZy4gbXVsaCAkUmosJFJpICovCisgICAgICBTSSAqIGlfUmk7CisgICAgICBTSSAqIGlfUmo7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SajsKKyAgICB9IGZtdF9tdWxoOworICAgIHN0cnVjdCB7IC8qIGUuZy4gZGl2MHMgJFJpICovCisgICAgICBTSSAqIGlfUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgIH0gZm10X2RpdjBzOworICAgIHN0cnVjdCB7IC8qIGUuZy4gZGl2MHUgJFJpICovCisgICAgICBpbnQgZW1wdHk7CisgICAgfSBmbXRfZGl2MHU7CisgICAgc3RydWN0IHsgLyogZS5nLiBkaXYxICRSaSAqLworICAgICAgU0kgKiBpX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SaTsKKyAgICB9IGZtdF9kaXYxOworICAgIHN0cnVjdCB7IC8qIGUuZy4gZGl2MiAkUmkgKi8KKyAgICAgIFNJICogaV9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7CisgICAgfSBmbXRfZGl2MjsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGRpdjMgKi8KKyAgICAgIGludCBlbXB0eTsKKyAgICB9IGZtdF9kaXYzOworICAgIHN0cnVjdCB7IC8qIGUuZy4gZGl2NHMgKi8KKyAgICAgIGludCBlbXB0eTsKKyAgICB9IGZtdF9kaXY0czsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxzbCAkUmosJFJpICovCisgICAgICBTSSAqIGlfUmk7CisgICAgICBTSSAqIGlfUmo7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SajsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X1JpOworICAgIH0gZm10X2xzbDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxzbCAkdTQsJFJpICovCisgICAgICBVSU5UIGZfdTQ7CisgICAgICBTSSAqIGlfUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfUmk7CisgICAgfSBmbXRfbHNsaTsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkaTo4ICRpOCwkUmkgKi8KKyAgICAgIFVJTlQgZl9pODsKKyAgICAgIFNJICogaV9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X1JpOworICAgIH0gZm10X2xkaTg7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZGk6MjAgJGkyMCwkUmkgKi8KKyAgICAgIFVJTlQgZl9pMjA7CisgICAgICBTSSAqIGlfUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9SaTsKKyAgICB9IGZtdF9sZGkyMDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkaTozMiAkaTMyLCRSaSAqLworICAgICAgVUlOVCBmX2kzMjsKKyAgICAgIFNJICogaV9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X1JpOworICAgIH0gZm10X2xkaTMyOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGQgQCRSaiwkUmkgKi8KKyAgICAgIFNJICogaV9SajsKKyAgICAgIFNJICogaV9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmo7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9SaTsKKyAgICB9IGZtdF9sZDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkdWggQCRSaiwkUmkgKi8KKyAgICAgIFNJICogaV9SajsKKyAgICAgIFNJICogaV9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmo7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9SaTsKKyAgICB9IGZtdF9sZHVoOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGR1YiBAJFJqLCRSaSAqLworICAgICAgU0kgKiBpX1JqOworICAgICAgU0kgKiBpX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SajsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X1JpOworICAgIH0gZm10X2xkdWI7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZCBAKCRSMTMsJFJqKSwkUmkgKi8KKyAgICAgIFNJICogaV9SajsKKyAgICAgIFNJICogaV9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmo7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTM7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9SaTsKKyAgICB9IGZtdF9sZHIxMzsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkdWggQCgkUjEzLCRSaiksJFJpICovCisgICAgICBTSSAqIGlfUmo7CisgICAgICBTSSAqIGlfUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JqOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzEzOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfUmk7CisgICAgfSBmbXRfbGRyMTN1aDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkdWIgQCgkUjEzLCRSaiksJFJpICovCisgICAgICBTSSAqIGlfUmo7CisgICAgICBTSSAqIGlfUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JqOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzEzOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfUmk7CisgICAgfSBmbXRfbGRyMTN1YjsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkIEAoJFIxNCwkZGlzcDEwKSwkUmkgKi8KKyAgICAgIFNJIGZfZGlzcDEwOworICAgICAgU0kgKiBpX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfUmk7CisgICAgfSBmbXRfbGRyMTQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZHVoIEAoJFIxNCwkZGlzcDkpLCRSaSAqLworICAgICAgU0kgZl9kaXNwOTsKKyAgICAgIFNJICogaV9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X1JpOworICAgIH0gZm10X2xkcjE0dWg7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZHViIEAoJFIxNCwkZGlzcDgpLCRSaSAqLworICAgICAgSU5UIGZfZGlzcDg7CisgICAgICBTSSAqIGlfUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTQ7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9SaTsKKyAgICB9IGZtdF9sZHIxNHViOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGQgQCgkUjE1LCR1ZGlzcDYpLCRSaSAqLworICAgICAgVVNJIGZfdWRpc3A2OworICAgICAgU0kgKiBpX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE1OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfUmk7CisgICAgfSBmbXRfbGRyMTU7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZCBAJFIxNSssJFJpICovCisgICAgICBVSU5UIGZfUmk7CisgICAgICBTSSAqIGlfUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTU7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTU7CisgICAgfSBmbXRfbGRyMTVncjsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkIEAkUjE1KywkUnMyICovCisgICAgICBVSU5UIGZfUnMyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE1OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xNTsKKyAgICB9IGZtdF9sZHIxNWRyOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGQgQCRSMTUrLCRwcyAqLworICAgICAgaW50IGVtcHR5OworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE1OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xNTsKKyAgICB9IGZtdF9sZHIxNXBzOworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3QgJFJpLEAkUmogKi8KKyAgICAgIFNJICogaV9SaTsKKyAgICAgIFNJICogaV9SajsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JqOworICAgIH0gZm10X3N0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3RoICRSaSxAJFJqICovCisgICAgICBTSSAqIGlfUmk7CisgICAgICBTSSAqIGlfUmo7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SajsKKyAgICB9IGZtdF9zdGg7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdGIgJFJpLEAkUmogKi8KKyAgICAgIFNJICogaV9SaTsKKyAgICAgIFNJICogaV9SajsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JqOworICAgIH0gZm10X3N0YjsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0ICRSaSxAKCRSMTMsJFJqKSAqLworICAgICAgU0kgKiBpX1JpOworICAgICAgU0kgKiBpX1JqOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmo7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTM7CisgICAgfSBmbXRfc3RyMTM7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdGggJFJpLEAoJFIxMywkUmopICovCisgICAgICBTSSAqIGlfUmk7CisgICAgICBTSSAqIGlfUmo7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SajsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMzsKKyAgICB9IGZtdF9zdHIxM2g7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdGIgJFJpLEAoJFIxMywkUmopICovCisgICAgICBTSSAqIGlfUmk7CisgICAgICBTSSAqIGlfUmo7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SajsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMzsKKyAgICB9IGZtdF9zdHIxM2I7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdCAkUmksQCgkUjE0LCRkaXNwMTApICovCisgICAgICBTSSBmX2Rpc3AxMDsKKyAgICAgIFNJICogaV9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTQ7CisgICAgfSBmbXRfc3RyMTQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdGggJFJpLEAoJFIxNCwkZGlzcDkpICovCisgICAgICBTSSBmX2Rpc3A5OworICAgICAgU0kgKiBpX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNDsKKyAgICB9IGZtdF9zdHIxNGg7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdGIgJFJpLEAoJFIxNCwkZGlzcDgpICovCisgICAgICBJTlQgZl9kaXNwODsKKyAgICAgIFNJICogaV9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTQ7CisgICAgfSBmbXRfc3RyMTRiOworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3QgJFJpLEAoJFIxNSwkdWRpc3A2KSAqLworICAgICAgVVNJIGZfdWRpc3A2OworICAgICAgU0kgKiBpX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNTsKKyAgICB9IGZtdF9zdHIxNTsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0ICRSaSxALSRSMTUgKi8KKyAgICAgIFNJICogaV9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTU7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE1OworICAgIH0gZm10X3N0cjE1Z3I7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdCAkUnMyLEAtJFIxNSAqLworICAgICAgVUlOVCBmX1JzMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTU7CisgICAgfSBmbXRfc3RyMTVkcjsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0ICRwcyxALSRSMTUgKi8KKyAgICAgIGludCBlbXB0eTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTU7CisgICAgfSBmbXRfc3RyMTVwczsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIG1vdiAkUmosJFJpICovCisgICAgICBTSSAqIGlfUmo7CisgICAgICBTSSAqIGlfUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JqOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfUmk7CisgICAgfSBmbXRfbW92OworICAgIHN0cnVjdCB7IC8qIGUuZy4gbW92ICRSczEsJFJpICovCisgICAgICBVSU5UIGZfUnMxOworICAgICAgU0kgKiBpX1JpOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfUmk7CisgICAgfSBmbXRfbW92ZHI7CisgICAgc3RydWN0IHsgLyogZS5nLiBtb3YgJHBzLCRSaSAqLworICAgICAgU0kgKiBpX1JpOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfUmk7CisgICAgfSBmbXRfbW92cHM7CisgICAgc3RydWN0IHsgLyogZS5nLiBtb3YgJFJpLCRSczEgKi8KKyAgICAgIFVJTlQgZl9SczE7CisgICAgICBTSSAqIGlfUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgIH0gZm10X21vdjJkcjsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIG1vdiAkUmksJHBzICovCisgICAgICBTSSAqIGlfUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgIH0gZm10X21vdjJwczsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGJubzpkICRsYWJlbDkgKi8KKyAgICAgIGludCBlbXB0eTsKKyAgICB9IGZtdF9ibm9kOworICAgIHN0cnVjdCB7IC8qIGUuZy4gZG1vdiAkUjEzLEAkZGlyMTAgKi8KKyAgICAgIFVTSSBmX2RpcjEwOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzEzOworICAgIH0gZm10X2Rtb3ZyMTM7CisgICAgc3RydWN0IHsgLyogZS5nLiBkbW92aCAkUjEzLEAkZGlyOSAqLworICAgICAgVVNJIGZfZGlyOTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMzsKKyAgICB9IGZtdF9kbW92cjEzaDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGRtb3ZiICRSMTMsQCRkaXI4ICovCisgICAgICBVSU5UIGZfZGlyODsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMzsKKyAgICB9IGZtdF9kbW92cjEzYjsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGRtb3YgQCRSMTMrLEAkZGlyMTAgKi8KKyAgICAgIFVTSSBmX2RpcjEwOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzEzOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xMzsKKyAgICB9IGZtdF9kbW92cjEzcGk7CisgICAgc3RydWN0IHsgLyogZS5nLiBkbW92aCBAJFIxMyssQCRkaXI5ICovCisgICAgICBVU0kgZl9kaXI5OworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzEzOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xMzsKKyAgICB9IGZtdF9kbW92cjEzcGloOworICAgIHN0cnVjdCB7IC8qIGUuZy4gZG1vdmIgQCRSMTMrLEAkZGlyOCAqLworICAgICAgVUlOVCBmX2Rpcjg7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTM7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzEzOworICAgIH0gZm10X2Rtb3ZyMTNwaWI7CisgICAgc3RydWN0IHsgLyogZS5nLiBkbW92IEAkUjE1KyxAJGRpcjEwICovCisgICAgICBVU0kgZl9kaXIxMDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTU7CisgICAgfSBmbXRfZG1vdnIxNXBpOworICAgIHN0cnVjdCB7IC8qIGUuZy4gZG1vdiBAJGRpcjEwLCRSMTMgKi8KKyAgICAgIFVTSSBmX2RpcjEwOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xMzsKKyAgICB9IGZtdF9kbW92MnIxMzsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGRtb3ZoIEAkZGlyOSwkUjEzICovCisgICAgICBVU0kgZl9kaXI5OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xMzsKKyAgICB9IGZtdF9kbW92MnIxM2g7CisgICAgc3RydWN0IHsgLyogZS5nLiBkbW92YiBAJGRpcjgsJFIxMyAqLworICAgICAgVUlOVCBmX2Rpcjg7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzEzOworICAgIH0gZm10X2Rtb3YycjEzYjsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGRtb3YgQCRkaXIxMCxAJFIxMysgKi8KKyAgICAgIFVTSSBmX2RpcjEwOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzEzOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xMzsKKyAgICB9IGZtdF9kbW92MnIxM3BpOworICAgIHN0cnVjdCB7IC8qIGUuZy4gZG1vdmggQCRkaXI5LEAkUjEzKyAqLworICAgICAgVVNJIGZfZGlyOTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTM7CisgICAgfSBmbXRfZG1vdjJyMTNwaWg7CisgICAgc3RydWN0IHsgLyogZS5nLiBkbW92YiBAJGRpcjgsQCRSMTMrICovCisgICAgICBVSU5UIGZfZGlyODsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTM7CisgICAgfSBmbXRfZG1vdjJyMTNwaWI7CisgICAgc3RydWN0IHsgLyogZS5nLiBkbW92IEAkZGlyMTAsQC0kUjE1ICovCisgICAgICBVU0kgZl9kaXIxMDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTU7CisgICAgfSBmbXRfZG1vdjJyMTVwZDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkcmVzIEAkUmkrLCR1NCAqLworICAgICAgU0kgKiBpX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X1JpOworICAgIH0gZm10X2xkcmVzOworICAgIHN0cnVjdCB7IC8qIGUuZy4gY29wb3AgJHU0YywkY2NjLCRDUmosJENSaSAqLworICAgICAgaW50IGVtcHR5OworICAgIH0gZm10X2NvcG9wOworICAgIHN0cnVjdCB7IC8qIGUuZy4gY29wbGQgJHU0YywkY2NjLCRSamMsJENSaSAqLworICAgICAgaW50IGVtcHR5OworICAgIH0gZm10X2NvcGxkOworICAgIHN0cnVjdCB7IC8qIGUuZy4gY29wc3QgJHU0YywkY2NjLCRDUmosJFJpYyAqLworICAgICAgaW50IGVtcHR5OworICAgIH0gZm10X2NvcHN0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gbm9wICovCisgICAgICBpbnQgZW1wdHk7CisgICAgfSBmbXRfbm9wOworICAgIHN0cnVjdCB7IC8qIGUuZy4gYW5kY2NyICR1OCAqLworICAgICAgVUlOVCBmX3U4OworICAgIH0gZm10X2FuZGNjcjsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0aWxtICR1OCAqLworICAgICAgVUlOVCBmX3U4OworICAgIH0gZm10X3N0aWxtOworICAgIHN0cnVjdCB7IC8qIGUuZy4gYWRkc3AgJHMxMCAqLworICAgICAgU0kgZl9zMTA7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTU7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE1OworICAgIH0gZm10X2FkZHNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gZXh0c2IgJFJpICovCisgICAgICBTSSAqIGlfUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfUmk7CisgICAgfSBmbXRfZXh0c2I7CisgICAgc3RydWN0IHsgLyogZS5nLiBleHR1YiAkUmkgKi8KKyAgICAgIFNJICogaV9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9SaTsKKyAgICB9IGZtdF9leHR1YjsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGV4dHNoICRSaSAqLworICAgICAgU0kgKiBpX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SaTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X1JpOworICAgIH0gZm10X2V4dHNoOworICAgIHN0cnVjdCB7IC8qIGUuZy4gZXh0dWggJFJpICovCisgICAgICBTSSAqIGlfUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfUmk7CisgICAgfSBmbXRfZXh0dWg7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZG0wICgkcmVnbGlzdF9sb3dfbGQpICovCisgICAgICBVSU5UIGZfcmVnbGlzdF9sb3dfbGQ7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTU7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzA7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE1OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8yOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8zOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl80OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl81OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl82OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl83OworICAgIH0gZm10X2xkbTA7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZG0xICgkcmVnbGlzdF9oaV9sZCkgKi8KKyAgICAgIFVJTlQgZl9yZWdsaXN0X2hpX2xkOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE1OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xMDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTE7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzEyOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xMzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTQ7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE1OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl84OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl85OworICAgIH0gZm10X2xkbTE7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdG0wICgkcmVnbGlzdF9sb3dfc3QpICovCisgICAgICBVSU5UIGZfcmVnbGlzdF9sb3dfc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE1OworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl80OworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzU7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfNjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl83OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xNTsKKyAgICB9IGZtdF9zdG0wOworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3RtMSAoJHJlZ2xpc3RfaGlfc3QpICovCisgICAgICBVSU5UIGZfcmVnbGlzdF9oaV9zdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl84OworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzk7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE1OworICAgIH0gZm10X3N0bTE7CisgICAgc3RydWN0IHsgLyogZS5nLiBlbnRlciAkdTEwICovCisgICAgICBVU0kgZl91MTA7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTQ7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTU7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xNTsKKyAgICB9IGZtdF9lbnRlcjsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxlYXZlICovCisgICAgICBpbnQgZW1wdHk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTQ7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTU7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xNTsKKyAgICB9IGZtdF9sZWF2ZTsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHhjaGIgQCRSaiwkUmkgKi8KKyAgICAgIFNJICogaV9SaTsKKyAgICAgIFNJICogaV9SajsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JqOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfUmk7CisgICAgfSBmbXRfeGNoYjsKKyAgLyogY3RpIGluc25zLCBrZXB0IHNlcGFyYXRlbHkgc28gYWRkcl9jYWNoZSBpcyBpbiBmaXhlZCBwbGFjZSAqLworICBzdHJ1Y3QgeworICAgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGptcCBAJFJpICovCisgICAgICBTSSAqIGlfUmk7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX1JpOworICAgIH0gZm10X2ptcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGNhbGwgQCRSaSAqLworICAgICAgU0kgKiBpX1JpOworICAgICAgdW5zaWduZWQgY2hhciBpbl9SaTsKKyAgICB9IGZtdF9jYWxscjsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGNhbGwgJGxhYmVsMTIgKi8KKyAgICAgIElBRERSIGlfbGFiZWwxMjsKKyAgICB9IGZtdF9jYWxsOworICAgIHN0cnVjdCB7IC8qIGUuZy4gcmV0ICovCisgICAgICBpbnQgZW1wdHk7CisgICAgfSBmbXRfcmV0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gaW50ICR1OCAqLworICAgICAgVUlOVCBmX3U4OworICAgIH0gZm10X2ludDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGludGUgKi8KKyAgICAgIGludCBlbXB0eTsKKyAgICB9IGZtdF9pbnRlOworICAgIHN0cnVjdCB7IC8qIGUuZy4gcmV0aSAqLworICAgICAgaW50IGVtcHR5OworICAgIH0gZm10X3JldGk7CisgICAgc3RydWN0IHsgLyogZS5nLiBicmE6ZCAkbGFiZWw5ICovCisgICAgICBJQUREUiBpX2xhYmVsOTsKKyAgICB9IGZtdF9icmFkOworICAgIHN0cnVjdCB7IC8qIGUuZy4gYmVxOmQgJGxhYmVsOSAqLworICAgICAgSUFERFIgaV9sYWJlbDk7CisgICAgfSBmbXRfYmVxZDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGJjOmQgJGxhYmVsOSAqLworICAgICAgSUFERFIgaV9sYWJlbDk7CisgICAgfSBmbXRfYmNkOworICAgIHN0cnVjdCB7IC8qIGUuZy4gYm46ZCAkbGFiZWw5ICovCisgICAgICBJQUREUiBpX2xhYmVsOTsKKyAgICB9IGZtdF9ibmQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBidjpkICRsYWJlbDkgKi8KKyAgICAgIElBRERSIGlfbGFiZWw5OworICAgIH0gZm10X2J2ZDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGJsdDpkICRsYWJlbDkgKi8KKyAgICAgIElBRERSIGlfbGFiZWw5OworICAgIH0gZm10X2JsdGQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBibGU6ZCAkbGFiZWw5ICovCisgICAgICBJQUREUiBpX2xhYmVsOTsKKyAgICB9IGZtdF9ibGVkOworICAgIHN0cnVjdCB7IC8qIGUuZy4gYmxzOmQgJGxhYmVsOSAqLworICAgICAgSUFERFIgaV9sYWJlbDk7CisgICAgfSBmbXRfYmxzZDsKKyAgICB9IGZpZWxkczsKKyNpZiBXSVRIX1NDQUNIRV9QQkIKKyAgICBTRU1fUEMgYWRkcl9jYWNoZTsKKyNlbmRpZgorICB9IGN0aTsKKyNpZiBXSVRIX1NDQUNIRV9QQkIKKyAgLyogV3JpdGViYWNrIGhhbmRsZXIuICAqLworICBzdHJ1Y3QgeworICAgIC8qIFBvaW50ZXIgdG8gYXJnYnVmIGVudHJ5IGZvciBpbnNuIHdob3NlIHJlc3VsdHMgbmVlZCB3cml0aW5nIGJhY2suICAqLworICAgIGNvbnN0IHN0cnVjdCBhcmdidWYgKmFidWY7CisgIH0gd3JpdGU7CisgIC8qIHgtYmVmb3JlIGhhbmRsZXIgKi8KKyAgc3RydWN0IHsKKyAgICAvKmNvbnN0IFNDQUNIRSAqaW5zbnNbTUFYX1BBUkFMTEVMX0lOU05TXTsqLworICAgIGludCBmaXJzdF9wOworICB9IGJlZm9yZTsKKyAgLyogeC1hZnRlciBoYW5kbGVyICovCisgIHN0cnVjdCB7CisgICAgaW50IGVtcHR5OworICB9IGFmdGVyOworICAvKiBUaGlzIGVudHJ5IGlzIHVzZWQgdG8gdGVybWluYXRlIGVhY2ggcGJiLiAgKi8KKyAgc3RydWN0IHsKKyAgICAvKiBOdW1iZXIgb2YgaW5zbnMgaW4gcGJiLiAgKi8KKyAgICBpbnQgaW5zbl9jb3VudDsKKyAgICAvKiBOZXh0IHBiYiB0byBleGVjdXRlLiAgKi8KKyAgICBTQ0FDSEUgKm5leHQ7CisgIH0gY2hhaW47CisjZW5kaWYKK307CisKKy8qIFRoZSBBUkdCVUYgc3RydWN0LiAgKi8KK3N0cnVjdCBhcmdidWYgeworICAvKiBUaGVzZSBhcmUgdGhlIGJhc2VjbGFzcyBkZWZpbml0aW9ucy4gICovCisgIElBRERSIGFkZHI7CisgIGNvbnN0IElERVNDICppZGVzYzsKKyAgY2hhciB0cmFjZV9wOworICBjaGFyIHByb2ZpbGVfcDsKKyAgLyogY3B1IHNwZWNpZmljIGRhdGEgZm9sbG93cyAqLworICB1bmlvbiBzZW0gc2VtYW50aWM7CisgIGludCB3cml0dGVuOworICB1bmlvbiBzZW1fZmllbGRzIGZpZWxkczsKK307CisKKy8qIEEgY2FjaGVkIGluc24uCisKKyAgID8/PyBTQ0FDSEUgdXNlZCB0byBjb250YWluIG1vcmUgdGhhbiBqdXN0IGFyZ2J1Zi4gIFdlIGNvdWxkIGRlbGV0ZSB0aGUKKyAgIHR5cGUgZW50aXJlbHkgYW5kIGFsd2F5cyBqdXN0IHVzZSBBUkdCVUYsIGJ1dCBmb3IgZnV0dXJlIGNvbmNlcm5zIGFuZCBhcworICAgYSBsZXZlbCBvZiBhYnN0cmFjdGlvbiBpdCBpcyBsZWZ0IGluLiAgKi8KKworc3RydWN0IHNjYWNoZSB7CisgIHN0cnVjdCBhcmdidWYgYXJnYnVmOworfTsKKworLyogTWFjcm9zIHRvIHNpbXBsaWZ5IGV4dHJhY3Rpb24sIHJlYWRpbmcgYW5kIHNlbWFudGljIGNvZGUuCisgICBUaGVzZSBkZWZpbmUgYW5kIGFzc2lnbiB0aGUgbG9jYWwgdmFycyB0aGF0IGNvbnRhaW4gdGhlIGluc24ncyBmaWVsZHMuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9FTVBUWV9WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfRU1QVFlfQ09ERSBcCisgIGxlbmd0aCA9IDA7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgVUlOVCBmX29wMjsgXAorICBVSU5UIGZfUmo7IFwKKyAgVUlOVCBmX1JpOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9BRERfQ09ERSBcCisgIGxlbmd0aCA9IDI7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAorICBmX29wMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCisgIGZfUmogPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAorICBmX1JpID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0FERElfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfb3AyOyBcCisgIFVJTlQgZl91NDsgXAorICBVSU5UIGZfUmk7IFwKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0FERElfQ09ERSBcCisgIGxlbmd0aCA9IDI7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAorICBmX29wMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCisgIGZfdTQgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAorICBmX1JpID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0FERDJfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfb3AyOyBcCisgIFNJIGZfbTQ7IFwKKyAgVUlOVCBmX1JpOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9BREQyX0NPREUgXAorICBsZW5ndGggPSAyOyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAorICBmX200ID0gKChFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA4LCA0KSkgfCAoKCgtMSkgPDwgKDQpKSkpOyBcCisgIGZfUmkgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfRElWMFNfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfb3AyOyBcCisgIFVJTlQgZl9vcDM7IFwKKyAgVUlOVCBmX1JpOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9ESVYwU19DT0RFIFwKKyAgbGVuZ3RoID0gMjsgXAorICBmX29wMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKKyAgZl9vcDMgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAorICBmX1JpID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0RJVjNfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfb3AyOyBcCisgIFVJTlQgZl9vcDM7IFwKKyAgVUlOVCBmX29wNDsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfRElWM19DT0RFIFwKKyAgbGVuZ3RoID0gMjsgXAorICBmX29wMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKKyAgZl9vcDMgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAorICBmX29wNCA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsgXAorCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9MREk4X1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgVUlOVCBmX2k4OyBcCisgIFVJTlQgZl9SaTsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfTERJOF9DT0RFIFwKKyAgbGVuZ3RoID0gMjsgXAorICBmX29wMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCisgIGZfaTggPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA0LCA4KTsgXAorICBmX1JpID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0xESTIwX1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgVUlOVCBmX2kyMDsgXAorICBVSU5UIGZfaTIwXzQ7IFwKKyAgVUlOVCBmX2kyMF8xNjsgXAorICBVSU5UIGZfb3AyOyBcCisgIFVJTlQgZl9SaTsgXAorICAvKiBDb250ZW50cyBvZiB0cmFpbGluZyBwYXJ0IG9mIGluc24uICAqLyBcCisgIFVJTlQgd29yZF8xOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9MREkyMF9DT0RFIFwKKyAgbGVuZ3RoID0gNDsgXAorICB3b3JkXzEgPSBHRVRJTUVNVUhJIChjdXJyZW50X2NwdSwgcGMgKyAyKTsgXAorICBmX29wMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCisgIGZfaTIwXzQgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAorICBmX2kyMF8xNiA9ICgwfChFWFRSQUNUX1VJTlQgKHdvcmRfMSwgMTYsIDAsIDE2KSA8PCAwKSk7IFwKK2RvIHtcCisgIGZfaTIwID0gKCgoKGZfaTIwXzQpIDw8ICgxNikpKSB8IChmX2kyMF8xNikpO1wKK30gd2hpbGUgKDApO1wKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAorICBmX1JpID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0xESTMyX1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgVUlOVCBmX2kzMjsgXAorICBVSU5UIGZfb3AyOyBcCisgIFVJTlQgZl9vcDM7IFwKKyAgVUlOVCBmX1JpOyBcCisgIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovIFwKKyAgVUlOVCB3b3JkXzE7IFwKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0xESTMyX0NPREUgXAorICBsZW5ndGggPSA2OyBcCisgIHdvcmRfMSA9IEdFVElNRU1VU0kgKGN1cnJlbnRfY3B1LCBwYyArIDIpOyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKKyAgZl9pMzIgPSAoMHwoRVhUUkFDVF9VSU5UICh3b3JkXzEsIDMyLCAwLCAzMikgPDwgMCkpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKKyAgZl9vcDMgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAorICBmX1JpID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0xEUjE0X1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgU0kgZl9kaXNwMTA7IFwKKyAgVUlOVCBmX1JpOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9MRFIxNF9DT0RFIFwKKyAgbGVuZ3RoID0gMjsgXAorICBmX29wMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCisgIGZfZGlzcDEwID0gKChFWFRSQUNUX0lOVCAoaW5zbiwgMTYsIDQsIDgpKSA8PCAoMikpOyBcCisgIGZfUmkgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfTERSMTRVSF9WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICBVSU5UIGZfb3AxOyBcCisgIFNJIGZfZGlzcDk7IFwKKyAgVUlOVCBmX1JpOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9MRFIxNFVIX0NPREUgXAorICBsZW5ndGggPSAyOyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKKyAgZl9kaXNwOSA9ICgoRVhUUkFDVF9JTlQgKGluc24sIDE2LCA0LCA4KSkgPDwgKDEpKTsgXAorICBmX1JpID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0xEUjE0VUJfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBJTlQgZl9kaXNwODsgXAorICBVSU5UIGZfUmk7IFwKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0xEUjE0VUJfQ09ERSBcCisgIGxlbmd0aCA9IDI7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAorICBmX2Rpc3A4ID0gRVhUUkFDVF9JTlQgKGluc24sIDE2LCA0LCA4KTsgXAorICBmX1JpID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0xEUjE1X1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgVUlOVCBmX29wMjsgXAorICBVU0kgZl91ZGlzcDY7IFwKKyAgVUlOVCBmX1JpOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9MRFIxNV9DT0RFIFwKKyAgbGVuZ3RoID0gMjsgXAorICBmX29wMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKKyAgZl91ZGlzcDYgPSAoKEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDgsIDQpKSA8PCAoMikpOyBcCisgIGZfUmkgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfTERSMTVEUl9WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICBVSU5UIGZfb3AxOyBcCisgIFVJTlQgZl9vcDI7IFwKKyAgVUlOVCBmX29wMzsgXAorICBVSU5UIGZfUnMyOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9MRFIxNURSX0NPREUgXAorICBsZW5ndGggPSAyOyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAorICBmX29wMyA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOyBcCisgIGZfUnMyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX01PVkRSX1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgVUlOVCBmX29wMjsgXAorICBVSU5UIGZfUnMxOyBcCisgIFVJTlQgZl9SaTsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfTU9WRFJfQ09ERSBcCisgIGxlbmd0aCA9IDI7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAorICBmX29wMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCisgIGZfUnMxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7IFwKKyAgZl9SaSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsgXAorCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9DQUxMX1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgVUlOVCBmX29wNTsgXAorICBTSSBmX3JlbDEyOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9DQUxMX0NPREUgXAorICBsZW5ndGggPSAyOyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKKyAgZl9vcDUgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA0LCAxKTsgXAorICBmX3JlbDEyID0gKCgoKEVYVFJBQ1RfSU5UIChpbnNuLCAxNiwgNSwgMTEpKSA8PCAoMSkpKSArICgoKHBjKSArICgyKSkpKTsgXAorCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9JTlRfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfb3AyOyBcCisgIFVJTlQgZl91ODsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfSU5UX0NPREUgXAorICBsZW5ndGggPSAyOyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAorICBmX3U4ID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgOCwgOCk7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfQlJBRF9WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICBVSU5UIGZfb3AxOyBcCisgIFVJTlQgZl9jYzsgXAorICBTSSBmX3JlbDk7IFwKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0JSQURfQ09ERSBcCisgIGxlbmd0aCA9IDI7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAorICBmX2NjID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKKyAgZl9yZWw5ID0gKCgoKEVYVFJBQ1RfSU5UIChpbnNuLCAxNiwgOCwgOCkpIDw8ICgxKSkpICsgKCgocGMpICsgKDIpKSkpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0RNT1ZSMTNfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfb3AyOyBcCisgIFVTSSBmX2RpcjEwOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9ETU9WUjEzX0NPREUgXAorICBsZW5ndGggPSAyOyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAorICBmX2RpcjEwID0gKChFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDIpKTsgXAorCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9ETU9WUjEzSF9WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICBVSU5UIGZfb3AxOyBcCisgIFVJTlQgZl9vcDI7IFwKKyAgVVNJIGZfZGlyOTsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfRE1PVlIxM0hfQ09ERSBcCisgIGxlbmd0aCA9IDI7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAorICBmX29wMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCisgIGZfZGlyOSA9ICgoRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgOCwgOCkpIDw8ICgxKSk7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfRE1PVlIxM0JfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfb3AyOyBcCisgIFVJTlQgZl9kaXI4OyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9ETU9WUjEzQl9DT0RFIFwKKyAgbGVuZ3RoID0gMjsgXAorICBmX29wMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKKyAgZl9kaXI4ID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgOCwgOCk7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfQ09QT1BfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfY2NjOyBcCisgIFVJTlQgZl9vcDI7IFwKKyAgVUlOVCBmX29wMzsgXAorICBVSU5UIGZfQ1JqOyBcCisgIFVJTlQgZl91NGM7IFwKKyAgVUlOVCBmX0NSaTsgXAorICAvKiBDb250ZW50cyBvZiB0cmFpbGluZyBwYXJ0IG9mIGluc24uICAqLyBcCisgIFVJTlQgd29yZF8xOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9DT1BPUF9DT0RFIFwKKyAgbGVuZ3RoID0gNDsgXAorICB3b3JkXzEgPSBHRVRJTUVNVUhJIChjdXJyZW50X2NwdSwgcGMgKyAyKTsgXAorICBmX29wMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCisgIGZfY2NjID0gKDB8KEVYVFJBQ1RfVUlOVCAod29yZF8xLCAxNiwgMCwgOCkgPDwgMCkpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKKyAgZl9vcDMgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAorICBmX0NSaiA9ICgwfChFWFRSQUNUX1VJTlQgKHdvcmRfMSwgMTYsIDgsIDQpIDw8IDApKTsgXAorICBmX3U0YyA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsgXAorICBmX0NSaSA9ICgwfChFWFRSQUNUX1VJTlQgKHdvcmRfMSwgMTYsIDEyLCAxNikgPDwgMCkpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0NPUExEX1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgVUlOVCBmX2NjYzsgXAorICBVSU5UIGZfb3AyOyBcCisgIFVJTlQgZl9vcDM7IFwKKyAgVUlOVCBmX1JqYzsgXAorICBVSU5UIGZfdTRjOyBcCisgIFVJTlQgZl9DUmk7IFwKKyAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8gXAorICBVSU5UIHdvcmRfMTsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfQ09QTERfQ09ERSBcCisgIGxlbmd0aCA9IDQ7IFwKKyAgd29yZF8xID0gR0VUSU1FTVVISSAoY3VycmVudF9jcHUsIHBjICsgMik7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAorICBmX2NjYyA9ICgwfChFWFRSQUNUX1VJTlQgKHdvcmRfMSwgMTYsIDAsIDgpIDw8IDApKTsgXAorICBmX29wMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCisgIGZfb3AzID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7IFwKKyAgZl9SamMgPSAoMHwoRVhUUkFDVF9VSU5UICh3b3JkXzEsIDE2LCA4LCA0KSA8PCAwKSk7IFwKKyAgZl91NGMgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKKyAgZl9DUmkgPSAoMHwoRVhUUkFDVF9VSU5UICh3b3JkXzEsIDE2LCAxMiwgMTYpIDw8IDApKTsgXAorCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9DT1BTVF9WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICBVSU5UIGZfb3AxOyBcCisgIFVJTlQgZl9jY2M7IFwKKyAgVUlOVCBmX29wMjsgXAorICBVSU5UIGZfb3AzOyBcCisgIFVJTlQgZl9DUmo7IFwKKyAgVUlOVCBmX3U0YzsgXAorICBVSU5UIGZfUmljOyBcCisgIC8qIENvbnRlbnRzIG9mIHRyYWlsaW5nIHBhcnQgb2YgaW5zbi4gICovIFwKKyAgVUlOVCB3b3JkXzE7IFwKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0NPUFNUX0NPREUgXAorICBsZW5ndGggPSA0OyBcCisgIHdvcmRfMSA9IEdFVElNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYyArIDIpOyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKKyAgZl9jY2MgPSAoMHwoRVhUUkFDVF9VSU5UICh3b3JkXzEsIDE2LCAwLCA4KSA8PCAwKSk7IFwKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAorICBmX29wMyA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOyBcCisgIGZfQ1JqID0gKDB8KEVYVFJBQ1RfVUlOVCAod29yZF8xLCAxNiwgOCwgNCkgPDwgMCkpOyBcCisgIGZfdTRjID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCisgIGZfUmljID0gKDB8KEVYVFJBQ1RfVUlOVCAod29yZF8xLCAxNiwgMTIsIDE2KSA8PCAwKSk7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfQUREU1BfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfb3AyOyBcCisgIFNJIGZfczEwOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9BRERTUF9DT0RFIFwKKyAgbGVuZ3RoID0gMjsgXAorICBmX29wMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKKyAgZl9zMTAgPSAoKEVYVFJBQ1RfSU5UIChpbnNuLCAxNiwgOCwgOCkpIDw8ICgyKSk7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfTERNMF9WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICBVSU5UIGZfb3AxOyBcCisgIFVJTlQgZl9vcDI7IFwKKyAgVUlOVCBmX3JlZ2xpc3RfbG93X2xkOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9MRE0wX0NPREUgXAorICBsZW5ndGggPSAyOyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAorICBmX3JlZ2xpc3RfbG93X2xkID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgOCwgOCk7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfTERNMV9WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICBVSU5UIGZfb3AxOyBcCisgIFVJTlQgZl9vcDI7IFwKKyAgVUlOVCBmX3JlZ2xpc3RfaGlfbGQ7IFwKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0xETTFfQ09ERSBcCisgIGxlbmd0aCA9IDI7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAorICBmX29wMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCisgIGZfcmVnbGlzdF9oaV9sZCA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDgsIDgpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX1NUTTBfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfb3AyOyBcCisgIFVJTlQgZl9yZWdsaXN0X2xvd19zdDsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfU1RNMF9DT0RFIFwKKyAgbGVuZ3RoID0gMjsgXAorICBmX29wMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKKyAgZl9yZWdsaXN0X2xvd19zdCA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDgsIDgpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX1NUTTFfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfb3AyOyBcCisgIFVJTlQgZl9yZWdsaXN0X2hpX3N0OyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9TVE0xX0NPREUgXAorICBsZW5ndGggPSAyOyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAorICBmX3JlZ2xpc3RfaGlfc3QgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA4LCA4KTsgXAorCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9FTlRFUl9WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICBVSU5UIGZfb3AxOyBcCisgIFVJTlQgZl9vcDI7IFwKKyAgVVNJIGZfdTEwOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9FTlRFUl9DT0RFIFwKKyAgbGVuZ3RoID0gMjsgXAorICBmX29wMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKKyAgZl91MTAgPSAoKEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDgsIDgpKSA8PCAoMikpOyBcCisKKy8qIENvbGxlY3Rpb24gb2YgdmFyaW91cyB0aGluZ3MgZm9yIHRoZSB0cmFjZSBoYW5kbGVyIHRvIHVzZS4gICovCisKK3R5cGVkZWYgc3RydWN0IHRyYWNlX3JlY29yZCB7CisgIElBRERSIHBjOworICAvKiBGSVhNRTp3aXAgKi8KK30gVFJBQ0VfUkVDT1JEOworCisjZW5kaWYgLyogQ1BVX0ZSMzBCRl9IICovCmRpZmYgLS1naXQgYS9zaW0vZnIzMC9jcHVhbGwuaCBiL3NpbS9mcjMwL2NwdWFsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOGVkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZnIzMC9jcHVhbGwuaApAQCAtMCwwICsxLDYzIEBACisvKiBTaW11bGF0b3IgQ1BVIGhlYWRlciBmb3IgZnIzMC4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2lmbmRlZiBGUjMwX0NQVUFMTF9ICisjZGVmaW5lIEZSMzBfQ1BVQUxMX0gKKworLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCBjcHUgZmFtaWx5LiAgKi8KKworI2lmZGVmIFdBTlRfQ1BVX0ZSMzBCRgorI2luY2x1ZGUgImVuZy5oIgorI2luY2x1ZGUgImNnZW4tZW5naW5lLmgiCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAiZGVjb2RlLmgiCisjZW5kaWYKKworZXh0ZXJuIGNvbnN0IE1BQ0ggZnIzMF9tYWNoOworCisjaWZuZGVmIFdBTlRfQ1BVCisvKiBUaGUgQVJHQlVGIHN0cnVjdC4gICovCitzdHJ1Y3QgYXJnYnVmIHsKKyAgLyogVGhlc2UgYXJlIHRoZSBiYXNlY2xhc3MgZGVmaW5pdGlvbnMuICAqLworICBJQUREUiBhZGRyOworICBjb25zdCBJREVTQyAqaWRlc2M7CisgIGNoYXIgdHJhY2VfcDsKKyAgY2hhciBwcm9maWxlX3A7CisgIC8qIGNwdSBzcGVjaWZpYyBkYXRhIGZvbGxvd3MgKi8KK307CisjZW5kaWYKKworI2lmbmRlZiBXQU5UX0NQVQorLyogQSBjYWNoZWQgaW5zbi4KKworICAgPz8/IFNDQUNIRSB1c2VkIHRvIGNvbnRhaW4gbW9yZSB0aGFuIGp1c3QgYXJnYnVmLiAgV2UgY291bGQgZGVsZXRlIHRoZQorICAgdHlwZSBlbnRpcmVseSBhbmQgYWx3YXlzIGp1c3QgdXNlIEFSR0JVRiwgYnV0IGZvciBmdXR1cmUgY29uY2VybnMgYW5kIGFzCisgICBhIGxldmVsIG9mIGFic3RyYWN0aW9uIGl0IGlzIGxlZnQgaW4uICAqLworCitzdHJ1Y3Qgc2NhY2hlIHsKKyAgc3RydWN0IGFyZ2J1ZiBhcmdidWY7Cit9OworI2VuZGlmCisKKyNlbmRpZiAvKiBGUjMwX0NQVUFMTF9IICovCmRpZmYgLS1naXQgYS9zaW0vZnIzMC9kZWNvZGUuYyBiL3NpbS9mcjMwL2RlY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZDE2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZnIzMC9kZWNvZGUuYwpAQCAtMCwwICsxLDMzMDMgQEAKKy8qIFNpbXVsYXRvciBpbnN0cnVjdGlvbiBkZWNvZGVyIGZvciBmcjMwYmYuCisKK1RISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCisKK0NvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyovCisKKyNkZWZpbmUgV0FOVF9DUFUgZnIzMGJmCisjZGVmaW5lIFdBTlRfQ1BVX0ZSMzBCRgorCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisKKy8qIEZJWE1FOiBOZWVkIHRvIHJldmlldyBjaG9pY2VzIGZvciB0aGUgZm9sbG93aW5nLiAgKi8KKworI2lmIFdJVEhfU0VNX1NXSVRDSF9GVUxMCisjZGVmaW5lIEZVTEwoZm4pCisjZWxzZQorI2RlZmluZSBGVUxMKGZuKSBDT05DQVQzIChmcjMwYmYsX3NlbV8sZm4pICwKKyNlbmRpZgorCisjaWYgV0lUSF9GQVNUCisjaWYgV0lUSF9TRU1fU1dJVENIX0ZBU1QKKyNkZWZpbmUgRkFTVChmbikKKyNlbHNlCisjZGVmaW5lIEZBU1QoZm4pIENPTkNBVDMgKGZyMzBiZixfc2VtZl8sZm4pICwgLyogZiBmb3IgZmFzdCAqLworI2VuZGlmCisjZWxzZQorI2RlZmluZSBGQVNUKGZuKQorI2VuZGlmCisKKy8qIFRoZSBpbnN0cnVjdGlvbiBkZXNjcmlwdG9yIGFycmF5LgorICAgVGhpcyBpcyBjb21wdXRlZCBhdCBydW50aW1lLiAgU3BhY2UgZm9yIGl0IGlzIG5vdCBtYWxsb2MnZCB0byBzYXZlIGEKKyAgIHRlZW5zeSBiaXQgb2YgY3B1IGluIHRoZSBkZWNvZGVyLiAgTW92aW5nIGl0IHRvIG1hbGxvYyBzcGFjZSBpcyB0cml2aWFsCisgICBidXQgd29uJ3QgYmUgZG9uZSB1bnRpbCBuZWNlc3NhcnkgKHdlIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IHRoZSBydW50aW1lCisgICBhZGRpdGlvbiBvZiBpbnN0cnVjdGlvbnMgbm9yIGFuIFNNUCBtYWNoaW5lIHdpdGggZGlmZmVyZW50IGNwdXMpLiAgKi8KK3N0YXRpYyBJREVTQyBmcjMwYmZfaW5zbl9kYXRhW0ZSMzBCRl9JTlNOX01BWF07CisKKy8qIFRoZSBJTlNOXyBwcmVmaXggaXMgbm90IGhlcmUgYW5kIGlzIGluc3RlYWQgcGFydCBvZiB0aGUgYGluc24nIGFyZ3VtZW50CisgICB0byBhdm9pZCBjb2xsaXNpb25zIHdpdGggaGVhZGVyIGZpbGVzIChlLmcuIGBBTkQnIGluIGFuc2lkZWNsLmgpLiAgKi8KKyNkZWZpbmUgSURYKGluc24pIENPTkNBVDIgKEZSMzBCRl8saW5zbikKKyNkZWZpbmUgVFlQRShpbnNuKSBDT05DQVQyIChGUjMwXyxpbnNuKQorCisvKiBDb21tYXMgYmV0d2VlbiBlbGVtZW50cyBhcmUgY29udGFpbmVkIGluIHRoZSBtYWNyb3MuCisgICBTb21lIG9mIHRoZXNlIGFyZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkIG91dC4gICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW5zbl9zZW0gZnIzMGJmX2luc25fc2VtW10gPQoreworICB7IFZJUlRVQUxfSU5TTl9YX0lOVkFMSUQsIElEWCAoSU5TTl9YX0lOVkFMSUQpLCBGVUxMICh4X2ludmFsaWQpIEZBU1QgKHhfaW52YWxpZCkgfSwKKyAgeyBWSVJUVUFMX0lOU05fWF9BRlRFUiwgSURYIChJTlNOX1hfQUZURVIpLCBGVUxMICh4X2FmdGVyKSBGQVNUICh4X2FmdGVyKSB9LAorICB7IFZJUlRVQUxfSU5TTl9YX0JFRk9SRSwgSURYIChJTlNOX1hfQkVGT1JFKSwgRlVMTCAoeF9iZWZvcmUpIEZBU1QgKHhfYmVmb3JlKSB9LAorICB7IFZJUlRVQUxfSU5TTl9YX0NUSV9DSEFJTiwgSURYIChJTlNOX1hfQ1RJX0NIQUlOKSwgRlVMTCAoeF9jdGlfY2hhaW4pIEZBU1QgKHhfY3RpX2NoYWluKSB9LAorICB7IFZJUlRVQUxfSU5TTl9YX0NIQUlOLCBJRFggKElOU05fWF9DSEFJTiksIEZVTEwgKHhfY2hhaW4pIEZBU1QgKHhfY2hhaW4pIH0sCisgIHsgVklSVFVBTF9JTlNOX1hfQkVHSU4sIElEWCAoSU5TTl9YX0JFR0lOKSwgRlVMTCAoeF9iZWdpbikgRkFTVCAoeF9iZWdpbikgfSwKKyAgeyBUWVBFIChJTlNOX0FERCksIElEWCAoSU5TTl9BREQpLCBGVUxMIChhZGQpIEZBU1QgKGFkZCkgfSwKKyAgeyBUWVBFIChJTlNOX0FEREkpLCBJRFggKElOU05fQURESSksIEZVTEwgKGFkZGkpIEZBU1QgKGFkZGkpIH0sCisgIHsgVFlQRSAoSU5TTl9BREQyKSwgSURYIChJTlNOX0FERDIpLCBGVUxMIChhZGQyKSBGQVNUIChhZGQyKSB9LAorICB7IFRZUEUgKElOU05fQUREQyksIElEWCAoSU5TTl9BRERDKSwgRlVMTCAoYWRkYykgRkFTVCAoYWRkYykgfSwKKyAgeyBUWVBFIChJTlNOX0FERE4pLCBJRFggKElOU05fQURETiksIEZVTEwgKGFkZG4pIEZBU1QgKGFkZG4pIH0sCisgIHsgVFlQRSAoSU5TTl9BREROSSksIElEWCAoSU5TTl9BREROSSksIEZVTEwgKGFkZG5pKSBGQVNUIChhZGRuaSkgfSwKKyAgeyBUWVBFIChJTlNOX0FERE4yKSwgSURYIChJTlNOX0FERE4yKSwgRlVMTCAoYWRkbjIpIEZBU1QgKGFkZG4yKSB9LAorICB7IFRZUEUgKElOU05fU1VCKSwgSURYIChJTlNOX1NVQiksIEZVTEwgKHN1YikgRkFTVCAoc3ViKSB9LAorICB7IFRZUEUgKElOU05fU1VCQyksIElEWCAoSU5TTl9TVUJDKSwgRlVMTCAoc3ViYykgRkFTVCAoc3ViYykgfSwKKyAgeyBUWVBFIChJTlNOX1NVQk4pLCBJRFggKElOU05fU1VCTiksIEZVTEwgKHN1Ym4pIEZBU1QgKHN1Ym4pIH0sCisgIHsgVFlQRSAoSU5TTl9DTVApLCBJRFggKElOU05fQ01QKSwgRlVMTCAoY21wKSBGQVNUIChjbXApIH0sCisgIHsgVFlQRSAoSU5TTl9DTVBJKSwgSURYIChJTlNOX0NNUEkpLCBGVUxMIChjbXBpKSBGQVNUIChjbXBpKSB9LAorICB7IFRZUEUgKElOU05fQ01QMiksIElEWCAoSU5TTl9DTVAyKSwgRlVMTCAoY21wMikgRkFTVCAoY21wMikgfSwKKyAgeyBUWVBFIChJTlNOX0FORCksIElEWCAoSU5TTl9BTkQpLCBGVUxMIChhbmQpIEZBU1QgKGFuZCkgfSwKKyAgeyBUWVBFIChJTlNOX09SKSwgSURYIChJTlNOX09SKSwgRlVMTCAob3IpIEZBU1QgKG9yKSB9LAorICB7IFRZUEUgKElOU05fRU9SKSwgSURYIChJTlNOX0VPUiksIEZVTEwgKGVvcikgRkFTVCAoZW9yKSB9LAorICB7IFRZUEUgKElOU05fQU5ETSksIElEWCAoSU5TTl9BTkRNKSwgRlVMTCAoYW5kbSkgRkFTVCAoYW5kbSkgfSwKKyAgeyBUWVBFIChJTlNOX0FOREgpLCBJRFggKElOU05fQU5ESCksIEZVTEwgKGFuZGgpIEZBU1QgKGFuZGgpIH0sCisgIHsgVFlQRSAoSU5TTl9BTkRCKSwgSURYIChJTlNOX0FOREIpLCBGVUxMIChhbmRiKSBGQVNUIChhbmRiKSB9LAorICB7IFRZUEUgKElOU05fT1JNKSwgSURYIChJTlNOX09STSksIEZVTEwgKG9ybSkgRkFTVCAob3JtKSB9LAorICB7IFRZUEUgKElOU05fT1JIKSwgSURYIChJTlNOX09SSCksIEZVTEwgKG9yaCkgRkFTVCAob3JoKSB9LAorICB7IFRZUEUgKElOU05fT1JCKSwgSURYIChJTlNOX09SQiksIEZVTEwgKG9yYikgRkFTVCAob3JiKSB9LAorICB7IFRZUEUgKElOU05fRU9STSksIElEWCAoSU5TTl9FT1JNKSwgRlVMTCAoZW9ybSkgRkFTVCAoZW9ybSkgfSwKKyAgeyBUWVBFIChJTlNOX0VPUkgpLCBJRFggKElOU05fRU9SSCksIEZVTEwgKGVvcmgpIEZBU1QgKGVvcmgpIH0sCisgIHsgVFlQRSAoSU5TTl9FT1JCKSwgSURYIChJTlNOX0VPUkIpLCBGVUxMIChlb3JiKSBGQVNUIChlb3JiKSB9LAorICB7IFRZUEUgKElOU05fQkFOREwpLCBJRFggKElOU05fQkFOREwpLCBGVUxMIChiYW5kbCkgRkFTVCAoYmFuZGwpIH0sCisgIHsgVFlQRSAoSU5TTl9CT1JMKSwgSURYIChJTlNOX0JPUkwpLCBGVUxMIChib3JsKSBGQVNUIChib3JsKSB9LAorICB7IFRZUEUgKElOU05fQkVPUkwpLCBJRFggKElOU05fQkVPUkwpLCBGVUxMIChiZW9ybCkgRkFTVCAoYmVvcmwpIH0sCisgIHsgVFlQRSAoSU5TTl9CQU5ESCksIElEWCAoSU5TTl9CQU5ESCksIEZVTEwgKGJhbmRoKSBGQVNUIChiYW5kaCkgfSwKKyAgeyBUWVBFIChJTlNOX0JPUkgpLCBJRFggKElOU05fQk9SSCksIEZVTEwgKGJvcmgpIEZBU1QgKGJvcmgpIH0sCisgIHsgVFlQRSAoSU5TTl9CRU9SSCksIElEWCAoSU5TTl9CRU9SSCksIEZVTEwgKGJlb3JoKSBGQVNUIChiZW9yaCkgfSwKKyAgeyBUWVBFIChJTlNOX0JUU1RMKSwgSURYIChJTlNOX0JUU1RMKSwgRlVMTCAoYnRzdGwpIEZBU1QgKGJ0c3RsKSB9LAorICB7IFRZUEUgKElOU05fQlRTVEgpLCBJRFggKElOU05fQlRTVEgpLCBGVUxMIChidHN0aCkgRkFTVCAoYnRzdGgpIH0sCisgIHsgVFlQRSAoSU5TTl9NVUwpLCBJRFggKElOU05fTVVMKSwgRlVMTCAobXVsKSBGQVNUIChtdWwpIH0sCisgIHsgVFlQRSAoSU5TTl9NVUxVKSwgSURYIChJTlNOX01VTFUpLCBGVUxMIChtdWx1KSBGQVNUIChtdWx1KSB9LAorICB7IFRZUEUgKElOU05fTVVMSCksIElEWCAoSU5TTl9NVUxIKSwgRlVMTCAobXVsaCkgRkFTVCAobXVsaCkgfSwKKyAgeyBUWVBFIChJTlNOX01VTFVIKSwgSURYIChJTlNOX01VTFVIKSwgRlVMTCAobXVsdWgpIEZBU1QgKG11bHVoKSB9LAorICB7IFRZUEUgKElOU05fRElWMFMpLCBJRFggKElOU05fRElWMFMpLCBGVUxMIChkaXYwcykgRkFTVCAoZGl2MHMpIH0sCisgIHsgVFlQRSAoSU5TTl9ESVYwVSksIElEWCAoSU5TTl9ESVYwVSksIEZVTEwgKGRpdjB1KSBGQVNUIChkaXYwdSkgfSwKKyAgeyBUWVBFIChJTlNOX0RJVjEpLCBJRFggKElOU05fRElWMSksIEZVTEwgKGRpdjEpIEZBU1QgKGRpdjEpIH0sCisgIHsgVFlQRSAoSU5TTl9ESVYyKSwgSURYIChJTlNOX0RJVjIpLCBGVUxMIChkaXYyKSBGQVNUIChkaXYyKSB9LAorICB7IFRZUEUgKElOU05fRElWMyksIElEWCAoSU5TTl9ESVYzKSwgRlVMTCAoZGl2MykgRkFTVCAoZGl2MykgfSwKKyAgeyBUWVBFIChJTlNOX0RJVjRTKSwgSURYIChJTlNOX0RJVjRTKSwgRlVMTCAoZGl2NHMpIEZBU1QgKGRpdjRzKSB9LAorICB7IFRZUEUgKElOU05fTFNMKSwgSURYIChJTlNOX0xTTCksIEZVTEwgKGxzbCkgRkFTVCAobHNsKSB9LAorICB7IFRZUEUgKElOU05fTFNMSSksIElEWCAoSU5TTl9MU0xJKSwgRlVMTCAobHNsaSkgRkFTVCAobHNsaSkgfSwKKyAgeyBUWVBFIChJTlNOX0xTTDIpLCBJRFggKElOU05fTFNMMiksIEZVTEwgKGxzbDIpIEZBU1QgKGxzbDIpIH0sCisgIHsgVFlQRSAoSU5TTl9MU1IpLCBJRFggKElOU05fTFNSKSwgRlVMTCAobHNyKSBGQVNUIChsc3IpIH0sCisgIHsgVFlQRSAoSU5TTl9MU1JJKSwgSURYIChJTlNOX0xTUkkpLCBGVUxMIChsc3JpKSBGQVNUIChsc3JpKSB9LAorICB7IFRZUEUgKElOU05fTFNSMiksIElEWCAoSU5TTl9MU1IyKSwgRlVMTCAobHNyMikgRkFTVCAobHNyMikgfSwKKyAgeyBUWVBFIChJTlNOX0FTUiksIElEWCAoSU5TTl9BU1IpLCBGVUxMIChhc3IpIEZBU1QgKGFzcikgfSwKKyAgeyBUWVBFIChJTlNOX0FTUkkpLCBJRFggKElOU05fQVNSSSksIEZVTEwgKGFzcmkpIEZBU1QgKGFzcmkpIH0sCisgIHsgVFlQRSAoSU5TTl9BU1IyKSwgSURYIChJTlNOX0FTUjIpLCBGVUxMIChhc3IyKSBGQVNUIChhc3IyKSB9LAorICB7IFRZUEUgKElOU05fTERJOCksIElEWCAoSU5TTl9MREk4KSwgRlVMTCAobGRpOCkgRkFTVCAobGRpOCkgfSwKKyAgeyBUWVBFIChJTlNOX0xESTIwKSwgSURYIChJTlNOX0xESTIwKSwgRlVMTCAobGRpMjApIEZBU1QgKGxkaTIwKSB9LAorICB7IFRZUEUgKElOU05fTERJMzIpLCBJRFggKElOU05fTERJMzIpLCBGVUxMIChsZGkzMikgRkFTVCAobGRpMzIpIH0sCisgIHsgVFlQRSAoSU5TTl9MRCksIElEWCAoSU5TTl9MRCksIEZVTEwgKGxkKSBGQVNUIChsZCkgfSwKKyAgeyBUWVBFIChJTlNOX0xEVUgpLCBJRFggKElOU05fTERVSCksIEZVTEwgKGxkdWgpIEZBU1QgKGxkdWgpIH0sCisgIHsgVFlQRSAoSU5TTl9MRFVCKSwgSURYIChJTlNOX0xEVUIpLCBGVUxMIChsZHViKSBGQVNUIChsZHViKSB9LAorICB7IFRZUEUgKElOU05fTERSMTMpLCBJRFggKElOU05fTERSMTMpLCBGVUxMIChsZHIxMykgRkFTVCAobGRyMTMpIH0sCisgIHsgVFlQRSAoSU5TTl9MRFIxM1VIKSwgSURYIChJTlNOX0xEUjEzVUgpLCBGVUxMIChsZHIxM3VoKSBGQVNUIChsZHIxM3VoKSB9LAorICB7IFRZUEUgKElOU05fTERSMTNVQiksIElEWCAoSU5TTl9MRFIxM1VCKSwgRlVMTCAobGRyMTN1YikgRkFTVCAobGRyMTN1YikgfSwKKyAgeyBUWVBFIChJTlNOX0xEUjE0KSwgSURYIChJTlNOX0xEUjE0KSwgRlVMTCAobGRyMTQpIEZBU1QgKGxkcjE0KSB9LAorICB7IFRZUEUgKElOU05fTERSMTRVSCksIElEWCAoSU5TTl9MRFIxNFVIKSwgRlVMTCAobGRyMTR1aCkgRkFTVCAobGRyMTR1aCkgfSwKKyAgeyBUWVBFIChJTlNOX0xEUjE0VUIpLCBJRFggKElOU05fTERSMTRVQiksIEZVTEwgKGxkcjE0dWIpIEZBU1QgKGxkcjE0dWIpIH0sCisgIHsgVFlQRSAoSU5TTl9MRFIxNSksIElEWCAoSU5TTl9MRFIxNSksIEZVTEwgKGxkcjE1KSBGQVNUIChsZHIxNSkgfSwKKyAgeyBUWVBFIChJTlNOX0xEUjE1R1IpLCBJRFggKElOU05fTERSMTVHUiksIEZVTEwgKGxkcjE1Z3IpIEZBU1QgKGxkcjE1Z3IpIH0sCisgIHsgVFlQRSAoSU5TTl9MRFIxNURSKSwgSURYIChJTlNOX0xEUjE1RFIpLCBGVUxMIChsZHIxNWRyKSBGQVNUIChsZHIxNWRyKSB9LAorICB7IFRZUEUgKElOU05fTERSMTVQUyksIElEWCAoSU5TTl9MRFIxNVBTKSwgRlVMTCAobGRyMTVwcykgRkFTVCAobGRyMTVwcykgfSwKKyAgeyBUWVBFIChJTlNOX1NUKSwgSURYIChJTlNOX1NUKSwgRlVMTCAoc3QpIEZBU1QgKHN0KSB9LAorICB7IFRZUEUgKElOU05fU1RIKSwgSURYIChJTlNOX1NUSCksIEZVTEwgKHN0aCkgRkFTVCAoc3RoKSB9LAorICB7IFRZUEUgKElOU05fU1RCKSwgSURYIChJTlNOX1NUQiksIEZVTEwgKHN0YikgRkFTVCAoc3RiKSB9LAorICB7IFRZUEUgKElOU05fU1RSMTMpLCBJRFggKElOU05fU1RSMTMpLCBGVUxMIChzdHIxMykgRkFTVCAoc3RyMTMpIH0sCisgIHsgVFlQRSAoSU5TTl9TVFIxM0gpLCBJRFggKElOU05fU1RSMTNIKSwgRlVMTCAoc3RyMTNoKSBGQVNUIChzdHIxM2gpIH0sCisgIHsgVFlQRSAoSU5TTl9TVFIxM0IpLCBJRFggKElOU05fU1RSMTNCKSwgRlVMTCAoc3RyMTNiKSBGQVNUIChzdHIxM2IpIH0sCisgIHsgVFlQRSAoSU5TTl9TVFIxNCksIElEWCAoSU5TTl9TVFIxNCksIEZVTEwgKHN0cjE0KSBGQVNUIChzdHIxNCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUUjE0SCksIElEWCAoSU5TTl9TVFIxNEgpLCBGVUxMIChzdHIxNGgpIEZBU1QgKHN0cjE0aCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUUjE0QiksIElEWCAoSU5TTl9TVFIxNEIpLCBGVUxMIChzdHIxNGIpIEZBU1QgKHN0cjE0YikgfSwKKyAgeyBUWVBFIChJTlNOX1NUUjE1KSwgSURYIChJTlNOX1NUUjE1KSwgRlVMTCAoc3RyMTUpIEZBU1QgKHN0cjE1KSB9LAorICB7IFRZUEUgKElOU05fU1RSMTVHUiksIElEWCAoSU5TTl9TVFIxNUdSKSwgRlVMTCAoc3RyMTVncikgRkFTVCAoc3RyMTVncikgfSwKKyAgeyBUWVBFIChJTlNOX1NUUjE1RFIpLCBJRFggKElOU05fU1RSMTVEUiksIEZVTEwgKHN0cjE1ZHIpIEZBU1QgKHN0cjE1ZHIpIH0sCisgIHsgVFlQRSAoSU5TTl9TVFIxNVBTKSwgSURYIChJTlNOX1NUUjE1UFMpLCBGVUxMIChzdHIxNXBzKSBGQVNUIChzdHIxNXBzKSB9LAorICB7IFRZUEUgKElOU05fTU9WKSwgSURYIChJTlNOX01PViksIEZVTEwgKG1vdikgRkFTVCAobW92KSB9LAorICB7IFRZUEUgKElOU05fTU9WRFIpLCBJRFggKElOU05fTU9WRFIpLCBGVUxMIChtb3ZkcikgRkFTVCAobW92ZHIpIH0sCisgIHsgVFlQRSAoSU5TTl9NT1ZQUyksIElEWCAoSU5TTl9NT1ZQUyksIEZVTEwgKG1vdnBzKSBGQVNUIChtb3ZwcykgfSwKKyAgeyBUWVBFIChJTlNOX01PVjJEUiksIElEWCAoSU5TTl9NT1YyRFIpLCBGVUxMIChtb3YyZHIpIEZBU1QgKG1vdjJkcikgfSwKKyAgeyBUWVBFIChJTlNOX01PVjJQUyksIElEWCAoSU5TTl9NT1YyUFMpLCBGVUxMIChtb3YycHMpIEZBU1QgKG1vdjJwcykgfSwKKyAgeyBUWVBFIChJTlNOX0pNUCksIElEWCAoSU5TTl9KTVApLCBGVUxMIChqbXApIEZBU1QgKGptcCkgfSwKKyAgeyBUWVBFIChJTlNOX0pNUEQpLCBJRFggKElOU05fSk1QRCksIEZVTEwgKGptcGQpIEZBU1QgKGptcGQpIH0sCisgIHsgVFlQRSAoSU5TTl9DQUxMUiksIElEWCAoSU5TTl9DQUxMUiksIEZVTEwgKGNhbGxyKSBGQVNUIChjYWxscikgfSwKKyAgeyBUWVBFIChJTlNOX0NBTExSRCksIElEWCAoSU5TTl9DQUxMUkQpLCBGVUxMIChjYWxscmQpIEZBU1QgKGNhbGxyZCkgfSwKKyAgeyBUWVBFIChJTlNOX0NBTEwpLCBJRFggKElOU05fQ0FMTCksIEZVTEwgKGNhbGwpIEZBU1QgKGNhbGwpIH0sCisgIHsgVFlQRSAoSU5TTl9DQUxMRCksIElEWCAoSU5TTl9DQUxMRCksIEZVTEwgKGNhbGxkKSBGQVNUIChjYWxsZCkgfSwKKyAgeyBUWVBFIChJTlNOX1JFVCksIElEWCAoSU5TTl9SRVQpLCBGVUxMIChyZXQpIEZBU1QgKHJldCkgfSwKKyAgeyBUWVBFIChJTlNOX1JFVF9EKSwgSURYIChJTlNOX1JFVF9EKSwgRlVMTCAocmV0X2QpIEZBU1QgKHJldF9kKSB9LAorICB7IFRZUEUgKElOU05fSU5UKSwgSURYIChJTlNOX0lOVCksIEZVTEwgKGludCkgRkFTVCAoaW50KSB9LAorICB7IFRZUEUgKElOU05fSU5URSksIElEWCAoSU5TTl9JTlRFKSwgRlVMTCAoaW50ZSkgRkFTVCAoaW50ZSkgfSwKKyAgeyBUWVBFIChJTlNOX1JFVEkpLCBJRFggKElOU05fUkVUSSksIEZVTEwgKHJldGkpIEZBU1QgKHJldGkpIH0sCisgIHsgVFlQRSAoSU5TTl9CUkFEKSwgSURYIChJTlNOX0JSQUQpLCBGVUxMIChicmFkKSBGQVNUIChicmFkKSB9LAorICB7IFRZUEUgKElOU05fQlJBKSwgSURYIChJTlNOX0JSQSksIEZVTEwgKGJyYSkgRkFTVCAoYnJhKSB9LAorICB7IFRZUEUgKElOU05fQk5PRCksIElEWCAoSU5TTl9CTk9EKSwgRlVMTCAoYm5vZCkgRkFTVCAoYm5vZCkgfSwKKyAgeyBUWVBFIChJTlNOX0JOTyksIElEWCAoSU5TTl9CTk8pLCBGVUxMIChibm8pIEZBU1QgKGJubykgfSwKKyAgeyBUWVBFIChJTlNOX0JFUUQpLCBJRFggKElOU05fQkVRRCksIEZVTEwgKGJlcWQpIEZBU1QgKGJlcWQpIH0sCisgIHsgVFlQRSAoSU5TTl9CRVEpLCBJRFggKElOU05fQkVRKSwgRlVMTCAoYmVxKSBGQVNUIChiZXEpIH0sCisgIHsgVFlQRSAoSU5TTl9CTkVEKSwgSURYIChJTlNOX0JORUQpLCBGVUxMIChibmVkKSBGQVNUIChibmVkKSB9LAorICB7IFRZUEUgKElOU05fQk5FKSwgSURYIChJTlNOX0JORSksIEZVTEwgKGJuZSkgRkFTVCAoYm5lKSB9LAorICB7IFRZUEUgKElOU05fQkNEKSwgSURYIChJTlNOX0JDRCksIEZVTEwgKGJjZCkgRkFTVCAoYmNkKSB9LAorICB7IFRZUEUgKElOU05fQkMpLCBJRFggKElOU05fQkMpLCBGVUxMIChiYykgRkFTVCAoYmMpIH0sCisgIHsgVFlQRSAoSU5TTl9CTkNEKSwgSURYIChJTlNOX0JOQ0QpLCBGVUxMIChibmNkKSBGQVNUIChibmNkKSB9LAorICB7IFRZUEUgKElOU05fQk5DKSwgSURYIChJTlNOX0JOQyksIEZVTEwgKGJuYykgRkFTVCAoYm5jKSB9LAorICB7IFRZUEUgKElOU05fQk5EKSwgSURYIChJTlNOX0JORCksIEZVTEwgKGJuZCkgRkFTVCAoYm5kKSB9LAorICB7IFRZUEUgKElOU05fQk4pLCBJRFggKElOU05fQk4pLCBGVUxMIChibikgRkFTVCAoYm4pIH0sCisgIHsgVFlQRSAoSU5TTl9CUEQpLCBJRFggKElOU05fQlBEKSwgRlVMTCAoYnBkKSBGQVNUIChicGQpIH0sCisgIHsgVFlQRSAoSU5TTl9CUCksIElEWCAoSU5TTl9CUCksIEZVTEwgKGJwKSBGQVNUIChicCkgfSwKKyAgeyBUWVBFIChJTlNOX0JWRCksIElEWCAoSU5TTl9CVkQpLCBGVUxMIChidmQpIEZBU1QgKGJ2ZCkgfSwKKyAgeyBUWVBFIChJTlNOX0JWKSwgSURYIChJTlNOX0JWKSwgRlVMTCAoYnYpIEZBU1QgKGJ2KSB9LAorICB7IFRZUEUgKElOU05fQk5WRCksIElEWCAoSU5TTl9CTlZEKSwgRlVMTCAoYm52ZCkgRkFTVCAoYm52ZCkgfSwKKyAgeyBUWVBFIChJTlNOX0JOViksIElEWCAoSU5TTl9CTlYpLCBGVUxMIChibnYpIEZBU1QgKGJudikgfSwKKyAgeyBUWVBFIChJTlNOX0JMVEQpLCBJRFggKElOU05fQkxURCksIEZVTEwgKGJsdGQpIEZBU1QgKGJsdGQpIH0sCisgIHsgVFlQRSAoSU5TTl9CTFQpLCBJRFggKElOU05fQkxUKSwgRlVMTCAoYmx0KSBGQVNUIChibHQpIH0sCisgIHsgVFlQRSAoSU5TTl9CR0VEKSwgSURYIChJTlNOX0JHRUQpLCBGVUxMIChiZ2VkKSBGQVNUIChiZ2VkKSB9LAorICB7IFRZUEUgKElOU05fQkdFKSwgSURYIChJTlNOX0JHRSksIEZVTEwgKGJnZSkgRkFTVCAoYmdlKSB9LAorICB7IFRZUEUgKElOU05fQkxFRCksIElEWCAoSU5TTl9CTEVEKSwgRlVMTCAoYmxlZCkgRkFTVCAoYmxlZCkgfSwKKyAgeyBUWVBFIChJTlNOX0JMRSksIElEWCAoSU5TTl9CTEUpLCBGVUxMIChibGUpIEZBU1QgKGJsZSkgfSwKKyAgeyBUWVBFIChJTlNOX0JHVEQpLCBJRFggKElOU05fQkdURCksIEZVTEwgKGJndGQpIEZBU1QgKGJndGQpIH0sCisgIHsgVFlQRSAoSU5TTl9CR1QpLCBJRFggKElOU05fQkdUKSwgRlVMTCAoYmd0KSBGQVNUIChiZ3QpIH0sCisgIHsgVFlQRSAoSU5TTl9CTFNEKSwgSURYIChJTlNOX0JMU0QpLCBGVUxMIChibHNkKSBGQVNUIChibHNkKSB9LAorICB7IFRZUEUgKElOU05fQkxTKSwgSURYIChJTlNOX0JMUyksIEZVTEwgKGJscykgRkFTVCAoYmxzKSB9LAorICB7IFRZUEUgKElOU05fQkhJRCksIElEWCAoSU5TTl9CSElEKSwgRlVMTCAoYmhpZCkgRkFTVCAoYmhpZCkgfSwKKyAgeyBUWVBFIChJTlNOX0JISSksIElEWCAoSU5TTl9CSEkpLCBGVUxMIChiaGkpIEZBU1QgKGJoaSkgfSwKKyAgeyBUWVBFIChJTlNOX0RNT1ZSMTMpLCBJRFggKElOU05fRE1PVlIxMyksIEZVTEwgKGRtb3ZyMTMpIEZBU1QgKGRtb3ZyMTMpIH0sCisgIHsgVFlQRSAoSU5TTl9ETU9WUjEzSCksIElEWCAoSU5TTl9ETU9WUjEzSCksIEZVTEwgKGRtb3ZyMTNoKSBGQVNUIChkbW92cjEzaCkgfSwKKyAgeyBUWVBFIChJTlNOX0RNT1ZSMTNCKSwgSURYIChJTlNOX0RNT1ZSMTNCKSwgRlVMTCAoZG1vdnIxM2IpIEZBU1QgKGRtb3ZyMTNiKSB9LAorICB7IFRZUEUgKElOU05fRE1PVlIxM1BJKSwgSURYIChJTlNOX0RNT1ZSMTNQSSksIEZVTEwgKGRtb3ZyMTNwaSkgRkFTVCAoZG1vdnIxM3BpKSB9LAorICB7IFRZUEUgKElOU05fRE1PVlIxM1BJSCksIElEWCAoSU5TTl9ETU9WUjEzUElIKSwgRlVMTCAoZG1vdnIxM3BpaCkgRkFTVCAoZG1vdnIxM3BpaCkgfSwKKyAgeyBUWVBFIChJTlNOX0RNT1ZSMTNQSUIpLCBJRFggKElOU05fRE1PVlIxM1BJQiksIEZVTEwgKGRtb3ZyMTNwaWIpIEZBU1QgKGRtb3ZyMTNwaWIpIH0sCisgIHsgVFlQRSAoSU5TTl9ETU9WUjE1UEkpLCBJRFggKElOU05fRE1PVlIxNVBJKSwgRlVMTCAoZG1vdnIxNXBpKSBGQVNUIChkbW92cjE1cGkpIH0sCisgIHsgVFlQRSAoSU5TTl9ETU9WMlIxMyksIElEWCAoSU5TTl9ETU9WMlIxMyksIEZVTEwgKGRtb3YycjEzKSBGQVNUIChkbW92MnIxMykgfSwKKyAgeyBUWVBFIChJTlNOX0RNT1YyUjEzSCksIElEWCAoSU5TTl9ETU9WMlIxM0gpLCBGVUxMIChkbW92MnIxM2gpIEZBU1QgKGRtb3YycjEzaCkgfSwKKyAgeyBUWVBFIChJTlNOX0RNT1YyUjEzQiksIElEWCAoSU5TTl9ETU9WMlIxM0IpLCBGVUxMIChkbW92MnIxM2IpIEZBU1QgKGRtb3YycjEzYikgfSwKKyAgeyBUWVBFIChJTlNOX0RNT1YyUjEzUEkpLCBJRFggKElOU05fRE1PVjJSMTNQSSksIEZVTEwgKGRtb3YycjEzcGkpIEZBU1QgKGRtb3YycjEzcGkpIH0sCisgIHsgVFlQRSAoSU5TTl9ETU9WMlIxM1BJSCksIElEWCAoSU5TTl9ETU9WMlIxM1BJSCksIEZVTEwgKGRtb3YycjEzcGloKSBGQVNUIChkbW92MnIxM3BpaCkgfSwKKyAgeyBUWVBFIChJTlNOX0RNT1YyUjEzUElCKSwgSURYIChJTlNOX0RNT1YyUjEzUElCKSwgRlVMTCAoZG1vdjJyMTNwaWIpIEZBU1QgKGRtb3YycjEzcGliKSB9LAorICB7IFRZUEUgKElOU05fRE1PVjJSMTVQRCksIElEWCAoSU5TTl9ETU9WMlIxNVBEKSwgRlVMTCAoZG1vdjJyMTVwZCkgRkFTVCAoZG1vdjJyMTVwZCkgfSwKKyAgeyBUWVBFIChJTlNOX0xEUkVTKSwgSURYIChJTlNOX0xEUkVTKSwgRlVMTCAobGRyZXMpIEZBU1QgKGxkcmVzKSB9LAorICB7IFRZUEUgKElOU05fU1RSRVMpLCBJRFggKElOU05fU1RSRVMpLCBGVUxMIChzdHJlcykgRkFTVCAoc3RyZXMpIH0sCisgIHsgVFlQRSAoSU5TTl9DT1BPUCksIElEWCAoSU5TTl9DT1BPUCksIEZVTEwgKGNvcG9wKSBGQVNUIChjb3BvcCkgfSwKKyAgeyBUWVBFIChJTlNOX0NPUExEKSwgSURYIChJTlNOX0NPUExEKSwgRlVMTCAoY29wbGQpIEZBU1QgKGNvcGxkKSB9LAorICB7IFRZUEUgKElOU05fQ09QU1QpLCBJRFggKElOU05fQ09QU1QpLCBGVUxMIChjb3BzdCkgRkFTVCAoY29wc3QpIH0sCisgIHsgVFlQRSAoSU5TTl9DT1BTViksIElEWCAoSU5TTl9DT1BTViksIEZVTEwgKGNvcHN2KSBGQVNUIChjb3BzdikgfSwKKyAgeyBUWVBFIChJTlNOX05PUCksIElEWCAoSU5TTl9OT1ApLCBGVUxMIChub3ApIEZBU1QgKG5vcCkgfSwKKyAgeyBUWVBFIChJTlNOX0FORENDUiksIElEWCAoSU5TTl9BTkRDQ1IpLCBGVUxMIChhbmRjY3IpIEZBU1QgKGFuZGNjcikgfSwKKyAgeyBUWVBFIChJTlNOX09SQ0NSKSwgSURYIChJTlNOX09SQ0NSKSwgRlVMTCAob3JjY3IpIEZBU1QgKG9yY2NyKSB9LAorICB7IFRZUEUgKElOU05fU1RJTE0pLCBJRFggKElOU05fU1RJTE0pLCBGVUxMIChzdGlsbSkgRkFTVCAoc3RpbG0pIH0sCisgIHsgVFlQRSAoSU5TTl9BRERTUCksIElEWCAoSU5TTl9BRERTUCksIEZVTEwgKGFkZHNwKSBGQVNUIChhZGRzcCkgfSwKKyAgeyBUWVBFIChJTlNOX0VYVFNCKSwgSURYIChJTlNOX0VYVFNCKSwgRlVMTCAoZXh0c2IpIEZBU1QgKGV4dHNiKSB9LAorICB7IFRZUEUgKElOU05fRVhUVUIpLCBJRFggKElOU05fRVhUVUIpLCBGVUxMIChleHR1YikgRkFTVCAoZXh0dWIpIH0sCisgIHsgVFlQRSAoSU5TTl9FWFRTSCksIElEWCAoSU5TTl9FWFRTSCksIEZVTEwgKGV4dHNoKSBGQVNUIChleHRzaCkgfSwKKyAgeyBUWVBFIChJTlNOX0VYVFVIKSwgSURYIChJTlNOX0VYVFVIKSwgRlVMTCAoZXh0dWgpIEZBU1QgKGV4dHVoKSB9LAorICB7IFRZUEUgKElOU05fTERNMCksIElEWCAoSU5TTl9MRE0wKSwgRlVMTCAobGRtMCkgRkFTVCAobGRtMCkgfSwKKyAgeyBUWVBFIChJTlNOX0xETTEpLCBJRFggKElOU05fTERNMSksIEZVTEwgKGxkbTEpIEZBU1QgKGxkbTEpIH0sCisgIHsgVFlQRSAoSU5TTl9TVE0wKSwgSURYIChJTlNOX1NUTTApLCBGVUxMIChzdG0wKSBGQVNUIChzdG0wKSB9LAorICB7IFRZUEUgKElOU05fU1RNMSksIElEWCAoSU5TTl9TVE0xKSwgRlVMTCAoc3RtMSkgRkFTVCAoc3RtMSkgfSwKKyAgeyBUWVBFIChJTlNOX0VOVEVSKSwgSURYIChJTlNOX0VOVEVSKSwgRlVMTCAoZW50ZXIpIEZBU1QgKGVudGVyKSB9LAorICB7IFRZUEUgKElOU05fTEVBVkUpLCBJRFggKElOU05fTEVBVkUpLCBGVUxMIChsZWF2ZSkgRkFTVCAobGVhdmUpIH0sCisgIHsgVFlQRSAoSU5TTl9YQ0hCKSwgSURYIChJTlNOX1hDSEIpLCBGVUxMICh4Y2hiKSBGQVNUICh4Y2hiKSB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbnNuX3NlbSBmcjMwYmZfaW5zbl9zZW1faW52YWxpZCA9Cit7CisgIFZJUlRVQUxfSU5TTl9YX0lOVkFMSUQsIElEWCAoSU5TTl9YX0lOVkFMSUQpLCBGVUxMICh4X2ludmFsaWQpIEZBU1QgKHhfaW52YWxpZCkKK307CisKKyN1bmRlZiBJRFgKKyN1bmRlZiBUWVBFCisKKy8qIEluaXRpYWxpemUgYW4gSURFU0MgZnJvbSB0aGUgY29tcGlsZS10aW1lIGNvbXB1dGFibGUgcGFydHMuICAqLworCitzdGF0aWMgSU5MSU5FIHZvaWQKK2luaXRfaWRlc2MgKFNJTV9DUFUgKmNwdSwgSURFU0MgKmlkLCBjb25zdCBzdHJ1Y3QgaW5zbl9zZW0gKnQpCit7CisgIGNvbnN0IENHRU5fSU5TTiAqaW5zbl90YWJsZSA9IENHRU5fQ1BVX0lOU05fVEFCTEUgKENQVV9DUFVfREVTQyAoY3B1KSktPmluaXRfZW50cmllczsKKworICBpZC0+bnVtID0gdC0+aW5kZXg7CisgIGlmICgoaW50KSB0LT50eXBlIDw9IDApCisgICAgaWQtPmlkYXRhID0gJiBjZ2VuX3ZpcnR1YWxfaW5zbl90YWJsZVstIChpbnQpIHQtPnR5cGVdOworICBlbHNlCisgICAgaWQtPmlkYXRhID0gJiBpbnNuX3RhYmxlW3QtPnR5cGVdOworICBpZC0+YXR0cnMgPSBDR0VOX0lOU05fQVRUUlMgKGlkLT5pZGF0YSk7CisgIC8qIE9oIG15IGdvZCwgYSBtYWdpYyBudW1iZXIuICAqLworICBpZC0+bGVuZ3RoID0gQ0dFTl9JTlNOX0JJVFNJWkUgKGlkLT5pZGF0YSkgLyA4OworI2lmICEgV0lUSF9TRU1fU1dJVENIX0ZVTEwKKyAgaWQtPnNlbV9mdWxsID0gdC0+c2VtX2Z1bGw7CisjZW5kaWYKKyNpZiBXSVRIX0ZBU1QgJiYgISBXSVRIX1NFTV9TV0lUQ0hfRkFTVAorICBpZC0+c2VtX2Zhc3QgPSB0LT5zZW1fZmFzdDsKKyNlbmRpZgorI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIGlkLT50aW1pbmcgPSAmIE1PREVMX1RJTUlORyAoQ1BVX01PREVMIChjcHUpKSBbdC0+aW5kZXhdOworICB7CisgICAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7CisgICAgU0lNX0FTU0VSVCAodC0+aW5kZXggPT0gaWQtPnRpbWluZy0+bnVtKTsKKyAgfQorI2VuZGlmCit9CisKKy8qIEluaXRpYWxpemUgdGhlIGluc3RydWN0aW9uIGRlc2NyaXB0b3IgdGFibGUuICAqLworCit2b2lkCitmcjMwYmZfaW5pdF9pZGVzY190YWJsZSAoU0lNX0NQVSAqY3B1KQoreworICBJREVTQyAqaWQsKnRhYmVuZDsKKyAgY29uc3Qgc3RydWN0IGluc25fc2VtICp0LCp0ZW5kOworICBpbnQgdGFic2l6ZSA9IEZSMzBCRl9JTlNOX01BWDsKKyAgSURFU0MgKnRhYmxlID0gZnIzMGJmX2luc25fZGF0YTsKKworICBtZW1zZXQgKHRhYmxlLCAwLCB0YWJzaXplICogc2l6ZW9mIChJREVTQykpOworCisgIC8qIEZpcnN0IHNldCBhbGwgZW50cmllcyB0byB0aGUgYGludmFsaWQgaW5zbicuICAqLworICB0ID0gJiBmcjMwYmZfaW5zbl9zZW1faW52YWxpZDsKKyAgZm9yIChpZCA9IHRhYmxlLCB0YWJlbmQgPSB0YWJsZSArIHRhYnNpemU7IGlkIDwgdGFiZW5kOyArK2lkKQorICAgIGluaXRfaWRlc2MgKGNwdSwgaWQsIHQpOworCisgIC8qIE5vdyBmaWxsIGluIHRoZSB2YWx1ZXMgZm9yIHRoZSBjaG9zZW4gY3B1LiAgKi8KKyAgZm9yICh0ID0gZnIzMGJmX2luc25fc2VtLCB0ZW5kID0gdCArIHNpemVvZiAoZnIzMGJmX2luc25fc2VtKSAvIHNpemVvZiAoKnQpOworICAgICAgIHQgIT0gdGVuZDsgKyt0KQorICAgIHsKKyAgICAgIGluaXRfaWRlc2MgKGNwdSwgJiB0YWJsZVt0LT5pbmRleF0sIHQpOworICAgIH0KKworICAvKiBMaW5rIHRoZSBJREVTQyB0YWJsZSBpbnRvIHRoZSBjcHUuICAqLworICBDUFVfSURFU0MgKGNwdSkgPSB0YWJsZTsKK30KKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgYWxsIGluc3RydWN0aW9uIHNlbWFudGljIGZvcm1hdHMuICAqLwordHlwZWRlZiBlbnVtIHNmbXQgeworICBGTVRfRU1QVFksIEZNVF9BREQsIEZNVF9BRERJLCBGTVRfQUREMgorICwgRk1UX0FEREMsIEZNVF9BREROLCBGTVRfQURETkksIEZNVF9BREROMgorICwgRk1UX0NNUCwgRk1UX0NNUEksIEZNVF9DTVAyLCBGTVRfQU5ECisgLCBGTVRfQU5ETSwgRk1UX0FOREgsIEZNVF9BTkRCLCBGTVRfQkFOREwKKyAsIEZNVF9CVFNUTCwgRk1UX01VTCwgRk1UX01VTFUsIEZNVF9NVUxICisgLCBGTVRfRElWMFMsIEZNVF9ESVYwVSwgRk1UX0RJVjEsIEZNVF9ESVYyCisgLCBGTVRfRElWMywgRk1UX0RJVjRTLCBGTVRfTFNMLCBGTVRfTFNMSQorICwgRk1UX0xESTgsIEZNVF9MREkyMCwgRk1UX0xESTMyLCBGTVRfTEQKKyAsIEZNVF9MRFVILCBGTVRfTERVQiwgRk1UX0xEUjEzLCBGTVRfTERSMTNVSAorICwgRk1UX0xEUjEzVUIsIEZNVF9MRFIxNCwgRk1UX0xEUjE0VUgsIEZNVF9MRFIxNFVCCisgLCBGTVRfTERSMTUsIEZNVF9MRFIxNUdSLCBGTVRfTERSMTVEUiwgRk1UX0xEUjE1UFMKKyAsIEZNVF9TVCwgRk1UX1NUSCwgRk1UX1NUQiwgRk1UX1NUUjEzCisgLCBGTVRfU1RSMTNILCBGTVRfU1RSMTNCLCBGTVRfU1RSMTQsIEZNVF9TVFIxNEgKKyAsIEZNVF9TVFIxNEIsIEZNVF9TVFIxNSwgRk1UX1NUUjE1R1IsIEZNVF9TVFIxNURSCisgLCBGTVRfU1RSMTVQUywgRk1UX01PViwgRk1UX01PVkRSLCBGTVRfTU9WUFMKKyAsIEZNVF9NT1YyRFIsIEZNVF9NT1YyUFMsIEZNVF9KTVAsIEZNVF9DQUxMUgorICwgRk1UX0NBTEwsIEZNVF9SRVQsIEZNVF9JTlQsIEZNVF9JTlRFCisgLCBGTVRfUkVUSSwgRk1UX0JSQUQsIEZNVF9CTk9ELCBGTVRfQkVRRAorICwgRk1UX0JDRCwgRk1UX0JORCwgRk1UX0JWRCwgRk1UX0JMVEQKKyAsIEZNVF9CTEVELCBGTVRfQkxTRCwgRk1UX0RNT1ZSMTMsIEZNVF9ETU9WUjEzSAorICwgRk1UX0RNT1ZSMTNCLCBGTVRfRE1PVlIxM1BJLCBGTVRfRE1PVlIxM1BJSCwgRk1UX0RNT1ZSMTNQSUIKKyAsIEZNVF9ETU9WUjE1UEksIEZNVF9ETU9WMlIxMywgRk1UX0RNT1YyUjEzSCwgRk1UX0RNT1YyUjEzQgorICwgRk1UX0RNT1YyUjEzUEksIEZNVF9ETU9WMlIxM1BJSCwgRk1UX0RNT1YyUjEzUElCLCBGTVRfRE1PVjJSMTVQRAorICwgRk1UX0xEUkVTLCBGTVRfQ09QT1AsIEZNVF9DT1BMRCwgRk1UX0NPUFNUCisgLCBGTVRfTk9QLCBGTVRfQU5EQ0NSLCBGTVRfU1RJTE0sIEZNVF9BRERTUAorICwgRk1UX0VYVFNCLCBGTVRfRVhUVUIsIEZNVF9FWFRTSCwgRk1UX0VYVFVICisgLCBGTVRfTERNMCwgRk1UX0xETTEsIEZNVF9TVE0wLCBGTVRfU1RNMQorICwgRk1UX0VOVEVSLCBGTVRfTEVBVkUsIEZNVF9YQ0hCCit9IFNGTVQ7CisKKy8qIFRoZSBkZWNvZGVyIHVzZXMgdGhpcyB0byByZWNvcmQgaW5zbnMgYW5kIGRpcmVjdCBleHRyYWN0aW9uIGhhbmRsaW5nLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBJREVTQyAqaWRlc2M7CisjaWZkZWYgX19HTlVDX18KKyAgdm9pZCAqc2ZtdDsKKyNlbHNlCisgIGVudW0gc2ZtdCBzZm10OworI2VuZGlmCit9IERFQ09ERV9ERVNDOworCisvKiBNYWNybyB0byBnbyBmcm9tIGRlY29kZSBwaGFzZSB0byBleHRyYWN0aW9uIHBoYXNlLiAgKi8KKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIEdPVE9fRVhUUkFDVChpZCkgZ290byAqKGlkKS0+c2ZtdAorI2Vsc2UKKyNkZWZpbmUgR09UT19FWFRSQUNUKGlkKSBnb3RvIGV4dHJhY3QKKyNlbmRpZgorCisvKiBUaGUgZGVjb2RlciBuZWVkcyBhIHNsaWdodGx5IGRpZmZlcmVudCBjb21wdXRlZCBnb3RvIHN3aXRjaCBjb250cm9sLiAgKi8KKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBERUNPREVfU1dJVENIKE4sIFgpIGdvdG8gKmxhYmVsc18jI05bWF07CisjZWxzZQorI2RlZmluZSBERUNPREVfU1dJVENIKE4sIFgpIHN3aXRjaCAoWCkKKyNlbmRpZgorCisvKiBHaXZlbiBhbiBpbnN0cnVjdGlvbiwgcmV0dXJuIGEgcG9pbnRlciB0byBpdHMgSURFU0MgZW50cnkuICAqLworCitjb25zdCBJREVTQyAqCitmcjMwYmZfZGVjb2RlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgSUFERFIgcGMsCisgICAgICAgICAgICAgIENHRU5fSU5TTl9JTlQgYmFzZV9pbnNuLAorICAgICAgICAgICAgICBBUkdCVUYgKmFidWYpCit7CisgIC8qIFJlc3VsdCBvZiBkZWNvZGVyLCB1c2VkIGJ5IGV4dHJhY3Rvci4gICovCisgIGNvbnN0IERFQ09ERV9ERVNDICppZGVjb2RlOworCisgIC8qIEZpcnN0IGRlY29kZSB0aGUgaW5zdHJ1Y3Rpb24uICAqLworCisgIHsKKyNkZWZpbmUgSShpbnNuKSAmIGZyMzBiZl9pbnNuX2RhdGFbQ09OQ0FUMiAoRlIzMEJGXyxpbnNuKV0KKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBFKGZtdCkgJiYgY2FzZV9leF8jI2ZtdAorI2Vsc2UKKyNkZWZpbmUgRShmbXQpIGZtdAorI2VuZGlmCisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpZGVjb2RlX2ludmFsaWQgPSB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9OworCisgICAgeworI2lmZGVmIF9fR05VQ19fCisgICAgICBzdGF0aWMgY29uc3Qgdm9pZCAqbGFiZWxzXzBbMjU2XSA9IHsKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgY2FzZV8wXzcsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBjYXNlXzBfMjMsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBjYXNlXzBfMTUxLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgY2FzZV8wXzE1OSwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICB9OworI2VuZGlmCisgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMjU2XSA9IHsKKyAgICAgICAgeyBJIChJTlNOX0xEUjEzKSwgRSAoRk1UX0xEUjEzKSB9LCB7IEkgKElOU05fTERSMTNVSCksIEUgKEZNVF9MRFIxM1VIKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xEUjEzVUIpLCBFIChGTVRfTERSMTNVQikgfSwgeyBJIChJTlNOX0xEUjE1KSwgRSAoRk1UX0xEUjE1KSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xEKSwgRSAoRk1UX0xEKSB9LCB7IEkgKElOU05fTERVSCksIEUgKEZNVF9MRFVIKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xEVUIpLCBFIChGTVRfTERVQikgfSwgeyAwIH0sIAorICAgICAgICB7IEkgKElOU05fRE1PVjJSMTMpLCBFIChGTVRfRE1PVjJSMTMpIH0sIHsgSSAoSU5TTl9ETU9WMlIxM0gpLCBFIChGTVRfRE1PVjJSMTNIKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0RNT1YyUjEzQiksIEUgKEZNVF9ETU9WMlIxM0IpIH0sIHsgSSAoSU5TTl9ETU9WMlIxNVBEKSwgRSAoRk1UX0RNT1YyUjE1UEQpIH0sIAorICAgICAgICB7IEkgKElOU05fRE1PVjJSMTNQSSksIEUgKEZNVF9ETU9WMlIxM1BJKSB9LCB7IEkgKElOU05fRE1PVjJSMTNQSUgpLCBFIChGTVRfRE1PVjJSMTNQSUgpIH0sIAorICAgICAgICB7IEkgKElOU05fRE1PVjJSMTNQSUIpLCBFIChGTVRfRE1PVjJSMTNQSUIpIH0sIHsgSSAoSU5TTl9FTlRFUiksIEUgKEZNVF9FTlRFUikgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TVFIxMyksIEUgKEZNVF9TVFIxMykgfSwgeyBJIChJTlNOX1NUUjEzSCksIEUgKEZNVF9TVFIxM0gpIH0sIAorICAgICAgICB7IEkgKElOU05fU1RSMTNCKSwgRSAoRk1UX1NUUjEzQikgfSwgeyBJIChJTlNOX1NUUjE1KSwgRSAoRk1UX1NUUjE1KSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NUKSwgRSAoRk1UX1NUKSB9LCB7IEkgKElOU05fU1RIKSwgRSAoRk1UX1NUSCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TVEIpLCBFIChGTVRfU1RCKSB9LCB7IDAgfSwgCisgICAgICAgIHsgSSAoSU5TTl9ETU9WUjEzKSwgRSAoRk1UX0RNT1ZSMTMpIH0sIHsgSSAoSU5TTl9ETU9WUjEzSCksIEUgKEZNVF9ETU9WUjEzSCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9ETU9WUjEzQiksIEUgKEZNVF9ETU9WUjEzQikgfSwgeyBJIChJTlNOX0RNT1ZSMTVQSSksIEUgKEZNVF9ETU9WUjE1UEkpIH0sIAorICAgICAgICB7IEkgKElOU05fRE1PVlIxM1BJKSwgRSAoRk1UX0RNT1ZSMTNQSSkgfSwgeyBJIChJTlNOX0RNT1ZSMTNQSUgpLCBFIChGTVRfRE1PVlIxM1BJSCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9ETU9WUjEzUElCKSwgRSAoRk1UX0RNT1ZSMTNQSUIpIH0sIHsgSSAoSU5TTl9JTlQpLCBFIChGTVRfSU5UKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xEUjE0KSwgRSAoRk1UX0xEUjE0KSB9LCB7IEkgKElOU05fTERSMTQpLCBFIChGTVRfTERSMTQpIH0sIAorICAgICAgICB7IEkgKElOU05fTERSMTQpLCBFIChGTVRfTERSMTQpIH0sIHsgSSAoSU5TTl9MRFIxNCksIEUgKEZNVF9MRFIxNCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MRFIxNCksIEUgKEZNVF9MRFIxNCkgfSwgeyBJIChJTlNOX0xEUjE0KSwgRSAoRk1UX0xEUjE0KSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xEUjE0KSwgRSAoRk1UX0xEUjE0KSB9LCB7IEkgKElOU05fTERSMTQpLCBFIChGTVRfTERSMTQpIH0sIAorICAgICAgICB7IEkgKElOU05fTERSMTQpLCBFIChGTVRfTERSMTQpIH0sIHsgSSAoSU5TTl9MRFIxNCksIEUgKEZNVF9MRFIxNCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MRFIxNCksIEUgKEZNVF9MRFIxNCkgfSwgeyBJIChJTlNOX0xEUjE0KSwgRSAoRk1UX0xEUjE0KSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xEUjE0KSwgRSAoRk1UX0xEUjE0KSB9LCB7IEkgKElOU05fTERSMTQpLCBFIChGTVRfTERSMTQpIH0sIAorICAgICAgICB7IEkgKElOU05fTERSMTQpLCBFIChGTVRfTERSMTQpIH0sIHsgSSAoSU5TTl9MRFIxNCksIEUgKEZNVF9MRFIxNCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TVFIxNCksIEUgKEZNVF9TVFIxNCkgfSwgeyBJIChJTlNOX1NUUjE0KSwgRSAoRk1UX1NUUjE0KSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NUUjE0KSwgRSAoRk1UX1NUUjE0KSB9LCB7IEkgKElOU05fU1RSMTQpLCBFIChGTVRfU1RSMTQpIH0sIAorICAgICAgICB7IEkgKElOU05fU1RSMTQpLCBFIChGTVRfU1RSMTQpIH0sIHsgSSAoSU5TTl9TVFIxNCksIEUgKEZNVF9TVFIxNCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TVFIxNCksIEUgKEZNVF9TVFIxNCkgfSwgeyBJIChJTlNOX1NUUjE0KSwgRSAoRk1UX1NUUjE0KSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NUUjE0KSwgRSAoRk1UX1NUUjE0KSB9LCB7IEkgKElOU05fU1RSMTQpLCBFIChGTVRfU1RSMTQpIH0sIAorICAgICAgICB7IEkgKElOU05fU1RSMTQpLCBFIChGTVRfU1RSMTQpIH0sIHsgSSAoSU5TTl9TVFIxNCksIEUgKEZNVF9TVFIxNCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TVFIxNCksIEUgKEZNVF9TVFIxNCkgfSwgeyBJIChJTlNOX1NUUjE0KSwgRSAoRk1UX1NUUjE0KSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NUUjE0KSwgRSAoRk1UX1NUUjE0KSB9LCB7IEkgKElOU05fU1RSMTQpLCBFIChGTVRfU1RSMTQpIH0sIAorICAgICAgICB7IEkgKElOU05fTERSMTRVSCksIEUgKEZNVF9MRFIxNFVIKSB9LCB7IEkgKElOU05fTERSMTRVSCksIEUgKEZNVF9MRFIxNFVIKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xEUjE0VUgpLCBFIChGTVRfTERSMTRVSCkgfSwgeyBJIChJTlNOX0xEUjE0VUgpLCBFIChGTVRfTERSMTRVSCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MRFIxNFVIKSwgRSAoRk1UX0xEUjE0VUgpIH0sIHsgSSAoSU5TTl9MRFIxNFVIKSwgRSAoRk1UX0xEUjE0VUgpIH0sIAorICAgICAgICB7IEkgKElOU05fTERSMTRVSCksIEUgKEZNVF9MRFIxNFVIKSB9LCB7IEkgKElOU05fTERSMTRVSCksIEUgKEZNVF9MRFIxNFVIKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xEUjE0VUgpLCBFIChGTVRfTERSMTRVSCkgfSwgeyBJIChJTlNOX0xEUjE0VUgpLCBFIChGTVRfTERSMTRVSCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MRFIxNFVIKSwgRSAoRk1UX0xEUjE0VUgpIH0sIHsgSSAoSU5TTl9MRFIxNFVIKSwgRSAoRk1UX0xEUjE0VUgpIH0sIAorICAgICAgICB7IEkgKElOU05fTERSMTRVSCksIEUgKEZNVF9MRFIxNFVIKSB9LCB7IEkgKElOU05fTERSMTRVSCksIEUgKEZNVF9MRFIxNFVIKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xEUjE0VUgpLCBFIChGTVRfTERSMTRVSCkgfSwgeyBJIChJTlNOX0xEUjE0VUgpLCBFIChGTVRfTERSMTRVSCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TVFIxNEgpLCBFIChGTVRfU1RSMTRIKSB9LCB7IEkgKElOU05fU1RSMTRIKSwgRSAoRk1UX1NUUjE0SCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TVFIxNEgpLCBFIChGTVRfU1RSMTRIKSB9LCB7IEkgKElOU05fU1RSMTRIKSwgRSAoRk1UX1NUUjE0SCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TVFIxNEgpLCBFIChGTVRfU1RSMTRIKSB9LCB7IEkgKElOU05fU1RSMTRIKSwgRSAoRk1UX1NUUjE0SCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TVFIxNEgpLCBFIChGTVRfU1RSMTRIKSB9LCB7IEkgKElOU05fU1RSMTRIKSwgRSAoRk1UX1NUUjE0SCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TVFIxNEgpLCBFIChGTVRfU1RSMTRIKSB9LCB7IEkgKElOU05fU1RSMTRIKSwgRSAoRk1UX1NUUjE0SCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TVFIxNEgpLCBFIChGTVRfU1RSMTRIKSB9LCB7IEkgKElOU05fU1RSMTRIKSwgRSAoRk1UX1NUUjE0SCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TVFIxNEgpLCBFIChGTVRfU1RSMTRIKSB9LCB7IEkgKElOU05fU1RSMTRIKSwgRSAoRk1UX1NUUjE0SCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TVFIxNEgpLCBFIChGTVRfU1RSMTRIKSB9LCB7IEkgKElOU05fU1RSMTRIKSwgRSAoRk1UX1NUUjE0SCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MRFIxNFVCKSwgRSAoRk1UX0xEUjE0VUIpIH0sIHsgSSAoSU5TTl9MRFIxNFVCKSwgRSAoRk1UX0xEUjE0VUIpIH0sIAorICAgICAgICB7IEkgKElOU05fTERSMTRVQiksIEUgKEZNVF9MRFIxNFVCKSB9LCB7IEkgKElOU05fTERSMTRVQiksIEUgKEZNVF9MRFIxNFVCKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xEUjE0VUIpLCBFIChGTVRfTERSMTRVQikgfSwgeyBJIChJTlNOX0xEUjE0VUIpLCBFIChGTVRfTERSMTRVQikgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MRFIxNFVCKSwgRSAoRk1UX0xEUjE0VUIpIH0sIHsgSSAoSU5TTl9MRFIxNFVCKSwgRSAoRk1UX0xEUjE0VUIpIH0sIAorICAgICAgICB7IEkgKElOU05fTERSMTRVQiksIEUgKEZNVF9MRFIxNFVCKSB9LCB7IEkgKElOU05fTERSMTRVQiksIEUgKEZNVF9MRFIxNFVCKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xEUjE0VUIpLCBFIChGTVRfTERSMTRVQikgfSwgeyBJIChJTlNOX0xEUjE0VUIpLCBFIChGTVRfTERSMTRVQikgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MRFIxNFVCKSwgRSAoRk1UX0xEUjE0VUIpIH0sIHsgSSAoSU5TTl9MRFIxNFVCKSwgRSAoRk1UX0xEUjE0VUIpIH0sIAorICAgICAgICB7IEkgKElOU05fTERSMTRVQiksIEUgKEZNVF9MRFIxNFVCKSB9LCB7IEkgKElOU05fTERSMTRVQiksIEUgKEZNVF9MRFIxNFVCKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NUUjE0QiksIEUgKEZNVF9TVFIxNEIpIH0sIHsgSSAoSU5TTl9TVFIxNEIpLCBFIChGTVRfU1RSMTRCKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NUUjE0QiksIEUgKEZNVF9TVFIxNEIpIH0sIHsgSSAoSU5TTl9TVFIxNEIpLCBFIChGTVRfU1RSMTRCKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NUUjE0QiksIEUgKEZNVF9TVFIxNEIpIH0sIHsgSSAoSU5TTl9TVFIxNEIpLCBFIChGTVRfU1RSMTRCKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NUUjE0QiksIEUgKEZNVF9TVFIxNEIpIH0sIHsgSSAoSU5TTl9TVFIxNEIpLCBFIChGTVRfU1RSMTRCKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NUUjE0QiksIEUgKEZNVF9TVFIxNEIpIH0sIHsgSSAoSU5TTl9TVFIxNEIpLCBFIChGTVRfU1RSMTRCKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NUUjE0QiksIEUgKEZNVF9TVFIxNEIpIH0sIHsgSSAoSU5TTl9TVFIxNEIpLCBFIChGTVRfU1RSMTRCKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NUUjE0QiksIEUgKEZNVF9TVFIxNEIpIH0sIHsgSSAoSU5TTl9TVFIxNEIpLCBFIChGTVRfU1RSMTRCKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NUUjE0QiksIEUgKEZNVF9TVFIxNEIpIH0sIHsgSSAoSU5TTl9TVFIxNEIpLCBFIChGTVRfU1RSMTRCKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0JBTkRMKSwgRSAoRk1UX0JBTkRMKSB9LCB7IEkgKElOU05fQkFOREgpLCBFIChGTVRfQkFOREwpIH0sIAorICAgICAgICB7IEkgKElOU05fQU5EKSwgRSAoRk1UX0FORCkgfSwgeyBJIChJTlNOX0FORENDUiksIEUgKEZNVF9BTkRDQ1IpIH0sIAorICAgICAgICB7IEkgKElOU05fQU5ETSksIEUgKEZNVF9BTkRNKSB9LCB7IEkgKElOU05fQU5ESCksIEUgKEZNVF9BTkRIKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0FOREIpLCBFIChGTVRfQU5EQikgfSwgeyBJIChJTlNOX1NUSUxNKSwgRSAoRk1UX1NUSUxNKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0JUU1RMKSwgRSAoRk1UX0JUU1RMKSB9LCB7IEkgKElOU05fQlRTVEgpLCBFIChGTVRfQlRTVEwpIH0sIAorICAgICAgICB7IEkgKElOU05fWENIQiksIEUgKEZNVF9YQ0hCKSB9LCB7IEkgKElOU05fTU9WKSwgRSAoRk1UX01PVikgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MRE0wKSwgRSAoRk1UX0xETTApIH0sIHsgSSAoSU5TTl9MRE0xKSwgRSAoRk1UX0xETTEpIH0sIAorICAgICAgICB7IEkgKElOU05fU1RNMCksIEUgKEZNVF9TVE0wKSB9LCB7IEkgKElOU05fU1RNMSksIEUgKEZNVF9TVE0xKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0JPUkwpLCBFIChGTVRfQkFOREwpIH0sIHsgSSAoSU5TTl9CT1JIKSwgRSAoRk1UX0JBTkRMKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX09SKSwgRSAoRk1UX0FORCkgfSwgeyBJIChJTlNOX09SQ0NSKSwgRSAoRk1UX0FORENDUikgfSwgCisgICAgICAgIHsgSSAoSU5TTl9PUk0pLCBFIChGTVRfQU5ETSkgfSwgeyBJIChJTlNOX09SSCksIEUgKEZNVF9BTkRIKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX09SQiksIEUgKEZNVF9BTkRCKSB9LCB7IDAgfSwgCisgICAgICAgIHsgSSAoSU5TTl9CRU9STCksIEUgKEZNVF9CQU5ETCkgfSwgeyBJIChJTlNOX0JFT1JIKSwgRSAoRk1UX0JBTkRMKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0VPUiksIEUgKEZNVF9BTkQpIH0sIHsgSSAoSU5TTl9MREkyMCksIEUgKEZNVF9MREkyMCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9FT1JNKSwgRSAoRk1UX0FORE0pIH0sIHsgSSAoSU5TTl9FT1JIKSwgRSAoRk1UX0FOREgpIH0sIAorICAgICAgICB7IEkgKElOU05fRU9SQiksIEUgKEZNVF9BTkRCKSB9LCB7IDAgfSwgCisgICAgICAgIHsgSSAoSU5TTl9BREROSSksIEUgKEZNVF9BREROSSkgfSwgeyBJIChJTlNOX0FERE4yKSwgRSAoRk1UX0FERE4yKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0FERE4pLCBFIChGTVRfQURETikgfSwgeyBJIChJTlNOX0FERFNQKSwgRSAoRk1UX0FERFNQKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0FEREkpLCBFIChGTVRfQURESSkgfSwgeyBJIChJTlNOX0FERDIpLCBFIChGTVRfQUREMikgfSwgCisgICAgICAgIHsgSSAoSU5TTl9BREQpLCBFIChGTVRfQUREKSB9LCB7IEkgKElOU05fQUREQyksIEUgKEZNVF9BRERDKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0NNUEkpLCBFIChGTVRfQ01QSSkgfSwgeyBJIChJTlNOX0NNUDIpLCBFIChGTVRfQ01QMikgfSwgCisgICAgICAgIHsgSSAoSU5TTl9DTVApLCBFIChGTVRfQ01QKSB9LCB7IEkgKElOU05fTVVMVSksIEUgKEZNVF9NVUxVKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NVQiksIEUgKEZNVF9BREQpIH0sIHsgSSAoSU5TTl9TVUJDKSwgRSAoRk1UX0FEREMpIH0sIAorICAgICAgICB7IEkgKElOU05fU1VCTiksIEUgKEZNVF9BREROKSB9LCB7IEkgKElOU05fTVVMKSwgRSAoRk1UX01VTCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MU1JJKSwgRSAoRk1UX0xTTEkpIH0sIHsgSSAoSU5TTl9MU1IyKSwgRSAoRk1UX0xTTEkpIH0sIAorICAgICAgICB7IEkgKElOU05fTFNSKSwgRSAoRk1UX0xTTCkgfSwgeyBJIChJTlNOX01PVjJEUiksIEUgKEZNVF9NT1YyRFIpIH0sIAorICAgICAgICB7IEkgKElOU05fTFNMSSksIEUgKEZNVF9MU0xJKSB9LCB7IEkgKElOU05fTFNMMiksIEUgKEZNVF9MU0xJKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xTTCksIEUgKEZNVF9MU0wpIH0sIHsgSSAoSU5TTl9NT1ZEUiksIEUgKEZNVF9NT1ZEUikgfSwgCisgICAgICAgIHsgSSAoSU5TTl9BU1JJKSwgRSAoRk1UX0xTTEkpIH0sIHsgSSAoSU5TTl9BU1IyKSwgRSAoRk1UX0xTTEkpIH0sIAorICAgICAgICB7IEkgKElOU05fQVNSKSwgRSAoRk1UX0xTTCkgfSwgeyBJIChJTlNOX01VTFVIKSwgRSAoRk1UX01VTEgpIH0sIAorICAgICAgICB7IEkgKElOU05fTERSRVMpLCBFIChGTVRfTERSRVMpIH0sIHsgSSAoSU5TTl9TVFJFUyksIEUgKEZNVF9MRFJFUykgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9NVUxIKSwgRSAoRk1UX01VTEgpIH0sIAorICAgICAgICB7IEkgKElOU05fTERJOCksIEUgKEZNVF9MREk4KSB9LCB7IEkgKElOU05fTERJOCksIEUgKEZNVF9MREk4KSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xESTgpLCBFIChGTVRfTERJOCkgfSwgeyBJIChJTlNOX0xESTgpLCBFIChGTVRfTERJOCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MREk4KSwgRSAoRk1UX0xESTgpIH0sIHsgSSAoSU5TTl9MREk4KSwgRSAoRk1UX0xESTgpIH0sIAorICAgICAgICB7IEkgKElOU05fTERJOCksIEUgKEZNVF9MREk4KSB9LCB7IEkgKElOU05fTERJOCksIEUgKEZNVF9MREk4KSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xESTgpLCBFIChGTVRfTERJOCkgfSwgeyBJIChJTlNOX0xESTgpLCBFIChGTVRfTERJOCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MREk4KSwgRSAoRk1UX0xESTgpIH0sIHsgSSAoSU5TTl9MREk4KSwgRSAoRk1UX0xESTgpIH0sIAorICAgICAgICB7IEkgKElOU05fTERJOCksIEUgKEZNVF9MREk4KSB9LCB7IEkgKElOU05fTERJOCksIEUgKEZNVF9MREk4KSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xESTgpLCBFIChGTVRfTERJOCkgfSwgeyBJIChJTlNOX0xESTgpLCBFIChGTVRfTERJOCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9DQUxMKSwgRSAoRk1UX0NBTEwpIH0sIHsgSSAoSU5TTl9DQUxMKSwgRSAoRk1UX0NBTEwpIH0sIAorICAgICAgICB7IEkgKElOU05fQ0FMTCksIEUgKEZNVF9DQUxMKSB9LCB7IEkgKElOU05fQ0FMTCksIEUgKEZNVF9DQUxMKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0NBTEwpLCBFIChGTVRfQ0FMTCkgfSwgeyBJIChJTlNOX0NBTEwpLCBFIChGTVRfQ0FMTCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9DQUxMKSwgRSAoRk1UX0NBTEwpIH0sIHsgSSAoSU5TTl9DQUxMKSwgRSAoRk1UX0NBTEwpIH0sIAorICAgICAgICB7IEkgKElOU05fQ0FMTEQpLCBFIChGTVRfQ0FMTCkgfSwgeyBJIChJTlNOX0NBTExEKSwgRSAoRk1UX0NBTEwpIH0sIAorICAgICAgICB7IEkgKElOU05fQ0FMTEQpLCBFIChGTVRfQ0FMTCkgfSwgeyBJIChJTlNOX0NBTExEKSwgRSAoRk1UX0NBTEwpIH0sIAorICAgICAgICB7IEkgKElOU05fQ0FMTEQpLCBFIChGTVRfQ0FMTCkgfSwgeyBJIChJTlNOX0NBTExEKSwgRSAoRk1UX0NBTEwpIH0sIAorICAgICAgICB7IEkgKElOU05fQ0FMTEQpLCBFIChGTVRfQ0FMTCkgfSwgeyBJIChJTlNOX0NBTExEKSwgRSAoRk1UX0NBTEwpIH0sIAorICAgICAgICB7IEkgKElOU05fQlJBKSwgRSAoRk1UX0JSQUQpIH0sIHsgSSAoSU5TTl9CTk8pLCBFIChGTVRfQk5PRCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9CRVEpLCBFIChGTVRfQkVRRCkgfSwgeyBJIChJTlNOX0JORSksIEUgKEZNVF9CRVFEKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0JDKSwgRSAoRk1UX0JDRCkgfSwgeyBJIChJTlNOX0JOQyksIEUgKEZNVF9CQ0QpIH0sIAorICAgICAgICB7IEkgKElOU05fQk4pLCBFIChGTVRfQk5EKSB9LCB7IEkgKElOU05fQlApLCBFIChGTVRfQk5EKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0JWKSwgRSAoRk1UX0JWRCkgfSwgeyBJIChJTlNOX0JOViksIEUgKEZNVF9CVkQpIH0sIAorICAgICAgICB7IEkgKElOU05fQkxUKSwgRSAoRk1UX0JMVEQpIH0sIHsgSSAoSU5TTl9CR0UpLCBFIChGTVRfQkxURCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9CTEUpLCBFIChGTVRfQkxFRCkgfSwgeyBJIChJTlNOX0JHVCksIEUgKEZNVF9CTEVEKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0JMUyksIEUgKEZNVF9CTFNEKSB9LCB7IEkgKElOU05fQkhJKSwgRSAoRk1UX0JMU0QpIH0sIAorICAgICAgICB7IEkgKElOU05fQlJBRCksIEUgKEZNVF9CUkFEKSB9LCB7IEkgKElOU05fQk5PRCksIEUgKEZNVF9CTk9EKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0JFUUQpLCBFIChGTVRfQkVRRCkgfSwgeyBJIChJTlNOX0JORUQpLCBFIChGTVRfQkVRRCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9CQ0QpLCBFIChGTVRfQkNEKSB9LCB7IEkgKElOU05fQk5DRCksIEUgKEZNVF9CQ0QpIH0sIAorICAgICAgICB7IEkgKElOU05fQk5EKSwgRSAoRk1UX0JORCkgfSwgeyBJIChJTlNOX0JQRCksIEUgKEZNVF9CTkQpIH0sIAorICAgICAgICB7IEkgKElOU05fQlZEKSwgRSAoRk1UX0JWRCkgfSwgeyBJIChJTlNOX0JOVkQpLCBFIChGTVRfQlZEKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0JMVEQpLCBFIChGTVRfQkxURCkgfSwgeyBJIChJTlNOX0JHRUQpLCBFIChGTVRfQkxURCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9CTEVEKSwgRSAoRk1UX0JMRUQpIH0sIHsgSSAoSU5TTl9CR1REKSwgRSAoRk1UX0JMRUQpIH0sIAorICAgICAgICB7IEkgKElOU05fQkxTRCksIEUgKEZNVF9CTFNEKSB9LCB7IEkgKElOU05fQkhJRCksIEUgKEZNVF9CTFNEKSB9LCAKKyAgICAgIH07CisgICAgICB1bnNpZ25lZCBpbnQgdmFsOworICAgICAgdmFsID0gKCgoaW5zbiA+PiA4KSAmICgyNTUgPDwgMCkpKTsKKyAgICAgIERFQ09ERV9TV0lUQ0ggKDAsIHZhbCkKKyAgICAgICAgeworICAgICAgICBDQVNFICgwLCA3KSA6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xEUjE1R1IpLCBFIChGTVRfTERSMTVHUikgfSwgeyBJIChJTlNOX01PVjJQUyksIEUgKEZNVF9NT1YyUFMpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERSMTVEUiksIEUgKEZNVF9MRFIxNURSKSB9LCB7IEkgKElOU05fTERSMTVQUyksIEUgKEZNVF9MRFIxNVBTKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA0KSAmICgxNSA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDIzKSA6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1NUUjE1R1IpLCBFIChGTVRfU1RSMTVHUikgfSwgeyBJIChJTlNOX01PVlBTKSwgRSAoRk1UX01PVlBTKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1NUUjE1RFIpLCBFIChGTVRfU1RSMTVEUikgfSwgeyBJIChJTlNOX1NUUjE1UFMpLCBFIChGTVRfU1RSMTVQUykgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNCkgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgfQorICAgICAgICBDQVNFICgwLCAxNTEpIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fSk1QKSwgRSAoRk1UX0pNUCkgfSwgeyBJIChJTlNOX0NBTExSKSwgRSAoRk1UX0NBTExSKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1JFVCksIEUgKEZNVF9SRVQpIH0sIHsgSSAoSU5TTl9SRVRJKSwgRSAoRk1UX1JFVEkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fRElWMFMpLCBFIChGTVRfRElWMFMpIH0sIHsgSSAoSU5TTl9ESVYwVSksIEUgKEZNVF9ESVYwVSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9ESVYxKSwgRSAoRk1UX0RJVjEpIH0sIHsgSSAoSU5TTl9ESVYyKSwgRSAoRk1UX0RJVjIpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fRVhUU0IpLCBFIChGTVRfRVhUU0IpIH0sIHsgSSAoSU5TTl9FWFRVQiksIEUgKEZNVF9FWFRVQikgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9FWFRTSCksIEUgKEZNVF9FWFRTSCkgfSwgeyBJIChJTlNOX0VYVFVIKSwgRSAoRk1UX0VYVFVIKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDQpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgIH0KKyAgICAgICAgQ0FTRSAoMCwgMTU5KSA6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0pNUEQpLCBFIChGTVRfSk1QKSB9LCB7IEkgKElOU05fQ0FMTFJEKSwgRSAoRk1UX0NBTExSKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1JFVF9EKSwgRSAoRk1UX1JFVCkgfSwgeyBJIChJTlNOX0lOVEUpLCBFIChGTVRfSU5URSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fRElWMyksIEUgKEZNVF9ESVYzKSB9LCB7IEkgKElOU05fRElWNFMpLCBFIChGTVRfRElWNFMpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERJMzIpLCBFIChGTVRfTERJMzIpIH0sIHsgSSAoSU5TTl9MRUFWRSksIEUgKEZNVF9MRUFWRSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9OT1ApLCBFIChGTVRfTk9QKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0NPUE9QKSwgRSAoRk1UX0NPUE9QKSB9LCB7IEkgKElOU05fQ09QTEQpLCBFIChGTVRfQ09QTEQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fQ09QU1QpLCBFIChGTVRfQ09QU1QpIH0sIHsgSSAoSU5TTl9DT1BTViksIEUgKEZNVF9DT1BTVCkgfSwgCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNCkgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgfQorICAgICAgICBERUZBVUxUICgwKSA6CisgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgIH0KKyAgICAgIEVORFNXSVRDSCAoMCkKKyAgICB9CisjdW5kZWYgSQorI3VuZGVmIEUKKyAgfQorCisgIC8qIFRoZSBpbnN0cnVjdGlvbiBoYXMgYmVlbiBkZWNvZGVkLCBub3cgZXh0cmFjdCB0aGUgZmllbGRzLiAgKi8KKworIGV4dHJhY3Q6CisgIHsKKyNpZm5kZWYgX19HTlVDX18KKyAgICBzd2l0Y2ggKGlkZWNvZGUtPnNmbXQpCisjZW5kaWYKKyAgICAgIHsKKworICBDQVNFIChleCwgRk1UX0VNUFRZKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKKyAgRVhUUkFDVF9JRk1UX0VNUFRZX1ZBUlMgLyogKi8KKworICBFWFRSQUNUX0lGTVRfRU1QVFlfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2VtcHR5IiwgKGNoYXIgKikgMCkpOworCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0FERCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQuZgorICBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SaiBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfYWRkIiwgIlJpIDB4JXgiLCAneCcsIGZfUmksICJSaiAweCV4IiwgJ3gnLCBmX1JqLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKKyAgICAgIEZMRCAoaW5fUmopID0gZl9SajsKKyAgICAgIEZMRCAob3V0X1JpKSA9IGZfUmk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0FEREkpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkaS5mCisgIEVYVFJBQ1RfSUZNVF9BRERJX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi11NCBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERElfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl91NCkgPSBmX3U0OworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9hZGRpIiwgImZfdTQgMHgleCIsICd4JywgZl91NCwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOworICAgICAgRkxEIChvdXRfUmkpID0gZl9SaTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQUREMikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQyLmYKKyAgRVhUUkFDVF9JRk1UX0FERDJfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLW00IGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfQUREMl9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX200KSA9IGZfbTQ7CisgIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2FkZDIiLCAiZl9tNCAweCV4IiwgJ3gnLCBmX200LCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JpKSA9IGZfUmk7CisgICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9BRERDKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZGMuZgorICBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SaiBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfYWRkYyIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAiUmogMHgleCIsICd4JywgZl9SaiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JpKSA9IGZfUmk7CisgICAgICBGTEQgKGluX1JqKSA9IGZfUmo7CisgICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9BREROKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZG4uZgorICBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SaiBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfYWRkbiIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAiUmogMHgleCIsICd4JywgZl9SaiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JpKSA9IGZfUmk7CisgICAgICBGTEQgKGluX1JqKSA9IGZfUmo7CisgICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9BREROSSkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGRuaS5mCisgIEVYVFJBQ1RfSUZNVF9BRERJX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi11NCBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERElfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl91NCkgPSBmX3U0OworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9hZGRuaSIsICJmX3U0IDB4JXgiLCAneCcsIGZfdTQsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKKyAgICAgIEZMRCAob3V0X1JpKSA9IGZfUmk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0FERE4yKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZG4yLmYKKyAgRVhUUkFDVF9JRk1UX0FERDJfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLW00IGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfQUREMl9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX200KSA9IGZfbTQ7CisgIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2FkZG4yIiwgImZfbTQgMHgleCIsICd4JywgZl9tNCwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOworICAgICAgRkxEIChvdXRfUmkpID0gZl9SaTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQ01QKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcC5mCisgIEVYVFJBQ1RfSUZNVF9BRERfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLVJqIGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfQUREX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBGTEQgKGlfUmopID0gJiBDUFUgKGhfZ3IpW2ZfUmpdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9jbXAiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgIlJqIDB4JXgiLCAneCcsIGZfUmosIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOworICAgICAgRkxEIChpbl9SaikgPSBmX1JqOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9DTVBJKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkuZgorICBFWFRSQUNUX0lGTVRfQURESV9WQVJTIC8qIGYtb3AxIGYtb3AyIGYtdTQgZi1SaSAqLworCisgIEVYVFJBQ1RfSUZNVF9BRERJX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfdTQpID0gZl91NDsKKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfY21waSIsICJmX3U0IDB4JXgiLCAneCcsIGZfdTQsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQ01QMikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXAyLmYKKyAgRVhUUkFDVF9JRk1UX0FERDJfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLW00IGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfQUREMl9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX200KSA9IGZfbTQ7CisgIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2NtcDIiLCAiZl9tNCAweCV4IiwgJ3gnLCBmX200LCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JpKSA9IGZfUmk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0FORCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmQuZgorICBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SaiBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfYW5kIiwgIlJpIDB4JXgiLCAneCcsIGZfUmksICJSaiAweCV4IiwgJ3gnLCBmX1JqLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKKyAgICAgIEZMRCAoaW5fUmopID0gZl9SajsKKyAgICAgIEZMRCAob3V0X1JpKSA9IGZfUmk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0FORE0pIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYW5kbS5mCisgIEVYVFJBQ1RfSUZNVF9BRERfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLVJqIGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfQUREX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBGTEQgKGlfUmopID0gJiBDUFUgKGhfZ3IpW2ZfUmpdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9hbmRtIiwgIlJpIDB4JXgiLCAneCcsIGZfUmksICJSaiAweCV4IiwgJ3gnLCBmX1JqLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKKyAgICAgIEZMRCAoaW5fUmopID0gZl9SajsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQU5ESCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRoLmYKKyAgRVhUUkFDVF9JRk1UX0FERF9WQVJTIC8qIGYtb3AxIGYtb3AyIGYtUmogZi1SaSAqLworCisgIEVYVFJBQ1RfSUZNVF9BRERfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07CisgIEZMRCAoaV9SaikgPSAmIENQVSAoaF9ncilbZl9Sal07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2FuZGgiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgIlJqIDB4JXgiLCAneCcsIGZfUmosIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOworICAgICAgRkxEIChpbl9SaikgPSBmX1JqOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9BTkRCKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FuZGIuZgorICBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SaiBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfYW5kYiIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAiUmogMHgleCIsICd4JywgZl9SaiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JpKSA9IGZfUmk7CisgICAgICBGTEQgKGluX1JqKSA9IGZfUmo7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0JBTkRMKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2JhbmRsLmYKKyAgRVhUUkFDVF9JRk1UX0FERElfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLXU0IGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfQURESV9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3U0KSA9IGZfdTQ7CisgIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2JhbmRsIiwgImZfdTQgMHgleCIsICd4JywgZl91NCwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9CVFNUTCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9idHN0bC5mCisgIEVYVFJBQ1RfSUZNVF9BRERJX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi11NCBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERElfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl91NCkgPSBmX3U0OworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9idHN0bCIsICJmX3U0IDB4JXgiLCAneCcsIGZfdTQsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTVVMKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bC5mCisgIEVYVFJBQ1RfSUZNVF9BRERfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLVJqIGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfQUREX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBGTEQgKGlfUmopID0gJiBDUFUgKGhfZ3IpW2ZfUmpdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9tdWwiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgIlJqIDB4JXgiLCAneCcsIGZfUmosIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOworICAgICAgRkxEIChpbl9SaikgPSBmX1JqOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9NVUxVKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bHUuZgorICBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SaiBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbXVsdSIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAiUmogMHgleCIsICd4JywgZl9SaiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JpKSA9IGZfUmk7CisgICAgICBGTEQgKGluX1JqKSA9IGZfUmo7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX01VTEgpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsaC5mCisgIEVYVFJBQ1RfSUZNVF9BRERfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLVJqIGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfQUREX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBGTEQgKGlfUmopID0gJiBDUFUgKGhfZ3IpW2ZfUmpdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9tdWxoIiwgIlJpIDB4JXgiLCAneCcsIGZfUmksICJSaiAweCV4IiwgJ3gnLCBmX1JqLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKKyAgICAgIEZMRCAoaW5fUmopID0gZl9SajsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfRElWMFMpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZGl2MHMuZgorICBFWFRSQUNUX0lGTVRfRElWMFNfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLW9wMyBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0RJVjBTX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9kaXYwcyIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfRElWMFUpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZGl2MHUuZgorICBFWFRSQUNUX0lGTVRfRElWMFNfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLW9wMyBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0RJVjBTX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9kaXYwdSIsIChjaGFyICopIDApKTsKKworI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9ESVYxKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2RpdjEuZgorICBFWFRSQUNUX0lGTVRfRElWMFNfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLW9wMyBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0RJVjBTX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9kaXYxIiwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9ESVYyKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2RpdjIuZgorICBFWFRSQUNUX0lGTVRfRElWMFNfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLW9wMyBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0RJVjBTX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9kaXYyIiwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9ESVYzKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2RpdjMuZgorICBFWFRSQUNUX0lGTVRfRElWM19WQVJTIC8qIGYtb3AxIGYtb3AyIGYtb3AzIGYtb3A0ICovCisKKyAgRVhUUkFDVF9JRk1UX0RJVjNfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2RpdjMiLCAoY2hhciAqKSAwKSk7CisKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfRElWNFMpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZGl2NHMuZgorICBFWFRSQUNUX0lGTVRfRElWM19WQVJTIC8qIGYtb3AxIGYtb3AyIGYtb3AzIGYtb3A0ICovCisKKyAgRVhUUkFDVF9JRk1UX0RJVjNfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2RpdjRzIiwgKGNoYXIgKikgMCkpOworCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xTTCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sc2wuZgorICBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SaiBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbHNsIiwgIlJpIDB4JXgiLCAneCcsIGZfUmksICJSaiAweCV4IiwgJ3gnLCBmX1JqLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKKyAgICAgIEZMRCAoaW5fUmopID0gZl9SajsKKyAgICAgIEZMRCAob3V0X1JpKSA9IGZfUmk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xTTEkpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbHNsaS5mCisgIEVYVFJBQ1RfSUZNVF9BRERJX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi11NCBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERElfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl91NCkgPSBmX3U0OworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sc2xpIiwgImZfdTQgMHgleCIsICd4JywgZl91NCwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOworICAgICAgRkxEIChvdXRfUmkpID0gZl9SaTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERJOCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGk4LmYKKyAgRVhUUkFDVF9JRk1UX0xESThfVkFSUyAvKiBmLW9wMSBmLWk4IGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfTERJOF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX2k4KSA9IGZfaTg7CisgIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkaTgiLCAiZl9pOCAweCV4IiwgJ3gnLCBmX2k4LCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MREkyMCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGkyMC5mCisgIEVYVFJBQ1RfSUZNVF9MREkyMF9WQVJTIC8qIGYtb3AxIGYtaTIwIGYtb3AyIGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfTERJMjBfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9pMjApID0gZl9pMjA7CisgIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkaTIwIiwgImZfaTIwIDB4JXgiLCAneCcsIGZfaTIwLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MREkzMikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGkzMi5mCisgIEVYVFJBQ1RfSUZNVF9MREkzMl9WQVJTIC8qIGYtb3AxIGYtaTMyIGYtb3AyIGYtb3AzIGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfTERJMzJfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9pMzIpID0gZl9pMzI7CisgIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkaTMyIiwgImZfaTMyIDB4JXgiLCAneCcsIGZfaTMyLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZC5mCisgIEVYVFJBQ1RfSUZNVF9BRERfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLVJqIGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfQUREX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfUmopID0gJiBDUFUgKGhfZ3IpW2ZfUmpdOworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZCIsICJSaiAweCV4IiwgJ3gnLCBmX1JqLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JqKSA9IGZfUmo7CisgICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRFVIKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdWguZgorICBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SaiBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGR1aCIsICJSaiAweCV4IiwgJ3gnLCBmX1JqLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JqKSA9IGZfUmo7CisgICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRFVCKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdWIuZgorICBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SaiBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGR1YiIsICJSaiAweCV4IiwgJ3gnLCBmX1JqLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JqKSA9IGZfUmo7CisgICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRFIxMykgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHIxMy5mCisgIEVYVFJBQ1RfSUZNVF9BRERfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLVJqIGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfQUREX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfUmopID0gJiBDUFUgKGhfZ3IpW2ZfUmpdOworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZHIxMyIsICJSaiAweCV4IiwgJ3gnLCBmX1JqLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JqKSA9IGZfUmo7CisgICAgICBGTEQgKGluX2hfZ3JfMTMpID0gMTM7CisgICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRFIxM1VIKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcjEzdWguZgorICBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SaiBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRyMTN1aCIsICJSaiAweCV4IiwgJ3gnLCBmX1JqLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JqKSA9IGZfUmo7CisgICAgICBGTEQgKGluX2hfZ3JfMTMpID0gMTM7CisgICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRFIxM1VCKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcjEzdWIuZgorICBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SaiBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRyMTN1YiIsICJSaiAweCV4IiwgJ3gnLCBmX1JqLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JqKSA9IGZfUmo7CisgICAgICBGTEQgKGluX2hfZ3JfMTMpID0gMTM7CisgICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRFIxNCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHIxNC5mCisgIEVYVFJBQ1RfSUZNVF9MRFIxNF9WQVJTIC8qIGYtb3AxIGYtZGlzcDEwIGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfTERSMTRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9kaXNwMTApID0gZl9kaXNwMTA7CisgIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkcjE0IiwgImZfZGlzcDEwIDB4JXgiLCAneCcsIGZfZGlzcDEwLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2hfZ3JfMTQpID0gMTQ7CisgICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRFIxNFVIKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcjE0dWguZgorICBFWFRSQUNUX0lGTVRfTERSMTRVSF9WQVJTIC8qIGYtb3AxIGYtZGlzcDkgZi1SaSAqLworCisgIEVYVFJBQ1RfSUZNVF9MRFIxNFVIX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfZGlzcDkpID0gZl9kaXNwOTsKKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRyMTR1aCIsICJmX2Rpc3A5IDB4JXgiLCAneCcsIGZfZGlzcDksICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5faF9ncl8xNCkgPSAxNDsKKyAgICAgIEZMRCAob3V0X1JpKSA9IGZfUmk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xEUjE0VUIpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRyMTR1Yi5mCisgIEVYVFJBQ1RfSUZNVF9MRFIxNFVCX1ZBUlMgLyogZi1vcDEgZi1kaXNwOCBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0xEUjE0VUJfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9kaXNwOCkgPSBmX2Rpc3A4OworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZHIxNHViIiwgImZfZGlzcDggMHgleCIsICd4JywgZl9kaXNwOCwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9oX2dyXzE0KSA9IDE0OworICAgICAgRkxEIChvdXRfUmkpID0gZl9SaTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERSMTUpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRyMTUuZgorICBFWFRSQUNUX0lGTVRfTERSMTVfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLXVkaXNwNiBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0xEUjE1X0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfdWRpc3A2KSA9IGZfdWRpc3A2OworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZHIxNSIsICJmX3VkaXNwNiAweCV4IiwgJ3gnLCBmX3VkaXNwNiwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9oX2dyXzE1KSA9IDE1OworICAgICAgRkxEIChvdXRfUmkpID0gZl9SaTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERSMTVHUikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHIxNWdyLmYKKyAgRVhUUkFDVF9JRk1UX0RJVjBTX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1vcDMgZi1SaSAqLworCisgIEVYVFJBQ1RfSUZNVF9ESVYwU19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX1JpKSA9IGZfUmk7CisgIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkcjE1Z3IiLCAiZl9SaSAweCV4IiwgJ3gnLCBmX1JpLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2hfZ3JfMTUpID0gMTU7CisgICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOworICAgICAgRkxEIChvdXRfaF9ncl8xNSkgPSAxNTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERSMTVEUikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHIxNWRyLmYKKyAgRVhUUkFDVF9JRk1UX0xEUjE1RFJfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLW9wMyBmLVJzMiAqLworCisgIEVYVFJBQ1RfSUZNVF9MRFIxNURSX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfUnMyKSA9IGZfUnMyOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZHIxNWRyIiwgImZfUnMyIDB4JXgiLCAneCcsIGZfUnMyLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5faF9ncl8xNSkgPSAxNTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTUpID0gMTU7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xEUjE1UFMpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRyMTVwcy5mCisgIEVYVFJBQ1RfSUZNVF9ESVYzX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1vcDMgZi1vcDQgKi8KKworICBFWFRSQUNUX0lGTVRfRElWM19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRyMTVwcyIsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9oX2dyXzE1KSA9IDE1OworICAgICAgRkxEIChvdXRfaF9ncl8xNSkgPSAxNTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1QpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3QuZgorICBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SaiBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3QiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgIlJqIDB4JXgiLCAneCcsIGZfUmosIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOworICAgICAgRkxEIChpbl9SaikgPSBmX1JqOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVEgpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RoLmYKKyAgRVhUUkFDVF9JRk1UX0FERF9WQVJTIC8qIGYtb3AxIGYtb3AyIGYtUmogZi1SaSAqLworCisgIEVYVFJBQ1RfSUZNVF9BRERfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07CisgIEZMRCAoaV9SaikgPSAmIENQVSAoaF9ncilbZl9Sal07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0aCIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAiUmogMHgleCIsICd4JywgZl9SaiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JpKSA9IGZfUmk7CisgICAgICBGTEQgKGluX1JqKSA9IGZfUmo7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUQikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGIuZgorICBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SaiBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RiIiwgIlJpIDB4JXgiLCAneCcsIGZfUmksICJSaiAweCV4IiwgJ3gnLCBmX1JqLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKKyAgICAgIEZMRCAoaW5fUmopID0gZl9SajsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RSMTMpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RyMTMuZgorICBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SaiBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RyMTMiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgIlJqIDB4JXgiLCAneCcsIGZfUmosIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOworICAgICAgRkxEIChpbl9SaikgPSBmX1JqOworICAgICAgRkxEIChpbl9oX2dyXzEzKSA9IDEzOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVFIxM0gpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RyMTNoLmYKKyAgRVhUUkFDVF9JRk1UX0FERF9WQVJTIC8qIGYtb3AxIGYtb3AyIGYtUmogZi1SaSAqLworCisgIEVYVFJBQ1RfSUZNVF9BRERfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07CisgIEZMRCAoaV9SaikgPSAmIENQVSAoaF9ncilbZl9Sal07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0cjEzaCIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAiUmogMHgleCIsICd4JywgZl9SaiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JpKSA9IGZfUmk7CisgICAgICBGTEQgKGluX1JqKSA9IGZfUmo7CisgICAgICBGTEQgKGluX2hfZ3JfMTMpID0gMTM7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUUjEzQikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHIxM2IuZgorICBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SaiBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RyMTNiIiwgIlJpIDB4JXgiLCAneCcsIGZfUmksICJSaiAweCV4IiwgJ3gnLCBmX1JqLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKKyAgICAgIEZMRCAoaW5fUmopID0gZl9SajsKKyAgICAgIEZMRCAoaW5faF9ncl8xMykgPSAxMzsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RSMTQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RyMTQuZgorICBFWFRSQUNUX0lGTVRfTERSMTRfVkFSUyAvKiBmLW9wMSBmLWRpc3AxMCBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0xEUjE0X0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfZGlzcDEwKSA9IGZfZGlzcDEwOworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdHIxNCIsICJmX2Rpc3AxMCAweCV4IiwgJ3gnLCBmX2Rpc3AxMCwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOworICAgICAgRkxEIChpbl9oX2dyXzE0KSA9IDE0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVFIxNEgpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RyMTRoLmYKKyAgRVhUUkFDVF9JRk1UX0xEUjE0VUhfVkFSUyAvKiBmLW9wMSBmLWRpc3A5IGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfTERSMTRVSF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX2Rpc3A5KSA9IGZfZGlzcDk7CisgIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0cjE0aCIsICJmX2Rpc3A5IDB4JXgiLCAneCcsIGZfZGlzcDksICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKKyAgICAgIEZMRCAoaW5faF9ncl8xNCkgPSAxNDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RSMTRCKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjE0Yi5mCisgIEVYVFJBQ1RfSUZNVF9MRFIxNFVCX1ZBUlMgLyogZi1vcDEgZi1kaXNwOCBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0xEUjE0VUJfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9kaXNwOCkgPSBmX2Rpc3A4OworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdHIxNGIiLCAiZl9kaXNwOCAweCV4IiwgJ3gnLCBmX2Rpc3A4LCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JpKSA9IGZfUmk7CisgICAgICBGTEQgKGluX2hfZ3JfMTQpID0gMTQ7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUUjE1KSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjE1LmYKKyAgRVhUUkFDVF9JRk1UX0xEUjE1X1ZBUlMgLyogZi1vcDEgZi1vcDIgZi11ZGlzcDYgZi1SaSAqLworCisgIEVYVFJBQ1RfSUZNVF9MRFIxNV9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3VkaXNwNikgPSBmX3VkaXNwNjsKKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RyMTUiLCAiZl91ZGlzcDYgMHgleCIsICd4JywgZl91ZGlzcDYsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKKyAgICAgIEZMRCAoaW5faF9ncl8xNSkgPSAxNTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RSMTVHUikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHIxNWdyLmYKKyAgRVhUUkFDVF9JRk1UX0RJVjBTX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1vcDMgZi1SaSAqLworCisgIEVYVFJBQ1RfSUZNVF9ESVYwU19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RyMTVnciIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKKyAgICAgIEZMRCAoaW5faF9ncl8xNSkgPSAxNTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTUpID0gMTU7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUUjE1RFIpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RyMTVkci5mCisgIEVYVFJBQ1RfSUZNVF9MRFIxNURSX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1vcDMgZi1SczIgKi8KKworICBFWFRSQUNUX0lGTVRfTERSMTVEUl9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX1JzMikgPSBmX1JzMjsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RyMTVkciIsICJmX1JzMiAweCV4IiwgJ3gnLCBmX1JzMiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2hfZ3JfMTUpID0gMTU7CisgICAgICBGTEQgKG91dF9oX2dyXzE1KSA9IDE1OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVFIxNVBTKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjE1cHMuZgorICBFWFRSQUNUX0lGTVRfRElWM19WQVJTIC8qIGYtb3AxIGYtb3AyIGYtb3AzIGYtb3A0ICovCisKKyAgRVhUUkFDVF9JRk1UX0RJVjNfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0cjE1cHMiLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5faF9ncl8xNSkgPSAxNTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTUpID0gMTU7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX01PVikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tb3YuZgorICBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SaiBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JqKSA9ICYgQ1BVIChoX2dyKVtmX1JqXTsKKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbW92IiwgIlJqIDB4JXgiLCAneCcsIGZfUmosICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmopID0gZl9SajsKKyAgICAgIEZMRCAob3V0X1JpKSA9IGZfUmk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX01PVkRSKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdmRyLmYKKyAgRVhUUkFDVF9JRk1UX01PVkRSX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SczEgZi1SaSAqLworCisgIEVYVFJBQ1RfSUZNVF9NT1ZEUl9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX1JzMSkgPSBmX1JzMTsKKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbW92ZHIiLCAiZl9SczEgMHgleCIsICd4JywgZl9SczEsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAob3V0X1JpKSA9IGZfUmk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX01PVlBTKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdnBzLmYKKyAgRVhUUkFDVF9JRk1UX0RJVjBTX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1vcDMgZi1SaSAqLworCisgIEVYVFJBQ1RfSUZNVF9ESVYwU19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbW92cHMiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9NT1YyRFIpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW92MmRyLmYKKyAgRVhUUkFDVF9JRk1UX01PVkRSX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1SczEgZi1SaSAqLworCisgIEVYVFJBQ1RfSUZNVF9NT1ZEUl9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX1JzMSkgPSBmX1JzMTsKKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbW92MmRyIiwgImZfUnMxIDB4JXgiLCAneCcsIGZfUnMxLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JpKSA9IGZfUmk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX01PVjJQUykgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tb3YycHMuZgorICBFWFRSQUNUX0lGTVRfRElWMFNfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLW9wMyBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0RJVjBTX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9tb3YycHMiLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JpKSA9IGZfUmk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0pNUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2ptcC5mCisgIEVYVFJBQ1RfSUZNVF9ESVYwU19WQVJTIC8qIGYtb3AxIGYtb3AyIGYtb3AzIGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfRElWMFNfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07CisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfam1wIiwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9DQUxMUikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NhbGxyLmYKKyAgRVhUUkFDVF9JRk1UX0RJVjBTX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1vcDMgZi1SaSAqLworCisgIEVYVFJBQ1RfSUZNVF9ESVYwU19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QgKGFidWYpOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9jYWxsciIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQ0FMTCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NhbGwuZgorICBFWFRSQUNUX0lGTVRfQ0FMTF9WQVJTIC8qIGYtb3AxIGYtb3A1IGYtcmVsMTIgKi8KKworICBFWFRSQUNUX0lGTVRfQ0FMTF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX2xhYmVsMTIpID0gZl9yZWwxMjsKKyAgU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QgKGFidWYpOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9jYWxsIiwgImxhYmVsMTIgMHgleCIsICd4JywgZl9yZWwxMiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1JFVCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X3JldC5mCisgIEVYVFJBQ1RfSUZNVF9ESVYzX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1vcDMgZi1vcDQgKi8KKworICBFWFRSQUNUX0lGTVRfRElWM19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QgKGFidWYpOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9yZXQiLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfSU5UKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfaW50LmYKKyAgRVhUUkFDVF9JRk1UX0lOVF9WQVJTIC8qIGYtb3AxIGYtb3AyIGYtdTggKi8KKworICBFWFRSQUNUX0lGTVRfSU5UX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfdTgpID0gZl91ODsKKyAgU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QgKGFidWYpOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9pbnQiLCAiZl91OCAweCV4IiwgJ3gnLCBmX3U4LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfSU5URSkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2ludGUuZgorICBFWFRSQUNUX0lGTVRfRElWM19WQVJTIC8qIGYtb3AxIGYtb3AyIGYtb3AzIGYtb3A0ICovCisKKyAgRVhUUkFDVF9JRk1UX0RJVjNfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfaW50ZSIsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9SRVRJKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfcmV0aS5mCisgIEVYVFJBQ1RfSUZNVF9ESVYzX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1vcDMgZi1vcDQgKi8KKworICBFWFRSQUNUX0lGTVRfRElWM19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QgKGFidWYpOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9yZXRpIiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0JSQUQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9icmFkLmYKKyAgRVhUUkFDVF9JRk1UX0JSQURfVkFSUyAvKiBmLW9wMSBmLWNjIGYtcmVsOSAqLworCisgIEVYVFJBQ1RfSUZNVF9CUkFEX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfbGFiZWw5KSA9IGZfcmVsOTsKKyAgU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QgKGFidWYpOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9icmFkIiwgImxhYmVsOSAweCV4IiwgJ3gnLCBmX3JlbDksIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9CTk9EKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Jub2QuZgorICBFWFRSQUNUX0lGTVRfQlJBRF9WQVJTIC8qIGYtb3AxIGYtY2MgZi1yZWw5ICovCisKKyAgRVhUUkFDVF9JRk1UX0JSQURfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2Jub2QiLCAoY2hhciAqKSAwKSk7CisKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQkVRRCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcWQuZgorICBFWFRSQUNUX0lGTVRfQlJBRF9WQVJTIC8qIGYtb3AxIGYtY2MgZi1yZWw5ICovCisKKyAgRVhUUkFDVF9JRk1UX0JSQURfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9sYWJlbDkpID0gZl9yZWw5OworICBTRU1fQlJBTkNIX0lOSVRfRVhUUkFDVCAoYWJ1Zik7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2JlcWQiLCAibGFiZWw5IDB4JXgiLCAneCcsIGZfcmVsOSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0JDRCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JjZC5mCisgIEVYVFJBQ1RfSUZNVF9CUkFEX1ZBUlMgLyogZi1vcDEgZi1jYyBmLXJlbDkgKi8KKworICBFWFRSQUNUX0lGTVRfQlJBRF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX2xhYmVsOSkgPSBmX3JlbDk7CisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfYmNkIiwgImxhYmVsOSAweCV4IiwgJ3gnLCBmX3JlbDksIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9CTkQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibmQuZgorICBFWFRSQUNUX0lGTVRfQlJBRF9WQVJTIC8qIGYtb3AxIGYtY2MgZi1yZWw5ICovCisKKyAgRVhUUkFDVF9JRk1UX0JSQURfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9sYWJlbDkpID0gZl9yZWw5OworICBTRU1fQlJBTkNIX0lOSVRfRVhUUkFDVCAoYWJ1Zik7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2JuZCIsICJsYWJlbDkgMHgleCIsICd4JywgZl9yZWw5LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQlZEKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYnZkLmYKKyAgRVhUUkFDVF9JRk1UX0JSQURfVkFSUyAvKiBmLW9wMSBmLWNjIGYtcmVsOSAqLworCisgIEVYVFJBQ1RfSUZNVF9CUkFEX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfbGFiZWw5KSA9IGZfcmVsOTsKKyAgU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QgKGFidWYpOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9idmQiLCAibGFiZWw5IDB4JXgiLCAneCcsIGZfcmVsOSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0JMVEQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibHRkLmYKKyAgRVhUUkFDVF9JRk1UX0JSQURfVkFSUyAvKiBmLW9wMSBmLWNjIGYtcmVsOSAqLworCisgIEVYVFJBQ1RfSUZNVF9CUkFEX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfbGFiZWw5KSA9IGZfcmVsOTsKKyAgU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QgKGFidWYpOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9ibHRkIiwgImxhYmVsOSAweCV4IiwgJ3gnLCBmX3JlbDksIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9CTEVEKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmxlZC5mCisgIEVYVFJBQ1RfSUZNVF9CUkFEX1ZBUlMgLyogZi1vcDEgZi1jYyBmLXJlbDkgKi8KKworICBFWFRSQUNUX0lGTVRfQlJBRF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX2xhYmVsOSkgPSBmX3JlbDk7CisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfYmxlZCIsICJsYWJlbDkgMHgleCIsICd4JywgZl9yZWw5LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQkxTRCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2Jsc2QuZgorICBFWFRSQUNUX0lGTVRfQlJBRF9WQVJTIC8qIGYtb3AxIGYtY2MgZi1yZWw5ICovCisKKyAgRVhUUkFDVF9JRk1UX0JSQURfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9sYWJlbDkpID0gZl9yZWw5OworICBTRU1fQlJBTkNIX0lOSVRfRVhUUkFDVCAoYWJ1Zik7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2Jsc2QiLCAibGFiZWw5IDB4JXgiLCAneCcsIGZfcmVsOSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0RNT1ZSMTMpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZG1vdnIxMy5mCisgIEVYVFJBQ1RfSUZNVF9ETU9WUjEzX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1kaXIxMCAqLworCisgIEVYVFJBQ1RfSUZNVF9ETU9WUjEzX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfZGlyMTApID0gZl9kaXIxMDsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfZG1vdnIxMyIsICJmX2RpcjEwIDB4JXgiLCAneCcsIGZfZGlyMTAsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9oX2dyXzEzKSA9IDEzOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9ETU9WUjEzSCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92cjEzaC5mCisgIEVYVFJBQ1RfSUZNVF9ETU9WUjEzSF9WQVJTIC8qIGYtb3AxIGYtb3AyIGYtZGlyOSAqLworCisgIEVYVFJBQ1RfSUZNVF9ETU9WUjEzSF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX2RpcjkpID0gZl9kaXI5OworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9kbW92cjEzaCIsICJmX2RpcjkgMHgleCIsICd4JywgZl9kaXI5LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5faF9ncl8xMykgPSAxMzsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfRE1PVlIxM0IpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZG1vdnIxM2IuZgorICBFWFRSQUNUX0lGTVRfRE1PVlIxM0JfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLWRpcjggKi8KKworICBFWFRSQUNUX0lGTVRfRE1PVlIxM0JfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9kaXI4KSA9IGZfZGlyODsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfZG1vdnIxM2IiLCAiZl9kaXI4IDB4JXgiLCAneCcsIGZfZGlyOCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2hfZ3JfMTMpID0gMTM7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0RNT1ZSMTNQSSkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92cjEzcGkuZgorICBFWFRSQUNUX0lGTVRfRE1PVlIxM19WQVJTIC8qIGYtb3AxIGYtb3AyIGYtZGlyMTAgKi8KKworICBFWFRSQUNUX0lGTVRfRE1PVlIxM19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX2RpcjEwKSA9IGZfZGlyMTA7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2Rtb3ZyMTNwaSIsICJmX2RpcjEwIDB4JXgiLCAneCcsIGZfZGlyMTAsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9oX2dyXzEzKSA9IDEzOworICAgICAgRkxEIChvdXRfaF9ncl8xMykgPSAxMzsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfRE1PVlIxM1BJSCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92cjEzcGloLmYKKyAgRVhUUkFDVF9JRk1UX0RNT1ZSMTNIX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1kaXI5ICovCisKKyAgRVhUUkFDVF9JRk1UX0RNT1ZSMTNIX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfZGlyOSkgPSBmX2Rpcjk7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2Rtb3ZyMTNwaWgiLCAiZl9kaXI5IDB4JXgiLCAneCcsIGZfZGlyOSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2hfZ3JfMTMpID0gMTM7CisgICAgICBGTEQgKG91dF9oX2dyXzEzKSA9IDEzOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9ETU9WUjEzUElCKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3ZyMTNwaWIuZgorICBFWFRSQUNUX0lGTVRfRE1PVlIxM0JfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLWRpcjggKi8KKworICBFWFRSQUNUX0lGTVRfRE1PVlIxM0JfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9kaXI4KSA9IGZfZGlyODsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfZG1vdnIxM3BpYiIsICJmX2RpcjggMHgleCIsICd4JywgZl9kaXI4LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5faF9ncl8xMykgPSAxMzsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTMpID0gMTM7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0RNT1ZSMTVQSSkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92cjE1cGkuZgorICBFWFRSQUNUX0lGTVRfRE1PVlIxM19WQVJTIC8qIGYtb3AxIGYtb3AyIGYtZGlyMTAgKi8KKworICBFWFRSQUNUX0lGTVRfRE1PVlIxM19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX2RpcjEwKSA9IGZfZGlyMTA7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2Rtb3ZyMTVwaSIsICJmX2RpcjEwIDB4JXgiLCAneCcsIGZfZGlyMTAsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9oX2dyXzE1KSA9IDE1OworICAgICAgRkxEIChvdXRfaF9ncl8xNSkgPSAxNTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfRE1PVjJSMTMpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZG1vdjJyMTMuZgorICBFWFRSQUNUX0lGTVRfRE1PVlIxM19WQVJTIC8qIGYtb3AxIGYtb3AyIGYtZGlyMTAgKi8KKworICBFWFRSQUNUX0lGTVRfRE1PVlIxM19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX2RpcjEwKSA9IGZfZGlyMTA7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2Rtb3YycjEzIiwgImZfZGlyMTAgMHgleCIsICd4JywgZl9kaXIxMCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9oX2dyXzEzKSA9IDEzOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9ETU9WMlIxM0gpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZG1vdjJyMTNoLmYKKyAgRVhUUkFDVF9JRk1UX0RNT1ZSMTNIX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1kaXI5ICovCisKKyAgRVhUUkFDVF9JRk1UX0RNT1ZSMTNIX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfZGlyOSkgPSBmX2Rpcjk7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2Rtb3YycjEzaCIsICJmX2RpcjkgMHgleCIsICd4JywgZl9kaXI5LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTMpID0gMTM7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0RNT1YyUjEzQikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92MnIxM2IuZgorICBFWFRSQUNUX0lGTVRfRE1PVlIxM0JfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLWRpcjggKi8KKworICBFWFRSQUNUX0lGTVRfRE1PVlIxM0JfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9kaXI4KSA9IGZfZGlyODsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfZG1vdjJyMTNiIiwgImZfZGlyOCAweCV4IiwgJ3gnLCBmX2RpcjgsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChvdXRfaF9ncl8xMykgPSAxMzsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfRE1PVjJSMTNQSSkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92MnIxM3BpLmYKKyAgRVhUUkFDVF9JRk1UX0RNT1ZSMTNfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLWRpcjEwICovCisKKyAgRVhUUkFDVF9JRk1UX0RNT1ZSMTNfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9kaXIxMCkgPSBmX2RpcjEwOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9kbW92MnIxM3BpIiwgImZfZGlyMTAgMHgleCIsICd4JywgZl9kaXIxMCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2hfZ3JfMTMpID0gMTM7CisgICAgICBGTEQgKG91dF9oX2dyXzEzKSA9IDEzOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9ETU9WMlIxM1BJSCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92MnIxM3BpaC5mCisgIEVYVFJBQ1RfSUZNVF9ETU9WUjEzSF9WQVJTIC8qIGYtb3AxIGYtb3AyIGYtZGlyOSAqLworCisgIEVYVFJBQ1RfSUZNVF9ETU9WUjEzSF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX2RpcjkpID0gZl9kaXI5OworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9kbW92MnIxM3BpaCIsICJmX2RpcjkgMHgleCIsICd4JywgZl9kaXI5LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5faF9ncl8xMykgPSAxMzsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTMpID0gMTM7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0RNT1YyUjEzUElCKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3YycjEzcGliLmYKKyAgRVhUUkFDVF9JRk1UX0RNT1ZSMTNCX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1kaXI4ICovCisKKyAgRVhUUkFDVF9JRk1UX0RNT1ZSMTNCX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfZGlyOCkgPSBmX2Rpcjg7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2Rtb3YycjEzcGliIiwgImZfZGlyOCAweCV4IiwgJ3gnLCBmX2RpcjgsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9oX2dyXzEzKSA9IDEzOworICAgICAgRkxEIChvdXRfaF9ncl8xMykgPSAxMzsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfRE1PVjJSMTVQRCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92MnIxNXBkLmYKKyAgRVhUUkFDVF9JRk1UX0RNT1ZSMTNfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLWRpcjEwICovCisKKyAgRVhUUkFDVF9JRk1UX0RNT1ZSMTNfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9kaXIxMCkgPSBmX2RpcjEwOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9kbW92MnIxNXBkIiwgImZfZGlyMTAgMHgleCIsICd4JywgZl9kaXIxMCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2hfZ3JfMTUpID0gMTU7CisgICAgICBGTEQgKG91dF9oX2dyXzE1KSA9IDE1OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRFJFUykgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHJlcy5mCisgIEVYVFJBQ1RfSUZNVF9BRERJX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi11NCBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0FERElfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkcmVzIiwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOworICAgICAgRkxEIChvdXRfUmkpID0gZl9SaTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQ09QT1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY29wb3AuZgorICBFWFRSQUNUX0lGTVRfQ09QT1BfVkFSUyAvKiBmLW9wMSBmLWNjYyBmLW9wMiBmLW9wMyBmLUNSaiBmLXU0YyBmLUNSaSAqLworCisgIEVYVFJBQ1RfSUZNVF9DT1BPUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfY29wb3AiLCAoY2hhciAqKSAwKSk7CisKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQ09QTEQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY29wbGQuZgorICBFWFRSQUNUX0lGTVRfQ09QTERfVkFSUyAvKiBmLW9wMSBmLWNjYyBmLW9wMiBmLW9wMyBmLVJqYyBmLXU0YyBmLUNSaSAqLworCisgIEVYVFJBQ1RfSUZNVF9DT1BMRF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfY29wbGQiLCAoY2hhciAqKSAwKSk7CisKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQ09QU1QpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY29wc3QuZgorICBFWFRSQUNUX0lGTVRfQ09QU1RfVkFSUyAvKiBmLW9wMSBmLWNjYyBmLW9wMiBmLW9wMyBmLUNSaiBmLXU0YyBmLVJpYyAqLworCisgIEVYVFJBQ1RfSUZNVF9DT1BTVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfY29wc3QiLCAoY2hhciAqKSAwKSk7CisKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTk9QKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vcC5mCisgIEVYVFJBQ1RfSUZNVF9ESVYzX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1vcDMgZi1vcDQgKi8KKworICBFWFRSQUNUX0lGTVRfRElWM19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbm9wIiwgKGNoYXIgKikgMCkpOworCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0FORENDUikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRjY3IuZgorICBFWFRSQUNUX0lGTVRfSU5UX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi11OCAqLworCisgIEVYVFJBQ1RfSUZNVF9JTlRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl91OCkgPSBmX3U4OworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9hbmRjY3IiLCAiZl91OCAweCV4IiwgJ3gnLCBmX3U4LCAoY2hhciAqKSAwKSk7CisKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RJTE0pIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RpbG0uZgorICBFWFRSQUNUX0lGTVRfSU5UX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi11OCAqLworCisgIEVYVFJBQ1RfSUZNVF9JTlRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl91OCkgPSBmX3U4OworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdGlsbSIsICJmX3U4IDB4JXgiLCAneCcsIGZfdTgsIChjaGFyICopIDApKTsKKworI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9BRERTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGRzcC5mCisgIEVYVFJBQ1RfSUZNVF9BRERTUF9WQVJTIC8qIGYtb3AxIGYtb3AyIGYtczEwICovCisKKyAgRVhUUkFDVF9JRk1UX0FERFNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfczEwKSA9IGZfczEwOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9hZGRzcCIsICJmX3MxMCAweCV4IiwgJ3gnLCBmX3MxMCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2hfZ3JfMTUpID0gMTU7CisgICAgICBGTEQgKG91dF9oX2dyXzE1KSA9IDE1OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9FWFRTQikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9leHRzYi5mCisgIEVYVFJBQ1RfSUZNVF9ESVYwU19WQVJTIC8qIGYtb3AxIGYtb3AyIGYtb3AzIGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfRElWMFNfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2V4dHNiIiwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOworICAgICAgRkxEIChvdXRfUmkpID0gZl9SaTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfRVhUVUIpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZXh0dWIuZgorICBFWFRSQUNUX0lGTVRfRElWMFNfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLW9wMyBmLVJpICovCisKKyAgRVhUUkFDVF9JRk1UX0RJVjBTX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9leHR1YiIsICJSaSAweCV4IiwgJ3gnLCBmX1JpLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKKyAgICAgIEZMRCAob3V0X1JpKSA9IGZfUmk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0VYVFNIKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2V4dHNoLmYKKyAgRVhUUkFDVF9JRk1UX0RJVjBTX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1vcDMgZi1SaSAqLworCisgIEVYVFJBQ1RfSUZNVF9ESVYwU19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX1JpKSA9ICYgQ1BVIChoX2dyKVtmX1JpXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfZXh0c2giLCAiUmkgMHgleCIsICd4JywgZl9SaSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX1JpKSA9IGZfUmk7CisgICAgICBGTEQgKG91dF9SaSkgPSBmX1JpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9FWFRVSCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9leHR1aC5mCisgIEVYVFJBQ1RfSUZNVF9ESVYwU19WQVJTIC8qIGYtb3AxIGYtb3AyIGYtb3AzIGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfRElWMFNfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9SaSkgPSAmIENQVSAoaF9ncilbZl9SaV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2V4dHVoIiwgIlJpIDB4JXgiLCAneCcsIGZfUmksIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9SaSkgPSBmX1JpOworICAgICAgRkxEIChvdXRfUmkpID0gZl9SaTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERNMCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG0wLmYKKyAgRVhUUkFDVF9JRk1UX0xETTBfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLXJlZ2xpc3RfbG93X2xkICovCisKKyAgRVhUUkFDVF9JRk1UX0xETTBfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9yZWdsaXN0X2xvd19sZCkgPSBmX3JlZ2xpc3RfbG93X2xkOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZG0wIiwgImZfcmVnbGlzdF9sb3dfbGQgMHgleCIsICd4JywgZl9yZWdsaXN0X2xvd19sZCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2hfZ3JfMTUpID0gMTU7CisgICAgICBGTEQgKG91dF9oX2dyXzApID0gMDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMSkgPSAxOworICAgICAgRkxEIChvdXRfaF9ncl8xNSkgPSAxNTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMikgPSAyOworICAgICAgRkxEIChvdXRfaF9ncl8zKSA9IDM7CisgICAgICBGTEQgKG91dF9oX2dyXzQpID0gNDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfNSkgPSA1OworICAgICAgRkxEIChvdXRfaF9ncl82KSA9IDY7CisgICAgICBGTEQgKG91dF9oX2dyXzcpID0gNzsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERNMSkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG0xLmYKKyAgRVhUUkFDVF9JRk1UX0xETTFfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLXJlZ2xpc3RfaGlfbGQgKi8KKworICBFWFRSQUNUX0lGTVRfTERNMV9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3JlZ2xpc3RfaGlfbGQpID0gZl9yZWdsaXN0X2hpX2xkOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZG0xIiwgImZfcmVnbGlzdF9oaV9sZCAweCV4IiwgJ3gnLCBmX3JlZ2xpc3RfaGlfbGQsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9oX2dyXzE1KSA9IDE1OworICAgICAgRkxEIChvdXRfaF9ncl8xMCkgPSAxMDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTEpID0gMTE7CisgICAgICBGTEQgKG91dF9oX2dyXzEyKSA9IDEyOworICAgICAgRkxEIChvdXRfaF9ncl8xMykgPSAxMzsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTQpID0gMTQ7CisgICAgICBGTEQgKG91dF9oX2dyXzE1KSA9IDE1OworICAgICAgRkxEIChvdXRfaF9ncl84KSA9IDg7CisgICAgICBGTEQgKG91dF9oX2dyXzkpID0gOTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RNMCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG0wLmYKKyAgRVhUUkFDVF9JRk1UX1NUTTBfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLXJlZ2xpc3RfbG93X3N0ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUTTBfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9yZWdsaXN0X2xvd19zdCkgPSBmX3JlZ2xpc3RfbG93X3N0OworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdG0wIiwgImZfcmVnbGlzdF9sb3dfc3QgMHgleCIsICd4JywgZl9yZWdsaXN0X2xvd19zdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2hfZ3JfMCkgPSAwOworICAgICAgRkxEIChpbl9oX2dyXzEpID0gMTsKKyAgICAgIEZMRCAoaW5faF9ncl8xNSkgPSAxNTsKKyAgICAgIEZMRCAoaW5faF9ncl8yKSA9IDI7CisgICAgICBGTEQgKGluX2hfZ3JfMykgPSAzOworICAgICAgRkxEIChpbl9oX2dyXzQpID0gNDsKKyAgICAgIEZMRCAoaW5faF9ncl81KSA9IDU7CisgICAgICBGTEQgKGluX2hfZ3JfNikgPSA2OworICAgICAgRkxEIChpbl9oX2dyXzcpID0gNzsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTUpID0gMTU7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUTTEpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RtMS5mCisgIEVYVFJBQ1RfSUZNVF9TVE0xX1ZBUlMgLyogZi1vcDEgZi1vcDIgZi1yZWdsaXN0X2hpX3N0ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUTTFfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9yZWdsaXN0X2hpX3N0KSA9IGZfcmVnbGlzdF9oaV9zdDsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RtMSIsICJmX3JlZ2xpc3RfaGlfc3QgMHgleCIsICd4JywgZl9yZWdsaXN0X2hpX3N0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5faF9ncl8xMCkgPSAxMDsKKyAgICAgIEZMRCAoaW5faF9ncl8xMSkgPSAxMTsKKyAgICAgIEZMRCAoaW5faF9ncl8xMikgPSAxMjsKKyAgICAgIEZMRCAoaW5faF9ncl8xMykgPSAxMzsKKyAgICAgIEZMRCAoaW5faF9ncl8xNCkgPSAxNDsKKyAgICAgIEZMRCAoaW5faF9ncl8xNSkgPSAxNTsKKyAgICAgIEZMRCAoaW5faF9ncl84KSA9IDg7CisgICAgICBGTEQgKGluX2hfZ3JfOSkgPSA5OworICAgICAgRkxEIChvdXRfaF9ncl8xNSkgPSAxNTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfRU5URVIpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW50ZXIuZgorICBFWFRSQUNUX0lGTVRfRU5URVJfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLXUxMCAqLworCisgIEVYVFJBQ1RfSUZNVF9FTlRFUl9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3UxMCkgPSBmX3UxMDsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfZW50ZXIiLCAiZl91MTAgMHgleCIsICd4JywgZl91MTAsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9oX2dyXzE0KSA9IDE0OworICAgICAgRkxEIChpbl9oX2dyXzE1KSA9IDE1OworICAgICAgRkxEIChvdXRfaF9ncl8xNCkgPSAxNDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTUpID0gMTU7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xFQVZFKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xlYXZlLmYKKyAgRVhUUkFDVF9JRk1UX0RJVjNfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLW9wMyBmLW9wNCAqLworCisgIEVYVFJBQ1RfSUZNVF9ESVYzX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZWF2ZSIsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9oX2dyXzE0KSA9IDE0OworICAgICAgRkxEIChpbl9oX2dyXzE1KSA9IDE1OworICAgICAgRkxEIChvdXRfaF9ncl8xNCkgPSAxNDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTUpID0gMTU7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1hDSEIpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfeGNoYi5mCisgIEVYVFJBQ1RfSUZNVF9BRERfVkFSUyAvKiBmLW9wMSBmLW9wMiBmLVJqIGYtUmkgKi8KKworICBFWFRSQUNUX0lGTVRfQUREX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfUmkpID0gJiBDUFUgKGhfZ3IpW2ZfUmldOworICBGTEQgKGlfUmopID0gJiBDUFUgKGhfZ3IpW2ZfUmpdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF94Y2hiIiwgIlJpIDB4JXgiLCAneCcsIGZfUmksICJSaiAweCV4IiwgJ3gnLCBmX1JqLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fUmkpID0gZl9SaTsKKyAgICAgIEZMRCAoaW5fUmopID0gZl9SajsKKyAgICAgIEZMRCAob3V0X1JpKSA9IGZfUmk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworCisgICAgICB9CisgICAgRU5EU1dJVENIIChleCkKKworICB9CisKKyAgcmV0dXJuIGlkZWNvZGUtPmlkZXNjOworfQpkaWZmIC0tZ2l0IGEvc2ltL2ZyMzAvZGVjb2RlLmggYi9zaW0vZnIzMC9kZWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmM5NDNlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2ZyMzAvZGVjb2RlLmgKQEAgLTAsMCArMSwyODkgQEAKKy8qIERlY29kZSBoZWFkZXIgZm9yIGZyMzBiZi4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2lmbmRlZiBGUjMwQkZfREVDT0RFX0gKKyNkZWZpbmUgRlIzMEJGX0RFQ09ERV9ICisKK2V4dGVybiBjb25zdCBJREVTQyAqZnIzMGJmX2RlY29kZSAoU0lNX0NQVSAqLCBJQUREUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR0VOX0lOU05fSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSR0JVRiAqKTsKK2V4dGVybiB2b2lkIGZyMzBiZl9pbml0X2lkZXNjX3RhYmxlIChTSU1fQ1BVICopOworCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnN0cnVjdGlvbnMgaW4gY3B1IGZhbWlseSBmcjMwYmYuICAqLwordHlwZWRlZiBlbnVtIGZyMzBiZl9pbnNuX3R5cGUgeworICBGUjMwQkZfSU5TTl9YX0lOVkFMSUQsIEZSMzBCRl9JTlNOX1hfQUZURVIsIEZSMzBCRl9JTlNOX1hfQkVGT1JFLCBGUjMwQkZfSU5TTl9YX0NUSV9DSEFJTgorICwgRlIzMEJGX0lOU05fWF9DSEFJTiwgRlIzMEJGX0lOU05fWF9CRUdJTiwgRlIzMEJGX0lOU05fQURELCBGUjMwQkZfSU5TTl9BRERJCisgLCBGUjMwQkZfSU5TTl9BREQyLCBGUjMwQkZfSU5TTl9BRERDLCBGUjMwQkZfSU5TTl9BREROLCBGUjMwQkZfSU5TTl9BREROSQorICwgRlIzMEJGX0lOU05fQURETjIsIEZSMzBCRl9JTlNOX1NVQiwgRlIzMEJGX0lOU05fU1VCQywgRlIzMEJGX0lOU05fU1VCTgorICwgRlIzMEJGX0lOU05fQ01QLCBGUjMwQkZfSU5TTl9DTVBJLCBGUjMwQkZfSU5TTl9DTVAyLCBGUjMwQkZfSU5TTl9BTkQKKyAsIEZSMzBCRl9JTlNOX09SLCBGUjMwQkZfSU5TTl9FT1IsIEZSMzBCRl9JTlNOX0FORE0sIEZSMzBCRl9JTlNOX0FOREgKKyAsIEZSMzBCRl9JTlNOX0FOREIsIEZSMzBCRl9JTlNOX09STSwgRlIzMEJGX0lOU05fT1JILCBGUjMwQkZfSU5TTl9PUkIKKyAsIEZSMzBCRl9JTlNOX0VPUk0sIEZSMzBCRl9JTlNOX0VPUkgsIEZSMzBCRl9JTlNOX0VPUkIsIEZSMzBCRl9JTlNOX0JBTkRMCisgLCBGUjMwQkZfSU5TTl9CT1JMLCBGUjMwQkZfSU5TTl9CRU9STCwgRlIzMEJGX0lOU05fQkFOREgsIEZSMzBCRl9JTlNOX0JPUkgKKyAsIEZSMzBCRl9JTlNOX0JFT1JILCBGUjMwQkZfSU5TTl9CVFNUTCwgRlIzMEJGX0lOU05fQlRTVEgsIEZSMzBCRl9JTlNOX01VTAorICwgRlIzMEJGX0lOU05fTVVMVSwgRlIzMEJGX0lOU05fTVVMSCwgRlIzMEJGX0lOU05fTVVMVUgsIEZSMzBCRl9JTlNOX0RJVjBTCisgLCBGUjMwQkZfSU5TTl9ESVYwVSwgRlIzMEJGX0lOU05fRElWMSwgRlIzMEJGX0lOU05fRElWMiwgRlIzMEJGX0lOU05fRElWMworICwgRlIzMEJGX0lOU05fRElWNFMsIEZSMzBCRl9JTlNOX0xTTCwgRlIzMEJGX0lOU05fTFNMSSwgRlIzMEJGX0lOU05fTFNMMgorICwgRlIzMEJGX0lOU05fTFNSLCBGUjMwQkZfSU5TTl9MU1JJLCBGUjMwQkZfSU5TTl9MU1IyLCBGUjMwQkZfSU5TTl9BU1IKKyAsIEZSMzBCRl9JTlNOX0FTUkksIEZSMzBCRl9JTlNOX0FTUjIsIEZSMzBCRl9JTlNOX0xESTgsIEZSMzBCRl9JTlNOX0xESTIwCisgLCBGUjMwQkZfSU5TTl9MREkzMiwgRlIzMEJGX0lOU05fTEQsIEZSMzBCRl9JTlNOX0xEVUgsIEZSMzBCRl9JTlNOX0xEVUIKKyAsIEZSMzBCRl9JTlNOX0xEUjEzLCBGUjMwQkZfSU5TTl9MRFIxM1VILCBGUjMwQkZfSU5TTl9MRFIxM1VCLCBGUjMwQkZfSU5TTl9MRFIxNAorICwgRlIzMEJGX0lOU05fTERSMTRVSCwgRlIzMEJGX0lOU05fTERSMTRVQiwgRlIzMEJGX0lOU05fTERSMTUsIEZSMzBCRl9JTlNOX0xEUjE1R1IKKyAsIEZSMzBCRl9JTlNOX0xEUjE1RFIsIEZSMzBCRl9JTlNOX0xEUjE1UFMsIEZSMzBCRl9JTlNOX1NULCBGUjMwQkZfSU5TTl9TVEgKKyAsIEZSMzBCRl9JTlNOX1NUQiwgRlIzMEJGX0lOU05fU1RSMTMsIEZSMzBCRl9JTlNOX1NUUjEzSCwgRlIzMEJGX0lOU05fU1RSMTNCCisgLCBGUjMwQkZfSU5TTl9TVFIxNCwgRlIzMEJGX0lOU05fU1RSMTRILCBGUjMwQkZfSU5TTl9TVFIxNEIsIEZSMzBCRl9JTlNOX1NUUjE1CisgLCBGUjMwQkZfSU5TTl9TVFIxNUdSLCBGUjMwQkZfSU5TTl9TVFIxNURSLCBGUjMwQkZfSU5TTl9TVFIxNVBTLCBGUjMwQkZfSU5TTl9NT1YKKyAsIEZSMzBCRl9JTlNOX01PVkRSLCBGUjMwQkZfSU5TTl9NT1ZQUywgRlIzMEJGX0lOU05fTU9WMkRSLCBGUjMwQkZfSU5TTl9NT1YyUFMKKyAsIEZSMzBCRl9JTlNOX0pNUCwgRlIzMEJGX0lOU05fSk1QRCwgRlIzMEJGX0lOU05fQ0FMTFIsIEZSMzBCRl9JTlNOX0NBTExSRAorICwgRlIzMEJGX0lOU05fQ0FMTCwgRlIzMEJGX0lOU05fQ0FMTEQsIEZSMzBCRl9JTlNOX1JFVCwgRlIzMEJGX0lOU05fUkVUX0QKKyAsIEZSMzBCRl9JTlNOX0lOVCwgRlIzMEJGX0lOU05fSU5URSwgRlIzMEJGX0lOU05fUkVUSSwgRlIzMEJGX0lOU05fQlJBRAorICwgRlIzMEJGX0lOU05fQlJBLCBGUjMwQkZfSU5TTl9CTk9ELCBGUjMwQkZfSU5TTl9CTk8sIEZSMzBCRl9JTlNOX0JFUUQKKyAsIEZSMzBCRl9JTlNOX0JFUSwgRlIzMEJGX0lOU05fQk5FRCwgRlIzMEJGX0lOU05fQk5FLCBGUjMwQkZfSU5TTl9CQ0QKKyAsIEZSMzBCRl9JTlNOX0JDLCBGUjMwQkZfSU5TTl9CTkNELCBGUjMwQkZfSU5TTl9CTkMsIEZSMzBCRl9JTlNOX0JORAorICwgRlIzMEJGX0lOU05fQk4sIEZSMzBCRl9JTlNOX0JQRCwgRlIzMEJGX0lOU05fQlAsIEZSMzBCRl9JTlNOX0JWRAorICwgRlIzMEJGX0lOU05fQlYsIEZSMzBCRl9JTlNOX0JOVkQsIEZSMzBCRl9JTlNOX0JOViwgRlIzMEJGX0lOU05fQkxURAorICwgRlIzMEJGX0lOU05fQkxULCBGUjMwQkZfSU5TTl9CR0VELCBGUjMwQkZfSU5TTl9CR0UsIEZSMzBCRl9JTlNOX0JMRUQKKyAsIEZSMzBCRl9JTlNOX0JMRSwgRlIzMEJGX0lOU05fQkdURCwgRlIzMEJGX0lOU05fQkdULCBGUjMwQkZfSU5TTl9CTFNECisgLCBGUjMwQkZfSU5TTl9CTFMsIEZSMzBCRl9JTlNOX0JISUQsIEZSMzBCRl9JTlNOX0JISSwgRlIzMEJGX0lOU05fRE1PVlIxMworICwgRlIzMEJGX0lOU05fRE1PVlIxM0gsIEZSMzBCRl9JTlNOX0RNT1ZSMTNCLCBGUjMwQkZfSU5TTl9ETU9WUjEzUEksIEZSMzBCRl9JTlNOX0RNT1ZSMTNQSUgKKyAsIEZSMzBCRl9JTlNOX0RNT1ZSMTNQSUIsIEZSMzBCRl9JTlNOX0RNT1ZSMTVQSSwgRlIzMEJGX0lOU05fRE1PVjJSMTMsIEZSMzBCRl9JTlNOX0RNT1YyUjEzSAorICwgRlIzMEJGX0lOU05fRE1PVjJSMTNCLCBGUjMwQkZfSU5TTl9ETU9WMlIxM1BJLCBGUjMwQkZfSU5TTl9ETU9WMlIxM1BJSCwgRlIzMEJGX0lOU05fRE1PVjJSMTNQSUIKKyAsIEZSMzBCRl9JTlNOX0RNT1YyUjE1UEQsIEZSMzBCRl9JTlNOX0xEUkVTLCBGUjMwQkZfSU5TTl9TVFJFUywgRlIzMEJGX0lOU05fQ09QT1AKKyAsIEZSMzBCRl9JTlNOX0NPUExELCBGUjMwQkZfSU5TTl9DT1BTVCwgRlIzMEJGX0lOU05fQ09QU1YsIEZSMzBCRl9JTlNOX05PUAorICwgRlIzMEJGX0lOU05fQU5EQ0NSLCBGUjMwQkZfSU5TTl9PUkNDUiwgRlIzMEJGX0lOU05fU1RJTE0sIEZSMzBCRl9JTlNOX0FERFNQCisgLCBGUjMwQkZfSU5TTl9FWFRTQiwgRlIzMEJGX0lOU05fRVhUVUIsIEZSMzBCRl9JTlNOX0VYVFNILCBGUjMwQkZfSU5TTl9FWFRVSAorICwgRlIzMEJGX0lOU05fTERNMCwgRlIzMEJGX0lOU05fTERNMSwgRlIzMEJGX0lOU05fU1RNMCwgRlIzMEJGX0lOU05fU1RNMQorICwgRlIzMEJGX0lOU05fRU5URVIsIEZSMzBCRl9JTlNOX0xFQVZFLCBGUjMwQkZfSU5TTl9YQ0hCLCBGUjMwQkZfSU5TTl9NQVgKK30gRlIzMEJGX0lOU05fVFlQRTsKKworI2lmICEgV0lUSF9TRU1fU1dJVENIX0ZVTEwKKyNkZWZpbmUgU0VNRlVMTChmbikgZXh0ZXJuIFNFTUFOVElDX0ZOIENPTkNBVDMgKGZyMzBiZixfc2VtXyxmbik7CisjZWxzZQorI2RlZmluZSBTRU1GVUxMKGZuKQorI2VuZGlmCisKKyNpZiAhIFdJVEhfU0VNX1NXSVRDSF9GQVNUCisjZGVmaW5lIFNFTUZBU1QoZm4pIGV4dGVybiBTRU1BTlRJQ19GTiBDT05DQVQzIChmcjMwYmYsX3NlbWZfLGZuKTsKKyNlbHNlCisjZGVmaW5lIFNFTUZBU1QoZm4pCisjZW5kaWYKKworI2RlZmluZSBTRU0oZm4pIFNFTUZVTEwgKGZuKSBTRU1GQVNUIChmbikKKworLyogVGhlIGZ1bmN0aW9uIHZlcnNpb24gb2YgdGhlIGJlZm9yZS9hZnRlciBoYW5kbGVycyBpcyBhbHdheXMgbmVlZGVkLAorICAgc28gd2UgYWx3YXlzIHdhbnQgdGhlIFNFTUZVTEwgZGVjbGFyYXRpb24gb2YgdGhlbS4gICovCitleHRlcm4gU0VNQU5USUNfRk4gQ09OQ0FUMyAoZnIzMGJmLF9zZW1fLHhfYmVmb3JlKTsKK2V4dGVybiBTRU1BTlRJQ19GTiBDT05DQVQzIChmcjMwYmYsX3NlbV8seF9hZnRlcik7CisKK1NFTSAoeF9pbnZhbGlkKQorU0VNICh4X2FmdGVyKQorU0VNICh4X2JlZm9yZSkKK1NFTSAoeF9jdGlfY2hhaW4pCitTRU0gKHhfY2hhaW4pCitTRU0gKHhfYmVnaW4pCitTRU0gKGFkZCkKK1NFTSAoYWRkaSkKK1NFTSAoYWRkMikKK1NFTSAoYWRkYykKK1NFTSAoYWRkbikKK1NFTSAoYWRkbmkpCitTRU0gKGFkZG4yKQorU0VNIChzdWIpCitTRU0gKHN1YmMpCitTRU0gKHN1Ym4pCitTRU0gKGNtcCkKK1NFTSAoY21waSkKK1NFTSAoY21wMikKK1NFTSAoYW5kKQorU0VNIChvcikKK1NFTSAoZW9yKQorU0VNIChhbmRtKQorU0VNIChhbmRoKQorU0VNIChhbmRiKQorU0VNIChvcm0pCitTRU0gKG9yaCkKK1NFTSAob3JiKQorU0VNIChlb3JtKQorU0VNIChlb3JoKQorU0VNIChlb3JiKQorU0VNIChiYW5kbCkKK1NFTSAoYm9ybCkKK1NFTSAoYmVvcmwpCitTRU0gKGJhbmRoKQorU0VNIChib3JoKQorU0VNIChiZW9yaCkKK1NFTSAoYnRzdGwpCitTRU0gKGJ0c3RoKQorU0VNIChtdWwpCitTRU0gKG11bHUpCitTRU0gKG11bGgpCitTRU0gKG11bHVoKQorU0VNIChkaXYwcykKK1NFTSAoZGl2MHUpCitTRU0gKGRpdjEpCitTRU0gKGRpdjIpCitTRU0gKGRpdjMpCitTRU0gKGRpdjRzKQorU0VNIChsc2wpCitTRU0gKGxzbGkpCitTRU0gKGxzbDIpCitTRU0gKGxzcikKK1NFTSAobHNyaSkKK1NFTSAobHNyMikKK1NFTSAoYXNyKQorU0VNIChhc3JpKQorU0VNIChhc3IyKQorU0VNIChsZGk4KQorU0VNIChsZGkyMCkKK1NFTSAobGRpMzIpCitTRU0gKGxkKQorU0VNIChsZHVoKQorU0VNIChsZHViKQorU0VNIChsZHIxMykKK1NFTSAobGRyMTN1aCkKK1NFTSAobGRyMTN1YikKK1NFTSAobGRyMTQpCitTRU0gKGxkcjE0dWgpCitTRU0gKGxkcjE0dWIpCitTRU0gKGxkcjE1KQorU0VNIChsZHIxNWdyKQorU0VNIChsZHIxNWRyKQorU0VNIChsZHIxNXBzKQorU0VNIChzdCkKK1NFTSAoc3RoKQorU0VNIChzdGIpCitTRU0gKHN0cjEzKQorU0VNIChzdHIxM2gpCitTRU0gKHN0cjEzYikKK1NFTSAoc3RyMTQpCitTRU0gKHN0cjE0aCkKK1NFTSAoc3RyMTRiKQorU0VNIChzdHIxNSkKK1NFTSAoc3RyMTVncikKK1NFTSAoc3RyMTVkcikKK1NFTSAoc3RyMTVwcykKK1NFTSAobW92KQorU0VNIChtb3ZkcikKK1NFTSAobW92cHMpCitTRU0gKG1vdjJkcikKK1NFTSAobW92MnBzKQorU0VNIChqbXApCitTRU0gKGptcGQpCitTRU0gKGNhbGxyKQorU0VNIChjYWxscmQpCitTRU0gKGNhbGwpCitTRU0gKGNhbGxkKQorU0VNIChyZXQpCitTRU0gKHJldF9kKQorU0VNIChpbnQpCitTRU0gKGludGUpCitTRU0gKHJldGkpCitTRU0gKGJyYWQpCitTRU0gKGJyYSkKK1NFTSAoYm5vZCkKK1NFTSAoYm5vKQorU0VNIChiZXFkKQorU0VNIChiZXEpCitTRU0gKGJuZWQpCitTRU0gKGJuZSkKK1NFTSAoYmNkKQorU0VNIChiYykKK1NFTSAoYm5jZCkKK1NFTSAoYm5jKQorU0VNIChibmQpCitTRU0gKGJuKQorU0VNIChicGQpCitTRU0gKGJwKQorU0VNIChidmQpCitTRU0gKGJ2KQorU0VNIChibnZkKQorU0VNIChibnYpCitTRU0gKGJsdGQpCitTRU0gKGJsdCkKK1NFTSAoYmdlZCkKK1NFTSAoYmdlKQorU0VNIChibGVkKQorU0VNIChibGUpCitTRU0gKGJndGQpCitTRU0gKGJndCkKK1NFTSAoYmxzZCkKK1NFTSAoYmxzKQorU0VNIChiaGlkKQorU0VNIChiaGkpCitTRU0gKGRtb3ZyMTMpCitTRU0gKGRtb3ZyMTNoKQorU0VNIChkbW92cjEzYikKK1NFTSAoZG1vdnIxM3BpKQorU0VNIChkbW92cjEzcGloKQorU0VNIChkbW92cjEzcGliKQorU0VNIChkbW92cjE1cGkpCitTRU0gKGRtb3YycjEzKQorU0VNIChkbW92MnIxM2gpCitTRU0gKGRtb3YycjEzYikKK1NFTSAoZG1vdjJyMTNwaSkKK1NFTSAoZG1vdjJyMTNwaWgpCitTRU0gKGRtb3YycjEzcGliKQorU0VNIChkbW92MnIxNXBkKQorU0VNIChsZHJlcykKK1NFTSAoc3RyZXMpCitTRU0gKGNvcG9wKQorU0VNIChjb3BsZCkKK1NFTSAoY29wc3QpCitTRU0gKGNvcHN2KQorU0VNIChub3ApCitTRU0gKGFuZGNjcikKK1NFTSAob3JjY3IpCitTRU0gKHN0aWxtKQorU0VNIChhZGRzcCkKK1NFTSAoZXh0c2IpCitTRU0gKGV4dHViKQorU0VNIChleHRzaCkKK1NFTSAoZXh0dWgpCitTRU0gKGxkbTApCitTRU0gKGxkbTEpCitTRU0gKHN0bTApCitTRU0gKHN0bTEpCitTRU0gKGVudGVyKQorU0VNIChsZWF2ZSkKK1NFTSAoeGNoYikKKworI3VuZGVmIFNFTUZVTEwKKyN1bmRlZiBTRU1GQVNUCisjdW5kZWYgU0VNCisKKy8qIEZ1bmN0aW9uIHVuaXQgaGFuZGxlcnMgKHVzZXIgd3JpdHRlbikuICAqLworCitleHRlcm4gaW50IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG0gKFNJTV9DUFUgKiwgY29uc3QgSURFU0MgKiwgaW50IC8qdW5pdF9udW0qLywgaW50IC8qcmVmZXJlbmNlZCovLCBJTlQgLypyZWdsaXN0Ki8pOworZXh0ZXJuIGludCBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbGRtIChTSU1fQ1BVICosIGNvbnN0IElERVNDICosIGludCAvKnVuaXRfbnVtKi8sIGludCAvKnJlZmVyZW5jZWQqLywgSU5UIC8qcmVnbGlzdCovKTsKK2V4dGVybiBpbnQgZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChTSU1fQ1BVICosIGNvbnN0IElERVNDICosIGludCAvKnVuaXRfbnVtKi8sIGludCAvKnJlZmVyZW5jZWQqLywgSU5UIC8qUmkqLywgSU5UIC8qUmoqLyk7CitleHRlcm4gaW50IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChTSU1fQ1BVICosIGNvbnN0IElERVNDICosIGludCAvKnVuaXRfbnVtKi8sIGludCAvKnJlZmVyZW5jZWQqLywgSU5UIC8qUmoqLywgSU5UIC8qUmkqLyk7CitleHRlcm4gaW50IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKFNJTV9DUFUgKiwgY29uc3QgSURFU0MgKiwgaW50IC8qdW5pdF9udW0qLywgaW50IC8qcmVmZXJlbmNlZCovLCBJTlQgLypSaSovKTsKK2V4dGVybiBpbnQgZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKFNJTV9DUFUgKiwgY29uc3QgSURFU0MgKiwgaW50IC8qdW5pdF9udW0qLywgaW50IC8qcmVmZXJlbmNlZCovLCBJTlQgLypSaSovLCBJTlQgLypSaiovLCBJTlQgLypSaSovKTsKKworLyogUHJvZmlsaW5nIGJlZm9yZS9hZnRlciBoYW5kbGVycyAodXNlciB3cml0dGVuKSAqLworCitleHRlcm4gdm9pZCBmcjMwYmZfbW9kZWxfaW5zbl9iZWZvcmUgKFNJTV9DUFUgKiwgaW50IC8qZmlyc3RfcCovKTsKK2V4dGVybiB2b2lkIGZyMzBiZl9tb2RlbF9pbnNuX2FmdGVyIChTSU1fQ1BVICosIGludCAvKmxhc3RfcCovLCBpbnQgLypjeWNsZXMqLyk7CisKKyNlbmRpZiAvKiBGUjMwQkZfREVDT0RFX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9mcjMwL2RldmljZXMuYyBiL3NpbS9mcjMwL2RldmljZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzc4YTUyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2ZyMzAvZGV2aWNlcy5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qIGZyMzAgZGV2aWNlIHN1cHBvcnQKKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgc2ltdWxhdG9ycy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogPz8/IEFsbCBvZiB0aGlzIGlzIGp1c3QgdG8gZ2V0IHNvbWV0aGluZyBnb2luZy4gIHdpcCEgICovCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorCisjaWZkZWYgSEFWRV9EVl9TT0NLU0VSCisjaW5jbHVkZSAiZHYtc29ja3Nlci5oIgorI2VuZGlmCisKK2RldmljZSBmcjMwX2RldmljZXM7CisKK2ludAorZGV2aWNlX2lvX3JlYWRfYnVmZmVyIChkZXZpY2UgKm1lLCB2b2lkICpzb3VyY2UsIGludCBzcGFjZSwKKwkJICAgICAgIGFkZHJlc3Nfd29yZCBhZGRyLCB1bnNpZ25lZCBucl9ieXRlcywKKwkJICAgICAgIFNJTV9DUFUgKmNwdSwgc2ltX2NpYSBjaWEpCit7CisgIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjcHUpOworCisgIGlmIChTVEFURV9FTlZJUk9OTUVOVCAoc2QpICE9IE9QRVJBVElOR19FTlZJUk9OTUVOVCkKKyAgICByZXR1cm4gbnJfYnl0ZXM7CisKKyNpZmRlZiBIQVZFX0RWX1NPQ0tTRVIKKyAgaWYgKGFkZHIgPT0gVUFSVF9JTkNIQVJfQUREUikKKyAgICB7CisgICAgICBpbnQgYyA9IGR2X3NvY2tzZXJfcmVhZCAoc2QpOworICAgICAgaWYgKGMgPT0gLTEpCisJcmV0dXJuIDA7CisgICAgICAqKGNoYXIgKikgc291cmNlID0gYzsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgaWYgKGFkZHIgPT0gVUFSVF9TVEFUVVNfQUREUikKKyAgICB7CisgICAgICBpbnQgc3RhdHVzID0gZHZfc29ja3Nlcl9zdGF0dXMgKHNkKTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBzb3VyY2U7CisgICAgICBwWzBdID0gMDsKKyAgICAgIHBbMV0gPSAoKChzdGF0dXMgJiBEVl9TT0NLU0VSX0lOUFVUX0VNUFRZKQorI2lmZGVmIFVBUlRfSU5QVVRfUkVBRFkwCisJICAgICAgID8gVUFSVF9JTlBVVF9SRUFEWSA6IDApCisjZWxzZQorCSAgICAgICA/IDAgOiBVQVJUX0lOUFVUX1JFQURZKQorI2VuZGlmCisJICAgICAgKyAoKHN0YXR1cyAmIERWX1NPQ0tTRVJfT1VUUFVUX0VNUFRZKSA/IFVBUlRfT1VUUFVUX1JFQURZIDogMCkpOworICAgICAgcmV0dXJuIDI7CisgICAgfQorI2VuZGlmCisKKyAgcmV0dXJuIG5yX2J5dGVzOworfQorCitpbnQKK2RldmljZV9pb193cml0ZV9idWZmZXIgKGRldmljZSAqbWUsIGNvbnN0IHZvaWQgKnNvdXJjZSwgaW50IHNwYWNlLAorCQkJYWRkcmVzc193b3JkIGFkZHIsIHVuc2lnbmVkIG5yX2J5dGVzLAorCQkJU0lNX0NQVSAqY3B1LCBzaW1fY2lhIGNpYSkKK3sKKyAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7CisKKyNpZiBXSVRIX1NDQUNIRQorICBpZiAoYWRkciA9PSBNQ0NSX0FERFIpCisgICAgeworICAgICAgaWYgKCgqKGNvbnN0IGNoYXIgKikgc291cmNlICYgTUNDUl9DUCkgIT0gMCkKKwlzY2FjaGVfZmx1c2ggKHNkKTsKKyAgICAgIHJldHVybiBucl9ieXRlczsKKyAgICB9CisjZW5kaWYKKworICBpZiAoU1RBVEVfRU5WSVJPTk1FTlQgKHNkKSAhPSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQpCisgICAgcmV0dXJuIG5yX2J5dGVzOworCisjaWYgSEFWRV9EVl9TT0NLU0VSCisgIGlmIChhZGRyID09IFVBUlRfT1VUQ0hBUl9BRERSKQorICAgIHsKKyAgICAgIGludCByYyA9IGR2X3NvY2tzZXJfd3JpdGUgKHNkLCAqKGNoYXIgKikgc291cmNlKTsKKyAgICAgIHJldHVybiByYyA9PSAxOworICAgIH0KKyNlbmRpZgorCisgIHJldHVybiBucl9ieXRlczsKK30KKwordm9pZCBkZXZpY2VfZXJyb3IgKCkge30KZGlmZiAtLWdpdCBhL3NpbS9mcjMwL2ZyMzAtc2ltLmggYi9zaW0vZnIzMC9mcjMwLXNpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MDE4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZnIzMC9mcjMwLXNpbS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKiBjb2xsZWN0aW9uIG9mIGp1bmsgd2FpdGluZyB0aW1lIHRvIHNvcnQgb3V0CisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgRlIzMF9TSU1fSAorI2RlZmluZSBGUjMwX1NJTV9ICisKKy8qIGdkYiByZWdpc3RlciBudW1iZXJzICovCisjZGVmaW5lIFBDX1JFR05VTQkxNgorI2RlZmluZSBQU19SRUdOVU0JMTcKKyNkZWZpbmUgVEJSX1JFR05VTQkxOAorI2RlZmluZSBSUF9SRUdOVU0JMTkKKyNkZWZpbmUgU1NQX1JFR05VTQkyMAorI2RlZmluZSBVU1BfUkVHTlVNCTIxCisjZGVmaW5lIE1ESF9SRUdOVU0JMjIKKyNkZWZpbmUgTURMX1JFR05VTQkyMworCitleHRlcm4gQkkgZnIzMGJmX2hfc2JpdF9nZXRfaGFuZGxlciAoU0lNX0NQVSAqKTsKK2V4dGVybiB2b2lkIGZyMzBiZl9oX3NiaXRfc2V0X2hhbmRsZXIgKFNJTV9DUFUgKiwgQkkpOworI2RlZmluZSBHRVRfSF9TQklUKCkgZnIzMGJmX2hfc2JpdF9nZXRfaGFuZGxlciAoY3VycmVudF9jcHUpCisjZGVmaW5lIFNFVF9IX1NCSVQodmFsKSBmcjMwYmZfaF9zYml0X3NldF9oYW5kbGVyIChjdXJyZW50X2NwdSwgKHZhbCkpCisKK2V4dGVybiBVUUkgZnIzMGJmX2hfY2NyX2dldF9oYW5kbGVyIChTSU1fQ1BVICopOworZXh0ZXJuIHZvaWQgZnIzMGJmX2hfY2NyX3NldF9oYW5kbGVyIChTSU1fQ1BVICosIFVRSSk7CisjZGVmaW5lIEdFVF9IX0NDUigpIGZyMzBiZl9oX2Njcl9nZXRfaGFuZGxlciAoY3VycmVudF9jcHUpCisjZGVmaW5lIFNFVF9IX0NDUih2YWwpIGZyMzBiZl9oX2Njcl9zZXRfaGFuZGxlciAoY3VycmVudF9jcHUsICh2YWwpKQorCitleHRlcm4gVVFJIGZyMzBiZl9oX3Njcl9nZXRfaGFuZGxlciAoU0lNX0NQVSAqKTsKK2V4dGVybiB2b2lkIGZyMzBiZl9oX3Njcl9zZXRfaGFuZGxlciAoU0lNX0NQVSAqLCBVUUkpOworI2RlZmluZSBHRVRfSF9TQ1IoKSBmcjMwYmZfaF9zY3JfZ2V0X2hhbmRsZXIgKGN1cnJlbnRfY3B1KQorI2RlZmluZSBTRVRfSF9TQ1IodmFsKSBmcjMwYmZfaF9zY3Jfc2V0X2hhbmRsZXIgKGN1cnJlbnRfY3B1LCAodmFsKSkKKworZXh0ZXJuIFVRSSBmcjMwYmZfaF9pbG1fZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKik7CitleHRlcm4gdm9pZCBmcjMwYmZfaF9pbG1fc2V0X2hhbmRsZXIgKFNJTV9DUFUgKiwgVVFJKTsKKyNkZWZpbmUgR0VUX0hfSUxNKCkgZnIzMGJmX2hfaWxtX2dldF9oYW5kbGVyIChjdXJyZW50X2NwdSkKKyNkZWZpbmUgU0VUX0hfSUxNKHZhbCkgZnIzMGJmX2hfaWxtX3NldF9oYW5kbGVyIChjdXJyZW50X2NwdSwgKHZhbCkpCisKK2V4dGVybiBVU0kgZnIzMGJmX2hfcHNfZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKik7CitleHRlcm4gdm9pZCBmcjMwYmZfaF9wc19zZXRfaGFuZGxlciAoU0lNX0NQVSAqLCBVU0kpOworI2RlZmluZSBHRVRfSF9QUygpIGZyMzBiZl9oX3BzX2dldF9oYW5kbGVyIChjdXJyZW50X2NwdSkKKyNkZWZpbmUgU0VUX0hfUFModmFsKSBmcjMwYmZfaF9wc19zZXRfaGFuZGxlciAoY3VycmVudF9jcHUsICh2YWwpKQorCitleHRlcm4gU0kgZnIzMGJmX2hfZHJfZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKiwgVUlOVCk7CitleHRlcm4gdm9pZCBmcjMwYmZfaF9kcl9zZXRfaGFuZGxlciAoU0lNX0NQVSAqLCBVSU5ULCBTSSk7CisjZGVmaW5lIEdFVF9IX0RSKHJlZ25vKSBmcjMwYmZfaF9kcl9nZXRfaGFuZGxlciAoY3VycmVudF9jcHUsIChyZWdubykpCisjZGVmaW5lIFNFVF9IX0RSKHJlZ25vLCB2YWwpIGZyMzBiZl9oX2RyX3NldF9oYW5kbGVyIChjdXJyZW50X2NwdSwgKHJlZ25vKSwgKHZhbCkpCisMCisjZGVmaW5lIEdFVFRXSSBHRVRUU0kKKyNkZWZpbmUgU0VUVFdJIFNFVFRTSQorDAorLyogSGFyZHdhcmUvZGV2aWNlIHN1cHBvcnQuCisgICA/Pz8gV2lsbCBldmVudHVhbGx5IHdhbnQgdG8gbW92ZSBkZXZpY2Ugc3R1ZmYgdG8gY29uZmlnIGZpbGVzLiAgKi8KKworLyogU3BlY2lhbCBwdXJwb3NlIHRyYXBzLiAgKi8KKyNkZWZpbmUgVFJBUF9TWVNDQUxMCTEwCisjZGVmaW5lIFRSQVBfQlJFQUtQT0lOVAk5CisKKy8qIFN1cHBvcnQgZm9yIHRoZSBNQ0NSIHJlZ2lzdGVyIChDYWNoZSBDb250cm9sIFJlZ2lzdGVyKSBpcyBuZWVkZWQgaW4gb3JkZXIKKyAgIGZvciBvdmVybGF5cyB0byB3b3JrIGNvcnJlY3RseSB3aXRoIHRoZSBzY2FjaGU6IGNhY2hlZCBpbnN0cnVjdGlvbnMgbmVlZAorICAgdG8gYmUgZmx1c2hlZCB3aGVuIHRoZSBpbnN0cnVjdGlvbiBzcGFjZSBpcyBjaGFuZ2VkIGF0IHJ1bnRpbWUuICAqLworCisvKiBDYWNoZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIE1DQ1JfQUREUiAweGZmZmZmZmZmCisjZGVmaW5lIE1DQ1JfQ1AgMHg4MAorLyogbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBNQ0NSX0NNMCAyCisjZGVmaW5lIE1DQ1JfQ00xIDEKKworLyogU2VyaWFsIGRldmljZSBhZGRyZXNzZXMuICAqLworLyogVGhlc2UgYXJlIHRoZSB2YWx1ZXMgZm9yIHRoZSBNU0EyMDAwIGJvYXJkLgorICAgPz8/IFdpbGwgZXZlbnR1YWxseSBuZWVkIHRvIG1vdmUgdGhpcyB0byBhIGNvbmZpZyBmaWxlLiAgKi8KKyNkZWZpbmUgVUFSVF9JTkNIQVJfQUREUgkweGZmMDA0MDA5CisjZGVmaW5lIFVBUlRfT1VUQ0hBUl9BRERSCTB4ZmYwMDQwMDcKKyNkZWZpbmUgVUFSVF9TVEFUVVNfQUREUgkweGZmMDA0MDAyCisKKyNkZWZpbmUgVUFSVF9JTlBVVF9SRUFEWQkweDQKKyNkZWZpbmUgVUFSVF9PVVRQVVRfUkVBRFkJMHgxCisKKy8qIFN0YXJ0IGFkZHJlc3MgYW5kIGxlbmd0aCBvZiBhbGwgZGV2aWNlIHN1cHBvcnQuICAqLworI2RlZmluZSBGUjMwX0RFVklDRV9BRERSCTB4ZmYwMDAwMDAKKyNkZWZpbmUgRlIzMF9ERVZJQ0VfTEVOCQkweDAwZmZmZmZmCisKKy8qIHNpbV9jb3JlX2F0dGFjaCBkZXZpY2UgYXJndW1lbnQuICAqLworZXh0ZXJuIGRldmljZSBmcjMwX2RldmljZXM7CisKKy8qIEZJWE1FOiBUZW1wb3JhcnksIHVudGlsIGRldmljZSBzdXBwb3J0IHJlYWR5LiAgKi8KK3N0cnVjdCBfZGV2aWNlIHsgaW50IGZvbzsgfTsKKworLyogSGFuZGxlIHRoZSB0cmFwIGluc24uICAqLworVVNJIGZyMzBfaW50IChTSU1fQ1BVICosIFBDQUREUiwgaW50KTsKKworI2VuZGlmIC8qIEZSMzBfU0lNX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9mcjMwL2ZyMzAuYyBiL3NpbS9mcjMwL2ZyMzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGI5YjdjZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9mcjMwL2ZyMzAuYwpAQCAtMCwwICsxLDQyMyBAQAorLyogZnIzMCBzaW11bGF0b3Igc3VwcG9ydCBjb2RlCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIHNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgV0FOVF9DUFUKKyNkZWZpbmUgV0FOVF9DUFVfRlIzMEJGCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2luY2x1ZGUgImNnZW4tbWVtLmgiCisjaW5jbHVkZSAiY2dlbi1vcHMuaCIKKworLyogQ29udmVydCBnZGIgZGVkaWNhdGVkIHJlZ2lzdGVyIG51bWJlciB0byBhY3R1YWwgZHIgcmVnIG51bWJlci4gICovCisKK3N0YXRpYyBpbnQKK2RlY29kZV9nZGJfZHJfcmVnbnVtIChpbnQgZ2RiX3JlZ251bSkKK3sKKyAgc3dpdGNoIChnZGJfcmVnbnVtKQorICAgIHsKKyAgICBjYXNlIFRCUl9SRUdOVU0gOiByZXR1cm4gSF9EUl9UQlI7CisgICAgY2FzZSBSUF9SRUdOVU0gOiByZXR1cm4gSF9EUl9SUDsKKyAgICBjYXNlIFNTUF9SRUdOVU0gOiByZXR1cm4gSF9EUl9TU1A7CisgICAgY2FzZSBVU1BfUkVHTlVNIDogcmV0dXJuIEhfRFJfVVNQOworICAgIGNhc2UgTURIX1JFR05VTSA6IHJldHVybiBIX0RSX01ESDsKKyAgICBjYXNlIE1ETF9SRUdOVU0gOiByZXR1cm4gSF9EUl9NREw7CisgICAgfQorICBhYm9ydCAoKTsKK30KKworLyogVGhlIGNvbnRlbnRzIG9mIEJVRiBhcmUgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuICAqLworCitpbnQKK2ZyMzBiZl9mZXRjaF9yZWdpc3RlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIGludCBybiwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworICBpZiAocm4gPCAxNikKKyAgICBTRVRUV0kgKGJ1ZiwgYV9mcjMwX2hfZ3JfZ2V0IChjdXJyZW50X2NwdSwgcm4pKTsKKyAgZWxzZQorICAgIHN3aXRjaCAocm4pCisgICAgICB7CisgICAgICBjYXNlIFBDX1JFR05VTSA6CisJU0VUVFdJIChidWYsIGFfZnIzMF9oX3BjX2dldCAoY3VycmVudF9jcHUpKTsKKwlicmVhazsKKyAgICAgIGNhc2UgUFNfUkVHTlVNIDoKKwlTRVRUV0kgKGJ1ZiwgYV9mcjMwX2hfcHNfZ2V0IChjdXJyZW50X2NwdSkpOworCWJyZWFrOworICAgICAgY2FzZSBUQlJfUkVHTlVNIDoKKyAgICAgIGNhc2UgUlBfUkVHTlVNIDoKKyAgICAgIGNhc2UgU1NQX1JFR05VTSA6CisgICAgICBjYXNlIFVTUF9SRUdOVU0gOgorICAgICAgY2FzZSBNREhfUkVHTlVNIDoKKyAgICAgIGNhc2UgTURMX1JFR05VTSA6CisJU0VUVFdJIChidWYsIGFfZnIzMF9oX2RyX2dldCAoY3VycmVudF9jcHUsCisJCQkJICAgICAgZGVjb2RlX2dkYl9kcl9yZWdudW0gKHJuKSkpOworCWJyZWFrOworICAgICAgZGVmYXVsdCA6CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgcmV0dXJuIC0xOyAvKkZJWE1FKi8KK30KKworLyogVGhlIGNvbnRlbnRzIG9mIEJVRiBhcmUgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuICAqLworCitpbnQKK2ZyMzBiZl9zdG9yZV9yZWdpc3RlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIGludCBybiwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworICBpZiAocm4gPCAxNikKKyAgICBhX2ZyMzBfaF9ncl9zZXQgKGN1cnJlbnRfY3B1LCBybiwgR0VUVFdJIChidWYpKTsKKyAgZWxzZQorICAgIHN3aXRjaCAocm4pCisgICAgICB7CisgICAgICBjYXNlIFBDX1JFR05VTSA6CisJYV9mcjMwX2hfcGNfc2V0IChjdXJyZW50X2NwdSwgR0VUVFdJIChidWYpKTsKKwlicmVhazsKKyAgICAgIGNhc2UgUFNfUkVHTlVNIDoKKwlhX2ZyMzBfaF9wc19zZXQgKGN1cnJlbnRfY3B1LCBHRVRUV0kgKGJ1ZikpOworCWJyZWFrOworICAgICAgY2FzZSBUQlJfUkVHTlVNIDoKKyAgICAgIGNhc2UgUlBfUkVHTlVNIDoKKyAgICAgIGNhc2UgU1NQX1JFR05VTSA6CisgICAgICBjYXNlIFVTUF9SRUdOVU0gOgorICAgICAgY2FzZSBNREhfUkVHTlVNIDoKKyAgICAgIGNhc2UgTURMX1JFR05VTSA6CisJYV9mcjMwX2hfZHJfc2V0IChjdXJyZW50X2NwdSwKKwkJCSBkZWNvZGVfZ2RiX2RyX3JlZ251bSAocm4pLAorCQkJIEdFVFRXSSAoYnVmKSk7CisJYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICByZXR1cm4gLTE7IC8qRklYTUUqLworfQorDAorLyogQ292ZXIgZm5zIHRvIGFjY2VzcyB0aGUgY2NyIGJpdHMuICAqLworCitCSQorZnIzMGJmX2hfc2JpdF9nZXRfaGFuZGxlciAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHJldHVybiBDUFUgKGhfc2JpdCk7Cit9CisKK3ZvaWQKK2ZyMzBiZl9oX3NiaXRfc2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBCSSBuZXd2YWwpCit7CisgIGludCBvbGRfc2JpdCA9IENQVSAoaF9zYml0KTsKKyAgaW50IG5ld19zYml0ID0gKG5ld3ZhbCAhPSAwKTsKKworICBDUFUgKGhfc2JpdCkgPSBuZXdfc2JpdDsKKworICAvKiBXaGVuIHN3aXRjaGluZyBzdGFjayBtb2RlcywgdXBkYXRlIHRoZSByZWdpc3RlcnMuICAqLworICBpZiAob2xkX3NiaXQgIT0gbmV3X3NiaXQpCisgICAgeworICAgICAgaWYgKG9sZF9zYml0KQorCXsKKwkgIC8qIFN3aXRjaGluZyB1c2VyIC0+IHN5c3RlbS4gICovCisJICBDUFUgKGhfZHJbSF9EUl9VU1BdKSA9IENQVSAoaF9ncltIX0dSX1NQXSk7CisJICBDUFUgKGhfZ3JbSF9HUl9TUF0pID0gQ1BVIChoX2RyW0hfRFJfU1NQXSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIFN3aXRjaGluZyBzeXN0ZW0gLT4gdXNlci4gICovCisJICBDUFUgKGhfZHJbSF9EUl9TU1BdKSA9IENQVSAoaF9ncltIX0dSX1NQXSk7CisJICBDUFUgKGhfZ3JbSF9HUl9TUF0pID0gQ1BVIChoX2RyW0hfRFJfVVNQXSk7CisJfQorICAgIH0KKworICAvKiBUT0RPOiByMTUgaW50ZXJsb2NrICovCit9CisMCisvKiBDb3ZlciBmbnMgdG8gYWNjZXNzIHRoZSBjY3IgYml0cy4gICovCisKK1VRSQorZnIzMGJmX2hfY2NyX2dldF9oYW5kbGVyIChTSU1fQ1BVICpjdXJyZW50X2NwdSkKK3sKKyAgaW50IGNjciA9ICggIChHRVRfSF9DQklUICgpIDw8IDApCisJICAgICB8IChHRVRfSF9WQklUICgpIDw8IDEpCisJICAgICB8IChHRVRfSF9aQklUICgpIDw8IDIpCisJICAgICB8IChHRVRfSF9OQklUICgpIDw8IDMpCisJICAgICB8IChHRVRfSF9JQklUICgpIDw8IDQpCisJICAgICB8IChHRVRfSF9TQklUICgpIDw8IDUpKTsKKworICByZXR1cm4gY2NyOworfQorCit2b2lkCitmcjMwYmZfaF9jY3Jfc2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVUUkgbmV3dmFsKQoreworICBpbnQgY2NyID0gbmV3dmFsICYgMHgzZjsKKworICBTRVRfSF9DQklUICgoY2NyICYgMSkgIT0gMCk7CisgIFNFVF9IX1ZCSVQgKChjY3IgJiAyKSAhPSAwKTsKKyAgU0VUX0hfWkJJVCAoKGNjciAmIDQpICE9IDApOworICBTRVRfSF9OQklUICgoY2NyICYgOCkgIT0gMCk7CisgIFNFVF9IX0lCSVQgKChjY3IgJiAweDEwKSAhPSAwKTsKKyAgU0VUX0hfU0JJVCAoKGNjciAmIDB4MjApICE9IDApOworfQorDAorLyogQ292ZXIgZm5zIHRvIGFjY2VzcyB0aGUgc2NyIGJpdHMuICAqLworCitVUUkKK2ZyMzBiZl9oX3Njcl9nZXRfaGFuZGxlciAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIGludCBzY3IgPSAoICAoR0VUX0hfVEJJVCAoKSA8PCAwKQorCSAgICAgfCAoR0VUX0hfRDBCSVQgKCkgPDwgMSkKKwkgICAgIHwgKEdFVF9IX0QxQklUICgpIDw8IDIpKTsKKyAgcmV0dXJuIHNjcjsKK30KKwordm9pZAorZnIzMGJmX2hfc2NyX3NldF9oYW5kbGVyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVVFJIG5ld3ZhbCkKK3sKKyAgaW50IHNjciA9IG5ld3ZhbCAmIDc7CisKKyAgU0VUX0hfVEJJVCAgKChzY3IgJiAxKSAhPSAwKTsKKyAgU0VUX0hfRDBCSVQgKChzY3IgJiAyKSAhPSAwKTsKKyAgU0VUX0hfRDFCSVQgKChzY3IgJiA0KSAhPSAwKTsKK30KKwwKKy8qIENvdmVyIGZucyB0byBhY2Nlc3MgdGhlIGlsbSBiaXRzLiAgKi8KKworVVFJCitmcjMwYmZfaF9pbG1fZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICByZXR1cm4gQ1BVIChoX2lsbSk7Cit9CisKK3ZvaWQKK2ZyMzBiZl9oX2lsbV9zZXRfaGFuZGxlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVRSSBuZXd2YWwpCit7CisgIGludCBpbG0gPSBuZXd2YWwgJiAweDFmOworICBpbnQgY3VycmVudF9pbG0gPSBDUFUgKGhfaWxtKTsKKworICAvKiBXZSBjYW4gb25seSBzZXQgbmV3IGlsbSB2YWx1ZXMgPCAxNiBpZiB0aGUgY3VycmVudCBpbG0gaXMgPCAxNi4gIE90aGVyd2lzZQorICAgICB3ZSBhZGQgMTYgdG8gdGhlIHZhbHVlIHdlIGFyZSBnaXZlbi4gICovCisgIGlmIChjdXJyZW50X2lsbSA+PSAxNiAmJiBpbG0gPCAxNikKKyAgICBpbG0gKz0gMTY7CisKKyAgQ1BVIChoX2lsbSkgPSBpbG07Cit9CisMCisvKiBDb3ZlciBmbnMgdG8gYWNjZXNzIHRoZSBwcyByZWdpc3Rlci4gICovCisKK1VTSQorZnIzMGJmX2hfcHNfZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICBpbnQgY2NyID0gR0VUX0hfQ0NSICgpOworICBpbnQgc2NyID0gR0VUX0hfU0NSICgpOworICBpbnQgaWxtID0gR0VUX0hfSUxNICgpOworCisgIHJldHVybiBjY3IgfCAoc2NyIDw8IDgpIHwgKGlsbSA8PCAxNik7Cit9CisKK3ZvaWQKK2ZyMzBiZl9oX3BzX3NldF9oYW5kbGVyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVVNJIG5ld3ZhbCkKK3sKKyAgaW50IGNjciA9IG5ld3ZhbCAmIDB4ZmY7CisgIGludCBzY3IgPSAobmV3dmFsID4+IDgpICYgNzsKKyAgaW50IGlsbSA9IChuZXd2YWwgPj4gMTYpICYgMHgxZjsKKworICBTRVRfSF9DQ1IgKGNjcik7CisgIFNFVF9IX1NDUiAoc2NyKTsKKyAgU0VUX0hfSUxNIChpbG0pOworfQorDAorLyogQ292ZXIgZm5zIHRvIGFjY2VzcyB0aGUgZGVkaWNhdGVkIHJlZ2lzdGVycy4gICovCisKK1NJCitmcjMwYmZfaF9kcl9nZXRfaGFuZGxlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVJTlQgZHIpCit7CisgIHN3aXRjaCAoZHIpCisgICAgeworICAgIGNhc2UgSF9EUl9TU1AgOgorICAgICAgaWYgKCEgR0VUX0hfU0JJVCAoKSkKKwlyZXR1cm4gR0VUX0hfR1IgKEhfR1JfU1ApOworICAgICAgZWxzZQorCXJldHVybiBDUFUgKGhfZHJbSF9EUl9TU1BdKTsKKyAgICBjYXNlIEhfRFJfVVNQIDoKKyAgICAgIGlmIChHRVRfSF9TQklUICgpKQorCXJldHVybiBHRVRfSF9HUiAoSF9HUl9TUCk7CisgICAgICBlbHNlCisJcmV0dXJuIENQVSAoaF9kcltIX0RSX1VTUF0pOworICAgIGNhc2UgSF9EUl9UQlIgOgorICAgIGNhc2UgSF9EUl9SUCA6CisgICAgY2FzZSBIX0RSX01ESCA6CisgICAgY2FzZSBIX0RSX01ETCA6CisgICAgICByZXR1cm4gQ1BVIChoX2RyW2RyXSk7CisgICAgfQorICByZXR1cm4gMDsKK30KKwordm9pZAorZnIzMGJmX2hfZHJfc2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIGRyLCBTSSBuZXd2YWwpCit7CisgIHN3aXRjaCAoZHIpCisgICAgeworICAgIGNhc2UgSF9EUl9TU1AgOgorICAgICAgaWYgKCEgR0VUX0hfU0JJVCAoKSkKKwlTRVRfSF9HUiAoSF9HUl9TUCwgbmV3dmFsKTsKKyAgICAgIGVsc2UKKwlDUFUgKGhfZHJbSF9EUl9TU1BdKSA9IG5ld3ZhbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSF9EUl9VU1AgOgorICAgICAgaWYgKEdFVF9IX1NCSVQgKCkpCisJU0VUX0hfR1IgKEhfR1JfU1AsIG5ld3ZhbCk7CisgICAgICBlbHNlCisJQ1BVIChoX2RyW0hfRFJfVVNQXSkgPSBuZXd2YWw7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhfRFJfVEJSIDoKKyAgICBjYXNlIEhfRFJfUlAgOgorICAgIGNhc2UgSF9EUl9NREggOgorICAgIGNhc2UgSF9EUl9NREwgOgorICAgICAgQ1BVIChoX2RyW2RyXSkgPSBuZXd2YWw7CisgICAgICBicmVhazsKKyAgICB9Cit9CisMCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKworLyogRklYTUU6IFNvbWUgb2YgdGhlc2Ugc2hvdWxkIGJlIGlubGluZSBvciBtYWNyb3MuICBMYXRlci4gICovCisKKy8qIEluaXRpYWxpemUgY3ljbGUgY291bnRpbmcgZm9yIGFuIGluc24uCisgICBGSVJTVF9QIGlzIG5vbi16ZXJvIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGluc24gaW4gYSBzZXQgb2YgcGFyYWxsZWwKKyAgIGluc25zLiAgKi8KKwordm9pZAorZnIzMGJmX21vZGVsX2luc25fYmVmb3JlIChTSU1fQ1BVICpjcHUsIGludCBmaXJzdF9wKQoreworICBNT0RFTF9GUjMwXzFfREFUQSAqZCA9IENQVV9NT0RFTF9EQVRBIChjcHUpOworICBkLT5sb2FkX3JlZ3NfcGVuZGluZyA9IDA7Cit9CisKKy8qIFJlY29yZCB0aGUgY3ljbGVzIGNvbXB1dGVkIGZvciBhbiBpbnNuLgorICAgTEFTVF9QIGlzIG5vbi16ZXJvIGlmIHRoaXMgaXMgdGhlIGxhc3QgaW5zbiBpbiBhIHNldCBvZiBwYXJhbGxlbCBpbnNucywKKyAgIGFuZCB3ZSB1cGRhdGUgdGhlIHRvdGFsIGN5Y2xlIGNvdW50LgorICAgQ1lDTEVTIGlzIHRoZSBjeWNsZSBjb3VudCBvZiB0aGUgaW5zbi4gICovCisKK3ZvaWQKK2ZyMzBiZl9tb2RlbF9pbnNuX2FmdGVyIChTSU1fQ1BVICpjcHUsIGludCBsYXN0X3AsIGludCBjeWNsZXMpCit7CisgIFBST0ZJTEVfREFUQSAqcCA9IENQVV9QUk9GSUxFX0RBVEEgKGNwdSk7CisgIE1PREVMX0ZSMzBfMV9EQVRBICpkID0gQ1BVX01PREVMX0RBVEEgKGNwdSk7CisKKyAgUFJPRklMRV9NT0RFTF9UT1RBTF9DWUNMRVMgKHApICs9IGN5Y2xlczsKKyAgUFJPRklMRV9NT0RFTF9DVVJfSU5TTl9DWUNMRVMgKHApID0gY3ljbGVzOworICBkLT5sb2FkX3JlZ3MgPSBkLT5sb2FkX3JlZ3NfcGVuZGluZzsKK30KKworc3RhdGljIElOTElORSBpbnQKK2NoZWNrX2xvYWRfc3RhbGwgKFNJTV9DUFUgKmNwdSwgaW50IHJlZ25vKQoreworICBjb25zdCBNT0RFTF9GUjMwXzFfREFUQSAqZCA9IENQVV9NT0RFTF9EQVRBIChjcHUpOworICBVSU5UIGxvYWRfcmVncyA9IGQtPmxvYWRfcmVnczsKKworICBpZiAocmVnbm8gIT0gLTEKKyAgICAgICYmIChsb2FkX3JlZ3MgJiAoMSA8PCByZWdubykpICE9IDApCisgICAgeworICAgICAgUFJPRklMRV9EQVRBICpwID0gQ1BVX1BST0ZJTEVfREFUQSAoY3B1KTsKKyAgICAgICsrIFBST0ZJTEVfTU9ERUxfTE9BRF9TVEFMTF9DWUNMRVMgKHApOworICAgICAgaWYgKFRSQUNFX0lOU05fUCAoY3B1KSkKKwljZ2VuX3RyYWNlX3ByaW50ZiAoY3B1LCAiIDsgTG9hZCBzdGFsbC4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitpbnQKK2ZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChTSU1fQ1BVICpjcHUsIGNvbnN0IElERVNDICppZGVzYywKKwkJCSAgICBpbnQgdW5pdF9udW0sIGludCByZWZlcmVuY2VkLAorCQkJICAgIElOVCBpbl9SaSwgSU5UIGluX1JqLCBJTlQgb3V0X1JpKQoreworICBpbnQgY3ljbGVzID0gaWRlc2MtPnRpbWluZy0+dW5pdHNbdW5pdF9udW1dLmRvbmU7CisgIGN5Y2xlcyArPSBjaGVja19sb2FkX3N0YWxsIChjcHUsIGluX1JpKTsKKyAgY3ljbGVzICs9IGNoZWNrX2xvYWRfc3RhbGwgKGNwdSwgaW5fUmopOworICByZXR1cm4gY3ljbGVzOworfQorCitpbnQKK2ZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKFNJTV9DUFUgKmNwdSwgY29uc3QgSURFU0MgKmlkZXNjLAorCQkJICAgaW50IHVuaXRfbnVtLCBpbnQgcmVmZXJlbmNlZCwKKwkJCSAgIElOVCBpbl9SaSkKK3sKKyAgUFJPRklMRV9EQVRBICpwID0gQ1BVX1BST0ZJTEVfREFUQSAoY3B1KTsKKyAgLyogKDEgPDwgMSk6IFRoZSBwYyBpcyB0aGUgMm5kIGVsZW1lbnQgaW4gaW5wdXRzLCBvdXRwdXRzLgorICAgICA/Pz8gY2FuIGJlIGNsZWFuZWQgdXAgKi8KKyAgaW50IHRha2VuX3AgPSAocmVmZXJlbmNlZCAmICgxIDw8IDEpKSAhPSAwOworICBpbnQgY3ljbGVzID0gaWRlc2MtPnRpbWluZy0+dW5pdHNbdW5pdF9udW1dLmRvbmU7CisgIGludCBkZWxheV9zbG90X3AgPSBDR0VOX0FUVFJfVkFMVUUgKE5VTEwsIGlkZXNjLT5hdHRycywgQ0dFTl9JTlNOX0RFTEFZX1NMT1QpOworCisgIGN5Y2xlcyArPSBjaGVja19sb2FkX3N0YWxsIChjcHUsIGluX1JpKTsKKyAgaWYgKHRha2VuX3ApCisgICAgeworICAgICAgLyogPz8/IEhhbmRsaW5nIGN0aSdzIHdpdGhvdXQgZGVsYXkgc2xvdHMgdGhpcyB3YXkgd2lsbCBydW4gYWZvdWwgb2YKKwkgYWNjdXJhdGUgc3lzdGVtIHNpbXVsYXRpb24uICBMYXRlci4gICovCisgICAgICBpZiAoISBkZWxheV9zbG90X3ApCisJeworCSAgKytjeWNsZXM7CisJICArK1BST0ZJTEVfTU9ERUxfQ1RJX1NUQUxMX0NZQ0xFUyAocCk7CisJfQorICAgICAgKytQUk9GSUxFX01PREVMX1RBS0VOX0NPVU5UIChwKTsKKyAgICB9CisgIGVsc2UKKyAgICArK1BST0ZJTEVfTU9ERUxfVU5UQUtFTl9DT1VOVCAocCk7CisKKyAgcmV0dXJuIGN5Y2xlczsKK30KKworaW50CitmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoU0lNX0NQVSAqY3B1LCBjb25zdCBJREVTQyAqaWRlc2MsCisJCQkgICAgaW50IHVuaXRfbnVtLCBpbnQgcmVmZXJlbmNlZCwKKwkJCSAgICBJTlQgaW5fUmosIElOVCBvdXRfUmkpCit7CisgIE1PREVMX0ZSMzBfMV9EQVRBICpkID0gQ1BVX01PREVMX0RBVEEgKGNwdSk7CisgIGludCBjeWNsZXMgPSBpZGVzYy0+dGltaW5nLT51bml0c1t1bml0X251bV0uZG9uZTsKKyAgZC0+bG9hZF9yZWdzX3BlbmRpbmcgfD0gMSA8PCBvdXRfUmk7CisgIGN5Y2xlcyArPSBjaGVja19sb2FkX3N0YWxsIChjcHUsIGluX1JqKTsKKyAgcmV0dXJuIGN5Y2xlczsKK30KKworaW50CitmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKFNJTV9DUFUgKmNwdSwgY29uc3QgSURFU0MgKmlkZXNjLAorCQkJICAgICBpbnQgdW5pdF9udW0sIGludCByZWZlcmVuY2VkLAorCQkJICAgICBJTlQgaW5fUmksIElOVCBpbl9SaikKK3sKKyAgaW50IGN5Y2xlcyA9IGlkZXNjLT50aW1pbmctPnVuaXRzW3VuaXRfbnVtXS5kb25lOworICBjeWNsZXMgKz0gY2hlY2tfbG9hZF9zdGFsbCAoY3B1LCBpbl9SaSk7CisgIGN5Y2xlcyArPSBjaGVja19sb2FkX3N0YWxsIChjcHUsIGluX1JqKTsKKyAgcmV0dXJuIGN5Y2xlczsKK30KKworaW50CitmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbGRtIChTSU1fQ1BVICpjcHUsIGNvbnN0IElERVNDICppZGVzYywKKwkJCSAgIGludCB1bml0X251bSwgaW50IHJlZmVyZW5jZWQsCisJCQkgICBJTlQgcmVnbGlzdCkKK3sKKyAgcmV0dXJuIGlkZXNjLT50aW1pbmctPnVuaXRzW3VuaXRfbnVtXS5kb25lOworfQorCitpbnQKK2ZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG0gKFNJTV9DUFUgKmNwdSwgY29uc3QgSURFU0MgKmlkZXNjLAorCQkJICAgaW50IHVuaXRfbnVtLCBpbnQgcmVmZXJlbmNlZCwKKwkJCSAgIElOVCByZWdsaXN0KQoreworICByZXR1cm4gaWRlc2MtPnRpbWluZy0+dW5pdHNbdW5pdF9udW1dLmRvbmU7Cit9CisKKyNlbmRpZiAvKiBXSVRIX1BST0ZJTEVfTU9ERUxfUCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2ZyMzAvbWxvb3AuaW4gYi9zaW0vZnIzMC9tbG9vcC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTgyZDgzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2ZyMzAvbWxvb3AuaW4KQEAgLTAsMCArMSwyMzYgQEAKKyMgU2ltdWxhdG9yIG1haW4gbG9vcCBmb3IgZnIzMC4gLSotIEMgLSotCisjIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIFN5bnRheDoKKyMgL2Jpbi9zaCBtYWlubG9vcC5pbiBjb21tYW5kCisjCisjIENvbW1hbmQgaXMgb25lIG9mOgorIworIyBpbml0CisjIHN1cHBvcnQKKyMgZXh0cmFjdC17c2ltcGxlLHNjYWNoZSxwYmJ9CisjIHtmdWxsLGZhc3R9LWV4ZWMte3NpbXBsZSxzY2FjaGUscGJifQorIworIyBBIHRhcmdldCBuZWVkIG9ubHkgcHJvdmlkZSBhICJmdWxsIiB2ZXJzaW9uIG9mIG9uZSBvZiBzaW1wbGUsc2NhY2hlLHBiYi4KKyMgSWYgdGhlIHRhcmdldCB3YW50cyBpdCBjYW4gYWxzbyBwcm92aWRlIGEgZmFzdCB2ZXJzaW9uIG9mIHNhbWUuCisjIEl0IGNhbid0IHByb3ZpZGUgbW9yZSB0aGFuIHRoaXMsIGhvd2V2ZXIgZm9yIGlsbHVzdHJhdGlvbidzIHNha2UgdGhlIEZSMzAKKyMgcG9ydCBwcm92aWRlcyBleGFtcGxlcyBvZiBhbGwuCisKKyMgPz8/IEFmdGVyIGEgZmV3IG1vcmUgcG9ydHMgYXJlIGRvbmUsIHJldmlzaXQuCisjIFdpbGwgZXZlbnR1YWxseSBuZWVkIHRvIG1hY2hpbmUgZ2VuZXJhdGUgYSBsb3Qgb2YgdGhpcy4KKworY2FzZSAieCQxIiBpbgorCit4c3VwcG9ydCkKKworY2F0IDw8RU9GCisKK3N0YXRpYyBJTkxJTkUgY29uc3QgSURFU0MgKgorZXh0cmFjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFBDQUREUiBwYywgQ0dFTl9JTlNOX0lOVCBpbnNuLCBBUkdCVUYgKmFidWYsCisgICAgICAgICBpbnQgZmFzdF9wKQoreworICBjb25zdCBJREVTQyAqaWQgPSBAY3B1QF9kZWNvZGUgKGN1cnJlbnRfY3B1LCBwYywgaW5zbiwgYWJ1Zik7CisgIEBjcHVAX2ZpbGxfYXJnYnVmIChjdXJyZW50X2NwdSwgYWJ1ZiwgaWQsIHBjLCBmYXN0X3ApOworICBpZiAoISBmYXN0X3ApCisgICAgeworICAgICAgaW50IHRyYWNlX3AgPSBQQ19JTl9UUkFDRV9SQU5HRV9QIChjdXJyZW50X2NwdSwgcGMpOworICAgICAgaW50IHByb2ZpbGVfcCA9IFBDX0lOX1BST0ZJTEVfUkFOR0VfUCAoY3VycmVudF9jcHUsIHBjKTsKKyAgICAgIEBjcHVAX2ZpbGxfYXJnYnVmX3RwIChjdXJyZW50X2NwdSwgYWJ1ZiwgdHJhY2VfcCwgcHJvZmlsZV9wKTsKKyAgICB9CisgIHJldHVybiBpZDsKK30KKworc3RhdGljIElOTElORSBTRU1fUEMKK2V4ZWN1dGUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTQ0FDSEUgKnNjLCBpbnQgZmFzdF9wKQoreworICBTRU1fUEMgdnBjOworCisgIGlmIChmYXN0X3ApCisgICAgeworI2lmICEgV0lUSF9TRU1fU1dJVENIX0ZBU1QKKyNpZiBXSVRIX1NDQUNIRQorICAgICAgdnBjID0gKCpzYy0+YXJnYnVmLnNlbWFudGljLnNlbV9mYXN0KSAoY3VycmVudF9jcHUsIHNjKTsKKyNlbHNlCisgICAgICB2cGMgPSAoKnNjLT5hcmdidWYuc2VtYW50aWMuc2VtX2Zhc3QpIChjdXJyZW50X2NwdSwgJnNjLT5hcmdidWYpOworI2VuZGlmCisjZWxzZQorICAgICAgYWJvcnQgKCk7CisjZW5kaWYgLyogV0lUSF9TRU1fU1dJVENIX0ZBU1QgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisjaWYgISBXSVRIX1NFTV9TV0lUQ0hfRlVMTAorICAgICAgQVJHQlVGICphYnVmID0gJnNjLT5hcmdidWY7CisgICAgICBjb25zdCBJREVTQyAqaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyNpZiBXSVRIX1NDQUNIRV9QQkIKKyAgICAgIGludCB2aXJ0dWFsX3AgPSBDR0VOX0FUVFJfVkFMVUUgKE5VTEwsIGlkZXNjLT5hdHRycywgQ0dFTl9JTlNOX1ZJUlRVQUwpOworI2Vsc2UKKyAgICAgIGludCB2aXJ0dWFsX3AgPSAwOworI2VuZGlmCisKKyAgICAgIGlmICghIHZpcnR1YWxfcCkKKwl7CisJICAvKiBGSVhNRTogY2FsbCB4LWJlZm9yZSAqLworCSAgaWYgKEFSR0JVRl9QUk9GSUxFX1AgKGFidWYpKQorCSAgICBQUk9GSUxFX0NPVU5UX0lOU04gKGN1cnJlbnRfY3B1LCBhYnVmLT5hZGRyLCBpZGVzYy0+bnVtKTsKKwkgIC8qIEZJWE1FOiBMYXRlciBtYWtlIGNvdmVyIG1hY3JvczogUFJPRklMRV9JTlNOX3tJTklULEZJTkl9LiAgKi8KKwkgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KQorCSAgICAgICYmIEFSR0JVRl9QUk9GSUxFX1AgKGFidWYpKQorCSAgICBAY3B1QF9tb2RlbF9pbnNuX2JlZm9yZSAoY3VycmVudF9jcHUsIDEgLypmaXJzdF9wKi8pOworCSAgVFJBQ0VfSU5TTl9JTklUIChjdXJyZW50X2NwdSwgYWJ1ZiwgMSk7CisJICBUUkFDRV9JTlNOIChjdXJyZW50X2NwdSwgaWRlc2MtPmlkYXRhLAorCQkgICAgICAoY29uc3Qgc3RydWN0IGFyZ2J1ZiAqKSBhYnVmLCBhYnVmLT5hZGRyKTsKKwl9CisjaWYgV0lUSF9TQ0FDSEUKKyAgICAgIHZwYyA9ICgqc2MtPmFyZ2J1Zi5zZW1hbnRpYy5zZW1fZnVsbCkgKGN1cnJlbnRfY3B1LCBzYyk7CisjZWxzZQorICAgICAgdnBjID0gKCpzYy0+YXJnYnVmLnNlbWFudGljLnNlbV9mdWxsKSAoY3VycmVudF9jcHUsIGFidWYpOworI2VuZGlmCisgICAgICBpZiAoISB2aXJ0dWFsX3ApCisJeworCSAgLyogRklYTUU6IGNhbGwgeC1hZnRlciAqLworCSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpCisJICAgICAgJiYgQVJHQlVGX1BST0ZJTEVfUCAoYWJ1ZikpCisJICAgIHsKKwkgICAgICBpbnQgY3ljbGVzOworCisJICAgICAgY3ljbGVzID0gKCppZGVzYy0+dGltaW5nLT5tb2RlbF9mbikgKGN1cnJlbnRfY3B1LCBzYyk7CisJICAgICAgQGNwdUBfbW9kZWxfaW5zbl9hZnRlciAoY3VycmVudF9jcHUsIDEgLypsYXN0X3AqLywgY3ljbGVzKTsKKwkgICAgfQorCSAgVFJBQ0VfSU5TTl9GSU5JIChjdXJyZW50X2NwdSwgYWJ1ZiwgMSk7CisJfQorI2Vsc2UKKyAgICAgIGFib3J0ICgpOworI2VuZGlmIC8qIFdJVEhfU0VNX1NXSVRDSF9GVUxMICovCisgICAgfQorCisgIHJldHVybiB2cGM7Cit9CisKK0VPRgorCis7OworCit4aW5pdCkKKworY2F0IDw8RU9GCisvKnh4eGluaXQqLworRU9GCisKKzs7CisKK3hleHRyYWN0LXNpbXBsZSB8IHhleHRyYWN0LXNjYWNoZSkKKworIyBJbnB1dHM6ICBjdXJyZW50X2NwdSwgdnBjLCBzYywgRkFTVF9QCisjIE91dHB1dHM6IHNjIGZpbGxlZCBpbgorCitjYXQgPDxFT0YKK3sKKyAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gR0VUSU1FTVVISSAoY3VycmVudF9jcHUsIHZwYyk7CisgIGV4dHJhY3QgKGN1cnJlbnRfY3B1LCB2cGMsIGluc24sIFNFTV9BUkdCVUYgKHNjKSwgRkFTVF9QKTsKK30KK0VPRgorCis7OworCit4ZXh0cmFjdC1wYmIpCisKKyMgSW5wdXRzOiAgY3VycmVudF9jcHUsIHBjLCBzYywgbWF4X2luc25zLCBGQVNUX1AKKyMgT3V0cHV0czogc2MsIHBjCisjIHNjIG11c3QgYmUgbGVmdCBwb2ludGluZyBwYXN0IHRoZSBsYXN0IGNyZWF0ZWQgZW50cnkuCisjIHBjIG11c3QgYmUgbGVmdCBwb2ludGluZyBwYXN0IHRoZSBsYXN0IGNyZWF0ZWQgZW50cnkuCisjIElmIHRoZSBwYmIgaXMgdGVybWluYXRlZCBieSBhIGN0aSBpbnNuLCBTRVRfQ1RJX1ZQQyhzYykgbXVzdCBiZSBjYWxsZWQKKyMgdG8gcmVjb3JkIHRoZSB2cGMgb2YgdGhlIGN0aSBpbnNuLgorIyBTRVRfSU5TTl9DT1VOVChuKSBtdXN0IGJlIGNhbGxlZCB0byByZWNvcmQgbnVtYmVyIG9mIHJlYWwgaW5zbnMuCisKK2NhdCA8PEVPRgoreworICBjb25zdCBJREVTQyAqaWRlc2M7CisgIGludCBpY291bnQgPSAwOworCisgIHdoaWxlIChtYXhfaW5zbnMgPiAwKQorICAgIHsKKyAgICAgIFVISSBpbnNuID0gR0VUSU1FTVVISSAoY3VycmVudF9jcHUsIHBjKTsKKyAgICAgIGlkZXNjID0gZXh0cmFjdCAoY3VycmVudF9jcHUsIHBjLCBpbnNuLCAmc2MtPmFyZ2J1ZiwgRkFTVF9QKTsKKyAgICAgICsrc2M7CisgICAgICAtLW1heF9pbnNuczsKKyAgICAgICsraWNvdW50OworICAgICAgcGMgKz0gaWRlc2MtPmxlbmd0aDsKKyAgICAgIGlmIChJREVTQ19DVElfUCAoaWRlc2MpKQorCXsKKwkgIFNFVF9DVElfVlBDIChzYyAtIDEpOworCisJICAvKiBEZWxheSBzbG90PyAqLworCSAgLyogPz8/IGJyZWFrcG9pbnRzIGluIGRlbGF5IHNsb3RzICovCisJICBpZiAoQ0dFTl9BVFRSX1ZBTFVFIChOVUxMLCBpZGVzYy0+YXR0cnMsIENHRU5fSU5TTl9ERUxBWV9TTE9UKSkKKwkgICAgeworCSAgICAgIFVISSBpbnNuID0gR0VUSU1FTVVISSAoY3VycmVudF9jcHUsIHBjKTsKKwkgICAgICBpZGVzYyA9IGV4dHJhY3QgKGN1cnJlbnRfY3B1LCBwYywgaW5zbiwgJnNjLT5hcmdidWYsIEZBU1RfUCk7CisJICAgICAgaWYgKENHRU5fQVRUUl9WQUxVRSAoTlVMTCwgaWRlc2MtPmF0dHJzLCBDR0VOX0lOU05fTk9UX0lOX0RFTEFZX1NMT1QpKQorCQl7CisJCSAgLyogbWFsZm9ybWVkIHByb2dyYW0gKi8KKwkJICBzaW1faW9fZXByaW50ZiAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSksCisJCQkJICAibWFsZm9ybWVkIHByb2dyYW0sIFxgJXMnIGluc24gaW4gZGVsYXkgc2xvdFxuIiwKKwkJCQkgIENHRU5fSU5TTl9OQU1FIChpZGVzYy0+aWRhdGEpKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgICsrc2M7CisJCSAgLS1tYXhfaW5zbnM7CisJCSAgKytpY291bnQ7CisJCSAgcGMgKz0gaWRlc2MtPmxlbmd0aDsKKwkJfQorCSAgICB9CisJICBicmVhazsKKwl9CisgICAgfQorCisgRmluaXNoOgorICBTRVRfSU5TTl9DT1VOVCAoaWNvdW50KTsKK30KK0VPRgorCis7OworCit4ZnVsbC1leGVjLSogfCB4ZmFzdC1leGVjLSopCisKKyMgSW5wdXRzOiBjdXJyZW50X2NwdSwgc2MsIEZBU1RfUAorIyBPdXRwdXRzOiB2cGMKKyMgdnBjIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGluc24gdG8gZXhlY3V0ZQorCitjYXQgPDxFT0YKK3sKKyNpZiAoISBGQVNUX1AgJiYgV0lUSF9TRU1fU1dJVENIX0ZVTEwpIHx8IChGQVNUX1AgJiYgV0lUSF9TRU1fU1dJVENIX0ZBU1QpCisjZGVmaW5lIERFRklORV9TV0lUQ0gKKyNpbmNsdWRlICJzZW0tc3dpdGNoLmMiCisjZWxzZQorICB2cGMgPSBleGVjdXRlIChjdXJyZW50X2NwdSwgdnBjLCBGQVNUX1ApOworI2VuZGlmCit9CitFT0YKKworOzsKKworKikKKyAgZWNobyAiSW52YWxpZCBhcmd1bWVudCB0byBtYWlubG9vcC5pbjogJDEiID4mMgorICBleGl0IDEKKyAgOzsKKworZXNhYwpkaWZmIC0tZ2l0IGEvc2ltL2ZyMzAvbW9kZWwuYyBiL3NpbS9mcjMwL21vZGVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JlNjMwNQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9mcjMwL21vZGVsLmMKQEAgLTAsMCArMSw0MDA0IEBACisvKiBTaW11bGF0b3IgbW9kZWwgc3VwcG9ydCBmb3IgZnIzMGJmLgorCitUSElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgorCitDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisqLworCisjZGVmaW5lIFdBTlRfQ1BVIGZyMzBiZgorI2RlZmluZSBXQU5UX0NQVV9GUjMwQkYKKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisKKy8qIFRoZSBwcm9maWxpbmcgZGF0YSBpcyByZWNvcmRlZCBoZXJlLCBidXQgaXMgYWNjZXNzZWQgdmlhIHRoZSBwcm9maWxpbmcKKyAgIG1lY2hhbmlzbS4gIEFmdGVyIGFsbCwgdGhpcyBpcyBpbmZvcm1hdGlvbiBmb3IgcHJvZmlsaW5nLiAgKi8KKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisKKy8qIE1vZGVsIGhhbmRsZXJzIGZvciBlYWNoIGluc24uICAqLworCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYWRkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9hZGRpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkaS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2FkZDIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQyLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYWRkYyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZGMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2FkZG4gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGRuLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9hZGRuaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZG5pLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYWRkbjIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGRuMi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX3N1YiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfc3ViYyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZGMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX3N1Ym4gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGRuLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9jbXAgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXAuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfY21waSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2NtcDIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXAyLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9hbmQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX29yIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYW5kLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9lb3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2FuZG0gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRtLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDIsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2FuZGggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRoLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDIsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2FuZGIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRiLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDIsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX29ybSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FuZG0uZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMiwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfb3JoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYW5kaC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAyLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9vcmIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRiLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDIsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2Vvcm0gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRtLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDIsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2VvcmggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRoLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDIsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2VvcmIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRiLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDIsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2JhbmRsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYmFuZGwuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMiwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYm9ybCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2JhbmRsLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDIsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2Jlb3JsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYmFuZGwuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMiwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYmFuZGggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9iYW5kbC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAyLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9ib3JoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYmFuZGwuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMiwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYmVvcmggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9iYW5kbC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAyLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9idHN0bCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2J0c3RsLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2J0c3RoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYnRzdGwuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbXVsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX211bHUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWx1LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX211bGggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxoLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX211bHVoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsaC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9kaXYwcyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2RpdjBzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9kaXYwdSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2RpdjB1LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfZGl2MSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2RpdjEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAwKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfZGl2MiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2RpdjIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAwKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfZGl2MyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2RpdjMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9kaXY0cyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2RpdjRzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbHNsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbHNsLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbHNsaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xzbGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbHNsMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xzbGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbHNyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbHNsLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbHNyaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xzbGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbHNyMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xzbGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYXNyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbHNsLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYXNyaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xzbGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYXNyMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xzbGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbGRpOCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaTguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbGRpMjAgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGkyMC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9sZGkzMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaTMyLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2xkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2xkdWggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHVoLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9sZHViIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGR1Yi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbGRyMTMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHIxMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbGRyMTN1aCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcjEzdWguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2xkcjEzdWIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHIxM3ViLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9sZHIxNCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcjE0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbGRyMTR1aCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcjE0dWguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9sZHIxNHViIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRyMTR1Yi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2xkcjE1IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRyMTUuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9sZHIxNWdyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRyMTVnci5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2xkcjE1ZHIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHIxNWRyLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9sZHIxNXBzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRyMTVwcy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfc3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfc3RoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RoLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9zdGIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX3N0cjEzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RyMTMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX3N0cjEzaCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjEzaC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBpbl9SaiA9IEZMRCAoaW5fUmopOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfc3RyMTNiIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RyMTNiLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIGluX1JqID0gRkxEIChpbl9Saik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9zdHIxNCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjE0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfc3RyMTRoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RyMTRoLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfc3RyMTRiIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RyMTRiLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfc3RyMTUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHIxNS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX3N0cjE1Z3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHIxNWdyLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfc3RyMTVkciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjE1ZHIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfc3RyMTVwcyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjE1cHMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbW92IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW92LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbW92ZHIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tb3Zkci5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9tb3ZwcyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdnBzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX21vdjJkciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdjJkci5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbW92MnBzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW92MnBzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9qbXAgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2ptcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2ptcGQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2ptcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2NhbGxyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jYWxsci5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2NhbGxyZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY2FsbHIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9jYWxsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jYWxsLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2NhbGxkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jYWxsLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX3JldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfcmV0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX3JldF9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9yZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfaW50IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9pbnQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9pbnRlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9pbnRlLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfcmV0aSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfcmV0aS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2JyYWQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JyYWQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYnJhIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9icmFkLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2Jub2QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ibm9kLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2JubyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Jub2QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYmVxZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmVxZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2JlcSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmVxZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2JuZWQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcWQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9ibmUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcWQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9iY2QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JjZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2JjIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iY2QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9ibmNkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iY2QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9ibmMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JjZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2JuZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5kLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYm4gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JuZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2JwZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5kLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYnAgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JuZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2J2ZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYnZkLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYnYgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2J2ZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2JudmQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2J2ZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2JudiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYnZkLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYmx0ZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmx0ZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDMpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2JsdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmx0ZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDMpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2JnZWQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JsdGQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAzKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9iZ2UgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JsdGQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAzKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9ibGVkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibGVkLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgNCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYmxlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibGVkLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgNCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYmd0ZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmxlZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDQpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2JndCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmxlZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDQpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2Jsc2QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2Jsc2QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAzKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9ibHMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2Jsc2QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAzKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9iaGlkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibHNkLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMykpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYmhpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibHNkLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMykpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfZG1vdnIxMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3ZyMTMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfZG1vdnIxM2ggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92cjEzaC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9kbW92cjEzYiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3ZyMTNiLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2Rtb3ZyMTNwaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3ZyMTNwaS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2Rtb3ZyMTNwaWggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92cjEzcGloLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfZG1vdnIxM3BpYiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3ZyMTNwaWIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9kbW92cjE1cGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92cjE1cGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9kbW92MnIxMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3YycjEzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9kbW92MnIxM2ggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92MnIxM2guZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2Rtb3YycjEzYiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3YycjEzYi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfZG1vdjJyMTNwaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3YycjEzcGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmopOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9kbW92MnIxM3BpaCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3YycjEzcGloLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfZG1vdjJyMTNwaWIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92MnIxM3BpYi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2Rtb3YycjE1cGQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92MnIxNXBkLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbGRyZXMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHJlcy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX3N0cmVzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRyZXMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9jb3BvcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NvcG9wLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfY29wbGQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jb3BsZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2NvcHN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY29wc3QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9jb3BzdiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NvcHN0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbm9wIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm9wLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYW5kY2NyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYW5kY2NyLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfb3JjY3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRjY3IuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9zdGlsbSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0aWxtLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfYWRkc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGRzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2V4dHNiIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZXh0c2IuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9leHR1YiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2V4dHViLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmkgPSBGTEQgKGluX1JpKTsKKyAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfZXh0c2ggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9leHRzaC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgb3V0X1JpID0gRkxEIChvdXRfUmkpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX2V4dHVoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZXh0dWguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIElOVCBvdXRfUmkgPSAtMTsKKyAgICBpbl9SaSA9IEZMRCAoaW5fUmkpOworICAgIG91dF9SaSA9IEZMRCAob3V0X1JpKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fUmksIGluX1JqLCBvdXRfUmkpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9sZG0wIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRtMC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3JlZ2xpc3QgPSAwOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbGRtIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3JlZ2xpc3QpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9sZG0xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRtMS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3JlZ2xpc3QgPSAwOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfbGRtIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3JlZ2xpc3QpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9zdG0wIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RtMC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3JlZ2xpc3QgPSAwOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RtIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3JlZ2xpc3QpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9zdG0xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RtMS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3JlZ2xpc3QgPSAwOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3Vfc3RtIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3JlZ2xpc3QpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2ZyMzBfMV9lbnRlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VudGVyLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmkgPSAtMTsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saiwgb3V0X1JpKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9mcjMwXzFfbGVhdmUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZWF2ZS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX1JpID0gLTE7CisgICAgSU5UIGluX1JqID0gLTE7CisgICAgSU5UIG91dF9SaSA9IC0xOworICAgIGN5Y2xlcyArPSBmcjMwYmZfbW9kZWxfZnIzMF8xX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9SaSwgaW5fUmosIG91dF9SaSk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfZnIzMF8xX3hjaGIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF94Y2hiLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fUmogPSAtMTsKKyAgICBJTlQgb3V0X1JpID0gLTE7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICBvdXRfUmkgPSBGTEQgKG91dF9SaSk7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IGZyMzBiZl9tb2RlbF9mcjMwXzFfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX1JqLCBvdXRfUmkpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9SaSA9IC0xOworICAgIElOVCBpbl9SaiA9IC0xOworICAgIGluX1JpID0gRkxEIChpbl9SaSk7CisgICAgaW5fUmogPSBGTEQgKGluX1JqKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gZnIzMGJmX21vZGVsX2ZyMzBfMV91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX1JpLCBpbl9Saik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworLyogV2UgYXNzdW1lIFVOSVRfTk9ORSA9PSAwIGJlY2F1c2UgdGhlIHRhYmxlcyBkb24ndCBhbHdheXMgdGVybWluYXRlCisgICBlbnRyaWVzIHdpdGggaXQuICAqLworCisvKiBNb2RlbCB0aW1pbmcgZGF0YSBmb3IgYGZyMzAtMScuICAqLworCitzdGF0aWMgY29uc3QgSU5TTl9USU1JTkcgZnIzMF8xX3RpbWluZ1tdID0geworICB7IEZSMzBCRl9JTlNOX1hfSU5WQUxJRCwgMCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9YX0FGVEVSLCAwLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX1hfQkVGT1JFLCAwLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX1hfQ1RJX0NIQUlOLCAwLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX1hfQ0hBSU4sIDAsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fWF9CRUdJTiwgMCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9BREQsIG1vZGVsX2ZyMzBfMV9hZGQsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQURESSwgbW9kZWxfZnIzMF8xX2FkZGksIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQUREMiwgbW9kZWxfZnIzMF8xX2FkZDIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQUREQywgbW9kZWxfZnIzMF8xX2FkZGMsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQURETiwgbW9kZWxfZnIzMF8xX2FkZG4sIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQURETkksIG1vZGVsX2ZyMzBfMV9hZGRuaSwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9BREROMiwgbW9kZWxfZnIzMF8xX2FkZG4yLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX1NVQiwgbW9kZWxfZnIzMF8xX3N1YiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9TVUJDLCBtb2RlbF9mcjMwXzFfc3ViYywgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9TVUJOLCBtb2RlbF9mcjMwXzFfc3VibiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9DTVAsIG1vZGVsX2ZyMzBfMV9jbXAsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQ01QSSwgbW9kZWxfZnIzMF8xX2NtcGksIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQ01QMiwgbW9kZWxfZnIzMF8xX2NtcDIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQU5ELCBtb2RlbF9mcjMwXzFfYW5kLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX09SLCBtb2RlbF9mcjMwXzFfb3IsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fRU9SLCBtb2RlbF9mcjMwXzFfZW9yLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0FORE0sIG1vZGVsX2ZyMzBfMV9hbmRtLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9BTkRILCBtb2RlbF9mcjMwXzFfYW5kaCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQU5EQiwgbW9kZWxfZnIzMF8xX2FuZGIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX09STSwgbW9kZWxfZnIzMF8xX29ybSwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fT1JILCBtb2RlbF9mcjMwXzFfb3JoLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9PUkIsIG1vZGVsX2ZyMzBfMV9vcmIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0VPUk0sIG1vZGVsX2ZyMzBfMV9lb3JtLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9FT1JILCBtb2RlbF9mcjMwXzFfZW9yaCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fRU9SQiwgbW9kZWxfZnIzMF8xX2VvcmIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0JBTkRMLCBtb2RlbF9mcjMwXzFfYmFuZGwsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0JPUkwsIG1vZGVsX2ZyMzBfMV9ib3JsLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9CRU9STCwgbW9kZWxfZnIzMF8xX2Jlb3JsLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9CQU5ESCwgbW9kZWxfZnIzMF8xX2JhbmRoLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9CT1JILCBtb2RlbF9mcjMwXzFfYm9yaCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQkVPUkgsIG1vZGVsX2ZyMzBfMV9iZW9yaCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQlRTVEwsIG1vZGVsX2ZyMzBfMV9idHN0bCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMiB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9CVFNUSCwgbW9kZWxfZnIzMF8xX2J0c3RoLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAyIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX01VTCwgbW9kZWxfZnIzMF8xX211bCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgNSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9NVUxVLCBtb2RlbF9mcjMwXzFfbXVsdSwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgNSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9NVUxILCBtb2RlbF9mcjMwXzFfbXVsaCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMyB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9NVUxVSCwgbW9kZWxfZnIzMF8xX211bHVoLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAzIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0RJVjBTLCBtb2RlbF9mcjMwXzFfZGl2MHMsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fRElWMFUsIG1vZGVsX2ZyMzBfMV9kaXYwdSwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9ESVYxLCBtb2RlbF9mcjMwXzFfZGl2MSwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9ESVYyLCBtb2RlbF9mcjMwXzFfZGl2MiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9ESVYzLCBtb2RlbF9mcjMwXzFfZGl2MywgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9ESVY0UywgbW9kZWxfZnIzMF8xX2RpdjRzLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0xTTCwgbW9kZWxfZnIzMF8xX2xzbCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9MU0xJLCBtb2RlbF9mcjMwXzFfbHNsaSwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9MU0wyLCBtb2RlbF9mcjMwXzFfbHNsMiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9MU1IsIG1vZGVsX2ZyMzBfMV9sc3IsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fTFNSSSwgbW9kZWxfZnIzMF8xX2xzcmksIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fTFNSMiwgbW9kZWxfZnIzMF8xX2xzcjIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQVNSLCBtb2RlbF9mcjMwXzFfYXNyLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0FTUkksIG1vZGVsX2ZyMzBfMV9hc3JpLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0FTUjIsIG1vZGVsX2ZyMzBfMV9hc3IyLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0xESTgsIG1vZGVsX2ZyMzBfMV9sZGk4LCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0xESTIwLCBtb2RlbF9mcjMwXzFfbGRpMjAsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDIgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fTERJMzIsIG1vZGVsX2ZyMzBfMV9sZGkzMiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMyB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9MRCwgbW9kZWxfZnIzMF8xX2xkLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0xEVUgsIG1vZGVsX2ZyMzBfMV9sZHVoLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0xEVUIsIG1vZGVsX2ZyMzBfMV9sZHViLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0xEUjEzLCBtb2RlbF9mcjMwXzFfbGRyMTMsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fTERSMTNVSCwgbW9kZWxfZnIzMF8xX2xkcjEzdWgsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fTERSMTNVQiwgbW9kZWxfZnIzMF8xX2xkcjEzdWIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fTERSMTQsIG1vZGVsX2ZyMzBfMV9sZHIxNCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9MRFIxNFVILCBtb2RlbF9mcjMwXzFfbGRyMTR1aCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9MRFIxNFVCLCBtb2RlbF9mcjMwXzFfbGRyMTR1YiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9MRFIxNSwgbW9kZWxfZnIzMF8xX2xkcjE1LCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0xEUjE1R1IsIG1vZGVsX2ZyMzBfMV9sZHIxNWdyLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0xEUjE1RFIsIG1vZGVsX2ZyMzBfMV9sZHIxNWRyLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0xEUjE1UFMsIG1vZGVsX2ZyMzBfMV9sZHIxNXBzLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX1NULCBtb2RlbF9mcjMwXzFfc3QsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX1NUSCwgbW9kZWxfZnIzMF8xX3N0aCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fU1RCLCBtb2RlbF9mcjMwXzFfc3RiLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9TVFIxMywgbW9kZWxfZnIzMF8xX3N0cjEzLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9TVFIxM0gsIG1vZGVsX2ZyMzBfMV9zdHIxM2gsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX1NUUjEzQiwgbW9kZWxfZnIzMF8xX3N0cjEzYiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fU1RSMTQsIG1vZGVsX2ZyMzBfMV9zdHIxNCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fU1RSMTRILCBtb2RlbF9mcjMwXzFfc3RyMTRoLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9TVFIxNEIsIG1vZGVsX2ZyMzBfMV9zdHIxNGIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX1NUUjE1LCBtb2RlbF9mcjMwXzFfc3RyMTUsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX1NUUjE1R1IsIG1vZGVsX2ZyMzBfMV9zdHIxNWdyLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9TVFIxNURSLCBtb2RlbF9mcjMwXzFfc3RyMTVkciwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fU1RSMTVQUywgbW9kZWxfZnIzMF8xX3N0cjE1cHMsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX01PViwgbW9kZWxfZnIzMF8xX21vdiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9NT1ZEUiwgbW9kZWxfZnIzMF8xX21vdmRyLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX01PVlBTLCBtb2RlbF9mcjMwXzFfbW92cHMsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fTU9WMkRSLCBtb2RlbF9mcjMwXzFfbW92MmRyLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX01PVjJQUywgbW9kZWxfZnIzMF8xX21vdjJwcywgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9KTVAsIG1vZGVsX2ZyMzBfMV9qbXAsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9KTVBELCBtb2RlbF9mcjMwXzFfam1wZCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0NBTExSLCBtb2RlbF9mcjMwXzFfY2FsbHIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9DQUxMUkQsIG1vZGVsX2ZyMzBfMV9jYWxscmQsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9DQUxMLCBtb2RlbF9mcjMwXzFfY2FsbCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0NBTExELCBtb2RlbF9mcjMwXzFfY2FsbGQsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9SRVQsIG1vZGVsX2ZyMzBfMV9yZXQsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9SRVRfRCwgbW9kZWxfZnIzMF8xX3JldF9kLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fSU5ULCBtb2RlbF9mcjMwXzFfaW50LCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCA2IH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0lOVEUsIG1vZGVsX2ZyMzBfMV9pbnRlLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCA2IH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX1JFVEksIG1vZGVsX2ZyMzBfMV9yZXRpLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCA0IH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0JSQUQsIG1vZGVsX2ZyMzBfMV9icmFkLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQlJBLCBtb2RlbF9mcjMwXzFfYnJhLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQk5PRCwgbW9kZWxfZnIzMF8xX2Jub2QsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9CTk8sIG1vZGVsX2ZyMzBfMV9ibm8sIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9CRVFELCBtb2RlbF9mcjMwXzFfYmVxZCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0JFUSwgbW9kZWxfZnIzMF8xX2JlcSwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0JORUQsIG1vZGVsX2ZyMzBfMV9ibmVkLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQk5FLCBtb2RlbF9mcjMwXzFfYm5lLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQkNELCBtb2RlbF9mcjMwXzFfYmNkLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQkMsIG1vZGVsX2ZyMzBfMV9iYywgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0JOQ0QsIG1vZGVsX2ZyMzBfMV9ibmNkLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQk5DLCBtb2RlbF9mcjMwXzFfYm5jLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQk5ELCBtb2RlbF9mcjMwXzFfYm5kLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQk4sIG1vZGVsX2ZyMzBfMV9ibiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0JQRCwgbW9kZWxfZnIzMF8xX2JwZCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0JQLCBtb2RlbF9mcjMwXzFfYnAsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9CVkQsIG1vZGVsX2ZyMzBfMV9idmQsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9CViwgbW9kZWxfZnIzMF8xX2J2LCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQk5WRCwgbW9kZWxfZnIzMF8xX2JudmQsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9CTlYsIG1vZGVsX2ZyMzBfMV9ibnYsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9CTFRELCBtb2RlbF9mcjMwXzFfYmx0ZCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0JMVCwgbW9kZWxfZnIzMF8xX2JsdCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0JHRUQsIG1vZGVsX2ZyMzBfMV9iZ2VkLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQkdFLCBtb2RlbF9mcjMwXzFfYmdlLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQkxFRCwgbW9kZWxfZnIzMF8xX2JsZWQsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9CTEUsIG1vZGVsX2ZyMzBfMV9ibGUsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9CR1RELCBtb2RlbF9mcjMwXzFfYmd0ZCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0JHVCwgbW9kZWxfZnIzMF8xX2JndCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfQ1RJLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0JMU0QsIG1vZGVsX2ZyMzBfMV9ibHNkLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQkxTLCBtb2RlbF9mcjMwXzFfYmxzLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9DVEksIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQkhJRCwgbW9kZWxfZnIzMF8xX2JoaWQsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9CSEksIG1vZGVsX2ZyMzBfMV9iaGksIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9ETU9WUjEzLCBtb2RlbF9mcjMwXzFfZG1vdnIxMywgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fRE1PVlIxM0gsIG1vZGVsX2ZyMzBfMV9kbW92cjEzaCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fRE1PVlIxM0IsIG1vZGVsX2ZyMzBfMV9kbW92cjEzYiwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fRE1PVlIxM1BJLCBtb2RlbF9mcjMwXzFfZG1vdnIxM3BpLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9ETU9WUjEzUElILCBtb2RlbF9mcjMwXzFfZG1vdnIxM3BpaCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fRE1PVlIxM1BJQiwgbW9kZWxfZnIzMF8xX2Rtb3ZyMTNwaWIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSwgeyAoaW50KSBVTklUX0ZSMzBfMV9VX1NUT1JFLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0RNT1ZSMTVQSSwgbW9kZWxfZnIzMF8xX2Rtb3ZyMTVwaSwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fRE1PVjJSMTMsIG1vZGVsX2ZyMzBfMV9kbW92MnIxMywgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9ETU9WMlIxM0gsIG1vZGVsX2ZyMzBfMV9kbW92MnIxM2gsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xPQUQsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fRE1PVjJSMTNCLCBtb2RlbF9mcjMwXzFfZG1vdjJyMTNiLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0RNT1YyUjEzUEksIG1vZGVsX2ZyMzBfMV9kbW92MnIxM3BpLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9ETU9WMlIxM1BJSCwgbW9kZWxfZnIzMF8xX2Rtb3YycjEzcGloLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9ETU9WMlIxM1BJQiwgbW9kZWxfZnIzMF8xX2Rtb3YycjEzcGliLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9ETU9WMlIxNVBELCBtb2RlbF9mcjMwXzFfZG1vdjJyMTVwZCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfTE9BRCwgMSwgMSB9LCB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RPUkUsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fTERSRVMsIG1vZGVsX2ZyMzBfMV9sZHJlcywgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9TVFJFUywgbW9kZWxfZnIzMF8xX3N0cmVzLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0NPUE9QLCBtb2RlbF9mcjMwXzFfY29wb3AsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQ09QTEQsIG1vZGVsX2ZyMzBfMV9jb3BsZCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9DT1BTVCwgbW9kZWxfZnIzMF8xX2NvcHN0LCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0NPUFNWLCBtb2RlbF9mcjMwXzFfY29wc3YsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fTk9QLCBtb2RlbF9mcjMwXzFfbm9wLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0FORENDUiwgbW9kZWxfZnIzMF8xX2FuZGNjciwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9PUkNDUiwgbW9kZWxfZnIzMF8xX29yY2NyLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX1NUSUxNLCBtb2RlbF9mcjMwXzFfc3RpbG0sIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fQUREU1AsIG1vZGVsX2ZyMzBfMV9hZGRzcCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9FWFRTQiwgbW9kZWxfZnIzMF8xX2V4dHNiLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0VYVFVCLCBtb2RlbF9mcjMwXzFfZXh0dWIsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fRVhUU0gsIG1vZGVsX2ZyMzBfMV9leHRzaCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9FWFRVSCwgbW9kZWxfZnIzMF8xX2V4dHVoLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX0xETTAsIG1vZGVsX2ZyMzBfMV9sZG0wLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MRE0sIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fTERNMSwgbW9kZWxfZnIzMF8xX2xkbTEsIHsgeyAoaW50KSBVTklUX0ZSMzBfMV9VX0xETSwgMSwgMSB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9TVE0wLCBtb2RlbF9mcjMwXzFfc3RtMCwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfU1RNLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX1NUTTEsIG1vZGVsX2ZyMzBfMV9zdG0xLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE0sIDEsIDEgfSB9IH0sCisgIHsgRlIzMEJGX0lOU05fRU5URVIsIG1vZGVsX2ZyMzBfMV9lbnRlciwgeyB7IChpbnQpIFVOSVRfRlIzMF8xX1VfRVhFQywgMSwgMiB9IH0gfSwKKyAgeyBGUjMwQkZfSU5TTl9MRUFWRSwgbW9kZWxfZnIzMF8xX2xlYXZlLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEZSMzBCRl9JTlNOX1hDSEIsIG1vZGVsX2ZyMzBfMV94Y2hiLCB7IHsgKGludCkgVU5JVF9GUjMwXzFfVV9MT0FELCAxLCAxIH0sIHsgKGludCkgVU5JVF9GUjMwXzFfVV9TVE9SRSwgMSwgMSB9IH0gfSwKK307CisKKyNlbmRpZiAvKiBXSVRIX1BST0ZJTEVfTU9ERUxfUCAqLworCitzdGF0aWMgdm9pZAorZnIzMF8xX21vZGVsX2luaXQgKFNJTV9DUFUgKmNwdSkKK3sKKyAgQ1BVX01PREVMX0RBVEEgKGNwdSkgPSAodm9pZCAqKSB6YWxsb2MgKHNpemVvZiAoTU9ERUxfRlIzMF8xX0RBVEEpKTsKK30KKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisjZGVmaW5lIFRJTUlOR19EQVRBKHRkKSB0ZAorI2Vsc2UKKyNkZWZpbmUgVElNSU5HX0RBVEEodGQpIDAKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgTU9ERUwgZnIzMF9tb2RlbHNbXSA9Cit7CisgIHsgImZyMzAtMSIsICYgZnIzMF9tYWNoLCBNT0RFTF9GUjMwXzEsIFRJTUlOR19EQVRBICgmIGZyMzBfMV90aW1pbmdbMF0pLCBmcjMwXzFfbW9kZWxfaW5pdCB9LAorICB7IDAgfQorfTsKKworLyogVGhlIHByb3BlcnRpZXMgb2YgdGhpcyBjcHUncyBpbXBsZW1lbnRhdGlvbi4gICovCisKK3N0YXRpYyBjb25zdCBNQUNIX0lNUF9QUk9QRVJUSUVTIGZyMzBiZl9pbXBfcHJvcGVydGllcyA9Cit7CisgIHNpemVvZiAoU0lNX0NQVSksCisjaWYgV0lUSF9TQ0FDSEUKKyAgc2l6ZW9mIChTQ0FDSEUpCisjZWxzZQorICAwCisjZW5kaWYKK307CisKKworc3RhdGljIHZvaWQKK2ZyMzBiZl9wcmVwYXJlX3J1biAoU0lNX0NQVSAqY3B1KQoreworICBpZiAoQ1BVX0lERVNDIChjcHUpID09IE5VTEwpCisgICAgZnIzMGJmX2luaXRfaWRlc2NfdGFibGUgKGNwdSk7Cit9CisKK3N0YXRpYyBjb25zdCBDR0VOX0lOU04gKgorZnIzMGJmX2dldF9pZGF0YSAoU0lNX0NQVSAqY3B1LCBpbnQgaW51bSkKK3sKKyAgcmV0dXJuIENQVV9JREVTQyAoY3B1KSBbaW51bV0uaWRhdGE7Cit9CisKK3N0YXRpYyB2b2lkCitmcjMwX2luaXRfY3B1IChTSU1fQ1BVICpjcHUpCit7CisgIENQVV9SRUdfRkVUQ0ggKGNwdSkgPSBmcjMwYmZfZmV0Y2hfcmVnaXN0ZXI7CisgIENQVV9SRUdfU1RPUkUgKGNwdSkgPSBmcjMwYmZfc3RvcmVfcmVnaXN0ZXI7CisgIENQVV9QQ19GRVRDSCAoY3B1KSA9IGZyMzBiZl9oX3BjX2dldDsKKyAgQ1BVX1BDX1NUT1JFIChjcHUpID0gZnIzMGJmX2hfcGNfc2V0OworICBDUFVfR0VUX0lEQVRBIChjcHUpID0gZnIzMGJmX2dldF9pZGF0YTsKKyAgQ1BVX01BWF9JTlNOUyAoY3B1KSA9IEZSMzBCRl9JTlNOX01BWDsKKyAgQ1BVX0lOU05fTkFNRSAoY3B1KSA9IGNnZW5faW5zbl9uYW1lOworICBDUFVfRlVMTF9FTkdJTkVfRk4gKGNwdSkgPSBmcjMwYmZfZW5naW5lX3J1bl9mdWxsOworI2lmIFdJVEhfRkFTVAorICBDUFVfRkFTVF9FTkdJTkVfRk4gKGNwdSkgPSBmcjMwYmZfZW5naW5lX3J1bl9mYXN0OworI2Vsc2UKKyAgQ1BVX0ZBU1RfRU5HSU5FX0ZOIChjcHUpID0gZnIzMGJmX2VuZ2luZV9ydW5fZnVsbDsKKyNlbmRpZgorfQorCitjb25zdCBNQUNIIGZyMzBfbWFjaCA9Cit7CisgICJmcjMwIiwgImZyMzAiLAorICAzMiwgMzIsICYgZnIzMF9tb2RlbHNbMF0sICYgZnIzMGJmX2ltcF9wcm9wZXJ0aWVzLAorICBmcjMwX2luaXRfY3B1LAorICBmcjMwYmZfcHJlcGFyZV9ydW4KK307CisKZGlmZiAtLWdpdCBhL3NpbS9mcjMwL3NlbS1zd2l0Y2guYyBiL3NpbS9mcjMwL3NlbS1zd2l0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njk1MGIyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2ZyMzAvc2VtLXN3aXRjaC5jCkBAIC0wLDAgKzEsNTM5NyBAQAorLyogU2ltdWxhdG9yIGluc3RydWN0aW9uIHNlbWFudGljcyBmb3IgZnIzMGJmLgorCitUSElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgorCitDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisqLworCisjaWZkZWYgREVGSU5FX0xBQkVMUworCisgIC8qIFRoZSBsYWJlbHMgaGF2ZSB0aGUgY2FzZSB0aGV5IGhhdmUgYmVjYXVzZSB0aGUgZW51bSBvZiBpbnNuIHR5cGVzCisgICAgIGlzIGFsbCB1cHBlcmNhc2UgYW5kIGluIHRoZSBub24tc3RkYyBjYXNlIHRoZSBpbnNuIHN5bWJvbCBpcyBidWlsdAorICAgICBpbnRvIHRoZSBlbnVtIG5hbWUuICAqLworCisgIHN0YXRpYyBzdHJ1Y3QgeworICAgIGludCBpbmRleDsKKyAgICB2b2lkICpsYWJlbDsKKyAgfSBsYWJlbHNbXSA9IHsKKyAgICB7IEZSMzBCRl9JTlNOX1hfSU5WQUxJRCwgJiYgY2FzZV9zZW1fSU5TTl9YX0lOVkFMSUQgfSwKKyAgICB7IEZSMzBCRl9JTlNOX1hfQUZURVIsICYmIGNhc2Vfc2VtX0lOU05fWF9BRlRFUiB9LAorICAgIHsgRlIzMEJGX0lOU05fWF9CRUZPUkUsICYmIGNhc2Vfc2VtX0lOU05fWF9CRUZPUkUgfSwKKyAgICB7IEZSMzBCRl9JTlNOX1hfQ1RJX0NIQUlOLCAmJiBjYXNlX3NlbV9JTlNOX1hfQ1RJX0NIQUlOIH0sCisgICAgeyBGUjMwQkZfSU5TTl9YX0NIQUlOLCAmJiBjYXNlX3NlbV9JTlNOX1hfQ0hBSU4gfSwKKyAgICB7IEZSMzBCRl9JTlNOX1hfQkVHSU4sICYmIGNhc2Vfc2VtX0lOU05fWF9CRUdJTiB9LAorICAgIHsgRlIzMEJGX0lOU05fQURELCAmJiBjYXNlX3NlbV9JTlNOX0FERCB9LAorICAgIHsgRlIzMEJGX0lOU05fQURESSwgJiYgY2FzZV9zZW1fSU5TTl9BRERJIH0sCisgICAgeyBGUjMwQkZfSU5TTl9BREQyLCAmJiBjYXNlX3NlbV9JTlNOX0FERDIgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0FEREMsICYmIGNhc2Vfc2VtX0lOU05fQUREQyB9LAorICAgIHsgRlIzMEJGX0lOU05fQURETiwgJiYgY2FzZV9zZW1fSU5TTl9BREROIH0sCisgICAgeyBGUjMwQkZfSU5TTl9BREROSSwgJiYgY2FzZV9zZW1fSU5TTl9BREROSSB9LAorICAgIHsgRlIzMEJGX0lOU05fQURETjIsICYmIGNhc2Vfc2VtX0lOU05fQURETjIgfSwKKyAgICB7IEZSMzBCRl9JTlNOX1NVQiwgJiYgY2FzZV9zZW1fSU5TTl9TVUIgfSwKKyAgICB7IEZSMzBCRl9JTlNOX1NVQkMsICYmIGNhc2Vfc2VtX0lOU05fU1VCQyB9LAorICAgIHsgRlIzMEJGX0lOU05fU1VCTiwgJiYgY2FzZV9zZW1fSU5TTl9TVUJOIH0sCisgICAgeyBGUjMwQkZfSU5TTl9DTVAsICYmIGNhc2Vfc2VtX0lOU05fQ01QIH0sCisgICAgeyBGUjMwQkZfSU5TTl9DTVBJLCAmJiBjYXNlX3NlbV9JTlNOX0NNUEkgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0NNUDIsICYmIGNhc2Vfc2VtX0lOU05fQ01QMiB9LAorICAgIHsgRlIzMEJGX0lOU05fQU5ELCAmJiBjYXNlX3NlbV9JTlNOX0FORCB9LAorICAgIHsgRlIzMEJGX0lOU05fT1IsICYmIGNhc2Vfc2VtX0lOU05fT1IgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0VPUiwgJiYgY2FzZV9zZW1fSU5TTl9FT1IgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0FORE0sICYmIGNhc2Vfc2VtX0lOU05fQU5ETSB9LAorICAgIHsgRlIzMEJGX0lOU05fQU5ESCwgJiYgY2FzZV9zZW1fSU5TTl9BTkRIIH0sCisgICAgeyBGUjMwQkZfSU5TTl9BTkRCLCAmJiBjYXNlX3NlbV9JTlNOX0FOREIgfSwKKyAgICB7IEZSMzBCRl9JTlNOX09STSwgJiYgY2FzZV9zZW1fSU5TTl9PUk0gfSwKKyAgICB7IEZSMzBCRl9JTlNOX09SSCwgJiYgY2FzZV9zZW1fSU5TTl9PUkggfSwKKyAgICB7IEZSMzBCRl9JTlNOX09SQiwgJiYgY2FzZV9zZW1fSU5TTl9PUkIgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0VPUk0sICYmIGNhc2Vfc2VtX0lOU05fRU9STSB9LAorICAgIHsgRlIzMEJGX0lOU05fRU9SSCwgJiYgY2FzZV9zZW1fSU5TTl9FT1JIIH0sCisgICAgeyBGUjMwQkZfSU5TTl9FT1JCLCAmJiBjYXNlX3NlbV9JTlNOX0VPUkIgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0JBTkRMLCAmJiBjYXNlX3NlbV9JTlNOX0JBTkRMIH0sCisgICAgeyBGUjMwQkZfSU5TTl9CT1JMLCAmJiBjYXNlX3NlbV9JTlNOX0JPUkwgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0JFT1JMLCAmJiBjYXNlX3NlbV9JTlNOX0JFT1JMIH0sCisgICAgeyBGUjMwQkZfSU5TTl9CQU5ESCwgJiYgY2FzZV9zZW1fSU5TTl9CQU5ESCB9LAorICAgIHsgRlIzMEJGX0lOU05fQk9SSCwgJiYgY2FzZV9zZW1fSU5TTl9CT1JIIH0sCisgICAgeyBGUjMwQkZfSU5TTl9CRU9SSCwgJiYgY2FzZV9zZW1fSU5TTl9CRU9SSCB9LAorICAgIHsgRlIzMEJGX0lOU05fQlRTVEwsICYmIGNhc2Vfc2VtX0lOU05fQlRTVEwgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0JUU1RILCAmJiBjYXNlX3NlbV9JTlNOX0JUU1RIIH0sCisgICAgeyBGUjMwQkZfSU5TTl9NVUwsICYmIGNhc2Vfc2VtX0lOU05fTVVMIH0sCisgICAgeyBGUjMwQkZfSU5TTl9NVUxVLCAmJiBjYXNlX3NlbV9JTlNOX01VTFUgfSwKKyAgICB7IEZSMzBCRl9JTlNOX01VTEgsICYmIGNhc2Vfc2VtX0lOU05fTVVMSCB9LAorICAgIHsgRlIzMEJGX0lOU05fTVVMVUgsICYmIGNhc2Vfc2VtX0lOU05fTVVMVUggfSwKKyAgICB7IEZSMzBCRl9JTlNOX0RJVjBTLCAmJiBjYXNlX3NlbV9JTlNOX0RJVjBTIH0sCisgICAgeyBGUjMwQkZfSU5TTl9ESVYwVSwgJiYgY2FzZV9zZW1fSU5TTl9ESVYwVSB9LAorICAgIHsgRlIzMEJGX0lOU05fRElWMSwgJiYgY2FzZV9zZW1fSU5TTl9ESVYxIH0sCisgICAgeyBGUjMwQkZfSU5TTl9ESVYyLCAmJiBjYXNlX3NlbV9JTlNOX0RJVjIgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0RJVjMsICYmIGNhc2Vfc2VtX0lOU05fRElWMyB9LAorICAgIHsgRlIzMEJGX0lOU05fRElWNFMsICYmIGNhc2Vfc2VtX0lOU05fRElWNFMgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0xTTCwgJiYgY2FzZV9zZW1fSU5TTl9MU0wgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0xTTEksICYmIGNhc2Vfc2VtX0lOU05fTFNMSSB9LAorICAgIHsgRlIzMEJGX0lOU05fTFNMMiwgJiYgY2FzZV9zZW1fSU5TTl9MU0wyIH0sCisgICAgeyBGUjMwQkZfSU5TTl9MU1IsICYmIGNhc2Vfc2VtX0lOU05fTFNSIH0sCisgICAgeyBGUjMwQkZfSU5TTl9MU1JJLCAmJiBjYXNlX3NlbV9JTlNOX0xTUkkgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0xTUjIsICYmIGNhc2Vfc2VtX0lOU05fTFNSMiB9LAorICAgIHsgRlIzMEJGX0lOU05fQVNSLCAmJiBjYXNlX3NlbV9JTlNOX0FTUiB9LAorICAgIHsgRlIzMEJGX0lOU05fQVNSSSwgJiYgY2FzZV9zZW1fSU5TTl9BU1JJIH0sCisgICAgeyBGUjMwQkZfSU5TTl9BU1IyLCAmJiBjYXNlX3NlbV9JTlNOX0FTUjIgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0xESTgsICYmIGNhc2Vfc2VtX0lOU05fTERJOCB9LAorICAgIHsgRlIzMEJGX0lOU05fTERJMjAsICYmIGNhc2Vfc2VtX0lOU05fTERJMjAgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0xESTMyLCAmJiBjYXNlX3NlbV9JTlNOX0xESTMyIH0sCisgICAgeyBGUjMwQkZfSU5TTl9MRCwgJiYgY2FzZV9zZW1fSU5TTl9MRCB9LAorICAgIHsgRlIzMEJGX0lOU05fTERVSCwgJiYgY2FzZV9zZW1fSU5TTl9MRFVIIH0sCisgICAgeyBGUjMwQkZfSU5TTl9MRFVCLCAmJiBjYXNlX3NlbV9JTlNOX0xEVUIgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0xEUjEzLCAmJiBjYXNlX3NlbV9JTlNOX0xEUjEzIH0sCisgICAgeyBGUjMwQkZfSU5TTl9MRFIxM1VILCAmJiBjYXNlX3NlbV9JTlNOX0xEUjEzVUggfSwKKyAgICB7IEZSMzBCRl9JTlNOX0xEUjEzVUIsICYmIGNhc2Vfc2VtX0lOU05fTERSMTNVQiB9LAorICAgIHsgRlIzMEJGX0lOU05fTERSMTQsICYmIGNhc2Vfc2VtX0lOU05fTERSMTQgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0xEUjE0VUgsICYmIGNhc2Vfc2VtX0lOU05fTERSMTRVSCB9LAorICAgIHsgRlIzMEJGX0lOU05fTERSMTRVQiwgJiYgY2FzZV9zZW1fSU5TTl9MRFIxNFVCIH0sCisgICAgeyBGUjMwQkZfSU5TTl9MRFIxNSwgJiYgY2FzZV9zZW1fSU5TTl9MRFIxNSB9LAorICAgIHsgRlIzMEJGX0lOU05fTERSMTVHUiwgJiYgY2FzZV9zZW1fSU5TTl9MRFIxNUdSIH0sCisgICAgeyBGUjMwQkZfSU5TTl9MRFIxNURSLCAmJiBjYXNlX3NlbV9JTlNOX0xEUjE1RFIgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0xEUjE1UFMsICYmIGNhc2Vfc2VtX0lOU05fTERSMTVQUyB9LAorICAgIHsgRlIzMEJGX0lOU05fU1QsICYmIGNhc2Vfc2VtX0lOU05fU1QgfSwKKyAgICB7IEZSMzBCRl9JTlNOX1NUSCwgJiYgY2FzZV9zZW1fSU5TTl9TVEggfSwKKyAgICB7IEZSMzBCRl9JTlNOX1NUQiwgJiYgY2FzZV9zZW1fSU5TTl9TVEIgfSwKKyAgICB7IEZSMzBCRl9JTlNOX1NUUjEzLCAmJiBjYXNlX3NlbV9JTlNOX1NUUjEzIH0sCisgICAgeyBGUjMwQkZfSU5TTl9TVFIxM0gsICYmIGNhc2Vfc2VtX0lOU05fU1RSMTNIIH0sCisgICAgeyBGUjMwQkZfSU5TTl9TVFIxM0IsICYmIGNhc2Vfc2VtX0lOU05fU1RSMTNCIH0sCisgICAgeyBGUjMwQkZfSU5TTl9TVFIxNCwgJiYgY2FzZV9zZW1fSU5TTl9TVFIxNCB9LAorICAgIHsgRlIzMEJGX0lOU05fU1RSMTRILCAmJiBjYXNlX3NlbV9JTlNOX1NUUjE0SCB9LAorICAgIHsgRlIzMEJGX0lOU05fU1RSMTRCLCAmJiBjYXNlX3NlbV9JTlNOX1NUUjE0QiB9LAorICAgIHsgRlIzMEJGX0lOU05fU1RSMTUsICYmIGNhc2Vfc2VtX0lOU05fU1RSMTUgfSwKKyAgICB7IEZSMzBCRl9JTlNOX1NUUjE1R1IsICYmIGNhc2Vfc2VtX0lOU05fU1RSMTVHUiB9LAorICAgIHsgRlIzMEJGX0lOU05fU1RSMTVEUiwgJiYgY2FzZV9zZW1fSU5TTl9TVFIxNURSIH0sCisgICAgeyBGUjMwQkZfSU5TTl9TVFIxNVBTLCAmJiBjYXNlX3NlbV9JTlNOX1NUUjE1UFMgfSwKKyAgICB7IEZSMzBCRl9JTlNOX01PViwgJiYgY2FzZV9zZW1fSU5TTl9NT1YgfSwKKyAgICB7IEZSMzBCRl9JTlNOX01PVkRSLCAmJiBjYXNlX3NlbV9JTlNOX01PVkRSIH0sCisgICAgeyBGUjMwQkZfSU5TTl9NT1ZQUywgJiYgY2FzZV9zZW1fSU5TTl9NT1ZQUyB9LAorICAgIHsgRlIzMEJGX0lOU05fTU9WMkRSLCAmJiBjYXNlX3NlbV9JTlNOX01PVjJEUiB9LAorICAgIHsgRlIzMEJGX0lOU05fTU9WMlBTLCAmJiBjYXNlX3NlbV9JTlNOX01PVjJQUyB9LAorICAgIHsgRlIzMEJGX0lOU05fSk1QLCAmJiBjYXNlX3NlbV9JTlNOX0pNUCB9LAorICAgIHsgRlIzMEJGX0lOU05fSk1QRCwgJiYgY2FzZV9zZW1fSU5TTl9KTVBEIH0sCisgICAgeyBGUjMwQkZfSU5TTl9DQUxMUiwgJiYgY2FzZV9zZW1fSU5TTl9DQUxMUiB9LAorICAgIHsgRlIzMEJGX0lOU05fQ0FMTFJELCAmJiBjYXNlX3NlbV9JTlNOX0NBTExSRCB9LAorICAgIHsgRlIzMEJGX0lOU05fQ0FMTCwgJiYgY2FzZV9zZW1fSU5TTl9DQUxMIH0sCisgICAgeyBGUjMwQkZfSU5TTl9DQUxMRCwgJiYgY2FzZV9zZW1fSU5TTl9DQUxMRCB9LAorICAgIHsgRlIzMEJGX0lOU05fUkVULCAmJiBjYXNlX3NlbV9JTlNOX1JFVCB9LAorICAgIHsgRlIzMEJGX0lOU05fUkVUX0QsICYmIGNhc2Vfc2VtX0lOU05fUkVUX0QgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0lOVCwgJiYgY2FzZV9zZW1fSU5TTl9JTlQgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0lOVEUsICYmIGNhc2Vfc2VtX0lOU05fSU5URSB9LAorICAgIHsgRlIzMEJGX0lOU05fUkVUSSwgJiYgY2FzZV9zZW1fSU5TTl9SRVRJIH0sCisgICAgeyBGUjMwQkZfSU5TTl9CUkFELCAmJiBjYXNlX3NlbV9JTlNOX0JSQUQgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0JSQSwgJiYgY2FzZV9zZW1fSU5TTl9CUkEgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0JOT0QsICYmIGNhc2Vfc2VtX0lOU05fQk5PRCB9LAorICAgIHsgRlIzMEJGX0lOU05fQk5PLCAmJiBjYXNlX3NlbV9JTlNOX0JOTyB9LAorICAgIHsgRlIzMEJGX0lOU05fQkVRRCwgJiYgY2FzZV9zZW1fSU5TTl9CRVFEIH0sCisgICAgeyBGUjMwQkZfSU5TTl9CRVEsICYmIGNhc2Vfc2VtX0lOU05fQkVRIH0sCisgICAgeyBGUjMwQkZfSU5TTl9CTkVELCAmJiBjYXNlX3NlbV9JTlNOX0JORUQgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0JORSwgJiYgY2FzZV9zZW1fSU5TTl9CTkUgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0JDRCwgJiYgY2FzZV9zZW1fSU5TTl9CQ0QgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0JDLCAmJiBjYXNlX3NlbV9JTlNOX0JDIH0sCisgICAgeyBGUjMwQkZfSU5TTl9CTkNELCAmJiBjYXNlX3NlbV9JTlNOX0JOQ0QgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0JOQywgJiYgY2FzZV9zZW1fSU5TTl9CTkMgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0JORCwgJiYgY2FzZV9zZW1fSU5TTl9CTkQgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0JOLCAmJiBjYXNlX3NlbV9JTlNOX0JOIH0sCisgICAgeyBGUjMwQkZfSU5TTl9CUEQsICYmIGNhc2Vfc2VtX0lOU05fQlBEIH0sCisgICAgeyBGUjMwQkZfSU5TTl9CUCwgJiYgY2FzZV9zZW1fSU5TTl9CUCB9LAorICAgIHsgRlIzMEJGX0lOU05fQlZELCAmJiBjYXNlX3NlbV9JTlNOX0JWRCB9LAorICAgIHsgRlIzMEJGX0lOU05fQlYsICYmIGNhc2Vfc2VtX0lOU05fQlYgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0JOVkQsICYmIGNhc2Vfc2VtX0lOU05fQk5WRCB9LAorICAgIHsgRlIzMEJGX0lOU05fQk5WLCAmJiBjYXNlX3NlbV9JTlNOX0JOViB9LAorICAgIHsgRlIzMEJGX0lOU05fQkxURCwgJiYgY2FzZV9zZW1fSU5TTl9CTFREIH0sCisgICAgeyBGUjMwQkZfSU5TTl9CTFQsICYmIGNhc2Vfc2VtX0lOU05fQkxUIH0sCisgICAgeyBGUjMwQkZfSU5TTl9CR0VELCAmJiBjYXNlX3NlbV9JTlNOX0JHRUQgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0JHRSwgJiYgY2FzZV9zZW1fSU5TTl9CR0UgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0JMRUQsICYmIGNhc2Vfc2VtX0lOU05fQkxFRCB9LAorICAgIHsgRlIzMEJGX0lOU05fQkxFLCAmJiBjYXNlX3NlbV9JTlNOX0JMRSB9LAorICAgIHsgRlIzMEJGX0lOU05fQkdURCwgJiYgY2FzZV9zZW1fSU5TTl9CR1REIH0sCisgICAgeyBGUjMwQkZfSU5TTl9CR1QsICYmIGNhc2Vfc2VtX0lOU05fQkdUIH0sCisgICAgeyBGUjMwQkZfSU5TTl9CTFNELCAmJiBjYXNlX3NlbV9JTlNOX0JMU0QgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0JMUywgJiYgY2FzZV9zZW1fSU5TTl9CTFMgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0JISUQsICYmIGNhc2Vfc2VtX0lOU05fQkhJRCB9LAorICAgIHsgRlIzMEJGX0lOU05fQkhJLCAmJiBjYXNlX3NlbV9JTlNOX0JISSB9LAorICAgIHsgRlIzMEJGX0lOU05fRE1PVlIxMywgJiYgY2FzZV9zZW1fSU5TTl9ETU9WUjEzIH0sCisgICAgeyBGUjMwQkZfSU5TTl9ETU9WUjEzSCwgJiYgY2FzZV9zZW1fSU5TTl9ETU9WUjEzSCB9LAorICAgIHsgRlIzMEJGX0lOU05fRE1PVlIxM0IsICYmIGNhc2Vfc2VtX0lOU05fRE1PVlIxM0IgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0RNT1ZSMTNQSSwgJiYgY2FzZV9zZW1fSU5TTl9ETU9WUjEzUEkgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0RNT1ZSMTNQSUgsICYmIGNhc2Vfc2VtX0lOU05fRE1PVlIxM1BJSCB9LAorICAgIHsgRlIzMEJGX0lOU05fRE1PVlIxM1BJQiwgJiYgY2FzZV9zZW1fSU5TTl9ETU9WUjEzUElCIH0sCisgICAgeyBGUjMwQkZfSU5TTl9ETU9WUjE1UEksICYmIGNhc2Vfc2VtX0lOU05fRE1PVlIxNVBJIH0sCisgICAgeyBGUjMwQkZfSU5TTl9ETU9WMlIxMywgJiYgY2FzZV9zZW1fSU5TTl9ETU9WMlIxMyB9LAorICAgIHsgRlIzMEJGX0lOU05fRE1PVjJSMTNILCAmJiBjYXNlX3NlbV9JTlNOX0RNT1YyUjEzSCB9LAorICAgIHsgRlIzMEJGX0lOU05fRE1PVjJSMTNCLCAmJiBjYXNlX3NlbV9JTlNOX0RNT1YyUjEzQiB9LAorICAgIHsgRlIzMEJGX0lOU05fRE1PVjJSMTNQSSwgJiYgY2FzZV9zZW1fSU5TTl9ETU9WMlIxM1BJIH0sCisgICAgeyBGUjMwQkZfSU5TTl9ETU9WMlIxM1BJSCwgJiYgY2FzZV9zZW1fSU5TTl9ETU9WMlIxM1BJSCB9LAorICAgIHsgRlIzMEJGX0lOU05fRE1PVjJSMTNQSUIsICYmIGNhc2Vfc2VtX0lOU05fRE1PVjJSMTNQSUIgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0RNT1YyUjE1UEQsICYmIGNhc2Vfc2VtX0lOU05fRE1PVjJSMTVQRCB9LAorICAgIHsgRlIzMEJGX0lOU05fTERSRVMsICYmIGNhc2Vfc2VtX0lOU05fTERSRVMgfSwKKyAgICB7IEZSMzBCRl9JTlNOX1NUUkVTLCAmJiBjYXNlX3NlbV9JTlNOX1NUUkVTIH0sCisgICAgeyBGUjMwQkZfSU5TTl9DT1BPUCwgJiYgY2FzZV9zZW1fSU5TTl9DT1BPUCB9LAorICAgIHsgRlIzMEJGX0lOU05fQ09QTEQsICYmIGNhc2Vfc2VtX0lOU05fQ09QTEQgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0NPUFNULCAmJiBjYXNlX3NlbV9JTlNOX0NPUFNUIH0sCisgICAgeyBGUjMwQkZfSU5TTl9DT1BTViwgJiYgY2FzZV9zZW1fSU5TTl9DT1BTViB9LAorICAgIHsgRlIzMEJGX0lOU05fTk9QLCAmJiBjYXNlX3NlbV9JTlNOX05PUCB9LAorICAgIHsgRlIzMEJGX0lOU05fQU5EQ0NSLCAmJiBjYXNlX3NlbV9JTlNOX0FORENDUiB9LAorICAgIHsgRlIzMEJGX0lOU05fT1JDQ1IsICYmIGNhc2Vfc2VtX0lOU05fT1JDQ1IgfSwKKyAgICB7IEZSMzBCRl9JTlNOX1NUSUxNLCAmJiBjYXNlX3NlbV9JTlNOX1NUSUxNIH0sCisgICAgeyBGUjMwQkZfSU5TTl9BRERTUCwgJiYgY2FzZV9zZW1fSU5TTl9BRERTUCB9LAorICAgIHsgRlIzMEJGX0lOU05fRVhUU0IsICYmIGNhc2Vfc2VtX0lOU05fRVhUU0IgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0VYVFVCLCAmJiBjYXNlX3NlbV9JTlNOX0VYVFVCIH0sCisgICAgeyBGUjMwQkZfSU5TTl9FWFRTSCwgJiYgY2FzZV9zZW1fSU5TTl9FWFRTSCB9LAorICAgIHsgRlIzMEJGX0lOU05fRVhUVUgsICYmIGNhc2Vfc2VtX0lOU05fRVhUVUggfSwKKyAgICB7IEZSMzBCRl9JTlNOX0xETTAsICYmIGNhc2Vfc2VtX0lOU05fTERNMCB9LAorICAgIHsgRlIzMEJGX0lOU05fTERNMSwgJiYgY2FzZV9zZW1fSU5TTl9MRE0xIH0sCisgICAgeyBGUjMwQkZfSU5TTl9TVE0wLCAmJiBjYXNlX3NlbV9JTlNOX1NUTTAgfSwKKyAgICB7IEZSMzBCRl9JTlNOX1NUTTEsICYmIGNhc2Vfc2VtX0lOU05fU1RNMSB9LAorICAgIHsgRlIzMEJGX0lOU05fRU5URVIsICYmIGNhc2Vfc2VtX0lOU05fRU5URVIgfSwKKyAgICB7IEZSMzBCRl9JTlNOX0xFQVZFLCAmJiBjYXNlX3NlbV9JTlNOX0xFQVZFIH0sCisgICAgeyBGUjMwQkZfSU5TTl9YQ0hCLCAmJiBjYXNlX3NlbV9JTlNOX1hDSEIgfSwKKyAgICB7IDAsIDAgfQorICB9OworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBsYWJlbHNbaV0ubGFiZWwgIT0gMDsgKytpKQorI2lmIEZBU1RfUAorICAgIENQVV9JREVTQyAoY3VycmVudF9jcHUpIFtsYWJlbHNbaV0uaW5kZXhdLnNlbV9mYXN0X2xhYiA9IGxhYmVsc1tpXS5sYWJlbDsKKyNlbHNlCisgICAgQ1BVX0lERVNDIChjdXJyZW50X2NwdSkgW2xhYmVsc1tpXS5pbmRleF0uc2VtX2Z1bGxfbGFiID0gbGFiZWxzW2ldLmxhYmVsOworI2VuZGlmCisKKyN1bmRlZiBERUZJTkVfTEFCRUxTCisjZW5kaWYgLyogREVGSU5FX0xBQkVMUyAqLworCisjaWZkZWYgREVGSU5FX1NXSVRDSAorCisvKiBJZiBoeXBlci1mYXN0IFt3ZWxsIG5vdCB1bm5lY2Vzc2FyaWx5IHNsb3ddIGV4ZWN1dGlvbiBpcyBzZWxlY3RlZCwgdHVybgorICAgb2ZmIGZyaWxscyBsaWtlIHRyYWNpbmcgYW5kIHByb2ZpbGluZy4gICovCisvKiBGSVhNRTogQSBiZXR0ZXIgd2F5IHdvdWxkIGJlIHRvIGhhdmUgVFJBQ0VfUkVTVUxUIGNoZWNrIGZvciBzb21ldGhpbmcKKyAgIHRoYXQgY2FuIGNhdXNlIGl0IHRvIGJlIG9wdGltaXplZCBvdXQuICBBbm90aGVyIHdheSB3b3VsZCBiZSB0byBlbWl0CisgICBzcGVjaWFsIGhhbmRsZXJzIGludG8gdGhlIGluc3RydWN0aW9uICJzdHJlYW0iLiAgKi8KKworI2lmIEZBU1RfUAorI3VuZGVmIFRSQUNFX1JFU1VMVAorI2RlZmluZSBUUkFDRV9SRVNVTFQoY3B1LCBhYnVmLCBuYW1lLCB0eXBlLCB2YWwpCisjZW5kaWYKKworI3VuZGVmIEdFVF9BVFRSCisjZGVmaW5lIEdFVF9BVFRSKGNwdSwgbnVtLCBhdHRyKSBDR0VOX0FUVFJfVkFMVUUgKE5VTEwsIGFidWYtPmlkZXNjLT5hdHRycywgQ0dFTl9JTlNOXyMjYXR0cikKKworeworCisjaWYgV0lUSF9TQ0FDSEVfUEJCCisKKy8qIEJyYW5jaCB0byBuZXh0IGhhbmRsZXIgd2l0aG91dCBnb2luZyBhcm91bmQgbWFpbiBsb29wLiAgKi8KKyNkZWZpbmUgTkVYVCh2cGMpIGdvdG8gKiBTRU1fQVJHQlVGICh2cGMpIC0+IHNlbWFudGljLnNlbV9jYXNlCitTV0lUQ0ggKHNlbSwgU0VNX0FSR0JVRiAodnBjKSAtPiBzZW1hbnRpYy5zZW1fY2FzZSkKKworI2Vsc2UgLyogISBXSVRIX1NDQUNIRV9QQkIgKi8KKworI2RlZmluZSBORVhUKHZwYykgQlJFQUsgKHNlbSkKKyNpZmRlZiBfX0dOVUNfXworI2lmIEZBU1RfUAorICBTV0lUQ0ggKHNlbSwgU0VNX0FSR0JVRiAoc2MpIC0+IGlkZXNjLT5zZW1fZmFzdF9sYWIpCisjZWxzZQorICBTV0lUQ0ggKHNlbSwgU0VNX0FSR0JVRiAoc2MpIC0+IGlkZXNjLT5zZW1fZnVsbF9sYWIpCisjZW5kaWYKKyNlbHNlCisgIFNXSVRDSCAoc2VtLCBTRU1fQVJHQlVGIChzYykgLT4gaWRlc2MtPm51bSkKKyNlbmRpZgorCisjZW5kaWYgLyogISBXSVRIX1NDQUNIRV9QQkIgKi8KKworICAgIHsKKworICBDQVNFIChzZW0sIElOU05fWF9JTlZBTElEKSA6IC8qIC0taW52YWxpZC0tICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7CisKKyAgeworI2lmIFdJVEhfU0NBQ0hFCisgICAgLyogVXBkYXRlIHRoZSByZWNvcmRlZCBwYyBpbiB0aGUgY3B1IHN0YXRlIHN0cnVjdC4gICovCisgICAgU0VUX0hfUEMgKHBjKTsKKyNlbmRpZgorICAgIHNpbV9lbmdpbmVfaW52YWxpZF9pbnNuIChjdXJyZW50X2NwdSwgcGMpOworICAgIHNpbV9pb19lcnJvciAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSksICJpbnZhbGlkIGluc24gbm90IGhhbmRsZWRcbiIpOworICAgIC8qIE5PVFJFQUNIRUQgKi8KKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1hfQUZURVIpIDogLyogLS1hZnRlci0tICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7CisKKyAgeworI2lmIFdJVEhfU0NBQ0hFX1BCQl9GUjMwQkYKKyAgICBmcjMwYmZfcGJiX2FmdGVyIChjdXJyZW50X2NwdSwgc2VtX2FyZyk7CisjZW5kaWYKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1hfQkVGT1JFKSA6IC8qIC0tYmVmb3JlLS0gKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKKworICB7CisjaWYgV0lUSF9TQ0FDSEVfUEJCX0ZSMzBCRgorICAgIGZyMzBiZl9wYmJfYmVmb3JlIChjdXJyZW50X2NwdSwgc2VtX2FyZyk7CisjZW5kaWYKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1hfQ1RJX0NIQUlOKSA6IC8qIC0tY3RpLWNoYWluLS0gKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKKworICB7CisjaWYgV0lUSF9TQ0FDSEVfUEJCX0ZSMzBCRgorI2lmZGVmIERFRklORV9TV0lUQ0gKKyAgICB2cGMgPSBmcjMwYmZfcGJiX2N0aV9jaGFpbiAoY3VycmVudF9jcHUsIHNlbV9hcmcsCisJCQkgICAgICAgcGJiX2JyX25wY19wdHIsIHBiYl9icl9ucGMpOworICAgIEJSRUFLIChzZW0pOworI2Vsc2UKKyAgICAvKiBGSVhNRTogQWxsb3cgcHJvdmlzaW9uIG9mIGV4cGxpY2l0IGlmbXQgc3BlYyBpbiBpbnNuIHNwZWMuICAqLworICAgIHZwYyA9IGZyMzBiZl9wYmJfY3RpX2NoYWluIChjdXJyZW50X2NwdSwgc2VtX2FyZywKKwkJCSAgICAgICBDUFVfUEJCX0JSX05QQ19QVFIgKGN1cnJlbnRfY3B1KSwKKwkJCSAgICAgICBDUFVfUEJCX0JSX05QQyAoY3VycmVudF9jcHUpKTsKKyNlbmRpZgorI2VuZGlmCisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9YX0NIQUlOKSA6IC8qIC0tY2hhaW4tLSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOworCisgIHsKKyNpZiBXSVRIX1NDQUNIRV9QQkJfRlIzMEJGCisgICAgdnBjID0gZnIzMGJmX3BiYl9jaGFpbiAoY3VycmVudF9jcHUsIHNlbV9hcmcpOworI2lmZGVmIERFRklORV9TV0lUQ0gKKyAgICBCUkVBSyAoc2VtKTsKKyNlbmRpZgorI2VuZGlmCisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9YX0JFR0lOKSA6IC8qIC0tYmVnaW4tLSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOworCisgIHsKKyNpZiBXSVRIX1NDQUNIRV9QQkJfRlIzMEJGCisjaWZkZWYgREVGSU5FX1NXSVRDSAorICAgIC8qIEluIHRoZSBzd2l0Y2ggY2FzZSBGQVNUX1AgaXMgYSBjb25zdGFudCwgYWxsb3dpbmcgc2V2ZXJhbCBvcHRpbWl6YXRpb25zCisgICAgICAgaW4gYW55IGNhbGxlZCBpbmxpbmUgZnVuY3Rpb25zLiAgKi8KKyAgICB2cGMgPSBmcjMwYmZfcGJiX2JlZ2luIChjdXJyZW50X2NwdSwgRkFTVF9QKTsKKyNlbHNlCisgICAgdnBjID0gZnIzMGJmX3BiYl9iZWdpbiAoY3VycmVudF9jcHUsIFNUQVRFX1JVTl9GQVNUX1AgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKSk7CisjZW5kaWYKKyNlbmRpZgorICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQUREKSA6IC8qIGFkZCAkUmosJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEFERE9GU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopLCAwKTsKKyAgICBDUFUgKGhfdmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAidmJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IEFERENGU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopLCAwKTsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9BRERJKSA6IC8qIGFkZCAkdTQsJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZGkuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgQkkgb3B2YWwgPSBBRERPRlNJICgqIEZMRCAoaV9SaSksIEZMRCAoZl91NCksIDApOworICAgIENQVSAoaF92Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ2Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gQUREQ0ZTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfdTQpLCAwKTsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJICgqIEZMRCAoaV9SaSksIEZMRCAoZl91NCkpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQUREMikgOiAvKiBhZGQyICRtNCwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkMi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEFERE9GU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX200KSwgMCk7CisgICAgQ1BVIChoX3ZiaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInZiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBBRERDRlNJICgqIEZMRCAoaV9SaSksIEZMRCAoZl9tNCksIDApOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX200KSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9BRERDKSA6IC8qIGFkZGMgJFJqLCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGRjLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgU0kgdG1wX3RtcDsKKyAgdG1wX3RtcCA9IEFERENTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaiksIENQVSAoaF9jYml0KSk7CisgIHsKKyAgICBCSSBvcHZhbCA9IEFERE9GU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopLCBDUFUgKGhfY2JpdCkpOworICAgIENQVSAoaF92Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ2Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gQUREQ0ZTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaiksIENQVSAoaF9jYml0KSk7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSB0bXBfdG1wOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQURETikgOiAvKiBhZGRuICRSaiwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkbi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9BREROSSkgOiAvKiBhZGRuICR1NCwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkbmkuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfdTQpKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0FERE4yKSA6IC8qIGFkZG4yICRtNCwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkbjIuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfbTQpKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NVQikgOiAvKiBzdWIgJFJqLCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgQkkgb3B2YWwgPSBTVUJPRlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgMCk7CisgICAgQ1BVIChoX3ZiaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInZiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBTVUJDRlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgMCk7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaikpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1VCQykgOiAvKiBzdWJjICRSaiwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkYy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF90bXA7CisgIHRtcF90bXAgPSBTVUJDU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopLCBDUFUgKGhfY2JpdCkpOworICB7CisgICAgQkkgb3B2YWwgPSBTVUJPRlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgQ1BVIChoX2NiaXQpKTsKKyAgICBDUFUgKGhfdmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAidmJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IFNVQkNGU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopLCBDUFUgKGhfY2JpdCkpOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gdG1wX3RtcDsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorZG8geworICB7CisgICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NVQk4pIDogLyogc3VibiAkUmosJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZG4uZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaikpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ01QKSA6IC8qIGNtcCAkUmosJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF90bXAxOworICB7CisgICAgQkkgb3B2YWwgPSBTVUJPRlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgMCk7CisgICAgQ1BVIChoX3ZiaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInZiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBTVUJDRlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgMCk7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB0bXBfdG1wMSA9IFNVQlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSk7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRU0kgKHRtcF90bXAxLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKHRtcF90bXAxLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NNUEkpIDogLyogY21wICR1NCwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY21waS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF90bXAxOworICB7CisgICAgQkkgb3B2YWwgPSBTVUJPRlNJICgqIEZMRCAoaV9SaSksIEZMRCAoZl91NCksIDApOworICAgIENQVSAoaF92Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ2Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gU1VCQ0ZTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfdTQpLCAwKTsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHRtcF90bXAxID0gU1VCU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX3U0KSk7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRU0kgKHRtcF90bXAxLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKHRtcF90bXAxLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NNUDIpIDogLyogY21wMiAkbTQsJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcDIuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfdG1wMTsKKyAgeworICAgIEJJIG9wdmFsID0gU1VCT0ZTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfbTQpLCAwKTsKKyAgICBDUFUgKGhfdmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAidmJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IFNVQkNGU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX200KSwgMCk7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB0bXBfdG1wMSA9IFNVQlNJICgqIEZMRCAoaV9SaSksIEZMRCAoZl9tNCkpOworZG8geworICB7CisgICAgQkkgb3B2YWwgPSBFUVNJICh0bXBfdG1wMSwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICh0bXBfdG1wMSwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9BTkQpIDogLyogYW5kICRSaiwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYW5kLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gQU5EU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorZG8geworICB7CisgICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX09SKSA6IC8qIG9yICRSaiwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYW5kLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gT1JTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaikpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fRU9SKSA6IC8qIGVvciAkUmosJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FuZC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFhPUlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9BTkRNKSA6IC8qIGFuZCAkUmosQCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRtLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgU0kgdG1wX3RtcDsKKyAgdG1wX3RtcCA9IEFORFNJIChHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpLCAqIEZMRCAoaV9SaikpOworZG8geworICB7CisgICAgQkkgb3B2YWwgPSBFUVNJICh0bXBfdG1wLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKHRtcF90bXAsIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworICB7CisgICAgU0kgb3B2YWwgPSB0bXBfdG1wOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQU5ESCkgOiAvKiBhbmRoICRSaixAJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FuZGguZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBISSB0bXBfdG1wOworICB0bXBfdG1wID0gQU5ESEkgKEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSksICogRkxEIChpX1JqKSk7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRSEkgKHRtcF90bXAsIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gTFRISSAodG1wX3RtcCwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisgIHsKKyAgICBISSBvcHZhbCA9IHRtcF90bXA7CisgICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9BTkRCKSA6IC8qIGFuZGIgJFJqLEAkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYW5kYi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFFJIHRtcF90bXA7CisgIHRtcF90bXAgPSBBTkRRSSAoR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSwgKiBGTEQgKGlfUmopKTsKK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gRVFRSSAodG1wX3RtcCwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFFJICh0bXBfdG1wLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKyAgeworICAgIFFJIG9wdmFsID0gdG1wX3RtcDsKKyAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX09STSkgOiAvKiBvciAkUmosQCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRtLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgU0kgdG1wX3RtcDsKKyAgdG1wX3RtcCA9IE9SU0kgKEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSksICogRkxEIChpX1JqKSk7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRU0kgKHRtcF90bXAsIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gTFRTSSAodG1wX3RtcCwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisgIHsKKyAgICBTSSBvcHZhbCA9IHRtcF90bXA7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9PUkgpIDogLyogb3JoICRSaixAJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FuZGguZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBISSB0bXBfdG1wOworICB0bXBfdG1wID0gT1JISSAoR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSwgKiBGTEQgKGlfUmopKTsKK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gRVFISSAodG1wX3RtcCwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVEhJICh0bXBfdG1wLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKyAgeworICAgIEhJIG9wdmFsID0gdG1wX3RtcDsKKyAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX09SQikgOiAvKiBvcmIgJFJqLEAkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYW5kYi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFFJIHRtcF90bXA7CisgIHRtcF90bXAgPSBPUlFJIChHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpLCAqIEZMRCAoaV9SaikpOworZG8geworICB7CisgICAgQkkgb3B2YWwgPSBFUVFJICh0bXBfdG1wLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUUUkgKHRtcF90bXAsIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworICB7CisgICAgUUkgb3B2YWwgPSB0bXBfdG1wOworICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fRU9STSkgOiAvKiBlb3IgJFJqLEAkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYW5kbS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF90bXA7CisgIHRtcF90bXAgPSBYT1JTSSAoR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSwgKiBGTEQgKGlfUmopKTsKK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAodG1wX3RtcCwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICh0bXBfdG1wLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKyAgeworICAgIFNJIG9wdmFsID0gdG1wX3RtcDsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0VPUkgpIDogLyogZW9yaCAkUmosQCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRoLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgSEkgdG1wX3RtcDsKKyAgdG1wX3RtcCA9IFhPUkhJIChHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpLCAqIEZMRCAoaV9SaikpOworZG8geworICB7CisgICAgQkkgb3B2YWwgPSBFUUhJICh0bXBfdG1wLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUSEkgKHRtcF90bXAsIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworICB7CisgICAgSEkgb3B2YWwgPSB0bXBfdG1wOworICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fRU9SQikgOiAvKiBlb3JiICRSaixAJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FuZGIuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBRSSB0bXBfdG1wOworICB0bXBfdG1wID0gWE9SUUkgKEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSksICogRkxEIChpX1JqKSk7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRUUkgKHRtcF90bXAsIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gTFRRSSAodG1wX3RtcCwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisgIHsKKyAgICBRSSBvcHZhbCA9IHRtcF90bXA7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CQU5ETCkgOiAvKiBiYW5kbCAkdTQsQCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9iYW5kbC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBRSSBvcHZhbCA9IEFORFFJIChPUlFJIChGTEQgKGZfdTQpLCAyNDApLCBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpKTsKKyAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CT1JMKSA6IC8qIGJvcmwgJHU0LEAkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYmFuZGwuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgUUkgb3B2YWwgPSBPUlFJIChGTEQgKGZfdTQpLCBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpKTsKKyAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CRU9STCkgOiAvKiBiZW9ybCAkdTQsQCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9iYW5kbC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBRSSBvcHZhbCA9IFhPUlFJIChGTEQgKGZfdTQpLCBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpKTsKKyAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CQU5ESCkgOiAvKiBiYW5kaCAkdTQsQCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9iYW5kbC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBRSSBvcHZhbCA9IEFORFFJIChPUlFJIChTTExRSSAoRkxEIChmX3U0KSwgNCksIDE1KSwgR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSk7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQk9SSCkgOiAvKiBib3JoICR1NCxAJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2JhbmRsLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFFJIG9wdmFsID0gT1JRSSAoU0xMUUkgKEZMRCAoZl91NCksIDQpLCBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpKTsKKyAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CRU9SSCkgOiAvKiBiZW9yaCAkdTQsQCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9iYW5kbC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBRSSBvcHZhbCA9IFhPUlFJIChTTExRSSAoRkxEIChmX3U0KSwgNCksIEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSkpOworICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JUU1RMKSA6IC8qIGJ0c3RsICR1NCxAJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2J0c3RsLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgUUkgdG1wX3RtcDsKKyAgdG1wX3RtcCA9IEFORFFJIChGTEQgKGZfdTQpLCBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpKTsKKyAgeworICAgIEJJIG9wdmFsID0gRVFRSSAodG1wX3RtcCwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSAwOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JUU1RIKSA6IC8qIGJ0c3RoICR1NCxAJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2J0c3RsLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgUUkgdG1wX3RtcDsKKyAgdG1wX3RtcCA9IEFORFFJIChTTExRSSAoRkxEIChmX3U0KSwgNCksIEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSkpOworICB7CisgICAgQkkgb3B2YWwgPSBFUVFJICh0bXBfdG1wLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUUUkgKHRtcF90bXAsIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX01VTCkgOiAvKiBtdWwgJFJqLCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWwuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBESSB0bXBfdG1wOworICB0bXBfdG1wID0gTVVMREkgKEVYVFNJREkgKCogRkxEIChpX1JqKSksIEVYVFNJREkgKCogRkxEIChpX1JpKSkpOworICB7CisgICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKHRtcF90bXApOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDUpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKFNSTERJICh0bXBfdG1wLCAzMikpOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJIChHRVRfSF9EUiAoKChVSU5UKSA1KSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gRVFESSAodG1wX3RtcCwgTUFLRURJICgwLCAwKSk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBPUklGIChHVERJICh0bXBfdG1wLCBNQUtFREkgKDAsIDIxNDc0ODM2NDcpKSwgTFRESSAodG1wX3RtcCwgTkVHREkgKE1BS0VESSAoMCwgMHg4MDAwMDAwMCkpKSk7CisgICAgQ1BVIChoX3ZiaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInZiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTVVMVSkgOiAvKiBtdWx1ICRSaiwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsdS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIERJIHRtcF90bXA7CisgIHRtcF90bXAgPSBNVUxESSAoWkVYVFNJREkgKCogRkxEIChpX1JqKSksIFpFWFRTSURJICgqIEZMRCAoaV9SaSkpKTsKKyAgeworICAgIFNJIG9wdmFsID0gVFJVTkNESVNJICh0bXBfdG1wKTsKKyAgICBTRVRfSF9EUiAoKChVSU5UKSA1KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci01IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChTUkxESSAodG1wX3RtcCwgMzIpKTsKKyAgICBTRVRfSF9EUiAoKChVSU5UKSA0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci00IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gTFRTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRU0kgKEdFVF9IX0RSICgoKFVJTlQpIDUpKSwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBORVNJIChHRVRfSF9EUiAoKChVSU5UKSA0KSksIDApOworICAgIENQVSAoaF92Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ2Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX01VTEgpIDogLyogbXVsaCAkUmosJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bGguZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBNVUxISSAoVFJVTkNTSUhJICgqIEZMRCAoaV9SaikpLCBUUlVOQ1NJSEkgKCogRkxEIChpX1JpKSkpOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDUpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJIChHRVRfSF9EUiAoKChVSU5UKSA1KSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gR0VTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9NVUxVSCkgOiAvKiBtdWx1aCAkUmosJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bGguZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBNVUxTSSAoQU5EU0kgKCogRkxEIChpX1JqKSwgNjU1MzUpLCBBTkRTSSAoKiBGTEQgKGlfUmkpLCA2NTUzNSkpOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDUpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJIChHRVRfSF9EUiAoKChVSU5UKSA1KSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gR0VTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9ESVYwUykgOiAvKiBkaXYwcyAkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZGl2MHMuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgQkkgb3B2YWwgPSBMVFNJIChHRVRfSF9EUiAoKChVSU5UKSA1KSksIDApOworICAgIENQVSAoaF9kMGJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZDBiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBYT1JCSSAoQ1BVIChoX2QwYml0KSwgTFRTSSAoKiBGTEQgKGlfUmkpLCAwKSk7CisgICAgQ1BVIChoX2QxYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkMWJpdCIsICd4Jywgb3B2YWwpOworICB9CitpZiAoTkVCSSAoQ1BVIChoX2QwYml0KSwgMCkpIHsKKyAgeworICAgIFNJIG9wdmFsID0gMHhmZmZmZmZmZjsKKyAgICBTRVRfSF9EUiAoKChVSU5UKSA0KSwgb3B2YWwpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSBlbHNlIHsKKyAgeworICAgIFNJIG9wdmFsID0gMDsKKyAgICBTRVRfSF9EUiAoKChVSU5UKSA0KSwgb3B2YWwpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTQiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorfSB3aGlsZSAoMCk7CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0RJVjBVKSA6IC8qIGRpdjB1ICRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kaXYwdS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IDA7CisgICAgQ1BVIChoX2QwYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkMGJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IDA7CisgICAgQ1BVIChoX2QxYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkMWJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IDA7CisgICAgU0VUX0hfRFIgKCgoVUlOVCkgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItNCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9ESVYxKSA6IC8qIGRpdjEgJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2RpdjEuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfdG1wOworICB7CisgICAgU0kgb3B2YWwgPSBTTExTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAxKTsKKyAgICBTRVRfSF9EUiAoKChVSU5UKSA0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci00IiwgJ3gnLCBvcHZhbCk7CisgIH0KK2lmIChMVFNJIChHRVRfSF9EUiAoKChVSU5UKSA1KSksIDApKSB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChHRVRfSF9EUiAoKChVSU5UKSA0KSksIDEpOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTQiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorICB7CisgICAgU0kgb3B2YWwgPSBTTExTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpLCAxKTsKKyAgICBTRVRfSF9EUiAoKChVSU5UKSA1KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci01IiwgJ3gnLCBvcHZhbCk7CisgIH0KK2lmIChFUUJJIChDUFUgKGhfZDFiaXQpLCAxKSkgeworZG8geworICB0bXBfdG1wID0gQUREU0kgKEdFVF9IX0RSICgoKFVJTlQpIDQpKSwgKiBGTEQgKGlfUmkpKTsKKyAgeworICAgIEJJIG9wdmFsID0gQUREQ0ZTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IGVsc2UgeworZG8geworICB0bXBfdG1wID0gU1VCU0kgKEdFVF9IX0RSICgoKFVJTlQpIDQpKSwgKiBGTEQgKGlfUmkpKTsKKyAgeworICAgIEJJIG9wdmFsID0gU1VCQ0ZTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoTk9UQkkgKFhPUkJJIChYT1JCSSAoQ1BVIChoX2QwYml0KSwgQ1BVIChoX2QxYml0KSksIENQVSAoaF9jYml0KSkpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IHRtcF90bXA7CisgICAgU0VUX0hfRFIgKCgoVUlOVCkgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItNCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IE9SU0kgKEdFVF9IX0RSICgoKFVJTlQpIDUpKSwgMSk7CisgICAgU0VUX0hfRFIgKCgoVUlOVCkgNSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItNSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fRElWMikgOiAvKiBkaXYyICRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kaXYyLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgU0kgdG1wX3RtcDsKK2lmIChFUUJJIChDUFUgKGhfZDFiaXQpLCAxKSkgeworZG8geworICB0bXBfdG1wID0gQUREU0kgKEdFVF9IX0RSICgoKFVJTlQpIDQpKSwgKiBGTEQgKGlfUmkpKTsKKyAgeworICAgIEJJIG9wdmFsID0gQUREQ0ZTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IGVsc2UgeworZG8geworICB0bXBfdG1wID0gU1VCU0kgKEdFVF9IX0RSICgoKFVJTlQpIDQpKSwgKiBGTEQgKGlfUmkpKTsKKyAgeworICAgIEJJIG9wdmFsID0gU1VCQ0ZTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoRVFTSSAodG1wX3RtcCwgMCkpIHsKK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gMTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDUpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gMDsKKyAgICBTRVRfSF9EUiAoKChVSU5UKSA0KSwgb3B2YWwpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IGVsc2UgeworICB7CisgICAgQkkgb3B2YWwgPSAwOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorfSB3aGlsZSAoMCk7CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0RJVjMpIDogLyogZGl2MyAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kaXYzLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2lmIChFUUJJIChDUFUgKGhfemJpdCksIDEpKSB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChHRVRfSF9EUiAoKChVSU5UKSA1KSksIDEpOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDUpLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItNSIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0RJVjRTKSA6IC8qIGRpdjRzICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2RpdjRzLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2lmIChFUUJJIChDUFUgKGhfZDFiaXQpLCAxKSkgeworICB7CisgICAgU0kgb3B2YWwgPSBORUdTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpKTsKKyAgICBTRVRfSF9EUiAoKChVSU5UKSA1KSwgb3B2YWwpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTUiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MU0wpIDogLyogbHNsICRSaiwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbHNsLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgU0kgdG1wX3NoaWZ0OworICB0bXBfc2hpZnQgPSBBTkRTSSAoKiBGTEQgKGlfUmopLCAzMSk7CitpZiAoTkVTSSAodG1wX3NoaWZ0LCAwKSkgeworZG8geworICB7CisgICAgQkkgb3B2YWwgPSBORVNJIChBTkRTSSAoKiBGTEQgKGlfUmkpLCBTTExTSSAoMSwgU1VCU0kgKDMyLCB0bXBfc2hpZnQpKSksIDApOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBTTExTSSAoKiBGTEQgKGlfUmkpLCB0bXBfc2hpZnQpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfSBlbHNlIHsKKyAgeworICAgIEJJIG9wdmFsID0gMDsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKyAgeworICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xTTEkpIDogLyogbHNsICR1NCwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbHNsaS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF9zaGlmdDsKKyAgdG1wX3NoaWZ0ID0gRkxEIChmX3U0KTsKK2lmIChORVNJICh0bXBfc2hpZnQsIDApKSB7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IE5FU0kgKEFORFNJICgqIEZMRCAoaV9SaSksIFNMTFNJICgxLCBTVUJTSSAoMzIsIHRtcF9zaGlmdCkpKSwgMCk7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IFNMTFNJICgqIEZMRCAoaV9SaSksIHRtcF9zaGlmdCk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IGVsc2UgeworICB7CisgICAgQkkgb3B2YWwgPSAwOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTFNMMikgOiAvKiBsc2wyICR1NCwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbHNsaS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF9zaGlmdDsKKyAgdG1wX3NoaWZ0ID0gQUREU0kgKEZMRCAoZl91NCksIDE2KTsKK2lmIChORVNJICh0bXBfc2hpZnQsIDApKSB7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IE5FU0kgKEFORFNJICgqIEZMRCAoaV9SaSksIFNMTFNJICgxLCBTVUJTSSAoMzIsIHRtcF9zaGlmdCkpKSwgMCk7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IFNMTFNJICgqIEZMRCAoaV9SaSksIHRtcF9zaGlmdCk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IGVsc2UgeworICB7CisgICAgQkkgb3B2YWwgPSAwOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTFNSKSA6IC8qIGxzciAkUmosJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xzbC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF9zaGlmdDsKKyAgdG1wX3NoaWZ0ID0gQU5EU0kgKCogRkxEIChpX1JqKSwgMzEpOworaWYgKE5FU0kgKHRtcF9zaGlmdCwgMCkpIHsKK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gTkVTSSAoQU5EU0kgKCogRkxEIChpX1JpKSwgU0xMU0kgKDEsIFNVQlNJICh0bXBfc2hpZnQsIDEpKSksIDApOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBTUkxTSSAoKiBGTEQgKGlfUmkpLCB0bXBfc2hpZnQpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfSBlbHNlIHsKKyAgeworICAgIEJJIG9wdmFsID0gMDsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKyAgeworICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xTUkkpIDogLyogbHNyICR1NCwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbHNsaS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF9zaGlmdDsKKyAgdG1wX3NoaWZ0ID0gRkxEIChmX3U0KTsKK2lmIChORVNJICh0bXBfc2hpZnQsIDApKSB7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IE5FU0kgKEFORFNJICgqIEZMRCAoaV9SaSksIFNMTFNJICgxLCBTVUJTSSAodG1wX3NoaWZ0LCAxKSkpLCAwKTsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gU1JMU0kgKCogRkxEIChpX1JpKSwgdG1wX3NoaWZ0KTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gZWxzZSB7CisgIHsKKyAgICBCSSBvcHZhbCA9IDA7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9Cit9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MU1IyKSA6IC8qIGxzcjIgJHU0LCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sc2xpLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgU0kgdG1wX3NoaWZ0OworICB0bXBfc2hpZnQgPSBBRERTSSAoRkxEIChmX3U0KSwgMTYpOworaWYgKE5FU0kgKHRtcF9zaGlmdCwgMCkpIHsKK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gTkVTSSAoQU5EU0kgKCogRkxEIChpX1JpKSwgU0xMU0kgKDEsIFNVQlNJICh0bXBfc2hpZnQsIDEpKSksIDApOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBTUkxTSSAoKiBGTEQgKGlfUmkpLCB0bXBfc2hpZnQpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfSBlbHNlIHsKKyAgeworICAgIEJJIG9wdmFsID0gMDsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKyAgeworICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0FTUikgOiAvKiBhc3IgJFJqLCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sc2wuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfc2hpZnQ7CisgIHRtcF9zaGlmdCA9IEFORFNJICgqIEZMRCAoaV9SaiksIDMxKTsKK2lmIChORVNJICh0bXBfc2hpZnQsIDApKSB7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IE5FU0kgKEFORFNJICgqIEZMRCAoaV9SaSksIFNMTFNJICgxLCBTVUJTSSAodG1wX3NoaWZ0LCAxKSkpLCAwKTsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gU1JBU0kgKCogRkxEIChpX1JpKSwgdG1wX3NoaWZ0KTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gZWxzZSB7CisgIHsKKyAgICBCSSBvcHZhbCA9IDA7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9Cit9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9BU1JJKSA6IC8qIGFzciAkdTQsJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xzbGkuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfc2hpZnQ7CisgIHRtcF9zaGlmdCA9IEZMRCAoZl91NCk7CitpZiAoTkVTSSAodG1wX3NoaWZ0LCAwKSkgeworZG8geworICB7CisgICAgQkkgb3B2YWwgPSBORVNJIChBTkRTSSAoKiBGTEQgKGlfUmkpLCBTTExTSSAoMSwgU1VCU0kgKHRtcF9zaGlmdCwgMSkpKSwgMCk7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IFNSQVNJICgqIEZMRCAoaV9SaSksIHRtcF9zaGlmdCk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IGVsc2UgeworICB7CisgICAgQkkgb3B2YWwgPSAwOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQVNSMikgOiAvKiBhc3IyICR1NCwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbHNsaS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF9zaGlmdDsKKyAgdG1wX3NoaWZ0ID0gQUREU0kgKEZMRCAoZl91NCksIDE2KTsKK2lmIChORVNJICh0bXBfc2hpZnQsIDApKSB7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IE5FU0kgKEFORFNJICgqIEZMRCAoaV9SaSksIFNMTFNJICgxLCBTVUJTSSAodG1wX3NoaWZ0LCAxKSkpLCAwKTsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gU1JBU0kgKCogRkxEIChpX1JpKSwgdG1wX3NoaWZ0KTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gZWxzZSB7CisgIHsKKyAgICBCSSBvcHZhbCA9IDA7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9Cit9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MREk4KSA6IC8qIGxkaTo4ICRpOCwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpOC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEZMRCAoZl9pOCk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MREkyMCkgOiAvKiBsZGk6MjAgJGkyMCwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpMjAuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBGTEQgKGZfaTIwKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xESTMyKSA6IC8qIGxkaTozMiAkaTMyLCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGkzMi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDYpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEZMRCAoZl9pMzIpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTEQpIDogLyogbGQgQCRSaiwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaikpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERVSCkgOiAvKiBsZHVoIEAkUmosJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdWguZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmopKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xEVUIpIDogLyogbGR1YiBAJFJqLCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHViLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JqKSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRFIxMykgOiAvKiBsZCBAKCRSMTMsJFJqKSwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRyMTMuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfUmopLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSkpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERSMTNVSCkgOiAvKiBsZHVoIEAoJFIxMywkUmopLCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHIxM3VoLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9SaiksIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pKSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRFIxM1VCKSA6IC8qIGxkdWIgQCgkUjEzLCRSaiksJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcjEzdWIuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1VUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX1JqKSwgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkpKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xEUjE0KSA6IC8qIGxkIEAoJFIxNCwkZGlzcDEwKSwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRyMTQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX2Rpc3AxMCksIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pKSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRFIxNFVIKSA6IC8qIGxkdWggQCgkUjE0LCRkaXNwOSksJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcjE0dWguZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9kaXNwOSksIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pKSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRFIxNFVCKSA6IC8qIGxkdWIgQCgkUjE0LCRkaXNwOCksJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcjE0dWIuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1VUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9kaXNwOCksIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pKSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRFIxNSkgOiAvKiBsZCBAKCRSMTUsJHVkaXNwNiksJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcjE1LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl91ZGlzcDYpLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSkpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERSMTVHUikgOiAvKiBsZCBAJFIxNSssJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcjE1Z3IuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KK2lmIChORVNJIChGTEQgKGZfUmkpLCAxNSkpIHsKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRFIxNURSKSA6IC8qIGxkIEAkUjE1KywkUnMyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcjE1ZHIuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfdG1wOworICB0bXBfdG1wID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gdG1wX3RtcDsKKyAgICBTRVRfSF9EUiAoRkxEIChmX1JzMiksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUnMyIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xEUjE1UFMpIDogLyogbGQgQCRSMTUrLCRwcyAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHIxNXBzLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgICBTRVRfSF9QUyAob3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwcyIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1QpIDogLyogc3QgJFJpLEAkUmogKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9SaSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmopLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RIKSA6IC8qIHN0aCAkUmksQCRSaiAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGguZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgSEkgb3B2YWwgPSAqIEZMRCAoaV9SaSk7CisgICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmopLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RCKSA6IC8qIHN0YiAkUmksQCRSaiAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGIuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9SaSk7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmopLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RSMTMpIDogLyogc3QgJFJpLEAoJFIxMywkUmopICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjEzLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfUmkpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9SaiksIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUUjEzSCkgOiAvKiBzdGggJFJpLEAoJFIxMywkUmopICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjEzaC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBISSBvcHZhbCA9ICogRkxEIChpX1JpKTsKKyAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfUmopLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVFIxM0IpIDogLyogc3RiICRSaSxAKCRSMTMsJFJqKSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHIxM2IuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9SaSk7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX1JqKSwgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RSMTQpIDogLyogc3QgJFJpLEAoJFIxNCwkZGlzcDEwKSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHIxNC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX1JpKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX2Rpc3AxMCksIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUUjE0SCkgOiAvKiBzdGggJFJpLEAoJFIxNCwkZGlzcDkpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjE0aC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBISSBvcHZhbCA9ICogRkxEIChpX1JpKTsKKyAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX2Rpc3A5KSwgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RSMTRCKSA6IC8qIHN0YiAkUmksQCgkUjE0LCRkaXNwOCkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RyMTRiLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFFJIG9wdmFsID0gKiBGTEQgKGlfUmkpOworICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfZGlzcDgpLCBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVFIxNSkgOiAvKiBzdCAkUmksQCgkUjE1LCR1ZGlzcDYpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjE1LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfUmkpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgRkxEIChmX3VkaXNwNikpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RSMTVHUikgOiAvKiBzdCAkUmksQC0kUjE1ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjE1Z3IuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfdG1wOworICB0bXBfdG1wID0gKiBGTEQgKGlfUmkpOworICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gdG1wX3RtcDsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RSMTVEUikgOiAvKiBzdCAkUnMyLEAtJFIxNSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHIxNWRyLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgU0kgdG1wX3RtcDsKKyAgdG1wX3RtcCA9IEdFVF9IX0RSIChGTEQgKGZfUnMyKSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSB0bXBfdG1wOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVFIxNVBTKSA6IC8qIHN0ICRwcyxALSRSMTUgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RyMTVwcy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRfSF9QUyAoKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTU9WKSA6IC8qIG1vdiAkUmosJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX1JqKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX01PVkRSKSA6IC8qIG1vdiAkUnMxLCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tb3Zkci5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVF9IX0RSIChGTEQgKGZfUnMxKSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9NT1ZQUykgOiAvKiBtb3YgJHBzLCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tb3Zwcy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVF9IX1BTICgpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTU9WMkRSKSA6IC8qIG1vdiAkUmksJFJzMSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tb3YyZHIuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9SaSk7CisgICAgU0VUX0hfRFIgKEZMRCAoZl9SczEpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJzMSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTU9WMlBTKSA6IC8qIG1vdiAkUmksJHBzICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdjJwcy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBVU0kgb3B2YWwgPSAqIEZMRCAoaV9SaSk7CisgICAgU0VUX0hfUFMgKG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicHMiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0pNUCkgOiAvKiBqbXAgQCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2ptcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgVVNJIG9wdmFsID0gKiBGTEQgKGlfUmkpOworICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fSk1QRCkgOiAvKiBqbXA6ZCBAJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfam1wLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSAqIEZMRCAoaV9SaSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NBTExSKSA6IC8qIGNhbGwgQCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NhbGxyLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChwYywgMik7CisgICAgU0VUX0hfRFIgKCgoVUlOVCkgMSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBVU0kgb3B2YWwgPSAqIEZMRCAoaV9SaSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NBTExSRCkgOiAvKiBjYWxsOmQgQCRSaSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NhbGxyLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChwYywgNCk7CisgICAgU0VUX0hfRFIgKCgoVUlOVCkgMSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBVU0kgb3B2YWwgPSAqIEZMRCAoaV9SaSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gd2hpbGUgKDApOworCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ0FMTCkgOiAvKiBjYWxsICRsYWJlbDEyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY2FsbC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDIpOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDEpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsMTIpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ0FMTEQpIDogLyogY2FsbDpkICRsYWJlbDEyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY2FsbC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDQpOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDEpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsMTIpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfSB3aGlsZSAoMCk7CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9SRVQpIDogLyogcmV0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfcmV0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBVU0kgb3B2YWwgPSBHRVRfSF9EUiAoKChVSU5UKSAxKSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9SRVRfRCkgOiAvKiByZXQ6ZCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X3JldC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgVVNJIG9wdmFsID0gR0VUX0hfRFIgKCgoVUlOVCkgMSkpOworICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9JTlQpIDogLyogaW50ICR1OCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2ludC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworOyAvKmNsb2JiZXIqLworOyAvKmNsb2JiZXIqLworOyAvKmNsb2JiZXIqLworICB7CisgICAgU0kgb3B2YWwgPSBmcjMwX2ludCAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfdTgpKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fSU5URSkgOiAvKiBpbnRlICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfaW50ZS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworOyAvKmNsb2JiZXIqLworOyAvKmNsb2JiZXIqLworOyAvKmNsb2JiZXIqLworICB7CisgICAgU0kgb3B2YWwgPSBmcjMwX2ludGUgKGN1cnJlbnRfY3B1LCBwYyk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1JFVEkpIDogLyogcmV0aSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X3JldGkuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2lmIChFUUJJIChHRVRfSF9TQklUICgpLCAwKSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBHRVRfSF9EUiAoKChVSU5UKSAyKSkpOworICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDcpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChHRVRfSF9EUiAoKChVSU5UKSAyKSksIDQpOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDIpLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItMiIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEdFVF9IX0RSICgoKFVJTlQpIDIpKSk7CisgICAgU0VUX0hfUFMgKG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDgpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwcyIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChHRVRfSF9EUiAoKChVSU5UKSAyKSksIDQpOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDIpLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItMiIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gZWxzZSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEdFVF9IX0RSICgoKFVJTlQpIDMpKSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKEdFVF9IX0RSICgoKFVJTlQpIDMpKSwgNCk7CisgICAgU0VUX0hfRFIgKCgoVUlOVCkgMyksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDYpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci0zIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgR0VUX0hfRFIgKCgoVUlOVCkgMykpKTsKKyAgICBTRVRfSF9QUyAob3B2YWwpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgOCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBzIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKEdFVF9IX0RSICgoKFVJTlQpIDMpKSwgNCk7CisgICAgU0VUX0hfRFIgKCgoVUlOVCkgMyksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDYpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci0zIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JSQUQpIDogLyogYnJhOmQgJGxhYmVsOSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JyYWQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQlJBKSA6IC8qIGJyYSAkbGFiZWw5ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYnJhZC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQk5PRCkgOiAvKiBibm86ZCAkbGFiZWw5ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Jub2QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworZG8geyB9IHdoaWxlICgwKTsgLypub3AqLworfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQk5PKSA6IC8qIGJubyAkbGFiZWw5ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Jub2QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geyB9IHdoaWxlICgwKTsgLypub3AqLworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JFUUQpIDogLyogYmVxOmQgJGxhYmVsOSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcWQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKK2lmIChDUFUgKGhfemJpdCkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorfSB3aGlsZSAoMCk7CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQkVRKSA6IC8qIGJlcSAkbGFiZWw5ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmVxZC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworaWYgKENQVSAoaF96Yml0KSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQk5FRCkgOiAvKiBibmU6ZCAkbGFiZWw5ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmVxZC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworaWYgKE5PVEJJIChDUFUgKGhfemJpdCkpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JORSkgOiAvKiBibmUgJGxhYmVsOSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcWQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2lmIChOT1RCSSAoQ1BVIChoX3piaXQpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQkNEKSA6IC8qIGJjOmQgJGxhYmVsOSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JjZC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworaWYgKENQVSAoaF9jYml0KSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CQykgOiAvKiBiYyAkbGFiZWw5ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmNkLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitpZiAoQ1BVIChoX2NiaXQpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CTkNEKSA6IC8qIGJuYzpkICRsYWJlbDkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iY2QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKK2lmIChOT1RCSSAoQ1BVIChoX2NiaXQpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CTkMpIDogLyogYm5jICRsYWJlbDkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iY2QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2lmIChOT1RCSSAoQ1BVIChoX2NiaXQpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQk5EKSA6IC8qIGJuOmQgJGxhYmVsOSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JuZC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworaWYgKENQVSAoaF9uYml0KSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CTikgOiAvKiBibiAkbGFiZWw5ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5kLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitpZiAoQ1BVIChoX25iaXQpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CUEQpIDogLyogYnA6ZCAkbGFiZWw5ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5kLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CitpZiAoTk9UQkkgKENQVSAoaF9uYml0KSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorfSB3aGlsZSAoMCk7CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQlApIDogLyogYnAgJGxhYmVsOSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JuZC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworaWYgKE5PVEJJIChDUFUgKGhfbmJpdCkpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CVkQpIDogLyogYnY6ZCAkbGFiZWw5ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYnZkLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CitpZiAoQ1BVIChoX3ZiaXQpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JWKSA6IC8qIGJ2ICRsYWJlbDkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9idmQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2lmIChDUFUgKGhfdmJpdCkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JOVkQpIDogLyogYm52OmQgJGxhYmVsOSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2J2ZC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworaWYgKE5PVEJJIChDUFUgKGhfdmJpdCkpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JOVikgOiAvKiBibnYgJGxhYmVsOSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2J2ZC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworaWYgKE5PVEJJIChDUFUgKGhfdmJpdCkpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CTFREKSA6IC8qIGJsdDpkICRsYWJlbDkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibHRkLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CitpZiAoWE9SQkkgKENQVSAoaF92Yml0KSwgQ1BVIChoX25iaXQpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CTFQpIDogLyogYmx0ICRsYWJlbDkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibHRkLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitpZiAoWE9SQkkgKENQVSAoaF92Yml0KSwgQ1BVIChoX25iaXQpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQkdFRCkgOiAvKiBiZ2U6ZCAkbGFiZWw5ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmx0ZC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworaWYgKE5PVEJJIChYT1JCSSAoQ1BVIChoX3ZiaXQpLCBDUFUgKGhfbmJpdCkpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CR0UpIDogLyogYmdlICRsYWJlbDkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibHRkLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitpZiAoTk9UQkkgKFhPUkJJIChDUFUgKGhfdmJpdCksIENQVSAoaF9uYml0KSkpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CTEVEKSA6IC8qIGJsZTpkICRsYWJlbDkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibGVkLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CitpZiAoT1JCSSAoWE9SQkkgKENQVSAoaF92Yml0KSwgQ1BVIChoX25iaXQpKSwgQ1BVIChoX3piaXQpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDQpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CTEUpIDogLyogYmxlICRsYWJlbDkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibGVkLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitpZiAoT1JCSSAoWE9SQkkgKENQVSAoaF92Yml0KSwgQ1BVIChoX25iaXQpKSwgQ1BVIChoX3piaXQpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDQpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQkdURCkgOiAvKiBiZ3Q6ZCAkbGFiZWw5ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmxlZC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworaWYgKE5PVEJJIChPUkJJIChYT1JCSSAoQ1BVIChoX3ZiaXQpLCBDUFUgKGhfbmJpdCkpLCBDUFUgKGhfemJpdCkpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDQpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CR1QpIDogLyogYmd0ICRsYWJlbDkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibGVkLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitpZiAoTk9UQkkgKE9SQkkgKFhPUkJJIChDUFUgKGhfdmJpdCksIENQVSAoaF9uYml0KSksIENQVSAoaF96Yml0KSkpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CTFNEKSA6IC8qIGJsczpkICRsYWJlbDkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibHNkLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CitpZiAoT1JCSSAoQ1BVIChoX2NiaXQpLCBDUFUgKGhfemJpdCkpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JMUykgOiAvKiBibHMgJGxhYmVsOSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2Jsc2QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2lmIChPUkJJIChDUFUgKGhfY2JpdCksIENQVSAoaF96Yml0KSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JISUQpIDogLyogYmhpOmQgJGxhYmVsOSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2Jsc2QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKK2lmIChOT1RCSSAoT1JCSSAoQ1BVIChoX2NiaXQpLCBDUFUgKGhfemJpdCkpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CSEkpIDogLyogYmhpICRsYWJlbDkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibHNkLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitpZiAoTk9UQkkgKE9SQkkgKENQVSAoaF9jYml0KSwgQ1BVIChoX3piaXQpKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0RNT1ZSMTMpIDogLyogZG1vdiAkUjEzLEAkZGlyMTAgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZG1vdnIxMy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDEzKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9kaXIxMCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9ETU9WUjEzSCkgOiAvKiBkbW92aCAkUjEzLEAkZGlyOSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92cjEzaC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBISSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDEzKV0pOworICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9kaXI5KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0RNT1ZSMTNCKSA6IC8qIGRtb3ZiICRSMTMsQCRkaXI4ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3ZyMTNiLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFFJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMTMpXSk7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjgpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fRE1PVlIxM1BJKSA6IC8qIGRtb3YgQCRSMTMrLEAkZGlyMTAgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZG1vdnIxM3BpLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9kaXIxMCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDEzKV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9ETU9WUjEzUElIKSA6IC8qIGRtb3ZoIEAkUjEzKyxAJGRpcjkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZG1vdnIxM3BpaC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBISSBvcHZhbCA9IEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pKTsKKyAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyOSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDEzKV0pLCAyKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9ETU9WUjEzUElCKSA6IC8qIGRtb3ZiIEAkUjEzKyxAJGRpcjggKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZG1vdnIxM3BpYi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBRSSBvcHZhbCA9IEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pKTsKKyAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyOCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDEzKV0pLCAxKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9ETU9WUjE1UEkpIDogLyogZG1vdiBAJFIxNSssQCRkaXIxMCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92cjE1cGkuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjEwKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0RNT1YyUjEzKSA6IC8qIGRtb3YgQCRkaXIxMCwkUjEzICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3YycjEzLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjEwKSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTMiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0RNT1YyUjEzSCkgOiAvKiBkbW92aCBAJGRpcjksJFIxMyAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92MnIxM2guZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyOSkpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEzIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9ETU9WMlIxM0IpIDogLyogZG1vdmIgQCRkaXI4LCRSMTMgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZG1vdjJyMTNiLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjgpKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMyIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fRE1PVjJSMTNQSSkgOiAvKiBkbW92IEAkZGlyMTAsQCRSMTMrICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3YycjEzcGkuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyMTApKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTMpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEzIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0RNT1YyUjEzUElIKSA6IC8qIGRtb3ZoIEAkZGlyOSxAJFIxMysgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZG1vdjJyMTNwaWguZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgSEkgb3B2YWwgPSBHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyOSkpOworICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSwgMik7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTMiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fRE1PVjJSMTNQSUIpIDogLyogZG1vdmIgQCRkaXI4LEAkUjEzKyAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92MnIxM3BpYi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBRSSBvcHZhbCA9IEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9kaXI4KSk7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDEzKV0pLCAxKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9ETU9WMlIxNVBEKSA6IC8qIGRtb3YgQCRkaXIxMCxALSRSMTUgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZG1vdjJyMTVwZC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyMTApKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERSRVMpIDogLyogbGRyZXMgQCRSaSssJHU0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcmVzLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX1JpKSwgNCk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVFJFUykgOiAvKiBzdHJlcyAkdTQsQCRSaSsgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRyZXMuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfUmkpLCA0KTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NPUE9QKSA6IC8qIGNvcG9wICR1NGMsJGNjYywkQ1JqLCRDUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY29wb3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geyB9IHdoaWxlICgwKTsgLypub3AqLworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NPUExEKSA6IC8qIGNvcGxkICR1NGMsJGNjYywkUmpjLCRDUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY29wbGQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geyB9IHdoaWxlICgwKTsgLypub3AqLworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NPUFNUKSA6IC8qIGNvcHN0ICR1NGMsJGNjYywkQ1JqLCRSaWMgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY29wc3QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geyB9IHdoaWxlICgwKTsgLypub3AqLworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NPUFNWKSA6IC8qIGNvcHN2ICR1NGMsJGNjYywkQ1JqLCRSaWMgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY29wc3QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geyB9IHdoaWxlICgwKTsgLypub3AqLworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX05PUCkgOiAvKiBub3AgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm9wLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsgfSB3aGlsZSAoMCk7IC8qbm9wKi8KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9BTkRDQ1IpIDogLyogYW5kY2NyICR1OCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRjY3IuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgVVFJIG9wdmFsID0gQU5EUUkgKEdFVF9IX0NDUiAoKSwgRkxEIChmX3U4KSk7CisgICAgU0VUX0hfQ0NSIChvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjciIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fT1JDQ1IpIDogLyogb3JjY3IgJHU4ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FuZGNjci5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBVUUkgb3B2YWwgPSBPUlFJIChHRVRfSF9DQ1IgKCksIEZMRCAoZl91OCkpOworICAgIFNFVF9IX0NDUiAob3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjY3IiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUSUxNKSA6IC8qIHN0aWxtICR1OCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGlsbS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBVUUkgb3B2YWwgPSBBTkRTSSAoRkxEIChmX3U4KSwgMzEpOworICAgIFNFVF9IX0lMTSAob3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJpbG0iLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0FERFNQKSA6IC8qIGFkZHNwICRzMTAgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkc3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIEZMRCAoZl9zMTApKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fRVhUU0IpIDogLyogZXh0c2IgJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2V4dHNiLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gRVhUUUlTSSAoQU5EUUkgKCogRkxEIChpX1JpKSwgMjU1KSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9FWFRVQikgOiAvKiBleHR1YiAkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZXh0dWIuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBaRVhUUUlTSSAoQU5EUUkgKCogRkxEIChpX1JpKSwgMjU1KSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9FWFRTSCkgOiAvKiBleHRzaCAkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZXh0c2guZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBFWFRISVNJIChBTkRISSAoKiBGTEQgKGlfUmkpLCA2NTUzNSkpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fRVhUVUgpIDogLyogZXh0dWggJFJpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2V4dHVoLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gWkVYVEhJU0kgKEFOREhJICgqIEZMRCAoaV9SaSksIDY1NTM1KSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRE0wKSA6IC8qIGxkbTAgKCRyZWdsaXN0X2xvd19sZCkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRtMC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19sZCksIDEpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAwKV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDUpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X2xkKSwgMikpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDEpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDQpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQoraWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfbGQpLCA0KSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMildKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTIiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19sZCksIDgpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAzKV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA3KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMyIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDUpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X2xkKSwgMTYpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSA0KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA4KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItNCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDUpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X2xkKSwgMzIpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSA1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA5KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItNSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDUpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X2xkKSwgNjQpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSA2KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTYiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19sZCksIDEyOCkpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDcpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDExKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItNyIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDUpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRE0xKSA6IC8qIGxkbTEgKCRyZWdsaXN0X2hpX2xkKSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG0xLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfbGQpLCAxKSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgOCldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgOSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTgiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA4KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2hpX2xkKSwgMikpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDkpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItOSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDgpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfbGQpLCA0KSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTApXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDgpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfbGQpLCA4KSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTEpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDQpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDgpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfbGQpLCAxNikpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDEyKV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTIiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA4KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2hpX2xkKSwgMzIpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEzIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgOCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQoraWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9sZCksIDY0KSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDcpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDgpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfbGQpLCAxMjgpKSB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgOCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVE0wKSA6IC8qIHN0bTAgKCRyZWdsaXN0X2xvd19zdCkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RtMC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19zdCksIDEpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSA3KV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAxMSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X3N0KSwgMikpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDYpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDExKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQoraWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfc3QpLCA0KSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgNSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTEpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19zdCksIDgpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSA0KV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAxMSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X3N0KSwgMTYpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAzKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAxMSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X3N0KSwgMzIpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAyKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAxMSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X3N0KSwgNjQpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAxKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAxMSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X3N0KSwgMTI4KSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMCldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTEpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RNMSkgOiAvKiBzdG0xICgkcmVnbGlzdF9oaV9zdCkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RtMS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2hpX3N0KSwgMSkpIHsKK2RvIHsKKyAgU0kgdG1wX3NhdmVfcjE1OworICB0bXBfc2F2ZV9yMTUgPSBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKTsKKyAgeworICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgOSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gdG1wX3NhdmVfcjE1OworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfc3QpLCAyKSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA5KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2hpX3N0KSwgNCkpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgOSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMTMpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQoraWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9zdCksIDgpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDkpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDEyKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfc3QpLCAxNikpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgOSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMTEpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQoraWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9zdCksIDMyKSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA5KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAxMCldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2hpX3N0KSwgNjQpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDkpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQoraWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9zdCksIDEyOCkpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgOSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgOCldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fRU5URVIpIDogLyogZW50ZXIgJHUxMCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbnRlci5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF90bXA7CisgIHRtcF90bXAgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdG1wLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IHRtcF90bXA7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIEZMRCAoZl91MTApKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRUFWRSkgOiAvKiBsZWF2ZSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZWF2ZS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9YQ0hCKSA6IC8qIHhjaGIgQCRSaiwkUmkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfeGNoYi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF90bXA7CisgIHRtcF90bXAgPSAqIEZMRCAoaV9SaSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVRSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaikpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBVUUkgb3B2YWwgPSB0bXBfdG1wOworICAgIFNFVE1FTVVRSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaiksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKworICAgIH0KKyAgRU5EU1dJVENIIChzZW0pIC8qIEVuZCBvZiBzZW1hbnRpYyBzd2l0Y2guICAqLworCisgIC8qIEF0IHRoaXMgcG9pbnQgYHZwYycgY29udGFpbnMgdGhlIG5leHQgaW5zbiB0byBleGVjdXRlLiAgKi8KK30KKworI3VuZGVmIERFRklORV9TV0lUQ0gKKyNlbmRpZiAvKiBERUZJTkVfU1dJVENIICovCmRpZmYgLS1naXQgYS9zaW0vZnIzMC9zZW0uYyBiL3NpbS9mcjMwL3NlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMjRjMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZnIzMC9zZW0uYwpAQCAtMCwwICsxLDU1MDQgQEAKKy8qIFNpbXVsYXRvciBpbnN0cnVjdGlvbiBzZW1hbnRpY3MgZm9yIGZyMzBiZi4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2RlZmluZSBXQU5UX0NQVSBmcjMwYmYKKyNkZWZpbmUgV0FOVF9DUFVfRlIzMEJGCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2luY2x1ZGUgImNnZW4tbWVtLmgiCisjaW5jbHVkZSAiY2dlbi1vcHMuaCIKKworI3VuZGVmIEdFVF9BVFRSCisjZGVmaW5lIEdFVF9BVFRSKGNwdSwgbnVtLCBhdHRyKSBDR0VOX0FUVFJfVkFMVUUgKE5VTEwsIGFidWYtPmlkZXNjLT5hdHRycywgQ0dFTl9JTlNOXyMjYXR0cikKKworLyogeC1pbnZhbGlkOiAtLWludmFsaWQtLSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYseF9pbnZhbGlkKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOworCisgIHsKKyNpZiBXSVRIX1NDQUNIRQorICAgIC8qIFVwZGF0ZSB0aGUgcmVjb3JkZWQgcGMgaW4gdGhlIGNwdSBzdGF0ZSBzdHJ1Y3QuICAqLworICAgIFNFVF9IX1BDIChwYyk7CisjZW5kaWYKKyAgICBzaW1fZW5naW5lX2ludmFsaWRfaW5zbiAoY3VycmVudF9jcHUsIHBjKTsKKyAgICBzaW1faW9fZXJyb3IgKENQVV9TVEFURSAoY3VycmVudF9jcHUpLCAiaW52YWxpZCBpbnNuIG5vdCBoYW5kbGVkXG4iKTsKKyAgICAvKiBOT1RSRUFDSEVEICovCisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiB4LWFmdGVyOiAtLWFmdGVyLS0gKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLHhfYWZ0ZXIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7CisKKyAgeworI2lmIFdJVEhfU0NBQ0hFX1BCQl9GUjMwQkYKKyAgICBmcjMwYmZfcGJiX2FmdGVyIChjdXJyZW50X2NwdSwgc2VtX2FyZyk7CisjZW5kaWYKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHgtYmVmb3JlOiAtLWJlZm9yZS0tICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZix4X2JlZm9yZSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKKworICB7CisjaWYgV0lUSF9TQ0FDSEVfUEJCX0ZSMzBCRgorICAgIGZyMzBiZl9wYmJfYmVmb3JlIChjdXJyZW50X2NwdSwgc2VtX2FyZyk7CisjZW5kaWYKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHgtY3RpLWNoYWluOiAtLWN0aS1jaGFpbi0tICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZix4X2N0aV9jaGFpbikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKKworICB7CisjaWYgV0lUSF9TQ0FDSEVfUEJCX0ZSMzBCRgorI2lmZGVmIERFRklORV9TV0lUQ0gKKyAgICB2cGMgPSBmcjMwYmZfcGJiX2N0aV9jaGFpbiAoY3VycmVudF9jcHUsIHNlbV9hcmcsCisJCQkgICAgICAgcGJiX2JyX25wY19wdHIsIHBiYl9icl9ucGMpOworICAgIEJSRUFLIChzZW0pOworI2Vsc2UKKyAgICAvKiBGSVhNRTogQWxsb3cgcHJvdmlzaW9uIG9mIGV4cGxpY2l0IGlmbXQgc3BlYyBpbiBpbnNuIHNwZWMuICAqLworICAgIHZwYyA9IGZyMzBiZl9wYmJfY3RpX2NoYWluIChjdXJyZW50X2NwdSwgc2VtX2FyZywKKwkJCSAgICAgICBDUFVfUEJCX0JSX05QQ19QVFIgKGN1cnJlbnRfY3B1KSwKKwkJCSAgICAgICBDUFVfUEJCX0JSX05QQyAoY3VycmVudF9jcHUpKTsKKyNlbmRpZgorI2VuZGlmCisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiB4LWNoYWluOiAtLWNoYWluLS0gKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLHhfY2hhaW4pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7CisKKyAgeworI2lmIFdJVEhfU0NBQ0hFX1BCQl9GUjMwQkYKKyAgICB2cGMgPSBmcjMwYmZfcGJiX2NoYWluIChjdXJyZW50X2NwdSwgc2VtX2FyZyk7CisjaWZkZWYgREVGSU5FX1NXSVRDSAorICAgIEJSRUFLIChzZW0pOworI2VuZGlmCisjZW5kaWYKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHgtYmVnaW46IC0tYmVnaW4tLSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYseF9iZWdpbikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKKworICB7CisjaWYgV0lUSF9TQ0FDSEVfUEJCX0ZSMzBCRgorI2lmZGVmIERFRklORV9TV0lUQ0gKKyAgICAvKiBJbiB0aGUgc3dpdGNoIGNhc2UgRkFTVF9QIGlzIGEgY29uc3RhbnQsIGFsbG93aW5nIHNldmVyYWwgb3B0aW1pemF0aW9ucworICAgICAgIGluIGFueSBjYWxsZWQgaW5saW5lIGZ1bmN0aW9ucy4gICovCisgICAgdnBjID0gZnIzMGJmX3BiYl9iZWdpbiAoY3VycmVudF9jcHUsIEZBU1RfUCk7CisjZWxzZQorICAgIHZwYyA9IGZyMzBiZl9wYmJfYmVnaW4gKGN1cnJlbnRfY3B1LCBTVEFURV9SVU5fRkFTVF9QIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSkpOworI2VuZGlmCisjZW5kaWYKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGFkZDogYWRkICRSaiwkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGFkZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gQURET0ZTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaiksIDApOworICAgIENQVSAoaF92Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ2Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gQUREQ0ZTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaiksIDApOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorZG8geworICB7CisgICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGFkZGk6IGFkZCAkdTQsJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixhZGRpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkaS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gQURET0ZTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfdTQpLCAwKTsKKyAgICBDUFUgKGhfdmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAidmJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IEFERENGU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX3U0KSwgMCk7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfdTQpKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorZG8geworICB7CisgICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGFkZDI6IGFkZDIgJG00LCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYWRkMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZDIuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEFERE9GU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX200KSwgMCk7CisgICAgQ1BVIChoX3ZiaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInZiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBBRERDRlNJICgqIEZMRCAoaV9SaSksIEZMRCAoZl9tNCksIDApOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX200KSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBhZGRjOiBhZGRjICRSaiwkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGFkZGMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGRjLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfdG1wOworICB0bXBfdG1wID0gQUREQ1NJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgQ1BVIChoX2NiaXQpKTsKKyAgeworICAgIEJJIG9wdmFsID0gQURET0ZTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaiksIENQVSAoaF9jYml0KSk7CisgICAgQ1BVIChoX3ZiaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInZiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBBRERDRlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgQ1BVIChoX2NiaXQpKTsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IHRtcF90bXA7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBhZGRuOiBhZGRuICRSaiwkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGFkZG4pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGRuLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaikpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYWRkbmk6IGFkZG4gJHU0LCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYWRkbmkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGRuaS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX3U0KSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBhZGRuMjogYWRkbjIgJG00LCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYWRkbjIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGRuMi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX200KSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdWI6IHN1YiAkUmosJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixzdWIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IFNVQk9GU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopLCAwKTsKKyAgICBDUFUgKGhfdmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAidmJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IFNVQkNGU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopLCAwKTsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdWJjOiBzdWJjICRSaiwkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLHN1YmMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGRjLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfdG1wOworICB0bXBfdG1wID0gU1VCQ1NJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgQ1BVIChoX2NiaXQpKTsKKyAgeworICAgIEJJIG9wdmFsID0gU1VCT0ZTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaiksIENQVSAoaF9jYml0KSk7CisgICAgQ1BVIChoX3ZiaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInZiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBTVUJDRlNJICgqIEZMRCAoaV9SaSksICogRkxEIChpX1JqKSwgQ1BVIChoX2NiaXQpKTsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IHRtcF90bXA7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdWJuOiBzdWJuICRSaiwkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLHN1Ym4pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGRuLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaikpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY21wOiBjbXAgJFJqLCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsY21wKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY21wLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfdG1wMTsKKyAgeworICAgIEJJIG9wdmFsID0gU1VCT0ZTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaiksIDApOworICAgIENQVSAoaF92Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ2Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gU1VCQ0ZTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaiksIDApOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgdG1wX3RtcDEgPSBTVUJTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaikpOworZG8geworICB7CisgICAgQkkgb3B2YWwgPSBFUVNJICh0bXBfdG1wMSwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICh0bXBfdG1wMSwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBjbXBpOiBjbXAgJHU0LCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsY21waSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF90bXAxOworICB7CisgICAgQkkgb3B2YWwgPSBTVUJPRlNJICgqIEZMRCAoaV9SaSksIEZMRCAoZl91NCksIDApOworICAgIENQVSAoaF92Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ2Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gU1VCQ0ZTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfdTQpLCAwKTsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHRtcF90bXAxID0gU1VCU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX3U0KSk7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRU0kgKHRtcF90bXAxLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKHRtcF90bXAxLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNtcDI6IGNtcDIgJG00LCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsY21wMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcDIuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF90bXAxOworICB7CisgICAgQkkgb3B2YWwgPSBTVUJPRlNJICgqIEZMRCAoaV9SaSksIEZMRCAoZl9tNCksIDApOworICAgIENQVSAoaF92Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ2Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gU1VCQ0ZTSSAoKiBGTEQgKGlfUmkpLCBGTEQgKGZfbTQpLCAwKTsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHRtcF90bXAxID0gU1VCU0kgKCogRkxEIChpX1JpKSwgRkxEIChmX200KSk7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRU0kgKHRtcF90bXAxLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKHRtcF90bXAxLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGFuZDogYW5kICRSaiwkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGFuZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FuZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gQU5EU0kgKCogRkxEIChpX1JpKSwgKiBGTEQgKGlfUmopKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorZG8geworICB7CisgICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG9yOiBvciAkUmosJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixvcikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FuZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gT1JTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaikpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogZW9yOiBlb3IgJFJqLCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsZW9yKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYW5kLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBYT1JTSSAoKiBGTEQgKGlfUmkpLCAqIEZMRCAoaV9SaikpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYW5kbTogYW5kICRSaixAJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixhbmRtKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYW5kbS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgU0kgdG1wX3RtcDsKKyAgdG1wX3RtcCA9IEFORFNJIChHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpLCAqIEZMRCAoaV9SaikpOworZG8geworICB7CisgICAgQkkgb3B2YWwgPSBFUVNJICh0bXBfdG1wLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKHRtcF90bXAsIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworICB7CisgICAgU0kgb3B2YWwgPSB0bXBfdG1wOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYW5kaDogYW5kaCAkUmosQCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYW5kaCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FuZGguZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIEhJIHRtcF90bXA7CisgIHRtcF90bXAgPSBBTkRISSAoR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSwgKiBGTEQgKGlfUmopKTsKK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gRVFISSAodG1wX3RtcCwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVEhJICh0bXBfdG1wLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKyAgeworICAgIEhJIG9wdmFsID0gdG1wX3RtcDsKKyAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGFuZGI6IGFuZGIgJFJqLEAkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGFuZGIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRiLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBRSSB0bXBfdG1wOworICB0bXBfdG1wID0gQU5EUUkgKEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSksICogRkxEIChpX1JqKSk7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRUUkgKHRtcF90bXAsIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gTFRRSSAodG1wX3RtcCwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisgIHsKKyAgICBRSSBvcHZhbCA9IHRtcF90bXA7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBvcm06IG9yICRSaixAJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixvcm0pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRtLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfdG1wOworICB0bXBfdG1wID0gT1JTSSAoR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSwgKiBGTEQgKGlfUmopKTsKK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAodG1wX3RtcCwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICh0bXBfdG1wLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKyAgeworICAgIFNJIG9wdmFsID0gdG1wX3RtcDsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG9yaDogb3JoICRSaixAJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixvcmgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRoLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBISSB0bXBfdG1wOworICB0bXBfdG1wID0gT1JISSAoR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSwgKiBGTEQgKGlfUmopKTsKK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gRVFISSAodG1wX3RtcCwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVEhJICh0bXBfdG1wLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKyAgeworICAgIEhJIG9wdmFsID0gdG1wX3RtcDsKKyAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG9yYjogb3JiICRSaixAJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixvcmIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRiLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBRSSB0bXBfdG1wOworICB0bXBfdG1wID0gT1JRSSAoR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSwgKiBGTEQgKGlfUmopKTsKK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gRVFRSSAodG1wX3RtcCwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFFJICh0bXBfdG1wLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKyAgeworICAgIFFJIG9wdmFsID0gdG1wX3RtcDsKKyAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGVvcm06IGVvciAkUmosQCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsZW9ybSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FuZG0uZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF90bXA7CisgIHRtcF90bXAgPSBYT1JTSSAoR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSwgKiBGTEQgKGlfUmopKTsKK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAodG1wX3RtcCwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICh0bXBfdG1wLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKyAgeworICAgIFNJIG9wdmFsID0gdG1wX3RtcDsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGVvcmg6IGVvcmggJFJqLEAkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGVvcmgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRoLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBISSB0bXBfdG1wOworICB0bXBfdG1wID0gWE9SSEkgKEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSksICogRkxEIChpX1JqKSk7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRSEkgKHRtcF90bXAsIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gTFRISSAodG1wX3RtcCwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisgIHsKKyAgICBISSBvcHZhbCA9IHRtcF90bXA7CisgICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBlb3JiOiBlb3JiICRSaixAJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixlb3JiKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYW5kYi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgUUkgdG1wX3RtcDsKKyAgdG1wX3RtcCA9IFhPUlFJIChHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpLCAqIEZMRCAoaV9SaikpOworZG8geworICB7CisgICAgQkkgb3B2YWwgPSBFUVFJICh0bXBfdG1wLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUUUkgKHRtcF90bXAsIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworICB7CisgICAgUUkgb3B2YWwgPSB0bXBfdG1wOworICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYmFuZGw6IGJhbmRsICR1NCxAJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixiYW5kbCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2JhbmRsLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgUUkgb3B2YWwgPSBBTkRRSSAoT1JRSSAoRkxEIChmX3U0KSwgMjQwKSwgR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSk7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYm9ybDogYm9ybCAkdTQsQCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYm9ybCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2JhbmRsLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgUUkgb3B2YWwgPSBPUlFJIChGTEQgKGZfdTQpLCBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpKTsKKyAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBiZW9ybDogYmVvcmwgJHU0LEAkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGJlb3JsKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYmFuZGwuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBRSSBvcHZhbCA9IFhPUlFJIChGTEQgKGZfdTQpLCBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSkpKTsKKyAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBiYW5kaDogYmFuZGggJHU0LEAkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGJhbmRoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYmFuZGwuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBRSSBvcHZhbCA9IEFORFFJIChPUlFJIChTTExRSSAoRkxEIChmX3U0KSwgNCksIDE1KSwgR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSk7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYm9yaDogYm9yaCAkdTQsQCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYm9yaCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2JhbmRsLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgUUkgb3B2YWwgPSBPUlFJIChTTExRSSAoRkxEIChmX3U0KSwgNCksIEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSkpOworICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJlb3JoOiBiZW9yaCAkdTQsQCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYmVvcmgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9iYW5kbC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFFJIG9wdmFsID0gWE9SUUkgKFNMTFFJIChGTEQgKGZfdTQpLCA0KSwgR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSk7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYnRzdGw6IGJ0c3RsICR1NCxAJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixidHN0bCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2J0c3RsLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBRSSB0bXBfdG1wOworICB0bXBfdG1wID0gQU5EUUkgKEZMRCAoZl91NCksIEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JpKSkpOworICB7CisgICAgQkkgb3B2YWwgPSBFUVFJICh0bXBfdG1wLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IDA7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYnRzdGg6IGJ0c3RoICR1NCxAJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixidHN0aCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2J0c3RsLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBRSSB0bXBfdG1wOworICB0bXBfdG1wID0gQU5EUUkgKFNMTFFJIChGTEQgKGZfdTQpLCA0KSwgR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmkpKSk7CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRUUkgKHRtcF90bXAsIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gTFRRSSAodG1wX3RtcCwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbXVsOiBtdWwgJFJqLCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsbXVsKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBESSB0bXBfdG1wOworICB0bXBfdG1wID0gTVVMREkgKEVYVFNJREkgKCogRkxEIChpX1JqKSksIEVYVFNJREkgKCogRkxEIChpX1JpKSkpOworICB7CisgICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKHRtcF90bXApOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDUpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKFNSTERJICh0bXBfdG1wLCAzMikpOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJIChHRVRfSF9EUiAoKChVSU5UKSA1KSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gRVFESSAodG1wX3RtcCwgTUFLRURJICgwLCAwKSk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBPUklGIChHVERJICh0bXBfdG1wLCBNQUtFREkgKDAsIDIxNDc0ODM2NDcpKSwgTFRESSAodG1wX3RtcCwgTkVHREkgKE1BS0VESSAoMCwgMHg4MDAwMDAwMCkpKSk7CisgICAgQ1BVIChoX3ZiaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInZiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbXVsdTogbXVsdSAkUmosJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixtdWx1KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsdS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgREkgdG1wX3RtcDsKKyAgdG1wX3RtcCA9IE1VTERJIChaRVhUU0lESSAoKiBGTEQgKGlfUmopKSwgWkVYVFNJREkgKCogRkxEIChpX1JpKSkpOworICB7CisgICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKHRtcF90bXApOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDUpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKFNSTERJICh0bXBfdG1wLCAzMikpOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJIChHRVRfSF9EUiAoKChVSU5UKSA0KSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IE5FU0kgKEdFVF9IX0RSICgoKFVJTlQpIDQpKSwgMCk7CisgICAgQ1BVIChoX3ZiaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInZiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbXVsaDogbXVsaCAkUmosJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixtdWxoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsaC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gTVVMSEkgKFRSVU5DU0lISSAoKiBGTEQgKGlfUmopKSwgVFJVTkNTSUhJICgqIEZMRCAoaV9SaSkpKTsKKyAgICBTRVRfSF9EUiAoKChVSU5UKSA1KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci01IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gTFRTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IEdFU0kgKEdFVF9IX0RSICgoKFVJTlQpIDUpKSwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbXVsdWg6IG11bHVoICRSaiwkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLG11bHVoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsaC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gTVVMU0kgKEFORFNJICgqIEZMRCAoaV9SaiksIDY1NTM1KSwgQU5EU0kgKCogRkxEIChpX1JpKSwgNjU1MzUpKTsKKyAgICBTRVRfSF9EUiAoKChVSU5UKSA1KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci01IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gTFRTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IEdFU0kgKEdFVF9IX0RSICgoKFVJTlQpIDUpKSwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogZGl2MHM6IGRpdjBzICRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsZGl2MHMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kaXYwcy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gTFRTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpLCAwKTsKKyAgICBDUFUgKGhfZDBiaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImQwYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gWE9SQkkgKENQVSAoaF9kMGJpdCksIExUU0kgKCogRkxEIChpX1JpKSwgMCkpOworICAgIENQVSAoaF9kMWJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZDFiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQoraWYgKE5FQkkgKENQVSAoaF9kMGJpdCksIDApKSB7CisgIHsKKyAgICBTSSBvcHZhbCA9IDB4ZmZmZmZmZmY7CisgICAgU0VUX0hfRFIgKCgoVUlOVCkgNCksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDUpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci00IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gZWxzZSB7CisgIHsKKyAgICBTSSBvcHZhbCA9IDA7CisgICAgU0VUX0hfRFIgKCgoVUlOVCkgNCksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDUpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci00IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBkaXYwdTogZGl2MHUgJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixkaXYwdSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2RpdjB1LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgQkkgb3B2YWwgPSAwOworICAgIENQVSAoaF9kMGJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZDBiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSAwOworICAgIENQVSAoaF9kMWJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZDFiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSAwOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogZGl2MTogZGl2MSAkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGRpdjEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kaXYxLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfdG1wOworICB7CisgICAgU0kgb3B2YWwgPSBTTExTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAxKTsKKyAgICBTRVRfSF9EUiAoKChVSU5UKSA0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci00IiwgJ3gnLCBvcHZhbCk7CisgIH0KK2lmIChMVFNJIChHRVRfSF9EUiAoKChVSU5UKSA1KSksIDApKSB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChHRVRfSF9EUiAoKChVSU5UKSA0KSksIDEpOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTQiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorICB7CisgICAgU0kgb3B2YWwgPSBTTExTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpLCAxKTsKKyAgICBTRVRfSF9EUiAoKChVSU5UKSA1KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci01IiwgJ3gnLCBvcHZhbCk7CisgIH0KK2lmIChFUUJJIChDUFUgKGhfZDFiaXQpLCAxKSkgeworZG8geworICB0bXBfdG1wID0gQUREU0kgKEdFVF9IX0RSICgoKFVJTlQpIDQpKSwgKiBGTEQgKGlfUmkpKTsKKyAgeworICAgIEJJIG9wdmFsID0gQUREQ0ZTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IGVsc2UgeworZG8geworICB0bXBfdG1wID0gU1VCU0kgKEdFVF9IX0RSICgoKFVJTlQpIDQpKSwgKiBGTEQgKGlfUmkpKTsKKyAgeworICAgIEJJIG9wdmFsID0gU1VCQ0ZTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoTk9UQkkgKFhPUkJJIChYT1JCSSAoQ1BVIChoX2QwYml0KSwgQ1BVIChoX2QxYml0KSksIENQVSAoaF9jYml0KSkpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IHRtcF90bXA7CisgICAgU0VUX0hfRFIgKCgoVUlOVCkgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItNCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IE9SU0kgKEdFVF9IX0RSICgoKFVJTlQpIDUpKSwgMSk7CisgICAgU0VUX0hfRFIgKCgoVUlOVCkgNSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItNSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogZGl2MjogZGl2MiAkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGRpdjIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kaXYyLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfdG1wOworaWYgKEVRQkkgKENQVSAoaF9kMWJpdCksIDEpKSB7CitkbyB7CisgIHRtcF90bXAgPSBBRERTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAqIEZMRCAoaV9SaSkpOworICB7CisgICAgQkkgb3B2YWwgPSBBRERDRlNJIChHRVRfSF9EUiAoKChVSU5UKSA0KSksICogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gZWxzZSB7CitkbyB7CisgIHRtcF90bXAgPSBTVUJTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNCkpLCAqIEZMRCAoaV9SaSkpOworICB7CisgICAgQkkgb3B2YWwgPSBTVUJDRlNJIChHRVRfSF9EUiAoKChVSU5UKSA0KSksICogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChFUVNJICh0bXBfdG1wLCAwKSkgeworZG8geworICB7CisgICAgQkkgb3B2YWwgPSAxOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSAwOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDQpLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA0KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItNCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gZWxzZSB7CisgIHsKKyAgICBCSSBvcHZhbCA9IDA7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogZGl2MzogZGl2MyAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsZGl2MykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2RpdjMuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitpZiAoRVFCSSAoQ1BVIChoX3piaXQpLCAxKSkgeworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoR0VUX0hfRFIgKCgoVUlOVCkgNSkpLCAxKTsKKyAgICBTRVRfSF9EUiAoKChVSU5UKSA1KSwgb3B2YWwpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTUiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBkaXY0czogZGl2NHMgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGRpdjRzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZGl2NHMuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitpZiAoRVFCSSAoQ1BVIChoX2QxYml0KSwgMSkpIHsKKyAgeworICAgIFNJIG9wdmFsID0gTkVHU0kgKEdFVF9IX0RSICgoKFVJTlQpIDUpKSk7CisgICAgU0VUX0hfRFIgKCgoVUlOVCkgNSksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci01IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbHNsOiBsc2wgJFJqLCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsbHNsKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbHNsLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfc2hpZnQ7CisgIHRtcF9zaGlmdCA9IEFORFNJICgqIEZMRCAoaV9SaiksIDMxKTsKK2lmIChORVNJICh0bXBfc2hpZnQsIDApKSB7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IE5FU0kgKEFORFNJICgqIEZMRCAoaV9SaSksIFNMTFNJICgxLCBTVUJTSSAoMzIsIHRtcF9zaGlmdCkpKSwgMCk7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IFNMTFNJICgqIEZMRCAoaV9SaSksIHRtcF9zaGlmdCk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IGVsc2UgeworICB7CisgICAgQkkgb3B2YWwgPSAwOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbHNsaTogbHNsICR1NCwkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGxzbGkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sc2xpLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfc2hpZnQ7CisgIHRtcF9zaGlmdCA9IEZMRCAoZl91NCk7CitpZiAoTkVTSSAodG1wX3NoaWZ0LCAwKSkgeworZG8geworICB7CisgICAgQkkgb3B2YWwgPSBORVNJIChBTkRTSSAoKiBGTEQgKGlfUmkpLCBTTExTSSAoMSwgU1VCU0kgKDMyLCB0bXBfc2hpZnQpKSksIDApOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBTTExTSSAoKiBGTEQgKGlfUmkpLCB0bXBfc2hpZnQpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfSBlbHNlIHsKKyAgeworICAgIEJJIG9wdmFsID0gMDsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKyAgeworICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfbmJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibmJpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IEVRU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX3piaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInpiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxzbDI6IGxzbDIgJHU0LCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsbHNsMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xzbGkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF9zaGlmdDsKKyAgdG1wX3NoaWZ0ID0gQUREU0kgKEZMRCAoZl91NCksIDE2KTsKK2lmIChORVNJICh0bXBfc2hpZnQsIDApKSB7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IE5FU0kgKEFORFNJICgqIEZMRCAoaV9SaSksIFNMTFNJICgxLCBTVUJTSSAoMzIsIHRtcF9zaGlmdCkpKSwgMCk7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IFNMTFNJICgqIEZMRCAoaV9SaSksIHRtcF9zaGlmdCk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IGVsc2UgeworICB7CisgICAgQkkgb3B2YWwgPSAwOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbHNyOiBsc3IgJFJqLCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsbHNyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbHNsLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfc2hpZnQ7CisgIHRtcF9zaGlmdCA9IEFORFNJICgqIEZMRCAoaV9SaiksIDMxKTsKK2lmIChORVNJICh0bXBfc2hpZnQsIDApKSB7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IE5FU0kgKEFORFNJICgqIEZMRCAoaV9SaSksIFNMTFNJICgxLCBTVUJTSSAodG1wX3NoaWZ0LCAxKSkpLCAwKTsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gU1JMU0kgKCogRkxEIChpX1JpKSwgdG1wX3NoaWZ0KTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gZWxzZSB7CisgIHsKKyAgICBCSSBvcHZhbCA9IDA7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9Cit9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsc3JpOiBsc3IgJHU0LCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsbHNyaSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xzbGkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF9zaGlmdDsKKyAgdG1wX3NoaWZ0ID0gRkxEIChmX3U0KTsKK2lmIChORVNJICh0bXBfc2hpZnQsIDApKSB7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IE5FU0kgKEFORFNJICgqIEZMRCAoaV9SaSksIFNMTFNJICgxLCBTVUJTSSAodG1wX3NoaWZ0LCAxKSkpLCAwKTsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gU1JMU0kgKCogRkxEIChpX1JpKSwgdG1wX3NoaWZ0KTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gZWxzZSB7CisgIHsKKyAgICBCSSBvcHZhbCA9IDA7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9Cit9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsc3IyOiBsc3IyICR1NCwkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGxzcjIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sc2xpLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfc2hpZnQ7CisgIHRtcF9zaGlmdCA9IEFERFNJIChGTEQgKGZfdTQpLCAxNik7CitpZiAoTkVTSSAodG1wX3NoaWZ0LCAwKSkgeworZG8geworICB7CisgICAgQkkgb3B2YWwgPSBORVNJIChBTkRTSSAoKiBGTEQgKGlfUmkpLCBTTExTSSAoMSwgU1VCU0kgKHRtcF9zaGlmdCwgMSkpKSwgMCk7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IFNSTFNJICgqIEZMRCAoaV9SaSksIHRtcF9zaGlmdCk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IGVsc2UgeworICB7CisgICAgQkkgb3B2YWwgPSAwOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYXNyOiBhc3IgJFJqLCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYXNyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbHNsLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfc2hpZnQ7CisgIHRtcF9zaGlmdCA9IEFORFNJICgqIEZMRCAoaV9SaiksIDMxKTsKK2lmIChORVNJICh0bXBfc2hpZnQsIDApKSB7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IE5FU0kgKEFORFNJICgqIEZMRCAoaV9SaSksIFNMTFNJICgxLCBTVUJTSSAodG1wX3NoaWZ0LCAxKSkpLCAwKTsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gU1JBU0kgKCogRkxEIChpX1JpKSwgdG1wX3NoaWZ0KTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gZWxzZSB7CisgIHsKKyAgICBCSSBvcHZhbCA9IDA7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9Cit9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBhc3JpOiBhc3IgJHU0LCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYXNyaSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xzbGkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF9zaGlmdDsKKyAgdG1wX3NoaWZ0ID0gRkxEIChmX3U0KTsKK2lmIChORVNJICh0bXBfc2hpZnQsIDApKSB7CitkbyB7CisgIHsKKyAgICBCSSBvcHZhbCA9IE5FU0kgKEFORFNJICgqIEZMRCAoaV9SaSksIFNMTFNJICgxLCBTVUJTSSAodG1wX3NoaWZ0LCAxKSkpLCAwKTsKKyAgICBDUFUgKGhfY2JpdCkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gU1JBU0kgKCogRkxEIChpX1JpKSwgdG1wX3NoaWZ0KTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gZWxzZSB7CisgIHsKKyAgICBCSSBvcHZhbCA9IDA7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9Cit9CisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX1JpKSwgMCk7CisgICAgQ1BVIChoX25iaXQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm5iaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSBFUVNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF96Yml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJ6Yml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBhc3IyOiBhc3IyICR1NCwkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGFzcjIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sc2xpLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfc2hpZnQ7CisgIHRtcF9zaGlmdCA9IEFERFNJIChGTEQgKGZfdTQpLCAxNik7CitpZiAoTkVTSSAodG1wX3NoaWZ0LCAwKSkgeworZG8geworICB7CisgICAgQkkgb3B2YWwgPSBORVNJIChBTkRTSSAoKiBGTEQgKGlfUmkpLCBTTExTSSAoMSwgU1VCU0kgKHRtcF9zaGlmdCwgMSkpKSwgMCk7CisgICAgQ1BVIChoX2NiaXQpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2JpdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IFNSQVNJICgqIEZMRCAoaV9SaSksIHRtcF9zaGlmdCk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IGVsc2UgeworICB7CisgICAgQkkgb3B2YWwgPSAwOworICAgIENQVSAoaF9jYml0KSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9SaSksIDApOworICAgIENQVSAoaF9uYml0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJuYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gRVFTSSAoKiBGTEQgKGlfUmkpLCAwKTsKKyAgICBDUFUgKGhfemJpdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiemJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRpODogbGRpOjggJGk4LCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsbGRpOCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaTguZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEZMRCAoZl9pOCk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZGkyMDogbGRpOjIwICRpMjAsJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixsZGkyMCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaTIwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBGTEQgKGZfaTIwKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkaTMyOiBsZGk6MzIgJGkzMiwkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGxkaTMyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpMzIuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDYpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEZMRCAoZl9pMzIpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGQ6IGxkIEAkUmosJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixsZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaikpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGR1aDogbGR1aCBAJFJqLCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsbGR1aCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdWguZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaikpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGR1YjogbGR1YiBAJFJqLCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsbGR1YikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdWIuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVRSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaikpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRyMTM6IGxkIEAoJFIxMywkUmopLCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsbGRyMTMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHIxMy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX1JqKSwgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkpKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkcjEzdWg6IGxkdWggQCgkUjEzLCRSaiksJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixsZHIxM3VoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRyMTN1aC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9SaiksIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pKSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZHIxM3ViOiBsZHViIEAoJFIxMywkUmopLCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsbGRyMTN1YikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcjEzdWIuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVRSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfUmopLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSkpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRyMTQ6IGxkIEAoJFIxNCwkZGlzcDEwKSwkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGxkcjE0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRyMTQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfZGlzcDEwKSwgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkpKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkcjE0dWg6IGxkdWggQCgkUjE0LCRkaXNwOSksJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixsZHIxNHVoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRyMTR1aC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfZGlzcDkpLCBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSkpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRyMTR1YjogbGR1YiBAKCRSMTQsJGRpc3A4KSwkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGxkcjE0dWIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHIxNHViLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1VUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9kaXNwOCksIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pKSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZHIxNTogbGQgQCgkUjE1LCR1ZGlzcDYpLCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsbGRyMTUpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHIxNS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl91ZGlzcDYpLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSkpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRyMTVncjogbGQgQCRSMTUrLCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsbGRyMTVncikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcjE1Z3IuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQoraWYgKE5FU0kgKEZMRCAoZl9SaSksIDE1KSkgeworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA0KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorfSB3aGlsZSAoMCk7CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkcjE1ZHI6IGxkIEAkUjE1KywkUnMyICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixsZHIxNWRyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRyMTVkci5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgU0kgdG1wX3RtcDsKKyAgdG1wX3RtcCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IHRtcF90bXA7CisgICAgU0VUX0hfRFIgKEZMRCAoZl9SczIpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJzMiIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZHIxNXBzOiBsZCBAJFIxNSssJHBzICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixsZHIxNXBzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRyMTVwcy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgICBTRVRfSF9QUyAob3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwcyIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3Q6IHN0ICRSaSxAJFJqICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixzdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9SaSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfUmopLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3RoOiBzdGggJFJpLEAkUmogKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLHN0aCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0aC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfUmkpOworICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX1JqKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0Yjogc3RiICRSaSxAJFJqICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixzdGIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGIuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBRSSBvcHZhbCA9ICogRkxEIChpX1JpKTsKKyAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaiksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdHIxMzogc3QgJFJpLEAoJFIxMywkUmopICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixzdHIxMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjEzLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9SaSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX1JqKSwgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3RyMTNoOiBzdGggJFJpLEAoJFIxMywkUmopICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixzdHIxM2gpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHIxM2guZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBISSBvcHZhbCA9ICogRkxEIChpX1JpKTsKKyAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfUmopLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdHIxM2I6IHN0YiAkUmksQCgkUjEzLCRSaikgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLHN0cjEzYikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjEzYi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFFJIG9wdmFsID0gKiBGTEQgKGlfUmkpOworICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9SaiksIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0cjE0OiBzdCAkUmksQCgkUjE0LCRkaXNwMTApICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixzdHIxNCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjE0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9SaSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9kaXNwMTApLCBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdHIxNGg6IHN0aCAkUmksQCgkUjE0LCRkaXNwOSkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLHN0cjE0aCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjE0aC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfUmkpOworICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfZGlzcDkpLCBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdHIxNGI6IHN0YiAkUmksQCgkUjE0LCRkaXNwOCkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLHN0cjE0YikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjE0Yi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFFJIG9wdmFsID0gKiBGTEQgKGlfUmkpOworICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfZGlzcDgpLCBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdHIxNTogc3QgJFJpLEAoJFIxNSwkdWRpc3A2KSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsc3RyMTUpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHIxNS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfUmkpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgRkxEIChmX3VkaXNwNikpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3RyMTVncjogc3QgJFJpLEAtJFIxNSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsc3RyMTVncikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjE1Z3IuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF90bXA7CisgIHRtcF90bXAgPSAqIEZMRCAoaV9SaSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSB0bXBfdG1wOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdHIxNWRyOiBzdCAkUnMyLEAtJFIxNSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsc3RyMTVkcikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjE1ZHIuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF90bXA7CisgIHRtcF90bXAgPSBHRVRfSF9EUiAoRkxEIChmX1JzMikpOworICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gdG1wX3RtcDsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3RyMTVwczogc3QgJHBzLEAtJFIxNSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsc3RyMTVwcykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cjE1cHMuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRfSF9QUyAoKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbW92OiBtb3YgJFJqLCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsbW92KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW92LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9Saik7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtb3ZkcjogbW92ICRSczEsJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixtb3ZkcikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdmRyLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRfSF9EUiAoRkxEIChmX1JzMSkpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbW92cHM6IG1vdiAkcHMsJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixtb3ZwcykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdnBzLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRfSF9QUyAoKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG1vdjJkcjogbW92ICRSaSwkUnMxICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixtb3YyZHIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tb3YyZHIuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX1JpKTsKKyAgICBTRVRfSF9EUiAoRkxEIChmX1JzMSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUnMxIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtb3YycHM6IG1vdiAkUmksJHBzICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixtb3YycHMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tb3YycHMuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBVU0kgb3B2YWwgPSAqIEZMRCAoaV9SaSk7CisgICAgU0VUX0hfUFMgKG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicHMiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGptcDogam1wIEAkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGptcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfam1wLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFVTSSBvcHZhbCA9ICogRkxEIChpX1JpKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGptcGQ6IGptcDpkIEAkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGptcGQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2ptcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSAqIEZMRCAoaV9SaSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNhbGxyOiBjYWxsIEAkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGNhbGxyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jYWxsci5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChwYywgMik7CisgICAgU0VUX0hfRFIgKCgoVUlOVCkgMSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBVU0kgb3B2YWwgPSAqIEZMRCAoaV9SaSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNhbGxyZDogY2FsbDpkIEAkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGNhbGxyZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY2FsbHIuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDQpOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDEpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgVVNJIG9wdmFsID0gKiBGTEQgKGlfUmkpOworICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9IHdoaWxlICgwKTsKKworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNhbGw6IGNhbGwgJGxhYmVsMTIgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGNhbGwpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NhbGwuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDIpOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDEpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsMTIpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY2FsbGQ6IGNhbGw6ZCAkbGFiZWwxMiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsY2FsbGQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NhbGwuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDQpOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDEpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsMTIpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfSB3aGlsZSAoMCk7CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiByZXQ6IHJldCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYscmV0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9yZXQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgVVNJIG9wdmFsID0gR0VUX0hfRFIgKCgoVUlOVCkgMSkpOworICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogcmV0OmQ6IHJldDpkICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixyZXRfZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfcmV0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEdFVF9IX0RSICgoKFVJTlQpIDEpKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogaW50OiBpbnQgJHU4ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixpbnQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2ludC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7Cis7IC8qY2xvYmJlciovCis7IC8qY2xvYmJlciovCis7IC8qY2xvYmJlciovCisgIHsKKyAgICBTSSBvcHZhbCA9IGZyMzBfaW50IChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl91OCkpOworICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBpbnRlOiBpbnRlICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixpbnRlKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9pbnRlLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKzsgLypjbG9iYmVyKi8KKzsgLypjbG9iYmVyKi8KKzsgLypjbG9iYmVyKi8KKyAgeworICAgIFNJIG9wdmFsID0gZnIzMF9pbnRlIChjdXJyZW50X2NwdSwgcGMpOworICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiByZXRpOiByZXRpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixyZXRpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9yZXRpLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2lmIChFUUJJIChHRVRfSF9TQklUICgpLCAwKSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBHRVRfSF9EUiAoKChVSU5UKSAyKSkpOworICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDcpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChHRVRfSF9EUiAoKChVSU5UKSAyKSksIDQpOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDIpLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItMiIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEdFVF9IX0RSICgoKFVJTlQpIDIpKSk7CisgICAgU0VUX0hfUFMgKG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDgpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwcyIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChHRVRfSF9EUiAoKChVSU5UKSAyKSksIDQpOworICAgIFNFVF9IX0RSICgoKFVJTlQpIDIpLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHItMiIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30gZWxzZSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEdFVF9IX0RSICgoKFVJTlQpIDMpKSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKEdFVF9IX0RSICgoKFVJTlQpIDMpKSwgNCk7CisgICAgU0VUX0hfRFIgKCgoVUlOVCkgMyksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDYpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci0zIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgR0VUX0hfRFIgKCgoVUlOVCkgMykpKTsKKyAgICBTRVRfSF9QUyAob3B2YWwpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgOCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBzIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKEdFVF9IX0RSICgoKFVJTlQpIDMpKSwgNCk7CisgICAgU0VUX0hfRFIgKCgoVUlOVCkgMyksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDYpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkci0zIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJyYWQ6IGJyYTpkICRsYWJlbDkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGJyYWQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JyYWQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBicmE6IGJyYSAkbGFiZWw5ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixicmEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JyYWQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYm5vZDogYm5vOmQgJGxhYmVsOSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYm5vZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Jub2QuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CitkbyB7IH0gd2hpbGUgKDApOyAvKm5vcCovCit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBibm86IGJubyAkbGFiZWw5ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixibm8pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ibm9kLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geyB9IHdoaWxlICgwKTsgLypub3AqLworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJlcWQ6IGJlcTpkICRsYWJlbDkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGJlcWQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcWQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworaWYgKENQVSAoaF96Yml0KSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBiZXE6IGJlcSAkbGFiZWw5ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixiZXEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcWQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworaWYgKENQVSAoaF96Yml0KSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYm5lZDogYm5lOmQgJGxhYmVsOSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYm5lZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmVxZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CitpZiAoTk9UQkkgKENQVSAoaF96Yml0KSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorfSB3aGlsZSAoMCk7CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYm5lOiBibmUgJGxhYmVsOSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYm5lKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iZXFkLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2lmIChOT1RCSSAoQ1BVIChoX3piaXQpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYmNkOiBiYzpkICRsYWJlbDkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGJjZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmNkLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKK2lmIChDUFUgKGhfY2JpdCkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorfSB3aGlsZSAoMCk7CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYmM6IGJjICRsYWJlbDkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGJjKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iY2QuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworaWYgKENQVSAoaF9jYml0KSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYm5jZDogYm5jOmQgJGxhYmVsOSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYm5jZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmNkLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKK2lmIChOT1RCSSAoQ1BVIChoX2NiaXQpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBibmM6IGJuYyAkbGFiZWw5ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixibmMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JjZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitpZiAoTk9UQkkgKENQVSAoaF9jYml0KSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJuZDogYm46ZCAkbGFiZWw5ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixibmQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JuZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CitpZiAoQ1BVIChoX25iaXQpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJuOiBibiAkbGFiZWw5ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixibikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5kLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2lmIChDUFUgKGhfbmJpdCkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJwZDogYnA6ZCAkbGFiZWw5ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixicGQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JuZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CitpZiAoTk9UQkkgKENQVSAoaF9uYml0KSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorfSB3aGlsZSAoMCk7CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYnA6IGJwICRsYWJlbDkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGJwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibmQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworaWYgKE5PVEJJIChDUFUgKGhfbmJpdCkpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBidmQ6IGJ2OmQgJGxhYmVsOSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYnZkKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9idmQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworaWYgKENQVSAoaF92Yml0KSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBidjogYnYgJGxhYmVsOSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYnYpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2J2ZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitpZiAoQ1BVIChoX3ZiaXQpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBibnZkOiBibnY6ZCAkbGFiZWw5ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixibnZkKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9idmQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworaWYgKE5PVEJJIChDUFUgKGhfdmJpdCkpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJudjogYm52ICRsYWJlbDkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGJudikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYnZkLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2lmIChOT1RCSSAoQ1BVIChoX3ZiaXQpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYmx0ZDogYmx0OmQgJGxhYmVsOSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYmx0ZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmx0ZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CitpZiAoWE9SQkkgKENQVSAoaF92Yml0KSwgQ1BVIChoX25iaXQpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBibHQ6IGJsdCAkbGFiZWw5ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixibHQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JsdGQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworaWYgKFhPUkJJIChDUFUgKGhfdmJpdCksIENQVSAoaF9uYml0KSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJnZWQ6IGJnZTpkICRsYWJlbDkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGJnZWQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JsdGQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworaWYgKE5PVEJJIChYT1JCSSAoQ1BVIChoX3ZiaXQpLCBDUFUgKGhfbmJpdCkpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBiZ2U6IGJnZSAkbGFiZWw5ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixiZ2UpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JsdGQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworaWYgKE5PVEJJIChYT1JCSSAoQ1BVIChoX3ZiaXQpLCBDUFUgKGhfbmJpdCkpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYmxlZDogYmxlOmQgJGxhYmVsOSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYmxlZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmxlZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CitpZiAoT1JCSSAoWE9SQkkgKENQVSAoaF92Yml0KSwgQ1BVIChoX25iaXQpKSwgQ1BVIChoX3piaXQpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDQpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBibGU6IGJsZSAkbGFiZWw5ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixibGUpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JsZWQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworaWYgKE9SQkkgKFhPUkJJIChDUFUgKGhfdmJpdCksIENQVSAoaF9uYml0KSksIENQVSAoaF96Yml0KSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9sYWJlbDkpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA0KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJndGQ6IGJndDpkICRsYWJlbDkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGJndGQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JsZWQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworaWYgKE5PVEJJIChPUkJJIChYT1JCSSAoQ1BVIChoX3ZiaXQpLCBDUFUgKGhfbmJpdCkpLCBDUFUgKGhfemJpdCkpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDQpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBiZ3Q6IGJndCAkbGFiZWw5ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixiZ3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JsZWQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworaWYgKE5PVEJJIChPUkJJIChYT1JCSSAoQ1BVIChoX3ZiaXQpLCBDUFUgKGhfbmJpdCkpLCBDUFUgKGhfemJpdCkpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDQpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYmxzZDogYmxzOmQgJGxhYmVsOSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsYmxzZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmxzZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CitpZiAoT1JCSSAoQ1BVIChoX2NiaXQpLCBDUFUgKGhfemJpdCkpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJsczogYmxzICRsYWJlbDkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGJscykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmxzZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitpZiAoT1JCSSAoQ1BVIChoX2NiaXQpLCBDUFUgKGhfemJpdCkpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBiaGlkOiBiaGk6ZCAkbGFiZWw5ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixiaGlkKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibHNkLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKK2lmIChOT1RCSSAoT1JCSSAoQ1BVIChoX2NiaXQpLCBDUFUgKGhfemJpdCkpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2xhYmVsOSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBiaGk6IGJoaSAkbGFiZWw5ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixiaGkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2Jsc2QuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworaWYgKE5PVEJJIChPUkJJIChDUFUgKGhfY2JpdCksIENQVSAoaF96Yml0KSkpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfbGFiZWw5KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBkbW92cjEzOiBkbW92ICRSMTMsQCRkaXIxMCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsZG1vdnIxMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3ZyMTMuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDEzKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9kaXIxMCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBkbW92cjEzaDogZG1vdmggJFIxMyxAJGRpcjkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGRtb3ZyMTNoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZG1vdnIxM2guZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBISSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDEzKV0pOworICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9kaXI5KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGRtb3ZyMTNiOiBkbW92YiAkUjEzLEAkZGlyOCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsZG1vdnIxM2IpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92cjEzYi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFFJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMTMpXSk7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjgpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogZG1vdnIxM3BpOiBkbW92IEAkUjEzKyxAJGRpcjEwICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixkbW92cjEzcGkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92cjEzcGkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyMTApLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTMiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogZG1vdnIxM3BpaDogZG1vdmggQCRSMTMrLEAkZGlyOSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsZG1vdnIxM3BpaCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3ZyMTNwaWguZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBISSBvcHZhbCA9IEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pKTsKKyAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyOSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDEzKV0pLCAyKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBkbW92cjEzcGliOiBkbW92YiBAJFIxMyssQCRkaXI4ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixkbW92cjEzcGliKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZG1vdnIxM3BpYi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIFFJIG9wdmFsID0gR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkpOworICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9kaXI4KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTMpXSksIDEpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEzIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGRtb3ZyMTVwaTogZG1vdiBAJFIxNSssQCRkaXIxMCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsZG1vdnIxNXBpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZG1vdnIxNXBpLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjEwKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGRtb3YycjEzOiBkbW92IEAkZGlyMTAsJFIxMyAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsZG1vdjJyMTMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92MnIxMy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjEwKSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTMiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGRtb3YycjEzaDogZG1vdmggQCRkaXI5LCRSMTMgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGRtb3YycjEzaCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3YycjEzaC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjkpKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMyIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogZG1vdjJyMTNiOiBkbW92YiBAJGRpcjgsJFIxMyAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsZG1vdjJyMTNiKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZG1vdjJyMTNiLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyOCkpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEzIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBkbW92MnIxM3BpOiBkbW92IEAkZGlyMTAsQCRSMTMrICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixkbW92MnIxM3BpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZG1vdjJyMTNwaS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjEwKSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDEzKV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBkbW92MnIxM3BpaDogZG1vdmggQCRkaXI5LEAkUjEzKyAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsZG1vdjJyMTNwaWgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kbW92MnIxM3BpaC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIEhJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX2RpcjkpKTsKKyAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTMpXSksIDIpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEzIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGRtb3YycjEzcGliOiBkbW92YiBAJGRpcjgsQCRSMTMrICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixkbW92MnIxM3BpYikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3YycjEzcGliLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgUUkgb3B2YWwgPSBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyOCkpOworICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSwgMSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTMiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogZG1vdjJyMTVwZDogZG1vdiBAJGRpcjEwLEAtJFIxNSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsZG1vdjJyMTVwZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rtb3YycjE1cGQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfZGlyMTApKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRyZXM6IGxkcmVzIEAkUmkrLCR1NCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsbGRyZXMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHJlcy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX1JpKSwgNCk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdHJlczogc3RyZXMgJHU0LEAkUmkrICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixzdHJlcykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcmVzLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfUmkpLCA0KTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNvcG9wOiBjb3BvcCAkdTRjLCRjY2MsJENSaiwkQ1JpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixjb3BvcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NvcG9wLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geyB9IHdoaWxlICgwKTsgLypub3AqLworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNvcGxkOiBjb3BsZCAkdTRjLCRjY2MsJFJqYywkQ1JpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixjb3BsZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NvcGxkLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geyB9IHdoaWxlICgwKTsgLypub3AqLworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNvcHN0OiBjb3BzdCAkdTRjLCRjY2MsJENSaiwkUmljICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixjb3BzdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NvcHN0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geyB9IHdoaWxlICgwKTsgLypub3AqLworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNvcHN2OiBjb3BzdiAkdTRjLCRjY2MsJENSaiwkUmljICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixjb3BzdikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NvcHN0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geyB9IHdoaWxlICgwKTsgLypub3AqLworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG5vcDogbm9wICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixub3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7IH0gd2hpbGUgKDApOyAvKm5vcCovCisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYW5kY2NyOiBhbmRjY3IgJHU4ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixhbmRjY3IpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmRjY3IuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBVUUkgb3B2YWwgPSBBTkRRSSAoR0VUX0hfQ0NSICgpLCBGTEQgKGZfdTgpKTsKKyAgICBTRVRfSF9DQ1IgKG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2NyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBvcmNjcjogb3JjY3IgJHU4ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixvcmNjcikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FuZGNjci5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFVRSSBvcHZhbCA9IE9SUUkgKEdFVF9IX0NDUiAoKSwgRkxEIChmX3U4KSk7CisgICAgU0VUX0hfQ0NSIChvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjciIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3RpbG06IHN0aWxtICR1OCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYsc3RpbG0pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGlsbS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFVRSSBvcHZhbCA9IEFORFNJIChGTEQgKGZfdTgpLCAzMSk7CisgICAgU0VUX0hfSUxNIChvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImlsbSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYWRkc3A6IGFkZHNwICRzMTAgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGFkZHNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkc3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgRkxEIChmX3MxMCkpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBleHRzYjogZXh0c2IgJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixleHRzYikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2V4dHNiLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBFWFRRSVNJIChBTkRRSSAoKiBGTEQgKGlfUmkpLCAyNTUpKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGV4dHViOiBleHR1YiAkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGV4dHViKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZXh0dWIuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFpFWFRRSVNJIChBTkRRSSAoKiBGTEQgKGlfUmkpLCAyNTUpKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGV4dHNoOiBleHRzaCAkUmkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGV4dHNoKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZXh0c2guZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEVYVEhJU0kgKEFOREhJICgqIEZMRCAoaV9SaSksIDY1NTM1KSk7CisgICAgKiBGTEQgKGlfUmkpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIlJpIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBleHR1aDogZXh0dWggJFJpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixleHR1aCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2V4dHVoLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBaRVhUSElTSSAoQU5ESEkgKCogRkxEIChpX1JpKSwgNjU1MzUpKTsKKyAgICAqIEZMRCAoaV9SaSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiUmkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkbTA6IGxkbTAgKCRyZWdsaXN0X2xvd19sZCkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLGxkbTApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG0wLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfbGQpLCAxKSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMCldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTAiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19sZCksIDIpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxKV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA0KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDUpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X2xkKSwgNCkpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDIpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDYpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQoraWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfbGQpLCA4KSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMyldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTMiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19sZCksIDE2KSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgNCldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgOCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19sZCksIDMyKSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgOSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19sZCksIDY0KSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgNildKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci02IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQoraWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfbGQpLCAxMjgpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSA3KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAxMSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTciLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRtMTogbGRtMSAoJHJlZ2xpc3RfaGlfbGQpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixsZG0xKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRtMS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfbGQpLCAxKSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgOCldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgOSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTgiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA4KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2hpX2xkKSwgMikpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDkpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItOSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDgpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfbGQpLCA0KSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTApXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDgpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfbGQpLCA4KSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTEpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDQpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDgpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfbGQpLCAxNikpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDEyKV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA1KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTIiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA4KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2hpX2xkKSwgMzIpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEzIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgOCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQoraWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9sZCksIDY0KSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDcpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDgpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfbGQpLCAxMjgpKSB7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgOCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdG0wOiBzdG0wICgkcmVnbGlzdF9sb3dfc3QpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixzdG0wKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RtMC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X3N0KSwgMSkpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDcpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDExKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQoraWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfc3QpLCAyKSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgNildKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTEpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2xvd19zdCksIDQpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSA1KV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAxMSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfbG93X3N0KSwgOCkpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDQpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDExKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQoraWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfc3QpLCAxNikpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDMpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDExKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQoraWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfc3QpLCAzMikpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDIpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDExKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQoraWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfc3QpLCA2NCkpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDEpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDExKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQoraWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9sb3dfc3QpLCAxMjgpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAwKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAxMSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdG0xOiBzdG0xICgkcmVnbGlzdF9oaV9zdCkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoZnIzMGJmLHN0bTEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG0xLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworaWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9zdCksIDEpKSB7CitkbyB7CisgIFNJIHRtcF9zYXZlX3IxNTsKKyAgdG1wX3NhdmVfcjE1ID0gQ1BVIChoX2dyWygoVUlOVCkgMTUpXSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDkpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IHRtcF9zYXZlX3IxNTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2hpX3N0KSwgMikpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgOSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMTQpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQoraWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9zdCksIDQpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDkpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDEzKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfc3QpLCA4KSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA5KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAxMildKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgb3B2YWwpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMTApOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7Cit9CitpZiAoQU5EU0kgKEZMRCAoZl9yZWdsaXN0X2hpX3N0KSwgMTYpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDkpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDExKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfc3QpLCAzMikpIHsKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgOSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMTApXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQoraWYgKEFORFNJIChGTEQgKGZfcmVnbGlzdF9oaV9zdCksIDY0KSkgeworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA5KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSA5KV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAxMCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKK30KK2lmIChBTkRTSSAoRkxEIChmX3JlZ2xpc3RfaGlfc3QpLCAxMjgpKSB7CitkbyB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSwgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDkpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDgpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSksIG9wdmFsKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDEwKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworfQorfSB3aGlsZSAoMCk7CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGVudGVyOiBlbnRlciAkdTEwICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixlbnRlcikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VudGVyLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBTSSB0bXBfdG1wOworICB0bXBfdG1wID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KTsKKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMTQpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RtcCwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSB0bXBfdG1wOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCBGTEQgKGZfdTEwKSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTUiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGVhdmU6IGxlYXZlICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGZyMzBiZixsZWF2ZSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xlYXZlLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMTQpXSksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE1IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgU1VCU0kgKENQVSAoaF9nclsoKFVJTlQpIDE1KV0pLCA0KSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMTQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogeGNoYjogeGNoYiBAJFJqLCRSaSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChmcjMwYmYseGNoYikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3hjaGIuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF90bXA7CisgIHRtcF90bXAgPSAqIEZMRCAoaV9SaSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVRSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaikpOworICAgICogRkxEIChpX1JpKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJSaSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBVUUkgb3B2YWwgPSB0bXBfdG1wOworICAgIFNFVE1FTVVRSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9SaiksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKZGlmZiAtLWdpdCBhL3NpbS9mcjMwL3NpbS1pZi5jIGIvc2ltL2ZyMzAvc2ltLWlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRmMGY4MwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9mcjMwL3NpbS1pZi5jCkBAIC0wLDAgKzEsMjA4IEBACisvKiBNYWluIHNpbXVsYXRvciBlbnRyeSBwb2ludHMgc3BlY2lmaWMgdG8gdGhlIEZSMzAuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIHNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2luY2x1ZGUgInNpbS1vcHRpb25zLmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAiYmZkLmgiCisKK3N0YXRpYyB2b2lkIGZyZWVfc3RhdGUgKFNJTV9ERVNDKTsKK3N0YXRpYyB2b2lkIHByaW50X2ZyMzBfbWlzY19jcHUgKFNJTV9DUFUgKmNwdSwgaW50IHZlcmJvc2UpOworCisvKiBSZWNvcmRzIHNpbXVsYXRvciBkZXNjcmlwdG9yIHNvIHV0aWxpdGllcyBsaWtlIGZyMzBfZHVtcF9yZWdzIGNhbiBiZQorICAgY2FsbGVkIGZyb20gZ2RiLiAgKi8KK1NJTV9ERVNDIGN1cnJlbnRfc3RhdGU7CisMCisvKiBDb3ZlciBmdW5jdGlvbiBvZiBzaW1fc3RhdGVfZnJlZSB0byBmcmVlIHRoZSBjcHUgYnVmZmVycyBhcyB3ZWxsLiAgKi8KKworc3RhdGljIHZvaWQKK2ZyZWVfc3RhdGUgKFNJTV9ERVNDIHNkKQoreworICBpZiAoU1RBVEVfTU9EVUxFUyAoc2QpICE9IE5VTEwpCisgICAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKKyAgc2ltX2NwdV9mcmVlX2FsbCAoc2QpOworICBzaW1fc3RhdGVfZnJlZSAoc2QpOworfQorCisvKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHNpbXVsYXRvci4gICovCisKK1NJTV9ERVNDCitzaW1fb3BlbiAoa2luZCwgY2FsbGJhY2ssIGFiZmQsIGFyZ3YpCisgICAgIFNJTV9PUEVOX0tJTkQga2luZDsKKyAgICAgaG9zdF9jYWxsYmFjayAqY2FsbGJhY2s7CisgICAgIHN0cnVjdCBfYmZkICphYmZkOworICAgICBjaGFyICoqYXJndjsKK3sKKyAgY2hhciBjOworICBpbnQgaTsKKyAgU0lNX0RFU0Mgc2QgPSBzaW1fc3RhdGVfYWxsb2MgKGtpbmQsIGNhbGxiYWNrKTsKKworICAvKiBUaGUgY3B1IGRhdGEgaXMga2VwdCBpbiBhIHNlcGFyYXRlbHkgYWxsb2NhdGVkIGNodW5rIG9mIG1lbW9yeS4gICovCisgIGlmIChzaW1fY3B1X2FsbG9jX2FsbCAoc2QsIDEsIGNnZW5fY3B1X21heF9leHRyYV9ieXRlcyAoKSkgIT0gU0lNX1JDX09LKQorICAgIHsKKyAgICAgIGZyZWVfc3RhdGUgKHNkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworI2lmIDAgLyogRklYTUU6IHBjIGlzIGluIG1hY2gtc3BlY2lmaWMgc3RydWN0ICovCisgIC8qIEZJWE1FOiB3YXRjaHBvaW50cyBjb2RlIHNob3VsZG4ndCBuZWVkIHRoaXMgKi8KKyAgeworICAgIFNJTV9DUFUgKmN1cnJlbnRfY3B1ID0gU1RBVEVfQ1BVIChzZCwgMCk7CisgICAgU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKS0+cGMgPSAmKFBDKTsKKyAgICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5zaXplb2ZfcGMgPSBzaXplb2YgKFBDKTsKKyAgfQorI2VuZGlmCisKKyAgaWYgKHNpbV9wcmVfYXJndl9pbml0IChzZCwgYXJndlswXSkgIT0gU0lNX1JDX09LKQorICAgIHsKKyAgICAgIGZyZWVfc3RhdGUgKHNkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworI2lmIDAgLyogRklYTUU6ICd0d291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBkbyB0aGlzICovCisgIC8qIFRoZXNlIG9wdGlvbnMgb3ZlcnJpZGUgYW55IG1vZHVsZSBvcHRpb25zLgorICAgICBPYnZpb3VzbHkgYW1iaWd1aXR5IHNob3VsZCBiZSBhdm9pZGVkLCBob3dldmVyIHRoZSBjYWxsZXIgbWF5IHdpc2ggdG8KKyAgICAgYXVnbWVudCB0aGUgbWVhbmluZyBvZiBhbiBvcHRpb24uICAqLworICBpZiAoZXh0cmFfb3B0aW9ucyAhPSBOVUxMKQorICAgIHNpbV9hZGRfb3B0aW9uX3RhYmxlIChzZCwgZXh0cmFfb3B0aW9ucyk7CisjZW5kaWYKKworICAvKiBnZXRvcHQgd2lsbCBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSBzbyB3ZSBqdXN0IGhhdmUgdG8gZXhpdCBpZiB0aGlzIGZhaWxzLgorICAgICBGSVhNRTogSG1tbS4uLiAgaW4gdGhlIGNhc2Ugb2YgZ2RiIHdlIG5lZWQgZ2V0b3B0IHRvIGNhbGwKKyAgICAgcHJpbnRfZmlsdGVyZWQuICAqLworICBpZiAoc2ltX3BhcnNlX2FyZ3MgKHNkLCBhcmd2KSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgZnJlZV9zdGF0ZSAoc2QpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisjaWYgMAorICAvKiBBbGxvY2F0ZSBhIGhhbmRsZXIgZm9yIHRoZSBjb250cm9sIHJlZ2lzdGVycyBhbmQgb3RoZXIgZGV2aWNlcworICAgICBpZiBubyBtZW1vcnkgZm9yIHRoYXQgcmFuZ2UgaGFzIGJlZW4gYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLgorICAgICBBbGwgYXJlIGFsbG9jYXRlZCBpbiBvbmUgY2h1bmsgdG8ga2VlcCB0aGluZ3MgZnJvbSBiZWluZworICAgICB1bm5lY2Vzc2FyaWx5IGNvbXBsaWNhdGVkLiAgKi8KKyAgaWYgKHNpbV9jb3JlX3JlYWRfYnVmZmVyIChzZCwgTlVMTCwgcmVhZF9tYXAsICZjLCBGUjMwX0RFVklDRV9BRERSLCAxKSA9PSAwKQorICAgIHNpbV9jb3JlX2F0dGFjaCAoc2QsIE5VTEwsCisJCSAgICAgMCAvKmxldmVsKi8sCisJCSAgICAgYWNjZXNzX3JlYWRfd3JpdGUsCisJCSAgICAgMCAvKnNwYWNlID8/PyovLAorCQkgICAgIEZSMzBfREVWSUNFX0FERFIsIEZSMzBfREVWSUNFX0xFTiAvKm5yX2J5dGVzKi8sCisJCSAgICAgMCAvKm1vZHVsbyovLAorCQkgICAgICZmcjMwX2RldmljZXMsCisJCSAgICAgTlVMTCAvKmJ1ZmZlciovKTsKKyNlbmRpZgorCisgIC8qIEFsbG9jYXRlIGNvcmUgbWFuYWdlZCBtZW1vcnkgaWYgbm9uZSBzcGVjaWZpZWQgYnkgdXNlci4KKyAgICAgVXNlIGFkZHJlc3MgNCBoZXJlIGluIGNhc2UgdGhlIHVzZXIgd2FudGVkIGFkZHJlc3MgMCB1bm1hcHBlZC4gICovCisgIGlmIChzaW1fY29yZV9yZWFkX2J1ZmZlciAoc2QsIE5VTEwsIHJlYWRfbWFwLCAmYywgNCwgMSkgPT0gMCkKKyAgICBzaW1fZG9fY29tbWFuZGYgKHNkLCAibWVtb3J5IHJlZ2lvbiAwLDB4JWx4IiwgRlIzMF9ERUZBVUxUX01FTV9TSVpFKTsKKworICAvKiBjaGVjayBmb3IvZXN0YWJsaXNoIHRoZSByZWZlcmVuY2UgcHJvZ3JhbSBpbWFnZSAqLworICBpZiAoc2ltX2FuYWx5emVfcHJvZ3JhbSAoc2QsCisJCQkgICAoU1RBVEVfUFJPR19BUkdWIChzZCkgIT0gTlVMTAorCQkJICAgID8gKlNUQVRFX1BST0dfQVJHViAoc2QpCisJCQkgICAgOiBOVUxMKSwKKwkJCSAgIGFiZmQpICE9IFNJTV9SQ19PSykKKyAgICB7CisgICAgICBmcmVlX3N0YXRlIChzZCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogRXN0YWJsaXNoIGFueSByZW1haW5pbmcgY29uZmlndXJhdGlvbiBvcHRpb25zLiAgKi8KKyAgaWYgKHNpbV9jb25maWcgKHNkKSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgZnJlZV9zdGF0ZSAoc2QpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChzaW1fcG9zdF9hcmd2X2luaXQgKHNkKSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgZnJlZV9zdGF0ZSAoc2QpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIE9wZW4gYSBjb3B5IG9mIHRoZSBjcHUgZGVzY3JpcHRvciB0YWJsZS4gICovCisgIHsKKyAgICBDR0VOX0NQVV9ERVNDIGNkID0gZnIzMF9jZ2VuX2NwdV9vcGVuIChTVEFURV9BUkNISVRFQ1RVUkUgKHNkKS0+bWFjaCwKKwkJCQkJICAgQ0dFTl9FTkRJQU5fQklHKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1BST0NFU1NPUlM7ICsraSkKKyAgICAgIHsKKwlTSU1fQ1BVICpjcHUgPSBTVEFURV9DUFUgKHNkLCBpKTsKKwlDUFVfQ1BVX0RFU0MgKGNwdSkgPSBjZDsKKwlDUFVfRElTQVNTRU1CTEVSIChjcHUpID0gc2ltX2NnZW5fZGlzYXNzZW1ibGVfaW5zbjsKKyAgICAgIH0KKyAgICBmcjMwX2NnZW5faW5pdF9kaXMgKGNkKTsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgdmFyaW91cyBjZ2VuIHRoaW5ncyBub3QgZG9uZSBieSBjb21tb24gZnJhbWV3b3JrLgorICAgICBNdXN0IGJlIGRvbmUgYWZ0ZXIgZnIzMF9jZ2VuX2NwdV9vcGVuLiAgKi8KKyAgY2dlbl9pbml0IChzZCk7CisKKyAgLyogU3RvcmUgaW4gYSBnbG9iYWwgc28gdGhpbmdzIGxpa2Ugc3BhcmMzMl9kdW1wX3JlZ3MgY2FuIGJlIGludm9rZWQKKyAgICAgZnJvbSB0aGUgZ2RiIGNvbW1hbmQgbGluZS4gICovCisgIGN1cnJlbnRfc3RhdGUgPSBzZDsKKworICByZXR1cm4gc2Q7Cit9CisKK3ZvaWQKK3NpbV9jbG9zZSAoc2QsIHF1aXR0aW5nKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgaW50IHF1aXR0aW5nOworeworICBmcjMwX2NnZW5fY3B1X2Nsb3NlIChDUFVfQ1BVX0RFU0MgKFNUQVRFX0NQVSAoc2QsIDApKSk7CisgIHNpbV9tb2R1bGVfdW5pbnN0YWxsIChzZCk7Cit9CisMCitTSU1fUkMKK3NpbV9jcmVhdGVfaW5mZXJpb3IgKHNkLCBhYmZkLCBhcmd2LCBlbnZwKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgc3RydWN0IF9iZmQgKmFiZmQ7CisgICAgIGNoYXIgKiphcmd2OworICAgICBjaGFyICoqZW52cDsKK3sKKyAgU0lNX0NQVSAqY3VycmVudF9jcHUgPSBTVEFURV9DUFUgKHNkLCAwKTsKKyAgU0lNX0FERFIgYWRkcjsKKworICBpZiAoYWJmZCAhPSBOVUxMKQorICAgIGFkZHIgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOworICBlbHNlCisgICAgYWRkciA9IDA7CisgIHNpbV9wY19zZXQgKGN1cnJlbnRfY3B1LCBhZGRyKTsKKworI2lmIDAKKyAgU1RBVEVfQVJHViAoc2QpID0gc2ltX2NvcHlfYXJndiAoYXJndik7CisgIFNUQVRFX0VOVlAgKHNkKSA9IHNpbV9jb3B5X2FyZ3YgKGVudnApOworI2VuZGlmCisKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKwordm9pZAorc2ltX2RvX2NvbW1hbmQgKHNkLCBjbWQpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBjaGFyICpjbWQ7Cit7IAorICBpZiAoc2ltX2FyZ3NfY29tbWFuZCAoc2QsIGNtZCkgIT0gU0lNX1JDX09LKQorICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIlVua25vd24gY29tbWFuZCBgJXMnXG4iLCBjbWQpOworfQpkaWZmIC0tZ2l0IGEvc2ltL2ZyMzAvc2ltLW1haW4uaCBiL3NpbS9mcjMwL3NpbS1tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNiZjA4NQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9mcjMwL3NpbS1tYWluLmgKQEAgLTAsMCArMSw3MCBAQAorLyogTWFpbiBoZWFkZXIgZm9yIHRoZSBmcjMwLiAgKi8KKworI2RlZmluZSBVU0lOR19TSU1fQkFTRV9IIC8qIEZJWE1FOiBxdWljayBoYWNrICovCisKK3N0cnVjdCBfc2ltX2NwdTsgLyogRklYTUU6IHNob3VsZCBiZSBpbiBzaW0tYmFzaWNzLmggKi8KK3R5cGVkZWYgc3RydWN0IF9zaW1fY3B1IFNJTV9DUFU7CisKKy8qIHNpbS1iYXNpY3MuaCBpbmNsdWRlcyBjb25maWcuaCBidXQgY2dlbi10eXBlcy5oIG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlCisgICBzaW0tYmFzaWNzLmggYW5kIGNnZW4tdHlwZXMuaCBuZWVkcyBjb25maWcuaC4gICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJzeW1jYXQuaCIKKyNpbmNsdWRlICJzaW0tYmFzaWNzLmgiCisjaW5jbHVkZSAiY2dlbi10eXBlcy5oIgorI2luY2x1ZGUgImZyMzAtZGVzYy5oIgorI2luY2x1ZGUgImZyMzAtb3BjLmgiCisjaW5jbHVkZSAiYXJjaC5oIgorCisvKiBUaGVzZSBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIHNpbS1iYXNlLmguICAqLwordHlwZWRlZiBVU0kgc2ltX2NpYTsKKworI2RlZmluZSBDSUFfR0VUKGNwdSkgICAgIENQVV9QQ19HRVQgKGNwdSkKKyNkZWZpbmUgQ0lBX1NFVChjcHUsdmFsKSBDUFVfUENfU0VUICgoY3B1KSwgKHZhbCkpCisKKyNpbmNsdWRlICJzaW0tYmFzZS5oIgorI2luY2x1ZGUgImNnZW4tc2ltLmgiCisjaW5jbHVkZSAiZnIzMC1zaW0uaCIKKwwKKy8qIFRoZSBfc2ltX2NwdSBzdHJ1Y3QuICAqLworCitzdHJ1Y3QgX3NpbV9jcHUgeworICAvKiBzaW0vY29tbW9uIGNwdSBiYXNlLiAgKi8KKyAgc2ltX2NwdV9iYXNlIGJhc2U7CisKKyAgLyogU3RhdGljIHBhcnRzIG9mIGNnZW4uICAqLworICBDR0VOX0NQVSBjZ2VuX2NwdTsKKworICAvKiBDUFUgc3BlY2lmaWMgcGFydHMgZ28gaGVyZS4KKyAgICAgTm90ZSB0aGF0IGluIGZpbGVzIHRoYXQgZG9uJ3QgbmVlZCB0byBhY2Nlc3MgdGhlc2UgcGllY2VzIFdBTlRfQ1BVX0ZPTworICAgICB3b24ndCBiZSBkZWZpbmVkIGFuZCB0aHVzIHRoZXNlIHBhcnRzIHdvbid0IGFwcGVhci4gIFRoaXMgaXMgb2sgaW4gdGhlCisgICAgIHNlbnNlIHRoYXQgdGhpbmdzIHdvcmsuICBJdCBpcyBhIHNvdXJjZSBvZiBidWdzIHRob3VnaC4KKyAgICAgT25lIGhhcyB0byBvZiBjb3Vyc2UgYmUgY2FyZWZ1bCB0byBub3QgdGFrZSB0aGUgc2l6ZSBvZiB0aGlzCisgICAgIHN0cnVjdCBhbmQgbm8gc3RydWN0dXJlIG1lbWJlcnMgYWNjZXNzZWQgaW4gbm9uLWNwdSBzcGVjaWZpYyBmaWxlcyBjYW4KKyAgICAgZ28gYWZ0ZXIgaGVyZS4gIE9oIGZvciBhIGJldHRlciBsYW5ndWFnZS4gICovCisjaWYgZGVmaW5lZCAoV0FOVF9DUFVfRlIzMEJGKQorICBGUjMwQkZfQ1BVX0RBVEEgY3B1X2RhdGE7CisjZW5kaWYKK307CisMCisvKiBUaGUgc2ltX3N0YXRlIHN0cnVjdC4gICovCisKK3N0cnVjdCBzaW1fc3RhdGUgeworICBzaW1fY3B1ICpjcHU7CisjZGVmaW5lIFNUQVRFX0NQVShzZCwgbikgKC8qJiovIChzZCktPmNwdSkKKworICBDR0VOX1NUQVRFIGNnZW5fc3RhdGU7CisKKyAgc2ltX3N0YXRlX2Jhc2UgYmFzZTsKK307CisMCisvKiBNaXNjLiAgKi8KKworLyogQ2F0Y2ggYWRkcmVzcyBleGNlcHRpb25zLiAgKi8KK2V4dGVybiBTSU1fQ09SRV9TSUdOQUxfRk4gZnIzMF9jb3JlX3NpZ25hbDsKKyNkZWZpbmUgU0lNX0NPUkVfU0lHTkFMKFNELENQVSxDSUEsTUFQLE5SX0JZVEVTLEFERFIsVFJBTlNGRVIsRVJST1IpIFwKK2ZyMzBfY29yZV9zaWduYWwgKChTRCksIChDUFUpLCAoQ0lBKSwgKE1BUCksIChOUl9CWVRFUyksIChBRERSKSwgXAorCQkgIChUUkFOU0ZFUiksIChFUlJPUikpCisKKy8qIERlZmF1bHQgbWVtb3J5IHNpemUuICAqLworI2RlZmluZSBGUjMwX0RFRkFVTFRfTUVNX1NJWkUgMHg4MDAwMDAgLyogOE0gKi8KZGlmZiAtLWdpdCBhL3NpbS9mcjMwL3Rjb25maWcuaW4gYi9zaW0vZnIzMC90Y29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2N2UyMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vZnIzMC90Y29uZmlnLmluCkBAIC0wLDAgKzEsNDIgQEAKKy8qIEZSMzAgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gZmlsZS4gIC0qLSBDIC0qLSAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIGNhbiB2YXJ5IHRoZSBzaXplIG9mIG1lbW9yeS4KKyAgIFNlZSB0aGUgeHh4IHNpbXVsYXRvciBmb3IgYW4gZXhhbXBsZS4KKyAgIFRoaXMgZW5hYmxlcyB0aGUgYC1tIHNpemUnIG9wdGlvbi4KKyAgIFRoZSBtZW1vcnkgc2l6ZSBpcyBzdG9yZWQgaW4gU1RBVEVfTUVNX1NJWkUuICAqLworLyogTm90IHVzZWQgZm9yIEZSMzAgc2luY2Ugd2UgdXNlIHRoZSBtZW1vcnkgbW9kdWxlLiBUT0RPIC0tIGNoZWNrIHRoaXMgICovCisvKiAjZGVmaW5lIFNJTV9IQVZFX01FTV9TSVpFICovCisKKy8qIFNlZSBzaW0taGxvYWQuYy4gIFdlIHByb3Blcmx5IGhhbmRsZSBMTUEuIC0tIFRPRE86IGNoZWNrIHRoaXMgKi8KKyNkZWZpbmUgU0lNX0hBTkRMRVNfTE1BIDEKKworLyogRm9yIE1TUFIgc3VwcG9ydC4gIEZJWE1FOiByZXZpc2l0LiAgKi8KKyNkZWZpbmUgV0lUSF9ERVZJQ0VTIDEKKworLyogRklYTUU6IFJldmlzaXQuICAqLworI2lmZGVmIEhBVkVfRFZfU09DS1NFUgorTU9EVUxFX0lOU1RBTExfRk4gZHZfc29ja3Nlcl9pbnN0YWxsOworI2RlZmluZSBNT0RVTEVfTElTVCBkdl9zb2Nrc2VyX2luc3RhbGwsCisjZW5kaWYKKworI2lmIDAKKy8qIEVuYWJsZSB3YXRjaHBvaW50cy4gICovCisjZGVmaW5lIFdJVEhfV0FUQ0hQT0lOVFMgMQorI2VuZGlmCisKKy8qID8/PyBUZW1wb3JhcnkgaGFjayB1bnRpbCBtb2RlbCBzdXBwb3J0IHVuaWZpZWQuICAqLworI2RlZmluZSBTSU1fSEFWRV9NT0RFTAorCisvKiBEZWZpbmUgdGhpcyB0byBlbmFibGUgdGhlIGludHJpbnNpYyBicmVha3BvaW50IG1lY2hhbmlzbS4gKi8KKy8qIEZJWE1FOiBtYXkgYmUgYWJsZSB0byByZW1vdmUgU0lNX0hBVkVfQlJFQUtQT0lOVFMgc2luY2UgaXQgZXNzZW50aWFsbHkKKyAgIGR1cGxpY2F0ZXMgaWZkZWYgU0lNX0JSRUFLUE9JTlQgKHJpZ2h0PykgKi8KKyNpZiAwCisjZGVmaW5lIFNJTV9IQVZFX0JSRUFLUE9JTlRTCisjZGVmaW5lIFNJTV9CUkVBS1BPSU5UIHsgMHgxMCwgMHhmMSB9CisjZGVmaW5lIFNJTV9CUkVBS1BPSU5UX1NJWkUgMgorI2VuZGlmCisKKy8qIFRoaXMgaXMgYSBnbG9iYWwgc2V0dGluZy4gIERpZmZlcmVudCBjcHUgZmFtaWxpZXMgY2FuJ3QgbWl4LW4tbWF0Y2ggLXNjYWNoZQorICAgYW5kIC1wYmIuICBIb3dldmVyIHNvbWUgY3B1IGZhbWlsaWVzIG1heSB1c2UgLXNpbXBsZSB3aGlsZSBvdGhlcnMgdXNlCisgICBvbmUgb2YgLXNjYWNoZS8tcGJiLiA/Pz8/ICovCisjZGVmaW5lIFdJVEhfU0NBQ0hFX1BCQiAxCmRpZmYgLS1naXQgYS9zaW0vZnIzMC90cmFwcy5jIGIvc2ltL2ZyMzAvdHJhcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTliY2EyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2ZyMzAvdHJhcHMuYwpAQCAtMCwwICsxLDIxNyBAQAorLyogZnIzMCBleGNlcHRpb24sIGludGVycnVwdCwgYW5kIHRyYXAgKEVJVCkgc3VwcG9ydAorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBzaW11bGF0b3JzLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJ0YXJnLXZhbHMuaCIKKyNpbmNsdWRlICJjZ2VuLWVuZ2luZS5oIgorCisvKiBUaGUgc2VtYW50aWMgY29kZSBpbnZva2VzIHRoaXMgZm9yIGludmFsaWQgKHVucmVjb2duaXplZCkgaW5zdHJ1Y3Rpb25zLiAgKi8KKwordm9pZAorc2ltX2VuZ2luZV9pbnZhbGlkX2luc24gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBJQUREUiBjaWEpCit7CisgIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjdXJyZW50X2NwdSk7CisKKyNpZiAwCisgIGlmIChTVEFURV9FTlZJUk9OTUVOVCAoc2QpID09IE9QRVJBVElOR19FTlZJUk9OTUVOVCkKKyAgICB7CisgICAgICBoX2JzbV9zZXQgKGN1cnJlbnRfY3B1LCBoX3NtX2dldCAoY3VycmVudF9jcHUpKTsKKyAgICAgIGhfYmllX3NldCAoY3VycmVudF9jcHUsIGhfaWVfZ2V0IChjdXJyZW50X2NwdSkpOworICAgICAgaF9iY29uZF9zZXQgKGN1cnJlbnRfY3B1LCBoX2NvbmRfZ2V0IChjdXJyZW50X2NwdSkpOworICAgICAgLyogc20gbm90IGNoYW5nZWQgKi8KKyAgICAgIGhfaWVfc2V0IChjdXJyZW50X2NwdSwgMCk7CisgICAgICBoX2NvbmRfc2V0IChjdXJyZW50X2NwdSwgMCk7CisKKyAgICAgIGhfYnBjX3NldCAoY3VycmVudF9jcHUsIGNpYSk7CisKKyAgICAgIHNpbV9lbmdpbmVfcmVzdGFydCAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSksIGN1cnJlbnRfY3B1LCBOVUxMLAorCQkJICBFSVRfUlNWRF9JTlNOX0FERFIpOworICAgIH0KKyAgZWxzZQorI2VuZGlmCisgICAgc2ltX2VuZ2luZV9oYWx0IChzZCwgY3VycmVudF9jcHUsIE5VTEwsIGNpYSwgc2ltX3N0b3BwZWQsIFNJTV9TSUdJTEwpOworfQorCisvKiBQcm9jZXNzIGFuIGFkZHJlc3MgZXhjZXB0aW9uLiAgKi8KKwordm9pZAorZnIzMF9jb3JlX3NpZ25hbCAoU0lNX0RFU0Mgc2QsIFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBzaW1fY2lhIGNpYSwKKwkJICB1bnNpZ25lZCBpbnQgbWFwLCBpbnQgbnJfYnl0ZXMsIGFkZHJlc3Nfd29yZCBhZGRyLAorCQkgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXIsIHNpbV9jb3JlX3NpZ25hbHMgc2lnKQoreworI2lmIDAKKyAgaWYgKFNUQVRFX0VOVklST05NRU5UIChzZCkgPT0gT1BFUkFUSU5HX0VOVklST05NRU5UKQorICAgIHsKKyAgICAgIGhfYnNtX3NldCAoY3VycmVudF9jcHUsIGhfc21fZ2V0IChjdXJyZW50X2NwdSkpOworICAgICAgaF9iaWVfc2V0IChjdXJyZW50X2NwdSwgaF9pZV9nZXQgKGN1cnJlbnRfY3B1KSk7CisgICAgICBoX2Jjb25kX3NldCAoY3VycmVudF9jcHUsIGhfY29uZF9nZXQgKGN1cnJlbnRfY3B1KSk7CisgICAgICAvKiBzbSBub3QgY2hhbmdlZCAqLworICAgICAgaF9pZV9zZXQgKGN1cnJlbnRfY3B1LCAwKTsKKyAgICAgIGhfY29uZF9zZXQgKGN1cnJlbnRfY3B1LCAwKTsKKworICAgICAgaF9icGNfc2V0IChjdXJyZW50X2NwdSwgY2lhKTsKKworICAgICAgc2ltX2VuZ2luZV9yZXN0YXJ0IChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSwgY3VycmVudF9jcHUsIE5VTEwsCisJCQkgIEVJVF9BRERSX0VYQ1BfQUREUik7CisgICAgfQorICBlbHNlCisjZW5kaWYKKyAgICBzaW1fY29yZV9zaWduYWwgKHNkLCBjdXJyZW50X2NwdSwgY2lhLCBtYXAsIG5yX2J5dGVzLCBhZGRyLAorCQkgICAgIHRyYW5zZmVyLCBzaWcpOworfQorDAorLyogUmVhZC93cml0ZSBmdW5jdGlvbnMgZm9yIHN5c3RlbSBjYWxsIGludGVyZmFjZS4gICovCisKK3N0YXRpYyBpbnQKK3N5c2NhbGxfcmVhZF9tZW0gKGhvc3RfY2FsbGJhY2sgKmNiLCBzdHJ1Y3QgY2Jfc3lzY2FsbCAqc2MsCisJCSAgdW5zaWduZWQgbG9uZyB0YWRkciwgY2hhciAqYnVmLCBpbnQgYnl0ZXMpCit7CisgIFNJTV9ERVNDIHNkID0gKFNJTV9ERVNDKSBzYy0+cDE7CisgIFNJTV9DUFUgKmNwdSA9IChTSU1fQ1BVICopIHNjLT5wMjsKKworICByZXR1cm4gc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLCBjcHUsIHJlYWRfbWFwLCBidWYsIHRhZGRyLCBieXRlcyk7Cit9CisKK3N0YXRpYyBpbnQKK3N5c2NhbGxfd3JpdGVfbWVtIChob3N0X2NhbGxiYWNrICpjYiwgc3RydWN0IGNiX3N5c2NhbGwgKnNjLAorCQkgICB1bnNpZ25lZCBsb25nIHRhZGRyLCBjb25zdCBjaGFyICpidWYsIGludCBieXRlcykKK3sKKyAgU0lNX0RFU0Mgc2QgPSAoU0lNX0RFU0MpIHNjLT5wMTsKKyAgU0lNX0NQVSAqY3B1ID0gKFNJTV9DUFUgKikgc2MtPnAyOworCisgIHJldHVybiBzaW1fY29yZV93cml0ZV9idWZmZXIgKHNkLCBjcHUsIHdyaXRlX21hcCwgYnVmLCB0YWRkciwgYnl0ZXMpOworfQorCisvKiBTdWJyb3V0aW5lIG9mIGZyMzBfaW50IHRvIHNhdmUgdGhlIFBTIGFuZCBQQyBhbmQgc2V0dXAgZm9yIElOVCBhbmQgSU5URS4gICovCisKK3N0YXRpYyB2b2lkCitzZXR1cF9pbnQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBQQ0FERFIgcGMpCit7CisgIFVTSSBzc3AgPSBhX2ZyMzBfaF9kcl9nZXQgKGN1cnJlbnRfY3B1LCBIX0RSX1NTUCk7CisgIFVTSSBwcyA9IGFfZnIzMF9oX3BzX2dldCAoY3VycmVudF9jcHUpOworCisgIHNzcCAtPSA0OworICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBzc3AsIHBzKTsKKyAgc3NwIC09IDQ7CisgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHNzcCwgcGMgKyAyKTsKKyAgYV9mcjMwX2hfZHJfc2V0IChjdXJyZW50X2NwdSwgSF9EUl9TU1AsIHNzcCk7CisgIGFfZnIzMF9oX3NiaXRfc2V0IChjdXJyZW50X2NwdSwgMCk7Cit9CisKKy8qIFRyYXAgc3VwcG9ydC4KKyAgIFRoZSByZXN1bHQgaXMgdGhlIHBjIGFkZHJlc3MgdG8gY29udGludWUgYXQuCisgICBQcmVwcm9jZXNzaW5nIGxpa2Ugc2F2aW5nIHRoZSB2YXJpb3VzIHJlZ2lzdGVycyBoYXMgYWxyZWFkeSBiZWVuIGRvbmUuICAqLworCitVU0kKK2ZyMzBfaW50IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgUENBRERSIHBjLCBpbnQgbnVtKQoreworICBTSU1fREVTQyBzZCA9IENQVV9TVEFURSAoY3VycmVudF9jcHUpOworICBob3N0X2NhbGxiYWNrICpjYiA9IFNUQVRFX0NBTExCQUNLIChzZCk7CisKKyNpZmRlZiBTSU1fSEFWRV9CUkVBS1BPSU5UUworICAvKiBDaGVjayBmb3IgYnJlYWtwb2ludHMgIm93bmVkIiBieSB0aGUgc2ltdWxhdG9yIGZpcnN0LCByZWdhcmRsZXNzCisgICAgIG9mIC0tZW52aXJvbm1lbnQuICAqLworICBpZiAobnVtID09IFRSQVBfQlJFQUtQT0lOVCkKKyAgICB7CisgICAgICAvKiBGaXJzdCB0cnkgc2ltLWJyZWFrLmMuICBJZiBpdCdzIGEgYnJlYWtwb2ludCB0aGUgc2ltdWxhdG9yICJvd25zIgorCSBpdCBkb2Vzbid0IHJldHVybi4gIE90aGVyd2lzZSBpdCByZXR1cm5zIGFuZCBsZXQncyB1cyB0cnkuICAqLworICAgICAgc2ltX2hhbmRsZV9icmVha3BvaW50IChzZCwgY3VycmVudF9jcHUsIHBjKTsKKyAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisgICAgfQorI2VuZGlmCisKKyAgaWYgKFNUQVRFX0VOVklST05NRU5UIChzZCkgPT0gT1BFUkFUSU5HX0VOVklST05NRU5UKQorICAgIHsKKyAgICAgIC8qIFRoZSBuZXcgcGMgaXMgdGhlIHRyYXAgdmVjdG9yIGVudHJ5LgorCSBXZSBhc3N1bWUgdGhlcmUncyBhIGJyYW5jaCB0aGVyZSB0byBzb21lIGhhbmRsZXIuICAqLworICAgICAgVVNJIG5ld19wYzsKKyAgICAgIHNldHVwX2ludCAoY3VycmVudF9jcHUsIHBjKTsKKyAgICAgIGFfZnIzMF9oX2liaXRfc2V0IChjdXJyZW50X2NwdSwgMCk7CisgICAgICBuZXdfcGMgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLAorCQkJIGFfZnIzMF9oX2RyX2dldCAoY3VycmVudF9jcHUsIEhfRFJfVEJSKQorCQkJICsgMTAyNCAtICgobnVtICsgMSkgKiA0KSk7CisgICAgICByZXR1cm4gbmV3X3BjOworICAgIH0KKworICBzd2l0Y2ggKG51bSkKKyAgICB7CisgICAgY2FzZSBUUkFQX1NZU0NBTEwgOgorICAgICAgeworCS8qIFRPRE86IGZpbmQgb3V0IHdoYXQgdGhlIEFCSSBmb3IgdGhpcyBpcyAqLworCUNCX1NZU0NBTEwgczsKKworCUNCX1NZU0NBTExfSU5JVCAoJnMpOworCXMuZnVuYyA9IGFfZnIzMF9oX2dyX2dldCAoY3VycmVudF9jcHUsIDApOworCXMuYXJnMSA9IGFfZnIzMF9oX2dyX2dldCAoY3VycmVudF9jcHUsIDQpOworCXMuYXJnMiA9IGFfZnIzMF9oX2dyX2dldCAoY3VycmVudF9jcHUsIDUpOworCXMuYXJnMyA9IGFfZnIzMF9oX2dyX2dldCAoY3VycmVudF9jcHUsIDYpOworCisJaWYgKHMuZnVuYyA9PSBUQVJHRVRfU1lTX2V4aXQpCisJICB7CisJICAgIHNpbV9lbmdpbmVfaGFsdCAoc2QsIGN1cnJlbnRfY3B1LCBOVUxMLCBwYywgc2ltX2V4aXRlZCwgcy5hcmcxKTsKKwkgIH0KKworCXMucDEgPSAoUFRSKSBzZDsKKwlzLnAyID0gKFBUUikgY3VycmVudF9jcHU7CisJcy5yZWFkX21lbSA9IHN5c2NhbGxfcmVhZF9tZW07CisJcy53cml0ZV9tZW0gPSBzeXNjYWxsX3dyaXRlX21lbTsKKwljYl9zeXNjYWxsIChjYiwgJnMpOworCWFfZnIzMF9oX2dyX3NldCAoY3VycmVudF9jcHUsIDIsIHMuZXJyY29kZSk7IC8qIFRPRE86IGNoZWNrIHRoaXMgb25lICovCisJYV9mcjMwX2hfZ3Jfc2V0IChjdXJyZW50X2NwdSwgNCwgcy5yZXN1bHQpOworCWFfZnIzMF9oX2dyX3NldCAoY3VycmVudF9jcHUsIDEsIHMucmVzdWx0Mik7IC8qIFRPRE86IGNoZWNrIHRoaXMgb25lICovCisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIFRSQVBfQlJFQUtQT0lOVDoKKyAgICAgIHNpbV9lbmdpbmVfaGFsdCAoc2QsIGN1cnJlbnRfY3B1LCBOVUxMLCBwYywKKwkJICAgICAgIHNpbV9zdG9wcGVkLCBTSU1fU0lHVFJBUCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQgOgorICAgICAgeworCVVTSSBuZXdfcGM7CisJc2V0dXBfaW50IChjdXJyZW50X2NwdSwgcGMpOworCWFfZnIzMF9oX2liaXRfc2V0IChjdXJyZW50X2NwdSwgMCk7CisJbmV3X3BjID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywKKwkJCSAgIGFfZnIzMF9oX2RyX2dldCAoY3VycmVudF9jcHUsIEhfRFJfVEJSKQorCQkJICAgKyAxMDI0IC0gKChudW0gKyAxKSAqIDQpKTsKKwlyZXR1cm4gbmV3X3BjOworICAgICAgfQorICAgIH0KKworICAvKiBGYWtlIGFuICJyZXRpIiBpbnNuLgorICAgICBTaW5jZSB3ZSBkaWRuJ3QgcHVzaCBhbnl0aGluZyB0byBzdGFjaywgYWxsIHdlIG5lZWQgdG8gZG8gaXMKKyAgICAgdXBkYXRlIHBjLiAgKi8KKyAgcmV0dXJuIHBjICsgMjsKK30KKworVVNJCitmcjMwX2ludGUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBQQ0FERFIgcGMsIGludCBudW0pCit7CisgIC8qIFRoZSBuZXcgcGMgaXMgdGhlIHRyYXAgIzkgdmVjdG9yIGVudHJ5LgorICAgICBXZSBhc3N1bWUgdGhlcmUncyBhIGJyYW5jaCB0aGVyZSB0byBzb21lIGhhbmRsZXIuICAqLworICBVU0kgbmV3X3BjOworICBzZXR1cF9pbnQgKGN1cnJlbnRfY3B1LCBwYyk7CisgIGFfZnIzMF9oX2lsbV9zZXQgKGN1cnJlbnRfY3B1LCA0KTsKKyAgbmV3X3BjID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywKKwkJICAgICBhX2ZyMzBfaF9kcl9nZXQgKGN1cnJlbnRfY3B1LCBIX0RSX1RCUikKKwkJICAgICArIDEwMjQgLSAoKDkgKyAxKSAqIDQpKTsKKyAgcmV0dXJuIG5ld19wYzsKK30KZGlmZiAtLWdpdCBhL3NpbS9oODMwMC9DaGFuZ2VMb2cgYi9zaW0vaDgzMDAvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNzE3ODEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaDgzMDAvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNTkxIEBACitUdWUgQXByIDI4IDE4OjMzOjMxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1N1biBBcHIgMjYgMTU6MzE6NTUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1N1biBBcHIgMjYgMTU6MjA6MTQgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZ3VyZS5pbjogUmV2ZXJ0ZWQgY2hhbmdlIG9mIEFwciAyNDsgdXNlIHNpbmNsdWRlIGFnYWluLgorCitGcmkgQXByIDI0IDE0OjE2OjQwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitGcmkgQXByIDI0IDExOjE5OjQ2IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEb24ndCBjYWxsIHNpbmNsdWRlLgorCitTYXQgQXByICA0IDIwOjM2OjI1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitGcmkgTWFyIDI3IDE2OjE1OjUyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgTWFyIDI1IDEyOjM1OjI5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgTWFyIDE4IDEyOjM4OjEyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgRmViIDE3IDEyOjQyOjE4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29tcGlsZS5jIChzaW1fc3RvcmVfcmVnaXN0ZXIsIHNpbV9mZXRjaF9yZWdpc3Rlcik6IFBhc3MgaW4KKyAJbGVuZ3RoIHBhcmFtZXRlci4gIFJldHVybiAtMS4KKworU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIEphbiAxOSAyMjoyNjoyOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmE+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIERlYyAxNSAyMzoxNzoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1RodSBEZWMgIDQgMDk6MjE6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgTm92IDExIDE2OjUyOjA3IDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQorCisJKiBjb21waWxlLmM6ICNpbmNsdWRlIHN0ZGlvLmggZm9yIGRlZmluaXRpb24gb2YgTlVMTCBvbgorCXNvbWUgcGxhdGZvcm1zLgorCitXZWQgT2N0IDIyIDE0OjQzOjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29tcGlsZS5jIChzaW1fbG9hZCk6IFBhc3MgbG1hX3AgYW5kIHNpbV93cml0ZSBhcmdzIHRvCisgCXNpbV9sb2FkX2ZpbGUuCisKK0ZyaSBPY3QgIDMgMDk6Mjg6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBTZXAgMjQgMTc6Mzg6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1R1ZSBTZXAgMjMgMTE6MDQ6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK01vbiBTZXAgMjIgMTE6NDY6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK0ZyaSBTZXAgMTkgMTc6NDU6MjUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBTZXAgMTcgMTI6MDA6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoY29tcGlsZS5vKTogRGVwZW5kIG9uIGNvbmZpZy5oIGluIGxvY2FsIGRpcmVjdG9yeS4KKworTW9uIFNlcCAxNSAxNzozNjoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVHVlIFNlcCAgOSAyMjoxNzoyNiAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIGluc3QuaCAoc2ltX3N0YXRlKTogcmVuYW1lIHRvIGg4MzAwX3NpbV9zdGF0ZSwgdG8gYXZvaWQgY29uZmxpY3QKKyAJd2l0aCBzaW0vY29tbW9uLgorCSogY29uZmlndXJlLmluOiBjaGVjayBmb3Igc3lzL3BhcmFtLmgKKwkqIGNvbXBpbGUuYzogI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0guCisJI2RlZmluZSBTSUdUUkFQIGZvciB3aW5nZGIuCisJKHNpbV9yZXN1bWUpOiBwb2xsIGtleWJvYXJkIGF0IGxlYXN0IG9uY2UgcGVyIGNhbGwuCisJKHNpbV9yZXN1bWUpOiB1c2UgaG9zdF9jYWxsYmFjayBpbnN0ZWFkIG9mIHByaW50ZiBmb3Igc3lzY2FsbAorIAlvdXRwdXQuCisKK1RodSBTZXAgIDQgMTc6MjE6MjMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBBdWcgMjcgMTg6MTM6MjIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitUdWUgQXVnIDI2IDEwOjM4OjQzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29tcGlsZS5jIChzaW1fa2lsbCk6IERlbGV0ZS4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEFkZCBBQkZEIGFyZ3VtZW50LgorCShzaW1fbG9hZCk6IE1vdmUgc2V0dGluZyBvZiBQQyBmcm9tIGhlcmUuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBUbyBoZXJlLgorIAkoc2ltX29wZW4sIHNpbV9sb2FkLCBzZXRfaDgzMDBoKTogQWRkIGZpeG1lIGV4cGxhaW5pbmcgd2h5IG11Y2ggb2YKKyAJdGhlIHNpbV9sb2FkIGNvZGUgc2hvdWxkIGJlIG1vdmVkIHRvIHNpbV9vcGVuLgorCitNb24gQXVnIDI1IDE3OjUwOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworTW9uIEF1ZyAyNSAxNTo0Nzo0MSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbXBpbGUuYyAoc2ltX29wZW4pOiBBZGQgQUJGRCBhcmd1bWVudC4KKworVHVlIE1heSAyMCAxMDoxNjo0OCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbXBpbGUuYyAoc2ltX29wZW4pOiBBZGQgY2FsbGJhY2sgYXJndW1lbnQuCisJKHNpbV9zZXRfY2FsbGJhY2tzKTogRGVsZXRlIFNJTV9ERVNDIGFyZ3VtZW50LgorCitXZWQgQXByIDMwIDEwOjIyOjI5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbXBpbGUuYyAoc2ltX2xvYWQpOiBDYWxsIGJmZF9nZXRfbWFjaCBpbnN0ZWFkIG9mIGV4YW1pbmluZworCWJmZCBmaWVsZHMgZGlyZWN0bHkuCisJKiB0Y29uZmlnLmluIChTSU1fUFJFX0xPQUQpOiBEZWxldGUsIG5vIGxvbmdlciB1c2VkLgorCitUaHUgQXByIDI0IDAwOjM5OjUxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworRnJpIEFwciAxOCAxNDozMDowOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IFVzZSBwb2xsX3F1aXQgY2FsbGJhY2suCisJKHNpbV9zdG9wKTogTmV3IGZ1bmN0aW9uLgorCitUaHUgQXByIDE3IDAzOjA2OjM5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbG9hZC5vLgorCSogY29tcGlsZS5jIChzaW1fa2luZCwgbXluYW1lKTogTmV3IHN0YXRpYyBsb2NhbHMuCisJKHNpbV9vcGVuKTogU2V0IHNpbV9raW5kLCBteW5hbWUuCisJKHNpbV9sb2FkKTogUmV0dXJuIFNJTV9SQy4gIE5ldyBhcmcgYWJmZC4gIFVwZGF0ZSB0ZXN0IGZvciBoODMwMGguCisJQ2FsbCBzaW1fbG9hZF9maWxlIHRvIGxvYWQgZmlsZSBpbnRvIHNpbXVsYXRvci4gIFNldCBzdGFydCBhZGRyZXNzCisJZnJvbSBiZmQuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBSZXR1cm4gU0lNX1JDLiAgRGVsZXRlIGFyZyBzdGFydF9hZGRyZXNzLgorCitNb24gQXByICA3IDE1OjQ1OjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitXZWQgQXByICAyIDE1OjA2OjI4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbXBpbGUuYyAoc2ltX29wZW4pOiBOZXcgYXJnIGBraW5kJy4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgQXByICAyIDE0OjM0OjE5IDE5OTcgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgTWFyIDE5IDAxOjE0OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK01vbiBNYXIgMTcgMTU6MTA6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCisKK0ZyaSBNYXIgMTQgMTA6MzQ6MTEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUaHUgTWFyIDEzIDEyOjQ4OjA1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbXBpbGUuYyAoc2ltX29wZW4pOiBOZXcgU0lNX0RFU0MgcmVzdWx0LiAgQXJndW1lbnQgaXMgbm93IGluCisJYXJndiBmb3JtLgorCShvdGhlciBzaW1fKik6IE5ldyBTSU1fREVTQyBhcmd1bWVudC4KKworVHVlIEZlYiAgNCAxMzozNjoyOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQENPTU1PTl9NQUtFRklMRV9GUkFHKTogVXNlCisJQ09NTU9OX3tQUkUsUE9TVH1fQ09ORklHX0ZSQUcgaW5zdGVhZC4KKwkqIGNvbmZpZ3VyZS5pbjogc2luY2x1ZGUgLi4vY29tbW9uL2FjbG9jYWwubTQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitUaHUgSmFuIDIzIDExOjQ2OjIzIDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4gTWFrZWZpbGUuaW46ICBVcGRhdGUgdG8gbmV3IGNvbmZpZ3VyZQorCXNjaGVtZSB3aGljaCBpcyBtb3JlIGNvbXBhdGlibGUgd2l0aCBXaW5HREIgYnVpbGRzLgorCSogY29uZmlndXJlLmluOiAgSW1wcm92ZSBjb21tZW50IG9uIGhvdyB0byBydW4gYXV0b2NvbmYuCisJKiBjb25maWd1cmU6ICBSZS1ydW4gYXV0b2NvbmYgdG8gZ2V0IG5ldyAuLi9jb21tb24vYWNsb2NhbC5tNC4KKwkqIE1ha2VmaWxlLmluOiAgVXNlIGF1dG9jb25mIHN1YnN0aXR1dGlvbiB0byBpbnN0YWxsIGNvbW1vbgorCW1ha2VmaWxlIGZyYWdtZW50LgorCitXZWQgTm92IDIwIDAxOjM5OjEyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBEZWxldGUgc3R1ZmYgbW92ZWQgdG8gLi4vY29tbW9uL01ha2UtY29tbW9uLmluLgorCShTSU1fT0JKUyk6IERlZmluZS4KKwkqIGNvbmZpZ3VyZS5pbjogU2ltcGxpZnkgdXNpbmcgbWFjcm9zIGluIC4uL2NvbW1vbi9hY2xvY2FsLm00LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKwkqIGluc3QuaCAoZW51bSBzaW1fc3RhdGUpOiBEZWZpbmUuCisJKGNwdV9zdGF0ZV90eXBlKTogTmV3IG1lbWJlciBgc3RhdGUnLiAgU2V0IGl0IHdoZW5ldmVyIGBleGNlcHRpb24nCisJaXMgc2V0LgorCSogY29tcGlsZS5jIChzaW1fY2FsbGJhY2spOiBOZXcgZ2xvYmFsLgorCShzaW1fc2V0X3NpbWNhY2hlX3NpemUpOiBSZW5hbWVkIGZyb20gc2ltX2NzaXplLgorCShzaW1fcmVzdW1lLCBjYXNlIE9fU0xFRVApOiBBZGQgcmlnaHQgd2F5IHRvIGRlY29kZSByMCBidXQgI2lmIDAgb3V0CisJJ2N1cyBpdCBjYW4ndCB3b3JrLiAgQ2hhbmdlIG1haW4gbG9vcCBleGl0IHRlc3QgdG8gdXNlIGNwdS5zdGF0ZS4KKwkoc2ltX3RyYWNlKTogTmV3IGZ1bmN0aW9uLgorCShzaW1fc3RvcF9yZWFzb24pOiBBZGQgcmlnaHQgd2F5IHRvIHNldCByZXN1bHRzLCBidXQgI2lmIDAgb3V0LgorCShzaW1fc2l6ZSk6IE5ldyBmdW5jdGlvbi4KKwkoc2ltX2luZm8pOiBSZWRpcmVjdCBjYWxscyB0byBwcmludGZfZmlsdGVyZWQgdGhyb3VnaCBjYWxsYmFjay4KKwkoc2ltX3NldF9jYWxsYmFja3MpOiBSZWNvcmQgY2FsbGJhY2suCisJKiBydW4uYzogRGVsZXRlZCwgdXNpbmcgb25lIGluIC4uL2NvbW1vbiBub3cuCisJKiB0Y29uZmlnLmluOiBOZXcgZmlsZS4KKworVGh1IE9jdCAgMyAxNjoxMzoxOCAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQorCisJKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4pOiBEb24ndCByZW1vdmUgY29uZmlnLmxvZyBoZXJlLgorCitGcmkgQXVnICA5IDIyOjU5OjExIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29tcGlsZS5jIChzaW1fcmVzdW1lKTogcnRzLCBzbGVlcCwgYnB0IGFuZCBub3AgaGF2ZQorCW5vIGFzc29jaWF0ZWQgInNpemUiLgorCitUdWUgSnVsICA5IDIyOjE1OjM5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29tcGlsZS5jIChzaW1fcmVzdW1lKTogRml4IGFsbCByb3RhdGUtYnktMi1iaXRzIGluc25zLgorCitUdWUgSnVsICAyIDIzOjA4OjQ1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogcnVuLmMgKG1haW4pOiBEb24ndCAibG9hZCIgc2VjdGlvbnMgd2hpY2ggZG9uJ3QgaGF2ZQorCVNFQ19MT0FEIHNldC4KKwkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSwgY2FzZSAiT19OT1QiKTogVXNlIE9OT1QgaW5zdGVhZAorCW9mIE9TSElGVFMuCisJKE9OT1QpOiBEZWZpbmUuCisJKHNpbV9yZXN1bWUsIHNoaWZ0L3JvdGF0ZSBjYXNlcyk6IEFkZCBzdXBwb3J0IGZvciBzaGlmdC9yb3RhdGUKKwlieSB0d28gYml0cy4KKwkoT1NISUZUUyk6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KKworVHVlIEp1bCAgMiAwMTozNzoyNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IEhhbmRsZSAibGRtLmwiIGFuZCAic3RtLmwiLgorCitXZWQgSnVuIDI2IDA4OjU4OjUzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogY29tcGlsZS5jIChoODMwMHNtb2RlKTogRGVjbGFyZS4KKworV2VkIEp1biAyNiAxMjoyMDo1NiAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQorCisgICAgICAgICogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsCisgICAgICAgIElOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCisgICAgICAgIChkb2NkaXIpOiBSZW1vdmVkLgorICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KKyAgICAgICAgKEFDX1BST0dfSU5TVEFMTCk6IEFkZGVkLgorICAgICAgICAqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworVHVlIEp1biAxOCAxNjozMToxMCAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KKworCSogY29tcGlsZS5jIChzaW1fbG9hZCk6IFRyZWF0IHRoZSBIOC9TIGxpa2UgdGhlIEg4LzMwMEggZm9yIG5vdy4KKwkqIHJ1bi5jIChtYWluKTogVHJlYXQgdGhlIEg4L1MgbGlrZSB0aGUgSDgvMzAwSCBmb3Igbm93LgorCQorRnJpIE1heSAyNCAxMDozNToyNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbXBpbGUuYyAoU0VYVENIQVIpOiBDbGVhciB1cHBlciBiaXRzIHdoZW4gc2lnbgorCWJpdCBpcyBjbGVhci4KKworV2VkIE1heSAyMiAyMjoyMzozNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IENvcnJlY3RseSBoYW5kbGUgZGl2dS4KKworVHVlIE1heSAgNyAwMjoxMzowNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IE5ldmVyIGFsbG93IHRoZSBQQyB0byBoYXZlIGFuCisJb2RkIHZhbHVlLgorCitGcmkgQXByIDEyIDE2OjUwOjM3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaW5zdC5oOiBFeHBhbmQgb24gY29tbWVudHMgcmVnYXJkaW5nIEg4MzAwSF9NU0laRS4gIE5vdGUKKwlzZXBhcmF0ZSBtZW1vcnkgaXMgYWxsb2NhdGUgZm9yIHRoZSA4LWJpdCBhcmVhLgorCShzdHJ1Y3QgY3B1X3N0YXRlX3R5cGUpOiBBZGQgbmV3ICJlaWdodGJpdCcgZmllbGQuCisJKiBjb21waWxlLmMgKEdFVF9NRU1PUllfTCk6IEhhbmRsZSBhY2Nlc3MgaW50byB0aGUgOC1iaXQKKwlhcmVhLgorCShHRVRfTUVNT1JZX1csIEdFVF9NRU1PUllfQik6IExpa2V3aXNlLgorCShTRVRfTUVNT1JZX0wsIFNFVF9NRU1PUllfVywgU0VUX01FTU9SWV9CKTogTGlrZXdpc2UuCisJKGluaXRfcG9pbnRlcnMpOiBJbml0aWFsaXplIHNwYWNlIGZvciB0aGUgOC1iaXQgYXJlYS4KKwkoc2ltX3dyaXRlKTogSGFuZGxlIHdyaXRpbmcgaW50byB0aGUgOC1iaXQgYXJlYS4KKwkoc2ltX3JlYWQpOiBIYW5kbGUgcmVhZGluZyBmcm9tIHRoZSA4LWJpdCBhcmVhLgorCShzaW1fbG9hZCk6IFJlYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSA4LWJpdCBhcmVhLgorCisJKiBjb21waWxlLmMgKHNpbV9sb2FkKTogUmUtYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2ltdWxhdG9yCisJaGVyZS4KKworRnJpIEFwciAxMiAwOTozOTo1NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IEZpeCBhbmQgc2ltcGxpZnkgb3ZlcmZsb3cgYW5kIGNhcnJ5CisJaGFuZGxpbmcgZm9yIDMyYml0IEFMVSBpbnNucy4KKworTW9uIEFwciAgOCAyMzo1ODo0OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IEZpeCBvdmVyZmxvdyBjaGVja3MgZm9yIEFMVSBpbnNucy4KKworRnJpIEFwciAgNSAxNzoyMDo1OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbXBpbGUuYyAoZGVjb2RlKTogVXNlICJiaXQiIHRvIGhvbGQgTF8zIGltbWVkaWF0ZXMgaW5zdGVhZAorCW9mIGhvbGRpbmcgdGhlbSBpbiAiYWJzIi4gIEhhbmRsZSBBQlM4TUVNIG1lbW9yeSByZWZlcmVuY2VzIGFrYQorCTgtYml0IGFyZWEuICBSZXBsYWNlIEFCU01PViByZWZlcmVuY2VzIHdpdGggQUJTOE1FTS4KKworV2VkIE1hciAxMyAxNzo0Mzo1NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGNvbXBpbGUuYyAoZmV0Y2gpOiBIYW5kbGUgYWNjZXNzZXMgdG8gdGhlIGV4Y2VwdGlvbi9mdW5jdGlvbgorCXZlY3RvcnMuCisKK01vbiBNYXIgMTEgMDk6NTM6MjUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIGNvbXBpbGUuYzogI2luY2x1ZGUgIndhaXQuaCIuCisgCShzaW1fcmVzdW1lLCBzbGVlcCBpbnNuKTogQ2hlY2sgcHJvZ3JhbSBleGl0IHN0YXR1cyBpbiByMC4KKwkoc2ltX3Jlc3VtZSwgc2hpZnQgaW5zbnMpOiBGaXggc2V0dGluZyBvZiBvdmVyZmxvdyBmbGFnIGZvciBzaGFsLgorCSogcnVuLmM6ICNpbmNsdWRlIDxzaWduYWwuaD4uCisJKG1haW4pOiBBYm9ydCBpZiBwcm9ncmFtIGdvdCBTSUdJTEwuCisJUHJpbnQgZXJyb3IgbWVzc2FnZSBpZiBhcmd1bWVudCBpcyBpbnZhbGlkLgorCSh1c2FnZSk6IEltcHJvdmUgdGV4dC4KKworV2VkIEZlYiAyMSAxMjoxNTowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mIDIuNy4KKworVGh1IEphbiAgNCAxMTo1Mjo1MyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBpbnN0LmggKE1QT1dFUixNU0laRSk6IERlbGV0ZWQuCisJKEg4MzAweyxIfV9NU0laRSk6IERlZmluZS4KKwkqIGNvbXBpbGUuYyAobWVtb3J5X3NpemUpOiBOZXcgc3RhdGljIGdsb2JhbC4KKwkoaW5pdF9wb2ludGVycyk6IFNldCBtZW1vcnkgc2l6ZSBmcm9tIG9uZSBvZiBIODMwMHssSH1fTVNJWkUuCisJKHNpbV93cml0ZSxzaW1fcmVhZCk6IFVzZSBtZW1vcnlfc2l6ZS4KKworRnJpIE9jdCAxMyAxNTowMzoxOSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBjb21waWxlLmMgKHNpbV9zZXRfY2FsbGJhY2tzKTogTmV3LgorCitUdWUgT2N0IDEwIDExOjExOjI2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQklTT04pOiBSZW1vdmUgbWFjcm8uCisKK1dlZCBTZXAgMjAgMTM6MzU6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyBzeW5vbnltIGZvciByZWFsY2xlYW4uCisKK0ZyaSBTZXAgIDggMTI6MTg6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgaW4gJCh0b29sZGlyKS4KKworCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NPTkZJR19IRUFERVIuICBEb24ndCB0cnkgdG8gdXNlCisJYmZkL2hvc3RzLyouaCBmaWxlIG9yIGJmZC9jb25maWcvKi5taCBmaWxlLiAgQ2FsbCBBQ19QUk9HX0NDIGFuZAorCUFDX1BST0dfUkFOTElCLiAgU3Vic3RpdHV0ZSBpbiB2YWx1ZXMgZm9yIENGTEFHUywgSERFRklORVMgYW5kIEFSLgorCUNhbGwgQUNfQ0hFQ0tfSEVBREVSUyBmb3Igc3RkbGliLmggYW5kIHRpbWUuaC4gIFRvdWNoIHN0YW1wLmggaWYKKwljcmVhdGluZyBjb25maWcuaC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIGNvbmZpZy5pbjogTmV3IGZpbGUsIGNyZWF0ZWQgYnkgYXV0b2hlYWRlci4KKwkqIE1ha2VmaWxlLmluIChBUik6IERlZmluZSBhcyBAQVJALgorCShDQyk6IE5ldyB2YXJpYWJsZSwgZGVmaW5lZCBhcyBAQ0NALgorCShDRkxBR1MpOiBEZWZpbmUgYXMgQENGTEFHU0AuCisJKFJBTkxJQik6IERlZmluZSBhcyBAUkFOTElCQC4KKwkoSERFRklORVMsIFRERUZJTkVTKTogTmV3IHZhcmlhYmxlcy4KKwkoQGhvc3RfbWFrZWZpbGVfZnJhZ0ApOiBSZW1vdmUuCisJKGNvbXBpbGUubywgcnVuLm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaC4KKwkobW9zdGx5Y2xlYW4pOiBNYWtlIHRoZSBzYW1lIGFzIGNsZWFuLCBub3QgZGlzdGNsZWFuLgorCShjbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgorCShkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmggYW5kIHN0YW1wLWguCisJKE1ha2VmaWxlKTogRG9uJ3QgZGVwZW5kIHVwb24gQGZyYWdzQC4gIEp1c3QgcmVidWlsZCBNYWtlZmlsZSB3aGVuCisJaW52b2tpbmcgY29uZmlnLnN0YXR1cy4KKwkoY29uZmlnLmgsIHN0YW1wLWgpOiBOZXcgdGFyZ2V0cy4KKwkqIGNvbXBpbGUuYzogSW5jbHVkZSAiY29uZmlnLmgiLiAgRG9uJ3QgaW5jbHVkZSA8c3lzL3RpbWVzLmg+LgorCUluY2x1ZGUgPHRpbWUuaD4gYW5kIDxzdGRsaWIuaD4gaWYgdGhleSBleGlzdC4gIERvbid0IGluY2x1ZGUKKwkic3lzZGVwLmgiLgorCShnZXRfbm93KTogUmVtb3ZlIHVudXNlZCBsb2NhbCBiLgorCSogcnVuLmM6IEluY2x1ZGUgImNvbmZpZy5oIi4gIEluY2x1ZGUgPHN0ZGxpYi5oPiBpZiBpdCBleGlzdHMuCisJRG9uJ3QgaW5jbHVkZSAic3lzZGVwLmgiLgorCSogd3JpdGVjb2RlLmM6IERvbid0IGluY2x1ZGUgImJmZC5oIiBvciAic3lzZGVwLmgiLiAgSW5jbHVkZQorCTxzdGRpby5oPi4KKworVGh1IEF1ZyAgMyAxMDo0NTozNyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogVXBkYXRlIGFsbCBGU0YgYWRkcmVzc2VzIGV4Y2VwdCB0aG9zZSBpbiBDT1BZSU5HKiBmaWxlcy4KKworV2VkIEp1bCAgNSAxNDozMjo1NCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChjbGVhbik6IFJlbW92ZSBydW4uCisJKGRpc3RjbGVhbik6IFJlbW92ZSBNYWtlZmlsZS4KKworCSogaDgzMDAubXQ6IFJlbW92ZWQuCisKKwkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IGNvbnZlcnRlZCB0byBhdXRvY29uZi4KKwkqIGNvbmZpZ3VyZTogTmV3IGZpbGUsIGdlbmVyYXRlZCB3aXRoIGF1dGNvbmYgMi40LgorCitGcmkgSnVuIDMwIDE2OjUwOjI0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogY29tcGlsZS5jIChzaW1fZG9fY29tbWFuZCk6IE5ldyBmdW5jdGlvbi4KKworVHVlIEp1biAyMCAxNjoxODoxMyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBjb21waWxlLmMgKGdldF9ub3cpOiBEb24ndCBkbyBpZiB3aW4zMi4KKwkoc2ltX3Jlc3VtZSk6IFBvbGwgaW4gd2luMzIgdG9vLgorCitXZWQgTWF5IDI0IDE2OjMxOjM4IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBGaXggdHlwbyBpbiBsYXN0IGNoYW5nZS4KKworTW9uIE1hciAyNyAxMDozMjozNCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIHJ1bi5jOiBwYXJzZSBhcmd1bWVudHMgd2l0aCBnZXRvcHQoKS4KKworVHVlIEZlYiAyOCAxNzozMDowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogVXNlIC4uLy4uL2JmZC9ob3N0cy9zdGQtaG9zdC5oIGlmIHNwZWNpZmljCisJaG9zdCB1bmF2YWlsYWJsZS4KKworU3VuIEphbiAyMiAxMjozNTo0MyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KKworCSogY29tcGlsZS5jIChzaW1fcmVzdW1lKTogSW5pdGlhbGl6ZSBjcHUubWFzay4KKworVGh1IFNlcCAgOCAxNjo1MzowMCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiBpbnN0LmggKE1QT1dFUik6IEJ1bXAgc2ltdWxhdGVkIG1lbW9yeSBzaXplIHRvIDJeMTggYnl0ZXMuCisKK1dlZCBNYXkgMTggMTM6NDc6NTggMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogY29tcGlsZS5jOiAjaW5jbHVkZSAiYmZkLmgiLgorCShzaW1fKik6IFNldCByZXN1bHQgdHlwZSB0byB2b2lkIHdoZXJlIHRoZXJlIGlzbid0IG9uZS4KKwkoc2ltX3Jlc3VtZSwgZGVmYXVsdCBjYXNlKTogU2V0IGNwdS5leGNlcHRpb24gdG8gU0lHSUxMLgorCShzaW1fdHJhY2UpOiBEZWxldGUuCisJKHNpbV9zZXRfcGMpOiBEZWxldGUuCisJKHNpbV9pbmZvKTogRGVsZXRlIHByaW50Zl9mbiBhcmcsIGFsbCBjYWxsZXJzIGNoYW5nZWQuCisJQ2FsbCBwcmludGZfZmlsdGVyZWQuCisJKHNldF9oODMwMGgpOiBOZXcgYXJnIGBmbGFnJywgYWxsIGNhbGxlcnMgY2hhbmdlZC4KKwkoc2ltX2Nsb3NlKTogTmV3IGZ1bmN0aW9uLgorCShzaW1fbG9hZCk6IE5ldyBmdW5jdGlvbi4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFJlbmFtZWQgZnJvbSBzaW1fc2V0X2FyZ3MsIGFsbCBjYWxsZXJzIGNoYW5nZWQuCisJKiBydW4uYzogI2luY2x1ZGUgPHZhcmFyZ3MuaD4sICJyZW1vdGUtc2ltLmgiLgorCShwcmludGZfZmlsdGVyZWQpOiBOZXcgZnVuY3Rpb24uCisKK0ZyaSBNYXkgMTMgMTg6MzI6MjcgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogY29tcGlsZS5jIChkZWNvZGUpOiBGaXggdHlwbyAoMTYgYml0IGJyYW5jaGVzKS4KKwkoKik6IFNvbWUgd2hpdGUgc3BhY2UgY2xlYW4gdXAuCisKK0ZyaSBNYXkgIDYgMTM6NDQ6MDEgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogY29tcGlsZS5jIChkZWNvZGUpOiBDb21waWxlIDE2Yml0IGJyYW5jaGVzIHByb3Blcmx5LgorCitTYXQgRGVjIDExIDE2OjMyOjM2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBjb21waWxlLmM6IFRpZHkgdXAgZm9ybWF0dGluZy4gKHNpbV9yZXN1bWUpOiBBZGQgb3JjLCB4b3JjLAorCWFuZGMuICBQb2xsIGZvciBpbnRlcnJ1cHRzLgorCitUaHUgT2N0IDI4IDE5OjI5OjM0IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGNvbXBpbGUuYzogI2luY2x1ZGUgImFuc2lkZWNsLmgiIGZvciByZW1vdGUtc2ltLmguCisKK1R1ZSBPY3QgMjYgMDk6NDM6MzYgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKENTRUFSQ0gpOiBBZGQgLUkkKHNyY2RpcikvLi4vLi4vZ2RiCisJKiBjb21waWxlLmM6ICNpbmNsdWRlICJyZW1vdGUtc2ltLmgiLgorCShzaW1fcmVzdW1lKTogTmV3IGFyZyBzaWdnbmFsLgorCShzaW1fd3JpdGUpOiBVc2UgU0lNX0FERFIgZm9yIHR5cGUgb2YgYXJnIGFkZHIuCisJQWx3YXlzIHJldHVybiBhIHZhbHVlLgorCShzaW1fcmVhZCk6IERpdHRvLgorCShzaW1fc3RvcmVfcmVnaXN0ZXIpOiBSZXN1bHQgaXMgdHlwZSBpbnQuCisJKHNpbV9mZXRjaF9yZWdpc3Rlcik6IERpdHRvLgorCShzaW1fc3RvcF9yZWFzb24pOiBSZW5hbWVkIGZyb20gc2ltX3N0b3Bfc2lnbmFsLgorCShzaW1fc2V0X3BjKTogVXNlIFNJTV9BRERSIGZvciB0eXBlIG9mIGFyZyBwYy4KKwkoc2ltX2luZm8pOiBpbnQgcmVzdWx0LCBuZXcgYXJnIHByaW50Zl9mbi4KKwkoc2ltX2tpbGwpOiBpbnQgcmVzdWx0LgorCShzaW1fb3Blbik6IGludCByZXN1bHQsIG5ldyBhcmcgbmFtZS4KKwkqIHJ1bi5jIChtYWluKTogVXNlIHNpbV9zZXRfcGMgdG8gc2V0IHBjLgorCVVwZGF0ZSBjYWxsIHRvIHNpbV9pbmZvLgorCitTYXQgT2N0IDIzIDE1OjAxOjE4IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGNvbXBpbGUuYyAoc2ltX3N0b3Bfc2lnbmFsKTogUmVzdWx0IGlzIG5vdyBlbnVtIHNpbV9zdG9wLgorCitGcmkgT2N0IDE1IDIzOjQ5OjI3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQorCisJKiBjb21waWxlLmMgKHNpbV9raWxsLCBzaW1fb3Blbiwgc2ltX3NldF9hcmdzKTogTmV3IGZ1bmN0aW9ucy4KKworVGh1IE9jdCAgNyAxNjoyNDoxMCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBjb21waWxlLmMgKHNpbV9zZXRfcGMpOiBXcml0ZSB0byB0aGUgcGMgZGlyZWNseS4KKwkoc2ltX3N0b3JlX3JlZ2lzdGVyKTogTm93IHZhbHVlIGlzIHBhc3NlZCBieSByZWZlcmVuY2UuIChzaW1fcmVhZCwKKwlzaW1fd3JpdGUpOiBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KKworVHVlIEF1ZyAxNyAwNzoxNjoxNSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBjb21waWxlLmMgKG1vcCk6IE5ldyBmdW5jdGlvbiB0byBkbyBtdWx0aXBsaWVzLgorCitGcmkgSnVsIDE2IDEzOjUzOjUzIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IEFkZCBzdXBwb3J0IGZvciBub3AgaW5zbi4KKworVGh1IEp1bCAxNSAwOTo1OTowMSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBjb21waWxlLmM6IFJlc2V0IEhNT0RFIGJhY2sgdG8gemVybyAoYWNjaWRlbnRseSBzZXQgaXQgdG8gMSkuCisKKwkqIHJ1bi5jIChtYWluKTogSWYgaDgvMzAwaCBiaW5hcnkgZGV0ZWN0ZWQsIGNhbGwgc2V0X2g4MzAwaC4KKwkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IEZpeCBPX05FRyBpbnNuLgorCitGcmkgSnVsICA5IDE0OjM2OjQ4IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIHJ1bi5jIChtYWluKTogQWRkIC1oIGZsYWcgdG8gZW5hYmxlIGg4LzMwMGggZW11bGF0aW9uLgorCSogY29tcGlsZS5jOiBSZW5hbWUgSG1vZGUgdG8gSE1PREUgKGNvbnNpc3RlbmN5IHdpdGggZ2RiKS4KKwkoc2V0X2g4MzAwaCk6IE5ldyBmdW5jdGlvbi4KKwkoc2ltX3Jlc3VtZSk6IEFkZCBzdXBwb3J0IGZvciBleHR1LGV4dHMgaW5zbnMuCisJKHNpbV9yZXN1bWUpOiBGaXggbG9naWNhbCByaWdodCBzaGlmdGluZy4KKwkoc2ltX3Jlc3VtZSwgbGFiZWwgYWx1MzIpOiBGaXggc2V0dGluZyBvZiBjYXJyeSBmbGFnLgorCQorU3VuIEp1bCAgNCAwMDozNTo0MSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBjb21waWxlLmMgKHNpbV9jc2l6ZSk6IEluaXRpYWxpemUgY3B1LmNhY2hlLgorCitGcmkgSnVsICAyIDE3OjQyOjU5IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBBZGQgLUkuLi8uLi9iZmQgdG8gcGljayB1cCBiZmQuaC4KKworVGh1IEp1biAyNCAxMzo0MDoxMiAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBydW4uYyAobWFpbik6IEZpeCBwYXJzaW5nIG9mIGFyZ3MuCisKKwkqIGNvbXBpbGUuYyAoc2ltX3Jlc3VtZSk6IEZpeCBzaGxsIGluc24uCisKK1R1ZSBKdW4gIDggMTQ6MTY6NDYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogY29tcGlsZS5jOiBOZXcgZmlsZSwgc3VwcG9ydHMgSDgvMzAwSC4KKwkqIHAxLHAzLCBnZW5jb2RlLmMsIHN0YXRlLmgsIHdyaXRlY29kZS5jIEFsbCBkZWFkIGFuZCBvYnNvbGV0ZS4KKworVHVlIEp1biAgMSAxMToxNDo1OSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogcnVuLmMgKG1haW4pOiBBZGQgLXYgdG8gcHJpbnQgaW5mby4KKwkqIHAzLmMgKHNpbV9pbmZvKTogIE5ldyBmdW5jdGlvbi4KKworTW9uIE1hciAxNSAxNTo0ODozMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIGg4MzAwLm10IChET19JTlNUQUxMKTogUmVuYW1lZCBmcm9tIElOU1RBTEwuCisKK1dlZCBNYXIgIDMgMTU6MDY6NTMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcG9zZWlkb24uY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW46IERvbid0IHVzZSBjYiBvciBpbmRlbnQKKwkqIHAxLmMsIHN0YXRlLmgsIHdyaXRlY29kZS5jOiBsaW50CisKK01vbiBGZWIgIDEgMTY6NDQ6NTggMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgTWFrZSBTdW5PUyBoYWxmZG9uZSBWUEFUSCB3b3JrLgorCSogcDEuYzogIExpbnQgcGlja2VkIHVwIGJ5IEhQIG5hdGl2ZSBjb21waWxlci4KKworTW9uIEphbiAgNCAxMjozMjozNSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B3YWhpbmkuY3lnbnVzLmNvbSkKKworCSogcDEuYyAoc2ltX3Jlc3VtZSk6IHdoZW4gcnVubmluZyBvbiBkb3MsIGFueSBjaGFyYWN0ZXIgdHlwZWQgdG8KKwl0aGUga2V5Ym9hcmQgd2lsbCBjYXVzZSBhIHNpbXVsYXRlZCBleGNlcHRpb24uCisKK1N1biBKYW4gIDMgMTQ6MTU6MDcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIHAxLmMsIHAzLmMsIHJ1bi5jLCB3cml0ZWNvZGUuYzogYWxsIHVzZWQgaDgvMzAwIG9wY29kZXMgaW4gYW5kCisJcnVubmluZworCitUdWUgRGVjIDIyIDEzOjU2OjQ4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBuZXcgCisKZGlmZiAtLWdpdCBhL3NpbS9oODMwMC9NYWtlZmlsZS5pbiBiL3NpbS9oODMwMC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjdlMmU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2g4MzAwL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMjUgQEAKKyMgICAgTWFrZWZpbGUgdGVtcGxhdGUgZm9yIENvbmZpZ3VyZSBmb3IgdGhlIGg4MzAwIHNpbSBsaWJyYXJ5LgorIyAgICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIyBDT01NT05fUFJFX0NPTkZJR19GUkFHCisKK1NJTV9PQkpTID0gY29tcGlsZS5vIHNpbS1sb2FkLm8KKworIyMgQ09NTU9OX1BPU1RfQ09ORklHX0ZSQUcKKworY29tcGlsZS5vOiBjb21waWxlLmMgY29uZmlnLmgKZGlmZiAtLWdpdCBhL3NpbS9oODMwMC9hY2NvbmZpZy5oIGIvc2ltL2g4MzAwL2FjY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliODdhMQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9oODMwMC9hY2NvbmZpZy5oCkBAIC0wLDAgKzEsMTUgQEAKKworLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCisjdW5kZWYgRU5BQkxFX05MUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCisjdW5kZWYgSEFWRV9DQVRHRVRTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0dFVFRFWFQKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCisjdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwpkaWZmIC0tZ2l0IGEvc2ltL2g4MzAwL2NvbXBpbGUuYyBiL3NpbS9oODMwMC9jb21waWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxZmQ5YwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9oODMwMC9jb21waWxlLmMKQEAgLTAsMCArMSwyMTY5IEBACisvKgorICogU2ltdWxhdG9yIGZvciB0aGUgSGl0YWNoaSBIOC8zMDAgYXJjaGl0ZWN0dXJlLgorICoKKyAqIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuIHNhY0BjeWdudXMuY29tCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgSDgvMzAwIHNpbQorICoKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIE5PVCBDT1BZUklHSFRFRAorICoKKyAqIEN5Z251cyBvZmZlcnMgdGhlIGZvbGxvd2luZyBmb3IgdXNlIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgQ3lnbnVzIG1ha2VzIG5vCisgKiB3YXJyYW50eSB3aXRoIHJlZ2FyZCB0byB0aGUgc29mdHdhcmUgb3IgaXRzIHBlcmZvcm1hbmNlIGFuZCB0aGUgdXNlcgorICogYWNjZXB0cyB0aGUgc29mdHdhcmUgIkFTIElTIiB3aXRoIGFsbCBmYXVsdHMuCisgKgorICogQ1lHTlVTIERJU0NMQUlNUyBBTlkgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBXSVRIIFJFR0FSRCBUTyBUSElTCisgKiBTT0ZUV0FSRSBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorICogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaWZkZWYgSEFWRV9USU1FX0gKKyNpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKyNpbmNsdWRlICJ3YWl0LmgiCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIKKworI2lmbmRlZiBTSUdUUkFQCisjIGRlZmluZSBTSUdUUkFQIDUKKyNlbmRpZgorCitpbnQgZGVidWc7CisKK2hvc3RfY2FsbGJhY2sgKnNpbV9jYWxsYmFjazsKKworc3RhdGljIFNJTV9PUEVOX0tJTkQgc2ltX2tpbmQ7CitzdGF0aWMgY2hhciAqbXluYW1lOworCisvKiBGSVhNRTogTmVlZHMgdG8gbGl2ZSBpbiBoZWFkZXIgZmlsZS4KKyAgIFRoaXMgaGVhZGVyIHNob3VsZCBhbHNvIGluY2x1ZGUgdGhlIHRoaW5ncyBpbiByZW1vdGUtc2ltLmguCisgICBPbmUgY291bGQgbW92ZSB0aGlzIHRvIHJlbW90ZS1zaW0uaCBidXQgdGhpcyBmdW5jdGlvbiBpc24ndCBuZWVkZWQKKyAgIGJ5IGdkYi4gICovCit2b2lkIHNpbV9zZXRfc2ltY2FjaGVfc2l6ZSBQQVJBTVMgKChpbnQpKTsKKworI2RlZmluZSBYKG9wLCBzaXplKSAgb3AqNCtzaXplCisKKyNkZWZpbmUgU1AgKGg4MzAwaG1vZGUgPyBTTDpTVykKKyNkZWZpbmUgU0IgMAorI2RlZmluZSBTVyAxCisjZGVmaW5lIFNMIDIKKyNkZWZpbmUgT1BfUkVHIDEKKyNkZWZpbmUgT1BfREVDIDIKKyNkZWZpbmUgT1BfRElTUCAzCisjZGVmaW5lIE9QX0lOQyA0CisjZGVmaW5lIE9QX1BDUkVMIDUKKyNkZWZpbmUgT1BfTUVNIDYKKyNkZWZpbmUgT1BfQ0NSIDcKKyNkZWZpbmUgT1BfSU1NIDgKKyNkZWZpbmUgT1BfQUJTIDEwCisjZGVmaW5lIGg4X29wY29kZXMgb3BzCisjZGVmaW5lIERFRklORV9UQUJMRQorI2luY2x1ZGUgIm9wY29kZS9oODMwMC5oIgorCisjaW5jbHVkZSAiaW5zdC5oIgorCisjZGVmaW5lIExPV19CWVRFKHgpICgoeCkgJiAweGZmKQorI2RlZmluZSBISUdIX0JZVEUoeCkgKCgoeCk+PjgpICYgMHhmZikKKyNkZWZpbmUgUChYLFkpICgoWDw8OCkgfCBZKQorCisjZGVmaW5lIEJVSUxEU1IoKSAgIGNwdS5jY3IgPSAoTiA8PCAzKSB8IChaIDw8IDIpIHwgKFY8PDEpIHwgQzsKKworI2RlZmluZSBHRVRTUigpCQkgICAgXAorICBjID0gKGNwdS5jY3IgPj4gMCkgJiAxO1wKKyAgdiA9IChjcHUuY2NyID4+IDEpICYgMTtcCisgIG56ID0gISgoY3B1LmNjciA+PiAyKSAmIDEpO1wKKyAgbiA9IChjcHUuY2NyID4+IDMpICYgMTsKKworI2lmZGVmIF9fQ0hBUl9JU19TSUdORURfXworI2RlZmluZSBTRVhUQ0hBUih4KSAoKGNoYXIpKHgpKQorI2VuZGlmCisKKyNpZm5kZWYgU0VYVENIQVIKKyNkZWZpbmUgU0VYVENIQVIoeCkgKCh4ICYgMHg4MCkgPyAoeCB8IH4weGZmKTogeCAmIDB4ZmYpCisjZW5kaWYKKworI2RlZmluZSBVRVhUQ0hBUih4KSAoKHgpICYgMHhmZikKKyNkZWZpbmUgVUVYVFNIT1JUKHgpICgoeCkgJiAweGZmZmYpCisjZGVmaW5lIFNFWFRTSE9SVCh4KSAoKHNob3J0KSh4KSkKKworc3RhdGljIGNwdV9zdGF0ZV90eXBlIGNwdTsKKworaW50IGg4MzAwaG1vZGUgPSAwOworaW50IGg4MzAwc21vZGUgPSAwOworCitzdGF0aWMgaW50IG1lbW9yeV9zaXplOworCisKK3N0YXRpYyBpbnQKK2dldF9ub3cgKCkKK3sKKyNpZm5kZWYgV0lOMzIKKyAgcmV0dXJuIHRpbWUgKDApOworI2VuZGlmCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Citub3dfcGVyc2VjICgpCit7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQKK2JpdGZyb20gKHgpCit7CisgIHN3aXRjaCAoeCAmIFNJWkUpCisgICAgeworICAgIGNhc2UgTF84OgorICAgICAgcmV0dXJuIFNCOworICAgIGNhc2UgTF8xNjoKKyAgICAgIHJldHVybiBTVzsKKyAgICBjYXNlIExfMzI6CisgICAgICByZXR1cm4gU0w7CisgICAgY2FzZSBMX1A6CisgICAgICByZXR1cm4gaDgzMDBobW9kZSA/IFNMIDogU1c7CisgICAgfQorfQorCitzdGF0aWMKK3Vuc2lnbmVkIGludAorbHZhbHVlICh4LCBybikKK3sKKyAgc3dpdGNoICh4IC8gNCkKKyAgICB7CisgICAgY2FzZSBPUF9ESVNQOgorICAgICAgaWYgKHJuID09IDgpCisJeworCSAgcmV0dXJuIFggKE9QX0lNTSwgU1ApOworCX0KKyAgICAgIHJldHVybiBYIChPUF9SRUcsIFNQKTsKKworICAgIGNhc2UgT1BfTUVNOgorCisgICAgICByZXR1cm4gWCAoT1BfTUVNLCBTUCk7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworc3RhdGljIHVuc2lnbmVkIGludAorZGVjb2RlIChhZGRyLCBkYXRhLCBkc3QpCisgICAgIGludCBhZGRyOworICAgICB1bnNpZ25lZCBjaGFyICpkYXRhOworICAgICBkZWNvZGVkX2luc3QgKmRzdDsKKworeworICBpbnQgcnMgPSAwOworICBpbnQgcmQgPSAwOworICBpbnQgcmRpc3AgPSAwOworICBpbnQgYWJzID0gMDsKKyAgaW50IHBsZW4gPSAwOworICBpbnQgYml0ID0gMDsKKworICBzdHJ1Y3QgaDhfb3Bjb2RlICpxID0gaDhfb3Bjb2RlczsKKyAgaW50IHNpemUgPSAwOworICBkc3QtPmRzdC50eXBlID0gLTE7CisgIGRzdC0+c3JjLnR5cGUgPSAtMTsKKyAgLyogRmluZCB0aGUgZXhhY3Qgb3Bjb2RlL2FyZyBjb21ibyAqLworICB3aGlsZSAocS0+bmFtZSkKKyAgICB7CisgICAgICBvcF90eXBlICpuaWI7CisgICAgICB1bnNpZ25lZCBpbnQgbGVuID0gMDsKKworICAgICAgbmliID0gcS0+ZGF0YS5uaWI7CisKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIG9wX3R5cGUgbG9va2luZ19mb3IgPSAqbmliOworCSAgaW50IHRoaXNuaWIgPSBkYXRhW2xlbiA+PiAxXTsKKworCSAgdGhpc25pYiA9IChsZW4gJiAxKSA/ICh0aGlzbmliICYgMHhmKSA6ICgodGhpc25pYiA+PiA0KSAmIDB4Zik7CisKKwkgIGlmIChsb29raW5nX2ZvciA8IDE2ICYmIGxvb2tpbmdfZm9yID49IDApCisJICAgIHsKKwkgICAgICBpZiAobG9va2luZ19mb3IgIT0gdGhpc25pYikKKwkJZ290byBmYWlsOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoKGludCkgbG9va2luZ19mb3IgJiAoaW50KSBCMzEpCisJCXsKKwkJICBpZiAoISgoKGludCkgdGhpc25pYiAmIDB4OCkgIT0gMCkpCisJCSAgICBnb3RvIGZhaWw7CisJCSAgbG9va2luZ19mb3IgPSAob3BfdHlwZSkgKChpbnQpIGxvb2tpbmdfZm9yICYgfihpbnQpCisJCQkJCSAgIEIzMSk7CisJCSAgdGhpc25pYiAmPSAweDc7CisJCX0KKwkgICAgICBpZiAoKGludCkgbG9va2luZ19mb3IgJiAoaW50KSBCMzApCisJCXsKKwkJICBpZiAoISgoKGludCkgdGhpc25pYiAmIDB4OCkgPT0gMCkpCisJCSAgICBnb3RvIGZhaWw7CisJCSAgbG9va2luZ19mb3IgPSAob3BfdHlwZSkgKChpbnQpIGxvb2tpbmdfZm9yICYgfihpbnQpIEIzMCk7CisJCX0KKwkgICAgICBpZiAobG9va2luZ19mb3IgJiBEQklUKQorCQl7CisJCSAgaWYgKChsb29raW5nX2ZvciAmIDUpICE9ICh0aGlzbmliICYgNSkpCisJCSAgICBnb3RvIGZhaWw7CisJCSAgYWJzID0gKHRoaXNuaWIgJiAweDgpID8gMiA6IDE7CisJCX0KKwkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIChSRUcgfCBJTkQgfCBJTkMgfCBERUMpKQorCQl7CisJCSAgaWYgKGxvb2tpbmdfZm9yICYgUkVHKQorCQkgICAgeworCQkgICAgICAvKgorCQkgICAgICAgKiBDYW4gd29yayBvdXQgc2l6ZSBmcm9tIHRoZQorCQkgICAgICAgKiByZWdpc3RlcgorCQkgICAgICAgKi8KKwkJICAgICAgc2l6ZSA9IGJpdGZyb20gKGxvb2tpbmdfZm9yKTsKKwkJICAgIH0KKwkJICBpZiAobG9va2luZ19mb3IgJiBTUkMpCisJCSAgICB7CisJCSAgICAgIHJzID0gdGhpc25pYjsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIHJkID0gdGhpc25pYjsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF8xNikKKwkJeworCQkgIGFicyA9IChkYXRhW2xlbiA+PiAxXSkgKiAyNTYgKyBkYXRhWyhsZW4gKyAyKSA+PiAxXTsKKwkJICBwbGVuID0gMTY7CisJCSAgaWYgKGxvb2tpbmdfZm9yICYgKFBDUkVMIHwgRElTUCkpCisJCSAgICB7CisJCSAgICAgIGFicyA9IChzaG9ydCkgKGFicyk7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIEFCU0pNUCkKKwkJeworCQkgIGFicyA9CisJCSAgICAoZGF0YVsxXSA8PCAxNikKKwkJICAgIHwgKGRhdGFbMl0gPDwgOCkKKwkJICAgIHwgKGRhdGFbM10pOworCQl9CisJICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBNRU1JTkQpCisJCXsKKwkJICBhYnMgPSBkYXRhWzFdOworCQl9CisJICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzMyKQorCQl7CisJCSAgaW50IGkgPSBsZW4gPj4gMTsKKwkJICBhYnMgPSAoZGF0YVtpXSA8PCAyNCkKKwkJICAgIHwgKGRhdGFbaSArIDFdIDw8IDE2KQorCQkgICAgfCAoZGF0YVtpICsgMl0gPDwgOCkKKwkJICAgIHwgKGRhdGFbaSArIDNdKTsKKworCQkgIHBsZW4gPSAzMjsKKwkJfQorCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF8yNCkKKwkJeworCQkgIGludCBpID0gbGVuID4+IDE7CisJCSAgYWJzID0gKGRhdGFbaV0gPDwgMTYpIHwgKGRhdGFbaSArIDFdIDw8IDgpIHwgKGRhdGFbaSArIDJdKTsKKwkJICBwbGVuID0gMjQ7CisJCX0KKwkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIElHTk9SRSkKKwkJeworCQkgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKwkJfQorCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgRElTUFJFRykKKwkJeworCQkgIHJkaXNwID0gdGhpc25pYiAmIDB4NzsKKwkJfQorCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgS0JJVCkKKwkJeworCQkgIHN3aXRjaCAodGhpc25pYikKKwkJICAgIHsKKwkJICAgIGNhc2UgOToKKwkJICAgICAgYWJzID0gNDsKKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlIDg6CisJCSAgICAgIGFicyA9IDI7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAwOgorCQkgICAgICBhYnMgPSAxOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgTF84KQorCQl7CisJCSAgcGxlbiA9IDg7CisKKwkJICBpZiAobG9va2luZ19mb3IgJiBQQ1JFTCkKKwkJICAgIHsKKwkJICAgICAgYWJzID0gU0VYVENIQVIgKGRhdGFbbGVuID4+IDFdKTsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChsb29raW5nX2ZvciAmIEFCUzhNRU0pCisJCSAgICB7CisJCSAgICAgIHBsZW4gPSA4OworCQkgICAgICBhYnMgPSBoODMwMGhtb2RlID8gfjB4ZmYwMDAwZmYgOiB+MHhmZmZmMDBmZjsKKwkJICAgICAgYWJzIHw9IGRhdGFbbGVuID4+IDFdICYgMHhmZiA7CisJCSAgICB9CisJCSAgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgYWJzID0gZGF0YVtsZW4gPj4gMV0gJiAweGZmOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzMpCisJCXsKKwkJICBwbGVuID0gMzsKKworCQkgIGJpdCA9IHRoaXNuaWI7CisJCX0KKwkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciA9PSBFKQorCQl7CisJCSAgZHN0LT5vcCA9IHE7CisKKwkJICAvKiBGaWxsIGluIHRoZSBhcmdzICovCisJCSAgeworCQkgICAgb3BfdHlwZSAqYXJncyA9IHEtPmFyZ3MubmliOworCQkgICAgaW50IGhhZG9uZSA9IDA7CisKKwkJICAgIHdoaWxlICgqYXJncyAhPSBFKQorCQkgICAgICB7CisJCQlpbnQgeCA9ICphcmdzOworCQkJaW50IHJuID0gKHggJiBEU1QpID8gcmQgOiByczsKKwkJCWVhX3R5cGUgKnA7CisKKwkJCWlmICh4ICYgRFNUKQorCQkJICB7CisJCQkgICAgcCA9ICYoZHN0LT5kc3QpOworCQkJICB9CisJCQllbHNlCisJCQkgIHsKKwkJCSAgICBwID0gJihkc3QtPnNyYyk7CisJCQkgIH0KKworCQkJaWYgKHggJiAoTF8zKSkKKwkJCSAgeworCQkJICAgIHAtPnR5cGUgPSBYIChPUF9JTU0sIHNpemUpOworCQkJICAgIHAtPmxpdGVyYWwgPSBiaXQ7CisJCQkgIH0KKwkJCWVsc2UgaWYgKHggJiAoSU1NIHwgS0JJVCB8IERCSVQpKQorCQkJICB7CisJCQkgICAgcC0+dHlwZSA9IFggKE9QX0lNTSwgc2l6ZSk7CisJCQkgICAgcC0+bGl0ZXJhbCA9IGFiczsKKwkJCSAgfQorCQkJZWxzZSBpZiAoeCAmIFJFRykKKwkJCSAgeworCQkJICAgIC8qIFJlc2V0IHRoZSBzaXplLCBzb21lCisJCQkgICAgICAgb3BzIChsaWtlIG11bCkgaGF2ZSB0d28gc2l6ZXMgKi8KKworCQkJICAgIHNpemUgPSBiaXRmcm9tICh4KTsKKwkJCSAgICBwLT50eXBlID0gWCAoT1BfUkVHLCBzaXplKTsKKwkJCSAgICBwLT5yZWcgPSBybjsKKwkJCSAgfQorCQkJZWxzZSBpZiAoeCAmIElOQykKKwkJCSAgeworCQkJICAgIHAtPnR5cGUgPSBYIChPUF9JTkMsIHNpemUpOworCQkJICAgIHAtPnJlZyA9IHJuICYgMHg3OworCQkJICB9CisJCQllbHNlIGlmICh4ICYgREVDKQorCQkJICB7CisJCQkgICAgcC0+dHlwZSA9IFggKE9QX0RFQywgc2l6ZSk7CisJCQkgICAgcC0+cmVnID0gcm4gJiAweDc7CisJCQkgIH0KKwkJCWVsc2UgaWYgKHggJiBJTkQpCisJCQkgIHsKKwkJCSAgICBwLT50eXBlID0gWCAoT1BfRElTUCwgc2l6ZSk7CisJCQkgICAgcC0+cmVnID0gcm4gJiAweDc7CisJCQkgICAgcC0+bGl0ZXJhbCA9IDA7CisJCQkgIH0KKwkJCWVsc2UgaWYgKHggJiAoQUJTIHwgQUJTSk1QIHwgQUJTOE1FTSkpCisJCQkgIHsKKwkJCSAgICBwLT50eXBlID0gWCAoT1BfRElTUCwgc2l6ZSk7CisJCQkgICAgcC0+bGl0ZXJhbCA9IGFiczsKKwkJCSAgICBwLT5yZWcgPSA4OworCQkJICB9CisJCQllbHNlIGlmICh4ICYgTUVNSU5EKQorCQkJICB7CisJCQkgICAgcC0+dHlwZSA9IFggKE9QX01FTSwgc2l6ZSk7CisJCQkgICAgcC0+bGl0ZXJhbCA9IGFiczsKKwkJCSAgfQorCQkJZWxzZSBpZiAoeCAmIFBDUkVMKQorCQkJICB7CisJCQkgICAgcC0+dHlwZSA9IFggKE9QX1BDUkVMLCBzaXplKTsKKwkJCSAgICBwLT5saXRlcmFsID0gYWJzICsgYWRkciArIDI7CisJCQkgICAgaWYgKHggJiBMXzE2KQorCQkJICAgICAgcC0+bGl0ZXJhbCArPSAyOworCQkJICB9CisJCQllbHNlIGlmICh4ICYgQUJTSk1QKQorCQkJICB7CisJCQkgICAgcC0+dHlwZSA9IFggKE9QX0lNTSwgU1ApOworCQkJICAgIHAtPmxpdGVyYWwgPSBhYnM7CisJCQkgIH0KKwkJCWVsc2UgaWYgKHggJiBESVNQKQorCQkJICB7CisJCQkgICAgcC0+dHlwZSA9IFggKE9QX0RJU1AsIHNpemUpOworCQkJICAgIHAtPmxpdGVyYWwgPSBhYnM7CisJCQkgICAgcC0+cmVnID0gcmRpc3AgJiAweDc7CisJCQkgIH0KKwkJCWVsc2UgaWYgKHggJiBDQ1IpCisJCQkgIHsKKwkJCSAgICBwLT50eXBlID0gT1BfQ0NSOworCQkJICB9CisJCQllbHNlCisJCQkgIHByaW50ZiAoIkhtbW1tICV4IiwgeCk7CisKKwkJCWFyZ3MrKzsKKwkJICAgICAgfQorCQkgIH0KKworCQkgIC8qCisJCSAgICAgKiBCdXQgYSBqbXAgb3IgYSBqc3IgZ2V0cworCQkgICAgICogYXV0b21hZ2ljYWxseSBsdmFsdWVkLCBzaW5jZSB3ZQorCQkgICAgICogYnJhbmNoIHRvIHRoZWlyIGFkZHJlc3Mgbm90IHRoZWlyCisJCSAgICAgKiBjb250ZW50cworCQkgICAqLworCQkgIGlmIChxLT5ob3cgPT0gTyAoT19KU1IsIFNCKQorCQkgICAgICB8fCBxLT5ob3cgPT0gTyAoT19KTVAsIFNCKSkKKwkJICAgIHsKKwkJICAgICAgZHN0LT5zcmMudHlwZSA9IGx2YWx1ZSAoZHN0LT5zcmMudHlwZSwgZHN0LT5zcmMucmVnKTsKKwkJICAgIH0KKworCQkgIGlmIChkc3QtPmRzdC50eXBlID09IC0xKQorCQkgICAgZHN0LT5kc3QgPSBkc3QtPnNyYzsKKworCQkgIGRzdC0+b3Bjb2RlID0gcS0+aG93OworCQkgIGRzdC0+Y3ljbGVzID0gcS0+dGltZTsKKworCQkgIC8qIEFuZCBhIGpzciB0byAweGM0IGlzIHR1cm5lZCBpbnRvIGEgbWFnaWMgdHJhcCAqLworCisJCSAgaWYgKGRzdC0+b3Bjb2RlID09IE8gKE9fSlNSLCBTQikpCisJCSAgICB7CisJCSAgICAgIGlmIChkc3QtPnNyYy5saXRlcmFsID09IDB4YzQpCisJCQl7CisJCQkgIGRzdC0+b3Bjb2RlID0gTyAoT19TWVNDQUxMLCBTQik7CisJCQl9CisJCSAgICB9CisKKwkJICBkc3QtPm5leHRfcGMgPSBhZGRyICsgbGVuIC8gMjsKKwkJICByZXR1cm47CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBwcmludGYgKCJEb250IHVuZGVyc3RhbmQgJXggXG4iLCBsb29raW5nX2Zvcik7CisJCX0KKwkgICAgfQorCisJICBsZW4rKzsKKwkgIG5pYisrOworCX0KKworICAgIGZhaWw6CisgICAgICBxKys7CisgICAgfQorCisgIGRzdC0+b3Bjb2RlID0gTyAoT19JTEwsIFNCKTsKK30KKworCitzdGF0aWMgdm9pZAorY29tcGlsZSAocGMpCit7CisgIGludCBpZHg7CisKKyAgLyogZmluZCB0aGUgbmV4dCBjYWNoZSBlbnRyeSB0byB1c2UgKi8KKworICBpZHggPSBjcHUuY2FjaGVfdG9wICsgMTsKKyAgY3B1LmNvbXBpbGVzKys7CisgIGlmIChpZHggPj0gY3B1LmNzaXplKQorICAgIHsKKyAgICAgIGlkeCA9IDE7CisgICAgfQorICBjcHUuY2FjaGVfdG9wID0gaWR4OworCisgIC8qIFRocm93IGF3YXkgaXRzIG9sZCBtZWFuaW5nICovCisgIGNwdS5jYWNoZV9pZHhbY3B1LmNhY2hlW2lkeF0ub2xkcGNdID0gMDsKKworICAvKiBzZXQgdG8gbmV3IGFkZHJlc3MgKi8KKyAgY3B1LmNhY2hlW2lkeF0ub2xkcGMgPSBwYzsKKworICAvKiBmaWxsIGluIGluc3RydWN0aW9uIGluZm8gKi8KKyAgZGVjb2RlIChwYywgY3B1Lm1lbW9yeSArIHBjLCBjcHUuY2FjaGUgKyBpZHgpOworCisgIC8qIHBvaW50IHRvIG5ldyBjYWNoZSBlbnRyeSAqLworICBjcHUuY2FjaGVfaWR4W3BjXSA9IGlkeDsKK30KKworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqYnJlZ1sxOF07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgKndyZWdbMThdOworc3RhdGljIHVuc2lnbmVkIGludCAqbHJlZ1sxOF07CisKKyNkZWZpbmUgR0VUX0JfUkVHKHgpICooYnJlZ1t4XSkKKyNkZWZpbmUgU0VUX0JfUkVHKHgseSkgKCooYnJlZ1t4XSkpID0gKHkpCisjZGVmaW5lIEdFVF9XX1JFRyh4KSAqKHdyZWdbeF0pCisjZGVmaW5lIFNFVF9XX1JFRyh4LHkpICgqKHdyZWdbeF0pKSA9ICh5KQorCisjZGVmaW5lIEdFVF9MX1JFRyh4KSAqKGxyZWdbeF0pCisjZGVmaW5lIFNFVF9MX1JFRyh4LHkpICgqKGxyZWdbeF0pKSA9ICh5KQorCisjZGVmaW5lIEdFVF9NRU1PUllfTCh4KSBcCisgICh4IDwgbWVtb3J5X3NpemUgXAorICAgPyAoKGNwdS5tZW1vcnlbeCswXSA8PCAyNCkgfCAoY3B1Lm1lbW9yeVt4KzFdIDw8IDE2KSBcCisgICAgICB8IChjcHUubWVtb3J5W3grMl0gPDwgOCkgfCBjcHUubWVtb3J5W3grM10pIFwKKyAgIDogKChjcHUuZWlnaHRiaXRbKHgrMCkgJiAweGZmXSA8PCAyNCkgfCAoY3B1LmVpZ2h0Yml0Wyh4KzEpICYgMHhmZl0gPDwgMTYpIFwKKyAgICAgIHwgKGNwdS5laWdodGJpdFsoeCsyKSAmIDB4ZmZdIDw8IDgpIHwgY3B1LmVpZ2h0Yml0Wyh4KzMpICYgMHhmZl0pKQorCisjZGVmaW5lIEdFVF9NRU1PUllfVyh4KSBcCisgICh4IDwgbWVtb3J5X3NpemUgXAorICAgPyAoKGNwdS5tZW1vcnlbeCswXSA8PCA4KSB8IChjcHUubWVtb3J5W3grMV0gPDwgMCkpIFwKKyAgIDogKChjcHUuZWlnaHRiaXRbKHgrMCkgJiAweGZmXSA8PCA4KSB8IChjcHUuZWlnaHRiaXRbKHgrMSkgJiAweGZmXSA8PCAwKSkpCisKKworI2RlZmluZSBHRVRfTUVNT1JZX0IoeCkgXAorICAoeCA8IG1lbW9yeV9zaXplID8gKGNwdS5tZW1vcnlbeF0pIDogKGNwdS5laWdodGJpdFt4ICYgMHhmZl0pKQorCisjZGVmaW5lIFNFVF9NRU1PUllfTCh4LHkpICBcCit7ICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpfcDsgcmVnaXN0ZXIgaW50IF9feSA9IHk7IFwKKyAgIF9wID0gKHggPCBtZW1vcnlfc2l6ZSA/IGNwdS5tZW1vcnkreCA6IGNwdS5laWdodGJpdCArICh4ICYgMHhmZikpOyBcCisgICBfcFswXSA9IChfX3kpPj4yNDsgX3BbMV0gPSAoX195KT4+MTY7IFwKKyAgIF9wWzJdID0gKF9feSk+Pjg7IF9wWzNdID0gKF9feSk+PjA7fQorCisjZGVmaW5lIFNFVF9NRU1PUllfVyh4LHkpIFwKK3sgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKl9wOyByZWdpc3RlciBpbnQgX195ID0geTsgXAorICAgX3AgPSAoeCA8IG1lbW9yeV9zaXplID8gY3B1Lm1lbW9yeSt4IDogY3B1LmVpZ2h0Yml0ICsgKHggJiAweGZmKSk7IFwKKyAgIF9wWzBdID0gKF9feSk+Pjg7IF9wWzFdID0oX195KTt9CisKKyNkZWZpbmUgU0VUX01FTU9SWV9CKHgseSkgXAorICAoeCA8IG1lbW9yeV9zaXplID8gKGNwdS5tZW1vcnlbKHgpXSA9IHkpIDogKGNwdS5laWdodGJpdFt4ICYgMHhmZl0gPSB5KSkKKworaW50CitmZXRjaCAoYXJnLCBuKQorICAgICBlYV90eXBlICphcmc7Cit7CisgIGludCBybiA9IGFyZy0+cmVnOworICBpbnQgYWJzID0gYXJnLT5saXRlcmFsOworICBpbnQgcjsKKyAgaW50IHQ7CisKKyAgc3dpdGNoIChhcmctPnR5cGUpCisgICAgeworICAgIGNhc2UgWCAoT1BfUkVHLCBTQik6CisgICAgICByZXR1cm4gR0VUX0JfUkVHIChybik7CisgICAgY2FzZSBYIChPUF9SRUcsIFNXKToKKyAgICAgIHJldHVybiBHRVRfV19SRUcgKHJuKTsKKyAgICBjYXNlIFggKE9QX1JFRywgU0wpOgorICAgICAgcmV0dXJuIEdFVF9MX1JFRyAocm4pOworICAgIGNhc2UgWCAoT1BfSU1NLCBTQik6CisgICAgY2FzZSBYIChPUF9JTU0sIFNXKToKKyAgICBjYXNlIFggKE9QX0lNTSwgU0wpOgorICAgICAgcmV0dXJuIGFiczsKKyAgICBjYXNlIFggKE9QX0RFQywgU0IpOgorICAgICAgYWJvcnQgKCk7CisKKyAgICBjYXNlIFggKE9QX0lOQywgU0IpOgorICAgICAgdCA9IEdFVF9MX1JFRyAocm4pOworICAgICAgdCAmPSBjcHUubWFzazsKKyAgICAgIHIgPSBHRVRfTUVNT1JZX0IgKHQpOworICAgICAgdCsrOworICAgICAgdCA9IHQgJiBjcHUubWFzazsKKyAgICAgIFNFVF9MX1JFRyAocm4sIHQpOworICAgICAgcmV0dXJuIHI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFggKE9QX0lOQywgU1cpOgorICAgICAgdCA9IEdFVF9MX1JFRyAocm4pOworICAgICAgdCAmPSBjcHUubWFzazsKKyAgICAgIHIgPSBHRVRfTUVNT1JZX1cgKHQpOworICAgICAgdCArPSAyOworICAgICAgdCA9IHQgJiBjcHUubWFzazsKKyAgICAgIFNFVF9MX1JFRyAocm4sIHQpOworICAgICAgcmV0dXJuIHI7CisgICAgY2FzZSBYIChPUF9JTkMsIFNMKToKKyAgICAgIHQgPSBHRVRfTF9SRUcgKHJuKTsKKyAgICAgIHQgJj0gY3B1Lm1hc2s7CisgICAgICByID0gR0VUX01FTU9SWV9MICh0KTsKKworICAgICAgdCArPSA0OworICAgICAgdCA9IHQgJiBjcHUubWFzazsKKyAgICAgIFNFVF9MX1JFRyAocm4sIHQpOworICAgICAgcmV0dXJuIHI7CisKKyAgICBjYXNlIFggKE9QX0RJU1AsIFNCKToKKyAgICAgIHQgPSBHRVRfTF9SRUcgKHJuKSArIGFiczsKKyAgICAgIHQgJj0gY3B1Lm1hc2s7CisgICAgICByZXR1cm4gR0VUX01FTU9SWV9CICh0KTsKKworICAgIGNhc2UgWCAoT1BfRElTUCwgU1cpOgorICAgICAgdCA9IEdFVF9MX1JFRyAocm4pICsgYWJzOworICAgICAgdCAmPSBjcHUubWFzazsKKyAgICAgIHJldHVybiBHRVRfTUVNT1JZX1cgKHQpOworCisgICAgY2FzZSBYIChPUF9ESVNQLCBTTCk6CisgICAgICB0ID0gR0VUX0xfUkVHIChybikgKyBhYnM7CisgICAgICB0ICY9IGNwdS5tYXNrOworICAgICAgcmV0dXJuIEdFVF9NRU1PUllfTCAodCk7CisKKyAgICBjYXNlIFggKE9QX01FTSwgU0wpOgorICAgICAgdCA9IEdFVF9NRU1PUllfTCAoYWJzKTsKKyAgICAgIHQgJj0gY3B1Lm1hc2s7CisgICAgICByZXR1cm4gdDsKKworICAgIGNhc2UgWCAoT1BfTUVNLCBTVyk6CisgICAgICB0ID0gR0VUX01FTU9SWV9XIChhYnMpOworICAgICAgdCAmPSBjcHUubWFzazsKKyAgICAgIHJldHVybiB0OworCisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworCisgICAgfQorfQorCisKK3N0YXRpYwordm9pZAorc3RvcmUgKGFyZywgbikKKyAgICAgZWFfdHlwZSAqYXJnOworICAgICBpbnQgbjsKK3sKKyAgaW50IHJuID0gYXJnLT5yZWc7CisgIGludCBhYnMgPSBhcmctPmxpdGVyYWw7CisgIGludCB0OworCisgIHN3aXRjaCAoYXJnLT50eXBlKQorICAgIHsKKyAgICBjYXNlIFggKE9QX1JFRywgU0IpOgorICAgICAgU0VUX0JfUkVHIChybiwgbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFggKE9QX1JFRywgU1cpOgorICAgICAgU0VUX1dfUkVHIChybiwgbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFggKE9QX1JFRywgU0wpOgorICAgICAgU0VUX0xfUkVHIChybiwgbik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgWCAoT1BfREVDLCBTQik6CisgICAgICB0ID0gR0VUX0xfUkVHIChybikgLSAxOworICAgICAgdCAmPSBjcHUubWFzazsKKyAgICAgIFNFVF9MX1JFRyAocm4sIHQpOworICAgICAgU0VUX01FTU9SWV9CICh0LCBuKTsKKworICAgICAgYnJlYWs7CisgICAgY2FzZSBYIChPUF9ERUMsIFNXKToKKyAgICAgIHQgPSAoR0VUX0xfUkVHIChybikgLSAyKSAmIGNwdS5tYXNrOworICAgICAgU0VUX0xfUkVHIChybiwgdCk7CisgICAgICBTRVRfTUVNT1JZX1cgKHQsIG4pOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFggKE9QX0RFQywgU0wpOgorICAgICAgdCA9IChHRVRfTF9SRUcgKHJuKSAtIDQpICYgY3B1Lm1hc2s7CisgICAgICBTRVRfTF9SRUcgKHJuLCB0KTsKKyAgICAgIFNFVF9NRU1PUllfTCAodCwgbik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgWCAoT1BfRElTUCwgU0IpOgorICAgICAgdCA9IEdFVF9MX1JFRyAocm4pICsgYWJzOworICAgICAgdCAmPSBjcHUubWFzazsKKyAgICAgIFNFVF9NRU1PUllfQiAodCwgbik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgWCAoT1BfRElTUCwgU1cpOgorICAgICAgdCA9IEdFVF9MX1JFRyAocm4pICsgYWJzOworICAgICAgdCAmPSBjcHUubWFzazsKKyAgICAgIFNFVF9NRU1PUllfVyAodCwgbik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgWCAoT1BfRElTUCwgU0wpOgorICAgICAgdCA9IEdFVF9MX1JFRyAocm4pICsgYWJzOworICAgICAgdCAmPSBjcHUubWFzazsKKyAgICAgIFNFVF9NRU1PUllfTCAodCwgbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisKK3N0YXRpYyB1bmlvbgoreworICBzaG9ydCBpbnQgaTsKKyAgc3RydWN0CisgICAgeworICAgICAgY2hhciBsb3c7CisgICAgICBjaGFyIGhpZ2g7CisgICAgfQorICB1OworfQorCitsaXR0bGVlbmRpYW47CisKK3N0YXRpYwordm9pZAoraW5pdF9wb2ludGVycyAoKQoreworICBzdGF0aWMgaW50IGluaXQ7CisKKyAgaWYgKCFpbml0KQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBpbml0ID0gMTsKKyAgICAgIGxpdHRsZWVuZGlhbi5pID0gMTsKKworICAgICAgaWYgKGg4MzAwaG1vZGUpCisJbWVtb3J5X3NpemUgPSBIODMwMEhfTVNJWkU7CisgICAgICBlbHNlCisJbWVtb3J5X3NpemUgPSBIODMwMF9NU0laRTsKKyAgICAgIGNwdS5tZW1vcnkgPSAodW5zaWduZWQgY2hhciAqKSBjYWxsb2MgKHNpemVvZiAoY2hhciksIG1lbW9yeV9zaXplKTsKKyAgICAgIGNwdS5jYWNoZV9pZHggPSAodW5zaWduZWQgc2hvcnQgKikgY2FsbG9jIChzaXplb2YgKHNob3J0KSwgbWVtb3J5X3NpemUpOworICAgICAgY3B1LmVpZ2h0Yml0ID0gKHVuc2lnbmVkIGNoYXIgKikgY2FsbG9jIChzaXplb2YgKGNoYXIpLCAyNTYpOworCisgICAgICAvKiBgbXNpemUnIG11c3QgYmUgYSBwb3dlciBvZiB0d28gKi8KKyAgICAgIGlmICgobWVtb3J5X3NpemUgJiAobWVtb3J5X3NpemUgLSAxKSkgIT0gMCkKKwlhYm9ydCAoKTsKKyAgICAgIGNwdS5tYXNrID0gbWVtb3J5X3NpemUgLSAxOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorCXsKKwkgIGNwdS5yZWdzW2ldID0gMDsKKwl9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJeworCSAgdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopIChjcHUucmVncyArIGkpOworCSAgdW5zaWduZWQgY2hhciAqZSA9ICh1bnNpZ25lZCBjaGFyICopIChjcHUucmVncyArIGkgKyAxKTsKKwkgIHVuc2lnbmVkIHNob3J0ICpxID0gKHVuc2lnbmVkIHNob3J0ICopIChjcHUucmVncyArIGkpOworCSAgdW5zaWduZWQgc2hvcnQgKnUgPSAodW5zaWduZWQgc2hvcnQgKikgKGNwdS5yZWdzICsgaSArIDEpOworCSAgY3B1LnJlZ3NbaV0gPSAweDAwMTEyMjMzOworCSAgd2hpbGUgKHAgPCBlKQorCSAgICB7CisJICAgICAgaWYgKCpwID09IDB4MjIpCisJCXsKKwkJICBicmVnW2ldID0gcDsKKwkJfQorCSAgICAgIGlmICgqcCA9PSAweDMzKQorCQl7CisJCSAgYnJlZ1tpICsgOF0gPSBwOworCQl9CisJICAgICAgcCsrOworCSAgICB9CisJICB3aGlsZSAocSA8IHUpCisJICAgIHsKKwkgICAgICBpZiAoKnEgPT0gMHgyMjMzKQorCQl7CisJCSAgd3JlZ1tpXSA9IHE7CisJCX0KKwkgICAgICBpZiAoKnEgPT0gMHgwMDExKQorCQl7CisJCSAgd3JlZ1tpICsgOF0gPSBxOworCQl9CisJICAgICAgcSsrOworCSAgICB9CisJICBjcHUucmVnc1tpXSA9IDA7CisJICBscmVnW2ldID0gJmNwdS5yZWdzW2ldOworCX0KKworICAgICAgbHJlZ1s4XSA9ICZjcHUucmVnc1s4XTsKKworICAgICAgLyogaW5pdGlhbGl6ZSB0aGUgc2VnIHJlZ2lzdGVycyAqLworICAgICAgaWYgKCFjcHUuY2FjaGUpCisJc2ltX3NldF9zaW1jYWNoZV9zaXplIChDU0laRSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorY29udHJvbF9jIChzaWcsIGNvZGUsIHNjcCwgYWRkcikKKyAgICAgaW50IHNpZzsKKyAgICAgaW50IGNvZGU7CisgICAgIGNoYXIgKnNjcDsKKyAgICAgY2hhciAqYWRkcjsKK3sKKyAgY3B1LnN0YXRlID0gU0lNX1NUQVRFX1NUT1BQRUQ7CisgIGNwdS5leGNlcHRpb24gPSBTSUdJTlQ7Cit9CisKKyNkZWZpbmUgQyAoYyAhPSAwKQorI2RlZmluZSBaIChueiA9PSAwKQorI2RlZmluZSBWICh2ICE9IDApCisjZGVmaW5lIE4gKG4gIT0gMCkKKworc3RhdGljIGludAorbW9wIChjb2RlLCBic2l6ZSwgc2lnbikKKyAgICAgZGVjb2RlZF9pbnN0ICpjb2RlOworICAgICBpbnQgYnNpemU7CisgICAgIGludCBzaWduOworeworICBpbnQgbXVsdGlwbGllcjsKKyAgaW50IG11bHRpcGxpY2FuZDsKKyAgaW50IHJlc3VsdDsKKyAgaW50IG4sIG56OworCisgIGlmIChzaWduKQorICAgIHsKKyAgICAgIG11bHRpcGxpY2FuZCA9CisJYnNpemUgPyBTRVhUQ0hBUiAoR0VUX1dfUkVHIChjb2RlLT5kc3QucmVnKSkgOgorCVNFWFRTSE9SVCAoR0VUX1dfUkVHIChjb2RlLT5kc3QucmVnKSk7CisgICAgICBtdWx0aXBsaWVyID0KKwlic2l6ZSA/IFNFWFRDSEFSIChHRVRfQl9SRUcgKGNvZGUtPnNyYy5yZWcpKSA6CisJU0VYVFNIT1JUIChHRVRfV19SRUcgKGNvZGUtPnNyYy5yZWcpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBtdWx0aXBsaWNhbmQgPSBic2l6ZSA/IFVFWFRDSEFSIChHRVRfV19SRUcgKGNvZGUtPmRzdC5yZWcpKSA6CisJVUVYVFNIT1JUIChHRVRfV19SRUcgKGNvZGUtPmRzdC5yZWcpKTsKKyAgICAgIG11bHRpcGxpZXIgPQorCWJzaXplID8gVUVYVENIQVIgKEdFVF9CX1JFRyAoY29kZS0+c3JjLnJlZykpIDoKKwlVRVhUU0hPUlQgKEdFVF9XX1JFRyAoY29kZS0+c3JjLnJlZykpOworCisgICAgfQorICByZXN1bHQgPSBtdWx0aXBsaWVyICogbXVsdGlwbGljYW5kOworCisgIGlmIChzaWduKQorICAgIHsKKyAgICAgIG4gPSByZXN1bHQgJiAoYnNpemUgPyAweDgwMDAgOiAweDgwMDAwMDAwKTsKKyAgICAgIG56ID0gcmVzdWx0ICYgKGJzaXplID8gMHhmZmZmIDogMHhmZmZmZmZmZik7CisgICAgfQorICBpZiAoYnNpemUpCisgICAgeworICAgICAgU0VUX1dfUkVHIChjb2RlLT5kc3QucmVnLCByZXN1bHQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFNFVF9MX1JFRyAoY29kZS0+ZHN0LnJlZywgcmVzdWx0KTsKKyAgICB9CisvKiAgcmV0dXJuICgobj09MSkgPDwgMSkgfCAobno9PTEpOyAqLworCit9CisKKyNkZWZpbmUgT05PVChuYW1lLCBob3cpIFwKK2Nhc2UgTyhuYW1lLCBTQik6CQkJCVwKK3sJCQkJCQlcCisgIGludCB0OwkJCQkJXAorICBpbnQgaG0gPSAweDgwOwkJCQlcCisgIHJkID0gR0VUX0JfUkVHIChjb2RlLT5zcmMucmVnKTsJCVwKKyAgaG93OyAJCQkJCQlcCisgIGdvdG8gc2hpZnQ4OwkJCQkJXAorfSAJCQkJCQlcCitjYXNlIE8obmFtZSwgU1cpOgkJCQlcCit7IAkJCQkJCVwKKyAgaW50IHQ7CQkJCQlcCisgIGludCBobSA9IDB4ODAwMDsJCQkJXAorICByZCA9IEdFVF9XX1JFRyAoY29kZS0+c3JjLnJlZyk7IAkJXAorICBob3c7IAkJCQkJCVwKKyAgZ290byBzaGlmdDE2OwkJCQkJXAorfSAJCQkJCQlcCitjYXNlIE8obmFtZSwgU0wpOgkJCQlcCit7CQkJCQkJXAorICBpbnQgdDsJCQkJCVwKKyAgaW50IGhtID0gMHg4MDAwMDAwMDsgCQkJCVwKKyAgcmQgPSBHRVRfTF9SRUcgKGNvZGUtPnNyYy5yZWcpOwkJXAorICBob3c7IAkJCQkJCVwKKyAgZ290byBzaGlmdDMyOwkJCQkJXAorfQorCisjZGVmaW5lIE9TSElGVFMobmFtZSwgaG93MSwgaG93MikgXAorY2FzZSBPKG5hbWUsIFNCKToJCQkJXAorewkJCQkJCVwKKyAgaW50IHQ7CQkJCQlcCisgIGludCBobSA9IDB4ODA7CQkJCVwKKyAgcmQgPSBHRVRfQl9SRUcgKGNvZGUtPnNyYy5yZWcpOwkJXAorICBpZiAoKEdFVF9NRU1PUllfQiAocGMgKyAxKSAmIDB4NDApID09IDApCVwKKyAgICB7CQkJCQkJXAorICAgICAgaG93MTsJCQkJCVwKKyAgICB9CQkJCQkJXAorICBlbHNlCQkJCQkJXAorICAgIHsJCQkJCQlcCisgICAgICBob3cyOwkJCQkJXAorICAgIH0JCQkJCQlcCisgIGdvdG8gc2hpZnQ4OwkJCQkJXAorfSAJCQkJCQlcCitjYXNlIE8obmFtZSwgU1cpOgkJCQlcCit7IAkJCQkJCVwKKyAgaW50IHQ7CQkJCQlcCisgIGludCBobSA9IDB4ODAwMDsJCQkJXAorICByZCA9IEdFVF9XX1JFRyAoY29kZS0+c3JjLnJlZyk7IAkJXAorICBpZiAoKEdFVF9NRU1PUllfQiAocGMgKyAxKSAmIDB4NDApID09IDApCVwKKyAgICB7CQkJCQkJXAorICAgICAgaG93MTsJCQkJCVwKKyAgICB9CQkJCQkJXAorICBlbHNlCQkJCQkJXAorICAgIHsJCQkJCQlcCisgICAgICBob3cyOwkJCQkJXAorICAgIH0JCQkJCQlcCisgIGdvdG8gc2hpZnQxNjsJCQkJCVwKK30gCQkJCQkJXAorY2FzZSBPKG5hbWUsIFNMKToJCQkJXAorewkJCQkJCVwKKyAgaW50IHQ7CQkJCQlcCisgIGludCBobSA9IDB4ODAwMDAwMDA7IAkJCQlcCisgIHJkID0gR0VUX0xfUkVHIChjb2RlLT5zcmMucmVnKTsJCVwKKyAgaWYgKChHRVRfTUVNT1JZX0IgKHBjICsgMSkgJiAweDQwKSA9PSAwKQlcCisgICAgewkJCQkJCVwKKyAgICAgIGhvdzE7CQkJCQlcCisgICAgfQkJCQkJCVwKKyAgZWxzZQkJCQkJCVwKKyAgICB7CQkJCQkJXAorICAgICAgaG93MjsJCQkJCVwKKyAgICB9CQkJCQkJXAorICBnb3RvIHNoaWZ0MzI7CQkJCQlcCit9CisKKyNkZWZpbmUgT0JJVE9QKG5hbWUsZiwgcywgb3ApIAkJCVwKK2Nhc2UgIE8obmFtZSwgU0IpOgkJCQlcCit7CQkJCQkJXAorICBpbnQgbTsJCQkJCVwKKyAgaW50IGI7IAkJCQkJXAorICBpZiAoZikgZWEgPSBmZXRjaCAoJmNvZGUtPmRzdCk7CQlcCisgIG09MTw8IGZldGNoKCZjb2RlLT5zcmMpOwkJCVwKKyAgb3A7CQkJCQkJXAorICBpZihzKSBzdG9yZSAoJmNvZGUtPmRzdCxlYSk7IGdvdG8gbmV4dDsJXAorfQorCitpbnQKK3NpbV9zdG9wIChzZCkKKyAgICAgU0lNX0RFU0Mgc2Q7Cit7CisgIGNwdS5zdGF0ZSA9IFNJTV9TVEFURV9TVE9QUEVEOworICBjcHUuZXhjZXB0aW9uID0gU0lHSU5UOworICByZXR1cm4gMTsKK30KKwordm9pZAorc2ltX3Jlc3VtZSAoc2QsIHN0ZXAsIHNpZ2duYWwpCisgICAgIFNJTV9ERVNDIHNkOworeworICBzdGF0aWMgaW50IGluaXQxOworICBpbnQgY3ljbGVzID0gMDsKKyAgaW50IGluc3RzID0gMDsKKyAgaW50IHRpY2tfc3RhcnQgPSBnZXRfbm93ICgpOworICB2b2lkICgqcHJldikgKCk7CisgIGludCBwb2xsX2NvdW50ID0gMDsKKyAgaW50IHJlczsKKyAgaW50IHRtcDsKKyAgaW50IHJkOworICBpbnQgZWE7CisgIGludCBiaXQ7CisgIGludCBwYzsKKyAgaW50IGMsIG56LCB2LCBuOworICBpbnQgb2xkbWFzazsKKyAgaW5pdF9wb2ludGVycyAoKTsKKworICBwcmV2ID0gc2lnbmFsIChTSUdJTlQsIGNvbnRyb2xfYyk7CisKKyAgaWYgKHN0ZXApCisgICAgeworICAgICAgY3B1LnN0YXRlID0gU0lNX1NUQVRFX1NUT1BQRUQ7CisgICAgICBjcHUuZXhjZXB0aW9uID0gU0lHVFJBUDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjcHUuc3RhdGUgPSBTSU1fU1RBVEVfUlVOTklORzsKKyAgICAgIGNwdS5leGNlcHRpb24gPSAwOworICAgIH0KKworICBwYyA9IGNwdS5wYzsKKworICAvKiBUaGUgUEMgc2hvdWxkIG5ldmVyIGJlIG9kZC4gICovCisgIGlmIChwYyAmIDB4MSkKKyAgICBhYm9ydCAoKTsKKworICBHRVRTUiAoKTsKKyAgb2xkbWFzayA9IGNwdS5tYXNrOworICBpZiAoIWg4MzAwaG1vZGUpCisgICAgY3B1Lm1hc2sgPSAweGZmZmY7CisgIGRvCisgICAgeworICAgICAgaW50IGNpZHg7CisgICAgICBkZWNvZGVkX2luc3QgKmNvZGU7CisKKyAgICB0b3A6CisgICAgICBjaWR4ID0gY3B1LmNhY2hlX2lkeFtwY107CisgICAgICBjb2RlID0gY3B1LmNhY2hlICsgY2lkeDsKKworCisjZGVmaW5lIEFMVU9QKFNUT1JFLCBOQU1FLCBIT1cpIFwKKyAgICBjYXNlIE8oTkFNRSxTQik6ICBIT1c7IGlmKFNUT1JFKWdvdG8gYWx1ODtlbHNlIGdvdG8ganVzdF9mbGFnc19hbHU4OyAgXAorICAgIGNhc2UgTyhOQU1FLCBTVyk6IEhPVzsgaWYoU1RPUkUpZ290byBhbHUxNjtlbHNlIGdvdG8ganVzdF9mbGFnc19hbHUxNjsgXAorICAgIGNhc2UgTyhOQU1FLFNMKTogIEhPVzsgaWYoU1RPUkUpZ290byBhbHUzMjtlbHNlIGdvdG8ganVzdF9mbGFnc19hbHUzMjsKKworCisjZGVmaW5lIExPR09QKE5BTUUsIEhPVykgXAorICAgIGNhc2UgTyhOQU1FLFNCKTogSE9XOyBnb3RvIGxvZzg7XAorICAgIGNhc2UgTyhOQU1FLCBTVyk6IEhPVzsgZ290byBsb2cxNjtcCisgICAgY2FzZSBPKE5BTUUsU0wpOiBIT1c7IGdvdG8gbG9nMzI7CisKKworCisjaWYgQURFQlVHCisgICAgICBpZiAoZGVidWcpCisJeworCSAgcHJpbnRmICgiJXggJWQgJXNcbiIsIHBjLCBjb2RlLT5vcGNvZGUsCisJCSAgY29kZS0+b3AgPyBjb2RlLT5vcC0+bmFtZSA6ICIqKiIpOworCX0KKyAgICAgIGNwdS5zdGF0c1tjb2RlLT5vcGNvZGVdKys7CisKKyNlbmRpZgorCisgICAgICBjeWNsZXMgKz0gY29kZS0+Y3ljbGVzOworICAgICAgaW5zdHMrKzsKKyAgICAgIHN3aXRjaCAoY29kZS0+b3Bjb2RlKQorCXsKKwljYXNlIDA6CisJICAvKgorCSAgICogVGhpcyBvcGNvZGUgaXMgYSBmYWtlIGZvciB3aGVuIHdlIGdldCB0byBhbgorCSAgICogaW5zdHJ1Y3Rpb24gd2hpY2ggaGFzbnQgYmVlbiBjb21waWxlZAorCSAgICovCisJICBjb21waWxlIChwYyk7CisJICBnb3RvIHRvcDsKKwkgIGJyZWFrOworCisKKwljYXNlIE8gKE9fU1VCWCwgU0IpOgorCSAgcmQgPSBmZXRjaCAoJmNvZGUtPmRzdCk7CisJICBlYSA9IGZldGNoICgmY29kZS0+c3JjKTsKKwkgIGVhID0gLShlYSArIEMpOworCSAgcmVzID0gcmQgKyBlYTsKKwkgIGdvdG8gYWx1ODsKKworCWNhc2UgTyAoT19BRERYLCBTQik6CisJICByZCA9IGZldGNoICgmY29kZS0+ZHN0KTsKKwkgIGVhID0gZmV0Y2ggKCZjb2RlLT5zcmMpOworCSAgZWEgPSBDICsgZWE7CisJICByZXMgPSByZCArIGVhOworCSAgZ290byBhbHU4OworCisjZGVmaW5lIEVBICAgIGVhID0gZmV0Y2goJmNvZGUtPnNyYyk7CisjZGVmaW5lIFJEX0VBIGVhID0gZmV0Y2goJmNvZGUtPnNyYyk7IHJkID0gZmV0Y2goJmNvZGUtPmRzdCk7CisKKwkgIEFMVU9QICgxLCBPX1NVQiwgUkRfRUE7CisJCSBlYSA9IC1lYTsKKwkJIHJlcyA9IHJkICsgZWEpOworCSAgQUxVT1AgKDEsIE9fTkVHLCBFQTsKKwkJIGVhID0gLWVhOworCQkgcmQgPSAwOworCQkgcmVzID0gcmQgKyBlYSk7CisKKwljYXNlIE8gKE9fQURELCBTQik6CisJICByZCA9IEdFVF9CX1JFRyAoY29kZS0+ZHN0LnJlZyk7CisJICBlYSA9IGZldGNoICgmY29kZS0+c3JjKTsKKwkgIHJlcyA9IHJkICsgZWE7CisJICBnb3RvIGFsdTg7CisJY2FzZSBPIChPX0FERCwgU1cpOgorCSAgcmQgPSBHRVRfV19SRUcgKGNvZGUtPmRzdC5yZWcpOworCSAgZWEgPSBmZXRjaCAoJmNvZGUtPnNyYyk7CisJICByZXMgPSByZCArIGVhOworCSAgZ290byBhbHUxNjsKKwljYXNlIE8gKE9fQURELCBTTCk6CisJICByZCA9IEdFVF9MX1JFRyAoY29kZS0+ZHN0LnJlZyk7CisJICBlYSA9IGZldGNoICgmY29kZS0+c3JjKTsKKwkgIHJlcyA9IHJkICsgZWE7CisJICBnb3RvIGFsdTMyOworCisKKwkgIExPR09QIChPX0FORCwgUkRfRUE7CisJCSByZXMgPSByZCAmIGVhKTsKKworCSAgTE9HT1AgKE9fT1IsIFJEX0VBOworCQkgcmVzID0gcmQgfCBlYSk7CisKKwkgIExPR09QIChPX1hPUiwgUkRfRUE7CisJCSByZXMgPSByZCBeIGVhKTsKKworCisJY2FzZSBPIChPX01PVl9UT19NRU0sIFNCKToKKwkgIHJlcyA9IEdFVF9CX1JFRyAoY29kZS0+c3JjLnJlZyk7CisJICBnb3RvIGxvZzg7CisJY2FzZSBPIChPX01PVl9UT19NRU0sIFNXKToKKwkgIHJlcyA9IEdFVF9XX1JFRyAoY29kZS0+c3JjLnJlZyk7CisJICBnb3RvIGxvZzE2OworCWNhc2UgTyAoT19NT1ZfVE9fTUVNLCBTTCk6CisJICByZXMgPSBHRVRfTF9SRUcgKGNvZGUtPnNyYy5yZWcpOworCSAgZ290byBsb2czMjsKKworCisJY2FzZSBPIChPX01PVl9UT19SRUcsIFNCKToKKwkgIHJlcyA9IGZldGNoICgmY29kZS0+c3JjKTsKKwkgIFNFVF9CX1JFRyAoY29kZS0+ZHN0LnJlZywgcmVzKTsKKwkgIGdvdG8ganVzdF9mbGFnc19sb2c4OworCWNhc2UgTyAoT19NT1ZfVE9fUkVHLCBTVyk6CisJICByZXMgPSBmZXRjaCAoJmNvZGUtPnNyYyk7CisJICBTRVRfV19SRUcgKGNvZGUtPmRzdC5yZWcsIHJlcyk7CisJICBnb3RvIGp1c3RfZmxhZ3NfbG9nMTY7CisJY2FzZSBPIChPX01PVl9UT19SRUcsIFNMKToKKwkgIHJlcyA9IGZldGNoICgmY29kZS0+c3JjKTsKKwkgIFNFVF9MX1JFRyAoY29kZS0+ZHN0LnJlZywgcmVzKTsKKwkgIGdvdG8ganVzdF9mbGFnc19sb2czMjsKKworCisJY2FzZSBPIChPX0FERFMsIFNMKToKKwkgIFNFVF9MX1JFRyAoY29kZS0+ZHN0LnJlZywKKwkJICAgICBHRVRfTF9SRUcgKGNvZGUtPmRzdC5yZWcpCisJCSAgICAgKyBjb2RlLT5zcmMubGl0ZXJhbCk7CisKKwkgIGdvdG8gbmV4dDsKKworCWNhc2UgTyAoT19TVUJTLCBTTCk6CisJICBTRVRfTF9SRUcgKGNvZGUtPmRzdC5yZWcsCisJCSAgICAgR0VUX0xfUkVHIChjb2RlLT5kc3QucmVnKQorCQkgICAgIC0gY29kZS0+c3JjLmxpdGVyYWwpOworCSAgZ290byBuZXh0OworCisJY2FzZSBPIChPX0NNUCwgU0IpOgorCSAgcmQgPSBmZXRjaCAoJmNvZGUtPmRzdCk7CisJICBlYSA9IGZldGNoICgmY29kZS0+c3JjKTsKKwkgIGVhID0gLWVhOworCSAgcmVzID0gcmQgKyBlYTsKKwkgIGdvdG8ganVzdF9mbGFnc19hbHU4OworCisJY2FzZSBPIChPX0NNUCwgU1cpOgorCSAgcmQgPSBmZXRjaCAoJmNvZGUtPmRzdCk7CisJICBlYSA9IGZldGNoICgmY29kZS0+c3JjKTsKKwkgIGVhID0gLWVhOworCSAgcmVzID0gcmQgKyBlYTsKKwkgIGdvdG8ganVzdF9mbGFnc19hbHUxNjsKKworCWNhc2UgTyAoT19DTVAsIFNMKToKKwkgIHJkID0gZmV0Y2ggKCZjb2RlLT5kc3QpOworCSAgZWEgPSBmZXRjaCAoJmNvZGUtPnNyYyk7CisJICBlYSA9IC1lYTsKKwkgIHJlcyA9IHJkICsgZWE7CisJICBnb3RvIGp1c3RfZmxhZ3NfYWx1MzI7CisKKworCWNhc2UgTyAoT19ERUMsIFNCKToKKwkgIHJkID0gR0VUX0JfUkVHIChjb2RlLT5zcmMucmVnKTsKKwkgIGVhID0gLTE7CisJICByZXMgPSByZCArIGVhOworCSAgU0VUX0JfUkVHIChjb2RlLT5zcmMucmVnLCByZXMpOworCSAgZ290byBqdXN0X2ZsYWdzX2luYzg7CisKKwljYXNlIE8gKE9fREVDLCBTVyk6CisJICByZCA9IEdFVF9XX1JFRyAoY29kZS0+ZHN0LnJlZyk7CisJICBlYSA9IC1jb2RlLT5zcmMubGl0ZXJhbDsKKwkgIHJlcyA9IHJkICsgZWE7CisJICBTRVRfV19SRUcgKGNvZGUtPmRzdC5yZWcsIHJlcyk7CisJICBnb3RvIGp1c3RfZmxhZ3NfaW5jMTY7CisKKwljYXNlIE8gKE9fREVDLCBTTCk6CisJICByZCA9IEdFVF9MX1JFRyAoY29kZS0+ZHN0LnJlZyk7CisJICBlYSA9IC1jb2RlLT5zcmMubGl0ZXJhbDsKKwkgIHJlcyA9IHJkICsgZWE7CisJICBTRVRfTF9SRUcgKGNvZGUtPmRzdC5yZWcsIHJlcyk7CisJICBnb3RvIGp1c3RfZmxhZ3NfaW5jMzI7CisKKworCWNhc2UgTyAoT19JTkMsIFNCKToKKwkgIHJkID0gR0VUX0JfUkVHIChjb2RlLT5zcmMucmVnKTsKKwkgIGVhID0gMTsKKwkgIHJlcyA9IHJkICsgZWE7CisJICBTRVRfQl9SRUcgKGNvZGUtPnNyYy5yZWcsIHJlcyk7CisJICBnb3RvIGp1c3RfZmxhZ3NfaW5jODsKKworCWNhc2UgTyAoT19JTkMsIFNXKToKKwkgIHJkID0gR0VUX1dfUkVHIChjb2RlLT5kc3QucmVnKTsKKwkgIGVhID0gY29kZS0+c3JjLmxpdGVyYWw7CisJICByZXMgPSByZCArIGVhOworCSAgU0VUX1dfUkVHIChjb2RlLT5kc3QucmVnLCByZXMpOworCSAgZ290byBqdXN0X2ZsYWdzX2luYzE2OworCisJY2FzZSBPIChPX0lOQywgU0wpOgorCSAgcmQgPSBHRVRfTF9SRUcgKGNvZGUtPmRzdC5yZWcpOworCSAgZWEgPSBjb2RlLT5zcmMubGl0ZXJhbDsKKwkgIHJlcyA9IHJkICsgZWE7CisJICBTRVRfTF9SRUcgKGNvZGUtPmRzdC5yZWcsIHJlcyk7CisJICBnb3RvIGp1c3RfZmxhZ3NfaW5jMzI7CisKKworI2RlZmluZSBHRVRfQ0NSKHgpIEJVSUxEU1IoKTt4ID0gY3B1LmNjcgorCisJY2FzZSBPIChPX0FOREMsIFNCKToKKwkgIEdFVF9DQ1IgKHJkKTsKKwkgIGVhID0gY29kZS0+c3JjLmxpdGVyYWw7CisJICByZXMgPSByZCAmIGVhOworCSAgZ290byBzZXRjOworCisJY2FzZSBPIChPX09SQywgU0IpOgorCSAgR0VUX0NDUiAocmQpOworCSAgZWEgPSBjb2RlLT5zcmMubGl0ZXJhbDsKKwkgIHJlcyA9IHJkIHwgZWE7CisJICBnb3RvIHNldGM7CisKKwljYXNlIE8gKE9fWE9SQywgU0IpOgorCSAgR0VUX0NDUiAocmQpOworCSAgZWEgPSBjb2RlLT5zcmMubGl0ZXJhbDsKKwkgIHJlcyA9IHJkIF4gZWE7CisJICBnb3RvIHNldGM7CisKKworCWNhc2UgTyAoT19CUkEsIFNCKToKKwkgIGlmICgxKQorCSAgICBnb3RvIGNvbmR0cnVlOworCSAgZ290byBuZXh0OworCisJY2FzZSBPIChPX0JSTiwgU0IpOgorCSAgaWYgKDApCisJICAgIGdvdG8gY29uZHRydWU7CisJICBnb3RvIG5leHQ7CisKKwljYXNlIE8gKE9fQkhJLCBTQik6CisJICBpZiAoKEMgfHwgWikgPT0gMCkKKwkgICAgZ290byBjb25kdHJ1ZTsKKwkgIGdvdG8gbmV4dDsKKworCisJY2FzZSBPIChPX0JMUywgU0IpOgorCSAgaWYgKChDIHx8IFopKQorCSAgICBnb3RvIGNvbmR0cnVlOworCSAgZ290byBuZXh0OworCisJY2FzZSBPIChPX0JDUywgU0IpOgorCSAgaWYgKChDID09IDEpKQorCSAgICBnb3RvIGNvbmR0cnVlOworCSAgZ290byBuZXh0OworCisJY2FzZSBPIChPX0JDQywgU0IpOgorCSAgaWYgKChDID09IDApKQorCSAgICBnb3RvIGNvbmR0cnVlOworCSAgZ290byBuZXh0OworCisJY2FzZSBPIChPX0JFUSwgU0IpOgorCSAgaWYgKFopCisJICAgIGdvdG8gY29uZHRydWU7CisJICBnb3RvIG5leHQ7CisJY2FzZSBPIChPX0JHVCwgU0IpOgorCSAgaWYgKCgoWiB8fCAoTiBeIFYpKSA9PSAwKSkKKwkgICAgZ290byBjb25kdHJ1ZTsKKwkgIGdvdG8gbmV4dDsKKworCisJY2FzZSBPIChPX0JMRSwgU0IpOgorCSAgaWYgKCgoWiB8fCAoTiBeIFYpKSA9PSAxKSkKKwkgICAgZ290byBjb25kdHJ1ZTsKKwkgIGdvdG8gbmV4dDsKKworCWNhc2UgTyAoT19CR0UsIFNCKToKKwkgIGlmICgoTiBeIFYpID09IDApCisJICAgIGdvdG8gY29uZHRydWU7CisJICBnb3RvIG5leHQ7CisJY2FzZSBPIChPX0JMVCwgU0IpOgorCSAgaWYgKChOIF4gVikpCisJICAgIGdvdG8gY29uZHRydWU7CisJICBnb3RvIG5leHQ7CisJY2FzZSBPIChPX0JNSSwgU0IpOgorCSAgaWYgKChOKSkKKwkgICAgZ290byBjb25kdHJ1ZTsKKwkgIGdvdG8gbmV4dDsKKwljYXNlIE8gKE9fQk5FLCBTQik6CisJICBpZiAoKFogPT0gMCkpCisJICAgIGdvdG8gY29uZHRydWU7CisJICBnb3RvIG5leHQ7CisKKwljYXNlIE8gKE9fQlBMLCBTQik6CisJICBpZiAoTiA9PSAwKQorCSAgICBnb3RvIGNvbmR0cnVlOworCSAgZ290byBuZXh0OworCWNhc2UgTyAoT19CVkMsIFNCKToKKwkgIGlmICgoViA9PSAwKSkKKwkgICAgZ290byBjb25kdHJ1ZTsKKwkgIGdvdG8gbmV4dDsKKwljYXNlIE8gKE9fQlZTLCBTQik6CisJICBpZiAoKFYgPT0gMSkpCisJICAgIGdvdG8gY29uZHRydWU7CisJICBnb3RvIG5leHQ7CisKKwljYXNlIE8gKE9fU1lTQ0FMTCwgU0IpOgorCSAgeworCSAgICBjaGFyIGMgPSBjcHUucmVnc1syXTsKKwkgICAgc2ltX2NhbGxiYWNrLT53cml0ZV9zdGRvdXQgKHNpbV9jYWxsYmFjaywgJmMsIDEpOworCSAgfQorCSAgZ290byBuZXh0OworCisJICBPTk9UIChPX05PVCwgcmQgPSB+cmQ7IHYgPSAwOyk7CisJICBPU0hJRlRTIChPX1NITEwsCisJCSAgIGMgPSByZCAmIGhtOyB2ID0gMDsgcmQgPDw9IDEsCisJCSAgIGMgPSByZCAmIChobSA+PiAxKTsgdiA9IDA7IHJkIDw8PSAyKTsKKwkgIE9TSElGVFMgKE9fU0hMUiwKKwkJICAgYyA9IHJkICYgMTsgdiA9IDA7IHJkID0gKHVuc2lnbmVkIGludCkgcmQgPj4gMSwKKwkJICAgYyA9IHJkICYgMjsgdiA9IDA7IHJkID0gKHVuc2lnbmVkIGludCkgcmQgPj4gMik7CisJICBPU0hJRlRTIChPX1NIQUwsCisJCSAgIGMgPSByZCAmIGhtOyB2ID0gKHJkICYgaG0pICE9ICgocmQgJiAoaG0gPj4gMSkpIDw8IDEpOyByZCA8PD0gMSwKKwkJICAgYyA9IHJkICYgKGhtID4+IDEpOyB2ID0gKHJkICYgKGhtID4+IDEpKSAhPSAoKHJkICYgKGhtID4+IDIpKSA8PCAyKTsgcmQgPDw9IDIpOworCSAgT1NISUZUUyAoT19TSEFSLAorCQkgICB0ID0gcmQgJiBobTsgYyA9IHJkICYgMTsgdiA9IDA7IHJkID4+PSAxOyByZCB8PSB0LAorCQkgICB0ID0gcmQgJiBobTsgYyA9IHJkICYgMjsgdiA9IDA7IHJkID4+PSAyOyByZCB8PSB0IHwgdCA+PiAxICk7CisJICBPU0hJRlRTIChPX1JPVEwsCisJCSAgIGMgPSByZCAmIGhtOyB2ID0gMDsgcmQgPDw9IDE7IHJkIHw9IEMsCisJCSAgIGMgPSByZCAmIGhtOyB2ID0gMDsgcmQgPDw9IDE7IHJkIHw9IEM7IGMgPSByZCAmIGhtOyByZCA8PD0gMTsgcmQgfD0gQyk7CisJICBPU0hJRlRTIChPX1JPVFIsCisJCSAgIGMgPSByZCAmIDE7IHYgPSAwOyByZCA9ICh1bnNpZ25lZCBpbnQpIHJkID4+IDE7IGlmIChjKSByZCB8PSBobSwKKwkJICAgYyA9IHJkICYgMTsgdiA9IDA7IHJkID0gKHVuc2lnbmVkIGludCkgcmQgPj4gMTsgaWYgKGMpIHJkIHw9IGhtOyBjID0gcmQgJiAxOyByZCA9ICh1bnNpZ25lZCBpbnQpIHJkID4+IDE7IGlmIChjKSByZCB8PSBobSk7CisJICBPU0hJRlRTIChPX1JPVFhMLAorCQkgICB0ID0gcmQgJiBobTsgcmQgPDw9IDE7IHJkIHw9IEM7IGMgPSB0OyB2ID0gMCwKKwkJICAgdCA9IHJkICYgaG07IHJkIDw8PSAxOyByZCB8PSBDOyBjID0gdDsgdiA9IDA7IHQgPSByZCAmIGhtOyByZCA8PD0gMTsgcmQgfD0gQzsgYyA9IHQpOworCSAgT1NISUZUUyAoT19ST1RYUiwKKwkJICAgdCA9IHJkICYgMTsgcmQgPSAodW5zaWduZWQgaW50KSByZCA+PiAxOyBpZiAoQykgcmQgfD0gaG07IGMgPSB0OyB2ID0gMCwKKwkJICAgdCA9IHJkICYgMTsgcmQgPSAodW5zaWduZWQgaW50KSByZCA+PiAxOyBpZiAoQykgcmQgfD0gaG07IGMgPSB0OyB2ID0gMDsgdCA9IHJkICYgMTsgcmQgPSAodW5zaWduZWQgaW50KSByZCA+PiAxOyBpZiAoQykgcmQgfD0gaG07IGMgPSB0KTsKKworCWNhc2UgTyAoT19KTVAsIFNCKToKKwkgIHsKKwkgICAgcGMgPSBmZXRjaCAoJmNvZGUtPnNyYyk7CisJICAgIGdvdG8gZW5kOworCisJICB9CisKKwljYXNlIE8gKE9fSlNSLCBTQik6CisJICB7CisJICAgIGludCB0bXA7CisJICAgIHBjID0gZmV0Y2ggKCZjb2RlLT5zcmMpOworCSAgY2FsbDoKKwkgICAgdG1wID0gY3B1LnJlZ3NbN107CisKKwkgICAgaWYgKGg4MzAwaG1vZGUpCisJICAgICAgeworCQl0bXAgLT0gNDsKKwkJU0VUX01FTU9SWV9MICh0bXAsIGNvZGUtPm5leHRfcGMpOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJdG1wIC09IDI7CisJCVNFVF9NRU1PUllfVyAodG1wLCBjb2RlLT5uZXh0X3BjKTsKKwkgICAgICB9CisJICAgIGNwdS5yZWdzWzddID0gdG1wOworCisJICAgIGdvdG8gZW5kOworCSAgfQorCWNhc2UgTyAoT19CU1IsIFNCKToKKwkgIHBjID0gY29kZS0+c3JjLmxpdGVyYWw7CisJICBnb3RvIGNhbGw7CisKKwljYXNlIE8gKE9fUlRTLCBTTik6CisJICB7CisJICAgIGludCB0bXA7CisKKwkgICAgdG1wID0gY3B1LnJlZ3NbN107CisKKwkgICAgaWYgKGg4MzAwaG1vZGUpCisJICAgICAgeworCQlwYyA9IEdFVF9NRU1PUllfTCAodG1wKTsKKwkJdG1wICs9IDQ7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlwYyA9IEdFVF9NRU1PUllfVyAodG1wKTsKKwkJdG1wICs9IDI7CisJICAgICAgfQorCisJICAgIGNwdS5yZWdzWzddID0gdG1wOworCSAgICBnb3RvIGVuZDsKKwkgIH0KKworCWNhc2UgTyAoT19JTEwsIFNCKToKKwkgIGNwdS5zdGF0ZSA9IFNJTV9TVEFURV9TVE9QUEVEOworCSAgY3B1LmV4Y2VwdGlvbiA9IFNJR0lMTDsKKwkgIGdvdG8gZW5kOworCWNhc2UgTyAoT19TTEVFUCwgU04pOgorCSAgLyogVGhlIGZvcm1hdCBvZiByMCBpcyBkZWZpbmVkIGJ5IGRldm8vaW5jbHVkZS93YWl0LmguICAqLworI2lmIDAgLyogRklYTUU6IFVnaC4gIEEgYnJlYWtwb2ludCBpcyB0aGUgc2xlZXAgaW5zbi4gICovCisJICBpZiAoV0lGRVhJVEVEIChjcHUucmVnc1swXSkpCisJICAgIHsKKwkgICAgICBjcHUuc3RhdGUgPSBTSU1fU1RBVEVfRVhJVEVEOworCSAgICAgIGNwdS5leGNlcHRpb24gPSBXRVhJVFNUQVRVUyAoY3B1LnJlZ3NbMF0pOworCSAgICB9CisJICBlbHNlIGlmIChXSUZTVE9QUEVEIChjcHUucmVnc1swXSkpCisJICAgIHsKKwkgICAgICBjcHUuc3RhdGUgPSBTSU1fU1RBVEVfU1RPUFBFRDsKKwkgICAgICBjcHUuZXhjZXB0aW9uID0gV1NUT1BTSUcgKGNwdS5yZWdzWzBdKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgY3B1LnN0YXRlID0gU0lNX1NUQVRFX1NJR05BTExFRDsKKwkgICAgICBjcHUuZXhjZXB0aW9uID0gV1RFUk1TSUcgKGNwdS5yZWdzWzBdKTsKKwkgICAgfQorI2Vsc2UKKwkgIC8qIEZJWE1FOiBEb2Vzbid0IHRoaXMgYnJlYWsgZm9yIGJyZWFrcG9pbnRzIHdoZW4gcjAKKwkgICAgIGNvbnRhaW5zIGp1c3QgdGhlIHJpZ2h0IChlciwgd3JvbmcpIHZhbHVlPyAgKi8KKwkgIGNwdS5zdGF0ZSA9IFNJTV9TVEFURV9TVE9QUEVEOworCSAgaWYgKCEgV0lGRVhJVEVEIChjcHUucmVnc1swXSkgJiYgV0lGU0lHTkFMRUQgKGNwdS5yZWdzWzBdKSkKKwkgICAgY3B1LmV4Y2VwdGlvbiA9IFNJR0lMTDsKKwkgIGVsc2UKKwkgICAgY3B1LmV4Y2VwdGlvbiA9IFNJR1RSQVA7CisjZW5kaWYKKwkgIGdvdG8gZW5kOworCWNhc2UgTyAoT19CUFQsIFNOKToKKwkgIGNwdS5zdGF0ZSA9IFNJTV9TVEFURV9TVE9QUEVEOworCSAgY3B1LmV4Y2VwdGlvbiA9IFNJR1RSQVA7CisJICBnb3RvIGVuZDsKKworCSAgT0JJVE9QIChPX0JOT1QsIDEsIDEsIGVhIF49IG0pOworCSAgT0JJVE9QIChPX0JUU1QsIDEsIDAsIG56ID0gZWEgJiBtKTsKKwkgIE9CSVRPUCAoT19CQ0xSLCAxLCAxLCBlYSAmPSB+bSk7CisJICBPQklUT1AgKE9fQlNFVCwgMSwgMSwgZWEgfD0gbSk7CQorCSAgT0JJVE9QIChPX0JMRCwgMSwgMCwgYyA9IGVhICYgbSk7CisJICBPQklUT1AgKE9fQklMRCwgMSwgMCwgYyA9ICEoZWEgJiBtKSk7CisJICBPQklUT1AgKE9fQlNULCAxLCAxLCBlYSAmPSB+bTsKKwkJICBpZiAoQykgZWEgfD0gbSk7CisJICBPQklUT1AgKE9fQklTVCwgMSwgMSwgZWEgJj0gfm07CisJCSAgaWYgKCFDKSBlYSB8PSBtKTsKKwkgIE9CSVRPUCAoT19CQU5ELCAxLCAwLCBjID0gKGVhICYgbSkgJiYgQyk7CisJICBPQklUT1AgKE9fQklBTkQsIDEsIDAsIGMgPSAhKGVhICYgbSkgJiYgQyk7CisJICBPQklUT1AgKE9fQk9SLCAxLCAwLCBjID0gKGVhICYgbSkgfHwgQyk7CisJICBPQklUT1AgKE9fQklPUiwgMSwgMCwgYyA9ICEoZWEgJiBtKSB8fCBDKTsKKwkgIE9CSVRPUCAoT19CWE9SLCAxLCAwLCBjID0gKGVhICYgbSkgIT0gQyk7CisJICBPQklUT1AgKE9fQklYT1IsIDEsIDAsIGMgPSAhKGVhICYgbSkgIT0gQyk7CisKKworI2RlZmluZSBNT1AoYnNpemUsIHNpZ25lZCkgbW9wKGNvZGUsIGJzaXplLHNpZ25lZCk7IGdvdG8gbmV4dDsKKworCWNhc2UgTyAoT19NVUxTLCBTQik6CisJICBNT1AgKDEsIDEpOworCSAgYnJlYWs7CisJY2FzZSBPIChPX01VTFMsIFNXKToKKwkgIE1PUCAoMCwgMSk7CisJICBicmVhazsKKwljYXNlIE8gKE9fTVVMVSwgU0IpOgorCSAgTU9QICgxLCAwKTsKKwkgIGJyZWFrOworCWNhc2UgTyAoT19NVUxVLCBTVyk6CisJICBNT1AgKDAsIDApOworCSAgYnJlYWs7CisKKworCWNhc2UgTyAoT19ESVZVLCBTQik6CisJICB7CisJICAgIHJkID0gR0VUX1dfUkVHIChjb2RlLT5kc3QucmVnKTsKKwkgICAgZWEgPSBHRVRfQl9SRUcgKGNvZGUtPnNyYy5yZWcpOworCSAgICBpZiAoZWEpCisJICAgICAgeworCQl0bXAgPSAodW5zaWduZWQpcmQgJSBlYTsKKwkJcmQgPSAodW5zaWduZWQpcmQgLyBlYTsKKwkgICAgICB9CisJICAgIFNFVF9XX1JFRyAoY29kZS0+ZHN0LnJlZywgKHJkICYgMHhmZikgfCAodG1wIDw8IDgpKTsKKwkgICAgbiA9IGVhICYgMHg4MDsKKwkgICAgbnogPSBlYSAmIDB4ZmY7CisKKwkgICAgZ290byBuZXh0OworCSAgfQorCWNhc2UgTyAoT19ESVZVLCBTVyk6CisJICB7CisJICAgIHJkID0gR0VUX0xfUkVHIChjb2RlLT5kc3QucmVnKTsKKwkgICAgZWEgPSBHRVRfV19SRUcgKGNvZGUtPnNyYy5yZWcpOworCSAgICBuID0gZWEgJiAweDgwMDA7CisJICAgIG56ID0gZWEgJiAweGZmZmY7CisJICAgIGlmIChlYSkKKwkgICAgICB7CisJCXRtcCA9ICh1bnNpZ25lZClyZCAlIGVhOworCQlyZCA9ICh1bnNpZ25lZClyZCAvIGVhOworCSAgICAgIH0KKwkgICAgU0VUX0xfUkVHIChjb2RlLT5kc3QucmVnLCAocmQgJiAweGZmZmYpIHwgKHRtcCA8PCAxNikpOworCSAgICBnb3RvIG5leHQ7CisJICB9CisKKwljYXNlIE8gKE9fRElWUywgU0IpOgorCSAgeworCisJICAgIHJkID0gU0VYVFNIT1JUIChHRVRfV19SRUcgKGNvZGUtPmRzdC5yZWcpKTsKKwkgICAgZWEgPSBTRVhUQ0hBUiAoR0VUX0JfUkVHIChjb2RlLT5zcmMucmVnKSk7CisJICAgIGlmIChlYSkKKwkgICAgICB7CisJCXRtcCA9IChpbnQpIHJkICUgKGludCkgZWE7CisJCXJkID0gKGludCkgcmQgLyAoaW50KSBlYTsKKwkJbiA9IHJkICYgMHg4MDAwOworCQlueiA9IDE7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgbnogPSAwOworCSAgICBTRVRfV19SRUcgKGNvZGUtPmRzdC5yZWcsIChyZCAmIDB4ZmYpIHwgKHRtcCA8PCA4KSk7CisJICAgIGdvdG8gbmV4dDsKKwkgIH0KKwljYXNlIE8gKE9fRElWUywgU1cpOgorCSAgeworCSAgICByZCA9IEdFVF9MX1JFRyAoY29kZS0+ZHN0LnJlZyk7CisJICAgIGVhID0gU0VYVFNIT1JUIChHRVRfV19SRUcgKGNvZGUtPnNyYy5yZWcpKTsKKwkgICAgaWYgKGVhKQorCSAgICAgIHsKKwkJdG1wID0gKGludCkgcmQgJSAoaW50KSBlYTsKKwkJcmQgPSAoaW50KSByZCAvIChpbnQpIGVhOworCQluID0gcmQgJiAweDgwMDAwMDAwOworCQlueiA9IDE7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgbnogPSAwOworCSAgICBTRVRfTF9SRUcgKGNvZGUtPmRzdC5yZWcsIChyZCAmIDB4ZmZmZikgfCAodG1wIDw8IDE2KSk7CisJICAgIGdvdG8gbmV4dDsKKwkgIH0KKwljYXNlIE8gKE9fRVhUUywgU1cpOgorCSAgcmQgPSBHRVRfQl9SRUcgKGNvZGUtPnNyYy5yZWcgKyA4KSAmIDB4ZmY7IC8qIFllcywgc3JjLCBub3QgZHN0LiAgKi8KKwkgIGVhID0gcmQgJiAweDgwID8gLTI1NiA6IDA7CisJICByZXMgPSByZCArIGVhOworCSAgZ290byBsb2cxNjsKKwljYXNlIE8gKE9fRVhUUywgU0wpOgorCSAgcmQgPSBHRVRfV19SRUcgKGNvZGUtPnNyYy5yZWcpICYgMHhmZmZmOworCSAgZWEgPSByZCAmIDB4ODAwMCA/IC02NTUzNiA6IDA7CisJICByZXMgPSByZCArIGVhOworCSAgZ290byBsb2czMjsKKwljYXNlIE8gKE9fRVhUVSwgU1cpOgorCSAgcmQgPSBHRVRfQl9SRUcgKGNvZGUtPnNyYy5yZWcgKyA4KSAmIDB4ZmY7CisJICBlYSA9IDA7CisJICByZXMgPSByZCArIGVhOworCSAgZ290byBsb2cxNjsKKwljYXNlIE8gKE9fRVhUVSwgU0wpOgorCSAgcmQgPSBHRVRfV19SRUcgKGNvZGUtPnNyYy5yZWcpICYgMHhmZmZmOworCSAgZWEgPSAwOworCSAgcmVzID0gcmQgKyBlYTsKKwkgIGdvdG8gbG9nMzI7CisKKwljYXNlIE8gKE9fTk9QLCBTTik6CisJICBnb3RvIG5leHQ7CisKKwljYXNlIE8gKE9fU1RNLCBTTCk6CisJICB7CisJICAgIGludCBucmVncywgZmlyc3RyZWcsIGk7CisKKwkgICAgbnJlZ3MgPSBHRVRfTUVNT1JZX0IgKHBjICsgMSk7CisJICAgIG5yZWdzID4+PSA0OworCSAgICBucmVncyAmPSAweGY7CisJICAgIGZpcnN0cmVnID0gR0VUX01FTU9SWV9CIChwYyArIDMpOworCSAgICBmaXJzdHJlZyAmPSAweGY7CisJICAgIGZvciAoaSA9IGZpcnN0cmVnOyBpIDw9IGZpcnN0cmVnICsgbnJlZ3M7IGkrKykKKwkgICAgICB7CisJCWNwdS5yZWdzWzddIC09IDQ7CisJCVNFVF9NRU1PUllfTCAoY3B1LnJlZ3NbN10sIGNwdS5yZWdzW2ldKTsKKwkgICAgICB9CisJICB9CisJICBnb3RvIG5leHQ7CisKKwljYXNlIE8gKE9fTERNLCBTTCk6CisJICB7CisJICAgIGludCBucmVncywgZmlyc3RyZWcsIGk7CisKKwkgICAgbnJlZ3MgPSBHRVRfTUVNT1JZX0IgKHBjICsgMSk7CisJICAgIG5yZWdzID4+PSA0OworCSAgICBucmVncyAmPSAweGY7CisJICAgIGZpcnN0cmVnID0gR0VUX01FTU9SWV9CIChwYyArIDMpOworCSAgICBmaXJzdHJlZyAmPSAweGY7CisJICAgIGZvciAoaSA9IGZpcnN0cmVnOyBpID49IGZpcnN0cmVnIC0gbnJlZ3M7IGktLSkKKwkgICAgICB7CisJCWNwdS5yZWdzW2ldID0gR0VUX01FTU9SWV9MIChjcHUucmVnc1s3XSk7CisJCWNwdS5yZWdzWzddICs9IDQ7CisJICAgICAgfQorCSAgfQorCSAgZ290byBuZXh0OworCisJZGVmYXVsdDoKKwkgIGNwdS5zdGF0ZSA9IFNJTV9TVEFURV9TVE9QUEVEOworCSAgY3B1LmV4Y2VwdGlvbiA9IFNJR0lMTDsKKwkgIGdvdG8gZW5kOworCisJfQorICAgICAgYWJvcnQgKCk7CisKKyAgICBzZXRjOgorICAgICAgY3B1LmNjciA9IHJlczsKKyAgICAgIEdFVFNSICgpOworICAgICAgZ290byBuZXh0OworCisgICAgY29uZHRydWU6CisgICAgICAvKiBXaGVuIGEgYnJhbmNoIHdvcmtzICovCisgICAgICBwYyA9IGNvZGUtPnNyYy5saXRlcmFsOworICAgICAgZ290byBlbmQ7CisKKyAgICAgIC8qIFNldCB0aGUgY29uZCBjb2RlcyBmcm9tIHJlcyAqLworICAgIGJpdG9wOgorCisgICAgICAvKiBTZXQgdGhlIGZsYWdzIGFmdGVyIGFuIDggYml0IGluYy9kZWMgb3BlcmF0aW9uICovCisgICAganVzdF9mbGFnc19pbmM4OgorICAgICAgbiA9IHJlcyAmIDB4ODA7CisgICAgICBueiA9IHJlcyAmIDB4ZmY7CisgICAgICB2ID0gKHJkICYgMHg3ZikgPT0gMHg3ZjsKKyAgICAgIGdvdG8gbmV4dDsKKworCisgICAgICAvKiBTZXQgdGhlIGZsYWdzIGFmdGVyIGFuIDE2IGJpdCBpbmMvZGVjIG9wZXJhdGlvbiAqLworICAgIGp1c3RfZmxhZ3NfaW5jMTY6CisgICAgICBuID0gcmVzICYgMHg4MDAwOworICAgICAgbnogPSByZXMgJiAweGZmZmY7CisgICAgICB2ID0gKHJkICYgMHg3ZmZmKSA9PSAweDdmZmY7CisgICAgICBnb3RvIG5leHQ7CisKKworICAgICAgLyogU2V0IHRoZSBmbGFncyBhZnRlciBhbiAzMiBiaXQgaW5jL2RlYyBvcGVyYXRpb24gKi8KKyAgICBqdXN0X2ZsYWdzX2luYzMyOgorICAgICAgbiA9IHJlcyAmIDB4ODAwMDAwMDA7CisgICAgICBueiA9IHJlcyAmIDB4ZmZmZmZmZmY7CisgICAgICB2ID0gKHJkICYgMHg3ZmZmZmZmZikgPT0gMHg3ZmZmZmZmZjsKKyAgICAgIGdvdG8gbmV4dDsKKworCisgICAgc2hpZnQ4OgorICAgICAgLyogU2V0IGZsYWdzIGFmdGVyIGFuIDggYml0IHNoaWZ0IG9wLCBjYXJyeSxvdmVyZmxvdyBzZXQgaW4gaW5zbiAqLworICAgICAgbiA9IChyZCAmIDB4ODApOworICAgICAgbnogPSByZCAmIDB4ZmY7CisgICAgICBTRVRfQl9SRUcgKGNvZGUtPnNyYy5yZWcsIHJkKTsKKyAgICAgIGdvdG8gbmV4dDsKKworICAgIHNoaWZ0MTY6CisgICAgICAvKiBTZXQgZmxhZ3MgYWZ0ZXIgYW4gMTYgYml0IHNoaWZ0IG9wLCBjYXJyeSxvdmVyZmxvdyBzZXQgaW4gaW5zbiAqLworICAgICAgbiA9IChyZCAmIDB4ODAwMCk7CisgICAgICBueiA9IHJkICYgMHhmZmZmOworICAgICAgU0VUX1dfUkVHIChjb2RlLT5zcmMucmVnLCByZCk7CisgICAgICBnb3RvIG5leHQ7CisKKyAgICBzaGlmdDMyOgorICAgICAgLyogU2V0IGZsYWdzIGFmdGVyIGFuIDMyIGJpdCBzaGlmdCBvcCwgY2Fycnksb3ZlcmZsb3cgc2V0IGluIGluc24gKi8KKyAgICAgIG4gPSAocmQgJiAweDgwMDAwMDAwKTsKKyAgICAgIG56ID0gcmQgJiAweGZmZmZmZmZmOworICAgICAgU0VUX0xfUkVHIChjb2RlLT5zcmMucmVnLCByZCk7CisgICAgICBnb3RvIG5leHQ7CisKKyAgICBsb2czMjoKKyAgICAgIHN0b3JlICgmY29kZS0+ZHN0LCByZXMpOworICAgIGp1c3RfZmxhZ3NfbG9nMzI6CisgICAgICAvKiBmbGFncyBhZnRlciBhIDMyYml0IGxvZ2ljYWwgb3BlcmF0aW9uICovCisgICAgICBuID0gcmVzICYgMHg4MDAwMDAwMDsKKyAgICAgIG56ID0gcmVzICYgMHhmZmZmZmZmZjsKKyAgICAgIHYgPSAwOworICAgICAgZ290byBuZXh0OworCisgICAgbG9nMTY6CisgICAgICBzdG9yZSAoJmNvZGUtPmRzdCwgcmVzKTsKKyAgICBqdXN0X2ZsYWdzX2xvZzE2OgorICAgICAgLyogZmxhZ3MgYWZ0ZXIgYSAxNmJpdCBsb2dpY2FsIG9wZXJhdGlvbiAqLworICAgICAgbiA9IHJlcyAmIDB4ODAwMDsKKyAgICAgIG56ID0gcmVzICYgMHhmZmZmOworICAgICAgdiA9IDA7CisgICAgICBnb3RvIG5leHQ7CisKKworICAgIGxvZzg6CisgICAgICBzdG9yZSAoJmNvZGUtPmRzdCwgcmVzKTsKKyAgICBqdXN0X2ZsYWdzX2xvZzg6CisgICAgICBuID0gcmVzICYgMHg4MDsKKyAgICAgIG56ID0gcmVzICYgMHhmZjsKKyAgICAgIHYgPSAwOworICAgICAgZ290byBuZXh0OworCisgICAgYWx1ODoKKyAgICAgIFNFVF9CX1JFRyAoY29kZS0+ZHN0LnJlZywgcmVzKTsKKyAgICBqdXN0X2ZsYWdzX2FsdTg6CisgICAgICBuID0gcmVzICYgMHg4MDsKKyAgICAgIG56ID0gcmVzICYgMHhmZjsKKyAgICAgIGMgPSAocmVzICYgMHgxMDApOworICAgICAgc3dpdGNoIChjb2RlLT5vcGNvZGUgLyA0KQorCXsKKwljYXNlIE9fQUREOgorCSAgdiA9ICgocmQgJiAweDgwKSA9PSAoZWEgJiAweDgwKQorCSAgICAgICAmJiAocmQgJiAweDgwKSAhPSAocmVzICYgMHg4MCkpOworCSAgYnJlYWs7CisJY2FzZSBPX1NVQjoKKwljYXNlIE9fQ01QOgorCSAgdiA9ICgocmQgJiAweDgwKSAhPSAoLWVhICYgMHg4MCkKKwkgICAgICAgJiYgKHJkICYgMHg4MCkgIT0gKHJlcyAmIDB4ODApKTsKKwkgIGJyZWFrOworCWNhc2UgT19ORUc6CisJICB2ID0gKHJkID09IDB4ODApOworCSAgYnJlYWs7CisJfQorICAgICAgZ290byBuZXh0OworCisgICAgYWx1MTY6CisgICAgICBTRVRfV19SRUcgKGNvZGUtPmRzdC5yZWcsIHJlcyk7CisgICAganVzdF9mbGFnc19hbHUxNjoKKyAgICAgIG4gPSByZXMgJiAweDgwMDA7CisgICAgICBueiA9IHJlcyAmIDB4ZmZmZjsKKyAgICAgIGMgPSAocmVzICYgMHgxMDAwMCk7CisgICAgICBzd2l0Y2ggKGNvZGUtPm9wY29kZSAvIDQpCisJeworCWNhc2UgT19BREQ6CisJICB2ID0gKChyZCAmIDB4ODAwMCkgPT0gKGVhICYgMHg4MDAwKQorCSAgICAgICAmJiAocmQgJiAweDgwMDApICE9IChyZXMgJiAweDgwMDApKTsKKwkgIGJyZWFrOworCWNhc2UgT19TVUI6CisJY2FzZSBPX0NNUDoKKwkgIHYgPSAoKHJkICYgMHg4MDAwKSAhPSAoLWVhICYgMHg4MDAwKQorCSAgICAgICAmJiAocmQgJiAweDgwMDApICE9IChyZXMgJiAweDgwMDApKTsKKwkgIGJyZWFrOworCWNhc2UgT19ORUc6CisJICB2ID0gKHJkID09IDB4ODAwMCk7CisJICBicmVhazsKKwl9CisgICAgICBnb3RvIG5leHQ7CisKKyAgICBhbHUzMjoKKyAgICAgIFNFVF9MX1JFRyAoY29kZS0+ZHN0LnJlZywgcmVzKTsKKyAgICBqdXN0X2ZsYWdzX2FsdTMyOgorICAgICAgbiA9IHJlcyAmIDB4ODAwMDAwMDA7CisgICAgICBueiA9IHJlcyAmIDB4ZmZmZmZmZmY7CisgICAgICBzd2l0Y2ggKGNvZGUtPm9wY29kZSAvIDQpCisJeworCWNhc2UgT19BREQ6CisJICB2ID0gKChyZCAmIDB4ODAwMDAwMDApID09IChlYSAmIDB4ODAwMDAwMDApCisJICAgICAgICYmIChyZCAmIDB4ODAwMDAwMDApICE9IChyZXMgJiAweDgwMDAwMDAwKSk7CisJICBjID0gKCh1bnNpZ25lZCkgcmVzIDwgKHVuc2lnbmVkKSByZCkgfHwgKCh1bnNpZ25lZCkgcmVzIDwgKHVuc2lnbmVkKSBlYSk7CisJICBicmVhazsKKwljYXNlIE9fU1VCOgorCWNhc2UgT19DTVA6CisJICB2ID0gKChyZCAmIDB4ODAwMDAwMDApICE9ICgtZWEgJiAweDgwMDAwMDAwKQorCSAgICAgICAmJiAocmQgJiAweDgwMDAwMDAwKSAhPSAocmVzICYgMHg4MDAwMDAwMCkpOworCSAgYyA9ICh1bnNpZ25lZCkgcmQgPCAodW5zaWduZWQpIC1lYTsKKwkgIGJyZWFrOworCWNhc2UgT19ORUc6CisJICB2ID0gKHJkID09IDB4ODAwMDAwMDApOworCSAgYyA9IHJlcyAhPSAwOworCSAgYnJlYWs7CisJfQorICAgICAgZ290byBuZXh0OworCisgICAgbmV4dDo7CisgICAgICBwYyA9IGNvZGUtPm5leHRfcGM7CisKKyAgICBlbmQ6CisgICAgICA7CisgICAgICAvKiAgICAgIGlmIChjcHUucmVnc1s4XSApIGFib3J0KCk7ICovCisKKyAgICAgIGlmICgtLXBvbGxfY291bnQgPCAwKQorCXsKKwkgIHBvbGxfY291bnQgPSAxMDA7CisJICBpZiAoKCpzaW1fY2FsbGJhY2stPnBvbGxfcXVpdCkgIT0gTlVMTAorCSAgICAgICYmICgqc2ltX2NhbGxiYWNrLT5wb2xsX3F1aXQpIChzaW1fY2FsbGJhY2spKQorCSAgICBzaW1fc3RvcCAoc2QpOworCX0KKworICAgIH0KKyAgd2hpbGUgKGNwdS5zdGF0ZSA9PSBTSU1fU1RBVEVfUlVOTklORyk7CisgIGNwdS50aWNrcyArPSBnZXRfbm93ICgpIC0gdGlja19zdGFydDsKKyAgY3B1LmN5Y2xlcyArPSBjeWNsZXM7CisgIGNwdS5pbnN0cyArPSBpbnN0czsKKyAgCisgIGNwdS5wYyA9IHBjOworICBCVUlMRFNSICgpOworICBjcHUubWFzayA9IG9sZG1hc2s7CisgIHNpZ25hbCAoU0lHSU5ULCBwcmV2KTsKK30KKworaW50CitzaW1fdHJhY2UgKHNkKQorICAgICBTSU1fREVTQyBzZDsKK3sKKyAgLyogRklYTUU6IHVuZmluaXNoZWQgKi8KKyAgYWJvcnQgKCk7Cit9CisKK2ludAorc2ltX3dyaXRlIChzZCwgYWRkciwgYnVmZmVyLCBzaXplKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgU0lNX0FERFIgYWRkcjsKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICAgICBpbnQgc2l6ZTsKK3sKKyAgaW50IGk7CisKKyAgaW5pdF9wb2ludGVycyAoKTsKKyAgaWYgKGFkZHIgPCAwKQorICAgIHJldHVybiAwOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHsKKyAgICAgIGlmIChhZGRyIDwgbWVtb3J5X3NpemUpCisJeworCSAgY3B1Lm1lbW9yeVthZGRyICsgaV0gPSBidWZmZXJbaV07CisJICBjcHUuY2FjaGVfaWR4W2FkZHIgKyBpXSA9IDA7CisJfQorICAgICAgZWxzZQorCWNwdS5laWdodGJpdFsoYWRkciArIGkpICYgMHhmZl0gPSBidWZmZXJbaV07CisgICAgfQorICByZXR1cm4gc2l6ZTsKK30KKworaW50CitzaW1fcmVhZCAoc2QsIGFkZHIsIGJ1ZmZlciwgc2l6ZSkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIFNJTV9BRERSIGFkZHI7CisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKyAgICAgaW50IHNpemU7Cit7CisgIGluaXRfcG9pbnRlcnMgKCk7CisgIGlmIChhZGRyIDwgMCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGFkZHIgPCBtZW1vcnlfc2l6ZSkKKyAgICBtZW1jcHkgKGJ1ZmZlciwgY3B1Lm1lbW9yeSArIGFkZHIsIHNpemUpOworICBlbHNlCisgICAgbWVtY3B5IChidWZmZXIsIGNwdS5laWdodGJpdCArIChhZGRyICYgMHhmZiksIHNpemUpOworICByZXR1cm4gc2l6ZTsKK30KKworCisjZGVmaW5lIFIwX1JFR05VTQkwCisjZGVmaW5lIFIxX1JFR05VTQkxCisjZGVmaW5lIFIyX1JFR05VTQkyCisjZGVmaW5lIFIzX1JFR05VTQkzCisjZGVmaW5lIFI0X1JFR05VTQk0CisjZGVmaW5lIFI1X1JFR05VTQk1CisjZGVmaW5lIFI2X1JFR05VTQk2CisjZGVmaW5lIFI3X1JFR05VTQk3CisKKyNkZWZpbmUgU1BfUkVHTlVNICAgICAgIFI3X1JFR05VTQkvKiBDb250YWlucyBhZGRyZXNzIG9mIHRvcCBvZiBzdGFjayAqLworI2RlZmluZSBGUF9SRUdOVU0gICAgICAgUjZfUkVHTlVNCS8qIENvbnRhaW5zIGFkZHJlc3Mgb2YgZXhlY3V0aW5nCisJCQkJCSAgICogc3RhY2sgZnJhbWUgKi8KKworI2RlZmluZSBDQ1JfUkVHTlVNICAgICAgOAkvKiBDb250YWlucyBwcm9jZXNzb3Igc3RhdHVzICovCisjZGVmaW5lIFBDX1JFR05VTSAgICAgICA5CS8qIENvbnRhaW5zIHByb2dyYW0gY291bnRlciAqLworCisjZGVmaW5lIENZQ0xFX1JFR05VTSAgICAxMAorI2RlZmluZSBJTlNUX1JFR05VTSAgICAgMTEKKyNkZWZpbmUgVElDS19SRUdOVU0gICAgIDEyCisKKworaW50CitzaW1fc3RvcmVfcmVnaXN0ZXIgKHNkLCBybiwgdmFsdWUsIGxlbmd0aCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCBybjsKKyAgICAgdW5zaWduZWQgY2hhciAqdmFsdWU7CisgICAgIGludCBsZW5ndGg7Cit7CisgIGludCBsb25ndmFsOworICBpbnQgc2hvcnR2YWw7CisgIGludCBpbnR2YWw7CisgIGxvbmd2YWwgPSAodmFsdWVbMF0gPDwgMjQpIHwgKHZhbHVlWzFdIDw8IDE2KSB8ICh2YWx1ZVsyXSA8PCA4KSB8IHZhbHVlWzNdOworICBzaG9ydHZhbCA9ICh2YWx1ZVswXSA8PCA4KSB8ICh2YWx1ZVsxXSk7CisgIGludHZhbCA9IGg4MzAwaG1vZGUgPyBsb25ndmFsIDogc2hvcnR2YWw7CisKKyAgaW5pdF9wb2ludGVycyAoKTsKKyAgc3dpdGNoIChybikKKyAgICB7CisgICAgY2FzZSBQQ19SRUdOVU06CisgICAgICBjcHUucGMgPSBpbnR2YWw7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgY2FzZSBSMF9SRUdOVU06CisgICAgY2FzZSBSMV9SRUdOVU06CisgICAgY2FzZSBSMl9SRUdOVU06CisgICAgY2FzZSBSM19SRUdOVU06CisgICAgY2FzZSBSNF9SRUdOVU06CisgICAgY2FzZSBSNV9SRUdOVU06CisgICAgY2FzZSBSNl9SRUdOVU06CisgICAgY2FzZSBSN19SRUdOVU06CisgICAgICBjcHUucmVnc1tybl0gPSBpbnR2YWw7CisgICAgICBicmVhazsKKyAgICBjYXNlIENDUl9SRUdOVU06CisgICAgICBjcHUuY2NyID0gaW50dmFsOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDWUNMRV9SRUdOVU06CisgICAgICBjcHUuY3ljbGVzID0gbG9uZ3ZhbDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBJTlNUX1JFR05VTToKKyAgICAgIGNwdS5pbnN0cyA9IGxvbmd2YWw7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVElDS19SRUdOVU06CisgICAgICBjcHUudGlja3MgPSBsb25ndmFsOworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKK2ludAorc2ltX2ZldGNoX3JlZ2lzdGVyIChzZCwgcm4sIGJ1ZiwgbGVuZ3RoKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgaW50IHJuOworICAgICB1bnNpZ25lZCBjaGFyICpidWY7CisgICAgIGludCBsZW5ndGg7Cit7CisgIGludCB2OworICBpbnQgbG9uZ3JlZyA9IDA7CisKKyAgaW5pdF9wb2ludGVycyAoKTsKKworICBzd2l0Y2ggKHJuKQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgY2FzZSA4OgorICAgICAgdiA9IGNwdS5jY3I7CisgICAgICBicmVhazsKKyAgICBjYXNlIDk6CisgICAgICB2ID0gY3B1LnBjOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSMF9SRUdOVU06CisgICAgY2FzZSBSMV9SRUdOVU06CisgICAgY2FzZSBSMl9SRUdOVU06CisgICAgY2FzZSBSM19SRUdOVU06CisgICAgY2FzZSBSNF9SRUdOVU06CisgICAgY2FzZSBSNV9SRUdOVU06CisgICAgY2FzZSBSNl9SRUdOVU06CisgICAgY2FzZSBSN19SRUdOVU06CisgICAgICB2ID0gY3B1LnJlZ3Nbcm5dOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgIHYgPSBjcHUuY3ljbGVzOworICAgICAgbG9uZ3JlZyA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDExOgorICAgICAgdiA9IGNwdS50aWNrczsKKyAgICAgIGxvbmdyZWcgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjoKKyAgICAgIHYgPSBjcHUuaW5zdHM7CisgICAgICBsb25ncmVnID0gMTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgaWYgKGg4MzAwaG1vZGUgfHwgbG9uZ3JlZykKKyAgICB7CisgICAgICBidWZbMF0gPSB2ID4+IDI0OworICAgICAgYnVmWzFdID0gdiA+PiAxNjsKKyAgICAgIGJ1ZlsyXSA9IHYgPj4gODsKKyAgICAgIGJ1ZlszXSA9IHYgPj4gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBidWZbMF0gPSB2ID4+IDg7CisgICAgICBidWZbMV0gPSB2OworICAgIH0KKyAgcmV0dXJuIC0xOworfQorCit2b2lkCitzaW1fc3RvcF9yZWFzb24gKHNkLCByZWFzb24sIHNpZ3JjKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgZW51bSBzaW1fc3RvcCAqcmVhc29uOworICAgICBpbnQgKnNpZ3JjOworeworI2lmIDAgLyogRklYTUU6IFRoaXMgc2hvdWxkIHdvcmsgYnV0IHdlIGNhbid0IHVzZSBpdC4KKwkgZ3JlcCBmb3IgU0xFRVAgYWJvdmUuICAqLworICBzd2l0Y2ggKGNwdS5zdGF0ZSkKKyAgICB7CisgICAgY2FzZSBTSU1fU1RBVEVfRVhJVEVEIDogKnJlYXNvbiA9IHNpbV9leGl0ZWQ7IGJyZWFrOworICAgIGNhc2UgU0lNX1NUQVRFX1NJR05BTExFRCA6ICpyZWFzb24gPSBzaW1fc2lnbmFsbGVkOyBicmVhazsKKyAgICBjYXNlIFNJTV9TVEFURV9TVE9QUEVEIDogKnJlYXNvbiA9IHNpbV9zdG9wcGVkOyBicmVhazsKKyAgICBkZWZhdWx0IDogYWJvcnQgKCk7CisgICAgfQorI2Vsc2UKKyAgKnJlYXNvbiA9IHNpbV9zdG9wcGVkOworI2VuZGlmCisgICpzaWdyYyA9IGNwdS5leGNlcHRpb247Cit9CisKKy8qIEZJWE1FOiBSZW5hbWUgdG8gc2ltX3NldF9tZW1fc2l6ZS4gICovCisKK3ZvaWQKK3NpbV9zaXplIChuKQorICAgICBpbnQgbjsKK3sKKyAgLyogTWVtb3J5IHNpemUgaXMgZml4ZWQuICAqLworfQorCit2b2lkCitzaW1fc2V0X3NpbWNhY2hlX3NpemUgKG4pCit7CisgIGlmIChjcHUuY2FjaGUpCisgICAgZnJlZSAoY3B1LmNhY2hlKTsKKyAgaWYgKG4gPCAyKQorICAgIG4gPSAyOworICBjcHUuY2FjaGUgPSAoZGVjb2RlZF9pbnN0ICopIG1hbGxvYyAoc2l6ZW9mIChkZWNvZGVkX2luc3QpICogbik7CisgIG1lbXNldCAoY3B1LmNhY2hlLCAwLCBzaXplb2YgKGRlY29kZWRfaW5zdCkgKiBuKTsKKyAgY3B1LmNzaXplID0gbjsKK30KKworCit2b2lkCitzaW1faW5mbyAoc2QsIHZlcmJvc2UpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgdmVyYm9zZTsKK3sKKyAgZG91YmxlIHRpbWV0YWtlbiA9IChkb3VibGUpIGNwdS50aWNrcyAvIChkb3VibGUpIG5vd19wZXJzZWMgKCk7CisgIGRvdWJsZSB2aXJ0dGltZSA9IGNwdS5jeWNsZXMgLyAxMC4wZTY7CisKKyAgKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywKKwkJCQkgICAgIlxuXG4jaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkICAlMTBkXG4iLAorCQkJCSAgICBjcHUuaW5zdHMpOworICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLAorCQkJCSAgICAiI2N5Y2xlcyAodiBhcHByb3hpbWF0ZSkgJTEwZFxuIiwKKwkJCQkgICAgY3B1LmN5Y2xlcyk7CisgICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssCisJCQkJICAgICIjcmVhbCB0aW1lIHRha2VuICAgICAgICAlMTAuNGZcbiIsCisJCQkJICAgIHRpbWV0YWtlbik7CisgICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssCisJCQkJICAgICIjdmlydHVhbCB0aW1lIHRha2VkICAgICAlMTAuNGZcbiIsCisJCQkJICAgIHZpcnR0aW1lKTsKKyAgaWYgKHRpbWV0YWtlbiAhPSAwLjApCisgICAgKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywKKwkJCQkgICAgICAiI3NpbXVsYXRpb24gcmF0aW8gICAgICAgJTEwLjRmXG4iLAorCQkJCSAgICAgIHZpcnR0aW1lIC8gdGltZXRha2VuKTsKKyAgKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywKKwkJCQkgICAgIiNjb21waWxlcyAgICAgICAgICAgICAgICUxMGRcbiIsCisJCQkJICAgIGNwdS5jb21waWxlcyk7CisgICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssCisJCQkJICAgICIjY2FjaGUgc2l6ZSAgICAgICAgICAgICAlMTBkXG4iLAorCQkJCSAgICBjcHUuY3NpemUpOworCisjaWZkZWYgQURFQlVHCisgIC8qIFRoaXMgdG8gYmUgY29uZGl0aW9uYWwgb24gYHdoYXQnIChha2EgYHZlcmJvc2UnKSwKKyAgICAgaG93ZXZlciBpdCB3YXMgbmV2ZXIgcGFzc2VkIGFzIG5vbi16ZXJvLiAgKi8KKyAgaWYgKDEpCisgICAgeworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgT19MQVNUOyBpKyspCisJeworCSAgaWYgKGNwdS5zdGF0c1tpXSkKKwkgICAgKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywKKwkJCQkJICAgICAgIiVkOiAlZFxuIiwgaSwgY3B1LnN0YXRzW2ldKTsKKwl9CisgICAgfQorI2VuZGlmCit9CisKKy8qIEluZGljYXRlIHdoZXRoZXIgdGhlIGNwdSBpcyBhbiBoOC8zMDAgb3IgaDgvMzAwaC4KKyAgIEZMQUcgaXMgbm9uLXplcm8gZm9yIHRoZSBoOC8zMDBoLiAgKi8KKwordm9pZAorc2V0X2g4MzAwaCAoZmxhZykKKyAgICAgaW50IGZsYWc7Cit7CisgIC8qIEZJWE1FOiBNdWNoIG9mIHRoZSBjb2RlIGluIHNpbV9sb2FkIGNhbiBiZSBtb3ZlZCB0byBzaW1fb3Blbi4KKyAgICAgVGhpcyBmdW5jdGlvbiBiZWluZyByZXBsYWNlZCBieSBhIHNpbV9vcGVuOkFSR1YgY29uZmlndXJhdGlvbgorICAgICBvcHRpb24gKi8KKyAgaDgzMDBobW9kZSA9IGZsYWc7Cit9CisKK1NJTV9ERVNDCitzaW1fb3BlbiAoa2luZCwgcHRyLCBhYmZkLCBhcmd2KQorICAgICBTSU1fT1BFTl9LSU5EIGtpbmQ7CisgICAgIHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCAqcHRyOworICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIC8qIEZJWE1FOiBNdWNoIG9mIHRoZSBjb2RlIGluIHNpbV9sb2FkIGNhbiBiZSBtb3ZlZCBoZXJlICovCisKKyAgc2ltX2tpbmQgPSBraW5kOworICBteW5hbWUgPSBhcmd2WzBdOworICBzaW1fY2FsbGJhY2sgPSBwdHI7CisgIC8qIGZ1ZGdlIG91ciBkZXNjcmlwdG9yICovCisgIHJldHVybiAoU0lNX0RFU0MpIDE7Cit9CisKK3ZvaWQKK3NpbV9jbG9zZSAoc2QsIHF1aXR0aW5nKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgaW50IHF1aXR0aW5nOworeworICAvKiBub3RoaW5nIHRvIGRvICovCit9CisKKy8qIENhbGxlZCBieSBnZGIgdG8gbG9hZCBhIHByb2dyYW0gaW50byBtZW1vcnkuICAqLworCitTSU1fUkMKK3NpbV9sb2FkIChzZCwgcHJvZywgYWJmZCwgZnJvbV90dHkpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBjaGFyICpwcm9nOworICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgYmZkICpwcm9nX2JmZDsKKworICAvKiBGSVhNRTogVGhlIGNvZGUgYmVsb3cgdGhhdCBzZXRzIGEgc3BlY2lmaWMgdmFyaWFudCBvZiB0aGUgaDgvMzAwCisgICAgIGJlaW5nIHNpbXVsYXRlZCBzaG91bGQgYmUgbW92ZWQgdG8gc2ltX29wZW4oKS4gKi8KKworICAvKiBTZWUgaWYgdGhlIGZpbGUgaXMgZm9yIHRoZSBoOC8zMDAgb3IgaDgvMzAwaC4gICovCisgIC8qID8/PyBUaGlzIG1heSBub3QgYmUgdGhlIG1vc3QgZWZmaWNpZW50IHdheS4gIFRoZSB6OGsgc2ltdWxhdG9yCisgICAgIGRvZXMgdGhpcyB2aWEgYSBkaWZmZXJlbnQgbWVjaGFuaXNtIChJTklUX0VYVFJBX1NZTVRBQl9JTkZPKS4gICovCisgIGlmIChhYmZkICE9IE5VTEwpCisgICAgcHJvZ19iZmQgPSBhYmZkOworICBlbHNlCisgICAgcHJvZ19iZmQgPSBiZmRfb3BlbnIgKHByb2csICJjb2ZmLWg4MzAwIik7CisgIGlmIChwcm9nX2JmZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgY3B1IHR5cGUuICBXZSBpZ25vcmUgZmFpbHVyZSBmcm9tIGJmZF9jaGVja19mb3JtYXQKKwkgYW5kIGJmZF9vcGVuciBhcyBzaW1fbG9hZF9maWxlIGNoZWNrcyB0b28uICAqLworICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXQgKHByb2dfYmZkLCBiZmRfb2JqZWN0KSkgCisJeworCSAgdW5zaWduZWQgbG9uZyBtYWNoID0gYmZkX2dldF9tYWNoIChwcm9nX2JmZCk7CisJICBzZXRfaDgzMDBoIChtYWNoID09IGJmZF9tYWNoX2g4MzAwaAorCQkgICAgICB8fCBtYWNoID09IGJmZF9tYWNoX2g4MzAwcyk7CisJfQorICAgIH0KKworICAvKiBJZiB3ZSdyZSB1c2luZyBnZGIgYXR0YWNoZWQgdG8gdGhlIHNpbXVsYXRvciwgdGhlbiB3ZSBoYXZlIHRvCisgICAgIHJlYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2ltdWxhdG9yLgorCisgICAgIFdoZW4gZ2RiIGZpcnN0IHN0YXJ0cywgaXQgY2FsbHMgZmV0Y2hfcmVnaXN0ZXJzIChhbW9uZyBvdGhlcgorICAgICBmdW5jdGlvbnMpLCB3aGljaCBpbiB0dXJuIGNhbGxzIGluaXRfcG9pbnRlcnMsIHdoaWNoIGFsbG9jYXRlcworICAgICBzaW11bGF0b3IgbWVtb3J5LgorCisgICAgIFRoZSBwcm9ibGVtIGlzIHdoZW4gd2UgZG8gdGhhdCwgd2UgZG9uJ3Qga25vdyB3aGV0aGVyIHdlJ3JlCisgICAgIGRlYnVnZ2luZyBhbiBoOC8zMDAgb3IgaDgvMzAwaCBwcm9ncmFtLgorCisgICAgIFRoaXMgaXMgdGhlIGZpcnN0IHBvaW50IGF0IHdoaWNoIHdlIGNhbiBtYWtlIHRoYXQgZGV0ZXJtaW5hdGlvbiwKKyAgICAgc28gd2UganVzdCByZWFsbG9jYXRlIG1lbW9yeSBub3c7IHRoaXMgd2lsbCBhbHNvIGFsbG93IHVzIHRvIGhhbmRsZQorICAgICBzd2l0Y2hpbmcgYmV0d2VlbiBoOC8zMDAgYW5kIGg4LzMwMGggcHJvZ3JhbXMgd2l0aG91dCBleGl0aW5nCisgICAgIGdkYi4gICovCisgIGlmIChoODMwMGhtb2RlKQorICAgIG1lbW9yeV9zaXplID0gSDgzMDBIX01TSVpFOworICBlbHNlCisgICAgbWVtb3J5X3NpemUgPSBIODMwMF9NU0laRTsKKworICBpZiAoY3B1Lm1lbW9yeSkKKyAgICBmcmVlIChjcHUubWVtb3J5KTsKKyAgaWYgKGNwdS5jYWNoZV9pZHgpCisgICAgZnJlZSAoY3B1LmNhY2hlX2lkeCk7CisgIGlmIChjcHUuZWlnaHRiaXQpCisgICAgZnJlZSAoY3B1LmVpZ2h0Yml0KTsKKworICBjcHUubWVtb3J5ID0gKHVuc2lnbmVkIGNoYXIgKikgY2FsbG9jIChzaXplb2YgKGNoYXIpLCBtZW1vcnlfc2l6ZSk7CisgIGNwdS5jYWNoZV9pZHggPSAodW5zaWduZWQgc2hvcnQgKikgY2FsbG9jIChzaXplb2YgKHNob3J0KSwgbWVtb3J5X3NpemUpOworICBjcHUuZWlnaHRiaXQgPSAodW5zaWduZWQgY2hhciAqKSBjYWxsb2MgKHNpemVvZiAoY2hhciksIDI1Nik7CisKKyAgLyogYG1zaXplJyBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvICovCisgIGlmICgobWVtb3J5X3NpemUgJiAobWVtb3J5X3NpemUgLSAxKSkgIT0gMCkKKyAgICBhYm9ydCAoKTsKKyAgY3B1Lm1hc2sgPSBtZW1vcnlfc2l6ZSAtIDE7CisKKyAgaWYgKHNpbV9sb2FkX2ZpbGUgKHNkLCBteW5hbWUsIHNpbV9jYWxsYmFjaywgcHJvZywgcHJvZ19iZmQsCisJCSAgICAgc2ltX2tpbmQgPT0gU0lNX09QRU5fREVCVUcsCisJCSAgICAgMCwgc2ltX3dyaXRlKQorICAgICAgPT0gTlVMTCkKKyAgICB7CisgICAgICAvKiBDbG9zZSB0aGUgYmZkIGlmIHdlIG9wZW5lZCBpdC4gICovCisgICAgICBpZiAoYWJmZCA9PSBOVUxMICYmIHByb2dfYmZkICE9IE5VTEwpCisJYmZkX2Nsb3NlIChwcm9nX2JmZCk7CisgICAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisgICAgfQorCisgIC8qIENsb3NlIHRoZSBiZmQgaWYgd2Ugb3BlbmVkIGl0LiAgKi8KKyAgaWYgKGFiZmQgPT0gTlVMTCAmJiBwcm9nX2JmZCAhPSBOVUxMKQorICAgIGJmZF9jbG9zZSAocHJvZ19iZmQpOworICByZXR1cm4gU0lNX1JDX09LOworfQorCitTSU1fUkMKK3NpbV9jcmVhdGVfaW5mZXJpb3IgKHNkLCBhYmZkLCBhcmd2LCBlbnYpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKKyAgICAgY2hhciAqKmFyZ3Y7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGlmIChhYmZkICE9IE5VTEwpCisgICAgY3B1LnBjID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKKyAgZWxzZQorICAgIGNwdS5wYyA9IDA7CisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKK3ZvaWQKK3NpbV9kb19jb21tYW5kIChzZCwgY21kKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgY2hhciAqY21kOworeworICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLAorCQkJCSAgICAiVGhpcyBzaW11bGF0b3IgZG9lcyBub3QgYWNjZXB0IGFueSBjb21tYW5kcy5cbiIpOworfQorCit2b2lkCitzaW1fc2V0X2NhbGxiYWNrcyAocHRyKQorICAgICBzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1Y3QgKnB0cjsKK3sKKyAgc2ltX2NhbGxiYWNrID0gcHRyOworfQpkaWZmIC0tZ2l0IGEvc2ltL2g4MzAwL2NvbmZpZy5pbiBiL3NpbS9oODMwMC9jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY4N2EyYgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9oODMwMC9jb25maWcuaW4KQEAgLTAsMCArMSwxNTggQEAKKy8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLworCisvKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLworI3VuZGVmIENfQUxMT0NBCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KKyN1bmRlZiBjb25zdAorCisvKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCisgICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLworI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLworI3VuZGVmIEhBVkVfQUxMT0NBCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLworI3VuZGVmIEhBVkVfQUxMT0NBX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLworI3VuZGVmIEhBVkVfTU1BUAorCisvKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLworI3VuZGVmIGlubGluZQorCisvKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIG9mZl90CisKKy8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLworI3VuZGVmIF9QT1NJWF9TT1VSQ0UKKworLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGludCBvciB2b2lkKS4gICovCisjdW5kZWYgUkVUU0lHVFlQRQorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBzaXplX3QKKworLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCisgICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKKyAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KKyBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCisgU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCisgU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KKyAqLworI3VuZGVmIFNUQUNLX0RJUkVDVElPTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLworI3VuZGVmIFNURENfSEVBREVSUworCisvKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KKyN1bmRlZiBFTkFCTEVfTkxTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0dFVFRFWFQKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCisjdW5kZWYgSEFWRV9MQ19NRVNTQUdFUworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fc2V0ZnB1Y3cgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19TRVRGUFVDVworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9EQ0dFVFRFWFQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUQ1dECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUlVTQUdFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX01VTk1BUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9QVVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VURU5WCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NFVExPQ0FMRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ2FjdGlvbiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TSUdBQ1RJT04KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDQVNFQ01QCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUkNIUgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRpbWUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfVElNRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0FSR1pfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9GQ05UTF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZwdV9jb250cm9sLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZQVV9DT05UUk9MX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xJTUlUU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9MT0NBTEVfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTUFMTE9DX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RETElCX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NUUklOR19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1RJTUVfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVU5JU1REX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1ZBTFVFU19ICmRpZmYgLS1naXQgYS9zaW0vaDgzMDAvY29uZmlndXJlIGIvc2ltL2g4MzAwL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMTM1MDVhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2g4MzAwL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDM4OTIgQEAKKyMhIC9iaW4vc2gKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIgorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQorIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgorCisjIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAzCisKKworCisKKworIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDEKKworCisKKyMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDEKKworCisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgQ3lnd2luMzIsIHdpdGhvdXQgdXNpbmcKKyMgQUNfQ0FOT05JQ0FMXyouICBJZiBzbywgc2V0IG91dHB1dCB2YXJpYWJsZSBDWUdXSU4zMiB0byAieWVzIi4KKyMgT3RoZXJ3aXNlIHNldCBpdCB0byAibm8iLgorCisKKworIyBDaGVjayB0byBzZWUgaWYgd2UncmUgcnVubmluZyB1bmRlciBXaW4zMiwgd2l0aG91dCB1c2luZworIyBBQ19DQU5PTklDQUxfKi4gIElmIHNvLCBzZXQgb3V0cHV0IHZhcmlhYmxlIEVYRUVYVCB0byAiLmV4ZSIuCisjIE90aGVyd2lzZSBzZXQgaXQgdG8gIiIuCisKKworCisKKyMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIgCisjIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworIyBEZWZhdWx0czoKK2FjX2hlbHA9CithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCisjIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46CithY19oZWxwPSIkYWNfaGVscAorICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUJCUVuYWJsZSBkZXZlbG9wZXIgZnVuY3Rpb25hbGl0eS4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tYnN3YXAJCQlVc2UgSG9zdCBzcGVjaWZpYyBCU1dBUCBpbnN0cnVjdGlvbi4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tY2ZsYWdzPW9wdHMJCUV4dHJhIENGTEFHUyBmb3IgdXNlIGluIGJ1aWxkaW5nIHNpbXVsYXRvciIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1kZWJ1Zz1vcHRzCQlFbmFibGUgZGVidWdnaW5nIGZsYWdzIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLXN0ZGlvCQkJU3BlY2lmeSB3aGV0aGVyIHRvIHVzZSBzdGRpbyBmb3IgY29uc29sZSBpbnB1dC9vdXRwdXQuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLXRyYWNlPW9wdHMJCUVuYWJsZSB0cmFjaW5nIGZsYWdzIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLXByb2ZpbGU9b3B0cwkJRW5hYmxlIHByb2ZpbGluZyBmbGFncyIKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2J1aWxkPU5PTkUKK2NhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2V4ZWNfcHJlZml4PU5PTkUKK2hvc3Q9Tk9ORQorbm9fY3JlYXRlPQorbm9ub3B0PU5PTkUKK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3RhcmdldD1OT05FCit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorc3ViZGlycz0KK01GTEFHUz0gTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT1NYWtlZmlsZS5pbgorCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2FjX2V4ZWV4dD0KK2FjX29iamV4dD1vCitpZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KKyAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKyAgICBhY19uPSBhY19jPScKKycgYWNfdD0nCScKKyAgZWxzZQorICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKyAgZmkKK2Vsc2UKKyAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CitmaQorCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY3NzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAorICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgorICBDUFA9IiR7Q0MtY2N9IC1FIgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA2OTIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjY5ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzA5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MTU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDcyNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NzMyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPS9saWIvY3BwCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKKyAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCitlbHNlCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKK2VjaG8gIiRhY190IiIkQ1BQIiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc1NzogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1CitzZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgorYWxsOgorCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCitFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCitpZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcworZWxzZQorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0bWFrZQorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgU0VUX01BS0U9CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Nzg0OiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1CitpZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKKyAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQordGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKK0VPRgorCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0M9IiRDQyAtcG9zaXgiCisgIGVsc2UKKyAgICBDQz0iJENDIC1YcCIKKyAgZmkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgIElTQz0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4MDU6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDgxMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODE4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDgzNSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4NTMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODc0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCitpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOworZXhpdCAoMCk7IH0KKworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjg4NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICA6CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBTVERDX0hFQURFUlMgMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5MDk6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgOTE0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKy8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCit0eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7CisvKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLworY2hhciBjb25zdCAqY29uc3QgKmNjcDsKK2NoYXIgKipwOworLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3N0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKK3N0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OworLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgorICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCisgICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLworY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOworY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOworLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KKysrY2NwOworcCA9IChjaGFyKiopIGNjcDsKK2NjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOworeyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgY2hhciAqdDsKKyAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKKworICAqdCsrID0gMDsKK30KK3sgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCisgIGludCB4W10gPSB7MjUsIDE3fTsKKyAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKKyAgKytmb287Cit9Cit7IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KKyAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7CisgIGlwdHIgcCA9IDA7CisgICsrcDsKK30KK3sgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZworICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCisgIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07CisgIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKK30KK3sgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCisgIGNvbnN0IGludCBmb28gPSAxMDsKK30KKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk2MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBjb25zdCAKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5ODQ6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfY3ZfY19pbmxpbmU9bm8KK2ZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgOTkxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7Cit9ICRhY19rdyBmb28oKSB7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTk4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhaworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2RvbmUKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgorY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgorICBpbmxpbmUgfCB5ZXMpIDs7CisgIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgaW5saW5lIAorRU9GCisgOzsKKyAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKK0VPRgorIDs7Citlc2FjCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTAyNDogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTAyOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAib2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBvZmZfdCBsb25nCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA1NzogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDYyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCitFT0YKKworZmkKKworIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKKyMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA5MjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwOTcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFsbG9jYS5oPgoraW50IG1haW4oKSB7CitjaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEwNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExMjU6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTEzMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBIQVZFX0FMTE9DQV9ICisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLworY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKK2ludCBtYWluKCkgeworY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTU4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQSAxCitFT0YKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgorICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucworICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKKyAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCisgICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgorICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgQ19BTExPQ0EgMQorRU9GCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTE5MDogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExOTUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQord2ViZWNyYXkKKyNlbHNlCit3ZW5vdGJlY3JheQorI2VuZGlmCisKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KK2ZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjIwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjI1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKK0VPRgorCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZG9uZQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTI3NTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyODMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorZmluZF9zdGFja19kaXJlY3Rpb24gKCkKK3sKKyAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOworICBhdXRvIGNoYXIgZHVtbXk7CisgIGlmIChhZGRyID09IDApCisgICAgeworICAgICAgYWRkciA9ICZkdW1teTsKKyAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOworfQorbWFpbiAoKQoreworICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMwMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgorRU9GCisKK2ZpCisKK2ZvciBhY19oZHIgaW4gdW5pc3RkLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzI3OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTMzMiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTMzNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzY2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMzcxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzOTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0MTk6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE0MjcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisvKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KKyAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgorCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKwltbWFwIHNoYXJlZCBub3QgZml4ZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisgICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQorICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAorICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5CisgICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCisgICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKKyAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCisgICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAorICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCisKKyAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KKyAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6CisgICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKKyAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKy8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KKyNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQorIyBpZmRlZiBIQVZFX1VOSVNURF9ICisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgZW5kaWYKKworLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KKyMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKKyMgZW5kaWYKKworIyBpZmRlZiBfU0NfUEFHRVNJWkUKKyMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQorIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLworIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKKyMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQorIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgICBpZmRlZiBOQlBHCisjICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCisjICAgICBpZm5kZWYgQ0xTSVpFCisjICAgICAgZGVmaW5lIENMU0laRSAxCisjICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KKyMgICAgZWxzZSAvKiBubyBOQlBHICovCisjICAgICBpZmRlZiBOQlBDCisjICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQworIyAgICAgZWxzZSAvKiBubyBOQlBDICovCisjICAgICAgaWZkZWYgUEFHRVNJWkUKKyMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKKyMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLworIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLworIyAgICBlbmRpZiAvKiBubyBOQlBHICovCisjICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KKyMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCisKKyNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KKyNlbHNlCitjaGFyICptYWxsb2MoKTsKKyNlbmRpZgorCitpbnQKK21haW4oKQoreworCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOworCWludCBpLCBwYWdlc2l6ZTsKKwlpbnQgZmQ7CisKKwlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisKKwkvKgorCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KKwkgKi8KKwlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YSArIGkpID0gcmFuZCgpOworCXVtYXNrKDApOworCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCisJLyoKKwkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKKwkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCisJICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KKwkgKi8KKwlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgxKTsKKwlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOworCWlmICghZGF0YTIpCisJCWV4aXQoMSk7CisJZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOworCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCisJCQlleGl0KDEpOworCisJLyoKKwkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQorCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KKwkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKKwlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhMykKKwkJZXhpdCgxKTsKKwlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKKwkJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCXVubGluaygiY29uZnRlc3RtbWFwIik7CisJZXhpdCgwKTsKK30KKworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1Njc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9NTUFQIDEKK0VPRgorCitmaQorCisKKyMgYXV0b2NvbmYuaW5mbyBzYXlzIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCByaWdodCBhZnRlciBBQ19JTklULgorCisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY0MDogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisKK2hvc3RfYWxpYXM9JGhvc3QKK2Nhc2UgIiRob3N0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpCisgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpIDs7CisgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2hvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAoraG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjYxOiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorCit0YXJnZXRfYWxpYXM9JHRhcmdldAorY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCit0YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCit0YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjc5OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9CitlbHNlCisgICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KKyAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAorcyxcXCxcXFxcLGc7IHMsXCQsJCQsZworRU9GX1NFRAorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgorICBybSAtZiBjb25mdGVzdHNlZAorZmkKK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorCisjIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCit0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTcyMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTc1MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19wcm9nX3JlamVjdGVkPW5vCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworCWNvbnRpbnVlCisgICAgICBmaQorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KKyAgICAqd2luMzIqIHwgKldJTjMyKikKKyAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4MDI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4MzM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE4NDMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorbWFpbigpe3JldHVybigwKTt9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg0NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCisgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKyAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubworICBlbHNlCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKKyAgZmkKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4Njc6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgorY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODcyOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19HTlVDX18KKyAgeWVzOworI2VuZGlmCitFT0YKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODgxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5MDA6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCitpZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBhY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTk0MzogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCisgICAgY2FzZSAiJGFjX2Rpci8iIGluCisgICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7CisgICAgKikKKyAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAgICMgYnkgZGVmYXVsdC4KKyAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbHNlCisJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKKwkgICAgYnJlYWsgMgorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9JRlMiCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKyAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCisgICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCisgIGZpCitmaQorZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKKworIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgoraWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KKyAgQ0NfRk9SX0JVSUxEPSckKENDKScKK2Vsc2UKKyAgQ0NfRk9SX0JVSUxEPWdjYworZmkKKworCisKKworQVI9JHtBUi1hcn0KKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDA5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgorZmkKK2ZpCitSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCitBTExfTElOR1VBUz0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCit1bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwNDM6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMDQ4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDUzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCitfX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjA4MzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjA4OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTExOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KKyAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMTQwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMTQ1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxNjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgIGZpCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgorICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TVFBDUFkgMQorRU9GCisKKyAgIGZpCisKKyAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjIwMjogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMjA3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsb2NhbGUuaD4KK2ludCBtYWluKCkgeworcmV0dXJuIExDX01FU1NBR0VTCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIxNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2CisgICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCisgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCitFT0YKKworICAgIGZpCisgIGZpCisgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyMzU6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1CisgICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKKyAgVVNFX05MUz0kZW5hYmxldmFsCitlbHNlCisgIFVTRV9OTFM9eWVzCitmaQorCisgICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2CisgICAgCisKKyAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubworCisgICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgRU5BQkxFX05MUyAxCitFT0YKKworICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjI1NTogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1CisgICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAorZWxzZQorICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCitmaQorCisgICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKKworICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQorCW5sc19jdl9oZWFkZXJfbGliZ3Q9CisJQ0FUT0JKRVhUPU5PTkUKKworCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjc0OiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMjc5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIyODQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzAxOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzMDYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpYmludGwuaD4KK2ludCBtYWluKCkgeworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgorCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjMyOTogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1CithY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxpbnRsICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzMzcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBiaW5kdGV4dGRvbWFpbigpOworCitpbnQgbWFpbigpIHsKK2JpbmR0ZXh0ZG9tYWluKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzQ4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzY0OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzNjkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzc2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJICAgZmkKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCisJICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCisJICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfR0VUVEVYVCAxCitFT0YKKworCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQwNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KKwlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKKyAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKwkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCisJCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQzODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjQ0MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDY2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNDkzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRHTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgID86LyopCQkJIAorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgorICA7OworZXNhYworZmkKK0dNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCitpZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTI4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkWEdFVFRFWFQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKKyAgOzsKK2VzYWMKK2ZpCitYR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCitpZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI1NjAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKKwkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1Njg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0uZ21vCisJCSAgIERBVEFESVJOQU1FPXNoYXJlCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0ubW8KKwkJICAgREFUQURJUk5BTUU9bGliCitmaQorcm0gLWYgY29uZnRlc3QqCisJCUlOU1RPQkpFWFQ9Lm1vCisJICAgICAgZmkKKwkgICAgZmkKKwkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKwkgICAgICAgIAorICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgorCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNjAwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKKyAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjYzNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjY2OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAKKwlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICAgICAgQ0FUT0JKRVhUPS5nbW8KKyAgICAgICAgSU5TVE9CSkVYVD0ubW8KKyAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKKwlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJworCUlOVExMSUJTPSRJTlRMREVQUworCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAorICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCisgICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgorCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgorCSAgOiA7CisJZWxzZQorCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgorCSAgWEdFVFRFWFQ9IjoiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgorICAgICAgUE9TVUI9cG8KKyAgICBlbHNlCisgICAgICBEQVRBRElSTkFNRT1zaGFyZQorICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKKyAgICBmaQorCisgICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJworICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCisgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgorICAgICAgVVNFX05MUz15ZXMKKyAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgIGZpCisKKyAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKKyAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgorICAgIGRvbmUKKworICAgICAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgCisKKyAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KKyAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KKyAgICAgICBMSU5HVUFTPQorICAgICBlbHNlCisgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjc1OTogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1CisgICAgICAgTkVXX0xJTkdVQVM9CisgICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCisgICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCisgICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKKyAgICAgICAgIGVzYWMKKyAgICAgICBkb25lCisgICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKKyAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKKyAgICAgZmkKKworICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgorICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKKyAgICAgZmkKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgorICAgZWxzZQorICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCisvKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCisgICBmaQorICAgCisKKyAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgorCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjc4NzogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjc5MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzk3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgbXNnZm9ybWF0PWxpbnV4CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorbXNnZm9ybWF0PXhvcGVuCitmaQorCisKKwkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKKyAgICAgIGZpCisgICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKKwkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAorICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCisgICAgIEdUX05PPSIjTk8jIgorICAgICBHVF9ZRVM9CisgICBlbHNlCisgICAgIEdUX05PPQorICAgICBHVF9ZRVM9IiNZRVMjIgorICAgZmkKKyAgIAorICAgCisKKyAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKKyAgIAorCisgICAgICBsPQorICAgCisKKyAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgorICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbworICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KKwkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KKwkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgorCSBlbHNlCisJICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKKwkgZmkKKyAgICAgIGVsc2UKKwkgcG9zcmNwcmVmaXg9Ii4uLyIKKyAgICAgIGZpCisgICAgICBybSAtZiBwby9QT1RGSUxFUworICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCisJIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCisgICBmaQorICAKKworIyBDaGVjayBmb3IgY29tbW9uIGhlYWRlcnMuCisjIEZJWE1FOiBTZWVtcyB0byBtZSB0aGlzIGNhbiBjYXVzZSBwcm9ibGVtcyBmb3IgaTM4Ni13aW5kb3dzIGhvc3RzLgorIyBBdCBvbmUgcG9pbnQgdGhlcmUgd2VyZSBoYXJkY29kZWQgQUNfREVGSU5FJ3MgaWYgJHtob3N0fSA9IGkzODYtKi13aW5kb3dzKi4KK2ZvciBhY19oZHIgaW4gc3RkbGliLmggc3RyaW5nLmggc3RyaW5ncy5oIHVuaXN0ZC5oIHRpbWUuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI4NjY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyODcxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODc2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2hkciBpbiBzeXMvdGltZS5oIHN5cy9yZXNvdXJjZS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjkwNjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI5MTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI5MTY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfaGRyIGluIGZjbnRsLmggZnB1X2NvbnRyb2wuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5NDY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTUxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTU2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2Z1bmMgaW4gZ2V0cnVzYWdlIHRpbWUgc2lnYWN0aW9uIF9fc2V0ZnB1Y3cKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5ODU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI5OTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAxMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisjIENoZWNrIGZvciBzb2NrZXQgbGlicmFyaWVzCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZCBpbiAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzA0MDogY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiID4mNQorYWNfbGliX3Zhcj1gZWNobyBzb2NrZXQnXydiaW5kIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbHNvY2tldCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDQ4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgYmluZCgpOworCitpbnQgbWFpbigpIHsKK2JpbmQoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gc29ja2V0IHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2xpYiAxCitFT0YKKworICBMSUJTPSItbHNvY2tldCAkTElCUyIKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMDg3OiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIgPiY1CithY19saWJfdmFyPWBlY2hvIG5zbCdfJ2dldGhvc3RieW5hbWUgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sbnNsICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMwOTUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBnZXRob3N0YnluYW1lKCk7CisKK2ludCBtYWluKCkgeworZ2V0aG9zdGJ5bmFtZSgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzEwNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBuc2wgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKKyAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfbGliIDEKK0VPRgorCisgIExJQlM9Ii1sbnNsICRMSUJTIgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisuICR7c3JjZGlyfS8uLi8uLi9iZmQvY29uZmlndXJlLmhvc3QKKworCisKK1VTRV9NQUlOVEFJTkVSX01PREU9bm8KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCU1BSU5UPSIiIFVTRV9NQUlOVEFJTkVSX01PREU9eWVzIDs7CisgIG5vKQlNQUlOVD0iIyIgOzsKKyAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgTUFJTlQ9IiMiIDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkTUFJTlQiID0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgbWFpbnRhaW5lciBtb2RlIiA2PiYxCitmaQorZWxzZQorICBNQUlOVD0iIyIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWJzd2FwIG9yIC0tZGlzYWJsZS1zaW0tYnN3YXAgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2Jzd2FwK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fYnN3YXAiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0xIC1EVVNFX0JTV0FQPTEiOzsKKyAgbm8pCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTAiOzsKKyAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLWJzd2FwIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2Jzd2FwPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYnN3YXAiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGJzd2FwIGZsYWdzID0gJHNpbV9ic3dhcCIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2Jzd2FwPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1jZmxhZ3Mgb3IgLS1kaXNhYmxlLXNpbS1jZmxhZ3Mgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2NmbGFncytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2NmbGFncyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCSBzaW1fY2ZsYWdzPSItTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIiOzsKKyAgdHJhY2UpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlBsZWFzZSB1c2UgLS1lbmFibGUtc2ltLWRlYnVnIGluc3RlYWQuIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fY2ZsYWdzPSIiOzsKKyAgbm8pCSBzaW1fY2ZsYWdzPSIiOzsKKyAgKikJIHNpbV9jZmxhZ3M9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2NmbGFncyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIGNmbGFncyA9ICRzaW1fY2ZsYWdzIiA2PiYxCitmaQorZWxzZQorICBzaW1fY2ZsYWdzPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1kZWJ1ZyBvciAtLWRpc2FibGUtc2ltLWRlYnVnIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9kZWJ1ZytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2RlYnVnIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykgc2ltX2RlYnVnPSItRERFQlVHPTcgLURXSVRIX0RFQlVHPTciOzsKKyAgbm8pICBzaW1fZGVidWc9Ii1EREVCVUc9MCAtRFdJVEhfREVCVUc9MCI7OworICAqKSAgIHNpbV9kZWJ1Zz0iLURERUJVRz0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9ERUJVRz0nKCR7ZW5hYmxldmFsfSknIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2RlYnVnIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gZGVidWcgPSAkc2ltX2RlYnVnIiA2PiYxCitmaQorZWxzZQorICBzaW1fZGVidWc9IiIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXN0ZGlvIG9yIC0tZGlzYWJsZS1zaW0tc3RkaW8gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3N0ZGlvK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fc3RkaW8iCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET19VU0VfU1RESU8iOzsKKyAgbm8pCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPTlRfVVNFX1NURElPIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLXN0ZGlvIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fc3RkaW89IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zdGRpbyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc3RkaW8gZmxhZ3MgPSAkc2ltX3N0ZGlvIiA2PiYxCitmaQorZWxzZQorICBzaW1fc3RkaW89IiIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXRyYWNlIG9yIC0tZGlzYWJsZS1zaW0tdHJhY2Ugd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3RyYWNlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fdHJhY2UiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MSAtRFdJVEhfVFJBQ0U9LTEiOzsKKyAgbm8pCXNpbV90cmFjZT0iLURUUkFDRT0wIC1EV0lUSF9UUkFDRT0wIjs7CisgIFstMC05XSopCisJc2ltX3RyYWNlPSItRFRSQUNFPScoJHtlbmFibGV2YWx9KScgLURXSVRIX1RSQUNFPScoJHtlbmFibGV2YWx9KSciOzsKKyAgW2Etel0qKQorCXNpbV90cmFjZT0iIgorCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbworCSAgaWYgdGVzdCB4IiRzaW1fdHJhY2UiID0geDsgdGhlbgorCSAgICBzaW1fdHJhY2U9Ii1EV0lUSF9UUkFDRT0nKFRSQUNFXyR4IgorCSAgZWxzZQorCSAgICBzaW1fdHJhY2U9IiR7c2ltX3RyYWNlfXxUUkFDRV8keCIKKwkgIGZpCisJZG9uZQorCXNpbV90cmFjZT0iJHNpbV90cmFjZSknIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV90cmFjZSIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIHRyYWNlID0gJHNpbV90cmFjZSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3RyYWNlPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1wcm9maWxlIG9yIC0tZGlzYWJsZS1zaW0tcHJvZmlsZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fcHJvZmlsZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3Byb2ZpbGUiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTEgLURXSVRIX1BST0ZJTEU9LTEiOzsKKyAgbm8pCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9MCAtRFdJVEhfUFJPRklMRT0wIjs7CisgIFstMC05XSopCisJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9QUk9GSUxFPScoJHtlbmFibGV2YWx9KSciOzsKKyAgW2Etel0qKQorCXNpbV9wcm9maWxlPSIiCisJZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCisJICBpZiB0ZXN0IHgiJHNpbV9wcm9maWxlIiA9IHg7IHRoZW4KKwkgICAgc2ltX3Byb2ZpbGU9Ii1EV0lUSF9QUk9GSUxFPScoUFJPRklMRV8keCIKKwkgIGVsc2UKKwkgICAgc2ltX3Byb2ZpbGU9IiR7c2ltX3Byb2ZpbGV9fFBST0ZJTEVfJHgiCisJICBmaQorCWRvbmUKKwlzaW1fcHJvZmlsZT0iJHNpbV9wcm9maWxlKSciIDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBwcm9maWxlID0gJHNpbV9wcm9maWxlIiA2PiYxCitmaQorZWxzZQorICBzaW1fcHJvZmlsZT0iIgorZmkKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzI4MjogY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpZ25hbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMyODcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2lmZGVmIHNpZ25hbAorI3VuZGVmIHNpZ25hbAorI2VuZGlmCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgdm9pZCAoKnNpZ25hbCAoaW50LCB2b2lkICgqKShpbnQpKSkoaW50KTsKKyNlbHNlCit2b2lkICgqc2lnbmFsICgpKSAoKTsKKyNlbmRpZgorCitpbnQgbWFpbigpIHsKK2ludCBpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzMDQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpZ25hbD12b2lkCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2lnbmFsPWludAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpZ25hbCIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgUkVUU0lHVFlQRSAkYWNfY3ZfdHlwZV9zaWduYWwKK0VPRgorCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMzI0OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRDWUdXSU4zMiIgPSB5ZXM7IHRoZW4KK2FtX2N2X2V4ZWV4dD0uZXhlCitlbHNlCitjYXQgPiBhbV9jX3Rlc3QuYyA8PCAnRU9GJworaW50IG1haW4oKSB7CisvKiBOb3RoaW5nIG5lZWRlZCBoZXJlICovCit9CitFT0YKKyR7Q0MtY2N9IC1vIGFtX2NfdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBhbV9jX3Rlc3QuYyAkTElCUyAxPiY1CithbV9jdl9leGVleHQ9YGxzIGFtX2NfdGVzdC4qIHwgZ3JlcCAtdiBhbV9jX3Rlc3QuYyB8IHNlZCAtZSBzL2FtX2NfdGVzdC8vYAorcm0gLWYgYW1fY190ZXN0KgorZmkKKwordGVzdCB4IiR7YW1fY3ZfZXhlZXh0fSIgPSB4ICYmIGFtX2N2X2V4ZWV4dD1ubworZmkKK0VYRUVYVD0iIgordGVzdCB4IiR7YW1fY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FtX2N2X2V4ZWV4dH0KK2VjaG8gIiRhY190IiIke2FtX2N2X2V4ZWV4dH0iIDE+JjYKKworCitzaW1fbGlua19maWxlcz0KK3NpbV9saW5rX2xpbmtzPQorCitzaW1fbGlua19saW5rcz10Y29uZmlnLmgKK2lmIHRlc3QgLWYgJHtzcmNkaXJ9L3Rjb25maWcuaW4KK3RoZW4KKyAgc2ltX2xpbmtfZmlsZXM9dGNvbmZpZy5pbgorZWxzZQorICBzaW1fbGlua19maWxlcz0uLi9jb21tb24vdGNvbmZpZy5pbgorZmkKKworIyB0YXJnLXZhbHMuZGVmIHBvaW50cyB0byB0aGUgbGliYyBtYWNybyBkZXNjcmlwdGlvbiBmaWxlLgorY2FzZSAiJHt0YXJnZXR9IiBpbgorKi0qLSopIFRBUkdfVkFMU19ERUY9Li4vY29tbW9uL25sdHZhbHMuZGVmIDs7Citlc2FjCitzaW1fbGlua19maWxlcz0iJHtzaW1fbGlua19maWxlc30gJHtUQVJHX1ZBTFNfREVGfSIKK3NpbV9saW5rX2xpbmtzPSIke3NpbV9saW5rX2xpbmtzfSB0YXJnLXZhbHMuZGVmIgorCisKKworZm9yIGFjX2hkciBpbiBzdGRsaWIuaCB0aW1lLmggc3lzL3BhcmFtLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMzcyOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzM3NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MzM4MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworCisKK3RyYXAgJycgMSAyIDE1CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxIHwgZ3JlcCBhY19zcGFjZWAgaW4KKyAgKmFjX3NwYWNlPVwgKikKKyAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgc2VkIC1uIFwKKyAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCisgICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCisgICAgOzsKKyAgKikKKyAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKyAgICA7OworICBlc2FjID4+IGNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCisjIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KKyMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJworZmkKKwordHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorCitERUZTPS1ESEFWRV9DT05GSUdfSAorCisjIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKworZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUworcm0gLWYgJENPTkZJR19TVEFUVVMKK2NhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisjISAvYmluL3NoCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAorIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMKKyMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCisjCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKK2ZvciBhY19vcHRpb24KK2RvCisgIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCisgICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQorICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiIKKyAgICBleGl0IDAgOzsKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCisgICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7CisgIGVzYWMKK2RvbmUKKworYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKK2FjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgorCit0cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlLnNpbTpNYWtlZmlsZS5pbiBNYWtlLWNvbW1vbi5zaW06Li4vY29tbW9uL01ha2UtY29tbW9uLmluIC5nZGJpbml0Oi4uL2NvbW1vbi9nZGJpbml0LmluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KK3NlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Cisgcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKKyRhY192cHN1YgorJGV4dHJhc3ViCitzJUBzaW1fZW52aXJvbm1lbnRAJSRzaW1fZW52aXJvbm1lbnQlZworcyVAc2ltX2FsaWdubWVudEAlJHNpbV9hbGlnbm1lbnQlZworcyVAc2ltX2Fzc2VydEAlJHNpbV9hc3NlcnQlZworcyVAc2ltX2JpdHNpemVAJSRzaW1fYml0c2l6ZSVnCitzJUBzaW1fZW5kaWFuQCUkc2ltX2VuZGlhbiVnCitzJUBzaW1faG9zdGVuZGlhbkAlJHNpbV9ob3N0ZW5kaWFuJWcKK3MlQHNpbV9mbG9hdEAlJHNpbV9mbG9hdCVnCitzJUBzaW1fc2NhY2hlQCUkc2ltX3NjYWNoZSVnCitzJUBzaW1fZGVmYXVsdF9tb2RlbEAlJHNpbV9kZWZhdWx0X21vZGVsJWcKK3MlQHNpbV9od19jZmxhZ3NAJSRzaW1faHdfY2ZsYWdzJWcKK3MlQHNpbV9od19vYmpzQCUkc2ltX2h3X29ianMlZworcyVAc2ltX2h3QCUkc2ltX2h3JWcKK3MlQHNpbV9pbmxpbmVAJSRzaW1faW5saW5lJWcKK3MlQHNpbV9wYWNrYWdlc0AlJHNpbV9wYWNrYWdlcyVnCitzJUBzaW1fcmVncGFybUAlJHNpbV9yZWdwYXJtJWcKK3MlQHNpbV9yZXNlcnZlZF9iaXRzQCUkc2ltX3Jlc2VydmVkX2JpdHMlZworcyVAc2ltX3NtcEAlJHNpbV9zbXAlZworcyVAc2ltX3N0ZGNhbGxAJSRzaW1fc3RkY2FsbCVnCitzJUBzaW1feG9yX2VuZGlhbkAlJHNpbV94b3JfZW5kaWFuJWcKK3MlQGJ1aWxkX3dhcm5pbmdzQCUkYnVpbGRfd2FybmluZ3MlZworcyVAU0hFTExAJSRTSEVMTCVnCitzJUBDRkxBR1NAJSRDRkxBR1MlZworcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCitzJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKK3MlQERFRlNAJSRERUZTJWcKK3MlQExERkxBR1NAJSRMREZMQUdTJWcKK3MlQExJQlNAJSRMSUJTJWcKK3MlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworcyVAcHJlZml4QCUkcHJlZml4JWcKK3MlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKK3MlQGJpbmRpckAlJGJpbmRpciVnCitzJUBzYmluZGlyQCUkc2JpbmRpciVnCitzJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCitzJUBkYXRhZGlyQCUkZGF0YWRpciVnCitzJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCitzJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKK3MlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKK3MlQGxpYmRpckAlJGxpYmRpciVnCitzJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCitzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCitzJUBpbmZvZGlyQCUkaW5mb2RpciVnCitzJUBtYW5kaXJAJSRtYW5kaXIlZworcyVAaG9zdEAlJGhvc3QlZworcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZworcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCitzJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKK3MlQGhvc3Rfb3NAJSRob3N0X29zJWcKK3MlQHRhcmdldEAlJHRhcmdldCVnCitzJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZworcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZworcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZworcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKK3MlQGJ1aWxkQCUkYnVpbGQlZworcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCitzJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZworcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKK3MlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZworcyVAQ0NAJSRDQyVnCitzJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZworcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKK3MlQENDX0ZPUl9CVUlMREAlJENDX0ZPUl9CVUlMRCVnCitzJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKK3MlQEFSQCUkQVIlZworcyVAUkFOTElCQCUkUkFOTElCJWcKK3MlQFNFVF9NQUtFQCUkU0VUX01BS0UlZworcyVAQ1BQQCUkQ1BQJWcKK3MlQEFMTE9DQUAlJEFMTE9DQSVnCitzJUBVU0VfTkxTQCUkVVNFX05MUyVnCitzJUBNU0dGTVRAJSRNU0dGTVQlZworcyVAR01TR0ZNVEAlJEdNU0dGTVQlZworcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCitzJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKK3MlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZworcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKK3MlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZworcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCitzJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCitzJUBJTlRMREVQU0AlJElOVExERVBTJWcKK3MlQElOVExMSUJTQCUkSU5UTExJQlMlZworcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCitzJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCitzJUBQT1NVQkAlJFBPU1VCJWcKK3MlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKK3MlQEdUX05PQCUkR1RfTk8lZworcyVAR1RfWUVTQCUkR1RfWUVTJWcKK3MlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKK3MlQGxAJSRsJWcKK3MlQE1BSU5UQCUkTUFJTlQlZworcyVAc2ltX2Jzd2FwQCUkc2ltX2Jzd2FwJWcKK3MlQHNpbV9jZmxhZ3NAJSRzaW1fY2ZsYWdzJWcKK3MlQHNpbV9kZWJ1Z0AlJHNpbV9kZWJ1ZyVnCitzJUBzaW1fc3RkaW9AJSRzaW1fc3RkaW8lZworcyVAc2ltX3RyYWNlQCUkc2ltX3RyYWNlJWcKK3MlQHNpbV9wcm9maWxlQCUkc2ltX3Byb2ZpbGUlZworcyVARVhFRVhUQCUkRVhFRVhUJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlLnNpbTpNYWtlZmlsZS5pbiBNYWtlLWNvbW1vbi5zaW06Li4vY29tbW9uL01ha2UtY29tbW9uLmluIC5nZGJpbml0Oi4uL2NvbW1vbi9nZGJpbml0LmluIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KKyAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OworICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKK3MlQElOU1RBTExAJSRJTlNUQUxMJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCisjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgorIworIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCithY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKK2FjX2RDPSdcMycKK2FjX2REPSclZycKKyMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJworYWNfdUM9JyAnCithY191RD0nXDQlZycKKyMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX2VCPSckJVwxI1wyZGVmaW5lXDMnCithY19lQz0nICcKK2FjX2VEPSclZycKKworaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisgIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZpCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICRhY19maWxlCisKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCisKK0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcworIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6CisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgorcm0gLWYgY29uZnRlc3QudmFscworY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgorcy9bXFwmJV0vXFwmL2cKK3MlW1xcJGBdJVxcJiVnCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAorcyVhY19kJWFjX3UlZ3AKK3MlYWNfdSVhY19lJWdwCitFT0YKK3NlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKK3JtIC1mIGNvbmZ0ZXN0LmhkcgorCisjIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCisjIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCisjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KK2NhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgorcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKK0VPRgorCisjIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KKyMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCisKK3JtIC1mIGNvbmZ0ZXN0LnRhaWwKK3doaWxlIDoKK2RvCisgIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKKyAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgorICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCisgICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgorICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKKyAgZWNobyAnQ0VPRgorICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAorICBybSAtZiBjb25mdGVzdC5pbgorICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KKycgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKKyAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCitkb25lCitybSAtZiBjb25mdGVzdC52YWxzCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCisgIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAorICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAorICBybSAtZiBjb25mdGVzdC5pbgorICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKKyAgICBybSAtZiBjb25mdGVzdC5oCisgIGVsc2UKKyAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGZpCisgICAgcm0gLWYgJGFjX2ZpbGUKKyAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCisgIGZpCitmaTsgZG9uZQorCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCithY19zb3VyY2VzPSIkc2ltX2xpbmtfZmlsZXMiCithY19kZXN0cz0iJHNpbV9saW5rX2xpbmtzIgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK3NyY2Rpcj0kYWNfZ2l2ZW5fc3JjZGlyCit3aGlsZSB0ZXN0IC1uICIkYWNfc291cmNlcyI7IGRvCisgIHNldCAkYWNfZGVzdHM7IGFjX2Rlc3Q9JDE7IHNoaWZ0OyBhY19kZXN0cz0kKgorICBzZXQgJGFjX3NvdXJjZXM7IGFjX3NvdXJjZT0kMTsgc2hpZnQ7IGFjX3NvdXJjZXM9JCoKKworICBlY2hvICJsaW5raW5nICRzcmNkaXIvJGFjX3NvdXJjZSB0byAkYWNfZGVzdCIKKworICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfc291cmNlOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkc3JjZGlyLyRhY19zb3VyY2U6IEZpbGUgbm90IGZvdW5kIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKKyAgcm0gLWYgJGFjX2Rlc3QKKworICAjIE1ha2UgcmVsYXRpdmUgc3ltbGlua3MuCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kZXN0X2Rpcj1gZWNobyAkYWNfZGVzdHxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gIiRhY19kZXN0IiAmJiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBkZXN0IGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGVzdF9kaXIiICYmIG1rZGlyICIkYWNfZGVzdF9kaXIiCisgICAgYWNfZGVzdF9kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2Rlc3RfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kZXN0X2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGVzdF9kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGVzdF9kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRzcmNkaXIiIGluCisgIFsvJF0qKSBhY19yZWxfc291cmNlPSIkc3JjZGlyLyRhY19zb3VyY2UiIDs7CisgICopIGFjX3JlbF9zb3VyY2U9IiRhY19kb3RzJHNyY2Rpci8kYWNfc291cmNlIiA7OworICBlc2FjCisKKyAgIyBNYWtlIGEgc3ltbGluayBpZiBwb3NzaWJsZTsgb3RoZXJ3aXNlIHRyeSBhIGhhcmQgbGluay4KKyAgaWYgbG4gLXMgJGFjX3JlbF9zb3VyY2UgJGFjX2Rlc3QgMj4vZGV2L251bGwgfHwKKyAgICBsbiAkc3JjZGlyLyRhY19zb3VyY2UgJGFjX2Rlc3Q7IHRoZW4gOgorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGxpbmsgJGFjX2Rlc3QgdG8gJHNyY2Rpci8kYWNfc291cmNlIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2RvbmUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorY2FzZSAieCRDT05GSUdfRklMRVMiIGluCisgeE1ha2VmaWxlKikKKyAgIGVjaG8gIk1lcmdpbmcgTWFrZWZpbGUuc2ltK01ha2UtY29tbW9uLnNpbSBpbnRvIE1ha2VmaWxlIC4uLiIKKyAgIHJtIC1mIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAgTWFrZWZpbGUKKyAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUFJFXy8sL14jIyBFbmQgQ09NTU9OX1BSRV8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0xLnRtcAorICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QT1NUXy8sL14jIyBFbmQgQ09NTU9OX1BPU1RfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMi50bXAKKyAgIHNlZCAtZSAnL14jIyBDT01NT05fUFJFXy8gciBNYWtlc2ltMS50bXAnIFwKKwktZSAnL14jIyBDT01NT05fUE9TVF8vIHIgTWFrZXNpbTIudG1wJyBcCisJPE1ha2VmaWxlLnNpbSA+TWFrZWZpbGUKKyAgIHJtIC1mIE1ha2VmaWxlLnNpbSBNYWtlLWNvbW1vbi5zaW0gTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcAorICAgOzsKKyBlc2FjCisgY2FzZSAieCRDT05GSUdfSEVBREVSUyIgaW4geGNvbmZpZy5oOmNvbmZpZy5pbikgZWNobyA+IHN0YW1wLWggOzsgZXNhYworCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKworCmRpZmYgLS1naXQgYS9zaW0vaDgzMDAvY29uZmlndXJlLmluIGIvc2ltL2g4MzAwL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDk1M2RkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2g4MzAwL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDEwIEBACitkbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK3NpbmNsdWRlKC4uL2NvbW1vbi9hY2xvY2FsLm00KQorQUNfUFJFUkVRKDIuNSlkbmwKK0FDX0lOSVQoTWFrZWZpbGUuaW4pCisKK1NJTV9BQ19DT01NT04KKworQUNfQ0hFQ0tfSEVBREVSUyhzdGRsaWIuaCB0aW1lLmggc3lzL3BhcmFtLmgpCisKK1NJTV9BQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3NpbS9oODMwMC9pbnN0LmggYi9zaW0vaDgzMDAvaW5zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOTMwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaDgzMDAvaW5zdC5oCkBAIC0wLDAgKzEsODkgQEAKKyNkZWZpbmUgREVCVUcKKworLyogVGhlc2UgZGVmaW5lIHRoZSBzaXplIG9mIG1haW4gbWVtb3J5IGZvciB0aGUgc2ltdWxhdG9yLgorCisgICBOb3RlIHRoZSBzaXplIG9mIG1haW4gbWVtb3J5IGZvciB0aGUgSDgvMzAwSCBpcyBvbmx5IDI1NmsuICBLZWVwaW5nIGl0CisgICBzbWFsbCBtYWtlcyB0aGUgc2ltdWxhdG9yIHJ1biBtdWNoIGZhc3RlciBhbmQgY29uc3VtZSBsZXNzIG1lbW9yeS4KKworICAgVGhlIGxpbmtlciBrbm93cyBhYm91dCB0aGUgbGltaXRlZCBzaXplIG9mIHRoZSBzaW11bGF0b3IncyBtYWluIG1lbW9yeQorICAgb24gdGhlIEg4LzMwMEggKHZpYSB0aGUgaDgzMDBoLnNjIGxpbmtlciBzY3JpcHQpLiAgU28gaWYgeW91IGNoYW5nZQorICAgSDgzMDBIX01TSVpFLCBiZSBzdXJlIHRvIGZpeCB0aGUgbGlua2VyIHNjcmlwdCB0b28uCisKKyAgIEFsc28gbm90ZSB0aGF0IHRoZXJlJ3MgYSBzZXBhcmF0ZSAiZWlnaHRiaXQiIGFyZWEgYXNpZGUgZnJvbSBtYWluCisgICBtZW1vcnkuICBGb3Igc2ltcGxpY2l0eSwgdGhlIHNpbXVsYXRvciBhc3N1bWVzIGFueSBkYXRhIG1lbW9yeSByZWZlcmVuY2UKKyAgIG91dHNpZGUgb2YgbWFpbiBtZW1vcnkgcmVmZXJzIHRvIHRoZSBlaWdodGJpdCBhcmVhIChpbiB0aGVvcnksIHRoaXMKKyAgIGNhbiBvbmx5IGhhcHBlbiB3aGVuIHNpbXVsYXRpbmcgSDgvMzAwSCBwcm9ncmFtcykuICBXZSBtYWtlIG5vIGF0dGVtcHQKKyAgIHRvIGNhdGNoIG92ZXJsYXBwaW5nIGFkZHJlc3Nlcywgd3JhcHBlZCBhZGRyZXNzZXMsIGV0YyBldGMuICAqLworI2RlZmluZSBIODMwMF9NU0laRSAoMTw8MTYpCisjZGVmaW5lIEg4MzAwSF9NU0laRSAoMTw8MTgpCisKKyNkZWZpbmUgQ1NJWkUgMTAwMAorCisvKiBMb2NhbCByZWdpc3RlciBuYW1lcyAqLwordHlwZWRlZiBlbnVtCit7CisgIFIwLCBSMSwgUjIsIFIzLCBSNCwgUjUsIFI2LCBSNywKKyAgUl9aRVJPLAorICBSX1BDLAkJCQkKKyAgUl9DQ1IsCisgIFJfSEFSRF8wLAkJCQorICBSX0xBU1QsCit9IHJlZ190eXBlOworCisKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGFkZHJlc3NpbmcgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IHR5cGU7CisgIGludCByZWc7CisgIGludCBsaXRlcmFsOworfSBlYV90eXBlOworCisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZWFfdHlwZSBzcmM7CisgIGVhX3R5cGUgZHN0OworICBpbnQgb3Bjb2RlOworICBpbnQgbmV4dF9wYzsKKyAgaW50IG9sZHBjOworICBpbnQgY3ljbGVzOworI2lmZGVmIERFQlVHCitzdHJ1Y3QgaDhfb3Bjb2RlICpvcDsKKyNlbmRpZgorfQorZGVjb2RlZF9pbnN0OworCitlbnVtIGg4MzAwX3NpbV9zdGF0ZSB7CisgIFNJTV9TVEFURV9SVU5OSU5HLCBTSU1fU1RBVEVfRVhJVEVELCBTSU1fU1RBVEVfU0lHTkFMTEVELCBTSU1fU1RBVEVfU1RPUFBFRAorfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgZW51bSBoODMwMF9zaW1fc3RhdGUgc3RhdGU7CisgIGludCBleGNlcHRpb247CisgIHVuc2lnbmVkICBpbnQgcmVnc1s5XTsKKyAgaW50IHBjOworICBpbnQgY2NyOworICAKKworICB1bnNpZ25lZCBjaGFyICptZW1vcnk7CisgIHVuc2lnbmVkIGNoYXIgKmVpZ2h0Yml0OworICB1bnNpZ25lZCBzaG9ydCAqY2FjaGVfaWR4OworICBpbnQgY2FjaGVfdG9wOworICBpbnQgbWF4aW11bTsKKyAgaW50IGNzaXplOworICBpbnQgbWFzazsKKyAgCisgIGRlY29kZWRfaW5zdCAqY2FjaGU7CisgIGludCBjeWNsZXM7CisgIGludCBpbnN0czsKKyAgaW50IHRpY2tzOworICBpbnQgY29tcGlsZXM7CisjaWZkZWYgQURFQlVHCisgIGludCBzdGF0c1tPX0xBU1RdOworI2VuZGlmCit9CitjcHVfc3RhdGVfdHlwZTsKZGlmZiAtLWdpdCBhL3NpbS9oODMwMC90Y29uZmlnLmluIGIvc2ltL2g4MzAwL3Rjb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1OTlkYgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9oODMwMC90Y29uZmlnLmluCkBAIC0wLDAgKzEsMTcgQEAKKy8qIGg4MzAwIHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuICAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHN1cHBvcnRzIHByb2ZpbGluZy4KKyAgIFNlZSB0aGUgbWlwcyBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCisgICBUaGlzIGVuYWJsZXMgdGhlIGAtcCBmb28nIGFuZCBgLXMgYmFyJyBvcHRpb25zLgorICAgVGhlIHRhcmdldCBpcyByZXF1aXJlZCB0byBwcm92aWRlIHNpbV9zZXRfcHJvZmlsZXssX3NpemV9LiAgKi8KKy8qICNkZWZpbmUgU0lNX0hBVkVfUFJPRklMRSAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHVzZXMgYW4gaW5zdHJ1Y3Rpb24gY2FjaGUuCisgICBTZWUgdGhlIGg4LzMwMCBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCisgICBUaGlzIGVuYWJsZXMgdGhlIGAtYyBzaXplJyBvcHRpb24gdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBjYWNoZS4KKyAgIFRoZSB0YXJnZXQgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzaW1fc2V0X3NpbWNhY2hlX3NpemUuICAqLworI2RlZmluZSBTSU1fSEFWRV9TSU1DQUNIRQorCisvKiBGSVhNRTogVGhpcyBpcyBhIHF1aWNrIGhhY2sgZm9yIHJ1bi5jIHNvIGl0IGNhbiBzdXBwb3J0IHRoZSBgLWgnIG9wdGlvbi4KKyAgIEl0IHdpbGwgZXZlbnR1YWxseSBiZSByZXBsYWNlZCBieSBhIG1vcmUgZ2VuZXJhbCBmYWNpbGl0eS4gICovCisjZGVmaW5lIFNJTV9IODMwMApkaWZmIC0tZ2l0IGEvc2ltL2g4MzAwL3dyaXRlY29kZS5jIGIvc2ltL2g4MzAwL3dyaXRlY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYmJmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaDgzMDAvd3JpdGVjb2RlLmMKQEAgLTAsMCArMSwxMDMzIEBACisvKiBDb2RlIGdlbmVyYXRvciBmb3IgdGhlIEhpdGFjaGkgSDgvMzAwIGFyY2hpdGVjdHVyZSBzaW11bGF0b3IuCisKKyAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCisgICBzYWNAY3lnbnVzLmNvbQorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBIOC8zMDAgc2ltCisKKworCQlUSElTIFNPRlRXQVJFIElTIE5PVCBDT1BZUklHSFRFRAorCisgICBDeWdudXMgb2ZmZXJzIHRoZSBmb2xsb3dpbmcgZm9yIHVzZSBpbiB0aGUgcHVibGljIGRvbWFpbi4gIEN5Z251cworICAgbWFrZXMgbm8gd2FycmFudHkgd2l0aCByZWdhcmQgdG8gdGhlIHNvZnR3YXJlIG9yIGl0J3MgcGVyZm9ybWFuY2UKKyAgIGFuZCB0aGUgdXNlciBhY2NlcHRzIHRoZSBzb2Z0d2FyZSAiQVMgSVMiIHdpdGggYWxsIGZhdWx0cy4KKworICAgQ1lHTlVTIERJU0NMQUlNUyBBTlkgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBXSVRIIFJFR0FSRCBUTworICAgVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorCisqLworCisvKiBUaGlzIHByb2dyYW0gcmVhZHMgdGhlIEg4LzMwMCBvcGNvZGUgdGFibGUgYW5kIHdyaXRlcyBvdXQKKyAgIGEgbGFyZ2Ugc3dpdGNoIHN0YXRlbWVudCB0byB1bmRlcnN0YW5kIHRoZSBvcGNvZGVzICh3aXRoIGlmcyBpZgorICAgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBvcGNvZGUgcGVyIGNhc2UpIGFuZCBjb2RlIHRvIGRvIHRoZSBzdHVmZiAgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgREVGSU5FX1RBQkxFCisjZGVmaW5lIElOU0lNCisjaW5jbHVkZSJvcGNvZGUvaDgzMDAuaCIKKworI2RlZmluZSBNQVhTQU1FIDE0MAorCisjZGVmaW5lIFBUV08gMjU2CitzdGF0aWMgc3RydWN0IGg4X29wY29kZSAqaDhfb3Bjb2Rlc19zb3J0ZWRbUFRXT11bTUFYU0FNRV07CisKK2NoYXIgKmNzID0gIi8qIjsKK2NoYXIgKmNlID0gIiovIjsKKworLyogSG93IHRvIGdldCBhdCBuaWJibGUgbiBmcm9tIHRoZSBpbnN0cnVjdGlvbiAqLworY2hhciAqbmlic1tdID0KK3sKKyAgImZvbyIsCisgICIoYjAmMHhmKSIsCisgICIoKGIxPj40KSYweGYpIiwKKyAgIigoYjEpJjB4ZikiLAorICAiKChwY1sxXT4+MTIpJjB4ZikiLAorICAiKChwY1sxXT4+OCkmMHhmKSIsCisgICIoKHBjWzFdPj40KSYweGYpIiwKKyAgIigocGNbMV0pJjB4ZikiLAorICAwLCAwfTsKKworLyogaG93IHRvIGdldCBhdCB0aGUgMyBiaXQgaW1tZWRpYXRlIGluIHRoZSBpbnN0cnVjdGlvbiAqLworY2hhciAqaW1tM1tdID0KK3siZm9vIiwKKyAiZm9vIiwKKyAiKChiMT4+NCkmMHg3KSIsCisgImZvbyIsCisgImZvbyIsCisgImZvbyIsCisgIihwY1sxXT4+NCkmMHg3In07CisKKy8qIEhvdyB0byBnZXQgYXQgYSBieXRlIHJlZ2lzdGVyIGZyb20gYW4gaW5kZXggaW4gdGhlIGluc3RydWN0aW9uIGF0CisgICBuaWJibGUgbiAqLworY2hhciAqYnJlZ1tdID0KK3siZm9vIiwKKyAiKihibG93W2IwXSkiLAorICIqKGJoaWdoW2IxXSkiLAorICIqKGJsb3dbYjFdKSIsCisgMCwgMCwKKyAiKihiaGlnaFtwY1sxXT4+OF0pIn07CisKKy8qIEhvdyB0byBnZXQgYXQgYSB3b3JkIHJlZ2lzdGVyIGZyb20gYW4gaW5kZXggaW4gdGhlIGluc3RydWN0aW9uIGF0CisgICBuaWJibGUgbiAqLworCitjaGFyICp3cmVnW10gPQoreyJmb28iLAorICIqKHdsb3dbYjBdKSIsCisgIiood2hpZ2hbYjFdKSIsCisgIiood2xvd1tiMV0pIn07CisKKyNkZWZpbmUgc29ydGVkX2tleSBub3BlcmFuZHMKKworLyogc29ydCB0aGUgb3Bjb2RlIHRhYmxlIGludG8gaDhfb3Bjb2Rlc19zb3J0ZWRbMC4uMjU1XSAqLworc3RhdGljIHZvaWQKK2luaXQgKCkKK3sKKyAgdW5zaWduZWQgaW50IGk7CisgIHN0cnVjdCBoOF9vcGNvZGUgKnA7CisKKyAgZm9yIChwID0gaDhfb3Bjb2RlczsgcC0+bmFtZTsgcCsrKQorICAgIHsKKyAgICAgIGludCBuMSA9IDA7CisgICAgICBpbnQgbjIgPSAwOworICAgICAgaW50IGo7CisjaWYgMAorICAgICAgZm9yIChqID0gMDsgcC0+ZGF0YS5uaWJbal0gIT0gRTsgaisrKQorCXsKKwkgIGlmICgoaW50KSBwLT5kYXRhLm5pYltqXSA9PSBBQlMxNk9SUkVMOFNSQykKKwkgICAgcC0+ZGF0YS5uaWJbal0gPSBBQlMxNlNSQzsKKwkgIGlmICgoaW50KSBwLT5kYXRhLm5pYltqXSA9PSBBQlMxNk9SOFNSQykKKwkgICAgcC0+ZGF0YS5uaWJbal0gPSBBQlMxNlNSQzsKKwkgIGlmICgoaW50KSBwLT5kYXRhLm5pYltqXSA9PSBBQlMxNk9SOERTVCkKKwkgICAgcC0+ZGF0YS5uaWJbal0gPSBBQlMxNkRTVDsKKwl9CisjZW5kaWYKKworICAgICAgaWYgKChpbnQpIHAtPmRhdGEubmliWzBdIDwgMTYpCisJeworCSAgbjEgPSAoaW50KSBwLT5kYXRhLm5pYlswXTsKKwl9CisgICAgICBlbHNlCisJbjEgPSAwOworICAgICAgaWYgKChpbnQpIHAtPmRhdGEubmliWzFdIDwgMTYpCisJeworCSAgbjIgPSAoaW50KSBwLT5kYXRhLm5pYlsxXTsKKwl9CisgICAgICBlbHNlCisJbjIgPSAwOworICAgICAgZm9yIChpID0gMDsgaSA8IE1BWFNBTUU7IGkrKykKKwl7CisJICBpbnQgaiA9IC8qICgobjMgPj4gMykgKiA1MTIpICsgKChuNCA+PiAzKSAqIDI1NikgKyAqLyBuMSAqIDE2ICsgbjI7CisKKwkgIGlmIChoOF9vcGNvZGVzX3NvcnRlZFtqXVtpXSA9PSAoc3RydWN0IGg4X29wY29kZSAqKSBOVUxMKQorCSAgICB7CisJICAgICAgaDhfb3Bjb2Rlc19zb3J0ZWRbal1baV0gPSBwOworCSAgICAgIHAtPnNvcnRlZF9rZXkgPSBqOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorCisgICAgICBpZiAoaSA9PSBNQVhTQU1FKQorCWFib3J0ICgpOworCisgICAgICAvKiBKdXN0IG1ha2Ugc3VyZSB0aGVyZSBhcmUgYW4gZXZlbiBudW1iZXIgb2YgbmliYmxlcyBpbiBpdCwgYW5kCisgICAgICAgdGhhdCB0aGUgY291bnQgaXMgdGhlIHNhbWUgcyB0aGUgbGVuZ3RoICovCisgICAgICBmb3IgKGkgPSAwOyBwLT5kYXRhLm5pYltpXSAhPSBFOyBpKyspCisJLypFTVBUWSovIDsKKyAgICAgIGlmIChpICYgMSkKKwlhYm9ydCAoKTsKKyAgICAgIHAtPmxlbmd0aCA9IGkgLyAyOworICAgIH0KKyAgZm9yIChpID0gMDsgaSA8IFBUV087IGkrKykKKyAgICB7CisgICAgICBpZiAoaDhfb3Bjb2Rlc19zb3J0ZWRbaV1bMF0pCisJcCA9IGg4X29wY29kZXNfc29ydGVkW2ldWzBdOworICAgICAgZWxzZQorCWg4X29wY29kZXNfc29ydGVkW2ldWzBdID0gcDsKKyAgICB9Cit9CisKKy8qIGRlY29kZSB0aGUgbHZhbHVlcywgY3JlYXRpbmcgYSBwb2ludGVyIGluIHJlYWwgc3BhY2UgdG8gb2JqZWN0IC0KKyByZW1lbWJlciBpZiB0aGUgdGhpbmcgaGFzIHRvIGJlIHN3YXBwZWQgb3V0IG9mIHdoZXJlIGl0IGlzICovCisKKworaW50IHN3YXBbMl07CisKK2x2YWwgKHApCisgICAgIHN0cnVjdCBoOF9vcGNvZGUgKnA7Cit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IHAtPmRhdGEubmliW2ldICE9IEU7IGkrKykKKyAgICB7CisgICAgICBpbnQgeCA9IHAtPmRhdGEubmliW2ldOworICAgICAgaW50IHNpemU7CisgICAgICBpbnQgb3A7CisgICAgICBvcCA9ICh4ICYgRFNUKSA/IDEgOiAwOworCisgICAgICBzd2l0Y2ggKHggJiBTSVpFKQorCXsKKwljYXNlIExfMzI6CisJICBzaXplID0gMzI7CisJICBicmVhazsKKwljYXNlIExfMTY6CisJICBzaXplID0gMTY7CisJICBicmVhazsKKwljYXNlIExfODoKKwkgIHNpemUgPSA4OworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHNpemUgPSAxMjM0OworCX0KKworICAgICAgaWYgKHggJiBSRUcpCisJeworCSAgcHJpbnRmICgiaXIlZCA9IEdFVF9MVkFMXyVkX1JFRyglZCk7XG4iLCBvcCwgc2l6ZSwgaSk7CisJfQorICAgICAgZWxzZSBpZiAoeCAmIElNTSkKKwl7CisJICBwcmludGYgKCIvKiBJbW0gaGFzIG5vIGx2YWx1ZSAqL1xuIik7CisJfQorCisgICAgfQorCisKKworfQorCit2b2lkCitkZWNvZGUgKHAsIGZldGNoLCBzaXplKQorICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOworICAgICBpbnQgZmV0Y2g7CisgICAgIGludCBzaXplOworeworICBpZiAoZmV0Y2gpCisgICAgeworICAgICAgbHZhbCAocCk7CisgICAgfQorCit9CisKKworCitzdGF0aWMgdm9pZAorZXNsZWVwICgpCit7CisgIHByaW50ZiAoInNhdmVkX3N0YXRlLmV4Y2VwdGlvbiA9IFNJR1NUT1A7XG4iKTsKK30KKworc3RhdGljIHZvaWQKK21vdiAocCwgcywgc3opCisgICAgIHN0cnVjdCBoOF9vcGNvZGUgKnA7CisgICAgIGNoYXIgKnM7CisgICAgIGludCBzejsKK3sKKyAgcHJpbnRmICgiZHN0ID0gc3JjYTtcbiIpOworfQorCitzdGF0aWMgdm9pZAorYW5kYyAocCkKKyAgICAgc3RydWN0IGg4X29wY29kZSAqcDsKK3sKKyAgcHJpbnRmICgiU0VUX0NDUihHRVRfQ0NSKCkgJiBzcmNhKTtcbiIpOworfQorCitzdGF0aWMgdm9pZAorYWRkeCAocCkKKyAgICAgc3RydWN0IGg4X29wY29kZSAqcDsKK3sKKyAgcHJpbnRmICgiZHN0ID0gc3JjYSArIHNyY2IrIChjICE9IDApO1xuIik7Cit9CisKK3N0YXRpYyB2b2lkCitzdWJ4IChwKQorICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOworeworICBwcmludGYgKCJkc3QgPSBzcmNiIC0gc3JjYSAtIChjICE9IDApO1xuIik7Cit9CisKK3N0YXRpYyB2b2lkCithZGQgKHAsIHMsIHN6KQorICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOworICAgICBjaGFyICpzOworICAgICBpbnQgc3o7Cit7CisgIHByaW50ZiAoIiVzO1xuIiwgcyk7Cit9CisKK3N0YXRpYyB2b2lkCithZGRzIChwLCBzKQorICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOworICAgICBjaGFyICpzOworeworICBwcmludGYgKCIlcztcbiIsIHMpOworfQorCitzdGF0aWMgdm9pZAorYnJhIChwLCBhKQorICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOworICAgICBjaGFyICphOworeworICBwcmludGYgKCJpZiAoJXMpIG5wYyArPSAoKGNoYXIgKWIxKT4+MTtcbiIsIGEpOworfQorCitzdGF0aWMgdm9pZAorYnNyIChwLCBhKQorICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOworICAgICBjaGFyICphOworeworICBwcmludGYgKCJyZWdbN10tPTI7XG4iKTsKKyAgcHJpbnRmICgidG1wID0gcmVnWzddO1xuIik7CisgIHByaW50ZiAoIlNFVF9XT1JEX01FTSh0bXAsIChucGMtc2F2ZWRfc3RhdGUubWVtKSoyKTtcbiIpOworICBwcmludGYgKCJucGMgKz0gKChjaGFyKWIxKT4+MTtcbiIpOworfQorCitzdGF0aWMgdm9pZAorY21wIChwLCBhLCBzKQorICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOworICAgICBjaGFyICphOworICAgICBpbnQgczsKK3sKKyAgZGVjb2RlIChwLCAxLCBzKTsKKyAgcHJpbnRmICgic3JjYSA9IC1zcmNhO1xuIik7CisgIHByaW50ZiAoImRzdCA9IHNyY2EgKyBzcmNiO1xuIik7Cit9CisKK3N0YXRpYwordm9pZAoranNyIChwLCBhLCBzKQorICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOworICAgICBjaGFyICphOworICAgICBpbnQgczsKK3sKKyAgcHJpbnRmICgiaWYgKGIxID09IDB4YzQpIHtcbiIpOworICBwcmludGYgKCJwcmludGYoXCIlJWNcIiwgcmVnWzJdKTtcbiIpOworICBwcmludGYgKCJ9XG4iKTsKKyAgcHJpbnRmICgiZWxzZSB7XG4iKTsKKyAgcHJpbnRmICgicmVnWzddLT0yO1xuIik7CisgIHByaW50ZiAoInRtcCA9IHJlZ1s3XTtcbiIpOworICBwcmludGYgKCJTRVRfV09SRF9NRU0odG1wLCAobnBjLXNhdmVkX3N0YXRlLm1lbSkqMik7XG4iKTsKKyAgcHJpbnRmICgibnBjID0gKGx2YWw+PjEpICsgc2F2ZWRfc3RhdGUubWVtO1xuIik7CisgIHByaW50ZiAoIn0iKTsKK30KKworc3RhdGljIHZvaWQKK2ptcCAocCwgYSwgcykKKyAgICAgc3RydWN0IGg4X29wY29kZSAqcDsKKyAgICAgY2hhciAqYTsKKyAgICAgaW50IHM7Cit7CisgIHByaW50ZiAoIm5wYyA9IChsdmFsPj4xKSArIHNhdmVkX3N0YXRlLm1lbTtcbiIpOworfQorCitzdGF0aWMgdm9pZAorcnRzIChwLCBhLCBzKQorICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpwOworICAgICBjaGFyICphOworICAgICBpbnQgczsKK3sKKyAgcHJpbnRmICgidG1wID0gcmVnWzddO1xuIik7CisgIHByaW50ZiAoInJlZ1s3XSs9MjtcbiIpOworICBwcmludGYgKCJucGMgPSBzYXZlZF9zdGF0ZS5tZW0gKyAoV09SRF9NRU0odG1wKT4+MSk7XG4iKTsKK30KKworc3RhdGljIHZvaWQKK3J0ZSAocCwgYSwgcykKKyAgICAgc3RydWN0IGg4X29wY29kZSAqcDsKKyAgICAgY2hhciAqYTsKKyAgICAgaW50IHM7Cit7CisgIHByaW50ZiAoInJlZ1s3XSs9MjtcbiIpOworICBwcmludGYgKCJ0bXAgPSByZWdbN107XG4iKTsKKyAgcHJpbnRmICgicmVnWzddKz0yO1xuIik7CisgIHByaW50ZiAoIlNFVF9DQ1IodG1wKTtcbiIpOworICBwcmludGYgKCJucGMgPSBzYXZlZF9zdGF0ZS5tZW0gKyAoV09SRF9NRU0odG1wKT4+MSk7XG4iKTsKK30KKworc3RhdGljIHZvaWQKK3NldGYgKHAsIGEsIHMpCisgICAgIHN0cnVjdCBoOF9vcGNvZGUgKnA7CisgICAgIGNoYXIgKmE7CisgICAgIGludCBzOworeworICBwcmludGYgKCJ0bXAgPSBHRVRfQ0NSKCk7XG4iKTsKKyAgcHJpbnRmICgidG1wICVzPSBzcmNhO1xuIiwgYSk7Cit9CisKK3N0YXRpYyB2b2lkCiticHQgKHAsIGEsIHMpCisgICAgIHN0cnVjdCBoOF9vcGNvZGUgKnA7CisgICAgIGNoYXIgKmE7CisgICAgIGludCBzOworeworICBwcmludGYgKCJzYXZlZF9zdGF0ZS5leGNlcHRpb24gPSBTSUdUUkFQO1xuIik7CisgIHByaW50ZiAoIm5wYyA9IHBjO1xuIik7Cit9CisKK3N0YXRpYyB2b2lkCitsb2cgKHAsIGEsIHMpCisgICAgIHN0cnVjdCBoOF9vcGNvZGUgKnA7CisgICAgIGNoYXIgKmE7CisgICAgIGludCBzOworeworICBwcmludGYgKCJkc3QgPSBzcmNiICVzIHNyY2E7XG4iLCBhKTsKK30KKworc3RhdGljIHZvaWQKK3Vsb2cgKHAsIGEsIHMpCisgICAgIHN0cnVjdCBoOF9vcGNvZGUgKnA7CisgICAgIGNoYXIgKmE7CisgICAgIGludCBzOworeworICBwcmludGYgKCJkc3QgPSAlcyBzcmNiIDtcbiIsIGEpOworfQorCitzdGF0aWMgdm9pZAorbm9wICgpCit7Cit9CisKK3N0YXRpYyB2b2lkCityb3RsICgpCit7CisgIHByaW50ZiAoImMgPSBzcmNiICYgMHg4MDtcbiIpOworICBwcmludGYgKCJkc3QgPSBzcmNiIDw8IDE7XG4iKTsKKyAgcHJpbnRmICgiaWYgKGMpIGRzdHw9MTtcbiIpOworfQorCitzdGF0aWMgdm9pZAorcm90ciAoKQoreworICBwcmludGYgKCJjID0gc3JjYiAmIDE7XG4iKTsKKyAgcHJpbnRmICgiZHN0ID0gc3JjYiA+PiAxO1xuIik7CisgIHByaW50ZiAoImlmIChjKSBkc3R8PTB4ODA7XG4iKTsKK30KKworc3RhdGljIHZvaWQKK3JvdHhsICgpCit7CisgIHByaW50ZiAoInRtcCA9IHNyY2IgJiAweDgwO1xuIik7CisgIHByaW50ZiAoImRzdCA9IHNyY2IgPDwgMTtcbiIpOworICBwcmludGYgKCJpZiAoYykgZHN0fD0xO1xuIik7CisgIHByaW50ZiAoImMgPSB0bXA7XG4iKTsKK30KKworc3RhdGljIHZvaWQKK3JvdHhyICgpCit7CisgIHByaW50ZiAoInRtcCA9IHNyY2IgJiAxO1xuIik7CisgIHByaW50ZiAoImRzdCA9IHNyY2IgPj4gMTtcbiIpOworICBwcmludGYgKCJpZiAoYykgZHN0fD0weDgwO1xuIik7CisgIHByaW50ZiAoImMgPSB0bXA7XG4iKTsKK30KKworc3RhdGljIHZvaWQKK3NoYWwgKCkKK3sKKyAgcHJpbnRmICgiYyA9IHNyY2ImMHg4MDtcbiIpOworICBwcmludGYgKCJkc3QgPSBzcmNiIDw8IDE7XG4iKTsKK30KKworc3RhdGljCit2b2lkCitzaGFyICgpCit7CisgIHByaW50ZiAoImMgPSBzcmNiJjB4MTtcbiIpOworICBwcmludGYgKCJpZiAoc3JjYiYweDgwKSBkc3QgPSAoc3JjYj4+MSkgfCAweDgwO1xuIik7CisgIHByaW50ZiAoImVsc2UgIGRzdCA9IChzcmNiPj4xKSAmfiAweDgwO1xuIik7Cit9CisKK3N0YXRpYwordm9pZAorc2hsbCAoKQoreworICBwcmludGYgKCJjID0gc3JjYiYweDgwO1xuIik7CisgIHByaW50ZiAoImRzdCA9IHNyY2IgPDwgMTtcbiIpOworfQorCitzdGF0aWMKK3ZvaWQKK3NobHIgKCkKK3sKKyAgcHJpbnRmICgiYyA9IHNyY2ImMHgxO1xuIik7CisgIHByaW50ZiAoImRzdCA9IChzcmNiPj4xKSAmfiAweDgwO1xuIik7Cit9CisKK3N0YXRpYwordm9pZAorZGl2eHUgKCkKK3sKKyAgcHJpbnRmICgic3JjYSA9ICVzO1xuIiwgYnJlZ1syXSk7CisgIHByaW50ZiAoInNyY2IgPSAlcztcbiIsIHdyZWdbM10pOworICBwcmludGYgKCJuID0gc3JjYSAmIDB4ODA7XG4iKTsKKyAgcHJpbnRmICgieiA9ICFzcmNhO1xuIik7CisgIHByaW50ZiAoImlmIChzcmNhKSBkc3QgPSBzcmNiIC8gc3JjYTt0bXAgPSBzcmNiICUlIHNyY2E7XG4iKTsKKyAgcHJpbnRmICgiJXMgPSAoZHN0ICYgMHhmZikgfCAodG1wIDw8IDgpO1xuIiwgd3JlZ1szXSk7Cit9CisKK3N0YXRpYwordm9pZAorbXVseHUgKCkKK3sKKyAgcHJpbnRmICgic3JjYSA9ICVzO1xuIiwgYnJlZ1syXSk7CisgIHByaW50ZiAoInNyY2IgPSAlcztcbiIsIHdyZWdbM10pOworCisgIHByaW50ZiAoImRzdCA9IChzcmNiJjB4ZmYpICogc3JjYTtcbiIpOworICBwcmludGYgKCIlcyA9IGRzdDtcbiIsIHdyZWdbM10pOworfQorCitzdGF0aWMKK3ZvaWQKK2luYyAoKQoreworICBwcmludGYgKCJkc3QgPSAlcztcbiIsIGJyZWdbM10pOworICBwcmludGYgKCJ2ID0gKGRzdD09MHg3Zik7XG4iKTsKKyAgcHJpbnRmICgiZHN0Kys7XG4iKTsKKyAgcHJpbnRmICgiJXM9IGRzdDtcbiIsIGJyZWdbM10pOworfQorCitzdGF0aWMKK3ZvaWQKK2JpdCAocCwgYSwgcykKKyAgICAgc3RydWN0IGg4X29wY29kZSAqcDsKKyAgICAgY2hhciAqYTsKKyAgICAgaW50IHM7Cit7CisgIHByaW50ZiAoIiVzXG4iLCBhKTsKK30KKworc3RhdGljCit2b2lkCitkZWMgKCkKK3sKKyAgcHJpbnRmICgiZHN0ID0gJXM7XG4iLCBicmVnWzNdKTsKKyAgcHJpbnRmICgidiA9IChkc3Q9PTB4ODApO1xuIik7CisgIHByaW50ZiAoImRzdC0tO1xuIik7CisgIHByaW50ZiAoIiVzID0gZHN0O1xuIiwgYnJlZ1szXSk7Cit9CisKK2NoYXIgc2FmW10gPSAiZ290byBzZXRmbGFnczsiOworY2hhciBzZltdID0gImdvdG8gc2hpZnRmbGFnczsiOworY2hhciBhZjhbXSA9ICJnb3RvIGFsdWZsYWdzODsiOworY2hhciBhZjE2W10gPSAiZ290byBhbHVmbGFnczE2OyI7CitjaGFyIGxmW10gPSAiZ290byBsb2dmbGFnczsiOworY2hhciBpY2ZbXSA9ICJnb3RvIGluY2ZsYWdzOyI7CitjaGFyIG1mOFtdID0gImdvdG8gbW92ZmxhZ3M4OyI7CitjaGFyIG1mMTZbXSA9ICJnb3RvIG1vdmZsYWdzMTY7IjsKK2NoYXIgbnhbXSA9ICJnb3RvIG5leHQ7IjsKKworc3RydWN0Cit7CisgIGNoYXIgKmZ0eXBlOworICBpbnQgZGVjb2RlOworICBjaGFyICpuYW1lOworICB2b2lkICgqZnVuYykgKCk7CisgIGNoYXIgKmFyZzsKKyAgaW50IHNpemU7CisKK30KKwordGFibGVbXSA9Cit7CisgIHsKKyAgICBueCwgMSwgImJsZCIsIGJpdCwgImRzdCA9IHNyY2I7IGMgPSAoc3JjYj4+c3JjYSkmMTsiLCA4CisgIH0KKyAgLAorICB7CisgICAgbngsIDEsICJiaWxkIiwgYml0LCAiZHN0ID0gc3JjYjsgYyA9ICEoKHNyY2I+PnNyY2EpJjEpOyIsIDgKKyAgfQorICAsCisgIHsKKyAgICBueCwgMSwgImJhbmQiLCBiaXQsICJkc3QgPSBzcmNiOyBjID0gQyAmJigoc3JjYj4+c3JjYSkmMSk7IiwgOAorICB9CisgICwKKyAgeworICAgIG54LCAxLCAiYmlhbmQiLCBiaXQsICJkc3QgPSBzcmNiOyBjID0gQyAmJighKChzcmNiPj5zcmNhKSYxKSk7IiwgOAorICB9CisgICwKKyAgeworICAgIG54LCAxLCAiYmlvciIsIGJpdCwgImRzdCA9IHNyY2I7IGMgPSBDIHx8KCEoKHNyY2I+PnNyY2EpJjEpKTsiLCA4CisgIH0KKyAgLAorICB7CisgICAgbngsIDEsICJib3IiLCBiaXQsICJkc3QgPSBzcmNiOyBjID0gQyB8fCgoKHNyY2I+PnNyY2EpJjEpKTsiLCA4CisgIH0KKyAgLAorICB7CisgICAgbngsIDEsICJiaXhvciIsIGJpdCwgImRzdCA9IHNyY2I7IGMgPSBDIF4oISgoc3JjYj4+c3JjYSkmMSkpOyIsIDgKKyAgfQorICAsCisgIHsKKyAgICBueCwgMSwgImJ4b3IiLCBiaXQsICJkc3QgPSBzcmNiOyBjID0gQyBeKCgoc3JjYj4+c3JjYSkmMSkpOyIsIDgKKyAgfQorICAsCisgIHsKKyAgICBueCwgMSwgImJub3QiLCBiaXQsICJkc3QgPSBzcmNiIF4gKDE8PHNyY2EpOyIsIDgKKyAgfQorICAsCisgIHsKKyAgICBueCwgMSwgImJjbHIiLCBiaXQsICJkc3QgPSBzcmNiICYgfigxPDxzcmNhKTsiLCA4CisgIH0KKyAgLAorICB7CisgICAgbngsIDEsICJic2V0IiwgYml0LCAiZHN0ID0gc3JjYiB8ICgxPDxzcmNhKTsiLCA4CisgIH0KKyAgLAorICB7CisgICAgbngsIDEsICJic3QiLCBiaXQsICJkc3QgPSAoc3JjYiAmIH4oMTw8c3JjYSkpfCAoKEMpPDxzcmNhKTsiLCA4CisgIH0KKyAgLAorICB7CisgICAgbngsIDEsICJiaXN0IiwgYml0LCAiZHN0ID0gKHNyY2IgJiB+KDE8PHNyY2EpKXwgKCghQyk8PHNyY2EpOyIsIDgKKyAgfQorICAsCisgIHsKKyAgICBueCwgMSwgImJ0c3QiLCBiaXQsICJkc3QgPSBzcmNiOyB6ID0gISgoc3JjYj4+c3JjYSkmMSk7IiwgOAorICB9CisgICwKKyAgeworICAgIGljZiwgMCwgImRlYyIsIGRlYywgMCwgMAorICB9CisgICwKKyAgeworICAgIGljZiwgMCwgImluYyIsIGluYywgMCwgMAorICB9CisgICwKKyAgeworICAgIHNhZiwgMSwgIm9yYyIsIHNldGYsICJ8IiwgMAorICB9CisgICwKKyAgeworICAgIHNhZiwgMSwgInhvcmMiLCBzZXRmLCAiXiIsIDAKKyAgfQorICAsCisgIHsKKyAgICBzYWYsIDEsICJhbmRjIiwgc2V0ZiwgIiYiLCAwCisgIH0KKyAgLAorICB7CisgICAgbngsIDEsICJub3AiLCBub3AsIDAsIDAKKyAgfQorICAsCisgIHsKKyAgICBueCwgMSwgImJyYSIsIGJyYSwgIjEiLCAwCisgIH0KKyAgLAorICB7CisgICAgbngsIDEsICJicm4iLCBicmEsICIwIiwgMAorICB9CisgICwKKyAgeworICAgIG54LCAxLCAiYmhpIiwgYnJhLCAiKEN8fFopPT0wIiwgMAorICB9CisgICwKKyAgeworICAgIG54LCAxLCAiYmxzIiwgYnJhLCAiKEN8fFopPT0xIiwgMAorICB9CisgICwKKyAgeworICAgIG54LCAxLCAiYmNzIiwgYnJhLCAiQz09MSIsIDAKKyAgfQorICAsCisgIHsKKyAgICBueCwgMSwgImJjYyIsIGJyYSwgIkM9PTAiLCAwCisgIH0KKyAgLAorICB7CisgICAgbngsIDEsICJicGwiLCBicmEsICJOPT0wIiwgMAorICB9CisgICwKKyAgeworICAgIG54LCAxLCAiYm1pIiwgYnJhLCAiTj09MSIsIDAKKyAgfQorICAsCisgIHsKKyAgICBueCwgMSwgImJ2cyIsIGJyYSwgIlY9PTEiLCAwCisgIH0KKyAgLAorICB7CisgICAgbngsIDEsICJidmMiLCBicmEsICJWPT0wIiwgMAorICB9CisgICwKKyAgeworICAgIG54LCAxLCAiYmdlIiwgYnJhLCAiKE5eVik9PTAiLCAwCisgIH0KKyAgLAorICB7CisgICAgbngsIDEsICJiZ3QiLCBicmEsICIoWnwoTl5WKSk9PTAiLCAwCisgIH0KKyAgLAorICB7CisgICAgbngsIDEsICJibHQiLCBicmEsICIoTl5WKT09MSIsIDAKKyAgfQorICAsCisgIHsKKyAgICBueCwgMSwgImJsZSIsIGJyYSwgIihafChOXlYpKT09MSIsIDAKKyAgfQorICAsCisgIHsKKyAgICBueCwgMSwgImJlcSIsIGJyYSwgIlo9PTEiLCAwCisgIH0KKyAgLAorICB7CisgICAgbngsIDEsICJibmUiLCBicmEsICJaPT0wIiwgMAorICB9CisgICwKKyAgeworICAgIG54LCAxLCAiYnNyIiwgYnNyLCAiIiwgMAorICB9CisgICwKKyAgeworICAgIG54LCAxLCAianNyIiwganNyLCAwLCAwCisgIH0KKyAgLAorICB7CisgICAgbngsIDEsICJqbXAiLCBqbXAsIDAsIDAKKyAgfQorICAsCisgIHsKKyAgICBueCwgMCwgInJ0cyIsIHJ0cywgMCwgMAorICB9CisgICwKKyAgeworICAgIG54LCAwLCAicnRlIiwgcnRlLCAwLCAwCisgIH0KKyAgLAorICB7CisgICAgbngsIDEsICJhbmRjIiwgYW5kYywgMCwgMAorICB9CisgICwKKyAgeworICAgIHNmLCAxLCAic2hhbCIsIHNoYWwsIDAsIDAKKyAgfQorICAsCisgIHsKKyAgICBzZiwgMSwgInNoYXIiLCBzaGFyLCAwLCAwCisgIH0KKyAgLAorICB7CisgICAgc2YsIDEsICJzaGxsIiwgc2hsbCwgMCwgMAorICB9CisgICwKKyAgeworICAgIHNmLCAxLCAic2hsciIsIHNobHIsIDAsIDAKKyAgfQorICAsCisgIHsKKyAgICBzZiwgMSwgInJvdHhsIiwgcm90eGwsIDAsIDAKKyAgfQorICAsCisgIHsKKyAgICBzZiwgMSwgInJvdHhyIiwgcm90eHIsIDAsIDAKKyAgfQorICAsCisgIHsKKyAgICBzZiwgMSwgInJvdGwiLCByb3RsLCAwLCAwCisgIH0KKyAgLAorICB7CisgICAgc2YsIDEsICJyb3RyIiwgcm90ciwgMCwgMAorICB9CisgICwKKyAgeworICAgIGxmLCAxLCAieG9yIiwgbG9nLCAiXiIsIDAKKyAgfQorICAsCisgIHsKKyAgICBsZiwgMSwgImFuZCIsIGxvZywgIiYiLCAwCisgIH0KKyAgLAorICB7CisgICAgbGYsIDEsICJvciIsIGxvZywgInwiLCAwCisgIH0KKyAgLAorICB7CisgICAgbGYsIDEsICJub3QiLCB1bG9nLCAiIH4iLCAwCisgIH0KKyAgLAorICB7CisgICAgbGYsIDEsICJuZWciLCB1bG9nLCAiIC0gIiwgMAorICB9CisgICwKKyAgeworICAgIG54LCAxLCAiYWRkcyIsIGFkZHMsICJkc3QgPSBzcmNhICsgc3JjYiIsIDAKKyAgfQorICAsCisgIHsKKyAgICBueCwgMSwgInN1YnMiLCBhZGRzLCAic3JjYSA9IC1zcmNhOyBkc3QgPSBzcmNiICsgc3JjYSIsIDAKKyAgfQorICAsCisgIHsKKyAgICBhZjgsIDEsICJhZGQuYiIsIGFkZCwgImRzdCA9IHNyY2EgKyBzcmNiIiwgOAorICB9CisgICwKKyAgeworICAgIGFmMTYsIDEsICJhZGQudyIsIGFkZCwgImRzdCA9IHNyY2EgKyBzcmNiIiwgMTYKKyAgfQorICAsCisgIHsKKyAgICBhZjE2LCAxLCAic3ViLnciLCBhZGQsICJzcmNhID0gLXNyY2E7IGRzdCA9IHNyY2IgKyBzcmNhIiwgMTYKKyAgfQorICAsCisgIHsKKyAgICBhZjgsIDEsICJzdWIuYiIsIGFkZCwgInNyY2EgPSAtc3JjYTsgZHN0ID0gc3JjYiArIHNyY2EiLCA4CisgIH0KKyAgLAorICB7CisgICAgYWY4LCAxLCAiYWRkeCIsIGFkZHgsIDAsIDgKKyAgfQorICAsCisgIHsKKyAgICBhZjgsIDEsICJzdWJ4Iiwgc3VieCwgMCwgOAorICB9CisgICwKKyAgeworICAgIGFmOCwgMCwgImNtcC5iIiwgY21wLCAwLCA4CisgIH0KKyAgLAorICB7CisgICAgYWYxNiwgMCwgImNtcC53IiwgY21wLCAwLCAxNgorICB9CisgICwKKyAgeworICAgIG54LCAxLCAic2xlZXAiLCBlc2xlZXAsIDAsIDAKKyAgfQorICAsCisgIHsKKyAgICBueCwgMCwgImJwdCIsIGJwdCwgMCwgOAorICB9CisgICwKKyAgeworICAgIG54LCAwLCAiZGl2eHUiLCBkaXZ4dSwgMCwgMAorICB9CisgICwKKyAgeworICAgIG54LCAwLCAibXVseHUiLCBtdWx4dSwgMCwgMAorICB9CisgICwKKyAgeworICAgIG1mOCwgMSwgIm1vdi5iIiwgbW92LCAwLCA4CisgIH0KKyAgLAorICB7CisgICAgbWY4LCAxLCAibW92dHBlIiwgbW92LCAwLCA4CisgIH0KKyAgLAorICB7CisgICAgbWY4LCAxLCAibW92ZnBlIiwgbW92LCAwLCA4CisgIH0KKyAgLAorICB7CisgICAgbWYxNiwgMSwgIm1vdi53IiwgbW92LCAwLCAxNgorICB9CisgICwKKyAgeworICAgIDAKKyAgfQorfTsKKworc3RhdGljCit2b2lkCitlZG8gKHApCisgICAgIHN0cnVjdCBoOF9vcGNvZGUgKnA7Cit7CisgIGludCBpOworCisgIHByaW50ZiAoIiVzICVzICVzXG4iLCBjcywgcC0+bmFtZSwgY2UpOworCisgIGZvciAoaSA9IDA7IHRhYmxlW2ldLm5hbWU7IGkrKykKKyAgICB7CisgICAgICBpZiAoc3RyY21wICh0YWJsZVtpXS5uYW1lLCBwLT5uYW1lKSA9PSAwKQorCXsKKwkgIHByaW50ZiAoIntcbiIpOworCSAgaWYgKHRhYmxlW2ldLmRlY29kZSkKKwkgICAgZGVjb2RlIChwLCAxLCB0YWJsZVtpXS5zaXplKTsKKwkgIHByaW50ZiAoImN5Y2xlcyArPSAlZDtcbiIsIHAtPnRpbWUpOworCSAgcHJpbnRmICgibnBjID0gcGMgKyAlZDtcbiIsIHAtPmxlbmd0aCAvIDIpOworCSAgdGFibGVbaV0uZnVuYyAocCwgdGFibGVbaV0uYXJnLCB0YWJsZVtpXS5zaXplKTsKKwkgIGlmICh0YWJsZVtpXS5kZWNvZGUpCisJICAgIGRlY29kZSAocCwgMCwgdGFibGVbaV0uc2l6ZSk7CisJICBpZiAodGFibGVbaV0uZnR5cGUpCisJICAgIHByaW50ZiAodGFibGVbaV0uZnR5cGUpOworCSAgZWxzZQorCSAgICBwcmludGYgKCJnb3RvIG5leHQ7XG4iKTsKKwkgIHByaW50ZiAoIn1cbiIpOworCSAgcmV0dXJuOworCX0KKyAgICB9CisgIHByaW50ZiAoIiVzIG5vdCBmb3VuZCAlc1xuIiwgY3MsIGNlKTsKKyAgcHJpbnRmICgic2F2ZWRfc3RhdGUuZXhjZXB0aW9uID0gU0lHSUxMO1xuIik7CisgIHByaW50ZiAoImJyZWFrO1xuIik7Cit9CisKK3N0YXRpYworaW50Citvd3JpdGUgKGkpCisgICAgIGludCBpOworeworICAvKiB3cml0ZSBpZiBzdGF0ZW1lbnRzIHRvIHNlbGVjdCB0aGUgcmlnaHQgb3Bjb2RlICovCisgIHN0cnVjdCBoOF9vcGNvZGUgKipwOworICBpbnQgbmVlZGFuZCA9IDE7CisKKyAgcCA9IGg4X29wY29kZXNfc29ydGVkW2ldOworICBwcmludGYgKCJjYXNlIDB4JTAzeDpcbiIsIGkpOworCisgIGlmIChwWzFdID09IDApCisgICAgeworICAgICAgLyogU2VlIGlmIHRoZSBuZXh0IGZldyBhbHNvIG1hdGNoICovCisgICAgICB3aGlsZSAoaDhfb3Bjb2Rlc19zb3J0ZWRbaSArIDFdWzBdID09ICpwKQorCXsKKwkgIGkrKzsKKwkgIHByaW50ZiAoImNhc2UgMHglMDN4OlxuIiwgaSk7CisJfQorCisgICAgICAvKiBEb250IG5lZWQgYW55IGlmJ3MgdGhpcyBpcyB0aGUgb25seSBvbmUgKi8KKyAgICAgIGVkbyAoKnApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHdoaWxlICgqcCkKKwl7CisJICAvKiBzdGFydCB0d28gbmliYmxlcyBpbiBzaW5jZSB3ZSBrbm93IHdlIG1hdGNoIGluIHRoZSBmaXJzdCBieXRlICovCisJICBpbnQgYzsKKwkgIGludCBuaWIgPSAyOworCSAgaW50IGJ5dGUgPSAxOworCSAgaW50IG1hc2sxWzVdOworCSAgaW50IG1hc2swWzVdOworCSAgaW50IG5pYnNoaWZ0ID0gNDsKKwkgIGludCBhbnkgPSAwOworCisJICBmb3IgKGMgPSAwOyBjIDwgNTsgYysrKQorCSAgICB7CisJICAgICAgbWFzazFbY10gPSAwOworCSAgICAgIG1hc2swW2NdID0gMDsKKwkgICAgfQorCSAgcHJpbnRmICgiJXMgJXgleCIsIGNzLCAoKnApLT5kYXRhLm5pYlswXSwgKCpwKS0+ZGF0YS5uaWJbMV0pOworCSAgd2hpbGUgKChjID0gKCpwKS0+ZGF0YS5uaWJbbmliXSkgIT0gRSkKKwkgICAgeworCSAgICAgIGlmIChjICYgQjMwKQorCQl7CisJCSAgLyogYml0IDMgbXVzdCBiZSB6ZXJvICovCisJCSAgbWFzazBbYnl0ZV0gfD0gMHg4IDw8IG5pYnNoaWZ0OworCQkgIHByaW50ZiAoIjAiKTsKKwkJICBhbnkgPSAxOworCQl9CisJICAgICAgZWxzZSBpZiAoYyAmIEIzMSkKKwkJeworCQkgIC8qIGJpdCAzIG11c3QgYmUgb25lICovCisJCSAgbWFzazFbYnl0ZV0gfD0gMHg4IDw8IG5pYnNoaWZ0OworCQkgIHByaW50ZiAoIjgiKTsKKwkJICBhbnkgPSAxOworCQl9CisJICAgICAgZWxzZSBpZiAoYyA8PSBIZXhGKQorCQl7CisJCSAgbWFzazBbYnl0ZV0gfD0gKCh+YykgJiAweGYpIDw8IG5pYnNoaWZ0OworCQkgIG1hc2sxW2J5dGVdIHw9IChjICYgMHhmKSA8PCBuaWJzaGlmdDsKKwkJICBwcmludGYgKCIleCIsIGMpOworCQkgIGFueSA9IDE7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBwcmludGYgKCJ4Iik7CisJCX0KKwkgICAgICBuaWIrKzsKKwkgICAgICBpZiAobmlic2hpZnQgPT0gNCkKKwkJeworCQkgIG5pYnNoaWZ0ID0gMDsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGJ5dGUrKzsKKwkJICBuaWJzaGlmdCA9IDQ7CisJCX0KKwkgICAgfQorCSAgcHJpbnRmICgiKi9cbiIpOworCSAgaWYgKGFueSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoImlmICgiKTsKKwkgICAgICBuZWVkYW5kID0gMDsKKwkgICAgICBmb3IgKGMgPSAxOyBjIDwgYnl0ZTsgYysrKQorCQl7CisJCSAgaWYgKG1hc2swW2NdIHwgbWFzazFbY10pCisJCSAgICB7CisJCSAgICAgIGludCBzaDsKKworCQkgICAgICBpZiAobmVlZGFuZCkKKwkJCXByaW50ZiAoIlxuJiYiKTsKKwkJICAgICAgaWYgKGMgJiAxKQorCQkJc2ggPSAwOworCQkgICAgICBlbHNlCisJCQlzaCA9IDg7CisJCSAgICAgIGlmIChjIC8gMiA9PSAwICYmIHNoID09IDApCisJCQlwcmludGYgKCIoKGIxJjB4JXgpPT0weCV4KSIsIG1hc2swW2NdIHwgbWFzazFbY10sCisJCQkJbWFzazFbY10pOworCQkgICAgICBlbHNlCisJCQl7CisJCQkgIHByaW50ZiAoIigocGNbJWRdJigweCUwMng8PCVkKSk9PSgweCV4PDwlZCkpIiwKKwkJCQkgIGMgLyAyLCBtYXNrMFtjXSB8IG1hc2sxW2NdLCBzaCwKKwkJCQkgIG1hc2sxW2NdLCBzaCk7CisJCQl9CisKKwkJICAgICAgbmVlZGFuZCA9IDE7CisJCSAgICB9CisJCX0KKwkgICAgICBwcmludGYgKCIpXG4iKTsKKwkgICAgfQorCSAgZWRvICgqcCk7CisJICBwKys7CisKKwl9CisgICAgfQorICByZXR1cm4gaTsKK30KKworc3RhdGljCit2b2lkCityZW1vdmVfZHVwcyAoKQoreworICBzdHJ1Y3QgaDhfb3Bjb2RlICpzOworICBzdHJ1Y3QgaDhfb3Bjb2RlICpkOworCisgIGZvciAoZCA9IHMgPSBoOF9vcGNvZGVzOyBzLT5uYW1lOyBzKyspCisgICAgeworICAgICAgaW50IGRvaXQgPSAxOworCisgICAgICBpZiAoc3RyY21wIChzLT5uYW1lLCAicHVzaCIpID09IDApCisJZG9pdCA9IDA7CisgICAgICBpZiAoc3RyY21wIChzLT5uYW1lLCAiYmhzIikgPT0gMCkKKwlkb2l0ID0gMDsKKyAgICAgIGlmIChzdHJjbXAgKHMtPm5hbWUsICJibG8iKSA9PSAwKQorCWRvaXQgPSAwOworICAgICAgaWYgKHN0cmNtcCAocy0+bmFtZSwgImJ0IikgPT0gMCkKKwlkb2l0ID0gMDsKKyAgICAgIGlmIChzdHJjbXAgKHMtPm5hbWUsICJiZiIpID09IDApCisJZG9pdCA9IDA7CisgICAgICBpZiAoc3RyY21wIChzLT5uYW1lLCAicG9wIikgPT0gMCkKKwlkb2l0ID0gMDsKKyAgICAgIGlmIChkb2l0KQorCXsKKwkgICpkKysgPSAqczsKKwl9CisgICAgfQorICAqZCsrID0gKnMrKzsKK30KKworaW50CittYWluICgpCit7CisgIGludCBpOworCisgIHJlbW92ZV9kdXBzICgpOworICBpbml0ICgpOworCisgIHByaW50ZiAoIiVzIGRvIHRoZSBvcGVyYXRpb24gJXNcbiIsIGNzLCBjZSk7CisgIHByaW50ZiAoInN3aXRjaCAoYjApIFxue1xuIik7CisgIGZvciAoaSA9IDA7IGkgPCBQVFdPOyBpKyspCisgICAgeworICAgICAgaSA9IG93cml0ZSAoaSk7CisgICAgfQorICBwcmludGYgKCJ9XG4iKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NpbS9oODUwMC9DaGFuZ2VMb2cgYi9zaW0vaDg1MDAvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNTExZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaDg1MDAvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNDEzIEBACitUdWUgQXByIDI4IDE4OjMzOjMxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1N1biBBcHIgMjYgMTU6MzE6NTUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1N1biBBcHIgMjYgMTU6MjA6MTEgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZ3VyZS5pbjogUmV2ZXJ0ZWQgY2hhbmdlIG9mIEFwciAyNDsgdXNlIHNpbmNsdWRlIGFnYWluLgorCitGcmkgQXByIDI0IDE0OjE2OjQwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitGcmkgQXByIDI0IDExOjE5OjQwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEb24ndCBjYWxsIHNpbmNsdWRlLgorCitTYXQgQXByICA0IDIwOjM2OjI1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitGcmkgTWFyIDI3IDE2OjE1OjUyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgTWFyIDI1IDEyOjM1OjI5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgTWFyIDE4IDEyOjM4OjEyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgRmViIDE3IDEyOjQzOjQyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29tcGlsZS5jIChzaW1fc3RvcmVfcmVnaXN0ZXIsIHNpbV9mZXRjaF9yZWdpc3Rlcik6IFBhc3MgaW4KKyAJbGVuZ3RoIHBhcmFtZXRlci4gIFJldHVybiAtMS4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFBhc3MgNCBpbnRvIHNpbV9zdG9yZV9yZWdpc3Rlci4KKworU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIEphbiAxOSAyMjoyNjoyOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmE+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIERlYyAxNSAyMzoxNzoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1RodSBEZWMgIDQgMDk6MjE6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgT2N0IDIyIDE0OjQzOjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29tcGlsZS5jIChzaW1fbG9hZCk6IFBhc3MgbG1hX3AgYW5kIHNpbV93cml0ZSBhcmdzIHRvCisgCXNpbV9sb2FkX2ZpbGUuCisKK0ZyaSBPY3QgIDMgMDk6Mjg6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBTZXAgMjQgMTc6Mzg6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1R1ZSBTZXAgMjMgMTE6MDQ6MzggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK01vbiBTZXAgMjIgMTE6NDY6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK0ZyaSBTZXAgMTkgMTc6NDU6MjUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK01vbiBTZXAgMTUgMTc6MzY6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1RodSBTZXAgIDQgMTc6MjE6MjMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBBdWcgMjcgMTg6MTM6MjIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitUdWUgQXVnIDI2IDEwOjM5OjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29tcGlsZS5jIChzaW1fa2lsbCk6IERlbGV0ZS4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEFkZCBBQkZEIGFyZ3VtZW50LgorCShzaW1fbG9hZCk6IE1vdmUgc2V0dGluZyBvZiBQQyBmcm9tIGhlcmUuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBUbyBoZXJlLiAKKworTW9uIEF1ZyAyNSAxNzo1MDoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK01vbiBBdWcgMjUgMTU6NTE6NTMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb21waWxlLmMgKHNpbV9vcGVuKTogQWRkIEFCRkQgYXJndW1lbnQuCisKK1R1ZSBNYXkgMjAgMTA6MzM6MTkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb21waWxlLmMgKHNpbV9zZXRfY2FsbGJhY2tzKTogRGVsZXRlIFNJTV9ERVNDIGFyZ3VtZW50LgorCShzaW1fb3Blbik6IEFkZCBjYWxsYmFjayBhcmd1bWVudC4KKworVGh1IEFwciAyNCAwMDozOTo1MSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK0ZyaSBBcHIgMTggMTQ6MDI6MTAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb21waWxlLmMgKHNpbV9zdG9wKTogTmV3IGZ1bmN0aW9uLgorCitUaHUgQXByIDE3IDAzOjExOjA2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbG9hZC5vLgorCSogY29tcGlsZS5jOiAjaW5jbHVkZSBiZmQuaC4KKwkoc2ltX2tpbmQsIG15bmFtZSwgc3RhcnRfYWRkcmVzcyk6IE5ldyBzdGF0aWMgbG9jYWxzLgorCShzaW1fb3Blbik6IFNldCBzaW1fa2luZCwgbXluYW1lLgorCShzaW1fbG9hZCk6IFJldHVybiBTSU1fUkMuICBOZXcgYXJnIGFiZmQuICBDYWxsIHNpbV9sb2FkX2ZpbGUgdG8KKwlsb2FkIGZpbGUgaW50byBzaW11bGF0b3IuICBTZXQgc3RhcnQgYWRkcmVzcyBmcm9tIGJmZC4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFJldHVybiBTSU1fUkMuICBEZWxldGUgYXJnIHN0YXJ0X2FkZHJlc3MuCisKK1dlZCBBcHIgMTYgMTc6MzQ6NDEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnN0LmggKEg4NTAwX01TSVpFKTogUmVuYW1lIGZyb20gTVNJWkUuCisJKiBjb21waWxlLmMgKHNpbV9yZWFkLCBzaW1fd3JpdGUsIGluaXRfcG9pbnRlcnMpOiBVcGRhdGUuCisKK01vbiBBcHIgIDcgMTU6NDU6MDIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1dlZCBBcHIgIDIgMTU6MDY6MjggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29tcGlsZS5jIChzaW1fb3Blbik6IE5ldyBhcmcgYGtpbmQnLgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBBcHIgIDIgMTQ6MzQ6MTkgMTk5NyBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBNYXIgMTkgMDE6MTQ6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIE1hciAxNyAxNToxMDowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKworRnJpIE1hciAxNCAxMDozNDoxMSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1RodSBNYXIgMTMgMTI6NTA6MjggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29tcGlsZS5jIChzaW1fb3Blbik6IE5ldyBTSU1fREVTQyByZXN1bHQuICBBcmd1bWVudCBpcyBub3cgaW4KKwlhcmd2IGZvcm0uCisJKG90aGVyIHNpbV8qKTogTmV3IFNJTV9ERVNDIGFyZ3VtZW50LgorCitUdWUgRmViICA0IDEzOjM2OjI5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChAQ09NTU9OX01BS0VGSUxFX0ZSQUcpOiBVc2UKKwlDT01NT05fe1BSRSxQT1NUfV9DT05GSUdfRlJBRyBpbnN0ZWFkLgorCSogY29uZmlndXJlLmluOiBzaW5jbHVkZSAuLi9jb21tb24vYWNsb2NhbC5tNC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK1RodSBKYW4gMjMgMTE6NDY6MjMgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBNYWtlZmlsZS5pbjogIFVwZGF0ZSB0byBuZXcgY29uZmlndXJlCisJc2NoZW1lIHdoaWNoIGlzIG1vcmUgY29tcGF0aWJsZSB3aXRoIFdpbkdEQiBidWlsZHMuCisJKiBjb25maWd1cmUuaW46ICBJbXByb3ZlIGNvbW1lbnQgb24gaG93IHRvIHJ1biBhdXRvY29uZi4KKwkqIGNvbmZpZ3VyZTogIFJlLXJ1biBhdXRvY29uZiB0byBnZXQgbmV3IC4uL2NvbW1vbi9hY2xvY2FsLm00LgorCSogTWFrZWZpbGUuaW46ICBVc2UgYXV0b2NvbmYgc3Vic3RpdHV0aW9uIHRvIGluc3RhbGwgY29tbW9uCisJbWFrZWZpbGUgZnJhZ21lbnQuCisKK1dlZCBOb3YgMjAgMDE6NDg6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IERlbGV0ZSBzdHVmZiBtb3ZlZCB0byAuLi9jb21tb24vTWFrZS1jb21tb24uaW4uCisJKiBjb25maWd1cmUuaW46IFNpbXBsaWZ5IHVzaW5nIG1hY3JvcyBpbiAuLi9jb21tb24vYWNsb2NhbC5tNC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKFNJTV9PQkpTLFNJTV9FWFRSQV9DRkxBR1MpOiBEZWZpbmUuCisJKiBjb21waWxlLmMgKHNpbV9zZXRfc2ltY2FjaGVfc2l6ZSk6IFJlbmFtZWQgZnJvbSBzaW1fY3NpemUuCisJKHNpbV9zaXplKSBOZXcgZnVuY3Rpb24uCisJKHNpbV9jYWxsYmFjayk6IE5ldyBnbG9iYWwuICBSZWRpcmVjdCBhbGwgY2FsbHMgdG8gcHJpbnRmX2ZpbHRlcmVkCisJdGhyb3VnaCBjYWxsYmFjay4KKwkoc2ltX3NldF9jYWxsYmFja3MpOiBSZWNvcmQgY2FsbGJhY2suCisJKiBydW4uYzogRGVsZXRlLCB1c2luZyBvbmUgaW4gLi4vY29tbW9uIG5vdy4KKwkqIHRjb25maWcuaW46IE5ldyBmaWxlLgorCitUaHUgT2N0ICAzIDE2OjE0OjA4IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKyAgICAgICAgKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4pOiBEb24ndCByZW1vdmUgY29uZmlnLmxvZyBoZXJlLgorCitXZWQgSnVuIDI2IDEyOjIzOjM5IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKyAgICAgICAgKiBNYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgaW5jbHVkZWRpciwKKyAgICAgICAgSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYtc2V0IHZhbHVlcy4KKyAgICAgICAgKGRvY2Rpcik6IFJlbW92ZWQuCisgICAgICAgICogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBhdXRvY29uZiAyLjUgb3IgaGlnaGVyLgorICAgICAgICAoQUNfUFJPR19JTlNUQUxMKTogQWRkZWQuCisgICAgICAgICogY29uZmlndXJlOiBSZWJ1aWx0LgorCitXZWQgRmViIDIxIDEyOjE1OjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi43LgorCitGcmkgT2N0IDEzIDE1OjAzOjQ4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGNvbXBpbGUuYyAoc2ltX3NldF9jYWxsYmFja3MpOiBOZXcuCisKK1R1ZSBPY3QgMTAgMTE6MTA6MzYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChCSVNPTik6IFJlbW92ZSBtYWNyby4KKworV2VkIFNlcCAyMCAxMzozNToyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIHJlYWxjbGVhbi4KKworRnJpIFNlcCAgOCAxMjozODozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgaW5zdGFsbCBpbiAkKHRvb2xkaXIpLgorCisJKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUi4gIERvbid0IHRyeSB0byB1c2UKKwliZmQvaG9zdHMvKi5oIGZpbGUgb3IgYmZkL2NvbmZpZy8qLm1oIGZpbGUuICBDYWxsIEFDX1BST0dfQ0MgYW5kCisJQUNfUFJPR19SQU5MSUIuICBTdWJzdGl0dXRlIGluIHZhbHVlcyBmb3IgQ0ZMQUdTLCBIREVGSU5FUyBhbmQgQVIuCisJQ2FsbCBBQ19DSEVDS19IRUFERVJTIGZvciBzdGRsaWIuaCBhbmQgdGltZS5oLiAgVG91Y2ggc3RhbXAuaCBpZgorCWNyZWF0aW5nIGNvbmZpZy5oLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogY29uZmlnLmluOiBOZXcgZmlsZSwgY3JlYXRlZCBieSBhdXRvaGVhZGVyLgorCSogTWFrZWZpbGUuaW4gKEFSKTogRGVmaW5lIGFzIEBBUkAuCisJKENDKTogTmV3IHZhcmlhYmxlLCBkZWZpbmVkIGFzIEBDQ0AuCisJKENGTEFHUyk6IERlZmluZSBhcyBAQ0ZMQUdTQC4KKwkoUkFOTElCKTogRGVmaW5lIGFzIEBSQU5MSUJALgorCShIREVGSU5FUywgVERFRklORVMpOiBOZXcgdmFyaWFibGVzLgorCShAaG9zdF9tYWtlZmlsZV9mcmFnQCk6IFJlbW92ZS4KKwkoY29tcGlsZS5vLCBydW4ubyk6IERlcGVuZCB1cG9uIGNvbmZpZy5oLgorCShtb3N0bHljbGVhbik6IE1ha2UgdGhlIHNhbWUgYXMgY2xlYW4sIG5vdCBkaXN0Y2xlYW4uCisJKGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5sb2cuCisJKGRpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuaCBhbmQgc3RhbXAtaC4KKwkoTWFrZWZpbGUpOiBEb24ndCBkZXBlbmQgdXBvbiBAZnJhZ3NALiAgSnVzdCByZWJ1aWxkIE1ha2VmaWxlIHdoZW4KKwlpbnZva2luZyBjb25maWcuc3RhdHVzLgorCShjb25maWcuaCwgc3RhbXAtaCk6IE5ldyB0YXJnZXRzLgorCSogY29tcGlsZS5jOiBJbmNsdWRlICJjb25maWcuaCIuICBEb24ndCBpbmNsdWRlIDxzeXMvdGltZXMuaD4uCisJSW5jbHVkZSA8dGltZS5oPiBhbmQgPHN0ZGxpYi5oPiBpZiB0aGV5IGV4aXN0LiAgRG9uJ3QgaW5jbHVkZQorCSJzeXNkZXAuaCIuCisJKiBydW4uYzogSW5jbHVkZSAiY29uZmlnLmgiLiAgSW5jbHVkZSA8c3RkbGliLmg+IGlmIGl0IGV4aXN0cy4KKwlEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBJbmNsdWRlICJiZmQuaCIsIG5vdCAiLi4vLi4vYmZkL2JmZC5oIi4KKworVGh1IEF1ZyAxMCAxNjoyOToyMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb21waWxlLmMgKHRyYXApOiBXYXRjaCBmb3IgYWJvcnQuCisJKiBydW4uYyAobWFpbik6IFJldHVybiBub24temVybyBleGl0IGNvZGUgaWYgd2UgZGlkbid0CisJZXhpdCBjbGVhbmx5LgorCitUaHUgQXVnIDEwIDA5OjQ0OjIwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGNvbXBpbGUuYyAoZmluZCk6IEZpeCBhbm90aGVyIHRoaW5rby4KKwkqIHNpbV9yZXN1bWUgKE9fSlNSKTogTWFrZSBzdXJlIGFsbCBKU1JzIHN0YXkgaW4gdGhlIHNhbWUgcGFnZS4KKworVGh1IEF1ZyAxMCAxMzo0Mzo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChjb21waWxlLm8pOiBSZW1vdmUgYnVpbGQgcnVsZS4KKwkoLmMubyk6IEFkZCBnZW5lcmljIGJ1aWxkIHJ1bGUuCisKK1dlZCBBdWcgIDkgMDk6NDY6NDEgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IEZpeCBDU0VBUkNILgorCSogY29tcGlsZS5jIChmaW5kKTogSGFuZGxlIEFCUzI0IGFuZCBBQlMxNiBjb3JyZWN0bHkuCisJTWFrZSBKTVAgYW5kIEpTUiBzdGF5IGluIHJpZ2h0IHBhZ2UuCisKK1RodSBBdWcgIDMgMTA6NDU6MzcgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIFVwZGF0ZSBhbGwgRlNGIGFkZHJlc3NlcyBleGNlcHQgdGhvc2UgaW4gQ09QWUlORyogZmlsZXMuCisKK1dlZCBKdWwgIDUgMTQ6MzI6NTQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiBSZW1vdmUgcnVuLgorCSAgKGRpc3RjbGVhbik6IFJlbW92ZSBNYWtlZmlsZS4KKworCSogaDg1MDAubXQ6IFJlbW92ZWQuCisKKwkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IGNvbnZlcnRlZCB0byBhdXRvY29uZi4KKwkqIGNvbmZpZ3VyZTogTmV3IGZpbGUsIGdlbmVyYXRlZCB3aXRoIGF1dGNvbmYgMi40LgorCitGcmkgSnVuIDMwIDE2OjUwOjU2IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogY29tcGlsZS5jIChzaW1fZG9fY29tbWFuZCk6IE5ldyBmdW5jdGlvbi4KKworV2VkIE1heSAyNCAxNjozMTozOCAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRml4IHR5cG8gaW4gbGFzdCBjaGFuZ2UuCisKK01vbiBNYXIgMjcgMTA6MzI6MzQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBydW4uYzogcGFyc2UgYXJndW1lbnRzIHdpdGggZ2V0b3B0KCkuCisKK1R1ZSBGZWIgMjggMTc6MzA6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFVzZSAuLi8uLi9iZmQvaG9zdHMvc3RkLWhvc3QuaCBpZiBzcGVjaWZpYworCWhvc3QgdW5hdmFpbGFibGUuCisKK1dlZCBNYXkgMTggMTM6NTg6MDUgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogY29tcGlsZS5jIChzaW1fKik6IENoYW5nZSByZXN1bHQgdG8gdm9pZCB3aGVyZSB0aGVyZSBpc24ndCBvbmUuCisJKHNpbV9yZXN1bWUpOiBGaXggc3Vicm91dGluZSBjYWxsaW5nIChwdXNoIHJldHVybiBhZGRyZXNzKS4KKwkoc2ltX3NldF9wYyk6IERlbGV0ZS4KKwkoc2ltX2luZm8pOiBEZWxldGUgcHJpbnRmX2ZuIGFyZywgYWxsIGNhbGxlcnMgY2hhbmdlZC4KKwlDYWxsIHByaW50Zl9maWx0ZXJlZCBpbnN0ZWFkLgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogUmVuYW1lZCBmcm9tIHNpbV9zZXRfYXJncy4KKwkoc2ltX2Nsb3NlKTogTmV3IGZ1bmN0aW9uLgorCShzaW1fbG9hZCk6IE5ldyBmdW5jdGlvbi4KKwkqIHJ1bi5jOiAjaW5jbHVkZSA8dmFyYXJncy5oPiwgInJlbW90ZS1zaW0uaCIuCisJKHByaW50Zl9maWx0ZXJlZCk6IE5ldyBmdW5jdGlvbi4KKworU2F0IERlYyAxMSAxNjozNTozNCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogY29tcGlsZS5jIChzZWdmb3JyZWcpOiBOZXcgdmVjdG9yLiAoc2ltX3Jlc3VtZSk6IEdldCBaIGZsYWcKKwlyaWdodCBmb3IgYml0b3BzLiAoc2ltX3N0b3JlX3JlZ2lzdGVyLCBzaW1fZmV0Y2hfcmVnaXN0ZXIsCisJc2ltX3NldF9wYyk6ICBVc2UgbmV3IHJlZ2lzdGVyIG5hbWluZyBjb252ZW50aW9uLgorCitUaHUgT2N0IDI4IDE5OjMxOjI0IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGNvbXBpbGUuYzogI2luY2x1ZGUgImFuc2lkZWNsLmgiIGZvciByZW1vdGUtc2ltLmguCisKK1R1ZSBPY3QgMjYgMTA6MDI6MTggMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKENTRUFSQ0gpOiBBZGQgLUkkKHNyY2RpcikvLi4vLi4vZ2RiLgorCSogY29tcGlsZS5jOiAjaW5jbHVkZSAic3lzZGVwLmgiIGFuZCAicmVtb3RlLXNpbS5oIi4KKwkoU0VUX1NFR1JFRyk6IFByb3RlY3QgYXJnIGB5JyB3aXRoIHBhcmVucy4KKwkoc2ltX3Jlc3VtZSk6IE5ldyBhcmcgYHNpZ2duYWwnLgorCShzaW1fd3JpdGUpOiBVc2UgU0lNX0FERFIgZm9yIHR5cGUgb2YgYXJnIGBhZGRyJywgaW50IHJlc3VsdC4KKwkoc2ltX3JlYWQpOiBEaXR0bywgdXNlIHVuc2lnbmVkIGNoYXIgKiBmb3IgYXJnIGBidWYnLgorCShzaW1fc3RvcmVfcmVnaXN0ZXIpOiBpbnQgcmVzdWx0LCB2YWx1ZSBwYXNzZWQgYnkgcmVmZXJlbmNlLgorCShzaW1fZmV0Y2hfcmVnaXN0ZXIpOiBpbnQgcmVzdWx0LCB1c2UgdW5zaWduZWQgY2hhciAqIGZvciBhcmcgYGJ1ZicuCisJKHNpbV90cmFjZSk6IFVwZGF0ZSBjYWxsIHRvIHNpbV9yZXN1bWUuCisJKHNpbV9zdG9wX3JlYXNvbik6IFJlbmFtZWQgZnJvbSBzaW1fc3RvcF9zaWduYWwsIG5ldyBhcmcgYHJlYXNvbicsCisJaW50IHJlc3VsdCAoZXJyb3IgY29kZSwgY3VycmVudGx5IGFsd2F5cyAwKS4KKwkoc2ltX3NldF9wYyk6IFVwZGF0ZSBjYWxscyB0byBzaW1fc3RvcmVfcmVnaXN0ZXIuCisJKHNpbV9pbmZvKTogaW50IHJlc3VsdCwgbmV3IGFyZ3MgYHByaW50X2ZuJywgYHZlcmJvc2UnLgorCShzaW1fa2lsbCk6IGludCByZXN1bHQuCisJKHNpbV9vcGVuKTogRGl0dG8sIG5ldyBhcmcgYG5hbWUnLgorCSogcnVuLmMgKG1haW4pOiBVcGRhdGUgY2FsbCB0byBzaW1faW5mby4KKworU2F0IE9jdCAyMyAxNTowNjoxMCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBjb21waWxlLmMgKHNpbV9zdG9wX3NpZ25hbCk6IFJlc3VsdCBpcyBub3cgZW51bSBzaW1fc3RvcC4KKworRnJpIE9jdCAxNSAyMzo1Mjo1NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKKworCSogY29tcGlsZS5jIChzaW1fa2lsbCwgc2ltX29wZW4sIHNpbV9zZXRfYXJncyk6IE5ldyBmdW5jdGlvbnMuCisKK1R1ZSBBdWcgMTcgMDc6MTc6MDkgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogY29tcGlsZS5jIChzaW1faW5mbyk6IERvbid0IHdvcmsgb3V0IHNpbXVsYXRpb24gcmF0aW9uIGlmCisJdGltZXRha2VuIGlzIHplcm8uCisKK01vbiBBdWcgIDIgMTQ6MDg6MjQgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogY29tcGlsZS5jIChnZXRfbm93LCBub3dfcGVyc2VjKTogVXNlIHRpbWUgc3lzdGVtIGNhbGwuIChmaW5kKSBkbworCXBqbXBzIHJpZ2h0LgorCitUdWUgSnVsIDEzIDEyOjIwOjE5IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGNvbXBpbGUuYyAoc2ltX3NldF9wYyk6IHNldCBjcCBhdCB0aGUgc2FtZSB0aW1lLiAoc2ltX3Jlc3VtZSk6CisJZml4IHBqc3IgYW5kIHBqbXAuCisKK1R1ZSBKdW4gIDggMTQ6MzQ6MzcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKKworCSogY29tcGlsZS5jOiBSZW1vdmUgZW5kaWFuLmggZGVwZW5kZW5jeS4KKworTW9uIEFwciAgNSAxMDowODozMCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogcnVuLmMgKG1haW4pOiBOb3cgdW5kZXJzdGFuZHMgLXYuCisJKiBjb21waWxlLmM6IFBhc3NlcyBhbGwgdGhlIHRlc3RzIGluIHNtYWxsIG1vZGVsLgorCitNb24gTWFyIDI5IDEzOjIwOjM2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBydW4uYywgaW5zdC5oIGNvbXBpbGUuYzogYnVnIGZpeGVzLAorCitUaHUgTWFyIDI1IDEyOjIxOjE4IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGNvbXBpbGUuYyAoc2ltX3N0b3JlX3JlZ2lzdGVyKTogIFVzZSBHREIgbmFtZXMgZm9yIHJlZ2lzdGVycyB0bworCWF2b2lkIHZlcnNpb24gc2tldyBwcm9ibGVtcy4KKwkqIChzaW1fZmV0Y2hfcmVnaXN0ZXIpOiAgRGl0dG8sIGFsc28gcmV0dXJuIG9ubHkgYml0cyB0aGF0CisJYWN0dWFsbHkgZXhpc3QuCisJKiBjb25maWd1cmUuaW46ICBGaXggc3JjdHJpZ2dlciAmIHNyY25hbWUgdG8gcmVmbGVjdCBoODUwMCwgbm90IGg4MzAwLgorCitGcmkgTWFyIDE5IDE0OjQ2OjMxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBpbnN0LmgsIGNvbXBpbGUuYywgcnVuLmM6IE5ldyBmaWxlcy4KKwpkaWZmIC0tZ2l0IGEvc2ltL2g4NTAwL01ha2VmaWxlLmluIGIvc2ltL2g4NTAwL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZDgwOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaDg1MDAvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwyOCBAQAorIyAgICBNYWtlZmlsZSB0ZW1wbGF0ZSBmb3IgQ29uZmlndXJlIGZvciB0aGUgaDg1MDAgc2ltIGxpYnJhcnkuCisjICAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMjIENPTU1PTl9QUkVfQ09ORklHX0ZSQUcKKworU0lNX09CSlMgPSBjb21waWxlLm8gc2ltLWxvYWQubworIyBGSVhNRTogVGhpcyBpcyBwcm9iYWJseSBhIGhhY2sgdG8gZ2V0IGEgc3lzY2FsbC5oLiAgYmV0dGVyIHN1cHBvcnQgZm9yCisjIHN5c2NhbGwuaCBpcyBpbiBwcm9ncmVzcy4KK1NJTV9FWFRSQV9DRkxBR1MgPSAtSSQoc3JjZGlyKS8uLi8uLi9uZXdsaWIvbGliYy9zeXMvejhrCisKKyMjIENPTU1PTl9QT1NUX0NPTkZJR19GUkFHCisKK2NvbXBpbGUubzogY29tcGlsZS5jIGNvbmZpZy5oCmRpZmYgLS1naXQgYS9zaW0vaDg1MDAvYWNjb25maWcuaCBiL3NpbS9oODUwMC9hY2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Yjg3YTEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaDg1MDAvYWNjb25maWcuaApAQCAtMCwwICsxLDE1IEBACisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgY2F0Z2V0cyBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfQ0FUR0VUUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCisjdW5kZWYgSEFWRV9HRVRURVhUCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLworI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKZGlmZiAtLWdpdCBhL3NpbS9oODUwMC9jb21waWxlLmMgYi9zaW0vaDg1MDAvY29tcGlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYWQ2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaDg1MDAvY29tcGlsZS5jCkBAIC0wLDAgKzEsMjUxOSBAQAorLyogU2ltdWxhdG9yIGZvciB0aGUgSGl0YWNoaSBIOC81MDAgYXJjaGl0ZWN0dXJlLgorCisgICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgorICAgc2FjQGN5Z251cy5jb20KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgSDgvNTAwIHNpbQorCisKKwkJVEhJUyBTT0ZUV0FSRSBJUyBOT1QgQ09QWVJJR0hURUQKKworICAgQ3lnbnVzIG9mZmVycyB0aGUgZm9sbG93aW5nIGZvciB1c2UgaW4gdGhlIHB1YmxpYyBkb21haW4uICBDeWdudXMKKyAgIG1ha2VzIG5vIHdhcnJhbnR5IHdpdGggcmVnYXJkIHRvIHRoZSBzb2Z0d2FyZSBvciBpdCdzIHBlcmZvcm1hbmNlCisgICBhbmQgdGhlIHVzZXIgYWNjZXB0cyB0aGUgc29mdHdhcmUgIkFTIElTIiB3aXRoIGFsbCBmYXVsdHMuCisKKyAgIENZR05VUyBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgV0lUSCBSRUdBUkQgVE8KKyAgIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9USU1FX0gKKyNpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAicmVtb3RlLXNpbS5oIgorCisjZGVmaW5lIE9fUkVDT01QSUxFIDg1CisjZGVmaW5lIERFRklORV9UQUJMRQorI2RlZmluZSBESVNBU1NFTUJMRVJfVEFCTEUKKworLyogRklYTUU6IE5lZWRzIHRvIGxpdmUgaW4gaGVhZGVyIGZpbGUuCisgICBUaGlzIGhlYWRlciBzaG91bGQgYWxzbyBpbmNsdWRlIHRoZSB0aGluZ3MgaW4gcmVtb3RlLXNpbS5oLgorICAgT25lIGNvdWxkIG1vdmUgdGhpcyB0byByZW1vdGUtc2ltLmggYnV0IHRoaXMgZnVuY3Rpb24gaXNuJ3QgbmVlZGVkCisgICBieSBnZGIuICAqLwordm9pZCBzaW1fc2V0X3NpbWNhY2hlX3NpemUgUEFSQU1TICgoaW50KSk7CisKK2ludCBkZWJ1ZzsKKworaG9zdF9jYWxsYmFjayAqc2ltX2NhbGxiYWNrOworCitzdGF0aWMgU0lNX09QRU5fS0lORCBzaW1fa2luZDsKK3N0YXRpYyBjaGFyICpteW5hbWU7CisKKy8qIFRoaXMgY29kZSBjYW4gYmUgY29tcGlsZWQgd2l0aCBhbnkgb2xkIEMgY29tcGlsZXIsIGluIHdoaWNoIGNhc2UKKyAgIGZvdXIgb3IgZml2ZSBzd2l0Y2ggc3RhdGVtZW50cyB3aWxsIGJlIGV4ZWN1dGVkIGZvciBlYWNoCisgICBpbnN0cnVjdGlvbiBzaW11bGF0ZWQuICBJdCBjYW4gYmUgY29tcGlsZWQgd2l0aCBHQ0MsIHRoZW4gdGhlCisgICBzaW11bGF0ZWQgaW5zdHJ1Y3Rpb25zIHRocmVhZCB0aHJvdWdoIHRoZSBjb2RlIGZyYWdtZW50cywgYW5kCisgICBldmVyeXRoaW5nIGdvZXMgbXVjaCBmYXN0ZXIuCisKKyAgIFRoZXNlIGRlZmluaXRpb25zIG1ha2UgdGhlIGNvZGUgd29yayBlaXRoZXIgd2F5CisqLworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIERJU1BBVENIKFgpIGdvdG8gKihYKTsgZG8KKyNkZWZpbmUgTEFCRUwoWCkgWCMjX0wKKyNkZWZpbmUgTEFCRUxOKFgsTikgWCMjX0wjI04KKyNkZWZpbmUgTEFCRUxfUkVGKFgpICYmWCMjX0wKKyNkZWZpbmUgTEFCRUxfUkVGTihYLE4pICYmWCMjX0wjI04KKyNkZWZpbmUgRU5ERElTUEFUQ0ggd2hpbGUgKDApOworI2RlZmluZSBmYXN0cmVmIHZvaWQgKgorCisjZGVmaW5lIERFRkFVTFQgOworI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXworI2Vsc2UKKyNkZWZpbmUgREVGQVVMVCBkZWZhdWx0IDoKKyNkZWZpbmUgRElTUEFUQ0goWCkgc3dpdGNoIChYKQorI2RlZmluZSBMQUJFTChYKSBjYXNlIFgKKyNkZWZpbmUgTEFCRUxOKFgsTikgY2FzZSBYCisjZGVmaW5lIExBQkVMX1JFRihYKSBYCisjZGVmaW5lIExBQkVMX1JFRk4oWCxOKSBYCisjZGVmaW5lIEVORERJU1BBVENICisjZGVmaW5lIGZhc3RyZWYgaW50CisKKworCisjZGVmaW5lIElOTElORQorI2RlZmluZSBTVE9SRV9SRUdfQiAJMQorI2RlZmluZSBTVE9SRV9SRUdfVyAJMgorI2RlZmluZSBTVE9SRV9JTkNfQiAJMworI2RlZmluZSBTVE9SRV9JTkNfVyAJNAorI2RlZmluZSBTVE9SRV9ERUNfQiAJNQorI2RlZmluZSBTVE9SRV9ERUNfVyAJNgorI2RlZmluZSBTVE9SRV9ESVNQX0IgCTcKKyNkZWZpbmUgU1RPUkVfRElTUF9XIAk4CisjZGVmaW5lIFNUT1JFX0NSQiAJOQorI2RlZmluZSBTVE9SRV9DUlcgCTEwCisjZGVmaW5lIFNUT1JFX1JFR19MIAkxMQorI2RlZmluZSBTVE9SRV9OT1AgCTEyCisKKyNkZWZpbmUgRkVUQ0hfTk9QIAk5CisjZGVmaW5lIEZFVENIX1JFR19CIAkxMAorI2RlZmluZSBGRVRDSF9SRUdfVyAJMTEKKyNkZWZpbmUgRkVUQ0hfSU5DX0IgCTEyCisjZGVmaW5lIEZFVENIX0lOQ19XIAkxMworI2RlZmluZSBGRVRDSF9ERUNfQiAJMTQKKyNkZWZpbmUgRkVUQ0hfREVDX1cgCTE1CisjZGVmaW5lIEZFVENIX0RJU1BfQiAJMTYKKyNkZWZpbmUgRkVUQ0hfRElTUF9XIAkxNworI2RlZmluZSBGRVRDSF9JTU0gCTE4CisjZGVmaW5lIEZFVENIX0NSQiAJMTkKKyNkZWZpbmUgRkVUQ0hfQ1JXIAkyMAorI2RlZmluZSBGRVRDSF9MVkFMIAkyMQorI2RlZmluZSBGRVRDSF9MVkFMMjQgCTIyCisjZGVmaW5lIEZFVENIX1JFR19MIAkyMworCisjZGVmaW5lIEZMQUdfbSAJCTIwCisjZGVmaW5lIEZMQUdfTSAJCTIxCisjZGVmaW5lIEZMQUdfQSAJCTIyCisjZGVmaW5lIEZMQUdfTk9ORSAJMjMKKyNkZWZpbmUgRkxBR19OT1NUT1JFIAkyNAorI2RlZmluZSBGTEFHX0NMRUFSIAkyNQorI2RlZmluZSBGTEFHX2EgCQkyNgorI2RlZmluZSBGTEFHX0JSQU5DSCAJMjcKKyNkZWZpbmUgRkxBR19zcGVjaWFsIAkyOAorCisjZGVmaW5lIEZMQUdfc2hpZnR3b3JkIAkyOQorI2RlZmluZSBGTEFHX3NoaWZ0Ynl0ZSAJMzAKKworI2RlZmluZSBGTEFHX211bHR3b3JkIAkzMQorI2RlZmluZSBGTEFHX211bHRieXRlIAkzMgorI2VuZGlmCisKKworI2RlZmluZSBoODUwMF90YWJsZSBoODUwMF9jb21waWxlX3RhYmxlCisjaW5jbHVkZSAiLi4vb3Bjb2Rlcy9oODUwMC1vcGMuaCIKKworI2luY2x1ZGUgImluc3QuaCIKKworI2RlZmluZSBMT1dfQllURSh4KSAoKHgpICYgMHhmZikKKyNkZWZpbmUgSElHSF9CWVRFKHgpICgoKHgpPj44KSAmIDB4ZmYpCisjZGVmaW5lIE5PUk1BTF9DUCAoKGNwdS5yZWdzW1JfQ1BdLmMgLSBjcHUubWVtb3J5KT4+MTYpCisjZGVmaW5lIE5PUk1BTF9EUCAoKGNwdS5yZWdzW1JfRFBdLmMgLSBjcHUubWVtb3J5KT4+MTYpCisjZGVmaW5lIE5PUk1BTF9FUCAoKGNwdS5yZWdzW1JfRVBdLmMgLSBjcHUubWVtb3J5KT4+MTYpCisjZGVmaW5lIE5PUk1BTF9UUCAoKGNwdS5yZWdzW1JfVFBdLmMgLSBjcHUubWVtb3J5KT4+MTYpCisjZGVmaW5lIFNFVF9OT1JNUkVHKHgseSkgKChjcHUucmVnc1t4XS5sID0gKHkpKSkKKyNkZWZpbmUgR0VUX05PUk1SRUcoeCkgKGNwdS5yZWdzW3hdLmwpCisjZGVmaW5lIFNFVF9TRUdSRUcoeCx5KSB7IGNwdS5yZWdzW3hdLmMgPSAoKHkpICYgMHhmZjAwMDApICsgY3B1Lm1lbW9yeTt9CisjZGVmaW5lIEdFVF9TRUdSRUcoeCkgICggKGNwdS5yZWdzW3hdLmMgIC0gY3B1Lm1lbW9yeSApID4+IDE2KQorI2RlZmluZSBTRVRfTk9STUFMX0NQUEMoeCkgeyBwYyA9ICh4KSAmIDB4ZmZmZjsgU0VUX1NFR1JFRyhSX0NQLCAoeCkpO30KKyNkZWZpbmUgTk9STUFMX1NSICgoTjw8Myl8KFo8PDIpfChWPDwxKXwoQykpCisjZGVmaW5lIFAoWCxZKSAoKFg8PDgpIHwgWSkKKworI2RlZmluZSBCVUlMRFNSKCkgICBjcHUucmVnc1tSX1NSXS5zW0xPV10gPSAoTiA8PCAzKSB8IChaIDw8IDIpIHwgKFY8PDEpIHwgQzsKKworI2RlZmluZSBHRVRTUigpCQkgICAgXAorICBDID0gKGNwdS5yZWdzW1JfU1JdLnNbTE9XXSA+PiAwKSAmIDE7XAorICBWID0gKGNwdS5yZWdzW1JfU1JdLnNbTE9XXSA+PiAxKSAmIDE7XAorICBaID0gKGNwdS5yZWdzW1JfU1JdLnNbTE9XXSA+PiAyKSAmIDE7XAorICBOID0gKGNwdS5yZWdzW1JfU1JdLnNbTE9XXSA+PiAzKSAmIDE7CisKKyNpZmRlZiBfX0NIQVJfSVNfU0lHTkVEX18KKyNkZWZpbmUgU0VYVENIQVIoeCkgKChjaGFyKSh4KSkKKyNlbmRpZgorCisjaWZuZGVmIFNFWFRDSEFSCisjZGVmaW5lIFNFWFRDSEFSKHgpICgoeCAmIDB4ODApID8gKHggfCB+MHhmZik6eCkKKyNlbmRpZgorCisjZGVmaW5lIFNFWFRTSE9SVCh4KSAoKHNob3J0KSh4KSkKKworLyogV2hpY2ggc2VnbWVudCByZWdpc3RlcnMgZ28gd2l0aCB3aGljaCBwb2ludGVyIHJlZ2lzdGVycyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgKipzZWdtYXBbUl9MQVNUXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoocmVncHRyW1JfTEFTVF1bM10pOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKihzZWdyZWdwdHJbUl9MQVNUXVszXSk7CitzdGF0aWMgY3B1X3N0YXRlX3R5cGUgY3B1OworCitzdGF0aWMgaW50IHNlZ2ZvcnJlZ1tdID0ge1JfRFAsIFJfRFAsIFJfRFAsIFJfRFAsCisJCQkgICAgUl9FUCwgUl9FUCwgUl9UUCwgUl9UUCwKKwkJCSAgICBSX0RQLCBSX0RQLCBSX0RQLCBSX0RQLAorCQkJICAgIFJfRVAsIFJfRVAsIFJfVFAsIFJfVFB9OworaW50IExPVzsKK2ludCBISUdIOworCisvKiByb3V0aW5lcyBmb3IgZ2V0dGluZyBhbmQgc3RvcmluZyBhcmdzICovCisjZGVmaW5lIGVsdmFsKHN0cnVjdCwgbGl0KSBcCisgKCgoKihzdHJ1Y3QucmVnLndwdHIpICsgbGl0KSAmIDB4ZmZmZikgKyAoKihzdHJ1Y3QucjIuc2VncmVnKSkpCisKKyNkZWZpbmUgZGlzcGx2YWwocykgZWx2YWwoKHMpLChzKS5saXRlcmFsKQorCisjZGVmaW5lIGlyZWdsdmFsKHN0cnVjdCkgZWx2YWwoc3RydWN0LCAwKQorI2RlZmluZSB3b3JkYXQoeCkgKCgoeClbMF0gPDwgOCkgfCAoeClbMV0pCisjZGVmaW5lIGxvbmdhdCh4KSAoKHdvcmRhdCgoeCkpPDwxNil8KHdvcmRhdCgoeCkrMikpKQorI2RlZmluZSBieXRlYXQoeCkgKCh4KVswXSkKKworI2RlZmluZSBzZXR3b3JkYXQoeCx5KSB7eFswXSA9KCB5KT4+ODsgeFsxXSA9IHk7fQorI2RlZmluZSBzZXRieXRlYXQoeCx5KSB7eFswXSA9IHk7fQorCisvKiNkZWZpbmUgc2V0YWxpZ25lZHdvcmRhdCh4LHkpIHsoKHNob3J0ICopeClbMF0gPXk7fSovCisvKgorc3RhdGljcworKi8KKworZWFfdHlwZSByZDsKK2VhX3R5cGUgcnM7CitlYV90eXBlIGltbTsKK2VhX3R5cGUgY3I7CitlYV90eXBlIGVhOworZWFfdHlwZSBub3A7CitlYV90eXBlIGx2YWw7CitlYV90eXBlIGx2YWwyNDsKKworZWFfdHlwZSBlYXZlY3RvclsyXTsKKworaW50IGRpc3A7CisKKyNkZWZpbmUgSkJZVEUgMAorI2RlZmluZSBKV09SRCAxCisjZGVmaW5lIEpMT05HIDIKKwordHlwZWRlZiB1bmlvbgoreworICBzdHJ1Y3QKKyAgICB7CisgICAgICBmYXN0cmVmIHNyY2FieXRlOworICAgICAgZmFzdHJlZiBzcmNhd29yZDsKKyAgICAgIGZhc3RyZWYgc3JjYWxvbmc7CisKKyAgICAgIGZhc3RyZWYgc3JjYmJ5dGU7CisgICAgICBmYXN0cmVmIHNyY2J3b3JkOworICAgICAgZmFzdHJlZiBzcmNibG9uZzsKKworICAgICAgZmFzdHJlZiBkc3RieXRlOworICAgICAgZmFzdHJlZiBkc3R3b3JkOworICAgICAgZmFzdHJlZiBkc3Rsb25nOworICAgIH0gczsKKyAgc3RydWN0CisgICAgeworICAgICAgZmFzdHJlZiBieXRlOworICAgICAgZmFzdHJlZiB3b3JkOworICAgICAgZmFzdHJlZiBsb247CisgICAgfSBhWzNdOworCisgIGZhc3RyZWYgals5XTsKK30gc2l6ZV9wdHI7CisKK3VuaW9uCit7CisgIHN0cnVjdCBlYV9zdHJ1Y3QKKyAgICB7CisgICAgICBzaXplX3B0ciBlYV9ub3A7CisgICAgICBzaXplX3B0ciBlYV9yZWc7CisgICAgICBzaXplX3B0ciBlYV9pbmM7CisgICAgICBzaXplX3B0ciBlYV9kZWM7CisgICAgICBzaXplX3B0ciBlYV9kaXNwOworCisgICAgICBzaXplX3B0ciBlYV9pbW07CisgICAgICBzaXplX3B0ciBlYV9jcjsKKyAgICAgIHNpemVfcHRyIGVhX2x2YWw7CisgICAgICBzaXplX3B0ciBlYV9sdmFsMjQ7CisgICAgfSBzOworI2RlZmluZSBOX0VBVFlQRVMgKHNpemVvZihzdHJ1Y3QgZWFfc3RydWN0KSAvIHNpemVvZihzaXplX3B0cikpCisgIHNpemVfcHRyIGFbTl9FQVRZUEVTXTsKK30gZWFzOworCisvKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGFuIGVhIHN0cnVjdHVyZSBmaWxsZWQgaW4gZm9yIHRoZSAxc3Qgc291cmNlCisgb3BlcmFuZCBhbmQgbW9kaWZpZXMgaXQgdG8gYmUgZm9yIGVpdGhlciB0aGUgMXN0LCAybmQgb3IgZHN0IG9wZXJhbmQgKi8KKworc3RhdGljIHZvaWQKK2hvd3RvX3dvcmtvdXQgKGVuY29kZWQsIHNlbWllbmNvZGVkLCBuKQorICAgICBlYV90eXBlICplbmNvZGVkOworICAgICBlYV90eXBlICpzZW1pZW5jb2RlZDsKKyAgICAgaW50IG47Cit7CisgIGludCBpOworICAqZW5jb2RlZCA9ICpzZW1pZW5jb2RlZDsKKworICBmb3IgKGkgPSAwOyBpIDwgTl9FQVRZUEVTOyBpKyspCisgICAgeworICAgICAgaWYgKGVuY29kZWQtPnR5cGUgPT0gZWFzLmFbaV0ucy5zcmNhYnl0ZSkKKwl7CisJICBlbmNvZGVkLT50eXBlID0gZWFzLmFbaV0uYVtuXS5ieXRlOworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKGVuY29kZWQtPnR5cGUgPT0gZWFzLmFbaV0ucy5zcmNhd29yZCkKKwl7CisJICBlbmNvZGVkLT50eXBlID0gZWFzLmFbaV0uYVtuXS53b3JkOworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKGVuY29kZWQtPnR5cGUgPT0gZWFzLmFbaV0ucy5zcmNhbG9uZykKKwl7CisJICBlbmNvZGVkLT50eXBlID0gZWFzLmFbaV0uYVtuXS5sb247CisJICByZXR1cm47CisJfQorICAgIH0KKworICBhYm9ydCAoKTsKK30KKworZmFzdHJlZiBmbGFnX3NoaWZ0d29yZDsKK2Zhc3RyZWYgZmxhZ19zaGlmdGJ5dGU7CitmYXN0cmVmIGZsYWdfbXVsdHdvcmQ7CitmYXN0cmVmIGZsYWdfbXVsdGJ5dGU7CitmYXN0cmVmIGZsYWdfbXA7CitmYXN0cmVmIGZsYWdfc3BlY2lhbDsKK2Zhc3RyZWYgZmxhZ19NcDsKK2Zhc3RyZWYgZmxhZ19hcDsKK2Zhc3RyZWYgZmxhZ19BcDsKK2Zhc3RyZWYgZmxhZ19ub25lcDsKK2Zhc3RyZWYgZmxhZ19ub3N0b3JlcDsKK2Zhc3RyZWYgZmxhZ19jbGVhcnA7CitmYXN0cmVmIGZsYWdfYnJhbmNoOworZmFzdHJlZiBleGVjX2Rpc3BhdGNoWzEwMF07CisKK3N0YXRpYyBpbnQKK2dldF9ub3cgKCkKK3sKKyAgcmV0dXJuIHRpbWUgKDApOworfQorCitzdGF0aWMgaW50Citub3dfcGVyc2VjICgpCit7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorZ290Y3IgKHB0ciwgbikKKyAgICAgZWFfdHlwZSAqcHRyOworICAgICBpbnQgbjsKK3sKKyAgaW50IHNpemU7CisgIG4gJj0gMHg3OworICBpZiAobiA9PSAwKQorICAgIHsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHB0ci0+dHlwZSA9IGVhcy5zLmVhX2NyLmpbSkJZVEVdOworICAgICAgcHRyLT5yZWcuYnB0ciA9IHNlZ3JlZ3B0cltuXVtKTE9OR107CisgICAgfQorfQorc3RhdGljIHZvaWQKK2dvdHJlZyAocHRyLCBuLCBzaXplKQorICAgICBlYV90eXBlICpwdHI7CisgICAgIGludCBuOworICAgICBpbnQgc2l6ZTsKK3sKKyAgbiAmPSAweDc7CisgIHB0ci0+dHlwZSA9IGVhcy5zLmVhX3JlZy5qW3NpemVdOworICBwdHItPnJlZy5icHRyID0gcmVncHRyW25dW3NpemVdOworfQorCitzdGF0aWMgdm9pZAorZ290aW5jIChwdHIsIG4sIGluYywgc2l6ZSkKKyAgICAgZWFfdHlwZSAqcHRyOworICAgICBpbnQgbjsKKyAgICAgaW50IHNpemU7Cit7CisgIG4gJj0gMHg3OworICBpZiAoaW5jID4gMCkKKyAgICB7CisgICAgICBwdHItPnR5cGUgPSBlYXMucy5lYV9pbmMualtzaXplXTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwdHItPnR5cGUgPSBlYXMucy5lYV9kZWMualtzaXplXTsKKyAgICB9CisgIHB0ci0+cmVnLmJwdHIgPSByZWdwdHJbbl1bSldPUkRdOworICBwdHItPnIyLnNlZ3JlZyA9IHNlZ21hcFtuXTsKK30KKworCitzdGF0aWMgdm9pZAorZ290YWJzIChwdHIsIGRpc3AsIHJlZywgc2l6ZSkKKyAgICAgZWFfdHlwZSAqcHRyOworICAgICBpbnQgZGlzcDsKKyAgICAgaW50IHJlZzsKKyAgICAgaW50IHNpemU7Cit7CisgIHB0ci0+dHlwZSA9IGVhcy5zLmVhX2Rpc3AualtzaXplXTsKKyAgcHRyLT5yZWcuYnB0ciA9IHJlZ3B0cltyZWddW0pXT1JEXTsKKyAgcHRyLT5yMi5zZWdyZWcgPSBzZWdtYXBbcmVnXTsKKyAgcHRyLT5saXRlcmFsID0gZGlzcDsKK30KKworc3RhdGljIHZvaWQKK2dvdGluZCAocHRyLCBkaXNwLCByZWcsIHNpemUpCisgICAgIGVhX3R5cGUgKnB0cjsKKyAgICAgaW50IGRpc3A7CisgICAgIGludCByZWc7CisgICAgIGludCBzaXplOworeworICBnb3RhYnMgKHB0ciwgZGlzcCwgcmVnICYgMHg3LCBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK2dvdGltbSAocHRyLCB2YWwpCisgICAgIGVhX3R5cGUgKnB0cjsKKyAgICAgaW50IHZhbDsKK3sKKyAgcHRyLT50eXBlID0gZWFzLnMuZWFfaW1tLmpbMF07CisgIHB0ci0+bGl0ZXJhbCA9IHZhbDsKK30KKworc3RhdGljIHZvaWQKK2luZG9mZiAocHRyKQorICAgICBlYV90eXBlICpwdHI7Cit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgIHsKKyAgICAgIGlmIChwdHItPnR5cGUgPT0gZWFzLnMuZWFfZGlzcC5qW2ldKQorCXsKKwkgIHB0ci0+dHlwZSA9IGVhcy5zLmVhX2x2YWwualtpXTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorfQorCit0aGlua2Fib3V0X3NoaWZ0cyAoZCwgYnl0ZXNpemVkKQorICAgICBkZWNvZGVkX2luc3QgKmQ7CisgICAgIGludCBieXRlc2l6ZWQ7Cit7CisgIGlmIChieXRlc2l6ZWQpCisgICAgeworICAgICAgLyogR290IGEgYnl0ZSBzaGlmdCwgZmFrZSB1cCBzZWNvbmQgYXJnICovCisgICAgICBkLT5zcmNiLnR5cGUgPSBlYXMucy5lYV9pbW0ucy5zcmNid29yZDsKKyAgICAgIGQtPnNyY2IubGl0ZXJhbCA9IDg7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogZ290IGEgd29yZCBzaGlmdCwgZmFrZSB1cCBzZWNvbmQgYXJnICovCisgICAgICBkLT5zcmNiLnR5cGUgPSBlYXMucy5lYV9pbW0ucy5zcmNid29yZDsKKyAgICAgIGQtPnNyY2IubGl0ZXJhbCA9IDE2OworICAgIH0KK30KKworLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgY3ljbGVzIHJlcXVpcmVkIHRvIHJ1biB0aGlzCisgICBpbnN0cnVjdGlvbgorKi8KK3N0YXRpYyB2b2lkCitjb21wY3ljbGVzIChkc3QsIG9wY29kZSkKKyAgICAgZGVjb2RlZF9pbnN0ICpkc3Q7CisgICAgIGg4NTAwX29wY29kZV9pbmZvICpvcGNvZGU7Cit7CisgIGludCBjeWNsZXMgPSAwOworICAvKiBHdWVzcyBmb3IgdGhlIHRpbWUgYmVpbmcgLSAxIGN5Y2xlIGZvciB0aGUgZmlyc3QgdHdvIGJ5dGVzIGluIHRoZQorICAgICBvcGNvZGUgLSB0byBmZWN0aCB0aGUgb3BlcmFuZCwgYW5kIDMgY3ljbGVzIGZvciBhbGwgdGhlIHJlc3Qgb2YKKyAgICAgdGhlIGJ5dGVzLCBzaW5jZSB0aGV5IG1lYW4gdGhhdCB0aGVyZSBpcyBwcm9iYWJseSBhbiBvcGVyYW5kIHRvCisgICAgIGZldGNoICovCisKKyAgc3dpdGNoIChvcGNvZGUtPmxlbmd0aCkKKyAgICB7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICAgIGN5Y2xlcyArPSBvcGNvZGUtPmxlbmd0aDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBjeWNsZXMgKz0gb3Bjb2RlLT5sZW5ndGggKiAzOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGRzdC0+Y3ljbGVzID0gY3ljbGVzOworfQorCitzdGF0aWMgdm9pZAordHJhbnNsYXRlIChwdHIsIGZyb20sIHRvKQorICAgICBlYV90eXBlICpwdHI7CisgICAgIGZhc3RyZWYgZnJvbTsKKyAgICAgZmFzdHJlZiB0bzsKK3sKKyAgaWYgKHB0ci0+cmVnLndwdHIgPT0gJmNwdS5yZWdzWzddLnNbTE9XXQorICAgICAgJiYgcHRyLT50eXBlID09IGZyb20pCisgICAgeworICAgICAgcHRyLT50eXBlID0gdG87CisgICAgfQorfQorCitzdGF0aWMKK3ZvaWQKK2ZpeF9pbmNkZWNzIChkc3QpCisgICAgIGRlY29kZWRfaW5zdCAqZHN0OworeworICBpZiAoZHN0LT5kc3QudHlwZSA9PSBlYXMucy5lYV9pbmMucy5kc3RieXRlCisgICAgICAmJiAoZHN0LT5zcmNhLnR5cGUgPT0gZWFzLnMuZWFfaW5jLnMuc3JjYWJ5dGUKKwkgIHx8IGRzdC0+c3JjYi50eXBlID09IGVhcy5zLmVhX2luYy5zLnNyY2JieXRlKSkKKyAgICB7CisgICAgICBkc3QtPmRzdC50eXBlID0gZWFzLnMuZWFfZGlzcC5zLmRzdGJ5dGU7CisgICAgfQorCisgIGlmIChkc3QtPmRzdC50eXBlID09IGVhcy5zLmVhX2luYy5zLmRzdHdvcmQKKyAgICAgICYmIChkc3QtPnNyY2EudHlwZSA9PSBlYXMucy5lYV9pbmMucy5zcmNhd29yZAorCSAgfHwgZHN0LT5zcmNiLnR5cGUgPT0gZWFzLnMuZWFfaW5jLnMuc3JjYndvcmQpKQorICAgIHsKKyAgICAgIGRzdC0+ZHN0LnR5cGUgPSBlYXMucy5lYV9kaXNwLnMuZHN0d29yZDsKKyAgICB9CisKKyAgaWYgKGRzdC0+ZHN0LnR5cGUgPT0gZWFzLnMuZWFfZGVjLnMuZHN0Ynl0ZQorICAgICAgfHwgZHN0LT5kc3QudHlwZSA9PSBlYXMucy5lYV9kZWMucy5kc3R3b3JkKQorICAgIHsKKyAgICAgIGlmIChkc3QtPnNyY2EudHlwZSA9PSBlYXMucy5lYV9kZWMucy5zcmNhYnl0ZSkKKwl7CisJICBkc3QtPnNyY2EudHlwZSA9IGVhcy5zLmVhX2Rpc3Aucy5zcmNhYnl0ZTsKKwl9CisgICAgICBlbHNlIGlmIChkc3QtPnNyY2EudHlwZSA9PSBlYXMucy5lYV9kZWMucy5zcmNhd29yZCkKKwl7CisJICBkc3QtPnNyY2EudHlwZSA9IGVhcy5zLmVhX2Rpc3Aucy5zcmNhd29yZDsKKwl9CisgICAgICBlbHNlIGlmIChkc3QtPnNyY2IudHlwZSA9PSBlYXMucy5lYV9kZWMucy5zcmNiYnl0ZSkKKwl7CisJICBkc3QtPnNyY2IudHlwZSA9IGVhcy5zLmVhX2Rpc3Aucy5zcmNiYnl0ZTsKKwl9CisgICAgICBlbHNlIGlmIChkc3QtPnNyY2IudHlwZSA9PSBlYXMucy5lYV9kZWMucy5zcmNid29yZCkKKwl7CisJICBkc3QtPnNyY2IudHlwZSA9IGVhcy5zLmVhX2Rpc3Aucy5zcmNid29yZDsKKwl9CisgICAgfQorCisKKyAgLyogVHVybiBhIGJ5dGUgb3BzIGZyb20gdGhlIHNwIGludG8gd29yZCBvcHMgKi8KKyAgdHJhbnNsYXRlICgmZHN0LT5kc3QsIGVhcy5zLmVhX2RlYy5zLmRzdGJ5dGUsIGVhcy5zLmVhX2RlYy5zLmRzdHdvcmQpOworICB0cmFuc2xhdGUgKCZkc3QtPmRzdCwgZWFzLnMuZWFfaW5jLnMuZHN0Ynl0ZSwgZWFzLnMuZWFfaW5jLnMuZHN0d29yZCk7CisKKyAgdHJhbnNsYXRlICgmZHN0LT5zcmNhLCBlYXMucy5lYV9kZWMucy5zcmNhYnl0ZSwgZWFzLnMuZWFfZGVjLnMuc3JjYXdvcmQpOworICB0cmFuc2xhdGUgKCZkc3QtPnNyY2EsIGVhcy5zLmVhX2luYy5zLnNyY2FieXRlLCBlYXMucy5lYV9pbmMucy5zcmNhd29yZCk7CisKKyAgdHJhbnNsYXRlICgmZHN0LT5zcmNiLCBlYXMucy5lYV9kZWMucy5zcmNiYnl0ZSwgZWFzLnMuZWFfZGVjLnMuc3JjYndvcmQpOworICB0cmFuc2xhdGUgKCZkc3QtPnNyY2IsIGVhcy5zLmVhX2luYy5zLnNyY2JieXRlLCBlYXMucy5lYV9pbmMucy5zcmNid29yZCk7CisKKworfQorCisKK3N0YXRpYyB2b2lkCitmaW5kIChwYywgYnVmZmVyLCBkc3QpCisgICAgIGludCBwYzsKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICAgICBkZWNvZGVkX2luc3QgKmRzdDsKK3sKKyAgaDg1MDBfb3Bjb2RlX2luZm8gKm9wY29kZTsKKyAgaW50IGk7CisgIGludCBpZHg7CisgIGludCBoYWRpbW0gPSAwOworICBkc3QtPnNyY2EucmVnLnJwdHIgPSAwOworCisgIC8qIFJ1biBkb3duIHRoZSB0YWJsZSB0byBmaW5kIHRoZSBvbmUgd2hpY2ggbWF0Y2hlcyAqLworICBmb3IgKG9wY29kZSA9IGg4NTAwX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQorICAgIHsKKyAgICAgIGludCBieXRlOworICAgICAgaW50IHJuOworICAgICAgaW50IHJkOworICAgICAgaW50IHJzOworICAgICAgaW50IGRpc3A7CisgICAgICBpbnQgYWJzOworICAgICAgaW50IGltbTsKKyAgICAgIGludCBwY3JlbDsKKyAgICAgIGludCBxaW07CisgICAgICBpbnQgaTsKKyAgICAgIGludCBjcjsKKworCisgICAgICBkc3QtPm9wY29kZSA9IGV4ZWNfZGlzcGF0Y2hbb3Bjb2RlLT5mbGF2b3IgJiAweDdmXTsKKworICAgICAgZm9yIChieXRlID0gMDsgYnl0ZSA8IG9wY29kZS0+bGVuZ3RoOyBieXRlKyspCisJeworCSAgaWYgKChidWZmZXJbYnl0ZV0gJiBvcGNvZGUtPmJ5dGVzW2J5dGVdLm1hc2spCisJICAgICAgIT0gKG9wY29kZS0+Ynl0ZXNbYnl0ZV0uY29udGVudHMpKQorCSAgICB7CisJICAgICAgZ290byBuZXh0OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBleHRyYWN0IGFueSBpbmZvIHBhcnRzICovCisJICAgICAgc3dpdGNoIChvcGNvZGUtPmJ5dGVzW2J5dGVdLmluc2VydCkKKwkJeworCQljYXNlIDA6CisJCWNhc2UgRlA6CisJCSAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgYWJvcnQgKCk7CisJCSAgYnJlYWs7CisJCWNhc2UgUk46CisJCSAgcm4gPSBidWZmZXJbYnl0ZV0gJiAweDc7CisJCSAgYnJlYWs7CisJCWNhc2UgUlM6CisJCSAgcnMgPSBidWZmZXJbYnl0ZV0gJiAweDc7CisJCSAgYnJlYWs7CisJCWNhc2UgQ1JCOgorCQkgIGNyID0gYnVmZmVyW2J5dGVdICYgMHg3OworCQkgIGlmIChjciA9PSAwKQorCQkgICAgZ290byBuZXh0OworCQkgIGJyZWFrOworCQljYXNlIENSVzoKKwkJICBjciA9IGJ1ZmZlcltieXRlXSAmIDB4NzsKKwkJICBpZiAoY3IgIT0gMCkKKwkJICAgIGdvdG8gbmV4dDsKKwkJICBicmVhazsKKwkJY2FzZSBESVNQMTY6CisJCSAgZGlzcCA9IChidWZmZXJbYnl0ZV0gPDwgOCkgfCAoYnVmZmVyW2J5dGUgKyAxXSk7CisJCSAgYnJlYWs7CisJCWNhc2UgRlBJTkRfRDg6CisJCWNhc2UgRElTUDg6CisJCSAgZGlzcCA9ICgoY2hhcikgKGJ1ZmZlcltieXRlXSkpOworCQkgIGJyZWFrOworCQljYXNlIFJEOgorCQljYXNlIFJESU5EOgorCQkgIHJkID0gYnVmZmVyW2J5dGVdICYgMHg3OworCQkgIGJyZWFrOworCQljYXNlIEFCUzI0OgorCQkgIGFicyA9CisJCSAgICAoYnVmZmVyW2J5dGVdIDw8IDE2KQorCQkgICAgICB8IChidWZmZXJbYnl0ZSArIDFdIDw8IDgpCisJCQl8IChidWZmZXJbYnl0ZSArIDJdKTsKKwkJICBicmVhazsKKwkJY2FzZSBBQlMxNjoKKwkJICBhYnMgPSAoYnVmZmVyW2J5dGVdIDw8IDgpIHwgKGJ1ZmZlcltieXRlICsgMV0pOworCQkgIGJyZWFrOworCQljYXNlIEFCUzg6CisJCSAgYWJzID0gKGJ1ZmZlcltieXRlXSk7CisJCSAgYnJlYWs7CisJCWNhc2UgSU1NMTY6CisJCSAgaW1tID0gKGJ1ZmZlcltieXRlXSA8PCA4KSB8IChidWZmZXJbYnl0ZSArIDFdKTsKKwkJICBicmVhazsKKwkJY2FzZSBJTU00OgorCQkgIGltbSA9IChidWZmZXJbYnl0ZV0pICYgMHhmOworCQkgIGJyZWFrOworCQljYXNlIElNTTg6CisJCWNhc2UgUkxJU1Q6CisJCSAgaW1tID0gU0VYVENIQVIgKGJ1ZmZlcltieXRlXSk7CisJCSAgYnJlYWs7CisJCWNhc2UgUENSRUwxNjoKKwkJICBwY3JlbCA9IFNFWFRTSE9SVCAoKGJ1ZmZlcltieXRlXSA8PCA4KSB8IChidWZmZXJbYnl0ZSArIDFdKSk7CisJCSAgYnJlYWs7CisJCWNhc2UgUENSRUw4OgorCQkgIHBjcmVsID0gU0VYVENIQVIgKChidWZmZXJbYnl0ZV0pKTsKKwkJICBicmVhazsKKwkJY2FzZSBRSU06CisJCSAgc3dpdGNoIChidWZmZXJbYnl0ZV0gJiAweDcpCisJCSAgICB7CisJCSAgICBjYXNlIDA6CisJCSAgICAgIGltbSA9IDE7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAxOgorCQkgICAgICBpbW0gPSAyOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgNDoKKwkJICAgICAgaW1tID0gLTE7CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSA1OgorCQkgICAgICBpbW0gPSAtMjsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCSAgYnJlYWs7CisKKwkJfQorCSAgICB9CisJfQorICAgICAgaWYgKG9wY29kZS0+Zmxhdm9yICYgT19CWVRFKQorCXsKKwkgIGlkeCA9IDA7CisJICBzd2l0Y2ggKG9wY29kZS0+ZmxhZ3MpCisJICAgIHsKKwkgICAgY2FzZSAnaCc6CisJICAgICAgZHN0LT5mbGFncyA9IGZsYWdfc2hpZnRieXRlOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdwJzoKKwkgICAgICBkc3QtPmZsYWdzID0gZmxhZ19tdWx0Ynl0ZTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnQic6CisJICAgICAgZHN0LT5mbGFncyA9IGZsYWdfYnJhbmNoOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdtJzoKKwkgICAgICBkc3QtPmZsYWdzID0gZmxhZ19tcDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnYSc6CisJICAgICAgZHN0LT5mbGFncyA9IGZsYWdfYXA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJy0nOgorCSAgICAgIGRzdC0+ZmxhZ3MgPSBmbGFnX25vbmVwOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIDA6CisJICAgICAgZHN0LT5mbGFncyA9IGZsYWdfbm9zdG9yZXA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ2MnOgorCSAgICAgIGRzdC0+ZmxhZ3MgPSBmbGFnX2NsZWFycDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAncyc6CisJICAgICAgLyogc3BlY2lhbCAqLworCSAgICAgIGRzdC0+ZmxhZ3MgPSBmbGFnX3NwZWNpYWw7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgaWR4ID0gMTsKKwkgIHN3aXRjaCAob3Bjb2RlLT5mbGFncykKKwkgICAgeworCSAgICBjYXNlICdoJzoKKwkgICAgICBkc3QtPmZsYWdzID0gZmxhZ19zaGlmdHdvcmQ7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ3AnOgorCSAgICAgIGRzdC0+ZmxhZ3MgPSBmbGFnX211bHR3b3JkOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdCJzoKKwkgICAgICBkc3QtPmZsYWdzID0gZmxhZ19icmFuY2g7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgJ20nOgorCSAgICAgIGRzdC0+ZmxhZ3MgPSBmbGFnX01wOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdhJzoKKwkgICAgICBkc3QtPmZsYWdzID0gZmxhZ19BcDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnLSc6CisJICAgICAgZHN0LT5mbGFncyA9IGZsYWdfbm9uZXA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgMDoKKwkgICAgICBkc3QtPmZsYWdzID0gZmxhZ19ub3N0b3JlcDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnYyc6CisJICAgICAgZHN0LT5mbGFncyA9IGZsYWdfY2xlYXJwOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICdzJzoKKwkgICAgICAvKiBzcGVjaWFsICovCisJICAgICAgZHN0LT5mbGFncyA9IGZsYWdfc3BlY2lhbDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgZm9yIChpID0gMDsgaSA8IG9wY29kZS0+bmFyZ3M7IGkrKykKKwl7CisJICBlYV90eXBlICpwID0gZWF2ZWN0b3IgKyBpOworCisJICBzd2l0Y2ggKG9wY29kZS0+YXJnX3R5cGVbaV0pCisJICAgIHsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhYm9ydCAoKTsKKworCSAgICBjYXNlIEZQOgorCSAgICAgIGdvdHJlZyAocCwgNiwgaWR4KTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBSTklORDoKKwkgICAgICBkaXNwID0gMDsKKwkgICAgY2FzZSBSTklORF9EMTY6CisJICAgIGNhc2UgUk5JTkRfRDg6CisJICAgICAgZ290aW5kIChwLCBkaXNwLCBybiwgaWR4KTsKKwkgICAgICBicmVhazsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBSRElORDoKKwkgICAgICBkaXNwID0gMDsKKwkgICAgY2FzZSBSRElORF9EMTY6CisJICAgIGNhc2UgUkRJTkRfRDg6CisJICAgICAgZ290aW5kIChwLCBkaXNwLCByZCwgaWR4KTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBGUElORF9EODoKKwkgICAgICBnb3RpbmQgKHAsIGRpc3AsIDYsIGlkeCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQ1JCOgorCSAgICBjYXNlIENSVzoKKwkgICAgICBnb3RjciAocCwgY3IpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJOOgorCSAgICAgIGdvdHJlZyAocCwgcm4sIGlkeCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUkQ6CisJICAgICAgZ290cmVnIChwLCByZCwgaWR4KTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBSUzoKKwkgICAgICBnb3RyZWcgKHAsIHJzLCBpZHgpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJOREVDOgorCSAgICAgIGdvdGluYyAocCwgcm4sIC0xLCBpZHgpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFJOSU5DOgorCSAgICAgIGdvdGluYyAocCwgcm4sIDEsIGlkeCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgU1BJTkM6CisJICAgICAgZ290aW5jIChwLCA3LCAxLCBpZHgpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFNQREVDOgorCSAgICAgIGdvdGluYyAocCwgNywgLTEsIGlkeCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQUJTMjQ6CisJICAgIGNhc2UgQUJTMTY6CisJICAgICAgZ290YWJzIChwLCBhYnMsIFJfSEFSRF8wLCBpZHgpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFCUzg6CisJICAgICAgZ290YWJzIChwLCBhYnMsIFJfSEFSRDhfMCwgaWR4KTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBJTU0xNjoKKwkgICAgY2FzZSBSTElTVDoKKwkgICAgY2FzZSBRSU06CisJICAgIGNhc2UgSU1NNDoKKwkgICAgY2FzZSBJTU04OgorCSAgICAgIGdvdGltbSAocCwgaW1tKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBQQ1JFTDE2OgorCSAgICBjYXNlIFBDUkVMODoKKwkgICAgICBnb3RpbW0gKHAsCisJCSAgICAgICgocGNyZWwgKyBwYyArIG9wY29kZS0+bGVuZ3RoKSAmIDB4ZmZmZikgfCAocGMgJiAweGZmMDAwMCksCisJCSAgICAgIFJfSEFSRF8wLCBKTE9ORyk7CisKKwkgICAgfQorCX0KKworICAgICAgLyogRmluaXNoZWQgYW5kIGRvbmUgLSB0dXJuIGZyb20gdHdvIG9wZXJhbmQgc3R1ZmYgaW50byB0aHJlZSAqLworCisgICAgICBkc3QtPnNyY2EudHlwZSA9IGVhcy5zLmVhX25vcC5zLnNyY2FieXRlOworICAgICAgZHN0LT5zcmNiLnR5cGUgPSBlYXMucy5lYV9ub3Aucy5zcmNiYnl0ZTsKKyAgICAgIGRzdC0+ZHN0LnR5cGUgPSBlYXMucy5lYV9ub3Aucy5kc3RieXRlOworCisgICAgICBpZiAob3Bjb2RlLT5uYXJncykKKwl7CisJICBzd2l0Y2ggKG9wY29kZS0+bmFyZ3MpCisJICAgIHsKKwkgICAgY2FzZSAxOgorCSAgICAgIGhvd3RvX3dvcmtvdXQgKCZkc3QtPnNyY2EsICZlYXZlY3RvclswXSwgMCk7CisJICAgICAgaWYgKG9wY29kZS0+ZHN0ICE9ICchJykKKwkJaG93dG9fd29ya291dCAoJmRzdC0+ZHN0LCAmZWF2ZWN0b3JbMF0sIDIpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIDI6CisJICAgICAgaWYgKG9wY29kZS0+c3JjMiA9PSAnIScpCisJCXsKKwkJICBob3d0b193b3Jrb3V0ICgmZHN0LT5zcmNhLCAmZWF2ZWN0b3JbMF0sIDApOworCQkgIGhvd3RvX3dvcmtvdXQgKCZkc3QtPmRzdCwgJmVhdmVjdG9yWzFdLCAyKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGhvd3RvX3dvcmtvdXQgKCZkc3QtPnNyY2EsICZlYXZlY3RvclswXSwgMCk7CisJCSAgaG93dG9fd29ya291dCAoJmRzdC0+c3JjYiwgJmVhdmVjdG9yWzFdLCAxKTsKKwkJICBpZiAob3Bjb2RlLT5kc3QgIT0gJyEnKQorCQkgICAgeworCQkgICAgICBob3d0b193b3Jrb3V0ICgmZHN0LT5kc3QsICZlYXZlY3RvclsxXSwgMik7CisJCSAgICB9CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgfQorCisKKworCSAgLyogU29tZSBleHRyYSBzdHVmZiB3aXRoIHByZSBpbmMgYW5kIHBvc3QgZGVjLAorCSAgICAgbWFrZSBzdXJlIHRoYXQgaWYgdGhlIHNhbWUgZWEgaXMgdGhlcmUgdHdpY2UsIG9ubHkgb25lIG9mIHRoZQorCSAgICAgb3BzIGlzIGF1dG8gaW5jL2RlYyAqLworCisJICBmaXhfaW5jZGVjcyAoZHN0KTsKKworCisJICAvKiBTb21lIHNwZWNpYWwgY2FzZXMgKi8KKwkgIGlmIChkc3QtPm9wY29kZSA9PSBleGVjX2Rpc3BhdGNoW09fUEpTUl0KKwkgICAgICB8fCBkc3QtPm9wY29kZSA9PSBleGVjX2Rpc3BhdGNoW09fUEpNUF0pCisJICAgIHsKKwkgICAgICAvKiBCb3RoIHRoZSBAYWJzOjI0IGFuZCBAcm4gdHVybiBpbnRvIGEgZGlzcCB3b3JkLAorCQkgY2hvc2UgdGhlIHJpZ2h0IGEgbW9kZSBzaW5jZSAgQGFiczoyNCBpcyA0IGJ5dGVzCisJCSBsb25nICovCisKKwkgICAgICBpZiAob3Bjb2RlLT5sZW5ndGggPT0gNCkKKwkJeworCQkgIGRzdC0+c3JjYS50eXBlID0gZWFzLnMuZWFfbHZhbDI0LnMuc3JjYWJ5dGU7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBkc3QtPnNyY2EudHlwZSA9IGVhcy5zLmVhX3JlZy5zLnNyY2Fsb25nOworCQl9CisKKwkgICAgICBkc3QtPnNyY2EucjIucnB0ciA9ICZjcHUucmVnc1tSX0hBUkRfMF07CisKKwkgICAgICAvKiBGb3IgW1BdSlNSLCBrZWVwIHJldHVybiBhZGRyZXNzIHByZWNvbXB1dGVkICovCisJICAgICAgZHN0LT5zcmNiLmxpdGVyYWwgPSBwYyArIG9wY29kZS0+bGVuZ3RoOworCSAgICAgIGRzdC0+c3JjYi50eXBlID0gZWFzLnMuZWFfaW1tLnMuc3JjYndvcmQ7CisJICAgIH0KKwkgIGVsc2UgaWYgKGRzdC0+b3Bjb2RlID09IGV4ZWNfZGlzcGF0Y2hbT19NVUxYVV0pCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGlzIGEgbXVsdGlwbHkgLWZpeCB0aGUgZGVzdGluYXRpb24gb3AgKi8KKwkgICAgICBpZiAoZHN0LT5kc3QudHlwZSA9PSBlYXMucy5lYV9yZWcucy5kc3R3b3JkKQorCQl7CisJCSAgZHN0LT5kc3QudHlwZSA9IGVhcy5zLmVhX3JlZy5zLmRzdGxvbmc7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBkc3QtPmRzdC50eXBlID0gZWFzLnMuZWFfcmVnLnMuZHN0d29yZDsKKwkJfQorCSAgICAgIGRzdC0+ZHN0LnJlZy5icHRyID0gcmVncHRyW3JkXVtKV09SRF07CisJICAgIH0KKwkgIGVsc2UgaWYgKGRzdC0+b3Bjb2RlID09IGV4ZWNfZGlzcGF0Y2hbT19ESVZYVV0pCisJICAgIHsKKwkgICAgICAvKiBUaGlzIGlzIGEgd2lkZXIgdGhhbiBub3JtYWwsIGZpeCB0aGUgc291cmNlIG9wZXJhbmQgKi8KKwkgICAgICBkc3QtPnNyY2IudHlwZQorCQk9IChkc3QtPnNyY2IudHlwZSA9PSBlYXMucy5lYV9yZWcucy5zcmNid29yZCkKKwkJICA/IGVhcy5zLmVhX3JlZy5zLnNyY2Jsb25nCisJCSAgICA6IGVhcy5zLmVhX3JlZy5zLnNyY2J3b3JkOworCisJICAgICAgZHN0LT5kc3QudHlwZQorCQk9IChkc3QtPmRzdC50eXBlID09IGVhcy5zLmVhX3JlZy5zLmRzdHdvcmQpCisJCSAgPyBlYXMucy5lYV9yZWcucy5kc3Rsb25nCisJCSAgICA6IGVhcy5zLmVhX3JlZy5zLmRzdHdvcmQ7CisKKwkgICAgfQorCisJICBlbHNlIGlmIChkc3QtPm9wY29kZSA9PSBleGVjX2Rpc3BhdGNoW09fTERNXSkKKwkgICAgeworCSAgICAgIC8qIFR1cm4gb2YgdGhlIHN0YWNrIHJlZiAqLworCSAgICAgIGRzdC0+c3JjYS50eXBlID0gZWFzLnMuZWFfbm9wLnMuc3JjYWJ5dGU7CisJICAgIH0KKwkgIGVsc2UgaWYgKGRzdC0+b3Bjb2RlID09IGV4ZWNfZGlzcGF0Y2hbT19TVE1dKQorCSAgICB7CisJICAgICAgLyogVHVybiBvZiB0aGUgc3RhY2sgcmVmICovCisJICAgICAgZHN0LT5zcmNiLnR5cGUgPSBlYXMucy5lYV9ub3Aucy5zcmNiYnl0ZTsKKwkgICAgfQorCisKKwkgIC8qIGV4dGVuZHMgcmVhZCBvbmUgc2l6ZSBhbmQgd3JpdGUgYW5vdGhlciAqLworCSAgZWxzZSBpZiAoZHN0LT5vcGNvZGUgPT0gZXhlY19kaXNwYXRjaFtPX0VYVFNdCisJCSAgIHx8IGRzdC0+b3Bjb2RlID09IGV4ZWNfZGlzcGF0Y2hbT19FWFRVXSkKKwkgICAgeworCSAgICAgIGRzdC0+ZHN0LnR5cGUgPSBlYXMucy5lYV9yZWcucy5kc3R3b3JkOworCSAgICAgIGRzdC0+ZHN0LnJlZy5icHRyID0gcmVncHRyW3JkXVtKV09SRF07CisJICAgICAgZHN0LT5mbGFncyA9IGZsYWdfQXA7CisJICAgIH0KKworCisJICBpZiAob3Bjb2RlLT5mbGFncyA9PSAnaCcpCisJICAgIHRoaW5rYWJvdXRfc2hpZnRzIChkc3QsIG9wY29kZS0+Zmxhdm9yICYgT19CWVRFKTsKKworCisJICAvKiBGb3IgYSBicmFuY2gsIHR1cm4gb2ZmIG9uZSBsZXZlbCBvZiBpbmRpcmVjdGlvbiAqLworCSAgaWYgKG9wY29kZS0+c3JjMSA9PSAnQicpCisJICAgIHsKKwkgICAgICBpbmRvZmYgKCZkc3QtPnNyY2EsIDApOworCSAgICB9CisKKwl9CisgICAgICBkc3QtPm5leHRfcGMgPSBwYyArIG9wY29kZS0+bGVuZ3RoOworCisgICAgICBjb21wY3ljbGVzIChkc3QsIG9wY29kZSk7CisKKyAgICAgIHJldHVybjsKKworCisgICAgbmV4dDo7CisgICAgfQorCisgIC8qIENvdWxkbid0IHVuZGVyc3RhbmQgYW55dGhpbmcgKi8KKyAgZHN0LT5vcGNvZGUgPSBleGVjX2Rpc3BhdGNoW09fVFJBUEFdOworICBkc3QtPm5leHRfcGMgPSBwYyArIDE7CisKK30KKworY29tcGlsZSAocGMpCit7CisgIGludCBpZHg7CisKKyAgLyogZmluZCB0aGUgbmV4dCBjYWNoZSBlbnRyeSB0byB1c2UgKi8KKworICBpZHggPSBjcHUuY2FjaGVfdG9wICsgMTsKKyAgY3B1LmNvbXBpbGVzKys7CisgIGlmIChpZHggPj0gY3B1LmNzaXplKQorICAgIHsKKyAgICAgIGlkeCA9IDE7CisgICAgfQorICBjcHUuY2FjaGVfdG9wID0gaWR4OworCisgIC8qIFRocm93IGF3YXkgaXRzIG9sZCBtZWFuaW5nICovCisgIGNwdS5jYWNoZV9pZHhbY3B1LmNhY2hlW2lkeF0ub2xkcGNdID0gMDsKKworICAvKiBzZXQgdG8gbmV3IGFkZHJlc3MgKi8KKyAgY3B1LmNhY2hlW2lkeF0ub2xkcGMgPSBwYzsKKworICAvKiBmaWxsIGluIGluc3RydWN0aW9uIGluZm8gKi8KKyAgZmluZCAocGMsIGNwdS5tZW1vcnkgKyBwYywgY3B1LmNhY2hlICsgaWR4KTsKKworICAvKiBwb2ludCB0byBuZXcgY2FjaGUgZW50cnkgKi8KKyAgY3B1LmNhY2hlX2lkeFtwY10gPSBpZHg7Cit9CisKK2JhZGRlZmF1bHQgKHgpCit7CisgIHByaW50ZiAoImJhZCBkZWZhdWx0ICVkXG4iLCB4KTsKK30KKworc3RhdGljIGludCBmZXRjaF9sIChhcmcpCisgICAgIGVhX3R5cGUgKmFyZzsKK3sKKyAgaW50IGwsIHI7CisKKyAgaW50IGggPSAqKGFyZy0+cmVnLndwdHIpOworICByID0gKHVuaW9uIHJ0eXBlICopIChhcmctPnJlZy53cHRyKSAtICZjcHUucmVnc1swXTsKKyAgcisrOworCisgIGwgPSBjcHUucmVnc1tyXS5zW0xPV107CisgIHJldHVybiAoaCA8PCAxNikgfCBsOworCit9CisKKyNkZWZpbmUgRkVUQ0goZHN0LCBhcmcsIG4pICBcCit7IFwKKyBpbnQgcjsgdW5zaWduZWQgY2hhcipsdmFsOyBcCisgRElTUEFUQ0goKGFyZykudHlwZSkgXAorIHsgTEFCRUxOKEZFVENIX05PUCxuKTogXAorIGRzdD0gMDsgXAorIGJyZWFrOyBcCisgREVGQVVMVCBiYWRkZWZhdWx0KChhcmcpLnR5cGUpOyBicmVhazsgXAorIExBQkVMTihGRVRDSF9MVkFMLG4pOiAgXAorIGRzdCA9ICgqKCgoYXJnKS5yZWcud3B0cikpICsgKGFyZy5saXRlcmFsKSkgOyBcCisgYnJlYWs7IFwKKyBMQUJFTE4oRkVUQ0hfTFZBTDI0LG4pOiAgXAorIGRzdCA9ICgqKCgoYXJnKS5yZWcud3B0cikpICsgKigoKGFyZykucjIud3B0cikpICsgKGFyZy5saXRlcmFsKSkgJjB4ZmZmZmZmOyBcCisgYnJlYWs7IFwKKyBMQUJFTE4oRkVUQ0hfQ1JCLG4pOiAgXAorIGRzdCA9ICgqKChhcmcpLnJlZy5zZWdwdHIpIC0gY3B1Lm1lbW9yeSk+PjE2OyBcCisgYnJlYWs7IFwKKyBMQUJFTE4oRkVUQ0hfQ1JXLG4pOiAgXAorICBkc3QgPSBCVUlMRFNSKCk7XAorIGJyZWFrOyBcCisgTEFCRUxOKEZFVENIX1JFR19CLG4pOiBcCisgZHN0ID0gKigoYXJnKS5yZWcuYnB0cik7IFwKKyBicmVhazsgXAorIExBQkVMTihGRVRDSF9SRUdfVyxuKTogXAorIGRzdCA9ICooKGFyZykucmVnLndwdHIpOyBcCisgYnJlYWs7IFwKKyBMQUJFTE4oRkVUQ0hfUkVHX0wsbik6IFwKKyBkc3QgPSBmZXRjaF9sKCYoYXJnKSk7XAorIGJyZWFrOyBcCisgTEFCRUxOKEZFVENIX0lOQ19CLG4pOiBcCisgbHZhbCA9IGVsdmFsICgoYXJnKSwgMCk7IFwKKyBkc3QgPSBieXRlYXQgKGx2YWwpOyBcCisgKCooKGFyZykucmVnLndwdHIpKSsrOyBcCisgYnJlYWs7IFwKKyBMQUJFTE4oRkVUQ0hfSU5DX1csbik6IFwKKyBsdmFsID0gZWx2YWwgKChhcmcpLCAwKTsgXAorIGRzdCA9IHdvcmRhdCAobHZhbCk7IFwKKyAoKigoKGFyZykucmVnLndwdHIpKSkgKz0gMjsgXAorIGJyZWFrOyBcCisgTEFCRUxOKEZFVENIX0RFQ19CLCBuKTogXAorICgqKGFyZykucmVnLndwdHIpLS07IFwKKyBsdmFsID0gZWx2YWwgKChhcmcpLCAwKTsgXAorIHIgPSBieXRlYXQgKGx2YWwpOyBcCisgZHN0ID0gcjsgXAorIGJyZWFrOyBcCisgTEFCRUxOKEZFVENIX0RFQ19XLCBuKTogXAorICgqKChhcmcpLnJlZy53cHRyKSkgLT0gMjsgXAorIGx2YWwgPSBlbHZhbCAoKGFyZyksIDApOyBcCisgciA9IHdvcmRhdCAobHZhbCk7IFwKKyBkc3QgPSByOyBcCisgYnJlYWs7IFwKKyBMQUJFTE4oRkVUQ0hfRElTUF9CLG4pOiBcCisgbHZhbCA9IGRpc3BsdmFsICgoYXJnKSk7IFwKKyBkc3QgPSBieXRlYXQgKGx2YWwpOyBcCisgYnJlYWs7IFwKKyBMQUJFTE4oRkVUQ0hfRElTUF9XLG4pOiBcCisgbHZhbCA9IGRpc3BsdmFsICgoYXJnKSk7IFwKKyBkc3QgPSB3b3JkYXQgKGx2YWwpOyBcCisgYnJlYWs7IFwKKyBMQUJFTE4oRkVUQ0hfSU1NLCBuKTogXAorIGRzdCA9IChhcmcpLmxpdGVyYWw7IFwKKyBicmVhazsgXAorIH0gXAorIEVORERJU1BBVENIOyBcCit9CisKK3N0YXRpYyB1bmlvbgoreworICBzaG9ydCBpbnQgaTsKKyAgc3RydWN0CisgICAgeworICAgICAgY2hhciBsb3c7CisgICAgICBjaGFyIGhpZ2g7CisgICAgfQorICB1OworfQorCitsaXR0bGVlbmRpYW47CisKK3N0YXRpYwordm9pZAoraW5pdF9wb2ludGVycyAoKQoreworICBzdGF0aWMgaW50IGluaXQ7CisKKyAgaWYgKCFpbml0KQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBpbml0ID0gMTsKKyAgICAgIGxpdHRsZWVuZGlhbi5pID0gMTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpIFJfTEFTVDsgaSsrKQorCXsKKwkgIGlmIChsaXR0bGVlbmRpYW4udS5oaWdoKQorCSAgICB7CisJICAgICAgLyogYmlnIGVuZGlhbiBob3N0ICovCisKKworCSAgICAgIExPVyA9IDE7CisJICAgICAgSElHSCA9IDA7CisKKwkgICAgICByZWdwdHJbaV1bMF0gPSAoKHVuc2lnbmVkIGNoYXIgKikgKGNwdS5yZWdzICsgaSkpICsgMzsKKwkgICAgICByZWdwdHJbaV1bMV0gPSAoKHVuc2lnbmVkIGNoYXIgKikgKGNwdS5yZWdzICsgaSkpICsgMjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgTE9XID0gMDsKKwkgICAgICBISUdIID0gMTsKKworCSAgICAgIHJlZ3B0cltpXVswXSA9ICh1bnNpZ25lZCBjaGFyICopICYoY3B1LnJlZ3NbaV0pOworCSAgICAgIHJlZ3B0cltpXVsxXSA9ICh1bnNpZ25lZCBjaGFyICopICgmKGNwdS5yZWdzW2ldKSk7CisJICAgIH0KKworCSAgcmVncHRyW2ldWzJdID0gKHVuc2lnbmVkIGNoYXIgKikgJihjcHUucmVnc1tpXSk7CisJfQorCisgICAgICBtZW1jcHkgKHNlZ3JlZ3B0ciArIDAsIHJlZ3B0ciArIFJfU1IsIHNpemVvZiAoc2VncmVncHRyWzBdKSk7CisgICAgICBtZW1jcHkgKHNlZ3JlZ3B0ciArIDEsIHJlZ3B0ciArIFJfVFAsIHNpemVvZiAoc2VncmVncHRyWzFdKSk7CisgICAgICBtZW1jcHkgKHNlZ3JlZ3B0ciArIDMsIHJlZ3B0ciArIFJfQlIsIHNpemVvZiAoc2VncmVncHRyWzNdKSk7CisgICAgICBtZW1jcHkgKHNlZ3JlZ3B0ciArIDQsIHJlZ3B0ciArIFJfRVAsIHNpemVvZiAoc2VncmVncHRyWzRdKSk7CisgICAgICBtZW1jcHkgKHNlZ3JlZ3B0ciArIDUsIHJlZ3B0ciArIFJfRFAsIHNpemVvZiAoc2VncmVncHRyWzVdKSk7CisgICAgICBtZW1jcHkgKHNlZ3JlZ3B0ciArIDYsIHJlZ3B0ciArIFJfQ1AsIHNpemVvZiAoc2VncmVncHRyWzZdKSk7CisgICAgICBtZW1jcHkgKHNlZ3JlZ3B0ciArIDcsIHJlZ3B0ciArIFJfVFAsIHNpemVvZiAoc2VncmVncHRyWzddKSk7CisKKyAgICAgIC8qIFBvaW50ZXJzIHRvIGludG8gdGhlIGNwdSBzdGF0ZSBmb3IgdGhlIHNlZyByZWdpc3RlcnMgKi8KKworICAgICAgc2VnbWFwW1IwXSA9ICZjcHUucmVnc1tSX0RQXS5jOworICAgICAgc2VnbWFwW1IxXSA9ICZjcHUucmVnc1tSX0RQXS5jOworICAgICAgc2VnbWFwW1IyXSA9ICZjcHUucmVnc1tSX0RQXS5jOworICAgICAgc2VnbWFwW1IzXSA9ICZjcHUucmVnc1tSX0RQXS5jOworICAgICAgc2VnbWFwW1I0XSA9ICZjcHUucmVnc1tSX0VQXS5jOworICAgICAgc2VnbWFwW1I1XSA9ICZjcHUucmVnc1tSX0VQXS5jOworICAgICAgc2VnbWFwW1I2XSA9ICZjcHUucmVnc1tSX1RQXS5jOworICAgICAgc2VnbWFwW1I3XSA9ICZjcHUucmVnc1tSX1RQXS5jOworICAgICAgc2VnbWFwW1JfSEFSRF8wXSA9ICZjcHUucmVnc1tSX0RQXS5jOworICAgICAgc2VnbWFwW1JfSEFSRDhfMF0gPSAmY3B1LnJlZ3NbUl9CUF0uYzsKKworICAgICAgY3B1Lm1lbW9yeSA9ICh1bnNpZ25lZCBjaGFyICopIGNhbGxvYyAoc2l6ZW9mIChjaGFyKSwgSDg1MDBfTVNJWkUpOworICAgICAgY3B1LmNhY2hlX2lkeCA9ICh1bnNpZ25lZCBzaG9ydCAqKSBjYWxsb2MgKHNpemVvZiAoc2hvcnQpLCBIODUwMF9NU0laRSk7CisKKyAgICAgIC8qIGluaXRpYWxpemUgdGhlIHNlZyByZWdpc3RlcnMgKi8KKworICAgICAgY3B1LnJlZ3NbUl9EUF0uYyA9IGNwdS5tZW1vcnk7CisgICAgICBjcHUucmVnc1tSX1RQXS5jID0gY3B1Lm1lbW9yeTsKKyAgICAgIGNwdS5yZWdzW1JfQ1BdLmMgPSBjcHUubWVtb3J5OworICAgICAgY3B1LnJlZ3NbUl9CUF0uYyA9IGNwdS5tZW1vcnk7CisgICAgICBjcHUucmVnc1tSX0VQXS5jID0gY3B1Lm1lbW9yeTsKKyAgICAgIGNwdS5yZWdzW1I3XS5zW0xPV10gPSAweGZmZmU7CisgICAgICBjcHUucmVnc1tSNl0uc1tMT1ddID0gMHhmZmZlOworICAgICAgaWYgKCFjcHUuY2FjaGUpCisJc2ltX3NldF9zaW1jYWNoZV9zaXplIChDU0laRSk7CisgICAgfQorfQorCisjZGVmaW5lIFBVU0hXT1JEKHgpCQkJCVwKK3sJCQkJCQlcCisgIGludCBzcCA9IGNwdS5yZWdzW1I3XS5zW0xPV107CQkJXAorICB1bnNpZ25lZCBjaGFyICpwOwkJCQlcCisJCQkJCQlcCisgIHNwIC09IDI7CQkJCQlcCisgIHAgPSAoc3AgJiAweGZmZmYpICsgKGNwdS5yZWdzW1JfVFBdLmMpOwlcCisgIGNwdS5yZWdzW1I3XS5zW0xPV10gPSBzcDsJCQlcCisgIHNldHdvcmRhdCAocCwgeCk7CQkJCVwKK30JCQkJCQlcCisKKyNkZWZpbmUgUE9QV09SRChkKQkJCQlcCit7CQkJCQkJXAorICBpbnQgc3B4PSBjcHUucmVnc1tSN10uc1tMT1ddOwkJCVwKKyAgdW5zaWduZWQgY2hhciAqcDsJCQkJXAorCSAgICAgICAgCQkJCVwKKyAgcCA9IChzcHgmIDB4ZmZmZikgKyAoY3B1LnJlZ3NbUl9UUF0uYyk7CVwKKyAgc3B4Kz0gMjsJCQkJCVwKKyAgY3B1LnJlZ3NbUjddLnNbTE9XXSA9IHNweDsgICAgICAgICAgICAgICAgICAgIFwKKyAgZCA9IHdvcmRhdCAocCk7CQkJCVwKK30JCQkJCQlcCisKKy8qIHNpbXVsYXRlIGEgbW9uaXRvciB0cmFwICovCit0cmFwICgpCit7CisgIHN3aXRjaCAoY3B1LnJlZ3NbUjNdLnNbTE9XXSAmIDB4ZmYpCisgICAgeworICAgIGNhc2UgMzM6CisgICAgICAvKiBleGl0ICovCisgICAgICBjcHUuZXhjZXB0aW9uID0gU0lHUVVJVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzQ6CisgICAgICAvKiBhYm9ydCAqLworICAgICAgY3B1LmV4Y2VwdGlvbiA9IFNJR0FCUlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICAvKiBwcmludCBjaGFyIGluIHIwICovCisgICAgICBwcmludGYgKCIlYyIsIGNwdS5yZWdzW1IwXS5zW0xPV10pOworICAgICAgYnJlYWs7CisgICAgfQorfQordm9pZAorY29udHJvbF9jIChzaWcsIGNvZGUsIHNjcCwgYWRkcikKKyAgICAgaW50IHNpZzsKKyAgICAgaW50IGNvZGU7CisgICAgIGNoYXIgKnNjcDsKKyAgICAgY2hhciAqYWRkcjsKK3sKKyAgY3B1LmV4Y2VwdGlvbiA9IFNJR0lOVDsKK30KKworc3RhdGljIGptcF9idWYgamJ1ZjsKK3N0YXRpYyB2b2lkCitzZWd2ICgpCit7CisgIGNwdS5leGNlcHRpb24gPSBTSUdTRUdWOworICBsb25nam1wIChqYnVmLCAxKTsKK30KKworaW50CitzaW1fc3RvcCAoc2QpCisgICAgIFNJTV9ERVNDIHNkOworeworICBjcHUuZXhjZXB0aW9uID0gU0lHSU5UOworICByZXR1cm4gMTsKK30KKwordm9pZAorc2ltX3Jlc3VtZSAoc2QsIHN0ZXAsIHNpZ2duYWwpCisgICAgIFNJTV9ERVNDIHNkOworeworICBzdGF0aWMgaW50IGluaXQxOworICBpbnQgcmVzOworICBpbnQgdG1wOworICBpbnQgYXJnYTsKKyAgaW50IGFyZ2I7CisgIGludCBiaXQ7CisgIGludCBwYzsKKyAgaW50IEMsIFosIFYsIE47CisgIGludCBjeWNsZXMgPSAwOworICBpbnQgaW5zdHMgPSAwOworICBpbnQgdGlja19zdGFydCA9IGdldF9ub3cgKCk7CisgIHZvaWQgKCpwcmV2KSAoKTsKKyAgdm9pZCAoKnByZXZfc2VnKSAoKTsKKworICBpZiAoIWluaXQxKQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBpbml0MSA9IDE7CisgICAgICBpbml0X3BvaW50ZXJzICgpOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgTl9FQVRZUEVTOyBpKyspCisJeworCSAgZWFzLmFbaV0ucy5zcmNhYnl0ZSA9IExBQkVMX1JFRk4gKEZFVENIX05PUCwgMCk7CisJICBlYXMuYVtpXS5zLnNyY2F3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfTk9QLCAwKTsKKwkgIGVhcy5hW2ldLnMuc3JjYWxvbmcgPSBMQUJFTF9SRUZOIChGRVRDSF9OT1AsIDApOworCisJICBlYXMuYVtpXS5zLnNyY2JieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfTk9QLCAxKTsKKwkgIGVhcy5hW2ldLnMuc3JjYndvcmQgPSBMQUJFTF9SRUZOIChGRVRDSF9OT1AsIDEpOworCSAgZWFzLmFbaV0ucy5zcmNibG9uZyA9IExBQkVMX1JFRk4gKEZFVENIX05PUCwgMSk7CisKKwkgIGVhcy5hW2ldLnMuZHN0Ynl0ZSA9IExBQkVMX1JFRiAoU1RPUkVfTk9QKTsKKwkgIGVhcy5hW2ldLnMuZHN0d29yZCA9IExBQkVMX1JFRiAoU1RPUkVfTk9QKTsKKwkgIGVhcy5hW2ldLnMuZHN0bG9uZyA9IExBQkVMX1JFRiAoU1RPUkVfTk9QKTsKKwl9CisKKyAgICAgIGVhcy5zLmVhX2x2YWwucy5zcmNhYnl0ZSA9IExBQkVMX1JFRk4gKEZFVENIX0xWQUwsIDApOworICAgICAgZWFzLnMuZWFfbHZhbC5zLnNyY2F3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfTFZBTCwgMCk7CisgICAgICBlYXMucy5lYV9sdmFsMjQucy5zcmNhYnl0ZSA9IExBQkVMX1JFRk4gKEZFVENIX0xWQUwyNCwgMCk7CisgICAgICBlYXMucy5lYV9sdmFsMjQucy5zcmNhd29yZCA9IExBQkVMX1JFRk4gKEZFVENIX0xWQUwyNCwgMCk7CisKKyAgICAgIGVhcy5zLmVhX25vcC5zLnNyY2FieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfTk9QLCAwKTsKKyAgICAgIGVhcy5zLmVhX25vcC5zLnNyY2F3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfTk9QLCAwKTsKKyAgICAgIGVhcy5zLmVhX25vcC5zLnNyY2JieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfTk9QLCAxKTsKKyAgICAgIGVhcy5zLmVhX25vcC5zLnNyY2J3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfTk9QLCAxKTsKKyAgICAgIGVhcy5zLmVhX25vcC5zLmRzdGJ5dGUgPSBMQUJFTF9SRUYgKFNUT1JFX05PUCk7CisgICAgICBlYXMucy5lYV9ub3Aucy5kc3R3b3JkID0gTEFCRUxfUkVGIChTVE9SRV9OT1ApOworCisgICAgICBlYXMucy5lYV9jci5zLnNyY2FieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfQ1JCLCAwKTsKKyAgICAgIGVhcy5zLmVhX2NyLnMuc3JjYXdvcmQgPSBMQUJFTF9SRUZOIChGRVRDSF9DUlcsIDApOworCisgICAgICBlYXMucy5lYV9jci5zLnNyY2JieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfQ1JCLCAxKTsKKyAgICAgIGVhcy5zLmVhX2NyLnMuc3JjYndvcmQgPSBMQUJFTF9SRUZOIChGRVRDSF9DUlcsIDEpOworCisgICAgICBlYXMucy5lYV9jci5zLmRzdGJ5dGUgPSBMQUJFTF9SRUYgKFNUT1JFX0NSQik7CisgICAgICBlYXMucy5lYV9jci5zLmRzdHdvcmQgPSBMQUJFTF9SRUYgKFNUT1JFX0NSVyk7CisKKyAgICAgIGVhcy5zLmVhX3JlZy5zLnNyY2FieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfUkVHX0IsIDApOworICAgICAgZWFzLnMuZWFfcmVnLnMuc3JjYXdvcmQgPSBMQUJFTF9SRUZOIChGRVRDSF9SRUdfVywgMCk7CisgICAgICBlYXMucy5lYV9yZWcucy5zcmNhbG9uZyA9IExBQkVMX1JFRk4gKEZFVENIX1JFR19MLCAwKTsKKworICAgICAgZWFzLnMuZWFfcmVnLnMuc3JjYmJ5dGUgPSBMQUJFTF9SRUZOIChGRVRDSF9SRUdfQiwgMSk7CisgICAgICBlYXMucy5lYV9yZWcucy5zcmNid29yZCA9IExBQkVMX1JFRk4gKEZFVENIX1JFR19XLCAxKTsKKyAgICAgIGVhcy5zLmVhX3JlZy5zLnNyY2Jsb25nID0gTEFCRUxfUkVGTiAoRkVUQ0hfUkVHX0wsIDEpOworCisgICAgICBlYXMucy5lYV9yZWcucy5kc3RieXRlID0gTEFCRUxfUkVGIChTVE9SRV9SRUdfQik7CisgICAgICBlYXMucy5lYV9yZWcucy5kc3R3b3JkID0gTEFCRUxfUkVGIChTVE9SRV9SRUdfVyk7CisgICAgICBlYXMucy5lYV9yZWcucy5kc3Rsb25nID0gTEFCRUxfUkVGIChTVE9SRV9SRUdfTCk7CisKKyAgICAgIGVhcy5zLmVhX2luYy5zLnNyY2FieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfSU5DX0IsIDApOworICAgICAgZWFzLnMuZWFfaW5jLnMuc3JjYXdvcmQgPSBMQUJFTF9SRUZOIChGRVRDSF9JTkNfVywgMCk7CisgICAgICBlYXMucy5lYV9pbmMucy5zcmNiYnl0ZSA9IExBQkVMX1JFRk4gKEZFVENIX0lOQ19CLCAxKTsKKyAgICAgIGVhcy5zLmVhX2luYy5zLnNyY2J3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfSU5DX1csIDEpOworICAgICAgZWFzLnMuZWFfaW5jLnMuZHN0Ynl0ZSA9IExBQkVMX1JFRiAoU1RPUkVfSU5DX0IpOworICAgICAgZWFzLnMuZWFfaW5jLnMuZHN0d29yZCA9IExBQkVMX1JFRiAoU1RPUkVfSU5DX1cpOworCisgICAgICBlYXMucy5lYV9kZWMucy5zcmNhYnl0ZSA9IExBQkVMX1JFRk4gKEZFVENIX0RFQ19CLCAwKTsKKyAgICAgIGVhcy5zLmVhX2RlYy5zLnNyY2F3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfREVDX1csIDApOworICAgICAgZWFzLnMuZWFfZGVjLnMuc3JjYmJ5dGUgPSBMQUJFTF9SRUZOIChGRVRDSF9ERUNfQiwgMSk7CisgICAgICBlYXMucy5lYV9kZWMucy5zcmNid29yZCA9IExBQkVMX1JFRk4gKEZFVENIX0RFQ19XLCAxKTsKKyAgICAgIGVhcy5zLmVhX2RlYy5zLmRzdGJ5dGUgPSBMQUJFTF9SRUYgKFNUT1JFX0RFQ19CKTsKKyAgICAgIGVhcy5zLmVhX2RlYy5zLmRzdHdvcmQgPSBMQUJFTF9SRUYgKFNUT1JFX0RFQ19XKTsKKworICAgICAgZWFzLnMuZWFfZGlzcC5zLnNyY2FieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfRElTUF9CLCAwKTsKKyAgICAgIGVhcy5zLmVhX2Rpc3Aucy5zcmNhd29yZCA9IExBQkVMX1JFRk4gKEZFVENIX0RJU1BfVywgMCk7CisgICAgICBlYXMucy5lYV9kaXNwLnMuc3JjYmJ5dGUgPSBMQUJFTF9SRUZOIChGRVRDSF9ESVNQX0IsIDEpOworICAgICAgZWFzLnMuZWFfZGlzcC5zLnNyY2J3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfRElTUF9XLCAxKTsKKyAgICAgIGVhcy5zLmVhX2Rpc3Aucy5kc3RieXRlID0gTEFCRUxfUkVGIChTVE9SRV9ESVNQX0IpOworICAgICAgZWFzLnMuZWFfZGlzcC5zLmRzdHdvcmQgPSBMQUJFTF9SRUYgKFNUT1JFX0RJU1BfVyk7CisKKyAgICAgIGVhcy5zLmVhX2ltbS5zLnNyY2FieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfSU1NLCAwKTsKKyAgICAgIGVhcy5zLmVhX2ltbS5zLnNyY2F3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfSU1NLCAwKTsKKyAgICAgIGVhcy5zLmVhX2ltbS5zLnNyY2JieXRlID0gTEFCRUxfUkVGTiAoRkVUQ0hfSU1NLCAxKTsKKyAgICAgIGVhcy5zLmVhX2ltbS5zLnNyY2J3b3JkID0gTEFCRUxfUkVGTiAoRkVUQ0hfSU1NLCAxKTsKKworICAgICAgZmxhZ19zcGVjaWFsID0gTEFCRUxfUkVGIChGTEFHX3NwZWNpYWwpOworICAgICAgZmxhZ19tcCA9IExBQkVMX1JFRiAoRkxBR19tKTsKKyAgICAgIGZsYWdfTXAgPSBMQUJFTF9SRUYgKEZMQUdfTSk7CisgICAgICBmbGFnX2FwID0gTEFCRUxfUkVGIChGTEFHX2EpOworICAgICAgZmxhZ19BcCA9IExBQkVMX1JFRiAoRkxBR19BKTsKKyAgICAgIGZsYWdfbm9uZXAgPSBMQUJFTF9SRUYgKEZMQUdfTk9ORSk7CisgICAgICBmbGFnX25vc3RvcmVwID0gTEFCRUxfUkVGIChGTEFHX05PU1RPUkUpOworICAgICAgZmxhZ19jbGVhcnAgPSBMQUJFTF9SRUYgKEZMQUdfQ0xFQVIpOworICAgICAgZmxhZ19zaGlmdGJ5dGUgPSBMQUJFTF9SRUYgKEZMQUdfc2hpZnRieXRlKTsKKyAgICAgIGZsYWdfc2hpZnR3b3JkID0gTEFCRUxfUkVGIChGTEFHX3NoaWZ0d29yZCk7CisgICAgICBmbGFnX211bHRieXRlID0gTEFCRUxfUkVGIChGTEFHX211bHRieXRlKTsKKyAgICAgIGZsYWdfbXVsdHdvcmQgPSBMQUJFTF9SRUYgKEZMQUdfbXVsdHdvcmQpOworCisKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19BRERTXSA9IExBQkVMX1JFRiAoT19BRERTKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19BRERYXSA9IExBQkVMX1JFRiAoT19BRERYKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19BRERdID0gTEFCRUxfUkVGIChPX0FERCk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fQU5EQ10gPSBMQUJFTF9SRUYgKE9fQU5EQyk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fQU5EXSA9IExBQkVMX1JFRiAoT19BTkQpOworICAgICAgZXhlY19kaXNwYXRjaFtPX0JDQ10gPSBMQUJFTF9SRUYgKE9fQkNDKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CQ0xSXSA9IExBQkVMX1JFRiAoT19CQ0xSKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CQ1NdID0gTEFCRUxfUkVGIChPX0JDUyk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fQkVRXSA9IExBQkVMX1JFRiAoT19CRVEpOworICAgICAgZXhlY19kaXNwYXRjaFtPX0JGXSA9IExBQkVMX1JFRiAoT19CRik7CisgICAgICBleGVjX2Rpc3BhdGNoW09fQkdFXSA9IExBQkVMX1JFRiAoT19CR0UpOworICAgICAgZXhlY19kaXNwYXRjaFtPX0JHVF0gPSBMQUJFTF9SRUYgKE9fQkdUKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CSEldID0gTEFCRUxfUkVGIChPX0JISSk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fQkhTXSA9IExBQkVMX1JFRiAoT19CSFMpOworICAgICAgZXhlY19kaXNwYXRjaFtPX0JMRV0gPSBMQUJFTF9SRUYgKE9fQkxFKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CTE9dID0gTEFCRUxfUkVGIChPX0JMTyk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fQkxTXSA9IExBQkVMX1JFRiAoT19CTFMpOworICAgICAgZXhlY19kaXNwYXRjaFtPX0JMVF0gPSBMQUJFTF9SRUYgKE9fQkxUKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CTUldID0gTEFCRUxfUkVGIChPX0JNSSk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fQk5FXSA9IExBQkVMX1JFRiAoT19CTkUpOworICAgICAgZXhlY19kaXNwYXRjaFtPX0JOT1RdID0gTEFCRUxfUkVGIChPX0JOT1QpOworICAgICAgZXhlY19kaXNwYXRjaFtPX0JQTF0gPSBMQUJFTF9SRUYgKE9fQlBMKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CUFRdID0gTEFCRUxfUkVGIChPX0JQVCk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fQlJBXSA9IExBQkVMX1JFRiAoT19CUkEpOworICAgICAgZXhlY19kaXNwYXRjaFtPX0JSTl0gPSBMQUJFTF9SRUYgKE9fQlJOKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CU0VUXSA9IExBQkVMX1JFRiAoT19CU0VUKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CU1JdID0gTEFCRUxfUkVGIChPX0JTUik7CisgICAgICBleGVjX2Rpc3BhdGNoW09fQlRTVF0gPSBMQUJFTF9SRUYgKE9fQlRTVCk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fQlRdID0gTEFCRUxfUkVGIChPX0JUKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19CVkNdID0gTEFCRUxfUkVGIChPX0JWQyk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fQlZTXSA9IExBQkVMX1JFRiAoT19CVlMpOworICAgICAgZXhlY19kaXNwYXRjaFtPX0NMUl0gPSBMQUJFTF9SRUYgKE9fQ0xSKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19DTVBdID0gTEFCRUxfUkVGIChPX0NNUCk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fREFERF0gPSBMQUJFTF9SRUYgKE9fREFERCk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fRElWWFVdID0gTEFCRUxfUkVGIChPX0RJVlhVKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19EU1VCXSA9IExBQkVMX1JFRiAoT19EU1VCKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19FWFRTXSA9IExBQkVMX1JFRiAoT19FWFRTKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19FWFRVXSA9IExBQkVMX1JFRiAoT19FWFRVKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19KTVBdID0gTEFCRUxfUkVGIChPX0pNUCk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fSlNSXSA9IExBQkVMX1JFRiAoT19KU1IpOworICAgICAgZXhlY19kaXNwYXRjaFtPX0xEQ10gPSBMQUJFTF9SRUYgKE9fTERDKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19MRE1dID0gTEFCRUxfUkVGIChPX0xETSk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fTElOS10gPSBMQUJFTF9SRUYgKE9fTElOSyk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fTU9WRlBFXSA9IExBQkVMX1JFRiAoT19NT1ZGUEUpOworICAgICAgZXhlY19kaXNwYXRjaFtPX01PVlRQRV0gPSBMQUJFTF9SRUYgKE9fTU9WVFBFKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19NT1ZdID0gTEFCRUxfUkVGIChPX01PVik7CisgICAgICBleGVjX2Rpc3BhdGNoW09fTVVMWFVdID0gTEFCRUxfUkVGIChPX01VTFhVKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19ORUddID0gTEFCRUxfUkVGIChPX05FRyk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fTk9QXSA9IExBQkVMX1JFRiAoT19OT1ApOworICAgICAgZXhlY19kaXNwYXRjaFtPX05PVF0gPSBMQUJFTF9SRUYgKE9fTk9UKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19PUkNdID0gTEFCRUxfUkVGIChPX09SQyk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fT1JdID0gTEFCRUxfUkVGIChPX09SKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19QSk1QXSA9IExBQkVMX1JFRiAoT19QSk1QKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19QSlNSXSA9IExBQkVMX1JFRiAoT19QSlNSKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19QUlREXSA9IExBQkVMX1JFRiAoT19QUlREKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19QUlRTXSA9IExBQkVMX1JFRiAoT19QUlRTKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19SRUNPTVBJTEVdID0gTEFCRUxfUkVGIChPX1JFQ09NUElMRSk7CisKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19ST1RMXSA9IExBQkVMX1JFRiAoT19ST1RMKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19ST1RSXSA9IExBQkVMX1JFRiAoT19ST1RSKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19ST1RYTF0gPSBMQUJFTF9SRUYgKE9fUk9UWEwpOworICAgICAgZXhlY19kaXNwYXRjaFtPX1JPVFhSXSA9IExBQkVMX1JFRiAoT19ST1RYUik7CisKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19SVERdID0gTEFCRUxfUkVGIChPX1JURCk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fUlRTXSA9IExBQkVMX1JFRiAoT19SVFMpOworICAgICAgZXhlY19kaXNwYXRjaFtPX1NDQl9FUV0gPSBMQUJFTF9SRUYgKE9fU0NCX0VRKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19TQ0JfRl0gPSBMQUJFTF9SRUYgKE9fU0NCX0YpOworICAgICAgZXhlY19kaXNwYXRjaFtPX1NDQl9ORV0gPSBMQUJFTF9SRUYgKE9fU0NCX05FKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19TSEFMXSA9IExBQkVMX1JFRiAoT19TSEFMKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19TSEFSXSA9IExBQkVMX1JFRiAoT19TSEFSKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19TSExMXSA9IExBQkVMX1JFRiAoT19TSExMKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19TSExSXSA9IExBQkVMX1JFRiAoT19TSExSKTsKKworICAgICAgZXhlY19kaXNwYXRjaFtPX1NMRUVQXSA9IExBQkVMX1JFRiAoT19TTEVFUCk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fU1RDXSA9IExBQkVMX1JFRiAoT19TVEMpOworICAgICAgZXhlY19kaXNwYXRjaFtPX1NUTV0gPSBMQUJFTF9SRUYgKE9fU1RNKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19TVUJTXSA9IExBQkVMX1JFRiAoT19TVUJTKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19TVUJYXSA9IExBQkVMX1JFRiAoT19TVUJYKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19TVUJdID0gTEFCRUxfUkVGIChPX1NVQik7CisgICAgICBleGVjX2Rpc3BhdGNoW09fU1dBUF0gPSBMQUJFTF9SRUYgKE9fU1dBUCk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fVEFTXSA9IExBQkVMX1JFRiAoT19UQVMpOworICAgICAgZXhlY19kaXNwYXRjaFtPX1RSQVBBXSA9IExBQkVMX1JFRiAoT19UUkFQQSk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fVFJBUF9WU10gPSBMQUJFTF9SRUYgKE9fVFJBUF9WUyk7CisgICAgICBleGVjX2Rpc3BhdGNoW09fVFNUXSA9IExBQkVMX1JFRiAoT19UU1QpOworICAgICAgZXhlY19kaXNwYXRjaFtPX1VOTEtdID0gTEFCRUxfUkVGIChPX1VOTEspOworICAgICAgZXhlY19kaXNwYXRjaFtPX1hDSF0gPSBMQUJFTF9SRUYgKE9fWENIKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19YT1JDXSA9IExBQkVMX1JFRiAoT19YT1JDKTsKKyAgICAgIGV4ZWNfZGlzcGF0Y2hbT19YT1JdID0gTEFCRUxfUkVGIChPX1hPUik7CisgICAgICBub3AudHlwZSA9IGVhcy5zLmVhX25vcC5zLnNyY2FieXRlOworICAgICAgY3B1LmNhY2hlWzBdLm9wY29kZSA9IGV4ZWNfZGlzcGF0Y2hbT19SRUNPTVBJTEVdOworICAgICAgY3B1LmNhY2hlWzBdLnNyY2EudHlwZSA9IGVhcy5zLmVhX25vcC5zLnNyY2FieXRlOworICAgICAgY3B1LmNhY2hlWzBdLnNyY2IudHlwZSA9IGVhcy5zLmVhX25vcC5zLnNyY2JieXRlOworICAgIH0KKworICBwcmV2ID0gc2lnbmFsIChTSUdJTlQsIGNvbnRyb2xfYyk7CisgIHByZXZfc2VnID0gc2lnbmFsIChTSUdTRUdWLCBzZWd2KTsKKworICBpZiAoc3RlcCkKKyAgICB7CisgICAgICBjcHUuZXhjZXB0aW9uID0gU0lHVFJBUDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjcHUuZXhjZXB0aW9uID0gMDsKKyAgICB9CisKKyAgcGMgPSBjcHUucmVnc1tSX1BDXS5zW0xPV10gKyAoTk9STUFMX0NQIDw8IDE2KTsKKworICBHRVRTUiAoKTsKKworICBpZiAoc2V0am1wIChqYnVmKSA9PSAwKSB7CisgICAgZG8KKyAgICAgIHsKKwlpbnQgY2lkeDsKKwlkZWNvZGVkX2luc3QgKmNvZGU7CisKKyAgICAgIHRvcDoKKwljaWR4ID0gY3B1LmNhY2hlX2lkeFtwY107CisJY29kZSA9IGNwdS5jYWNoZSArIGNpZHg7CisKKwlGRVRDSCAoYXJnYSwgY29kZS0+c3JjYSwgMCk7CisJRkVUQ0ggKGFyZ2IsIGNvZGUtPnNyY2IsIDEpOworCisKKwkKKyNpZmRlZiBERUJVRworCWlmIChkZWJ1ZykKKwkgIHsKKwkgICAgcHJpbnRmICgiJXggJWQgJXNcbiIsIHBjLCBjb2RlLT5vcGNvZGUsCisJCSAgICBjb2RlLT5vcCA/IGNvZGUtPm9wLT5uYW1lIDogIioqIik7CisJICB9CisjZW5kaWYKKworCWN5Y2xlcyArPSBjb2RlLT5jeWNsZXM7CisJaW5zdHMrKzsKKwlESVNQQVRDSCAoY29kZS0+b3Bjb2RlKQorCSAgeworCSAgICBMQUJFTCAoT19SRUNPTVBJTEUpOgorCSAgICAvKiBUaGlzIG9wY29kZSBpcyBhIGZha2UgZm9yIHdoZW4gd2UgZ2V0IHRvIGFuIGluc3RydWN0aW9uIHdoaWNoCisJICAgICAgIGhhc24ndCBiZWVuIGNvbXBpbGVkICovCisJICAgIGNvbXBpbGUgKHBjKTsKKwkgICAgZ290byB0b3A7CisJICAgIGJyZWFrOworCSAgICBMQUJFTCAoT19ORUcpOgorCSAgICBhcmdhID0gLWFyZ2E7CisJICAgIGFyZ2IgPSAwOworCSAgICByZXMgPSBhcmdhICsgYXJnYjsKKwkgICAgYnJlYWs7CisJICAgIExBQkVMIChPX1NVQlgpOgorCSAgICBhcmdhICs9IEM7CisJICAgIExBQkVMIChPX1NVQik6CisJICAgIExBQkVMIChPX1NVQlMpOgorCSAgICBhcmdhID0gLWFyZ2E7CisJICAgIExBQkVMIChPX0FERCk6CisJICAgIExBQkVMIChPX0FERFMpOgorCSAgICByZXMgPSBhcmdhICsgYXJnYjsKKwkgICAgYnJlYWs7CisKKwkgICAgTEFCRUwgKE9fQUREWCk6CisJICAgIHJlcyA9IGFyZ2EgKyBhcmdiICsgQzsKKwkgICAgYnJlYWs7CisKKwkgICAgTEFCRUwgKE9fQU5EKToKKwkgICAgTEFCRUwgKE9fQU5EQyk6CisJICAgIHJlcyA9IGFyZ2EgJiBhcmdiOworCSAgICBicmVhazsKKwkgICAgYnJlYWs7CisKKwkgICAgTEFCRUwgKE9fQkNMUik6CisJICAgIGFyZ2EgJj0gMHhmOworCSAgICBiaXQgPSAoYXJnYiAmICgxIDw8IGFyZ2EpKTsKKwkgICAgcmVzID0gYXJnYiAmIH4oMSA8PCBhcmdhKTsKKwkgICAgZ290byBiaXRvcDsKKworCisJICAgIExBQkVMIChPX0JSQSk6CisJICAgIExBQkVMIChPX0JUKToKKwkgICAgaWYgKDEpCisJICAgICAgZ290byBjb25kdHJ1ZTsKKworCSAgICBMQUJFTCAoT19CUk4pOgorCSAgICBMQUJFTCAoT19CRik6CisJICAgIGlmICgwKQorCSAgICAgIGdvdG8gY29uZHRydWU7CisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChPX0JISSk6CisJICAgIGlmICgoQyB8fCBaKSA9PSAwKQorCSAgICAgIGdvdG8gY29uZHRydWU7CisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChPX0JMUyk6CisJICAgIGlmICgoQyB8fCBaKSkKKwkgICAgICBnb3RvIGNvbmR0cnVlOworCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoT19CQ1MpOgorCSAgICBMQUJFTCAoT19CTE8pOgorCSAgICBpZiAoKEMgPT0gMSkpCisJICAgICAgZ290byBjb25kdHJ1ZTsKKwkgICAgYnJlYWs7CisKKwkgICAgTEFCRUwgKE9fQkNDKToKKwkgICAgTEFCRUwgKE9fQkhTKToKKwkgICAgaWYgKChDID09IDApKQorCSAgICAgIGdvdG8gY29uZHRydWU7CisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChPX0JFUSk6CisJICAgIGlmIChaKQorCSAgICAgIGdvdG8gY29uZHRydWU7CisJICAgIGJyZWFrOworCSAgICBMQUJFTCAoT19CR1QpOgorCSAgICBpZiAoKChaIHx8IChOIF4gVikpID09IDApKQorCSAgICAgIGdvdG8gY29uZHRydWU7CisJICAgIGJyZWFrOworCisKKwkgICAgTEFCRUwgKE9fQkxFKToKKwkgICAgaWYgKCgoWiB8fCAoTiBeIFYpKSA9PSAxKSkKKwkgICAgICBnb3RvIGNvbmR0cnVlOworCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoT19CR0UpOgorCSAgICBpZiAoKE4gXiBWKSA9PSAwKQorCSAgICAgIGdvdG8gY29uZHRydWU7CisJICAgIGJyZWFrOworCSAgICBMQUJFTCAoT19CTFQpOgorCSAgICBpZiAoKE4gXiBWKSkKKwkgICAgICBnb3RvIGNvbmR0cnVlOworCSAgICBicmVhazsKKwkgICAgTEFCRUwgKE9fQk1JKToKKwkgICAgaWYgKChOKSkKKwkgICAgICBnb3RvIGNvbmR0cnVlOworCSAgICBicmVhazsKKwkgICAgTEFCRUwgKE9fQk5FKToKKwkgICAgaWYgKChaID09IDApKQorCSAgICAgIGdvdG8gY29uZHRydWU7CisJICAgIGJyZWFrOworCSAgICBMQUJFTCAoT19CUEwpOgorCSAgICBpZiAoTiA9PSAwKQorCSAgICAgIGdvdG8gY29uZHRydWU7CisJICAgIGJyZWFrOworCSAgICBicmVhazsKKwkgICAgTEFCRUwgKE9fQlZDKToKKwkgICAgaWYgKChWID09IDApKQorCSAgICAgIGdvdG8gY29uZHRydWU7CisJICAgIGJyZWFrOworCSAgICBMQUJFTCAoT19CVlMpOgorCSAgICBpZiAoKFYgPT0gMSkpCisJICAgICAgZ290byBjb25kdHJ1ZTsKKwkgICAgYnJlYWs7CisKKwkgICAgTEFCRUwgKE9fQk5PVCk6CisJICAgIGJpdCA9IGFyZ2IgJiAoMTw8KGFyZ2EgJiAweGYpKTsKKwkgICAgcmVzID0gYXJnYiBeICgxPDwoYXJnYSAmIDB4ZikpOworCSAgICBnb3RvIGJpdG9wOworCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoT19CU0VUKToKKwkgICAgYXJnYSA9IDEgPDwgKGFyZ2EgJiAweGYpOworCSAgICBiaXQgPSBhcmdiICYgYXJnYTsKKwkgICAgcmVzID0gYXJnYiB8IGFyZ2E7CisJICAgIGdvdG8gYml0b3A7CisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChPX1BKTVApOgorCSAgICBwYyA9IGFyZ2E7CisJICAgIGdvdG8gbmV4dDsKKworCSAgICBMQUJFTCAoT19VTkxLKToKKwkgICAgeworCSAgICAgIGludCB0OworCSAgICAgIFNFVF9OT1JNUkVHIChSNywgR0VUX05PUk1SRUcgKFI2KSk7CisJICAgICAgUE9QV09SRCAodCk7CisJICAgICAgU0VUX05PUk1SRUcgKFI2LCB0KTsKKwkgICAgICBwYyA9IGNvZGUtPm5leHRfcGM7CisJICAgICAgZ290byBuZXh0OworCSAgICB9CisKKwkgICAgTEFCRUwgKE9fUlRTKToKKwkgICAgeworCSAgICAgIGludCBjcCA9IHBjICYgMHhmZjAwMDA7CisJICAgICAgUE9QV09SRCAocGMpOworCSAgICAgIHBjIHw9IGNwOworCSAgICAgIGdvdG8gbmV4dDsKKwkgICAgfQorCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoT19QUlRTKToKKwkgICAgeworCSAgICAgIGludCBjcDsKKwkgICAgICBpbnQgb2ZmOworCSAgICAgIFBPUFdPUkQgKGNwKTsKKwkgICAgICBQT1BXT1JEIChvZmYpOworCSAgICAgIGNwIDw8PSAxNjsKKwkgICAgICBTRVRfU0VHUkVHIChSX0NQLCBjcCk7CisJICAgICAgcGMgPSBjcCArIG9mZjsKKwkgICAgfQorCSAgICBnb3RvIG5leHQ7CisKKwkgICAgTEFCRUwgKE9fUEpTUik6CisJICAgIFBVU0hXT1JEIChhcmdiICYgMHhmZmZmKTsKKwkgICAgUFVTSFdPUkQgKGFyZ2IgPj4gMTYpOworCSAgICBwYyA9IChhcmdhICYgMHhmZmZmZmYpOworCSAgICBnb3RvIG5leHQ7CisKKwkgICAgTEFCRUwgKE9fQlNSKToKKwkgICAgTEFCRUwgKE9fSlNSKToKKwkgICAgUFVTSFdPUkQgKGNvZGUtPm5leHRfcGMpOworCSAgICBwYyA9IGFyZ2EgfCAocGMgJiAweGZmMDAwMCk7CisJICAgIGdvdG8gbmV4dDsKKworCSAgICBMQUJFTCAoT19CVFNUKToKKwkgICAgWiA9ICgoKGFyZ2IgPj4gKGFyZ2EgJiAweGYpKSAmIDEpID09IDApOworCSAgICBwYyA9IGNvZGUtPm5leHRfcGM7CisJICAgIGdvdG8gbmV4dDsKKworCSAgICBMQUJFTCAoT19DTFIpOgorCSAgICByZXMgPSAwOworCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoT19DTVApOgorCSAgICBhcmdhID0gLWFyZ2E7CisJICAgIHJlcyA9IGFyZ2EgKyBhcmdiOworCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoT19EQUREKToKKwkgICAgcmVzID0gYXJnYSArIGFyZ2IgKyBDOworCSAgICBpZiAocmVzID4gOTkpCisJICAgICAgeworCQlyZXMgLT0gMTAwOworCQlDID0gMTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCUMgPSAwOworCSAgICAgIH0KKwkgICAgWiA9IFogJiYgKHJlcyA9PSAwKTsKKwkgICAgYnJlYWs7CisKKworCSAgICBMQUJFTCAoT19EU1VCKToKKwkgICAgcmVzID0gYXJnYiAtIGFyZ2EgLSBDOworCSAgICBpZiAocmVzIDwgMCkKKwkgICAgICB7CisJCXJlcyArPSAxMDA7CisJCUMgPSAxOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJQyA9IDA7CisJICAgICAgfQorCSAgICBaID0gWiAmJiAocmVzID09IDApOworCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoT19FWFRTKToKKwkgICAgcmVzID0gU0VYVENIQVIgKGFyZ2EpOworCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoT19FWFRVKToKKwkgICAgcmVzID0gKHVuc2lnbmVkIGNoYXIpIGFyZ2E7CisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChPX0pNUCk6CisJICAgIHBjID0gYXJnYSB8IChwYyAmIDB4ZmYwMDAwKTsKKwkgICAgZ290byBuZXh0OworCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoT19MRE0pOgorCisJICAgIGZvciAodG1wID0gMDsgdG1wIDwgNzsgdG1wKyspCisJICAgICAgeworCQlpZiAoYXJnYiAmICgxIDw8IHRtcCkpCisJCSAgeworCQkgICAgUE9QV09SRCAoY3B1LnJlZ3NbdG1wXS5zW0xPV10pOworCQkgIH0KKwkgICAgICB9CisJICAgIGlmIChhcmdiICYgMHg4MCkKKwkgICAgICBQT1BXT1JEICh0bXApOwkvKiBkdW1teSByZWFkeSBmb3Igc3AgKi8KKwkgICAgZ290byBuZXh0cGM7CisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChPX0xJTkspOgorCSAgICBQVVNIV09SRCAoY3B1LnJlZ3NbUjZdLnNbTE9XXSk7CisJICAgIGNwdS5yZWdzW1I2XS5zW0xPV10gPSBjcHUucmVnc1tSN10uc1tMT1ddOworCSAgICBjcHUucmVnc1tSN10uc1tMT1ddICs9IGFyZ2I7CisJICAgIGdvdG8gbmV4dHBjOworCisJICAgIExBQkVMIChPX1NUQyk6CisJICAgIExBQkVMIChPX0xEQyk6CisJICAgIExBQkVMIChPX01PVkZQRSk6CisJICAgIExBQkVMIChPX01PVlRQRSk6CisJICAgIExBQkVMIChPX01PVik6CisJICAgIExBQkVMIChPX1RTVCk6CisJICAgIHJlcyA9IGFyZ2E7CisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChPX1RSQVBBKToKKwkgICAgaWYgKGFyZ2EgPT0gMTUpCisJICAgICAgeworCQl0cmFwICgpOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJUFVTSFdPUkQgKHBjICYgMHhmZmZmKTsKKwkJaWYgKGNwdS5tYXhpbXVtKQorCQkgIHsKKwkJICAgIFBVU0hXT1JEIChOT1JNQUxfQ1ApOworCQkgIH0KKwkJUFVTSFdPUkQgKE5PUk1BTF9TUik7CisJCWlmIChjcHUubWF4aW11bSkKKwkJICB7CisJCSAgICBhcmdhID0gYXJnYSAqIDQgKyAweDQwOworCQkgICAgU0VUX05PUk1BTF9DUFBDIChsb25nYXQgKGNwdS5tZW1vcnkgKyBhcmdhKSk7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgYXJnYSA9IGFyZ2EgKiAyICsgMHgyMDsKKwkJICAgIFNFVF9OT1JNQUxfQ1BQQyAod29yZGF0IChjcHUubWVtb3J5ICsgYXJnYSkpOworCQkgIH0KKwkgICAgICB9CisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChPX09SKToKKwkgICAgTEFCRUwgKE9fT1JDKToKKwkgICAgcmVzID0gYXJnYSB8IGFyZ2I7CisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChPX1hPUik6CisJICAgIExBQkVMIChPX1hPUkMpOgorCSAgICByZXMgPSBhcmdhIF4gYXJnYjsKKwkgICAgYnJlYWs7CisKKwkgICAgTEFCRUwgKE9fU0NCX0YpOgorCSAgICB7CisJICAgIHNjYl9mOgorCSAgICAgIHJlcyA9IGFyZ2EgLSAxOworCSAgICAgIGNvZGUtPnNyY2EucmVnLndwdHJbMF0gPSByZXM7CisJICAgICAgaWYgKHJlcyAhPSAtMSkKKwkJeworCQkgIHBjID0gYXJnYjsKKwkJICBnb3RvIG5leHQ7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoT19TQ0JfRVEpOgorCSAgICBpZiAoWiA9PSAxKQorCSAgICAgIGJyZWFrOworCSAgICBlbHNlCisJICAgICAgZ290byBzY2JfZjsKKworCSAgICBMQUJFTCAoT19TQ0JfTkUpOgorCSAgICBpZiAoWiA9PSAwKQorCSAgICAgIGJyZWFrOworCSAgICBlbHNlCisJICAgICAgZ290byBzY2JfZjsKKworCSAgICBMQUJFTCAoT19OT1ApOgorCSAgICAvKiBJZiBvbmx5IHRoZXkgd2VyZSBhbGwgYXMgc2ltcGxlIGFzIHRoaXMgKi8KKwkgICAgYnJlYWs7CisKKwkgICAgTEFCRUwgKE9fUk9UTCk6CisJICAgIHJlcyA9IGFyZ2EgPDwgMTsKKwkgICAgQyA9IChyZXMgPj4gYXJnYikgJiAxOworCSAgICByZXMgfD0gQzsKKwkgICAgYnJlYWs7CisKKworCSAgICBMQUJFTCAoT19ST1RSKToKKwkgICAgQyA9IGFyZ2EgJiAxOworCSAgICByZXMgPSBhcmdhID4+IDE7CisJICAgIHJlcyB8PSAoQyA8PCAoYXJnYiAtIDEpKTsKKwkgICAgYnJlYWs7CisKKwkgICAgTEFCRUwgKE9fUk9UWEwpOgorCSAgICByZXMgPSBhcmdhIDw8IDE7CisJICAgIHJlcyB8PSBDOworCSAgICBDID0gKHJlcyA+PiBhcmdiKSAmIDE7CisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChPX1JPVFhSKToKKwkgICAgcmVzID0gYXJnYSA+PiAxOworCSAgICByZXMgfD0gKEMgPDwgKGFyZ2IgLSAxKSk7CisJICAgIEMgPSBhcmdhICYgMTsKKwkgICAgYnJlYWs7CisKKwkgICAgTEFCRUwgKE9fU0hBTCk6CisJICAgIHJlcyA9IGFyZ2EgPDwgMTsKKwkgICAgaWYgKGFyZ2IgPT0gMTYpCisJICAgICAgeworCQlDID0gKHJlcyA+PiAoMTYpKSAmIDE7CisJCVogPSAoKHJlcyAmIDB4ZmZmZikgPT0gMCk7CisJCU4gPSAoKHJlcyAmIDB4ODAwMCkgIT0gMCk7CisJICAgICAgfQorCisJICAgIGVsc2UKKwkgICAgICB7CisJCUMgPSAocmVzID4+ICg4KSkgJiAxOworCQlaID0gKChyZXMgJiAweGZmKSA9PSAwKTsKKwkJTiA9ICgocmVzICYgMHg4MCkgIT0gMCk7CisKKwkgICAgICB9CisJICAgIFYgPSBDIF4gTjsKKwkgICAgZ290byBub25lOworCisJICAgIExBQkVMIChPX1NIQVIpOgorCSAgICBDID0gYXJnYSAmIDE7CisJICAgIGlmIChhcmdiID09IDE2KQorCSAgICAgIHsKKwkJcmVzID0gKChzaG9ydCkgYXJnYSkgPj4gMTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCXJlcyA9IChTRVhUQ0hBUiAoYXJnYSkpID4+IDE7CisJICAgICAgfQorCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoT19TSExMKToKKwkgICAgcmVzID0gYXJnYSA8PCAxOworCSAgICBDID0gKHJlcyA+PiBhcmdiKSAmIDE7CisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChPX1NITFIpOgorCSAgICBDID0gYXJnYSAmIDE7CisJICAgIHJlcyA9IGFyZ2EgPj4gMTsKKwkgICAgYnJlYWs7CisKKwkgICAgTEFCRUwgKE9fRElWWFUpOgorCSAgICBpZiAoYXJnYSA9PSAwKQorCSAgICAgIHsKKwkJTiA9IFYgPSBDID0gMDsKKwkJWiA9IDE7CisJCWNwdS5leGNlcHRpb24gPSBTSUdJTEw7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlpbnQgZCA9IGFyZ2IgLyBhcmdhOworCQlpbnQgbSA9IGFyZ2IgJSBhcmdhOworCQlpZiAoY29kZS0+ZHN0LnR5cGUgPT0gZWFzLnMuZWFfcmVnLnMuZHN0bG9uZykKKwkJICB7CisJCSAgICByZXMgPSAobSA8PCAxNikgfCAoZCAmIDB4ZmZmZik7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgcmVzID0gKG0gPDwgOCkgfCAoZCAmIDB4ZmYpOworCQkgIH0KKworCSAgICAgIH0KKwkgICAgYnJlYWs7CisKKwkgICAgTEFCRUwgKE9fTVVMWFUpOgorCSAgICByZXMgPSBhcmdhICogYXJnYjsKKwkgICAgYnJlYWs7CisKKwkgICAgTEFCRUwgKE9fTk9UKToKKwkgICAgcmVzID0gfmFyZ2E7CisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChPX1NXQVApOgorCSAgICByZXMgPSAoKGFyZ2EgPj4gOCkgJiAweGZmKSB8ICgoYXJnYSA8PCA4KSAmIDB4ZmYwMCk7CisJICAgIGJyZWFrOworCisKKwkgICAgTEFCRUwgKE9fU1RNKToKKwkgICAgZm9yICh0bXAgPSA3OyB0bXAgPj0gMDsgdG1wLS0pCisJICAgICAgeworCQlpZiAoYXJnYSAmICgxIDw8IHRtcCkpCisJCSAgeworCQkgICAgUFVTSFdPUkQgKGNwdS5yZWdzW3RtcF0uc1tMT1ddKTsKKwkJICB9CisJICAgICAgfQorCSAgICBnb3RvIG5leHRwYzsKKworCSAgICBMQUJFTCAoT19UQVMpOgorCSAgICBDID0gMDsKKwkgICAgViA9IDA7CisJICAgIFogPSBhcmdhID09IDA7CisJICAgIE4gPSBhcmdhIDwgMDsKKwkgICAgcmVzID0gYXJnYSB8IDB4ODA7CisJICAgIGdvdG8gbm9uZTsKKworCSAgICBMQUJFTCAoT19QUlREKToKKwkgICAgTEFCRUwgKE9fWENIKToKKwkgICAgTEFCRUwgKE9fUlREKToKKwkgICAgY3B1LmV4Y2VwdGlvbiA9IFNJR0lMTDsKKwkgICAgZ290byBuZXh0OworCisJICAgIExBQkVMIChPX1RSQVBfVlMpOgorCSAgICBMQUJFTCAoT19TTEVFUCk6CisJICAgIExBQkVMIChPX0JQVCk6CisJICAgIGNwdS5leGNlcHRpb24gPSBTSUdUUkFQOworCSAgICBnb3RvIG5leHQ7CisJICAgIGJyZWFrOworCSAgfQorCisJRU5ERElTUEFUQ0g7CisKKwlESVNQQVRDSCAoY29kZS0+ZmxhZ3MpCisJICB7CisJICBiaXRvcDoKKwkgICAgWiA9IChyZXMgJiBiaXQpID09IDA7CisJICAgIHBjID0gY29kZS0+bmV4dF9wYzsKKwkgICAgYnJlYWs7CisJICAgIExBQkVMIChGTEFHX211bHR3b3JkKToKKwkgICAgWiA9IChyZXMgJiAweGZmZmYpID09IDA7CisJICAgIE4gPSAocmVzICYgMHg4MDAwKSAhPSAwOworCSAgICBWID0gMDsKKwkgICAgQyA9IDA7CisJICAgIHBjID0gY29kZS0+bmV4dF9wYzsKKwkgICAgYnJlYWs7CisKKwkgICAgTEFCRUwgKEZMQUdfbXVsdGJ5dGUpOgorCSAgICAvKiA4KjggLT4gMTYgKi8KKwkgICAgWiA9IChyZXMgJiAweGZmKSA9PSAwOworCSAgICBOID0gKHJlcyAmIDB4ODApICE9IDA7CisJICAgIFYgPSAwOworCSAgICBDID0gMDsKKwkgICAgcGMgPSBjb2RlLT5uZXh0X3BjOworCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoRkxBR19zaGlmdHdvcmQpOgorCSAgICBOID0gKHJlcyAmIDB4ODAwMCkgIT0gMDsKKwkgICAgWiA9IChyZXMgJiAweGZmZmYpID09IDA7CisJICAgIFYgPSAwOworCSAgICBwYyA9IGNvZGUtPm5leHRfcGM7CisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChGTEFHX3NoaWZ0Ynl0ZSk6CisJICAgIE4gPSAocmVzICYgMHg4MCkgIT0gMDsKKwkgICAgWiA9IChyZXMgJiAweGZmKSA9PSAwOworCSAgICBWID0gMDsKKwkgICAgcGMgPSBjb2RlLT5uZXh0X3BjOworCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoRkxBR19zcGVjaWFsKToKKwkgICAgcGMgPSBjb2RlLT5uZXh0X3BjOworCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoRkxBR19tKToKKwkgICAgLyogTW92ZSBieXRlIGZsYWdzICovCisJICAgIC8qIGFmdGVyIGEgbG9naWNhbCBpbnN0cnVjdGlvbiAqLworCSAgICBOID0gKHJlcyAmIDB4ODApICE9IDA7CisJICAgIFogPSAocmVzICYgMHhmZikgPT0gMDsKKwkgICAgViA9ICgoKH5hcmdhICYgfmFyZ2IgJiByZXMpIHwgKGFyZ2EgJiBhcmdiICYgfnJlcykpICYgMHg4MCkgIT0gMDsKKwkgICAgcGMgPSBjb2RlLT5uZXh0X3BjOworCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoRkxBR19NKToKKwkgICAgLyogTW92ZSB3b3JkIGZsYWdzICovCisJICAgIC8qIGFmdGVyIGEgbG9naWNhbCBpbnN0cnVjdGlvbiAqLworCSAgICBOID0gKHJlcyAmIDB4ODAwMCkgIT0gMDsKKwkgICAgWiA9IChyZXMgJiAweGZmZmYpID09IDA7CisJICAgIFYgPSAoKCh+YXJnYSAmIH5hcmdiICYgcmVzKSB8IChhcmdhICYgYXJnYiAmIH5yZXMpKSAmIDB4ODAwMCkgIT0gMDsKKwkgICAgcGMgPSBjb2RlLT5uZXh0X3BjOworCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoRkxBR19hKToKKwkgICAgLyogYWZ0ZXIgYnl0ZSBzaXplZCBhcml0aCAqLworCSAgICBDID0gKHJlcyAmIDB4MTAwKSAhPSAwOworCSAgICBOID0gKHJlcyAmIDB4ODApICE9IDA7CisJICAgIFogPSAocmVzICYgMHhmZikgPT0gMDsKKwkgICAgViA9ICgoKH5hcmdhICYgfmFyZ2IgJiByZXMpIHwgKGFyZ2EgJiBhcmdiICYgfnJlcykpICYgMHg4MCkgIT0gMDsKKwkgICAgcGMgPSBjb2RlLT5uZXh0X3BjOworCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoRkxBR19BKToKKwkgICAgLyogYWZ0ZXIgd29yZCBzaXplZCBhcml0aCAqLworCSAgICBDID0gKHJlcyAmIDB4MTAwMDApICE9IDA7CisJICAgIE4gPSAocmVzICYgMHg4MDAwKSAhPSAwOworCSAgICBaID0gKHJlcyAmIDB4ZmZmZikgPT0gMDsKKwkgICAgViA9ICgoKH5hcmdhICYgfmFyZ2IgJiByZXMpIHwgKGFyZ2EgJiBhcmdiICYgfnJlcykpICYgMHg4MDAwKSAhPSAwOworCSAgICBwYyA9IGNvZGUtPm5leHRfcGM7CisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChGTEFHX05PTkUpOgorCSAgbm9uZTo7CisJICAgIC8qIG5vIGZsYWdzIGJ1dCBzdG9yZSAqLworCSAgICBwYyA9IGNvZGUtPm5leHRfcGM7CisJICAgIGJyZWFrOworCSAgICBMQUJFTCAoRkxBR19OT1NUT1JFKToKKwkgICAgLyogbm8gZmxhZ3MgYW5kIG5vIHN0b3JlICovCisJICAgIHBjID0gY29kZS0+bmV4dF9wYzsKKwkgICAgYnJlYWs7CisJICAgIExBQkVMIChGTEFHX0NMRUFSKToKKwkgICAgLyogY2xlYXIgZmxhZ3MgKi8KKwkgICAgTiA9IDA7CisJICAgIFogPSAxOworCSAgICBWID0gMDsKKwkgICAgQyA9IDA7CisJICAgIHBjID0gY29kZS0+bmV4dF9wYzsKKwkgICAgYnJlYWs7CisJICBjb25kdHJ1ZToKKwkgICAgcGMgPSBhcmdhOworCSAgICBnb3RvIG5leHQ7CisJICB9CisJRU5ERElTUEFUQ0g7CisKKwlESVNQQVRDSCAoY29kZS0+ZHN0LnR5cGUpCisJICB7CisJICAgIHVuc2lnbmVkIGNoYXIgKmx2YWw7CisKKwkgICAgTEFCRUwgKFNUT1JFX0NSQik6CisJICAgICgqKGNvZGUtPmRzdC5yZWcuc2VncHRyKSkgPSBjcHUubWVtb3J5ICsgKHJlcyA8PCAxNik7CisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChTVE9SRV9OT1ApOgorCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoU1RPUkVfUkVHX0IpOgorCSAgICAoKihjb2RlLT5kc3QucmVnLmJwdHIpKSA9IHJlczsKKwkgICAgYnJlYWs7CisKKwkgICAgTEFCRUwgKFNUT1JFX1JFR19XKToKKwkgICAgKCooY29kZS0+ZHN0LnJlZy53cHRyKSkgPSByZXM7CisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChTVE9SRV9SRUdfTCk6CisJICAgIHsKKwkgICAgICBpbnQgbCwgcjsKKworCSAgICAgIHIgPSAodW5pb24gcnR5cGUgKikgKGNvZGUtPmRzdC5yZWcud3B0cikgLSAmY3B1LnJlZ3NbMF07CisJICAgICAgcisrOworCSAgICAgICooY29kZS0+ZHN0LnJlZy53cHRyKSA9IHJlcyA+PiAxNjsKKwkgICAgICBjcHUucmVnc1tyXS5zW0xPV10gPSByZXMgJiAweGZmZmY7CisKKwkgICAgfQorCisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChTVE9SRV9ESVNQX1cpOgorCSAgICBsdmFsID0gZGlzcGx2YWwgKGNvZGUtPmRzdCk7CisJICAgIHNldHdvcmRhdCAobHZhbCwgcmVzKTsKKwkgICAgYnJlYWs7CisKKwkgICAgTEFCRUwgKFNUT1JFX0RJU1BfQik6CisJICAgIGx2YWwgPSBkaXNwbHZhbCAoY29kZS0+ZHN0KTsKKwkgICAgc2V0Ynl0ZWF0IChsdmFsLCByZXMpOworCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoU1RPUkVfSU5DX0IpOgorCSAgICBsdmFsID0gZWx2YWwgKGNvZGUtPmRzdCwgMCk7CisJICAgIHNldGJ5dGVhdCAobHZhbCwgcmVzKTsKKwkgICAgKCooY29kZS0+ZHN0LnJlZy53cHRyKSkrKzsKKwkgICAgYnJlYWs7CisKKwkgICAgTEFCRUwgKFNUT1JFX0lOQ19XKToKKwkgICAgbHZhbCA9IGVsdmFsIChjb2RlLT5kc3QsIDApOworCSAgICBzZXR3b3JkYXQgKGx2YWwsIHJlcyk7CisJICAgICgqKGNvZGUtPmRzdC5yZWcud3B0cikpICs9IDI7CisJICAgIGJyZWFrOworCisJICAgIExBQkVMIChTVE9SRV9ERUNfQik6CisJICAgICgqKGNvZGUtPmRzdC5yZWcud3B0cikpLS07CisJICAgIGx2YWwgPSBlbHZhbCAoY29kZS0+ZHN0LCAwKTsKKwkgICAgc2V0Ynl0ZWF0IChsdmFsLCByZXMpOworCSAgICBicmVhazsKKworCSAgICBMQUJFTCAoU1RPUkVfQ1JXKToKKwkgICAgLyogTWFrZSBhbiB1cCB0byBkYXRlIHNyIGZyb20gdGhlIGZsYWcgc3RhdGUgKi8KKwkgICAgY3B1LnJlZ3NbUl9TUl0uc1tMT1ddID0gcmVzOworCSAgICBHRVRTUiAoKTsKKwkgICAgYnJlYWs7CisKKwkgICAgTEFCRUwgKFNUT1JFX0RFQ19XKToKKwkgICAgKCooY29kZS0+ZHN0LnJlZy53cHRyKSkgLT0gMjsKKwkgICAgbHZhbCA9IGVsdmFsIChjb2RlLT5kc3QsIDApOworCSAgICBzZXR3b3JkYXQgKGx2YWwsIHJlcyk7CisKKwkgICAgYnJlYWs7CisKKwkgIG5leHRwYzoKKwkgICAgcGMgPSBjb2RlLT5uZXh0X3BjOworCisJICB9CisJRU5ERElTUEFUQ0g7CisgICAgICBuZXh0OjsKKyAgICAgIH0KKyAgICB3aGlsZSAoIWNwdS5leGNlcHRpb24pOworICB9CisKKyAgY3B1LnRpY2tzICs9IGdldF9ub3cgKCkgLSB0aWNrX3N0YXJ0OworICBjcHUuY3ljbGVzICs9IGN5Y2xlczsKKyAgY3B1Lmluc3RzICs9IGluc3RzOworICBjcHUucmVnc1tSX1BDXS5zW0xPV10gPSBwYzsKKyAgQlVJTERTUiAoKTsKKworICBzaWduYWwgKFNJR0lOVCwgcHJldik7CisgIHNpZ25hbCAoU0lHU0VHViwgcHJldl9zZWcpOworfQorCisKKworCitpbnQKK3NpbV93cml0ZSAoc2QsIGFkZHIsIGJ1ZmZlciwgc2l6ZSkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIFNJTV9BRERSIGFkZHI7CisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKyAgICAgaW50IHNpemU7Cit7CisgIGludCBpOworCisgIGluaXRfcG9pbnRlcnMgKCk7CisgIGlmIChhZGRyIDwgMCB8fCBhZGRyICsgc2l6ZSA+IEg4NTAwX01TSVpFKQorICAgIHJldHVybiAwOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHsKKyAgICAgIGNwdS5tZW1vcnlbYWRkciArIGldID0gYnVmZmVyW2ldOworICAgICAgY3B1LmNhY2hlX2lkeFthZGRyICsgaV0gPSAwOworICAgIH0KKyAgcmV0dXJuIHNpemU7Cit9CisKK2ludAorc2ltX3JlYWQgKHNkLCBhZGRyLCBidWZmZXIsIHNpemUpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBTSU1fQUREUiBhZGRyOworICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgICAgIGludCBzaXplOworeworICBpbml0X3BvaW50ZXJzICgpOworICBpZiAoYWRkciA8IDAgfHwgYWRkciArIHNpemUgPiBIODUwMF9NU0laRSkKKyAgICByZXR1cm4gMDsKKyAgbWVtY3B5IChidWZmZXIsIGNwdS5tZW1vcnkgKyBhZGRyLCBzaXplKTsKKyAgcmV0dXJuIHNpemU7Cit9CisKKy8qIFJpcHBlZCBvZmYgZnJvbSB0bS1oODUwMC5oICovCisKKyNkZWZpbmUgUjBfUkVHTlVNCTAKKyNkZWZpbmUgUjFfUkVHTlVNCTEKKyNkZWZpbmUgUjJfUkVHTlVNCTIKKyNkZWZpbmUgUjNfUkVHTlVNCTMKKyNkZWZpbmUgUjRfUkVHTlVNCTQKKyNkZWZpbmUgUjVfUkVHTlVNCTUKKyNkZWZpbmUgUjZfUkVHTlVNCTYKKyNkZWZpbmUgUjdfUkVHTlVNCTcKKworLyogQXMgYWJvdmUsIGJ1dCB3aXRoIGNvcnJlY3Qgc2VnIHJlZ2lzdGVyIGdsdWVkIG9uICovCisjZGVmaW5lIFBSMF9SRUdOVU0JOAorI2RlZmluZSBQUjFfUkVHTlVNCTkKKyNkZWZpbmUgUFIyX1JFR05VTQkxMAorI2RlZmluZSBQUjNfUkVHTlVNCTExCisjZGVmaW5lIFBSNF9SRUdOVU0JMTIKKyNkZWZpbmUgUFI1X1JFR05VTQkxMworI2RlZmluZSBQUjZfUkVHTlVNCTE0CisjZGVmaW5lIFBSN19SRUdOVU0JMTUKKworI2RlZmluZSBTUF9SRUdOVU0gICAgICAgUFI3X1JFR05VTQkvKiBDb250YWlucyBhZGRyZXNzIG9mIHRvcCBvZiBzdGFjayAqLworI2RlZmluZSBGUF9SRUdOVU0gICAgICAgUFI2X1JFR05VTQkvKiBDb250YWlucyBhZGRyZXNzIG9mIGV4ZWN1dGluZyBzdGFjayBmcmFtZSAqLworCisKKyNkZWZpbmUgU0VHX0NfUkVHTlVNCTE2CS8qIFNlZ21lbnQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNFR19EX1JFR05VTQkxNworI2RlZmluZSBTRUdfRV9SRUdOVU0JMTgKKyNkZWZpbmUgU0VHX1RfUkVHTlVNCTE5CisKKyNkZWZpbmUgQ0NSX1JFR05VTSAgICAgIDIwCS8qIENvbnRhaW5zIHByb2Nlc3NvciBzdGF0dXMgKi8KKyNkZWZpbmUgUENfUkVHTlVNICAgICAgIDIxCS8qIENvbnRhaW5zIHByb2dyYW0gY291bnRlciAqLworCisjZGVmaW5lIENZQ0xFX1JFR05VTSAgICAyMgorI2RlZmluZSBJTlNUX1JFR05VTSAgICAgMjMKKyNkZWZpbmUgVElDS19SRUdOVU0gICAgIDI0CisKK2ludAorc2ltX3N0b3JlX3JlZ2lzdGVyIChzZCwgcm4sIHZhbHVlLCBsZW5ndGgpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgcm47CisgICAgIHVuc2lnbmVkIGNoYXIgKnZhbHVlOworICAgICBpbnQgbGVuZ3RoOworeworICBpbnQgc2VnID0gMDsKKyAgaW50IHJlZyA9IC0xOworCisgIGluaXRfcG9pbnRlcnMgKCk7CisgIHN3aXRjaCAocm4pCisgICAgeworICAgIGNhc2UgUENfUkVHTlVNOgorICAgICAgU0VUX1NFR1JFRyAoUl9DUCwgKHZhbHVlWzFdPDwxNikpOworICAgICAgY3B1LnJlZ3NbUl9QQ10uc1tMT1ddID0gKHZhbHVlWzJdIDw8IDgpIHwgdmFsdWVbM107CisgICAgICBicmVhazsKKyAgICBjYXNlIFNFR19DX1JFR05VTToKKyAgICBjYXNlIFNFR19EX1JFR05VTToKKyAgICBjYXNlIFNFR19FX1JFR05VTToKKyAgICBjYXNlIFNFR19UX1JFR05VTToKKyAgICAgIHNlZyA9IHJuIC0gU0VHX0NfUkVHTlVNICsgUl9DUDsKKyAgICAgIHJlZyA9IC0xOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIGNhc2UgUjBfUkVHTlVNOgorICAgIGNhc2UgUjFfUkVHTlVNOgorICAgIGNhc2UgUjJfUkVHTlVNOgorICAgIGNhc2UgUjNfUkVHTlVNOgorICAgIGNhc2UgUjRfUkVHTlVNOgorICAgIGNhc2UgUjVfUkVHTlVNOgorICAgIGNhc2UgUjZfUkVHTlVNOgorICAgIGNhc2UgUjdfUkVHTlVNOgorICAgICAgc2VnID0gMDsKKyAgICAgIHJlZyA9IHJuIC0gUjBfUkVHTlVNOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDQ1JfUkVHTlVNOgorICAgICAgc2VnID0gMDsKKyAgICAgIHJlZyA9IFJfU1I7CisgICAgICBicmVhazsKKyAgICBjYXNlIENZQ0xFX1JFR05VTToKKyAgICAgIGNwdS5jeWNsZXMgPSAodmFsdWVbMF0gPDwgMjQpIHwgKHZhbHVlWzFdIDw8IDE2KSB8ICh2YWx1ZVsyXSA8PCA4KSB8IHZhbHVlWzNdOworICAgICAgcmV0dXJuOworICAgIGNhc2UgSU5TVF9SRUdOVU06CisgICAgICBjcHUuaW5zdHMgPSAodmFsdWVbMF0gPDwgMjQpIHwgKHZhbHVlWzFdIDw8IDE2KSB8ICh2YWx1ZVsyXSA8PCA4KSB8IHZhbHVlWzNdOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVElDS19SRUdOVU06CisgICAgICBjcHUudGlja3MgPSAodmFsdWVbMF0gPDwgMjQpIHwgKHZhbHVlWzFdIDw8IDE2KSB8ICh2YWx1ZVsyXSA8PCA4KSB8IHZhbHVlWzNdOworICAgICAgcmV0dXJuOworICAgIGNhc2UgUFIwX1JFR05VTToKKyAgICBjYXNlIFBSMV9SRUdOVU06CisgICAgY2FzZSBQUjJfUkVHTlVNOgorICAgIGNhc2UgUFIzX1JFR05VTToKKyAgICBjYXNlIFBSNF9SRUdOVU06CisgICAgY2FzZSBQUjVfUkVHTlVNOgorICAgIGNhc2UgUFI2X1JFR05VTToKKyAgICBjYXNlIFBSN19SRUdOVU06CisgICAgICBTRVRfU0VHUkVHIChzZWdmb3JyZWdbcm5dLCB2YWx1ZVsxXSk7CisgICAgICByZWcgPSBybiAtIFBSMF9SRUdOVU07ICAgICAgCisgICAgICBjcHUucmVnc1tyZWddLnNbTE9XXSA9ICh2YWx1ZVsyXSA8PCA4KSB8IHZhbHVlWzNdOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoc2VnKQorICAgIFNFVF9TRUdSRUcgKHNlZywgdmFsdWVbMF0gPDwgMTYpOworCisgIGlmIChyZWcgPiAwKQorICAgIHsKKyAgICAgIGNwdS5yZWdzW3JlZ10uc1tMT1ddID0gKHZhbHVlWzBdIDw8IDgpIHwgdmFsdWVbMV07CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKK2ludAorc2ltX2ZldGNoX3JlZ2lzdGVyIChzZCwgcm4sIGJ1ZiwgbGVuZ3RoKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgaW50IHJuOworICAgICB1bnNpZ25lZCBjaGFyICpidWY7CisgICAgIGludCBsZW5ndGg7Cit7CisgIGluaXRfcG9pbnRlcnMgKCk7CisKKyAgc3dpdGNoIChybikKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICAgIGFib3J0ICgpOworICAgIGNhc2UgU0VHX0NfUkVHTlVNOgorICAgIGNhc2UgU0VHX0RfUkVHTlVNOgorICAgIGNhc2UgU0VHX0VfUkVHTlVNOgorICAgIGNhc2UgU0VHX1RfUkVHTlVNOgorICAgICAgYnVmWzBdID0gR0VUX1NFR1JFRyhybiAtIFNFR19DX1JFR05VTSArIFJfQ1ApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDQ1JfUkVHTlVNOgorICAgICAgYnVmWzBdID0gY3B1LnJlZ3NbUl9TUl0uc1tISUdIXTsKKyAgICAgIGJ1ZlsxXSA9IGNwdS5yZWdzW1JfU1JdLnNbTE9XXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUENfUkVHTlVNOgorICAgICAgYnVmWzBdID0gMDsKKyAgICAgIGJ1ZlsxXSA9IEdFVF9TRUdSRUcoUl9DUCk7CisgICAgICBidWZbMl0gPSBISUdIX0JZVEUgKGNwdS5yZWdzW1JfUENdLnNbTE9XXSk7CisgICAgICBidWZbM10gPSBMT1dfQllURSAoY3B1LnJlZ3NbUl9QQ10uc1tMT1ddKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQUjBfUkVHTlVNOgorICAgIGNhc2UgUFIxX1JFR05VTToKKyAgICBjYXNlIFBSMl9SRUdOVU06CisgICAgY2FzZSBQUjNfUkVHTlVNOgorICAgIGNhc2UgUFI0X1JFR05VTToKKyAgICBjYXNlIFBSNV9SRUdOVU06CisgICAgY2FzZSBQUjZfUkVHTlVNOgorICAgIGNhc2UgUFI3X1JFR05VTToKKyAgICAgIHJuIC09IFBSMF9SRUdOVU07CisgICAgICBidWZbMF0gPSAwOworICAgICAgYnVmWzFdID0gR0VUX1NFR1JFRyhzZWdmb3JyZWdbcm5dKTsKKyAgICAgIGJ1ZlsyXSA9IEhJR0hfQllURSAoY3B1LnJlZ3Nbcm5dLnNbTE9XXSk7CisgICAgICBidWZbM10gPSBMT1dfQllURSAoY3B1LnJlZ3Nbcm5dLnNbTE9XXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFIwX1JFR05VTToKKyAgICBjYXNlIFIxX1JFR05VTToKKyAgICBjYXNlIFIyX1JFR05VTToKKyAgICBjYXNlIFIzX1JFR05VTToKKyAgICBjYXNlIFI0X1JFR05VTToKKyAgICBjYXNlIFI1X1JFR05VTToKKyAgICBjYXNlIFI2X1JFR05VTToKKyAgICBjYXNlIFI3X1JFR05VTToKKyAgICAgIGJ1ZlswXSA9IEhJR0hfQllURSAoY3B1LnJlZ3Nbcm5dLnNbTE9XXSk7CisgICAgICBidWZbMV0gPSBMT1dfQllURSAoY3B1LnJlZ3Nbcm5dLnNbTE9XXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENZQ0xFX1JFR05VTToKKyAgICAgIGJ1ZlswXSA9IGNwdS5jeWNsZXMgPj4gMjQ7CisgICAgICBidWZbMV0gPSBjcHUuY3ljbGVzID4+IDE2OworICAgICAgYnVmWzJdID0gY3B1LmN5Y2xlcyA+PiA4OworICAgICAgYnVmWzNdID0gY3B1LmN5Y2xlcyA+PiAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRJQ0tfUkVHTlVNOgorICAgICAgYnVmWzBdID0gY3B1LnRpY2tzID4+IDI0OworICAgICAgYnVmWzFdID0gY3B1LnRpY2tzID4+IDE2OworICAgICAgYnVmWzJdID0gY3B1LnRpY2tzID4+IDg7CisgICAgICBidWZbM10gPSBjcHUudGlja3MgPj4gMDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBJTlNUX1JFR05VTToKKyAgICAgIGJ1ZlswXSA9IGNwdS5pbnN0cyA+PiAyNDsKKyAgICAgIGJ1ZlsxXSA9IGNwdS5pbnN0cyA+PiAxNjsKKyAgICAgIGJ1ZlsyXSA9IGNwdS5pbnN0cyA+PiA4OworICAgICAgYnVmWzNdID0gY3B1Lmluc3RzID4+IDA7CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAtMTsKK30KKworaW50CitzaW1fdHJhY2UgKHNkKQorICAgICBTSU1fREVTQyBzZDsKK3sKKworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkgKz0gMikKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyICpwID0gY3B1LnJlZ3NbUl9UUF0uYyArICgoY3B1LnJlZ3NbUjZdLnNbTE9XXSArIGkpICYgMHhmZmZmKTsKKyAgICAgIHVuc2lnbmVkIHNob3J0ICpqID0gKHVuc2lnbmVkIHNob3J0ICopIHA7CisKKyAgICAgIHByaW50ZiAoIiUwNHggIiwgKmopOworICAgIH0KKyAgcHJpbnRmICgiXG4iKTsKKyAgcHJpbnRmICgiJTAyeCAlMDJ4ICUwMnggJTAyeDolMDR4ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eFxuIiwKKwkgIE5PUk1BTF9EUCwKKwkgIE5PUk1BTF9FUCwKKwkgIE5PUk1BTF9UUCwKKwkgIE5PUk1BTF9DUCwKKwkgIGNwdS5yZWdzW1JfUENdLnNbTE9XXSwKKwkgIGNwdS5yZWdzWzBdLnNbTE9XXSwKKwkgIGNwdS5yZWdzWzFdLnNbTE9XXSwKKwkgIGNwdS5yZWdzWzJdLnNbTE9XXSwKKwkgIGNwdS5yZWdzWzNdLnNbTE9XXSwKKwkgIGNwdS5yZWdzWzRdLnNbTE9XXSwKKwkgIGNwdS5yZWdzWzVdLnNbTE9XXSwKKwkgIGNwdS5yZWdzWzZdLnNbTE9XXSwKKwkgIGNwdS5yZWdzWzddLnNbTE9XXSk7CisgIHNpbV9yZXN1bWUgKHNkLCAxLCAwKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3NpbV9zdG9wX3JlYXNvbiAoc2QsIHJlYXNvbiwgc2lncmMpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBlbnVtIHNpbV9zdG9wICpyZWFzb247CisgICAgIGludCAqc2lncmM7Cit7CisgICpyZWFzb24gPSBzaW1fc3RvcHBlZDsKKyAgKnNpZ3JjID0gY3B1LmV4Y2VwdGlvbjsKK30KKwordm9pZAorc2ltX3NldF9zaW1jYWNoZV9zaXplIChuKQoreworICBpZiAoY3B1LmNhY2hlKQorICAgIGZyZWUgKGNwdS5jYWNoZSk7CisgIGlmIChuIDwgMikKKyAgICBuID0gMjsKKyAgY3B1LmNhY2hlID0gKGRlY29kZWRfaW5zdCAqKSBtYWxsb2MgKHNpemVvZiAoZGVjb2RlZF9pbnN0KSAqIG4pOworICBjcHUuY3NpemUgPSBuOworfQorCit2b2lkCitzaW1fc2l6ZSAobikKKyAgICAgaW50IG47Cit7CisgIC8qIEZpeGVkIHNpemUuICAqLworfQorCit2b2lkCitzaW1faW5mbyAoc2QsIHZlcmJvc2UpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgdmVyYm9zZTsKK3sKKyAgZG91YmxlIHRpbWV0YWtlbiA9IChkb3VibGUpIGNwdS50aWNrcyAvIChkb3VibGUpIG5vd19wZXJzZWMgKCk7CisgIGRvdWJsZSB2aXJ0dGltZSA9IGNwdS5jeWNsZXMgLyAxMC4wZTY7CisKKyAgKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywKKwkJCQkgICAgIlxuXG5pbnN0cnVjdGlvbnMgZXhlY3V0ZWQgICUxMGRcbiIsCisJCQkJICAgIGNwdS5pbnN0cyk7CisgICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssCisJCQkJICAgICJjeWNsZXMgKHYgYXBwcm94aW1hdGUpICUxMGRcbiIsCisJCQkJICAgIGNwdS5jeWNsZXMpOworICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLAorCQkJCSAgICAicmVhbCB0aW1lIHRha2VuICAgICAgICAlMTAuNGZcbiIsCisJCQkJICAgIHRpbWV0YWtlbik7CisgICgqc2ltX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChzaW1fY2FsbGJhY2ssCisJCQkJICAgICJ2aXJ0dWFsIHRpbWUgdGFrZWQgICAgICUxMC40ZlxuIiwKKwkJCQkgICAgdmlydHRpbWUpOworICBpZiAodGltZXRha2VuKSAKKyAgICB7CisgICAgICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLAorCQkJCQkic2ltdWxhdGlvbiByYXRpbyAgICAgICAlMTAuNGZcbiIsCisJCQkJCXZpcnR0aW1lIC8gdGltZXRha2VuKTsKKyAgICB9CisgIAorICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLAorCQkJCSAgICAiY29tcGlsZXMgICAgICAgICAgICAgICAlMTBkXG4iLAorCQkJCSAgICBjcHUuY29tcGlsZXMpOworICAoKnNpbV9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoc2ltX2NhbGxiYWNrLAorCQkJCSAgICAiY2FjaGUgc2l6ZSAgICAgICAgICAgICAlMTBkXG4iLAorCQkJCSAgICBjcHUuY3NpemUpOworfQorCitTSU1fREVTQworc2ltX29wZW4gKGtpbmQsIGNiLCBhYmZkLCBhcmd2KQorICAgICBTSU1fT1BFTl9LSU5EIGtpbmQ7CisgICAgIGhvc3RfY2FsbGJhY2sgKmNiOworICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIHNpbV9raW5kID0ga2luZDsKKyAgbXluYW1lID0gYXJndlswXTsKKyAgc2ltX2NhbGxiYWNrID0gY2I7CisgIC8qIGZ1ZGdlIG91ciBkZXNjcmlwdG9yICovCisgIHJldHVybiAoU0lNX0RFU0MpIDE7Cit9CisKK3ZvaWQKK3NpbV9jbG9zZSAoc2QsIHF1aXR0aW5nKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgaW50IHF1aXR0aW5nOworeworICAvKiBub3RoaW5nIHRvIGRvICovCit9CisKK1NJTV9SQworc2ltX2xvYWQgKHNkLCBwcm9nLCBhYmZkLCBmcm9tX3R0eSkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGNoYXIgKnByb2c7CisgICAgIGJmZCAqYWJmZDsKKyAgICAgaW50IGZyb21fdHR5OworeworICBleHRlcm4gYmZkICpzaW1fbG9hZF9maWxlICgpOyAvKiA/Pz8gRG9uJ3Qga25vdyB3aGVyZSB0aGlzIHNob3VsZCBsaXZlLiAgKi8KKyAgYmZkICpwcm9nX2JmZDsKKworICBwcm9nX2JmZCA9IHNpbV9sb2FkX2ZpbGUgKHNkLCBteW5hbWUsIHNpbV9jYWxsYmFjaywgcHJvZywgYWJmZCwKKwkJCSAgICBzaW1fa2luZCA9PSBTSU1fT1BFTl9ERUJVRywKKwkJCSAgICAwLCBzaW1fd3JpdGUpOworICBpZiAocHJvZ19iZmQgPT0gTlVMTCkKKyAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisgIGlmIChhYmZkID09IE5VTEwpCisgICAgYmZkX2Nsb3NlIChwcm9nX2JmZCk7CisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKK1NJTV9SQworc2ltX2NyZWF0ZV9pbmZlcmlvciAoc2QsIGFiZmQsIGFyZ3YsIGVudikKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIHN0cnVjdCBfYmZkICphYmZkOworICAgICBjaGFyICoqYXJndjsKKyAgICAgY2hhciAqKmVudjsKK3sKKyAgaW50IHBjOworICBiZmRfdm1hIHN0YXJ0X2FkZHJlc3M7CisgIGlmIChhYmZkICE9IE5VTEwpCisgICAgc3RhcnRfYWRkcmVzcyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CisgIGVsc2UKKyAgICBzdGFydF9hZGRyZXNzID0gMDsKKworICAvKiA/Pz8gV2UgYXNzdW1lIHRoaXMgaXMgYSA0IGJ5dGUgcXVhbnRpdHkuICAqLworICBwYyA9IHN0YXJ0X2FkZHJlc3M7CisKKyAgc2ltX3N0b3JlX3JlZ2lzdGVyIChzZCwgUENfUkVHTlVNLCAodW5zaWduZWQgY2hhciAqKSAmcGMsIDQpOworICByZXR1cm4gU0lNX1JDX09LOworfQorCit2b2lkCitzaW1fZG9fY29tbWFuZCAoc2QsIGNtZCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGNoYXIgKmNtZDsKK3sKKyAgKCpzaW1fY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKHNpbV9jYWxsYmFjaywKKwkJCQkgICAgIlRoaXMgc2ltdWxhdG9yIGRvZXMgbm90IGFjY2VwdCBhbnkgY29tbWFuZHMuXG4iKTsKK30KKwordm9pZAorc2ltX3NldF9jYWxsYmFja3MgKHB0cikKKyAgICAgc3RydWN0IGhvc3RfY2FsbGJhY2tfc3RydWN0ICpwdHI7Cit7CisgIHNpbV9jYWxsYmFjayA9IHB0cjsKK30KZGlmZiAtLWdpdCBhL3NpbS9oODUwMC9jb25maWcuaW4gYi9zaW0vaDg1MDAvY29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmODdhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaDg1MDAvY29uZmlnLmluCkBAIC0wLDAgKzEsMTU4IEBACisvKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KKyN1bmRlZiBDX0FMTE9DQQorCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCisjdW5kZWYgY29uc3QKKworLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgorICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KKyN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KKyN1bmRlZiBIQVZFX0FMTE9DQQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KKyN1bmRlZiBIQVZFX0FMTE9DQV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KKyN1bmRlZiBIQVZFX01NQVAKKworLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KKyN1bmRlZiBpbmxpbmUKKworLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBvZmZfdAorCisvKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KKyN1bmRlZiBfUE9TSVhfU09VUkNFCisKKy8qIERlZmluZSBhcyB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIChpbnQgb3Igdm9pZCkuICAqLworI3VuZGVmIFJFVFNJR1RZUEUKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgc2l6ZV90CisKKy8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQorICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCisgICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCisgU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcworIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcworIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCisgKi8KKyN1bmRlZiBTVEFDS19ESVJFQ1RJT04KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KKyN1bmRlZiBTVERDX0hFQURFUlMKKworLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCisjdW5kZWYgRU5BQkxFX05MUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCisjdW5kZWYgSEFWRV9HRVRURVhUCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLworI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX3NldGZwdWN3IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fU0VURlBVQ1cKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfRENHRVRURVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0dFVENXRAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cnVzYWdlIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0dFVFJVU0FHRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9NVU5NQVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfUFVURU5WCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NFVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRMT0NBTEUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzaWdhY3Rpb24gZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0lHQUNUSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDSFIKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0aW1lIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1RJTUUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9BUkdaX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfRkNOVExfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmcHVfY29udHJvbC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9GUFVfQ09OVFJPTF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9MSU1JVFNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTE9DQUxFX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX01BTExPQ19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX05MX1RZUEVTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NUUklOR1NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Jlc291cmNlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19USU1FX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9USU1FX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9WQUxVRVNfSApkaWZmIC0tZ2l0IGEvc2ltL2g4NTAwL2NvbmZpZ3VyZSBiL3NpbS9oODUwMC9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2U0Y2ZiMAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9oODUwMC9jb25maWd1cmUKQEAgLTAsMCArMSwzODkyIEBACisjISAvYmluL3NoCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3NpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisjIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKKyMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KKworIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMworCisKKworCisKKyMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKKworCisjIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKKworCisjIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIEN5Z3dpbjMyLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgQ1lHV0lOMzIgdG8gInllcyIuCisjIE90aGVyd2lzZSBzZXQgaXQgdG8gIm5vIi4KKworCisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgV2luMzIsIHdpdGhvdXQgdXNpbmcKKyMgQUNfQ0FOT05JQ0FMXyouICBJZiBzbywgc2V0IG91dHB1dCB2YXJpYWJsZSBFWEVFWFQgdG8gIi5leGUiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICIiLgorCisKKworCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCisgICAgZXhpdCAwIDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Li9jb25maWcubG9nCisKK2VjaG8gIlwKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorIiAxPiY1CisKKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCithY19jb25maWd1cmVfYXJncz0KK2ZvciBhY19hcmcKK2RvCisgIGNhc2UgIiRhY19hcmciIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBlc2FjCitkb25lCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKyMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCisjIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCitpZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID4gY29uZmRlZnMuaAorCisjIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0CisjIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCithY19leGVleHQ9CithY19vYmpleHQ9bworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2Nzc6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBDUFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKKyAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KKyAgQ1BQPSIke0NDLWNjfSAtRSIKKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjkyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2OTg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDcwOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NzE1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3MjYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjczMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0vbGliL2NwcAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCisgIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgorZWxzZQorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCitlY2hvICIkYWNfdCIiJENQUCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3NTc6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQorc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKK2FsbDoKKwlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJworRU9GCisjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KK2V2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAoraWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKK2Vsc2UKKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KK2ZpCitybSAtZiBjb25mdGVzdG1ha2UKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIFNFVF9NQUtFPQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc4NDogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQoraWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCisgIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKK3RoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCitFT0YKKworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENDPSIkQ0MgLXBvc2l4IgorICBlbHNlCisgICAgQ0M9IiRDQyAtWHAiCisgIGZpCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBJU0M9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODA1OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4MTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjgxODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4MzUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODUzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICA6CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDg3NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQoraWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKK2V4aXQgKDApOyB9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4ODU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgOgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTA5OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDkxNCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwordHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OworLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK2NoYXIgY29uc3QgKmNvbnN0ICpjY3A7CitjaGFyICoqcDsKKy8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCitzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CitzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKKy8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KKyAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQorICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KK2NvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKK2NjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKy8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCisrK2NjcDsKK3AgPSAoY2hhcioqKSBjY3A7CitjY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKK3sgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgKnQ7CisgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7CisKKyAgKnQrKyA9IDA7Cit9Cit7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLworICBpbnQgeFtdID0gezI1LCAxN307CisgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICsrZm9vOworfQoreyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOworICBpcHRyIHAgPSAwOworICArK3A7Cit9Cit7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKKyAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OworICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Cit9Cit7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLworICBjb25zdCBpbnQgZm9vID0gMTA7Cit9CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5NjM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgY29uc3QgCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTg0OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX2N2X2NfaW5saW5lPW5vCitmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDk5MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworfSAkYWNfa3cgZm9vKCkgeworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk5ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitmaQorcm0gLWYgY29uZnRlc3QqCitkb25lCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKK2Nhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KKyAgaW5saW5lIHwgeWVzKSA7OworICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGlubGluZSAKK0VPRgorIDs7CisgICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCitFT0YKKyA7OworZXNhYworCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwMjQ6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwMjkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgb2ZmX3QgbG9uZworRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwNTc6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA2MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAic2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZAorRU9GCisKK2ZpCisKKyMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCisjIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwOTI6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDk3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhbGxvY2EuaD4KK2ludCBtYWluKCkgeworY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTI1OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExMzAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZWxzZQorIyBpZmRlZiBfTVNDX1ZFUgorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgZWxzZQorIyAgaWYgSEFWRV9BTExPQ0FfSAorIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KK2NoYXIgKmFsbG9jYSAoKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0EgMQorRU9GCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KKyAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKKyAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCisgICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAorICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KKyAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIENfQUxMT0NBIDEKK0VPRgorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExOTA6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTk1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKK3dlYmVjcmF5CisjZWxzZQord2Vub3RiZWNyYXkKKyNlbmRpZgorCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9vc19jcmF5PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCitmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIyMDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTIyNSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjQ4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCitFT0YKKworICBicmVhaworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2RvbmUKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyNzU6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjgzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK2ZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCit7CisgIHN0YXRpYyBjaGFyICphZGRyID0gMDsKKyAgYXV0byBjaGFyIGR1bW15OworICBpZiAoYWRkciA9PSAwKQorICAgIHsKKyAgICAgIGFkZHIgPSAmZHVtbXk7CisgICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKK30KK21haW4gKCkKK3sKKyAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQorZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KK0VPRgorCitmaQorCitmb3IgYWNfaGRyIGluIHVuaXN0ZC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTMyNzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzMzIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTM2NjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM3MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzk0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDE5OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNDI3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCisgICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKKwltbWFwIHByaXZhdGUgbm90IGZpeGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisJbW1hcCBzaGFyZWQgbm90IGZpeGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKKyAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKKyAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQorICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQorICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCisgICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQorICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKKyAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgorCisgICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCisgICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgorICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCisgICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisvKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCisjaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKyMgaWZkZWYgSEFWRV9VTklTVERfSAorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGVuZGlmCisKKy8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCisjIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisjIGVuZGlmCisKKyMgaWZkZWYgX1NDX1BBR0VTSVpFCisjICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKKyMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKyMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCisjICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKKyMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgICAgaWZkZWYgTkJQRworIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQorIyAgICAgaWZuZGVmIENMU0laRQorIyAgICAgIGRlZmluZSBDTFNJWkUgMQorIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCisjICAgIGVsc2UgLyogbm8gTkJQRyAqLworIyAgICAgaWZkZWYgTkJQQworIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKKyMgICAgIGVsc2UgLyogbm8gTkJQQyAqLworIyAgICAgIGlmZGVmIFBBR0VTSVpFCisjICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCisjICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KKyMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KKyMgICAgZW5kaWYgLyogbm8gTkJQRyAqLworIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCisjICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLworCisjZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9CisjZWxzZQorY2hhciAqbWFsbG9jKCk7CisjZW5kaWYKKworaW50CittYWluKCkKK3sKKwljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKKwlpbnQgaSwgcGFnZXNpemU7CisJaW50IGZkOworCisJcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOworCisJLyoKKwkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCisJICovCisJZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKKwl1bWFzaygwKTsKKwlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKworCS8qCisJICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCisJICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAorCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCisJICovCisJZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEyKQorCQlleGl0KDEpOworCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKKwlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQorCQkJZXhpdCgxKTsKKworCS8qCisJICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKKwkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCisJICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCisJICovCisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7CisJZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YTMpCisJCWV4aXQoMSk7CisJaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCisJCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOworCWV4aXQoMCk7Cit9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTY3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTU1BUCAxCitFT0YKKworZmkKKworCisjIGF1dG9jb25mLmluZm8gc2F5cyB0aGlzIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgQUNfSU5JVC4KKworCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCithY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKK2FjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisKKyMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgorIyBUaGUgaW5wdXRzIGFyZToKKyMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAorIworIyBUaGUgcnVsZXMgYXJlOgorIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKKyMgICAgc2FtZSB0aW1lLgorIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KKyMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAorIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KKyMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KKyMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCisKKyMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KKyMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KK2Nhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgorTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OworKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCisKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgoraWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2NDA6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorCitob3N0X2FsaWFzPSRob3N0CitjYXNlICIkaG9zdF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKQorICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKKyAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaSA7OworICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKK2hvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY2MTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKwordGFyZ2V0X2FsaWFzPSR0YXJnZXQKK2Nhc2UgIiR0YXJnZXRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKwordGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAordGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK3RhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCit0YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY3OTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorCitidWlsZF9hbGlhcz0kYnVpbGQKK2Nhc2UgIiRidWlsZF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKK2J1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitidWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgorCit0ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCisgIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKKyAgICBOT05FTk9ORXMseCx4LCAmJgorICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCisKK2lmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQorZWxzZQorICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCisgIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKK3MsXFwsXFxcXCxnOyBzLFwkLCQkLGcKK0VPRl9TRUQKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKKyAgcm0gLWYgY29uZnRlc3RzZWQKK2ZpCit0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KK3Rlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKworIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgordGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3MjM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3NTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODAyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorIDs7CisgICAgZXNhYworICBmaQorICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODMzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxODQzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK21haW4oKXtyZXR1cm4oMCk7fQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4NDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcworICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCisgIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KKyAgZWxzZQorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCisgIGZpCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODY3OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1CitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTg3MjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg4MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2N2X3Byb2dfZ2NjPXllcworZWxzZQorICBhY19jdl9wcm9nX2djYz1ubworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKKworaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorCithY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKK2FjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTAwOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYworaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19nPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQorCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5NDM6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisKKyMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KK2lmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisgIENDX0ZPUl9CVUlMRD0nJChDQyknCitlbHNlCisgIENDX0ZPUl9CVUlMRD1nY2MKK2ZpCisKKworCisKK0FSPSR7QVItYXJ9CisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjAwOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKK2ZpCitmaQorUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworQUxMX0xJTkdVQVM9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAordW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDQzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjA0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjA1MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAorX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwODM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIwODggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjExMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCisgICAgIGZvciBhY19mdW5jIGluIHN0cGNweQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjE0MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjE0NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmaQorICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KKyAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1RQQ1BZIDEKK0VPRgorCisgICBmaQorCisgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyMDI6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjIwNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bG9jYWxlLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiBMQ19NRVNTQUdFUworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgorICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQorRU9GCisKKyAgICBmaQorICBmaQorICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjM1OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCisgIFVTRV9OTFM9JGVuYWJsZXZhbAorZWxzZQorICBVU0VfTkxTPXllcworZmkKKworICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgorICAgIAorCisgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KKworICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEVOQUJMRV9OTFMgMQorRU9GCisKKyAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyNTU6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKK2Vsc2UKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubworZmkKKworICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2CisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KKwlubHNfY3ZfaGVhZGVyX2xpYmd0PQorCUNBVE9CSkVYVD1OT05FCisKKwlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjI3NDogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjI3OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjg0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjMwMTogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzA2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzEzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKwkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMjk6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQorYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1saW50bCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzM3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgYmluZHRleHRkb21haW4oKTsKKworaW50IG1haW4oKSB7CitiaW5kdGV4dGRvbWFpbigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjM2NDogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzY5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM3NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0dFVFRFWFQgMQorRU9GCisKKwkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0MDQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisJICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgorCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0Mzg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI0NDMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ2NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQ5MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjUyODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNTYwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CitleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CisJCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9LmdtbworCQkgICBEQVRBRElSTkFNRT1zaGFyZQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9Lm1vCisJCSAgIERBVEFESVJOQU1FPWxpYgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCQlJTlNUT0JKRVhUPS5tbworCSAgICAgIGZpCisJICAgIGZpCisJCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisJICAgICAgICAKKyAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KKwkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCisgICAgICAgIGZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjYwMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KKwlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2MzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2Njk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KKwkgIDogOworCWVsc2UKKwkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCisgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKKyAgICBkb25lCisKKyAgICAgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgIAorCisgICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCisgICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCisgICAgICAgTElOR1VBUz0KKyAgICAgZWxzZQorICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3NTk6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQorICAgICAgIE5FV19MSU5HVUFTPQorICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbworICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgorICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7CisgICAgICAgICBlc2FjCisgICAgICAgZG9uZQorICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCisgICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2CisgICAgIGZpCisKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCisgICAgIGZpCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKKyAgIGVsc2UKKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAorLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgorICAgZmkKKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgorICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KKwkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3ODc6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI3OTIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc5NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIG1zZ2Zvcm1hdD1saW51eAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK21zZ2Zvcm1hdD14b3BlbgorZmkKKworCisJICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCisgICAgICBmaQorICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCisJICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICAKKyAgIAorCisgICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCisgICAKKworICAgICAgbD0KKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgCisKKyMgQ2hlY2sgZm9yIGNvbW1vbiBoZWFkZXJzLgorIyBGSVhNRTogU2VlbXMgdG8gbWUgdGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgZm9yIGkzODYtd2luZG93cyBob3N0cy4KKyMgQXQgb25lIHBvaW50IHRoZXJlIHdlcmUgaGFyZGNvZGVkIEFDX0RFRklORSdzIGlmICR7aG9zdH0gPSBpMzg2LSotd2luZG93cyouCitmb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB1bmlzdGQuaCB0aW1lLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyODY2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjg3MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg3NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19oZHIgaW4gc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5MDY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTExICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTE2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2hkciBpbiBmY250bC5oIGZwdV9jb250cm9sLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTQ2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjk1MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHJ1c2FnZSB0aW1lIHNpZ2FjdGlvbiBfX3NldGZwdWN3CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTg1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTkwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworIyBDaGVjayBmb3Igc29ja2V0IGxpYnJhcmllcworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMwNDA6IGNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nYmluZCB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxzb2NrZXQgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzA0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGJpbmQoKTsKKworaW50IG1haW4oKSB7CitiaW5kKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDU5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHNvY2tldCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9saWIgMQorRU9GCisKKyAgTElCUz0iLWxzb2NrZXQgJExJQlMiCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzA4NzogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQorYWNfbGliX3Zhcj1gZWNobyBuc2wnXydnZXRob3N0YnluYW1lIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbG5zbCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDk1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZ2V0aG9zdGJ5bmFtZSgpOworCitpbnQgbWFpbigpIHsKK2dldGhvc3RieW5hbWUoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbnNsIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2xpYiAxCitFT0YKKworICBMSUJTPSItbG5zbCAkTElCUyIKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0CisKKworCitVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlNQUlOVD0iIiBVU0VfTUFJTlRBSU5FUl9NT0RFPXllcyA7OworICBubykJTUFJTlQ9IiMiIDs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLW1haW50YWluZXItbW9kZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IE1BSU5UPSIjIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQorZmkKK2Vsc2UKKyAgTUFJTlQ9IiMiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSAtRFVTRV9CU1dBUD0xIjs7CisgIG5vKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0wIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1ic3dhcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ic3dhcD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9ic3dhcD0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY2ZsYWdzIG9yIC0tZGlzYWJsZS1zaW0tY2ZsYWdzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jZmxhZ3MiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQkgc2ltX2NmbGFncz0iLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIjs7CisgIHRyYWNlKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJQbGVhc2UgdXNlIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpbnN0ZWFkLiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2NmbGFncz0iIjs7CisgIG5vKQkgc2ltX2NmbGFncz0iIjs7CisgICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2NmbGFncz0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVidWcgb3IgLS1kaXNhYmxlLXNpbS1kZWJ1ZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWJ1ZyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpIHNpbV9kZWJ1Zz0iLURERUJVRz03IC1EV0lUSF9ERUJVRz03Ijs7CisgIG5vKSAgc2ltX2RlYnVnPSItRERFQlVHPTAgLURXSVRIX0RFQlVHPTAiOzsKKyAgKikgICBzaW1fZGVidWc9Ii1EREVCVUc9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfREVCVUc9Jygke2VuYWJsZXZhbH0pJyI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWJ1ZyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIGRlYnVnID0gJHNpbV9kZWJ1ZyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2RlYnVnPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zdGRpbyBvciAtLWRpc2FibGUtc2ltLXN0ZGlvIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zdGRpbytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N0ZGlvIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7CisgIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zdGRpbyIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGlvPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkaW8iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHN0ZGlvIGZsYWdzID0gJHNpbV9zdGRpbyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3N0ZGlvPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS10cmFjZSBvciAtLWRpc2FibGUtc2ltLXRyYWNlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV90cmFjZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3RyYWNlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3RyYWNlPSItRFRSQUNFPTEgLURXSVRIX1RSQUNFPS0xIjs7CisgIG5vKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MCAtRFdJVEhfVFJBQ0U9MCI7OworICBbLTAtOV0qKQorCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fdHJhY2U9IiIKKwlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKwkgIGlmIHRlc3QgeCIkc2ltX3RyYWNlIiA9IHg7IHRoZW4KKwkgICAgc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9JyhUUkFDRV8keCIKKwkgIGVsc2UKKwkgICAgc2ltX3RyYWNlPSIke3NpbV90cmFjZX18VFJBQ0VfJHgiCisJICBmaQorCWRvbmUKKwlzaW1fdHJhY2U9IiRzaW1fdHJhY2UpJyIgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSB0cmFjZSA9ICRzaW1fdHJhY2UiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV90cmFjZT0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcHJvZmlsZSBvciAtLWRpc2FibGUtc2ltLXByb2ZpbGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3Byb2ZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9wcm9maWxlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7CisgIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OworICBbLTAtOV0qKQorCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fcHJvZmlsZT0iIgorCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbworCSAgaWYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgPSB4OyB0aGVuCisJICAgIHNpbV9wcm9maWxlPSItRFdJVEhfUFJPRklMRT0nKFBST0ZJTEVfJHgiCisJICBlbHNlCisJICAgIHNpbV9wcm9maWxlPSIke3NpbV9wcm9maWxlfXxQUk9GSUxFXyR4IgorCSAgZmkKKwlkb25lCisJc2ltX3Byb2ZpbGU9IiRzaW1fcHJvZmlsZSknIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9wcm9maWxlIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gcHJvZmlsZSA9ICRzaW1fcHJvZmlsZSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3Byb2ZpbGU9IiIKK2ZpCisKKworCitlY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMyODI6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMjg3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBzaWduYWwKKyN1bmRlZiBzaWduYWwKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7CisjZWxzZQordm9pZCAoKnNpZ25hbCAoKSkgKCk7CisjZW5kaWYKKworaW50IG1haW4oKSB7CitpbnQgaTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzA0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpZ25hbD1pbnQKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCitFT0YKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzMyNDogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkQ1lHV0lOMzIiID0geWVzOyB0aGVuCithbV9jdl9leGVleHQ9LmV4ZQorZWxzZQorY2F0ID4gYW1fY190ZXN0LmMgPDwgJ0VPRicKK2ludCBtYWluKCkgeworLyogTm90aGluZyBuZWVkZWQgaGVyZSAqLworfQorRU9GCiske0NDLWNjfSAtbyBhbV9jX3Rlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgYW1fY190ZXN0LmMgJExJQlMgMT4mNQorYW1fY3ZfZXhlZXh0PWBscyBhbV9jX3Rlc3QuKiB8IGdyZXAgLXYgYW1fY190ZXN0LmMgfCBzZWQgLWUgcy9hbV9jX3Rlc3QvL2AKK3JtIC1mIGFtX2NfdGVzdCoKK2ZpCisKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iID0geCAmJiBhbV9jdl9leGVleHQ9bm8KK2ZpCitFWEVFWFQ9IiIKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthbV9jdl9leGVleHR9CitlY2hvICIkYWNfdCIiJHthbV9jdl9leGVleHR9IiAxPiY2CisKKworc2ltX2xpbmtfZmlsZXM9CitzaW1fbGlua19saW5rcz0KKworc2ltX2xpbmtfbGlua3M9dGNvbmZpZy5oCitpZiB0ZXN0IC1mICR7c3JjZGlyfS90Y29uZmlnLmluCit0aGVuCisgIHNpbV9saW5rX2ZpbGVzPXRjb25maWcuaW4KK2Vsc2UKKyAgc2ltX2xpbmtfZmlsZXM9Li4vY29tbW9uL3Rjb25maWcuaW4KK2ZpCisKKyMgdGFyZy12YWxzLmRlZiBwb2ludHMgdG8gdGhlIGxpYmMgbWFjcm8gZGVzY3JpcHRpb24gZmlsZS4KK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyotKi0qKSBUQVJHX1ZBTFNfREVGPS4uL2NvbW1vbi9ubHR2YWxzLmRlZiA7OworZXNhYworc2ltX2xpbmtfZmlsZXM9IiR7c2ltX2xpbmtfZmlsZXN9ICR7VEFSR19WQUxTX0RFRn0iCitzaW1fbGlua19saW5rcz0iJHtzaW1fbGlua19saW5rc30gdGFyZy12YWxzLmRlZiIKKworCisKK2ZvciBhY19oZHIgaW4gc3RkbGliLmggdGltZS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzM3MjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMzNzcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjMzODI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisKKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCithY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAc2ltX2Vudmlyb25tZW50QCUkc2ltX2Vudmlyb25tZW50JWcKK3MlQHNpbV9hbGlnbm1lbnRAJSRzaW1fYWxpZ25tZW50JWcKK3MlQHNpbV9hc3NlcnRAJSRzaW1fYXNzZXJ0JWcKK3MlQHNpbV9iaXRzaXplQCUkc2ltX2JpdHNpemUlZworcyVAc2ltX2VuZGlhbkAlJHNpbV9lbmRpYW4lZworcyVAc2ltX2hvc3RlbmRpYW5AJSRzaW1faG9zdGVuZGlhbiVnCitzJUBzaW1fZmxvYXRAJSRzaW1fZmxvYXQlZworcyVAc2ltX3NjYWNoZUAlJHNpbV9zY2FjaGUlZworcyVAc2ltX2RlZmF1bHRfbW9kZWxAJSRzaW1fZGVmYXVsdF9tb2RlbCVnCitzJUBzaW1faHdfY2ZsYWdzQCUkc2ltX2h3X2NmbGFncyVnCitzJUBzaW1faHdfb2Jqc0AlJHNpbV9od19vYmpzJWcKK3MlQHNpbV9od0AlJHNpbV9odyVnCitzJUBzaW1faW5saW5lQCUkc2ltX2lubGluZSVnCitzJUBzaW1fcGFja2FnZXNAJSRzaW1fcGFja2FnZXMlZworcyVAc2ltX3JlZ3Bhcm1AJSRzaW1fcmVncGFybSVnCitzJUBzaW1fcmVzZXJ2ZWRfYml0c0AlJHNpbV9yZXNlcnZlZF9iaXRzJWcKK3MlQHNpbV9zbXBAJSRzaW1fc21wJWcKK3MlQHNpbV9zdGRjYWxsQCUkc2ltX3N0ZGNhbGwlZworcyVAc2ltX3hvcl9lbmRpYW5AJSRzaW1feG9yX2VuZGlhbiVnCitzJUBidWlsZF93YXJuaW5nc0AlJGJ1aWxkX3dhcm5pbmdzJWcKK3MlQFNIRUxMQCUkU0hFTEwlZworcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBERUZTQCUkREVGUyVnCitzJUBMREZMQUdTQCUkTERGTEFHUyVnCitzJUBMSUJTQCUkTElCUyVnCitzJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKK3MlQHByZWZpeEAlJHByZWZpeCVnCitzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCitzJUBiaW5kaXJAJSRiaW5kaXIlZworcyVAc2JpbmRpckAlJHNiaW5kaXIlZworcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworcyVAZGF0YWRpckAlJGRhdGFkaXIlZworcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZworcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCitzJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCitzJUBsaWJkaXJAJSRsaWJkaXIlZworcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworcyVAaW5mb2RpckAlJGluZm9kaXIlZworcyVAbWFuZGlyQCUkbWFuZGlyJWcKK3MlQGhvc3RAJSRob3N0JWcKK3MlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKK3MlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCitzJUBob3N0X29zQCUkaG9zdF9vcyVnCitzJUB0YXJnZXRAJSR0YXJnZXQlZworcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKK3MlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKK3MlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKK3MlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCitzJUBidWlsZEAlJGJ1aWxkJWcKK3MlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZworcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKK3MlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCitzJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKK3MlQENDQCUkQ0MlZworcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKK3MlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCitzJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZworcyVASERFRklORVNAJSRIREVGSU5FUyVnCitzJUBBUkAlJEFSJWcKK3MlQFJBTkxJQkAlJFJBTkxJQiVnCitzJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKK3MlQENQUEAlJENQUCVnCitzJUBBTExPQ0FAJSRBTExPQ0ElZworcyVAVVNFX05MU0AlJFVTRV9OTFMlZworcyVATVNHRk1UQCUkTVNHRk1UJWcKK3MlQEdNU0dGTVRAJSRHTVNHRk1UJWcKK3MlQFhHRVRURVhUQCUkWEdFVFRFWFQlZworcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCitzJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKK3MlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCitzJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKK3MlQEdNT0ZJTEVTQCUkR01PRklMRVMlZworcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZworcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCitzJUBJTlRMTElCU0AlJElOVExMSUJTJWcKK3MlQElOVExPQkpTQCUkSU5UTE9CSlMlZworcyVAUE9GSUxFU0AlJFBPRklMRVMlZworcyVAUE9TVUJAJSRQT1NVQiVnCitzJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCitzJUBHVF9OT0AlJEdUX05PJWcKK3MlQEdUX1lFU0AlJEdUX1lFUyVnCitzJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCitzJUBsQCUkbCVnCitzJUBNQUlOVEAlJE1BSU5UJWcKK3MlQHNpbV9ic3dhcEAlJHNpbV9ic3dhcCVnCitzJUBzaW1fY2ZsYWdzQCUkc2ltX2NmbGFncyVnCitzJUBzaW1fZGVidWdAJSRzaW1fZGVidWclZworcyVAc2ltX3N0ZGlvQCUkc2ltX3N0ZGlvJWcKK3MlQHNpbV90cmFjZUAlJHNpbV90cmFjZSVnCitzJUBzaW1fcHJvZmlsZUAlJHNpbV9wcm9maWxlJWcKK3MlQEVYRUVYVEAlJEVYRUVYVCVnCisKK0NFT0YKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KK2FjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCithY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19tb3JlX2xpbmVzPToKK2FjX3NlZF9jbWRzPSIiCit3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBmaQorICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCisgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZWxzZQorICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZmkKKyAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKyAgICBhY19iZWc9JGFjX2VuZAorICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgYWNfc2VkX2NtZHM9Y2F0CitmaQorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitDT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKyAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCisgIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCitzJUBJTlNUQUxMQCUkSU5TVEFMTCVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKKyMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyMKKyMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KK2FjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJworYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCithY19kQz0nXDMnCithY19kRD0nJWcnCisjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKK2FjX3VDPScgJworYWNfdUQ9J1w0JWcnCisjIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY19lQj0nJCVcMSNcMmRlZmluZVwzJworYWNfZUM9JyAnCithY19lRD0nJWcnCisKK2lmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmaQorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQorCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0CisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgorCitFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKKyMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKK2NhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKK3MvW1xcJiVdL1xcJi9nCitzJVtcXCRgXSVcXCYlZworcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKK3MlYWNfZCVhY191JWdwCitzJWFjX3UlYWNfZSVncAorRU9GCitzZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCitybSAtZiBjb25mdGVzdC5oZHIKKworIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgorIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCitjYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKK3MlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCitFT0YKKworIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCisjIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgorCitybSAtZiBjb25mdGVzdC50YWlsCit3aGlsZSA6CitkbworICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCisgICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KKyAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQorICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KKyAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCisnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAorICBybSAtZiBjb25mdGVzdC52YWxzCisgIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscworZG9uZQorcm0gLWYgY29uZnRlc3QudmFscworCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAorICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKKyAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCisgICAgcm0gLWYgY29uZnRlc3QuaAorICBlbHNlCisgICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBmaQorICAgIHJtIC1mICRhY19maWxlCisgICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQorICBmaQorZmk7IGRvbmUKKworRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorYWNfc291cmNlcz0iJHNpbV9saW5rX2ZpbGVzIgorYWNfZGVzdHM9IiRzaW1fbGlua19saW5rcyIKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitzcmNkaXI9JGFjX2dpdmVuX3NyY2Rpcgord2hpbGUgdGVzdCAtbiAiJGFjX3NvdXJjZXMiOyBkbworICBzZXQgJGFjX2Rlc3RzOyBhY19kZXN0PSQxOyBzaGlmdDsgYWNfZGVzdHM9JCoKKyAgc2V0ICRhY19zb3VyY2VzOyBhY19zb3VyY2U9JDE7IHNoaWZ0OyBhY19zb3VyY2VzPSQqCisKKyAgZWNobyAibGlua2luZyAkc3JjZGlyLyRhY19zb3VyY2UgdG8gJGFjX2Rlc3QiCisKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3NvdXJjZTsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBGaWxlIG5vdCBmb3VuZCIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCisgIHJtIC1mICRhY19kZXN0CisKKyAgIyBNYWtlIHJlbGF0aXZlIHN5bWxpbmtzLgorICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGVzdF9kaXI9YGVjaG8gJGFjX2Rlc3R8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9ICIkYWNfZGVzdCIgJiYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZGVzdCBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2Rlc3RfZGlyIiAmJiBta2RpciAiJGFjX2Rlc3RfZGlyIgorICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kZXN0X2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGVzdF9kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rlc3RfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkc3JjZGlyIiBpbgorICBbLyRdKikgYWNfcmVsX3NvdXJjZT0iJHNyY2Rpci8kYWNfc291cmNlIiA7OworICAqKSBhY19yZWxfc291cmNlPSIkYWNfZG90cyRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKKyAgZXNhYworCisgICMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGU7IG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsuCisgIGlmIGxuIC1zICRhY19yZWxfc291cmNlICRhY19kZXN0IDI+L2Rldi9udWxsIHx8CisgICAgbG4gJHNyY2Rpci8kYWNfc291cmNlICRhY19kZXN0OyB0aGVuIDoKKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBsaW5rICRhY19kZXN0IHRvICRzcmNkaXIvJGFjX3NvdXJjZSIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitkb25lCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2Nhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgorIHhNYWtlZmlsZSopCisgICBlY2hvICJNZXJnaW5nIE1ha2VmaWxlLnNpbStNYWtlLWNvbW1vbi5zaW0gaW50byBNYWtlZmlsZSAuLi4iCisgICBybSAtZiBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wIE1ha2VmaWxlCisgICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BSRV8vLC9eIyMgRW5kIENPTU1PTl9QUkVfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMS50bXAKKyAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUE9TVF8vLC9eIyMgRW5kIENPTU1PTl9QT1NUXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTIudG1wCisgICBzZWQgLWUgJy9eIyMgQ09NTU9OX1BSRV8vIHIgTWFrZXNpbTEudG1wJyBcCisJLWUgJy9eIyMgQ09NTU9OX1BPU1RfLyByIE1ha2VzaW0yLnRtcCcgXAorCTxNYWtlZmlsZS5zaW0gPk1ha2VmaWxlCisgICBybSAtZiBNYWtlZmlsZS5zaW0gTWFrZS1jb21tb24uc2ltIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAKKyAgIDs7CisgZXNhYworIGNhc2UgIngkQ09ORklHX0hFQURFUlMiIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWMKKworZXhpdCAwCitFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCitybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwordGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisKKwpkaWZmIC0tZ2l0IGEvc2ltL2g4NTAwL2NvbmZpZ3VyZS5pbiBiL3NpbS9oODUwMC9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdhNDg4MgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9oODUwMC9jb25maWd1cmUuaW4KQEAgLTAsMCArMSwxMCBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitzaW5jbHVkZSguLi9jb21tb24vYWNsb2NhbC5tNCkKK0FDX1BSRVJFUSgyLjUpZG5sCitBQ19JTklUKE1ha2VmaWxlLmluKQorCitTSU1fQUNfQ09NTU9OCisKK0FDX0NIRUNLX0hFQURFUlMoc3RkbGliLmggdGltZS5oKQorCitTSU1fQUNfT1VUUFVUCmRpZmYgLS1naXQgYS9zaW0vaDg1MDAvaW5zdC5oIGIvc2ltL2g4NTAwL2luc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjhjYTk0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2g4NTAwL2luc3QuaApAQCAtMCwwICsxLDEwMSBAQAorI2RlZmluZSBERUJVRworCisjZGVmaW5lIEg4NTAwX01TSVpFICg4KjY0KjEwMjQpCisjZGVmaW5lIENTSVpFIDEwMDAKKworCit1bmlvbiBydHlwZSAKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGw7CisgICAgICB1bnNpZ25lZCBzaG9ydCBzWzJdOworICAgICAgdW5zaWduZWQgY2hhciAqYzsKKyAgICB9OworCisKKy8qIExvY2FsIHJlZ2lzdGVyIG5hbWVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgUjAsIFIxLCBSMiwgUjMsIFI0LCBSNSwgUjYsIFI3LAorICBSX1NSLAkJCQkvKiA4ICovCisgIFJfUEMsCQkJCS8qIDkgKi8KKyAgUl9CUiwJCQkJLyogMTAgKi8KKyAgUl9CUCwJCQkJLyogMTEgKi8KKyAgUl9DUCwJCQkJLyogMTQgKi8KKyAgUl9EUCwJCQkJLyogMTMgKi8KKyAgUl9FUCwJCQkJLyogMTIgKi8KKyAgUl9UUCwJCQkJLyogMTUgKi8KKyAgUl9IQVJEXzAsCQkJLyogMTYgKi8KKyAgUl9IQVJEOF8wLAkJCS8qIDE3ICovCisgIFJfTEFTVCwKK30gcmVnX3R5cGU7CisKKworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGZhc3RyZWYgdHlwZTsKKyAgdW5pb24KKyAgICB7CisgICAgICBpbnQgY29kZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmJwdHI7CisgICAgICB1bnNpZ25lZCBzaG9ydCAqd3B0cjsKKyAgICAgIHVuc2lnbmVkIGxvbmcgKmxwdHI7CisgICAgICB1bnNpZ25lZCBjaGFyICoqc2VncHRyOworICAgICAgdW5pb24gcnR5cGUgKnJwdHI7CisgICAgICAKKyAgICB9CisgIHJlZzsKKyAgaW50IGxpdGVyYWw7CisgIHVuaW9uCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciAqKnNlZ3JlZzsKKyAgICAgIHVuc2lnbmVkIHNob3J0ICp3cHRyOworICAgICAgdW5pb24gcnR5cGUgKnJwdHI7CisgICAgfQorICByMjsKK30KKworZWFfdHlwZTsKKworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGVhX3R5cGUgc3JjYTsKKyAgZWFfdHlwZSBzcmNiOworICBlYV90eXBlIGRzdDsKKyAgZmFzdHJlZiBvcGNvZGU7CisgIGZhc3RyZWYgZmxhZ3M7CisgIGludCBuZXh0X3BjOworICBpbnQgb2xkcGM7CisgIGludCBjeWNsZXM7CisjaWZkZWYgREVCVUcKKyAgaDg1MDBfb3Bjb2RlX2luZm8gKm9wOworI2VuZGlmCit9CisKK2RlY29kZWRfaW5zdDsKKworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCBleGNlcHRpb247CisgIHVuaW9uIHJ0eXBlICAgcmVnc1syMF07CisgIAorCisKKyAgdW5zaWduZWQgY2hhciAqbWVtb3J5OworICB1bnNpZ25lZCBzaG9ydCAqY2FjaGVfaWR4OworICBpbnQgY2FjaGVfdG9wOworICBpbnQgbWF4aW11bTsKKyAgaW50IGNzaXplOworICBkZWNvZGVkX2luc3QgKmNhY2hlOworICBpbnQgY3ljbGVzOworICBpbnQgaW5zdHM7CisgIGludCB0aWNrczsKKyAgaW50IGNvbXBpbGVzOworfQorCitjcHVfc3RhdGVfdHlwZTsKZGlmZiAtLWdpdCBhL3NpbS9oODUwMC90Y29uZmlnLmluIGIvc2ltL2g4NTAwL3Rjb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlMGQwNAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9oODUwMC90Y29uZmlnLmluCkBAIC0wLDAgKzEsMTMgQEAKKy8qIGg4NTAwIHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuICAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHN1cHBvcnRzIHByb2ZpbGluZy4KKyAgIFNlZSB0aGUgbWlwcyBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCisgICBUaGlzIGVuYWJsZXMgdGhlIGAtcCBmb28nIGFuZCBgLXMgYmFyJyBvcHRpb25zLgorICAgVGhlIHRhcmdldCBpcyByZXF1aXJlZCB0byBwcm92aWRlIHNpbV9zZXRfcHJvZmlsZXssX3NpemV9LiAgKi8KKy8qICNkZWZpbmUgU0lNX0hBVkVfUFJPRklMRSAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHVzZXMgYW4gaW5zdHJ1Y3Rpb24gY2FjaGUuCisgICBTZWUgdGhlIGg4LzMwMCBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCisgICBUaGlzIGVuYWJsZXMgdGhlIGAtYyBzaXplJyBvcHRpb24gdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBjYWNoZS4KKyAgIFRoZSB0YXJnZXQgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzaW1fc2V0X3NpbWNhY2hlX3NpemUuICAqLworI2RlZmluZSBTSU1fSEFWRV9TSU1DQUNIRQpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvQ2hhbmdlTG9nIGIvc2ltL2k5NjAvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhODdkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaTk2MC9DaGFuZ2VMb2cKQEAgLTAsMCArMSw4NiBAQAorMTk5OS0wMi0wOSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoSTk2MF9PQkpTKTogQWRkIGk5NjAtZGVzYy5vLgorCShTSU1fRVhUUkFfREVQUyk6IFJlcGxhY2UgY3B1LW9wYy5oIHdpdGggaTk2MC1kZXNjLmgsaTk2MC1vcGMuaC4KKwkqIGNvbmZpZ3VyZS5pbiAoc2ltX2xpbmtfZmlsZXMsc2ltX2xpbmtfbGlua3MpOiBEZWxldGUuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBkZWNvZGUuYyxkZWNvZGUuaCxtb2RlbC5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVidWlsZC4KKwkqIGRldmljZXMuYzogcy9tMzJyL2k5NjAvLgorCSogaTk2MC1kZXNjLmM6IE5ldyBmaWxlLgorCSogaTk2MC1kZXNjLmg6IE5ldyBmaWxlLgorCSogaTk2MC1vcGMuaDogTmV3IGZpbGUuCisJKiBpOTYwLXNpbS5oIChJOTYwX01JU0NfUFJPRklMRSk6IERlbGV0ZS4KKwkqIGk5NjAuYyAoaTk2MGJhc2VfbW9kZWxfaW5zbl9iZWZvcmUpOiBEZWxldGUgdW51c2VkIGNvZGUuCisJKGk5NjBiYXNlX21vZGVsX2luc25fYWZ0ZXIpOiBEaXR0by4KKwkoaTk2MF9tb2RlbF9pbml0X2luc25fY3ljbGVzLGk5NjBfbW9kZWxfdXBkYXRlX2luc25fY3ljbGVzKTogRGl0dG8uCisJKGk5NjBfbW9kZWxfcmVjb3JkX2N5Y2xlcyk6IERpdHRvLgorCSogbWxvb3AuaW4gKGV4ZWN1dGUpOiBDR0VOX0lOU05fQVRUUiByZW5hbWVkIHRvIENHRU5fSU5TTl9BVFRSX1ZBTFVFLgorCShleHRyYWN0LXBiYik6IFVzZSBpZGVzYy0+bGVuZ3RoIHRvIGdldCBpbnNuIGxlbmd0aC4KKwkqIHNpbS1pZi5jIChpOTYwX2Rpc2Fzc2VtYmxlX2luc24pOiBOZXcgZnVuY3Rpb24uCisJKHNpbV9vcGVuKTogRGVsZXRlIG1pc2MuIHByb2ZpbGluZyBzdXBwb3J0LiAgaTk2MF9jZ2VuX2NwdV9vcGVuIHJlbmFtZWQKKwlmcm9tIGk5NjBfY2dlbl9vcGNvZGVfb3Blbi4gIFNldCBkaXNhc3NlbWJsZXIuCisJKHNpbV9jbG9zZSk6IGk5NjBfY2dlbl9jcHVfb3BlbiByZW5hbWVkIGZyb20gaTk2MF9jZ2VuX29wY29kZV9vcGVuLgorCSogc2ltLW1haW4uaDogRG9uJ3QgaW5jbHVkZSBjcHUtb3BjLmgsY3B1LXNpbS5oLiBJbmNsdWRlCisJaTk2MC1kZXNjLmgsaTk2MC1vcGMuaCxpOTYwLXNpbS5oLgorCShzdHJ1Y3QgX3NpbV9jcHUpOiBEZWxldGUgbWVtYmVyIGk5NjBfbWlzY19wcm9maWxlLgorCisxOTk5LTAxLTI3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGNwdS5oLGRlY29kZS5jLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWJ1aWxkLgorCisxOTk5LTAxLTE0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGFyY2guYyxhcmNoLmMsY3B1YWxsLmg6IFJlZ2VuZXJhdGUuCisJKiBjcHUuYyxjcHUuaCxkZWNvZGUuYyxkZWNvZGUuaCxtb2RlbC5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KKworMTk5OS0wMS0xMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoaTk2MC1jbGVhbik6IHJtIGVuZy5oLgorCSogc2ltLW1haW4uaDogRGVsZXRlIGluY2x1c2lvbiBvZiBhbnNpZGVjbC5oLgorCURlbGV0ZSBpbmNsdXNpb24gb2YgY2dlbi1zY2FjaGUuaCxjZ2VuLWNwdS5oLGNnZW4tdHJhY2UuaCxjcHVhbGwuaC4KKwkoU0lNX0NPUkVfU0lHTkFMKTogbTMyciAtPiBpOTYwLgorCSogY3B1Lmg6IFJlZ2VuZXJhdGUuCisJKiB0cmFwcy5jOiBtMzJyIC0+IGk5NjAuCisKKzE5OTktMDEtMDUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFNJTV9FWFRSQV9ERVBTKTogVXNlIENHRU5fSU5DTFVERV9ERVBTLgorCShNQUlOX0lOQ0xVREVfREVQUyxJTkNMVURFX0RFUFMsT1BTX0lOQ0xVREVfREVQUyk6IERlbGV0ZS4KKwkoc2ltLWlmLm8pOiBVc2UgU0lNX01BSU5fREVQUy4KKwkoYXJjaC5vKTogRGl0dG8uCisJKHRyYXBzLm8pOiBEaXR0by4KKwkoZGV2aWNlcy5vKTogRGl0dG8uCisJKEk5NjBCQVNFX0lOQ0xVREVfREVQUyk6IFVzZSBDR0VOX01BSU5fQ1BVX0RFUFMuCisJKGk5NjAubyk6IFVzZSBJOTYwQkFTRV9JTkNMVURFX0RFUFMuCisJKG1sb29wLm8sY3B1Lm8sZGVjb2RlLm8sc2VtLm8sbW9kZWwubyk6IERpdHRvLgorCShzdGFtcC1hcmNoKTogUGFzcyBtYWNoPWFsbCB0byBjZ2VuLWFyY2guCisJKiBjcHUuYyxjcHUuaCxkZWNvZGUuYyxtb2RlbC5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KKwkqIHNpbS1pZi5jIChzaW1fb3Blbik6IE1vZGVsIHByb2JpbmcgY29kZSBtb3ZlZCB0byBzaW0tbW9kZWwuYy4KKworMTk5OC0xMi0xNCAgSmFtZXMgRSBXaWxzb24gIDx3aWxzb25Ad2lsc29uLXBjLmN5Z251cy5jb20+CisKKwkqIGNwdS5oLCBkZWNvZGUuYywgc2VtLXN3aXRjaC5jLCBzZW0uYzogUmVidWlsdC4KKwkqIHRyYXBzLmMgKGk5NjBfdHJhcCk6IFN0b3JlIHN5c2NhbGwgcmVzdWx0cyBpbiByZWdzIDE2IHRvIDE4IGluc3RlYWQKKwlvZiByZWdzIDAgdG8gMi4KKworTW9uIERlYyAxNCAyMjozMzozOCAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+CisKKwkqIG1sb29wLmluIChleHRyYWN0MzIpOiBBZGQgY2FsbHMgdG8gQGNwdUBfZmlsbF9hcmdidWYgYW5kCisJQGNwdUBfZmlsX2FyZ2J1Zl90cC4KKworMTk5OC0xMi0xNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IC0tZW5hYmxlLWNnZW4tbWFpbnQgc3VwcG9ydCBtb3ZlZCB0byBjb21tb24vYWNsb2NhbC5tNC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworCSogc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgorCisxOTk4LTEyLTA5ICBKYW1lcyBFIFdpbHNvbiAgPHdpbHNvbkB3aWxzb24tcGMuY3lnbnVzLmNvbT4KKworCSogbWxvb3AuaW4gZXhlY3V0ZSk6IFRlc3QgQVJHQlVGX1BST0ZJTEVfUCBiZWZvcmUgcHJvZmlsaW5nLgorCVVwZGF0ZSBjYWxscyB0byBUUkFDRV9JTlNOX0lOSVQsVFJBQ0VfSU5TTl9GSU5JLgorCSogY3B1LmgsIGNwdWFsbC5oLCBkZWNvZGUuYywgc2VtLXN3aXRjaC5jLCBzZW0uYzogUmVnZW5lcmF0ZS4KKworMTk5OC0xMi0wOCAgSmFtZXMgRSBXaWxzb24gIDx3aWxzb25Ad2lsc29uLXBjLmN5Z251cy5jb20+CisKKwkqIE5ldyBkaXJlY3RvcnkuCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9NYWtlZmlsZS5pbiBiL3NpbS9pOTYwL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYjI2NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaTk2MC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDEwMSBAQAorIyBNYWtlZmlsZSB0ZW1wbGF0ZSBmb3IgQ29uZmlndXJlIGZvciB0aGUgaTk2MCBzaW11bGF0b3IKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIyBDT01NT05fUFJFX0NPTkZJR19GUkFHCisKK0k5NjBfT0JKUyA9IGk5NjAubyBjcHUubyBkZWNvZGUubyBzZW0ubyBtb2RlbC5vIG1sb29wLm8gaTk2MC1kZXNjLm8KKworQ09ORklHX0RFVklDRVMgPSBkdi1zb2Nrc2VyLm8KK0NPTkZJR19ERVZJQ0VTID0KKworU0lNX09CSlMgPSBcCisJJChTSU1fTkVXX0NPTU1PTl9PQkpTKSBcCisJc2ltLWNwdS5vIFwKKwlzaW0tZW5naW5lLm8gXAorCXNpbS1obG9hZC5vIFwKKwlzaW0taHJ3Lm8gXAorCXNpbS1tb2RlbC5vIFwKKwlzaW0tcmVhc29uLm8gXAorCWNnZW4tdXRpbHMubyBjZ2VuLXRyYWNlLm8gY2dlbi1zY2FjaGUubyBcCisJY2dlbi1ydW4ubyBzaW0tcmVhc29uLm8gc2ltLWVuZ2luZS5vIHNpbS1zdG9wLm8gXAorCXNpbS1pZi5vIGFyY2gubyBcCisJJChJOTYwX09CSlMpIFwKKwl0cmFwcy5vIGRldmljZXMubyBcCisJJChDT05GSUdfREVWSUNFUykKKworIyBFeHRyYSBoZWFkZXJzIGluY2x1ZGVkIGJ5IHNpbS1tYWluLmguCitTSU1fRVhUUkFfREVQUyA9IFwKKwkkKENHRU5fSU5DTFVERV9ERVBTKSBcCisJYXJjaC5oIGNwdWFsbC5oIGk5NjAtc2ltLmggaTk2MC1kZXNjLmggaTk2MC1vcGMuaAorCitTSU1fRVhUUkFfQ0ZMQUdTID0KKworU0lNX1JVTl9PQkpTID0gbnJ1bi5vCitTSU1fRVhUUkFfQ0xFQU4gPSBpOTYwLWNsZWFuCisKKyMgVGhpcyBzZWxlY3RzIHRoZSBpOTYwIG5ld2xpYi9saWJnbG9zcyBzeXNjYWxsIGRlZmluaXRpb25zLgorIworIyA/Pz8gVGhpcyBhZmZlY3RzIHdoYXQgc3R1ZmYgZ2V0cyBpbmNsdWRlZCBmcm9tIC4uL2NvbW1vbi9ubHR2YWxzLmRlZi4KKyMgRm9yIG5vdywgd2UgbmVlZCBTWVNfZXhpdCBiZWNhdXNlIG9mIHRyYXBzLmMuICBJZiB3ZSByZWFsbHkgbmVlZCB0aGlzLAorIyB0aGVuIHdlIG5lZWQgdG8gYWRkIGk5NjAgc3BlY2lmaWMgZGVmaW5pdGlvbnMgdG8gbmx0dmFscy5kZWYuCitOTF9UQVJHRVQgPSAtRE5MX1RBUkdFVF9pOTYwCisKKyMjIENPTU1PTl9QT1NUX0NPTkZJR19GUkFHCisKK2FyY2ggPSBpOTYwCisKK3NpbS1pZi5vOiBzaW0taWYuYyAkKFNJTV9NQUlOX0RFUFMpICQoc3JjZGlyKS8uLi9jb21tb24vc2ltLWNvcmUuaAorCithcmNoLm86IGFyY2guYyAkKFNJTV9NQUlOX0RFUFMpCisKK3RyYXBzLm86IHRyYXBzLmMgdGFyZy12YWxzLmggJChTSU1fTUFJTl9ERVBTKQorZGV2aWNlcy5vOiBkZXZpY2VzLmMgJChTSU1fTUFJTl9ERVBTKQorCisjIEk5NjAgb2JqcworCitJOTYwQkFTRV9JTkNMVURFX0RFUFMgPSBcCisJJChDR0VOX01BSU5fQ1BVX0RFUFMpIFwKKwljcHUuaCBkZWNvZGUuaCBlbmcuaAorCitpOTYwLm86IGk5NjAuYyAkKEk5NjBCQVNFX0lOQ0xVREVfREVQUykKKworIyBGSVhNRTogVXNlIG9mIGBtb25vJyBpcyB3aXAuCittbG9vcC5jIGVuZy5oOiBzdGFtcC1tbG9vcAorc3RhbXAtbWxvb3A6ICQoc3JjZGlyKS8uLi9jb21tb24vZ2VubWxvb3Auc2ggbWxvb3AuaW4gTWFrZWZpbGUKKwkkKFNIRUxMKSAkKHNyY2NvbSkvZ2VubWxvb3Auc2ggXAorCQktbW9ubyAtZmFzdCAtcGJiIC1zd2l0Y2ggc2VtLXN3aXRjaC5jIFwKKwkJLWNwdSBpOTYwYmFzZSAtaW5maWxlICQoc3JjZGlyKS9tbG9vcC5pbgorCSQoU0hFTEwpICQoc3Jjcm9vdCkvbW92ZS1pZi1jaGFuZ2UgZW5nLmhpbiBlbmcuaAorCSQoU0hFTEwpICQoc3Jjcm9vdCkvbW92ZS1pZi1jaGFuZ2UgbWxvb3AuY2luIG1sb29wLmMKKwl0b3VjaCBzdGFtcC1tbG9vcAorIwkkKFNIRUxMKSAkKHNyY2NvbSkvZ2VubWxvb3Auc2ggXAorIwkJLW1vbm8gLXNjYWNoZSAtZmFzdCBpOTYwYmFzZSAkKHNyY2RpcikvbWxvb3AuaW4gXAorIwkJfCBzZWQgLWUgJ3MvQGNwdUAvaTk2MGJhc2UvJyAtZSAncy9AQ1BVQC9JOTYwQkFTRS8nID5tbG9vcC5jCittbG9vcC5vOiBtbG9vcC5jIHNlbS1zd2l0Y2guYyAkKEk5NjBCQVNFX0lOQ0xVREVfREVQUykKKworY3B1Lm86IGNwdS5jICQoSTk2MEJBU0VfSU5DTFVERV9ERVBTKQorZGVjb2RlLm86IGRlY29kZS5jICQoSTk2MEJBU0VfSU5DTFVERV9ERVBTKQorc2VtLm86IHNlbS5jICQoSTk2MEJBU0VfSU5DTFVERV9ERVBTKQorbW9kZWwubzogbW9kZWwuYyAkKEk5NjBCQVNFX0lOQ0xVREVfREVQUykKKworaTk2MC1jbGVhbjoKKwlybSAtZiBtbG9vcC5jIGVuZy5oIHN0YW1wLW1sb29wCisJcm0gLWYgdG1wLSoKKwpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvUkVBRE1FIGIvc2ltL2k5NjAvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzc1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaTk2MC9SRUFETUUKQEAgLTAsMCArMSwxNCBAQAorVGhpcyBpcyB0aGUgaTk2MCBzaW11bGF0b3IgZGlyZWN0b3J5LgorCitJdCBpcyBzdGlsbCB3b3JrLWluLXByb2dyZXNzLiAgVGhlIGN1cnJlbnQgc291cmNlcyBhcmUgcmVhc29uYWJseQord2VsbCB0ZXN0ZWQgYW5kIGxvdHMgb2YgZmVhdHVyZXMgYXJlIGluLiAgSG93ZXZlciwgdGhlcmUncyBsb3RzCittb3JlIHlldCB0byBjb21lLgorCitUaGVyZSBhcmUgbG90cyBvZiBtYWNoaW5lIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSEKK1RoZXkgYXJlIG9ubHkgZ2VuZXJhdGVkIGlmIHlvdSBjb25maWd1cmUgd2l0aCAtLWVuYWJsZS1jZ2VuLW1haW50LAorc2ltaWxhciBpbiBiZWhhdmlvdXIgdG8gTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZSB1bmRlciBhdXRvbWFrZS9hdXRvY29uZi4KKworRm9yIGRldGFpbHMgb24gdGhlIGdlbmVyYXRvciwgc2VlIC4uLy4uL2NnZW4uCisKK2Rldm8vY2dlbiBpc24ndCBwYXJ0IG9mIHRoZSBjb21wLXRvb2xzIG1vZHVsZSB5ZXQuCitZb3UnbGwgbmVlZCB0byBjaGVjayBpdCBvdXQgbWFudWFsbHkgKGFsc28gYWtpbiB0byBhdXRvbWFrZS9hdXRvY29uZikuCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9UT0RPIGIvc2ltL2k5NjAvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjNkYWFjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2k5NjAvVE9ETwpAQCAtMCwwICsxLDkgQEAKKy0gaGVhZGVyIGZpbGUgZGVwZW5kZW5jaWVzIHJldmlzaXQKKy0gaG9va3MgY2xlYW51cAorLSB0ZXN0c3VpdGVzCistIEZJWE1FJ3MKKy0gbWVtb3J5IGFjY2Vzc2VzIHN0aWxsIHRlc3QgaWYgcHJvZmlsaW5nIGlzIG9uIGV2ZW4gaW4gZmFzdCBtb2RlCistIGZpbGwgbm9wIGNvdW50aW5nIGRvbmUgZXZlbiBpbiBmYXN0IG1vZGUKKy0gaGF2ZSBzZW1hbnRpYyBjb2RlIHVzZSBHL1NFVF9IX0ZPTyBpZiBub3QgZGVmYXVsdCBbaW5jbCBmdW4tYWNjZXNzXQorLSBoYXZlIEcvU0VUX0hfRk9PIG1hY3JvcyBjYWxsIGZ1bmN0aW9uIGlmIGZ1bi1hY2Nlc3MKKy0gLS0+IGNhbiBhbHdheXMgdXNlIEcvU19IX0ZPTyBtYWNyb3MKZGlmZiAtLWdpdCBhL3NpbS9pOTYwL2FjY29uZmlnLmggYi9zaW0vaTk2MC9hY2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Yjg3YTEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaTk2MC9hY2NvbmZpZy5oCkBAIC0wLDAgKzEsMTUgQEAKKworLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCisjdW5kZWYgRU5BQkxFX05MUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCisjdW5kZWYgSEFWRV9DQVRHRVRTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0dFVFRFWFQKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCisjdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvYXJjaC5jIGIvc2ltL2k5NjAvYXJjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkM2FiODQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaTk2MC9hcmNoLmMKQEAgLTAsMCArMSwxNjQgQEAKKy8qIFNpbXVsYXRvciBzdXBwb3J0IGZvciBpOTYwLgorCitUSElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgorCitDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisqLworCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJiZmQuaCIKKworY29uc3QgTUFDSCAqc2ltX21hY2hzW10gPQoreworI2lmZGVmIEhBVkVfQ1BVX0k5NjBCQVNFCisgICYgaTk2MF9rYV9zYV9tYWNoLAorI2VuZGlmCisjaWZkZWYgSEFWRV9DUFVfSTk2MEJBU0UKKyAgJiBpOTYwX2NhX21hY2gsCisjZW5kaWYKKyAgMAorfTsKKworLyogR2V0IHRoZSB2YWx1ZSBvZiBoLXBjLiAgKi8KKworVVNJCithX2k5NjBfaF9wY19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9JOTYwQkFTRQorICAgIGNhc2UgYmZkX21hY2hfaTk2MF9rYV9zYSA6IAorICAgICAgcmV0dXJuIGk5NjBiYXNlX2hfcGNfZ2V0IChjdXJyZW50X2NwdSk7CisjZW5kaWYKKyNpZmRlZiBIQVZFX0NQVV9JOTYwQkFTRQorICAgIGNhc2UgYmZkX21hY2hfaTk2MF9jYSA6IAorICAgICAgcmV0dXJuIGk5NjBiYXNlX2hfcGNfZ2V0IChjdXJyZW50X2NwdSk7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtcGMuICAqLworCit2b2lkCithX2k5NjBfaF9wY19zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVU0kgbmV3dmFsKQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9JOTYwQkFTRQorICAgIGNhc2UgYmZkX21hY2hfaTk2MF9rYV9zYSA6IAorICAgICAgaTk2MGJhc2VfaF9wY19zZXQgKGN1cnJlbnRfY3B1LCBuZXd2YWwpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBIQVZFX0NQVV9JOTYwQkFTRQorICAgIGNhc2UgYmZkX21hY2hfaTk2MF9jYSA6IAorICAgICAgaTk2MGJhc2VfaF9wY19zZXQgKGN1cnJlbnRfY3B1LCBuZXd2YWwpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWdyLiAgKi8KKworU0kKK2FfaTk2MF9oX2dyX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVJTlQgcmVnbm8pCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX0k5NjBCQVNFCisgICAgY2FzZSBiZmRfbWFjaF9pOTYwX2thX3NhIDogCisgICAgICByZXR1cm4gaTk2MGJhc2VfaF9ncl9nZXQgKGN1cnJlbnRfY3B1LCByZWdubyk7CisjZW5kaWYKKyNpZmRlZiBIQVZFX0NQVV9JOTYwQkFTRQorICAgIGNhc2UgYmZkX21hY2hfaTk2MF9jYSA6IAorICAgICAgcmV0dXJuIGk5NjBiYXNlX2hfZ3JfZ2V0IChjdXJyZW50X2NwdSwgcmVnbm8pOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLWdyLiAgKi8KKwordm9pZAorYV9pOTYwX2hfZ3Jfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubywgU0kgbmV3dmFsKQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9JOTYwQkFTRQorICAgIGNhc2UgYmZkX21hY2hfaTk2MF9rYV9zYSA6IAorICAgICAgaTk2MGJhc2VfaF9ncl9zZXQgKGN1cnJlbnRfY3B1LCByZWdubywgbmV3dmFsKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgSEFWRV9DUFVfSTk2MEJBU0UKKyAgICBjYXNlIGJmZF9tYWNoX2k5NjBfY2EgOiAKKyAgICAgIGk5NjBiYXNlX2hfZ3Jfc2V0IChjdXJyZW50X2NwdSwgcmVnbm8sIG5ld3ZhbCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtY2MuICAqLworCitTSQorYV9pOTYwX2hfY2NfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfSTk2MEJBU0UKKyAgICBjYXNlIGJmZF9tYWNoX2k5NjBfa2Ffc2EgOiAKKyAgICAgIHJldHVybiBpOTYwYmFzZV9oX2NjX2dldCAoY3VycmVudF9jcHUpOworI2VuZGlmCisjaWZkZWYgSEFWRV9DUFVfSTk2MEJBU0UKKyAgICBjYXNlIGJmZF9tYWNoX2k5NjBfY2EgOiAKKyAgICAgIHJldHVybiBpOTYwYmFzZV9oX2NjX2dldCAoY3VycmVudF9jcHUpOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLWNjLiAgKi8KKwordm9pZAorYV9pOTYwX2hfY2Nfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0kgbmV3dmFsKQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9JOTYwQkFTRQorICAgIGNhc2UgYmZkX21hY2hfaTk2MF9rYV9zYSA6IAorICAgICAgaTk2MGJhc2VfaF9jY19zZXQgKGN1cnJlbnRfY3B1LCBuZXd2YWwpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBIQVZFX0NQVV9JOTYwQkFTRQorICAgIGNhc2UgYmZkX21hY2hfaTk2MF9jYSA6IAorICAgICAgaTk2MGJhc2VfaF9jY19zZXQgKGN1cnJlbnRfY3B1LCBuZXd2YWwpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvYXJjaC5oIGIvc2ltL2k5NjAvYXJjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZGNmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaTk2MC9hcmNoLmgKQEAgLTAsMCArMSw1MiBAQAorLyogU2ltdWxhdG9yIGhlYWRlciBmb3IgaTk2MC4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2lmbmRlZiBJOTYwX0FSQ0hfSAorI2RlZmluZSBJOTYwX0FSQ0hfSAorCisjZGVmaW5lIFRBUkdFVF9CSUdfRU5ESUFOIDEKKworLyogQ292ZXIgZm5zIGZvciByZWdpc3RlciBhY2Nlc3MuICAqLworVVNJIGFfaTk2MF9oX3BjX2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgYV9pOTYwX2hfcGNfc2V0IChTSU1fQ1BVICosIFVTSSk7CitTSSBhX2k5NjBfaF9ncl9nZXQgKFNJTV9DUFUgKiwgVUlOVCk7Cit2b2lkIGFfaTk2MF9oX2dyX3NldCAoU0lNX0NQVSAqLCBVSU5ULCBTSSk7CitTSSBhX2k5NjBfaF9jY19nZXQgKFNJTV9DUFUgKik7Cit2b2lkIGFfaTk2MF9oX2NjX3NldCAoU0lNX0NQVSAqLCBTSSk7CisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG1vZGVsIHR5cGVzLiAgKi8KK3R5cGVkZWYgZW51bSBtb2RlbF90eXBlIHsKKyAgTU9ERUxfSTk2MEtBLCBNT0RFTF9JOTYwQ0EsIE1PREVMX01BWAorfSBNT0RFTF9UWVBFOworCisjZGVmaW5lIE1BWF9NT0RFTFMgKChpbnQpIE1PREVMX01BWCkKKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgdW5pdCB0eXBlcy4gICovCit0eXBlZGVmIGVudW0gdW5pdF90eXBlIHsKKyAgVU5JVF9OT05FLCBVTklUX0k5NjBLQV9VX0VYRUMsIFVOSVRfSTk2MENBX1VfRVhFQywgVU5JVF9NQVgKK30gVU5JVF9UWVBFOworCisjZGVmaW5lIE1BWF9VTklUUyAoMSkKKworI2VuZGlmIC8qIEk5NjBfQVJDSF9IICovCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9jb25maWcuaW4gYi9zaW0vaTk2MC9jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyM2I4NgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9pOTYwL2NvbmZpZy5pbgpAQCAtMCwwICsxLDE2MiBAQAorLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCisjdW5kZWYgQ19BTExPQ0EKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCisjdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCisjdW5kZWYgSEFWRV9BTExPQ0EKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCisjdW5kZWYgaW5saW5lCisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgb2ZmX3QKKworLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCisjdW5kZWYgX1BPU0lYX1NPVVJDRQorCisvKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoaW50IG9yIHZvaWQpLiAgKi8KKyN1bmRlZiBSRVRTSUdUWVBFCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIHNpemVfdAorCisvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKKyAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgorIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgorICovCisjdW5kZWYgU1RBQ0tfRElSRUNUSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIERlZmluZSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAorICAgYnl0ZSBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCBhbmQgVkFYKS4gICovCisjdW5kZWYgV09SRFNfQklHRU5ESUFOCisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19zZXRmcHVjdyBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX1NFVEZQVUNXCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0RDR0VUVEVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRDV0QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRQQUdFU0laRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHJ1c2FnZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRSVVNBR0UKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfTVVOTUFQCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1BVVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VUTE9DQUxFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lnYWN0aW9uIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NJR0FDVElPTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0hSCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGltZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9USU1FCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfQVJHWl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZnB1X2NvbnRyb2wuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfRlBVX0NPTlRST0xfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9NQUxMT0NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9OTF9UWVBFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVkFMVUVTX0gKZGlmZiAtLWdpdCBhL3NpbS9pOTYwL2NvbmZpZ3VyZSBiL3NpbS9pOTYwL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMGYwODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2k5NjAvY29uZmlndXJlCkBAIC0wLDAgKzEsNDIyMiBAQAorIyEgL2Jpbi9zaAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCisjIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCisKKyMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDMKKworCisKKworCisjIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCisKKworIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCisKKworIyBDaGVjayB0byBzZWUgaWYgd2UncmUgcnVubmluZyB1bmRlciBDeWd3aW4zMiwgd2l0aG91dCB1c2luZworIyBBQ19DQU5PTklDQUxfKi4gIElmIHNvLCBzZXQgb3V0cHV0IHZhcmlhYmxlIENZR1dJTjMyIHRvICJ5ZXMiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICJubyIuCisKKworCisjIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIFdpbjMyLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgRVhFRVhUIHRvICIuZXhlIi4KKyMgT3RoZXJ3aXNlIHNldCBpdCB0byAiIi4KKworCisKKworCisKKyMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZW5kaWFuPWVuZGlhbgkJU3BlY2lmeSB0YXJnZXQgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWFsaWdubWVudD1hbGlnbgkJU3BlY2lmeSBzdHJpY3QsICBub25zdHJpY3Qgb3IgZm9yY2VkIGFsaWdubWVudCBvZiBtZW1vcnkgYWNjZXNzZXMuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW49ZW5kCQlTcGVjaWZ5IGhvc3QgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLXNjYWNoZT1zaXplCQlTcGVjaWZ5IHNpbXVsYXRvciBleGVjdXRpb24gY2FjaGUgc2l6ZS4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZGVmYXVsdC1tb2RlbD1tb2RlbAlTcGVjaWZ5IGRlZmF1bHQgbW9kZWwgdG8gc2ltdWxhdGUuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWVudmlyb25tZW50PWVudmlyb25tZW50CVNwZWNpZnkgbWl4ZWQsIHVzZXIsIHZpcnR1YWwgb3Igb3BlcmF0aW5nIGVudmlyb25tZW50LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLWNnZW4tbWFpbnRbPURJUl0gICAgYnVpbGQgY2dlbiBnZW5lcmF0ZWQgZmlsZXMiCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19wcm9nPSQwCisgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCisKKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgLiAkY2FjaGVfZmlsZQorZWxzZQorICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgPiAkY2FjaGVfZmlsZQorZmkKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworYWNfZXhlZXh0PQorYWNfb2JqZXh0PW8KK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCitlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjkzOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0CisgICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCisgIENQUD0iJHtDQy1jY30gLUUiCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDcwOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NzE0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3MjUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjczMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzQyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NDg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9L2xpYi9jcHAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzczOiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKK3NldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCithbGw6CisJQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKK0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCitldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKK2lmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCitlbHNlCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCitmaQorcm0gLWYgY29uZnRlc3RtYWtlCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBTRVRfTUFLRT0KK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4MDA6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKK2lmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgorICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQorRU9GCisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDQz0iJENDIC1wb3NpeCIKKyAgZWxzZQorICAgIENDPSIkQ0MgLVhwIgorICBmaQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgSVNDPQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjgyMTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODI2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODUxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDg2OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4OTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKK2ludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKK2lmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7CitleGl0ICgwKTsgfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTAxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNURENfSEVBREVSUyAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkyNTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5MzAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKworLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3R5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKKy8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCitjaGFyIGNvbnN0ICpjb25zdCAqY2NwOworY2hhciAqKnA7CisvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Oworc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07CisvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KKyAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCitjb25zdCBjaGFyICpnID0gInN0cmluZyI7CitjY3AgPSAmZyArIChnID8gZy1nIDogMCk7CisvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLworKytjY3A7CitwID0gKGNoYXIqKikgY2NwOworY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Cit7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLworICBjaGFyICp0OworICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOworCisgICp0KysgPSAwOworfQoreyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KKyAgaW50IHhbXSA9IHsyNSwgMTd9OworICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOworICArK2ZvbzsKK30KK3sgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLworICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKKyAgaXB0ciBwID0gMDsKKyAgKytwOworfQoreyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCisgICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KKyAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKKyAgc3RydWN0IHMgKmI7IGItPmogPSA1OworfQoreyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KKyAgY29uc3QgaW50IGZvbyA9IDEwOworfQorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTc5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGNvbnN0IAorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwMDA6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfY3ZfY19pbmxpbmU9bm8KK2ZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTAwNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworfSAkYWNfa3cgZm9vKCkgeworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwMTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZG9uZQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2CitjYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCisgIGlubGluZSB8IHllcykgOzsKKyAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBpbmxpbmUgCitFT0YKKyA7OworICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQorRU9GCisgOzsKK2VzYWMKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDQwOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDQ1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgb2ZmX3QgbG9uZworRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwNzM6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA3OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCitFT0YKKworZmkKKworIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKKyMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTEwODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExMTMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFsbG9jYS5oPgoraW50IG1haW4oKSB7CitjaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEyMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExNDE6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTE0NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBIQVZFX0FMTE9DQV9ICisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLworY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKK2ludCBtYWluKCkgeworY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTc0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQSAxCitFT0YKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgorICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucworICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKKyAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCisgICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgorICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgQ19BTExPQ0EgMQorRU9GCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIwNjogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyMTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQord2ViZWNyYXkKKyNlbHNlCit3ZW5vdGJlY3JheQorI2VuZGlmCisKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KK2ZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjM2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjQxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNjQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKK0VPRgorCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZG9uZQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTI5MTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyOTkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorZmluZF9zdGFja19kaXJlY3Rpb24gKCkKK3sKKyAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOworICBhdXRvIGNoYXIgZHVtbXk7CisgIGlmIChhZGRyID09IDApCisgICAgeworICAgICAgYWRkciA9ICZkdW1teTsKKyAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOworfQorbWFpbiAoKQoreworICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMxODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgorRU9GCisKK2ZpCisKK2ZvciBhY19oZHIgaW4gdW5pc3RkLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzQzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTM1MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzgyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMzg3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0MzU6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE0NDMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisvKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KKyAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgorCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKwltbWFwIHNoYXJlZCBub3QgZml4ZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisgICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQorICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAorICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5CisgICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCisgICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKKyAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCisgICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAorICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCisKKyAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KKyAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6CisgICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKKyAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKy8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KKyNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQorIyBpZmRlZiBIQVZFX1VOSVNURF9ICisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgZW5kaWYKKworLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KKyMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKKyMgZW5kaWYKKworIyBpZmRlZiBfU0NfUEFHRVNJWkUKKyMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQorIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLworIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKKyMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQorIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgICBpZmRlZiBOQlBHCisjICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCisjICAgICBpZm5kZWYgQ0xTSVpFCisjICAgICAgZGVmaW5lIENMU0laRSAxCisjICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KKyMgICAgZWxzZSAvKiBubyBOQlBHICovCisjICAgICBpZmRlZiBOQlBDCisjICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQworIyAgICAgZWxzZSAvKiBubyBOQlBDICovCisjICAgICAgaWZkZWYgUEFHRVNJWkUKKyMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKKyMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLworIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLworIyAgICBlbmRpZiAvKiBubyBOQlBHICovCisjICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KKyMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCisKKyNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KKyNlbHNlCitjaGFyICptYWxsb2MoKTsKKyNlbmRpZgorCitpbnQKK21haW4oKQoreworCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOworCWludCBpLCBwYWdlc2l6ZTsKKwlpbnQgZmQ7CisKKwlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisKKwkvKgorCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KKwkgKi8KKwlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YSArIGkpID0gcmFuZCgpOworCXVtYXNrKDApOworCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCisJLyoKKwkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKKwkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCisJICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KKwkgKi8KKwlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgxKTsKKwlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOworCWlmICghZGF0YTIpCisJCWV4aXQoMSk7CisJZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOworCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCisJCQlleGl0KDEpOworCisJLyoKKwkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQorCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KKwkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKKwlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhMykKKwkJZXhpdCgxKTsKKwlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKKwkJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCXVubGluaygiY29uZnRlc3RtbWFwIik7CisJZXhpdCgwKTsKK30KKworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1ODM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9NTUFQIDEKK0VPRgorCitmaQorCisKKyMgYXV0b2NvbmYuaW5mbyBzYXlzIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCByaWdodCBhZnRlciBBQ19JTklULgorCisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY1NjogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisKK2hvc3RfYWxpYXM9JGhvc3QKK2Nhc2UgIiRob3N0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpCisgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpIDs7CisgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2hvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAoraG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjc3OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorCit0YXJnZXRfYWxpYXM9JHRhcmdldAorY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCit0YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCit0YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjk1OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9CitlbHNlCisgICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KKyAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAorcyxcXCxcXFxcLGc7IHMsXCQsJCQsZworRU9GX1NFRAorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgorICBybSAtZiBjb25mdGVzdHNlZAorZmkKK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorCisjIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCit0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTczOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTc2OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19wcm9nX3JlamVjdGVkPW5vCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworCWNvbnRpbnVlCisgICAgICBmaQorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KKyAgICAqd2luMzIqIHwgKldJTjMyKikKKyAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4MjA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4NTI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCisKKyNsaW5lIDE4NjMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCittYWluKCl7cmV0dXJuKDApO30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKyAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisgIGVsc2UKKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcworICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4OTQ6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgorY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODk5OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19HTlVDX18KKyAgeWVzOworI2VuZGlmCitFT0YKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTA4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5Mjc6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCitpZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBhY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTk3MDogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCisgICAgY2FzZSAiJGFjX2Rpci8iIGluCisgICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7CisgICAgKikKKyAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAgICMgYnkgZGVmYXVsdC4KKyAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbHNlCisJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKKwkgICAgYnJlYWsgMgorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9JRlMiCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKyAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCisgICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCisgIGZpCitmaQorZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworCisjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJworZWxzZQorICBDQ19GT1JfQlVJTEQ9Z2NjCitmaQorCisKKworCitBUj0ke0FSLWFyfQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwMzg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX2R1bW15PSIkUEFUSCIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKK0FMTF9MSU5HVUFTPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKK3VuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjA3MzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIwNzggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIwODM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKK19fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMTEzOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMTE4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxNDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgorICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIxNzA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIxNzUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE5ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworICAgZmkKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCisgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NUUENQWSAxCitFT0YKKworICAgZmkKKworICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjMyOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIyMzcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxvY2FsZS5oPgoraW50IG1haW4oKSB7CityZXR1cm4gTENfTUVTU0FHRVMKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKKyAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKK0VPRgorCisgICAgZmkKKyAgZmkKKyAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjI2NTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgorICBVU0VfTkxTPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX05MUz15ZXMKK2ZpCisKKyAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKKyAgICAKKworICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCisKKyAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBFTkFCTEVfTkxTIDEKK0VPRgorCisgICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjg1OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgorICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCitlbHNlCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KK2ZpCisKKyAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgorCisgICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9CisJbmxzX2N2X2hlYWRlcl9saWJndD0KKwlDQVRPQkpFWFQ9Tk9ORQorCisJYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMDQ6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzMDkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpYmludGwuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjMxNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMzE6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjMzNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgoraW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2CisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCisJICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzU5OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbGludGwgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjM2NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGJpbmR0ZXh0ZG9tYWluKCk7CisKK2ludCBtYWluKCkgeworYmluZHRleHRkb21haW4oKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzOTQ6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjM5OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkgICBmaQorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKKwkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KKwkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9HRVRURVhUIDEKK0VPRgorCisJICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNDM0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgorICA7OworZXNhYworZmkKK01TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgoraWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KKwkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNDY4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNDczICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0OTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI1MjM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfZHVtbXk9IiRQQVRIIgorICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgorICA7OworZXNhYworZmkKK0dNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCitpZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTU5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkWEdFVFRFWFQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKKyAgOzsKK2VzYWMKK2ZpCitYR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCitpZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI1OTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKKwkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1OTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0uZ21vCisJCSAgIERBVEFESVJOQU1FPXNoYXJlCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0ubW8KKwkJICAgREFUQURJUk5BTUU9bGliCitmaQorcm0gLWYgY29uZnRlc3QqCisJCUlOU1RPQkpFWFQ9Lm1vCisJICAgICAgZmkKKwkgICAgZmkKKwkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKwkgICAgICAgIAorICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgorCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNjMxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKKyAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjY2NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19kdW1teT0iJFBBVEgiCisgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3MDE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KKwkgIDogOworCWVsc2UKKwkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCisgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKKyAgICBkb25lCisKKyAgICAgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgIAorCisgICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCisgICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCisgICAgICAgTElOR1VBUz0KKyAgICAgZWxzZQorICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3OTE6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQorICAgICAgIE5FV19MSU5HVUFTPQorICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbworICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgorICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7CisgICAgICAgICBlc2FjCisgICAgICAgZG9uZQorICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCisgICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2CisgICAgIGZpCisKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCisgICAgIGZpCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKKyAgIGVsc2UKKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAorLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgorICAgZmkKKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgorICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KKwkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI4MTk6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI4MjQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjgyOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIG1zZ2Zvcm1hdD1saW51eAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK21zZ2Zvcm1hdD14b3BlbgorZmkKKworCisJICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCisgICAgICBmaQorICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCisJICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICAKKyAgIAorCisgICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCisgICAKKworICAgICAgbD0KKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgCisKKyMgQ2hlY2sgZm9yIGNvbW1vbiBoZWFkZXJzLgorIyBGSVhNRTogU2VlbXMgdG8gbWUgdGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgZm9yIGkzODYtd2luZG93cyBob3N0cy4KKyMgQXQgb25lIHBvaW50IHRoZXJlIHdlcmUgaGFyZGNvZGVkIEFDX0RFRklORSdzIGlmICR7aG9zdH0gPSBpMzg2LSotd2luZG93cyouCitmb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB1bmlzdGQuaCB0aW1lLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyODk4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjkwMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjkwODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19oZHIgaW4gc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5Mzg6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTQzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTQ4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2hkciBpbiBmY250bC5oIGZwdV9jb250cm9sLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTc4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjk4MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk4ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19oZHIgaW4gZGxmY24uaCBlcnJuby5oIHN5cy9zdGF0LmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMDE4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzAyMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MzAyODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHJ1c2FnZSB0aW1lIHNpZ2FjdGlvbiBfX3NldGZwdWN3CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMDU3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDYyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwODU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworIyBDaGVjayBmb3Igc29ja2V0IGxpYnJhcmllcworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMxMTI6IGNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nYmluZCB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxzb2NrZXQgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzEyMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGJpbmQoKTsKKworaW50IG1haW4oKSB7CitiaW5kKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTMxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHNvY2tldCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9saWIgMQorRU9GCisKKyAgTElCUz0iLWxzb2NrZXQgJExJQlMiCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzE1OTogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQorYWNfbGliX3Zhcj1gZWNobyBuc2wnXydnZXRob3N0YnluYW1lIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbG5zbCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMTY3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZ2V0aG9zdGJ5bmFtZSgpOworCitpbnQgbWFpbigpIHsKK2dldGhvc3RieW5hbWUoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbnNsIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2xpYiAxCitFT0YKKworICBMSUJTPSItbG5zbCAkTElCUyIKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0CisKKworCitVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlNQUlOVD0iIiBVU0VfTUFJTlRBSU5FUl9NT0RFPXllcyA7OworICBubykJTUFJTlQ9IiMiIDs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLW1haW50YWluZXItbW9kZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IE1BSU5UPSIjIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQorZmkKK2Vsc2UKKyAgTUFJTlQ9IiMiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSAtRFVTRV9CU1dBUD0xIjs7CisgIG5vKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0wIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1ic3dhcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ic3dhcD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9ic3dhcD0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY2ZsYWdzIG9yIC0tZGlzYWJsZS1zaW0tY2ZsYWdzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jZmxhZ3MiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQkgc2ltX2NmbGFncz0iLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIjs7CisgIHRyYWNlKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJQbGVhc2UgdXNlIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpbnN0ZWFkLiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2NmbGFncz0iIjs7CisgIG5vKQkgc2ltX2NmbGFncz0iIjs7CisgICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2NmbGFncz0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVidWcgb3IgLS1kaXNhYmxlLXNpbS1kZWJ1ZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWJ1ZyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpIHNpbV9kZWJ1Zz0iLURERUJVRz03IC1EV0lUSF9ERUJVRz03Ijs7CisgIG5vKSAgc2ltX2RlYnVnPSItRERFQlVHPTAgLURXSVRIX0RFQlVHPTAiOzsKKyAgKikgICBzaW1fZGVidWc9Ii1EREVCVUc9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfREVCVUc9Jygke2VuYWJsZXZhbH0pJyI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWJ1ZyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIGRlYnVnID0gJHNpbV9kZWJ1ZyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2RlYnVnPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zdGRpbyBvciAtLWRpc2FibGUtc2ltLXN0ZGlvIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zdGRpbytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N0ZGlvIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7CisgIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zdGRpbyIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGlvPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkaW8iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHN0ZGlvIGZsYWdzID0gJHNpbV9zdGRpbyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3N0ZGlvPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS10cmFjZSBvciAtLWRpc2FibGUtc2ltLXRyYWNlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV90cmFjZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3RyYWNlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3RyYWNlPSItRFRSQUNFPTEgLURXSVRIX1RSQUNFPS0xIjs7CisgIG5vKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MCAtRFdJVEhfVFJBQ0U9MCI7OworICBbLTAtOV0qKQorCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fdHJhY2U9IiIKKwlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKwkgIGlmIHRlc3QgeCIkc2ltX3RyYWNlIiA9IHg7IHRoZW4KKwkgICAgc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9JyhUUkFDRV8keCIKKwkgIGVsc2UKKwkgICAgc2ltX3RyYWNlPSIke3NpbV90cmFjZX18VFJBQ0VfJHgiCisJICBmaQorCWRvbmUKKwlzaW1fdHJhY2U9IiRzaW1fdHJhY2UpJyIgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSB0cmFjZSA9ICRzaW1fdHJhY2UiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV90cmFjZT0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcHJvZmlsZSBvciAtLWRpc2FibGUtc2ltLXByb2ZpbGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3Byb2ZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9wcm9maWxlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7CisgIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OworICBbLTAtOV0qKQorCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fcHJvZmlsZT0iIgorCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbworCSAgaWYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgPSB4OyB0aGVuCisJICAgIHNpbV9wcm9maWxlPSItRFdJVEhfUFJPRklMRT0nKFBST0ZJTEVfJHgiCisJICBlbHNlCisJICAgIHNpbV9wcm9maWxlPSIke3NpbV9wcm9maWxlfXxQUk9GSUxFXyR4IgorCSAgZmkKKwlkb25lCisJc2ltX3Byb2ZpbGU9IiRzaW1fcHJvZmlsZSknIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9wcm9maWxlIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gcHJvZmlsZSA9ICRzaW1fcHJvZmlsZSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3Byb2ZpbGU9IiIKK2ZpCisKKworCitlY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMzNTQ6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMzU5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBzaWduYWwKKyN1bmRlZiBzaWduYWwKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7CisjZWxzZQordm9pZCAoKnNpZ25hbCAoKSkgKCk7CisjZW5kaWYKKworaW50IG1haW4oKSB7CitpbnQgaTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzc2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpZ25hbD1pbnQKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCitFT0YKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzM5NjogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkQ1lHV0lOMzIiID0geWVzOyB0aGVuCithbV9jdl9leGVleHQ9LmV4ZQorZWxzZQorY2F0ID4gYW1fY190ZXN0LmMgPDwgJ0VPRicKK2ludCBtYWluKCkgeworLyogTm90aGluZyBuZWVkZWQgaGVyZSAqLworfQorRU9GCiske0NDLWNjfSAtbyBhbV9jX3Rlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgYW1fY190ZXN0LmMgJExJQlMgMT4mNQorYW1fY3ZfZXhlZXh0PWBscyBhbV9jX3Rlc3QuKiB8IGdyZXAgLXYgYW1fY190ZXN0LmMgfCBzZWQgLWUgcy9hbV9jX3Rlc3QvL2AKK3JtIC1mIGFtX2NfdGVzdCoKK2ZpCisKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iID0geCAmJiBhbV9jdl9leGVleHQ9bm8KK2ZpCitFWEVFWFQ9IiIKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthbV9jdl9leGVleHR9CitlY2hvICIkYWNfdCIiJHthbV9jdl9leGVleHR9IiAxPiY2CisKKworc2ltX2xpbmtfZmlsZXM9CitzaW1fbGlua19saW5rcz0KKworc2ltX2xpbmtfbGlua3M9dGNvbmZpZy5oCitpZiB0ZXN0IC1mICR7c3JjZGlyfS90Y29uZmlnLmluCit0aGVuCisgIHNpbV9saW5rX2ZpbGVzPXRjb25maWcuaW4KK2Vsc2UKKyAgc2ltX2xpbmtfZmlsZXM9Li4vY29tbW9uL3Rjb25maWcuaW4KK2ZpCisKKyMgdGFyZy12YWxzLmRlZiBwb2ludHMgdG8gdGhlIGxpYmMgbWFjcm8gZGVzY3JpcHRpb24gZmlsZS4KK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyotKi0qKSBUQVJHX1ZBTFNfREVGPS4uL2NvbW1vbi9ubHR2YWxzLmRlZiA7OworZXNhYworc2ltX2xpbmtfZmlsZXM9IiR7c2ltX2xpbmtfZmlsZXN9ICR7VEFSR19WQUxTX0RFRn0iCitzaW1fbGlua19saW5rcz0iJHtzaW1fbGlua19saW5rc30gdGFyZy12YWxzLmRlZiIKKworCisKKword2lyZV9lbmRpYW49IkxJVFRMRV9FTkRJQU4iCitkZWZhdWx0X2VuZGlhbj0iIgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1lbmRpYW4gb3IgLS1kaXNhYmxlLXNpbS1lbmRpYW4gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2VuZGlhbitzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2VuZGlhbiIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICBiKnxCKikgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPUJJR19FTkRJQU4iOzsKKyAgbCp8TCopIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIjs7CisgIHllcykJIGlmIHRlc3QgeCIkd2lyZV9lbmRpYW4iICE9IHg7IHRoZW4KKwkgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9JHt3aXJlX2VuZGlhbn0iCisJIGVsc2UKKyAgICAgICAgICAgaWYgdGVzdCB4IiRkZWZhdWx0X2VuZGlhbiIgIT0geDsgdGhlbgorCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPSR7ZGVmYXVsdF9lbmRpYW59IgorCSAgIGVsc2UKKwkgICAgIGVjaG8gIk5vIGhhcmQtd2lyZWQgZW5kaWFuIGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgorCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPTAiCisJICAgZmkKKwkgZmk7OworICBubykJIGlmIHRlc3QgeCIkZGVmYXVsdF9lbmRpYW4iICE9IHg7IHRoZW4KKwkgICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0ke2RlZmF1bHRfZW5kaWFufSIKKwkgZWxzZQorCSAgIGlmIHRlc3QgeCIkd2lyZV9lbmRpYW4iICE9IHg7IHRoZW4KKwkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPSR7d2lyZV9lbmRpYW59IgorCSAgIGVsc2UKKwkgICAgIGVjaG8gIk5vIGRlZmF1bHQgZW5kaWFuIGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgorCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9MCIKKwkgICBmaQorCSBmaTs7CisgICopCSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1lbmRpYW4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9lbmRpYW49IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9lbmRpYW4iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGVuZGlhbiBmbGFncyA9ICRzaW1fZW5kaWFuIiA2PiYxCitmaQorZWxzZQorICBpZiB0ZXN0IHgiJGRlZmF1bHRfZW5kaWFuIiAhPSB4OyB0aGVuCisgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPSR7ZGVmYXVsdF9lbmRpYW59IgorZWxzZQorICBpZiB0ZXN0IHgiJHdpcmVfZW5kaWFuIiAhPSB4OyB0aGVuCisgICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPSR7d2lyZV9lbmRpYW59IgorICBlbHNlCisgICAgc2ltX2VuZGlhbj0KKyAgZmkKK2ZpCitmaQorCit3aXJlX2FsaWdubWVudD0iTk9OU1RSSUNUX0FMSUdOTUVOVCIKK2RlZmF1bHRfYWxpZ25tZW50PSIiCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYWxpZ25tZW50IG9yIC0tZGlzYWJsZS1zaW0tYWxpZ25tZW50IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9hbGlnbm1lbnQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9hbGlnbm1lbnQiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgc3RyaWN0IHwgU1RSSUNUKSAgICAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPVNUUklDVF9BTElHTk1FTlQiOzsKKyAgbm9uc3RyaWN0IHwgTk9OU1RSSUNUKSBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPU5PTlNUUklDVF9BTElHTk1FTlQiOzsKKyAgZm9yY2VkIHwgRk9SQ0VEKSAgICAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPUZPUkNFRF9BTElHTk1FTlQiOzsKKyAgeWVzKSBpZiB0ZXN0IHgiJHdpcmVfYWxpZ25tZW50IiAhPSB4OyB0aGVuCisJIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9JHt3aXJlX2FsaWdubWVudH0iCisgICAgICAgZWxzZQorICAgICAgICAgaWYgdGVzdCB4IiRkZWZhdWx0X2FsaWdubWVudCIgIT0geDsgdGhlbgorICAgICAgICAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPSR7ZGVmYXVsdF9hbGlnbm1lbnR9IgorICAgICAgICAgZWxzZQorCSAgIGVjaG8gIk5vIGhhcmQtd2lyZWQgYWxpZ25tZW50IGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgorCSAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9MCIKKyAgICAgICAgIGZpCisgICAgICAgZmk7OworICBubykgIGlmIHRlc3QgeCIkZGVmYXVsdF9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKwkgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPSR7ZGVmYXVsdF9hbGlnbm1lbnR9IgorICAgICAgIGVsc2UKKyAgICAgICAgIGlmIHRlc3QgeCIkd2lyZV9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKwkgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9JHt3aXJlX2FsaWdubWVudH0iCisgICAgICAgICBlbHNlCisgICAgICAgICAgIGVjaG8gIk5vIGRlZmF1bHQgYWxpZ25tZW50IGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgorICAgICAgICAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9MCIKKyAgICAgICAgIGZpCisgICAgICAgZmk7OworICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWFsaWdubWVudCIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2FsaWdubWVudD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2FsaWdubWVudCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgYWxpZ25tZW50IGZsYWdzID0gJHNpbV9hbGlnbm1lbnQiIDY+JjEKK2ZpCitlbHNlCisgIGlmIHRlc3QgeCIkZGVmYXVsdF9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKyAgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPSR7ZGVmYXVsdF9hbGlnbm1lbnR9IgorZWxzZQorICBpZiB0ZXN0IHgiJHdpcmVfYWxpZ25tZW50IiAhPSB4OyB0aGVuCisgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0ke3dpcmVfYWxpZ25tZW50fSIKKyAgZWxzZQorICAgIHNpbV9hbGlnbm1lbnQ9CisgIGZpCitmaQorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW4gb3IgLS1kaXNhYmxlLXNpbS1ob3N0ZW5kaWFuIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ob3N0ZW5kaWFuK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1faG9zdGVuZGlhbiIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICBubykJIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPTAiOzsKKyAgYip8QiopIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUJJR19FTkRJQU4iOzsKKyAgbCp8TCopIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iOzsKKyAgKikJIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBmb3IgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ob3N0ZW5kaWFuPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1faG9zdGVuZGlhbiIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgaG9zdGVuZGlhbiBmbGFncyA9ICRzaW1faG9zdGVuZGlhbiIgNj4mMQorZmkKK2Vsc2UKKyAgCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNTUwOiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2JpZ2VuZGlhbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KKyMgU2VlIGlmIHN5cy9wYXJhbS5oIGRlZmluZXMgdGhlIEJZVEVfT1JERVIgbWFjcm8uCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNTU3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KK2ludCBtYWluKCkgeworCisjaWYgIUJZVEVfT1JERVIgfHwgIUJJR19FTkRJQU4gfHwgIUxJVFRMRV9FTkRJQU4KKyBib2d1cyBlbmRpYW4gbWFjcm9zCisjZW5kaWYKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTY4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBCSUdfRU5ESUFOIG9yIG5vdC4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM1NzIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgoraW50IG1haW4oKSB7CisKKyNpZiBCWVRFX09SREVSICE9IEJJR19FTkRJQU4KKyBub3QgYmlnIGVuZGlhbgorI2VuZGlmCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU4MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2lmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmciIDE+JjI7IGV4aXQgMTsgfQorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNjAzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK21haW4gKCkgeworICAvKiBBcmUgd2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4/ICBGcm9tIEhhcmJpc29uJlN0ZWVsZS4gICovCisgIHVuaW9uCisgIHsKKyAgICBsb25nIGw7CisgICAgY2hhciBjW3NpemVvZiAobG9uZyldOworICB9IHU7CisgIHUubCA9IDE7CisgIGV4aXQgKHUuY1tzaXplb2YgKGxvbmcpIC0gMV0gPT0gMSk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzYxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2JpZ2VuZGlhbiIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCitFT0YKKworZmkKKworICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHllczsgdGhlbgorICAgIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUJJR19FTkRJQU4iCisgIGVsc2UKKyAgICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIgorICBmaQorZWxzZQorICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj0wIgorZmkKK2ZpCisKKworZGVmYXVsdF9zaW1fc2NhY2hlPSIxMDI0IgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zY2FjaGUgb3IgLS1kaXNhYmxlLXNpbS1zY2FjaGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3NjYWNoZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3NjYWNoZSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9zY2FjaGU9Ii1EV0lUSF9TQ0FDSEU9JHtkZWZhdWx0X3NpbV9zY2FjaGV9Ijs7CisgIG5vKQlzaW1fc2NhY2hlPSItRFdJVEhfU0NBQ0hFPTAiIDs7CisgIFswLTldKikgc2ltX2NhY2hlPSR7ZW5hYmxldmFsfTs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIkJhZCB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tc2NhY2hlIiIgMT4mMjsgZXhpdCAxOyB9OworCXNpbV9zY2FjaGU9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zY2FjaGUiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNjYWNoZSBzaXplID0gJHNpbV9zY2FjaGUiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9zY2FjaGU9Ii1EV0lUSF9TQ0FDSEU9JHtkZWZhdWx0X3NpbV9zY2FjaGV9IgorZmkKKworCisKK2RlZmF1bHRfc2ltX2RlZmF1bHRfbW9kZWw9Imk5NjBLQSIKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVmYXVsdC1tb2RlbCBvciAtLWRpc2FibGUtc2ltLWRlZmF1bHQtbW9kZWwgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2RlZmF1bHRfbW9kZWwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWZhdWx0X21vZGVsIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllc3xubykgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiTWlzc2luZyBhcmd1bWVudCB0byAtLWVuYWJsZS1zaW0tZGVmYXVsdC1tb2RlbCIiIDE+JjI7IGV4aXQgMTsgfTs7CisgICopCXNpbV9kZWZhdWx0X21vZGVsPSItRFdJVEhfREVGQVVMVF9NT0RFTD0nXCIke2VuYWJsZXZhbH1cIiciOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVmYXVsdF9tb2RlbCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgZGVmYXVsdCBtb2RlbCA9ICRzaW1fZGVmYXVsdF9tb2RlbCIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2RlZmF1bHRfbW9kZWw9Ii1EV0lUSF9ERUZBVUxUX01PREVMPSdcIiR7ZGVmYXVsdF9zaW1fZGVmYXVsdF9tb2RlbH1cIiciCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1lbnZpcm9ubWVudCBvciAtLWRpc2FibGUtc2ltLWVudmlyb25tZW50IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9lbnZpcm9ubWVudCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Vudmlyb25tZW50IgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIGFsbCB8IEFMTCkgICAgICAgICAgICAgc2ltX2Vudmlyb25tZW50PSItRFdJVEhfRU5WSVJPTk1FTlQ9QUxMX0VOVklST05NRU5UIjs7CisgIHVzZXIgfCBVU0VSKSAgICAgICAgICAgc2ltX2Vudmlyb25tZW50PSItRFdJVEhfRU5WSVJPTk1FTlQ9VVNFUl9FTlZJUk9OTUVOVCI7OworICB2aXJ0dWFsIHwgVklSVFVBTCkgICAgIHNpbV9lbnZpcm9ubWVudD0iLURXSVRIX0VOVklST05NRU5UPVZJUlRVQUxfRU5WSVJPTk1FTlQiOzsKKyAgb3BlcmF0aW5nIHwgT1BFUkFUSU5HKSBzaW1fZW52aXJvbm1lbnQ9Ii1EV0lUSF9FTlZJUk9OTUVOVD1PUEVSQVRJTkdfRU5WSVJPTk1FTlQiOzsKKyAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1lbnZpcm9ubWVudCIiIDE+JjI7IGV4aXQgMTsgfTsKKyAgICAgICBzaW1fZW52aXJvbm1lbnQ9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9lbnZpcm9ubWVudCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIGVudmlyb25tZW50ID0gJHNpbV9lbnZpcm9ubWVudCIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2Vudmlyb25tZW50PSItRFdJVEhfRU5WSVJPTk1FTlQ9QUxMX0VOVklST05NRU5UIgorZmkKKworCitjZ2VuX21haW50PW5vCitjZ2VuPS4uLy4uL2NnZW4vY2dlbgorY2dlbmRpcj0nJChzcmNkaXIpLy4uLy4uL2NnZW4nCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY2dlbi1tYWludCBvciAtLWRpc2FibGUtY2dlbi1tYWludCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9jZ2VuX21haW50K3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9jZ2VuX21haW50IgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJY2dlbl9tYWludD15ZXMgOzsKKyAgbm8pCWNnZW5fbWFpbnQ9bm8gOzsKKyAgKikKKwkjIGFyZ3VtZW50IGlzIGNnZW4gaW5zdGFsbCBkaXJlY3RvcnkgKG5vdCBpbXBsZW1lbnRlZCB5ZXQpLgorCSMgSGF2aW5nIGEgYHNoYXJlJyBkaXJlY3RvcnkgbWlnaHQgYmUgbW9yZSBhcHByb3ByaWF0ZSBmb3IgdGhlIC5zY20sCisJIyAuY3B1LCBldGMuIGZpbGVzLgorCWNnZW5kaXI9JHtjZ2VuX21haW50fS9saWIvY2dlbgorCWNnZW49JHtjZ2VuZGlyfS9iaW4vY2dlbgorCTs7Citlc2FjCitmaQoraWYgdGVzdCB4JHtjZ2VuX21haW50fSAhPSB4bm8gOyB0aGVuCisgIENHRU5fTUFJTlQ9JycKK2Vsc2UKKyAgQ0dFTl9NQUlOVD0nIycKK2ZpCisKKworCisKKworCisKK3RyYXAgJycgMSAyIDE1CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KKyAgKmFjX3NwYWNlPVwgKikKKyAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgc2VkIC1uIFwKKyAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCisgICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCisgICAgOzsKKyAgKikKKyAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKyAgICA7OworICBlc2FjID4+IGNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCisjIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KKyMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJworZmkKKwordHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorCitERUZTPS1ESEFWRV9DT05GSUdfSAorCisjIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKworZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUworcm0gLWYgJENPTkZJR19TVEFUVVMKK2NhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisjISAvYmluL3NoCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAorIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMKKyMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCisjCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKK2ZvciBhY19vcHRpb24KK2RvCisgIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCisgICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQorICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCithY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAc2ltX2Vudmlyb25tZW50QCUkc2ltX2Vudmlyb25tZW50JWcKK3MlQHNpbV9hbGlnbm1lbnRAJSRzaW1fYWxpZ25tZW50JWcKK3MlQHNpbV9hc3NlcnRAJSRzaW1fYXNzZXJ0JWcKK3MlQHNpbV9iaXRzaXplQCUkc2ltX2JpdHNpemUlZworcyVAc2ltX2VuZGlhbkAlJHNpbV9lbmRpYW4lZworcyVAc2ltX2hvc3RlbmRpYW5AJSRzaW1faG9zdGVuZGlhbiVnCitzJUBzaW1fZmxvYXRAJSRzaW1fZmxvYXQlZworcyVAc2ltX3NjYWNoZUAlJHNpbV9zY2FjaGUlZworcyVAc2ltX2RlZmF1bHRfbW9kZWxAJSRzaW1fZGVmYXVsdF9tb2RlbCVnCitzJUBzaW1faHdfY2ZsYWdzQCUkc2ltX2h3X2NmbGFncyVnCitzJUBzaW1faHdfb2Jqc0AlJHNpbV9od19vYmpzJWcKK3MlQHNpbV9od0AlJHNpbV9odyVnCitzJUBzaW1faW5saW5lQCUkc2ltX2lubGluZSVnCitzJUBzaW1fcGFja2FnZXNAJSRzaW1fcGFja2FnZXMlZworcyVAc2ltX3JlZ3Bhcm1AJSRzaW1fcmVncGFybSVnCitzJUBzaW1fcmVzZXJ2ZWRfYml0c0AlJHNpbV9yZXNlcnZlZF9iaXRzJWcKK3MlQHNpbV9zbXBAJSRzaW1fc21wJWcKK3MlQHNpbV9zdGRjYWxsQCUkc2ltX3N0ZGNhbGwlZworcyVAc2ltX3hvcl9lbmRpYW5AJSRzaW1feG9yX2VuZGlhbiVnCitzJUBidWlsZF93YXJuaW5nc0AlJGJ1aWxkX3dhcm5pbmdzJWcKK3MlQFNIRUxMQCUkU0hFTEwlZworcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBGRkxBR1NAJSRGRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBob3N0QCUkaG9zdCVnCitzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCitzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKK3MlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZworcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKK3MlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCitzJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCitzJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCitzJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZworcyVAYnVpbGRAJSRidWlsZCVnCitzJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKK3MlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCitzJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZworcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCitzJUBDQ0AlJENDJWcKK3MlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCitzJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKK3MlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCitzJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZworcyVASERFRklORVNAJSRIREVGSU5FUyVnCitzJUBBUkAlJEFSJWcKK3MlQFJBTkxJQkAlJFJBTkxJQiVnCitzJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKK3MlQENQUEAlJENQUCVnCitzJUBBTExPQ0FAJSRBTExPQ0ElZworcyVAVVNFX05MU0AlJFVTRV9OTFMlZworcyVATVNHRk1UQCUkTVNHRk1UJWcKK3MlQEdNU0dGTVRAJSRHTVNHRk1UJWcKK3MlQFhHRVRURVhUQCUkWEdFVFRFWFQlZworcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCitzJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKK3MlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCitzJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKK3MlQEdNT0ZJTEVTQCUkR01PRklMRVMlZworcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZworcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCitzJUBJTlRMTElCU0AlJElOVExMSUJTJWcKK3MlQElOVExPQkpTQCUkSU5UTE9CSlMlZworcyVAUE9GSUxFU0AlJFBPRklMRVMlZworcyVAUE9TVUJAJSRQT1NVQiVnCitzJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCitzJUBHVF9OT0AlJEdUX05PJWcKK3MlQEdUX1lFU0AlJEdUX1lFUyVnCitzJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCitzJUBsQCUkbCVnCitzJUBNQUlOVEAlJE1BSU5UJWcKK3MlQHNpbV9ic3dhcEAlJHNpbV9ic3dhcCVnCitzJUBzaW1fY2ZsYWdzQCUkc2ltX2NmbGFncyVnCitzJUBzaW1fZGVidWdAJSRzaW1fZGVidWclZworcyVAc2ltX3N0ZGlvQCUkc2ltX3N0ZGlvJWcKK3MlQHNpbV90cmFjZUAlJHNpbV90cmFjZSVnCitzJUBzaW1fcHJvZmlsZUAlJHNpbV9wcm9maWxlJWcKK3MlQEVYRUVYVEAlJEVYRUVYVCVnCitzJUBDR0VOX01BSU5UQCUkQ0dFTl9NQUlOVCVnCitzJUBjZ2VuZGlyQCUkY2dlbmRpciVnCitzJUBjZ2VuQCUkY2dlbiVnCisKK0NFT0YKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KK2FjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCithY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19tb3JlX2xpbmVzPToKK2FjX3NlZF9jbWRzPSIiCit3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBmaQorICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCisgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZWxzZQorICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZmkKKyAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKyAgICBhY19iZWc9JGFjX2VuZAorICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgYWNfc2VkX2NtZHM9Y2F0CitmaQorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitDT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKyAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCisgIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCitzJUBJTlNUQUxMQCUkSU5TVEFMTCVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKKyMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyMKKyMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KK2FjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJworYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCithY19kQz0nXDMnCithY19kRD0nJWcnCisjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKK2FjX3VDPScgJworYWNfdUQ9J1w0JWcnCisjIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY19lQj0nJCVcMSNcMmRlZmluZVwzJworYWNfZUM9JyAnCithY19lRD0nJWcnCisKK2lmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmaQorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQorCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0CisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgorCitFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKKyMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKK2NhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKK3MvW1xcJiVdL1xcJi9nCitzJVtcXCRgXSVcXCYlZworcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKK3MlYWNfZCVhY191JWdwCitzJWFjX3UlYWNfZSVncAorRU9GCitzZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCitybSAtZiBjb25mdGVzdC5oZHIKKworIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgorIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCitjYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKK3MlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCitFT0YKKworIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCisjIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgorCitybSAtZiBjb25mdGVzdC50YWlsCit3aGlsZSA6CitkbworICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCisgICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KKyAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQorICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KKyAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCisnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAorICBybSAtZiBjb25mdGVzdC52YWxzCisgIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscworZG9uZQorcm0gLWYgY29uZnRlc3QudmFscworCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAorICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKKyAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCisgICAgcm0gLWYgY29uZnRlc3QuaAorICBlbHNlCisgICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBmaQorICAgIHJtIC1mICRhY19maWxlCisgICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQorICBmaQorZmk7IGRvbmUKKworRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorYWNfc291cmNlcz0iJHNpbV9saW5rX2ZpbGVzIgorYWNfZGVzdHM9IiRzaW1fbGlua19saW5rcyIKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitzcmNkaXI9JGFjX2dpdmVuX3NyY2Rpcgord2hpbGUgdGVzdCAtbiAiJGFjX3NvdXJjZXMiOyBkbworICBzZXQgJGFjX2Rlc3RzOyBhY19kZXN0PSQxOyBzaGlmdDsgYWNfZGVzdHM9JCoKKyAgc2V0ICRhY19zb3VyY2VzOyBhY19zb3VyY2U9JDE7IHNoaWZ0OyBhY19zb3VyY2VzPSQqCisKKyAgZWNobyAibGlua2luZyAkc3JjZGlyLyRhY19zb3VyY2UgdG8gJGFjX2Rlc3QiCisKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3NvdXJjZTsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBGaWxlIG5vdCBmb3VuZCIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCisgIHJtIC1mICRhY19kZXN0CisKKyAgIyBNYWtlIHJlbGF0aXZlIHN5bWxpbmtzLgorICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGVzdF9kaXI9YGVjaG8gJGFjX2Rlc3R8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9ICIkYWNfZGVzdCIgJiYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZGVzdCBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2Rlc3RfZGlyIiAmJiBta2RpciAiJGFjX2Rlc3RfZGlyIgorICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kZXN0X2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGVzdF9kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rlc3RfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkc3JjZGlyIiBpbgorICBbLyRdKikgYWNfcmVsX3NvdXJjZT0iJHNyY2Rpci8kYWNfc291cmNlIiA7OworICAqKSBhY19yZWxfc291cmNlPSIkYWNfZG90cyRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKKyAgZXNhYworCisgICMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGU7IG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsuCisgIGlmIGxuIC1zICRhY19yZWxfc291cmNlICRhY19kZXN0IDI+L2Rldi9udWxsIHx8CisgICAgbG4gJHNyY2Rpci8kYWNfc291cmNlICRhY19kZXN0OyB0aGVuIDoKKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBsaW5rICRhY19kZXN0IHRvICRzcmNkaXIvJGFjX3NvdXJjZSIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitkb25lCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2Nhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgorIHhNYWtlZmlsZSopCisgICBlY2hvICJNZXJnaW5nIE1ha2VmaWxlLnNpbStNYWtlLWNvbW1vbi5zaW0gaW50byBNYWtlZmlsZSAuLi4iCisgICBybSAtZiBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wIE1ha2VmaWxlCisgICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BSRV8vLC9eIyMgRW5kIENPTU1PTl9QUkVfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMS50bXAKKyAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUE9TVF8vLC9eIyMgRW5kIENPTU1PTl9QT1NUXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTIudG1wCisgICBzZWQgLWUgJy9eIyMgQ09NTU9OX1BSRV8vIHIgTWFrZXNpbTEudG1wJyBcCisJLWUgJy9eIyMgQ09NTU9OX1BPU1RfLyByIE1ha2VzaW0yLnRtcCcgXAorCTxNYWtlZmlsZS5zaW0gPk1ha2VmaWxlCisgICBybSAtZiBNYWtlZmlsZS5zaW0gTWFrZS1jb21tb24uc2ltIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAKKyAgIDs7CisgZXNhYworIGNhc2UgIngkQ09ORklHX0hFQURFUlMiIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWMKKworZXhpdCAwCitFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCitybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwordGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisKKwpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvY29uZmlndXJlLmluIGIvc2ltL2k5NjAvY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNTU4NzUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaTk2MC9jb25maWd1cmUuaW4KQEAgLTAsMCArMSwxNiBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitzaW5jbHVkZSguLi9jb21tb24vYWNsb2NhbC5tNCkKK0FDX1BSRVJFUSgyLjUpZG5sCitBQ19JTklUKE1ha2VmaWxlLmluKQorCitTSU1fQUNfQ09NTU9OCisKK1NJTV9BQ19PUFRJT05fRU5ESUFOKExJVFRMRV9FTkRJQU4pCitTSU1fQUNfT1BUSU9OX0FMSUdOTUVOVChOT05TVFJJQ1RfQUxJR05NRU5UKQorU0lNX0FDX09QVElPTl9IT1NURU5ESUFOCitTSU1fQUNfT1BUSU9OX1NDQUNIRSgxMDI0KQorU0lNX0FDX09QVElPTl9ERUZBVUxUX01PREVMKGk5NjBLQSkKK1NJTV9BQ19PUFRJT05fRU5WSVJPTk1FTlQKK1NJTV9BQ19PUFRJT05fQ0dFTl9NQUlOVAorCitTSU1fQUNfT1VUUFVUCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9jcHUuYyBiL3NpbS9pOTYwL2NwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYzZhMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaTk2MC9jcHUuYwpAQCAtMCwwICsxLDg0IEBACisvKiBNaXNjLiBzdXBwb3J0IGZvciBDUFUgZmFtaWx5IGk5NjBiYXNlLgorCitUSElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgorCitDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisqLworCisjZGVmaW5lIFdBTlRfQ1BVIGk5NjBiYXNlCisjZGVmaW5lIFdBTlRfQ1BVX0k5NjBCQVNFCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtcGMuICAqLworCitVU0kKK2k5NjBiYXNlX2hfcGNfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKK3sKKyAgcmV0dXJuIENQVSAoaF9wYyk7Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLXBjLiAgKi8KKwordm9pZAoraTk2MGJhc2VfaF9wY19zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVU0kgbmV3dmFsKQoreworICBDUFUgKGhfcGMpID0gbmV3dmFsOworfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtZ3IuICAqLworCitTSQoraTk2MGJhc2VfaF9ncl9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vKQoreworICByZXR1cm4gQ1BVIChoX2dyW3JlZ25vXSk7Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLWdyLiAgKi8KKwordm9pZAoraTk2MGJhc2VfaF9ncl9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vLCBTSSBuZXd2YWwpCit7CisgIENQVSAoaF9ncltyZWdub10pID0gbmV3dmFsOworfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtY2MuICAqLworCitTSQoraTk2MGJhc2VfaF9jY19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICByZXR1cm4gQ1BVIChoX2NjKTsKK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtY2MuICAqLworCit2b2lkCitpOTYwYmFzZV9oX2NjX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNJIG5ld3ZhbCkKK3sKKyAgQ1BVIChoX2NjKSA9IG5ld3ZhbDsKK30KKworLyogUmVjb3JkIHRyYWNlIHJlc3VsdHMgZm9yIElOU04uICAqLworCit2b2lkCitpOTYwYmFzZV9yZWNvcmRfdHJhY2VfcmVzdWx0cyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIENHRU5fSU5TTiAqaW5zbiwKKwkJCSAgICBpbnQgKmluZGljZXMsIFRSQUNFX1JFQ09SRCAqdHIpCit7Cit9CmRpZmYgLS1naXQgYS9zaW0vaTk2MC9jcHUuaCBiL3NpbS9pOTYwL2NwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNTMyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaTk2MC9jcHUuaApAQCAtMCwwICsxLDE4NjAgQEAKKy8qIENQVSBmYW1pbHkgaGVhZGVyIGZvciBpOTYwYmFzZS4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2lmbmRlZiBDUFVfSTk2MEJBU0VfSAorI2RlZmluZSBDUFVfSTk2MEJBU0VfSAorCisvKiBNYXhpbXVtIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgZmV0Y2hlZCBhdCBhIHRpbWUuCisgICBUaGlzIGlzIGZvciBMSVcgdHlwZSBpbnN0cnVjdGlvbnMgc2V0cyAoZS5nLiBtMzJyKS4gICovCisjZGVmaW5lIE1BWF9MSVdfSU5TTlMgMQorCisvKiBNYXhpbXVtIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuICAqLworI2RlZmluZSBNQVhfUEFSQUxMRUxfSU5TTlMgMQorCisvKiBDUFUgc3RhdGUgaW5mb3JtYXRpb24uICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBIYXJkd2FyZSBlbGVtZW50cy4gICovCisgIHN0cnVjdCB7CisgIC8qIHByb2dyYW0gY291bnRlciAqLworICBVU0kgaF9wYzsKKyNkZWZpbmUgR0VUX0hfUEMoKSBDUFUgKGhfcGMpCisjZGVmaW5lIFNFVF9IX1BDKHgpIChDUFUgKGhfcGMpID0gKHgpKQorICAvKiBnZW5lcmFsIHJlZ2lzdGVycyAqLworICBTSSBoX2dyWzMyXTsKKyNkZWZpbmUgR0VUX0hfR1IoYTEpIENQVSAoaF9ncilbYTFdCisjZGVmaW5lIFNFVF9IX0dSKGExLCB4KSAoQ1BVIChoX2dyKVthMV0gPSAoeCkpCisgIC8qIGNvbmRpdGlvbiBjb2RlICovCisgIFNJIGhfY2M7CisjZGVmaW5lIEdFVF9IX0NDKCkgQ1BVIChoX2NjKQorI2RlZmluZSBTRVRfSF9DQyh4KSAoQ1BVIChoX2NjKSA9ICh4KSkKKyAgfSBoYXJkd2FyZTsKKyNkZWZpbmUgQ1BVX0NHRU5fSFcoY3B1KSAoJiAoY3B1KS0+Y3B1X2RhdGEuaGFyZHdhcmUpCit9IEk5NjBCQVNFX0NQVV9EQVRBOworCisvKiBDb3ZlciBmbnMgZm9yIHJlZ2lzdGVyIGFjY2Vzcy4gICovCitVU0kgaTk2MGJhc2VfaF9wY19nZXQgKFNJTV9DUFUgKik7Cit2b2lkIGk5NjBiYXNlX2hfcGNfc2V0IChTSU1fQ1BVICosIFVTSSk7CitTSSBpOTYwYmFzZV9oX2dyX2dldCAoU0lNX0NQVSAqLCBVSU5UKTsKK3ZvaWQgaTk2MGJhc2VfaF9ncl9zZXQgKFNJTV9DUFUgKiwgVUlOVCwgU0kpOworU0kgaTk2MGJhc2VfaF9jY19nZXQgKFNJTV9DUFUgKik7Cit2b2lkIGk5NjBiYXNlX2hfY2Nfc2V0IChTSU1fQ1BVICosIFNJKTsKKworLyogVGhlc2UgbXVzdCBiZSBoYW5kLXdyaXR0ZW4uICAqLworZXh0ZXJuIENQVVJFR19GRVRDSF9GTiBpOTYwYmFzZV9mZXRjaF9yZWdpc3RlcjsKK2V4dGVybiBDUFVSRUdfU1RPUkVfRk4gaTk2MGJhc2Vfc3RvcmVfcmVnaXN0ZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGVtcHR5OworfSBNT0RFTF9JOTYwS0FfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgZW1wdHk7Cit9IE1PREVMX0k5NjBDQV9EQVRBOworCit1bmlvbiBzZW1fZmllbGRzIHsKKyAgICBzdHJ1Y3QgeyAvKiBlbXB0eSBzZm9ybWF0IGZvciB1bnNwZWNpZmllZCBmaWVsZCBsaXN0ICovCisgICAgICBpbnQgZW1wdHk7CisgICAgfSBmbXRfZW1wdHk7CisgICAgc3RydWN0IHsgLyogZS5nLiBtdWxvICRzcmMxLCAkc3JjMiwgJGRzdCAqLworICAgICAgU0kgKiBpX3NyYzE7CisgICAgICBTSSAqIGlfc3JjMjsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzE7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzI7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbXVsbzsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIG11bG8gJGxpdDEsICRzcmMyLCAkZHN0ICovCisgICAgICBVSU5UIGZfc3JjMTsKKyAgICAgIFNJICogaV9zcmMyOworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9tdWxvMTsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIG11bG8gJHNyYzEsICRsaXQyLCAkZHN0ICovCisgICAgICBVSU5UIGZfc3JjMjsKKyAgICAgIFNJICogaV9zcmMxOworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9tdWxvMjsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIG11bG8gJGxpdDEsICRsaXQyLCAkZHN0ICovCisgICAgICBVSU5UIGZfc3JjMTsKKyAgICAgIFVJTlQgZl9zcmMyOworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9tdWxvMzsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIG5vdGJpdCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKyAgICAgIFNJICogaV9zcmMxOworICAgICAgU0kgKiBpX3NyYzI7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMxOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMyOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgIH0gZm10X25vdGJpdDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIG5vdGJpdCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KKyAgICAgIFVJTlQgZl9zcmMxOworICAgICAgU0kgKiBpX3NyYzI7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMyOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgIH0gZm10X25vdGJpdDE7CisgICAgc3RydWN0IHsgLyogZS5nLiBub3RiaXQgJHNyYzEsICRsaXQyLCAkZHN0ICovCisgICAgICBVSU5UIGZfc3JjMjsKKyAgICAgIFNJICogaV9zcmMxOworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9ub3RiaXQyOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbm90Yml0ICRsaXQxLCAkbGl0MiwgJGRzdCAqLworICAgICAgVUlOVCBmX3NyYzE7CisgICAgICBVSU5UIGZfc3JjMjsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbm90Yml0MzsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIG5vdCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKyAgICAgIFNJICogaV9zcmMxOworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9ub3Q7CisgICAgc3RydWN0IHsgLyogZS5nLiBub3QgJGxpdDEsICRzcmMyLCAkZHN0ICovCisgICAgICBVSU5UIGZfc3JjMTsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbm90MTsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIG5vdCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KKyAgICAgIFNJICogaV9zcmMxOworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9ub3QyOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbm90ICRsaXQxLCAkbGl0MiwgJGRzdCAqLworICAgICAgVUlOVCBmX3NyYzE7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgIH0gZm10X25vdDM7CisgICAgc3RydWN0IHsgLyogZS5nLiBlbXVsICRzcmMxLCAkc3JjMiwgJGRzdCAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFNJICogaV9zcmMxOworICAgICAgU0kgKiBpX3NyYzI7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMxOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMyOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMTsKKyAgICB9IGZtdF9lbXVsOworICAgIHN0cnVjdCB7IC8qIGUuZy4gZW11bCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfc3JjMTsKKyAgICAgIFNJICogaV9zcmMyOworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzE7CisgICAgfSBmbXRfZW11bDE7CisgICAgc3RydWN0IHsgLyogZS5nLiBlbXVsICRzcmMxLCAkbGl0MiwgJGRzdCAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFVJTlQgZl9zcmMyOworICAgICAgU0kgKiBpX3NyYzE7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMxOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMTsKKyAgICB9IGZtdF9lbXVsMjsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGVtdWwgJGxpdDEsICRsaXQyLCAkZHN0ICovCisgICAgICBVSU5UIGZfc3JjZHN0OworICAgICAgVUlOVCBmX3NyYzE7CisgICAgICBVSU5UIGZfc3JjMjsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xOworICAgIH0gZm10X2VtdWwzOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbW92bCAkc3JjMSwgJGRzdCAqLworICAgICAgVUlOVCBmX3NyYzE7CisgICAgICBVSU5UIGZfc3JjZHN0OworICAgICAgU0kgKiBpX3NyYzE7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3JjMV9jb25zdF9fV0lfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzE7CisgICAgfSBmbXRfbW92bDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIG1vdmwgJGxpdDEsICRkc3QgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfc3JjMTsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xOworICAgIH0gZm10X21vdmwxOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbW92dCAkc3JjMSwgJGRzdCAqLworICAgICAgVUlOVCBmX3NyYzE7CisgICAgICBVSU5UIGZfc3JjZHN0OworICAgICAgU0kgKiBpX3NyYzE7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3JjMV9jb25zdF9fV0lfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3NyYzFfY29uc3RfX1dJXzI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzE7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMjsKKyAgICB9IGZtdF9tb3Z0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gbW92dCAkbGl0MSwgJGRzdCAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFVJTlQgZl9zcmMxOworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzE7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8yOworICAgIH0gZm10X21vdnQxOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbW92cSAkc3JjMSwgJGRzdCAqLworICAgICAgVUlOVCBmX3NyYzE7CisgICAgICBVSU5UIGZfc3JjZHN0OworICAgICAgU0kgKiBpX3NyYzE7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3JjMV9jb25zdF9fV0lfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3NyYzFfY29uc3RfX1dJXzI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zcmMxX2NvbnN0X19XSV8zOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMxOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzI7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8zOworICAgIH0gZm10X21vdnE7CisgICAgc3RydWN0IHsgLyogZS5nLiBtb3ZxICRsaXQxLCAkZHN0ICovCisgICAgICBVSU5UIGZfc3JjZHN0OworICAgICAgVUlOVCBmX3NyYzE7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzI7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8zOworICAgIH0gZm10X21vdnExOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbW9kcGMgJHNyYzEsICRzcmMyLCAkZHN0ICovCisgICAgICBTSSAqIGlfc3JjMjsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzI7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbW9kcGM7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZGEgJG9mZnNldCwgJGRzdCAqLworICAgICAgVUlOVCBmX29mZnNldDsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbGRhX29mZnNldDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkYSAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KKyAgICAgIFVJTlQgZl9vZmZzZXQ7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZGFfaW5kaXJlY3Rfb2Zmc2V0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGRhICgkYWJhc2UpLCAkZHN0ICovCisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZGFfaW5kaXJlY3Q7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZGEgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisgICAgICBVSU5UIGZfc2NhbGU7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfaW5kZXg7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faW5kZXg7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbGRhX2luZGlyZWN0X2luZGV4OworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGRhICRvcHRkaXNwLCAkZHN0ICovCisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbGRhX2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZGEgJG9wdGRpc3AoJGFiYXNlKSwgJGRzdCAqLworICAgICAgVUlOVCBmX29wdGRpc3A7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZGFfaW5kaXJlY3RfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkYSAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgVUlOVCBmX3NjYWxlOworICAgICAgU0kgKiBpX2luZGV4OworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faW5kZXg7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbGRhX2luZGV4X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZGEgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgVUlOVCBmX3NjYWxlOworICAgICAgU0kgKiBpX2FiYXNlOworICAgICAgU0kgKiBpX2luZGV4OworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2luZGV4OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgIH0gZm10X2xkYV9pbmRpcmVjdF9pbmRleF9kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGQgJG9mZnNldCwgJGRzdCAqLworICAgICAgVUlOVCBmX29mZnNldDsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbGRfb2Zmc2V0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGQgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCisgICAgICBVSU5UIGZfb2Zmc2V0OworICAgICAgU0kgKiBpX2FiYXNlOworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbGRfaW5kaXJlY3Rfb2Zmc2V0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGQgKCRhYmFzZSksICRkc3QgKi8KKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgIH0gZm10X2xkX2luZGlyZWN0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGQgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisgICAgICBVSU5UIGZfc2NhbGU7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfaW5kZXg7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faW5kZXg7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbGRfaW5kaXJlY3RfaW5kZXg7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZCAkb3B0ZGlzcCwgJGRzdCAqLworICAgICAgVUlOVCBmX29wdGRpc3A7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgIH0gZm10X2xkX2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZCAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgIH0gZm10X2xkX2luZGlyZWN0X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZCAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgVUlOVCBmX3NjYWxlOworICAgICAgU0kgKiBpX2luZGV4OworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faW5kZXg7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbGRfaW5kZXhfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZF9pbmRpcmVjdF9pbmRleF9kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGRvYiAkb2Zmc2V0LCAkZHN0ICovCisgICAgICBVSU5UIGZfb2Zmc2V0OworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZG9iX29mZnNldDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkb2IgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCisgICAgICBVSU5UIGZfb2Zmc2V0OworICAgICAgU0kgKiBpX2FiYXNlOworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbGRvYl9pbmRpcmVjdF9vZmZzZXQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZG9iICgkYWJhc2UpLCAkZHN0ICovCisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZG9iX2luZGlyZWN0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGRvYiAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZG9iX2luZGlyZWN0X2luZGV4OworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGRvYiAkb3B0ZGlzcCwgJGRzdCAqLworICAgICAgVUlOVCBmX29wdGRpc3A7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgIH0gZm10X2xkb2JfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkb2IgJG9wdGRpc3AoJGFiYXNlKSwgJGRzdCAqLworICAgICAgVUlOVCBmX29wdGRpc3A7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZG9iX2luZGlyZWN0X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZG9iICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworICAgICAgVUlOVCBmX29wdGRpc3A7CisgICAgICBVSU5UIGZfc2NhbGU7CisgICAgICBTSSAqIGlfaW5kZXg7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZG9iX2luZGV4X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZG9iICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZG9iX2luZGlyZWN0X2luZGV4X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZG9zICRvZmZzZXQsICRkc3QgKi8KKyAgICAgIFVJTlQgZl9vZmZzZXQ7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgIH0gZm10X2xkb3Nfb2Zmc2V0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGRvcyAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KKyAgICAgIFVJTlQgZl9vZmZzZXQ7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZG9zX2luZGlyZWN0X29mZnNldDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkb3MgKCRhYmFzZSksICRkc3QgKi8KKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgIH0gZm10X2xkb3NfaW5kaXJlY3Q7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZG9zICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworICAgICAgVUlOVCBmX3NjYWxlOworICAgICAgU0kgKiBpX2FiYXNlOworICAgICAgU0kgKiBpX2luZGV4OworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2luZGV4OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgIH0gZm10X2xkb3NfaW5kaXJlY3RfaW5kZXg7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZG9zICRvcHRkaXNwLCAkZHN0ICovCisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbGRvc19kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGRvcyAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgIH0gZm10X2xkb3NfaW5kaXJlY3RfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkb3MgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2luZGV4OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgIH0gZm10X2xkb3NfaW5kZXhfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkb3MgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgVUlOVCBmX3NjYWxlOworICAgICAgU0kgKiBpX2FiYXNlOworICAgICAgU0kgKiBpX2luZGV4OworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2luZGV4OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgIH0gZm10X2xkb3NfaW5kaXJlY3RfaW5kZXhfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkaWIgJG9mZnNldCwgJGRzdCAqLworICAgICAgVUlOVCBmX29mZnNldDsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbGRpYl9vZmZzZXQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZGliICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLworICAgICAgVUlOVCBmX29mZnNldDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgIH0gZm10X2xkaWJfaW5kaXJlY3Rfb2Zmc2V0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGRpYiAoJGFiYXNlKSwgJGRzdCAqLworICAgICAgU0kgKiBpX2FiYXNlOworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbGRpYl9pbmRpcmVjdDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkaWIgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisgICAgICBVSU5UIGZfc2NhbGU7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfaW5kZXg7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faW5kZXg7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbGRpYl9pbmRpcmVjdF9pbmRleDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkaWIgJG9wdGRpc3AsICRkc3QgKi8KKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZGliX2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZGliICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgU0kgKiBpX2FiYXNlOworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbGRpYl9pbmRpcmVjdF9kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGRpYiAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgVUlOVCBmX3NjYWxlOworICAgICAgU0kgKiBpX2luZGV4OworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faW5kZXg7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbGRpYl9pbmRleF9kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGRpYiAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworICAgICAgVUlOVCBmX29wdGRpc3A7CisgICAgICBVSU5UIGZfc2NhbGU7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfaW5kZXg7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faW5kZXg7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbGRpYl9pbmRpcmVjdF9pbmRleF9kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGRpcyAkb2Zmc2V0LCAkZHN0ICovCisgICAgICBVSU5UIGZfb2Zmc2V0OworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZGlzX29mZnNldDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkaXMgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCisgICAgICBVSU5UIGZfb2Zmc2V0OworICAgICAgU0kgKiBpX2FiYXNlOworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgfSBmbXRfbGRpc19pbmRpcmVjdF9vZmZzZXQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZGlzICgkYWJhc2UpLCAkZHN0ICovCisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZGlzX2luZGlyZWN0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGRpcyAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZGlzX2luZGlyZWN0X2luZGV4OworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGRpcyAkb3B0ZGlzcCwgJGRzdCAqLworICAgICAgVUlOVCBmX29wdGRpc3A7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgIH0gZm10X2xkaXNfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkaXMgJG9wdGRpc3AoJGFiYXNlKSwgJGRzdCAqLworICAgICAgVUlOVCBmX29wdGRpc3A7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZGlzX2luZGlyZWN0X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZGlzICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworICAgICAgVUlOVCBmX29wdGRpc3A7CisgICAgICBVSU5UIGZfc2NhbGU7CisgICAgICBTSSAqIGlfaW5kZXg7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZGlzX2luZGV4X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZGlzICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICB9IGZtdF9sZGlzX2luZGlyZWN0X2luZGV4X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZGwgJG9mZnNldCwgJGRzdCAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFVJTlQgZl9vZmZzZXQ7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMTsKKyAgICB9IGZtdF9sZGxfb2Zmc2V0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGRsICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFVJTlQgZl9vZmZzZXQ7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzE7CisgICAgfSBmbXRfbGRsX2luZGlyZWN0X29mZnNldDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkbCAoJGFiYXNlKSwgJGRzdCAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMTsKKyAgICB9IGZtdF9sZGxfaW5kaXJlY3Q7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZGwgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisgICAgICBVSU5UIGZfc3JjZHN0OworICAgICAgVUlOVCBmX3NjYWxlOworICAgICAgU0kgKiBpX2FiYXNlOworICAgICAgU0kgKiBpX2luZGV4OworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2luZGV4OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMTsKKyAgICB9IGZtdF9sZGxfaW5kaXJlY3RfaW5kZXg7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZGwgJG9wdGRpc3AsICRkc3QgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xOworICAgIH0gZm10X2xkbF9kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGRsICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMTsKKyAgICB9IGZtdF9sZGxfaW5kaXJlY3RfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkbCAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2luZGV4OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMTsKKyAgICB9IGZtdF9sZGxfaW5kZXhfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkbCAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgVUlOVCBmX3NjYWxlOworICAgICAgU0kgKiBpX2FiYXNlOworICAgICAgU0kgKiBpX2luZGV4OworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2luZGV4OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMTsKKyAgICB9IGZtdF9sZGxfaW5kaXJlY3RfaW5kZXhfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkdCAkb2Zmc2V0LCAkZHN0ICovCisgICAgICBVSU5UIGZfc3JjZHN0OworICAgICAgVUlOVCBmX29mZnNldDsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMjsKKyAgICB9IGZtdF9sZHRfb2Zmc2V0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGR0ICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFVJTlQgZl9vZmZzZXQ7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzE7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8yOworICAgIH0gZm10X2xkdF9pbmRpcmVjdF9vZmZzZXQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZHQgKCRhYmFzZSksICRkc3QgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzE7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8yOworICAgIH0gZm10X2xkdF9pbmRpcmVjdDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkdCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfc2NhbGU7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfaW5kZXg7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faW5kZXg7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMjsKKyAgICB9IGZtdF9sZHRfaW5kaXJlY3RfaW5kZXg7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZHQgJG9wdGRpc3AsICRkc3QgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMjsKKyAgICB9IGZtdF9sZHRfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkdCAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCisgICAgICBVSU5UIGZfc3JjZHN0OworICAgICAgVUlOVCBmX29wdGRpc3A7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzE7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8yOworICAgIH0gZm10X2xkdF9pbmRpcmVjdF9kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGR0ICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgVUlOVCBmX3NjYWxlOworICAgICAgU0kgKiBpX2luZGV4OworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faW5kZXg7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMjsKKyAgICB9IGZtdF9sZHRfaW5kZXhfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkdCAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgVUlOVCBmX3NjYWxlOworICAgICAgU0kgKiBpX2FiYXNlOworICAgICAgU0kgKiBpX2luZGV4OworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2luZGV4OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzI7CisgICAgfSBmbXRfbGR0X2luZGlyZWN0X2luZGV4X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZHEgJG9mZnNldCwgJGRzdCAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFVJTlQgZl9vZmZzZXQ7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzI7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8zOworICAgIH0gZm10X2xkcV9vZmZzZXQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZHEgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCisgICAgICBVSU5UIGZfc3JjZHN0OworICAgICAgVUlOVCBmX29mZnNldDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzI7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8zOworICAgIH0gZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZHEgKCRhYmFzZSksICRkc3QgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzE7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8yOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMzsKKyAgICB9IGZtdF9sZHFfaW5kaXJlY3Q7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZHEgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisgICAgICBVSU5UIGZfc3JjZHN0OworICAgICAgVUlOVCBmX3NjYWxlOworICAgICAgU0kgKiBpX2FiYXNlOworICAgICAgU0kgKiBpX2luZGV4OworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2luZGV4OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzI7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8zOworICAgIH0gZm10X2xkcV9pbmRpcmVjdF9pbmRleDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkcSAkb3B0ZGlzcCwgJGRzdCAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgU0kgKiBpX2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzE7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8yOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMzsKKyAgICB9IGZtdF9sZHFfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkcSAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCisgICAgICBVSU5UIGZfc3JjZHN0OworICAgICAgVUlOVCBmX29wdGRpc3A7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RzdDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzE7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8yOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMzsKKyAgICB9IGZtdF9sZHFfaW5kaXJlY3RfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkcSAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2luZGV4OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzI7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8zOworICAgIH0gZm10X2xkcV9pbmRleF9kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGRxICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisgICAgICBVSU5UIGZfc3JjZHN0OworICAgICAgVUlOVCBmX29wdGRpc3A7CisgICAgICBVSU5UIGZfc2NhbGU7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfaW5kZXg7CisgICAgICBTSSAqIGlfZHN0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faW5kZXg7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kc3Q7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzM7CisgICAgfSBmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdCAkc3Rfc3JjLCAkb2Zmc2V0ICovCisgICAgICBVSU5UIGZfb2Zmc2V0OworICAgICAgU0kgKiBpX3N0X3NyYzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0X29mZnNldDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0ICRzdF9zcmMsICRvZmZzZXQoJGFiYXNlKSAqLworICAgICAgVUlOVCBmX29mZnNldDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3RfaW5kaXJlY3Rfb2Zmc2V0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3QgJHN0X3NyYywgKCRhYmFzZSkgKi8KKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3RfaW5kaXJlY3Q7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdCAkc3Rfc3JjLCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0X2luZGlyZWN0X2luZGV4OworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3QgJHN0X3NyYywgJG9wdGRpc3AgKi8KKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgU0kgKiBpX3N0X3NyYzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdCAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpICovCisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3RfaW5kaXJlY3RfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0ICRzdF9zcmMsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlICovCisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2luZGV4OworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3RfaW5kZXhfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0ICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0X2luZGlyZWN0X2luZGV4X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdG9iICRzdF9zcmMsICRvZmZzZXQgKi8KKyAgICAgIFVJTlQgZl9vZmZzZXQ7CisgICAgICBTSSAqIGlfc3Rfc3JjOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3RvYl9vZmZzZXQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdG9iICRzdF9zcmMsICRvZmZzZXQoJGFiYXNlKSAqLworICAgICAgVUlOVCBmX29mZnNldDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3RvYl9pbmRpcmVjdF9vZmZzZXQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdG9iICRzdF9zcmMsICgkYWJhc2UpICovCisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfc3Rfc3JjOworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0b2JfaW5kaXJlY3Q7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdG9iICRzdF9zcmMsICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLworICAgICAgVUlOVCBmX3NjYWxlOworICAgICAgU0kgKiBpX2FiYXNlOworICAgICAgU0kgKiBpX2luZGV4OworICAgICAgU0kgKiBpX3N0X3NyYzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2luZGV4OworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3RvYl9pbmRpcmVjdF9pbmRleDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0b2IgJHN0X3NyYywgJG9wdGRpc3AgKi8KKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgU0kgKiBpX3N0X3NyYzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0b2JfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0b2IgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKSAqLworICAgICAgVUlOVCBmX29wdGRpc3A7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfc3Rfc3JjOworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0b2JfaW5kaXJlY3RfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0b2IgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgVUlOVCBmX3NjYWxlOworICAgICAgU0kgKiBpX2luZGV4OworICAgICAgU0kgKiBpX3N0X3NyYzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faW5kZXg7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3N0X3NyYzsKKyAgICB9IGZtdF9zdG9iX2luZGV4X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdG9iICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0b2JfaW5kaXJlY3RfaW5kZXhfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0b3MgJHN0X3NyYywgJG9mZnNldCAqLworICAgICAgVUlOVCBmX29mZnNldDsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3N0X3NyYzsKKyAgICB9IGZtdF9zdG9zX29mZnNldDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0b3MgJHN0X3NyYywgJG9mZnNldCgkYWJhc2UpICovCisgICAgICBVSU5UIGZfb2Zmc2V0OworICAgICAgU0kgKiBpX2FiYXNlOworICAgICAgU0kgKiBpX3N0X3NyYzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3N0X3NyYzsKKyAgICB9IGZtdF9zdG9zX2luZGlyZWN0X29mZnNldDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0b3MgJHN0X3NyYywgKCRhYmFzZSkgKi8KKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3Rvc19pbmRpcmVjdDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0b3MgJHN0X3NyYywgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCisgICAgICBVSU5UIGZfc2NhbGU7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfaW5kZXg7CisgICAgICBTSSAqIGlfc3Rfc3JjOworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faW5kZXg7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3N0X3NyYzsKKyAgICB9IGZtdF9zdG9zX2luZGlyZWN0X2luZGV4OworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3RvcyAkc3Rfc3JjLCAkb3B0ZGlzcCAqLworICAgICAgVUlOVCBmX29wdGRpc3A7CisgICAgICBTSSAqIGlfc3Rfc3JjOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3Rvc19kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3RvcyAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpICovCisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3Rvc19pbmRpcmVjdF9kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3RvcyAkc3Rfc3JjLCAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZSAqLworICAgICAgVUlOVCBmX29wdGRpc3A7CisgICAgICBVSU5UIGZfc2NhbGU7CisgICAgICBTSSAqIGlfaW5kZXg7CisgICAgICBTSSAqIGlfc3Rfc3JjOworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0b3NfaW5kZXhfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0b3MgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgVUlOVCBmX3NjYWxlOworICAgICAgU0kgKiBpX2FiYXNlOworICAgICAgU0kgKiBpX2luZGV4OworICAgICAgU0kgKiBpX3N0X3NyYzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2luZGV4OworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3Rvc19pbmRpcmVjdF9pbmRleF9kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3RsICRzdF9zcmMsICRvZmZzZXQgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfb2Zmc2V0OworICAgICAgU0kgKiBpX3N0X3NyYzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0bF9vZmZzZXQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdGwgJHN0X3NyYywgJG9mZnNldCgkYWJhc2UpICovCisgICAgICBVSU5UIGZfc3JjZHN0OworICAgICAgVUlOVCBmX29mZnNldDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3RsX2luZGlyZWN0X29mZnNldDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0bCAkc3Rfc3JjLCAoJGFiYXNlKSAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3RsX2luZGlyZWN0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3RsICRzdF9zcmMsICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0bF9pbmRpcmVjdF9pbmRleDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0bCAkc3Rfc3JjLCAkb3B0ZGlzcCAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgU0kgKiBpX3N0X3NyYzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0bF9kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3RsICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3RsX2luZGlyZWN0X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdGwgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzE7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2luZGV4OworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3RsX2luZGV4X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdGwgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0bF9pbmRpcmVjdF9pbmRleF9kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3R0ICRzdF9zcmMsICRvZmZzZXQgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfb2Zmc2V0OworICAgICAgU0kgKiBpX3N0X3NyYzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0dF9vZmZzZXQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdHQgJHN0X3NyYywgJG9mZnNldCgkYWJhc2UpICovCisgICAgICBVSU5UIGZfc3JjZHN0OworICAgICAgVUlOVCBmX29mZnNldDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8yOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3R0X2luZGlyZWN0X29mZnNldDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0dCAkc3Rfc3JjLCAoJGFiYXNlKSAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8yOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3R0X2luZGlyZWN0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3R0ICRzdF9zcmMsICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8yOworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0dF9pbmRpcmVjdF9pbmRleDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0dCAkc3Rfc3JjLCAkb3B0ZGlzcCAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgU0kgKiBpX3N0X3NyYzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0dF9kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3R0ICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8yOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3R0X2luZGlyZWN0X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdHQgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzE7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2luZGV4OworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3R0X2luZGV4X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdHQgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8yOworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0dF9pbmRpcmVjdF9pbmRleF9kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3RxICRzdF9zcmMsICRvZmZzZXQgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfb2Zmc2V0OworICAgICAgU0kgKiBpX3N0X3NyYzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0cV9vZmZzZXQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdHEgJHN0X3NyYywgJG9mZnNldCgkYWJhc2UpICovCisgICAgICBVSU5UIGZfc3JjZHN0OworICAgICAgVUlOVCBmX29mZnNldDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8yOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8zOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3RxX2luZGlyZWN0X29mZnNldDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0cSAkc3Rfc3JjLCAoJGFiYXNlKSAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8yOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8zOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3RxX2luZGlyZWN0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3RxICRzdF9zcmMsICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8yOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8zOworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0cV9pbmRpcmVjdF9pbmRleDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0cSAkc3Rfc3JjLCAkb3B0ZGlzcCAqLworICAgICAgVUlOVCBmX3NyY2RzdDsKKyAgICAgIFVJTlQgZl9vcHRkaXNwOworICAgICAgU0kgKiBpX3N0X3NyYzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0cV9kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3RxICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8yOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8zOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3RxX2luZGlyZWN0X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdHEgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzE7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2luZGV4OworICAgICAgdW5zaWduZWQgY2hhciBpbl9zdF9zcmM7CisgICAgfSBmbXRfc3RxX2luZGV4X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdHEgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KKyAgICAgIFVJTlQgZl9zcmNkc3Q7CisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICAgIFVJTlQgZl9zY2FsZTsKKyAgICAgIFNJICogaV9hYmFzZTsKKyAgICAgIFNJICogaV9pbmRleDsKKyAgICAgIFNJICogaV9zdF9zcmM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8yOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8zOworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3Rfc3JjOworICAgIH0gZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gY21waSAkc3JjMSwgJHNyYzIgKi8KKyAgICAgIFNJICogaV9zcmMxOworICAgICAgU0kgKiBpX3NyYzI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzE7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzI7CisgICAgfSBmbXRfY21waTsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGNtcGkgJGxpdDEsICRzcmMyICovCisgICAgICBVSU5UIGZfc3JjMTsKKyAgICAgIFNJICogaV9zcmMyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMyOworICAgIH0gZm10X2NtcGkxOworICAgIHN0cnVjdCB7IC8qIGUuZy4gY21waSAkc3JjMSwgJGxpdDIgKi8KKyAgICAgIFVJTlQgZl9zcmMyOworICAgICAgU0kgKiBpX3NyYzE7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzE7CisgICAgfSBmbXRfY21waTI7CisgICAgc3RydWN0IHsgLyogZS5nLiBjbXBpICRsaXQxLCAkbGl0MiAqLworICAgICAgVUlOVCBmX3NyYzE7CisgICAgICBVSU5UIGZfc3JjMjsKKyAgICB9IGZtdF9jbXBpMzsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGNtcG8gJHNyYzEsICRzcmMyICovCisgICAgICBTSSAqIGlfc3JjMTsKKyAgICAgIFNJICogaV9zcmMyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMxOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMyOworICAgIH0gZm10X2NtcG87CisgICAgc3RydWN0IHsgLyogZS5nLiBjbXBvICRsaXQxLCAkc3JjMiAqLworICAgICAgVUlOVCBmX3NyYzE7CisgICAgICBTSSAqIGlfc3JjMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMjsKKyAgICB9IGZtdF9jbXBvMTsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGNtcG8gJHNyYzEsICRsaXQyICovCisgICAgICBVSU5UIGZfc3JjMjsKKyAgICAgIFNJICogaV9zcmMxOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMxOworICAgIH0gZm10X2NtcG8yOworICAgIHN0cnVjdCB7IC8qIGUuZy4gY21wbyAkbGl0MSwgJGxpdDIgKi8KKyAgICAgIFVJTlQgZl9zcmMxOworICAgICAgVUlOVCBmX3NyYzI7CisgICAgfSBmbXRfY21wbzM7CisgICAgc3RydWN0IHsgLyogZS5nLiB0ZXN0bm8gJGJyX3NyYzEgKi8KKyAgICAgIFNJICogaV9icl9zcmMxOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfYnJfc3JjMTsKKyAgICB9IGZtdF90ZXN0bm9fcmVnOworICAgIHN0cnVjdCB7IC8qIGUuZy4gZmx1c2hyZWcgKi8KKyAgICAgIGludCBlbXB0eTsKKyAgICB9IGZtdF9mbHVzaHJlZzsKKyAgLyogY3RpIGluc25zLCBrZXB0IHNlcGFyYXRlbHkgc28gYWRkcl9jYWNoZSBpcyBpbiBmaXhlZCBwbGFjZSAqLworICBzdHJ1Y3QgeworICAgIHVuaW9uIHsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGNtcG9iZSAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCisgICAgICBJQUREUiBpX2JyX2Rpc3A7CisgICAgICBTSSAqIGlfYnJfc3JjMTsKKyAgICAgIFNJICogaV9icl9zcmMyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9icl9zcmMxOworICAgICAgdW5zaWduZWQgY2hhciBpbl9icl9zcmMyOworICAgIH0gZm10X2NtcG9iZV9yZWc7CisgICAgc3RydWN0IHsgLyogZS5nLiBjbXBvYmUgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworICAgICAgVUlOVCBmX2JyX3NyYzE7CisgICAgICBJQUREUiBpX2JyX2Rpc3A7CisgICAgICBTSSAqIGlfYnJfc3JjMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYnJfc3JjMjsKKyAgICB9IGZtdF9jbXBvYmVfbGl0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gY21wb2JsICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKyAgICAgIElBRERSIGlfYnJfZGlzcDsKKyAgICAgIFNJICogaV9icl9zcmMxOworICAgICAgU0kgKiBpX2JyX3NyYzI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2JyX3NyYzE7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2JyX3NyYzI7CisgICAgfSBmbXRfY21wb2JsX3JlZzsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGNtcG9ibCAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCisgICAgICBVSU5UIGZfYnJfc3JjMTsKKyAgICAgIElBRERSIGlfYnJfZGlzcDsKKyAgICAgIFNJICogaV9icl9zcmMyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9icl9zcmMyOworICAgIH0gZm10X2NtcG9ibF9saXQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBiYmMgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworICAgICAgSUFERFIgaV9icl9kaXNwOworICAgICAgU0kgKiBpX2JyX3NyYzE7CisgICAgICBTSSAqIGlfYnJfc3JjMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYnJfc3JjMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fYnJfc3JjMjsKKyAgICB9IGZtdF9iYmNfcmVnOworICAgIHN0cnVjdCB7IC8qIGUuZy4gYmJjICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKyAgICAgIFVJTlQgZl9icl9zcmMxOworICAgICAgSUFERFIgaV9icl9kaXNwOworICAgICAgU0kgKiBpX2JyX3NyYzI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2JyX3NyYzI7CisgICAgfSBmbXRfYmJjX2xpdDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGJubyAkY3RybF9kaXNwICovCisgICAgICBJQUREUiBpX2N0cmxfZGlzcDsKKyAgICB9IGZtdF9ibm87CisgICAgc3RydWN0IHsgLyogZS5nLiBiICRjdHJsX2Rpc3AgKi8KKyAgICAgIElBRERSIGlfY3RybF9kaXNwOworICAgIH0gZm10X2I7CisgICAgc3RydWN0IHsgLyogZS5nLiBieCAkb2Zmc2V0KCRhYmFzZSkgKi8KKyAgICAgIFVJTlQgZl9vZmZzZXQ7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgIH0gZm10X2J4X2luZGlyZWN0X29mZnNldDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGJ4ICgkYWJhc2UpICovCisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgIH0gZm10X2J4X2luZGlyZWN0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gYnggKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCisgICAgICBVSU5UIGZfc2NhbGU7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICBTSSAqIGlfaW5kZXg7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9pbmRleDsKKyAgICB9IGZtdF9ieF9pbmRpcmVjdF9pbmRleDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGJ4ICRvcHRkaXNwICovCisgICAgICBVSU5UIGZfb3B0ZGlzcDsKKyAgICB9IGZtdF9ieF9kaXNwOworICAgIHN0cnVjdCB7IC8qIGUuZy4gYnggJG9wdGRpc3AoJGFiYXNlKSAqLworICAgICAgVUlOVCBmX29wdGRpc3A7CisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgIH0gZm10X2J4X2luZGlyZWN0X2Rpc3A7CisgICAgc3RydWN0IHsgLyogZS5nLiBjYWxseCAkb3B0ZGlzcCAqLworICAgICAgVUlOVCBmX29wdGRpc3A7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzEwOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzExOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzEyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzEzOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE0OworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE1OworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8zMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl80OworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzU7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfNjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl83OworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzg7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfOTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTA7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzExOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTM7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xNTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMzE7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzQ7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzU7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzY7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzc7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzg7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzk7CisgICAgfSBmbXRfY2FsbHhfZGlzcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGNhbGx4ICgkYWJhc2UpICovCisgICAgICBTSSAqIGlfYWJhc2U7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzA7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xMzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8xNTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8yOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMzE7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfNDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl81OworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzY7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfNzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl84OworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzk7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzA7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzEwOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTI7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzEzOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xNDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTU7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzI7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzM7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzMxOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl80OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl81OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl82OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl83OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl84OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl85OworICAgIH0gZm10X2NhbGx4X2luZGlyZWN0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gY2FsbHggJG9mZnNldCgkYWJhc2UpICovCisgICAgICBVSU5UIGZfb2Zmc2V0OworICAgICAgU0kgKiBpX2FiYXNlOworICAgICAgdW5zaWduZWQgY2hhciBpbl9hYmFzZTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8wOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzE7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTA7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTE7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTM7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTQ7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMTU7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8zOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzMxOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzQ7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfNTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl82OworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzc7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfODsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl85OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8wOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xMDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTE7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzEyOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xMzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTQ7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE1OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8yOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8zOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8zMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfNDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfNTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfNjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfNzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfODsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfOTsKKyAgICB9IGZtdF9jYWxseF9pbmRpcmVjdF9vZmZzZXQ7CisgICAgc3RydWN0IHsgLyogZS5nLiByZXQgKi8KKyAgICAgIGludCBlbXB0eTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5faF9ncl8wOworICAgICAgdW5zaWduZWQgY2hhciBpbl9oX2dyXzI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2hfZ3JfMzE7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzA7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzE7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzEwOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTI7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzEzOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xNDsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTU7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzI7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzM7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9oX2dyXzMxOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl80OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl81OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl82OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl83OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl84OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl85OworICAgIH0gZm10X3JldDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGNhbGxzICRzcmMxICovCisgICAgICBTSSAqIGlfc3JjMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMTsKKyAgICB9IGZtdF9jYWxsczsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGZtYXJrICovCisgICAgICBpbnQgZW1wdHk7CisgICAgfSBmbXRfZm1hcms7CisgICAgfSBmaWVsZHM7CisjaWYgV0lUSF9TQ0FDSEVfUEJCCisgICAgU0VNX1BDIGFkZHJfY2FjaGU7CisjZW5kaWYKKyAgfSBjdGk7CisjaWYgV0lUSF9TQ0FDSEVfUEJCCisgIC8qIFdyaXRlYmFjayBoYW5kbGVyLiAgKi8KKyAgc3RydWN0IHsKKyAgICAvKiBQb2ludGVyIHRvIGFyZ2J1ZiBlbnRyeSBmb3IgaW5zbiB3aG9zZSByZXN1bHRzIG5lZWQgd3JpdGluZyBiYWNrLiAgKi8KKyAgICBjb25zdCBzdHJ1Y3QgYXJnYnVmICphYnVmOworICB9IHdyaXRlOworICAvKiB4LWJlZm9yZSBoYW5kbGVyICovCisgIHN0cnVjdCB7CisgICAgLypjb25zdCBTQ0FDSEUgKmluc25zW01BWF9QQVJBTExFTF9JTlNOU107Ki8KKyAgICBpbnQgZmlyc3RfcDsKKyAgfSBiZWZvcmU7CisgIC8qIHgtYWZ0ZXIgaGFuZGxlciAqLworICBzdHJ1Y3QgeworICAgIGludCBlbXB0eTsKKyAgfSBhZnRlcjsKKyAgLyogVGhpcyBlbnRyeSBpcyB1c2VkIHRvIHRlcm1pbmF0ZSBlYWNoIHBiYi4gICovCisgIHN0cnVjdCB7CisgICAgLyogTnVtYmVyIG9mIGluc25zIGluIHBiYi4gICovCisgICAgaW50IGluc25fY291bnQ7CisgICAgLyogTmV4dCBwYmIgdG8gZXhlY3V0ZS4gICovCisgICAgU0NBQ0hFICpuZXh0OworICB9IGNoYWluOworI2VuZGlmCit9OworCisvKiBUaGUgQVJHQlVGIHN0cnVjdC4gICovCitzdHJ1Y3QgYXJnYnVmIHsKKyAgLyogVGhlc2UgYXJlIHRoZSBiYXNlY2xhc3MgZGVmaW5pdGlvbnMuICAqLworICBJQUREUiBhZGRyOworICBjb25zdCBJREVTQyAqaWRlc2M7CisgIGNoYXIgdHJhY2VfcDsKKyAgY2hhciBwcm9maWxlX3A7CisgIC8qIGNwdSBzcGVjaWZpYyBkYXRhIGZvbGxvd3MgKi8KKyAgdW5pb24gc2VtIHNlbWFudGljOworICBpbnQgd3JpdHRlbjsKKyAgdW5pb24gc2VtX2ZpZWxkcyBmaWVsZHM7Cit9OworCisvKiBBIGNhY2hlZCBpbnNuLgorCisgICA/Pz8gU0NBQ0hFIHVzZWQgdG8gY29udGFpbiBtb3JlIHRoYW4ganVzdCBhcmdidWYuICBXZSBjb3VsZCBkZWxldGUgdGhlCisgICB0eXBlIGVudGlyZWx5IGFuZCBhbHdheXMganVzdCB1c2UgQVJHQlVGLCBidXQgZm9yIGZ1dHVyZSBjb25jZXJucyBhbmQgYXMKKyAgIGEgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gaXQgaXMgbGVmdCBpbi4gICovCisKK3N0cnVjdCBzY2FjaGUgeworICBzdHJ1Y3QgYXJnYnVmIGFyZ2J1ZjsKK307CisKKy8qIE1hY3JvcyB0byBzaW1wbGlmeSBleHRyYWN0aW9uLCByZWFkaW5nIGFuZCBzZW1hbnRpYyBjb2RlLgorICAgVGhlc2UgZGVmaW5lIGFuZCBhc3NpZ24gdGhlIGxvY2FsIHZhcnMgdGhhdCBjb250YWluIHRoZSBpbnNuJ3MgZmllbGRzLiAgKi8KKworI2RlZmluZSBFWFRSQUNUX0lGTVRfRU1QVFlfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0VNUFRZX0NPREUgXAorICBsZW5ndGggPSAwOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX01VTE9fVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wY29kZTsgXAorICBVSU5UIGZfc3JjZHN0OyBcCisgIFVJTlQgZl9zcmMyOyBcCisgIFVJTlQgZl9tMzsgXAorICBVSU5UIGZfbTI7IFwKKyAgVUlOVCBmX20xOyBcCisgIFVJTlQgZl9vcGNvZGUyOyBcCisgIFVJTlQgZl96ZXJvOyBcCisgIFVJTlQgZl9zcmMxOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9NVUxPX0NPREUgXAorICBsZW5ndGggPSA0OyBcCisgIGZfb3Bjb2RlID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMCwgOCk7IFwKKyAgZl9zcmNkc3QgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCA4LCA1KTsgXAorICBmX3NyYzIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAxMywgNSk7IFwKKyAgZl9tMyA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDE4LCAxKTsgXAorICBmX20yID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMTksIDEpOyBcCisgIGZfbTEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAyMCwgMSk7IFwKKyAgZl9vcGNvZGUyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMjEsIDQpOyBcCisgIGZfemVybyA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDI1LCAyKTsgXAorICBmX3NyYzEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAyNywgNSk7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfTVVMTzFfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wY29kZTsgXAorICBVSU5UIGZfc3JjZHN0OyBcCisgIFVJTlQgZl9zcmMyOyBcCisgIFVJTlQgZl9tMzsgXAorICBVSU5UIGZfbTI7IFwKKyAgVUlOVCBmX20xOyBcCisgIFVJTlQgZl9vcGNvZGUyOyBcCisgIFVJTlQgZl96ZXJvOyBcCisgIFVJTlQgZl9zcmMxOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9NVUxPMV9DT0RFIFwKKyAgbGVuZ3RoID0gNDsgXAorICBmX29wY29kZSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDAsIDgpOyBcCisgIGZfc3JjZHN0ID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7IFwKKyAgZl9zcmMyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOyBcCisgIGZfbTMgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAxOCwgMSk7IFwKKyAgZl9tMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDE5LCAxKTsgXAorICBmX20xID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMjAsIDEpOyBcCisgIGZfb3Bjb2RlMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDIxLCA0KTsgXAorICBmX3plcm8gPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAyNSwgMik7IFwKKyAgZl9zcmMxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX01VTE8yX1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcGNvZGU7IFwKKyAgVUlOVCBmX3NyY2RzdDsgXAorICBVSU5UIGZfc3JjMjsgXAorICBVSU5UIGZfbTM7IFwKKyAgVUlOVCBmX20yOyBcCisgIFVJTlQgZl9tMTsgXAorICBVSU5UIGZfb3Bjb2RlMjsgXAorICBVSU5UIGZfemVybzsgXAorICBVSU5UIGZfc3JjMTsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfTVVMTzJfQ09ERSBcCisgIGxlbmd0aCA9IDQ7IFwKKyAgZl9vcGNvZGUgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAwLCA4KTsgXAorICBmX3NyY2RzdCA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOyBcCisgIGZfc3JjMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsgXAorICBmX20zID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMTgsIDEpOyBcCisgIGZfbTIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAxOSwgMSk7IFwKKyAgZl9tMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDIwLCAxKTsgXAorICBmX29wY29kZTIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAyMSwgNCk7IFwKKyAgZl96ZXJvID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMjUsIDIpOyBcCisgIGZfc3JjMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsgXAorCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9NVUxPM19WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICBVSU5UIGZfb3Bjb2RlOyBcCisgIFVJTlQgZl9zcmNkc3Q7IFwKKyAgVUlOVCBmX3NyYzI7IFwKKyAgVUlOVCBmX20zOyBcCisgIFVJTlQgZl9tMjsgXAorICBVSU5UIGZfbTE7IFwKKyAgVUlOVCBmX29wY29kZTI7IFwKKyAgVUlOVCBmX3plcm87IFwKKyAgVUlOVCBmX3NyYzE7IFwKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX01VTE8zX0NPREUgXAorICBsZW5ndGggPSA0OyBcCisgIGZfb3Bjb2RlID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMCwgOCk7IFwKKyAgZl9zcmNkc3QgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCA4LCA1KTsgXAorICBmX3NyYzIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAxMywgNSk7IFwKKyAgZl9tMyA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDE4LCAxKTsgXAorICBmX20yID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMTksIDEpOyBcCisgIGZfbTEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAyMCwgMSk7IFwKKyAgZl9vcGNvZGUyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMjEsIDQpOyBcCisgIGZfemVybyA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDI1LCAyKTsgXAorICBmX3NyYzEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAyNywgNSk7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICBVSU5UIGZfb3Bjb2RlOyBcCisgIFVJTlQgZl9zcmNkc3Q7IFwKKyAgVUlOVCBmX2FiYXNlOyBcCisgIFVJTlQgZl9tb2RlYTsgXAorICBVSU5UIGZfemVyb2E7IFwKKyAgVUlOVCBmX29mZnNldDsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9DT0RFIFwKKyAgbGVuZ3RoID0gNDsgXAorICBmX29wY29kZSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDAsIDgpOyBcCisgIGZfc3JjZHN0ID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7IFwKKyAgZl9hYmFzZSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsgXAorICBmX21vZGVhID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMTgsIDEpOyBcCisgIGZfemVyb2EgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAxOSwgMSk7IFwKKyAgZl9vZmZzZXQgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAyMCwgMTIpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICBVSU5UIGZfb3Bjb2RlOyBcCisgIFVJTlQgZl9zcmNkc3Q7IFwKKyAgVUlOVCBmX2FiYXNlOyBcCisgIFVJTlQgZl9tb2RlYjsgXAorICBVSU5UIGZfc2NhbGU7IFwKKyAgVUlOVCBmX3plcm9iOyBcCisgIFVJTlQgZl9pbmRleDsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfTERBX0lORElSRUNUX0NPREUgXAorICBsZW5ndGggPSA0OyBcCisgIGZfb3Bjb2RlID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMCwgOCk7IFwKKyAgZl9zcmNkc3QgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCA4LCA1KTsgXAorICBmX2FiYXNlID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOyBcCisgIGZfbW9kZWIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAxOCwgNCk7IFwKKyAgZl9zY2FsZSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDIyLCAzKTsgXAorICBmX3plcm9iID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMjUsIDIpOyBcCisgIGZfaW5kZXggPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAyNywgNSk7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wY29kZTsgXAorICBVSU5UIGZfb3B0ZGlzcDsgXAorICBVSU5UIGZfc3JjZHN0OyBcCisgIFVJTlQgZl9hYmFzZTsgXAorICBVSU5UIGZfbW9kZWI7IFwKKyAgVUlOVCBmX3NjYWxlOyBcCisgIFVJTlQgZl96ZXJvYjsgXAorICBVSU5UIGZfaW5kZXg7IFwKKyAgLyogQ29udGVudHMgb2YgdHJhaWxpbmcgcGFydCBvZiBpbnNuLiAgKi8gXAorICBVSU5UIHdvcmRfMTsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfTERBX0RJU1BfQ09ERSBcCisgIGxlbmd0aCA9IDg7IFwKKyAgd29yZF8xID0gR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjICsgNCk7IFwKKyAgZl9vcGNvZGUgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAwLCA4KTsgXAorICBmX29wdGRpc3AgPSAoMHwoRVhUUkFDVF9VSU5UICh3b3JkXzEsIDMyLCAwLCAzMikgPDwgMCkpOyBcCisgIGZfc3JjZHN0ID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7IFwKKyAgZl9hYmFzZSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsgXAorICBmX21vZGViID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMTgsIDQpOyBcCisgIGZfc2NhbGUgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAyMiwgMyk7IFwKKyAgZl96ZXJvYiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDI1LCAyKTsgXAorICBmX2luZGV4ID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMjcsIDUpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX1NUX09GRlNFVF9WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICBVSU5UIGZfb3Bjb2RlOyBcCisgIFVJTlQgZl9zcmNkc3Q7IFwKKyAgVUlOVCBmX2FiYXNlOyBcCisgIFVJTlQgZl9tb2RlYTsgXAorICBVSU5UIGZfemVyb2E7IFwKKyAgVUlOVCBmX29mZnNldDsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfU1RfT0ZGU0VUX0NPREUgXAorICBsZW5ndGggPSA0OyBcCisgIGZfb3Bjb2RlID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMCwgOCk7IFwKKyAgZl9zcmNkc3QgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCA4LCA1KTsgXAorICBmX2FiYXNlID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOyBcCisgIGZfbW9kZWEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAxOCwgMSk7IFwKKyAgZl96ZXJvYSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDE5LCAxKTsgXAorICBmX29mZnNldCA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDIwLCAxMik7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfU1RfSU5ESVJFQ1RfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wY29kZTsgXAorICBVSU5UIGZfc3JjZHN0OyBcCisgIFVJTlQgZl9hYmFzZTsgXAorICBVSU5UIGZfbW9kZWI7IFwKKyAgVUlOVCBmX3NjYWxlOyBcCisgIFVJTlQgZl96ZXJvYjsgXAorICBVSU5UIGZfaW5kZXg7IFwKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX1NUX0lORElSRUNUX0NPREUgXAorICBsZW5ndGggPSA0OyBcCisgIGZfb3Bjb2RlID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMCwgOCk7IFwKKyAgZl9zcmNkc3QgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCA4LCA1KTsgXAorICBmX2FiYXNlID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOyBcCisgIGZfbW9kZWIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAxOCwgNCk7IFwKKyAgZl9zY2FsZSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDIyLCAzKTsgXAorICBmX3plcm9iID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMjUsIDIpOyBcCisgIGZfaW5kZXggPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAyNywgNSk7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfU1RfRElTUF9WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICBVSU5UIGZfb3Bjb2RlOyBcCisgIFVJTlQgZl9vcHRkaXNwOyBcCisgIFVJTlQgZl9zcmNkc3Q7IFwKKyAgVUlOVCBmX2FiYXNlOyBcCisgIFVJTlQgZl9tb2RlYjsgXAorICBVSU5UIGZfc2NhbGU7IFwKKyAgVUlOVCBmX3plcm9iOyBcCisgIFVJTlQgZl9pbmRleDsgXAorICAvKiBDb250ZW50cyBvZiB0cmFpbGluZyBwYXJ0IG9mIGluc24uICAqLyBcCisgIFVJTlQgd29yZF8xOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9TVF9ESVNQX0NPREUgXAorICBsZW5ndGggPSA4OyBcCisgIHdvcmRfMSA9IEdFVElNRU1VU0kgKGN1cnJlbnRfY3B1LCBwYyArIDQpOyBcCisgIGZfb3Bjb2RlID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMCwgOCk7IFwKKyAgZl9vcHRkaXNwID0gKDB8KEVYVFJBQ1RfVUlOVCAod29yZF8xLCAzMiwgMCwgMzIpIDw8IDApKTsgXAorICBmX3NyY2RzdCA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOyBcCisgIGZfYWJhc2UgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAxMywgNSk7IFwKKyAgZl9tb2RlYiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDE4LCA0KTsgXAorICBmX3NjYWxlID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMjIsIDMpOyBcCisgIGZfemVyb2IgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAyNSwgMik7IFwKKyAgZl9pbmRleCA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDI3LCA1KTsgXAorCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9DTVBPQkVfUkVHX1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcGNvZGU7IFwKKyAgVUlOVCBmX2JyX3NyYzE7IFwKKyAgVUlOVCBmX2JyX3NyYzI7IFwKKyAgVUlOVCBmX2JyX20xOyBcCisgIFNJIGZfYnJfZGlzcDsgXAorICBVSU5UIGZfYnJfemVybzsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfQ01QT0JFX1JFR19DT0RFIFwKKyAgbGVuZ3RoID0gNDsgXAorICBmX29wY29kZSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDAsIDgpOyBcCisgIGZfYnJfc3JjMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDgsIDUpOyBcCisgIGZfYnJfc3JjMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDEzLCA1KTsgXAorICBmX2JyX20xID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMTgsIDEpOyBcCisgIGZfYnJfZGlzcCA9ICgoKChFWFRSQUNUX0lOVCAoaW5zbiwgMzIsIDE5LCAxMSkpIDw8ICgyKSkpICsgKHBjKSk7IFwKKyAgZl9icl96ZXJvID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMzAsIDIpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0NNUE9CRV9MSVRfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wY29kZTsgXAorICBVSU5UIGZfYnJfc3JjMTsgXAorICBVSU5UIGZfYnJfc3JjMjsgXAorICBVSU5UIGZfYnJfbTE7IFwKKyAgU0kgZl9icl9kaXNwOyBcCisgIFVJTlQgZl9icl96ZXJvOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9DTVBPQkVfTElUX0NPREUgXAorICBsZW5ndGggPSA0OyBcCisgIGZfb3Bjb2RlID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMCwgOCk7IFwKKyAgZl9icl9zcmMxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgOCwgNSk7IFwKKyAgZl9icl9zcmMyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMTMsIDUpOyBcCisgIGZfYnJfbTEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAxOCwgMSk7IFwKKyAgZl9icl9kaXNwID0gKCgoKEVYVFJBQ1RfSU5UIChpbnNuLCAzMiwgMTksIDExKSkgPDwgKDIpKSkgKyAocGMpKTsgXAorICBmX2JyX3plcm8gPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAzMCwgMik7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfQk5PX1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcGNvZGU7IFwKKyAgU0kgZl9jdHJsX2Rpc3A7IFwKKyAgVUlOVCBmX2N0cmxfemVybzsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfQk5PX0NPREUgXAorICBsZW5ndGggPSA0OyBcCisgIGZfb3Bjb2RlID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMCwgOCk7IFwKKyAgZl9jdHJsX2Rpc3AgPSAoKCgoRVhUUkFDVF9JTlQgKGluc24sIDMyLCA4LCAyMikpIDw8ICgyKSkpICsgKHBjKSk7IFwKKyAgZl9jdHJsX3plcm8gPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAzMCwgMik7IFwKKworLyogQ29sbGVjdGlvbiBvZiB2YXJpb3VzIHRoaW5ncyBmb3IgdGhlIHRyYWNlIGhhbmRsZXIgdG8gdXNlLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgdHJhY2VfcmVjb3JkIHsKKyAgSUFERFIgcGM7CisgIC8qIEZJWE1FOndpcCAqLworfSBUUkFDRV9SRUNPUkQ7CisKKyNlbmRpZiAvKiBDUFVfSTk2MEJBU0VfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvY3B1YWxsLmggYi9zaW0vaTk2MC9jcHVhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjJlNTU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2k5NjAvY3B1YWxsLmgKQEAgLTAsMCArMSw2NCBAQAorLyogU2ltdWxhdG9yIENQVSBoZWFkZXIgZm9yIGk5NjAuCisKK1RISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCisKK0NvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyovCisKKyNpZm5kZWYgSTk2MF9DUFVBTExfSAorI2RlZmluZSBJOTYwX0NQVUFMTF9ICisKKy8qIEluY2x1ZGUgZmlsZXMgZm9yIGVhY2ggY3B1IGZhbWlseS4gICovCisKKyNpZmRlZiBXQU5UX0NQVV9JOTYwQkFTRQorI2luY2x1ZGUgImVuZy5oIgorI2luY2x1ZGUgImNnZW4tZW5naW5lLmgiCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAiZGVjb2RlLmgiCisjZW5kaWYKKworZXh0ZXJuIGNvbnN0IE1BQ0ggaTk2MF9rYV9zYV9tYWNoOworZXh0ZXJuIGNvbnN0IE1BQ0ggaTk2MF9jYV9tYWNoOworCisjaWZuZGVmIFdBTlRfQ1BVCisvKiBUaGUgQVJHQlVGIHN0cnVjdC4gICovCitzdHJ1Y3QgYXJnYnVmIHsKKyAgLyogVGhlc2UgYXJlIHRoZSBiYXNlY2xhc3MgZGVmaW5pdGlvbnMuICAqLworICBJQUREUiBhZGRyOworICBjb25zdCBJREVTQyAqaWRlc2M7CisgIGNoYXIgdHJhY2VfcDsKKyAgY2hhciBwcm9maWxlX3A7CisgIC8qIGNwdSBzcGVjaWZpYyBkYXRhIGZvbGxvd3MgKi8KK307CisjZW5kaWYKKworI2lmbmRlZiBXQU5UX0NQVQorLyogQSBjYWNoZWQgaW5zbi4KKworICAgPz8/IFNDQUNIRSB1c2VkIHRvIGNvbnRhaW4gbW9yZSB0aGFuIGp1c3QgYXJnYnVmLiAgV2UgY291bGQgZGVsZXRlIHRoZQorICAgdHlwZSBlbnRpcmVseSBhbmQgYWx3YXlzIGp1c3QgdXNlIEFSR0JVRiwgYnV0IGZvciBmdXR1cmUgY29uY2VybnMgYW5kIGFzCisgICBhIGxldmVsIG9mIGFic3RyYWN0aW9uIGl0IGlzIGxlZnQgaW4uICAqLworCitzdHJ1Y3Qgc2NhY2hlIHsKKyAgc3RydWN0IGFyZ2J1ZiBhcmdidWY7Cit9OworI2VuZGlmCisKKyNlbmRpZiAvKiBJOTYwX0NQVUFMTF9IICovCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9kZWNvZGUuYyBiL3NpbS9pOTYwL2RlY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYjgxZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaTk2MC9kZWNvZGUuYwpAQCAtMCwwICsxLDY2NDQgQEAKKy8qIFNpbXVsYXRvciBpbnN0cnVjdGlvbiBkZWNvZGVyIGZvciBpOTYwYmFzZS4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2RlZmluZSBXQU5UX0NQVSBpOTYwYmFzZQorI2RlZmluZSBXQU5UX0NQVV9JOTYwQkFTRQorCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisKKy8qIEZJWE1FOiBOZWVkIHRvIHJldmlldyBjaG9pY2VzIGZvciB0aGUgZm9sbG93aW5nLiAgKi8KKworI2lmIFdJVEhfU0VNX1NXSVRDSF9GVUxMCisjZGVmaW5lIEZVTEwoZm4pCisjZWxzZQorI2RlZmluZSBGVUxMKGZuKSBDT05DQVQzIChpOTYwYmFzZSxfc2VtXyxmbikgLAorI2VuZGlmCisKKyNpZiBXSVRIX0ZBU1QKKyNpZiBXSVRIX1NFTV9TV0lUQ0hfRkFTVAorI2RlZmluZSBGQVNUKGZuKQorI2Vsc2UKKyNkZWZpbmUgRkFTVChmbikgQ09OQ0FUMyAoaTk2MGJhc2UsX3NlbWZfLGZuKSAsIC8qIGYgZm9yIGZhc3QgKi8KKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgRkFTVChmbikKKyNlbmRpZgorCisvKiBUaGUgaW5zdHJ1Y3Rpb24gZGVzY3JpcHRvciBhcnJheS4KKyAgIFRoaXMgaXMgY29tcHV0ZWQgYXQgcnVudGltZS4gIFNwYWNlIGZvciBpdCBpcyBub3QgbWFsbG9jJ2QgdG8gc2F2ZSBhCisgICB0ZWVuc3kgYml0IG9mIGNwdSBpbiB0aGUgZGVjb2Rlci4gIE1vdmluZyBpdCB0byBtYWxsb2Mgc3BhY2UgaXMgdHJpdmlhbAorICAgYnV0IHdvbid0IGJlIGRvbmUgdW50aWwgbmVjZXNzYXJ5ICh3ZSBkb24ndCBjdXJyZW50bHkgc3VwcG9ydCB0aGUgcnVudGltZQorICAgYWRkaXRpb24gb2YgaW5zdHJ1Y3Rpb25zIG5vciBhbiBTTVAgbWFjaGluZSB3aXRoIGRpZmZlcmVudCBjcHVzKS4gICovCitzdGF0aWMgSURFU0MgaTk2MGJhc2VfaW5zbl9kYXRhW0k5NjBCQVNFX0lOU05fTUFYXTsKKworLyogVGhlIElOU05fIHByZWZpeCBpcyBub3QgaGVyZSBhbmQgaXMgaW5zdGVhZCBwYXJ0IG9mIHRoZSBgaW5zbicgYXJndW1lbnQKKyAgIHRvIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCBoZWFkZXIgZmlsZXMgKGUuZy4gYEFORCcgaW4gYW5zaWRlY2wuaCkuICAqLworI2RlZmluZSBJRFgoaW5zbikgQ09OQ0FUMiAoSTk2MEJBU0VfLGluc24pCisjZGVmaW5lIFRZUEUoaW5zbikgQ09OQ0FUMiAoSTk2MF8saW5zbikKKworLyogQ29tbWFzIGJldHdlZW4gZWxlbWVudHMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgbWFjcm9zLgorICAgU29tZSBvZiB0aGVzZSBhcmUgY29uZGl0aW9uYWxseSBjb21waWxlZCBvdXQuICAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGluc25fc2VtIGk5NjBiYXNlX2luc25fc2VtW10gPQoreworICB7IFZJUlRVQUxfSU5TTl9YX0lOVkFMSUQsIElEWCAoSU5TTl9YX0lOVkFMSUQpLCBGVUxMICh4X2ludmFsaWQpIEZBU1QgKHhfaW52YWxpZCkgfSwKKyAgeyBWSVJUVUFMX0lOU05fWF9BRlRFUiwgSURYIChJTlNOX1hfQUZURVIpLCBGVUxMICh4X2FmdGVyKSBGQVNUICh4X2FmdGVyKSB9LAorICB7IFZJUlRVQUxfSU5TTl9YX0JFRk9SRSwgSURYIChJTlNOX1hfQkVGT1JFKSwgRlVMTCAoeF9iZWZvcmUpIEZBU1QgKHhfYmVmb3JlKSB9LAorICB7IFZJUlRVQUxfSU5TTl9YX0NUSV9DSEFJTiwgSURYIChJTlNOX1hfQ1RJX0NIQUlOKSwgRlVMTCAoeF9jdGlfY2hhaW4pIEZBU1QgKHhfY3RpX2NoYWluKSB9LAorICB7IFZJUlRVQUxfSU5TTl9YX0NIQUlOLCBJRFggKElOU05fWF9DSEFJTiksIEZVTEwgKHhfY2hhaW4pIEZBU1QgKHhfY2hhaW4pIH0sCisgIHsgVklSVFVBTF9JTlNOX1hfQkVHSU4sIElEWCAoSU5TTl9YX0JFR0lOKSwgRlVMTCAoeF9iZWdpbikgRkFTVCAoeF9iZWdpbikgfSwKKyAgeyBUWVBFIChJTlNOX01VTE8pLCBJRFggKElOU05fTVVMTyksIEZVTEwgKG11bG8pIEZBU1QgKG11bG8pIH0sCisgIHsgVFlQRSAoSU5TTl9NVUxPMSksIElEWCAoSU5TTl9NVUxPMSksIEZVTEwgKG11bG8xKSBGQVNUIChtdWxvMSkgfSwKKyAgeyBUWVBFIChJTlNOX01VTE8yKSwgSURYIChJTlNOX01VTE8yKSwgRlVMTCAobXVsbzIpIEZBU1QgKG11bG8yKSB9LAorICB7IFRZUEUgKElOU05fTVVMTzMpLCBJRFggKElOU05fTVVMTzMpLCBGVUxMIChtdWxvMykgRkFTVCAobXVsbzMpIH0sCisgIHsgVFlQRSAoSU5TTl9SRU1PKSwgSURYIChJTlNOX1JFTU8pLCBGVUxMIChyZW1vKSBGQVNUIChyZW1vKSB9LAorICB7IFRZUEUgKElOU05fUkVNTzEpLCBJRFggKElOU05fUkVNTzEpLCBGVUxMIChyZW1vMSkgRkFTVCAocmVtbzEpIH0sCisgIHsgVFlQRSAoSU5TTl9SRU1PMiksIElEWCAoSU5TTl9SRU1PMiksIEZVTEwgKHJlbW8yKSBGQVNUIChyZW1vMikgfSwKKyAgeyBUWVBFIChJTlNOX1JFTU8zKSwgSURYIChJTlNOX1JFTU8zKSwgRlVMTCAocmVtbzMpIEZBU1QgKHJlbW8zKSB9LAorICB7IFRZUEUgKElOU05fRElWTyksIElEWCAoSU5TTl9ESVZPKSwgRlVMTCAoZGl2bykgRkFTVCAoZGl2bykgfSwKKyAgeyBUWVBFIChJTlNOX0RJVk8xKSwgSURYIChJTlNOX0RJVk8xKSwgRlVMTCAoZGl2bzEpIEZBU1QgKGRpdm8xKSB9LAorICB7IFRZUEUgKElOU05fRElWTzIpLCBJRFggKElOU05fRElWTzIpLCBGVUxMIChkaXZvMikgRkFTVCAoZGl2bzIpIH0sCisgIHsgVFlQRSAoSU5TTl9ESVZPMyksIElEWCAoSU5TTl9ESVZPMyksIEZVTEwgKGRpdm8zKSBGQVNUIChkaXZvMykgfSwKKyAgeyBUWVBFIChJTlNOX1JFTUkpLCBJRFggKElOU05fUkVNSSksIEZVTEwgKHJlbWkpIEZBU1QgKHJlbWkpIH0sCisgIHsgVFlQRSAoSU5TTl9SRU1JMSksIElEWCAoSU5TTl9SRU1JMSksIEZVTEwgKHJlbWkxKSBGQVNUIChyZW1pMSkgfSwKKyAgeyBUWVBFIChJTlNOX1JFTUkyKSwgSURYIChJTlNOX1JFTUkyKSwgRlVMTCAocmVtaTIpIEZBU1QgKHJlbWkyKSB9LAorICB7IFRZUEUgKElOU05fUkVNSTMpLCBJRFggKElOU05fUkVNSTMpLCBGVUxMIChyZW1pMykgRkFTVCAocmVtaTMpIH0sCisgIHsgVFlQRSAoSU5TTl9ESVZJKSwgSURYIChJTlNOX0RJVkkpLCBGVUxMIChkaXZpKSBGQVNUIChkaXZpKSB9LAorICB7IFRZUEUgKElOU05fRElWSTEpLCBJRFggKElOU05fRElWSTEpLCBGVUxMIChkaXZpMSkgRkFTVCAoZGl2aTEpIH0sCisgIHsgVFlQRSAoSU5TTl9ESVZJMiksIElEWCAoSU5TTl9ESVZJMiksIEZVTEwgKGRpdmkyKSBGQVNUIChkaXZpMikgfSwKKyAgeyBUWVBFIChJTlNOX0RJVkkzKSwgSURYIChJTlNOX0RJVkkzKSwgRlVMTCAoZGl2aTMpIEZBU1QgKGRpdmkzKSB9LAorICB7IFRZUEUgKElOU05fQURETyksIElEWCAoSU5TTl9BRERPKSwgRlVMTCAoYWRkbykgRkFTVCAoYWRkbykgfSwKKyAgeyBUWVBFIChJTlNOX0FERE8xKSwgSURYIChJTlNOX0FERE8xKSwgRlVMTCAoYWRkbzEpIEZBU1QgKGFkZG8xKSB9LAorICB7IFRZUEUgKElOU05fQURETzIpLCBJRFggKElOU05fQURETzIpLCBGVUxMIChhZGRvMikgRkFTVCAoYWRkbzIpIH0sCisgIHsgVFlQRSAoSU5TTl9BRERPMyksIElEWCAoSU5TTl9BRERPMyksIEZVTEwgKGFkZG8zKSBGQVNUIChhZGRvMykgfSwKKyAgeyBUWVBFIChJTlNOX1NVQk8pLCBJRFggKElOU05fU1VCTyksIEZVTEwgKHN1Ym8pIEZBU1QgKHN1Ym8pIH0sCisgIHsgVFlQRSAoSU5TTl9TVUJPMSksIElEWCAoSU5TTl9TVUJPMSksIEZVTEwgKHN1Ym8xKSBGQVNUIChzdWJvMSkgfSwKKyAgeyBUWVBFIChJTlNOX1NVQk8yKSwgSURYIChJTlNOX1NVQk8yKSwgRlVMTCAoc3VibzIpIEZBU1QgKHN1Ym8yKSB9LAorICB7IFRZUEUgKElOU05fU1VCTzMpLCBJRFggKElOU05fU1VCTzMpLCBGVUxMIChzdWJvMykgRkFTVCAoc3VibzMpIH0sCisgIHsgVFlQRSAoSU5TTl9OT1RCSVQpLCBJRFggKElOU05fTk9UQklUKSwgRlVMTCAobm90Yml0KSBGQVNUIChub3RiaXQpIH0sCisgIHsgVFlQRSAoSU5TTl9OT1RCSVQxKSwgSURYIChJTlNOX05PVEJJVDEpLCBGVUxMIChub3RiaXQxKSBGQVNUIChub3RiaXQxKSB9LAorICB7IFRZUEUgKElOU05fTk9UQklUMiksIElEWCAoSU5TTl9OT1RCSVQyKSwgRlVMTCAobm90Yml0MikgRkFTVCAobm90Yml0MikgfSwKKyAgeyBUWVBFIChJTlNOX05PVEJJVDMpLCBJRFggKElOU05fTk9UQklUMyksIEZVTEwgKG5vdGJpdDMpIEZBU1QgKG5vdGJpdDMpIH0sCisgIHsgVFlQRSAoSU5TTl9BTkQpLCBJRFggKElOU05fQU5EKSwgRlVMTCAoYW5kKSBGQVNUIChhbmQpIH0sCisgIHsgVFlQRSAoSU5TTl9BTkQxKSwgSURYIChJTlNOX0FORDEpLCBGVUxMIChhbmQxKSBGQVNUIChhbmQxKSB9LAorICB7IFRZUEUgKElOU05fQU5EMiksIElEWCAoSU5TTl9BTkQyKSwgRlVMTCAoYW5kMikgRkFTVCAoYW5kMikgfSwKKyAgeyBUWVBFIChJTlNOX0FORDMpLCBJRFggKElOU05fQU5EMyksIEZVTEwgKGFuZDMpIEZBU1QgKGFuZDMpIH0sCisgIHsgVFlQRSAoSU5TTl9BTkROT1QpLCBJRFggKElOU05fQU5ETk9UKSwgRlVMTCAoYW5kbm90KSBGQVNUIChhbmRub3QpIH0sCisgIHsgVFlQRSAoSU5TTl9BTkROT1QxKSwgSURYIChJTlNOX0FORE5PVDEpLCBGVUxMIChhbmRub3QxKSBGQVNUIChhbmRub3QxKSB9LAorICB7IFRZUEUgKElOU05fQU5ETk9UMiksIElEWCAoSU5TTl9BTkROT1QyKSwgRlVMTCAoYW5kbm90MikgRkFTVCAoYW5kbm90MikgfSwKKyAgeyBUWVBFIChJTlNOX0FORE5PVDMpLCBJRFggKElOU05fQU5ETk9UMyksIEZVTEwgKGFuZG5vdDMpIEZBU1QgKGFuZG5vdDMpIH0sCisgIHsgVFlQRSAoSU5TTl9TRVRCSVQpLCBJRFggKElOU05fU0VUQklUKSwgRlVMTCAoc2V0Yml0KSBGQVNUIChzZXRiaXQpIH0sCisgIHsgVFlQRSAoSU5TTl9TRVRCSVQxKSwgSURYIChJTlNOX1NFVEJJVDEpLCBGVUxMIChzZXRiaXQxKSBGQVNUIChzZXRiaXQxKSB9LAorICB7IFRZUEUgKElOU05fU0VUQklUMiksIElEWCAoSU5TTl9TRVRCSVQyKSwgRlVMTCAoc2V0Yml0MikgRkFTVCAoc2V0Yml0MikgfSwKKyAgeyBUWVBFIChJTlNOX1NFVEJJVDMpLCBJRFggKElOU05fU0VUQklUMyksIEZVTEwgKHNldGJpdDMpIEZBU1QgKHNldGJpdDMpIH0sCisgIHsgVFlQRSAoSU5TTl9OT1RBTkQpLCBJRFggKElOU05fTk9UQU5EKSwgRlVMTCAobm90YW5kKSBGQVNUIChub3RhbmQpIH0sCisgIHsgVFlQRSAoSU5TTl9OT1RBTkQxKSwgSURYIChJTlNOX05PVEFORDEpLCBGVUxMIChub3RhbmQxKSBGQVNUIChub3RhbmQxKSB9LAorICB7IFRZUEUgKElOU05fTk9UQU5EMiksIElEWCAoSU5TTl9OT1RBTkQyKSwgRlVMTCAobm90YW5kMikgRkFTVCAobm90YW5kMikgfSwKKyAgeyBUWVBFIChJTlNOX05PVEFORDMpLCBJRFggKElOU05fTk9UQU5EMyksIEZVTEwgKG5vdGFuZDMpIEZBU1QgKG5vdGFuZDMpIH0sCisgIHsgVFlQRSAoSU5TTl9YT1IpLCBJRFggKElOU05fWE9SKSwgRlVMTCAoeG9yKSBGQVNUICh4b3IpIH0sCisgIHsgVFlQRSAoSU5TTl9YT1IxKSwgSURYIChJTlNOX1hPUjEpLCBGVUxMICh4b3IxKSBGQVNUICh4b3IxKSB9LAorICB7IFRZUEUgKElOU05fWE9SMiksIElEWCAoSU5TTl9YT1IyKSwgRlVMTCAoeG9yMikgRkFTVCAoeG9yMikgfSwKKyAgeyBUWVBFIChJTlNOX1hPUjMpLCBJRFggKElOU05fWE9SMyksIEZVTEwgKHhvcjMpIEZBU1QgKHhvcjMpIH0sCisgIHsgVFlQRSAoSU5TTl9PUiksIElEWCAoSU5TTl9PUiksIEZVTEwgKG9yKSBGQVNUIChvcikgfSwKKyAgeyBUWVBFIChJTlNOX09SMSksIElEWCAoSU5TTl9PUjEpLCBGVUxMIChvcjEpIEZBU1QgKG9yMSkgfSwKKyAgeyBUWVBFIChJTlNOX09SMiksIElEWCAoSU5TTl9PUjIpLCBGVUxMIChvcjIpIEZBU1QgKG9yMikgfSwKKyAgeyBUWVBFIChJTlNOX09SMyksIElEWCAoSU5TTl9PUjMpLCBGVUxMIChvcjMpIEZBU1QgKG9yMykgfSwKKyAgeyBUWVBFIChJTlNOX05PUiksIElEWCAoSU5TTl9OT1IpLCBGVUxMIChub3IpIEZBU1QgKG5vcikgfSwKKyAgeyBUWVBFIChJTlNOX05PUjEpLCBJRFggKElOU05fTk9SMSksIEZVTEwgKG5vcjEpIEZBU1QgKG5vcjEpIH0sCisgIHsgVFlQRSAoSU5TTl9OT1IyKSwgSURYIChJTlNOX05PUjIpLCBGVUxMIChub3IyKSBGQVNUIChub3IyKSB9LAorICB7IFRZUEUgKElOU05fTk9SMyksIElEWCAoSU5TTl9OT1IzKSwgRlVMTCAobm9yMykgRkFTVCAobm9yMykgfSwKKyAgeyBUWVBFIChJTlNOX05PVCksIElEWCAoSU5TTl9OT1QpLCBGVUxMIChub3QpIEZBU1QgKG5vdCkgfSwKKyAgeyBUWVBFIChJTlNOX05PVDEpLCBJRFggKElOU05fTk9UMSksIEZVTEwgKG5vdDEpIEZBU1QgKG5vdDEpIH0sCisgIHsgVFlQRSAoSU5TTl9OT1QyKSwgSURYIChJTlNOX05PVDIpLCBGVUxMIChub3QyKSBGQVNUIChub3QyKSB9LAorICB7IFRZUEUgKElOU05fTk9UMyksIElEWCAoSU5TTl9OT1QzKSwgRlVMTCAobm90MykgRkFTVCAobm90MykgfSwKKyAgeyBUWVBFIChJTlNOX0NMUkJJVCksIElEWCAoSU5TTl9DTFJCSVQpLCBGVUxMIChjbHJiaXQpIEZBU1QgKGNscmJpdCkgfSwKKyAgeyBUWVBFIChJTlNOX0NMUkJJVDEpLCBJRFggKElOU05fQ0xSQklUMSksIEZVTEwgKGNscmJpdDEpIEZBU1QgKGNscmJpdDEpIH0sCisgIHsgVFlQRSAoSU5TTl9DTFJCSVQyKSwgSURYIChJTlNOX0NMUkJJVDIpLCBGVUxMIChjbHJiaXQyKSBGQVNUIChjbHJiaXQyKSB9LAorICB7IFRZUEUgKElOU05fQ0xSQklUMyksIElEWCAoSU5TTl9DTFJCSVQzKSwgRlVMTCAoY2xyYml0MykgRkFTVCAoY2xyYml0MykgfSwKKyAgeyBUWVBFIChJTlNOX1NITE8pLCBJRFggKElOU05fU0hMTyksIEZVTEwgKHNobG8pIEZBU1QgKHNobG8pIH0sCisgIHsgVFlQRSAoSU5TTl9TSExPMSksIElEWCAoSU5TTl9TSExPMSksIEZVTEwgKHNobG8xKSBGQVNUIChzaGxvMSkgfSwKKyAgeyBUWVBFIChJTlNOX1NITE8yKSwgSURYIChJTlNOX1NITE8yKSwgRlVMTCAoc2hsbzIpIEZBU1QgKHNobG8yKSB9LAorICB7IFRZUEUgKElOU05fU0hMTzMpLCBJRFggKElOU05fU0hMTzMpLCBGVUxMIChzaGxvMykgRkFTVCAoc2hsbzMpIH0sCisgIHsgVFlQRSAoSU5TTl9TSFJPKSwgSURYIChJTlNOX1NIUk8pLCBGVUxMIChzaHJvKSBGQVNUIChzaHJvKSB9LAorICB7IFRZUEUgKElOU05fU0hSTzEpLCBJRFggKElOU05fU0hSTzEpLCBGVUxMIChzaHJvMSkgRkFTVCAoc2hybzEpIH0sCisgIHsgVFlQRSAoSU5TTl9TSFJPMiksIElEWCAoSU5TTl9TSFJPMiksIEZVTEwgKHNocm8yKSBGQVNUIChzaHJvMikgfSwKKyAgeyBUWVBFIChJTlNOX1NIUk8zKSwgSURYIChJTlNOX1NIUk8zKSwgRlVMTCAoc2hybzMpIEZBU1QgKHNocm8zKSB9LAorICB7IFRZUEUgKElOU05fU0hMSSksIElEWCAoSU5TTl9TSExJKSwgRlVMTCAoc2hsaSkgRkFTVCAoc2hsaSkgfSwKKyAgeyBUWVBFIChJTlNOX1NITEkxKSwgSURYIChJTlNOX1NITEkxKSwgRlVMTCAoc2hsaTEpIEZBU1QgKHNobGkxKSB9LAorICB7IFRZUEUgKElOU05fU0hMSTIpLCBJRFggKElOU05fU0hMSTIpLCBGVUxMIChzaGxpMikgRkFTVCAoc2hsaTIpIH0sCisgIHsgVFlQRSAoSU5TTl9TSExJMyksIElEWCAoSU5TTl9TSExJMyksIEZVTEwgKHNobGkzKSBGQVNUIChzaGxpMykgfSwKKyAgeyBUWVBFIChJTlNOX1NIUkkpLCBJRFggKElOU05fU0hSSSksIEZVTEwgKHNocmkpIEZBU1QgKHNocmkpIH0sCisgIHsgVFlQRSAoSU5TTl9TSFJJMSksIElEWCAoSU5TTl9TSFJJMSksIEZVTEwgKHNocmkxKSBGQVNUIChzaHJpMSkgfSwKKyAgeyBUWVBFIChJTlNOX1NIUkkyKSwgSURYIChJTlNOX1NIUkkyKSwgRlVMTCAoc2hyaTIpIEZBU1QgKHNocmkyKSB9LAorICB7IFRZUEUgKElOU05fU0hSSTMpLCBJRFggKElOU05fU0hSSTMpLCBGVUxMIChzaHJpMykgRkFTVCAoc2hyaTMpIH0sCisgIHsgVFlQRSAoSU5TTl9FTVVMKSwgSURYIChJTlNOX0VNVUwpLCBGVUxMIChlbXVsKSBGQVNUIChlbXVsKSB9LAorICB7IFRZUEUgKElOU05fRU1VTDEpLCBJRFggKElOU05fRU1VTDEpLCBGVUxMIChlbXVsMSkgRkFTVCAoZW11bDEpIH0sCisgIHsgVFlQRSAoSU5TTl9FTVVMMiksIElEWCAoSU5TTl9FTVVMMiksIEZVTEwgKGVtdWwyKSBGQVNUIChlbXVsMikgfSwKKyAgeyBUWVBFIChJTlNOX0VNVUwzKSwgSURYIChJTlNOX0VNVUwzKSwgRlVMTCAoZW11bDMpIEZBU1QgKGVtdWwzKSB9LAorICB7IFRZUEUgKElOU05fTU9WKSwgSURYIChJTlNOX01PViksIEZVTEwgKG1vdikgRkFTVCAobW92KSB9LAorICB7IFRZUEUgKElOU05fTU9WMSksIElEWCAoSU5TTl9NT1YxKSwgRlVMTCAobW92MSkgRkFTVCAobW92MSkgfSwKKyAgeyBUWVBFIChJTlNOX01PVkwpLCBJRFggKElOU05fTU9WTCksIEZVTEwgKG1vdmwpIEZBU1QgKG1vdmwpIH0sCisgIHsgVFlQRSAoSU5TTl9NT1ZMMSksIElEWCAoSU5TTl9NT1ZMMSksIEZVTEwgKG1vdmwxKSBGQVNUIChtb3ZsMSkgfSwKKyAgeyBUWVBFIChJTlNOX01PVlQpLCBJRFggKElOU05fTU9WVCksIEZVTEwgKG1vdnQpIEZBU1QgKG1vdnQpIH0sCisgIHsgVFlQRSAoSU5TTl9NT1ZUMSksIElEWCAoSU5TTl9NT1ZUMSksIEZVTEwgKG1vdnQxKSBGQVNUIChtb3Z0MSkgfSwKKyAgeyBUWVBFIChJTlNOX01PVlEpLCBJRFggKElOU05fTU9WUSksIEZVTEwgKG1vdnEpIEZBU1QgKG1vdnEpIH0sCisgIHsgVFlQRSAoSU5TTl9NT1ZRMSksIElEWCAoSU5TTl9NT1ZRMSksIEZVTEwgKG1vdnExKSBGQVNUIChtb3ZxMSkgfSwKKyAgeyBUWVBFIChJTlNOX01PRFBDKSwgSURYIChJTlNOX01PRFBDKSwgRlVMTCAobW9kcGMpIEZBU1QgKG1vZHBjKSB9LAorICB7IFRZUEUgKElOU05fTU9EQUMpLCBJRFggKElOU05fTU9EQUMpLCBGVUxMIChtb2RhYykgRkFTVCAobW9kYWMpIH0sCisgIHsgVFlQRSAoSU5TTl9MREFfT0ZGU0VUKSwgSURYIChJTlNOX0xEQV9PRkZTRVQpLCBGVUxMIChsZGFfb2Zmc2V0KSBGQVNUIChsZGFfb2Zmc2V0KSB9LAorICB7IFRZUEUgKElOU05fTERBX0lORElSRUNUX09GRlNFVCksIElEWCAoSU5TTl9MREFfSU5ESVJFQ1RfT0ZGU0VUKSwgRlVMTCAobGRhX2luZGlyZWN0X29mZnNldCkgRkFTVCAobGRhX2luZGlyZWN0X29mZnNldCkgfSwKKyAgeyBUWVBFIChJTlNOX0xEQV9JTkRJUkVDVCksIElEWCAoSU5TTl9MREFfSU5ESVJFQ1QpLCBGVUxMIChsZGFfaW5kaXJlY3QpIEZBU1QgKGxkYV9pbmRpcmVjdCkgfSwKKyAgeyBUWVBFIChJTlNOX0xEQV9JTkRJUkVDVF9JTkRFWCksIElEWCAoSU5TTl9MREFfSU5ESVJFQ1RfSU5ERVgpLCBGVUxMIChsZGFfaW5kaXJlY3RfaW5kZXgpIEZBU1QgKGxkYV9pbmRpcmVjdF9pbmRleCkgfSwKKyAgeyBUWVBFIChJTlNOX0xEQV9ESVNQKSwgSURYIChJTlNOX0xEQV9ESVNQKSwgRlVMTCAobGRhX2Rpc3ApIEZBU1QgKGxkYV9kaXNwKSB9LAorICB7IFRZUEUgKElOU05fTERBX0lORElSRUNUX0RJU1ApLCBJRFggKElOU05fTERBX0lORElSRUNUX0RJU1ApLCBGVUxMIChsZGFfaW5kaXJlY3RfZGlzcCkgRkFTVCAobGRhX2luZGlyZWN0X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MREFfSU5ERVhfRElTUCksIElEWCAoSU5TTl9MREFfSU5ERVhfRElTUCksIEZVTEwgKGxkYV9pbmRleF9kaXNwKSBGQVNUIChsZGFfaW5kZXhfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX0xEQV9JTkRJUkVDVF9JTkRFWF9ESVNQKSwgSURYIChJTlNOX0xEQV9JTkRJUkVDVF9JTkRFWF9ESVNQKSwgRlVMTCAobGRhX2luZGlyZWN0X2luZGV4X2Rpc3ApIEZBU1QgKGxkYV9pbmRpcmVjdF9pbmRleF9kaXNwKSB9LAorICB7IFRZUEUgKElOU05fTERfT0ZGU0VUKSwgSURYIChJTlNOX0xEX09GRlNFVCksIEZVTEwgKGxkX29mZnNldCkgRkFTVCAobGRfb2Zmc2V0KSB9LAorICB7IFRZUEUgKElOU05fTERfSU5ESVJFQ1RfT0ZGU0VUKSwgSURYIChJTlNOX0xEX0lORElSRUNUX09GRlNFVCksIEZVTEwgKGxkX2luZGlyZWN0X29mZnNldCkgRkFTVCAobGRfaW5kaXJlY3Rfb2Zmc2V0KSB9LAorICB7IFRZUEUgKElOU05fTERfSU5ESVJFQ1QpLCBJRFggKElOU05fTERfSU5ESVJFQ1QpLCBGVUxMIChsZF9pbmRpcmVjdCkgRkFTVCAobGRfaW5kaXJlY3QpIH0sCisgIHsgVFlQRSAoSU5TTl9MRF9JTkRJUkVDVF9JTkRFWCksIElEWCAoSU5TTl9MRF9JTkRJUkVDVF9JTkRFWCksIEZVTEwgKGxkX2luZGlyZWN0X2luZGV4KSBGQVNUIChsZF9pbmRpcmVjdF9pbmRleCkgfSwKKyAgeyBUWVBFIChJTlNOX0xEX0RJU1ApLCBJRFggKElOU05fTERfRElTUCksIEZVTEwgKGxkX2Rpc3ApIEZBU1QgKGxkX2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRF9JTkRJUkVDVF9ESVNQKSwgSURYIChJTlNOX0xEX0lORElSRUNUX0RJU1ApLCBGVUxMIChsZF9pbmRpcmVjdF9kaXNwKSBGQVNUIChsZF9pbmRpcmVjdF9kaXNwKSB9LAorICB7IFRZUEUgKElOU05fTERfSU5ERVhfRElTUCksIElEWCAoSU5TTl9MRF9JTkRFWF9ESVNQKSwgRlVMTCAobGRfaW5kZXhfZGlzcCkgRkFTVCAobGRfaW5kZXhfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX0xEX0lORElSRUNUX0lOREVYX0RJU1ApLCBJRFggKElOU05fTERfSU5ESVJFQ1RfSU5ERVhfRElTUCksIEZVTEwgKGxkX2luZGlyZWN0X2luZGV4X2Rpc3ApIEZBU1QgKGxkX2luZGlyZWN0X2luZGV4X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRE9CX09GRlNFVCksIElEWCAoSU5TTl9MRE9CX09GRlNFVCksIEZVTEwgKGxkb2Jfb2Zmc2V0KSBGQVNUIChsZG9iX29mZnNldCkgfSwKKyAgeyBUWVBFIChJTlNOX0xET0JfSU5ESVJFQ1RfT0ZGU0VUKSwgSURYIChJTlNOX0xET0JfSU5ESVJFQ1RfT0ZGU0VUKSwgRlVMTCAobGRvYl9pbmRpcmVjdF9vZmZzZXQpIEZBU1QgKGxkb2JfaW5kaXJlY3Rfb2Zmc2V0KSB9LAorICB7IFRZUEUgKElOU05fTERPQl9JTkRJUkVDVCksIElEWCAoSU5TTl9MRE9CX0lORElSRUNUKSwgRlVMTCAobGRvYl9pbmRpcmVjdCkgRkFTVCAobGRvYl9pbmRpcmVjdCkgfSwKKyAgeyBUWVBFIChJTlNOX0xET0JfSU5ESVJFQ1RfSU5ERVgpLCBJRFggKElOU05fTERPQl9JTkRJUkVDVF9JTkRFWCksIEZVTEwgKGxkb2JfaW5kaXJlY3RfaW5kZXgpIEZBU1QgKGxkb2JfaW5kaXJlY3RfaW5kZXgpIH0sCisgIHsgVFlQRSAoSU5TTl9MRE9CX0RJU1ApLCBJRFggKElOU05fTERPQl9ESVNQKSwgRlVMTCAobGRvYl9kaXNwKSBGQVNUIChsZG9iX2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRE9CX0lORElSRUNUX0RJU1ApLCBJRFggKElOU05fTERPQl9JTkRJUkVDVF9ESVNQKSwgRlVMTCAobGRvYl9pbmRpcmVjdF9kaXNwKSBGQVNUIChsZG9iX2luZGlyZWN0X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRE9CX0lOREVYX0RJU1ApLCBJRFggKElOU05fTERPQl9JTkRFWF9ESVNQKSwgRlVMTCAobGRvYl9pbmRleF9kaXNwKSBGQVNUIChsZG9iX2luZGV4X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRE9CX0lORElSRUNUX0lOREVYX0RJU1ApLCBJRFggKElOU05fTERPQl9JTkRJUkVDVF9JTkRFWF9ESVNQKSwgRlVMTCAobGRvYl9pbmRpcmVjdF9pbmRleF9kaXNwKSBGQVNUIChsZG9iX2luZGlyZWN0X2luZGV4X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRE9TX09GRlNFVCksIElEWCAoSU5TTl9MRE9TX09GRlNFVCksIEZVTEwgKGxkb3Nfb2Zmc2V0KSBGQVNUIChsZG9zX29mZnNldCkgfSwKKyAgeyBUWVBFIChJTlNOX0xET1NfSU5ESVJFQ1RfT0ZGU0VUKSwgSURYIChJTlNOX0xET1NfSU5ESVJFQ1RfT0ZGU0VUKSwgRlVMTCAobGRvc19pbmRpcmVjdF9vZmZzZXQpIEZBU1QgKGxkb3NfaW5kaXJlY3Rfb2Zmc2V0KSB9LAorICB7IFRZUEUgKElOU05fTERPU19JTkRJUkVDVCksIElEWCAoSU5TTl9MRE9TX0lORElSRUNUKSwgRlVMTCAobGRvc19pbmRpcmVjdCkgRkFTVCAobGRvc19pbmRpcmVjdCkgfSwKKyAgeyBUWVBFIChJTlNOX0xET1NfSU5ESVJFQ1RfSU5ERVgpLCBJRFggKElOU05fTERPU19JTkRJUkVDVF9JTkRFWCksIEZVTEwgKGxkb3NfaW5kaXJlY3RfaW5kZXgpIEZBU1QgKGxkb3NfaW5kaXJlY3RfaW5kZXgpIH0sCisgIHsgVFlQRSAoSU5TTl9MRE9TX0RJU1ApLCBJRFggKElOU05fTERPU19ESVNQKSwgRlVMTCAobGRvc19kaXNwKSBGQVNUIChsZG9zX2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRE9TX0lORElSRUNUX0RJU1ApLCBJRFggKElOU05fTERPU19JTkRJUkVDVF9ESVNQKSwgRlVMTCAobGRvc19pbmRpcmVjdF9kaXNwKSBGQVNUIChsZG9zX2luZGlyZWN0X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRE9TX0lOREVYX0RJU1ApLCBJRFggKElOU05fTERPU19JTkRFWF9ESVNQKSwgRlVMTCAobGRvc19pbmRleF9kaXNwKSBGQVNUIChsZG9zX2luZGV4X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRE9TX0lORElSRUNUX0lOREVYX0RJU1ApLCBJRFggKElOU05fTERPU19JTkRJUkVDVF9JTkRFWF9ESVNQKSwgRlVMTCAobGRvc19pbmRpcmVjdF9pbmRleF9kaXNwKSBGQVNUIChsZG9zX2luZGlyZWN0X2luZGV4X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRElCX09GRlNFVCksIElEWCAoSU5TTl9MRElCX09GRlNFVCksIEZVTEwgKGxkaWJfb2Zmc2V0KSBGQVNUIChsZGliX29mZnNldCkgfSwKKyAgeyBUWVBFIChJTlNOX0xESUJfSU5ESVJFQ1RfT0ZGU0VUKSwgSURYIChJTlNOX0xESUJfSU5ESVJFQ1RfT0ZGU0VUKSwgRlVMTCAobGRpYl9pbmRpcmVjdF9vZmZzZXQpIEZBU1QgKGxkaWJfaW5kaXJlY3Rfb2Zmc2V0KSB9LAorICB7IFRZUEUgKElOU05fTERJQl9JTkRJUkVDVCksIElEWCAoSU5TTl9MRElCX0lORElSRUNUKSwgRlVMTCAobGRpYl9pbmRpcmVjdCkgRkFTVCAobGRpYl9pbmRpcmVjdCkgfSwKKyAgeyBUWVBFIChJTlNOX0xESUJfSU5ESVJFQ1RfSU5ERVgpLCBJRFggKElOU05fTERJQl9JTkRJUkVDVF9JTkRFWCksIEZVTEwgKGxkaWJfaW5kaXJlY3RfaW5kZXgpIEZBU1QgKGxkaWJfaW5kaXJlY3RfaW5kZXgpIH0sCisgIHsgVFlQRSAoSU5TTl9MRElCX0RJU1ApLCBJRFggKElOU05fTERJQl9ESVNQKSwgRlVMTCAobGRpYl9kaXNwKSBGQVNUIChsZGliX2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRElCX0lORElSRUNUX0RJU1ApLCBJRFggKElOU05fTERJQl9JTkRJUkVDVF9ESVNQKSwgRlVMTCAobGRpYl9pbmRpcmVjdF9kaXNwKSBGQVNUIChsZGliX2luZGlyZWN0X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRElCX0lOREVYX0RJU1ApLCBJRFggKElOU05fTERJQl9JTkRFWF9ESVNQKSwgRlVMTCAobGRpYl9pbmRleF9kaXNwKSBGQVNUIChsZGliX2luZGV4X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRElCX0lORElSRUNUX0lOREVYX0RJU1ApLCBJRFggKElOU05fTERJQl9JTkRJUkVDVF9JTkRFWF9ESVNQKSwgRlVMTCAobGRpYl9pbmRpcmVjdF9pbmRleF9kaXNwKSBGQVNUIChsZGliX2luZGlyZWN0X2luZGV4X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRElTX09GRlNFVCksIElEWCAoSU5TTl9MRElTX09GRlNFVCksIEZVTEwgKGxkaXNfb2Zmc2V0KSBGQVNUIChsZGlzX29mZnNldCkgfSwKKyAgeyBUWVBFIChJTlNOX0xESVNfSU5ESVJFQ1RfT0ZGU0VUKSwgSURYIChJTlNOX0xESVNfSU5ESVJFQ1RfT0ZGU0VUKSwgRlVMTCAobGRpc19pbmRpcmVjdF9vZmZzZXQpIEZBU1QgKGxkaXNfaW5kaXJlY3Rfb2Zmc2V0KSB9LAorICB7IFRZUEUgKElOU05fTERJU19JTkRJUkVDVCksIElEWCAoSU5TTl9MRElTX0lORElSRUNUKSwgRlVMTCAobGRpc19pbmRpcmVjdCkgRkFTVCAobGRpc19pbmRpcmVjdCkgfSwKKyAgeyBUWVBFIChJTlNOX0xESVNfSU5ESVJFQ1RfSU5ERVgpLCBJRFggKElOU05fTERJU19JTkRJUkVDVF9JTkRFWCksIEZVTEwgKGxkaXNfaW5kaXJlY3RfaW5kZXgpIEZBU1QgKGxkaXNfaW5kaXJlY3RfaW5kZXgpIH0sCisgIHsgVFlQRSAoSU5TTl9MRElTX0RJU1ApLCBJRFggKElOU05fTERJU19ESVNQKSwgRlVMTCAobGRpc19kaXNwKSBGQVNUIChsZGlzX2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRElTX0lORElSRUNUX0RJU1ApLCBJRFggKElOU05fTERJU19JTkRJUkVDVF9ESVNQKSwgRlVMTCAobGRpc19pbmRpcmVjdF9kaXNwKSBGQVNUIChsZGlzX2luZGlyZWN0X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRElTX0lOREVYX0RJU1ApLCBJRFggKElOU05fTERJU19JTkRFWF9ESVNQKSwgRlVMTCAobGRpc19pbmRleF9kaXNwKSBGQVNUIChsZGlzX2luZGV4X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRElTX0lORElSRUNUX0lOREVYX0RJU1ApLCBJRFggKElOU05fTERJU19JTkRJUkVDVF9JTkRFWF9ESVNQKSwgRlVMTCAobGRpc19pbmRpcmVjdF9pbmRleF9kaXNwKSBGQVNUIChsZGlzX2luZGlyZWN0X2luZGV4X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRExfT0ZGU0VUKSwgSURYIChJTlNOX0xETF9PRkZTRVQpLCBGVUxMIChsZGxfb2Zmc2V0KSBGQVNUIChsZGxfb2Zmc2V0KSB9LAorICB7IFRZUEUgKElOU05fTERMX0lORElSRUNUX09GRlNFVCksIElEWCAoSU5TTl9MRExfSU5ESVJFQ1RfT0ZGU0VUKSwgRlVMTCAobGRsX2luZGlyZWN0X29mZnNldCkgRkFTVCAobGRsX2luZGlyZWN0X29mZnNldCkgfSwKKyAgeyBUWVBFIChJTlNOX0xETF9JTkRJUkVDVCksIElEWCAoSU5TTl9MRExfSU5ESVJFQ1QpLCBGVUxMIChsZGxfaW5kaXJlY3QpIEZBU1QgKGxkbF9pbmRpcmVjdCkgfSwKKyAgeyBUWVBFIChJTlNOX0xETF9JTkRJUkVDVF9JTkRFWCksIElEWCAoSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVgpLCBGVUxMIChsZGxfaW5kaXJlY3RfaW5kZXgpIEZBU1QgKGxkbF9pbmRpcmVjdF9pbmRleCkgfSwKKyAgeyBUWVBFIChJTlNOX0xETF9ESVNQKSwgSURYIChJTlNOX0xETF9ESVNQKSwgRlVMTCAobGRsX2Rpc3ApIEZBU1QgKGxkbF9kaXNwKSB9LAorICB7IFRZUEUgKElOU05fTERMX0lORElSRUNUX0RJU1ApLCBJRFggKElOU05fTERMX0lORElSRUNUX0RJU1ApLCBGVUxMIChsZGxfaW5kaXJlY3RfZGlzcCkgRkFTVCAobGRsX2luZGlyZWN0X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRExfSU5ERVhfRElTUCksIElEWCAoSU5TTl9MRExfSU5ERVhfRElTUCksIEZVTEwgKGxkbF9pbmRleF9kaXNwKSBGQVNUIChsZGxfaW5kZXhfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX0xETF9JTkRJUkVDVF9JTkRFWF9ESVNQKSwgSURYIChJTlNOX0xETF9JTkRJUkVDVF9JTkRFWF9ESVNQKSwgRlVMTCAobGRsX2luZGlyZWN0X2luZGV4X2Rpc3ApIEZBU1QgKGxkbF9pbmRpcmVjdF9pbmRleF9kaXNwKSB9LAorICB7IFRZUEUgKElOU05fTERUX09GRlNFVCksIElEWCAoSU5TTl9MRFRfT0ZGU0VUKSwgRlVMTCAobGR0X29mZnNldCkgRkFTVCAobGR0X29mZnNldCkgfSwKKyAgeyBUWVBFIChJTlNOX0xEVF9JTkRJUkVDVF9PRkZTRVQpLCBJRFggKElOU05fTERUX0lORElSRUNUX09GRlNFVCksIEZVTEwgKGxkdF9pbmRpcmVjdF9vZmZzZXQpIEZBU1QgKGxkdF9pbmRpcmVjdF9vZmZzZXQpIH0sCisgIHsgVFlQRSAoSU5TTl9MRFRfSU5ESVJFQ1QpLCBJRFggKElOU05fTERUX0lORElSRUNUKSwgRlVMTCAobGR0X2luZGlyZWN0KSBGQVNUIChsZHRfaW5kaXJlY3QpIH0sCisgIHsgVFlQRSAoSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVgpLCBJRFggKElOU05fTERUX0lORElSRUNUX0lOREVYKSwgRlVMTCAobGR0X2luZGlyZWN0X2luZGV4KSBGQVNUIChsZHRfaW5kaXJlY3RfaW5kZXgpIH0sCisgIHsgVFlQRSAoSU5TTl9MRFRfRElTUCksIElEWCAoSU5TTl9MRFRfRElTUCksIEZVTEwgKGxkdF9kaXNwKSBGQVNUIChsZHRfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX0xEVF9JTkRJUkVDVF9ESVNQKSwgSURYIChJTlNOX0xEVF9JTkRJUkVDVF9ESVNQKSwgRlVMTCAobGR0X2luZGlyZWN0X2Rpc3ApIEZBU1QgKGxkdF9pbmRpcmVjdF9kaXNwKSB9LAorICB7IFRZUEUgKElOU05fTERUX0lOREVYX0RJU1ApLCBJRFggKElOU05fTERUX0lOREVYX0RJU1ApLCBGVUxMIChsZHRfaW5kZXhfZGlzcCkgRkFTVCAobGR0X2luZGV4X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVhfRElTUCksIElEWCAoSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVhfRElTUCksIEZVTEwgKGxkdF9pbmRpcmVjdF9pbmRleF9kaXNwKSBGQVNUIChsZHRfaW5kaXJlY3RfaW5kZXhfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX0xEUV9PRkZTRVQpLCBJRFggKElOU05fTERRX09GRlNFVCksIEZVTEwgKGxkcV9vZmZzZXQpIEZBU1QgKGxkcV9vZmZzZXQpIH0sCisgIHsgVFlQRSAoSU5TTl9MRFFfSU5ESVJFQ1RfT0ZGU0VUKSwgSURYIChJTlNOX0xEUV9JTkRJUkVDVF9PRkZTRVQpLCBGVUxMIChsZHFfaW5kaXJlY3Rfb2Zmc2V0KSBGQVNUIChsZHFfaW5kaXJlY3Rfb2Zmc2V0KSB9LAorICB7IFRZUEUgKElOU05fTERRX0lORElSRUNUKSwgSURYIChJTlNOX0xEUV9JTkRJUkVDVCksIEZVTEwgKGxkcV9pbmRpcmVjdCkgRkFTVCAobGRxX2luZGlyZWN0KSB9LAorICB7IFRZUEUgKElOU05fTERRX0lORElSRUNUX0lOREVYKSwgSURYIChJTlNOX0xEUV9JTkRJUkVDVF9JTkRFWCksIEZVTEwgKGxkcV9pbmRpcmVjdF9pbmRleCkgRkFTVCAobGRxX2luZGlyZWN0X2luZGV4KSB9LAorICB7IFRZUEUgKElOU05fTERRX0RJU1ApLCBJRFggKElOU05fTERRX0RJU1ApLCBGVUxMIChsZHFfZGlzcCkgRkFTVCAobGRxX2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9MRFFfSU5ESVJFQ1RfRElTUCksIElEWCAoSU5TTl9MRFFfSU5ESVJFQ1RfRElTUCksIEZVTEwgKGxkcV9pbmRpcmVjdF9kaXNwKSBGQVNUIChsZHFfaW5kaXJlY3RfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX0xEUV9JTkRFWF9ESVNQKSwgSURYIChJTlNOX0xEUV9JTkRFWF9ESVNQKSwgRlVMTCAobGRxX2luZGV4X2Rpc3ApIEZBU1QgKGxkcV9pbmRleF9kaXNwKSB9LAorICB7IFRZUEUgKElOU05fTERRX0lORElSRUNUX0lOREVYX0RJU1ApLCBJRFggKElOU05fTERRX0lORElSRUNUX0lOREVYX0RJU1ApLCBGVUxMIChsZHFfaW5kaXJlY3RfaW5kZXhfZGlzcCkgRkFTVCAobGRxX2luZGlyZWN0X2luZGV4X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9TVF9PRkZTRVQpLCBJRFggKElOU05fU1RfT0ZGU0VUKSwgRlVMTCAoc3Rfb2Zmc2V0KSBGQVNUIChzdF9vZmZzZXQpIH0sCisgIHsgVFlQRSAoSU5TTl9TVF9JTkRJUkVDVF9PRkZTRVQpLCBJRFggKElOU05fU1RfSU5ESVJFQ1RfT0ZGU0VUKSwgRlVMTCAoc3RfaW5kaXJlY3Rfb2Zmc2V0KSBGQVNUIChzdF9pbmRpcmVjdF9vZmZzZXQpIH0sCisgIHsgVFlQRSAoSU5TTl9TVF9JTkRJUkVDVCksIElEWCAoSU5TTl9TVF9JTkRJUkVDVCksIEZVTEwgKHN0X2luZGlyZWN0KSBGQVNUIChzdF9pbmRpcmVjdCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUX0lORElSRUNUX0lOREVYKSwgSURYIChJTlNOX1NUX0lORElSRUNUX0lOREVYKSwgRlVMTCAoc3RfaW5kaXJlY3RfaW5kZXgpIEZBU1QgKHN0X2luZGlyZWN0X2luZGV4KSB9LAorICB7IFRZUEUgKElOU05fU1RfRElTUCksIElEWCAoSU5TTl9TVF9ESVNQKSwgRlVMTCAoc3RfZGlzcCkgRkFTVCAoc3RfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUX0lORElSRUNUX0RJU1ApLCBJRFggKElOU05fU1RfSU5ESVJFQ1RfRElTUCksIEZVTEwgKHN0X2luZGlyZWN0X2Rpc3ApIEZBU1QgKHN0X2luZGlyZWN0X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9TVF9JTkRFWF9ESVNQKSwgSURYIChJTlNOX1NUX0lOREVYX0RJU1ApLCBGVUxMIChzdF9pbmRleF9kaXNwKSBGQVNUIChzdF9pbmRleF9kaXNwKSB9LAorICB7IFRZUEUgKElOU05fU1RfSU5ESVJFQ1RfSU5ERVhfRElTUCksIElEWCAoSU5TTl9TVF9JTkRJUkVDVF9JTkRFWF9ESVNQKSwgRlVMTCAoc3RfaW5kaXJlY3RfaW5kZXhfZGlzcCkgRkFTVCAoc3RfaW5kaXJlY3RfaW5kZXhfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUT0JfT0ZGU0VUKSwgSURYIChJTlNOX1NUT0JfT0ZGU0VUKSwgRlVMTCAoc3RvYl9vZmZzZXQpIEZBU1QgKHN0b2Jfb2Zmc2V0KSB9LAorICB7IFRZUEUgKElOU05fU1RPQl9JTkRJUkVDVF9PRkZTRVQpLCBJRFggKElOU05fU1RPQl9JTkRJUkVDVF9PRkZTRVQpLCBGVUxMIChzdG9iX2luZGlyZWN0X29mZnNldCkgRkFTVCAoc3RvYl9pbmRpcmVjdF9vZmZzZXQpIH0sCisgIHsgVFlQRSAoSU5TTl9TVE9CX0lORElSRUNUKSwgSURYIChJTlNOX1NUT0JfSU5ESVJFQ1QpLCBGVUxMIChzdG9iX2luZGlyZWN0KSBGQVNUIChzdG9iX2luZGlyZWN0KSB9LAorICB7IFRZUEUgKElOU05fU1RPQl9JTkRJUkVDVF9JTkRFWCksIElEWCAoSU5TTl9TVE9CX0lORElSRUNUX0lOREVYKSwgRlVMTCAoc3RvYl9pbmRpcmVjdF9pbmRleCkgRkFTVCAoc3RvYl9pbmRpcmVjdF9pbmRleCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUT0JfRElTUCksIElEWCAoSU5TTl9TVE9CX0RJU1ApLCBGVUxMIChzdG9iX2Rpc3ApIEZBU1QgKHN0b2JfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUT0JfSU5ESVJFQ1RfRElTUCksIElEWCAoSU5TTl9TVE9CX0lORElSRUNUX0RJU1ApLCBGVUxMIChzdG9iX2luZGlyZWN0X2Rpc3ApIEZBU1QgKHN0b2JfaW5kaXJlY3RfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUT0JfSU5ERVhfRElTUCksIElEWCAoSU5TTl9TVE9CX0lOREVYX0RJU1ApLCBGVUxMIChzdG9iX2luZGV4X2Rpc3ApIEZBU1QgKHN0b2JfaW5kZXhfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUT0JfSU5ESVJFQ1RfSU5ERVhfRElTUCksIElEWCAoSU5TTl9TVE9CX0lORElSRUNUX0lOREVYX0RJU1ApLCBGVUxMIChzdG9iX2luZGlyZWN0X2luZGV4X2Rpc3ApIEZBU1QgKHN0b2JfaW5kaXJlY3RfaW5kZXhfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUT1NfT0ZGU0VUKSwgSURYIChJTlNOX1NUT1NfT0ZGU0VUKSwgRlVMTCAoc3Rvc19vZmZzZXQpIEZBU1QgKHN0b3Nfb2Zmc2V0KSB9LAorICB7IFRZUEUgKElOU05fU1RPU19JTkRJUkVDVF9PRkZTRVQpLCBJRFggKElOU05fU1RPU19JTkRJUkVDVF9PRkZTRVQpLCBGVUxMIChzdG9zX2luZGlyZWN0X29mZnNldCkgRkFTVCAoc3Rvc19pbmRpcmVjdF9vZmZzZXQpIH0sCisgIHsgVFlQRSAoSU5TTl9TVE9TX0lORElSRUNUKSwgSURYIChJTlNOX1NUT1NfSU5ESVJFQ1QpLCBGVUxMIChzdG9zX2luZGlyZWN0KSBGQVNUIChzdG9zX2luZGlyZWN0KSB9LAorICB7IFRZUEUgKElOU05fU1RPU19JTkRJUkVDVF9JTkRFWCksIElEWCAoSU5TTl9TVE9TX0lORElSRUNUX0lOREVYKSwgRlVMTCAoc3Rvc19pbmRpcmVjdF9pbmRleCkgRkFTVCAoc3Rvc19pbmRpcmVjdF9pbmRleCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUT1NfRElTUCksIElEWCAoSU5TTl9TVE9TX0RJU1ApLCBGVUxMIChzdG9zX2Rpc3ApIEZBU1QgKHN0b3NfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUT1NfSU5ESVJFQ1RfRElTUCksIElEWCAoSU5TTl9TVE9TX0lORElSRUNUX0RJU1ApLCBGVUxMIChzdG9zX2luZGlyZWN0X2Rpc3ApIEZBU1QgKHN0b3NfaW5kaXJlY3RfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUT1NfSU5ERVhfRElTUCksIElEWCAoSU5TTl9TVE9TX0lOREVYX0RJU1ApLCBGVUxMIChzdG9zX2luZGV4X2Rpc3ApIEZBU1QgKHN0b3NfaW5kZXhfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUT1NfSU5ESVJFQ1RfSU5ERVhfRElTUCksIElEWCAoSU5TTl9TVE9TX0lORElSRUNUX0lOREVYX0RJU1ApLCBGVUxMIChzdG9zX2luZGlyZWN0X2luZGV4X2Rpc3ApIEZBU1QgKHN0b3NfaW5kaXJlY3RfaW5kZXhfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUTF9PRkZTRVQpLCBJRFggKElOU05fU1RMX09GRlNFVCksIEZVTEwgKHN0bF9vZmZzZXQpIEZBU1QgKHN0bF9vZmZzZXQpIH0sCisgIHsgVFlQRSAoSU5TTl9TVExfSU5ESVJFQ1RfT0ZGU0VUKSwgSURYIChJTlNOX1NUTF9JTkRJUkVDVF9PRkZTRVQpLCBGVUxMIChzdGxfaW5kaXJlY3Rfb2Zmc2V0KSBGQVNUIChzdGxfaW5kaXJlY3Rfb2Zmc2V0KSB9LAorICB7IFRZUEUgKElOU05fU1RMX0lORElSRUNUKSwgSURYIChJTlNOX1NUTF9JTkRJUkVDVCksIEZVTEwgKHN0bF9pbmRpcmVjdCkgRkFTVCAoc3RsX2luZGlyZWN0KSB9LAorICB7IFRZUEUgKElOU05fU1RMX0lORElSRUNUX0lOREVYKSwgSURYIChJTlNOX1NUTF9JTkRJUkVDVF9JTkRFWCksIEZVTEwgKHN0bF9pbmRpcmVjdF9pbmRleCkgRkFTVCAoc3RsX2luZGlyZWN0X2luZGV4KSB9LAorICB7IFRZUEUgKElOU05fU1RMX0RJU1ApLCBJRFggKElOU05fU1RMX0RJU1ApLCBGVUxMIChzdGxfZGlzcCkgRkFTVCAoc3RsX2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9TVExfSU5ESVJFQ1RfRElTUCksIElEWCAoSU5TTl9TVExfSU5ESVJFQ1RfRElTUCksIEZVTEwgKHN0bF9pbmRpcmVjdF9kaXNwKSBGQVNUIChzdGxfaW5kaXJlY3RfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUTF9JTkRFWF9ESVNQKSwgSURYIChJTlNOX1NUTF9JTkRFWF9ESVNQKSwgRlVMTCAoc3RsX2luZGV4X2Rpc3ApIEZBU1QgKHN0bF9pbmRleF9kaXNwKSB9LAorICB7IFRZUEUgKElOU05fU1RMX0lORElSRUNUX0lOREVYX0RJU1ApLCBJRFggKElOU05fU1RMX0lORElSRUNUX0lOREVYX0RJU1ApLCBGVUxMIChzdGxfaW5kaXJlY3RfaW5kZXhfZGlzcCkgRkFTVCAoc3RsX2luZGlyZWN0X2luZGV4X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9TVFRfT0ZGU0VUKSwgSURYIChJTlNOX1NUVF9PRkZTRVQpLCBGVUxMIChzdHRfb2Zmc2V0KSBGQVNUIChzdHRfb2Zmc2V0KSB9LAorICB7IFRZUEUgKElOU05fU1RUX0lORElSRUNUX09GRlNFVCksIElEWCAoSU5TTl9TVFRfSU5ESVJFQ1RfT0ZGU0VUKSwgRlVMTCAoc3R0X2luZGlyZWN0X29mZnNldCkgRkFTVCAoc3R0X2luZGlyZWN0X29mZnNldCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUVF9JTkRJUkVDVCksIElEWCAoSU5TTl9TVFRfSU5ESVJFQ1QpLCBGVUxMIChzdHRfaW5kaXJlY3QpIEZBU1QgKHN0dF9pbmRpcmVjdCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUVF9JTkRJUkVDVF9JTkRFWCksIElEWCAoSU5TTl9TVFRfSU5ESVJFQ1RfSU5ERVgpLCBGVUxMIChzdHRfaW5kaXJlY3RfaW5kZXgpIEZBU1QgKHN0dF9pbmRpcmVjdF9pbmRleCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUVF9ESVNQKSwgSURYIChJTlNOX1NUVF9ESVNQKSwgRlVMTCAoc3R0X2Rpc3ApIEZBU1QgKHN0dF9kaXNwKSB9LAorICB7IFRZUEUgKElOU05fU1RUX0lORElSRUNUX0RJU1ApLCBJRFggKElOU05fU1RUX0lORElSRUNUX0RJU1ApLCBGVUxMIChzdHRfaW5kaXJlY3RfZGlzcCkgRkFTVCAoc3R0X2luZGlyZWN0X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9TVFRfSU5ERVhfRElTUCksIElEWCAoSU5TTl9TVFRfSU5ERVhfRElTUCksIEZVTEwgKHN0dF9pbmRleF9kaXNwKSBGQVNUIChzdHRfaW5kZXhfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUVF9JTkRJUkVDVF9JTkRFWF9ESVNQKSwgSURYIChJTlNOX1NUVF9JTkRJUkVDVF9JTkRFWF9ESVNQKSwgRlVMTCAoc3R0X2luZGlyZWN0X2luZGV4X2Rpc3ApIEZBU1QgKHN0dF9pbmRpcmVjdF9pbmRleF9kaXNwKSB9LAorICB7IFRZUEUgKElOU05fU1RRX09GRlNFVCksIElEWCAoSU5TTl9TVFFfT0ZGU0VUKSwgRlVMTCAoc3RxX29mZnNldCkgRkFTVCAoc3RxX29mZnNldCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUUV9JTkRJUkVDVF9PRkZTRVQpLCBJRFggKElOU05fU1RRX0lORElSRUNUX09GRlNFVCksIEZVTEwgKHN0cV9pbmRpcmVjdF9vZmZzZXQpIEZBU1QgKHN0cV9pbmRpcmVjdF9vZmZzZXQpIH0sCisgIHsgVFlQRSAoSU5TTl9TVFFfSU5ESVJFQ1QpLCBJRFggKElOU05fU1RRX0lORElSRUNUKSwgRlVMTCAoc3RxX2luZGlyZWN0KSBGQVNUIChzdHFfaW5kaXJlY3QpIH0sCisgIHsgVFlQRSAoSU5TTl9TVFFfSU5ESVJFQ1RfSU5ERVgpLCBJRFggKElOU05fU1RRX0lORElSRUNUX0lOREVYKSwgRlVMTCAoc3RxX2luZGlyZWN0X2luZGV4KSBGQVNUIChzdHFfaW5kaXJlY3RfaW5kZXgpIH0sCisgIHsgVFlQRSAoSU5TTl9TVFFfRElTUCksIElEWCAoSU5TTl9TVFFfRElTUCksIEZVTEwgKHN0cV9kaXNwKSBGQVNUIChzdHFfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUUV9JTkRJUkVDVF9ESVNQKSwgSURYIChJTlNOX1NUUV9JTkRJUkVDVF9ESVNQKSwgRlVMTCAoc3RxX2luZGlyZWN0X2Rpc3ApIEZBU1QgKHN0cV9pbmRpcmVjdF9kaXNwKSB9LAorICB7IFRZUEUgKElOU05fU1RRX0lOREVYX0RJU1ApLCBJRFggKElOU05fU1RRX0lOREVYX0RJU1ApLCBGVUxMIChzdHFfaW5kZXhfZGlzcCkgRkFTVCAoc3RxX2luZGV4X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9TVFFfSU5ESVJFQ1RfSU5ERVhfRElTUCksIElEWCAoSU5TTl9TVFFfSU5ESVJFQ1RfSU5ERVhfRElTUCksIEZVTEwgKHN0cV9pbmRpcmVjdF9pbmRleF9kaXNwKSBGQVNUIChzdHFfaW5kaXJlY3RfaW5kZXhfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX0NNUE9CRV9SRUcpLCBJRFggKElOU05fQ01QT0JFX1JFRyksIEZVTEwgKGNtcG9iZV9yZWcpIEZBU1QgKGNtcG9iZV9yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9DTVBPQkVfTElUKSwgSURYIChJTlNOX0NNUE9CRV9MSVQpLCBGVUxMIChjbXBvYmVfbGl0KSBGQVNUIChjbXBvYmVfbGl0KSB9LAorICB7IFRZUEUgKElOU05fQ01QT0JORV9SRUcpLCBJRFggKElOU05fQ01QT0JORV9SRUcpLCBGVUxMIChjbXBvYm5lX3JlZykgRkFTVCAoY21wb2JuZV9yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9DTVBPQk5FX0xJVCksIElEWCAoSU5TTl9DTVBPQk5FX0xJVCksIEZVTEwgKGNtcG9ibmVfbGl0KSBGQVNUIChjbXBvYm5lX2xpdCkgfSwKKyAgeyBUWVBFIChJTlNOX0NNUE9CTF9SRUcpLCBJRFggKElOU05fQ01QT0JMX1JFRyksIEZVTEwgKGNtcG9ibF9yZWcpIEZBU1QgKGNtcG9ibF9yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9DTVBPQkxfTElUKSwgSURYIChJTlNOX0NNUE9CTF9MSVQpLCBGVUxMIChjbXBvYmxfbGl0KSBGQVNUIChjbXBvYmxfbGl0KSB9LAorICB7IFRZUEUgKElOU05fQ01QT0JMRV9SRUcpLCBJRFggKElOU05fQ01QT0JMRV9SRUcpLCBGVUxMIChjbXBvYmxlX3JlZykgRkFTVCAoY21wb2JsZV9yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9DTVBPQkxFX0xJVCksIElEWCAoSU5TTl9DTVBPQkxFX0xJVCksIEZVTEwgKGNtcG9ibGVfbGl0KSBGQVNUIChjbXBvYmxlX2xpdCkgfSwKKyAgeyBUWVBFIChJTlNOX0NNUE9CR19SRUcpLCBJRFggKElOU05fQ01QT0JHX1JFRyksIEZVTEwgKGNtcG9iZ19yZWcpIEZBU1QgKGNtcG9iZ19yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9DTVBPQkdfTElUKSwgSURYIChJTlNOX0NNUE9CR19MSVQpLCBGVUxMIChjbXBvYmdfbGl0KSBGQVNUIChjbXBvYmdfbGl0KSB9LAorICB7IFRZUEUgKElOU05fQ01QT0JHRV9SRUcpLCBJRFggKElOU05fQ01QT0JHRV9SRUcpLCBGVUxMIChjbXBvYmdlX3JlZykgRkFTVCAoY21wb2JnZV9yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9DTVBPQkdFX0xJVCksIElEWCAoSU5TTl9DTVBPQkdFX0xJVCksIEZVTEwgKGNtcG9iZ2VfbGl0KSBGQVNUIChjbXBvYmdlX2xpdCkgfSwKKyAgeyBUWVBFIChJTlNOX0NNUElCRV9SRUcpLCBJRFggKElOU05fQ01QSUJFX1JFRyksIEZVTEwgKGNtcGliZV9yZWcpIEZBU1QgKGNtcGliZV9yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9DTVBJQkVfTElUKSwgSURYIChJTlNOX0NNUElCRV9MSVQpLCBGVUxMIChjbXBpYmVfbGl0KSBGQVNUIChjbXBpYmVfbGl0KSB9LAorICB7IFRZUEUgKElOU05fQ01QSUJORV9SRUcpLCBJRFggKElOU05fQ01QSUJORV9SRUcpLCBGVUxMIChjbXBpYm5lX3JlZykgRkFTVCAoY21waWJuZV9yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9DTVBJQk5FX0xJVCksIElEWCAoSU5TTl9DTVBJQk5FX0xJVCksIEZVTEwgKGNtcGlibmVfbGl0KSBGQVNUIChjbXBpYm5lX2xpdCkgfSwKKyAgeyBUWVBFIChJTlNOX0NNUElCTF9SRUcpLCBJRFggKElOU05fQ01QSUJMX1JFRyksIEZVTEwgKGNtcGlibF9yZWcpIEZBU1QgKGNtcGlibF9yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9DTVBJQkxfTElUKSwgSURYIChJTlNOX0NNUElCTF9MSVQpLCBGVUxMIChjbXBpYmxfbGl0KSBGQVNUIChjbXBpYmxfbGl0KSB9LAorICB7IFRZUEUgKElOU05fQ01QSUJMRV9SRUcpLCBJRFggKElOU05fQ01QSUJMRV9SRUcpLCBGVUxMIChjbXBpYmxlX3JlZykgRkFTVCAoY21waWJsZV9yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9DTVBJQkxFX0xJVCksIElEWCAoSU5TTl9DTVBJQkxFX0xJVCksIEZVTEwgKGNtcGlibGVfbGl0KSBGQVNUIChjbXBpYmxlX2xpdCkgfSwKKyAgeyBUWVBFIChJTlNOX0NNUElCR19SRUcpLCBJRFggKElOU05fQ01QSUJHX1JFRyksIEZVTEwgKGNtcGliZ19yZWcpIEZBU1QgKGNtcGliZ19yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9DTVBJQkdfTElUKSwgSURYIChJTlNOX0NNUElCR19MSVQpLCBGVUxMIChjbXBpYmdfbGl0KSBGQVNUIChjbXBpYmdfbGl0KSB9LAorICB7IFRZUEUgKElOU05fQ01QSUJHRV9SRUcpLCBJRFggKElOU05fQ01QSUJHRV9SRUcpLCBGVUxMIChjbXBpYmdlX3JlZykgRkFTVCAoY21waWJnZV9yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9DTVBJQkdFX0xJVCksIElEWCAoSU5TTl9DTVBJQkdFX0xJVCksIEZVTEwgKGNtcGliZ2VfbGl0KSBGQVNUIChjbXBpYmdlX2xpdCkgfSwKKyAgeyBUWVBFIChJTlNOX0JCQ19SRUcpLCBJRFggKElOU05fQkJDX1JFRyksIEZVTEwgKGJiY19yZWcpIEZBU1QgKGJiY19yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9CQkNfTElUKSwgSURYIChJTlNOX0JCQ19MSVQpLCBGVUxMIChiYmNfbGl0KSBGQVNUIChiYmNfbGl0KSB9LAorICB7IFRZUEUgKElOU05fQkJTX1JFRyksIElEWCAoSU5TTl9CQlNfUkVHKSwgRlVMTCAoYmJzX3JlZykgRkFTVCAoYmJzX3JlZykgfSwKKyAgeyBUWVBFIChJTlNOX0JCU19MSVQpLCBJRFggKElOU05fQkJTX0xJVCksIEZVTEwgKGJic19saXQpIEZBU1QgKGJic19saXQpIH0sCisgIHsgVFlQRSAoSU5TTl9DTVBJKSwgSURYIChJTlNOX0NNUEkpLCBGVUxMIChjbXBpKSBGQVNUIChjbXBpKSB9LAorICB7IFRZUEUgKElOU05fQ01QSTEpLCBJRFggKElOU05fQ01QSTEpLCBGVUxMIChjbXBpMSkgRkFTVCAoY21waTEpIH0sCisgIHsgVFlQRSAoSU5TTl9DTVBJMiksIElEWCAoSU5TTl9DTVBJMiksIEZVTEwgKGNtcGkyKSBGQVNUIChjbXBpMikgfSwKKyAgeyBUWVBFIChJTlNOX0NNUEkzKSwgSURYIChJTlNOX0NNUEkzKSwgRlVMTCAoY21waTMpIEZBU1QgKGNtcGkzKSB9LAorICB7IFRZUEUgKElOU05fQ01QTyksIElEWCAoSU5TTl9DTVBPKSwgRlVMTCAoY21wbykgRkFTVCAoY21wbykgfSwKKyAgeyBUWVBFIChJTlNOX0NNUE8xKSwgSURYIChJTlNOX0NNUE8xKSwgRlVMTCAoY21wbzEpIEZBU1QgKGNtcG8xKSB9LAorICB7IFRZUEUgKElOU05fQ01QTzIpLCBJRFggKElOU05fQ01QTzIpLCBGVUxMIChjbXBvMikgRkFTVCAoY21wbzIpIH0sCisgIHsgVFlQRSAoSU5TTl9DTVBPMyksIElEWCAoSU5TTl9DTVBPMyksIEZVTEwgKGNtcG8zKSBGQVNUIChjbXBvMykgfSwKKyAgeyBUWVBFIChJTlNOX1RFU1ROT19SRUcpLCBJRFggKElOU05fVEVTVE5PX1JFRyksIEZVTEwgKHRlc3Rub19yZWcpIEZBU1QgKHRlc3Rub19yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9URVNUR19SRUcpLCBJRFggKElOU05fVEVTVEdfUkVHKSwgRlVMTCAodGVzdGdfcmVnKSBGQVNUICh0ZXN0Z19yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9URVNURV9SRUcpLCBJRFggKElOU05fVEVTVEVfUkVHKSwgRlVMTCAodGVzdGVfcmVnKSBGQVNUICh0ZXN0ZV9yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9URVNUR0VfUkVHKSwgSURYIChJTlNOX1RFU1RHRV9SRUcpLCBGVUxMICh0ZXN0Z2VfcmVnKSBGQVNUICh0ZXN0Z2VfcmVnKSB9LAorICB7IFRZUEUgKElOU05fVEVTVExfUkVHKSwgSURYIChJTlNOX1RFU1RMX1JFRyksIEZVTEwgKHRlc3RsX3JlZykgRkFTVCAodGVzdGxfcmVnKSB9LAorICB7IFRZUEUgKElOU05fVEVTVE5FX1JFRyksIElEWCAoSU5TTl9URVNUTkVfUkVHKSwgRlVMTCAodGVzdG5lX3JlZykgRkFTVCAodGVzdG5lX3JlZykgfSwKKyAgeyBUWVBFIChJTlNOX1RFU1RMRV9SRUcpLCBJRFggKElOU05fVEVTVExFX1JFRyksIEZVTEwgKHRlc3RsZV9yZWcpIEZBU1QgKHRlc3RsZV9yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9URVNUT19SRUcpLCBJRFggKElOU05fVEVTVE9fUkVHKSwgRlVMTCAodGVzdG9fcmVnKSBGQVNUICh0ZXN0b19yZWcpIH0sCisgIHsgVFlQRSAoSU5TTl9CTk8pLCBJRFggKElOU05fQk5PKSwgRlVMTCAoYm5vKSBGQVNUIChibm8pIH0sCisgIHsgVFlQRSAoSU5TTl9CRyksIElEWCAoSU5TTl9CRyksIEZVTEwgKGJnKSBGQVNUIChiZykgfSwKKyAgeyBUWVBFIChJTlNOX0JFKSwgSURYIChJTlNOX0JFKSwgRlVMTCAoYmUpIEZBU1QgKGJlKSB9LAorICB7IFRZUEUgKElOU05fQkdFKSwgSURYIChJTlNOX0JHRSksIEZVTEwgKGJnZSkgRkFTVCAoYmdlKSB9LAorICB7IFRZUEUgKElOU05fQkwpLCBJRFggKElOU05fQkwpLCBGVUxMIChibCkgRkFTVCAoYmwpIH0sCisgIHsgVFlQRSAoSU5TTl9CTkUpLCBJRFggKElOU05fQk5FKSwgRlVMTCAoYm5lKSBGQVNUIChibmUpIH0sCisgIHsgVFlQRSAoSU5TTl9CTEUpLCBJRFggKElOU05fQkxFKSwgRlVMTCAoYmxlKSBGQVNUIChibGUpIH0sCisgIHsgVFlQRSAoSU5TTl9CTyksIElEWCAoSU5TTl9CTyksIEZVTEwgKGJvKSBGQVNUIChibykgfSwKKyAgeyBUWVBFIChJTlNOX0IpLCBJRFggKElOU05fQiksIEZVTEwgKGIpIEZBU1QgKGIpIH0sCisgIHsgVFlQRSAoSU5TTl9CWF9JTkRJUkVDVF9PRkZTRVQpLCBJRFggKElOU05fQlhfSU5ESVJFQ1RfT0ZGU0VUKSwgRlVMTCAoYnhfaW5kaXJlY3Rfb2Zmc2V0KSBGQVNUIChieF9pbmRpcmVjdF9vZmZzZXQpIH0sCisgIHsgVFlQRSAoSU5TTl9CWF9JTkRJUkVDVCksIElEWCAoSU5TTl9CWF9JTkRJUkVDVCksIEZVTEwgKGJ4X2luZGlyZWN0KSBGQVNUIChieF9pbmRpcmVjdCkgfSwKKyAgeyBUWVBFIChJTlNOX0JYX0lORElSRUNUX0lOREVYKSwgSURYIChJTlNOX0JYX0lORElSRUNUX0lOREVYKSwgRlVMTCAoYnhfaW5kaXJlY3RfaW5kZXgpIEZBU1QgKGJ4X2luZGlyZWN0X2luZGV4KSB9LAorICB7IFRZUEUgKElOU05fQlhfRElTUCksIElEWCAoSU5TTl9CWF9ESVNQKSwgRlVMTCAoYnhfZGlzcCkgRkFTVCAoYnhfZGlzcCkgfSwKKyAgeyBUWVBFIChJTlNOX0JYX0lORElSRUNUX0RJU1ApLCBJRFggKElOU05fQlhfSU5ESVJFQ1RfRElTUCksIEZVTEwgKGJ4X2luZGlyZWN0X2Rpc3ApIEZBU1QgKGJ4X2luZGlyZWN0X2Rpc3ApIH0sCisgIHsgVFlQRSAoSU5TTl9DQUxMWF9ESVNQKSwgSURYIChJTlNOX0NBTExYX0RJU1ApLCBGVUxMIChjYWxseF9kaXNwKSBGQVNUIChjYWxseF9kaXNwKSB9LAorICB7IFRZUEUgKElOU05fQ0FMTFhfSU5ESVJFQ1QpLCBJRFggKElOU05fQ0FMTFhfSU5ESVJFQ1QpLCBGVUxMIChjYWxseF9pbmRpcmVjdCkgRkFTVCAoY2FsbHhfaW5kaXJlY3QpIH0sCisgIHsgVFlQRSAoSU5TTl9DQUxMWF9JTkRJUkVDVF9PRkZTRVQpLCBJRFggKElOU05fQ0FMTFhfSU5ESVJFQ1RfT0ZGU0VUKSwgRlVMTCAoY2FsbHhfaW5kaXJlY3Rfb2Zmc2V0KSBGQVNUIChjYWxseF9pbmRpcmVjdF9vZmZzZXQpIH0sCisgIHsgVFlQRSAoSU5TTl9SRVQpLCBJRFggKElOU05fUkVUKSwgRlVMTCAocmV0KSBGQVNUIChyZXQpIH0sCisgIHsgVFlQRSAoSU5TTl9DQUxMUyksIElEWCAoSU5TTl9DQUxMUyksIEZVTEwgKGNhbGxzKSBGQVNUIChjYWxscykgfSwKKyAgeyBUWVBFIChJTlNOX0ZNQVJLKSwgSURYIChJTlNOX0ZNQVJLKSwgRlVMTCAoZm1hcmspIEZBU1QgKGZtYXJrKSB9LAorICB7IFRZUEUgKElOU05fRkxVU0hSRUcpLCBJRFggKElOU05fRkxVU0hSRUcpLCBGVUxMIChmbHVzaHJlZykgRkFTVCAoZmx1c2hyZWcpIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGluc25fc2VtIGk5NjBiYXNlX2luc25fc2VtX2ludmFsaWQgPQoreworICBWSVJUVUFMX0lOU05fWF9JTlZBTElELCBJRFggKElOU05fWF9JTlZBTElEKSwgRlVMTCAoeF9pbnZhbGlkKSBGQVNUICh4X2ludmFsaWQpCit9OworCisjdW5kZWYgSURYCisjdW5kZWYgVFlQRQorCisvKiBJbml0aWFsaXplIGFuIElERVNDIGZyb20gdGhlIGNvbXBpbGUtdGltZSBjb21wdXRhYmxlIHBhcnRzLiAgKi8KKworc3RhdGljIElOTElORSB2b2lkCitpbml0X2lkZXNjIChTSU1fQ1BVICpjcHUsIElERVNDICppZCwgY29uc3Qgc3RydWN0IGluc25fc2VtICp0KQoreworICBjb25zdCBDR0VOX0lOU04gKmluc25fdGFibGUgPSBDR0VOX0NQVV9JTlNOX1RBQkxFIChDUFVfQ1BVX0RFU0MgKGNwdSkpLT5pbml0X2VudHJpZXM7CisKKyAgaWQtPm51bSA9IHQtPmluZGV4OworICBpZiAoKGludCkgdC0+dHlwZSA8PSAwKQorICAgIGlkLT5pZGF0YSA9ICYgY2dlbl92aXJ0dWFsX2luc25fdGFibGVbLSAoaW50KSB0LT50eXBlXTsKKyAgZWxzZQorICAgIGlkLT5pZGF0YSA9ICYgaW5zbl90YWJsZVt0LT50eXBlXTsKKyAgaWQtPmF0dHJzID0gQ0dFTl9JTlNOX0FUVFJTIChpZC0+aWRhdGEpOworICAvKiBPaCBteSBnb2QsIGEgbWFnaWMgbnVtYmVyLiAgKi8KKyAgaWQtPmxlbmd0aCA9IENHRU5fSU5TTl9CSVRTSVpFIChpZC0+aWRhdGEpIC8gODsKKyNpZiAhIFdJVEhfU0VNX1NXSVRDSF9GVUxMCisgIGlkLT5zZW1fZnVsbCA9IHQtPnNlbV9mdWxsOworI2VuZGlmCisjaWYgV0lUSF9GQVNUICYmICEgV0lUSF9TRU1fU1dJVENIX0ZBU1QKKyAgaWQtPnNlbV9mYXN0ID0gdC0+c2VtX2Zhc3Q7CisjZW5kaWYKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICBpZC0+dGltaW5nID0gJiBNT0RFTF9USU1JTkcgKENQVV9NT0RFTCAoY3B1KSkgW3QtPmluZGV4XTsKKyAgeworICAgIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjcHUpOworICAgIFNJTV9BU1NFUlQgKHQtPmluZGV4ID09IGlkLT50aW1pbmctPm51bSk7CisgIH0KKyNlbmRpZgorfQorCisvKiBJbml0aWFsaXplIHRoZSBpbnN0cnVjdGlvbiBkZXNjcmlwdG9yIHRhYmxlLiAgKi8KKwordm9pZAoraTk2MGJhc2VfaW5pdF9pZGVzY190YWJsZSAoU0lNX0NQVSAqY3B1KQoreworICBJREVTQyAqaWQsKnRhYmVuZDsKKyAgY29uc3Qgc3RydWN0IGluc25fc2VtICp0LCp0ZW5kOworICBpbnQgdGFic2l6ZSA9IEk5NjBCQVNFX0lOU05fTUFYOworICBJREVTQyAqdGFibGUgPSBpOTYwYmFzZV9pbnNuX2RhdGE7CisKKyAgbWVtc2V0ICh0YWJsZSwgMCwgdGFic2l6ZSAqIHNpemVvZiAoSURFU0MpKTsKKworICAvKiBGaXJzdCBzZXQgYWxsIGVudHJpZXMgdG8gdGhlIGBpbnZhbGlkIGluc24nLiAgKi8KKyAgdCA9ICYgaTk2MGJhc2VfaW5zbl9zZW1faW52YWxpZDsKKyAgZm9yIChpZCA9IHRhYmxlLCB0YWJlbmQgPSB0YWJsZSArIHRhYnNpemU7IGlkIDwgdGFiZW5kOyArK2lkKQorICAgIGluaXRfaWRlc2MgKGNwdSwgaWQsIHQpOworCisgIC8qIE5vdyBmaWxsIGluIHRoZSB2YWx1ZXMgZm9yIHRoZSBjaG9zZW4gY3B1LiAgKi8KKyAgZm9yICh0ID0gaTk2MGJhc2VfaW5zbl9zZW0sIHRlbmQgPSB0ICsgc2l6ZW9mIChpOTYwYmFzZV9pbnNuX3NlbSkgLyBzaXplb2YgKCp0KTsKKyAgICAgICB0ICE9IHRlbmQ7ICsrdCkKKyAgICB7CisgICAgICBpbml0X2lkZXNjIChjcHUsICYgdGFibGVbdC0+aW5kZXhdLCB0KTsKKyAgICB9CisKKyAgLyogTGluayB0aGUgSURFU0MgdGFibGUgaW50byB0aGUgY3B1LiAgKi8KKyAgQ1BVX0lERVNDIChjcHUpID0gdGFibGU7Cit9CisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGFsbCBpbnN0cnVjdGlvbiBzZW1hbnRpYyBmb3JtYXRzLiAgKi8KK3R5cGVkZWYgZW51bSBzZm10IHsKKyAgRk1UX0VNUFRZLCBGTVRfTVVMTywgRk1UX01VTE8xLCBGTVRfTVVMTzIKKyAsIEZNVF9NVUxPMywgRk1UX05PVEJJVCwgRk1UX05PVEJJVDEsIEZNVF9OT1RCSVQyCisgLCBGTVRfTk9UQklUMywgRk1UX05PVCwgRk1UX05PVDEsIEZNVF9OT1QyCisgLCBGTVRfTk9UMywgRk1UX0VNVUwsIEZNVF9FTVVMMSwgRk1UX0VNVUwyCisgLCBGTVRfRU1VTDMsIEZNVF9NT1ZMLCBGTVRfTU9WTDEsIEZNVF9NT1ZUCisgLCBGTVRfTU9WVDEsIEZNVF9NT1ZRLCBGTVRfTU9WUTEsIEZNVF9NT0RQQworICwgRk1UX0xEQV9PRkZTRVQsIEZNVF9MREFfSU5ESVJFQ1RfT0ZGU0VULCBGTVRfTERBX0lORElSRUNULCBGTVRfTERBX0lORElSRUNUX0lOREVYCisgLCBGTVRfTERBX0RJU1AsIEZNVF9MREFfSU5ESVJFQ1RfRElTUCwgRk1UX0xEQV9JTkRFWF9ESVNQLCBGTVRfTERBX0lORElSRUNUX0lOREVYX0RJU1AKKyAsIEZNVF9MRF9PRkZTRVQsIEZNVF9MRF9JTkRJUkVDVF9PRkZTRVQsIEZNVF9MRF9JTkRJUkVDVCwgRk1UX0xEX0lORElSRUNUX0lOREVYCisgLCBGTVRfTERfRElTUCwgRk1UX0xEX0lORElSRUNUX0RJU1AsIEZNVF9MRF9JTkRFWF9ESVNQLCBGTVRfTERfSU5ESVJFQ1RfSU5ERVhfRElTUAorICwgRk1UX0xET0JfT0ZGU0VULCBGTVRfTERPQl9JTkRJUkVDVF9PRkZTRVQsIEZNVF9MRE9CX0lORElSRUNULCBGTVRfTERPQl9JTkRJUkVDVF9JTkRFWAorICwgRk1UX0xET0JfRElTUCwgRk1UX0xET0JfSU5ESVJFQ1RfRElTUCwgRk1UX0xET0JfSU5ERVhfRElTUCwgRk1UX0xET0JfSU5ESVJFQ1RfSU5ERVhfRElTUAorICwgRk1UX0xET1NfT0ZGU0VULCBGTVRfTERPU19JTkRJUkVDVF9PRkZTRVQsIEZNVF9MRE9TX0lORElSRUNULCBGTVRfTERPU19JTkRJUkVDVF9JTkRFWAorICwgRk1UX0xET1NfRElTUCwgRk1UX0xET1NfSU5ESVJFQ1RfRElTUCwgRk1UX0xET1NfSU5ERVhfRElTUCwgRk1UX0xET1NfSU5ESVJFQ1RfSU5ERVhfRElTUAorICwgRk1UX0xESUJfT0ZGU0VULCBGTVRfTERJQl9JTkRJUkVDVF9PRkZTRVQsIEZNVF9MRElCX0lORElSRUNULCBGTVRfTERJQl9JTkRJUkVDVF9JTkRFWAorICwgRk1UX0xESUJfRElTUCwgRk1UX0xESUJfSU5ESVJFQ1RfRElTUCwgRk1UX0xESUJfSU5ERVhfRElTUCwgRk1UX0xESUJfSU5ESVJFQ1RfSU5ERVhfRElTUAorICwgRk1UX0xESVNfT0ZGU0VULCBGTVRfTERJU19JTkRJUkVDVF9PRkZTRVQsIEZNVF9MRElTX0lORElSRUNULCBGTVRfTERJU19JTkRJUkVDVF9JTkRFWAorICwgRk1UX0xESVNfRElTUCwgRk1UX0xESVNfSU5ESVJFQ1RfRElTUCwgRk1UX0xESVNfSU5ERVhfRElTUCwgRk1UX0xESVNfSU5ESVJFQ1RfSU5ERVhfRElTUAorICwgRk1UX0xETF9PRkZTRVQsIEZNVF9MRExfSU5ESVJFQ1RfT0ZGU0VULCBGTVRfTERMX0lORElSRUNULCBGTVRfTERMX0lORElSRUNUX0lOREVYCisgLCBGTVRfTERMX0RJU1AsIEZNVF9MRExfSU5ESVJFQ1RfRElTUCwgRk1UX0xETF9JTkRFWF9ESVNQLCBGTVRfTERMX0lORElSRUNUX0lOREVYX0RJU1AKKyAsIEZNVF9MRFRfT0ZGU0VULCBGTVRfTERUX0lORElSRUNUX09GRlNFVCwgRk1UX0xEVF9JTkRJUkVDVCwgRk1UX0xEVF9JTkRJUkVDVF9JTkRFWAorICwgRk1UX0xEVF9ESVNQLCBGTVRfTERUX0lORElSRUNUX0RJU1AsIEZNVF9MRFRfSU5ERVhfRElTUCwgRk1UX0xEVF9JTkRJUkVDVF9JTkRFWF9ESVNQCisgLCBGTVRfTERRX09GRlNFVCwgRk1UX0xEUV9JTkRJUkVDVF9PRkZTRVQsIEZNVF9MRFFfSU5ESVJFQ1QsIEZNVF9MRFFfSU5ESVJFQ1RfSU5ERVgKKyAsIEZNVF9MRFFfRElTUCwgRk1UX0xEUV9JTkRJUkVDVF9ESVNQLCBGTVRfTERRX0lOREVYX0RJU1AsIEZNVF9MRFFfSU5ESVJFQ1RfSU5ERVhfRElTUAorICwgRk1UX1NUX09GRlNFVCwgRk1UX1NUX0lORElSRUNUX09GRlNFVCwgRk1UX1NUX0lORElSRUNULCBGTVRfU1RfSU5ESVJFQ1RfSU5ERVgKKyAsIEZNVF9TVF9ESVNQLCBGTVRfU1RfSU5ESVJFQ1RfRElTUCwgRk1UX1NUX0lOREVYX0RJU1AsIEZNVF9TVF9JTkRJUkVDVF9JTkRFWF9ESVNQCisgLCBGTVRfU1RPQl9PRkZTRVQsIEZNVF9TVE9CX0lORElSRUNUX09GRlNFVCwgRk1UX1NUT0JfSU5ESVJFQ1QsIEZNVF9TVE9CX0lORElSRUNUX0lOREVYCisgLCBGTVRfU1RPQl9ESVNQLCBGTVRfU1RPQl9JTkRJUkVDVF9ESVNQLCBGTVRfU1RPQl9JTkRFWF9ESVNQLCBGTVRfU1RPQl9JTkRJUkVDVF9JTkRFWF9ESVNQCisgLCBGTVRfU1RPU19PRkZTRVQsIEZNVF9TVE9TX0lORElSRUNUX09GRlNFVCwgRk1UX1NUT1NfSU5ESVJFQ1QsIEZNVF9TVE9TX0lORElSRUNUX0lOREVYCisgLCBGTVRfU1RPU19ESVNQLCBGTVRfU1RPU19JTkRJUkVDVF9ESVNQLCBGTVRfU1RPU19JTkRFWF9ESVNQLCBGTVRfU1RPU19JTkRJUkVDVF9JTkRFWF9ESVNQCisgLCBGTVRfU1RMX09GRlNFVCwgRk1UX1NUTF9JTkRJUkVDVF9PRkZTRVQsIEZNVF9TVExfSU5ESVJFQ1QsIEZNVF9TVExfSU5ESVJFQ1RfSU5ERVgKKyAsIEZNVF9TVExfRElTUCwgRk1UX1NUTF9JTkRJUkVDVF9ESVNQLCBGTVRfU1RMX0lOREVYX0RJU1AsIEZNVF9TVExfSU5ESVJFQ1RfSU5ERVhfRElTUAorICwgRk1UX1NUVF9PRkZTRVQsIEZNVF9TVFRfSU5ESVJFQ1RfT0ZGU0VULCBGTVRfU1RUX0lORElSRUNULCBGTVRfU1RUX0lORElSRUNUX0lOREVYCisgLCBGTVRfU1RUX0RJU1AsIEZNVF9TVFRfSU5ESVJFQ1RfRElTUCwgRk1UX1NUVF9JTkRFWF9ESVNQLCBGTVRfU1RUX0lORElSRUNUX0lOREVYX0RJU1AKKyAsIEZNVF9TVFFfT0ZGU0VULCBGTVRfU1RRX0lORElSRUNUX09GRlNFVCwgRk1UX1NUUV9JTkRJUkVDVCwgRk1UX1NUUV9JTkRJUkVDVF9JTkRFWAorICwgRk1UX1NUUV9ESVNQLCBGTVRfU1RRX0lORElSRUNUX0RJU1AsIEZNVF9TVFFfSU5ERVhfRElTUCwgRk1UX1NUUV9JTkRJUkVDVF9JTkRFWF9ESVNQCisgLCBGTVRfQ01QT0JFX1JFRywgRk1UX0NNUE9CRV9MSVQsIEZNVF9DTVBPQkxfUkVHLCBGTVRfQ01QT0JMX0xJVAorICwgRk1UX0JCQ19SRUcsIEZNVF9CQkNfTElULCBGTVRfQ01QSSwgRk1UX0NNUEkxCisgLCBGTVRfQ01QSTIsIEZNVF9DTVBJMywgRk1UX0NNUE8sIEZNVF9DTVBPMQorICwgRk1UX0NNUE8yLCBGTVRfQ01QTzMsIEZNVF9URVNUTk9fUkVHLCBGTVRfQk5PCisgLCBGTVRfQiwgRk1UX0JYX0lORElSRUNUX09GRlNFVCwgRk1UX0JYX0lORElSRUNULCBGTVRfQlhfSU5ESVJFQ1RfSU5ERVgKKyAsIEZNVF9CWF9ESVNQLCBGTVRfQlhfSU5ESVJFQ1RfRElTUCwgRk1UX0NBTExYX0RJU1AsIEZNVF9DQUxMWF9JTkRJUkVDVAorICwgRk1UX0NBTExYX0lORElSRUNUX09GRlNFVCwgRk1UX1JFVCwgRk1UX0NBTExTLCBGTVRfRk1BUksKKyAsIEZNVF9GTFVTSFJFRworfSBTRk1UOworCisvKiBUaGUgZGVjb2RlciB1c2VzIHRoaXMgdG8gcmVjb3JkIGluc25zIGFuZCBkaXJlY3QgZXh0cmFjdGlvbiBoYW5kbGluZy4gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgSURFU0MgKmlkZXNjOworI2lmZGVmIF9fR05VQ19fCisgIHZvaWQgKnNmbXQ7CisjZWxzZQorICBlbnVtIHNmbXQgc2ZtdDsKKyNlbmRpZgorfSBERUNPREVfREVTQzsKKworLyogTWFjcm8gdG8gZ28gZnJvbSBkZWNvZGUgcGhhc2UgdG8gZXh0cmFjdGlvbiBwaGFzZS4gICovCisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBHT1RPX0VYVFJBQ1QoaWQpIGdvdG8gKihpZCktPnNmbXQKKyNlbHNlCisjZGVmaW5lIEdPVE9fRVhUUkFDVChpZCkgZ290byBleHRyYWN0CisjZW5kaWYKKworLyogVGhlIGRlY29kZXIgbmVlZHMgYSBzbGlnaHRseSBkaWZmZXJlbnQgY29tcHV0ZWQgZ290byBzd2l0Y2ggY29udHJvbC4gICovCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgREVDT0RFX1NXSVRDSChOLCBYKSBnb3RvICpsYWJlbHNfIyNOW1hdOworI2Vsc2UKKyNkZWZpbmUgREVDT0RFX1NXSVRDSChOLCBYKSBzd2l0Y2ggKFgpCisjZW5kaWYKKworLyogR2l2ZW4gYW4gaW5zdHJ1Y3Rpb24sIHJldHVybiBhIHBvaW50ZXIgdG8gaXRzIElERVNDIGVudHJ5LiAgKi8KKworY29uc3QgSURFU0MgKgoraTk2MGJhc2VfZGVjb2RlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgSUFERFIgcGMsCisgICAgICAgICAgICAgIENHRU5fSU5TTl9JTlQgYmFzZV9pbnNuLAorICAgICAgICAgICAgICBBUkdCVUYgKmFidWYpCit7CisgIC8qIFJlc3VsdCBvZiBkZWNvZGVyLCB1c2VkIGJ5IGV4dHJhY3Rvci4gICovCisgIGNvbnN0IERFQ09ERV9ERVNDICppZGVjb2RlOworCisgIC8qIEZpcnN0IGRlY29kZSB0aGUgaW5zdHJ1Y3Rpb24uICAqLworCisgIHsKKyNkZWZpbmUgSShpbnNuKSAmIGk5NjBiYXNlX2luc25fZGF0YVtDT05DQVQyIChJOTYwQkFTRV8saW5zbildCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgRShmbXQpICYmIGNhc2VfZXhfIyNmbXQKKyNlbHNlCisjZGVmaW5lIEUoZm10KSBmbXQKKyNlbmRpZgorICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaWRlY29kZV9pbnZhbGlkID0geyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfTsKKworICAgIHsKKyNpZmRlZiBfX0dOVUNfXworICAgICAgc3RhdGljIGNvbnN0IHZvaWQgKmxhYmVsc18wWzI1Nl0gPSB7CisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGNhc2VfMF80OCwgJiYgY2FzZV8wXzQ5LCAmJiBjYXNlXzBfNTAsICYmIGNhc2VfMF81MSwgCisgICAgICAgICYmIGNhc2VfMF81MiwgJiYgY2FzZV8wXzUzLCAmJiBjYXNlXzBfNTQsICYmIGNhc2VfMF81NSwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgY2FzZV8wXzU3LCAmJiBjYXNlXzBfNTgsICYmIGNhc2VfMF81OSwgCisgICAgICAgICYmIGNhc2VfMF82MCwgJiYgY2FzZV8wXzYxLCAmJiBjYXNlXzBfNjIsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGNhc2VfMF84OCwgJiYgY2FzZV8wXzg5LCAmJiBjYXNlXzBfOTAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGNhc2VfMF85MiwgJiYgY2FzZV8wXzkzLCAmJiBjYXNlXzBfOTQsICYmIGNhc2VfMF85NSwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBjYXNlXzBfMTAyLCAmJiBjYXNlXzBfMTAzLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgY2FzZV8wXzExMiwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGNhc2VfMF8xMTYsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBjYXNlXzBfMTI4LCAmJiBkZWZhdWx0XzAsICYmIGNhc2VfMF8xMzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGNhc2VfMF8xMzIsICYmIGRlZmF1bHRfMCwgJiYgY2FzZV8wXzEzNCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgY2FzZV8wXzEzNiwgJiYgZGVmYXVsdF8wLCAmJiBjYXNlXzBfMTM4LCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBjYXNlXzBfMTQwLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgY2FzZV8wXzE0NCwgJiYgZGVmYXVsdF8wLCAmJiBjYXNlXzBfMTQ2LCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBjYXNlXzBfMTUyLCAmJiBkZWZhdWx0XzAsICYmIGNhc2VfMF8xNTQsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGNhc2VfMF8xNjAsICYmIGRlZmF1bHRfMCwgJiYgY2FzZV8wXzE2MiwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgY2FzZV8wXzE3NiwgJiYgZGVmYXVsdF8wLCAmJiBjYXNlXzBfMTc4LCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBjYXNlXzBfMTkyLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgY2FzZV8wXzIwMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICAgICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgCisgICAgICB9OworI2VuZGlmCisgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMjU2XSA9IHsKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9CKSwgRSAoRk1UX0IpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fUkVUKSwgRSAoRk1UX1JFVCkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0JOTyksIEUgKEZNVF9CTk8pIH0sIHsgSSAoSU5TTl9CRyksIEUgKEZNVF9CTk8pIH0sIAorICAgICAgICB7IEkgKElOU05fQkUpLCBFIChGTVRfQk5PKSB9LCB7IEkgKElOU05fQkdFKSwgRSAoRk1UX0JOTykgfSwgCisgICAgICAgIHsgSSAoSU5TTl9CTCksIEUgKEZNVF9CTk8pIH0sIHsgSSAoSU5TTl9CTkUpLCBFIChGTVRfQk5PKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0JMRSksIEUgKEZNVF9CTk8pIH0sIHsgSSAoSU5TTl9CTyksIEUgKEZNVF9CTk8pIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1RFU1ROT19SRUcpLCBFIChGTVRfVEVTVE5PX1JFRykgfSwgeyBJIChJTlNOX1RFU1RHX1JFRyksIEUgKEZNVF9URVNUTk9fUkVHKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1RFU1RFX1JFRyksIEUgKEZNVF9URVNUTk9fUkVHKSB9LCB7IEkgKElOU05fVEVTVEdFX1JFRyksIEUgKEZNVF9URVNUTk9fUkVHKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1RFU1RMX1JFRyksIEUgKEZNVF9URVNUTk9fUkVHKSB9LCB7IEkgKElOU05fVEVTVE5FX1JFRyksIEUgKEZNVF9URVNUTk9fUkVHKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1RFU1RMRV9SRUcpLCBFIChGTVRfVEVTVE5PX1JFRykgfSwgeyBJIChJTlNOX1RFU1RPX1JFRyksIEUgKEZNVF9URVNUTk9fUkVHKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgMCB9LCB7IDAgfSwgCisgICAgICAgIHsgMCB9LCB7IDAgfSwgCisgICAgICAgIHsgMCB9LCB7IDAgfSwgCisgICAgICAgIHsgMCB9LCB7IDAgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgMCB9LCAKKyAgICAgICAgeyAwIH0sIHsgMCB9LCAKKyAgICAgICAgeyAwIH0sIHsgMCB9LCAKKyAgICAgICAgeyAwIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICB7IDAgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgMCB9LCB7IDAgfSwgCisgICAgICAgIHsgMCB9LCB7IDAgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX01PREFDKSwgRSAoRk1UX01PRFBDKSB9LCB7IEkgKElOU05fTU9EUEMpLCBFIChGTVRfTU9EUEMpIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyAwIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyAwIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgMCB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyAwIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IDAgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgMCB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyAwIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IDAgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgMCB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgMCB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyAwIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgMCB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyAwIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgMCB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyAwIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IDAgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgMCB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyAwIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IDAgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICB9OworICAgICAgdW5zaWduZWQgaW50IHZhbDsKKyAgICAgIHZhbCA9ICgoKGluc24gPj4gMjQpICYgKDI1NSA8PCAwKSkpOworICAgICAgREVDT0RFX1NXSVRDSCAoMCwgdmFsKQorICAgICAgICB7CisgICAgICAgIENBU0UgKDAsIDQ4KSA6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzhdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fQkJDX1JFRyksIEUgKEZNVF9CQkNfUkVHKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9CQkNfTElUKSwgRSAoRk1UX0JCQ19MSVQpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMSkgJiAoMSA8PCAyKSkgfCAoKGluc24gPj4gMCkgJiAoMyA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDQ5KSA6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzhdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fQ01QT0JHX1JFRyksIEUgKEZNVF9DTVBPQkxfUkVHKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9DTVBPQkdfTElUKSwgRSAoRk1UX0NNUE9CTF9MSVQpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMSkgJiAoMSA8PCAyKSkgfCAoKGluc24gPj4gMCkgJiAoMyA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDUwKSA6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzhdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fQ01QT0JFX1JFRyksIEUgKEZNVF9DTVBPQkVfUkVHKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9DTVBPQkVfTElUKSwgRSAoRk1UX0NNUE9CRV9MSVQpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMSkgJiAoMSA8PCAyKSkgfCAoKGluc24gPj4gMCkgJiAoMyA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDUxKSA6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzhdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fQ01QT0JHRV9SRUcpLCBFIChGTVRfQ01QT0JMX1JFRykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fQ01QT0JHRV9MSVQpLCBFIChGTVRfQ01QT0JMX0xJVCkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDExKSAmICgxIDw8IDIpKSB8ICgoaW5zbiA+PiAwKSAmICgzIDw8IDApKSk7CisgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgIH0KKyAgICAgICAgQ0FTRSAoMCwgNTIpIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbOF0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9DTVBPQkxfUkVHKSwgRSAoRk1UX0NNUE9CTF9SRUcpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0NNUE9CTF9MSVQpLCBFIChGTVRfQ01QT0JMX0xJVCkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDExKSAmICgxIDw8IDIpKSB8ICgoaW5zbiA+PiAwKSAmICgzIDw8IDApKSk7CisgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgIH0KKyAgICAgICAgQ0FTRSAoMCwgNTMpIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbOF0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9DTVBPQk5FX1JFRyksIEUgKEZNVF9DTVBPQkVfUkVHKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9DTVBPQk5FX0xJVCksIEUgKEZNVF9DTVBPQkVfTElUKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTEpICYgKDEgPDwgMikpIHwgKChpbnNuID4+IDApICYgKDMgPDwgMCkpKTsKKyAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgfQorICAgICAgICBDQVNFICgwLCA1NCkgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1s4XSA9IHsKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0NNUE9CTEVfUkVHKSwgRSAoRk1UX0NNUE9CTF9SRUcpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0NNUE9CTEVfTElUKSwgRSAoRk1UX0NNUE9CTF9MSVQpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMSkgJiAoMSA8PCAyKSkgfCAoKGluc24gPj4gMCkgJiAoMyA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDU1KSA6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzhdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fQkJTX1JFRyksIEUgKEZNVF9CQkNfUkVHKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9CQlNfTElUKSwgRSAoRk1UX0JCQ19MSVQpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMSkgJiAoMSA8PCAyKSkgfCAoKGluc24gPj4gMCkgJiAoMyA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDU3KSA6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzhdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fQ01QSUJHX1JFRyksIEUgKEZNVF9DTVBPQkVfUkVHKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9DTVBJQkdfTElUKSwgRSAoRk1UX0NNUE9CRV9MSVQpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMSkgJiAoMSA8PCAyKSkgfCAoKGluc24gPj4gMCkgJiAoMyA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDU4KSA6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzhdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fQ01QSUJFX1JFRyksIEUgKEZNVF9DTVBPQkVfUkVHKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9DTVBJQkVfTElUKSwgRSAoRk1UX0NNUE9CRV9MSVQpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMSkgJiAoMSA8PCAyKSkgfCAoKGluc24gPj4gMCkgJiAoMyA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDU5KSA6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzhdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fQ01QSUJHRV9SRUcpLCBFIChGTVRfQ01QT0JFX1JFRykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fQ01QSUJHRV9MSVQpLCBFIChGTVRfQ01QT0JFX0xJVCkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDExKSAmICgxIDw8IDIpKSB8ICgoaW5zbiA+PiAwKSAmICgzIDw8IDApKSk7CisgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgIH0KKyAgICAgICAgQ0FTRSAoMCwgNjApIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbOF0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9DTVBJQkxfUkVHKSwgRSAoRk1UX0NNUE9CRV9SRUcpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0NNUElCTF9MSVQpLCBFIChGTVRfQ01QT0JFX0xJVCkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDExKSAmICgxIDw8IDIpKSB8ICgoaW5zbiA+PiAwKSAmICgzIDw8IDApKSk7CisgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgIH0KKyAgICAgICAgQ0FTRSAoMCwgNjEpIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbOF0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9DTVBJQk5FX1JFRyksIEUgKEZNVF9DTVBPQkVfUkVHKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9DTVBJQk5FX0xJVCksIEUgKEZNVF9DTVBPQkVfTElUKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTEpICYgKDEgPDwgMikpIHwgKChpbnNuID4+IDApICYgKDMgPDwgMCkpKTsKKyAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgfQorICAgICAgICBDQVNFICgwLCA2MikgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1s4XSA9IHsKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0NNUElCTEVfUkVHKSwgRSAoRk1UX0NNUE9CRV9SRUcpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0NNUElCTEVfTElUKSwgRSAoRk1UX0NNUE9CRV9MSVQpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMSkgJiAoMSA8PCAyKSkgfCAoKGluc24gPj4gMCkgJiAoMyA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDg4KSA6CisgICAgICAgICAgeworI2lmZGVmIF9fR05VQ19fCisgICAgICAgICAgICBzdGF0aWMgY29uc3Qgdm9pZCAqbGFiZWxzXzBfODhbMTZdID0geworICAgICAgICAgICAgICAmJiBjYXNlXzBfODhfMCwgJiYgY2FzZV8wXzg4XzEsICYmIGNhc2VfMF84OF8yLCAmJiBjYXNlXzBfODhfMywgCisgICAgICAgICAgICAgICYmIGNhc2VfMF84OF80LCAmJiBjYXNlXzBfODhfNSwgJiYgY2FzZV8wXzg4XzYsICYmIGNhc2VfMF84OF83LCAKKyAgICAgICAgICAgICAgJiYgZGVmYXVsdF8wXzg4LCAmJiBkZWZhdWx0XzBfODgsICYmIGRlZmF1bHRfMF84OCwgJiYgZGVmYXVsdF8wXzg4LCAKKyAgICAgICAgICAgICAgJiYgZGVmYXVsdF8wXzg4LCAmJiBkZWZhdWx0XzBfODgsICYmIGRlZmF1bHRfMF84OCwgJiYgZGVmYXVsdF8wXzg4LCAKKyAgICAgICAgICAgIH07CisjZW5kaWYKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgIHsgMCB9LCB7IDAgfSwgCisgICAgICAgICAgICAgIHsgMCB9LCB7IDAgfSwgCisgICAgICAgICAgICAgIHsgMCB9LCB7IDAgfSwgCisgICAgICAgICAgICAgIHsgMCB9LCB7IDAgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWw7CisgICAgICAgICAgICB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOworICAgICAgICAgICAgREVDT0RFX1NXSVRDSCAoMF84OCwgdmFsKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIENBU0UgKDBfODgsIDApIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fTk9UQklUKSwgRSAoRk1UX05PVEJJVCkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9BTkQpLCBFIChGTVRfTVVMTykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9BTkROT1QpLCBFIChGTVRfTVVMTykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9TRVRCSVQpLCBFIChGTVRfTk9UQklUKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX05PVEFORCksIEUgKEZNVF9NVUxPKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YT1IpLCBFIChGTVRfTVVMTykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9PUiksIEUgKEZNVF9NVUxPKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA2KSAmICgxNSA8PCAwKSkpOworICAgICAgICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIENBU0UgKDBfODgsIDEpIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fTk9SKSwgRSAoRk1UX01VTE8pIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX05PVCksIEUgKEZNVF9OT1QpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX0NMUkJJVCksIEUgKEZNVF9OT1RCSVQpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgQ0FTRSAoMF84OCwgMikgOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9OT1RCSVQxKSwgRSAoRk1UX05PVEJJVDEpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fQU5EMSksIEUgKEZNVF9NVUxPMSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9BTkROT1QxKSwgRSAoRk1UX01VTE8xKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1NFVEJJVDEpLCBFIChGTVRfTk9UQklUMSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9OT1RBTkQxKSwgRSAoRk1UX01VTE8xKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YT1IxKSwgRSAoRk1UX01VTE8xKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX09SMSksIEUgKEZNVF9NVUxPMSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBDQVNFICgwXzg4LCAzKSA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX05PUjEpLCBFIChGTVRfTVVMTzEpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX05PVDEpLCBFIChGTVRfTk9UMSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fQ0xSQklUMSksIEUgKEZNVF9OT1RCSVQxKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA2KSAmICgxNSA8PCAwKSkpOworICAgICAgICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIENBU0UgKDBfODgsIDQpIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fTk9UQklUMiksIEUgKEZNVF9OT1RCSVQyKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX0FORDIpLCBFIChGTVRfTVVMTzIpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fQU5ETk9UMiksIEUgKEZNVF9NVUxPMikgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9TRVRCSVQyKSwgRSAoRk1UX05PVEJJVDIpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fTk9UQU5EMiksIEUgKEZNVF9NVUxPMikgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWE9SMiksIEUgKEZNVF9NVUxPMikgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9PUjIpLCBFIChGTVRfTVVMTzIpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgQ0FTRSAoMF84OCwgNSkgOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9OT1IyKSwgRSAoRk1UX01VTE8yKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9OT1QyKSwgRSAoRk1UX05PVDIpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX0NMUkJJVDIpLCBFIChGTVRfTk9UQklUMikgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBDQVNFICgwXzg4LCA2KSA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX05PVEJJVDMpLCBFIChGTVRfTk9UQklUMykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9BTkQzKSwgRSAoRk1UX01VTE8zKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX0FORE5PVDMpLCBFIChGTVRfTVVMTzMpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fU0VUQklUMyksIEUgKEZNVF9OT1RCSVQzKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX05PVEFORDMpLCBFIChGTVRfTVVMTzMpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hPUjMpLCBFIChGTVRfTVVMTzMpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fT1IzKSwgRSAoRk1UX01VTE8zKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA2KSAmICgxNSA8PCAwKSkpOworICAgICAgICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIENBU0UgKDBfODgsIDcpIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fTk9SMyksIEUgKEZNVF9NVUxPMykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fTk9UMyksIEUgKEZNVF9OT1QzKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9DTFJCSVQzKSwgRSAoRk1UX05PVEJJVDMpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgREVGQVVMVCAoMF84OCkgOgorICAgICAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBFTkRTV0lUQ0ggKDBfODgpCisgICAgICAgICAgfQorICAgICAgICBDQVNFICgwLCA4OSkgOgorICAgICAgICAgIHsKKyNpZmRlZiBfX0dOVUNfXworICAgICAgICAgICAgc3RhdGljIGNvbnN0IHZvaWQgKmxhYmVsc18wXzg5WzE2XSA9IHsKKyAgICAgICAgICAgICAgJiYgY2FzZV8wXzg5XzAsICYmIGNhc2VfMF84OV8xLCAmJiBjYXNlXzBfODlfMiwgJiYgY2FzZV8wXzg5XzMsIAorICAgICAgICAgICAgICAmJiBjYXNlXzBfODlfNCwgJiYgY2FzZV8wXzg5XzUsICYmIGNhc2VfMF84OV82LCAmJiBjYXNlXzBfODlfNywgCisgICAgICAgICAgICAgICYmIGRlZmF1bHRfMF84OSwgJiYgZGVmYXVsdF8wXzg5LCAmJiBkZWZhdWx0XzBfODksICYmIGRlZmF1bHRfMF84OSwgCisgICAgICAgICAgICAgICYmIGRlZmF1bHRfMF84OSwgJiYgZGVmYXVsdF8wXzg5LCAmJiBkZWZhdWx0XzBfODksICYmIGRlZmF1bHRfMF84OSwgCisgICAgICAgICAgICB9OworI2VuZGlmCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsOworICAgICAgICAgICAgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgIERFQ09ERV9TV0lUQ0ggKDBfODksIHZhbCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICBDQVNFICgwXzg5LCAwKSA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX0FERE8pLCBFIChGTVRfTVVMTykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fU1VCTyksIEUgKEZNVF9NVUxPKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgQ0FTRSAoMF84OSwgMSkgOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9TSFJPKSwgRSAoRk1UX05PVEJJVCkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1NIUkkpLCBFIChGTVRfTk9UQklUKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1NITE8pLCBFIChGTVRfTk9UQklUKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9TSExJKSwgRSAoRk1UX05PVEJJVCkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgQ0FTRSAoMF84OSwgMikgOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9BRERPMSksIEUgKEZNVF9NVUxPMSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fU1VCTzEpLCBFIChGTVRfTVVMTzEpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBDQVNFICgwXzg5LCAzKSA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1NIUk8xKSwgRSAoRk1UX05PVEJJVDEpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9TSFJJMSksIEUgKEZNVF9OT1RCSVQxKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1NITE8xKSwgRSAoRk1UX05PVEJJVDEpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1NITEkxKSwgRSAoRk1UX05PVEJJVDEpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA2KSAmICgxNSA8PCAwKSkpOworICAgICAgICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIENBU0UgKDBfODksIDQpIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fQURETzIpLCBFIChGTVRfTVVMTzIpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1NVQk8yKSwgRSAoRk1UX01VTE8yKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgQ0FTRSAoMF84OSwgNSkgOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9TSFJPMiksIEUgKEZNVF9OT1RCSVQyKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fU0hSSTIpLCBFIChGTVRfTk9UQklUMikgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9TSExPMiksIEUgKEZNVF9OT1RCSVQyKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9TSExJMiksIEUgKEZNVF9OT1RCSVQyKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBDQVNFICgwXzg5LCA2KSA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX0FERE8zKSwgRSAoRk1UX01VTE8zKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9TVUJPMyksIEUgKEZNVF9NVUxPMykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiA2KSAmICgxNSA8PCAwKSkpOworICAgICAgICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIENBU0UgKDBfODksIDcpIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fU0hSTzMpLCBFIChGTVRfTk9UQklUMykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1NIUkkzKSwgRSAoRk1UX05PVEJJVDMpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fU0hMTzMpLCBFIChGTVRfTk9UQklUMykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fU0hMSTMpLCBFIChGTVRfTk9UQklUMykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgREVGQVVMVCAoMF84OSkgOgorICAgICAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBFTkRTV0lUQ0ggKDBfODkpCisgICAgICAgICAgfQorICAgICAgICBDQVNFICgwLCA5MCkgOgorICAgICAgICAgIHsKKyNpZmRlZiBfX0dOVUNfXworICAgICAgICAgICAgc3RhdGljIGNvbnN0IHZvaWQgKmxhYmVsc18wXzkwWzE2XSA9IHsKKyAgICAgICAgICAgICAgJiYgZGVmYXVsdF8wXzkwLCAmJiBkZWZhdWx0XzBfOTAsICYmIGRlZmF1bHRfMF85MCwgJiYgZGVmYXVsdF8wXzkwLCAKKyAgICAgICAgICAgICAgJiYgZGVmYXVsdF8wXzkwLCAmJiBkZWZhdWx0XzBfOTAsICYmIGRlZmF1bHRfMF85MCwgJiYgZGVmYXVsdF8wXzkwLCAKKyAgICAgICAgICAgICAgJiYgY2FzZV8wXzkwXzgsICYmIGRlZmF1bHRfMF85MCwgJiYgY2FzZV8wXzkwXzEwLCAmJiBkZWZhdWx0XzBfOTAsIAorICAgICAgICAgICAgICAmJiBjYXNlXzBfOTBfMTIsICYmIGRlZmF1bHRfMF85MCwgJiYgY2FzZV8wXzkwXzE0LCAmJiBkZWZhdWx0XzBfOTAsIAorICAgICAgICAgICAgfTsKKyNlbmRpZgorICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgMCB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyAwIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IDAgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgMCB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsOworICAgICAgICAgICAgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgIERFQ09ERV9TV0lUQ0ggKDBfOTAsIHZhbCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICBDQVNFICgwXzkwLCA4KSA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX0NNUE8pLCBFIChGTVRfQ01QTykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9DTVBJKSwgRSAoRk1UX0NNUEkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgQ0FTRSAoMF85MCwgMTApIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fQ01QTzEpLCBFIChGTVRfQ01QTzEpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fQ01QSTEpLCBFIChGTVRfQ01QSTEpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgQ0FTRSAoMF85MCwgMTIpIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fQ01QTzIpLCBFIChGTVRfQ01QTzIpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fQ01QSTIpLCBFIChGTVRfQ01QSTIpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgQ0FTRSAoMF85MCwgMTQpIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fQ01QTzMpLCBFIChGTVRfQ01QTzMpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fQ01QSTMpLCBFIChGTVRfQ01QSTMpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgREVGQVVMVCAoMF85MCkgOgorICAgICAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBFTkRTV0lUQ0ggKDBfOTApCisgICAgICAgICAgfQorICAgICAgICBDQVNFICgwLCA5MikgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX01PViksIEUgKEZNVF9OT1QyKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX01PVjEpLCBFIChGTVRfTk9UMykgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDkzKSA6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fTU9WTCksIEUgKEZNVF9NT1ZMKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX01PVkwxKSwgRSAoRk1UX01PVkwxKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTApICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgIH0KKyAgICAgICAgQ0FTRSAoMCwgOTQpIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9NT1ZUKSwgRSAoRk1UX01PVlQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fTU9WVDEpLCBFIChGTVRfTU9WVDEpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgfQorICAgICAgICBDQVNFICgwLCA5NSkgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX01PVlEpLCBFIChGTVRfTU9WUSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9NT1ZRMSksIEUgKEZNVF9NT1ZRMSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDEwMikgOgorICAgICAgICAgIHsKKyNpZmRlZiBfX0dOVUNfXworICAgICAgICAgICAgc3RhdGljIGNvbnN0IHZvaWQgKmxhYmVsc18wXzEwMlsxNl0gPSB7CisgICAgICAgICAgICAgICYmIGRlZmF1bHRfMF8xMDIsICYmIGRlZmF1bHRfMF8xMDIsICYmIGRlZmF1bHRfMF8xMDIsICYmIGRlZmF1bHRfMF8xMDIsIAorICAgICAgICAgICAgICAmJiBkZWZhdWx0XzBfMTAyLCAmJiBkZWZhdWx0XzBfMTAyLCAmJiBkZWZhdWx0XzBfMTAyLCAmJiBkZWZhdWx0XzBfMTAyLCAKKyAgICAgICAgICAgICAgJiYgZGVmYXVsdF8wXzEwMiwgJiYgZGVmYXVsdF8wXzEwMiwgJiYgZGVmYXVsdF8wXzEwMiwgJiYgZGVmYXVsdF8wXzEwMiwgCisgICAgICAgICAgICAgICYmIGRlZmF1bHRfMF8xMDIsICYmIGRlZmF1bHRfMF8xMDIsICYmIGRlZmF1bHRfMF8xMDIsICYmIGNhc2VfMF8xMDJfMTUsIAorICAgICAgICAgICAgfTsKKyNlbmRpZgorICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0NBTExTKSwgRSAoRk1UX0NBTExTKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyAwIH0sIAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWw7CisgICAgICAgICAgICB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOworICAgICAgICAgICAgREVDT0RFX1NXSVRDSCAoMF8xMDIsIHZhbCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICBDQVNFICgwXzEwMiwgMTUpIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX0ZNQVJLKSwgRSAoRk1UX0ZNQVJLKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX0ZMVVNIUkVHKSwgRSAoRk1UX0ZMVVNIUkVHKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgREVGQVVMVCAoMF8xMDIpIDoKKyAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgRU5EU1dJVENIICgwXzEwMikKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDEwMykgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9FTVVMKSwgRSAoRk1UX0VNVUwpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fRU1VTDEpLCBFIChGTVRfRU1VTDEpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fRU1VTDIpLCBFIChGTVRfRU1VTDIpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fRU1VTDMpLCBFIChGTVRfRU1VTDMpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgfQorICAgICAgICBDQVNFICgwLCAxMTIpIDoKKyAgICAgICAgICB7CisjaWZkZWYgX19HTlVDX18KKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCB2b2lkICpsYWJlbHNfMF8xMTJbMTZdID0geworICAgICAgICAgICAgICAmJiBkZWZhdWx0XzBfMTEyLCAmJiBjYXNlXzBfMTEyXzEsICYmIGRlZmF1bHRfMF8xMTIsICYmIGNhc2VfMF8xMTJfMywgCisgICAgICAgICAgICAgICYmIGRlZmF1bHRfMF8xMTIsICYmIGNhc2VfMF8xMTJfNSwgJiYgZGVmYXVsdF8wXzExMiwgJiYgY2FzZV8wXzExMl83LCAKKyAgICAgICAgICAgICAgJiYgZGVmYXVsdF8wXzExMiwgJiYgZGVmYXVsdF8wXzExMiwgJiYgZGVmYXVsdF8wXzExMiwgJiYgZGVmYXVsdF8wXzExMiwgCisgICAgICAgICAgICAgICYmIGRlZmF1bHRfMF8xMTIsICYmIGRlZmF1bHRfMF8xMTIsICYmIGRlZmF1bHRfMF8xMTIsICYmIGRlZmF1bHRfMF8xMTIsIAorICAgICAgICAgICAgfTsKKyNlbmRpZgorICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgeyBJIChJTlNOX01VTE8pLCBFIChGTVRfTVVMTykgfSwgeyAwIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTVVMTzEpLCBFIChGTVRfTVVMTzEpIH0sIHsgMCB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX01VTE8yKSwgRSAoRk1UX01VTE8yKSB9LCB7IDAgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9NVUxPMyksIEUgKEZNVF9NVUxPMykgfSwgeyAwIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsOworICAgICAgICAgICAgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgIERFQ09ERV9TV0lUQ0ggKDBfMTEyLCB2YWwpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQ0FTRSAoMF8xMTIsIDEpIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fUkVNTyksIEUgKEZNVF9NVUxPKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fRElWTyksIEUgKEZNVF9NVUxPKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBDQVNFICgwXzExMiwgMykgOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9SRU1PMSksIEUgKEZNVF9NVUxPMSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX0RJVk8xKSwgRSAoRk1UX01VTE8xKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBDQVNFICgwXzExMiwgNSkgOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9SRU1PMiksIEUgKEZNVF9NVUxPMikgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX0RJVk8yKSwgRSAoRk1UX01VTE8yKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBDQVNFICgwXzExMiwgNykgOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9SRU1PMyksIEUgKEZNVF9NVUxPMykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX0RJVk8zKSwgRSAoRk1UX01VTE8zKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gNikgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBERUZBVUxUICgwXzExMikgOgorICAgICAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBFTkRTV0lUQ0ggKDBfMTEyKQorICAgICAgICAgIH0KKyAgICAgICAgQ0FTRSAoMCwgMTE2KSA6CisgICAgICAgICAgeworI2lmZGVmIF9fR05VQ19fCisgICAgICAgICAgICBzdGF0aWMgY29uc3Qgdm9pZCAqbGFiZWxzXzBfMTE2WzE2XSA9IHsKKyAgICAgICAgICAgICAgJiYgZGVmYXVsdF8wXzExNiwgJiYgY2FzZV8wXzExNl8xLCAmJiBkZWZhdWx0XzBfMTE2LCAmJiBjYXNlXzBfMTE2XzMsIAorICAgICAgICAgICAgICAmJiBkZWZhdWx0XzBfMTE2LCAmJiBjYXNlXzBfMTE2XzUsICYmIGRlZmF1bHRfMF8xMTYsICYmIGNhc2VfMF8xMTZfNywgCisgICAgICAgICAgICAgICYmIGRlZmF1bHRfMF8xMTYsICYmIGRlZmF1bHRfMF8xMTYsICYmIGRlZmF1bHRfMF8xMTYsICYmIGRlZmF1bHRfMF8xMTYsIAorICAgICAgICAgICAgICAmJiBkZWZhdWx0XzBfMTE2LCAmJiBkZWZhdWx0XzBfMTE2LCAmJiBkZWZhdWx0XzBfMTE2LCAmJiBkZWZhdWx0XzBfMTE2LCAKKyAgICAgICAgICAgIH07CisjZW5kaWYKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgMCB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyAwIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IDAgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgMCB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbDsKKyAgICAgICAgICAgIHZhbCA9ICgoKGluc24gPj4gMTApICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICBERUNPREVfU1dJVENIICgwXzExNiwgdmFsKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIENBU0UgKDBfMTE2LCAxKSA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1JFTUkpLCBFIChGTVRfTVVMTykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX0RJVkkpLCBFIChGTVRfTVVMTykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgQ0FTRSAoMF8xMTYsIDMpIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fUkVNSTEpLCBFIChGTVRfTVVMTzEpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9ESVZJMSksIEUgKEZNVF9NVUxPMSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgQ0FTRSAoMF8xMTYsIDUpIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fUkVNSTIpLCBFIChGTVRfTVVMTzIpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9ESVZJMiksIEUgKEZNVF9NVUxPMikgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgQ0FTRSAoMF8xMTYsIDcpIDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fUkVNSTMpLCBFIChGTVRfTVVMTzMpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9ESVZJMyksIEUgKEZNVF9NVUxPMykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDYpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgREVGQVVMVCAoMF8xMTYpIDoKKyAgICAgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgRU5EU1dJVENIICgwXzExNikKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDEyOCkgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRE9CX09GRlNFVCksIEUgKEZNVF9MRE9CX09GRlNFVCkgfSwgeyBJIChJTlNOX0xET0JfT0ZGU0VUKSwgRSAoRk1UX0xET0JfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xET0JfT0ZGU0VUKSwgRSAoRk1UX0xET0JfT0ZGU0VUKSB9LCB7IEkgKElOU05fTERPQl9PRkZTRVQpLCBFIChGTVRfTERPQl9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERPQl9JTkRJUkVDVCksIEUgKEZNVF9MRE9CX0lORElSRUNUKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX0xET0JfSU5ESVJFQ1RfSU5ERVgpLCBFIChGTVRfTERPQl9JTkRJUkVDVF9JTkRFWCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRE9CX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9MRE9CX0lORElSRUNUX09GRlNFVCkgfSwgeyBJIChJTlNOX0xET0JfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX0xET0JfSU5ESVJFQ1RfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xET0JfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX0xET0JfSU5ESVJFQ1RfT0ZGU0VUKSB9LCB7IEkgKElOU05fTERPQl9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfTERPQl9JTkRJUkVDVF9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERPQl9ESVNQKSwgRSAoRk1UX0xET0JfRElTUCkgfSwgeyBJIChJTlNOX0xET0JfSU5ESVJFQ1RfRElTUCksIEUgKEZNVF9MRE9CX0lORElSRUNUX0RJU1ApIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERPQl9JTkRFWF9ESVNQKSwgRSAoRk1UX0xET0JfSU5ERVhfRElTUCkgfSwgeyBJIChJTlNOX0xET0JfSU5ESVJFQ1RfSU5ERVhfRElTUCksIEUgKEZNVF9MRE9CX0lORElSRUNUX0lOREVYX0RJU1ApIH0sIAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDEzMCkgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9TVE9CX09GRlNFVCksIEUgKEZNVF9TVE9CX09GRlNFVCkgfSwgeyBJIChJTlNOX1NUT0JfT0ZGU0VUKSwgRSAoRk1UX1NUT0JfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1NUT0JfT0ZGU0VUKSwgRSAoRk1UX1NUT0JfT0ZGU0VUKSB9LCB7IEkgKElOU05fU1RPQl9PRkZTRVQpLCBFIChGTVRfU1RPQl9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fU1RPQl9JTkRJUkVDVCksIEUgKEZNVF9TVE9CX0lORElSRUNUKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1NUT0JfSU5ESVJFQ1RfSU5ERVgpLCBFIChGTVRfU1RPQl9JTkRJUkVDVF9JTkRFWCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9TVE9CX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9TVE9CX0lORElSRUNUX09GRlNFVCkgfSwgeyBJIChJTlNOX1NUT0JfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX1NUT0JfSU5ESVJFQ1RfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1NUT0JfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX1NUT0JfSU5ESVJFQ1RfT0ZGU0VUKSB9LCB7IEkgKElOU05fU1RPQl9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfU1RPQl9JTkRJUkVDVF9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fU1RPQl9ESVNQKSwgRSAoRk1UX1NUT0JfRElTUCkgfSwgeyBJIChJTlNOX1NUT0JfSU5ESVJFQ1RfRElTUCksIEUgKEZNVF9TVE9CX0lORElSRUNUX0RJU1ApIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fU1RPQl9JTkRFWF9ESVNQKSwgRSAoRk1UX1NUT0JfSU5ERVhfRElTUCkgfSwgeyBJIChJTlNOX1NUT0JfSU5ESVJFQ1RfSU5ERVhfRElTUCksIEUgKEZNVF9TVE9CX0lORElSRUNUX0lOREVYX0RJU1ApIH0sIAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDEzMikgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0JYX0lORElSRUNUKSwgRSAoRk1UX0JYX0lORElSRUNUKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX0JYX0lORElSRUNUX0lOREVYKSwgRSAoRk1UX0JYX0lORElSRUNUX0lOREVYKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0JYX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9CWF9JTkRJUkVDVF9PRkZTRVQpIH0sIHsgSSAoSU5TTl9CWF9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfQlhfSU5ESVJFQ1RfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0JYX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9CWF9JTkRJUkVDVF9PRkZTRVQpIH0sIHsgSSAoSU5TTl9CWF9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfQlhfSU5ESVJFQ1RfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0JYX0RJU1ApLCBFIChGTVRfQlhfRElTUCkgfSwgeyBJIChJTlNOX0JYX0lORElSRUNUX0RJU1ApLCBFIChGTVRfQlhfSU5ESVJFQ1RfRElTUCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDEzNCkgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0NBTExYX0lORElSRUNUKSwgRSAoRk1UX0NBTExYX0lORElSRUNUKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9DQUxMWF9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfQ0FMTFhfSU5ESVJFQ1RfT0ZGU0VUKSB9LCB7IEkgKElOU05fQ0FMTFhfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX0NBTExYX0lORElSRUNUX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9DQUxMWF9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfQ0FMTFhfSU5ESVJFQ1RfT0ZGU0VUKSB9LCB7IEkgKElOU05fQ0FMTFhfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX0NBTExYX0lORElSRUNUX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9DQUxMWF9ESVNQKSwgRSAoRk1UX0NBTExYX0RJU1ApIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgfQorICAgICAgICBDQVNFICgwLCAxMzYpIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fTERPU19PRkZTRVQpLCBFIChGTVRfTERPU19PRkZTRVQpIH0sIHsgSSAoSU5TTl9MRE9TX09GRlNFVCksIEUgKEZNVF9MRE9TX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRE9TX09GRlNFVCksIEUgKEZNVF9MRE9TX09GRlNFVCkgfSwgeyBJIChJTlNOX0xET1NfT0ZGU0VUKSwgRSAoRk1UX0xET1NfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xET1NfSU5ESVJFQ1QpLCBFIChGTVRfTERPU19JTkRJUkVDVCkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9MRE9TX0lORElSRUNUX0lOREVYKSwgRSAoRk1UX0xET1NfSU5ESVJFQ1RfSU5ERVgpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERPU19JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfTERPU19JTkRJUkVDVF9PRkZTRVQpIH0sIHsgSSAoSU5TTl9MRE9TX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9MRE9TX0lORElSRUNUX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRE9TX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9MRE9TX0lORElSRUNUX09GRlNFVCkgfSwgeyBJIChJTlNOX0xET1NfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX0xET1NfSU5ESVJFQ1RfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xET1NfRElTUCksIEUgKEZNVF9MRE9TX0RJU1ApIH0sIHsgSSAoSU5TTl9MRE9TX0lORElSRUNUX0RJU1ApLCBFIChGTVRfTERPU19JTkRJUkVDVF9ESVNQKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xET1NfSU5ERVhfRElTUCksIEUgKEZNVF9MRE9TX0lOREVYX0RJU1ApIH0sIHsgSSAoSU5TTl9MRE9TX0lORElSRUNUX0lOREVYX0RJU1ApLCBFIChGTVRfTERPU19JTkRJUkVDVF9JTkRFWF9ESVNQKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgfQorICAgICAgICBDQVNFICgwLCAxMzgpIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fU1RPU19PRkZTRVQpLCBFIChGTVRfU1RPU19PRkZTRVQpIH0sIHsgSSAoSU5TTl9TVE9TX09GRlNFVCksIEUgKEZNVF9TVE9TX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9TVE9TX09GRlNFVCksIEUgKEZNVF9TVE9TX09GRlNFVCkgfSwgeyBJIChJTlNOX1NUT1NfT0ZGU0VUKSwgRSAoRk1UX1NUT1NfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1NUT1NfSU5ESVJFQ1QpLCBFIChGTVRfU1RPU19JTkRJUkVDVCkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9TVE9TX0lORElSRUNUX0lOREVYKSwgRSAoRk1UX1NUT1NfSU5ESVJFQ1RfSU5ERVgpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fU1RPU19JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfU1RPU19JTkRJUkVDVF9PRkZTRVQpIH0sIHsgSSAoSU5TTl9TVE9TX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9TVE9TX0lORElSRUNUX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9TVE9TX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9TVE9TX0lORElSRUNUX09GRlNFVCkgfSwgeyBJIChJTlNOX1NUT1NfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX1NUT1NfSU5ESVJFQ1RfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1NUT1NfRElTUCksIEUgKEZNVF9TVE9TX0RJU1ApIH0sIHsgSSAoSU5TTl9TVE9TX0lORElSRUNUX0RJU1ApLCBFIChGTVRfU1RPU19JTkRJUkVDVF9ESVNQKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1NUT1NfSU5ERVhfRElTUCksIEUgKEZNVF9TVE9TX0lOREVYX0RJU1ApIH0sIHsgSSAoSU5TTl9TVE9TX0lORElSRUNUX0lOREVYX0RJU1ApLCBFIChGTVRfU1RPU19JTkRJUkVDVF9JTkRFWF9ESVNQKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgfQorICAgICAgICBDQVNFICgwLCAxNDApIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fTERBX09GRlNFVCksIEUgKEZNVF9MREFfT0ZGU0VUKSB9LCB7IEkgKElOU05fTERBX09GRlNFVCksIEUgKEZNVF9MREFfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xEQV9PRkZTRVQpLCBFIChGTVRfTERBX09GRlNFVCkgfSwgeyBJIChJTlNOX0xEQV9PRkZTRVQpLCBFIChGTVRfTERBX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MREFfSU5ESVJFQ1QpLCBFIChGTVRfTERBX0lORElSRUNUKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX0xEQV9JTkRJUkVDVF9JTkRFWCksIEUgKEZNVF9MREFfSU5ESVJFQ1RfSU5ERVgpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERBX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9MREFfSU5ESVJFQ1RfT0ZGU0VUKSB9LCB7IEkgKElOU05fTERBX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9MREFfSU5ESVJFQ1RfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xEQV9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfTERBX0lORElSRUNUX09GRlNFVCkgfSwgeyBJIChJTlNOX0xEQV9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfTERBX0lORElSRUNUX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MREFfRElTUCksIEUgKEZNVF9MREFfRElTUCkgfSwgeyBJIChJTlNOX0xEQV9JTkRJUkVDVF9ESVNQKSwgRSAoRk1UX0xEQV9JTkRJUkVDVF9ESVNQKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xEQV9JTkRFWF9ESVNQKSwgRSAoRk1UX0xEQV9JTkRFWF9ESVNQKSB9LCB7IEkgKElOU05fTERBX0lORElSRUNUX0lOREVYX0RJU1ApLCBFIChGTVRfTERBX0lORElSRUNUX0lOREVYX0RJU1ApIH0sIAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDE0NCkgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRF9PRkZTRVQpLCBFIChGTVRfTERfT0ZGU0VUKSB9LCB7IEkgKElOU05fTERfT0ZGU0VUKSwgRSAoRk1UX0xEX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRF9PRkZTRVQpLCBFIChGTVRfTERfT0ZGU0VUKSB9LCB7IEkgKElOU05fTERfT0ZGU0VUKSwgRSAoRk1UX0xEX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRF9JTkRJUkVDVCksIEUgKEZNVF9MRF9JTkRJUkVDVCkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9MRF9JTkRJUkVDVF9JTkRFWCksIEUgKEZNVF9MRF9JTkRJUkVDVF9JTkRFWCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRF9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfTERfSU5ESVJFQ1RfT0ZGU0VUKSB9LCB7IEkgKElOU05fTERfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX0xEX0lORElSRUNUX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRF9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfTERfSU5ESVJFQ1RfT0ZGU0VUKSB9LCB7IEkgKElOU05fTERfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX0xEX0lORElSRUNUX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRF9ESVNQKSwgRSAoRk1UX0xEX0RJU1ApIH0sIHsgSSAoSU5TTl9MRF9JTkRJUkVDVF9ESVNQKSwgRSAoRk1UX0xEX0lORElSRUNUX0RJU1ApIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERfSU5ERVhfRElTUCksIEUgKEZNVF9MRF9JTkRFWF9ESVNQKSB9LCB7IEkgKElOU05fTERfSU5ESVJFQ1RfSU5ERVhfRElTUCksIEUgKEZNVF9MRF9JTkRJUkVDVF9JTkRFWF9ESVNQKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgfQorICAgICAgICBDQVNFICgwLCAxNDYpIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fU1RfT0ZGU0VUKSwgRSAoRk1UX1NUX09GRlNFVCkgfSwgeyBJIChJTlNOX1NUX09GRlNFVCksIEUgKEZNVF9TVF9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fU1RfT0ZGU0VUKSwgRSAoRk1UX1NUX09GRlNFVCkgfSwgeyBJIChJTlNOX1NUX09GRlNFVCksIEUgKEZNVF9TVF9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fU1RfSU5ESVJFQ1QpLCBFIChGTVRfU1RfSU5ESVJFQ1QpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fU1RfSU5ESVJFQ1RfSU5ERVgpLCBFIChGTVRfU1RfSU5ESVJFQ1RfSU5ERVgpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fU1RfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX1NUX0lORElSRUNUX09GRlNFVCkgfSwgeyBJIChJTlNOX1NUX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9TVF9JTkRJUkVDVF9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fU1RfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX1NUX0lORElSRUNUX09GRlNFVCkgfSwgeyBJIChJTlNOX1NUX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9TVF9JTkRJUkVDVF9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fU1RfRElTUCksIEUgKEZNVF9TVF9ESVNQKSB9LCB7IEkgKElOU05fU1RfSU5ESVJFQ1RfRElTUCksIEUgKEZNVF9TVF9JTkRJUkVDVF9ESVNQKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1NUX0lOREVYX0RJU1ApLCBFIChGTVRfU1RfSU5ERVhfRElTUCkgfSwgeyBJIChJTlNOX1NUX0lORElSRUNUX0lOREVYX0RJU1ApLCBFIChGTVRfU1RfSU5ESVJFQ1RfSU5ERVhfRElTUCkgfSwgCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTApICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgIH0KKyAgICAgICAgQ0FTRSAoMCwgMTUyKSA6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xETF9PRkZTRVQpLCBFIChGTVRfTERMX09GRlNFVCkgfSwgeyBJIChJTlNOX0xETF9PRkZTRVQpLCBFIChGTVRfTERMX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRExfT0ZGU0VUKSwgRSAoRk1UX0xETF9PRkZTRVQpIH0sIHsgSSAoSU5TTl9MRExfT0ZGU0VUKSwgRSAoRk1UX0xETF9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERMX0lORElSRUNUKSwgRSAoRk1UX0xETF9JTkRJUkVDVCkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVgpLCBFIChGTVRfTERMX0lORElSRUNUX0lOREVYKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xETF9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfTERMX0lORElSRUNUX09GRlNFVCkgfSwgeyBJIChJTlNOX0xETF9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfTERMX0lORElSRUNUX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRExfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX0xETF9JTkRJUkVDVF9PRkZTRVQpIH0sIHsgSSAoSU5TTl9MRExfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX0xETF9JTkRJUkVDVF9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERMX0RJU1ApLCBFIChGTVRfTERMX0RJU1ApIH0sIHsgSSAoSU5TTl9MRExfSU5ESVJFQ1RfRElTUCksIEUgKEZNVF9MRExfSU5ESVJFQ1RfRElTUCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRExfSU5ERVhfRElTUCksIEUgKEZNVF9MRExfSU5ERVhfRElTUCkgfSwgeyBJIChJTlNOX0xETF9JTkRJUkVDVF9JTkRFWF9ESVNQKSwgRSAoRk1UX0xETF9JTkRJUkVDVF9JTkRFWF9ESVNQKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgfQorICAgICAgICBDQVNFICgwLCAxNTQpIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fU1RMX09GRlNFVCksIEUgKEZNVF9TVExfT0ZGU0VUKSB9LCB7IEkgKElOU05fU1RMX09GRlNFVCksIEUgKEZNVF9TVExfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1NUTF9PRkZTRVQpLCBFIChGTVRfU1RMX09GRlNFVCkgfSwgeyBJIChJTlNOX1NUTF9PRkZTRVQpLCBFIChGTVRfU1RMX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9TVExfSU5ESVJFQ1QpLCBFIChGTVRfU1RMX0lORElSRUNUKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1NUTF9JTkRJUkVDVF9JTkRFWCksIEUgKEZNVF9TVExfSU5ESVJFQ1RfSU5ERVgpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fU1RMX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9TVExfSU5ESVJFQ1RfT0ZGU0VUKSB9LCB7IEkgKElOU05fU1RMX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9TVExfSU5ESVJFQ1RfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1NUTF9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfU1RMX0lORElSRUNUX09GRlNFVCkgfSwgeyBJIChJTlNOX1NUTF9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfU1RMX0lORElSRUNUX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9TVExfRElTUCksIEUgKEZNVF9TVExfRElTUCkgfSwgeyBJIChJTlNOX1NUTF9JTkRJUkVDVF9ESVNQKSwgRSAoRk1UX1NUTF9JTkRJUkVDVF9ESVNQKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1NUTF9JTkRFWF9ESVNQKSwgRSAoRk1UX1NUTF9JTkRFWF9ESVNQKSB9LCB7IEkgKElOU05fU1RMX0lORElSRUNUX0lOREVYX0RJU1ApLCBFIChGTVRfU1RMX0lORElSRUNUX0lOREVYX0RJU1ApIH0sIAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDE2MCkgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRFRfT0ZGU0VUKSwgRSAoRk1UX0xEVF9PRkZTRVQpIH0sIHsgSSAoSU5TTl9MRFRfT0ZGU0VUKSwgRSAoRk1UX0xEVF9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERUX09GRlNFVCksIEUgKEZNVF9MRFRfT0ZGU0VUKSB9LCB7IEkgKElOU05fTERUX09GRlNFVCksIEUgKEZNVF9MRFRfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xEVF9JTkRJUkVDVCksIEUgKEZNVF9MRFRfSU5ESVJFQ1QpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fTERUX0lORElSRUNUX0lOREVYKSwgRSAoRk1UX0xEVF9JTkRJUkVDVF9JTkRFWCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRFRfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX0xEVF9JTkRJUkVDVF9PRkZTRVQpIH0sIHsgSSAoSU5TTl9MRFRfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX0xEVF9JTkRJUkVDVF9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERUX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9MRFRfSU5ESVJFQ1RfT0ZGU0VUKSB9LCB7IEkgKElOU05fTERUX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9MRFRfSU5ESVJFQ1RfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xEVF9ESVNQKSwgRSAoRk1UX0xEVF9ESVNQKSB9LCB7IEkgKElOU05fTERUX0lORElSRUNUX0RJU1ApLCBFIChGTVRfTERUX0lORElSRUNUX0RJU1ApIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERUX0lOREVYX0RJU1ApLCBFIChGTVRfTERUX0lOREVYX0RJU1ApIH0sIHsgSSAoSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVhfRElTUCksIEUgKEZNVF9MRFRfSU5ESVJFQ1RfSU5ERVhfRElTUCkgfSwgCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTApICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgIH0KKyAgICAgICAgQ0FTRSAoMCwgMTYyKSA6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1NUVF9PRkZTRVQpLCBFIChGTVRfU1RUX09GRlNFVCkgfSwgeyBJIChJTlNOX1NUVF9PRkZTRVQpLCBFIChGTVRfU1RUX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9TVFRfT0ZGU0VUKSwgRSAoRk1UX1NUVF9PRkZTRVQpIH0sIHsgSSAoSU5TTl9TVFRfT0ZGU0VUKSwgRSAoRk1UX1NUVF9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fU1RUX0lORElSRUNUKSwgRSAoRk1UX1NUVF9JTkRJUkVDVCkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9TVFRfSU5ESVJFQ1RfSU5ERVgpLCBFIChGTVRfU1RUX0lORElSRUNUX0lOREVYKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1NUVF9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfU1RUX0lORElSRUNUX09GRlNFVCkgfSwgeyBJIChJTlNOX1NUVF9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfU1RUX0lORElSRUNUX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9TVFRfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX1NUVF9JTkRJUkVDVF9PRkZTRVQpIH0sIHsgSSAoSU5TTl9TVFRfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX1NUVF9JTkRJUkVDVF9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fU1RUX0RJU1ApLCBFIChGTVRfU1RUX0RJU1ApIH0sIHsgSSAoSU5TTl9TVFRfSU5ESVJFQ1RfRElTUCksIEUgKEZNVF9TVFRfSU5ESVJFQ1RfRElTUCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9TVFRfSU5ERVhfRElTUCksIEUgKEZNVF9TVFRfSU5ERVhfRElTUCkgfSwgeyBJIChJTlNOX1NUVF9JTkRJUkVDVF9JTkRFWF9ESVNQKSwgRSAoRk1UX1NUVF9JTkRJUkVDVF9JTkRFWF9ESVNQKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAxMCkgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgfQorICAgICAgICBDQVNFICgwLCAxNzYpIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fTERRX09GRlNFVCksIEUgKEZNVF9MRFFfT0ZGU0VUKSB9LCB7IEkgKElOU05fTERRX09GRlNFVCksIEUgKEZNVF9MRFFfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xEUV9PRkZTRVQpLCBFIChGTVRfTERRX09GRlNFVCkgfSwgeyBJIChJTlNOX0xEUV9PRkZTRVQpLCBFIChGTVRfTERRX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRFFfSU5ESVJFQ1QpLCBFIChGTVRfTERRX0lORElSRUNUKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX0xEUV9JTkRJUkVDVF9JTkRFWCksIEUgKEZNVF9MRFFfSU5ESVJFQ1RfSU5ERVgpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERRX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9MRFFfSU5ESVJFQ1RfT0ZGU0VUKSB9LCB7IEkgKElOU05fTERRX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9MRFFfSU5ESVJFQ1RfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xEUV9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfTERRX0lORElSRUNUX09GRlNFVCkgfSwgeyBJIChJTlNOX0xEUV9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfTERRX0lORElSRUNUX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRFFfRElTUCksIEUgKEZNVF9MRFFfRElTUCkgfSwgeyBJIChJTlNOX0xEUV9JTkRJUkVDVF9ESVNQKSwgRSAoRk1UX0xEUV9JTkRJUkVDVF9ESVNQKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xEUV9JTkRFWF9ESVNQKSwgRSAoRk1UX0xEUV9JTkRFWF9ESVNQKSB9LCB7IEkgKElOU05fTERRX0lORElSRUNUX0lOREVYX0RJU1ApLCBFIChGTVRfTERRX0lORElSRUNUX0lOREVYX0RJU1ApIH0sIAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDEwKSAmICgxNSA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDE3OCkgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9TVFFfT0ZGU0VUKSwgRSAoRk1UX1NUUV9PRkZTRVQpIH0sIHsgSSAoSU5TTl9TVFFfT0ZGU0VUKSwgRSAoRk1UX1NUUV9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fU1RRX09GRlNFVCksIEUgKEZNVF9TVFFfT0ZGU0VUKSB9LCB7IEkgKElOU05fU1RRX09GRlNFVCksIEUgKEZNVF9TVFFfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1NUUV9JTkRJUkVDVCksIEUgKEZNVF9TVFFfSU5ESVJFQ1QpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fU1RRX0lORElSRUNUX0lOREVYKSwgRSAoRk1UX1NUUV9JTkRJUkVDVF9JTkRFWCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9TVFFfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX1NUUV9JTkRJUkVDVF9PRkZTRVQpIH0sIHsgSSAoSU5TTl9TVFFfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX1NUUV9JTkRJUkVDVF9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fU1RRX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9TVFFfSU5ESVJFQ1RfT0ZGU0VUKSB9LCB7IEkgKElOU05fU1RRX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9TVFFfSU5ESVJFQ1RfT0ZGU0VUKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1NUUV9ESVNQKSwgRSAoRk1UX1NUUV9ESVNQKSB9LCB7IEkgKElOU05fU1RRX0lORElSRUNUX0RJU1ApLCBFIChGTVRfU1RRX0lORElSRUNUX0RJU1ApIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fU1RRX0lOREVYX0RJU1ApLCBFIChGTVRfU1RRX0lOREVYX0RJU1ApIH0sIHsgSSAoSU5TTl9TVFFfSU5ESVJFQ1RfSU5ERVhfRElTUCksIEUgKEZNVF9TVFFfSU5ESVJFQ1RfSU5ERVhfRElTUCkgfSwgCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTApICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgIH0KKyAgICAgICAgQ0FTRSAoMCwgMTkyKSA6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xESUJfT0ZGU0VUKSwgRSAoRk1UX0xESUJfT0ZGU0VUKSB9LCB7IEkgKElOU05fTERJQl9PRkZTRVQpLCBFIChGTVRfTERJQl9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERJQl9PRkZTRVQpLCBFIChGTVRfTERJQl9PRkZTRVQpIH0sIHsgSSAoSU5TTl9MRElCX09GRlNFVCksIEUgKEZNVF9MRElCX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRElCX0lORElSRUNUKSwgRSAoRk1UX0xESUJfSU5ESVJFQ1QpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fTERJQl9JTkRJUkVDVF9JTkRFWCksIEUgKEZNVF9MRElCX0lORElSRUNUX0lOREVYKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xESUJfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX0xESUJfSU5ESVJFQ1RfT0ZGU0VUKSB9LCB7IEkgKElOU05fTERJQl9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfTERJQl9JTkRJUkVDVF9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERJQl9JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfTERJQl9JTkRJUkVDVF9PRkZTRVQpIH0sIHsgSSAoSU5TTl9MRElCX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9MRElCX0lORElSRUNUX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRElCX0RJU1ApLCBFIChGTVRfTERJQl9ESVNQKSB9LCB7IEkgKElOU05fTERJQl9JTkRJUkVDVF9ESVNQKSwgRSAoRk1UX0xESUJfSU5ESVJFQ1RfRElTUCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRElCX0lOREVYX0RJU1ApLCBFIChGTVRfTERJQl9JTkRFWF9ESVNQKSB9LCB7IEkgKElOU05fTERJQl9JTkRJUkVDVF9JTkRFWF9ESVNQKSwgRSAoRk1UX0xESUJfSU5ESVJFQ1RfSU5ERVhfRElTUCkgfSwgCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTApICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgIH0KKyAgICAgICAgQ0FTRSAoMCwgMjAwKSA6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xESVNfT0ZGU0VUKSwgRSAoRk1UX0xESVNfT0ZGU0VUKSB9LCB7IEkgKElOU05fTERJU19PRkZTRVQpLCBFIChGTVRfTERJU19PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERJU19PRkZTRVQpLCBFIChGTVRfTERJU19PRkZTRVQpIH0sIHsgSSAoSU5TTl9MRElTX09GRlNFVCksIEUgKEZNVF9MRElTX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRElTX0lORElSRUNUKSwgRSAoRk1UX0xESVNfSU5ESVJFQ1QpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fTERJU19JTkRJUkVDVF9JTkRFWCksIEUgKEZNVF9MRElTX0lORElSRUNUX0lOREVYKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0xESVNfSU5ESVJFQ1RfT0ZGU0VUKSwgRSAoRk1UX0xESVNfSU5ESVJFQ1RfT0ZGU0VUKSB9LCB7IEkgKElOU05fTERJU19JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfTERJU19JTkRJUkVDVF9PRkZTRVQpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTERJU19JTkRJUkVDVF9PRkZTRVQpLCBFIChGTVRfTERJU19JTkRJUkVDVF9PRkZTRVQpIH0sIHsgSSAoSU5TTl9MRElTX0lORElSRUNUX09GRlNFVCksIEUgKEZNVF9MRElTX0lORElSRUNUX09GRlNFVCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRElTX0RJU1ApLCBFIChGTVRfTERJU19ESVNQKSB9LCB7IEkgKElOU05fTERJU19JTkRJUkVDVF9ESVNQKSwgRSAoRk1UX0xESVNfSU5ESVJFQ1RfRElTUCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9MRElTX0lOREVYX0RJU1ApLCBFIChGTVRfTERJU19JTkRFWF9ESVNQKSB9LCB7IEkgKElOU05fTERJU19JTkRJUkVDVF9JTkRFWF9ESVNQKSwgRSAoRk1UX0xESVNfSU5ESVJFQ1RfSU5ERVhfRElTUCkgfSwgCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMTApICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgIH0KKyAgICAgICAgREVGQVVMVCAoMCkgOgorICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICB9CisgICAgICBFTkRTV0lUQ0ggKDApCisgICAgfQorI3VuZGVmIEkKKyN1bmRlZiBFCisgIH0KKworICAvKiBUaGUgaW5zdHJ1Y3Rpb24gaGFzIGJlZW4gZGVjb2RlZCwgbm93IGV4dHJhY3QgdGhlIGZpZWxkcy4gICovCisKKyBleHRyYWN0OgorICB7CisjaWZuZGVmIF9fR05VQ19fCisgICAgc3dpdGNoIChpZGVjb2RlLT5zZm10KQorI2VuZGlmCisgICAgICB7CisKKyAgQ0FTRSAoZXgsIEZNVF9FTVBUWSkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCisgIEVYVFJBQ1RfSUZNVF9FTVBUWV9WQVJTIC8qICovCisKKyAgRVhUUkFDVF9JRk1UX0VNUFRZX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9lbXB0eSIsIChjaGFyICopIDApKTsKKworI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9NVUxPKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBFWFRSQUNUX0lGTVRfTVVMT19WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtc3JjMiBmLW0zIGYtbTIgZi1tMSBmLW9wY29kZTIgZi16ZXJvIGYtc3JjMSAqLworCisgIEVYVFJBQ1RfSUZNVF9NVUxPX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9zcmMxXTsKKyAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMl07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbXVsbyIsICJzcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgInNyYzIgMHgleCIsICd4JywgZl9zcmMyLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3NyYzE7CisgICAgICBGTEQgKGluX3NyYzIpID0gZl9zcmMyOworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9NVUxPMSkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIEVYVFJBQ1RfSUZNVF9NVUxPMV9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtc3JjMiBmLW0zIGYtbTIgZi1tMSBmLW9wY29kZTIgZi16ZXJvIGYtc3JjMSAqLworCisgIEVYVFJBQ1RfSUZNVF9NVUxPMV9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyYzEpID0gZl9zcmMxOworICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9zcmMyXTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9tdWxvMSIsICJmX3NyYzEgMHgleCIsICd4JywgZl9zcmMxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3NyYzIsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zcmMyKSA9IGZfc3JjMjsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTVVMTzIpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzIuZgorICBFWFRSQUNUX0lGTVRfTVVMTzJfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLXNyYzIgZi1tMyBmLW0yIGYtbTEgZi1vcGNvZGUyIGYtemVybyBmLXNyYzEgKi8KKworICBFWFRSQUNUX0lGTVRfTVVMTzJfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmMyKSA9IGZfc3JjMjsKKyAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMV07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbXVsbzIiLCAiZl9zcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgInNyYzEgMHgleCIsICd4JywgZl9zcmMxLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3NyYzE7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX01VTE8zKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgRVhUUkFDVF9JRk1UX01VTE8zX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1zcmMyIGYtbTMgZi1tMiBmLW0xIGYtb3Bjb2RlMiBmLXplcm8gZi1zcmMxICovCisKKyAgRVhUUkFDVF9JRk1UX01VTE8zX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjMSkgPSBmX3NyYzE7CisgIEZMRCAoZl9zcmMyKSA9IGZfc3JjMjsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9tdWxvMyIsICJmX3NyYzEgMHgleCIsICd4JywgZl9zcmMxLCAiZl9zcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX05PVEJJVCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQuZgorICBFWFRSQUNUX0lGTVRfTVVMT19WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtc3JjMiBmLW0zIGYtbTIgZi1tMSBmLW9wY29kZTIgZi16ZXJvIGYtc3JjMSAqLworCisgIEVYVFJBQ1RfSUZNVF9NVUxPX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9zcmMxXTsKKyAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMl07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbm90Yml0IiwgInNyYzEgMHgleCIsICd4JywgZl9zcmMxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3NyYzIsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zcmMxKSA9IGZfc3JjMTsKKyAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3NyYzI7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX05PVEJJVDEpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0MS5mCisgIEVYVFJBQ1RfSUZNVF9NVUxPMV9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtc3JjMiBmLW0zIGYtbTIgZi1tMSBmLW9wY29kZTIgZi16ZXJvIGYtc3JjMSAqLworCisgIEVYVFJBQ1RfSUZNVF9NVUxPMV9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyYzEpID0gZl9zcmMxOworICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9zcmMyXTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9ub3RiaXQxIiwgImZfc3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJzcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyYzIpID0gZl9zcmMyOworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9OT1RCSVQyKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDIuZgorICBFWFRSQUNUX0lGTVRfTVVMTzJfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLXNyYzIgZi1tMyBmLW0yIGYtbTEgZi1vcGNvZGUyIGYtemVybyBmLXNyYzEgKi8KKworICBFWFRSQUNUX0lGTVRfTVVMTzJfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmMyKSA9IGZfc3JjMjsKKyAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMV07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbm90Yml0MiIsICJmX3NyYzIgMHgleCIsICd4JywgZl9zcmMyLCAic3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zcmMxKSA9IGZfc3JjMTsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTk9UQklUMykgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQzLmYKKyAgRVhUUkFDVF9JRk1UX01VTE8zX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1zcmMyIGYtbTMgZi1tMiBmLW0xIGYtb3Bjb2RlMiBmLXplcm8gZi1zcmMxICovCisKKyAgRVhUUkFDVF9JRk1UX01VTE8zX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjMSkgPSBmX3NyYzE7CisgIEZMRCAoZl9zcmMyKSA9IGZfc3JjMjsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9ub3RiaXQzIiwgImZfc3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJmX3NyYzIgMHgleCIsICd4JywgZl9zcmMyLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTk9UKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdC5mCisgIEVYVFJBQ1RfSUZNVF9NVUxPX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1zcmMyIGYtbTMgZi1tMiBmLW0xIGYtb3Bjb2RlMiBmLXplcm8gZi1zcmMxICovCisKKyAgRVhUUkFDVF9JRk1UX01VTE9fQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3NyYzFdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X25vdCIsICJzcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyYzEpID0gZl9zcmMxOworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9OT1QxKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdDEuZgorICBFWFRSQUNUX0lGTVRfTVVMTzFfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLXNyYzIgZi1tMyBmLW0yIGYtbTEgZi1vcGNvZGUyIGYtemVybyBmLXNyYzEgKi8KKworICBFWFRSQUNUX0lGTVRfTVVMTzFfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmMxKSA9IGZfc3JjMTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9ub3QxIiwgImZfc3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9OT1QyKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdDIuZgorICBFWFRSQUNUX0lGTVRfTVVMTzJfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLXNyYzIgZi1tMyBmLW0yIGYtbTEgZi1vcGNvZGUyIGYtemVybyBmLXNyYzEgKi8KKworICBFWFRSQUNUX0lGTVRfTVVMTzJfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3NyYzFdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X25vdDIiLCAic3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zcmMxKSA9IGZfc3JjMTsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTk9UMykgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3QzLmYKKyAgRVhUUkFDVF9JRk1UX01VTE8zX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1zcmMyIGYtbTMgZi1tMiBmLW0xIGYtb3Bjb2RlMiBmLXplcm8gZi1zcmMxICovCisKKyAgRVhUUkFDVF9JRk1UX01VTE8zX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjMSkgPSBmX3NyYzE7CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbm90MyIsICJmX3NyYzEgMHgleCIsICd4JywgZl9zcmMxLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfRU1VTCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXVsLmYKKyAgRVhUUkFDVF9JRk1UX01VTE9fVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLXNyYzIgZi1tMyBmLW0yIGYtbTEgZi1vcGNvZGUyIGYtemVybyBmLXNyYzEgKi8KKworICBFWFRSQUNUX0lGTVRfTVVMT19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMV07CisgIEZMRCAoaV9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX3NyYzJdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2VtdWwiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJzcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgInNyYzIgMHgleCIsICd4JywgZl9zcmMyLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3NyYzE7CisgICAgICBGTEQgKGluX3NyYzIpID0gZl9zcmMyOworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0VNVUwxKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtdWwxLmYKKyAgRVhUUkFDVF9JRk1UX01VTE8xX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1zcmMyIGYtbTMgZi1tMiBmLW0xIGYtb3Bjb2RlMiBmLXplcm8gZi1zcmMxICovCisKKyAgRVhUUkFDVF9JRk1UX01VTE8xX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGZfc3JjMSkgPSBmX3NyYzE7CisgIEZMRCAoaV9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX3NyYzJdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2VtdWwxIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9zcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgInNyYzIgMHgleCIsICd4JywgZl9zcmMyLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3NyYzI7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfRU1VTDIpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW11bDIuZgorICBFWFRSQUNUX0lGTVRfTVVMTzJfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLXNyYzIgZi1tMyBmLW0yIGYtbTEgZi1vcGNvZGUyIGYtemVybyBmLXNyYzEgKi8KKworICBFWFRSQUNUX0lGTVRfTVVMTzJfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoZl9zcmMyKSA9IGZfc3JjMjsKKyAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMV07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfZW11bDIiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX3NyYzIgMHgleCIsICd4JywgZl9zcmMyLCAic3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zcmMxKSA9IGZfc3JjMTsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9FTVVMMykgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXVsMy5mCisgIEVYVFJBQ1RfSUZNVF9NVUxPM19WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtc3JjMiBmLW0zIGYtbTIgZi1tMSBmLW9wY29kZTIgZi16ZXJvIGYtc3JjMSAqLworCisgIEVYVFJBQ1RfSUZNVF9NVUxPM19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChmX3NyYzEpID0gZl9zcmMxOworICBGTEQgKGZfc3JjMikgPSBmX3NyYzI7CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfZW11bDMiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX3NyYzEgMHgleCIsICd4JywgZl9zcmMxLCAiZl9zcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTU9WTCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tb3ZsLmYKKyAgRVhUUkFDVF9JRk1UX01VTE8yX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1zcmMyIGYtbTMgZi1tMiBmLW0xIGYtb3Bjb2RlMiBmLXplcm8gZi1zcmMxICovCisKKyAgRVhUUkFDVF9JRk1UX01VTE8yX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjMSkgPSBmX3NyYzE7CisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3NyYzFdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X21vdmwiLCAiZl9zcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAic3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3JjMV9jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmMxKSkgKyAoMSkpOworICAgICAgRkxEIChpbl9zcmMxKSA9IGZfc3JjMTsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9NT1ZMMSkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tb3ZsMS5mCisgIEVYVFJBQ1RfSUZNVF9NVUxPM19WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtc3JjMiBmLW0zIGYtbTIgZi1tMSBmLW9wY29kZTIgZi16ZXJvIGYtc3JjMSAqLworCisgIEVYVFJBQ1RfSUZNVF9NVUxPM19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChmX3NyYzEpID0gZl9zcmMxOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X21vdmwxIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9zcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTU9WVCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tb3Z0LmYKKyAgRVhUUkFDVF9JRk1UX01VTE8yX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1zcmMyIGYtbTMgZi1tMiBmLW0xIGYtb3Bjb2RlMiBmLXplcm8gZi1zcmMxICovCisKKyAgRVhUUkFDVF9JRk1UX01VTE8yX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjMSkgPSBmX3NyYzE7CisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3NyYzFdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X21vdnQiLCAiZl9zcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAic3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3JjMV9jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmMxKSkgKyAoMSkpOworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3JjMV9jb25zdF9fV0lfMikgPSAoKEZMRCAoZl9zcmMxKSkgKyAoMikpOworICAgICAgRkxEIChpbl9zcmMxKSA9IGZfc3JjMTsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX01PVlQxKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdnQxLmYKKyAgRVhUUkFDVF9JRk1UX01VTE8zX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1zcmMyIGYtbTMgZi1tMiBmLW0xIGYtb3Bjb2RlMiBmLXplcm8gZi1zcmMxICovCisKKyAgRVhUUkFDVF9JRk1UX01VTE8zX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGZfc3JjMSkgPSBmX3NyYzE7CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbW92dDEiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX3NyYzEgMHgleCIsICd4JywgZl9zcmMxLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX01PVlEpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW92cS5mCisgIEVYVFJBQ1RfSUZNVF9NVUxPMl9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtc3JjMiBmLW0zIGYtbTIgZi1tMSBmLW9wY29kZTIgZi16ZXJvIGYtc3JjMSAqLworCisgIEVYVFJBQ1RfSUZNVF9NVUxPMl9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyYzEpID0gZl9zcmMxOworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9zcmMxXTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9tb3ZxIiwgImZfc3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgInNyYzEgMHgleCIsICd4JywgZl9zcmMxLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3NyYzFfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjMSkpICsgKDEpKTsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3NyYzFfY29uc3RfX1dJXzIpID0gKChGTEQgKGZfc3JjMSkpICsgKDIpKTsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3NyYzFfY29uc3RfX1dJXzMpID0gKChGTEQgKGZfc3JjMSkpICsgKDMpKTsKKyAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3NyYzE7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMykgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgzKSk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX01PVlExKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdnExLmYKKyAgRVhUUkFDVF9JRk1UX01VTE8zX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1zcmMyIGYtbTMgZi1tMiBmLW0xIGYtb3Bjb2RlMiBmLXplcm8gZi1zcmMxICovCisKKyAgRVhUUkFDVF9JRk1UX01VTE8zX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGZfc3JjMSkgPSBmX3NyYzE7CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbW92cTEiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX3NyYzEgMHgleCIsICd4JywgZl9zcmMxLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8zKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDMpKTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTU9EUEMpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW9kcGMuZgorICBFWFRSQUNUX0lGTVRfTVVMT19WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtc3JjMiBmLW0zIGYtbTIgZi1tMSBmLW9wY29kZTIgZi16ZXJvIGYtc3JjMSAqLworCisgIEVYVFJBQ1RfSUZNVF9NVUxPX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9zcmMyXTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9tb2RwYyIsICJzcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyYzIpID0gZl9zcmMyOworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MREFfT0ZGU0VUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYV9vZmZzZXQuZgorICBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYSBmLXplcm9hIGYtb2Zmc2V0ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9PRkZTRVRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRhX29mZnNldCIsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xEQV9JTkRJUkVDVF9PRkZTRVQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRhX2luZGlyZWN0X29mZnNldC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfT0ZGU0VUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGVhIGYtemVyb2EgZi1vZmZzZXQgKi8KKworICBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29mZnNldCkgPSBmX29mZnNldDsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZGFfaW5kaXJlY3Rfb2Zmc2V0IiwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xEQV9JTkRJUkVDVCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGFfaW5kaXJlY3QuZgorICBFWFRSQUNUX0lGTVRfTERBX0lORElSRUNUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZGFfaW5kaXJlY3QiLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xEQV9JTkRJUkVDVF9JTkRFWCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGFfaW5kaXJlY3RfaW5kZXguZgorICBFWFRSQUNUX0lGTVRfTERBX0lORElSRUNUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRhX2luZGlyZWN0X2luZGV4IiwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERBX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRhX2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRhX2Rpc3AiLCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xEQV9JTkRJUkVDVF9ESVNQKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYV9pbmRpcmVjdF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkYV9pbmRpcmVjdF9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERBX0lOREVYX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRhX2luZGV4X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOworICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkYV9pbmRleF9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERBX0lORElSRUNUX0lOREVYX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRhX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkYV9pbmRpcmVjdF9pbmRleF9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xEX09GRlNFVCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZF9vZmZzZXQuZgorICBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYSBmLXplcm9hIGYtb2Zmc2V0ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9PRkZTRVRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRfb2Zmc2V0IiwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERfSU5ESVJFQ1RfT0ZGU0VUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkX2luZGlyZWN0X29mZnNldC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfT0ZGU0VUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGVhIGYtemVyb2EgZi1vZmZzZXQgKi8KKworICBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29mZnNldCkgPSBmX29mZnNldDsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZF9pbmRpcmVjdF9vZmZzZXQiLCAiZl9vZmZzZXQgMHgleCIsICd4JywgZl9vZmZzZXQsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERfSU5ESVJFQ1QpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfaW5kaXJlY3QuZgorICBFWFRSQUNUX0lGTVRfTERBX0lORElSRUNUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZF9pbmRpcmVjdCIsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERfSU5ESVJFQ1RfSU5ERVgpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfaW5kaXJlY3RfaW5kZXguZgorICBFWFRSQUNUX0lGTVRfTERBX0lORElSRUNUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRfaW5kaXJlY3RfaW5kZXgiLCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRF9ESVNQKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkX2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERfSU5ESVJFQ1RfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZF9pbmRpcmVjdF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkX2luZGlyZWN0X2Rpc3AiLCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRF9JTkRFWF9ESVNQKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkX2luZGV4X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOworICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkX2luZGV4X2Rpc3AiLCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRF9JTkRJUkVDVF9JTkRFWF9ESVNQKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkX2luZGlyZWN0X2luZGV4X2Rpc3AiLCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERPQl9PRkZTRVQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRvYl9vZmZzZXQuZgorICBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYSBmLXplcm9hIGYtb2Zmc2V0ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9PRkZTRVRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRvYl9vZmZzZXQiLCAiZl9vZmZzZXQgMHgleCIsICd4JywgZl9vZmZzZXQsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRE9CX0lORElSRUNUX09GRlNFVCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9iX2luZGlyZWN0X29mZnNldC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfT0ZGU0VUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGVhIGYtemVyb2EgZi1vZmZzZXQgKi8KKworICBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29mZnNldCkgPSBmX29mZnNldDsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZG9iX2luZGlyZWN0X29mZnNldCIsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRE9CX0lORElSRUNUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2JfaW5kaXJlY3QuZgorICBFWFRSQUNUX0lGTVRfTERBX0lORElSRUNUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZG9iX2luZGlyZWN0IiwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRE9CX0lORElSRUNUX0lOREVYKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2JfaW5kaXJlY3RfaW5kZXguZgorICBFWFRSQUNUX0lGTVRfTERBX0lORElSRUNUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRvYl9pbmRpcmVjdF9pbmRleCIsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xET0JfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9iX2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRvYl9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRE9CX0lORElSRUNUX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRvYl9pbmRpcmVjdF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkb2JfaW5kaXJlY3RfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xET0JfSU5ERVhfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9iX2luZGV4X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOworICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkb2JfaW5kZXhfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xET0JfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9iX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkb2JfaW5kaXJlY3RfaW5kZXhfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRE9TX09GRlNFVCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9zX29mZnNldC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfT0ZGU0VUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGVhIGYtemVyb2EgZi1vZmZzZXQgKi8KKworICBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29mZnNldCkgPSBmX29mZnNldDsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZG9zX29mZnNldCIsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xET1NfSU5ESVJFQ1RfT0ZGU0VUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3NfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9PRkZTRVRfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWEgZi16ZXJvYSBmLW9mZnNldCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfT0ZGU0VUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb2Zmc2V0KSA9IGZfb2Zmc2V0OworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkb3NfaW5kaXJlY3Rfb2Zmc2V0IiwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xET1NfSU5ESVJFQ1QpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRvc19pbmRpcmVjdC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfSU5ESVJFQ1RfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfTERBX0lORElSRUNUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkb3NfaW5kaXJlY3QiLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xET1NfSU5ESVJFQ1RfSU5ERVgpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRvc19pbmRpcmVjdF9pbmRleC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfSU5ESVJFQ1RfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfTERBX0lORElSRUNUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZG9zX2luZGlyZWN0X2luZGV4IiwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERPU19ESVNQKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3NfZGlzcC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZG9zX2Rpc3AiLCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xET1NfSU5ESVJFQ1RfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9zX2luZGlyZWN0X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRvc19pbmRpcmVjdF9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERPU19JTkRFWF9ESVNQKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3NfaW5kZXhfZGlzcC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKKyAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7CisgIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRvc19pbmRleF9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERPU19JTkRJUkVDVF9JTkRFWF9ESVNQKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3NfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKKyAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRvc19pbmRpcmVjdF9pbmRleF9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xESUJfT0ZGU0VUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaWJfb2Zmc2V0LmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9PRkZTRVRfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWEgZi16ZXJvYSBmLW9mZnNldCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfT0ZGU0VUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb2Zmc2V0KSA9IGZfb2Zmc2V0OworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkaWJfb2Zmc2V0IiwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERJQl9JTkRJUkVDVF9PRkZTRVQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpYl9pbmRpcmVjdF9vZmZzZXQuZgorICBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYSBmLXplcm9hIGYtb2Zmc2V0ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9PRkZTRVRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRpYl9pbmRpcmVjdF9vZmZzZXQiLCAiZl9vZmZzZXQgMHgleCIsICd4JywgZl9vZmZzZXQsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERJQl9JTkRJUkVDVCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGliX2luZGlyZWN0LmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfSU5ESVJFQ1RfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRpYl9pbmRpcmVjdCIsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERJQl9JTkRJUkVDVF9JTkRFWCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGliX2luZGlyZWN0X2luZGV4LmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfSU5ESVJFQ1RfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkaWJfaW5kaXJlY3RfaW5kZXgiLCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRElCX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpYl9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkaWJfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERJQl9JTkRJUkVDVF9ESVNQKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaWJfaW5kaXJlY3RfZGlzcC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZGliX2luZGlyZWN0X2Rpc3AiLCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRElCX0lOREVYX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpYl9pbmRleF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKKyAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZGliX2luZGV4X2Rpc3AiLCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRElCX0lORElSRUNUX0lOREVYX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpYl9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZGliX2luZGlyZWN0X2luZGV4X2Rpc3AiLCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERJU19PRkZTRVQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpc19vZmZzZXQuZgorICBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYSBmLXplcm9hIGYtb2Zmc2V0ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9PRkZTRVRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRpc19vZmZzZXQiLCAiZl9vZmZzZXQgMHgleCIsICd4JywgZl9vZmZzZXQsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRElTX0lORElSRUNUX09GRlNFVCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGlzX2luZGlyZWN0X29mZnNldC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfT0ZGU0VUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGVhIGYtemVyb2EgZi1vZmZzZXQgKi8KKworICBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29mZnNldCkgPSBmX29mZnNldDsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZGlzX2luZGlyZWN0X29mZnNldCIsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRElTX0lORElSRUNUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaXNfaW5kaXJlY3QuZgorICBFWFRSQUNUX0lGTVRfTERBX0lORElSRUNUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZGlzX2luZGlyZWN0IiwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRElTX0lORElSRUNUX0lOREVYKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaXNfaW5kaXJlY3RfaW5kZXguZgorICBFWFRSQUNUX0lGTVRfTERBX0lORElSRUNUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRpc19pbmRpcmVjdF9pbmRleCIsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xESVNfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGlzX2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRpc19kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRElTX0lORElSRUNUX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpc19pbmRpcmVjdF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkaXNfaW5kaXJlY3RfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xESVNfSU5ERVhfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGlzX2luZGV4X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOworICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkaXNfaW5kZXhfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xESVNfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGlzX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkaXNfaW5kaXJlY3RfaW5kZXhfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRExfT0ZGU0VUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkbF9vZmZzZXQuZgorICBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYSBmLXplcm9hIGYtb2Zmc2V0ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9PRkZTRVRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRsX29mZnNldCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRExfSU5ESVJFQ1RfT0ZGU0VUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkbF9pbmRpcmVjdF9vZmZzZXQuZgorICBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYSBmLXplcm9hIGYtb2Zmc2V0ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9PRkZTRVRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRsX2luZGlyZWN0X29mZnNldCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERMX0lORElSRUNUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkbF9pbmRpcmVjdC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfSU5ESVJFQ1RfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfTERBX0lORElSRUNUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkbF9pbmRpcmVjdCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xETF9JTkRJUkVDVF9JTkRFWCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGxfaW5kaXJlY3RfaW5kZXguZgorICBFWFRSQUNUX0lGTVRfTERBX0lORElSRUNUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRsX2luZGlyZWN0X2luZGV4IiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xETF9ESVNQKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkbF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkbF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERMX0lORElSRUNUX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRsX2luZGlyZWN0X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRsX2luZGlyZWN0X2Rpc3AiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERMX0lOREVYX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRsX2luZGV4X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOworICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkbF9pbmRleF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xETF9JTkRJUkVDVF9JTkRFWF9ESVNQKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkbF9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZGxfaW5kaXJlY3RfaW5kZXhfZGlzcCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERUX09GRlNFVCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHRfb2Zmc2V0LmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9PRkZTRVRfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWEgZi16ZXJvYSBmLW9mZnNldCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfT0ZGU0VUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGZfb2Zmc2V0KSA9IGZfb2Zmc2V0OworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkdF9vZmZzZXQiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRFRfSU5ESVJFQ1RfT0ZGU0VUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdF9pbmRpcmVjdF9vZmZzZXQuZgorICBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYSBmLXplcm9hIGYtb2Zmc2V0ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9PRkZTRVRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGR0X2luZGlyZWN0X29mZnNldCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRFRfSU5ESVJFQ1QpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGR0X2luZGlyZWN0LmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfSU5ESVJFQ1RfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGR0X2luZGlyZWN0IiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRFRfSU5ESVJFQ1RfSU5ERVgpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGR0X2luZGlyZWN0X2luZGV4LmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfSU5ESVJFQ1RfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkdF9pbmRpcmVjdF9pbmRleCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xEVF9ESVNQKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkdF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRFRfSU5ESVJFQ1RfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHRfaW5kaXJlY3RfZGlzcC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZHRfaW5kaXJlY3RfZGlzcCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xEVF9JTkRFWF9ESVNQKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdF9pbmRleF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKKyAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZHRfaW5kZXhfZGlzcCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xEVF9JTkRJUkVDVF9JTkRFWF9ESVNQKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdF9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZHRfaW5kaXJlY3RfaW5kZXhfZGlzcCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRFFfT0ZGU0VUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcV9vZmZzZXQuZgorICBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYSBmLXplcm9hIGYtb2Zmc2V0ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9PRkZTRVRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRxX29mZnNldCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8zKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDMpKTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERRX0lORElSRUNUX09GRlNFVCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9PRkZTRVRfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWEgZi16ZXJvYSBmLW9mZnNldCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfT0ZGU0VUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGZfb2Zmc2V0KSA9IGZfb2Zmc2V0OworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkcV9pbmRpcmVjdF9vZmZzZXQiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzMpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRFFfSU5ESVJFQ1QpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRxX2luZGlyZWN0LmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfSU5ESVJFQ1RfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRxX2luZGlyZWN0IiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImRzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKG91dF9kc3QpID0gZl9zcmNkc3Q7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMykgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgzKSk7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xEUV9JTkRJUkVDVF9JTkRFWCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHFfaW5kaXJlY3RfaW5kZXguZgorICBFWFRSQUNUX0lGTVRfTERBX0lORElSRUNUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRxX2luZGlyZWN0X2luZGV4IiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzMpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRFFfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHFfZGlzcC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZHFfZGlzcCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzMpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRFFfSU5ESVJFQ1RfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHFfaW5kaXJlY3RfZGlzcC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2RzdCkgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZHFfaW5kaXJlY3RfZGlzcCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAob3V0X2RzdCkgPSBmX3NyY2RzdDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8zKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDMpKTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERRX0lOREVYX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRxX2luZGV4X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOworICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOworICBGTEQgKGlfZHN0KSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkcV9pbmRleF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzMpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRFFfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKKyAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07CisgIEZMRCAoaV9kc3QpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OworICAgICAgRkxEIChvdXRfZHN0KSA9IGZfc3JjZHN0OworICAgICAgRkxEIChvdXRfaF9ncl9hZGRfX1ZNX2luZGV4X29mX2RzdF9jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgICBGTEQgKG91dF9oX2dyX2FkZF9fVk1faW5kZXhfb2ZfZHN0X2NvbnN0X19XSV8yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfYWRkX19WTV9pbmRleF9vZl9kc3RfY29uc3RfX1dJXzMpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVF9PRkZTRVQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3Rfb2Zmc2V0LmYKKyAgRVhUUkFDVF9JRk1UX1NUX09GRlNFVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYSBmLXplcm9hIGYtb2Zmc2V0ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX09GRlNFVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29mZnNldCkgPSBmX29mZnNldDsKKyAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdF9vZmZzZXQiLCAiZl9vZmZzZXQgMHgleCIsICd4JywgZl9vZmZzZXQsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUX0lORElSRUNUX09GRlNFVCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9pbmRpcmVjdF9vZmZzZXQuZgorICBFWFRSQUNUX0lGTVRfU1RfT0ZGU0VUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGVhIGYtemVyb2EgZi1vZmZzZXQgKi8KKworICBFWFRSQUNUX0lGTVRfU1RfT0ZGU0VUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb2Zmc2V0KSA9IGZfb2Zmc2V0OworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0X2luZGlyZWN0X29mZnNldCIsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUX0lORElSRUNUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0X2luZGlyZWN0LmYKKyAgRVhUUkFDVF9JRk1UX1NUX0lORElSRUNUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX0lORElSRUNUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0X2luZGlyZWN0IiwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUX0lORElSRUNUX0lOREVYKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0X2luZGlyZWN0X2luZGV4LmYKKyAgRVhUUkFDVF9JRk1UX1NUX0lORElSRUNUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX0lORElSRUNUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKKyAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdF9pbmRpcmVjdF9pbmRleCIsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7CisgICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX1NUX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX0RJU1BfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKKyAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdF9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUX0lORElSRUNUX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfaW5kaXJlY3RfZGlzcC5mCisgIEVYVFJBQ1RfSUZNVF9TVF9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9TVF9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RfaW5kaXJlY3RfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RfSU5ERVhfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9pbmRleF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX1NUX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX0RJU1BfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKKyAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7CisgIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07CisgIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RfaW5kZXhfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7CisgICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX1NUX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX0RJU1BfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKKyAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07CisgIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RfaW5kaXJlY3RfaW5kZXhfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OworICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUT0JfT0ZGU0VUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0b2Jfb2Zmc2V0LmYKKyAgRVhUUkFDVF9JRk1UX1NUX09GRlNFVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYSBmLXplcm9hIGYtb2Zmc2V0ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX09GRlNFVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29mZnNldCkgPSBmX29mZnNldDsKKyAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdG9iX29mZnNldCIsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RPQl9JTkRJUkVDVF9PRkZTRVQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9pbmRpcmVjdF9vZmZzZXQuZgorICBFWFRSQUNUX0lGTVRfU1RfT0ZGU0VUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGVhIGYtemVyb2EgZi1vZmZzZXQgKi8KKworICBFWFRSQUNUX0lGTVRfU1RfT0ZGU0VUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb2Zmc2V0KSA9IGZfb2Zmc2V0OworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0b2JfaW5kaXJlY3Rfb2Zmc2V0IiwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RPQl9JTkRJUkVDVCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9iX2luZGlyZWN0LmYKKyAgRVhUUkFDVF9JRk1UX1NUX0lORElSRUNUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX0lORElSRUNUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0b2JfaW5kaXJlY3QiLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RPQl9JTkRJUkVDVF9JTkRFWCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9iX2luZGlyZWN0X2luZGV4LmYKKyAgRVhUUkFDVF9JRk1UX1NUX0lORElSRUNUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX0lORElSRUNUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKKyAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdG9iX2luZGlyZWN0X2luZGV4IiwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKKyAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVE9CX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX1NUX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX0RJU1BfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKKyAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdG9iX2Rpc3AiLCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RPQl9JTkRJUkVDVF9ESVNQKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0b2JfaW5kaXJlY3RfZGlzcC5mCisgIEVYVFJBQ1RfSUZNVF9TVF9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9TVF9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RvYl9pbmRpcmVjdF9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVE9CX0lOREVYX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9pbmRleF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX1NUX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX0RJU1BfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKKyAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7CisgIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07CisgIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RvYl9pbmRleF9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKKyAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVE9CX0lORElSRUNUX0lOREVYX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX1NUX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX0RJU1BfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKKyAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07CisgIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RvYl9pbmRpcmVjdF9pbmRleF9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7CisgICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RPU19PRkZTRVQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3Rvc19vZmZzZXQuZgorICBFWFRSQUNUX0lGTVRfU1RfT0ZGU0VUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGVhIGYtemVyb2EgZi1vZmZzZXQgKi8KKworICBFWFRSQUNUX0lGTVRfU1RfT0ZGU0VUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb2Zmc2V0KSA9IGZfb2Zmc2V0OworICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0b3Nfb2Zmc2V0IiwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVE9TX0lORElSRUNUX09GRlNFVCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2luZGlyZWN0X29mZnNldC5mCisgIEVYVFJBQ1RfSUZNVF9TVF9PRkZTRVRfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWEgZi16ZXJvYSBmLW9mZnNldCAqLworCisgIEVYVFJBQ1RfSUZNVF9TVF9PRkZTRVRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3Rvc19pbmRpcmVjdF9vZmZzZXQiLCAiZl9vZmZzZXQgMHgleCIsICd4JywgZl9vZmZzZXQsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVE9TX0lORElSRUNUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0b3NfaW5kaXJlY3QuZgorICBFWFRSQUNUX0lGTVRfU1RfSU5ESVJFQ1RfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfU1RfSU5ESVJFQ1RfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3Rvc19pbmRpcmVjdCIsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVE9TX0lORElSRUNUX0lOREVYKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0b3NfaW5kaXJlY3RfaW5kZXguZgorICBFWFRSQUNUX0lGTVRfU1RfSU5ESVJFQ1RfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfU1RfSU5ESVJFQ1RfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOworICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0b3NfaW5kaXJlY3RfaW5kZXgiLCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OworICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUT1NfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfU1RfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfU1RfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0b3NfZGlzcCIsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVE9TX0lORElSRUNUX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3Rvc19pbmRpcmVjdF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX1NUX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX0RJU1BfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdG9zX2luZGlyZWN0X2Rpc3AiLCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUT1NfSU5ERVhfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2luZGV4X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfU1RfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfU1RfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKKyAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKKyAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdG9zX2luZGV4X2Rpc3AiLCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OworICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUT1NfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfU1RfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfU1RfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKKyAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdG9zX2luZGlyZWN0X2luZGV4X2Rpc3AiLCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKKyAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVExfT0ZGU0VUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0bF9vZmZzZXQuZgorICBFWFRSQUNUX0lGTVRfU1RfT0ZGU0VUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGVhIGYtemVyb2EgZi1vZmZzZXQgKi8KKworICBFWFRSQUNUX0lGTVRfU1RfT0ZGU0VUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGZfb2Zmc2V0KSA9IGZfb2Zmc2V0OworICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0bF9vZmZzZXQiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUTF9JTkRJUkVDVF9PRkZTRVQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RsX2luZGlyZWN0X29mZnNldC5mCisgIEVYVFJBQ1RfSUZNVF9TVF9PRkZTRVRfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWEgZi16ZXJvYSBmLW9mZnNldCAqLworCisgIEVYVFJBQ1RfSUZNVF9TVF9PRkZTRVRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RsX2luZGlyZWN0X29mZnNldCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUTF9JTkRJUkVDVCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGxfaW5kaXJlY3QuZgorICBFWFRSQUNUX0lGTVRfU1RfSU5ESVJFQ1RfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfU1RfSU5ESVJFQ1RfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RsX2luZGlyZWN0IiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUTF9JTkRJUkVDVF9JTkRFWCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGxfaW5kaXJlY3RfaW5kZXguZgorICBFWFRSQUNUX0lGTVRfU1RfSU5ESVJFQ1RfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfU1RfSU5ESVJFQ1RfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOworICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0bF9pbmRpcmVjdF9pbmRleCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7CisgICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RMX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RsX2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfU1RfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfU1RfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0bF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUTF9JTkRJUkVDVF9ESVNQKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0bF9pbmRpcmVjdF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX1NUX0RJU1BfVkFSUyAvKiBmLW9wY29kZSBmLW9wdGRpc3AgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX0RJU1BfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdGxfaW5kaXJlY3RfZGlzcCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RMX0lOREVYX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RsX2luZGV4X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfU1RfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfU1RfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKKyAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKKyAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdGxfaW5kZXhfZGlzcCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7CisgICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RMX0lORElSRUNUX0lOREVYX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RsX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfU1RfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfU1RfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKKyAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdGxfaW5kaXJlY3RfaW5kZXhfZGlzcCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChpbl9pbmRleCkgPSBmX2luZGV4OworICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUVF9PRkZTRVQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3R0X29mZnNldC5mCisgIEVYVFJBQ1RfSUZNVF9TVF9PRkZTRVRfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWEgZi16ZXJvYSBmLW9mZnNldCAqLworCisgIEVYVFJBQ1RfSUZNVF9TVF9PRkZTRVRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7CisgIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3R0X29mZnNldCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOworICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUVF9JTkRJUkVDVF9PRkZTRVQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3R0X2luZGlyZWN0X29mZnNldC5mCisgIEVYVFJBQ1RfSUZNVF9TVF9PRkZTRVRfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWEgZi16ZXJvYSBmLW9mZnNldCAqLworCisgIEVYVFJBQ1RfSUZNVF9TVF9PRkZTRVRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3R0X2luZGlyZWN0X29mZnNldCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKKyAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVFRfSU5ESVJFQ1QpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3R0X2luZGlyZWN0LmYKKyAgRVhUUkFDVF9JRk1UX1NUX0lORElSRUNUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX0lORElSRUNUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0dF9pbmRpcmVjdCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7CisgICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RUX0lORElSRUNUX0lOREVYKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0dF9pbmRpcmVjdF9pbmRleC5mCisgIEVYVFJBQ1RfSUZNVF9TVF9JTkRJUkVDVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9TVF9JTkRJUkVDVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChmX3NjYWxlKSA9IGZfc2NhbGU7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9pbmRleCkgPSAmIENQVSAoaF9ncilbZl9pbmRleF07CisgIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3R0X2luZGlyZWN0X2luZGV4IiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9zY2FsZSAweCV4IiwgJ3gnLCBmX3NjYWxlLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7CisgICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7CisgICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RUX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3R0X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfU1RfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfU1RfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0dF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKKyAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVFRfSU5ESVJFQ1RfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHRfaW5kaXJlY3RfZGlzcC5mCisgIEVYVFJBQ1RfSUZNVF9TVF9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9TVF9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3R0X2luZGlyZWN0X2Rpc3AiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKKyAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVFRfSU5ERVhfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHRfaW5kZXhfZGlzcC5mCisgIEVYVFJBQ1RfSUZNVF9TVF9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9TVF9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOworICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOworICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0dF9pbmRleF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImluZGV4IDB4JXgiLCAneCcsIGZfaW5kZXgsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7CisgICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7CisgICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RUX0lORElSRUNUX0lOREVYX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3R0X2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfU1RfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfU1RfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKKyAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdHRfaW5kaXJlY3RfaW5kZXhfZGlzcCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKKyAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKKyAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVFFfT0ZGU0VUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cV9vZmZzZXQuZgorICBFWFRSQUNUX0lGTVRfU1RfT0ZGU0VUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGVhIGYtemVyb2EgZi1vZmZzZXQgKi8KKworICBFWFRSQUNUX0lGTVRfU1RfT0ZGU0VUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGZfb2Zmc2V0KSA9IGZfb2Zmc2V0OworICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0cV9vZmZzZXQiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMykgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgzKSk7CisgICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RRX0lORElSRUNUX09GRlNFVCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgRVhUUkFDVF9JRk1UX1NUX09GRlNFVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYSBmLXplcm9hIGYtb2Zmc2V0ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX09GRlNFVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChmX29mZnNldCkgPSBmX29mZnNldDsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0IiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vZmZzZXQgMHgleCIsICd4JywgZl9vZmZzZXQsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8zKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDMpKTsKKyAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVFFfSU5ESVJFQ1QpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RxX2luZGlyZWN0LmYKKyAgRVhUUkFDVF9JRk1UX1NUX0lORElSRUNUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX0lORElSRUNUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0cV9pbmRpcmVjdCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJzdF9zcmMgMHgleCIsICd4JywgZl9zcmNkc3QsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8xKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDEpKTsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMikgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgyKSk7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzMpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpOworICAgICAgRkxEIChpbl9zdF9zcmMpID0gZl9zcmNkc3Q7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUUV9JTkRJUkVDVF9JTkRFWCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHFfaW5kaXJlY3RfaW5kZXguZgorICBFWFRSQUNUX0lGTVRfU1RfSU5ESVJFQ1RfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfU1RfSU5ESVJFQ1RfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmNkc3QpID0gZl9zcmNkc3Q7CisgIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOworICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0cV9pbmRpcmVjdF9pbmRleCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8zKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDMpKTsKKyAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKKyAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVFFfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHFfZGlzcC5mCisgIEVYVFJBQ1RfSUZNVF9TVF9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9TVF9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RxX2Rpc3AiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8zKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDMpKTsKKyAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVFFfSU5ESVJFQ1RfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHFfaW5kaXJlY3RfZGlzcC5mCisgIEVYVFJBQ1RfSUZNVF9TVF9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9TVF9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIEZMRCAoaV9zdF9zcmMpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjZHN0XTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RxX2luZGlyZWN0X2Rpc3AiLCAiZl9zcmNkc3QgMHgleCIsICd4JywgZl9zcmNkc3QsICJmX29wdGRpc3AgMHgleCIsICd4JywgZl9vcHRkaXNwLCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgInN0X3NyYyAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzEpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpOworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8yKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDIpKTsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMykgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgzKSk7CisgICAgICBGTEQgKGluX3N0X3NyYykgPSBmX3NyY2RzdDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU1RRX0lOREVYX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RxX2luZGV4X2Rpc3AuZgorICBFWFRSQUNUX0lGTVRfU1RfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfU1RfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyY2RzdCkgPSBmX3NyY2RzdDsKKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKKyAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKKyAgRkxEIChpX3N0X3NyYykgPSAmIENQVSAoaF9ncilbZl9zcmNkc3RdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdHFfaW5kZXhfZGlzcCIsICJmX3NyY2RzdCAweCV4IiwgJ3gnLCBmX3NyY2RzdCwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8zKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDMpKTsKKyAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKKyAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVFFfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIEVYVFJBQ1RfSUZNVF9TVF9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9TVF9ESVNQX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjZHN0KSA9IGZfc3JjZHN0OworICBGTEQgKGZfb3B0ZGlzcCkgPSBmX29wdGRpc3A7CisgIEZMRCAoZl9zY2FsZSkgPSBmX3NjYWxlOworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBGTEQgKGlfaW5kZXgpID0gJiBDUFUgKGhfZ3IpW2ZfaW5kZXhdOworICBGTEQgKGlfc3Rfc3JjKSA9ICYgQ1BVIChoX2dyKVtmX3NyY2RzdF07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwIiwgImZfc3JjZHN0IDB4JXgiLCAneCcsIGZfc3JjZHN0LCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImZfc2NhbGUgMHgleCIsICd4JywgZl9zY2FsZSwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsICJpbmRleCAweCV4IiwgJ3gnLCBmX2luZGV4LCAic3Rfc3JjIDB4JXgiLCAneCcsIGZfc3JjZHN0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICAgIEZMRCAoaW5faF9ncl9hZGRfX1ZNX2luZGV4X29mX3N0X3NyY19jb25zdF9fV0lfMSkgPSAoKEZMRCAoZl9zcmNkc3QpKSArICgxKSk7CisgICAgICBGTEQgKGluX2hfZ3JfYWRkX19WTV9pbmRleF9vZl9zdF9zcmNfY29uc3RfX1dJXzIpID0gKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpOworICAgICAgRkxEIChpbl9oX2dyX2FkZF9fVk1faW5kZXhfb2Zfc3Rfc3JjX2NvbnN0X19XSV8zKSA9ICgoRkxEIChmX3NyY2RzdCkpICsgKDMpKTsKKyAgICAgIEZMRCAoaW5faW5kZXgpID0gZl9pbmRleDsKKyAgICAgIEZMRCAoaW5fc3Rfc3JjKSA9IGZfc3JjZHN0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9DTVBPQkVfUkVHKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX3JlZy5mCisgIEVYVFJBQ1RfSUZNVF9DTVBPQkVfUkVHX1ZBUlMgLyogZi1vcGNvZGUgZi1ici1zcmMxIGYtYnItc3JjMiBmLWJyLW0xIGYtYnItZGlzcCBmLWJyLXplcm8gKi8KKworICBFWFRSQUNUX0lGTVRfQ01QT0JFX1JFR19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX2JyX2Rpc3ApID0gZl9icl9kaXNwOworICBGTEQgKGlfYnJfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9icl9zcmMxXTsKKyAgRkxEIChpX2JyX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfYnJfc3JjMl07CisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfY21wb2JlX3JlZyIsICJicl9kaXNwIDB4JXgiLCAneCcsIGZfYnJfZGlzcCwgImJyX3NyYzEgMHgleCIsICd4JywgZl9icl9zcmMxLCAiYnJfc3JjMiAweCV4IiwgJ3gnLCBmX2JyX3NyYzIsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9icl9zcmMxKSA9IGZfYnJfc3JjMTsKKyAgICAgIEZMRCAoaW5fYnJfc3JjMikgPSBmX2JyX3NyYzI7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0NNUE9CRV9MSVQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfbGl0LmYKKyAgRVhUUkFDVF9JRk1UX0NNUE9CRV9MSVRfVkFSUyAvKiBmLW9wY29kZSBmLWJyLXNyYzEgZi1ici1zcmMyIGYtYnItbTEgZi1ici1kaXNwIGYtYnItemVybyAqLworCisgIEVYVFJBQ1RfSUZNVF9DTVBPQkVfTElUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfYnJfc3JjMSkgPSBmX2JyX3NyYzE7CisgIEZMRCAoaV9icl9kaXNwKSA9IGZfYnJfZGlzcDsKKyAgRkxEIChpX2JyX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfYnJfc3JjMl07CisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfY21wb2JlX2xpdCIsICJmX2JyX3NyYzEgMHgleCIsICd4JywgZl9icl9zcmMxLCAiYnJfZGlzcCAweCV4IiwgJ3gnLCBmX2JyX2Rpc3AsICJicl9zcmMyIDB4JXgiLCAneCcsIGZfYnJfc3JjMiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2JyX3NyYzIpID0gZl9icl9zcmMyOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9DTVBPQkxfUkVHKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JsX3JlZy5mCisgIEVYVFJBQ1RfSUZNVF9DTVBPQkVfUkVHX1ZBUlMgLyogZi1vcGNvZGUgZi1ici1zcmMxIGYtYnItc3JjMiBmLWJyLW0xIGYtYnItZGlzcCBmLWJyLXplcm8gKi8KKworICBFWFRSQUNUX0lGTVRfQ01QT0JFX1JFR19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX2JyX2Rpc3ApID0gZl9icl9kaXNwOworICBGTEQgKGlfYnJfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9icl9zcmMxXTsKKyAgRkxEIChpX2JyX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfYnJfc3JjMl07CisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfY21wb2JsX3JlZyIsICJicl9kaXNwIDB4JXgiLCAneCcsIGZfYnJfZGlzcCwgImJyX3NyYzEgMHgleCIsICd4JywgZl9icl9zcmMxLCAiYnJfc3JjMiAweCV4IiwgJ3gnLCBmX2JyX3NyYzIsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9icl9zcmMxKSA9IGZfYnJfc3JjMTsKKyAgICAgIEZMRCAoaW5fYnJfc3JjMikgPSBmX2JyX3NyYzI7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0NNUE9CTF9MSVQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmxfbGl0LmYKKyAgRVhUUkFDVF9JRk1UX0NNUE9CRV9MSVRfVkFSUyAvKiBmLW9wY29kZSBmLWJyLXNyYzEgZi1ici1zcmMyIGYtYnItbTEgZi1ici1kaXNwIGYtYnItemVybyAqLworCisgIEVYVFJBQ1RfSUZNVF9DTVBPQkVfTElUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfYnJfc3JjMSkgPSBmX2JyX3NyYzE7CisgIEZMRCAoaV9icl9kaXNwKSA9IGZfYnJfZGlzcDsKKyAgRkxEIChpX2JyX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfYnJfc3JjMl07CisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfY21wb2JsX2xpdCIsICJmX2JyX3NyYzEgMHgleCIsICd4JywgZl9icl9zcmMxLCAiYnJfZGlzcCAweCV4IiwgJ3gnLCBmX2JyX2Rpc3AsICJicl9zcmMyIDB4JXgiLCAneCcsIGZfYnJfc3JjMiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2JyX3NyYzIpID0gZl9icl9zcmMyOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9CQkNfUkVHKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmJjX3JlZy5mCisgIEVYVFJBQ1RfSUZNVF9DTVBPQkVfUkVHX1ZBUlMgLyogZi1vcGNvZGUgZi1ici1zcmMxIGYtYnItc3JjMiBmLWJyLW0xIGYtYnItZGlzcCBmLWJyLXplcm8gKi8KKworICBFWFRSQUNUX0lGTVRfQ01QT0JFX1JFR19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX2JyX2Rpc3ApID0gZl9icl9kaXNwOworICBGTEQgKGlfYnJfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9icl9zcmMxXTsKKyAgRkxEIChpX2JyX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfYnJfc3JjMl07CisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfYmJjX3JlZyIsICJicl9kaXNwIDB4JXgiLCAneCcsIGZfYnJfZGlzcCwgImJyX3NyYzEgMHgleCIsICd4JywgZl9icl9zcmMxLCAiYnJfc3JjMiAweCV4IiwgJ3gnLCBmX2JyX3NyYzIsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9icl9zcmMxKSA9IGZfYnJfc3JjMTsKKyAgICAgIEZMRCAoaW5fYnJfc3JjMikgPSBmX2JyX3NyYzI7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0JCQ19MSVQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iYmNfbGl0LmYKKyAgRVhUUkFDVF9JRk1UX0NNUE9CRV9MSVRfVkFSUyAvKiBmLW9wY29kZSBmLWJyLXNyYzEgZi1ici1zcmMyIGYtYnItbTEgZi1ici1kaXNwIGYtYnItemVybyAqLworCisgIEVYVFJBQ1RfSUZNVF9DTVBPQkVfTElUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfYnJfc3JjMSkgPSBmX2JyX3NyYzE7CisgIEZMRCAoaV9icl9kaXNwKSA9IGZfYnJfZGlzcDsKKyAgRkxEIChpX2JyX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfYnJfc3JjMl07CisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfYmJjX2xpdCIsICJmX2JyX3NyYzEgMHgleCIsICd4JywgZl9icl9zcmMxLCAiYnJfZGlzcCAweCV4IiwgJ3gnLCBmX2JyX2Rpc3AsICJicl9zcmMyIDB4JXgiLCAneCcsIGZfYnJfc3JjMiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2JyX3NyYzIpID0gZl9icl9zcmMyOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9DTVBJKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkuZgorICBFWFRSQUNUX0lGTVRfTVVMT19WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtc3JjMiBmLW0zIGYtbTIgZi1tMSBmLW9wY29kZTIgZi16ZXJvIGYtc3JjMSAqLworCisgIEVYVFJBQ1RfSUZNVF9NVUxPX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9zcmMxXTsKKyAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMl07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2NtcGkiLCAic3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJzcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyYzEpID0gZl9zcmMxOworICAgICAgRkxEIChpbl9zcmMyKSA9IGZfc3JjMjsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQ01QSTEpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY21waTEuZgorICBFWFRSQUNUX0lGTVRfTVVMTzFfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLXNyYzIgZi1tMyBmLW0yIGYtbTEgZi1vcGNvZGUyIGYtemVybyBmLXNyYzEgKi8KKworICBFWFRSQUNUX0lGTVRfTVVMTzFfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmMxKSA9IGZfc3JjMTsKKyAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMl07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2NtcGkxIiwgImZfc3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJzcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyYzIpID0gZl9zcmMyOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9DTVBJMikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXBpMi5mCisgIEVYVFJBQ1RfSUZNVF9NVUxPMl9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtc3JjMiBmLW0zIGYtbTIgZi1tMSBmLW9wY29kZTIgZi16ZXJvIGYtc3JjMSAqLworCisgIEVYVFJBQ1RfSUZNVF9NVUxPMl9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyYzIpID0gZl9zcmMyOworICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9zcmMxXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfY21waTIiLCAiZl9zcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgInNyYzEgMHgleCIsICd4JywgZl9zcmMxLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3NyYzE7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0NNUEkzKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkzLmYKKyAgRVhUUkFDVF9JRk1UX01VTE8zX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1zcmMyIGYtbTMgZi1tMiBmLW0xIGYtb3Bjb2RlMiBmLXplcm8gZi1zcmMxICovCisKKyAgRVhUUkFDVF9JRk1UX01VTE8zX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjMSkgPSBmX3NyYzE7CisgIEZMRCAoZl9zcmMyKSA9IGZfc3JjMjsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfY21waTMiLCAiZl9zcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgImZfc3JjMiAweCV4IiwgJ3gnLCBmX3NyYzIsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9DTVBPKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcG8uZgorICBFWFRSQUNUX0lGTVRfTVVMT19WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtc3JjMiBmLW0zIGYtbTIgZi1tMSBmLW9wY29kZTIgZi16ZXJvIGYtc3JjMSAqLworCisgIEVYVFJBQ1RfSUZNVF9NVUxPX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9zcmMxXTsKKyAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMl07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2NtcG8iLCAic3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJzcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyYzEpID0gZl9zcmMxOworICAgICAgRkxEIChpbl9zcmMyKSA9IGZfc3JjMjsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQ01QTzEpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY21wbzEuZgorICBFWFRSQUNUX0lGTVRfTVVMTzFfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLXNyYzIgZi1tMyBmLW0yIGYtbTEgZi1vcGNvZGUyIGYtemVybyBmLXNyYzEgKi8KKworICBFWFRSQUNUX0lGTVRfTVVMTzFfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zcmMxKSA9IGZfc3JjMTsKKyAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMl07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2NtcG8xIiwgImZfc3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsICJzcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyYzIpID0gZl9zcmMyOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9DTVBPMikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXBvMi5mCisgIEVYVFJBQ1RfSUZNVF9NVUxPMl9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtc3JjMiBmLW0zIGYtbTIgZi1tMSBmLW9wY29kZTIgZi16ZXJvIGYtc3JjMSAqLworCisgIEVYVFJBQ1RfSUZNVF9NVUxPMl9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NyYzIpID0gZl9zcmMyOworICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9zcmMxXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfY21wbzIiLCAiZl9zcmMyIDB4JXgiLCAneCcsIGZfc3JjMiwgInNyYzEgMHgleCIsICd4JywgZl9zcmMxLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3NyYzE7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0NNUE8zKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcG8zLmYKKyAgRVhUUkFDVF9JRk1UX01VTE8zX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1zcmMyIGYtbTMgZi1tMiBmLW0xIGYtb3Bjb2RlMiBmLXplcm8gZi1zcmMxICovCisKKyAgRVhUUkFDVF9JRk1UX01VTE8zX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc3JjMSkgPSBmX3NyYzE7CisgIEZMRCAoZl9zcmMyKSA9IGZfc3JjMjsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfY21wbzMiLCAiZl9zcmMxIDB4JXgiLCAneCcsIGZfc3JjMSwgImZfc3JjMiAweCV4IiwgJ3gnLCBmX3NyYzIsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9URVNUTk9fUkVHKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3Rlc3Rub19yZWcuZgorICBFWFRSQUNUX0lGTVRfQ01QT0JFX1JFR19WQVJTIC8qIGYtb3Bjb2RlIGYtYnItc3JjMSBmLWJyLXNyYzIgZi1ici1tMSBmLWJyLWRpc3AgZi1ici16ZXJvICovCisKKyAgRVhUUkFDVF9JRk1UX0NNUE9CRV9SRUdfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9icl9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX2JyX3NyYzFdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF90ZXN0bm9fcmVnIiwgImJyX3NyYzEgMHgleCIsICd4JywgZl9icl9zcmMxLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAob3V0X2JyX3NyYzEpID0gZl9icl9zcmMxOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9CTk8pIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibm8uZgorICBFWFRSQUNUX0lGTVRfQk5PX1ZBUlMgLyogZi1vcGNvZGUgZi1jdHJsLWRpc3AgZi1jdHJsLXplcm8gKi8KKworICBFWFRSQUNUX0lGTVRfQk5PX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfY3RybF9kaXNwKSA9IGZfY3RybF9kaXNwOworICBTRU1fQlJBTkNIX0lOSVRfRVhUUkFDVCAoYWJ1Zik7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2JubyIsICJjdHJsX2Rpc3AgMHgleCIsICd4JywgZl9jdHJsX2Rpc3AsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9CKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYi5mCisgIEVYVFJBQ1RfSUZNVF9CTk9fVkFSUyAvKiBmLW9wY29kZSBmLWN0cmwtZGlzcCBmLWN0cmwtemVybyAqLworCisgIEVYVFJBQ1RfSUZNVF9CTk9fQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9jdHJsX2Rpc3ApID0gZl9jdHJsX2Rpc3A7CisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfYiIsICJjdHJsX2Rpc3AgMHgleCIsICd4JywgZl9jdHJsX2Rpc3AsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9CWF9JTkRJUkVDVF9PRkZTRVQpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ieF9pbmRpcmVjdF9vZmZzZXQuZgorICBFWFRSQUNUX0lGTVRfTERBX09GRlNFVF9WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYSBmLXplcm9hIGYtb2Zmc2V0ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9PRkZTRVRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vZmZzZXQpID0gZl9vZmZzZXQ7CisgIEZMRCAoaV9hYmFzZSkgPSAmIENQVSAoaF9ncilbZl9hYmFzZV07CisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfYnhfaW5kaXJlY3Rfb2Zmc2V0IiwgImZfb2Zmc2V0IDB4JXgiLCAneCcsIGZfb2Zmc2V0LCAiYWJhc2UgMHgleCIsICd4JywgZl9hYmFzZSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0JYX0lORElSRUNUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYnhfaW5kaXJlY3QuZgorICBFWFRSQUNUX0lGTVRfTERBX0lORElSRUNUX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1hYmFzZSBmLW1vZGViIGYtc2NhbGUgZi16ZXJvYiBmLWluZGV4ICovCisKKyAgRVhUUkFDVF9JRk1UX0xEQV9JTkRJUkVDVF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QgKGFidWYpOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9ieF9pbmRpcmVjdCIsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fYWJhc2UpID0gZl9hYmFzZTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQlhfSU5ESVJFQ1RfSU5ERVgpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ieF9pbmRpcmVjdF9pbmRleC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfSU5ESVJFQ1RfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfTERBX0lORElSRUNUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc2NhbGUpID0gZl9zY2FsZTsKKyAgRkxEIChpX2FiYXNlKSA9ICYgQ1BVIChoX2dyKVtmX2FiYXNlXTsKKyAgRkxEIChpX2luZGV4KSA9ICYgQ1BVIChoX2dyKVtmX2luZGV4XTsKKyAgU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QgKGFidWYpOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9ieF9pbmRpcmVjdF9pbmRleCIsICJmX3NjYWxlIDB4JXgiLCAneCcsIGZfc2NhbGUsICJhYmFzZSAweCV4IiwgJ3gnLCBmX2FiYXNlLCAiaW5kZXggMHgleCIsICd4JywgZl9pbmRleCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2FiYXNlKSA9IGZfYWJhc2U7CisgICAgICBGTEQgKGluX2luZGV4KSA9IGZfaW5kZXg7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0JYX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ieF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBTRU1fQlJBTkNIX0lOSVRfRVhUUkFDVCAoYWJ1Zik7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2J4X2Rpc3AiLCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0JYX0lORElSRUNUX0RJU1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ieF9pbmRpcmVjdF9kaXNwLmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9ESVNQX1ZBUlMgLyogZi1vcGNvZGUgZi1vcHRkaXNwIGYtc3JjZHN0IGYtYWJhc2UgZi1tb2RlYiBmLXNjYWxlIGYtemVyb2IgZi1pbmRleCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX29wdGRpc3ApID0gZl9vcHRkaXNwOworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBTRU1fQlJBTkNIX0lOSVRfRVhUUkFDVCAoYWJ1Zik7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2J4X2luZGlyZWN0X2Rpc3AiLCAiZl9vcHRkaXNwIDB4JXgiLCAneCcsIGZfb3B0ZGlzcCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9DQUxMWF9ESVNQKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY2FsbHhfZGlzcC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfRElTUF9WQVJTIC8qIGYtb3Bjb2RlIGYtb3B0ZGlzcCBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfTERBX0RJU1BfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9vcHRkaXNwKSA9IGZfb3B0ZGlzcDsKKyAgU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QgKGFidWYpOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9jYWxseF9kaXNwIiwgImZfb3B0ZGlzcCAweCV4IiwgJ3gnLCBmX29wdGRpc3AsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9oX2dyXzApID0gMDsKKyAgICAgIEZMRCAoaW5faF9ncl8xKSA9IDE7CisgICAgICBGTEQgKGluX2hfZ3JfMTApID0gMTA7CisgICAgICBGTEQgKGluX2hfZ3JfMTEpID0gMTE7CisgICAgICBGTEQgKGluX2hfZ3JfMTIpID0gMTI7CisgICAgICBGTEQgKGluX2hfZ3JfMTMpID0gMTM7CisgICAgICBGTEQgKGluX2hfZ3JfMTQpID0gMTQ7CisgICAgICBGTEQgKGluX2hfZ3JfMTUpID0gMTU7CisgICAgICBGTEQgKGluX2hfZ3JfMikgPSAyOworICAgICAgRkxEIChpbl9oX2dyXzMpID0gMzsKKyAgICAgIEZMRCAoaW5faF9ncl8zMSkgPSAzMTsKKyAgICAgIEZMRCAoaW5faF9ncl80KSA9IDQ7CisgICAgICBGTEQgKGluX2hfZ3JfNSkgPSA1OworICAgICAgRkxEIChpbl9oX2dyXzYpID0gNjsKKyAgICAgIEZMRCAoaW5faF9ncl83KSA9IDc7CisgICAgICBGTEQgKGluX2hfZ3JfOCkgPSA4OworICAgICAgRkxEIChpbl9oX2dyXzkpID0gOTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMCkgPSAwOworICAgICAgRkxEIChvdXRfaF9ncl8xKSA9IDE7CisgICAgICBGTEQgKG91dF9oX2dyXzEwKSA9IDEwOworICAgICAgRkxEIChvdXRfaF9ncl8xMSkgPSAxMTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTIpID0gMTI7CisgICAgICBGTEQgKG91dF9oX2dyXzEzKSA9IDEzOworICAgICAgRkxEIChvdXRfaF9ncl8xNCkgPSAxNDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTUpID0gMTU7CisgICAgICBGTEQgKG91dF9oX2dyXzIpID0gMjsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMykgPSAzOworICAgICAgRkxEIChvdXRfaF9ncl8zMSkgPSAzMTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfNCkgPSA0OworICAgICAgRkxEIChvdXRfaF9ncl81KSA9IDU7CisgICAgICBGTEQgKG91dF9oX2dyXzYpID0gNjsKKyAgICAgIEZMRCAob3V0X2hfZ3JfNykgPSA3OworICAgICAgRkxEIChvdXRfaF9ncl84KSA9IDg7CisgICAgICBGTEQgKG91dF9oX2dyXzkpID0gOTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQ0FMTFhfSU5ESVJFQ1QpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jYWxseF9pbmRpcmVjdC5mCisgIEVYVFJBQ1RfSUZNVF9MREFfSU5ESVJFQ1RfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWIgZi1zY2FsZSBmLXplcm9iIGYtaW5kZXggKi8KKworICBFWFRSQUNUX0lGTVRfTERBX0lORElSRUNUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBTRU1fQlJBTkNIX0lOSVRfRVhUUkFDVCAoYWJ1Zik7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2NhbGx4X2luZGlyZWN0IiwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChpbl9oX2dyXzApID0gMDsKKyAgICAgIEZMRCAoaW5faF9ncl8xKSA9IDE7CisgICAgICBGTEQgKGluX2hfZ3JfMTApID0gMTA7CisgICAgICBGTEQgKGluX2hfZ3JfMTEpID0gMTE7CisgICAgICBGTEQgKGluX2hfZ3JfMTIpID0gMTI7CisgICAgICBGTEQgKGluX2hfZ3JfMTMpID0gMTM7CisgICAgICBGTEQgKGluX2hfZ3JfMTQpID0gMTQ7CisgICAgICBGTEQgKGluX2hfZ3JfMTUpID0gMTU7CisgICAgICBGTEQgKGluX2hfZ3JfMikgPSAyOworICAgICAgRkxEIChpbl9oX2dyXzMpID0gMzsKKyAgICAgIEZMRCAoaW5faF9ncl8zMSkgPSAzMTsKKyAgICAgIEZMRCAoaW5faF9ncl80KSA9IDQ7CisgICAgICBGTEQgKGluX2hfZ3JfNSkgPSA1OworICAgICAgRkxEIChpbl9oX2dyXzYpID0gNjsKKyAgICAgIEZMRCAoaW5faF9ncl83KSA9IDc7CisgICAgICBGTEQgKGluX2hfZ3JfOCkgPSA4OworICAgICAgRkxEIChpbl9oX2dyXzkpID0gOTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMCkgPSAwOworICAgICAgRkxEIChvdXRfaF9ncl8xKSA9IDE7CisgICAgICBGTEQgKG91dF9oX2dyXzEwKSA9IDEwOworICAgICAgRkxEIChvdXRfaF9ncl8xMSkgPSAxMTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTIpID0gMTI7CisgICAgICBGTEQgKG91dF9oX2dyXzEzKSA9IDEzOworICAgICAgRkxEIChvdXRfaF9ncl8xNCkgPSAxNDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTUpID0gMTU7CisgICAgICBGTEQgKG91dF9oX2dyXzIpID0gMjsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMykgPSAzOworICAgICAgRkxEIChvdXRfaF9ncl8zMSkgPSAzMTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfNCkgPSA0OworICAgICAgRkxEIChvdXRfaF9ncl81KSA9IDU7CisgICAgICBGTEQgKG91dF9oX2dyXzYpID0gNjsKKyAgICAgIEZMRCAob3V0X2hfZ3JfNykgPSA3OworICAgICAgRkxEIChvdXRfaF9ncl84KSA9IDg7CisgICAgICBGTEQgKG91dF9oX2dyXzkpID0gOTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQ0FMTFhfSU5ESVJFQ1RfT0ZGU0VUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY2FsbHhfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgRVhUUkFDVF9JRk1UX0xEQV9PRkZTRVRfVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLWFiYXNlIGYtbW9kZWEgZi16ZXJvYSBmLW9mZnNldCAqLworCisgIEVYVFJBQ1RfSUZNVF9MREFfT0ZGU0VUX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfb2Zmc2V0KSA9IGZfb2Zmc2V0OworICBGTEQgKGlfYWJhc2UpID0gJiBDUFUgKGhfZ3IpW2ZfYWJhc2VdOworICBTRU1fQlJBTkNIX0lOSVRfRVhUUkFDVCAoYWJ1Zik7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2NhbGx4X2luZGlyZWN0X29mZnNldCIsICJmX29mZnNldCAweCV4IiwgJ3gnLCBmX29mZnNldCwgImFiYXNlIDB4JXgiLCAneCcsIGZfYWJhc2UsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9hYmFzZSkgPSBmX2FiYXNlOworICAgICAgRkxEIChpbl9oX2dyXzApID0gMDsKKyAgICAgIEZMRCAoaW5faF9ncl8xKSA9IDE7CisgICAgICBGTEQgKGluX2hfZ3JfMTApID0gMTA7CisgICAgICBGTEQgKGluX2hfZ3JfMTEpID0gMTE7CisgICAgICBGTEQgKGluX2hfZ3JfMTIpID0gMTI7CisgICAgICBGTEQgKGluX2hfZ3JfMTMpID0gMTM7CisgICAgICBGTEQgKGluX2hfZ3JfMTQpID0gMTQ7CisgICAgICBGTEQgKGluX2hfZ3JfMTUpID0gMTU7CisgICAgICBGTEQgKGluX2hfZ3JfMikgPSAyOworICAgICAgRkxEIChpbl9oX2dyXzMpID0gMzsKKyAgICAgIEZMRCAoaW5faF9ncl8zMSkgPSAzMTsKKyAgICAgIEZMRCAoaW5faF9ncl80KSA9IDQ7CisgICAgICBGTEQgKGluX2hfZ3JfNSkgPSA1OworICAgICAgRkxEIChpbl9oX2dyXzYpID0gNjsKKyAgICAgIEZMRCAoaW5faF9ncl83KSA9IDc7CisgICAgICBGTEQgKGluX2hfZ3JfOCkgPSA4OworICAgICAgRkxEIChpbl9oX2dyXzkpID0gOTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMCkgPSAwOworICAgICAgRkxEIChvdXRfaF9ncl8xKSA9IDE7CisgICAgICBGTEQgKG91dF9oX2dyXzEwKSA9IDEwOworICAgICAgRkxEIChvdXRfaF9ncl8xMSkgPSAxMTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTIpID0gMTI7CisgICAgICBGTEQgKG91dF9oX2dyXzEzKSA9IDEzOworICAgICAgRkxEIChvdXRfaF9ncl8xNCkgPSAxNDsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTUpID0gMTU7CisgICAgICBGTEQgKG91dF9oX2dyXzIpID0gMjsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMykgPSAzOworICAgICAgRkxEIChvdXRfaF9ncl8zMSkgPSAzMTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfNCkgPSA0OworICAgICAgRkxEIChvdXRfaF9ncl81KSA9IDU7CisgICAgICBGTEQgKG91dF9oX2dyXzYpID0gNjsKKyAgICAgIEZMRCAob3V0X2hfZ3JfNykgPSA3OworICAgICAgRkxEIChvdXRfaF9ncl84KSA9IDg7CisgICAgICBGTEQgKG91dF9oX2dyXzkpID0gOTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfUkVUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfcmV0LmYKKyAgRVhUUkFDVF9JRk1UX0JOT19WQVJTIC8qIGYtb3Bjb2RlIGYtY3RybC1kaXNwIGYtY3RybC16ZXJvICovCisKKyAgRVhUUkFDVF9JRk1UX0JOT19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QgKGFidWYpOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9yZXQiLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5faF9ncl8wKSA9IDA7CisgICAgICBGTEQgKGluX2hfZ3JfMikgPSAyOworICAgICAgRkxEIChpbl9oX2dyXzMxKSA9IDMxOworICAgICAgRkxEIChvdXRfaF9ncl8wKSA9IDA7CisgICAgICBGTEQgKG91dF9oX2dyXzEpID0gMTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTApID0gMTA7CisgICAgICBGTEQgKG91dF9oX2dyXzExKSA9IDExOworICAgICAgRkxEIChvdXRfaF9ncl8xMikgPSAxMjsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMTMpID0gMTM7CisgICAgICBGTEQgKG91dF9oX2dyXzE0KSA9IDE0OworICAgICAgRkxEIChvdXRfaF9ncl8xNSkgPSAxNTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfMikgPSAyOworICAgICAgRkxEIChvdXRfaF9ncl8zKSA9IDM7CisgICAgICBGTEQgKG91dF9oX2dyXzMxKSA9IDMxOworICAgICAgRkxEIChvdXRfaF9ncl80KSA9IDQ7CisgICAgICBGTEQgKG91dF9oX2dyXzUpID0gNTsKKyAgICAgIEZMRCAob3V0X2hfZ3JfNikgPSA2OworICAgICAgRkxEIChvdXRfaF9ncl83KSA9IDc7CisgICAgICBGTEQgKG91dF9oX2dyXzgpID0gODsKKyAgICAgIEZMRCAob3V0X2hfZ3JfOSkgPSA5OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9DQUxMUykgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gYmFzZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NhbGxzLmYKKyAgRVhUUkFDVF9JRk1UX01VTE9fVkFSUyAvKiBmLW9wY29kZSBmLXNyY2RzdCBmLXNyYzIgZi1tMyBmLW0yIGYtbTEgZi1vcGNvZGUyIGYtemVybyBmLXNyYzEgKi8KKworICBFWFRSQUNUX0lGTVRfTVVMT19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2Zfc3JjMV07CisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfY2FsbHMiLCAic3JjMSAweCV4IiwgJ3gnLCBmX3NyYzEsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zcmMxKSA9IGZfc3JjMTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfRk1BUkspIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9mbWFyay5mCisgIEVYVFJBQ1RfSUZNVF9NVUxPX1ZBUlMgLyogZi1vcGNvZGUgZi1zcmNkc3QgZi1zcmMyIGYtbTMgZi1tMiBmLW0xIGYtb3Bjb2RlMiBmLXplcm8gZi1zcmMxICovCisKKyAgRVhUUkFDVF9JRk1UX01VTE9fQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfZm1hcmsiLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfRkxVU0hSRUcpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGJhc2VfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZmx1c2hyZWcuZgorICBFWFRSQUNUX0lGTVRfTVVMT19WQVJTIC8qIGYtb3Bjb2RlIGYtc3JjZHN0IGYtc3JjMiBmLW0zIGYtbTIgZi1tMSBmLW9wY29kZTIgZi16ZXJvIGYtc3JjMSAqLworCisgIEVYVFJBQ1RfSUZNVF9NVUxPX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9mbHVzaHJlZyIsIChjaGFyICopIDApKTsKKworI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKworICAgICAgfQorICAgIEVORFNXSVRDSCAoZXgpCisKKyAgfQorCisgIHJldHVybiBpZGVjb2RlLT5pZGVzYzsKK30KZGlmZiAtLWdpdCBhL3NpbS9pOTYwL2RlY29kZS5oIGIvc2ltL2k5NjAvZGVjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzNzIxNwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9pOTYwL2RlY29kZS5oCkBAIC0wLDAgKzEsNDMzIEBACisvKiBEZWNvZGUgaGVhZGVyIGZvciBpOTYwYmFzZS4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2lmbmRlZiBJOTYwQkFTRV9ERUNPREVfSAorI2RlZmluZSBJOTYwQkFTRV9ERUNPREVfSAorCitleHRlcm4gY29uc3QgSURFU0MgKmk5NjBiYXNlX2RlY29kZSAoU0lNX0NQVSAqLCBJQUREUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR0VOX0lOU05fSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSR0JVRiAqKTsKK2V4dGVybiB2b2lkIGk5NjBiYXNlX2luaXRfaWRlc2NfdGFibGUgKFNJTV9DUFUgKik7CisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc3RydWN0aW9ucyBpbiBjcHUgZmFtaWx5IGk5NjBiYXNlLiAgKi8KK3R5cGVkZWYgZW51bSBpOTYwYmFzZV9pbnNuX3R5cGUgeworICBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRCwgSTk2MEJBU0VfSU5TTl9YX0FGVEVSLCBJOTYwQkFTRV9JTlNOX1hfQkVGT1JFLCBJOTYwQkFTRV9JTlNOX1hfQ1RJX0NIQUlOCisgLCBJOTYwQkFTRV9JTlNOX1hfQ0hBSU4sIEk5NjBCQVNFX0lOU05fWF9CRUdJTiwgSTk2MEJBU0VfSU5TTl9NVUxPLCBJOTYwQkFTRV9JTlNOX01VTE8xCisgLCBJOTYwQkFTRV9JTlNOX01VTE8yLCBJOTYwQkFTRV9JTlNOX01VTE8zLCBJOTYwQkFTRV9JTlNOX1JFTU8sIEk5NjBCQVNFX0lOU05fUkVNTzEKKyAsIEk5NjBCQVNFX0lOU05fUkVNTzIsIEk5NjBCQVNFX0lOU05fUkVNTzMsIEk5NjBCQVNFX0lOU05fRElWTywgSTk2MEJBU0VfSU5TTl9ESVZPMQorICwgSTk2MEJBU0VfSU5TTl9ESVZPMiwgSTk2MEJBU0VfSU5TTl9ESVZPMywgSTk2MEJBU0VfSU5TTl9SRU1JLCBJOTYwQkFTRV9JTlNOX1JFTUkxCisgLCBJOTYwQkFTRV9JTlNOX1JFTUkyLCBJOTYwQkFTRV9JTlNOX1JFTUkzLCBJOTYwQkFTRV9JTlNOX0RJVkksIEk5NjBCQVNFX0lOU05fRElWSTEKKyAsIEk5NjBCQVNFX0lOU05fRElWSTIsIEk5NjBCQVNFX0lOU05fRElWSTMsIEk5NjBCQVNFX0lOU05fQURETywgSTk2MEJBU0VfSU5TTl9BRERPMQorICwgSTk2MEJBU0VfSU5TTl9BRERPMiwgSTk2MEJBU0VfSU5TTl9BRERPMywgSTk2MEJBU0VfSU5TTl9TVUJPLCBJOTYwQkFTRV9JTlNOX1NVQk8xCisgLCBJOTYwQkFTRV9JTlNOX1NVQk8yLCBJOTYwQkFTRV9JTlNOX1NVQk8zLCBJOTYwQkFTRV9JTlNOX05PVEJJVCwgSTk2MEJBU0VfSU5TTl9OT1RCSVQxCisgLCBJOTYwQkFTRV9JTlNOX05PVEJJVDIsIEk5NjBCQVNFX0lOU05fTk9UQklUMywgSTk2MEJBU0VfSU5TTl9BTkQsIEk5NjBCQVNFX0lOU05fQU5EMQorICwgSTk2MEJBU0VfSU5TTl9BTkQyLCBJOTYwQkFTRV9JTlNOX0FORDMsIEk5NjBCQVNFX0lOU05fQU5ETk9ULCBJOTYwQkFTRV9JTlNOX0FORE5PVDEKKyAsIEk5NjBCQVNFX0lOU05fQU5ETk9UMiwgSTk2MEJBU0VfSU5TTl9BTkROT1QzLCBJOTYwQkFTRV9JTlNOX1NFVEJJVCwgSTk2MEJBU0VfSU5TTl9TRVRCSVQxCisgLCBJOTYwQkFTRV9JTlNOX1NFVEJJVDIsIEk5NjBCQVNFX0lOU05fU0VUQklUMywgSTk2MEJBU0VfSU5TTl9OT1RBTkQsIEk5NjBCQVNFX0lOU05fTk9UQU5EMQorICwgSTk2MEJBU0VfSU5TTl9OT1RBTkQyLCBJOTYwQkFTRV9JTlNOX05PVEFORDMsIEk5NjBCQVNFX0lOU05fWE9SLCBJOTYwQkFTRV9JTlNOX1hPUjEKKyAsIEk5NjBCQVNFX0lOU05fWE9SMiwgSTk2MEJBU0VfSU5TTl9YT1IzLCBJOTYwQkFTRV9JTlNOX09SLCBJOTYwQkFTRV9JTlNOX09SMQorICwgSTk2MEJBU0VfSU5TTl9PUjIsIEk5NjBCQVNFX0lOU05fT1IzLCBJOTYwQkFTRV9JTlNOX05PUiwgSTk2MEJBU0VfSU5TTl9OT1IxCisgLCBJOTYwQkFTRV9JTlNOX05PUjIsIEk5NjBCQVNFX0lOU05fTk9SMywgSTk2MEJBU0VfSU5TTl9OT1QsIEk5NjBCQVNFX0lOU05fTk9UMQorICwgSTk2MEJBU0VfSU5TTl9OT1QyLCBJOTYwQkFTRV9JTlNOX05PVDMsIEk5NjBCQVNFX0lOU05fQ0xSQklULCBJOTYwQkFTRV9JTlNOX0NMUkJJVDEKKyAsIEk5NjBCQVNFX0lOU05fQ0xSQklUMiwgSTk2MEJBU0VfSU5TTl9DTFJCSVQzLCBJOTYwQkFTRV9JTlNOX1NITE8sIEk5NjBCQVNFX0lOU05fU0hMTzEKKyAsIEk5NjBCQVNFX0lOU05fU0hMTzIsIEk5NjBCQVNFX0lOU05fU0hMTzMsIEk5NjBCQVNFX0lOU05fU0hSTywgSTk2MEJBU0VfSU5TTl9TSFJPMQorICwgSTk2MEJBU0VfSU5TTl9TSFJPMiwgSTk2MEJBU0VfSU5TTl9TSFJPMywgSTk2MEJBU0VfSU5TTl9TSExJLCBJOTYwQkFTRV9JTlNOX1NITEkxCisgLCBJOTYwQkFTRV9JTlNOX1NITEkyLCBJOTYwQkFTRV9JTlNOX1NITEkzLCBJOTYwQkFTRV9JTlNOX1NIUkksIEk5NjBCQVNFX0lOU05fU0hSSTEKKyAsIEk5NjBCQVNFX0lOU05fU0hSSTIsIEk5NjBCQVNFX0lOU05fU0hSSTMsIEk5NjBCQVNFX0lOU05fRU1VTCwgSTk2MEJBU0VfSU5TTl9FTVVMMQorICwgSTk2MEJBU0VfSU5TTl9FTVVMMiwgSTk2MEJBU0VfSU5TTl9FTVVMMywgSTk2MEJBU0VfSU5TTl9NT1YsIEk5NjBCQVNFX0lOU05fTU9WMQorICwgSTk2MEJBU0VfSU5TTl9NT1ZMLCBJOTYwQkFTRV9JTlNOX01PVkwxLCBJOTYwQkFTRV9JTlNOX01PVlQsIEk5NjBCQVNFX0lOU05fTU9WVDEKKyAsIEk5NjBCQVNFX0lOU05fTU9WUSwgSTk2MEJBU0VfSU5TTl9NT1ZRMSwgSTk2MEJBU0VfSU5TTl9NT0RQQywgSTk2MEJBU0VfSU5TTl9NT0RBQworICwgSTk2MEJBU0VfSU5TTl9MREFfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERBX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVF9JTkRFWAorICwgSTk2MEJBU0VfSU5TTl9MREFfRElTUCwgSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9MREFfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1RfSU5ERVhfRElTUAorICwgSTk2MEJBU0VfSU5TTl9MRF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xEX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX0xEX0lORElSRUNUX0lOREVYCisgLCBJOTYwQkFTRV9JTlNOX0xEX0RJU1AsIEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9MRF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xEX0lORElSRUNUX0lOREVYX0RJU1AKKyAsIEk5NjBCQVNFX0lOU05fTERPQl9PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVCwgSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNUX0lOREVYCisgLCBJOTYwQkFTRV9JTlNOX0xET0JfRElTUCwgSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX0lOU05fTERPQl9JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1RfSU5ERVhfRElTUAorICwgSTk2MEJBU0VfSU5TTl9MRE9TX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9MRE9TX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9MRE9TX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfSU5ERVgKKyAsIEk5NjBCQVNFX0lOU05fTERPU19ESVNQLCBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9MRE9TX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVF9JTkRFWF9ESVNQCisgLCBJOTYwQkFTRV9JTlNOX0xESUJfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xESUJfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xESUJfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVF9JTkRFWAorICwgSTk2MEJBU0VfSU5TTl9MRElCX0RJU1AsIEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xESUJfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNUX0lOREVYX0RJU1AKKyAsIEk5NjBCQVNFX0lOU05fTERJU19PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERJU19JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERJU19JTkRJUkVDVCwgSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNUX0lOREVYCisgLCBJOTYwQkFTRV9JTlNOX0xESVNfRElTUCwgSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX0lOU05fTERJU19JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1RfSU5ERVhfRElTUAorICwgSTk2MEJBU0VfSU5TTl9MRExfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERMX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVF9JTkRFWAorICwgSTk2MEJBU0VfSU5TTl9MRExfRElTUCwgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9MRExfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVhfRElTUAorICwgSTk2MEJBU0VfSU5TTl9MRFRfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9JTkRFWAorICwgSTk2MEJBU0VfSU5TTl9MRFRfRElTUCwgSTk2MEJBU0VfSU5TTl9MRFRfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9MRFRfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVhfRElTUAorICwgSTk2MEJBU0VfSU5TTl9MRFFfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVF9JTkRFWAorICwgSTk2MEJBU0VfSU5TTl9MRFFfRElTUCwgSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9MRFFfSU5ERVhfRElTUCwgSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1RfSU5ERVhfRElTUAorICwgSTk2MEJBU0VfSU5TTl9TVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNUX0lOREVYCisgLCBJOTYwQkFTRV9JTlNOX1NUX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9TVF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNUX0lOREVYX0RJU1AKKyAsIEk5NjBCQVNFX0lOU05fU1RPQl9PRkZTRVQsIEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVCwgSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNUX0lOREVYCisgLCBJOTYwQkFTRV9JTlNOX1NUT0JfRElTUCwgSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RPQl9JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ESVJFQ1RfSU5ERVhfRElTUAorICwgSTk2MEJBU0VfSU5TTl9TVE9TX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNULCBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1RfSU5ERVgKKyAsIEk5NjBCQVNFX0lOU05fU1RPU19ESVNQLCBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1RfRElTUCwgSTk2MEJBU0VfSU5TTl9TVE9TX0lOREVYX0RJU1AsIEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVF9JTkRFWF9ESVNQCisgLCBJOTYwQkFTRV9JTlNOX1NUTF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNUX0lOREVYCisgLCBJOTYwQkFTRV9JTlNOX1NUTF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUTF9JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUTF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUTF9JTkRJUkVDVF9JTkRFWF9ESVNQCisgLCBJOTYwQkFTRV9JTlNOX1NUVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNUX0lOREVYCisgLCBJOTYwQkFTRV9JTlNOX1NUVF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUVF9JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUVF9JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUVF9JTkRJUkVDVF9JTkRFWF9ESVNQCisgLCBJOTYwQkFTRV9JTlNOX1NUUV9PRkZTRVQsIEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9TVFFfSU5ESVJFQ1QsIEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNUX0lOREVYCisgLCBJOTYwQkFTRV9JTlNOX1NUUV9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUUV9JTkRFWF9ESVNQLCBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVF9JTkRFWF9ESVNQCisgLCBJOTYwQkFTRV9JTlNOX0NNUE9CRV9SRUcsIEk5NjBCQVNFX0lOU05fQ01QT0JFX0xJVCwgSTk2MEJBU0VfSU5TTl9DTVBPQk5FX1JFRywgSTk2MEJBU0VfSU5TTl9DTVBPQk5FX0xJVAorICwgSTk2MEJBU0VfSU5TTl9DTVBPQkxfUkVHLCBJOTYwQkFTRV9JTlNOX0NNUE9CTF9MSVQsIEk5NjBCQVNFX0lOU05fQ01QT0JMRV9SRUcsIEk5NjBCQVNFX0lOU05fQ01QT0JMRV9MSVQKKyAsIEk5NjBCQVNFX0lOU05fQ01QT0JHX1JFRywgSTk2MEJBU0VfSU5TTl9DTVBPQkdfTElULCBJOTYwQkFTRV9JTlNOX0NNUE9CR0VfUkVHLCBJOTYwQkFTRV9JTlNOX0NNUE9CR0VfTElUCisgLCBJOTYwQkFTRV9JTlNOX0NNUElCRV9SRUcsIEk5NjBCQVNFX0lOU05fQ01QSUJFX0xJVCwgSTk2MEJBU0VfSU5TTl9DTVBJQk5FX1JFRywgSTk2MEJBU0VfSU5TTl9DTVBJQk5FX0xJVAorICwgSTk2MEJBU0VfSU5TTl9DTVBJQkxfUkVHLCBJOTYwQkFTRV9JTlNOX0NNUElCTF9MSVQsIEk5NjBCQVNFX0lOU05fQ01QSUJMRV9SRUcsIEk5NjBCQVNFX0lOU05fQ01QSUJMRV9MSVQKKyAsIEk5NjBCQVNFX0lOU05fQ01QSUJHX1JFRywgSTk2MEJBU0VfSU5TTl9DTVBJQkdfTElULCBJOTYwQkFTRV9JTlNOX0NNUElCR0VfUkVHLCBJOTYwQkFTRV9JTlNOX0NNUElCR0VfTElUCisgLCBJOTYwQkFTRV9JTlNOX0JCQ19SRUcsIEk5NjBCQVNFX0lOU05fQkJDX0xJVCwgSTk2MEJBU0VfSU5TTl9CQlNfUkVHLCBJOTYwQkFTRV9JTlNOX0JCU19MSVQKKyAsIEk5NjBCQVNFX0lOU05fQ01QSSwgSTk2MEJBU0VfSU5TTl9DTVBJMSwgSTk2MEJBU0VfSU5TTl9DTVBJMiwgSTk2MEJBU0VfSU5TTl9DTVBJMworICwgSTk2MEJBU0VfSU5TTl9DTVBPLCBJOTYwQkFTRV9JTlNOX0NNUE8xLCBJOTYwQkFTRV9JTlNOX0NNUE8yLCBJOTYwQkFTRV9JTlNOX0NNUE8zCisgLCBJOTYwQkFTRV9JTlNOX1RFU1ROT19SRUcsIEk5NjBCQVNFX0lOU05fVEVTVEdfUkVHLCBJOTYwQkFTRV9JTlNOX1RFU1RFX1JFRywgSTk2MEJBU0VfSU5TTl9URVNUR0VfUkVHCisgLCBJOTYwQkFTRV9JTlNOX1RFU1RMX1JFRywgSTk2MEJBU0VfSU5TTl9URVNUTkVfUkVHLCBJOTYwQkFTRV9JTlNOX1RFU1RMRV9SRUcsIEk5NjBCQVNFX0lOU05fVEVTVE9fUkVHCisgLCBJOTYwQkFTRV9JTlNOX0JOTywgSTk2MEJBU0VfSU5TTl9CRywgSTk2MEJBU0VfSU5TTl9CRSwgSTk2MEJBU0VfSU5TTl9CR0UKKyAsIEk5NjBCQVNFX0lOU05fQkwsIEk5NjBCQVNFX0lOU05fQk5FLCBJOTYwQkFTRV9JTlNOX0JMRSwgSTk2MEJBU0VfSU5TTl9CTworICwgSTk2MEJBU0VfSU5TTl9CLCBJOTYwQkFTRV9JTlNOX0JYX0lORElSRUNUX09GRlNFVCwgSTk2MEJBU0VfSU5TTl9CWF9JTkRJUkVDVCwgSTk2MEJBU0VfSU5TTl9CWF9JTkRJUkVDVF9JTkRFWAorICwgSTk2MEJBU0VfSU5TTl9CWF9ESVNQLCBJOTYwQkFTRV9JTlNOX0JYX0lORElSRUNUX0RJU1AsIEk5NjBCQVNFX0lOU05fQ0FMTFhfRElTUCwgSTk2MEJBU0VfSU5TTl9DQUxMWF9JTkRJUkVDVAorICwgSTk2MEJBU0VfSU5TTl9DQUxMWF9JTkRJUkVDVF9PRkZTRVQsIEk5NjBCQVNFX0lOU05fUkVULCBJOTYwQkFTRV9JTlNOX0NBTExTLCBJOTYwQkFTRV9JTlNOX0ZNQVJLCisgLCBJOTYwQkFTRV9JTlNOX0ZMVVNIUkVHLCBJOTYwQkFTRV9JTlNOX01BWAorfSBJOTYwQkFTRV9JTlNOX1RZUEU7CisKKyNpZiAhIFdJVEhfU0VNX1NXSVRDSF9GVUxMCisjZGVmaW5lIFNFTUZVTEwoZm4pIGV4dGVybiBTRU1BTlRJQ19GTiBDT05DQVQzIChpOTYwYmFzZSxfc2VtXyxmbik7CisjZWxzZQorI2RlZmluZSBTRU1GVUxMKGZuKQorI2VuZGlmCisKKyNpZiAhIFdJVEhfU0VNX1NXSVRDSF9GQVNUCisjZGVmaW5lIFNFTUZBU1QoZm4pIGV4dGVybiBTRU1BTlRJQ19GTiBDT05DQVQzIChpOTYwYmFzZSxfc2VtZl8sZm4pOworI2Vsc2UKKyNkZWZpbmUgU0VNRkFTVChmbikKKyNlbmRpZgorCisjZGVmaW5lIFNFTShmbikgU0VNRlVMTCAoZm4pIFNFTUZBU1QgKGZuKQorCisvKiBUaGUgZnVuY3Rpb24gdmVyc2lvbiBvZiB0aGUgYmVmb3JlL2FmdGVyIGhhbmRsZXJzIGlzIGFsd2F5cyBuZWVkZWQsCisgICBzbyB3ZSBhbHdheXMgd2FudCB0aGUgU0VNRlVMTCBkZWNsYXJhdGlvbiBvZiB0aGVtLiAgKi8KK2V4dGVybiBTRU1BTlRJQ19GTiBDT05DQVQzIChpOTYwYmFzZSxfc2VtXyx4X2JlZm9yZSk7CitleHRlcm4gU0VNQU5USUNfRk4gQ09OQ0FUMyAoaTk2MGJhc2UsX3NlbV8seF9hZnRlcik7CisKK1NFTSAoeF9pbnZhbGlkKQorU0VNICh4X2FmdGVyKQorU0VNICh4X2JlZm9yZSkKK1NFTSAoeF9jdGlfY2hhaW4pCitTRU0gKHhfY2hhaW4pCitTRU0gKHhfYmVnaW4pCitTRU0gKG11bG8pCitTRU0gKG11bG8xKQorU0VNIChtdWxvMikKK1NFTSAobXVsbzMpCitTRU0gKHJlbW8pCitTRU0gKHJlbW8xKQorU0VNIChyZW1vMikKK1NFTSAocmVtbzMpCitTRU0gKGRpdm8pCitTRU0gKGRpdm8xKQorU0VNIChkaXZvMikKK1NFTSAoZGl2bzMpCitTRU0gKHJlbWkpCitTRU0gKHJlbWkxKQorU0VNIChyZW1pMikKK1NFTSAocmVtaTMpCitTRU0gKGRpdmkpCitTRU0gKGRpdmkxKQorU0VNIChkaXZpMikKK1NFTSAoZGl2aTMpCitTRU0gKGFkZG8pCitTRU0gKGFkZG8xKQorU0VNIChhZGRvMikKK1NFTSAoYWRkbzMpCitTRU0gKHN1Ym8pCitTRU0gKHN1Ym8xKQorU0VNIChzdWJvMikKK1NFTSAoc3VibzMpCitTRU0gKG5vdGJpdCkKK1NFTSAobm90Yml0MSkKK1NFTSAobm90Yml0MikKK1NFTSAobm90Yml0MykKK1NFTSAoYW5kKQorU0VNIChhbmQxKQorU0VNIChhbmQyKQorU0VNIChhbmQzKQorU0VNIChhbmRub3QpCitTRU0gKGFuZG5vdDEpCitTRU0gKGFuZG5vdDIpCitTRU0gKGFuZG5vdDMpCitTRU0gKHNldGJpdCkKK1NFTSAoc2V0Yml0MSkKK1NFTSAoc2V0Yml0MikKK1NFTSAoc2V0Yml0MykKK1NFTSAobm90YW5kKQorU0VNIChub3RhbmQxKQorU0VNIChub3RhbmQyKQorU0VNIChub3RhbmQzKQorU0VNICh4b3IpCitTRU0gKHhvcjEpCitTRU0gKHhvcjIpCitTRU0gKHhvcjMpCitTRU0gKG9yKQorU0VNIChvcjEpCitTRU0gKG9yMikKK1NFTSAob3IzKQorU0VNIChub3IpCitTRU0gKG5vcjEpCitTRU0gKG5vcjIpCitTRU0gKG5vcjMpCitTRU0gKG5vdCkKK1NFTSAobm90MSkKK1NFTSAobm90MikKK1NFTSAobm90MykKK1NFTSAoY2xyYml0KQorU0VNIChjbHJiaXQxKQorU0VNIChjbHJiaXQyKQorU0VNIChjbHJiaXQzKQorU0VNIChzaGxvKQorU0VNIChzaGxvMSkKK1NFTSAoc2hsbzIpCitTRU0gKHNobG8zKQorU0VNIChzaHJvKQorU0VNIChzaHJvMSkKK1NFTSAoc2hybzIpCitTRU0gKHNocm8zKQorU0VNIChzaGxpKQorU0VNIChzaGxpMSkKK1NFTSAoc2hsaTIpCitTRU0gKHNobGkzKQorU0VNIChzaHJpKQorU0VNIChzaHJpMSkKK1NFTSAoc2hyaTIpCitTRU0gKHNocmkzKQorU0VNIChlbXVsKQorU0VNIChlbXVsMSkKK1NFTSAoZW11bDIpCitTRU0gKGVtdWwzKQorU0VNIChtb3YpCitTRU0gKG1vdjEpCitTRU0gKG1vdmwpCitTRU0gKG1vdmwxKQorU0VNIChtb3Z0KQorU0VNIChtb3Z0MSkKK1NFTSAobW92cSkKK1NFTSAobW92cTEpCitTRU0gKG1vZHBjKQorU0VNIChtb2RhYykKK1NFTSAobGRhX29mZnNldCkKK1NFTSAobGRhX2luZGlyZWN0X29mZnNldCkKK1NFTSAobGRhX2luZGlyZWN0KQorU0VNIChsZGFfaW5kaXJlY3RfaW5kZXgpCitTRU0gKGxkYV9kaXNwKQorU0VNIChsZGFfaW5kaXJlY3RfZGlzcCkKK1NFTSAobGRhX2luZGV4X2Rpc3ApCitTRU0gKGxkYV9pbmRpcmVjdF9pbmRleF9kaXNwKQorU0VNIChsZF9vZmZzZXQpCitTRU0gKGxkX2luZGlyZWN0X29mZnNldCkKK1NFTSAobGRfaW5kaXJlY3QpCitTRU0gKGxkX2luZGlyZWN0X2luZGV4KQorU0VNIChsZF9kaXNwKQorU0VNIChsZF9pbmRpcmVjdF9kaXNwKQorU0VNIChsZF9pbmRleF9kaXNwKQorU0VNIChsZF9pbmRpcmVjdF9pbmRleF9kaXNwKQorU0VNIChsZG9iX29mZnNldCkKK1NFTSAobGRvYl9pbmRpcmVjdF9vZmZzZXQpCitTRU0gKGxkb2JfaW5kaXJlY3QpCitTRU0gKGxkb2JfaW5kaXJlY3RfaW5kZXgpCitTRU0gKGxkb2JfZGlzcCkKK1NFTSAobGRvYl9pbmRpcmVjdF9kaXNwKQorU0VNIChsZG9iX2luZGV4X2Rpc3ApCitTRU0gKGxkb2JfaW5kaXJlY3RfaW5kZXhfZGlzcCkKK1NFTSAobGRvc19vZmZzZXQpCitTRU0gKGxkb3NfaW5kaXJlY3Rfb2Zmc2V0KQorU0VNIChsZG9zX2luZGlyZWN0KQorU0VNIChsZG9zX2luZGlyZWN0X2luZGV4KQorU0VNIChsZG9zX2Rpc3ApCitTRU0gKGxkb3NfaW5kaXJlY3RfZGlzcCkKK1NFTSAobGRvc19pbmRleF9kaXNwKQorU0VNIChsZG9zX2luZGlyZWN0X2luZGV4X2Rpc3ApCitTRU0gKGxkaWJfb2Zmc2V0KQorU0VNIChsZGliX2luZGlyZWN0X29mZnNldCkKK1NFTSAobGRpYl9pbmRpcmVjdCkKK1NFTSAobGRpYl9pbmRpcmVjdF9pbmRleCkKK1NFTSAobGRpYl9kaXNwKQorU0VNIChsZGliX2luZGlyZWN0X2Rpc3ApCitTRU0gKGxkaWJfaW5kZXhfZGlzcCkKK1NFTSAobGRpYl9pbmRpcmVjdF9pbmRleF9kaXNwKQorU0VNIChsZGlzX29mZnNldCkKK1NFTSAobGRpc19pbmRpcmVjdF9vZmZzZXQpCitTRU0gKGxkaXNfaW5kaXJlY3QpCitTRU0gKGxkaXNfaW5kaXJlY3RfaW5kZXgpCitTRU0gKGxkaXNfZGlzcCkKK1NFTSAobGRpc19pbmRpcmVjdF9kaXNwKQorU0VNIChsZGlzX2luZGV4X2Rpc3ApCitTRU0gKGxkaXNfaW5kaXJlY3RfaW5kZXhfZGlzcCkKK1NFTSAobGRsX29mZnNldCkKK1NFTSAobGRsX2luZGlyZWN0X29mZnNldCkKK1NFTSAobGRsX2luZGlyZWN0KQorU0VNIChsZGxfaW5kaXJlY3RfaW5kZXgpCitTRU0gKGxkbF9kaXNwKQorU0VNIChsZGxfaW5kaXJlY3RfZGlzcCkKK1NFTSAobGRsX2luZGV4X2Rpc3ApCitTRU0gKGxkbF9pbmRpcmVjdF9pbmRleF9kaXNwKQorU0VNIChsZHRfb2Zmc2V0KQorU0VNIChsZHRfaW5kaXJlY3Rfb2Zmc2V0KQorU0VNIChsZHRfaW5kaXJlY3QpCitTRU0gKGxkdF9pbmRpcmVjdF9pbmRleCkKK1NFTSAobGR0X2Rpc3ApCitTRU0gKGxkdF9pbmRpcmVjdF9kaXNwKQorU0VNIChsZHRfaW5kZXhfZGlzcCkKK1NFTSAobGR0X2luZGlyZWN0X2luZGV4X2Rpc3ApCitTRU0gKGxkcV9vZmZzZXQpCitTRU0gKGxkcV9pbmRpcmVjdF9vZmZzZXQpCitTRU0gKGxkcV9pbmRpcmVjdCkKK1NFTSAobGRxX2luZGlyZWN0X2luZGV4KQorU0VNIChsZHFfZGlzcCkKK1NFTSAobGRxX2luZGlyZWN0X2Rpc3ApCitTRU0gKGxkcV9pbmRleF9kaXNwKQorU0VNIChsZHFfaW5kaXJlY3RfaW5kZXhfZGlzcCkKK1NFTSAoc3Rfb2Zmc2V0KQorU0VNIChzdF9pbmRpcmVjdF9vZmZzZXQpCitTRU0gKHN0X2luZGlyZWN0KQorU0VNIChzdF9pbmRpcmVjdF9pbmRleCkKK1NFTSAoc3RfZGlzcCkKK1NFTSAoc3RfaW5kaXJlY3RfZGlzcCkKK1NFTSAoc3RfaW5kZXhfZGlzcCkKK1NFTSAoc3RfaW5kaXJlY3RfaW5kZXhfZGlzcCkKK1NFTSAoc3RvYl9vZmZzZXQpCitTRU0gKHN0b2JfaW5kaXJlY3Rfb2Zmc2V0KQorU0VNIChzdG9iX2luZGlyZWN0KQorU0VNIChzdG9iX2luZGlyZWN0X2luZGV4KQorU0VNIChzdG9iX2Rpc3ApCitTRU0gKHN0b2JfaW5kaXJlY3RfZGlzcCkKK1NFTSAoc3RvYl9pbmRleF9kaXNwKQorU0VNIChzdG9iX2luZGlyZWN0X2luZGV4X2Rpc3ApCitTRU0gKHN0b3Nfb2Zmc2V0KQorU0VNIChzdG9zX2luZGlyZWN0X29mZnNldCkKK1NFTSAoc3Rvc19pbmRpcmVjdCkKK1NFTSAoc3Rvc19pbmRpcmVjdF9pbmRleCkKK1NFTSAoc3Rvc19kaXNwKQorU0VNIChzdG9zX2luZGlyZWN0X2Rpc3ApCitTRU0gKHN0b3NfaW5kZXhfZGlzcCkKK1NFTSAoc3Rvc19pbmRpcmVjdF9pbmRleF9kaXNwKQorU0VNIChzdGxfb2Zmc2V0KQorU0VNIChzdGxfaW5kaXJlY3Rfb2Zmc2V0KQorU0VNIChzdGxfaW5kaXJlY3QpCitTRU0gKHN0bF9pbmRpcmVjdF9pbmRleCkKK1NFTSAoc3RsX2Rpc3ApCitTRU0gKHN0bF9pbmRpcmVjdF9kaXNwKQorU0VNIChzdGxfaW5kZXhfZGlzcCkKK1NFTSAoc3RsX2luZGlyZWN0X2luZGV4X2Rpc3ApCitTRU0gKHN0dF9vZmZzZXQpCitTRU0gKHN0dF9pbmRpcmVjdF9vZmZzZXQpCitTRU0gKHN0dF9pbmRpcmVjdCkKK1NFTSAoc3R0X2luZGlyZWN0X2luZGV4KQorU0VNIChzdHRfZGlzcCkKK1NFTSAoc3R0X2luZGlyZWN0X2Rpc3ApCitTRU0gKHN0dF9pbmRleF9kaXNwKQorU0VNIChzdHRfaW5kaXJlY3RfaW5kZXhfZGlzcCkKK1NFTSAoc3RxX29mZnNldCkKK1NFTSAoc3RxX2luZGlyZWN0X29mZnNldCkKK1NFTSAoc3RxX2luZGlyZWN0KQorU0VNIChzdHFfaW5kaXJlY3RfaW5kZXgpCitTRU0gKHN0cV9kaXNwKQorU0VNIChzdHFfaW5kaXJlY3RfZGlzcCkKK1NFTSAoc3RxX2luZGV4X2Rpc3ApCitTRU0gKHN0cV9pbmRpcmVjdF9pbmRleF9kaXNwKQorU0VNIChjbXBvYmVfcmVnKQorU0VNIChjbXBvYmVfbGl0KQorU0VNIChjbXBvYm5lX3JlZykKK1NFTSAoY21wb2JuZV9saXQpCitTRU0gKGNtcG9ibF9yZWcpCitTRU0gKGNtcG9ibF9saXQpCitTRU0gKGNtcG9ibGVfcmVnKQorU0VNIChjbXBvYmxlX2xpdCkKK1NFTSAoY21wb2JnX3JlZykKK1NFTSAoY21wb2JnX2xpdCkKK1NFTSAoY21wb2JnZV9yZWcpCitTRU0gKGNtcG9iZ2VfbGl0KQorU0VNIChjbXBpYmVfcmVnKQorU0VNIChjbXBpYmVfbGl0KQorU0VNIChjbXBpYm5lX3JlZykKK1NFTSAoY21waWJuZV9saXQpCitTRU0gKGNtcGlibF9yZWcpCitTRU0gKGNtcGlibF9saXQpCitTRU0gKGNtcGlibGVfcmVnKQorU0VNIChjbXBpYmxlX2xpdCkKK1NFTSAoY21waWJnX3JlZykKK1NFTSAoY21waWJnX2xpdCkKK1NFTSAoY21waWJnZV9yZWcpCitTRU0gKGNtcGliZ2VfbGl0KQorU0VNIChiYmNfcmVnKQorU0VNIChiYmNfbGl0KQorU0VNIChiYnNfcmVnKQorU0VNIChiYnNfbGl0KQorU0VNIChjbXBpKQorU0VNIChjbXBpMSkKK1NFTSAoY21waTIpCitTRU0gKGNtcGkzKQorU0VNIChjbXBvKQorU0VNIChjbXBvMSkKK1NFTSAoY21wbzIpCitTRU0gKGNtcG8zKQorU0VNICh0ZXN0bm9fcmVnKQorU0VNICh0ZXN0Z19yZWcpCitTRU0gKHRlc3RlX3JlZykKK1NFTSAodGVzdGdlX3JlZykKK1NFTSAodGVzdGxfcmVnKQorU0VNICh0ZXN0bmVfcmVnKQorU0VNICh0ZXN0bGVfcmVnKQorU0VNICh0ZXN0b19yZWcpCitTRU0gKGJubykKK1NFTSAoYmcpCitTRU0gKGJlKQorU0VNIChiZ2UpCitTRU0gKGJsKQorU0VNIChibmUpCitTRU0gKGJsZSkKK1NFTSAoYm8pCitTRU0gKGIpCitTRU0gKGJ4X2luZGlyZWN0X29mZnNldCkKK1NFTSAoYnhfaW5kaXJlY3QpCitTRU0gKGJ4X2luZGlyZWN0X2luZGV4KQorU0VNIChieF9kaXNwKQorU0VNIChieF9pbmRpcmVjdF9kaXNwKQorU0VNIChjYWxseF9kaXNwKQorU0VNIChjYWxseF9pbmRpcmVjdCkKK1NFTSAoY2FsbHhfaW5kaXJlY3Rfb2Zmc2V0KQorU0VNIChyZXQpCitTRU0gKGNhbGxzKQorU0VNIChmbWFyaykKK1NFTSAoZmx1c2hyZWcpCisKKyN1bmRlZiBTRU1GVUxMCisjdW5kZWYgU0VNRkFTVAorI3VuZGVmIFNFTQorCisvKiBGdW5jdGlvbiB1bml0IGhhbmRsZXJzICh1c2VyIHdyaXR0ZW4pLiAgKi8KKworZXh0ZXJuIGludCBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChTSU1fQ1BVICosIGNvbnN0IElERVNDICosIGludCAvKnVuaXRfbnVtKi8sIGludCAvKnJlZmVyZW5jZWQqLyk7CitleHRlcm4gaW50IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKFNJTV9DUFUgKiwgY29uc3QgSURFU0MgKiwgaW50IC8qdW5pdF9udW0qLywgaW50IC8qcmVmZXJlbmNlZCovKTsKKworLyogUHJvZmlsaW5nIGJlZm9yZS9hZnRlciBoYW5kbGVycyAodXNlciB3cml0dGVuKSAqLworCitleHRlcm4gdm9pZCBpOTYwYmFzZV9tb2RlbF9pbnNuX2JlZm9yZSAoU0lNX0NQVSAqLCBpbnQgLypmaXJzdF9wKi8pOworZXh0ZXJuIHZvaWQgaTk2MGJhc2VfbW9kZWxfaW5zbl9hZnRlciAoU0lNX0NQVSAqLCBpbnQgLypsYXN0X3AqLywgaW50IC8qY3ljbGVzKi8pOworCisjZW5kaWYgLyogSTk2MEJBU0VfREVDT0RFX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9pOTYwL2RldmljZXMuYyBiL3NpbS9pOTYwL2RldmljZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzRlNjcyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2k5NjAvZGV2aWNlcy5jCkBAIC0wLDAgKzEsMTA4IEBACisvKiBpOTYwIGRldmljZSBzdXBwb3J0CisgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorCisjaWZkZWYgSEFWRV9EVl9TT0NLU0VSCisjaW5jbHVkZSAiZHYtc29ja3Nlci5oIgorI2VuZGlmCisKKy8qIEhhbmRsaW5nIHRoZSBNU1BSIHJlZ2lzdGVyIGlzIGRvbmUgYnkgY3JlYXRpbmcgYSBkZXZpY2UgaW4gdGhlIGNvcmUKKyAgIG1hcHBpbmcgdGhhdCB3aW5kcyB1cCBoZXJlLiAgKi8KKworZGV2aWNlIGk5NjBfZGV2aWNlczsKKworaW50CitkZXZpY2VfaW9fcmVhZF9idWZmZXIgKGRldmljZSAqbWUsIHZvaWQgKnNvdXJjZSwgaW50IHNwYWNlLAorCQkgICAgICAgYWRkcmVzc193b3JkIGFkZHIsIHVuc2lnbmVkIG5yX2J5dGVzLAorCQkgICAgICAgU0lNX0NQVSAqY3B1LCBzaW1fY2lhIGNpYSkKK3sKKyAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7CisKKyAgaWYgKFNUQVRFX0VOVklST05NRU5UIChzZCkgIT0gT1BFUkFUSU5HX0VOVklST05NRU5UKQorICAgIHJldHVybiBucl9ieXRlczsKKworI2lmZGVmIEhBVkVfRFZfU09DS1NFUgorICBpZiAoYWRkciA9PSBVQVJUX0lOQ0hBUl9BRERSKQorICAgIHsKKyAgICAgIGludCBjID0gZHZfc29ja3Nlcl9yZWFkIChzZCk7CisgICAgICBpZiAoYyA9PSAtMSkKKwlyZXR1cm4gMDsKKyAgICAgICooY2hhciAqKSBzb3VyY2UgPSBjOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBpZiAoYWRkciA9PSBVQVJUX1NUQVRVU19BRERSKQorICAgIHsKKyAgICAgIGludCBzdGF0dXMgPSBkdl9zb2Nrc2VyX3N0YXR1cyAoc2QpOworICAgICAgdW5zaWduZWQgY2hhciAqcCA9IHNvdXJjZTsKKyAgICAgIHBbMF0gPSAwOworICAgICAgcFsxXSA9ICgoKHN0YXR1cyAmIERWX1NPQ0tTRVJfSU5QVVRfRU1QVFkpCisjaWZkZWYgVUFSVF9JTlBVVF9SRUFEWTAKKwkgICAgICAgPyBVQVJUX0lOUFVUX1JFQURZIDogMCkKKyNlbHNlCisJICAgICAgID8gMCA6IFVBUlRfSU5QVVRfUkVBRFkpCisjZW5kaWYKKwkgICAgICArICgoc3RhdHVzICYgRFZfU09DS1NFUl9PVVRQVVRfRU1QVFkpID8gVUFSVF9PVVRQVVRfUkVBRFkgOiAwKSk7CisgICAgICByZXR1cm4gMjsKKyAgICB9CisjZW5kaWYKKworICByZXR1cm4gbnJfYnl0ZXM7Cit9CisKK2ludAorZGV2aWNlX2lvX3dyaXRlX2J1ZmZlciAoZGV2aWNlICptZSwgY29uc3Qgdm9pZCAqc291cmNlLCBpbnQgc3BhY2UsCisJCQlhZGRyZXNzX3dvcmQgYWRkciwgdW5zaWduZWQgbnJfYnl0ZXMsCisJCQlTSU1fQ1BVICpjcHUsIHNpbV9jaWEgY2lhKQoreworICBTSU1fREVTQyBzZCA9IENQVV9TVEFURSAoY3B1KTsKKworI2lmIFdJVEhfU0NBQ0hFCisgIC8qIE1TUFIgc3VwcG9ydCBpcyBkZXByZWNhdGVkIGJ1dCBpcyBrZXB0IGluIGZvciB1cHdhcmQgY29tcGF0aWJpbGl0eQorICAgICB3aXRoIGV4aXN0aW5nIG92ZXJsYXkgc3VwcG9ydC4gICovCisgIGlmIChhZGRyID09IE1TUFJfQUREUikKKyAgICB7CisgICAgICBpZiAoKCooY29uc3QgY2hhciAqKSBzb3VyY2UgJiBNU1BSX1BVUkdFKSAhPSAwKQorCXNjYWNoZV9mbHVzaCAoc2QpOworICAgICAgcmV0dXJuIG5yX2J5dGVzOworICAgIH0KKyAgaWYgKGFkZHIgPT0gTUNDUl9BRERSKQorICAgIHsKKyAgICAgIGlmICgoKihjb25zdCBjaGFyICopIHNvdXJjZSAmIE1DQ1JfQ1ApICE9IDApCisJc2NhY2hlX2ZsdXNoIChzZCk7CisgICAgICByZXR1cm4gbnJfYnl0ZXM7CisgICAgfQorI2VuZGlmCisKKyAgaWYgKFNUQVRFX0VOVklST05NRU5UIChzZCkgIT0gT1BFUkFUSU5HX0VOVklST05NRU5UKQorICAgIHJldHVybiBucl9ieXRlczsKKworI2lmIEhBVkVfRFZfU09DS1NFUgorICBpZiAoYWRkciA9PSBVQVJUX09VVENIQVJfQUREUikKKyAgICB7CisgICAgICBpbnQgcmMgPSBkdl9zb2Nrc2VyX3dyaXRlIChzZCwgKihjaGFyICopIHNvdXJjZSk7CisgICAgICByZXR1cm4gcmMgPT0gMTsKKyAgICB9CisjZW5kaWYKKworICByZXR1cm4gbnJfYnl0ZXM7Cit9CisKK3ZvaWQgZGV2aWNlX2Vycm9yICgpIHt9CmRpZmYgLS1naXQgYS9zaW0vaTk2MC9pOTYwLWRlc2MuYyBiL3NpbS9pOTYwL2k5NjAtZGVzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYThmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaTk2MC9pOTYwLWRlc2MuYwpAQCAtMCwwICsxLDE3ODQgQEAKKy8qIENQVSBkYXRhIGZvciBpOTYwLgorCitUSElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgorCitDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisqLworCisjaW5jbHVkZSAic3lzZGVwLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAic3ltY2F0LmgiCisjaW5jbHVkZSAiaTk2MC1kZXNjLmgiCisjaW5jbHVkZSAiaTk2MC1vcGMuaCIKKyNpbmNsdWRlICJvcGludGwuaCIKKworLyogQXR0cmlidXRlcy4gICovCisKK3N0YXRpYyBjb25zdCBDR0VOX0FUVFJfRU5UUlkgYm9vbF9hdHRyW10gPQoreworICB7ICIjZiIsIDAgfSwKKyAgeyAiI3QiLCAxIH0sCisgIHsgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3QgQ0dFTl9BVFRSX0VOVFJZIE1BQ0hfYXR0cltdID0KK3sKKyAgeyAiYmFzZSIsIE1BQ0hfQkFTRSB9LAorICB7ICJpOTYwX2thX3NhIiwgTUFDSF9JOTYwX0tBX1NBIH0sCisgIHsgImk5NjBfY2EiLCBNQUNIX0k5NjBfQ0EgfSwKKyAgeyAibWF4IiwgTUFDSF9NQVggfSwKKyAgeyAwLCAwIH0KK307CisKK2NvbnN0IENHRU5fQVRUUl9UQUJMRSBpOTYwX2NnZW5faWZpZWxkX2F0dHJfdGFibGVbXSA9Cit7CisgIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAorICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJVTlNJR05FRCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiUENSRUwtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiQUJTLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlJFU0VSVkVEIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJTSUdOLU9QVCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAwLCAwLCAwIH0KK307CisKK2NvbnN0IENHRU5fQVRUUl9UQUJMRSBpOTYwX2NnZW5faGFyZHdhcmVfYXR0cl90YWJsZVtdID0KK3sKKyAgeyAiTUFDSCIsICYgTUFDSF9hdHRyWzBdIH0sCisgIHsgIlZJUlRVQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlVOU0lHTkVEIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJTSUdORUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIkNBQ0hFLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIkZVTi1BQ0NFU1MiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlBDIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJQUk9GSUxFIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7IDAsIDAsIDAgfQorfTsKKworY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGk5NjBfY2dlbl9vcGVyYW5kX2F0dHJfdGFibGVbXSA9Cit7CisgIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAorICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJVTlNJR05FRCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiUENSRUwtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiQUJTLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlNJR04tT1BUIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJORUdBVElWRSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiUkVMQVgiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlNFTS1PTkxZIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7IDAsIDAsIDAgfQorfTsKKworY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGk5NjBfY2dlbl9pbnNuX2F0dHJfdGFibGVbXSA9Cit7CisgIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAorICB7ICJBTElBUyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiVU5DT05ELUNUSSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAiQ09ORC1DVEkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlNLSVAtQ1RJIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJERUxBWS1TTE9UIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJSRUxBWEFCTEUiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlJFTEFYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAorICB7ICJOTy1ESVMiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCisgIHsgIlBCQiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKKyAgeyAwLCAwLCAwIH0KK307CisKK0NHRU5fS0VZV09SRF9FTlRSWSBpOTYwX2NnZW5fb3B2YWxfaF9ncl9lbnRyaWVzW10gPSAKK3sKKyAgeyAiZnAiLCAzMSB9LAorICB7ICJzcCIsIDEgfSwKKyAgeyAicjAiLCAwIH0sCisgIHsgInIxIiwgMSB9LAorICB7ICJyMiIsIDIgfSwKKyAgeyAicjMiLCAzIH0sCisgIHsgInI0IiwgNCB9LAorICB7ICJyNSIsIDUgfSwKKyAgeyAicjYiLCA2IH0sCisgIHsgInI3IiwgNyB9LAorICB7ICJyOCIsIDggfSwKKyAgeyAicjkiLCA5IH0sCisgIHsgInIxMCIsIDEwIH0sCisgIHsgInIxMSIsIDExIH0sCisgIHsgInIxMiIsIDEyIH0sCisgIHsgInIxMyIsIDEzIH0sCisgIHsgInIxNCIsIDE0IH0sCisgIHsgInIxNSIsIDE1IH0sCisgIHsgImcwIiwgMTYgfSwKKyAgeyAiZzEiLCAxNyB9LAorICB7ICJnMiIsIDE4IH0sCisgIHsgImczIiwgMTkgfSwKKyAgeyAiZzQiLCAyMCB9LAorICB7ICJnNSIsIDIxIH0sCisgIHsgImc2IiwgMjIgfSwKKyAgeyAiZzciLCAyMyB9LAorICB7ICJnOCIsIDI0IH0sCisgIHsgImc5IiwgMjUgfSwKKyAgeyAiZzEwIiwgMjYgfSwKKyAgeyAiZzExIiwgMjcgfSwKKyAgeyAiZzEyIiwgMjggfSwKKyAgeyAiZzEzIiwgMjkgfSwKKyAgeyAiZzE0IiwgMzAgfSwKKyAgeyAiZzE1IiwgMzEgfQorfTsKKworQ0dFTl9LRVlXT1JEIGk5NjBfY2dlbl9vcHZhbF9oX2dyID0gCit7CisgICYgaTk2MF9jZ2VuX29wdmFsX2hfZ3JfZW50cmllc1swXSwKKyAgMzQKK307CisKK0NHRU5fS0VZV09SRF9FTlRSWSBpOTYwX2NnZW5fb3B2YWxfaF9jY19lbnRyaWVzW10gPSAKK3sKKyAgeyAiY2MiLCAwIH0KK307CisKK0NHRU5fS0VZV09SRCBpOTYwX2NnZW5fb3B2YWxfaF9jYyA9IAoreworICAmIGk5NjBfY2dlbl9vcHZhbF9oX2NjX2VudHJpZXNbMF0sCisgIDEKK307CisKKworCisvKiBUaGUgaGFyZHdhcmUgdGFibGUuICAqLworCisjZGVmaW5lIEEoYSkgKDEgPDwgKENPTkNBVDIgKENHRU5fSFdfLGEpIC0gQ0dFTl9BVFRSX0JPT0xfT0ZGU0VUKSkKKyNkZWZpbmUgSFdfRU5UKG4pIGk5NjBfY2dlbl9od190YWJsZVtuXQorCitjb25zdCBDR0VOX0hXX0VOVFJZIGk5NjBfY2dlbl9od190YWJsZVtdID0KK3sKKyAgeyBIV19IX1BDLCAmIEhXX0VOVCAoSFdfSF9QQyArIDEpLCAiaC1wYyIsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpIDAsIHsgQ0dFTl9IV19OQk9PTF9BVFRSUywgMHxBKFBST0ZJTEUpfEEoUEMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7IEhXX0hfTUVNT1JZLCAmIEhXX0VOVCAoSFdfSF9NRU1PUlkgKyAxKSwgImgtbWVtb3J5IiwgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgMCwgeyBDR0VOX0hXX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7IEhXX0hfU0lOVCwgJiBIV19FTlQgKEhXX0hfU0lOVCArIDEpLCAiaC1zaW50IiwgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgMCwgeyBDR0VOX0hXX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7IEhXX0hfVUlOVCwgJiBIV19FTlQgKEhXX0hfVUlOVCArIDEpLCAiaC11aW50IiwgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgMCwgeyBDR0VOX0hXX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7IEhXX0hfQUREUiwgJiBIV19FTlQgKEhXX0hfQUREUiArIDEpLCAiaC1hZGRyIiwgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgMCwgeyBDR0VOX0hXX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7IEhXX0hfSUFERFIsICYgSFdfRU5UIChIV19IX0lBRERSICsgMSksICJoLWlhZGRyIiwgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgMCwgeyBDR0VOX0hXX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAorICB7IEhXX0hfR1IsICYgSFdfRU5UIChIV19IX0dSICsgMSksICJoLWdyIiwgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgJiBpOTYwX2NnZW5fb3B2YWxfaF9nciwgeyBDR0VOX0hXX05CT09MX0FUVFJTLCAwfEEoQ0FDSEVfQUREUil8QShQUk9GSUxFKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKKyAgeyBIV19IX0NDLCAmIEhXX0VOVCAoSFdfSF9DQyArIDEpLCAiaC1jYyIsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgaTk2MF9jZ2VuX29wdmFsX2hfY2MsIHsgQ0dFTl9IV19OQk9PTF9BVFRSUywgMHxBKENBQ0hFX0FERFIpfEEoUFJPRklMRSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCisgIHsgMCB9Cit9OworCisvKiBkb24ndCB1bmRlZiBIV19FTlQsIHVzZWQgbGF0ZXIgKi8KKyN1bmRlZiBBCisKKy8qIFRoZSBpbnN0cnVjdGlvbiBmaWVsZCB0YWJsZS4gICovCisKKyNkZWZpbmUgQShhKSAoMSA8PCAoQ09OQ0FUMiAoQ0dFTl9JRkxEXyxhKSAtIENHRU5fQVRUUl9CT09MX09GRlNFVCkpCisKK2NvbnN0IENHRU5fSUZMRCBpOTYwX2NnZW5faWZsZF90YWJsZVtdID0KK3sKKyAgeyBJOTYwX0ZfTklMLCAiZi1uaWwiLCAwLCAwLCAwLCAwLCB7IENHRU5fSUZMRF9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgSTk2MF9GX09QQ09ERSwgImYtb3Bjb2RlIiwgMCwgMzIsIDAsIDgsIHsgQ0dFTl9JRkxEX05CT09MX0FUVFJTLCAwfEEoVU5TSUdORUQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBJOTYwX0ZfU1JDRFNULCAiZi1zcmNkc3QiLCAwLCAzMiwgOCwgNSwgeyBDR0VOX0lGTERfTkJPT0xfQVRUUlMsIDB8QShVTlNJR05FRCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEk5NjBfRl9TUkMyLCAiZi1zcmMyIiwgMCwgMzIsIDEzLCA1LCB7IENHRU5fSUZMRF9OQk9PTF9BVFRSUywgMHxBKFVOU0lHTkVEKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgSTk2MF9GX00zLCAiZi1tMyIsIDAsIDMyLCAxOCwgMSwgeyBDR0VOX0lGTERfTkJPT0xfQVRUUlMsIDB8QShVTlNJR05FRCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEk5NjBfRl9NMiwgImYtbTIiLCAwLCAzMiwgMTksIDEsIHsgQ0dFTl9JRkxEX05CT09MX0FUVFJTLCAwfEEoVU5TSUdORUQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBJOTYwX0ZfTTEsICJmLW0xIiwgMCwgMzIsIDIwLCAxLCB7IENHRU5fSUZMRF9OQk9PTF9BVFRSUywgMHxBKFVOU0lHTkVEKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgSTk2MF9GX09QQ09ERTIsICJmLW9wY29kZTIiLCAwLCAzMiwgMjEsIDQsIHsgQ0dFTl9JRkxEX05CT09MX0FUVFJTLCAwfEEoVU5TSUdORUQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBJOTYwX0ZfWkVSTywgImYtemVybyIsIDAsIDMyLCAyNSwgMiwgeyBDR0VOX0lGTERfTkJPT0xfQVRUUlMsIDB8QShVTlNJR05FRCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEk5NjBfRl9TUkMxLCAiZi1zcmMxIiwgMCwgMzIsIDI3LCA1LCB7IENHRU5fSUZMRF9OQk9PTF9BVFRSUywgMHxBKFVOU0lHTkVEKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgSTk2MF9GX0FCQVNFLCAiZi1hYmFzZSIsIDAsIDMyLCAxMywgNSwgeyBDR0VOX0lGTERfTkJPT0xfQVRUUlMsIDB8QShVTlNJR05FRCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEk5NjBfRl9NT0RFQSwgImYtbW9kZWEiLCAwLCAzMiwgMTgsIDEsIHsgQ0dFTl9JRkxEX05CT09MX0FUVFJTLCAwfEEoVU5TSUdORUQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBJOTYwX0ZfWkVST0EsICJmLXplcm9hIiwgMCwgMzIsIDE5LCAxLCB7IENHRU5fSUZMRF9OQk9PTF9BVFRSUywgMHxBKFVOU0lHTkVEKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgSTk2MF9GX09GRlNFVCwgImYtb2Zmc2V0IiwgMCwgMzIsIDIwLCAxMiwgeyBDR0VOX0lGTERfTkJPT0xfQVRUUlMsIDB8QShVTlNJR05FRCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEk5NjBfRl9NT0RFQiwgImYtbW9kZWIiLCAwLCAzMiwgMTgsIDQsIHsgQ0dFTl9JRkxEX05CT09MX0FUVFJTLCAwfEEoVU5TSUdORUQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBJOTYwX0ZfU0NBTEUsICJmLXNjYWxlIiwgMCwgMzIsIDIyLCAzLCB7IENHRU5fSUZMRF9OQk9PTF9BVFRSUywgMHxBKFVOU0lHTkVEKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgSTk2MF9GX1pFUk9CLCAiZi16ZXJvYiIsIDAsIDMyLCAyNSwgMiwgeyBDR0VOX0lGTERfTkJPT0xfQVRUUlMsIDB8QShVTlNJR05FRCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEk5NjBfRl9JTkRFWCwgImYtaW5kZXgiLCAwLCAzMiwgMjcsIDUsIHsgQ0dFTl9JRkxEX05CT09MX0FUVFJTLCAwfEEoVU5TSUdORUQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBJOTYwX0ZfT1BURElTUCwgImYtb3B0ZGlzcCIsIDMyLCAzMiwgMCwgMzIsIHsgQ0dFTl9JRkxEX05CT09MX0FUVFJTLCAwfEEoVU5TSUdORUQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBJOTYwX0ZfQlJfU1JDMSwgImYtYnItc3JjMSIsIDAsIDMyLCA4LCA1LCB7IENHRU5fSUZMRF9OQk9PTF9BVFRSUywgMHxBKFVOU0lHTkVEKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgSTk2MF9GX0JSX1NSQzIsICJmLWJyLXNyYzIiLCAwLCAzMiwgMTMsIDUsIHsgQ0dFTl9JRkxEX05CT09MX0FUVFJTLCAwfEEoVU5TSUdORUQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBJOTYwX0ZfQlJfTTEsICJmLWJyLW0xIiwgMCwgMzIsIDE4LCAxLCB7IENHRU5fSUZMRF9OQk9PTF9BVFRSUywgMHxBKFVOU0lHTkVEKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgSTk2MF9GX0JSX0RJU1AsICJmLWJyLWRpc3AiLCAwLCAzMiwgMTksIDExLCB7IENHRU5fSUZMRF9OQk9PTF9BVFRSUywgMHxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKyAgeyBJOTYwX0ZfQlJfWkVSTywgImYtYnItemVybyIsIDAsIDMyLCAzMCwgMiwgeyBDR0VOX0lGTERfTkJPT0xfQVRUUlMsIDB8QShVTlNJR05FRCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorICB7IEk5NjBfRl9DVFJMX0RJU1AsICJmLWN0cmwtZGlzcCIsIDAsIDMyLCA4LCAyMiwgeyBDR0VOX0lGTERfTkJPT0xfQVRUUlMsIDB8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgSTk2MF9GX0NUUkxfWkVSTywgImYtY3RybC16ZXJvIiwgMCwgMzIsIDMwLCAyLCB7IENHRU5fSUZMRF9OQk9PTF9BVFRSUywgMHxBKFVOU0lHTkVEKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisgIHsgMCB9Cit9OworCisjdW5kZWYgQQorCisvKiBUaGUgb3BlcmFuZCB0YWJsZS4gICovCisKKyNkZWZpbmUgQShhKSAoMSA8PCAoQ09OQ0FUMiAoQ0dFTl9PUEVSQU5EXyxhKSAtIENHRU5fQVRUUl9CT09MX09GRlNFVCkpCisjZGVmaW5lIE9QRVJBTkQob3ApIENPTkNBVDIgKEk5NjBfT1BFUkFORF8sb3ApCisKK2NvbnN0IENHRU5fT1BFUkFORCBpOTYwX2NnZW5fb3BlcmFuZF90YWJsZVtNQVhfT1BFUkFORFNdID0KK3sKKy8qIHBjOiBwcm9ncmFtIGNvdW50ZXIgKi8KKyAgeyAicGMiLCAmIEhXX0VOVCAoSFdfSF9QQyksIDAsIDAsCisgICAgeyBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMsIDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogc3JjMTogc291cmNlIHJlZ2lzdGVyIDEgKi8KKyAgeyAic3JjMSIsICYgSFdfRU5UIChIV19IX0dSKSwgMjcsIDUsCisgICAgeyBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMsIDB8QShVTlNJR05FRCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogc3JjMjogc291cmNlIHJlZ2lzdGVyIDIgKi8KKyAgeyAic3JjMiIsICYgSFdfRU5UIChIV19IX0dSKSwgMTMsIDUsCisgICAgeyBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMsIDB8QShVTlNJR05FRCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogZHN0OiBzb3VyY2UvZGVzdCByZWdpc3RlciAqLworICB7ICJkc3QiLCAmIEhXX0VOVCAoSFdfSF9HUiksIDgsIDUsCisgICAgeyBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMsIDB8QShVTlNJR05FRCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogbGl0MTogbGl0ZXJhbCAxICovCisgIHsgImxpdDEiLCAmIEhXX0VOVCAoSFdfSF9VSU5UKSwgMjcsIDUsCisgICAgeyBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMsIDB8QShVTlNJR05FRCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogbGl0MjogbGl0ZXJhbCAyICovCisgIHsgImxpdDIiLCAmIEhXX0VOVCAoSFdfSF9VSU5UKSwgMTMsIDUsCisgICAgeyBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMsIDB8QShVTlNJR05FRCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogc3Rfc3JjOiBzdG9yZSBzcmMgKi8KKyAgeyAic3Rfc3JjIiwgJiBIV19FTlQgKEhXX0hfR1IpLCA4LCA1LAorICAgIHsgQ0dFTl9PUEVSQU5EX05CT09MX0FUVFJTLCAwfEEoVU5TSUdORUQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIGFiYXNlOiBhYmFzZSAqLworICB7ICJhYmFzZSIsICYgSFdfRU5UIChIV19IX0dSKSwgMTMsIDUsCisgICAgeyBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMsIDB8QShVTlNJR05FRCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogb2Zmc2V0OiBvZmZzZXQgKi8KKyAgeyAib2Zmc2V0IiwgJiBIV19FTlQgKEhXX0hfVUlOVCksIDIwLCAxMiwKKyAgICB7IENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUywgMHxBKFVOU0lHTkVEKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBzY2FsZTogc2NhbGUgKi8KKyAgeyAic2NhbGUiLCAmIEhXX0VOVCAoSFdfSF9VSU5UKSwgMjIsIDMsCisgICAgeyBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMsIDB8QShVTlNJR05FRCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogaW5kZXg6IGluZGV4ICovCisgIHsgImluZGV4IiwgJiBIV19FTlQgKEhXX0hfR1IpLCAyNywgNSwKKyAgICB7IENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUywgMHxBKFVOU0lHTkVEKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBvcHRkaXNwOiBvcHRpb25hbCBkaXNwbGFjZW1lbnQgKi8KKyAgeyAib3B0ZGlzcCIsICYgSFdfRU5UIChIV19IX1VJTlQpLCAwLCAzMiwKKyAgICB7IENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUywgMHxBKFVOU0lHTkVEKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCisvKiBicl9zcmMxOiBicmFuY2ggc3JjMSAqLworICB7ICJicl9zcmMxIiwgJiBIV19FTlQgKEhXX0hfR1IpLCA4LCA1LAorICAgIHsgQ0dFTl9PUEVSQU5EX05CT09MX0FUVFJTLCAwfEEoVU5TSUdORUQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIGJyX3NyYzI6IGJyYW5jaCBzcmMyICovCisgIHsgImJyX3NyYzIiLCAmIEhXX0VOVCAoSFdfSF9HUiksIDEzLCA1LAorICAgIHsgQ0dFTl9PUEVSQU5EX05CT09MX0FUVFJTLCAwfEEoVU5TSUdORUQpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKKy8qIGJyX2Rpc3A6IGJyYW5jaCBkaXNwbGFjZW1lbnQgKi8KKyAgeyAiYnJfZGlzcCIsICYgSFdfRU5UIChIV19IX0lBRERSKSwgMTksIDExLAorICAgIHsgQ0dFTl9PUEVSQU5EX05CT09MX0FUVFJTLCAwfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogYnJfbGl0MTogYnJhbmNoIGxpdGVyYWwgMSAqLworICB7ICJicl9saXQxIiwgJiBIV19FTlQgKEhXX0hfVUlOVCksIDgsIDUsCisgICAgeyBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMsIDB8QShVTlNJR05FRCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAorLyogY3RybF9kaXNwOiBjdHJsIGJyYW5jaCBkaXNwICovCisgIHsgImN0cmxfZGlzcCIsICYgSFdfRU5UIChIV19IX0lBRERSKSwgOCwgMjIsCisgICAgeyBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMsIDB8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCit9OworCisjdW5kZWYgQQorCisjZGVmaW5lIEEoYSkgKDEgPDwgKENPTkNBVDIgKENHRU5fSU5TTl8sYSkgLSBDR0VOX0FUVFJfQk9PTF9PRkZTRVQpKQorI2RlZmluZSBPUChmaWVsZCkgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRCAoT1BFUkFORCAoZmllbGQpKQorCisvKiBUaGUgaW5zdHJ1Y3Rpb24gdGFibGUuICAqLworCitzdGF0aWMgY29uc3QgQ0dFTl9JQkFTRSBpOTYwX2NnZW5faW5zbl90YWJsZVtNQVhfSU5TTlNdID0KK3sKKyAgLyogU3BlY2lhbCBudWxsIGZpcnN0IGVudHJ5LgorICAgICBBIGBudW0nIHZhbHVlIG9mIHplcm8gaXMgdGh1cyBpbnZhbGlkLgorICAgICBBbHNvLCB0aGUgc3BlY2lhbCBgaW52YWxpZCcgaW5zbiByZXNpZGVzIGhlcmUuICAqLworICB7IDAsIDAsIDAgfSwKKy8qIG11bG8gJHNyYzEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTVVMTywgIm11bG8iLCAibXVsbyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbXVsbyAkbGl0MSwgJHNyYzIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9NVUxPMSwgIm11bG8xIiwgIm11bG8iLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG11bG8gJHNyYzEsICRsaXQyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTVVMTzIsICJtdWxvMiIsICJtdWxvIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBtdWxvICRsaXQxLCAkbGl0MiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX01VTE8zLCAibXVsbzMiLCAibXVsbyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogcmVtbyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9SRU1PLCAicmVtbyIsICJyZW1vIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiByZW1vICRsaXQxLCAkc3JjMiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX1JFTU8xLCAicmVtbzEiLCAicmVtbyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogcmVtbyAkc3JjMSwgJGxpdDIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9SRU1PMiwgInJlbW8yIiwgInJlbW8iLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHJlbW8gJGxpdDEsICRsaXQyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fUkVNTzMsICJyZW1vMyIsICJyZW1vIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBkaXZvICRzcmMxLCAkc3JjMiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0RJVk8sICJkaXZvIiwgImRpdm8iLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGRpdm8gJGxpdDEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fRElWTzEsICJkaXZvMSIsICJkaXZvIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBkaXZvICRzcmMxLCAkbGl0MiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0RJVk8yLCAiZGl2bzIiLCAiZGl2byIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogZGl2byAkbGl0MSwgJGxpdDIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9ESVZPMywgImRpdm8zIiwgImRpdm8iLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHJlbWkgJHNyYzEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fUkVNSSwgInJlbWkiLCAicmVtaSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogcmVtaSAkbGl0MSwgJHNyYzIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9SRU1JMSwgInJlbWkxIiwgInJlbWkiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHJlbWkgJHNyYzEsICRsaXQyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fUkVNSTIsICJyZW1pMiIsICJyZW1pIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiByZW1pICRsaXQxLCAkbGl0MiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX1JFTUkzLCAicmVtaTMiLCAicmVtaSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogZGl2aSAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9ESVZJLCAiZGl2aSIsICJkaXZpIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBkaXZpICRsaXQxLCAkc3JjMiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0RJVkkxLCAiZGl2aTEiLCAiZGl2aSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogZGl2aSAkc3JjMSwgJGxpdDIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9ESVZJMiwgImRpdmkyIiwgImRpdmkiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGRpdmkgJGxpdDEsICRsaXQyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fRElWSTMsICJkaXZpMyIsICJkaXZpIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBhZGRvICRzcmMxLCAkc3JjMiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0FERE8sICJhZGRvIiwgImFkZG8iLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGFkZG8gJGxpdDEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fQURETzEsICJhZGRvMSIsICJhZGRvIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBhZGRvICRzcmMxLCAkbGl0MiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0FERE8yLCAiYWRkbzIiLCAiYWRkbyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYWRkbyAkbGl0MSwgJGxpdDIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9BRERPMywgImFkZG8zIiwgImFkZG8iLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN1Ym8gJHNyYzEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fU1VCTywgInN1Ym8iLCAic3VibyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3VibyAkbGl0MSwgJHNyYzIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TVUJPMSwgInN1Ym8xIiwgInN1Ym8iLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN1Ym8gJHNyYzEsICRsaXQyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fU1VCTzIsICJzdWJvMiIsICJzdWJvIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdWJvICRsaXQxLCAkbGl0MiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX1NVQk8zLCAic3VibzMiLCAic3VibyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbm90Yml0ICRzcmMxLCAkc3JjMiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX05PVEJJVCwgIm5vdGJpdCIsICJub3RiaXQiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG5vdGJpdCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9OT1RCSVQxLCAibm90Yml0MSIsICJub3RiaXQiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG5vdGJpdCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9OT1RCSVQyLCAibm90Yml0MiIsICJub3RiaXQiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG5vdGJpdCAkbGl0MSwgJGxpdDIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9OT1RCSVQzLCAibm90Yml0MyIsICJub3RiaXQiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGFuZCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9BTkQsICJhbmQiLCAiYW5kIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBhbmQgJGxpdDEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fQU5EMSwgImFuZDEiLCAiYW5kIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBhbmQgJHNyYzEsICRsaXQyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fQU5EMiwgImFuZDIiLCAiYW5kIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBhbmQgJGxpdDEsICRsaXQyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fQU5EMywgImFuZDMiLCAiYW5kIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBhbmRub3QgJHNyYzEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fQU5ETk9ULCAiYW5kbm90IiwgImFuZG5vdCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYW5kbm90ICRsaXQxLCAkc3JjMiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0FORE5PVDEsICJhbmRub3QxIiwgImFuZG5vdCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYW5kbm90ICRzcmMxLCAkbGl0MiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0FORE5PVDIsICJhbmRub3QyIiwgImFuZG5vdCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYW5kbm90ICRsaXQxLCAkbGl0MiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0FORE5PVDMsICJhbmRub3QzIiwgImFuZG5vdCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc2V0Yml0ICRzcmMxLCAkc3JjMiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX1NFVEJJVCwgInNldGJpdCIsICJzZXRiaXQiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHNldGJpdCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TRVRCSVQxLCAic2V0Yml0MSIsICJzZXRiaXQiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHNldGJpdCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TRVRCSVQyLCAic2V0Yml0MiIsICJzZXRiaXQiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHNldGJpdCAkbGl0MSwgJGxpdDIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TRVRCSVQzLCAic2V0Yml0MyIsICJzZXRiaXQiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG5vdGFuZCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9OT1RBTkQsICJub3RhbmQiLCAibm90YW5kIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBub3RhbmQgJGxpdDEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTk9UQU5EMSwgIm5vdGFuZDEiLCAibm90YW5kIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBub3RhbmQgJHNyYzEsICRsaXQyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTk9UQU5EMiwgIm5vdGFuZDIiLCAibm90YW5kIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBub3RhbmQgJGxpdDEsICRsaXQyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTk9UQU5EMywgIm5vdGFuZDMiLCAibm90YW5kIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiB4b3IgJHNyYzEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fWE9SLCAieG9yIiwgInhvciIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogeG9yICRsaXQxLCAkc3JjMiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX1hPUjEsICJ4b3IxIiwgInhvciIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogeG9yICRzcmMxLCAkbGl0MiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX1hPUjIsICJ4b3IyIiwgInhvciIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogeG9yICRsaXQxLCAkbGl0MiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX1hPUjMsICJ4b3IzIiwgInhvciIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogb3IgJHNyYzEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fT1IsICJvciIsICJvciIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogb3IgJGxpdDEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fT1IxLCAib3IxIiwgIm9yIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBvciAkc3JjMSwgJGxpdDIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9PUjIsICJvcjIiLCAib3IiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG9yICRsaXQxLCAkbGl0MiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX09SMywgIm9yMyIsICJvciIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbm9yICRzcmMxLCAkc3JjMiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX05PUiwgIm5vciIsICJub3IiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG5vciAkbGl0MSwgJHNyYzIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9OT1IxLCAibm9yMSIsICJub3IiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG5vciAkc3JjMSwgJGxpdDIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9OT1IyLCAibm9yMiIsICJub3IiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG5vciAkbGl0MSwgJGxpdDIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9OT1IzLCAibm9yMyIsICJub3IiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG5vdCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9OT1QsICJub3QiLCAibm90IiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBub3QgJGxpdDEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTk9UMSwgIm5vdDEiLCAibm90IiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBub3QgJHNyYzEsICRsaXQyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTk9UMiwgIm5vdDIiLCAibm90IiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBub3QgJGxpdDEsICRsaXQyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTk9UMywgIm5vdDMiLCAibm90IiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBjbHJiaXQgJHNyYzEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fQ0xSQklULCAiY2xyYml0IiwgImNscmJpdCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY2xyYml0ICRsaXQxLCAkc3JjMiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0NMUkJJVDEsICJjbHJiaXQxIiwgImNscmJpdCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY2xyYml0ICRzcmMxLCAkbGl0MiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0NMUkJJVDIsICJjbHJiaXQyIiwgImNscmJpdCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY2xyYml0ICRsaXQxLCAkbGl0MiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0NMUkJJVDMsICJjbHJiaXQzIiwgImNscmJpdCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc2hsbyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TSExPLCAic2hsbyIsICJzaGxvIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzaGxvICRsaXQxLCAkc3JjMiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX1NITE8xLCAic2hsbzEiLCAic2hsbyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc2hsbyAkc3JjMSwgJGxpdDIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TSExPMiwgInNobG8yIiwgInNobG8iLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHNobG8gJGxpdDEsICRsaXQyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fU0hMTzMsICJzaGxvMyIsICJzaGxvIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzaHJvICRzcmMxLCAkc3JjMiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX1NIUk8sICJzaHJvIiwgInNocm8iLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHNocm8gJGxpdDEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fU0hSTzEsICJzaHJvMSIsICJzaHJvIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzaHJvICRzcmMxLCAkbGl0MiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX1NIUk8yLCAic2hybzIiLCAic2hybyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc2hybyAkbGl0MSwgJGxpdDIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TSFJPMywgInNocm8zIiwgInNocm8iLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHNobGkgJHNyYzEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fU0hMSSwgInNobGkiLCAic2hsaSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc2hsaSAkbGl0MSwgJHNyYzIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TSExJMSwgInNobGkxIiwgInNobGkiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHNobGkgJHNyYzEsICRsaXQyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fU0hMSTIsICJzaGxpMiIsICJzaGxpIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzaGxpICRsaXQxLCAkbGl0MiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX1NITEkzLCAic2hsaTMiLCAic2hsaSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc2hyaSAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TSFJJLCAic2hyaSIsICJzaHJpIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzaHJpICRsaXQxLCAkc3JjMiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX1NIUkkxLCAic2hyaTEiLCAic2hyaSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc2hyaSAkc3JjMSwgJGxpdDIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TSFJJMiwgInNocmkyIiwgInNocmkiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHNocmkgJGxpdDEsICRsaXQyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fU0hSSTMsICJzaHJpMyIsICJzaHJpIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBlbXVsICRzcmMxLCAkc3JjMiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0VNVUwsICJlbXVsIiwgImVtdWwiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGVtdWwgJGxpdDEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fRU1VTDEsICJlbXVsMSIsICJlbXVsIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBlbXVsICRzcmMxLCAkbGl0MiwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0VNVUwyLCAiZW11bDIiLCAiZW11bCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogZW11bCAkbGl0MSwgJGxpdDIsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9FTVVMMywgImVtdWwzIiwgImVtdWwiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG1vdiAkc3JjMSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX01PViwgIm1vdiIsICJtb3YiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG1vdiAkbGl0MSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX01PVjEsICJtb3YxIiwgIm1vdiIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbW92bCAkc3JjMSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX01PVkwsICJtb3ZsIiwgIm1vdmwiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG1vdmwgJGxpdDEsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9NT1ZMMSwgIm1vdmwxIiwgIm1vdmwiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIG1vdnQgJHNyYzEsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9NT1ZULCAibW92dCIsICJtb3Z0IiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBtb3Z0ICRsaXQxLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTU9WVDEsICJtb3Z0MSIsICJtb3Z0IiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBtb3ZxICRzcmMxLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTU9WUSwgIm1vdnEiLCAibW92cSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbW92cSAkbGl0MSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX01PVlExLCAibW92cTEiLCAibW92cSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbW9kcGMgJHNyYzEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTU9EUEMsICJtb2RwYyIsICJtb2RwYyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbW9kYWMgJHNyYzEsICRzcmMyLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTU9EQUMsICJtb2RhYyIsICJtb2RhYyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRhICRvZmZzZXQsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MREFfT0ZGU0VULCAibGRhLW9mZnNldCIsICJsZGEiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkYSAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MREFfSU5ESVJFQ1RfT0ZGU0VULCAibGRhLWluZGlyZWN0LW9mZnNldCIsICJsZGEiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkYSAoJGFiYXNlKSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xEQV9JTkRJUkVDVCwgImxkYS1pbmRpcmVjdCIsICJsZGEiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkYSAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MREFfSU5ESVJFQ1RfSU5ERVgsICJsZGEtaW5kaXJlY3QtaW5kZXgiLCAibGRhIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZGEgJG9wdGRpc3AsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MREFfRElTUCwgImxkYS1kaXNwIiwgImxkYSIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRhICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MREFfSU5ESVJFQ1RfRElTUCwgImxkYS1pbmRpcmVjdC1kaXNwIiwgImxkYSIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRhICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xEQV9JTkRFWF9ESVNQLCAibGRhLWluZGV4LWRpc3AiLCAibGRhIiwgNjQsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZGEgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MREFfSU5ESVJFQ1RfSU5ERVhfRElTUCwgImxkYS1pbmRpcmVjdC1pbmRleC1kaXNwIiwgImxkYSIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGQgJG9mZnNldCwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xEX09GRlNFVCwgImxkLW9mZnNldCIsICJsZCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGQgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTERfSU5ESVJFQ1RfT0ZGU0VULCAibGQtaW5kaXJlY3Qtb2Zmc2V0IiwgImxkIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZCAoJGFiYXNlKSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xEX0lORElSRUNULCAibGQtaW5kaXJlY3QiLCAibGQiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xEX0lORElSRUNUX0lOREVYLCAibGQtaW5kaXJlY3QtaW5kZXgiLCAibGQiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkICRvcHRkaXNwLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTERfRElTUCwgImxkLWRpc3AiLCAibGQiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRF9JTkRJUkVDVF9ESVNQLCAibGQtaW5kaXJlY3QtZGlzcCIsICJsZCIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGQgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTERfSU5ERVhfRElTUCwgImxkLWluZGV4LWRpc3AiLCAibGQiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTERfSU5ESVJFQ1RfSU5ERVhfRElTUCwgImxkLWluZGlyZWN0LWluZGV4LWRpc3AiLCAibGQiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkb2IgJG9mZnNldCwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xET0JfT0ZGU0VULCAibGRvYi1vZmZzZXQiLCAibGRvYiIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRvYiAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRE9CX0lORElSRUNUX09GRlNFVCwgImxkb2ItaW5kaXJlY3Qtb2Zmc2V0IiwgImxkb2IiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkb2IgKCRhYmFzZSksICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRE9CX0lORElSRUNULCAibGRvYi1pbmRpcmVjdCIsICJsZG9iIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZG9iICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xET0JfSU5ESVJFQ1RfSU5ERVgsICJsZG9iLWluZGlyZWN0LWluZGV4IiwgImxkb2IiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkb2IgJG9wdGRpc3AsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRE9CX0RJU1AsICJsZG9iLWRpc3AiLCAibGRvYiIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRvYiAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTERPQl9JTkRJUkVDVF9ESVNQLCAibGRvYi1pbmRpcmVjdC1kaXNwIiwgImxkb2IiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkb2IgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTERPQl9JTkRFWF9ESVNQLCAibGRvYi1pbmRleC1kaXNwIiwgImxkb2IiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkb2IgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRE9CX0lORElSRUNUX0lOREVYX0RJU1AsICJsZG9iLWluZGlyZWN0LWluZGV4LWRpc3AiLCAibGRvYiIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRvcyAkb2Zmc2V0LCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTERPU19PRkZTRVQsICJsZG9zLW9mZnNldCIsICJsZG9zIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZG9zICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xET1NfSU5ESVJFQ1RfT0ZGU0VULCAibGRvcy1pbmRpcmVjdC1vZmZzZXQiLCAibGRvcyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRvcyAoJGFiYXNlKSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xET1NfSU5ESVJFQ1QsICJsZG9zLWluZGlyZWN0IiwgImxkb3MiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkb3MgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTERPU19JTkRJUkVDVF9JTkRFWCwgImxkb3MtaW5kaXJlY3QtaW5kZXgiLCAibGRvcyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRvcyAkb3B0ZGlzcCwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xET1NfRElTUCwgImxkb3MtZGlzcCIsICJsZG9zIiwgNjQsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZG9zICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRE9TX0lORElSRUNUX0RJU1AsICJsZG9zLWluZGlyZWN0LWRpc3AiLCAibGRvcyIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRvcyAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRE9TX0lOREVYX0RJU1AsICJsZG9zLWluZGV4LWRpc3AiLCAibGRvcyIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRvcyAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xET1NfSU5ESVJFQ1RfSU5ERVhfRElTUCwgImxkb3MtaW5kaXJlY3QtaW5kZXgtZGlzcCIsICJsZG9zIiwgNjQsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZGliICRvZmZzZXQsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRElCX09GRlNFVCwgImxkaWItb2Zmc2V0IiwgImxkaWIiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkaWIgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTERJQl9JTkRJUkVDVF9PRkZTRVQsICJsZGliLWluZGlyZWN0LW9mZnNldCIsICJsZGliIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZGliICgkYWJhc2UpLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTERJQl9JTkRJUkVDVCwgImxkaWItaW5kaXJlY3QiLCAibGRpYiIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRpYiAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRElCX0lORElSRUNUX0lOREVYLCAibGRpYi1pbmRpcmVjdC1pbmRleCIsICJsZGliIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZGliICRvcHRkaXNwLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTERJQl9ESVNQLCAibGRpYi1kaXNwIiwgImxkaWIiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkaWIgJG9wdGRpc3AoJGFiYXNlKSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xESUJfSU5ESVJFQ1RfRElTUCwgImxkaWItaW5kaXJlY3QtZGlzcCIsICJsZGliIiwgNjQsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZGliICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xESUJfSU5ERVhfRElTUCwgImxkaWItaW5kZXgtZGlzcCIsICJsZGliIiwgNjQsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZGliICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTERJQl9JTkRJUkVDVF9JTkRFWF9ESVNQLCAibGRpYi1pbmRpcmVjdC1pbmRleC1kaXNwIiwgImxkaWIiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkaXMgJG9mZnNldCwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xESVNfT0ZGU0VULCAibGRpcy1vZmZzZXQiLCAibGRpcyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRpcyAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRElTX0lORElSRUNUX09GRlNFVCwgImxkaXMtaW5kaXJlY3Qtb2Zmc2V0IiwgImxkaXMiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkaXMgKCRhYmFzZSksICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRElTX0lORElSRUNULCAibGRpcy1pbmRpcmVjdCIsICJsZGlzIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZGlzICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xESVNfSU5ESVJFQ1RfSU5ERVgsICJsZGlzLWluZGlyZWN0LWluZGV4IiwgImxkaXMiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkaXMgJG9wdGRpc3AsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRElTX0RJU1AsICJsZGlzLWRpc3AiLCAibGRpcyIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRpcyAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTERJU19JTkRJUkVDVF9ESVNQLCAibGRpcy1pbmRpcmVjdC1kaXNwIiwgImxkaXMiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkaXMgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisgIHsKKyAgICBJOTYwX0lOU05fTERJU19JTkRFWF9ESVNQLCAibGRpcy1pbmRleC1kaXNwIiwgImxkaXMiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkaXMgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRElTX0lORElSRUNUX0lOREVYX0RJU1AsICJsZGlzLWluZGlyZWN0LWluZGV4LWRpc3AiLCAibGRpcyIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRsICRvZmZzZXQsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRExfT0ZGU0VULCAibGRsLW9mZnNldCIsICJsZGwiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkbCAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRExfSU5ESVJFQ1RfT0ZGU0VULCAibGRsLWluZGlyZWN0LW9mZnNldCIsICJsZGwiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkbCAoJGFiYXNlKSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xETF9JTkRJUkVDVCwgImxkbC1pbmRpcmVjdCIsICJsZGwiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkbCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVgsICJsZGwtaW5kaXJlY3QtaW5kZXgiLCAibGRsIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZGwgJG9wdGRpc3AsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRExfRElTUCwgImxkbC1kaXNwIiwgImxkbCIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRsICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRExfSU5ESVJFQ1RfRElTUCwgImxkbC1pbmRpcmVjdC1kaXNwIiwgImxkbCIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xETF9JTkRFWF9ESVNQLCAibGRsLWluZGV4LWRpc3AiLCAibGRsIiwgNjQsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZGwgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVhfRElTUCwgImxkbC1pbmRpcmVjdC1pbmRleC1kaXNwIiwgImxkbCIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGR0ICRvZmZzZXQsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRFRfT0ZGU0VULCAibGR0LW9mZnNldCIsICJsZHQiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkdCAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRFRfSU5ESVJFQ1RfT0ZGU0VULCAibGR0LWluZGlyZWN0LW9mZnNldCIsICJsZHQiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkdCAoJGFiYXNlKSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xEVF9JTkRJUkVDVCwgImxkdC1pbmRpcmVjdCIsICJsZHQiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkdCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVgsICJsZHQtaW5kaXJlY3QtaW5kZXgiLCAibGR0IiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZHQgJG9wdGRpc3AsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRFRfRElTUCwgImxkdC1kaXNwIiwgImxkdCIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGR0ICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRFRfSU5ESVJFQ1RfRElTUCwgImxkdC1pbmRpcmVjdC1kaXNwIiwgImxkdCIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGR0ICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xEVF9JTkRFWF9ESVNQLCAibGR0LWluZGV4LWRpc3AiLCAibGR0IiwgNjQsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZHQgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVhfRElTUCwgImxkdC1pbmRpcmVjdC1pbmRleC1kaXNwIiwgImxkdCIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRxICRvZmZzZXQsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRFFfT0ZGU0VULCAibGRxLW9mZnNldCIsICJsZHEiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkcSAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRFFfSU5ESVJFQ1RfT0ZGU0VULCAibGRxLWluZGlyZWN0LW9mZnNldCIsICJsZHEiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkcSAoJGFiYXNlKSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xEUV9JTkRJUkVDVCwgImxkcS1pbmRpcmVjdCIsICJsZHEiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGxkcSAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRFFfSU5ESVJFQ1RfSU5ERVgsICJsZHEtaW5kaXJlY3QtaW5kZXgiLCAibGRxIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZHEgJG9wdGRpc3AsICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRFFfRElTUCwgImxkcS1kaXNwIiwgImxkcSIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRxICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRFFfSU5ESVJFQ1RfRElTUCwgImxkcS1pbmRpcmVjdC1kaXNwIiwgImxkcSIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogbGRxICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworICB7CisgICAgSTk2MF9JTlNOX0xEUV9JTkRFWF9ESVNQLCAibGRxLWluZGV4LWRpc3AiLCAibGRxIiwgNjQsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBsZHEgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKyAgeworICAgIEk5NjBfSU5TTl9MRFFfSU5ESVJFQ1RfSU5ERVhfRElTUCwgImxkcS1pbmRpcmVjdC1pbmRleC1kaXNwIiwgImxkcSIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3QgJHN0X3NyYywgJG9mZnNldCAqLworICB7CisgICAgSTk2MF9JTlNOX1NUX09GRlNFVCwgInN0LW9mZnNldCIsICJzdCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3QgJHN0X3NyYywgJG9mZnNldCgkYWJhc2UpICovCisgIHsKKyAgICBJOTYwX0lOU05fU1RfSU5ESVJFQ1RfT0ZGU0VULCAic3QtaW5kaXJlY3Qtb2Zmc2V0IiwgInN0IiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdCAkc3Rfc3JjLCAoJGFiYXNlKSAqLworICB7CisgICAgSTk2MF9JTlNOX1NUX0lORElSRUNULCAic3QtaW5kaXJlY3QiLCAic3QiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0ICRzdF9zcmMsICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLworICB7CisgICAgSTk2MF9JTlNOX1NUX0lORElSRUNUX0lOREVYLCAic3QtaW5kaXJlY3QtaW5kZXgiLCAic3QiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0ICRzdF9zcmMsICRvcHRkaXNwICovCisgIHsKKyAgICBJOTYwX0lOU05fU1RfRElTUCwgInN0LWRpc3AiLCAic3QiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0ICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TVF9JTkRJUkVDVF9ESVNQLCAic3QtaW5kaXJlY3QtZGlzcCIsICJzdCIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3QgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TVF9JTkRFWF9ESVNQLCAic3QtaW5kZXgtZGlzcCIsICJzdCIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3QgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KKyAgeworICAgIEk5NjBfSU5TTl9TVF9JTkRJUkVDVF9JTkRFWF9ESVNQLCAic3QtaW5kaXJlY3QtaW5kZXgtZGlzcCIsICJzdCIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RvYiAkc3Rfc3JjLCAkb2Zmc2V0ICovCisgIHsKKyAgICBJOTYwX0lOU05fU1RPQl9PRkZTRVQsICJzdG9iLW9mZnNldCIsICJzdG9iIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdG9iICRzdF9zcmMsICRvZmZzZXQoJGFiYXNlKSAqLworICB7CisgICAgSTk2MF9JTlNOX1NUT0JfSU5ESVJFQ1RfT0ZGU0VULCAic3RvYi1pbmRpcmVjdC1vZmZzZXQiLCAic3RvYiIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RvYiAkc3Rfc3JjLCAoJGFiYXNlKSAqLworICB7CisgICAgSTk2MF9JTlNOX1NUT0JfSU5ESVJFQ1QsICJzdG9iLWluZGlyZWN0IiwgInN0b2IiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0b2IgJHN0X3NyYywgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCisgIHsKKyAgICBJOTYwX0lOU05fU1RPQl9JTkRJUkVDVF9JTkRFWCwgInN0b2ItaW5kaXJlY3QtaW5kZXgiLCAic3RvYiIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RvYiAkc3Rfc3JjLCAkb3B0ZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX1NUT0JfRElTUCwgInN0b2ItZGlzcCIsICJzdG9iIiwgNjQsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdG9iICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TVE9CX0lORElSRUNUX0RJU1AsICJzdG9iLWluZGlyZWN0LWRpc3AiLCAic3RvYiIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RvYiAkc3Rfc3JjLCAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZSAqLworICB7CisgICAgSTk2MF9JTlNOX1NUT0JfSU5ERVhfRElTUCwgInN0b2ItaW5kZXgtZGlzcCIsICJzdG9iIiwgNjQsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdG9iICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCisgIHsKKyAgICBJOTYwX0lOU05fU1RPQl9JTkRJUkVDVF9JTkRFWF9ESVNQLCAic3RvYi1pbmRpcmVjdC1pbmRleC1kaXNwIiwgInN0b2IiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0b3MgJHN0X3NyYywgJG9mZnNldCAqLworICB7CisgICAgSTk2MF9JTlNOX1NUT1NfT0ZGU0VULCAic3Rvcy1vZmZzZXQiLCAic3RvcyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RvcyAkc3Rfc3JjLCAkb2Zmc2V0KCRhYmFzZSkgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TVE9TX0lORElSRUNUX09GRlNFVCwgInN0b3MtaW5kaXJlY3Qtb2Zmc2V0IiwgInN0b3MiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0b3MgJHN0X3NyYywgKCRhYmFzZSkgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TVE9TX0lORElSRUNULCAic3Rvcy1pbmRpcmVjdCIsICJzdG9zIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdG9zICRzdF9zcmMsICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLworICB7CisgICAgSTk2MF9JTlNOX1NUT1NfSU5ESVJFQ1RfSU5ERVgsICJzdG9zLWluZGlyZWN0LWluZGV4IiwgInN0b3MiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0b3MgJHN0X3NyYywgJG9wdGRpc3AgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TVE9TX0RJU1AsICJzdG9zLWRpc3AiLCAic3RvcyIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RvcyAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpICovCisgIHsKKyAgICBJOTYwX0lOU05fU1RPU19JTkRJUkVDVF9ESVNQLCAic3Rvcy1pbmRpcmVjdC1kaXNwIiwgInN0b3MiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0b3MgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TVE9TX0lOREVYX0RJU1AsICJzdG9zLWluZGV4LWRpc3AiLCAic3RvcyIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RvcyAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLworICB7CisgICAgSTk2MF9JTlNOX1NUT1NfSU5ESVJFQ1RfSU5ERVhfRElTUCwgInN0b3MtaW5kaXJlY3QtaW5kZXgtZGlzcCIsICJzdG9zIiwgNjQsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdGwgJHN0X3NyYywgJG9mZnNldCAqLworICB7CisgICAgSTk2MF9JTlNOX1NUTF9PRkZTRVQsICJzdGwtb2Zmc2V0IiwgInN0bCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RsICRzdF9zcmMsICRvZmZzZXQoJGFiYXNlKSAqLworICB7CisgICAgSTk2MF9JTlNOX1NUTF9JTkRJUkVDVF9PRkZTRVQsICJzdGwtaW5kaXJlY3Qtb2Zmc2V0IiwgInN0bCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RsICRzdF9zcmMsICgkYWJhc2UpICovCisgIHsKKyAgICBJOTYwX0lOU05fU1RMX0lORElSRUNULCAic3RsLWluZGlyZWN0IiwgInN0bCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RsICRzdF9zcmMsICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLworICB7CisgICAgSTk2MF9JTlNOX1NUTF9JTkRJUkVDVF9JTkRFWCwgInN0bC1pbmRpcmVjdC1pbmRleCIsICJzdGwiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0bCAkc3Rfc3JjLCAkb3B0ZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX1NUTF9ESVNQLCAic3RsLWRpc3AiLCAic3RsIiwgNjQsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdGwgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKSAqLworICB7CisgICAgSTk2MF9JTlNOX1NUTF9JTkRJUkVDVF9ESVNQLCAic3RsLWluZGlyZWN0LWRpc3AiLCAic3RsIiwgNjQsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdGwgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TVExfSU5ERVhfRElTUCwgInN0bC1pbmRleC1kaXNwIiwgInN0bCIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RsICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCisgIHsKKyAgICBJOTYwX0lOU05fU1RMX0lORElSRUNUX0lOREVYX0RJU1AsICJzdGwtaW5kaXJlY3QtaW5kZXgtZGlzcCIsICJzdGwiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0dCAkc3Rfc3JjLCAkb2Zmc2V0ICovCisgIHsKKyAgICBJOTYwX0lOU05fU1RUX09GRlNFVCwgInN0dC1vZmZzZXQiLCAic3R0IiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdHQgJHN0X3NyYywgJG9mZnNldCgkYWJhc2UpICovCisgIHsKKyAgICBJOTYwX0lOU05fU1RUX0lORElSRUNUX09GRlNFVCwgInN0dC1pbmRpcmVjdC1vZmZzZXQiLCAic3R0IiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdHQgJHN0X3NyYywgKCRhYmFzZSkgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TVFRfSU5ESVJFQ1QsICJzdHQtaW5kaXJlY3QiLCAic3R0IiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdHQgJHN0X3NyYywgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCisgIHsKKyAgICBJOTYwX0lOU05fU1RUX0lORElSRUNUX0lOREVYLCAic3R0LWluZGlyZWN0LWluZGV4IiwgInN0dCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3R0ICRzdF9zcmMsICRvcHRkaXNwICovCisgIHsKKyAgICBJOTYwX0lOU05fU1RUX0RJU1AsICJzdHQtZGlzcCIsICJzdHQiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0dCAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpICovCisgIHsKKyAgICBJOTYwX0lOU05fU1RUX0lORElSRUNUX0RJU1AsICJzdHQtaW5kaXJlY3QtZGlzcCIsICJzdHQiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0dCAkc3Rfc3JjLCAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZSAqLworICB7CisgICAgSTk2MF9JTlNOX1NUVF9JTkRFWF9ESVNQLCAic3R0LWluZGV4LWRpc3AiLCAic3R0IiwgNjQsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdHQgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KKyAgeworICAgIEk5NjBfSU5TTl9TVFRfSU5ESVJFQ1RfSU5ERVhfRElTUCwgInN0dC1pbmRpcmVjdC1pbmRleC1kaXNwIiwgInN0dCIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RxICRzdF9zcmMsICRvZmZzZXQgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TVFFfT0ZGU0VULCAic3RxLW9mZnNldCIsICJzdHEiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0cSAkc3Rfc3JjLCAkb2Zmc2V0KCRhYmFzZSkgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TVFFfSU5ESVJFQ1RfT0ZGU0VULCAic3RxLWluZGlyZWN0LW9mZnNldCIsICJzdHEiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0cSAkc3Rfc3JjLCAoJGFiYXNlKSAqLworICB7CisgICAgSTk2MF9JTlNOX1NUUV9JTkRJUkVDVCwgInN0cS1pbmRpcmVjdCIsICJzdHEiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0cSAkc3Rfc3JjLCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KKyAgeworICAgIEk5NjBfSU5TTl9TVFFfSU5ESVJFQ1RfSU5ERVgsICJzdHEtaW5kaXJlY3QtaW5kZXgiLCAic3RxIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBzdHEgJHN0X3NyYywgJG9wdGRpc3AgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TVFFfRElTUCwgInN0cS1kaXNwIiwgInN0cSIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RxICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KKyAgeworICAgIEk5NjBfSU5TTl9TVFFfSU5ESVJFQ1RfRElTUCwgInN0cS1pbmRpcmVjdC1kaXNwIiwgInN0cSIsIDY0LAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogc3RxICRzdF9zcmMsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlICovCisgIHsKKyAgICBJOTYwX0lOU05fU1RRX0lOREVYX0RJU1AsICJzdHEtaW5kZXgtZGlzcCIsICJzdHEiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHN0cSAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLworICB7CisgICAgSTk2MF9JTlNOX1NUUV9JTkRJUkVDVF9JTkRFWF9ESVNQLCAic3RxLWluZGlyZWN0LWluZGV4LWRpc3AiLCAic3RxIiwgNjQsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBjbXBvYmUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0NNUE9CRV9SRUcsICJjbXBvYmUtcmVnIiwgImNtcG9iZSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21wb2JlICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKyAgeworICAgIEk5NjBfSU5TTl9DTVBPQkVfTElULCAiY21wb2JlLWxpdCIsICJjbXBvYmUiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGNtcG9ibmUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0NNUE9CTkVfUkVHLCAiY21wb2JuZS1yZWciLCAiY21wb2JuZSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21wb2JuZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCisgIHsKKyAgICBJOTYwX0lOU05fQ01QT0JORV9MSVQsICJjbXBvYm5lLWxpdCIsICJjbXBvYm5lIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBjbXBvYmwgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0NNUE9CTF9SRUcsICJjbXBvYmwtcmVnIiwgImNtcG9ibCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21wb2JsICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKyAgeworICAgIEk5NjBfSU5TTl9DTVBPQkxfTElULCAiY21wb2JsLWxpdCIsICJjbXBvYmwiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGNtcG9ibGUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0NNUE9CTEVfUkVHLCAiY21wb2JsZS1yZWciLCAiY21wb2JsZSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21wb2JsZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCisgIHsKKyAgICBJOTYwX0lOU05fQ01QT0JMRV9MSVQsICJjbXBvYmxlLWxpdCIsICJjbXBvYmxlIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBjbXBvYmcgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0NNUE9CR19SRUcsICJjbXBvYmctcmVnIiwgImNtcG9iZyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21wb2JnICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKyAgeworICAgIEk5NjBfSU5TTl9DTVBPQkdfTElULCAiY21wb2JnLWxpdCIsICJjbXBvYmciLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGNtcG9iZ2UgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0NNUE9CR0VfUkVHLCAiY21wb2JnZS1yZWciLCAiY21wb2JnZSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21wb2JnZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCisgIHsKKyAgICBJOTYwX0lOU05fQ01QT0JHRV9MSVQsICJjbXBvYmdlLWxpdCIsICJjbXBvYmdlIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBjbXBpYmUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0NNUElCRV9SRUcsICJjbXBpYmUtcmVnIiwgImNtcGliZSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21waWJlICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKyAgeworICAgIEk5NjBfSU5TTl9DTVBJQkVfTElULCAiY21waWJlLWxpdCIsICJjbXBpYmUiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGNtcGlibmUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0NNUElCTkVfUkVHLCAiY21waWJuZS1yZWciLCAiY21waWJuZSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21waWJuZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCisgIHsKKyAgICBJOTYwX0lOU05fQ01QSUJORV9MSVQsICJjbXBpYm5lLWxpdCIsICJjbXBpYm5lIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBjbXBpYmwgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0NNUElCTF9SRUcsICJjbXBpYmwtcmVnIiwgImNtcGlibCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21waWJsICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKyAgeworICAgIEk5NjBfSU5TTl9DTVBJQkxfTElULCAiY21waWJsLWxpdCIsICJjbXBpYmwiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGNtcGlibGUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0NNUElCTEVfUkVHLCAiY21waWJsZS1yZWciLCAiY21waWJsZSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21waWJsZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCisgIHsKKyAgICBJOTYwX0lOU05fQ01QSUJMRV9MSVQsICJjbXBpYmxlLWxpdCIsICJjbXBpYmxlIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBjbXBpYmcgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0NNUElCR19SRUcsICJjbXBpYmctcmVnIiwgImNtcGliZyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21waWJnICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKyAgeworICAgIEk5NjBfSU5TTl9DTVBJQkdfTElULCAiY21waWJnLWxpdCIsICJjbXBpYmciLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGNtcGliZ2UgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0NNUElCR0VfUkVHLCAiY21waWJnZS1yZWciLCAiY21waWJnZSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21waWJnZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCisgIHsKKyAgICBJOTYwX0lOU05fQ01QSUJHRV9MSVQsICJjbXBpYmdlLWxpdCIsICJjbXBpYmdlIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBiYmMgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0JCQ19SRUcsICJiYmMtcmVnIiwgImJiYyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYmJjICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKyAgeworICAgIEk5NjBfSU5TTl9CQkNfTElULCAiYmJjLWxpdCIsICJiYmMiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJicyAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCisgIHsKKyAgICBJOTYwX0lOU05fQkJTX1JFRywgImJicy1yZWciLCAiYmJzIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBiYnMgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0JCU19MSVQsICJiYnMtbGl0IiwgImJicyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21waSAkc3JjMSwgJHNyYzIgKi8KKyAgeworICAgIEk5NjBfSU5TTl9DTVBJLCAiY21waSIsICJjbXBpIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBjbXBpICRsaXQxLCAkc3JjMiAqLworICB7CisgICAgSTk2MF9JTlNOX0NNUEkxLCAiY21waTEiLCAiY21waSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21waSAkc3JjMSwgJGxpdDIgKi8KKyAgeworICAgIEk5NjBfSU5TTl9DTVBJMiwgImNtcGkyIiwgImNtcGkiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGNtcGkgJGxpdDEsICRsaXQyICovCisgIHsKKyAgICBJOTYwX0lOU05fQ01QSTMsICJjbXBpMyIsICJjbXBpIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBjbXBvICRzcmMxLCAkc3JjMiAqLworICB7CisgICAgSTk2MF9JTlNOX0NNUE8sICJjbXBvIiwgImNtcG8iLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGNtcG8gJGxpdDEsICRzcmMyICovCisgIHsKKyAgICBJOTYwX0lOU05fQ01QTzEsICJjbXBvMSIsICJjbXBvIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBjbXBvICRzcmMxLCAkbGl0MiAqLworICB7CisgICAgSTk2MF9JTlNOX0NNUE8yLCAiY21wbzIiLCAiY21wbyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY21wbyAkbGl0MSwgJGxpdDIgKi8KKyAgeworICAgIEk5NjBfSU5TTl9DTVBPMywgImNtcG8zIiwgImNtcG8iLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHRlc3RubyAkYnJfc3JjMSAqLworICB7CisgICAgSTk2MF9JTlNOX1RFU1ROT19SRUcsICJ0ZXN0bm8tcmVnIiwgInRlc3RubyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogdGVzdGcgJGJyX3NyYzEgKi8KKyAgeworICAgIEk5NjBfSU5TTl9URVNUR19SRUcsICJ0ZXN0Zy1yZWciLCAidGVzdGciLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHRlc3RlICRicl9zcmMxICovCisgIHsKKyAgICBJOTYwX0lOU05fVEVTVEVfUkVHLCAidGVzdGUtcmVnIiwgInRlc3RlIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiB0ZXN0Z2UgJGJyX3NyYzEgKi8KKyAgeworICAgIEk5NjBfSU5TTl9URVNUR0VfUkVHLCAidGVzdGdlLXJlZyIsICJ0ZXN0Z2UiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHRlc3RsICRicl9zcmMxICovCisgIHsKKyAgICBJOTYwX0lOU05fVEVTVExfUkVHLCAidGVzdGwtcmVnIiwgInRlc3RsIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiB0ZXN0bmUgJGJyX3NyYzEgKi8KKyAgeworICAgIEk5NjBfSU5TTl9URVNUTkVfUkVHLCAidGVzdG5lLXJlZyIsICJ0ZXN0bmUiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIHRlc3RsZSAkYnJfc3JjMSAqLworICB7CisgICAgSTk2MF9JTlNOX1RFU1RMRV9SRUcsICJ0ZXN0bGUtcmVnIiwgInRlc3RsZSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogdGVzdG8gJGJyX3NyYzEgKi8KKyAgeworICAgIEk5NjBfSU5TTl9URVNUT19SRUcsICJ0ZXN0by1yZWciLCAidGVzdG8iLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJubyAkY3RybF9kaXNwICovCisgIHsKKyAgICBJOTYwX0lOU05fQk5PLCAiYm5vIiwgImJubyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYmcgJGN0cmxfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0JHLCAiYmciLCAiYmciLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJlICRjdHJsX2Rpc3AgKi8KKyAgeworICAgIEk5NjBfSU5TTl9CRSwgImJlIiwgImJlIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBiZ2UgJGN0cmxfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0JHRSwgImJnZSIsICJiZ2UiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJsICRjdHJsX2Rpc3AgKi8KKyAgeworICAgIEk5NjBfSU5TTl9CTCwgImJsIiwgImJsIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBibmUgJGN0cmxfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0JORSwgImJuZSIsICJibmUiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJsZSAkY3RybF9kaXNwICovCisgIHsKKyAgICBJOTYwX0lOU05fQkxFLCAiYmxlIiwgImJsZSIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYm8gJGN0cmxfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0JPLCAiYm8iLCAiYm8iLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGIgJGN0cmxfZGlzcCAqLworICB7CisgICAgSTk2MF9JTlNOX0IsICJiIiwgImIiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYnggJG9mZnNldCgkYWJhc2UpICovCisgIHsKKyAgICBJOTYwX0lOU05fQlhfSU5ESVJFQ1RfT0ZGU0VULCAiYngtaW5kaXJlY3Qtb2Zmc2V0IiwgImJ4IiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJ4ICgkYWJhc2UpICovCisgIHsKKyAgICBJOTYwX0lOU05fQlhfSU5ESVJFQ1QsICJieC1pbmRpcmVjdCIsICJieCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBieCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KKyAgeworICAgIEk5NjBfSU5TTl9CWF9JTkRJUkVDVF9JTkRFWCwgImJ4LWluZGlyZWN0LWluZGV4IiwgImJ4IiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGJ4ICRvcHRkaXNwICovCisgIHsKKyAgICBJOTYwX0lOU05fQlhfRElTUCwgImJ4LWRpc3AiLCAiYngiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogYnggJG9wdGRpc3AoJGFiYXNlKSAqLworICB7CisgICAgSTk2MF9JTlNOX0JYX0lORElSRUNUX0RJU1AsICJieC1pbmRpcmVjdC1kaXNwIiwgImJ4IiwgNjQsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGNhbGx4ICRvcHRkaXNwICovCisgIHsKKyAgICBJOTYwX0lOU05fQ0FMTFhfRElTUCwgImNhbGx4LWRpc3AiLCAiY2FsbHgiLCA2NCwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogY2FsbHggKCRhYmFzZSkgKi8KKyAgeworICAgIEk5NjBfSU5TTl9DQUxMWF9JTkRJUkVDVCwgImNhbGx4LWluZGlyZWN0IiwgImNhbGx4IiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGNhbGx4ICRvZmZzZXQoJGFiYXNlKSAqLworICB7CisgICAgSTk2MF9JTlNOX0NBTExYX0lORElSRUNUX09GRlNFVCwgImNhbGx4LWluZGlyZWN0LW9mZnNldCIsICJjYWxseCIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiByZXQgKi8KKyAgeworICAgIEk5NjBfSU5TTl9SRVQsICJyZXQiLCAicmV0IiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KKyAgfSwKKy8qIGNhbGxzICRzcmMxICovCisgIHsKKyAgICBJOTYwX0lOU05fQ0FMTFMsICJjYWxscyIsICJjYWxscyIsIDMyLAorICAgIHsgQ0dFTl9JTlNOX05CT09MX0FUVFJTLCAwfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCisvKiBmbWFyayAqLworICB7CisgICAgSTk2MF9JTlNOX0ZNQVJLLCAiZm1hcmsiLCAiZm1hcmsiLCAzMiwKKyAgICB7IENHRU5fSU5TTl9OQk9PTF9BVFRSUywgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQorICB9LAorLyogZmx1c2hyZWcgKi8KKyAgeworICAgIEk5NjBfSU5TTl9GTFVTSFJFRywgImZsdXNocmVnIiwgImZsdXNocmVnIiwgMzIsCisgICAgeyBDR0VOX0lOU05fTkJPT0xfQVRUUlMsIDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9CisgIH0sCit9OworCisjdW5kZWYgQQorI3VuZGVmIE1ORU0KKyN1bmRlZiBPUAorCitzdGF0aWMgdm9pZAoraW5pdF90YWJsZXMgKCkKK3sKK30KKworLyogSW5pdGlhbGl6ZSBhIGNwdSB0YWJsZSBhbmQgcmV0dXJuIGEgZGVzY3JpcHRvci4KKyAgIEl0J3MgbXVjaCBsaWtlIG9wZW5pbmcgYSBmaWxlLCBhbmQgbXVzdCBiZSB0aGUgZmlyc3QgZnVuY3Rpb24gY2FsbGVkLiAgKi8KKworQ0dFTl9DUFVfREVTQworaTk2MF9jZ2VuX2NwdV9vcGVuIChtYWNoLCBlbmRpYW4pCisgICAgIGludCBtYWNoOworICAgICBlbnVtIGNnZW5fZW5kaWFuIGVuZGlhbjsKK3sKKyAgQ0dFTl9DUFVfVEFCTEUgKmNkID0gKENHRU5fQ1BVX1RBQkxFICopIHhtYWxsb2MgKHNpemVvZiAoQ0dFTl9DUFVfVEFCTEUpKTsKKyAgc3RhdGljIGludCBpbml0X3A7CisKKyAgaWYgKCEgaW5pdF9wKQorICAgIHsKKyAgICAgIGluaXRfdGFibGVzICgpOworICAgICAgaW5pdF9wID0gMTsKKyAgICB9CisKKyAgbWVtc2V0IChjZCwgMCwgc2l6ZW9mICgqY2QpKTsKKworICBjZC0+bWFjaCA9IG1hY2g7CisgIGNkLT5lbmRpYW4gPSBlbmRpYW47CisgIC8qIEZJWE1FOiBmb3IgdGhlIHNwYXJjIGNhc2Ugd2UgY2FuIGRldGVybWluZSBpbnNuLWVuZGlhbm5lc3Mgc3RhdGljYWxseS4KKyAgICAgVGhlIHdvcnJ5IGhlcmUgaXMgd2hlcmUgYm90aCBkYXRhIGFuZCBpbnNuIGVuZGlhbiBjYW4gYmUgaW5kZXBlbmRlbnRseQorICAgICBjaG9zZW4sIGluIHdoaWNoIGNhc2UgdGhpcyBmdW5jdGlvbiB3aWxsIG5lZWQgYW5vdGhlciBhcmd1bWVudC4KKyAgICAgQWN0dWFsbHksIHdpbGwgd2FudCB0byBhbGxvdyBmb3IgbW9yZSBhcmd1bWVudHMgaW4gdGhlIGZ1dHVyZSBhbnl3YXkuICAqLworICBjZC0+aW5zbl9lbmRpYW4gPSBlbmRpYW47CisKKyAgY2QtPmludF9pbnNuX3AgPSBDR0VOX0lOVF9JTlNOX1A7CisKKyAgY2QtPm1heF9pbnNuX3NpemUgPSBDR0VOX01BWF9JTlNOX1NJWkU7CisKKyAgY2QtPmh3X2xpc3QgPSAmIGk5NjBfY2dlbl9od190YWJsZVswXTsKKworICBjZC0+aWZsZF90YWJsZSA9ICYgaTk2MF9jZ2VuX2lmbGRfdGFibGVbMF07CisKKyAgY2QtPm9wZXJhbmRfdGFibGUgPSAmIGk5NjBfY2dlbl9vcGVyYW5kX3RhYmxlWzBdOworCisgIHsKKyAgICBpbnQgaTsKKyAgICBjb25zdCBDR0VOX0lCQVNFICppYiA9ICYgaTk2MF9jZ2VuX2luc25fdGFibGVbMF07CisgICAgQ0dFTl9JTlNOICppbnNucyA9IChDR0VOX0lOU04gKikgeG1hbGxvYyAoTUFYX0lOU05TICogc2l6ZW9mIChDR0VOX0lOU04pKTsKKyAgICBtZW1zZXQgKGluc25zLCAwLCBNQVhfSU5TTlMgKiBzaXplb2YgKENHRU5fSU5TTikpOworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfSU5TTlM7ICsraSkKKyAgICAgIGluc25zW2ldLmJhc2UgPSAmaWJbaV07CisgICAgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzID0gaW5zbnM7CisgIH0KKyAgY2QtPmluc25fdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9JQkFTRSk7CisgIGNkLT5pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXMgPSBNQVhfSU5TTlM7CisKKyAgcmV0dXJuIChDR0VOX0NQVV9ERVNDKSBjZDsKK30KKworLyogQ2xvc2UgYSBjcHUgdGFibGUuICAqLworCit2b2lkCitpOTYwX2NnZW5fY3B1X2Nsb3NlIChjZCkKKyAgICAgQ0dFTl9DUFVfREVTQyBjZDsKK3sKKyAgaWYgKGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllcykKKyAgICBmcmVlICgoQ0dFTl9JTlNOICopIGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllcyk7CisgIGZyZWUgKGNkKTsKK30KKwpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvaTk2MC1kZXNjLmggYi9zaW0vaTk2MC9pOTYwLWRlc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTMzMTBmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2k5NjAvaTk2MC1kZXNjLmgKQEAgLTAsMCArMSwzNDIgQEAKKy8qIENQVSBkYXRhIGhlYWRlciBmb3IgaTk2MC4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2lmbmRlZiBJOTYwX0NQVV9ICisjZGVmaW5lIEk5NjBfQ1BVX0gKKworI2RlZmluZSBDR0VOX0FSQ0ggaTk2MAorCisvKiBHaXZlbiBzeW1ib2wgUywgcmV0dXJuIGk5NjBfY2dlbl88Uz4uICAqLworI2RlZmluZSBDR0VOX1NZTShzKSBDT05DQVQzIChpOTYwLF9jZ2VuXyxzKQorCisvKiBTZWxlY3RlZCBjcHUgZmFtaWxpZXMuICAqLworI2RlZmluZSBIQVZFX0NQVV9JOTYwQkFTRQorCisjZGVmaW5lIENHRU5fSU5TTl9MU0IwX1AgMAorI2RlZmluZSBDR0VOX1dPUkRfQklUU0laRSAzMgorI2RlZmluZSBDR0VOX0RFRkFVTFRfSU5TTl9CSVRTSVpFIDMyCisjZGVmaW5lIENHRU5fQkFTRV9JTlNOX0JJVFNJWkUgMzIKKyNkZWZpbmUgQ0dFTl9NSU5fSU5TTl9CSVRTSVpFIDMyCisjZGVmaW5lIENHRU5fTUFYX0lOU05fQklUU0laRSA2NAorI2RlZmluZSBDR0VOX0RFRkFVTFRfSU5TTl9TSVpFIChDR0VOX0RFRkFVTFRfSU5TTl9CSVRTSVpFIC8gOCkKKyNkZWZpbmUgQ0dFTl9CQVNFX0lOU05fU0laRSAoQ0dFTl9CQVNFX0lOU05fQklUU0laRSAvIDgpCisjZGVmaW5lIENHRU5fTUlOX0lOU05fU0laRSAoQ0dFTl9NSU5fSU5TTl9CSVRTSVpFIC8gOCkKKyNkZWZpbmUgQ0dFTl9NQVhfSU5TTl9TSVpFIChDR0VOX01BWF9JTlNOX0JJVFNJWkUgLyA4KQorI2RlZmluZSBDR0VOX0lOVF9JTlNOX1AgMAorCisvKiBGSVhNRTogTmVlZCB0byBjb21wdXRlIENHRU5fTUFYX1NZTlRBWF9CWVRFUy4gICovCisKKy8qIENHRU5fTU5FTU9OSUNfT1BFUkFORFMgaXMgZGVmaW5lZCBpZiBtbmVtb25pY3MgaGF2ZSBvcGVyYW5kcy4KKyAgIGUuZy4gSW4gImIsYSBmb28iIHRoZSAiLGEiIGlzIGFuIG9wZXJhbmQuICBJZiBtbmVtb25pY3MgaGF2ZSBvcGVyYW5kcworICAgd2UgY2FuJ3QgaGFzaCBvbiBldmVyeXRoaW5nIHVwIHRvIHRoZSBzcGFjZS4gICovCisjZGVmaW5lIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKKy8qIE1heGltdW0gbnVtYmVyIG9mIG9wZXJhbmRzIGFueSBpbnNuIG9yIG1hY3JvLWluc24gaGFzLiAgKi8KKyNkZWZpbmUgQ0dFTl9NQVhfSU5TTl9PUEVSQU5EUyAxNgorCisvKiBNYXhpbXVtIG51bWJlciBvZiBmaWVsZHMgaW4gYW4gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBDR0VOX01BWF9JRk1UX09QRVJBTkRTIDkKKworLyogRW51bXMuICAqLworCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG9wY29kZSBlbnVtcy4gICovCit0eXBlZGVmIGVudW0gaW5zbl9vcGNvZGUgeworICBPUENPREVfMDAsIE9QQ09ERV8wMSwgT1BDT0RFXzAyLCBPUENPREVfMDMKKyAsIE9QQ09ERV8wNCwgT1BDT0RFXzA1LCBPUENPREVfMDYsIE9QQ09ERV8wNworICwgT1BDT0RFXzA4LCBPUENPREVfMDksIE9QQ09ERV8wQSwgT1BDT0RFXzBCCisgLCBPUENPREVfMEMsIE9QQ09ERV8wRCwgT1BDT0RFXzBFLCBPUENPREVfMEYKKyAsIE9QQ09ERV8xMCwgT1BDT0RFXzExLCBPUENPREVfMTIsIE9QQ09ERV8xMworICwgT1BDT0RFXzE0LCBPUENPREVfMTUsIE9QQ09ERV8xNiwgT1BDT0RFXzE3CisgLCBPUENPREVfMTgsIE9QQ09ERV8xOSwgT1BDT0RFXzFBLCBPUENPREVfMUIKKyAsIE9QQ09ERV8xQywgT1BDT0RFXzFELCBPUENPREVfMUUsIE9QQ09ERV8xRgorICwgT1BDT0RFXzIwLCBPUENPREVfMjEsIE9QQ09ERV8yMiwgT1BDT0RFXzIzCisgLCBPUENPREVfMjQsIE9QQ09ERV8yNSwgT1BDT0RFXzI2LCBPUENPREVfMjcKKyAsIE9QQ09ERV8yOCwgT1BDT0RFXzI5LCBPUENPREVfMkEsIE9QQ09ERV8yQgorICwgT1BDT0RFXzJDLCBPUENPREVfMkQsIE9QQ09ERV8yRSwgT1BDT0RFXzJGCisgLCBPUENPREVfMzAsIE9QQ09ERV8zMSwgT1BDT0RFXzMyLCBPUENPREVfMzMKKyAsIE9QQ09ERV8zNCwgT1BDT0RFXzM1LCBPUENPREVfMzYsIE9QQ09ERV8zNworICwgT1BDT0RFXzM4LCBPUENPREVfMzksIE9QQ09ERV8zQSwgT1BDT0RFXzNCCisgLCBPUENPREVfM0MsIE9QQ09ERV8zRCwgT1BDT0RFXzNFLCBPUENPREVfM0YKKyAsIE9QQ09ERV80MCwgT1BDT0RFXzQxLCBPUENPREVfNDIsIE9QQ09ERV80MworICwgT1BDT0RFXzQ0LCBPUENPREVfNDUsIE9QQ09ERV80NiwgT1BDT0RFXzQ3CisgLCBPUENPREVfNDgsIE9QQ09ERV80OSwgT1BDT0RFXzRBLCBPUENPREVfNEIKKyAsIE9QQ09ERV80QywgT1BDT0RFXzRELCBPUENPREVfNEUsIE9QQ09ERV80RgorICwgT1BDT0RFXzUwLCBPUENPREVfNTEsIE9QQ09ERV81MiwgT1BDT0RFXzUzCisgLCBPUENPREVfNTQsIE9QQ09ERV81NSwgT1BDT0RFXzU2LCBPUENPREVfNTcKKyAsIE9QQ09ERV81OCwgT1BDT0RFXzU5LCBPUENPREVfNUEsIE9QQ09ERV81QgorICwgT1BDT0RFXzVDLCBPUENPREVfNUQsIE9QQ09ERV81RSwgT1BDT0RFXzVGCisgLCBPUENPREVfNjAsIE9QQ09ERV82MSwgT1BDT0RFXzYyLCBPUENPREVfNjMKKyAsIE9QQ09ERV82NCwgT1BDT0RFXzY1LCBPUENPREVfNjYsIE9QQ09ERV82NworICwgT1BDT0RFXzY4LCBPUENPREVfNjksIE9QQ09ERV82QSwgT1BDT0RFXzZCCisgLCBPUENPREVfNkMsIE9QQ09ERV82RCwgT1BDT0RFXzZFLCBPUENPREVfNkYKKyAsIE9QQ09ERV83MCwgT1BDT0RFXzcxLCBPUENPREVfNzIsIE9QQ09ERV83MworICwgT1BDT0RFXzc0LCBPUENPREVfNzUsIE9QQ09ERV83NiwgT1BDT0RFXzc3CisgLCBPUENPREVfNzgsIE9QQ09ERV83OSwgT1BDT0RFXzdBLCBPUENPREVfN0IKKyAsIE9QQ09ERV83QywgT1BDT0RFXzdELCBPUENPREVfN0UsIE9QQ09ERV83RgorICwgT1BDT0RFXzgwLCBPUENPREVfODEsIE9QQ09ERV84MiwgT1BDT0RFXzgzCisgLCBPUENPREVfODQsIE9QQ09ERV84NSwgT1BDT0RFXzg2LCBPUENPREVfODcKKyAsIE9QQ09ERV84OCwgT1BDT0RFXzg5LCBPUENPREVfOEEsIE9QQ09ERV84QgorICwgT1BDT0RFXzhDLCBPUENPREVfOEQsIE9QQ09ERV84RSwgT1BDT0RFXzhGCisgLCBPUENPREVfOTAsIE9QQ09ERV85MSwgT1BDT0RFXzkyLCBPUENPREVfOTMKKyAsIE9QQ09ERV85NCwgT1BDT0RFXzk1LCBPUENPREVfOTYsIE9QQ09ERV85NworICwgT1BDT0RFXzk4LCBPUENPREVfOTksIE9QQ09ERV85QSwgT1BDT0RFXzlCCisgLCBPUENPREVfOUMsIE9QQ09ERV85RCwgT1BDT0RFXzlFLCBPUENPREVfOUYKKyAsIE9QQ09ERV9BMCwgT1BDT0RFX0ExLCBPUENPREVfQTIsIE9QQ09ERV9BMworICwgT1BDT0RFX0E0LCBPUENPREVfQTUsIE9QQ09ERV9BNiwgT1BDT0RFX0E3CisgLCBPUENPREVfQTgsIE9QQ09ERV9BOSwgT1BDT0RFX0FBLCBPUENPREVfQUIKKyAsIE9QQ09ERV9BQywgT1BDT0RFX0FELCBPUENPREVfQUUsIE9QQ09ERV9BRgorICwgT1BDT0RFX0IwLCBPUENPREVfQjEsIE9QQ09ERV9CMiwgT1BDT0RFX0IzCisgLCBPUENPREVfQjQsIE9QQ09ERV9CNSwgT1BDT0RFX0I2LCBPUENPREVfQjcKKyAsIE9QQ09ERV9COCwgT1BDT0RFX0I5LCBPUENPREVfQkEsIE9QQ09ERV9CQgorICwgT1BDT0RFX0JDLCBPUENPREVfQkQsIE9QQ09ERV9CRSwgT1BDT0RFX0JGCisgLCBPUENPREVfQzAsIE9QQ09ERV9DMSwgT1BDT0RFX0MyLCBPUENPREVfQzMKKyAsIE9QQ09ERV9DNCwgT1BDT0RFX0M1LCBPUENPREVfQzYsIE9QQ09ERV9DNworICwgT1BDT0RFX0M4LCBPUENPREVfQzksIE9QQ09ERV9DQSwgT1BDT0RFX0NCCisgLCBPUENPREVfQ0MsIE9QQ09ERV9DRCwgT1BDT0RFX0NFLCBPUENPREVfQ0YKKyAsIE9QQ09ERV9EMCwgT1BDT0RFX0QxLCBPUENPREVfRDIsIE9QQ09ERV9EMworICwgT1BDT0RFX0Q0LCBPUENPREVfRDUsIE9QQ09ERV9ENiwgT1BDT0RFX0Q3CisgLCBPUENPREVfRDgsIE9QQ09ERV9EOSwgT1BDT0RFX0RBLCBPUENPREVfREIKKyAsIE9QQ09ERV9EQywgT1BDT0RFX0RELCBPUENPREVfREUsIE9QQ09ERV9ERgorICwgT1BDT0RFX0UwLCBPUENPREVfRTEsIE9QQ09ERV9FMiwgT1BDT0RFX0UzCisgLCBPUENPREVfRTQsIE9QQ09ERV9FNSwgT1BDT0RFX0U2LCBPUENPREVfRTcKKyAsIE9QQ09ERV9FOCwgT1BDT0RFX0U5LCBPUENPREVfRUEsIE9QQ09ERV9FQgorICwgT1BDT0RFX0VDLCBPUENPREVfRUQsIE9QQ09ERV9FRSwgT1BDT0RFX0VGCisgLCBPUENPREVfRjAsIE9QQ09ERV9GMSwgT1BDT0RFX0YyLCBPUENPREVfRjMKKyAsIE9QQ09ERV9GNCwgT1BDT0RFX0Y1LCBPUENPREVfRjYsIE9QQ09ERV9GNworICwgT1BDT0RFX0Y4LCBPUENPREVfRjksIE9QQ09ERV9GQSwgT1BDT0RFX0ZCCisgLCBPUENPREVfRkMsIE9QQ09ERV9GRCwgT1BDT0RFX0ZFLCBPUENPREVfRkYKK30gSU5TTl9PUENPREU7CisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gb3Bjb2RlMiBlbnVtcy4gICovCit0eXBlZGVmIGVudW0gaW5zbl9vcGNvZGUyIHsKKyAgT1BDT0RFMl8wLCBPUENPREUyXzEsIE9QQ09ERTJfMiwgT1BDT0RFMl8zCisgLCBPUENPREUyXzQsIE9QQ09ERTJfNSwgT1BDT0RFMl82LCBPUENPREUyXzcKKyAsIE9QQ09ERTJfOCwgT1BDT0RFMl85LCBPUENPREUyX0EsIE9QQ09ERTJfQgorICwgT1BDT0RFMl9DLCBPUENPREUyX0QsIE9QQ09ERTJfRSwgT1BDT0RFMl9GCit9IElOU05fT1BDT0RFMjsKKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBtMyBlbnVtcy4gICovCit0eXBlZGVmIGVudW0gaW5zbl9tMyB7CisgIE0zXzAsIE0zXzEKK30gSU5TTl9NMzsKKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBtMyBlbnVtcy4gICovCit0eXBlZGVmIGVudW0gaW5zbl9tMiB7CisgIE0yXzAsIE0yXzEKK30gSU5TTl9NMjsKKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBtMSBlbnVtcy4gICovCit0eXBlZGVmIGVudW0gaW5zbl9tMSB7CisgIE0xXzAsIE0xXzEKK30gSU5TTl9NMTsKKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiB6ZXJvIGVudW1zLiAgKi8KK3R5cGVkZWYgZW51bSBpbnNuX3plcm8geworICBaRVJPXzAKK30gSU5TTl9aRVJPOworCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG1vZGUgYSBlbnVtcy4gICovCit0eXBlZGVmIGVudW0gaW5zbl9tb2RlYSB7CisgIE1PREVBX09GRlNFVCwgTU9ERUFfSU5ESVJFQ1RfT0ZGU0VUCit9IElOU05fTU9ERUE7CisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gemVybyBhIGVudW1zLiAgKi8KK3R5cGVkZWYgZW51bSBpbnNuX3plcm9hIHsKKyAgWkVST0FfMAorfSBJTlNOX1pFUk9BOworCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG1vZGUgYiBlbnVtcy4gICovCit0eXBlZGVmIGVudW0gaW5zbl9tb2RlYiB7CisgIE1PREVCX0lMTDAsIE1PREVCX0lMTDEsIE1PREVCX0lMTDIsIE1PREVCX0lMTDMKKyAsIE1PREVCX0lORElSRUNULCBNT0RFQl9JUF9ESVNQLCBNT0RFQl9SRVM2LCBNT0RFQl9JTkRJUkVDVF9JTkRFWAorICwgTU9ERUJfSUxMOCwgTU9ERUJfSUxMOSwgTU9ERUJfSUxMMTAsIE1PREVCX0lMTDExCisgLCBNT0RFQl9ESVNQLCBNT0RFQl9JTkRJUkVDVF9ESVNQLCBNT0RFQl9JTkRFWF9ESVNQLCBNT0RFQl9JTkRJUkVDVF9JTkRFWF9ESVNQCit9IElOU05fTU9ERUI7CisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gemVybyBiIGVudW1zLiAgKi8KK3R5cGVkZWYgZW51bSBpbnNuX3plcm9iIHsKKyAgWkVST0JfMAorfSBJTlNOX1pFUk9COworCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIGJyYW5jaCBtMSBlbnVtcy4gICovCit0eXBlZGVmIGVudW0gaW5zbl9icl9tMSB7CisgIEJSX00xXzAsIEJSX00xXzEKK30gSU5TTl9CUl9NMTsKKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBicmFuY2ggemVybyBlbnVtcy4gICovCit0eXBlZGVmIGVudW0gaW5zbl9icl96ZXJvIHsKKyAgQlJfWkVST18wCit9IElOU05fQlJfWkVSTzsKKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBjdHJsIHplcm8gZW51bXMuICAqLwordHlwZWRlZiBlbnVtIGluc25fY3RybF96ZXJvIHsKKyAgQ1RSTF9aRVJPXzAKK30gSU5TTl9DVFJMX1pFUk87CisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGdlbmVyYWwgcmVnaXN0ZXJzLiAgKi8KK3R5cGVkZWYgZW51bSBoX2dyIHsKKyAgSF9HUl9GUCA9IDMxLCBIX0dSX1NQID0gMSwgSF9HUl9SMCA9IDAsIEhfR1JfUjEgPSAxCisgLCBIX0dSX1IyID0gMiwgSF9HUl9SMyA9IDMsIEhfR1JfUjQgPSA0LCBIX0dSX1I1ID0gNQorICwgSF9HUl9SNiA9IDYsIEhfR1JfUjcgPSA3LCBIX0dSX1I4ID0gOCwgSF9HUl9SOSA9IDkKKyAsIEhfR1JfUjEwID0gMTAsIEhfR1JfUjExID0gMTEsIEhfR1JfUjEyID0gMTIsIEhfR1JfUjEzID0gMTMKKyAsIEhfR1JfUjE0ID0gMTQsIEhfR1JfUjE1ID0gMTUsIEhfR1JfRzAgPSAxNiwgSF9HUl9HMSA9IDE3CisgLCBIX0dSX0cyID0gMTgsIEhfR1JfRzMgPSAxOSwgSF9HUl9HNCA9IDIwLCBIX0dSX0c1ID0gMjEKKyAsIEhfR1JfRzYgPSAyMiwgSF9HUl9HNyA9IDIzLCBIX0dSX0c4ID0gMjQsIEhfR1JfRzkgPSAyNQorICwgSF9HUl9HMTAgPSAyNiwgSF9HUl9HMTEgPSAyNywgSF9HUl9HMTIgPSAyOCwgSF9HUl9HMTMgPSAyOQorICwgSF9HUl9HMTQgPSAzMCwgSF9HUl9HMTUgPSAzMQorfSBIX0dSOworCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjb25kaXRpb24gY29kZS4gICovCit0eXBlZGVmIGVudW0gaF9jYyB7CisgIEhfQ0NfQ0MKK30gSF9DQzsKKworLyogQXR0cmlidXRlcy4gICovCisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG1hY2hpbmUgdHlwZSBzZWxlY3Rpb24uICAqLwordHlwZWRlZiBlbnVtIG1hY2hfYXR0ciB7CisgIE1BQ0hfQkFTRSwgTUFDSF9JOTYwX0tBX1NBLCBNQUNIX0k5NjBfQ0EsIE1BQ0hfTUFYCit9IE1BQ0hfQVRUUjsKKworLyogTnVtYmVyIG9mIGFyY2hpdGVjdHVyZSB2YXJpYW50cy4gICovCisjZGVmaW5lIE1BWF9NQUNIUyAoKGludCkgTUFDSF9NQVgpCisKKy8qIElmaWVsZCBzdXBwb3J0LiAgKi8KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjZ2VuX2lmbGQgaTk2MF9jZ2VuX2lmbGRfdGFibGVbXTsKKworLyogSWZpZWxkIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9pZmxkIGF0dHJzLiAgKi8KK3R5cGVkZWYgZW51bSBjZ2VuX2lmbGRfYXR0ciB7CisgIENHRU5fSUZMRF9NQUNILCBDR0VOX0lGTERfTkJPT0xTLCBDR0VOX0lGTERfU1RBUlRfQk9PTCA9IDMxLCBDR0VOX0lGTERfVklSVFVBTAorICwgQ0dFTl9JRkxEX1VOU0lHTkVELCBDR0VOX0lGTERfUENSRUxfQUREUiwgQ0dFTl9JRkxEX0FCU19BRERSLCBDR0VOX0lGTERfUkVTRVJWRUQKKyAsIENHRU5fSUZMRF9TSUdOX09QVAorfSBDR0VOX0lGTERfQVRUUjsKKworLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faWZsZC4gICovCisjZGVmaW5lIENHRU5fSUZMRF9OQk9PTF9BVFRSUyAoKGludCkgQ0dFTl9JRkxEX05CT09MUykKKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaTk2MCBpZmllbGQgdHlwZXMuICAqLwordHlwZWRlZiBlbnVtIGlmaWVsZF90eXBlIHsKKyAgSTk2MF9GX05JTCwgSTk2MF9GX09QQ09ERSwgSTk2MF9GX1NSQ0RTVCwgSTk2MF9GX1NSQzIKKyAsIEk5NjBfRl9NMywgSTk2MF9GX00yLCBJOTYwX0ZfTTEsIEk5NjBfRl9PUENPREUyCisgLCBJOTYwX0ZfWkVSTywgSTk2MF9GX1NSQzEsIEk5NjBfRl9BQkFTRSwgSTk2MF9GX01PREVBCisgLCBJOTYwX0ZfWkVST0EsIEk5NjBfRl9PRkZTRVQsIEk5NjBfRl9NT0RFQiwgSTk2MF9GX1NDQUxFCisgLCBJOTYwX0ZfWkVST0IsIEk5NjBfRl9JTkRFWCwgSTk2MF9GX09QVERJU1AsIEk5NjBfRl9CUl9TUkMxCisgLCBJOTYwX0ZfQlJfU1JDMiwgSTk2MF9GX0JSX00xLCBJOTYwX0ZfQlJfRElTUCwgSTk2MF9GX0JSX1pFUk8KKyAsIEk5NjBfRl9DVFJMX0RJU1AsIEk5NjBfRl9DVFJMX1pFUk8sIEk5NjBfRl9NQVgKK30gSUZJRUxEX1RZUEU7CisKKyNkZWZpbmUgTUFYX0lGTEQgKChpbnQpIEk5NjBfRl9NQVgpCisKKy8qIEhhcmR3YXJlIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9odyBhdHRycy4gICovCit0eXBlZGVmIGVudW0gY2dlbl9od19hdHRyIHsKKyAgQ0dFTl9IV19NQUNILCBDR0VOX0hXX05CT09MUywgQ0dFTl9IV19TVEFSVF9CT09MID0gMzEsIENHRU5fSFdfVklSVFVBTAorICwgQ0dFTl9IV19VTlNJR05FRCwgQ0dFTl9IV19TSUdORUQsIENHRU5fSFdfQ0FDSEVfQUREUiwgQ0dFTl9IV19GVU5fQUNDRVNTCisgLCBDR0VOX0hXX1BDLCBDR0VOX0hXX1BST0ZJTEUKK30gQ0dFTl9IV19BVFRSOworCisvKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9ody4gICovCisjZGVmaW5lIENHRU5fSFdfTkJPT0xfQVRUUlMgKChpbnQpIENHRU5fSFdfTkJPT0xTKQorCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpOTYwIGhhcmR3YXJlIHR5cGVzLiAgKi8KK3R5cGVkZWYgZW51bSBod190eXBlIHsKKyAgSFdfSF9QQywgSFdfSF9NRU1PUlksIEhXX0hfU0lOVCwgSFdfSF9VSU5UCisgLCBIV19IX0FERFIsIEhXX0hfSUFERFIsIEhXX0hfR1IsIEhXX0hfQ0MKKyAsIEhXX01BWAorfSBIV19UWVBFOworCisjZGVmaW5lIE1BWF9IVyAoKGludCkgSFdfTUFYKQorCisvKiBPcGVyYW5kIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9vcGVyYW5kIGF0dHJzLiAgKi8KK3R5cGVkZWYgZW51bSBjZ2VuX29wZXJhbmRfYXR0ciB7CisgIENHRU5fT1BFUkFORF9NQUNILCBDR0VOX09QRVJBTkRfTkJPT0xTLCBDR0VOX09QRVJBTkRfU1RBUlRfQk9PTCA9IDMxLCBDR0VOX09QRVJBTkRfVklSVFVBTAorICwgQ0dFTl9PUEVSQU5EX1VOU0lHTkVELCBDR0VOX09QRVJBTkRfUENSRUxfQUREUiwgQ0dFTl9PUEVSQU5EX0FCU19BRERSLCBDR0VOX09QRVJBTkRfU0lHTl9PUFQKKyAsIENHRU5fT1BFUkFORF9ORUdBVElWRSwgQ0dFTl9PUEVSQU5EX1JFTEFYLCBDR0VOX09QRVJBTkRfU0VNX09OTFkKK30gQ0dFTl9PUEVSQU5EX0FUVFI7CisKKy8qIE51bWJlciBvZiBub24tYm9vbGVhbiBlbGVtZW50cyBpbiBjZ2VuX29wZXJhbmQuICAqLworI2RlZmluZSBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMgKChpbnQpIENHRU5fT1BFUkFORF9OQk9PTFMpCisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGk5NjAgb3BlcmFuZCB0eXBlcy4gICovCit0eXBlZGVmIGVudW0gY2dlbl9vcGVyYW5kX3R5cGUgeworICBJOTYwX09QRVJBTkRfUEMsIEk5NjBfT1BFUkFORF9TUkMxLCBJOTYwX09QRVJBTkRfU1JDMiwgSTk2MF9PUEVSQU5EX0RTVAorICwgSTk2MF9PUEVSQU5EX0xJVDEsIEk5NjBfT1BFUkFORF9MSVQyLCBJOTYwX09QRVJBTkRfU1RfU1JDLCBJOTYwX09QRVJBTkRfQUJBU0UKKyAsIEk5NjBfT1BFUkFORF9PRkZTRVQsIEk5NjBfT1BFUkFORF9TQ0FMRSwgSTk2MF9PUEVSQU5EX0lOREVYLCBJOTYwX09QRVJBTkRfT1BURElTUAorICwgSTk2MF9PUEVSQU5EX0JSX1NSQzEsIEk5NjBfT1BFUkFORF9CUl9TUkMyLCBJOTYwX09QRVJBTkRfQlJfRElTUCwgSTk2MF9PUEVSQU5EX0JSX0xJVDEKKyAsIEk5NjBfT1BFUkFORF9DVFJMX0RJU1AsIEk5NjBfT1BFUkFORF9NQVgKK30gQ0dFTl9PUEVSQU5EX1RZUEU7CisKKy8qIE51bWJlciBvZiBvcGVyYW5kcyB0eXBlcy4gICovCisjZGVmaW5lIE1BWF9PUEVSQU5EUyAoKGludCkgSTk2MF9PUEVSQU5EX01BWCkKKworLyogTWF4aW11bSBudW1iZXIgb2Ygb3BlcmFuZHMgcmVmZXJlbmNlZCBieSBhbnkgaW5zbi4gICovCisjZGVmaW5lIE1BWF9PUEVSQU5EX0lOU1RBTkNFUyA4CisKKy8qIEluc24gYXR0cmlidXRlIGluZGljZXMuICAqLworCisvKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX2luc24gYXR0cnMuICAqLwordHlwZWRlZiBlbnVtIGNnZW5faW5zbl9hdHRyIHsKKyAgQ0dFTl9JTlNOX01BQ0gsIENHRU5fSU5TTl9OQk9PTFMsIENHRU5fSU5TTl9TVEFSVF9CT09MID0gMzEsIENHRU5fSU5TTl9BTElBUworICwgQ0dFTl9JTlNOX1ZJUlRVQUwsIENHRU5fSU5TTl9VTkNPTkRfQ1RJLCBDR0VOX0lOU05fQ09ORF9DVEksIENHRU5fSU5TTl9TS0lQX0NUSQorICwgQ0dFTl9JTlNOX0RFTEFZX1NMT1QsIENHRU5fSU5TTl9SRUxBWEFCTEUsIENHRU5fSU5TTl9SRUxBWCwgQ0dFTl9JTlNOX05PX0RJUworICwgQ0dFTl9JTlNOX1BCQgorfSBDR0VOX0lOU05fQVRUUjsKKworLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faW5zbi4gICovCisjZGVmaW5lIENHRU5fSU5TTl9OQk9PTF9BVFRSUyAoKGludCkgQ0dFTl9JTlNOX05CT09MUykKKworLyogY2dlbi5oIHVzZXMgdGhpbmdzIHdlIGp1c3QgZGVmaW5lZC4gICovCisjaW5jbHVkZSAib3Bjb2RlL2NnZW4uaCIKKworLyogQXR0cmlidXRlcy4gICovCitleHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGk5NjBfY2dlbl9od19hdHRyX3RhYmxlW107CitleHRlcm4gY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGk5NjBfY2dlbl9vcGVyYW5kX2F0dHJfdGFibGVbXTsKK2V4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgaTk2MF9jZ2VuX2luc25fYXR0cl90YWJsZVtdOworCisvKiBIYXJkd2FyZSBkZWNscy4gICovCisKK2V4dGVybiBDR0VOX0tFWVdPUkQgaTk2MF9jZ2VuX29wdmFsX2hfZ3I7CitleHRlcm4gQ0dFTl9LRVlXT1JEIGk5NjBfY2dlbl9vcHZhbF9oX2NjOworCisjZGVmaW5lIENHRU5fSU5JVF9QQVJTRShvZCkgXAore1wKK30KKyNkZWZpbmUgQ0dFTl9JTklUX0lOU0VSVChvZCkgXAore1wKK30KKyNkZWZpbmUgQ0dFTl9JTklUX0VYVFJBQ1Qob2QpIFwKK3tcCit9CisjZGVmaW5lIENHRU5fSU5JVF9QUklOVChvZCkgXAore1wKK30KKworCisKKyNlbmRpZiAvKiBJOTYwX0NQVV9IICovCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9pOTYwLW9wYy5oIGIvc2ltL2k5NjAvaTk2MC1vcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDU0YWIzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2k5NjAvaTk2MC1vcGMuaApAQCAtMCwwICsxLDE1NiBAQAorLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIGhlYWRlciBmb3IgaTk2MC4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2lmbmRlZiBJOTYwX09QQ19ICisjZGVmaW5lIEk5NjBfT1BDX0gKKworLyogLS0gb3BjLmggKi8KKworI3VuZGVmIENHRU5fRElTX0hBU0hfU0laRQorI2RlZmluZSBDR0VOX0RJU19IQVNIX1NJWkUgMjU2CisjdW5kZWYgQ0dFTl9ESVNfSEFTSAorI2RlZmluZSBDR0VOX0RJU19IQVNIKGJ1ZmZlciwgdmFsdWUpICgodW5zaWduZWQgY2hhciAqKSAoYnVmZmVyKSlbM10KKworLyogPz8/IFVudGlsIGNnZW4gZGlzYXNzZW1ibGVyIGNvbXBsZXRlIGFuZCBmdW5jdGlvbmluZyB3ZWxsLCByZWRpcmVjdCBiYWNrCisgICB0byBvbGQgZGlzYXNzZW1ibGVyLiAgKi8KKyNkZWZpbmUgQ0dFTl9QUklOVF9JTlNOKG9kLCBwYywgaW5mbykgcHJpbnRfaW5zbl9pOTYwX29yaWcgKHBjLCBpbmZvKQorCisvKiAtLSAqLworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaTk2MCBpbnN0cnVjdGlvbiB0eXBlcy4gICovCit0eXBlZGVmIGVudW0gY2dlbl9pbnNuX3R5cGUgeworICBJOTYwX0lOU05fSU5WQUxJRCwgSTk2MF9JTlNOX01VTE8sIEk5NjBfSU5TTl9NVUxPMSwgSTk2MF9JTlNOX01VTE8yCisgLCBJOTYwX0lOU05fTVVMTzMsIEk5NjBfSU5TTl9SRU1PLCBJOTYwX0lOU05fUkVNTzEsIEk5NjBfSU5TTl9SRU1PMgorICwgSTk2MF9JTlNOX1JFTU8zLCBJOTYwX0lOU05fRElWTywgSTk2MF9JTlNOX0RJVk8xLCBJOTYwX0lOU05fRElWTzIKKyAsIEk5NjBfSU5TTl9ESVZPMywgSTk2MF9JTlNOX1JFTUksIEk5NjBfSU5TTl9SRU1JMSwgSTk2MF9JTlNOX1JFTUkyCisgLCBJOTYwX0lOU05fUkVNSTMsIEk5NjBfSU5TTl9ESVZJLCBJOTYwX0lOU05fRElWSTEsIEk5NjBfSU5TTl9ESVZJMgorICwgSTk2MF9JTlNOX0RJVkkzLCBJOTYwX0lOU05fQURETywgSTk2MF9JTlNOX0FERE8xLCBJOTYwX0lOU05fQURETzIKKyAsIEk5NjBfSU5TTl9BRERPMywgSTk2MF9JTlNOX1NVQk8sIEk5NjBfSU5TTl9TVUJPMSwgSTk2MF9JTlNOX1NVQk8yCisgLCBJOTYwX0lOU05fU1VCTzMsIEk5NjBfSU5TTl9OT1RCSVQsIEk5NjBfSU5TTl9OT1RCSVQxLCBJOTYwX0lOU05fTk9UQklUMgorICwgSTk2MF9JTlNOX05PVEJJVDMsIEk5NjBfSU5TTl9BTkQsIEk5NjBfSU5TTl9BTkQxLCBJOTYwX0lOU05fQU5EMgorICwgSTk2MF9JTlNOX0FORDMsIEk5NjBfSU5TTl9BTkROT1QsIEk5NjBfSU5TTl9BTkROT1QxLCBJOTYwX0lOU05fQU5ETk9UMgorICwgSTk2MF9JTlNOX0FORE5PVDMsIEk5NjBfSU5TTl9TRVRCSVQsIEk5NjBfSU5TTl9TRVRCSVQxLCBJOTYwX0lOU05fU0VUQklUMgorICwgSTk2MF9JTlNOX1NFVEJJVDMsIEk5NjBfSU5TTl9OT1RBTkQsIEk5NjBfSU5TTl9OT1RBTkQxLCBJOTYwX0lOU05fTk9UQU5EMgorICwgSTk2MF9JTlNOX05PVEFORDMsIEk5NjBfSU5TTl9YT1IsIEk5NjBfSU5TTl9YT1IxLCBJOTYwX0lOU05fWE9SMgorICwgSTk2MF9JTlNOX1hPUjMsIEk5NjBfSU5TTl9PUiwgSTk2MF9JTlNOX09SMSwgSTk2MF9JTlNOX09SMgorICwgSTk2MF9JTlNOX09SMywgSTk2MF9JTlNOX05PUiwgSTk2MF9JTlNOX05PUjEsIEk5NjBfSU5TTl9OT1IyCisgLCBJOTYwX0lOU05fTk9SMywgSTk2MF9JTlNOX05PVCwgSTk2MF9JTlNOX05PVDEsIEk5NjBfSU5TTl9OT1QyCisgLCBJOTYwX0lOU05fTk9UMywgSTk2MF9JTlNOX0NMUkJJVCwgSTk2MF9JTlNOX0NMUkJJVDEsIEk5NjBfSU5TTl9DTFJCSVQyCisgLCBJOTYwX0lOU05fQ0xSQklUMywgSTk2MF9JTlNOX1NITE8sIEk5NjBfSU5TTl9TSExPMSwgSTk2MF9JTlNOX1NITE8yCisgLCBJOTYwX0lOU05fU0hMTzMsIEk5NjBfSU5TTl9TSFJPLCBJOTYwX0lOU05fU0hSTzEsIEk5NjBfSU5TTl9TSFJPMgorICwgSTk2MF9JTlNOX1NIUk8zLCBJOTYwX0lOU05fU0hMSSwgSTk2MF9JTlNOX1NITEkxLCBJOTYwX0lOU05fU0hMSTIKKyAsIEk5NjBfSU5TTl9TSExJMywgSTk2MF9JTlNOX1NIUkksIEk5NjBfSU5TTl9TSFJJMSwgSTk2MF9JTlNOX1NIUkkyCisgLCBJOTYwX0lOU05fU0hSSTMsIEk5NjBfSU5TTl9FTVVMLCBJOTYwX0lOU05fRU1VTDEsIEk5NjBfSU5TTl9FTVVMMgorICwgSTk2MF9JTlNOX0VNVUwzLCBJOTYwX0lOU05fTU9WLCBJOTYwX0lOU05fTU9WMSwgSTk2MF9JTlNOX01PVkwKKyAsIEk5NjBfSU5TTl9NT1ZMMSwgSTk2MF9JTlNOX01PVlQsIEk5NjBfSU5TTl9NT1ZUMSwgSTk2MF9JTlNOX01PVlEKKyAsIEk5NjBfSU5TTl9NT1ZRMSwgSTk2MF9JTlNOX01PRFBDLCBJOTYwX0lOU05fTU9EQUMsIEk5NjBfSU5TTl9MREFfT0ZGU0VUCisgLCBJOTYwX0lOU05fTERBX0lORElSRUNUX09GRlNFVCwgSTk2MF9JTlNOX0xEQV9JTkRJUkVDVCwgSTk2MF9JTlNOX0xEQV9JTkRJUkVDVF9JTkRFWCwgSTk2MF9JTlNOX0xEQV9ESVNQCisgLCBJOTYwX0lOU05fTERBX0lORElSRUNUX0RJU1AsIEk5NjBfSU5TTl9MREFfSU5ERVhfRElTUCwgSTk2MF9JTlNOX0xEQV9JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwX0lOU05fTERfT0ZGU0VUCisgLCBJOTYwX0lOU05fTERfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwX0lOU05fTERfSU5ESVJFQ1QsIEk5NjBfSU5TTl9MRF9JTkRJUkVDVF9JTkRFWCwgSTk2MF9JTlNOX0xEX0RJU1AKKyAsIEk5NjBfSU5TTl9MRF9JTkRJUkVDVF9ESVNQLCBJOTYwX0lOU05fTERfSU5ERVhfRElTUCwgSTk2MF9JTlNOX0xEX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9MRE9CX09GRlNFVAorICwgSTk2MF9JTlNOX0xET0JfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwX0lOU05fTERPQl9JTkRJUkVDVCwgSTk2MF9JTlNOX0xET0JfSU5ESVJFQ1RfSU5ERVgsIEk5NjBfSU5TTl9MRE9CX0RJU1AKKyAsIEk5NjBfSU5TTl9MRE9CX0lORElSRUNUX0RJU1AsIEk5NjBfSU5TTl9MRE9CX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9MRE9CX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9MRE9TX09GRlNFVAorICwgSTk2MF9JTlNOX0xET1NfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwX0lOU05fTERPU19JTkRJUkVDVCwgSTk2MF9JTlNOX0xET1NfSU5ESVJFQ1RfSU5ERVgsIEk5NjBfSU5TTl9MRE9TX0RJU1AKKyAsIEk5NjBfSU5TTl9MRE9TX0lORElSRUNUX0RJU1AsIEk5NjBfSU5TTl9MRE9TX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9MRE9TX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9MRElCX09GRlNFVAorICwgSTk2MF9JTlNOX0xESUJfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwX0lOU05fTERJQl9JTkRJUkVDVCwgSTk2MF9JTlNOX0xESUJfSU5ESVJFQ1RfSU5ERVgsIEk5NjBfSU5TTl9MRElCX0RJU1AKKyAsIEk5NjBfSU5TTl9MRElCX0lORElSRUNUX0RJU1AsIEk5NjBfSU5TTl9MRElCX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9MRElCX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9MRElTX09GRlNFVAorICwgSTk2MF9JTlNOX0xESVNfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwX0lOU05fTERJU19JTkRJUkVDVCwgSTk2MF9JTlNOX0xESVNfSU5ESVJFQ1RfSU5ERVgsIEk5NjBfSU5TTl9MRElTX0RJU1AKKyAsIEk5NjBfSU5TTl9MRElTX0lORElSRUNUX0RJU1AsIEk5NjBfSU5TTl9MRElTX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9MRElTX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9MRExfT0ZGU0VUCisgLCBJOTYwX0lOU05fTERMX0lORElSRUNUX09GRlNFVCwgSTk2MF9JTlNOX0xETF9JTkRJUkVDVCwgSTk2MF9JTlNOX0xETF9JTkRJUkVDVF9JTkRFWCwgSTk2MF9JTlNOX0xETF9ESVNQCisgLCBJOTYwX0lOU05fTERMX0lORElSRUNUX0RJU1AsIEk5NjBfSU5TTl9MRExfSU5ERVhfRElTUCwgSTk2MF9JTlNOX0xETF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwX0lOU05fTERUX09GRlNFVAorICwgSTk2MF9JTlNOX0xEVF9JTkRJUkVDVF9PRkZTRVQsIEk5NjBfSU5TTl9MRFRfSU5ESVJFQ1QsIEk5NjBfSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVgsIEk5NjBfSU5TTl9MRFRfRElTUAorICwgSTk2MF9JTlNOX0xEVF9JTkRJUkVDVF9ESVNQLCBJOTYwX0lOU05fTERUX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MF9JTlNOX0xEUV9PRkZTRVQKKyAsIEk5NjBfSU5TTl9MRFFfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwX0lOU05fTERRX0lORElSRUNULCBJOTYwX0lOU05fTERRX0lORElSRUNUX0lOREVYLCBJOTYwX0lOU05fTERRX0RJU1AKKyAsIEk5NjBfSU5TTl9MRFFfSU5ESVJFQ1RfRElTUCwgSTk2MF9JTlNOX0xEUV9JTkRFWF9ESVNQLCBJOTYwX0lOU05fTERRX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9TVF9PRkZTRVQKKyAsIEk5NjBfSU5TTl9TVF9JTkRJUkVDVF9PRkZTRVQsIEk5NjBfSU5TTl9TVF9JTkRJUkVDVCwgSTk2MF9JTlNOX1NUX0lORElSRUNUX0lOREVYLCBJOTYwX0lOU05fU1RfRElTUAorICwgSTk2MF9JTlNOX1NUX0lORElSRUNUX0RJU1AsIEk5NjBfSU5TTl9TVF9JTkRFWF9ESVNQLCBJOTYwX0lOU05fU1RfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MF9JTlNOX1NUT0JfT0ZGU0VUCisgLCBJOTYwX0lOU05fU1RPQl9JTkRJUkVDVF9PRkZTRVQsIEk5NjBfSU5TTl9TVE9CX0lORElSRUNULCBJOTYwX0lOU05fU1RPQl9JTkRJUkVDVF9JTkRFWCwgSTk2MF9JTlNOX1NUT0JfRElTUAorICwgSTk2MF9JTlNOX1NUT0JfSU5ESVJFQ1RfRElTUCwgSTk2MF9JTlNOX1NUT0JfSU5ERVhfRElTUCwgSTk2MF9JTlNOX1NUT0JfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MF9JTlNOX1NUT1NfT0ZGU0VUCisgLCBJOTYwX0lOU05fU1RPU19JTkRJUkVDVF9PRkZTRVQsIEk5NjBfSU5TTl9TVE9TX0lORElSRUNULCBJOTYwX0lOU05fU1RPU19JTkRJUkVDVF9JTkRFWCwgSTk2MF9JTlNOX1NUT1NfRElTUAorICwgSTk2MF9JTlNOX1NUT1NfSU5ESVJFQ1RfRElTUCwgSTk2MF9JTlNOX1NUT1NfSU5ERVhfRElTUCwgSTk2MF9JTlNOX1NUT1NfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MF9JTlNOX1NUTF9PRkZTRVQKKyAsIEk5NjBfSU5TTl9TVExfSU5ESVJFQ1RfT0ZGU0VULCBJOTYwX0lOU05fU1RMX0lORElSRUNULCBJOTYwX0lOU05fU1RMX0lORElSRUNUX0lOREVYLCBJOTYwX0lOU05fU1RMX0RJU1AKKyAsIEk5NjBfSU5TTl9TVExfSU5ESVJFQ1RfRElTUCwgSTk2MF9JTlNOX1NUTF9JTkRFWF9ESVNQLCBJOTYwX0lOU05fU1RMX0lORElSRUNUX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9TVFRfT0ZGU0VUCisgLCBJOTYwX0lOU05fU1RUX0lORElSRUNUX09GRlNFVCwgSTk2MF9JTlNOX1NUVF9JTkRJUkVDVCwgSTk2MF9JTlNOX1NUVF9JTkRJUkVDVF9JTkRFWCwgSTk2MF9JTlNOX1NUVF9ESVNQCisgLCBJOTYwX0lOU05fU1RUX0lORElSRUNUX0RJU1AsIEk5NjBfSU5TTl9TVFRfSU5ERVhfRElTUCwgSTk2MF9JTlNOX1NUVF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBJOTYwX0lOU05fU1RRX09GRlNFVAorICwgSTk2MF9JTlNOX1NUUV9JTkRJUkVDVF9PRkZTRVQsIEk5NjBfSU5TTl9TVFFfSU5ESVJFQ1QsIEk5NjBfSU5TTl9TVFFfSU5ESVJFQ1RfSU5ERVgsIEk5NjBfSU5TTl9TVFFfRElTUAorICwgSTk2MF9JTlNOX1NUUV9JTkRJUkVDVF9ESVNQLCBJOTYwX0lOU05fU1RRX0lOREVYX0RJU1AsIEk5NjBfSU5TTl9TVFFfSU5ESVJFQ1RfSU5ERVhfRElTUCwgSTk2MF9JTlNOX0NNUE9CRV9SRUcKKyAsIEk5NjBfSU5TTl9DTVBPQkVfTElULCBJOTYwX0lOU05fQ01QT0JORV9SRUcsIEk5NjBfSU5TTl9DTVBPQk5FX0xJVCwgSTk2MF9JTlNOX0NNUE9CTF9SRUcKKyAsIEk5NjBfSU5TTl9DTVBPQkxfTElULCBJOTYwX0lOU05fQ01QT0JMRV9SRUcsIEk5NjBfSU5TTl9DTVBPQkxFX0xJVCwgSTk2MF9JTlNOX0NNUE9CR19SRUcKKyAsIEk5NjBfSU5TTl9DTVBPQkdfTElULCBJOTYwX0lOU05fQ01QT0JHRV9SRUcsIEk5NjBfSU5TTl9DTVBPQkdFX0xJVCwgSTk2MF9JTlNOX0NNUElCRV9SRUcKKyAsIEk5NjBfSU5TTl9DTVBJQkVfTElULCBJOTYwX0lOU05fQ01QSUJORV9SRUcsIEk5NjBfSU5TTl9DTVBJQk5FX0xJVCwgSTk2MF9JTlNOX0NNUElCTF9SRUcKKyAsIEk5NjBfSU5TTl9DTVBJQkxfTElULCBJOTYwX0lOU05fQ01QSUJMRV9SRUcsIEk5NjBfSU5TTl9DTVBJQkxFX0xJVCwgSTk2MF9JTlNOX0NNUElCR19SRUcKKyAsIEk5NjBfSU5TTl9DTVBJQkdfTElULCBJOTYwX0lOU05fQ01QSUJHRV9SRUcsIEk5NjBfSU5TTl9DTVBJQkdFX0xJVCwgSTk2MF9JTlNOX0JCQ19SRUcKKyAsIEk5NjBfSU5TTl9CQkNfTElULCBJOTYwX0lOU05fQkJTX1JFRywgSTk2MF9JTlNOX0JCU19MSVQsIEk5NjBfSU5TTl9DTVBJCisgLCBJOTYwX0lOU05fQ01QSTEsIEk5NjBfSU5TTl9DTVBJMiwgSTk2MF9JTlNOX0NNUEkzLCBJOTYwX0lOU05fQ01QTworICwgSTk2MF9JTlNOX0NNUE8xLCBJOTYwX0lOU05fQ01QTzIsIEk5NjBfSU5TTl9DTVBPMywgSTk2MF9JTlNOX1RFU1ROT19SRUcKKyAsIEk5NjBfSU5TTl9URVNUR19SRUcsIEk5NjBfSU5TTl9URVNURV9SRUcsIEk5NjBfSU5TTl9URVNUR0VfUkVHLCBJOTYwX0lOU05fVEVTVExfUkVHCisgLCBJOTYwX0lOU05fVEVTVE5FX1JFRywgSTk2MF9JTlNOX1RFU1RMRV9SRUcsIEk5NjBfSU5TTl9URVNUT19SRUcsIEk5NjBfSU5TTl9CTk8KKyAsIEk5NjBfSU5TTl9CRywgSTk2MF9JTlNOX0JFLCBJOTYwX0lOU05fQkdFLCBJOTYwX0lOU05fQkwKKyAsIEk5NjBfSU5TTl9CTkUsIEk5NjBfSU5TTl9CTEUsIEk5NjBfSU5TTl9CTywgSTk2MF9JTlNOX0IKKyAsIEk5NjBfSU5TTl9CWF9JTkRJUkVDVF9PRkZTRVQsIEk5NjBfSU5TTl9CWF9JTkRJUkVDVCwgSTk2MF9JTlNOX0JYX0lORElSRUNUX0lOREVYLCBJOTYwX0lOU05fQlhfRElTUAorICwgSTk2MF9JTlNOX0JYX0lORElSRUNUX0RJU1AsIEk5NjBfSU5TTl9DQUxMWF9ESVNQLCBJOTYwX0lOU05fQ0FMTFhfSU5ESVJFQ1QsIEk5NjBfSU5TTl9DQUxMWF9JTkRJUkVDVF9PRkZTRVQKKyAsIEk5NjBfSU5TTl9SRVQsIEk5NjBfSU5TTl9DQUxMUywgSTk2MF9JTlNOX0ZNQVJLLCBJOTYwX0lOU05fRkxVU0hSRUcKKyAsIEk5NjBfSU5TTl9NQVgKK30gQ0dFTl9JTlNOX1RZUEU7CisKKy8qIEluZGV4IG9mIGBpbnZhbGlkJyBpbnNuIHBsYWNlIGhvbGRlci4gICovCisjZGVmaW5lIENHRU5fSU5TTl9JTlZBTElEIEk5NjBfSU5TTl9JTlZBTElECisKKy8qIFRvdGFsIG51bWJlciBvZiBpbnNucyBpbiB0YWJsZS4gICovCisjZGVmaW5lIE1BWF9JTlNOUyAoKGludCkgSTk2MF9JTlNOX01BWCkKKworLyogVGhpcyBzdHJ1Y3QgcmVjb3JkcyBkYXRhIHByaW9yIHRvIGluc2VydGlvbiBvciBhZnRlciBleHRyYWN0aW9uLiAgKi8KK3N0cnVjdCBjZ2VuX2ZpZWxkcworeworICBpbnQgbGVuZ3RoOworICBsb25nIGZfbmlsOworICBsb25nIGZfb3Bjb2RlOworICBsb25nIGZfc3JjZHN0OworICBsb25nIGZfc3JjMjsKKyAgbG9uZyBmX20zOworICBsb25nIGZfbTI7CisgIGxvbmcgZl9tMTsKKyAgbG9uZyBmX29wY29kZTI7CisgIGxvbmcgZl96ZXJvOworICBsb25nIGZfc3JjMTsKKyAgbG9uZyBmX2FiYXNlOworICBsb25nIGZfbW9kZWE7CisgIGxvbmcgZl96ZXJvYTsKKyAgbG9uZyBmX29mZnNldDsKKyAgbG9uZyBmX21vZGViOworICBsb25nIGZfc2NhbGU7CisgIGxvbmcgZl96ZXJvYjsKKyAgbG9uZyBmX2luZGV4OworICBsb25nIGZfb3B0ZGlzcDsKKyAgbG9uZyBmX2JyX3NyYzE7CisgIGxvbmcgZl9icl9zcmMyOworICBsb25nIGZfYnJfbTE7CisgIGxvbmcgZl9icl9kaXNwOworICBsb25nIGZfYnJfemVybzsKKyAgbG9uZyBmX2N0cmxfZGlzcDsKKyAgbG9uZyBmX2N0cmxfemVybzsKK307CisKKworCisjZW5kaWYgLyogSTk2MF9PUENfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvaTk2MC1zaW0uaCBiL3NpbS9pOTYwL2k5NjAtc2ltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3OTRkYQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9pOTYwL2k5NjAtc2ltLmgKQEAgLTAsMCArMSw0OSBAQAorI2lmbmRlZiBJOTYwX1NJTV9ICisjZGVmaW5lIEk5NjBfU0lNX0gKKworLyogZ2RiIHJlZ2lzdGVyIG51bWJlcnMgKi8KKy8qIENvcGllZCBmcm9tIGdkYi9jb25maWcvaTk2MC90Yy1pOTYwLmguICAqLworI2RlZmluZSBQQ1dfUkVHTlVNIDMyICAgLyogcHJvY2VzcyBjb250cm9sIHdvcmQgKi8KKyNkZWZpbmUgQUNXX1JFR05VTSAzMyAgIC8qIGFyaXRobWV0aWMgY29udHJvbCB3b3JkICovCisjZGVmaW5lIFRDV19SRUdOVU0gMzQgICAvKiB0cmFjZSBjb250cm9sIHdvcmQgKi8KKyNkZWZpbmUgSVBfUkVHTlVNICAzNSAgIC8qIGluc3RydWN0aW9uIHBvaW50ZXIgKi8KKyNkZWZpbmUgRlAwX1JFR05VTSAzNiAgIC8qIEZpcnN0IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyICovCisvKiBTb21lIHJlZ2lzdGVycyBoYXZlIG1vcmUgdGhhbiBvbmUgbmFtZSAqLworI2RlZmluZSBQQ19SRUdOVU0gIElQX1JFR05VTSAgICAvKiBHREIgcmVmZXJzIHRvIGlwIGFzIHRoZSBQcm9ncmFtIENvdW50ZXIgKi8KKwwKKyNkZWZpbmUgR0VUVFdJIEdFVFRTSQorI2RlZmluZSBTRVRUV0kgU0VUVFNJCisMCisvKiBFeGNlcHRpb24sIEludGVycnVwdCwgYW5kIFRyYXAgYWRkcmVzc2VzICovCisvKiA/Pz8gSGFjayBmb3IgdHJhcHMuYy4gICovCisjZGVmaW5lIEVJVF9UUkFQX0JBU0VfQUREUgkweDQwCisKKy8qIFNwZWNpYWwgcHVycG9zZSB0cmFwcy4gICovCisvKiA/Pz8gSGFjayBmb3IgdHJhcHMuYy4gICovCisjZGVmaW5lIFRSQVBfU1lTQ0FMTAkwCisjZGVmaW5lIFRSQVBfQlJFQUtQT0lOVAkxCisKKy8qIENhY2hlIFB1cmdlIENvbnRyb2wgKG9ubHkgZXhpc3RzIG9uIGVhcmx5IHZlcnNpb25zIG9mIGNoaXBzKSAqLworLyogPz8/IEhhY2sgZm9yIGRldmljZXMuYy4gICovCisjZGVmaW5lIE1TUFJfQUREUiAweGZmZmZmZmY3CisjZGVmaW5lIE1TUFJfUFVSR0UgMQorCisvKiBDYWNoZSBDb250cm9sIFJlZ2lzdGVyICovCisvKiA/Pz8gSGFjayBmb3IgZGV2aWNlcy5jLiAgKi8KKyNkZWZpbmUgTUNDUl9BRERSIDB4ZmZmZmZmZmYKKyNkZWZpbmUgTUNDUl9DUCAweDgwCisKKy8qIFN0YXJ0IGFkZHJlc3MgYW5kIGxlbmd0aCBvZiBhbGwgZGV2aWNlIHN1cHBvcnQuICAqLworLyogPz8/IEhhY2sgZm9yIHNpbS1pZi5jLiAgKi8KKyNkZWZpbmUgSTk2MF9ERVZJQ0VfQUREUgkweGZmMDAwMDAwCisjZGVmaW5lIEk5NjBfREVWSUNFX0xFTgkJMHgwMGZmZmZmZgorCisvKiBzaW1fY29yZV9hdHRhY2ggZGV2aWNlIGFyZ3VtZW50LiAgKi8KKy8qID8/PyBIYWNrIGZvciBzaW0taWYuYy4gICovCitleHRlcm4gZGV2aWNlIGk5NjBfZGV2aWNlczsKKworLyogRklYTUU6IFRlbXBvcmFyeSwgdW50aWwgZGV2aWNlIHN1cHBvcnQgcmVhZHkuICAqLworLyogPz8/IEhhY2sgZm9yIGRldmljZXMuYy4gICovCitzdHJ1Y3QgX2RldmljZSB7IGludCBmb287IH07CisKKyNlbmRpZiBJOTYwX1NJTV9ICmRpZmYgLS1naXQgYS9zaW0vaTk2MC9pOTYwLmMgYi9zaW0vaTk2MC9pOTYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczN2M1MgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9pOTYwL2k5NjAuYwpAQCAtMCwwICsxLDE0MSBAQAorLyogaTk2MCBzaW11bGF0b3Igc3VwcG9ydCBjb2RlCisgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFdBTlRfQ1BVCisjZGVmaW5lIFdBTlRfQ1BVX0k5NjBCQVNFCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2luY2x1ZGUgImNnZW4tbWVtLmgiCisjaW5jbHVkZSAiY2dlbi1vcHMuaCIKKworLyogVGhlIGNvbnRlbnRzIG9mIEJVRiBhcmUgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuICAqLworCitpbnQKK2k5NjBiYXNlX2ZldGNoX3JlZ2lzdGVyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgaW50IHJuLCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkgaW50IGxlbikKK3sKKyAgaWYgKHJuIDwgMzIpCisgICAgU0VUVFdJIChidWYsIGFfaTk2MF9oX2dyX2dldCAoY3VycmVudF9jcHUsIHJuKSk7CisgIGVsc2UKKyAgICBzd2l0Y2ggKHJuKQorICAgICAgeworICAgICAgY2FzZSBQQ19SRUdOVU0gOgorCVNFVFRXSSAoYnVmLCBhX2k5NjBfaF9wY19nZXQgKGN1cnJlbnRfY3B1KSk7CisJYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICByZXR1cm4gLTE7IC8qRklYTUUqLworCit9CisKKy8qIFRoZSBjb250ZW50cyBvZiBCVUYgYXJlIGluIHRhcmdldCBieXRlIG9yZGVyLiAgKi8KKworaW50CitpOTYwYmFzZV9zdG9yZV9yZWdpc3RlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIGludCBybiwgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJIGludCBsZW4pCit7CisgIGlmIChybiA8IDMyKQorICAgIGFfaTk2MF9oX2dyX3NldCAoY3VycmVudF9jcHUsIHJuLCBHRVRUV0kgKGJ1ZikpOworICBlbHNlCisgICAgc3dpdGNoIChybikKKyAgICAgIHsKKyAgICAgIGNhc2UgUENfUkVHTlVNIDoKKwlhX2k5NjBfaF9wY19zZXQgKGN1cnJlbnRfY3B1LCBHRVRUV0kgKGJ1ZikpOworCWJyZWFrOworICAgICAgZGVmYXVsdCA6CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgcmV0dXJuIC0xOyAvKkZJWE1FKi8KK30KKwwKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorCisvKiBGSVhNRTogU29tZSBvZiB0aGVzZSBzaG91bGQgYmUgaW5saW5lIG9yIG1hY3Jvcy4gIExhdGVyLiAgKi8KKworLyogSW5pdGlhbGl6ZSBjeWNsZSBjb3VudGluZyBmb3IgYW4gaW5zbi4KKyAgIEZJUlNUX1AgaXMgbm9uLXplcm8gaWYgdGhpcyBpcyB0aGUgZmlyc3QgaW5zbiBpbiBhIHNldCBvZiBwYXJhbGxlbAorICAgaW5zbnMuICAqLworCit2b2lkCitpOTYwYmFzZV9tb2RlbF9pbnNuX2JlZm9yZSAoU0lNX0NQVSAqY3B1LCBpbnQgZmlyc3RfcCkKK3sKK30KKworLyogUmVjb3JkIHRoZSBjeWNsZXMgY29tcHV0ZWQgZm9yIGFuIGluc24uCisgICBMQVNUX1AgaXMgbm9uLXplcm8gaWYgdGhpcyBpcyB0aGUgbGFzdCBpbnNuIGluIGEgc2V0IG9mIHBhcmFsbGVsIGluc25zLAorICAgYW5kIHdlIHVwZGF0ZSB0aGUgdG90YWwgY3ljbGUgY291bnQuCisgICBDWUNMRVMgaXMgdGhlIGN5Y2xlIGNvdW50IG9mIHRoZSBpbnNuLiAgKi8KKwordm9pZAoraTk2MGJhc2VfbW9kZWxfaW5zbl9hZnRlciAoU0lNX0NQVSAqY3B1LCBpbnQgbGFzdF9wLCBpbnQgY3ljbGVzKQoreworfQorCisvKiBJbml0aWFsaXplIGN5Y2xlIGNvdW50aW5nIGZvciBhbiBpbnNuLgorICAgRklSU1RfUCBpcyBub24temVybyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBpbnNuIGluIGEgc2V0IG9mIHBhcmFsbGVsCisgICBpbnNucy4gICovCisKK3ZvaWQKK2k5NjBfbW9kZWxfaW5pdF9pbnNuX2N5Y2xlcyAoU0lNX0NQVSAqY3B1LCBpbnQgZmlyc3RfcCkKK3sKK30KKworLyogUmVjb3JkIHRoZSBjeWNsZXMgY29tcHV0ZWQgZm9yIGFuIGluc24uCisgICBMQVNUX1AgaXMgbm9uLXplcm8gaWYgdGhpcyBpcyB0aGUgbGFzdCBpbnNuIGluIGEgc2V0IG9mIHBhcmFsbGVsIGluc25zLAorICAgYW5kIHdlIHVwZGF0ZSB0aGUgdG90YWwgY3ljbGUgY291bnQuICAqLworCit2b2lkCitpOTYwX21vZGVsX3VwZGF0ZV9pbnNuX2N5Y2xlcyAoU0lNX0NQVSAqY3B1LCBpbnQgbGFzdF9wKQoreworfQorCit2b2lkCitpOTYwX21vZGVsX3JlY29yZF9jeWNsZXMgKFNJTV9DUFUgKmNwdSwgdW5zaWduZWQgbG9uZyBjeWNsZXMpCit7Cit9CisKK3ZvaWQKK2k5NjBiYXNlX21vZGVsX21hcmtfZ2V0X2hfZ3IgKFNJTV9DUFUgKmNwdSwgQVJHQlVGICphYnVmKQoreworfQorCit2b2lkCitpOTYwYmFzZV9tb2RlbF9tYXJrX3NldF9oX2dyIChTSU1fQ1BVICpjcHUsIEFSR0JVRiAqYWJ1ZikKK3sKK30KKworI2VuZGlmIC8qIFdJVEhfUFJPRklMRV9NT0RFTF9QICovCisMCitpbnQKK2k5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKFNJTV9DUFUgKmNwdSwgY29uc3QgSURFU0MgKmlkZXNjLAorCQkJICAgaW50IHVuaXRfbnVtLCBpbnQgcmVmZXJlbmNlZCkKK3sKKyAgcmV0dXJuIGlkZXNjLT50aW1pbmctPnVuaXRzW3VuaXRfbnVtXS5kb25lOworfQorCitpbnQKK2k5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKFNJTV9DUFUgKmNwdSwgY29uc3QgSURFU0MgKmlkZXNjLAorCQkJICAgaW50IHVuaXRfbnVtLCBpbnQgcmVmZXJlbmNlZCkKK3sKKyAgcmV0dXJuIGlkZXNjLT50aW1pbmctPnVuaXRzW3VuaXRfbnVtXS5kb25lOworfQpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvbWxvb3AuaW4gYi9zaW0vaTk2MC9tbG9vcC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTNhZDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2k5NjAvbWxvb3AuaW4KQEAgLTAsMCArMSwzMDEgQEAKKyMgU2ltdWxhdG9yIG1haW4gbG9vcCBmb3IgaTk2MC4gLSotIEMgLSotCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIFN5bnRheDoKKyMgL2Jpbi9zaCBtYWlubG9vcC5pbiBjb21tYW5kCisjCisjIENvbW1hbmQgaXMgb25lIG9mOgorIworIyBpbml0CisjIHN1cHBvcnQKKyMgZXh0cmFjdC17c2ltcGxlLHNjYWNoZSxwYmJ9CisjIHtmdWxsLGZhc3R9LWV4ZWMte3NpbXBsZSxzY2FjaGUscGJifQorIworIyBBIHRhcmdldCBuZWVkIG9ubHkgcHJvdmlkZSBhICJmdWxsIiB2ZXJzaW9uIG9mIG9uZSBvZiBzaW1wbGUsc2NhY2hlLHBiYi4KKyMgSWYgdGhlIHRhcmdldCB3YW50cyBpdCBjYW4gYWxzbyBwcm92aWRlIGEgZmFzdCB2ZXJzaW9uIG9mIHNhbWUuCisjIEl0IGNhbid0IHByb3ZpZGUgbW9yZSB0aGFuIHRoaXMsIGhvd2V2ZXIgZm9yIGlsbHVzdHJhdGlvbidzIHNha2UgdGhlIE0zMlIKKyMgcG9ydCBwcm92aWRlcyBleGFtcGxlcyBvZiBhbGwuCisKKyMgPz8/IEFmdGVyIGEgZmV3IG1vcmUgcG9ydHMgYXJlIGRvbmUsIHJldmlzaXQuCisjIFdpbGwgZXZlbnR1YWxseSBuZWVkIHRvIG1hY2hpbmUgZ2VuZXJhdGUgYSBsb3Qgb2YgdGhpcy4KKworY2FzZSAieCQxIiBpbgorCit4c3VwcG9ydCkKKworY2F0IDw8RU9GCisKKy8qc3RhdGljIElOTElORSovIGNvbnN0IElERVNDICoKK2V4dHJhY3QzMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFBDQUREUiBwYywgQ0dFTl9JTlNOX0lOVCBpbnNuLAorCSAgIEFSR0JVRiAqYWJ1ZiwgaW50IGZhc3RfcCkKK3sKKyAgLyogPz8/IHdpbHNvbiwgaW5zdHJ1Y3Rpb25zIGFyZSAzMiBiaXRzLiAgKi8KKyAgY29uc3QgSURFU0MgKmQgPSBAY3B1QF9kZWNvZGUgKGN1cnJlbnRfY3B1LCBwYywgKFVTSSkgaW5zbiwgYWJ1Zik7CisgIEBjcHVAX2ZpbGxfYXJnYnVmIChjdXJyZW50X2NwdSwgYWJ1ZiwgZCwgcGMsIGZhc3RfcCk7CisgIGlmICghIGZhc3RfcCkKKyAgICB7CisgICAgICBpbnQgdHJhY2VfcCA9IFBDX0lOX1RSQUNFX1JBTkdFX1AgKGN1cnJlbnRfY3B1LCBwYyk7CisgICAgICBpbnQgcHJvZmlsZV9wID0gUENfSU5fUFJPRklMRV9SQU5HRV9QIChjdXJyZW50X2NwdSwgcGMpOworICAgICAgQGNwdUBfZmlsbF9hcmdidWZfdHAgKGN1cnJlbnRfY3B1LCBhYnVmLCB0cmFjZV9wLCBwcm9maWxlX3ApOworICAgIH0KKyAgcmV0dXJuIGQ7Cit9CisKKyNpZiAwCisvKnN0YXRpYyBJTkxJTkUqLyBjb25zdCBJREVTQyAqCisvKiA/Pz8gd2lsc29uLCBTb21lIGluc3RydWN0aW9ucyBhcmUgNjQgYml0cy4gICovCitleHRyYWN0NjQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBQQ0FERFIgcGMsIGluc25fdCBpbnNuLAorCSAgIEFSR0JVRiAqYWJ1ZiwgaW50IGZhc3RfcCkKK3sKKyAgY29uc3QgSURFU0MgKmQgPSBAY3B1QF9kZWNvZGUgKGN1cnJlbnRfY3B1LCBwYywgKFVESSkgaW5zbiA+PiAzMiwgYWJ1Zik7CisgIFNFTV9TRVRfQ09ERSAoYWJ1ZiwgZCwgZmFzdF9wKTsKKyAgYWJ1Zi0+aWRlc2MgPSBkOworICBhYnVmLT5hZGRyID0gcGM7CisgIHJldHVybiBkOworfQorI2VuZGlmCisKK3N0YXRpYyBJTkxJTkUgU0VNX1BDCitleGVjdXRlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0NBQ0hFICpzYywgaW50IGZhc3RfcCkKK3sKKyAgU0VNX1BDIHZwYzsKKworICBpZiAoZmFzdF9wKQorICAgIHsKKyNpZiAhIFdJVEhfU0VNX1NXSVRDSF9GQVNUCisjaWYgV0lUSF9TQ0FDSEUKKyAgICAgIHZwYyA9ICgqc2MtPmFyZ2J1Zi5zZW1hbnRpYy5zZW1fZmFzdCkgKGN1cnJlbnRfY3B1LCBzYyk7CisjZWxzZQorICAgICAgdnBjID0gKCpzYy0+YXJnYnVmLnNlbWFudGljLnNlbV9mYXN0KSAoY3VycmVudF9jcHUsICZzYy0+YXJnYnVmKTsKKyNlbmRpZgorI2Vsc2UKKyAgICAgIGFib3J0ICgpOworI2VuZGlmIC8qIFdJVEhfU0VNX1NXSVRDSF9GQVNUICovCisgICAgfQorICBlbHNlCisgICAgeworI2lmICEgV0lUSF9TRU1fU1dJVENIX0ZVTEwKKyAgICAgIEFSR0JVRiAqYWJ1ZiA9ICZzYy0+YXJnYnVmOworICAgICAgY29uc3QgSURFU0MgKmlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSBpZGVzYy0+aWRhdGE7CisjaWYgV0lUSF9TQ0FDSEVfUEJCCisgICAgICBpbnQgdmlydHVhbF9wID0gQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9WSVJUVUFMKTsKKyNlbHNlCisgICAgICBpbnQgdmlydHVhbF9wID0gMDsKKyNlbmRpZgorCisgICAgICBpZiAoISB2aXJ0dWFsX3ApCisJeworCSAgLyogRklYTUU6IGNhbGwgeC1iZWZvcmUgKi8KKwkgIGlmIChBUkdCVUZfUFJPRklMRV9QIChhYnVmKSkKKwkgICAgUFJPRklMRV9DT1VOVF9JTlNOIChjdXJyZW50X2NwdSwgYWJ1Zi0+YWRkciwgaWRlc2MtPm51bSk7CisJICAvKiBGSVhNRTogTGF0ZXIgbWFrZSBjb3ZlciBtYWNyb3M6IFBST0ZJTEVfSU5TTl97SU5JVCxGSU5JfS4gICovCisJICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisJICAgIEBjcHVAX21vZGVsX2luc25fYmVmb3JlIChjdXJyZW50X2NwdSwgMSAvKmZpcnN0X3AqLyk7CisJICBUUkFDRV9JTlNOX0lOSVQgKGN1cnJlbnRfY3B1LCBhYnVmLCAxKTsKKwkgIFRSQUNFX0lOU04gKGN1cnJlbnRfY3B1LCBpbnNuLAorCQkgICAgICAoY29uc3Qgc3RydWN0IGFyZ2J1ZiAqKSBhYnVmLCBhYnVmLT5hZGRyKTsKKwl9CisjaWYgV0lUSF9TQ0FDSEUKKyAgICAgIHZwYyA9ICgqc2MtPmFyZ2J1Zi5zZW1hbnRpYy5zZW1fZnVsbCkgKGN1cnJlbnRfY3B1LCBzYyk7CisjZWxzZQorICAgICAgdnBjID0gKCpzYy0+YXJnYnVmLnNlbWFudGljLnNlbV9mdWxsKSAoY3VycmVudF9jcHUsIGFidWYpOworI2VuZGlmCisgICAgICBpZiAoISB2aXJ0dWFsX3ApCisJeworCSAgLyogRklYTUU6IGNhbGwgeC1hZnRlciAqLworCSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorCSAgICB7CisJICAgICAgaW50IGN5Y2xlczsKKworCSAgICAgIGN5Y2xlcyA9ICgqaWRlc2MtPnRpbWluZy0+bW9kZWxfZm4pIChjdXJyZW50X2NwdSwgc2MpOworCSAgICAgIEBjcHVAX21vZGVsX2luc25fYWZ0ZXIgKGN1cnJlbnRfY3B1LCAxIC8qbGFzdF9wKi8sIGN5Y2xlcyk7CisJICAgIH0KKwkgIFRSQUNFX0lOU05fRklOSSAoY3VycmVudF9jcHUsIGFidWYsIDEpOworCX0KKyNlbHNlCisgICAgICBhYm9ydCAoKTsKKyNlbmRpZiAvKiBXSVRIX1NFTV9TV0lUQ0hfRlVMTCAqLworICAgIH0KKworICByZXR1cm4gdnBjOworfQorCitFT0YKKworOzsKKworeGluaXQpCisKK2NhdCA8PEVPRgorLyp4eHhpbml0Ki8KK0VPRgorCis7OworCit4ZXh0cmFjdC1zaW1wbGUgfCB4ZXh0cmFjdC1zY2FjaGUpCisKK2NhdCA8PEVPRgoreworICBpZiAoKHBjICYgMykgIT0gMCkKKyAgICB7CisgICAgICBhYm9ydCAoKTsKKyNpZiAwCisgICAgICAvKiBUaGlzIG9ubHkgb2NjdXJzIHdoZW4gc2luZ2xlIHN0ZXBwaW5nLgorCSBUaGUgdGVzdCBpcyB1bm5lY2Vzc2FyeSBvdGhlcndpc2UsIGJ1dCB0aGUgY29zdCBpcyB0ZWVuc3ksCisJIGNvbXBhcmVkIHdpdGggZGVjb2RpbmcvZXh0cmFjdGlvbi4gICovCisgICAgICBVSEkgaW5zbiA9IEdFVElNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYyk7CisgICAgICBleHRyYWN0MTYgKGN1cnJlbnRfY3B1LCBwYywgaW5zbiAmIDB4N2ZmZiwgc2MsIEZBU1RfUCk7CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBVU0kgaW5zbiA9IEdFVElNRU1VU0kgKGN1cnJlbnRfY3B1LCBwYyk7CisgICAgICAvKiA/Pz8gd2lsc29uLCBpbnNucyBhcmUgMzIgYml0cywgdW5sZXNzIE1FTUIgd2l0aCBkaXNwbGFjZW1lbnQsIHdoaWNoCisJIGhhcyBoaWdoIGJpdCBzZXQsIGJpdCAxMiBzZXQsIGFuZCBtb2RlIG9mIDUsIDEyLCAxMywgMTQsIG9yIDE1LiAgKi8KKyAgICAgIGlmICgoKFNJKSBpbnNuID4gMCkKKwkgIHx8ICEgKCgoaW5zbiAmIDB4MzAwMCkgPT0gMHgzMDAwKQorCQl8fCAoKGluc24gJiAweDNDMDApID09IDB4MTQwMCkpKQorCXsKKwkgIGV4dHJhY3QzMiAoY3VycmVudF9jcHUsIHBjLCBpbnNuLCBzYywgRkFTVF9QKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgVURJIGxsaW5zbiA9ICgoKFVESSkgaW5zbiA8PCAzMikgfHwgR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjKzQpKTsKKwkgIGV4dHJhY3Q2NCAoY3VycmVudF9jcHUsIHBjLCBsbGluc24sIHNjLCBGQVNUX1ApOworCX0KKyAgICB9Cit9CitFT0YKKworOzsKKworeGV4dHJhY3QtcGJiKQorCisjIElucHV0czogIGN1cnJlbnRfY3B1LCBwYywgc2MsIG1heF9pbnNucywgRkFTVF9QCisjIE91dHB1dHM6IHNjLCBwYworIyBzYyBtdXN0IGJlIGxlZnQgcG9pbnRpbmcgcGFzdCB0aGUgbGFzdCBjcmVhdGVkIGVudHJ5LgorIyBwYyBtdXN0IGJlIGxlZnQgcG9pbnRpbmcgcGFzdCB0aGUgbGFzdCBjcmVhdGVkIGVudHJ5LgorIyBJZiB0aGUgcGJiIGlzIHRlcm1pbmF0ZWQgYnkgYSBjdGkgaW5zbiwgU0VUX0NUSV9WUEMoc2MpIG11c3QgYmUgY2FsbGVkCisjIHRvIHJlY29yZCB0aGUgdnBjIG9mIHRoZSBjdGkgaW5zbi4KKyMgU0VUX0lOU05fQ09VTlQobikgbXVzdCBiZSBjYWxsZWQgdG8gcmVjb3JkIG51bWJlciBvZiByZWFsIGluc25zLgorCitjYXQgPDxFT0YKK3sKKyAgY29uc3QgSURFU0MgKmlkZXNjOworICBpbnQgaWNvdW50ID0gMDsKKworICBpZiAoKHBjICYgMykgIT0gMCkKKyAgICB7CisgICAgICBhYm9ydCAoKTsKKyNpZiAwCisgICAgICAvKiBUaGlzIG9ubHkgb2NjdXJzIHdoZW4gc2luZ2xlIHN0ZXBwaW5nLgorCSBUaGUgdGVzdCBpcyB1bm5lY2Vzc2FyeSBvdGhlcndpc2UsIGJ1dCB0aGUgY29zdCBpcyB0ZWVuc3ksCisJIGNvbXBhcmVkIHdpdGggZGVjb2RpbmcvZXh0cmFjdGlvbi4gICovCisgICAgICBVSEkgaW5zbiA9IEdFVElNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYyk7CisgICAgICBpZGVzYyA9IGV4dHJhY3QxNiAoY3VycmVudF9jcHUsIHBjLCBpbnNuICYgMHg3ZmZmLCAmc2MtPmFyZ2J1ZiwgRkFTVF9QKTsKKyAgICAgICsrc2M7CisgICAgICAtLW1heF9pbnNuczsKKyAgICAgICsraWNvdW50OworICAgICAgcGMgKz0gMjsKKyAgICAgIGlmIChJREVTQ19DVElfUCAoaWRlc2MpKQorCXsKKwkgIFNFVF9DVElfVlBDIChzYyAtIDEpOworCSAgZ290byBGaW5pc2g7CisJfQorI2VuZGlmCisgICAgfQorCisgIHdoaWxlIChtYXhfaW5zbnMgPiAwKQorICAgIHsKKyAgICAgIFVTSSBpbnNuID0gR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjKTsKKyNpZiAwCisgICAgICAvKiA/Pz8gd2lsc29uLCBpbnNucyBhcmUgMzIgYml0cywgdW5sZXNzIE1FTUIgd2l0aCBkaXNwbGFjZW1lbnQsIHdoaWNoCisJIGhhcyBoaWdoIGJpdCBzZXQsIGJpdCAxMiBzZXQsIGFuZCBtb2RlIG9mIDUsIDEyLCAxMywgMTQsIG9yIDE1LiAgKi8KKyAgICAgIGlmICgoKFNJKSBpbnNuID4gMCkKKwkgIHx8ICEgKCgoaW5zbiAmIDB4MzAwMCkgPT0gMHgzMDAwKQorCQl8fCAoKGluc24gJiAweDNDMDApID09IDB4MTQwMCkpKQorCXsKKwkgIGlkZXNjID0gZXh0cmFjdDMyIChjdXJyZW50X2NwdSwgcGMsIGluc24sICZzYy0+YXJnYnVmLCBGQVNUX1ApOworCSAgKytzYzsKKwkgIC0tbWF4X2luc25zOworCSAgKytpY291bnQ7CisJICBwYyArPSA0OworCSAgaWYgKElERVNDX0NUSV9QIChpZGVzYykpCisJICAgIHsKKwkgICAgICBTRVRfQ1RJX1ZQQyAoc2MgLSAxKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZGVzYyA9IGV4dHJhY3Q2NCAoY3VycmVudF9jcHUsIHBjLCBpbnNuLCAmc2MtPmFyZ2J1ZiwgRkFTVF9QKTsKKwkgICsrc2M7CisJICAtLW1heF9pbnNuczsKKwkgICsraWNvdW50OworCSAgcGMgKz0gODsKKwkgIGlmIChJREVTQ19DVElfUCAoaWRlc2MpKQorCSAgICB7CisJICAgICAgU0VUX0NUSV9WUEMgKHNjIC0gMSk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisjZWxzZQorICAgICAgaWRlc2MgPSBleHRyYWN0MzIgKGN1cnJlbnRfY3B1LCBwYywgaW5zbiwgJnNjLT5hcmdidWYsIEZBU1RfUCk7CisgICAgICArK3NjOworICAgICAgLS1tYXhfaW5zbnM7CisgICAgICArK2ljb3VudDsKKyAgICAgIHBjICs9IGlkZXNjLT5sZW5ndGg7CisgICAgICBpZiAoSURFU0NfQ1RJX1AgKGlkZXNjKSkKKyAgICAgICAgeworICAgICAgICAgIFNFVF9DVElfVlBDIChzYyAtIDEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgRmluaXNoOgorICBTRVRfSU5TTl9DT1VOVCAoaWNvdW50KTsKK30KK0VPRgorCis7OworCit4ZnVsbC1leGVjLSogfCB4ZmFzdC1leGVjLSopCisKKyMgSW5wdXRzOiBjdXJyZW50X2NwdSwgdnBjLCBGQVNUX1AKKyMgT3V0cHV0czogdnBjCisjIHZwYyBpcyB0aGUgdmlydHVhbCBwcm9ncmFtIGNvdW50ZXIuCisKK2NhdCA8PEVPRgorI2lmICghIEZBU1RfUCAmJiBXSVRIX1NFTV9TV0lUQ0hfRlVMTCkgfHwgKEZBU1RfUCAmJiBXSVRIX1NFTV9TV0lUQ0hfRkFTVCkKKyNkZWZpbmUgREVGSU5FX1NXSVRDSAorI2luY2x1ZGUgInNlbS1zd2l0Y2guYyIKKyNlbHNlCisgIHZwYyA9IGV4ZWN1dGUgKGN1cnJlbnRfY3B1LCB2cGMsIEZBU1RfUCk7CisjZW5kaWYKK0VPRgorCis7OworCisqKQorICBlY2hvICJJbnZhbGlkIGFyZ3VtZW50IHRvIG1haW5sb29wLmluOiAkMSIgPiYyCisgIGV4aXQgMQorICA7OworCitlc2FjCmRpZmYgLS1naXQgYS9zaW0vaTk2MC9tb2RlbC5jIGIvc2ltL2k5NjAvbW9kZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDY5ZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2k5NjAvbW9kZWwuYwpAQCAtMCwwICsxLDk3OTMgQEAKKy8qIFNpbXVsYXRvciBtb2RlbCBzdXBwb3J0IGZvciBpOTYwYmFzZS4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2RlZmluZSBXQU5UX0NQVSBpOTYwYmFzZQorI2RlZmluZSBXQU5UX0NQVV9JOTYwQkFTRQorCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKworLyogVGhlIHByb2ZpbGluZyBkYXRhIGlzIHJlY29yZGVkIGhlcmUsIGJ1dCBpcyBhY2Nlc3NlZCB2aWEgdGhlIHByb2ZpbGluZworICAgbWVjaGFuaXNtLiAgQWZ0ZXIgYWxsLCB0aGlzIGlzIGluZm9ybWF0aW9uIGZvciBwcm9maWxpbmcuICAqLworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKworLyogTW9kZWwgaGFuZGxlcnMgZm9yIGVhY2ggaW5zbi4gICovCisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9tdWxvIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX211bG8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9tdWxvMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbXVsbzMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3JlbW8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfcmVtbzEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3JlbW8yIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9yZW1vMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfZGl2byAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9kaXZvMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfZGl2bzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2Rpdm8zIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9yZW1pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3JlbWkxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9yZW1pMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfcmVtaTMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2RpdmkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfZGl2aTEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2RpdmkyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9kaXZpMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfYWRkbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9hZGRvMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfYWRkbzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2FkZG8zIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zdWJvIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3N1Ym8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zdWJvMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3VibzMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX25vdGJpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX25vdGJpdDEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQxLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffbm90Yml0MiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9ub3RiaXQzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0My5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2FuZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9hbmQxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9hbmQyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9hbmQzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9hbmRub3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfYW5kbm90MSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfYW5kbm90MiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfYW5kbm90MyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc2V0Yml0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc2V0Yml0MSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zZXRiaXQyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0Mi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3NldGJpdDMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffbm90YW5kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX25vdGFuZDEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX25vdGFuZDIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX25vdGFuZDMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3hvciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV94b3IxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV94b3IyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV94b3IzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9vciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9vcjEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX29yMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffb3IzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9ub3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffbm9yMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffbm9yMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffbm9yMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffbm90IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffbm90MSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdDEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9ub3QyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Mi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX25vdDMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3QzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfY2xyYml0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfY2xyYml0MSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9jbHJiaXQyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0Mi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2NscmJpdDMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc2hsbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3NobG8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0MS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3NobG8yIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0Mi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3NobG8zIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0My5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3Nocm8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zaHJvMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zaHJvMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zaHJvMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zaGxpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc2hsaTEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQxLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc2hsaTIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQyLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc2hsaTMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc2hyaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3NocmkxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0MS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3NocmkyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0Mi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3NocmkzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0My5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2VtdWwgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXVsLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfZW11bDEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXVsMS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2VtdWwyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW11bDIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9lbXVsMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtdWwzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbW92IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Mi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX21vdjEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3QzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbW92bCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdmwuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9tb3ZsMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdmwxLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbW92dCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdnQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9tb3Z0MSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdnQxLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbW92cSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdnEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9tb3ZxMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdnExLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbW9kcGMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tb2RwYy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX21vZGFjIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW9kcGMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZGFfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRhX29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkYV9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGFfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRhX2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRhX2luZGlyZWN0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRhX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRhX2luZGlyZWN0X2luZGV4LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRhX2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGFfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkYV9pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRhX2luZGlyZWN0X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZGFfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYV9pbmRleF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRhX2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkX29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkX29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkX2luZGlyZWN0X29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkX2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfaW5kaXJlY3QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZF9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkX2luZGlyZWN0X2luZGV4LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkX2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZF9pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfaW5kaXJlY3RfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkX2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZF9pbmRleF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZG9iX29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2Jfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRvYl9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9iX2luZGlyZWN0X29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkb2JfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9iX2luZGlyZWN0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRvYl9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2JfaW5kaXJlY3RfaW5kZXguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZG9iX2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9iX2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZG9iX2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9iX2luZGlyZWN0X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZG9iX2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9iX2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZG9iX2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9iX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZG9zX29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3Nfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRvc19pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9zX2luZGlyZWN0X29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkb3NfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9zX2luZGlyZWN0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRvc19pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3NfaW5kaXJlY3RfaW5kZXguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZG9zX2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9zX2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZG9zX2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9zX2luZGlyZWN0X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZG9zX2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9zX2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZG9zX2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9zX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZGliX29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaWJfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRpYl9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGliX2luZGlyZWN0X29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkaWJfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGliX2luZGlyZWN0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRpYl9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaWJfaW5kaXJlY3RfaW5kZXguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZGliX2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGliX2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZGliX2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGliX2luZGlyZWN0X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZGliX2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGliX2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZGliX2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGliX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZGlzX29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaXNfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRpc19pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGlzX2luZGlyZWN0X29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkaXNfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGlzX2luZGlyZWN0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRpc19pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaXNfaW5kaXJlY3RfaW5kZXguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZGlzX2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGlzX2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZGlzX2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGlzX2luZGlyZWN0X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZGlzX2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGlzX2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZGlzX2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGlzX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZGxfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRsX29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkbF9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGxfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRsX2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRsX2luZGlyZWN0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRsX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRsX2luZGlyZWN0X2luZGV4LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRsX2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGxfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkbF9pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRsX2luZGlyZWN0X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZGxfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkbF9pbmRleF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRsX2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGxfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHRfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGR0X2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdF9pbmRpcmVjdF9vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZHRfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHRfaW5kaXJlY3QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZHRfaW5kaXJlY3RfaW5kZXggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHRfaW5kaXJlY3RfaW5kZXguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZHRfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGR0X2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHRfaW5kaXJlY3RfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGR0X2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZHRfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdF9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRxX29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcV9vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZHFfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkcV9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcV9pbmRpcmVjdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkcV9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcV9pbmRpcmVjdF9pbmRleC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkcV9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRxX2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9sZHFfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcV9pbmRpcmVjdF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfbGRxX2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHFfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zdF9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9pbmRpcmVjdF9vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zdF9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0X2luZGlyZWN0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3RfaW5kaXJlY3RfaW5kZXggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9pbmRpcmVjdF9pbmRleC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3N0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3RfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0X2luZGlyZWN0X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3N0X2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3RvYl9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9iX29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3N0b2JfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9pbmRpcmVjdF9vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zdG9iX2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9pbmRpcmVjdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3N0b2JfaW5kaXJlY3RfaW5kZXggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9iX2luZGlyZWN0X2luZGV4LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3RvYl9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3RvYl9pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9pbmRpcmVjdF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3RvYl9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9pbmRleF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3RvYl9pbmRpcmVjdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3Rvc19vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3N0b3NfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3Rvc19pbmRpcmVjdF9vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zdG9zX2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3Rvc19pbmRpcmVjdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3N0b3NfaW5kaXJlY3RfaW5kZXggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2luZGlyZWN0X2luZGV4LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3Rvc19kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3Rvc19kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3Rvc19pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3Rvc19pbmRpcmVjdF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3Rvc19pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3Rvc19pbmRleF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3Rvc19pbmRpcmVjdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3Rvc19pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3RsX29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0bF9vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zdGxfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RsX2luZGlyZWN0X29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3N0bF9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0bF9pbmRpcmVjdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3N0bF9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0bF9pbmRpcmVjdF9pbmRleC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3N0bF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RsX2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zdGxfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0bF9pbmRpcmVjdF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3RsX2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGxfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3N0bF9pbmRpcmVjdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RsX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zdHRfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3R0X29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3N0dF9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHRfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3R0X2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3R0X2luZGlyZWN0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3R0X2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3R0X2luZGlyZWN0X2luZGV4LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3R0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHRfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3N0dF9pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3R0X2luZGlyZWN0X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zdHRfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0dF9pbmRleF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3R0X2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHRfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3N0cV9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHFfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3RxX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cV9pbmRpcmVjdF9vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zdHFfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHFfaW5kaXJlY3QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zdHFfaW5kaXJlY3RfaW5kZXggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHFfaW5kaXJlY3RfaW5kZXguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zdHFfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cV9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0Ffc3RxX2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHFfaW5kaXJlY3RfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3N0cV9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RxX2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfY21wb2JlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2NtcG9iZV9saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9saXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9jbXBvYm5lX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2NtcG9ibmVfbGl0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfbGl0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfY21wb2JsX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JsX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2NtcG9ibF9saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9ibF9saXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9jbXBvYmxlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JsX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2NtcG9ibGVfbGl0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmxfbGl0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfY21wb2JnX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JsX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2NtcG9iZ19saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9ibF9saXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9jbXBvYmdlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JsX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2NtcG9iZ2VfbGl0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmxfbGl0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfY21waWJlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2NtcGliZV9saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9saXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9jbXBpYm5lX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2NtcGlibmVfbGl0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfbGl0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfY21waWJsX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2NtcGlibF9saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9saXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9jbXBpYmxlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2NtcGlibGVfbGl0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfbGl0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfY21waWJnX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2NtcGliZ19saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9saXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9jbXBpYmdlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2NtcGliZ2VfbGl0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfbGl0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfYmJjX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmJjX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2JiY19saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JiY19saXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9iYnNfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iYmNfcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfYmJzX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmJjX2xpdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2NtcGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXBpLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfY21waTEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXBpMS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2NtcGkyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY21waTIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9jbXBpMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfY21wbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcG8uZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9jbXBvMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcG8xLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfY21wbzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXBvMi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2NtcG8zIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY21wbzMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV90ZXN0bm9fcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfdGVzdG5vX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3Rlc3RnX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3Rlc3Rub19yZWcuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV90ZXN0ZV9yZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF90ZXN0bm9fcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfdGVzdGdlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3Rlc3Rub19yZWcuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV90ZXN0bF9yZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF90ZXN0bm9fcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfdGVzdG5lX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3Rlc3Rub19yZWcuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV90ZXN0bGVfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfdGVzdG5vX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3Rlc3RvX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3Rlc3Rub19yZWcuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9ibm8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2Juby5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2JnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibm8uZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9iZSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5vLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfYmdlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibm8uZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9ibCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5vLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfYm5lIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibm8uZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9ibGUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2Juby5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2JvIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibm8uZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9iIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfYnhfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ieF9pbmRpcmVjdF9vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9ieF9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYnhfaW5kaXJlY3QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9ieF9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYnhfaW5kaXJlY3RfaW5kZXguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9ieF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ieF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfYnhfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYnhfaW5kaXJlY3RfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX2NhbGx4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NhbGx4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9jYWxseF9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY2FsbHhfaW5kaXJlY3QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwS0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBLQV9jYWxseF9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NhbGx4X2luZGlyZWN0X29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MEtBX3JldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfcmV0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfY2FsbHMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NhbGxzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfZm1hcmsgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2ZtYXJrLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MEtBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwS0FfZmx1c2hyZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9mbHVzaHJlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBLQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX211bG8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbXVsbzEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX211bG8yIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9tdWxvMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfcmVtbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9yZW1vMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfcmVtbzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3JlbW8zIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9kaXZvIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2Rpdm8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9kaXZvMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfZGl2bzMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3JlbWkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfcmVtaTEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3JlbWkyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9yZW1pMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfZGl2aSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9kaXZpMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfZGl2aTIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2RpdmkzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9hZGRvIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2FkZG8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9hZGRvMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfYWRkbzMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3N1Ym8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc3VibzEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3N1Ym8yIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdWJvMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffbm90Yml0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffbm90Yml0MSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9ub3RiaXQyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0Mi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX25vdGJpdDMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfYW5kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2FuZDEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2FuZDIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2FuZDMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2FuZG5vdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9hbmRub3QxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9hbmRub3QyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9hbmRub3QzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zZXRiaXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zZXRiaXQxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0MS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3NldGJpdDIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQyLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc2V0Yml0MyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9ub3RhbmQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffbm90YW5kMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffbm90YW5kMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffbm90YW5kMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfeG9yIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3hvcjEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3hvcjIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3hvcjMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX29yIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX29yMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffb3IyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9vcjMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX25vciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9ub3IxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9ub3IyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9ub3IzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9ub3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9ub3QxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90MS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX25vdDIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3QyLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffbm90MyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdDMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9jbHJiaXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9jbHJiaXQxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0MS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2NscmJpdDIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQyLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfY2xyYml0MyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zaGxvIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc2hsbzEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQxLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc2hsbzIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQyLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc2hsbzMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc2hybyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3Nocm8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0MS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3Nocm8yIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0Mi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3Nocm8zIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0My5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3NobGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zaGxpMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zaGxpMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zaGxpMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zaHJpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc2hyaTEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQxLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc2hyaTIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQyLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc2hyaTMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfZW11bCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtdWwuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9lbXVsMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtdWwxLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfZW11bDIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXVsMi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2VtdWwzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW11bDMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9tb3YgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3QyLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbW92MSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdDMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9tb3ZsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW92bC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX21vdmwxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW92bDEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9tb3Z0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW92dC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX21vdnQxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW92dDEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9tb3ZxIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW92cS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX21vdnExIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW92cTEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9tb2RwYyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vZHBjLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbW9kYWMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tb2RwYy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkYV9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGFfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGRhX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYV9pbmRpcmVjdF9vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZGFfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGFfaW5kaXJlY3QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZGFfaW5kaXJlY3RfaW5kZXggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGFfaW5kaXJlY3RfaW5kZXguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZGFfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYV9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGRhX2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGFfaW5kaXJlY3RfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkYV9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRhX2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZGFfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGRfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGRfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGRfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZF9pbmRpcmVjdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfaW5kaXJlY3RfaW5kZXguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkX2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZF9pbmRpcmVjdF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGRfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkX2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZF9pbmRpcmVjdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkb2Jfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRvYl9vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZG9iX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2JfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGRvYl9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2JfaW5kaXJlY3QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZG9iX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRvYl9pbmRpcmVjdF9pbmRleC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkb2JfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2JfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkb2JfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2JfaW5kaXJlY3RfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkb2JfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2JfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkb2JfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2JfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkb3Nfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRvc19vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZG9zX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3NfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGRvc19pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3NfaW5kaXJlY3QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZG9zX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRvc19pbmRpcmVjdF9pbmRleC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkb3NfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3NfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkb3NfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3NfaW5kaXJlY3RfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkb3NfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3NfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkb3NfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3NfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkaWJfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpYl9vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZGliX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaWJfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGRpYl9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaWJfaW5kaXJlY3QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZGliX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpYl9pbmRpcmVjdF9pbmRleC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkaWJfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaWJfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkaWJfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaWJfaW5kaXJlY3RfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkaWJfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaWJfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkaWJfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaWJfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkaXNfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpc19vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZGlzX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaXNfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGRpc19pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaXNfaW5kaXJlY3QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZGlzX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpc19pbmRpcmVjdF9pbmRleC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkaXNfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaXNfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkaXNfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaXNfaW5kaXJlY3RfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkaXNfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaXNfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkaXNfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaXNfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkbF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGxfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGRsX2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkbF9pbmRpcmVjdF9vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZGxfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGxfaW5kaXJlY3QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZGxfaW5kaXJlY3RfaW5kZXggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGxfaW5kaXJlY3RfaW5kZXguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZGxfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkbF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGRsX2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGxfaW5kaXJlY3RfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkbF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRsX2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZGxfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkbF9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGR0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdF9vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZHRfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGR0X2luZGlyZWN0X29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkdF9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdF9pbmRpcmVjdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkdF9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdF9pbmRpcmVjdF9pbmRleC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGR0X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZHRfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdF9pbmRpcmVjdF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGR0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHRfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkdF9pbmRpcmVjdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGR0X2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZHFfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRxX29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkcV9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGRxX2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRxX2luZGlyZWN0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGRxX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRxX2luZGlyZWN0X2luZGV4LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGRxX2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHFfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2xkcV9pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRxX2luZGlyZWN0X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9sZHFfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcV9pbmRleF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3N0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0X29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3N0X2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0X2luZGlyZWN0X29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3N0X2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfaW5kaXJlY3QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdF9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0X2luZGlyZWN0X2luZGV4LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdF9pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfaW5kaXJlY3RfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3N0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9pbmRleF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc3RfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0X2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdG9iX29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0b2Jfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc3RvYl9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9iX2luZGlyZWN0X29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3N0b2JfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9iX2luZGlyZWN0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc3RvYl9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0b2JfaW5kaXJlY3RfaW5kZXguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdG9iX2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9iX2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdG9iX2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9iX2luZGlyZWN0X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdG9iX2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9iX2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdG9iX2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9iX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdG9zX29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0b3Nfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc3Rvc19pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2luZGlyZWN0X29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3N0b3NfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2luZGlyZWN0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc3Rvc19pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0b3NfaW5kaXJlY3RfaW5kZXguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdG9zX2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdG9zX2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2luZGlyZWN0X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdG9zX2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdG9zX2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdGxfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RsX29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3N0bF9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGxfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc3RsX2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RsX2luZGlyZWN0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc3RsX2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RsX2luZGlyZWN0X2luZGV4LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc3RsX2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGxfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3N0bF9pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RsX2luZGlyZWN0X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdGxfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0bF9pbmRleF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc3RsX2luZGlyZWN0X2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGxfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3N0dF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHRfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc3R0X2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0dF9pbmRpcmVjdF9vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdHRfaW5kaXJlY3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHRfaW5kaXJlY3QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdHRfaW5kaXJlY3RfaW5kZXggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHRfaW5kaXJlY3RfaW5kZXguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdHRfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0dF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc3R0X2luZGlyZWN0X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHRfaW5kaXJlY3RfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3N0dF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3R0X2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdHRfaW5kaXJlY3RfaW5kZXhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0dF9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc3RxX29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cV9vZmZzZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdHFfaW5kaXJlY3Rfb2Zmc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3N0cV9pbmRpcmVjdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cV9pbmRpcmVjdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3N0cV9pbmRpcmVjdF9pbmRleCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cV9pbmRpcmVjdF9pbmRleC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3N0cV9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RxX2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9zdHFfaW5kaXJlY3RfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cV9pbmRpcmVjdF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0Ffc3RxX2luZGV4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHFfaW5kZXhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9jbXBvYmVfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfY21wb2JlX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX2xpdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2NtcG9ibmVfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfY21wb2JuZV9saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9saXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9jbXBvYmxfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmxfcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfY21wb2JsX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JsX2xpdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2NtcG9ibGVfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmxfcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfY21wb2JsZV9saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9ibF9saXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9jbXBvYmdfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmxfcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfY21wb2JnX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JsX2xpdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2NtcG9iZ2VfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmxfcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfY21wb2JnZV9saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9ibF9saXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9jbXBpYmVfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfY21waWJlX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX2xpdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2NtcGlibmVfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfY21waWJuZV9saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9saXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9jbXBpYmxfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfY21waWJsX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX2xpdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2NtcGlibGVfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfY21waWJsZV9saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9saXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9jbXBpYmdfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfY21waWJnX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX2xpdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2NtcGliZ2VfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfY21waWJnZV9saXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9saXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9iYmNfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iYmNfcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfYmJjX2xpdCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmJjX2xpdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2Jic19yZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JiY19yZWcuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9iYnNfbGl0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iYmNfbGl0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfY21waSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9jbXBpMSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkxLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfY21waTIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXBpMi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2NtcGkzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY21waTMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9jbXBvIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY21wby5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2NtcG8xIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY21wbzEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9jbXBvMiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcG8yLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfY21wbzMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXBvMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3Rlc3Rub19yZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF90ZXN0bm9fcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfdGVzdGdfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfdGVzdG5vX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3Rlc3RlX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3Rlc3Rub19yZWcuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV90ZXN0Z2VfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfdGVzdG5vX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3Rlc3RsX3JlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3Rlc3Rub19yZWcuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV90ZXN0bmVfcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfdGVzdG5vX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX3Rlc3RsZV9yZWcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF90ZXN0bm9fcmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfdGVzdG9fcmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfdGVzdG5vX3JlZy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2JubyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5vLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfYmcgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2Juby5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2JlIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibm8uZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9iZ2UgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2Juby5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2JsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibm8uZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9ibmUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2Juby5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2JsZSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5vLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfYm8gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2Juby5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2IuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9ieF9pbmRpcmVjdF9vZmZzZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2J4X2luZGlyZWN0X29mZnNldC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2J4X2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ieF9pbmRpcmVjdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2J4X2luZGlyZWN0X2luZGV4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ieF9pbmRpcmVjdF9pbmRleC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2J4X2Rpc3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2J4X2Rpc3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9ieF9pbmRpcmVjdF9kaXNwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ieF9pbmRpcmVjdF9kaXNwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfY2FsbHhfZGlzcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY2FsbHhfZGlzcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2NhbGx4X2luZGlyZWN0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jYWxseF9pbmRpcmVjdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IGk5NjBiYXNlX21vZGVsX2k5NjBDQV91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfaTk2MENBX2NhbGx4X2luZGlyZWN0X29mZnNldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY2FsbHhfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9pOTYwQ0FfcmV0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9yZXQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9jYWxscyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY2FsbHMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9mbWFyayAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfZm1hcmsuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBpOTYwYmFzZV9tb2RlbF9pOTYwQ0FfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX2k5NjBDQV9mbHVzaHJlZyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2ZsdXNocmVnLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gaTk2MGJhc2VfbW9kZWxfaTk2MENBX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCisvKiBXZSBhc3N1bWUgVU5JVF9OT05FID09IDAgYmVjYXVzZSB0aGUgdGFibGVzIGRvbid0IGFsd2F5cyB0ZXJtaW5hdGUKKyAgIGVudHJpZXMgd2l0aCBpdC4gICovCisKKy8qIE1vZGVsIHRpbWluZyBkYXRhIGZvciBgaTk2MEtBJy4gICovCisKK3N0YXRpYyBjb25zdCBJTlNOX1RJTUlORyBpOTYwS0FfdGltaW5nW10gPSB7CisgIHsgSTk2MEJBU0VfSU5TTl9YX0lOVkFMSUQsIDAsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9YX0FGVEVSLCAwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fWF9CRUZPUkUsIDAsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9YX0NUSV9DSEFJTiwgMCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1hfQ0hBSU4sIDAsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9YX0JFR0lOLCAwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTVVMTywgbW9kZWxfaTk2MEtBX211bG8sIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9NVUxPMSwgbW9kZWxfaTk2MEtBX211bG8xLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTVVMTzIsIG1vZGVsX2k5NjBLQV9tdWxvMiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX01VTE8zLCBtb2RlbF9pOTYwS0FfbXVsbzMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9SRU1PLCBtb2RlbF9pOTYwS0FfcmVtbywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1JFTU8xLCBtb2RlbF9pOTYwS0FfcmVtbzEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9SRU1PMiwgbW9kZWxfaTk2MEtBX3JlbW8yLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fUkVNTzMsIG1vZGVsX2k5NjBLQV9yZW1vMywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0RJVk8sIG1vZGVsX2k5NjBLQV9kaXZvLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fRElWTzEsIG1vZGVsX2k5NjBLQV9kaXZvMSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0RJVk8yLCBtb2RlbF9pOTYwS0FfZGl2bzIsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9ESVZPMywgbW9kZWxfaTk2MEtBX2Rpdm8zLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fUkVNSSwgbW9kZWxfaTk2MEtBX3JlbWksIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9SRU1JMSwgbW9kZWxfaTk2MEtBX3JlbWkxLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fUkVNSTIsIG1vZGVsX2k5NjBLQV9yZW1pMiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1JFTUkzLCBtb2RlbF9pOTYwS0FfcmVtaTMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9ESVZJLCBtb2RlbF9pOTYwS0FfZGl2aSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0RJVkkxLCBtb2RlbF9pOTYwS0FfZGl2aTEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9ESVZJMiwgbW9kZWxfaTk2MEtBX2RpdmkyLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fRElWSTMsIG1vZGVsX2k5NjBLQV9kaXZpMywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0FERE8sIG1vZGVsX2k5NjBLQV9hZGRvLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQURETzEsIG1vZGVsX2k5NjBLQV9hZGRvMSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0FERE8yLCBtb2RlbF9pOTYwS0FfYWRkbzIsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9BRERPMywgbW9kZWxfaTk2MEtBX2FkZG8zLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1VCTywgbW9kZWxfaTk2MEtBX3N1Ym8sIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVUJPMSwgbW9kZWxfaTk2MEtBX3N1Ym8xLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1VCTzIsIG1vZGVsX2k5NjBLQV9zdWJvMiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NVQk8zLCBtb2RlbF9pOTYwS0Ffc3VibzMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9OT1RCSVQsIG1vZGVsX2k5NjBLQV9ub3RiaXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9OT1RCSVQxLCBtb2RlbF9pOTYwS0Ffbm90Yml0MSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX05PVEJJVDIsIG1vZGVsX2k5NjBLQV9ub3RiaXQyLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTk9UQklUMywgbW9kZWxfaTk2MEtBX25vdGJpdDMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9BTkQsIG1vZGVsX2k5NjBLQV9hbmQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9BTkQxLCBtb2RlbF9pOTYwS0FfYW5kMSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0FORDIsIG1vZGVsX2k5NjBLQV9hbmQyLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQU5EMywgbW9kZWxfaTk2MEtBX2FuZDMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9BTkROT1QsIG1vZGVsX2k5NjBLQV9hbmRub3QsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9BTkROT1QxLCBtb2RlbF9pOTYwS0FfYW5kbm90MSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0FORE5PVDIsIG1vZGVsX2k5NjBLQV9hbmRub3QyLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQU5ETk9UMywgbW9kZWxfaTk2MEtBX2FuZG5vdDMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TRVRCSVQsIG1vZGVsX2k5NjBLQV9zZXRiaXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TRVRCSVQxLCBtb2RlbF9pOTYwS0Ffc2V0Yml0MSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NFVEJJVDIsIG1vZGVsX2k5NjBLQV9zZXRiaXQyLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU0VUQklUMywgbW9kZWxfaTk2MEtBX3NldGJpdDMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9OT1RBTkQsIG1vZGVsX2k5NjBLQV9ub3RhbmQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9OT1RBTkQxLCBtb2RlbF9pOTYwS0Ffbm90YW5kMSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX05PVEFORDIsIG1vZGVsX2k5NjBLQV9ub3RhbmQyLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTk9UQU5EMywgbW9kZWxfaTk2MEtBX25vdGFuZDMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9YT1IsIG1vZGVsX2k5NjBLQV94b3IsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9YT1IxLCBtb2RlbF9pOTYwS0FfeG9yMSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1hPUjIsIG1vZGVsX2k5NjBLQV94b3IyLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fWE9SMywgbW9kZWxfaTk2MEtBX3hvcjMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9PUiwgbW9kZWxfaTk2MEtBX29yLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fT1IxLCBtb2RlbF9pOTYwS0Ffb3IxLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fT1IyLCBtb2RlbF9pOTYwS0Ffb3IyLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fT1IzLCBtb2RlbF9pOTYwS0Ffb3IzLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTk9SLCBtb2RlbF9pOTYwS0Ffbm9yLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTk9SMSwgbW9kZWxfaTk2MEtBX25vcjEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9OT1IyLCBtb2RlbF9pOTYwS0Ffbm9yMiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX05PUjMsIG1vZGVsX2k5NjBLQV9ub3IzLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTk9ULCBtb2RlbF9pOTYwS0Ffbm90LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTk9UMSwgbW9kZWxfaTk2MEtBX25vdDEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9OT1QyLCBtb2RlbF9pOTYwS0Ffbm90MiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX05PVDMsIG1vZGVsX2k5NjBLQV9ub3QzLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ0xSQklULCBtb2RlbF9pOTYwS0FfY2xyYml0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ0xSQklUMSwgbW9kZWxfaTk2MEtBX2NscmJpdDEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTFJCSVQyLCBtb2RlbF9pOTYwS0FfY2xyYml0MiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NMUkJJVDMsIG1vZGVsX2k5NjBLQV9jbHJiaXQzLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU0hMTywgbW9kZWxfaTk2MEtBX3NobG8sIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TSExPMSwgbW9kZWxfaTk2MEtBX3NobG8xLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU0hMTzIsIG1vZGVsX2k5NjBLQV9zaGxvMiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NITE8zLCBtb2RlbF9pOTYwS0Ffc2hsbzMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TSFJPLCBtb2RlbF9pOTYwS0Ffc2hybywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NIUk8xLCBtb2RlbF9pOTYwS0Ffc2hybzEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TSFJPMiwgbW9kZWxfaTk2MEtBX3Nocm8yLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU0hSTzMsIG1vZGVsX2k5NjBLQV9zaHJvMywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NITEksIG1vZGVsX2k5NjBLQV9zaGxpLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU0hMSTEsIG1vZGVsX2k5NjBLQV9zaGxpMSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NITEkyLCBtb2RlbF9pOTYwS0Ffc2hsaTIsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TSExJMywgbW9kZWxfaTk2MEtBX3NobGkzLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU0hSSSwgbW9kZWxfaTk2MEtBX3NocmksIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TSFJJMSwgbW9kZWxfaTk2MEtBX3NocmkxLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU0hSSTIsIG1vZGVsX2k5NjBLQV9zaHJpMiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NIUkkzLCBtb2RlbF9pOTYwS0Ffc2hyaTMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9FTVVMLCBtb2RlbF9pOTYwS0FfZW11bCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0VNVUwxLCBtb2RlbF9pOTYwS0FfZW11bDEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9FTVVMMiwgbW9kZWxfaTk2MEtBX2VtdWwyLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fRU1VTDMsIG1vZGVsX2k5NjBLQV9lbXVsMywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX01PViwgbW9kZWxfaTk2MEtBX21vdiwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX01PVjEsIG1vZGVsX2k5NjBLQV9tb3YxLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTU9WTCwgbW9kZWxfaTk2MEtBX21vdmwsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9NT1ZMMSwgbW9kZWxfaTk2MEtBX21vdmwxLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTU9WVCwgbW9kZWxfaTk2MEtBX21vdnQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9NT1ZUMSwgbW9kZWxfaTk2MEtBX21vdnQxLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTU9WUSwgbW9kZWxfaTk2MEtBX21vdnEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9NT1ZRMSwgbW9kZWxfaTk2MEtBX21vdnExLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTU9EUEMsIG1vZGVsX2k5NjBLQV9tb2RwYywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX01PREFDLCBtb2RlbF9pOTYwS0FfbW9kYWMsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MREFfT0ZGU0VULCBtb2RlbF9pOTYwS0FfbGRhX29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBLQV9sZGFfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERBX0lORElSRUNULCBtb2RlbF9pOTYwS0FfbGRhX2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERBX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwS0FfbGRhX2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERBX0RJU1AsIG1vZGVsX2k5NjBLQV9sZGFfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRhX2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MREFfSU5ERVhfRElTUCwgbW9kZWxfaTk2MEtBX2xkYV9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERBX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9sZGFfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEX09GRlNFVCwgbW9kZWxfaTk2MEtBX2xkX29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MEtBX2xkX2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEX0lORElSRUNULCBtb2RlbF9pOTYwS0FfbGRfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MEtBX2xkX2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERfRElTUCwgbW9kZWxfaTk2MEtBX2xkX2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9sZF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MEtBX2xkX2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRE9CX09GRlNFVCwgbW9kZWxfaTk2MEtBX2xkb2Jfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBLQV9sZG9iX2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1QsIG1vZGVsX2k5NjBLQV9sZG9iX2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MEtBX2xkb2JfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRE9CX0RJU1AsIG1vZGVsX2k5NjBLQV9sZG9iX2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBLQV9sZG9iX2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRE9CX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9sZG9iX2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9sZG9iX2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRE9TX09GRlNFVCwgbW9kZWxfaTk2MEtBX2xkb3Nfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBLQV9sZG9zX2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1QsIG1vZGVsX2k5NjBLQV9sZG9zX2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MEtBX2xkb3NfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRE9TX0RJU1AsIG1vZGVsX2k5NjBLQV9sZG9zX2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRE9TX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBLQV9sZG9zX2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRE9TX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9sZG9zX2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRE9TX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9sZG9zX2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRElCX09GRlNFVCwgbW9kZWxfaTk2MEtBX2xkaWJfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBLQV9sZGliX2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xESUJfSU5ESVJFQ1QsIG1vZGVsX2k5NjBLQV9sZGliX2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MEtBX2xkaWJfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRElCX0RJU1AsIG1vZGVsX2k5NjBLQV9sZGliX2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBLQV9sZGliX2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRElCX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9sZGliX2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9sZGliX2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRElTX09GRlNFVCwgbW9kZWxfaTk2MEtBX2xkaXNfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERJU19JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBLQV9sZGlzX2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1QsIG1vZGVsX2k5NjBLQV9sZGlzX2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERJU19JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MEtBX2xkaXNfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRElTX0RJU1AsIG1vZGVsX2k5NjBLQV9sZGlzX2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBLQV9sZGlzX2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRElTX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9sZGlzX2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9sZGlzX2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRExfT0ZGU0VULCBtb2RlbF9pOTYwS0FfbGRsX29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBLQV9sZGxfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERMX0lORElSRUNULCBtb2RlbF9pOTYwS0FfbGRsX2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERMX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwS0FfbGRsX2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERMX0RJU1AsIG1vZGVsX2k5NjBLQV9sZGxfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRsX2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRExfSU5ERVhfRElTUCwgbW9kZWxfaTk2MEtBX2xkbF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERMX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9sZGxfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEVF9PRkZTRVQsIG1vZGVsX2k5NjBLQV9sZHRfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MEtBX2xkdF9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRFRfSU5ESVJFQ1QsIG1vZGVsX2k5NjBLQV9sZHRfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBLQV9sZHRfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRFRfRElTUCwgbW9kZWxfaTk2MEtBX2xkdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBLQV9sZHRfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0FfbGR0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MEtBX2xkdF9pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERRX09GRlNFVCwgbW9kZWxfaTk2MEtBX2xkcV9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwS0FfbGRxX2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVCwgbW9kZWxfaTk2MEtBX2xkcV9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MEtBX2xkcV9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEUV9ESVNQLCBtb2RlbF9pOTYwS0FfbGRxX2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MEtBX2xkcV9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERRX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9sZHFfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0FfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVF9PRkZTRVQsIG1vZGVsX2k5NjBLQV9zdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVF9JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBLQV9zdF9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVF9JTkRJUkVDVCwgbW9kZWxfaTk2MEtBX3N0X2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBLQV9zdF9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUX0RJU1AsIG1vZGVsX2k5NjBLQV9zdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MEtBX3N0X2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0Ffc3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9zdF9pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RPQl9PRkZTRVQsIG1vZGVsX2k5NjBLQV9zdG9iX29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwS0Ffc3RvYl9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNULCBtb2RlbF9pOTYwS0Ffc3RvYl9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBLQV9zdG9iX2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RPQl9ESVNQLCBtb2RlbF9pOTYwS0Ffc3RvYl9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwS0Ffc3RvYl9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RPQl9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0Ffc3RvYl9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0Ffc3RvYl9pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RPU19PRkZTRVQsIG1vZGVsX2k5NjBLQV9zdG9zX29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwS0Ffc3Rvc19pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNULCBtb2RlbF9pOTYwS0Ffc3Rvc19pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBLQV9zdG9zX2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RPU19ESVNQLCBtb2RlbF9pOTYwS0Ffc3Rvc19kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwS0Ffc3Rvc19pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RPU19JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0Ffc3Rvc19pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0Ffc3Rvc19pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RMX09GRlNFVCwgbW9kZWxfaTk2MEtBX3N0bF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwS0Ffc3RsX2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUTF9JTkRJUkVDVCwgbW9kZWxfaTk2MEtBX3N0bF9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUTF9JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MEtBX3N0bF9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUTF9ESVNQLCBtb2RlbF9pOTYwS0Ffc3RsX2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MEtBX3N0bF9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RMX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9zdGxfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUTF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0Ffc3RsX2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVFRfT0ZGU0VULCBtb2RlbF9pOTYwS0Ffc3R0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUVF9JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBLQV9zdHRfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNULCBtb2RlbF9pOTYwS0Ffc3R0X2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwS0Ffc3R0X2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RUX0RJU1AsIG1vZGVsX2k5NjBLQV9zdHRfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUVF9JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwS0Ffc3R0X2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVFRfSU5ERVhfRElTUCwgbW9kZWxfaTk2MEtBX3N0dF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBLQV9zdHRfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUUV9PRkZTRVQsIG1vZGVsX2k5NjBLQV9zdHFfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MEtBX3N0cV9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVFFfSU5ESVJFQ1QsIG1vZGVsX2k5NjBLQV9zdHFfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVFFfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBLQV9zdHFfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVFFfRElTUCwgbW9kZWxfaTk2MEtBX3N0cV9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBLQV9zdHFfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUUV9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwS0Ffc3RxX2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVFFfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MEtBX3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QT0JFX1JFRywgbW9kZWxfaTk2MEtBX2NtcG9iZV9yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkVfTElULCBtb2RlbF9pOTYwS0FfY21wb2JlX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CTkVfUkVHLCBtb2RlbF9pOTYwS0FfY21wb2JuZV9yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBPQk5FX0xJVCwgbW9kZWxfaTk2MEtBX2NtcG9ibmVfbGl0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QT0JMX1JFRywgbW9kZWxfaTk2MEtBX2NtcG9ibF9yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkxfTElULCBtb2RlbF9pOTYwS0FfY21wb2JsX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CTEVfUkVHLCBtb2RlbF9pOTYwS0FfY21wb2JsZV9yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkxFX0xJVCwgbW9kZWxfaTk2MEtBX2NtcG9ibGVfbGl0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QT0JHX1JFRywgbW9kZWxfaTk2MEtBX2NtcG9iZ19yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkdfTElULCBtb2RlbF9pOTYwS0FfY21wb2JnX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CR0VfUkVHLCBtb2RlbF9pOTYwS0FfY21wb2JnZV9yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkdFX0xJVCwgbW9kZWxfaTk2MEtBX2NtcG9iZ2VfbGl0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QSUJFX1JFRywgbW9kZWxfaTk2MEtBX2NtcGliZV9yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkVfTElULCBtb2RlbF9pOTYwS0FfY21waWJlX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NNUElCTkVfUkVHLCBtb2RlbF9pOTYwS0FfY21waWJuZV9yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBJQk5FX0xJVCwgbW9kZWxfaTk2MEtBX2NtcGlibmVfbGl0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QSUJMX1JFRywgbW9kZWxfaTk2MEtBX2NtcGlibF9yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkxfTElULCBtb2RlbF9pOTYwS0FfY21waWJsX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NNUElCTEVfUkVHLCBtb2RlbF9pOTYwS0FfY21waWJsZV9yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkxFX0xJVCwgbW9kZWxfaTk2MEtBX2NtcGlibGVfbGl0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QSUJHX1JFRywgbW9kZWxfaTk2MEtBX2NtcGliZ19yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkdfTElULCBtb2RlbF9pOTYwS0FfY21waWJnX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NNUElCR0VfUkVHLCBtb2RlbF9pOTYwS0FfY21waWJnZV9yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkdFX0xJVCwgbW9kZWxfaTk2MEtBX2NtcGliZ2VfbGl0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQkJDX1JFRywgbW9kZWxfaTk2MEtBX2JiY19yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9CQkNfTElULCBtb2RlbF9pOTYwS0FfYmJjX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0JCU19SRUcsIG1vZGVsX2k5NjBLQV9iYnNfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQkJTX0xJVCwgbW9kZWxfaTk2MEtBX2Jic19saXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBJLCBtb2RlbF9pOTYwS0FfY21waSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NNUEkxLCBtb2RlbF9pOTYwS0FfY21waTEsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBJMiwgbW9kZWxfaTk2MEtBX2NtcGkyLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QSTMsIG1vZGVsX2k5NjBLQV9jbXBpMywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NNUE8sIG1vZGVsX2k5NjBLQV9jbXBvLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QTzEsIG1vZGVsX2k5NjBLQV9jbXBvMSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NNUE8yLCBtb2RlbF9pOTYwS0FfY21wbzIsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBPMywgbW9kZWxfaTk2MEtBX2NtcG8zLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fVEVTVE5PX1JFRywgbW9kZWxfaTk2MEtBX3Rlc3Rub19yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9URVNUR19SRUcsIG1vZGVsX2k5NjBLQV90ZXN0Z19yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9URVNURV9SRUcsIG1vZGVsX2k5NjBLQV90ZXN0ZV9yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9URVNUR0VfUkVHLCBtb2RlbF9pOTYwS0FfdGVzdGdlX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1RFU1RMX1JFRywgbW9kZWxfaTk2MEtBX3Rlc3RsX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1RFU1RORV9SRUcsIG1vZGVsX2k5NjBLQV90ZXN0bmVfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fVEVTVExFX1JFRywgbW9kZWxfaTk2MEtBX3Rlc3RsZV9yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9URVNUT19SRUcsIG1vZGVsX2k5NjBLQV90ZXN0b19yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9CTk8sIG1vZGVsX2k5NjBLQV9ibm8sIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9CRywgbW9kZWxfaTk2MEtBX2JnLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQkUsIG1vZGVsX2k5NjBLQV9iZSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0JHRSwgbW9kZWxfaTk2MEtBX2JnZSwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0JMLCBtb2RlbF9pOTYwS0FfYmwsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9CTkUsIG1vZGVsX2k5NjBLQV9ibmUsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9CTEUsIG1vZGVsX2k5NjBLQV9ibGUsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9CTywgbW9kZWxfaTk2MEtBX2JvLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQiwgbW9kZWxfaTk2MEtBX2IsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9CWF9JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBLQV9ieF9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9CWF9JTkRJUkVDVCwgbW9kZWxfaTk2MEtBX2J4X2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQlhfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBLQV9ieF9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0JYX0RJU1AsIG1vZGVsX2k5NjBLQV9ieF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQlhfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MEtBX2J4X2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DQUxMWF9ESVNQLCBtb2RlbF9pOTYwS0FfY2FsbHhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NBTExYX0lORElSRUNULCBtb2RlbF9pOTYwS0FfY2FsbHhfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DQUxMWF9JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBLQV9jYWxseF9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9SRVQsIG1vZGVsX2k5NjBLQV9yZXQsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DQUxMUywgbW9kZWxfaTk2MEtBX2NhbGxzLCB7IHsgKGludCkgVU5JVF9JOTYwS0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fRk1BUkssIG1vZGVsX2k5NjBLQV9mbWFyaywgeyB7IChpbnQpIFVOSVRfSTk2MEtBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0ZMVVNIUkVHLCBtb2RlbF9pOTYwS0FfZmx1c2hyZWcsIHsgeyAoaW50KSBVTklUX0k5NjBLQV9VX0VYRUMsIDEsIDEgfSB9IH0sCit9OworCisvKiBNb2RlbCB0aW1pbmcgZGF0YSBmb3IgYGk5NjBDQScuICAqLworCitzdGF0aWMgY29uc3QgSU5TTl9USU1JTkcgaTk2MENBX3RpbWluZ1tdID0geworICB7IEk5NjBCQVNFX0lOU05fWF9JTlZBTElELCAwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fWF9BRlRFUiwgMCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1hfQkVGT1JFLCAwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fWF9DVElfQ0hBSU4sIDAsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9YX0NIQUlOLCAwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fWF9CRUdJTiwgMCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX01VTE8sIG1vZGVsX2k5NjBDQV9tdWxvLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTVVMTzEsIG1vZGVsX2k5NjBDQV9tdWxvMSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX01VTE8yLCBtb2RlbF9pOTYwQ0FfbXVsbzIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9NVUxPMywgbW9kZWxfaTk2MENBX211bG8zLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fUkVNTywgbW9kZWxfaTk2MENBX3JlbW8sIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9SRU1PMSwgbW9kZWxfaTk2MENBX3JlbW8xLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fUkVNTzIsIG1vZGVsX2k5NjBDQV9yZW1vMiwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1JFTU8zLCBtb2RlbF9pOTYwQ0FfcmVtbzMsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9ESVZPLCBtb2RlbF9pOTYwQ0FfZGl2bywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0RJVk8xLCBtb2RlbF9pOTYwQ0FfZGl2bzEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9ESVZPMiwgbW9kZWxfaTk2MENBX2Rpdm8yLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fRElWTzMsIG1vZGVsX2k5NjBDQV9kaXZvMywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1JFTUksIG1vZGVsX2k5NjBDQV9yZW1pLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fUkVNSTEsIG1vZGVsX2k5NjBDQV9yZW1pMSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1JFTUkyLCBtb2RlbF9pOTYwQ0FfcmVtaTIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9SRU1JMywgbW9kZWxfaTk2MENBX3JlbWkzLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fRElWSSwgbW9kZWxfaTk2MENBX2RpdmksIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9ESVZJMSwgbW9kZWxfaTk2MENBX2RpdmkxLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fRElWSTIsIG1vZGVsX2k5NjBDQV9kaXZpMiwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0RJVkkzLCBtb2RlbF9pOTYwQ0FfZGl2aTMsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9BRERPLCBtb2RlbF9pOTYwQ0FfYWRkbywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0FERE8xLCBtb2RlbF9pOTYwQ0FfYWRkbzEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9BRERPMiwgbW9kZWxfaTk2MENBX2FkZG8yLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQURETzMsIG1vZGVsX2k5NjBDQV9hZGRvMywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NVQk8sIG1vZGVsX2k5NjBDQV9zdWJvLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1VCTzEsIG1vZGVsX2k5NjBDQV9zdWJvMSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NVQk8yLCBtb2RlbF9pOTYwQ0Ffc3VibzIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVUJPMywgbW9kZWxfaTk2MENBX3N1Ym8zLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTk9UQklULCBtb2RlbF9pOTYwQ0Ffbm90Yml0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTk9UQklUMSwgbW9kZWxfaTk2MENBX25vdGJpdDEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9OT1RCSVQyLCBtb2RlbF9pOTYwQ0Ffbm90Yml0MiwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX05PVEJJVDMsIG1vZGVsX2k5NjBDQV9ub3RiaXQzLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQU5ELCBtb2RlbF9pOTYwQ0FfYW5kLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQU5EMSwgbW9kZWxfaTk2MENBX2FuZDEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9BTkQyLCBtb2RlbF9pOTYwQ0FfYW5kMiwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0FORDMsIG1vZGVsX2k5NjBDQV9hbmQzLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQU5ETk9ULCBtb2RlbF9pOTYwQ0FfYW5kbm90LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQU5ETk9UMSwgbW9kZWxfaTk2MENBX2FuZG5vdDEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9BTkROT1QyLCBtb2RlbF9pOTYwQ0FfYW5kbm90MiwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0FORE5PVDMsIG1vZGVsX2k5NjBDQV9hbmRub3QzLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU0VUQklULCBtb2RlbF9pOTYwQ0Ffc2V0Yml0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU0VUQklUMSwgbW9kZWxfaTk2MENBX3NldGJpdDEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TRVRCSVQyLCBtb2RlbF9pOTYwQ0Ffc2V0Yml0MiwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NFVEJJVDMsIG1vZGVsX2k5NjBDQV9zZXRiaXQzLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTk9UQU5ELCBtb2RlbF9pOTYwQ0Ffbm90YW5kLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTk9UQU5EMSwgbW9kZWxfaTk2MENBX25vdGFuZDEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9OT1RBTkQyLCBtb2RlbF9pOTYwQ0Ffbm90YW5kMiwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX05PVEFORDMsIG1vZGVsX2k5NjBDQV9ub3RhbmQzLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fWE9SLCBtb2RlbF9pOTYwQ0FfeG9yLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fWE9SMSwgbW9kZWxfaTk2MENBX3hvcjEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9YT1IyLCBtb2RlbF9pOTYwQ0FfeG9yMiwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1hPUjMsIG1vZGVsX2k5NjBDQV94b3IzLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fT1IsIG1vZGVsX2k5NjBDQV9vciwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX09SMSwgbW9kZWxfaTk2MENBX29yMSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX09SMiwgbW9kZWxfaTk2MENBX29yMiwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX09SMywgbW9kZWxfaTk2MENBX29yMywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX05PUiwgbW9kZWxfaTk2MENBX25vciwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX05PUjEsIG1vZGVsX2k5NjBDQV9ub3IxLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTk9SMiwgbW9kZWxfaTk2MENBX25vcjIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9OT1IzLCBtb2RlbF9pOTYwQ0Ffbm9yMywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX05PVCwgbW9kZWxfaTk2MENBX25vdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX05PVDEsIG1vZGVsX2k5NjBDQV9ub3QxLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTk9UMiwgbW9kZWxfaTk2MENBX25vdDIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9OT1QzLCBtb2RlbF9pOTYwQ0Ffbm90MywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NMUkJJVCwgbW9kZWxfaTk2MENBX2NscmJpdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NMUkJJVDEsIG1vZGVsX2k5NjBDQV9jbHJiaXQxLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ0xSQklUMiwgbW9kZWxfaTk2MENBX2NscmJpdDIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTFJCSVQzLCBtb2RlbF9pOTYwQ0FfY2xyYml0MywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NITE8sIG1vZGVsX2k5NjBDQV9zaGxvLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU0hMTzEsIG1vZGVsX2k5NjBDQV9zaGxvMSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NITE8yLCBtb2RlbF9pOTYwQ0Ffc2hsbzIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TSExPMywgbW9kZWxfaTk2MENBX3NobG8zLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU0hSTywgbW9kZWxfaTk2MENBX3Nocm8sIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TSFJPMSwgbW9kZWxfaTk2MENBX3Nocm8xLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU0hSTzIsIG1vZGVsX2k5NjBDQV9zaHJvMiwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NIUk8zLCBtb2RlbF9pOTYwQ0Ffc2hybzMsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TSExJLCBtb2RlbF9pOTYwQ0Ffc2hsaSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NITEkxLCBtb2RlbF9pOTYwQ0Ffc2hsaTEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TSExJMiwgbW9kZWxfaTk2MENBX3NobGkyLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU0hMSTMsIG1vZGVsX2k5NjBDQV9zaGxpMywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NIUkksIG1vZGVsX2k5NjBDQV9zaHJpLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU0hSSTEsIG1vZGVsX2k5NjBDQV9zaHJpMSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NIUkkyLCBtb2RlbF9pOTYwQ0Ffc2hyaTIsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TSFJJMywgbW9kZWxfaTk2MENBX3NocmkzLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fRU1VTCwgbW9kZWxfaTk2MENBX2VtdWwsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9FTVVMMSwgbW9kZWxfaTk2MENBX2VtdWwxLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fRU1VTDIsIG1vZGVsX2k5NjBDQV9lbXVsMiwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0VNVUwzLCBtb2RlbF9pOTYwQ0FfZW11bDMsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9NT1YsIG1vZGVsX2k5NjBDQV9tb3YsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9NT1YxLCBtb2RlbF9pOTYwQ0FfbW92MSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX01PVkwsIG1vZGVsX2k5NjBDQV9tb3ZsLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTU9WTDEsIG1vZGVsX2k5NjBDQV9tb3ZsMSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX01PVlQsIG1vZGVsX2k5NjBDQV9tb3Z0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTU9WVDEsIG1vZGVsX2k5NjBDQV9tb3Z0MSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX01PVlEsIG1vZGVsX2k5NjBDQV9tb3ZxLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTU9WUTEsIG1vZGVsX2k5NjBDQV9tb3ZxMSwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX01PRFBDLCBtb2RlbF9pOTYwQ0FfbW9kcGMsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9NT0RBQywgbW9kZWxfaTk2MENBX21vZGFjLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERBX09GRlNFVCwgbW9kZWxfaTk2MENBX2xkYV9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwQ0FfbGRhX2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVCwgbW9kZWxfaTk2MENBX2xkYV9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MENBX2xkYV9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEQV9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRhX2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MENBX2xkYV9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERBX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBDQV9sZGFfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRhX2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRF9PRkZTRVQsIG1vZGVsX2k5NjBDQV9sZF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBDQV9sZF9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVCwgbW9kZWxfaTk2MENBX2xkX2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBDQV9sZF9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEX0RJU1AsIG1vZGVsX2k5NjBDQV9sZF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MENBX2xkX2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBDQV9sZF9pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERPQl9PRkZTRVQsIG1vZGVsX2k5NjBDQV9sZG9iX29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwQ0FfbGRvYl9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNULCBtb2RlbF9pOTYwQ0FfbGRvYl9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBDQV9sZG9iX2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERPQl9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRvYl9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRvYl9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERPQl9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRvYl9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRvYl9pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERPU19PRkZTRVQsIG1vZGVsX2k5NjBDQV9sZG9zX29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwQ0FfbGRvc19pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRE9TX0lORElSRUNULCBtb2RlbF9pOTYwQ0FfbGRvc19pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBDQV9sZG9zX2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERPU19ESVNQLCBtb2RlbF9pOTYwQ0FfbGRvc19kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRvc19pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERPU19JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRvc19pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRvc19pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERJQl9PRkZTRVQsIG1vZGVsX2k5NjBDQV9sZGliX29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xESUJfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwQ0FfbGRpYl9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNULCBtb2RlbF9pOTYwQ0FfbGRpYl9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xESUJfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBDQV9sZGliX2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERJQl9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRpYl9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRpYl9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERJQl9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRpYl9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRpYl9pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERJU19PRkZTRVQsIG1vZGVsX2k5NjBDQV9sZGlzX29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwQ0FfbGRpc19pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNULCBtb2RlbF9pOTYwQ0FfbGRpc19pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBDQV9sZGlzX2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERJU19ESVNQLCBtb2RlbF9pOTYwQ0FfbGRpc19kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERJU19JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRpc19pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERJU19JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRpc19pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERJU19JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRpc19pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERMX09GRlNFVCwgbW9kZWxfaTk2MENBX2xkbF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwQ0FfbGRsX2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVCwgbW9kZWxfaTk2MENBX2xkbF9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MENBX2xkbF9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xETF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRsX2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MENBX2xkbF9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERMX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBDQV9sZGxfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRsX2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRFRfT0ZGU0VULCBtb2RlbF9pOTYwQ0FfbGR0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBDQV9sZHRfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNULCBtb2RlbF9pOTYwQ0FfbGR0X2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwQ0FfbGR0X2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERUX0RJU1AsIG1vZGVsX2k5NjBDQV9sZHRfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGR0X2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRFRfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX2xkdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBDQV9sZHRfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEUV9PRkZTRVQsIG1vZGVsX2k5NjBDQV9sZHFfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MENBX2xkcV9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1QsIG1vZGVsX2k5NjBDQV9sZHFfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBDQV9sZHFfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRFFfRElTUCwgbW9kZWxfaTk2MENBX2xkcV9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBDQV9sZHFfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0xEUV9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0FfbGRxX2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RfT0ZGU0VULCBtb2RlbF9pOTYwQ0Ffc3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwQ0Ffc3RfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RfSU5ESVJFQ1QsIG1vZGVsX2k5NjBDQV9zdF9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwQ0Ffc3RfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVF9ESVNQLCBtb2RlbF9pOTYwQ0Ffc3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBDQV9zdF9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX3N0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0Ffc3RfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfT0ZGU0VULCBtb2RlbF9pOTYwQ0Ffc3RvYl9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MENBX3N0b2JfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVCwgbW9kZWxfaTk2MENBX3N0b2JfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwQ0Ffc3RvYl9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfRElTUCwgbW9kZWxfaTk2MENBX3N0b2JfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MENBX3N0b2JfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX3N0b2JfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX3N0b2JfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfT0ZGU0VULCBtb2RlbF9pOTYwQ0Ffc3Rvc19vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MENBX3N0b3NfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVCwgbW9kZWxfaTk2MENBX3N0b3NfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwQ0Ffc3Rvc19pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfRElTUCwgbW9kZWxfaTk2MENBX3N0b3NfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MENBX3N0b3NfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX3N0b3NfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX3N0b3NfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUTF9PRkZTRVQsIG1vZGVsX2k5NjBDQV9zdGxfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNUX09GRlNFVCwgbW9kZWxfaTk2MENBX3N0bF9pbmRpcmVjdF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1QsIG1vZGVsX2k5NjBDQV9zdGxfaW5kaXJlY3QsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1RfSU5ERVgsIG1vZGVsX2k5NjBDQV9zdGxfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVExfRElTUCwgbW9kZWxfaTk2MENBX3N0bF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBDQV9zdGxfaW5kaXJlY3RfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUTF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0Ffc3RsX2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1RfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX3N0bF9pbmRpcmVjdF9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RUX09GRlNFVCwgbW9kZWxfaTk2MENBX3N0dF9vZmZzZXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwQ0Ffc3R0X2luZGlyZWN0X29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUVF9JTkRJUkVDVCwgbW9kZWxfaTk2MENBX3N0dF9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUVF9JTkRJUkVDVF9JTkRFWCwgbW9kZWxfaTk2MENBX3N0dF9pbmRpcmVjdF9pbmRleCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUVF9ESVNQLCBtb2RlbF9pOTYwQ0Ffc3R0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1RfRElTUCwgbW9kZWxfaTk2MENBX3N0dF9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBDQV9zdHRfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUVF9JTkRJUkVDVF9JTkRFWF9ESVNQLCBtb2RlbF9pOTYwQ0Ffc3R0X2luZGlyZWN0X2luZGV4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVFFfT0ZGU0VULCBtb2RlbF9pOTYwQ0Ffc3RxX29mZnNldCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVF9PRkZTRVQsIG1vZGVsX2k5NjBDQV9zdHFfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNULCBtb2RlbF9pOTYwQ0Ffc3RxX2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwQ0Ffc3RxX2luZGlyZWN0X2luZGV4LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RRX0RJU1AsIG1vZGVsX2k5NjBDQV9zdHFfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVF9ESVNQLCBtb2RlbF9pOTYwQ0Ffc3RxX2luZGlyZWN0X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9TVFFfSU5ERVhfRElTUCwgbW9kZWxfaTk2MENBX3N0cV9pbmRleF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNUX0lOREVYX0RJU1AsIG1vZGVsX2k5NjBDQV9zdHFfaW5kaXJlY3RfaW5kZXhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CRV9SRUcsIG1vZGVsX2k5NjBDQV9jbXBvYmVfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QT0JFX0xJVCwgbW9kZWxfaTk2MENBX2NtcG9iZV9saXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBPQk5FX1JFRywgbW9kZWxfaTk2MENBX2NtcG9ibmVfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QT0JORV9MSVQsIG1vZGVsX2k5NjBDQV9jbXBvYm5lX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CTF9SRUcsIG1vZGVsX2k5NjBDQV9jbXBvYmxfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QT0JMX0xJVCwgbW9kZWxfaTk2MENBX2NtcG9ibF9saXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkxFX1JFRywgbW9kZWxfaTk2MENBX2NtcG9ibGVfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QT0JMRV9MSVQsIG1vZGVsX2k5NjBDQV9jbXBvYmxlX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CR19SRUcsIG1vZGVsX2k5NjBDQV9jbXBvYmdfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QT0JHX0xJVCwgbW9kZWxfaTk2MENBX2NtcG9iZ19saXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkdFX1JFRywgbW9kZWxfaTk2MENBX2NtcG9iZ2VfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QT0JHRV9MSVQsIG1vZGVsX2k5NjBDQV9jbXBvYmdlX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NNUElCRV9SRUcsIG1vZGVsX2k5NjBDQV9jbXBpYmVfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QSUJFX0xJVCwgbW9kZWxfaTk2MENBX2NtcGliZV9saXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBJQk5FX1JFRywgbW9kZWxfaTk2MENBX2NtcGlibmVfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QSUJORV9MSVQsIG1vZGVsX2k5NjBDQV9jbXBpYm5lX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NNUElCTF9SRUcsIG1vZGVsX2k5NjBDQV9jbXBpYmxfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QSUJMX0xJVCwgbW9kZWxfaTk2MENBX2NtcGlibF9saXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkxFX1JFRywgbW9kZWxfaTk2MENBX2NtcGlibGVfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QSUJMRV9MSVQsIG1vZGVsX2k5NjBDQV9jbXBpYmxlX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NNUElCR19SRUcsIG1vZGVsX2k5NjBDQV9jbXBpYmdfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QSUJHX0xJVCwgbW9kZWxfaTk2MENBX2NtcGliZ19saXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkdFX1JFRywgbW9kZWxfaTk2MENBX2NtcGliZ2VfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QSUJHRV9MSVQsIG1vZGVsX2k5NjBDQV9jbXBpYmdlX2xpdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0JCQ19SRUcsIG1vZGVsX2k5NjBDQV9iYmNfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQkJDX0xJVCwgbW9kZWxfaTk2MENBX2JiY19saXQsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9CQlNfUkVHLCBtb2RlbF9pOTYwQ0FfYmJzX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0JCU19MSVQsIG1vZGVsX2k5NjBDQV9iYnNfbGl0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QSSwgbW9kZWxfaTk2MENBX2NtcGksIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBJMSwgbW9kZWxfaTk2MENBX2NtcGkxLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QSTIsIG1vZGVsX2k5NjBDQV9jbXBpMiwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NNUEkzLCBtb2RlbF9pOTYwQ0FfY21waTMsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBPLCBtb2RlbF9pOTYwQ0FfY21wbywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0NNUE8xLCBtb2RlbF9pOTYwQ0FfY21wbzEsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DTVBPMiwgbW9kZWxfaTk2MENBX2NtcG8yLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ01QTzMsIG1vZGVsX2k5NjBDQV9jbXBvMywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1RFU1ROT19SRUcsIG1vZGVsX2k5NjBDQV90ZXN0bm9fcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fVEVTVEdfUkVHLCBtb2RlbF9pOTYwQ0FfdGVzdGdfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fVEVTVEVfUkVHLCBtb2RlbF9pOTYwQ0FfdGVzdGVfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fVEVTVEdFX1JFRywgbW9kZWxfaTk2MENBX3Rlc3RnZV9yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9URVNUTF9SRUcsIG1vZGVsX2k5NjBDQV90ZXN0bF9yZWcsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9URVNUTkVfUkVHLCBtb2RlbF9pOTYwQ0FfdGVzdG5lX3JlZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX1RFU1RMRV9SRUcsIG1vZGVsX2k5NjBDQV90ZXN0bGVfcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fVEVTVE9fUkVHLCBtb2RlbF9pOTYwQ0FfdGVzdG9fcmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQk5PLCBtb2RlbF9pOTYwQ0FfYm5vLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQkcsIG1vZGVsX2k5NjBDQV9iZywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0JFLCBtb2RlbF9pOTYwQ0FfYmUsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9CR0UsIG1vZGVsX2k5NjBDQV9iZ2UsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9CTCwgbW9kZWxfaTk2MENBX2JsLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQk5FLCBtb2RlbF9pOTYwQ0FfYm5lLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQkxFLCBtb2RlbF9pOTYwQ0FfYmxlLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQk8sIG1vZGVsX2k5NjBDQV9ibywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0IsIG1vZGVsX2k5NjBDQV9iLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQlhfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwQ0FfYnhfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQlhfSU5ESVJFQ1QsIG1vZGVsX2k5NjBDQV9ieF9pbmRpcmVjdCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0JYX0lORElSRUNUX0lOREVYLCBtb2RlbF9pOTYwQ0FfYnhfaW5kaXJlY3RfaW5kZXgsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9CWF9ESVNQLCBtb2RlbF9pOTYwQ0FfYnhfZGlzcCwgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0JYX0lORElSRUNUX0RJU1AsIG1vZGVsX2k5NjBDQV9ieF9pbmRpcmVjdF9kaXNwLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ0FMTFhfRElTUCwgbW9kZWxfaTk2MENBX2NhbGx4X2Rpc3AsIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9DQUxMWF9JTkRJUkVDVCwgbW9kZWxfaTk2MENBX2NhbGx4X2luZGlyZWN0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ0FMTFhfSU5ESVJFQ1RfT0ZGU0VULCBtb2RlbF9pOTYwQ0FfY2FsbHhfaW5kaXJlY3Rfb2Zmc2V0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fUkVULCBtb2RlbF9pOTYwQ0FfcmV0LCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IEk5NjBCQVNFX0lOU05fQ0FMTFMsIG1vZGVsX2k5NjBDQV9jYWxscywgeyB7IChpbnQpIFVOSVRfSTk2MENBX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBJOTYwQkFTRV9JTlNOX0ZNQVJLLCBtb2RlbF9pOTYwQ0FfZm1hcmssIHsgeyAoaW50KSBVTklUX0k5NjBDQV9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgSTk2MEJBU0VfSU5TTl9GTFVTSFJFRywgbW9kZWxfaTk2MENBX2ZsdXNocmVnLCB7IHsgKGludCkgVU5JVF9JOTYwQ0FfVV9FWEVDLCAxLCAxIH0gfSB9LAorfTsKKworI2VuZGlmIC8qIFdJVEhfUFJPRklMRV9NT0RFTF9QICovCisKK3N0YXRpYyB2b2lkCitpOTYwS0FfbW9kZWxfaW5pdCAoU0lNX0NQVSAqY3B1KQoreworICBDUFVfTU9ERUxfREFUQSAoY3B1KSA9ICh2b2lkICopIHphbGxvYyAoc2l6ZW9mIChNT0RFTF9JOTYwS0FfREFUQSkpOworfQorCitzdGF0aWMgdm9pZAoraTk2MENBX21vZGVsX2luaXQgKFNJTV9DUFUgKmNwdSkKK3sKKyAgQ1BVX01PREVMX0RBVEEgKGNwdSkgPSAodm9pZCAqKSB6YWxsb2MgKHNpemVvZiAoTU9ERUxfSTk2MENBX0RBVEEpKTsKK30KKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisjZGVmaW5lIFRJTUlOR19EQVRBKHRkKSB0ZAorI2Vsc2UKKyNkZWZpbmUgVElNSU5HX0RBVEEodGQpIDAKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgTU9ERUwgaTk2MF9rYV9zYV9tb2RlbHNbXSA9Cit7CisgIHsgImk5NjBLQSIsICYgaTk2MF9rYV9zYV9tYWNoLCBNT0RFTF9JOTYwS0EsIFRJTUlOR19EQVRBICgmIGk5NjBLQV90aW1pbmdbMF0pLCBpOTYwS0FfbW9kZWxfaW5pdCB9LAorICB7IDAgfQorfTsKKworc3RhdGljIGNvbnN0IE1PREVMIGk5NjBfY2FfbW9kZWxzW10gPQoreworICB7ICJpOTYwQ0EiLCAmIGk5NjBfY2FfbWFjaCwgTU9ERUxfSTk2MENBLCBUSU1JTkdfREFUQSAoJiBpOTYwQ0FfdGltaW5nWzBdKSwgaTk2MENBX21vZGVsX2luaXQgfSwKKyAgeyAwIH0KK307CisKKy8qIFRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgY3B1J3MgaW1wbGVtZW50YXRpb24uICAqLworCitzdGF0aWMgY29uc3QgTUFDSF9JTVBfUFJPUEVSVElFUyBpOTYwYmFzZV9pbXBfcHJvcGVydGllcyA9Cit7CisgIHNpemVvZiAoU0lNX0NQVSksCisjaWYgV0lUSF9TQ0FDSEUKKyAgc2l6ZW9mIChTQ0FDSEUpCisjZWxzZQorICAwCisjZW5kaWYKK307CisKKworc3RhdGljIHZvaWQKK2k5NjBiYXNlX3ByZXBhcmVfcnVuIChTSU1fQ1BVICpjcHUpCit7CisgIGlmIChDUFVfSURFU0MgKGNwdSkgPT0gTlVMTCkKKyAgICBpOTYwYmFzZV9pbml0X2lkZXNjX3RhYmxlIChjcHUpOworfQorCitzdGF0aWMgY29uc3QgQ0dFTl9JTlNOICoKK2k5NjBiYXNlX2dldF9pZGF0YSAoU0lNX0NQVSAqY3B1LCBpbnQgaW51bSkKK3sKKyAgcmV0dXJuIENQVV9JREVTQyAoY3B1KSBbaW51bV0uaWRhdGE7Cit9CisKK3N0YXRpYyB2b2lkCitpOTYwX2thX3NhX2luaXRfY3B1IChTSU1fQ1BVICpjcHUpCit7CisgIENQVV9SRUdfRkVUQ0ggKGNwdSkgPSBpOTYwYmFzZV9mZXRjaF9yZWdpc3RlcjsKKyAgQ1BVX1JFR19TVE9SRSAoY3B1KSA9IGk5NjBiYXNlX3N0b3JlX3JlZ2lzdGVyOworICBDUFVfUENfRkVUQ0ggKGNwdSkgPSBpOTYwYmFzZV9oX3BjX2dldDsKKyAgQ1BVX1BDX1NUT1JFIChjcHUpID0gaTk2MGJhc2VfaF9wY19zZXQ7CisgIENQVV9HRVRfSURBVEEgKGNwdSkgPSBpOTYwYmFzZV9nZXRfaWRhdGE7CisgIENQVV9NQVhfSU5TTlMgKGNwdSkgPSBJOTYwQkFTRV9JTlNOX01BWDsKKyAgQ1BVX0lOU05fTkFNRSAoY3B1KSA9IGNnZW5faW5zbl9uYW1lOworICBDUFVfRlVMTF9FTkdJTkVfRk4gKGNwdSkgPSBpOTYwYmFzZV9lbmdpbmVfcnVuX2Z1bGw7CisjaWYgV0lUSF9GQVNUCisgIENQVV9GQVNUX0VOR0lORV9GTiAoY3B1KSA9IGk5NjBiYXNlX2VuZ2luZV9ydW5fZmFzdDsKKyNlbHNlCisgIENQVV9GQVNUX0VOR0lORV9GTiAoY3B1KSA9IGk5NjBiYXNlX2VuZ2luZV9ydW5fZnVsbDsKKyNlbmRpZgorfQorCitjb25zdCBNQUNIIGk5NjBfa2Ffc2FfbWFjaCA9Cit7CisgICJpOTYwOmthX3NhIiwgImk5NjA6a2Ffc2EiLAorICAzMiwgMzIsICYgaTk2MF9rYV9zYV9tb2RlbHNbMF0sICYgaTk2MGJhc2VfaW1wX3Byb3BlcnRpZXMsCisgIGk5NjBfa2Ffc2FfaW5pdF9jcHUsCisgIGk5NjBiYXNlX3ByZXBhcmVfcnVuCit9OworCitzdGF0aWMgdm9pZAoraTk2MF9jYV9pbml0X2NwdSAoU0lNX0NQVSAqY3B1KQoreworICBDUFVfUkVHX0ZFVENIIChjcHUpID0gaTk2MGJhc2VfZmV0Y2hfcmVnaXN0ZXI7CisgIENQVV9SRUdfU1RPUkUgKGNwdSkgPSBpOTYwYmFzZV9zdG9yZV9yZWdpc3RlcjsKKyAgQ1BVX1BDX0ZFVENIIChjcHUpID0gaTk2MGJhc2VfaF9wY19nZXQ7CisgIENQVV9QQ19TVE9SRSAoY3B1KSA9IGk5NjBiYXNlX2hfcGNfc2V0OworICBDUFVfR0VUX0lEQVRBIChjcHUpID0gaTk2MGJhc2VfZ2V0X2lkYXRhOworICBDUFVfTUFYX0lOU05TIChjcHUpID0gSTk2MEJBU0VfSU5TTl9NQVg7CisgIENQVV9JTlNOX05BTUUgKGNwdSkgPSBjZ2VuX2luc25fbmFtZTsKKyAgQ1BVX0ZVTExfRU5HSU5FX0ZOIChjcHUpID0gaTk2MGJhc2VfZW5naW5lX3J1bl9mdWxsOworI2lmIFdJVEhfRkFTVAorICBDUFVfRkFTVF9FTkdJTkVfRk4gKGNwdSkgPSBpOTYwYmFzZV9lbmdpbmVfcnVuX2Zhc3Q7CisjZWxzZQorICBDUFVfRkFTVF9FTkdJTkVfRk4gKGNwdSkgPSBpOTYwYmFzZV9lbmdpbmVfcnVuX2Z1bGw7CisjZW5kaWYKK30KKworY29uc3QgTUFDSCBpOTYwX2NhX21hY2ggPQoreworICAiaTk2MDpjYSIsICJpOTYwOmNhIiwKKyAgMzIsIDMyLCAmIGk5NjBfY2FfbW9kZWxzWzBdLCAmIGk5NjBiYXNlX2ltcF9wcm9wZXJ0aWVzLAorICBpOTYwX2NhX2luaXRfY3B1LAorICBpOTYwYmFzZV9wcmVwYXJlX3J1bgorfTsKKwpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvc2VtLXN3aXRjaC5jIGIvc2ltL2k5NjAvc2VtLXN3aXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjUyZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaTk2MC9zZW0tc3dpdGNoLmMKQEAgLTAsMCArMSw3MTgxIEBACisvKiBTaW11bGF0b3IgaW5zdHJ1Y3Rpb24gc2VtYW50aWNzIGZvciBpOTYwYmFzZS4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2lmZGVmIERFRklORV9MQUJFTFMKKworICAvKiBUaGUgbGFiZWxzIGhhdmUgdGhlIGNhc2UgdGhleSBoYXZlIGJlY2F1c2UgdGhlIGVudW0gb2YgaW5zbiB0eXBlcworICAgICBpcyBhbGwgdXBwZXJjYXNlIGFuZCBpbiB0aGUgbm9uLXN0ZGMgY2FzZSB0aGUgaW5zbiBzeW1ib2wgaXMgYnVpbHQKKyAgICAgaW50byB0aGUgZW51bSBuYW1lLiAgKi8KKworICBzdGF0aWMgc3RydWN0IHsKKyAgICBpbnQgaW5kZXg7CisgICAgdm9pZCAqbGFiZWw7CisgIH0gbGFiZWxzW10gPSB7CisgICAgeyBJOTYwQkFTRV9JTlNOX1hfSU5WQUxJRCwgJiYgY2FzZV9zZW1fSU5TTl9YX0lOVkFMSUQgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fWF9BRlRFUiwgJiYgY2FzZV9zZW1fSU5TTl9YX0FGVEVSIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1hfQkVGT1JFLCAmJiBjYXNlX3NlbV9JTlNOX1hfQkVGT1JFIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1hfQ1RJX0NIQUlOLCAmJiBjYXNlX3NlbV9JTlNOX1hfQ1RJX0NIQUlOIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1hfQ0hBSU4sICYmIGNhc2Vfc2VtX0lOU05fWF9DSEFJTiB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9YX0JFR0lOLCAmJiBjYXNlX3NlbV9JTlNOX1hfQkVHSU4gfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTVVMTywgJiYgY2FzZV9zZW1fSU5TTl9NVUxPIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX01VTE8xLCAmJiBjYXNlX3NlbV9JTlNOX01VTE8xIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX01VTE8yLCAmJiBjYXNlX3NlbV9JTlNOX01VTE8yIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX01VTE8zLCAmJiBjYXNlX3NlbV9JTlNOX01VTE8zIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1JFTU8sICYmIGNhc2Vfc2VtX0lOU05fUkVNTyB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9SRU1PMSwgJiYgY2FzZV9zZW1fSU5TTl9SRU1PMSB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9SRU1PMiwgJiYgY2FzZV9zZW1fSU5TTl9SRU1PMiB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9SRU1PMywgJiYgY2FzZV9zZW1fSU5TTl9SRU1PMyB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9ESVZPLCAmJiBjYXNlX3NlbV9JTlNOX0RJVk8gfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fRElWTzEsICYmIGNhc2Vfc2VtX0lOU05fRElWTzEgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fRElWTzIsICYmIGNhc2Vfc2VtX0lOU05fRElWTzIgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fRElWTzMsICYmIGNhc2Vfc2VtX0lOU05fRElWTzMgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fUkVNSSwgJiYgY2FzZV9zZW1fSU5TTl9SRU1JIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1JFTUkxLCAmJiBjYXNlX3NlbV9JTlNOX1JFTUkxIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1JFTUkyLCAmJiBjYXNlX3NlbV9JTlNOX1JFTUkyIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1JFTUkzLCAmJiBjYXNlX3NlbV9JTlNOX1JFTUkzIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0RJVkksICYmIGNhc2Vfc2VtX0lOU05fRElWSSB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9ESVZJMSwgJiYgY2FzZV9zZW1fSU5TTl9ESVZJMSB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9ESVZJMiwgJiYgY2FzZV9zZW1fSU5TTl9ESVZJMiB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9ESVZJMywgJiYgY2FzZV9zZW1fSU5TTl9ESVZJMyB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9BRERPLCAmJiBjYXNlX3NlbV9JTlNOX0FERE8gfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQURETzEsICYmIGNhc2Vfc2VtX0lOU05fQURETzEgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQURETzIsICYmIGNhc2Vfc2VtX0lOU05fQURETzIgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQURETzMsICYmIGNhc2Vfc2VtX0lOU05fQURETzMgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fU1VCTywgJiYgY2FzZV9zZW1fSU5TTl9TVUJPIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NVQk8xLCAmJiBjYXNlX3NlbV9JTlNOX1NVQk8xIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NVQk8yLCAmJiBjYXNlX3NlbV9JTlNOX1NVQk8yIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NVQk8zLCAmJiBjYXNlX3NlbV9JTlNOX1NVQk8zIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX05PVEJJVCwgJiYgY2FzZV9zZW1fSU5TTl9OT1RCSVQgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTk9UQklUMSwgJiYgY2FzZV9zZW1fSU5TTl9OT1RCSVQxIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX05PVEJJVDIsICYmIGNhc2Vfc2VtX0lOU05fTk9UQklUMiB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9OT1RCSVQzLCAmJiBjYXNlX3NlbV9JTlNOX05PVEJJVDMgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQU5ELCAmJiBjYXNlX3NlbV9JTlNOX0FORCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9BTkQxLCAmJiBjYXNlX3NlbV9JTlNOX0FORDEgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQU5EMiwgJiYgY2FzZV9zZW1fSU5TTl9BTkQyIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0FORDMsICYmIGNhc2Vfc2VtX0lOU05fQU5EMyB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9BTkROT1QsICYmIGNhc2Vfc2VtX0lOU05fQU5ETk9UIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0FORE5PVDEsICYmIGNhc2Vfc2VtX0lOU05fQU5ETk9UMSB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9BTkROT1QyLCAmJiBjYXNlX3NlbV9JTlNOX0FORE5PVDIgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQU5ETk9UMywgJiYgY2FzZV9zZW1fSU5TTl9BTkROT1QzIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NFVEJJVCwgJiYgY2FzZV9zZW1fSU5TTl9TRVRCSVQgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fU0VUQklUMSwgJiYgY2FzZV9zZW1fSU5TTl9TRVRCSVQxIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NFVEJJVDIsICYmIGNhc2Vfc2VtX0lOU05fU0VUQklUMiB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TRVRCSVQzLCAmJiBjYXNlX3NlbV9JTlNOX1NFVEJJVDMgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTk9UQU5ELCAmJiBjYXNlX3NlbV9JTlNOX05PVEFORCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9OT1RBTkQxLCAmJiBjYXNlX3NlbV9JTlNOX05PVEFORDEgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTk9UQU5EMiwgJiYgY2FzZV9zZW1fSU5TTl9OT1RBTkQyIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX05PVEFORDMsICYmIGNhc2Vfc2VtX0lOU05fTk9UQU5EMyB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9YT1IsICYmIGNhc2Vfc2VtX0lOU05fWE9SIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1hPUjEsICYmIGNhc2Vfc2VtX0lOU05fWE9SMSB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9YT1IyLCAmJiBjYXNlX3NlbV9JTlNOX1hPUjIgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fWE9SMywgJiYgY2FzZV9zZW1fSU5TTl9YT1IzIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX09SLCAmJiBjYXNlX3NlbV9JTlNOX09SIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX09SMSwgJiYgY2FzZV9zZW1fSU5TTl9PUjEgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fT1IyLCAmJiBjYXNlX3NlbV9JTlNOX09SMiB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9PUjMsICYmIGNhc2Vfc2VtX0lOU05fT1IzIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX05PUiwgJiYgY2FzZV9zZW1fSU5TTl9OT1IgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTk9SMSwgJiYgY2FzZV9zZW1fSU5TTl9OT1IxIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX05PUjIsICYmIGNhc2Vfc2VtX0lOU05fTk9SMiB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9OT1IzLCAmJiBjYXNlX3NlbV9JTlNOX05PUjMgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTk9ULCAmJiBjYXNlX3NlbV9JTlNOX05PVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9OT1QxLCAmJiBjYXNlX3NlbV9JTlNOX05PVDEgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTk9UMiwgJiYgY2FzZV9zZW1fSU5TTl9OT1QyIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX05PVDMsICYmIGNhc2Vfc2VtX0lOU05fTk9UMyB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9DTFJCSVQsICYmIGNhc2Vfc2VtX0lOU05fQ0xSQklUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0NMUkJJVDEsICYmIGNhc2Vfc2VtX0lOU05fQ0xSQklUMSB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9DTFJCSVQyLCAmJiBjYXNlX3NlbV9JTlNOX0NMUkJJVDIgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQ0xSQklUMywgJiYgY2FzZV9zZW1fSU5TTl9DTFJCSVQzIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NITE8sICYmIGNhc2Vfc2VtX0lOU05fU0hMTyB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TSExPMSwgJiYgY2FzZV9zZW1fSU5TTl9TSExPMSB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TSExPMiwgJiYgY2FzZV9zZW1fSU5TTl9TSExPMiB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TSExPMywgJiYgY2FzZV9zZW1fSU5TTl9TSExPMyB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TSFJPLCAmJiBjYXNlX3NlbV9JTlNOX1NIUk8gfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fU0hSTzEsICYmIGNhc2Vfc2VtX0lOU05fU0hSTzEgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fU0hSTzIsICYmIGNhc2Vfc2VtX0lOU05fU0hSTzIgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fU0hSTzMsICYmIGNhc2Vfc2VtX0lOU05fU0hSTzMgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fU0hMSSwgJiYgY2FzZV9zZW1fSU5TTl9TSExJIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NITEkxLCAmJiBjYXNlX3NlbV9JTlNOX1NITEkxIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NITEkyLCAmJiBjYXNlX3NlbV9JTlNOX1NITEkyIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NITEkzLCAmJiBjYXNlX3NlbV9JTlNOX1NITEkzIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NIUkksICYmIGNhc2Vfc2VtX0lOU05fU0hSSSB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TSFJJMSwgJiYgY2FzZV9zZW1fSU5TTl9TSFJJMSB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TSFJJMiwgJiYgY2FzZV9zZW1fSU5TTl9TSFJJMiB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TSFJJMywgJiYgY2FzZV9zZW1fSU5TTl9TSFJJMyB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9FTVVMLCAmJiBjYXNlX3NlbV9JTlNOX0VNVUwgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fRU1VTDEsICYmIGNhc2Vfc2VtX0lOU05fRU1VTDEgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fRU1VTDIsICYmIGNhc2Vfc2VtX0lOU05fRU1VTDIgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fRU1VTDMsICYmIGNhc2Vfc2VtX0lOU05fRU1VTDMgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTU9WLCAmJiBjYXNlX3NlbV9JTlNOX01PViB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9NT1YxLCAmJiBjYXNlX3NlbV9JTlNOX01PVjEgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTU9WTCwgJiYgY2FzZV9zZW1fSU5TTl9NT1ZMIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX01PVkwxLCAmJiBjYXNlX3NlbV9JTlNOX01PVkwxIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX01PVlQsICYmIGNhc2Vfc2VtX0lOU05fTU9WVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9NT1ZUMSwgJiYgY2FzZV9zZW1fSU5TTl9NT1ZUMSB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9NT1ZRLCAmJiBjYXNlX3NlbV9JTlNOX01PVlEgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTU9WUTEsICYmIGNhc2Vfc2VtX0lOU05fTU9WUTEgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTU9EUEMsICYmIGNhc2Vfc2VtX0lOU05fTU9EUEMgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTU9EQUMsICYmIGNhc2Vfc2VtX0lOU05fTU9EQUMgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERBX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9MREFfT0ZGU0VUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVF9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fTERBX0lORElSRUNUX09GRlNFVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MREFfSU5ESVJFQ1QsICYmIGNhc2Vfc2VtX0lOU05fTERBX0lORElSRUNUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xEQV9JTkRJUkVDVF9JTkRFWCwgJiYgY2FzZV9zZW1fSU5TTl9MREFfSU5ESVJFQ1RfSU5ERVggfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERBX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERBX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERBX0lORElSRUNUX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERBX0lORElSRUNUX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERBX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERBX0lOREVYX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERBX0lORElSRUNUX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERBX0lORElSRUNUX0lOREVYX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX0xEX09GRlNFVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVF9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fTERfSU5ESVJFQ1RfT0ZGU0VUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xEX0lORElSRUNULCAmJiBjYXNlX3NlbV9JTlNOX0xEX0lORElSRUNUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xEX0lORElSRUNUX0lOREVYLCAmJiBjYXNlX3NlbV9JTlNOX0xEX0lORElSRUNUX0lOREVYIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xEX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERfRElTUCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MRF9JTkRJUkVDVF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xEX0lORElSRUNUX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERfSU5ERVhfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9MRF9JTkRFWF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xEX0lORElSRUNUX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERfSU5ESVJFQ1RfSU5ERVhfRElTUCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MRE9CX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9MRE9CX09GRlNFVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNUX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9MRE9CX0lORElSRUNUX09GRlNFVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MRE9CX0lORElSRUNULCAmJiBjYXNlX3NlbV9JTlNOX0xET0JfSU5ESVJFQ1QgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVF9JTkRFWCwgJiYgY2FzZV9zZW1fSU5TTl9MRE9CX0lORElSRUNUX0lOREVYIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xET0JfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9MRE9CX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERPQl9JTkRJUkVDVF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xET0JfSU5ESVJFQ1RfRElTUCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MRE9CX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERPQl9JTkRFWF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xET0JfSU5ESVJFQ1RfSU5ERVhfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9MRE9CX0lORElSRUNUX0lOREVYX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERPU19PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fTERPU19PRkZTRVQgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVF9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fTERPU19JTkRJUkVDVF9PRkZTRVQgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERPU19JTkRJUkVDVCwgJiYgY2FzZV9zZW1fSU5TTl9MRE9TX0lORElSRUNUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfSU5ERVgsICYmIGNhc2Vfc2VtX0lOU05fTERPU19JTkRJUkVDVF9JTkRFWCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MRE9TX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERPU19ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xET1NfSU5ESVJFQ1RfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9MRE9TX0lORElSRUNUX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERPU19JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xET1NfSU5ERVhfRElTUCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MRE9TX0lORElSRUNUX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERPU19JTkRJUkVDVF9JTkRFWF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xESUJfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX0xESUJfT0ZGU0VUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xESUJfSU5ESVJFQ1RfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX0xESUJfSU5ESVJFQ1RfT0ZGU0VUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xESUJfSU5ESVJFQ1QsICYmIGNhc2Vfc2VtX0lOU05fTERJQl9JTkRJUkVDVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNUX0lOREVYLCAmJiBjYXNlX3NlbV9JTlNOX0xESUJfSU5ESVJFQ1RfSU5ERVggfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERJQl9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xESUJfRElTUCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MRElCX0lORElSRUNUX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERJQl9JTkRJUkVDVF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xESUJfSU5ERVhfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9MRElCX0lOREVYX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERJQl9JTkRJUkVDVF9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xESUJfSU5ESVJFQ1RfSU5ERVhfRElTUCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MRElTX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9MRElTX09GRlNFVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNUX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9MRElTX0lORElSRUNUX09GRlNFVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MRElTX0lORElSRUNULCAmJiBjYXNlX3NlbV9JTlNOX0xESVNfSU5ESVJFQ1QgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERJU19JTkRJUkVDVF9JTkRFWCwgJiYgY2FzZV9zZW1fSU5TTl9MRElTX0lORElSRUNUX0lOREVYIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xESVNfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9MRElTX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERJU19JTkRJUkVDVF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0xESVNfSU5ESVJFQ1RfRElTUCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MRElTX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERJU19JTkRFWF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xESVNfSU5ESVJFQ1RfSU5ERVhfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9MRElTX0lORElSRUNUX0lOREVYX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERMX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9MRExfT0ZGU0VUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVF9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fTERMX0lORElSRUNUX09GRlNFVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MRExfSU5ESVJFQ1QsICYmIGNhc2Vfc2VtX0lOU05fTERMX0lORElSRUNUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xETF9JTkRJUkVDVF9JTkRFWCwgJiYgY2FzZV9zZW1fSU5TTl9MRExfSU5ESVJFQ1RfSU5ERVggfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERMX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERMX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERMX0lORElSRUNUX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERMX0lORElSRUNUX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERMX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERMX0lOREVYX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERMX0lORElSRUNUX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERMX0lORElSRUNUX0lOREVYX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERUX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9MRFRfT0ZGU0VUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fTERUX0lORElSRUNUX09GRlNFVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MRFRfSU5ESVJFQ1QsICYmIGNhc2Vfc2VtX0lOU05fTERUX0lORElSRUNUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xEVF9JTkRJUkVDVF9JTkRFWCwgJiYgY2FzZV9zZW1fSU5TTl9MRFRfSU5ESVJFQ1RfSU5ERVggfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERUX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERUX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNUX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERUX0lORElSRUNUX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERUX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERUX0lOREVYX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERUX0lORElSRUNUX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERUX0lORElSRUNUX0lOREVYX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERRX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9MRFFfT0ZGU0VUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVF9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fTERRX0lORElSRUNUX09GRlNFVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9MRFFfSU5ESVJFQ1QsICYmIGNhc2Vfc2VtX0lOU05fTERRX0lORElSRUNUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0xEUV9JTkRJUkVDVF9JTkRFWCwgJiYgY2FzZV9zZW1fSU5TTl9MRFFfSU5ESVJFQ1RfSU5ERVggfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERRX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERRX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNUX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERRX0lORElSRUNUX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERRX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERRX0lOREVYX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fTERRX0lORElSRUNUX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fTERRX0lORElSRUNUX0lOREVYX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fU1RfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX1NUX09GRlNFVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TVF9JTkRJUkVDVF9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fU1RfSU5ESVJFQ1RfT0ZGU0VUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNULCAmJiBjYXNlX3NlbV9JTlNOX1NUX0lORElSRUNUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNUX0lOREVYLCAmJiBjYXNlX3NlbV9JTlNOX1NUX0lORElSRUNUX0lOREVYIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fU1RfRElTUCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TVF9JTkRJUkVDVF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUX0lORElSRUNUX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fU1RfSU5ERVhfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVF9JTkRFWF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUX0lORElSRUNUX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fU1RfSU5ESVJFQ1RfSU5ERVhfRElTUCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TVE9CX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9TVE9CX09GRlNFVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNUX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9TVE9CX0lORElSRUNUX09GRlNFVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0lORElSRUNULCAmJiBjYXNlX3NlbV9JTlNOX1NUT0JfSU5ESVJFQ1QgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVF9JTkRFWCwgJiYgY2FzZV9zZW1fSU5TTl9TVE9CX0lORElSRUNUX0lOREVYIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVE9CX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fU1RPQl9JTkRJUkVDVF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUT0JfSU5ESVJFQ1RfRElTUCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TVE9CX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fU1RPQl9JTkRFWF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUT0JfSU5ESVJFQ1RfSU5ERVhfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVE9CX0lORElSRUNUX0lOREVYX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fU1RPU19PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fU1RPU19PRkZTRVQgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVF9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fU1RPU19JTkRJUkVDVF9PRkZTRVQgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fU1RPU19JTkRJUkVDVCwgJiYgY2FzZV9zZW1fSU5TTl9TVE9TX0lORElSRUNUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1RfSU5ERVgsICYmIGNhc2Vfc2VtX0lOU05fU1RPU19JTkRJUkVDVF9JTkRFWCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TVE9TX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fU1RPU19ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUT1NfSU5ESVJFQ1RfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9TVE9TX0lORElSRUNUX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fU1RPU19JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUT1NfSU5ERVhfRElTUCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TVE9TX0lORElSRUNUX0lOREVYX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fU1RPU19JTkRJUkVDVF9JTkRFWF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUTF9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fU1RMX09GRlNFVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1RfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX1NUTF9JTkRJUkVDVF9PRkZTRVQgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fU1RMX0lORElSRUNULCAmJiBjYXNlX3NlbV9JTlNOX1NUTF9JTkRJUkVDVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TVExfSU5ESVJFQ1RfSU5ERVgsICYmIGNhc2Vfc2VtX0lOU05fU1RMX0lORElSRUNUX0lOREVYIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUTF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUTF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUTF9JTkRJUkVDVF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUTF9JTkRJUkVDVF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUTF9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUTF9JTkRFWF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUTF9JTkRJUkVDVF9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUTF9JTkRJUkVDVF9JTkRFWF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUVF9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fU1RUX09GRlNFVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1RfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX1NUVF9JTkRJUkVDVF9PRkZTRVQgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fU1RUX0lORElSRUNULCAmJiBjYXNlX3NlbV9JTlNOX1NUVF9JTkRJUkVDVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TVFRfSU5ESVJFQ1RfSU5ERVgsICYmIGNhc2Vfc2VtX0lOU05fU1RUX0lORElSRUNUX0lOREVYIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUVF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUVF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUVF9JTkRJUkVDVF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUVF9JTkRJUkVDVF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUVF9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUVF9JTkRFWF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUVF9JTkRJUkVDVF9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUVF9JTkRJUkVDVF9JTkRFWF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUUV9PRkZTRVQsICYmIGNhc2Vfc2VtX0lOU05fU1RRX09GRlNFVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TVFFfSU5ESVJFQ1RfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX1NUUV9JTkRJUkVDVF9PRkZTRVQgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fU1RRX0lORElSRUNULCAmJiBjYXNlX3NlbV9JTlNOX1NUUV9JTkRJUkVDVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9TVFFfSU5ESVJFQ1RfSU5ERVgsICYmIGNhc2Vfc2VtX0lOU05fU1RRX0lORElSRUNUX0lOREVYIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUUV9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUUV9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUUV9JTkRJUkVDVF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUUV9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUUV9JTkRFWF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1NUUV9JTkRJUkVDVF9JTkRFWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX1NUUV9JTkRJUkVDVF9JTkRFWF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CRV9SRUcsICYmIGNhc2Vfc2VtX0lOU05fQ01QT0JFX1JFRyB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkVfTElULCAmJiBjYXNlX3NlbV9JTlNOX0NNUE9CRV9MSVQgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQ01QT0JORV9SRUcsICYmIGNhc2Vfc2VtX0lOU05fQ01QT0JORV9SRUcgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQ01QT0JORV9MSVQsICYmIGNhc2Vfc2VtX0lOU05fQ01QT0JORV9MSVQgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQ01QT0JMX1JFRywgJiYgY2FzZV9zZW1fSU5TTl9DTVBPQkxfUkVHIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CTF9MSVQsICYmIGNhc2Vfc2VtX0lOU05fQ01QT0JMX0xJVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkxFX1JFRywgJiYgY2FzZV9zZW1fSU5TTl9DTVBPQkxFX1JFRyB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkxFX0xJVCwgJiYgY2FzZV9zZW1fSU5TTl9DTVBPQkxFX0xJVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBPQkdfUkVHLCAmJiBjYXNlX3NlbV9JTlNOX0NNUE9CR19SRUcgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQ01QT0JHX0xJVCwgJiYgY2FzZV9zZW1fSU5TTl9DTVBPQkdfTElUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CR0VfUkVHLCAmJiBjYXNlX3NlbV9JTlNOX0NNUE9CR0VfUkVHIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0NNUE9CR0VfTElULCAmJiBjYXNlX3NlbV9JTlNOX0NNUE9CR0VfTElUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0NNUElCRV9SRUcsICYmIGNhc2Vfc2VtX0lOU05fQ01QSUJFX1JFRyB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkVfTElULCAmJiBjYXNlX3NlbV9JTlNOX0NNUElCRV9MSVQgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQ01QSUJORV9SRUcsICYmIGNhc2Vfc2VtX0lOU05fQ01QSUJORV9SRUcgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQ01QSUJORV9MSVQsICYmIGNhc2Vfc2VtX0lOU05fQ01QSUJORV9MSVQgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQ01QSUJMX1JFRywgJiYgY2FzZV9zZW1fSU5TTl9DTVBJQkxfUkVHIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0NNUElCTF9MSVQsICYmIGNhc2Vfc2VtX0lOU05fQ01QSUJMX0xJVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkxFX1JFRywgJiYgY2FzZV9zZW1fSU5TTl9DTVBJQkxFX1JFRyB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkxFX0xJVCwgJiYgY2FzZV9zZW1fSU5TTl9DTVBJQkxFX0xJVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBJQkdfUkVHLCAmJiBjYXNlX3NlbV9JTlNOX0NNUElCR19SRUcgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQ01QSUJHX0xJVCwgJiYgY2FzZV9zZW1fSU5TTl9DTVBJQkdfTElUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0NNUElCR0VfUkVHLCAmJiBjYXNlX3NlbV9JTlNOX0NNUElCR0VfUkVHIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0NNUElCR0VfTElULCAmJiBjYXNlX3NlbV9JTlNOX0NNUElCR0VfTElUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0JCQ19SRUcsICYmIGNhc2Vfc2VtX0lOU05fQkJDX1JFRyB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9CQkNfTElULCAmJiBjYXNlX3NlbV9JTlNOX0JCQ19MSVQgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQkJTX1JFRywgJiYgY2FzZV9zZW1fSU5TTl9CQlNfUkVHIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0JCU19MSVQsICYmIGNhc2Vfc2VtX0lOU05fQkJTX0xJVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9DTVBJLCAmJiBjYXNlX3NlbV9JTlNOX0NNUEkgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQ01QSTEsICYmIGNhc2Vfc2VtX0lOU05fQ01QSTEgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQ01QSTIsICYmIGNhc2Vfc2VtX0lOU05fQ01QSTIgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQ01QSTMsICYmIGNhc2Vfc2VtX0lOU05fQ01QSTMgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQ01QTywgJiYgY2FzZV9zZW1fSU5TTl9DTVBPIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0NNUE8xLCAmJiBjYXNlX3NlbV9JTlNOX0NNUE8xIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0NNUE8yLCAmJiBjYXNlX3NlbV9JTlNOX0NNUE8yIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0NNUE8zLCAmJiBjYXNlX3NlbV9JTlNOX0NNUE8zIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1RFU1ROT19SRUcsICYmIGNhc2Vfc2VtX0lOU05fVEVTVE5PX1JFRyB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9URVNUR19SRUcsICYmIGNhc2Vfc2VtX0lOU05fVEVTVEdfUkVHIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1RFU1RFX1JFRywgJiYgY2FzZV9zZW1fSU5TTl9URVNURV9SRUcgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fVEVTVEdFX1JFRywgJiYgY2FzZV9zZW1fSU5TTl9URVNUR0VfUkVHIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1RFU1RMX1JFRywgJiYgY2FzZV9zZW1fSU5TTl9URVNUTF9SRUcgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fVEVTVE5FX1JFRywgJiYgY2FzZV9zZW1fSU5TTl9URVNUTkVfUkVHIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX1RFU1RMRV9SRUcsICYmIGNhc2Vfc2VtX0lOU05fVEVTVExFX1JFRyB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9URVNUT19SRUcsICYmIGNhc2Vfc2VtX0lOU05fVEVTVE9fUkVHIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0JOTywgJiYgY2FzZV9zZW1fSU5TTl9CTk8gfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQkcsICYmIGNhc2Vfc2VtX0lOU05fQkcgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQkUsICYmIGNhc2Vfc2VtX0lOU05fQkUgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQkdFLCAmJiBjYXNlX3NlbV9JTlNOX0JHRSB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9CTCwgJiYgY2FzZV9zZW1fSU5TTl9CTCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9CTkUsICYmIGNhc2Vfc2VtX0lOU05fQk5FIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0JMRSwgJiYgY2FzZV9zZW1fSU5TTl9CTEUgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQk8sICYmIGNhc2Vfc2VtX0lOU05fQk8gfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQiwgJiYgY2FzZV9zZW1fSU5TTl9CIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0JYX0lORElSRUNUX09GRlNFVCwgJiYgY2FzZV9zZW1fSU5TTl9CWF9JTkRJUkVDVF9PRkZTRVQgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQlhfSU5ESVJFQ1QsICYmIGNhc2Vfc2VtX0lOU05fQlhfSU5ESVJFQ1QgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQlhfSU5ESVJFQ1RfSU5ERVgsICYmIGNhc2Vfc2VtX0lOU05fQlhfSU5ESVJFQ1RfSU5ERVggfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQlhfRElTUCwgJiYgY2FzZV9zZW1fSU5TTl9CWF9ESVNQIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0JYX0lORElSRUNUX0RJU1AsICYmIGNhc2Vfc2VtX0lOU05fQlhfSU5ESVJFQ1RfRElTUCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9DQUxMWF9ESVNQLCAmJiBjYXNlX3NlbV9JTlNOX0NBTExYX0RJU1AgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQ0FMTFhfSU5ESVJFQ1QsICYmIGNhc2Vfc2VtX0lOU05fQ0FMTFhfSU5ESVJFQ1QgfSwKKyAgICB7IEk5NjBCQVNFX0lOU05fQ0FMTFhfSU5ESVJFQ1RfT0ZGU0VULCAmJiBjYXNlX3NlbV9JTlNOX0NBTExYX0lORElSRUNUX09GRlNFVCB9LAorICAgIHsgSTk2MEJBU0VfSU5TTl9SRVQsICYmIGNhc2Vfc2VtX0lOU05fUkVUIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0NBTExTLCAmJiBjYXNlX3NlbV9JTlNOX0NBTExTIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0ZNQVJLLCAmJiBjYXNlX3NlbV9JTlNOX0ZNQVJLIH0sCisgICAgeyBJOTYwQkFTRV9JTlNOX0ZMVVNIUkVHLCAmJiBjYXNlX3NlbV9JTlNOX0ZMVVNIUkVHIH0sCisgICAgeyAwLCAwIH0KKyAgfTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgbGFiZWxzW2ldLmxhYmVsICE9IDA7ICsraSkKKyNpZiBGQVNUX1AKKyAgICBDUFVfSURFU0MgKGN1cnJlbnRfY3B1KSBbbGFiZWxzW2ldLmluZGV4XS5zZW1fZmFzdF9sYWIgPSBsYWJlbHNbaV0ubGFiZWw7CisjZWxzZQorICAgIENQVV9JREVTQyAoY3VycmVudF9jcHUpIFtsYWJlbHNbaV0uaW5kZXhdLnNlbV9mdWxsX2xhYiA9IGxhYmVsc1tpXS5sYWJlbDsKKyNlbmRpZgorCisjdW5kZWYgREVGSU5FX0xBQkVMUworI2VuZGlmIC8qIERFRklORV9MQUJFTFMgKi8KKworI2lmZGVmIERFRklORV9TV0lUQ0gKKworLyogSWYgaHlwZXItZmFzdCBbd2VsbCBub3QgdW5uZWNlc3NhcmlseSBzbG93XSBleGVjdXRpb24gaXMgc2VsZWN0ZWQsIHR1cm4KKyAgIG9mZiBmcmlsbHMgbGlrZSB0cmFjaW5nIGFuZCBwcm9maWxpbmcuICAqLworLyogRklYTUU6IEEgYmV0dGVyIHdheSB3b3VsZCBiZSB0byBoYXZlIFRSQUNFX1JFU1VMVCBjaGVjayBmb3Igc29tZXRoaW5nCisgICB0aGF0IGNhbiBjYXVzZSBpdCB0byBiZSBvcHRpbWl6ZWQgb3V0LiAgQW5vdGhlciB3YXkgd291bGQgYmUgdG8gZW1pdAorICAgc3BlY2lhbCBoYW5kbGVycyBpbnRvIHRoZSBpbnN0cnVjdGlvbiAic3RyZWFtIi4gICovCisKKyNpZiBGQVNUX1AKKyN1bmRlZiBUUkFDRV9SRVNVTFQKKyNkZWZpbmUgVFJBQ0VfUkVTVUxUKGNwdSwgYWJ1ZiwgbmFtZSwgdHlwZSwgdmFsKQorI2VuZGlmCisKKyN1bmRlZiBHRVRfQVRUUgorI2RlZmluZSBHRVRfQVRUUihjcHUsIG51bSwgYXR0cikgQ0dFTl9BVFRSX1ZBTFVFIChOVUxMLCBhYnVmLT5pZGVzYy0+YXR0cnMsIENHRU5fSU5TTl8jI2F0dHIpCisKK3sKKworI2lmIFdJVEhfU0NBQ0hFX1BCQgorCisvKiBCcmFuY2ggdG8gbmV4dCBoYW5kbGVyIHdpdGhvdXQgZ29pbmcgYXJvdW5kIG1haW4gbG9vcC4gICovCisjZGVmaW5lIE5FWFQodnBjKSBnb3RvICogU0VNX0FSR0JVRiAodnBjKSAtPiBzZW1hbnRpYy5zZW1fY2FzZQorU1dJVENIIChzZW0sIFNFTV9BUkdCVUYgKHZwYykgLT4gc2VtYW50aWMuc2VtX2Nhc2UpCisKKyNlbHNlIC8qICEgV0lUSF9TQ0FDSEVfUEJCICovCisKKyNkZWZpbmUgTkVYVCh2cGMpIEJSRUFLIChzZW0pCisjaWZkZWYgX19HTlVDX18KKyNpZiBGQVNUX1AKKyAgU1dJVENIIChzZW0sIFNFTV9BUkdCVUYgKHNjKSAtPiBpZGVzYy0+c2VtX2Zhc3RfbGFiKQorI2Vsc2UKKyAgU1dJVENIIChzZW0sIFNFTV9BUkdCVUYgKHNjKSAtPiBpZGVzYy0+c2VtX2Z1bGxfbGFiKQorI2VuZGlmCisjZWxzZQorICBTV0lUQ0ggKHNlbSwgU0VNX0FSR0JVRiAoc2MpIC0+IGlkZXNjLT5udW0pCisjZW5kaWYKKworI2VuZGlmIC8qICEgV0lUSF9TQ0FDSEVfUEJCICovCisKKyAgICB7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1hfSU5WQUxJRCkgOiAvKiAtLWludmFsaWQtLSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOworCisgIHsKKyNpZiBXSVRIX1NDQUNIRQorICAgIC8qIFVwZGF0ZSB0aGUgcmVjb3JkZWQgcGMgaW4gdGhlIGNwdSBzdGF0ZSBzdHJ1Y3QuICAqLworICAgIFNFVF9IX1BDIChwYyk7CisjZW5kaWYKKyAgICBzaW1fZW5naW5lX2ludmFsaWRfaW5zbiAoY3VycmVudF9jcHUsIHBjKTsKKyAgICBzaW1faW9fZXJyb3IgKENQVV9TVEFURSAoY3VycmVudF9jcHUpLCAiaW52YWxpZCBpbnNuIG5vdCBoYW5kbGVkXG4iKTsKKyAgICAvKiBOT1RSRUFDSEVEICovCisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9YX0FGVEVSKSA6IC8qIC0tYWZ0ZXItLSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOworCisgIHsKKyNpZiBXSVRIX1NDQUNIRV9QQkJfSTk2MEJBU0UKKyAgICBpOTYwYmFzZV9wYmJfYWZ0ZXIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnKTsKKyNlbmRpZgorICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fWF9CRUZPUkUpIDogLyogLS1iZWZvcmUtLSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOworCisgIHsKKyNpZiBXSVRIX1NDQUNIRV9QQkJfSTk2MEJBU0UKKyAgICBpOTYwYmFzZV9wYmJfYmVmb3JlIChjdXJyZW50X2NwdSwgc2VtX2FyZyk7CisjZW5kaWYKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1hfQ1RJX0NIQUlOKSA6IC8qIC0tY3RpLWNoYWluLS0gKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKKworICB7CisjaWYgV0lUSF9TQ0FDSEVfUEJCX0k5NjBCQVNFCisjaWZkZWYgREVGSU5FX1NXSVRDSAorICAgIHZwYyA9IGk5NjBiYXNlX3BiYl9jdGlfY2hhaW4gKGN1cnJlbnRfY3B1LCBzZW1fYXJnLAorCQkJICAgICAgIHBiYl9icl9ucGNfcHRyLCBwYmJfYnJfbnBjKTsKKyAgICBCUkVBSyAoc2VtKTsKKyNlbHNlCisgICAgLyogRklYTUU6IEFsbG93IHByb3Zpc2lvbiBvZiBleHBsaWNpdCBpZm10IHNwZWMgaW4gaW5zbiBzcGVjLiAgKi8KKyAgICB2cGMgPSBpOTYwYmFzZV9wYmJfY3RpX2NoYWluIChjdXJyZW50X2NwdSwgc2VtX2FyZywKKwkJCSAgICAgICBDUFVfUEJCX0JSX05QQ19QVFIgKGN1cnJlbnRfY3B1KSwKKwkJCSAgICAgICBDUFVfUEJCX0JSX05QQyAoY3VycmVudF9jcHUpKTsKKyNlbmRpZgorI2VuZGlmCisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9YX0NIQUlOKSA6IC8qIC0tY2hhaW4tLSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOworCisgIHsKKyNpZiBXSVRIX1NDQUNIRV9QQkJfSTk2MEJBU0UKKyAgICB2cGMgPSBpOTYwYmFzZV9wYmJfY2hhaW4gKGN1cnJlbnRfY3B1LCBzZW1fYXJnKTsKKyNpZmRlZiBERUZJTkVfU1dJVENICisgICAgQlJFQUsgKHNlbSk7CisjZW5kaWYKKyNlbmRpZgorICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fWF9CRUdJTikgOiAvKiAtLWJlZ2luLS0gKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKKworICB7CisjaWYgV0lUSF9TQ0FDSEVfUEJCX0k5NjBCQVNFCisjaWZkZWYgREVGSU5FX1NXSVRDSAorICAgIC8qIEluIHRoZSBzd2l0Y2ggY2FzZSBGQVNUX1AgaXMgYSBjb25zdGFudCwgYWxsb3dpbmcgc2V2ZXJhbCBvcHRpbWl6YXRpb25zCisgICAgICAgaW4gYW55IGNhbGxlZCBpbmxpbmUgZnVuY3Rpb25zLiAgKi8KKyAgICB2cGMgPSBpOTYwYmFzZV9wYmJfYmVnaW4gKGN1cnJlbnRfY3B1LCBGQVNUX1ApOworI2Vsc2UKKyAgICB2cGMgPSBpOTYwYmFzZV9wYmJfYmVnaW4gKGN1cnJlbnRfY3B1LCBTVEFURV9SVU5fRkFTVF9QIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSkpOworI2VuZGlmCisjZW5kaWYKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX01VTE8pIDogLyogbXVsbyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE1VTFNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9NVUxPMSkgOiAvKiBtdWxvICRsaXQxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE1VTFNJIChGTEQgKGZfc3JjMSksICogRkxEIChpX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTVVMTzIpIDogLyogbXVsbyAkc3JjMSwgJGxpdDIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzIuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBNVUxTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX01VTE8zKSA6IC8qIG11bG8gJGxpdDEsICRsaXQyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gTVVMU0kgKEZMRCAoZl9zcmMxKSwgRkxEIChmX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fUkVNTykgOiAvKiByZW1vICRzcmMxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gVU1PRFNJICgqIEZMRCAoaV9zcmMyKSwgKiBGTEQgKGlfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9SRU1PMSkgOiAvKiByZW1vICRsaXQxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFVNT0RTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1JFTU8yKSA6IC8qIHJlbW8gJHNyYzEsICRsaXQyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gVU1PRFNJIChGTEQgKGZfc3JjMiksICogRkxEIChpX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fUkVNTzMpIDogLyogcmVtbyAkbGl0MSwgJGxpdDIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBVTU9EU0kgKEZMRCAoZl9zcmMyKSwgRkxEIChmX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fRElWTykgOiAvKiBkaXZvICRzcmMxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gVURJVlNJICgqIEZMRCAoaV9zcmMyKSwgKiBGTEQgKGlfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9ESVZPMSkgOiAvKiBkaXZvICRsaXQxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFVESVZTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0RJVk8yKSA6IC8qIGRpdm8gJHNyYzEsICRsaXQyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gVURJVlNJIChGTEQgKGZfc3JjMiksICogRkxEIChpX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fRElWTzMpIDogLyogZGl2byAkbGl0MSwgJGxpdDIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBVRElWU0kgKEZMRCAoZl9zcmMyKSwgRkxEIChmX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fUkVNSSkgOiAvKiByZW1pICRzcmMxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gTU9EU0kgKCogRkxEIChpX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1JFTUkxKSA6IC8qIHJlbWkgJGxpdDEsICRzcmMyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gTU9EU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9SRU1JMikgOiAvKiByZW1pICRzcmMxLCAkbGl0MiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE1PRFNJIChGTEQgKGZfc3JjMiksICogRkxEIChpX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fUkVNSTMpIDogLyogcmVtaSAkbGl0MSwgJGxpdDIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBNT0RTSSAoRkxEIChmX3NyYzIpLCBGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9ESVZJKSA6IC8qIGRpdmkgJHNyYzEsICRzcmMyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBESVZTSSAoKiBGTEQgKGlfc3JjMiksICogRkxEIChpX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fRElWSTEpIDogLyogZGl2aSAkbGl0MSwgJHNyYzIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzEuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBESVZTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0RJVkkyKSA6IC8qIGRpdmkgJHNyYzEsICRsaXQyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gRElWU0kgKEZMRCAoZl9zcmMyKSwgKiBGTEQgKGlfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9ESVZJMykgOiAvKiBkaXZpICRsaXQxLCAkbGl0MiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IERJVlNJIChGTEQgKGZfc3JjMiksIEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0FERE8pIDogLyogYWRkbyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9BRERPMSkgOiAvKiBhZGRvICRsaXQxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChGTEQgKGZfc3JjMSksICogRkxEIChpX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQURETzIpIDogLyogYWRkbyAkc3JjMSwgJGxpdDIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzIuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0FERE8zKSA6IC8qIGFkZG8gJGxpdDEsICRsaXQyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKEZMRCAoZl9zcmMxKSwgRkxEIChmX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1VCTykgOiAvKiBzdWJvICRzcmMxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gU1VCU0kgKCogRkxEIChpX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NVQk8xKSA6IC8qIHN1Ym8gJGxpdDEsICRzcmMyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gU1VCU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVUJPMikgOiAvKiBzdWJvICRzcmMxLCAkbGl0MiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFNVQlNJIChGTEQgKGZfc3JjMiksICogRkxEIChpX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1VCTzMpIDogLyogc3VibyAkbGl0MSwgJGxpdDIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoRkxEIChmX3NyYzIpLCBGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9OT1RCSVQpIDogLyogbm90Yml0ICRzcmMxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBYT1JTSSAoU0xMU0kgKDEsICogRkxEIChpX3NyYzEpKSwgKiBGTEQgKGlfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9OT1RCSVQxKSA6IC8qIG5vdGJpdCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0MS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFhPUlNJIChTTExTSSAoMSwgRkxEIChmX3NyYzEpKSwgKiBGTEQgKGlfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9OT1RCSVQyKSA6IC8qIG5vdGJpdCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0Mi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFhPUlNJIChTTExTSSAoMSwgKiBGTEQgKGlfc3JjMSkpLCBGTEQgKGZfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9OT1RCSVQzKSA6IC8qIG5vdGJpdCAkbGl0MSwgJGxpdDIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0My5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFhPUlNJIChTTExTSSAoMSwgRkxEIChmX3NyYzEpKSwgRkxEIChmX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQU5EKSA6IC8qIGFuZCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9BTkQxKSA6IC8qIGFuZCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzEuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBTkRTSSAoRkxEIChmX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0FORDIpIDogLyogYW5kICRzcmMxLCAkbGl0MiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9zcmMxKSwgRkxEIChmX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQU5EMykgOiAvKiBhbmQgJGxpdDEsICRsaXQyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQU5EU0kgKEZMRCAoZl9zcmMxKSwgRkxEIChmX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQU5ETk9UKSA6IC8qIGFuZG5vdCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9zcmMyKSwgSU5WU0kgKCogRkxEIChpX3NyYzEpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0FORE5PVDEpIDogLyogYW5kbm90ICRsaXQxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9zcmMyKSwgSU5WU0kgKEZMRCAoZl9zcmMxKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9BTkROT1QyKSA6IC8qIGFuZG5vdCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzIuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBTkRTSSAoRkxEIChmX3NyYzIpLCBJTlZTSSAoKiBGTEQgKGlfc3JjMSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQU5ETk9UMykgOiAvKiBhbmRub3QgJGxpdDEsICRsaXQyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQU5EU0kgKEZMRCAoZl9zcmMyKSwgSU5WU0kgKEZMRCAoZl9zcmMxKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TRVRCSVQpIDogLyogc2V0Yml0ICRzcmMxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBPUlNJIChTTExTSSAoMSwgKiBGTEQgKGlfc3JjMSkpLCAqIEZMRCAoaV9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NFVEJJVDEpIDogLyogc2V0Yml0ICRsaXQxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQxLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gT1JTSSAoU0xMU0kgKDEsIEZMRCAoZl9zcmMxKSksICogRkxEIChpX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU0VUQklUMikgOiAvKiBzZXRiaXQgJHNyYzEsICRsaXQyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDIuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBPUlNJIChTTExTSSAoMSwgKiBGTEQgKGlfc3JjMSkpLCBGTEQgKGZfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TRVRCSVQzKSA6IC8qIHNldGJpdCAkbGl0MSwgJGxpdDIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0My5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE9SU0kgKFNMTFNJICgxLCBGTEQgKGZfc3JjMSkpLCBGTEQgKGZfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9OT1RBTkQpIDogLyogbm90YW5kICRzcmMxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQU5EU0kgKElOVlNJICgqIEZMRCAoaV9zcmMyKSksICogRkxEIChpX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTk9UQU5EMSkgOiAvKiBub3RhbmQgJGxpdDEsICRzcmMyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQU5EU0kgKElOVlNJICgqIEZMRCAoaV9zcmMyKSksIEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX05PVEFORDIpIDogLyogbm90YW5kICRzcmMxLCAkbGl0MiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJIChJTlZTSSAoRkxEIChmX3NyYzIpKSwgKiBGTEQgKGlfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9OT1RBTkQzKSA6IC8qIG5vdGFuZCAkbGl0MSwgJGxpdDIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKEZMRCAoZl9zcmMyKSksIEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1hPUikgOiAvKiB4b3IgJHNyYzEsICRzcmMyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBYT1JTSSAoKiBGTEQgKGlfc3JjMSksICogRkxEIChpX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fWE9SMSkgOiAvKiB4b3IgJGxpdDEsICRzcmMyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gWE9SU0kgKEZMRCAoZl9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9YT1IyKSA6IC8qIHhvciAkc3JjMSwgJGxpdDIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzIuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBYT1JTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1hPUjMpIDogLyogeG9yICRsaXQxLCAkbGl0MiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFhPUlNJIChGTEQgKGZfc3JjMSksIEZMRCAoZl9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX09SKSA6IC8qIG9yICRzcmMxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gT1JTSSAoKiBGTEQgKGlfc3JjMSksICogRkxEIChpX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fT1IxKSA6IC8qIG9yICRsaXQxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE9SU0kgKEZMRCAoZl9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9PUjIpIDogLyogb3IgJHNyYzEsICRsaXQyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gT1JTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX09SMykgOiAvKiBvciAkbGl0MSwgJGxpdDIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBPUlNJIChGTEQgKGZfc3JjMSksIEZMRCAoZl9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX05PUikgOiAvKiBub3IgJHNyYzEsICRzcmMyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKCogRkxEIChpX3NyYzIpKSwgSU5WU0kgKCogRkxEIChpX3NyYzEpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX05PUjEpIDogLyogbm9yICRsaXQxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJIChJTlZTSSAoKiBGTEQgKGlfc3JjMikpLCBJTlZTSSAoRkxEIChmX3NyYzEpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX05PUjIpIDogLyogbm9yICRzcmMxLCAkbGl0MiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJIChJTlZTSSAoRkxEIChmX3NyYzIpKSwgSU5WU0kgKCogRkxEIChpX3NyYzEpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX05PUjMpIDogLyogbm9yICRsaXQxLCAkbGl0MiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJIChJTlZTSSAoRkxEIChmX3NyYzIpKSwgSU5WU0kgKEZMRCAoZl9zcmMxKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9OT1QpIDogLyogbm90ICRzcmMxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBJTlZTSSAoKiBGTEQgKGlfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9OT1QxKSA6IC8qIG5vdCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90MS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IElOVlNJIChGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9OT1QyKSA6IC8qIG5vdCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Mi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IElOVlNJICgqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX05PVDMpIDogLyogbm90ICRsaXQxLCAkbGl0MiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3QzLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gSU5WU0kgKEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NMUkJJVCkgOiAvKiBjbHJiaXQgJHNyYzEsICRzcmMyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJIChJTlZTSSAoU0xMU0kgKDEsICogRkxEIChpX3NyYzEpKSksICogRkxEIChpX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ0xSQklUMSkgOiAvKiBjbHJiaXQgJGxpdDEsICRzcmMyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDEuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKFNMTFNJICgxLCBGTEQgKGZfc3JjMSkpKSwgKiBGTEQgKGlfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9DTFJCSVQyKSA6IC8qIGNscmJpdCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0Mi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJIChJTlZTSSAoU0xMU0kgKDEsICogRkxEIChpX3NyYzEpKSksIEZMRCAoZl9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NMUkJJVDMpIDogLyogY2xyYml0ICRsaXQxLCAkbGl0MiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQzLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQU5EU0kgKElOVlNJIChTTExTSSAoMSwgRkxEIChmX3NyYzEpKSksIEZMRCAoZl9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NITE8pIDogLyogc2hsbyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gU0xMU0kgKCogRkxEIChpX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NITE8xKSA6IC8qIHNobG8gJGxpdDEsICRzcmMyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDEuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTTExTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NITE8yKSA6IC8qIHNobG8gJHNyYzEsICRsaXQyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDIuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTTExTSSAoRkxEIChmX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NITE8zKSA6IC8qIHNobG8gJGxpdDEsICRsaXQyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDMuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTTExTSSAoRkxEIChmX3NyYzIpLCBGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TSFJPKSA6IC8qIHNocm8gJHNyYzEsICRzcmMyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFNSTFNJICgqIEZMRCAoaV9zcmMyKSwgKiBGTEQgKGlfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TSFJPMSkgOiAvKiBzaHJvICRsaXQxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQxLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gU1JMU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TSFJPMikgOiAvKiBzaHJvICRzcmMxLCAkbGl0MiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQyLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gU1JMU0kgKEZMRCAoZl9zcmMyKSwgKiBGTEQgKGlfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TSFJPMykgOiAvKiBzaHJvICRsaXQxLCAkbGl0MiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQzLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gU1JMU0kgKEZMRCAoZl9zcmMyKSwgRkxEIChmX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU0hMSSkgOiAvKiBzaGxpICRzcmMxLCAkc3JjMiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTTExTSSAoKiBGTEQgKGlfc3JjMiksICogRkxEIChpX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU0hMSTEpIDogLyogc2hsaSAkbGl0MSwgJHNyYzIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0MS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFNMTFNJICgqIEZMRCAoaV9zcmMyKSwgRkxEIChmX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU0hMSTIpIDogLyogc2hsaSAkc3JjMSwgJGxpdDIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0Mi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFNMTFNJIChGTEQgKGZfc3JjMiksICogRkxEIChpX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU0hMSTMpIDogLyogc2hsaSAkbGl0MSwgJGxpdDIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0My5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFNMTFNJIChGTEQgKGZfc3JjMiksIEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NIUkkpIDogLyogc2hyaSAkc3JjMSwgJHNyYzIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gU1JBU0kgKCogRkxEIChpX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NIUkkxKSA6IC8qIHNocmkgJGxpdDEsICRzcmMyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDEuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTUkFTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NIUkkyKSA6IC8qIHNocmkgJHNyYzEsICRsaXQyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDIuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTUkFTSSAoRkxEIChmX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NIUkkzKSA6IC8qIHNocmkgJGxpdDEsICRsaXQyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDMuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTUkFTSSAoRkxEIChmX3NyYzIpLCBGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9FTVVMKSA6IC8qIGVtdWwgJHNyYzEsICRzcmMyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtdWwuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBESSB0bXBfdGVtcDsKKyAgdG1wX3RlbXAgPSBNVUxESSAoWkVYVFNJREkgKCogRkxEIChpX3NyYzEpKSwgWkVYVFNJREkgKCogRkxEIChpX3NyYzIpKSk7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gVFJVTkNESVNJICh0bXBfdGVtcCk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKFNSTERJICh0bXBfdGVtcCwgMzIpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fRU1VTDEpIDogLyogZW11bCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW11bDEuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBESSB0bXBfdGVtcDsKKyAgdG1wX3RlbXAgPSBNVUxESSAoWkVYVFNJREkgKEZMRCAoZl9zcmMxKSksIFpFWFRTSURJICgqIEZMRCAoaV9zcmMyKSkpOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAodG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChTUkxESSAodG1wX3RlbXAsIDMyKSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0VNVUwyKSA6IC8qIGVtdWwgJHNyYzEsICRsaXQyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtdWwyLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgREkgdG1wX3RlbXA7CisgIHRtcF90ZW1wID0gTVVMREkgKFpFWFRTSURJICgqIEZMRCAoaV9zcmMxKSksIFpFWFRTSURJIChGTEQgKGZfc3JjMikpKTsKKyAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKHRtcF90ZW1wKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAoU1JMREkgKHRtcF90ZW1wLCAzMikpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9FTVVMMykgOiAvKiBlbXVsICRsaXQxLCAkbGl0MiwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXVsMy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9kcmVnbm87CisgIERJIHRtcF90ZW1wOworICB0bXBfdGVtcCA9IE1VTERJIChaRVhUU0lESSAoRkxEIChmX3NyYzEpKSwgWkVYVFNJREkgKEZMRCAoZl9zcmMyKSkpOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAodG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChTUkxESSAodG1wX3RlbXAsIDMyKSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX01PVikgOiAvKiBtb3YgJHNyYzEsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Mi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3NyYzEpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9NT1YxKSA6IC8qIG1vdiAkbGl0MSwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3QzLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gRkxEIChmX3NyYzEpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9NT1ZMKSA6IC8qIG1vdmwgJHNyYzEsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW92bC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIFNJIHRtcF9kcmVnbm87CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmMxKTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjMSkpICsgKDEpKV0pOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9NT1ZMMSkgOiAvKiBtb3ZsICRsaXQxLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdmwxLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSBGTEQgKGZfc3JjMSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSAwOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9NT1ZUKSA6IC8qIG1vdnQgJHNyYzEsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW92dC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIFNJIHRtcF9kcmVnbm87CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmMxKTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjMSkpICsgKDEpKV0pOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmMxKSkgKyAoMikpXSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX01PVlQxKSA6IC8qIG1vdnQgJGxpdDEsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW92dDEuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEZMRCAoZl9zcmMxKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IDA7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gMDsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTIiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTU9WUSkgOiAvKiBtb3ZxICRzcmMxLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdnEuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfc3JlZ25vOworICBTSSB0bXBfZHJlZ25vOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjMSk7CisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3NyYzEpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyYzEpKSArICgxKSldKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjMSkpICsgKDIpKV0pOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMiIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmMxKSkgKyAoMykpXSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0zIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX01PVlExKSA6IC8qIG1vdnEgJGxpdDEsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW92cTEuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEZMRCAoZl9zcmMxKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IDA7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gMDsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTIiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSAwOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9NT0RQQykgOiAvKiBtb2RwYyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW9kcGMuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcmMyKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTU9EQUMpIDogLyogbW9kYWMgJHNyYzEsICRzcmMyLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vZHBjLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMik7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xEQV9PRkZTRVQpIDogLyogbGRhICRvZmZzZXQsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRhX29mZnNldC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEZMRCAoZl9vZmZzZXQpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MREFfSU5ESVJFQ1RfT0ZGU0VUKSA6IC8qIGxkYSAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRhX2luZGlyZWN0X29mZnNldC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERBX0lORElSRUNUKSA6IC8qIGxkYSAoJGFiYXNlKSwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGFfaW5kaXJlY3QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9hYmFzZSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xEQV9JTkRJUkVDVF9JTkRFWCkgOiAvKiBsZGEgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYV9pbmRpcmVjdF9pbmRleC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MREFfRElTUCkgOiAvKiBsZGEgJG9wdGRpc3AsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRhX2Rpc3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBGTEQgKGZfb3B0ZGlzcCk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xEQV9JTkRJUkVDVF9ESVNQKSA6IC8qIGxkYSAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYV9pbmRpcmVjdF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERBX0lOREVYX0RJU1ApIDogLyogbGRhICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGFfaW5kZXhfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MREFfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOiAvKiBsZGEgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRhX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xEX09GRlNFVCkgOiAvKiBsZCAkb2Zmc2V0LCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkX29mZnNldC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vZmZzZXQpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERfSU5ESVJFQ1RfT0ZGU0VUKSA6IC8qIGxkICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZF9pbmRpcmVjdF9vZmZzZXQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRF9JTkRJUkVDVCkgOiAvKiBsZCAoJGFiYXNlKSwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZF9pbmRpcmVjdC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xEX0lORElSRUNUX0lOREVYKSA6IC8qIGxkICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZF9pbmRpcmVjdF9pbmRleC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERfRElTUCkgOiAvKiBsZCAkb3B0ZGlzcCwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29wdGRpc3ApKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERfSU5ESVJFQ1RfRElTUCkgOiAvKiBsZCAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkX2luZGlyZWN0X2Rpc3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERfSU5ERVhfRElTUCkgOiAvKiBsZCAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfaW5kZXhfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOiAvKiBsZCAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZF9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERPQl9PRkZTRVQpIDogLyogbGRvYiAkb2Zmc2V0LCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2Jfb2Zmc2V0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vZmZzZXQpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERPQl9JTkRJUkVDVF9PRkZTRVQpIDogLyogbGRvYiAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRvYl9pbmRpcmVjdF9vZmZzZXQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1VUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERPQl9JTkRJUkVDVCkgOiAvKiBsZG9iICgkYWJhc2UpLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2JfaW5kaXJlY3QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1VUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfYWJhc2UpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERPQl9JTkRJUkVDVF9JTkRFWCkgOiAvKiBsZG9iICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9iX2luZGlyZWN0X2luZGV4LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERPQl9ESVNQKSA6IC8qIGxkb2IgJG9wdGRpc3AsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRvYl9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xET0JfSU5ESVJFQ1RfRElTUCkgOiAvKiBsZG9iICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRvYl9pbmRpcmVjdF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRE9CX0lOREVYX0RJU1ApIDogLyogbGRvYiAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRvYl9pbmRleF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERPQl9JTkRJUkVDVF9JTkRFWF9ESVNQKSA6IC8qIGxkb2IgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRvYl9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xET1NfT0ZGU0VUKSA6IC8qIGxkb3MgJG9mZnNldCwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9zX29mZnNldC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb2Zmc2V0KSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xET1NfSU5ESVJFQ1RfT0ZGU0VUKSA6IC8qIGxkb3MgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3NfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xET1NfSU5ESVJFQ1QpIDogLyogbGRvcyAoJGFiYXNlKSwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9zX2luZGlyZWN0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xET1NfSU5ESVJFQ1RfSU5ERVgpIDogLyogbGRvcyAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRvc19pbmRpcmVjdF9pbmRleC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xET1NfRElTUCkgOiAvKiBsZG9zICRvcHRkaXNwLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3NfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb3B0ZGlzcCkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRE9TX0lORElSRUNUX0RJU1ApIDogLyogbGRvcyAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3NfaW5kaXJlY3RfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERPU19JTkRFWF9ESVNQKSA6IC8qIGxkb3MgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3NfaW5kZXhfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xET1NfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOiAvKiBsZG9zICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3NfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRElCX09GRlNFVCkgOiAvKiBsZGliICRvZmZzZXQsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpYl9vZmZzZXQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb2Zmc2V0KSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xESUJfSU5ESVJFQ1RfT0ZGU0VUKSA6IC8qIGxkaWIgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaWJfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERJQl9JTkRJUkVDVCkgOiAvKiBsZGliICgkYWJhc2UpLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaWJfaW5kaXJlY3QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9hYmFzZSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRElCX0lORElSRUNUX0lOREVYKSA6IC8qIGxkaWIgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaWJfaW5kaXJlY3RfaW5kZXguZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xESUJfRElTUCkgOiAvKiBsZGliICRvcHRkaXNwLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaWJfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xESUJfSU5ESVJFQ1RfRElTUCkgOiAvKiBsZGliICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpYl9pbmRpcmVjdF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xESUJfSU5ERVhfRElTUCkgOiAvKiBsZGliICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGliX2luZGV4X2Rpc3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xESUJfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOiAvKiBsZGliICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaWJfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xESVNfT0ZGU0VUKSA6IC8qIGxkaXMgJG9mZnNldCwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGlzX29mZnNldC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vZmZzZXQpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERJU19JTkRJUkVDVF9PRkZTRVQpIDogLyogbGRpcyAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpc19pbmRpcmVjdF9vZmZzZXQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRElTX0lORElSRUNUKSA6IC8qIGxkaXMgKCRhYmFzZSksICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpc19pbmRpcmVjdC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xESVNfSU5ESVJFQ1RfSU5ERVgpIDogLyogbGRpcyAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpc19pbmRpcmVjdF9pbmRleC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERJU19ESVNQKSA6IC8qIGxkaXMgJG9wdGRpc3AsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpc19kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29wdGRpc3ApKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERJU19JTkRJUkVDVF9ESVNQKSA6IC8qIGxkaXMgJG9wdGRpc3AoJGFiYXNlKSwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGlzX2luZGlyZWN0X2Rpc3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERJU19JTkRFWF9ESVNQKSA6IC8qIGxkaXMgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaXNfaW5kZXhfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERJU19JTkRJUkVDVF9JTkRFWF9ESVNQKSA6IC8qIGxkaXMgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpc19pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERMX09GRlNFVCkgOiAvKiBsZGwgJG9mZnNldCwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGxfb2Zmc2V0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBGTEQgKGZfb2Zmc2V0KTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xETF9JTkRJUkVDVF9PRkZTRVQpIDogLyogbGRsICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGxfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRExfSU5ESVJFQ1QpIDogLyogbGRsICgkYWJhc2UpLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkbF9pbmRpcmVjdC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9kcmVnbm87CisgIFNJIHRtcF90ZW1wOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHRtcF90ZW1wID0gKiBGTEQgKGlfYWJhc2UpOworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERMX0lORElSRUNUX0lOREVYKSA6IC8qIGxkbCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRsX2luZGlyZWN0X2luZGV4LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xETF9ESVNQKSA6IC8qIGxkbCAkb3B0ZGlzcCwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGxfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCitkbyB7CisgIFNJIHRtcF9kcmVnbm87CisgIFNJIHRtcF90ZW1wOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHRtcF90ZW1wID0gRkxEIChmX29wdGRpc3ApOworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERMX0lORElSRUNUX0RJU1ApIDogLyogbGRsICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRsX2luZGlyZWN0X2Rpc3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBTSSB0bXBfdGVtcDsKKyAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB0bXBfdGVtcCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRExfSU5ERVhfRElTUCkgOiAvKiBsZGwgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkbF9pbmRleF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xETF9JTkRJUkVDVF9JTkRFWF9ESVNQKSA6IC8qIGxkbCAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGxfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCitkbyB7CisgIFNJIHRtcF9kcmVnbm87CisgIFNJIHRtcF90ZW1wOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHRtcF90ZW1wID0gQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpOworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERUX09GRlNFVCkgOiAvKiBsZHQgJG9mZnNldCwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHRfb2Zmc2V0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBGTEQgKGZfb2Zmc2V0KTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xEVF9JTkRJUkVDVF9PRkZTRVQpIDogLyogbGR0ICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHRfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgOCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMiIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRFRfSU5ESVJFQ1QpIDogLyogbGR0ICgkYWJhc2UpLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdF9pbmRpcmVjdC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9kcmVnbm87CisgIFNJIHRtcF90ZW1wOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHRtcF90ZW1wID0gKiBGTEQgKGlfYWJhc2UpOworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTIiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERUX0lORElSRUNUX0lOREVYKSA6IC8qIGxkdCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGR0X2luZGlyZWN0X2luZGV4LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xEVF9ESVNQKSA6IC8qIGxkdCAkb3B0ZGlzcCwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHRfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCitkbyB7CisgIFNJIHRtcF9kcmVnbm87CisgIFNJIHRtcF90ZW1wOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHRtcF90ZW1wID0gRkxEIChmX29wdGRpc3ApOworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTIiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERUX0lORElSRUNUX0RJU1ApIDogLyogbGR0ICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGR0X2luZGlyZWN0X2Rpc3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBTSSB0bXBfdGVtcDsKKyAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB0bXBfdGVtcCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgOCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMiIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRFRfSU5ERVhfRElTUCkgOiAvKiBsZHQgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdF9pbmRleF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xEVF9JTkRJUkVDVF9JTkRFWF9ESVNQKSA6IC8qIGxkdCAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHRfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCitkbyB7CisgIFNJIHRtcF9kcmVnbm87CisgIFNJIHRtcF90ZW1wOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHRtcF90ZW1wID0gQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpOworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTIiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERRX09GRlNFVCkgOiAvKiBsZHEgJG9mZnNldCwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHFfb2Zmc2V0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBGTEQgKGZfb2Zmc2V0KTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCAxMikpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRFFfSU5ESVJFQ1RfT0ZGU0VUKSA6IC8qIGxkcSAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRxX2luZGlyZWN0X29mZnNldC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9kcmVnbm87CisgIFNJIHRtcF90ZW1wOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHRtcF90ZW1wID0gQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpOworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTIiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDEyKSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0zIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xEUV9JTkRJUkVDVCkgOiAvKiBsZHEgKCRhYmFzZSksICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRxX2luZGlyZWN0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSAqIEZMRCAoaV9hYmFzZSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgOCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMiIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgMTIpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTMiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERRX0lORElSRUNUX0lOREVYKSA6IC8qIGxkcSAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRxX2luZGlyZWN0X2luZGV4LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCAxMikpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRFFfRElTUCkgOiAvKiBsZHEgJG9wdGRpc3AsICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRxX2Rpc3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBTSSB0bXBfdGVtcDsKKyAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB0bXBfdGVtcCA9IEZMRCAoZl9vcHRkaXNwKTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCAxMikpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRFFfSU5ESVJFQ1RfRElTUCkgOiAvKiBsZHEgJG9wdGRpc3AoJGFiYXNlKSwgJGRzdCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHFfaW5kaXJlY3RfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCitkbyB7CisgIFNJIHRtcF9kcmVnbm87CisgIFNJIHRtcF90ZW1wOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHRtcF90ZW1wID0gQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCAxMikpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRFFfSU5ERVhfRElTUCkgOiAvKiBsZHEgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcV9pbmRleF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCAxMikpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRFFfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOiAvKiBsZHEgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRxX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBTSSB0bXBfdGVtcDsKKyAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB0bXBfdGVtcCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCAxMikpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVF9PRkZTRVQpIDogLyogc3QgJHN0X3NyYywgJG9mZnNldCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9vZmZzZXQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vZmZzZXQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RfSU5ESVJFQ1RfT0ZGU0VUKSA6IC8qIHN0ICRzdF9zcmMsICRvZmZzZXQoJGFiYXNlKSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9pbmRpcmVjdF9vZmZzZXQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUX0lORElSRUNUKSA6IC8qIHN0ICRzdF9zcmMsICgkYWJhc2UpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0X2luZGlyZWN0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9hYmFzZSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVF9JTkRJUkVDVF9JTkRFWCkgOiAvKiBzdCAkc3Rfc3JjLCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfaW5kaXJlY3RfaW5kZXguZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RfRElTUCkgOiAvKiBzdCAkc3Rfc3JjLCAkb3B0ZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb3B0ZGlzcCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVF9JTkRJUkVDVF9ESVNQKSA6IC8qIHN0ICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfaW5kaXJlY3RfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUX0lOREVYX0RJU1ApIDogLyogc3QgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfaW5kZXhfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVF9JTkRJUkVDVF9JTkRFWF9ESVNQKSA6IC8qIHN0ICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0X2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUT0JfT0ZGU0VUKSA6IC8qIHN0b2IgJHN0X3NyYywgJG9mZnNldCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9iX29mZnNldC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBRSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29mZnNldCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVE9CX0lORElSRUNUX09GRlNFVCkgOiAvKiBzdG9iICRzdF9zcmMsICRvZmZzZXQoJGFiYXNlKSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9iX2luZGlyZWN0X29mZnNldC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBRSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RPQl9JTkRJUkVDVCkgOiAvKiBzdG9iICRzdF9zcmMsICgkYWJhc2UpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0b2JfaW5kaXJlY3QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUT0JfSU5ESVJFQ1RfSU5ERVgpIDogLyogc3RvYiAkc3Rfc3JjLCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9pbmRpcmVjdF9pbmRleC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBRSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVE9CX0RJU1ApIDogLyogc3RvYiAkc3Rfc3JjLCAkb3B0ZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9iX2Rpc3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworICB7CisgICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUT0JfSU5ESVJFQ1RfRElTUCkgOiAvKiBzdG9iICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9pbmRpcmVjdF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFFJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RPQl9JTkRFWF9ESVNQKSA6IC8qIHN0b2IgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9pbmRleF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFFJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUT0JfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOiAvKiBzdG9iICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0b2JfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBRSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RPU19PRkZTRVQpIDogLyogc3RvcyAkc3Rfc3JjLCAkb2Zmc2V0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0b3Nfb2Zmc2V0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb2Zmc2V0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUT1NfSU5ESVJFQ1RfT0ZGU0VUKSA6IC8qIHN0b3MgJHN0X3NyYywgJG9mZnNldCgkYWJhc2UpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0b3NfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVE9TX0lORElSRUNUKSA6IC8qIHN0b3MgJHN0X3NyYywgKCRhYmFzZSkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3Rvc19pbmRpcmVjdC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBISSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfYWJhc2UpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RPU19JTkRJUkVDVF9JTkRFWCkgOiAvKiBzdG9zICRzdF9zcmMsICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2luZGlyZWN0X2luZGV4LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUT1NfRElTUCkgOiAvKiBzdG9zICRzdF9zcmMsICRvcHRkaXNwICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0b3NfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBISSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29wdGRpc3ApLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RPU19JTkRJUkVDVF9ESVNQKSA6IC8qIHN0b3MgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2luZGlyZWN0X2Rpc3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworICB7CisgICAgSEkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVE9TX0lOREVYX0RJU1ApIDogLyogc3RvcyAkc3Rfc3JjLCAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2luZGV4X2Rpc3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworICB7CisgICAgSEkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RPU19JTkRJUkVDVF9JTkRFWF9ESVNQKSA6IC8qIHN0b3MgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3Rvc19pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVExfT0ZGU0VUKSA6IC8qIHN0bCAkc3Rfc3JjLCAkb2Zmc2V0ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0bF9vZmZzZXQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfc3JlZ25vOworICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29mZnNldCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUTF9JTkRJUkVDVF9PRkZTRVQpIDogLyogc3RsICRzdF9zcmMsICRvZmZzZXQoJGFiYXNlKSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGxfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUTF9JTkRJUkVDVCkgOiAvKiBzdGwgJHN0X3NyYywgKCRhYmFzZSkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RsX2luZGlyZWN0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUTF9JTkRJUkVDVF9JTkRFWCkgOiAvKiBzdGwgJHN0X3NyYywgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0bF9pbmRpcmVjdF9pbmRleC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCA0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RMX0RJU1ApIDogLyogc3RsICRzdF9zcmMsICRvcHRkaXNwICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0bF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUTF9JTkRJUkVDVF9ESVNQKSA6IC8qIHN0bCAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0bF9pbmRpcmVjdF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpLCA0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RMX0lOREVYX0RJU1ApIDogLyogc3RsICRzdF9zcmMsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0bF9pbmRleF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVExfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOiAvKiBzdGwgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RsX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfc3JlZ25vOworICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCA0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RUX09GRlNFVCkgOiAvKiBzdHQgJHN0X3NyYywgJG9mZnNldCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHRfb2Zmc2V0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vZmZzZXQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksIDgpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVFRfSU5ESVJFQ1RfT0ZGU0VUKSA6IC8qIHN0dCAkc3Rfc3JjLCAkb2Zmc2V0KCRhYmFzZSkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3R0X2luZGlyZWN0X29mZnNldC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpLCA4KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RUX0lORElSRUNUKSA6IC8qIHN0dCAkc3Rfc3JjLCAoJGFiYXNlKSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHRfaW5kaXJlY3QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfc3JlZ25vOworICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfYWJhc2UpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCA0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgOCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUVF9JTkRJUkVDVF9JTkRFWCkgOiAvKiBzdHQgJHN0X3NyYywgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0dF9pbmRpcmVjdF9pbmRleC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCA0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCA4KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RUX0RJU1ApIDogLyogc3R0ICRzdF9zcmMsICRvcHRkaXNwICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0dF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIDgpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVFRfSU5ESVJFQ1RfRElTUCkgOiAvKiBzdHQgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHRfaW5kaXJlY3RfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpLCA4KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RUX0lOREVYX0RJU1ApIDogLyogc3R0ICRzdF9zcmMsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0dF9pbmRleF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDgpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVFRfSU5ESVJFQ1RfSU5ERVhfRElTUCkgOiAvKiBzdHQgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3R0X2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfc3JlZ25vOworICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCA0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSwgOCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUUV9PRkZTRVQpIDogLyogc3RxICRzdF9zcmMsICRvZmZzZXQgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RxX29mZnNldC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb2Zmc2V0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCA0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCA4KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAxMiksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUUV9JTkRJUkVDVF9PRkZTRVQpIDogLyogc3RxICRzdF9zcmMsICRvZmZzZXQoJGFiYXNlKSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHFfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIDgpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpLCAxMiksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUUV9JTkRJUkVDVCkgOiAvKiBzdHEgJHN0X3NyYywgKCRhYmFzZSkgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RxX2luZGlyZWN0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIDgpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCAxMiksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUUV9JTkRJUkVDVF9JTkRFWCkgOiAvKiBzdHEgJHN0X3NyYywgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cV9pbmRpcmVjdF9pbmRleC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCA0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCA4KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCAxMiksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUUV9ESVNQKSA6IC8qIHN0cSAkc3Rfc3JjLCAkb3B0ZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHFfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb3B0ZGlzcCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCA4KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgMTIpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVFFfSU5ESVJFQ1RfRElTUCkgOiAvKiBzdHEgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHFfaW5kaXJlY3RfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpLCA4KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSksIDEyKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RRX0lOREVYX0RJU1ApIDogLyogc3RxICRzdF9zcmMsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cV9pbmRleF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDgpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDEyKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RRX0lORElSRUNUX0lOREVYX0RJU1ApIDogLyogc3RxICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSksIDgpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCAxMiksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NNUE9CRV9SRUcpIDogLyogY21wb2JlICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfcmVnLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoRVFTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NNUE9CRV9MSVQpIDogLyogY21wb2JlICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfbGl0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoRVFTSSAoRkxEIChmX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9DTVBPQk5FX1JFRykgOiAvKiBjbXBvYm5lICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfcmVnLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoTkVTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NNUE9CTkVfTElUKSA6IC8qIGNtcG9ibmUgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9saXQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJIChGTEQgKGZfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NNUE9CTF9SRUcpIDogLyogY21wb2JsICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmxfcmVnLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoTFRVU0kgKCogRkxEIChpX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9DTVBPQkxfTElUKSA6IC8qIGNtcG9ibCAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JsX2xpdC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKExUVVNJIChGTEQgKGZfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NNUE9CTEVfUkVHKSA6IC8qIGNtcG9ibGUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9ibF9yZWcuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChMRVVTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NNUE9CTEVfTElUKSA6IC8qIGNtcG9ibGUgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9ibF9saXQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChMRVVTSSAoRkxEIChmX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9DTVBPQkdfUkVHKSA6IC8qIGNtcG9iZyAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JsX3JlZy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKEdUVVNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ01QT0JHX0xJVCkgOiAvKiBjbXBvYmcgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9ibF9saXQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChHVFVTSSAoRkxEIChmX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9DTVBPQkdFX1JFRykgOiAvKiBjbXBvYmdlICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmxfcmVnLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoR0VVU0kgKCogRkxEIChpX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9DTVBPQkdFX0xJVCkgOiAvKiBjbXBvYmdlICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmxfbGl0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoR0VVU0kgKEZMRCAoZl9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ01QSUJFX1JFRykgOiAvKiBjbXBpYmUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9yZWcuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChFUVNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ01QSUJFX0xJVCkgOiAvKiBjbXBpYmUgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9saXQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChFUVNJIChGTEQgKGZfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NNUElCTkVfUkVHKSA6IC8qIGNtcGlibmUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9yZWcuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ01QSUJORV9MSVQpIDogLyogY21waWJuZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX2xpdC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKE5FU0kgKEZMRCAoZl9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ01QSUJMX1JFRykgOiAvKiBjbXBpYmwgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9yZWcuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChMVFNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ01QSUJMX0xJVCkgOiAvKiBjbXBpYmwgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9saXQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChMVFNJIChGTEQgKGZfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NNUElCTEVfUkVHKSA6IC8qIGNtcGlibGUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9yZWcuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChMRVNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ01QSUJMRV9MSVQpIDogLyogY21waWJsZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX2xpdC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKExFU0kgKEZMRCAoZl9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ01QSUJHX1JFRykgOiAvKiBjbXBpYmcgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9yZWcuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChHVFNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ01QSUJHX0xJVCkgOiAvKiBjbXBpYmcgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9saXQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChHVFNJIChGTEQgKGZfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NNUElCR0VfUkVHKSA6IC8qIGNtcGliZ2UgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9yZWcuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChHRVNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ01QSUJHRV9MSVQpIDogLyogY21waWJnZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX2xpdC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKEdFU0kgKEZMRCAoZl9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQkJDX1JFRykgOiAvKiBiYmMgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JiY19yZWcuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChFUVNJIChBTkRTSSAoU0xMU0kgKDEsICogRkxEIChpX2JyX3NyYzEpKSwgKiBGTEQgKGlfYnJfc3JjMikpLCAwKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JCQ19MSVQpIDogLyogYmJjICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iYmNfbGl0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoRVFTSSAoQU5EU0kgKFNMTFNJICgxLCBGTEQgKGZfYnJfc3JjMSkpLCAqIEZMRCAoaV9icl9zcmMyKSksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQkJTX1JFRykgOiAvKiBiYnMgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JiY19yZWcuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJIChBTkRTSSAoU0xMU0kgKDEsICogRkxEIChpX2JyX3NyYzEpKSwgKiBGTEQgKGlfYnJfc3JjMikpLCAwKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JCU19MSVQpIDogLyogYmJzICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iYmNfbGl0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoTkVTSSAoQU5EU0kgKFNMTFNJICgxLCBGTEQgKGZfYnJfc3JjMSkpLCAqIEZMRCAoaV9icl9zcmMyKSksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ01QSSkgOiAvKiBjbXBpICRzcmMxLCAkc3JjMiAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXBpLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gKExUU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSkpID8gKDQpIDogKEVRU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSkpID8gKDIpIDogKDEpOworICAgIENQVSAoaF9jYykgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2MtMCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ01QSTEpIDogLyogY21waSAkbGl0MSwgJHNyYzIgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY21waTEuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAoTFRTSSAoRkxEIChmX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSkpID8gKDQpIDogKEVRU0kgKEZMRCAoZl9zcmMxKSwgKiBGTEQgKGlfc3JjMikpKSA/ICgyKSA6ICgxKTsKKyAgICBDUFUgKGhfY2MpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjLTAiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NNUEkyKSA6IC8qIGNtcGkgJHNyYzEsICRsaXQyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkyLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gKExUU0kgKCogRkxEIChpX3NyYzEpLCBGTEQgKGZfc3JjMikpKSA/ICg0KSA6IChFUVNJICgqIEZMRCAoaV9zcmMxKSwgRkxEIChmX3NyYzIpKSkgPyAoMikgOiAoMSk7CisgICAgQ1BVIChoX2NjKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYy0wIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9DTVBJMykgOiAvKiBjbXBpICRsaXQxLCAkbGl0MiAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXBpMy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IChMVFNJIChGTEQgKGZfc3JjMSksIEZMRCAoZl9zcmMyKSkpID8gKDQpIDogKEVRU0kgKEZMRCAoZl9zcmMxKSwgRkxEIChmX3NyYzIpKSkgPyAoMikgOiAoMSk7CisgICAgQ1BVIChoX2NjKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYy0wIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9DTVBPKSA6IC8qIGNtcG8gJHNyYzEsICRzcmMyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcG8uZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAoTFRVU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSkpID8gKDQpIDogKEVRU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSkpID8gKDIpIDogKDEpOworICAgIENQVSAoaF9jYykgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2MtMCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ01QTzEpIDogLyogY21wbyAkbGl0MSwgJHNyYzIgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY21wbzEuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAoTFRVU0kgKEZMRCAoZl9zcmMxKSwgKiBGTEQgKGlfc3JjMikpKSA/ICg0KSA6IChFUVNJIChGTEQgKGZfc3JjMSksICogRkxEIChpX3NyYzIpKSkgPyAoMikgOiAoMSk7CisgICAgQ1BVIChoX2NjKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYy0wIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9DTVBPMikgOiAvKiBjbXBvICRzcmMxLCAkbGl0MiAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXBvMi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IChMVFVTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSkpID8gKDQpIDogKEVRU0kgKCogRkxEIChpX3NyYzEpLCBGTEQgKGZfc3JjMikpKSA/ICgyKSA6ICgxKTsKKyAgICBDUFUgKGhfY2MpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjLTAiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0NNUE8zKSA6IC8qIGNtcG8gJGxpdDEsICRsaXQyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcG8zLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gKExUVVNJIChGTEQgKGZfc3JjMSksIEZMRCAoZl9zcmMyKSkpID8gKDQpIDogKEVRU0kgKEZMRCAoZl9zcmMxKSwgRkxEIChmX3NyYzIpKSkgPyAoMikgOiAoMSk7CisgICAgQ1BVIChoX2NjKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYy0wIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9URVNUTk9fUkVHKSA6IC8qIHRlc3RubyAkYnJfc3JjMSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF90ZXN0bm9fcmVnLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gRVFTSSAoQ1BVIChoX2NjKSwgMCk7CisgICAgKiBGTEQgKGlfYnJfc3JjMSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnJfc3JjMSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fVEVTVEdfUkVHKSA6IC8qIHRlc3RnICRicl9zcmMxICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3Rlc3Rub19yZWcuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgMSksIDApOworICAgICogRkxEIChpX2JyX3NyYzEpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImJyX3NyYzEiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1RFU1RFX1JFRykgOiAvKiB0ZXN0ZSAkYnJfc3JjMSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF90ZXN0bm9fcmVnLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gTkVTSSAoQU5EU0kgKENQVSAoaF9jYyksIDIpLCAwKTsKKyAgICAqIEZMRCAoaV9icl9zcmMxKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJicl9zcmMxIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9URVNUR0VfUkVHKSA6IC8qIHRlc3RnZSAkYnJfc3JjMSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF90ZXN0bm9fcmVnLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gTkVTSSAoQU5EU0kgKENQVSAoaF9jYyksIDMpLCAwKTsKKyAgICAqIEZMRCAoaV9icl9zcmMxKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJicl9zcmMxIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9URVNUTF9SRUcpIDogLyogdGVzdGwgJGJyX3NyYzEgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfdGVzdG5vX3JlZy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCA0KSwgMCk7CisgICAgKiBGTEQgKGlfYnJfc3JjMSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnJfc3JjMSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fVEVTVE5FX1JFRykgOiAvKiB0ZXN0bmUgJGJyX3NyYzEgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfdGVzdG5vX3JlZy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCA1KSwgMCk7CisgICAgKiBGTEQgKGlfYnJfc3JjMSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnJfc3JjMSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fVEVTVExFX1JFRykgOiAvKiB0ZXN0bGUgJGJyX3NyYzEgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfdGVzdG5vX3JlZy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCA2KSwgMCk7CisgICAgKiBGTEQgKGlfYnJfc3JjMSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnJfc3JjMSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fVEVTVE9fUkVHKSA6IC8qIHRlc3RvICRicl9zcmMxICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3Rlc3Rub19yZWcuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgNyksIDApOworICAgICogRkxEIChpX2JyX3NyYzEpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImJyX3NyYzEiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JOTykgOiAvKiBibm8gJGN0cmxfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2Juby5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKEVRU0kgKENQVSAoaF9jYyksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfY3RybF9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CRykgOiAvKiBiZyAkY3RybF9kaXNwICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5vLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoTkVTSSAoQU5EU0kgKENQVSAoaF9jYyksIDEpLCAwKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2N0cmxfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQkUpIDogLyogYmUgJGN0cmxfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2Juby5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCAyKSwgMCkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9jdHJsX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JHRSkgOiAvKiBiZ2UgJGN0cmxfZGlzcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2Juby5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCAzKSwgMCkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9jdHJsX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JMKSA6IC8qIGJsICRjdHJsX2Rpc3AgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibm8uZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgNCksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfY3RybF9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CTkUpIDogLyogYm5lICRjdHJsX2Rpc3AgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibm8uZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgNSksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfY3RybF9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CTEUpIDogLyogYmxlICRjdHJsX2Rpc3AgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibm8uZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgNiksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfY3RybF9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CTykgOiAvKiBibyAkY3RybF9kaXNwICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5vLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoTkVTSSAoQU5EU0kgKENQVSAoaF9jYyksIDcpLCAwKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2N0cmxfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQikgOiAvKiBiICRjdHJsX2Rpc3AgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfY3RybF9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CWF9JTkRJUkVDVF9PRkZTRVQpIDogLyogYnggJG9mZnNldCgkYWJhc2UpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYnhfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBVU0kgb3B2YWwgPSBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CWF9JTkRJUkVDVCkgOiAvKiBieCAoJGFiYXNlKSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2J4X2luZGlyZWN0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBVU0kgb3B2YWwgPSAqIEZMRCAoaV9hYmFzZSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CWF9JTkRJUkVDVF9JTkRFWCkgOiAvKiBieCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ieF9pbmRpcmVjdF9pbmRleC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgVVNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CWF9ESVNQKSA6IC8qIGJ4ICRvcHRkaXNwICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYnhfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChmX29wdGRpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JYX0lORElSRUNUX0RJU1ApIDogLyogYnggJG9wdGRpc3AoJGFiYXNlKSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2J4X2luZGlyZWN0X2Rpc3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFVTSSBvcHZhbCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9DQUxMWF9ESVNQKSA6IC8qIGNhbGx4ICRvcHRkaXNwICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY2FsbHhfZGlzcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfdGVtcDsKKyAgdG1wX3RlbXAgPSBBTkRTSSAoQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDEpXSksIDYzKSwgSU5WU0kgKDYzKSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChwYywgOCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMildKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMCksIENQVSAoaF9nclsoKFVJTlQpIDApXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0KSwgQ1BVIChoX2dyWygoVUlOVCkgMSldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDgpLCBDUFUgKGhfZ3JbKChVSU5UKSAyKV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMTIpLCBDUFUgKGhfZ3JbKChVSU5UKSAzKV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMTYpLCBDUFUgKGhfZ3JbKChVSU5UKSA0KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMjApLCBDUFUgKGhfZ3JbKChVSU5UKSA1KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMjQpLCBDUFUgKGhfZ3JbKChVSU5UKSA2KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMjgpLCBDUFUgKGhfZ3JbKChVSU5UKSA3KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMzIpLCBDUFUgKGhfZ3JbKChVSU5UKSA4KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMzYpLCBDUFUgKGhfZ3JbKChVSU5UKSA5KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNDApLCBDUFUgKGhfZ3JbKChVSU5UKSAxMCldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQ0KSwgQ1BVIChoX2dyWygoVUlOVCkgMTEpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0OCksIENQVSAoaF9nclsoKFVJTlQpIDEyKV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNTIpLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDU2KSwgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA2MCksIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoZl9vcHRkaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9CitDUFUgKGhfZ3JbKChVSU5UKSAwKV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDEpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMildKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAzKV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDQpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgNSldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSA2KV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDcpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgOCldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSA5KV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDEwKV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDExKV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDEyKV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDEzKV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDE0KV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gMHhkZWFkYmVlZjsKKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMzEpXSk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMCldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0wIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gdG1wX3RlbXA7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMzEpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMzEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAodG1wX3RlbXAsIDY0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9DQUxMWF9JTkRJUkVDVCkgOiAvKiBjYWxseCAoJGFiYXNlKSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NhbGx4X2luZGlyZWN0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF90ZW1wOworICB0bXBfdGVtcCA9IEFORFNJIChBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMSldKSwgNjMpLCBJTlZTSSAoNjMpKTsKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKHBjLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAyKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTIiLCAneCcsIG9wdmFsKTsKKyAgfQorU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAwKSwgQ1BVIChoX2dyWygoVUlOVCkgMCldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQpLCBDUFUgKGhfZ3JbKChVSU5UKSAxKV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgOCksIENQVSAoaF9nclsoKFVJTlQpIDIpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAxMiksIENQVSAoaF9nclsoKFVJTlQpIDMpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAxNiksIENQVSAoaF9nclsoKFVJTlQpIDQpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAyMCksIENQVSAoaF9nclsoKFVJTlQpIDUpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAyNCksIENQVSAoaF9nclsoKFVJTlQpIDYpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAyOCksIENQVSAoaF9nclsoKFVJTlQpIDcpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAzMiksIENQVSAoaF9nclsoKFVJTlQpIDgpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAzNiksIENQVSAoaF9nclsoKFVJTlQpIDkpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0MCksIENQVSAoaF9nclsoKFVJTlQpIDEwKV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNDQpLCBDUFUgKGhfZ3JbKChVSU5UKSAxMSldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQ4KSwgQ1BVIChoX2dyWygoVUlOVCkgMTIpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA1MiksIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNTYpLCBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDYwKSwgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOworICB7CisgICAgVVNJIG9wdmFsID0gKiBGTEQgKGlfYWJhc2UpOworICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorQ1BVIChoX2dyWygoVUlOVCkgMCldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxKV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDIpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMyldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSA0KV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDUpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgNildKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSA3KV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDgpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgOSldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxMCldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxMSldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxMildKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IDB4ZGVhZGJlZWY7CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDMxKV0pOworICAgIENQVSAoaF9nclsoKFVJTlQpIDApXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IHRtcF90ZW1wOworICAgIENQVSAoaF9nclsoKFVJTlQpIDMxKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTMxIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKHRtcF90ZW1wLCA2NCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ0FMTFhfSU5ESVJFQ1RfT0ZGU0VUKSA6IC8qIGNhbGx4ICRvZmZzZXQoJGFiYXNlKSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NhbGx4X2luZGlyZWN0X29mZnNldC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfdGVtcDsKKyAgdG1wX3RlbXAgPSBBTkRTSSAoQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDEpXSksIDYzKSwgSU5WU0kgKDYzKSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChwYywgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMildKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMCksIENQVSAoaF9nclsoKFVJTlQpIDApXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0KSwgQ1BVIChoX2dyWygoVUlOVCkgMSldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDgpLCBDUFUgKGhfZ3JbKChVSU5UKSAyKV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMTIpLCBDUFUgKGhfZ3JbKChVSU5UKSAzKV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMTYpLCBDUFUgKGhfZ3JbKChVSU5UKSA0KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMjApLCBDUFUgKGhfZ3JbKChVSU5UKSA1KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMjQpLCBDUFUgKGhfZ3JbKChVSU5UKSA2KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMjgpLCBDUFUgKGhfZ3JbKChVSU5UKSA3KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMzIpLCBDUFUgKGhfZ3JbKChVSU5UKSA4KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMzYpLCBDUFUgKGhfZ3JbKChVSU5UKSA5KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNDApLCBDUFUgKGhfZ3JbKChVSU5UKSAxMCldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQ0KSwgQ1BVIChoX2dyWygoVUlOVCkgMTEpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0OCksIENQVSAoaF9nclsoKFVJTlQpIDEyKV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNTIpLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDU2KSwgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA2MCksIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgeworICAgIFVTSSBvcHZhbCA9IEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK0NQVSAoaF9nclsoKFVJTlQpIDApXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMSldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAyKV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDMpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgNCldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSA1KV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDYpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgNyldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSA4KV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDkpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMTApXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMTEpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMTIpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSAweGRlYWRiZWVmOworICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAzMSldKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAwKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTAiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSB0bXBfdGVtcDsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0zMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJICh0bXBfdGVtcCwgNjQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDEpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1JFVCkgOiAvKiByZXQgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9yZXQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMCldKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0zMSIsICd4Jywgb3B2YWwpOworICB9CitDUFUgKGhfZ3JbKChVSU5UKSAwKV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAwKSk7CitDUFUgKGhfZ3JbKChVSU5UKSAxKV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0KSk7CitDUFUgKGhfZ3JbKChVSU5UKSAyKV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA4KSk7CitDUFUgKGhfZ3JbKChVSU5UKSAzKV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAxMikpOworQ1BVIChoX2dyWygoVUlOVCkgNCldKSA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMTYpKTsKK0NQVSAoaF9nclsoKFVJTlQpIDUpXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDIwKSk7CitDUFUgKGhfZ3JbKChVSU5UKSA2KV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAyNCkpOworQ1BVIChoX2dyWygoVUlOVCkgNyldKSA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMjgpKTsKK0NQVSAoaF9nclsoKFVJTlQpIDgpXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDMyKSk7CitDUFUgKGhfZ3JbKChVSU5UKSA5KV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAzNikpOworQ1BVIChoX2dyWygoVUlOVCkgMTApXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQwKSk7CitDUFUgKGhfZ3JbKChVSU5UKSAxMSldKSA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNDQpKTsKK0NQVSAoaF9nclsoKFVJTlQpIDEyKV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0OCkpOworQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDUyKSk7CitDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNTYpKTsKK0NQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA2MCkpOworICB7CisgICAgVVNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMildKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ0FMTFMpIDogLyogY2FsbHMgJHNyYzEgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jYWxscy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBpOTYwX3RyYXAgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3JjMSkpOworICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fRk1BUkspIDogLyogZm1hcmsgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9mbWFyay5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBpOTYwX2JyZWFrcG9pbnQgKGN1cnJlbnRfY3B1LCBwYyk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9GTFVTSFJFRykgOiAvKiBmbHVzaHJlZyAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9mbHVzaHJlZy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7IH0gd2hpbGUgKDApOyAvKm5vcCovCisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworCisgICAgfQorICBFTkRTV0lUQ0ggKHNlbSkgLyogRW5kIG9mIHNlbWFudGljIHN3aXRjaC4gICovCisKKyAgLyogQXQgdGhpcyBwb2ludCBgdnBjJyBjb250YWlucyB0aGUgbmV4dCBpbnNuIHRvIGV4ZWN1dGUuICAqLworfQorCisjdW5kZWYgREVGSU5FX1NXSVRDSAorI2VuZGlmIC8qIERFRklORV9TV0lUQ0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9pOTYwL3NlbS5jIGIvc2ltL2k5NjAvc2VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2MjE4OAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9pOTYwL3NlbS5jCkBAIC0wLDAgKzEsNzQwNiBAQAorLyogU2ltdWxhdG9yIGluc3RydWN0aW9uIHNlbWFudGljcyBmb3IgaTk2MGJhc2UuCisKK1RISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCisKK0NvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyovCisKKyNkZWZpbmUgV0FOVF9DUFUgaTk2MGJhc2UKKyNkZWZpbmUgV0FOVF9DUFVfSTk2MEJBU0UKKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAiY2dlbi1tZW0uaCIKKyNpbmNsdWRlICJjZ2VuLW9wcy5oIgorCisjdW5kZWYgR0VUX0FUVFIKKyNkZWZpbmUgR0VUX0FUVFIoY3B1LCBudW0sIGF0dHIpIENHRU5fQVRUUl9WQUxVRSAoTlVMTCwgYWJ1Zi0+aWRlc2MtPmF0dHJzLCBDR0VOX0lOU05fIyNhdHRyKQorCisvKiB4LWludmFsaWQ6IC0taW52YWxpZC0tICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHhfaW52YWxpZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKKworICB7CisjaWYgV0lUSF9TQ0FDSEUKKyAgICAvKiBVcGRhdGUgdGhlIHJlY29yZGVkIHBjIGluIHRoZSBjcHUgc3RhdGUgc3RydWN0LiAgKi8KKyAgICBTRVRfSF9QQyAocGMpOworI2VuZGlmCisgICAgc2ltX2VuZ2luZV9pbnZhbGlkX2luc24gKGN1cnJlbnRfY3B1LCBwYyk7CisgICAgc2ltX2lvX2Vycm9yIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSwgImludmFsaWQgaW5zbiBub3QgaGFuZGxlZFxuIik7CisgICAgLyogTk9UUkVBQ0hFRCAqLworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogeC1hZnRlcjogLS1hZnRlci0tICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHhfYWZ0ZXIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7CisKKyAgeworI2lmIFdJVEhfU0NBQ0hFX1BCQl9JOTYwQkFTRQorICAgIGk5NjBiYXNlX3BiYl9hZnRlciAoY3VycmVudF9jcHUsIHNlbV9hcmcpOworI2VuZGlmCisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiB4LWJlZm9yZTogLS1iZWZvcmUtLSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSx4X2JlZm9yZSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKKworICB7CisjaWYgV0lUSF9TQ0FDSEVfUEJCX0k5NjBCQVNFCisgICAgaTk2MGJhc2VfcGJiX2JlZm9yZSAoY3VycmVudF9jcHUsIHNlbV9hcmcpOworI2VuZGlmCisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiB4LWN0aS1jaGFpbjogLS1jdGktY2hhaW4tLSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSx4X2N0aV9jaGFpbikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKKworICB7CisjaWYgV0lUSF9TQ0FDSEVfUEJCX0k5NjBCQVNFCisjaWZkZWYgREVGSU5FX1NXSVRDSAorICAgIHZwYyA9IGk5NjBiYXNlX3BiYl9jdGlfY2hhaW4gKGN1cnJlbnRfY3B1LCBzZW1fYXJnLAorCQkJICAgICAgIHBiYl9icl9ucGNfcHRyLCBwYmJfYnJfbnBjKTsKKyAgICBCUkVBSyAoc2VtKTsKKyNlbHNlCisgICAgLyogRklYTUU6IEFsbG93IHByb3Zpc2lvbiBvZiBleHBsaWNpdCBpZm10IHNwZWMgaW4gaW5zbiBzcGVjLiAgKi8KKyAgICB2cGMgPSBpOTYwYmFzZV9wYmJfY3RpX2NoYWluIChjdXJyZW50X2NwdSwgc2VtX2FyZywKKwkJCSAgICAgICBDUFVfUEJCX0JSX05QQ19QVFIgKGN1cnJlbnRfY3B1KSwKKwkJCSAgICAgICBDUFVfUEJCX0JSX05QQyAoY3VycmVudF9jcHUpKTsKKyNlbmRpZgorI2VuZGlmCisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiB4LWNoYWluOiAtLWNoYWluLS0gKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UseF9jaGFpbikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKKworICB7CisjaWYgV0lUSF9TQ0FDSEVfUEJCX0k5NjBCQVNFCisgICAgdnBjID0gaTk2MGJhc2VfcGJiX2NoYWluIChjdXJyZW50X2NwdSwgc2VtX2FyZyk7CisjaWZkZWYgREVGSU5FX1NXSVRDSAorICAgIEJSRUFLIChzZW0pOworI2VuZGlmCisjZW5kaWYKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHgtYmVnaW46IC0tYmVnaW4tLSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSx4X2JlZ2luKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOworCisgIHsKKyNpZiBXSVRIX1NDQUNIRV9QQkJfSTk2MEJBU0UKKyNpZmRlZiBERUZJTkVfU1dJVENICisgICAgLyogSW4gdGhlIHN3aXRjaCBjYXNlIEZBU1RfUCBpcyBhIGNvbnN0YW50LCBhbGxvd2luZyBzZXZlcmFsIG9wdGltaXphdGlvbnMKKyAgICAgICBpbiBhbnkgY2FsbGVkIGlubGluZSBmdW5jdGlvbnMuICAqLworICAgIHZwYyA9IGk5NjBiYXNlX3BiYl9iZWdpbiAoY3VycmVudF9jcHUsIEZBU1RfUCk7CisjZWxzZQorICAgIHZwYyA9IGk5NjBiYXNlX3BiYl9iZWdpbiAoY3VycmVudF9jcHUsIFNUQVRFX1JVTl9GQVNUX1AgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKSk7CisjZW5kaWYKKyNlbmRpZgorICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbXVsbzogbXVsbyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbXVsbykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE1VTFNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtdWxvMTogbXVsbyAkbGl0MSwgJHNyYzIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbXVsbzEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gTVVMU0kgKEZMRCAoZl9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtdWxvMjogbXVsbyAkc3JjMSwgJGxpdDIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbXVsbzIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gTVVMU0kgKCogRkxEIChpX3NyYzEpLCBGTEQgKGZfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtdWxvMzogbXVsbyAkbGl0MSwgJGxpdDIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbXVsbzMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gTVVMU0kgKEZMRCAoZl9zcmMxKSwgRkxEIChmX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogcmVtbzogcmVtbyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UscmVtbykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFVNT0RTSSAoKiBGTEQgKGlfc3JjMiksICogRkxEIChpX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogcmVtbzE6IHJlbW8gJGxpdDEsICRzcmMyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHJlbW8xKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzEuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFVNT0RTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHJlbW8yOiByZW1vICRzcmMxLCAkbGl0MiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxyZW1vMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBVTU9EU0kgKEZMRCAoZl9zcmMyKSwgKiBGTEQgKGlfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiByZW1vMzogcmVtbyAkbGl0MSwgJGxpdDIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UscmVtbzMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gVU1PRFNJIChGTEQgKGZfc3JjMiksIEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGRpdm86IGRpdm8gJHNyYzEsICRzcmMyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGRpdm8pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBVRElWU0kgKCogRkxEIChpX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGRpdm8xOiBkaXZvICRsaXQxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxkaXZvMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBVRElWU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBkaXZvMjogZGl2byAkc3JjMSwgJGxpdDIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsZGl2bzIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gVURJVlNJIChGTEQgKGZfc3JjMiksICogRkxEIChpX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogZGl2bzM6IGRpdm8gJGxpdDEsICRsaXQyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGRpdm8zKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFVESVZTSSAoRkxEIChmX3NyYzIpLCBGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiByZW1pOiByZW1pICRzcmMxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxyZW1pKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gTU9EU0kgKCogRkxEIChpX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHJlbWkxOiByZW1pICRsaXQxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxyZW1pMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBNT0RTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHJlbWkyOiByZW1pICRzcmMxLCAkbGl0MiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxyZW1pMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBNT0RTSSAoRkxEIChmX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHJlbWkzOiByZW1pICRsaXQxLCAkbGl0MiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxyZW1pMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBNT0RTSSAoRkxEIChmX3NyYzIpLCBGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBkaXZpOiBkaXZpICRzcmMxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxkaXZpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gRElWU0kgKCogRkxEIChpX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGRpdmkxOiBkaXZpICRsaXQxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxkaXZpMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBESVZTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGRpdmkyOiBkaXZpICRzcmMxLCAkbGl0MiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxkaXZpMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBESVZTSSAoRkxEIChmX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGRpdmkzOiBkaXZpICRsaXQxLCAkbGl0MiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxkaXZpMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBESVZTSSAoRkxEIChmX3NyYzIpLCBGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBhZGRvOiBhZGRvICRzcmMxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxhZGRvKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGFkZG8xOiBhZGRvICRsaXQxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxhZGRvMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoRkxEIChmX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGFkZG8yOiBhZGRvICRzcmMxLCAkbGl0MiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxhZGRvMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGFkZG8zOiBhZGRvICRsaXQxLCAkbGl0MiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxhZGRvMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoRkxEIChmX3NyYzEpLCBGTEQgKGZfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdWJvOiBzdWJvICRzcmMxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdWJvKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gU1VCU0kgKCogRkxEIChpX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN1Ym8xOiBzdWJvICRsaXQxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdWJvMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN1Ym8yOiBzdWJvICRzcmMxLCAkbGl0MiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdWJvMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoRkxEIChmX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN1Ym8zOiBzdWJvICRsaXQxLCAkbGl0MiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdWJvMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoRkxEIChmX3NyYzIpLCBGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBub3RiaXQ6IG5vdGJpdCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usbm90Yml0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBYT1JTSSAoU0xMU0kgKDEsICogRkxEIChpX3NyYzEpKSwgKiBGTEQgKGlfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBub3RiaXQxOiBub3RiaXQgJGxpdDEsICRzcmMyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG5vdGJpdDEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQxLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBYT1JTSSAoU0xMU0kgKDEsIEZMRCAoZl9zcmMxKSksICogRkxEIChpX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbm90Yml0Mjogbm90Yml0ICRzcmMxLCAkbGl0MiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxub3RiaXQyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0Mi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gWE9SU0kgKFNMTFNJICgxLCAqIEZMRCAoaV9zcmMxKSksIEZMRCAoZl9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG5vdGJpdDM6IG5vdGJpdCAkbGl0MSwgJGxpdDIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usbm90Yml0MykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDMuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFhPUlNJIChTTExTSSAoMSwgRkxEIChmX3NyYzEpKSwgRkxEIChmX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYW5kOiBhbmQgJHNyYzEsICRzcmMyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGFuZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBhbmQxOiBhbmQgJGxpdDEsICRzcmMyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGFuZDEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQU5EU0kgKEZMRCAoZl9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBhbmQyOiBhbmQgJHNyYzEsICRsaXQyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGFuZDIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQU5EU0kgKCogRkxEIChpX3NyYzEpLCBGTEQgKGZfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBhbmQzOiBhbmQgJGxpdDEsICRsaXQyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGFuZDMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQU5EU0kgKEZMRCAoZl9zcmMxKSwgRkxEIChmX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYW5kbm90OiBhbmRub3QgJHNyYzEsICRzcmMyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGFuZG5vdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9zcmMyKSwgSU5WU0kgKCogRkxEIChpX3NyYzEpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGFuZG5vdDE6IGFuZG5vdCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYW5kbm90MSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8xLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBTkRTSSAoKiBGTEQgKGlfc3JjMiksIElOVlNJIChGTEQgKGZfc3JjMSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYW5kbm90MjogYW5kbm90ICRzcmMxLCAkbGl0MiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxhbmRub3QyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzIuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJIChGTEQgKGZfc3JjMiksIElOVlNJICgqIEZMRCAoaV9zcmMxKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBhbmRub3QzOiBhbmRub3QgJGxpdDEsICRsaXQyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGFuZG5vdDMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQU5EU0kgKEZMRCAoZl9zcmMyKSwgSU5WU0kgKEZMRCAoZl9zcmMxKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzZXRiaXQ6IHNldGJpdCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2V0Yml0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBPUlNJIChTTExTSSAoMSwgKiBGTEQgKGlfc3JjMSkpLCAqIEZMRCAoaV9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHNldGJpdDE6IHNldGJpdCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2V0Yml0MSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDEuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE9SU0kgKFNMTFNJICgxLCBGTEQgKGZfc3JjMSkpLCAqIEZMRCAoaV9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHNldGJpdDI6IHNldGJpdCAkc3JjMSwgJGxpdDIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2V0Yml0MikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDIuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE9SU0kgKFNMTFNJICgxLCAqIEZMRCAoaV9zcmMxKSksIEZMRCAoZl9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHNldGJpdDM6IHNldGJpdCAkbGl0MSwgJGxpdDIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2V0Yml0MykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDMuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE9SU0kgKFNMTFNJICgxLCBGTEQgKGZfc3JjMSkpLCBGTEQgKGZfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBub3RhbmQ6IG5vdGFuZCAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usbm90YW5kKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsby5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQU5EU0kgKElOVlNJICgqIEZMRCAoaV9zcmMyKSksICogRkxEIChpX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbm90YW5kMTogbm90YW5kICRsaXQxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxub3RhbmQxKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzEuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJIChJTlZTSSAoKiBGTEQgKGlfc3JjMikpLCBGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBub3RhbmQyOiBub3RhbmQgJHNyYzEsICRsaXQyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG5vdGFuZDIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQU5EU0kgKElOVlNJIChGTEQgKGZfc3JjMikpLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG5vdGFuZDM6IG5vdGFuZCAkbGl0MSwgJGxpdDIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usbm90YW5kMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8zLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKEZMRCAoZl9zcmMyKSksIEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHhvcjogeG9yICRzcmMxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSx4b3IpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBYT1JTSSAoKiBGTEQgKGlfc3JjMSksICogRkxEIChpX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogeG9yMTogeG9yICRsaXQxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSx4b3IxKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzEuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFhPUlNJIChGTEQgKGZfc3JjMSksICogRkxEIChpX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogeG9yMjogeG9yICRzcmMxLCAkbGl0MiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSx4b3IyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzIuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFhPUlNJICgqIEZMRCAoaV9zcmMxKSwgRkxEIChmX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogeG9yMzogeG9yICRsaXQxLCAkbGl0MiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSx4b3IzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFhPUlNJIChGTEQgKGZfc3JjMSksIEZMRCAoZl9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG9yOiBvciAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usb3IpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBPUlNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBvcjE6IG9yICRsaXQxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxvcjEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gT1JTSSAoRkxEIChmX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG9yMjogb3IgJHNyYzEsICRsaXQyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG9yMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBPUlNJICgqIEZMRCAoaV9zcmMxKSwgRkxEIChmX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogb3IzOiBvciAkbGl0MSwgJGxpdDIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usb3IzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzMuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE9SU0kgKEZMRCAoZl9zcmMxKSwgRkxEIChmX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbm9yOiBub3IgJHNyYzEsICRzcmMyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG5vcikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8uZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJIChJTlZTSSAoKiBGTEQgKGlfc3JjMikpLCBJTlZTSSAoKiBGTEQgKGlfc3JjMSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbm9yMTogbm9yICRsaXQxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxub3IxKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsbzEuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJIChJTlZTSSAoKiBGTEQgKGlfc3JjMikpLCBJTlZTSSAoRkxEIChmX3NyYzEpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG5vcjI6IG5vciAkc3JjMSwgJGxpdDIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usbm9yMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bG8yLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKEZMRCAoZl9zcmMyKSksIElOVlNJICgqIEZMRCAoaV9zcmMxKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBub3IzOiBub3IgJGxpdDEsICRsaXQyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG5vcjMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxvMy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQU5EU0kgKElOVlNJIChGTEQgKGZfc3JjMikpLCBJTlZTSSAoRkxEIChmX3NyYzEpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG5vdDogbm90ICRzcmMxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxub3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3QuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IElOVlNJICgqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG5vdDE6IG5vdCAkbGl0MSwgJHNyYzIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usbm90MSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdDEuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IElOVlNJIChGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBub3QyOiBub3QgJHNyYzEsICRsaXQyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG5vdDIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3QyLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBJTlZTSSAoKiBGTEQgKGlfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBub3QzOiBub3QgJGxpdDEsICRsaXQyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG5vdDMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3QzLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBJTlZTSSAoRkxEIChmX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY2xyYml0OiBjbHJiaXQgJHNyYzEsICRzcmMyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNscmJpdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQU5EU0kgKElOVlNJIChTTExTSSAoMSwgKiBGTEQgKGlfc3JjMSkpKSwgKiBGTEQgKGlfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBjbHJiaXQxOiBjbHJiaXQgJGxpdDEsICRzcmMyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNscmJpdDEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQxLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKFNMTFNJICgxLCBGTEQgKGZfc3JjMSkpKSwgKiBGTEQgKGlfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBjbHJiaXQyOiBjbHJiaXQgJHNyYzEsICRsaXQyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNscmJpdDIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQyLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKFNMTFNJICgxLCAqIEZMRCAoaV9zcmMxKSkpLCBGTEQgKGZfc3JjMikpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBjbHJiaXQzOiBjbHJiaXQgJGxpdDEsICRsaXQyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNscmJpdDMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQzLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBTkRTSSAoSU5WU0kgKFNMTFNJICgxLCBGTEQgKGZfc3JjMSkpKSwgRkxEIChmX3NyYzIpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc2hsbzogc2hsbyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2hsbykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gU0xMU0kgKCogRkxEIChpX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHNobG8xOiBzaGxvICRsaXQxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzaGxvMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDEuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFNMTFNJICgqIEZMRCAoaV9zcmMyKSwgRkxEIChmX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc2hsbzI6IHNobG8gJHNyYzEsICRsaXQyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNobG8yKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0Mi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gU0xMU0kgKEZMRCAoZl9zcmMyKSwgKiBGTEQgKGlfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzaGxvMzogc2hsbyAkbGl0MSwgJGxpdDIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2hsbzMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQzLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTTExTSSAoRkxEIChmX3NyYzIpLCBGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzaHJvOiBzaHJvICRzcmMxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzaHJvKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTUkxTSSAoKiBGTEQgKGlfc3JjMiksICogRkxEIChpX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc2hybzE6IHNocm8gJGxpdDEsICRzcmMyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNocm8xKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0MS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gU1JMU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzaHJvMjogc2hybyAkc3JjMSwgJGxpdDIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2hybzIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQyLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTUkxTSSAoRkxEIChmX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHNocm8zOiBzaHJvICRsaXQxLCAkbGl0MiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzaHJvMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDMuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFNSTFNJIChGTEQgKGZfc3JjMiksIEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHNobGk6IHNobGkgJHNyYzEsICRzcmMyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNobGkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFNMTFNJICgqIEZMRCAoaV9zcmMyKSwgKiBGTEQgKGlfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzaGxpMTogc2hsaSAkbGl0MSwgJHNyYzIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2hsaTEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQxLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTTExTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHNobGkyOiBzaGxpICRzcmMxLCAkbGl0MiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzaGxpMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDIuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFNMTFNJIChGTEQgKGZfc3JjMiksICogRkxEIChpX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc2hsaTM6IHNobGkgJGxpdDEsICRsaXQyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNobGkzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0My5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gU0xMU0kgKEZMRCAoZl9zcmMyKSwgRkxEIChmX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc2hyaTogc2hyaSAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2hyaSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gU1JBU0kgKCogRkxEIChpX3NyYzIpLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHNocmkxOiBzaHJpICRsaXQxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzaHJpMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vdGJpdDEuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFNSQVNJICgqIEZMRCAoaV9zcmMyKSwgRkxEIChmX3NyYzEpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc2hyaTI6IHNocmkgJHNyYzEsICRsaXQyLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHNocmkyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbm90Yml0Mi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gU1JBU0kgKEZMRCAoZl9zcmMyKSwgKiBGTEQgKGlfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzaHJpMzogc2hyaSAkbGl0MSwgJGxpdDIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc2hyaTMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3RiaXQzLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTUkFTSSAoRkxEIChmX3NyYzIpLCBGTEQgKGZfc3JjMSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBlbXVsOiBlbXVsICRzcmMxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxlbXVsKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW11bC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgREkgdG1wX3RlbXA7CisgIHRtcF90ZW1wID0gTVVMREkgKFpFWFRTSURJICgqIEZMRCAoaV9zcmMxKSksIFpFWFRTSURJICgqIEZMRCAoaV9zcmMyKSkpOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAodG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChTUkxESSAodG1wX3RlbXAsIDMyKSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGVtdWwxOiBlbXVsICRsaXQxLCAkc3JjMiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxlbXVsMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtdWwxLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBESSB0bXBfdGVtcDsKKyAgdG1wX3RlbXAgPSBNVUxESSAoWkVYVFNJREkgKEZMRCAoZl9zcmMxKSksIFpFWFRTSURJICgqIEZMRCAoaV9zcmMyKSkpOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAodG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChTUkxESSAodG1wX3RlbXAsIDMyKSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGVtdWwyOiBlbXVsICRzcmMxLCAkbGl0MiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxlbXVsMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtdWwyLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBESSB0bXBfdGVtcDsKKyAgdG1wX3RlbXAgPSBNVUxESSAoWkVYVFNJREkgKCogRkxEIChpX3NyYzEpKSwgWkVYVFNJREkgKEZMRCAoZl9zcmMyKSkpOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAodG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChTUkxESSAodG1wX3RlbXAsIDMyKSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGVtdWwzOiBlbXVsICRsaXQxLCAkbGl0MiwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxlbXVsMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtdWwzLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBESSB0bXBfdGVtcDsKKyAgdG1wX3RlbXAgPSBNVUxESSAoWkVYVFNJREkgKEZMRCAoZl9zcmMxKSksIFpFWFRTSURJIChGTEQgKGZfc3JjMikpKTsKKyAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKHRtcF90ZW1wKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAoU1JMREkgKHRtcF90ZW1wLCAzMikpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtb3Y6IG1vdiAkc3JjMSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxtb3YpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3QyLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbW92MTogbW92ICRsaXQxLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG1vdjEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3QzLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBGTEQgKGZfc3JjMSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG1vdmw6IG1vdmwgJHNyYzEsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbW92bCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdmwuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIFNJIHRtcF9kcmVnbm87CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmMxKTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjMSkpICsgKDEpKV0pOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtb3ZsMTogbW92bCAkbGl0MSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxtb3ZsMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdmwxLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEZMRCAoZl9zcmMxKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IDA7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG1vdnQ6IG1vdnQgJHNyYzEsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbW92dCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21vdnQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIFNJIHRtcF9kcmVnbm87CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmMxKTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjMSkpICsgKDEpKV0pOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmMxKSkgKyAoMikpXSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG1vdnQxOiBtb3Z0ICRsaXQxLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG1vdnQxKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW92dDEuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9kcmVnbm87CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gRkxEIChmX3NyYzEpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gMDsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSAwOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMiIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtb3ZxOiBtb3ZxICRzcmMxLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG1vdnEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tb3ZxLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfc3JlZ25vOworICBTSSB0bXBfZHJlZ25vOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjMSk7CisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3NyYzEpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyYzEpKSArICgxKSldKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjMSkpICsgKDIpKV0pOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMiIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmMxKSkgKyAoMykpXSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0zIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG1vdnExOiBtb3ZxICRsaXQxLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLG1vdnExKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbW92cTEuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9kcmVnbm87CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gRkxEIChmX3NyYzEpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gMDsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSAwOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMiIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IDA7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0zIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG1vZHBjOiBtb2RwYyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbW9kcGMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tb2RwYy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMik7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG1vZGFjOiBtb2RhYyAkc3JjMSwgJHNyYzIsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbW9kYWMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tb2RwYy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMik7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkYS1vZmZzZXQ6IGxkYSAkb2Zmc2V0LCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkYV9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGFfb2Zmc2V0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBGTEQgKGZfb2Zmc2V0KTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRhLWluZGlyZWN0LW9mZnNldDogbGRhICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGFfaW5kaXJlY3Rfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRhX2luZGlyZWN0X29mZnNldC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZGEtaW5kaXJlY3Q6IGxkYSAoJGFiYXNlKSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGFfaW5kaXJlY3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGFfaW5kaXJlY3QuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX2FiYXNlKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRhLWluZGlyZWN0LWluZGV4OiBsZGEgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkYV9pbmRpcmVjdF9pbmRleCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYV9pbmRpcmVjdF9pbmRleC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkYS1kaXNwOiBsZGEgJG9wdGRpc3AsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRhX2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGFfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gRkxEIChmX29wdGRpc3ApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZGEtaW5kaXJlY3QtZGlzcDogbGRhICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRhX2luZGlyZWN0X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGFfaW5kaXJlY3RfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRhLWluZGV4LWRpc3A6IGxkYSAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRhX2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGFfaW5kZXhfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkYS1pbmRpcmVjdC1pbmRleC1kaXNwOiBsZGEgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRhX2luZGlyZWN0X2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGFfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZC1vZmZzZXQ6IGxkICRvZmZzZXQsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfb2Zmc2V0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb2Zmc2V0KSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkLWluZGlyZWN0LW9mZnNldDogbGQgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkX2luZGlyZWN0X29mZnNldCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkX2luZGlyZWN0X29mZnNldC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGQtaW5kaXJlY3Q6IGxkICgkYWJhc2UpLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkX2luZGlyZWN0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfaW5kaXJlY3QuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkLWluZGlyZWN0LWluZGV4OiBsZCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRfaW5kaXJlY3RfaW5kZXgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZF9pbmRpcmVjdF9pbmRleC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZC1kaXNwOiBsZCAkb3B0ZGlzcCwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29wdGRpc3ApKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGQtaW5kaXJlY3QtZGlzcDogbGQgJG9wdGRpc3AoJGFiYXNlKSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZF9pbmRpcmVjdF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfaW5kaXJlY3RfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkLWluZGV4LWRpc3A6IGxkICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZF9pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfaW5kZXhfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZC1pbmRpcmVjdC1pbmRleC1kaXNwOiBsZCAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZF9pbmRpcmVjdF9pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRvYi1vZmZzZXQ6IGxkb2IgJG9mZnNldCwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZG9iX29mZnNldCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2Jfb2Zmc2V0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1VUUkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29mZnNldCkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZG9iLWluZGlyZWN0LW9mZnNldDogbGRvYiAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRvYl9pbmRpcmVjdF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9iX2luZGlyZWN0X29mZnNldC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkb2ItaW5kaXJlY3Q6IGxkb2IgKCRhYmFzZSksICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRvYl9pbmRpcmVjdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2JfaW5kaXJlY3QuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVRSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9hYmFzZSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZG9iLWluZGlyZWN0LWluZGV4OiBsZG9iICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZG9iX2luZGlyZWN0X2luZGV4KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRvYl9pbmRpcmVjdF9pbmRleC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRvYi1kaXNwOiBsZG9iICRvcHRkaXNwLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb2JfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2JfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkb2ItaW5kaXJlY3QtZGlzcDogbGRvYiAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb2JfaW5kaXJlY3RfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2JfaW5kaXJlY3RfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZG9iLWluZGV4LWRpc3A6IGxkb2IgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb2JfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2JfaW5kZXhfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRvYi1pbmRpcmVjdC1pbmRleC1kaXNwOiBsZG9iICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb2JfaW5kaXJlY3RfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb2JfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkb3Mtb2Zmc2V0OiBsZG9zICRvZmZzZXQsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRvc19vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9zX29mZnNldC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNVUhJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vZmZzZXQpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRvcy1pbmRpcmVjdC1vZmZzZXQ6IGxkb3MgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb3NfaW5kaXJlY3Rfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRvc19pbmRpcmVjdF9vZmZzZXQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZG9zLWluZGlyZWN0OiBsZG9zICgkYWJhc2UpLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkb3NfaW5kaXJlY3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9zX2luZGlyZWN0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfYWJhc2UpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRvcy1pbmRpcmVjdC1pbmRleDogbGRvcyAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRvc19pbmRpcmVjdF9pbmRleCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkb3NfaW5kaXJlY3RfaW5kZXguZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkb3MtZGlzcDogbGRvcyAkb3B0ZGlzcCwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZG9zX2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9zX2Rpc3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb3B0ZGlzcCkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZG9zLWluZGlyZWN0LWRpc3A6IGxkb3MgJG9wdGRpc3AoJGFiYXNlKSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZG9zX2luZGlyZWN0X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9zX2luZGlyZWN0X2Rpc3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRvcy1pbmRleC1kaXNwOiBsZG9zICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZG9zX2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9zX2luZGV4X2Rpc3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkb3MtaW5kaXJlY3QtaW5kZXgtZGlzcDogbGRvcyAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZG9zX2luZGlyZWN0X2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZG9zX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVVISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZGliLW9mZnNldDogbGRpYiAkb2Zmc2V0LCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaWJfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpYl9vZmZzZXQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vZmZzZXQpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRpYi1pbmRpcmVjdC1vZmZzZXQ6IGxkaWIgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaWJfaW5kaXJlY3Rfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpYl9pbmRpcmVjdF9vZmZzZXQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkaWItaW5kaXJlY3Q6IGxkaWIgKCRhYmFzZSksICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRpYl9pbmRpcmVjdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaWJfaW5kaXJlY3QuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkaWItaW5kaXJlY3QtaW5kZXg6IGxkaWIgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaWJfaW5kaXJlY3RfaW5kZXgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGliX2luZGlyZWN0X2luZGV4LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkaWItZGlzcDogbGRpYiAkb3B0ZGlzcCwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGliX2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGliX2Rpc3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkaWItaW5kaXJlY3QtZGlzcDogbGRpYiAkb3B0ZGlzcCgkYWJhc2UpLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaWJfaW5kaXJlY3RfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaWJfaW5kaXJlY3RfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkaWItaW5kZXgtZGlzcDogbGRpYiAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRpYl9pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpYl9pbmRleF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkaWItaW5kaXJlY3QtaW5kZXgtZGlzcDogbGRpYiAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGliX2luZGlyZWN0X2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGliX2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkaXMtb2Zmc2V0OiBsZGlzICRvZmZzZXQsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRpc19vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGlzX29mZnNldC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29mZnNldCkpOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZGlzLWluZGlyZWN0LW9mZnNldDogbGRpcyAkb2Zmc2V0KCRhYmFzZSksICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRpc19pbmRpcmVjdF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGlzX2luZGlyZWN0X29mZnNldC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRpcy1pbmRpcmVjdDogbGRpcyAoJGFiYXNlKSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGlzX2luZGlyZWN0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpc19pbmRpcmVjdC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfYWJhc2UpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRpcy1pbmRpcmVjdC1pbmRleDogbGRpcyAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRpc19pbmRpcmVjdF9pbmRleCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaXNfaW5kaXJlY3RfaW5kZXguZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRpcy1kaXNwOiBsZGlzICRvcHRkaXNwLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaXNfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaXNfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29wdGRpc3ApKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRpcy1pbmRpcmVjdC1kaXNwOiBsZGlzICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRpc19pbmRpcmVjdF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpc19pbmRpcmVjdF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRpcy1pbmRleC1kaXNwOiBsZGlzICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGlzX2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGlzX2luZGV4X2Rpc3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRpcy1pbmRpcmVjdC1pbmRleC1kaXNwOiBsZGlzICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkaXNfaW5kaXJlY3RfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaXNfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRsLW9mZnNldDogbGRsICRvZmZzZXQsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRsX29mZnNldCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkbF9vZmZzZXQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9kcmVnbm87CisgIFNJIHRtcF90ZW1wOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHRtcF90ZW1wID0gRkxEIChmX29mZnNldCk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZGwtaW5kaXJlY3Qtb2Zmc2V0OiBsZGwgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkbF9pbmRpcmVjdF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGxfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBTSSB0bXBfdGVtcDsKKyAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB0bXBfdGVtcCA9IEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkbC1pbmRpcmVjdDogbGRsICgkYWJhc2UpLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkbF9pbmRpcmVjdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkbF9pbmRpcmVjdC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSAqIEZMRCAoaV9hYmFzZSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZGwtaW5kaXJlY3QtaW5kZXg6IGxkbCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRsX2luZGlyZWN0X2luZGV4KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRsX2luZGlyZWN0X2luZGV4LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBTSSB0bXBfdGVtcDsKKyAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB0bXBfdGVtcCA9IEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpOworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRsLWRpc3A6IGxkbCAkb3B0ZGlzcCwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGxfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkbF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBTSSB0bXBfdGVtcDsKKyAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB0bXBfdGVtcCA9IEZMRCAoZl9vcHRkaXNwKTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkbC1pbmRpcmVjdC1kaXNwOiBsZGwgJG9wdGRpc3AoJGFiYXNlKSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGxfaW5kaXJlY3RfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkbF9pbmRpcmVjdF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBTSSB0bXBfdGVtcDsKKyAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB0bXBfdGVtcCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZGwtaW5kZXgtZGlzcDogbGRsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGxfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkbF9pbmRleF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBTSSB0bXBfdGVtcDsKKyAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB0bXBfdGVtcCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpOworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRsLWluZGlyZWN0LWluZGV4LWRpc3A6IGxkbCAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZGxfaW5kaXJlY3RfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkbF9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBTSSB0bXBfdGVtcDsKKyAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB0bXBfdGVtcCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkdC1vZmZzZXQ6IGxkdCAkb2Zmc2V0LCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkdF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHRfb2Zmc2V0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBTSSB0bXBfdGVtcDsKKyAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB0bXBfdGVtcCA9IEZMRCAoZl9vZmZzZXQpOworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTIiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGR0LWluZGlyZWN0LW9mZnNldDogbGR0ICRvZmZzZXQoJGFiYXNlKSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZHRfaW5kaXJlY3Rfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGR0X2luZGlyZWN0X29mZnNldC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgOCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMiIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZHQtaW5kaXJlY3Q6IGxkdCAoJGFiYXNlKSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZHRfaW5kaXJlY3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHRfaW5kaXJlY3QuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9kcmVnbm87CisgIFNJIHRtcF90ZW1wOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHRtcF90ZW1wID0gKiBGTEQgKGlfYWJhc2UpOworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTIiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGR0LWluZGlyZWN0LWluZGV4OiBsZHQgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkdF9pbmRpcmVjdF9pbmRleCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkdF9pbmRpcmVjdF9pbmRleC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkdC1kaXNwOiBsZHQgJG9wdGRpc3AsICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGR0X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHRfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBGTEQgKGZfb3B0ZGlzcCk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgOCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMiIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZHQtaW5kaXJlY3QtZGlzcDogbGR0ICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGR0X2luZGlyZWN0X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHRfaW5kaXJlY3RfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpOworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTIiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGR0LWluZGV4LWRpc3A6IGxkdCAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGR0X2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHRfaW5kZXhfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkdC1pbmRpcmVjdC1pbmRleC1kaXNwOiBsZHQgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0sICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGR0X2luZGlyZWN0X2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHRfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgOCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMiIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZHEtb2Zmc2V0OiBsZHEgJG9mZnNldCwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZHFfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRxX29mZnNldC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBGTEQgKGZfb2Zmc2V0KTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCAxMikpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZHEtaW5kaXJlY3Qtb2Zmc2V0OiBsZHEgJG9mZnNldCgkYWJhc2UpLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkcV9pbmRpcmVjdF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHFfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBTSSB0bXBfdGVtcDsKKyAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB0bXBfdGVtcCA9IEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCAxMikpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZHEtaW5kaXJlY3Q6IGxkcSAoJGFiYXNlKSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZHFfaW5kaXJlY3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHFfaW5kaXJlY3QuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9kcmVnbm87CisgIFNJIHRtcF90ZW1wOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHRtcF90ZW1wID0gKiBGTEQgKGlfYWJhc2UpOworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTIiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDEyKSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0zIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkcS1pbmRpcmVjdC1pbmRleDogbGRxICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZHFfaW5kaXJlY3RfaW5kZXgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHFfaW5kaXJlY3RfaW5kZXguZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9kcmVnbm87CisgIFNJIHRtcF90ZW1wOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHRtcF90ZW1wID0gQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgOCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMiIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgMTIpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTMiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRxLWRpc3A6IGxkcSAkb3B0ZGlzcCwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZHFfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcV9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBTSSB0bXBfdGVtcDsKKyAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB0bXBfdGVtcCA9IEZMRCAoZl9vcHRkaXNwKTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCAxMikpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZHEtaW5kaXJlY3QtZGlzcDogbGRxICRvcHRkaXNwKCRhYmFzZSksICRkc3QgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsbGRxX2luZGlyZWN0X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZHFfaW5kaXJlY3RfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX2RyZWdubzsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF9kcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgdG1wX3RlbXAgPSBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpOworICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfdGVtcCk7CisgICAgKiBGTEQgKGlfZHN0KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkc3QiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDQpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTEiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDgpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTIiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAodG1wX3RlbXAsIDEyKSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0zIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkcS1pbmRleC1kaXNwOiBsZHEgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGVdLCAkZHN0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGxkcV9pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRxX2luZGV4X2Rpc3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCitkbyB7CisgIFNJIHRtcF9kcmVnbm87CisgIFNJIHRtcF90ZW1wOworICB0bXBfZHJlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHRtcF90ZW1wID0gQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIHRtcF90ZW1wKTsKKyAgICAqIEZMRCAoaV9kc3QpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRzdCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgNCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgOCkpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMiIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICh0bXBfdGVtcCwgMTIpKTsKKyAgICBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItYWRkOi1WTS1pbmRleC1vZi1kc3QtY29uc3Q6LVdJLTMiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRxLWluZGlyZWN0LWluZGV4LWRpc3A6IGxkcSAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSwgJGRzdCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxsZHFfaW5kaXJlY3RfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkcV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfZHJlZ25vOworICBTSSB0bXBfdGVtcDsKKyAgdG1wX2RyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB0bXBfdGVtcCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKTsKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX3RlbXApOworICAgICogRkxEIChpX2RzdCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHN0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA0KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCA4KSk7CisgICAgQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLWFkZDotVk0taW5kZXgtb2YtZHN0LWNvbnN0Oi1XSS0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKHRtcF90ZW1wLCAxMikpOworICAgIENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci1hZGQ6LVZNLWluZGV4LW9mLWRzdC1jb25zdDotV0ktMyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdC1vZmZzZXQ6IHN0ICRzdF9zcmMsICRvZmZzZXQgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3Rfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3Rfb2Zmc2V0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vZmZzZXQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3QtaW5kaXJlY3Qtb2Zmc2V0OiBzdCAkc3Rfc3JjLCAkb2Zmc2V0KCRhYmFzZSkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RfaW5kaXJlY3Rfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfaW5kaXJlY3Rfb2Zmc2V0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0LWluZGlyZWN0OiBzdCAkc3Rfc3JjLCAoJGFiYXNlKSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdF9pbmRpcmVjdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0X2luZGlyZWN0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0LWluZGlyZWN0LWluZGV4OiBzdCAkc3Rfc3JjLCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RfaW5kaXJlY3RfaW5kZXgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9pbmRpcmVjdF9pbmRleC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0LWRpc3A6IHN0ICRzdF9zcmMsICRvcHRkaXNwICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0LWluZGlyZWN0LWRpc3A6IHN0ICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RfaW5kaXJlY3RfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0X2luZGlyZWN0X2Rpc3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0LWluZGV4LWRpc3A6IHN0ICRzdF9zcmMsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0X2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9pbmRleF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3QtaW5kaXJlY3QtaW5kZXgtZGlzcDogc3QgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RfaW5kaXJlY3RfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0X2luZGlyZWN0X2luZGV4X2Rpc3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3RvYi1vZmZzZXQ6IHN0b2IgJHN0X3NyYywgJG9mZnNldCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9iX29mZnNldCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0b2Jfb2Zmc2V0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vZmZzZXQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3RvYi1pbmRpcmVjdC1vZmZzZXQ6IHN0b2IgJHN0X3NyYywgJG9mZnNldCgkYWJhc2UpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0b2JfaW5kaXJlY3Rfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9pbmRpcmVjdF9vZmZzZXQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBRSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3RvYi1pbmRpcmVjdDogc3RvYiAkc3Rfc3JjLCAoJGFiYXNlKSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9iX2luZGlyZWN0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9pbmRpcmVjdC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFFJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9hYmFzZSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdG9iLWluZGlyZWN0LWluZGV4OiBzdG9iICRzdF9zcmMsICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9iX2luZGlyZWN0X2luZGV4KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9pbmRpcmVjdF9pbmRleC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFFJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0b2ItZGlzcDogc3RvYiAkc3Rfc3JjLCAkb3B0ZGlzcCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9iX2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9iX2Rpc3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBRSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29wdGRpc3ApLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3RvYi1pbmRpcmVjdC1kaXNwOiBzdG9iICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RvYl9pbmRpcmVjdF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9pbmRpcmVjdF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworICB7CisgICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdG9iLWluZGV4LWRpc3A6IHN0b2IgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RvYl9pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RvYl9pbmRleF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworICB7CisgICAgUUkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3RvYi1pbmRpcmVjdC1pbmRleC1kaXNwOiBzdG9iICRzdF9zcmMsICRvcHRkaXNwKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0b2JfaW5kaXJlY3RfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0b2JfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFFJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdG9zLW9mZnNldDogc3RvcyAkc3Rfc3JjLCAkb2Zmc2V0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0b3Nfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3Rvc19vZmZzZXQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBISSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29mZnNldCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdG9zLWluZGlyZWN0LW9mZnNldDogc3RvcyAkc3Rfc3JjLCAkb2Zmc2V0KCRhYmFzZSkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3Rvc19pbmRpcmVjdF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2luZGlyZWN0X29mZnNldC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdG9zLWluZGlyZWN0OiBzdG9zICRzdF9zcmMsICgkYWJhc2UpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0b3NfaW5kaXJlY3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2luZGlyZWN0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgSEkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0b3MtaW5kaXJlY3QtaW5kZXg6IHN0b3MgJHN0X3NyYywgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0b3NfaW5kaXJlY3RfaW5kZXgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2luZGlyZWN0X2luZGV4LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgSEkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3Rvcy1kaXNwOiBzdG9zICRzdF9zcmMsICRvcHRkaXNwICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0b3NfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0b3NfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb3B0ZGlzcCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdG9zLWluZGlyZWN0LWRpc3A6IHN0b3MgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9zX2luZGlyZWN0X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2luZGlyZWN0X2Rpc3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBISSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0b3MtaW5kZXgtZGlzcDogc3RvcyAkc3Rfc3JjLCAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdG9zX2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdG9zX2luZGV4X2Rpc3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBISSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdG9zLWluZGlyZWN0LWluZGV4LWRpc3A6IHN0b3MgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3Rvc19pbmRpcmVjdF9pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3Rvc19pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworICB7CisgICAgSEkgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0bC1vZmZzZXQ6IHN0bCAkc3Rfc3JjLCAkb2Zmc2V0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0bF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGxfb2Zmc2V0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfc3JlZ25vOworICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX29mZnNldCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0bC1pbmRpcmVjdC1vZmZzZXQ6IHN0bCAkc3Rfc3JjLCAkb2Zmc2V0KCRhYmFzZSkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RsX2luZGlyZWN0X29mZnNldCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0bF9pbmRpcmVjdF9vZmZzZXQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdGwtaW5kaXJlY3Q6IHN0bCAkc3Rfc3JjLCAoJGFiYXNlKSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdGxfaW5kaXJlY3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGxfaW5kaXJlY3QuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9hYmFzZSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdGwtaW5kaXJlY3QtaW5kZXg6IHN0bCAkc3Rfc3JjLCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RsX2luZGlyZWN0X2luZGV4KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RsX2luZGlyZWN0X2luZGV4LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfc3JlZ25vOworICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0bC1kaXNwOiBzdGwgJHN0X3NyYywgJG9wdGRpc3AgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RsX2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGxfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0bC1pbmRpcmVjdC1kaXNwOiBzdGwgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdGxfaW5kaXJlY3RfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0bF9pbmRpcmVjdF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfc3JlZ25vOworICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSksIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdGwtaW5kZXgtZGlzcDogc3RsICRzdF9zcmMsICRvcHRkaXNwWyRpbmRleCpTJHNjYWxlICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0bF9pbmRleF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RsX2luZGV4X2Rpc3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCA0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3RsLWluZGlyZWN0LWluZGV4LWRpc3A6IHN0bCAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdGxfaW5kaXJlY3RfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0bF9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfc3JlZ25vOworICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCA0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3R0LW9mZnNldDogc3R0ICRzdF9zcmMsICRvZmZzZXQgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3R0X29mZnNldCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0dF9vZmZzZXQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb2Zmc2V0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCA0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vZmZzZXQpLCA4KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3R0LWluZGlyZWN0LW9mZnNldDogc3R0ICRzdF9zcmMsICRvZmZzZXQoJGFiYXNlKSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHRfaW5kaXJlY3Rfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3R0X2luZGlyZWN0X29mZnNldC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIDgpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdHQtaW5kaXJlY3Q6IHN0dCAkc3Rfc3JjLCAoJGFiYXNlKSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHRfaW5kaXJlY3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHRfaW5kaXJlY3QuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9hYmFzZSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCA4KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3R0LWluZGlyZWN0LWluZGV4OiBzdHQgJHN0X3NyYywgKCRhYmFzZSlbJGluZGV4KlMkc2NhbGVdICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0dF9pbmRpcmVjdF9pbmRleCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0dF9pbmRpcmVjdF9pbmRleC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDgpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdHQtZGlzcDogc3R0ICRzdF9zcmMsICRvcHRkaXNwICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0dF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3R0X2Rpc3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBGTEQgKGZfb3B0ZGlzcCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCA4KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3R0LWluZGlyZWN0LWRpc3A6IHN0dCAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0dF9pbmRpcmVjdF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3R0X2luZGlyZWN0X2Rpc3AuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpLCA4KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3R0LWluZGV4LWRpc3A6IHN0dCAkc3Rfc3JjLCAkb3B0ZGlzcFskaW5kZXgqUyRzY2FsZSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHRfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0dF9pbmRleF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfc3JlZ25vOworICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDEpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgOCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0dC1pbmRpcmVjdC1pbmRleC1kaXNwOiBzdHQgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3R0X2luZGlyZWN0X2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHRfaW5kaXJlY3RfaW5kZXhfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSksIDgpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdHEtb2Zmc2V0OiBzdHEgJHN0X3NyYywgJG9mZnNldCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHFfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RxX29mZnNldC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vZmZzZXQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksIDgpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29mZnNldCksIDEyKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3RxLWluZGlyZWN0LW9mZnNldDogc3RxICRzdF9zcmMsICRvZmZzZXQoJGFiYXNlKSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHFfaW5kaXJlY3Rfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RxX2luZGlyZWN0X29mZnNldC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSksIDgpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vZmZzZXQpLCAqIEZMRCAoaV9hYmFzZSkpLCAxMiksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0cS1pbmRpcmVjdDogc3RxICRzdF9zcmMsICgkYWJhc2UpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHN0cV9pbmRpcmVjdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cV9pbmRpcmVjdC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX2FiYXNlKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIDgpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCAxMiksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0cS1pbmRpcmVjdC1pbmRleDogc3RxICRzdF9zcmMsICgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHFfaW5kaXJlY3RfaW5kZXgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHFfaW5kaXJlY3RfaW5kZXguZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF9zcmVnbm87CisgIHRtcF9zcmVnbm8gPSBGTEQgKGZfc3JjZHN0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3Rfc3JjKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCA0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCA4KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMykpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCAxMiksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0cS1kaXNwOiBzdHEgJHN0X3NyYywgJG9wdGRpc3AgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RxX2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHFfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEZMRCAoZl9vcHRkaXNwKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDIpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIDgpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoRkxEIChmX29wdGRpc3ApLCAxMiksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0cS1pbmRpcmVjdC1kaXNwOiBzdHEgJHN0X3NyYywgJG9wdGRpc3AoJGFiYXNlKSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHFfaW5kaXJlY3RfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cV9pbmRpcmVjdF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfc3JlZ25vOworICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMSkpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSksIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgKiBGTEQgKGlfYWJhc2UpKSwgOCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCAqIEZMRCAoaV9hYmFzZSkpLCAxMiksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0cS1pbmRleC1kaXNwOiBzdHEgJHN0X3NyYywgJG9wdGRpc3BbJGluZGV4KlMkc2NhbGUgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2Usc3RxX2luZGV4X2Rpc3ApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdHFfaW5kZXhfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX3NyZWdubzsKKyAgdG1wX3NyZWdubyA9IEZMRCAoZl9zcmNkc3QpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zdF9zcmMpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDQpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgyKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDgpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgzKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSksIDEyKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3RxLWluZGlyZWN0LWluZGV4LWRpc3A6IHN0cSAkc3Rfc3JjLCAkb3B0ZGlzcCgkYWJhc2UpWyRpbmRleCpTJHNjYWxlXSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxzdHFfaW5kaXJlY3RfaW5kZXhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0cV9pbmRpcmVjdF9pbmRleF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA4KTsKKworZG8geworICBTSSB0bXBfc3JlZ25vOworICB0bXBfc3JlZ25vID0gRkxEIChmX3NyY2RzdCk7CisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3N0X3NyYyk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKEZMRCAoZl9zcmNkc3QpKSArICgxKSldKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQUREU0kgKEZMRCAoZl9vcHRkaXNwKSwgQUREU0kgKCogRkxEIChpX2FiYXNlKSwgTVVMU0kgKCogRkxEIChpX2luZGV4KSwgU0xMU0kgKDEsIEZMRCAoZl9zY2FsZSkpKSkpLCA0KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChGTEQgKGZfc3JjZHN0KSkgKyAoMikpXSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKEFERFNJIChGTEQgKGZfb3B0ZGlzcCksIEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpKSwgOCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoRkxEIChmX3NyY2RzdCkpICsgKDMpKV0pOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChBRERTSSAoRkxEIChmX29wdGRpc3ApLCBBRERTSSAoKiBGTEQgKGlfYWJhc2UpLCBNVUxTSSAoKiBGTEQgKGlfaW5kZXgpLCBTTExTSSAoMSwgRkxEIChmX3NjYWxlKSkpKSksIDEyKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY21wb2JlLXJlZzogY21wb2JlICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wb2JlX3JlZykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX3JlZy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoRVFTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNtcG9iZS1saXQ6IGNtcG9iZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcG9iZV9saXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9saXQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKEVRU0kgKEZMRCAoZl9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY21wb2JuZS1yZWc6IGNtcG9ibmUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvYm5lX3JlZykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX3JlZy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoTkVTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNtcG9ibmUtbGl0OiBjbXBvYm5lICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wb2JuZV9saXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9iZV9saXQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKE5FU0kgKEZMRCAoZl9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY21wb2JsLXJlZzogY21wb2JsICRicl9zcmMxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wb2JsX3JlZykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JsX3JlZy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoTFRVU0kgKCogRkxEIChpX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBjbXBvYmwtbGl0OiBjbXBvYmwgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvYmxfbGl0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmxfbGl0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChMVFVTSSAoRkxEIChmX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBjbXBvYmxlLXJlZzogY21wb2JsZSAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcG9ibGVfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmxfcmVnLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChMRVVTSSAoKiBGTEQgKGlfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNtcG9ibGUtbGl0OiBjbXBvYmxlICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wb2JsZV9saXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9ibF9saXQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKExFVVNJIChGTEQgKGZfYnJfc3JjMSksICogRkxEIChpX2JyX3NyYzIpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNtcG9iZy1yZWc6IGNtcG9iZyAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcG9iZ19yZWcpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2NtcG9ibF9yZWcuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKEdUVVNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY21wb2JnLWxpdDogY21wb2JnICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wb2JnX2xpdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JsX2xpdC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoR1RVU0kgKEZMRCAoZl9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY21wb2JnZS1yZWc6IGNtcG9iZ2UgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvYmdlX3JlZykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JsX3JlZy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoR0VVU0kgKCogRkxEIChpX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBjbXBvYmdlLWxpdDogY21wb2JnZSAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcG9iZ2VfbGl0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmxfbGl0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChHRVVTSSAoRkxEIChmX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBjbXBpYmUtcmVnOiBjbXBpYmUgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpYmVfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfcmVnLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChFUVNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY21waWJlLWxpdDogY21waWJlICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21waWJlX2xpdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX2xpdC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoRVFTSSAoRkxEIChmX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBjbXBpYm5lLXJlZzogY21waWJuZSAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcGlibmVfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfcmVnLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY21waWJuZS1saXQ6IGNtcGlibmUgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpYm5lX2xpdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX2xpdC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoTkVTSSAoRkxEIChmX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBjbXBpYmwtcmVnOiBjbXBpYmwgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpYmxfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfcmVnLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChMVFNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY21waWJsLWxpdDogY21waWJsICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21waWJsX2xpdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX2xpdC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoTFRTSSAoRkxEIChmX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBjbXBpYmxlLXJlZzogY21waWJsZSAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcGlibGVfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfcmVnLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChMRVNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY21waWJsZS1saXQ6IGNtcGlibGUgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpYmxlX2xpdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX2xpdC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoTEVTSSAoRkxEIChmX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBjbXBpYmctcmVnOiBjbXBpYmcgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpYmdfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfcmVnLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChHVFNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY21waWJnLWxpdDogY21waWJnICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21waWJnX2xpdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX2xpdC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoR1RTSSAoRkxEIChmX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBjbXBpYmdlLXJlZzogY21waWJnZSAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcGliZ2VfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jbXBvYmVfcmVnLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChHRVNJICgqIEZMRCAoaV9icl9zcmMxKSwgKiBGTEQgKGlfYnJfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY21waWJnZS1saXQ6IGNtcGliZ2UgJGJyX2xpdDEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpYmdlX2xpdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfY21wb2JlX2xpdC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoR0VTSSAoRkxEIChmX2JyX3NyYzEpLCAqIEZMRCAoaV9icl9zcmMyKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9icl9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBiYmMtcmVnOiBiYmMgJGJyX3NyYzEsICRicl9zcmMyLCAkYnJfZGlzcCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxiYmNfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iYmNfcmVnLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChFUVNJIChBTkRTSSAoU0xMU0kgKDEsICogRkxEIChpX2JyX3NyYzEpKSwgKiBGTEQgKGlfYnJfc3JjMikpLCAwKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJiYy1saXQ6IGJiYyAkYnJfbGl0MSwgJGJyX3NyYzIsICRicl9kaXNwICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJiY19saXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JiY19saXQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKEVRU0kgKEFORFNJIChTTExTSSAoMSwgRkxEIChmX2JyX3NyYzEpKSwgKiBGTEQgKGlfYnJfc3JjMikpLCAwKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2JyX2Rpc3ApOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJicy1yZWc6IGJicyAkYnJfc3JjMSwgJGJyX3NyYzIsICRicl9kaXNwICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJic19yZWcpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JiY19yZWcuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKE5FU0kgKEFORFNJIChTTExTSSAoMSwgKiBGTEQgKGlfYnJfc3JjMSkpLCAqIEZMRCAoaV9icl9zcmMyKSksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYmJzLWxpdDogYmJzICRicl9saXQxLCAkYnJfc3JjMiwgJGJyX2Rpc3AgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYmJzX2xpdCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmJjX2xpdC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoTkVTSSAoQU5EU0kgKFNMTFNJICgxLCBGTEQgKGZfYnJfc3JjMSkpLCAqIEZMRCAoaV9icl9zcmMyKSksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfYnJfZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY21waTogY21waSAkc3JjMSwgJHNyYzIgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21waSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IChMVFNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpKSA/ICg0KSA6IChFUVNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpKSA/ICgyKSA6ICgxKTsKKyAgICBDUFUgKGhfY2MpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjLTAiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNtcGkxOiBjbXBpICRsaXQxLCAkc3JjMiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpMSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkxLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAoTFRTSSAoRkxEIChmX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSkpID8gKDQpIDogKEVRU0kgKEZMRCAoZl9zcmMxKSwgKiBGTEQgKGlfc3JjMikpKSA/ICgyKSA6ICgxKTsKKyAgICBDUFUgKGhfY2MpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjLTAiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNtcGkyOiBjbXBpICRzcmMxLCAkbGl0MiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpMikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkyLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAoTFRTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSkpID8gKDQpIDogKEVRU0kgKCogRkxEIChpX3NyYzEpLCBGTEQgKGZfc3JjMikpKSA/ICgyKSA6ICgxKTsKKyAgICBDUFUgKGhfY2MpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjLTAiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNtcGkzOiBjbXBpICRsaXQxLCAkbGl0MiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBpMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkzLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAoTFRTSSAoRkxEIChmX3NyYzEpLCBGTEQgKGZfc3JjMikpKSA/ICg0KSA6IChFUVNJIChGTEQgKGZfc3JjMSksIEZMRCAoZl9zcmMyKSkpID8gKDIpIDogKDEpOworICAgIENQVSAoaF9jYykgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2MtMCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY21wbzogY21wbyAkc3JjMSwgJHNyYzIgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wbykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcG8uZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IChMVFVTSSAoKiBGTEQgKGlfc3JjMSksICogRkxEIChpX3NyYzIpKSkgPyAoNCkgOiAoRVFTSSAoKiBGTEQgKGlfc3JjMSksICogRkxEIChpX3NyYzIpKSkgPyAoMikgOiAoMSk7CisgICAgQ1BVIChoX2NjKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjYy0wIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBjbXBvMTogY21wbyAkbGl0MSwgJHNyYzIgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY21wbzEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXBvMS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gKExUVVNJIChGTEQgKGZfc3JjMSksICogRkxEIChpX3NyYzIpKSkgPyAoNCkgOiAoRVFTSSAoRkxEIChmX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSkpID8gKDIpIDogKDEpOworICAgIENQVSAoaF9jYykgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY2MtMCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY21wbzI6IGNtcG8gJHNyYzEsICRsaXQyICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNtcG8yKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY21wbzIuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IChMVFVTSSAoKiBGTEQgKGlfc3JjMSksIEZMRCAoZl9zcmMyKSkpID8gKDQpIDogKEVRU0kgKCogRkxEIChpX3NyYzEpLCBGTEQgKGZfc3JjMikpKSA/ICgyKSA6ICgxKTsKKyAgICBDUFUgKGhfY2MpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjLTAiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNtcG8zOiBjbXBvICRsaXQxLCAkbGl0MiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxjbXBvMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcG8zLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAoTFRVU0kgKEZMRCAoZl9zcmMxKSwgRkxEIChmX3NyYzIpKSkgPyAoNCkgOiAoRVFTSSAoRkxEIChmX3NyYzEpLCBGTEQgKGZfc3JjMikpKSA/ICgyKSA6ICgxKTsKKyAgICBDUFUgKGhfY2MpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNjLTAiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHRlc3Ruby1yZWc6IHRlc3RubyAkYnJfc3JjMSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSx0ZXN0bm9fcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfdGVzdG5vX3JlZy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gRVFTSSAoQ1BVIChoX2NjKSwgMCk7CisgICAgKiBGTEQgKGlfYnJfc3JjMSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnJfc3JjMSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogdGVzdGctcmVnOiB0ZXN0ZyAkYnJfc3JjMSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSx0ZXN0Z19yZWcpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF90ZXN0bm9fcmVnLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgMSksIDApOworICAgICogRkxEIChpX2JyX3NyYzEpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImJyX3NyYzEiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHRlc3RlLXJlZzogdGVzdGUgJGJyX3NyYzEgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsdGVzdGVfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfdGVzdG5vX3JlZy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gTkVTSSAoQU5EU0kgKENQVSAoaF9jYyksIDIpLCAwKTsKKyAgICAqIEZMRCAoaV9icl9zcmMxKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJicl9zcmMxIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiB0ZXN0Z2UtcmVnOiB0ZXN0Z2UgJGJyX3NyYzEgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsdGVzdGdlX3JlZykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3Rlc3Rub19yZWcuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCAzKSwgMCk7CisgICAgKiBGTEQgKGlfYnJfc3JjMSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnJfc3JjMSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogdGVzdGwtcmVnOiB0ZXN0bCAkYnJfc3JjMSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSx0ZXN0bF9yZWcpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF90ZXN0bm9fcmVnLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgNCksIDApOworICAgICogRkxEIChpX2JyX3NyYzEpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImJyX3NyYzEiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHRlc3RuZS1yZWc6IHRlc3RuZSAkYnJfc3JjMSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSx0ZXN0bmVfcmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfdGVzdG5vX3JlZy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gTkVTSSAoQU5EU0kgKENQVSAoaF9jYyksIDUpLCAwKTsKKyAgICAqIEZMRCAoaV9icl9zcmMxKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJicl9zcmMxIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiB0ZXN0bGUtcmVnOiB0ZXN0bGUgJGJyX3NyYzEgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsdGVzdGxlX3JlZykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3Rlc3Rub19yZWcuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE5FU0kgKEFORFNJIChDUFUgKGhfY2MpLCA2KSwgMCk7CisgICAgKiBGTEQgKGlfYnJfc3JjMSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnJfc3JjMSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogdGVzdG8tcmVnOiB0ZXN0byAkYnJfc3JjMSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSx0ZXN0b19yZWcpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF90ZXN0bm9fcmVnLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgNyksIDApOworICAgICogRkxEIChpX2JyX3NyYzEpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImJyX3NyYzEiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJubzogYm5vICRjdHJsX2Rpc3AgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYm5vKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibm8uZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKEVRU0kgKENQVSAoaF9jYyksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfY3RybF9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBiZzogYmcgJGN0cmxfZGlzcCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxiZykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5vLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgMSksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfY3RybF9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBiZTogYmUgJGN0cmxfZGlzcCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxiZSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5vLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgMiksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfY3RybF9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBiZ2U6IGJnZSAkY3RybF9kaXNwICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJnZSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5vLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgMyksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfY3RybF9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBibDogYmwgJGN0cmxfZGlzcCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxibCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5vLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgNCksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfY3RybF9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBibmU6IGJuZSAkY3RybF9kaXNwICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJuZSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5vLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgNSksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfY3RybF9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBibGU6IGJsZSAkY3RybF9kaXNwICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGJsZSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5vLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgNiksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfY3RybF9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBibzogYm8gJGN0cmxfZGlzcCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxibykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYm5vLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJIChBTkRTSSAoQ1BVIChoX2NjKSwgNyksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfY3RybF9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBiOiBiICRjdHJsX2Rpc3AgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfY3RybF9kaXNwKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBieC1pbmRpcmVjdC1vZmZzZXQ6IGJ4ICRvZmZzZXQoJGFiYXNlKSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxieF9pbmRpcmVjdF9vZmZzZXQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2J4X2luZGlyZWN0X29mZnNldC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBVU0kgb3B2YWwgPSBBRERTSSAoRkxEIChmX29mZnNldCksICogRkxEIChpX2FiYXNlKSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBieC1pbmRpcmVjdDogYnggKCRhYmFzZSkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYnhfaW5kaXJlY3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2J4X2luZGlyZWN0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFVTSSBvcHZhbCA9ICogRkxEIChpX2FiYXNlKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJ4LWluZGlyZWN0LWluZGV4OiBieCAoJGFiYXNlKVskaW5kZXgqUyRzY2FsZV0gKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYnhfaW5kaXJlY3RfaW5kZXgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2J4X2luZGlyZWN0X2luZGV4LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFVTSSBvcHZhbCA9IEFERFNJICgqIEZMRCAoaV9hYmFzZSksIE1VTFNJICgqIEZMRCAoaV9pbmRleCksIFNMTFNJICgxLCBGTEQgKGZfc2NhbGUpKSkpOworICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYngtZGlzcDogYnggJG9wdGRpc3AgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsYnhfZGlzcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYnhfZGlzcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDgpOworCisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGZfb3B0ZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYngtaW5kaXJlY3QtZGlzcDogYnggJG9wdGRpc3AoJGFiYXNlKSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxieF9pbmRpcmVjdF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ieF9pbmRpcmVjdF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKKyAgeworICAgIFVTSSBvcHZhbCA9IEFERFNJIChGTEQgKGZfb3B0ZGlzcCksICogRkxEIChpX2FiYXNlKSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBjYWxseC1kaXNwOiBjYWxseCAkb3B0ZGlzcCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChpOTYwYmFzZSxjYWxseF9kaXNwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jYWxseF9kaXNwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgOCk7CisKK2RvIHsKKyAgU0kgdG1wX3RlbXA7CisgIHRtcF90ZW1wID0gQU5EU0kgKEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAxKV0pLCA2MyksIElOVlNJICg2MykpOworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDgpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDIpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMiIsICd4Jywgb3B2YWwpOworICB9CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDApLCBDUFUgKGhfZ3JbKChVSU5UKSAwKV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNCksIENQVSAoaF9nclsoKFVJTlQpIDEpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA4KSwgQ1BVIChoX2dyWygoVUlOVCkgMildKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDEyKSwgQ1BVIChoX2dyWygoVUlOVCkgMyldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDE2KSwgQ1BVIChoX2dyWygoVUlOVCkgNCldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDIwKSwgQ1BVIChoX2dyWygoVUlOVCkgNSldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDI0KSwgQ1BVIChoX2dyWygoVUlOVCkgNildKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDI4KSwgQ1BVIChoX2dyWygoVUlOVCkgNyldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDMyKSwgQ1BVIChoX2dyWygoVUlOVCkgOCldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDM2KSwgQ1BVIChoX2dyWygoVUlOVCkgOSldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQwKSwgQ1BVIChoX2dyWygoVUlOVCkgMTApXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0NCksIENQVSAoaF9nclsoKFVJTlQpIDExKV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNDgpLCBDUFUgKGhfZ3JbKChVSU5UKSAxMildKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDUyKSwgQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA1NiksIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNjApLCBDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSk7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGZfb3B0ZGlzcCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorQ1BVIChoX2dyWygoVUlOVCkgMCldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxKV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDIpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMyldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSA0KV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDUpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgNildKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSA3KV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDgpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgOSldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxMCldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxMSldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxMildKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IDB4ZGVhZGJlZWY7CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDMxKV0pOworICAgIENQVSAoaF9nclsoKFVJTlQpIDApXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IHRtcF90ZW1wOworICAgIENQVSAoaF9nclsoKFVJTlQpIDMxKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTMxIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKHRtcF90ZW1wLCA2NCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY2FsbHgtaW5kaXJlY3Q6IGNhbGx4ICgkYWJhc2UpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNhbGx4X2luZGlyZWN0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jYWxseF9pbmRpcmVjdC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIFNJIHRtcF90ZW1wOworICB0bXBfdGVtcCA9IEFORFNJIChBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMSldKSwgNjMpLCBJTlZTSSAoNjMpKTsKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKHBjLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAyKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTIiLCAneCcsIG9wdmFsKTsKKyAgfQorU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAwKSwgQ1BVIChoX2dyWygoVUlOVCkgMCldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQpLCBDUFUgKGhfZ3JbKChVSU5UKSAxKV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgOCksIENQVSAoaF9nclsoKFVJTlQpIDIpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAxMiksIENQVSAoaF9nclsoKFVJTlQpIDMpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAxNiksIENQVSAoaF9nclsoKFVJTlQpIDQpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAyMCksIENQVSAoaF9nclsoKFVJTlQpIDUpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAyNCksIENQVSAoaF9nclsoKFVJTlQpIDYpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAyOCksIENQVSAoaF9nclsoKFVJTlQpIDcpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAzMiksIENQVSAoaF9nclsoKFVJTlQpIDgpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAzNiksIENQVSAoaF9nclsoKFVJTlQpIDkpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0MCksIENQVSAoaF9nclsoKFVJTlQpIDEwKV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNDQpLCBDUFUgKGhfZ3JbKChVSU5UKSAxMSldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQ4KSwgQ1BVIChoX2dyWygoVUlOVCkgMTIpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA1MiksIENQVSAoaF9nclsoKFVJTlQpIDEzKV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNTYpLCBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDYwKSwgQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkpOworICB7CisgICAgVVNJIG9wdmFsID0gKiBGTEQgKGlfYWJhc2UpOworICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorQ1BVIChoX2dyWygoVUlOVCkgMCldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxKV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDIpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMyldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSA0KV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDUpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgNildKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSA3KV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDgpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgOSldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxMCldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxMSldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxMildKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAxNSldKSA9IDB4ZGVhZGJlZWY7CisgIHsKKyAgICBTSSBvcHZhbCA9IENQVSAoaF9nclsoKFVJTlQpIDMxKV0pOworICAgIENQVSAoaF9nclsoKFVJTlQpIDApXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IHRtcF90ZW1wOworICAgIENQVSAoaF9nclsoKFVJTlQpIDMxKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTMxIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKHRtcF90ZW1wLCA2NCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY2FsbHgtaW5kaXJlY3Qtb2Zmc2V0OiBjYWxseCAkb2Zmc2V0KCRhYmFzZSkgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsY2FsbHhfaW5kaXJlY3Rfb2Zmc2V0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jYWxseF9pbmRpcmVjdF9vZmZzZXQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICBTSSB0bXBfdGVtcDsKKyAgdG1wX3RlbXAgPSBBTkRTSSAoQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDEpXSksIDYzKSwgSU5WU0kgKDYzKSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJIChwYywgNCk7CisgICAgQ1BVIChoX2dyWygoVUlOVCkgMildKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0yIiwgJ3gnLCBvcHZhbCk7CisgIH0KK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMCksIENQVSAoaF9nclsoKFVJTlQpIDApXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0KSwgQ1BVIChoX2dyWygoVUlOVCkgMSldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDgpLCBDUFUgKGhfZ3JbKChVSU5UKSAyKV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMTIpLCBDUFUgKGhfZ3JbKChVSU5UKSAzKV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMTYpLCBDUFUgKGhfZ3JbKChVSU5UKSA0KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMjApLCBDUFUgKGhfZ3JbKChVSU5UKSA1KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMjQpLCBDUFUgKGhfZ3JbKChVSU5UKSA2KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMjgpLCBDUFUgKGhfZ3JbKChVSU5UKSA3KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMzIpLCBDUFUgKGhfZ3JbKChVSU5UKSA4KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMzYpLCBDUFUgKGhfZ3JbKChVSU5UKSA5KV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNDApLCBDUFUgKGhfZ3JbKChVSU5UKSAxMCldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQ0KSwgQ1BVIChoX2dyWygoVUlOVCkgMTEpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0OCksIENQVSAoaF9nclsoKFVJTlQpIDEyKV0pKTsKK1NFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNTIpLCBDUFUgKGhfZ3JbKChVSU5UKSAxMyldKSk7CitTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDU2KSwgQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkpOworU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA2MCksIENQVSAoaF9nclsoKFVJTlQpIDE1KV0pKTsKKyAgeworICAgIFVTSSBvcHZhbCA9IEFERFNJIChGTEQgKGZfb2Zmc2V0KSwgKiBGTEQgKGlfYWJhc2UpKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK0NQVSAoaF9nclsoKFVJTlQpIDApXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMSldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSAyKV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDMpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgNCldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSA1KV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDYpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgNyldKSA9IDB4ZGVhZGJlZWY7CitDUFUgKGhfZ3JbKChVSU5UKSA4KV0pID0gMHhkZWFkYmVlZjsKK0NQVSAoaF9nclsoKFVJTlQpIDkpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMTApXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMTEpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMTIpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMTQpXSkgPSAweGRlYWRiZWVmOworQ1BVIChoX2dyWygoVUlOVCkgMTUpXSkgPSAweGRlYWRiZWVmOworICB7CisgICAgU0kgb3B2YWwgPSBDUFUgKGhfZ3JbKChVSU5UKSAzMSldKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAwKV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTAiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSB0bXBfdGVtcDsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0zMSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJICh0bXBfdGVtcCwgNjQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDEpXSkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZ3ItMSIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHJldDogcmV0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLHJldCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfcmV0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMCldKTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0zMSIsICd4Jywgb3B2YWwpOworICB9CitDUFUgKGhfZ3JbKChVSU5UKSAwKV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAwKSk7CitDUFUgKGhfZ3JbKChVSU5UKSAxKV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0KSk7CitDUFUgKGhfZ3JbKChVSU5UKSAyKV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA4KSk7CitDUFUgKGhfZ3JbKChVSU5UKSAzKV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAxMikpOworQ1BVIChoX2dyWygoVUlOVCkgNCldKSA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMTYpKTsKK0NQVSAoaF9nclsoKFVJTlQpIDUpXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDIwKSk7CitDUFUgKGhfZ3JbKChVSU5UKSA2KV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAyNCkpOworQ1BVIChoX2dyWygoVUlOVCkgNyldKSA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgMjgpKTsKK0NQVSAoaF9nclsoKFVJTlQpIDgpXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDMyKSk7CitDUFUgKGhfZ3JbKChVSU5UKSA5KV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCAzNikpOworQ1BVIChoX2dyWygoVUlOVCkgMTApXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDQwKSk7CitDUFUgKGhfZ3JbKChVSU5UKSAxMSldKSA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNDQpKTsKK0NQVSAoaF9nclsoKFVJTlQpIDEyKV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA0OCkpOworQ1BVIChoX2dyWygoVUlOVCkgMTMpXSkgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoQ1BVIChoX2dyWygoVUlOVCkgMzEpXSksIDUyKSk7CitDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJIChDUFUgKGhfZ3JbKChVSU5UKSAzMSldKSwgNTYpKTsKK0NQVSAoaF9nclsoKFVJTlQpIDE1KV0pID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKENQVSAoaF9nclsoKFVJTlQpIDMxKV0pLCA2MCkpOworICB7CisgICAgVVNJIG9wdmFsID0gQ1BVIChoX2dyWygoVUlOVCkgMildKTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogY2FsbHM6IGNhbGxzICRzcmMxICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGNhbGxzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9jYWxscy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IGk5NjBfdHJhcCAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcmMxKSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBmbWFyazogZm1hcmsgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAoaTk2MGJhc2UsZm1hcmspIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2ZtYXJrLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gaTk2MF9icmVha3BvaW50IChjdXJyZW50X2NwdSwgcGMpOworICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogZmx1c2hyZWc6IGZsdXNocmVnICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKGk5NjBiYXNlLGZsdXNocmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZmx1c2hyZWcuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7IH0gd2hpbGUgKDApOyAvKm5vcCovCisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKwpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvc2ltLWlmLmMgYi9zaW0vaTk2MC9zaW0taWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTU4NTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2k5NjAvc2ltLWlmLmMKQEAgLTAsMCArMSwzMTEgQEAKKy8qIE1haW4gc2ltdWxhdG9yIGVudHJ5IHBvaW50cyBmb3IgdGhlIGk5NjAuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaW5jbHVkZSAic2ltLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJkaXMtYXNtLmgiCisKK3N0YXRpYyB2b2lkIGZyZWVfc3RhdGUgKFNJTV9ERVNDKTsKKworLyogU2luY2Ugd2UgZG9uJ3QgYnVpbGQgdGhlIGNnZW4tb3Bjb2RlIHRhYmxlLCB3ZSB1c2UgdGhlIG9sZAorICAgZGlzYXNzZW1ibGVyLiAgKi8KK3N0YXRpYyBDR0VOX0RJU0FTU0VNQkxFUiBpOTYwX2Rpc2Fzc2VtYmxlX2luc247CisKKy8qIFJlY29yZHMgc2ltdWxhdG9yIGRlc2NyaXB0b3Igc28gdXRpbGl0aWVzIGxpa2UgbTMycl9kdW1wX3JlZ3MgY2FuIGJlCisgICBjYWxsZWQgZnJvbSBnZGIuICAqLworU0lNX0RFU0MgY3VycmVudF9zdGF0ZTsKKwwKKy8qIENvdmVyIGZ1bmN0aW9uIG9mIHNpbV9zdGF0ZV9mcmVlIHRvIGZyZWUgdGhlIGNwdSBidWZmZXJzIGFzIHdlbGwuICAqLworCitzdGF0aWMgdm9pZAorZnJlZV9zdGF0ZSAoU0lNX0RFU0Mgc2QpCit7CisgIGlmIChTVEFURV9NT0RVTEVTIChzZCkgIT0gTlVMTCkKKyAgICBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoc2QpOworICBzaW1fY3B1X2ZyZWVfYWxsIChzZCk7CisgIHNpbV9zdGF0ZV9mcmVlIChzZCk7Cit9CisKKy8qIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgc2ltdWxhdG9yLiAgKi8KKworU0lNX0RFU0MKK3NpbV9vcGVuIChraW5kLCBjYWxsYmFjaywgYWJmZCwgYXJndikKKyAgICAgU0lNX09QRU5fS0lORCBraW5kOworICAgICBob3N0X2NhbGxiYWNrICpjYWxsYmFjazsKKyAgICAgc3RydWN0IF9iZmQgKmFiZmQ7CisgICAgIGNoYXIgKiphcmd2OworeworICBjaGFyIGM7CisgIGludCBpOworICBTSU1fREVTQyBzZCA9IHNpbV9zdGF0ZV9hbGxvYyAoa2luZCwgY2FsbGJhY2spOworCisgIC8qIFRoZSBjcHUgZGF0YSBpcyBrZXB0IGluIGEgc2VwYXJhdGVseSBhbGxvY2F0ZWQgY2h1bmsgb2YgbWVtb3J5LiAgKi8KKyAgaWYgKHNpbV9jcHVfYWxsb2NfYWxsIChzZCwgMSwgY2dlbl9jcHVfbWF4X2V4dHJhX2J5dGVzICgpKSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgZnJlZV9zdGF0ZSAoc2QpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisjaWYgMCAvKiBGSVhNRTogcGMgaXMgaW4gbWFjaC1zcGVjaWZpYyBzdHJ1Y3QgKi8KKyAgLyogRklYTUU6IHdhdGNocG9pbnRzIGNvZGUgc2hvdWxkbid0IG5lZWQgdGhpcyAqLworICB7CisgICAgU0lNX0NQVSAqY3VycmVudF9jcHUgPSBTVEFURV9DUFUgKHNkLCAwKTsKKyAgICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5wYyA9ICYoUEMpOworICAgIFNUQVRFX1dBVENIUE9JTlRTIChzZCktPnNpemVvZl9wYyA9IHNpemVvZiAoUEMpOworICB9CisjZW5kaWYKKworICBpZiAoc2ltX3ByZV9hcmd2X2luaXQgKHNkLCBhcmd2WzBdKSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgZnJlZV9zdGF0ZSAoc2QpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisjaWYgMCAvKiBGSVhNRTogJ3R3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGRvIHRoaXMgKi8KKyAgLyogVGhlc2Ugb3B0aW9ucyBvdmVycmlkZSBhbnkgbW9kdWxlIG9wdGlvbnMuCisgICAgIE9idmlvdXNseSBhbWJpZ3VpdHkgc2hvdWxkIGJlIGF2b2lkZWQsIGhvd2V2ZXIgdGhlIGNhbGxlciBtYXkgd2lzaCB0bworICAgICBhdWdtZW50IHRoZSBtZWFuaW5nIG9mIGFuIG9wdGlvbi4gICovCisgIGlmIChleHRyYV9vcHRpb25zICE9IE5VTEwpCisgICAgc2ltX2FkZF9vcHRpb25fdGFibGUgKHNkLCBleHRyYV9vcHRpb25zKTsKKyNlbmRpZgorCisgIC8qIGdldG9wdCB3aWxsIHByaW50IHRoZSBlcnJvciBtZXNzYWdlIHNvIHdlIGp1c3QgaGF2ZSB0byBleGl0IGlmIHRoaXMgZmFpbHMuCisgICAgIEZJWE1FOiBIbW1tLi4uICBpbiB0aGUgY2FzZSBvZiBnZGIgd2UgbmVlZCBnZXRvcHQgdG8gY2FsbAorICAgICBwcmludF9maWx0ZXJlZC4gICovCisgIGlmIChzaW1fcGFyc2VfYXJncyAoc2QsIGFyZ3YpICE9IFNJTV9SQ19PSykKKyAgICB7CisgICAgICBmcmVlX3N0YXRlIChzZCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogQWxsb2NhdGUgYSBoYW5kbGVyIGZvciB0aGUgY29udHJvbCByZWdpc3RlcnMgYW5kIG90aGVyIGRldmljZXMKKyAgICAgaWYgbm8gbWVtb3J5IGZvciB0aGF0IHJhbmdlIGhhcyBiZWVuIGFsbG9jYXRlZCBieSB0aGUgdXNlci4KKyAgICAgQWxsIGFyZSBhbGxvY2F0ZWQgaW4gb25lIGNodW5rIHRvIGtlZXAgdGhpbmdzIGZyb20gYmVpbmcKKyAgICAgdW5uZWNlc3NhcmlseSBjb21wbGljYXRlZC4gICovCisgIGlmIChzaW1fY29yZV9yZWFkX2J1ZmZlciAoc2QsIE5VTEwsIHJlYWRfbWFwLCAmYywgSTk2MF9ERVZJQ0VfQUREUiwgMSkgPT0gMCkKKyAgICBzaW1fY29yZV9hdHRhY2ggKHNkLCBOVUxMLAorCQkgICAgIDAgLypsZXZlbCovLAorCQkgICAgIGFjY2Vzc19yZWFkX3dyaXRlLAorCQkgICAgIDAgLypzcGFjZSA/Pz8qLywKKwkJICAgICBJOTYwX0RFVklDRV9BRERSLCBJOTYwX0RFVklDRV9MRU4gLypucl9ieXRlcyovLAorCQkgICAgIDAgLyptb2R1bG8qLywKKwkJICAgICAmaTk2MF9kZXZpY2VzLAorCQkgICAgIE5VTEwgLypidWZmZXIqLyk7CisKKyAgLyogQWxsb2NhdGUgY29yZSBtYW5hZ2VkIG1lbW9yeSBpZiBub25lIHNwZWNpZmllZCBieSB1c2VyLgorICAgICBVc2UgYWRkcmVzcyA0IGhlcmUgaW4gY2FzZSB0aGUgdXNlciB3YW50ZWQgYWRkcmVzcyAwIHVubWFwcGVkLiAgKi8KKyAgaWYgKHNpbV9jb3JlX3JlYWRfYnVmZmVyIChzZCwgTlVMTCwgcmVhZF9tYXAsICZjLCA0LCAxKSA9PSAwKQorICAgIC8qID8/PyB3aWxzb24gKi8KKyAgICBzaW1fZG9fY29tbWFuZGYgKHNkLCAibWVtb3J5IHJlZ2lvbiAweCVseCwweCVseCIsIEk5NjBfREVGQVVMVF9NRU1fU1RBUlQsCisJCSAgICAgSTk2MF9ERUZBVUxUX01FTV9TSVpFKTsKKworICAvKiBjaGVjayBmb3IvZXN0YWJsaXNoIHRoZSByZWZlcmVuY2UgcHJvZ3JhbSBpbWFnZSAqLworICBpZiAoc2ltX2FuYWx5emVfcHJvZ3JhbSAoc2QsCisJCQkgICAoU1RBVEVfUFJPR19BUkdWIChzZCkgIT0gTlVMTAorCQkJICAgID8gKlNUQVRFX1BST0dfQVJHViAoc2QpCisJCQkgICAgOiBOVUxMKSwKKwkJCSAgIGFiZmQpICE9IFNJTV9SQ19PSykKKyAgICB7CisgICAgICBmcmVlX3N0YXRlIChzZCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogRXN0YWJsaXNoIGFueSByZW1haW5pbmcgY29uZmlndXJhdGlvbiBvcHRpb25zLiAgKi8KKyAgaWYgKHNpbV9jb25maWcgKHNkKSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgZnJlZV9zdGF0ZSAoc2QpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChzaW1fcG9zdF9hcmd2X2luaXQgKHNkKSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgZnJlZV9zdGF0ZSAoc2QpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIE9wZW4gYSBjb3B5IG9mIHRoZSBjcHUgZGVzY3JpcHRvciB0YWJsZS4gICovCisgIHsKKyAgICBDR0VOX0NQVV9ERVNDIGNkID0gaTk2MF9jZ2VuX2NwdV9vcGVuIChTVEFURV9BUkNISVRFQ1RVUkUgKHNkKS0+bWFjaCwKKwkJCQkJICAgQ0dFTl9FTkRJQU5fTElUVExFKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1BST0NFU1NPUlM7ICsraSkKKyAgICAgIHsKKwlTSU1fQ1BVICpjcHUgPSBTVEFURV9DUFUgKHNkLCBpKTsKKwlDUFVfQ1BVX0RFU0MgKGNwdSkgPSBjZDsKKwlDUFVfRElTQVNTRU1CTEVSIChjcHUpID0gaTk2MF9kaXNhc3NlbWJsZV9pbnNuOworICAgICAgfQorICB9CisKKyAgLyogSW5pdGlhbGl6ZSB2YXJpb3VzIGNnZW4gdGhpbmdzIG5vdCBkb25lIGJ5IGNvbW1vbiBmcmFtZXdvcmsuCisgICAgIE11c3QgYmUgZG9uZSBhZnRlciBtMzJyX2NnZW5fY3B1X29wZW4uICAqLworICBjZ2VuX2luaXQgKHNkKTsKKworICAvKiBTdG9yZSBpbiBhIGdsb2JhbCBzbyB0aGluZ3MgbGlrZSBzcGFyYzMyX2R1bXBfcmVncyBjYW4gYmUgaW52b2tlZAorICAgICBmcm9tIHRoZSBnZGIgY29tbWFuZCBsaW5lLiAgKi8KKyAgY3VycmVudF9zdGF0ZSA9IHNkOworCisgIHJldHVybiBzZDsKK30KKwordm9pZAorc2ltX2Nsb3NlIChzZCwgcXVpdHRpbmcpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgcXVpdHRpbmc7Cit7CisgIGk5NjBfY2dlbl9jcHVfY2xvc2UgKENQVV9DUFVfREVTQyAoU1RBVEVfQ1BVIChzZCwgMCkpKTsKKyAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKK30KKwwKK1NJTV9SQworc2ltX2NyZWF0ZV9pbmZlcmlvciAoc2QsIGFiZmQsIGFyZ3YsIGVudnApCisgICAgIFNJTV9ERVNDIHNkOworICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKKyAgICAgY2hhciAqKmFyZ3Y7CisgICAgIGNoYXIgKiplbnZwOworeworICBTSU1fQ1BVICpjdXJyZW50X2NwdSA9IFNUQVRFX0NQVSAoc2QsIDApOworICBTSU1fQUREUiBhZGRyOworCisgIGlmIChhYmZkICE9IE5VTEwpCisgICAgYWRkciA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CisgIGVsc2UKKyAgICBhZGRyID0gMDsKKyAgc2ltX3BjX3NldCAoY3VycmVudF9jcHUsIGFkZHIpOworCisjaWYgMAorICBTVEFURV9BUkdWIChzZCkgPSBzaW1fY29weV9hcmd2IChhcmd2KTsKKyAgU1RBVEVfRU5WUCAoc2QpID0gc2ltX2NvcHlfYXJndiAoZW52cCk7CisjZW5kaWYKKworICByZXR1cm4gU0lNX1JDX09LOworfQorCisjaWYgMAoraW50CitzaW1fc3RvcCAoU0lNX0RFU0Mgc2QpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChzZCktPm1hY2gpCisgICAgeworICAgIGNhc2UgYmZkX21hY2hfaTk2MF9rYV9zYSA6CisgICAgICByZXR1cm4gaTk2MGJhc2VfZW5naW5lX3N0b3AgKHNkLCBOVUxMLCBOVUxMX0NJQSwgc2ltX3N0b3BwZWQsIFNJTV9TSUdJTlQpOworICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBUaGlzIGlzbid0IHBhcnQgb2YgdGhlIG9mZmljaWFsIGludGVyZmFjZS4KKyAgIFRoaXMgaXMganVzdCBhIGdvb2QgcGxhY2UgdG8gcHV0IHRoaXMgZm9yIG5vdy4gICovCisKK3ZvaWQKK3NpbV9zeW5jX3N0b3AgKFNJTV9ERVNDIHNkLCBTSU1fQ1BVICpjcHUsIFBDQUREUiBwYywgZW51bSBzaW1fc3RvcCByZWFzb24sIGludCBzaWdyYykKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKHNkKS0+bWFjaCkKKyAgICB7CisgICAgY2FzZSBiZmRfbWFjaF9pOTYwX2thX3NhIDoKKyAgICAgICh2b2lkKSBpOTYwYmFzZV9lbmdpbmVfc3RvcCAoc2QsIGNwdSwgcGMsIHJlYXNvbiwgc2lncmMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKK3ZvaWQKK3NpbV9yZXN1bWUgKHNkLCBzdGVwLCBzaWdnbmFsKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgaW50IHN0ZXAsIHNpZ2duYWw7Cit7CisgIHNpbV9tb2R1bGVfcmVzdW1lIChzZCk7CisKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKHNkKS0+bWFjaCkKKyAgICB7CisgICAgY2FzZSBiZmRfbWFjaF9pOTYwX2thX3NhIDoKKyAgICAgIGk5NjBiYXNlX2VuZ2luZV9ydW4gKHNkLCBzdGVwLCBzaWdnbmFsKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorCisgIHNpbV9tb2R1bGVfc3VzcGVuZCAoc2QpOworfQorI2VuZGlmCisKKy8qIFRoZSBjb250ZW50cyBvZiBCVUYgYXJlIGluIHRhcmdldCBieXRlIG9yZGVyLiAgKi8KKworaW50CitzaW1fZmV0Y2hfcmVnaXN0ZXIgKHNkLCBybiwgYnVmLCBsZW5ndGgpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgcm47CisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgU0lNX0NQVSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgMCk7CisKKyAgcmV0dXJuICgqIENQVV9SRUdfRkVUQ0ggKGNwdSkpIChjcHUsIHJuLCBidWYsIGxlbmd0aCk7Cit9CisgCisvKiBUaGUgY29udGVudHMgb2YgQlVGIGFyZSBpbiB0YXJnZXQgYnl0ZSBvcmRlci4gICovCisKK2ludAorc2ltX3N0b3JlX3JlZ2lzdGVyIChzZCwgcm4sIGJ1ZiwgbGVuZ3RoKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgaW50IHJuOworICAgICB1bnNpZ25lZCBjaGFyICpidWY7CisgICAgIGludCBsZW5ndGg7Cit7CisgIFNJTV9DUFUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIDApOworCisgIHJldHVybiAoKiBDUFVfUkVHX1NUT1JFIChjcHUpKSAoY3B1LCBybiwgYnVmLCBsZW5ndGgpOworfQorCit2b2lkCitzaW1fZG9fY29tbWFuZCAoc2QsIGNtZCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGNoYXIgKmNtZDsKK3sgCisgIGlmIChzaW1fYXJnc19jb21tYW5kIChzZCwgY21kKSAhPSBTSU1fUkNfT0spCisgICAgc2ltX2lvX2VwcmludGYgKHNkLCAiVW5rbm93biBjb21tYW5kIGAlcydcbiIsIGNtZCk7Cit9CisMCisvKiBEaXNhc3NlbWJsZSBhbiBpbnN0cnVjdGlvbi4gICovCisKK3N0YXRpYyB2b2lkCitpOTYwX2Rpc2Fzc2VtYmxlX2luc24gKFNJTV9DUFUgKmNwdSwgY29uc3QgQ0dFTl9JTlNOICppbnNuLAorCQkgICAgICAgY29uc3QgQVJHQlVGICphYnVmLCBJQUREUiBwYywgY2hhciAqYnVmKQoreworICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyBkaXNhc21faW5mbzsKKyAgU0ZJTEUgc2ZpbGU7CisgIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjcHUpOworICBpbnQgaW5zbl9sZW5ndGggPSBDR0VOX0lOU05fQklUU0laRSAoaW5zbikgLyA4OworCisgIHNmaWxlLmJ1ZmZlciA9IHNmaWxlLmN1cnJlbnQgPSBidWY7CisgIElOSVRfRElTQVNTRU1CTEVfSU5GTyAoZGlzYXNtX2luZm8sIChGSUxFICopICZzZmlsZSwKKwkJCSAoZnByaW50Zl9mdHlwZSkgc2ltX2Rpc2FzbV9zcHJpbnRmKTsKKyAgZGlzYXNtX2luZm8uZW5kaWFuID0KKyAgICAoYmZkX2JpZ19lbmRpYW4gKFNUQVRFX1BST0dfQkZEIChzZCkpID8gQkZEX0VORElBTl9CSUcKKyAgICAgOiBiZmRfbGl0dGxlX2VuZGlhbiAoU1RBVEVfUFJPR19CRkQgKHNkKSkgPyBCRkRfRU5ESUFOX0xJVFRMRQorICAgICA6IEJGRF9FTkRJQU5fVU5LTk9XTik7CisgIGRpc2FzbV9pbmZvLnJlYWRfbWVtb3J5X2Z1bmMgPSBzaW1fZGlzYXNtX3JlYWRfbWVtb3J5OworICBkaXNhc21faW5mby5tZW1vcnlfZXJyb3JfZnVuYyA9IHNpbV9kaXNhc21fcGVycm9yX21lbW9yeTsKKyAgZGlzYXNtX2luZm8uYXBwbGljYXRpb25fZGF0YSA9IChQVFIpIGNwdTsKKworICBwcmludF9pbnNuX2k5NjAgKHBjLCAmZGlzYXNtX2luZm8pOworfQpkaWZmIC0tZ2l0IGEvc2ltL2k5NjAvc2ltLW1haW4uaCBiL3NpbS9pOTYwL3NpbS1tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhYzVmYwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9pOTYwL3NpbS1tYWluLmgKQEAgLTAsMCArMSw2OSBAQAorLyogTWFpbiBoZWFkZXIgZm9yIHRoZSBpOTYwLiAgKi8KKworI2RlZmluZSBVU0lOR19TSU1fQkFTRV9IIC8qIEZJWE1FOiBxdWljayBoYWNrICovCisKK3N0cnVjdCBfc2ltX2NwdTsgLyogRklYTUU6IHNob3VsZCBiZSBpbiBzaW0tYmFzaWNzLmggKi8KK3R5cGVkZWYgc3RydWN0IF9zaW1fY3B1IFNJTV9DUFU7CisKKyNpbmNsdWRlICJzeW1jYXQuaCIKKyNpbmNsdWRlICJzaW0tYmFzaWNzLmgiCisjaW5jbHVkZSAiY2dlbi10eXBlcy5oIgorI2luY2x1ZGUgImk5NjAtZGVzYy5oIgorI2luY2x1ZGUgImk5NjAtb3BjLmgiCisjaW5jbHVkZSAiYXJjaC5oIgorCisvKiBUaGVzZSBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIHNpbS1iYXNlLmguICAqLwordHlwZWRlZiBVU0kgc2ltX2NpYTsKKyNkZWZpbmUgQ0lBX0dFVChjcHUpICAgICAwIC8qIEZJWE1FOihDUFVfQ0dFTl9IVyAoY3B1KS0+aF9wYykgKi8KKyNkZWZpbmUgQ0lBX1NFVChjcHUsdmFsKSAwIC8qIEZJWE1FOihDUFVfQ0dFTl9IVyAoY3B1KS0+aF9wYyA9ICh2YWwpKSAqLworCisvKiBGSVhNRTogU2hvdWxkbid0IGJlIHJlcXVpcmVkIHRvIGRlZmluZSB0aGVzZSB0aGlzIGVhcmx5LiAgKi8KKyNkZWZpbmUgU0lNX0VOR0lORV9IQUxUX0hPT0soU0QsIExBU1RfQ1BVLCBDSUEpCisjZGVmaW5lIFNJTV9FTkdJTkVfUkVTVEFSVF9IT09LKFNELCBMQVNUX0NQVSwgQ0lBKQorCisjaW5jbHVkZSAic2ltLWJhc2UuaCIKKyNpbmNsdWRlICJjZ2VuLXNpbS5oIgorI2luY2x1ZGUgImk5NjAtc2ltLmgiCisMCisvKiBUaGUgX3NpbV9jcHUgc3RydWN0LiAgKi8KKworc3RydWN0IF9zaW1fY3B1IHsKKyAgc2ltX2NwdV9iYXNlIGJhc2U7CisKKyAgLyogU3RhdGljIHBhcnRzIG9mIGNnZW4uICAqLworICBDR0VOX0NQVSBjZ2VuX2NwdTsKKworICAvKiBDUFUgc3BlY2lmaWMgcGFydHMgZ28gaGVyZS4KKyAgICAgTm90ZSB0aGF0IGluIGZpbGVzIHRoYXQgZG9uJ3QgbmVlZCB0byBhY2Nlc3MgdGhlc2UgcGllY2VzIFdBTlRfQ1BVX0ZPTworICAgICB3b24ndCBiZSBkZWZpbmVkIGFuZCB0aHVzIHRoZXNlIHBhcnRzIHdvbid0IGFwcGVhci4gIFRoaXMgaXMgb2suCisgICAgIE9uZSBoYXMgdG8gb2YgY291cnNlIGJlIGNhcmVmdWwgdG8gbm90IHRha2UgdGhlIHNpemUgb2YgdGhpcworICAgICBzdHJ1Y3QgYW5kIG5vIHN0cnVjdHVyZSBtZW1iZXJzIGFjY2Vzc2VkIGluIG5vbi1jcHUgc3BlY2lmaWMgZmlsZXMgY2FuCisgICAgIGdvIGFmdGVyIGhlcmUuICAqLworI2lmIGRlZmluZWQgKFdBTlRfQ1BVX0k5NjBCQVNFKQorICBJOTYwQkFTRV9DUFVfREFUQSBjcHVfZGF0YTsKKyNlbmRpZgorfTsKKwwKKy8qIFRoZSBzaW1fc3RhdGUgc3RydWN0LiAgKi8KKworc3RydWN0IHNpbV9zdGF0ZSB7CisgIHNpbV9jcHUgKmNwdTsKKyNkZWZpbmUgU1RBVEVfQ1BVKHNkLCBuKSAoLyomKi8gKHNkKS0+Y3B1KQorCisgIENHRU5fU1RBVEUgY2dlbl9zdGF0ZTsKKworICBzaW1fc3RhdGVfYmFzZSBiYXNlOworfTsKKwwKKy8qIE1pc2MuICAqLworCisvKiBDYXRjaCBhZGRyZXNzIGV4Y2VwdGlvbnMuICAqLworZXh0ZXJuIFNJTV9DT1JFX1NJR05BTF9GTiBpOTYwX2NvcmVfc2lnbmFsOworI2RlZmluZSBTSU1fQ09SRV9TSUdOQUwoU0QsQ1BVLENJQSxNQVAsTlJfQllURVMsQUREUixUUkFOU0ZFUixFUlJPUikgXAoraTk2MF9jb3JlX3NpZ25hbCAoKFNEKSwgKENQVSksIChDSUEpLCAoTUFQKSwgKE5SX0JZVEVTKSwgKEFERFIpLCBcCisJCSAgKFRSQU5TRkVSKSwgKEVSUk9SKSkKKworLyogRGVmYXVsdCBtZW1vcnkgc2l6ZS4gICovCisvKiBUaGlzIHZhbHVlIGNvbWVzIGZyb20gdGhlIGxpYmdsb3NzL2k5NjAvbW9uOTYwLmxkIGxpbmtlciBzY3JpcHQuICAqLworI2RlZmluZSBJOTYwX0RFRkFVTFRfTUVNX1NUQVJUIDB4YTAwMDgwMDAKKyNkZWZpbmUgSTk2MF9ERUZBVUxUX01FTV9TSVpFIDB4ODAwMDAwIC8qIDhNICovCmRpZmYgLS1naXQgYS9zaW0vaTk2MC90Y29uZmlnLmluIGIvc2ltL2k5NjAvdGNvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWNmNDU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2k5NjAvdGNvbmZpZy5pbgpAQCAtMCwwICsxLDQ5IEBACisvKiBJOTYwIHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuICAtKi0gQyAtKi0gKi8KKworLyogU2VlIHNpbS1obG9hZC5jLiAgV2UgcHJvcGVybHkgaGFuZGxlIExNQS4gICovCisjZGVmaW5lIFNJTV9IQU5ETEVTX0xNQSAxCisKKy8qIEZvciBNU1BSIHN1cHBvcnQuICBGSVhNRTogcmV2aXNpdC4gICovCisjZGVmaW5lIFdJVEhfREVWSUNFUyAxCisKKy8qIEZJWE1FOiBSZXZpc2l0LiAgKi8KKyNpZmRlZiBIQVZFX0RWX1NPQ0tTRVIKK01PRFVMRV9JTlNUQUxMX0ZOIGR2X3NvY2tzZXJfaW5zdGFsbDsKKyNkZWZpbmUgTU9EVUxFX0xJU1QgZHZfc29ja3Nlcl9pbnN0YWxsLAorI2VuZGlmCisKKyNpZiAwCisvKiBFbmFibGUgd2F0Y2hwb2ludHMuICAqLworI2RlZmluZSBXSVRIX1dBVENIUE9JTlRTIDEKKyNlbmRpZgorCisvKiA/Pz8gVGVtcG9yYXJ5IGhhY2sgdW50aWwgbW9kZWwgc3VwcG9ydCB1bmlmaWVkLiAgKi8KKyNkZWZpbmUgU0lNX0hBVkVfTU9ERUwKKworLyogRGVmaW5lIHRoaXMgdG8gZW5hYmxlIHRoZSBpbnRyaW5zaWMgYnJlYWtwb2ludCBtZWNoYW5pc20uICovCisvKiBGSVhNRTogbWF5IGJlIGFibGUgdG8gcmVtb3ZlIFNJTV9IQVZFX0JSRUFLUE9JTlQgc2luY2UgaXQgZXNzZW50aWFsbHkKKyAgIGR1cGxpY2F0ZXMgaWZkZWYgU0lNX0JSRUFLUE9JTlQgKHJpZ2h0PykgKi8KKyNpZiAwCisjZGVmaW5lIFNJTV9IQVZFX0JSRUFLUE9JTlRTCisjZGVmaW5lIFNJTV9CUkVBS1BPSU5UIHsgMHgxMCwgMHhmMSB9CisjZGVmaW5lIFNJTV9CUkVBS1BPSU5UX1NJWkUgMgorI2VuZGlmCisKKy8qIFRoaXMgaXMgYSBnbG9iYWwgc2V0dGluZy4gIERpZmZlcmVudCBjcHUgZmFtaWxpZXMgY2FuJ3QgbWl4LW4tbWF0Y2ggLXNjYWNoZQorICAgYW5kIC1wYmIuICBIb3dldmVyIHNvbWUgY3B1IGZhbWlsaWVzIG1heSB1c2UgLXNpbXBsZSB3aGlsZSBvdGhlcnMgdXNlCisgICBvbmUgb2YgLXNjYWNoZS8tcGJiLiAgKi8KKyNkZWZpbmUgV0lUSF9TQ0FDSEVfUEJCIDEKKworI2lmIDAKKy8qID8/PyBUaGlzIHdhcyBvYnNvbGV0ZWQgYnkgdGhlIFBCQiBjb2RlLiAgKi8KKy8qIFRoZSBzZW1hbnRpYyBjb2RlIHNob3VsZCBwcm9iYWJseSBhbHdheXMgdXNlIGEgc3dpdGNoKCkuCisgICBIb3dldmVyLCBpbiBjYXNlIHRoYXQncyBub3QgcG9zc2libGUgaW4gc29tZSBjaXJjdW1zdGFuY2UsIHdlIGFsbG93CisgICB0aGUgdGFyZ2V0IHRvIGNob29zZS4gIFBlcmhhcHMgdGhpcyBjYW4gYmUgYXV0b2NvbmYnZCBvbiB3aGV0aGVyIHRoZQorICAgc3dpdGNoIGlzIHRvbyBiaWc/ICBJIGNhbid0ICh5ZXQpIHRoaW5rIG9mIGEgcmVhc29uIGZvciBhbGxvd2luZyB0aGUKKyAgIHVzZXIgdG8gY2hvb3NlLCB0aG91Z2ggdGhlIGRldmVsb3BlciBtYXkgY2VydGFpbmx5IHdpc2ggdG8uICAqLworI2lmZGVmIFdBTlRfQ1BVX0k5NjBCQVNFCisjZGVmaW5lIFdJVEhfRkFTVCAxCisjZGVmaW5lIFdJVEhfU0VNX1NXSVRDSF9GVUxMIDAKKyNkZWZpbmUgV0lUSF9TRU1fU1dJVENIX0ZBU1QgMQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9pOTYwL3RyYXBzLmMgYi9zaW0vaTk2MC90cmFwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjJjYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaTk2MC90cmFwcy5jCkBAIC0wLDAgKzEsMjEzIEBACisvKiBpOTYwIGV4Y2VwdGlvbiwgaW50ZXJydXB0LCBhbmQgdHJhcCAoRUlUKSBzdXBwb3J0CisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2luY2x1ZGUgInRhcmctdmFscy5oIgorCisvKiBUaGUgc2VtYW50aWMgY29kZSBpbnZva2VzIHRoaXMgZm9yIGlsbGVnYWwgKHVucmVjb2duaXplZCkgaW5zdHJ1Y3Rpb25zLiAgKi8KKwordm9pZAorc2ltX2VuZ2luZV9pbnZhbGlkX2luc24gKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBJQUREUiBjaWEpCit7CisgIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjdXJyZW50X2NwdSk7CisKKyNpZiAwCisgIGlmIChTVEFURV9FTlZJUk9OTUVOVCAoc2QpID09IE9QRVJBVElOR19FTlZJUk9OTUVOVCkKKyAgICB7CisgICAgICBoX2JzbV9zZXQgKGN1cnJlbnRfY3B1LCBoX3NtX2dldCAoY3VycmVudF9jcHUpKTsKKyAgICAgIGhfYmllX3NldCAoY3VycmVudF9jcHUsIGhfaWVfZ2V0IChjdXJyZW50X2NwdSkpOworICAgICAgaF9iY29uZF9zZXQgKGN1cnJlbnRfY3B1LCBoX2NvbmRfZ2V0IChjdXJyZW50X2NwdSkpOworICAgICAgLyogc20gbm90IGNoYW5nZWQgKi8KKyAgICAgIGhfaWVfc2V0IChjdXJyZW50X2NwdSwgMCk7CisgICAgICBoX2NvbmRfc2V0IChjdXJyZW50X2NwdSwgMCk7CisKKyAgICAgIGhfYnBjX3NldCAoY3VycmVudF9jcHUsIGNpYSk7CisKKyAgICAgIHNpbV9lbmdpbmVfcmVzdGFydCAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSksIGN1cnJlbnRfY3B1LCBOVUxMLAorCQkJICBFSVRfUlNWRF9JTlNOX0FERFIpOworICAgIH0KKyAgZWxzZQorI2VuZGlmCisgICAgc2ltX2VuZ2luZV9oYWx0IChzZCwgY3VycmVudF9jcHUsIE5VTEwsIGNpYSwgc2ltX3N0b3BwZWQsIFNJTV9TSUdJTEwpOworfQorCisvKiBQcm9jZXNzIGFuIGFkZHJlc3MgZXhjZXB0aW9uLiAgKi8KKwordm9pZAoraTk2MF9jb3JlX3NpZ25hbCAoU0lNX0RFU0Mgc2QsIFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBzaW1fY2lhIGNpYSwKKwkJICB1bnNpZ25lZCBpbnQgbWFwLCBpbnQgbnJfYnl0ZXMsIGFkZHJlc3Nfd29yZCBhZGRyLAorCQkgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXIsIHNpbV9jb3JlX3NpZ25hbHMgc2lnKQoreworI2lmIDAKKyAgaWYgKFNUQVRFX0VOVklST05NRU5UIChzZCkgPT0gT1BFUkFUSU5HX0VOVklST05NRU5UKQorICAgIHsKKyAgICAgIGhfYnNtX3NldCAoY3VycmVudF9jcHUsIGhfc21fZ2V0IChjdXJyZW50X2NwdSkpOworICAgICAgaF9iaWVfc2V0IChjdXJyZW50X2NwdSwgaF9pZV9nZXQgKGN1cnJlbnRfY3B1KSk7CisgICAgICBoX2Jjb25kX3NldCAoY3VycmVudF9jcHUsIGhfY29uZF9nZXQgKGN1cnJlbnRfY3B1KSk7CisgICAgICAvKiBzbSBub3QgY2hhbmdlZCAqLworICAgICAgaF9pZV9zZXQgKGN1cnJlbnRfY3B1LCAwKTsKKyAgICAgIGhfY29uZF9zZXQgKGN1cnJlbnRfY3B1LCAwKTsKKworICAgICAgaF9icGNfc2V0IChjdXJyZW50X2NwdSwgY2lhKTsKKworICAgICAgc2ltX2VuZ2luZV9yZXN0YXJ0IChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSwgY3VycmVudF9jcHUsIE5VTEwsCisJCQkgIEVJVF9BRERSX0VYQ1BfQUREUik7CisgICAgfQorICBlbHNlCisjZW5kaWYKKyAgICBzaW1fY29yZV9zaWduYWwgKHNkLCBjdXJyZW50X2NwdSwgY2lhLCBtYXAsIG5yX2J5dGVzLCBhZGRyLAorCQkgICAgIHRyYW5zZmVyLCBzaWcpOworfQorDAorLyogUmVhZC93cml0ZSBmdW5jdGlvbnMgZm9yIHN5c3RlbSBjYWxsIGludGVyZmFjZS4gICovCisKK3N0YXRpYyBpbnQKK3N5c2NhbGxfcmVhZF9tZW0gKGhvc3RfY2FsbGJhY2sgKmNiLCBzdHJ1Y3QgY2Jfc3lzY2FsbCAqc2MsCisJCSAgdW5zaWduZWQgbG9uZyB0YWRkciwgY2hhciAqYnVmLCBpbnQgYnl0ZXMpCit7CisgIFNJTV9ERVNDIHNkID0gKFNJTV9ERVNDKSBzYy0+cDE7CisgIFNJTV9DUFUgKmNwdSA9IChTSU1fQ1BVICopIHNjLT5wMjsKKworICByZXR1cm4gc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLCBjcHUsIHJlYWRfbWFwLCBidWYsIHRhZGRyLCBieXRlcyk7Cit9CisKK3N0YXRpYyBpbnQKK3N5c2NhbGxfd3JpdGVfbWVtIChob3N0X2NhbGxiYWNrICpjYiwgc3RydWN0IGNiX3N5c2NhbGwgKnNjLAorCQkgICB1bnNpZ25lZCBsb25nIHRhZGRyLCBjb25zdCBjaGFyICpidWYsIGludCBieXRlcykKK3sKKyAgU0lNX0RFU0Mgc2QgPSAoU0lNX0RFU0MpIHNjLT5wMTsKKyAgU0lNX0NQVSAqY3B1ID0gKFNJTV9DUFUgKikgc2MtPnAyOworCisgIHJldHVybiBzaW1fY29yZV93cml0ZV9idWZmZXIgKHNkLCBjcHUsIHdyaXRlX21hcCwgYnVmLCB0YWRkciwgYnl0ZXMpOworfQorCisvKiBUcmFwIHN1cHBvcnQuCisgICBUaGUgcmVzdWx0IGlzIHRoZSBwYyBhZGRyZXNzIHRvIGNvbnRpbnVlIGF0LgorICAgUHJlcHJvY2Vzc2luZyBsaWtlIHNhdmluZyB0aGUgdmFyaW91cyByZWdpc3RlcnMgaGFzIGFscmVhZHkgYmVlbiBkb25lLiAgKi8KKworVVNJCitpOTYwX3RyYXAgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBQQ0FERFIgcGMsIGludCBudW0pCit7CisgIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjdXJyZW50X2NwdSk7CisgIGhvc3RfY2FsbGJhY2sgKmNiID0gU1RBVEVfQ0FMTEJBQ0sgKHNkKTsKKworI2lmZGVmIFNJTV9IQVZFX0JSRUFLUE9JTlRTCisgIC8qIENoZWNrIGZvciBicmVha3BvaW50cyAib3duZWQiIGJ5IHRoZSBzaW11bGF0b3IgZmlyc3QsIHJlZ2FyZGxlc3MKKyAgICAgb2YgLS1lbnZpcm9ubWVudC4gICovCisgIGlmIChudW0gPT0gVFJBUF9CUkVBS1BPSU5UKQorICAgIHsKKyAgICAgIC8qIEZpcnN0IHRyeSBzaW0tYnJlYWsuYy4gIElmIGl0J3MgYSBicmVha3BvaW50IHRoZSBzaW11bGF0b3IgIm93bnMiCisJIGl0IGRvZXNuJ3QgcmV0dXJuLiAgT3RoZXJ3aXNlIGl0IHJldHVybnMgYW5kIGxldCdzIHVzIHRyeS4gICovCisgICAgICBzaW1faGFuZGxlX2JyZWFrcG9pbnQgKHNkLCBjdXJyZW50X2NwdSwgcGMpOworICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyAgICB9CisjZW5kaWYKKworI2lmIDAKKyAgLyogPz8/IHdpbHNvbiwgZG9uJ3Qga25vdyB3aGF0IHRoaXMgZG9lcy4gICovCisgIGlmIChTVEFURV9FTlZJUk9OTUVOVCAoc2QpID09IE9QRVJBVElOR19FTlZJUk9OTUVOVCkKKyAgICB7CisgICAgICAvKiBUaGUgbmV3IHBjIGlzIHRoZSB0cmFwIHZlY3RvciBlbnRyeS4KKwkgV2UgYXNzdW1lIHRoZXJlJ3MgYSBicmFuY2ggdGhlcmUgdG8gc29tZSBoYW5kbGVyLiAgKi8KKyAgICAgIFVTSSBuZXdfcGMgPSBFSVRfVFJBUF9CQVNFX0FERFIgKyBudW0gKiA0OworICAgICAgcmV0dXJuIG5ld19wYzsKKyAgICB9CisjZW5kaWYKKworICBzd2l0Y2ggKG51bSkKKyAgICB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIFRSQVBfU1lTQ0FMTCA6CisgICAgICB7CisJQ0JfU1lTQ0FMTCBzOworCisJQ0JfU1lTQ0FMTF9JTklUICgmcyk7CisJcy5mdW5jID0gbnVtOworCXMuYXJnMSA9IGFfaTk2MF9oX2dyX2dldCAoY3VycmVudF9jcHUsIDE2KTsKKwlzLmFyZzIgPSBhX2k5NjBfaF9ncl9nZXQgKGN1cnJlbnRfY3B1LCAxNyk7CisJcy5hcmczID0gYV9pOTYwX2hfZ3JfZ2V0IChjdXJyZW50X2NwdSwgMTgpOworCisJaWYgKHMuZnVuYyA9PSBUQVJHRVRfU1lTX2V4aXQpCisJICB7CisJICAgIHNpbV9lbmdpbmVfaGFsdCAoc2QsIGN1cnJlbnRfY3B1LCBOVUxMLCBwYywgc2ltX2V4aXRlZCwgcy5hcmcxKTsKKwkgIH0KKworCXMucDEgPSAoUFRSKSBzZDsKKwlzLnAyID0gKFBUUikgY3VycmVudF9jcHU7CisJcy5yZWFkX21lbSA9IHN5c2NhbGxfcmVhZF9tZW07CisJcy53cml0ZV9tZW0gPSBzeXNjYWxsX3dyaXRlX21lbTsKKwljYl9zeXNjYWxsIChjYiwgJnMpOworCS8qID8/PyBUaGlzIHN0dWZmIGlzIHByb2JhYmx5IHdyb25nLCBidXQgbGliZ2xvc3MgZG9lc24ndCBsb29rIGF0CisJICAgdGhlc2UgdmFsdWVzLCBzbyBpdCBzaG91bGRuJ3QgbWF0dGVyLiAgKi8KKwlhX2k5NjBfaF9ncl9zZXQgKGN1cnJlbnRfY3B1LCAxOCwgcy5lcnJjb2RlKTsKKwlhX2k5NjBfaF9ncl9zZXQgKGN1cnJlbnRfY3B1LCAxNiwgcy5yZXN1bHQpOworCWFfaTk2MF9oX2dyX3NldCAoY3VycmVudF9jcHUsIDE3LCBzLnJlc3VsdDIpOworCWJyZWFrOworICAgICAgfQorCisgICAgY2FzZSBUUkFQX0JSRUFLUE9JTlQ6CisgICAgICBzaW1fZW5naW5lX2hhbHQgKHNkLCBjdXJyZW50X2NwdSwgTlVMTCwgTlVMTF9DSUEsCisJCSAgICAgICBzaW1fc3RvcHBlZCwgU0lNX1NJR1RSQVApOworICAgICAgYnJlYWs7CisKKyNpZiAwCisgICAgICAvKiA/Pz8gd2lsc29uLCBkb24ndCBrbm93IHdoYXQgdGhpcyBkb2VzLiAgKi8KKyAgICBkZWZhdWx0IDoKKyAgICAgIHsKKwlVU0kgbmV3X3BjID0gRUlUX1RSQVBfQkFTRV9BRERSICsgbnVtICogNDsKKwlyZXR1cm4gbmV3X3BjOworICAgICAgfQorI2VuZGlmCisgICAgfQorCisgIC8qIEZha2UgYW4gInJ0ZSIgaW5zbi4gICovCisgIC8qIEZJWE1FOiBTaG91bGQgZHVwbGljYXRlIGFsbCBvZiBydGUgcHJvY2Vzc2luZy4gICovCisgIHJldHVybiAocGMgJiAtNCkgKyA0OworfQorCisvKiBCcmVha3BvaW50IHN1cHBvcnQuCisgICBUaGUgcmVzdWx0IGlzIHRoZSBwYyBhZGRyZXNzIHRvIGNvbnRpbnVlIGF0LiAgKi8KKy8qID8/PyBUaGlzIGlzIGFuIGVkaXR0ZWQgY29weSBvZiB0aGUgYWJvdmUuICAqLworCitVU0kKK2k5NjBfYnJlYWtwb2ludCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFBDQUREUiBwYykKK3sKKyAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KTsKKyAgaG9zdF9jYWxsYmFjayAqY2IgPSBTVEFURV9DQUxMQkFDSyAoc2QpOworCisjaWZkZWYgU0lNX0hBVkVfQlJFQUtQT0lOVFMKKyAgLyogQ2hlY2sgZm9yIGJyZWFrcG9pbnRzICJvd25lZCIgYnkgdGhlIHNpbXVsYXRvciBmaXJzdCwgcmVnYXJkbGVzcworICAgICBvZiAtLWVudmlyb25tZW50LiAgKi8KKyAgaWYgKG51bSA9PSBUUkFQX0JSRUFLUE9JTlQpCisgICAgeworICAgICAgLyogRmlyc3QgdHJ5IHNpbS1icmVhay5jLiAgSWYgaXQncyBhIGJyZWFrcG9pbnQgdGhlIHNpbXVsYXRvciAib3ducyIKKwkgaXQgZG9lc24ndCByZXR1cm4uICBPdGhlcndpc2UgaXQgcmV0dXJucyBhbmQgbGV0J3MgdXMgdHJ5LiAgKi8KKyAgICAgIHNpbV9oYW5kbGVfYnJlYWtwb2ludCAoc2QsIGN1cnJlbnRfY3B1LCBwYyk7CisgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworICAgIH0KKyNlbmRpZgorCisgIHNpbV9lbmdpbmVfaGFsdCAoc2QsIGN1cnJlbnRfY3B1LCBOVUxMLCBOVUxMX0NJQSwKKwkJICAgc2ltX3N0b3BwZWQsIFNJTV9TSUdUUkFQKTsKKworICAvKiBGYWtlIGFuICJydGUiIGluc24uICAqLworICAvKiBGSVhNRTogU2hvdWxkIGR1cGxpY2F0ZSBhbGwgb2YgcnRlIHByb2Nlc3NpbmcuICAqLworICByZXR1cm4gKHBjICYgLTQpICsgNDsKK30KZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL0NoYW5nZUxvZyBiL3NpbS9pZ2VuL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2JhMTUwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2lnZW4vQ2hhbmdlTG9nCkBAIC0wLDAgKzEsOTk4IEBACitGcmkgRGVjICA0IDE1OjE0OjA5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaWdlbi5jIChtYWluKTogRml4IC1QaXRhYmxlPS4KKworCSogZ2VuLWVuZ2luZS5jIChwcmludF9ydW5fYm9keSk6IFByZWZpeCBpbnN0cnVjdGlvbl9hZGRyZXNzLgorCitXZWQgT2N0IDI4IDE4OjEyOjQzIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFNJTV9XQVJOSU5HUyk6IFVwZGF0ZSB0byBtYXRjaCAuLi9jb21tb24vYWNsb2NhbC5tNAorIAljaGFuZ2VzLgorCitXZWQgQXVnIDEyIDEwOjU1OjI4IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2V4dHJhY3Rpb24pOiAjdW5kZWYgYSBnZW5lcmF0ZWQKKyAJc3ltYm9sIGJlZm9yZSAjZGVmaW5lJ2luZyBpdCwgdG8gcmVtb3ZlIGNvbmZsaWN0IHdpdGggc3lzdGVtCisgCW1hY3Jvcy4KKworV2VkIEp1bCAyOSAxMDowNzoyNyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdlbi5jIChnZW5fZW50cnlfZXhwYW5kX29wY29kZSk6IEZvciBjb25kaXRpb25hbCwgZmllbGRzLiAgRml4CisgCXRoZSBleHRyYWN0aW9uIG9mIHRoZSB2YWx1ZSBmcm9tIGl0cyBzb3VyY2UgLSBib3RoIHRhYmxlIGFuZCBiaXQKKyAJY2FzZXMgd2VyZSB3cm9uZy4KKworVHVlIEp1bCAyOCAxMToxOTo0MyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGxkLWluc24uYyAocGFyc2VfaW5zbl93b3JkKTogRm9yIGNvbnN0YW50IGNvbmRpdGlvbmFsIHN0cmluZ3MsCisgCWVuY29kZSB0aGVpciBiaXQgdmFsdWUuCisKKwkqIGxkLWluc24uYyAocGFyc2VfaW5zbl93b3JkLCBwYXJzZV9pbnNuX3dvcmRzKTogQWxsb3cgY29uZGl0aW9uYWwKKyAJb3BlcmFuZHMgdG8gcmVmZXIgdG8gZmllbGRzIGluIGVhcmxpZXIgaW5zdHJ1Y3Rpb24gd29yZHMuCisKKwkqIGdlbi5jIChzdWJfdmFsKTogUmVwbGFjZSBmaWVsZCBhcmd1bWVudCB3aXRoIHZhbF9sYXN0X3Bvcy4KKwkoZ2VuX2VudHJ5X2V4cGFuZF9vcGNvZGUpOiBMb29rIGluIHByZXZpb3VzIHRhYmxlcyBmb3IgYSB2YWx1ZSBmb3IKKyAJYSBjb25kaXRpb25hbCBmaWVsZCBhcyB3ZWxsIGFzIHRoZSBiaXRzIGZyb20gdGhlIGN1cnJlbnQgdGFibGUuCisJKGluc25fbGlzdF9pbnNlcnQpOiBBZGQgc29ydCBrZXkgb2YgaW5zdHJ1Y3Rpb25zIHdoZXJlCisgCXRoZWlyIG9wZXJhbmQgZmllbGRzIGhhdmUgZGlmZmVyZW50IGNvbmRpdGlvbmFscy4KKwkoaW5zbl9maWVsZF9jbXApOiBOZXcgZnVuY3Rpb24uCisJCitTdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitTdW4gQXByIDI2IDE1OjIwOjA4IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogYWNjb25maWcuaDogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KKworRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworRnJpIEFwciAyNCAxMToxOTozMyAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBzaW5jbHVkZS4KKworRnJpIEFwciAyNCAxOTo0NTowMCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2V4dHJhY3Rpb24pOiBEbyBub3QgdHlwZSBjYXN0CisgCXBvaW50ZXJzLgorCQorCSogbGQtaW5zbi5jIChsb2FkX2luc25fdGFibGUpOiBUZXJtaW5hdGUgZXJyb3Igd2l0aCBOTC4KKworCSogZ2VuLmMgKGluc25zX2JpdF91c2VsZXNzKTogUGVyZm9ybSB1bnNpZ25lZCBiaXQgY29tcGFyaXNvbnMuCisKKwkqIGZpbHRlci5jIChpc19maWx0ZXJlZF9vdXQsIGZpbHRlcl9wYXJzZSk6IFBhY2lmeSBHQ0MsIGxlbiBpcworIAl1bnNpZ25lZC4KKworV2VkIEFwciAyMiAxNDoyNzozOSAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWNvbmZpZ3VyZSB0byBwaWNrIHVwIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMKKwl0byBzdXBwcmVzcyBpbmxpbmluZyBieSBkZWZhdWx0LgorCitUdWUgQXByIDIxIDAxOjM3OjU0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfZXh0cmFjdGlvbik6IFdoZW4gZ2VuZXJhdGluZyAjZGVmaW5lCisgCWZvcmNlIHRoZSBleHByZXNzaW9uIHRvIHRoZSBjb3JyZWN0IHR5cGUuCisKK1RodSBBcHIgMTYgMDg6NTA6MjkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBtaXNjLmMgKG5hbWUyaSk6IHN0cmxlbiByZXR1cm5zIGFuIHVuc2lnbmVkLgorCitUdWUgQXByIDE0IDE5OjA0OjI4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaWdlbi5oIChzdHJ1Y3QgaWdlbl93YXJuX29wdGlvbnMpOiBBZGQgdW5pbXBsZW1lbnRlZCBvcHRpb24uCisJKiBpZ2VuLmMgKG1haW4pOiBVcGRhdGUKKworCSogbGQtaW5zbi5jIChsb2FkX2luc25fdGFibGUpOiBSZXBvcnQgdW5pbXBsZW1lbnRlZCBmdW5jdGlvbnMuCisKK1R1ZSBBcHIgMTQgMTA6NTc6MjYgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBsZC1pbnNuLmMgKHBhcnNlX2luc25fd29yZCk6IFRyZWF0IGAhJyBhbmQgYD0nIGFzIHZhbGlkCisgCXNlcGFyYXRvciB0b2tlbnMgd2hlbiBwYXJzaW5nIGEgY29uZGl0aW9uYWwuCisKKwkqIGlnZW4uaCAobWFpbik6IEFkZCBvcHRpb24gLVMgc28gdGhhdCBzdWZmaXggY2FuIGJlIHNwZWNpZmllZC4KKworVHVlIEFwciAxNCAwODo0NDo1MyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGlnZW4uaCAoc3RydWN0IGlnZW5fdHJhY2Vfb3B0aW9ucyk6IEFkZCBtZW1iZXJzIGluc25fZXhwYW5zaW9uCisgCWFuZCBpbnNuX2luc2VydGlvbi4KKworCSogaWdlbi5jIChtYWluKTogQWRkIG9wdGlvbnMgLUd0cmFjZS1pbnNuLWV4cGFuc2lvbiwKKyAJLUd0cmFjZS1pbnNuLWluc2VydGlvbiBhbmQgLUd0cmFjZS1hbGwuCisKKwkqIGdlbi5jIChnZW5fZW50cnlfZXhwYW5kX2luc25zKTogVHJhY2UgZWFjaCBpbnN0cnVjdGlvbiBhcyBpdCBpcworIAlzZWxlY3RlZCBmb3IgZXhwYW5zaW9uLgorCShnZW5fZW50cnlfZXhwYW5kX29wY29kZSk6IFRyYWNlIGVhY2ggZXhwYW5kZWQgaW5zdHJ1Y3Rpb24gYXMgaXQKKyAJaXMgaW5zZXJ0ZWQgaW50byB0aGUgdGFibGUuCisJCitNb24gQXByIDEzIDE5OjIxOjQ3IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogbGQtaW5zbi5jIChwYXJzZV9pbnNuX3dvcmQpOiBQYXJzZSBjb25kaXRpb25hbCBvcGVyYXRvcnMuCisJKHBhcnNlX2luc25fd29yZCk6IFZlcmlmeSBmaWVsZCBjb25kaXRpb25hbHMuCisKKwkqIGxkLWluc24uaDogRXh0ZW5kIHN5bnRheCB0byBhbGxvdyBtYWNyb3MgYW5kIGZpZWxkIGVxdWFsaXR5LgorCShzdHJ1Y3QgaW5zbl9maWVsZF9jb25kKTogUmVuYW1lIGluc25fZmllbGRfZXhjbHVzaW9uLCBhZGQgdHlwZS4KKworCSogZ2VuLmMgKGdlbl9lbnRyeV9leHBhbmRfb3Bjb2RlKTogQ2hlY2sgdHlwZSBvZiBjb25kaXRpb25hbC4KKwkoaW5zbnNfYml0X3VzZWxlc3MpOiBEaXR0by4KKworCSogbGQtaW5zbi5jIChwYXJzZV9tYWNyb19yZWNvcmQpOiBOZXcgZnVuY3Rpb24uCisKK01vbiBBcHIgMTMgMjI6Mzc6NDcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBsZC1pbnNuLmggKGVudW0gaW5zbl9maWVsZF90eXBlKTogQWRkIGluc25fZmllbGRfaW52YWxpZC4KKworCSogbGQtaW5zbi5jIChwYXJzZV9pbnNuX3dvcmQpOiBDaGVjayBpbnN0cnVjdGlvbiBmaWVsZCB0eXBlCisgCWNvcnJlY3RseSBpbml0aWFsaXplZC4KKwkocHJpbnRfaW5zbl93b3Jkcyk6IERpdHRvLgorCShpbnNuX2ZpZWxkX3R5cGVfdG9fc3RyKTogRGl0dG8uCisJKGR1bXBfaW5zbl9maWVsZCk6IERpdHRvLgorCisJKiBnZW4uYyAoaW5zbnNfYml0X3VzZWxlc3MpOiBEaXR0by4KKworRnJpIEFwciAgMyAxODowODoxNiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdlbi5oLCBpZ2VuLmMgKHByaW50X2luY2x1ZGVfaW5saW5lLCBwcmludF9pbmNsdWRlcywKKyAJcHJpbnRfaW5jbHVkZXMpOiBOZXcgZnVuY3Rpb25zLiAgR2VuZXJhdGUgaW5jbHVkZSBsaXN0LiAgRm9yIGZvcgorIAlzZW1hbnRpY3MgZXQuYWwuIGdlbmVyYXRlIENQUCBjb2RlIHRvIGlubGluZSB3aGVuCisgCUNfUkVWRUFMU19NT0RVTEVfUC4KKwkKKwkqIGlnZW4uYyAoZ2VuX3NlbWFudGljc19jKTogQ2FsbCBwcmludF9pbmNsdWRlcy4KKwkqIGdlbi1lbmdpbmUuYyAoZ2VuX2VuZ2luZV9jKTogRGl0dG8uCisKK1NhdCBBcHIgIDQgMjE6MDk6MTEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpZ2VuLmg6IChzdHJ1Y3QgX2lnZW5fbmFtZV9vcHRpb24pOiBSZXBsYWNlIHdpdGggc3RydWN0CisgCWlnZW5fbW9kdWxlX29wdGlvbi4gQ29udGFpbnMgYm90aCBtb2R1bGUgcHJlZml4IGFuZCBzdWZmaXguCisJKElOSVRfT1BUSU9OUyk6IEluaXRpYWxpemUuCisJCisJKiBpZ2VuLmMgKG1haW4pOiBVcGRhdGUgLVAgb3B0aW9uIHRvIGZpbGwgaW4gZnVsbCBtb2R1bGUgaW5mby4KKwkoZ2VuLWVuZ2luZS5jLCBnZW4taWNhY2hlLmMsIGdlbi1pdGFibGUuYywgZ2VuLXNlbWFudGljcy5jLAorIAlnZW4tc3VwcG9ydC5jKTogVXBkYXRlLgorCitTYXQgQXByICA0IDAyOjE1OjM1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaWdlbi5jIChwcmludF9pdHJhY2UpOiBVc2UgVFJBQ0VfQU5ZX1AgbWFjcm8gdG8gZGV0ZXJtaW5lIGlmIGFueQorIAl0cmFjaW5nIGlzIG5lZWRlZC4KKworVGh1IE1hciAyNiAyMDo1MToyMyAxOTk4ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBiaHVuYS5jeWdudXMuY28udWs+CisKKwkqIHRhYmxlLmMgKHRhYmxlX3B1c2gpOiAgUmVkbywgdXNpbmcgc3RkaW8uICBGaXhlcyBOVCBuYXRpdmUKKwlwcm9ibGVtIHdpdGggPENSTEY+PT48TEY+IHRyYW5zbGF0aW9uLi4uCisKK1R1ZSBNYXIgMjQgMjM6MzA6MDcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBnZW4tZW5naW5lLmMgKHByaW50X3J1bl9ib2R5KTogUmUtZXh0cmFjdCB0aGUgQ0lBIGFmdGVyCisgCXByb2Nlc3NpbmcgYW55IGV2ZW50cy4KKworVHVlIE1hciAyNCAxNzo0NjowOCAxOTk4ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBiaHVuYS5jeWdudXMuY28udWs+CisKKwkqIE1ha2VmaWxlLmluOiAgR2V0IFNIRUxMIGZyb20gY29uZmlndXJlLgorCSogY29uZmlndXJlOiAgUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mIDIuMTIuMSB0byBmaXggc2hlbGwgaXNzdWVzIGZvcgorCU5UIG5hdGl2ZSBidWlsZHMuCisKK01vbiBNYXIgMTYgMTI6NTE6MzEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpZ2VuLmM6IFBhc3Mgc2ltX2NpYSB0byB0cmFjZV9wcmVmaXguCisKK1RodSBGZWIgMjYgMTk6MjU6MDIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBsZC1pbnNuLmMgKHBhcnNlX2Z1bmN0aW9uX3JlY29yZCk6IENoZWNrIG1vZGVscyBhcmUgdmFsaWQuCisJKHBhcnNlX2Z1bmN0aW9uX3JlY29yZCk6IE9ubHkgZGlzY2FyZCBmdW5jdGlvbiB3aGVuIG5vIG1vZGVsIGlzCisgCWNvbW1vbi4KKworVHVlIEZlYiAyNCAwMTo0MjowMyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdlbi1lbmdpbmUuYyAocHJpbnRfcnVuX2JvZHkpOiBBbHdheXMgd3JhcCBnZW5lcmF0ZWQgaWRlY29kZQorIAlib2R5IGluIEVOR0lORV9JU1NVRV9QUkVGSVhfSE9PSyAvIEVOR0lORV9JU1NVRV9QT1NURklYX0hPT0suCisKK0ZyaSBGZWIgMjAgMTY6MjI6MTAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBsZC1pbnNuLmMgKHBhcnNlX2Z1bmN0aW9uX3JlY29yZCk6IFdoZW4gLVdub2Rpc2NhcmQsIHN1cHByZXNzCisgCWRpc2NhcmRlZCBmdW5jdGlvbiB3YXJuaW5nLgorCisJKiBpZ2VuLmMgKG1haW4pOiBDbGFyaWZ5IC1Xbm9kaXNjYXJkLgorCisJKiBsZC1pbnNuLmMgKHBhcnNlX2Z1bmN0aW9uX3JlY29yZCk6IEZvciBmdW5jdGlvbnMsIGFsbG93IHVzZSBvZgorIAlpbnN0cnVjdGlvbiBzdHlsZSBmdW5jdGlvbiBtb2RlbCByZWNvcmRzCisKKwkqIGxkLWluc24uaCAobnJfZnVuY3Rpb25fbW9kZWxfZmllbGRzKTogRGVmaW5lLgorCQorVHVlIEZlYiAxNyAxNjozNjoyNyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGlnZW4uYyAocHJpbnRfaXRyYWNlX3ByZWZpeCk6IEdlbmVyYXRlIGNhbGwgdG8gdHJhY2VfcHJlZml4CisgCWluc3RlYWQgb2YgdHJhY2Vfb25lX2luc24uCisJKHByaW50X2l0cmFjZSk6IEdlbmVyYXRlIHRyYWNlX3ByZWZpeCBjYWxsIGlmIGFueSB0cmFjaW5nIGVuYWJsZWQsCisJKHByaW50X2l0cmFjZSk6IE5lc3QgZ2VuZXJhdGVkIGNhbGwgdG8gdHJhY2VfZ2VuZXJpYyBpbnNpZGUKKyAJY29uZGl0aW9uYWwgZm9yIGFueSB0cmFjaW5nIGVuYWJsZWQuCisJKHByaW50X2l0cmFjZV9wcmVmaXgpOiBEbyBub3QgcGFzcyBQSEFTRSB0byB0cmFjZV9wcmVmaXguCisKK1R1ZSBGZWIgIDMgMTQ6MDA6MzIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBnZW4tZW5naW5lLmMgKHByaW50X3J1bl9ib2R5KTogQWRkIGJpdHNpemUgc3VmZml4IHRvIElNRU0gbWFjcm8uCisJKiBnZW4taWNhY2hlLmMgKHByaW50X2ljYWNoZV9ib2R5KTogRGl0dG8uCisJKiBnZW4taWRlY29kZS5jIChwcmludF9pZGVjb2RlX2lmZXRjaCk6IERpdHRvLgorCisJKiBnZW4taWNhY2hlLmMgKHByaW50X2ljYWNoZV9ib2R5KTogTWFyayBzdWNjZXNzaXZlIGluc3RydWN0aW9uCisgCXdvcmRzIGFzIHVudXNlZC4KKworCSogbGQtaW5zbi5jIChwYXJzZV9pbnNuX3dvcmQpOiBPbmx5IHJlcG9ydCBpbnNuLXdpZHRoIHByb2JsZW1zCisgCXdoZW4gd2FybmluZyBlbmFibGVkLgorCisJKiBpZ2VuLmg6IEFkZCBmbGFnIGZvciB3YXJuaW5nIGFib3V0IGludmFsaWQgaW5zdHJ1Y3Rpb24gd2lkdGhzLgorCSogaWdlbi5jOiBQYXJzZSAtV3dpZHRoIG9wdGlvbi4KKwkKKwkqIGdlbi1zdXBwb3J0LmMgKGdlbl9zdXBwb3J0X2gpOiBNYXAgaW5zdHJ1Y3Rpb25fd29yZCBvbnRvCisgCTxQUkVGSVg+X2luc3RydWN0aW9uX3dvcmQgd2hlbiBuZWVkZWQuCisJKHByaW50X3N1cHBvcnRfZnVuY3Rpb25fbmFtZSk6IFVzZSBzdXBwb3J0IHByZWZpeC4KKwkoZ2VuX3N1cHBvcnRfaCk6IERpdHRvIGZvciA8UFJFRklYPl9pZGVjb2RlX2lzc3VlLgorCQorU3VuIEZlYiAgMSAxMTowODo0OCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdlbi1zdXBwb3J0LmMgKGdlbl9zdXBwb3J0X2gpOiBHZW5lcmF0ZSBuZXcgbWFjcm8gQ1BVXy4KKworU2F0IEphbiAzMSAxNDo1MDoyNyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdlbi1lbmdpbmUuYyAoZ2VuX2VuZ2luZV9oKTogRG9uJ3QgYXNzdW1lIGEgbW9kZWwgaXMgcHJlc2VudC4KKwkoZ2VuX2VuZ2luZV9jKTogRGl0dG8uCisKKwkqIGlnZW4uYyAoZ2VuX3J1bl9jKTogRGl0dG8uCisKKwkqIGdlbi1lbmdpbmUuYyAocHJpbnRfcnVuX2JvZHkpOiBVc2UgQ0lBX0dFVCAmIENJQV9TRVQgaW5zdGVhZCBvZgorIAlDUFVfQ0lBLiAgUGFyYW1ldGVyaXplIHdpdGggQ1BVIGFyZ3VtZW50LgorCQorRnJpIEphbiAzMCAwOTowOTozOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdlbi5oIChzdHJ1Y3QgX2dlbl9saXN0KTogUmVwbGFjZSBwcm9jZXNzb3Igd2l0aCBtb2RlbC4KKworCSogaWdlbi5jIChnZW5faWRlY29kZV9oKTogVXBkYXRlLgorCShnZW5fcnVuX2MpOiBGb3IgZ2VuZXJhdGVkIHN3aXRjaCwgdXNlIG1vZGVsLT5mdWxsX25hbWUuCisKKwkqIGdlbi5jIChwcmludF9nZW5fZW50cnlfcGF0aCk6IERpdHRvLgorCShtYWtlX3RhYmxlKTogIERpdHRvLgorCShnZW5fZW50cnlfZXhwYW5kX2luc25zKTogIERpdHRvLgorCShtYWtlX2dlbl90YWJsZXMpOiAgRGl0dG8uCisKKwkqIGlnZW4uYyAoZ2VuX3J1bl9jKTogQWRkIGV4dHJhIGFyZ3VtZW50IGBucl9jcHVzJyB0byBnZW5lcmF0ZWQKKyAJZnVuY3Rpb24gc2ltX2VuZ2luZV9ydW4uICBQYXNzIGFyZ3VtZW50IG9uIHRvIGVuZ2luZV9ydW4uCisKKwkqIGdlbi1lbmdpbmUuYyAocHJpbnRfZW5naW5lX3J1bl9mdW5jdGlvbl9oZWFkZXIpOiBBZGQgZXh0cmEKKyAJYXJndW1lbnQgYG5yX2NwdXMnIHRvIGdlbmVyYXRlZCBmdW5jdGlvbiBlbmdpbmVfcnVuLgorCShwcmludF9ydW5fYm9keSk6IEZpeCBTTVAgY2FzZS4KKworCSogZ2VuLXN1cHBvcnQuYyAoc3VwcG9ydF9jX2Z1bmN0aW9uKTogQ2FsbCBzaW1fZW5naW5lX2Fib3J0IHdoZW4KKyAJaW50ZXJuYWwgZnVuY3Rpb24gZmFpbHMgdG8gbG9uZyBqdW1wLgorCitXZWQgSmFuIDIxIDE4OjAwOjIyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZ2VuLXNlbWFudGljcy5jIChwcmludF9zZW1hbnRpY19ib2R5KTogVXNlIEdQUl9TRVQgdG8gemVybworIAloYXJkd2lyZWQgcmVnaXN0ZXIuCisKK1dlZCBEZWMgMTcgMTQ6NDk6MDMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBnZW4tc2VtYW50aWNzLmMgKHByaW50X3NlbWFudGljX2JvZHkpOiBGaXggaGFuZGxpbmcgb2YKKwloYXJkd2lyZWQgemVybyByZWdpc3Rlci4KKworVHVlIERlYyAgOSAxMjo0NTowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGlnZW4uaCAoc3RydWN0IF9pZ2VuX2dlbl9vcHRpb25zKTogQWRkIG1lbWJlciBkZWZhdWx0X21vZGVsLgorCisJKiBpZ2VuLmMgKGdlbl9ydW5fYyk6IERlZmF1bHQgdG8gdGhlIGZpcnN0IG1hY2hpbmUgaW4gdGhlCisgCW11bHRpLXNpbSBsaXN0LgorCShtYWluKTogQWRkIE1PREVMIHBhcmFtZXRlciB0byBnZW4tbXVsdGktc2ltIG9wdGlvbi4KKworCSogZ2VuLmggKGZ1bmN0aW9uX2RlY2xfdHlwZSk6IERlY2xhcmUgZW51bS4KKworCSogZ2VuLWVuZ2luZS5jIChwcmludF9lbmdpbmVfcnVuX2Z1bmN0aW9uX2hlYWRlciksIGdlbi1lbmdpbmUuaDoKKyAJTWFrZSBnbG9iYWwsIHBhc3MgZnVuY3Rpb25fZGVjbF90eXBlIGFzIGFyZ3VtZW50LgorCShnZW5fZW5naW5lX2gsIGdlbl9lbmdpbmVfYyk6IFVwZGF0ZSBjYWxsLgorCisJKiBnZW4taWRlY29kZS5jIChwcmludF9pZGVjb2RlX2lzc3VlX2Z1bmN0aW9uX2hlYWRlciksCisgCWdlbi1pZGVjb2RlLmg6IFBhc3MgZnVuY3Rpb25fZGVjbF90eXBlIGFzIGFyZ3VtZW50LgorCisJKiBpZ2VuLmMgKGdlbl9pZGVjb2RlX2gpOiBGb3IgbXVsdGktc2ltLCBkZWxjYXJlIGdsb2JhbCB2YXJpYWJsZQorIAlpZGVjb2RlX2lzc3VlLgorCisJKiBpZ2VuLmMgKGdlbl9ydW5fYyk6IEZvciBtdWx0aS1zaW0sIGluaXRpYWxpemUgZ2xvYmFscworIAlpZGVjb2RlX2lzc3VlIGFuZCBlbmdpbmVfcnVuLgorCitGcmkgTm92IDE0IDEwOjUxOjQ0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogbGQtaW5zbi5jIChwYXJzZV9pbnNuX21vZGVsX3JlY29yZCk6IEFsbG93IG11bHRpcGxlIG1vZGVsIG5hbWVzCisgCXRvIGJlIHNwZWNpZmllZCBpbiBhIHNpbmdsZSBpbnN0cnVjdGlvbiBtb2RlbCByZWNvcmQuCisJKGR1bXBfaW5zbl9tb2RlbF9lbnRyeSk6IFVwZGF0ZS4KKworCSogbGQtaW5zbi5oIChzdHJ1Y3QgX2luc25fbW9kZWxfZW50cnkpOiBSZXBsYWNlIG1lbWJlciBuYW1lIHdpdGgKKyAJdGhlIGZpbHRlciBuYW1lcy4gIERvY3VtZW50IHN5bnRheCBjaGFuZ2UuCisKK1dlZCBOb3YgMTIgMTU6NDU6NDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBnZW4tZW5naW5lLmMgKHByaW50X3J1bl9ib2R5KTogQWRkIGhvb2tzIGZvciBhZGRpbmcgY29kZSBiZWZvcmUKKyAJYW5kIGFmdGVyIGFuIGluc3RydWN0aW9uIGhhcyBiZWVuIGlzc3VlZC4KKworMTk5Ny0xMS0wNCAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgorCisJKiBnZW4taWRlY29kZS5jIChwcmludF9qdW1wX3VudGlsX3N0b3BfYm9keSk6IFVzZSBgI2lmIDAnIGluc3RlYWQgb2YKKwlgI2lmZGVmIDAnIGFyb3VuZCB0aGlzLgorCitUdWUgTm92ICA0IDA4OjE4OjI5IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBsZC1kZWNvZGUuYyAobG9hZF9kZWNvZGVfdGFibGUpOiBEb24ndCBhc3N1bWUgTlVMTCBpcyBhbiBpbnRlZ2VyCisJY29uc3RhbnQuCisKK1dlZCBPY3QgMjkgMTM6MTc6MTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBsZC1pbnNuLmg6IERvY3VtZW50IG1uZW1vbmljIHN0cmluZyBmb3JtYXQuCisKK1R1ZSBPY3QgMjggMTA6NTA6MzUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBnZW4taWNhY2hlLmMgKHByaW50X2ljYWNoZV9leHRyYWN0aW9uKTogRm9yY2UgcmVzdWx0IG9mIGF0b2wgdG8KKyAJdW5zaWduZWQuCisKKwkqIGxkLWluc24uYyAocGFyc2VfZnVuY3Rpb25fcmVjb3JkKTogU2VwYXJhdGUgaGFuZGxpbmcgb2Ygb2xkIGFuZAorIAluZXkgZnluY3Rpb24gcmVjb3Jkcy4KKwkobG9hZF9pbnNuX3RhYmxlKTogRm9yICVzIHJlY29yZCwgaGFjayBmdW5jdGlvbiBuYW1lICYgdHlwZSBhZnRlcgorIAlpdCBoYXMgYmVlbiBwYXJzZWQuCisKKwkqIGZpbHRlci5oIChmaWx0ZXJfaXNfc3Vic2V0KTogUmV2ZXJzZSBhcmd1bWVudCBuYW1lcywgd3JvbmcKKyAJb3JkZXIuCisKKwkqIGxkLWluc24uYyAobG9hZF9pbnNuX3RhYmxlKTogTW92ZSBpbmNsdWRlIGNvZGUgdG8uCisJKHBhcnNlX2luY2x1ZGVfcmVjb3JkKTogTmV3IGZ1bmN0aW9uLiAgQ2hlY2sgZm9yIGZpbHRlcmluZyBvZgorIAlpbmNsdWRlIHN0YXRlbWVudCBieSBib3RoIGZsYWdzIGFuZCBtb2RlbHMuCisJKGxvYWRfaW5zbl90YWJsZSk6IENoZWNrIGZvciBtb2RlbCBmaWx0ZXJpbmcgb2YgY2FjaGUgYW5kIG1vZGVsCisgCXJlY29yZHMuCisJKHBhcnNlX21vZGVsX2RhdGFfcmVjb3JkKTogQ2hlY2sgZm9yIG1vZGVsICYgZmxhZyBmaWx0ZXJpbmcgb2YKKyAJbW9kZWwgZGF0YSByZWNvcmRzLgorCShwYXJzZV9mdW5jdGlvbl9yZWNvcmQpOiBDaGVjayBmb3IgbW9kZWwgJiBmbGFnIGZpbHRlcmluZyBvZgorIAlmdW5jdGlvbiByZWNvcmRzLgorCisJKiBsZC1pbnNuLmg6IERlZmluZSByZWNvcmRfZmlsdGVyX21vZGVsc19maWVsZC4gIEFkZCBmaWx0ZXItbW9kZWxzCisgCWZpZWxkIHRvIGFsbCBidXQgaW5zdHJ1Y3Rpb24gcmVjb3Jkcy4KKwkoc3RydWN0IF9mdW5jdGlvbl9lbnRyeSwgc3RydWN0IF9jYWNoZV9lbnRyeSk6IEFkZCBtb2RlbHMgZmllbGQuCisJKG5yX2Z1bmN0aW9uX2ZpZWxkcyk6IE1ha2UgcGFybSBmaWVsZCBtYW5kYXRvcnkuCisKK01vbiBPY3QgMjcgMTU6MTQ6MjYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpZ2VuLmMgKG1haW4pOiBDaGFuZ2UgLUkgb3B0aW9uIHRvIC1JPGRpcmVjdG9yeT4uICBBZGQgb3B0aW9uYWwKKyAJc2l6ZSB0byAtR2dlbi1pY2FjaGUgb3B0aW9uLiAgQWRkIC1Hbm8tLi4uIHN1cHBvcnQuCisJCisJKiBpZ2VuLmggKHN0cnVjdCBfaWdlbl9vcHRpb25zKTogQWRkIGluY2x1ZGUgZmllbGQuCisJCisJKiBsZC1pbnNuLmMgKGVudW0gaW5zbl9yZWNvcmRfdHlwZSwgaW5zbl90eXBlX21hcCk6IEFkZAorIAlpbmNsdWRlX3JlY29yZC4KKwkobG9hZF9pbnNuX3RhYmxlKTogQ2FsbCB0YWJsZV9wdXNoIHdoZW4gaW5jbHVkZSByZWNvcmQuCisJCisJKiB0YWJsZS5jIChzdHJ1Y3QgX29wZW4gdGFibGUsIHN0cnVjdCB0YWJsZSk6IE1ha2UgdGFibGUgb2JqZWN0IGFuCisgCWluZGlyZWN0IHB0ciB0byB0aGUgY3VycmVudCB0YWJsZSBmaWxlLgorCShjdXJyZW50X2xpbmUsIG5ld190YWJsZV9lbnRyeSwgbmV4dF9saW5lKTogTWFrZSBmaWxlIGFyZyB0eXBlCisgCW9wZW5fdGFibGUuCisJKHRhYmxlX29wZW4pOiBVc2UgdGFibGVfcHVzaC4KKwkodGFibGVfcmVhZCk6IFBvaW50IHZhcmlhYmxlIGZpbGUgYXQgY3VycmVudCB0YWJsZSwgYXQgZW9mLCBwb3AKKyAJbGFzdCBvcGVuIHRhYmxlLgorCisJKiB0YWJsZS5oLCB0YWJsZS5jICh0YWJsZV9wdXNoKTogTmV3IGZ1bmN0aW9uLgorCitUaHUgT2N0IDE2IDExOjAzOjI3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZ2VuLXNlbWFudGljcy5jIChwcmludF9zZW1hbnRpY19ib2R5KTogVXNlIENJQSBub3QKKyAJY2lhLmlwLiBFc2NhcGUgbmV3bGluZXMgYXQgZW5kIG9mIGdlbmVyYXRlZCBjYWxsIHRvCisgCXNpbV9lbmdpbmVfYWJvcnQuCisKK1R1ZSBPY3QgMTQgMTE6MTM6MjcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpZ2VuLmMgKHByaW50X2l0cmFjZSk6IE91dHB1dCBsaW5lLXJlZiB0byBpZ2VuIHNvdXJjZSBmaWxlIHdoZW4KKyAJZ2VuZXJhdGluZyB0cmFjZSBzdGF0ZW1lbnRzLgorCShwcmludF9pdHJhY2VfcHJlZml4LCBwcmludF9pdHJhY2VfZm9ybWF0KTogRXNjYXBlIG5ld2xpbmUgYXQgZW5kCisgCW9mIGVhY2ggbGluZSBvZiBnZW5lcmF0ZWQgY2FsbCB0byB0cmFjZSBmdW5jdGlvbi4KKworTW9uIE9jdCAxMyAxMToyNzozMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdlbi1zdXBwb3J0LmMgKGdlbl9zdXBwb3J0X2gpOiBHZW5lcmF0ZSAjZGVmaW5lIE5JQS4gRGVmaW5pdGlvbgorIAlkZXBlbmRhbnQgb24gZ2VuLWRlbGF5ZWQtYnJhbmNoIG1vZGUuCisKKwkqIGxkLWluc24uYyAocGFyc2VfaW5zbl9tbmVtb25pY19yZWNvcmQpOiBDaGVjayBmb3Igb3BlbmluZyBhbmQKKyAJY2xvc2luZyBkb3VibGUgcXVvdGUgaW4gbW5lbW9uaWMgZmllbGQuCisJKHBhcnNlX29wdGlvbl9yZWNvcmQpOiBBZGQgZ2VuLWRlbGF5ZWQtYnJhbmNoIG9wdGlvbi4KKworV2VkIE9jdCAgOCAxMzoxMDoxNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdlbi5jIChpbnNuX2xpc3RfaW5zZXJ0KTogTWlzc2luZyBcbiBpbiB3YXJuaW5nLgorCisJKiBsZC1pbnNuLmMgKGxvYWRfaW5zbl90YWJsZSk6IE9ubHkgbm90aWZ5IG9mIGRpc2NhcmRlZAorIAlpbnN0cmN0aW9ucyB3aGVuIHdhcm4uZGlzY2FyZCBlbmFibGVkLgorCisJKiBpZ2VuLmg6IEFkZCBvcHRpb24ud2Fybi5kaXNjYXJkLCBkZWZhdWx0IGVuYWJsZWQuCisKKwkqIGlnZW4uYyAobWFpbik6IEFkZCAtV25vZGlzY2FyZCBvcHRpb24uCisKKwkqIGxkLWluc24uYyAocmVjb3JkX3R5cGUpOiBGb3Igb2xkIHJlY29yZCB0eXBlLCBjaGVjayB0aGUgbnVtYmVyCisgCW9mIGZpZWxkcyBpcyBjb3JyZWN0LgorCShsb2FkX2luc25fdGFibGUpOiBBbGxvdyBpbnNuIGFzc2VtYmxlciBhbmQgaW5zbiBtb2RlbCByZWNvcmRzIHRvCisgCWFwcGVhciBpbiBhbnkgb3JkZXIuCisJKHBhcnNlX2luc25fbW9kZWxfcmVjb3JkKTogUmVuYW1lIGZyb20gcGFyc2VfaW5zbl9tb2RlbF9yZWNvcmRzLgorICAJUGFyc2Ugb25seSBvbmUgcmVjb3JkLgorCShwYXJzZV9pbnNuX21uZW1vbmljX3JlY29yZCk6IFJlbmFtZSBmcm9tCisgCXBhcnNlX2luc25fbW5lbW9uaWNfcmVjb3Jkcy4gIFBhcnNlIG9ubHkgb25lIHJlY29yZC4KKworVHVlIFNlcCAyMyAxNTo1MjowNiAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQHlpbi5jeWdudXMuY29tPgorCisJKiBnZW4taXRhYmxlLmMgKGdlbl9pdGFibGVfaCk6IFtucl9pdGFibGVfKiArIDFdIHRvIGF2b2lkCisgCWlsbGVnYWwgemVyby1zaXplZCBhcnJheS4KKwkoaXRhYmxlX3ByaW50X3NldCk6IGxpa2V3aXNlLCBhdm9pZCBlbXB0eSBpbml0aWFsaXplcnMuCisKK01vbiBTZXAgMjIgMTg6NDk6MDcgMTk5NyAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IGkzODYtd2luZG93cyBpcyBhIGNyb3NzLCBzbyBkb24ndCBleHBlY3QKKyAJbGliaWJlcnR5IHRvIGJlIHRoZXJlLgorCSogY29uZmlndXJlOiB1cGRhdGVkLgorCQorRnJpIFNlcCAxOSAxMDozNjozMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGlnZW4uYyAocHJpbnRfZnVuY3Rpb25fbmFtZSk6IFB1dCB0aGUgZm9ybWF0IG5hbWUgYWZ0ZXIgdGhlCisgCWZ1bmN0aW9uIC8gaW5zdHJ1Y3Rpb24gbmFtZSwgbm90IGJlZm9yZS4KKwkocHJpbnRfaXRyYWNlKTogQmV0dGVyIGZvcm1hdCB0cmFjZSBjb2RlLgorCitUdWUgU2VwIDE2IDExOjAxOjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZ2VuLmMgKGluc25zX2JpdF91c2VsZXNzKTogRG9uJ3QgdHJlYXQgc3RyaW5nIGZpZWxkcyByZXN0cmljdGVkCisgCXRvIGEgcmFuZ2Ugb2YgdmFsdWVzIGFzIHVzZWxlc3MuCisKK01vbiBTZXAgMTUgMTU6NDc6MjEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpZ2VuLmMgKGdlbl9ydW5fYyk6IEhhbmRsZSBub24tbXVsdGktc2ltIGNhc2UuCisKKwkqIGdlbi1zdXBwb3J0LmMgKGdlbl9zdXBwb3J0X2gpOiBEZWZpbmUgU0RfIC0gdG8gcmVwbGFjZSBfU0QuCisgIAlEZWZpbmUgQ0lBIGZyb20gY2lhLgorCitUaHUgU2VwIDExIDEwOjI3OjM5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZ2VuLXNlbWFudGljcy5jIChwcmludF9zZW1hbnRpY19ib2R5KTogVHJhY2UgdGhlIGluc3RydWN0aW9uCisgCWFmdGVyIGl0IGhhcyBiZWVuIHZhbGlkYXRlZC4KKwkocHJpbnRfc2VtYW50aWNfYm9keSk6IENvdW50IHRoZSBpbnN0cnVjdGlvbiB1c2luZyBzaW0tcHJvZmlsZS4KKwkKK1dlZCBTZXAgMTAgMTM6MzU6MzcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBnZW4taXRhYmxlLmMgKGdlbl9pdGFibGVfaCk6IENvbGxlY3Qgc3VtbWFyeSBpbmZvIG9uIGluc3RydWN0aW9uCisgCXRhYmxlIHdoZW4gdHJhdmVyc2luZyBpdC4KKwkoZ2VuX2l0YWJsZV9oKTogT3V0cHV0IGFuIGVudW0gZGVmaW5pbmcgdGhlIG1heCBzaXplIG9mIGVhY2ggb2YKKyAJdGhlIGl0YWJsZSBzdHJpbmcgbWVtYmVycy4KKworVHVlIFNlcCAgOSAwMzozMDoyNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGlnZW4uYyAoZ2VuX3J1bl9jKTogTmV3IGZ1bmN0aW9uLiBHZW5lcmF0ZSBzaW1fZW5naW5lX3J1biB0aGF0CisgCWxvb2tzIGF0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgYXJjaGl0ZWN0dXJlLgorCisJKiBnZW4tZW5naW5lLmMsIGdlbi1pZGVjb2RlLmM6IEFkZCBtdWx0aS1zaW0gc3VwcG9ydCAtIGdlbmVyYXRlCisgCW9uZSBlbmdpbmUgcGVyIG1vZGVsLgorCQorCSogZ2VuLXNlbWFudGljcy5jLCBnZW4taWNhY2hlLmMgZ2VuLXN1cHBvcnQuYzoKKyAJVXBkYXRlLgorCisJKiBsZC1pbnNuLmgsIGxkLWluc24taCAobG9hZF9pbnNuX3RhYmxlKTogUmV3cml0ZS4gIHRhYmxlLmggb25seQorIAlyZXR1cm5zIGEgbGluZSBhdCBhIHRpbWUuICBQYXJzZSBtdWx0aS13b3JkIGluc3RydWN0aW9ucy4gIEFkZAorIAltdWx0aS1zaW0gc3VwcG9ydC4KKworCSogdGFibGUuaCwgdGFibGUuYzogU2ltcGxpZnkuICBPbmx5IHBhcnNlIGEgc2luZ2xlIGxpbmUgYXQgYSB0aW1lLgorICAJbGQtaW5zbiBjYW4gaGFuZGxlIHRoZSByZXN0LgorCisJKiBmaWx0ZXIuaCwgZmlsdGVyLmMgKGZpbHRlcl9wYXJzZSwgZmlsdGVyX2FkZCwgZmlsdGVyX2lzX3N1YnNldCwKKyAJZmlsdGVyX2lzX2NvbW1vbiwgZmlsdGVyX2lzX21lbWJlciwgZmlsdGVyX25leHQpOiBOZXcgZmlsdGVyCisgCW9wZXJhdGlvbnMuCisJKGR1bXBfZmlsdGVyKTogRGl0dG8uCisJCisJKiBnZW4uaCwgZ2VuLmM6IE5ldyBmaWxlLiAgVGFrZXMgdGhlIGluc24gdGFibGUgYW5kIHR1cm5zIGl0IGludG8KKyAJYSBzZXQgb2YgZGVjb2RlIHRhYmxlcyBhbmQgc2VtYW50aWMgZnVuY3Rpb25zLgorCQorCSogbGQtaW5zbi5jOiBDb3B5IGdlbmVyYXRvciBjb2RlIGZyb20gaGVyZS4KKwkqIGdlbi5jOiBUbyBoZXJlLgorCitGcmkgQXVnICA4IDExOjQzOjQ1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogbWlzYy5oIChOWkFMTE9DKTogQWxsb2NhdGUgYW4gTiBlbGVtZW50IGFycmF5IG9mIFRZUEUuCisKKwkqIHRhYmxlLmgsIHRhYmxlLmM6IFNpbXBsaWZ5IHRhYmxlIHBhcnNlciBzbyB0aGF0IGl0IG9ubHkKKyAJdW5kZXJzdGFuZHMgY29sb24gZGVsaW1pdGVkIGxpbmVzIGFuZCBjb2RlIGJsb2Nrcy4KKwkodGFibGVfcmVhZCk6IFBhcnNlICd7JyAuLi4gJ30nIGFzIGEgY29kZSBibG9jay4KKwkodGFibGVfcHJpbnRfY29kZSk6IE5ldyBmdW5jdGlvbiwgcHJpbnQgb3V0IGEgY29kZSBibG9jayB0byBmaWxlLgorCShtYWluKTogQWRkIHN1cG9ydCBmb3Igc3RhbmRhbG9uZSB0ZXN0aW5nLgorCQorCSogbGQtaW5zbi5oLCBsZC1pbnNuLmM6CisJCisJCitNb24gU2VwICAxIDExOjQxOjEyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZ2VuLWlkZWNvZGUuYyAoZXJyb3JfbGVhZl9jb250YWluc19tdWx0aXBsZV9pbnNuKTogTWFrZSBzdGF0aWMuCisJKHByaW50X2p1bXBfZGVmaW5pdGlvbiwgcHJpbnRfanVtcCwgcHJpbnRfanVtcF9pbnRlcm5hbF9mdW5jdGlvbiwKKyAJcHJpbnRfanVtcF9pbnNuLCBwcmludF9qdW1wX3VudGlsX3N0b3BfYm9keSk6IERlbGV0ZSwgbW92ZWQgdG8KKyAJc2ltLWVuZ2luZS5jCisKKwkqIGlnZW4uYyAocHJpbnRfaXRyYWNlX2Zvcm1hdCk6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGUgY2hwLgorCShnZW4tZW5naW5lLmgpOiBJbmNsdWRlLgorCisJKiB0YWJsZS5jIChjdXJyZW50X2ZpbGVfbmFtZSwgY3VycmVudF9saW5lX2VudHJ5LAorIAljdXJyZW50X2xpbmVfZW50cnkpOiBNYWtlIHN0YXRpYy4KKworV2VkIEF1ZyAgNiAxMjozMToxNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIEFSX0ZPUl9CVUlMRCwgQVJfRkxBR1NfRk9SX0JVSUxELAorIAlSQU5MSUJfRk9SX0JVSUxEIGFuZCBDRkxBR1NfRk9SX0JVSUxELgorCSogY29uZmlndXJlLmluOiBJbmNsdWRlIHNpbXVsYXRvciBjb21tb24vYWNsb2NhbC5tNC4KKwkqIGNvbmZpZ3VyZS5pbjogQWRkIC0tZW5hYmxlLXNpbS13YXJuaW5ncyBvcHRpb24uCisJKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgorCQorCSogTWFrZWZpbGUuaW46IFVzZS4KKworCSogTWFrZWZpbGUuaW4gKHRtcC1maWx0ZXIpOiBOZXcgcnVsZS4KKwkoaWdlbi5vLCB0bXAtdGFibGUsIHRtcC1sZC1kZWNvZGUsIHRtcC1sZC1jYWNoZSwgdG1wLWxkLWluc24sCisgCWxkLWRlY29kZS5vLCBsZC1jYWNoZS5vLCBsZC1pbnNuLm8pOiBGaXggZGVwZW5kZW5jaWVzLgorCQorCSogZ2VuLmgsIGdlbi5jOiBOZXcgZmlsZXMuCisgIAkKKwkqIE1ha2VmaWxlLmluIChnZW4ubywgdG1wLWdlbik6IE5ldyBydWxlcywgdXBkYXRlIGFsbAorIAlkZXBlbmRlbmNpZXMuCisJCitUdWUgSnVuIDI0IDExOjQ2OjQ1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogbGQtaW5zbi5jIChsb2FkX2luc25fdGFibGUpOiBBY2NlcHQgJXMgYXMgYSBmdW5jdGlvbiB0eXBlLgorCitUaHUgSnVuICA1IDE3OjE0OjMyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaWdlbi5jIChwcmludF9pdHJhY2VfcHJlZml4KTogTW92ZSBwcmludGluZyBvZiBpbnNuIHByZWZpeCB0bworIAloZXJlLgorCShwcmludF9pdHJhY2VfZm9ybWF0KTogRHJvcCBwcmludGluZyBvZiBNWV9OQU1FIGluIGluc3RydWN0aW9uCisgCXRyYWNlLiAgUHJpbnRpbmcgb2YgaW5zbiBwcmVmaXggbW92ZWQuCisJKHByaW50X2l0cmFjZSk6IERpdHRvLgorCitGcmkgTWF5IDMwIDExOjI3OjM3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfZnVuY3Rpb25faGVhZGVyKTogUGFzcworIAl0YWJsZV9saW5lX2VudHJ5IGluc3RlYWQgb2Ygc2VwYXJhdGUgZmlsZSBhbmQgbGluZS4KKworCSogdGFibGUuYyAodGFibGVfZW50cnlfcmVhZCk6IFNldCBhc3NlbWJsZXIgc291cmNlIGZpbGUvbGluZS1uciB0bworIAl0aGUgY3VycmVudCBub3QgaW5pdGlhbCBmaWxlLgorCSh0YWJsZV9lbnRyeV9yZWFkKTogRml4IGxpbmUgbnVtYmVyaW5nIG9mIHNvdXJjZSBmaWxlcy4KKworCXRhYmxlLmggKHRhYmxlX2xpbmVfZW50cnkpOiBOZXcgc3RydWN0dXJlLiAgRXhhY3RseSBzcGVjaWZpZXMgYQorIAlzb3VyY2UgZmlsZS9saW5lLW5yLgorCSh0YWJsZV8qX2VudHJ5KTogQWRkIHRoaXMgdG8gYWxsLgorCQorCXRhYmxlLmMgKHRhYmxlX2VudHJ5X3ByaW50X2NwcF9saW5lX25yKTogQ2hhbmdlIHRvIHVzZSB2YWx1ZXMgZnJvbQorIAlhIHRhYmxlX2xpbmVfZW50cnkgc3RydWN0LgorCSh0YWJsZV9lbnRyeV9yZWFkKTogU2F2ZSB0YWJsZV9saW5lX2VudHJ5IGluIGFsbCBzdHJ1Y3R1cmVzIHJlYWQuCisKKwlnZW4taWNhY2hlLmMsIGdlbi1zdXBwb3J0LmMsIGdlbi1pZGVjb2RlLmMsIGdlbi1zZW1hbnRpY3MuYywKKyAJZ2VuLW1vZGVsLmM6IFVwZGF0ZSBhbGwgcmVmZXJlbmNlcy4KKwkKK1RodSBNYXkgMjkgMTA6Mjk6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpZ2VuLmMgKHByaW50X215X2RlZmluZXMpOiBEZWZpbmUgTVlfTkFNRSAtIGEgc3RyaW5nLiAgRm9yCisgCU1ZX1BSRUZJWCwgdW5kZWZpbmUgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGluY2FzZSBzb21lIGR1bWIKKyAJaGVhZGVyIGRlZmluZWQgaXQuICBpdC4KKwkocHJpbnRfaXRyYWNlKTogVXNlIE1ZX05BTUUgbm90IE1ZX1BSRUZJWC4KKworCSogbGYuYyAobGZfd3JpdGUpOiBOZXcgZnVuY3Rpb24gd3JpdGUgYW4gTiBjaGFyYWN0ZXIgYnVmZmVyIHRvIHRoZQorIAlmaWxlLgorCisJKiBpZ2VuLmMgKHByaW50X2l0cmFjZSk6IFdoZW4gYXZhaWxhYmxlLCB1c2UgdGhlIGFzc2VtYmxlciB0bworIAlwcmludCB0aGUgaW5zbi10cmFjZS4KKwkocHJpbnRfaXRyYWNlX3ByZWZpeCk6IE5ldyBmdW5jdGlvbiwgcHJpbnQgZmlyc3QgcGFydCBvZiBjYWxsIHRvCisgCXByaW50X29uZV9pbnNuLgorCShwcmludF9pdHJhY2VfZm9ybWF0KTogTmV3IGZ1bmN0aW9uLCBwcmludCBmbXQgYXJndW1lbnQgZm9yCisgCXByaW50X29uZV9pbnNuLgorCQorCSogdGFibGUuYyAodGFibGVfZW50cnlfcmVhZCk6IFNhdmUgYW55IGFzc2VtYmxlciBsaW5lcyBpbnN0ZWFkIG9mCisgCWRpc2NhcmRpbmcgdGhlbS4KKworV2VkIE1heSAyOCAwOTo1NToyOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2JvZHkpOiBQcm9jZXNzIGltbWVkcy4KKworCSogZ2VuLXNlbWFudGljcy5jIChwcmludF9zZW1hbnRpY19ib2R5KTogV2hlbiBjb21wdXRpbmcgTklBLCBza2lwCisgCWFueSBpbW1lZCB3b3JkcyB0aGF0IGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb24gd29yZC4KKworCSogbGQtaW5zbi5jIChwYXJzZV9pbnNuX2Zvcm1hdCk6IFBhcnNlIGltbWVkcyBhcHBlbmRlZCB0byBhbgorIAlpbnN0cnVjdGlvbi4KKworCSogaWdlbi5jIChtYWluKTogQWxsb3cgYW55IHJlZ2lzdGVyIHRvIGJlIHNwZWNpZmllZCBhcyB0aGUgemVybworIAlyZWdpc3Rlci4KKwkoc2VtYW50aWNfemVyb19yZWcpOiBHbG9iYWwsIGluZGV4IHRvIHplcm8gcmVnaXN0ZXIuCisKKwkqIGdlbi1zZW1hbnRpY3MuYyAocHJpbnRfc2VtYW50aWNfYm9keSk6IFplcm8gc2VsZWN0ZWQgcmVnaXN0ZXIuCisKK1R1ZSBNYXkgMjcgMTQ6MTI6MzIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpZ2VuLmg6IFN0b3Agb3B0aW9ucyBhbmQgY29kZSBnZW4gdHlwZSBiaXQgbWFza3Mgb3ZlcmxhcGluZy4KKworRnJpIE1heSAyMyAxMjowMTowOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdlbi1zZW1hbnRpY3MuYyAocHJpbnRfc2VtYW50aWNfYm9keSk6IEluY29ycmVjdCB0ZXN0IGZvcgorIAl6ZXJvLXIwIGNvZGUuCisKK0ZyaSBNYXkgMTYgMTQ6MzI6MzEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBnZW4tc2VtYW50aWNzLmMgKHByaW50X3NlbWFudGljX2JvZHkpOiBVc2UgY29tbW9uIHNpbS1lbmdpbmUKKyAJaW50ZXJmYWNlLgorCitGcmkgTWF5IDE2IDExOjQ4OjMwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZ2VuLXNlbWFudGljcy5jIChwcmludF9zZW1hbnRpY19ib2R5KTogQWRkIGNvZGUgdG8gY2xlYXIgcjAuCisKKwkqIGlnZW4uYyAobWFpbik6IEFkZCBuZXcgb3B0aW9uIHplcm8tcjAsIHdoaWNoIGFkZHMgY29kZSB0byBjbGVhcgorIAlHUFIoMCkgZWFjaCBjeWNsZS4KKworV2VkIE1heSAgNyAxMjozMTozMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGlnZW4uYyAocHJpbnRfaXRyYWNlKTogRml4IHNvIGxpbmUtbnIgaXMgcGFzc2VkIHRvIHRyYWNlCisgCWZ1bmN0aW9uLgorCisJKiBnZW4taWRlY29kZS5jIChwcmludF9pZGVjb2RlX3ZhbGlkYXRlKTogQ29ycmVjdCBGUCBjb2RlLgorCisJKiBnZW4tc3VwcG9ydC5jIChnZW5fc3VwcG9ydF9oKTogQWx3YXlzIHBhc3MgTVlfSU5ERVggdG8gc3VwcG9ydAorIAlmdW5jdGlvbnMuCisJKHByaW50X3N1cHBvcnRfZnVuY3Rpb25fbmFtZSk6IERpdHRvLgorCitUdWUgTWF5ICA2IDA2OjEyOjA0IDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBpZ2VuLmMgKHByaW50X2l0cmFjZSk6IENhbGwgdHJhY2Vfb25lX2luc24gdG8gdHJhY2UKKwlpbnN0cnVjdGlvbnMsIHJhdGhlciB0aGFuIGRvaW5nIGl0IGRpcmVjdGx5LgorCitNb24gTWF5ICA1IDE0OjExOjQ2IDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBnZW4tZW5naW5lLmMgKGVuZ2luZV9zd2l0Y2hfbGVhZik6IFJlbW92ZSBleHRyYSAlcy4KKwkocHJpbnRfZW5naW5lX2Zsb2F0aW5nX3BvaW50X3VuYXZhaWxhYmxlKTogV3JhcCBpbiAjaWZkZWYKKwlVTlVTRUQvI2VuZGlmLCB1bnRpbCBzb21lYm9keSB1c2VzIGl0LgorCisJKiBnZW4taWRlY29kZS5jIChlcnJvcl9sZWFmX2NvbnRhaW5zX211bHRpcGxlX2luc24pOiBSZW1vdmUgdW51c2VkCisJdmFyaWFibGUuCisJKHByaW50X2p1bXBfdW50aWxfc3RvcF9ib2R5KTogV3JhcCBpbiAjaWZkZWYgVU5VU0VELyNlbmRpZiwgdW50aWwKKwlzb21lYm9keSB1c2VzIGl0LgorCShwcmludF9pZGVjb2RlX3ZhbGlkYXRlKTogVXNlIGxvbmcgZm9ybWF0cyB0byBwcmludCBsb25nIHZhbHVlcy4KKworCSogZ2VuLXNlbWFudGljcy5jIChwcmludF9pZGVjb2RlX2ludmFsaWQpOiBTZXQgbmFtZSB0byAidW5rbm93biIKKwlpZiB3ZSBnZXQgYW4gdW5leHBlY3RlZCB0eXBlLgorCitGcmkgTWF5ICAyIDEzOjI4OjA2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaWdlbi5jIChwcmludF9pdHJhY2UpOiBQYXNzIFNEIGFzIHdlbGwgYXMgQ1BVIHRvIGNhbGxzIHRvCisgCXRyYWNlX3ByaW50Zi4KKworCSogZ2VuLXN1cHBvcnQuYyAoZ2VuX3N1cHBvcnRfaCk6IEFsd2F5cyBwYXNzIHNpbV9jaWEgY2lhIHRvCisgCXN1cHBvcnQgZnVuY3Rpb25zLgorCShwcmludF9zdXBwb3J0X2Z1bmN0aW9uX25hbWUpOiBEaXR0by4KKworV2VkIEFwciAzMCAxNzozNTo1MSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdlbi1zdXBwb3J0LmMgKHN1cHBvcnRfY19mdW5jdGlvbik6IFJlbW92ZSB1bm5lY2Vzc2FyeSBtZW1zZXQgb2YKKyAJY2lhLgorICAJKiBnZW4tc2VtYW50aWNzLmMgKHByaW50X3NlbWFudGljX2JvZHkpOiBXYXNuJ3QgY2xvc2luZworIAlnZW5lcmF0ZWQgY29tbWVudC4KKworVHVlIEFwciAyOSAxMToxMToxMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGxkLWluc24uYyAobG9hZF9pbnNuX3RhYmxlKTogUmVwb3J0IGluc3RydWN0aW9ucyB0aGF0IGRvIG5vdAorIAloYXZlIGF0IGxlYXN0IGEgZm9ybWF0IGFuZCBuYW1lLgorCShpbnNuX3RhYmxlX2ZpbmRfb3Bjb2RlX2ZpZWxkKTogQ2hlY2sgcHJvZ3Jlc3MgaXMgYmVpbmcgbWFkZS4KKworCSogZ2VuLXN1cHBvcnQuYyAoc3VwcG9ydF9jX2Z1bmN0aW9uKTogUmVwb3J0IGVtcHR5IGZ1bmN0aW9uIGJvZHkuCisKK1RodSBBcHIgMjQgMTE6NDM6NDUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBsZC1pbnNuLmMgKGluc25fdGFibGVfZXhwYW5kX29wY29kZSk6IEFsbG93IHJlc2VydmVkIGZpZWxkcyB0bworIAliZSBicm9rZW4gdXAuCisJKGluc25fdGFibGVfZXhwYW5kX2luc25zKTogQWxsb3cgc3BlY2lhbCBydWxlcyB0byBhcHBseSB0byBncm91cHMKKyAJb2YgaW5zdHJ1Y3Rpb25zIHdoZW4gYWxsIG1lbWJlcnMgb2YgdGhlIGdyb3VwIG1hdGNoIHRoZSBzcGVjaWFsCisgCW1hc2svdmFsdWUuCisKKwkqIGdlbi1zZW1hbnRpY3MuYyAocHJpbnRfY19zZW1hbnRpYyk6IERpdHRvLgorCSogaWdlbi5jIChwcmludF9zZW1hbnRpY19mdW5jdGlvbl9mb3JtYWwpOiBEaXR0by4KKwkocHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fdHlwZSk6IERpdHRvLgorCSogaWdlbi5jIChwcmludF9pY2FjaGVfZnVuY3Rpb25fZm9ybWFsKTogRGl0dG8uCisJKiBnZW4taWRlY29kZS5jIChwcmludF9pZGVjb2RlX2lzc3VlX2Z1bmN0aW9uX2JvZHkpOiBEaXR0by4KKworCSogZ2VuLWlkZWNvZGUuYyAoZ2VuX2lkZWNvZGVfaCk6IFByZXBlbmQgdGhlIGdsb2JhbF9wcmVmaXggdG8gdGhlCisgCWluc3RydWN0aW9uX2FkZHJlc3MgdHlwZS4KKworCSogZ2VuLXNlbWFudGljcy5jIChwcmludF9zZW1hbnRpY19ib2R5KTogQ2FsbCBjcHVfZXJyb3Igd2hlbiBhbgorIAl1bmltcGxlbWVudGVkIGluc3RydWN0aW9uIGlzIGVuY291bnRlcmVkIC0gZ2l2ZXMgdGhlIGludGVycHJldGVyCisgCXRoZSBjaGFuY2UgdG8gc3RvcCBjb3JyZWN0bHkuCisKK1dlZCBBcHIgMjMgMjA6MDY6MzYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpZ2VuLmMgKHByaW50X2Z1bmN0aW9uX25hbWUpOiBBbGxvdyBkb3QncyBpbiBpbnN0cnVjdGlvbiBuYW1lcy4KKworVHVlIEFwciAyMiAyMTo0NjoyOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGlnZW4uYyAobWFpbiksIGlnZW4uaDogU3VwcG9ydCBuZXcgb3B0aW9uIC0gZGVsYXllZC1icmFuY2ggLQorIAlnZW5lcmF0ZSBjb2RlIHRvIGRyaXZlIGEgZGVsYXllZCBicmFuY2ggcHJvY2Vzc29yLgorCisJKiBnZW4taWRlY29kZS5jIChnZW5faWRlY29kZV9oKTogRGVmaW5lIGluc3RydWN0aW9uX2FkZHJlc3MgdHlwZS4KKworCSogaWdlbi5jIChwcmludF9pY2FjaGVfZnVuY3Rpb25fZm9ybWFsKTogUmVwbGFjZSBhZGRyZXNzX3dvcmQgd2l0aAorIAlpbnN0cnVjdGlvbl9hZGRyZXNzLgorCShwcmludF9zZW1hbnRpY19mdW5jdGlvbl9mb3JtYWwpOiBEaXR0by4KKwkocHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fdHlwZSk6IERpdHRvLgorCSogZ2VuLWlkZWNvZGUuYyAocHJpbnRfaWRlY29kZV9pc3N1ZV9mdW5jdGlvbl9ib2R5KTogRGl0dG8uCisKKwkqIGdlbi1zZW1hbnRpY3MuYyAocHJpbnRfc2VtYW50aWNfYm9keSk6IERpdHRvLgorCShwcmludF9jX3NlbWFudGljKTogRGl0dG8uCisKKwkqIGdlbi1zdXBwb3J0LmMgKHN1cHBvcnRfY19mdW5jdGlvbik6IFJldHVybiBhIHplcm9lZCBDSUEgaW5zdGVhZAorIAlvZiBqdXN0IHplcm8gLSB3b3JrcyB3aXRoIGFueSBjaWEgdHlwZS4KKworCSogaWdlbi5jIChwcmludF9pdHJhY2UpOiBGb3IgZGVsYXllZCBicmFuY2ggY2FzZSwgcHJpbnQganVzdCB0aGUKKyAJY3VycmVudCBpbnN0cnVjdGlvbi4KKwkKK1RodSBBcHIgMTcgMDc6MDI6MzMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogaWdlbi5jIChwcmludF9pdHJhY2UpOiBVc2UgVFJBQ0VfRk9PX1AgYW5kIHRyYWNlX3ByaW50Zi4KKworVHVlIEFwciAxNSAxNToyMDozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogU2V0IHRvIEBJTlNUQUxMQC4KKwkoSU5TVEFMTF9YRk9STSwgSU5TVEFMTF9YRk9STTEpOiBSZW1vdmUuCisKK01vbiBBcHIgMTQgMTY6Mjk6MzQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IENoYW5nZSBpbnN0YWxsLnNoIHRvIGluc3RhbGwtc2guCisKK1dlZCBBcHIgIDIgMTg6NTE6MjAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogZ2VuLXN1cHBvcnQuYyAoZ2VuX3N1cHBvcnRfYyk6IHNpbS1zdGF0ZS5oIHJlbmFtZWQgdG8gc2ltLW1haW4uaC4KKwkqIGdlbi1pZGVjb2RlLmMgKGdlbl9pZGVjb2RlX2MpOiBMaWtld2lzZS4KKwkqIGlnZW4uYyAoZ2VuX3NlbWFudGljc19jKTogTGlrZXdpc2UuCisKK01vbiBNYXIgMjQgMTA6MTA6MDggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2JvZHkpOiBObyBsb25nZXIgZGVmaW5lIGNwdS9zZCwKKyAJc3VwcG9ydC5oIG5vdyBkZWZpbmVzIENQVS9TRCBnbG9iYWxseS4KKworCSogZ2VuLW1vZGVsLmMgKGdlbl9tb2RlbF9oKTogRGl0dG8uCisKKwkqIGdlbi1pZGVjb2RlLmMgKHByaW50X2lkZWNvZGVfaXNzdWVfZnVuY3Rpb25fYm9keSk6IERpdHRvLgorCShwcmludF9qdW1wKTogRGl0dG8uCisJKHByaW50X2p1bXBfdW50aWxfc3RvcF9ib2R5KTogRGl0dG8uCisJKHByaW50X2lkZWNvZGVfdmFsaWRhdGUpOiBEaXR0by4KKworCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfYm9keSk6IERpdHRvLgorCisJKiBnZW4tc2VtYW50aWNzLmMgKHByaW50X3NlbWFudGljX2JvZHkpOiBEaXR0by4KKworCSogaWdlbi5jIChwcmludF9zZW1hbnRpY19mdW5jdGlvbl9mb3JtYWwpOiBSZW5hbWUgY3B1IHRvIHNpbV9jcHUsCisgCXByb2Nlc3NvciB0byBjcHUuCisJKHByaW50X2ljYWNoZV9mdW5jdGlvbl9mb3JtYWwpOiBEaXR0by4KKworCSogZ2VuLXN1cHBvcnQuYyAocHJpbnRfc3VwcG9ydF9mdW5jdGlvbl9uYW1lKTogSW5jbHVkZSBzZC9jcHUgYXJnCisgCWluIHN1cHBvcnQgZnVuY3Rpb24gYXJndW1lbnQgbGlzdC4KKwkoc3VwcG9ydF9jX2Z1bmN0aW9uKTogR2VuZXJhdGUgY29kZSB0byBjcHUvc2QgZnJvbSBzZC9jcHUuCisJKGdlbl9zdXBwb3J0X2gpOiBEZWZpbmUgX1NEIHRoZSBhcmd1bWVudCBwcmVmaXggZm9yIGFsbCBzdXBwb3J0CisgCWZ1bmN0aW9ucy4gIERlZmluZSBTRC9DUFUgdG8gZGV0ZXJtaW5lIHNkL2NwdSBmcm9tIHZhbHVlIG9mIF9TRAorCW1hY3JvLgorCitUdWUgTWFyIDE4IDE1OjUyOjI0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBnZW4tc3VwcG9ydC5jIChnZW5fc3VwcG9ydF9jKTogVXBkYXRlIGZvciByZW5hbWluZyBvZiBlbmdpbmUgdG8KKyAJc2ltLXN0YXRlLgorCQorCSogaWdlbi5jOiBEaXR0by4KKwkqIGdlbi1pZGVjb2RlLmMgKGdlbl9pZGVjb2RlX2MpOiBEaXR0by4KKworTW9uIE1hciAxNyAxNToxNzowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogbGQtZGVjb2RlLmMgKGxvYWRfZGVjb2RlX3RhYmxlKTogUmVuYW1lIHNsYXNoIHRvIHJlc2VydmVkLgorCShkdW1wX2RlY29kZV9ydWxlKTogRGl0dG8uCisKKwkqIGxkLWluc24uYyAocGFyc2VfaW5zbl9mb3JtYXQpOiBEaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBgLycgLQorIAlyZXNlcnZlZCBiaXQgLSBhbmQgYSBgKicgLSB3aWxkIGNhcmQuCisJKHBhcnNlX2luc25fZm9ybWF0KTogQ2hhbmdlIGlzX3NsYXNoIHRvIG1vcmUgaW5mb3JtYXRpdmUgcmVzZXJ2ZWQuCisJKGR1bXBfaW5zbl9maWVsZCk6IERpdHRvLgorCShpbnNuX2ZpZWxkX2lzX2NvbnN0YW50KTogRGl0dG8uCisJKGluc25fdGFibGVfZXhwYW5kX29wY29kZSk6IERpdHRvLgorCisJKiBnZW4taWRlY29kZS5jIChwcmludF9pZGVjb2RlX3ZhbGlkYXRlKTogTWFrZSBjaGVja19tYXNrIGFuZAorIAljaGVja192YWwgdGhlIGNvcnJlY3QgaW50ZWdlciBzaXplLgorCShwcmludF9pZGVjb2RlX3ZhbGlkYXRlKTogRml4IHJlc2VydmVkIGJpdCBjaGVjayBmb3IgNjQgYml0CisgCXRhcmdldHMuCisKK0ZyaSBNYXIgMTQgMTE6MjQ6MDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGxkLWluc24uYyAocGFyc2VfaW5zbl9mb3JtYXQpOiBBY2NlcHQgJyonIGFzIGFuIGFsdGVybmF0aXZlIG9mCisgCWAvJyBpbiBiaXQgZmllbGRzLiAgYC8nIGRlbm90ZXMgYSB3aWxkIGJpdC4KKworRnJpIE1hciAgNyAxODoyMDozOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogaWdlbi5oLCBpZ2VuLmMgKG1haW4pOiBOZXcgb3B0aW9ucy4gQ29udHJvbCBnZW5lcmF0aW9uIG9mCisgCWNvbmRpdGlvbmFsIGlzc3VlIGFuZCBzbG90IHZlcmlmaWNhdGlvbiBjb2RlLgorCitGcmkgTWFyICA3IDE4OjE3OjI1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBnZW4tc3VwcG9ydC5jIChwcmludF9zdXBwb3J0X2Z1bmN0aW9uX25hbWUpOiBQcmVwZW5kIHRoZSBnbG9iYWwKKyAJbmFtZSBwcmVmaXggd2hlbiBhcHBsaWNhYmxlLiAgUHJvdmlkZSAjZGVmaW5lIHRvIG1hcCB0aGUgdXNlcgorIAlzcGVjaWZpZWQgbmFtZSB0aGUgZ2VuZXJhdGVkIGdsb2JhbHkgdW5pcXVlIG9uZS4KKworRnJpIE1hciAgNyAxODowNzo0NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogZ2VuLWlkZWNvZGUuYyAocHJpbnRfaWRlY29kZV92YWxpZGF0ZSk6IFdyYXAgZWFjaCBvZiB0aGUgY2hlY2tzCisgCS0gcmVzZXJ2ZWQgYml0cywgZmxvYXRpbmcgcG9pbnQgYW5kIHNsb3QgdmFsaWRhdGlvbiAtIHdpdGggYQorIAkjaWZkZWYgc28gdGhhdCB0aGV5IGFyZSBvcHRpb25hbC4KKwkKK0ZyaSBNYXIgIDcgMTY6MzU6MTMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGdlbi1pZGVjb2RlLmMgKGVycm9yX2xlYWZfY29udGFpbnNfbXVsdGlwbGVfaW5zbik6IE5ldyBmdW5jdGlvbgorIAktIHJlcG9ydCB0aGUgZXJyb3Igb2YgYSBsZWFmIG5vZGUgaW4gdGhlIGRlY2lzaW9uIHRyZWUgY29udGFpbmluZworIAlzZXZlcmFsIGluc3RydWN0aW9ucy4KKwkocHJpbnRfaWRlY29kZV90YWJsZV9sZWFmKTogRGV0ZWN0IGEgbGVhZiB3aXRoIG11bHRpcGxlIGluc3RydWN0aW9ucy4KKwkocHJpbnRfaWRlY29kZV9zd2l0Y2hfbGVhZik6IERpdHRvLgorCisJKiBnZW4tc2VtYW50aWNzLmgsIGdlbi1zZW1hbnRpY3MuYyAocHJpbnRfaWRlY29kZV9pbGxlZ2FsLAorIAlwcmludF9pZGVjb2RlX2ludmFsaWQpOiBSZW5hbWUgZm9ybWVyIHRvIGxhdHRlci4gIEFkZCBhcmd1bWVudCBzbworIAl0aGF0IG9uZSBmdW5jdGlvbiBjYW4gZ2VuZXJhdGUgYWxsIGludmFsaWQgaW5zdHJ1Y3Rpb24gY2FzZXMgLQorIAlpbGxlZ2FsLCBmcC11bmF2YWlsYWJsZSwgd3Jvbmctc2xvdC4KKwkqIGdlbi1lbmdpbmUuYzogVXBkYXRlLgorCisJKiBnZW4taWRlY29kZS5jOiBVc2UgcHJpbnRfaWRlY29kZV9pbnZhbGlkIHRvIGdlbmVyYXRlIGEgZnVuY3Rpb24KKyAJY2FsbCBmb3IgY2FzZXMgd2hlbiBmcC11bmF2YWlsYWJsZSBhbmQgdGhlIHNsb3QgaXMgd3JvbmcuCisKKwkqIGdlbi1pZGVjb2RlLmMgKHByaW50X2lkZWNvZGVfdmFsaWRhdGUpOiBOZXcgY2hlY2ssIGdlbmVyYXRlIGNvZGUKKyAJdG8gdmVyaWZ5IHRoYXQgdGhlIGluc3RydWN0aW9uIHNsb3QgaXMgY29ycmVjdC4KKwkKKwkqIGlnZW4uYyAobWFpbik6IFNpbXBsaWZ5IG9wdGlvbnMuCisKK1dlZCBNYXIgIDUgMDk6NTU6NTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGlnZW4uYyAocHJpbnRfaXRyYWNlKTogUmVtb3ZlIHNvdXJjZSBsaW5lIHJlZmVyZW5jZSBmb3IgdHJhY2UKKyAJY29kZSAtIGxldCB0aGUgdXNlciBzZWUgdGhlIGdlbmVyYXRlZCBmaWxlLgorCShwcmludF9pdHJhY2UpOiBQcmludCB0aGUgdHJhY2UgY29kZSByYXRoZXIgdGhhbiByZWZlcmVuY2UgYQorCW1hY3JvLgorCitUdWUgTWFyICA0IDE3OjMxOjU1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBpZ2VuLmMgKHByaW50X3NlbWFudGljX2Z1bmN0aW9uX2FjdHVhbCk6IFBhc3MgZWl0aGVyIHRoZQorIAlwcm9jZXNzb3IgLSBzbXAgLSBvciB0aGUgZW5naW5lIC0gbW9ubyAtIGludG8gc2VtYW50aWMgZnVuY3Rpb25zLgorICAJRG9uJ3QgcGFzcyBpbiBib3RoLgorCisJKiBnZW4taWNhY2hlLmMgKHByaW50X2ljYWNoZV9ib2R5KTogRGVwZW5kYW50IG9uIHNtcCwgZGVyaXZlCisgCXByb2Nlc3NvciBmcm9tIGVuZ2luZSBvciBlbmdpbmUgZnJvbSBwcm9jZXNzb3IsIGFuZCBoZW5jZSBlbnN1cmluZworIAl0aGF0IGJvdGggYXJlIGRlZmluZWQgaW4gYWxsIHNlbWFudGljIGZ1bmN0aW9ucy4KKworTW9uIE1hciAgMyAxNzoxMToyMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogbGQtaW5zbi5jIChwYXJzZV9pbnNuX2Zvcm1hdCk6IE1ha2UgdGhlIHdpZHRoIGZpZWxkIG9wdGlvbmFsLgorICAJSWYgbWlzc2luZyBhc3N1bWUgdGhhdCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHZhbHVlCisgCWRldGVybWluZXMgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBmaWVsZC4KKwkKK1RodSBGZWIgMjcgMTE6Mjc6NDggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGxkLWluc24uYyAoaW5zbl90YWJsZV9leHBhbmRfb3Bjb2RlKTogUmVwbGFjZSBhc3NlcnRpb24gd2l0aAorIAltb3JlIHVzZWZ1bCBlcnJvciBtZXNzYWdlLgorCitUdWUgRmViIDI1IDE2OjQzOjI3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBtaXNjLmMgKGVycm9yKTogT3V0cHV0IGVycm9ycyBvbiBzdGRlcnIuCisKKwkqIGxkLWluc24uYyAocGFyc2VfaW5zbl9mb3JtYXQpOiBTa2lwIGFueSBsZWFkaW5nIHNwYWNlcy4KKyAgCVZlcmlmeSB0aGUgd2lkdGggb2YgaW5zdHJ1Y3Rpb25zIGJlaW5nIHBhcnNlZC4KKworCSogdGFibGUuYyAodGFibGVfZW50cnlfcmVhZCk6IFBhcnNlIENQUCdzIGNvbnZlbnRpb24gZm9yCisgCXNwZWNpZnlpbmcgb3JpZ2luYWwgZmlsZSBuYW1lL2xpbmUtbnIuCisKK1dlZCBGZWIgMTkgMTI6MzA6MjggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjcml0dGVycy5jeWdudXMuY29tPgorCisJKiBsZC1pbnNuLmMgKHBhcnNlX2luc25fZm9ybWF0KTogQWxsb3cgdHJhaWxpbmcgc3BhY2VzIGluCisgCWluc3RydWN0aW9uIGZpZWxkcy4KKworCSogTWFrZWZpbGUuaW46IENyZWF0ZSB1c2luZyAuLi9wcGMvTWFrZWZpbGUuaW4gYXMgYSBzdGFydGluZworIAlwb2ludC4KKwkqIGNvbmZpZ3VyZS5pbjogRGl0dG8gdmlzIC4uL3BwYy9jb25maWd1cmUuaW4KKwkKK01vbiBGZWIgMTcgMTA6NDQ6MTggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjcml0dGVycy5jeWdudXMuY29tPgorCisJKiBnZW4tc3VwcG9ydC5jIChnZW5fc3VwcG9ydF9jKTogQWx3YXlzIGluY2x1ZGUgZW5naW5lLmggaW5zdGVhZAorIAlvZiBjcHUuaAorCSogZ2VuLWlkZWNvZGUuYyAoZ2VuX2lkZWNvZGVfYyk6IERpdHRvLgorCisJKiB3b3Jkcy5oIChpbnN0cnVjdGlvbl93b3JkKTogUmVtb3ZlIGluc3RydWN0aW9uX3dvcmQgLSBub3cKKyAJZ2VuZXJhdGVkIGJ5IGlnZW4uCisJKGFkZHJlc3Nfd29yZCk6IE5ldy4gIFVzZWQgYnkgaWdlbi4KKwkKKwkqIGxmLmMgKGxmX3ByaW50X2Z1bmN0aW9uX3R5cGVfZnVuY3Rpb24pOiBOZXcsIHBhc3MgYSBmdW5jdGlvbiB0bworIAlwcmludCBvdXQgdGhlIHR5cGUgaW5zdGVhZCBvZiBhIGNvbnN0YW50IHN0cmluZy4KKwkKKwkqIGlnZW4uaCwgaWdlbi5jIChwcmludF9zZW1hbnRpY19mdW5jdGlvbl9mb3JtYWwsCisgCVNFTUFOVElDX0ZVTkNUSU9OX0ZPUk1BTCk6IFJlbGFjZSBtYWNybyB3aXRoIGZ1bmN0aW9uLgorCShwcmludF9zZW1hbnRpY19mdW5jdGlvbl9hY3R1YWwsIFNFTUFOVElDX0ZVTkNUSU9OX0FDVFVBTCk6IERpdHRvLgorCShwcmludF9zZW1hbnRpY19mdW5jdGlvbl90eXBlLCBTRU1BTlRJQ19GVU5DVElPTl9UWVBFKTogRGl0dG8uCisJKHByaW50X2ljYWNoZV9mdW5jdGlvbl90eXBlLCBJQ0FDSEVfRlVOQ1RJT05fVFlQRSk6IERpdHRvLgorCShwcmludF9pY2FjaGVfZnVuY3Rpb25fZm9ybWFsLCBJQ0FDSEVfRlVOQ1RJT05fRk9STUFMKTogRGl0dG8uCisJKHByaW50X2ljYWNoZV9mdW5jdGlvbl9hY3R1YWwsIElDQUNIRV9GVU5DVElPTl9BQ1RVQUwpOiBEaXR0by4KKwkqIGdlbi1pZGVjb2RlLmMgKHByaW50X2lkZWNvZGVfdGFibGUpOiBVcGRhdGUuCisJKGlkZWNvZGVfc3dpdGNoX2xlYWYpOiBVcGRhdGUuCisJKHByaW50X2lkZWNvZGVfc3dpdGNoX2Z1bmN0aW9uX2hlYWRlcik6IERpdHRvLgorCShwcmludF9pZGVjb2RlX2Zsb2F0aW5nX3BvaW50X3VuYXZhaWxhYmxlKTogRGl0dG8uCisJKHByaW50X2lkZWNvZGVfaXNzdWVfZnVuY3Rpb25faGVhZGVyKTogRGl0dG8uCisJKiBpZ2VuLmMgKGdlbl9pY2FjaGVfaCk6IERpdHRvLgorCSogZ2VuLWVuZ2luZS5jIChwcmludF9lbmdpbmVfdGFibGUpOiBEaXR0by4KKwkoZW5naW5lX3N3aXRjaF9sZWFmKTogRGl0dG8uCisJKiBnZW4tc3VwcG9ydC5jIChwcmludF9zdXBwb3J0X2Z1bmN0aW9uX25hbWUpOiBEaXR0by4KKwkqIGdlbi1zZW1hbnRpY3MuYyAocHJpbnRfc2VtYW50aWNfZnVuY3Rpb25faGVhZGVyKTogVXBkYXRlLgorCVVwZGF0ZS4KKwkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2Z1bmN0aW9uX2hlYWRlcik6IFVwZGF0ZS4KKwkocHJpbnRfaWNhY2hlX2Z1bmN0aW9uKTogVXBkYXRlLgorCShwcmludF9pY2FjaGVfaW50ZXJuYWxfZnVuY3Rpb25fZGVjbGFyYXRpb24pOiBVcGRhdGUuCisJKHByaW50X2ljYWNoZV9pbnRlcm5hbF9mdW5jdGlvbl9kZWZpbml0aW9uKTogVXBkYXRlLgorCisJKiBnZW4taWRlY29kZS5jIChnZW5faWRlY29kZV9oKTogRHJvcCBpbmNsdWRpbmcgb2YgaWRlY29kZV8qLmgKKyAJZmlsZXMsIHdpbGwgYXQgc29tZSBzdGFnZSBuZWVkIHRvIG1vdmUgaXQgaW50byBzdXBwb3J0LgorCisJKiBpZ2VuLmgsIGlnZW4uYyAobWFpbik6IE5ldyBvcHRpb24gLWUgPGVuZ2luZT4gLSBnZW5lcmF0ZSBhIGZ1bGwKKyAJc2ltdWxhdGlvbiBlbmdpbmUuICBQcmV2aW91c2x5IHRoaXMgd2FzIHRoZSAtZCA8aWRlY29kZS1maWxlPgorIAlvcHRpb24uCisJKiBnZW4tZW5naW5lLmgsIGdlbi1lbmdpbmUuYzogQ29waWVzIG9mIGdlbi1pZGVjb2RlLiouICBXaWxsIG5lZWQKKyAJdG8gY2xlYW4gdGhlc2UgdXAgc28gdGhhdCB0aGF0IGNhbGwgdXBvbiB0aGUgdXBkYXRlZCBnZW4taWRlY29kZQorCWNvZGUuCisJCisJKiBnZW4taWRlY29kZS5oLCBnZW4taWRlY29kZS5jOiBQcnVuZSBvdXQgYW55IGNvZGUgbm90IHJlbGV2YW50IHRvCisgCWdlbmVyYXRpbmcgYSBkZWNvZGUgdGFibGUuCisJCisJKiBNYWtlZmlsZS5pbiAoaWdlbik6IEFkZCBkZXBlbmRlbmNpZXMgZm9yIG5ldyBnZW4tZW5naW5lLiogZmlsZXMuCisKKwkqIGlnZW4uaCwgaWdlbi5jIChtYWluKTogTmV3IG9wdGlvbiAtTSAtIENvbnRyb2wgd2hhdCBpcyByZXR1cm5lZAorIAlieSBzZW1hbnRpYyBmdW5jdGlvbnMgLSAtMS9OSUEgdnMgQ0lBK04vTklBLiAgQWRkCisgCWdlbmVyYXRlX3NlbWFudGljX3JldHVybmluZ19tb2RpZmllZF9uaWFfb25seSB0byBpZ2VuX2NvZGUgZW51bS4KKwkqIGdlbi1zZW1hbnRpY3MuYyAocHJpbnRfc2VtYW50aWNfYm9keSk6IEFzIGFuIGFsdGVybmF0aXZlLCBtYWtlCisgCU5JQSA9PSAtMSBpbnN0ZWFkIG9mIENJQStpbnNuX3NpemUgYnkgZGVmYXVsdC4KKwkKKwkqIGlnZW4uaCwgaWdlbi5jIChtYWluLCBnbG9iYWxfbmFtZV9wcmVmaXgsIGdsb2JhbF91bmFtZV9wcmVmaXgpOgorIAlOZXcgb3B0aW9uIC1QIDxwcmVmaXg+IC0gUHJlcGVuZCBhbGwgZ2VuZXJhdGVkIGZ1bmN0aW9ucyB3aXRoIHRoZQorIAlzcGVjaWZpZWQgcHJlZml4LgorCShnZW5faWRlY29kZV9jKTogQWRqdXN0LgorCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfc3RydWN0KTogRGl0dG8uCisJKiBnZW4tc3VwcG9ydC5jIChnZW5fc3VwcG9ydF9jKTogRGl0dG8uCisKK1N1biBGZWIgMTYgMTU6MjM6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjcml0dGVycy5jeWdudXMuY29tPgorCisJKiBpZ2VuLmMgKG1haW4pOiBDb3JyZWN0IHVzYWdlLiBNaXNzbGVhZGluZyBtZXNzYWdlIGFib3V0IHVjYXNlCisgCW9wdGlvbnMgZHVtcGluZyBpbnRlcm5hbCB0YWJsZXMuICAtRiBub3cgaW5jbHVkZXMgcmF0aGVyIHRoZW4KKyAJZXhjbHVkZXMgaW5zdHJ1Y3Rpb25zLgorCisJKiBtaXNjLmgsIG1pc2MuYyAoYTJpKTogTWFrZSA2NGJpdC4KKworCSogbGQtaW5zbi5oIChtYXhfaW5zbl9iaXRfc2l6ZSwgZGVmYXVsdF9pbnNuX2JpdF9zaXplKTogSW5jcmVhc2UKKyAJbWF4IHRvIDY0Yml0cywgZXhwZWN0IHRyb3VibGUuICBNYWtlIHRoZSBkZWZhdWx0IDMyIGJpdHMuCisJKiBnZW4taWRlY29kZS5jIChwcmludF9pZGVjb2RlX3RhYmxlKTogQ2hhbmdlIEVYVFJBQ1RFRCoKKyAJZXQuYWwuIG1hY3JvJ3MgdG8gdXNlIHRoZSBpbnNuX2JpdF9zaXplIGluc3RlYWQgb2YgYXNzdW1pbmcgMzIKKyAJYml0cy4KKwkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2V4dHJhY3Rpb24pOiBEaXR0by4KKwkqIGdlbi1pZGVjb2RlLmMgKGlkZWNvZGVfc3dpdGNoX3N0YXJ0KTogRGl0dG8uCisJKiBnZW4taWRlY29kZS5jIChnZW5faWRlY29kZV9jKTogRGl0dG8KKworCSogaWdlbi5oIChpbnNuX3NwZWNpZnlpbmdfd2lkdGhzKSwgaWdlbi5jIChtYWluKTogTmV3IG9wdGlvbiAtVy4KKyAgCUluZGljYXRlcyB0aGF0IHRoZSBpbnN0cnVjdGlvbiBmaWVsZCBvZiB0aGUgdGFibGUgaXMgc3BlY2lmeWluZworIAliaXQgd2lkdGhzIGluc3RlYWQgb2YgYml0IG9mZnNldHMuCisJKiBsZC1pbnNuLmMgKHBhcnNlX2luc25fZm9ybWF0KTogUGFyc2UgaW5zdHJ1Y3Rpb24gZmllbGRzCisgCXNwZWNpZnlpbmcgd2lkdGhzLgorCisJKiBtaXNjLmMgKGEyaSk6IEFsbG93IGJpbmFyeSBudW1iZXJzIHRvIGJlIHNwZWNpZmllZCB1c2luZyB0aGUKKyAJc3ludGF4IDBiTk5OTi4KKwkqIGxkLWluc24uYzogQWxsb3cgc3VjaCBudW1iZXJzIHRvIGFwcGVhciBpbiB0aGUgaW5zdHJ1Y3Rpb24KKyAJZm9ybWF0LgorCisJKiB0YWJsZS5jICh0YWJsZV9lbnRyeV9yZWFkKTogTWFrZSAvLyBhIHZhbGlkIGNvbW1lbnQgY2hhcmFjdGVyLgorCSh0YWJsZV9lbnRyeV9yZWFkKTogU2tpcCBsaW5lcyBjb250YWluaW5nIGEgbGVhZGluZyAiIC0gdGhlc2UgbWF5CisgCWV2ZW50dWFsbHkgYmUgdXNlZCBpbiBhIGRpc2FzZW1ibGVyLgorCitGcmkgRmViIDE0IDE1OjIzOjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY3JpdHRlcnMuY3lnbnVzLmNvbT4KKworCSogZmlsdGVyLmMsIGZpbHRlci5oLCBnZW4tZW5naW5lLmMsIGdlbi1lbmdpbmUuaCwgZ2VuLWljYWNoZS5jLAorIAlnZW4taWNhY2hlLmgsIGdlbi1pZGVjb2RlLmMsIGdlbi1pZGVjb2RlLmgsIGdlbi1pdGFibGUuYywKKyAJZ2VuLWl0YWJsZS5oLCBnZW4tbW9kZWwuYywgZ2VuLW1vZGVsLmgsIGdlbi1zZW1hbnRpY3MuYywKKyAJZ2VuLXNlbWFudGljcy5oLCBnZW4tc3VwcG9ydC5jLCBnZW4tc3VwcG9ydC5oLCBpZ2VuLmMsIGlnZW4uaCwKKyAJbGQtY2FjaGUuYywgbGQtY2FjaGUuaCwgbGQtZGVjb2RlLmMsIGxkLWRlY29kZS5oLCBsZC1pbnNuLmMsCisgCWxkLWluc24uaCwgbGYuYywgbGYuaCwgbWlzYy5jLCBtaXNjLmgsIHRhYmxlLmMsIHRhYmxlLmg6IENvcHkgaW4KKyAJZnJvbSB0aGUgLi4vcHBjIGRpcmVjdG9yeS4KKworCSogZmlsdGVyX2hvc3QuYywgZmlsdGVyX2hvc3QuaDogQ29weSBpbiBmcm9tIHRoZSAuLi9wcGMgZGlyZWN0b3J5CisgCXJlbmFtaW5nIGZyb20gZmlsdGVyX2ZpbGVuYW1lLltoY10KZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL01ha2VmaWxlLmluIGIvc2ltL2lnZW4vTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGExZDI1YQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9pZ2VuL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTc3IEBACisjCisjICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisKK2RlZmF1bHQ6IGFsbAorCitWUEFUSCA9IEBzcmNkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3Jjcm9vdCA9ICQoc3JjZGlyKS8uLi8uLgorCitwcmVmaXggPSBAcHJlZml4QAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACisKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitiaW5kaXIgPSBAYmluZGlyQAorbGliZGlyID0gQGxpYmRpckAKK3Rvb2xkaXIgPSAkKGxpYmRpcikvJCh0YXJnZXRfYWxpYXMpCisKK2RhdGFkaXIgPSBAZGF0YWRpckAKK21hbmRpciA9IEBtYW5kaXJACittYW4xZGlyID0gJChtYW5kaXIpL21hbjEKK21hbjJkaXIgPSAkKG1hbmRpcikvbWFuMgorbWFuM2RpciA9ICQobWFuZGlyKS9tYW4zCittYW40ZGlyID0gJChtYW5kaXIpL21hbjQKK21hbjVkaXIgPSAkKG1hbmRpcikvbWFuNQorbWFuNmRpciA9ICQobWFuZGlyKS9tYW42CittYW43ZGlyID0gJChtYW5kaXIpL21hbjcKK21hbjhkaXIgPSAkKG1hbmRpcikvbWFuOAorbWFuOWRpciA9ICQobWFuZGlyKS9tYW45CitpbmZvZGlyID0gQGluZm9kaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACisKK1NIRUxMID0gQFNIRUxMQAorCitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKKworQVIgPSBAQVJACitDQyA9IEBDQ0AKK0NGTEFHUyA9IEBDRkxBR1NACitSQU5MSUIgPSBAUkFOTElCQAorCitBUl9GT1JfQlVJTEQgPSBAQVJfRk9SX0JVSUxEQAorQVJfRkxBR1NfRk9SX0JVSUxEID0gQEFSX0ZMQUdTX0ZPUl9CVUlMREAKK0NDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACitDRkxBR1NfRk9SX0JVSUxEID0gQENGTEFHU19GT1JfQlVJTERACitSQU5MSUJfRk9SX0JVSUxEID0gQFJBTkxJQl9GT1JfQlVJTERACisKK1NJTV9XQVJOSU5HUyA9IEBidWlsZF93YXJuaW5nc0AKKworQklTT04gPSBiaXNvbgorTUFLRUlORk8gPSBtYWtlaW5mbworCisuTk9FWFBPUlQ6CitNQUtFT1ZFUlJJREVTPQorCitMSUJfSU5DTFVERVMJPSAtSSQoc3JjZGlyKS8uLi8uLi9pbmNsdWRlCitJTkNMVURFUwk9IC1JLiAtSSQoc3JjZGlyKSAkKExJQl9JTkNMVURFUykKKworTElCSUJFUlRZX0xJQgk9IEBMSUJJQkVSVFlfTElCQAorCitCVUlMRF9DRkxBR1MgPSAkKENGTEFHU19GT1JfQlVJTEQpICQoU0lNX1dBUk5JTkdTKSAkKElOQ0xVREVTKSAtTzAKK0JVSUxEX0xERkxBR1MgPSAKKworYWxsOglpZ2VuCisjYWxsOgl0bXAtZmlsdGVyIHRtcC10YWJsZSB0bXAtbGQtaW5zbiB0bXAtbGQtY2FjaGUgdG1wLWxkLWRlY29kZSB0bXAtZ2VuCisKKy5jLm86CisJJChDQ19GT1JfQlVJTEQpIC1jICQoQlVJTERfQ0ZMQUdTKSAkPAorCisKK2ZpbHRlcl9maWxlbmFtZS5vOiBmaWx0ZXJfZmlsZW5hbWUuYyBmaWx0ZXJfZmlsZW5hbWUuaCBjb25maWcuaCBwcGMtY29uZmlnLmgKKworSUdFTl9PQkpTPVwKKwl0YWJsZS5vIFwKKwlsZi5vIG1pc2MubyBcCisJZmlsdGVyX2hvc3QubyBcCisJbGQtZGVjb2RlLm8gXAorCWxkLWNhY2hlLm8gXAorCWZpbHRlci5vIFwKKwlsZC1pbnNuLm8gXAorCWdlbi1tb2RlbC5vIFwKKwlnZW4taXRhYmxlLm8gXAorCWdlbi1pY2FjaGUubyBcCisJZ2VuLXNlbWFudGljcy5vIFwKKwlnZW4taWRlY29kZS5vIFwKKwlnZW4tc3VwcG9ydC5vIFwKKwlnZW4tZW5naW5lLm8gXAorCWdlbi5vCisKK2lnZW46IGlnZW4ubyAkKElHRU5fT0JKUykKKwkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9MREZMQUdTKSAtbyBpZ2VuIGlnZW4ubyAkKElHRU5fT0JKUykgJChMSUJJQkVSVFlfTElCKQorCitpZ2VuLm86IGlnZW4uYyBtaXNjLmggZmlsdGVyX2hvc3QuaCBsZi5oIHRhYmxlLmggbGQtZGVjb2RlLmggbGQtY2FjaGUuaCBsZC1pbnNuLmggZmlsdGVyLmggZ2VuLW1vZGVsLmggZ2VuLWl0YWJsZS5oIGdlbi1pY2FjaGUuaCBnZW4taWRlY29kZS5oIGdlbi1lbmdpbmUuaCBnZW4tc2VtYW50aWNzLmggZ2VuLXN1cHBvcnQuaCBnZW4uaCBpZ2VuLmggCisJJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtYyAkKHNyY2RpcikvaWdlbi5jCisKK3RtcC10YWJsZTogdGFibGUuYyB0YWJsZS5oIG1pc2MubyBsZi5vIGZpbHRlcl9ob3N0Lm8gCisJJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAkKEJVSUxEX0xERkxBR1MpIC1vIHRtcC10YWJsZSAtRE1BSU4gJChzcmNkaXIpL3RhYmxlLmMgbWlzYy5vIGxmLm8gIGZpbHRlcl9ob3N0Lm8gJChCVUlMRF9MSUJTKQorCit0bXAtZmlsdGVyOiBmaWx0ZXIuYyBmaWx0ZXIuaCBsZi5vIG1pc2MubyBmaWx0ZXJfaG9zdC5vCisJJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAkKEJVSUxEX0xERkxBR1MpIC1vIHRtcC1maWx0ZXIgLURNQUlOICQoc3JjZGlyKS9maWx0ZXIuYyBsZi5vIG1pc2MubyBmaWx0ZXJfaG9zdC5vICQoQlVJTERfTElCUykKKwordG1wLWxkLWRlY29kZTogbGQtZGVjb2RlLmggbGQtZGVjb2RlLmMgZmlsdGVyLm8gbWlzYy5vIGxmLm8gdGFibGUubyBmaWx0ZXJfaG9zdC5vIGdlbi5oIGlnZW4uaAorCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgJChCVUlMRF9MREZMQUdTKSAtbyB0bXAtbGQtZGVjb2RlIC1ETUFJTiAkKHNyY2RpcikvbGQtZGVjb2RlLmMgZmlsdGVyLm8gbWlzYy5vIGxmLm8gdGFibGUubyBmaWx0ZXJfaG9zdC5vICQoQlVJTERfTElCUykKKwordG1wLWxkLWNhY2hlOiBsZC1jYWNoZS5jIGxkLWNhY2hlLmggbGQtaW5zbi5vIG1pc2MubyBsZi5vIHRhYmxlLm8gZmlsdGVyX2hvc3QubyBnZW4uaCBpZ2VuLmgKKwkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpICQoQlVJTERfTERGTEFHUykgLW8gdG1wLWxkLWNhY2hlIC1ETUFJTiAkKHNyY2RpcikvbGQtY2FjaGUuYyBsZC1pbnNuLm8gZmlsdGVyLm8gbWlzYy5vIGxmLm8gdGFibGUubyBmaWx0ZXJfaG9zdC5vICQoQlVJTERfTElCUykKKwordG1wLWxkLWluc246IGxkLWluc24uYyBsZC1pbnNuLmggbWlzYy5vIGxmLm8gdGFibGUubyBmaWx0ZXJfaG9zdC5vIGZpbHRlci5vIGdlbi5oIGlnZW4uaAorCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgJChCVUlMRF9MREZMQUdTKSAtbyB0bXAtbGQtaW5zbiAtRE1BSU4gJChzcmNkaXIpL2xkLWluc24uYyBtaXNjLm8gbGYubyB0YWJsZS5vIGZpbHRlcl9ob3N0Lm8gZmlsdGVyLm8gJChCVUlMRF9MSUJTKQorCit0bXAtZ2VuOiBnZW4uYyBnZW4uaCBsZC1pbnNuLm8gbGQtZGVjb2RlLm8gbWlzYy5vIGxmLm8gdGFibGUubyBmaWx0ZXJfaG9zdC5vIGZpbHRlci5vIGdlbi5oIGlnZW4uaAorCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgJChCVUlMRF9MREZMQUdTKSAtbyB0bXAtZ2VuIC1ETUFJTiAkKHNyY2RpcikvZ2VuLmMgbWlzYy5vIGxkLWluc24ubyBsZC1kZWNvZGUubyBsZi5vIHRhYmxlLm8gZmlsdGVyX2hvc3QubyBmaWx0ZXIubyAkKEJVSUxEX0xJQlMpCisKK2ZpbHRlcl9ob3N0Lm86IGZpbHRlcl9ob3N0LmMgZmlsdGVyX2hvc3QuaAordGFibGUubzogdGFibGUuYyBtaXNjLmggZmlsdGVyX2hvc3QuaCBsZi5oIHRhYmxlLmgKK2xmLm86IGxmLmMgbWlzYy5oIGZpbHRlcl9ob3N0LmggbGYuaAorZmlsdGVyLm86IGZpbHRlci5jIG1pc2MuaCBsZi5oIHRhYmxlLmggZmlsdGVyLmgKK2xkLWRlY29kZS5vOiBsZC1kZWNvZGUuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGxkLWRlY29kZS5oIGlnZW4uaAorbGQtY2FjaGUubzogbGQtY2FjaGUuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGxkLWNhY2hlLmggaWdlbi5oCitsZC1pbnNuLm86IGxkLWluc24uYyBtaXNjLmggbGYuaCB0YWJsZS5oIGxkLWluc24uaCBnZW4uaCBpZ2VuLmgKK2dlbi1tb2RlbC5vOiBnZW4tbW9kZWwuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGdlbi1tb2RlbC5oIGxkLWRlY29kZS5oIGdlbi5oIGlnZW4uaCBsZC1pbnNuLmgKK2dlbi1pdGFibGUubzogZ2VuLWl0YWJsZS5jIG1pc2MuaCBsZi5oIHRhYmxlLmggZ2VuLWl0YWJsZS5oIGxkLWRlY29kZS5oIGdlbi5oIGlnZW4uaCBsZC1pbnNuLmggZ2VuLmggZmlsdGVyLmgKK2dlbi1pY2FjaGUubzogZ2VuLWljYWNoZS5jIG1pc2MuaCBsZi5oIHRhYmxlLmggZ2VuLWljYWNoZS5oIGxkLWRlY29kZS5oIGdlbi5oIGlnZW4uaCBsZC1pbnNuLmggZ2VuLXNlbWFudGljcy5oIGdlbi1pZGVjb2RlLmggZmlsdGVyLmgKK2dlbi1zZW1hbnRpY3MubzogZ2VuLXNlbWFudGljcy5jIG1pc2MuaCBsZi5oIHRhYmxlLmggZ2VuLXNlbWFudGljcy5oIGxkLWRlY29kZS5oIGdlbi5oIGlnZW4uaCBsZC1pbnNuLmggZmlsdGVyLmgKK2dlbi1pZGVjb2RlLm86IGdlbi1pZGVjb2RlLmMgbWlzYy5oIGxmLmggdGFibGUuaCBnZW4taWRlY29kZS5oIGdlbi1pY2FjaGUuaCBnZW4tc2VtYW50aWNzLmggbGQtZGVjb2RlLmggZ2VuLmggaWdlbi5oIGxkLWluc24uaCAgZmlsdGVyLmgKK2dlbi1lbmdpbmUubzogZ2VuLWVuZ2luZS5jIG1pc2MuaCBsZi5oIHRhYmxlLmggZ2VuLWlkZWNvZGUuaCBnZW4tZW5naW5lLmggZ2VuLWljYWNoZS5oIGdlbi1zZW1hbnRpY3MuaCBsZC1kZWNvZGUuaCBnZW4uaCBpZ2VuLmggbGQtaW5zbi5oIGZpbHRlci5oCitnZW4tc3VwcG9ydC5vOiBnZW4tc3VwcG9ydC5jIG1pc2MuaCBsZi5oIHRhYmxlLmggZ2VuLXN1cHBvcnQuaCBsZC1kZWNvZGUuaCBnZW4uaCBpZ2VuLmggbGQtaW5zbi5oIGZpbHRlci5oCitnZW4ubzogZ2VuLmMgbWlzYy5oIGxmLmggdGFibGUuaCBnZW4taWNhY2hlLmggbGQtZGVjb2RlLmggZ2VuLmggaWdlbi5oIGxkLWluc24uaCBnZW4tc2VtYW50aWNzLmggZ2VuLWlkZWNvZGUuaCBmaWx0ZXIuaAorbWlzYy5vOiBtaXNjLmMgbWlzYy5oIGZpbHRlcl9ob3N0LmgKKworCit0YWdzIGV0YWdzOiBUQUdTCisKK1RBR1M6CisJZXRhZ3MgJChzcmNkaXIpLyouaCAkKHNyY2RpcikvKi5jCisKK2NsZWFuIG1vc3RseWNsZWFuOgorCXJtIC1mIHRtcC0qICouW29hc2ldIGNvcmUgaWdlbgorCitkaXN0Y2xlYW4gcmVhbGNsZWFuOiBjbGVhbgorCXJtIC1mIFRBR1MgTWFrZWZpbGUgY29uZmlnLmNhY2hlIGNvbmZpZy5zdGF0dXMgY29uZmlnLmggZGVmaW5lcy5oIHN0YW1wLWggY29uZmlnLmxvZworCittYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KKwlybSAtZiAqfiAqLmxvZyBwcGMtY29uZmlnLmggY29yZSAqLmNvcmUKKworTWFrZWZpbGU6IE1ha2VmaWxlLmluIGNvbmZpZy5zdGF0dXMKKwlDT05GSUdfRklMRVM9TWFrZWZpbGUgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCitjb25maWcuaDogc3RhbXAtaCA7IEB0cnVlCitzdGFtcC1oOiBjb25maWcuaW4gY29uZmlnLnN0YXR1cworCUNPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCitjb25maWcuc3RhdHVzOiBjb25maWd1cmUKKwkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCisKK2luc3RhbGw6CisjCmRpZmYgLS1naXQgYS9zaW0vaWdlbi9hY2NvbmZpZy5oIGIvc2ltL2lnZW4vYWNjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWI4N2ExCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2lnZW4vYWNjb25maWcuaApAQCAtMCwwICsxLDE1IEBACisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgY2F0Z2V0cyBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfQ0FUR0VUUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCisjdW5kZWYgSEFWRV9HRVRURVhUCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLworI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2NvbmZpZy5pbiBiL3NpbS9pZ2VuL2NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmNmNTE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2lnZW4vY29uZmlnLmluCkBAIC0wLDAgKzEsMzEgQEAKKy8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxkaXJlbnQuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfRElSRU5UX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmRpci5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9ORElSX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NUUklOR1NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19ESVJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvbmRpci5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfTkRJUl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19TVEFUX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19UWVBFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9VTklTVERfSApkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vY29uZmlndXJlIGIvc2ltL2lnZW4vY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJkNGY0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaWdlbi9jb25maWd1cmUKQEAgLTAsMCArMSwxODA2IEBACisjISAvYmluL3NoCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3NpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisjIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKKyMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KKworIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMworCisKKworCisKKyMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKKworCisjIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKKworCisjIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIEN5Z3dpbjMyLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgQ1lHV0lOMzIgdG8gInllcyIuCisjIE90aGVyd2lzZSBzZXQgaXQgdG8gIm5vIi4KKworCisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgV2luMzIsIHdpdGhvdXQgdXNpbmcKKyMgQUNfQ0FOT05JQ0FMXyouICBJZiBzbywgc2V0IG91dHB1dCB2YXJpYWJsZSBFWEVFWFQgdG8gIi5leGUiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICIiLgorCisKKworCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtYnVpbGQtd2FybmluZ3NbPUxJU1RdCQlFbmFibGUgYnVpbGQtdGltZSBjb21waWxlciB3YXJuaW5ncyIKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2J1aWxkPU5PTkUKK2NhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2V4ZWNfcHJlZml4PU5PTkUKK2hvc3Q9Tk9ORQorbm9fY3JlYXRlPQorbm9ub3B0PU5PTkUKK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3RhcmdldD1OT05FCit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorc3ViZGlycz0KK01GTEFHUz0gTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT10YWJsZS5oCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19wcm9nPSQwCisgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCisKKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgLiAkY2FjaGVfZmlsZQorZWxzZQorICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgPiAkY2FjaGVfZmlsZQorZmkKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworYWNfZXhlZXh0PQorYWNfb2JqZXh0PW8KK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCithY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKK2FjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY5MTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCisgICAgY2FzZSAiJGFjX2Rpci8iIGluCisgICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7CisgICAgKikKKyAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAgICMgYnkgZGVmYXVsdC4KKyAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbHNlCisJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKKwkgICAgYnJlYWsgMgorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9JRlMiCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKyAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCisgICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCisgIGZpCitmaQorZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzQ0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3NzM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4MjM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjg1NDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODY0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK21haW4oKXtyZXR1cm4oMCk7fQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjg2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCisgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKyAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubworICBlbHNlCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKKyAgZmkKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjg4ODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Citjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjg5MzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTAyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkyMTogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKK2lmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfY2NfZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1idWlsZC13YXJuaW5ncyBvciAtLWRpc2FibGUtYnVpbGQtd2FybmluZ3Mgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfYnVpbGRfd2FybmluZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2J1aWxkX3dhcm5pbmdzIgorICBidWlsZF93YXJuaW5ncz0iLVdhbGwgLVdwb2ludGVyLWFyaXRoIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyIKK2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQk7OworICBubykJYnVpbGRfd2FybmluZ3M9Ii13Ijs7CisgICwqKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAorCWJ1aWxkX3dhcm5pbmdzPSIke2J1aWxkX3dhcm5pbmdzfSAke3R9Ijs7CisgICosKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAorCWJ1aWxkX3dhcm5pbmdzPSIke3R9ICR7YnVpbGRfd2FybmluZ3N9Ijs7CisgICopCWJ1aWxkX3dhcm5pbmdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJGJ1aWxkX3dhcm5pbmdzIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyB3YXJuaW5nIGZsYWdzID0gJGJ1aWxkX3dhcm5pbmdzIiA2PiYxCitmaQorZWxzZQorICBidWlsZF93YXJuaW5ncz0iIgorZmkKKworCisjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIiAtYSAieCRob3N0IiAhPSAieGkzODYtd2luZG93cyI7IHRoZW4KKyAgQVJfRk9SX0JVSUxEPSckKEFSKScKKyAgQVJfRkxBR1NfRk9SX0JVSUxEPSckKEFSX0ZMQUdTKScKKyAgQ0NfRk9SX0JVSUxEPSckKENDKScKKyAgQ0ZMQUdTX0ZPUl9CVUlMRD0nJChDRkxBR1MpJworICBSQU5MSUJfRk9SX0JVSUxEPSckKFJBTkxJQiknCisgIExJQklCRVJUWV9MSUI9Li4vLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCitlbHNlCisgIEFSX0ZPUl9CVUlMRD0ke0FSX0ZPUl9CVUlMRC1hcn0KKyAgQVJfRkxBR1NfRk9SX0JVSUxEPSR7QVJfRkxBR1NfRk9SX0JVSUxELXJjfQorICBDQ19GT1JfQlVJTEQ9JHtDQ19GT1JfQlVJTEQtZ2NjfQorICBDRkxBR1NfRk9SX0JVSUxEPSR7Q0ZMQUdTX0ZPUl9CVUlMRC0iLWcifQorICBSQU5MSUJfRk9SX0JVSUxEPSR7UkFOTElCX0ZPUl9CVUlMRC1yYW5saWJ9CisgIExJQklCRVJUWV9MSUI9CitmaQorCisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA0MDogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisKK2hvc3RfYWxpYXM9JGhvc3QKK2Nhc2UgIiRob3N0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpCisgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpIDs7CisgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2hvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAoraG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDYxOiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorCit0YXJnZXRfYWxpYXM9JHRhcmdldAorY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCit0YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCit0YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDc5OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9CitlbHNlCisgICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KKyAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAorcyxcXCxcXFxcLGc7IHMsXCQsJCQsZworRU9GX1NFRAorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgorICBybSAtZiBjb25mdGVzdHNlZAorZmkKK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorCisjIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCit0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCisKKworLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0CisKKworCitlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTEyNjogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAorICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgorICBDUFA9IiR7Q0MtY2N9IC1FIgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTQxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTQ3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTU4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTY0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTc1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTgxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPS9saWIvY3BwCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKKyAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCitlbHNlCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKK2VjaG8gIiRhY190IiIkQ1BQIiAxPiY2CisKK2ZvciBhY19oZHIgaW4gc3RkbGliLmggc3RyaW5nLmggc3RyaW5ncy5oIHN5cy9zdGF0Lmggc3lzL3R5cGVzLmggdW5pc3RkLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjA5OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTIxNCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTIxOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2FjX2hlYWRlcl9kaXJlbnQ9bm8KK2ZvciBhY19oZHIgaW4gZGlyZW50Lmggc3lzL25kaXIuaCBzeXMvZGlyLmggbmRpci5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciB0aGF0IGRlZmluZXMgRElSIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjUwOiBjaGVja2luZyBmb3IgJGFjX2hkciB0aGF0IGRlZmluZXMgRElSIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTI1NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8JGFjX2hkcj4KK2ludCBtYWluKCkgeworRElSICpkaXJwID0gMDsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjYzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyX2RpcmVudF8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgYWNfaGVhZGVyX2RpcmVudD0kYWNfaGRyOyBicmVhaworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisjIFR3byB2ZXJzaW9ucyBvZiBvcGVuZGlyIGV0IGFsLiBhcmUgaW4gLWxkaXIgYW5kIC1seCBvbiBTQ08gWGVuaXguCitpZiB0ZXN0ICRhY19oZWFkZXJfZGlyZW50ID0gZGlyZW50Lmg7IHRoZW4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1sZGlyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjg4OiBjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbGRpciIgPiY1CithY19saWJfdmFyPWBlY2hvIGRpcidfJ29wZW5kaXIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sZGlyICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyOTYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBvcGVuZGlyKCk7CisKK2ludCBtYWluKCkgeworb3BlbmRpcigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMwNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgTElCUz0iJExJQlMgLWxkaXIiCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZWxzZQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWx4IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzI5OiBjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbHgiID4mNQorYWNfbGliX3Zhcj1gZWNobyB4J18nb3BlbmRpciB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWx4ICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzMzcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBvcGVuZGlyKCk7CisKK2ludCBtYWluKCkgeworb3BlbmRpcigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgTElCUz0iJExJQlMgLWx4IgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2ZpCisKKworCisKKworCisKKworCisKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzgzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgorZmkKK2ZpCitSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCithY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAc2ltX2Vudmlyb25tZW50QCUkc2ltX2Vudmlyb25tZW50JWcKK3MlQHNpbV9hbGlnbm1lbnRAJSRzaW1fYWxpZ25tZW50JWcKK3MlQHNpbV9hc3NlcnRAJSRzaW1fYXNzZXJ0JWcKK3MlQHNpbV9iaXRzaXplQCUkc2ltX2JpdHNpemUlZworcyVAc2ltX2VuZGlhbkAlJHNpbV9lbmRpYW4lZworcyVAc2ltX2hvc3RlbmRpYW5AJSRzaW1faG9zdGVuZGlhbiVnCitzJUBzaW1fZmxvYXRAJSRzaW1fZmxvYXQlZworcyVAc2ltX3NjYWNoZUAlJHNpbV9zY2FjaGUlZworcyVAc2ltX2RlZmF1bHRfbW9kZWxAJSRzaW1fZGVmYXVsdF9tb2RlbCVnCitzJUBzaW1faHdfY2ZsYWdzQCUkc2ltX2h3X2NmbGFncyVnCitzJUBzaW1faHdfb2Jqc0AlJHNpbV9od19vYmpzJWcKK3MlQHNpbV9od0AlJHNpbV9odyVnCitzJUBzaW1faW5saW5lQCUkc2ltX2lubGluZSVnCitzJUBzaW1fcGFja2FnZXNAJSRzaW1fcGFja2FnZXMlZworcyVAc2ltX3JlZ3Bhcm1AJSRzaW1fcmVncGFybSVnCitzJUBzaW1fcmVzZXJ2ZWRfYml0c0AlJHNpbV9yZXNlcnZlZF9iaXRzJWcKK3MlQHNpbV9zbXBAJSRzaW1fc21wJWcKK3MlQHNpbV9zdGRjYWxsQCUkc2ltX3N0ZGNhbGwlZworcyVAc2ltX3hvcl9lbmRpYW5AJSRzaW1feG9yX2VuZGlhbiVnCitzJUBidWlsZF93YXJuaW5nc0AlJGJ1aWxkX3dhcm5pbmdzJWcKK3MlQFNIRUxMQCUkU0hFTEwlZworcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBERUZTQCUkREVGUyVnCitzJUBMREZMQUdTQCUkTERGTEFHUyVnCitzJUBMSUJTQCUkTElCUyVnCitzJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKK3MlQHByZWZpeEAlJHByZWZpeCVnCitzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCitzJUBiaW5kaXJAJSRiaW5kaXIlZworcyVAc2JpbmRpckAlJHNiaW5kaXIlZworcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworcyVAZGF0YWRpckAlJGRhdGFkaXIlZworcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZworcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCitzJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCitzJUBsaWJkaXJAJSRsaWJkaXIlZworcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworcyVAaW5mb2RpckAlJGluZm9kaXIlZworcyVAbWFuZGlyQCUkbWFuZGlyJWcKK3MlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCitzJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZworcyVAQ0NAJSRDQyVnCitzJUBob3N0QCUkaG9zdCVnCitzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCitzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKK3MlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZworcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKK3MlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCitzJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCitzJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCitzJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZworcyVAYnVpbGRAJSRidWlsZCVnCitzJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKK3MlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCitzJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZworcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCitzJUBDUFBAJSRDUFAlZworcyVAQVJfRk9SX0JVSUxEQCUkQVJfRk9SX0JVSUxEJWcKK3MlQEFSX0ZMQUdTX0ZPUl9CVUlMREAlJEFSX0ZMQUdTX0ZPUl9CVUlMRCVnCitzJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZworcyVAQ0ZMQUdTX0ZPUl9CVUlMREAlJENGTEFHU19GT1JfQlVJTEQlZworcyVAUkFOTElCX0ZPUl9CVUlMREAlJFJBTkxJQl9GT1JfQlVJTEQlZworcyVATElCSUJFUlRZX0xJQkAlJExJQklCRVJUWV9MSUIlZworcyVAQVJAJSRBUiVnCitzJUBSQU5MSUJAJSRSQU5MSUIlZworCitDRU9GCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCithY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KK2FjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfbW9yZV9saW5lcz06CithY19zZWRfY21kcz0iIgord2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZmkKKyAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGVsc2UKKyAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGZpCisgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCisgICAgYWNfYmVnPSRhY19lbmQKKyAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgIGFjX3NlZF9jbWRzPWNhdAorZmkKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUifQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KKworICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgIC4pICBzcmNkaXI9LgorICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgorICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7CisgIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgorICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgZXNhYworCisgIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgorICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKKyAgcm0gLWYgIiRhY19maWxlIgorICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorIyAkY29uZmlndXJlX2lucHV0IiA7OworICAqKSBhY19jb21zdWI9IDs7CisgIGVzYWMKKworICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBzZWQgLWUgIiRhY19jb21zdWIKK3MlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCitzJUBzcmNkaXJAJSRzcmNkaXIlZworcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworcyVASU5TVEFMTEAlJElOU1RBTEwlZworIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQorZmk7IGRvbmUKK3JtIC1mIGNvbmZ0ZXN0LnMqCisKKyMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCisjIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCisjCisjIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCithY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKK2FjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJworYWNfZEM9J1wzJworYWNfZEQ9JyVnJworIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCithY191Qz0nICcKK2FjX3VEPSdcNCVnJworIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKK2FjX2VDPScgJworYWNfZUQ9JyVnJworCitpZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZmkKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKKworICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAorICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KKworRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCisjIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCitybSAtZiBjb25mdGVzdC52YWxzCitjYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCitzL1tcXCYlXS9cXCYvZworcyVbXFwkYF0lXFwmJWcKK3MlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCitzJWFjX2QlYWNfdSVncAorcyVhY191JWFjX2UlZ3AKK0VPRgorc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscworcm0gLWYgY29uZnRlc3QuaGRyCisKKyMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKKyMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCitzJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQorRU9GCisKKyMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgorIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KKworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgOgorZG8KKyAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAorICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCisgIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKKyAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCisgIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUworICBlY2hvICdDRU9GCisgIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0CisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgorJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKKyAgcm0gLWYgY29uZnRlc3QudmFscworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKKyAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCisgIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCisgICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgorICAgIHJtIC1mIGNvbmZ0ZXN0LmgKKyAgZWxzZQorICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgZmkKKyAgICBybSAtZiAkYWNfZmlsZQorICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKKyAgZmkKK2ZpOyBkb25lCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorY2FzZSB4JENPTkZJR19IRUFERVJTIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWMKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCmRpZmYgLS1naXQgYS9zaW0vaWdlbi9jb25maWd1cmUuaW4gYi9zaW0vaWdlbi9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA4MzZkOQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9pZ2VuL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDUyIEBACitkbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK3NpbmNsdWRlKC4uL2NvbW1vbi9hY2xvY2FsLm00KQorQUNfUFJFUkVRKDIuNSlkbmwKK0FDX0lOSVQodGFibGUuaCkKKworQUNfUFJPR19JTlNUQUxMCitBQ19QUk9HX0NDCisKK1NJTV9BQ19PUFRJT05fV0FSTklOR1MKKworIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgoraWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyIgLWEgIngkaG9zdCIgIT0gInhpMzg2LXdpbmRvd3MiOyB0aGVuCisgIEFSX0ZPUl9CVUlMRD0nJChBUiknCisgIEFSX0ZMQUdTX0ZPUl9CVUlMRD0nJChBUl9GTEFHUyknCisgIENDX0ZPUl9CVUlMRD0nJChDQyknCisgIENGTEFHU19GT1JfQlVJTEQ9JyQoQ0ZMQUdTKScKKyAgUkFOTElCX0ZPUl9CVUlMRD0nJChSQU5MSUIpJworICBMSUJJQkVSVFlfTElCPS4uLy4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQorZWxzZQorICBBUl9GT1JfQlVJTEQ9JHtBUl9GT1JfQlVJTEQtYXJ9CisgIEFSX0ZMQUdTX0ZPUl9CVUlMRD0ke0FSX0ZMQUdTX0ZPUl9CVUlMRC1yY30KKyAgQ0NfRk9SX0JVSUxEPSR7Q0NfRk9SX0JVSUxELWdjY30KKyAgQ0ZMQUdTX0ZPUl9CVUlMRD0ke0NGTEFHU19GT1JfQlVJTEQtIi1nIn0KKyAgUkFOTElCX0ZPUl9CVUlMRD0ke1JBTkxJQl9GT1JfQlVJTEQtcmFubGlifQorICBMSUJJQkVSVFlfTElCPQorZmkKKworCitBQ19DT05GSUdfQVVYX0RJUihgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uKQorQUNfQ0FOT05JQ0FMX1NZU1RFTQorQUNfQVJHX1BST0dSQU0KKworLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0CisKK0FDX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQorCitBQ19DSEVDS19IRUFERVJTKHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCBzeXMvc3RhdC5oIHN5cy90eXBlcy5oIHVuaXN0ZC5oKQorQUNfSEVBREVSX0RJUkVOVAorCitBQ19TVUJTVChBUl9GT1JfQlVJTEQpCitBQ19TVUJTVChBUl9GTEFHU19GT1JfQlVJTEQpCitBQ19TVUJTVChDQ19GT1JfQlVJTEQpCitBQ19TVUJTVChDRkxBR1NfRk9SX0JVSUxEKQorQUNfU1VCU1QoUkFOTElCX0ZPUl9CVUlMRCkKK0FDX1NVQlNUKExJQklCRVJUWV9MSUIpCisKK0FDX1NVQlNUKEFSKQorQUNfU1VCU1QoQ0ZMQUdTKQorQUNfUFJPR19SQU5MSUIKKworQUNfT1VUUFVUKE1ha2VmaWxlLAorW2Nhc2UgeCRDT05GSUdfSEVBREVSUyBpbiB4Y29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjXSkKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2ZpbHRlci5jIGIvc2ltL2lnZW4vZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjNTE4OAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9pZ2VuL2ZpbHRlci5jCkBAIC0wLDAgKzEsMzU1IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAibGYuaCIKKyNpbmNsdWRlICJmaWx0ZXIuaCIKKworc3RydWN0IF9maWx0ZXIgeworICBjaGFyICptZW1iZXI7CisgIGZpbHRlciAqbmV4dDsKK307CisKKwordm9pZAorZmlsdGVyX3BhcnNlIChmaWx0ZXIgKipmaWx0ZXJzLAorCSAgICAgIGNvbnN0IGNoYXIgKmZpbHQpCit7CisgIHdoaWxlIChzdHJsZW4gKGZpbHQpID4gMCkKKyAgICB7CisgICAgICBmaWx0ZXIgKm5ld19maWx0ZXI7CisgICAgICBmaWx0ZXIgKipsYXN0OworICAgICAgLyogYnJlYWsgb3V0IGEgbWVtYmVyIG9mIHRoZSBmaWx0ZXIgbGlzdCAqLworICAgICAgY29uc3QgY2hhciAqZmxhZyA9IGZpbHQ7CisgICAgICB1bnNpZ25lZCAvKnNpemVfdCovIGxlbjsKKyAgICAgIGZpbHQgPSBzdHJjaHIgKGZpbHQsICcsJyk7CisgICAgICBpZiAoZmlsdCA9PSBOVUxMKQorCXsKKwkgIGZpbHQgPSBzdHJjaHIgKGZsYWcsICdcMCcpOworCSAgbGVuID0gc3RybGVuIChmbGFnKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbGVuID0gZmlsdCAtIGZsYWc7CisJICBmaWx0ID0gZmlsdCArIDE7CisJfQorICAgICAgLyogZmluZCBhbiBpbnNlcnRpb24gcG9pbnQgLSBzb3J0ZWQgb3JkZXIgKi8KKyAgICAgIGxhc3QgPSBmaWx0ZXJzOworICAgICAgd2hpbGUgKCpsYXN0ICE9IE5VTEwKKwkgICAgICYmIHN0cm5jbXAgKGZsYWcsICgqbGFzdCktPm1lbWJlciwgbGVuKSA+IDApCisJbGFzdCA9ICYoKmxhc3QpLT5uZXh0OworICAgICAgaWYgKCpsYXN0ICE9IE5VTEwKKwkgICYmIHN0cm5jbXAgKGZsYWcsICgqbGFzdCktPm1lbWJlciwgbGVuKSA9PSAwCisJICAmJiBzdHJsZW4gKCgqbGFzdCktPm1lbWJlcikgPT0gbGVuKQorCWNvbnRpbnVlOyAvKiBkdXBsaWNhdGUgKi8KKyAgICAgIC8qIGNyZWF0ZSBhbiBlbnRyeSBmb3IgdGhhdCBtZW1iZXIgKi8KKyAgICAgIG5ld19maWx0ZXIgPSBaQUxMT0MgKGZpbHRlcik7CisgICAgICBuZXdfZmlsdGVyLT5tZW1iZXIgPSBOWkFMTE9DIChjaGFyLCBsZW4gKyAxKTsKKyAgICAgIHN0cm5jcHkgKG5ld19maWx0ZXItPm1lbWJlciwgZmxhZywgbGVuKTsKKyAgICAgIC8qIGluc2VydCBpdCAqLworICAgICAgbmV3X2ZpbHRlci0+bmV4dCA9ICpsYXN0OworICAgICAgKmxhc3QgPSBuZXdfZmlsdGVyOworICAgIH0KK30KKworCit2b2lkCitmaWx0ZXJfYWRkIChmaWx0ZXIgKipzZXQsCisJICAgIGZpbHRlciAqYWRkKQoreworICB3aGlsZSAoYWRkICE9IE5VTEwpCisgICAgeworICAgICAgaW50IGNtcDsKKyAgICAgIGlmICgqc2V0ID09IE5VTEwpCisJY21wID0gMTsgLyogc2V0LT5tZW1iZXIgPiBhZGQtPm1lbWJlciAqLworICAgICAgZWxzZQorCWNtcCA9IHN0cmNtcCAoKCpzZXQpLT5tZW1iZXIsIGFkZC0+bWVtYmVyKTsKKyAgICAgIGlmIChjbXAgPiAwKQorCXsKKwkgIC8qIGluc2VydCBpdCBoZXJlICovCisJICBmaWx0ZXIgKm5ldyA9IFpBTExPQyAoZmlsdGVyKTsKKwkgIG5ldy0+bWVtYmVyID0gTlpBTExPQyAoY2hhciwgc3RybGVuIChhZGQtPm1lbWJlcikgKyAxKTsKKwkgIHN0cmNweSAobmV3LT5tZW1iZXIsIGFkZC0+bWVtYmVyKTsKKwkgIG5ldy0+bmV4dCA9ICpzZXQ7CisJICAqc2V0ID0gbmV3OworCSAgYWRkID0gYWRkLT5uZXh0OworCX0KKyAgICAgIGVsc2UgaWYgKGNtcCA9PSAwKQorCXsKKwkgIC8qIGFscmVhZHkgaW4gc2V0ICovCisJICBhZGQgPSBhZGQtPm5leHQ7CisJfQorICAgICAgZWxzZSAvKiBjbXAgPCAwICovCisJeworCSAgLyogbm90IHJlYWNoZWQgaW5zZXJ0aW9uIHBvaW50ICovCisJICBzZXQgPSAmKCpzZXQpLT5uZXh0OworCX0KKyAgICB9Cit9CisKKworaW50CitmaWx0ZXJfaXNfc3Vic2V0IChmaWx0ZXIgKnN1cGVyc2V0LAorCQkgIGZpbHRlciAqc3Vic2V0KQoreworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpbnQgY21wOworICAgICAgaWYgKHN1YnNldCA9PSBOVUxMKQorCXJldHVybiAxOworICAgICAgaWYgKHN1cGVyc2V0ID09IE5VTEwpCisJcmV0dXJuIDA7IC8qIHN1YnNldCBpc24ndCBmaW5pc2hlZCAqLworICAgICAgY21wID0gc3RyY21wIChzdWJzZXQtPm1lbWJlciwgc3VwZXJzZXQtPm1lbWJlcik7CisgICAgICBpZiAoY21wIDwgMCkKKwlyZXR1cm4gMDsgLyogbm90IGZvdW5kICovCisgICAgICBlbHNlIGlmIChjbXAgPT0gMCkKKwlzdWJzZXQgPSBzdWJzZXQtPm5leHQ7IC8qIGZvdW5kICovCisgICAgICBlbHNlIGlmIChjbXAgPiAwKQorCXN1cGVyc2V0ID0gc3VwZXJzZXQtPm5leHQ7IC8qIGxhdGVyIGluIGxpc3Q/ICovCisgICAgfQorfQorCisKK2ludAorZmlsdGVyX2lzX2NvbW1vbiAoZmlsdGVyICpsLAorCQkgIGZpbHRlciAqcikKK3sKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaW50IGNtcDsKKyAgICAgIGlmIChsID09IE5VTEwpCisJcmV0dXJuIDA7CisgICAgICBpZiAociA9PSBOVUxMKQorCXJldHVybiAwOworICAgICAgY21wID0gc3RyY21wIChsLT5tZW1iZXIsIHItPm1lbWJlcik7CisgICAgICBpZiAoY21wIDwgMCkKKwlsID0gbC0+bmV4dDsKKyAgICAgIGVsc2UgaWYgKGNtcCA9PSAwKQorCXJldHVybiAxOyAvKiBjb21tb24gbWVtYmVyICovCisgICAgICBlbHNlIGlmIChjbXAgPiAwKQorCXIgPSByLT5uZXh0OworICAgIH0KK30KKworCitpbnQKK2ZpbHRlcl9pc19tZW1iZXIgKGZpbHRlciAqZmlsdCwKKwkJICBjb25zdCBjaGFyICpmbGFnKQoreworICBpbnQgaW5kZXggPSAxOworICB3aGlsZSAoZmlsdCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKGZsYWcsIGZpbHQtPm1lbWJlcikgPT0gMCkKKwlyZXR1cm4gaW5kZXg7CisgICAgICBmaWx0ID0gZmlsdC0+bmV4dDsKKyAgICAgIGluZGV4Kys7CisgICAgfQorICByZXR1cm4gMDsKK30KKworCitpbnQKK2lzX2ZpbHRlcmVkX291dCAoZmlsdGVyICpmaWx0ZXJzLAorCQkgY29uc3QgY2hhciAqZmxhZ3MpCit7CisgIHdoaWxlIChzdHJsZW4oZmxhZ3MpID4gMCkgeworICAgIGludCBwcmVzZW50OworICAgIGZpbHRlciAqZmlsdCA9IGZpbHRlcnM7CisgICAgLyogYnJlYWsgdGhlIHN0cmluZyB1cCAqLworICAgIGNoYXIgKmVuZCA9IHN0cmNocihmbGFncywgJywnKTsKKyAgICBjaGFyICpuZXh0OworICAgIHVuc2lnbmVkIC8qc2l6ZV90Ki8gbGVuOworICAgIGlmIChlbmQgPT0gTlVMTCkgeworICAgICAgZW5kID0gc3RyY2hyKGZsYWdzLCAnXDAnKTsKKyAgICAgIG5leHQgPSBlbmQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgbmV4dCA9IGVuZCArIDE7CisgICAgfQorICAgIGxlbiA9IGVuZCAtIGZsYWdzOworICAgIC8qIGNoZWNrIHRoYXQgaXQgaXMgcHJlc2VudCAqLworICAgIHByZXNlbnQgPSAwOworICAgIGZpbHQgPSBmaWx0ZXJzOworICAgIHdoaWxlIChmaWx0ICE9IE5VTEwpIHsKKyAgICAgIGlmIChzdHJuY21wKGZsYWdzLCBmaWx0LT5tZW1iZXIsIGxlbikgPT0gMAorCSAgJiYgc3RybGVuKGZpbHQtPm1lbWJlcikgPT0gbGVuKSB7CisJcHJlc2VudCA9IDE7CisJYnJlYWs7CisgICAgICB9CisgICAgICBmaWx0ID0gZmlsdC0+bmV4dDsKKyAgICB9CisgICAgaWYgKCFwcmVzZW50KQorICAgICAgcmV0dXJuIDE7CisgICAgZmxhZ3MgPSBuZXh0OworICB9CisgIHJldHVybiAwOworfQorCisKKyNpZiAwCitpbnQKK2l0X2lzIChjb25zdCBjaGFyICpmbGFnLAorICAgICAgIGNvbnN0IGNoYXIgKmZsYWdzKQoreworICBpbnQgZmxhZ19sZW4gPSBzdHJsZW4oZmxhZyk7CisgIHdoaWxlICgqZmxhZ3MgIT0gJ1wwJykgeworICAgIGlmICghc3RybmNtcChmbGFncywgZmxhZywgZmxhZ19sZW4pCisJJiYgKGZsYWdzW2ZsYWdfbGVuXSA9PSAnLCcgfHwgZmxhZ3NbZmxhZ19sZW5dID09ICdcMCcpKQorICAgICAgcmV0dXJuIDE7CisgICAgd2hpbGUgKCpmbGFncyAhPSAnLCcpIHsKKyAgICAgIGlmICgqZmxhZ3MgPT0gJ1wwJykKKwlyZXR1cm4gMDsKKyAgICAgIGZsYWdzKys7CisgICAgfQorICAgIGZsYWdzKys7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCitjaGFyICoKK2ZpbHRlcl9uZXh0IChmaWx0ZXIgKnNldCwKKwkgICAgIGNoYXIgKm1lbWJlcikKK3sKKyAgd2hpbGUgKHNldCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKHNldC0+bWVtYmVyLCBtZW1iZXIpID4gMCkKKwlyZXR1cm4gc2V0LT5tZW1iZXI7CisgICAgICBzZXQgPSBzZXQtPm5leHQ7CisgICAgfQorICByZXR1cm4gTlVMTDsKK30KKworCit2b2lkCitkdW1wX2ZpbHRlciAobGYgKmZpbGUsCisJICAgICBjaGFyICpwcmVmaXgsIAorCSAgICAgZmlsdGVyICpzZXQsCisJICAgICBjaGFyICpzdWZmaXgpCit7CisgIGNoYXIgKm1lbWJlcjsKKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBwcmVmaXgpOworICBtZW1iZXIgPSBmaWx0ZXJfbmV4dCAoc2V0LCAiIik7CisgIGlmIChtZW1iZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICB3aGlsZSAoMSkKKwl7CisJICBsZl9wcmludGYgKGZpbGUsICIlcyIsIG1lbWJlcik7CisJICBtZW1iZXIgPSBmaWx0ZXJfbmV4dCAoc2V0LCBtZW1iZXIpOworCSAgaWYgKG1lbWJlciA9PSBOVUxMKQorCSAgICBicmVhazsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgIiwiKTsKKwl9CisgICAgfQorICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Cit9CisKKworI2lmZGVmIE1BSU4KK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGZpbHRlciAqc3Vic2V0ID0gTlVMTDsKKyAgZmlsdGVyICpzdXBlcnNldCA9IE5VTEw7CisgIGxmICpsOworICBpbnQgaTsKKyAgaWYgKGFyZ2MgPCAyKSB7CisgICAgcHJpbnRmKCJVc2FnZTogZmlsdGVyIDxzdWJzZXQ+IDxmaWx0ZXI+IC4uLlxuIik7CisgICAgZXhpdCAoMSk7CisgIH0KKworICAvKiBsb2FkIHRoZSBmaWx0ZXIgdXAgKi8KKyAgZmlsdGVyX3BhcnNlICgmc3Vic2V0LCBhcmd2WzFdKTsKKyAgZm9yIChpID0gMjsgaSA8IGFyZ2M7IGkrKykgCisgICAgZmlsdGVyX3BhcnNlICgmc3VwZXJzZXQsIGFyZ3ZbaV0pOworCisgIC8qIGR1bXAgdmFyaW91cyBpbmZvICovCisgIGwgPSBsZl9vcGVuICgiLSIsICJzdGRvdXQiLCBsZl9vbWl0X3JlZmVyZW5jZXMsIGxmX2lzX3RleHQsICJ0bXAtZmlsdGVyIik7CisjaWYgMAorICBpZiAoaXNfZmlsdGVyZWRfb3V0IChhcmd2WzFdLCBzdXBlcnNldCkpCisgICAgbGZfcHJpbnRmIChsLCAiZXhjbHVkZWRcbiIpOworICBlbHNlCisgICAgbGZfcHJpbnRmIChsLCAiaW5jbHVkZWRcbiIpOworI2VuZGlmCisgIC8qIHN1YnNldCAqLworICB7CisgICAgZHVtcF9maWx0ZXIgKGwsICJ7Iiwgc3Vic2V0LCAiIH0iKTsKKyAgICBpZiAoZmlsdGVyX2lzX3N1YnNldCAoc3VwZXJzZXQsIHN1YnNldCkpCisgICAgICBsZl9wcmludGYgKGwsICIgc3Vic2V0IG9mICIpOworICAgIGVsc2UKKyAgICAgIGxmX3ByaW50ZiAobCwgIiAhc3Vic2V0IG9mICIpOworICAgIGR1bXBfZmlsdGVyIChsLCAieyIsIHN1cGVyc2V0LCAiIH0iKTsKKyAgICBsZl9wcmludGYgKGwsICJcbiIpOworICB9CisgIC8qIGludGVyc2VjdGlvbiAqLworICB7CisgICAgZHVtcF9maWx0ZXIgKGwsICJ7Iiwgc3Vic2V0LCAiIH0iKTsKKyAgICBpZiAoZmlsdGVyX2lzX2NvbW1vbiAoc3Vic2V0LCBzdXBlcnNldCkpCisgICAgICBsZl9wcmludGYgKGwsICIgaW50ZXJzZWN0cyAiKTsKKyAgICBlbHNlCisgICAgICBsZl9wcmludGYgKGwsICIgIWludGVyc2VjdHMgIik7CisgICAgZHVtcF9maWx0ZXIgKGwsICJ7Iiwgc3VwZXJzZXQsICIgfSIpOworICAgIGxmX3ByaW50ZiAobCwgIlxuIik7CisgIH0KKyAgLyogbWVtYmVyc2hpcCAqLworICB7CisgICAgZmlsdGVyICptZW1iID0gc3Vic2V0OworICAgIHdoaWxlIChtZW1iICE9IE5VTEwpCisgICAgICB7CisJbGZfcHJpbnRmIChsLCAiJXMiLCBtZW1iLT5tZW1iZXIpOworCWlmIChmaWx0ZXJfaXNfbWVtYmVyIChzdXBlcnNldCwgbWVtYi0+bWVtYmVyKSkKKwkgIGxmX3ByaW50ZiAobCwgIiBpbiAiKTsKKwllbHNlCisJICBsZl9wcmludGYgKGwsICIgIWluICIpOworCWR1bXBfZmlsdGVyIChsLCAieyIsIHN1cGVyc2V0LCAiIH0iKTsKKwlsZl9wcmludGYgKGwsICJcbiIpOworCW1lbWIgPSBtZW1iLT5uZXh0OworICAgICAgfQorICB9CisgIC8qIGFkZGl0aW9uICovCisgIHsKKyAgICBmaWx0ZXIgKmFkZCA9IE5VTEw7CisgICAgZmlsdGVyX2FkZCAoJmFkZCwgc3VwZXJzZXQpOworICAgIGZpbHRlcl9hZGQgKCZhZGQsIHN1YnNldCk7CisgICAgZHVtcF9maWx0ZXIgKGwsICJ7IiwgYWRkLCAiIH0iKTsKKyAgICBsZl9wcmludGYgKGwsICIgPSAiKTsKKyAgICBkdW1wX2ZpbHRlciAobCwgInsiLCBzdWJzZXQsICIgfSIpOworICAgIGxmX3ByaW50ZiAobCwgIiArICIpOworICAgIGR1bXBfZmlsdGVyIChsLCAieyIsIHN1cGVyc2V0LCAiIH0iKTsKKyAgICBsZl9wcmludGYgKGwsICJcbiIpOworICB9CisgICAgICAKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2ZpbHRlci5oIGIvc2ltL2lnZW4vZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg1YjgwMwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9pZ2VuL2ZpbHRlci5oCkBAIC0wLDAgKzEsODYgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKy8qIE5CLCBhbiBlbXB0eSBmaWx0ZXIgaXMgTlVMTCAqLwordHlwZWRlZiBzdHJ1Y3QgX2ZpbHRlciBmaWx0ZXI7CisKKworLyogcGFyc2UgdGhlIGxpc3QgbWVyZ2luZyBhbnkgZmxhZ3MgaW50byB0aGUgZmlsdGVyICovCisKK2V4dGVybiB2b2lkIGZpbHRlcl9wYXJzZQorKGZpbHRlciAqKmZpbHRlcnMsCisgY29uc3QgY2hhciAqZmlsdCk7CisKKworLyogYWRkIHRoZSBzZWNvbmQgZmlsdGVyIHRvIHRoZSBmaXJzdCAqLworCitleHRlcm4gdm9pZCBmaWx0ZXJfYWRkCisoZmlsdGVyICoqZmlsdGVycywKKyBmaWx0ZXIgKmFkZCk7CisKKworCisvKiByZXR1cm5zIHRydWUgaWYgU1VCIGlzIGEgc3RyaWN0IHN1YnNldCBvZiBTVVBFUi4gIEZvciBhbiBlbXB0eSBzZXQKKyAgIGlzIGEgbWVtYmVyIG9mIGFueSBzZXQgKi8KKworZXh0ZXJuIGludCBmaWx0ZXJfaXNfc3Vic2V0CisoZmlsdGVyICpzdXBlcnNldCwKKyBmaWx0ZXIgKnN1YnNldCk7CisKKworLyogcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG1lbWJlciBjb21tb24gdG8gdGhlIHR3bworICAgZmlsdGVycyAqLworCitleHRlcm4gaW50IGZpbHRlcl9pc19jb21tb24KKyhmaWx0ZXIgKmwsCisgZmlsdGVyICpyKTsKKworCisvKiByZXR1cm5zIHRoZSBpbmRleCAocG9zICsgMSkgaWYgdGhlIG5hbWUgaXMgaW4gdGhlIGZpbHRlci4gICovCisKK2V4dGVybiBpbnQgZmlsdGVyX2lzX21lbWJlcgorKGZpbHRlciAqc2V0LAorIGNvbnN0IGNoYXIgKmZsYWcpOworCisKKy8qIHJldHVybnMgdHJ1ZSBpZiBvbmUgb2YgdGhlIGZsYWdzIGlzIG5vdCBwcmVzZW50IGluIHRoZSBmaWx0ZXIuCisgICA9PT0gIWZpbHRlcl9pc19zdWJzZXQgKGZpbHRlcl9wYXJzZSAoTlVMTCwgZmxhZ3MpLCBmaWx0ZXJzKSAqLworaW50IGlzX2ZpbHRlcmVkX291dAorKGZpbHRlciAqZmlsdGVycywKKyBjb25zdCBjaGFyICpmbGFncyk7CisKKworLyogcmV0dXJucyB0aGUgbmV4dCBtZW1iZXIgb2YgdGhlIGZpbHRlciBzZXQgdGhhdCBmb2xsb3dzIE1FTUJFUi4KKyAgIE1lbWJlciBkb2VzIG5vdCBuZWVkIHRvIGJlIGFuIGVsZW1lbXQgb2YgdGhlIGZpbHRlciBzZXQuICBOZXh0IG9mCisgICAiIiBpcyB0aGUgZmlyc3Qgbm9uLWVtcHR5IG1lbWJlciAqLworY2hhciAqZmlsdGVyX25leHQKKyhmaWx0ZXIgKnNldCwKKyBjaGFyICptZW1iZXIpOworCisKKworLyogZm9yIGRlYnVnZ2luZyAqLworCitleHRlcm4gdm9pZCBkdW1wX2ZpbHRlcgorKGxmICpmaWxlLAorIGNoYXIgKnByZWZpeCwKKyBmaWx0ZXIgKmZpbHQsCisgY2hhciAqc3VmZml4KTsKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2ZpbHRlcl9ob3N0LmMgYi9zaW0vaWdlbi9maWx0ZXJfaG9zdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOGM5M2YKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaWdlbi9maWx0ZXJfaG9zdC5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiZmlsdGVyX2hvc3QuaCIKKworLyogU2hvcnRlbiB0cmFjZXMgYnkgZWxpbWluYXRpbmcgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgdG8gZmlsZW5hbWVzLiAgKi8KK2NvbnN0IGNoYXIgKgorZmlsdGVyX2ZpbGVuYW1lIChjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgY29uc3QgY2hhciAqcCA9IGZpbGVuYW1lOworICBjb25zdCBjaGFyICpsYXN0ID0gZmlsZW5hbWU7CisgIGludCBjaDsKKworICB3aGlsZSAoKGNoID0gKnArKykgIT0gJ1wwJyAmJiBjaCAhPSAnOicpCisgICAgaWYgKGNoID09ICcvJykKKyAgICAgIGxhc3QgPSBwOworCisgIHJldHVybiBsYXN0OworfQpkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vZmlsdGVyX2hvc3QuaCBiL3NpbS9pZ2VuL2ZpbHRlcl9ob3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmYTZiYwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9pZ2VuL2ZpbHRlcl9ob3N0LmgKQEAgLTAsMCArMSwyNyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKyNpZm5kZWYgX0ZJTFRFUl9IT1NUX0gKKyNkZWZpbmUgX0ZJTFRFUl9IT1NUX0gKKworLyogUmVtb3ZlIGRpcmVjdG9yeSBwYXJ0IGZyb20gZmlsZW5hbWUgKi8KK2V4dGVybiBjb25zdCBjaGFyICoKK2ZpbHRlcl9maWxlbmFtZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2dlbi1lbmdpbmUuYyBiL3NpbS9pZ2VuL2dlbi1lbmdpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjY4NjFlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2lnZW4vZ2VuLWVuZ2luZS5jCkBAIC0wLDAgKzEsODA3IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJsZi5oIgorI2luY2x1ZGUgInRhYmxlLmgiCisjaW5jbHVkZSAiZmlsdGVyLmgiCisKKyNpbmNsdWRlICJpZ2VuLmgiCisKKyNpbmNsdWRlICJsZC1pbnNuLmgiCisjaW5jbHVkZSAibGQtZGVjb2RlLmgiCisKKyNpbmNsdWRlICJnZW4uaCIKKworI2luY2x1ZGUgImdlbi1pZGVjb2RlLmgiCisjaW5jbHVkZSAiZ2VuLWVuZ2luZS5oIgorI2luY2x1ZGUgImdlbi1pY2FjaGUuaCIKKyNpbmNsdWRlICJnZW4tc2VtYW50aWNzLmgiCisKKworc3RhdGljIHZvaWQKK3ByaW50X2VuZ2luZV9pc3N1ZV9wcmVmaXhfaG9vayAobGYgKmZpbGUpCit7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiNpZiBkZWZpbmVkICglc0VOR0lORV9JU1NVRV9QUkVGSVhfSE9PSylcbiIsCisJICAgICBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOworICBsZl9wcmludGYgKGZpbGUsICIlc0VOR0lORV9JU1NVRV9QUkVGSVhfSE9PSygpO1xuIiwKKwkgICAgIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7CisgIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiNlbmRpZlxuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9lbmdpbmVfaXNzdWVfcG9zdGZpeF9ob29rIChsZiAqZmlsZSkKK3sKKyAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiI2lmIGRlZmluZWQgKCVzRU5HSU5FX0lTU1VFX1BPU1RGSVhfSE9PSylcbiIsCisJICAgICBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOworICBsZl9wcmludGYgKGZpbGUsICIlc0VOR0lORV9JU1NVRV9QT1NURklYX0hPT0soKTtcbiIsCisJICAgICBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOworICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOworICBsZl9wcmludGYgKGZpbGUsICIjZW5kaWZcbiIpOworICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9ydW5fYm9keSAobGYgKmZpbGUsCisJICAgICAgICBnZW5fZW50cnkgKnRhYmxlKQoreworICAvKiBPdXRwdXQgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgcmVhbCBjb2RlOgorICAgICAKKyAgICAgVW5mb3J0dW5hdGx5LCB0aGVyZSBhcmUgbXVsdGlwbGUgY2FzZXMgdG8gY29uc2lkZXIgdmlzOgorICAgICAKKyAgICAgPGljYWNoZT4gWCA8c21wPgorICAgICAKKyAgICAgQ29uc2VxdWVudGx5IHRoaXMgZnVuY3Rpb24gaXMgd3JpdHRlbiBpbiBtdWx0aXBsZSBkaWZmZXJlbnQgd2F5cyAqLworICAKKyAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7CisgIGxmX2luZGVudCAoZmlsZSwgKzIpOworICBpZiAoIW9wdGlvbnMuZ2VuLnNtcCkKKyAgICB7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIlc2luc3RydWN0aW9uX2FkZHJlc3MgY2lhO1xuIiwgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sKTsKKyAgICB9CisgIGxmX3ByaW50ZiAoZmlsZSwgImludCBjdXJyZW50X2NwdSA9IG5leHRfY3B1X25yO1xuIik7CisgIAorICBpZiAob3B0aW9ucy5nZW4uaWNhY2hlKQorICAgIHsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIi8qIGZsdXNoIHRoZSBpY2FjaGUgb2YgYSBwb3NzaWJsZSBicmVhayBpbnNuICovXG4iKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiICBpbnQgY3B1X25yO1xuIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgbnJfY3B1czsgY3B1X25yKyspXG4iKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiAgICBjcHVfZmx1c2hfaWNhY2hlIChTVEFURV9DUFUgKHNkLCBjcHVfbnIpKTtcbiIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAifVxuIik7CisgICAgfQorICAKKyAgaWYgKCFvcHRpb25zLmdlbi5zbXApCisgICAgeworICAgICAgCisgICAgICBsZl9wdXRzdHIgKGZpbGUsICIKKy8qIENBU0UgMTogTk8gU01QICh3aXRoIG9yIHdpdGggb3V0IGluc3RydWN0aW9uIGNhY2hlKS4KKworSW4gdGhpcyBjYXNlLCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGUgY3VycmVudAoraW5zdHJ1Y3Rpb24gYWRkcmVzcyAoQ0lBKSBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlYWQgZnJvbSAvIHdyaXR0ZW4gdG8KK3RoZSBDUFUgb2JqZWN0IGFmdGVyIHRoZSBleGVjdXRpb24gb2YgYW4gaW5zdHJ1Y3Rpb24uCisKK0luc3RlYWQsIENJQSBpcyBvbmx5IHNhdmVkIHdoZW4gdGhlIG1haW4gbG9vcCBleGl0cy4gIFRoaXMgb2NjdXJlcword2hlbiBlaXRoZXIgc2ltX2VuZ2luZV9oYWx0IG9yIHNpbV9lbmdpbmVfcmVzdGFydCBpcyBjYWxsZWQuICBCb3RoIG9mCit0aGVzZSBmdW5jdGlvbnMgc2F2ZSB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBhZGRyZXNzIGJlZm9yZSBoYWx0aW5nIC8KK3Jlc3RhcnRpbmcgdGhlIHNpbXVsYXRvci4KKworQXMgYSB2YXJpYXRpb24sIHRoZXJlIG1heSBhbHNvIGJlIHN1cHBvcnQgZm9yIGFuIGluc3RydWN0aW9uIGNyYWNraW5nCitjYWNoZS4gKi8KKworIik7CisKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIlxuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICIvKiBwcmltZSB0aGUgbWFpbiBsb29wICovXG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIlNJTV9BU1NFUlQgKGN1cnJlbnRfY3B1ID09IDApO1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJTSU1fQVNTRVJUIChucl9jcHVzID09IDEpO1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJjaWEgPSBDSUFfR0VUIChDUFUpO1xuIik7CisKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIlxuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJ3aGlsZSAoMSlcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICB7XG4iKTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgKzQpOworICAgICAgCisgICAgICBsZl9wcmludGYgKGZpbGUsICIlc2luc3RydWN0aW9uX2FkZHJlc3MgbmlhO1xuIiwKKwkJIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7CisKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgICAgICBpZiAoIW9wdGlvbnMuZ2VuLmljYWNoZSkKKwl7CisJICBsZl9wcmludGYgKGZpbGUsICIlc2luc3RydWN0aW9uX3dvcmQgaW5zdHJ1Y3Rpb25fMCA9IElNRU0lZCAoY2lhKTtcbiIsCisJCSAgICAgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sLAorCQkgICAgIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSk7CisJICBwcmludF9lbmdpbmVfaXNzdWVfcHJlZml4X2hvb2sgKGZpbGUpOworCSAgcHJpbnRfaWRlY29kZV9ib2R5IChmaWxlLCB0YWJsZSwgIm5pYSA9ICIpOworCSAgcHJpbnRfZW5naW5lX2lzc3VlX3Bvc3RmaXhfaG9vayAoZmlsZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGxmX3B1dHN0ciAoZmlsZSwgImlkZWNvZGVfY2FjaGUgKmNhY2hlX2VudHJ5ID1cbiIpOworCSAgbGZfcHV0c3RyIChmaWxlLCAiICBjcHVfaWNhY2hlX2VudHJ5IChjcHUsIGNpYSk7XG4iKTsKKwkgIGxmX3B1dHN0ciAoZmlsZSwgImlmIChjYWNoZV9lbnRyeS0+YWRkcmVzcyA9PSBjaWEpXG4iKTsKKwkgIGxmX3B1dHN0ciAoZmlsZSwgIiAge1xuIik7CisJICBsZl9pbmRlbnQgKGZpbGUsIC00KTsKKwkgIGxmX3B1dHN0ciAoZmlsZSwgIi8qIGNhY2hlIGhpdCAqL1xuIik7CisJICBsZl9wdXRzdHIgKGZpbGUsICJpZGVjb2RlX3NlbWFudGljICpjb25zdCBzZW1hbnRpYyA9IGNhY2hlX2VudHJ5LT5zZW1hbnRpYztcbiIpOworCSAgbGZfcHV0c3RyIChmaWxlLCAiY2lhID0gc2VtYW50aWMgKGNwdSwgY2FjaGVfZW50cnksIGNpYSk7XG4iKTsKKwkgIC8qIHRhaWwgKi8KKwkgIGxmX2luZGVudCAoZmlsZSwgLTQpOworCSAgbGZfcHV0c3RyIChmaWxlLCAiICB9XG4iKTsKKwkgIGxmX3B1dHN0ciAoZmlsZSwgImVsc2VcbiIpOworCSAgbGZfcHV0c3RyIChmaWxlLCAiICB7XG4iKTsKKwkgIGxmX2luZGVudCAoZmlsZSwgKzQpOworCSAgbGZfcHV0c3RyIChmaWxlLCAiLyogY2FjaGUgbWlzcyAqL1xuIik7CisJICBpZiAoIW9wdGlvbnMuZ2VuLnNlbWFudGljX2ljYWNoZSkKKwkgICAgeworCSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgImlkZWNvZGVfc2VtYW50aWMgKnNlbWFudGljO1xuIik7CisJICAgIH0KKwkgIGxmX3ByaW50ZiAoZmlsZSwgImluc3RydWN0aW9uX3dvcmQgaW5zdHJ1Y3Rpb24gPSBJTUVNJWQgKGNpYSk7XG4iLAorCQkgICAgIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSk7CisJICBsZl9wdXRzdHIgKGZpbGUsICJpZiAoV0lUSF9NT04gIT0gMClcbiIpOworCSAgbGZfcHV0c3RyIChmaWxlLCAiICBtb25fZXZlbnQgKG1vbl9ldmVudF9pY2FjaGVfbWlzcywgY3B1LCBjaWEpO1xuIik7CisJICBpZiAob3B0aW9ucy5nZW4uc2VtYW50aWNfaWNhY2hlKQorCSAgICB7CisJICAgICAgbGZfcHV0c3RyIChmaWxlLCAie1xuIik7CisJICAgICAgbGZfaW5kZW50IChmaWxlLCArMik7CisJICAgICAgcHJpbnRfZW5naW5lX2lzc3VlX3ByZWZpeF9ob29rIChmaWxlKTsKKwkgICAgICBwcmludF9pZGVjb2RlX2JvZHkgKGZpbGUsIHRhYmxlLCAibmlhID0iKTsKKwkgICAgICBwcmludF9lbmdpbmVfaXNzdWVfcG9zdGZpeF9ob29rIChmaWxlKTsKKwkgICAgICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKKwkgICAgICBsZl9wdXRzdHIgKGZpbGUsICJ9XG4iKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcHJpbnRfZW5naW5lX2lzc3VlX3ByZWZpeF9ob29rIChmaWxlKTsKKwkgICAgICBwcmludF9pZGVjb2RlX2JvZHkgKGZpbGUsIHRhYmxlLCAic2VtYW50aWMgPSIpOworCSAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIm5pYSA9IHNlbWFudGljIChjcHUsIGNhY2hlX2VudHJ5LCBjaWEpO1xuIik7CisJICAgICAgcHJpbnRfZW5naW5lX2lzc3VlX3Bvc3RmaXhfaG9vayAoZmlsZSk7CisJICAgIH0KKwkgIGxmX2luZGVudCAoZmlsZSwgLTQpOworCSAgbGZfcHV0c3RyIChmaWxlLCAiICB9XG4iKTsKKwl9CisgICAgICAKKyAgICAgIC8qIHVwZGF0ZSB0aGUgY3B1IGlmIG5lY2Vzc2FyeSAqLworICAgICAgc3dpdGNoIChvcHRpb25zLmdlbi5uaWEpCisJeworCWNhc2UgbmlhX2lzX2NpYV9wbHVzX29uZToKKwkgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisJICBsZl9wcmludGYgKGZpbGUsICIvKiBVcGRhdGUgdGhlIGluc3RydWN0aW9uIGFkZHJlc3MgKi9cbiIpOworCSAgbGZfcHJpbnRmIChmaWxlLCAiY2lhID0gbmlhO1xuIik7CisJICBicmVhazsKKwljYXNlIG5pYV9pc192b2lkOgorCWNhc2UgbmlhX2lzX2ludmFsaWQ6CisJICBFUlJPUiAoImVuZ2luZSBnZW4gd2hlbiBOSUEgY29tcGxleCIpOworCX0KKworICAgICAgLyogZXZlbnRzICovCisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiLyogcHJvY2VzcyBhbnkgZXZlbnRzICovXG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgImlmIChzaW1fZXZlbnRzX3RpY2sgKHNkKSlcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICB7XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICBDSUFfU0VUIChDUFUsIGNpYSk7XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICBzaW1fZXZlbnRzX3Byb2Nlc3MgKHNkKTtcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICAgIGNpYSA9IENJQV9HRVQgKENQVSk7XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgfVxuIik7CisKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgLTQpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiICB9XG4iKTsKKyAgICB9CisgIAorICBpZiAob3B0aW9ucy5nZW4uc21wKQorICAgIHsKKyAgICAgIAorICAgICAgbGZfcHV0c3RyIChmaWxlLCAiCisvKiBDQVNFIDI6IFNNUCAoV2l0aCBvciB3aXRob3V0IElDQUNIRSkKKworVGhlIGNvbXBsZXhpdHkgaGVyZSBjb21lcyBmcm9tIG5lZWRpbmcgdG8gY29ycmVjdGx5IGhhbHQgdGhlIHNpbXVsYXRvcgord2hlbiBpdCBpcyBhYm9ydGVkLiAgRm9yIGluc3RhbmNlLCBpZiBjcHUwIHJlcXVlc3RzIGEgcmVzdGFydCB0aGVuCitjcHUxIHdpbGwgbm9ybWFsbHkgYmUgdGhlIG5leHQgY3B1IHRoYXQgaXMgcnVuLiAgQ3B1MCBiZWluZyByZXN0YXJ0ZWQKK2FmdGVyIGFsbCB0aGUgb3RoZXIgQ1BVJ3MgYW5kIHRoZSBldmVudCBxdWV1ZSBoYXZlIGJlZW4gcHJvY2Vzc2VkICovCisKKyIpOworICAgICAgCisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiLyogaGF2ZSBlbnN1cmVkIHRoYXQgdGhlIGV2ZW50IHF1ZXVlIGlzIE5PVCBuZXh0ICovXG4iKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlNJTV9BU1NFUlQgKGN1cnJlbnRfY3B1ID49IDApO1xuIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJTSU1fQVNTRVJUIChjdXJyZW50X2NwdSA8PSBucl9jcHVzIC0gMSk7XG4iKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlNJTV9BU1NFUlQgKG5yX2NwdXMgPD0gTUFYX05SX1BST0NFU1NPUlMpO1xuIik7CisKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIlxuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJ3aGlsZSAoMSlcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICB7XG4iKTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgKzQpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAic2ltX2NwdSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgY3VycmVudF9jcHUpO1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJpbnN0cnVjdGlvbl9hZGRyZXNzIGNpYSA9IENJQV9HRVQgKGNwdSk7XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIlxuIik7CisKKyAgICAgIGlmICghb3B0aW9ucy5nZW4uaWNhY2hlKQorCXsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgImluc3RydWN0aW9uX3dvcmQgaW5zdHJ1Y3Rpb25fMCA9IElNRU0lZCAoY2lhKTtcbiIsCisJCSAgICAgb3B0aW9ucy5pbnNuX2JpdF9zaXplKTsKKwkgIHByaW50X2VuZ2luZV9pc3N1ZV9wcmVmaXhfaG9vayAoZmlsZSk7CisJICBwcmludF9pZGVjb2RlX2JvZHkgKGZpbGUsIHRhYmxlLCAiY2lhID0iKTsKKwkgIGxmX3B1dHN0ciAoZmlsZSwgIkNJQV9TRVQgKGNwdSwgY2lhKTtcbiIpOworCSAgcHJpbnRfZW5naW5lX2lzc3VlX3Bvc3RmaXhfaG9vayAoZmlsZSk7CisJfQorICAgICAgCisgICAgICBpZiAob3B0aW9ucy5nZW4uaWNhY2hlKQorCXsKKwkgIGxmX3B1dHN0ciAoZmlsZSwgImVuZ2luZV9jYWNoZSAqY2FjaGVfZW50cnkgPVxuIik7CisJICBsZl9wdXRzdHIgKGZpbGUsICIgIGNwdV9pY2FjaGVfZW50cnkocHJvY2Vzc29yLCBjaWEpO1xuIik7CisJICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOworCSAgbGZfcHV0c3RyIChmaWxlLCAiaWYgKGNhY2hlX2VudHJ5LT5hZGRyZXNzID09IGNpYSkge1xuIik7CisJICB7CisJICAgIGxmX2luZGVudCAoZmlsZSwgKzIpOworCSAgICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOworCSAgICBsZl9wdXRzdHIgKGZpbGUsICIvKiBjYWNoZSBoaXQgKi9cbiIpOworCSAgICBsZl9wdXRzdHIgKGZpbGUsICJlbmdpbmVfc2VtYW50aWMgKnNlbWFudGljID0gY2FjaGVfZW50cnktPnNlbWFudGljO1xuIik7CisJICAgIGxmX3B1dHN0ciAoZmlsZSwgImNpYSA9IHNlbWFudGljKHByb2Nlc3NvciwgY2FjaGVfZW50cnksIGNpYSk7XG4iKTsKKwkgICAgLyogdGFpbCAqLworCSAgICBsZl9wdXRzdHIgKGZpbGUsICJjcHVfc2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IsIGNpYSk7XG4iKTsKKwkgICAgbGZfcHV0c3RyIChmaWxlLCAiXG4iKTsKKwkgICAgbGZfaW5kZW50IChmaWxlLCAtMik7CisJICB9CisJICBsZl9wdXRzdHIgKGZpbGUsICJ9XG4iKTsKKwkgIGxmX3B1dHN0ciAoZmlsZSwgImVsc2Uge1xuIik7CisJICB7CisJICAgIGxmX2luZGVudCAoZmlsZSwgKzIpOworCSAgICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOworCSAgICBsZl9wdXRzdHIgKGZpbGUsICIvKiBjYWNoZSBtaXNzICovXG4iKTsKKwkgICAgaWYgKCFvcHRpb25zLmdlbi5zZW1hbnRpY19pY2FjaGUpCisJICAgICAgeworCQlsZl9wdXRzdHIgKGZpbGUsICJlbmdpbmVfc2VtYW50aWMgKnNlbWFudGljO1xuIik7CisJICAgICAgfQorCSAgICBsZl9wcmludGYgKGZpbGUsICJpbnN0cnVjdGlvbl93b3JkIGluc3RydWN0aW9uID0gSU1FTSVkIChjaWEpO1xuIiwKKwkJICAgICAgIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSk7CisJICAgIGxmX3B1dHN0ciAoZmlsZSwgImlmIChXSVRIX01PTiAhPSAwKVxuIik7CisJICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgbW9uX2V2ZW50KG1vbl9ldmVudF9pY2FjaGVfbWlzcywgcHJvY2Vzc29yc1tjdXJyZW50X2NwdV0sIGNpYSk7XG4iKTsKKwkgICAgaWYgKG9wdGlvbnMuZ2VuLnNlbWFudGljX2ljYWNoZSkKKwkgICAgICB7CisJCWxmX3B1dHN0ciAoZmlsZSwgIntcbiIpOworCQlsZl9pbmRlbnQgKGZpbGUsICsyKTsKKwkJcHJpbnRfZW5naW5lX2lzc3VlX3ByZWZpeF9ob29rIChmaWxlKTsKKwkJcHJpbnRfaWRlY29kZV9ib2R5KGZpbGUsIHRhYmxlLCAiY2lhID0iKTsKKwkJcHJpbnRfZW5naW5lX2lzc3VlX3Bvc3RmaXhfaG9vayAoZmlsZSk7CisJCWxmX2luZGVudCAoZmlsZSwgLTIpOworCQlsZl9wdXRzdHIgKGZpbGUsICJ9XG4iKTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCXByaW50X2VuZ2luZV9pc3N1ZV9wcmVmaXhfaG9vayAoZmlsZSk7CisJCXByaW50X2lkZWNvZGVfYm9keShmaWxlLCB0YWJsZSwgInNlbWFudGljID0gIik7CisJCWxmX3B1dHN0ciAoZmlsZSwgImNpYSA9IHNlbWFudGljKHByb2Nlc3NvciwgY2FjaGVfZW50cnksIGNpYSk7XG4iKTsKKwkJcHJpbnRfZW5naW5lX2lzc3VlX3Bvc3RmaXhfaG9vayAoZmlsZSk7CisJICAgICAgfQorCSAgICAvKiB0YWlsICovCisJICAgIGxmX3B1dHN0ciAoZmlsZSwgImNwdV9zZXRfcHJvZ3JhbV9jb3VudGVyKHByb2Nlc3NvciwgY2lhKTtcbiIpOworCSAgICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOworCSAgICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKKwkgIH0KKwkgIGxmX3B1dHN0ciAoZmlsZSwgIn1cbiIpOworCX0KKyAgICAgIAorICAgICAgbGZfcHV0c3RyIChmaWxlLCAiXG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgImN1cnJlbnRfY3B1ICs9IDE7XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgImlmIChjdXJyZW50X2NwdSA9PSBucl9jcHVzKVxuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIHtcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICAgIGlmIChzaW1fZXZlbnRzX3RpY2sgKHNkKSlcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICAgICAge1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICIgICAgICAgIHNpbV9ldmVudHNfcHJvY2VzcyAoc2QpO1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICIgICAgICB9XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICBjdXJyZW50X2NwdSA9IDA7XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgfVxuIik7CisgICAgICAKKyAgICAgIC8qIHRhaWwgKi8KKyAgICAgIGxmX2luZGVudCAoZmlsZSwgLTQpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICB9XG4iKTsKKyAgICB9CisgIAorICAKKyAgbGZfaW5kZW50IChmaWxlLCAtMik7CisgIGxmX3B1dHN0ciAoZmlsZSwgIn1cbiIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgMAorc3RhdGljIHZvaWQKK3ByaW50X2p1bXAgKGxmICpmaWxlLAorCSAgICBpbnQgaXNfdGFpbCkKK3sKKyAgaWYgKCFvcHRpb25zLmdlbi5zbXApCisgICAgeworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiaWYgKGV2ZW50X3F1ZXVlX3RpY2sgKHNkKSlcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICB7XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICBDUFVfQ0lBIChwcm9jZXNzb3IpID0gbmlhO1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICIgICAgc2ltX2V2ZW50c19wcm9jZXNzIChzZCk7XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgfVxuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJ9XG4iKTsKKyAgICB9CisgIAorICBpZiAob3B0aW9ucy5nZW4uc21wKQorICAgIHsKKyAgICAgIGlmIChpc190YWlsKQorCWxmX3B1dHN0ciAoZmlsZSwgImNwdV9zZXRfcHJvZ3JhbV9jb3VudGVyKHByb2Nlc3NvciwgbmlhKTtcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiY3VycmVudF9jcHUgKz0gMTtcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiaWYgKGN1cnJlbnRfY3B1ID49IG5yX2NwdXMpXG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAge1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICIgICAgaWYgKHNpbV9ldmVudHNfdGljayAoc2QpKVxuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICIgICAgICB7XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICAgICAgc2ltX2V2ZW50c19wcm9jZXNzIChzZCk7XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICAgIH1cbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICAgIGN1cnJlbnRfY3B1ID0gMDtcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICB9XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgInByb2Nlc3NvciA9IHByb2Nlc3NvcnNbY3VycmVudF9jcHVdO1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJuaWEgPSBjcHVfZ2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IpO1xuIik7CisgICAgfQorICAKKyAgaWYgKG9wdGlvbnMuZ2VuLmljYWNoZSkKKyAgICB7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJjYWNoZV9lbnRyeSA9IGNwdV9pY2FjaGVfZW50cnkocHJvY2Vzc29yLCBuaWEpO1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJpZiAoY2FjaGVfZW50cnktPmFkZHJlc3MgPT0gbmlhKSB7XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgLyogY2FjaGUgaGl0ICovXG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgZ290byAqY2FjaGVfZW50cnktPnNlbWFudGljO1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJ9XG4iKTsKKyAgICAgIGlmIChpc190YWlsKSB7CisJbGZfcHV0c3RyIChmaWxlLCAiZ290byBjYWNoZV9taXNzO1xuIik7CisgICAgICB9CisgICAgfQorICAKKyAgaWYgKCFvcHRpb25zLmdlbi5pY2FjaGUgJiYgaXNfdGFpbCkKKyAgICB7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJnb3RvIGVuZ2luZTtcbiIpOworICAgIH0KKyAgCit9CisjZW5kaWYKKworCisjaWYgMAorc3RhdGljIHZvaWQKK3ByaW50X2p1bXBfaW5zbiAobGYgKmZpbGUsCisJCSBpbnNuX2VudHJ5ICppbnN0cnVjdGlvbiwKKwkJIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAorCQkgb3Bjb2RlX2ZpZWxkICpvcGNvZGVzLAorCQkgY2FjaGVfZW50cnkgKmNhY2hlX3J1bGVzKQoreworICBpbnNuX29wY29kZXMgb3Bjb2RlX3BhdGg7CisKKyAgbWVtc2V0ICgmb3Bjb2RlX3BhdGgsIDAsIHNpemVvZiAob3Bjb2RlX3BhdGgpKTsKKyAgb3Bjb2RlX3BhdGgub3Bjb2RlID0gb3Bjb2RlczsKKworICAvKiB3aGF0IHdlIGFyZSBmb3IgdGhlIG1vbWVudCAqLworICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICBwcmludF9teV9kZWZpbmVzIChmaWxlLAorCQkgICAgaW5zdHJ1Y3Rpb24tPm5hbWUsCisJCSAgICBpbnN0cnVjdGlvbi0+Zm9ybWF0X25hbWUsCisJCSAgICBleHBhbmRlZF9iaXRzKTsKKyAgCisgIC8qIG91dHB1dCB0aGUgaWNhY2hlIGVudHJ5ICovCisgIGlmIChvcHRpb25zLmdlbi5pY2FjaGUpCisgICAgeworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOworICAgICAgcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKKwkJCSAgIGluc3RydWN0aW9uLT5uYW1lLAorCQkJICAgaW5zdHJ1Y3Rpb24tPmZvcm1hdF9uYW1lLAorCQkJICAgTlVMTCwKKwkJCSAgIGV4cGFuZGVkX2JpdHMsCisJCQkgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGUpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiOlxuIik7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOworICAgICAgbGZfaW5kZW50IChmaWxlLCArMik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJjb25zdCB1bnNpZ25lZF93b3JkIGNpYSA9IG5pYTtcbiIpOworICAgICAgcHJpbnRfaXRyYWNlIChmaWxlLCBpbnN0cnVjdGlvbiwgMS8qcHV0dGluZy12YWx1ZS1pbi1jYWNoZSovKTsKKyAgICAgIHByaW50X2lkZWNvZGVfdmFsaWRhdGUgKGZpbGUsIGluc3RydWN0aW9uLCAmb3Bjb2RlX3BhdGgpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOworICAgICAgbGZfaW5kZW50IChmaWxlLCArMik7CisgICAgICBwcmludF9pY2FjaGVfYm9keSAoZmlsZSwKKwkJCSBpbnN0cnVjdGlvbiwKKwkJCSBleHBhbmRlZF9iaXRzLAorCQkJIGNhY2hlX3J1bGVzLAorCQkJIDAsIC8qdXNlX2RlZmluZXMqLworCQkJIHB1dF92YWx1ZXNfaW5faWNhY2hlKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImNhY2hlX2VudHJ5LT5hZGRyZXNzID0gbmlhO1xuIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJjYWNoZV9lbnRyeS0+c2VtYW50aWMgPSAmJiIpOworICAgICAgcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKKwkJCSAgIGluc3RydWN0aW9uLT5uYW1lLAorCQkJICAgaW5zdHJ1Y3Rpb24tPmZvcm1hdF9uYW1lLAorCQkJICAgTlVMTCwKKwkJCSAgIGV4cGFuZGVkX2JpdHMsCisJCQkgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiO1xuIik7CisgICAgICBpZiAob3B0aW9ucy5nZW4uc2VtYW50aWNfaWNhY2hlKQorCXsKKwkgIHByaW50X3NlbWFudGljX2JvZHkgKGZpbGUsCisJCQkgICAgICAgaW5zdHJ1Y3Rpb24sCisJCQkgICAgICAgZXhwYW5kZWRfYml0cywKKwkJCSAgICAgICAmb3Bjb2RlX3BhdGgpOworCSAgcHJpbnRfanVtcChmaWxlLCAxLyppcy10YWlsKi8pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBsZl9wcmludGYgKGZpbGUsICIvKiBnb3RvICIpOworCSAgcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKKwkJCSAgICAgICBpbnN0cnVjdGlvbi0+bmFtZSwKKwkJCSAgICAgICBpbnN0cnVjdGlvbi0+Zm9ybWF0X25hbWUsCisJCQkgICAgICAgTlVMTCwKKwkJCSAgICAgICBleHBhbmRlZF9iaXRzLAorCQkJICAgICAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljcyk7CisJICBsZl9wcmludGYgKGZpbGUsICI7ICovXG4iKTsKKwl9CisgICAgICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIn1cbiIpOworICAgICAgbGZfaW5kZW50IChmaWxlLCAtMik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJ9XG4iKTsKKyAgICB9CisgIAorICAvKiBwcmludCB0aGUgc2VtYW50aWNzICovCisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgIGxmX2luZGVudCAoZmlsZSwgLTEpOworICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAorCQkgICAgICAgaW5zdHJ1Y3Rpb24tPm5hbWUsCisJCSAgICAgICBpbnN0cnVjdGlvbi0+Zm9ybWF0X25hbWUsCisJCSAgICAgICBOVUxMLAorCQkgICAgICAgZXhwYW5kZWRfYml0cywKKwkJICAgICAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljcyk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIjpcbiIpOworICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7CisgIGxmX2luZGVudCAoZmlsZSwgKzIpOworICBsZl9wdXRzdHIgKGZpbGUsICJjb25zdCB1bnNpZ25lZF93b3JkIGNpYSA9IG5pYTtcbiIpOworICBwcmludF9pY2FjaGVfYm9keSAoZmlsZSwKKwkJICAgICBpbnN0cnVjdGlvbiwKKwkJICAgICBleHBhbmRlZF9iaXRzLAorCQkgICAgIGNhY2hlX3J1bGVzLAorCQkgICAgIChvcHRpb25zLmdlbi5kaXJlY3RfYWNjZXNzCisJCSAgICAgID8gZGVmaW5lX3ZhcmlhYmxlcworCQkgICAgICA6IGRlY2xhcmVfdmFyaWFibGVzKSwKKwkJICAgICAob3B0aW9ucy5nZW4uaWNhY2hlCisJCSAgICAgID8gZ2V0X3ZhbHVlc19mcm9tX2ljYWNoZQorCQkgICAgICA6IGRvX25vdF91c2VfaWNhY2hlKSk7CisgIHByaW50X3NlbWFudGljX2JvZHkgKGZpbGUsCisJCSAgICAgICBpbnN0cnVjdGlvbiwKKwkJICAgICAgIGV4cGFuZGVkX2JpdHMsCisJCSAgICAgICAmb3Bjb2RlX3BhdGgpOworICBpZiAob3B0aW9ucy5nZW4uZGlyZWN0X2FjY2VzcykKKyAgICBwcmludF9pY2FjaGVfYm9keSAoZmlsZSwKKwkJICAgICAgIGluc3RydWN0aW9uLAorCQkgICAgICAgZXhwYW5kZWRfYml0cywKKwkJICAgICAgIGNhY2hlX3J1bGVzLAorCQkgICAgICAgdW5kZWZfdmFyaWFibGVzLAorCQkgICAgICAgKG9wdGlvbnMuZ2VuLmljYWNoZQorCQkJPyBnZXRfdmFsdWVzX2Zyb21faWNhY2hlCisJCQk6IGRvX25vdF91c2VfaWNhY2hlKSk7CisgIHByaW50X2p1bXAoZmlsZSwgMS8qaXMgdGFpbCovKTsKKyAgbGZfaW5kZW50IChmaWxlLCAtMik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIn1cbiIpOworfQorI2VuZGlmCisKKworI2lmIDAKK3N0YXRpYyB2b2lkCitwcmludF9qdW1wX2RlZmluaXRpb24gKGxmICpmaWxlLAorCQkgICAgICAgZ2VuX2VudHJ5ICplbnRyeSwKKwkJICAgICAgIGludCBkZXB0aCwKKwkJICAgICAgIHZvaWQgKmRhdGEpCit7CisgIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcyA9IChjYWNoZV9lbnRyeSopZGF0YTsKKyAgaWYgKGVudHJ5LT5vcGNvZGVfcnVsZS0+d2l0aF9kdXBsaWNhdGVzKQorICAgIHsKKyAgICAgIEFTU0VSVCAoZW50cnktPm5yX2luc25zID09IDEKKwkgICAgICAmJiBlbnRyeS0+b3Bjb2RlID09IE5VTEwKKwkgICAgICAmJiBlbnRyeS0+cGFyZW50ICE9IE5VTEwKKwkgICAgICAmJiBlbnRyeS0+cGFyZW50LT5vcGNvZGUgIT0gTlVMTCk7CisgICAgICBBU1NFUlQgKGVudHJ5LT5ucl9pbnNucyA9PSAxCisJICAgICAgJiYgZW50cnktPm9wY29kZSA9PSBOVUxMCisJICAgICAgJiYgZW50cnktPnBhcmVudCAhPSBOVUxMCisJICAgICAgJiYgZW50cnktPnBhcmVudC0+b3Bjb2RlICE9IE5VTEwKKwkgICAgICAmJiBlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZSAhPSBOVUxMKTsKKyAgICAgIHByaW50X2p1bXBfaW5zbiAoZmlsZSwKKwkJICAgICAgIGVudHJ5LT5pbnNucy0+aW5zbiwKKwkJICAgICAgIGVudHJ5LT5leHBhbmRlZF9iaXRzLAorCQkgICAgICAgZW50cnktPm9wY29kZSwKKwkJICAgICAgIGNhY2hlX3J1bGVzKTsKKyAgICB9CisgIGVsc2UgCisgICAgeworICAgICAgcHJpbnRfanVtcF9pbnNuIChmaWxlLAorCQkgICAgICAgZW50cnktPmluc25zLT5pbnNuLAorCQkgICAgICAgTlVMTCwKKwkJICAgICAgIE5VTEwsCisJCSAgICAgICBjYWNoZV9ydWxlcyk7CisgICAgfQorfQorI2VuZGlmCisKKworI2lmIDAKK3N0YXRpYyB2b2lkCitwcmludF9qdW1wX2ludGVybmFsX2Z1bmN0aW9uIChsZiAqZmlsZSwKKwkJCSAgICAgIGZ1bmN0aW9uX2VudHJ5ICpmdW5jdGlvbiwKKwkJCSAgICAgIHZvaWQgKmRhdGEpCit7CisgIGlmIChmdW5jdGlvbi0+aXNfaW50ZXJuYWwpCisgICAgeworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgICAgIGxmX3ByaW50X19saW5lX3JlZiAoZmlsZSwgZnVuY3Rpb24tPmxpbmUpOworICAgICAgbGZfaW5kZW50IChmaWxlLCAtMSk7CisgICAgICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAorCQkJICAgZnVuY3Rpb24tPm5hbWUsCisJCQkgICBOVUxMLAorCQkJICAgTlVMTCwKKwkJCSAgIE5VTEwsCisJCQkgICAob3B0aW9ucy5nZW4uaWNhY2hlCisJCQkgICAgPyBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGUKKwkJCSAgICA6IGZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljcykpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiOlxuIik7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOworICAgICAgbGZfaW5kZW50IChmaWxlLCArMik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJjb25zdCB1bnNpZ25lZF93b3JkIGNpYSA9IG5pYTtcbiIpOworICAgICAgdGFibGVfcHJpbnRfY29kZSAoZmlsZSwgZnVuY3Rpb24tPmNvZGUpOworICAgICAgbGZfcHJpbnRfX2ludGVybmFsX3JlZiAoZmlsZSk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJlcnJvcihcIkludGVybmFsIGZ1bmN0aW9uIG11c3QgbG9uZ2p1bXBcXG5cIik7XG4iKTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgLTIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAifVxuIik7CisgICAgfQorfQorI2VuZGlmCisKKworI2lmIDAKK3N0YXRpYyB2b2lkCitwcmludF9qdW1wX2JvZHkgKGxmICpmaWxlLAorCQkgZ2VuX2VudHJ5ICplbnRyeSwKKwkJIGluc25fdGFibGUgKmlzYSwKKwkJIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcykKK3sKKyAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7CisgIGxmX2luZGVudCAoZmlsZSwgKzIpOworICBsZl9wdXRzdHIgKGZpbGUsICJqbXBfYnVmIGhhbHQ7XG4iKTsKKyAgbGZfcHV0c3RyIChmaWxlLCAiam1wX2J1ZiByZXN0YXJ0O1xuIik7CisgIGxmX3B1dHN0ciAoZmlsZSwgImNwdSAqcHJvY2Vzc29yID0gTlVMTDtcbiIpOworICBsZl9wdXRzdHIgKGZpbGUsICJ1bnNpZ25lZF93b3JkIG5pYSA9IC0xO1xuIik7CisgIGxmX3B1dHN0ciAoZmlsZSwgImluc3RydWN0aW9uX3dvcmQgaW5zdHJ1Y3Rpb24gPSAwO1xuIik7CisgIGlmIChvcHRpb25zLmdlbi5pY2FjaGUpCisgICAgeworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiZW5naW5lX2NhY2hlICpjYWNoZV9lbnRyeSA9IE5VTEw7XG4iKTsKKyAgICB9CisgIGlmIChvcHRpb25zLmdlbi5zbXApCisgICAgeworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiaW50IGN1cnJlbnRfY3B1ID0gLTE7XG4iKTsKKyAgICB9CisgIAorICAvKiBhbGwgdGhlIHN3aXRjaGVzIGFuZCB0YWJsZXMgLSB0aGV5IGtub3cgYWJvdXQganVtcGluZyAqLworICBwcmludF9pZGVjb2RlX2xvb2t1cHMgKGZpbGUsIGVudHJ5LCBjYWNoZV9ydWxlcyk7CisgIAorICAvKiBzdGFydCB0aGUgc2ltdWxhdGlvbiB1cCAqLworICBpZiAob3B0aW9ucy5nZW4uaWNhY2hlKQorICAgIHsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIlxuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJ7XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgaW50IGNwdV9ucjtcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IG5yX2NwdXM7IGNwdV9ucisrKVxuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICIgICAgY3B1X2ZsdXNoX2ljYWNoZShwcm9jZXNzb3JzW2NwdV9ucl0pO1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJ9XG4iKTsKKyAgICB9CisgIAorICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOworICBsZl9wdXRzdHIgKGZpbGUsICJwc2ltX3NldF9oYWx0X2FuZF9yZXN0YXJ0KHN5c3RlbSwgJmhhbHQsICZyZXN0YXJ0KTtcbiIpOworICAKKyAgbGZfcHV0c3RyIChmaWxlLCAiXG4iKTsKKyAgbGZfcHV0c3RyIChmaWxlLCAiaWYgKHNldGptcChoYWx0KSlcbiIpOworICBsZl9wdXRzdHIgKGZpbGUsICIgIHJldHVybjtcbiIpOworICAKKyAgbGZfcHV0c3RyIChmaWxlLCAiXG4iKTsKKyAgbGZfcHV0c3RyIChmaWxlLCAic2V0am1wKHJlc3RhcnQpO1xuIik7CisgIAorICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOworICBpZiAoIW9wdGlvbnMuZ2VuLnNtcCkKKyAgICB7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJwcm9jZXNzb3IgPSBwcm9jZXNzb3JzWzBdO1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJuaWEgPSBjcHVfZ2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IpO1xuIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiY3VycmVudF9jcHUgPSBwc2ltX2xhc3RfY3B1KHN5c3RlbSk7XG4iKTsKKyAgICB9CisgIAorICBpZiAoIW9wdGlvbnMuZ2VuLmljYWNoZSkKKyAgICB7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICAgICAgbGZfaW5kZW50IChmaWxlLCAtMSk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJlbmdpbmU6XG4iKTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOworICAgIH0KKyAgCisgIHByaW50X2p1bXAoZmlsZSwgMC8qaXNfdGFpbCovKTsKKyAgCisgIGlmIChvcHRpb25zLmdlbi5pY2FjaGUpCisgICAgeworICAgICAgbGZfaW5kZW50IChmaWxlLCAtMSk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJjYWNoZV9taXNzOlxuIik7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgICB9CisgIAorCSAgcHJpbnRfZW5naW5lX2lzc3VlX3ByZWZpeF9ob29rIChmaWxlKTsKKyAgbGZfcHV0c3RyIChmaWxlLCAiaW5zdHJ1Y3Rpb25cbiIpOworICBsZl9wdXRzdHIgKGZpbGUsICIgID0gdm1faW5zdHJ1Y3Rpb25fbWFwX3JlYWQoY3B1X2luc3RydWN0aW9uX21hcChwcm9jZXNzb3IpLFxuIik7CisgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IsIG5pYSk7XG4iKTsKKyAgcHJpbnRfZW5naW5lX2lzc3VlX3ByZWZpeF9ob29rIChmaWxlKTsKKyAgcHJpbnRfaWRlY29kZV9ib2R5IChmaWxlLCBlbnRyeSwgIi8qSUdPUkUqLyIpOworICBwcmludF9lbmdpbmVfaXNzdWVfcG9zdGZpeF9ob29rIChmaWxlKTsKKyAgCisgIC8qIHByaW50IG91dCBhIHRhYmxlIG9mIGFsbCB0aGUgaW50ZXJuYWxzIGZ1bmN0aW9ucyAqLworICBmdW5jdGlvbl9lbnRyeV90cmF2ZXJzZSAoZmlsZSwgaXNhLT5mdW5jdGlvbnMsCisJCQkgICBwcmludF9qdW1wX2ludGVybmFsX2Z1bmN0aW9uLAorCQkJICAgTlVMTCk7CisgIAorICAvKiBwcmludCBvdXQgYSB0YWJsZSBvZiBhbGwgdGhlIGluc3RydWN0aW9ucyAqLworICBFUlJPUiAoIlVzZSB0aGUgbGlzdCBvZiBzZW1hbnRpYyBmdW5jdGlvbnMsIG5vdCB0cmF2ZXJlX3RyZWUiKTsKKyAgZ2VuX2VudHJ5X3RyYXZlcnNlX3RyZWUgKGZpbGUsIGVudHJ5LAorCQkJICAgMSwKKwkJCSAgIE5VTEwsIC8qIHN0YXJ0ICovCisJCQkgICBwcmludF9qdW1wX2RlZmluaXRpb24sIC8qIGxlYWYgKi8KKwkJCSAgIE5VTEwsIC8qIGVuZCAqLworCQkJICAgY2FjaGVfcnVsZXMpOworICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAifVxuIik7Cit9CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCit2b2lkCitwcmludF9lbmdpbmVfcnVuX2Z1bmN0aW9uX2hlYWRlciAobGYgKmZpbGUsCisJCQkJICBjaGFyICpwcm9jZXNzb3IsCisJCQkJICBmdW5jdGlvbl9kZWNsX3R5cGUgZGVjbF90eXBlKQoreworICBpbnQgaW5kZW50OworICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICBzd2l0Y2ggKGRlY2xfdHlwZSkKKyAgICB7CisgICAgY2FzZSBpc19mdW5jdGlvbl9kZWNsYXJhdGlvbjoKKyAgICAgIGxmX3ByaW50X19mdW5jdGlvbl90eXBlIChmaWxlLCAidm9pZCIsICJJTkxJTkVfRU5HSU5FIiwgIlxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGlzX2Z1bmN0aW9uX2RlZmluaXRpb246CisgICAgICBsZl9wcmludF9fZnVuY3Rpb25fdHlwZSAoZmlsZSwgInZvaWQiLCAiSU5MSU5FX0VOR0lORSIsICIgIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGlzX2Z1bmN0aW9uX3ZhcmlhYmxlOgorICAgICAgbGZfcHJpbnRmIChmaWxlLCAidm9pZCAoKiIpOworICAgICAgYnJlYWs7CisgICAgfQorICBpbmRlbnQgPSBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAorCQkJCSJydW4iLAorCQkJCU5VTEwsIC8qIGZvcm1hdCBuYW1lICovCisJCQkJcHJvY2Vzc29yLAorCQkJCU5VTEwsIC8qIGV4cGFuZGVkIGJpdHMgKi8KKwkJCQlmdW5jdGlvbl9uYW1lX3ByZWZpeF9lbmdpbmUpOworICBzd2l0Y2ggKGRlY2xfdHlwZSkKKyAgICB7CisgICAgY2FzZSBpc19mdW5jdGlvbl9kZWZpbml0aW9uOgorICAgICAgbGZfcHV0c3RyIChmaWxlLCAiXG4oIik7CisgICAgICBpbmRlbnQgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBpc19mdW5jdGlvbl9kZWNsYXJhdGlvbjoKKyAgICAgIGluZGVudCArPSBsZl9wcmludGYgKGZpbGUsICIgKCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBpc19mdW5jdGlvbl92YXJpYWJsZToKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIilcbigiKTsKKyAgICAgIGluZGVudCA9IDE7CisgICAgICBicmVhazsKKyAgICB9CisgIGxmX2luZGVudCAoZmlsZSwgK2luZGVudCk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlNJTV9ERVNDIHNkLFxuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgImludCBuZXh0X2NwdV9ucixcbiIpOworICBsZl9wcmludGYgKGZpbGUsICJpbnQgbnJfY3B1cyxcbiIpOworICBsZl9wcmludGYgKGZpbGUsICJpbnQgc2lnZ25hbCkiKTsKKyAgbGZfaW5kZW50IChmaWxlLCAtaW5kZW50KTsKKyAgc3dpdGNoIChkZWNsX3R5cGUpCisgICAgeworICAgIGNhc2UgaXNfZnVuY3Rpb25fZGVmaW5pdGlvbjoKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIlxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGlzX2Z1bmN0aW9uX3ZhcmlhYmxlOgorICAgIGNhc2UgaXNfZnVuY3Rpb25fZGVjbGFyYXRpb246CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICI7XG4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworCit2b2lkCitnZW5fZW5naW5lX2ggKGxmICpmaWxlLAorCSAgICAgIGdlbl90YWJsZSAqZ2VuLAorCSAgICAgIGluc25fdGFibGUgKmlzYSwKKwkgICAgICBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZXMpCit7CisgIGdlbl9saXN0ICplbnRyeTsKKyAgZm9yIChlbnRyeSA9IGdlbi0+dGFibGVzOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQorICAgIHsKKyAgICAgIHByaW50X2VuZ2luZV9ydW5fZnVuY3Rpb25faGVhZGVyIChmaWxlLAorCQkJCQkob3B0aW9ucy5nZW4ubXVsdGlfc2ltCisJCQkJCSA/IGVudHJ5LT5tb2RlbC0+bmFtZQorCQkJCQkgOiBOVUxMKSwKKwkJCQkJaXNfZnVuY3Rpb25fZGVjbGFyYXRpb24pOworICAgIH0KK30KKworCit2b2lkCitnZW5fZW5naW5lX2MobGYgKmZpbGUsCisJICAgICBnZW5fdGFibGUgKmdlbiwKKwkgICAgIGluc25fdGFibGUgKmlzYSwKKwkgICAgIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcykKK3sKKyAgZ2VuX2xpc3QgKmVudHJ5OworICAvKiB0aGUgaW50cm8gKi8KKyAgcHJpbnRfaW5jbHVkZXMgKGZpbGUpOworICBwcmludF9pbmNsdWRlX2lubGluZSAoZmlsZSwgb3B0aW9ucy5tb2R1bGUuc2VtYW50aWNzKTsKKyAgcHJpbnRfaW5jbHVkZSAoZmlsZSwgb3B0aW9ucy5tb2R1bGUuZW5naW5lKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiI2luY2x1ZGUgXCJzaW0tYXNzZXJ0LmhcIlxuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgIHByaW50X2lkZWNvZGVfZ2xvYmFscyAoZmlsZSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisKKyAgZm9yIChlbnRyeSA9IGdlbi0+dGFibGVzOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQorICAgIHsKKyAgICAgIHN3aXRjaCAob3B0aW9ucy5nZW4uY29kZSkKKwl7CisJY2FzZSBnZW5lcmF0ZV9jYWxsczoKKwkgIHByaW50X2lkZWNvZGVfbG9va3VwcyAoZmlsZSwgZW50cnktPnRhYmxlLCBjYWNoZV9ydWxlcyk7CisJICAKKwkgIC8qIG91dHB1dCB0aGUgbWFpbiBlbmdpbmUgcm91dGluZSAqLworCSAgcHJpbnRfZW5naW5lX3J1bl9mdW5jdGlvbl9oZWFkZXIgKGZpbGUsCisJCQkJCSAgICAob3B0aW9ucy5nZW4ubXVsdGlfc2ltCisJCQkJCSAgICAgPyBlbnRyeS0+bW9kZWwtPm5hbWUKKwkJCQkJICAgICA6IE5VTEwpLAorCQkJCQkgICAgaXNfZnVuY3Rpb25fZGVmaW5pdGlvbik7CisJICBwcmludF9ydW5fYm9keSAoZmlsZSwgZW50cnktPnRhYmxlKTsKKwkgIGJyZWFrOworCSAgCisJY2FzZSBnZW5lcmF0ZV9qdW1wczoKKwkgIEVSUk9SICgiSnVtcHMgY3VycmVudGx5IHVuaW1wbGVtZW50ZWQiKTsKKyNpZiAwCisJICBwcmludF9lbmdpbmVfcnVuX2Z1bmN0aW9uX2hlYWRlciAoZmlsZSwKKwkJCQkJICAgIGVudHJ5LT5wcm9jZXNzb3IsCisJCQkJCSAgICBpc19mdW5jdGlvbl9kZWZpbml0aW9uKTsKKwkgIHByaW50X2p1bXBfYm9keSAoZmlsZSwgZW50cnktPnRhYmxlLAorCQkJICAgaXNhLCBjYWNoZV9ydWxlcyk7CisjZW5kaWYKKwkgIGJyZWFrOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zaW0vaWdlbi9nZW4tZW5naW5lLmggYi9zaW0vaWdlbi9nZW4tZW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiZDg3YQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9pZ2VuL2dlbi1lbmdpbmUuaApAQCAtMCwwICsxLDM3IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworZXh0ZXJuIHZvaWQgZ2VuX2VuZ2luZV9oCisobGYgKmZpbGUsCisgZ2VuX3RhYmxlICpnZW4sCisgaW5zbl90YWJsZSAqaXNhLAorIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcyk7CisKK2V4dGVybiB2b2lkIGdlbl9lbmdpbmVfYworKGxmICpmaWxlLAorIGdlbl90YWJsZSAqZ2VuLAorIGluc25fdGFibGUgKmlzYSwKKyBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZXMpOworCitleHRlcm4gdm9pZCBwcmludF9lbmdpbmVfcnVuX2Z1bmN0aW9uX2hlYWRlcgorKGxmICpmaWxlLAorIGNoYXIgKnByb2Nlc3NvciwKKyBmdW5jdGlvbl9kZWNsX3R5cGUgZGVjbF90eXBlKTsKKwpkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vZ2VuLWljYWNoZS5jIGIvc2ltL2lnZW4vZ2VuLWljYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZDVkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaWdlbi9nZW4taWNhY2hlLmMKQEAgLTAsMCArMSw4NTkgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAibGYuaCIKKyNpbmNsdWRlICJ0YWJsZS5oIgorI2luY2x1ZGUgImZpbHRlci5oIgorI2luY2x1ZGUgImlnZW4uaCIKKworI2luY2x1ZGUgImxkLWluc24uaCIKKyNpbmNsdWRlICJsZC1kZWNvZGUuaCIKKworI2luY2x1ZGUgImdlbi5oIgorCisjaW5jbHVkZSAiZ2VuLXNlbWFudGljcy5oIgorI2luY2x1ZGUgImdlbi1pZGVjb2RlLmgiCisjaW5jbHVkZSAiZ2VuLWljYWNoZS5oIgorCisKKworc3RhdGljIHZvaWQKK3ByaW50X2ljYWNoZV9mdW5jdGlvbl9oZWFkZXIgKGxmICpmaWxlLAorCQkJICAgICAgY29uc3QgY2hhciAqYmFzZW5hbWUsCisJCQkgICAgICBjb25zdCBjaGFyICpmb3JtYXRfbmFtZSwKKwkJCSAgICAgIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAorCQkJICAgICAgaW50IGlzX2Z1bmN0aW9uX2RlZmluaXRpb24sCisJCQkgICAgICBpbnQgbnJfcHJlZmV0Y2hlZF93b3JkcykKK3sKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9wcmludF9fZnVuY3Rpb25fdHlwZV9mdW5jdGlvbiAoZmlsZSwgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uX3R5cGUsCisJCQkJICAgICJFWFRFUk5fSUNBQ0hFIiwgIiAiKTsKKyAgcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKKwkJICAgICAgIGJhc2VuYW1lLCBmb3JtYXRfbmFtZSwgTlVMTCwKKwkJICAgICAgIGV4cGFuZGVkX2JpdHMsCisJCSAgICAgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGUpOworICBsZl9wcmludGYgKGZpbGUsICJcbigiKTsKKyAgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uX2Zvcm1hbCAoZmlsZSwgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIikiKTsKKyAgaWYgKCFpc19mdW5jdGlvbl9kZWZpbml0aW9uKQorICAgIGxmX3ByaW50ZiAoZmlsZSwgIjsiKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKK30KKworCit2b2lkCitwcmludF9pY2FjaGVfZGVjbGFyYXRpb24gKGxmICpmaWxlLAorCQkJICBpbnNuX2VudHJ5ICppbnNuLAorCQkJICBvcGNvZGVfYml0cyAqZXhwYW5kZWRfYml0cywKKwkJCSAgaW5zbl9vcGNvZGVzICpvcGNvZGVzLAorCQkJICBpbnQgbnJfcHJlZmV0Y2hlZF93b3JkcykKK3sKKyAgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uX2hlYWRlciAoZmlsZSwKKwkJCQlpbnNuLT5uYW1lLAorCQkJCWluc24tPmZvcm1hdF9uYW1lLAorCQkJCWV4cGFuZGVkX2JpdHMsCisJCQkJMC8qIGlzIG5vdCBmdW5jdGlvbiBkZWZpbml0aW9uICovLAorCQkJCW5yX3ByZWZldGNoZWRfd29yZHMpOworfQorCisKKworc3RhdGljIHZvaWQKK3ByaW50X2ljYWNoZV9leHRyYWN0aW9uIChsZiAqZmlsZSwKKwkJCSBjb25zdCBjaGFyICpmb3JtYXRfbmFtZSwKKwkJCSBjYWNoZV9lbnRyeV90eXBlIGNhY2hlX3R5cGUsCisJCQkgY29uc3QgY2hhciAqZW50cnlfbmFtZSwKKwkJCSBjb25zdCBjaGFyICplbnRyeV90eXBlLAorCQkJIGNvbnN0IGNoYXIgKmVudHJ5X2V4cHJlc3Npb24sCisJCQkgY2hhciAqc2luZ2xlX2luc25fZmllbGQsCisJCQkgbGluZV9yZWYgKmxpbmUsCisJCQkgaW5zbl9maWVsZF9lbnRyeSAqY3VyX2ZpZWxkLAorCQkJIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAorCQkJIGljYWNoZV9kZWNsX3R5cGUgd2hhdF90b19kZWNsYXJlLAorCQkJIGljYWNoZV9ib2R5X3R5cGUgd2hhdF90b19kbykKK3sKKyAgY29uc3QgY2hhciAqZXhwcmVzc2lvbjsKKyAgb3Bjb2RlX2JpdHMgKmJpdHM7CisgIGNoYXIgKnJlYXNvbjsKKyAgQVNTRVJUIChmb3JtYXRfbmFtZSAhPSBOVUxMKTsKKyAgQVNTRVJUIChlbnRyeV9uYW1lICE9IE5VTEwpOworICAKKyAgLyogZmlndXJlIG91dCBleGFjdGx5IHdoYXQgc2hvdWxkIGJlIGdvaW5nIG9uIGhlcmUgKi8KKyAgc3dpdGNoIChjYWNoZV90eXBlKQorICAgIHsKKyAgICBjYXNlIHNjcmF0Y2hfdmFsdWU6CisgICAgICBpZiAoKHdoYXRfdG9fZG8gJiBwdXRfdmFsdWVzX2luX2ljYWNoZSkKKwkgIHx8IHdoYXRfdG9fZG8gPT0gZG9fbm90X3VzZV9pY2FjaGUpCisJeworCSAgcmVhc29uID0gInNjcmF0Y2giOworCSAgd2hhdF90b19kbyA9IGRvX25vdF91c2VfaWNhY2hlOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm47CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvbXB1dGVfdmFsdWU6CisgICAgICBpZiAoKHdoYXRfdG9fZG8gJiBnZXRfdmFsdWVzX2Zyb21faWNhY2hlKQorCSAgfHwgd2hhdF90b19kbyA9PSBkb19ub3RfdXNlX2ljYWNoZSkKKwl7CisJICByZWFzb24gPSAiY29tcHV0ZSI7CisJICB3aGF0X3RvX2RvID0gZG9fbm90X3VzZV9pY2FjaGU7CisJfQorICAgICAgZWxzZQorCXJldHVybjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgY2FjaGVfdmFsdWU6CisgICAgICBpZiAoKHdoYXRfdG9fZGVjbGFyZSAhPSB1bmRlZl92YXJpYWJsZXMpCisJICB8fCAhKHdoYXRfdG9fZG8gJiBwdXRfdmFsdWVzX2luX2ljYWNoZSkpCisJeworCSAgcmVhc29uID0gImNhY2hlIjsKKwkgIHdoYXRfdG9fZGVjbGFyZSA9ICgod2hhdF90b19kbyAmIHB1dF92YWx1ZXNfaW5faWNhY2hlKQorCQkJICAgICA/IGRlY2xhcmVfdmFyaWFibGVzCisJCQkgICAgIDogd2hhdF90b19kZWNsYXJlKTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuOworICAgICAgYnJlYWs7CisgICAgfQorICAKKyAgLyogRm9yIHRoZSB0eXBlLCBkZWZhdWx0IHRvIGEgc2ltcGxlIHVuc2lnbmVkICovCisgIGlmIChlbnRyeV90eXBlID09IE5VTEwgfHwgc3RybGVuIChlbnRyeV90eXBlKSA9PSAwKQorICAgIGVudHJ5X3R5cGUgPSAidW5zaWduZWQiOworICAKKyAgLyogbG9vayB0aHJvdWdoIHRoZSBzZXQgb2YgZXhwYW5kZWQgc3ViIGZpZWxkcyB0byBzZWUgaWYgdGhpcyBmaWVsZAorICAgICBoYXMgYmVlbiBnaXZlbiBhIGNvbnN0YW50IHZhbHVlICovCisgIGZvciAoYml0cyA9IGV4cGFuZGVkX2JpdHM7CisgICAgICAgYml0cyAhPSBOVUxMOworICAgICAgIGJpdHMgPSBiaXRzLT5uZXh0KQorICAgIHsKKyAgICAgIGlmIChiaXRzLT5maWVsZCA9PSBjdXJfZmllbGQpCisJYnJlYWs7CisgICAgfQorICAKKyAgLyogRGVmaW5lIGEgc3RvcmFnZSBhcmVhIGZvciB0aGUgY2FjaGUgZWxlbWVudCAqLworICBzd2l0Y2ggKHdoYXRfdG9fZGVjbGFyZSkKKyAgICB7CisgICAgY2FzZSB1bmRlZl92YXJpYWJsZXM6CisgICAgICAvKiBXZSd2ZSBmaW5pc2hlZCB3aXRoIHRoZSAjZGVmaW5lIHZhbHVlIC0gZGVzdG9yeSBpdCAqLworICAgICAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiN1bmRlZiAlc1xuIiwgZW50cnlfbmFtZSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBkZWZpbmVfdmFyaWFibGVzOgorICAgICAgLyogVXNpbmcgZGlyZWN0IGFjY2VzcyBmb3IgdGhpcyBlbnRyeSwgY2xlYXIgYW55IHByaW9yCisgICAgICAgICBkZWZpbml0aW9uLCB0aGVuIGRlZmluZSBpdCAqLworICAgICAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiN1bmRlZiAlc1xuIiwgZW50cnlfbmFtZSk7CisgICAgICAvKiBEb24ndCB0eXBlIGNhc3QgcG9pbnRlciB0eXBlcyEgKi8KKyAgICAgIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7CisgICAgICBpZiAoc3RyY2hyIChlbnRyeV90eXBlLCAnKicpICE9IE5VTEwpCisJbGZfcHJpbnRmIChmaWxlLCAiI2RlZmluZSAlcyAoIiwgZW50cnlfbmFtZSk7CisgICAgICBlbHNlCisJbGZfcHJpbnRmIChmaWxlLCAiI2RlZmluZSAlcyAoKCVzKSAiLCBlbnRyeV9uYW1lLCBlbnRyeV90eXBlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgZGVjbGFyZV92YXJpYWJsZXM6CisgICAgICAvKiB1c2luZyB2YXJpYWJsZXMgdG8gZGVmaW5lIHRoZSB2YWx1ZSAqLworICAgICAgaWYgKGxpbmUgIT0gTlVMTCkKKwlsZl9wcmludF9fbGluZV9yZWYgKGZpbGUsIGxpbmUpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiJXMgY29uc3QgJXMgVU5VU0VEID0gIiwgZW50cnlfdHlwZSwgZW50cnlfbmFtZSk7CisgICAgICBicmVhazsKKyAgICB9CisgIAorICAKKyAgLyogZGVmaW5lIGEgdmFsdWUgZm9yIHRoYXQgc3RvcmFnZSBhcmVhIGFzIGRldGVybWluZWQgYnkgd2hhdCBpcyBpbgorICAgICB0aGUgY2FjaGUgKi8KKyAgaWYgKGJpdHMgIT0gTlVMTAorICAgICAgJiYgc2luZ2xlX2luc25fZmllbGQgIT0gTlVMTAorICAgICAgJiYgc3RyY21wIChlbnRyeV9uYW1lLCBzaW5nbGVfaW5zbl9maWVsZCkgPT0gMAorICAgICAgJiYgc3RyY21wIChlbnRyeV9uYW1lLCBjdXJfZmllbGQtPnZhbF9zdHJpbmcpID09IDAKKyAgICAgICYmICgoYml0cy0+b3Bjb2RlLT5pc19ib29sZWFuICYmIGJpdHMtPnZhbHVlID09IDApCisJICB8fCAoIWJpdHMtPm9wY29kZS0+aXNfYm9vbGVhbikpKQorICAgIHsKKyAgICAgIC8qIFRoZSBjYWNoZSBydWxlIGlzIHNwZWNpZnlpbmcgd2hhdCB0byBkbyB3aXRoIGEgc2ltcGxlCisgICAgICAgICBpbnN0cnVjdGlvbiBmaWVsZC4KKwkgCisJIEJlY2F1c2Ugb2YgaW5zdHJ1Y3Rpb24gZXhwYW5zaW9uLCB0aGUgZmllbGQgaXMgZWl0aGVyIGEKKwkgY29uc3RhbnQgdmFsdWUgb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBjb25zdGFudCAoYm9vbGVhbgorCSBjb21wYXJpc29uKS4gKFRoZSBsYXR0ZXIgaW5kaWNhdGVkIGJ5IGJpdHMtPnZhbHVlID09IDApLgorCSAKKyAgICAgICAgIFRoZSBjYXNlIG9mIGEgZmllbGQgbm90IGJlaW5nIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgYm9vbGVhbgorICAgICAgICAgdmFsdWUgaXMgaGFuZGxlZCBsYXRlci4gKi8KKyAgICAgIGV4cHJlc3Npb24gPSAiY29uc3RhbnQgZmllbGQiOworICAgICAgQVNTRVJUIChiaXRzLT5maWVsZCA9PSBjdXJfZmllbGQpOworICAgICAgaWYgKGJpdHMtPm9wY29kZS0+aXNfYm9vbGVhbikKKwl7CisJICBBU1NFUlQgKGJpdHMtPnZhbHVlID09IDApOworCSAgbGZfcHJpbnRmIChmaWxlLCAiJWQiLCBiaXRzLT5vcGNvZGUtPmJvb2xlYW5fY29uc3RhbnQpOworCX0KKyAgICAgIGVsc2UgaWYgKGJpdHMtPm9wY29kZS0+bGFzdCA8IGJpdHMtPmZpZWxkLT5sYXN0KQorCXsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgIiVkIiwKKwkJICAgICBiaXRzLT52YWx1ZSA8PCAoYml0cy0+ZmllbGQtPmxhc3QgLSBiaXRzLT5vcGNvZGUtPmxhc3QpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbGZfcHJpbnRmIChmaWxlLCAiJWQiLCBiaXRzLT52YWx1ZSk7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoYml0cyAhPSBOVUxMCisJICAgJiYgc2luZ2xlX2luc25fZmllbGQgIT0gTlVMTAorCSAgICYmIHN0cm5jbXAgKGVudHJ5X25hbWUsCisJCSAgICAgICBzaW5nbGVfaW5zbl9maWVsZCwKKwkJICAgICAgIHN0cmxlbiAoc2luZ2xlX2luc25fZmllbGQpKSA9PSAwCisJICAgJiYgc3RybmNtcCAoZW50cnlfbmFtZSArIHN0cmxlbiAoc2luZ2xlX2luc25fZmllbGQpLAorCQkgICAgICAgIl9pc18iLAorCQkgICAgICAgc3RybGVuICgiX2lzXyIpKSA9PSAwCisJICAgJiYgKChiaXRzLT5vcGNvZGUtPmlzX2Jvb2xlYW4KKwkJJiYgKCh1bnNpZ25lZCkgYXRvbCAoZW50cnlfbmFtZSArIHN0cmxlbiAoc2luZ2xlX2luc25fZmllbGQpICsgc3RybGVuICgiX2lzXyIpKQorCQkgICAgPT0gYml0cy0+b3Bjb2RlLT5ib29sZWFuX2NvbnN0YW50KSkKKwkgICAgICAgfHwgKCFiaXRzLT5vcGNvZGUtPmlzX2Jvb2xlYW4pKSkKKyAgICB7CisgICAgICAvKiBUaGUgY2FjaGUgcnVsZSBkZWZpbmVzIGFuIGVudHJ5IGZvciB0aGUgY29tcGFyaXNvbiBiZXR3ZWVuIGEKKwkgc2luZ2xlIGluc3RydWN0aW9uIGZpZWxkIGFuZCBhIGNvbnN0YW50LiAgVGhlIHZhbHVlIG9mIHRoZQorCSBjb21wYXJpc29uIGluIHNvbWV3YXkgbWF0Y2hlcyB0aGF0IG9mIHRoZSBvcGNvZGUgZmllbGQgdGhhdAorCSB3YXMgbWFkZSBjb25zdGFudCB0aHJvdWdoIGV4cGFuc2lvbi4gKi8KKyAgICAgIGV4cHJlc3Npb24gPSAiY29uc3RhbnQgY29tcGFyZSI7CisgICAgICBpZiAoYml0cy0+b3Bjb2RlLT5pc19ib29sZWFuKQorCXsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgIiVkIC8qICVzID09ICVkICovIiwKKwkJICAgICBiaXRzLT52YWx1ZSA9PSAwLAorCQkgICAgIHNpbmdsZV9pbnNuX2ZpZWxkLAorCQkgICAgIGJpdHMtPm9wY29kZS0+Ym9vbGVhbl9jb25zdGFudCk7CisJfQorICAgICAgZWxzZSBpZiAoYml0cy0+b3Bjb2RlLT5sYXN0IDwgYml0cy0+ZmllbGQtPmxhc3QpCisJeworCSAgbGZfcHJpbnRmIChmaWxlLCAiJWQgLyogJXMgPT0gJWQgKi8iLAorCQkgICAgIChhdG9sIChlbnRyeV9uYW1lICsgc3RybGVuIChzaW5nbGVfaW5zbl9maWVsZCkgKyBzdHJsZW4gKCJfaXNfIikpCisJCSAgICAgID09IChiaXRzLT52YWx1ZSA8PCAoYml0cy0+ZmllbGQtPmxhc3QgLSBiaXRzLT5vcGNvZGUtPmxhc3QpKSksCisJCSAgICAgc2luZ2xlX2luc25fZmllbGQsCisJCSAgICAgKGJpdHMtPnZhbHVlIDw8IChiaXRzLT5maWVsZC0+bGFzdCAtIGJpdHMtPm9wY29kZS0+bGFzdCkpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbGZfcHJpbnRmIChmaWxlLCAiJWQgLyogJXMgPT0gJWQgKi8iLAorCQkgICAgIChhdG9sIChlbnRyeV9uYW1lICsgc3RybGVuIChzaW5nbGVfaW5zbl9maWVsZCkgKyBzdHJsZW4gKCJfaXNfIikpCisJCSAgICAgID09IGJpdHMtPnZhbHVlKSwKKwkJICAgICBzaW5nbGVfaW5zbl9maWVsZCwKKwkJICAgICBiaXRzLT52YWx1ZSk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIHB1dCB0aGUgZmllbGQgaW4gdGhlIGxvY2FsIHZhcmlhYmxlLCBwb3NzaWJseSBhbHNvIGVudGVyIGl0CisJIGludG8gdGhlIGNhY2hlICovCisgICAgICBleHByZXNzaW9uID0gImV4dHJhY3Rpb24iOworICAgICAgLyogaGFuZGxlIHRoZSBjYWNoZSAqLworICAgICAgaWYgKCh3aGF0X3RvX2RvICYgZ2V0X3ZhbHVlc19mcm9tX2ljYWNoZSkKKwkgIHx8ICh3aGF0X3RvX2RvICYgcHV0X3ZhbHVlc19pbl9pY2FjaGUpKQorCXsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgImNhY2hlX2VudHJ5LT5jcmFjay4lcy4lcyIsCisJCSAgICAgZm9ybWF0X25hbWUsCisJCSAgICAgZW50cnlfbmFtZSk7CisJICBpZiAod2hhdF90b19kbyAmIHB1dF92YWx1ZXNfaW5faWNhY2hlKSAvKiBhbHNvIHB1dCBpdCBpbiB0aGUgY2FjaGU/ICovCisJICAgIHsKKwkgICAgICBsZl9wcmludGYgKGZpbGUsICIgPSAiKTsKKwkgICAgfQorCX0KKyAgICAgIGlmICgod2hhdF90b19kbyAmIHB1dF92YWx1ZXNfaW5faWNhY2hlKQorCSAgfHwgd2hhdF90b19kbyA9PSBkb19ub3RfdXNlX2ljYWNoZSkKKwl7CisJICBpZiAoY3VyX2ZpZWxkICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBpZiAoZW50cnlfZXhwcmVzc2lvbiAhPSBOVUxMICYmIHN0cmxlbiAoZW50cnlfZXhwcmVzc2lvbikgPiAwKQorCQllcnJvciAobGluZSwgIkluc3RydWN0aW9uIGZpZWxkIGVudHJ5IHdpdGggbm9uZW1wdHkgZXhwcmVzc2lvblxuIik7CisJICAgICAgaWYgKGN1cl9maWVsZC0+Zmlyc3QgPT0gMCAmJiBjdXJfZmllbGQtPmxhc3QgPT0gb3B0aW9ucy5pbnNuX2JpdF9zaXplIC0gMSkKKwkJbGZfcHJpbnRmIChmaWxlLCAiKGluc3RydWN0aW9uXyVkKSIsCisJCQkgICBjdXJfZmllbGQtPndvcmRfbnIpOworCSAgICAgIGVsc2UgaWYgKGN1cl9maWVsZC0+bGFzdCA9PSBvcHRpb25zLmluc25fYml0X3NpemUgLSAxKQorCQlsZl9wcmludGYgKGZpbGUsICJNQVNLRUQlZCAoaW5zdHJ1Y3Rpb25fJWQsICVkLCAlZCkiLAorCQkJICAgb3B0aW9ucy5pbnNuX2JpdF9zaXplLAorCQkJICAgY3VyX2ZpZWxkLT53b3JkX25yLAorCQkJICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCBjdXJfZmllbGQtPmZpcnN0KSwKKwkJCSAgIGkydGFyZ2V0IChvcHRpb25zLmhpX2JpdF9uciwgY3VyX2ZpZWxkLT5sYXN0KSk7CisJICAgICAgZWxzZQorCQlsZl9wcmludGYgKGZpbGUsICJFWFRSQUNURUQlZCAoaW5zdHJ1Y3Rpb25fJWQsICVkLCAlZCkiLAorCQkJICAgb3B0aW9ucy5pbnNuX2JpdF9zaXplLAorCQkJICAgY3VyX2ZpZWxkLT53b3JkX25yLAorCQkJICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCBjdXJfZmllbGQtPmZpcnN0KSwKKwkJCSAgIGkydGFyZ2V0IChvcHRpb25zLmhpX2JpdF9uciwgY3VyX2ZpZWxkLT5sYXN0KSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgZW50cnlfZXhwcmVzc2lvbik7CisJICAgIH0KKwl9CisgICAgfQorICAKKyAgc3dpdGNoICh3aGF0X3RvX2RlY2xhcmUpCisgICAgeworICAgIGNhc2UgZGVmaW5lX3ZhcmlhYmxlczoKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIikiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdW5kZWZfdmFyaWFibGVzOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBkZWNsYXJlX3ZhcmlhYmxlczoKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIjsiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBBU1NFUlQgKHJlYXNvbiAhPSBOVUxMICYmIGV4cHJlc3Npb24gIT0gTlVMTCk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiAvKiAlcyAtICVzICovXG4iLCByZWFzb24sIGV4cHJlc3Npb24pOworfQorCisKK3ZvaWQKK3ByaW50X2ljYWNoZV9ib2R5IChsZiAqZmlsZSwKKwkJICAgaW5zbl9lbnRyeSAqaW5zdHJ1Y3Rpb24sCisJCSAgIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAorCQkgICBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZXMsCisJCSAgIGljYWNoZV9kZWNsX3R5cGUgd2hhdF90b19kZWNsYXJlLAorCQkgICBpY2FjaGVfYm9keV90eXBlIHdoYXRfdG9fZG8sCisJCSAgIGludCBucl9wcmVmZXRjaGVkX3dvcmRzKQoreworICAvKiBleHRyYWN0IGluc3RydWN0aW9uIGZpZWxkcyAqLworICBsZl9wcmludGYgKGZpbGUsICIvKiBFeHRyYWN0aW9uOiAlc1xuIiwgaW5zdHJ1Y3Rpb24tPm5hbWUpOworICBsZl9wcmludGYgKGZpbGUsICIgICAgICIpOworICBzd2l0Y2ggKHdoYXRfdG9fZGVjbGFyZSkKKyAgICB7CisgICAgY2FzZSBkZWZpbmVfdmFyaWFibGVzOgorICAgICAgbGZfcHJpbnRmIChmaWxlLCAiI2RlZmluZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBkZWNsYXJlX3ZhcmlhYmxlczoKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImRlY2xhcmUiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdW5kZWZfdmFyaWFibGVzOgorICAgICAgbGZfcHJpbnRmIChmaWxlLCAiI3VuZGVmIik7CisgICAgICBicmVhazsKKyAgICB9CisgIGxmX3ByaW50ZiAoZmlsZSwgIiAiKTsKKyAgc3dpdGNoICh3aGF0X3RvX2RvKQorICAgIHsKKyAgICBjYXNlIGdldF92YWx1ZXNfZnJvbV9pY2FjaGU6CisgICAgICBsZl9wcmludGYgKGZpbGUsICJnZXQtdmFsdWVzLWZyb20taWNhY2hlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHB1dF92YWx1ZXNfaW5faWNhY2hlOgorICAgICAgbGZfcHJpbnRmIChmaWxlLCAicHV0LXZhbHVlcy1pbi1pY2FjaGUiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYm90aF92YWx1ZXNfYW5kX2ljYWNoZToKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImdldC12YWx1ZXMtZnJvbS1pY2FjaGV8cHV0LXZhbHVlcy1pbi1pY2FjaGUiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgZG9fbm90X3VzZV9pY2FjaGU6CisgICAgICBsZl9wcmludGYgKGZpbGUsICJkby1ub3QtdXNlLWljYWNoZSIpOworICAgICAgYnJlYWs7CisgICAgfQorICBsZl9wcmludGYgKGZpbGUsICJcbiAgICAgIik7CisgIHByaW50X2luc25fd29yZHMgKGZpbGUsIGluc3RydWN0aW9uKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgKi9cbiIpOworICAKKyAgLyogcGFzcyB6ZXJvIC0gZmV0Y2ggZnJvbSBtZW1vcnkgYW55IG1pc3NpbmcgaW5zdHJ1Y3Rpb25zLgorCisgICAgIFNvbWUgb2YgdGhlIGluc3RydWN0aW9ucyB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIGZldGNoZWQgKGluIHRoZQorICAgICBpbnN0cnVjdGlvbiBhcnJheSksIG90aGVycyB3aWxsIHN0aWxsIG5lZWQgZmV0Y2hpbmcuICovCisgIHN3aXRjaCAod2hhdF90b19kbykKKyAgICB7CisgICAgY2FzZSBnZXRfdmFsdWVzX2Zyb21faWNhY2hlOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBwdXRfdmFsdWVzX2luX2ljYWNoZToKKyAgICBjYXNlIGJvdGhfdmFsdWVzX2FuZF9pY2FjaGU6CisgICAgY2FzZSBkb19ub3RfdXNlX2ljYWNoZToKKyAgICAgIHsKKwlpbnQgd29yZF9ucjsKKwlzd2l0Y2ggKHdoYXRfdG9fZGVjbGFyZSkKKwkgIHsKKwkgIGNhc2UgdW5kZWZfdmFyaWFibGVzOgorCSAgICBicmVhazsKKwkgIGNhc2UgZGVmaW5lX3ZhcmlhYmxlczoKKwkgIGNhc2UgZGVjbGFyZV92YXJpYWJsZXM6CisJICAgIGZvciAod29yZF9uciA9IG5yX3ByZWZldGNoZWRfd29yZHM7CisJCSB3b3JkX25yIDwgaW5zdHJ1Y3Rpb24tPm5yX3dvcmRzOworCQkgd29yZF9ucisrKQorCSAgICAgIHsKKwkJLyogRklYTUUgLSBzaG91bGQgYmUgdXNpbmcgcHJpbnRfaWNhY2hlX2V4dHJhY3Rpb24/ICovCisJCWxmX3ByaW50ZiAoZmlsZSwgIiVzaW5zdHJ1Y3Rpb25fd29yZCBpbnN0cnVjdGlvbl8lZCBVTlVTRUQgPSAiLAorCQkJICAgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sLAorCQkJICAgd29yZF9ucik7CisJCWxmX3ByaW50ZiAoZmlsZSwgIklNRU0lZF9JTU1FRCAoY2lhLCAlZCkiLAorCQkJICAgb3B0aW9ucy5pbnNuX2JpdF9zaXplLCB3b3JkX25yKTsKKwkJbGZfcHJpbnRmIChmaWxlLCAiO1xuIik7CisJICAgICAgfQorCSAgfQorICAgICAgfQorICAgIH0KKworICAvKiBpZiBwdXR0aW5nIHRoZSBpbnN0cnVjdGlvbiB3b3JkcyBpbiB0aGUgY2FjaGUsIGRlZmluZSByZWZlcmVuY2VzCisgICAgIGZvciB0aGVtICovCisgIGlmIChvcHRpb25zLmdlbi5pbnNuX2luX2ljYWNoZSkgeworICAgIC8qIEZJWE1FOiBpcyB0aGUgaW5zdHJ1Y3Rpb25fd29yZCB0eXBlIGNvcnJlY3Q/ICovCisgICAgcHJpbnRfaWNhY2hlX2V4dHJhY3Rpb24gKGZpbGUsCisJCQkgICAgIGluc3RydWN0aW9uLT5mb3JtYXRfbmFtZSwKKwkJCSAgICAgY2FjaGVfdmFsdWUsCisJCQkgICAgICJpbnNuIiwgLyogbmFtZSAqLworCQkJICAgICAiaW5zdHJ1Y3Rpb25fd29yZCIsIC8qIHR5cGUgKi8KKwkJCSAgICAgImluc3RydWN0aW9uIiwgLyogZXhwcmVzc2lvbiAqLworCQkJICAgICBOVUxMLCAvKiBvcmlnaW4gKi8KKwkJCSAgICAgTlVMTCwgLyogbGluZSAqLworCQkJICAgICBOVUxMLCBOVUxMLAorCQkJICAgICB3aGF0X3RvX2RlY2xhcmUsCisJCQkgICAgIHdoYXRfdG9fZG8pOworICB9CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKworICAvKiBwYXNzIG9uZSAtIHByb2Nlc3MgaW5zdHJ1Y3Rpb24gZmllbGRzLgorCisgICAgIElmIHRoZXJlIGlzIG5vIGNhY2hlIHJ1bGUsIHRoZSBkZWZhdWx0IGlzIHRvIGVudGVyIHRoZSBmaWVsZCBpbnRvCisgICAgIHRoZSBjYWNoZSAqLworICB7CisgICAgaW5zbl93b3JkX2VudHJ5ICp3b3JkOworICAgIGZvciAod29yZCA9IGluc3RydWN0aW9uLT53b3JkczsKKwkgd29yZCAhPSBOVUxMOworCSB3b3JkID0gd29yZC0+bmV4dCkKKyAgICAgIHsKKwlpbnNuX2ZpZWxkX2VudHJ5ICpjdXJfZmllbGQ7CisJZm9yIChjdXJfZmllbGQgPSB3b3JkLT5maXJzdDsKKwkgICAgIGN1cl9maWVsZC0+Zmlyc3QgPCBvcHRpb25zLmluc25fYml0X3NpemU7CisJICAgICBjdXJfZmllbGQgPSBjdXJfZmllbGQtPm5leHQpCisJICB7CisJICAgIGlmIChjdXJfZmllbGQtPnR5cGUgPT0gaW5zbl9maWVsZF9zdHJpbmcpCisJICAgICAgeworCQljYWNoZV9lbnRyeSAqY2FjaGVfcnVsZTsKKwkJY2FjaGVfZW50cnlfdHlwZSB2YWx1ZV90eXBlID0gY2FjaGVfdmFsdWU7CisJCWxpbmVfcmVmICp2YWx1ZV9saW5lID0gaW5zdHJ1Y3Rpb24tPmxpbmU7CisJCS8qIGNoZWNrIHRoZSBjYWNoZSB0YWJsZSB0byBzZWUgaWYgaXQgY29udGFpbnMgYSBydWxlCisJCSAgIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgY2FjaGUgYWN0aW9uIGZvciBhbgorCQkgICBpbnN0cnVjdGlvbiBmaWVsZCAqLworCQlmb3IgKGNhY2hlX3J1bGUgPSBjYWNoZV9ydWxlczsKKwkJICAgICBjYWNoZV9ydWxlICE9IE5VTEw7CisJCSAgICAgY2FjaGVfcnVsZSA9IGNhY2hlX3J1bGUtPm5leHQpCisJCSAgeworCQkgICAgaWYgKGZpbHRlcl9pc19zdWJzZXQgKGluc3RydWN0aW9uLT5maWVsZF9uYW1lcywKKwkJCQkJICBjYWNoZV9ydWxlLT5vcmlnaW5hbF9maWVsZHMpCisJCQkmJiBzdHJjbXAgKGNhY2hlX3J1bGUtPm5hbWUsIGN1cl9maWVsZC0+dmFsX3N0cmluZykgPT0gMCkKKwkJICAgICAgeworCQkJdmFsdWVfdHlwZSA9IGNhY2hlX3J1bGUtPmVudHJ5X3R5cGU7CisJCQl2YWx1ZV9saW5lID0gY2FjaGVfcnVsZS0+bGluZTsKKwkJCWlmICh2YWx1ZV90eXBlID09IGNvbXB1dGVfdmFsdWUpCisJCQkgIHsKKwkJCSAgICBvcHRpb25zLndhcm5pbmcgKGNhY2hlX3J1bGUtPmxpbmUsCisJCQkJCSAgICAgImluc3RydWN0aW9uIGZpZWxkIG9mIHR5cGUgYGNvbXB1dGUnIGNoYW5nZWQgdG8gYGNhY2hlJ1xuIik7CisJCQkgICAgY2FjaGVfcnVsZS0+ZW50cnlfdHlwZSA9IGNhY2hlX3ZhbHVlOworCQkJICB9CisJCQlicmVhazsKKwkJICAgICAgfQorCQkgIH0KKwkJLyogRGVmaW5lIGFuIGVudHJ5IGZvciB0aGUgZmllbGQgd2l0aGluIHRoZQorICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uICovCisJCXByaW50X2ljYWNoZV9leHRyYWN0aW9uIChmaWxlLAorCQkJCQkgaW5zdHJ1Y3Rpb24tPmZvcm1hdF9uYW1lLAorCQkJCQkgdmFsdWVfdHlwZSwKKwkJCQkJIGN1cl9maWVsZC0+dmFsX3N0cmluZywgLyogbmFtZSAqLworCQkJCQkgTlVMTCwgLyogdHlwZSAqLworCQkJCQkgTlVMTCwgLyogZXhwcmVzc2lvbiAqLworCQkJCQkgY3VyX2ZpZWxkLT52YWxfc3RyaW5nLCAvKiBpbnNuIGZpZWxkICovCisJCQkJCSB2YWx1ZV9saW5lLAorCQkJCQkgY3VyX2ZpZWxkLAorCQkJCQkgZXhwYW5kZWRfYml0cywKKwkJCQkJIHdoYXRfdG9fZGVjbGFyZSwKKwkJCQkJIHdoYXRfdG9fZG8pOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKyAgfQorCisgIC8qIHBhc3MgdHdvIC0gYW55IGNhY2hlIGZpZWxkcyBub3QgcHJvY2Vzc2VkIGFib3ZlICovCisgIHsKKyAgICBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZTsKKyAgICBmb3IgKGNhY2hlX3J1bGUgPSBjYWNoZV9ydWxlczsKKwkgY2FjaGVfcnVsZSAhPSBOVUxMOworCSBjYWNoZV9ydWxlID0gY2FjaGVfcnVsZS0+bmV4dCkKKyAgICAgIHsKKwlpZiAoZmlsdGVyX2lzX3N1YnNldCAoaW5zdHJ1Y3Rpb24tPmZpZWxkX25hbWVzLAorCQkJICAgICAgY2FjaGVfcnVsZS0+b3JpZ2luYWxfZmllbGRzKQorCSAgICAmJiAhZmlsdGVyX2lzX21lbWJlciAoaW5zdHJ1Y3Rpb24tPmZpZWxkX25hbWVzLAorCQkJCSAgY2FjaGVfcnVsZS0+bmFtZSkpCisJICB7CisJICAgIGNoYXIgKnNpbmdsZV9maWVsZCA9IGZpbHRlcl9uZXh0IChjYWNoZV9ydWxlLT5vcmlnaW5hbF9maWVsZHMsICIiKTsKKwkgICAgaWYgKGZpbHRlcl9uZXh0IChjYWNoZV9ydWxlLT5vcmlnaW5hbF9maWVsZHMsIHNpbmdsZV9maWVsZCkgIT0gTlVMTCkKKwkgICAgICBzaW5nbGVfZmllbGQgPSBOVUxMOworCSAgICBwcmludF9pY2FjaGVfZXh0cmFjdGlvbiAoZmlsZSwKKwkJCQkgICAgIGluc3RydWN0aW9uLT5mb3JtYXRfbmFtZSwKKwkJCQkgICAgIGNhY2hlX3J1bGUtPmVudHJ5X3R5cGUsCisJCQkJICAgICBjYWNoZV9ydWxlLT5uYW1lLAorCQkJCSAgICAgY2FjaGVfcnVsZS0+dHlwZSwKKwkJCQkgICAgIGNhY2hlX3J1bGUtPmV4cHJlc3Npb24sCisJCQkJICAgICBzaW5nbGVfZmllbGQsCisJCQkJICAgICBjYWNoZV9ydWxlLT5saW5lLAorCQkJCSAgICAgTlVMTCwgLyogY3VyX2ZpZWxkICovCisJCQkJICAgICBleHBhbmRlZF9iaXRzLAorCQkJCSAgICAgd2hhdF90b19kZWNsYXJlLAorCQkJCSAgICAgd2hhdF90b19kbyk7CisJICB9CisgICAgICB9CisgIH0KKworICBsZl9wcmludF9faW50ZXJuYWxfcmVmIChmaWxlKTsKK30KKworCisKK3R5cGVkZWYgc3RydWN0IF9mb3JtX2ZpZWxkcyBmb3JtX2ZpZWxkczsKK3N0cnVjdCBfZm9ybV9maWVsZHMgeworICBjaGFyICpuYW1lOworICBmaWx0ZXIgKmZpZWxkczsKKyAgZm9ybV9maWVsZHMgKm5leHQ7Cit9OworCitzdGF0aWMgZm9ybV9maWVsZHMgKgoraW5zbl90YWJsZV9jYWNoZV9maWVsZHMgKGluc25fdGFibGUgKmlzYSkKK3sKKyAgZm9ybV9maWVsZHMgKmZvcm1zID0gTlVMTDsKKyAgaW5zbl9lbnRyeSAqaW5zbjsKKyAgZm9yIChpbnNuID0gaXNhLT5pbnNuczsKKyAgICAgICBpbnNuICE9IE5VTEw7CisgICAgICAgaW5zbiA9IGluc24tPm5leHQpIHsKKyAgICBmb3JtX2ZpZWxkcyAqKmZvcm0gPSAmZm9ybXM7CisgICAgd2hpbGUgKDEpCisgICAgICB7CisJaWYgKCpmb3JtID09IE5VTEwpCisJICB7CisJICAgIC8qIG5ldyBmb3JtYXQgbmFtZSwgYWRkIGl0ICovCisJICAgIGZvcm1fZmllbGRzICpuZXdfZm9ybSA9IFpBTExPQyAoZm9ybV9maWVsZHMpOworCSAgICBuZXdfZm9ybS0+bmFtZSA9IGluc24tPmZvcm1hdF9uYW1lOworCSAgICBmaWx0ZXJfYWRkICgmbmV3X2Zvcm0tPmZpZWxkcywgaW5zbi0+ZmllbGRfbmFtZXMpOworCSAgICAqZm9ybSA9IG5ld19mb3JtOworCSAgICBicmVhazsKKwkgIH0KKwllbHNlIGlmIChzdHJjbXAgKCgqZm9ybSktPm5hbWUsIGluc24tPmZvcm1hdF9uYW1lKSA9PSAwKQorCSAgeworCSAgICAvKiBhbHJlYWR5IHByZXNlbnQsIGFkZCBmaWVsZCBuYW1lcyB0byB0aGUgZXhpc3RpbmcgbGlzdCAqLworCSAgICBmaWx0ZXJfYWRkICgmKCpmb3JtKS0+ZmllbGRzLCBpbnNuLT5maWVsZF9uYW1lcyk7CisJICAgIGJyZWFrOworCSAgfQorCWZvcm0gPSAmKCpmb3JtKS0+bmV4dDsKKyAgICAgIH0KKyAgfQorICByZXR1cm4gZm9ybXM7Cit9CisKKworCitleHRlcm4gdm9pZAorcHJpbnRfaWNhY2hlX3N0cnVjdCAobGYgKmZpbGUsCisJCSAgICAgaW5zbl90YWJsZSAqaXNhLAorCQkgICAgIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcykKK3sKKyAgLyogQ3JlYXRlIGEgbGlzdCBvZiBhbGwgdGhlIGRpZmZlcmVudCBpbnN0cnVjdGlvbiBmb3JtYXRzIHdpdGggdGhlaXIKKyAgICAgY29ycmVzcG9uZGluZyBmaWVsZCBuYW1lcy4gKi8KKyAgZm9ybV9maWVsZHMgKmZvcm1hdHMgPSBpbnNuX3RhYmxlX2NhY2hlX2ZpZWxkcyAoaXNhKTsKKyAgCisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiNkZWZpbmUgV0lUSF8lc0lERUNPREVfQ0FDSEVfU0laRSAlZFxuIiwKKwkgICAgIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgudSwKKwkgICAgIChvcHRpb25zLmdlbi5pY2FjaGUgPyBvcHRpb25zLmdlbi5pY2FjaGVfc2l6ZSA6IDApKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgCisgIC8qIGNyZWF0ZSBhbiBpbnN0cnVjdGlvbiBjYWNoZSBpZiBiZWluZyB1c2VkICovCisgIGlmIChvcHRpb25zLmdlbi5pY2FjaGUpIHsKKyAgICBsZl9wcmludGYgKGZpbGUsICJ0eXBlZGVmIHN0cnVjdCBfJXNpZGVjb2RlX2NhY2hlIHtcbiIsCisJICAgICAgIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7CisgICAgbGZfaW5kZW50IChmaWxlLCArMik7CisgICAgeworICAgICAgZm9ybV9maWVsZHMgKmZvcm1hdDsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgInVuc2lnbmVkX3dvcmQgYWRkcmVzcztcbiIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAidm9pZCAqc2VtYW50aWM7XG4iKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgInVuaW9uIHtcbiIpOworICAgICAgbGZfaW5kZW50IChmaWxlLCArMik7CisgICAgICBmb3IgKGZvcm1hdCA9IGZvcm1hdHM7CisJICAgZm9ybWF0ICE9IE5VTEw7CisJICAgZm9ybWF0ID0gZm9ybWF0LT5uZXh0KQorCXsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgInN0cnVjdCB7XG4iKTsKKwkgIGxmX2luZGVudCAoZmlsZSwgKzIpOworCSAgeworCSAgICBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZTsKKwkgICAgY2hhciAqZmllbGQ7CisJICAgIC8qIHNwYWNlIGZvciBhbnkgaW5zdHJ1Y3Rpb24gd29yZHMgKi8KKwkgICAgaWYgKG9wdGlvbnMuZ2VuLmluc25faW5faWNhY2hlKQorCSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImluc3RydWN0aW9uX3dvcmQgaW5zblslZF07XG4iLCBpc2EtPm1heF9ucl93b3Jkcyk7CisJICAgIC8qIGRlZmluZSBhbiBlbnRyeSBmb3IgYW55IGFwcGxpY2FibGUgY2FjaGUgcnVsZXMgKi8KKwkgICAgZm9yIChjYWNoZV9ydWxlID0gY2FjaGVfcnVsZXM7CisJCSBjYWNoZV9ydWxlICE9IE5VTEw7CisJCSBjYWNoZV9ydWxlID0gY2FjaGVfcnVsZS0+bmV4dCkKKwkgICAgICB7CisJCS8qIG5iIC0gc29ydCBvZiBjb3JyZWN0IC0gc2hvdWxkIHJlYWxseSBjaGVjayBhZ2FpbnN0CisgICAgICAgICAgICAgICAgICAgaW5kaXZpZHVhbCBpbnN0cnVjdGlvbnMgKi8KKwkJaWYgKGZpbHRlcl9pc19zdWJzZXQgKGZvcm1hdC0+ZmllbGRzLCBjYWNoZV9ydWxlLT5vcmlnaW5hbF9maWVsZHMpKQorCQkgIHsKKwkJICAgIGNoYXIgKm1lbWI7CisJCSAgICBsZl9wcmludGYgKGZpbGUsICIlcyAlczsiLAorCQkJICAgICAgIChjYWNoZV9ydWxlLT50eXBlID09IE5VTEwKKwkJCQk/ICJ1bnNpZ25lZCIgCisJCQkJOiBjYWNoZV9ydWxlLT50eXBlKSwKKwkJCSAgICAgICBjYWNoZV9ydWxlLT5uYW1lKTsKKwkJICAgIGxmX3ByaW50ZiAoZmlsZSwgIiAvKiIpOworCQkgICAgZm9yIChtZW1iID0gZmlsdGVyX25leHQgKGNhY2hlX3J1bGUtPm9yaWdpbmFsX2ZpZWxkcywgIiIpOworCQkJIG1lbWIgIT0gTlVMTDsKKwkJCSBtZW1iID0gZmlsdGVyX25leHQgKGNhY2hlX3J1bGUtPm9yaWdpbmFsX2ZpZWxkcywgbWVtYikpCisJCSAgICAgIHsKKwkJCWxmX3ByaW50ZiAoZmlsZSwgIiAlcyIsIG1lbWIpOworCQkgICAgICB9CisJCSAgICBsZl9wcmludGYgKGZpbGUsICIgKi9cbiIpOworCQkgIH0KKwkgICAgICB9CisJICAgIC8qIGRlZmluZSBhbiBlbnRyeSBmb3IgYW55IGZpZWxkcyBub3QgY292ZXJlZCBieSBhIGNhY2hlIHJ1bGUgKi8KKwkgICAgZm9yIChmaWVsZCA9IGZpbHRlcl9uZXh0IChmb3JtYXQtPmZpZWxkcywgIiIpOworCQkgZmllbGQgIT0gTlVMTDsKKwkJIGZpZWxkID0gZmlsdGVyX25leHQgKGZvcm1hdC0+ZmllbGRzLCBmaWVsZCkpCisJICAgICAgeworCQljYWNoZV9lbnRyeSAqY2FjaGVfcnVsZTsKKwkJaW50IGZvdW5kX3J1bGUgPSAwOworCQlmb3IgKGNhY2hlX3J1bGUgPSBjYWNoZV9ydWxlczsKKwkJICAgICBjYWNoZV9ydWxlICE9IE5VTEw7CisJCSAgICAgY2FjaGVfcnVsZSA9IGNhY2hlX3J1bGUtPm5leHQpCisJCSAgeworCQkgICAgaWYgKHN0cmNtcCAoY2FjaGVfcnVsZS0+bmFtZSwgZmllbGQpID09IDApCisJCSAgICAgIHsKKwkJCWZvdW5kX3J1bGUgPSAxOworCQkJYnJlYWs7CisJCSAgICAgIH0KKwkJICB9CisJCWlmICghZm91bmRfcnVsZSkKKwkJICBsZl9wcmludGYgKGZpbGUsICJ1bnNpZ25lZCAlczsgLyogZGVmYXVsdCAqL1xuIiwgZmllbGQpOworCSAgICAgIH0KKwkgIH0KKwkgIGxmX2luZGVudCAoZmlsZSwgLTIpOworCSAgbGZfcHJpbnRmIChmaWxlLCAifSAlcztcbiIsIGZvcm1hdC0+bmFtZSk7CisJfQorICAgICAgbGZfaW5kZW50IChmaWxlLCAtMik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJ9IGNyYWNrO1xuIik7CisgICAgfQorICAgIGxmX2luZGVudCAoZmlsZSwgLTIpOworICAgIGxmX3ByaW50ZiAoZmlsZSwgIn0gJXNpZGVjb2RlX2NhY2hlO1xuIiwgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sKTsKKyAgfQorICBlbHNlCisgICAgeworICAgICAgLyogYWxlcm5hdGl2bHksIHNpbmNlIG5vIGNhY2hlLCBlbWl0IGEgZHVtbXkgZGVmaW5pdGlvbiBmb3IKKwkgaWRlY29kZV9jYWNoZSBzbyB0aGF0IGNvZGUgcmVmZXJpbmcgdG8gdGhlIHR5cGUgY2FuIHN0aWxsIGNvbXBpbGUgKi8KKyAgICAgIGxmX3ByaW50ZihmaWxlLCAidHlwZWRlZiB2b2lkICVzaWRlY29kZV9jYWNoZTtcbiIsCisJCW9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7CisgICAgfQorICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworfQorCisKKworc3RhdGljIHZvaWQKK3ByaW50X2ljYWNoZV9mdW5jdGlvbiAobGYgKmZpbGUsCisJCSAgICAgICBpbnNuX2VudHJ5ICppbnN0cnVjdGlvbiwKKwkJICAgICAgIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAorCQkgICAgICAgaW5zbl9vcGNvZGVzICpvcGNvZGVzLAorCQkgICAgICAgY2FjaGVfZW50cnkgKmNhY2hlX3J1bGVzLAorCQkgICAgICAgaW50IG5yX3ByZWZldGNoZWRfd29yZHMpCit7CisgIGludCBpbmRlbnQ7CisKKyAgLyogZ2VuZXJhdGUgY29kZSB0byBlbnRlciBkZWNvZGVkIGluc3RydWN0aW9uIGludG8gdGhlIGljYWNoZSAqLworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIGxmX3ByaW50X19mdW5jdGlvbl90eXBlX2Z1bmN0aW9uIChmaWxlLCBwcmludF9pY2FjaGVfZnVuY3Rpb25fdHlwZSwKKwkJCQkgICAgIkVYVEVSTl9JQ0FDSEUiLCAiXG4iKTsKKyAgaW5kZW50ID0gcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKKwkJCQlpbnN0cnVjdGlvbi0+bmFtZSwKKwkJCQlpbnN0cnVjdGlvbi0+Zm9ybWF0X25hbWUsCisJCQkJTlVMTCwKKwkJCQlleHBhbmRlZF9iaXRzLAorCQkJCWZ1bmN0aW9uX25hbWVfcHJlZml4X2ljYWNoZSk7CisgIGluZGVudCArPSBsZl9wcmludGYgKGZpbGUsICIgIik7CisgIGxmX2luZGVudCAoZmlsZSwgK2luZGVudCk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIigiKTsKKyAgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uX2Zvcm1hbCAoZmlsZSwgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIilcbiIpOworICBsZl9pbmRlbnQgKGZpbGUsIC1pbmRlbnQpOworICAKKyAgLyogZnVuY3Rpb24gaGVhZGVyICovCisgIGxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOworICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKKyAgCisgIHByaW50X215X2RlZmluZXMgKGZpbGUsCisJCSAgICBpbnN0cnVjdGlvbi0+bmFtZSwKKwkJICAgIGluc3RydWN0aW9uLT5mb3JtYXRfbmFtZSwKKwkJICAgIGV4cGFuZGVkX2JpdHMpOworICBwcmludF9pdHJhY2UgKGZpbGUsIGluc3RydWN0aW9uLCAxLypwdXR0aW5nLXZhbHVlLWluLWNhY2hlKi8pOworICAKKyAgcHJpbnRfaWRlY29kZV92YWxpZGF0ZSAoZmlsZSwgaW5zdHJ1Y3Rpb24sIG9wY29kZXMpOworICAKKyAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7CisgIGxmX2luZGVudCAoZmlsZSwgKzIpOworICBpZiAob3B0aW9ucy5nZW4uc2VtYW50aWNfaWNhY2hlKQorICAgIGxmX3ByaW50ZiAoZmlsZSwgInVuc2lnbmVkX3dvcmQgbmlhO1xuIik7CisgIHByaW50X2ljYWNoZV9ib2R5IChmaWxlLAorCQkgICAgIGluc3RydWN0aW9uLAorCQkgICAgIGV4cGFuZGVkX2JpdHMsCisJCSAgICAgY2FjaGVfcnVsZXMsCisJCSAgICAgKG9wdGlvbnMuZ2VuLmRpcmVjdF9hY2Nlc3MKKwkJICAgICAgPyBkZWZpbmVfdmFyaWFibGVzCisJCSAgICAgIDogZGVjbGFyZV92YXJpYWJsZXMpLAorCQkgICAgIChvcHRpb25zLmdlbi5zZW1hbnRpY19pY2FjaGUKKwkJICAgICAgPyBib3RoX3ZhbHVlc19hbmRfaWNhY2hlCisJCSAgICAgIDogcHV0X3ZhbHVlc19pbl9pY2FjaGUpLAorCQkgICAgIG5yX3ByZWZldGNoZWRfd29yZHMpOworICAKKyAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiY2FjaGVfZW50cnktPmFkZHJlc3MgPSBjaWE7XG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiY2FjaGVfZW50cnktPnNlbWFudGljID0gIik7CisgIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCisJCSAgICAgICBpbnN0cnVjdGlvbi0+bmFtZSwKKwkJICAgICAgIGluc3RydWN0aW9uLT5mb3JtYXRfbmFtZSwKKwkJICAgICAgIE5VTEwsCisJCSAgICAgICBleHBhbmRlZF9iaXRzLAorCQkgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiO1xuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisKKyAgaWYgKG9wdGlvbnMuZ2VuLnNlbWFudGljX2ljYWNoZSkgeworICAgIGxmX3ByaW50ZiAoZmlsZSwgIi8qIHNlbWFudGljIHJvdXRpbmUgKi9cbiIpOworICAgIHByaW50X3NlbWFudGljX2JvZHkgKGZpbGUsCisJCQkgaW5zdHJ1Y3Rpb24sCisJCQkgZXhwYW5kZWRfYml0cywKKwkJCSBvcGNvZGVzKTsKKyAgICBsZl9wcmludGYgKGZpbGUsICJyZXR1cm4gbmlhO1xuIik7CisgIH0KKyAgCisgIGlmICghb3B0aW9ucy5nZW4uc2VtYW50aWNfaWNhY2hlKQorICAgIHsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIi8qIHJldHVybiB0aGUgZnVuY3Rpb24gcHJvcGVyICovXG4iKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgInJldHVybiAiKTsKKyAgICAgIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCisJCQkgICBpbnN0cnVjdGlvbi0+bmFtZSwKKwkJCSAgIGluc3RydWN0aW9uLT5mb3JtYXRfbmFtZSwKKwkJCSAgIE5VTEwsCisJCQkgICBleHBhbmRlZF9iaXRzLAorCQkJICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIjtcbiIpOworICAgIH0KKyAgCisgIGlmIChvcHRpb25zLmdlbi5kaXJlY3RfYWNjZXNzKQorICAgIHsKKyAgICAgIHByaW50X2ljYWNoZV9ib2R5IChmaWxlLAorCQkJIGluc3RydWN0aW9uLAorCQkJIGV4cGFuZGVkX2JpdHMsCisJCQkgY2FjaGVfcnVsZXMsCisJCQkgdW5kZWZfdmFyaWFibGVzLAorCQkJIChvcHRpb25zLmdlbi5zZW1hbnRpY19pY2FjaGUKKwkJCSAgPyBib3RoX3ZhbHVlc19hbmRfaWNhY2hlCisJCQkgIDogcHV0X3ZhbHVlc19pbl9pY2FjaGUpLAorCQkJIG5yX3ByZWZldGNoZWRfd29yZHMpOworICAgIH0KKyAgCisgIGxmX2luZGVudCAoZmlsZSwgLTIpOworICBsZl9wcmludGYgKGZpbGUsICJ9XG4iKTsKKyAgbGZfaW5kZW50IChmaWxlLCAtMik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIn1cbiIpOworfQorCisKK3ZvaWQKK3ByaW50X2ljYWNoZV9kZWZpbml0aW9uIChsZiAqZmlsZSwKKwkJCSBpbnNuX2VudHJ5ICppbnNuLAorCQkJIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAorCQkJIGluc25fb3Bjb2RlcyAqb3Bjb2RlcywKKwkJCSBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZXMsCisJCQkgaW50IG5yX3ByZWZldGNoZWRfd29yZHMpCit7CisgIHByaW50X2ljYWNoZV9mdW5jdGlvbiAoZmlsZSwKKwkJCSBpbnNuLAorCQkJIGV4cGFuZGVkX2JpdHMsCisJCQkgb3Bjb2RlcywKKwkJCSBjYWNoZV9ydWxlcywKKwkJCSBucl9wcmVmZXRjaGVkX3dvcmRzKTsKK30KKworCisKK3ZvaWQKK3ByaW50X2ljYWNoZV9pbnRlcm5hbF9mdW5jdGlvbl9kZWNsYXJhdGlvbiAobGYgKmZpbGUsCisJCQkJCSAgICBmdW5jdGlvbl9lbnRyeSAqZnVuY3Rpb24sCisJCQkJCSAgICB2b2lkICpkYXRhKQoreworICBBU1NFUlQgKG9wdGlvbnMuZ2VuLmljYWNoZSk7CisgIGlmIChmdW5jdGlvbi0+aXNfaW50ZXJuYWwpCisgICAgeworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgICAgIGxmX3ByaW50X19mdW5jdGlvbl90eXBlX2Z1bmN0aW9uIChmaWxlLCBwcmludF9pY2FjaGVfZnVuY3Rpb25fdHlwZSwKKwkJCQkJIklOTElORV9JQ0FDSEUiLCAiXG4iKTsKKyAgICAgIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCisJCQkgICBmdW5jdGlvbi0+bmFtZSwKKwkJCSAgIE5VTEwsCisJCQkgICBOVUxMLAorCQkJICAgTlVMTCwKKwkJCSAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X2ljYWNoZSk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbigiKTsKKyAgICAgIHByaW50X2ljYWNoZV9mdW5jdGlvbl9mb3JtYWwgKGZpbGUsIDApOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiKTtcbiIpOworICAgIH0KK30KKworCit2b2lkCitwcmludF9pY2FjaGVfaW50ZXJuYWxfZnVuY3Rpb25fZGVmaW5pdGlvbiAobGYgKmZpbGUsCisJCQkJCSAgIGZ1bmN0aW9uX2VudHJ5ICpmdW5jdGlvbiwKKwkJCQkJICAgdm9pZCAqZGF0YSkKK3sKKyAgQVNTRVJUIChvcHRpb25zLmdlbi5pY2FjaGUpOworICBpZiAoZnVuY3Rpb24tPmlzX2ludGVybmFsKQorICAgIHsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgICAgICBsZl9wcmludF9fZnVuY3Rpb25fdHlwZV9mdW5jdGlvbiAoZmlsZSwgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uX3R5cGUsCisJCQkJCSJJTkxJTkVfSUNBQ0hFIiwgIlxuIik7CisgICAgICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAorCQkJICAgZnVuY3Rpb24tPm5hbWUsCisJCQkgICBOVUxMLAorCQkJICAgTlVMTCwKKwkJCSAgIE5VTEwsCisJCQkgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGUpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oIik7CisgICAgICBwcmludF9pY2FjaGVfZnVuY3Rpb25fZm9ybWFsIChmaWxlLCAwKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIilcbiIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIi8qIHNlbWFudGljIHJvdXRpbmUgKi9cbiIpOworICAgICAgaWYgKG9wdGlvbnMuZ2VuLnNlbWFudGljX2ljYWNoZSkKKwl7CisJICBsZl9wcmludF9fbGluZV9yZWYgKGZpbGUsIGZ1bmN0aW9uLT5jb2RlLT5saW5lKTsKKwkgIHRhYmxlX3ByaW50X2NvZGUgKGZpbGUsIGZ1bmN0aW9uLT5jb2RlKTsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgImVycm9yIChcIkludGVybmFsIGZ1bmN0aW9uIG11c3QgbG9uZ2p1bXBcXG5cIik7XG4iKTsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgInJldHVybiAwO1xuIik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgInJldHVybiAiKTsKKwkgIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCisJCQkgICAgICAgZnVuY3Rpb24tPm5hbWUsCisJCQkgICAgICAgTlVMTCwKKwkJCSAgICAgICBOVUxMLAorCQkJICAgICAgIE5VTEwsCisJCQkgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKTsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgIjtcbiIpOworCX0KKyAgICAgIAorICAgICAgbGZfcHJpbnRfX2ludGVybmFsX3JlZiAoZmlsZSk7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIn1cbiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2dlbi1pY2FjaGUuaCBiL3NpbS9pZ2VuL2dlbi1pY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGM3M2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2lnZW4vZ2VuLWljYWNoZS5oCkBAIC0wLDAgKzEsODEgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKworLyogT3V0cHV0IGNvZGUgdG8gbWFuaXB1bGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGU6IGVpdGhlciBjcmVhdGUgaXQKKyAgIG9yIHJlZmVyZW5jZSBpdCAqLworCit0eXBlZGVmIGVudW0geworICBkZWNsYXJlX3ZhcmlhYmxlcywKKyAgZGVmaW5lX3ZhcmlhYmxlcywKKyAgdW5kZWZfdmFyaWFibGVzLAorfSBpY2FjaGVfZGVjbF90eXBlOworCit0eXBlZGVmIGVudW0geworICBkb19ub3RfdXNlX2ljYWNoZSA9IDAsCisgIGdldF92YWx1ZXNfZnJvbV9pY2FjaGUgPSAweDEsCisgIHB1dF92YWx1ZXNfaW5faWNhY2hlID0gMHgyLAorICBib3RoX3ZhbHVlc19hbmRfaWNhY2hlID0gMHgzLAorfSBpY2FjaGVfYm9keV90eXBlOworCitleHRlcm4gdm9pZCBwcmludF9pY2FjaGVfYm9keQorKGxmICpmaWxlLAorIGluc25fZW50cnkgKmluc3RydWN0aW9uLAorIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAorIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcywKKyBpY2FjaGVfZGVjbF90eXBlIHdoYXRfdG9fZGVjbGFyZSwKKyBpY2FjaGVfYm9keV90eXBlIHdoYXRfdG9fZG8sCisgaW50IG5yX3ByZWZldGNoZWRfd29yZHMpOworCisKKy8qIE91dHB1dCBhbiBpbnN0cnVjdGlvbiBjYWNoZSBkZWNvZGUgZnVuY3Rpb24gKi8KKworZXh0ZXJuIHZvaWQgcHJpbnRfaWNhY2hlX2RlY2xhcmF0aW9uCisobGYgKmZpbGUsCisgaW5zbl9lbnRyeSAqaW5zbiwKKyBvcGNvZGVfYml0cyAqZXhwYW5kZWRfYml0cywKKyBpbnNuX29wY29kZXMgKm9wY29kZXMsCisgaW50IG5yX3ByZWZldGNoZWRfd29yZHMpOworIAorZXh0ZXJuIHZvaWQgcHJpbnRfaWNhY2hlX2RlZmluaXRpb24KKyhsZiAqZmlsZSwKKyBpbnNuX2VudHJ5ICppbnNuLAorIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAorIGluc25fb3Bjb2RlcyAqb3Bjb2RlcywKKyBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZXMsCisgaW50IG5yX3ByZWZldGNoZWRfd29yZHMpOworCisKKy8qIE91dHB1dCBhbiBpbnN0cnVjdGlvbiBjYWNoZSBzdXBwb3J0IGZ1bmN0aW9uICovCisKK2V4dGVybiBmdW5jdGlvbl9lbnRyeV9oYW5kbGVyIHByaW50X2ljYWNoZV9pbnRlcm5hbF9mdW5jdGlvbl9kZWNsYXJhdGlvbjsKK2V4dGVybiBmdW5jdGlvbl9lbnRyeV9oYW5kbGVyIHByaW50X2ljYWNoZV9pbnRlcm5hbF9mdW5jdGlvbl9kZWZpbml0aW9uOworCisKKy8qIE91dHB1dCB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUgdGFibGUgZGF0YSBzdHJ1Y3R1cmUgKi8KKworZXh0ZXJuIHZvaWQgcHJpbnRfaWNhY2hlX3N0cnVjdAorKGxmICpmaWxlLAorIGluc25fdGFibGUgKmluc3RydWN0aW9ucywKKyBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZXMpOworCisKKy8qIE91dHB1dCBhIHNpbmdsZSBpbnN0cnVjdGlvbnMgZGVjb2RlciAqLwpkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vZ2VuLWlkZWNvZGUuYyBiL3NpbS9pZ2VuL2dlbi1pZGVjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY3MGUzZAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9pZ2VuL2dlbi1pZGVjb2RlLmMKQEAgLTAsMCArMSwxMzkxIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJsZi5oIgorI2luY2x1ZGUgInRhYmxlLmgiCisjaW5jbHVkZSAiZmlsdGVyLmgiCisjaW5jbHVkZSAiaWdlbi5oIgorCisjaW5jbHVkZSAibGQtaW5zbi5oIgorI2luY2x1ZGUgImxkLWRlY29kZS5oIgorCisjaW5jbHVkZSAiZ2VuLmgiCisKKyNpbmNsdWRlICJnZW4taWRlY29kZS5oIgorI2luY2x1ZGUgImdlbi1pY2FjaGUuaCIKKyNpbmNsdWRlICJnZW4tc2VtYW50aWNzLmgiCisKKworCitzdGF0aWMgdm9pZAorbGZfcHJpbnRfb3Bjb2RlcyAobGYgKmZpbGUsCisJCSAgZ2VuX2VudHJ5ICp0YWJsZSkKK3sKKyAgaWYgKHRhYmxlICE9IE5VTEwpCisgICAgeworICAgICAgd2hpbGUgKDEpCisJeworCSAgQVNTRVJUICh0YWJsZS0+b3Bjb2RlICE9IE5VTEwpOworCSAgbGZfcHJpbnRmIChmaWxlLCAiXyVkXyVkIiwKKwkJICAgICB0YWJsZS0+b3Bjb2RlLT5maXJzdCwKKwkJICAgICB0YWJsZS0+b3Bjb2RlLT5sYXN0KTsKKwkgIGlmICh0YWJsZS0+cGFyZW50ID09IE5VTEwpIGJyZWFrOworCSAgbGZfcHJpbnRmIChmaWxlLCAiX18lZCIsIHRhYmxlLT5vcGNvZGVfbnIpOworCSAgdGFibGUgPSB0YWJsZS0+cGFyZW50OworCX0KKyAgICB9Cit9CisKKworCisKK3N0YXRpYyB2b2lkCitwcmludF9pZGVjb2RlX2lmZXRjaCAobGYgKmZpbGUsCisJCSAgICAgIGludCBwcmV2aW91c19ucl9wcmVmZXRjaGVkX3dvcmRzLAorCQkgICAgICBpbnQgY3VycmVudF9ucl9wcmVmZXRjaGVkX3dvcmRzKQoreworICBpbnQgd29yZF9ucjsKKyAgZm9yICh3b3JkX25yID0gcHJldmlvdXNfbnJfcHJlZmV0Y2hlZF93b3JkczsKKyAgICAgICB3b3JkX25yIDwgY3VycmVudF9ucl9wcmVmZXRjaGVkX3dvcmRzOworICAgICAgIHdvcmRfbnIgKyspCisgICAgeworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiaW5zdHJ1Y3Rpb25fd29yZCBpbnN0cnVjdGlvbl8lZCA9IElNRU0lZF9JTU1FRCAoY2lhLCAlZCk7XG4iLAorCQkgd29yZF9uciwgb3B0aW9ucy5pbnNuX2JpdF9zaXplLCB3b3JkX25yKTsKKyAgICAgIAorICAgIH0KK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyB2b2lkCitsZl9wcmludF90YWJsZV9uYW1lIChsZiAqZmlsZSwKKwkJICAgICBnZW5fZW50cnkgKnRhYmxlKQoreworICBsZl9wcmludGYgKGZpbGUsICJpZGVjb2RlX3RhYmxlIik7CisgIGxmX3ByaW50X29wY29kZXMgKGZpbGUsIHRhYmxlKTsKK30KKworCisKK3N0YXRpYyB2b2lkCitwcmludF9pZGVjb2RlX3RhYmxlIChsZiAqZmlsZSwKKwkJICAgICBnZW5fZW50cnkgKmVudHJ5LAorCQkgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCkKK3sKKyAgbGZfcHJpbnRmIChmaWxlLCAiLyogcHJpbWUgdGhlIHNlYXJjaCAqL1xuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgImlkZWNvZGVfdGFibGVfZW50cnkgKnRhYmxlID0gIik7CisgIGxmX3ByaW50X3RhYmxlX25hbWUgKGZpbGUsIGVudHJ5KTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiO1xuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgImludCBvcGNvZGUgPSBFWFRSQUNURUQlZCAoaW5zdHJ1Y3Rpb24sICVkLCAlZCk7XG4iLAorCSAgICAgb3B0aW9ucy5pbnNuX2JpdF9zaXplLAorCSAgICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5maXJzdCksCisJICAgICBpMnRhcmdldCAob3B0aW9ucy5oaV9iaXRfbnIsIGVudHJ5LT5vcGNvZGUtPmxhc3QpKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiaWRlY29kZV90YWJsZV9lbnRyeSAqdGFibGVfZW50cnkgPSB0YWJsZSArIG9wY29kZTtcbiIpOworICAKKyAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiLyogaXRlcmF0ZSB1bnRpbCBhIGxlYWYgKi9cbiIpOworICBsZl9wcmludGYgKGZpbGUsICJ3aGlsZSAoMSkge1xuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiAgc2lnbmVkIHNoaWZ0ID0gdGFibGVfZW50cnktPnNoaWZ0O1xuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgImlmIChzaGlmdCA9PSBmdW5jdGlvbl9lbnRyeSkgYnJlYWs7XG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiICBpZiAoc2hpZnQgPj0gMCkge1xuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiAgICB0YWJsZSA9ICgoaWRlY29kZV90YWJsZV9lbnRyeSopXG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiICAgICAgICAgICAgIHRhYmxlX2VudHJ5LT5mdW5jdGlvbl9vcl90YWJsZSk7XG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiICAgIG9wY29kZSA9ICgoaW5zdHJ1Y3Rpb24gJiB0YWJsZV9lbnRyeS0+bWFzaylcbiIpOworICBsZl9wcmludGYgKGZpbGUsICIgICAgICAgICAgICAgID4+IHNoaWZ0KTtcbiIpOworICBsZl9wcmludGYgKGZpbGUsICIgICAgdGFibGVfZW50cnkgPSB0YWJsZSArIG9wY29kZTtcbiIpOworICBsZl9wcmludGYgKGZpbGUsICIgIH1cbiIpOworICBsZl9wcmludGYgKGZpbGUsICIgIGVsc2Uge1xuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiAgICAvKiBtdXN0IGJlIGEgYm9vbGVhbiAqL1xuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiAgICBBU1NFUlQodGFibGVfZW50cnktPnNoaWZ0ID09IGJvb2xlYW5fZW50cnkpO1xuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiAgICBvcGNvZGUgPSAoKGluc3RydWN0aW9uICYgdGFibGVfZW50cnktPm1hc2spXG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiICAgICAgICAgICAgICAhPSB0YWJsZV9lbnRyeS0+dmFsdWUpO1xuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiAgICB0YWJsZSA9ICgoaWRlY29kZV90YWJsZV9lbnRyeSopXG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiICAgICAgICAgICAgIHRhYmxlX2VudHJ5LT5mdW5jdGlvbl9vcl90YWJsZSk7XG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiICAgIHRhYmxlX2VudHJ5ID0gdGFibGUgKyBvcGNvZGU7XG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiICB9XG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAifVxuIik7CisgIAorICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICBsZl9wcmludGYgKGZpbGUsICIvKiBjYWxsIHRoZSBsZWFmIGNvZGUgKi9cbiIpOworICBpZiAob3B0aW9ucy5nZW4uY29kZSA9PSBnZW5lcmF0ZV9qdW1wcykKKyAgICB7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJnb3RvICp0YWJsZV9lbnRyeS0+ZnVuY3Rpb25fb3JfdGFibGU7XG4iKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIlcyAiLCByZXN1bHQpOworICAgICAgaWYgKG9wdGlvbnMuZ2VuLmljYWNoZSkKKwl7CisJICBsZl9wcmludGYgKGZpbGUsICIoKChpZGVjb2RlX2ljYWNoZSopdGFibGVfZW50cnktPmZ1bmN0aW9uX29yX3RhYmxlKVxuIik7CisJICBsZl9wcmludGYgKGZpbGUsICIgICgiKTsKKwkgIHByaW50X2ljYWNoZV9mdW5jdGlvbl9hY3R1YWwgKGZpbGUsIDEpOworCSAgbGZfcHJpbnRmIChmaWxlLCAiKSk7XG4iKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbGZfcHJpbnRmIChmaWxlLCAiKChpZGVjb2RlX3NlbWFudGljKil0YWJsZV9lbnRyeS0+ZnVuY3Rpb25fb3JfdGFibGUpXG4iKTsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgIiAgKCIpOworCSAgcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fYWN0dWFsIChmaWxlLCAxKTsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgIik7XG4iKTsKKwl9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9pZGVjb2RlX3RhYmxlX3N0YXJ0IChsZiAqZmlsZSwKKwkJCSAgIGdlbl9lbnRyeSAqdGFibGUsCisJCQkgICBpbnQgZGVwdGgsCisJCQkgICB2b2lkICpkYXRhKQoreworICBBU1NFUlQgKGRlcHRoID09IDApOworICAvKiBzdGFydCBvZiB0aGUgdGFibGUgKi8KKyAgaWYgKHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IGFycmF5X2dlbikKKyAgICB7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAic3RhdGljIGlkZWNvZGVfdGFibGVfZW50cnkgIik7CisgICAgICBsZl9wcmludF90YWJsZV9uYW1lIChmaWxlLCB0YWJsZSk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJbXSA9IHtcbiIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3ByaW50X2lkZWNvZGVfdGFibGVfbGVhZiAobGYgKmZpbGUsCisJCQkgIGdlbl9lbnRyeSAqZW50cnksCisJCQkgIGludCBkZXB0aCwKKwkJCSAgdm9pZCAqZGF0YSkKK3sKKyAgZ2VuX2VudHJ5ICptYXN0ZXJfZW50cnk7CisgIEFTU0VSVCAoZW50cnktPnBhcmVudCAhPSBOVUxMKTsKKyAgQVNTRVJUIChkZXB0aCA9PSAwKTsKKyAgaWYgKGVudHJ5LT5jb21iaW5lZF9wYXJlbnQgPT0gTlVMTCkKKyAgICBtYXN0ZXJfZW50cnkgPSBlbnRyeTsKKyAgZWxzZQorICAgIG1hc3Rlcl9lbnRyeSA9IGVudHJ5LT5jb21iaW5lZF9wYXJlbnQ7CisKKyAgLyogYWRkIGFuIGVudHJ5IHRvIHRoZSB0YWJsZSAqLworICBpZiAoZW50cnktPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBhcnJheV9nZW4pCisgICAgeworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiICAvKiVkKi8geyAiLCBlbnRyeS0+b3Bjb2RlX25yKTsKKyAgICAgIGlmIChlbnRyeS0+b3Bjb2RlID09IE5VTEwpCisJeworCSAgQVNTRVJUIChlbnRyeS0+bnJfaW5zbnMgPT0gMSk7CisJICAvKiB0YWJsZSBsZWFmIGVudHJ5ICovCisJICBsZl9wcmludGYgKGZpbGUsICJmdW5jdGlvbl9lbnRyeSwgMCwgMCwgIik7CisJICBpZiAob3B0aW9ucy5nZW4uY29kZSA9PSBnZW5lcmF0ZV9qdW1wcykKKwkgICAgeworCSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiYmIik7CisJICAgIH0KKwkgIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCisJCQkgICAgICAgZW50cnktPmluc25zLT5pbnNuLT5uYW1lLAorCQkJICAgICAgIGVudHJ5LT5pbnNucy0+aW5zbi0+Zm9ybWF0X25hbWUsCisJCQkgICAgICAgTlVMTCwKKwkJCSAgICAgICBtYXN0ZXJfZW50cnktPmV4cGFuZGVkX2JpdHMsCisJCQkgICAgICAgKG9wdGlvbnMuZ2VuLmljYWNoZQorCQkJCT8gZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWNhY2hlCisJCQkJOiBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpKTsKKwl9CisgICAgICBlbHNlIGlmIChlbnRyeS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBzd2l0Y2hfZ2VuCisJICAgICAgIHx8IGVudHJ5LT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbgorCSAgICAgICB8fCBlbnRyeS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbikKKwl7CisJICAvKiB0YWJsZSBjYWxsaW5nIHN3aXRjaCBzdGF0ZW1lbnQgKi8KKwkgIGxmX3ByaW50ZiAoZmlsZSwgImZ1bmN0aW9uX2VudHJ5LCAwLCAwLCAiKTsKKwkgIGlmIChvcHRpb25zLmdlbi5jb2RlID09IGdlbmVyYXRlX2p1bXBzKQorCSAgICB7CisJICAgICAgbGZfcHJpbnRmIChmaWxlLCAiJiYiKTsKKwkgICAgfQorCSAgbGZfcHJpbnRfdGFibGVfbmFtZSAoZmlsZSwgZW50cnkpOworCX0KKyAgICAgIGVsc2UgaWYgKGVudHJ5LT5vcGNvZGUtPmlzX2Jvb2xlYW4pCisJeworCSAgLyogdGFibGUgYGNhbGxpbmcnIGJvb2xlYW4gdGFibGUgKi8KKwkgIGxmX3ByaW50ZiAoZmlsZSwgImJvb2xlYW5fZW50cnksICIpOworCSAgbGZfcHJpbnRmIChmaWxlLCAiTUFTSzMyKCVkLCAlZCksICIsCisJCSAgICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5maXJzdCksCisJCSAgICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5sYXN0KSk7CisJICBsZl9wcmludGYgKGZpbGUsICJJTlNFUlRFRDMyKCVkLCAlZCwgJWQpLCAiLAorCQkgICAgIGVudHJ5LT5vcGNvZGUtPmJvb2xlYW5fY29uc3RhbnQsCisJCSAgICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5maXJzdCksCisJCSAgICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5sYXN0KSk7CisJICBsZl9wcmludF90YWJsZV9uYW1lIChmaWxlLCBlbnRyeSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIHRhYmxlIGBjYWxsaW5nJyBhbm90aGVyIHRhYmxlICovCisJICBsZl9wcmludGYgKGZpbGUsICIlZCwgIiwgb3B0aW9ucy5pbnNuX2JpdF9zaXplIC0gZW50cnktPm9wY29kZS0+bGFzdCAtIDEpOworCSAgbGZfcHJpbnRmIChmaWxlLCAiTUFTSyVkKCVkLCVkKSwgIiwKKwkJICAgICBvcHRpb25zLmluc25fYml0X3NpemUsCisJCSAgICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5maXJzdCksCisJCSAgICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5sYXN0KSk7CisJICBsZl9wcmludGYgKGZpbGUsICIwLCAiKTsKKwkgIGxmX3ByaW50X3RhYmxlX25hbWUgKGZpbGUsIGVudHJ5KTsKKwl9CisgICAgICBsZl9wcmludGYgKGZpbGUsICIgfSxcbiIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3ByaW50X2lkZWNvZGVfdGFibGVfZW5kIChsZiAqZmlsZSwKKwkJCSBnZW5fZW50cnkgKnRhYmxlLAorCQkJIGludCBkZXB0aCwKKwkJCSB2b2lkICpkYXRhKQoreworICBBU1NFUlQgKGRlcHRoID09IDApOworICBpZiAodGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gYXJyYXlfZ2VuKSB7CisgICAgbGZfcHJpbnRmIChmaWxlLCAifTtcbiIpOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyB2b2lkCitwcmludF9nb3RvX3N3aXRjaF9uYW1lIChsZiAqZmlsZSwKKwkJCWdlbl9lbnRyeSAqZW50cnkpCit7CisgIGxmX3ByaW50ZiAoZmlsZSwgImNhc2VfIik7CisgIGlmIChlbnRyeS0+b3Bjb2RlID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKKwkJCSAgIGVudHJ5LT5pbnNucy0+aW5zbi0+bmFtZSwKKwkJCSAgIGVudHJ5LT5pbnNucy0+aW5zbi0+Zm9ybWF0X25hbWUsCisJCQkgICBOVUxMLAorCQkJICAgZW50cnktPmV4cGFuZGVkX2JpdHMsCisJCQkgICAob3B0aW9ucy5nZW4uaWNhY2hlCisJCQkgICAgPyBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGUKKwkJCSAgICA6IGZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljcykpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxmX3ByaW50X3RhYmxlX25hbWUoZmlsZSwgZW50cnkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3ByaW50X2dvdG9fc3dpdGNoX3RhYmxlX2xlYWYgKGxmICpmaWxlLAorCQkJICAgICAgZ2VuX2VudHJ5ICplbnRyeSwKKwkJCSAgICAgIGludCBkZXB0aCwKKwkJCSAgICAgIHZvaWQgKmRhdGEpCit7CisgIEFTU0VSVCAoZW50cnktPnBhcmVudCAhPSBOVUxMKTsKKyAgQVNTRVJUIChkZXB0aCA9PSAwKTsKKyAgQVNTRVJUIChlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbik7CisgIEFTU0VSVCAoZW50cnktPnBhcmVudC0+b3Bjb2RlKTsKKyAgCisgIGxmX3ByaW50ZiAoZmlsZSwgIi8qICVkICovICYmIiwgZW50cnktPm9wY29kZV9ucik7CisgIGlmIChlbnRyeS0+Y29tYmluZWRfcGFyZW50ICE9IE5VTEwpCisgICAgcHJpbnRfZ290b19zd2l0Y2hfbmFtZSAoZmlsZSwgZW50cnktPmNvbWJpbmVkX3BhcmVudCk7CisgIGVsc2UKKyAgICBwcmludF9nb3RvX3N3aXRjaF9uYW1lIChmaWxlLCBlbnRyeSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIixcbiIpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfZ290b19zd2l0Y2hfYnJlYWsgKGxmICpmaWxlLAorCQkJIGdlbl9lbnRyeSAqZW50cnkpCit7CisgIGxmX3ByaW50ZiAoZmlsZSwgImdvdG8gYnJlYWtfIik7CisgIGxmX3ByaW50X3RhYmxlX25hbWUgKGZpbGUsIGVudHJ5LT5wYXJlbnQpOworICBsZl9wcmludGYgKGZpbGUsICI7XG4iKTsKK30KKworCitzdGF0aWMgdm9pZAorcHJpbnRfZ290b19zd2l0Y2hfdGFibGUgKGxmICpmaWxlLAorCQkJIGdlbl9lbnRyeSAqdGFibGUpCit7CisgIGxmX3ByaW50ZiAoZmlsZSwgImNvbnN0IHN0YXRpYyB2b2lkICoiKTsKKyAgbGZfcHJpbnRfdGFibGVfbmFtZSAoZmlsZSwgdGFibGUpOworICBsZl9wcmludGYgKGZpbGUsICJbXSA9IHtcbiIpOworICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKKyAgZ2VuX2VudHJ5X3RyYXZlcnNlX3RyZWUgKGZpbGUsIHRhYmxlLAorCQkJICAgMCwKKwkJCSAgIE5VTEwvKnN0YXJ0Ki8sCisJCQkgICBwcmludF9nb3RvX3N3aXRjaF90YWJsZV9sZWFmLAorCQkJICAgTlVMTC8qZW5kKi8sCisJCQkgICBOVUxMLypkYXRhKi8pOworICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAifTtcbiIpOworfQorCisKK3ZvaWQgcHJpbnRfaWRlY29kZV9zd2l0Y2gKKyhsZiAqZmlsZSwgCisgZ2VuX2VudHJ5ICp0YWJsZSwKKyBjb25zdCBjaGFyICpyZXN1bHQpOworCitzdGF0aWMgdm9pZAorcHJpbnRfaWRlY29kZV9zd2l0Y2hfc3RhcnQgKGxmICpmaWxlLAorCQkJICAgIGdlbl9lbnRyeSAqdGFibGUsCisJCQkgICAgaW50IGRlcHRoLAorCQkJICAgIHZvaWQgKmRhdGEpCit7CisgIC8qIGNvbnN0IGNoYXIgKnJlc3VsdCA9IGRhdGE7ICovCisgIEFTU0VSVCAoZGVwdGggPT0gMCk7CisgIEFTU0VSVCAodGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgorCSAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCisJICB8fCB0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbik7CisgIAorICBpZiAodGFibGUtPm9wY29kZS0+aXNfYm9vbGVhbgorICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgorICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pCisgICAgeworICAgICAgbGZfcHJpbnRmIChmaWxlLCAic3dpdGNoIChFWFRSQUNURUQlZCAoaW5zdHJ1Y3Rpb25fJWQsICVkLCAlZCkpXG4iLAorCQkgb3B0aW9ucy5pbnNuX2JpdF9zaXplLAorCQkgdGFibGUtPm9wY29kZV9ydWxlLT53b3JkX25yLAorCQkgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCB0YWJsZS0+b3Bjb2RlLT5maXJzdCksCisJCSBpMnRhcmdldCAob3B0aW9ucy5oaV9iaXRfbnIsIHRhYmxlLT5vcGNvZGUtPmxhc3QpKTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgKzIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7CisgICAgfQorICBlbHNlIGlmICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBnb3RvX3N3aXRjaF9nZW4pCisgICAgeworICAgICAgaWYgKHRhYmxlLT5wYXJlbnQgIT0gTlVMTAorCSAgJiYgKHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgorCSAgICAgIHx8IHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCisJICAgICAgfHwgdGFibGUtPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbikpCisJeworCSAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7CisJICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKKwl9CisgICAgICBwcmludF9nb3RvX3N3aXRjaF90YWJsZSAoZmlsZSwgdGFibGUpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiQVNTRVJUIChFWFRSQUNURUQlZCAoaW5zdHJ1Y3Rpb25fJWQsICVkLCAlZClcbiIsCisJCSBvcHRpb25zLmluc25fYml0X3NpemUsCisJCSB0YWJsZS0+b3Bjb2RlLT53b3JkX25yLAorCQkgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCB0YWJsZS0+b3Bjb2RlLT5maXJzdCksCisJCSBpMnRhcmdldCAob3B0aW9ucy5oaV9iaXRfbnIsIHRhYmxlLT5vcGNvZGUtPmxhc3QpKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiAgICAgICAgPCAoc2l6ZW9mICgiKTsKKyAgICAgIGxmX3ByaW50X3RhYmxlX25hbWUgKGZpbGUsIHRhYmxlKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIikgLyBzaXplb2Yodm9pZCopKSk7XG4iKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImdvdG8gKiIpOworICAgICAgbGZfcHJpbnRfdGFibGVfbmFtZSAoZmlsZSwgdGFibGUpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiW0VYVFJBQ1RFRCVkIChpbnN0cnVjdGlvbl8lZCwgJWQsICVkKV07XG4iLAorCQkgb3B0aW9ucy5pbnNuX2JpdF9zaXplLAorCQkgdGFibGUtPm9wY29kZS0+d29yZF9uciwKKwkJIGkydGFyZ2V0IChvcHRpb25zLmhpX2JpdF9uciwgdGFibGUtPm9wY29kZS0+Zmlyc3QpLAorCQkgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCB0YWJsZS0+b3Bjb2RlLT5sYXN0KSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgQVNTRVJUKCJiYWQgc3dpdGNoIiA9PSBOVUxMKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3ByaW50X2lkZWNvZGVfc3dpdGNoX2xlYWYgKGxmICpmaWxlLAorCQkJICAgZ2VuX2VudHJ5ICplbnRyeSwKKwkJCSAgIGludCBkZXB0aCwKKwkJCSAgIHZvaWQgKmRhdGEpCit7CisgIGNvbnN0IGNoYXIgKnJlc3VsdCA9IGRhdGE7CisgIEFTU0VSVCAoZW50cnktPnBhcmVudCAhPSBOVUxMKTsKKyAgQVNTRVJUIChkZXB0aCA9PSAwKTsKKyAgQVNTRVJUIChlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IHN3aXRjaF9nZW4KKwkgIHx8IGVudHJ5LT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCisJICB8fCBlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKTsKKyAgQVNTRVJUIChlbnRyeS0+cGFyZW50LT5vcGNvZGUpOworICAKKyAgLyogc2tpcCBvdmVyIGFueSBpbnN0cnVjdGlvbnMgY29tYmluZWQgaW50byBhbm90aGVyIGVudHJ5ICovCisgIGlmIChlbnRyeS0+Y29tYmluZWRfcGFyZW50ICE9IE5VTEwpCisgICAgcmV0dXJuOworCisgIGlmIChlbnRyeS0+cGFyZW50LT5vcGNvZGUtPmlzX2Jvb2xlYW4KKwkgICAmJiBlbnRyeS0+b3Bjb2RlX25yID09IDApCisgICAgeworICAgICAgLyogY2FzZTogYm9vbGVhbiBmYWxzZSB0YXJnZXQgKi8KKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImNhc2UgJWQ6XG4iLCBlbnRyeS0+cGFyZW50LT5vcGNvZGUtPmJvb2xlYW5fY29uc3RhbnQpOworICAgIH0KKyAgZWxzZSBpZiAoZW50cnktPnBhcmVudC0+b3Bjb2RlLT5pc19ib29sZWFuCisJICAgJiYgZW50cnktPm9wY29kZV9uciAhPSAwKQorICAgIHsKKyAgICAgIC8qIGNhc2U6IGJvb2xlYW4gdHJ1ZSBjYXNlICovCisgICAgICBsZl9wcmludGYgKGZpbGUsICJkZWZhdWx0OlxuIik7CisgICAgfQorICBlbHNlIGlmIChlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IHN3aXRjaF9nZW4KKwkgICB8fCBlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKQorICAgIHsKKyAgICAgIC8qIGNhc2U6IDxvcGNvZGUtbnI+IC0gc3dpdGNoICovCisgICAgICBnZW5fZW50cnkgKmNvYjsKKyAgICAgIGZvciAoY29iID0gZW50cnk7IGNvYiAhPSBOVUxMOyBjb2IgPSBjb2ItPmNvbWJpbmVkX25leHQpCisJbGZfcHJpbnRmIChmaWxlLCAiY2FzZSAlZDpcbiIsIGNvYi0+b3Bjb2RlX25yKTsKKyAgICB9CisgIGVsc2UgaWYgKGVudHJ5LT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuKQorICAgIHsKKyAgICAgIC8qIGNhc2U6IDxvcGNvZGUtbnI+IC0gZ290by1zd2l0Y2ggKi8KKyAgICAgIHByaW50X2dvdG9fc3dpdGNoX25hbWUgKGZpbGUsIGVudHJ5KTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIjpcbiIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEVSUk9SICgiYmFkIHN3aXRjaCIpOworICAgIH0KKyAgbGZfcHJpbnRmIChmaWxlLCAiICB7XG4iKTsKKyAgbGZfaW5kZW50IChmaWxlLCArNCk7CisgIHsKKyAgICBpZiAoZW50cnktPm9wY29kZSA9PSBOVUxMKQorICAgICAgeworCS8qIHN3aXRjaCBjYWxsaW5nIGxlYWYgKi8KKwlBU1NFUlQgKGVudHJ5LT5ucl9pbnNucyA9PSAxKTsKKwlwcmludF9pZGVjb2RlX2lmZXRjaCAoZmlsZSwgZW50cnktPm5yX3ByZWZldGNoZWRfd29yZHMsCisJCQkgICAgICBlbnRyeS0+aW5zbnMtPnNlbWFudGljLT5ucl9wcmVmZXRjaGVkX3dvcmRzKTsKKwlzd2l0Y2ggKG9wdGlvbnMuZ2VuLmNvZGUpCisJICB7CisJICBjYXNlIGdlbmVyYXRlX2p1bXBzOgorCSAgICBsZl9wcmludGYgKGZpbGUsICJnb3RvICIpOworCSAgICBicmVhazsKKwkgIGNhc2UgZ2VuZXJhdGVfY2FsbHM6CisJICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgcmVzdWx0KTsKKwkgICAgYnJlYWs7CisJICB9CisJcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKKwkJCSAgICAgZW50cnktPmluc25zLT5pbnNuLT5uYW1lLAorCQkJICAgICBlbnRyeS0+aW5zbnMtPmluc24tPmZvcm1hdF9uYW1lLAorCQkJICAgICBOVUxMLAorCQkJICAgICBlbnRyeS0+ZXhwYW5kZWRfYml0cywKKwkJCSAgICAgKG9wdGlvbnMuZ2VuLmljYWNoZQorCQkJICAgICAgPyBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGUKKwkJCSAgICAgIDogZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKSk7CisJaWYgKG9wdGlvbnMuZ2VuLmNvZGUgPT0gZ2VuZXJhdGVfY2FsbHMpCisJICB7CisJICAgIGxmX3ByaW50ZiAoZmlsZSwgIiAoIik7CisJICAgIHByaW50X3NlbWFudGljX2Z1bmN0aW9uX2FjdHVhbCAoZmlsZSwgZW50cnktPmluc25zLT5zZW1hbnRpYy0+bnJfcHJlZmV0Y2hlZF93b3Jkcyk7CisJICAgIGxmX3ByaW50ZiAoZmlsZSwgIikiKTsKKwkgIH0KKwlsZl9wcmludGYgKGZpbGUsICI7XG4iKTsKKyAgICAgIH0KKyAgICBlbHNlIGlmIChlbnRyeS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBzd2l0Y2hfZ2VuCisJICAgICB8fCBlbnRyeS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBnb3RvX3N3aXRjaF9nZW4KKwkgICAgIHx8IGVudHJ5LT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKQorICAgICAgeworCS8qIHN3aXRjaCBjYWxsaW5nIHN3aXRjaCAqLworCWxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOworCWxmX2luZGVudCAoZmlsZSwgKzIpOworCXByaW50X2lkZWNvZGVfaWZldGNoIChmaWxlLCBlbnRyeS0+cGFyZW50LT5ucl9wcmVmZXRjaGVkX3dvcmRzLAorCQkJICAgICAgZW50cnktPm5yX3ByZWZldGNoZWRfd29yZHMpOworCXByaW50X2lkZWNvZGVfc3dpdGNoIChmaWxlLCBlbnRyeSwgcmVzdWx0KTsKKwlsZl9pbmRlbnQgKGZpbGUsIC0yKTsKKwlsZl9wcmludGYgKGZpbGUsICJ9XG4iKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJLyogc3dpdGNoIGxvb2tpbmcgdXAgYSB0YWJsZSAqLworCWxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOworCWxmX2luZGVudCAoZmlsZSwgKzIpOworCXByaW50X2lkZWNvZGVfaWZldGNoIChmaWxlLCBlbnRyeS0+cGFyZW50LT5ucl9wcmVmZXRjaGVkX3dvcmRzLAorCQkJICAgICAgZW50cnktPm5yX3ByZWZldGNoZWRfd29yZHMpOworCXByaW50X2lkZWNvZGVfdGFibGUgKGZpbGUsIGVudHJ5LCByZXN1bHQpOworCWxmX2luZGVudCAoZmlsZSwgLTIpOworCWxmX3ByaW50ZiAoZmlsZSwgIn1cbiIpOworICAgICAgfQorICAgIGlmIChlbnRyeS0+cGFyZW50LT5vcGNvZGUtPmlzX2Jvb2xlYW4KKwl8fCBlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IHN3aXRjaF9nZW4KKwl8fCBlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKQorICAgICAgeworCWxmX3ByaW50ZiAoZmlsZSwgImJyZWFrO1xuIik7CisgICAgICB9CisgICAgZWxzZSBpZiAoZW50cnktPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBnb3RvX3N3aXRjaF9nZW4pCisgICAgICB7CisJcHJpbnRfZ290b19zd2l0Y2hfYnJlYWsoZmlsZSwgZW50cnkpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwlFUlJPUiAoImJhZCBzd2l0Y2giKTsKKyAgICAgIH0KKyAgfQorICBsZl9pbmRlbnQgKGZpbGUsIC00KTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiICB9XG4iKTsKK30KKworCitzdGF0aWMgdm9pZAorcHJpbnRfaWRlY29kZV9zd2l0Y2hfaWxsZWdhbCAobGYgKmZpbGUsCisJCQkgICAgICBjb25zdCBjaGFyICpyZXN1bHQpCit7CisgIGxmX2luZGVudCAoZmlsZSwgKzIpOworICBwcmludF9pZGVjb2RlX2ludmFsaWQgKGZpbGUsIHJlc3VsdCwgaW52YWxpZF9pbGxlZ2FsKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiYnJlYWs7XG4iKTsKKyAgbGZfaW5kZW50IChmaWxlLCAtMik7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9pZGVjb2RlX3N3aXRjaF9lbmQgKGxmICpmaWxlLAorCQkJICBnZW5fZW50cnkgKnRhYmxlLAorCQkJICBpbnQgZGVwdGgsCisJCQkgIHZvaWQgKmRhdGEpCit7CisgIGNvbnN0IGNoYXIgKnJlc3VsdCA9IGRhdGE7CisgIEFTU0VSVCAoZGVwdGggPT0gMCk7CisgIEFTU0VSVCAodGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgorCSAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCisJICB8fCB0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbik7CisgIEFTU0VSVCAodGFibGUtPm9wY29kZSk7CisgIAorICBpZiAodGFibGUtPm9wY29kZS0+aXNfYm9vbGVhbikKKyAgICB7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJ9XG4iKTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgLTIpOworICAgIH0KKyAgZWxzZSBpZiAodGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgorCSAgIHx8IHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKQorICAgIHsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImRlZmF1bHQ6XG4iKTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgKzIpOworICAgICAgaWYgKHRhYmxlLT5ucl9lbnRyaWVzID09IHRhYmxlLT5vcGNvZGUtPm5yX29wY29kZXMpCisJeworCSAgcHJpbnRfc2ltX2VuZ2luZV9hYm9ydCAoZmlsZSwgIkludGVybmFsIGVycm9yIC0gYmFkIHN3aXRjaCBnZW5lcmF0ZWQiKTsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgIiVzTlVMTF9DSUE7XG4iLCByZXN1bHQpOworCSAgbGZfcHJpbnRmIChmaWxlLCAiYnJlYWs7XG4iKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcHJpbnRfaWRlY29kZV9zd2l0Y2hfaWxsZWdhbCAoZmlsZSwgcmVzdWx0KTsKKwl9CisgICAgICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIn1cbiIpOworICAgICAgbGZfaW5kZW50IChmaWxlLCAtMik7CisgICAgfQorICBlbHNlIGlmICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBnb3RvX3N3aXRjaF9nZW4pCisgICAgeworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiaWxsZWdhbF8iKTsKKyAgICAgIGxmX3ByaW50X3RhYmxlX25hbWUgKGZpbGUsIHRhYmxlKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIjpcbiIpOworICAgICAgcHJpbnRfaWRlY29kZV9pbnZhbGlkIChmaWxlLCByZXN1bHQsIGludmFsaWRfaWxsZWdhbCk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJicmVha18iKTsKKyAgICAgIGxmX3ByaW50X3RhYmxlX25hbWUoZmlsZSwgdGFibGUpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiOjtcbiIpOworICAgICAgaWYgKHRhYmxlLT5wYXJlbnQgIT0gTlVMTAorCSAgJiYgKHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgorCSAgICAgIHx8IHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCisJICAgICAgfHwgdGFibGUtPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbikpCisJeworCSAgbGZfaW5kZW50IChmaWxlLCAtMik7CisJICBsZl9wcmludGYgKGZpbGUsICJ9XG4iKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgRVJST1IgKCJiYWQgc3dpdGNoIik7CisgICAgfQorfQorCisKK3ZvaWQKK3ByaW50X2lkZWNvZGVfc3dpdGNoIChsZiAqZmlsZSwgCisJCSAgICAgIGdlbl9lbnRyeSAqdGFibGUsCisJCSAgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCkKK3sKKyAgZ2VuX2VudHJ5X3RyYXZlcnNlX3RyZWUgKGZpbGUsIHRhYmxlLAorCQkJICAgMCwKKwkJCSAgIHByaW50X2lkZWNvZGVfc3dpdGNoX3N0YXJ0LAorCQkJICAgcHJpbnRfaWRlY29kZV9zd2l0Y2hfbGVhZiwKKwkJCSAgIHByaW50X2lkZWNvZGVfc3dpdGNoX2VuZCwKKwkJCSAgICh2b2lkKilyZXN1bHQpOworfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9pZGVjb2RlX3N3aXRjaF9mdW5jdGlvbl9oZWFkZXIgKGxmICpmaWxlLAorCQkJCSAgICAgIGdlbl9lbnRyeSAqdGFibGUsCisJCQkJICAgICAgaW50IGlzX2Z1bmN0aW9uX2RlZmluaXRpb24sCisJCQkJICAgICAgaW50IG5yX3ByZWZldGNoZWRfd29yZHMpCit7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgIGlmIChvcHRpb25zLmdlbi5jb2RlID09IGdlbmVyYXRlX2NhbGxzKQorICAgIHsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgInN0YXRpYyAiKTsKKyAgICAgIGlmIChvcHRpb25zLmdlbi5pY2FjaGUpCisJeworCSAgbGZfcHJpbnRmIChmaWxlLCAiaWRlY29kZV9zZW1hbnRpYyAqIik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgInVuc2lnbmVkX3dvcmQiKTsKKwl9CisgICAgICBpZiAoaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKKwl7CisJICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBsZl9wcmludGYgKGZpbGUsICIgIik7CisJfQorICAgICAgbGZfcHJpbnRfdGFibGVfbmFtZSAoZmlsZSwgdGFibGUpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oIik7CisgICAgICBwcmludF9pY2FjaGVfZnVuY3Rpb25fZm9ybWFsIChmaWxlLCBucl9wcmVmZXRjaGVkX3dvcmRzKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIikiKTsKKyAgICAgIGlmICghaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKKwl7CisJICBsZl9wcmludGYgKGZpbGUsICI7Iik7CisJfQorICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgICB9CisgIGlmIChvcHRpb25zLmdlbi5jb2RlID09IGdlbmVyYXRlX2p1bXBzICYmIGlzX2Z1bmN0aW9uX2RlZmluaXRpb24pCisgICAgeworICAgICAgbGZfaW5kZW50IChmaWxlLCAtMSk7CisgICAgICBsZl9wcmludF90YWJsZV9uYW1lIChmaWxlLCB0YWJsZSk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICI6XG4iKTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAoraWRlY29kZV9kZWNsYXJlX2lmX3N3aXRjaCAobGYgKmZpbGUsCisJCQkgICBnZW5fZW50cnkgKnRhYmxlLAorCQkJICAgaW50IGRlcHRoLAorCQkJICAgdm9pZCAqZGF0YSkKK3sKKyAgaWYgKCh0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBzd2l0Y2hfZ2VuCisgICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCisgICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pCisgICAgICAmJiB0YWJsZS0+cGFyZW50ICE9IE5VTEwgLyogZG9uJ3QgZGVjbGFyZSB0aGUgdG9wIG9uZSB5ZXQgKi8KKyAgICAgICYmIHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gYXJyYXlfZ2VuKQorICAgIHsKKyAgICAgIHByaW50X2lkZWNvZGVfc3dpdGNoX2Z1bmN0aW9uX2hlYWRlciAoZmlsZSwKKwkJCQkJICAgIHRhYmxlLAorCQkJCQkgICAgMC8qaXNudCBmdW5jdGlvbiBkZWZpbml0aW9uKi8sCisJCQkJCSAgICAwKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2lkZWNvZGVfZXhwYW5kX2lmX3N3aXRjaCAobGYgKmZpbGUsCisJCQkgIGdlbl9lbnRyeSAqdGFibGUsCisJCQkgIGludCBkZXB0aCwKKwkJCSAgdm9pZCAqZGF0YSkKK3sKKyAgaWYgKCh0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBzd2l0Y2hfZ2VuCisgICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCisgICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pCisgICAgICAmJiB0YWJsZS0+cGFyZW50ICE9IE5VTEwgLyogZG9uJ3QgZXhwYW5kIHRoZSB0b3Agb25lIHlldCAqLworICAgICAgJiYgdGFibGUtPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBhcnJheV9nZW4pCisgICAgeworICAgICAgcHJpbnRfaWRlY29kZV9zd2l0Y2hfZnVuY3Rpb25faGVhZGVyKGZpbGUsCisJCQkJCSAgIHRhYmxlLAorCQkJCQkgICAxLyppcyBmdW5jdGlvbiBkZWZpbml0aW9uKi8sCisJCQkJCSAgIDApOworICAgICAgaWYgKG9wdGlvbnMuZ2VuLmNvZGUgPT0gZ2VuZXJhdGVfY2FsbHMpCisJeworCSAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7CisJICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKKwl9CisgICAgICBwcmludF9pZGVjb2RlX3N3aXRjaChmaWxlLCB0YWJsZSwgInJldHVybiIpOworICAgICAgaWYgKG9wdGlvbnMuZ2VuLmNvZGUgPT0gZ2VuZXJhdGVfY2FsbHMpCisJeworCSAgbGZfaW5kZW50IChmaWxlLCAtMik7CisJICBsZl9wcmludGYgKGZpbGUsICJ9XG4iKTsKKwl9CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3ZvaWQKK3ByaW50X2lkZWNvZGVfbG9va3VwcyAobGYgKmZpbGUsCisJCSAgICAgICBnZW5fZW50cnkgKnRhYmxlLAorCQkgICAgICAgY2FjaGVfZW50cnkgKmNhY2hlX3J1bGVzKQoreworICBpbnQgZGVwdGg7CisgIAorICAvKiBvdXRwdXQgc3dpdGNoIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyB3aGVyZSBuZWVkZWQgYnkgdGFibGVzICovCisgIGdlbl9lbnRyeV90cmF2ZXJzZV90cmVlIChmaWxlLCB0YWJsZSwKKwkJCSAgIDEsCisJCQkgICBpZGVjb2RlX2RlY2xhcmVfaWZfc3dpdGNoLCAvKiBTVEFSVCAqLworCQkJICAgTlVMTCwgTlVMTCwKKwkJCSAgIE5VTEwpOworICAKKyAgLyogb3V0cHV0IHRhYmxlcyB3aGVyZSBuZWVkZWQgKi8KKyAgZm9yIChkZXB0aCA9IGdlbl9lbnRyeV9kZXB0aCAodGFibGUpOworICAgICAgIGRlcHRoID4gMDsKKyAgICAgICBkZXB0aC0tKQorICAgIHsKKyAgICAgIGdlbl9lbnRyeV90cmF2ZXJzZV90cmVlIChmaWxlLCB0YWJsZSwKKwkJCSAgICAgICAxLWRlcHRoLAorCQkJICAgICAgIHByaW50X2lkZWNvZGVfdGFibGVfc3RhcnQsCisJCQkgICAgICAgcHJpbnRfaWRlY29kZV90YWJsZV9sZWFmLAorCQkJICAgICAgIHByaW50X2lkZWNvZGVfdGFibGVfZW5kLAorCQkJICAgICAgIE5VTEwpOworICAgIH0KKyAgCisgIC8qIG91dHB1dCBzd2l0Y2ggZnVuY3Rpb25zIHdoZXJlIG5lZWRlZCAqLworICBnZW5fZW50cnlfdHJhdmVyc2VfdHJlZSAoZmlsZSwgdGFibGUsCisJCQkgICAgMSwKKwkJCSAgICBpZGVjb2RlX2V4cGFuZF9pZl9zd2l0Y2gsIC8qIFNUQVJUICovCisJCQkgICAgTlVMTCwgTlVMTCwKKwkJCSAgICBOVUxMKTsKK30KKworCit2b2lkCitwcmludF9pZGVjb2RlX2JvZHkgKGxmICpmaWxlLAorCQkgICAgZ2VuX2VudHJ5ICp0YWJsZSwKKwkJICAgIGNvbnN0IGNoYXIgKnJlc3VsdCkKK3sKKyAgaWYgKHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IHN3aXRjaF9nZW4KKyAgICAgIHx8IHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbgorICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pCisgICAgeworICAgICAgcHJpbnRfaWRlY29kZV9zd2l0Y2ggKGZpbGUsIHRhYmxlLCByZXN1bHQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50X2lkZWNvZGVfdGFibGUgKGZpbGUsIHRhYmxlLCByZXN1bHQpOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIDAKK3N0YXRpYyB2b2lkCitwcmludF9qdW1wIChsZiAqZmlsZSwKKwkgICAgaW50IGlzX3RhaWwpCit7CisgIGlmIChpc190YWlsKQorICAgIHsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgImlmIChrZWVwX3J1bm5pbmcgIT0gTlVMTCAmJiAhKmtlZXBfcnVubmluZylcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICBjcHVfaGFsdChjcHUsIG5pYSwgd2FzX2NvbnRpbnVpbmcsIDAvKm5hKi8pO1xuIik7CisgICAgfQorICAKKyAgaWYgKCFvcHRpb25zLmdlbmVyYXRlX3NtcCkKKyAgICB7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJpZiAoV0lUSF9FVkVOVFMpIHtcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICBpZiAoZXZlbnRfcXVldWVfdGljayhldmVudHMpKSB7XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICBjcHVfc2V0X3Byb2dyYW1fY291bnRlcihjcHUsIG5pYSk7XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICBldmVudF9xdWV1ZV9wcm9jZXNzKGV2ZW50cyk7XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgICBuaWEgPSBjcHVfZ2V0X3Byb2dyYW1fY291bnRlcihjcHUpO1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIH1cbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAifVxuIik7CisgICAgfQorICAKKyAgaWYgKG9wdGlvbnMuZ2VuZXJhdGVfc21wKQorICAgIHsKKyAgICAgIGlmIChpc190YWlsKQorCXsKKwkgIGxmX3B1dHN0ciAoZmlsZSwgImNwdV9zZXRfcHJvZ3JhbV9jb3VudGVyKGNwdSwgbmlhKTtcbiIpOworCX0KKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgImlmIChXSVRIX0VWRU5UUykge1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIGN1cnJlbnRfY3B1ICs9IDE7XG4iKTsKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIiAgaWYgKGN1cnJlbnRfY3B1ID49IG5yX2NwdXMpIHtcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICAgIGlmIChldmVudF9xdWV1ZV90aWNrKGV2ZW50cykpIHtcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICAgICAgZXZlbnRfcXVldWVfcHJvY2VzcyhldmVudHMpO1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICIgICAgfVxuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICIgICAgY3VycmVudF9jcHUgPSAwO1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIH1cbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAifVxuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJlbHNlIHtcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiICBjdXJyZW50X2NwdSA9IChjdXJyZW50X2NwdSArIDEpICUgbnJfY3B1cztcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAifVxuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJjcHUgPSBjcHVzW2N1cnJlbnRfY3B1XTtcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAibmlhID0gY3B1X2dldF9wcm9ncmFtX2NvdW50ZXIoY3B1KTtcbiIpOworICAgIH0KKyAgCisgIGlmIChvcHRpb25zLmdlbi5pY2FjaGUpCisgICAgeworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiY2FjaGVfZW50cnkgPSBjcHVfaWNhY2hlX2VudHJ5KGNwdSwgbmlhKTtcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAiaWYgKGNhY2hlX2VudHJ5LT5hZGRyZXNzID09IG5pYSkge1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIC8qIGNhY2hlIGhpdCAqL1xuIik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICIgIGdvdG8gKmNhY2hlX2VudHJ5LT5zZW1hbnRpYztcbiIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAifVxuIik7CisgICAgICBpZiAoaXNfdGFpbCkKKwl7CisJICBsZl9wdXRzdHIgKGZpbGUsICJnb3RvIGNhY2hlX21pc3M7XG4iKTsKKwl9CisgICAgfQorCisgIGlmICghb3B0aW9ucy5nZW4uaWNhY2hlICYmIGlzX3RhaWwpCisgICAgeworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiZ290byBpZGVjb2RlO1xuIik7CisgICAgfQorICAKK30KKyNlbmRpZgorCisKKworI2lmIDAKK3N0YXRpYyB2b2lkCitwcmludF9qdW1wX2luc24gKGxmICpmaWxlLAorCQkgaW5zbl9lbnRyeSAqaW5zdHJ1Y3Rpb24sCisJCSBpbnNuX2JpdHMgKmV4cGFuZGVkX2JpdHMsCisJCSBvcGNvZGVfZmllbGQgKm9wY29kZXMsCisJCSBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZXMpCit7CisgIAorICAvKiB3aGF0IHdlIGFyZSBmb3IgdGhlIG1vbWVudCAqLworICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICBwcmludF9teV9kZWZpbmVzIChmaWxlLCBleHBhbmRlZF9iaXRzLCBpbnN0cnVjdGlvbi0+bmFtZSk7CisgIAorICAvKiBvdXRwdXQgdGhlIGljYWNoZSBlbnRyeSAqLworICBpZiAob3B0aW9ucy5nZW4uaWNhY2hlKQorICAgIHsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKKyAgICAgIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCisJCQkgICBpbnN0cnVjdGlvbi0+bmFtZSwKKwkJCSAgIGV4cGFuZGVkX2JpdHMsCisJCQkgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGUpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiOlxuIik7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOworICAgICAgbGZfaW5kZW50IChmaWxlLCArMik7CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICJjb25zdCB1bnNpZ25lZF93b3JkIGNpYSA9IG5pYTtcbiIpOworICAgICAgcHJpbnRfaXRyYWNlIChmaWxlLCBpbnN0cnVjdGlvbiwgMS8qcHV0dGluZy12YWx1ZS1pbi1jYWNoZSovKTsKKyAgICAgIHByaW50X2lkZWNvZGVfdmFsaWRhdGUgKGZpbGUsIGluc3RydWN0aW9uLCBvcGNvZGVzKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJ7XG4iKTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgKzIpOworICAgICAgcHJpbnRfaWNhY2hlX2JvZHkgKGZpbGUsCisJCQkgaW5zdHJ1Y3Rpb24sCisJCQkgZXhwYW5kZWRfYml0cywKKwkJCSBjYWNoZV9ydWxlcywKKwkJCSAwLCAvKnVzZV9kZWZpbmVzKi8KKwkJCSBwdXRfdmFsdWVzX2luX2ljYWNoZSk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJjYWNoZV9lbnRyeS0+YWRkcmVzcyA9IG5pYTtcbiIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiY2FjaGVfZW50cnktPnNlbWFudGljID0gJiYiKTsKKyAgICAgIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCisJCQkgICBpbnN0cnVjdGlvbi0+bmFtZSwKKwkJCSAgIGV4cGFuZGVkX2JpdHMsCisJCQkgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiO1xuIik7CisgICAgICBpZiAob3B0aW9ucy5nZW4uc2VtYW50aWNfaWNhY2hlKQorCXsKKwkgIHByaW50X3NlbWFudGljX2JvZHkgKGZpbGUsCisJCQkgICAgICAgaW5zdHJ1Y3Rpb24sCisJCQkgICAgICAgZXhwYW5kZWRfYml0cywKKwkJCSAgICAgICBvcGNvZGVzKTsKKwkgIHByaW50X2p1bXAgKGZpbGUsIDEvKmlzLXRhaWwqLyk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgIi8qIGdvdG8gIik7CisJICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAorCQkJICAgICAgIGluc3RydWN0aW9uLT5uYW1lLAorCQkJICAgICAgIGV4cGFuZGVkX2JpdHMsCisJCQkgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKTsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgIjsgKi9cbiIpOworCX0KKyAgICAgIGxmX2luZGVudCAoZmlsZSwgLTIpOworICAgICAgbGZfcHV0c3RyIChmaWxlLCAifVxuIik7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIn1cbiIpOworICAgIH0KKyAgCisgIC8qIHByaW50IHRoZSBzZW1hbnRpY3MgKi8KKyAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgbGZfaW5kZW50IChmaWxlLCAtMSk7CisgIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCisJCSAgICAgICBpbnN0cnVjdGlvbi0+bmFtZSwKKwkJICAgICAgIGV4cGFuZGVkX2JpdHMsCisJCSAgICAgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpOworICBsZl9wcmludGYgKGZpbGUsICI6XG4iKTsKKyAgbGZfaW5kZW50IChmaWxlLCArMSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOworICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKKyAgbGZfcHV0c3RyIChmaWxlLCAiY29uc3QgdW5zaWduZWRfd29yZCBjaWEgPSBuaWE7XG4iKTsKKyAgcHJpbnRfaWNhY2hlX2JvZHkgKGZpbGUsCisJCSAgICAgaW5zdHJ1Y3Rpb24sCisJCSAgICAgZXhwYW5kZWRfYml0cywKKwkJICAgICBjYWNoZV9ydWxlcywKKwkJICAgICAob3B0aW9ucy5nZW4uZGlyZWN0X2FjY2VzcworCQkgICAgICA/IGRlZmluZV92YXJpYWJsZXMKKwkJICAgICAgOiBkZWNsYXJlX3ZhcmlhYmxlcyksCisJCSAgICAgKG9wdGlvbnMuZ2VuLmljYWNoZQorCQkgICAgICA/IGdldF92YWx1ZXNfZnJvbV9pY2FjaGUKKwkJICAgICAgOiBkb19ub3RfdXNlX2ljYWNoZSkpOworICBwcmludF9zZW1hbnRpY19ib2R5IChmaWxlLAorCQkgICAgICAgaW5zdHJ1Y3Rpb24sCisJCSAgICAgICBleHBhbmRlZF9iaXRzLAorCQkgICAgICAgb3Bjb2Rlcyk7CisgIGlmIChvcHRpb25zLmdlbi5kaXJlY3RfYWNjZXNzKQorICAgIHByaW50X2ljYWNoZV9ib2R5IChmaWxlLAorCQkgICAgICAgaW5zdHJ1Y3Rpb24sCisJCSAgICAgICBleHBhbmRlZF9iaXRzLAorCQkgICAgICAgY2FjaGVfcnVsZXMsCisJCSAgICAgICB1bmRlZl92YXJpYWJsZXMsCisJCSAgICAgICAob3B0aW9ucy5nZW4uaWNhY2hlCisJCQk/IGdldF92YWx1ZXNfZnJvbV9pY2FjaGUKKwkJCTogZG9fbm90X3VzZV9pY2FjaGUpKTsKKyAgcHJpbnRfanVtcCAoZmlsZSwgMS8qaXMgdGFpbCovKTsKKyAgbGZfaW5kZW50IChmaWxlLCAtMik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIn1cbiIpOworfQorI2VuZGlmCisKKworI2lmIDAKK3N0YXRpYyB2b2lkCitwcmludF9qdW1wX2RlZmluaXRpb24gKGxmICpmaWxlLAorCQkgICAgICAgZ2VuX2VudHJ5ICplbnRyeSwKKwkJICAgICAgIGluc25fZW50cnkgKmluc24sCisJCSAgICAgICBpbnQgZGVwdGgsCisJCSAgICAgICB2b2lkICpkYXRhKQoreworICBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZXMgPSAoY2FjaGVfZW50cnkqKWRhdGE7CisgIGlmIChvcHRpb25zLmdlbmVyYXRlX2V4cGFuZGVkX2luc3RydWN0aW9ucykKKyAgICB7CisgICAgICBBU1NFUlQgKGVudHJ5LT5ucl9pbnNucyA9PSAxCisJICAgICAgJiYgZW50cnktPm9wY29kZSA9PSBOVUxMCisJICAgICAgJiYgZW50cnktPnBhcmVudCAhPSBOVUxMCisJICAgICAgJiYgZW50cnktPnBhcmVudC0+b3Bjb2RlICE9IE5VTEwpOworICAgICAgQVNTRVJUIChlbnRyeS0+bnJfaW5zbnMgPT0gMQorCSAgICAgICYmIGVudHJ5LT5vcGNvZGUgPT0gTlVMTAorCSAgICAgICYmIGVudHJ5LT5wYXJlbnQgIT0gTlVMTAorCSAgICAgICYmIGVudHJ5LT5wYXJlbnQtPm9wY29kZSAhPSBOVUxMCisJICAgICAgJiYgZW50cnktPnBhcmVudC0+b3Bjb2RlX3J1bGUgIT0gTlVMTCk7CisgICAgICBwcmludF9qdW1wX2luc24gKGZpbGUsCisJCSAgICAgICBlbnRyeS0+aW5zbnMtPndvcmRzWzBdLT5pbnNuLAorCQkgICAgICAgZW50cnktPmV4cGFuZGVkX2JpdHMsCisJCSAgICAgICBlbnRyeS0+b3Bjb2RlLAorCQkgICAgICAgY2FjaGVfcnVsZXMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50X2p1bXBfaW5zbiAoZmlsZSwKKwkJICAgICAgIGluc3RydWN0aW9uLT53b3Jkc1swXS0+aW5zbiwKKwkJICAgICAgIE5VTEwsCisJCSAgICAgICBOVUxMLAorCQkgICAgICAgY2FjaGVfcnVsZXMpOworICAgIH0KK30KKyNlbmRpZgorCisjaWYgMAorc3RhdGljIHZvaWQKK3ByaW50X2p1bXBfaW50ZXJuYWxfZnVuY3Rpb24gKGxmICpmaWxlLAorCQkJICAgICAgZ2VuX2VudHJ5ICp0YWJsZSwKKwkJCSAgICAgIGZ1bmN0aW9uX2VudHJ5ICpmdW5jdGlvbiwKKwkJCSAgICAgIHZvaWQgKmRhdGEpCit7CisgIGlmIChmdW5jdGlvbi0+aXNfaW50ZXJuYWwpCisgICAgeworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgICAgIGxmX3ByaW50X19saW5lX3JlZiAoZmlsZSwgZnVuY3Rpb24tPmxpbmUpOworICAgICAgbGZfaW5kZW50IChmaWxlLCAtMSk7CisgICAgICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAorCQkJICAgZnVuY3Rpb24tPm5hbWUsCisJCQkgICBOVUxMLAorCQkJICAgKG9wdGlvbnMuZ2VuLmljYWNoZQorCQkJICAgID8gZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWNhY2hlCisJCQkgICAgOiBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIjpcbiIpOworICAgICAgbGZfaW5kZW50IChmaWxlLCArMSk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJ7XG4iKTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgKzIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiY29uc3QgdW5zaWduZWRfd29yZCBjaWEgPSBuaWE7XG4iKTsKKyAgICAgIHRhYmxlX3ByaW50X2NvZGUgKGZpbGUsIGZ1bmN0aW9uLT5jb2RlKTsKKyAgICAgIGxmX3ByaW50X19pbnRlcm5hbF9yZWYgKGZpbGUpOworICAgICAgcHJpbnRfc2ltX2VuZ2luZV9hYm9ydCAoZmlsZSwgIkludGVybmFsIGZ1bmN0aW9uIG11c3QgbG9uZ2p1bXAiKTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgLTIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAifVxuIik7CisgICAgfQorfQorI2VuZGlmCisKKworCisjaWYgMAorc3RhdGljIHZvaWQKK3ByaW50X2p1bXBfdW50aWxfc3RvcF9ib2R5KGxmICpmaWxlLAorCQkJICAgaW5zbl90YWJsZSAqdGFibGUsCisJCQkgICBjYWNoZV90YWJsZSAqY2FjaGVfcnVsZXMpCit7CisgIGxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOworICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKKyAgbGZfcHV0c3RyIChmaWxlLCAiam1wX2J1ZiBoYWx0O1xuIik7CisgIGxmX3B1dHN0ciAoZmlsZSwgImptcF9idWYgcmVzdGFydDtcbiIpOworICBsZl9wdXRzdHIgKGZpbGUsICJzaW1fY3B1ICpjcHUgPSBOVUxMO1xuIik7CisgIGxmX3B1dHN0ciAoZmlsZSwgInVuc2lnbmVkX3dvcmQgbmlhID0gLTE7XG4iKTsKKyAgbGZfcHV0c3RyIChmaWxlLCAiaW5zdHJ1Y3Rpb25fd29yZCBpbnN0cnVjdGlvbiA9IDA7XG4iKTsKKyAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKSB7CisgICAgbGZfcHV0c3RyIChmaWxlLCAiaWRlY29kZV9jYWNoZSAqY2FjaGVfZW50cnkgPSBOVUxMO1xuIik7CisgIH0KKyAgaWYgKGdlbmVyYXRlX3NtcCkgeworICAgIGxmX3B1dHN0ciAoZmlsZSwgImludCBjdXJyZW50X2NwdSA9IC0xO1xuIik7CisgIH0KKworICAvKiBhbGwgdGhlIHN3aXRjaGVzIGFuZCB0YWJsZXMgLSB0aGV5IGtub3cgYWJvdXQganVtcGluZyAqLworICBwcmludF9pZGVjb2RlX2xvb2t1cHMoZmlsZSwgdGFibGUsIGNhY2hlX3J1bGVzKTsKKyAKKyAgLyogc3RhcnQgdGhlIHNpbXVsYXRpb24gdXAgKi8KKyAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKSB7CisgICAgbGZfcHV0c3RyIChmaWxlLCAiXG4iKTsKKyAgICBsZl9wdXRzdHIgKGZpbGUsICJ7XG4iKTsKKyAgICBsZl9wdXRzdHIgKGZpbGUsICIgIGludCBjcHVfbnI7XG4iKTsKKyAgICBsZl9wdXRzdHIgKGZpbGUsICIgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgbnJfY3B1czsgY3B1X25yKyspXG4iKTsKKyAgICBsZl9wdXRzdHIgKGZpbGUsICIgICAgY3B1X2ZsdXNoX2ljYWNoZShjcHVzW2NwdV9ucl0pO1xuIik7CisgICAgbGZfcHV0c3RyIChmaWxlLCAifVxuIik7CisgIH0KKworICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOworICBsZl9wdXRzdHIgKGZpbGUsICJwc2ltX3NldF9oYWx0X2FuZF9yZXN0YXJ0KHN5c3RlbSwgJmhhbHQsICZyZXN0YXJ0KTtcbiIpOworCisgIGxmX3B1dHN0ciAoZmlsZSwgIlxuIik7CisgIGxmX3B1dHN0ciAoZmlsZSwgImlmIChzZXRqbXAoaGFsdCkpXG4iKTsKKyAgbGZfcHV0c3RyIChmaWxlLCAiICByZXR1cm47XG4iKTsKKworICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOworICBsZl9wdXRzdHIgKGZpbGUsICJzZXRqbXAocmVzdGFydCk7XG4iKTsKKworICBsZl9wdXRzdHIgKGZpbGUsICJcbiIpOworICBpZiAoIWdlbmVyYXRlX3NtcCkgeworICAgIGxmX3B1dHN0ciAoZmlsZSwgImNwdSA9IGNwdXNbMF07XG4iKTsKKyAgICBsZl9wdXRzdHIgKGZpbGUsICJuaWEgPSBjcHVfZ2V0X3Byb2dyYW1fY291bnRlcihjcHUpO1xuIik7CisgIH0KKyAgZWxzZSB7CisgICAgbGZfcHV0c3RyIChmaWxlLCAiY3VycmVudF9jcHUgPSBwc2ltX2xhc3RfY3B1KHN5c3RlbSk7XG4iKTsKKyAgfQorCisgIGlmICghKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkpIHsKKyAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOworICAgIGxmX3ByaW50ZiAoZmlsZSwgImlkZWNvZGU6XG4iKTsKKyAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgfQorCisgIHByaW50X2p1bXAoZmlsZSwgMC8qaXNfdGFpbCovKTsKKworICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkpIHsKKyAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKKyAgICBsZl9wcmludGYgKGZpbGUsICJjYWNoZV9taXNzOlxuIik7CisgICAgbGZfaW5kZW50IChmaWxlLCArMSk7CisgIH0KKworICBsZl9wdXRzdHIgKGZpbGUsICJpbnN0cnVjdGlvblxuIik7CisgIGxmX3B1dHN0ciAoZmlsZSwgIiAgPSB2bV9pbnN0cnVjdGlvbl9tYXBfcmVhZChjcHVfaW5zdHJ1Y3Rpb25fbWFwKGNwdSksXG4iKTsKKyAgbGZfcHV0c3RyIChmaWxlLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdSwgbmlhKTtcbiIpOworICBwcmludF9pZGVjb2RlX2JvZHkoZmlsZSwgdGFibGUsICIvKklHT1JFKi8iKTsKKworICAvKiBwcmludCBvdXQgYSB0YWJsZSBvZiBhbGwgdGhlIGludGVybmFscyBmdW5jdGlvbnMgKi8KKyAgaW5zbl90YWJsZV90cmF2ZXJzZV9mdW5jdGlvbih0YWJsZSwKKwkJCSAgICAgICBmaWxlLCBOVUxMLAorCQkJICAgICAgIHByaW50X2p1bXBfaW50ZXJuYWxfZnVuY3Rpb24pOworCisgLyogcHJpbnQgb3V0IGEgdGFibGUgb2YgYWxsIHRoZSBpbnN0cnVjdGlvbnMgKi8KKyAgaWYgKGdlbmVyYXRlX2V4cGFuZGVkX2luc3RydWN0aW9ucykKKyAgICBpbnNuX3RhYmxlX3RyYXZlcnNlX3RyZWUodGFibGUsCisJCQkgICAgIGZpbGUsIGNhY2hlX3J1bGVzLAorCQkJICAgICAxLAorCQkJICAgICBOVUxMLCAvKiBzdGFydCAqLworCQkJICAgICBwcmludF9qdW1wX2RlZmluaXRpb24sIC8qIGxlYWYgKi8KKwkJCSAgICAgTlVMTCwgLyogZW5kICovCisJCQkgICAgIE5VTEwpOyAvKiBwYWRkaW5nICovCisgIGVsc2UKKyAgICBpbnNuX3RhYmxlX3RyYXZlcnNlX2luc24odGFibGUsCisJCQkgICAgIGZpbGUsIGNhY2hlX3J1bGVzLAorCQkJICAgICBwcmludF9qdW1wX2RlZmluaXRpb24pOworICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAifVxuIik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisvKiBPdXRwdXQgY29kZSB0byBkbyBhbnkgZmluYWwgY2hlY2tzIG9uIHRoZSBkZWNvZGVkIGluc3RydWN0aW9uLgorICAgVGhpcyBpbmNsdWRlcyB0aGluZ3MgbGlrZSB2ZXJpZnlpbmcgYW55IG9uIGRlY29kZWQgZmllbGRzIGhhdmUgdGhlCisgICBjb3JyZWN0IHZhbHVlIGFuZCBjaGVja2luZyB0aGF0IChmb3IgZmxvYXRpbmcgcG9pbnQpIGZsb2F0aW5nIHBvaW50CisgICBoYXJkd2FyZSBpc24ndCBkaXNhYmxlZCAqLworCit2b2lkCitwcmludF9pZGVjb2RlX3ZhbGlkYXRlIChsZiAqZmlsZSwKKwkJCWluc25fZW50cnkgKmluc3RydWN0aW9uLAorCQkJaW5zbl9vcGNvZGVzICpvcGNvZGVfcGF0aHMpCit7CisgIC8qIFZhbGlkYXRlOiB1bmNoZWNrZWQgaW5zdHJ1Y3Rpb24gZmllbGRzCisKKyAgICAgSWYgYW55IGNvbnN0YW50IGZpZWxkcyBpbiB0aGUgaW5zdHJ1Y3Rpb24gd2VyZSBub3QgY2hlY2tlZCBieSB0aGUKKyAgICAgaWRlY29kZSB0YWJsZXMsIG91dHB1dCBjb2RlIHRvIGNoZWNrIHRoYXQgdGhleSBoYXZlIHRoZSBjb3JyZWN0CisgICAgIHZhbHVlIGhlcmUgKi8KKyAgeworICAgIGludCBucl9jaGVja3MgPSAwOworICAgIGludCB3b3JkX25yOworICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgICAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKKyAgICBsZl9wcmludGYgKGZpbGUsICIjaWYgZGVmaW5lZCAoV0lUSF9SRVNFUlZFRF9CSVRTKVxuIik7CisgICAgbGZfcHJpbnRmIChmaWxlLCAiLyogdmFsaWRhdGU6ICIpOworICAgIHByaW50X2luc25fd29yZHMgKGZpbGUsIGluc3RydWN0aW9uKTsKKyAgICBsZl9wcmludGYgKGZpbGUsICIgKi9cbiIpOworICAgIGZvciAod29yZF9uciA9IDA7IHdvcmRfbnIgPCBpbnN0cnVjdGlvbi0+bnJfd29yZHM7IHdvcmRfbnIrKykKKyAgICAgIHsKKwlpbnNuX3VpbnQgY2hlY2tfbWFzayA9IDA7CisJaW5zbl91aW50IGNoZWNrX3ZhbCA9IDA7CisJaW5zbl93b3JkX2VudHJ5ICp3b3JkID0gaW5zdHJ1Y3Rpb24tPndvcmRbd29yZF9ucl07CisJaW50IGJpdF9ucjsKKworCS8qIGZvcm0gY2hlY2tfbWFzay9jaGVja192YWwgY29udGFpbmluZyB3aGF0IG5lZWRzIHRvIGJlIGNoZWNrZWQKKwkgICBpbiB0aGUgaW5zdHJ1Y3Rpb24gKi8KKwlmb3IgKGJpdF9uciA9IDA7IGJpdF9uciA8IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZTsgYml0X25yKyspCisJICB7CisJICAgIGluc25fYml0X2VudHJ5ICpiaXQgPSB3b3JkLT5iaXRbYml0X25yXTsKKwkgICAgaW5zbl9maWVsZF9lbnRyeSAqZmllbGQgPSBiaXQtPmZpZWxkOworCisJICAgIC8qIE1ha2Ugc3BhY2UgZm9yIHRoZSBuZXh0IGJpdCAqLworCSAgICBjaGVja19tYXNrIDw8PSAxOworCSAgICBjaGVja192YWwgPDw9IDE7CisJICAgIAorCSAgICAvKiBPbmx5IG5lZWQgdG8gdmFsaWRhdGUgY29uc3RhbnQgKGFuZCByZXNlcnZlZCkKKyAgICAgICAgICAgICAgIGJpdHMuIFNraXAgYW55IG90aGVycyAqLworCSAgICBpZiAoZmllbGQtPnR5cGUgIT0gaW5zbl9maWVsZF9pbnQKKwkJJiYgZmllbGQtPnR5cGUgIT0gaW5zbl9maWVsZF9yZXNlcnZlZCkKKwkgICAgICBjb250aW51ZTsKKworCSAgICAvKiBMb29rIHRocm91Z2ggdGhlIGxpc3Qgb2Ygb3Bjb2RlIHBhdGhzIHRoYXQgbGVhZCB0byB0aGlzCisgICAgICAgICAgICAgICBpbnN0cnVjdGlvbi4gIFNlZSBpZiBhbnkgaGF2ZSBmYWlsZWQgdG8gY2hlY2sgdGhlCisgICAgICAgICAgICAgICByZWxldmFudCBiaXQgKi8KKwkgICAgaWYgKG9wY29kZV9wYXRocyAhPSBOVUxMKQorCSAgICAgIHsKKwkJaW5zbl9vcGNvZGVzICplbnRyeTsKKwkJZm9yIChlbnRyeSA9IG9wY29kZV9wYXRoczsKKwkJICAgICBlbnRyeSAhPSBOVUxMOworCQkgICAgIGVudHJ5ID0gZW50cnktPm5leHQpCisJCSAgeworCQkgICAgb3Bjb2RlX2ZpZWxkICpvcGNvZGU7CisJCSAgICBmb3IgKG9wY29kZSA9IGVudHJ5LT5vcGNvZGU7CisJCQkgb3Bjb2RlICE9IE5VTEw7CisJCQkgb3Bjb2RlID0gb3Bjb2RlLT5wYXJlbnQpCisJCSAgICAgIHsKKwkJCWlmIChvcGNvZGUtPndvcmRfbnIgPT0gd29yZF9ucgorCQkJICAgICYmIG9wY29kZS0+Zmlyc3QgPD0gYml0X25yCisJCQkgICAgJiYgb3Bjb2RlLT5sYXN0ID49IGJpdF9ucikKKwkJCSAgLyogd2UndmUgZGVjb2RlZCBvbiB0aGlzIGJpdCAqLworCQkJICBicmVhazsKKwkJICAgICAgfQorCQkgICAgaWYgKG9wY29kZSA9PSBOVUxMKQorCQkgICAgICAvKiB0aGUgYml0IHdhc24ndCBkZWNvZGVkIG9uICovCisJCSAgICAgIGJyZWFrOworCQkgIH0KKwkJaWYgKGVudHJ5ID09IE5VTEwpCisJCSAgLyogYWxsIHRoZSBvcGNvZGUgcGF0aHMgZGVjb2RlZCBvbiBCSVRfTlIsIG5vIG5lZWQKKyAgICAgICAgICAgICAgICAgICAgIHRvIGNoZWNrIGl0ICovCisJCSAgY29udGludWU7CisJICAgICAgfQorCSAgICAKKwkgICAgY2hlY2tfbWFzayB8PSAxOworCSAgICBjaGVja192YWwgfD0gYml0LT52YWx1ZTsKKwkgIH0KKwkKKwkvKiBpZiBhbnkgYml0cyBub3QgY2hlY2tlZCBieSBvcGNvZGUgdGFibGVzLCBvdXRwdXQgY29kZSB0byBjaGVjayB0aGVtICovCisJaWYgKGNoZWNrX21hc2spCisJICB7CisJICAgIGlmIChucl9jaGVja3MgPT0gMCkKKwkgICAgICB7CisJCWxmX3ByaW50ZiAoZmlsZSwgImlmIChXSVRIX1JFU0VSVkVEX0JJVFMpXG4iKTsKKwkJbGZfcHJpbnRmIChmaWxlLCAiICB7XG4iKTsKKwkJbGZfaW5kZW50IChmaWxlLCArNCk7CisJICAgICAgfQorCSAgICBucl9jaGVja3MgKys7CisJICAgIGlmIChvcHRpb25zLmluc25fYml0X3NpemUgPiAzMikKKwkgICAgICB7CisJCWxmX3ByaW50ZiAoZmlsZSwgImlmICgoaW5zdHJ1Y3Rpb25fJWRcbiIsIHdvcmRfbnIpOyAKKwkJbGZfcHJpbnRmIChmaWxlLCAiICAgICAmIFVOU0lHTkVENjQgKDB4JTA4bHglMDhseCkpXG4iLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpKGNoZWNrX21hc2sgPj4gMzIpLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpKGNoZWNrX21hc2spKTsKKwkJbGZfcHJpbnRmIChmaWxlLCAiICAgICE9IFVOU0lHTkVENjQgKDB4JTA4bHglMDhseCkpXG4iLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpKGNoZWNrX3ZhbCA+PiAzMiksCisJCQkgICAodW5zaWduZWQgbG9uZykoY2hlY2tfdmFsKSk7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlsZl9wcmludGYgKGZpbGUsICJpZiAoKGluc3RydWN0aW9uXyVkICYgMHglMDhseCkgIT0gMHglMDhseClcbiIsCisJCQkgICB3b3JkX25yLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpKGNoZWNrX21hc2spLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpKGNoZWNrX3ZhbCkpOworCSAgICAgIH0KKwkgICAgbGZfaW5kZW50IChmaWxlLCArMik7CisJICAgIHByaW50X2lkZWNvZGVfaW52YWxpZCAoZmlsZSwgInJldHVybiIsIGludmFsaWRfaWxsZWdhbCk7CisJICAgIGxmX2luZGVudCAoZmlsZSwgLTIpOworCSAgfQorICAgICAgfQorICAgIGlmIChucl9jaGVja3MgPiAwKQorICAgICAgeworCWxmX2luZGVudCAoZmlsZSwgLTQpOworCWxmX3ByaW50ZiAoZmlsZSwgIiAgfVxuIik7CisgICAgICB9CisgICAgbGZfaW5kZW50X3N1cHByZXNzKGZpbGUpOworICAgIGxmX3ByaW50ZiAoZmlsZSwgIiNlbmRpZlxuIik7CisgIH0KKworICAvKiBWYWxpZGF0ZTogRmxvYXRpbmcgUG9pbnQgaGFyZHdhcmUKKyAgICAgCisgICAgIElmIHRoZSBzaW11bGF0b3IgaXMgYmVpbmcgYnVpbHQgd2l0aCBvdXQgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUKKyAgICAgKGRpZmZlcmVudCB0byBpdCBiZWluZyBkaXNhYmxlZCBpbiB0aGUgTVNSKSB0aGVuIGZsb2F0aW5nIHBvaW50CisgICAgIGluc3RydWN0aW9ucyBhcmUgaW52YWxpZCAqLworICB7CisgICAgaWYgKGZpbHRlcl9pc19tZW1iZXIgKGluc3RydWN0aW9uLT5mbGFncywgImYiKSkKKyAgICAgIHsKKwlsZl9wcmludGYgKGZpbGUsICJcbiIpOworCWxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7CisJbGZfcHJpbnRmIChmaWxlLCAiI2lmIGRlZmluZWQoQ1VSUkVOVF9GTE9BVElOR19QT0lOVClcbiIpOworCWxmX3ByaW50ZiAoZmlsZSwgIi8qIFZhbGlkYXRlOiBGUCBoYXJkd2FyZSBleGlzdHMgKi9cbiIpOworCWxmX3ByaW50ZiAoZmlsZSwgImlmIChDVVJSRU5UX0ZMT0FUSU5HX1BPSU5UICE9IEhBUkRfRkxPQVRJTkdfUE9JTlQpIHtcbiIpOworCWxmX2luZGVudCAoZmlsZSwgKzIpOworCXByaW50X2lkZWNvZGVfaW52YWxpZCAoZmlsZSwgInJldHVybiIsIGludmFsaWRfaWxsZWdhbCk7CisJbGZfaW5kZW50IChmaWxlLCAtMik7CisJbGZfcHJpbnRmIChmaWxlLCAifVxuIik7CisJbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKKwlsZl9wcmludGYgKGZpbGUsICIjZW5kaWZcbiIpOworICAgICAgfQorICB9CisKKyAgLyogVmFsaWRhdGU6IEZsb2F0aW5nIFBvaW50IGF2YWlsYWJsZQorCisgICAgIElmIGZsb2F0aW5nIHBvaW50IGlzIG5vdCBhdmFpbGFibGUsIHdlIGVudGVyIGEgZmxvYXRpbmcgcG9pbnQKKyAgICAgdW5hdmFpbGFibGUgaW50ZXJydXB0IGludG8gdGhlIGNhY2hlIGluc3RlYWQgb2YgdGhlIGluc3RydWN0aW9uCisgICAgIHByb3Blci4KKworICAgICBUaGUgUG93ZXJQQyBzcGVjIHJlcXVpcmVzIGEgQ1NJIGFmdGVyIE1TUltGUF0gaXMgY2hhbmdlZCBhbmQgd2hlbgorICAgICBldmVyIGEgQ1NJIG9jY3VyZXMgd2UgZmx1c2ggdGhlIGluc3RydWN0aW9uIGNhY2hlLiAqLworCisgIHsKKyAgICBpZiAoZmlsdGVyX2lzX21lbWJlciAoaW5zdHJ1Y3Rpb24tPmZsYWdzLCAiZiIpKQorICAgICAgeworCWxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisJbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKKwlsZl9wcmludGYgKGZpbGUsICIjaWYgZGVmaW5lZChJU19GUF9BVkFJTEFCTEUpXG4iKTsKKwlsZl9wcmludGYgKGZpbGUsICIvKiBWYWxpZGF0ZTogRlAgYXZhaWxhYmxlIGFjY29yZGluZyB0byBjcHUgKi9cbiIpOworCWxmX3ByaW50ZiAoZmlsZSwgImlmICghSVNfRlBfQVZBSUxBQkxFKSB7XG4iKTsKKwlsZl9pbmRlbnQgKGZpbGUsICsyKTsKKwlwcmludF9pZGVjb2RlX2ludmFsaWQgKGZpbGUsICJyZXR1cm4iLCAgaW52YWxpZF9mcF91bmF2YWlsYWJsZSk7CisJbGZfaW5kZW50IChmaWxlLCAtMik7CisJbGZfcHJpbnRmIChmaWxlLCAifVxuIik7CisJbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKKwlsZl9wcmludGYgKGZpbGUsICIjZW5kaWZcbiIpOworICAgICAgfQorICB9CisgIAorICAvKiBWYWxpZGF0ZTogVmFsaWRhdGUgSW5zdHJ1Y3Rpb24gaW4gY29ycmVjdCBzbG90CisKKyAgICAgU29tZSBhcmNoaXRlY3R1cmVzIHBsYWNlIHJlc3RyaWN0aW9ucyBvbiB0aGUgc2xvdCB0aGF0IGFuCisgICAgIGluc3RydWN0aW9uIGNhbiBiZSBpc3N1ZWQgaW4gKi8KKworICB7CisgICAgaWYgKGZpbHRlcl9pc19tZW1iZXIgKGluc3RydWN0aW9uLT5vcHRpb25zLCAicyIpCisJfHwgb3B0aW9ucy5nZW4uc2xvdF92ZXJpZmljYXRpb24pCisgICAgICB7CisJbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKwlsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOworCWxmX3ByaW50ZiAoZmlsZSwgIiNpZiBkZWZpbmVkKElTX1dST05HX1NMT1QpXG4iKTsKKwlsZl9wcmludGYgKGZpbGUsICIvKiBWYWxpZGF0ZTogSW5zdHJ1Y3Rpb24gaXNzdWVkIGluIGNvcnJlY3Qgc2xvdCAqL1xuIik7CisJbGZfcHJpbnRmIChmaWxlLCAiaWYgKElTX1dST05HX1NMT1QpIHtcbiIpOworCWxmX2luZGVudCAoZmlsZSwgKzIpOworCXByaW50X2lkZWNvZGVfaW52YWxpZCAoZmlsZSwgInJldHVybiIsIGludmFsaWRfd3Jvbmdfc2xvdCk7CisJbGZfaW5kZW50IChmaWxlLCAtMik7CisJbGZfcHJpbnRmIChmaWxlLCAifVxuIik7CisJbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKKwlsZl9wcmludGYgKGZpbGUsICIjZW5kaWZcbiIpOworICAgICAgfQorICB9CisgIAorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3ZvaWQKK3ByaW50X2lkZWNvZGVfaXNzdWVfZnVuY3Rpb25faGVhZGVyIChsZiAqZmlsZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKnByb2Nlc3NvciwKKwkJCQkgICAgIGZ1bmN0aW9uX2RlY2xfdHlwZSBkZWNsX3R5cGUsCisJCQkJICAgICBpbnQgbnJfcHJlZmV0Y2hlZF93b3JkcykKK3sKKyAgaW50IGluZGVudDsKKyAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgc3dpdGNoIChkZWNsX3R5cGUpCisgICAgeworICAgIGNhc2UgaXNfZnVuY3Rpb25fZGVjbGFyYXRpb246CisgICAgICBsZl9wcmludF9fZnVuY3Rpb25fdHlwZV9mdW5jdGlvbiAoZmlsZSwgcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fdHlwZSwKKwkJCQkJIklOTElORV9JREVDT0RFIiwKKwkJCQkJIiAiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgaXNfZnVuY3Rpb25fZGVmaW5pdGlvbjoKKyAgICAgIGxmX3ByaW50X19mdW5jdGlvbl90eXBlX2Z1bmN0aW9uIChmaWxlLCBwcmludF9zZW1hbnRpY19mdW5jdGlvbl90eXBlLAorCQkJCQkiSU5MSU5FX0lERUNPREUiLAorCQkJCQkiXG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgaXNfZnVuY3Rpb25fdmFyaWFibGU6CisgICAgICBwcmludF9zZW1hbnRpY19mdW5jdGlvbl90eXBlIChmaWxlKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiAoKiIpOworICAgICAgYnJlYWs7CisgICAgfQorICBpbmRlbnQgPSBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAorCQkJCSJpc3N1ZSIsCisJCQkJTlVMTCwKKwkJCQlwcm9jZXNzb3IsCisJCQkJTlVMTCwKKwkJCQlmdW5jdGlvbl9uYW1lX3ByZWZpeF9pZGVjb2RlKTsKKyAgc3dpdGNoIChkZWNsX3R5cGUpCisgICAgeworICAgIGNhc2UgaXNfZnVuY3Rpb25fZGVmaW5pdGlvbjoKKyAgICAgIGluZGVudCArPSBsZl9wcmludGYgKGZpbGUsICIgKCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBpc19mdW5jdGlvbl9kZWNsYXJhdGlvbjoKKyAgICAgIGxmX3B1dHN0ciAoZmlsZSwgIlxuKCIpOworICAgICAgaW5kZW50ID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgaXNfZnVuY3Rpb25fdmFyaWFibGU6CisgICAgICBsZl9wdXRzdHIgKGZpbGUsICIpXG4oIik7CisgICAgICBpbmRlbnQgPSAxOworICAgICAgYnJlYWs7CisgICAgfQorICBsZl9pbmRlbnQgKGZpbGUsICtpbmRlbnQpOworICBwcmludF9zZW1hbnRpY19mdW5jdGlvbl9mb3JtYWwgKGZpbGUsIG5yX3ByZWZldGNoZWRfd29yZHMpOworICBsZl9wdXRzdHIgKGZpbGUsICIpIik7CisgIGxmX2luZGVudCAoZmlsZSwgLWluZGVudCk7CisgIHN3aXRjaCAoZGVjbF90eXBlKQorICAgIHsKKyAgICBjYXNlIGlzX2Z1bmN0aW9uX2RlZmluaXRpb246CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBpc19mdW5jdGlvbl9kZWNsYXJhdGlvbjoKKyAgICBjYXNlIGlzX2Z1bmN0aW9uX3ZhcmlhYmxlOgorICAgICAgbGZfcHV0c3RyIChmaWxlLCAiO1xuIik7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKworCit2b2lkCitwcmludF9pZGVjb2RlX2dsb2JhbHMgKGxmICpmaWxlKQoreworICBsZl9wcmludGYgKGZpbGUsICJlbnVtIHtcbiIpOworICBsZl9wcmludGYgKGZpbGUsICIgIC8qIGdyZWF0ZXIgb3IgZXF1YWwgdG8gemVybyA9PiB0YWJsZSAqL1xuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiAgZnVuY3Rpb25fZW50cnkgPSAtMSxcbiIpOworICBsZl9wcmludGYgKGZpbGUsICIgIGJvb2xlYW5fZW50cnkgPSAtMixcbiIpOworICBsZl9wcmludGYgKGZpbGUsICJ9O1xuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgInR5cGVkZWYgc3RydWN0IF9pZGVjb2RlX3RhYmxlX2VudHJ5IHtcbiIpOworICBsZl9wcmludGYgKGZpbGUsICIgIGludCBzaGlmdDtcbiIpOworICBsZl9wcmludGYgKGZpbGUsICIgIHVuc2lnbmVkJWQgbWFzaztcbiIsIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiAgdW5zaWduZWQlZCB2YWx1ZTtcbiIsIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiAgdm9pZCAqZnVuY3Rpb25fb3JfdGFibGU7XG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAifSBpZGVjb2RlX3RhYmxlX2VudHJ5O1xuIik7Cit9CmRpZmYgLS1naXQgYS9zaW0vaWdlbi9nZW4taWRlY29kZS5oIGIvc2ltL2lnZW4vZ2VuLWlkZWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjYwOTA0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2lnZW4vZ2VuLWlkZWNvZGUuaApAQCAtMCwwICsxLDUwIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKwordm9pZCBwcmludF9pZGVjb2RlX2lzc3VlX2Z1bmN0aW9uX2hlYWRlcgorKGxmICpmaWxlLAorIGNvbnN0IGNoYXIgKnByb2Nlc3NvciwKKyBmdW5jdGlvbl9kZWNsX3R5cGUgZGVjbF90eXBlLAorIGludCBucl9wcmVmZXRjaGVkX3dvcmRzKTsKKwordm9pZCBwcmludF9pZGVjb2RlX2dsb2JhbHMKKyhsZiAqZmlsZSk7CisKK3ZvaWQgcHJpbnRfaWRlY29kZV9sb29rdXBzCisobGYgKmZpbGUsCisgZ2VuX2VudHJ5ICp0YWJsZSwKKyBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZXMpOworCit2b2lkIHByaW50X2lkZWNvZGVfYm9keQorKGxmICpmaWxlLAorIGdlbl9lbnRyeSAqdGFibGUsCisgY29uc3QgY2hhciAqcmVzdWx0KTsKKworCisKKy8qIE91dHB1dCBjb2RlIHRvIGRvIGFueSBmaW5hbCBjaGVja3Mgb24gdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24uCisgICBUaGlzIGluY2x1ZGVzIHRoaW5ncyBsaWtlIHZlcmlmeWluZyBhbnkgb24gZGVjb2RlZCBmaWVsZHMgaGF2ZSB0aGUKKyAgIGNvcnJlY3QgdmFsdWUgYW5kIGNoZWNraW5nIHRoYXQgKGZvciBmbG9hdGluZyBwb2ludCkgZmxvYXRpbmcgcG9pbnQKKyAgIGhhcmR3YXJlIGlzbid0IGRpc2FibGVkICovCisKK2V4dGVybiB2b2lkIHByaW50X2lkZWNvZGVfdmFsaWRhdGUKKyhsZiAqZmlsZSwKKyBpbnNuX2VudHJ5ICppbnN0cnVjdGlvbiwKKyBpbnNuX29wY29kZXMgKm9wY29kZV9wYXRocyk7CmRpZmYgLS1naXQgYS9zaW0vaWdlbi9nZW4taXRhYmxlLmMgYi9zaW0vaWdlbi9nZW4taXRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlOTA1MwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9pZ2VuL2dlbi1pdGFibGUuYwpAQCAtMCwwICsxLDMxNyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgImxmLmgiCisjaW5jbHVkZSAidGFibGUuaCIKKyNpbmNsdWRlICJmaWx0ZXIuaCIKKyNpbmNsdWRlICJpZ2VuLmgiCisKKyNpbmNsdWRlICJsZC1pbnNuLmgiCisjaW5jbHVkZSAibGQtZGVjb2RlLmgiCisKKyNpbmNsdWRlICJnZW4uaCIKKworI2luY2x1ZGUgImdlbi1pdGFibGUuaCIKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgMAorI2VuZGlmCisKKworCit0eXBlZGVmIHN0cnVjdCBfaXRhYmxlX2luZm8geworICBpbnQgc2l6ZW9mX2Zvcm07CisgIGludCBzaXplb2ZfbmFtZTsKKyAgaW50IHNpemVvZl9maWxlOworfSBpdGFibGVfaW5mbzsKKworCitzdGF0aWMgdm9pZAoraXRhYmxlX2hfaW5zbiAobGYgKmZpbGUsCisJICAgICAgIGluc25fdGFibGUgKmVudHJ5LAorCSAgICAgICBpbnNuX2VudHJ5ICppbnN0cnVjdGlvbiwKKwkgICAgICAgdm9pZCAqZGF0YSkKK3sKKyAgaW50IGxlbjsKKyAgaXRhYmxlX2luZm8gKmluZm8gPSBkYXRhOworICBsZl9wcmludF9fbGluZV9yZWYgKGZpbGUsIGluc3RydWN0aW9uLT5saW5lKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiICAiKTsKKyAgcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKKwkJICAgICAgIGluc3RydWN0aW9uLT5uYW1lLAorCQkgICAgICAgaW5zdHJ1Y3Rpb24tPmZvcm1hdF9uYW1lLAorCQkgICAgICAgTlVMTCwKKwkJICAgICAgIE5VTEwsCisJCSAgICAgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pdGFibGUpOworICBsZl9wcmludGYgKGZpbGUsICIsXG4iKTsKKyAgLyogdXBkYXRlIHN1bW1hcnkgaW5mbyAqLworICBsZW4gPSBzdHJsZW4gKGluc3RydWN0aW9uLT5mb3JtYXRfbmFtZSk7CisgIGlmIChpbmZvLT5zaXplb2ZfZm9ybSA8PSBsZW4pCisgICAgaW5mby0+c2l6ZW9mX2Zvcm0gPSBsZW4gKyAxOworICBsZW4gPSBzdHJsZW4gKGluc3RydWN0aW9uLT5uYW1lKTsKKyAgaWYgKGluZm8tPnNpemVvZl9uYW1lIDw9IGxlbikKKyAgICBpbmZvLT5zaXplb2ZfbmFtZSA9IGxlbiArIDE7CisgIGxlbiA9IHN0cmxlbiAoZmlsdGVyX2ZpbGVuYW1lIChpbnN0cnVjdGlvbi0+bGluZS0+ZmlsZV9uYW1lKSk7CisgIGlmIChpbmZvLT5zaXplb2ZfZmlsZSA8PSBsZW4pCisgICAgaW5mby0+c2l6ZW9mX2ZpbGUgPSBsZW4gKyAxOworfQorCisKKy8qIHByaW50IHRoZSBsaXN0IG9mIGFsbCB0aGUgZGlmZmVyZW50IG9wdGlvbnMgKi8KKworc3RhdGljIHZvaWQKK2l0YWJsZV9wcmludF9lbnVtIChsZiAqZmlsZSwKKwkJICAgZmlsdGVyICpzZXQsCisJCSAgIGNoYXIgKm5hbWUpCit7CisgIGNoYXIgKmVsZW07CisgIGxmX3ByaW50ZiAoZmlsZSwgInR5cGVkZWYgZW51bSB7XG4iKTsKKyAgbGZfaW5kZW50IChmaWxlLCArMik7CisgIGZvciAoZWxlbSA9IGZpbHRlcl9uZXh0IChzZXQsICIiKTsKKyAgICAgICBlbGVtICE9IE5VTEw7CisgICAgICAgZWxlbSA9IGZpbHRlcl9uZXh0IChzZXQsIGVsZW0pKQorICAgIHsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzaXRhYmxlXyVzXyVzLFxuIiwKKwkJIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCwgbmFtZSwgZWxlbSk7CisgICAgICBpZiAoc3RybGVuIChvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpID4gMCkKKwl7CisJICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOworCSAgbGZfcHJpbnRmIChmaWxlLCAiI2RlZmluZSBpdGFibGVfJXNfJXMgJXNpdGFibGVfJXNfJXNcbiIsCisJCSAgICAgbmFtZSwgZWxlbSwgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sLCBuYW1lLCBlbGVtKTsKKwl9CisgICAgfQorICBsZl9wcmludGYgKGZpbGUsICJucl8lc2l0YWJsZV8lc3MsXG4iLCBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwsIG5hbWUpOworICAKKyAgbGZfaW5kZW50IChmaWxlLCAtMik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIn0gJXNpdGFibGVfJXNzO1xuIiwgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sLCBuYW1lKTsKKyAgaWYgKHN0cmxlbiAob3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sKSA+IDApCisgICAgeworICAgICAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiNkZWZpbmUgaXRhYmxlXyVzcyAlc2l0YWJsZV8lc3NcbiIsCisJCSBuYW1lLCBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwsIG5hbWUpOworICAgICAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiNkZWZpbmUgbnJfaXRhYmxlXyVzcyBucl8lc2l0YWJsZV8lc3NcbiIsCisJCSBuYW1lLCBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwsIG5hbWUpOworICAgIH0KK30KKworLyogcHJpbnQgYW4gYXJyYXkgb2YgdGhlIG9wdGlvbiBuYW1lcyBhcyBzdHJpbmdzICovCisKK3N0YXRpYyB2b2lkCitpdGFibGVfcHJpbnRfbmFtZXMgKGxmICpmaWxlLAorCQkgICAgZmlsdGVyICpzZXQsCisJCSAgICBjaGFyICpuYW1lKQoreworICBjaGFyICplbGVtOworICBsZl9wcmludGYgKGZpbGUsICJjb25zdCBjaGFyIColc2l0YWJsZV8lc19uYW1lc1tucl8lc2l0YWJsZV8lc3MgKyAxXSA9IHtcbiIsCisJICAgICBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwsIG5hbWUsCisJICAgICBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwsIG5hbWUpOworICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKKyAgZm9yIChlbGVtID0gZmlsdGVyX25leHQgKHNldCwgIiIpOworICAgICAgIGVsZW0gIT0gTlVMTDsKKyAgICAgICBlbGVtID0gZmlsdGVyX25leHQgKHNldCwgZWxlbSkpCisgICAgeworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXCIlc1wiLFxuIiwgZWxlbSk7CisgICAgfQorICBsZl9wcmludGYgKGZpbGUsICIwLFxuIik7CisgIGxmX2luZGVudCAoZmlsZSwgLTIpOworICBsZl9wcmludGYgKGZpbGUsICJ9O1xuIik7Cit9CisKK2V4dGVybiB2b2lkIAorZ2VuX2l0YWJsZV9oIChsZiAqZmlsZSwKKwkgICAgICBpbnNuX3RhYmxlICppc2EpCit7CisgIGl0YWJsZV9pbmZvICppbmZvID0gWkFMTE9DIChpdGFibGVfaW5mbyk7CisKKyAgLyogb3V0cHV0IGFuIGVudW1lcmF0ZWQgdHlwZSBmb3IgZWFjaCBpbnN0cnVjdGlvbiAqLworICBsZl9wcmludGYgKGZpbGUsICJ0eXBlZGVmIGVudW0ge1xuIik7CisgIGluc25fdGFibGVfdHJhdmVyc2VfaW5zbiAoZmlsZSwgaXNhLCBpdGFibGVfaF9pbnNuLCBpbmZvKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiICBucl8lc2l0YWJsZV9lbnRyaWVzLFxuIiwgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAifSAlc2l0YWJsZV9pbmRleDtcbiIsIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisKKyAgLyogb3V0cHV0IGFuIGVudW1lcmF0aW9uIHR5cGUgZm9yIGVhY2ggZmxhZyAqLworICBpdGFibGVfcHJpbnRfZW51bSAoZmlsZSwgaXNhLT5mbGFncywgImZsYWciKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiZXh0ZXJuIGNvbnN0IGNoYXIgKiVzaXRhYmxlX2ZsYWdfbmFtZXNbXTtcbiIsCisJICAgICBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpOworICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICAgIAorICAvKiBvdXRwdXQgYW4gZW51bWVyYXRpb24gb2YgYWxsIHRoZSBwb3NzaWJsZSBvcHRpb25zICovCisgIGl0YWJsZV9wcmludF9lbnVtIChmaWxlLCBpc2EtPm9wdGlvbnMsICJvcHRpb24iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiZXh0ZXJuIGNvbnN0IGNoYXIgKiVzaXRhYmxlX29wdGlvbl9uYW1lc1tdO1xuIiwKKwkgICAgIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisKKyAgLyogb3V0cHV0IGFuIGVudW1lcmF0aW9uIG9mIGFsbCB0aGUgcHJvY2Vzc29yIG1vZGVscyAqLworICBpdGFibGVfcHJpbnRfZW51bSAoZmlsZSwgaXNhLT5tb2RlbC0+cHJvY2Vzc29ycywgInByb2Nlc3NvciIpOworICBsZl9wcmludGYgKGZpbGUsICJleHRlcm4gY29uc3QgY2hhciAqJXNpdGFibGVfcHJvY2Vzc29yX25hbWVzW107XG4iLAorCSAgICAgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKworICAvKiBvdXRwdXQgdGhlIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIGFjdHVhbCBpbnN0cnVjdGlvbiBpbmZvICovCisgIGxmX3ByaW50ZiAoZmlsZSwgInR5cGVkZWYgc3RydWN0IF8lc2l0YWJsZV9pbnN0cnVjdGlvbl9pbmZvIHtcbiIsCisJICAgICBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpOworICBsZl9wcmludGYgKGZpbGUsICIgICVzaXRhYmxlX2luZGV4IG5yO1xuIiwgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiICBjaGFyICpmb3JtYXQ7XG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiICBjaGFyICpmb3JtO1xuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiAgY2hhciAqZmxhZ3M7XG4iKTsKKworICAvKiBucl9pdGFibGVfKiBtYXkgYmUgemVybywgc28gd2UgYWRkIDEgdG8gYXZvaWQgYW4KKyAgICAgaWxsZWdhbCB6ZXJvLXNpemVkIGFycmF5LiAqLworICBsZl9wcmludGYgKGZpbGUsICIgIGNoYXIgZmxhZ1tucl8lc2l0YWJsZV9mbGFncyArIDFdO1xuIiwKKwkgICAgIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiAgY2hhciAqb3B0aW9ucztcbiIpOworICBsZl9wcmludGYgKGZpbGUsICIgIGNoYXIgb3B0aW9uW25yXyVzaXRhYmxlX29wdGlvbnMgKyAxXTtcbiIsCisJICAgICBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpOworICBsZl9wcmludGYgKGZpbGUsICIgIGNoYXIgKnByb2Nlc3NvcnM7XG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiICBjaGFyIHByb2Nlc3Nvcltucl8lc2l0YWJsZV9wcm9jZXNzb3JzICsgMV07XG4iLAorCSAgICAgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiICBjaGFyICpuYW1lO1xuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiAgY2hhciAqZmlsZTtcbiIpOworICBsZl9wcmludGYgKGZpbGUsICIgIGludCBsaW5lX25yO1xuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIn0gJXNpdGFibGVfaW5mbztcbiIsIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgImV4dGVybiAlc2l0YWJsZV9pbmZvICVzaXRhYmxlW25yXyVzaXRhYmxlX2VudHJpZXNdO1xuIiwKKwkgICAgIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCwgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sLAorCSAgICAgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sKTsKKyAgaWYgKHN0cmxlbiAob3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sKSA+IDApCisgICAgeworICAgICAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiNkZWZpbmUgaXRhYmxlICVzaXRhYmxlXG4iLAorCQkgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sKTsKKyAgICB9CisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisKKyAgLyogb3V0cHV0IGFuIGVudW0gZGVmaW5pbmcgdGhlIG1heCBzaXplIG9mIHZhcmlvdXMgaXRhYmxlIG1lbWJlcnMgKi8KKyAgbGZfcHJpbnRmIChmaWxlLCAiZW51bSB7XG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiICBzaXplb2ZfJXNpdGFibGVfZm9ybSA9ICVkLFxuIiwKKwkgICAgIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgubCwgaW5mby0+c2l6ZW9mX2Zvcm0pOworICBsZl9wcmludGYgKGZpbGUsICIgIHNpemVvZl8lc2l0YWJsZV9uYW1lID0gJWQsXG4iLAorCSAgICAgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sLCBpbmZvLT5zaXplb2ZfbmFtZSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiAgc2l6ZW9mXyVzaXRhYmxlX2ZpbGUgPSAlZCxcbiIsCisJICAgICBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwsIGluZm8tPnNpemVvZl9maWxlKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAifTtcbiIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAoraXRhYmxlX3ByaW50X3NldCAobGYgKmZpbGUsCisJCSAgZmlsdGVyICpzZXQsCisJCSAgZmlsdGVyICptZW1iZXJzKQoreworICBjaGFyICplbGVtOworICBsZl9wcmludGYgKGZpbGUsICJcIiIpOworICBlbGVtID0gZmlsdGVyX25leHQgKG1lbWJlcnMsICIiKTsKKyAgaWYgKGVsZW0gIT0gTlVMTCkKKyAgICB7CisgICAgICB3aGlsZSAoMSkKKwl7CisJICBsZl9wcmludGYgKGZpbGUsICIlcyIsIGVsZW0pOworCSAgZWxlbSA9IGZpbHRlcl9uZXh0IChtZW1iZXJzLCBlbGVtKTsKKwkgIGlmIChlbGVtID09IE5VTEwpCisJICAgIGJyZWFrOworCSAgbGZfcHJpbnRmIChmaWxlLCAiLCIpOworCX0KKyAgICB9CisgIGxmX3ByaW50ZiAoZmlsZSwgIlwiLFxuIik7CisKKyAgbGZfcHJpbnRmKGZpbGUsICJ7Iik7CisgIGZvciAoZWxlbSA9IGZpbHRlcl9uZXh0IChzZXQsICIiKTsKKyAgICAgICBlbGVtICE9IE5VTEw7CisgICAgICAgZWxlbSA9IGZpbHRlcl9uZXh0IChzZXQsIGVsZW0pKQorICAgIHsKKyAgICAgIGlmIChmaWx0ZXJfaXNfbWVtYmVyIChtZW1iZXJzLCBlbGVtKSkKKwl7CisJICBsZl9wcmludGYgKGZpbGUsICIgMSwiKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbGZfcHJpbnRmIChmaWxlLCAiIDAsIik7CisJfQorICAgICAgCisgICAgfQorICAvKiBhbHdheXMgcHJpbnQgYSBkdW1teSBlbGVtZW50LCB0byBhdm9pZCBlbXB0eSBpbml0aWFsaXplcnMuICovCisgIGxmX3ByaW50ZihmaWxlLCAiIDk5IH0sXG4iKTsKK30KKworCitzdGF0aWMgdm9pZAoraXRhYmxlX2NfaW5zbiAobGYgKmZpbGUsCisJICAgICAgIGluc25fdGFibGUgKmlzYSwKKwkgICAgICAgaW5zbl9lbnRyeSAqaW5zdHJ1Y3Rpb24sCisJICAgICAgIHZvaWQgKmRhdGEpCit7CisgIGxmX3ByaW50ZiAoZmlsZSwgInsgIik7CisgIGxmX2luZGVudCAoZmlsZSwgKzIpOworICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAorCQkgICAgICAgaW5zdHJ1Y3Rpb24tPm5hbWUsCisJCSAgICAgICBpbnN0cnVjdGlvbi0+Zm9ybWF0X25hbWUsCisJCSAgICAgICBOVUxMLAorCQkgICAgICAgTlVMTCwKKwkJICAgICAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X2l0YWJsZSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIixcbiIpOworICBsZl9wcmludGYgKGZpbGUsICJcIiIpOworICBwcmludF9pbnNuX3dvcmRzIChmaWxlLCBpbnN0cnVjdGlvbik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlwiLFxuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlwiJXNcIixcbiIsIGluc3RydWN0aW9uLT5mb3JtYXRfbmFtZSk7CisKKyAgaXRhYmxlX3ByaW50X3NldCAoZmlsZSwgaXNhLT5mbGFncywgaW5zdHJ1Y3Rpb24tPmZsYWdzKTsKKyAgaXRhYmxlX3ByaW50X3NldCAoZmlsZSwgaXNhLT5vcHRpb25zLCBpbnN0cnVjdGlvbi0+b3B0aW9ucyk7CisgIGl0YWJsZV9wcmludF9zZXQgKGZpbGUsIGlzYS0+bW9kZWwtPnByb2Nlc3NvcnMsIGluc3RydWN0aW9uLT5wcm9jZXNzb3JzKTsKKworICBsZl9wcmludGYoZmlsZSwgIlwiJXNcIixcbiIsIGluc3RydWN0aW9uLT5uYW1lKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcIiVzXCIsXG4iLAorCSAgICBmaWx0ZXJfZmlsZW5hbWUgKGluc3RydWN0aW9uLT5saW5lLT5maWxlX25hbWUpKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIlZCxcbiIsIGluc3RydWN0aW9uLT5saW5lLT5saW5lX25yKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJ9LFxuIik7CisgIGxmX2luZGVudCAoZmlsZSwgLTIpOworfQorCisKK2V4dGVybiB2b2lkIAorZ2VuX2l0YWJsZV9jIChsZiAqZmlsZSwKKwkgICAgICBpbnNuX3RhYmxlICppc2EpCit7CisgIC8qIGxlYWRlciAqLworICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwiJXNpdGFibGUuaFwiXG4iLCBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpOworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisKKyAgLyogRklYTUUgLSBvdXRwdXQgbW9kZWwgZGF0YT8/PyAqLworICAvKiBGSVhNRSAtIG91dHB1dCBhc3NlbWJsZXIgZGF0YT8/PyAqLworCisgIC8qIG91dHB1dCB0aGUgZmxhZywgb3B0aW9uIGFuZCBwcm9jZXNzb3IgbmFtZSB0YWJsZXMgKi8KKyAgaXRhYmxlX3ByaW50X25hbWVzIChmaWxlLCBpc2EtPmZsYWdzLCAiZmxhZyIpOworICBpdGFibGVfcHJpbnRfbmFtZXMgKGZpbGUsIGlzYS0+b3B0aW9ucywgIm9wdGlvbiIpOworICBpdGFibGVfcHJpbnRfbmFtZXMgKGZpbGUsIGlzYS0+bW9kZWwtPnByb2Nlc3NvcnMsICJwcm9jZXNzb3IiKTsKKworICAvKiBvdXRwdXQgdGhlIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIGFjdHVhbCBpbnN0cnVjdGlvbiBpbmZvICovCisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzaXRhYmxlX2luZm8gJXNpdGFibGVbbnJfJXNpdGFibGVfZW50cmllc10gPSB7XG4iLAorCSAgICAgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sLAorCSAgICAgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sLAorCSAgICAgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sKTsKKyAgaW5zbl90YWJsZV90cmF2ZXJzZV9pbnNuIChmaWxlLCBpc2EsIGl0YWJsZV9jX2luc24sIE5VTEwpOworCisgIGxmX3ByaW50ZihmaWxlLCAifTtcbiIpOworfQpkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vZ2VuLWl0YWJsZS5oIGIvc2ltL2lnZW4vZ2VuLWl0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2Yzg2NTkKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaWdlbi9nZW4taXRhYmxlLmgKQEAgLTAsMCArMSwzMCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworLyogT3V0cHV0IGEgdGFibGUgb2YgYWxsIHRoZSBpbnN0cnVjdGlvbnMgKi8KKworZXh0ZXJuIHZvaWQgZ2VuX2l0YWJsZV9oCisobGYgKmZpbGUsCisgaW5zbl90YWJsZSAqdGFibGUpOworCitleHRlcm4gdm9pZCBnZW5faXRhYmxlX2MKKyhsZiAqZmlsZSwKKyBpbnNuX3RhYmxlICp0YWJsZSk7CmRpZmYgLS1naXQgYS9zaW0vaWdlbi9nZW4tbW9kZWwuYyBiL3NpbS9pZ2VuL2dlbi1tb2RlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjMwMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaWdlbi9nZW4tbW9kZWwuYwpAQCAtMCwwICsxLDQxNiBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJsZi5oIgorI2luY2x1ZGUgInRhYmxlLmgiCisKKyNpbmNsdWRlICJmaWx0ZXIuaCIKKworI2luY2x1ZGUgImxkLWRlY29kZS5oIgorI2luY2x1ZGUgImxkLWluc24uaCIKKworI2luY2x1ZGUgImdlbi1tb2RlbC5oIgorCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAwCisjZW5kaWYKKworCisjaWYgMAorc3RhdGljIHZvaWQKK21vZGVsX2Nfb3JfaF9kYXRhKGluc25fdGFibGUgKnRhYmxlLAorCQkgIGxmICpmaWxlLAorCQkgIHRhYmxlX2VudHJ5ICpkYXRhKQoreworICBpZiAoZGF0YS0+YW5uZXgpIHsKKyAgICB0YWJsZV9lbnRyeV9wcmludF9jcHBfbGluZV9ucihmaWxlLCBkYXRhLT5hbm5leF9saW5lKTsKKyAgICBsZl9wcmludF9fY19jb2RlKGZpbGUsIGRhdGEtPmFubmV4KTsKKyAgICBsZl9wcmludF9faW50ZXJuYWxfcmVmZXJlbmNlKGZpbGUpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorbW9kZWxfY19vcl9oX2Z1bmN0aW9uKGluc25fdGFibGUgKmVudHJ5LAorCQkgICAgICBsZiAqZmlsZSwKKwkJICAgICAgdGFibGVfZW50cnkgKmZ1bmN0aW9uLAorCQkgICAgICBjaGFyICpwcmVmaXgpCit7CisgIGlmIChmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX3R5cGVdID09IE5VTEwKKyAgICAgIHx8IGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fdHlwZV1bMF0gPT0gJ1wwJykgeworICAgIGVycm9yKCJNb2RlbCBmdW5jdGlvbiB0eXBlIG5vdCBzcGVjaWZpZWQgZm9yICVzIiwgZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl9uYW1lXSk7CisgIH0KKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsIGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fdHlwZV0sIHByZWZpeCwgIiAiKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIlc1xuKCVzKTtcbiIsCisJICAgIGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fbmFtZV0sCisJICAgIGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fcGFyYW1dKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworfQorCit2b2lkIAorZ2VuX21vZGVsX2goaW5zbl90YWJsZSAqdGFibGUsIGxmICpmaWxlKQoreworICBpbnNuICppbnNuX3B0cjsKKyAgbW9kZWwgKm1vZGVsX3B0cjsKKyAgaW5zbiAqbWFjcm87CisgIGNoYXIgKm5hbWU7CisgIGludCBtb2RlbF9jcmVhdGVfcCA9IDA7CisgIGludCBtb2RlbF9pbml0X3AgPSAwOworICBpbnQgbW9kZWxfaGFsdF9wID0gMDsKKyAgaW50IG1vZGVsX21vbl9pbmZvX3AgPSAwOworICBpbnQgbW9kZWxfbW9uX2luZm9fZnJlZV9wID0gMDsKKworICBmb3IobWFjcm8gPSBtb2RlbF9tYWNyb3M7IG1hY3JvOyBtYWNybyA9IG1hY3JvLT5uZXh0KSB7CisgICAgbW9kZWxfY19vcl9oX2RhdGEodGFibGUsIGZpbGUsIG1hY3JvLT5maWxlX2VudHJ5KTsKKyAgfQorCisgIGxmX3ByaW50ZihmaWxlLCAidHlwZWRlZiBlbnVtIF9tb2RlbF9lbnVtIHtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiAgTU9ERUxfTk9ORSxcbiIpOworICBmb3IgKG1vZGVsX3B0ciA9IG1vZGVsczsgbW9kZWxfcHRyOyBtb2RlbF9wdHIgPSBtb2RlbF9wdHItPm5leHQpIHsKKyAgICBsZl9wcmludGYoZmlsZSwgIiAgTU9ERUxfJXMsXG4iLCBtb2RlbF9wdHItPm5hbWUpOworICB9CisgIGxmX3ByaW50ZihmaWxlLCAiICBucl9tb2RlbHNcbiIpOworICBsZl9wcmludGYoZmlsZSwgIn0gbW9kZWxfZW51bTtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisKKyAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lIERFRkFVTFRfTU9ERUwgTU9ERUxfJXNcbiIsIChtb2RlbHMpID8gbW9kZWxzLT5uYW1lIDogIk5PTkUiKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworCisgIGxmX3ByaW50ZihmaWxlLCAidHlwZWRlZiBzdHJ1Y3QgX21vZGVsX2RhdGEgbW9kZWxfZGF0YTtcbiIpOworICBsZl9wcmludGYoZmlsZSwgInR5cGVkZWYgc3RydWN0IF9tb2RlbF90aW1lIG1vZGVsX3RpbWU7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworCisgIGxmX3ByaW50ZihmaWxlLCAiZXh0ZXJuIG1vZGVsX2VudW0gY3VycmVudF9tb2RlbDtcbiIpOworICBsZl9wcmludGYoZmlsZSwgImV4dGVybiBjb25zdCBjaGFyICptb2RlbF9uYW1lWyAoaW50KW5yX21vZGVscyBdO1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0ICpjb25zdCBtb2RlbF9mdW5jX3VuaXRfbmFtZVsgKGludClucl9tb2RlbHMgXTtcbiIpOworICBsZl9wcmludGYoZmlsZSwgImV4dGVybiBjb25zdCBtb2RlbF90aW1lICpjb25zdCBtb2RlbF90aW1lX21hcHBpbmdbIChpbnQpbnJfbW9kZWxzIF07XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworCisgIGZvcihpbnNuX3B0ciA9IG1vZGVsX2Z1bmN0aW9uczsgaW5zbl9wdHI7IGluc25fcHRyID0gaW5zbl9wdHItPm5leHQpIHsKKyAgICBtb2RlbF9jX29yX2hfZnVuY3Rpb24odGFibGUsIGZpbGUsIGluc25fcHRyLT5maWxlX2VudHJ5LCAiSU5MSU5FX01PREVMIik7CisgICAgbmFtZSA9IGluc25fcHRyLT5maWxlX2VudHJ5LT5maWVsZHNbZnVuY3Rpb25fbmFtZV07CisgICAgaWYgKHN0cmNtcCAobmFtZSwgIm1vZGVsX2NyZWF0ZSIpID09IDApCisgICAgICBtb2RlbF9jcmVhdGVfcCA9IDE7CisgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibW9kZWxfaW5pdCIpID09IDApCisgICAgICBtb2RlbF9pbml0X3AgPSAxOworICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1vZGVsX2hhbHQiKSA9PSAwKQorICAgICAgbW9kZWxfaGFsdF9wID0gMTsKKyAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtb2RlbF9tb25faW5mbyIpID09IDApCisgICAgICBtb2RlbF9tb25faW5mb19wID0gMTsKKyAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtb2RlbF9tb25faW5mb19mcmVlIikgPT0gMCkKKyAgICAgIG1vZGVsX21vbl9pbmZvX2ZyZWVfcCA9IDE7CisgIH0KKworICBpZiAoIW1vZGVsX2NyZWF0ZV9wKSB7CisgICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAibW9kZWxfZGF0YSAqIiwgIklOTElORV9NT0RFTCIsICIgIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJtb2RlbF9jcmVhdGVcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiKHNpbV9jcHUgKmNwdSk7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIH0KKworICBpZiAoIW1vZGVsX2luaXRfcCkgeworICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgInZvaWQiLCAiSU5MSU5FX01PREVMIiwgIiAiKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIm1vZGVsX2luaXRcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiKG1vZGVsX2RhdGEgKm1vZGVsX3B0cik7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIH0KKworICBpZiAoIW1vZGVsX2hhbHRfcCkgeworICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgInZvaWQiLCAiSU5MSU5FX01PREVMIiwgIiAiKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIm1vZGVsX2hhbHRcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiKG1vZGVsX2RhdGEgKm1vZGVsX3B0cik7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIH0KKworICBpZiAoIW1vZGVsX21vbl9pbmZvX3ApIHsKKyAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJtb2RlbF9wcmludCAqIiwgIklOTElORV9NT0RFTCIsICIgIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJtb2RlbF9tb25faW5mb1xuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIobW9kZWxfZGF0YSAqbW9kZWxfcHRyKTtcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgfQorCisgIGlmICghbW9kZWxfbW9uX2luZm9fZnJlZV9wKSB7CisgICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAidm9pZCIsICJJTkxJTkVfTU9ERUwiLCAiICIpOworICAgIGxmX3ByaW50ZihmaWxlLCAibW9kZWxfbW9uX2luZm9fZnJlZVxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIobW9kZWxfZGF0YSAqbW9kZWxfcHRyLFxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIgbW9kZWxfcHJpbnQgKmluZm9fcHRyKTtcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgfQorCisgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgInZvaWQiLCAiSU5MSU5FX01PREVMIiwgIiAiKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJtb2RlbF9zZXRcbiIpOworICBsZl9wcmludGYoZmlsZSwgIihjb25zdCBjaGFyICpuYW1lKTtcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX21vZGVsX2NfcGFzc2VkX2RhdGEgbW9kZWxfY19wYXNzZWRfZGF0YTsKK3N0cnVjdCBfbW9kZWxfY19wYXNzZWRfZGF0YSB7CisgIGxmICpmaWxlOworICBtb2RlbCAqbW9kZWxfcHRyOworfTsKKworc3RhdGljIHZvaWQKK21vZGVsX2NfaW5zbihpbnNuX3RhYmxlICplbnRyeSwKKwkgICAgIGxmICpwaG9ueV9maWxlLAorCSAgICAgdm9pZCAqZGF0YSwKKwkgICAgIGluc24gKmluc3RydWN0aW9uLAorCSAgICAgaW50IGRlcHRoKQoreworICBtb2RlbF9jX3Bhc3NlZF9kYXRhICpkYXRhX3B0ciA9IChtb2RlbF9jX3Bhc3NlZF9kYXRhICopZGF0YTsKKyAgbGYgKmZpbGUgPSBkYXRhX3B0ci0+ZmlsZTsKKyAgY2hhciAqY3VycmVudF9uYW1lID0gZGF0YV9wdHItPm1vZGVsX3B0ci0+cHJpbnRhYmxlX25hbWU7CisgIHRhYmxlX21vZGVsX2VudHJ5ICptb2RlbF9wdHIgPSBpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeS0+bW9kZWxfZmlyc3Q7CisKKyAgd2hpbGUgKG1vZGVsX3B0cikgeworICAgIGlmIChtb2RlbF9wdHItPmZpZWxkc1tpbnNuX21vZGVsX25hbWVdID09IGN1cnJlbnRfbmFtZSkgeworICAgICAgbGZfcHJpbnRmKGZpbGUsICIgIHsgJS0qcyB9LCAgLyogJXMgKi9cbiIsCisJCW1heF9tb2RlbF9maWVsZHNfbGVuLAorCQltb2RlbF9wdHItPmZpZWxkc1tpbnNuX21vZGVsX2ZpZWxkc10sCisJCWluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbW9kZWxfcHRyID0gbW9kZWxfcHRyLT5uZXh0OworICB9CisKKyAgbGZfcHJpbnRmKGZpbGUsICIgIHsgJS0qcyB9LCAgLyogJXMgKi9cbiIsCisJICAgIG1heF9tb2RlbF9maWVsZHNfbGVuLAorCSAgICBkYXRhX3B0ci0+bW9kZWxfcHRyLT5pbnNuX2RlZmF1bHQsCisJICAgIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSk7Cit9CisKK3N0YXRpYyB2b2lkCittb2RlbF9jX2Z1bmN0aW9uKGluc25fdGFibGUgKnRhYmxlLAorCQkgbGYgKmZpbGUsCisJCSB0YWJsZV9lbnRyeSAqZnVuY3Rpb24sCisJCSBjb25zdCBjaGFyICpwcmVmaXgpCit7CisgIGlmIChmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX3R5cGVdID09IE5VTEwKKyAgICAgIHx8IGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fdHlwZV1bMF0gPT0gJ1wwJykKKyAgICB7CisgICAgICBlcnJvcigiTW9kZWwgZnVuY3Rpb24gcmV0dXJuIHR5cGUgbm90IHNwZWNpZmllZCBmb3IgJXMiLAorCSAgICBmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX25hbWVdKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgICAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsIGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fdHlwZV0sIHByZWZpeCwgIlxuIik7CisgICAgICBsZl9wcmludGYoZmlsZSwgIiVzKCVzKVxuIiwKKwkJZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl9uYW1lXSwKKwkJZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl9wYXJhbV0pOworICAgIH0KKyAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKKyAgaWYgKGZ1bmN0aW9uLT5hbm5leCkKKyAgICB7CisgICAgICBsZl9pbmRlbnQoZmlsZSwgKzIpOworICAgICAgdGFibGVfZW50cnlfcHJpbnRfY3BwX2xpbmVfbnIoZmlsZSwgZnVuY3Rpb24tPmFubmV4X2xpbmUpOworICAgICAgbGZfcHJpbnRfX2NfY29kZShmaWxlLCBmdW5jdGlvbi0+YW5uZXgpOworICAgICAgbGZfaW5kZW50KGZpbGUsIC0yKTsKKyAgICB9CisgIGxmX3ByaW50ZihmaWxlLCAifVxuIik7CisgIGxmX3ByaW50X19pbnRlcm5hbF9yZWZlcmVuY2UoZmlsZSk7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKK30KKwordm9pZCAKK2dlbl9tb2RlbF9jKGluc25fdGFibGUgKnRhYmxlLCBsZiAqZmlsZSkKK3sKKyAgaW5zbiAqaW5zbl9wdHI7CisgIG1vZGVsICptb2RlbF9wdHI7CisgIGNoYXIgKm5hbWU7CisgIGludCBtb2RlbF9jcmVhdGVfcCA9IDA7CisgIGludCBtb2RlbF9pbml0X3AgPSAwOworICBpbnQgbW9kZWxfaGFsdF9wID0gMDsKKyAgaW50IG1vZGVsX21vbl9pbmZvX3AgPSAwOworICBpbnQgbW9kZWxfbW9uX2luZm9fZnJlZV9wID0gMDsKKworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJjcHUuaFwiXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcIm1vbi5oXCJcbiIpOworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiI2lmZGVmIEhBVkVfU1RETElCX0hcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIDxzdGRsaWIuaD5cbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNlbmRpZlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKworICBmb3IoaW5zbl9wdHIgPSBtb2RlbF9kYXRhOyBpbnNuX3B0cjsgaW5zbl9wdHIgPSBpbnNuX3B0ci0+bmV4dCkgeworICAgIG1vZGVsX2Nfb3JfaF9kYXRhKHRhYmxlLCBmaWxlLCBpbnNuX3B0ci0+ZmlsZV9lbnRyeSk7CisgIH0KKworICBmb3IoaW5zbl9wdHIgPSBtb2RlbF9zdGF0aWM7IGluc25fcHRyOyBpbnNuX3B0ciA9IGluc25fcHRyLT5uZXh0KSB7CisgICAgbW9kZWxfY19vcl9oX2Z1bmN0aW9uKHRhYmxlLCBmaWxlLCBpbnNuX3B0ci0+ZmlsZV9lbnRyeSwgIi8qaCovU1RBVElDIik7CisgIH0KKworICBmb3IoaW5zbl9wdHIgPSBtb2RlbF9pbnRlcm5hbDsgaW5zbl9wdHI7IGluc25fcHRyID0gaW5zbl9wdHItPm5leHQpIHsKKyAgICBtb2RlbF9jX29yX2hfZnVuY3Rpb24odGFibGUsIGZpbGUsIGluc25fcHRyLT5maWxlX2VudHJ5LCAiU1RBVElDX0lOTElORV9NT0RFTCIpOworICB9CisKKyAgZm9yKGluc25fcHRyID0gbW9kZWxfc3RhdGljOyBpbnNuX3B0cjsgaW5zbl9wdHIgPSBpbnNuX3B0ci0+bmV4dCkgeworICAgIG1vZGVsX2NfZnVuY3Rpb24odGFibGUsIGZpbGUsIGluc25fcHRyLT5maWxlX2VudHJ5LCAiLypjKi9TVEFUSUMiKTsKKyAgfQorCisgIGZvcihpbnNuX3B0ciA9IG1vZGVsX2ludGVybmFsOyBpbnNuX3B0cjsgaW5zbl9wdHIgPSBpbnNuX3B0ci0+bmV4dCkgeworICAgIG1vZGVsX2NfZnVuY3Rpb24odGFibGUsIGZpbGUsIGluc25fcHRyLT5maWxlX2VudHJ5LCAiU1RBVElDX0lOTElORV9NT0RFTCIpOworICB9CisKKyAgZm9yKGluc25fcHRyID0gbW9kZWxfZnVuY3Rpb25zOyBpbnNuX3B0cjsgaW5zbl9wdHIgPSBpbnNuX3B0ci0+bmV4dCkgeworICAgIG1vZGVsX2NfZnVuY3Rpb24odGFibGUsIGZpbGUsIGluc25fcHRyLT5maWxlX2VudHJ5LCAiSU5MSU5FX01PREVMIik7CisgICAgbmFtZSA9IGluc25fcHRyLT5maWxlX2VudHJ5LT5maWVsZHNbZnVuY3Rpb25fbmFtZV07CisgICAgaWYgKHN0cmNtcCAobmFtZSwgIm1vZGVsX2NyZWF0ZSIpID09IDApCisgICAgICBtb2RlbF9jcmVhdGVfcCA9IDE7CisgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibW9kZWxfaW5pdCIpID09IDApCisgICAgICBtb2RlbF9pbml0X3AgPSAxOworICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1vZGVsX2hhbHQiKSA9PSAwKQorICAgICAgbW9kZWxfaGFsdF9wID0gMTsKKyAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtb2RlbF9tb25faW5mbyIpID09IDApCisgICAgICBtb2RlbF9tb25faW5mb19wID0gMTsKKyAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtb2RlbF9tb25faW5mb19mcmVlIikgPT0gMCkKKyAgICAgIG1vZGVsX21vbl9pbmZvX2ZyZWVfcCA9IDE7CisgIH0KKworICBpZiAoIW1vZGVsX2NyZWF0ZV9wKSB7CisgICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAibW9kZWxfZGF0YSAqIiwgIklOTElORV9NT0RFTCIsICJcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAibW9kZWxfY3JlYXRlKHNpbV9jcHUgKmNwdSlcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAie1xuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIgIHJldHVybiAobW9kZWxfZGF0YSAqKTA7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgfQorCisgIGlmICghbW9kZWxfaW5pdF9wKSB7CisgICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAidm9pZCIsICJJTkxJTkVfTU9ERUwiLCAiXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIm1vZGVsX2luaXQobW9kZWxfZGF0YSAqbW9kZWxfcHRyKVxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgfQorCisgIGlmICghbW9kZWxfaGFsdF9wKSB7CisgICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAidm9pZCIsICJJTkxJTkVfTU9ERUwiLCAiXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIm1vZGVsX2hhbHQobW9kZWxfZGF0YSAqbW9kZWxfcHRyKVxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgfQorCisgIGlmICghbW9kZWxfbW9uX2luZm9fcCkgeworICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgIm1vZGVsX3ByaW50ICoiLCAiSU5MSU5FX01PREVMIiwgIlxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJtb2RlbF9tb25faW5mbyhtb2RlbF9kYXRhICptb2RlbF9wdHIpXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIntcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiICByZXR1cm4gKG1vZGVsX3ByaW50ICopMDtcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAifVxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICB9CisKKyAgaWYgKCFtb2RlbF9tb25faW5mb19mcmVlX3ApIHsKKyAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJ2b2lkIiwgIklOTElORV9NT0RFTCIsICJcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAibW9kZWxfbW9uX2luZm9fZnJlZShtb2RlbF9kYXRhICptb2RlbF9wdHIsXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiAgICAgICAgICAgICAgICAgICAgbW9kZWxfcHJpbnQgKmluZm9fcHRyKVxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgfQorCisgIGxmX3ByaW50ZihmaWxlLCAiLyogSW5zbiBmdW5jdGlvbmFsIHVuaXQgaW5mbyAqL1xuIik7CisgIGZvcihtb2RlbF9wdHIgPSBtb2RlbHM7IG1vZGVsX3B0cjsgbW9kZWxfcHRyID0gbW9kZWxfcHRyLT5uZXh0KSB7CisgICAgbW9kZWxfY19wYXNzZWRfZGF0YSBkYXRhOworCisgICAgbGZfcHJpbnRmKGZpbGUsICJzdGF0aWMgY29uc3QgbW9kZWxfdGltZSBtb2RlbF90aW1lXyVzW10gPSB7XG4iLCBtb2RlbF9wdHItPm5hbWUpOworICAgIGRhdGEuZmlsZSA9IGZpbGU7CisgICAgZGF0YS5tb2RlbF9wdHIgPSBtb2RlbF9wdHI7CisgICAgaW5zbl90YWJsZV90cmF2ZXJzZV9pbnNuKHRhYmxlLAorCQkJICAgICBOVUxMLCAodm9pZCAqKSZkYXRhLAorCQkJICAgICBtb2RlbF9jX2luc24pOworCisgICAgbGZfcHJpbnRmKGZpbGUsICJ9O1xuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXGZcbiIpOworICB9CisKKyAgbGZfcHJpbnRmKGZpbGUsICIjaWZuZGVmIF9JTkxJTkVfQ19cbiIpOworICBsZl9wcmludGYoZmlsZSwgImNvbnN0IG1vZGVsX3RpbWUgKmNvbnN0IG1vZGVsX3RpbWVfbWFwcGluZ1sgKGludClucl9tb2RlbHMgXSA9IHtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiAgKGNvbnN0IG1vZGVsX3RpbWUgKmNvbnN0KTAsXG4iKTsKKyAgZm9yKG1vZGVsX3B0ciA9IG1vZGVsczsgbW9kZWxfcHRyOyBtb2RlbF9wdHIgPSBtb2RlbF9wdHItPm5leHQpIHsKKyAgICBsZl9wcmludGYoZmlsZSwgIiAgbW9kZWxfdGltZV8lcyxcbiIsIG1vZGVsX3B0ci0+bmFtZSk7CisgIH0KKyAgbGZfcHJpbnRmKGZpbGUsICJ9O1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiI2VuZGlmXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworCisgIGxmX3ByaW50ZihmaWxlLCAiXGZcbiIpOworICBsZl9wcmludGYoZmlsZSwgIi8qIG1hcCBtb2RlbCBlbnVtZXJhdGlvbiBpbnRvIHByaW50YWJsZSBzdHJpbmcgKi9cbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNpZm5kZWYgX0lOTElORV9DX1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiY29uc3QgY2hhciAqbW9kZWxfbmFtZVsgKGludClucl9tb2RlbHMgXSA9IHtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiAgXCJOT05FXCIsXG4iKTsKKyAgZm9yIChtb2RlbF9wdHIgPSBtb2RlbHM7IG1vZGVsX3B0cjsgbW9kZWxfcHRyID0gbW9kZWxfcHRyLT5uZXh0KSB7CisgICAgbGZfcHJpbnRmKGZpbGUsICIgIFwiJXNcIixcbiIsIG1vZGVsX3B0ci0+cHJpbnRhYmxlX25hbWUpOworICB9CisgIGxmX3ByaW50ZihmaWxlLCAifTtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNlbmRpZlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKworICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJ2b2lkIiwgIklOTElORV9NT0RFTCIsICJcbiIpOworICBsZl9wcmludGYoZmlsZSwgIm1vZGVsX3NldChjb25zdCBjaGFyICpuYW1lKVxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAie1xuIik7CisgIGlmIChtb2RlbHMpIHsKKyAgICBsZl9wcmludGYoZmlsZSwgIiAgbW9kZWxfZW51bSBtb2RlbDtcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiICBmb3IobW9kZWwgPSBNT0RFTF8lczsgbW9kZWwgPCBucl9tb2RlbHM7IG1vZGVsKyspIHtcbiIsIG1vZGVscy0+bmFtZSk7CisgICAgbGZfcHJpbnRmKGZpbGUsICIgICAgaWYoc3RyY21wKG5hbWUsIG1vZGVsX25hbWVbbW9kZWxdKSA9PSAwKSB7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiAgICAgIGN1cnJlbnRfbW9kZWwgPSBtb2RlbDtcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiICAgICAgcmV0dXJuO1xuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIgICAgfVxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIgIH1cbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiAgZXJyb3IoXCJVbmtub3duIG1vZGVsICclJXMnLCBNb2RlbHMgd2hpY2ggYXJlIGtub3duIGFyZTolJXNcblwiLFxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIgICAgICAgIG5hbWUsXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiAgICAgICAgXCIiKTsKKyAgICBmb3IobW9kZWxfcHRyID0gbW9kZWxzOyBtb2RlbF9wdHI7IG1vZGVsX3B0ciA9IG1vZGVsX3B0ci0+bmV4dCkgeworICAgICAgbGZfcHJpbnRmKGZpbGUsICJcXG5cXHQlcyIsIG1vZGVsX3B0ci0+cHJpbnRhYmxlX25hbWUpOworICAgIH0KKyAgICBsZl9wcmludGYoZmlsZSwgIlwiKTtcbiIpOworICB9IGVsc2UgeworICAgIGxmX3ByaW50ZihmaWxlLCAiICBlcnJvcihcIk5vIG1vZGVscyBhcmUgY3VycmVudGx5IGtub3duIGFib3V0XCIpO1xuIik7CisgIH0KKworICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworfQorCisjZW5kaWYKKworCisKK3ZvaWQKK2dlbl9tb2RlbF9oIChsZiAqZmlsZSwKKwkgICAgIGluc25fdGFibGUgKnRhYmxlKQoreworICBsZl9wcmludF9fdGhpc19maWxlX2lzX2VtcHR5IChmaWxlLCAic3VmZmVyaW5nIGJpdCByb3QiKTsKK30KKworCit2b2lkCitnZW5fbW9kZWxfYyAobGYgKmZpbGUsCisJICAgICBpbnNuX3RhYmxlICp0YWJsZSkKK3sKKyAgbGZfcHJpbnRfX3RoaXNfZmlsZV9pc19lbXB0eSAoZmlsZSwgInN1ZmZlcmluZyBiaXQgcm90Iik7Cit9CmRpZmYgLS1naXQgYS9zaW0vaWdlbi9nZW4tbW9kZWwuaCBiL3NpbS9pZ2VuL2dlbi1tb2RlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxODhlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaWdlbi9nZW4tbW9kZWwuaApAQCAtMCwwICsxLDI5IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisKK2V4dGVybiB2b2lkIGdlbl9tb2RlbF9oCisobGYgKmZpbGUsCisgaW5zbl90YWJsZSAqaXNhKTsKKworZXh0ZXJuIHZvaWQgZ2VuX21vZGVsX2MKKyhsZiAqZmlsZSwKKyBpbnNuX3RhYmxlICppc2EpOwpkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vZ2VuLXNlbWFudGljcy5jIGIvc2ltL2lnZW4vZ2VuLXNlbWFudGljcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhY2Q2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaWdlbi9nZW4tc2VtYW50aWNzLmMKQEAgLTAsMCArMSwzOTAgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKworI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJsZi5oIgorI2luY2x1ZGUgInRhYmxlLmgiCisjaW5jbHVkZSAiZmlsdGVyLmgiCisjaW5jbHVkZSAiaWdlbi5oIgorCisjaW5jbHVkZSAibGQtaW5zbi5oIgorI2luY2x1ZGUgImxkLWRlY29kZS5oIgorCisjaW5jbHVkZSAiZ2VuLmgiCisKKyNpbmNsdWRlICJnZW4tc2VtYW50aWNzLmgiCisjaW5jbHVkZSAiZ2VuLWljYWNoZS5oIgorI2luY2x1ZGUgImdlbi1pZGVjb2RlLmgiCisKKworc3RhdGljIHZvaWQKK3ByaW50X3NlbWFudGljX2Z1bmN0aW9uX2hlYWRlciAobGYgKmZpbGUsCisJCQkJY29uc3QgY2hhciAqYmFzZW5hbWUsCisJCQkJY29uc3QgY2hhciAqZm9ybWF0X25hbWUsCisJCQkJb3Bjb2RlX2JpdHMgKmV4cGFuZGVkX2JpdHMsCisJCQkJaW50IGlzX2Z1bmN0aW9uX2RlZmluaXRpb24sCisJCQkJaW50IG5yX3ByZWZldGNoZWRfd29yZHMpCit7CisgIGludCBpbmRlbnQ7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgbGZfcHJpbnRfX2Z1bmN0aW9uX3R5cGVfZnVuY3Rpb24gKGZpbGUsIHByaW50X3NlbWFudGljX2Z1bmN0aW9uX3R5cGUsCisJCQkJICAgICJFWFRFUk5fU0VNQU5USUNTIiwKKwkJCQkgICAgKGlzX2Z1bmN0aW9uX2RlZmluaXRpb24gPyAiXG4iIDogIiAiKSk7CisgIGluZGVudCA9IHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCisJCQkJYmFzZW5hbWUsCisJCQkJZm9ybWF0X25hbWUsCisJCQkJTlVMTCwKKwkJCQlleHBhbmRlZF9iaXRzLAorCQkJCWZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljcyk7CisgIGlmIChpc19mdW5jdGlvbl9kZWZpbml0aW9uKQorICAgIHsKKyAgICAgIGluZGVudCArPSBsZl9wcmludGYgKGZpbGUsICIgIik7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsICtpbmRlbnQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgICAgfQorICBsZl9wcmludGYgKGZpbGUsICIoIik7CisgIGxmX2luZGVudCAoZmlsZSwgKzEpOworICBwcmludF9zZW1hbnRpY19mdW5jdGlvbl9mb3JtYWwgKGZpbGUsIG5yX3ByZWZldGNoZWRfd29yZHMpOworICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiKSIpOworICBpZiAoaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKKyAgICB7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsIC1pbmRlbnQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIjsiKTsKKyAgICB9CisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7Cit9CisKK3ZvaWQKK3ByaW50X3NlbWFudGljX2RlY2xhcmF0aW9uIChsZiAqZmlsZSwKKwkJCSAgICBpbnNuX2VudHJ5ICppbnNuLAorCQkJICAgIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAorCQkJICAgIGluc25fb3Bjb2RlcyAqb3Bjb2RlcywKKwkJCSAgICBpbnQgbnJfcHJlZmV0Y2hlZF93b3JkcykKK3sKKyAgcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25faGVhZGVyIChmaWxlLAorCQkJCSAgaW5zbi0+bmFtZSwKKwkJCQkgIGluc24tPmZvcm1hdF9uYW1lLAorCQkJCSAgZXhwYW5kZWRfYml0cywKKwkJCQkgIDAvKiBpcyBub3QgZnVuY3Rpb24gZGVmaW5pdGlvbiovLAorCQkJCSAgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7Cit9CisKKworDAorLyogZ2VuZXJhdGUgdGhlIHNlbWFudGljcy5jIGZpbGUgKi8KKworCit2b2lkCitwcmludF9pZGVjb2RlX2ludmFsaWQgKGxmICpmaWxlLAorCQkgICAgICAgY29uc3QgY2hhciAqcmVzdWx0LAorCQkgICAgICAgaW52YWxpZF90eXBlIHR5cGUpCit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgZGVmYXVsdDogbmFtZSA9ICJ1bmtub3duIjsgYnJlYWs7CisgICAgY2FzZSBpbnZhbGlkX2lsbGVnYWw6IG5hbWUgPSAiaWxsZWdhbCI7IGJyZWFrOworICAgIGNhc2UgaW52YWxpZF9mcF91bmF2YWlsYWJsZTogbmFtZSA9ICJmcF91bmF2YWlsYWJsZSI7IGJyZWFrOworICAgIGNhc2UgaW52YWxpZF93cm9uZ19zbG90OiBuYW1lID0gIndyb25nX3Nsb3QiOyBicmVhazsKKyAgICB9CisgIGlmIChvcHRpb25zLmdlbi5jb2RlID09IGdlbmVyYXRlX2p1bXBzKQorICAgIHsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImdvdG8gJXNfJXM7XG4iLAorCQkgKG9wdGlvbnMuZ2VuLmljYWNoZSA/ICJpY2FjaGUiIDogInNlbWFudGljIiksCisJCSBuYW1lKTsKKyAgICB9CisgIGVsc2UgaWYgKG9wdGlvbnMuZ2VuLmljYWNoZSkKKyAgICB7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIlcyAlc2ljYWNoZV8lcyAoIiwgcmVzdWx0LCBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwsIG5hbWUpOworICAgICAgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uX2FjdHVhbCAoZmlsZSwgMCk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIpO1xuIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiJXMgJXNzZW1hbnRpY18lcyAoIiwgcmVzdWx0LCBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwsIG5hbWUpOworICAgICAgcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fYWN0dWFsIChmaWxlLCAwKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIik7XG4iKTsKKyAgICB9Cit9CisKKwordm9pZAorcHJpbnRfc2VtYW50aWNfYm9keSAobGYgKmZpbGUsCisJCSAgICAgaW5zbl9lbnRyeSAqaW5zdHJ1Y3Rpb24sCisJCSAgICAgb3Bjb2RlX2JpdHMgKmV4cGFuZGVkX2JpdHMsCisJCSAgICAgaW5zbl9vcGNvZGVzICpvcGNvZGVzKQoreworICAvKiB2YWxpZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24sIGlmIGEgY2FjaGUgdGhpcyBoYXMgYWxyZWFkeSBiZWVuIGRvbmUgKi8KKyAgaWYgKCFvcHRpb25zLmdlbi5pY2FjaGUpCisgICAgeworICAgICAgcHJpbnRfaWRlY29kZV92YWxpZGF0ZSAoZmlsZSwgaW5zdHJ1Y3Rpb24sIG9wY29kZXMpOworICAgIH0KKyAgCisgIHByaW50X2l0cmFjZSAoZmlsZSwgaW5zdHJ1Y3Rpb24sIDAvKnB1dF92YWx1ZV9pbl9jYWNoZSovKTsKKyAgCisgIC8qIGdlbmVyYXRlIHRoZSBpbnN0cnVjdGlvbiBwcm9maWxlIGNhbGwgLSB0aGlzIGlzIGRlbGF5ZWQgdW50aWwKKyAgICAgYWZ0ZXIgdGhlIGluc3RydWN0aW9uIGhhcyBiZWVuIHZlcmlmaWVkLiAgVGhlIGNvdW50IG1hY3JvCisgICAgIGdlbmVyYXRlZCBpcyBwcmVmaXhlZCBieSBJVEFCTEVfUFJFRklYICovCisgIHsKKyAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICAgIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7CisgICAgbGZfcHJpbnRmIChmaWxlLCAiI2lmIGRlZmluZWQgKCVzUFJPRklMRV9DT1VOVF9JTlNOKVxuIiwKKwkgICAgICAgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC51KTsKKyAgICBsZl9wcmludGYgKGZpbGUsICIlc1BST0ZJTEVfQ09VTlRfSU5TTiAoQ1BVLCBDSUEsIE1ZX0lOREVYKTtcbiIsCisJICAgICAgIG9wdGlvbnMubW9kdWxlLml0YWJsZS5wcmVmaXgudSk7CisgICAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKKyAgICBsZl9wcmludGYgKGZpbGUsICIjZW5kaWZcbiIpOworICB9CisKKyAgLyogZ2VuZXJhdGUgdGhlIG1vZGVsIGNhbGwgLSB0aGlzIGlzIGRlbGF5ZWQgdW50aWwgYWZ0ZXIgdGhlCisgICAgIGluc3RydWN0aW9uIGhhcyBiZWVuIHZlcmlmaWVkICovCisgIHsKKyAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICAgIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7CisgICAgbGZfcHJpbnRmIChmaWxlLCAiI2lmIGRlZmluZWQgKFdJVEhfTU9OKVxuIik7CisgICAgbGZfcHJpbnRmIChmaWxlLCAiLyogbW9uaXRvcmluZzogKi9cbiIpOworICAgIGxmX3ByaW50ZiAoZmlsZSwgImlmIChXSVRIX01PTiAmIE1PTklUT1JfSU5TVFJVQ1RJT05fSVNTVUUpXG4iKTsKKyAgICBsZl9wcmludGYgKGZpbGUsICIgIG1vbl9pc3N1ZSAoIik7CisgICAgcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKKwkJCSBpbnN0cnVjdGlvbi0+bmFtZSwKKwkJCSBpbnN0cnVjdGlvbi0+Zm9ybWF0X25hbWUsCisJCQkgTlVMTCwKKwkJCSBOVUxMLAorCQkJIGZ1bmN0aW9uX25hbWVfcHJlZml4X2l0YWJsZSk7CisgICAgbGZfcHJpbnRmIChmaWxlLCAiLCBjcHUsIGNpYSk7XG4iKTsKKyAgICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOworICAgIGxmX3ByaW50ZiAoZmlsZSwgIiNlbmRpZlxuIik7CisgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgfQorICAKKyAgLyogZGV0ZXJtaW5lIHRoZSBuZXcgaW5zdHJ1Y3Rpb24gYWRkcmVzcyAqLworICB7CisgICAgbGZfcHJpbnRmKGZpbGUsICIvKiBrZWVwIHRoZSBuZXh0IGluc3RydWN0aW9uIGFkZHJlc3MgaGFuZHkgKi9cbiIpOworICAgIGlmIChvcHRpb25zLmdlbi5uaWEgPT0gbmlhX2lzX2ludmFsaWQpCisgICAgICB7CisJbGZfcHJpbnRmKGZpbGUsICJuaWEgPSAlc0lOVkFMSURfSU5TVFJVQ1RJT05fQUREUkVTUztcbiIsCisJCSAgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC51KTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJaW50IG5yX2ltbWVkcyA9IGluc3RydWN0aW9uLT5ucl93b3JkcyAtIDE7CisJaWYgKG9wdGlvbnMuZ2VuLmRlbGF5ZWRfYnJhbmNoKQorCSAgeworCSAgICBpZiAobnJfaW1tZWRzID4gMCkKKwkgICAgICB7CisJCWxmX3ByaW50ZiAoZmlsZSwgImNpYS5kcCArPSAlZCAqICVkOyAlc1xuIiwKKwkJCSAgIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSAvIDgsIG5yX2ltbWVkcywKKwkJCSAgICIvKiBza2lwIGRwIGltbWVkcyAqLyIpOworCSAgICAgIH0KKwkgICAgbGZfcHJpbnRmIChmaWxlLCAibmlhLmlwID0gY2lhLmRwOyAlc1xuIiwKKwkJICAgICAgICIvKiBpbnN0cnVjdGlvbiBwb2ludGVyICovIik7CisJICAgIGxmX3ByaW50ZiAoZmlsZSwgIm5pYS5kcCA9IGNpYS5kcCArICVkOyAlc1xuIiwKKwkJICAgICAgIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSAvIDgsCisJCSAgICAgICAiLyogZGVsYXllZC1zbG90IHBvaW50ZXIgKi8iKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGlmIChucl9pbW1lZHMgPiAwKQorCSAgICAgIHsKKwkJbGZfcHJpbnRmIChmaWxlLCAibmlhID0gY2lhICsgJWQgKiAoJWQgKyAxKTsgJXNcbiIsCisJCQkgICBvcHRpb25zLmluc25fYml0X3NpemUgLyA4LCBucl9pbW1lZHMsCisJCQkgICAiLyogc2tpcCBpbW1lZHMgYXMgd2VsbCAqLyIpOworCQkKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCWxmX3ByaW50ZiAoZmlsZSwgIm5pYSA9IGNpYSArICVkO1xuIiwKKwkJCSAgIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSAvIDgpOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKyAgfQorICAKKyAgLyogaWYgY29uZGl0aW9uYWwsIGdlbmVyYXRlIGNvZGUgdG8gdmVyaWZ5IHRoYXQgdGhlIGluc3RydWN0aW9uCisgICAgIHNob3VsZCBiZSBpc3N1ZWQgKi8KKyAgaWYgKGZpbHRlcl9pc19tZW1iZXIgKGluc3RydWN0aW9uLT5vcHRpb25zLCAiYyIpCisgICAgICB8fCBvcHRpb25zLmdlbi5jb25kaXRpb25hbF9pc3N1ZSkKKyAgICB7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiLyogZXhlY3V0ZSBvbmx5IGlmIGNvbmRpdGlvbmFsIHBhc3NlcyAqL1xuIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJpZiAoSVNfQ09ORElUSU9OX09LKVxuIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIgIHtcbiIpOworICAgICAgbGZfaW5kZW50IChmaWxlLCArNCk7CisgICAgICAvKiBGSVhNRSAtIG5lZWQgdG8gbG9nIGEgY29uZGl0aW9uYWwgZmFpbHVyZSAqLworICAgIH0KKyAgCisgIC8qIEFyY2hpdGVjdHVyZSBleHBlY3RzIGEgUkVHIHRvIGJlIHplcm8uICBJbnN0ZWFkIG9mIGhhdmluZyB0bworICAgICBjaGVjayBldmVyeSByZWFkIHRvIHNlZSBpZiBpdCBpcyByZWZlcmluZyB0byB0aGF0IFJFRyBqdXN0IHphcCBpdAorICAgICBhdCB0aGUgc3RhcnQgb2YgZXZlcnkgaW5zdHJ1Y3Rpb24gKi8KKyAgaWYgKG9wdGlvbnMuZ2VuLnplcm9fcmVnKQorICAgIHsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIvKiBBcmNoaXRlY3R1cmUgZXhwZWN0cyBSRUcgdG8gYmUgemVybyAqL1xuIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJHUFJfU0VUKCVkLCAwKTtcbiIsIG9wdGlvbnMuZ2VuLnplcm9fcmVnX25yKTsKKyAgICB9CisgIAorICAvKiBnZW5lcmF0ZSB0aGUgY29kZSAob3IgYXQgbGVhc3Qgc29tZXRoaW5nICovCisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIi8qIHNlbWFudGljczogKi9cbiIpOworICBpZiAoaW5zdHJ1Y3Rpb24tPmNvZGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAvKiB0cnVlIGNvZGUgKi8KKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOworICAgICAgbGZfaW5kZW50IChmaWxlLCArMik7CisgICAgICBsZl9wcmludF9fbGluZV9yZWYgKGZpbGUsIGluc3RydWN0aW9uLT5jb2RlLT5saW5lKTsKKyAgICAgIHRhYmxlX3ByaW50X2NvZGUgKGZpbGUsIGluc3RydWN0aW9uLT5jb2RlKTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgLTIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAifVxuIik7CisgICAgICBsZl9wcmludF9faW50ZXJuYWxfcmVmIChmaWxlKTsKKyAgICB9CisgIGVsc2UgaWYgKGZpbHRlcl9pc19tZW1iZXIgKGluc3RydWN0aW9uLT5vcHRpb25zLCAibm9wIikpCisgICAgeworICAgICAgbGZfcHJpbnRfX2ludGVybmFsX3JlZiAoZmlsZSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29uc3QgY2hhciAqcHJlZml4ID0gInNpbV9lbmdpbmVfYWJvcnQgKCI7CisgICAgICBpbnQgaW5kZW50ID0gc3RybGVuIChwcmVmaXgpOworICAgICAgLyogYWJvcnQgc28gaXQgaXMgaW1wbGVtZW50ZWQgbm93ICovCisgICAgICBsZl9wcmludF9fbGluZV9yZWYgKGZpbGUsIGluc3RydWN0aW9uLT5saW5lKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzU0QsIENQVSwgY2lhLCBcXFxuIiwgcHJlZml4KTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgK2luZGVudCk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcIiVzOiVkOjB4JSUwOGx4OiUlcyB1bmltcGxlbWVudGVkXFxuXCIsIFxcXG4iLAorCQkgZmlsdGVyX2ZpbGVuYW1lIChpbnN0cnVjdGlvbi0+bGluZS0+ZmlsZV9uYW1lKSwKKwkJIGluc3RydWN0aW9uLT5saW5lLT5saW5lX25yKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIihsb25nKSBDSUEsIFxcXG4iKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzaXRhYmxlW01ZX0lOREVYXS5uYW1lKTtcbiIsCisJCSBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpOworICAgICAgbGZfaW5kZW50IChmaWxlLCAtaW5kZW50KTsKKyAgICAgIGxmX3ByaW50X19pbnRlcm5hbF9yZWYgKGZpbGUpOworICAgIH0KKyAgCisgIC8qIENsb3NlIG9mZiB0aGUgY29uZGl0aW9uYWwgZXhlY3V0aW9uICovCisgIGlmIChmaWx0ZXJfaXNfbWVtYmVyIChpbnN0cnVjdGlvbi0+b3B0aW9ucywgImMiKQorICAgICAgfHwgb3B0aW9ucy5nZW4uY29uZGl0aW9uYWxfaXNzdWUpCisgICAgeworICAgICAgbGZfaW5kZW50IChmaWxlLCAtNCk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIgIH1cbiIpOworICAgIH0gIAorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfY19zZW1hbnRpYyAobGYgKmZpbGUsCisJCSAgaW5zbl9lbnRyeSAqaW5zdHJ1Y3Rpb24sCisJCSAgb3Bjb2RlX2JpdHMgKmV4cGFuZGVkX2JpdHMsCisJCSAgaW5zbl9vcGNvZGVzICpvcGNvZGVzLAorCQkgIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcywKKwkJICBpbnQgbnJfcHJlZmV0Y2hlZF93b3JkcykKK3sKKyAgCisgIGxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOworICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKKyAgCisgIHByaW50X215X2RlZmluZXMgKGZpbGUsCisJCSAgICBpbnN0cnVjdGlvbi0+bmFtZSwKKwkJICAgIGluc3RydWN0aW9uLT5mb3JtYXRfbmFtZSwKKwkJICAgIGV4cGFuZGVkX2JpdHMpOworICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICBwcmludF9pY2FjaGVfYm9keSAoZmlsZSwKKwkJICAgICBpbnN0cnVjdGlvbiwKKwkJICAgICBleHBhbmRlZF9iaXRzLAorCQkgICAgIGNhY2hlX3J1bGVzLAorCQkgICAgIChvcHRpb25zLmdlbi5kaXJlY3RfYWNjZXNzCisJCSAgICAgID8gZGVmaW5lX3ZhcmlhYmxlcworCQkgICAgICA6IGRlY2xhcmVfdmFyaWFibGVzKSwKKwkJICAgICAob3B0aW9ucy5nZW4uaWNhY2hlCisJCSAgICAgID8gZ2V0X3ZhbHVlc19mcm9tX2ljYWNoZQorCQkgICAgICA6IGRvX25vdF91c2VfaWNhY2hlKSwKKwkJICAgICBucl9wcmVmZXRjaGVkX3dvcmRzKTsKKyAgCisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzaW5zdHJ1Y3Rpb25fYWRkcmVzcyBuaWE7XG4iLCBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOworICBwcmludF9zZW1hbnRpY19ib2R5IChmaWxlLAorCQkgICAgICAgaW5zdHJ1Y3Rpb24sCisJCSAgICAgICBleHBhbmRlZF9iaXRzLAorCQkgICAgICAgb3Bjb2Rlcyk7CisgIGxmX3ByaW50ZiAoZmlsZSwgInJldHVybiBuaWE7XG4iKTsKKyAgCisgIC8qIGdlbmVyYXRlIHNvbWV0aGluZyB0byBjbGVhbiB1cCBhbnkgI2RlZmluZXMgY3JlYXRlZCBmb3IgdGhlIGNhY2hlICovCisgIGlmIChvcHRpb25zLmdlbi5kaXJlY3RfYWNjZXNzKQorICAgIHsKKyAgICAgIHByaW50X2ljYWNoZV9ib2R5IChmaWxlLAorCQkJIGluc3RydWN0aW9uLAorCQkJIGV4cGFuZGVkX2JpdHMsCisJCQkgY2FjaGVfcnVsZXMsCisJCQkgdW5kZWZfdmFyaWFibGVzLAorCQkJIChvcHRpb25zLmdlbi5pY2FjaGUKKwkJCSAgPyBnZXRfdmFsdWVzX2Zyb21faWNhY2hlCisJCQkgIDogZG9fbm90X3VzZV9pY2FjaGUpLAorCQkJIG5yX3ByZWZldGNoZWRfd29yZHMpOworICAgIH0KKyAgCisgIGxmX2luZGVudCAoZmlsZSwgLTIpOworICBsZl9wcmludGYgKGZpbGUsICJ9XG4iKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2Nfc2VtYW50aWNfZnVuY3Rpb24gKGxmICpmaWxlLAorCQkJICAgaW5zbl9lbnRyeSAqaW5zdHJ1Y3Rpb24sCisJCQkgICBvcGNvZGVfYml0cyAqZXhwYW5kZWRfYml0cywKKwkJCSAgIGluc25fb3Bjb2RlcyAqb3Bjb2RlcywKKwkJCSAgIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcywKKwkJCSAgIGludCBucl9wcmVmZXRjaGVkX3dvcmRzKQoreworICAvKiBidWlsZCB0aGUgc2VtYW50aWMgcm91dGluZSB0byBleGVjdXRlIHRoZSBpbnN0cnVjdGlvbiAqLworICBwcmludF9zZW1hbnRpY19mdW5jdGlvbl9oZWFkZXIgKGZpbGUsCisJCQkJICBpbnN0cnVjdGlvbi0+bmFtZSwKKwkJCQkgIGluc3RydWN0aW9uLT5mb3JtYXRfbmFtZSwKKwkJCQkgIGV4cGFuZGVkX2JpdHMsCisJCQkJICAxLyppcy1mdW5jdGlvbi1kZWZpbml0aW9uKi8sCisJCQkJICBucl9wcmVmZXRjaGVkX3dvcmRzKTsKKyAgcHJpbnRfY19zZW1hbnRpYyAoZmlsZSwKKwkJICAgIGluc3RydWN0aW9uLAorCQkgICAgZXhwYW5kZWRfYml0cywKKwkJICAgIG9wY29kZXMsCisJCSAgICBjYWNoZV9ydWxlcywKKwkJICAgIG5yX3ByZWZldGNoZWRfd29yZHMpOworfQorCit2b2lkCitwcmludF9zZW1hbnRpY19kZWZpbml0aW9uIChsZiAqZmlsZSwKKwkJCSAgIGluc25fZW50cnkgKmluc24sCisJCQkgICBvcGNvZGVfYml0cyAqZXhwYW5kZWRfYml0cywKKwkJCSAgIGluc25fb3Bjb2RlcyAqb3Bjb2RlcywKKwkJCSAgIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcywKKwkJCSAgIGludCBucl9wcmVmZXRjaGVkX3dvcmRzKQoreworICBwcmludF9jX3NlbWFudGljX2Z1bmN0aW9uIChmaWxlLAorCQkJICAgICBpbnNuLAorCQkJICAgICBleHBhbmRlZF9iaXRzLAorCQkJICAgICBvcGNvZGVzLAorCQkJICAgICBjYWNoZV9ydWxlcywKKwkJCSAgICAgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vZ2VuLXNlbWFudGljcy5oIGIvc2ltL2lnZW4vZ2VuLXNlbWFudGljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OWQxZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaWdlbi9nZW4tc2VtYW50aWNzLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKy8qIENyZWF0ZXMgdGhlIGZpbGVzIHNlbWFudGljcy5baGNdLgorCisgICBUaGUgZ2VuZXJhdGVkIGZpbGUgc2VtYW50aWNzIGNvbnRhaW5zIGZ1bmN0aW9ucyB0aGF0IGltcGxlbWVudCB0aGUKKyAgIG9wZXJhdGlvbnMgcmVxdWlyZWQgdG8gbW9kZWwgYSBzaW5nbGUgdGFyZ2V0IHByb2Nlc3NvciBpbnN0cnVjdGlvbi4KKworICAgU2V2ZXJhbCBkaWZmZXJlbnQgdmFyaWF0aW9ucyBvbiB0aGUgc2VtYW50aWNzIGZpbGUgY2FuIGJlIGNyZWF0ZWQ6CisKKwlvCXVuY2FjaGVkCisKKyAgICAgICAgCU5vIGluc3RydWN0aW9uIGNhY2hlIGV4aXN0cy4gIFRoZSBzZW1hbnRpYyBmdW5jdGlvbgorCQluZWVkcyB0byBnZW5lcmF0ZSBhbnkgcmVxdWlyZWQgdmFsdWVzIGxvY2FsbHkuCisKKwlvCWNhY2hlZCAtIHNlcGFyYXRlIGNyYWNrZXIgYW5kIHNlbWFudGljCisKKwkJVHdvIGluZGVwZW5kYW50IGZ1bmN0aW9ucyBhcmUgY3JlYXRlZC4gIEZpcnN0bHkgdGhlCisJCWZ1bmN0aW9uIHRoYXQgY3JhY2tzIGFuIGluc3RydWN0aW9uIGVudGVyaW5nIGl0IGludG8gYQorCQljYWNoZSBhbmQgc2Vjb25kbHkgdGhlIHNlbWFudGljIGZ1bmN0aW9uIHByb3BwZXIgdGhhdAorCQl1c2VzIHRoZSBjYWNoZS4KKworCW8JY2FjaGVkIC0gc2VtYW50aWMgKyBjcmFja2luZyBzZW1hbnRpYworCisJCVRoZSBmdW5jdGlvbiB0aGF0IGNyYWNrcyB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGVudGVycworCQlhbGwgdmFsdWVzIGludG8gdGhlIGNhY2hlIGFsc28gY29udGFpbnMgYSBjb3B5IG9mIHRoZQorCQlzZW1hbnRpYyBjb2RlIChhdm9pZGluZyB0aGUgbmVlZCB0byBjYWxsIGJvdGggdGhlCisJCWNyYWNrZXIgYW5kIHRoZSBzZW1hbnRpYyBmdW5jdGlvbiB3aGVuIHRoZXJlIGlzIGEKKwkJY2FjaGUgbWlzcykuCisKKyAgIEZvciBlYWNoIG9mIHRoZXNlIGdlbmVyYWwgZm9ybXMsIHNldmVyYWwgcmVmaW5lbWVudHMgY2FuIG9jY3VyZToKKworCW8JZG8vZG9uJ3QgZHVwbGljYXRlL2V4cGFuZCBzZW1hbnRpYyBmdW5jdGlvbnMKKworCQlBcyBhIGNvbnNlcXVlbmNlIG9mIGRlY29kaW5nIGFuIGluc3RydWN0aW9uLCB0aGUKKwkJZGVjb2RlciwgYXMgcGFydCBvZiBpdHMgdGFibGUgbWF5IGhhdmUgZWZmZWN0aXZseSBtYWRlCisJCWNlcnRhaW4gb2YgdGhlIHZhcmlhYmxlIGZpZWxkcyBpbiBhbiBpbnN0cnVjdGlvbgorCQljb25zdGFudC4gU2VwYXJhdGUgZnVuY3Rpb25zIGZvciBlYWNoIG9mIHRoZQorCQlhbHRlcm5hdGl2ZSB2YWx1ZXMgZm9yIHdoYXQgd291bGQgaGF2ZSBiZWVuIHRyZWF0ZWQgYXMKKwkJYSB2YXJpYWJsZSBwYXJ0IGNhbiBiZSBjcmVhdGVkLgorCisJbwl1c2UgY2FjaGUgc3RydWN0IGRpcmVjdGx5LgorCisJCVdoZW4gYSBjcmFja2luZyBjYWNoZSBpcyBwcmVzZW50LCB0aGUgc2VtYW50aWMKKwkJZnVuY3Rpb25zIGNhbiBiZSBnZW5lcmF0ZWQgdG8gZWl0aGVyIGhvbGQgaW50ZXJtZWRpYXRlCisJCWNhY2hlIHZhbHVlcyBpbiBsb2NhbCB2YXJpYWJsZXMgb3IgYWx3YXlzIHJlZmVyIHRvIHRoZQorCQljb250ZW50cyBvZiB0aGUgY2FjaGUgZGlyZWN0bHkuICovCisKKworCisKKworCitleHRlcm4gdm9pZCBwcmludF9zZW1hbnRpY19kZWNsYXJhdGlvbgorKGxmICpmaWxlLAorIGluc25fZW50cnkgKmluc24sCisgb3Bjb2RlX2JpdHMgKmJpdHMsCisgaW5zbl9vcGNvZGVzICpvcGNvZGVzLAorIGludCBucl9wcmVmZXRjaGVkX3dvcmRzKTsKKworZXh0ZXJuIHZvaWQgcHJpbnRfc2VtYW50aWNfZGVmaW5pdGlvbgorKGxmICpmaWxlLAorIGluc25fZW50cnkgKmluc24sCisgb3Bjb2RlX2JpdHMgKmJpdHMsCisgaW5zbl9vcGNvZGVzICpvcGNvZGVzLAorIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcywKKyBpbnQgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7CisKKwordHlwZWRlZiBlbnVtIHsKKyAgaW52YWxpZF9pbGxlZ2FsLAorICBpbnZhbGlkX2ZwX3VuYXZhaWxhYmxlLAorICBpbnZhbGlkX3dyb25nX3Nsb3QsCit9IGludmFsaWRfdHlwZTsKKworZXh0ZXJuIHZvaWQgcHJpbnRfaWRlY29kZV9pbnZhbGlkCisobGYgKmZpbGUsCisgY29uc3QgY2hhciAqcmVzdWx0LAorIGludmFsaWRfdHlwZSB0eXBlKTsKKworZXh0ZXJuIHZvaWQgcHJpbnRfc2VtYW50aWNfYm9keQorKGxmICpmaWxlLAorIGluc25fZW50cnkgKmluc3RydWN0aW9uLAorIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAorIGluc25fb3Bjb2RlcyAqb3Bjb2Rlcyk7CisKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2dlbi1zdXBwb3J0LmMgYi9zaW0vaWdlbi9nZW4tc3VwcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZWZhYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaWdlbi9nZW4tc3VwcG9ydC5jCkBAIC0wLDAgKzEsMjE5IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJsZi5oIgorI2luY2x1ZGUgInRhYmxlLmgiCisjaW5jbHVkZSAiZmlsdGVyLmgiCisKKyNpbmNsdWRlICJpZ2VuLmgiCisKKyNpbmNsdWRlICJsZC1pbnNuLmgiCisjaW5jbHVkZSAibGQtZGVjb2RlLmgiCisKKyNpbmNsdWRlICJnZW4uaCIKKworI2luY2x1ZGUgImdlbi1zZW1hbnRpY3MuaCIKKyNpbmNsdWRlICJnZW4tc3VwcG9ydC5oIgorCitzdGF0aWMgdm9pZAorcHJpbnRfc3VwcG9ydF9mdW5jdGlvbl9uYW1lIChsZiAqZmlsZSwKKwkJCSAgICAgZnVuY3Rpb25fZW50cnkgKmZ1bmN0aW9uLAorCQkJICAgICBpbnQgaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKK3sKKyAgaWYgKGZ1bmN0aW9uLT5pc19pbnRlcm5hbCkKKyAgICB7CisgICAgICBsZl9wcmludF9fZnVuY3Rpb25fdHlwZV9mdW5jdGlvbiAoZmlsZSwgcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fdHlwZSwKKwkJCQkJIklOTElORV9TVVBQT1JUIiwKKwkJCQkJKGlzX2Z1bmN0aW9uX2RlZmluaXRpb24gPyAiXG4iIDogIiAiKSk7CisgICAgICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAorCQkJICAgZnVuY3Rpb24tPm5hbWUsCisJCQkgICBOVUxMLAorCQkJICAgTlVMTCwKKwkJCSAgIE5VTEwsCisJCQkgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oIik7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgICAgIHByaW50X3NlbWFudGljX2Z1bmN0aW9uX2Zvcm1hbCAoZmlsZSwgMCk7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIikiKTsKKyAgICAgIGlmICghaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKKwlsZl9wcmludGYgKGZpbGUsICI7Iik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIG1hcCB0aGUgbmFtZSBvbnRvIGEgZ2xvYmFsbHkgdmFsaWQgbmFtZSAqLworICAgICAgaWYgKCFpc19mdW5jdGlvbl9kZWZpbml0aW9uCisJICAmJiBzdHJjbXAgKG9wdGlvbnMubW9kdWxlLnN1cHBvcnQucHJlZml4LmwsICIiKSAhPSAwKQorCXsKKwkgIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7CisJICBsZl9wcmludGYgKGZpbGUsICIjZGVmaW5lICVzICVzJXNcbiIsCisJCSAgICAgZnVuY3Rpb24tPm5hbWUsCisJCSAgICAgb3B0aW9ucy5tb2R1bGUuc3VwcG9ydC5wcmVmaXgubCwKKwkJICAgICBmdW5jdGlvbi0+bmFtZSk7CisJfQorICAgICAgbGZfcHJpbnRfX2Z1bmN0aW9uX3R5cGUgKGZpbGUsCisJCQkgICAgICAgZnVuY3Rpb24tPnR5cGUsCisJCQkgICAgICAgIklOTElORV9TVVBQT1JUIiwKKwkJCSAgICAgICAoaXNfZnVuY3Rpb25fZGVmaW5pdGlvbiA/ICJcbiIgOiAiICIpKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzJXNcbigiLAorCQkgb3B0aW9ucy5tb2R1bGUuc3VwcG9ydC5wcmVmaXgubCwKKwkJIGZ1bmN0aW9uLT5uYW1lKTsKKyAgICAgIGlmIChvcHRpb25zLmdlbi5zbXApCisJbGZfcHJpbnRmIChmaWxlLAorCQkgICAic2ltX2NwdSAqY3B1LCAlc2luc3RydWN0aW9uX2FkZHJlc3MgY2lhLCBpbnQgTVlfSU5ERVgiLAorCQkgICBvcHRpb25zLm1vZHVsZS5zdXBwb3J0LnByZWZpeC5sKTsKKyAgICAgIGVsc2UKKwlsZl9wcmludGYgKGZpbGUsCisJCSAgICJTSU1fREVTQyBzZCwgJXNpbnN0cnVjdGlvbl9hZGRyZXNzIGNpYSwgaW50IE1ZX0lOREVYIiwKKwkJICAgb3B0aW9ucy5tb2R1bGUuc3VwcG9ydC5wcmVmaXgubCk7CisgICAgICBpZiAoZnVuY3Rpb24tPnBhcmFtICE9IE5VTEwKKwkgICYmIHN0cmxlbiAoZnVuY3Rpb24tPnBhcmFtKSA+IDApCisJbGZfcHJpbnRmIChmaWxlLCAiLCAlcyIsIGZ1bmN0aW9uLT5wYXJhbSk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIpJXMiLCAoaXNfZnVuY3Rpb25fZGVmaW5pdGlvbiA/ICJcbiIgOiAiO1xuIikpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorc3VwcG9ydF9oX2Z1bmN0aW9uIChsZiAqZmlsZSwKKwkJICAgIGZ1bmN0aW9uX2VudHJ5ICpmdW5jdGlvbiwKKwkJICAgIHZvaWQgKmRhdGEpCit7CisgIEFTU0VSVCAoZnVuY3Rpb24tPnR5cGUgIT0gTlVMTCk7CisgIHByaW50X3N1cHBvcnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKKwkJCSAgICAgICBmdW5jdGlvbiwKKwkJCSAgICAgICAwLyohaXNfZGVmaW5pdGlvbiovKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworfQorCisKK2V4dGVybiB2b2lkCitnZW5fc3VwcG9ydF9oIChsZiAqZmlsZSwKKwkgICAgICAgaW5zbl90YWJsZSAqdGFibGUpCit7CisgIC8qIG91dHB1dCB0aGUgZGVmaW5pdGlvbiBvZiBgU0RfJyovCisgIGlmIChvcHRpb25zLmdlbi5zbXApIAorICAgIHsKKyAgICAgIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSBTRCBDUFVfU1RBVEUgKGNwdSlcbiIpOworICAgICAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lIENQVSBjcHVcbiIpOworICAgICAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lIENQVV8gY3B1XG4iKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsZl9wcmludGYoZmlsZSwgIiNkZWZpbmUgU0Qgc2RcbiIpOworICAgICAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lIENQVSAoU1RBVEVfQ1BVIChzZCwgMCkpXG4iKTsKKyAgICAgIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSBDUFVfIHNkXG4iKTsKKyAgICB9CisKKyAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lIENJQV8gY2lhXG4iKTsKKyAgaWYgKG9wdGlvbnMuZ2VuLmRlbGF5ZWRfYnJhbmNoKQorICAgIHsKKyAgICAgIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSBDSUEgY2lhLmlwXG4iKTsKKyAgICAgIGxmX3ByaW50ZihmaWxlLCAiLyogI2RlZmluZSBOSUEgbmlhLmRwIC0tIGRvIG5vdCBkZWZpbmUsIGFtYmlnaW91cyAqL1xuIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lIENJQSBjaWFcbiIpOworICAgICAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lIE5JQSBuaWFcbiIpOworICAgIH0KKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworCisgIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSBTRF8gQ1BVXywgQ0lBXywgTVlfSU5ERVhcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNkZWZpbmUgX1NEIFNEXyAvKiBkZXByZWNhdGVkICovXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworCisgIC8qIE1hcCA8UFJFRklYPl9pbnN0cnVjdGlvbl93b3JkIGFuZCA8UFJFRklYPl9pZGVjb2RlX2lzc3VlIG9udG8gdGhlCisgICAgIHNob3J0ZXIgaW5zdHJ1Y3Rpb25fd29yZCBhbmQgaWRlY29kZV9pc3N1ZS4gIE1hcCBkZWZpbmVkIGhlcmUgYXMsCisgICAgIG5hbWUgc3BhY2UgcHJvYmxlbXMgYXJlIGNyZWF0ZWQgd2hlbiB0aGUgbmFtZSBpcyBkZWZpbmVkIGluCisgICAgIGlkZWNvZGUuaCAqLworICBpZiAoc3RyY21wIChvcHRpb25zLm1vZHVsZS5pZGVjb2RlLnByZWZpeC5sLCAiIikgIT0gMCkKKyAgICB7CisgICAgICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiI2RlZmluZSAlcyAlcyVzXG4iLAorCQkgImluc3RydWN0aW9uX3dvcmQiLAorCQkgb3B0aW9ucy5tb2R1bGUuaWRlY29kZS5wcmVmaXgubCwKKwkJICJpbnN0cnVjdGlvbl93b3JkIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICAgICAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiNkZWZpbmUgJXMgJXMlc1xuIiwKKwkJICJpZGVjb2RlX2lzc3VlIiwKKwkJIG9wdGlvbnMubW9kdWxlLmlkZWNvZGUucHJlZml4LmwsCisJCSAiaWRlY29kZV9pc3N1ZSIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgICB9CisKKyAgLyogb3V0cHV0IGEgZGVjbGFyYXRpb24gZm9yIGFsbCBmdW5jdGlvbnMgKi8KKyAgZnVuY3Rpb25fZW50cnlfdHJhdmVyc2UgKGZpbGUsIHRhYmxlLT5mdW5jdGlvbnMsCisJCQkgICBzdXBwb3J0X2hfZnVuY3Rpb24sCisJCQkgICBOVUxMKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNpZiBkZWZpbmVkKFNVUFBPUlRfSU5MSU5FKVxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiIyBpZiAoKFNVUFBPUlRfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpXFxcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiAgICAgICYmIChTVVBQT1JUX0lOTElORSAmIElOQ0xVREVEX0JZX01PRFVMRSkpXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIjICBpbmNsdWRlIFwiJXNzdXBwb3J0LmNcIlxuIiwgb3B0aW9ucy5tb2R1bGUuc3VwcG9ydC5wcmVmaXgubCk7CisgIGxmX3ByaW50ZihmaWxlLCAiIyBlbmRpZlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiI2VuZGlmXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3N1cHBvcnRfY19mdW5jdGlvbiAobGYgKmZpbGUsCisJCSAgICBmdW5jdGlvbl9lbnRyeSAqZnVuY3Rpb24sCisJCSAgICB2b2lkICpkYXRhKQoreworICBBU1NFUlQgKGZ1bmN0aW9uLT50eXBlICE9IE5VTEwpOworICBwcmludF9zdXBwb3J0X2Z1bmN0aW9uX25hbWUgKGZpbGUsCisJCQkgICAgICAgZnVuY3Rpb24sCisJCQkgICAgICAgMS8qIWlzX2RlZmluaXRpb24qLyk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIntcbiIpOworICBsZl9pbmRlbnQgKGZpbGUsICsyKTsKKyAgaWYgKGZ1bmN0aW9uLT5jb2RlID09IE5VTEwpCisgICAgZXJyb3IgKGZ1bmN0aW9uLT5saW5lLAorCSAgICJGdW5jdGlvbiB3aXRob3V0IGJvZHkgKG9yIG51bGwgc3RhdGVtZW50KSIpOworICBsZl9wcmludF9fbGluZV9yZWYgKGZpbGUsIGZ1bmN0aW9uLT5jb2RlLT5saW5lKTsKKyAgdGFibGVfcHJpbnRfY29kZSAoZmlsZSwgZnVuY3Rpb24tPmNvZGUpOworICBpZiAoZnVuY3Rpb24tPmlzX2ludGVybmFsKQorICAgIHsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgInNpbV9lbmdpbmVfYWJvcnQgKFNELCBDUFUsIGNpYSwgXCJJbnRlcm5hbCBmdW5jdGlvbiBtdXN0IGxvbmdqdW1wXFxuXCIpO1xuIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJyZXR1cm4gY2lhO1xuIik7CisgICAgfQorICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAifVxuIik7CisgIGxmX3ByaW50X19pbnRlcm5hbF9yZWYgKGZpbGUpOworICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworfQorCisKK3ZvaWQKK2dlbl9zdXBwb3J0X2MgKGxmICpmaWxlLAorCSAgICAgICBpbnNuX3RhYmxlICp0YWJsZSkKK3sKKyAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcInNpbS1tYWluLmhcIlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCIlc2lkZWNvZGUuaFwiXG4iLCBvcHRpb25zLm1vZHVsZS5pZGVjb2RlLnByZWZpeC5sKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcIiVzaXRhYmxlLmhcIlxuIiwgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcIiVzc3VwcG9ydC5oXCJcbiIsIG9wdGlvbnMubW9kdWxlLnN1cHBvcnQucHJlZml4LmwpOworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisKKyAgLyogb3V0cHV0IGEgZGVmaW5pdGlvbiAoYy1jb2RlKSBmb3IgYWxsIGZ1bmN0aW9ucyAqLworICBmdW5jdGlvbl9lbnRyeV90cmF2ZXJzZSAoZmlsZSwgdGFibGUtPmZ1bmN0aW9ucywKKwkJCSAgIHN1cHBvcnRfY19mdW5jdGlvbiwKKwkJCSAgIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vZ2VuLXN1cHBvcnQuaCBiL3NpbS9pZ2VuL2dlbi1zdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAxZjFhZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9pZ2VuL2dlbi1zdXBwb3J0LmgKQEAgLTAsMCArMSwyOSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworZXh0ZXJuIHZvaWQgZ2VuX3N1cHBvcnRfaAorKGxmICpmaWxlLAorIGluc25fdGFibGUgKnRhYmxlKTsKKworZXh0ZXJuIHZvaWQgZ2VuX3N1cHBvcnRfYworKGxmICpmaWxlLAorIGluc25fdGFibGUgKnRhYmxlKTsKKwpkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vZ2VuLmMgYi9zaW0vaWdlbi9nZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTg4NjE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2lnZW4vZ2VuLmMKQEAgLTAsMCArMSwxNzY1IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgImxmLmgiCisjaW5jbHVkZSAidGFibGUuaCIKKyNpbmNsdWRlICJmaWx0ZXIuaCIKKworI2luY2x1ZGUgImlnZW4uaCIKKyNpbmNsdWRlICJsZC1pbnNuLmgiCisjaW5jbHVkZSAibGQtZGVjb2RlLmgiCisjaW5jbHVkZSAiZ2VuLmgiCisKK3N0YXRpYyBpbnNuX3VpbnQKK3N1Yl92YWwgKGluc25fdWludCB2YWwsCisJIGludCB2YWxfbGFzdF9wb3MsCisJIGludCBmaXJzdF9wb3MsCisJIGludCBsYXN0X3BvcykKK3sKKyAgcmV0dXJuICgodmFsID4+ICh2YWxfbGFzdF9wb3MgLSBsYXN0X3BvcykpCisJICAmICgoKGluc25fdWludCkxIDw8IChsYXN0X3BvcyAtIGZpcnN0X3BvcyArIDEpKSAtIDEpKTsKK30KKworc3RhdGljIHZvaWQKK3VwZGF0ZV9kZXB0aCAobGYgKmZpbGUsCisJICAgICAgZ2VuX2VudHJ5ICplbnRyeSwKKwkgICAgICBpbnQgZGVwdGgsCisJICAgICAgdm9pZCAqZGF0YSkKK3sKKyAgaW50ICptYXhfZGVwdGggPSAoaW50KilkYXRhOworICBpZiAoKm1heF9kZXB0aCA8IGRlcHRoKQorICAgICptYXhfZGVwdGggPSBkZXB0aDsKK30KKworCitpbnQKK2dlbl9lbnRyeV9kZXB0aCAoZ2VuX2VudHJ5ICp0YWJsZSkKK3sKKyAgaW50IGRlcHRoID0gMDsKKyAgZ2VuX2VudHJ5X3RyYXZlcnNlX3RyZWUgKE5VTEwsCisJCQkgICB0YWJsZSwKKwkJCSAgIDEsCisJCQkgICBOVUxMLCAvKnN0YXJ0Ki8KKwkJCSAgIHVwZGF0ZV9kZXB0aCwKKwkJCSAgIE5VTEwsIC8qZW5kKi8KKwkJCSAgICZkZXB0aCk7IC8qIGRhdGEgKi8KKyAgcmV0dXJuIGRlcHRoOworfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9nZW5fZW50cnlfcGF0aCAobGluZV9yZWYgKmxpbmUsCisJCSAgICAgIGdlbl9lbnRyeSAqdGFibGUsCisJCSAgICAgIGVycm9yX2Z1bmMgKnByaW50KQoreworICBpZiAodGFibGUtPnBhcmVudCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGlmICh0YWJsZS0+dG9wLT5tb2RlbCAhPSBOVUxMKQorCXByaW50IChsaW5lLCAiJXMiLCB0YWJsZS0+dG9wLT5tb2RlbC0+bmFtZSk7CisgICAgICBlbHNlCisJcHJpbnQgKGxpbmUsICIiKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwcmludF9nZW5fZW50cnlfcGF0aCAobGluZSwgdGFibGUtPnBhcmVudCwgcHJpbnQpOworICAgICAgcHJpbnQgKE5VTEwsICIuJWQiLCB0YWJsZS0+b3Bjb2RlX25yKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9nZW5fZW50cnlfaW5zbnMgKGdlbl9lbnRyeSAqdGFibGUsCisJCSAgICAgICBlcnJvcl9mdW5jICpwcmludCwKKwkJICAgICAgIGNoYXIgKmZpcnN0X21lc3NhZ2UsCisJCSAgICAgICBjaGFyICpuZXh0X21lc3NhZ2UpCit7CisgIGluc25fbGlzdCAqaTsKKyAgY2hhciAqbWVzc2FnZTsKKyAgbWVzc2FnZSA9IGZpcnN0X21lc3NhZ2U7CisgIGZvciAoaSA9IHRhYmxlLT5pbnNuczsgaSAhPSBOVUxMOyBpID0gaS0+bmV4dCkKKyAgICB7CisgICAgICBpbnNuX2VudHJ5ICppbnNuID0gaS0+aW5zbjsKKyAgICAgIHByaW50X2dlbl9lbnRyeV9wYXRoIChpbnNuLT5saW5lLCB0YWJsZSwgcHJpbnQpOworICAgICAgcHJpbnQgKE5VTEwsICI6ICVzLiVzICVzXG4iLAorCSAgICAgaW5zbi0+Zm9ybWF0X25hbWUsCisJICAgICBpbnNuLT5uYW1lLAorCSAgICAgbWVzc2FnZSk7CisgICAgICBpZiAobmV4dF9tZXNzYWdlICE9IE5VTEwpCisJbWVzc2FnZSA9IG5leHRfbWVzc2FnZTsKKyAgICB9Cit9CisKKy8qIHNhbWUgYXMgc3RyY21wICovCitzdGF0aWMgaW50CitpbnNuX2ZpZWxkX2NtcCAoaW5zbl93b3JkX2VudHJ5ICpsLCBpbnNuX3dvcmRfZW50cnkgKnIpCit7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGludCBiaXRfbnI7CisgICAgICBpZiAobCA9PSBOVUxMICYmIHIgPT0gTlVMTCkKKwlyZXR1cm4gMDsgLyogYWxsIHByZXZpb3VzIGZpZWxkcyB0aGUgc2FtZSAqLworICAgICAgaWYgKGwgPT0gTlVMTCkKKwlyZXR1cm4gLTE7IC8qIGxlZnQgc2hvcnRlciB0aGFuIHJpZ2h0ICovCisgICAgICBpZiAociA9PSBOVUxMKQorCXJldHVybiArMTsgLyogbGVmdCBsb25nZXIgdGhhbiByaWdodCAqLworICAgICAgZm9yIChiaXRfbnIgPSAwOworCSAgIGJpdF9uciA8IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZTsKKwkgICBiaXRfbnIrKykKKwl7CisJICBpZiAobC0+Yml0W2JpdF9ucl0tPmZpZWxkLT50eXBlICE9IGluc25fZmllbGRfc3RyaW5nKQorCSAgICBjb250aW51ZTsKKwkgIGlmIChyLT5iaXRbYml0X25yXS0+ZmllbGQtPnR5cGUgIT0gaW5zbl9maWVsZF9zdHJpbmcpCisJICAgIGNvbnRpbnVlOworCSAgaWYgKGwtPmJpdFtiaXRfbnJdLT5maWVsZC0+Y29uZGl0aW9ucyA9PSBOVUxMKQorCSAgICBjb250aW51ZTsKKwkgIGlmIChyLT5iaXRbYml0X25yXS0+ZmllbGQtPmNvbmRpdGlvbnMgPT0gTlVMTCkKKwkgICAgY29udGludWU7CisJICBpZiAoMCkKKwkgICAgcHJpbnRmICgiJXMlcyVzIFZTICVzJXMlc1xuIiwKKwkJICAgIGwtPmJpdFtiaXRfbnJdLT5maWVsZC0+dmFsX3N0cmluZywKKwkJICAgIGwtPmJpdFtiaXRfbnJdLT5maWVsZC0+Y29uZGl0aW9ucy0+dGVzdCA9PSBpbnNuX2ZpZWxkX2NvbmRfZXEgPyAiPSIgOiAiISIsCisJCSAgICBsLT5iaXRbYml0X25yXS0+ZmllbGQtPmNvbmRpdGlvbnMtPnN0cmluZywJCisJCSAgICByLT5iaXRbYml0X25yXS0+ZmllbGQtPnZhbF9zdHJpbmcsCisJCSAgICByLT5iaXRbYml0X25yXS0+ZmllbGQtPmNvbmRpdGlvbnMtPnRlc3QgPT0gaW5zbl9maWVsZF9jb25kX2VxID8gIj0iIDogIiEiLAorCQkgICAgci0+Yml0W2JpdF9ucl0tPmZpZWxkLT5jb25kaXRpb25zLT5zdHJpbmcpOworCSAgaWYgKGwtPmJpdFtiaXRfbnJdLT5maWVsZC0+Y29uZGl0aW9ucy0+dGVzdCA9PSBpbnNuX2ZpZWxkX2NvbmRfZXEKKwkgICAgICAmJiByLT5iaXRbYml0X25yXS0+ZmllbGQtPmNvbmRpdGlvbnMtPnRlc3QgPT0gaW5zbl9maWVsZF9jb25kX2VxKQorCSAgICB7CisJICAgICAgaWYgKGwtPmJpdFtiaXRfbnJdLT5maWVsZC0+Y29uZGl0aW9ucy0+dHlwZSA9PSBpbnNuX2ZpZWxkX2NvbmRfZmllbGQKKwkJICAmJiByLT5iaXRbYml0X25yXS0+ZmllbGQtPmNvbmRpdGlvbnMtPnR5cGUgPT0gaW5zbl9maWVsZF9jb25kX2ZpZWxkKQorCQkvKiBzb21ld2hhdCBhcmJpdHJhcnkgKi8KKwkJeworCQkgIGludCBjbXAgPSBzdHJjbXAgKGwtPmJpdFtiaXRfbnJdLT5maWVsZC0+Y29uZGl0aW9ucy0+c3RyaW5nLAorCQkJCSAgICByLT5iaXRbYml0X25yXS0+ZmllbGQtPmNvbmRpdGlvbnMtPnN0cmluZyk7CisJCSAgaWYgKGNtcCAhPSAwKQorCQkgICAgcmV0dXJuIGNtcDsKKwkJICBlbHNlCisJCSAgICBjb250aW51ZTsKKwkJfQorCSAgICAgIGlmIChsLT5iaXRbYml0X25yXS0+ZmllbGQtPmNvbmRpdGlvbnMtPnR5cGUgPT0gaW5zbl9maWVsZF9jb25kX2ZpZWxkKQorCQlyZXR1cm4gKzE7CisJICAgICAgaWYgKHItPmJpdFtiaXRfbnJdLT5maWVsZC0+Y29uZGl0aW9ucy0+dHlwZSA9PSBpbnNuX2ZpZWxkX2NvbmRfZmllbGQpCisJCXJldHVybiAtMTsKKwkgICAgICAvKiBUaGUgY2FzZSBvZiBib3RoIGZpZWxkcyBoYXZpbmcgY29uc3RhbnQgdmFsdWVzIHNob3VsZCBoYXZlCisJCSBhbHJlYWR5IGhhdmUgYmVlbiBoYW5kbGVkIGJlY2F1c2Ugc3VjaCBmaWVsZHMgYXJlIGNvbnZlcnRlZAorCQkgaW50byBub3JtYWwgY29uc3RhbnQgZmllbGRzLiAqLworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICBpZiAobC0+Yml0W2JpdF9ucl0tPmZpZWxkLT5jb25kaXRpb25zLT50ZXN0ID09IGluc25fZmllbGRfY29uZF9lcSkKKwkgICAgcmV0dXJuICsxOyAvKiBsZWZ0ID0gb25seSAqLworCSAgaWYgKHItPmJpdFtiaXRfbnJdLT5maWVsZC0+Y29uZGl0aW9ucy0+dGVzdCA9PSBpbnNuX2ZpZWxkX2NvbmRfZXEpCisJICAgIHJldHVybiAtMTsgLyogcmlnaHQgPSBvbmx5ICovCisJICAvKiBGSVhNRTogTmVlZCB0byBzb21lIHdoYXQgYXJiaXRyYXJpbHkgb3JkZXIgY29uZGl0aW9uYWwgbGlzdHMgKi8KKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIGwgPSBsLT5uZXh0OworICAgICAgciA9IHItPm5leHQ7CisgICAgfQorfQorCisvKiBzYW1lIGFzIHN0cmNtcCAqLworc3RhdGljIGludAoraW5zbl93b3JkX2NtcCAoaW5zbl93b3JkX2VudHJ5ICpsLCBpbnNuX3dvcmRfZW50cnkgKnIpCit7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGludCBiaXRfbnI7CisgICAgICBpZiAobCA9PSBOVUxMICYmIHIgPT0gTlVMTCkKKwlyZXR1cm4gMDsgLyogYWxsIHByZXZpb3VzIGZpZWxkcyB0aGUgc2FtZSAqLworICAgICAgaWYgKGwgPT0gTlVMTCkKKwlyZXR1cm4gLTE7IC8qIGxlZnQgc2hvcnRlciB0aGFuIHJpZ2h0ICovCisgICAgICBpZiAociA9PSBOVUxMKQorCXJldHVybiArMTsgLyogbGVmdCBsb25nZXIgdGhhbiByaWdodCAqLworICAgICAgZm9yIChiaXRfbnIgPSAwOworCSAgIGJpdF9uciA8IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZTsKKwkgICBiaXRfbnIrKykKKwl7CisJICBpZiAobC0+Yml0W2JpdF9ucl0tPm1hc2sgPCByLT5iaXRbYml0X25yXS0+bWFzaykKKwkgICAgcmV0dXJuIC0xOworCSAgaWYgKGwtPmJpdFtiaXRfbnJdLT5tYXNrID4gci0+Yml0W2JpdF9ucl0tPm1hc2spCisJICAgIHJldHVybiAxOworCSAgaWYgKGwtPmJpdFtiaXRfbnJdLT52YWx1ZSA8IHItPmJpdFtiaXRfbnJdLT52YWx1ZSkKKwkgICAgcmV0dXJuIC0xOworCSAgaWYgKGwtPmJpdFtiaXRfbnJdLT52YWx1ZSA+IHItPmJpdFtiaXRfbnJdLT52YWx1ZSkKKwkgICAgcmV0dXJuIDE7CisJfQorICAgICAgbCA9IGwtPm5leHQ7CisgICAgICByID0gci0+bmV4dDsKKyAgICB9Cit9CisKKy8qIHNhbWUgYXMgc3RyY21wICovCitzdGF0aWMgaW50CitvcGNvZGVfYml0X2NtcCAob3Bjb2RlX2JpdHMgKmwsCisJCW9wY29kZV9iaXRzICpyKQoreworICBpZiAobCA9PSBOVUxMICYmIHIgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsgLyogYWxsIHByZXZpb3VzIGJpdHMgdGhlIHNhbWUgKi8KKyAgaWYgKGwgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7IC8qIGxlZnQgc2hvcnRlciB0aGFuIHJpZ2h0ICovCisgIGlmIChyID09IE5VTEwpCisgICAgcmV0dXJuICsxOyAvKiBsZWZ0IGxvbmdlciB0aGFuIHJpZ2h0ICovCisgIC8qIG1vc3Qgc2lnbmlmaWNhbnQgd29yZCAqLworICBpZiAobC0+ZmllbGQtPndvcmRfbnIgPCByLT5maWVsZC0+d29yZF9ucikKKyAgICByZXR1cm4gKzE7IC8qIGxlZnQgaGFzIG1vcmUgc2lnbmlmaWNhbnQgd29yZCAqLworICBpZiAobC0+ZmllbGQtPndvcmRfbnIgPiByLT5maWVsZC0+d29yZF9ucikKKyAgICByZXR1cm4gLTE7IC8qIHJpZ2h0IGhhcyBtb3JlIHNpZ25pZmljYW50IHdvcmQgKi8KKyAgLyogbW9zdCBzaWduaWZpY2FudCBiaXQ/ICovCisgIGlmIChsLT5maXJzdCA8IHItPmZpcnN0KQorICAgIHJldHVybiArMTsgLyogbGVmdCBhcyBtb3JlIHNpZ25pZmljYW50IGJpdCAqLworICBpZiAobC0+Zmlyc3QgPiByLT5maXJzdCkKKyAgICByZXR1cm4gLTE7IC8qIHJpZ2h0IGFzIG1vcmUgc2lnbmlmaWNhbnQgYml0ICovCisgIC8qIG5yIGJpdHM/ICovCisgIGlmIChsLT5sYXN0IDwgci0+bGFzdCkKKyAgICByZXR1cm4gKzE7IC8qIGxlZnQgYXMgbGVzcyBiaXRzICovCisgIGlmIChsLT5sYXN0ID4gci0+bGFzdCkKKyAgICByZXR1cm4gLTE7IC8qIHJpZ2h0IGFzIGxlc3MgYml0cyAqLworICAvKiB2YWx1ZT8gKi8KKyAgaWYgKGwtPnZhbHVlIDwgci0+dmFsdWUpCisgICAgcmV0dXJuIC0xOworICBpZiAobC0+dmFsdWUgPiByLT52YWx1ZSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKKworLyogc2FtZSBhcyBzdHJjbXAgKi8KK3N0YXRpYyBpbnQKK29wY29kZV9iaXRzX2NtcCAob3Bjb2RlX2JpdHMgKmwsCisJCSBvcGNvZGVfYml0cyAqcikKK3sKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaW50IGNtcDsKKyAgICAgIGlmIChsID09IE5VTEwgJiYgciA9PSBOVUxMKQorCXJldHVybiAwOyAvKiBhbGwgcHJldmlvdXMgYml0cyB0aGUgc2FtZSAqLworICAgICAgY21wID0gb3Bjb2RlX2JpdF9jbXAgKGwsIHIpOworICAgICAgaWYgKGNtcCAhPSAwKQorCXJldHVybiBjbXA7CisgICAgICBsID0gbC0+bmV4dDsKKyAgICAgIHIgPSByLT5uZXh0OworICAgIH0KK30KKworLyogc2FtZSBhcyBzdHJjbXAgKi8KK3N0YXRpYyBvcGNvZGVfYml0cyAqCituZXdfb3Bjb2RlX2JpdHMgKG9wY29kZV9iaXRzICpvbGRfYml0cywKKwkJIGludCB2YWx1ZSwKKwkJIGludCBmaXJzdCwKKwkJIGludCBsYXN0LAorCQkgaW5zbl9maWVsZF9lbnRyeSAqZmllbGQsCisJCSBvcGNvZGVfZmllbGQgKm9wY29kZSkKK3sKKyAgb3Bjb2RlX2JpdHMgKm5ld19iaXRzID0gWkFMTE9DIChvcGNvZGVfYml0cyk7CisgIG5ld19iaXRzLT5maWVsZCA9IGZpZWxkOworICBuZXdfYml0cy0+dmFsdWUgPSB2YWx1ZTsKKyAgbmV3X2JpdHMtPmZpcnN0ID0gZmlyc3Q7CisgIG5ld19iaXRzLT5sYXN0ID0gbGFzdDsKKyAgbmV3X2JpdHMtPm9wY29kZSA9IG9wY29kZTsKKyAgCisgIGlmIChvbGRfYml0cyAhPSBOVUxMKQorICAgIHsKKyAgICAgIG9wY29kZV9iaXRzICpuZXdfbGlzdDsKKyAgICAgIG9wY29kZV9iaXRzICoqbGFzdCA9ICZuZXdfbGlzdDsKKyAgICAgIG5ld19saXN0ID0gbmV3X29wY29kZV9iaXRzIChvbGRfYml0cy0+bmV4dCwKKwkJCQkgIG9sZF9iaXRzLT52YWx1ZSwKKwkJCQkgIG9sZF9iaXRzLT5maXJzdCwKKwkJCQkgIG9sZF9iaXRzLT5sYXN0LAorCQkJCSAgb2xkX2JpdHMtPmZpZWxkLAorCQkJCSAgb2xkX2JpdHMtPm9wY29kZSk7CisgICAgICB3aGlsZSAoKmxhc3QgIT0gTlVMTCkKKwl7CisJICBpbnQgY21wID0gb3Bjb2RlX2JpdF9jbXAgKG5ld19iaXRzLCAqbGFzdCk7CisJICBpZiAoY21wIDwgMCkgLyogbmV3IDwgbmV3X2xpc3QgKi8KKwkgICAgeworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBpZiAoY21wID09IDApCisJICAgIHsKKwkgICAgICBFUlJPUiAoIkR1cGxpY2F0ZWQgaW5zbiBiaXRzIGluIGxpc3QiKTsKKwkgICAgfQorCSAgbGFzdCA9ICYoKmxhc3QpLT5uZXh0OworCX0KKyAgICAgIG5ld19iaXRzLT5uZXh0ID0gKmxhc3Q7CisgICAgICAqbGFzdCA9IG5ld19iaXRzOworICAgICAgcmV0dXJuIG5ld19saXN0OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBuZXdfYml0czsKKyAgICB9Cit9CisKKworCisKK3R5cGVkZWYgZW51bSB7CisgIG1lcmdlX2R1cGxpY2F0ZV9pbnNucywKKyAgcmVwb3J0X2R1cGxpY2F0ZV9pbnNucywKK30gZHVwbGljYXRlX2luc25fYWN0aW9uczsKKworc3RhdGljIGluc25fbGlzdCAqCitpbnNuX2xpc3RfaW5zZXJ0IChpbnNuX2xpc3QgKipjdXJfaW5zbl9wdHIsCisJCSAgaW50ICpucl9pbnNucywKKwkJICBpbnNuX2VudHJ5ICppbnNuLAorCQkgIG9wY29kZV9iaXRzICpleHBhbmRlZF9iaXRzLAorCQkgIG9wY29kZV9maWVsZCAqb3Bjb2RlcywKKwkJICBpbnQgbnJfcHJlZmV0Y2hlZF93b3JkcywKKwkJICBkdXBsaWNhdGVfaW5zbl9hY3Rpb25zIGR1cGxpY2F0ZV9hY3Rpb24pCit7CisgIC8qIGluc2VydCBpdCBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyIG9mIHRoZSBmaWVsZHMgJiBiaXRzICovCisgIGZvciAoOyAoKmN1cl9pbnNuX3B0cikgIT0gTlVMTDsgY3VyX2luc25fcHRyID0gJigqY3VyX2luc25fcHRyKS0+bmV4dCkKKyAgICB7CisgICAgICBpbnQgY21wOworCisgICAgICAvKiBrZXkjMSBzb3J0IGFjY29yZGluZyB0byB0aGUgY29uc3RhbnQgZmllbGRzIG9mIGVhY2ggaW5zdHJ1Y3Rpb24gKi8KKyAgICAgIGNtcCA9IGluc25fd29yZF9jbXAgKGluc24tPndvcmRzLCAoKmN1cl9pbnNuX3B0ciktPmluc24tPndvcmRzKTsKKyAgICAgIGlmIChjbXAgPCAwKQorCWJyZWFrOworICAgICAgZWxzZSBpZiAoY21wID4gMCkKKwljb250aW51ZTsKKworICAgICAgLyoga2V5IzIgc29ydCBhY2NvcmRpbmcgdG8gdGhlIGV4cGFuZGVkIGJpdHMgb2YgZWFjaCBpbnN0cnVjdGlvbiAqLworICAgICAgY21wID0gb3Bjb2RlX2JpdHNfY21wIChleHBhbmRlZF9iaXRzLCAoKmN1cl9pbnNuX3B0ciktPmV4cGFuZGVkX2JpdHMpOworICAgICAgaWYgKGNtcCA8IDApCisJYnJlYWs7CisgICAgICBlbHNlIGlmIChjbXAgPiAwKQorCWNvbnRpbnVlOworCisgICAgICAvKiBrZXkjMyBzb3J0IGFjY29yZGluZyB0byB0aGUgbm9uLWNvbnN0YW50IGZpZWxkcyBvZiBlYWNoIGluc3RydWN0aW9uICovCisgICAgICBjbXAgPSBpbnNuX2ZpZWxkX2NtcCAoaW5zbi0+d29yZHMsICgqY3VyX2luc25fcHRyKS0+aW5zbi0+d29yZHMpOworICAgICAgaWYgKGNtcCA8IDApCisJYnJlYWs7CisgICAgICBlbHNlIGlmIChjbXAgPiAwKQorCWNvbnRpbnVlOworCisgICAgICAvKiBkdXBsaWNhdGUga2V5cywgcmVwb3J0IHByb2JsZW0gKi8KKyAgICAgIHN3aXRjaCAoZHVwbGljYXRlX2FjdGlvbikKKwl7CisJY2FzZSByZXBvcnRfZHVwbGljYXRlX2luc25zOgorCSAgLyogSXQgd291bGQgYXBwZWFyIHRoYXQgd2UgaGF2ZSB0d28gaW5zdHJ1Y3Rpb25zIHdpdGggdGhlCisJICAgICBzYW1lIGNvbnN0YW50IGZpZWxkIHZhbHVlcyBhY3Jvc3MgYWxsIHdvcmRzIGFuZCBiaXRzLgorCSAgICAgVGhpcyBlcnJvciBjYW4gYWxzbyBvY2N1cmUgd2hlbiBpbnNuX2ZpZWxkX2NtcCgpIGlzCisJICAgICBmYWlsaW5nIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0d28gaW5zdHJ1Y3Rpb25zIHRoYXQKKwkgICAgIGRpZmZlciBvbmx5IGluIHRoZWlyIGNvbmRpdGlvbmFsIGZpZWxkcy4gKi8KKwkgIHdhcm5pbmcgKGluc24tPmxpbmUsCisJCSAgICJUd28gaW5zdHJ1Y3Rpb25zIHdpdGggaWRlbnRpY2FsIGNvbnN0YW50IGZpZWxkc1xuIik7CisJICBlcnJvciAoKCpjdXJfaW5zbl9wdHIpLT5pbnNuLT5saW5lLAorCQkgIkxvY2F0aW9uIG9mIGR1cGxpY2F0ZSBpbnN0cnVjdGlvblxuIik7CisJY2FzZSBtZXJnZV9kdXBsaWNhdGVfaW5zbnM6CisJICAvKiBBZGQgdGhlIG9wY29kZSBwYXRoIHRvIHRoZSBpbnN0cnVjdGlvbnMgbGlzdCAqLworCSAgaWYgKG9wY29kZXMgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGluc25fb3Bjb2RlcyAqKmxhc3QgPSAmKCpjdXJfaW5zbl9wdHIpLT5vcGNvZGVzOworCSAgICAgIHdoaWxlICgqbGFzdCAhPSBOVUxMKQorCQl7CisJCSAgbGFzdCA9ICYoKmxhc3QpLT5uZXh0OworCQl9CisJICAgICAgKCpsYXN0KSA9IFpBTExPQyAoaW5zbl9vcGNvZGVzKTsKKwkgICAgICAoKmxhc3QpLT5vcGNvZGUgPSBvcGNvZGVzOworCSAgICB9CisJICAvKiBVc2UgdGhlIGxhcmdlciBucl9wcmVmZXRjaGVkX3dvcmRzICovCisJICBpZiAoKCpjdXJfaW5zbl9wdHIpLT5ucl9wcmVmZXRjaGVkX3dvcmRzIDwgbnJfcHJlZmV0Y2hlZF93b3JkcykKKwkgICAgKCpjdXJfaW5zbl9wdHIpLT5ucl9wcmVmZXRjaGVkX3dvcmRzID0gbnJfcHJlZmV0Y2hlZF93b3JkczsKKwkgIHJldHVybiAoKmN1cl9pbnNuX3B0cik7CisJfQorCisgICAgfQorICAKKyAgLyogY3JlYXRlIGEgbmV3IGxpc3QgZW50cnkgYW5kIGluc2VydCBpdCAqLworICB7CisgICAgaW5zbl9saXN0ICpuZXdfaW5zbiA9IFpBTExPQyAoaW5zbl9saXN0KTsKKyAgICBuZXdfaW5zbi0+aW5zbiA9IGluc247CisgICAgbmV3X2luc24tPmV4cGFuZGVkX2JpdHMgPSBleHBhbmRlZF9iaXRzOworICAgIG5ld19pbnNuLT5uZXh0ID0gKCpjdXJfaW5zbl9wdHIpOworICAgIG5ld19pbnNuLT5ucl9wcmVmZXRjaGVkX3dvcmRzID0gbnJfcHJlZmV0Y2hlZF93b3JkczsKKyAgICBpZiAob3Bjb2RlcyAhPSBOVUxMKQorICAgICAgeworCW5ld19pbnNuLT5vcGNvZGVzID0gWkFMTE9DIChpbnNuX29wY29kZXMpOworCW5ld19pbnNuLT5vcGNvZGVzLT5vcGNvZGUgPSBvcGNvZGVzOworICAgICAgfQorICAgICgqY3VyX2luc25fcHRyKSA9IG5ld19pbnNuOworICB9CisgIAorICAqbnJfaW5zbnMgKz0gMTsKKworICByZXR1cm4gKCpjdXJfaW5zbl9wdHIpOworfQorCisKK2V4dGVybiB2b2lkCitnZW5fZW50cnlfdHJhdmVyc2VfdHJlZSAobGYgKmZpbGUsCisJCQkgZ2VuX2VudHJ5ICp0YWJsZSwKKwkJCSBpbnQgZGVwdGgsCisJCQkgZ2VuX2VudHJ5X2hhbmRsZXIgKnN0YXJ0LAorCQkJIGdlbl9lbnRyeV9oYW5kbGVyICpsZWFmLAorCQkJIGdlbl9lbnRyeV9oYW5kbGVyICplbmQsCisJCQkgdm9pZCAqZGF0YSkKK3sKKyAgZ2VuX2VudHJ5ICplbnRyeTsKKyAgCisgIEFTU0VSVCAodGFibGUgIT0gTlVMTCk7CisgIEFTU0VSVCAodGFibGUtPm9wY29kZSAhPSBOVUxMKTsKKyAgQVNTRVJUICh0YWJsZS0+bnJfZW50cmllcyA+IDApOworICBBU1NFUlQgKHRhYmxlLT5lbnRyaWVzICE9IDApOworICAKKyAgLyogcHJlZml4ICovCisgIGlmIChzdGFydCAhPSBOVUxMICYmIGRlcHRoID49IDApCisgICAgeworICAgICAgc3RhcnQgKGZpbGUsIHRhYmxlLCBkZXB0aCwgZGF0YSk7CisgICAgfQorICAvKiBpbmZpeCBsZWF2ZXMgKi8KKyAgZm9yIChlbnRyeSA9IHRhYmxlLT5lbnRyaWVzOworICAgICAgIGVudHJ5ICE9IE5VTEw7CisgICAgICAgZW50cnkgPSBlbnRyeS0+c2libGluZykKKyAgICB7CisgICAgICBpZiAoZW50cnktPmVudHJpZXMgIT0gTlVMTCAmJiBkZXB0aCAhPSAwKQorCXsKKwkgIGdlbl9lbnRyeV90cmF2ZXJzZV90cmVlIChmaWxlLCBlbnRyeSwgZGVwdGggKyAxLAorCQkJCSAgIHN0YXJ0LCBsZWFmLCBlbmQsIGRhdGEpOworCX0KKyAgICAgIGVsc2UgaWYgKGRlcHRoID49IDApCisJeworCSAgaWYgKGxlYWYgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGxlYWYgKGZpbGUsIGVudHJ5LCBkZXB0aCwgZGF0YSk7CisJICAgIH0KKwl9CisgICAgfQorICAvKiBwb3N0Zml4ICovCisgIGlmIChlbmQgIT0gTlVMTCAmJiBkZXB0aCA+PSAwKQorICAgIHsKKyAgICAgIGVuZCAoZmlsZSwgdGFibGUsIGRlcHRoLCBkYXRhKTsKKyAgICB9Cit9CisKKworCisvKiBjcmVhdGUgYSBsaXN0IGVsZW1lbnQgY29udGFpbmluZyBhIHNpbmdsZSBnZW5fdGFibGUgZW50cnkgKi8KKworc3RhdGljIGdlbl9saXN0ICoKK21ha2VfdGFibGUgKGluc25fdGFibGUgKmlzYSwKKwkgICAgZGVjb2RlX3RhYmxlICpydWxlcywKKwkgICAgbW9kZWxfZW50cnkgKm1vZGVsKQoreworICBpbnNuX2VudHJ5ICppbnNuOworICBnZW5fbGlzdCAqZW50cnkgPSBaQUxMT0MgKGdlbl9saXN0KTsKKyAgZW50cnktPnRhYmxlID0gWkFMTE9DIChnZW5fZW50cnkpOworICBlbnRyeS0+dGFibGUtPnRvcCA9IGVudHJ5OworICBlbnRyeS0+bW9kZWwgPSBtb2RlbDsKKyAgZW50cnktPmlzYSA9IGlzYTsKKyAgZm9yIChpbnNuID0gaXNhLT5pbnNuczsgaW5zbiAhPSBOVUxMOyBpbnNuID0gaW5zbi0+bmV4dCkKKyAgICB7CisgICAgICBpZiAobW9kZWwgPT0gTlVMTAorCSAgfHwgaW5zbi0+cHJvY2Vzc29ycyA9PSBOVUxMCisJICB8fCBmaWx0ZXJfaXNfbWVtYmVyIChpbnNuLT5wcm9jZXNzb3JzLCBtb2RlbC0+bmFtZSkpCisJeworCSAgaW5zbl9saXN0X2luc2VydCAoJmVudHJ5LT50YWJsZS0+aW5zbnMsCisJCQkgICAgJmVudHJ5LT50YWJsZS0+bnJfaW5zbnMsCisJCQkgICAgaW5zbiwKKwkJCSAgICBOVUxMLCAvKiBleHBhbmRlZF9iaXRzIC0gbm9uZSB5ZXQgKi8KKwkJCSAgICBOVUxMLCAvKiBvcGNvZGVzIC0gbm9uZSB5ZXQgKi8KKwkJCSAgICAwLCAvKiBucl9wcmVmZXRjaGVkX3dvcmRzIC0gbm9uZSB5ZXQgKi8KKwkJCSAgICByZXBvcnRfZHVwbGljYXRlX2luc25zKTsKKwl9CisgICAgfQorICBlbnRyeS0+dGFibGUtPm9wY29kZV9ydWxlID0gcnVsZXM7CisgIHJldHVybiBlbnRyeTsKK30KKworCitnZW5fdGFibGUgKgorbWFrZV9nZW5fdGFibGVzIChpbnNuX3RhYmxlICppc2EsCisJCSBkZWNvZGVfdGFibGUgKnJ1bGVzKQoreworICBnZW5fdGFibGUgKmdlbiA9IFpBTExPQyAoZ2VuX3RhYmxlKTsKKyAgZ2VuLT5pc2EgPSBpc2E7CisgIGdlbi0+cnVsZXMgPSBydWxlczsKKyAgaWYgKG9wdGlvbnMuZ2VuLm11bHRpX3NpbSkKKyAgICB7CisgICAgICBnZW5fbGlzdCAqKmxhc3QgPSAmZ2VuLT50YWJsZXM7CisgICAgICBtb2RlbF9lbnRyeSAqbW9kZWw7CisgICAgICBmaWx0ZXIgKnByb2Nlc3NvcnM7CisgICAgICBpZiAob3B0aW9ucy5tb2RlbF9maWx0ZXIgIT0gTlVMTCkKKwlwcm9jZXNzb3JzID0gb3B0aW9ucy5tb2RlbF9maWx0ZXI7CisgICAgICBlbHNlCisJcHJvY2Vzc29ycyA9IGlzYS0+bW9kZWwtPnByb2Nlc3NvcnM7CisgICAgICBmb3IgKG1vZGVsID0gaXNhLT5tb2RlbC0+bW9kZWxzOworCSAgIG1vZGVsICE9IE5VTEw7CisJICAgbW9kZWwgPSBtb2RlbC0+bmV4dCkKKwl7CisJICBpZiAoZmlsdGVyX2lzX21lbWJlciAocHJvY2Vzc29ycywgbW9kZWwtPm5hbWUpKQorCSAgICB7CisJICAgICAgKmxhc3QgPSBtYWtlX3RhYmxlIChpc2EsIHJ1bGVzLCBtb2RlbCk7CisJICAgICAgbGFzdCA9ICYoKmxhc3QpLT5uZXh0OworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGdlbi0+dGFibGVzID0gbWFrZV90YWJsZSAoaXNhLCBydWxlcywgTlVMTCk7CisgICAgfQorICByZXR1cm4gZ2VuOworfQorICAKKyAgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIDAKK3R5cGVkZWYgZW51bSB7CisgIGZpZWxkX2lzX25vdF9jb25zdGFudCA9IDAsCisgIGZpZWxkX2NvbnN0YW50X2ludCA9IDEsCisgIGZpZWxkX2NvbnN0YW50X3Jlc2VydmVkID0gMiwKKyAgZmllbGRfY29uc3RhbnRfc3RyaW5nID0gMworfSBjb25zdGFudF9maWVsZF90eXBlczsKKworc3RhdGljIGNvbnN0YW50X2ZpZWxkX3R5cGVzCitpbnNuX2ZpZWxkX2lzX2NvbnN0YW50IChpbnNuX2ZpZWxkICpmaWVsZCwKKwkJICAgICAgICBkZWNvZGVfdGFibGUgKnJ1bGUpCit7CisgIHN3aXRjaCAoZmllbGQtPnR5cGUpCisgICAgeworICAgIGNhc2UgaW5zbl9maWVsZF9pbnQ6CisgICAgICAvKiBmaWVsZCBpcyBhbiBpbnRlZ2VyICovCisgICAgICByZXR1cm4gZmllbGRfY29uc3RhbnRfaW50OworICAgIGNhc2UgaW5zbl9maWVsZF9yZXNlcnZlZDoKKyAgICAgIC8qIGZpZWxkIGlzIGAvJyBhbmQgdHJlYXRpbmcgdGhhdCBhcyBhIGNvbnN0YW50ICovCisgICAgICBpZiAocnVsZS0+d2l0aF96ZXJvX3Jlc2VydmVkKQorCXJldHVybiBmaWVsZF9jb25zdGFudF9yZXNlcnZlZDsKKyAgICAgIGVsc2UKKwlyZXR1cm4gZmllbGRfaXNfbm90X2NvbnN0YW50OworICAgIGNhc2UgaW5zbl9maWVsZF93aWxkOgorICAgICAgcmV0dXJuIGZpZWxkX2lzX25vdF9jb25zdGFudDsgLyogbmV2ZXIgY29uc3RhbnQgKi8KKyAgICBjYXNlIGluc25fZmllbGRfc3RyaW5nOgorICAgICAgLyogZmllbGQsIHRob3VnaCB2YXJpYWJsZSwgaXMgb24gdGhlIGxpc3Qgb2YgZm9yY2VkIGNvbnN0YW50cyAqLworICAgICAgaWYgKGZpbHRlcl9pc19tZW1iZXIgKHJ1bGUtPmNvbnN0YW50X2ZpZWxkX25hbWVzLCBmaWVsZC0+dmFsX3N0cmluZykpCisJcmV0dXJuIGZpZWxkX2NvbnN0YW50X3N0cmluZzsKKyAgICAgIGVsc2UKKwlyZXR1cm4gZmllbGRfaXNfbm90X2NvbnN0YW50OworICAgIH0KKyAgRVJST1IgKCJJbnRlcm5hbCBlcnJvciIpOworICByZXR1cm4gZmllbGRfaXNfbm90X2NvbnN0YW50OworfQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogSXMgdGhlIGJpdCwgYWNjb3JkaW5nIHRvIHRoZSBkZWNvZGUgcnVsZSwgaWRlbnRpY2FsIGFjcm9zcyBhbGwgdGhlCisgICBpbnN0cnVjdGlvbnM/ICovCitzdGF0aWMgaW50CitpbnNuc19iaXRfdXNlbGVzcyAoaW5zbl9saXN0ICppbnNucywKKwkJICAgZGVjb2RlX3RhYmxlICpydWxlLAorCQkgICBpbnQgYml0X25yKQoreworICBpbnNuX2xpc3QgKmVudHJ5OworICBpbnQgdmFsdWUgPSAtMTsKKyAgaW50IGlzX3VzZWxlc3MgPSAxOyAvKiBjbGVhcmVkIGlmIHNvbWV0aGluZyBhY3R1YWxseSBmb3VuZCAqLworCisgIC8qIGNoZWNrIHRoZSBpbnN0cnVjdGlvbnMgZm9yIHNvbWUgY29uc3RhbnQgdmFsdWUgaW4gYXQgbGVhc3Qgb25lIG9mCisgICAgIHRoZSBiaXQgZmllbGRzICovCisgIGZvciAoZW50cnkgPSBpbnNuczsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBlbnRyeS0+bmV4dCkKKyAgICB7CisgICAgICBpbnNuX3dvcmRfZW50cnkgKndvcmQgPSBlbnRyeS0+aW5zbi0+d29yZFtydWxlLT53b3JkX25yXTsKKyAgICAgIGluc25fYml0X2VudHJ5ICpiaXQgPSB3b3JkLT5iaXRbYml0X25yXTsKKyAgICAgIHN3aXRjaCAoYml0LT5maWVsZC0+dHlwZSkKKwl7CisJY2FzZSBpbnNuX2ZpZWxkX2ludmFsaWQ6CisJICBBU1NFUlQgKDApOworCSAgYnJlYWs7CisJY2FzZSBpbnNuX2ZpZWxkX3dpbGQ6CisJY2FzZSBpbnNuX2ZpZWxkX3Jlc2VydmVkOgorCSAgLyogbmVpdGhlciB1c2VsZXNzIG9yIHVzZWZ1bCAtIGlnbm9yZSAqLworCSAgYnJlYWs7CisJY2FzZSBpbnNuX2ZpZWxkX2ludDoKKwkgIHN3aXRjaCAocnVsZS0+c2VhcmNoKQorCSAgICB7CisJICAgIGNhc2UgZGVjb2RlX2ZpbmRfc3RyaW5nczoKKwkgICAgICAvKiBhbiBpbnRlZ2VyIGlzbid0IGEgc3RyaW5nICovCisJICAgICAgcmV0dXJuIDE7CisJICAgIGNhc2UgZGVjb2RlX2ZpbmRfY29uc3RhbnRzOgorCSAgICBjYXNlIGRlY29kZV9maW5kX21peGVkOgorCSAgICAgIC8qIGFuIGludGVnZXIgaXMgdXNlZnVsIGlmIGl0cyB2YWx1ZSBpc24ndCB0aGUgc2FtZQorICAgICAgICAgICAgICAgICBiZXR3ZWVuIGFsbCBpbnN0cnVjdGlvbnMuICBUaGUgZmlyc3QgdGltZSB0aHJvdWdoIHRoZQorICAgICAgICAgICAgICAgICB2YWx1ZSBpcyBzYXZlZCwgdGhlIHNlY29uZCB0aW1lIHRocm91Z2ggKGlmIHRoZQorICAgICAgICAgICAgICAgICB2YWx1ZXMgZGlmZmVyKSBpdCBpcyBtYXJrZWQgYXMgdXNlZnVsLiAqLworCSAgICAgIGlmICh2YWx1ZSA8IDApCisJCXZhbHVlID0gYml0LT52YWx1ZTsKKwkgICAgICBlbHNlIGlmICh2YWx1ZSAhPSBiaXQtPnZhbHVlKQorCQlpc191c2VsZXNzID0gMDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBpbnNuX2ZpZWxkX3N0cmluZzoKKwkgIHN3aXRjaCAocnVsZS0+c2VhcmNoKQorCSAgICB7CisJICAgIGNhc2UgZGVjb2RlX2ZpbmRfc3RyaW5nczoKKwkgICAgICAvKiBhdCBsZWFzdCBvbmUgc3RyaW5nLCBrZWVwIGNoZWNraW5nICovCisJICAgICAgaXNfdXNlbGVzcyA9IDA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgZGVjb2RlX2ZpbmRfY29uc3RhbnRzOgorCSAgICBjYXNlIGRlY29kZV9maW5kX21peGVkOgorCSAgICAgIGlmIChmaWx0ZXJfaXNfbWVtYmVyIChydWxlLT5jb25zdGFudF9maWVsZF9uYW1lcywKKwkJCQkgICAgYml0LT5maWVsZC0+dmFsX3N0cmluZykpCisJCS8qIGEgc3RyaW5nIGZpZWxkIGZvcmNlZCB0byBjb25zdGFudD8gKi8KKwkJaXNfdXNlbGVzcyA9IDA7CisJICAgICAgZWxzZSBpZiAocnVsZS0+c2VhcmNoID09IGRlY29kZV9maW5kX2NvbnN0YW50cykKKwkJLyogdGhlIHN0cmluZyBmaWVsZCBpc24ndCBjb25zdGFudCAqLworCQlyZXR1cm4gMTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLyogR2l2ZW4gb25seSBvbmUgY29uc3RhbnQgdmFsdWUgaGFzIGJlZW4gZm91bmQsIGNoZWNrIHRocm91Z2ggYWxsCisgICAgIHRoZSBpbnN0cnVjdGlvbnMgdG8gc2VlIGlmIGF0IGxlYXN0IG9uZSBjb25kaXRpb25hbCBtYWtlcyBpdAorICAgICB1c2VmdWxsICovCisgIGlmICh2YWx1ZSA+PSAwICYmIGlzX3VzZWxlc3MpCisgICAgeworICAgICAgZm9yIChlbnRyeSA9IGluc25zOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQorCXsKKwkgIGluc25fd29yZF9lbnRyeSAqd29yZCA9IGVudHJ5LT5pbnNuLT53b3JkW3J1bGUtPndvcmRfbnJdOworCSAgaW5zbl9iaXRfZW50cnkgKmJpdCA9IHdvcmQtPmJpdFtiaXRfbnJdOworCSAgc3dpdGNoIChiaXQtPmZpZWxkLT50eXBlKQorCSAgICB7CisJICAgIGNhc2UgaW5zbl9maWVsZF9pbnZhbGlkOgorCSAgICAgIEFTU0VSVCAoMCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgaW5zbl9maWVsZF93aWxkOgorCSAgICBjYXNlIGluc25fZmllbGRfcmVzZXJ2ZWQ6CisJICAgIGNhc2UgaW5zbl9maWVsZF9pbnQ6CisJICAgICAgLyogYWxyZWFkeSBwcm9jZXNzZWQgKi8KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBpbnNuX2ZpZWxkX3N0cmluZzoKKwkgICAgICBzd2l0Y2ggKHJ1bGUtPnNlYXJjaCkKKwkJeworCQljYXNlIGRlY29kZV9maW5kX3N0cmluZ3M6CisJCWNhc2UgZGVjb2RlX2ZpbmRfY29uc3RhbnRzOgorCQkgIC8qIGFscmVhZHkgcHJvY2Vzc2VkICovCisJCSAgYnJlYWs7CisJCWNhc2UgZGVjb2RlX2ZpbmRfbWl4ZWQ6CisJCSAgLyogc3RyaW5nIGZpZWxkIHdpdGggY29uZGl0aW9ucy4gIElmIHRoaXMgY29uZGl0aW9uCisgICAgICAgICAgICAgICAgICAgICBlbGltaW5hdGVzIHRoZSB2YWx1ZSB0aGVuIHRoZSBjb21wYXJlIGlzIHVzZWZ1bCAqLworCQkgIGlmIChiaXQtPmZpZWxkLT5jb25kaXRpb25zICE9IE5VTEwpCisJCSAgICB7CisJCSAgICAgIGluc25fZmllbGRfY29uZCAqY29uZGl0aW9uOworCQkgICAgICBpbnQgc2hpZnQgPSBiaXQtPmZpZWxkLT5sYXN0IC0gYml0X25yOworCQkgICAgICBmb3IgKGNvbmRpdGlvbiA9IGJpdC0+ZmllbGQtPmNvbmRpdGlvbnM7CisJCQkgICBjb25kaXRpb24gIT0gTlVMTDsKKwkJCSAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi0+bmV4dCkKKwkJCXsKKwkJCSAgc3dpdGNoIChjb25kaXRpb24tPnR5cGUpCisJCQkgICAgeworCQkJICAgIGNhc2UgaW5zbl9maWVsZF9jb25kX3ZhbHVlOgorCQkJICAgICAgc3dpdGNoIChjb25kaXRpb24tPnRlc3QpCisJCQkJeworCQkJCWNhc2UgaW5zbl9maWVsZF9jb25kX25lOgorCQkJCSAgaWYgKCgoY29uZGl0aW9uLT52YWx1ZSA+PiBzaGlmdCkgJiAxKQorCQkJCSAgICAgID09ICh1bnNpZ25lZCkgdmFsdWUpCisJCQkJICAgIC8qIGNvbmRpdGlvbmFsIGZpZWxkIGV4Y2x1ZGVzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCB2YWx1ZSAqLworCQkJCSAgICBpc191c2VsZXNzID0gMDsKKwkJCQkgIGJyZWFrOworCQkJCWNhc2UgaW5zbl9maWVsZF9jb25kX2VxOgorCQkJCSAgaWYgKCgoY29uZGl0aW9uLT52YWx1ZSA+PiBzaGlmdCkgJiAxKQorCQkJCSAgICAgICE9ICh1bnNpZ25lZCkgdmFsdWUpCisJCQkJICAgIC8qIGNvbmRpdGlvbmFsIGZpZWxkIHJlcXVpcmVzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCB2YWx1ZSAqLworCQkJCSAgICBpc191c2VsZXNzID0gMDsKKwkJCQkgIGJyZWFrOworCQkJCX0KKwkJCSAgICAgIGJyZWFrOworCQkJICAgIGNhc2UgaW5zbl9maWVsZF9jb25kX2ZpZWxkOgorCQkJICAgICAgLyogYXJlIHRoZXNlIGhhbmRsZWQgc2VwYXJhdGx5PyAqLworCQkJICAgICAgYnJlYWs7CisJCQkgICAgfQorCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiBpc191c2VsZXNzOworfQorCisKKy8qIGdvIHRocm91Z2ggYSBnZW4tdGFibGUncyBsaXN0IG9mIGluc3RydWN0aW9uIGZvcm1hdHMgbG9va2luZyBmb3IgYQorICAgcmFuZ2Ugb2YgYml0cyB0aGF0IG1lZXQgdGhlIGRlY29kZSB0YWJsZSBSVUxFcyByZXF1aXJlbWVudHMgKi8KKworc3RhdGljIG9wY29kZV9maWVsZCAqCitnZW5fZW50cnlfZmluZF9vcGNvZGVfZmllbGQgKGluc25fbGlzdCAqaW5zbnMsCisJCQkgICAgIGRlY29kZV90YWJsZSAqcnVsZSwKKwkJCSAgICAgaW50IHN0cmluZ19vbmx5KQoreworICBvcGNvZGVfZmllbGQgY3Vycl9vcGNvZGU7CisgIEFTU0VSVCAocnVsZSAhPSBOVUxMKTsKKworICBtZW1zZXQgKCZjdXJyX29wY29kZSwgMCwgc2l6ZW9mIChjdXJyX29wY29kZSkpOworICBjdXJyX29wY29kZS53b3JkX25yID0gcnVsZS0+d29yZF9ucjsKKyAgY3Vycl9vcGNvZGUuZmlyc3QgPSBydWxlLT5maXJzdDsKKyAgY3Vycl9vcGNvZGUubGFzdCA9IHJ1bGUtPmxhc3Q7CisKKyAgLyogVHJ5IHRvIHJlZHVjZSB0aGUgc2l6ZSBvZiBmaXJzdC4ubGFzdCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCisgICAgIGRlY29kZSBydWxlcyAqLworCisgIHdoaWxlIChjdXJyX29wY29kZS5maXJzdCA8PSBydWxlLT5sYXN0KQorICAgIHsKKyAgICAgIGlmIChpbnNuc19iaXRfdXNlbGVzcyAoaW5zbnMsIHJ1bGUsIGN1cnJfb3Bjb2RlLmZpcnN0KSkKKwljdXJyX29wY29kZS5maXJzdCArKzsKKyAgICAgIGVsc2UKKwlicmVhazsKKyAgICB9CisgIHdoaWxlIChjdXJyX29wY29kZS5sYXN0ID49IHJ1bGUtPmZpcnN0KQorICAgIHsKKyAgICAgIGlmIChpbnNuc19iaXRfdXNlbGVzcyAoaW5zbnMsIHJ1bGUsIGN1cnJfb3Bjb2RlLmxhc3QpKQorCWN1cnJfb3Bjb2RlLmxhc3QgLS07CisgICAgICBlbHNlCisJYnJlYWs7CisgICAgfQorCisKKyNpZiAwCisgIGZvciAoZW50cnkgPSBpbnNuczsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBlbnRyeS0+bmV4dCkKKyAgICB7CisgICAgICBpbnNuX3dvcmRfZW50cnkgKmZpZWxkcyA9IGVudHJ5LT5pbnNuLT53b3JkW3J1bGUtPndvcmRfbnJdOworICAgICAgb3Bjb2RlX2ZpZWxkIG5ld19vcGNvZGU7CisgICAgICAKKyAgICAgIEFTU0VSVCAoZmllbGRzICE9IE5VTEwpOworICAgICAgCisgICAgICAvKiBmaW5kIGEgc3RhcnQgcG9pbnQgZm9yIHRoZSBvcGNvZGUgZmllbGQgKi8KKyAgICAgIG5ld19vcGNvZGUuZmlyc3QgPSBydWxlLT5maXJzdDsKKyAgICAgIHdoaWxlIChuZXdfb3Bjb2RlLmZpcnN0IDw9IHJ1bGUtPmxhc3QKKwkgICAgICYmICghc3RyaW5nX29ubHkKKwkJIHx8IChpbnNuX2ZpZWxkX2lzX2NvbnN0YW50KGZpZWxkcy0+Yml0W25ld19vcGNvZGUuZmlyc3RdLCBydWxlKQorCQkgICAgICE9IGZpZWxkX2NvbnN0YW50X3N0cmluZykpCisJICAgICAmJiAoc3RyaW5nX29ubHkKKwkJIHx8IChpbnNuX2ZpZWxkX2lzX2NvbnN0YW50KGZpZWxkcy0+Yml0W25ld19vcGNvZGUuZmlyc3RdLCBydWxlKQorCQkgICAgID09IGZpZWxkX2lzX25vdF9jb25zdGFudCkpKQorCXsKKwkgIGludCBuZXdfZmlyc3QgPSBmaWVsZHMtPmJpdFtuZXdfb3Bjb2RlLmZpcnN0XS0+bGFzdCArIDE7CisJICBBU1NFUlQgKG5ld19maXJzdCA+IG5ld19vcGNvZGUuZmlyc3QpOworCSAgbmV3X29wY29kZS5maXJzdCA9IG5ld19maXJzdDsKKwl9CisgICAgICBBU1NFUlQobmV3X29wY29kZS5maXJzdCA+IHJ1bGUtPmxhc3QKKwkgICAgIHx8IChzdHJpbmdfb25seQorCQkgJiYgaW5zbl9maWVsZF9pc19jb25zdGFudChmaWVsZHMtPmJpdFtuZXdfb3Bjb2RlLmZpcnN0XSwKKwkJCQkJICAgcnVsZSkgPT0gZmllbGRfY29uc3RhbnRfc3RyaW5nKQorCSAgICAgfHwgKCFzdHJpbmdfb25seQorCQkgJiYgaW5zbl9maWVsZF9pc19jb25zdGFudChmaWVsZHMtPmJpdFtuZXdfb3Bjb2RlLmZpcnN0XSwKKwkJCQkJICAgcnVsZSkpKTsKKyAgICAgIAorICAgICAgLyogZmluZCB0aGUgZW5kIHBvaW50IGZvciB0aGUgb3Bjb2RlIGZpZWxkICovCisgICAgICBuZXdfb3Bjb2RlLmxhc3QgPSBydWxlLT5sYXN0OworICAgICAgd2hpbGUgKG5ld19vcGNvZGUubGFzdCA+PSBydWxlLT5maXJzdAorCSAgICAgJiYgKCFzdHJpbmdfb25seQorCQkgfHwgaW5zbl9maWVsZF9pc19jb25zdGFudChmaWVsZHMtPmJpdFtuZXdfb3Bjb2RlLmxhc3RdLAorCQkJCQkgICBydWxlKSAhPSBmaWVsZF9jb25zdGFudF9zdHJpbmcpCisJICAgICAmJiAoc3RyaW5nX29ubHkKKwkJIHx8ICFpbnNuX2ZpZWxkX2lzX2NvbnN0YW50KGZpZWxkcy0+Yml0W25ld19vcGNvZGUubGFzdF0sCisJCQkJCSAgICBydWxlKSkpCisJeworCSAgaW50IG5ld19sYXN0ID0gZmllbGRzLT5iaXRbbmV3X29wY29kZS5sYXN0XS0+Zmlyc3QgLSAxOworCSAgQVNTRVJUIChuZXdfbGFzdCA8IG5ld19vcGNvZGUubGFzdCk7CisJICBuZXdfb3Bjb2RlLmxhc3QgPSBuZXdfbGFzdDsKKwl9CisgICAgICBBU1NFUlQobmV3X29wY29kZS5sYXN0IDwgcnVsZS0+Zmlyc3QKKwkgICAgIHx8IChzdHJpbmdfb25seQorCQkgJiYgaW5zbl9maWVsZF9pc19jb25zdGFudChmaWVsZHMtPmJpdFtuZXdfb3Bjb2RlLmxhc3RdLAorCQkJCQkgICBydWxlKSA9PSBmaWVsZF9jb25zdGFudF9zdHJpbmcpCisJICAgICB8fCAoIXN0cmluZ19vbmx5CisJCSAmJiBpbnNuX2ZpZWxkX2lzX2NvbnN0YW50KGZpZWxkcy0+Yml0W25ld19vcGNvZGUubGFzdF0sCisJCQkJCSAgIHJ1bGUpKSk7CisgICAgICAKKyAgICAgIC8qIG5vdyBzZWUgaWYgb3VyIGN1cnJlbnQgb3Bjb2RlIG5lZWRzIGV4cGFuZGluZyB0byBpbmNsdWRlIHRoZQorCSBpbnRlcmVzdGluZyBmaWVsZHMgd2l0aGluIHRoaXMgaW5zdHJ1Y3Rpb24gKi8KKyAgICAgIGlmIChuZXdfb3Bjb2RlLmZpcnN0IDw9IHJ1bGUtPmxhc3QKKwkgICYmIGN1cnJfb3Bjb2RlLmZpcnN0ID4gbmV3X29wY29kZS5maXJzdCkKKwljdXJyX29wY29kZS5maXJzdCA9IG5ld19vcGNvZGUuZmlyc3Q7CisgICAgICBpZiAobmV3X29wY29kZS5sYXN0ID49IHJ1bGUtPmZpcnN0CisJICAmJiBjdXJyX29wY29kZS5sYXN0IDwgbmV3X29wY29kZS5sYXN0KQorCWN1cnJfb3Bjb2RlLmxhc3QgPSBuZXdfb3Bjb2RlLmxhc3Q7CisgICAgICAKKyAgICB9CisjZW5kaWYKKworICAvKiBkaWQgdGhlIGZpbmFsIG9wY29kZSBmaWVsZCBlbmQgdXAgYmVpbmcgZW1wdHk/ICovCisgIGlmIChjdXJyX29wY29kZS5maXJzdCA+IGN1cnJfb3Bjb2RlLmxhc3QpCisgICAgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICBBU1NFUlQgKGN1cnJfb3Bjb2RlLmxhc3QgPj0gcnVsZS0+Zmlyc3QpOworICBBU1NFUlQgKGN1cnJfb3Bjb2RlLmZpcnN0IDw9IHJ1bGUtPmxhc3QpOworICBBU1NFUlQgKGN1cnJfb3Bjb2RlLmZpcnN0IDw9IGN1cnJfb3Bjb2RlLmxhc3QpOworCisgIC8qIEVuc3VyZSB0aGF0LCBmb3IgdGhlIG5vbiBzdHJpbmcgb25seSBjYXNlLCB0aGUgb3Bjb2RlIGluY2x1ZGVzCisgICAgIHRoZSByYW5nZSBmb3JjZWRfZmlyc3QgLi4gZm9yY2VkX2xhc3QgKi8KKyAgaWYgKCFzdHJpbmdfb25seQorICAgICAgJiYgY3Vycl9vcGNvZGUuZmlyc3QgPiBydWxlLT5mb3JjZV9maXJzdCkKKyAgICB7CisgICAgICBjdXJyX29wY29kZS5maXJzdCA9IHJ1bGUtPmZvcmNlX2ZpcnN0OworICAgIH0KKyAgaWYgKCFzdHJpbmdfb25seQorICAgICAgJiYgY3Vycl9vcGNvZGUubGFzdCA8IHJ1bGUtPmZvcmNlX2xhc3QpCisgICAgeworICAgICAgY3Vycl9vcGNvZGUubGFzdCA9IHJ1bGUtPmZvcmNlX2xhc3Q7CisgICAgfQorCisgIC8qIEZvciB0aGUgc3RyaW5nIG9ubHkgY2FzZSwgZm9yY2UganVzdCB0aGUgbG93ZXIgYm91bmQgKHNvIHRoYXQgdGhlCisgICAgIHNoaWZ0IGNhbiBiZSBlbGltaW5hdGVkKSAqLworICBpZiAoc3RyaW5nX29ubHkKKyAgICAgICYmIHJ1bGUtPmZvcmNlX2xhc3QgPT0gb3B0aW9ucy5pbnNuX2JpdF9zaXplIC0gMSkKKyAgICB7CisgICAgICBjdXJyX29wY29kZS5sYXN0ID0gb3B0aW9ucy5pbnNuX2JpdF9zaXplIC0gMTsKKyAgICB9CisKKyAgLyogaGFuZGxlIGFueSBzcGVjaWFsIGNhc2VzICovCisgIHN3aXRjaCAocnVsZS0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBub3JtYWxfZGVjb2RlX3J1bGU6CisgICAgICAvKiBsZXQgdGhlIGFib3ZlIGFwcGx5ICovCisgICAgICBjdXJyX29wY29kZS5ucl9vcGNvZGVzID0KKwkoMSA8PCAoY3Vycl9vcGNvZGUubGFzdCAtIGN1cnJfb3Bjb2RlLmZpcnN0ICsgMSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBib29sZWFuX3J1bGU6CisgICAgICBjdXJyX29wY29kZS5pc19ib29sZWFuID0gMTsKKyAgICAgIGN1cnJfb3Bjb2RlLmJvb2xlYW5fY29uc3RhbnQgPSBydWxlLT5jb25zdGFudDsKKyAgICAgIGN1cnJfb3Bjb2RlLm5yX29wY29kZXMgPSAyOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHsKKyAgICBvcGNvZGVfZmllbGQgKm5ld19maWVsZCA9IFpBTExPQyAob3Bjb2RlX2ZpZWxkKTsKKyAgICBtZW1jcHkgKG5ld19maWVsZCwgJmN1cnJfb3Bjb2RlLCBzaXplb2YgKG9wY29kZV9maWVsZCkpOworICAgIHJldHVybiBuZXdfZmllbGQ7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAorZ2VuX2VudHJ5X2luc2VydF9pbnNuIChnZW5fZW50cnkgKnRhYmxlLAorCQkgICAgICAgaW5zbl9lbnRyeSAqb2xkX2luc24sCisJCSAgICAgICBpbnQgbmV3X3dvcmRfbnIsCisJCSAgICAgICBpbnQgbmV3X25yX3ByZWZldGNoZWRfd29yZHMsCisJCSAgICAgICBpbnQgbmV3X29wY29kZV9uciwKKwkJICAgICAgIG9wY29kZV9iaXRzICpuZXdfYml0cykKK3sKKyAgZ2VuX2VudHJ5ICoqZW50cnkgPSAmdGFibGUtPmVudHJpZXM7CisgIAorICAvKiBmaW5kIHRoZSBuZXcgdGFibGUgZm9yIHRoaXMgZW50cnkgKi8KKyAgd2hpbGUgKCgqZW50cnkpICE9IE5VTEwgJiYgKCplbnRyeSktPm9wY29kZV9uciA8IG5ld19vcGNvZGVfbnIpCisgICAgeworICAgICAgZW50cnkgPSAmKCplbnRyeSktPnNpYmxpbmc7CisgICAgfQorICAKKyAgaWYgKCgqZW50cnkpID09IE5VTEwgfHwgKCplbnRyeSktPm9wY29kZV9uciAhPSBuZXdfb3Bjb2RlX25yKQorICAgIHsKKyAgICAgIC8qIGluc2VydCB0aGUgbWlzc2luZyBlbnRyeSAqLworICAgICAgZ2VuX2VudHJ5ICpuZXdfZW50cnkgPSBaQUxMT0MgKGdlbl9lbnRyeSk7CisgICAgICBuZXdfZW50cnktPnNpYmxpbmcgPSAoKmVudHJ5KTsKKyAgICAgICgqZW50cnkpID0gbmV3X2VudHJ5OworICAgICAgdGFibGUtPm5yX2VudHJpZXMrKzsKKyAgICAgIC8qIGZpbGwgaXQgaW4gKi8KKyAgICAgIG5ld19lbnRyeS0+dG9wID0gdGFibGUtPnRvcDsKKyAgICAgIG5ld19lbnRyeS0+b3Bjb2RlX25yID0gbmV3X29wY29kZV9ucjsKKyAgICAgIG5ld19lbnRyeS0+d29yZF9uciA9IG5ld193b3JkX25yOworICAgICAgbmV3X2VudHJ5LT5leHBhbmRlZF9iaXRzID0gbmV3X2JpdHM7CisgICAgICBuZXdfZW50cnktPm9wY29kZV9ydWxlID0gdGFibGUtPm9wY29kZV9ydWxlLT5uZXh0OworICAgICAgbmV3X2VudHJ5LT5wYXJlbnQgPSB0YWJsZTsKKyAgICAgIG5ld19lbnRyeS0+bnJfcHJlZmV0Y2hlZF93b3JkcyA9IG5ld19ucl9wcmVmZXRjaGVkX3dvcmRzOworICAgIH0KKyAgLyogQVNTRVJUIG5ld19iaXRzID09IGN1cl9lbnRyeSBiaXRzICovCisgIEFTU0VSVCAoKCplbnRyeSkgIT0gTlVMTCAmJiAoKmVudHJ5KS0+b3Bjb2RlX25yID09IG5ld19vcGNvZGVfbnIpOworICBpbnNuX2xpc3RfaW5zZXJ0ICgmKCplbnRyeSktPmluc25zLAorCQkgICAgJigqZW50cnkpLT5ucl9pbnNucywKKwkJICAgIG9sZF9pbnNuLAorCQkgICAgTlVMTCwgLyogZXhwYW5kZWRfYml0cyAtIG9ubHkgaW4gZmluYWwgbGlzdCAqLworCQkgICAgTlVMTCwgLyogb3Bjb2RlcyAtIG9ubHkgaW4gZmluYWwgbGlzdCAqLworCQkgICAgbmV3X25yX3ByZWZldGNoZWRfd29yZHMsIC8qIGZvciB0aGlzIHRhYmxlICovCisJCSAgICByZXBvcnRfZHVwbGljYXRlX2luc25zKTsKK30KKworCitzdGF0aWMgdm9pZAorZ2VuX2VudHJ5X2V4cGFuZF9vcGNvZGUgKGdlbl9lbnRyeSAqdGFibGUsCisJCQkgaW5zbl9lbnRyeSAqaW5zdHJ1Y3Rpb24sCisJCQkgaW50IGJpdF9uciwKKwkJCSBpbnQgb3Bjb2RlX25yLAorCQkJIG9wY29kZV9iaXRzICpiaXRzKQoreworICBpZiAoYml0X25yID4gdGFibGUtPm9wY29kZS0+bGFzdCkKKyAgICB7CisgICAgICAvKiBPbmx5IGluY2x1ZGUgdGhlIGhhcmR3aXJlZCBiaXQgaW5mb3JtYXRpb24gd2l0aCBhbiBlbnRyeSBJRgorICAgICAgICAgdGhhdCBlbnRyeSAoYW5kIGhlbmNlIGl0cyBmdW5jdGlvbnMpIGFyZSBiZWluZyBkdXBsaWNhdGVkLiAgKi8KKyAgICAgIGlmIChvcHRpb25zLnRyYWNlLmluc25fZXhwYW5zaW9uKQorCXsKKwkgIHByaW50X2dlbl9lbnRyeV9wYXRoICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmxpbmUsIHRhYmxlLCBub3RpZnkpOworCSAgbm90aWZ5IChOVUxMLCAiOiBpbnNlcnQgJWQgLSAlcy4lcyVzXG4iLAorCQkgIG9wY29kZV9uciwKKwkJICBpbnN0cnVjdGlvbi0+Zm9ybWF0X25hbWUsCisJCSAgaW5zdHJ1Y3Rpb24tPm5hbWUsCisJCSAgKHRhYmxlLT5vcGNvZGVfcnVsZS0+d2l0aF9kdXBsaWNhdGVzID8gIiAoZHVwbGljYXRlZCkiIDogIiIpKTsKKwl9CisgICAgICBpZiAodGFibGUtPm9wY29kZV9ydWxlLT53aXRoX2R1cGxpY2F0ZXMpCisJeworCSAgZ2VuX2VudHJ5X2luc2VydF9pbnNuICh0YWJsZSwgaW5zdHJ1Y3Rpb24sCisJCQkJIHRhYmxlLT5vcGNvZGUtPndvcmRfbnIsCisJCQkJIHRhYmxlLT5ucl9wcmVmZXRjaGVkX3dvcmRzLAorCQkJCSBvcGNvZGVfbnIsIGJpdHMpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBnZW5fZW50cnlfaW5zZXJ0X2luc24gKHRhYmxlLCBpbnN0cnVjdGlvbiwKKwkJCQkgdGFibGUtPm9wY29kZS0+d29yZF9uciwKKwkJCQkgdGFibGUtPm5yX3ByZWZldGNoZWRfd29yZHMsCisJCQkJIG9wY29kZV9uciwgTlVMTCk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGluc25fd29yZF9lbnRyeSAqd29yZCA9IGluc3RydWN0aW9uLT53b3JkW3RhYmxlLT5vcGNvZGUtPndvcmRfbnJdOworICAgICAgaW5zbl9maWVsZF9lbnRyeSAqZmllbGQgPSB3b3JkLT5iaXRbYml0X25yXS0+ZmllbGQ7CisgICAgICBpbnQgbGFzdF9wb3MgPSAoKGZpZWxkLT5sYXN0IDwgdGFibGUtPm9wY29kZS0+bGFzdCkKKwkJICAgICAgPyBmaWVsZC0+bGFzdAorCQkgICAgICA6IHRhYmxlLT5vcGNvZGUtPmxhc3QpOworICAgICAgaW50IGZpcnN0X3BvcyA9ICgoZmllbGQtPmZpcnN0ID4gdGFibGUtPm9wY29kZS0+Zmlyc3QpCisJCSAgICAgICA/IGZpZWxkLT5maXJzdAorCQkgICAgICAgOiB0YWJsZS0+b3Bjb2RlLT5maXJzdCk7CisgICAgICBpbnQgd2lkdGggPSBsYXN0X3BvcyAtIGZpcnN0X3BvcyArIDE7CisgICAgICBzd2l0Y2ggKGZpZWxkLT50eXBlKQorCXsKKwljYXNlIGluc25fZmllbGRfaW50OgorCSAgeworCSAgICBpbnQgdmFsOworCSAgICB2YWwgPSBzdWJfdmFsIChmaWVsZC0+dmFsX2ludCwgZmllbGQtPmxhc3QsCisJCQkgICBmaXJzdF9wb3MsIGxhc3RfcG9zKTsKKwkgICAgZ2VuX2VudHJ5X2V4cGFuZF9vcGNvZGUgKHRhYmxlLCBpbnN0cnVjdGlvbiwKKwkJCQkgICAgIGxhc3RfcG9zICsgMSwKKwkJCQkgICAgICgob3Bjb2RlX25yIDw8IHdpZHRoKSB8IHZhbCksCisJCQkJICAgICBiaXRzKTsKKwkgICAgYnJlYWs7CisJICB9CisJZGVmYXVsdDoKKwkgIHsKKwkgICAgaWYgKGZpZWxkLT50eXBlID09IGluc25fZmllbGRfcmVzZXJ2ZWQpCisJICAgICAgZ2VuX2VudHJ5X2V4cGFuZF9vcGNvZGUgKHRhYmxlLCBpbnN0cnVjdGlvbiwKKwkJCQkgICAgICAgbGFzdF9wb3MgKyAxLAorCQkJCSAgICAgICAoKG9wY29kZV9uciA8PCB3aWR0aCkpLAorCQkJCSAgICAgICBiaXRzKTsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJaW50IHZhbDsKKwkJaW50IGxhc3RfdmFsID0gKHRhYmxlLT5vcGNvZGUtPmlzX2Jvb2xlYW4KKwkJCQk/IDIKKwkJCQk6ICgxIDw8IHdpZHRoKSk7CisJCWZvciAodmFsID0gMDsgdmFsIDwgbGFzdF92YWw7IHZhbCsrKQorCQkgIHsKKwkJICAgIC8qIGNoZWNrIHRvIHNlZSBpZiB0aGUgdmFsdWUgaGFzIGJlZW4gcHJlY2x1ZGVkCisgICAgICAgICAgICAgICAgICAgICAgIChieSBhIGNvbmRpdGlvbmFsKSBpbiBzb21lIHdheSAqLworCQkgICAgaW50IGlzX3ByZWNsdWRlZDsKKwkJICAgIGluc25fZmllbGRfY29uZCAqY29uZGl0aW9uOworCQkgICAgZm9yIChjb25kaXRpb24gPSBmaWVsZC0+Y29uZGl0aW9ucywgaXNfcHJlY2x1ZGVkID0gMDsKKwkJCSBjb25kaXRpb24gIT0gTlVMTCAmJiAhaXNfcHJlY2x1ZGVkOworCQkJIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi0+bmV4dCkKKwkJICAgICAgeworCQkJc3dpdGNoIChjb25kaXRpb24tPnR5cGUpCisJCQkgIHsKKwkJCSAgY2FzZSBpbnNuX2ZpZWxkX2NvbmRfdmFsdWU6CisJCQkgICAgeworCQkJICAgICAgaW50IHZhbHVlID0gc3ViX3ZhbCAoY29uZGl0aW9uLT52YWx1ZSwgZmllbGQtPmxhc3QsCisJCQkJCQkgICBmaXJzdF9wb3MsIGxhc3RfcG9zKTsKKwkJCSAgICAgIHN3aXRjaCAoY29uZGl0aW9uLT50ZXN0KQorCQkJCXsKKwkJCQljYXNlIGluc25fZmllbGRfY29uZF9uZToKKwkJCQkgIGlmICh2YWx1ZSA9PSB2YWwpCisJCQkJICAgIGlzX3ByZWNsdWRlZCA9IDE7CisJCQkJICBicmVhazsKKwkJCQljYXNlIGluc25fZmllbGRfY29uZF9lcToKKwkJCQkgIGlmICh2YWx1ZSAhPSB2YWwpCisJCQkJICAgIGlzX3ByZWNsdWRlZCA9IDE7CisJCQkJICBicmVhazsKKwkJCQl9CisJCQkgICAgICBicmVhazsKKwkJCSAgICB9CisJCQkgIGNhc2UgaW5zbl9maWVsZF9jb25kX2ZpZWxkOgorCQkJICAgIHsKKwkJCSAgICAgIGludCB2YWx1ZTsKKwkJCSAgICAgIG9wY29kZV9iaXRzICpiaXQ7CisJCQkgICAgICBnZW5fZW50cnkgKnQ7CisJCQkgICAgICAvKiBUcnkgdG8gZmluZCBhIHZhbHVlIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsIGJ5IGxvb2tpbmcgYmFjayB0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJldmlvdXNseSBkZWZpbmVkIGJpdHMgZm9yIG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBjb3ZlcnMgdGhlIGRlc2lnbmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsIGZpZWxkICovCisJCQkgICAgICBmb3IgKGJpdCA9IGJpdHM7CisJCQkJICAgYml0ICE9IE5VTEw7CisJCQkJICAgYml0ID0gYml0LT5uZXh0KQorCQkJCXsKKwkJCQkgIGlmIChiaXQtPmZpZWxkLT53b3JkX25yID09IGNvbmRpdGlvbi0+ZmllbGQtPndvcmRfbnIKKwkJCQkgICAgICAmJiBiaXQtPmZpcnN0IDw9IGNvbmRpdGlvbi0+ZmllbGQtPmZpcnN0CisJCQkJICAgICAgJiYgYml0LT5sYXN0ID49IGNvbmRpdGlvbi0+ZmllbGQtPmxhc3QpCisJCQkJICAgIHsKKwkJCQkgICAgICAvKiB0aGUgYml0IGZpZWxkIGZ1bGx5IHNwZWNpZmllZAorCQkJCQkgdGhlIGNvbmRpdGlvbmFsIGZpZWxkJ3MgdmFsdWUgKi8KKwkJCQkgICAgICB2YWx1ZSA9IHN1Yl92YWwgKGJpdC0+dmFsdWUsIGJpdC0+bGFzdCwKKwkJCQkJCSAgICAgICBjb25kaXRpb24tPmZpZWxkLT5maXJzdCwKKwkJCQkJCSAgICAgICBjb25kaXRpb24tPmZpZWxkLT5sYXN0KTsKKwkJCQkgICAgfQorCQkJCX0KKwkJCSAgICAgIC8qIFRyeSB0byBmaW5kIGEgdmFsdWUgYnkgbG9va2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3VnaCB0aGlzIGFuZCBwcmV2aW91cyB0YWJsZXMgKi8KKwkJCSAgICAgIGlmIChiaXQgPT0gTlVMTCkKKwkJCQl7CisJCQkJICBmb3IgKHQgPSB0YWJsZTsKKwkJCQkgICAgICAgdC0+cGFyZW50ICE9IE5VTEw7CisJCQkJICAgICAgIHQgPSB0LT5wYXJlbnQpCisJCQkJICAgIHsKKwkJCQkgICAgICBpZiAodC0+cGFyZW50LT5vcGNvZGUtPndvcmRfbnIgPT0gY29uZGl0aW9uLT5maWVsZC0+d29yZF9ucgorCQkJCQkgICYmIHQtPnBhcmVudC0+b3Bjb2RlLT5maXJzdCA8PSBjb25kaXRpb24tPmZpZWxkLT5maXJzdAorCQkJCQkgICYmIHQtPnBhcmVudC0+b3Bjb2RlLT5sYXN0ID49IGNvbmRpdGlvbi0+ZmllbGQtPmxhc3QpCisJCQkJCXsKKwkJCQkJICAvKiB0aGUgdGFibGUgZW50cnkgZnVsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCB0aGUgY29uZGl0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCdzIHZhbHVlICovCisJCQkJCSAgLyogZXh0cmFjdCB0aGUgZmllbGQncyB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgb3Bjb2RlICovCisJCQkJCSAgdmFsdWUgPSBzdWJfdmFsICh0LT5vcGNvZGVfbnIsIHQtPnBhcmVudC0+b3Bjb2RlLT5sYXN0LAorCQkJCQkJCSAgIGNvbmRpdGlvbi0+ZmllbGQtPmZpcnN0LCBjb25kaXRpb24tPmZpZWxkLT5sYXN0KTsKKwkJCQkJICAvKiB0aGlzIGlzIGEgcmVxdWlyZW1lbnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgY29uZGl0b25hbCBmaWVsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJpbmcgdG8gYW5vdGhlciBmaWVsZCAqLworCQkJCQkgIEFTU0VSVCAoKGNvbmRpdGlvbi0+ZmllbGQtPmZpcnN0IC0gY29uZGl0aW9uLT5maWVsZC0+bGFzdCkKKwkJCQkJCSAgPT0gKGZpcnN0X3BvcyAtIGxhc3RfcG9zKSk7CitwcmludGYgKCJ2YWx1ZT0lZCwgb3Bjb2RlX25yPSVkLCBsYXN0PSVkLCBbJWQuLiVkXVxuIiwKKwl2YWx1ZSwgdC0+b3Bjb2RlX25yLCB0LT5wYXJlbnQtPm9wY29kZS0+bGFzdCwgY29uZGl0aW9uLT5maWVsZC0+Zmlyc3QsIGNvbmRpdGlvbi0+ZmllbGQtPmxhc3QpOworCQkJCQl9CisJCQkJICAgIH0KKwkJCQl9CisJCQkgICAgICBpZiAoYml0ID09IE5VTEwgJiYgdCA9PSBOVUxMKQorCQkJCWVycm9yIChpbnN0cnVjdGlvbi0+bGluZSwKKwkJCQkgICAgICAgIkNvbmRpdGlvbmFsIGAlcycgb2YgZmllbGQgYCVzJyBpc24ndCBleHBhbmRlZCIsCisJCQkJICAgICAgIGNvbmRpdGlvbi0+c3RyaW5nLCBmaWVsZC0+dmFsX3N0cmluZyk7CisJCQkgICAgICBzd2l0Y2ggKGNvbmRpdGlvbi0+dGVzdCkKKwkJCQl7CisJCQkJY2FzZSBpbnNuX2ZpZWxkX2NvbmRfbmU6CisJCQkJICBpZiAodmFsdWUgPT0gdmFsKQorCQkJCSAgICBpc19wcmVjbHVkZWQgPSAxOworCQkJCSAgYnJlYWs7CisJCQkJY2FzZSBpbnNuX2ZpZWxkX2NvbmRfZXE6CisJCQkJICBpZiAodmFsdWUgIT0gdmFsKQorCQkJCSAgICBpc19wcmVjbHVkZWQgPSAxOworCQkJCSAgYnJlYWs7CisJCQkJfQorCQkJICAgICAgYnJlYWs7CisJCQkgICAgfQorCQkJICB9CisJCSAgICAgIH0KKwkJICAgIGlmICghaXNfcHJlY2x1ZGVkKQorCQkgICAgICB7CisJCQkvKiBPbmx5IGFkZCBhZGRpdGlvbmFsIGhhcmR3aXJlZCBiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGlmIHRoZSBlbnRyeSBpcyBub3QgZ29pbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVyIGJlIGNvbWJpbmVkICovCisJCQlpZiAodGFibGUtPm9wY29kZV9ydWxlLT53aXRoX2NvbWJpbmUpCisJCQkgIHsKKwkJCSAgICBnZW5fZW50cnlfZXhwYW5kX29wY29kZSAodGFibGUsIGluc3RydWN0aW9uLAorCQkJCQkJICAgICBsYXN0X3BvcyArIDEsCisJCQkJCQkgICAgICgob3Bjb2RlX25yIDw8IHdpZHRoKSB8IHZhbCksCisJCQkJCQkgICAgIGJpdHMpOworCQkJICB9CisJCQllbHNlCisJCQkgIHsKKwkJCSAgICBvcGNvZGVfYml0cyAqbmV3X2JpdHMgPSBuZXdfb3Bjb2RlX2JpdHMgKGJpdHMsIHZhbCwKKwkJCQkJCQkJICAgICBmaXJzdF9wb3MsIGxhc3RfcG9zLAorCQkJCQkJCQkgICAgIGZpZWxkLAorCQkJCQkJCQkgICAgIHRhYmxlLT5vcGNvZGUpOworCQkJICAgIGdlbl9lbnRyeV9leHBhbmRfb3Bjb2RlICh0YWJsZSwgaW5zdHJ1Y3Rpb24sCisJCQkJCQkgICAgIGxhc3RfcG9zICsgMSwKKwkJCQkJCSAgICAgKChvcGNvZGVfbnIgPDwgd2lkdGgpIHwgdmFsKSwKKwkJCQkJCSAgICAgbmV3X2JpdHMpOworCQkJICB9CisJCSAgICAgIH0KKwkJICB9CisJICAgICAgfQorCSAgfQorCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitnZW5fZW50cnlfaW5zZXJ0X2V4cGFuZGluZyAoZ2VuX2VudHJ5ICp0YWJsZSwKKwkJCSAgICBpbnNuX2VudHJ5ICppbnN0cnVjdGlvbikKK3sKKyAgZ2VuX2VudHJ5X2V4cGFuZF9vcGNvZGUgKHRhYmxlLAorCQkJICAgaW5zdHJ1Y3Rpb24sCisJCQkgICB0YWJsZS0+b3Bjb2RlLT5maXJzdCwKKwkJCSAgIDAsCisJCQkgICB0YWJsZS0+ZXhwYW5kZWRfYml0cyk7Cit9CisKKworc3RhdGljIGludAoraW5zbnNfbWF0Y2hfZm9ybWF0X25hbWVzIChpbnNuX2xpc3QgKmluc25zLAorCQkJICBmaWx0ZXIgKmZvcm1hdF9uYW1lcykKK3sKKyAgaWYgKGZvcm1hdF9uYW1lcyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGluc25fbGlzdCAqaTsKKyAgICAgIGZvciAoaSA9IGluc25zOyBpICE9IE5VTEw7IGkgPSBpLT5uZXh0KQorCXsKKwkgIGlmICggaS0+aW5zbi0+Zm9ybWF0X25hbWUgIT0gTlVMTAorCSAgICAgICAmJiAhZmlsdGVyX2lzX21lbWJlciAoZm9ybWF0X25hbWVzLCBpLT5pbnNuLT5mb3JtYXRfbmFtZSkpCisJICAgIHJldHVybiAwOworCX0KKyAgICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50Cit0YWJsZV9tYXRjaGVzX3BhdGggKGdlbl9lbnRyeSAqdGFibGUsCisJCSAgICBkZWNvZGVfcGF0aF9saXN0ICpwYXRocykKK3sKKyAgaWYgKHBhdGhzID09IE5VTEwpCisgICAgcmV0dXJuIDE7CisgIHdoaWxlIChwYXRocyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGdlbl9lbnRyeSAqZW50cnkgPSB0YWJsZTsKKyAgICAgIGRlY29kZV9wYXRoICpwYXRoID0gcGF0aHMtPnBhdGg7CisgICAgICB3aGlsZSAoMSkKKwl7CisJICBpZiAoZW50cnkgPT0gTlVMTCAmJiBwYXRoID09IE5VTEwpCisJICAgIHJldHVybiAxOworCSAgaWYgKGVudHJ5ID09IE5VTEwgfHwgcGF0aCA9PSBOVUxMKQorCSAgICBicmVhazsKKwkgIGlmIChlbnRyeS0+b3Bjb2RlX25yICE9IHBhdGgtPm9wY29kZV9ucikKKwkgICAgYnJlYWs7CisJICBlbnRyeSA9IGVudHJ5LT5wYXJlbnQ7CisJICBwYXRoID0gcGF0aC0+cGFyZW50OworCX0KKyAgICAgIHBhdGhzID0gcGF0aHMtPm5leHQ7CisgICAgfQorICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitpbnNuc19tYXRjaF9jb25kaXRpb25zIChpbnNuX2xpc3QgKmluc25zLAorCQkJZGVjb2RlX2NvbmQgKmNvbmRpdGlvbnMpCit7CisgIGlmIChjb25kaXRpb25zICE9IE5VTEwpCisgICAgeworICAgICAgaW5zbl9saXN0ICppOworICAgICAgZm9yIChpID0gaW5zbnM7IGkgIT0gTlVMTDsgaSA9IGktPm5leHQpCisJeworCSAgZGVjb2RlX2NvbmQgKmNvbmQ7CisJICBmb3IgKGNvbmQgPSBjb25kaXRpb25zOyBjb25kICE9IE5VTEw7IGNvbmQgPSBjb25kLT5uZXh0KQorCSAgICB7CisJICAgICAgaW50IGJpdF9ucjsKKwkgICAgICBpZiAoaS0+aW5zbi0+bnJfd29yZHMgPD0gY29uZC0+d29yZF9ucikKKwkJcmV0dXJuIDA7CisJICAgICAgZm9yIChiaXRfbnIgPSAwOyBiaXRfbnIgPCBvcHRpb25zLmluc25fYml0X3NpemU7IGJpdF9ucisrKQorCQl7CisJCSAgaWYgKCFjb25kLT5tYXNrW2JpdF9ucl0pCisJCSAgICBjb250aW51ZTsKKwkJICBpZiAoIWktPmluc24tPndvcmRbY29uZC0+d29yZF9ucl0tPmJpdFtiaXRfbnJdLT5tYXNrKQorCQkgICAgcmV0dXJuIDA7CisJCSAgaWYgKChpLT5pbnNuLT53b3JkW2NvbmQtPndvcmRfbnJdLT5iaXRbYml0X25yXS0+dmFsdWUKKwkJICAgICAgID09IGNvbmQtPnZhbHVlW2JpdF9ucl0pCisJCSAgICAgID09ICFjb25kLT5pc19lcXVhbCkKKwkJICAgIHJldHVybiAwOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAoraW5zbnNfbWF0Y2hfbnJfd29yZHMgKGluc25fbGlzdCAqaW5zbnMsCisJCSAgICAgIGludCBucl93b3JkcykKK3sKKyAgaW5zbl9saXN0ICppOworICBmb3IgKGkgPSBpbnNuczsgaSAhPSBOVUxMOyBpID0gaS0+bmV4dCkKKyAgICB7CisgICAgICBpZiAoaS0+aW5zbi0+bnJfd29yZHMgPCBucl93b3JkcykKKwlyZXR1cm4gMDsKKyAgICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CitpbnNuX2xpc3RfY21wIChpbnNuX2xpc3QgKmwsCisJICAgICAgIGluc25fbGlzdCAqcikKK3sKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaW5zbl9lbnRyeSAqaW5zbjsKKyAgICAgIGlmIChsID09IE5VTEwgJiYgciA9PSBOVUxMKQorCXJldHVybiAwOworICAgICAgaWYgKGwgPT0gTlVMTCkKKwlyZXR1cm4gLTE7CisgICAgICBpZiAociA9PSBOVUxMKQorCXJldHVybiAxOworICAgICAgaWYgKGwtPmluc24gIT0gci0+aW5zbikKKwlyZXR1cm4gLTE7IC8qIHNvbWV3aGF0IGFyYml0cmFyeSBhdCBwcmVzZW50ICovCisgICAgICAvKiBza2lwIHRoaXMgaW5zbiAqLworICAgICAgaW5zbiA9IGwtPmluc247CisgICAgICB3aGlsZSAobCAhPSBOVUxMICYmIGwtPmluc24gPT0gaW5zbikKKwlsID0gbC0+bmV4dDsKKyAgICAgIHdoaWxlIChyICE9IE5VTEwgJiYgci0+aW5zbiA9PSBpbnNuKQorCXIgPSByLT5uZXh0OworICAgIH0KK30KKworCisKK3N0YXRpYyB2b2lkCitnZW5fZW50cnlfZXhwYW5kX2luc25zIChnZW5fZW50cnkgKnRhYmxlKQoreworICBkZWNvZGVfdGFibGUgKm9wY29kZV9ydWxlOworCisgIEFTU0VSVCh0YWJsZS0+bnJfaW5zbnMgPj0gMSk7CisgIAorICAvKiBkZXRlcm1pbmUgYSB2YWxpZCBvcGNvZGUgKi8KKyAgZm9yIChvcGNvZGVfcnVsZSA9IHRhYmxlLT5vcGNvZGVfcnVsZTsKKyAgICAgICBvcGNvZGVfcnVsZSAhPSBOVUxMOworICAgICAgIG9wY29kZV9ydWxlID0gb3Bjb2RlX3J1bGUtPm5leHQpCisgICAgeworICAgICAgY2hhciAqZGlzY2FyZF9yZWFzb247CisgICAgICBpZiAodGFibGUtPnRvcC0+bW9kZWwgIT0gTlVMTAorCSAgJiYgb3Bjb2RlX3J1bGUtPm1vZGVsX25hbWVzICE9IE5VTEwKKwkgICYmICFmaWx0ZXJfaXNfbWVtYmVyIChvcGNvZGVfcnVsZS0+bW9kZWxfbmFtZXMsCisJCQkJdGFibGUtPnRvcC0+bW9kZWwtPm5hbWUpKQorCXsKKwkgIC8qIHRoZSBydWxlIGlzbid0IGFwcGxpY2FibGUgdG8gdGhpcyBwcm9jZXNzb3IgKi8KKwkgIGRpc2NhcmRfcmVhc29uID0gIndyb25nIG1vZGVsIjsKKwl9CisgICAgICBlbHNlIGlmICh0YWJsZS0+bnJfaW5zbnMgPT0gMSAmJiBvcGNvZGVfcnVsZS0+Y29uZGl0aW9ucyA9PSBOVUxMKQorCXsKKwkgIC8qIGZvciBzYWZldHksIHJlcXVpcmUgYSBwcmUtY29kaXRpb24gd2hlbiBhdHRlbXB0aW5nIHRvCisgICAgICAgICAgICAgYXBwbHkgYSBydWxlIHRvIGEgc2luZ2xlIGluc3RydWN0aW9uICovCisJICBkaXNjYXJkX3JlYXNvbiA9ICJuZWVkIHByZS1jb25kaXRpb24gd2hlbiBuci1pbnNuID09IDEiOworCX0KKyAgICAgIGVsc2UgaWYgKHRhYmxlLT5ucl9pbnNucyA9PSAxICYmICFvcGNvZGVfcnVsZS0+d2l0aF9kdXBsaWNhdGVzKQorCXsKKwkgIC8qIExpdHRsZSBwb2ludCBpbiBleHBhbmRpbmcgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gd2hlbiB3ZSdyZQorICAgICAgICAgICAgIG5vdCBkdXBsaWNhdGluZyB0aGUgc2VtYW50aWMgZnVuY3Rpb25zIHRoYXQgdGhpcyB0YWJsZQorICAgICAgICAgICAgIGNhbGxzICovCisJICBkaXNjYXJkX3JlYXNvbiA9ICJuZWVkIGR1cGxpY2F0aW9uIHdpdGggbnItaW5zbnMgPT0gMSI7CisJfQorICAgICAgZWxzZSBpZiAoIWluc25zX21hdGNoX2Zvcm1hdF9uYW1lcyAodGFibGUtPmluc25zLCBvcGNvZGVfcnVsZS0+Zm9ybWF0X25hbWVzKSkKKwl7CisJICBkaXNjYXJkX3JlYXNvbiA9ICJ3cm9uZyBmb3JtYXQgbmFtZSI7CisJfQorICAgICAgZWxzZSBpZiAoIWluc25zX21hdGNoX25yX3dvcmRzICh0YWJsZS0+aW5zbnMsIG9wY29kZV9ydWxlLT53b3JkX25yICsgMSkpCisJeworCSAgZGlzY2FyZF9yZWFzb24gPSAid3JvbmcgbnIgd29yZHMiOworCX0KKyAgICAgIGVsc2UgaWYgKCF0YWJsZV9tYXRjaGVzX3BhdGggKHRhYmxlLCBvcGNvZGVfcnVsZS0+cGF0aHMpKQorCXsKKwkgIGRpc2NhcmRfcmVhc29uID0gInBhdGggZmFpbGVkIjsKKwl9CisgICAgICBlbHNlIGlmICghaW5zbnNfbWF0Y2hfY29uZGl0aW9ucyAodGFibGUtPmluc25zLCBvcGNvZGVfcnVsZS0+Y29uZGl0aW9ucykpCisJeworCSAgZGlzY2FyZF9yZWFzb24gPSAiY29uZGl0aW9uIGZhaWxlZCI7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGRpc2NhcmRfcmVhc29uID0gIm5vIG9wY29kZSBmaWVsZCI7CisJICB0YWJsZS0+b3Bjb2RlID0KKwkgICAgZ2VuX2VudHJ5X2ZpbmRfb3Bjb2RlX2ZpZWxkICh0YWJsZS0+aW5zbnMsCisJCQkJCSBvcGNvZGVfcnVsZSwKKwkJCQkJIHRhYmxlLT5ucl9pbnNucyA9PSAxLypzdHJpbmctb25seSovCisJCQkJCSApOworCSAgaWYgKHRhYmxlLT5vcGNvZGUgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIHRhYmxlLT5vcGNvZGVfcnVsZSA9IG9wY29kZV9ydWxlOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorCisgICAgICBpZiAob3B0aW9ucy50cmFjZS5ydWxlX3JlamVjdGlvbikKKwl7CisJICBwcmludF9nZW5fZW50cnlfcGF0aCAob3Bjb2RlX3J1bGUtPmxpbmUsIHRhYmxlLCBub3RpZnkpOworCSAgbm90aWZ5IChOVUxMLCAiOiBydWxlIGRpc2NhcmRlZCAtICVzXG4iLCBkaXNjYXJkX3JlYXNvbik7CisJfQorICAgIH0KKyAgCisgIC8qIGRpZCB3ZSBmaW5kIGFueXRoaW5nICovCisgIGlmIChvcGNvZGVfcnVsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIHRoZSBkZWNvZGUgdGFibGUgZmFpbGVkLCB0aGlzIHNldCBvZiBpbnN0cnVjdGlvbnMgaGF2ZW4ndAorICAgICAgICAgYmVlbiB1bmlxdWVseSBpZGVudGlmaWVkICovCisgICAgICBpZiAodGFibGUtPm5yX2luc25zID4gMSkKKwl7CisJICBwcmludF9nZW5fZW50cnlfaW5zbnMgKHRhYmxlLCB3YXJuaW5nLAorCQkJCSAid2FzIG5vdCB1bmlxdWVseSBkZWNvZGVkIiwKKwkJCQkgImRlY29kZXMgdG8gdGhlIHNhbWUgZW50cnkiKTsKKwkgIGVycm9yIChOVUxMLCAiIik7CisJfQorICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiB3b3JkcyB0aGF0IG11c3QgaGF2ZSBiZWVuIHByZWZldGNoZWQgZm9yCisgICAgIHRoaXMgdGFibGUgdG8gZnVuY3Rpb24gKi8KKyAgaWYgKHRhYmxlLT5wYXJlbnQgPT0gTlVMTCkKKyAgICB0YWJsZS0+bnJfcHJlZmV0Y2hlZF93b3JkcyA9IHRhYmxlLT5vcGNvZGVfcnVsZS0+d29yZF9uciArIDE7CisgIGVsc2UgaWYgKHRhYmxlLT5vcGNvZGVfcnVsZS0+d29yZF9uciArIDEgPiB0YWJsZS0+cGFyZW50LT5ucl9wcmVmZXRjaGVkX3dvcmRzKQorICAgIHRhYmxlLT5ucl9wcmVmZXRjaGVkX3dvcmRzID0gdGFibGUtPm9wY29kZV9ydWxlLT53b3JkX25yICsgMTsKKyAgZWxzZQorICAgIHRhYmxlLT5ucl9wcmVmZXRjaGVkX3dvcmRzID0gdGFibGUtPnBhcmVudC0+bnJfcHJlZmV0Y2hlZF93b3JkczsKKworICAvKiBiYWNrIGxpbmsgd2hhdCB3ZSBmb3VuZCB0byBpdHMgcGFyZW50ICovCisgIGlmICh0YWJsZS0+cGFyZW50ICE9IE5VTEwpCisgICAgeworICAgICAgQVNTRVJUKHRhYmxlLT5wYXJlbnQtPm9wY29kZSAhPSBOVUxMKTsKKyAgICAgIHRhYmxlLT5vcGNvZGUtPnBhcmVudCA9IHRhYmxlLT5wYXJlbnQtPm9wY29kZTsKKyAgICB9CisKKyAgLyogcmVwb3J0IHRoZSBydWxlIGJlaW5nIHVzZWQgdG8gZXhwYW5kIHRoZSBpbnN0cnVjdGlvbnMgKi8KKyAgaWYgKG9wdGlvbnMudHJhY2UucnVsZV9zZWxlY3Rpb24pCisgICAgeworICAgICAgcHJpbnRfZ2VuX2VudHJ5X3BhdGggKHRhYmxlLT5vcGNvZGVfcnVsZS0+bGluZSwgdGFibGUsIG5vdGlmeSk7CisgICAgICBub3RpZnkgKE5VTEwsCisJICAgICAgIjogZGVjb2RlIC0gd29yZCAlZCwgYml0cyBbJWQuLiVkXSBpbiBbJWQuLiVkXSwgb3Bjb2RlcyAlZCwgZW50cmllcyAlZFxuIiwKKwkgICAgICB0YWJsZS0+b3Bjb2RlLT53b3JkX25yLAorCSAgICAgIGkydGFyZ2V0IChvcHRpb25zLmhpX2JpdF9uciwgdGFibGUtPm9wY29kZS0+Zmlyc3QpLAorCSAgICAgIGkydGFyZ2V0IChvcHRpb25zLmhpX2JpdF9uciwgdGFibGUtPm9wY29kZS0+bGFzdCksCisJICAgICAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCB0YWJsZS0+b3Bjb2RlX3J1bGUtPmZpcnN0KSwKKwkgICAgICBpMnRhcmdldCAob3B0aW9ucy5oaV9iaXRfbnIsIHRhYmxlLT5vcGNvZGVfcnVsZS0+bGFzdCksCisJICAgICAgdGFibGUtPm9wY29kZS0+bnJfb3Bjb2RlcywKKwkgICAgICB0YWJsZS0+bnJfZW50cmllcyk7CisgICAgfQorCisgIC8qIGV4cGFuZCB0aGUgcmF3IGluc3RydWN0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIG9wY29kZSAqLworICB7CisgICAgaW5zbl9saXN0ICplbnRyeTsKKyAgICBmb3IgKGVudHJ5ID0gdGFibGUtPmluc25zOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQorICAgICAgeworCWlmIChvcHRpb25zLnRyYWNlLmluc25fZXhwYW5zaW9uKQorCSAgeworCSAgICBwcmludF9nZW5fZW50cnlfcGF0aCAodGFibGUtPm9wY29kZV9ydWxlLT5saW5lLCB0YWJsZSwgbm90aWZ5KTsKKwkgICAgbm90aWZ5IChOVUxMLCAiOiBleHBhbmQgLSAlcy4lc1xuIiwKKwkJICAgIGVudHJ5LT5pbnNuLT5mb3JtYXRfbmFtZSwKKwkJICAgIGVudHJ5LT5pbnNuLT5uYW1lKTsKKwkgIH0KKwlnZW5fZW50cnlfaW5zZXJ0X2V4cGFuZGluZyAodGFibGUsIGVudHJ5LT5pbnNuKTsKKyAgICAgIH0KKyAgfQorCisgIC8qIGR1bXAgdGhlIHJlc3VsdHMgKi8KKyAgaWYgKG9wdGlvbnMudHJhY2UuZW50cmllcykKKyAgICB7CisgICAgICBnZW5fZW50cnkgKmVudHJ5OworICAgICAgZm9yIChlbnRyeSA9IHRhYmxlLT5lbnRyaWVzOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5zaWJsaW5nKQorCXsKKwkgIGluc25fbGlzdCAqbDsKKwkgIHByaW50X2dlbl9lbnRyeV9wYXRoICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmxpbmUsIGVudHJ5LCBub3RpZnkpOworCSAgbm90aWZ5IChOVUxMLCAiOiAlZCAtIGVudHJpZXMgJWQgLSIsCisJCSAgZW50cnktPm9wY29kZV9uciwKKwkJICBlbnRyeS0+bnJfaW5zbnMpOworCSAgZm9yIChsID0gZW50cnktPmluc25zOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQorCSAgICBub3RpZnkgKE5VTEwsICIgJXMuJXMiLCBsLT5pbnNuLT5mb3JtYXRfbmFtZSwgbC0+aW5zbi0+bmFtZSk7CisJICBub3RpZnkgKE5VTEwsICJcbiIpOworCX0KKyAgICB9CisJCisgIC8qIHBlcmZvcm0gYSBjb21iaW5lIHBhc3MgaWYgbmVlZGVkICovCisgIGlmICh0YWJsZS0+b3Bjb2RlX3J1bGUtPndpdGhfY29tYmluZSkKKyAgICB7CisgICAgICBnZW5fZW50cnkgKmVudHJ5OworICAgICAgZm9yIChlbnRyeSA9IHRhYmxlLT5lbnRyaWVzOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5zaWJsaW5nKQorCXsKKwkgIGlmIChlbnRyeS0+Y29tYmluZWRfcGFyZW50ID09IE5VTEwpCisJICAgIHsKKwkgICAgICBnZW5fZW50cnkgKipsYXN0ID0gJmVudHJ5LT5jb21iaW5lZF9uZXh0OworCSAgICAgIGdlbl9lbnRyeSAqYWx0OworCSAgICAgIGZvciAoYWx0ID0gZW50cnktPnNpYmxpbmc7IGFsdCAhPSBOVUxMOyBhbHQgPSBhbHQtPnNpYmxpbmcpCisJCXsKKwkJICBpZiAoYWx0LT5jb21iaW5lZF9wYXJlbnQgPT0gTlVMTAorCQkgICAgICAmJiBpbnNuX2xpc3RfY21wIChlbnRyeS0+aW5zbnMsIGFsdC0+aW5zbnMpID09IDApCisJCSAgICB7CisJCSAgICAgIGFsdC0+Y29tYmluZWRfcGFyZW50ID0gZW50cnk7CisJCSAgICAgICpsYXN0ID0gYWx0OworCQkgICAgICBsYXN0ID0gJmFsdC0+Y29tYmluZWRfbmV4dDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgICAgaWYgKG9wdGlvbnMudHJhY2UuY29tYmluZSkKKwl7CisJICBpbnQgbnJfdW5pcXVlID0gMDsKKwkgIGdlbl9lbnRyeSAqZW50cnk7CisJICBmb3IgKGVudHJ5ID0gdGFibGUtPmVudHJpZXM7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPnNpYmxpbmcpCisJICAgIHsKKwkgICAgICBpZiAoZW50cnktPmNvbWJpbmVkX3BhcmVudCA9PSBOVUxMKQorCQl7CisJCSAgaW5zbl9saXN0ICpsOworCQkgIGdlbl9lbnRyeSAqZHVwbGljYXRlOworCQkgIG5yX3VuaXF1ZSsrOworCQkgIHByaW50X2dlbl9lbnRyeV9wYXRoICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmxpbmUsIGVudHJ5LCBub3RpZnkpOworCQkgIGZvciAoZHVwbGljYXRlID0gZW50cnktPmNvbWJpbmVkX25leHQ7CisJCSAgICAgICBkdXBsaWNhdGUgIT0gTlVMTDsKKwkJICAgICAgIGR1cGxpY2F0ZSA9IGR1cGxpY2F0ZS0+Y29tYmluZWRfbmV4dCkKKwkJICAgIHsKKwkJICAgICAgbm90aWZ5IChOVUxMLCAiKyVkIiwgZHVwbGljYXRlLT5vcGNvZGVfbnIpOworCQkgICAgfQorCQkgIG5vdGlmeSAoTlVMTCwgIjogZW50cmllcyAlZCAtIiwgZW50cnktPm5yX2luc25zKTsKKwkJICBmb3IgKGwgPSBlbnRyeS0+aW5zbnM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCisJCSAgICB7CisJCSAgICAgIG5vdGlmeSAoTlVMTCwgIiAlcy4lcyIsCisJCQkgICAgICBsLT5pbnNuLT5mb3JtYXRfbmFtZSwKKwkJCSAgICAgIGwtPmluc24tPm5hbWUpOworCQkgICAgfQorCQkgIG5vdGlmeSAoTlVMTCwgIlxuIik7CisJCX0KKwkgICAgfQorCSAgcHJpbnRfZ2VuX2VudHJ5X3BhdGggKHRhYmxlLT5vcGNvZGVfcnVsZS0+bGluZSwgdGFibGUsIG5vdGlmeSk7CisJICBub3RpZnkgKE5VTEwsICI6IGNvbWJpbmUgLSB3b3JkICVkLCBiaXRzIFslZC4uJWRdIGluIFslZC4uJWRdLCBvcGNvZGVzICVkLCBlbnRyaWVzICVkLCB1bmlxdWUgJWRcbiIsCisJCSAgdGFibGUtPm9wY29kZS0+d29yZF9uciwKKwkJICBpMnRhcmdldCAob3B0aW9ucy5oaV9iaXRfbnIsIHRhYmxlLT5vcGNvZGUtPmZpcnN0KSwKKwkJICBpMnRhcmdldCAob3B0aW9ucy5oaV9iaXRfbnIsIHRhYmxlLT5vcGNvZGUtPmxhc3QpLAorCQkgIGkydGFyZ2V0IChvcHRpb25zLmhpX2JpdF9uciwgdGFibGUtPm9wY29kZV9ydWxlLT5maXJzdCksCisJCSAgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCB0YWJsZS0+b3Bjb2RlX3J1bGUtPmxhc3QpLAorCQkgIHRhYmxlLT5vcGNvZGUtPm5yX29wY29kZXMsCisJCSAgdGFibGUtPm5yX2VudHJpZXMsCisJCSAgbnJfdW5pcXVlKTsKKwl9CisgICAgfQorCQorICAvKiBDaGVjayB0aGF0IHRoZSBydWxlIGRpZCBtb3JlIHRoYW4gcmUtYXJhbmdlIHRoZSBvcmRlciBvZiB0aGUKKyAgICAgaW5zdHJ1Y3Rpb25zICovCisgIHsKKyAgICAgIGdlbl9lbnRyeSAqZW50cnk7CisgICAgICBmb3IgKGVudHJ5ID0gdGFibGUtPmVudHJpZXM7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPnNpYmxpbmcpCisJeworCSAgaWYgKGVudHJ5LT5jb21iaW5lZF9wYXJlbnQgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmIChpbnNuX2xpc3RfY21wICh0YWJsZS0+aW5zbnMsIGVudHJ5LT5pbnNucykgPT0gMCkKKwkJeworCQkgIHByaW50X2dlbl9lbnRyeV9wYXRoICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmxpbmUsIHRhYmxlLCB3YXJuaW5nKTsKKwkJICB3YXJuaW5nIChOVUxMLCAiOiBBcHBseWluZyBydWxlIGp1c3QgY29waWVkIGFsbCBpbnN0cnVjdGlvbnNcbiIpOworCQkgIHByaW50X2dlbl9lbnRyeV9pbnNucyAoZW50cnksIHdhcm5pbmcsICJDb3BpZWQiLCBOVUxMKTsKKwkJICBlcnJvciAoTlVMTCwgIiIpOworCQl9CisJICAgIH0KKwl9ICAgIAorICB9CisKKyAgLyogaWYgc29tZSBmb3JtIG9mIGV4cGFuZGVkIHRhYmxlLCBmaWxsIGluIHRoZSBtaXNzaW5nIGRvdHMgKi8KKyAgc3dpdGNoICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbikKKyAgICB7CisgICAgY2FzZSBwYWRkZWRfc3dpdGNoX2dlbjoKKyAgICBjYXNlIGFycmF5X2dlbjoKKyAgICBjYXNlIGdvdG9fc3dpdGNoX2dlbjoKKyAgICAgIGlmICghdGFibGUtPm9wY29kZS0+aXNfYm9vbGVhbikKKwl7CisJICBnZW5fZW50cnkgKiplbnRyeSA9ICZ0YWJsZS0+ZW50cmllczsKKwkgIGdlbl9lbnRyeSAqaWxsZWdhbHMgPSBOVUxMOworCSAgZ2VuX2VudHJ5ICoqbGFzdF9pbGxlZ2FsID0gJmlsbGVnYWxzOworCSAgaW50IG9wY29kZV9uciA9IDA7CisJICB3aGlsZSAob3Bjb2RlX25yIDwgdGFibGUtPm9wY29kZS0+bnJfb3Bjb2RlcykKKwkgICAgeworCSAgICAgIGlmICgoKmVudHJ5KSA9PSBOVUxMIHx8ICgqZW50cnkpLT5vcGNvZGVfbnIgIT0gb3Bjb2RlX25yKQorCQl7CisJCSAgLyogbWlzc2luZyAtIGluc2VydCBpdCB1bmRlciBvdXIgZmVldCBhdCAqZW50cnkgKi8KKwkJICBnZW5fZW50cnlfaW5zZXJ0X2luc24gKHRhYmxlLAorCQkJCQkgdGFibGUtPnRvcC0+aXNhLT5pbGxlZ2FsX2luc24sCisJCQkJCSB0YWJsZS0+b3Bjb2RlLT53b3JkX25yLAorCQkJCQkgMCwgLyogbnJfcHJlZmV0Y2hlZF93b3JkcyA9PSAwIGZvciBpbnZhbGlkICovCisJCQkJCSBvcGNvZGVfbnIsIE5VTEwpOworCQkgIEFTU0VSVCAoKCplbnRyeSkgIT0gTlVMTCk7CisJCSAgQVNTRVJUICgoKmVudHJ5KS0+b3Bjb2RlX25yID09IG9wY29kZV9ucik7CisJCSAgKCpsYXN0X2lsbGVnYWwpID0gKmVudHJ5OworCQkgICgqbGFzdF9pbGxlZ2FsKS0+Y29tYmluZWRfcGFyZW50ID0gaWxsZWdhbHM7CisJCSAgbGFzdF9pbGxlZ2FsID0gJigqbGFzdF9pbGxlZ2FsKS0+Y29tYmluZWRfbmV4dDsKKwkJfQorCSAgICAgIGVudHJ5ID0gJigqZW50cnkpLT5zaWJsaW5nOworCSAgICAgIG9wY29kZV9ucisrOworCSAgICB9CisJICAvKiBvb3BzLCB3aWxsIGhhdmUgcG9pbnRlZCB0aGUgZmlyc3QgaWxsZWdhbCBpbnNuIGJhY2sgdG8KKyAgICAgICAgICAgICBpdHMgc2VsZi4gIEZpeCB0aGlzICovCisJICBpZiAoaWxsZWdhbHMgIT0gTlVMTCkKKwkgICAgaWxsZWdhbHMtPmNvbWJpbmVkX3BhcmVudCA9IE5VTEw7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBzd2l0Y2hfZ2VuOgorICAgIGNhc2UgaW52YWxpZF9nZW46CisgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgIGJyZWFrOworICAgIH0KKworICAvKiBhbmQgZG8gdGhlIHNhbWUgZm9yIHRoZSBuZXdseSBjcmVhdGVkIHN1YiBlbnRyaWVzIGJ1dCAqb25seSoKKyAgICAgZXhwYW5kIGVudHJpZXMgdGhhdCBoYXZlbid0IGJlZW4gY29tYmluZWQuICovCisgIHsKKyAgICBnZW5fZW50cnkgKmVudHJ5OworICAgIGZvciAoZW50cnkgPSB0YWJsZS0+ZW50cmllczsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSAgZW50cnktPnNpYmxpbmcpCisgICAgICB7CisJaWYgKGVudHJ5LT5jb21iaW5lZF9wYXJlbnQgPT0gTlVMTCkKKwkgIHsKKwkgICAgZ2VuX2VudHJ5X2V4cGFuZF9pbnNucyAoZW50cnkpOworCSAgfQorICAgICAgfQorICB9Cit9CisKK3ZvaWQKK2dlbl90YWJsZXNfZXhwYW5kX2luc25zIChnZW5fdGFibGUgKmdlbikKK3sKKyAgZ2VuX2xpc3QgKmVudHJ5OworICBmb3IgKGVudHJ5ID0gZ2VuLT50YWJsZXM7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpCisgICAgeworICAgICAgZ2VuX2VudHJ5X2V4cGFuZF9pbnNucyAoZW50cnktPnRhYmxlKTsKKyAgICB9Cit9CisKKworLyogY3JlYXRlIGEgbGlzdCBvZiBhbGwgdGhlIHNlbWFudGljIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUKKyAgIGdlbmVyYXRlZC4gIEVsaW1pbmF0ZSBhbnkgZHVwbGljYXRlcy4gVmVyaWZ5IHRoYXQgdGhlIGRlY29kZSBzdGFnZQorICAgd29ya2VkLiAqLworCitzdGF0aWMgdm9pZAorbWFrZV9nZW5fc2VtYW50aWNzX2xpc3QgKGxmICpmaWxlLAorCQkJIGdlbl9lbnRyeSAqZW50cnksCisJCQkgaW50IGRlcHRoLAorCQkJIHZvaWQgKmRhdGEpCit7CisgIGdlbl90YWJsZSAqZ2VuID0gKGdlbl90YWJsZSopIGRhdGE7CisgIGluc25fbGlzdCAqaW5zbjsKKyAgLyogTm90IGludGVyZXN0ZWQgaW4gYW4gZW50cmllIHRoYXQgaGF2ZSBiZWVuIGNvbWJpbmVkIGludG8gc29tZQorICAgICBvdGhlciBlbnRyeSBhdCB0aGUgc2FtZSBsZXZlbCAqLworICBpZiAoZW50cnktPmNvbWJpbmVkX3BhcmVudCAhPSBOVUxMKQorICAgIHJldHVybjsKKworICAvKiBhIGxlYWYgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSBvbmUgaW5zdHJ1Y3Rpb24uIElmIG5vdCB0aGUgZGVjb2RlCisgICAgIHN0YWdlIGZhaWxlZC4gKi8KKyAgQVNTRVJUIChlbnRyeS0+bnJfaW5zbnMgPT0gMSk7CisKKyAgLyogRW50ZXIgdGhpcyBpbnN0cnVjdGlvbiBpbnRvIHRoZSBsaXN0IG9mIHNlbWFudGljIGZ1bmN0aW9ucy4gKi8KKyAgaW5zbiA9IGluc25fbGlzdF9pbnNlcnQgKCZnZW4tPnNlbWFudGljcywgJmdlbi0+bnJfc2VtYW50aWNzLAorCQkJICAgZW50cnktPmluc25zLT5pbnNuLAorCQkJICAgZW50cnktPmV4cGFuZGVkX2JpdHMsCisJCQkgICBlbnRyeS0+cGFyZW50LT5vcGNvZGUsCisJCQkgICBlbnRyeS0+aW5zbnMtPm5yX3ByZWZldGNoZWRfd29yZHMsCisJCQkgICBtZXJnZV9kdXBsaWNhdGVfaW5zbnMpOworICAvKiBwb2ludCB0aGUgdGFibGUgZW50cnkgYXQgdGhlIHJlYWwgc2VtYW50aWMgZnVuY3Rpb24gKi8KKyAgQVNTRVJUIChpbnNuICE9IE5VTEwpOworICBlbnRyeS0+aW5zbnMtPnNlbWFudGljID0gaW5zbjsKK30KKworCit2b2lkCitnZW5fdGFibGVzX2V4cGFuZF9zZW1hbnRpY3MgKGdlbl90YWJsZSAqZ2VuKQoreworICBnZW5fbGlzdCAqZW50cnk7CisgIGZvciAoZW50cnkgPSBnZW4tPnRhYmxlczsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBlbnRyeS0+bmV4dCkKKyAgICB7CisgICAgICBnZW5fZW50cnlfdHJhdmVyc2VfdHJlZSAoTlVMTCwKKwkJCSAgICAgICBlbnRyeS0+dGFibGUsCisJCQkgICAgICAgMSwgLyogZGVwdGggKi8KKwkJCSAgICAgICBOVUxMLCAvKiBzdGFydC1oYW5kbGVyICovCisJCQkgICAgICAgbWFrZV9nZW5fc2VtYW50aWNzX2xpc3QsIC8qIGxlYWYtaGFuZGxlciAqLworCQkJICAgICAgIE5VTEwsIC8qIGVuZC1oYW5kbGVyICovCisJCQkgICAgICAgZ2VuKTsgLyogZGF0YSAqLworICB9Cit9CisKKworCisjaWZkZWYgTUFJTgorCisKK3N0YXRpYyB2b2lkCitkdW1wX29wY29kZV9maWVsZCAobGYgKmZpbGUsCisJCSAgIGNoYXIgKnByZWZpeCwKKwkJICAgb3Bjb2RlX2ZpZWxkICpmaWVsZCwKKwkJICAgY2hhciAqc3VmZml4LAorCQkgICBpbnQgbGV2ZWxzKQoreworICBsZl9wcmludGYgKGZpbGUsICIlcyhvcGNvZGVfZmllbGQgKikgMHglbHgiLCBwcmVmaXgsIChsb25nKSBmaWVsZCk7CisgIGlmIChsZXZlbHMgJiYgZmllbGQgIT0gTlVMTCkgeworICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOworICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGZpcnN0ICVkKSIsIGZpZWxkLT5maXJzdCk7CisgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obGFzdCAlZCkiLCBmaWVsZC0+bGFzdCk7CisgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obnJfb3Bjb2RlcyAlZCkiLCBmaWVsZC0+bnJfb3Bjb2Rlcyk7CisgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oaXNfYm9vbGVhbiAlZCkiLCBmaWVsZC0+aXNfYm9vbGVhbik7CisgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oYm9vbGVhbl9jb25zdGFudCAlZCkiLCBmaWVsZC0+Ym9vbGVhbl9jb25zdGFudCk7CisgICAgZHVtcF9vcGNvZGVfZmllbGQoZmlsZSwgIlxuKHBhcmVudCAiLCBmaWVsZC0+cGFyZW50LCAiKSIsIGxldmVscyAtIDEpOworICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOworICB9CisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKK30KKworCitzdGF0aWMgdm9pZAorZHVtcF9vcGNvZGVfYml0cyAobGYgKmZpbGUsCisJCSAgY2hhciAqcHJlZml4LAorCQkgIG9wY29kZV9iaXRzICpiaXRzLAorCQkgIGNoYXIgKnN1ZmZpeCwKKwkJICBpbnQgbGV2ZWxzKQoreworICBsZl9wcmludGYgKGZpbGUsICIlcyhvcGNvZGVfYml0cyAqKSAweCVseCIsIHByZWZpeCwgKGxvbmcpIGJpdHMpOworICAKKyAgaWYgKGxldmVscyAmJiBiaXRzICE9IE5VTEwpCisgICAgeworICAgICAgbGZfaW5kZW50IChmaWxlLCArMSk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbih2YWx1ZSAlZCkiLCBiaXRzLT52YWx1ZSk7CisgICAgICBkdW1wX29wY29kZV9maWVsZCAoZmlsZSwgIlxuKG9wY29kZSAiLCBiaXRzLT5vcGNvZGUsICIpIiwgMCk7CisgICAgICBkdW1wX2luc25fZmllbGQgKGZpbGUsICJcbihmaWVsZCAiLCBiaXRzLT5maWVsZCwgIikiKTsKKyAgICAgIGR1bXBfb3Bjb2RlX2JpdHMgKGZpbGUsICJcbihuZXh0ICIsIGJpdHMtPm5leHQsICIpIiwgbGV2ZWxzIC0gMSk7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKKyAgICB9CisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKK30KKworCisKK3N0YXRpYyB2b2lkCitkdW1wX2luc25fbGlzdCAobGYgKmZpbGUsCisJCWNoYXIgKnByZWZpeCwKKwkJaW5zbl9saXN0ICplbnRyeSwKKwkJY2hhciAqc3VmZml4KQoreworICBsZl9wcmludGYgKGZpbGUsICIlcyhpbnNuX2xpc3QgKikgMHglbHgiLCBwcmVmaXgsIChsb25nKSBlbnRyeSk7CisKKyAgaWYgKGVudHJ5ICE9IE5VTEwpIHsKKyAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgICBkdW1wX2luc25fZW50cnkgKGZpbGUsICJcbihpbnNuICIsIGVudHJ5LT5pbnNuLCAiKSIpOworICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5leHQgMHglbHgpIiwgKGxvbmcpIGVudHJ5LT5uZXh0KTsKKyAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKKyAgfQorICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Cit9CisKKworc3RhdGljIHZvaWQKK2R1bXBfaW5zbl93b3JkX2VudHJ5X2xpc3RfZW50cmllcyAobGYgKmZpbGUsCisJCQkgICAgICAgY2hhciAqcHJlZml4LAorCQkJICAgICAgIGluc25fbGlzdCAqZW50cnksCisJCQkgICAgICAgY2hhciAqc3VmZml4KQoreworICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHByZWZpeCk7CisgIHdoaWxlIChlbnRyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGR1bXBfaW5zbl9saXN0IChmaWxlLCAiXG4oIiwgZW50cnksICIpIik7CisgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworICAgIH0KKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOworfQorCisKK3N0YXRpYyB2b2lkCitkdW1wX2dlbl9lbnRyeSAobGYgKmZpbGUsCisJCWNoYXIgKnByZWZpeCwKKwkJZ2VuX2VudHJ5ICp0YWJsZSwKKwkJY2hhciAqc3VmZml4LAorCQlpbnQgbGV2ZWxzKQoreworCisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzKGdlbl9lbnRyeSAqKSAweCVseCIsIHByZWZpeCwgKGxvbmcpIHRhYmxlKTsKKworICBpZiAobGV2ZWxzICYmIHRhYmxlICE9IE5VTEwpIHsKKworICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOworICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG9wY29kZV9uciAlZCkiLCB0YWJsZS0+b3Bjb2RlX25yKTsKKyAgICBsZl9wcmludGYgKGZpbGUsICJcbih3b3JkX25yICVkKSIsIHRhYmxlLT53b3JkX25yKTsKKyAgICBkdW1wX29wY29kZV9iaXRzIChmaWxlLCAiXG4oZXhwYW5kZWRfYml0cyAiLCB0YWJsZS0+ZXhwYW5kZWRfYml0cywgIikiLCAtMSk7CisgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obnJfaW5zbnMgJWQpIiwgdGFibGUtPm5yX2luc25zKTsKKyAgICBkdW1wX2luc25fd29yZF9lbnRyeV9saXN0X2VudHJpZXMgKGZpbGUsICJcbihpbnNucyAiLCB0YWJsZS0+aW5zbnMsICIpIik7CisgICAgZHVtcF9kZWNvZGVfcnVsZSAoZmlsZSwgIlxuKG9wY29kZV9ydWxlICIsIHRhYmxlLT5vcGNvZGVfcnVsZSwgIikiKTsKKyAgICBkdW1wX29wY29kZV9maWVsZCAoZmlsZSwgIlxuKG9wY29kZSAiLCB0YWJsZS0+b3Bjb2RlLCAiKSIsIDApOworICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5yX2VudHJpZXMgJWQpIiwgdGFibGUtPm5yX2VudHJpZXMpOworICAgIGR1bXBfZ2VuX2VudHJ5IChmaWxlLCAiXG4oZW50cmllcyAiLCB0YWJsZS0+ZW50cmllcywgIikiLCB0YWJsZS0+bnJfZW50cmllcyk7CisgICAgZHVtcF9nZW5fZW50cnkgKGZpbGUsICJcbihzaWJsaW5nICIsIHRhYmxlLT5zaWJsaW5nLCAiKSIsIGxldmVscyAtIDEpOworICAgIGR1bXBfZ2VuX2VudHJ5IChmaWxlLCAiXG4ocGFyZW50ICIsIHRhYmxlLT5wYXJlbnQsICIpIiwgMCk7CisgICAgbGZfaW5kZW50IChmaWxlLCAtMSk7CisgIH0KKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9nZW5fbGlzdCAobGYgKmZpbGUsCisJICAgICAgIGNoYXIgKnByZWZpeCwKKwkgICAgICAgZ2VuX2xpc3QgKmVudHJ5LAorCSAgICAgICBjaGFyICpzdWZmaXgsCisJICAgICAgIGludCBsZXZlbHMpCit7CisgIHdoaWxlIChlbnRyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzKGdlbl9saXN0ICopIDB4JWx4IiwgcHJlZml4LCAobG9uZykgZW50cnkpOworICAgICAgZHVtcF9nZW5fZW50cnkgKGZpbGUsICJcbigiLCBlbnRyeS0+dGFibGUsICIpIiwgbGV2ZWxzKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5leHQgKGdlbl9saXN0ICopIDB4JWx4KSIsIChsb25nKSBlbnRyeS0+bmV4dCk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitkdW1wX2dlbl90YWJsZSAobGYgKmZpbGUsCisJCWNoYXIgKnByZWZpeCwKKwkJZ2VuX3RhYmxlICpnZW4sCisJCWNoYXIgKnN1ZmZpeCwKKwkJaW50IGxldmVscykKK3sKKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMoZ2VuX3RhYmxlICopIDB4JWx4IiwgcHJlZml4LCAobG9uZykgZ2VuKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiXG4oaXNhIChpbnNuX3RhYmxlICopIDB4JWx4KSIsIChsb25nKSBnZW4tPmlzYSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKHJ1bGVzIChkZWNvZGVfdGFibGUgKikgMHglbHgpIiwgKGxvbmcpIGdlbi0+cnVsZXMpOworICBkdW1wX2dlbl9saXN0IChmaWxlLCAiXG4oIiwgZ2VuLT50YWJsZXMsICIpIiwgbGV2ZWxzKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOworfQorCisKK2lnZW5fb3B0aW9ucyBvcHRpb25zOworCitpbnQKK21haW4gKGludCBhcmdjLAorICAgICAgY2hhciAqKmFyZ3YpCit7CisgIGRlY29kZV90YWJsZSAqZGVjb2RlX3J1bGVzOworICBpbnNuX3RhYmxlICppbnN0cnVjdGlvbnM7CisgIGdlbl90YWJsZSAqZ2VuOworICBsZiAqbDsKKworICBpZiAoYXJnYyAhPSA3KQorICAgIGVycm9yIChOVUxMLCAiVXNhZ2U6IGluc24gPGZpbHRlci1pbj4gPGhpLWJpdC1ucj4gPGluc24tYml0LXNpemU+IDx3aWR0aHM+IDxkZWNvZGUtdGFibGU+IDxpbnNuLXRhYmxlPlxuIik7CisKKyAgSU5JVF9PUFRJT05TIChvcHRpb25zKTsKKworICBmaWx0ZXJfcGFyc2UgKCZvcHRpb25zLmZsYWdzX2ZpbHRlciwgYXJndlsxXSk7CisKKyAgb3B0aW9ucy5oaV9iaXRfbnIgPSBhMmkoYXJndlsyXSk7CisgIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSA9IGEyaShhcmd2WzNdKTsKKyAgb3B0aW9ucy5pbnNuX3NwZWNpZnlpbmdfd2lkdGhzID0gYTJpKGFyZ3ZbNF0pOworICBBU1NFUlQob3B0aW9ucy5oaV9iaXRfbnIgPCBvcHRpb25zLmluc25fYml0X3NpemUpOworCisgIGluc3RydWN0aW9ucyA9IGxvYWRfaW5zbl90YWJsZSAoYXJndls2XSwgTlVMTCk7CisgIGRlY29kZV9ydWxlcyA9IGxvYWRfZGVjb2RlX3RhYmxlIChhcmd2WzVdKTsKKyAgZ2VuID0gbWFrZV9nZW5fdGFibGVzIChpbnN0cnVjdGlvbnMsIGRlY29kZV9ydWxlcyk7CisKKyAgZ2VuX3RhYmxlc19leHBhbmRfaW5zbnMgKGdlbik7CisKKyAgbCA9IGxmX29wZW4gKCItIiwgInN0ZG91dCIsIGxmX29taXRfcmVmZXJlbmNlcywgbGZfaXNfdGV4dCwgInRtcC1sZC1pbnNuIik7CisKKyAgZHVtcF9nZW5fdGFibGUgKGwsICIoIiwgZ2VuLCAiKVxuIiwgLTEpOworICByZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vaWdlbi9nZW4uaCBiL3NpbS9pZ2VuL2dlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NGUyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaWdlbi9nZW4uaApAQCAtMCwwICsxLDIyNyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQsMTk5NSwxOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCit0eXBlZGVmIHN0cnVjdCBfb3Bjb2RlX2ZpZWxkIG9wY29kZV9maWVsZDsKK3N0cnVjdCBfb3Bjb2RlX2ZpZWxkIHsKKyAgaW50IHdvcmRfbnI7CisgIGludCBmaXJzdDsKKyAgaW50IGxhc3Q7CisgIGludCBpc19ib29sZWFuOworICBpbnQgbnJfb3Bjb2RlczsKKyAgdW5zaWduZWQgYm9vbGVhbl9jb25zdGFudDsKKyAgb3Bjb2RlX2ZpZWxkICpwYXJlbnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfb3Bjb2RlX2JpdHMgb3Bjb2RlX2JpdHM7CitzdHJ1Y3QgX29wY29kZV9iaXRzIHsKKyAgaW50IHZhbHVlOworICBpbnQgZmlyc3Q7CisgIGludCBsYXN0OworICBpbnNuX2ZpZWxkX2VudHJ5ICpmaWVsZDsKKyAgb3Bjb2RlX2ZpZWxkICpvcGNvZGU7CisgIG9wY29kZV9iaXRzICpuZXh0OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX2luc25fb3Bjb2RlcyBpbnNuX29wY29kZXM7CitzdHJ1Y3QgX2luc25fb3Bjb2RlcyB7CisgIG9wY29kZV9maWVsZCAqb3Bjb2RlOworICBpbnNuX29wY29kZXMgKm5leHQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfaW5zbl9saXN0IGluc25fbGlzdDsKK3N0cnVjdCBfaW5zbl9saXN0IHsKKyAgLyogdGhlIGluc3RydWN0aW9uICovCisgIGluc25fZW50cnkgKmluc247CisgIC8qIGxpc3Qgb2Ygbm9uIGNvbnN0YW50IGJpdHMgdGhhdCBoYXZlIGJlZW4gbWFkZSBjb25zdGFudCAqLworICBvcGNvZGVfYml0cyAqZXhwYW5kZWRfYml0czsKKyAgLyogbGlzdCBvZiB0aGUgdmFyaW91cyBvcGNvZGUgZmllbGQgcGF0aHMgdXNlZCB0byByZWFjaCB0aGlzCisgICAgIGluc3RydWN0aW9uICovCisgIGluc25fb3Bjb2RlcyAqb3Bjb2RlczsKKyAgLyogbnVtYmVyIG9mIHByZWZldGNoZWQgd29yZHMgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24gKi8KKyAgaW50IG5yX3ByZWZldGNoZWRfd29yZHM7CisgIC8qIFRoZSBzZW1hbnRpYyBmdW5jdGlvbiBsaXN0X2VudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpbnNuICovCisgIGluc25fbGlzdCAqc2VtYW50aWM7CisgIC8qIGxpbmtlZCBsaXN0ICovCisgIGluc25fbGlzdCAqbmV4dDsKK307CisKKy8qIGZvcndhcmQgKi8KK3R5cGVkZWYgc3RydWN0IF9nZW5fbGlzdCBnZW5fbGlzdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2dlbl9lbnRyeSBnZW5fZW50cnk7CitzdHJ1Y3QgX2dlbl9lbnRyeSB7CisKKyAgLyogYXMgYW4gZW50cnkgaW4gYSB0YWJsZSAqLworICBpbnQgd29yZF9ucjsKKyAgaW50IG9wY29kZV9ucjsKKyAgZ2VuX2VudHJ5ICpzaWJsaW5nOworICBvcGNvZGVfYml0cyAqZXhwYW5kZWRfYml0czsKKyAgZ2VuX2VudHJ5ICpwYXJlbnQ7IC8qIHBhcmVudCBoYXMgdGhlIG9wY29kZSogZGF0YSAqLworCisgIC8qIGFzIGEgdGFibGUgY29udGFpbmluZyBlbnRyaWVzICovCisgIGRlY29kZV90YWJsZSAqb3Bjb2RlX3J1bGU7CisgIG9wY29kZV9maWVsZCAqb3Bjb2RlOworICBpbnQgbnJfcHJlZmV0Y2hlZF93b3JkczsKKyAgaW50IG5yX2VudHJpZXM7CisgIGdlbl9lbnRyeSAqZW50cmllczsKKworICAvKiBhcyBib3RoIGFuIGVudHJ5IGFuZCBhIHRhYmxlICovCisgIGludCBucl9pbnNuczsKKyAgaW5zbl9saXN0ICppbnNuczsKKworICAvKiBpZiBzaWJsaW5ncyBhcmUgYmVpbmcgY29tYmluZWQgKi8KKyAgZ2VuX2VudHJ5ICpjb21iaW5lZF9uZXh0OworICBnZW5fZW50cnkgKmNvbWJpbmVkX3BhcmVudDsKKworICAvKiBvdXIgdG9wLW9mLXRyZWUgKi8KKyAgZ2VuX2xpc3QgKnRvcDsKK307CisKKworc3RydWN0IF9nZW5fbGlzdCB7CisgIG1vZGVsX2VudHJ5ICptb2RlbDsKKyAgaW5zbl90YWJsZSAqaXNhOworICBnZW5fZW50cnkgKnRhYmxlOworICBnZW5fbGlzdCAqbmV4dDsKK307CisKKwordHlwZWRlZiBzdHJ1Y3QgX2dlbl90YWJsZSBnZW5fdGFibGU7CitzdHJ1Y3QgX2dlbl90YWJsZSB7CisgIC8qIGxpc3Qgb2YgYWxsIHRoZSBpbnN0cnVjdGlvbnMgKi8KKyAgaW5zbl90YWJsZSAqaXNhOworICAvKiBsaXN0IG9mIGFsbCB0aGUgc2VtYW50aWMgZnVuY3Rpb25zICovCisgIGRlY29kZV90YWJsZSAqcnVsZXM7CisgIC8qIGxpc3Qgb2YgYWxsIHRoZSBnZW5lcmF0ZWQgaW5zdHJ1Y3Rpb24gdGFibGVzICovCisgIGdlbl9saXN0ICp0YWJsZXM7CisgIC8qIGxpc3Qgb2YgYWxsIHRoZSBzZW1hbnRpYyBmdW5jdGlvbnMgKi8KKyAgaW50IG5yX3NlbWFudGljczsKKyAgaW5zbl9saXN0ICpzZW1hbnRpY3M7Cit9OworCisKK2V4dGVybiBnZW5fdGFibGUgKm1ha2VfZ2VuX3RhYmxlcworKGluc25fdGFibGUgKmlzYSwKKyBkZWNvZGVfdGFibGUgKnJ1bGVzKTsKKworCitleHRlcm4gdm9pZCBnZW5fdGFibGVzX2V4cGFuZF9pbnNucworKGdlbl90YWJsZSAqZ2VuKTsKKworZXh0ZXJuIHZvaWQgZ2VuX3RhYmxlc19leHBhbmRfc2VtYW50aWNzCisoZ2VuX3RhYmxlICpnZW4pOworCitleHRlcm4gaW50IGdlbl9lbnRyeV9kZXB0aAorKGdlbl9lbnRyeSAqdGFibGUpOworCisKKworLyogVHJhdmVyc2UgdGhlIGNyZWF0ZWQgZGF0YSBzdHJ1Y3R1cmUgKi8KKwordHlwZWRlZiB2b2lkIGdlbl9lbnRyeV9oYW5kbGVyCisobGYgKmZpbGUsCisgZ2VuX2VudHJ5ICplbnRyeSwKKyBpbnQgZGVwdGgsCisgdm9pZCAqZGF0YSk7CisKK2V4dGVybiB2b2lkIGdlbl9lbnRyeV90cmF2ZXJzZV90cmVlCisobGYgKmZpbGUsCisgZ2VuX2VudHJ5ICp0YWJsZSwKKyBpbnQgZGVwdGgsCisgZ2VuX2VudHJ5X2hhbmRsZXIgKnN0YXJ0LAorIGdlbl9lbnRyeV9oYW5kbGVyICpsZWFmLAorIGdlbl9lbnRyeV9oYW5kbGVyICplbmQsCisgdm9pZCAqZGF0YSk7CisKKworCisvKiBNaXNjIGZ1bmN0aW9ucyAtIGFjdHVhbGx5IGluIGlnZW4uYyAqLworCisKKy8qIENhY2hlIGZ1bmN0aW9uczogKi8KKworZXh0ZXJuIGludCBwcmludF9pY2FjaGVfZnVuY3Rpb25fZm9ybWFsCisobGYgKmZpbGUsIGludCBucl9wcmVmZXRjaGVkX3dvcmRzKTsKKworZXh0ZXJuIGludCBwcmludF9pY2FjaGVfZnVuY3Rpb25fYWN0dWFsCisobGYgKmZpbGUsIGludCBucl9wcmVmZXRjaGVkX3dvcmRzKTsKKworZXh0ZXJuIGludCBwcmludF9pY2FjaGVfZnVuY3Rpb25fdHlwZQorKGxmICpmaWxlKTsKKworZXh0ZXJuIGludCBwcmludF9zZW1hbnRpY19mdW5jdGlvbl9mb3JtYWwKKyhsZiAqZmlsZSwgaW50IG5yX3ByZWZldGNoZWRfd29yZHMpOworCitleHRlcm4gaW50IHByaW50X3NlbWFudGljX2Z1bmN0aW9uX2FjdHVhbAorKGxmICpmaWxlLCBpbnQgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7CisKK2V4dGVybiBpbnQgcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fdHlwZQorKGxmICpmaWxlKTsKKworZXh0ZXJuIGludCBwcmludF9pZGVjb2RlX2Z1bmN0aW9uX2Zvcm1hbAorKGxmICpmaWxlLCBpbnQgbnJfcHJlZmV0Y2hlZF93b3Jkcyk7CisKK2V4dGVybiBpbnQgcHJpbnRfaWRlY29kZV9mdW5jdGlvbl9hY3R1YWwKKyhsZiAqZmlsZSwgaW50IG5yX3ByZWZldGNoZWRfd29yZHMpOworCit0eXBlZGVmIGVudW0geworICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MsCisgIGZ1bmN0aW9uX25hbWVfcHJlZml4X2lkZWNvZGUsCisgIGZ1bmN0aW9uX25hbWVfcHJlZml4X2l0YWJsZSwKKyAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWNhY2hlLAorICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9lbmdpbmUsCisgIGZ1bmN0aW9uX25hbWVfcHJlZml4X25vbmUKK30gbGZfZnVuY3Rpb25fbmFtZV9wcmVmaXhlczsKKwordHlwZWRlZiBlbnVtIHsKKyAgaXNfZnVuY3Rpb25fZGVjbGFyYXRpb24gPSAwLAorICBpc19mdW5jdGlvbl9kZWZpbml0aW9uID0gMSwKKyAgaXNfZnVuY3Rpb25fdmFyaWFibGUsCit9IGZ1bmN0aW9uX2RlY2xfdHlwZTsKKworZXh0ZXJuIGludCBwcmludF9mdW5jdGlvbl9uYW1lCisobGYgKmZpbGUsCisgY29uc3QgY2hhciAqYmFzZW5hbWUsCisgY29uc3QgY2hhciAqZm9ybWF0X25hbWUsCisgY29uc3QgY2hhciAqbW9kZWxfbmFtZSwKKyBvcGNvZGVfYml0cyAqZXhwYW5kZWRfYml0cywKKyBsZl9mdW5jdGlvbl9uYW1lX3ByZWZpeGVzIHByZWZpeCk7CisKK2V4dGVybiB2b2lkIHByaW50X215X2RlZmluZXMKKyhsZiAqZmlsZSwKKyBjb25zdCBjaGFyICpiYXNlbmFtZSwKKyBjb25zdCBjaGFyICpmb3JtYXRfbmFtZSwKKyBvcGNvZGVfYml0cyAqZXhwYW5kZWRfYml0cyk7CisKK2V4dGVybiB2b2lkIHByaW50X2l0cmFjZQorKGxmICpmaWxlLAorIGluc25fZW50cnkgKmluc24sCisgaW50IGlkZWNvZGUpOworCitleHRlcm4gdm9pZCBwcmludF9zaW1fZW5naW5lX2Fib3J0CisobGYgKmZpbGUsCisgY29uc3QgY2hhciAqbWVzc2FnZSk7CisKKworZXh0ZXJuIHZvaWQgcHJpbnRfaW5jbHVkZSAobGYgKmZpbGUsIGlnZW5fbW9kdWxlIG1vZHVsZSk7CitleHRlcm4gdm9pZCBwcmludF9pbmNsdWRlX2lubGluZSAgKGxmICpmaWxlLCBpZ2VuX21vZHVsZSBtb2R1bGUpOworZXh0ZXJuIHZvaWQgcHJpbnRfaW5jbHVkZXMgKGxmICpmaWxlKTsKKwpkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vaWdlbi5jIGIvc2ltL2lnZW4vaWdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NGYwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaWdlbi9pZ2VuLmMKQEAgLTAsMCArMSwxNjIxIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJsZi5oIgorI2luY2x1ZGUgInRhYmxlLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiZmlsdGVyLmgiCisKKyNpbmNsdWRlICJpZ2VuLmgiCisKKyNpbmNsdWRlICJsZC1pbnNuLmgiCisjaW5jbHVkZSAibGQtZGVjb2RlLmgiCisjaW5jbHVkZSAibGQtY2FjaGUuaCIKKworI2luY2x1ZGUgImdlbi5oIgorCisjaW5jbHVkZSAiZ2VuLW1vZGVsLmgiCisjaW5jbHVkZSAiZ2VuLWljYWNoZS5oIgorI2luY2x1ZGUgImdlbi1pdGFibGUuaCIKKyNpbmNsdWRlICJnZW4taWRlY29kZS5oIgorI2luY2x1ZGUgImdlbi1zZW1hbnRpY3MuaCIKKyNpbmNsdWRlICJnZW4tZW5naW5lLmgiCisjaW5jbHVkZSAiZ2VuLXN1cHBvcnQuaCIKKyNpbmNsdWRlICJnZW4tZW5naW5lLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogU2VtYW50aWMgZnVuY3Rpb25zICovCisKK2ludAorcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fZm9ybWFsIChsZiAqZmlsZSwKKwkJCQlpbnQgbnJfcHJlZmV0Y2hlZF93b3JkcykKK3sKKyAgaW50IG5yID0gMDsKKyAgaW50IHdvcmRfbnI7CisgIGlmIChvcHRpb25zLmdlbi5pY2FjaGUgfHwgbnJfcHJlZmV0Y2hlZF93b3JkcyA8IDApCisgICAgeworICAgICAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiU0lNX0RFU0Mgc2QsXG4iKTsKKyAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiVzaWRlY29kZV9jYWNoZSAqY2FjaGVfZW50cnksXG4iLAorCQkgICAgICAgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sKTsKKyAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiVzaW5zdHJ1Y3Rpb25fYWRkcmVzcyBjaWEiLAorCQkgICAgICAgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sKTsKKyAgICB9CisgIGVsc2UgaWYgKG9wdGlvbnMuZ2VuLnNtcCkKKyAgICB7CisgICAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICJzaW1fY3B1ICpjcHUsXG4iKTsKKyAgICAgIGZvciAod29yZF9uciA9IDA7IHdvcmRfbnIgPCBucl9wcmVmZXRjaGVkX3dvcmRzOyB3b3JkX25yKyspCisJeworCSAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiJXNpbnN0cnVjdGlvbl93b3JkIGluc3RydWN0aW9uXyVkLFxuIiwKKwkJCSAgIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCwKKwkJCSAgIHdvcmRfbnIpOworCX0KKyAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiVzaW5zdHJ1Y3Rpb25fYWRkcmVzcyBjaWEiLAorCQkgICAgICAgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICJTSU1fREVTQyBzZCxcbiIpOworICAgICAgZm9yICh3b3JkX25yID0gMDsgd29yZF9uciA8IG5yX3ByZWZldGNoZWRfd29yZHM7IHdvcmRfbnIrKykKKwl7CisJICBuciArPSBsZl9wcmludGYgKGZpbGUsICIlc2luc3RydWN0aW9uX3dvcmQgaW5zdHJ1Y3Rpb25fJWQsXG4iLAorCQkJICAgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sLAorCQkJICAgd29yZF9ucik7CisJfQorICAgICAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiJXNpbnN0cnVjdGlvbl9hZGRyZXNzIGNpYSIsCisJCSAgICAgICBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOworICAgIH0KKyAgcmV0dXJuIG5yOworfQorCitpbnQKK3ByaW50X3NlbWFudGljX2Z1bmN0aW9uX2FjdHVhbCAobGYgKmZpbGUsCisJCQkJaW50IG5yX3ByZWZldGNoZWRfd29yZHMpCit7CisgIGludCBuciA9IDA7CisgIGludCB3b3JkX25yOworICBpZiAob3B0aW9ucy5nZW4uaWNhY2hlIHx8IG5yX3ByZWZldGNoZWRfd29yZHMgPCAwKQorICAgIHsKKyAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgInNkLCBjYWNoZV9lbnRyeSwgY2lhIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKG9wdGlvbnMuZ2VuLnNtcCkKKwluciArPSBsZl9wcmludGYgKGZpbGUsICJjcHUiKTsKKyAgICAgIGVsc2UKKwluciArPSBsZl9wcmludGYgKGZpbGUsICJzZCIpOworICAgICAgZm9yICh3b3JkX25yID0gMDsgd29yZF9uciA8IG5yX3ByZWZldGNoZWRfd29yZHM7IHdvcmRfbnIrKykKKwluciArPSBsZl9wcmludGYgKGZpbGUsICIsIGluc3RydWN0aW9uXyVkIiwgd29yZF9ucik7CisgICAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICIsIGNpYSIpOworICAgIH0KKyAgcmV0dXJuIG5yOworfQorCitpbnQKK3ByaW50X3NlbWFudGljX2Z1bmN0aW9uX3R5cGUgKGxmICpmaWxlKQoreworICBpbnQgbnIgPSAwOworICBuciArPSBsZl9wcmludGYgKGZpbGUsICIlc2luc3RydWN0aW9uX2FkZHJlc3MiLAorCQkgICBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOworICByZXR1cm4gbnI7Cit9CisKKworLyogSWRlY29kZSBmdW5jdGlvbnMgKi8KKworaW50CitwcmludF9pY2FjaGVfZnVuY3Rpb25fZm9ybWFsIChsZiAqZmlsZSwKKwkJCSAgICAgIGludCBucl9wcmVmZXRjaGVkX3dvcmRzKQoreworICBpbnQgbnIgPSAwOworICBpbnQgd29yZF9ucjsKKyAgaWYgKG9wdGlvbnMuZ2VuLnNtcCkKKyAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgInNpbV9jcHUgKmNwdSxcbiIpOworICBlbHNlCisgICAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICJTSU1fREVTQyBzZCxcbiIpOworICBmb3IgKHdvcmRfbnIgPSAwOyB3b3JkX25yIDwgbnJfcHJlZmV0Y2hlZF93b3Jkczsgd29yZF9ucisrKQorICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiAlc2luc3RydWN0aW9uX3dvcmQgaW5zdHJ1Y3Rpb25fJWQsXG4iLAorCQkgICAgIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCwgd29yZF9ucik7CisgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiAlc2luc3RydWN0aW9uX2FkZHJlc3MgY2lhLFxuIiwKKwkJICAgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sKTsKKyAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiICVzaWRlY29kZV9jYWNoZSAqY2FjaGVfZW50cnkiLAorCQkgICBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOworICByZXR1cm4gbnI7Cit9CisKK2ludAorcHJpbnRfaWNhY2hlX2Z1bmN0aW9uX2FjdHVhbCAobGYgKmZpbGUsCisJCQkgICAgICBpbnQgbnJfcHJlZmV0Y2hlZF93b3JkcykKK3sKKyAgaW50IG5yID0gMDsKKyAgaW50IHdvcmRfbnI7CisgIGlmIChvcHRpb25zLmdlbi5zbXApCisgICAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiY3B1Iik7CisgIGVsc2UKKyAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICJzZCIpOworICBmb3IgKHdvcmRfbnIgPSAwOyB3b3JkX25yIDwgbnJfcHJlZmV0Y2hlZF93b3Jkczsgd29yZF9ucisrKQorICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiwgaW5zdHJ1Y3Rpb25fJWQiLCB3b3JkX25yKTsKKyAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiLCBjaWEsIGNhY2hlX2VudHJ5Iik7CisgIHJldHVybiBucjsKK30KKworaW50CitwcmludF9pY2FjaGVfZnVuY3Rpb25fdHlwZSAobGYgKmZpbGUpCit7CisgIGludCBucjsKKyAgaWYgKG9wdGlvbnMuZ2VuLnNlbWFudGljX2ljYWNoZSkKKyAgICB7CisgICAgICBuciA9IHByaW50X3NlbWFudGljX2Z1bmN0aW9uX3R5cGUgKGZpbGUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG5yID0gbGZfcHJpbnRmIChmaWxlLCAiJXNpZGVjb2RlX3NlbWFudGljICoiLAorCQkgICAgICBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOworICAgIH0KKyAgcmV0dXJuIG5yOworfQorCisKKy8qIEZ1bmN0aW9uIG5hbWVzICovCisKK3N0YXRpYyBpbnQKK3ByaW50X29wY29kZV9iaXRzIChsZiAqZmlsZSwKKwkJICAgb3Bjb2RlX2JpdHMgKmJpdHMpCit7CisgIGludCBuciA9IDA7CisgIGlmIChiaXRzID09IE5VTEwpCisgICAgcmV0dXJuIG5yOworICBuciArPSBsZl9wdXRjaHIgKGZpbGUsICdfJyk7CisgIG5yICs9IGxmX3B1dHN0ciAoZmlsZSwgYml0cy0+ZmllbGQtPnZhbF9zdHJpbmcpOworICBpZiAoYml0cy0+b3Bjb2RlLT5pc19ib29sZWFuICYmIGJpdHMtPnZhbHVlID09IDApCisgICAgbnIgKz0gbGZfcHV0aW50IChmaWxlLCBiaXRzLT5vcGNvZGUtPmJvb2xlYW5fY29uc3RhbnQpOworICBlbHNlIGlmICghYml0cy0+b3Bjb2RlLT5pc19ib29sZWFuKSB7CisgICAgaWYgKGJpdHMtPm9wY29kZS0+bGFzdCA8IGJpdHMtPmZpZWxkLT5sYXN0KQorICAgICAgbnIgKz0gbGZfcHV0aW50IChmaWxlLCBiaXRzLT52YWx1ZSA8PCAoYml0cy0+ZmllbGQtPmxhc3QgLSBiaXRzLT5vcGNvZGUtPmxhc3QpKTsKKyAgICBlbHNlCisgICAgICBuciArPSBsZl9wdXRpbnQgKGZpbGUsIGJpdHMtPnZhbHVlKTsKKyAgfQorICBuciArPSBwcmludF9vcGNvZGVfYml0cyAoZmlsZSwgYml0cy0+bmV4dCk7CisgIHJldHVybiBucjsKK30KKworc3RhdGljIGludAorcHJpbnRfY19uYW1lIChsZiAqZmlsZSwKKwkgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworICBpbnQgbnIgPSAwOworICBjb25zdCBjaGFyICpwb3M7CisgIGZvciAocG9zID0gbmFtZTsgKnBvcyAhPSAnXDAnOyBwb3MrKykKKyAgICB7CisgICAgICBzd2l0Y2ggKCpwb3MpCisJeworCWNhc2UgJy8nOgorCWNhc2UgJy0nOgorCSAgYnJlYWs7CisJY2FzZSAnICc6CisJY2FzZSAnLic6CisJICBuciArPSBsZl9wdXRjaHIgKGZpbGUsICdfJyk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgbnIgKz0gbGZfcHV0Y2hyIChmaWxlLCAqcG9zKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisgIHJldHVybiBucjsKK30KKworZXh0ZXJuIGludAorcHJpbnRfZnVuY3Rpb25fbmFtZSAobGYgKmZpbGUsCisJCSAgICAgY29uc3QgY2hhciAqYmFzZW5hbWUsCisJCSAgICAgY29uc3QgY2hhciAqZm9ybWF0X25hbWUsCisJCSAgICAgY29uc3QgY2hhciAqbW9kZWxfbmFtZSwKKwkJICAgICBvcGNvZGVfYml0cyAqZXhwYW5kZWRfYml0cywKKwkJICAgICBsZl9mdW5jdGlvbl9uYW1lX3ByZWZpeGVzIHByZWZpeCkKK3sKKyAgaW50IG5yID0gMDsKKyAgLyogdGhlIHByZWZpeCAqLworICBzd2l0Y2ggKHByZWZpeCkKKyAgICB7CisgICAgY2FzZSBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3M6CisgICAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICIlcyIsIG9wdGlvbnMubW9kdWxlLnNlbWFudGljcy5wcmVmaXgubCk7CisgICAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICJzZW1hbnRpY18iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWRlY29kZToKKyAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgb3B0aW9ucy5tb2R1bGUuaWRlY29kZS5wcmVmaXgubCk7CisgICAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICJpZGVjb2RlXyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pdGFibGU6CisgICAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICIlc2l0YWJsZV8iLCBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGU6CisgICAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICIlcyIsIG9wdGlvbnMubW9kdWxlLmljYWNoZS5wcmVmaXgubCk7CisgICAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICJpY2FjaGVfIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGZ1bmN0aW9uX25hbWVfcHJlZml4X2VuZ2luZToKKyAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgb3B0aW9ucy5tb2R1bGUuZW5naW5lLnByZWZpeC5sKTsKKyAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgImVuZ2luZV8iKTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICAKKyAgaWYgKG1vZGVsX25hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBuciArPSBwcmludF9jX25hbWUgKGZpbGUsIG1vZGVsX25hbWUpOworICAgICAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiXyIpOworICAgIH0KKworICAvKiB0aGUgZnVuY3Rpb24gbmFtZSAqLworICBuciArPSBwcmludF9jX25hbWUgKGZpbGUsIGJhc2VuYW1lKTsKKyAgCisgIC8qIHRoZSBmb3JtYXQgbmFtZSBpZiBhdmFpbGFibGUgKi8KKyAgaWYgKGZvcm1hdF9uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiXyIpOworICAgICAgbnIgKz0gcHJpbnRfY19uYW1lIChmaWxlLCBmb3JtYXRfbmFtZSk7CisgICAgfQorCisgIC8qIHRoZSBzdWZmaXggKi8KKyAgbnIgKz0gcHJpbnRfb3Bjb2RlX2JpdHMgKGZpbGUsIGV4cGFuZGVkX2JpdHMpOworCisgIHJldHVybiBucjsKK30KKworCit2b2lkCitwcmludF9teV9kZWZpbmVzIChsZiAqZmlsZSwKKwkJICBjb25zdCBjaGFyICpiYXNlbmFtZSwKKwkJICBjb25zdCBjaGFyICpmb3JtYXRfbmFtZSwKKwkJICBvcGNvZGVfYml0cyAqZXhwYW5kZWRfYml0cykKK3sKKyAgLyogI2RlZmluZSBNWV9JTkRFWCB4eHh4eCAqLworICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOworICBsZl9wcmludGYgKGZpbGUsICIjdW5kZWYgTVlfSU5ERVhcbiIpOworICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOworICBsZl9wcmludGYgKGZpbGUsICIjZGVmaW5lIE1ZX0lOREVYICIpOworICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAorCQkgICAgICAgYmFzZW5hbWUsIGZvcm1hdF9uYW1lLCBOVUxMLAorCQkgICAgICAgTlVMTCwKKwkJICAgICAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X2l0YWJsZSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgIC8qICNkZWZpbmUgTVlfUFJFRklYIHh4eHh4eCAqLworICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOworICBsZl9wcmludGYgKGZpbGUsICIjdW5kZWYgIik7CisgIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCisJCSAgICAgICBiYXNlbmFtZSwgZm9ybWF0X25hbWUsIE5VTEwsCisJCSAgICAgICBleHBhbmRlZF9iaXRzLAorCQkgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfbm9uZSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiN1bmRlZiBNWV9QUkVGSVhcbiIpOworICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOworICBsZl9wcmludGYgKGZpbGUsICIjZGVmaW5lIE1ZX1BSRUZJWCAiKTsKKyAgcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKKwkJICAgICAgIGJhc2VuYW1lLCBmb3JtYXRfbmFtZSwgTlVMTCwKKwkJICAgICAgIGV4cGFuZGVkX2JpdHMsCisJCSAgICAgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9ub25lKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgLyogI2RlZmluZSBNWV9OQU1FIHh4eHh4eCAqLworICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOworICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOworICBsZl9wcmludGYgKGZpbGUsICIjdW5kZWYgTVlfTkFNRVxuIik7CisgIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiNkZWZpbmUgTVlfTkFNRSBcIiIpOworICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAorCQkgICAgICAgYmFzZW5hbWUsIGZvcm1hdF9uYW1lLCBOVUxMLAorCQkgICAgICAgZXhwYW5kZWRfYml0cywKKwkJICAgICAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X25vbmUpOworICBsZl9wcmludGYgKGZpbGUsICJcIlxuIik7Cit9CisKKworc3RhdGljIGludAorcHJpbnRfaXRyYWNlX3ByZWZpeCAobGYgKmZpbGUpCit7CisgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICJ0cmFjZV9wcmVmaXggKCI7CisgIGludCBpbmRlbnQgPSBzdHJsZW4gKHByZWZpeCk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzU0QsIENQVSwgY2lhLCBDSUEsIFRSQUNFX0xJTkVOVU1fUCAoQ1BVKSwgXFxcbiIsIHByZWZpeCk7CisgIGxmX2luZGVudCAoZmlsZSwgK2luZGVudCk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzaXRhYmxlW01ZX0lOREVYXS5maWxlLCBcXFxuIiwgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnByZWZpeC5sKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiJXNpdGFibGVbTVlfSU5ERVhdLmxpbmVfbnIsIFxcXG4iLCBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4LmwpOworICBsZl9wcmludGYgKGZpbGUsICJcIiIpOworICByZXR1cm4gaW5kZW50OworfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9pdHJhY2VfZm9ybWF0IChsZiAqZmlsZSwKKwkJICAgICBpbnNuX21uZW1vbmljX2VudHJ5ICphc3NlbWJsZXIpCit7CisgIC8qIHBhc3M9MSBpcyBmbXQgc3RyaW5nOyBwYXNzPTIgaXMgYXJndW1lbnRzICovCisgIGludCBwYXNzOworICAvKiBwcmludCB0aGUgZm9ybWF0IHN0cmluZyAqLworICBmb3IgKHBhc3MgPSAxOyBwYXNzIDw9IDI7IHBhc3MrKykKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpjaHAgPSBhc3NlbWJsZXItPmZvcm1hdDsKKyAgICAgIGNocCsrOyAvKiBza2lwIHRoZSBsZWFkaW5nIHF1b3RlICovCisgICAgICAvKiB3cml0ZSBvdXQgdGhlIGZvcm1hdC9hcmdzICovCisgICAgICB3aGlsZSAoKmNocCAhPSAnXDAnKQorCXsKKwkgIGlmIChjaHBbMF0gPT0gJ1xcJyAmJiAoY2hwWzFdID09ICc8JyB8fCBjaHBbMV0gPT0gJz4nKSkKKwkgICAgeworCSAgICAgIGlmIChwYXNzID09IDEpCisJCWxmX3B1dGNociAoZmlsZSwgY2hwWzFdKTsKKwkgICAgICBjaHAgKz0gMjsKKwkgICAgfQorCSAgZWxzZSBpZiAoY2hwWzBdID09ICc8JyB8fCBjaHBbMF0gPT0gJyUnKQorCSAgICB7CisJICAgICAgLyogcGFyc2UgWyAiJSIgLi4uIF0gIjwiIFsgZnVuYyAiIyIgXSBwYXJhbSAiPiIgKi8KKwkgICAgICBjb25zdCBjaGFyICpmbXQ7CisJICAgICAgY29uc3QgY2hhciAqZnVuYzsKKwkgICAgICBpbnQgc3RybGVuX2Z1bmM7CisJICAgICAgY29uc3QgY2hhciAqcGFyYW07CisJICAgICAgaW50IHN0cmxlbl9wYXJhbTsKKwkgICAgICAvKiB0aGUgIiUiIC4uLiAiPCIgZm9ybWF0ICovCisJICAgICAgZm10ID0gY2hwOworCSAgICAgIHdoaWxlIChjaHBbMF0gIT0gJzwnICYmIGNocFswXSAhPSAnXDAnKQorCQljaHArKzsKKwkgICAgICBpZiAoY2hwWzBdICE9ICc8JykKKwkJZXJyb3IgKGFzc2VtYmxlci0+bGluZSwgIk1pc3NpbmcgYDwnIGFmdGVyIGAlJSdcbiIpOworCSAgICAgIGNocCsrOworCSAgICAgIC8qIFsgImZ1bmMiICMgXSBPUiAicGFyYW0iICovCisJICAgICAgZnVuYyA9IGNocDsKKwkgICAgICBwYXJhbSA9IGNocDsKKwkgICAgICB3aGlsZSAoY2hwWzBdICE9ICc+JyAmJiBjaHBbMF0gIT0gJyMnICYmIGNocFswXSAhPSAnXDAnKQorCQljaHArKzsKKwkgICAgICBzdHJsZW5fZnVuYyA9IGNocCAtIGZ1bmM7CisJICAgICAgaWYgKGNocFswXSA9PSAnIycpCisJCXsKKwkJICBjaHArKzsKKwkJICBwYXJhbSA9IGNocDsKKwkJICB3aGlsZSAoY2hwWzBdICE9ICc+JyAmJiBjaHBbMF0gIT0gJ1wwJykKKwkJICAgIGNocCsrOworCQl9CisJICAgICAgc3RybGVuX3BhcmFtID0gY2hwIC0gcGFyYW07CisJICAgICAgaWYgKGNocFswXSAhPSAnPicpCisJCWVycm9yIChhc3NlbWJsZXItPmxpbmUsICJNaXNzaW5nIGNsb3NpbmcgYD4nIGluIGFzc2VtYmxlciBzdHJpbmdcbiIpOworCSAgICAgIGNocCsrOworCSAgICAgIC8qIG5vdyBwcm9jZXNzIGl0ICovCisJICAgICAgaWYgKHBhc3MgPT0gMikKKwkJbGZfcHJpbnRmIChmaWxlLCAiLCBcXFxuIik7CisJICAgICAgaWYgKHN0cm5jbXAgKGZtdCwgIjwiLCAxKSA9PSAwKQorCQkvKiBpbXBsaWNpdCBsb25nIGludCBmb3JtYXQgKi8KKwkJeworCQkgIGlmIChwYXNzID09IDEpCisJCSAgICBsZl9wcmludGYgKGZpbGUsICIlJWxkIik7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBsZl9wcmludGYgKGZpbGUsICIobG9uZykgIik7CisJCSAgICAgIGxmX3dyaXRlIChmaWxlLCBwYXJhbSwgc3RybGVuX3BhcmFtKTsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGZtdCwgIiU8IiwgMikgPT0gMCkKKwkJLyogZXhwbGljaXQgZm9ybWF0ICovCisJCXsKKwkJICBpZiAocGFzcyA9PSAxKQorCQkgICAgbGZfcHJpbnRmIChmaWxlLCAiJSUiKTsKKwkJICBlbHNlCisJCSAgICBsZl93cml0ZSAoZmlsZSwgcGFyYW0sIHN0cmxlbl9wYXJhbSk7CisJCX0KKwkgICAgICBlbHNlIGlmIChzdHJuY21wIChmbXQsICIlczwiLCAzKSA9PSAwKQorCQkvKiBzdHJpbmcgZm9ybWF0ICovCisJCXsKKwkJICBpZiAocGFzcyA9PSAxKQorCQkgICAgbGZfcHJpbnRmIChmaWxlLCAiJSVzIik7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBsZl9wcmludGYgKGZpbGUsICIlc3N0cl8iLCBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOworCQkgICAgICBsZl93cml0ZSAoZmlsZSwgZnVuYywgc3RybGVuX2Z1bmMpOworCQkgICAgICBsZl9wcmludGYgKGZpbGUsICIgKFNEXywgIik7CisJCSAgICAgIGxmX3dyaXRlIChmaWxlLCBwYXJhbSwgc3RybGVuX3BhcmFtKTsKKwkJICAgICAgbGZfcHJpbnRmIChmaWxlLCAiKSIpOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZSBpZiAoc3RybmNtcCAoZm10LCAiJWx4PCIsIDQpID09IDApCisJCS8qIHNpbXBsZSBoZXggKi8KKwkJeworCQkgIGlmIChwYXNzID09IDEpCisJCSAgICBsZl9wcmludGYgKGZpbGUsICIlJWx4Iik7CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBsZl9wcmludGYgKGZpbGUsICIodW5zaWduZWQgbG9uZykgIik7CisJCSAgICAgIGxmX3dyaXRlIChmaWxlLCBwYXJhbSwgc3RybGVuX3BhcmFtKTsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGZtdCwgIiUwOGx4PCIsIDYpID09IDApCisJCS8qIHNpbXBsZSBoZXggKi8KKwkJeworCQkgIGlmIChwYXNzID09IDEpCisJCSAgICBsZl9wcmludGYgKGZpbGUsICIlJTA4bHgiKTsKKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIih1bnNpZ25lZCBsb25nKSAiKTsKKwkJICAgICAgbGZfd3JpdGUgKGZpbGUsIHBhcmFtLCBzdHJsZW5fcGFyYW0pOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQllcnJvciAoYXNzZW1ibGVyLT5saW5lLCAiVW5rbm93biBhc3NlbWJsZXIgc3RyaW5nIGZvcm1hdFxuIik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChwYXNzID09IDEpCisJCWxmX3B1dGNociAoZmlsZSwgY2hwWzBdKTsKKwkgICAgICBjaHAgKz0gMTsKKwkgICAgfQorCX0KKyAgICB9CisgIGxmX3ByaW50ZiAoZmlsZSwgIik7XG4iKTsKK30KKworCit2b2lkCitwcmludF9pdHJhY2UgKGxmICpmaWxlLAorCSAgICAgIGluc25fZW50cnkgKmluc24sCisJICAgICAgaW50IGlkZWNvZGUpCit7CisgIC8qIE5COiBIZXJlIHdlIGVzY2FwZSBlYWNoIEVPTE4uIFRoaXMgaXMgc28gdGhhdCB0aGUgdGhlIGNvbXBpbGVyCisgICAgIHRyZWF0cyBhIHRyYWNlIGZ1bmN0aW9uIGNhbGwgYXMgYSBzaW5nbGUgbGluZS4gIENvbnNlcXVlbnRseSBhbnkKKyAgICAgZXJyb3JzIGluIHRoZSBsaW5lIGFyZSByZWZlcmVkIGJhY2sgdG8gdGhlIHNhbWUgaWdlbiBhc3NlbWJsZXIKKyAgICAgc291cmNlIGxpbmUgKi8KKyAgY29uc3QgY2hhciAqcGhhc2UgPSAoaWRlY29kZSkgPyAiREVDT0RFIiA6ICJJTlNOIjsKKyAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgbGZfaW5kZW50X3N1cHByZXNzIChmaWxlKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiI2lmIGRlZmluZWQgKFdJVEhfVFJBQ0UpXG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiLyogZ2VuZXJhdGUgYSB0cmFjZSBwcmVmaXggaWYgYW55IHRyYWNpbmcgZW5hYmxlZCAqL1xuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgImlmIChUUkFDRV9BTllfUCAoQ1BVKSlcbiIpOworICBsZl9wcmludGYgKGZpbGUsICIgIHtcbiIpOworICBsZl9pbmRlbnQgKGZpbGUsICs0KTsKKyAgeworICAgIGlmIChpbnNuLT5tbmVtb25pY3MgIT0gTlVMTCkKKyAgICAgIHsKKwlpbnNuX21uZW1vbmljX2VudHJ5ICphc3NlbWJsZXIgPSBpbnNuLT5tbmVtb25pY3M7CisJaW50IGlzX2ZpcnN0ID0gMTsKKwlkbworCSAgeworCSAgICBpZiAoYXNzZW1ibGVyLT5jb25kaXRpb24gIT0gTlVMTCkKKwkgICAgICB7CisJCWludCBpbmRlbnQ7CisJCWxmX3ByaW50ZiAoZmlsZSwgIiVzaWYgKCVzKVxuIiwKKwkJCSAgIGlzX2ZpcnN0ID8gIiIgOiAiZWxzZSAiLAorCQkJICAgYXNzZW1ibGVyLT5jb25kaXRpb24pOworCQlsZl9pbmRlbnQgKGZpbGUsICsyKTsKKwkJbGZfcHJpbnRfX2xpbmVfcmVmIChmaWxlLCBhc3NlbWJsZXItPmxpbmUpOworCQlpbmRlbnQgPSBwcmludF9pdHJhY2VfcHJlZml4IChmaWxlKTsKKwkJcHJpbnRfaXRyYWNlX2Zvcm1hdCAoZmlsZSwgYXNzZW1ibGVyKTsKKwkJbGZfcHJpbnRfX2ludGVybmFsX3JlZiAoZmlsZSk7CisJCWxmX2luZGVudCAoZmlsZSwgLWluZGVudCk7CisJCWxmX2luZGVudCAoZmlsZSwgLTIpOworCQlpZiAoYXNzZW1ibGVyLT5uZXh0ID09IE5VTEwpCisJCSAgZXJyb3IgKGFzc2VtYmxlci0+bGluZSwgIk1pc3NpbmcgZmluYWwgdW5jb25kaXRpb25hbCBhc3NlbWJsZXJcbiIpOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJaW50IGluZGVudDsKKwkJaWYgKCFpc19maXJzdCkKKwkJICB7CisJCSAgICBsZl9wcmludGYgKGZpbGUsICJlbHNlXG4iKTsKKwkJICAgIGxmX2luZGVudCAoZmlsZSwgKzIpOworCQkgIH0KKwkJbGZfcHJpbnRfX2xpbmVfcmVmIChmaWxlLCBhc3NlbWJsZXItPmxpbmUpOworCQlpbmRlbnQgPSBwcmludF9pdHJhY2VfcHJlZml4IChmaWxlKTsKKwkJcHJpbnRfaXRyYWNlX2Zvcm1hdCAoZmlsZSwgYXNzZW1ibGVyKTsKKwkJbGZfcHJpbnRfX2ludGVybmFsX3JlZiAoZmlsZSk7CisJCWxmX2luZGVudCAoZmlsZSwgLWluZGVudCk7CisJCWlmICghaXNfZmlyc3QpCisJCSAgbGZfaW5kZW50IChmaWxlLCAtMik7CisJCWlmIChhc3NlbWJsZXItPm5leHQgIT0gTlVMTCkKKwkJICBlcnJvciAoYXNzZW1ibGVyLT5saW5lLCAiVW5jb25kaXRpb25hbCBhc3NlbWJsZXIgaXMgbm90IGxhc3RcbiIpOworCSAgICAgIH0KKwkgICAgaXNfZmlyc3QgPSAwOworCSAgICBhc3NlbWJsZXIgPSBhc3NlbWJsZXItPm5leHQ7CisJICB9CisJd2hpbGUgKGFzc2VtYmxlciAhPSBOVUxMKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJaW50IGluZGVudDsKKwlsZl9pbmRlbnQgKGZpbGUsICsyKTsKKwlsZl9wcmludF9fbGluZV9yZWYgKGZpbGUsIGluc24tPmxpbmUpOworCWluZGVudCA9IHByaW50X2l0cmFjZV9wcmVmaXggKGZpbGUpOworCWxmX3ByaW50ZiAoZmlsZSwgIiUlc1wiLCBcXFxuIik7CisJbGZfcHJpbnRmIChmaWxlLCAiaXRhYmxlW01ZX0lOREVYXS5uYW1lKTtcbiIpOworCWxmX3ByaW50X19pbnRlcm5hbF9yZWYgKGZpbGUpOworCWxmX2luZGVudCAoZmlsZSwgLWluZGVudCk7CisJbGZfaW5kZW50IChmaWxlLCAtMik7CisgICAgICB9CisgICAgbGZfcHJpbnRmIChmaWxlLCAiLyogdHJhY2UgdGhlIGluc3RydWN0aW9uIGV4ZWN1dGlvbiBpZiBlbmFibGVkICovXG4iKTsKKyAgICBsZl9wcmludGYgKGZpbGUsICJpZiAoVFJBQ0VfJXNfUCAoQ1BVKSlcbiIsIHBoYXNlKTsKKyAgICBsZl9wcmludGYgKGZpbGUsICIgIHRyYWNlX2dlbmVyaWMgKFNELCBDUFUsIFRSQUNFXyVzX0lEWCwgXCIgJSVzXCIsIGl0YWJsZVtNWV9JTkRFWF0ubmFtZSk7XG4iLCBwaGFzZSk7CisgIH0KKyAgbGZfaW5kZW50IChmaWxlLCAtNCk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiAgfVxuIik7CisgIGxmX2luZGVudF9zdXBwcmVzcyAoZmlsZSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiNlbmRpZlxuIik7Cit9CisKKwordm9pZAorcHJpbnRfc2ltX2VuZ2luZV9hYm9ydCAobGYgKmZpbGUsCisJCQljb25zdCBjaGFyICptZXNzYWdlKQoreworICBsZl9wcmludGYgKGZpbGUsICJzaW1fZW5naW5lX2Fib3J0IChTRCwgQ1BVLCBjaWEsICIpOworICBsZl9wcmludGYgKGZpbGUsICJcIiVzXCIiLCBtZXNzYWdlKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiKTtcbiIpOworfQorCisKK3ZvaWQKK3ByaW50X2luY2x1ZGUgKGxmICpmaWxlLAorCSAgICAgICBpZ2VuX21vZHVsZSBtb2R1bGUpCit7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiNpbmNsdWRlIFwiJXMlcy5oXCJcbiIsIG1vZHVsZS5wcmVmaXgubCwgbW9kdWxlLnN1ZmZpeC5sKTsKK30KKwordm9pZAorcHJpbnRfaW5jbHVkZV9pbmxpbmUgKGxmICpmaWxlLAorCQkgICAgICBpZ2VuX21vZHVsZSBtb2R1bGUpCit7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiNpZiBDX1JFVkVBTFNfTU9EVUxFX1AgKCVzX0lOTElORSlcbiIsIG1vZHVsZS5zdWZmaXgudSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiNpbmNsdWRlIFwiJXMlcy5jXCJcbiIsIG1vZHVsZS5wcmVmaXgubCwgbW9kdWxlLnN1ZmZpeC5sKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiI2Vsc2VcbiIpOworICBwcmludF9pbmNsdWRlIChmaWxlLCBtb2R1bGUpOworICBsZl9wcmludGYgKGZpbGUsICIjZW5kaWZcbiIpOworICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworfQorCit2b2lkCitwcmludF9pbmNsdWRlcyAobGYgKmZpbGUpCit7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiNpbmNsdWRlIFwic2ltLWlubGluZS5jXCJcbiIpOworICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICBwcmludF9pbmNsdWRlX2lubGluZSAoZmlsZSwgb3B0aW9ucy5tb2R1bGUuaXRhYmxlKTsKKyAgcHJpbnRfaW5jbHVkZV9pbmxpbmUgKGZpbGUsIG9wdGlvbnMubW9kdWxlLmlkZWNvZGUpOworICBwcmludF9pbmNsdWRlX2lubGluZSAoZmlsZSwgb3B0aW9ucy5tb2R1bGUuc3VwcG9ydCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHZvaWQKK2dlbl9zZW1hbnRpY3NfaCAobGYgKmZpbGUsCisJCSBpbnNuX2xpc3QgKnNlbWFudGljcywKKwkJIGludCBtYXhfbnJfd29yZHMpCit7CisgIGludCB3b3JkX25yOworICBpbnNuX2xpc3QgKnNlbWFudGljOworICBmb3IgKHdvcmRfbnIgPSAtMTsgd29yZF9uciA8PSBtYXhfbnJfd29yZHM7IHdvcmRfbnIrKykKKyAgICB7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJ0eXBlZGVmICIpOworICAgICAgcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25fdHlwZSAoZmlsZSk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIgJXNpZGVjb2RlX3NlbWFudGljIiwKKwkJIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7CisgICAgICBpZiAod29yZF9uciA+PSAwKQorCWxmX3ByaW50ZiAoZmlsZSwgIl8lZCIsIHdvcmRfbnIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oIik7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgICAgIHByaW50X3NlbWFudGljX2Z1bmN0aW9uX2Zvcm1hbCAoZmlsZSwgd29yZF9ucik7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIik7XG4iKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgICAgfQorICBzd2l0Y2ggKG9wdGlvbnMuZ2VuLmNvZGUpCisgICAgeworICAgIGNhc2UgZ2VuZXJhdGVfY2FsbHM6CisgICAgICBmb3IgKHNlbWFudGljID0gc2VtYW50aWNzOyBzZW1hbnRpYyAhPSBOVUxMOyBzZW1hbnRpYyA9IHNlbWFudGljLT5uZXh0KQorCXsKKwkgIC8qIElnbm9yZSBhbnkgc3BlY2lhbC9pbnRlcm5hbCBpbnN0cnVjdGlvbnMgKi8KKwkgIGlmIChzZW1hbnRpYy0+aW5zbi0+bnJfd29yZHMgPT0gMCkKKwkgICAgY29udGludWU7CisJICBwcmludF9zZW1hbnRpY19kZWNsYXJhdGlvbiAoZmlsZSwKKwkJCQkgICAgICBzZW1hbnRpYy0+aW5zbiwKKwkJCQkgICAgICBzZW1hbnRpYy0+ZXhwYW5kZWRfYml0cywKKwkJCQkgICAgICBzZW1hbnRpYy0+b3Bjb2RlcywKKwkJCQkgICAgICBzZW1hbnRpYy0+bnJfcHJlZmV0Y2hlZF93b3Jkcyk7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBnZW5lcmF0ZV9qdW1wczoKKyAgICAgIGxmX3ByaW50X190aGlzX2ZpbGVfaXNfZW1wdHkgKGZpbGUsICJnZW5lcmF0aW5nIGp1bXBzIik7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2dlbl9zZW1hbnRpY3NfYyAobGYgKmZpbGUsCisJCSBpbnNuX2xpc3QgKnNlbWFudGljcywKKwkJIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcykKK3sKKyAgaWYgKG9wdGlvbnMuZ2VuLmNvZGUgPT0gZ2VuZXJhdGVfY2FsbHMpCisgICAgeworICAgICAgaW5zbl9saXN0ICpzZW1hbnRpYzsKKyAgICAgIHByaW50X2luY2x1ZGVzIChmaWxlKTsKKyAgICAgIHByaW50X2luY2x1ZGUgKGZpbGUsIG9wdGlvbnMubW9kdWxlLnNlbWFudGljcyk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworCisgICAgICBmb3IgKHNlbWFudGljID0gc2VtYW50aWNzOyBzZW1hbnRpYyAhPSBOVUxMOyBzZW1hbnRpYyA9IHNlbWFudGljLT5uZXh0KQorCXsKKwkgIC8qIElnbm9yZSBhbnkgc3BlY2lhbC9pbnRlcm5hbCBpbnN0cnVjdGlvbnMgKi8KKwkgIGlmIChzZW1hbnRpYy0+aW5zbi0+bnJfd29yZHMgPT0gMCkKKwkgICAgY29udGludWU7CisJICBwcmludF9zZW1hbnRpY19kZWZpbml0aW9uIChmaWxlLAorCQkJCSAgICAgc2VtYW50aWMtPmluc24sCisJCQkJICAgICBzZW1hbnRpYy0+ZXhwYW5kZWRfYml0cywKKwkJCQkgICAgIHNlbWFudGljLT5vcGNvZGVzLAorCQkJCSAgICAgY2FjaGVfcnVsZXMsCisJCQkJICAgICBzZW1hbnRpYy0+bnJfcHJlZmV0Y2hlZF93b3Jkcyk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGxmX3ByaW50X190aGlzX2ZpbGVfaXNfZW1wdHkgKGZpbGUsICJnZW5lcmF0aW5nIGp1bXAgZW5naW5lIik7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyB2b2lkCitnZW5faWNhY2hlX2ggKGxmICpmaWxlLAorCSAgICAgIGluc25fbGlzdCAqc2VtYW50aWMsCisJICAgICAgZnVuY3Rpb25fZW50cnkgKmZ1bmN0aW9ucywKKwkgICAgICBpbnQgbWF4X25yX3dvcmRzKQoreworICBpbnQgd29yZF9ucjsKKyAgZm9yICh3b3JkX25yID0gMDsgd29yZF9uciA8PSBtYXhfbnJfd29yZHM7IHdvcmRfbnIrKykKKyAgICB7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJ0eXBlZGVmICIpOworICAgICAgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uX3R5cGUoZmlsZSk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIgJXNpZGVjb2RlX2ljYWNoZV8lZFxuKCIsCisJCSBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwsCisJCSB3b3JkX25yKTsKKyAgICAgIHByaW50X2ljYWNoZV9mdW5jdGlvbl9mb3JtYWwoZmlsZSwgd29yZF9ucik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIpO1xuIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICAgIH0KKyAgaWYgKG9wdGlvbnMuZ2VuLmNvZGUgPT0gZ2VuZXJhdGVfY2FsbHMKKyAgICAgICYmIG9wdGlvbnMuZ2VuLmljYWNoZSkKKyAgICB7CisgICAgICBmdW5jdGlvbl9lbnRyeV90cmF2ZXJzZSAoZmlsZSwgZnVuY3Rpb25zLAorCQkJICAgICAgIHByaW50X2ljYWNoZV9pbnRlcm5hbF9mdW5jdGlvbl9kZWNsYXJhdGlvbiwKKwkJCSAgICAgICBOVUxMKTsKKyAgICAgIHdoaWxlIChzZW1hbnRpYyAhPSBOVUxMKQorCXsKKwkgIHByaW50X2ljYWNoZV9kZWNsYXJhdGlvbiAoZmlsZSwKKwkJCQkgICAgc2VtYW50aWMtPmluc24sCisJCQkJICAgIHNlbWFudGljLT5leHBhbmRlZF9iaXRzLAorCQkJCSAgICBzZW1hbnRpYy0+b3Bjb2RlcywKKwkJCQkgICAgc2VtYW50aWMtPm5yX3ByZWZldGNoZWRfd29yZHMpOworCSAgc2VtYW50aWMgPSBzZW1hbnRpYy0+bmV4dDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbGZfcHJpbnRfX3RoaXNfZmlsZV9pc19lbXB0eSAoZmlsZSwgImdlbmVyYXRpbmcganVtcCBlbmdpbmUiKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitnZW5faWNhY2hlX2MgKGxmICpmaWxlLAorCSAgICAgIGluc25fbGlzdCAqc2VtYW50aWMsCisJICAgICAgZnVuY3Rpb25fZW50cnkgKmZ1bmN0aW9ucywKKwkgICAgICBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZXMpCit7CisgIC8qIG91dHB1dCBgaW50ZXJuYWwnIGludmFsaWQvZmxvYXRpbmctcG9pbnQgdW5hdmFpbGFibGUgZnVuY3Rpb25zCisgICAgIHdoZXJlIG5lZWRlZCAqLworICBpZiAob3B0aW9ucy5nZW4uY29kZSA9PSBnZW5lcmF0ZV9jYWxscworICAgICAgJiYgb3B0aW9ucy5nZW4uaWNhY2hlKQorICAgIHsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIjaW5jbHVkZSBcImNwdS5oXCJcbiIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiI2luY2x1ZGUgXCJpZGVjb2RlLmhcIlxuIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIjaW5jbHVkZSBcInNlbWFudGljcy5oXCJcbiIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiI2luY2x1ZGUgXCJpY2FjaGUuaFwiXG4iKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiNpbmNsdWRlIFwic3VwcG9ydC5oXCJcbiIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgICAgIGZ1bmN0aW9uX2VudHJ5X3RyYXZlcnNlIChmaWxlLCBmdW5jdGlvbnMsCisJCQkgICAgICAgcHJpbnRfaWNhY2hlX2ludGVybmFsX2Z1bmN0aW9uX2RlZmluaXRpb24sCisJCQkgICAgICAgTlVMTCk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICAgICAgd2hpbGUgKHNlbWFudGljICE9IE5VTEwpCisJeworCSAgcHJpbnRfaWNhY2hlX2RlZmluaXRpb24gKGZpbGUsCisJCQkJICAgc2VtYW50aWMtPmluc24sCisJCQkJICAgc2VtYW50aWMtPmV4cGFuZGVkX2JpdHMsCisJCQkJICAgc2VtYW50aWMtPm9wY29kZXMsCisJCQkJICAgY2FjaGVfcnVsZXMsCisJCQkJICAgc2VtYW50aWMtPm5yX3ByZWZldGNoZWRfd29yZHMpOworCSAgc2VtYW50aWMgPSBzZW1hbnRpYy0+bmV4dDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbGZfcHJpbnRfX3RoaXNfZmlsZV9pc19lbXB0eSAoZmlsZSwgImdlbmVyYXRpbmcganVtcCBlbmdpbmUiKTsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHZvaWQKK2dlbl9pZGVjb2RlX2ggKGxmICpmaWxlLAorCSAgICAgICBnZW5fdGFibGUgKmdlbiwKKwkgICAgICAgaW5zbl90YWJsZSAqaW5zbnMsCisJICAgICAgIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcykKK3sKKyAgbGZfcHJpbnRmIChmaWxlLCAidHlwZWRlZiB1bnNpZ25lZCVkICVzaW5zdHJ1Y3Rpb25fd29yZDtcbiIsCisJICAgICBvcHRpb25zLmluc25fYml0X3NpemUsIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7CisgIGlmIChvcHRpb25zLmdlbi5kZWxheWVkX2JyYW5jaCkKKyAgICB7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJ0eXBlZGVmIHN0cnVjdCBfJXNpbnN0cnVjdGlvbl9hZGRyZXNzIHtcbiIsCisJCSBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LmwpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiICBhZGRyZXNzX3dvcmQgaXA7IC8qIGluc3RydWN0aW9uIHBvaW50ZXIgKi9cbiIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiICBhZGRyZXNzX3dvcmQgZHA7IC8qIGRlbGF5ZWQtc2xvdCBwb2ludGVyICovXG4iKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIn0gJXNpbnN0cnVjdGlvbl9hZGRyZXNzO1xuIiwgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJ0eXBlZGVmIGFkZHJlc3Nfd29yZCAlc2luc3RydWN0aW9uX2FkZHJlc3M7XG4iLAorCQkgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sKTsKKyAgICAgIAorICAgIH0KKyAgaWYgKG9wdGlvbnMuZ2VuLm5pYSA9PSBuaWFfaXNfaW52YWxpZAorICAgICAgJiYgc3RybGVuIChvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4LnUpID4gMCkKKyAgICB7CisgICAgICBsZl9pbmRlbnRfc3VwcHJlc3MgKGZpbGUpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiI2RlZmluZSAlc0lOVkFMSURfSU5TVFJVQ1RJT05fQUREUkVTUyAiLAorCQkgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC51KTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIklOVkFMSURfSU5TVFJVQ1RJT05fQUREUkVTU1xuIik7CisgICAgfQorICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICBwcmludF9pY2FjaGVfc3RydWN0IChmaWxlLCBpbnNucywgY2FjaGVfcnVsZXMpOworICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICBpZiAob3B0aW9ucy5nZW4uaWNhY2hlKQorICAgIHsKKyAgICAgIEVSUk9SICgiRklYTUUgLSBpZGVjb2RlIHdpdGggaWNhY2hlIHN1ZmZlcmluZyBmcm9tIGJpdC1yb3QiKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBnZW5fbGlzdCAqZW50cnk7CisgICAgICBmb3IgKGVudHJ5ID0gZ2VuLT50YWJsZXM7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpCisJeworCSAgcHJpbnRfaWRlY29kZV9pc3N1ZV9mdW5jdGlvbl9oZWFkZXIgKGZpbGUsCisJCQkJCSAgICAgICAob3B0aW9ucy5nZW4ubXVsdGlfc2ltCisJCQkJCQk/IGVudHJ5LT5tb2RlbC0+bmFtZQorCQkJCQkJOiBOVUxMKSwKKwkJCQkJICAgICAgIGlzX2Z1bmN0aW9uX2RlY2xhcmF0aW9uLAorCQkJCQkgICAgICAgMS8qQUxXQVlTIE9ORSBXT1JEKi8pOworCX0KKyAgICAgIGlmIChvcHRpb25zLmdlbi5tdWx0aV9zaW0pCisJeworCSAgcHJpbnRfaWRlY29kZV9pc3N1ZV9mdW5jdGlvbl9oZWFkZXIgKGZpbGUsCisJCQkJCSAgICAgICBOVUxMLAorCQkJCQkgICAgICAgaXNfZnVuY3Rpb25fdmFyaWFibGUsCisJCQkJCSAgICAgICAxLypBTFdBWVMgT05FIFdPUkQqLyk7CisJfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorZ2VuX2lkZWNvZGVfYyAobGYgKmZpbGUsCisJICAgICAgIGdlbl90YWJsZSAqZ2VuLAorCSAgICAgICBpbnNuX3RhYmxlICppc2EsCisJICAgICAgIGNhY2hlX2VudHJ5ICpjYWNoZV9ydWxlcykKK3sKKyAgLyogdGhlIGludHJvICovCisgIHByaW50X2luY2x1ZGVzIChmaWxlKTsKKyAgcHJpbnRfaW5jbHVkZV9pbmxpbmUgKGZpbGUsIG9wdGlvbnMubW9kdWxlLnNlbWFudGljcyk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisKKyAgcHJpbnRfaWRlY29kZV9nbG9iYWxzIChmaWxlKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKyAgCisgIHN3aXRjaCAob3B0aW9ucy5nZW4uY29kZSkKKyAgICB7CisgICAgY2FzZSBnZW5lcmF0ZV9jYWxsczoKKyAgICAgIHsKKwlnZW5fbGlzdCAqZW50cnk7CisJZm9yIChlbnRyeSA9IGdlbi0+dGFibGVzOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQorCSAgeworCSAgICBwcmludF9pZGVjb2RlX2xvb2t1cHMgKGZpbGUsIGVudHJ5LT50YWJsZSwgY2FjaGVfcnVsZXMpOworCQorCSAgICAvKiBvdXRwdXQgdGhlIG1haW4gaWRlY29kZSByb3V0aW5lICovCisJICAgIGlmICghb3B0aW9ucy5nZW4uaWNhY2hlKQorCSAgICAgIHsKKwkJcHJpbnRfaWRlY29kZV9pc3N1ZV9mdW5jdGlvbl9oZWFkZXIgKGZpbGUsCisJCQkJCQkgICAgIChvcHRpb25zLmdlbi5tdWx0aV9zaW0KKwkJCQkJCSAgICAgID8gZW50cnktPm1vZGVsLT5uYW1lCisJCQkJCQkgICAgICA6IE5VTEwpLAorCQkJCQkJICAgICAxLyppcyBkZWZpbml0aW9uKi8sCisJCQkJCQkgICAgIDEvKkFMV0FZUyBPTkUgV09SRCovKTsKKwkJbGZfcHJpbnRmIChmaWxlLCAie1xuIik7CisJCWxmX2luZGVudCAoZmlsZSwgKzIpOworCQlsZl9wcmludGYgKGZpbGUsICIlc2luc3RydWN0aW9uX2FkZHJlc3MgbmlhO1xuIiwKKwkJCSAgIG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXgubCk7CisJCXByaW50X2lkZWNvZGVfYm9keSAoZmlsZSwgZW50cnktPnRhYmxlLCAibmlhID0iKTsKKwkJbGZfcHJpbnRmIChmaWxlLCAicmV0dXJuIG5pYTsiKTsKKwkJbGZfaW5kZW50IChmaWxlLCAtMik7CisJCWxmX3ByaW50ZiAoZmlsZSwgIn1cbiIpOworCSAgICAgIH0KKwkgIH0KKwlicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIGdlbmVyYXRlX2p1bXBzOgorICAgICAgeworCWxmX3ByaW50X190aGlzX2ZpbGVfaXNfZW1wdHkgKGZpbGUsICJnZW5lcmF0aW5nIGEganVtcCBlbmdpbmUiKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHZvaWQKK2dlbl9ydW5fYyAobGYgKmZpbGUsCisJICAgZ2VuX3RhYmxlICpnZW4pCit7CisgIGdlbl9saXN0ICplbnRyeTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiI2luY2x1ZGUgXCJzaW0tbWFpbi5oXCJcbiIpOworICBsZl9wcmludGYgKGZpbGUsICIjaW5jbHVkZSBcImVuZ2luZS5oXCJcbiIpOworICBsZl9wcmludGYgKGZpbGUsICIjaW5jbHVkZSBcImlkZWNvZGUuaFwiXG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiI2luY2x1ZGUgXCJiZmQuaFwiXG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiXG4iKTsKKworICBpZiAob3B0aW9ucy5nZW4ubXVsdGlfc2ltKQorICAgIHsKKyAgICAgIHByaW50X2lkZWNvZGVfaXNzdWVfZnVuY3Rpb25faGVhZGVyIChmaWxlLCBOVUxMLCBpc19mdW5jdGlvbl92YXJpYWJsZSwgMSk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbiIpOworICAgICAgcHJpbnRfZW5naW5lX3J1bl9mdW5jdGlvbl9oZWFkZXIgKGZpbGUsIE5VTEwsIGlzX2Z1bmN0aW9uX3ZhcmlhYmxlKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuIik7CisgICAgfQorICAKKyAgbGZfcHJpbnRmIChmaWxlLCAidm9pZFxuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgInNpbV9lbmdpbmVfcnVuIChTSU1fREVTQyBzZCxcbiIpOworICBsZl9wcmludGYgKGZpbGUsICIgICAgICAgICAgICAgICAgaW50IG5leHRfY3B1X25yLFxuIik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiAgICAgICAgICAgICAgICBpbnQgbnJfY3B1cyxcbiIpOworICBsZl9wcmludGYgKGZpbGUsICIgICAgICAgICAgICAgICAgaW50IHNpZ2duYWwpXG4iKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAie1xuIik7CisgIGxmX2luZGVudCAoZmlsZSwgKzIpOworICBpZiAob3B0aW9ucy5nZW4ubXVsdGlfc2ltKQorICAgIHsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgImludCBtYWNoO1xuIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJpZiAoU1RBVEVfQVJDSElURUNUVVJFIChzZCkgPT0gTlVMTClcbiIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiICBtYWNoID0gMDtcbiIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiZWxzZVxuIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIgIG1hY2ggPSBTVEFURV9BUkNISVRFQ1RVUkUgKHNkKS0+bWFjaDtcbiIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAic3dpdGNoIChtYWNoKVxuIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIgIHtcbiIpOworICAgICAgbGZfaW5kZW50IChmaWxlLCArMik7CisgICAgICBmb3IgKGVudHJ5ID0gZ2VuLT50YWJsZXM7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpCisJeworCSAgaWYgKG9wdGlvbnMuZ2VuLmRlZmF1bHRfbW9kZWwgIT0gTlVMTAorCSAgICAgICYmIChzdHJjbXAgKGVudHJ5LT5tb2RlbC0+bmFtZSwgb3B0aW9ucy5nZW4uZGVmYXVsdF9tb2RlbCkgPT0gMAorCQkgIHx8IHN0cmNtcCAoZW50cnktPm1vZGVsLT5mdWxsX25hbWUsIG9wdGlvbnMuZ2VuLmRlZmF1bHRfbW9kZWwpID09IDApKQorCSAgICBsZl9wcmludGYgKGZpbGUsICJkZWZhdWx0OlxuIik7CisJICBsZl9wcmludGYgKGZpbGUsICJjYXNlIGJmZF9tYWNoXyVzOlxuIiwgZW50cnktPm1vZGVsLT5mdWxsX25hbWUpOworCSAgbGZfaW5kZW50IChmaWxlLCArMik7CisJICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAorCQkJICAgICAgICJpc3N1ZSIsCisJCQkgICAgICAgTlVMTCwgLyogZm9ybWF0IG5hbWUgKi8KKwkJCSAgICAgICBOVUxMLCAvKiBOTyBwcm9jZXNzb3IgKi8KKwkJCSAgICAgICBOVUxMLCAvKiBleHBhbmRlZCBiaXRzICovCisJCQkgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWRlY29kZSk7CisJICBsZl9wcmludGYgKGZpbGUsICIgPSAiKTsKKwkgIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCisJCQkgICAgICAgImlzc3VlIiwKKwkJCSAgICAgICBOVUxMLCAvKiBmb3JtYXQgbmFtZSAqLworCQkJICAgICAgIGVudHJ5LT5tb2RlbC0+bmFtZSwKKwkJCSAgICAgICBOVUxMLCAvKiBleHBhbmRlZCBiaXRzICovCisJCQkgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWRlY29kZSk7CisJICBsZl9wcmludGYgKGZpbGUsICI7XG4iKTsKKwkgIHByaW50X2Z1bmN0aW9uX25hbWUgKGZpbGUsCisJCQkgICAgICAgInJ1biIsCisJCQkgICAgICAgTlVMTCwgLyogZm9ybWF0IG5hbWUgKi8KKwkJCSAgICAgICBOVUxMLCAvKiBOTyBwcm9jZXNzb3IgKi8KKwkJCSAgICAgICBOVUxMLCAvKiBleHBhbmRlZCBiaXRzICovCisJCQkgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfZW5naW5lKTsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgIiA9ICIpOworCSAgcHJpbnRfZnVuY3Rpb25fbmFtZSAoZmlsZSwKKwkJCSAgICAgICAicnVuIiwKKwkJCSAgICAgICBOVUxMLCAvKiBmb3JtYXQgbmFtZSAqLworCQkJICAgICAgIGVudHJ5LT5tb2RlbC0+bmFtZSwKKwkJCSAgICAgICBOVUxMLCAvKiBleHBhbmRlZCBiaXRzICovCisJCQkgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfZW5naW5lKTsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgIjtcbiIpOworCSAgbGZfcHJpbnRmIChmaWxlLCAiYnJlYWs7XG4iKTsKKwkgIGxmX2luZGVudCAoZmlsZSwgLTIpOworCX0KKyAgICAgIGlmIChvcHRpb25zLmdlbi5kZWZhdWx0X21vZGVsID09IE5VTEwpCisJeworCSAgbGZfcHJpbnRmIChmaWxlLCAiZGVmYXVsdDpcbiIpOworCSAgbGZfaW5kZW50IChmaWxlLCArMik7CisJICBsZl9wcmludGYgKGZpbGUsICJzaW1fZW5naW5lX2Fib3J0IChzZCwgTlVMTCwgTlVMTF9DSUEsXG4iKTsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgIiAgICAgICAgICAgICAgICAgIFwic2ltX2VuZ2luZV9ydW4gLSB1bmtub3duIG1hY2hpbmVcIik7XG4iKTsKKwkgIGxmX3ByaW50ZiAoZmlsZSwgImJyZWFrO1xuIik7CisJICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKKwl9CisgICAgICBsZl9pbmRlbnQgKGZpbGUsIC0yKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiAgfVxuIik7CisgICAgfQorICBwcmludF9mdW5jdGlvbl9uYW1lIChmaWxlLAorCQkgICAgICAgInJ1biIsCisJCSAgICAgICBOVUxMLCAvKiBmb3JtYXQgbmFtZSAqLworCQkgICAgICAgTlVMTCwgLyogTk8gcHJvY2Vzc29yICovCisJCSAgICAgICBOVUxMLCAvKiBleHBhbmRlZCBiaXRzICovCisJCSAgICAgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9lbmdpbmUpOworICBsZl9wcmludGYgKGZpbGUsICIgKHNkLCBuZXh0X2NwdV9uciwgbnJfY3B1cywgc2lnZ25hbCk7XG4iKTsKKyAgbGZfaW5kZW50IChmaWxlLCAtMik7CisgIGxmX3ByaW50ZiAoZmlsZSwgIn1cbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGdlbl90YWJsZSAqCitkb19nZW4gKGluc25fdGFibGUgKmlzYSwKKwlkZWNvZGVfdGFibGUgKmRlY29kZV9ydWxlcykKK3sKKyAgZ2VuX3RhYmxlICpnZW47CisgIGlmIChkZWNvZGVfcnVsZXMgPT0gTlVMTCkKKyAgICBlcnJvciAoTlVMTCwgIk11c3Qgc3BlY2lmeSBhIGRlY29kZSB0YWJsZVxuIik7CisgIGlmIChpc2EgPT0gTlVMTCkKKyAgICBlcnJvciAoTlVMTCwgIk11c3Qgc3BlY2lmeSBhbiBpbnN0cnVjdGlvbiB0YWJsZVxuIik7CisgIGlmIChkZWNvZGVfdGFibGVfbWF4X3dvcmRfbnIgKGRlY29kZV9ydWxlcykgPiAwKQorICAgIG9wdGlvbnMuZ2VuLm11bHRpX3dvcmQgPSBkZWNvZGVfdGFibGVfbWF4X3dvcmRfbnIgKGRlY29kZV9ydWxlcyk7CisgIGdlbiA9IG1ha2VfZ2VuX3RhYmxlcyAoaXNhLCBkZWNvZGVfcnVsZXMpOworICBnZW5fdGFibGVzX2V4cGFuZF9pbnNucyAoZ2VuKTsKKyAgZ2VuX3RhYmxlc19leHBhbmRfc2VtYW50aWNzIChnZW4pOworICByZXR1cm4gZ2VuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaWdlbl9vcHRpb25zIG9wdGlvbnM7CisKK2ludAorbWFpbiAoaW50IGFyZ2MsCisgICAgICBjaGFyICoqYXJndiwKKyAgICAgIGNoYXIgKiplbnZwKQoreworICBjYWNoZV9lbnRyeSAqY2FjaGVfcnVsZXMgPSBOVUxMOworICBsZl9maWxlX3JlZmVyZW5jZXMgZmlsZV9yZWZlcmVuY2VzID0gbGZfaW5jbHVkZV9yZWZlcmVuY2VzOworICBkZWNvZGVfdGFibGUgKmRlY29kZV9ydWxlcyA9IE5VTEw7CisgIGluc25fdGFibGUgKmlzYSA9IE5VTEw7CisgIGdlbl90YWJsZSAqZ2VuID0gTlVMTDsKKyAgY2hhciAqcmVhbF9maWxlX25hbWUgPSBOVUxMOworICBpbnQgaXNfaGVhZGVyID0gMDsKKyAgaW50IGNoOworICBsZiAqc3RhbmRhcmRfb3V0ID0gbGZfb3BlbiAoIi0iLCAic3Rkb3V0IiwgbGZfb21pdF9yZWZlcmVuY2VzLCBsZl9pc190ZXh0LCAiaWdlbiIpOworCisgIElOSVRfT1BUSU9OUyAoKTsKKworICBpZiAoYXJnYyA9PSAxKQorICAgIHsKKyAgICAgIHByaW50ZiAoIlVzYWdlOlxuIik7CisgICAgICBwcmludGYgKCJcbiIpOworICAgICAgcHJpbnRmICgiICBpZ2VuIDxjb25maWctb3B0cz4gLi4uIDxpbnB1dC1vcHRzPi4uLiA8b3V0cHV0LW9wdHM+Li4uXG4iKTsKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICBwcmludGYgKCJDb25maWcgb3B0aW9uczpcbiIpOworICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgLUIgPGJpdC1zaXplPlxuIik7CisgICAgICBwcmludGYgKCJcdCBTZXQgdGhlIG51bWJlciBvZiBiaXRzIGluIGFuIGluc3RydWN0aW9uIChkZXByZWNpYXRlZCkuXG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IFRoaXMgb3B0aW9uIGNhbiBub3cgYmUgc2V0IGRpcmVjdGx5IGluIHRoZSBpbnN0cnVjdGlvbiB0YWJsZS5cbiIpOworICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgLUQgPGRhdGEtc3RydWN0dXJlPlxuIik7CisgICAgICBwcmludGYgKCJcdCBEdW1wIHRoZSBzcGVjaWZpZWQgZGF0YSBzdHJ1Y3R1cmUgdG8gc3Rkb3V0LiBWYWxpZCBzdHJ1Y3R1cmVzIGluY2x1ZGU6XG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IHByb2Nlc3Nvci1uYW1lcyAtIGxpc3QgdGhlIG5hbWVzIG9mIGFsbCB0aGUgcHJvY2Vzc29ycyAobW9kZWxzKVxuIik7CisgICAgICBwcmludGYgKCJcbiIpOworICAgICAgcHJpbnRmICgiICAtRiA8ZmlsdGVyLWxpc3Q+XG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IEZpbHRlciBvdXQgYW55IGluc3RydWN0aW9ucyB3aXRoIGEgbm9uLWVtcHR5IGZsYWdzIGZpZWxkIHRoYXQgY29udGFpbnNcbiIpOworICAgICAgcHJpbnRmICgiXHQgYSBmbGFnIG5vdCBsaXN0ZWQgaW4gdGhlIDxmaWx0ZXItbGlzdD4uXG4iKTsKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICBwcmludGYgKCIgIC1IIDxoaWdoLWJpdD5cbiIpOworICAgICAgcHJpbnRmICgiXHQgU2V0IHRoZSBudW1iZXIgb2YgdGhlIGhpZ2ggKG1vc3Qgc2lnbmlmaWNhbnQpIGluc3RydWN0aW9uIGJpdCAoZGVwcmVjaWF0ZWQpLlxuIik7CisgICAgICBwcmludGYgKCJcdCBUaGlzIG9wdGlvbiBjYW4gbm93IGJlIHNldCBkaXJlY3RseSBpbiB0aGUgaW5zdHJ1Y3Rpb24gdGFibGUuXG4iKTsKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICBwcmludGYgKCIgIC1JIDxkaXJlY3Rvcnk+XG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IEFkZCA8ZGlyZWN0b3J5PiB0byB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBzZWFyY2hlZCB3aGVuIG9wZW5pbmcgYSBmaWxlXG4iKTsKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICBwcmludGYgKCIgIC1NIDxtb2RlbC1saXN0PlxuIik7CisgICAgICBwcmludGYgKCJcdCBGaWx0ZXIgb3V0IGFueSBpbnN0cnVjdGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBhdCBsZWFzdCBvbmUgb2YgdGhlIGxpc3RlZFxuIik7CisgICAgICBwcmludGYgKCJcdCBtb2RlbHMgKEFuIGluc3RydWN0aW9ucyB3aXRoIG5vIG1vZGVsIGluZm9ybWF0aW9uIGlzIGNvbnNpZGVyZWQgdG8gc3VwcG9ydFxuIik7CisgICAgICBwcmludGYgKCJcdCBhbGwgbW9kZWxzLikuXG4iKTsKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICBwcmludGYgKCIgIC1OIDxuci1jcHVzPlxuIik7CisgICAgICBwcmludGYgKCJcdCBHZW5lcmF0ZSBhIHNpbXVsYXRvciBzdXBwb3J0aW5nIDxuci1jcHVzPlxuIik7CisgICAgICBwcmludGYgKCJcdCBTcGVjaWZ5IGAtTiAwJyB0byBkaXNhYmxlIGdlbmVyYXRpb24gb2YgdGhlIFNNUC4gU3BlY2lmeWluZyBgLU4gMScgd2lsbFxuIik7CisgICAgICBwcmludGYgKCJcdCBzdGlsbCBnZW5lcmF0ZSBhbiBTTVAgZW5hYmxlZCBzaW11bGF0b3IgYnV0IHdpbGwgb25seSBzdXBwb3J0IG9uZSBDUFUuXG4iKTsKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICBwcmludGYgKCIgIC1UIDxtZWNoYW5pc20+XG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IE92ZXJyaWRlIHRoZSBkZWNvZGUgbWVjaGFuaXNtIHNwZWNpZmllZCBieSB0aGUgZGVjb2RlIHJ1bGVzXG4iKTsKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICBwcmludGYgKCIgIC1QIDxwcmVmaXg+XG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IFByZXBlbmQgZ2xvYmFsIG5hbWVzIChleGNlcHQgaXRhYmxlKSB3aXRoIHRoZSBzdHJpbmcgPHByZWZpeD4uXG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IFNwZWNpZnkgLVAgPG1vZHVsZT49PHByZWZpeD4gdG8gc2V0IGEgc3BlY2lmaWMgPG1vZHVsZT4ncyBwcmVmaXguXG4iKTsKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICBwcmludGYgKCIgIC1TIDxzdWZmaXg+XG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IFJlcGxhY2UgYSBnbG9iYWwgbmFtZSAoc3VmZml4KSAoZXhjZXB0IGl0YWJsZSkgd2l0aCB0aGUgc3RyaW5nIDxzdWZmaXg+LlxuIik7CisgICAgICBwcmludGYgKCJcdCBTcGVjaWZ5IC1TIDxtb2R1bGU+PTxzdWZmaXg+IHRvIGNoYW5nZSBhIHNwZWNpZmljIDxtb2R1bGU+J3MgbmFtZSAoc3VmZml4KS5cbiIpOworICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgLVdlcnJvclxuIik7CisgICAgICBwcmludGYgKCJcdCBNYWtlIHdhcm5pbmdzIGVycm9yc1xuIik7CisgICAgICBwcmludGYgKCIgIC1Xbm9kaXNjYXJkXG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IFN1cHByZXNzIHdhcm5pbmdzIGFib3V0IGRpc2NhcmRlZCBmdW5jdGlvbnMgYW5kIGluc3RydWN0aW9uc1xuIik7CisgICAgICBwcmludGYgKCIgIC1Xbm93aWR0aFxuIik7CisgICAgICBwcmludGYgKCJcdCBTdXBwcmVzcyB3YXJuaW5ncyBhYm91dCBpbnN0cnVjdGlvbnMgd2l0aCBpbnZhbGlkIHdpZHRoc1xuIik7CisgICAgICBwcmludGYgKCIgIC1Xbm91bmltcGxlbWVudGVkXG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IFN1cHByZXNzIHdhcm5pbmdzIGFib3V0IHVuaW1wbGVtZW50ZWQgaW5zdHJ1Y3Rpb25zXG4iKTsKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICBwcmludGYgKCIgIC1HIFshXTxnZW4tb3B0aW9uPlxuIik7CisgICAgICBwcmludGYgKCJcdCBBbnkgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuIik7CisgICAgICBwcmludGYgKCJcbiIpOworICAgICAgcHJpbnRmICgiXHQgZGVjb2RlLWR1cGxpY2F0ZSAgICAgICAtIE92ZXJyaWRlIHRoZSBkZWNvZGUgcnVsZXMsIGZvcmNpbmcgdGhlIGR1cGxpY2F0aW9uIG9mXG4iKTsKKyAgICAgIHByaW50ZiAoIlx0ICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1hbnRpYyBmdW5jdGlvbnNcbiIpOworICAgICAgcHJpbnRmICgiXHQgZGVjb2RlLWNvbWJpbmUgICAgICAgICAtIENvbWJpbmUgYW55IGR1cGxpY2F0ZWQgZW50cmllcyB3aXRoaW4gYSB0YWJsZVxuIik7CisgICAgICBwcmludGYgKCJcdCBkZWNvZGUtemVyby1yZXNlcnZlZCAgIC0gT3ZlcnJpZGUgdGhlIGRlY29kZSBydWxlcywgZm9yY2luZyByZXNlcnZlZCBiaXRzIHRvIGJlXG4iKTsKKyAgICAgIHByaW50ZiAoIlx0ICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVhdGVkIGFzIHplcm8uXG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IGRlY29kZS1zd2l0Y2gtaXMtZ290byAgLSBPdmVyZmlkZSB0aGUgcGFkZGVkLXN3aXRjaCBjb2RlIHR5cGUgYXMgYSBnb3RvLXN3aXRjaFxuIik7CisgICAgICBwcmludGYgKCJcbiIpOworICAgICAgcHJpbnRmICgiXHQgZ2VuLWNvbmRpdGlvbmFsLWlzc3VlICAtIGNvbmRpdGlvbmFsbHkgaXNzdWUgZWFjaCBpbnN0cnVjdGlvblxuIik7CisgICAgICBwcmludGYgKCJcdCBnZW4tZGVsYXllZC1icmFuY2ggICAgIC0gbmVlZCBib3RoIGNpYSBhbmQgbmlhIHBhc3NlZCBhcm91bmRcbiIpOworICAgICAgcHJpbnRmICgiXHQgZ2VuLWRpcmVjdC1hY2Nlc3MgICAgICAtIHVzZSAjZGVmaW5lcyB0byBkaXJlY3RseSBhY2Nlc3MgdmFsdWVzXG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IGdlbi16ZXJvLXI8Tj4gICAgICAgICAgLSBhcmNoIGFzc3VtZXMgR1BSKDxOPikgPT0gMCwga2VlcCBpdCB0aGF0IHdheVxuIik7CisgICAgICBwcmludGYgKCJcdCBnZW4taWNhY2hlWz08Tj4gICAgICAgIC0gZ2VuZXJhdGUgYW4gaW5zdHJ1Y3Rpb24gY3JhY2tpbmcgY2FjaGUgb2Ygc2l6ZSA8Tj5cbiIpOworICAgICAgcHJpbnRmICgiXHQgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgc2l6ZSBpcyAlZFxuIiwgb3B0aW9ucy5nZW4uaWNhY2hlX3NpemUpOworICAgICAgcHJpbnRmICgiXHQgZ2VuLWluc24taW4taWNhY2hlICAgICAtIHNhdmUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gd2hlbiBjcmFja2luZ1xuIik7CisgICAgICBwcmludGYgKCJcdCBnZW4tbXVsdGktc2ltWz1NT0RFTF0gIC0gZ2VuZXJhdGUgbXVsdGlwbGUgc2ltdWxhdG9ycyAtIG9uZSBwZXIgbW9kZWxcbiIpOworICAgICAgcHJpbnRmICgiXHQgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNwZWNpZmllZCBNT0RFTCBpcyBtYWRlIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZS5cbiIpOworICAgICAgcHJpbnRmICgiXHQgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIGEgc2luZ2xlIHNpbXVsYXRvciB0aGF0IHdpbGxcbiIpOworICAgICAgcHJpbnRmICgiXHQgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUgYW55IGluc3RydWN0aW9uIGlzIGdlbmVyYXRlZFxuIik7CisgICAgICBwcmludGYgKCJcdCBnZW4tbXVsdGktd29yZCAgICAgICAgIC0gZ2VuZXJhdGUgY29kZSBhbGxvd2luZyBmb3IgbXVsdGktd29yZCBpbnNuc1xuIik7CisgICAgICBwcmludGYgKCJcdCBnZW4tc2VtYW50aWMtaWNhY2hlICAgIC0gaW5jbHVkZSBzZW1hbnRpYyBjb2RlIGluIGNyYWNraW5nIGZ1bmN0aW9uc1xuIik7CisgICAgICBwcmludGYgKCJcdCBnZW4tc2xvdC12ZXJpZmljYXRpb24gIC0gcGVyZm9ybSBzbG90IHZlcmlmaWNhdGlvbiBhcyBwYXJ0IG9mIGRlY29kZVxuIik7CisgICAgICBwcmludGYgKCJcdCBnZW4tbmlhLWludmFsaWQgICAgICAgIC0gTklBIGRlZmF1bHRzIHRvIG5pYV9pbnZhbGlkXG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IGdlbi1uaWEtdm9pZCAgICAgICAgICAgLSBkbyBub3QgY29tcHV0ZS9yZXR1cm4gTklBXG4iKTsKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICBwcmludGYgKCJcdCB0cmFjZS1jb21iaW5lICAgICAgICAgIC0gcmVwb3J0IGNvbWJpbmVkIGVudHJpZXMgYSBydWxlIGFwcGxpY2F0aW9uXG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IHRyYWNlLWVudHJpZXMgICAgICAgICAgLSByZXBvcnQgZW50cmllcyBhZnRlciBhIHJ1bGVzIGFwcGxpY2F0aW9uXG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IHRyYWNlLXJ1bGUtcmVqZWN0aW9uICAgLSByZXBvcnQgZWFjaCBydWxlIGFzIHJlamVjdGVkXG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IHRyYWNlLXJ1bGUtc2VsZWN0aW9uICAgLSByZXBvcnQgZWFjaCBydWxlIGFzIHNlbGVjdGVkXG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IHRyYWNlLWluc24taW5zZXJ0aW9uICAgLSByZXBvcnQgZWFjaCBpbnN0cnVjdGlvbiBhcyBpdCBpcyBpbnNlcnRlZCBpbnRvIGEgZGVjb2RlIHRhYmxlXG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IHRyYWNlLXJ1bGUtZXhwYW5zaW9uICAgLSByZXBvcnQgZWFjaCBpbnN0cnVjdGlvbiBhcyBpdCBpcyBleHBhbmRlZCAoYmVmb3JlIGluc2VydGlvbiBpbnRvIGEgZGVjb2RlIHRhYmxlKVxuIik7CisgICAgICBwcmludGYgKCJcdCB0cmFjZS1hbGwgICAgICAgICAgICAgIC0gZW5hYmxlIGFsbCB0cmFjZSBvcHRpb25zXG4iKTsKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICBwcmludGYgKCJcdCBmaWVsZC13aWR0aHMgICAgICAgICAgIC0gaW5zdHJ1Y3Rpb24gZm9ybWF0cyBzcGVjaWZ5IHdpZHRocyAoZGVwcmVjaWF0ZWQpXG4iKTsKKyAgICAgIHByaW50ZiAoIlx0ICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCBhbiBpbnN0cnVjdGlvbiBmb3JtYXQgc3BlY2lmaWVzIGJpdFxuIik7CisgICAgICBwcmludGYgKCJcdCAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25zXG4iKTsKKyAgICAgIHByaW50ZiAoIlx0ICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBjYW4gbm93IGJlIHNldCBkaXJlY3RseSBpbiB0aGVcbiIpOworICAgICAgcHJpbnRmICgiXHQgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uIHRhYmxlXG4iKTsKKyAgICAgIHByaW50ZiAoIlx0IGp1bXBzICAgICAgICAgICAgICAgICAgLSB1c2UganVtcHMgaW5zdGVhZCBvZiBmdW5jdGlvbiBjYWxsc1xuIik7CisgICAgICBwcmludGYgKCJcdCBvbWl0LWxpbmUtbnVtYmVycyAgICAgIC0gZG8gbm90IGluY2x1ZGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gaW4gdGhlIG91dHB1dFxuIik7CisgICAgICBwcmludGYgKCJcbiIpOworICAgICAgcHJpbnRmICgiSW5wdXQgb3B0aW9uczpcbiIpOworICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgLWsgPGNhY2hlLXJ1bGVzPiAoZGVwcmVjaWF0ZWQpXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgLW8gPGRlY29kZS1ydWxlcz5cbiIpOworICAgICAgcHJpbnRmICgiICAtaSA8aW5zdHJ1Y3Rpb24tdGFibGU+XG4iKTsKKyAgICAgIHByaW50ZiAoIlxuIik7CisgICAgICBwcmludGYgKCJPdXRwdXQgb3B0aW9uczpcbiIpOworICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgLXggICAgICAgICAgICAgICAgICAgIFBlcmZvcm0gZXhwYW5zaW9uIChyZXF1aXJlZClcbiIpOworICAgICAgcHJpbnRmICgiICAtbiA8cmVhbC1uYW1lPiAgICAgICAgU3BlY2lmeSB0aGUgcmVhbCBuYW1lIG9mIHRoZSBuZXh0IG91dHB1dCBmaWxlXG4iKTsgCisgICAgICBwcmludGYgKCIgIC1oIAkJICAgICAgIEdlbmVyYXRlIHRoZSBoZWFkZXIgKC5oKSBmaWxlIHJhdGhlciB0aGFuIHRoZSBib2R5ICguYylcbiIpOworICAgICAgcHJpbnRmICgiICAtYyA8b3V0cHV0LWZpbGU+ICAgICAgb3V0cHV0IGljYWNoZVxuIik7CisgICAgICBwcmludGYgKCIgIC1kIDxvdXRwdXQtZmlsZT4gICAgICBvdXRwdXQgaWRlY29kZVxuIik7CisgICAgICBwcmludGYgKCIgIC1lIDxvdXRwdXQtZmlsZT4gICAgICBvdXRwdXQgZW5naW5lXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgLWYgPG91dHB1dC1maWxlPiAgICAgIG91dHB1dCBzdXBwb3J0IGZ1bmN0aW9uc1xuIik7CisgICAgICBwcmludGYgKCIgIC1tIDxvdXRwdXQtZmlsZT4gICAgICBvdXRwdXQgbW9kZWxcbiIpOworICAgICAgcHJpbnRmICgiICAtciA8b3V0cHV0LWZpbGU+ICAgICAgb3V0cHV0IG11bHRpLXNpbSBydW5cbiIpOworICAgICAgcHJpbnRmICgiICAtcyA8b3V0cHV0LWZpbGU+ICAgICAgb3V0cHV0IHNjaGVtYXRpY1xuIik7CisgICAgICBwcmludGYgKCIgIC10IDxvdXRwdXQtZmlsZT4gICAgICBvdXRwdXQgaXRhYmxlXG4iKTsKKyAgICB9CisgIAorICB3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsCisJCSAgICAgICJCOkQ6RjpHOkg6STpNOk46UDpUOlc6bzprOmk6bjpoYzpkOmU6bTpyOnM6dDpmOngiKSkKKwkgIT0gLTEpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICAtJWMgIiwgY2gpOworICAgICAgaWYgKG9wdGFyZykKKwlmcHJpbnRmIChzdGRlcnIsICIlcyAiLCBvcHRhcmcpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXFxcbiIpOworICAgICAgCisgICAgICBzd2l0Y2goY2gpCisJeworCSAgCisJY2FzZSAnTSc6CisJICBmaWx0ZXJfcGFyc2UgKCZvcHRpb25zLm1vZGVsX2ZpbHRlciwgb3B0YXJnKTsKKwkgIGJyZWFrOworCisJY2FzZSAnRCc6CisJICBpZiAoc3RyY21wIChvcHRhcmcsICJwcm9jZXNzb3ItbmFtZXMiKSkKKwkgICAgeworCSAgICAgIGNoYXIgKnByb2Nlc3NvcjsKKwkgICAgICBmb3IgKHByb2Nlc3NvciA9IGZpbHRlcl9uZXh0IChvcHRpb25zLm1vZGVsX2ZpbHRlciwgIiIpOworCQkgICBwcm9jZXNzb3IgIT0gTlVMTDsKKwkJICAgcHJvY2Vzc29yID0gZmlsdGVyX25leHQgKG9wdGlvbnMubW9kZWxfZmlsdGVyLCBwcm9jZXNzb3IpKQorCQlsZl9wcmludGYgKHN0YW5kYXJkX291dCwgIiVzXG4iLCBwcm9jZXNzb3IpOworCSAgICB9CisJICBlbHNlCisJICAgIGVycm9yIChOVUxMLCAiVW5rbm93biBkYXRhIHN0cnVjdHVyZSAlcywgbm90IGR1bXBlZFxuIiwgb3B0YXJnKTsKKwkgIGJyZWFrOworCisJY2FzZSAnRic6CisJICBmaWx0ZXJfcGFyc2UgKCZvcHRpb25zLmZsYWdzX2ZpbHRlciwgb3B0YXJnKTsKKwkgIGJyZWFrOworCSAgCisJY2FzZSAnSSc6CisJICB7CisJICAgIHRhYmxlX2luY2x1ZGUgKipkaXIgPSAmb3B0aW9ucy5pbmNsdWRlOworCSAgICB3aGlsZSAoKCpkaXIpICE9IE5VTEwpCisJICAgICAgZGlyID0gJigqZGlyKS0+bmV4dDsKKwkgICAgKCpkaXIpID0gWkFMTE9DICh0YWJsZV9pbmNsdWRlKTsKKwkgICAgKCpkaXIpLT5kaXIgPSBzdHJkdXAgKG9wdGFyZyk7CisJICB9CisJICBicmVhazsKKwkgIAorCWNhc2UgJ0InOgorCSAgb3B0aW9ucy5pbnNuX2JpdF9zaXplID0gYTJpIChvcHRhcmcpOworCSAgaWYgKG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSA8PSAwCisJICAgICAgfHwgb3B0aW9ucy5pbnNuX2JpdF9zaXplID4gbWF4X2luc25fYml0X3NpemUpCisJICAgIHsKKwkgICAgICBlcnJvciAoTlVMTCwgIkluc3RydWN0aW9uIGJpdHNpemUgbXVzdCBiZSBpbiByYW5nZSAxLi4lZFxuIiwKKwkJICAgICBtYXhfaW5zbl9iaXRfc2l6ZSk7CisJICAgIH0KKwkgIGlmIChvcHRpb25zLmhpX2JpdF9uciAhPSBvcHRpb25zLmluc25fYml0X3NpemUgLSAxCisJICAgICAgJiYgb3B0aW9ucy5oaV9iaXRfbnIgIT0gMCkKKwkgICAgeworCSAgICAgIGVycm9yIChOVUxMLCAiQ29uZmxpY3QgYmV0d2VlbSBoaS1iaXQtbnIgYW5kIGluc24tYml0LXNpemVcbiIpOworCSAgICB9CisJICBicmVhazsKKwkgIAorCWNhc2UgJ0gnOgorCSAgb3B0aW9ucy5oaV9iaXRfbnIgPSBhMmkgKG9wdGFyZyk7CisJICBpZiAob3B0aW9ucy5oaV9iaXRfbnIgIT0gb3B0aW9ucy5pbnNuX2JpdF9zaXplIC0gMQorCSAgICAgICYmIG9wdGlvbnMuaGlfYml0X25yICE9IDApCisJICAgIHsKKwkgICAgICBlcnJvciAoTlVMTCwgIkNvbmZsaWN0IGJldHdlZW4gaGktYml0LW5yIGFuZCBpbnNuLWJpdC1zaXplXG4iKTsKKwkgICAgfQorCSAgYnJlYWs7CisJICAKKwljYXNlICdOJzoKKwkgIG9wdGlvbnMuZ2VuLnNtcCA9IGEyaSAob3B0YXJnKTsKKwkgIGJyZWFrOworCSAgCisJY2FzZSAnUCc6CisJY2FzZSAnUyc6CisJICB7CisJICAgIGlnZW5fbW9kdWxlICpuYW1lczsKKwkgICAgaWdlbl9uYW1lICpuYW1lOworCSAgICBjaGFyICpjaHA7CisJICAgIGNocCA9IHN0cmNociAob3B0YXJnLCAnPScpOworCSAgICBpZiAoY2hwID09IE5VTEwpCisJICAgICAgeworCQluYW1lcyA9ICZvcHRpb25zLm1vZHVsZS5nbG9iYWw7CisJCWNocCA9IG9wdGFyZzsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCWNocCA9IGNocCArIDE7IC8qIHNraXAgYD0nICovCisJCW5hbWVzID0gTlVMTDsKKwkJaWYgKHN0cm5jbXAgKG9wdGFyZywgImdsb2JhbD0iLCBjaHAgLSBvcHRhcmcpID09IDApCisJCSAgeworCQkgICAgbmFtZXMgPSAmb3B0aW9ucy5tb2R1bGUuZ2xvYmFsOworCQkgIH0KKwkJaWYgKHN0cm5jbXAgKG9wdGFyZywgImVuZ2luZT0iLCBjaHAgLSBvcHRhcmcpID09IDApCisJCSAgeworCQkgICAgbmFtZXMgPSAmb3B0aW9ucy5tb2R1bGUuZW5naW5lOworCQkgIH0KKwkJaWYgKHN0cm5jbXAgKG9wdGFyZywgImljYWNoZT0iLCBjaHAgLSBvcHRhcmcpID09IDApCisJCSAgeworCQkgICAgbmFtZXMgPSAmb3B0aW9ucy5tb2R1bGUuaWNhY2hlOworCQkgIH0KKwkJaWYgKHN0cm5jbXAgKG9wdGFyZywgImlkZWNvZGU9IiwgY2hwIC0gb3B0YXJnKSA9PSAwKQorCQkgIHsKKwkJICAgIG5hbWVzID0gJm9wdGlvbnMubW9kdWxlLmlkZWNvZGU7CisJCSAgfQorCQlpZiAoc3RybmNtcCAob3B0YXJnLCAiaXRhYmxlPSIsIGNocCAtIG9wdGFyZykgPT0gMCkKKwkJICB7CisJCSAgICBuYW1lcyA9ICZvcHRpb25zLm1vZHVsZS5pdGFibGU7CisJCSAgfQorCQlpZiAoc3RybmNtcCAob3B0YXJnLCAic2VtYW50aWNzPSIsIGNocCAtIG9wdGFyZykgPT0gMCkKKwkJICB7CisJCSAgICBuYW1lcyA9ICZvcHRpb25zLm1vZHVsZS5zZW1hbnRpY3M7CisJCSAgfQorCQlpZiAoc3RybmNtcCAob3B0YXJnLCAic3VwcG9ydD0iLCBjaHAgLSBvcHRhcmcpID09IDApCisJCSAgeworCQkgICAgbmFtZXMgPSAmb3B0aW9ucy5tb2R1bGUuc3VwcG9ydDsKKwkJICB9CisJCWlmIChuYW1lcyA9PSBOVUxMKQorCQkgIHsKKwkJICAgIGVycm9yIChOVUxMLCAiUHJlZml4IGAlcycgdW5yZWNvbml6ZWRcbiIsIG9wdGFyZyk7CisJCSAgfQorCSAgICAgIH0KKwkgICAgc3dpdGNoIChjaCkKKwkgICAgICB7CisJICAgICAgY2FzZSAnUCc6CisJCW5hbWUgPSAmbmFtZXMtPnByZWZpeDsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAnUyc6CisJCW5hbWUgPSAmbmFtZXMtPnN1ZmZpeDsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgICBuYW1lLT51ID0gc3RyZHVwIChjaHApOworCSAgICBuYW1lLT5sID0gc3RyZHVwIChjaHApOworCSAgICBjaHAgPSBuYW1lLT51OworCSAgICB3aGlsZSAoKmNocCkgeworCSAgICAgIGlmIChpc2xvd2VyKCpjaHApKQorCQkqY2hwID0gdG91cHBlcigqY2hwKTsKKwkgICAgICBjaHArKzsKKwkgICAgfQorCSAgICBpZiAobmFtZSA9PSAmb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeCkKKwkgICAgICB7CisJCW9wdGlvbnMubW9kdWxlLmVuZ2luZS5wcmVmaXggPSBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4OworCQlvcHRpb25zLm1vZHVsZS5pY2FjaGUucHJlZml4ID0gb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeDsKKwkJb3B0aW9ucy5tb2R1bGUuaWRlY29kZS5wcmVmaXggPSBvcHRpb25zLm1vZHVsZS5nbG9iYWwucHJlZml4OworCQkvKiBvcHRpb25zLm1vZHVsZS5pdGFibGUucHJlZml4ID0gb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeDsgKi8KKwkJb3B0aW9ucy5tb2R1bGUuc2VtYW50aWNzLnByZWZpeCA9IG9wdGlvbnMubW9kdWxlLmdsb2JhbC5wcmVmaXg7CisJCW9wdGlvbnMubW9kdWxlLnN1cHBvcnQucHJlZml4ID0gb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeDsKKwkgICAgICB9CisJICAgIGlmIChuYW1lID09ICZvcHRpb25zLm1vZHVsZS5nbG9iYWwuc3VmZml4KQorCSAgICAgIHsKKwkJb3B0aW9ucy5tb2R1bGUuZW5naW5lLnN1ZmZpeCA9IG9wdGlvbnMubW9kdWxlLmdsb2JhbC5zdWZmaXg7CisJCW9wdGlvbnMubW9kdWxlLmljYWNoZS5zdWZmaXggPSBvcHRpb25zLm1vZHVsZS5nbG9iYWwuc3VmZml4OworCQlvcHRpb25zLm1vZHVsZS5pZGVjb2RlLnN1ZmZpeCA9IG9wdGlvbnMubW9kdWxlLmdsb2JhbC5zdWZmaXg7CisJCS8qIG9wdGlvbnMubW9kdWxlLml0YWJsZS5zdWZmaXggPSBvcHRpb25zLm1vZHVsZS5nbG9iYWwuc3VmZml4OyAqLworCQlvcHRpb25zLm1vZHVsZS5zZW1hbnRpY3Muc3VmZml4ID0gb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnN1ZmZpeDsKKwkJb3B0aW9ucy5tb2R1bGUuc3VwcG9ydC5zdWZmaXggPSBvcHRpb25zLm1vZHVsZS5nbG9iYWwuc3VmZml4OworCSAgICAgIH0KKwkgICAgYnJlYWs7CisJICB9CisJCisJY2FzZSAnVyc6CisJICB7CisJICAgIGlmIChzdHJjbXAgKG9wdGFyZywgImVycm9yIikgPT0gMCkKKwkgICAgICBvcHRpb25zLndhcm5pbmcgPSBlcnJvcjsKKwkgICAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJub2Rpc2NhcmQiKSA9PSAwKQorCSAgICAgIG9wdGlvbnMud2Fybi5kaXNjYXJkID0gMDsKKwkgICAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJkaXNjYXJkIikgPT0gMCkKKwkgICAgICBvcHRpb25zLndhcm4uZGlzY2FyZCA9IDE7CisJICAgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAibm93aWR0aCIpID09IDApCisJICAgICAgb3B0aW9ucy53YXJuLndpZHRoID0gMDsKKwkgICAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJ3aWR0aCIpID09IDApCisJICAgICAgb3B0aW9ucy53YXJuLndpZHRoID0gMTsKKwkgICAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJub3VuaW1wbGVtZW50ZWQiKSA9PSAwKQorCSAgICAgIG9wdGlvbnMud2Fybi51bmltcGxlbWVudGVkID0gMDsKKwkgICAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJ1bmltcGxlbWVudGVkIikgPT0gMCkKKwkgICAgICBvcHRpb25zLndhcm4udW5pbXBsZW1lbnRlZCA9IDE7CisJICAgIGVsc2UKKwkgICAgICBlcnJvciAoTlVMTCwgIlVua25vd24gLVcgYXJndW1lbnQgYCVzJ1xuIiwgb3B0YXJnKTsKKwkgICAgYnJlYWs7CisJICB9CisKKworCWNhc2UgJ0cnOgorCSAgeworCSAgICBpbnQgZW5hYmxlX3A7CisJICAgIGNoYXIgKmFyZ3A7CisJICAgIGlmIChzdHJuY21wIChvcHRhcmcsICJuby0iLCBzdHJsZW4gKCJuby0iKSkgPT0gMCkKKwkgICAgICB7CisJCWFyZ3AgPSBvcHRhcmcgKyBzdHJsZW4gKCJuby0iKTsKKwkJZW5hYmxlX3AgPSAwOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoc3RybmNtcCAob3B0YXJnLCAiISIsIHN0cmxlbiAoIiEiKSkgPT0gMCkKKwkgICAgICB7CisJCWFyZ3AgPSBvcHRhcmcgKyBzdHJsZW4gKCJuby0iKTsKKwkJZW5hYmxlX3AgPSAwOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJYXJncCA9IG9wdGFyZzsKKwkJZW5hYmxlX3AgPSAxOworCSAgICAgIH0KKwkgICAgaWYgKHN0cmNtcCAoYXJncCwgImRlY29kZS1kdXBsaWNhdGUiKSA9PSAwKQorCSAgICAgIHsKKwkJb3B0aW9ucy5kZWNvZGUuZHVwbGljYXRlID0gZW5hYmxlX3A7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJkZWNvZGUtY29tYmluZSIpID09IDApCisJICAgICAgeworCQlvcHRpb25zLmRlY29kZS5jb21iaW5lID0gZW5hYmxlX3A7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJkZWNvZGUtemVyby1yZXNlcnZlZCIpID09IDApCisJICAgICAgeworCQlvcHRpb25zLmRlY29kZS56ZXJvX3Jlc2VydmVkID0gZW5hYmxlX3A7CisJICAgICAgfQorCSAgICAKKwkgICAgZWxzZSBpZiAoc3RyY21wIChhcmdwLCAiZ2VuLWNvbmRpdGlvbmFsLWlzc3VlIikgPT0gMCkKKwkgICAgICB7CisJCW9wdGlvbnMuZ2VuLmNvbmRpdGlvbmFsX2lzc3VlID0gZW5hYmxlX3A7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJjb25kaXRpb25hbC1pc3N1ZSIpID09IDApCisJICAgICAgeworCQlvcHRpb25zLmdlbi5jb25kaXRpb25hbF9pc3N1ZSA9IGVuYWJsZV9wOworCQlvcHRpb25zLndhcm5pbmcgKE5VTEwsICJPcHRpb24gY29uZGl0aW9uYWwtaXNzdWUgcmVwbGFjZWQgYnkgZ2VuLWNvbmRpdGlvbmFsLWlzc3VlXG4iKTsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgImdlbi1kZWxheWVkLWJyYW5jaCIpID09IDApCisJICAgICAgeworCQlvcHRpb25zLmdlbi5kZWxheWVkX2JyYW5jaCA9IGVuYWJsZV9wOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoc3RyY21wIChhcmdwLCAiZGVsYXllZC1icmFuY2giKSA9PSAwKQorCSAgICAgIHsKKwkJb3B0aW9ucy5nZW4uZGVsYXllZF9icmFuY2ggPSBlbmFibGVfcDsKKwkJb3B0aW9ucy53YXJuaW5nIChOVUxMLCAiT3B0aW9uIGRlbGF5ZWQtYnJhbmNoIHJlcGxhY2VkIGJ5IGdlbi1kZWxheWVkLWJyYW5jaFxuIik7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJnZW4tZGlyZWN0LWFjY2VzcyIpID09IDApCisJICAgICAgeworCQlvcHRpb25zLmdlbi5kaXJlY3RfYWNjZXNzID0gZW5hYmxlX3A7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJkaXJlY3QtYWNjZXNzIikgPT0gMCkKKwkgICAgICB7CisJCW9wdGlvbnMuZ2VuLmRpcmVjdF9hY2Nlc3MgPSBlbmFibGVfcDsKKwkJb3B0aW9ucy53YXJuaW5nIChOVUxMLCAiT3B0aW9uIGRpcmVjdC1hY2Nlc3MgcmVwbGFjZWQgYnkgZ2VuLWRpcmVjdC1hY2Nlc3NcbiIpOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoc3RybmNtcCAoYXJncCwgImdlbi16ZXJvLXIiLCBzdHJsZW4gKCJnZW4temVyby1yIikpID09IDApCisJICAgICAgeworCQlvcHRpb25zLmdlbi56ZXJvX3JlZyA9IGVuYWJsZV9wOworCQlvcHRpb25zLmdlbi56ZXJvX3JlZ19uciA9IGF0b2kgKGFyZ3AgKyBzdHJsZW4gKCJnZW4temVyby1yIikpOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoc3RybmNtcCAoYXJncCwgInplcm8tciIsIHN0cmxlbiAoInplcm8tciIpKSA9PSAwKQorCSAgICAgIHsKKwkJb3B0aW9ucy5nZW4uemVyb19yZWcgPSBlbmFibGVfcDsKKwkJb3B0aW9ucy5nZW4uemVyb19yZWdfbnIgPSBhdG9pIChhcmdwICsgc3RybGVuICgiemVyby1yIikpOworCQlvcHRpb25zLndhcm5pbmcgKE5VTEwsICJPcHRpb24gemVyby1yPE4+IHJlcGxhY2VkIGJ5IGdlbi16ZXJvLXI8Tj5cbiIpOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoc3RybmNtcCAoYXJncCwgImdlbi1pY2FjaGUiLCBzdHJsZW4gKCJnZW4taWNhY2hlIikpID09IDApCisJICAgICAgeworCQlzd2l0Y2ggKGFyZ3Bbc3RybGVuICgiZ2VuLWljYWNoZSIpXSkKKwkJICB7CisJCSAgY2FzZSAnPSc6CisJCSAgICBvcHRpb25zLmdlbi5pY2FjaGVfc2l6ZSA9IGF0b2kgKGFyZ3AgKyBzdHJsZW4gKCJnZW4taWNhY2hlIikgKyAxKTsKKwkJICAgIG9wdGlvbnMuZ2VuLmljYWNoZSA9IGVuYWJsZV9wOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSAnXDAnOgorCQkgICAgb3B0aW9ucy5nZW4uaWNhY2hlID0gZW5hYmxlX3A7CisJCSAgICBicmVhazsKKwkJICBkZWZhdWx0OgorCQkgICAgZXJyb3IgKE5VTEwsICJFeHBlY3RpbmcgLUdnZW4taWNhY2hlIG9yIC1HZ2VuLWljYWNoZT08Tj5cbiIpOworCQkgIH0KKwkgICAgICB9CisJICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgImdlbi1pbnNuLWluLWljYWNoZSIpID09IDApCisJICAgICAgeworCQlvcHRpb25zLmdlbi5pbnNuX2luX2ljYWNoZSA9IGVuYWJsZV9wOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoc3RybmNtcCAoYXJncCwgImdlbi1tdWx0aS1zaW0iLCBzdHJsZW4gKCJnZW4tbXVsdGktc2ltIikpID09IDApCisJICAgICAgeworCQljaGFyICphcmcgPSAmYXJncFtzdHJsZW4gKCJnZW4tbXVsdGktc2ltIildOworCQlzd2l0Y2ggKGFyZ1swXSkKKwkJICB7CisJCSAgY2FzZSAnPSc6CisJCSAgICBvcHRpb25zLmdlbi5tdWx0aV9zaW0gPSBlbmFibGVfcDsKKwkJICAgIG9wdGlvbnMuZ2VuLmRlZmF1bHRfbW9kZWwgPSBhcmcgKyAxOworCQkgICAgaWYgKCEgZmlsdGVyX2lzX21lbWJlciAob3B0aW9ucy5tb2RlbF9maWx0ZXIsIG9wdGlvbnMuZ2VuLmRlZmF1bHRfbW9kZWwpKQorCQkgICAgICBlcnJvciAoTlVMTCwgIm11bHRpLXNpbSBtb2RlbCAlcyB1bmtub3duXG4iLCBvcHRpb25zLmdlbi5kZWZhdWx0X21vZGVsKTsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgJ1wwJzoKKwkJICAgIG9wdGlvbnMuZ2VuLm11bHRpX3NpbSA9IGVuYWJsZV9wOworCQkgICAgb3B0aW9ucy5nZW4uZGVmYXVsdF9tb2RlbCA9IE5VTEw7CisJCSAgICBicmVhazsKKwkJICBkZWZhdWx0OgorCQkgICAgZXJyb3IgKE5VTEwsICJFeHBlY3RpbmcgLUdnZW4tbXVsdGktc2ltIG9yIC1HZ2VuLW11bHRpLXNpbT08TU9ERUw+XG4iKTsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkgICAgICB9CisJICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgImdlbi1tdWx0aS13b3JkIikgPT0gMCkKKwkgICAgICB7CisJCW9wdGlvbnMuZ2VuLm11bHRpX3dvcmQgPSBlbmFibGVfcDsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgImdlbi1zZW1hbnRpYy1pY2FjaGUiKSA9PSAwKQorCSAgICAgIHsKKwkJb3B0aW9ucy5nZW4uc2VtYW50aWNfaWNhY2hlID0gZW5hYmxlX3A7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJnZW4tc2xvdC12ZXJpZmljYXRpb24iKSA9PSAwKQorCSAgICAgIHsKKwkJb3B0aW9ucy5nZW4uc2xvdF92ZXJpZmljYXRpb24gPSBlbmFibGVfcDsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgInZlcmlmeS1zbG90IikgPT0gMCkKKwkgICAgICB7CisJCW9wdGlvbnMuZ2VuLnNsb3RfdmVyaWZpY2F0aW9uID0gZW5hYmxlX3A7CisJCW9wdGlvbnMud2FybmluZyAoTlVMTCwgIk9wdGlvbiB2ZXJpZnktc2xvdCByZXBsYWNlZCBieSBnZW4tc2xvdC12ZXJpZmljYXRpb25cbiIpOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoc3RyY21wIChhcmdwLCAiZ2VuLW5pYS1pbnZhbGlkIikgPT0gMCkKKwkgICAgICB7CisJCW9wdGlvbnMuZ2VuLm5pYSA9IG5pYV9pc19pbnZhbGlkOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoc3RyY21wIChhcmdwLCAiZGVmYXVsdC1uaWEtbWludXMtb25lIikgPT0gMCkKKwkgICAgICB7CisJCW9wdGlvbnMuZ2VuLm5pYSA9IG5pYV9pc19pbnZhbGlkOworCQlvcHRpb25zLndhcm5pbmcgKE5VTEwsICJPcHRpb24gZGVmYXVsdC1uaWEtbWludXMtb25lIHJlcGxhY2VkIGJ5IGdlbi1uaWEtaW52YWxpZFxuIik7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJnZW4tbmlhLXZvaWQiKSA9PSAwKQorCSAgICAgIHsKKwkJb3B0aW9ucy5nZW4ubmlhID0gbmlhX2lzX3ZvaWQ7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJ0cmFjZS1hbGwiKSA9PSAwKQorCSAgICAgIHsKKwkJbWVtc2V0ICgmb3B0aW9ucy50cmFjZSwgZW5hYmxlX3AsIHNpemVvZiAob3B0aW9ucy50cmFjZSkpOworCSAgICAgIH0KKwkgICAgZWxzZSBpZiAoc3RyY21wIChhcmdwLCAidHJhY2UtY29tYmluZSIpID09IDApCisJICAgICAgeworCQlvcHRpb25zLnRyYWNlLmNvbWJpbmUgPSBlbmFibGVfcDsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJncCwgInRyYWNlLWVudHJpZXMiKSA9PSAwKQorCSAgICAgIHsKKwkJb3B0aW9ucy50cmFjZS5lbnRyaWVzID0gZW5hYmxlX3A7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJ0cmFjZS1ydWxlLXJlamVjdGlvbiIpID09IDApCisJICAgICAgeworCQlvcHRpb25zLnRyYWNlLnJ1bGVfcmVqZWN0aW9uID0gZW5hYmxlX3A7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJ0cmFjZS1ydWxlLXNlbGVjdGlvbiIpID09IDApCisJICAgICAgeworCQlvcHRpb25zLnRyYWNlLnJ1bGVfc2VsZWN0aW9uID0gZW5hYmxlX3A7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJ0cmFjZS1pbnNuLWluc2VydGlvbiIpID09IDApCisJICAgICAgeworCQlvcHRpb25zLnRyYWNlLmluc25faW5zZXJ0aW9uID0gZW5hYmxlX3A7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJ0cmFjZS1pbnNuLWV4cGFuc2lvbiIpID09IDApCisJICAgICAgeworCQlvcHRpb25zLnRyYWNlLmluc25fZXhwYW5zaW9uID0gZW5hYmxlX3A7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJqdW1wcyIpID09IDApCisJICAgICAgeworCQlvcHRpb25zLmdlbi5jb2RlID0gZ2VuZXJhdGVfanVtcHM7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJmaWVsZC13aWR0aHMiKSA9PSAwKQorCSAgICAgIHsKKwkJb3B0aW9ucy5pbnNuX3NwZWNpZnlpbmdfd2lkdGhzID0gZW5hYmxlX3A7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChzdHJjbXAgKGFyZ3AsICJvbWl0LWxpbmUtbnVtYmVycyIpID09IDApCisJICAgICAgeworCQlmaWxlX3JlZmVyZW5jZXMgPSBsZl9vbWl0X3JlZmVyZW5jZXM7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQllcnJvciAoTlVMTCwgIlVua25vd24gb3B0aW9uICVzXG4iLCBvcHRhcmcpOworCSAgICAgIH0KKwkgICAgYnJlYWs7CisJICB9CisJCisJY2FzZSAnaSc6CisJICBpc2EgPSBsb2FkX2luc25fdGFibGUgKG9wdGFyZywgY2FjaGVfcnVsZXMpOworCSAgaWYgKGlzYS0+aWxsZWdhbF9pbnNuID09IE5VTEwpCisJICAgIGVycm9yIChOVUxMLCAiaWxsZWdhbC1pbnN0cnVjdGlvbiBtaXNzaW5nIGZyb20gaW5zbiB0YWJsZVxuIik7CisJICBicmVhazsKKworCWNhc2UgJ3gnOgorCSAgZ2VuID0gZG9fZ2VuIChpc2EsIGRlY29kZV9ydWxlcyk7CisJICBicmVhazsKKworCWNhc2UgJ28nOgorCSAgZGVjb2RlX3J1bGVzID0gbG9hZF9kZWNvZGVfdGFibGUgKG9wdGFyZyk7CisJICBicmVhazsKKworCWNhc2UgJ2snOgorCSAgaWYgKGlzYSAhPSBOVUxMKQorCSAgICBlcnJvciAoTlVMTCwgIkNhY2hlIGZpbGUgbXVzdCBhcHBlYXIgYmVmb3JlIHRoZSBpbnNuIGZpbGVcbiIpOworCSAgY2FjaGVfcnVsZXMgPSBsb2FkX2NhY2hlX3RhYmxlIChvcHRhcmcpOworCSAgYnJlYWs7CisKKwljYXNlICduJzoKKwkgIHJlYWxfZmlsZV9uYW1lID0gc3RyZHVwKG9wdGFyZyk7CisJICBicmVhazsKKworCWNhc2UgJ2gnOgorCSAgaXNfaGVhZGVyID0gMTsKKwkgIGJyZWFrOworCSAgCisJY2FzZSAnYyc6CisJY2FzZSAnZCc6CisJY2FzZSAnZSc6CisJY2FzZSAnZic6CisJY2FzZSAnbSc6CisJY2FzZSAncic6CisJY2FzZSAncyc6CisJY2FzZSAndCc6CisJICB7CisJICAgIGxmICpmaWxlID0gbGZfb3BlbihvcHRhcmcsIHJlYWxfZmlsZV9uYW1lLCBmaWxlX3JlZmVyZW5jZXMsCisJCQkgICAgICAgKGlzX2hlYWRlciA/IGxmX2lzX2ggOiBsZl9pc19jKSwKKwkJCSAgICAgICBhcmd2WzBdKTsKKwkgICAgaWYgKGdlbiA9PSBOVUxMICYmIGNoICE9ICd0JyAmJiBjaCAhPSAnbScgJiYgY2ggIT0gJ2YnKQorCSAgICAgIHsKKwkJb3B0aW9ucy53YXJuaW5nIChOVUxMLCAiRXhwbGljaXRseSBnZW5lcmF0ZSB0YWJsZXMgd2l0aCAteCBvcHRpb25cbiIpOworCQlnZW4gPSBkb19nZW4gKGlzYSwgZGVjb2RlX3J1bGVzKTsKKwkgICAgICB9CisJICAgIGxmX3ByaW50X19maWxlX3N0YXJ0KGZpbGUpOworCSAgICBzd2l0Y2ggKGNoKQorCSAgICAgIHsKKwkgICAgICBjYXNlICdtJzoKKwkJaWYgKGlzX2hlYWRlcikKKwkJICBnZW5fbW9kZWxfaCAoZmlsZSwgaXNhKTsKKwkJZWxzZQorCQkgIGdlbl9tb2RlbF9jIChmaWxlLCBpc2EpOworCQlicmVhazsKKwkgICAgICBjYXNlICd0JzoKKwkJaWYgKGlzX2hlYWRlcikKKwkJICBnZW5faXRhYmxlX2ggKGZpbGUsIGlzYSk7CisJCWVsc2UKKwkJICBnZW5faXRhYmxlX2MgKGZpbGUsIGlzYSk7CisJCWJyZWFrOworCSAgICAgIGNhc2UgJ2YnOgorCQlpZiAoaXNfaGVhZGVyKQorCQkgIGdlbl9zdXBwb3J0X2ggKGZpbGUsIGlzYSk7CisJCWVsc2UKKwkJICBnZW5fc3VwcG9ydF9jIChmaWxlLCBpc2EpOworCQlicmVhazsKKwkgICAgICBjYXNlICdyJzoKKwkJaWYgKGlzX2hlYWRlcikKKwkJICBvcHRpb25zLndhcm5pbmcgKE5VTEwsICItaHIgb3B0aW9uIGlnbm9yZWRcbiIpOworCQllbHNlCisJCSAgZ2VuX3J1bl9jIChmaWxlLCBnZW4pOworCQlicmVhazsKKwkgICAgICBjYXNlICdzJzoKKwkJaWYoaXNfaGVhZGVyKQorCQkgIGdlbl9zZW1hbnRpY3NfaCAoZmlsZSwgZ2VuLT5zZW1hbnRpY3MsIGlzYS0+bWF4X25yX3dvcmRzKTsKKwkJZWxzZQorCQkgIGdlbl9zZW1hbnRpY3NfYyAoZmlsZSwgZ2VuLT5zZW1hbnRpY3MsIGlzYS0+Y2FjaGVzKTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAnZCc6CisJCWlmIChpc19oZWFkZXIpCisJCSAgZ2VuX2lkZWNvZGVfaCAoZmlsZSwgZ2VuLCBpc2EsIGNhY2hlX3J1bGVzKTsKKwkJZWxzZQorCQkgIGdlbl9pZGVjb2RlX2MgKGZpbGUsIGdlbiwgaXNhLCBjYWNoZV9ydWxlcyk7CisJCWJyZWFrOworCSAgICAgIGNhc2UgJ2UnOgorCQlpZiAoaXNfaGVhZGVyKQorCQkgIGdlbl9lbmdpbmVfaCAoZmlsZSwgZ2VuLCBpc2EsIGNhY2hlX3J1bGVzKTsKKwkJZWxzZQorCQkgIGdlbl9lbmdpbmVfYyAoZmlsZSwgZ2VuLCBpc2EsIGNhY2hlX3J1bGVzKTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAnYyc6CisJCWlmIChpc19oZWFkZXIpCisJCSAgZ2VuX2ljYWNoZV9oIChmaWxlLAorCQkJCWdlbi0+c2VtYW50aWNzLAorCQkJCWlzYS0+ZnVuY3Rpb25zLAorCQkJCWlzYS0+bWF4X25yX3dvcmRzKTsKKwkJZWxzZQorCQkgIGdlbl9pY2FjaGVfYyAoZmlsZSwKKwkJCQlnZW4tPnNlbWFudGljcywKKwkJCQlpc2EtPmZ1bmN0aW9ucywKKwkJCQljYWNoZV9ydWxlcyk7CisJCWJyZWFrOworCSAgICAgIH0KKwkgICAgbGZfcHJpbnRfX2ZpbGVfZmluaXNoKGZpbGUpOworCSAgICBsZl9jbG9zZShmaWxlKTsKKwkgICAgaXNfaGVhZGVyID0gMDsKKwkgIH0KKwlyZWFsX2ZpbGVfbmFtZSA9IE5VTEw7CisJYnJlYWs7CisJZGVmYXVsdDoKKwkgIEVSUk9SICgiQmFkIHN3aXRjaCIpOworCX0KKyAgICB9CisgIHJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgYS9zaW0vaWdlbi9pZ2VuLmggYi9zaW0vaWdlbi9pZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRmZGI4MwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9pZ2VuL2lnZW4uaApAQCAtMCwwICsxLDIzNCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKy8qIGNvZGUtZ2VuZXJhdGlvbiBvcHRpb25zOiAqLworCit0eXBlZGVmIGVudW0geworCisgIC8qIFRyYW5zZmVyIGNvbnRyb2wgdG8gYW4gaW5zdHJ1Y3Rpb25zIHNlbWFudGljIGNvZGUgdXNpbmcgdGhlIHRoZQorICAgICBzdGFuZGFyZCBjYWxsL3JldHVybiBtZWNoYW5pc20gKi8KKworICBnZW5lcmF0ZV9jYWxscywKKworICAvKiBUcmFuc2ZlciBjb250cm9sIHRvIGFuIGluc3RydWN0aW9ucyBzZW1hbnRpYyBjb2RlIHVzaW5nCisgICAgIChjb21wdXRlZCkgZ290bydzIGluc3RlYWQgb2YgdGhlIG1vcmUgY29udmVudGlvbmFsIGNhbGwvcmV0dXJuCisgICAgIG1lY2hhbmlzbSAqLworCisgIGdlbmVyYXRlX2p1bXBzLAorCit9IGlnZW5fY29kZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgbmlhX2lzX2NpYV9wbHVzX29uZSwKKyAgbmlhX2lzX3ZvaWQsCisgIG5pYV9pc19pbnZhbGlkLAorfSBpZ2VuX25pYTsKKworCisKK3R5cGVkZWYgc3RydWN0IF9pZ2VuX2dlbl9vcHRpb25zIGlnZW5fZ2VuX29wdGlvbnM7CitzdHJ1Y3QgX2lnZW5fZ2VuX29wdGlvbnMgeworICBpbnQgZGlyZWN0X2FjY2VzczsKKyAgaW50IHNlbWFudGljX2ljYWNoZTsKKyAgaW50IGluc25faW5faWNhY2hlOworICBpbnQgY29uZGl0aW9uYWxfaXNzdWU7CisgIGludCBzbG90X3ZlcmlmaWNhdGlvbjsKKyAgaW50IGRlbGF5ZWRfYnJhbmNoOworCisgIC8qIElmIHplcm9pbmcgYSByZWdpc3Rlciwgd2hpY2ggb25lPyAqLworICBpbnQgemVyb19yZWc7CisgIGludCB6ZXJvX3JlZ19ucjsKKworICAvKiBzaG91bGQgbXVsdGlwbGUgc2ltdWxhdG9ycyBiZSBnZW5lcmF0ZWQ/ICovCisgIGludCBtdWx0aV9zaW07CisKKyAgLyogbmFtZSBvZiB0aGUgZGVmYXVsdCBtdWx0aS1zaW0gbW9kZWwgKi8KKyAgY2hhciAqZGVmYXVsdF9tb2RlbDsKKworICAvKiBzaG91bGQgdGhlIHNpbXVsYXRvciBzdXBwb3J0IG11bHRpIHdvcmQgaW5zdHJ1Y3Rpb25zIGFuZCBpZiBzbywKKyAgICAgd2hhdCBpcyB0aGUgbWF4IG5yIG9mIHdvcmRzLiAqLworICBpbnQgbXVsdGlfd29yZDsKKworICAvKiBTTVA/ICBTaG91bGQgdGhlIGdlbmVyYXRlZCBjb2RlIGluY2x1ZGUgU01QIHN1cHBvcnQgKD4wKSBhbmQgaWYKKyAgICAgc28sIGZvciBob3cgbWFueSBwcm9jZXNzb3JzPyAqLworICBpbnQgc21wOworCisgIC8qIGhvdyBzaG91bGQgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gYWRkcmVzcyBiZSBjb21wdXRlZD8gKi8KKyAgaWdlbl9uaWEgbmlhOworCisgIC8qIG5yIG9mIGluc3RydWN0aW9ucyBpbiB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbiBjYWNoZSAqLworICBpbnQgaWNhY2hlOworICBpbnQgaWNhY2hlX3NpemU7CisKKyAgLyogc2VlIGFib3ZlICovCisgIGlnZW5fY29kZSBjb2RlOworfTsKKworCit0eXBlZGVmIHN0cnVjdCBfaWdlbl90cmFjZV9vcHRpb25zIGlnZW5fdHJhY2Vfb3B0aW9uczsKK3N0cnVjdCBfaWdlbl90cmFjZV9vcHRpb25zIHsKKyAgaW50IHJ1bGVfc2VsZWN0aW9uOworICBpbnQgcnVsZV9yZWplY3Rpb247CisgIGludCBpbnNuX2luc2VydGlvbjsKKyAgaW50IGluc25fZXhwYW5zaW9uOworICBpbnQgZW50cmllczsKKyAgaW50IGNvbWJpbmU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfaWdlbl9uYW1lIHsKKyAgY2hhciAqdTsKKyAgY2hhciAqbDsKK30gaWdlbl9uYW1lOwordHlwZWRlZiBzdHJ1Y3QgX2lnZW5fbW9kdWxlIHsKKyAgaWdlbl9uYW1lIHByZWZpeDsKKyAgaWdlbl9uYW1lIHN1ZmZpeDsKK30gaWdlbl9tb2R1bGU7CisKK3R5cGVkZWYgc3RydWN0IF9pZ2VuX21vZHVsZV9vcHRpb25zIHsKKyAgaWdlbl9tb2R1bGUgZ2xvYmFsOworICBpZ2VuX21vZHVsZSBlbmdpbmU7CisgIGlnZW5fbW9kdWxlIGljYWNoZTsKKyAgaWdlbl9tb2R1bGUgaWRlY29kZTsKKyAgaWdlbl9tb2R1bGUgaXRhYmxlOworICBpZ2VuX21vZHVsZSBzZW1hbnRpY3M7CisgIGlnZW5fbW9kdWxlIHN1cHBvcnQ7Cit9IGlnZW5fbW9kdWxlX29wdGlvbnM7CisKK3R5cGVkZWYgc3RydWN0IF9pZ2VuX2RlY29kZV9vcHRpb25zIGlnZW5fZGVjb2RlX29wdGlvbnMgOworc3RydWN0IF9pZ2VuX2RlY29kZV9vcHRpb25zIHsKKworICAvKiBDb21iaW5lIHRhYmxlcz8gIFNob3VsZCB0aGUgZ2VuZXJhdG9yIG1ha2UgYSBzZWNvbmQgcGFzcyB0aHJvdWdoCisgICAgIGVhY2ggZ2VuZXJhdGVkIHRhYmxlIGxvb2tpbmcgZm9yIGFueSBzdWItZW50cmllcyB0aGF0IGNvbnRhaW4gdGhlCisgICAgIHNhbWUgaW5zdHJ1Y3Rpb25zLiAgVGhvc2UgZW50cmllcyBiZWluZyBtZXJnZWQgaW50byBhIHNpbmdsZQorICAgICB0YWJsZSAqLworICBpbnQgY29tYmluZTsKKworICAvKiBJbnN0cnVjdGlvbiBleHBhbnNpb24/IFNob3VsZCB0aGUgc2VtYW50aWMgY29kZSBmb3IgZWFjaAorICAgICBpbnN0cnVjdGlvbiwgd2hlbiB0aGUgb3BvcnR1bml0eSBhcnJpc2VzLCBiZSBleHBhbmRlZCBhY2NvcmRpbmcKKyAgICAgdG8gdGhlIHZhcmlhYmxlIG9wY29kZSBmaWxlcyB0aGF0IHRoZSBpbnN0cnVjdGlvbiBkZWNvZGUgcHJvY2VzcworICAgICByZW5kZXJzIGNvbnN0YW50ICovCisgIGludCBkdXBsaWNhdGU7CisKKyAgLyogVHJlYXQgcmVzZXJ2ZWQgZmllbGRzIGFzIGNvbnN0YW50ICh6ZXJvKSBpbnN0ZWFkIG9mIGlnbm9yaW5nCisgICAgIHRoZWlyIHZhbHVlIHdoZW4gZGV0ZXJtaW5pbmcgZGVjb2RlIHRhYmxlcyAqLworICBpbnQgemVyb19yZXNlcnZlZDsKKworICAvKiBDb252ZXJ0IGFueSBwYWRkZWQgc3dpdGNoIHJ1bGVzIGludG8gZ290b19zd2l0Y2ggKi8KKyAgaW50IHN3aXRjaF9hc19nb3RvOworCisgIC8qIEZvcmNlIGFsbCB0YWJsZXMgdG8gYmUgZ2VuZXJhdGVkIHdpdGggdGhpcyBsb29rdXAgbWVjaGFuaXNtICovCisgIGNoYXIgKm92ZXJyaWRpbmdfZ2VuOworfTsKKworCit0eXBlZGVmIHN0cnVjdCBfaWdlbl93YXJuX29wdGlvbnMgaWdlbl93YXJuX29wdGlvbnM7CitzdHJ1Y3QgX2lnZW5fd2Fybl9vcHRpb25zIHsKKworICAvKiBJc3N1ZSB3YXJuaW5nIGFib3V0IGRpc2NhcmRlZCBpbnN0cnVjdGlvbnMgKi8KKyAgaW50IGRpc2NhcmQ7CisKKyAgLyogSXNzdWUgd2FybmluZyBhYm91dCBpbnZhbGlkIGluc3RydWN0aW9uIHdpZHRocyAqLworICBpbnQgd2lkdGg7CisKKyAgLyogSXNzdWUgd2FybmluZyBhYm91dCB1bmltcGxlbWVudGVkIGluc3RydWN0aW9ucyAqLworICBpbnQgdW5pbXBsZW1lbnRlZDsKKworfTsKKworCisKK3R5cGVkZWYgc3RydWN0IF9pZ2VuX29wdGlvbnMgaWdlbl9vcHRpb25zOworc3RydWN0IF9pZ2VuX29wdGlvbnMgeworCisgIC8qIFdoYXQgZG9lcyB0aGUgaW5zdHJ1Y3Rpb24gbG9vayBsaWtlIC0gYml0IG9yZGVyaW5nLCBzaXplLCB3aWR0aHMgb3IKKyAgICAgb2ZmZXNldHMgKi8KKyAgaW50IGhpX2JpdF9ucjsKKyAgaW50IGluc25fYml0X3NpemU7CisgIGludCBpbnNuX3NwZWNpZnlpbmdfd2lkdGhzOworCisgIC8qIHdoYXQgc2hvdWxkIGdsb2JhbCBuYW1lcyBiZSBwcmVmaXhlZCB3aXRoPyAqLworICBpZ2VuX21vZHVsZV9vcHRpb25zIG1vZHVsZTsKKworICAvKiBTZWUgYWJvdmUgZm9yIG9wdGlvbnMgYW5kIGZsYWdzICovCisgIGlnZW5fZ2VuX29wdGlvbnMgZ2VuOworCisgIC8qIFNlZSBhYm92ZSBmb3IgdHJhY2Ugb3B0aW9ucyAqLworICBpZ2VuX3RyYWNlX29wdGlvbnMgdHJhY2U7CisKKyAgLyogU2VlIGFib3ZlIGZvciBpbmNsdWRlIG9wdGlvbnMgKi8KKyAgdGFibGVfaW5jbHVkZSAqaW5jbHVkZTsKKworICAvKiBTZWUgYWJvdmUgZm9yIGRlY29kZSBvcHRpb25zICovCisgIGlnZW5fZGVjb2RlX29wdGlvbnMgZGVjb2RlOworCisgIC8qIEZpbHRlciBzZXQgdG8gYmUgdXNlZCBvbiB0aGUgZmxhZyBmaWVsZCBvZiB0aGUgaW5zdHJ1Y3Rpb24gdGFibGUgKi8KKyAgZmlsdGVyICpmbGFnc19maWx0ZXI7CisKKyAgLyogU2VlIGFib3ZlIGZvciB3YXJuIG9wdGlvbnMgKi8KKyAgaWdlbl93YXJuX29wdGlvbnMgd2FybjsKKworICAvKiBCZSBtb3JlIHBpY2t5IGFib3V0IHRoZSBpbnB1dCAqLworICBlcnJvcl9mdW5jICgqd2FybmluZyk7CisKKyAgLyogTW9kZWwgKHByb2Nlc3Nvcikgc2V0IC0gbGlrZSBmbGFnc19maWx0ZXIuIFVzZWQgdG8gc2VsZWN0IHRoZQorICAgICBzcGVjaWZpYyBJU0Egd2l0aGluIGEgcHJvY2Vzc29yIGZhbWlseS4gKi8KKyAgZmlsdGVyICptb2RlbF9maWx0ZXI7CisKKyAgLyogRm9ybWF0IG5hbWUgc2V0ICovCisgIGZpbHRlciAqZm9ybWF0X25hbWVfZmlsdGVyOworfTsKKworZXh0ZXJuIGlnZW5fb3B0aW9ucyBvcHRpb25zOworCisvKiBkZWZhdWx0IG9wdGlvbnMgLSBob3BlZnVsbHkgYmFja3dhcmQgY29tcGF0aWJsZSAqLyBcCisjZGVmaW5lIElOSVRfT1BUSU9OUygpIFwKK2RvIHsgXAorICBtZW1zZXQgKCZvcHRpb25zLCAwLCBzaXplb2Ygb3B0aW9ucyk7IFwKKyAgbWVtc2V0ICgmb3B0aW9ucy53YXJuLCAtMSwgc2l6ZW9mIChvcHRpb25zLndhcm4pKTsgXAorICBvcHRpb25zLmhpX2JpdF9uciA9IDA7IFwKKyAgb3B0aW9ucy5pbnNuX2JpdF9zaXplID0gZGVmYXVsdF9pbnNuX2JpdF9zaXplOyBcCisgIG9wdGlvbnMuaW5zbl9zcGVjaWZ5aW5nX3dpZHRocyA9IDA7IFwKKyAgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC51ID0gIiI7IFwKKyAgb3B0aW9ucy5tb2R1bGUuZ2xvYmFsLnByZWZpeC5sID0gIiI7IFwKKyAgLyogdGhlIHByZWZpeGVzICovIFwKKyAgb3B0aW9ucy5tb2R1bGUuZW5naW5lID0gb3B0aW9ucy5tb2R1bGUuZ2xvYmFsOyBcCisgIG9wdGlvbnMubW9kdWxlLmljYWNoZSA9IG9wdGlvbnMubW9kdWxlLmdsb2JhbDsgXAorICBvcHRpb25zLm1vZHVsZS5pZGVjb2RlID0gb3B0aW9ucy5tb2R1bGUuZ2xvYmFsOyBcCisgIG9wdGlvbnMubW9kdWxlLml0YWJsZSA9IG9wdGlvbnMubW9kdWxlLmdsb2JhbDsgXAorICBvcHRpb25zLm1vZHVsZS5zZW1hbnRpY3MgPSBvcHRpb25zLm1vZHVsZS5nbG9iYWw7IFwKKyAgb3B0aW9ucy5tb2R1bGUuc3VwcG9ydCA9IG9wdGlvbnMubW9kdWxlLmdsb2JhbDsgXAorICAvKiB0aGUgc3VmZml4ZXMgKi8gXAorICBvcHRpb25zLm1vZHVsZS5lbmdpbmUuc3VmZml4LmwgPSAiZW5naW5lIjsgXAorICBvcHRpb25zLm1vZHVsZS5lbmdpbmUuc3VmZml4LnUgPSAiRU5HSU5FIjsgXAorICBvcHRpb25zLm1vZHVsZS5pY2FjaGUuc3VmZml4LmwgPSAiaWNhY2hlIjsgXAorICBvcHRpb25zLm1vZHVsZS5pY2FjaGUuc3VmZml4LnUgPSAiSUNBQ0hFIjsgXAorICBvcHRpb25zLm1vZHVsZS5pZGVjb2RlLnN1ZmZpeC5sID0gImlkZWNvZGUiOyBcCisgIG9wdGlvbnMubW9kdWxlLmlkZWNvZGUuc3VmZml4LnUgPSAiSURFQ09ERSI7IFwKKyAgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnN1ZmZpeC5sID0gIml0YWJsZSI7IFwKKyAgb3B0aW9ucy5tb2R1bGUuaXRhYmxlLnN1ZmZpeC51ID0gIklUQUJMRSI7IFwKKyAgb3B0aW9ucy5tb2R1bGUuc2VtYW50aWNzLnN1ZmZpeC5sID0gInNlbWFudGljcyI7IFwKKyAgb3B0aW9ucy5tb2R1bGUuc2VtYW50aWNzLnN1ZmZpeC51ID0gIlNFTUFOVElDUyI7IFwKKyAgb3B0aW9ucy5tb2R1bGUuc3VwcG9ydC5zdWZmaXgubCA9ICJzdXBwb3J0IjsgXAorICBvcHRpb25zLm1vZHVsZS5zdXBwb3J0LnN1ZmZpeC51ID0gIlNVUFBPUlQiOyBcCisgIC8qIG1pc2Mgc3R1ZmYgKi8gXAorICBvcHRpb25zLmdlbi5jb2RlID0gZ2VuZXJhdGVfY2FsbHM7IFwKKyAgb3B0aW9ucy5nZW4uaWNhY2hlX3NpemUgPSAxMDI0OyBcCisgIG9wdGlvbnMud2FybmluZyA9IHdhcm5pbmc7IFwKK30gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9zaW0vaWdlbi9sZC1jYWNoZS5jIGIvc2ltL2lnZW4vbGQtY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2JkMTExCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2lnZW4vbGQtY2FjaGUuYwpAQCAtMCwwICsxLDExNCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQsMTk5NSwxOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgImxmLmgiCisjaW5jbHVkZSAidGFibGUuaCIKKyNpbmNsdWRlICJmaWx0ZXIuaCIKKyNpbmNsdWRlICJpZ2VuLmgiCisKKyNpbmNsdWRlICJsZC1pbnNuLmgiCisjaW5jbHVkZSAibGQtY2FjaGUuaCIKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgMAorI2VuZGlmCisKKworZW51bSB7CisgIGNhX3R5cGUsCisgIGNhX2ZpZWxkX25hbWUsCisgIGNhX2Rlcml2ZWRfbmFtZSwKKyAgY2FfdHlwZV9kZWYsCisgIGNhX2V4cHJlc3Npb24sCisgIG5yX2NhY2hlX3J1bGVfZmllbGRzLAorfTsKKworc3RhdGljIGNvbnN0IG5hbWVfbWFwIGNhY2hlX3R5cGVfbWFwW10gPSB7CisgIHsgImNhY2hlIiwgY2FjaGVfdmFsdWUgfSwKKyAgeyAiY29tcHV0ZSIsIGNvbXB1dGVfdmFsdWUgfSwKKyAgeyAic2NyYXRjaCIsIHNjcmF0Y2hfdmFsdWUgfSwKKyAgeyBOVUxMLCAwIH0sCit9OworCisKK2NhY2hlX2VudHJ5ICoKK2xvYWRfY2FjaGVfdGFibGUgKGNoYXIgKmZpbGVfbmFtZSkKK3sKKyAgY2FjaGVfZW50cnkgKmNhY2hlID0gTlVMTDsKKyAgY2FjaGVfZW50cnkgKipsYXN0ID0gJmNhY2hlOworICB0YWJsZSAqZmlsZSA9IHRhYmxlX29wZW4gKGZpbGVfbmFtZSk7CisgIHRhYmxlX2VudHJ5ICplbnRyeTsKKyAgd2hpbGUgKChlbnRyeSA9IHRhYmxlX3JlYWQgKGZpbGUpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNhY2hlX2VudHJ5ICpuZXdfcnVsZSA9IFpBTExPQyAoY2FjaGVfZW50cnkpOworICAgICAgbmV3X3J1bGUtPmxpbmUgPSBlbnRyeS0+bGluZTsKKyAgICAgIG5ld19ydWxlLT5lbnRyeV90eXBlID0gbmFtZTJpIChlbnRyeS0+ZmllbGRbY2FfdHlwZV0sIGNhY2hlX3R5cGVfbWFwKTsKKyAgICAgIG5ld19ydWxlLT5uYW1lID0gZW50cnktPmZpZWxkW2NhX2Rlcml2ZWRfbmFtZV07CisgICAgICBmaWx0ZXJfcGFyc2UgKCZuZXdfcnVsZS0+b3JpZ2luYWxfZmllbGRzLAorCQkgICAgZW50cnktPmZpZWxkW2NhX2ZpZWxkX25hbWVdKTsKKyAgICAgIG5ld19ydWxlLT50eXBlID0gZW50cnktPmZpZWxkW2NhX3R5cGVfZGVmXTsKKyAgICAgIC8qIGV4cHJlc3Npb24gaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHJlbWFpbmluZyBmaWVsZHMgKi8KKyAgICAgIGlmIChlbnRyeS0+bnJfZmllbGRzID4gY2FfZXhwcmVzc2lvbikKKwl7CisJICBpbnQgbGVuID0gMDsKKwkgIGludCBjaGk7CisJICBmb3IgKGNoaSA9IGNhX2V4cHJlc3Npb247IGNoaSA8IGVudHJ5LT5ucl9maWVsZHM7IGNoaSsrKQorCSAgICB7CisJICAgICAgbGVuICs9IHN0cmxlbiAoIiA6ICIpICsgc3RybGVuIChlbnRyeS0+ZmllbGRbY2hpXSk7CisJICAgIH0KKwkgIG5ld19ydWxlLT5leHByZXNzaW9uID0gTlpBTExPQyAoY2hhciwgbGVuKTsKKwkgIHN0cmNweSAobmV3X3J1bGUtPmV4cHJlc3Npb24sIGVudHJ5LT5maWVsZFtjYV9leHByZXNzaW9uXSk7CisJICBmb3IgKGNoaSA9IGNhX2V4cHJlc3Npb24gKyAxOyBjaGkgPCBlbnRyeS0+bnJfZmllbGRzOyBjaGkrKykKKwkgICAgeworCSAgICAgIHN0cmNhdCAobmV3X3J1bGUtPmV4cHJlc3Npb24sICIgOiAiKTsKKwkgICAgICBzdHJjYXQgKG5ld19ydWxlLT5leHByZXNzaW9uLCBlbnRyeS0+ZmllbGRbY2hpXSk7CisJICAgIH0KKwl9CisgICAgICAvKiBpbnNlcnQgaXQgKi8KKyAgICAgICpsYXN0ID0gbmV3X3J1bGU7CisgICAgICBsYXN0ID0gJm5ld19ydWxlLT5uZXh0OworICAgIH0KKyAgcmV0dXJuIGNhY2hlOworfQorCisKKworI2lmZGVmIE1BSU4KKworaWdlbl9vcHRpb25zIG9wdGlvbnM7CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGNhY2hlX2VudHJ5ICpydWxlcyA9IE5VTEw7CisgIGxmICpsOworCisgIGlmIChhcmdjICE9IDIpCisgICAgZXJyb3IgKE5VTEwsICJVc2FnZTogY2FjaGUgPGNhY2hlLWZpbGU+XG4iKTsKKworICBydWxlcyA9IGxvYWRfY2FjaGVfdGFibGUgKGFyZ3ZbMV0pOworICBsID0gbGZfb3BlbiAoIi0iLCAic3Rkb3V0IiwgbGZfb21pdF9yZWZlcmVuY2VzLCBsZl9pc190ZXh0LCAidG1wLWxkLWluc24iKTsKKyAgZHVtcF9jYWNoZV9lbnRyaWVzIChsLCAiKCIsIHJ1bGVzLCAiKVxuIik7CisKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2xkLWNhY2hlLmggYi9zaW0vaWdlbi9sZC1jYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiODFlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaWdlbi9sZC1jYWNoZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LDE5OTUsMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworCisvKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5IC0gbG9hZCBhIHN0YW5kYWxvbmUgY2FjaGUgbWFjcm8gdGFibGUgKi8KKworLyogSW5zdHJ1Y3Rpb24gdW5wYWNraW5nOgorCisgICBPbmNlIHRoZSBpbnN0cnVjdGlvbiBoYXMgYmVlbiBkZWNvZGVkLCB0aGUgcmVnaXN0ZXIgKGFuZCBvdGhlcikKKyAgIGZpZWxkcyB3aXRoaW4gdGhlIGluc3RydWN0aW9uIG5lZWQgdG8gYmUgZXh0cmFjdGVkLgorCisgICBUaGUgdGFibGUgdGhhdCBmb2xsb3dzIGRldGVybWluZXMgaG93IGVhY2ggZmllbGQgc2hvdWxkIGJlIHRyZWF0ZWQuCisgICBJbXBvcnRhbnRseSBpdCBjb25zaWRlcnMgdGhlIGNhc2Ugd2hlcmUgdGhlIGV4dHJhY3RlZCBmaWVsZCBpcyB0bworICAgYmUgdXNlZCBpbW1lZGlhdGx5IG9yIHN0b3JlZCBpbiBhbiBpbnN0cnVjdGlvbiBjYWNoZS4KKworICAgPHR5cGU+CisKKyAgIEluZGljYXRlcyB3aGF0IHRvIGRvIHdpdGggdGhlIGNhY2hlIGVudHJ5LiAgSWYgYSBjYWNoZSBpcyB0byBiZQorICAgdXNlZC4gIFNDUkFUQ0ggYW5kIENBQ0hFIHZhbHVlcyBhcmUgZGVmaW5lZCB3aGVuIGEgY2FjaGUgZW50cnkgaXMKKyAgIGJlaW5nIGZpbGxlZCB3aGlsZSBDQUNIRSBhbmQgQ09NUFVURSB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gdGhlCisgICBzZW1hbnRpYyBjb2RlLgorCisgICBaZXJvIG1hcmtzIHRoZSBlbmQgb2YgdGhlIHRhYmxlLiAgTW9yZSBpbXBvcnRhbnRseSAxLiBpbmRpY2F0ZXMKKyAgIHRoYXQgdGhlIGVudHJ5IGlzIHZhbGlkIGFuZCBjYW4gYmUgY2FjaGVkLiAyLiBpbmRpY2F0ZXMgdGhhdCB0aGF0CisgICB0aGUgZW50cnkgaXMgdmFsaWQgYnV0IGNhbiBub3QgYmUgY2FjaGVkLgorCisgICA8ZmllbGRfbmFtZT4KKworICAgVGhlIGZpZWxkIG5hbWUgYXMgZ2l2ZW4gaW4gdGhlIGluc3RydWN0aW9uIHNwZWMuCisKKyAgIDxkZXJpdmVkX25hbWU+CisKKyAgIEEgbmV3IG5hbWUgZm9yIDxmaWVsZF9uYW1lPiBvbmNlIGl0IGhhcyBiZWVuIGV4dHJhY3RlZCBmcm9tIHRoZQorICAgaW5zdHJ1Y3Rpb24gKGFuZCBwb3NzaWJseSBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uIGNhY2hlKS4KKworICAgPHR5cGU+CisKKyAgIFN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzdG9yYWdlIHR5cGUgZm9yIDxuZXdfbmFtZT4gKHRoZSBleHRyYWN0ZWQKKyAgIGZpZWxkPi4KKworICAgPGV4cHJlc3Npb24+CisKKyAgIFNwZWNpZmllcyBob3cgdG8gZ2V0IDxuZXdfbmFtZT4gZnJvbSA8b2xkX25hbWU+LiAgSWYgbnVsbCwgb2xkIGFuZAorICAgbmV3IG5hbWUgaGFkIGJldHRlciBiZSB0aGUgc2FtZS4gKi8KKworCitleHRlcm4gY2FjaGVfZW50cnkgKmxvYWRfY2FjaGVfdGFibGUKKyhjaGFyICpmaWxlX25hbWUpOwpkaWZmIC0tZ2l0IGEvc2ltL2lnZW4vbGQtZGVjb2RlLmMgYi9zaW0vaWdlbi9sZC1kZWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWVhNDA0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2lnZW4vbGQtZGVjb2RlLmMKQEAgLTAsMCArMSw0MDQgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LDE5OTUsMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKy8qIGxvYWQgdGhlIG9wY29kZSBzdGF0IHN0cnVjdHVyZSAqLworCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgImxmLmgiCisjaW5jbHVkZSAidGFibGUuaCIKKyNpbmNsdWRlICJmaWx0ZXIuaCIKKworI2luY2x1ZGUgImlnZW4uaCIKKworI2luY2x1ZGUgImxkLWRlY29kZS5oIgorCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAwCisjZW5kaWYKKworCitzdGF0aWMgY29uc3QgbmFtZV9tYXAgZGVjb2RlX3R5cGVfbWFwW10gPSB7CisgIHsgIm5vcm1hbCIsIG5vcm1hbF9kZWNvZGVfcnVsZSB9LAorICB7ICJib29sZWFuIiwgYm9vbGVhbl9ydWxlIH0sCisgIHsgTlVMTCwgbm9ybWFsX2RlY29kZV9ydWxlIH0sCit9OworCitzdGF0aWMgY29uc3QgbmFtZV9tYXAgZGVjb2RlX2dlbl9tYXBbXSA9IHsKKyAgeyAiYXJyYXkiLCBhcnJheV9nZW4gfSwKKyAgeyAic3dpdGNoIiwgc3dpdGNoX2dlbiB9LAorICB7ICJwYWRkZWQtc3dpdGNoIiwgcGFkZGVkX3N3aXRjaF9nZW4gfSwKKyAgeyAiZ290by1zd2l0Y2giLCBnb3RvX3N3aXRjaF9nZW4gfSwKKyAgeyBOVUxMLCAtMSB9LAorfTsKKworc3RhdGljIGNvbnN0IG5hbWVfbWFwIGRlY29kZV9yZXNlcnZlZF9tYXBbXSA9IHsKKyAgeyAiemVyby1yZXNlcnZlZCIsIDEgfSwKKyAgeyBOVUxMLCAwIH0sCit9OworCitzdGF0aWMgY29uc3QgbmFtZV9tYXAgZGVjb2RlX2R1cGxpY2F0ZXNfbWFwW10gPSB7CisgIHsgImR1cGxpY2F0ZSIsIDEgfSwKKyAgeyBOVUxMLCAwIH0sCit9OworCitzdGF0aWMgY29uc3QgbmFtZV9tYXAgZGVjb2RlX2NvbWJpbmVfbWFwW10gPSB7CisgIHsgImNvbWJpbmUiLCAxIH0sCisgIHsgTlVMTCwgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IG5hbWVfbWFwIGRlY29kZV9zZWFyY2hfbWFwW10gPSB7CisgIHsgImNvbnN0YW50cyIsIGRlY29kZV9maW5kX2NvbnN0YW50cyB9LAorICB7ICJtaXhlZCIsIGRlY29kZV9maW5kX21peGVkIH0sCisgIHsgInN0cmluZ3MiLCBkZWNvZGVfZmluZF9zdHJpbmdzIH0sCisgIHsgTlVMTCwgZGVjb2RlX2ZpbmRfbWl4ZWQgfSwKK307CisKKworc3RhdGljIHZvaWQKK3NldF9iaXRzIChpbnQgYml0W21heF9pbnNuX2JpdF9zaXplXSwKKwkgIHVuc2lnbmVkNjQgdmFsdWUpCit7CisgIGludCBiaXRfbnI7CisgIGZvciAoYml0X25yID0gMDsgYml0X25yIDwgbWF4X2luc25fYml0X3NpemU7IGJpdF9ucisrKQorICAgIHsKKyAgICAgIGlmIChiaXRfbnIgPCBvcHRpb25zLmluc25fYml0X3NpemUpCisJYml0W2JpdF9ucl0gPSAodmFsdWUgPj4gKG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSAtIGJpdF9uciAtIDEpKSAmIDE7CisgICAgICBlbHNlCisJYml0W2JpdF9ucl0gPSAwOworICAgIH0KK30KKworZGVjb2RlX3RhYmxlICoKK2xvYWRfZGVjb2RlX3RhYmxlKGNoYXIgKmZpbGVfbmFtZSkKK3sKKyAgdGFibGUgKmZpbGUgPSB0YWJsZV9vcGVuIChmaWxlX25hbWUpOworICB0YWJsZV9lbnRyeSAqZW50cnk7CisgIGRlY29kZV90YWJsZSAqdGFibGUgPSBOVUxMOworICBkZWNvZGVfdGFibGUgKipjdXJyX3J1bGUgPSAmdGFibGU7CisgIHdoaWxlICgoZW50cnkgPSB0YWJsZV9yZWFkIChmaWxlKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICBjaGFyICpkZWNvZGVfb3B0aW9ucyA9IGVudHJ5LT5maWVsZFtkZWNvZGVfb3B0aW9uc19maWVsZF07CisgICAgICBkZWNvZGVfdGFibGUgKm5ld19ydWxlID0gWkFMTE9DIChkZWNvZGVfdGFibGUpOworICAgICAgaWYgKGVudHJ5LT5ucl9maWVsZHMgPCBtaW5fbnJfZGVjb2RlX2ZpZWxkcykKKwllcnJvciAoZW50cnktPmxpbmUsICJNaXNzaW5nIGRlY29kZSB0YWJsZSBmaWVsZHNcbiIpOworICAgICAgbmV3X3J1bGUtPmxpbmUgPSBlbnRyeS0+bGluZTsKKworICAgICAgLyogdGhlIG9wdGlvbnMgZmllbGQgKi8KKyAgICAgIG5ld19ydWxlLT50eXBlID0gbmFtZTJpIChkZWNvZGVfb3B0aW9ucywgZGVjb2RlX3R5cGVfbWFwKTsKKyAgICAgIGlmIChvcHRpb25zLmRlY29kZS5vdmVycmlkaW5nX2dlbiAhPSBOVUxMKQorCW5ld19ydWxlLT5nZW4gPSBuYW1lMmkgKG9wdGlvbnMuZGVjb2RlLm92ZXJyaWRpbmdfZ2VuLCBkZWNvZGVfZ2VuX21hcCk7CisgICAgICBlbHNlCisJbmV3X3J1bGUtPmdlbiA9IG5hbWUyaSAoZGVjb2RlX29wdGlvbnMsIGRlY29kZV9nZW5fbWFwKTsKKyAgICAgIGlmIChuZXdfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuCisJICAmJiBvcHRpb25zLmRlY29kZS5zd2l0Y2hfYXNfZ290bykKKwluZXdfcnVsZS0+Z2VuID0gZ290b19zd2l0Y2hfZ2VuOworICAgICAgaWYgKG9wdGlvbnMuZGVjb2RlLnplcm9fcmVzZXJ2ZWQpCisJbmV3X3J1bGUtPndpdGhfemVyb19yZXNlcnZlZCA9IDE7CisgICAgICBlbHNlCisJbmV3X3J1bGUtPndpdGhfemVyb19yZXNlcnZlZCA9IG5hbWUyaSAoZGVjb2RlX29wdGlvbnMsIGRlY29kZV9yZXNlcnZlZF9tYXApOworICAgICAgaWYgKG9wdGlvbnMuZGVjb2RlLmR1cGxpY2F0ZSkKKwluZXdfcnVsZS0+d2l0aF9kdXBsaWNhdGVzID0gMTsKKyAgICAgIGVsc2UKKwluZXdfcnVsZS0+d2l0aF9kdXBsaWNhdGVzID0gbmFtZTJpIChkZWNvZGVfb3B0aW9ucywgZGVjb2RlX2R1cGxpY2F0ZXNfbWFwKTsKKyAgICAgIGlmIChvcHRpb25zLmRlY29kZS5jb21iaW5lKQorCW5ld19ydWxlLT53aXRoX2NvbWJpbmUgPSAxOworICAgICAgZWxzZQorCW5ld19ydWxlLT53aXRoX2NvbWJpbmUgPSBuYW1lMmkgKGRlY29kZV9vcHRpb25zLCBkZWNvZGVfY29tYmluZV9tYXApOworICAgICAgaWYgKG5ld19ydWxlLT50eXBlID09IGJvb2xlYW5fcnVsZSkKKwl7CisJICBjaGFyICpjaHAgPSBkZWNvZGVfb3B0aW9uczsKKwkgIHdoaWxlICgqY2hwICE9ICdcMCcpCisJICAgIHsKKwkgICAgICBpZiAoaXNkaWdpdCAoKmNocCkpCisJCXsKKwkJICBuZXdfcnVsZS0+Y29uc3RhbnQgPSBhMmkgKGNocCk7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBjaHAgPSBza2lwX3RvX3NlcGFyYXRvciAoY2hwLCAiLCIpOworCSAgICAgIGNocCA9IHNraXBfc3BhY2VzIChjaHApOworCSAgICB9CisJfQorCisgICAgICAvKiBGaXJzdCBhbmQgbGFzdCAqLworICAgICAgaWYgKGVudHJ5LT5ucl9maWVsZHMgPiBkZWNvZGVfZmlyc3RfZmllbGQKKwkgICYmIHN0cmxlbiAoZW50cnktPmZpZWxkW2RlY29kZV9maXJzdF9maWVsZF0pID4gMCkKKwl7CisJICBuZXdfcnVsZS0+Zmlyc3QgPSB0YXJnZXRfYTJpIChvcHRpb25zLmhpX2JpdF9uciwKKwkJCQkJZW50cnktPmZpZWxkW2RlY29kZV9maXJzdF9maWVsZF0pOworCSAgaWYgKG5ld19ydWxlLT5maXJzdCA8IDAgfHwgbmV3X3J1bGUtPmZpcnN0ID49IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSkKKwkgICAgZXJyb3IgKG5ld19ydWxlLT5saW5lLCAiRmlyc3QgZmllbGQgb3V0IG9mIHJhbmdlXG4iKTsKKwl9CisgICAgICBlbHNlCisJbmV3X3J1bGUtPmZpcnN0ID0gMDsKKyAgICAgIGlmIChlbnRyeS0+bnJfZmllbGRzID4gZGVjb2RlX2xhc3RfZmllbGQKKwkgICYmIHN0cmxlbiAoZW50cnktPmZpZWxkW2RlY29kZV9sYXN0X2ZpZWxkXSkgPiAwKQorCXsKKwkgIG5ld19ydWxlLT5sYXN0ID0gdGFyZ2V0X2EyaSAob3B0aW9ucy5oaV9iaXRfbnIsCisJCQkJICAgICAgIGVudHJ5LT5maWVsZFtkZWNvZGVfbGFzdF9maWVsZF0pOworCSAgaWYgKG5ld19ydWxlLT5sYXN0IDwgMCB8fCBuZXdfcnVsZS0+bGFzdCA+PSBvcHRpb25zLmluc25fYml0X3NpemUpCisJICAgIGVycm9yIChuZXdfcnVsZS0+bGluZSwgIkxhc3QgZmllbGQgb3V0IG9mIHJhbmdlXG4iKTsKKwl9CisgICAgICBlbHNlCisJbmV3X3J1bGUtPmxhc3QgPSBvcHRpb25zLmluc25fYml0X3NpemUgLSAxOworICAgICAgaWYgKG5ld19ydWxlLT5maXJzdCA+IG5ld19ydWxlLT5sYXN0KQorCWVycm9yIChuZXdfcnVsZS0+bGluZSwgIkZpcnN0IG11c3QgcHJlY2VlZCBsYXN0XG4iKTsKKworICAgICAgLyogZm9yY2UgZmlyc3QvbGFzdCwgd2l0aCBkZWZhdWx0IHZhbHVlcyBiYXNlZCBvbiBmaXJzdC9sYXN0ICovCisgICAgICBpZiAoZW50cnktPm5yX2ZpZWxkcyA+IGRlY29kZV9mb3JjZV9maXJzdF9maWVsZAorCSAgJiYgc3RybGVuIChlbnRyeS0+ZmllbGRbZGVjb2RlX2ZvcmNlX2ZpcnN0X2ZpZWxkXSkgPiAwKQorCXsKKwkgIG5ld19ydWxlLT5mb3JjZV9maXJzdCA9IHRhcmdldF9hMmkgKG9wdGlvbnMuaGlfYml0X25yLAorCQkJCQkgICAgICBlbnRyeS0+ZmllbGRbZGVjb2RlX2ZvcmNlX2ZpcnN0X2ZpZWxkXSk7CisJICBpZiAobmV3X3J1bGUtPmZvcmNlX2ZpcnN0IDwgbmV3X3J1bGUtPmZpcnN0CisJICAgICAgfHwgbmV3X3J1bGUtPmZvcmNlX2ZpcnN0ID4gbmV3X3J1bGUtPmxhc3QgKyAxKQorCSAgICBlcnJvciAobmV3X3J1bGUtPmxpbmUsICJGb3JjZSBmaXJzdCBvdXQgb2YgcmFuZ2VcbiIpOworCX0KKyAgICAgIGVsc2UKKwluZXdfcnVsZS0+Zm9yY2VfZmlyc3QgPSBuZXdfcnVsZS0+bGFzdCArIDE7CisgICAgICBpZiAoZW50cnktPm5yX2ZpZWxkcyA+IGRlY29kZV9mb3JjZV9sYXN0X2ZpZWxkCisJICAmJiBzdHJsZW4gKGVudHJ5LT5maWVsZFtkZWNvZGVfZm9yY2VfbGFzdF9maWVsZF0pID4gMCkKKwl7CisJICBuZXdfcnVsZS0+Zm9yY2VfbGFzdCA9IHRhcmdldF9hMmkgKG9wdGlvbnMuaGlfYml0X25yLAorCQkJCQkgICAgIGVudHJ5LT5maWVsZFtkZWNvZGVfZm9yY2VfbGFzdF9maWVsZF0pOworCSAgaWYgKG5ld19ydWxlLT5mb3JjZV9sYXN0ID4gbmV3X3J1bGUtPmxhc3QKKwkgICAgICB8fCBuZXdfcnVsZS0+Zm9yY2VfbGFzdCA8IG5ld19ydWxlLT5maXJzdCAtIDEpCisJICAgIGVycm9yIChuZXdfcnVsZS0+bGluZSwgIkZvcmNlLWxhc3Qgb3V0IG9mIHJhbmdlXG4iKTsKKwl9CisgICAgICBlbHNlCisJbmV3X3J1bGUtPmZvcmNlX2xhc3QgPSBuZXdfcnVsZS0+Zmlyc3QgLSAxOworCisgICAgICAvKiBmaWVsZHMgdG8gYmUgdHJlYXRlZCBhcyBjb25zdGFudCAqLworICAgICAgaWYgKGVudHJ5LT5ucl9maWVsZHMgPiBkZWNvZGVfY29uc3RhbnRfZmllbGRfbmFtZXNfZmllbGQpCisJZmlsdGVyX3BhcnNlICgmbmV3X3J1bGUtPmNvbnN0YW50X2ZpZWxkX25hbWVzLAorCQkgICAgICBlbnRyeS0+ZmllbGRbZGVjb2RlX2NvbnN0YW50X2ZpZWxkX25hbWVzX2ZpZWxkXSk7CisKKyAgICAgIC8qIGFwcGxpY2FibGUgd29yZCBuciAqLworICAgICAgaWYgKGVudHJ5LT5ucl9maWVsZHMgPiBkZWNvZGVfd29yZF9ucl9maWVsZCkKKwluZXdfcnVsZS0+d29yZF9uciA9IGEyaSAoZW50cnktPmZpZWxkW2RlY29kZV93b3JkX25yX2ZpZWxkXSk7CisKKyAgICAgIC8qIHJlcXVpcmVkIGluc3RydWN0aW9uIGZvcm1hdCBuYW1lcyAqLworICAgICAgaWYgKGVudHJ5LT5ucl9maWVsZHMgPiBkZWNvZGVfZm9ybWF0X25hbWVzX2ZpZWxkKQorCWZpbHRlcl9wYXJzZSAoJm5ld19ydWxlLT5mb3JtYXRfbmFtZXMsCisJCSAgICAgIGVudHJ5LT5maWVsZFtkZWNvZGVfZm9ybWF0X25hbWVzX2ZpZWxkXSk7CisKKyAgICAgIC8qIHJlcXVpcmVkIHByb2Nlc3NvciBtb2RlbHMgKi8KKyAgICAgIGlmIChlbnRyeS0+bnJfZmllbGRzID4gZGVjb2RlX21vZGVsX25hbWVzX2ZpZWxkKQorCWZpbHRlcl9wYXJzZSAoJm5ld19ydWxlLT5tb2RlbF9uYW1lcywKKwkJICAgICAgZW50cnktPmZpZWxkW2RlY29kZV9tb2RlbF9uYW1lc19maWVsZF0pOworCisgICAgICAvKiByZXF1aXJlZCBwYXRocyAqLworICAgICAgaWYgKGVudHJ5LT5ucl9maWVsZHMgPiBkZWNvZGVfcGF0aHNfZmllbGQKKwkgICYmIHN0cmxlbiAoZW50cnktPmZpZWxkW2RlY29kZV9wYXRoc19maWVsZF0pID4gMCkKKwl7CisJICBkZWNvZGVfcGF0aF9saXN0ICoqbGFzdCA9ICZuZXdfcnVsZS0+cGF0aHM7CisJICBjaGFyICpjaHAgPSBlbnRyeS0+ZmllbGRbZGVjb2RlX3BhdGhzX2ZpZWxkXTsKKwkgIGRvCisJICAgIHsKKwkgICAgICAoKmxhc3QpID0gWkFMTE9DIChkZWNvZGVfcGF0aF9saXN0KTsKKwkgICAgICAvKiBleHRyYSByb290L3plcm8gZW50cnkgKi8KKwkgICAgICAoKmxhc3QpLT5wYXRoID0gWkFMTE9DIChkZWNvZGVfcGF0aCk7IAorCSAgICAgIGRvCisJCXsKKwkJICBkZWNvZGVfcGF0aCAqZW50cnkgPSBaQUxMT0MgKGRlY29kZV9wYXRoKTsKKwkJICBlbnRyeS0+b3Bjb2RlX25yID0gYTJpIChjaHApOworCQkgIGVudHJ5LT5wYXJlbnQgPSAoKmxhc3QpLT5wYXRoOworCQkgICgqbGFzdCktPnBhdGggPSBlbnRyeTsKKwkJICBjaHAgPSBza2lwX2RpZ2l0cyAoY2hwKTsKKwkJICBjaHAgPSBza2lwX3NwYWNlcyAoY2hwKTsKKwkJfQorCSAgICAgIHdoaWxlICgqY2hwID09ICcuJyk7CisJICAgICAgbGFzdCA9ICYoKmxhc3QpLT5uZXh0OworCSAgICB9CisJICB3aGlsZSAoKmNocCA9PSAnLCcpOworCSAgaWYgKCpjaHAgIT0gJ1wwJykKKwkgICAgZXJyb3IgKGVudHJ5LT5saW5lLCAiSW52YWxpZCBwYXRoIGZpZWxkXG4iKTsKKwl9CisKKyAgICAgIC8qIGNvbGxlY3QgdXAgdGhlIGxpc3Qgb2Ygb3B0aW9uYWwgc3BlY2lhbCBjb25kaXRpb25zIGFwcGxpY2FibGUKKyAgICAgICAgIHRvIHRoZSBydWxlICovCisgICAgICB7CisJaW50IGZpZWxkX25yID0gbnJfZGVjb2RlX2ZpZWxkczsKKwl3aGlsZSAoZW50cnktPm5yX2ZpZWxkcyA+IGZpZWxkX25yKQorCSAgeworCSAgICBkZWNvZGVfY29uZCAqY29uZCA9IFpBTExPQyAoZGVjb2RlX2NvbmQpOworCSAgICBkZWNvZGVfY29uZCAqKmxhc3Q7CisJICAgIGlmIChlbnRyeS0+bnJfZmllbGRzID4gZmllbGRfbnIgKyBkZWNvZGVfY29uZF9tYXNrX2ZpZWxkKQorCSAgICAgIHNldF9iaXRzIChjb25kLT5tYXNrLCBhMmkgKGVudHJ5LT5maWVsZFtmaWVsZF9uciArIGRlY29kZV9jb25kX21hc2tfZmllbGRdKSk7CisJICAgIGlmIChlbnRyeS0+bnJfZmllbGRzID4gZmllbGRfbnIgKyBkZWNvZGVfY29uZF92YWx1ZV9maWVsZCkKKyAgICAgICAgICAgICAgeworCSAgICAgIGlmIChlbnRyeS0+ZmllbGRbZmllbGRfbnIgKyBkZWNvZGVfY29uZF92YWx1ZV9maWVsZF1bMF0gPT0gJyEnKQorCQl7CisJCSAgY29uZC0+aXNfZXF1YWwgPSAwOworCQkgIHNldF9iaXRzIChjb25kLT52YWx1ZSwgYTJpIChlbnRyeS0+ZmllbGRbZmllbGRfbnIgKyBkZWNvZGVfY29uZF92YWx1ZV9maWVsZF0gKyAxKSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBjb25kLT5pc19lcXVhbCA9IDE7CisJCSAgc2V0X2JpdHMgKGNvbmQtPnZhbHVlLCBhMmkgKGVudHJ5LT5maWVsZFtmaWVsZF9uciArIGRlY29kZV9jb25kX3ZhbHVlX2ZpZWxkXSkpOworCQl9CisgICAgICAgICAgICAgIH0KKwkgICAgaWYgKGVudHJ5LT5ucl9maWVsZHMgPiBmaWVsZF9uciArIGRlY29kZV9jb25kX3dvcmRfbnJfZmllbGQpCisJICAgICAgY29uZC0+d29yZF9uciA9IGEyaSAoZW50cnktPmZpZWxkW2ZpZWxkX25yICsgZGVjb2RlX2NvbmRfd29yZF9ucl9maWVsZF0pOworCSAgICBmaWVsZF9uciArPSBucl9kZWNvZGVfY29uZF9maWVsZHM7CisJICAgIC8qIGluc2VydCBpdCAqLworCSAgICBsYXN0ID0gJm5ld19ydWxlLT5jb25kaXRpb25zOworCSAgICB3aGlsZSAoKmxhc3QgIT0gTlVMTCkKKwkgICAgICBsYXN0ID0gJigqbGFzdCktPm5leHQ7CisJICAgICpsYXN0ID0gY29uZDsKKwkgIH0KKyAgICAgIH0KKyAgICAgICpjdXJyX3J1bGUgPSBuZXdfcnVsZTsKKyAgICAgIGN1cnJfcnVsZSA9ICZuZXdfcnVsZS0+bmV4dDsKKyAgICB9CisgIHJldHVybiB0YWJsZTsKK30KKworICAKK2ludAorZGVjb2RlX3RhYmxlX21heF93b3JkX25yIChkZWNvZGVfdGFibGUgKmVudHJ5KQoreworICBpbnQgbWF4X3dvcmRfbnIgPSAwOworICB3aGlsZSAoZW50cnkgIT0gTlVMTCkKKyAgICB7CisgICAgICBkZWNvZGVfY29uZCAqY29uZDsKKyAgICAgIGlmIChlbnRyeS0+d29yZF9uciA+IG1heF93b3JkX25yKQorCW1heF93b3JkX25yID0gZW50cnktPndvcmRfbnI7CisgICAgICBmb3IgKGNvbmQgPSBlbnRyeS0+Y29uZGl0aW9uczsgY29uZCAhPSBOVUxMOyBjb25kID0gY29uZC0+bmV4dCkKKwl7CisJICBpZiAoY29uZC0+d29yZF9uciA+IG1heF93b3JkX25yKQorCSAgICBtYXhfd29yZF9uciA9IGNvbmQtPndvcmRfbnI7CisJfQorICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKKyAgICB9CisgIHJldHVybiBtYXhfd29yZF9ucjsKK30KKworCisKK3N0YXRpYyB2b2lkCitkdW1wX2RlY29kZV9jb25kIChsZiAqZmlsZSwKKwkJICBjaGFyICpwcmVmaXgsCisJCSAgZGVjb2RlX2NvbmQgKmNvbmQsCisJCSAgY2hhciAqc3VmZml4KQoreworICBsZl9wcmludGYgKGZpbGUsICIlcyhkZWNvZGVfY29uZCAqKSAweCVseCIsIHByZWZpeCwgKGxvbmcpIGNvbmQpOworICBpZiAoY29uZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4od29yZF9uciAlZCkiLCBjb25kLT53b3JkX25yKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG1hc2sgMHglbHgpIiwgKGxvbmcpIGNvbmQtPm1hc2spOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4odmFsdWUgMHglbHgpIiwgKGxvbmcpIGNvbmQtPnZhbHVlKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGlzX2VxdWFsIDB4JWx4KSIsIChsb25nKSBjb25kLT5pc19lcXVhbCk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbihuZXh0IChkZWNvZGVfY29uZCAqKSAwJWx4KSIsIChsb25nKSBjb25kLT5uZXh0KTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOworICAgIH0KKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOworfQorCisKK3N0YXRpYyB2b2lkCitkdW1wX2RlY29kZV9jb25kcyAobGYgKmZpbGUsCisJCSAgIGNoYXIgKnByZWZpeCwKKwkJICAgZGVjb2RlX2NvbmQgKmNvbmQsCisJCSAgIGNoYXIgKnN1ZmZpeCkKK3sKKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMoZGVjb2RlX2NvbmQgKikgMHglbHgiLCBwcmVmaXgsIChsb25nKSBjb25kKTsKKyAgd2hpbGUgKGNvbmQgIT0gTlVMTCkKKyAgICB7CisgICAgICBkdW1wX2RlY29kZV9jb25kIChmaWxlLCAiXG4oIiwgY29uZCwgIikiKTsKKyAgICAgIGNvbmQgPSBjb25kLT5uZXh0OworICAgIH0KKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOworfQorCisKK3ZvaWQKK2R1bXBfZGVjb2RlX3J1bGUgKGxmICpmaWxlLAorCQkgIGNoYXIgKnByZWZpeCwKKwkJICBkZWNvZGVfdGFibGUgKnJ1bGUsCisJCSAgY2hhciAqc3VmZml4KQoreworICBsZl9wcmludGYgKGZpbGUsICIlcyhkZWNvZGVfdGFibGUgKikgMHglbHgiLCBwcmVmaXgsIChsb25nKSBydWxlKTsKKyAgaWYgKHJ1bGUgIT0gTlVMTCkKKyAgICB7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgICAgIGR1bXBfbGluZV9yZWYgKGZpbGUsICJcbihsaW5lICIsIHJ1bGUtPmxpbmUsICIpIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbih0eXBlICVzKSIsIGkybmFtZShydWxlLT50eXBlLCBkZWNvZGVfdHlwZV9tYXApKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGdlbiAlcykiLCBpMm5hbWUocnVsZS0+Z2VuLCBkZWNvZGVfZ2VuX21hcCkpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oZmlyc3QgJWQpIiwgcnVsZS0+Zmlyc3QpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obGFzdCAlZCkiLCBydWxlLT5sYXN0KTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGZvcmNlX2ZpcnN0ICVkKSIsIHJ1bGUtPmZvcmNlX2ZpcnN0KTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGZvcmNlX2xhc3QgJWQpIiwgcnVsZS0+Zm9yY2VfbGFzdCk7CisgICAgICBkdW1wX2ZpbHRlciAoZmlsZSwgIlxuKGNvbnN0YW50X2ZpZWxkX25hbWVzIFwiIiwgcnVsZS0+Y29uc3RhbnRfZmllbGRfbmFtZXMsICJcIikiKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGNvbnN0YW50IDB4JXgpIiwgcnVsZS0+Y29uc3RhbnQpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4od29yZF9uciAlZCkiLCBydWxlLT53b3JkX25yKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKHdpdGhfemVyb19yZXNlcnZlZCAlZCkiLCBydWxlLT53aXRoX3plcm9fcmVzZXJ2ZWQpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4od2l0aF9kdXBsaWNhdGVzICVkKSIsIHJ1bGUtPndpdGhfZHVwbGljYXRlcyk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbih3aXRoX2NvbWJpbmUgJWQpIiwgcnVsZS0+d2l0aF9jb21iaW5lKTsKKyAgICAgIGR1bXBfZmlsdGVyIChmaWxlLCAiXG4oZm9ybWF0X25hbWVzIFwiIiwgcnVsZS0+Zm9ybWF0X25hbWVzLCAiXCIpIik7CisgICAgICBkdW1wX2ZpbHRlciAoZmlsZSwgIlxuKG1vZGVsX25hbWVzIFwiIiwgcnVsZS0+bW9kZWxfbmFtZXMsICJcIikiKTsKKyAgICAgIGR1bXBfZGVjb2RlX2NvbmRzIChmaWxlLCAiXG4oY29uZGl0aW9ucyAiLCBydWxlLT5jb25kaXRpb25zLCAiKSIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obmV4dCAweCVseCkiLCAobG9uZykgcnVsZS0+bmV4dCk7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKKyAgICB9CisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKK30KKworCisjaWZkZWYgTUFJTgorCitzdGF0aWMgdm9pZAorZHVtcF9kZWNvZGVfcnVsZXMgKGxmICpmaWxlLAorCQkgICBjaGFyICpwcmVmaXgsCisJCSAgIGRlY29kZV90YWJsZSAqcnVsZSwKKwkJICAgY2hhciAqc3VmZml4KQoreworICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHByZWZpeCk7CisgIHdoaWxlIChydWxlICE9IE5VTEwpCisgICAgeworICAgICAgbGZfaW5kZW50IChmaWxlLCArMSk7CisgICAgICBkdW1wX2RlY29kZV9ydWxlIChmaWxlLCAiXG4oIiwgcnVsZSwgIikiKTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOworICAgICAgcnVsZSA9IHJ1bGUtPm5leHQ7CisgICAgfQorICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Cit9CisKK2lnZW5fb3B0aW9ucyBvcHRpb25zOworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBsZiAqbDsKKyAgZGVjb2RlX3RhYmxlICpydWxlczsKKworICBJTklUX09QVElPTlMgKG9wdGlvbnMpOworCisgIGlmIChhcmdjICE9IDMpCisgICAgZXJyb3IgKE5VTEwsICJVc2FnZTogZGVjb2RlIDxkZWNvZGUtZmlsZT4gPGhpLWJpdC1ucj5cbiIpOworCisgIG9wdGlvbnMuaGlfYml0X25yID0gYTJpIChhcmd2WzJdKTsKKyAgcnVsZXMgPSBsb2FkX2RlY29kZV90YWJsZSAoYXJndlsxXSk7CisgIGwgPSBsZl9vcGVuICgiLSIsICJzdGRvdXQiLCBsZl9vbWl0X3JlZmVyZW5jZXMsIGxmX2lzX3RleHQsICJ0bXAtbGQtaW5zbiIpOworICBkdW1wX2RlY29kZV9ydWxlcyAobCwgIihydWxlcyAiLCBydWxlcywgIilcbiIpOworCisgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vaWdlbi9sZC1kZWNvZGUuaCBiL3NpbS9pZ2VuL2xkLWRlY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNGEyMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaWdlbi9sZC1kZWNvZGUuaApAQCAtMCwwICsxLDIzNSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQsMTk5NSwxOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworLyogSW5zdHJ1Y3Rpb24gZGVjb2RlIHRhYmxlOgorCisgICA8ZGVjb2RlLXJ1bGU+IDo6PQorICAgICAgIHsgPG9wdGlvbj4gfQorICAgICAgICI6IiBbIDxmaXJzdD4gXQorICAgICAgICI6IiBbIDxsYXN0PiBdCisgICAgICAgIjoiIFsgPGZvcmNlLWZpcnN0PiBdCisgICAgICAgIjoiIFsgPGZvcmNlLWxhc3Q+IF0KKyAgICAgICAiOiIgWyA8Y29uc3RhbnQtZmllbGQtbmFtZXM+IF0KKyAgICAgICAiOiIgWyA8d29yZC1ucj4gXQorICAgICAgICI6IiBbIDxmb3JtYXQtbmFtZXM+IF0KKyAgICAgICAiOiIgWyA8bW9kZWwtbmFtZXM+IF0KKyAgICAgICAiOiIgWyA8Y29uc3RhbnQ+IF0KKyAgICAgICAiOiIgWyA8cGF0aD4geyAiLCIgPHBhdGg+IH0gXQorICAgICAgIHsgIjoiIDxzcGVjaWFsLW1hc2s+CisgICAgICAgICAiOiIgWyAiISIgXSA8c3BlY2lhbC12YWx1ZT4KKyAgICAgICAgICI6IiA8d29yZC1ucj4gfQorICAgICAgIDxubD4KKyAgICAgICA7CisKKworICAgPHBhdGg+IDo6PSA8aW50PiAiLCIgPGludD4gOzsKKworICAgPG9wdGlvbj4gOjo9CisgICAgICAgPHJlc2VydmVkLW9wdGlvbnM+CisgICAgICAgfCA8Y29kZS1vcHRpb25zPgorICAgICAgIHwgPG9wdGltaXplLW9wdGlvbnM+CisgICAgICAgfCA8ZGVjb2RlLW9wdGlvbnM+CisgICAgICAgfCA8Y29uc3RhbnQ+CisgICAgICAgfCA8c2VhcmNoLW9wdGlvbnM+CisgICAgICAgOworCisgICA8cmVzZXJ2ZWQtb3B0aW9ucz4gOjo9ICJ6ZXJvLXJlc2VydmVkIiA7CisgICA8Z2VuLW9wdGlvbnM+IDo6PSAiYXJyYXkiIHwgInN3aXRjaCIgfCAicGFkZGVkLXN3aXRjaCIgfCAiZ290by1zd2l0Y2giIDsKKyAgIDxvcHRpbWl6ZS1vcHRpb25zPiA6Oj0gImR1cGxpY2F0ZSIgfCAiY29tYmluZSIKKyAgIDxkZWNvZGUtb3B0aW9ucz4gOjo9ICJub3JtYWwiIHwgImJvb2xlYW4iIDsKKyAgIDxzZWFyY2gtb3B0aW9ucz4gOjo9ICJjb25zdGFudHMiIHwgInZhcmlhYmxlcyIgfCAibWl4ZWQiCisKKyAgIElnbm9yZSB0aGUgYmVsb3c6CisKKworICAgVGhlIGluc3RydWN0aW9uIGRlY29kZSB0YWJsZSBjb250YWlucyBydWxlcyB0aGF0IGRpY3RhdGUgaG93IGlnZW4KKyAgIGlzIGdvaW5nIHRvIGZpcnN0bHkgYnJlYWsgZG93biB0aGUgb3Bjb2RlIHRhYmxlIGFuZCBzZWNvbmRseQorCisgICBUaGUgdGFibGUgdGhhdCBmb2xsb3dzIGlzIHVzZWQgYnkgZ2VuIHRvIGNvbnN0cnVjdCBhIGRlY2lzaW9uIHRyZWUKKyAgIHRoYXQgY2FuIGlkZW50aWZ5IGVhY2ggcG9zc2libGUgaW5zdHJ1Y3Rpb24uICBHZW4gdGhlbiBvdXRwdXRzIHRoaXMKKyAgIGRlY2lzaW9uIHRyZWUgYXMgKGFjY29yZGluZyB0byBjb25maWcpIGEgdGFibGUgb3Igc3dpdGNoIHN0YXRlbWVudAorICAgYXMgdGhlIGZ1bmN0aW9uIGlkZWNvZGUuCisKKyAgIEluIHBhcmFsbGVsIHRvIHRoaXMsIGFzIG1lbnRpb25lZCBhYm92ZSwgV0lUSF9FWFBBTkRFRF9TRU1BTlRJQ1MKKyAgIGRldGVybWluZXMgb2YgdGhlIHNlbWFudGljIGZ1bmN0aW9ucyB0aGVtc2VsdmVzIHNob3VsZCBiZSBleHBhbmRlZAorICAgaW4gYSBzaW1pbGFyIHdheS4KKworICAgPGZpcnN0PgorICAgPGxhc3Q+CisKKyAgIFJhbmdlIG9mIGJpdHMgKHdpdGhpbiB0aGUgaW5zdHJ1Y3Rpb24pIHRoYXQgc2hvdWxkIGJlIHNlYXJjaGVkIGZvcgorICAgYW4gaW5zdHJ1Y3Rpb24gZmllbGQuICBXaXRoaW4gc3VjaCByYW5nZXMsIGdlbiBsb29rcyBmb3Igb3Bjb2RlcworICAgKGNvbnN0YW50cyksIHJlZ2lzdGVycyAoc3RyaW5ncykgYW5kIHJlc2VydmVkIGJpdHMgKHNsYXNoKSBhbmQKKyAgIGFjY29yZGluZyB0byB0aGUgcnVsZXMgdGhhdCBmb2xsb3dzIGluY2x1ZGVzIG9yIGV4Y2x1ZGVzIHRoZW0gZnJvbQorICAgYSBwb3NzaWJsZSBpbnN0cnVjdGlvbiBmaWVsZC4KKworICAgPGZvcmNlX2ZpcnN0PgorICAgPGZvcmNlX2xhc3Q+CisKKyAgIElmIGFuIGluc3RydWN0aW9uIGZpZWxkIHdhcyBmb3VuZCwgZW5sYXJnZSB0aGUgZmllbGQgc2l6ZSBzbyB0aGF0CisgICBpdCBpcyBmb3JjZWQgdG8gYXQgbGVhc3QgaW5jbHVkZSBiaXRzIHN0YXJ0aW5nIGZyb20gPGZvcmNlX2ZpcnN0PgorICAgKDxmb3JjZV9sYXN0PikuICBUbyBzdG9wIHRoaXMgb2NjdXJpbmcsIHVzZSA8Zm9yY2VfZmlyc3Q+ID0gPGxhc3Q+CisgICArIDEgYW5kIDxmb3JjZV9sYXN0PiA9IDxmaXJzdD4gLSAxLgorCisgICA8Zm9yY2VfcmVzZXJ2ZWQ+CisKKyAgIFRyZWF0IGAvJyAocmVzZXJ2ZWQpIGZpZWxkcyBhcyBhIGNvbnN0YW50ICh6ZXJvKSBpbnN0ZWFkIG9mCisgICB2YXJpYWJsZSB3aGVuIGxvb2tpbmcgZm9yIGFuIGluc3RydWN0aW9uIGZpZWxkLgorCisgICA8Zm9yY2VfZXhwYW5zaW9uPgorCisgICBUcmVhdCBhbnkgY29udGFpbmVkIHJlZ2lzdGVyIChzdHJpbmcpIGZpZWxkcyBhcyBjb25zdGFudCB3aGVuCisgICBkZXRlcm1pbmluZyB0aGUgaW5zdHJ1Y3Rpb24gZmllbGQuICBGb3IgdGhlIGluc3RydWN0aW9uIGRlY29kZSAoYW5kCisgICBjb250cm9sZWQgYnkgSURFQ09ERV9FWFBBTkRfU0VNQU5USUNTKSB0aGlzIGZvcmNlcyB0aGUgZXhwYW5zaW9uIG9mCisgICB3aGF0IHdvdWxkIG90aGVyd2l6ZSBiZSBub24gY29uc3RhbnQgYml0cyBvZiBhbiBpbnN0cnVjdGlvbi4KKworICAgPHVzZV9zd2l0Y2g+CisKKyAgIFNob3VsZCB0aGlzIHRhYmxlIGJlIGV4cGFuZGVkIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCAodmFsIDEpIGFuZAorICAgaWYgc28sIHNob3VsZCBpdCBiZSBwYWRkZWQgd2l0aCBlbnRyaWVzIHNvIGFzIHRvIGZvcmNlIHRoZSBjb21waWxlcgorICAgdG8gZ2VuZXJhdGUgYSBqdW1wIHRhYmxlICh2YWwgMikuIE9yIGEgYnJhbmNoIHRhYmxlICh2YWwgMykuCisKKyAgIDxzcGVjaWFsX21hc2s+CisgICA8c3BlY2lhbF92YWx1ZT4KKyAgIDxzcGVjaWFsX3J1bGU+CisgICA8c3BlY2lhbF9jb25zdGFudD4KKworICAgU3BlY2lhbCBydWxlIHRvIGZpbmUgdHVuZSBob3cgc3BlY2lmaWMgKG9yIGdyb3Vwcykgb2YgaW5zdHJ1Y3Rpb25zCisgICBhcmUgZXhwYW5kZWQuICBUaGUgYXBwbGljYWJpbGl0eSBvZiB0aGUgcnVsZSBpcyBkZXRlcm1pbmVkIGJ5CisKKyAgICAgPHNwZWNpYWxfbWFzaz4gIT0gMCAmJiAoaW5zdHJ1Y3Rpb24+ICYgPHNwZWNpYWxfbWFzaz4pID09IDxzcGVjaWFsX3ZhbHVlPgorCisgICBXaGVyZSA8aW5zdHJ1Y3Rpb24+IGlzIG9idGFpbmVkIGJ5IGxvb2tpbmcgb25seSBhdCBjb25zdGFudCBmaWVsZHMKKyAgIHdpdGggaW4gYW4gaW5zdHJ1Y3Rpb25zIHNwZWMuICBXaGVuIGRldGVybWluaW5nIGFuIGV4cGFuc2lvbiwgdGhlCisgICBydWxlIGlzIG9ubHkgY29uc2lkZXJlZCB3aGVuIGEgbm9kZSBjb250YWlucyBhIHNpbmdsZSBpbnN0cnVjdGlvbi4KKyAgIDxzcGVjaWFsX3J1bGU+IGNhbiBiZSBhbnkgb2Y6CisKKyAgICAgICAgMDogZm9yIHRoaXMgaW5zdHJ1Y3Rpb24sIGV4cGFuZCBieSBlYXJsaWVyIHJ1bGVzCisgICAJMTogZXhwYW5kIGJpdHMgPGZvcmNlX2xvdz4gLi4gPGZvcmNlX2hpPiBvbmx5CisJMjogYm9vbGVhbiBleHBhbnNpb24gb2Ygb25seSB6ZXJvL25vbi16ZXJvIGNhc2VzCisJMzogYm9vbGVhbiBleHBhbnNpb24gb2YgZXF1YWxpdHkgb2Ygc3BlY2lhbCBjb25zdGFudAorCisJKi8KKworCit0eXBlZGVmIGVudW0geworICBub3JtYWxfZGVjb2RlX3J1bGUsCisgIGJvb2xlYW5fcnVsZSwKK30gZGVjb2RlX3NwZWNpYWxfdHlwZTsKKworCit0eXBlZGVmIGVudW0geworICBpbnZhbGlkX2dlbiwKKyAgYXJyYXlfZ2VuLAorICBzd2l0Y2hfZ2VuLAorICBwYWRkZWRfc3dpdGNoX2dlbiwKKyAgZ290b19zd2l0Y2hfZ2VuLAorfSBkZWNvZGVfZ2VuX3R5cGU7CisKKworZW51bSB7CisgIGRlY29kZV9jb25kX21hc2tfZmllbGQsCisgIGRlY29kZV9jb25kX3ZhbHVlX2ZpZWxkLAorICBkZWNvZGVfY29uZF93b3JkX25yX2ZpZWxkLAorICBucl9kZWNvZGVfY29uZF9maWVsZHMsCit9OworCit0eXBlZGVmIHN0cnVjdCBfZGVjb2RlX3BhdGggZGVjb2RlX3BhdGg7CitzdHJ1Y3QgX2RlY29kZV9wYXRoIHsKKyAgaW50IG9wY29kZV9ucjsKKyAgZGVjb2RlX3BhdGggKnBhcmVudDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9kZWNvZGVfcGF0aF9saXN0IGRlY29kZV9wYXRoX2xpc3Q7CitzdHJ1Y3QgX2RlY29kZV9wYXRoX2xpc3QgeworICBkZWNvZGVfcGF0aCAqcGF0aDsKKyAgZGVjb2RlX3BhdGhfbGlzdCAqbmV4dDsKK307CisKKwordHlwZWRlZiBzdHJ1Y3QgX2RlY29kZV9jb25kIGRlY29kZV9jb25kOworc3RydWN0IF9kZWNvZGVfY29uZCB7CisgIGludCB3b3JkX25yOworICBpbnQgbWFza1ttYXhfaW5zbl9iaXRfc2l6ZV07CisgIGludCB2YWx1ZVttYXhfaW5zbl9iaXRfc2l6ZV07CisgIGludCBpc19lcXVhbDsKKyAgZGVjb2RlX2NvbmQgKm5leHQ7Cit9OworCit0eXBlZGVmIGVudW0geworICBkZWNvZGVfZmluZF9taXhlZCwKKyAgZGVjb2RlX2ZpbmRfY29uc3RhbnRzLAorICBkZWNvZGVfZmluZF9zdHJpbmdzLAorfSBkZWNvZGVfc2VhcmNoX3R5cGU7CisKK2VudW0geworICBkZWNvZGVfb3B0aW9uc19maWVsZCwKKyAgZGVjb2RlX2ZpcnN0X2ZpZWxkLAorICBkZWNvZGVfbGFzdF9maWVsZCwKKyAgZGVjb2RlX2ZvcmNlX2ZpcnN0X2ZpZWxkLAorICBkZWNvZGVfZm9yY2VfbGFzdF9maWVsZCwKKyAgZGVjb2RlX2NvbnN0YW50X2ZpZWxkX25hbWVzX2ZpZWxkLAorICBkZWNvZGVfd29yZF9ucl9maWVsZCwKKyAgZGVjb2RlX2Zvcm1hdF9uYW1lc19maWVsZCwKKyAgZGVjb2RlX21vZGVsX25hbWVzX2ZpZWxkLAorICBkZWNvZGVfcGF0aHNfZmllbGQsCisgIG5yX2RlY29kZV9maWVsZHMsCisgIG1pbl9ucl9kZWNvZGVfZmllbGRzID0gZGVjb2RlX2xhc3RfZmllbGQgKyAxLAorfTsKKworCit0eXBlZGVmIHN0cnVjdCBfZGVjb2RlX3RhYmxlIGRlY29kZV90YWJsZTsKK3N0cnVjdCBfZGVjb2RlX3RhYmxlIHsKKyAgbGluZV9yZWYgKmxpbmU7CisgIGRlY29kZV9zcGVjaWFsX3R5cGUgdHlwZTsKKyAgZGVjb2RlX2dlbl90eXBlIGdlbjsKKyAgZGVjb2RlX3NlYXJjaF90eXBlIHNlYXJjaDsKKyAgaW50IGZpcnN0OworICBpbnQgbGFzdDsKKyAgaW50IGZvcmNlX2ZpcnN0OworICBpbnQgZm9yY2VfbGFzdDsKKyAgZmlsdGVyICpjb25zdGFudF9maWVsZF9uYW1lczsKKyAgaW50IHdvcmRfbnI7CisgIC8qIGlmIGEgYm9vbGVhbiAqLworICB1bnNpZ25lZCBjb25zdGFudDsKKyAgLyogb3B0aW9ucyAqLworICBpbnQgd2l0aF96ZXJvX3Jlc2VydmVkOworICBpbnQgd2l0aF9kdXBsaWNhdGVzOworICBpbnQgd2l0aF9jb21iaW5lOworICAvKiBjb25kaXRpb25zIG9uIHRoZSBydWxlIGJlaW5nIGFwcGxpZWQgKi8KKyAgZGVjb2RlX3BhdGhfbGlzdCAqcGF0aHM7CisgIGZpbHRlciAqZm9ybWF0X25hbWVzOworICBmaWx0ZXIgKm1vZGVsX25hbWVzOworICBkZWNvZGVfY29uZCAqY29uZGl0aW9uczsKKyAgZGVjb2RlX3RhYmxlICpuZXh0OworfTsKKworCitleHRlcm4gZGVjb2RlX3RhYmxlICpsb2FkX2RlY29kZV90YWJsZQorKGNoYXIgKmZpbGVfbmFtZSk7CisKK2V4dGVybiBpbnQgZGVjb2RlX3RhYmxlX21heF93b3JkX25yCisoZGVjb2RlX3RhYmxlICpydWxlKTsKKworZXh0ZXJuIHZvaWQgZHVtcF9kZWNvZGVfcnVsZQorKGxmICpmaWxlLAorIGNoYXIgKnByZWZpeCwKKyBkZWNvZGVfdGFibGUgKnJ1bGUsCisgY2hhciAqc3VmZml4KTsKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2xkLWluc24uYyBiL3NpbS9pZ2VuL2xkLWluc24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODEyMTk5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL2lnZW4vbGQtaW5zbi5jCkBAIC0wLDAgKzEsMTgyOSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJsZi5oIgorI2luY2x1ZGUgInRhYmxlLmgiCisjaW5jbHVkZSAiZmlsdGVyLmgiCisjaW5jbHVkZSAiaWdlbi5oIgorI2luY2x1ZGUgImxkLWluc24uaCIKKworc3RhdGljIGluc25fd29yZF9lbnRyeSAqCitwYXJzZV9pbnNuX3dvcmQgKGxpbmVfcmVmICpsaW5lLAorCQkgY2hhciAqc3RyaW5nLAorCQkgaW50IHdvcmRfbnIpCit7CisgIGNoYXIgKmNocDsKKyAgaW5zbl93b3JkX2VudHJ5ICp3b3JkID0gWkFMTE9DIChpbnNuX3dvcmRfZW50cnkpOworCisgIC8qIGNyZWF0ZSBhIGxlYWRpbmcgc2VudGluYWwgKi8KKyAgd29yZC0+Zmlyc3QgPSBaQUxMT0MgKGluc25fZmllbGRfZW50cnkpOworICB3b3JkLT5maXJzdC0+Zmlyc3QgPSAtMTsKKyAgd29yZC0+Zmlyc3QtPmxhc3QgPSAtMTsKKyAgd29yZC0+Zmlyc3QtPndpZHRoID0gMDsKKworICAvKiBhbmQgYSB0cmFpbGluZyBzZW50aW5hbCAqLworICB3b3JkLT5sYXN0ID0gWkFMTE9DIChpbnNuX2ZpZWxkX2VudHJ5KTsKKyAgd29yZC0+bGFzdC0+Zmlyc3QgPSBvcHRpb25zLmluc25fYml0X3NpemU7CisgIHdvcmQtPmxhc3QtPmxhc3QgPSBvcHRpb25zLmluc25fYml0X3NpemU7CisgIHdvcmQtPmxhc3QtPndpZHRoID0gMDsKKworICAvKiBsaW5rIHRoZW0gdG9nZXRoZXIgKi8KKyAgd29yZC0+Zmlyc3QtPm5leHQgPSB3b3JkLT5sYXN0OworICB3b3JkLT5sYXN0LT5wcmV2ID0gd29yZC0+Zmlyc3Q7CisKKyAgLyogbm93IHdvcmsgdGhyb3VnaCB0aGUgZm9ybWF0cyAqLworICBjaHAgPSBza2lwX3NwYWNlcyAoc3RyaW5nKTsKKworICB3aGlsZSAoKmNocCAhPSAnXDAnKSB7CisgICAgY2hhciAqc3RhcnRfcG9zOworICAgIGludCBzdHJsZW5fcG9zOworICAgIGNoYXIgKnN0YXJ0X3ZhbDsKKyAgICBpbnQgc3RybGVuX3ZhbDsKKyAgICBpbnNuX2ZpZWxkX2VudHJ5ICpuZXdfZmllbGQ7CisKKyAgICAvKiBjcmVhdGUgLyBsaW5rIGluIHRoZSBuZXcgZmllbGQgKi8KKyAgICBuZXdfZmllbGQgPSBaQUxMT0MgKGluc25fZmllbGRfZW50cnkpOworICAgIG5ld19maWVsZC0+bmV4dCA9IHdvcmQtPmxhc3Q7CisgICAgbmV3X2ZpZWxkLT5wcmV2ID0gd29yZC0+bGFzdC0+cHJldjsKKyAgICBuZXdfZmllbGQtPm5leHQtPnByZXYgPSBuZXdfZmllbGQ7CisgICAgbmV3X2ZpZWxkLT5wcmV2LT5uZXh0ID0gbmV3X2ZpZWxkOworICAgIG5ld19maWVsZC0+d29yZF9uciA9IHdvcmRfbnI7CisKKyAgICAvKiBicmVhayBvdXQgdGhlIGZpcnN0IGZpZWxkIChpZiBwcmVzZW50KSAqLworICAgIHN0YXJ0X3BvcyA9IGNocDsKKyAgICBjaHAgPSBza2lwX3RvX3NlcGFyYXRvciAoY2hwLCAiLiwhIik7CisgICAgc3RybGVuX3BvcyA9IGJhY2tfc3BhY2VzIChzdGFydF9wb3MsIGNocCkgLSBzdGFydF9wb3M7CisKKyAgICAvKiBicmVhayBvdXQgdGhlIHNlY29uZCBmaWVsZCAoaWYgcHJlc2VudCkgKi8KKyAgICBpZiAoKmNocCAhPSAnLicpCisgICAgICB7CisJLyogYXNzdW1lIHdoYXQgd2FzIHNwZWNpZmllZCB3YXMgdGhlIHZhbHVlIChhbmQgbm90IHRoZSBzdGFydAorICAgICAgICAgICBwb3NpdGlvbikuICBBc3N1bWUgdGhlIHZhbHVlIGxlbmd0aCBpbXBsaWNpdGx5IHNwZWNpZmllcworICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJpdHMgKi8KKwlzdGFydF92YWwgPSBzdGFydF9wb3M7CisJc3RybGVuX3ZhbCA9IHN0cmxlbl9wb3M7CisJc3RhcnRfcG9zID0gIiI7CisJc3RybGVuX3BvcyA9IDA7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCWNocCsrOyAvKiBza2lwIGAuJyAqLworCWNocCA9IHNraXBfc3BhY2VzIChjaHApOworCXN0YXJ0X3ZhbCA9IGNocDsKKwlpZiAoKmNocCA9PSAnLycgfHwgKmNocCA9PSAnKicpCisJICB7CisJICAgIGRvCisJICAgICAgeworCQljaHArKzsKKwkgICAgICB9CisJICAgIHdoaWxlICgqY2hwID09ICcvJyB8fCAqY2hwID09ICcqJyk7CisJICB9CisJZWxzZSBpZiAoaXNhbHBoYSgqc3RhcnRfdmFsKSkKKwkgIHsKKwkgICAgZG8KKwkgICAgICB7CisJCWNocCsrOworCSAgICAgIH0KKwkgICAgd2hpbGUgKGlzYWxudW0oKmNocCkgfHwgKmNocCA9PSAnXycpOworCSAgfQorCWVsc2UgaWYgKGlzZGlnaXQoKnN0YXJ0X3ZhbCkpCisJICB7CisJICAgIGRvIHsKKwkgICAgICBjaHArKzsKKwkgICAgfQorCSAgICB3aGlsZSAoaXNhbG51bSgqY2hwKSk7CisJICB9CisJc3RybGVuX3ZhbCA9IGNocCAtIHN0YXJ0X3ZhbDsKKwljaHAgPSBza2lwX3NwYWNlcyAoY2hwKTsKKyAgICAgIH0KKyAgICBpZiAoc3RybGVuX3ZhbCA9PSAwKQorICAgICAgZXJyb3IgKGxpbmUsICJFbXB0eSB2YWx1ZSBmaWVsZFxuIik7CisgICAgCisgICAgLyogYnJlYWsgb3V0IGFueSBjb25kaXRpb25hbCBmaWVsZHMgLSB7IFsgIiEiIHwgIj0iIFsgPHZhbHVlPiB8IDxmaWVsZC1uYW1lPiB9ICovCisgICAgd2hpbGUgKCpjaHAgPT0gJyEnIHx8ICpjaHAgPT0gJz0nKQorICAgICAgeworCWNoYXIgKnN0YXJ0OworCWNoYXIgKmVuZDsKKwlpbnQgbGVuOworCWluc25fZmllbGRfY29uZCAqbmV3X2NvbmQgPSBaQUxMT0MgKGluc25fZmllbGRfY29uZCk7CisJCisJLyogZGV0ZXJtaW5lIHRoZSBjb25kaXRpb25hbCB0ZXN0ICovCisJc3dpdGNoICgqY2hwKQorCSAgeworCSAgY2FzZSAnPSc6CisJICAgIG5ld19jb25kLT50ZXN0ID0gaW5zbl9maWVsZF9jb25kX2VxOworCSAgICBicmVhazsKKwkgIGNhc2UgJyEnOgorCSAgICBuZXdfY29uZC0+dGVzdCA9IGluc25fZmllbGRfY29uZF9uZTsKKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICBBU1NFUlQgKDApOworCSAgfQorCSAgCisJLyogc2F2ZSB0aGUgdmFsdWUgKi8KKwljaHArKzsgCisJY2hwID0gc2tpcF9zcGFjZXMgKGNocCk7CisJc3RhcnQgPSBjaHA7CisJY2hwID0gc2tpcF90b19zZXBhcmF0b3IgKGNocCwgIissOiE9Iik7CisJZW5kID0gYmFja19zcGFjZXMgKHN0YXJ0LCBjaHApOworCWxlbiA9IGVuZCAtIHN0YXJ0OworCWlmIChsZW4gPT0gMCkKKwkgIGVycm9yIChsaW5lLCAiTWlzc2luZyBvciBpbnZhbGlkIGNvbmRpdGlvbmFsIHZhbHVlXG4iKTsKKwluZXdfY29uZC0+c3RyaW5nID0gTlpBTExPQyAoY2hhciwgbGVuICsgMSk7CisJc3RybmNweSAobmV3X2NvbmQtPnN0cmluZywgc3RhcnQsIGxlbik7CisKKwkvKiBkZXRlcm1pbmUgdGhlIGNvbmRpdGlvbmFsIHR5cGUgKi8KKwlpZiAoaXNkaWdpdCAoKnN0YXJ0KSkKKwkgIHsKKwkgICAgLyogWyAiISIgfCAiPSIgXSA8dmFsdWU+ICovCisJICAgIG5ld19jb25kLT50eXBlID0gaW5zbl9maWVsZF9jb25kX3ZhbHVlOworCSAgICBuZXdfY29uZC0+dmFsdWUgPSBhMmkgKG5ld19jb25kLT5zdHJpbmcpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgLyogWyAiISIgfCAiPSIgXSA8ZmllbGQ+ICAtIGNoZWNrIGZpZWxkIHZhbGlkICovCisJICAgIG5ld19jb25kLT50eXBlID0gaW5zbl9maWVsZF9jb25kX2ZpZWxkOworCSAgICAvKiBuZXdfY29uZC0+ZmllbGQgaXMgZGV0ZXJtaW5lZCBpbiBsYXRlciAqLworCSAgfQorCSAgCisJLyogT25seSBhIHNpbmdsZSBgPScgaXMgcGVybWl0dGVkLiAqLworCWlmICgobmV3X2NvbmQtPnRlc3QgPT0gaW5zbl9maWVsZF9jb25kX2VxCisJICAgICAmJiBuZXdfZmllbGQtPmNvbmRpdGlvbnMgIT0gTlVMTCkKKwkgICAgfHwgKG5ld19maWVsZC0+Y29uZGl0aW9ucyAhPSBOVUxMCisJCSYmIG5ld19maWVsZC0+Y29uZGl0aW9ucy0+dGVzdCA9PSBpbnNuX2ZpZWxkX2NvbmRfZXEpKQorCSAgZXJyb3IgKGxpbmUsICJPbmx5IHNpbmdsZSBjb25kaXRpb25hbCB3aGVuIGA9JyBhbGxvd2VkXG4iKTsKKworCS8qIGluc2VydCBpdCAqLworCXsKKwkgIGluc25fZmllbGRfY29uZCAqKmxhc3QgPSAmbmV3X2ZpZWxkLT5jb25kaXRpb25zOworCSAgd2hpbGUgKCpsYXN0ICE9IE5VTEwpCisJICAgIGxhc3QgPSAmKCpsYXN0KS0+bmV4dDsKKwkgICpsYXN0ID0gbmV3X2NvbmQ7CisJfQorICAgICAgfQorCisgICAgLyogTk9XIHZlcmlmeSB0aGF0IHRoZSBmaWVsZCB3YXMgZmluaXNoZWQgKi8KKyAgICBpZiAoKmNocCA9PSAnLCcpCisgICAgICB7CisJY2hwID0gc2tpcF9zcGFjZXMgKGNocCArIDEpOworCWlmICgqY2hwID09ICdcMCcpCisJICBlcnJvciAobGluZSwgImVtcHR5IGZpZWxkXG4iKTsKKyAgICAgIH0KKyAgICBlbHNlIGlmICgqY2hwICE9ICdcMCcpCisgICAgICB7CisJZXJyb3IgKGxpbmUsICJNaXNzaW5nIGZpZWxkIHNlcGFyYXRvclxuIik7CisgICAgICB9CisKKyAgICAvKiBjb3B5IHRoZSB2YWx1ZSAqLworICAgIG5ld19maWVsZC0+dmFsX3N0cmluZyA9IE5aQUxMT0MgKGNoYXIsIHN0cmxlbl92YWwrMSk7CisgICAgc3RybmNweSAobmV3X2ZpZWxkLT52YWxfc3RyaW5nLCBzdGFydF92YWwsIHN0cmxlbl92YWwpOworICAgIGlmIChpc2RpZ2l0IChuZXdfZmllbGQtPnZhbF9zdHJpbmdbMF0pKQorICAgICAgeworCWlmIChzdHJsZW5fcG9zID09IDApCisJICB7CisJICAgIC8qIHdoZW4gdGhlIGxlbmd0aC9wb3MgZmllbGQgaXMgb21pdGVkLCBhbiBpbnRlZ2VyIGZpZWxkCisgICAgICAgICAgICAgICBpcyBhbHdheXMgYmluYXJ5ICovCisJICAgIHVuc2lnbmVkNjQgdmFsID0gMDsKKwkgICAgaW50IGk7CisJICAgIGZvciAoaSA9IDA7IGkgPCBzdHJsZW5fdmFsOyBpKyspCisJICAgICAgeworCQlpZiAobmV3X2ZpZWxkLT52YWxfc3RyaW5nW2ldICE9ICcwJworCQkgICAgJiYgbmV3X2ZpZWxkLT52YWxfc3RyaW5nW2ldICE9ICcxJykKKwkJICBlcnJvciAobGluZSwgImludmFsaWQgYmluYXJ5IGZpZWxkICVzXG4iLAorCQkJIG5ld19maWVsZC0+dmFsX3N0cmluZyk7CisJCXZhbCA9ICh2YWwgPDwgMSkgKyAobmV3X2ZpZWxkLT52YWxfc3RyaW5nW2ldID09ICcxJyk7CisJICAgICAgfQorCSAgICBuZXdfZmllbGQtPnZhbF9pbnQgPSB2YWw7CisJICAgIG5ld19maWVsZC0+dHlwZSA9IGluc25fZmllbGRfaW50OworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgbmV3X2ZpZWxkLT52YWxfaW50ID0gYTJpIChuZXdfZmllbGQtPnZhbF9zdHJpbmcpOworCSAgICBuZXdfZmllbGQtPnR5cGUgPSBpbnNuX2ZpZWxkX2ludDsKKwkgIH0KKyAgICAgIH0KKyAgICBlbHNlIGlmIChuZXdfZmllbGQtPnZhbF9zdHJpbmdbMF0gPT0gJy8nKQorICAgICAgeworCW5ld19maWVsZC0+dHlwZSA9IGluc25fZmllbGRfcmVzZXJ2ZWQ7CisgICAgICB9CisgICAgZWxzZSBpZiAobmV3X2ZpZWxkLT52YWxfc3RyaW5nWzBdID09ICcqJykKKyAgICAgIHsKKwluZXdfZmllbGQtPnR5cGUgPSBpbnNuX2ZpZWxkX3dpbGQ7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCW5ld19maWVsZC0+dHlwZSA9IGluc25fZmllbGRfc3RyaW5nOworCWlmIChmaWx0ZXJfaXNfbWVtYmVyICh3b3JkLT5maWVsZF9uYW1lcywgbmV3X2ZpZWxkLT52YWxfc3RyaW5nKSkKKwkgIGVycm9yIChsaW5lLCAiRmllbGQgbmFtZSAlcyBpcyBkdXBsaWNhdGVkXG4iLCBuZXdfZmllbGQtPnZhbF9zdHJpbmcpOworCWZpbHRlcl9wYXJzZSAoJndvcmQtPmZpZWxkX25hbWVzLCBuZXdfZmllbGQtPnZhbF9zdHJpbmcpOworICAgICAgfQorICAgIGlmIChuZXdfZmllbGQtPnR5cGUgIT0gaW5zbl9maWVsZF9zdHJpbmcKKwkmJiBuZXdfZmllbGQtPmNvbmRpdGlvbnMgIT0gTlVMTCkKKyAgICAgIGVycm9yIChsaW5lLCAiQ29uZGl0aW9uYWxzIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gbmFtZWQgZmllbGRzXG4iKTsKKworICAgIC8qIHRoZSBjb3B5IHRoZSBwb3NpdGlvbiAqLworICAgIG5ld19maWVsZC0+cG9zX3N0cmluZyA9IE5aQUxMT0MgKGNoYXIsIHN0cmxlbl9wb3MgKyAxKTsKKyAgICBzdHJuY3B5IChuZXdfZmllbGQtPnBvc19zdHJpbmcsIHN0YXJ0X3Bvcywgc3RybGVuX3Bvcyk7CisgICAgaWYgKHN0cmxlbl9wb3MgPT0gMCkKKyAgICAgIHsKKwluZXdfZmllbGQtPmZpcnN0ID0gbmV3X2ZpZWxkLT5wcmV2LT5sYXN0ICsgMTsKKwlpZiAobmV3X2ZpZWxkLT5maXJzdCA9PSAwIC8qIGZpcnN0IGZpZWxkICovCisJICAgICYmICpjaHAgPT0gJ1wwJyAvKiBubyBmdXJ0aGVyIGZpZWxkcyAqLworCSAgICAmJiBuZXdfZmllbGQtPnR5cGUgPT0gaW5zbl9maWVsZF9zdHJpbmcpCisJICB7CisJICAgIC8qIEEgc2luZ2xlIHN0cmluZyB3aXRob3V0IGFueSBwb3NpdGlvbiwgYXNzdW1lIHRoYXQgaXQKKyAgICAgICAgICAgICAgIHJlcHJlc2VudHMgdGhlIGVudGlyZSBpbnN0cnVjdGlvbiB3b3JkICovCisJICAgIG5ld19maWVsZC0+d2lkdGggPSBvcHRpb25zLmluc25fYml0X3NpemU7CisJICB9CisJZWxzZQorCSAgeworCSAgICAvKiBObyBleHBsaWNpdCB3aWR0aC9wb3NpdGlvbiwgYXNzdW1lIHZhbHVlIGltcGxpY2l0bHkKKwkgICAgICAgc3VwcGxpZXMgdGhlIHdpZHRoICovCisJICAgIG5ld19maWVsZC0+d2lkdGggPSBzdHJsZW5fdmFsOworCSAgfQorCW5ld19maWVsZC0+bGFzdCA9IG5ld19maWVsZC0+Zmlyc3QgKyBuZXdfZmllbGQtPndpZHRoIC0gMTsKKwlpZiAobmV3X2ZpZWxkLT5sYXN0ID49IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSkKKwkgIGVycm9yIChsaW5lLCAiQml0IHBvc2l0aW9uICVkIGV4Y2VlZCBpbnN0cnVjdGlvbiBiaXQgc2l6ZSAoJWQpXG4iLAorCQkgbmV3X2ZpZWxkLT5sYXN0LCBvcHRpb25zLmluc25fYml0X3NpemUpOworICAgICAgfQorICAgIGVsc2UgaWYgKG9wdGlvbnMuaW5zbl9zcGVjaWZ5aW5nX3dpZHRocykKKyAgICAgIHsKKwluZXdfZmllbGQtPmZpcnN0ID0gbmV3X2ZpZWxkLT5wcmV2LT5sYXN0ICsgMTsKKwluZXdfZmllbGQtPndpZHRoID0gYTJpKG5ld19maWVsZC0+cG9zX3N0cmluZyk7CisJbmV3X2ZpZWxkLT5sYXN0ID0gbmV3X2ZpZWxkLT5maXJzdCArIG5ld19maWVsZC0+d2lkdGggLSAxOworCWlmIChuZXdfZmllbGQtPmxhc3QgPj0gb3B0aW9ucy5pbnNuX2JpdF9zaXplKQorCSAgZXJyb3IgKGxpbmUsICJCaXQgcG9zaXRpb24gJWQgZXhjZWVkIGluc3RydWN0aW9uIGJpdCBzaXplICglZClcbiIsCisJCSBuZXdfZmllbGQtPmxhc3QsIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSk7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCW5ld19maWVsZC0+Zmlyc3QgPSB0YXJnZXRfYTJpKG9wdGlvbnMuaGlfYml0X25yLAorCQkJCSAgICAgIG5ld19maWVsZC0+cG9zX3N0cmluZyk7CisJbmV3X2ZpZWxkLT5sYXN0ID0gbmV3X2ZpZWxkLT5uZXh0LT5maXJzdCAtIDE7IC8qIGd1ZXNzICovCisJbmV3X2ZpZWxkLT53aWR0aCA9IG5ld19maWVsZC0+bGFzdCAtIG5ld19maWVsZC0+Zmlyc3QgKyAxOyAvKiBndWVzcyAqLworCW5ld19maWVsZC0+cHJldi0+bGFzdCA9IG5ld19maWVsZC0+Zmlyc3QgLSAxOyAvKmZpeCovCisJbmV3X2ZpZWxkLT5wcmV2LT53aWR0aCA9IG5ld19maWVsZC0+Zmlyc3QgLSBuZXdfZmllbGQtPnByZXYtPmZpcnN0OyAvKmZpeCovCisgICAgICB9CisgIH0KKworICAvKiBmaWRkbGUgZmlyc3QvbGFzdCBzbyB0aGF0IHRoZSBzZW50aW5hbHMgZGlzYXBlYXIgKi8KKyAgQVNTRVJUKHdvcmQtPmZpcnN0LT5sYXN0IDwgMCk7CisgIEFTU0VSVCh3b3JkLT5sYXN0LT5maXJzdCA+PSBvcHRpb25zLmluc25fYml0X3NpemUpOworICB3b3JkLT5maXJzdCA9IHdvcmQtPmZpcnN0LT5uZXh0OworICB3b3JkLT5sYXN0ID0gd29yZC0+bGFzdC0+cHJldjsKKworICAvKiBjaGVjayB0aGF0IHRoZSBsYXN0IGZpZWxkIGdvZXMgYWxsIHRoZSB3YXkgdG8gdGhlIGxhc3QgYml0ICovCisgIGlmICh3b3JkLT5sYXN0LT5sYXN0ICE9IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSAtIDEpCisgICAgeworICAgICAgaWYgKG9wdGlvbnMud2Fybi53aWR0aCkKKwlvcHRpb25zLndhcm5pbmcgKGxpbmUsICJJbnN0cnVjdGlvbiBmb3JtYXQgaXMgbm90ICVkIGJpdHMgd2lkZVxuIiwKKwkJCSBvcHRpb25zLmluc25fYml0X3NpemUpOworICAgICAgd29yZC0+bGFzdC0+bGFzdCA9IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSAtIDE7CisgICAgfQorCisgIC8qIG5vdyBnbyBvdmVyIHRoaXMgYWdhaW4sIHBvaW50aW5nIGVhY2ggYml0IHBvc2l0aW9uIGF0IGEgZmllbGQKKyAgICAgcmVjb3JkICovCisgIHsKKyAgICBpbnNuX2ZpZWxkX2VudHJ5ICpmaWVsZDsKKyAgICBmb3IgKGZpZWxkID0gd29yZC0+Zmlyc3Q7CisJIGZpZWxkLT5sYXN0IDwgb3B0aW9ucy5pbnNuX2JpdF9zaXplOworCSBmaWVsZCA9IGZpZWxkLT5uZXh0KQorICAgICAgeworCWludCBpOworCWZvciAoaSA9IGZpZWxkLT5maXJzdDsgaSA8PSBmaWVsZC0+bGFzdDsgaSsrKQorCSAgeworCSAgICB3b3JkLT5iaXRbaV0gPSBaQUxMT0MgKGluc25fYml0X2VudHJ5KTsKKwkgICAgd29yZC0+Yml0W2ldLT5maWVsZCA9IGZpZWxkOworCSAgICBzd2l0Y2ggKGZpZWxkLT50eXBlKQorCSAgICAgIHsKKwkgICAgICBjYXNlIGluc25fZmllbGRfaW52YWxpZDoKKwkJQVNTRVJUICgwKTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBpbnNuX2ZpZWxkX2ludDoKKwkJd29yZC0+Yml0W2ldLT5tYXNrID0gMTsKKwkJd29yZC0+Yml0W2ldLT52YWx1ZSA9ICgoZmllbGQtPnZhbF9pbnQKKwkJCQkJJiAoKGluc25fdWludCkxIDw8IChmaWVsZC0+bGFzdCAtIGkpKSkKKwkJCQkgICAgICAgIT0gMCk7CisJICAgICAgY2FzZSBpbnNuX2ZpZWxkX3Jlc2VydmVkOgorCSAgICAgIGNhc2UgaW5zbl9maWVsZF93aWxkOgorCSAgICAgIGNhc2UgaW5zbl9maWVsZF9zdHJpbmc6CisJCS8qIGlmIHdlIGVuY291bnRlciBhIGNvbnN0YW50IGNvbmRpdGlvbmFsLCBlbmNvZGUKKyAgICAgICAgICAgICAgICAgICB0aGVpciBiaXQgdmFsdWUuICovCisJCWlmIChmaWVsZC0+Y29uZGl0aW9ucyAhPSBOVUxMCisJCSAgICAmJiBmaWVsZC0+Y29uZGl0aW9ucy0+dGVzdCA9PSBpbnNuX2ZpZWxkX2NvbmRfZXEKKwkJICAgICYmIGZpZWxkLT5jb25kaXRpb25zLT50eXBlID09IGluc25fZmllbGRfY29uZF92YWx1ZSkKKwkJICB7CisJCSAgICB3b3JkLT5iaXRbaV0tPm1hc2sgPSAxOworCQkgICAgd29yZC0+Yml0W2ldLT52YWx1ZSA9ICgoZmllbGQtPmNvbmRpdGlvbnMtPnZhbHVlCisJCQkJCSAgICAmICgoaW5zbl91aW50KTEgPDwgKGZpZWxkLT5sYXN0IC0gaSkpKQorCQkJCQkgICAhPSAwKTsKKwkJICB9CisJCWJyZWFrOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKyAgfQorCisgIHJldHVybiB3b3JkOworfQorCisKK3N0YXRpYyB2b2lkCitwYXJzZV9pbnNuX3dvcmRzIChpbnNuX2VudHJ5ICppbnNuLAorCQkgIGNoYXIgKmZvcm1hdHMpCit7CisgIGluc25fd29yZF9lbnRyeSAqKmxhc3Rfd29yZCA9ICZpbnNuLT53b3JkczsKKyAgY2hhciAqY2hwOworCisgIC8qIG5vdyB3b3JrIHRocm91Z2ggdGhlIGZvcm1hdHMgKi8KKyAgaW5zbi0+bnJfd29yZHMgPSAwOworICBjaHAgPSBmb3JtYXRzOworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGNoYXIgKnN0YXJ0X3BvczsKKyAgICAgIGNoYXIgKmVuZF9wb3M7CisgICAgICBpbnQgc3RybGVuX3BvczsKKyAgICAgIGNoYXIgKmZvcm1hdDsKKyAgICAgIGluc25fd29yZF9lbnRyeSAqbmV3X3dvcmQ7CisKKyAgICAgIC8qIHNraXAgbGVhZGluZyBzcGFjZXMgKi8KKyAgICAgIGNocCA9IHNraXBfc3BhY2VzIChjaHApOworCisgICAgICAvKiBicmVhayBvdXQgdGhlIGZvcm1hdCAqLworICAgICAgc3RhcnRfcG9zID0gY2hwOworICAgICAgY2hwID0gc2tpcF90b19zZXBhcmF0b3IgKGNocCwgIisiKTsKKyAgICAgIGVuZF9wb3MgPSBiYWNrX3NwYWNlcyAoc3RhcnRfcG9zLCBjaHApOworICAgICAgc3RybGVuX3BvcyA9IGVuZF9wb3MgLSBzdGFydF9wb3M7CisKKyAgICAgIC8qIGNoZWNrIHRoYXQgc29tZXRoaW5nIHdhcyB0aGVyZSAqLworICAgICAgaWYgKHN0cmxlbl9wb3MgPT0gMCkKKwllcnJvciAoaW5zbi0+bGluZSwgIm1pc3Npbmcgb3IgZW1wdHkgaW5zdHJ1Y3Rpb24gZm9ybWF0XG4iKTsKKworICAgICAgLyogcGFyc2UgdGhlIGZpZWxkICovCisgICAgICBmb3JtYXQgPSBOWkFMTE9DIChjaGFyLCBzdHJsZW5fcG9zICsgMSk7CisgICAgICBzdHJuY3B5IChmb3JtYXQsIHN0YXJ0X3Bvcywgc3RybGVuX3Bvcyk7CisgICAgICBuZXdfd29yZCA9IHBhcnNlX2luc25fd29yZCAoaW5zbi0+bGluZSwgZm9ybWF0LCBpbnNuLT5ucl93b3Jkcyk7CisgICAgICBpbnNuLT5ucl93b3JkcysrOworICAgICAgaWYgKGZpbHRlcl9pc19jb21tb24gKGluc24tPmZpZWxkX25hbWVzLCBuZXdfd29yZC0+ZmllbGRfbmFtZXMpKQorCWVycm9yIChpbnNuLT5saW5lLCAiRmllbGQgbmFtZSBkdXBsaWNhdGVkIGJldHdlZW4gdHdvIHdvcmRzXG4iKTsKKyAgICAgIGZpbHRlcl9hZGQgKCZpbnNuLT5maWVsZF9uYW1lcywgbmV3X3dvcmQtPmZpZWxkX25hbWVzKTsKKworICAgICAgLyogaW5zZXJ0IGl0ICovCisgICAgICAqbGFzdF93b3JkID0gbmV3X3dvcmQ7CisgICAgICBsYXN0X3dvcmQgPSAmbmV3X3dvcmQtPm5leHQ7CisKKyAgICAgIC8qIGxhc3QgZm9ybWF0PyAqLworICAgICAgaWYgKCpjaHAgPT0gJ1wwJykKKwlicmVhazsKKyAgICAgIEFTU0VSVCAoKmNocCA9PSAnKycpOworICAgICAgY2hwKys7CisgICAgfQorCisgIC8qIGNyZWF0ZSBhIHF1aWNrIGFjY2VzcyBhcnJheSAoaW5kZXhlZCBieSB3b3JkKSBvZiB0aGUgc2FtZSBzdHJ1Y3R1cmUgKi8KKyAgeworICAgIGludCBpOworICAgIGluc25fd29yZF9lbnRyeSAqd29yZDsKKyAgICBpbnNuLT53b3JkID0gTlpBTExPQyAoaW5zbl93b3JkX2VudHJ5ICosIGluc24tPm5yX3dvcmRzICsgMSk7CisgICAgZm9yIChpID0gMCwgd29yZCA9IGluc24tPndvcmRzOworCSBpIDwgaW5zbi0+bnJfd29yZHM7CisJIGkrKywgd29yZCA9IHdvcmQtPm5leHQpCisgICAgICBpbnNuLT53b3JkW2ldID0gd29yZDsKKyAgfQorCisgIC8qIEdvIG92ZXIgYWxsIGZpZWxkcyB0aGF0IGhhdmUgY29uZGl0aW9uYWxzIHJlZmVyaW5nIHRvIG90aGVyCisgICAgIGZpZWxkcy4gIExpbmsgdGhlIGZpZWxkcyB1cC4gIFZlcmlmeSB0aGF0IHRoZSB0d28gZmllbGRzIGhhdmUgdGhlCisgICAgIHNhbWUgc2l6ZS4gVmVyaWZ5IHRoYXQgdGhlIHR3byBmaWVsZHMgYXJlIGRpZmZlcmVudCAqLworICB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGluc24tPm5yX3dvcmRzOyBpKyspCisgICAgICB7CisJaW5zbl93b3JkX2VudHJ5ICp3b3JkID0gaW5zbi0+d29yZFtpXTsKKwlpbnNuX2ZpZWxkX2VudHJ5ICpmOworCWZvciAoZiA9IHdvcmQtPmZpcnN0OworCSAgICAgZi0+bGFzdCA8IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZTsKKwkgICAgIGYgPSBmLT5uZXh0KQorCSAgeworCSAgICBpbnNuX2ZpZWxkX2NvbmQgKmNvbmQ7CisJICAgIGZvciAoY29uZCA9IGYtPmNvbmRpdGlvbnM7CisJCSBjb25kICE9IE5VTEw7CisJCSBjb25kID0gY29uZC0+bmV4dCkKKwkgICAgICB7CisJCWlmIChjb25kLT50eXBlID09IGluc25fZmllbGRfY29uZF9maWVsZCkKKwkJICB7CisJCSAgICBpbnQgajsKKwkJICAgIGlmIChzdHJjbXAgKGNvbmQtPnN0cmluZywgZi0+dmFsX3N0cmluZykgPT0gMCkKKwkJICAgICAgZXJyb3IgKGluc24tPmxpbmUsCisJCQkgICAgICJDb25kaXRpb25hbCBgJXMnIG9mIGZpZWxkIGAlcycgcmVmZXJzIHRvIGl0cyBzZWxmXG4iLAorCQkJICAgICBjb25kLT5zdHJpbmcsIGYtPnZhbF9zdHJpbmcpOworCQkgICAgZm9yIChqID0gMDsgaiA8PSBpICYmIGNvbmQtPmZpZWxkID09IE5VTEw7IGorKykKKwkJICAgICAgeworCQkJaW5zbl93b3JkX2VudHJ5ICpyZWZlcmVkX3dvcmQgPSBpbnNuLT53b3JkW2pdOworCQkJaW5zbl9maWVsZF9lbnRyeSAqcmVmZXJlZF9maWVsZDsKKwkJCWZvciAocmVmZXJlZF9maWVsZCA9IHJlZmVyZWRfd29yZC0+Zmlyc3Q7CisJCQkgICAgIHJlZmVyZWRfZmllbGQgIT0gTlVMTCAmJiBjb25kLT5maWVsZCA9PSBOVUxMOworCQkJICAgICByZWZlcmVkX2ZpZWxkID0gcmVmZXJlZF9maWVsZC0+bmV4dCkKKwkJCSAgeworCQkJICAgIGlmIChyZWZlcmVkX2ZpZWxkLT50eXBlID09IGluc25fZmllbGRfc3RyaW5nCisJCQkJJiYgc3RyY21wIChyZWZlcmVkX2ZpZWxkLT52YWxfc3RyaW5nLCBjb25kLT5zdHJpbmcpID09IDApCisJCQkgICAgICB7CisJCQkJLyogZm91bmQgZmllbGQgYmVpbmcgcmVmZXJlZCB0byBieSBjb25kaXRvbmFsICovCisJCQkJY29uZC0+ZmllbGQgPSByZWZlcmVkX2ZpZWxkOworCQkJCS8qIGNoZWNrIHJlZmVyZWQgdG8gYW5kIHRoaXMgZmllbGQgYXJlCisJCQkJICAgdGhlIHNhbWUgc2l6ZSAqLworCQkJCWlmIChmLT53aWR0aCAhPSByZWZlcmVkX2ZpZWxkLT53aWR0aCkKKwkJCQkgIGVycm9yIChpbnNuLT5saW5lLAorCQkJCQkgIkNvbmRpdGlvbmFsIGAlcycgb2YgZmllbGQgYCVzJyBzaG91bGQgYmUgb2Ygc2l6ZSAlc1xuIiwKKwkJCQkJIGNvbmQtPnN0cmluZywgZi0+dmFsX3N0cmluZywgcmVmZXJlZF9maWVsZC0+d2lkdGgpOworCQkJICAgICAgfQorCQkJICB9CisJCSAgICAgIH0KKwkJICAgIGlmIChjb25kLT5maWVsZCA9PSBOVUxMKQorCQkgICAgICBlcnJvciAoaW5zbi0+bGluZSwKKwkJCSAgICAgIkNvbmRpdGlvbmFsIGAlcycgb2YgZmllbGQgYCVzJyBub3QgeWV0IGRlZmluZWRcbiIsCisJCQkgICAgIGNvbmQtPnN0cmluZywgZi0+dmFsX3N0cmluZyk7CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKyAgfQorICAKK30KKwordHlwZWRlZiBlbnVtIHsKKyAgdW5rbm93bl9yZWNvcmQgPSAwLAorICBpbnNuX3JlY29yZCwgLyogZGVmYXVsdCAqLworICBjb2RlX3JlY29yZCwKKyAgY2FjaGVfcmVjb3JkLAorICBjb21wdXRlX3JlY29yZCwKKyAgc2NyYXRjaF9yZWNvcmQsCisgIG9wdGlvbl9yZWNvcmQsCisgIHN0cmluZ19mdW5jdGlvbl9yZWNvcmQsCisgIGZ1bmN0aW9uX3JlY29yZCwKKyAgaW50ZXJuYWxfcmVjb3JkLAorICBkZWZpbmVfcmVjb3JkLAorICBpbmNsdWRlX3JlY29yZCwKKyAgbW9kZWxfcHJvY2Vzc29yX3JlY29yZCwKKyAgbW9kZWxfbWFjcm9fcmVjb3JkLAorICBtb2RlbF9kYXRhX3JlY29yZCwKKyAgbW9kZWxfc3RhdGljX3JlY29yZCwKKyAgbW9kZWxfZnVuY3Rpb25fcmVjb3JkLAorICBtb2RlbF9pbnRlcm5hbF9yZWNvcmQsCit9IGluc25fcmVjb3JkX3R5cGU7CisKK3N0YXRpYyBjb25zdCBuYW1lX21hcCBpbnNuX3R5cGVfbWFwW10gPSB7CisgIHsgIm9wdGlvbiIsIG9wdGlvbl9yZWNvcmQgfSwKKyAgeyAiY2FjaGUiLCBjYWNoZV9yZWNvcmQgfSwKKyAgeyAiY29tcHV0ZSIsIGNvbXB1dGVfcmVjb3JkIH0sCisgIHsgInNjcmF0Y2giLCBzY3JhdGNoX3JlY29yZCB9LAorICB7ICJkZWZpbmUiLCBkZWZpbmVfcmVjb3JkIH0sCisgIHsgImluY2x1ZGUiLCBpbmNsdWRlX3JlY29yZCB9LAorICB7ICIlcyIsIHN0cmluZ19mdW5jdGlvbl9yZWNvcmQgfSwKKyAgeyAiZnVuY3Rpb24iLCBmdW5jdGlvbl9yZWNvcmQgfSwKKyAgeyAiaW50ZXJuYWwiLCBpbnRlcm5hbF9yZWNvcmQgfSwKKyAgeyAibW9kZWwiLCBtb2RlbF9wcm9jZXNzb3JfcmVjb3JkIH0sCisgIHsgIm1vZGVsLW1hY3JvIiwgbW9kZWxfbWFjcm9fcmVjb3JkIH0sCisgIHsgIm1vZGVsLWRhdGEiLCBtb2RlbF9kYXRhX3JlY29yZCB9LAorICB7ICJtb2RlbC1zdGF0aWMiLCBtb2RlbF9zdGF0aWNfcmVjb3JkIH0sCisgIHsgIm1vZGVsLWludGVybmFsIiwgbW9kZWxfaW50ZXJuYWxfcmVjb3JkIH0sCisgIHsgIm1vZGVsLWZ1bmN0aW9uIiwgbW9kZWxfZnVuY3Rpb25fcmVjb3JkIH0sCisgIHsgTlVMTCwgaW5zbl9yZWNvcmQgfSwKK307CisKKworc3RhdGljIGludAorcmVjb3JkX2lzX29sZCAodGFibGVfZW50cnkgKmVudHJ5KQoreworICBpZiAoZW50cnktPm5yX2ZpZWxkcyA+IHJlY29yZF90eXBlX2ZpZWxkCisgICAgICAmJiBzdHJsZW4gKGVudHJ5LT5maWVsZFtyZWNvcmRfdHlwZV9maWVsZF0pID09IDApCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5zbl9yZWNvcmRfdHlwZQorcmVjb3JkX3R5cGUgKHRhYmxlX2VudHJ5ICplbnRyeSkKK3sKKyAgc3dpdGNoIChlbnRyeS0+dHlwZSkKKyAgICB7CisgICAgY2FzZSB0YWJsZV9jb2RlX2VudHJ5OgorICAgICAgcmV0dXJuIGNvZGVfcmVjb3JkOworCisgICAgY2FzZSB0YWJsZV9jb2xvbl9lbnRyeToKKyAgICAgIGlmIChyZWNvcmRfaXNfb2xkIChlbnRyeSkpCisJeworCSAgLyogb2xkLWZvcm1hdD8gKi8KKwkgIGlmIChlbnRyeS0+bnJfZmllbGRzID4gb2xkX3JlY29yZF90eXBlX2ZpZWxkKQorCSAgICB7CisJICAgICAgaW50IGkgPSBuYW1lMmkgKGVudHJ5LT5maWVsZFtvbGRfcmVjb3JkX3R5cGVfZmllbGRdLAorCQkJICAgICAgaW5zbl90eXBlX21hcCk7CisJICAgICAgcmV0dXJuIGk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHJldHVybiB1bmtub3duX3JlY29yZDsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKGVudHJ5LT5ucl9maWVsZHMgPiByZWNvcmRfdHlwZV9maWVsZAorCSAgICAgICAmJiBlbnRyeS0+ZmllbGRbMF1bMF0gPT0gJ1wwJykKKwl7CisJICAvKiBuZXctZm9ybWF0PyAqLworCSAgaW50IGkgPSBuYW1lMmkgKGVudHJ5LT5maWVsZFtyZWNvcmRfdHlwZV9maWVsZF0sCisJCQkgIGluc25fdHlwZV9tYXApOworCSAgcmV0dXJuIGk7CisJfQorICAgICAgZWxzZQorCXJldHVybiBpbnNuX3JlY29yZDsgLyogZGVmYXVsdCAqLworICAgIH0KKyAgcmV0dXJuIHVua25vd25fcmVjb3JkOworfQorCitzdGF0aWMgaW50CityZWNvcmRfcHJlZml4X2lzICh0YWJsZV9lbnRyeSAqZW50cnksCisJCSAgY2hhciBjaCwKKwkJICBpbnQgbnJfZmllbGRzKQoreworICBpZiAoZW50cnktPnR5cGUgIT0gdGFibGVfY29sb25fZW50cnkpCisgICAgcmV0dXJuIDA7CisgIGlmIChlbnRyeS0+bnJfZmllbGRzIDwgbnJfZmllbGRzKQorICAgIHJldHVybiAwOworICBpZiAoZW50cnktPmZpZWxkWzBdWzBdICE9IGNoICYmIGNoICE9ICdcMCcpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdGFibGVfZW50cnkgKgorcGFyc2VfbW9kZWxfZGF0YV9yZWNvcmQgKGluc25fdGFibGUgKmlzYSwKKwkJCSB0YWJsZSAqZmlsZSwKKwkJCSB0YWJsZV9lbnRyeSAqcmVjb3JkLAorCQkJIGludCBucl9maWVsZHMsCisJCQkgbW9kZWxfZGF0YSAqKmxpc3QpCit7CisgIHRhYmxlX2VudHJ5ICptb2RlbF9yZWNvcmQgPSByZWNvcmQ7CisgIHRhYmxlX2VudHJ5ICpjb2RlX3JlY29yZCA9IE5VTEw7CisgIG1vZGVsX2RhdGEgKm5ld19kYXRhOworICBpZiAocmVjb3JkLT5ucl9maWVsZHMgPCBucl9maWVsZHMpCisgICAgZXJyb3IgKHJlY29yZC0+bGluZSwgIkluY29ycmVjdCBudW1iZXIgb2YgZmllbGRzXG4iKTsKKyAgcmVjb3JkID0gdGFibGVfcmVhZCAoZmlsZSk7CisgIGlmIChyZWNvcmQtPnR5cGUgPT0gdGFibGVfY29kZV9lbnRyeSkKKyAgICB7CisgICAgICBjb2RlX3JlY29yZCA9IHJlY29yZDsKKyAgICAgIHJlY29yZCA9IHRhYmxlX3JlYWQgKGZpbGUpOworICAgIH0KKyAgLyogY3JlYXRlIHRoZSBuZXcgZGF0YSByZWNvcmQgKi8KKyAgbmV3X2RhdGEgPSBaQUxMT0MgKG1vZGVsX2RhdGEpOworICBuZXdfZGF0YS0+bGluZSA9IG1vZGVsX3JlY29yZC0+bGluZTsKKyAgZmlsdGVyX3BhcnNlICgmbmV3X2RhdGEtPmZsYWdzLAorCQltb2RlbF9yZWNvcmQtPmZpZWxkW3JlY29yZF9maWx0ZXJfZmxhZ3NfZmllbGRdKTsKKyAgbmV3X2RhdGEtPmVudHJ5ID0gbW9kZWxfcmVjb3JkOworICBuZXdfZGF0YS0+Y29kZSA9IGNvZGVfcmVjb3JkOworICAvKiBhcHBlbmQgaXQgaWYgbm90IGZpbHRlcmVkIG91dCAqLworICBpZiAoIWlzX2ZpbHRlcmVkX291dCAob3B0aW9ucy5mbGFnc19maWx0ZXIsCisJCQltb2RlbF9yZWNvcmQtPmZpZWxkW3JlY29yZF9maWx0ZXJfZmxhZ3NfZmllbGRdKQorICAgICAgJiYgIWlzX2ZpbHRlcmVkX291dCAob3B0aW9ucy5tb2RlbF9maWx0ZXIsCisJCQkgICBtb2RlbF9yZWNvcmQtPmZpZWxkW3JlY29yZF9maWx0ZXJfbW9kZWxzX2ZpZWxkXSkpCisgICAgeworICAgICAgd2hpbGUgKCpsaXN0ICE9IE5VTEwpCisJbGlzdCA9ICYoKmxpc3QpLT5uZXh0OworICAgICAgKmxpc3QgPSBuZXdfZGF0YTsKKyAgICB9CisgIHJldHVybiByZWNvcmQ7Cit9CisKKwordHlwZWRlZiBlbnVtIHsKKyAgaW5zbl9iaXRfc2l6ZV9vcHRpb24gPSAxLAorICBpbnNuX3NwZWNpZnlpbmdfd2lkdGhzX29wdGlvbiwKKyAgaGlfYml0X25yX29wdGlvbiwKKyAgZmxhZ3NfZmlsdGVyX29wdGlvbiwKKyAgbW9kZWxfZmlsdGVyX29wdGlvbiwKKyAgbXVsdGlfc2ltX29wdGlvbiwKKyAgZm9ybWF0X25hbWVzX29wdGlvbiwKKyAgZ2VuX2RlbGF5ZWRfYnJhbmNoLAorICB1bmtub3duX29wdGlvbiwKK30gb3B0aW9uX25hbWVzOworCitzdGF0aWMgY29uc3QgbmFtZV9tYXAgb3B0aW9uX21hcFtdID0geworICB7ICJpbnNuLWJpdC1zaXplIiwgaW5zbl9iaXRfc2l6ZV9vcHRpb24gfSwKKyAgeyAiaW5zbi1zcGVjaWZ5aW5nLXdpZHRocyIsIGluc25fc3BlY2lmeWluZ193aWR0aHNfb3B0aW9uIH0sCisgIHsgImhpLWJpdC1uciIsIGhpX2JpdF9ucl9vcHRpb24gfSwKKyAgeyAiZmxhZ3MtZmlsdGVyIiwgZmxhZ3NfZmlsdGVyX29wdGlvbiB9LAorICB7ICJtb2RlbC1maWx0ZXIiLCBtb2RlbF9maWx0ZXJfb3B0aW9uIH0sCisgIHsgIm11bHRpLXNpbSIsIG11bHRpX3NpbV9vcHRpb24gfSwKKyAgeyAiZm9ybWF0LW5hbWVzIiwgZm9ybWF0X25hbWVzX29wdGlvbiB9LAorICB7ICJnZW4tZGVsYXllZC1icmFuY2giLCBnZW5fZGVsYXllZF9icmFuY2ggfSwKKyAgeyBOVUxMLCB1bmtub3duX29wdGlvbiB9LAorfTsKKworc3RhdGljIHRhYmxlX2VudHJ5ICoKK3BhcnNlX2luY2x1ZGVfcmVjb3JkICh0YWJsZSAqZmlsZSwKKwkJICAgICAgdGFibGVfZW50cnkgKnJlY29yZCkKK3sKKyAgLyogcGFyc2UgdGhlIGluY2x1ZGUgcmVjb3JkICovCisgIGlmIChyZWNvcmQtPm5yX2ZpZWxkcyA8IG5yX2luY2x1ZGVfZmllbGRzKQorICAgIGVycm9yIChyZWNvcmQtPmxpbmUsICJJbmNvcnJlY3QgbnIgZmllbGRzIGZvciBpbmNsdWRlIHJlY29yZFxuIik7CisgIC8qIHByb2Nlc3MgaXQgKi8KKyAgaWYgKCFpc19maWx0ZXJlZF9vdXQgKG9wdGlvbnMuZmxhZ3NfZmlsdGVyLAorCQkJcmVjb3JkLT5maWVsZFtyZWNvcmRfZmlsdGVyX2ZsYWdzX2ZpZWxkXSkKKyAgICAgICYmICFpc19maWx0ZXJlZF9vdXQgKG9wdGlvbnMubW9kZWxfZmlsdGVyLAorCQkJICAgcmVjb3JkLT5maWVsZFtyZWNvcmRfZmlsdGVyX21vZGVsc19maWVsZF0pKQorICAgIHsKKyAgICAgIHRhYmxlX3B1c2ggKGZpbGUsIHJlY29yZC0+bGluZSwgb3B0aW9ucy5pbmNsdWRlLAorCQkgIHJlY29yZC0+ZmllbGRbaW5jbHVkZV9maWxlbmFtZV9maWVsZF0pOworICAgIH0gIAorICAvKiBuYjogY2FuJ3QgcmVhZCBuZXh0IHJlY29yZCB1bnRpbCBhZnRlciB0aGUgZmlsZSBoYXMgYmVlbiBwdXNoZWQgKi8KKyAgcmVjb3JkID0gdGFibGVfcmVhZCAoZmlsZSk7CisgIHJldHVybiByZWNvcmQ7Cit9CisKKworc3RhdGljIHRhYmxlX2VudHJ5ICoKK3BhcnNlX29wdGlvbl9yZWNvcmQgKHRhYmxlICpmaWxlLAorCQkgICAgIHRhYmxlX2VudHJ5ICpyZWNvcmQpCit7CisgIHRhYmxlX2VudHJ5ICpvcHRpb25fcmVjb3JkOworICAvKiBwYXJzZSB0aGUgb3B0aW9uIHJlY29yZCAqLworICBvcHRpb25fcmVjb3JkID0gcmVjb3JkOworICBpZiAocmVjb3JkLT5ucl9maWVsZHMgPCBucl9vcHRpb25fZmllbGRzKQorICAgIGVycm9yIChyZWNvcmQtPmxpbmUsICJJbmNvcnJlY3QgbnIgb2YgZmllbGRzIGZvciBvcHRpb24gcmVjb3JkXG4iKTsKKyAgcmVjb3JkID0gdGFibGVfcmVhZCAoZmlsZSk7CisgIC8qIHByb2Nlc3MgaXQgKi8KKyAgaWYgKCFpc19maWx0ZXJlZF9vdXQgKG9wdGlvbnMuZmxhZ3NfZmlsdGVyLAorCQkJb3B0aW9uX3JlY29yZC0+ZmllbGRbcmVjb3JkX2ZpbHRlcl9mbGFnc19maWVsZF0pCisgICAgICAmJiAhaXNfZmlsdGVyZWRfb3V0IChvcHRpb25zLm1vZGVsX2ZpbHRlciwKKwkJCSAgIG9wdGlvbl9yZWNvcmQtPmZpZWxkW3JlY29yZF9maWx0ZXJfbW9kZWxzX2ZpZWxkXSkpCisgICAgeworICAgICAgY2hhciAqbmFtZSA9IG9wdGlvbl9yZWNvcmQtPmZpZWxkW29wdGlvbl9uYW1lX2ZpZWxkXTsKKyAgICAgIG9wdGlvbl9uYW1lcyBvcHRpb24gPSBuYW1lMmkgKG5hbWUsIG9wdGlvbl9tYXApOworICAgICAgY2hhciAqdmFsdWUgPSBvcHRpb25fcmVjb3JkLT5maWVsZFtvcHRpb25fdmFsdWVfZmllbGRdOworICAgICAgc3dpdGNoIChvcHRpb24pCisJeworCWNhc2UgaW5zbl9iaXRfc2l6ZV9vcHRpb246CisJICB7CisJICAgIG9wdGlvbnMuaW5zbl9iaXRfc2l6ZSA9IGEyaSAodmFsdWUpOworCSAgICBpZiAob3B0aW9ucy5pbnNuX2JpdF9zaXplIDwgMAorCQl8fCBvcHRpb25zLmluc25fYml0X3NpemUgPiBtYXhfaW5zbl9iaXRfc2l6ZSkKKwkgICAgICBlcnJvciAob3B0aW9uX3JlY29yZC0+bGluZSwgIkluc3RydWN0aW9uIGJpdCBzaXplIG91dCBvZiByYW5nZVxuIik7CisJICAgIGlmIChvcHRpb25zLmhpX2JpdF9uciAhPSBvcHRpb25zLmluc25fYml0X3NpemUgLSAxCisJCSYmIG9wdGlvbnMuaGlfYml0X25yICE9IDApCisJICAgICAgZXJyb3IgKG9wdGlvbl9yZWNvcmQtPmxpbmUsICJpbnNuLWJpdC1zaXplIC8gaGktYml0LW5yIGNvbmZsaWN0XG4iKTsKKwkgICAgYnJlYWs7CisJICB9CisJY2FzZSBpbnNuX3NwZWNpZnlpbmdfd2lkdGhzX29wdGlvbjoKKwkgIHsKKwkgICAgb3B0aW9ucy5pbnNuX3NwZWNpZnlpbmdfd2lkdGhzID0gYTJpICh2YWx1ZSk7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgaGlfYml0X25yX29wdGlvbjoKKwkgIHsKKwkgICAgb3B0aW9ucy5oaV9iaXRfbnIgPSBhMmkgKHZhbHVlKTsKKwkgICAgaWYgKG9wdGlvbnMuaGlfYml0X25yICE9IDAKKwkJJiYgb3B0aW9ucy5oaV9iaXRfbnIgIT0gb3B0aW9ucy5pbnNuX2JpdF9zaXplIC0gMSkKKwkgICAgICBlcnJvciAob3B0aW9uX3JlY29yZC0+bGluZSwgImhpLWJpdC1uciAvIGluc24tYml0LXNpemUgY29uZmxpY3RcbiIpOworCSAgICBicmVhazsKKwkgIH0KKwljYXNlIGZsYWdzX2ZpbHRlcl9vcHRpb246CisJICB7CisJICAgIGZpbHRlcl9wYXJzZSAoJm9wdGlvbnMuZmxhZ3NfZmlsdGVyLCB2YWx1ZSk7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgbW9kZWxfZmlsdGVyX29wdGlvbjoKKwkgIHsKKwkgICAgZmlsdGVyX3BhcnNlICgmb3B0aW9ucy5tb2RlbF9maWx0ZXIsIHZhbHVlKTsKKwkgICAgYnJlYWs7CisJICB9CisJY2FzZSBtdWx0aV9zaW1fb3B0aW9uOgorCSAgeworCSAgICBvcHRpb25zLmdlbi5tdWx0aV9zaW0gPSBhMmkgKHZhbHVlKTsKKwkgICAgYnJlYWs7CisJICB9CisJY2FzZSBmb3JtYXRfbmFtZXNfb3B0aW9uOgorCSAgeworCSAgICBmaWx0ZXJfcGFyc2UgKCZvcHRpb25zLmZvcm1hdF9uYW1lX2ZpbHRlciwgdmFsdWUpOworCSAgICBicmVhazsKKwkgIH0KKwljYXNlIGdlbl9kZWxheWVkX2JyYW5jaDoKKwkgIHsKKwkgICAgb3B0aW9ucy5nZW4uZGVsYXllZF9icmFuY2ggPSBhMmkgKHZhbHVlKTsKKwkgICAgYnJlYWs7CisJICB9CisJY2FzZSB1bmtub3duX29wdGlvbjoKKwkgIHsKKwkgICAgZXJyb3IgKG9wdGlvbl9yZWNvcmQtPmxpbmUsICJVbmtub3duIG9wdGlvbiAtICVzXG4iLCBuYW1lKTsKKwkgICAgYnJlYWs7CisJICB9CisJfQorICAgIH0gIAorICByZXR1cm4gcmVjb3JkOworfQorCisKK3N0YXRpYyB0YWJsZV9lbnRyeSAqCitwYXJzZV9mdW5jdGlvbl9yZWNvcmQgKHRhYmxlICpmaWxlLAorCQkgICAgICAgdGFibGVfZW50cnkgKnJlY29yZCwKKwkJICAgICAgIGZ1bmN0aW9uX2VudHJ5ICoqbGlzdCwKKwkJICAgICAgIGZ1bmN0aW9uX2VudHJ5ICoqbGlzdF9lbnRyeSwKKwkJICAgICAgIGludCBpc19pbnRlcm5hbCwKKwkJICAgICAgIG1vZGVsX3RhYmxlICptb2RlbCkKK3sKKyAgZnVuY3Rpb25fZW50cnkgKm5ld19mdW5jdGlvbjsKKyAgbmV3X2Z1bmN0aW9uID0gWkFMTE9DIChmdW5jdGlvbl9lbnRyeSk7CisgIG5ld19mdW5jdGlvbi0+bGluZSA9IHJlY29yZC0+bGluZTsKKyAgbmV3X2Z1bmN0aW9uLT5pc19pbnRlcm5hbCA9IGlzX2ludGVybmFsOworICAvKiBwYXJzZSB0aGUgZnVuY3Rpb24gaGVhZGVyICovCisgIGlmIChyZWNvcmRfaXNfb2xkIChyZWNvcmQpKQorICAgIHsKKyAgICAgIGlmIChyZWNvcmQtPm5yX2ZpZWxkcyA8IG5yX29sZF9mdW5jdGlvbl9maWVsZHMpCisJZXJyb3IgKHJlY29yZC0+bGluZSwgIk1pc3NpbmcgZmllbGRzIGZyb20gKG9sZCkgZnVuY3Rpb24gcmVjb3JkXG4iKTsKKyAgICAgIG5ld19mdW5jdGlvbi0+dHlwZSA9IHJlY29yZC0+ZmllbGRbb2xkX2Z1bmN0aW9uX3R5cGVkZWZfZmllbGRdOworICAgICAgbmV3X2Z1bmN0aW9uLT50eXBlID0gcmVjb3JkLT5maWVsZFtvbGRfZnVuY3Rpb25fdHlwZWRlZl9maWVsZF07CisgICAgICBpZiAocmVjb3JkLT5ucl9maWVsZHMgPiBvbGRfZnVuY3Rpb25fcGFyYW1fZmllbGQpCisJbmV3X2Z1bmN0aW9uLT5wYXJhbSA9IHJlY29yZC0+ZmllbGRbb2xkX2Z1bmN0aW9uX3BhcmFtX2ZpZWxkXTsKKyAgICAgIG5ld19mdW5jdGlvbi0+bmFtZSA9IHJlY29yZC0+ZmllbGRbb2xkX2Z1bmN0aW9uX25hbWVfZmllbGRdOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChyZWNvcmQtPm5yX2ZpZWxkcyA8IG5yX2Z1bmN0aW9uX2ZpZWxkcykKKwllcnJvciAocmVjb3JkLT5saW5lLCAiTWlzc2luZyBmaWVsZHMgZnJvbSBmdW5jdGlvbiByZWNvcmRcbiIpOworICAgICAgZmlsdGVyX3BhcnNlICgmbmV3X2Z1bmN0aW9uLT5mbGFncywKKwkJICAgIHJlY29yZC0+ZmllbGRbcmVjb3JkX2ZpbHRlcl9mbGFnc19maWVsZF0pOworICAgICAgZmlsdGVyX3BhcnNlICgmbmV3X2Z1bmN0aW9uLT5tb2RlbHMsCisJCSAgICByZWNvcmQtPmZpZWxkW3JlY29yZF9maWx0ZXJfbW9kZWxzX2ZpZWxkXSk7CisgICAgICBuZXdfZnVuY3Rpb24tPnR5cGUgPSByZWNvcmQtPmZpZWxkW2Z1bmN0aW9uX3R5cGVkZWZfZmllbGRdOworICAgICAgbmV3X2Z1bmN0aW9uLT5wYXJhbSA9IHJlY29yZC0+ZmllbGRbZnVuY3Rpb25fcGFyYW1fZmllbGRdOworICAgICAgbmV3X2Z1bmN0aW9uLT5uYW1lID0gcmVjb3JkLT5maWVsZFtmdW5jdGlvbl9uYW1lX2ZpZWxkXTsKKyAgICB9CisgIHJlY29yZCA9IHRhYmxlX3JlYWQgKGZpbGUpOworICAvKiBwYXJzZSBhbnkgZnVuY3Rpb24tbW9kZWwgcmVjb3JkcyAqLworICB3aGlsZSAocmVjb3JkICE9IE5VTEwKKwkgJiYgcmVjb3JkX3ByZWZpeF9pcyAocmVjb3JkLCAnKicsIG5yX2Z1bmN0aW9uX21vZGVsX2ZpZWxkcykpCisgICAgeworICAgICAgY2hhciAqbW9kZWxfbmFtZSA9IHJlY29yZC0+ZmllbGRbZnVuY3Rpb25fbW9kZWxfbmFtZV9maWVsZF0gKyAxOyAvKnNraXAgYConKi8KKyAgICAgIGZpbHRlcl9wYXJzZSAoJm5ld19mdW5jdGlvbi0+bW9kZWxzLCBtb2RlbF9uYW1lKTsKKyAgICAgIGlmICghZmlsdGVyX2lzX3N1YnNldCAobW9kZWwtPnByb2Nlc3NvcnMsIG5ld19mdW5jdGlvbi0+bW9kZWxzKSkKKwl7CisJICBlcnJvciAocmVjb3JkLT5saW5lLCAibWFjaGluZSBtb2RlbCBgJXMnIHVuZGVmaW5lZFxuIiwgbW9kZWxfbmFtZSk7CisJfQorICAgICAgcmVjb3JkID0gdGFibGVfcmVhZCAoZmlsZSk7CisgICAgfQorICAvKiBwYXJzZSB0aGUgZnVuY3Rpb24gYm9keSAqLworICBpZiAocmVjb3JkLT50eXBlID09IHRhYmxlX2NvZGVfZW50cnkpCisgICAgeworICAgICAgbmV3X2Z1bmN0aW9uLT5jb2RlID0gcmVjb3JkOworICAgICAgcmVjb3JkID0gdGFibGVfcmVhZCAoZmlsZSk7CisgICAgfQorICAvKiBpbnNlcnQgaXQgKi8KKyAgaWYgKCFmaWx0ZXJfaXNfc3Vic2V0IChvcHRpb25zLmZsYWdzX2ZpbHRlciwgbmV3X2Z1bmN0aW9uLT5mbGFncykpCisgICAgeworICAgICAgaWYgKG9wdGlvbnMud2Fybi5kaXNjYXJkKQorCW5vdGlmeSAobmV3X2Z1bmN0aW9uLT5saW5lLCAiRGlzY2FyZGluZyBmdW5jdGlvbiAlcyAtIGZpbHRlciBmbGFnc1xuIiwKKwkJbmV3X2Z1bmN0aW9uLT5uYW1lKTsKKyAgICB9CisgIGVsc2UgaWYgKG5ld19mdW5jdGlvbi0+bW9kZWxzICE9IE5VTEwKKwkgICAmJiAhZmlsdGVyX2lzX2NvbW1vbiAob3B0aW9ucy5tb2RlbF9maWx0ZXIsIG5ld19mdW5jdGlvbi0+bW9kZWxzKSkKKyAgICB7CisgICAgICBpZiAob3B0aW9ucy53YXJuLmRpc2NhcmQpCisJbm90aWZ5IChuZXdfZnVuY3Rpb24tPmxpbmUsICJEaXNjYXJkaW5nIGZ1bmN0aW9uICVzIC0gZmlsdGVyIG1vZGVsc1xuIiwKKwkJbmV3X2Z1bmN0aW9uLT5uYW1lKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB3aGlsZSAoKmxpc3QgIT0gTlVMTCkKKwlsaXN0ID0gJigqbGlzdCktPm5leHQ7CisgICAgICAqbGlzdCA9IG5ld19mdW5jdGlvbjsKKyAgICAgIGlmIChsaXN0X2VudHJ5ICE9IE5VTEwpCisJKmxpc3RfZW50cnkgPSBuZXdfZnVuY3Rpb247CisgICAgfQorICAvKiBkb25lICovCisgIHJldHVybiByZWNvcmQ7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9pbnNuX21vZGVsX3JlY29yZCAodGFibGUgKmZpbGUsCisJCQkgdGFibGVfZW50cnkgKnJlY29yZCwKKwkJCSBpbnNuX2VudHJ5ICppbnNuLAorCQkJIG1vZGVsX3RhYmxlICptb2RlbCkKK3sKKyAgaW5zbl9tb2RlbF9lbnRyeSAqKmxhc3RfaW5zbl9tb2RlbDsKKyAgaW5zbl9tb2RlbF9lbnRyeSAqbmV3X2luc25fbW9kZWwgPSBaQUxMT0MgKGluc25fbW9kZWxfZW50cnkpOworICAvKiBwYXJzZSBpdCAqLworICBuZXdfaW5zbl9tb2RlbC0+bGluZSA9IHJlY29yZC0+bGluZTsKKyAgaWYgKHJlY29yZC0+bnJfZmllbGRzID4gaW5zbl9tb2RlbF91bml0X2RhdGFfZmllbGQpCisgICAgbmV3X2luc25fbW9kZWwtPnVuaXRfZGF0YSA9IHJlY29yZC0+ZmllbGRbaW5zbl9tb2RlbF91bml0X2RhdGFfZmllbGRdOworICBuZXdfaW5zbl9tb2RlbC0+aW5zbiA9IGluc247CisgIC8qIHBhcnNlIHRoZSBtb2RlbCBuYW1lcywgdmVyaWZ5IHRoYXQgYWxsIHdlcmUgZGVmaW5lZCAqLworICBuZXdfaW5zbl9tb2RlbC0+bmFtZXMgPSBOVUxMOworICBmaWx0ZXJfcGFyc2UgKCZuZXdfaW5zbl9tb2RlbC0+bmFtZXMsCisJCXJlY29yZC0+ZmllbGRbaW5zbl9tb2RlbF9uYW1lX2ZpZWxkXSArIDEgLypza2lwIGAqJyovKTsKKyAgaWYgKG5ld19pbnNuX21vZGVsLT5uYW1lcyA9PSBOVUxMKQorICAgIHsKKyAgICAgIC8qIE5vIHByb2Nlc3NvciBuYW1lcyAtIGEgZ2VuZXJpYyBtb2RlbCBlbnRyeSwgZW50ZXIgaXQgaW50byBhbGwKKwkgdGhlIG5vbi1lbXB0eSBmaWVsZHMgKi8KKyAgICAgIGludCBpbmRleDsKKyAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1vZGVsLT5ucl9tb2RlbHM7IGluZGV4KyspCisJaWYgKGluc24tPm1vZGVsW2luZGV4XSA9PSAwKQorCSAgeworCSAgICBpbnNuLT5tb2RlbFtpbmRleF0gPSBuZXdfaW5zbl9tb2RlbDsKKwkgIH0KKyAgICAgIC8qIGFsc28gYWRkIHRoZSBjb21wbGV0ZSBwcm9jZXNzb3Igc2V0IHRvIHRoaXMgcHJvY2Vzc29yJ3Mgc2V0ICovCisgICAgICBmaWx0ZXJfYWRkICgmaW5zbi0+cHJvY2Vzc29ycywgbW9kZWwtPnByb2Nlc3NvcnMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWFzdGVyIG1vZGVsIHJlY29yZCBmb3IgZWFjaCBuYW1lIHNvCisgICAgICAgICB0aGF0IHRoZXkgY2FuIGJlIGxpbmtlZCBpbi4gKi8KKyAgICAgIGludCBpbmRleDsKKyAgICAgIGNoYXIgKm5hbWUgPSAiIjsKKyAgICAgIHdoaWxlICgxKQorCXsKKwkgIG5hbWUgPSBmaWx0ZXJfbmV4dCAobmV3X2luc25fbW9kZWwtPm5hbWVzLCBuYW1lKTsKKwkgIGlmIChuYW1lID09IE5VTEwpIGJyZWFrOworCSAgaW5kZXggPSBmaWx0ZXJfaXNfbWVtYmVyIChtb2RlbC0+cHJvY2Vzc29ycywgbmFtZSkgLSAxOworCSAgaWYgKGluZGV4IDwgMCkKKwkgICAgeworCSAgICAgIGVycm9yIChuZXdfaW5zbl9tb2RlbC0+bGluZSwKKwkJICAgICAibWFjaGluZSBtb2RlbCBgJXMnIHVuZGVmaW5lZFxuIiwgbmFtZSk7CisJICAgIH0KKwkgIC8qIHN0b3JlIGl0IGluIHRoZSBjb3JyZXNwb25kaW5nIG1vZGVsIGFycmF5IGVudHJ5ICovCisJICBpZiAoaW5zbi0+bW9kZWxbaW5kZXhdICE9IE5VTEwKKwkgICAgICAmJiBpbnNuLT5tb2RlbFtpbmRleF0tPm5hbWVzICE9IE5VTEwpCisJICAgIHsKKwkgICAgICB3YXJuaW5nIChuZXdfaW5zbl9tb2RlbC0+bGluZSwKKwkJICAgICAgICJtYWNoaW5lIG1vZGVsIGAlcycgcHJldmlvdXNseSBkZWZpbmVkXG4iLCBuYW1lKTsKKwkgICAgICBlcnJvciAoaW5zbi0+bW9kZWxbaW5kZXhdLT5saW5lLCAiZWFybGllciBkZWZpbml0aW9uXG4iKTsKKwkgICAgfQorCSAgaW5zbi0+bW9kZWxbaW5kZXhdID0gbmV3X2luc25fbW9kZWw7CisJICAvKiBhbHNvIGFkZCB0aGUgbmFtZSB0byB0aGUgaW5zdHJ1Y3Rpb25zIHByb2Nlc3NvciBzZXQgYXMgYW4KKwkgICAgIGFsdGVybmF0aXZlIGxvb2t1cCBtZWNoYW5pc20gKi8KKwkgIGZpbHRlcl9wYXJzZSAoJmluc24tPnByb2Nlc3NvcnMsIG5hbWUpOworCX0KKyAgICB9CisjaWYgMAorICAvKiBmb3Igc29tZSByZWFzb24gcmVjb3JkIHRoZSBtYXggbGVuZ3RoIG9mIGFueQorICAgICBmdW5jdGlvbiB1bml0IGZpZWxkICovCisgIGludCBsZW4gPSBzdHJsZW4gKGluc25fbW9kZWxfcHRyLT5maWVsZFtpbnNuX21vZGVsX2ZpZWxkc10pOworICBpZiAobW9kZWwtPm1heF9tb2RlbF9maWVsZHNfbGVuIDwgbGVuKQorICAgIG1vZGVsLT5tYXhfbW9kZWxfZmllbGRzX2xlbiA9IGxlbjsKKyNlbmRpZgorICAvKiBsaW5rIGl0IGluICovCisgIGxhc3RfaW5zbl9tb2RlbCA9ICZpbnNuLT5tb2RlbHM7CisgIHdoaWxlICgoKmxhc3RfaW5zbl9tb2RlbCkgIT0gTlVMTCkKKyAgICBsYXN0X2luc25fbW9kZWwgPSAmKCpsYXN0X2luc25fbW9kZWwpLT5uZXh0OworICAqbGFzdF9pbnNuX21vZGVsID0gbmV3X2luc25fbW9kZWw7Cit9CisKKworc3RhdGljIHZvaWQKK3BhcnNlX2luc25fbW5lbW9uaWNfcmVjb3JkICh0YWJsZSAqZmlsZSwKKwkJCSAgICB0YWJsZV9lbnRyeSAqcmVjb3JkLAorCQkJICAgIGluc25fZW50cnkgKmluc24pCit7CisgIGluc25fbW5lbW9uaWNfZW50cnkgKipsYXN0X2luc25fbW5lbW9uaWM7CisgIGluc25fbW5lbW9uaWNfZW50cnkgKm5ld19pbnNuX21uZW1vbmljID0gWkFMTE9DIChpbnNuX21uZW1vbmljX2VudHJ5KTsKKyAgLyogcGFyc2UgaXQgKi8KKyAgbmV3X2luc25fbW5lbW9uaWMtPmxpbmUgPSByZWNvcmQtPmxpbmU7CisgIEFTU0VSVCAocmVjb3JkLT5ucl9maWVsZHMgPiBpbnNuX21uZW1vbmljX2Zvcm1hdF9maWVsZCk7CisgIG5ld19pbnNuX21uZW1vbmljLT5mb3JtYXQgPSByZWNvcmQtPmZpZWxkW2luc25fbW5lbW9uaWNfZm9ybWF0X2ZpZWxkXTsKKyAgQVNTRVJUIChuZXdfaW5zbl9tbmVtb25pYy0+Zm9ybWF0WzBdID09ICciJyk7CisgIGlmIChuZXdfaW5zbl9tbmVtb25pYy0+Zm9ybWF0W3N0cmxlbiAobmV3X2luc25fbW5lbW9uaWMtPmZvcm1hdCkgLSAxXSAhPSAnIicpCisgICAgZXJyb3IgKG5ld19pbnNuX21uZW1vbmljLT5saW5lLCAiTWlzc2luZyBjbG9zaW5nIGRvdWJsZSBxdW90ZSBpbiBtbmVtb25pYyBmaWVsZFxuIik7CisgIGlmIChyZWNvcmQtPm5yX2ZpZWxkcyA+IGluc25fbW5lbW9uaWNfY29uZGl0aW9uX2ZpZWxkKQorICAgIG5ld19pbnNuX21uZW1vbmljLT5jb25kaXRpb24gPSByZWNvcmQtPmZpZWxkW2luc25fbW5lbW9uaWNfY29uZGl0aW9uX2ZpZWxkXTsKKyAgbmV3X2luc25fbW5lbW9uaWMtPmluc24gPSBpbnNuOworICAvKiBpbnNlcnQgaXQgKi8KKyAgbGFzdF9pbnNuX21uZW1vbmljID0gJmluc24tPm1uZW1vbmljczsKKyAgd2hpbGUgKCgqbGFzdF9pbnNuX21uZW1vbmljKSAhPSBOVUxMKQorICAgIGxhc3RfaW5zbl9tbmVtb25pYyA9ICYoKmxhc3RfaW5zbl9tbmVtb25pYyktPm5leHQ7CisgIGluc24tPm5yX21uZW1vbmljcysrOworICAqbGFzdF9pbnNuX21uZW1vbmljID0gbmV3X2luc25fbW5lbW9uaWM7Cit9CisKKworc3RhdGljIHRhYmxlX2VudHJ5ICoKK3BhcnNlX21hY3JvX3JlY29yZCAodGFibGUgKmZpbGUsCisJCSAgICB0YWJsZV9lbnRyeSAqcmVjb3JkKQoreworI2lmIDEKKyAgZXJyb3IgKHJlY29yZC0+bGluZSwgIk1hY3JvcyBhcmUgbm90IGltcGxlbWVudGVkIik7CisjZWxzZQorICAvKiBwYXJzZSB0aGUgZGVmaW5lIHJlY29yZCAqLworICBpZiAocmVjb3JkLT5ucl9maWVsZHMgPCBucl9kZWZpbmVfZmllbGRzKQorICAgIGVycm9yIChyZWNvcmQtPmxpbmUsICJJbmNvcnJlY3QgbnIgZmllbGRzIGZvciBkZWZpbmUgcmVjb3JkXG4iKTsKKyAgLyogcHJvY2VzcyBpdCAqLworICBpZiAoIWlzX2ZpbHRlcmVkX291dCAob3B0aW9ucy5mbGFnc19maWx0ZXIsCisJCQlyZWNvcmQtPmZpZWxkW3JlY29yZF9maWx0ZXJfZmxhZ3NfZmllbGRdKQorICAgICAgJiYgIWlzX2ZpbHRlcmVkX291dCAob3B0aW9ucy5tb2RlbF9maWx0ZXIsCisJCQkgICByZWNvcmQtPmZpZWxkW3JlY29yZF9maWx0ZXJfbW9kZWxzX2ZpZWxkXSkpCisgICAgeworICAgICAgdGFibGVfZGVmaW5lIChmaWxlLAorCQkgICAgcmVjb3JkLT5saW5lLAorCQkgICAgcmVjb3JkLT5maWVsZFttYWNyb19uYW1lX2ZpZWxkXSwKKwkJICAgIHJlY29yZC0+ZmllbGRbbWFjcm9fYXJnc19maWVsZF0sCisJCSAgICByZWNvcmQtPmZpZWxkW21hY3JvX2V4cHJfZmllbGRdKTsKKyAgICB9ICAKKyAgcmVjb3JkID0gdGFibGVfcmVhZCAoZmlsZSk7CisjZW5kaWYKKyAgcmV0dXJuIHJlY29yZDsKK30KKworCitpbnNuX3RhYmxlICoKK2xvYWRfaW5zbl90YWJsZSAoY2hhciAqZmlsZV9uYW1lLAorCQkgY2FjaGVfZW50cnkgKmNhY2hlKQoreworICB0YWJsZSAqZmlsZSA9IHRhYmxlX29wZW4gKGZpbGVfbmFtZSk7CisgIHRhYmxlX2VudHJ5ICpyZWNvcmQgPSB0YWJsZV9yZWFkIChmaWxlKTsKKworICBpbnNuX3RhYmxlICppc2EgPSBaQUxMT0MgKGluc25fdGFibGUpOworICBtb2RlbF90YWJsZSAqbW9kZWwgPSBaQUxMT0MgKG1vZGVsX3RhYmxlKTsKKyAgCisgIGlzYS0+bW9kZWwgPSBtb2RlbDsKKyAgaXNhLT5jYWNoZXMgPSBjYWNoZTsKKworICB3aGlsZSAocmVjb3JkICE9IE5VTEwpCisgICAgeworCisgICAgICBzd2l0Y2ggKHJlY29yZF90eXBlIChyZWNvcmQpKQorCXsKKworCWNhc2UgaW5jbHVkZV9yZWNvcmQ6CisJICB7CisJICAgIHJlY29yZCA9IHBhcnNlX2luY2x1ZGVfcmVjb3JkIChmaWxlLCByZWNvcmQpOworCSAgICBicmVhazsKKwkgIH0KKworCWNhc2Ugb3B0aW9uX3JlY29yZDoKKwkgIHsKKwkgICAgaWYgKGlzYS0+aW5zbnMgIT0gTlVMTCkKKwkgICAgICBlcnJvciAocmVjb3JkLT5saW5lLCAiT3B0aW9uIGFmdGVyIGZpcnN0IGluc3RydWN0aW9uXG4iKTsKKwkgICAgcmVjb3JkID0gcGFyc2Vfb3B0aW9uX3JlY29yZCAoZmlsZSwgcmVjb3JkKTsKKwkgICAgYnJlYWs7CisJICB9CisJCisJY2FzZSBzdHJpbmdfZnVuY3Rpb25fcmVjb3JkOgorCSAgeworCSAgICBmdW5jdGlvbl9lbnRyeSAqZnVuY3Rpb24gPSBOVUxMOworCSAgICByZWNvcmQgPSBwYXJzZV9mdW5jdGlvbl9yZWNvcmQgKGZpbGUsIHJlY29yZCwKKwkJCQkJICAgICZpc2EtPmZ1bmN0aW9ucywKKwkJCQkJICAgICZmdW5jdGlvbiwKKwkJCQkJICAgIDAvKmlzLWludGVybmFsKi8sCisJCQkJCSAgICBtb2RlbCk7CisJICAgIC8qIGNvbnZlcnQgYSBzdHJpbmcgZnVuY3Rpb24gcmVjb3JkIGludG8gYW4gaW50ZXJuYWwgZnVuY3Rpb24gKi8KKwkgICAgaWYgKGZ1bmN0aW9uICE9IE5VTEwpCisJICAgICAgeworCQljaGFyICpuYW1lID0gTlpBTExPQyAoY2hhciwKKwkJCQkgICAgICAoc3RybGVuICgic3RyXyIpCisJCQkJICAgICAgICsgc3RybGVuIChmdW5jdGlvbi0+bmFtZSkKKwkJCQkgICAgICAgKyAxKSk7CisJCXN0cmNhdCAobmFtZSwgInN0cl8iKTsKKwkJc3RyY2F0IChuYW1lLCBmdW5jdGlvbi0+bmFtZSk7CisJCWZ1bmN0aW9uLT5uYW1lID0gbmFtZTsKKwkJZnVuY3Rpb24tPnR5cGUgPSAiY29uc3QgY2hhciAqIjsKKwkgICAgICB9CisJICAgIGJyZWFrOworCSAgfQorCQorCWNhc2UgZnVuY3Rpb25fcmVjb3JkOiAvKiBmdW5jdGlvbiByZWNvcmQgKi8KKwkgIHsKKwkgICAgcmVjb3JkID0gcGFyc2VfZnVuY3Rpb25fcmVjb3JkIChmaWxlLCByZWNvcmQsCisJCQkJCSAgICAmaXNhLT5mdW5jdGlvbnMsCisJCQkJCSAgICBOVUxMLAorCQkJCQkgICAgMC8qaXMtaW50ZXJuYWwqLywKKwkJCQkJICAgIG1vZGVsKTsKKwkgICAgYnJlYWs7CisJICB9CisKKwljYXNlIGludGVybmFsX3JlY29yZDoKKwkgIHsKKwkgICAgLyogb25seSBpbnNlcnQgaXQgaW50byB0aGUgZnVuY3Rpb24gbGlzdCBpZiBpdCBpcyB1bmtub3duICovCisJICAgIGZ1bmN0aW9uX2VudHJ5ICpmdW5jdGlvbiA9IE5VTEw7CisJICAgIHJlY29yZCA9IHBhcnNlX2Z1bmN0aW9uX3JlY29yZCAoZmlsZSwgcmVjb3JkLAorCQkJCQkgICAgJmlzYS0+ZnVuY3Rpb25zLAorCQkJCQkgICAgJmZ1bmN0aW9uLAorCQkJCQkgICAgMS8qaXMtaW50ZXJuYWwqLywKKwkJCQkJICAgIG1vZGVsKTsKKwkgICAgLyogY2hlY2sgd2hhdCB3YXMgaW5zZXJ0ZWQgdG8gc2VlIGlmIGEgcHNldWRvLWluc3RydWN0aW9uCisgICAgICAgICAgICAgICBlbnRyeSBhbHNvIG5lZWRzIHRvIGJlIGNyZWF0ZWQgKi8KKwkgICAgaWYgKGZ1bmN0aW9uICE9IE5VTEwpCisJICAgICAgeworCQlpbnNuX2VudHJ5ICoqaW5zbiA9IE5VTEw7CisJCWlmIChzdHJjbXAgKGZ1bmN0aW9uLT5uYW1lLCAiaWxsZWdhbCIpID09IDApCisJCSAgeworCQkgICAgLyogaWxsZWdhbCBmdW5jdGlvbiBzYXZlIGl0IGF3YXkgKi8KKwkJICAgIGlmIChpc2EtPmlsbGVnYWxfaW5zbiAhPSBOVUxMKQorCQkgICAgICB7CisJCQl3YXJuaW5nIChmdW5jdGlvbi0+bGluZSwKKwkJCQkgIk11bHRpcGxlIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gZGVmaW5pdGlvbnNcbiIpOworCQkJZXJyb3IgKGlzYS0+aWxsZWdhbF9pbnNuLT5saW5lLAorCQkJICAgICAgICJMb2NhdGlvbiBvZiBmaXJzdCBpbGxlZ2FsIGluc3RydWN0aW9uXG4iKTsKKwkJICAgICAgfQorCQkgICAgZWxzZQorCQkgICAgICBpbnNuID0gJmlzYS0+aWxsZWdhbF9pbnNuOworCQkgIH0KKwkJaWYgKGluc24gIT0gTlVMTCkKKwkJICB7CisJCSAgICAqaW5zbiA9IFpBTExPQyAoaW5zbl9lbnRyeSk7CisJCSAgICAoKmluc24pLT5saW5lID0gZnVuY3Rpb24tPmxpbmU7CisJCSAgICAoKmluc24pLT5uYW1lID0gZnVuY3Rpb24tPm5hbWU7CisJCSAgICAoKmluc24pLT5jb2RlID0gZnVuY3Rpb24tPmNvZGU7CisJCSAgfQorCSAgICAgIH0KKwkgICAgYnJlYWs7CisJICB9CisJICAKKwljYXNlIHNjcmF0Y2hfcmVjb3JkOiAvKiBjYWNoZSBtYWNybyByZWNvcmRzICovCisJY2FzZSBjYWNoZV9yZWNvcmQ6CisJY2FzZSBjb21wdXRlX3JlY29yZDoKKwkgIHsKKwkgICAgY2FjaGVfZW50cnkgKm5ld19jYWNoZTsKKwkgICAgLyogcGFyc2UgdGhlIGNhY2hlIHJlY29yZCAqLworCSAgICBpZiAocmVjb3JkLT5ucl9maWVsZHMgPCBucl9jYWNoZV9maWVsZHMpCisJICAgICAgZXJyb3IgKHJlY29yZC0+bGluZSwKKwkJICAgICAiSW5jb3JyZWN0IG5yIG9mIGZpZWxkcyBmb3Igc2NyYXRjaC9jYWNoZS9jb21wdXRlIHJlY29yZFxuIik7CisJICAgIC8qIGNyZWF0ZSBpdCAqLworCSAgICBuZXdfY2FjaGUgPSBaQUxMT0MgKGNhY2hlX2VudHJ5KTsKKwkgICAgbmV3X2NhY2hlLT5saW5lID0gcmVjb3JkLT5saW5lOworCSAgICBmaWx0ZXJfcGFyc2UgKCZuZXdfY2FjaGUtPmZsYWdzLAorCQkJICByZWNvcmQtPmZpZWxkW3JlY29yZF9maWx0ZXJfZmxhZ3NfZmllbGRdKTsKKwkgICAgZmlsdGVyX3BhcnNlICgmbmV3X2NhY2hlLT5tb2RlbHMsCisJCQkgIHJlY29yZC0+ZmllbGRbcmVjb3JkX2ZpbHRlcl9tb2RlbHNfZmllbGRdKTsKKwkgICAgbmV3X2NhY2hlLT50eXBlID0gcmVjb3JkLT5maWVsZFtjYWNoZV90eXBlZGVmX2ZpZWxkXTsKKwkgICAgbmV3X2NhY2hlLT5uYW1lID0gcmVjb3JkLT5maWVsZFtjYWNoZV9uYW1lX2ZpZWxkXTsKKwkgICAgZmlsdGVyX3BhcnNlICgmbmV3X2NhY2hlLT5vcmlnaW5hbF9maWVsZHMsCisJCQkgIHJlY29yZC0+ZmllbGRbY2FjaGVfb3JpZ2luYWxfZmllbGRzX2ZpZWxkXSk7CisJICAgIG5ld19jYWNoZS0+ZXhwcmVzc2lvbiA9IHJlY29yZC0+ZmllbGRbY2FjaGVfZXhwcmVzc2lvbl9maWVsZF07CisJICAgIC8qIGluc2VydCBpdCBidXQgb25seSBpZiBub3QgZmlsdGVyZWQgb3V0ICovCisJICAgIGlmICghZmlsdGVyX2lzX3N1YnNldCAob3B0aW9ucy5mbGFnc19maWx0ZXIsIG5ld19jYWNoZS0+ZmxhZ3MpKQorCSAgICAgIHsKKwkJbm90aWZ5IChuZXdfY2FjaGUtPmxpbmUsICJEaXNjYXJkaW5nIGNhY2hlIGVudHJ5ICVzIC0gZmlsdGVyIGZsYWdzXG4iLAorCQkJbmV3X2NhY2hlLT5uYW1lKTsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKGlzX2ZpbHRlcmVkX291dCAob3B0aW9ucy5tb2RlbF9maWx0ZXIsCisJCQkJICAgICAgcmVjb3JkLT5maWVsZFtyZWNvcmRfZmlsdGVyX21vZGVsc19maWVsZF0pKQorCSAgICAgIHsKKwkJbm90aWZ5IChuZXdfY2FjaGUtPmxpbmUsICJEaXNjYXJkaW5nIGNhY2hlIGVudHJ5ICVzIC0gZmlsdGVyIG1vZGVsc1xuIiwKKwkJCW5ld19jYWNoZS0+bmFtZSk7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQljYWNoZV9lbnRyeSAqKmxhc3Q7CisJCWxhc3QgPSAmaXNhLT5jYWNoZXM7CisJCXdoaWxlICgqbGFzdCAhPSBOVUxMKQorCQkgIGxhc3QgPSAmKCpsYXN0KS0+bmV4dDsKKwkJKmxhc3QgPSBuZXdfY2FjaGU7CisJICAgICAgfQorCSAgICAvKiBhZHZhbmNlIHRoaW5ncyAqLworCSAgICByZWNvcmQgPSB0YWJsZV9yZWFkIChmaWxlKTsKKwkgICAgYnJlYWs7CisJICB9CisJCisJLyogbW9kZWwgcmVjb3JkcyAqLworCWNhc2UgbW9kZWxfcHJvY2Vzc29yX3JlY29yZDoKKwkgIHsKKwkgICAgbW9kZWxfZW50cnkgKm5ld19tb2RlbDsKKwkgICAgLyogcGFyc2UgdGhlIG1vZGVsICovCisJICAgIGlmIChyZWNvcmQtPm5yX2ZpZWxkcyA8IG5yX21vZGVsX3Byb2Nlc3Nvcl9maWVsZHMpCisJICAgICAgZXJyb3IgKHJlY29yZC0+bGluZSwgIkluY29ycmVjdCBuciBvZiBmaWVsZHMgZm9yIG1vZGVsIHJlY29yZFxuIik7CisJICAgIGlmIChpc2EtPmluc25zICE9IE5VTEwpCisJICAgICAgZXJyb3IgKHJlY29yZC0+bGluZSwgIk1vZGVsIGFwcGVhcnMgYWZ0ZXIgZmlyc3QgaW5zdHJ1Y3Rpb25cbiIpOworCSAgICBuZXdfbW9kZWwgPSBaQUxMT0MgKG1vZGVsX2VudHJ5KTsKKwkgICAgZmlsdGVyX3BhcnNlICgmbmV3X21vZGVsLT5mbGFncywKKwkJCSAgcmVjb3JkLT5maWVsZFtyZWNvcmRfZmlsdGVyX2ZsYWdzX2ZpZWxkXSk7CisJICAgIG5ld19tb2RlbC0+bGluZSA9IHJlY29yZC0+bGluZTsKKwkgICAgbmV3X21vZGVsLT5uYW1lID0gcmVjb3JkLT5maWVsZFttb2RlbF9uYW1lX2ZpZWxkXTsKKwkgICAgbmV3X21vZGVsLT5mdWxsX25hbWUgPSByZWNvcmQtPmZpZWxkW21vZGVsX2Z1bGxfbmFtZV9maWVsZF07CisJICAgIG5ld19tb2RlbC0+dW5pdF9kYXRhID0gcmVjb3JkLT5maWVsZFttb2RlbF91bml0X2RhdGFfZmllbGRdOworCSAgICAvKiBvbmx5IGluc2VydCBpdCBpZiBub3QgZmlsdGVyZWQgb3V0ICovCisJICAgIGlmICghZmlsdGVyX2lzX3N1YnNldCAob3B0aW9ucy5mbGFnc19maWx0ZXIsIG5ld19tb2RlbC0+ZmxhZ3MpKQorCSAgICAgIHsKKwkJbm90aWZ5IChuZXdfbW9kZWwtPmxpbmUsICJEaXNjYXJkaW5nIHByb2Nlc3NvciBtb2RlbCAlcyAtIGZpbHRlciBmbGFnc1xuIiwKKwkJCW5ld19tb2RlbC0+bmFtZSk7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChpc19maWx0ZXJlZF9vdXQgKG9wdGlvbnMubW9kZWxfZmlsdGVyLAorCQkJCSAgICAgIHJlY29yZC0+ZmllbGRbcmVjb3JkX2ZpbHRlcl9tb2RlbHNfZmllbGRdKSkKKwkgICAgICB7CisJCW5vdGlmeSAobmV3X21vZGVsLT5saW5lLCAiRGlzY2FyZGluZyBwcm9jZXNzb3IgbW9kZWwgJXMgLSBmaWx0ZXIgbW9kZWxzXG4iLAorCQkJbmV3X21vZGVsLT5uYW1lKTsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKGZpbHRlcl9pc19tZW1iZXIgKG1vZGVsLT5wcm9jZXNzb3JzLCBuZXdfbW9kZWwtPm5hbWUpKQorCSAgICAgIHsKKwkJZXJyb3IgKG5ld19tb2RlbC0+bGluZSwgIkR1cGxpY2F0ZSBwcm9jZXNzb3IgbW9kZWwgJXNcbiIsCisJCSAgICAgICBuZXdfbW9kZWwtPm5hbWUpOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJbW9kZWxfZW50cnkgKipsYXN0OworCQlsYXN0ID0gJm1vZGVsLT5tb2RlbHM7CisJCXdoaWxlICgqbGFzdCAhPSBOVUxMKQorCQkgIGxhc3QgPSAmKCpsYXN0KS0+bmV4dDsKKwkJKmxhc3QgPSBuZXdfbW9kZWw7CisJCS8qIGNvdW50IGl0ICovCisJCW1vZGVsLT5ucl9tb2RlbHMgKys7CisJCWZpbHRlcl9wYXJzZSAoJm1vZGVsLT5wcm9jZXNzb3JzLCBuZXdfbW9kZWwtPm5hbWUpOworCSAgICAgIH0KKwkgICAgLyogYWR2YW5jZSB0aGluZ3MgKi8KKwkgICAgcmVjb3JkID0gdGFibGVfcmVhZCAoZmlsZSk7CisJICB9CisJICBicmVhazsKKwkgIAorCWNhc2UgbW9kZWxfbWFjcm9fcmVjb3JkOgorCSAgcmVjb3JkID0gcGFyc2VfbW9kZWxfZGF0YV9yZWNvcmQgKGlzYSwgZmlsZSwgcmVjb3JkLAorCQkJCQkgICAgbnJfbW9kZWxfbWFjcm9fZmllbGRzLAorCQkJCQkgICAgJm1vZGVsLT5tYWNyb3MpOworCSAgYnJlYWs7CisJICAKKwljYXNlIG1vZGVsX2RhdGFfcmVjb3JkOgorCSAgcmVjb3JkID0gcGFyc2VfbW9kZWxfZGF0YV9yZWNvcmQgKGlzYSwgZmlsZSwgcmVjb3JkLAorCQkJCQkgICAgbnJfbW9kZWxfZGF0YV9maWVsZHMsCisJCQkJCSAgICAmbW9kZWwtPmRhdGEpOworCSAgYnJlYWs7CisJICAKKwljYXNlIG1vZGVsX3N0YXRpY19yZWNvcmQ6CisJICByZWNvcmQgPSBwYXJzZV9mdW5jdGlvbl9yZWNvcmQgKGZpbGUsIHJlY29yZCwKKwkJCQkJICAmbW9kZWwtPnN0YXRpY3MsCisJCQkJCSAgTlVMTCwKKwkJCQkJICAwLyppcyBpbnRlcm5hbCovLAorCQkJCQkgIG1vZGVsKTsKKwkgIGJyZWFrOworCSAgCisJY2FzZSBtb2RlbF9pbnRlcm5hbF9yZWNvcmQ6CisJICByZWNvcmQgPSBwYXJzZV9mdW5jdGlvbl9yZWNvcmQgKGZpbGUsIHJlY29yZCwKKwkJCQkJICAmbW9kZWwtPmludGVybmFscywKKwkJCQkJICBOVUxMLAorCQkJCQkgIDEvKmlzIGludGVybmFsKi8sCisJCQkJCSAgbW9kZWwpOworCSAgYnJlYWs7CisJICAKKwljYXNlIG1vZGVsX2Z1bmN0aW9uX3JlY29yZDoKKwkgIHJlY29yZCA9IHBhcnNlX2Z1bmN0aW9uX3JlY29yZCAoZmlsZSwgcmVjb3JkLAorCQkJCQkgICZtb2RlbC0+ZnVuY3Rpb25zLAorCQkJCQkgIE5VTEwsCisJCQkJCSAgMC8qaXMgaW50ZXJuYWwqLywKKwkJCQkJICBtb2RlbCk7CisJICBicmVhazsKKwkgIAorCWNhc2UgaW5zbl9yZWNvcmQ6IC8qIGluc3RydWN0aW9uIHJlY29yZHMgKi8KKwkgIHsKKwkgICAgaW5zbl9lbnRyeSAqbmV3X2luc247CisJICAgIGNoYXIgKmZvcm1hdDsKKwkgICAgLyogcGFyc2UgdGhlIGluc3RydWN0aW9uICovCisJICAgIGlmIChyZWNvcmQtPm5yX2ZpZWxkcyA8IG5yX2luc25fZmllbGRzKQorCSAgICAgIGVycm9yIChyZWNvcmQtPmxpbmUsICJJbmNvcnJlY3QgbnIgb2YgZmllbGRzIGZvciBpbnNuIHJlY29yZFxuIik7CisJICAgIG5ld19pbnNuID0gWkFMTE9DIChpbnNuX2VudHJ5KTsKKwkgICAgbmV3X2luc24tPmxpbmUgPSByZWNvcmQtPmxpbmU7CisJICAgIGZpbHRlcl9wYXJzZSAoJm5ld19pbnNuLT5mbGFncywKKwkJCSAgcmVjb3JkLT5maWVsZFtyZWNvcmRfZmlsdGVyX2ZsYWdzX2ZpZWxkXSk7CisJICAgIC8qIHNhdmUgdGhlIGZvcm1hdCBmaWVsZC4gIENhbid0IHBhcnNlIGl0IHVudGlsIGFmdGVyIHRoZQorICAgICAgICAgICAgICAgZmlsdGVyLW91dCBjaGVja3MuICBDb3VsZCBiZSBmaWx0ZXJlZCBvdXQgYmVjYXVzZSB0aGUKKyAgICAgICAgICAgICAgIGZvcm1hdCBpcyBpbnZhbGlkICovCisJICAgIGZvcm1hdCA9IHJlY29yZC0+ZmllbGRbaW5zbl93b3JkX2ZpZWxkXTsKKwkgICAgbmV3X2luc24tPmZvcm1hdF9uYW1lID0gcmVjb3JkLT5maWVsZFtpbnNuX2Zvcm1hdF9uYW1lX2ZpZWxkXTsKKwkgICAgaWYgKG9wdGlvbnMuZm9ybWF0X25hbWVfZmlsdGVyICE9IE5VTEwKKwkJJiYgIWZpbHRlcl9pc19tZW1iZXIgKG9wdGlvbnMuZm9ybWF0X25hbWVfZmlsdGVyLAorCQkJCSAgICAgIG5ld19pbnNuLT5mb3JtYXRfbmFtZSkpCisJICAgICAgZXJyb3IgKG5ld19pbnNuLT5saW5lLCAiVW5yZWNvbml6ZWQgaW5zdHJ1Y3Rpb24gZm9ybWF0IG5hbWUgYCVzJ1xuIiwKKwkJICAgICBuZXdfaW5zbi0+Zm9ybWF0X25hbWUpOworCSAgICBmaWx0ZXJfcGFyc2UgKCZuZXdfaW5zbi0+b3B0aW9ucywKKwkJCSAgcmVjb3JkLT5maWVsZFtpbnNuX29wdGlvbnNfZmllbGRdKTsKKwkgICAgbmV3X2luc24tPm5hbWUgPSByZWNvcmQtPmZpZWxkW2luc25fbmFtZV9maWVsZF07CisJICAgIHJlY29yZCA9IHRhYmxlX3JlYWQgKGZpbGUpOworCSAgICAvKiBQYXJzZSBhbnkgbW9kZWwvYXNzZW1iZXIgcmVjb3JkcyAqLworCSAgICBuZXdfaW5zbi0+bnJfbW9kZWxzID0gbW9kZWwtPm5yX21vZGVsczsKKwkgICAgbmV3X2luc24tPm1vZGVsID0gTlpBTExPQyAoaW5zbl9tb2RlbF9lbnRyeSosIG1vZGVsLT5ucl9tb2RlbHMgKyAxKTsKKwkgICAgd2hpbGUgKHJlY29yZCAhPSBOVUxMKQorCSAgICAgIHsKKwkJaWYgKHJlY29yZF9wcmVmaXhfaXMgKHJlY29yZCwgJyonLCBucl9pbnNuX21vZGVsX2ZpZWxkcykpCisJCSAgcGFyc2VfaW5zbl9tb2RlbF9yZWNvcmQgKGZpbGUsIHJlY29yZCwgbmV3X2luc24sIG1vZGVsKTsKKwkJZWxzZSBpZiAocmVjb3JkX3ByZWZpeF9pcyAocmVjb3JkLCAnIicsIG5yX2luc25fbW5lbW9uaWNfZmllbGRzKSkKKwkJICBwYXJzZV9pbnNuX21uZW1vbmljX3JlY29yZCAoZmlsZSwgcmVjb3JkLCBuZXdfaW5zbik7CisJCWVsc2UKKwkJICBicmVhazsKKwkJLyogYWR2YW5jZSAqLworCQlyZWNvcmQgPSB0YWJsZV9yZWFkIChmaWxlKTsKKwkgICAgICB9CisJICAgIC8qIFBhcnNlIHRoZSBjb2RlIHJlY29yZCAqLworCSAgICBpZiAocmVjb3JkICE9IE5VTEwgJiYgcmVjb3JkLT50eXBlID09IHRhYmxlX2NvZGVfZW50cnkpCisJICAgICAgeworCQluZXdfaW5zbi0+Y29kZSA9IHJlY29yZDsKKwkJcmVjb3JkID0gdGFibGVfcmVhZCAoZmlsZSk7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChvcHRpb25zLndhcm4udW5pbXBsZW1lbnRlZCkKKwkgICAgICBub3RpZnkgKG5ld19pbnNuLT5saW5lLCAidW5pbXBsZW1lbnRlZFxuIik7CisJICAgIC8qIGluc2VydCBpdCAqLworCSAgICBpZiAoIWZpbHRlcl9pc19zdWJzZXQgKG9wdGlvbnMuZmxhZ3NfZmlsdGVyLCBuZXdfaW5zbi0+ZmxhZ3MpKQorCSAgICAgIHsKKwkJaWYgKG9wdGlvbnMud2Fybi5kaXNjYXJkKQorCQkgIG5vdGlmeSAobmV3X2luc24tPmxpbmUsCisJCQkgICJEaXNjYXJkaW5nIGluc3RydWN0aW9uICVzIChmbGFncy1maWx0ZXIpXG4iLAorCQkJICBuZXdfaW5zbi0+bmFtZSk7CisJICAgICAgfQorCSAgICBlbHNlIGlmIChuZXdfaW5zbi0+cHJvY2Vzc29ycyAhPSBOVUxMCisJCSAgICAgJiYgb3B0aW9ucy5tb2RlbF9maWx0ZXIgIT0gTlVMTAorCQkgICAgICYmICFmaWx0ZXJfaXNfY29tbW9uIChvcHRpb25zLm1vZGVsX2ZpbHRlciwKKwkJCQkJICAgbmV3X2luc24tPnByb2Nlc3NvcnMpKQorCSAgICAgIHsKKwkJLyogb25seSBkaXNjYXJkIGFuIGluc3RydWN0aW9uIGJhc2VkIGluIHRoZSBwcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICBtb2RlbCB3aGVuIGJvdGggdGhlIGluc3RydWN0aW9uIGFuZCB0aGUgb3B0aW9ucyBhcmUKKyAgICAgICAgICAgICAgICAgICBub25lbXB0eSAqLworCQlpZiAob3B0aW9ucy53YXJuLmRpc2NhcmQpCisJCSAgbm90aWZ5IChuZXdfaW5zbi0+bGluZSwKKwkJCSAgIkRpc2NhcmRpbmcgaW5zdHJ1Y3Rpb24gJXMgKHByb2Nlc3Nvci1tb2RlbClcbiIsCisJCQkgIG5ld19pbnNuLT5uYW1lKTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCWluc25fZW50cnkgKipsYXN0OworCQkvKiBmaW5pc2ggdGhlIHBhcnNpbmcgKi8KKwkJcGFyc2VfaW5zbl93b3JkcyAobmV3X2luc24sIGZvcm1hdCk7CisJCS8qIGFwcGVuZCBpdCAqLworCQlsYXN0ID0gJmlzYS0+aW5zbnM7CisJCXdoaWxlICgqbGFzdCkKKwkJICBsYXN0ID0gJigqbGFzdCktPm5leHQ7CisJCSpsYXN0ID0gbmV3X2luc247CisJCS8qIHVwZGF0ZSBnbG9iYWwgaXNhIGNvdW50ZXJzICovCisJCWlzYS0+bnJfaW5zbnMgKys7CisJCWlmIChpc2EtPm1heF9ucl93b3JkcyA8IG5ld19pbnNuLT5ucl93b3JkcykKKwkJICBpc2EtPm1heF9ucl93b3JkcyA9IG5ld19pbnNuLT5ucl93b3JkczsKKwkJZmlsdGVyX2FkZCAoJmlzYS0+ZmxhZ3MsIG5ld19pbnNuLT5mbGFncyk7CisJCWZpbHRlcl9hZGQgKCZpc2EtPm9wdGlvbnMsIG5ld19pbnNuLT5vcHRpb25zKTsKKwkgICAgICB9CisJICAgIGJyZWFrOworCSAgfQorICAgICAgCisJY2FzZSBkZWZpbmVfcmVjb3JkOgorCSAgcmVjb3JkID0gcGFyc2VfbWFjcm9fcmVjb3JkIChmaWxlLCByZWNvcmQpOworCSAgYnJlYWs7CisKKwljYXNlIHVua25vd25fcmVjb3JkOgorCWNhc2UgY29kZV9yZWNvcmQ6CisJICBlcnJvciAocmVjb3JkLT5saW5lLCAiVW5rbm93biBvciB1bmV4cGVjdGVkIGVudHJ5XG4iKTsKKworCisJfQorICAgIH0KKyAgcmV0dXJuIGlzYTsKK30KKworCit2b2lkCitwcmludF9pbnNuX3dvcmRzIChsZiAqZmlsZSwKKwkJICBpbnNuX2VudHJ5ICppbnNuKQoreworICBpbnNuX3dvcmRfZW50cnkgKndvcmQgPSBpbnNuLT53b3JkczsKKyAgaWYgKHdvcmQgIT0gTlVMTCkKKyAgICB7CisgICAgICB3aGlsZSAoMSkKKwl7CisJICBpbnNuX2ZpZWxkX2VudHJ5ICpmaWVsZCA9IHdvcmQtPmZpcnN0OworCSAgd2hpbGUgKDEpCisJICAgIHsKKwkgICAgICBpZiAob3B0aW9ucy5pbnNuX3NwZWNpZnlpbmdfd2lkdGhzKQorCQlsZl9wcmludGYgKGZpbGUsICIlZC4iLCBmaWVsZC0+d2lkdGgpOworCSAgICAgIGVsc2UKKwkJbGZfcHJpbnRmIChmaWxlLCAiJWQuIiwgaTJ0YXJnZXQgKG9wdGlvbnMuaGlfYml0X25yLCBmaWVsZC0+Zmlyc3QpKTsKKwkgICAgICBzd2l0Y2ggKGZpZWxkLT50eXBlKQorCQl7CisJCWNhc2UgaW5zbl9maWVsZF9pbnZhbGlkOgorCQkgIEFTU0VSVCAoMCk7CisJCSAgYnJlYWs7CisJCWNhc2UgaW5zbl9maWVsZF9pbnQ6CisJCSAgbGZfcHJpbnRmIChmaWxlLCAiMHglbHgiLCAobG9uZykgZmllbGQtPnZhbF9pbnQpOworCQkgIGJyZWFrOworCQljYXNlIGluc25fZmllbGRfcmVzZXJ2ZWQ6CisJCSAgbGZfcHJpbnRmIChmaWxlLCAiLyIpOworCQkgIGJyZWFrOworCQljYXNlIGluc25fZmllbGRfd2lsZDoKKwkJICBsZl9wcmludGYgKGZpbGUsICIqIik7CisJCSAgYnJlYWs7CisJCWNhc2UgaW5zbl9maWVsZF9zdHJpbmc6CisJCSAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBmaWVsZC0+dmFsX3N0cmluZyk7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBpZiAoZmllbGQgPT0gd29yZC0+bGFzdCkKKwkJYnJlYWs7CisJICAgICAgZmllbGQgPSBmaWVsZC0+bmV4dDsKKwkgICAgICBsZl9wcmludGYgKGZpbGUsICIsIik7CisJICAgIH0KKwkgIHdvcmQgPSB3b3JkLT5uZXh0OworCSAgaWYgKHdvcmQgPT0gTlVMTCkKKwkgICAgYnJlYWs7CisJICBsZl9wcmludGYgKGZpbGUsICIrIik7CisJfQorICAgIH0KK30KKworCisMCit2b2lkCitmdW5jdGlvbl9lbnRyeV90cmF2ZXJzZSAobGYgKmZpbGUsCisJCQkgZnVuY3Rpb25fZW50cnkgKmZ1bmN0aW9ucywKKwkJCSBmdW5jdGlvbl9lbnRyeV9oYW5kbGVyICpoYW5kbGVyLAorCQkJIHZvaWQgKmRhdGEpCit7CisgIGZ1bmN0aW9uX2VudHJ5ICpmdW5jdGlvbjsKKyAgZm9yIChmdW5jdGlvbiA9IGZ1bmN0aW9uczsgZnVuY3Rpb24gIT0gTlVMTDsgZnVuY3Rpb24gPSBmdW5jdGlvbi0+bmV4dCkKKyAgICB7CisgICAgICBoYW5kbGVyIChmaWxlLCBmdW5jdGlvbiwgZGF0YSk7CisgICAgfQorfQorCit2b2lkCitpbnNuX3RhYmxlX3RyYXZlcnNlX2luc24gKGxmICpmaWxlLAorCQkJICBpbnNuX3RhYmxlICppc2EsCisJCQkgIGluc25fZW50cnlfaGFuZGxlciAqaGFuZGxlciwKKwkJCSAgdm9pZCAqZGF0YSkKK3sKKyAgaW5zbl9lbnRyeSAqaW5zbjsKKyAgZm9yIChpbnNuID0gaXNhLT5pbnNuczsgaW5zbiAhPSBOVUxMOyBpbnNuID0gaW5zbi0+bmV4dCkKKyAgICB7CisgICAgICBoYW5kbGVyIChmaWxlLCBpc2EsIGluc24sIGRhdGEpOworICAgIH0KK30KKworDAorc3RhdGljIHZvaWQKK2R1bXBfZnVuY3Rpb25fZW50cnkgKGxmICpmaWxlLAorCQkgICAgIGNoYXIgKnByZWZpeCwKKwkJICAgICBmdW5jdGlvbl9lbnRyeSAqZW50cnksCisJCSAgICAgY2hhciAqc3VmZml4KQoreworICBsZl9wcmludGYgKGZpbGUsICIlcyhmdW5jdGlvbl9lbnRyeSAqKSAweCVseCIsIHByZWZpeCwgKGxvbmcpIGVudHJ5KTsKKyAgaWYgKGVudHJ5ICE9IE5VTEwpCisgICAgeworICAgICAgZHVtcF9saW5lX3JlZiAoZmlsZSwgIlxuKGxpbmUgIiwgZW50cnktPmxpbmUsICIpIik7CisgICAgICBkdW1wX2ZpbHRlciAoZmlsZSwgIlxuKGZsYWdzICIsIGVudHJ5LT5mbGFncywgIikiKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKHR5cGUgXCIlc1wiKSIsIGVudHJ5LT50eXBlKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5hbWUgXCIlc1wiKSIsIGVudHJ5LT5uYW1lKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKHBhcmFtIFwiJXNcIikiLCBlbnRyeS0+cGFyYW0pOworICAgICAgZHVtcF90YWJsZV9lbnRyeSAoZmlsZSwgIlxuKGNvZGUgIiwgZW50cnktPmNvZGUsICIpIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbihpc19pbnRlcm5hbCAlZCkiLCBlbnRyeS0+aXNfaW50ZXJuYWwpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obmV4dCAweCVseCkiLCAobG9uZykgZW50cnktPm5leHQpOworICAgIH0KKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9mdW5jdGlvbl9lbnRyaWVzIChsZiAqZmlsZSwKKwkJICAgICAgIGNoYXIgKnByZWZpeCwKKwkJICAgICAgIGZ1bmN0aW9uX2VudHJ5ICplbnRyeSwKKwkJICAgICAgIGNoYXIgKnN1ZmZpeCkKK3sKKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBwcmVmaXgpOworICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgd2hpbGUgKGVudHJ5ICE9IE5VTEwpCisgICAgeworICAgICAgZHVtcF9mdW5jdGlvbl9lbnRyeSAoZmlsZSwgIlxuKCIsIGVudHJ5LCAiKSIpOworICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKKyAgICB9CisgIGxmX2luZGVudCAoZmlsZSwgLTEpOworICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Cit9CisKK3N0YXRpYyBjaGFyICoKK2NhY2hlX2VudHJ5X3R5cGVfdG9fc3RyIChjYWNoZV9lbnRyeV90eXBlIHR5cGUpCit7CisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSBzY3JhdGNoX3ZhbHVlOiByZXR1cm4gInNjcmF0Y2giOworICAgIGNhc2UgY2FjaGVfdmFsdWU6IHJldHVybiAiY2FjaGUiOworICAgIGNhc2UgY29tcHV0ZV92YWx1ZTogcmV0dXJuICJjb21wdXRlIjsKKyAgICB9CisgIEVSUk9SICgiQmFkIHN3aXRjaCIpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2R1bXBfY2FjaGVfZW50cnkgKGxmICpmaWxlLAorCQkgIGNoYXIgKnByZWZpeCwKKwkJICBjYWNoZV9lbnRyeSAqZW50cnksCisJCSAgY2hhciAqc3VmZml4KQoreworICBsZl9wcmludGYgKGZpbGUsICIlcyhjYWNoZV9lbnRyeSAqKSAweCVseCIsIHByZWZpeCwgKGxvbmcpIGVudHJ5KTsKKyAgaWYgKGVudHJ5ICE9IE5VTEwpCisgICAgeworICAgICAgZHVtcF9saW5lX3JlZiAoZmlsZSwgIlxuKGxpbmUgIiwgZW50cnktPmxpbmUsICIpIik7CisgICAgICBkdW1wX2ZpbHRlciAoZmlsZSwgIlxuKGZsYWdzICIsIGVudHJ5LT5mbGFncywgIikiKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGVudHJ5X3R5cGUgXCIlc1wiKSIsIGNhY2hlX2VudHJ5X3R5cGVfdG9fc3RyIChlbnRyeS0+ZW50cnlfdHlwZSkpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obmFtZSBcIiVzXCIpIiwgZW50cnktPm5hbWUpOworICAgICAgZHVtcF9maWx0ZXIgKGZpbGUsICJcbihvcmlnaW5hbF9maWVsZHMgIiwgZW50cnktPm9yaWdpbmFsX2ZpZWxkcywgIikiKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKHR5cGUgXCIlc1wiKSIsIGVudHJ5LT50eXBlKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGV4cHJlc3Npb24gXCIlc1wiKSIsIGVudHJ5LT5leHByZXNzaW9uKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5leHQgMHglbHgpIiwgKGxvbmcpIGVudHJ5LT5uZXh0KTsKKyAgICB9CisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKK30KKwordm9pZAorZHVtcF9jYWNoZV9lbnRyaWVzIChsZiAqZmlsZSwKKwkJICAgIGNoYXIgKnByZWZpeCwKKwkJICAgIGNhY2hlX2VudHJ5ICplbnRyeSwKKwkJICAgIGNoYXIgKnN1ZmZpeCkKK3sKKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBwcmVmaXgpOworICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgd2hpbGUgKGVudHJ5ICE9IE5VTEwpCisgICAgeworICAgICAgZHVtcF9jYWNoZV9lbnRyeSAoZmlsZSwgIlxuKCIsIGVudHJ5LCAiKSIpOworICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKKyAgICB9CisgIGxmX2luZGVudCAoZmlsZSwgLTEpOworICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX21vZGVsX2RhdGEgKGxmICpmaWxlLAorCQkgY2hhciAqcHJlZml4LAorCQkgbW9kZWxfZGF0YSAqZW50cnksCisJCSBjaGFyICpzdWZmaXgpCit7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzKG1vZGVsX2RhdGEgKikgMHglbHgiLCBwcmVmaXgsIChsb25nKSBlbnRyeSk7CisgIGlmIChlbnRyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOworICAgICAgZHVtcF9saW5lX3JlZiAoZmlsZSwgIlxuKGxpbmUgIiwgZW50cnktPmxpbmUsICIpIik7CisgICAgICBkdW1wX2ZpbHRlciAoZmlsZSwgIlxuKGZsYWdzICIsIGVudHJ5LT5mbGFncywgIikiKTsKKyAgICAgIGR1bXBfdGFibGVfZW50cnkgKGZpbGUsICJcbihlbnRyeSAiLCBlbnRyeS0+ZW50cnksICIpIik7CisgICAgICBkdW1wX3RhYmxlX2VudHJ5IChmaWxlLCAiXG4oY29kZSAiLCBlbnRyeS0+Y29kZSwgIikiKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5leHQgMHglbHgpIiwgKGxvbmcpIGVudHJ5LT5uZXh0KTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOworICAgIH0KKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBwcmVmaXgpOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9tb2RlbF9kYXRhcyAobGYgKmZpbGUsCisJCSAgY2hhciAqcHJlZml4LAorCQkgIG1vZGVsX2RhdGEgKmVudHJ5LAorCQkgIGNoYXIgKnN1ZmZpeCkKK3sKKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBwcmVmaXgpOworICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgd2hpbGUgKGVudHJ5ICE9IE5VTEwpCisgICAgeworICAgICAgZHVtcF9tb2RlbF9kYXRhIChmaWxlLCAiXG4oIiwgZW50cnksICIpIik7CisgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworICAgIH0KKyAgbGZfaW5kZW50IChmaWxlLCAtMSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKK30KKworc3RhdGljIHZvaWQKK2R1bXBfbW9kZWxfZW50cnkgKGxmICpmaWxlLAorCQkgIGNoYXIgKnByZWZpeCwKKwkJICBtb2RlbF9lbnRyeSAqZW50cnksCisJCSAgY2hhciAqc3VmZml4KQoreworICBsZl9wcmludGYgKGZpbGUsICIlcyhtb2RlbF9lbnRyeSAqKSAweCVseCIsIHByZWZpeCwgKGxvbmcpIGVudHJ5KTsKKyAgaWYgKGVudHJ5ICE9IE5VTEwpCisgICAgeworICAgICAgbGZfaW5kZW50IChmaWxlLCArMSk7CisgICAgICBkdW1wX2xpbmVfcmVmIChmaWxlLCAiXG4obGluZSAiLCBlbnRyeS0+bGluZSwgIikiKTsKKyAgICAgIGR1bXBfZmlsdGVyIChmaWxlLCAiXG4oZmxhZ3MgIiwgZW50cnktPmZsYWdzLCAiKSIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obmFtZSBcIiVzXCIpIiwgZW50cnktPm5hbWUpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oZnVsbF9uYW1lIFwiJXNcIikiLCBlbnRyeS0+ZnVsbF9uYW1lKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKHVuaXRfZGF0YSBcIiVzXCIpIiwgZW50cnktPnVuaXRfZGF0YSk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbihuZXh0IDB4JWx4KSIsIChsb25nKSBlbnRyeS0+bmV4dCk7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKKyAgICB9CisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgcHJlZml4KTsKK30KKworc3RhdGljIHZvaWQKK2R1bXBfbW9kZWxfZW50cmllcyAobGYgKmZpbGUsCisJCSAgICBjaGFyICpwcmVmaXgsCisJCSAgICBtb2RlbF9lbnRyeSAqZW50cnksCisJCSAgICBjaGFyICpzdWZmaXgpCit7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgcHJlZml4KTsKKyAgbGZfaW5kZW50IChmaWxlLCArMSk7CisgIHdoaWxlIChlbnRyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGR1bXBfbW9kZWxfZW50cnkgKGZpbGUsICJcbigiLCBlbnRyeSwgIikiKTsKKyAgICAgIGVudHJ5ID0gZW50cnktPm5leHQ7CisgICAgfQorICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOworfQorCisKK3N0YXRpYyB2b2lkCitkdW1wX21vZGVsX3RhYmxlIChsZiAqZmlsZSwKKwkJICBjaGFyICpwcmVmaXgsCisJCSAgbW9kZWxfdGFibGUgKmVudHJ5LAorCQkgIGNoYXIgKnN1ZmZpeCkKK3sKKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMobW9kZWxfdGFibGUgKikgMHglbHgiLCBwcmVmaXgsIChsb25nKSBlbnRyeSk7CisgIGlmIChlbnRyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOworICAgICAgZHVtcF9maWx0ZXIgKGZpbGUsICJcbihwcm9jZXNzb3JzICIsIGVudHJ5LT5wcm9jZXNzb3JzLCAiKSIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obnJfbW9kZWxzICVkKSIsIGVudHJ5LT5ucl9tb2RlbHMpOworICAgICAgZHVtcF9tb2RlbF9lbnRyaWVzIChmaWxlLCAiXG4obW9kZWxzICIsIGVudHJ5LT5tb2RlbHMsICIpIik7CisgICAgICBkdW1wX21vZGVsX2RhdGFzIChmaWxlLCAiXG4obWFjcm9zICIsIGVudHJ5LT5tYWNyb3MsICIpIik7CisgICAgICBkdW1wX21vZGVsX2RhdGFzIChmaWxlLCAiXG4oZGF0YSAiLCBlbnRyeS0+ZGF0YSwgIikiKTsKKyAgICAgIGR1bXBfZnVuY3Rpb25fZW50cmllcyAoZmlsZSwgIlxuKHN0YXRpY3MgIiwgZW50cnktPnN0YXRpY3MsICIpIik7CisgICAgICBkdW1wX2Z1bmN0aW9uX2VudHJpZXMgKGZpbGUsICJcbihpbnRlcm5hbHMgIiwgZW50cnktPmZ1bmN0aW9ucywgIikiKTsKKyAgICAgIGR1bXBfZnVuY3Rpb25fZW50cmllcyAoZmlsZSwgIlxuKGZ1bmN0aW9ucyAiLCBlbnRyeS0+ZnVuY3Rpb25zLCAiKSIpOworICAgICAgbGZfaW5kZW50IChmaWxlLCAtMSk7CisgICAgfQorICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Cit9CisKKworc3RhdGljIGNoYXIgKgoraW5zbl9maWVsZF90eXBlX3RvX3N0ciAoaW5zbl9maWVsZF90eXBlIHR5cGUpCit7CisgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgY2FzZSBpbnNuX2ZpZWxkX2ludmFsaWQ6IEFTU0VSVCAoMCk7IHJldHVybiAiKGludmFsaWQpIjsKKyAgICBjYXNlIGluc25fZmllbGRfaW50OiByZXR1cm4gImludCI7CisgICAgY2FzZSBpbnNuX2ZpZWxkX3Jlc2VydmVkOiByZXR1cm4gInJlc2VydmVkIjsKKyAgICBjYXNlIGluc25fZmllbGRfd2lsZDogcmV0dXJuICJ3aWxkIjsKKyAgICBjYXNlIGluc25fZmllbGRfc3RyaW5nOiByZXR1cm4gInN0cmluZyI7CisgICAgfQorICBFUlJPUiAoImJhZCBzd2l0Y2giKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2R1bXBfaW5zbl9maWVsZCAobGYgKmZpbGUsCisJCSBjaGFyICpwcmVmaXgsCisJCSBpbnNuX2ZpZWxkX2VudHJ5ICpmaWVsZCwKKwkJIGNoYXIgKnN1ZmZpeCkKK3sKKyAgY2hhciAqc2VwID0gIiAiOworICBsZl9wcmludGYgKGZpbGUsICIlcyhpbnNuX2ZpZWxkX2VudHJ5ICopIDB4JWx4IiwgcHJlZml4LCAobG9uZykgZmllbGQpOworICBpZiAoZmllbGQgIT0gTlVMTCkKKyAgICB7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzKGZpcnN0ICVkKSIsIHNlcCwgZmllbGQtPmZpcnN0KTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIiVzKGxhc3QgJWQpIiwgc2VwLCBmaWVsZC0+bGFzdCk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIlcyh3aWR0aCAlZCkiLCBzZXAsIGZpZWxkLT53aWR0aCk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIlcyh0eXBlICVzKSIsIHNlcCwgaW5zbl9maWVsZF90eXBlX3RvX3N0ciAoZmllbGQtPnR5cGUpKTsKKyAgICAgIHN3aXRjaCAoZmllbGQtPnR5cGUpCisJeworCWNhc2UgaW5zbl9maWVsZF9pbnZhbGlkOgorCSAgQVNTRVJUICgwKTsKKwkgIGJyZWFrOworCWNhc2UgaW5zbl9maWVsZF9pbnQ6CisJICBsZl9wcmludGYgKGZpbGUsICIlcyh2YWwgMHglbHgpIiwgc2VwLCAobG9uZykgZmllbGQtPnZhbF9pbnQpOworCSAgYnJlYWs7CisJY2FzZSBpbnNuX2ZpZWxkX3Jlc2VydmVkOgorCSAgLyogbm90aGluZyBvdXRwdXQgKi8KKwkgIGJyZWFrOworCWNhc2UgaW5zbl9maWVsZF93aWxkOgorCSAgLyogbm90aGluZyBvdXRwdXQgKi8KKwkgIGJyZWFrOworCWNhc2UgaW5zbl9maWVsZF9zdHJpbmc6CisJICBsZl9wcmludGYgKGZpbGUsICIlcyh2YWwgXCIlc1wiKSIsIHNlcCwgZmllbGQtPnZhbF9zdHJpbmcpOworCSAgYnJlYWs7CisJfQorICAgICAgbGZfcHJpbnRmIChmaWxlLCAiJXMobmV4dCAweCVseCkiLCBzZXAsIChsb25nKSBmaWVsZC0+bmV4dCk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIlcyhwcmV2IDB4JWx4KSIsIHNlcCwgKGxvbmcpIGZpZWxkLT5wcmV2KTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOworICAgIH0KKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOworfQorCit2b2lkCitkdW1wX2luc25fd29yZF9lbnRyeSAobGYgKmZpbGUsCisJCSAgICAgIGNoYXIgKnByZWZpeCwKKwkJICAgICAgaW5zbl93b3JkX2VudHJ5ICp3b3JkLAorCQkgICAgICBjaGFyICpzdWZmaXgpCit7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzKGluc25fd29yZF9lbnRyeSAqKSAweCVseCIsIHByZWZpeCwgKGxvbmcpIHdvcmQpOworICBpZiAod29yZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgaW5zbl9maWVsZF9lbnRyeSAqZmllbGQ7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGZpcnN0IDB4JWx4KSIsIChsb25nKSB3b3JkLT5maXJzdCk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbihsYXN0IDB4JWx4KSIsIChsb25nKSB3b3JkLT5sYXN0KTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGJpdCIpOworICAgICAgZm9yIChpID0gMDsgaSA8IG9wdGlvbnMuaW5zbl9iaXRfc2l6ZTsgaSsrKQorCWxmX3ByaW50ZiAoZmlsZSwgIlxuICgodmFsdWUgJWQpIChtYXNrICVkKSAoZmllbGQgMHglbHgpKSIsCisJCSAgIHdvcmQtPmJpdFtpXS0+dmFsdWUsIHdvcmQtPmJpdFtpXS0+bWFzaywgKGxvbmcpIHdvcmQtPmJpdFtpXS0+ZmllbGQpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiKSIpOworICAgICAgZm9yIChmaWVsZCA9IHdvcmQtPmZpcnN0OyBmaWVsZCAhPSBOVUxMOyBmaWVsZCA9IGZpZWxkLT5uZXh0KQorCWR1bXBfaW5zbl9maWVsZCAoZmlsZSwgIlxuKCIsIGZpZWxkLCAiKSIpOworICAgICAgZHVtcF9maWx0ZXIgKGZpbGUsICJcbihmaWVsZF9uYW1lcyAiLCB3b3JkLT5maWVsZF9uYW1lcywgIikiKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5leHQgMHglbHgpIiwgKGxvbmcpIHdvcmQtPm5leHQpOworICAgICAgbGZfaW5kZW50IChmaWxlLCAtMSk7CisgICAgfQorICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX2luc25fd29yZF9lbnRyaWVzIChsZiAqZmlsZSwKKwkJCWNoYXIgKnByZWZpeCwKKwkJCWluc25fd29yZF9lbnRyeSAqd29yZCwKKwkJCWNoYXIgKnN1ZmZpeCkKK3sKKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBwcmVmaXgpOworICB3aGlsZSAod29yZCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGR1bXBfaW5zbl93b3JkX2VudHJ5IChmaWxlLCAiXG4oIiwgd29yZCwgIikiKTsKKyAgICAgIHdvcmQgPSB3b3JkLT5uZXh0OworICAgIH0KKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBzdWZmaXgpOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9pbnNuX21vZGVsX2VudHJ5IChsZiAqZmlsZSwKKwkJICAgICAgIGNoYXIgKnByZWZpeCwKKwkJICAgICAgIGluc25fbW9kZWxfZW50cnkgKm1vZGVsLAorCQkgICAgICAgY2hhciAqc3VmZml4KQoreworICBsZl9wcmludGYgKGZpbGUsICIlcyhpbnNuX21vZGVsX2VudHJ5ICopIDB4JWx4IiwgcHJlZml4LCAobG9uZykgbW9kZWwpOworICBpZiAobW9kZWwgIT0gTlVMTCkKKyAgICB7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgICAgIGR1bXBfbGluZV9yZWYgKGZpbGUsICJcbihsaW5lICIsIG1vZGVsLT5saW5lLCAiKSIpOworICAgICAgZHVtcF9maWx0ZXIgKGZpbGUsICJcbihuYW1lcyAiLCBtb2RlbC0+bmFtZXMsICIpIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbihmdWxsX25hbWUgXCIlc1wiKSIsIG1vZGVsLT5mdWxsX25hbWUpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4odW5pdF9kYXRhIFwiJXNcIikiLCBtb2RlbC0+dW5pdF9kYXRhKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGluc24gKGluc25fZW50cnkgKikgMHglbHgpIiwgKGxvbmcpIG1vZGVsLT5pbnNuKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5leHQgKGluc25fbW9kZWxfZW50cnkgKikgMHglbHgpIiwKKwkJIChsb25nKSBtb2RlbC0+bmV4dCk7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKKyAgICB9CisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKK30KKworc3RhdGljIHZvaWQKK2R1bXBfaW5zbl9tb2RlbF9lbnRyaWVzIChsZiAqZmlsZSwKKwkJCSBjaGFyICpwcmVmaXgsCisJCQkgaW5zbl9tb2RlbF9lbnRyeSAqbW9kZWwsCisJCQkgY2hhciAqc3VmZml4KQoreworICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHByZWZpeCk7CisgIHdoaWxlIChtb2RlbCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGR1bXBfaW5zbl9tb2RlbF9lbnRyeSAoZmlsZSwgIlxuIiwgbW9kZWwsICIiKTsKKyAgICAgIG1vZGVsID0gbW9kZWwtPm5leHQ7CisgICAgfQorICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Cit9CisKKworc3RhdGljIHZvaWQKK2R1bXBfaW5zbl9tbmVtb25pY19lbnRyeSAobGYgKmZpbGUsCisJCQkgIGNoYXIgKnByZWZpeCwKKwkJCSAgaW5zbl9tbmVtb25pY19lbnRyeSAqbW5lbW9uaWMsCisJCQkgIGNoYXIgKnN1ZmZpeCkKK3sKKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMoaW5zbl9tbmVtb25pY19lbnRyeSAqKSAweCVseCIsIHByZWZpeCwgKGxvbmcpIG1uZW1vbmljKTsKKyAgaWYgKG1uZW1vbmljICE9IE5VTEwpCisgICAgeworICAgICAgbGZfaW5kZW50IChmaWxlLCArMSk7CisgICAgICBkdW1wX2xpbmVfcmVmIChmaWxlLCAiXG4obGluZSAiLCBtbmVtb25pYy0+bGluZSwgIikiKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGZvcm1hdCBcIiVzXCIpIiwgbW5lbW9uaWMtPmZvcm1hdCk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbihjb25kaXRpb24gXCIlc1wiKSIsIG1uZW1vbmljLT5jb25kaXRpb24pOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oaW5zbiAoaW5zbl9lbnRyeSAqKSAweCVseCkiLAorCQkgKGxvbmcpIG1uZW1vbmljLT5pbnNuKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG5leHQgKGluc25fbW5lbW9uaWNfZW50cnkgKikgMHglbHgpIiwKKwkJIChsb25nKSBtbmVtb25pYy0+bmV4dCk7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKKyAgICB9CisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKK30KKworc3RhdGljIHZvaWQKK2R1bXBfaW5zbl9tbmVtb25pY19lbnRyaWVzIChsZiAqZmlsZSwKKwkJCSAgICBjaGFyICpwcmVmaXgsCisJCQkgICAgaW5zbl9tbmVtb25pY19lbnRyeSAqbW5lbW9uaWMsCisJCQkgICAgY2hhciAqc3VmZml4KQoreworICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHByZWZpeCk7CisgIHdoaWxlIChtbmVtb25pYyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGR1bXBfaW5zbl9tbmVtb25pY19lbnRyeSAoZmlsZSwgIlxuIiwgbW5lbW9uaWMsICIiKTsKKyAgICAgIG1uZW1vbmljID0gbW5lbW9uaWMtPm5leHQ7CisgICAgfQorICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Cit9CisKK3ZvaWQKK2R1bXBfaW5zbl9lbnRyeSAobGYgKmZpbGUsCisJCSBjaGFyICpwcmVmaXgsCisJCSBpbnNuX2VudHJ5ICplbnRyeSwKKwkJIGNoYXIgKnN1ZmZpeCkKK3sKKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMoaW5zbl9lbnRyeSAqKSAweCVseCIsIHByZWZpeCwgKGxvbmcpIGVudHJ5KTsKKyAgaWYgKGVudHJ5ICE9IE5VTEwpCisgICAgeworICAgICAgaW50IGk7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgICAgIGR1bXBfbGluZV9yZWYgKGZpbGUsICJcbihsaW5lICIsIGVudHJ5LT5saW5lLCAiKSIpOworICAgICAgZHVtcF9maWx0ZXIgKGZpbGUsICJcbihmbGFncyAiLCBlbnRyeS0+ZmxhZ3MsICIpIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbihucl93b3JkcyAlZCkiLCBlbnRyeS0+bnJfd29yZHMpOworICAgICAgZHVtcF9pbnNuX3dvcmRfZW50cmllcyAoZmlsZSwgIlxuKHdvcmRzICIsIGVudHJ5LT53b3JkcywgIikiKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKHdvcmQiKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBlbnRyeS0+bnJfbW9kZWxzOyBpKyspCisJbGZfcHJpbnRmIChmaWxlLCAiIDB4JWx4IiwgKGxvbmcpIGVudHJ5LT53b3JkW2ldKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIikiKTsKKyAgICAgIGR1bXBfZmlsdGVyIChmaWxlLCAiXG4oZmllbGRfbmFtZXMgIiwgZW50cnktPmZpZWxkX25hbWVzLCAiKSIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oZm9ybWF0X25hbWUgXCIlc1wiKSIsIGVudHJ5LT5mb3JtYXRfbmFtZSk7CisgICAgICBkdW1wX2ZpbHRlciAoZmlsZSwgIlxuKG9wdGlvbnMgIiwgZW50cnktPm9wdGlvbnMsICIpIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbihuYW1lIFwiJXNcIikiLCBlbnRyeS0+bmFtZSk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbihucl9tb2RlbHMgJWQpIiwgZW50cnktPm5yX21vZGVscyk7CisgICAgICBkdW1wX2luc25fbW9kZWxfZW50cmllcyAoZmlsZSwgIlxuKG1vZGVscyAiLCBlbnRyeS0+bW9kZWxzLCAiKSIpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obW9kZWwiKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBlbnRyeS0+bnJfbW9kZWxzOyBpKyspCisJbGZfcHJpbnRmIChmaWxlLCAiIDB4JWx4IiwgKGxvbmcpIGVudHJ5LT5tb2RlbFtpXSk7CisgICAgICBsZl9wcmludGYgKGZpbGUsICIpIik7CisgICAgICBkdW1wX2ZpbHRlciAoZmlsZSwgIlxuKHByb2Nlc3NvcnMgIiwgZW50cnktPnByb2Nlc3NvcnMsICIpIik7CisgICAgICBkdW1wX2luc25fbW5lbW9uaWNfZW50cmllcyAoZmlsZSwgIlxuKG1uZW1vbmljcyAiLCBlbnRyeS0+bW5lbW9uaWNzLCAiKSIpOworICAgICAgZHVtcF90YWJsZV9lbnRyeSAoZmlsZSwgIlxuKGNvZGUgIiwgZW50cnktPmNvZGUsICIpIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbihuZXh0IDB4JWx4KSIsIChsb25nKSBlbnRyeS0+bmV4dCk7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKKyAgfQorICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX2luc25fZW50cmllcyAobGYgKmZpbGUsCisJCSAgIGNoYXIgKnByZWZpeCwKKwkJICAgaW5zbl9lbnRyeSAqZW50cnksCisJCSAgIGNoYXIgKnN1ZmZpeCkKK3sKKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMiLCBwcmVmaXgpOworICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgd2hpbGUgKGVudHJ5ICE9IE5VTEwpCisgICAgeworICAgICAgZHVtcF9pbnNuX2VudHJ5IChmaWxlLCAiXG4oIiwgZW50cnksICIpIik7CisgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworICAgIH0KKyAgbGZfaW5kZW50IChmaWxlLCAtMSk7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKK30KKworCisKK3ZvaWQKK2R1bXBfaW5zbl90YWJsZSAobGYgKmZpbGUsCisJCSBjaGFyICpwcmVmaXgsCisJCSBpbnNuX3RhYmxlICppc2EsCisJCSBjaGFyICpzdWZmaXgpCit7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzKGluc25fdGFibGUgKikgMHglbHgiLCBwcmVmaXgsIChsb25nKSBpc2EpOworICBpZiAoaXNhICE9IE5VTEwpCisgICAgeworICAgICAgbGZfaW5kZW50IChmaWxlLCArMSk7CisgICAgICBkdW1wX2NhY2hlX2VudHJpZXMgKGZpbGUsICJcbihjYWNoZXMgIiwgaXNhLT5jYWNoZXMsICIpIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbihucl9pbnNucyAlZCkiLCBpc2EtPm5yX2luc25zKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKG1heF9ucl93b3JkcyAlZCkiLCBpc2EtPm1heF9ucl93b3Jkcyk7CisgICAgICBkdW1wX2luc25fZW50cmllcyAoZmlsZSwgIlxuKGluc25zICIsIGlzYS0+aW5zbnMsICIpIik7CisgICAgICBkdW1wX2Z1bmN0aW9uX2VudHJpZXMgKGZpbGUsICJcbihmdW5jdGlvbnMgIiwgaXNhLT5mdW5jdGlvbnMsICIpIik7CisgICAgICBkdW1wX2luc25fZW50cnkgKGZpbGUsICJcbihpbGxlZ2FsX2luc24gIiwgaXNhLT5pbGxlZ2FsX2luc24sICIpIik7CisgICAgICBkdW1wX21vZGVsX3RhYmxlIChmaWxlLCAiXG4obW9kZWwgIiwgaXNhLT5tb2RlbCwgIikiKTsKKyAgICAgIGR1bXBfZmlsdGVyIChmaWxlLCAiXG4oZmxhZ3MgIiwgaXNhLT5mbGFncywgIikiKTsKKyAgICAgIGR1bXBfZmlsdGVyIChmaWxlLCAiXG4ob3B0aW9ucyAiLCBpc2EtPm9wdGlvbnMsICIpIik7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsIC0xKTsKKyAgICB9CisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgc3VmZml4KTsKK30KKworI2lmZGVmIE1BSU4KKworaWdlbl9vcHRpb25zIG9wdGlvbnM7CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpbnNuX3RhYmxlICppc2E7CisgIGxmICpsOworCisgIElOSVRfT1BUSU9OUyAob3B0aW9ucyk7CisKKyAgaWYgKGFyZ2MgPT0gMykKKyAgICBmaWx0ZXJfcGFyc2UgKCZvcHRpb25zLmZsYWdzX2ZpbHRlciwgYXJndlsyXSk7CisgIGVsc2UgaWYgKGFyZ2MgIT0gMikKKyAgICBlcnJvciAoTlVMTCwgIlVzYWdlOiBpbnNuIDxpbnNuLXRhYmxlPiBbIDxmaWx0ZXItaW4+IF1cbiIpOworCisgIGlzYSA9IGxvYWRfaW5zbl90YWJsZSAoYXJndlsxXSwgTlVMTCk7CisgIGwgPSBsZl9vcGVuICgiLSIsICJzdGRvdXQiLCBsZl9vbWl0X3JlZmVyZW5jZXMsIGxmX2lzX3RleHQsICJ0bXAtbGQtaW5zbiIpOworICBkdW1wX2luc25fdGFibGUgKGwsICIoaXNhICIsIGlzYSwgIilcbiIpOworCisgIHJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2xkLWluc24uaCBiL3NpbS9pZ2VuL2xkLWluc24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjlkMjQwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2lnZW4vbGQtaW5zbi5oCkBAIC0wLDAgKzEsNzAzIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk4IEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKwordHlwZWRlZiB1bnNpZ25lZDY0IGluc25fdWludDsKKworCisvKiBDb21tb24gYW1vbmcgbW9zdCBlbnRyaWVzOgorCisgICBBbGwgbm9uIGluc3RydWN0aW9uIHJlY29yZHMgaGF2ZSB0aGUgZm9ybWF0OgorCisgICA8Li4uPiA6Oj0KKyAgICAgICAiOiIgPHJlY29yZC1uYW1lPgorICAgICAgICI6IiA8ZmlsdGVyLWZsYWdzPgorICAgICAgICI6IiA8ZmlsdGVyLW1vZGVscz4KKyAgICAgICAiOiIgLi4uCisgICAKKyAqLworCitlbnVtIHsKKyAgcmVjb3JkX3R5cGVfZmllbGQgPSAxLAorICBvbGRfcmVjb3JkX3R5cGVfZmllbGQgPSAyLAorICByZWNvcmRfZmlsdGVyX2ZsYWdzX2ZpZWxkID0gMiwKKyAgcmVjb3JkX2ZpbHRlcl9tb2RlbHNfZmllbGQgPSAzLAorfTsKKworCisvKiBJbmNsdWRlOgorCisgICBJbmNsdWRlIHRoZSBzcGVjaWZpZWQgZmlsZS4KKworICAgPGluY2x1ZGU+IDo6PQorICAgICAgICI6IiAiaW5jbHVkZSIKKyAgICAgICAiOiIgPGZpbHRlci1mbGFncz4KKyAgICAgICAiOiIgPGZpbHRlci1tb2RlbHM+CisgICAgICAgIjoiIDxmaWxlbmFtZT4KKyAgICAgICA8bmw+CisgICAgICAgOworCisgICAqLworCitlbnVtIHsKKyAgaW5jbHVkZV9maWxlbmFtZV9maWVsZCA9IDQsCisgIG5yX2luY2x1ZGVfZmllbGRzLAorfTsKKworCisKKy8qIE9wdGlvbnM6CisKKyAgIFZhbGlkIG9wdGlvbnMgYXJlOiBoaS1iaXQtbnIgKGRlZmF1bHQgMCksIGluc24tYml0LXNpemUgKGRlZmF1bHQKKyAgIDMyKSwgaW5zbi1zcGVjaWZ5aW5nLXdpZHRocyAoZGVmYXVsdCB0cnVlKSwgbXVsdGktc2ltIChkZWZhdWx0IGZhbHNlKS4KKworICAgPG9wdGlvbj4gOjo9CisgICAgICAgIjoiICJvcHRpb24iCisgICAgICAgIjoiIDxmaWx0ZXItZmxhZ3M+CisgICAgICAgIjoiIDxmaWx0ZXItbW9kZWxzPgorICAgICAgICI6IiA8b3B0aW9uLW5hbWU+CisgICAgICAgIjoiIDxvcHRpb24tdmFsdWU+CisgICAgICAgPG5sPgorICAgICAgIDsKKworICAgPG9wdGlvbi1uYW1lPiA6Oj0KKyAgICAgICAiaW5zbi1iaXQtc2l6ZSIKKyAgICAgICB8ICJpbnNuLXNwZWNpZnlpbmctd2lkdGhzIgorICAgICAgIHwgImhpLWJpdC1uciIKKyAgICAgICB8ICJmbGFncy1maWx0ZXIiCisgICAgICAgfCAibW9kZWwtZmlsdGVyIgorICAgICAgIHwgIm11bHRpLXNpbSIKKyAgICAgICB8ICJmb3JtYXQtbmFtZXMiCisgICAgICAgOworCisgICA8b3B0aW9uLXZhbHVlPiA6Oj0KKyAgICAgICAidHJ1ZSIKKyAgICAgICB8ICJmYWxzZSIKKyAgICAgICB8IDxpbnRlZ2VyPgorICAgICAgIHwgPGxpc3Q+CisgICAgICAgOworCisKKyAgIFRoZXNlIHVwZGF0ZSB0aGUgZ2xvYmFsIG9wdGlvbnMgc3RydWN0dXJlLiAqLyAgICAgICAKKworCitlbnVtIHsKKyAgb3B0aW9uX25hbWVfZmllbGQgPSA0LAorICBvcHRpb25fdmFsdWVfZmllbGQsCisgIG5yX29wdGlvbl9maWVsZHMsCit9OworCisKKworLyogTWFjcm8gZGVmaW5pdGlvbnM6CisKKyAgIDxpbnNuLW1hY3JvPiA6Oj0KKyAgICAgICAiOiIgImRlZmluZSIKKyAgICAgICAiOiIgPGZpbHRlci1mbGFncz4KKyAgICAgICAiOiIgPGZpbHRlci1tb2RlbHM+CisgICAgICAgIjoiIDxuYW1lPgorICAgICAgICI6IiA8YXJnLWxpc3Q+CisgICAgICAgIjoiIDxleHByZXNzaW9uPgorICAgICAgIDxubD4KKyAgICAgICA7CisKKyAgIDxhcmctbGlzdD4gOjo9CisgICAgICAgWyA8bmFtZT4geyAiLCIgPGFyZy1saXN0PiB9IF0KKyAgICAgICA7CisKKyAgICovCisKKworZW51bSB7CisgIG1hY3JvX25hbWVfZmllbGQgPSA0LAorICBtYWNyb19hcmdzX2ZpZWxkLAorICBtYWNyb19leHByX2ZpZWxkLAorICBucl9tYWNyb19maWVsZHMsCit9OworCisKKworLyogRnVuY3Rpb25zIGFuZCBpbnRlcm5hbCByb3V0aW5zOgorCisgICBOQjogPGZpbHRlci1tb2RlbHM+IGFuZCA8ZnVuY3Rpb24tbW9kZWxzPiBhcmUgZXF1aXZhbGVudC4KKworCisgICA8ZnVuY3Rpb24+IDo6PQorICAgICAgICI6IiAiZnVuY3Rpb24iCisgICAgICAgPGZ1bmN0aW9uLXNwZWM+CisgICAgICAgOworCisgICA8aW50ZXJuYWw+IDo6PQorICAgICAgICI6IiAiaW50ZXJuYWwiCisgICAgICAgPGZ1bmN0aW9uLXNwZWM+CisgICAgICAgOworCisgICA8Zm9ybWF0PiA6Oj0KKyAgICAgICAiOiIgKCAiJXMiIHwgLi4uICkKKyAgICAgICA8ZnVuY3Rpb24tc3BlYz4KKyAgICAgICA7CisKKyAgIDxmdW5jdGlvbi1tb2RlbD4gOjo9CisgICAgICAgIioiIFsgPHByb2Nlc3Nvci1saXN0PiBdCisgICAgICAgIjoiCisgICAgICAgPG5sPgorICAgICAgIDsKKworICAgPGZ1bmN0aW9uLXNwZWM+IDo6PQorICAgICAgICI6IiA8ZmlsdGVyLWZsYWdzPgorICAgICAgICI6IiA8ZmlsdGVyLW1vZGVscz4KKyAgICAgICAiOiIgPHR5cGVkZWY+CisgICAgICAgIjoiIDxuYW1lPgorICAgICAgIFsgIjoiIDxwYXJhbWV0ZXItbGlzdD4gXQorICAgICAgIDxubD4KKyAgICAgICBbIDxmdW5jdGlvbi1tb2RlbD4gXQorICAgICAgIDxjb2RlLWJsb2NrPgorICAgICAgIDsKKworICAgKi8KKworZW51bSB7CisgIGZ1bmN0aW9uX3R5cGVkZWZfZmllbGQgPSA0LAorICBmdW5jdGlvbl9uYW1lX2ZpZWxkLAorICBmdW5jdGlvbl9wYXJhbV9maWVsZCwKKyAgbnJfZnVuY3Rpb25fZmllbGRzLAorfTsKKworZW51bSB7CisgIGZ1bmN0aW9uX21vZGVsX25hbWVfZmllbGQgPSAwLAorICBucl9mdW5jdGlvbl9tb2RlbF9maWVsZHMgPSAxLAorfTsKKworZW51bSB7CisgIG9sZF9mdW5jdGlvbl90eXBlZGVmX2ZpZWxkID0gMCwKKyAgb2xkX2Z1bmN0aW9uX3R5cGVfZmllbGQgPSAyLAorICBvbGRfZnVuY3Rpb25fbmFtZV9maWVsZCA9IDQsCisgIG9sZF9mdW5jdGlvbl9wYXJhbV9maWVsZCA9IDUsCisgIG5yX29sZF9mdW5jdGlvbl9maWVsZHMgPSA1LCAvKiBwYXJhbWV0ZXItbGlzdCBpcyBvcHRpb25hbCAqLworfTsKKworCit0eXBlZGVmIHN0cnVjdCBfZnVuY3Rpb25fZW50cnkgZnVuY3Rpb25fZW50cnk7CitzdHJ1Y3QgX2Z1bmN0aW9uX2VudHJ5IHsKKyAgbGluZV9yZWYgKmxpbmU7CisgIGZpbHRlciAqZmxhZ3M7CisgIGZpbHRlciAqbW9kZWxzOworICBjaGFyICp0eXBlOworICBjaGFyICpuYW1lOworICBjaGFyICpwYXJhbTsKKyAgdGFibGVfZW50cnkgKmNvZGU7CisgIGludCBpc19pbnRlcm5hbDsKKyAgZnVuY3Rpb25fZW50cnkgKm5leHQ7Cit9OworCisKK3R5cGVkZWYgdm9pZCBmdW5jdGlvbl9lbnRyeV9oYW5kbGVyCisobGYgKmZpbGUsCisgZnVuY3Rpb25fZW50cnkgKmZ1bmN0aW9uLAorIHZvaWQgKmRhdGEpOworCitleHRlcm4gdm9pZCBmdW5jdGlvbl9lbnRyeV90cmF2ZXJzZQorKGxmICpmaWxlLAorIGZ1bmN0aW9uX2VudHJ5ICpmdW5jdGlvbnMsCisgZnVuY3Rpb25fZW50cnlfaGFuZGxlciAqaGFuZGxlciwKKyB2b2lkICpkYXRhKTsKKworCisvKiBjYWNoZS1tYWNybzoKKworICAgPGNhY2hlLW1hY3JvPiA6Oj0KKyAgICAgICAiOiIgPG1hY3JvLXR5cGU+CisgICAgICAgIjoiIDxmaWx0ZXItZmxhZ3M+CisgICAgICAgIjoiIDxmaWx0ZXItbW9kZWxzPgorICAgICAgICI6IiA8dHlwZWRlZj4KKyAgICAgICAiOiIgPG5hbWU+CisgICAgICAgIjoiIDxmaWVsZC1uYW1lPiB7ICIsIiA8ZmllbGQtbmFtZT4gfQorICAgICAgICI6IiA8ZXhwcmVzc2lvbj4KKyAgICAgICA8bmw+CisgICAgICAgOworCisgICA8Y2FjaGUtbWFjcm8tdHlwZT4gOjo9CisgICAgICAgInNjcmF0Y2giCisgICAgICAgfCAiY2FjaGUiCisgICAgICAgfCAiY29tcHV0ZSIKKyAgICAgICA7CisKKyAgIDxuYW1lPiA6Oj0KKyAgICAgICA8aWRlbnQ+CisgICAgICAgfCA8aWRlbnQ+ICJfaXNfIiA8aW50ZWdlcj4KKyAgICAgICA7CisKKyAgIEEgY2FjaGUgZW50cnkgaXMgZGVmaW5lZCAoZm9yIGFuIGluc3RydWN0aW9uKSB3aGVuIGFsbAorICAgPGZpZWxkLW5hbWU+cyBhcmUgcHJlc2VudCBhcyBuYW1lZCBvcGNvZGUgZmllbGRzIHdpdGhpbiB0aGUKKyAgIGluc3RydWN0aW9ucyBmb3JtYXQuCisKKyAgIFNDUkFUQ0ggYW5kIENBQ0hFIG1hY3JvcyBhcmUgZGVmaW5lZCBkdXJpbmcgdGhlIGNhY2hlIGZpbGwgc3RhZ2UKKyAgIHdoaWxlIENBQ0hFIGFuZCBDT01QVVRFIG1hY3JvcyBhcmUgZGVmaW5lZCBkdXJpbmcgdGhlIGluc3RydWN0aW9uCisgICBleGVjdXRpb24gc3RhZ2UuCisKKyAgICovCisKK2VudW0geworICBjYWNoZV90eXBlZGVmX2ZpZWxkID0gNCwKKyAgY2FjaGVfbmFtZV9maWVsZCwKKyAgY2FjaGVfb3JpZ2luYWxfZmllbGRzX2ZpZWxkLAorICBjYWNoZV9leHByZXNzaW9uX2ZpZWxkLAorICBucl9jYWNoZV9maWVsZHMsCit9OworCit0eXBlZGVmIGVudW0geworICBzY3JhdGNoX3ZhbHVlLAorICBjYWNoZV92YWx1ZSwKKyAgY29tcHV0ZV92YWx1ZSwKK30gY2FjaGVfZW50cnlfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgX2NhY2hlX2VudHJ5IGNhY2hlX2VudHJ5Oworc3RydWN0IF9jYWNoZV9lbnRyeSB7CisgIGxpbmVfcmVmICpsaW5lOworICBmaWx0ZXIgKmZsYWdzOworICBmaWx0ZXIgKm1vZGVsczsKKyAgY2FjaGVfZW50cnlfdHlwZSBlbnRyeV90eXBlOworICBjaGFyICpuYW1lOworICBmaWx0ZXIgKm9yaWdpbmFsX2ZpZWxkczsKKyAgY2hhciAqdHlwZTsKKyAgY2hhciAqZXhwcmVzc2lvbjsKKyAgY2FjaGVfZW50cnkgKm5leHQ7Cit9OworCisKKworLyogTW9kZWwgc3BlY3M6CisKKyAgIDxtb2RlbC1wcm9jZXNzb3I+IDo6PQorICAgICAgICI6IiAibW9kZWwiCisgICAgICAgIjoiIDxmaWx0ZXItZmxhZ3M+CisgICAgICAgIjoiIDxmaWx0ZXItbW9kZWxzPgorICAgICAgICI6IiA8cHJvY2Vzc29yPgorICAgICAgICI6IiA8QkZELXByb2Nlc3Nvcj4KKyAgICAgICAiOiIgPGZ1bmN0aW9uLXVuaXQtZGF0YT4KKyAgICAgICA8bmw+CisgICAgICAgOworCisgICA8bW9kZWwtbWFjcm8+IDo6PQorICAgICAgICI6IiAibW9kZWwtbWFjcm8iCisgICAgICAgIjoiIDxmaWx0ZXItZmxhZ3M+CisgICAgICAgIjoiIDxmaWx0ZXItbW9kZWxzPgorICAgICAgIDxubD4KKyAgICAgICA8Y29kZS1ibG9jaz4KKyAgICAgICA7CisKKyAgIDxtb2RlbC1kYXRhPiA6Oj0KKyAgICAgICAiOiIgIm1vZGVsLWRhdGEiCisgICAgICAgIjoiIDxmaWx0ZXItZmxhZ3M+CisgICAgICAgIjoiIDxmaWx0ZXItbW9kZWxzPgorICAgICAgIDxubD4KKyAgICAgICA8Y29kZS1ibG9jaz4KKyAgICAgICA7CisKKyAgIDxtb2RlbC1zdGF0aWM+IDo6PQorICAgICAgICI6IiAibW9kZWwtc3RhdGljIgorICAgICAgIDxmdW5jdGlvbi1zcGVjPgorICAgICAgIDsKKworICAgPG1vZGVsLWludGVybmFsPiA6Oj0KKyAgICAgICAiOiIgIm1vZGVsLWludGVybmFsIgorICAgICAgIDxmdW5jdGlvbi1zcGVjPgorICAgICAgIDsKKworICAgPG1vZGVsLWZ1bmN0aW9uPiA6Oj0KKyAgICAgICAiOiIgIm1vZGVsLWludGVybmFsIgorICAgICAgIDxmdW5jdGlvbi1zcGVjPgorICAgICAgIDsKKworICovCisKK2VudW0geworICBucl9tb2RlbF9tYWNyb19maWVsZHMgPSA0LAorICBucl9tb2RlbF9kYXRhX2ZpZWxkcyA9IDQsCisgIG5yX21vZGVsX3N0YXRpY19maWVsZHMgPSBucl9mdW5jdGlvbl9maWVsZHMsCisgIG5yX21vZGVsX2ludGVybmFsX2ZpZWxkcyA9IG5yX2Z1bmN0aW9uX2ZpZWxkcywKKyAgbnJfbW9kZWxfZnVuY3Rpb25fZmllbGRzID0gbnJfZnVuY3Rpb25fZmllbGRzLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgX21vZGVsX2RhdGEgbW9kZWxfZGF0YTsKK3N0cnVjdCBfbW9kZWxfZGF0YSB7CisgIGxpbmVfcmVmICpsaW5lOworICBmaWx0ZXIgKmZsYWdzOworICB0YWJsZV9lbnRyeSAqZW50cnk7CisgIHRhYmxlX2VudHJ5ICpjb2RlOworICBtb2RlbF9kYXRhICpuZXh0OworfTsKKworZW51bSB7CisgIG1vZGVsX25hbWVfZmllbGQgPSA0LAorICBtb2RlbF9mdWxsX25hbWVfZmllbGQsCisgIG1vZGVsX3VuaXRfZGF0YV9maWVsZCwKKyAgbnJfbW9kZWxfcHJvY2Vzc29yX2ZpZWxkcywKK307CisKK3R5cGVkZWYgc3RydWN0IF9tb2RlbF9lbnRyeSBtb2RlbF9lbnRyeTsKK3N0cnVjdCBfbW9kZWxfZW50cnkgeworICBsaW5lX3JlZiAqbGluZTsKKyAgZmlsdGVyICpmbGFnczsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqZnVsbF9uYW1lOworICBjaGFyICp1bml0X2RhdGE7CisgIG1vZGVsX2VudHJ5ICpuZXh0OworfTsKKworCit0eXBlZGVmIHN0cnVjdCBfbW9kZWxfdGFibGUgbW9kZWxfdGFibGU7CitzdHJ1Y3QgX21vZGVsX3RhYmxlIHsKKyAgZmlsdGVyICpwcm9jZXNzb3JzOworICBpbnQgbnJfbW9kZWxzOworICBtb2RlbF9lbnRyeSAqbW9kZWxzOworICBtb2RlbF9kYXRhICptYWNyb3M7CisgIG1vZGVsX2RhdGEgKmRhdGE7CisgIGZ1bmN0aW9uX2VudHJ5ICpzdGF0aWNzOworICBmdW5jdGlvbl9lbnRyeSAqaW50ZXJuYWxzOworICBmdW5jdGlvbl9lbnRyeSAqZnVuY3Rpb25zOworfTsKKworCisKKy8qIEluc3RydWN0aW9uIGZvcm1hdDoKKworICAgQW4gaW5zdHJ1Y3Rpb24gaXMgY29tcG9zZWQgb2YgYSBzZXF1ZW5jZSBvZiBOIGJpdCBpbnN0cnVjdGlvbgorICAgd29yZHMuICBFYWNoIHdvcmQgYnJva2VuIGludG8gYSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb24gZmllbGRzLgorICAgVGhvc2UgZmllbGRzIGJlaW5nIGNvbnN0YW50IChleC4gYW4gb3Bjb2RlKSBvciB2YXJpYWJsZSAocmVnaXN0ZXIKKyAgIHNwZWMpLgorCisgICA8aW5zbi13b3JkPiA6Oj0KKyAgICAgICA8aW5zbi1maWVsZD4geyAiLCIgPGluc24tZmllbGQ+IH0gOworCisgICA8aW5zbi1maWVsZD4gOjo9CisgICAgICAgKCA8YmluYXJ5LXZhbHVlLWltcGx5aW5nLXdpZHRoPgorICAgICAgIHwgPGZpZWxkLW5hbWUtaW1wbHlpbmctd2lkdGg+CisgICAgICAgfCBbIDxzdGFydC1vci13aWR0aD4gIi4iIF0gPGZpZWxkPiAKKyAgICAgICApCisgICAgICAgeyBbICIhIiB8ICI9IiBdIFsgPHZhbHVlPiB8IDxmaWVsZC1uYW1lPiBdIH0KKyAgICAgICA7CisKKyAgIDxmaWVsZD4gOjo9CisgICAgICAgICB7ICIqIiB9KworICAgICAgIHwgeyAiLyIgfSsKKyAgICAgICB8IDxmaWVsZC1uYW1lPgorICAgICAgIHwgIjB4IiA8aGV4LXZhbHVlPgorICAgICAgIHwgIjBiIiA8YmluYXJ5LXZhbHVlPgorICAgICAgIHwgIjAiIDxvY3RhbC12YWx1ZT4KKyAgICAgICB8IDxpbnRlZ2VyLXZhbHVlPiA7CisKKyovCisKK3R5cGVkZWYgZW51bSBfaW5zbl9maWVsZF9jb25kX3R5cGUgeworICBpbnNuX2ZpZWxkX2NvbmRfdmFsdWUsCisgIGluc25fZmllbGRfY29uZF9maWVsZCwKK30gaW5zbl9maWVsZF9jb25kX3R5cGU7Cit0eXBlZGVmIGVudW0gX2luc25fZmllbGRfY29uZF90ZXN0IHsKKyAgaW5zbl9maWVsZF9jb25kX2VxLAorICBpbnNuX2ZpZWxkX2NvbmRfbmUsCit9IGluc25fZmllbGRfY29uZF90ZXN0OwordHlwZWRlZiBzdHJ1Y3QgX2luc25fZmllbGRfY29uZCBpbnNuX2ZpZWxkX2NvbmQ7CitzdHJ1Y3QgX2luc25fZmllbGRfY29uZCB7CisgIGluc25fZmllbGRfY29uZF90eXBlIHR5cGU7CisgIGluc25fZmllbGRfY29uZF90ZXN0IHRlc3Q7CisgIGluc25fdWludCB2YWx1ZTsKKyAgc3RydWN0IF9pbnNuX2ZpZWxkX2VudHJ5ICpmaWVsZDsKKyAgY2hhciAqc3RyaW5nOworICBpbnNuX2ZpZWxkX2NvbmQgKm5leHQ7Cit9OworCisKK3R5cGVkZWYgZW51bSBfaW5zbl9maWVsZF90eXBlIHsKKyAgaW5zbl9maWVsZF9pbnZhbGlkLAorICBpbnNuX2ZpZWxkX2ludCwKKyAgaW5zbl9maWVsZF9yZXNlcnZlZCwKKyAgaW5zbl9maWVsZF93aWxkLAorICBpbnNuX2ZpZWxkX3N0cmluZywKK30gaW5zbl9maWVsZF90eXBlOworCit0eXBlZGVmIHN0cnVjdCBfaW5zbl9maWVsZF9lbnRyeSBpbnNuX2ZpZWxkX2VudHJ5Oworc3RydWN0IF9pbnNuX2ZpZWxkX2VudHJ5IHsKKyAgaW50IGZpcnN0OworICBpbnQgbGFzdDsKKyAgaW50IHdpZHRoOworICBpbnQgd29yZF9ucjsKKyAgaW5zbl9maWVsZF90eXBlIHR5cGU7CisgIGluc25fdWludCB2YWxfaW50OworICBjaGFyICpwb3Nfc3RyaW5nOworICBjaGFyICp2YWxfc3RyaW5nOworICBpbnNuX2ZpZWxkX2NvbmQgKmNvbmRpdGlvbnM7CisgIGluc25fZmllbGRfZW50cnkgKm5leHQ7CisgIGluc25fZmllbGRfZW50cnkgKnByZXY7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfaW5zbl9iaXRfZW50cnkgaW5zbl9iaXRfZW50cnk7CitzdHJ1Y3QgX2luc25fYml0X2VudHJ5IHsKKyAgaW50IHZhbHVlOworICBpbnQgbWFzazsKKyAgaW5zbl9maWVsZF9lbnRyeSAqZmllbGQ7Cit9OworCisKKworCit0eXBlZGVmIHN0cnVjdCBfaW5zbl9lbnRyeSBpbnNuX2VudHJ5OyAvKiBmb3J3YXJkICovCisKK3R5cGVkZWYgc3RydWN0IF9pbnNuX3dvcmRfZW50cnkgaW5zbl93b3JkX2VudHJ5Oworc3RydWN0IF9pbnNuX3dvcmRfZW50cnkgeworICAvKiBsaXN0IG9mIHN1Yi1maWVsZHMgbWFraW5nIHVwIHRoZSBpbnN0cnVjdGlvbi4gIGJpdCBwcm92aWRlcworICAgICBmYXN0ZXIgYWNjZXNzIHRvIHRoZSBmaWVsZCBkYXRhIGZvciBiaXQgTi4gICovCisgIGluc25fZmllbGRfZW50cnkgKmZpcnN0OworICBpbnNuX2ZpZWxkX2VudHJ5ICpsYXN0OworICBpbnNuX2JpdF9lbnRyeSAqYml0W21heF9pbnNuX2JpdF9zaXplXTsKKyAgLyogc2V0IG9mIGFsbCB0aGUgc3RyaW5nIGZpZWxkcyAqLworICBmaWx0ZXIgKmZpZWxkX25hbWVzOworICAvKiBGb3IgbXVsdGktd29yZCBpbnN0cnVjdGlvbnMsIFRoZSBOdGggd29yZCAoZnJvbSB6ZXJvKS4gKi8KKyAgaW5zbl93b3JkX2VudHJ5ICpuZXh0OworfTsKKworCisKKy8qIEluc3RydWN0aW9uIG1vZGVsOgorCisgICBQcm92aWRlcyBzY2hlZHVsaW5nIGFuZCBvdGhlciBkYXRhIGZvciB0aGUgY29kZSBtb2RlbGluZyB0aGUKKyAgIGluc3RydWN0aW9uIHVuaXQuCisKKyAgIDxpbnNuLW1vZGVsPiA6Oj0KKyAgICAgICAiKiIgWyA8cHJvY2Vzc29yLWxpc3Q+IF0KKyAgICAgICAiOiIgWyA8ZnVuY3Rpb24tdW5pdC1kYXRhPiBdCisgICAgICAgPG5sPgorICAgICAgIDsKKworICAgPHByb2Nlc3Nvci1saXN0PiA6Oj0KKyAgICAgICA8cHJvY2Vzc29yPiB7ICIsIiA8cHJvY2Vzc29yPiIgfQorICAgICAgIDsKKworICAgSWYgdGhlIDxwcm9jZXNzb3ItbGlzdD4gaXMgZW1wdHksIHRoZSBtb2RlbCBpcyBtYWRlIHRoZSBkZWZhdWx0IGZvcgorICAgdGhpcyBpbnN0cnVjdGlvbi4KKworICAgKi8KKworZW51bSB7CisgIGluc25fbW9kZWxfbmFtZV9maWVsZCA9IDAsCisgIGluc25fbW9kZWxfdW5pdF9kYXRhX2ZpZWxkID0gMSwKKyAgbnJfaW5zbl9tb2RlbF9maWVsZHMgPSAxLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgX2luc25fbW9kZWxfZW50cnkgaW5zbl9tb2RlbF9lbnRyeTsKK3N0cnVjdCBfaW5zbl9tb2RlbF9lbnRyeSB7CisgIGxpbmVfcmVmICpsaW5lOworICBpbnNuX2VudHJ5ICppbnNuOworICBmaWx0ZXIgKm5hbWVzOworICBjaGFyICpmdWxsX25hbWU7CisgIGNoYXIgKnVuaXRfZGF0YTsKKyAgaW5zbl9tb2RlbF9lbnRyeSAqbmV4dDsKK307CisKKworCisvKiBJbnN0cnVjdGlvbiBtbmVtb25pYzoKKworICAgTGlzdCBvZiBhc3NlbWJsZXIgbW5lbW9uaWNzIGZvciB0aGUgaW5zdHJ1Y3Rpb24uCisKKyAgIDxpbnNuLW1uZW5vbmljPiA6Oj0KKyAgICAgICAiXCIiIDxhc3NlbWJsZXItbW5lbW9uaWM+ICJcIiIKKyAgICAgICBbICI6IiA8Y29uZGl0aW9uYWwtZXhwcmVzc2lvbj4gXQorICAgICAgIDxubD4KKyAgICAgICA7CisKKyAgIEFuIGFzc2VtYmxlciBtbmVtb25pYyBzdHJpbmcgaGFzIHRoZSBzeW50YXg6CisKKyAgIDxhc3NlbWJsZXItbW5lbW9uaWM+ICA6Oj0KKyAgICAgICAoIFsgIiUiIDxmb3JtYXQtc3BlYz4gXSAiPCIgPGZ1bmM+IFsgIiMiIDxwYXJhbS1saXN0PiBdICI+IgorICAgICAgIHwgIiUlIgorICAgICAgIHwgPG90aGVyLWxldHRlcj4KKyAgICAgICApKworCisgICAgV2hlcmUsIGZvciBpbnN0YW5jZSwgdGhlIHRleHQgaXMgdHJhbnNsYXRlZCBpbnRvIGEgcHJpbnRmIGZvcm1hdAorICAgIGFuZCBhcmd1bWVudCBwYWlyOgorCisgICAgICAgIjxGVU5DPiIgICAgICAgICA6ICIlbGQiLCAobG9uZykgRlVOQworICAgICAgICIlPEZVTkM+Li4uIiAgICAgOiAiJS4uLiIsIEZVTkMKKyAgICAgICAiJXM8RlVOQz4iICAgICAgIDogIiVzIiwgPCVzPkZVTkMgKFNEXywgRlVOQykKKyAgICAgICAiJXM8RlVOQyNQMSxQMj4iIDogIiVzIiwgPCVzPkZVTkMgKFNEXywgUDEsUDIpCisgICAgICAgIiVseDxGVU5DPiIgICAgICA6ICIlbHgiLCAodW5zaWduZWQgbG9uZykgRlVOQworICAgICAgICIlMDhseDxGVU5DPiIgICAgOiAiJTA4bHgiLCAodW5zaWduZWQgbG9uZykgRlVOQworCisgICAgQW5kICI8JXM+RlVOQyIgZGVub3RlcyBhIGZ1bmN0aW9uIGRlY2xhcmVkIHVzaW5nIHRoZSAiJXMiIHJlY29yZAorICAgIHNwZWNpZmllci4KKworCisKKyAgICAgICA7CisKKyAgICovCisKK2VudW0geworICBpbnNuX21uZW1vbmljX2Zvcm1hdF9maWVsZCA9IDAsCisgIGluc25fbW5lbW9uaWNfY29uZGl0aW9uX2ZpZWxkID0gMSwKKyAgbnJfaW5zbl9tbmVtb25pY19maWVsZHMgPSAxLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgX2luc25fbW5lbW9uaWNfZW50cnkgaW5zbl9tbmVtb25pY19lbnRyeTsKK3N0cnVjdCBfaW5zbl9tbmVtb25pY19lbnRyeSB7CisgIGxpbmVfcmVmICpsaW5lOworICBpbnNuX2VudHJ5ICppbnNuOworICBjaGFyICpmb3JtYXQ7CisgIGNoYXIgKmNvbmRpdGlvbjsKKyAgaW5zbl9tbmVtb25pY19lbnRyeSAqbmV4dDsKK307CisKKworCisvKiBJbnN0cnVjdGlvbjoKKworICAgPGluc24+IDo6PQorICAgICAgIDxpbnNuLXdvcmQ+IHsgIisiIDxpbnNuLXdvcmQ+IH0KKyAgICAgICAiOiIgPGZvcm1hdC1uYW1lPgorICAgICAgICI6IiA8ZmlsdGVyLWZsYWdzPgorICAgICAgICI6IiA8b3B0aW9ucz4KKyAgICAgICAiOiIgPG5hbWU+CisgICAgICAgPG5sPgorICAgICAgIHsgPGluc24tbW9kZWw+IH0KKyAgICAgICB7IDxpbnNuLW1uZW1vbmljPiB9CisgICAgICAgPGNvZGUtYmxvY2s+CisKKyAqLworCitlbnVtIHsKKyAgaW5zbl93b3JkX2ZpZWxkID0gMCwKKyAgaW5zbl9mb3JtYXRfbmFtZV9maWVsZCA9IDEsCisgIGluc25fZmlsdGVyX2ZsYWdzX2ZpZWxkID0gMiwKKyAgaW5zbl9vcHRpb25zX2ZpZWxkID0gMywKKyAgaW5zbl9uYW1lX2ZpZWxkID0gNCwKKyAgbnJfaW5zbl9maWVsZHMgPSA1LAorfTsKKworCisvKiB0eXBlZGVmIHN0cnVjdCBfaW5zbl9lbnRyeSBpbnNuX2VudHJ5OyAqLworc3RydWN0IF9pbnNuX2VudHJ5IHsKKyAgbGluZV9yZWYgKmxpbmU7CisgIGZpbHRlciAqZmxhZ3M7IC8qIGZpbHRlcmVkIGJ5IG9wdGlvbnMuZmlsdGVycyAqLworICBjaGFyICpmb3JtYXRfbmFtZTsKKyAgZmlsdGVyICpvcHRpb25zOworICBjaGFyICpuYW1lOworICAvKiB0aGUgd29yZHMgdGhhdCBtYWtlIHVwIHRoZSBpbnN0cnVjdGlvbi4gV29yZCBwcm92aWRlcyBkaXJlY3QKKyAgICAgYWNjZXNzIHRvIHdvcmQgTi4gUHNldWRvIGluc3RydWN0aW9ucyBjYW4gYmUgaWRlbnRpZmllZCBieQorICAgICBucl93b3JkcyA9PSAwLiAqLworICBpbnQgbnJfd29yZHM7CisgIGluc25fd29yZF9lbnRyeSAqd29yZHM7CisgIGluc25fd29yZF9lbnRyeSAqKndvcmQ7CisgIC8qIGEgc2V0IG9mIGFsbCB0aGUgZmllbGRzIGZyb20gYWxsIHRoZSB3b3JkcyAqLworICBmaWx0ZXIgKmZpZWxkX25hbWVzOworICAvKiBhbiBhcnJheSBvZiBwcm9jZXNzb3IgbW9kZWxzLCBtaXNzaW5nIG1vZGVscyBhcmUgTlVMTCEgKi8KKyAgaW50IG5yX21vZGVsczsKKyAgaW5zbl9tb2RlbF9lbnRyeSAqbW9kZWxzOworICBpbnNuX21vZGVsX2VudHJ5ICoqbW9kZWw7CisgIGZpbHRlciAqcHJvY2Vzc29yczsKKyAgLyogbGlzdCBvZiBhc3NlbWJlciBmb3JtYXRzICovCisgIGludCBucl9tbmVtb25pY3M7CisgIGluc25fbW5lbW9uaWNfZW50cnkgKm1uZW1vbmljczsKKyAgLyogY29kZSBib2R5ICovCisgIHRhYmxlX2VudHJ5ICpjb2RlOworICBpbnNuX2VudHJ5ICpuZXh0OworfTsKKworCisvKiBJbnN0cnVjdGlvbiB0YWJsZToKKworICovCisKK3R5cGVkZWYgc3RydWN0IF9pbnNuX3RhYmxlIGluc25fdGFibGU7CitzdHJ1Y3QgX2luc25fdGFibGUgeworICBjYWNoZV9lbnRyeSAqY2FjaGVzOworICBpbnQgbWF4X25yX3dvcmRzOworICBpbnQgbnJfaW5zbnM7CisgIGluc25fZW50cnkgKmluc25zOworICBmdW5jdGlvbl9lbnRyeSAqZnVuY3Rpb25zOworICBpbnNuX2VudHJ5ICppbGxlZ2FsX2luc247CisgIG1vZGVsX3RhYmxlICptb2RlbDsKKyAgZmlsdGVyICpvcHRpb25zOworICBmaWx0ZXIgKmZsYWdzOworfTsKKworZXh0ZXJuIGluc25fdGFibGUgKmxvYWRfaW5zbl90YWJsZQorKGNoYXIgKmZpbGVfbmFtZSwKKyBjYWNoZV9lbnRyeSAqY2FjaGUpOworCit0eXBlZGVmIHZvaWQgaW5zbl9lbnRyeV9oYW5kbGVyCisobGYgKmZpbGUsCisgaW5zbl90YWJsZSAqaXNhLAorIGluc25fZW50cnkgKmluc24sCisgdm9pZCAqZGF0YSk7CisKK2V4dGVybiB2b2lkIGluc25fdGFibGVfdHJhdmVyc2VfaW5zbgorKGxmICpmaWxlLAorIGluc25fdGFibGUgKmlzYSwKKyBpbnNuX2VudHJ5X2hhbmRsZXIgKmhhbmRsZXIsCisgdm9pZCAqZGF0YSk7CisKKworCisvKiBQcmludGluZyAqLworCitleHRlcm4gdm9pZCBwcmludF9pbnNuX3dvcmRzCisobGYgKmZpbGUsCisgaW5zbl9lbnRyeSAqaW5zbik7CisKKworCisvKiBEZWJ1Z2dpbmcgKi8KKwordm9pZAorZHVtcF9pbnNuX2ZpZWxkCisobGYgKmZpbGUsCisgY2hhciAqcHJlZml4LAorIGluc25fZmllbGRfZW50cnkgKmZpZWxkLAorIGNoYXIgKnN1ZmZpeCk7CisKK3ZvaWQKK2R1bXBfaW5zbl93b3JkX2VudHJ5CisobGYgKmZpbGUsCisgY2hhciAqcHJlZml4LAorIGluc25fd29yZF9lbnRyeSAqd29yZCwKKyBjaGFyICpzdWZmaXgpOworCit2b2lkCitkdW1wX2luc25fZW50cnkKKyhsZiAqZmlsZSwKKyBjaGFyICpwcmVmaXgsCisgaW5zbl9lbnRyeSAqaW5zbiwKKyBjaGFyICpzdWZmaXgpOworCit2b2lkCitkdW1wX2NhY2hlX2VudHJpZXMKKyhsZiAqZmlsZSwKKyBjaGFyICpwcmVmaXgsCisgY2FjaGVfZW50cnkgKmVudHJ5LAorIGNoYXIgKnN1ZmZpeCk7CisKK3ZvaWQKK2R1bXBfaW5zbl90YWJsZQorKGxmICpmaWxlLAorIGNoYXIgKnByZWZpeCwKKyBpbnNuX3RhYmxlICppc2EsCisgY2hhciAqc3VmZml4KTsKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2xmLmMgYi9zaW0vaWdlbi9sZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNGE1ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaWdlbi9sZi5jCkBAIC0wLDAgKzEsNDE4IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgImxmLmgiCisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorCitzdHJ1Y3QgX2xmIHsKKyAgRklMRSAqc3RyZWFtOworICBpbnQgbGluZV9ucjsgLyogbnIgY29tcGxldGUgbGluZXMgd3JpdHRlbiwgY3VyciBsaW5lIGlzIGxpbmVfbnIrMSAqLworICBpbnQgaW5kZW50OworICBpbnQgbGluZV9ibGFuazsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY29uc3QgY2hhciAqcHJvZ3JhbTsKKyAgbGZfZmlsZV9yZWZlcmVuY2VzIHJlZmVyZW5jZXM7CisgIGxmX2ZpbGVfdHlwZSB0eXBlOworfTsKKworCitsZiAqCitsZl9vcGVuIChjaGFyICpuYW1lLAorCSBjaGFyICpyZWFsX25hbWUsCisJIGxmX2ZpbGVfcmVmZXJlbmNlcyByZWZlcmVuY2VzLAorCSBsZl9maWxlX3R5cGUgdHlwZSwKKwkgY29uc3QgY2hhciAqcHJvZ3JhbSkKK3sKKyAgLyogY3JlYXRlIGEgZmlsZSBvYmplY3QgKi8KKyAgbGYgKm5ld19sZiA9IFpBTExPQyhsZik7CisgIEFTU0VSVCAobmV3X2xmICE9IE5VTEwpOworICBuZXdfbGYtPnJlZmVyZW5jZXMgPSByZWZlcmVuY2VzOworICBuZXdfbGYtPnR5cGUgPSB0eXBlOworICBuZXdfbGYtPm5hbWUgPSAocmVhbF9uYW1lID09IE5VTEwgPyBuYW1lIDogcmVhbF9uYW1lKTsKKyAgbmV3X2xmLT5wcm9ncmFtID0gcHJvZ3JhbTsKKyAgLyogYXR0YWNoIHRvIHN0ZG91dCBpZiBwaXBlICovCisgIGlmICghc3RyY21wKG5hbWUsICItIikpIHsKKyAgICBuZXdfbGYtPnN0cmVhbSA9IHN0ZG91dDsKKyAgfQorICBlbHNlIHsKKyAgICAvKiBjcmVhdGUgYSBuZXcgZmlsZSAqLworICAgIG5ld19sZi0+c3RyZWFtID0gZm9wZW4obmFtZSwgInciKTsKKyAgICBpZiAobmV3X2xmLT5zdHJlYW0gPT0gTlVMTCkgeworICAgICAgcGVycm9yKG5hbWUpOworICAgICAgZXhpdCgxKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG5ld19sZjsKK30KKworCit2b2lkCitsZl9jbG9zZShsZiAqZmlsZSkKK3sKKyAgaWYgKGZpbGUtPnN0cmVhbSAhPSBzdGRvdXQpIHsKKyAgICBpZiAoZmNsb3NlKGZpbGUtPnN0cmVhbSkpIHsKKyAgICAgIHBlcnJvcigibGZfY2xvc2UuZmNsb3NlIik7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgICBmcmVlKGZpbGUpOworICB9Cit9CisKKworaW50CitsZl9wdXRjaHIobGYgKmZpbGUsCisJICBjb25zdCBjaGFyIGNocikKK3sKKyAgaW50IG5yID0gMDsKKyAgaWYgKGNociA9PSAnXG4nKSB7CisgICAgZmlsZS0+bGluZV9uciArPSAxOworICAgIGZpbGUtPmxpbmVfYmxhbmsgPSAxOworICB9CisgIGVsc2UgaWYgKGZpbGUtPmxpbmVfYmxhbmspIHsKKyAgICBpbnQgcGFkOworICAgIGZvciAocGFkID0gZmlsZS0+aW5kZW50OyBwYWQgPiAwOyBwYWQtLSkKKyAgICAgIHB1dGMoJyAnLCBmaWxlLT5zdHJlYW0pOworICAgIG5yICs9IGZpbGUtPmluZGVudDsKKyAgICBmaWxlLT5saW5lX2JsYW5rID0gMDsKKyAgfQorICBwdXRjKGNociwgZmlsZS0+c3RyZWFtKTsKKyAgbnIgKz0gMTsKKyAgcmV0dXJuIG5yOworfQorCitpbnQKK2xmX3dyaXRlIChsZiAqZmlsZSwKKwkgIGNvbnN0IGNoYXIgKnN0cmluZywKKwkgIGludCBzdHJsZW5fc3RyaW5nKQoreworICBpbnQgbnIgPSAwOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHN0cmxlbl9zdHJpbmc7IGkrKykKKyAgICBuciArPSBsZl9wdXRjaHIgKGZpbGUsIHN0cmluZ1tpXSk7CisgIHJldHVybiBucjsKK30KKworCit2b2lkCitsZl9pbmRlbnRfc3VwcHJlc3MobGYgKmZpbGUpCit7CisgIGZpbGUtPmxpbmVfYmxhbmsgPSAwOworfQorCisKK2ludAorbGZfcHV0c3RyKGxmICpmaWxlLAorCSAgY29uc3QgY2hhciAqc3RyaW5nKQoreworICBpbnQgbnIgPSAwOworICBjb25zdCBjaGFyICpjaHA7CisgIGlmIChzdHJpbmcgIT0gTlVMTCkgeworICAgIGZvciAoY2hwID0gc3RyaW5nOyAqY2hwICE9ICdcMCc7IGNocCsrKSB7CisgICAgICBuciArPSBsZl9wdXRjaHIoZmlsZSwgKmNocCk7CisgICAgfQorICB9CisgIHJldHVybiBucjsKK30KKworc3RhdGljIGludAorZG9fbGZfcHV0dW5zaWduZWQobGYgKmZpbGUsCisJICAgICAgdW5zaWduZWQgdSkKK3sKKyAgaW50IG5yID0gMDsKKyAgaWYgKHUgPiAwKSB7CisgICAgbnIgKz0gZG9fbGZfcHV0dW5zaWduZWQoZmlsZSwgdSAvIDEwKTsKKyAgICBuciArPSBsZl9wdXRjaHIoZmlsZSwgKHUgJSAxMCkgKyAnMCcpOworICB9CisgIHJldHVybiBucjsKK30KKworCitpbnQKK2xmX3B1dGludChsZiAqZmlsZSwKKwkgIGludCBkZWNpbWFsKQoreworICBpbnQgbnIgPSAwOworICBpZiAoZGVjaW1hbCA9PSAwKQorICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCAnMCcpOworICBlbHNlIGlmIChkZWNpbWFsIDwgMCkgeworICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCAnLScpOworICAgIG5yICs9IGRvX2xmX3B1dHVuc2lnbmVkKGZpbGUsIC1kZWNpbWFsKTsKKyAgfQorICBlbHNlIGlmIChkZWNpbWFsID4gMCkgeworICAgIG5yICs9IGRvX2xmX3B1dHVuc2lnbmVkKGZpbGUsIGRlY2ltYWwpOworICB9CisgIGVsc2UKKyAgICBBU1NFUlQoMCk7CisgIHJldHVybiBucjsKK30KKworCitpbnQKK2xmX3ByaW50ZiAobGYgKmZpbGUsCisJICAgY29uc3QgY2hhciAqZm10LAorCSAgIC4uLikKK3sKKyAgaW50IG5yID0gMDsKKyAgY2hhciBidWZbMTAyNF07CisgIHZhX2xpc3QgYXA7CisKKyAgdmFfc3RhcnQgKGFwLCBmbXQpOworICB2c3ByaW50ZiAoYnVmLCBmbXQsIGFwKTsKKyAgLyogRklYTUUgLSB0aGlzIGlzIHJlYWxseSBzdHVmZmVkIGJ1dCBzbyBpcyB2c3ByaW50ZigpIG9uIGEgc3VuISAqLworICBBU1NFUlQgKHN0cmxlbiAoYnVmKSA8IHNpemVvZiAoYnVmKSk7CisgIG5yICs9IGxmX3B1dHN0ciAoZmlsZSwgYnVmKTsKKyAgdmFfZW5kKGFwKTsKKyAgcmV0dXJuIG5yOworfQorCisKK2ludAorbGZfcHJpbnRfX2xpbmVfcmVmIChsZiAqZmlsZSwKKwkJICAgIGxpbmVfcmVmICpsaW5lKQoreworICByZXR1cm4gbGZfcHJpbnRfX2V4dGVybmFsX3JlZiAoZmlsZSwgbGluZS0+bGluZV9uciwgbGluZS0+ZmlsZV9uYW1lKTsKK30KKworaW50CitsZl9wcmludF9fZXh0ZXJuYWxfcmVmIChsZiAqZmlsZSwKKwkJCWludCBsaW5lX25yLAorCQkJY29uc3QgY2hhciAqZmlsZV9uYW1lKQoreworICBpbnQgbnIgPSAwOworICBzd2l0Y2ggKGZpbGUtPnJlZmVyZW5jZXMpCisgICAgeworICAgIGNhc2UgbGZfaW5jbHVkZV9yZWZlcmVuY2VzOgorICAgICAgbGZfaW5kZW50X3N1cHByZXNzKGZpbGUpOworICAgICAgbnIgKz0gbGZfcHV0c3RyIChmaWxlLCAiI2xpbmUgIik7CisgICAgICBuciArPSBsZl9wdXRpbnQgKGZpbGUsIGxpbmVfbnIpOworICAgICAgbnIgKz0gbGZfcHV0c3RyIChmaWxlLCAiIFwiIik7CisgICAgICBuciArPSBsZl9wdXRzdHIgKGZpbGUsIGZpbGVfbmFtZSk7CisgICAgICBuciArPSBsZl9wdXRzdHIgKGZpbGUsICJcIlxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGxmX29taXRfcmVmZXJlbmNlczoKKyAgICAgIG5yICs9IGxmX3B1dHN0ciAoZmlsZSwgIi8qICIpOworICAgICAgbnIgKz0gbGZfcHV0c3RyIChmaWxlLCBmaWxlX25hbWUpOworICAgICAgbnIgKz0gbGZfcHV0c3RyIChmaWxlLCAiOiIpOworICAgICAgbnIgKz0gbGZfcHV0aW50IChmaWxlLCBsaW5lX25yKTsKKyAgICAgIG5yICs9IGxmX3B1dHN0ciAoZmlsZSwgIiovXG4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIG5yOworfQorCitpbnQKK2xmX3ByaW50X19pbnRlcm5hbF9yZWYgKGxmICpmaWxlKQoreworICBpbnQgbnIgPSAwOworICBuciArPSBsZl9wcmludF9fZXh0ZXJuYWxfcmVmIChmaWxlLCBmaWxlLT5saW5lX25yKzIsIGZpbGUtPm5hbWUpOworICAvKiBsaW5lX25yID09IGxhc3RfbGluZSwgd2FudCB0byBudW1iZXIgZnJvbSBuZXh0ICovCisgIHJldHVybiBucjsKK30KKwordm9pZAorbGZfaW5kZW50IChsZiAqZmlsZSwgaW50IGRlbHRhKQoreworICBmaWxlLT5pbmRlbnQgKz0gZGVsdGE7Cit9CisKKworaW50CitsZl9wcmludF9fZ251X2NvcHlsZWZ0IChsZiAqZmlsZSkKK3sKKyAgaW50IG5yID0gMDsKKyAgc3dpdGNoIChmaWxlLT50eXBlKSB7CisgIGNhc2UgbGZfaXNfYzoKKyAgY2FzZSBsZl9pc19oOgorICAgIG5yICs9IGxmX3ByaW50ZihmaWxlLCAiXAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgIC0tCisKKyAgICBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgcHJvZ3JhbSAlcyAqLworIiwgZmlsdGVyX2ZpbGVuYW1lKGZpbGUtPnByb2dyYW0pKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBBU1NFUlQoMCk7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIG5yOworfQorCisKK2ludAorbGZfcHV0YmluKGxmICpmaWxlLCBpbnQgZGVjaW1hbCwgaW50IHdpZHRoKQoreworICBpbnQgbnIgPSAwOworICBpbnQgYml0OworICBBU1NFUlQod2lkdGggPiAwKTsKKyAgZm9yIChiaXQgPSAxIDw8ICh3aWR0aC0xKTsgYml0ICE9IDA7IGJpdCA+Pj0gMSkgeworICAgIGlmIChkZWNpbWFsICYgYml0KQorICAgICAgbnIgKz0gbGZfcHV0Y2hyKGZpbGUsICcxJyk7CisgICAgZWxzZQorICAgICAgbnIgKz0gbGZfcHV0Y2hyKGZpbGUsICcwJyk7CisgIH0KKyAgcmV0dXJuIG5yOworfQorCitpbnQKK2xmX3ByaW50X190aGlzX2ZpbGVfaXNfZW1wdHkobGYgKmZpbGUsCisJCQkgICAgIGNvbnN0IGNoYXIgKnJlYXNvbikKK3sKKyAgaW50IG5yID0gMDsKKyAgc3dpdGNoIChmaWxlLT50eXBlKSB7CisgIGNhc2UgbGZfaXNfYzoKKyAgY2FzZSBsZl9pc19oOgorICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwKKwkJICAgICIvKiBUaGlzIGdlbmVyYXRlZCBmaWxlICglcykgaXMgaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rIiwKKwkJICAgIGZpbGUtPm5hbWUpOworICAgIGlmIChyZWFzb24gIT0gTlVMTCkKKyAgICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiAtICVzIiwgcmVhc29uKTsKKyAgICBuciArPSBsZl9wcmludGYgKGZpbGUsICIgKi9cbiIpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUk9SICgiQmFkIHN3aXRjaCIpOworICB9CisgIHJldHVybiBucjsKK30KKworaW50CitsZl9wcmludF9fdWNhc2VfZmlsZW5hbWUobGYgKmZpbGUpCit7CisgIGludCBuciA9IDA7CisgIGNvbnN0IGNoYXIgKmNocCA9IGZpbGUtPm5hbWU7CisgIHdoaWxlICgqY2hwICE9ICdcMCcpIHsKKyAgICBjaGFyIGNoID0gKmNocDsKKyAgICBpZiAoaXNsb3dlcihjaCkpIHsKKyAgICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCB0b3VwcGVyKGNoKSk7CisgICAgfQorICAgIGVsc2UgaWYgKGNoID09ICcuJykKKyAgICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCAnXycpOworICAgIGVsc2UKKyAgICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCBjaCk7CisgICAgY2hwKys7CisgIH0KKyAgcmV0dXJuIG5yOworfQorCitpbnQKK2xmX3ByaW50X19maWxlX3N0YXJ0KGxmICpmaWxlKQoreworICBpbnQgbnIgPSAwOworICBzd2l0Y2ggKGZpbGUtPnR5cGUpIHsKKyAgY2FzZSBsZl9pc19oOgorICBjYXNlIGxmX2lzX2M6CisgICAgbnIgKz0gbGZfcHJpbnRfX2dudV9jb3B5bGVmdChmaWxlKTsKKyAgICBuciArPSBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgICAgbnIgKz0gbGZfcHJpbnRmKGZpbGUsICIjaWZuZGVmICIpOworICAgIG5yICs9IGxmX3ByaW50X191Y2FzZV9maWxlbmFtZShmaWxlKTsKKyAgICBuciArPSBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgICAgbnIgKz0gbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lICIpOworICAgIG5yICs9IGxmX3ByaW50X191Y2FzZV9maWxlbmFtZShmaWxlKTsKKyAgICBuciArPSBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgICAgbnIgKz0gbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEFTU0VSVCgwKTsKKyAgfQorICByZXR1cm4gbnI7Cit9CisKKworaW50CitsZl9wcmludF9fZmlsZV9maW5pc2gobGYgKmZpbGUpCit7CisgIGludCBuciA9IDA7CisgIHN3aXRjaCAoZmlsZS0+dHlwZSkgeworICBjYXNlIGxmX2lzX2g6CisgIGNhc2UgbGZfaXNfYzoKKyAgICBuciArPSBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgICAgbnIgKz0gbGZfcHJpbnRmKGZpbGUsICIjZW5kaWYgLyogXyIpOworICAgIG5yICs9IGxmX3ByaW50X191Y2FzZV9maWxlbmFtZShmaWxlKTsKKyAgICBuciArPSBsZl9wcmludGYoZmlsZSwgIl8qL1xuIik7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgQVNTRVJUKDApOworICB9CisgIHJldHVybiBucjsKK30KKworCitpbnQKK2xmX3ByaW50X19mdW5jdGlvbl90eXBlIChsZiAqZmlsZSwKKwkJCSBjb25zdCBjaGFyICp0eXBlLAorCQkJIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJCSBjb25zdCBjaGFyICp0cmFpbGluZ19zcGFjZSkKK3sKKyAgaW50IG5yID0gMDsKKyAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiJXNcXFxuKCVzKSIsIHByZWZpeCwgdHlwZSk7CisgIGlmICh0cmFpbGluZ19zcGFjZSAhPSBOVUxMKQorICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgdHJhaWxpbmdfc3BhY2UpOworICByZXR1cm4gbnI7Cit9CisKK2ludAorbGZfcHJpbnRfX2Z1bmN0aW9uX3R5cGVfZnVuY3Rpb24gKGxmICpmaWxlLAorCQkJCSAgcHJpbnRfZnVuY3Rpb24gKnByaW50X3R5cGUsCisJCQkJICBjb25zdCBjaGFyICpwcmVmaXgsCisJCQkJICBjb25zdCBjaGFyICp0cmFpbGluZ19zcGFjZSkKK3sKKyAgaW50IG5yID0gMDsKKyAgbnIgKz0gbGZfcHJpbnRmIChmaWxlLCAiJXNcXFxuKCIsIHByZWZpeCk7CisgIG5yICs9IHByaW50X3R5cGUgKGZpbGUpOworICBuciArPSBsZl9wcmludGYgKGZpbGUsICIpIik7CisgIGlmICh0cmFpbGluZ19zcGFjZSAhPSBOVUxMKQorICAgIG5yICs9IGxmX3ByaW50ZiAoZmlsZSwgIiVzIiwgdHJhaWxpbmdfc3BhY2UpOworICByZXR1cm4gbnI7Cit9CisKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL2xmLmggYi9zaW0vaWdlbi9sZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NjhmNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaWdlbi9sZi5oCkBAIC0wLDAgKzEsMTQzIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisvKiBMRjogTGluZSBOdW1iZXJlZCBPdXRwdXQgU3RyZWFtICovCisKK3R5cGVkZWYgc3RydWN0IF9sZiBsZjsKKwordHlwZWRlZiBlbnVtIHsKKyAgbGZfaXNfaCwKKyAgbGZfaXNfYywKKyAgbGZfaXNfdGV4dCwKK30gbGZfZmlsZV90eXBlOworCisKK3R5cGVkZWYgZW51bSB7CisgIGxmX2luY2x1ZGVfcmVmZXJlbmNlcywKKyAgbGZfb21pdF9yZWZlcmVuY2VzLAorfSBsZl9maWxlX3JlZmVyZW5jZXM7CisKKworLyogT3BlbiB0aGUgZmlsZSBOQU1FIGZvciB3cml0aW5nICgiLSIgZm9yIHN0ZG91dCkuICBVc2UgUkVBTF9OQU1FCisgICB3aGVuIHJlZmVyaW5nIHRvIHRoZSBvcGVuZWQgZmlsZS4gIExpbmUgbnVtYmVyIGluZm9ybWF0aW9uIChpbiB0aGUKKyAgIG91dHB1dCkgY2FuIGJlIHN1cHByZXNzZWQgd2l0aCBGSUxFX1JFRkVSRU5DRVMgPT0KKyAgIExGX09NSVRfUkVGRVJFTkNFUy4gIFRZUEUgaXMgdG8gZGV0ZXJtaW5lIHRoZSBmb3JtYXR0aW5nIG9mIHNvbWUgb2YKKyAgIHRoZSBwcmludCBtZXNzYWdlcyBiZWxvdy4gKi8KKworZXh0ZXJuIGxmICpsZl9vcGVuCisoY2hhciAqbmFtZSwKKyBjaGFyICpyZWFsX25hbWUsCisgbGZfZmlsZV9yZWZlcmVuY2VzIGZpbGVfcmVmZXJlbmNlcywKKyBsZl9maWxlX3R5cGUgdHlwZSwKKyBjb25zdCBjaGFyICpwcm9ncmFtKTsKKworZXh0ZXJuIHZvaWQgbGZfY2xvc2UKKyhsZiAqZmlsZSk7CisKKworLyogQmFzaWMgb3V0cHV0IGZ1bmN0aW9ucyAqLworCitleHRlcm4gaW50IGxmX3dyaXRlCisobGYgKmZpbGUsCisgY29uc3QgY2hhciAqc3RyaW5nLAorIGludCBsZW4pOworCitleHRlcm4gaW50IGxmX3B1dGNocgorKGxmICpmaWxlLAorIGNvbnN0IGNoYXIgY2gpOworCitleHRlcm4gaW50IGxmX3B1dHN0cgorKGxmICpmaWxlLAorIGNvbnN0IGNoYXIgKnN0cmluZyk7CisKK2V4dGVybiBpbnQgbGZfcHV0aW50CisobGYgKmZpbGUsCisgaW50IGRlY2ltYWwpOworCitleHRlcm4gaW50IGxmX3B1dGJpbgorKGxmICpmaWxlLAorIGludCBkZWNpbWFsLAorIGludCB3aWR0aCk7CisKK2V4dGVybiBpbnQgbGZfcHJpbnRmCisobGYgKmZpbGUsCisgY29uc3QgY2hhciAqZm10LAorIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKKworCisvKiBJbmRlbnRhdGlvbiBjb250cm9sLgorCisgICBsZl9pbmRlbnRfc3VwcHJlc3Mgc3VwcHJlc3NlcyBpbmRlbnRhdGlvbiBvbiB0aGUgbmV4dCBsaW5lIChjdXJyZW50CisgICBsaW5lIGlmIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkKSAqLworCitleHRlcm4gdm9pZCBsZl9pbmRlbnRfc3VwcHJlc3MKKyhsZiAqZmlsZSk7CisKK2V4dGVybiB2b2lkIGxmX2luZGVudAorKGxmICpmaWxlLAorIGludCBkZWx0YSk7CisKKworLyogUHJpbnQgZ2VuZXJpYyB0ZXh0OiAqLworCisKK2V4dGVybiBpbnQgbGZfcHJpbnRfX2dudV9jb3B5bGVmdAorKGxmICpmaWxlKTsKKworZXh0ZXJuIGludCBsZl9wcmludF9fZmlsZV9zdGFydAorKGxmICpmaWxlKTsKKworZXh0ZXJuIGludCBsZl9wcmludF9fdGhpc19maWxlX2lzX2VtcHR5CisobGYgKmZpbGUsCisgY29uc3QgY2hhciAqcmVhc29uKTsKKworZXh0ZXJuIGludCBsZl9wcmludF9fZmlsZV9maW5pc2gKKyhsZiAqZmlsZSk7CisKK2V4dGVybiBpbnQgbGZfcHJpbnRfX2ludGVybmFsX3JlZgorKGxmICpmaWxlKTsKKworZXh0ZXJuIGludCBsZl9wcmludF9fZXh0ZXJuYWxfcmVmCisobGYgKmZpbGUsCisgaW50IGxpbmVfbnIsCisgY29uc3QgY2hhciAqZmlsZV9uYW1lKTsKKworZXh0ZXJuIGludCBsZl9wcmludF9fbGluZV9yZWYKKyhsZiAqZmlsZSwKKyBsaW5lX3JlZiAqbGluZSk7CisKK2V4dGVybiBpbnQgbGZfcHJpbnRfX3VjYXNlX2ZpbGVuYW1lCisobGYgKmZpbGUpOworCitleHRlcm4gaW50IGxmX3ByaW50X19mdW5jdGlvbl90eXBlCisobGYgKmZpbGUsCisgY29uc3QgY2hhciAqdHlwZSwKKyBjb25zdCBjaGFyICpwcmVmaXgsCisgY29uc3QgY2hhciAqdHJhaWxpbmdfc3BhY2UpOworCit0eXBlZGVmIGludCBwcmludF9mdW5jdGlvbihsZiAqZmlsZSk7CisKK2V4dGVybiBpbnQgbGZfcHJpbnRfX2Z1bmN0aW9uX3R5cGVfZnVuY3Rpb24KKyhsZiAqZmlsZSwKKyBwcmludF9mdW5jdGlvbiAqcHJpbnRfdHlwZSwKKyBjb25zdCBjaGFyICpwcmVmaXgsCisgY29uc3QgY2hhciAqdHJhaWxpbmdfc3BhY2UpOworCmRpZmYgLS1naXQgYS9zaW0vaWdlbi9taXNjLmMgYi9zaW0vaWdlbi9taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ5MDEzMgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9pZ2VuL21pc2MuYwpAQCAtMCwwICsxLDI4NCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKy8qIE5COiBCZWNhdXNlIHdhcm5pbmcgYW5kIGVycm9yIGNhbiBiZSBpbnRlcmNoYW5nZWQsIG5laXRoZXIgYXBwZW5kIGEKKyAgIHRyYWlsaW5nICdcbicgKi8KKwordm9pZAorZXJyb3IgKGNvbnN0IGxpbmVfcmVmICpsaW5lLAorICAgICAgIGNoYXIgKm1zZywKKyAgICAgICAuLi4pCit7CisgIHZhX2xpc3QgYXA7CisgIGlmIChsaW5lICE9IE5VTEwpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JWQ6ICIsIGxpbmUtPmZpbGVfbmFtZSwgbGluZS0+bGluZV9ucik7CisgIHZhX3N0YXJ0IChhcCwgbXNnKTsKKyAgdmZwcmludGYgKHN0ZGVyciwgbXNnLCBhcCk7CisgIHZhX2VuZCAoYXApOworICBleGl0ICgxKTsKK30KKwordm9pZAord2FybmluZyAoY29uc3QgbGluZV9yZWYgKmxpbmUsCisJIGNoYXIgKm1zZywKKwkgLi4uKQoreworICB2YV9saXN0IGFwOworICBpZiAobGluZSAhPSBOVUxMKQorICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkOiB3YXJuaW5nOiAiLCBsaW5lLT5maWxlX25hbWUsIGxpbmUtPmxpbmVfbnIpOworICB2YV9zdGFydCAoYXAsIG1zZyk7CisgIHZmcHJpbnRmIChzdGRlcnIsIG1zZywgYXApOworICB2YV9lbmQgKGFwKTsKK30KKwordm9pZAorbm90aWZ5IChjb25zdCBsaW5lX3JlZiAqbGluZSwKKwljaGFyICptc2csCisJLi4uKQoreworICB2YV9saXN0IGFwOworICBpZiAobGluZSAhPSBOVUxMKQorICAgIGZwcmludGYgKHN0ZG91dCwgIiVzICVkOiBpbmZvOiAiLCBsaW5lLT5maWxlX25hbWUsIGxpbmUtPmxpbmVfbnIpOworICB2YV9zdGFydChhcCwgbXNnKTsKKyAgdmZwcmludGYgKHN0ZG91dCwgbXNnLCBhcCk7CisgIHZhX2VuZChhcCk7Cit9CisKK3ZvaWQgKgoremFsbG9jKGxvbmcgc2l6ZSkKK3sKKyAgdm9pZCAqbWVtb3J5ID0gbWFsbG9jKHNpemUpOworICBpZiAobWVtb3J5ID09IE5VTEwpCisgICAgRVJST1IgKCJ6YWxsb2MgZmFpbGVkIik7CisgIG1lbXNldChtZW1vcnksIDAsIHNpemUpOworICByZXR1cm4gbWVtb3J5OworfQorCisKK3Vuc2lnbmVkIGxvbmcgbG9uZworYTJpIChjb25zdCBjaGFyICphKQoreworICBpbnQgbmVnID0gMDsKKyAgaW50IGJhc2UgPSAxMDsKKyAgdW5zaWduZWQgbG9uZyBsb25nIG51bSA9IDA7CisgIGludCBsb29waW5nOworICAKKyAgd2hpbGUgKGlzc3BhY2UgKCphKSkKKyAgICBhKys7CisgIAorICBpZiAoc3RyY21wIChhLCAidHJ1ZSIpID09IDAKKyAgICAgIHx8IHN0cmNtcCAoYSwgIlRSVUUiKSA9PSAwKQorICAgIHJldHVybiAxOworCisgIGlmIChzdHJjbXAgKGEsICJmYWxzZSIpID09IDAKKyAgICAgIHx8IHN0cmNtcCAoYSwgImZhbHNlIikgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBpZiAoKmEgPT0gJy0nKQorICAgIHsKKyAgICAgIG5lZyA9IDE7CisgICAgICBhKys7CisgICAgfQorICAKKyAgaWYgKCphID09ICcwJykKKyAgICB7CisgICAgICBpZiAoYVsxXSA9PSAneCcgfHwgYVsxXSA9PSAnWCcpCisJeworCSAgYSArPSAyOworCSAgYmFzZSA9IDE2OworCX0KKyAgICAgIGVsc2UgaWYgKGFbMV0gPT0gJ2InIHx8IGFbMV0gPT0gJ2InKQorCXsKKwkgIGEgKz0gMjsKKwkgIGJhc2UgPSAyOworCX0KKyAgICAgIGVsc2UKKwliYXNlID0gODsKKyAgICB9CisgIAorICBsb29waW5nID0gMTsKKyAgd2hpbGUgKGxvb3BpbmcpCisgICAgeworICAgICAgaW50IGNoID0gKmErKzsKKyAgICAgIAorICAgICAgc3dpdGNoIChiYXNlKQorCXsKKwlkZWZhdWx0OgorCSAgbG9vcGluZyA9IDA7CisJICBicmVhazsKKwkgIAorCWNhc2UgMjoKKwkgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzEnKQorCSAgICB7CisJICAgICAgbnVtID0gKG51bSAqIDIpICsgKGNoIC0gJzAnKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgbG9vcGluZyA9IDA7CisJICAgIH0KKwkgIGJyZWFrOworCSAgCisJY2FzZSAxMDoKKwkgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQorCSAgICB7CisJICAgICAgbnVtID0gKG51bSAqIDEwKSArIChjaCAtICcwJyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGxvb3BpbmcgPSAwOworCSAgICB9CisJICBicmVhazsKKwkgIAorCWNhc2UgODoKKwkgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzcnKQorCSAgICB7CisJICAgICAgbnVtID0gKG51bSAqIDgpICsgKGNoIC0gJzAnKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgbG9vcGluZyA9IDA7CisJICAgIH0KKwkgIGJyZWFrOworCSAgCisJY2FzZSAxNjoKKwkgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQorCSAgICB7CisJICAgICAgbnVtID0gKG51bSAqIDE2KSArIChjaCAtICcwJyk7CisJICAgIH0KKwkgIGVsc2UgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpCisJICAgIHsKKwkgICAgICBudW0gPSAobnVtICogMTYpICsgKGNoIC0gJ2EnICsgMTApOworCSAgICB9CisJICBlbHNlIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKQorCSAgICB7CisJICAgICAgbnVtID0gKG51bSAqIDE2KSArIChjaCAtICdBJyArIDEwKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgbG9vcGluZyA9IDA7CisJICAgIH0KKwkgIGJyZWFrOworCX0KKyAgICB9CisgIAorICBpZiAobmVnKQorICAgIG51bSA9IC0gbnVtOworCisgIHJldHVybiBudW07Cit9CisKK3Vuc2lnbmVkCit0YXJnZXRfYTJpKGludCBtc19iaXRfbnIsCisJICAgY29uc3QgY2hhciAqYSkKK3sKKyAgaWYgKG1zX2JpdF9ucikKKyAgICByZXR1cm4gKG1zX2JpdF9uciAtIGEyaShhKSk7CisgIGVsc2UKKyAgICByZXR1cm4gYTJpKGEpOworfQorCit1bnNpZ25lZAoraTJ0YXJnZXQoaW50IG1zX2JpdF9uciwKKwkgdW5zaWduZWQgYml0KQoreworICBpZiAobXNfYml0X25yKQorICAgIHJldHVybiBtc19iaXRfbnIgLSBiaXQ7CisgIGVsc2UKKyAgICByZXR1cm4gYml0OworfQorCisKK2ludAorbmFtZTJpIChjb25zdCBjaGFyICpuYW1lcywKKyAgICAgICAgY29uc3QgbmFtZV9tYXAgKm1hcCkKK3sKKyAgY29uc3QgbmFtZV9tYXAgKmN1cnI7CisgIGNvbnN0IGNoYXIgKm5hbWUgPSBuYW1lczsKKyAgd2hpbGUgKCpuYW1lICE9ICdcMCcpCisgICAgeworICAgICAgLyogZmluZCBvdXIgbmFtZSAqLworICAgICAgY2hhciAqZW5kID0gc3RyY2hyKG5hbWUsICcsJyk7CisgICAgICBjaGFyICpuZXh0OworICAgICAgdW5zaWduZWQgbGVuOworICAgICAgaWYgKGVuZCA9PSBOVUxMKQorCXsKKwkgIGVuZCA9IHN0cmNocihuYW1lLCAnXDAnKTsKKwkgIG5leHQgPSBlbmQ7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG5leHQgPSBlbmQgKyAxOworCX0KKyAgICAgIGxlbiA9IGVuZCAtIG5hbWU7CisgICAgICAvKiBsb29rIGl0IHVwICovCisgICAgICBjdXJyID0gbWFwOworICAgICAgd2hpbGUgKGN1cnItPm5hbWUgIT0gTlVMTCkKKwl7CisJICBpZiAoc3RybmNtcCAoY3Vyci0+bmFtZSwgbmFtZSwgbGVuKSA9PSAwCisJICAgICAgJiYgc3RybGVuIChjdXJyLT5uYW1lKSA9PSBsZW4pCisJICAgIHJldHVybiBjdXJyLT5pOworCSAgY3VycisrOworCX0KKyAgICAgIG5hbWUgPSBuZXh0OworICAgIH0KKyAgLyogbm90aGluZyBmb3VuZCwgcG9zc2libHkgcmV0dXJuIGEgZGVmYXVsdCAqLworICBjdXJyID0gbWFwOworICB3aGlsZSAoY3Vyci0+bmFtZSAhPSBOVUxMKQorICAgIGN1cnIrKzsKKyAgaWYgKGN1cnItPmkgPj0gMCkKKyAgICByZXR1cm4gY3Vyci0+aTsKKyAgZWxzZQorICAgIGVycm9yIChOVUxMLCAiJXMgY29udGFpbnMgbm8gdmFsaWQgbmFtZXMiLCBuYW1lcyk7CisgIHJldHVybiAwOworfQorCitjb25zdCBjaGFyICoKK2kybmFtZSAoY29uc3QgaW50IGksCisgICAgICAgIGNvbnN0IG5hbWVfbWFwICptYXApCit7CisgIHdoaWxlIChtYXAtPm5hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAobWFwLT5pID09IGkpCisJcmV0dXJuIG1hcC0+bmFtZTsKKyAgICAgIG1hcCsrOworICAgIH0KKyAgZXJyb3IgKE5VTEwsICJtYXAgbG9va3VwIGZhaWxlZCBmb3IgJWRcbiIsIGkpOworICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL21pc2MuaCBiL3NpbS9pZ2VuL21pc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGE4MDdmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL2lnZW4vbWlzYy5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisvKiBGcnVzdHJhdGluZyBoZWFkZXIganVuayAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKworZW51bSB7CisgIGRlZmF1bHRfaW5zbl9iaXRfc2l6ZSA9IDMyLAorICBtYXhfaW5zbl9iaXRfc2l6ZSA9IDY0LAorfTsKKworCisvKiBEZWZpbmUgYSA2NGJpdCBkYXRhIHR5cGUgKi8KKworI2lmIGRlZmluZWQgX19HTlVDX18gfHwgZGVmaW5lZCBfV0lOMzIKKyNpZmRlZiBfX0dOVUNfXworCit0eXBlZGVmIGxvbmcgbG9uZyBzaWduZWQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVuc2lnbmVkNjQ7CisKKyNlbHNlCS8qIF9XSU4zMiAqLworCit0eXBlZGVmIF9faW50NjQgc2lnbmVkNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdW5zaWduZWQ2NDsKKworI2VuZGlmIC8qIF9XSU4zMiAqLworI2Vsc2UgLyogTm90IEdOVUMgb3IgV0lOMzIgKi8KKy8qIE5vdCBzdXBwb3J0ZWQgKi8KKyNlbmRpZgorCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKF9fYXR0cmlidXRlX18pICYmICghZGVmaW5lZChfX0dOVUNfXykgfHwgX19HTlVDX18gPCAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgNykpCisjZGVmaW5lIF9fYXR0cmlidXRlX18oYXJnKQorI2VuZGlmCisKKworCisjaW5jbHVkZSAiZmlsdGVyX2hvc3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgX2xpbmVfcmVmIGxpbmVfcmVmOworc3RydWN0IF9saW5lX3JlZiB7CisgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZTsKKyAgaW50IGxpbmVfbnI7Cit9OworCisvKiBFcnJvciBhcHBlbmRzIGEgbmV3IGxpbmUsIHdhcm5pbmcgYW5kIG5vdGlmeSBkbyBub3QgKi8KK3R5cGVkZWYgdm9pZCBlcnJvcl9mdW5jCisoY29uc3QgbGluZV9yZWYgKmxpbmUsCisgY2hhciAqbXNnLAorIC4uLik7CisKK2V4dGVybiBlcnJvcl9mdW5jIGVycm9yOworZXh0ZXJuIGVycm9yX2Z1bmMgd2FybmluZzsKK2V4dGVybiBlcnJvcl9mdW5jIG5vdGlmeTsKKworCisjZGVmaW5lIEVSUk9SKEVYUFJFU1NJT04pIFwKK2RvIHsgXAorICBsaW5lX3JlZiBsaW5lOyBcCisgIGxpbmUuZmlsZV9uYW1lID0gZmlsdGVyX2ZpbGVuYW1lIChfX0ZJTEVfXyk7IFwKKyAgbGluZS5saW5lX25yID0gX19MSU5FX187IFwKKyAgZXJyb3IgKCZsaW5lLCBFWFBSRVNTSU9OKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBU1NFUlQoRVhQUkVTU0lPTikgXAorZG8geyBcCisgIGlmICghKEVYUFJFU1NJT04pKSB7IFwKKyAgICBsaW5lX3JlZiBsaW5lOyBcCisgICAgbGluZS5maWxlX25hbWUgPSBmaWx0ZXJfZmlsZW5hbWUgKF9fRklMRV9fKTsgXAorICAgIGxpbmUubGluZV9uciA9IF9fTElORV9fOyBcCisgICAgZXJyb3IoJmxpbmUsICJhc3NlcnRpb24gZmFpbGVkIC0gJXNcbiIsICNFWFBSRVNTSU9OKTsgXAorICB9IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgWkFMTE9DKFRZUEUpICgoVFlQRSopIHphbGxvYyAoc2l6ZW9mKFRZUEUpKSkKKyNkZWZpbmUgTlpBTExPQyhUWVBFLE4pICgoVFlQRSopIHphbGxvYyAoc2l6ZW9mKFRZUEUpICogKE4pKSkKKyNpZiAwCisjZGVmaW5lIFNUUkRVUChTVFJJTkcpIChzdHJjcHkgKHphbGxvYyAoc3RybGVuIChTVFJJTkcpICsgMSksIChTVFJJTkcpKSkKKyNkZWZpbmUgU1RSTkRVUChTVFJJTkcsTEVOKSAoc3RybmNweSAoemFsbG9jICgoTEVOKSArIDEpLCAoU1RSSU5HKSwgKExFTikpKQorI2VuZGlmCisKK2V4dGVybiB2b2lkICp6YWxsb2MKKyhsb25nIHNpemUpOworCitleHRlcm4gdW5zaWduZWQgdGFyZ2V0X2EyaQorKGludCBtc19iaXRfbnIsCisgY29uc3QgY2hhciAqYSk7CisKK2V4dGVybiB1bnNpZ25lZCBpMnRhcmdldAorKGludCBtc19iaXRfbnIsCisgdW5zaWduZWQgYml0KTsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBhMmkKKyhjb25zdCBjaGFyICphKTsKKworCisvKiBUcnkgbG9va2luZyBmb3IgbmFtZSBpbiB0aGUgbWFwIHRhYmxlIChyZXR1cm5pbmcgdGhlIGNvcnJlc3BvbmRpbmcKKyAgIGludGVnZXIgdmFsdWUpLgorCisgICBJZiB0aGUgdGhlIHNlbnRpbmFsIChOQU1FID09IE5VTEwpIGl0cyB2YWx1ZSBpZiA+PSB6ZXJvIGlzIHJldHVybmVkCisgICBhcyB0aGUgZGVmYXVsdC4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgX25hbWVfbWFwIHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgaW50IGk7Cit9IG5hbWVfbWFwOworCitleHRlcm4gaW50IG5hbWUyaQorKGNvbnN0IGNoYXIgKm5hbWUsCisgY29uc3QgbmFtZV9tYXAgKm1hcCk7CisKK2V4dGVybiBjb25zdCBjaGFyICppMm5hbWUKKyhjb25zdCBpbnQgaSwKKyBjb25zdCBuYW1lX21hcCAqbWFwKTsKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL3RhYmxlLmMgYi9zaW0vaWdlbi90YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YTllOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaWdlbi90YWJsZS5jCkBAIC0wLDAgKzEsNjMyIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LDE5OTcgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAibGYuaCIKKyNpbmNsdWRlICJ0YWJsZS5oIgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgX29wZW5fdGFibGUgb3Blbl90YWJsZTsKK3N0cnVjdCBfb3Blbl90YWJsZSB7CisgIHNpemVfdCBzaXplOworICBjaGFyICpidWZmZXI7CisgIGNoYXIgKnBvczsKKyAgbGluZV9yZWYgcHNldWRvX2xpbmU7CisgIGxpbmVfcmVmIHJlYWxfbGluZTsKKyAgb3Blbl90YWJsZSAqcGFyZW50OworICB0YWJsZSAqcm9vdDsKK307CitzdHJ1Y3QgX3RhYmxlIHsKKyAgb3Blbl90YWJsZSAqY3VycmVudDsKK307CisKKworc3RhdGljIGxpbmVfcmVmICoKK2N1cnJlbnRfbGluZSAob3Blbl90YWJsZSAqZmlsZSkKK3sKKyAgbGluZV9yZWYgKmVudHJ5ID0gWkFMTE9DIChsaW5lX3JlZik7CisgICplbnRyeSA9IGZpbGUtPnBzZXVkb19saW5lOworICByZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyB0YWJsZV9lbnRyeSAqCituZXdfdGFibGVfZW50cnkgKG9wZW5fdGFibGUgKmZpbGUsCisJCSB0YWJsZV9lbnRyeV90eXBlIHR5cGUpCit7CisgIHRhYmxlX2VudHJ5ICplbnRyeTsKKyAgZW50cnkgPSBaQUxMT0MgKHRhYmxlX2VudHJ5KTsKKyAgZW50cnktPmZpbGUgPSBmaWxlLT5yb290OworICBlbnRyeS0+bGluZSA9IGN1cnJlbnRfbGluZSAoZmlsZSk7CisgIGVudHJ5LT50eXBlID0gdHlwZTsKKyAgcmV0dXJuIGVudHJ5OworfQorCitzdGF0aWMgdm9pZAorc2V0X25yX3RhYmxlX2VudHJ5X2ZpZWxkcyAodGFibGVfZW50cnkgKmVudHJ5LAorCQkJICAgaW50IG5yX2ZpZWxkcykKK3sKKyAgZW50cnktPmZpZWxkID0gTlpBTExPQyAoY2hhciosIG5yX2ZpZWxkcyArIDEpOworICBlbnRyeS0+bnJfZmllbGRzID0gbnJfZmllbGRzOworfQorCisKK3ZvaWQKK3RhYmxlX3B1c2ggKHRhYmxlICpyb290LAorCSAgICBsaW5lX3JlZiAqbGluZSwKKwkgICAgdGFibGVfaW5jbHVkZSAqaW5jbHVkZXMsCisJICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSkKK3sKKyAgRklMRSAqZmY7CisgIG9wZW5fdGFibGUgKmZpbGU7CisgIHRhYmxlX2luY2x1ZGUgZHVtbXk7CisgIHRhYmxlX2luY2x1ZGUgKmluY2x1ZGUgPSAmZHVtbXk7CisKKyAgLyogZHVtbXkgdXAgYSBzZWFyY2ggb2YgdGhpcyBkaXJlY3RvcnkgKi8KKyAgZHVtbXkubmV4dCA9IGluY2x1ZGVzOworICBkdW1teS5kaXIgPSAiIjsKKworICAvKiBjcmVhdGUgYSBmaWxlIGRlc2NyaXB0b3IgKi8KKyAgZmlsZSA9IFpBTExPQyAob3Blbl90YWJsZSk7CisgIGlmIChmaWxlID09IE5VTEwpCisgICAgeworICAgICAgcGVycm9yIChmaWxlX25hbWUpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorICBmaWxlLT5yb290ID0gcm9vdDsKKyAgZmlsZS0+cGFyZW50ID0gcm9vdC0+Y3VycmVudDsKKyAgcm9vdC0+Y3VycmVudCA9IGZpbGU7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgLyogc2F2ZSB0aGUgZmlsZSBuYW1lICovCisgICAgICBjaGFyICpkdXBfbmFtZSA9IE5aQUxMT0MgKGNoYXIsIHN0cmxlbiAoaW5jbHVkZS0+ZGlyKSArIHN0cmxlbiAoZmlsZV9uYW1lKSArIDIpOworICAgICAgaWYgKGR1cF9uYW1lID09IE5VTEwpCisJeworCSAgcGVycm9yIChmaWxlX25hbWUpOworCSAgZXhpdCAoMSk7CisJfQorICAgICAgaWYgKGluY2x1ZGUtPmRpclswXSAhPSAnXDAnKQorCXsKKwkgIHN0cmNhdCAoZHVwX25hbWUsIGluY2x1ZGUtPmRpcik7CisJICBzdHJjYXQgKGR1cF9uYW1lLCAiLyIpOworCX0KKyAgICAgIHN0cmNhdCAoZHVwX25hbWUsIGZpbGVfbmFtZSk7CisgICAgICBmaWxlLT5yZWFsX2xpbmUuZmlsZV9uYW1lID0gZHVwX25hbWU7CisgICAgICBmaWxlLT5wc2V1ZG9fbGluZS5maWxlX25hbWUgPSBkdXBfbmFtZTsKKyAgICAgIC8qIG9wZW4gdGhlIGZpbGUgKi8KKworICAgICAgZmYgPSBmb3BlbiAoZHVwX25hbWUsICJyYiIpOworICAgICAgaWYgKGZmKQorCWJyZWFrOworICAgICAgLyogemZyZWUgKGR1cF9uYW1lKTsgKi8KKyAgICAgIGlmIChpbmNsdWRlLT5uZXh0ID09IE5VTEwpCisJeworCSAgaWYgKGxpbmUgIT0gTlVMTCkKKwkgICAgZXJyb3IgKGxpbmUsICJQcm9ibGVtIG9wZW5pbmcgZmlsZSBgJXMnXG4iLCBmaWxlX25hbWUpOworCSAgcGVycm9yIChmaWxlX25hbWUpOworCSAgZXhpdCAoMSk7CisJfQorICAgICAgaW5jbHVkZSA9IGluY2x1ZGUtPm5leHQ7CisgIH0KKworCisgIC8qIGRldGVybWluZSB0aGUgc2l6ZSAqLworICBmc2VlayAoZmYsIDAsIFNFRUtfRU5EKTsKKyAgZmlsZS0+c2l6ZSA9IGZ0ZWxsIChmZik7CisgIGZzZWVrIChmZiwgMCwgU0VFS19TRVQpOworCisgIC8qIGFsbG9jYXRlIHRoaXMgbXVjaCBtZW1vcnkgKi8KKyAgZmlsZS0+YnVmZmVyID0gKGNoYXIqKSB6YWxsb2MgKGZpbGUtPnNpemUgKyAxKTsKKyAgaWYgKGZpbGUtPmJ1ZmZlciA9PSBOVUxMKQorICAgIHsKKyAgICAgIHBlcnJvciAoZmlsZV9uYW1lKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKyAgZmlsZS0+cG9zID0gZmlsZS0+YnVmZmVyOworCisgIC8qIHJlYWQgaXQgYWxsIGluICovCisgIGlmIChmcmVhZCAoZmlsZS0+YnVmZmVyLCAxLCBmaWxlLT5zaXplLCBmZikgPCBmaWxlLT5zaXplKSB7CisgICAgcGVycm9yIChmaWxlX25hbWUpOworICAgIGV4aXQgKDEpOworICB9CisgIGZpbGUtPmJ1ZmZlcltmaWxlLT5zaXplXSA9ICdcMCc7CisKKyAgLyogc2V0IHRoZSBpbml0aWFsIGxpbmUgbnVtYmVyaW5nICovCisgIGZpbGUtPnJlYWxfbGluZS5saW5lX25yID0gMTsgLyogc3BlY2lmaWVzIGN1cnJlbnQgbGluZSAqLworICBmaWxlLT5wc2V1ZG9fbGluZS5saW5lX25yID0gMTsgLyogc3BlY2lmaWVzIGN1cnJlbnQgbGluZSAqLworCisgIC8qIGRvbmUgKi8KKyAgZmNsb3NlIChmZik7Cit9CisKK3RhYmxlICoKK3RhYmxlX29wZW4gKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSkKK3sKKyAgdGFibGUgKnJvb3Q7CisKKyAgLyogY3JlYXRlIGEgZmlsZSBkZXNjcmlwdG9yICovCisgIHJvb3QgPSBaQUxMT0MgKHRhYmxlKTsKKyAgaWYgKHJvb3QgPT0gTlVMTCkKKyAgICB7CisgICAgICBwZXJyb3IgKGZpbGVfbmFtZSk7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgdGFibGVfcHVzaCAocm9vdCwgTlVMTCwgTlVMTCwgZmlsZV9uYW1lKTsKKyAgcmV0dXJuIHJvb3Q7Cit9CisKK2NoYXIgKgorc2tpcF9zcGFjZXMgKGNoYXIgKmNocCkKK3sKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaWYgKCpjaHAgPT0gJ1wwJworCSAgfHwgKmNocCA9PSAnXG4nCisJICB8fCAhaXNzcGFjZSAoKmNocCkpCisJcmV0dXJuIGNocDsKKyAgICAgIGNocCsrOworICAgIH0KK30KKworCitjaGFyICoKK2JhY2tfc3BhY2VzIChjaGFyICpzdGFydCwgY2hhciAqY2hwKQoreworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAoY2hwIDw9IHN0YXJ0CisJICB8fCAhaXNzcGFjZSAoY2hwWy0xXSkpCisJcmV0dXJuIGNocDsKKyAgICAgIGNocC0tOworICAgIH0KK30KKworY2hhciAqCitza2lwX2RpZ2l0cyAoY2hhciAqY2hwKQoreworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAoKmNocCA9PSAnXDAnCisJICB8fCAqY2hwID09ICdcbicKKwkgIHx8ICFpc2RpZ2l0ICgqY2hwKSkKKwlyZXR1cm4gY2hwOworICAgICAgY2hwKys7CisgICAgfQorfQorCitjaGFyICoKK3NraXBfdG9fc2VwYXJhdG9yIChjaGFyICpjaHAsCisJCSAgIGNoYXIgKnNlcGFyYXRvcnMpCit7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGNoYXIgKnNlcCA9IHNlcGFyYXRvcnM7CisgICAgICB3aGlsZSAoMSkKKwl7CisJICBpZiAoKmNocCA9PSAqc2VwKQorCSAgICByZXR1cm4gY2hwOworCSAgaWYgKCpzZXAgPT0gJ1wwJykKKwkgICAgYnJlYWs7CisJICBzZXArKzsKKwl9CisgICAgICBjaHArKzsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICoKK3NraXBfdG9fbnVsbCAoY2hhciAqY2hwKQoreworICByZXR1cm4gc2tpcF90b19zZXBhcmF0b3IgKGNocCwgIiIpOworfQorCisKK3N0YXRpYyBjaGFyICoKK3NraXBfdG9fbmwgKGNoYXIgKiBjaHApCit7CisgIHJldHVybiBza2lwX3RvX3NlcGFyYXRvciAoY2hwLCAiXG4iKTsKK30KKworCitzdGF0aWMgdm9pZAorbmV4dF9saW5lIChvcGVuX3RhYmxlICpmaWxlKQoreworICBmaWxlLT5wb3MgPSBza2lwX3RvX25sIChmaWxlLT5wb3MpOworICBpZiAoKmZpbGUtPnBvcyA9PSAnMCcpCisgICAgZXJyb3IgKCZmaWxlLT5wc2V1ZG9fbGluZSwgIk1pc3NpbmcgPG5sPiBhdCBlbmQgb2YgbGluZVxuIik7CisgICpmaWxlLT5wb3MgPSAnXDAnOworICBmaWxlLT5wb3MgKz0gMTsKKyAgZmlsZS0+cmVhbF9saW5lLmxpbmVfbnIgKz0gMTsKKyAgZmlsZS0+cHNldWRvX2xpbmUubGluZV9uciArPSAxOworfQorCisKK2V4dGVybiB0YWJsZV9lbnRyeSAqCit0YWJsZV9yZWFkICh0YWJsZSAqcm9vdCkKK3sKKyAgb3Blbl90YWJsZSAqZmlsZSA9IHJvb3QtPmN1cnJlbnQ7CisgIHRhYmxlX2VudHJ5ICplbnRyeSA9IE5VTEw7CisgIHdoaWxlKDEpCisgICAgeworCisgICAgICAvKiBlbmQtb2YtZmlsZT8gKi8KKyAgICAgIHdoaWxlICgqZmlsZS0+cG9zID09ICdcMCcpCisJeworCSAgaWYgKGZpbGUtPnBhcmVudCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgZmlsZSA9IGZpbGUtPnBhcmVudDsKKwkgICAgICByb290LT5jdXJyZW50ID0gZmlsZTsKKwkgICAgfQorCSAgZWxzZQorCSAgICByZXR1cm4gTlVMTDsKKwl9CisKKyAgICAgIC8qIGNvZGVfYmxvY2s/ICovCisgICAgICBpZiAoKmZpbGUtPnBvcyA9PSAneycpCisJeworCSAgY2hhciAqY2hwOworCSAgbmV4dF9saW5lIChmaWxlKTsgLyogZGlzY2FyZCBsZWFkaW5nIGJyYWNlICovCisJICBlbnRyeSA9IG5ld190YWJsZV9lbnRyeSAoZmlsZSwgdGFibGVfY29kZV9lbnRyeSk7CisJICBjaHAgPSBmaWxlLT5wb3M7CisJICAvKiBkZXRlcm1pbmUgaG93IG1hbnkgbGluZXMgYXJlIGludm9sdmVkIC0gbG9vayBmb3IgPG5sPiAifSIgKi8KKwkgIHsKKwkgICAgaW50IG5yX2xpbmVzID0gMDsKKwkgICAgd2hpbGUgKCpmaWxlLT5wb3MgIT0gJ30nKQorCSAgICAgIHsKKwkJbmV4dF9saW5lIChmaWxlKTsKKwkJbnJfbGluZXMrKzsKKwkgICAgICB9CisJICAgIHNldF9ucl90YWJsZV9lbnRyeV9maWVsZHMgKGVudHJ5LCBucl9saW5lcyk7CisJICB9CisJICAvKiBub3cgZW50ZXIgZWFjaCBsaW5lICovCisJICB7CisJICAgIGludCBsaW5lX25yOworCSAgICBmb3IgKGxpbmVfbnIgPSAwOyBsaW5lX25yIDwgZW50cnktPm5yX2ZpZWxkczsgbGluZV9ucisrKQorCSAgICAgIHsKKwkJaWYgKHN0cm5jbXAgKGNocCwgIiAgIiwgMikgPT0gMCkKKwkJICBlbnRyeS0+ZmllbGRbbGluZV9ucl0gPSBjaHAgKyAyOworCQllbHNlCisJCSAgZW50cnktPmZpZWxkW2xpbmVfbnJdID0gY2hwOworCQljaHAgPSBza2lwX3RvX251bGwgKGNocCkgKyAxOworCSAgICAgIH0KKwkgICAgLyogc2tpcCB0cmFpbGluZyBicmFjZSAqLworCSAgICBBU1NFUlQgKCpmaWxlLT5wb3MgPT0gJ30nKTsKKwkgICAgbmV4dF9saW5lIChmaWxlKTsKKwkgIH0KKwkgIGJyZWFrOworCX0KKworICAgICAgLyogdGFiIGJsb2NrPyAqLworICAgICAgaWYgKCpmaWxlLT5wb3MgPT0gJ1x0JykKKwl7CisJICBjaGFyICpjaHAgPSBmaWxlLT5wb3M7CisJICBlbnRyeSA9IG5ld190YWJsZV9lbnRyeSAoZmlsZSwgdGFibGVfY29kZV9lbnRyeSk7CisJICAvKiBkZXRlcm1pbmUgaG93IG1hbnkgbGluZXMgYXJlIGludm9sdmVkIC0gbG9vayBmb3IgPG5sPiAhPHRhYj4gKi8KKwkgIHsKKwkgICAgaW50IG5yX2xpbmVzID0gMDsKKwkgICAgaW50IG5yX2JsYW5rX2xpbmVzID0gMDsKKwkgICAgd2hpbGUgKDEpCisJICAgICAgeworCQlpZiAoKmZpbGUtPnBvcyA9PSAnXHQnKQorCQkgIHsKKwkJICAgIG5yX2xpbmVzID0gbnJfbGluZXMgKyBucl9ibGFua19saW5lcyArIDE7CisJCSAgICBucl9ibGFua19saW5lcyA9IDA7CisJCSAgICBuZXh0X2xpbmUgKGZpbGUpOworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIGZpbGUtPnBvcyA9IHNraXBfc3BhY2VzIChmaWxlLT5wb3MpOworCQkgICAgaWYgKCpmaWxlLT5wb3MgIT0gJ1xuJykKKwkJICAgICAgYnJlYWs7CisJCSAgICBucl9ibGFua19saW5lcysrOworCQkgICAgbmV4dF9saW5lIChmaWxlKTsKKwkJICB9CisJICAgICAgfQorCSAgICBzZXRfbnJfdGFibGVfZW50cnlfZmllbGRzIChlbnRyeSwgbnJfbGluZXMpOworCSAgfQorCSAgLyogbm93IGVudGVyIGVhY2ggbGluZSAqLworCSAgeworCSAgICBpbnQgbGluZV9ucjsKKwkgICAgZm9yIChsaW5lX25yID0gMDsgbGluZV9uciA8IGVudHJ5LT5ucl9maWVsZHM7IGxpbmVfbnIrKykKKwkgICAgICB7CisJCWlmICgqY2hwID09ICdcdCcpCisJCSAgZW50cnktPmZpZWxkW2xpbmVfbnJdID0gY2hwICsgMTsKKwkJZWxzZQorCQkgIGVudHJ5LT5maWVsZFtsaW5lX25yXSA9ICIiOyAvKiBibGFuayAqLworCQljaHAgPSBza2lwX3RvX251bGwgKGNocCkgKyAxOworCSAgICAgIH0KKwkgIH0KKwkgIGJyZWFrOworCX0KKworICAgICAgLyogY3BwIGRpcmVjdGl2ZT8gKi8KKyAgICAgIGlmIChmaWxlLT5wb3NbMF0gPT0gJyMnKQorCXsKKwkgIGNoYXIgKmNocCA9IHNraXBfc3BhY2VzIChmaWxlLT5wb3MgKyAxKTsKKworCSAgLyogY3BwIGxpbmUtbnIgZGlyZWN0aXZlIC0gIyA8bGluZS1ucj4gIjxmaWxlPiIgKi8KKwkgIGlmIChpc2RpZ2l0ICgqY2hwKQorCSAgICAgICYmICpza2lwX2RpZ2l0cyAoY2hwKSA9PSAnICcKKwkgICAgICAmJiAqc2tpcF9zcGFjZXMgKHNraXBfZGlnaXRzIChjaHApKSA9PSAnIicpCisJICAgIHsKKwkgICAgICBpbnQgbGluZV9ucjsKKwkgICAgICBjaGFyICpmaWxlX25hbWU7CisJICAgICAgZmlsZS0+cG9zID0gY2hwOworCSAgICAgIC8qIHBhcnNlIHRoZSBudW1iZXIgKi8KKwkgICAgICBsaW5lX25yID0gYXRvaShmaWxlLT5wb3MpIC0gMTsKKwkgICAgICAvKiBza2lwIHRvIHRoZSBmaWxlIG5hbWUgKi8KKwkgICAgICB3aGlsZSAoZmlsZS0+cG9zWzBdICE9ICcwJworCQkgICAgICYmIGZpbGUtPnBvc1swXSAhPSAnIicKKwkJICAgICAmJiBmaWxlLT5wb3NbMF0gIT0gJ1wwJykKKwkJZmlsZS0+cG9zKys7CisJICAgICAgaWYgKGZpbGUtPnBvc1swXSAhPSAnIicpCisJCWVycm9yICgmZmlsZS0+cmVhbF9saW5lLCAiTWlzc2luZyBvcGVuaW5nIHF1b3RlIGluIGNwcCBkaXJlY3RpdmVcbiIpOworCSAgICAgIC8qIHBhcnNlIHRoZSBmaWxlIG5hbWUgKi8KKwkgICAgICBmaWxlLT5wb3MrKzsKKwkgICAgICBmaWxlX25hbWUgPSBmaWxlLT5wb3M7CisJICAgICAgd2hpbGUgKGZpbGUtPnBvc1swXSAhPSAnIicKKwkJICAgICAmJiBmaWxlLT5wb3NbMF0gIT0gJ1wwJykKKwkJZmlsZS0+cG9zKys7CisJICAgICAgaWYgKGZpbGUtPnBvc1swXSAhPSAnIicpCisJCWVycm9yICgmZmlsZS0+cmVhbF9saW5lLCAiTWlzc2luZyBjbG9zaW5nIHF1b3RlIGluIGNwcCBkaXJlY3RpdmVcbiIpOworCSAgICAgIGZpbGUtPnBvc1swXSA9ICdcMCc7CisJICAgICAgZmlsZS0+cG9zKys7CisJICAgICAgZmlsZS0+cG9zID0gc2tpcF90b19ubCAoZmlsZS0+cG9zKTsKKwkgICAgICBpZiAoZmlsZS0+cG9zWzBdICE9ICdcbicpCisJCWVycm9yICgmZmlsZS0+cmVhbF9saW5lLCAiTWlzc2luZyBuZXdsaW5lIGluIGNwcCBkaXJlY3RpdmVcbiIpOworCSAgICAgIGZpbGUtPnBzZXVkb19saW5lLmZpbGVfbmFtZSA9IGZpbGVfbmFtZTsKKwkgICAgICBmaWxlLT5wc2V1ZG9fbGluZS5saW5lX25yID0gbGluZV9ucjsKKwkgICAgICBuZXh0X2xpbmUgKGZpbGUpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisKKwkgIC8qICNkZWZpbmUgYW5kICN1bmRlZiAtIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKworCSAgLyogT2xkIHN0eWxlICMgY29tbWVudCAqLworCSAgbmV4dF9saW5lIChmaWxlKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogYmxhbmsgbGluZSBvciBlbmQtb2YtZmlsZT8gKi8KKyAgICAgIGZpbGUtPnBvcyA9IHNraXBfc3BhY2VzIChmaWxlLT5wb3MpOworICAgICAgaWYgKCpmaWxlLT5wb3MgPT0gJ1wwJykKKwllcnJvciAoJmZpbGUtPnBzZXVkb19saW5lLCAiTWlzc2luZyA8bmw+IGF0IGVuZCBvZiBmaWxlXG4iKTsKKyAgICAgIGlmICgqZmlsZS0+cG9zID09ICdcbicpCisJeworCSAgbmV4dF9saW5lIChmaWxlKTsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogY29tbWVudCAtIGxlYWRpbmcgLy8gb3IgIyAtIHNraXAgKi8KKyAgICAgIGlmICgoZmlsZS0+cG9zWzBdID09ICcvJyAmJiBmaWxlLT5wb3NbMV0gPT0gJy8nKQorCSAgfHwgKGZpbGUtPnBvc1swXSA9PSAnIycpKQorCXsKKwkgIG5leHRfbGluZSAoZmlsZSk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIGNvbG9uIGZpZWxkICovCisgICAgICB7CisJY2hhciAqY2hwID0gZmlsZS0+cG9zOworCWVudHJ5ID0gbmV3X3RhYmxlX2VudHJ5IChmaWxlLCB0YWJsZV9jb2xvbl9lbnRyeSk7CisJbmV4dF9saW5lIChmaWxlKTsKKwkvKiBmaWd1cmUgb3V0IGhvdyBtYW55IGZpZWxkcyAqLworCXsKKwkgIGludCBucl9maWVsZHMgPSAxOworCSAgY2hhciAqdG1wY2ggPSBjaHA7CisJICB3aGlsZSAoMSkKKwkgICAgeworCSAgICAgIHRtcGNoID0gc2tpcF90b19zZXBhcmF0b3IgKHRtcGNoLCAiXFw6Iik7CisJICAgICAgaWYgKCp0bXBjaCA9PSAnXFwnKQorCQl7CisJCSAgLyogZWF0IHRoZSBlc2NhcGVkIGNoYXJhY3RlciAqLworCQkgIGNoYXIgKmNwID0gdG1wY2g7CisJCSAgd2hpbGUgKGNwWzFdICE9ICdcMCcpCisJCSAgICB7CisJCSAgICAgIGNwWzBdID0gY3BbMV07CisJCSAgICAgIGNwKys7CisJCSAgICB9CisJCSAgY3BbMF0gPSAnXDAnOworCQkgIHRtcGNoKys7CisJCX0KKwkgICAgICBlbHNlIGlmICgqdG1wY2ggIT0gJzonKQorCQlicmVhazsKKwkgICAgICBlbHNlCisJCXsKKwkJICAqdG1wY2ggPSAnXDAnOworCQkgIHRtcGNoKys7CisJCSAgbnJfZmllbGRzKys7CisJCX0KKwkgICAgfQorCSAgc2V0X25yX3RhYmxlX2VudHJ5X2ZpZWxkcyAoZW50cnksIG5yX2ZpZWxkcyk7CisJfQorCS8qIG5vdyBwYXJzZSB0aGVtICovCisJeworCSAgaW50IGZpZWxkX25yOworCSAgZm9yIChmaWVsZF9uciA9IDA7IGZpZWxkX25yIDwgZW50cnktPm5yX2ZpZWxkczsgZmllbGRfbnIrKykKKwkgICAgeworCSAgICAgIGNocCA9IHNraXBfc3BhY2VzIChjaHApOworCSAgICAgIGVudHJ5LT5maWVsZFtmaWVsZF9ucl0gPSBjaHA7CisJICAgICAgY2hwID0gc2tpcF90b19udWxsIChjaHApOworCSAgICAgICpiYWNrX3NwYWNlcyAoZW50cnktPmZpZWxkW2ZpZWxkX25yXSwgY2hwKSA9ICdcMCc7CisJICAgICAgY2hwKys7CisJICAgIH0KKwl9CisJYnJlYWs7CisgICAgICB9CisKKyAgICB9CisKKyAgQVNTRVJUIChlbnRyeSA9PSBOVUxMIHx8IGVudHJ5LT5maWVsZFtlbnRyeS0+bnJfZmllbGRzXSA9PSBOVUxMKTsKKyAgcmV0dXJuIGVudHJ5OworfQorCitleHRlcm4gdm9pZAordGFibGVfcHJpbnRfY29kZSAobGYgKmZpbGUsCisJCSAgdGFibGVfZW50cnkgKmVudHJ5KQoreworICBpbnQgZmllbGRfbnI7CisgIGludCBuciA9IDA7CisgIGZvciAoZmllbGRfbnIgPSAwOworICAgICAgIGZpZWxkX25yIDwgZW50cnktPm5yX2ZpZWxkczsKKyAgICAgICBmaWVsZF9ucisrKQorICAgIHsKKyAgICAgIGNoYXIgKmNocCA9IGVudHJ5LT5maWVsZFtmaWVsZF9ucl07CisgICAgICBpbnQgaW5fYml0X2ZpZWxkID0gMDsKKyAgICAgIGlmICgqY2hwID09ICcjJykKKwlsZl9pbmRlbnRfc3VwcHJlc3MoZmlsZSk7CisgICAgICB3aGlsZSAoKmNocCAhPSAnXDAnKSAKKwl7CisJICBpZiAoY2hwWzBdID09ICd7JworCSAgICAgICYmICFpc3NwYWNlKGNocFsxXSkKKwkgICAgICAmJiBjaHBbMV0gIT0gJ1wwJykKKwkgICAgeworCSAgICAgIGluX2JpdF9maWVsZCA9IDE7CisJICAgICAgbnIgKz0gbGZfcHV0Y2hyKGZpbGUsICdfJyk7CisJICAgIH0KKwkgIGVsc2UgaWYgKGluX2JpdF9maWVsZCAmJiBjaHBbMF0gPT0gJzonKQorCSAgICB7CisJICAgICAgbnIgKz0gbGZfcHV0Y2hyKGZpbGUsICdfJyk7CisJICAgIH0KKwkgIGVsc2UgaWYgKGluX2JpdF9maWVsZCAmJiAqY2hwID09ICd9JykKKwkgICAgeworCSAgICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCAnXycpOworCSAgICAgIGluX2JpdF9maWVsZCA9IDA7CisJICAgIH0KKwkgIGVsc2UgCisJICAgIHsKKwkgICAgICBuciArPSBsZl9wdXRjaHIoZmlsZSwgKmNocCk7CisJICAgIH0KKwkgIGNocCsrOworCX0KKyAgICAgIGlmIChpbl9iaXRfZmllbGQpCisJeworCSAgbGluZV9yZWYgbGluZSA9ICplbnRyeS0+bGluZTsKKwkgIGxpbmUubGluZV9uciArPSBmaWVsZF9ucjsKKwkgIGVycm9yICgmbGluZSwgIkJpdCBmaWVsZCBicmFjZSBtaXNzIG1hdGNoXG4iKTsKKwl9CisgICAgICBuciArPSBsZl9wdXRjaHIoZmlsZSwgJ1xuJyk7CisgICAgfQorfQorCisKKwordm9pZAorZHVtcF9saW5lX3JlZiAobGYgKmZpbGUsCisJCSBjaGFyICpwcmVmaXgsCisJCSBjb25zdCBsaW5lX3JlZiAqbGluZSwKKwkJIGNoYXIgKnN1ZmZpeCkKK3sKKyAgbGZfcHJpbnRmIChmaWxlLCAiJXMobGluZV9yZWYqKSAweCVseCIsIHByZWZpeCwgKGxvbmcpIGxpbmUpOworICBpZiAobGluZSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obGluZV9uciAlZCkiLCBsaW5lLT5saW5lX25yKTsKKyAgICAgIGxmX3ByaW50ZiAoZmlsZSwgIlxuKGZpbGVfbmFtZSAlcykiLCBsaW5lLT5maWxlX25hbWUpOworICAgICAgbGZfaW5kZW50IChmaWxlLCAtMSk7CisgICAgfQorICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKgordGFibGVfZW50cnlfdHlwZV90b19zdHIgKHRhYmxlX2VudHJ5X3R5cGUgdHlwZSkKK3sKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIHRhYmxlX2NvZGVfZW50cnk6IHJldHVybiAiY29kZS1lbnRyeSI7CisgICAgY2FzZSB0YWJsZV9jb2xvbl9lbnRyeTogcmV0dXJuICJjb2xvbi1lbnRyeSI7CisgICAgfQorICByZXR1cm4gIippbnZhbGlkKiI7Cit9CisKK3ZvaWQKK2R1bXBfdGFibGVfZW50cnkobGYgKmZpbGUsCisJCSBjaGFyICpwcmVmaXgsCisJCSBjb25zdCB0YWJsZV9lbnRyeSAqZW50cnksCisJCSBjaGFyICpzdWZmaXgpCit7CisgIGxmX3ByaW50ZiAoZmlsZSwgIiVzKHRhYmxlX2VudHJ5KikgMHglbHgiLCBwcmVmaXgsIChsb25nKSBlbnRyeSk7CisgIGlmIChlbnRyeSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCBmaWVsZDsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgKzEpOworICAgICAgZHVtcF9saW5lX3JlZiAoZmlsZSwgIlxuKGxpbmUgIiwgZW50cnktPmxpbmUsICIpIik7CisgICAgICBsZl9wcmludGYgKGZpbGUsICJcbih0eXBlICVzKSIsIHRhYmxlX2VudHJ5X3R5cGVfdG9fc3RyIChlbnRyeS0+dHlwZSkpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4obnJfZmllbGRzICVkKSIsIGVudHJ5LT5ucl9maWVsZHMpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiXG4oZmllbGRzIik7CisgICAgICBsZl9pbmRlbnQgKGZpbGUsICsxKTsKKyAgICAgIGZvciAoZmllbGQgPSAwOyBmaWVsZCA8IGVudHJ5LT5ucl9maWVsZHM7IGZpZWxkKyspCisJbGZfcHJpbnRmIChmaWxlLCAiXG5cIiVzXCIiLCBlbnRyeS0+ZmllbGRbZmllbGRdKTsKKyAgICAgIGxmX2luZGVudCAoZmlsZSwgLTEpOworICAgICAgbGZfcHJpbnRmIChmaWxlLCAiKSIpOworICAgICAgbGZfaW5kZW50IChmaWxlLCAtMSk7CisgICAgfQorICBsZl9wcmludGYgKGZpbGUsICIlcyIsIHN1ZmZpeCk7Cit9CisKKworI2lmZGVmIE1BSU4KK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHRhYmxlICp0OworICB0YWJsZV9lbnRyeSAqZW50cnk7CisgIGxmICpsOworICBpbnQgbGluZV9ucjsKKworICBpZiAoYXJnYyAhPSAyKQorICAgIHsKKyAgICAgIHByaW50ZigiVXNhZ2U6IHRhYmxlIDxmaWxlPlxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisKKyAgdCA9IHRhYmxlX29wZW4gKGFyZ3ZbMV0pOworICBsID0gbGZfb3BlbiAoIi0iLCAic3Rkb3V0IiwgbGZfb21pdF9yZWZlcmVuY2VzLCBsZl9pc190ZXh0LCAidG1wLXRhYmxlIik7CisKKyAgbGluZV9uciA9IDA7CisgIGRvCisgICAgeworICAgICAgY2hhciBsaW5lWzEwXTsKKyAgICAgIGVudHJ5ID0gdGFibGVfcmVhZCAodCk7CisgICAgICBsaW5lX25yICsrOworICAgICAgc3ByaW50ZiAobGluZSwgIiglZCAiLCBsaW5lX25yKTsKKyAgICAgIGR1bXBfdGFibGVfZW50cnkgKGwsIGxpbmUsIGVudHJ5LCAiKVxuIik7CisgICAgfQorICB3aGlsZSAoZW50cnkgIT0gTlVMTCk7CisKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9pZ2VuL3RhYmxlLmggYi9zaW0vaWdlbi90YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYmM4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vaWdlbi90YWJsZS5oCkBAIC0wLDAgKzEsMTU1IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisvKiBSZWFkIGEgdGFibGUsIGxpbmUgYnkgbGluZSwgZnJvbSBhIGZpbGUuCisKKyAgIEEgdGFibGUgbGluZSBoYXMgc2V2ZXJhbCBmb3JtczoKKworICAgRmllbGQgbGluZToKKworICAgICAgIDx0ZXh0PiB7ICI6IiA8dGV4dD4gfQorICAgICAgIHR5cGUgPT0gdGFibGVfY29sb25fZW50cnkKKworICAgICAgIEZpZWxkcyBwb2ludHMgdG8gYSBOVUxMIHRlcm1pbmF0ZWQgbGlzdCBvZiBwb2ludGVycy4KKworICAgVGFiIGluZGVudGVkIGJsb2NrOgorCisgICAgIDx0YWI+IDx0ZXh0PiA8bmw+IHsgPHRhYj4gPHRleHQ+IDxubD4gfQorICAgICB0eXBlID09IHRhYmxlX2NvZGVfZW50cnkKKworICAgICBUaGUgbGVhZGluZyB0YWIgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggbGluZSBpcyBkaXNjYXJkZWQuCisgICAgIGZpZWxkc1tpXSBpcyB0aGUgaSd0aCBsaW5lIHdpdGggdGhlIDxubD4gZGlzY2FyZGVkLgorICAgICAKKworICAgQ29kZSBibG9jazoKKworICAgICAieyIgPGlnbm9yZS10ZXh0PiA8bmw+IHsgPHRleHQ+IDxubD4gfSAifSIgPGlnbm9yZS10ZXh0PiA8bmw+CisgICAgIHR5cGUgPT0gdGFibGVfY29kZV9lbnRyeQorCisgICAgIFRoZSBsZWFkaW5nL3RyYWlsaW5nIHsvfSBsaW5lcyBhcmUgZGlzY2FyZGVkLgorICAgICBMaW5lcyBjb250YWluaW5nIHR3byBsZWFkaW5nIHNwYWNlcyBoYXZlIHRob3NlIHNwYWNlcyBzdHJpcGVkLgorICAgICBmaWVsZHNbaV0gaXMgdGhlIGkndGggbGluZSB3aXRoIHRoZSA8bmw+IGRpc2NhcmRlZC4KKworICAgSW4gYWRkaXRpb24sIHRoZSB0YWJsZSBwYXJzZXIgcmVjb25pc2VzIGFuZCBoYW5kbGVzIGludGVybmFsbHkgdGhlCisgICBmb2xsb3dpbmcgKHdoZW4gbm90IGluIGEgY29kZSBibG9jayk6CisKKyAgICAgIiMiIDxsaW5lLW5yPiAnIicgPGZpbGU+ICciJworCisgICAgIEFzIHBlciBDUFAvQ0MsIHRyZWF0IGZvbGxvd2luZyBsaW5lcyBhcyBpZiB0aGV5IHdlcmUgdGFrZW4gZnJvbQorICAgICA8ZmlsZT4gc3RhcnRpbmcgYXQgPGxpbmUtbnI+CisKKyAgIE5vIHN1cHBvcnQgZm9yIENQUCdzICIjaWYvI2Vsc2UvI2VuZGlmIiBzdHlsZSBjb25kaXRpb25zIGFyZQorICAgcGxhbm5lZC4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3RhYmxlIHRhYmxlOworCit0eXBlZGVmIGVudW0geworICB0YWJsZV9jb2xvbl9lbnRyeSwKKyAgdGFibGVfY29kZV9lbnRyeSwKK30gdGFibGVfZW50cnlfdHlwZTsKKworCit0eXBlZGVmIHN0cnVjdCBfdGFibGVfZW50cnkgdGFibGVfZW50cnk7CitzdHJ1Y3QgX3RhYmxlX2VudHJ5IHsKKyAgdGFibGUgKmZpbGU7CisgIGxpbmVfcmVmICpsaW5lOworICB0YWJsZV9lbnRyeV90eXBlIHR5cGU7CisgIGludCBucl9maWVsZHM7CisgIGNoYXIgKipmaWVsZDsKK307CisKKy8qIExpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIHdoZW4gb3BlbmluZyBhIHB1c2hlZCBmaWxlLiAgQ3VycmVudAorICAgZGlyZWN0b3J5IGlzIGFsd2F5cyBzZWFyY2hlZCBmaXJzdCAqLwordHlwZWRlZiBzdHJ1Y3QgX3RhYmxlX2luY2x1ZGUgdGFibGVfaW5jbHVkZTsKK3N0cnVjdCBfdGFibGVfaW5jbHVkZSB7CisgIGNoYXIgKmRpcjsKKyAgdGFibGVfaW5jbHVkZSAqbmV4dDsKK307CisKKworLyogT3Blbi9yZWFkIGEgdGFibGUgZmlsZS4gIFNpbmNlIHRoZSBmaWxlIGlzIHJlYWQgb25jZSBkdXJpbmcgb3BlbgorICAgKGFuZCB0aGVuIGNsb3NlZCBpbW1lZGlhdGx5KSB0aGVyZSBpcyBubyBjbG9zZSBtZXRob2QuICovCisKK2V4dGVybiB0YWJsZSAqdGFibGVfb3BlbgorKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSk7CisKK2V4dGVybiB0YWJsZV9lbnRyeSAqdGFibGVfcmVhZAorKHRhYmxlICpmaWxlKTsKKworCisvKiBQdXNoIHRoZSB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgZmlsZSBhbmQgb3BlbiBGSUxFX05BTUUuICBXaGVuCisgICB0aGUgZW5kIG9mIEZJTEVfTkFNRSBpcyByZWFjaGVkLCByZXR1cm4gdG8gdGhlIHB1c2hlZCBmaWxlICovCisKK2V4dGVybiB2b2lkIHRhYmxlX3B1c2gKKyh0YWJsZSAqZmlsZSwKKyBsaW5lX3JlZiAqbGluZSwKKyB0YWJsZV9pbmNsdWRlICpzZWFyY2gsCisgY29uc3QgY2hhciAqZmlsZV9uYW1lKTsKKworCisvKiBFeHBhbmQgdGhlIHNwZWNpZmllZCBmaWVsZF9uciB1c2luZyB0aGUgaW50ZXJuYWwgZXhwYW5zaW9uIHRhYmxlLgorICAgQSBmaWVsZCBpcyBvbmx5IGV4cGFuZGVkIHdoZW4gZXhwbGljaXRseSBzcGVjaWZpZWQuICAqLworCitleHRlcm4gdm9pZCB0YWJsZV9leHBhbmRfZmllbGQKKyh0YWJsZV9lbnRyeSAqZW50cnksCisgaW50IGZpZWxkX25yKTsKKworCisvKiBHaXZlbiBhIGNvZGUgZW50cnksIHdyaXRlIHRoZSBjb2RlIHRvIEZJTEUuICBTaW5jZSBhbnkKKyAgIGxlYWRpbmcvdHJhaWxpbmcgYnJhY2VzIHdlcmUgc3RyaXBlZCBhcyBwYXJ0IG9mIHRoZSByZWFkLCB0aGV5IGFyZQorICAgbm90IHdyaXR0ZW4uICovCisKK2V4dGVybiB2b2lkIHRhYmxlX3ByaW50X2NvZGUKKyhsZiAqZmlsZSwKKyB0YWJsZV9lbnRyeSAqZW50cnkpOworCisKKy8qIERlYnVnZ2luZyAqLworCitleHRlcm4gdm9pZCBkdW1wX2xpbmVfcmVmCisobGYgKmZpbGUsCisgY2hhciAqcHJlZml4LAorIGNvbnN0IGxpbmVfcmVmICpsaW5lLAorIGNoYXIgKnN1ZmZpeCk7CisKK2V4dGVybiB2b2lkIGR1bXBfdGFibGVfZW50cnkKKyhsZiAqZmlsZSwKKyBjaGFyICpwcmVmaXgsCisgY29uc3QgdGFibGVfZW50cnkgKmVudHJ5LAorIGNoYXIgKnN1ZmZpeCk7CisKKworCisvKiBVdGlsaXRpZXMgZm9yIHNraXBwaW5nIGFyb3VuZCB0ZXh0ICovCisKK2V4dGVybiBjaGFyICpza2lwX2RpZ2l0cworKGNoYXIgKmNocCk7CisKK2V4dGVybiBjaGFyICpza2lwX3NwYWNlcworKGNoYXIgKmNocCk7CisKK2V4dGVybiBjaGFyICpza2lwX3RvX3NlcGFyYXRvcgorKGNoYXIgKmNocCwKKyBjaGFyICpzZXBhcmF0b3JzKTsKKworZXh0ZXJuIGNoYXIgKmJhY2tfc3BhY2VzCisoY2hhciAqc3RhcnQsCisgY2hhciAqY2hwKTsKZGlmZiAtLWdpdCBhL3NpbS9tMzJyL0NoYW5nZUxvZyBiL3NpbS9tMzJyL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmE3ODlhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL20zMnIvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMTA0NiBAQAorMTk5OS0wMi0wOSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoU0lNX0VYVFJBX0RFUFMpOiBBZGQgbTMyci1kZXNjLmgsIGRlbGV0ZSBjcHUtb3BjLmguCisJKHN0YW1wLXhtbG9vcCk6IHMvLXBhcmFsbGVsLy1wYXJhbGxlbC13cml0ZS8uCisJKiBjb25maWd1cmUuaW4gKHNpbV9saW5rX2ZpbGVzLHNpbV9saW5rX2xpbmtzKTogRGVsZXRlLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogZGVjb2RlLmMsZGVjb2RlLmgsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlYnVpbGQuCisJKiBtbG9vcC5pbiAoZXhlY3V0ZSk6IENHRU5fSU5TTl9BVFRSIHJlbmFtZWQgdG8gQ0dFTl9JTlNOX0FUVFJfVkFMVUUuCisJKiBzaW0taWYuYyAoc2ltX29wZW4pOiBtMzJyX2NnZW5fY3B1X29wZW4gcmVuYW1lZCBmcm9tCisJbTMycl9jZ2VuX29wY29kZV9vcGVuLiAgU2V0IGRpc2Fzc2VtYmxlci4KKwkoc2ltX2Nsb3NlKTogbTMycl9jZ2VuX2NwdV9vcGVuIHJlbmFtZWQgZnJvbSBtMzJyX2NnZW5fb3Bjb2RlX29wZW4uCisJKiBzaW0tbWFpbi5oOiBEb24ndCBpbmNsdWRlIGNwdS1vcGMuaCxjcHUtc2ltLmguIEluY2x1ZGUKKwltMzJyLWRlc2MuaCxtMzJyLW9wYy5oLG0zMnItc2ltLmguCisKKzE5OTktMDEtMjcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogY3B1LmgsZGVjb2RlLmMsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlYnVpbGQuCisKKzE5OTktMDEtMTUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogZGVjb2RlLmgsbW9kZWwuYzogUmVnZW5lcmF0ZS4KKworMTk5OS0wMS0xNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBhcmNoLmMsYXJjaC5oLGNwdWFsbC5oOiBSZWdlbmVyYXRlLgorCSogY3B1LmMsY3B1LmgsZGVjb2RlLmMsZGVjb2RlLmgsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCisJKiB0cmFwcy5jIChzaW1fZW5naW5lX2ludmFsaWRfaW5zbik6IFBDQUREUi0+SUFERFIuCisKKzE5OTktMDEtMTEgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKG0zMnItY2xlYW4pOiBybSBlbmcuaC4KKwkqIHNpbS1tYWluLmg6IERlbGV0ZSBpbmNsdXNpb24gb2YgYW5zaWRlY2wuaC4KKwkqIGNwdS5oOiBSZWdlbmVyYXRlLgorCisxOTk5LTAxLTA2ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGNwdS5oOiBSZWdlbmVyYXRlLgorCisxOTk5LTAxLTA1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChNQUlOX0lOQ0xVREVfREVQUyk6IERlbGV0ZS4KKwkoSU5DTFVERV9ERVBTLE9QU19JTkNMVURFX0RFUFMpOiBEZWxldGUuCisJKHNpbS1pZi5vKTogVXNlIFNJTV9NQUlOX0RFUFMuCisJKGFyY2gubyx0cmFwcy5vLGRldmljZXMubyk6IERpdHRvLgorCShNMzJSQkZfSU5DTFVERV9ERVBTKTogVXNlIENHRU5fTUFJTl9DUFVfREVQUy4KKwkobTMyci5vLG1sb29wLm8sY3B1Lm8sZGVjb2RlLm8sc2VtLm8sbW9kZWwubyk6IFNpbXBsaWZ5IGRlcGVuZGVuY2llcy4KKwkqIGNwdS5jLGNwdS5oLGRlY29kZS5jLG1vZGVsLmMsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWdlbmVyYXRlLgorCSogbTMyci1zaW0uaCAobTMycmJmX2hfY3JfW2dzXWV0X2hhbmRsZXIpOiBEZWNsYXJlLgorCShbR1NdRVRfSF9DUik6IERlZmluZS4KKwkobTMycmJmX2hfcHN3X1tnc11ldF9oYW5kbGVyKTogRGVjbGFyZS4KKwkoW0dTXUVUX0hfUFNXKTogRGVmaW5lLgorCShtMzJyYmZfaF9hY2N1bV9bZ3NdZXRfaGFuZGxlcik6IERlY2xhcmUuCisJKFtHU11FVF9IX0FDQ1VNKTogRGVmaW5lLgorCSogc2ltLWlmLmMgKHNpbV9vcGVuKTogTW9kZWwgcHJvYmluZyBjb2RlIG1vdmVkIHRvIHNpbS1tb2RlbC5jLgorCSogbTMyci5jIChXQU5UX0NQVSk6IERlZmluZSBhcyBtMzJyYmYuCisJKGFsbCByZWdpc3RlciBhY2Nlc3MgZm5zKTogUmVuYW1lIHRvIC4uLl9oYW5kbGVyLgorCisxOTk4LTEyLTE0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogLS1lbmFibGUtY2dlbi1tYWludCBzdXBwb3J0IG1vdmVkIHRvIGNvbW1vbi9hY2xvY2FsLm00LgorCShTSU1fQUNfT1BUSU9OX0FMSUdOTUVOVCk6IE1ha2Ugc3RyaWN0LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisJKiBzZW0tc3dpdGNoLmMsc2VtLmMsc2VteC1zd2l0Y2guYzogUmVnZW5lcmF0ZS4KKwkqIHNpbS1tYWluLmggKFNJTV9FTkdJTkVfSEFMVF9IT09LLFNJTV9FTkdJTkVfUkVTVEFSVF9IT09LKTogRGVmaW5lLgorCSogdHJhcHMuYyAobTMycl9jb3JlX3NpZ25hbCk6IEhhbmRsZSAtLWVudmlyb25tZW50PW9wZXJhdGluZy4KKworMTk5OC0xMi0wOSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBjcHUuaCxkZWNvZGUuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCisKKwkqIHNpbS1pZi5jOiBJbmNsdWRlIHN0cmluZy5oIG9yIHN0cmluZ3MuaCBpZiBwcmVzZW50LgorCisxOTk4LTEyLTA0ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBTSU1fQUNfT1BUSU9OX0lOTElORS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIHNpbS1tYWluLmg6IFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24uCisJRG9uJ3QgaW5jbHVkZSBjZ2VuLXNjYWNoZS5oLGNnZW4tY3B1LmgsY2dlbi10cmFjZS5oLGNwdWFsbC5oLgorCURvbmUgYnkgY2dlbi1zaW0uaCBub3cuCisJKiB0Y29uZmlnLmluIChTSU1fSEFWRV9NT0RFTCk6IERlbGV0ZSwgbW92ZWQgdG8gY2dlbi10eXBlcy5oLgorCSogY3B1YWxsLmg6IFJlZ2VuZXJhdGUuCisJKiBjcHUuaCxkZWNvZGUuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCisJKiBtbG9vcC5pbiAoZXh0cmFjdDE2KTogTWFrZSBzdGF0aWMgaW5saW5lIGFnYWluLgorCVNpbXBsaWZ5IHdpdGggY2FsbCB0byBAY3B1QF9maWxsX2FyZ2J1ZixAY3B1QF9maWxsX2FyZ2J1Zl90cC4KKwkoZXh0cmFjdDMyKTogRGl0dG8uCisJU2ltcGxpZnkgd2l0aCBjYWxsIHRvIEBjcHVAX2ZpbGxfYXJnYnVmLEBjcHVAX2ZpbGxfYXJnYnVmX3RwLgorCShleGVjdXRlKTogVGVzdCBBUkdCVUZfUFJPRklMRV9QIGJlZm9yZSBwcm9maWxpbmcuCisJVXBkYXRlIGNhbGxzIHRvIFRSQUNFX0lOU05fSU5JVCxUUkFDRV9JTlNOX0ZJTkkuCisKKzE5OTgtMTEtMjIgIERvdWcgRXZhbnMgIDxkZXZhbnNAdG9ib3IudG8uY3lnbnVzLmNvbT4KKworCSogZGV2aWNlcy5jIChkZXZpY2VfaW9fd3JpdGVfYnVmZmVyKTogRml4IHR5cG8uCisJKiBzaW0taWYuYyAoc2ltX29wZW4pOiBIYWNrIGluIGNhbGwgdG8gZHZfc29ja3Nlcl9pbnN0YWxsLgorCSogdGNvbmZpZy5pbiAoSEFWRV9EVl9TT0NLU0VSKTogQWRkIGJ1dCBjb21tZW50IG91dC4KKworMTk5OC0xMS0xOCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoTTMyUl9PQkpTKTogRGVsZXRlIGV4dHJhY3Quby4KKwkoZXh0cmFjdC5vKTogRGVsZXRlLgorCSogY3B1LmMsY3B1LmgsZGVjb2RlLmMsZGVjb2RlLmgsc2VtLXN3aXRjaC5jLHNlbS5jOiBSZWJ1aWxkLgorCSogbWxvb3AuaW4gKGV4dHJhY3QxNik6IFVwZGF0ZSB0eXBlIG9mIGBpbnNuJyBhcmcuCisJRGVsZXRlIGNhbGwgdG8gZC0+ZXh0cmFjdC4KKwkoZXh0cmFjdDMyKTogRGl0dG8uCisKK1dlZCBOb3YgIDQgMjM6NTU6MzcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIHNpbS1tYWluLmg6IERlbGV0ZSBpbmNsdXNpb24gb2YgY29uZmlnLmgsIGluY2x1ZGUgc2ltLWJhc2ljcy5oCisJYmVmb3JlIGNnZW4tdHlwZXMuaC4KKwkqIHRjb25maWcuaW46IEd1YXJkIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLgorCSogY3B1Lmg6IERlbGV0ZSBkZWNscyBtb3ZlZCB0byBnZW5tbG9vcC5zaC4KKworTW9uIE9jdCAxOSAxNDoxMzowNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogc2ltLW1haW4uaDogI2luY2x1ZGUgY3B1LW9wYy5oLgorCSogYXJjaC5jLGFyY2guaCxkZWNvZGUuYyxleHRyYWN0LmMsbW9kZWwuYyxzZW0uYzogUmVnZW5lcmF0ZQorCXRvIGdldCAjaW5jbHVkZSBjbGVhbnVwLgorCisJKiBNYWtlZmlsZS5pbiAoU0lNX0VYVFJBX0RFUFMpOiBSZXBsYWNlIGNnZW4gaGVhZGVycyB3aXRoCisJQ0dFTl9JTkNMVURFX0RFUFMuCisJKE0zMlJCRl9JTkNMVURFX0RFUFMpOiBEZWZpbmUuCisJKG0zMnIgLm8ncyk6IERlcGVuZCBvbiBpdC4KKwkobWxvb3AuYyk6IFVwZGF0ZSBjYWxsIHRvIGdlbm1sb29wLnNoLgorCSogY3B1LmgsY3B1YWxsLmg6IFJlZ2VuZXJhdGUuCisJKiBzaW0tbWFpbi5oOiBEZWxldGUgaW5jbHVzaW9uIG9mIGNwdS5oLGRlY29kZS5oLCBtb3ZlZCB0byBjcHVhbGwuaC4KKwkjaW5jbHVkZSBjZ2VuLXNjYWNoZS5oLGNnZW4tY3B1LmguCisJKiB0Y29uZmlnLmluIChXSVRIX0ZPTyBzZW1hbnRpYyBtYWNyb3MpOiBEZWxldGUuCisKK0ZyaSBPY3QgMTYgMDk6MTU6MjkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjaGFybWVkLmN5Z251cy5jb20+CisKKwkqIHNpbS1pZi5jIChzaW1fZG9fY29tbWFuZCk6IEhhbmRsZSAic2ltIGluZm8gcmVnIHtiYnBzdyxiYnBjfSIuCisKK0ZyaSBPY3QgIDkgMTY6MTE6NTggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwlBZGQgcHNldWRvLWJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBzdXBwb3J0LgorCSogTWFrZWZpbGUuaW4gKFNJTV9PQkpTKTogQWRkIHNpbS1yZWcubywgY2dlbi1ydW4ubywgc2ltLXN0b3Auby4KKwkoU0lNX0VYVFJBX0RFUFMpOiBBZGQgaW5jbHVkZS9vcGNvZGUvY2dlbi5oLgorCShJTkNMVURFX0RFUFMpOiBEZWxldGUgY3B1LXNpbS5oLCBpbmNsdWRlL29wY29kZS9jZ2VuLmguCisJKG1sb29wLmMpOiBCdWlsZCBwc2V1ZG8tYmFzaWMtYmxvY2sgdmVyc2lvbi4gIERlcGVuZCBvbiBzdGFtcC1jcHUuCisJKiBhcmNoLmMsYXJjaC5oLGNwdWFsbC5oOiBSZWdlbmVyYXRlLgorCSogY3B1LmMsY3B1LmgsZGVjb2RlLmMsZGVjb2RlLmgsZXh0cmFjdC5jLG1vZGVsLmM6IFJlZ2VuZXJhdGUuCisJKiBzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCisJKiBtMzJyLXNpbS5oIChNMzJSX01JU0NfUFJPRklMRSk6IE5ldyBtZW1iZXJzIGxvYWRfcmVncywKKwlsb2FkX3JlZ3NfcGVuZGluZy4KKwkqIG0zMnIuYyAobTMycmJmX2ZldGNoX3JlZ2lzdGVyKTogUmVuYW1lZCBmcm9tIG0zMnJiX2ZldGNoX3JlZ2lzdGVyLgorCShtMzJyYmZfc3RvcmVfcmVnaXN0ZXIsbTMycmJmX2hfY3JfZ2V0LG0zMnJiZl9oX2NyX3NldCwKKwltMzJyYmZfaF9wc3dfZ2V0LG0zMnJiZl9oX3Bzd19zZXQsbTMycmJmX2hfYWNjdW1fZ2V0LAorCW0zMnJiZl9oX2FjY3VtX3NldCk6IExpa2V3aXNlLgorCShtMzJyX21vZGVsX3tpbml0LHVwZGF0ZX1faW5zbl9jeWNsZXMpOiBEZWxldGUuCisJKG0zMnJiZl9tb2RlbF9pbnNuX3tiZWZvcmUsYWZ0ZXJ9KTogTmV3IGZucy4KKwkobTMycl9tb2RlbF9yZWNvcmRfY3RpLG0zMnJfbW9kZWxfcmVjb3JkX2N5Y2xlcyk6IERlbGV0ZS4KKwkobTMycmJfbW9kZWxfbWFya19nZXRfaF9ncixtMzJyYl9tb2RlbF9tYXJrX3NldF9oX2dyKTogRGVsZXRlLgorCShtMzJyYl9tb2RlbF9tYXJrX2J1c3lfcmVnLG0zMnJiX21vZGVsX21hcmtfdW5idXN5X3JlZyk6IERlbGV0ZS4KKwkoY2hlY2tfbG9hZF9zdGFsbCk6IE5ldyBmbi4KKwkobTMycmJmX21vZGVsX20zMnJfZF91X3tleGVjLGNtcCxtYWMsY3RpLGxvYWQsc3RvcmV9KTogTmV3IGZucy4KKwkobTMycmJmX21vZGVsX3Rlc3RfdV9leGVjKTogTmV3IGZuLgorCSogbWxvb3AuaW46IFJld3JpdGUsIHVzZSBwYmIgc3VwcG9ydC4KKwkqIHNpbS1pZi5jIChzaW1fc3RvcCxzaW1fc3luY19zdG9wLHNpbV9yZXN1bWUpOiBEZWxldGUuCisJKHNpbV9mZXRjaF9yZWdpc3RlcixzaW1fc3RvcmVfcmVnaXN0ZXIpOiBEZWxldGUuCisJKiBzaW0tbWFpbi5oIChDSUFfR0VULENJQV9TRVQpOiBGaXguCisJKFNJTV9FTkdJTkVfSEFMVF9IT09LLFNJTV9FTkdJTkVfUkVTVEFSVF9IT09LKTogRGVsZXRlLgorCSogdGNvbmZpZy5pbiAoV0lUSF9TQ0FDSEVfUEJCKTogRGVmaW5lLgorCShXSVRIX1NDQUNIRV9QQkJfTTMyUkJGKTogRGVmaW5lLgorCSogdHJhcHMuYyAoc2ltX2VuZ2luZV9pbnZhbGlkX2luc24pOiBSZW5hbWVkIGZyb20gLi4uX2lsbGVnYWxfLi4uLgorCShtMzJyX3RyYXApOiBQYXNzIHBjIHRvIHNpbV9lbmdpbmVfaGFsdC4KKwkqIGNvbmZpZ3VyZS5pbiAoU0lNX0FDX09QVElPTl9TQ0FDSEUpOiBDaGFuZ2UgMTAyNCB0byAxNjM4NC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworV2VkIFNlcCAxNiAxODoyMjoyNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBtMzJyLXNpbS5oICh7UFNXLENCUixTUEksU1BVLEJQQyxCQlBTVyxCQlBDfV9SRUdOVU0pOiBOZXcgbWFjcm9zLgorCSh7QUNDMUwsQUNDMUh9X1JFR05VTSk6IE5ldyBtYWNyb3MuCisJKG0zMnJfZGVjb2RlX2dkYl9jdHJsX3JlZ251bSk6IEFkZCBwcm90b3R5cGUuCisJKiBtMzJyLmMgKG0zMnJfZGVjb2RlX2dkYl9jdHJsX3JlZ251bSk6IE5ldyBmdW5jdGlvbi4KKwkobTMycl9mZXRjaF9yZWdpc3RlcixtMzJyX3N0b3JlX3JlZ2lzdGVyKTogUmV3cml0ZS4KKworVHVlIFNlcCAxNSAxNTowMToxNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBtMzJyLXNpbS5oIChHRVRfSF9TTSk6IE5ldyBtYWNyby4KKwkoVUFSVCBwYXJhbXMpOiBVcGRhdGUgdG8gbXNhMjAwMC4KKwkqIGRldmljZXMuYyAoZGV2aWNlX2lvX3JlYWRfYnVmZmVyKTogVXBkYXRlIHRvIG1zYTIwMDAuCisJKiBtMzJyLmMgKG0zMnJiX2hfY3JfZ2V0LG0zMnJiX2hfY3Jfc2V0KTogSGFuZGxlIGJicGMsYmJwc3cuCisJKG0zMnJiX2hfcHN3X2dldCxtMzJyYl9oX3Bzd19zZXQpOiBOZXcgZnVuY3Rpb25zLgorCSogYXJjaC5jLGFyY2guaCxjcHUuYyxjcHUuaCxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCisKK1dlZCBTZXAgIDkgMTU6Mjk6MzYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbTMyci1zaW0uaCAobTMycl90cmFwKTogVXBkYXRlIHByb3RvdHlwZS4KKwkqIHRyYXBzLmMgKG0zMnJfdHJhcCk6IE5ldyBhcmcgYHBjJy4KKwkqIHNlbS5jLHNlbS1zd2l0Y2guYzogUmVnZW5lcmF0ZWQuCisKK01vbiBBdWcgIDMgMTI6NTk6MTcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwlSZW5hbWUgY3B1IG0zMnIgdG8gbTMycmIgdG8gZGlzdGluZ3Vpc2ggZnJvbSBhcmNoaXRlY3R1cmUgbmFtZS4KKwkqIE1ha2VmaWxlLmluIChtbG9vcC5jKTogY3B1IG0zMnIgcmVuYW1lZCB0byBtMzJyYi4KKwkqIHNpbS1tYWluLmggKFdBTlRfQ1BVX00zMlJCKTogUmVuYW1lZCBmcm9tIFdBTlRfQ1BVX00zMlIuCisJKiB0Y29uZmlnLmluIChXQU5UX0NQVV9NMzJSQik6IERpdHRvLgorCSogbTMyci5jIChXQU5UX0NQVV9NMzJSQik6IERpdHRvLgorCSgqKTogbTMycl8gY3B1IGZucyByZW5hbWVkIHRvIG0zMnJiXy4KKwkqIHNpbS1pZi5jIChzaW1fc3RvcCxzaW1fc3luY19zdG9wLHNpbV9yZXN1bWUpOiBVcGRhdGUuCisJKiBhcmNoLmgsYXJjaC5jOiBSZWdlbmVyYXRlLgorCSogY3B1LmMsY3B1LmgsZGVjb2RlLmMsZGVjb2RlLmgsZXh0cmFjdC5jLG1vZGVsLmM6IFJlZ2VuZXJhdGUuCisJKiBzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCisKKwkqIHNpbS1pZi5jIChzaW1fb3Blbik6IERvbid0IGFsbG9jYXRlIG1lbW9yeSBvbiB0b3Agb2YgYW55IHVzZXIKKwlzcGVjaWZpZWQgbWVtb3J5LgorCShoX2dyX2dldCxoX2dyX3NldCk6IERlbGV0ZS4KKwkqIHNpbS1tYWluLmggKGhfZ3JfZ2V0LGhfZ3Jfc2V0KTogRGVsZXRlLgorCSogdHJhcHMuYyAobTMycl90cmFwKTogUmVwbGFjZSBjYWxscyB0byBoX2dyX1tnc11ldCB3aXRoCisJYV9tMzJyX2hfZ3JfW2dzXWV0LgorCisJKiBNYWtlZmlsZS5pbiAoSU5DTFVERV9ERVBTKTogQWRkIGluY2x1ZGUvb3Bjb2RlL2NnZW4uaC4KKworCSogc2ltLWlmLmMgKHNpbV9vcGVuKTogT3BlbiBvcGNvZGUgdGFibGUuCisJKHNpbV9jbG9zZSk6IENsb3NlIGl0LgorCitGcmkgSnVsIDI0IDEzOjAwOjI5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIG0zMnIuYzogSW5jbHVkZSBjZ2VuLW1lbS5oLgorCSogdHJhcHMuYyAobTMycl90cmFwKTogVHdlYWsgZm9yIC1XYWxsLgorCitUdWUgSnVsIDIxIDE2OjUzOjEwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBjcHUuaCxleHRyYWN0LmM6IFJlZ2VuZXJhdGUuICBwYy1yZWwgY2FsY3MgZG9uZSBvbiBmX2Rpc3BOTiBub3cuCisKK1dlZCBKdWwgIDEgMTY6NTE6MTUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBjZ2VuX21haW50IC0+IENHRU5fTUFJTlQuCisJKiBjb25maWd1cmUuaW46IEFDX1NVQlNUIGNnZW4sY2dlbmRpci4gIE5vIGxvbmdlciBsb29rIGZvciBndWlsZS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIGFyY2guYyxhcmNoLmgsY3B1YWxsLmg6IFJlZ2VuZXJhdGUuCisJKiBjcHUuYyxjcHUuaCxkZWNvZGUuYyxkZWNvZGUuaCxleHRyYWN0LmMsbW9kZWwuYzogUmVnZW5lcmF0ZS4KKwkqIHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KKworU2F0IEp1biAxMyAwNzo0OToyMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGZhbGxpcy5jeWdudXMuY29tPgorCisJKiBtMzJyLXNpbS5oIChNMzJSX01JU0NfUFJPRklMRSk6IE5ldyBtZW1iZXJzIGluc25fY3ljbGVzLCBjdGlfc3RhbGwsCisJbG9hZF9zdGFsbCxiaWdnZXN0X2N5Y2xlcy4KKwkqIG0zMnIuYyAobTMycl9tb2RlbF9tYXJrX2dldF9oX2dyKTogVXBkYXRlLgorCShtMzJyX21vZGVsX2luaXRfaW5zbl9jeWNsZXMsbTMycl9tb2RlbF91cGRhdGVfaW5zbl9jeWNsZXMpOiBOZXcgZm5zLgorCShtMzJyX21vZGVsX3JlY29yZF9jdGksbTMycl9tb2RlbF9yZWNvcmRfY3ljbGVzKTogTmV3IGZ1bmN0aW9ucy4KKwkqIG1sb29wLmluOiBDYWxsIGN5Y2xlIGluaXQvdXBkYXRlIGZucy4KKwkqIG1vZGVsLmM6IFJlZ2VuZXJhdGUuCisKK1dlZCBKdW4gMTAgMTc6Mzk6MjkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogdHJhcHMuYzogTmV3IGZpbGUuICBUcmFwIHN1cHBvcnQgbW92ZWQgaGVyZSBmcm9tIHNpbS1pZi5jLgorCSogTWFrZWZpbGUuaW4gKFNJTV9PQkpTKTogQWRkIHRyYXBzLm8KKwkqIHNpbS1pZi5jOiBEb24ndCBpbmNsdWRlIHRhcmctdmFscy5oLgorCShzaW1fZW5naW5lX2lsbGVnYWxfaW5zbik6IE1vdmVkIHRvIHRyYXBzLmMKKwkqIHNpbS1tYWluLmggKFNJTV9DT1JFX1NJR05BTCk6IERlZmluZS4KKwkobTMycl9jb3JlX3NpZ25hbCk6IERlY2xhcmUuCisJKiBtMzJyLXNpbS5oIChtMzJyX3RyYXApOiBEZWNsYXJlLgorCisJKiBkZXZpY2VzLmMgKGRldmljZV9pb19yZWFkX2J1ZmZlcik6IEhhbmRsZSBjYWNoZSBwdXJnaW5nIHZpYSBNQ0NSCisJcmVnaXN0ZXIuCisKKwkqIG0zMnItc2ltLmggKE0zMlJfTUlTQ19QUk9GSUxFKTogTW92ZSBoZXJlIGZyb20gc2ltLW1haW4uaC4KKwkoUFJPRklMRV9DT1VOVF9TSE9SVElOU05TLFBST0ZJTEVfQ09VTlRfTE9OR0lOU05TKTogTmV3IG1hY3Jvcy4KKwkoVFJBUF9TWVNDQUxMLFRSQVBfQlJFQUtQT0lOVCk6IE5ldyBtYWNyb3MuCisKKwkqIGV4dHJhY3QuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCisKK1dlZCBNYXkgMjAgMDA6MTA6NDAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIG0zMnItc2ltLmggKFBST0ZJTEVfQ09VTlRfUEFSSU5TTlMpOiBOZXcgbWFjcm8uCisJKiBtbG9vcHguaW4gKGV4dHJhY3QpOiBTZXQgYWJ1Zi5hZGRyIGZvciBwcm9wZXIgZmlsbCBub3AgY291bnRpbmcuCisJKGV4ZWN1dGUpOiBDb3VudCBwYXJhbGxlbCBpbnNucy4KKwkqIHNpbS1pZi5jIChwcmludF9tMzJyX21pc2NfY3B1KTogUHJpbnQgY291bnQuCisJKiBzaW0tbWFpbi5oIChNMzJSX01JU0NfUFJPRklMRSk6IE5ldyBtZW1iZXIgcGFyYWxsZWxfY291bnQuCisKKwlaZXJvIGJvdHRvbSB0d28gYml0cyBvZiBwYyBpbiBqbXAsamwgaW5zbnMuCisJKiBzZW0uYyxzZW0tc3dpdGNoLmM6IFJlZ2VuZXJhdGUuCisKK1R1ZSBNYXkgMTkgMTY6NDU6MzMgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIHNpbS1pZi5jIChkb190cmFwKTogVHJlYXQgdHJhcHMgMi0xNSBhcyBoYXJkd2FyZSBkb2VzLgorCitTYXQgTWF5IDE2IDEzOjA0OjMwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBzaW0taWYuYyAoc2ltX3N0b3ApOiBVcGRhdGUgY2FsbCB0byBAY3B1QF9lbmdpbmVfc3RvcC4KKwkoc2ltX3N5bmNfc3RvcCk6IE5ldyBmdW5jdGlvbi4KKworRnJpIE1heSAxNSAxNjo0MzoyNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGRldmljZXMubyk6IEFkZCBkZXBlbmRlbmNpZXMuCisKKwkqIGFyY2guaCxjcHUuYyxjcHUuaCxjcHVhbGwuaDogUmVnZW5lcmF0ZS4KKwkqIHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KKwkqIG1sb29wLmluIChleGVjdXRlKTogVXBkYXRlIGNhbGxzIHRvIFRSQUNFX0lOU05fe0lOSVQsRklOSX0uCisKK1RodSBNYXkgIDcgMDI6NTE6MzUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tY3B1Lm8uCisKK1dlZCBNYXkgIDYgMTQ6NTE6MzkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIGFyY2guaCxhcmNoLmMsY3B1LmgsY3B1YWxsLmg6IFJlZ2VuZXJhdGUsIHR3ZWFrcyBtb3N0bHkuCisJKiBtb2RlbC5jOiBEaXR0by4gIFJlb3JnYW5pemUgbW9kZWwvbWFjaCBkYXRhLgorCisJKiBNYWtlZmlsZS5pbiAobTMyci5vLG1sb29wLm8sY3B1Lm8sbW9kZWwubyk6IEFkZCBkZWNvZGUuaCBkZXBlbmRlbmN5LgorCSogZGVjb2RlLmMsZGVjb2RlLmg6IFJlZ2VuZXJhdGUsIGludHJvZHVjZXMgSURFU0MgdGFibGUuCisJKiBtbG9vcC5pbiAoZXh0cmFjdDE2LGV4dHJhY3QzMik6IEFkZCBJREVTQyBzdXBwb3J0LgorCVVwZGF0ZSBuYW1lcyBvZiBzZW1hbnRpYyBoYW5kbGVyIG1lbWJlciBuYW1lcy4KKwkoZXhlY3V0ZSk6IERpdHRvLiAgRGVsZXRlIGNhbGwgdG8gUFJPRklMRV9DT1VOVF9JTlNOLgorCisJKiBzZW0tc3dpdGNoLmM6IFJlZ2VuZXJhdGUuICBSZWRvIGNvbXB1dGVkIGdvdG8gbGFiZWwgaGFuZGxpbmcuCisJKiBzZW0uYzogUmVnZW5lcmF0ZS4gIENhbGwgUFJPRklMRV9DT1VOVF9JTlNOLgorCisJKiBtMzJyLmMgKG0zMnJfZmV0Y2hfcmVnaXN0ZXIpOiBDaGFuZ2UgcmVzdWx0IHR5cGUgYW5kIGFyZ3MgdG8KKwljb25mb3JtIHRvIHNpbV9mZXRjaF9yZWdpc3RlciBpbnRlcmZhY2UuCisJKG0zMnJfc3RvcmVfcmVnaXN0ZXIpOiBEaXR0byBmb3Igc2ltX3N0b3JlX3JlZ2lzdGVyIGludGVyZmFjZS4KKworCSogc2ltLWlmLmMgKGFsbG9jX2NwdSk6IERlbGV0ZS4KKwkoZnJlZV9zdGF0ZSk6IFVuaW5zdGFsbCBtb2R1bGVzIGhlcmUgLi4uCisJKHNpbV9vcGVuKTogLi4uIGFuZCBub3QgaGVyZS4gIENhbGwgc2ltX2NwdV9hbGxvY19hbGwuCisJU2V0IGRlZmF1bHQgYXJjaGl0ZWN0dXJlL21vZGVsIGlmIG5vdCBzcGVjaWZpZWQuCisJKHNpbV9mZXRjaF9yZWdpc3RlcixzaW1fc3RvcmVfcmVnaXN0ZXIpOiBSZXdyaXRlLgorCisJKiBzaW0taWYuYyAoaF9wY19nZXQsaF9wY19zZXQpOiBEZWxldGUuICBSZW5hbWVkIHRvIHNpbV9wY19bZ3NdZXQKKwlhbmQgbW92ZWQgdG8gY29tbW9uL3NpbS1jcHUuYy4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFVwZGF0ZS4KKwkoZG9fdHJhcCk6IFVwZGF0ZS4KKwkqIHNpbS1tYWluLmggKGhfcGNfZ2V0LGhfcGNfc2V0KTogRGVsZXRlLgorCisJKiBzaW0tbWFpbi5oIChzaW1fY2lhKTogQ2hhbmdlIHRvIFVTSS4KKwkoc2ltX2NwdSk6IE1vdmUgbTMycl9taXNjX3Byb2ZpbGUgYmVmb3JlIG1hY2hpbmUgZ2VuZXJhdGVkIHBhcnQuCisKK1R1ZSBBcHIgMjggMTg6MzM6MzEgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworICAgICAgICAqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVHVlIEFwciAyOCAxODowNTo1MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBtb2RlbC5jOiBSZWJ1aWx0LgorCitNb24gQXByIDI3IDE1OjM2OjMwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBjcHUuaCxtb2RlbC5jLHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZWQuICBNb3N0bHkgY29tbWVudAorCWFuZCB2YXJpYWJsZSByZW5hbWluZyBkdWUgdG8gbWFjcm8gaW5zbiBhZGRpdGlvbnMuCisJKiBtbG9vcC5pbjogVXBkYXRlIHRvIHVzZSBDR0VOX0lOU05fTlVNLgorCitTdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitTdW4gQXByIDI2IDE1OjIwOjA1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogYWNjb25maWcuaDogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KKworRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworRnJpIEFwciAyNCAxMToxOToyNiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBzaW5jbHVkZS4KKworTW9uIEFwciAyMCAxNjoxMjozNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjcHUuYyxzZW0uYyxzZW0tc3dpdGNoLmM6IFJlZ2VuZXJhdGUuICBGcm9tCisJLSBjZ2VuL20zMnIuY3B1IChoLWFjY3VtKTogQWRkIGF0dHJpYnV0ZSBGVU4tQUNDRVNTLgorCSogbTMyci5jIChtMzJyX2hfYWNjdW1fZ2V0LG0zMnJfaF9hY2N1bV9zZXQpOiBOZXcgZnVuY3Rpb25zLgorCSNpbmNsdWRlIGNnZW4tb3BzLmguCisKK0ZyaSBBcHIgMTAgMTg6MjI6NDEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY3B1LmgsZGVjb2RlLmMsZGVjb2RlLmgsZXh0cmFjdC5jLHNlbS5jLHNlbS1zd2l0Y2guYzogUmVnZW5lcmF0ZS4KKworU2F0IEFwciAgNCAyMDozNjoyNSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworRnJpIE1hciAyNyAxNjoxNTo1MiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIE1hciAyNSAxMjozNToyOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIE1hciAxOCAxMjozODoxMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworU2F0IE1hciAxNCAyMDo1MzozNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnLmluIChIQVZFX0ZDTlRMX0gpOiBBZGQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgZGV2aWNlcy5vLgorCSogbTMyci1zaW0uaCAobTMycl9kZXZpY2VzKTogUmVuYW1lZCBmcm9tIG0zMnJfbXNwcl9kZXZpY2UuCisJKFVBUlRfKik6IERlZmluZSBtMzJyIHNlcmlhbCBwb3J0IHBhcmFtZXRlcnMuCisJKE0zMlJfREVWSUNFX0FERFIsTTMyUl9ERVZJQ0VfTEVOKTogRGVmaW5lLgorCSogbTMyci5jIChkZXZpY2VfaW9fe3JlYWQsd3JpdGV9X2J1ZmZlcixkZXZpY2VfZXJyb3IpOiBNb3ZlIGZyb20gaGVyZSwKKwkqIGRldmljZXMuYzogVG8gaGVyZS4KKwkqIHNpbS1pZi5jOiBEb24ndCBpbmNsdWRlIHNpZ25hbC5oLHNpbS1jb3JlLmguCisJKHNpbV9vcGVuKTogVXNlIE0zMlJfREVWSUNFX3tBRERSLExFTn0gaW4gc2ltX2NvcmVfYXR0YWNoIGNhbGwuCisJKHNpbV9yZXN1bWUpOiBDYWxsIHNpbV9tb2R1bGVfe3Jlc3VtZSxzdXNwZW5kfS4KKwkqIG0zMnIuYyAobTMycl9oX2NyX3tnZXQsc2V0fSk6IFVzZSByZWdpc3RlciBudW1iZXIgZW51bXMuCisKKwkqIHRjb25maWcuaW4gKFNJTV9IQU5ETEVTX0xNQSk6IERlZmluZS4KKworCSogc2ltLWlmLmMgKGRvX3RyYXApOiBSZXN1bHQgaXMgbmV3IHBjLgorCUhhbmRsZSAtLWVudmlyb25tZW50PW9wZXJhdGluZy4KKwkqIHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KKworV2VkIE1hciAxMSAxNDowNzozOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1pZi5jIChzeXNjYWxsX3JlYWRfbWVtLCBzeXNjYWxsX3dyaXRlX21lbSk6IFJlcGxhY2UKKyAJc2ltX2NvcmVfKl9tYXAgd2l0aCByZWFkX21hcCwgd3JpdGVfbWFwLCBleGVjX21hcCByZXNwLgorCitXZWQgTWFyICA0IDExOjM2OjUxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoU0lNX0VYVFJBX0RFUFMpOiBBZGQgY3B1LW9wYy5oLgorCShhcmNoLm8pOiBEZWxldGUgY3B1LW9wYy5oIGRlcGVuZGVuY3kuCisJKGRlY29kZS5vLG1vZGVsLm8pOiBMaWtld2lzZS4KKworCSogY3B1LmgsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCisKK1RodSBGZWIgMjYgMTg6Mzg6MzUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0taWYuYyAoc2ltX29wZW4pOiBJbml0aWFsaXplIFBST0ZJTEVfSU5GT19DUFVfQ0FMTEJBQ0suCisKKwkqIHNpbS1pZi5jIChzaW1faW5mbyk6IERlbGV0ZS4KKworTW9uIEZlYiAyMyAxMzozMDo0NiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogc2ltLW1haW4uaDogI2luY2x1ZGUgc3ltY2F0LmguCisJKiBtMzJyLXNpbS5oIChCUkFOQ0hfTkVXX1BDKTogRGVsZXRlIGN1cnJlbnRfY3B1IGFyZy4KKwkoTkVXX1BDX3tCQVNFLFNLSVAsMiw0LEJSQU5DSF9QfSk6IE5ldyBtYWNyb3MuCisJKiBjcHUuW2NoXSxkZWNvZGUuW2NoXSxleHRyYWN0LmMsbW9kZWwuYzogUmVnZW5lcmF0ZS4KKwkqIHNlbS5jLHNlbS1zd2l0Y2guYzogUmVnZW5lcmF0ZS4KKworTW9uIEZlYiAyMyAxMjoyNzo1MiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBtMzJyLmMgKG0zMnJfaF9jcl9zZXQsIG0zMnJfaF9jcl9nZXQpOiBTaGFkb3cgY29udHJvbCByZWdpc3RlciA2CisJaW4gdGhlIGJhY2t1cCBQQyByZWdpc3Rlci4KKworVGh1IEZlYiAxOSAxNjozOTozNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBtMzJyLmMgKGRvX2xvY2ssZG9fdW5sb2NrKTogRGVsZXRlLgorCSogY3B1LltjaF0sZGVjb2RlLltjaF0sZXh0cmFjdC5jLG1vZGVsLmM6IFJlZ2VuZXJhdGUuCisJKiBzZW0uYyxzZW0tc3dpdGNoLmM6IFJlZ2VuZXJhdGUuCisKK1R1ZSBGZWIgMTcgMTg6MTg6MTAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChNMzJSX09CSlMpOiBBZGQgY3B1Lm8uCisJKGNwdS5vKTogQWRkIHJ1bGUgZm9yLgorCShOTF9UQVJHRVQpOiBEZWZpbmUuCisJKiBjb25maWd1cmUuaW46IEFkZCBBQ19DSEVDS19QUk9HKFNDSEVNRSkuCisJKiBjcHUuYzogTmV3IGZpbGUuCisJKiBjcHVhbGwuaCxjcHUuaCxkZWNvZGUuYyxkZWNvZGUuaCxleHRyYWN0LmMsbW9kZWwuYzogUmVnZW5lcmF0ZS4KKwkqIHNlbS1zd2l0Y2guYyxzZW0uYzogUmVnZW5lcmF0ZS4KKwkqIG1sb29wLmluIChleGVjdXRlKTogVXBkYXRlIGNhbGwgdG8gc2VtYW50aWMgZm4uCisKKwkqIG0zMnIuYyAoZG9fdHJhcCk6IE1vdmUgZnJvbSBoZXJlLgorCSogc2ltLWlmLmMgKGRvX3RyYXApOiBUbyBoZXJlLCBhbmQgcmV3cml0ZSB0byB1c2UgQ0JfU1lTQ0FMTCBzdXBwb3J0LgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogVXNlIGhfcGNfc2V0LgorCShoX3BjX3tnZXQsc2V0fSk6IE5ldyBmdW5jdGlvbnMuCisJKGhfZ3Jfe2dldCxzZXR9KTogTmV3IGZ1bmN0aW9ucy4KKwkoc3lzY2FsbF97cmVhZCx3cml0ZX1fbWVtKTogTmV3IGZ1bmN0aW9ucy4KKwkqIHNpbS1tYWluLmggKGhfe2dyLHBjfV97Z2V0LHNldH0pOiBEZWNsYXJlLgorCitUdWUgRmViIDE3IDEyOjQ0OjM4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWlmLmMgKHNpbV9zdG9yZV9yZWdpc3Rlciwgc2ltX2ZldGNoX3JlZ2lzdGVyKTogUGFzcyBpbgorIAlsZW5ndGggcGFyYW1ldGVyLiAgUmV0dXJuIC0xLgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogUGFzcyA0IHNpbV9zdG9yZV9yZWdpc3Rlci4KKworV2VkIEZlYiAxMSAxOTo1Mzo0OCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzaW0tbWFpbi5oIChDSUFfR0VULENJQV9TRVQpOiBQcm92aWRlIGR1bW15IGRlZmluaXRpb25zIGZvciBub3cuCisKKwkqIGRlY29kZS5jLCBkZWNvZGUuaCwgc2VtLmMsIHNlbS1zd2l0Y2guYywgbW9kZWwuYzogUmVnZW5lcmF0ZS4KKworTW9uIEZlYiAgOSAxOTo0MTo1NCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBkZWNvZGUuYywgc2VtLmM6IFJlZ2VuZXJhdGUuCisKK1RodSBGZWIgIDUgMTI6NDQ6MzEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChtMzJyLm8pOiBEZXBlbmQgb24gY3B1LmgKKwkoZXh0cmFjdC5vKTogUGFzcyAtRFNDQUNIRV9QLgorCSogbWxvb3AuaW4gKGV4dHJhY3R7MTYsMzJ9KTogVXBkYXRlIGNhbGwgdG8gbTMycl9kZWNvZGUuCisJKiBhcmNoLmgsY3B1LmgsY3B1YWxsLmgsZGVjb2RlLltjaF06IFJlZ2VuZXJhdGUuCisJKiBleHRyYWN0LmMsbW9kZWwuYyxzZW0tc3dpdGNoLmMsc2VtLmM6IFJlZ2VuZXJhdGUuCisJKiBzaW0tbWFpbi5oOiAjaW5jbHVkZSAiYW5zaWRlY2wuaCIuCisJRG9uJ3QgaW5jbHVkZSBjcHUtb3BjLmgsIGRvbmUgYnkgYXJjaC5oLgorCitTdW4gRmViICAxIDE2OjQ3OjUxIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitTYXQgSmFuIDMxIDE4OjE1OjQxIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgSmFuIDIwIDE0OjE2OjAyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGNwdXguaDogRml4IGR1cGxpY2F0ZSBkZWZpbml0aW9uIG9mIGhfYWNjdW1zIGZpZWxkIGZvcgorCWZtdF81M19zYWRkIHN0cnVjdHVyZS4KKworTW9uIEphbiAxOSAyMjoyNjoyOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmE+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIEphbiAxOSAxNDoxMzo0MCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogYXJjaC5jLCBhcmNoLmgsIGNwdWFsbC5oOiBOZXcgZmlsZXMuCisJKiBhcmNoLWRlZnMuaDogRGVsZXRlZC4KKwkqIG1sb29wLmluOiBSZW5hbWVkIGZyb20gbWFpbmxvb3AuaW4uCisJKiBNYWtlZmlsZS5pbjogVXBkYXRlLgorCSogc2VtLW9wcy5oOiBEZWxldGVkLgorCSogbWVtLW9wcy5oOiBEZWxldGVkLgorCShhcmNoKTogUmVuYW1lZCBmcm9tIENQVS4KKwkqIGNwdS5oOiBOZXcgZmlsZS4KKwkqIGRlY29kZS5jOiBSZWRvbmUuCisJKiBkZWNvZGUuaDogUmVkb25lLgorCSogZXh0cmFjdC5jOiBSZWRvbmUuCisJKiBtb2RlbC5jOiBSZWRvbmUuCisJKiBzZW0tc3dpdGNoLmM6IFJlZG9uZS4KKwkqIHNlbS5jOiBSZW5hbWVkIGZyb20gc2VtYW50aWNzLmMsIGFuZCByZWRvbmUuCisJKiBtMzJyLXNpbS5oIChQUk9GSUxFX0NPVU5UX0ZJTExOT1BTKTogVXBkYXRlLgorCShHRVRUV0ksU0VUVFdJLEJSQU5DSF9ORVdfUEMpOiBEZWZpbmUuCisJKiBtMzJyLmMgKFdBTlRfQ1BVLFdBTlRfQ1BVX00zMlIpOiBEZWZpbmUuCisJKG0zMnJfe2ZldGNoLHN0b3JlfV9yZWdpc3Rlcik6IE5ldyBmdW5jdGlvbnMuCisJKG1vZGVsX21hcmtfe2dldCxzZXR9X2hfZ3IpOiBQcmVmaXggd2l0aCBtMzJyXy4KKwkobTMycl9tb2RlbF9tYXJrX3tidXN5LHVuYnVzeX1fcmVnKTogUHJlZml4IHdpdGggbTMycl8uCisJKGhfY3Jfe2dldCxzZXR9KTogUHJlZml4IHdpdGggbTMycl8uCisJKGRvX3RyYXApOiBGZXRjaCBzdGF0ZSBmcm9tIGN1cnJlbnRfY3B1LCBub3QgY3VycmVudF9zdGF0ZS4KKwlDYWxsIHNpbV9lbmdpbmVfaGFsdCBpbnN0ZWFkIG9mIGVuZ2luZV9oYWx0LgorCSogc2ltLWlmLmMgKGFsbG9jX2NwdSk6IE5ldyBmdW5jdGlvbi4KKwkoZnJlZV9zdGF0ZSk6IE5ldyBmdW5jdGlvbi4KKwkoc2ltX29wZW4pOiBDYWxsIHNpbV9zdGF0ZV9hbGxvYywgYW5kIG1hbGxvYyBzcGFjZSBmb3Igc2VsZWN0ZWQgY3B1CisJdHlwZS4gIENhbGwgc2ltX2FuYWx5emVfcHJvZ3JhbS4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEhhbmRsZSBzZWxlY3RlZCBjcHUgdHlwZSB3aGVuIHNldHRpbmcgUEMuCisJKHNpbV9zdG9wX3JlYXNvbik6IERlbGV0ZWQuCisJKHByaW50X20zMnJfbWlzY19jcHUpOiBVcGRhdGUuCisJKHNpbV97cmVhZCx3cml0ZX0pOiBEZWxldGVkLgorCShzaW1fZW5naW5lX2lsbGVnYWxfaW5zbik6IE5ldyBmdW5jdGlvbi4KKwkqIHNpbS1tYWluLmg6IERvbid0IGluY2x1ZGUgYXJjaC1kZWZzLmgsc2ltLWNvcmUuaCxzaW0tZXZlbnRzLmguCisJSW5jbHVkZSBhcmNoLmgsY3B1YWxsLmguICBJbmNsdWRlIGNwdS5oLGRlY29kZS5oIGlmIG0zMnIuCisJKF9zaW1fY3B1KTogSW5jbHVkZSBtZW1iZXIgYXBwcm9wcmlhdGUgY3B1X2RhdGEgbWVtYmVyIGZvciB0aGUgY3B1LgorCShNMzJSX01JU0NfUFJPRklMRSk6IFJlbmFtZWQgZnJvbSBNMzJSX1BST0ZJTEUuCisJKHNpbV9zdGF0ZSk6IERlbGV0ZSBtZW1iZXJzIGNvcmUsZXZlbnRzLGhhbHRfam1wX2J1Zi4KKwlDaGFuZ2UgYGNwdScgbWVtYmVyIHRvIGJlIGEgcG9pbnRlciB0byB0aGUgY3B1J3Mgc3RydWN0LCByYXRoZXIgdGhhbgorCXJlY29yZCBpbnNpZGUgdGhlIHN0YXRlIHN0cnVjdC4KKwkqIHRjb25maWcuaW4gKFdJVEhfREVWSUNFUyk6IERlZmluZSBoZXJlLgorCShXSVRIX0ZBU1QsV0lUSF9TRU1fU1dJVENIX3tGVUxMLEZBU1R9KTogRGVmaW5lIGZvciB0aGUgY3B1LgorCitGcmkgSmFuIDE2IDEyOjE2OjU2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIGFyY2gtZGVmcy5oIChJTlNOX05BTUUpOiBGaXggdHlwby4KKworTW9uIERlYyAxNSAyMzoxNzoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1RodSBEZWMgIDQgMDk6MjE6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbTMyci1zaW0uaCAoTVNQUl9BRERSKTogTmV3IG1hY3JvLgorCShtMzJyX21zcHJfZGV2aWNlKTogRGVjbGFyZS4KKwkoc3RydWN0IF9kZXZpY2UpOiBEZWZpbmUuCisJKiBtMzJyLmMgKG0zMnJfbXNwcl9kZXZpY2UpOiBOZXcgZ2xvYmFsLgorCShkZXZpY2Vfe2lvX3tyZWFkLHdyaXRlfV9idWZmZXIsZXJyb3J9KTogTmV3IGZ1bmN0aW9ucy4KKwkqIG1lbS1vcHMuaCAoU0VUTUVNKik6IFVzZSBzaW1fY29yZV93cml0ZV9tYXAsIG5vdCByZWFkIG1hcC4KKwkqIHNpbS1pZi5jOiBEZWxldGUgcmVkdW5kYW50IGluY2x1c2lvbiBvZiBjcHUtc2ltLmguCisJKHNpbV9vcGVuKTogQXR0YWNoIGRldmljZSB0byBoYW5kbGUgTVNQUiByZWdpc3Rlci4KKwkqIHNpbS1tYWluLmggKFdJVEhfREVWSUNFUyk6IERlZmluZSBhcyAxLgorCUluY2x1ZGUgY3B1LXNpbS5oLgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBEZWMgIDMgMTg6MDg6NDQgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChTSU1fQUNfT1BUSU9OX0VOVklST05NRU5UKTogQ2FsbC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK1dlZCBOb3YgMTkgMTI6MTc6MDggMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbWVtLW9wcy5oOiBSZW5hbWUgU0lNX1NJR3tBQ0NFU1MsQUxJR059IHRvIFNJTV9TSUd7U0VHVixCVVN9LgorCSogc2ltLWlmLmMgKHNpbV9vcGVuKTogQ2FsbCBzaW1fY29uZmlnLgorCShzaW1fc3RvcF9yZWFzb24pOiBVcGRhdGUgY2FsbCB0byBzaW1fc2lnbmFsX3RvX2hvc3QuCisKK1R1ZSBOb3YgMTggMTU6MzM6NDggMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFNJTV9PQkpTKTogVXNlICQoU0lNX05FV19DT01NT05fT0JKUykuCisKK0ZyaSBPY3QgMzEgMTg6NDY6NDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0taWYuYyAoc2ltX29wZW4pOiBEZWxldGUgZGVhZCBjYWxsIHRvIHNpbV9jb3JlX2F0dGFjaC4KKworTW9uIE9jdCAyNyAxMjo0Mzo1NCAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzZW0tb3BzLmggKFV7RElWLE1PRH1bQkhTRF1JKTogVXNlIHVuc2lnbmVkIGRpdmlzaW9uLgorCitGcmkgT2N0ICAzIDA5OjI4OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgU2VwIDI0IDE3OjM4OjU3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgU2VwIDIzIDExOjA0OjM4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgU2VwIDIzIDEwOjE5OjUxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFNJTV9FTkRJQU4sIFNJTV9IT1NURU5ESUFOLCBTSU1fU0NBQ0hFLAorIAlTSU1fREVGQVVMVF9NT0RFTCk6IERlbGV0ZSwgbW92ZWQgdG8gY29tbW9uLgorCShTSU1fRVhUUkFfQ0ZMQUdTKTogVXBkYXRlLgorCQorTW9uIFNlcCAyMiAxMTo0NjoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoc2ltX2xpbmtfbGlua3MpOiBDb25maWd1cmUgbm9uLXN0cmljdCBtZW1vcnkKKyAJYWxpZ25tZW50LgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK0ZyaSBTZXAgMTkgMTc6NDU6MjUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBTZXAgMTcgMTc6NDQ6NDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0taWYuYyAoc2ltX29wZW4pOiBBbGxvY2F0ZSBtZW1vcnkgdW5kZXIgc2ltLW1lbW9wdCBtb2R1bGUKKyAJdXNpbmcgc2ltX2RvX2NvbW1hbmRmLgorCShzaW1fb3Blbik6IFNldCBtYWdpYy1udW1iZXIgYXQgdGhlIHN0YXJ0LgorCShzaW1fZG9fY29tbWFuZCk6IEltcGxlbWVudC4KKworCSogc2ltLW1haW4uaCAoc2ltX2VuZ2luZV9oYWx0KTogTWFwIG9udG8gZW5naW5lX2hhbHQuCisKK01vbiBTZXAgMTUgMTc6MzY6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1RodSBTZXAgIDQgMTc6MjE6MjMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK0ZyaSBTZXAgIDUgMTA6MjE6NDggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgc2ltLW1lbW9wdC5vIG1vZHVsZS4KKworVGh1IFNlcCAgNCAxMDozMDowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1pZi5jIChzaW1fb3Blbik6IFBhc3MgemVybyBtb2R1bG8gYXJnIHRvIHNpbV9jb3JlX2F0dGFjaC4KKworV2VkIEF1ZyAyNyAxODoxMzoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1R1ZSBBdWcgMjYgMTA6Mzk6NDIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0taWYuYyAoc2ltX2tpbGwpOiBEZWxldGUuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBBZGQgQUJGRCBhcmd1bWVudC4KKwkoc2ltX2xvYWQpOiBNb3ZlIHNldHRpbmcgb2YgUEMgZnJvbSBoZXJlLgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogVG8gaGVyZS4KKwkoc2ltX2xvYWQpOiBEZWxldGUsIHVzZSBzaW0taGxvYWQuYyBpbnN0ZWFkLgorCisJKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgc2ltLWhsb2FkLm8gbW9kdWxlLgorCitNb24gQXVnIDI1IDE3OjUwOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworTW9uIEF1ZyAyNSAxNTo1NDowOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1pZi5jIChzaW1fb3Blbik6IEFkZCBBQkZEIGFyZ3VtZW50LgorCitUdWUgSnVsIDIyIDEwOjE2OjE2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNpbS1tYWluLmggKE0zMlJfREVGQVVMVF9NRU1fU0laRSk6IE5ldyBtYWNyby4KKwkqIHNpbS1pZi5jIChzaW1fb3Blbik6IFVzZSBpdC4KKworV2VkIEp1biAgNCAxMjo0ODoxMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1tYWluLmggKFdJVEhfRU5HSU5FKTogRGlzYWJsZSB0aGUgY29tbW9uIGVuZ2luZSBmb3Igbm93LgorCitUdWUgTWF5IDI3IDE0OjE1OjQ0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLWlmLmMgKHNpbV9yZWFkKTogUGFzcyBOVUxMIGNwdSB0byBzaW1fY29yZV9yZWFkX2J1ZmZlci4KKwkoc2ltX3dyaXRlKTogRGl0dG8gZm9yIHdyaXRlLgorCisJKiBtMzJyLmMgKGRvX3RyYXApOiBEaXR0byBmb3IgcmVhZC93cml0ZS4KKworVHVlIE1heSAyMCAxMDoxODoyNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1pZi5jIChzaW1fb3Blbik6IEFkZCBjYWxsYmFjayBhcmd1bWVudC4KKwkoc2ltX3NldF9jYWxsYmFja3MsIHNpbV9jYWxsYmFjayk6IERlbGV0ZS4KKwkoc2ltX2xvYWQpOiBTZXQgU1RBVEVfTE9BREVEX1AuCisKK01vbiBNYXkgMTkgMTI6NTU6NDIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBMaW5rIGluIHNpbS1hYm9ydC5vIGFzIGEgc3R1YiBmb3IKKyAJc2ltX2VuZ2luZV9hYm9ydC4KKworTW9uIE1heSAgNSAxMjo0NToyOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1pZi5jIChzaW1fb3Blbik6IFVwZGF0ZSB0byByZWZsZWN0IGNoYW5nZXMgdG8gY29yZSBpbgorIAkuLi9jb21tb24vLgorCSogbWVtLW9wcy5oIChHRVRNRU1RSSwgR0VUTUVNSEksIEdFVE1FTVNJLCBHRVRNRU1ESSwgR0VUTUVNVVFJLAorIAlHRVRNRU1VSEksIEdFVE1FTVVTSSwgR0VUTUVNVURJLCBTRVRNRU1RSSwgU0VUTUVNSEksIFNFVE1FTVNJLAorIAlTRVRNRU1ESSwgU0VUTUVNVVFJLCBTRVRNRU1VSEksIFNFVE1FTVVTSSwgU0VUTUVNVURJKTogRGl0dG8uCisKK1NhdCBNYXkgIDMgMDg6Mzg6NTUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+CisKKwkqIGRlY29kZS5jIChkZWNvZGUpOiBBZGQgY29tcHV0ZWQgZ290byBzdXBwb3J0LgorCitGcmkgTWF5ICAyIDE2OjMwOjI2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogbWVtLW9wcy5oOiBTdHViIGFkZGl0aW9uYWwgY29yZSByZWFkL3dyaXRlIGFyZ3VtZW50cy4KKworCSogc2ltLW1haW4uaDogRGVjbGFyZSBzaW1fY2lhIC0gdHlwZSBTSS4KKwkoc3RydWN0IF9zaW1fY3B1KTogTW92ZSBiYXNlIHR5cGUgdG8gZW5kIHBlciBjb21tb24uCisJKHN0cnVjdCBfc2ltX3N0YXRlKTogRGl0dG8uCisKK1RodSBNYXkgIDEgMTE6MTU6MzQgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCU1lcmdlIGZyb20gYnJhbmNoIGludG8gZGV2by4gIENHRU4gZ2VuZXJpYyBmaWxlcyBtb3ZlZCB0byBjb21tb24KKwlkaXJlY3RvcnkuICBLJlIgQyBzdXBwb3J0IGlzIG5vIGxvbmdlciBwcm92aWRlZC4KKworVGh1IEFwciAyNCAwMDozOTo1MSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1NhdCBBcHIgMTIgMTI6NTc6MzMgMTk5NyAgRmVsaXggTGVlICA8ZmxlZUB5aW4uY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4sIHNlbWFuLWNhY2hlLmM6IG5ldyBmaWxlLCBmb3Igd2luZ2RiIGJ1aWxkLgorCSogc2ltLWFsbG9jYS5oOiBmaXhlZCBmb3Igd2luZ2RiLgorCQorTW9uIEFwciAgNyAxMzozMzoyOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KKworCSogZGVjb2RlLmMgKCopOiBtMzJyX2NnZW5faW5zbl90YWJsZSByZW5hbWVkIHRvIC4uLl9lbnRyaWVzLgorCSogbWFpbmxvb3AuaW46IFVzZSBDR0VOX0lOU05fSU5ERVggaW5zdGVhZCBvZiBDR0VOX0lOU05fVFlQRS4KKwkqIHNpbWRlZnMuaCAoSU5TTl9OQU1FKTogbTMycl9jZ2VuX2luc25fdGFibGUgcmVuYW1lZCB0byAuLi5fZW50cmllcy4KKworRnJpIEFwciAgNCAxOToyMzoxMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjZ2VuLXV0aWxzLmluIChleF9pbGxlZ2FsKTogRmlsbCBpbiBhYnVmLT5sZW5ndGgsIGFidWYtPmFkZHIuCisJKGV4Y19pbGxlZ2FsKTogTGlrZXdpc2UuCisJKiBkZWNvZGUuYyAoZGVjb2RlX3ZhcnMpOiBBZGQgZGVjb2RlX2lsbGVnYWwuCisJKiBnZW5tbG9vcC5zaDogI2luY2x1ZGUgImNwdS1vcGMuaCIuCisJKiBzZW0tc3dpdGNoLmMgKGNhc2VfSU5TTl9JTExFR0FMKTogRGVjbGFyZS4KKwkobGFiZWxzKTogQWRkIGNhc2VfSU5TTl9JTExFR0FMLgorCShTV0lUQ0gpOiBBZGQgSU5TTl9JTExFR0FMIGNhc2UuCisKK1dlZCBNYXIgMjYgMTI6MzQ6MDAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbW9kZWwuYyAobW9kZWxfbW9kdWxlKTogVXNlIDAgbm90IE5VTEwuCisKKwkqIGdlbm1sb29wLnNoIChzaW1fbWFpbl9sb29wKTogSGFuZGxlIGsmciBjLgorCisJKiBzZW0tc3dpdGNoLmM6IFJlZ2VuZXJhdGUgdG8gZ2V0IGsmciBjIHN1cHBvcnQuCisJKiBzZW1hbnRpY3MuYzogTGlrZXdpc2UuCisKKwkqIG0zMnIuYyAoQUREX3tPVixDQX1fU0ksU1VCX3tPVixDQX1fU0kpOiBSZW5hbWVkIHRvIHtBREQsU1VCfVtPQ11GU0kuCisJKEFERENTSSxTVUJDU0kpOiBOZXcgZnVuY3Rpb25zLgorCSogc2VtLXN3aXRjaC5jIChhZGR2LGFkZHYzLGFkZHgsc3VidixzdWJ4KTogRml4IGNhcnJ5IGJpdCBoYW5kbGluZy4KKwkqIHNlbWFudGljcy5jIChhZGR2LGFkZHYzLGFkZHgsc3VidixzdWJ4KTogRml4IGNhcnJ5IGJpdCBoYW5kbGluZy4KKworCSogc2ltY2FjaGUuYyAoc2ltY2FjaGVfe2luc3RhbGwsaW5pdCx1bmluc3RhbGx9KTogVXNlCisJREVDTEFSRV9NT0RVTEVfSU5TVEFMTF9IQU5ETEVSLgorCShzaW1jYWNoZV9vcHRpb25faGFuZGxlcik6IFVzZSBERUNMQVJFX09QVElPTl9IQU5ETEVSLgorCisJKiB1dGlscy5jOiAjaW5jbHVkZSAic2Vtb3BzLmgiLgorCitUdWUgTWFyIDExIDE0OjMwOjI2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgorCisJKiBwcm9maWxlLmMgKHByb2ZpbGVfcHJpbnRfc2ltY2FjaGUpOiBGaXggdGhpbmtvIGluIHByaW50ZiB0ZXh0LgorCisJKiBzaW1kZWZzLmggKHN0cnVjdCBhcmdidWYpOiBBZGQgbWVtYmVyIHRvIGZtdF8yMCBzbyBpdCdzIG5vdCBlbXB0eS4KKworTW9uIE1hciAxMCAxMTowNjoyOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KKworCSogbTMyci5jIChoX2NyX2dldCk6IFJld3JpdGUuCisJKGhfY3Jfc2V0KTogUmV3cml0ZS4KKwkqIHNlbS1zd2l0Y2guYyAocnRlKTogYmNhcnJ5IHJlbmFtZWQgdG8gYmNvbmQuCisJKiBzZW1hbnRpY3MuYyAocnRlKTogTGlrZXdpc2UuCisJKiBzaW1kZWZzLmggKENQVV9TVEFURSk6IExpa2V3aXNlLgorCisJKiBjb25maWcuaW4gKEhBVkVfU1lTX1RJTUVfSCk6IEFkZC4KKwkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIHN5cy90aW1lLmguCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogdXRpbHMuYzogSW5jbHVkZSBzeXMvdGltZS5oIGlmIHByZXNlbnQuCisKKwkqIGNvbW1vbi5jIChzaW1fcGFyc2VfYXJncyk6IEFjY291bnQgZm9yIE5VTEwgdGVybWluYXRpbmcgZW50cnkKKwlpbiBsb25nX29wdGlvbnMgdGFibGUuCisKKwkqIGdlbm1sb29wLnNoIChSVU5fRkFTVF9QKTogRG9uJ3QgcnVuIGZhc3QgaWYgdHJhY2luZy4KKwlBbHdheXMgdXNlIGNhY2hlIGlmIGNvbmZpZ3VyZWQgaW4uCisJKiBtYWlubG9vcC5pbiAoZG9fZXh0cmFjdF9pbnNuezE2LDMyfSk6IE5ldyBmdW5jdGlvbnMuCisJKG5vcm1hbCxmYXN0KTogQ2FsbCB0aGVtLiAgSGFuZGxlIHN0YXJ0aW5nIGluIGxlZnQgc2xvdC4KKwkqIHNpbWNhY2hlLmMgKHNpbWNhY2hlX29wdGlvbl9oYW5kbGVyKTogRGlzYWxsb3cgLWMwLgorCSogc2VtLXN3aXRjaC5jIChUUkFDRV9SRVNVTFQpOiBSZWRlZmluZSBzbyBubyB0cmFjaW5nLgorCisJKiBwcm9maWxlLmMgKHByb2ZpbGVfcHJpbnRfc2ltY2FjaGUpOiBGaXggcGVyY2VudGFnZSBjYWxjLgorCisJKiBNYWtlZmlsZS5pbiAoSU5DTFVERV9ERVBTKTogRGVsZXRlIHNpbWNvbW1vbi5oLgorCitTdW4gTWFyICA5IDIwOjQyOjE3IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQ09NTU9OX3tQUkUsUE9TVH1fQ09ORklHX0ZSQUcpOiBBZGQgZGVsaW1pdGVycyBmb3IuCisJKE0zMlJfSU5DTFVERV9ERVBTKTogVXNlIGNwdS1zaW0uaCBpbnN0ZWFkIG9mIG0zMnItc2ltLmguCisJQWRkIG1vZC1saXN0LmguCisJKG1ydW4ubyk6IERvbid0IGRlcGVuZCBvbiBNMzJSX0lOQ0xVREVfREVQUy4KKwkoc2ltLWlmLm8sbTMyci5vLHV0aWxzLm8pOiBMaWtld2lzZS4KKwkoY29tbW9uLm8pOiBEb24ndCBleHBsaWNpdGx5IGRlcGVuZCBvbiBtb2QtbGlzdC5oLgorCShtYWlubG9vcC5jKTogUGFzcyBDUFUgdG8gZ2VubWxvb3Auc2guCisJKHN0YW1wLW1vZHVsZXMpOiBEZXBlbmQgb24gY29uZmlndXJlLgorCShkZWNvZGUubyk6IERlcGVuZCBvbiBkZWNvZGUsaCwgbWVtb3BzLmgsIHNlbW9wcy5oLCBjcHUtb3BjLmguCisJKGV4dHJhY3Qubyk6IERlcGVuZCBvbiBkZWNvZGUuaCwgbWVtb3BzLmgsIHNlbW9wcy5oLgorCShzZW1hbnRpY3MubyxzZW1hbi1jYWNoZS5vKTogTGlrZXdpc2UuCisJKG1vZGVsLm8sb3BzLm8pOiBEZXBlbmQgb24gbWVtb3BzLmguCisJKGV4dHItY2FjaGUubyk6IERpc2FibGUgYnVpbGRpbmcgZm9yIHRoZSBtb21lbnQuCisKKwkqIHNpbWNvbW1vbi5oOiBEZWxldGUsIG1vdmUgY29udGVudHMgaW50byBjZ2VuLXNpbS5oLgorCSogY2dlbi1zaW0uaDogRG9uJ3QgaW5jbHVkZSBhbnNpZGVjbC5oLGJmZC5oLHNpbWZucy5oLgorCShVSU5ULENHRU5fQ0FUMyk6IERlZmluZS4KKwkoe2V4dHJhY3Qsc2VtYW50aWN9X2ZuX3QpOiBSZW5hbWVkIHRvIHtFWFRSQUNULFNFTUFOVElDfV9GTi4KKwkoZGVjb2RlX3QpOiBSZW5hbWVkIHRvIERFQ09ERS4KKworCSogc2ltZm5zLmg6IERlbGV0ZSwgY29udGVudHMgbW92ZWQgdG8gbWVtb3BzLmgsc2Vtb3BzLmguCisJKiBtZW1vcHMuaDogTmV3IGZpbGUuCisJKiBzZW1vcHMuaDogTmV3IGZpbGUuCisJKiBkZWNvZGUuaDogUmVuYW1lZCBmcm9tIHNlbWFudGljcy5oLgorCisJKiBzaW0tYXJndi5oOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmluIChtZW1vcnkubyx0cmFjZS5vLHByb2ZpbGUubyxzaW1jYWNoZS5vLGNvbW1vbik6IEFkZAorCWRlcGVuZGVuY3kgb2Ygc2ltLWFyZ3YuaC4KKworCSogc2ltLWFsbG9jYS5oOiBOZXcgZmlsZS4KKwkqIGNvbW1vbi5jOiBJbmNsdWRlIGl0LgorCSogTWFrZWZpbGUuaW4gKGNvbW1vbi5vKTogQWRkIGRlcGVuZGVuY3kuCisKKwkqIGNvbmZpZy5pbiAoSEFWRV9USU1FX0gsSEFWRV9TWVNfUkVTT1VSQ0VfSCk6IEFkZC4KKwkoSEFWRV9HRVRSVVNBR0UsSEFWRV9USU1FKTogQWRkLgorCSogY29uZmlndXJlLmluOiBzaW5jbHVkZSAuLi9jb21tb24vYWNsb2NhbC5tNC4KKwlDaGVjayBmb3IgaGVhZGVycyB0aW1lLmgsIHN5cy9yZXNvdXJjZS5oLgorCUNoZWNrIGZvciBmdW5jdGlvbnMgdGltZSwgZ2V0cnVzYWdlLgorCShzaW1fbGlua197ZmlsZXMsbGlua3N9KTogQWRkIGxpbmsgY3B1LW9wYy5oLgorCShzaW1fcHJvZmlsZSk6IEFkZCBzaW1jYWNoZS4KKwkoU0lNX0FDX1BST0ZJTEUpOiBBZGQgc2ltY2FjaGUsIHByb2ZpbGUuby4KKwkoc2ltY2FjaGUgbW9kdWxlKTogRGVsZXRlIGV4dHItY2FjaGUubyBmb3Igbm93LgorCSgtLWVuYWJsZS1zaW0tY2FjaGUpOiBBbGxvdyBzcGVjaWZpY2F0aW9uIG9mIGRlZmF1bHQgY2FjaGUgc2l6ZS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKKwkqIGRlY29kZS5jOiAjaW5jbHVkZSBjZ2VuLXNpbS5oLG1lbW9wcy5oLHNlbW9wcy5oLGRlY29kZS5oLAorCWNwdS1zaW0uaCxjcHUtb3BjLmguICBEb24ndCBpbmNsdWRlIG0zMnItc2ltLmguCisJUmVnZW5lcmF0ZS4KKworCSogZXh0cmFjdC5jOiAjaW5jbHVkZSBjZ2VuLXNpbS5oLGRlY29kZS5oLGNwdS1zaW0uaC4KKwlEb24ndCBpbmNsdWRlIG0zMnItc2ltLmguCisJKCopOiBEZWZpbmUvVW5kZWYgRkxEIG1hY3JvLiAgVXNlIGl0IHRvIHJlZmVyZW5jZSBBUkdCVUYuCisJU2ltcGxpZnkgcHJvZmlsaW5nIHRlc3Qgd2l0aCBQUk9GSUxFX01PREVMX1AuCisJKG12ZmMsbXZ0Yyk6IEZpeCBhY2Nlc3Mgb2YgY29udHJvbCByZWdpc3RlcnMuCisJKiBzZW1hbnRpYy5jOiAjaW5jbHVkZSBjZ2VuLXNpbS5oLG1lbW9wcy5oLHNlbW9wcy5oLGRlY29kZS5oLGNwdS1zaW0uaC4KKwlEb24ndCBpbmNsdWRlIG0zMnItc2ltLmguCisJKCopOiBEZWZpbmUvVW5kZWYgRkxEIG1hY3JvLiAgVXNlIGl0IHRvIHJlZmVyZW5jZSBBUkdCVUYuCisJU2ltcGxpZnkgcHJvZmlsaW5nIHRlc3Qgd2l0aCBQUk9GSUxFX01PREVMX1AuCisJKG12ZmMsbXZ0Yyk6IEZpeCBhY2Nlc3Mgb2YgY29udHJvbCByZWdpc3RlcnMuCisKKwkqIHNlbS1zd2l0Y2guYzogTmV3IGZpbGUsIGZvciBHQ0MgY29tcHV0ZWQgZ290byBzdXBwb3J0LgorCisJKiBnZW5tbG9vcC5zaDogQWRkICNpbmNsdWRlJ3Mgb2YgYmZkLmgsY2FsbGJhY2suaCxjZ2VuLXNpbS5oLAorCW1lbW9wcy5oLHNlbW9wcy5oLHRyYWNlLmgsY3B1LXNpbS5oLgorCShSVU5fRkFTVF9QKTogQ2hhbmdlIGRlZmF1bHQgdG8gcnVuIGZhc3QgaWYgY2FjaGUgc2l6ZSA+IDAKKwlhbmQgbm90IHByb2ZpbGluZy4KKwkoc2ltX21haW5fbG9vcCk6IFJlY29yZCBleGVjdXRpb24gdGltZS4KKwlSZWNvcmQgaW5zdHJ1Y3Rpb24gY291bnQgZXZlbiBpbiBmYXN0IG1vZGUuCisJKGluaXQpOiBBbGxvdyBjcHUgdG8gcHJvdmlkZSBpbml0IGNvZGUgaW4gbWFpbmxvb3AuaW4uCisJKEZBU1QpOiBEZWZpbmUgYXMgMCBvciAxIGRlcGVuZGluZyBvbiBmYXN0IG1vZGUuCisJKiBtYWlubG9vcC5pbiAobm9ybWFsKTogQ29tYmluZSB3aXRoIGZhc3QgY2FzZS4KKwlBZGQgc3VwcG9ydCBmb3IgR0NDIGNvbXB1dGVkIGdvdG9zLiAgQ291bnQgc2ltY2FjaGUgaGl0cy9taXNzZXMuCisJKGluaXQpOiBJbml0aWFsaXplICJzd2l0Y2giIGxhYmVscyBpZiBHTlVDLgorCisJKiBjZ2VuLXV0aWxzLmluOiBEb24ndCBpbmNsdWRlIG9wY29kZS9jZ2VuLmguCisJSW5jbHVkZSBjZ2VuLXNpbS5oLCBjcHUtb3BjLmguCisJKiBjb21tb24uYzogRG9uJ3QgaW5jbHVkZSBzaW1jb21tb24uaCxtb2QtbGlzdC5oLiAgSW5jbHVkZSBjZ2VuLXNpbS5oLgorCSogbTMyci1zaW0uaDogRG9uJ3QgaW5jbHVkZSBtb2QtbGlzdC5oCisJKFJVTl9GQVNUX1ApOiBEZWxldGUuCisJKiBtMzJyLmM6IERvbid0IGluY2x1ZGUgcHJvZmlsZS5oLiAgI2luY2x1ZGUgYW5zaWRlY2wuaCxjZ2VuLXNpbS5oLAorCXNlbW9wcy5oLG1lbW9yeS5oLHRyYWNlLmgKKwkoaF9jcl9nZXQsaF9jcl9zZXQpOiBOZXcgZnVuY3Rpb25zLgorCSogbWVtb3J5LmM6ICNpbmNsdWRlIGNnZW4tc2ltLmgsY2FsbGJhY2suaC4KKwkqIG9wcy5jOiBEb24ndCBpbmNsdWRlIHByb2ZpbGUuaCxtMzJyLXNpbS5oLgorCUluY2x1ZGUgY2dlbi1zaW0uaCxtZW1vcHMuaCxjcHUtc2ltLmguCisJKE1FTU9QU19ERUZJTkVfSU5MSU5FKTogUmVuYW1lZCBmcm9tIFNJTUZOU19ERUZJTkVfSU5MSU5FLgorCSogdHJhY2UuYzogSW5jbHVkZSBjZ2VuLXNpbS5oLGNwdS1vcGMuaC4KKwkqIHRyYWNlLmggKHRyYWNlX2luc25fe2luaXQsZmluaX0pOiBEZWNsYXJlLgorCisJKiBtb2RlbC5jOiBEb24ndCBpbmNsdWRlIHNpZ25hbC5oLHN0ZGxpYi5oLG0zMnItc2ltLmguCisJSW5jbHVkZSBjZ2VuLXNpbS5oLGNwdS1zaW0uaCxjcHUtb3BjLmguCisJUmVnZW5lcmF0ZSB0byBnZXQgbmV3IGluc24gYWxpYXNlcy4KKworCSogbXJ1bi5jOiAjaW5jbHVkZSAiYW5zaWRlY2wuaCIuCisJKFNUQVRFKTogVXNlIHN0cnVjdCBzaW1fc3RhdGUgaW5zdGVhZC4KKworCSogcHJvZmlsZS5jOiBTdXJyb3VuZCAjaW5jbHVkZSA8c3RkbGliLmg+IHdpdGggSEFWRV9TVERMSUJfSC4KKwlEb24ndCBpbmNsdWRlIHNpbWNvbW1vbi5oLiAgSW5jbHVkZSBjZ2VuLXNpbS5oLGNwdS1vcGMuaC4KKwkoUFJPRklMRV97UkVBRCxXUklURX1fTUFTSyk6IFJlcGxhY2Ugd2l0aCBQUk9GSUxFX01FTU9SWV9NQVNLLgorCShwcm9maWxlX3ByaW50X3NpbWNhY2hlKTogTmV3IGZ1bmN0aW9uLgorCShwcm9maWxlX3ByaW50KTogQ2FsbCBpdC4gIFByaW50IHNpbXVsYXRvciBzcGVlZCBzdGF0cy4KKwkqIHByb2ZpbGUuaCAoUFJPRklMRV97UkVBRCxXUklURX1fTUFTSyk6IFJlcGxhY2Ugd2l0aAorCVBST0ZJTEVfTUVNT1JZX01BU0suCisJKE1PRFVMRV9QUk9GSUxFX1NJTUNBQ0hFX1ApOiBEZWZpbmUuCisJKFBST0ZJTEVfU0lNQ0FDSEVfTUFTSyk6IERlZmluZS4KKwkoUFJPRklMRV9DT1VOVCk6IE5ldyBtZW1iZXJzIHRvdGFsX2luc25fY291bnQsZXhlY190aW1lLgorCU5ldyBtZW1iZXJzIHNpbWNhY2hlX2hpdHMsc2ltY2FjaGVfbWlzc2VzLgorCShQUk9GSUxFX1NJTUNBQ0hFX3tISVRTLE1JU1NFU30pOiBEZWZpbmUuCisJKFBST0ZJTEVfTU9ERUxfUCk6IE5ldyBtYWNyby4KKwkoUFJPRklMRV9DT1VOVF9TSU1DQUNIRV97SElULE1JU1N9KTogTmV3IG1hY3Jvcy4KKworCSogc2ltLWlmLmM6IFN1cnJvdW5kICNpbmNsdWRlIDxzdGRsaWIuaD4gd2l0aCBIQVZFX1NURExJQl9ILgorCURvbid0IGluY2x1ZGUgc2ltY29tbW9uLmgsbTMyci1zaW0uaC4gIEluY2x1ZGUgY2dlbi1zaW0uaCxjcHUtc2ltLmguCisJKHNpbV9yZXN1bWUpOiBVc2UgVVNJTkdfU0lNQ0FDSEVfUCBpbnN0ZWFkIG9mIFJVTl9GQVNUX1AuCisJKHNpbV9pbmZvKTogUGFzcyB2ZXJib3NlIHRvIHByb2ZpbGVfcHJpbnQuCisKKwkqIHNpbWNhY2hlLmM6IEluY2x1ZGUgY2dlbi1zaW0uaCxjYWxsYmFjay5oLgorCShVU0lOR19TSU1DQUNIRV9QKTogUmVwbGFjZSB3aXRoIFNJTUNBQ0hFX1AuCisJKHNpbWNhY2hlX29wdGlvbl9oYW5kbGVyKTogRW5zdXJlIGNhY2hlIHNpemUgYXQgbGVhc3QgMi4KKwlBbGxvdyBjb25maWcgdGltZSBzcGVjaWZpY2F0aW9uIG9mIGRlZmF1bHQgY2FjaGUgc2l6ZS4KKwkqIHNpbWNhY2hlLmggKHN0cnVjdCBzaW1jYWNoZSk6IFN1cHBvcnQgR0NDIGNvbXB1dGVkIGdvdG9zLgorCShTSU1DQUNIRV9ERUZBVUxUX0NBQ0hFX1NJWkUpOiBVU2UgQ09ORklHX1NJTV9DQUNIRV9TSVpFIGlmIGRlZmluZWQuCisJKFVTSU5HX1NJTUNBQ0hFX1ApOiBOZXcgbWFjcm8uCisKKwkqIHNpbWRlZnMuaDogRG9uJ3QgaW5jbHVkZSBtMzJyLW9wYy5oLgorCShDR0VOX01BWF9TSU1fSU5TTlMpOiBEZWZpbmUuCisJKENQVV9TVEFURSk6IFJlZ2VuZXJhdGUuCisJKEFSR0JVRik6IFJlZ2VuZXJhdGUuCisJKGV4dHJhY3Qsc2VtYW50aWMgaGFuZGxlciBkZWNscyk6IERlbGV0ZSwgbW92ZWQgdG8gZGVjb2RlLmguCisKKwkqIHRjb25maWcuaW46IERvbid0IGluY2x1ZGUgY2dlbi1zaW0uaCxtMzJyLXNpbS5oLgorCShVU0VfU0VNX1NXSVRDSCk6IERlZmluZS4KKworCSogdXRpbHMuYzogSW5jbHVkZSBiZmQuaCx0aW1lLmgsc3lzL3Jlc291cmNlLmguCisJKHNpbV90aW1lX2dldCxzaW1fdGltZV9lbGFwc2VkKTogTmV3IGZ1bmN0aW9ucy4KKwkqIGNnZW4tc2ltLmggKFNJTV9USU1FLHNpbV90aW1lX2dldCxzaW1fdGltZV9lbGFwc2VkKTogRGVjbGFyZS4KKworRnJpIEphbiAzMSAyMDoyNTowNiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKEFDX0NIRUNLX0hFQURFUlMpOiBIYW5kbGUgaTM4Ni13aW5kb3dzLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKwkqIG1vZGVsLmM6ICNpbmNsdWRlIDxzdGRsaWIuaD4uCisJKiBzaW1jYWNoZS5jOiAjaW5jbHVkZSAibGliaWJlcnR5LmgiLgorCSogc2ltY29tbW9uLmggKGFsbG9jYSk6IEhhbmRsZSBpMzg2LXdpbmRvd3MuCisKKwkqIGNvbW1vbi5jOiAjaW5jbHVkZSBsaWJpYmVydHkuaC4KKwkoc2ltX3NpZ25hbF90b19ob3N0KTogUmV0dXJuIDUgaWYgd2luZ2RiLgorCitNb24gSmFuIDI3IDE1OjIyOjQ5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKHNpbV9jYWNoZSk6IEVuYWJsZWQgYnkgZGVmYXVsdCBub3csIHBhc3MgZGVmYXVsdAorCWNhY2hlIHNpemUgdG8gLS1lbmFibGUtc2ltLWNhY2hlLgorCSogc2ltY2FjaGUuYyAoc2ltY2FjaGVfb3B0aW9uX2hhbmRsZXIpOiBBbGxvdyAtYyAwLgorCisJKiBzaW1kZWZzLmgsc2ltZm5zLmg6IFJlZ2VuZXJhdGUKKwkqIGRlY29kZS5jLGV4dHJhY3QuYyxtb2RlbC5jLG9wcy5jLHNlbWFudGljcy5jOiBSZWdlbmVyYXRlLgorCitUdWUgSmFuIDIxIDE2OjIxOjAxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgorCisJQWRkIG1vZGVsIHByb2ZpbGluZyBzdXBwb3J0LgorCSogY29uZmlndXJlLmluOiBIYW5kbGUgLS1lbmFibGUtc2ltLW1vZGVsLgorCShzaW1fcHJvZmlsZSk6IEFkZCBtb2RlbC4KKwkqIE1ha2VmaWxlLmluIChtb2RlbC5vKTogQWRkIHJ1bGUuCisJKiBjZ2VuLXNpbS5oIChVTklULElOU05fVElNSU5HLE1BQ0gsTU9ERUwpOiBOZXcgdHlwZXMuCisJKiBleHRyYWN0LmMgKCopOiBBZGQgbW9kZWwgcHJvZmlsaW5nIHN1cHBvcnQuCisJKiBtMzJyLmMgKG1vZGVsX21hcmtfe2dldCxzZXR9X2hfZ3IpOiBOZXcgZnVuY3Rpb25zLgorCShtb2RlbF9tYXJrX3tidXN5LHVuYnVzeX1fcmVnKTogTmV3IGZ1bmN0aW9ucy4KKwkqIHByb2ZpbGUuYyAocHJvZmlsZV9vcHRpb25faGFuZGxlcik6IFJlY29nbml6ZSAtLXByb2ZpbGUgbW9kZWwuCisJKHByb2ZpbGVfcHJpbnRfbW9kZWwpOiBOZXcgZnVuY3Rpb24uCisJKHByb2ZpbGVfcHJpbnQpOiBDYWxsIGl0LgorCSogcHJvZmlsZS5oIChNT0RVTEVfcHJvZmlsZV9tb2RlbCxNT0RVTEVfUFJPRklMRV9NT0RFTF9QKTogRGVmaW5lLgorCShQUk9GSUxFX01PREVMX01BU0ssUFJPRklMRV9MQUJFTF9XSURUSCk6IERlZmluZS4KKwkoUFJPRklMRV9DT1VOVCk6IE5ldyBtZW1iZXJzIGN5Y2xlX2NvdW50LGN0aV9zdGFsbF9jb3VudCwKKwlsb2FkX3N0YWxsX2NvdW50LHRha2VuX2NvdW50LHVudGFrZW5fY291bnQuCisJKiBzZW1hbnRpY3MuYyAoKik6IEFkZCBtb2RlbCBwcm9maWxpbmcgc3VwcG9ydC4KKwkqIHNpbWNvbW1vbi5oIChzdHJ1Y3Qgc2ltX3N0YXRlKTogTmV3IG1lbWJlcnMgbWFjaCxtb2RlbC4KKwkqIHNpbWRlZnMuaCAoQ1BVX1BST0ZJTEUsTU9ERUxfVFlQRSxVTklUX1RZUEUpOiBOZXcgdHlwZS4KKwkoTUFYX01PREVMUyxNQVhfVU5JVFMpOiBEZWZpbmUuCisJKiB0Y29uZmlnLmluIChTVEFURV9FWFRSQV9NRU1CRVJTKTogQWRkIGNwdV9wcm9maWxlLgorCisJKiBNYWtlZmlsZS5pbiAoSU5DTFVERV9ERVBTKTogQWRkICQoU0lNX01PRFVMRVNfSERSUykuCisJKHN0YW1wLW1vZHVsZXMpOiBEZXBlbmQgb24gZ2VubW9kbGlzdC5zaC4KKwkqIGNvbW1vbi5jIChzdGFuZGFyZF9vcHRpb25zKTogQWRkIC0tbWF4LWluc25zLgorCShjb3B5X2FyZ3YpOiBOZXcgZnVuY3Rpb24uCisJKiB0Y29uZmlnLmluIChTSU1fSEFWRV9NQVhfSU5TTlMpOiBEZWZpbmUuCisJKiBnZW5tbG9vcC5zaDogQWxsb3cgbWFpbmxvb3AuaW4gdG8gY29udGFpbiBzdXBwb3J0IGNvZGUuCisJKiBtYWlubG9vcC5pbjogTW92ZSBkb19pbnNuMTYsZG9faW5zbjMyIGhlcmUuCisJKiBtMzJyLmMgKGRvX3RyYXApOiBIYW5kbGUgU1lTX2FyZ3ZsZW4sU1lTX2FyZ3YsU1lTX3JlYWQuCisJKiBzaW0taWYuYyAoc2ltX29wZW4pOiBEb24ndCBzZXQgbWF4IGluc24gY291bnQuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBTYXZlIGFyZ3YsZW52cC4KKwkqIHNpbWNvbW1vbi5oIChzdHJ1Y3Qgc2ltX3N0YXRlKTogTmV3IG1lbWJlcnMgYXJndixlbnZwLgorCSogc2ltZGVmcy5oIChbR1NdRVRUV0ksW0dTXUVUVFVXSSxbR1NdRVRUQUkpOiBEZWZpbmUuCisJKFtHU11FVE1FTVdJLFtHU11FVE1FTVVXSSxbR1NdRVRNRU1BSSk6IERlZmluZS4KKwkoQVJHQlVGKTogTmV3IG1lbWJlcnMgaF9ncl9nZXQsIGhfZ3Jfc2V0LgorCSogdHJhY2UuYyAodHJhY2VfaW5zbl9pbml0LHRyYWNlX2luc25fZmluaSk6IE5ldyBmdW5jdGlvbnMuCisJKHRyYWNlX3ByaW50Zik6IFByaW50IHRvIGJ1ZmZlciwgb3V0cHV0IGxhdGVyIGJ5IHRyYWNlX2luc25fZmluaS4KKwkqIHRyYWNlLmggKFRSQUNFX0lOU05fe0lOSVQsRklOSX0pOiBEZWZpbmUuCisKK1RodSBEZWMgMTkgMTY6MDE6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChBQ19GVU5DX0FMTE9DQSk6IENhbGwuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJKiBjb25maWcuaCAoSEFWRV9BTExPQ0FfSCk6IEFkZC4KKwkqIHNpbWNvbW1vbi5oOiBBZGQgYWxsb2NhIHN1cHBvcnQuCisJKERFQ0xBUkVfTU9EVUxFX0lOU1RBTExfSEFORExFUik6IERlZmluZS4KKwkoREVDTEFSRV9PUFRJT05fSEFORExFUik6IERlZmluZS4KKwkoTUVNX0ZOKTogRGVjbGFyZSB1c2luZyBQQVJBTVMuCisJKERFQ0xBUkVfTUVNX0ZOKTogRGVmaW5lLgorCSogdHJhY2UuYyAodHJhY2VfcmVzdWx0KTogVHdlYWsgZm9yICFTVERDLgorCSogY2dlbi1zaW0uaCAoVURJX0ZOX1NVUFBPUlQpOiBEZWZpbmUgaWYgISBIQVZFX0xPTkdMT05HLgorCSogY2dlbi11dGlscy5pbiAoZGlzYXNtX3NwcmludGYpOiBGaXggdmFfYXJnIGNhbGwgaW4gIVNUREMgY2FzZS4KKwkqIGNvbW1vbi5jIChzaW1fcHJpbnRfaGVscF9mbik6IFVzZSBQQVJBTVMuCisJKHN0YW5kYXJkX29wdGlvbl9oYW5kbGVyKTogRml4IGRlY2wgZm9yICFTVERDIHN5c3RlbXMuCisJKiBtZW1vcnkuYzogI2luY2x1ZGUgPHN0ZGlvLmg+CisJKG1lbV9mbGF0X3tpbnN0YWxsLGluaXQsdW5pbnN0YWxsfSk6IEZpeCBkZWNsIGZvciAhU1REQyBzeXN0ZW1zLgorCShtZW1fZmxhdF97cmVhZCx3cml0ZX0sbWVtX2ZsYXRfb3B0aW9uX2hhbmRsZXIpOiBMaWtld2lzZS4KKwkqIHByb2ZpbGUuYyAocHJvZmlsZV9pbnN0YWxsKTogTGlrZXdpc2UuCisJKHByb2ZpbGVfb3B0aW9uX2hhbmRsZXIpOiBMaWtld2lzZS4KKworVGh1IERlYyAxOSAxMTowNjoxOSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KKworCSogc2VtYW50aWNzLmMgKCopOiBEb24ndCBzdWZmaXggYmlnIHVuc2lnbmVkIG51bWJlcnMgd2l0aCAiVSIuCisJUHJlZml4IHRoZW0gd2l0aCAweCBpbnN0ZWFkLgorCisJKiBjZ2VuLXNpbS5oIChESV9GTl9TVVBQT1JUKTogRGVmaW5lIGlmICEgSEFWRV9MT05HTE9ORy4KKwkoU0xBREksU1JBREksQ09OVlNJREksQ09OVkRJU0kpOiBEZWxldGUsIG1vdmVkIHRvIHNpbWZucy5oLgorCSogc2VtYW50aWNzLmMgKG1hY2hpLG1hY2xvLG1hY3doaSxtYWN3bG8sbXVsaGksbXVsbG8pOiBJbXBsZW1lbnQuCisJKG11bHdoaSxtdWx3bG8sbXZ0YWNoaSxtdnRhY2xvLHJhYyxyYWNoKTogSW1wbGVtZW50LgorCSogc2ltZm5zLmg6IEFkZCBkZWNscyBmb3IgZnVuY3Rpb25hbCBESSxVREksU0YsREYsWEYsVEYgc3VwcG9ydC4KKwlBZGQgc3VwcG9ydCBmb3IgYm9vbGVhbiBhbmQvb3IuCisJKiB1dGlscy5jOiBSZWRvIG5hbWluZyBvZiBESSBmdW5jdGlvbmFsIHN1cHBvcnQuCisJKEFORERJLE9SREksQUREREksTVVMREksR0VESSxMRURJLENPTlZISURJKTogTmV3IGZ1bmN0aW9ucy4KKworVHVlIERlYyAxNyAxMjo1Nzo0OCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KKworCSogRGlyZWN0b3J5IGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9zaW0vbTMyci9NYWtlZmlsZS5pbiBiL3NpbS9tMzJyL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMDA1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbTMyci9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDk1IEBACisjIE1ha2VmaWxlIHRlbXBsYXRlIGZvciBDb25maWd1cmUgZm9yIHRoZSBtMzJyIHNpbXVsYXRvcgorIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMjIENPTU1PTl9QUkVfQ09ORklHX0ZSQUcKKworTTMyUl9PQkpTID0gbTMyci5vIGNwdS5vIGRlY29kZS5vIHNlbS5vIG1vZGVsLm8gbWxvb3AubworCitDT05GSUdfREVWSUNFUyA9IGR2LXNvY2tzZXIubworQ09ORklHX0RFVklDRVMgPQorCitTSU1fT0JKUyA9IFwKKwkkKFNJTV9ORVdfQ09NTU9OX09CSlMpIFwKKwlzaW0tY3B1Lm8gXAorCXNpbS1obG9hZC5vIFwKKwlzaW0taHJ3Lm8gXAorCXNpbS1tb2RlbC5vIFwKKwlzaW0tcmVnLm8gXAorCWNnZW4tdXRpbHMubyBjZ2VuLXRyYWNlLm8gY2dlbi1zY2FjaGUubyBcCisJY2dlbi1ydW4ubyBzaW0tcmVhc29uLm8gc2ltLWVuZ2luZS5vIHNpbS1zdG9wLm8gXAorCXNpbS1pZi5vIGFyY2gubyBcCisJJChNMzJSX09CSlMpIFwKKwl0cmFwcy5vIGRldmljZXMubyBcCisJJChDT05GSUdfREVWSUNFUykKKworIyBFeHRyYSBoZWFkZXJzIGluY2x1ZGVkIGJ5IHNpbS1tYWluLmguCitTSU1fRVhUUkFfREVQUyA9IFwKKwkkKENHRU5fSU5DTFVERV9ERVBTKSBcCisJYXJjaC5oIGNwdWFsbC5oIG0zMnItc2ltLmggJChzcmNkaXIpLy4uLy4uL29wY29kZXMvbTMyci1kZXNjLmgKKworU0lNX0VYVFJBX0NGTEFHUyA9CisKK1NJTV9SVU5fT0JKUyA9IG5ydW4ubworU0lNX0VYVFJBX0NMRUFOID0gbTMyci1jbGVhbgorCisjIFRoaXMgc2VsZWN0cyB0aGUgbTMyciBuZXdsaWIvbGliZ2xvc3Mgc3lzY2FsbCBkZWZpbml0aW9ucy4KK05MX1RBUkdFVCA9IC1ETkxfVEFSR0VUX20zMnIKKworIyMgQ09NTU9OX1BPU1RfQ09ORklHX0ZSQUcKKworYXJjaCA9IG0zMnIKKworc2ltLWlmLm86IHNpbS1pZi5jICQoU0lNX01BSU5fREVQUykgJChzcmNkaXIpLy4uL2NvbW1vbi9zaW0tY29yZS5oCisKK2FyY2gubzogYXJjaC5jICQoU0lNX01BSU5fREVQUykKKwordHJhcHMubzogdHJhcHMuYyB0YXJnLXZhbHMuaCAkKFNJTV9NQUlOX0RFUFMpCitkZXZpY2VzLm86IGRldmljZXMuYyAkKFNJTV9NQUlOX0RFUFMpCisKKyMgTTMyUiBvYmpzCisKK00zMlJCRl9JTkNMVURFX0RFUFMgPSBcCisJJChDR0VOX01BSU5fQ1BVX0RFUFMpIFwKKwljcHUuaCBkZWNvZGUuaCBlbmcuaAorCittMzJyLm86IG0zMnIuYyAkKE0zMlJCRl9JTkNMVURFX0RFUFMpCisKKyMgRklYTUU6IFVzZSBvZiBgbW9ubycgaXMgd2lwLgorbWxvb3AuYyBlbmcuaDogc3RhbXAtbWxvb3AKK3N0YW1wLW1sb29wOiAkKHNyY2RpcikvLi4vY29tbW9uL2dlbm1sb29wLnNoIG1sb29wLmluIE1ha2VmaWxlCisJJChTSEVMTCkgJChzcmNjb20pL2dlbm1sb29wLnNoIFwKKwkJLW1vbm8gLWZhc3QgLXBiYiAtc3dpdGNoIHNlbS1zd2l0Y2guYyBcCisJCS1jcHUgbTMycmJmIC1pbmZpbGUgJChzcmNkaXIpL21sb29wLmluCisJJChTSEVMTCkgJChzcmNyb290KS9tb3ZlLWlmLWNoYW5nZSBlbmcuaGluIGVuZy5oCisJJChTSEVMTCkgJChzcmNyb290KS9tb3ZlLWlmLWNoYW5nZSBtbG9vcC5jaW4gbWxvb3AuYworCXRvdWNoIHN0YW1wLW1sb29wCittbG9vcC5vOiBtbG9vcC5jIHNlbS1zd2l0Y2guYyAkKE0zMlJCRl9JTkNMVURFX0RFUFMpCisKK2NwdS5vOiBjcHUuYyAkKE0zMlJCRl9JTkNMVURFX0RFUFMpCitkZWNvZGUubzogZGVjb2RlLmMgJChNMzJSQkZfSU5DTFVERV9ERVBTKQorc2VtLm86IHNlbS5jICQoTTMyUkJGX0lOQ0xVREVfREVQUykKK21vZGVsLm86IG1vZGVsLmMgJChNMzJSQkZfSU5DTFVERV9ERVBTKQorCisKK20zMnItY2xlYW46CisJcm0gLWYgbWxvb3AuYyBlbmcuaCBzdGFtcC1tbG9vcAorCXJtIC1mIHRtcC0qCisKKwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvUkVBRE1FIGIvc2ltL20zMnIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYzNmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbTMyci9SRUFETUUKQEAgLTAsMCArMSwxNCBAQAorVGhpcyBpcyB0aGUgbTMyciBzaW11bGF0b3IgZGlyZWN0b3J5LgorCitJdCBpcyBzdGlsbCB3b3JrLWluLXByb2dyZXNzLiAgVGhlIGN1cnJlbnQgc291cmNlcyBhcmUgcmVhc29uYWJseQord2VsbCB0ZXN0ZWQgYW5kIGxvdHMgb2YgZmVhdHVyZXMgYXJlIGluLiAgSG93ZXZlciwgdGhlcmUncyBsb3RzCittb3JlIHlldCB0byBjb21lLgorCitUaGVyZSBhcmUgbG90cyBvZiBtYWNoaW5lIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSEKK1RoZXkgYXJlIG9ubHkgZ2VuZXJhdGVkIGlmIHlvdSBjb25maWd1cmUgd2l0aCAtLWVuYWJsZS1jZ2VuLW1haW50LAorc2ltaWxhciBpbiBiZWhhdmlvdXIgdG8gTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZSB1bmRlciBhdXRvbWFrZS9hdXRvY29uZi4KKworRm9yIGRldGFpbHMgb24gdGhlIGdlbmVyYXRvciwgc2VlIC4uLy4uL2NnZW4uCisKK2Rldm8vY2dlbiBpc24ndCBwYXJ0IG9mIHRoZSBjb21wLXRvb2xzIG1vZHVsZSB5ZXQuCitZb3UnbGwgbmVlZCB0byBjaGVjayBpdCBvdXQgbWFudWFsbHkgKGFsc28gYWtpbiB0byBhdXRvbWFrZS9hdXRvY29uZikuCmRpZmYgLS1naXQgYS9zaW0vbTMyci9UT0RPIGIvc2ltL20zMnIvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjNkYWFjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL20zMnIvVE9ETwpAQCAtMCwwICsxLDkgQEAKKy0gaGVhZGVyIGZpbGUgZGVwZW5kZW5jaWVzIHJldmlzaXQKKy0gaG9va3MgY2xlYW51cAorLSB0ZXN0c3VpdGVzCistIEZJWE1FJ3MKKy0gbWVtb3J5IGFjY2Vzc2VzIHN0aWxsIHRlc3QgaWYgcHJvZmlsaW5nIGlzIG9uIGV2ZW4gaW4gZmFzdCBtb2RlCistIGZpbGwgbm9wIGNvdW50aW5nIGRvbmUgZXZlbiBpbiBmYXN0IG1vZGUKKy0gaGF2ZSBzZW1hbnRpYyBjb2RlIHVzZSBHL1NFVF9IX0ZPTyBpZiBub3QgZGVmYXVsdCBbaW5jbCBmdW4tYWNjZXNzXQorLSBoYXZlIEcvU0VUX0hfRk9PIG1hY3JvcyBjYWxsIGZ1bmN0aW9uIGlmIGZ1bi1hY2Nlc3MKKy0gLS0+IGNhbiBhbHdheXMgdXNlIEcvU19IX0ZPTyBtYWNyb3MKZGlmZiAtLWdpdCBhL3NpbS9tMzJyL2FjY29uZmlnLmggYi9zaW0vbTMyci9hY2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Yjg3YTEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbTMyci9hY2NvbmZpZy5oCkBAIC0wLDAgKzEsMTUgQEAKKworLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCisjdW5kZWYgRU5BQkxFX05MUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCisjdW5kZWYgSEFWRV9DQVRHRVRTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0dFVFRFWFQKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCisjdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvYXJjaC5jIGIvc2ltL20zMnIvYXJjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYWEzMDAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbTMyci9hcmNoLmMKQEAgLTAsMCArMSwzNTYgQEAKKy8qIFNpbXVsYXRvciBzdXBwb3J0IGZvciBtMzJyLgorCitUSElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgorCitDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisqLworCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJiZmQuaCIKKworY29uc3QgTUFDSCAqc2ltX21hY2hzW10gPQoreworI2lmZGVmIEhBVkVfQ1BVX00zMlJCRgorICAmIG0zMnJfbWFjaCwKKyNlbmRpZgorICAwCit9OworCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtcGMuICAqLworCitVU0kKK2FfbTMycl9oX3BjX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX00zMlJCRgorICAgIGNhc2UgYmZkX21hY2hfbTMyciA6IAorICAgICAgcmV0dXJuIG0zMnJiZl9oX3BjX2dldCAoY3VycmVudF9jcHUpOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLXBjLiAgKi8KKwordm9pZAorYV9tMzJyX2hfcGNfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVVNJIG5ld3ZhbCkKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfTTMyUkJGCisgICAgY2FzZSBiZmRfbWFjaF9tMzJyIDogCisgICAgICBtMzJyYmZfaF9wY19zZXQgKGN1cnJlbnRfY3B1LCBuZXd2YWwpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWdyLiAgKi8KKworU0kKK2FfbTMycl9oX2dyX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVJTlQgcmVnbm8pCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX00zMlJCRgorICAgIGNhc2UgYmZkX21hY2hfbTMyciA6IAorICAgICAgcmV0dXJuIG0zMnJiZl9oX2dyX2dldCAoY3VycmVudF9jcHUsIHJlZ25vKTsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC1nci4gICovCisKK3ZvaWQKK2FfbTMycl9oX2dyX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVJTlQgcmVnbm8sIFNJIG5ld3ZhbCkKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfTTMyUkJGCisgICAgY2FzZSBiZmRfbWFjaF9tMzJyIDogCisgICAgICBtMzJyYmZfaF9ncl9zZXQgKGN1cnJlbnRfY3B1LCByZWdubywgbmV3dmFsKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1jci4gICovCisKK1VTSQorYV9tMzJyX2hfY3JfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubykKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfTTMyUkJGCisgICAgY2FzZSBiZmRfbWFjaF9tMzJyIDogCisgICAgICByZXR1cm4gbTMycmJmX2hfY3JfZ2V0IChjdXJyZW50X2NwdSwgcmVnbm8pOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLWNyLiAgKi8KKwordm9pZAorYV9tMzJyX2hfY3Jfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubywgVVNJIG5ld3ZhbCkKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfTTMyUkJGCisgICAgY2FzZSBiZmRfbWFjaF9tMzJyIDogCisgICAgICBtMzJyYmZfaF9jcl9zZXQgKGN1cnJlbnRfY3B1LCByZWdubywgbmV3dmFsKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1hY2N1bS4gICovCisKK0RJCithX20zMnJfaF9hY2N1bV9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9NMzJSQkYKKyAgICBjYXNlIGJmZF9tYWNoX20zMnIgOiAKKyAgICAgIHJldHVybiBtMzJyYmZfaF9hY2N1bV9nZXQgKGN1cnJlbnRfY3B1KTsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC1hY2N1bS4gICovCisKK3ZvaWQKK2FfbTMycl9oX2FjY3VtX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIERJIG5ld3ZhbCkKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfTTMyUkJGCisgICAgY2FzZSBiZmRfbWFjaF9tMzJyIDogCisgICAgICBtMzJyYmZfaF9hY2N1bV9zZXQgKGN1cnJlbnRfY3B1LCBuZXd2YWwpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWFjY3Vtcy4gICovCisKK0RJCithX20zMnJfaF9hY2N1bXNfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubykKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLWFjY3Vtcy4gICovCisKK3ZvaWQKK2FfbTMycl9oX2FjY3Vtc19zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vLCBESSBuZXd2YWwpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtY29uZC4gICovCisKK0JJCithX20zMnJfaF9jb25kX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX00zMlJCRgorICAgIGNhc2UgYmZkX21hY2hfbTMyciA6IAorICAgICAgcmV0dXJuIG0zMnJiZl9oX2NvbmRfZ2V0IChjdXJyZW50X2NwdSk7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtY29uZC4gICovCisKK3ZvaWQKK2FfbTMycl9oX2NvbmRfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgQkkgbmV3dmFsKQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9NMzJSQkYKKyAgICBjYXNlIGJmZF9tYWNoX20zMnIgOiAKKyAgICAgIG0zMnJiZl9oX2NvbmRfc2V0IChjdXJyZW50X2NwdSwgbmV3dmFsKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1wc3cuICAqLworCitVUUkKK2FfbTMycl9oX3Bzd19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9NMzJSQkYKKyAgICBjYXNlIGJmZF9tYWNoX20zMnIgOiAKKyAgICAgIHJldHVybiBtMzJyYmZfaF9wc3dfZ2V0IChjdXJyZW50X2NwdSk7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtcHN3LiAgKi8KKwordm9pZAorYV9tMzJyX2hfcHN3X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVRSSBuZXd2YWwpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX00zMlJCRgorICAgIGNhc2UgYmZkX21hY2hfbTMyciA6IAorICAgICAgbTMycmJmX2hfcHN3X3NldCAoY3VycmVudF9jcHUsIG5ld3ZhbCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtYnBzdy4gICovCisKK1VRSQorYV9tMzJyX2hfYnBzd19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9NMzJSQkYKKyAgICBjYXNlIGJmZF9tYWNoX20zMnIgOiAKKyAgICAgIHJldHVybiBtMzJyYmZfaF9icHN3X2dldCAoY3VycmVudF9jcHUpOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLWJwc3cuICAqLworCit2b2lkCithX20zMnJfaF9icHN3X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVRSSBuZXd2YWwpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX00zMlJCRgorICAgIGNhc2UgYmZkX21hY2hfbTMyciA6IAorICAgICAgbTMycmJmX2hfYnBzd19zZXQgKGN1cnJlbnRfY3B1LCBuZXd2YWwpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKworLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWJicHN3LiAgKi8KKworVVFJCithX20zMnJfaF9iYnBzd19nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICBzd2l0Y2ggKFNUQVRFX0FSQ0hJVEVDVFVSRSAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpLT5tYWNoKQorICAgIHsKKyNpZmRlZiBIQVZFX0NQVV9NMzJSQkYKKyAgICBjYXNlIGJmZF9tYWNoX20zMnIgOiAKKyAgICAgIHJldHVybiBtMzJyYmZfaF9iYnBzd19nZXQgKGN1cnJlbnRfY3B1KTsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC1iYnBzdy4gICovCisKK3ZvaWQKK2FfbTMycl9oX2JicHN3X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVRSSBuZXd2YWwpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX00zMlJCRgorICAgIGNhc2UgYmZkX21hY2hfbTMyciA6IAorICAgICAgbTMycmJmX2hfYmJwc3dfc2V0IChjdXJyZW50X2NwdSwgbmV3dmFsKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdCA6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1sb2NrLiAgKi8KKworQkkKK2FfbTMycl9oX2xvY2tfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKK3sKKyAgc3dpdGNoIChTVEFURV9BUkNISVRFQ1RVUkUgKENQVV9TVEFURSAoY3VycmVudF9jcHUpKS0+bWFjaCkKKyAgICB7CisjaWZkZWYgSEFWRV9DUFVfTTMyUkJGCisgICAgY2FzZSBiZmRfbWFjaF9tMzJyIDogCisgICAgICByZXR1cm4gbTMycmJmX2hfbG9ja19nZXQgKGN1cnJlbnRfY3B1KTsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC1sb2NrLiAgKi8KKwordm9pZAorYV9tMzJyX2hfbG9ja19zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBCSSBuZXd2YWwpCit7CisgIHN3aXRjaCAoU1RBVEVfQVJDSElURUNUVVJFIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSktPm1hY2gpCisgICAgeworI2lmZGVmIEhBVkVfQ1BVX00zMlJCRgorICAgIGNhc2UgYmZkX21hY2hfbTMyciA6IAorICAgICAgbTMycmJmX2hfbG9ja19zZXQgKGN1cnJlbnRfY3B1LCBuZXd2YWwpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0IDoKKyAgICAgIGFib3J0ICgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvYXJjaC5oIGIvc2ltL20zMnIvYXJjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZTgxMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbTMyci9hcmNoLmgKQEAgLTAsMCArMSw2OSBAQAorLyogU2ltdWxhdG9yIGhlYWRlciBmb3IgbTMyci4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2lmbmRlZiBNMzJSX0FSQ0hfSAorI2RlZmluZSBNMzJSX0FSQ0hfSAorCisjZGVmaW5lIFRBUkdFVF9CSUdfRU5ESUFOIDEKKworLyogQ292ZXIgZm5zIGZvciByZWdpc3RlciBhY2Nlc3MuICAqLworVVNJIGFfbTMycl9oX3BjX2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgYV9tMzJyX2hfcGNfc2V0IChTSU1fQ1BVICosIFVTSSk7CitTSSBhX20zMnJfaF9ncl9nZXQgKFNJTV9DUFUgKiwgVUlOVCk7Cit2b2lkIGFfbTMycl9oX2dyX3NldCAoU0lNX0NQVSAqLCBVSU5ULCBTSSk7CitVU0kgYV9tMzJyX2hfY3JfZ2V0IChTSU1fQ1BVICosIFVJTlQpOwordm9pZCBhX20zMnJfaF9jcl9zZXQgKFNJTV9DUFUgKiwgVUlOVCwgVVNJKTsKK0RJIGFfbTMycl9oX2FjY3VtX2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgYV9tMzJyX2hfYWNjdW1fc2V0IChTSU1fQ1BVICosIERJKTsKK0RJIGFfbTMycl9oX2FjY3Vtc19nZXQgKFNJTV9DUFUgKiwgVUlOVCk7Cit2b2lkIGFfbTMycl9oX2FjY3Vtc19zZXQgKFNJTV9DUFUgKiwgVUlOVCwgREkpOworQkkgYV9tMzJyX2hfY29uZF9nZXQgKFNJTV9DUFUgKik7Cit2b2lkIGFfbTMycl9oX2NvbmRfc2V0IChTSU1fQ1BVICosIEJJKTsKK1VRSSBhX20zMnJfaF9wc3dfZ2V0IChTSU1fQ1BVICopOwordm9pZCBhX20zMnJfaF9wc3dfc2V0IChTSU1fQ1BVICosIFVRSSk7CitVUUkgYV9tMzJyX2hfYnBzd19nZXQgKFNJTV9DUFUgKik7Cit2b2lkIGFfbTMycl9oX2Jwc3dfc2V0IChTSU1fQ1BVICosIFVRSSk7CitVUUkgYV9tMzJyX2hfYmJwc3dfZ2V0IChTSU1fQ1BVICopOwordm9pZCBhX20zMnJfaF9iYnBzd19zZXQgKFNJTV9DUFUgKiwgVVFJKTsKK0JJIGFfbTMycl9oX2xvY2tfZ2V0IChTSU1fQ1BVICopOwordm9pZCBhX20zMnJfaF9sb2NrX3NldCAoU0lNX0NQVSAqLCBCSSk7CisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG1vZGVsIHR5cGVzLiAgKi8KK3R5cGVkZWYgZW51bSBtb2RlbF90eXBlIHsKKyAgTU9ERUxfTTMyUl9ELCBNT0RFTF9URVNUCisgLCBNT0RFTF9NQVgKK30gTU9ERUxfVFlQRTsKKworI2RlZmluZSBNQVhfTU9ERUxTICgoaW50KSBNT0RFTF9NQVgpCisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIHVuaXQgdHlwZXMuICAqLwordHlwZWRlZiBlbnVtIHVuaXRfdHlwZSB7CisgIFVOSVRfTk9ORSwgVU5JVF9NMzJSX0RfVV9TVE9SRSwgVU5JVF9NMzJSX0RfVV9MT0FELCBVTklUX00zMlJfRF9VX0NUSQorICwgVU5JVF9NMzJSX0RfVV9NQUMsIFVOSVRfTTMyUl9EX1VfQ01QLCBVTklUX00zMlJfRF9VX0VYRUMsIFVOSVRfVEVTVF9VX0VYRUMKKyAsIFVOSVRfTUFYCit9IFVOSVRfVFlQRTsKKworI2RlZmluZSBNQVhfVU5JVFMgKDIpCisKKyNlbmRpZiAvKiBNMzJSX0FSQ0hfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvY29uZmlnLmluIGIvc2ltL20zMnIvY29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MjNiODYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbTMyci9jb25maWcuaW4KQEAgLTAsMCArMSwxNjIgQEAKKy8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLworCisvKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLworI3VuZGVmIENfQUxMT0NBCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KKyN1bmRlZiBjb25zdAorCisvKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCisgICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLworI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLworI3VuZGVmIEhBVkVfQUxMT0NBCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLworI3VuZGVmIEhBVkVfQUxMT0NBX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLworI3VuZGVmIEhBVkVfTU1BUAorCisvKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLworI3VuZGVmIGlubGluZQorCisvKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIG9mZl90CisKKy8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLworI3VuZGVmIF9QT1NJWF9TT1VSQ0UKKworLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGludCBvciB2b2lkKS4gICovCisjdW5kZWYgUkVUU0lHVFlQRQorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBzaXplX3QKKworLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCisgICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKKyAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KKyBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCisgU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCisgU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KKyAqLworI3VuZGVmIFNUQUNLX0RJUkVDVElPTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLworI3VuZGVmIFNURENfSEVBREVSUworCisvKiBEZWZpbmUgaWYgeW91ciBwcm9jZXNzb3Igc3RvcmVzIHdvcmRzIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQKKyAgIGJ5dGUgZmlyc3QgKGxpa2UgTW90b3JvbGEgYW5kIFNQQVJDLCB1bmxpa2UgSW50ZWwgYW5kIFZBWCkuICAqLworI3VuZGVmIFdPUkRTX0JJR0VORElBTgorCisvKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KKyN1bmRlZiBFTkFCTEVfTkxTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0dFVFRFWFQKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCisjdW5kZWYgSEFWRV9MQ19NRVNTQUdFUworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fc2V0ZnB1Y3cgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19TRVRGUFVDVworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9EQ0dFVFRFWFQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUQ1dECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUlVTQUdFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX01VTk1BUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9QVVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VURU5WCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NFVExPQ0FMRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ2FjdGlvbiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TSUdBQ1RJT04KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDQVNFQ01QCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUkNIUgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRpbWUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfVElNRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0FSR1pfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9GQ05UTF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZwdV9jb250cm9sLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZQVV9DT05UUk9MX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xJTUlUU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9MT0NBTEVfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTUFMTE9DX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RETElCX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NUUklOR19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1RJTUVfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVU5JU1REX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1ZBTFVFU19ICmRpZmYgLS1naXQgYS9zaW0vbTMyci9jb25maWd1cmUgYi9zaW0vbTMyci9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDFmZGI5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tMzJyL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDQyNTEgQEAKKyMhIC9iaW4vc2gKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIgorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQorIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgorCisjIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAzCisKKworCisKKworIyBTZWFyY2ggcGF0aCBmb3IgYSBwcm9ncmFtIHdoaWNoIHBhc3NlcyB0aGUgZ2l2ZW4gdGVzdC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDEKKworCisKKyMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDEKKworCisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgQ3lnd2luMzIsIHdpdGhvdXQgdXNpbmcKKyMgQUNfQ0FOT05JQ0FMXyouICBJZiBzbywgc2V0IG91dHB1dCB2YXJpYWJsZSBDWUdXSU4zMiB0byAieWVzIi4KKyMgT3RoZXJ3aXNlIHNldCBpdCB0byAibm8iLgorCisKKworIyBDaGVjayB0byBzZWUgaWYgd2UncmUgcnVubmluZyB1bmRlciBXaW4zMiwgd2l0aG91dCB1c2luZworIyBBQ19DQU5PTklDQUxfKi4gIElmIHNvLCBzZXQgb3V0cHV0IHZhcmlhYmxlIEVYRUVYVCB0byAiLmV4ZSIuCisjIE90aGVyd2lzZSBzZXQgaXQgdG8gIiIuCisKKworCisKKworCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZW5kaWFuPWVuZGlhbgkJU3BlY2lmeSB0YXJnZXQgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWFsaWdubWVudD1hbGlnbgkJU3BlY2lmeSBzdHJpY3QsICBub25zdHJpY3Qgb3IgZm9yY2VkIGFsaWdubWVudCBvZiBtZW1vcnkgYWNjZXNzZXMuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW49ZW5kCQlTcGVjaWZ5IGhvc3QgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLXNjYWNoZT1zaXplCQlTcGVjaWZ5IHNpbXVsYXRvciBleGVjdXRpb24gY2FjaGUgc2l6ZS4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZGVmYXVsdC1tb2RlbD1tb2RlbAlTcGVjaWZ5IGRlZmF1bHQgbW9kZWwgdG8gc2ltdWxhdGUuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWVudmlyb25tZW50PWVudmlyb25tZW50CVNwZWNpZnkgbWl4ZWQsIHVzZXIsIHZpcnR1YWwgb3Igb3BlcmF0aW5nIGVudmlyb25tZW50LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1pbmxpbmU9aW5saW5lcwkJU3BlY2lmeSB3aGljaCBmdW5jdGlvbnMgc2hvdWxkIGJlIGlubGluZWQuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtY2dlbi1tYWludFs9RElSXSAgICBidWlsZCBjZ2VuIGdlbmVyYXRlZCBmaWxlcyIKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2J1aWxkPU5PTkUKK2NhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2V4ZWNfcHJlZml4PU5PTkUKK2hvc3Q9Tk9ORQorbm9fY3JlYXRlPQorbm9ub3B0PU5PTkUKK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3RhcmdldD1OT05FCit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorc3ViZGlycz0KK01GTEFHUz0gTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT1NYWtlZmlsZS5pbgorCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2FjX2V4ZWV4dD0KK2FjX29iamV4dD1vCitpZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KKyAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKyAgICBhY19uPSBhY19jPScKKycgYWNfdD0nCScKKyAgZWxzZQorICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKyAgZmkKK2Vsc2UKKyAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CitmaQorCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY5NTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAorICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgorICBDUFA9IiR7Q0MtY2N9IC1FIgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3MTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjcxNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzI3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MzM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDc0NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NzUwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPS9saWIvY3BwCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKKyAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCitlbHNlCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKK2VjaG8gIiRhY190IiIkQ1BQIiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc3NTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1CitzZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgorYWxsOgorCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCitFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCitpZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcworZWxzZQorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0bWFrZQorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgU0VUX01BS0U9CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODAyOiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1CitpZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKKyAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQordGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKK0VPRgorCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0M9IiRDQyAtcG9zaXgiCisgIGVsc2UKKyAgICBDQz0iJENDIC1YcCIKKyAgZmkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgIElTQz0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4MjM6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDgyOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODM2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDg1MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4NzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODkyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCitpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOworZXhpdCAoMCk7IH0KKworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjkwMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICA6CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBTVERDX0hFQURFUlMgMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5Mjc6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgOTMyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKy8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCit0eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7CisvKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLworY2hhciBjb25zdCAqY29uc3QgKmNjcDsKK2NoYXIgKipwOworLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3N0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKK3N0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OworLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgorICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCisgICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLworY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOworY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOworLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KKysrY2NwOworcCA9IChjaGFyKiopIGNjcDsKK2NjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOworeyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgY2hhciAqdDsKKyAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKKworICAqdCsrID0gMDsKK30KK3sgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCisgIGludCB4W10gPSB7MjUsIDE3fTsKKyAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKKyAgKytmb287Cit9Cit7IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KKyAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7CisgIGlwdHIgcCA9IDA7CisgICsrcDsKK30KK3sgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZworICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCisgIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07CisgIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKK30KK3sgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCisgIGNvbnN0IGludCBmb28gPSAxMDsKK30KKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk4MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBjb25zdCAKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDAyOiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX2N2X2NfaW5saW5lPW5vCitmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwMDkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK30gJGFjX2t3IGZvbygpIHsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDE2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhaworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2RvbmUKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgorY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgorICBpbmxpbmUgfCB5ZXMpIDs7CisgIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgaW5saW5lIAorRU9GCisgOzsKKyAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKK0VPRgorIDs7Citlc2FjCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA0MjogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA0NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAib2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBvZmZfdCBsb25nCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA3NTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDgwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCitFT0YKKworZmkKKworIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKKyMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTExMDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExMTUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFsbG9jYS5oPgoraW50IG1haW4oKSB7CitjaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEyMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExNDM6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTE0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBIQVZFX0FMTE9DQV9ICisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLworY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKK2ludCBtYWluKCkgeworY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTc2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQSAxCitFT0YKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgorICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucworICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKKyAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCisgICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgorICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgQ19BTExPQ0EgMQorRU9GCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIwODogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyMTMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQord2ViZWNyYXkKKyNlbHNlCit3ZW5vdGJlY3JheQorI2VuZGlmCisKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KK2ZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjM4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjQzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKK0VPRgorCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZG9uZQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTI5MzogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzMDEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorZmluZF9zdGFja19kaXJlY3Rpb24gKCkKK3sKKyAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOworICBhdXRvIGNoYXIgZHVtbXk7CisgIGlmIChhZGRyID09IDApCisgICAgeworICAgICAgYWRkciA9ICZkdW1teTsKKyAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOworfQorbWFpbiAoKQoreworICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMyMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgorRU9GCisKK2ZpCisKK2ZvciBhY19oZHIgaW4gdW5pc3RkLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzQ1OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM1MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTM1NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzg0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMzg5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0Mzc6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE0NDUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisvKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KKyAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgorCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKwltbWFwIHNoYXJlZCBub3QgZml4ZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisgICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQorICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAorICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5CisgICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCisgICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKKyAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCisgICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAorICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCisKKyAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KKyAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6CisgICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKKyAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKy8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KKyNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQorIyBpZmRlZiBIQVZFX1VOSVNURF9ICisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgZW5kaWYKKworLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KKyMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKKyMgZW5kaWYKKworIyBpZmRlZiBfU0NfUEFHRVNJWkUKKyMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQorIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLworIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKKyMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQorIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgICBpZmRlZiBOQlBHCisjICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCisjICAgICBpZm5kZWYgQ0xTSVpFCisjICAgICAgZGVmaW5lIENMU0laRSAxCisjICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KKyMgICAgZWxzZSAvKiBubyBOQlBHICovCisjICAgICBpZmRlZiBOQlBDCisjICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQworIyAgICAgZWxzZSAvKiBubyBOQlBDICovCisjICAgICAgaWZkZWYgUEFHRVNJWkUKKyMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKKyMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLworIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLworIyAgICBlbmRpZiAvKiBubyBOQlBHICovCisjICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KKyMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCisKKyNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KKyNlbHNlCitjaGFyICptYWxsb2MoKTsKKyNlbmRpZgorCitpbnQKK21haW4oKQoreworCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOworCWludCBpLCBwYWdlc2l6ZTsKKwlpbnQgZmQ7CisKKwlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisKKwkvKgorCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KKwkgKi8KKwlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YSArIGkpID0gcmFuZCgpOworCXVtYXNrKDApOworCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCisJLyoKKwkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKKwkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCisJICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KKwkgKi8KKwlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgxKTsKKwlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOworCWlmICghZGF0YTIpCisJCWV4aXQoMSk7CisJZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOworCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCisJCQlleGl0KDEpOworCisJLyoKKwkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQorCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KKwkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKKwlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhMykKKwkJZXhpdCgxKTsKKwlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKKwkJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCXVubGluaygiY29uZnRlc3RtbWFwIik7CisJZXhpdCgwKTsKK30KKworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1ODU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9NTUFQIDEKK0VPRgorCitmaQorCisKKyMgYXV0b2NvbmYuaW5mbyBzYXlzIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCByaWdodCBhZnRlciBBQ19JTklULgorCisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY1ODogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisKK2hvc3RfYWxpYXM9JGhvc3QKK2Nhc2UgIiRob3N0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpCisgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpIDs7CisgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2hvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAoraG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjc5OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorCit0YXJnZXRfYWxpYXM9JHRhcmdldAorY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCit0YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCit0YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjk3OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9CitlbHNlCisgICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KKyAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAorcyxcXCxcXFxcLGc7IHMsXCQsJCQsZworRU9GX1NFRAorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgorICBybSAtZiBjb25mdGVzdHNlZAorZmkKK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorCisjIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCit0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTc0MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTc3MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19wcm9nX3JlamVjdGVkPW5vCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworCWNvbnRpbnVlCisgICAgICBmaQorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KKyAgICAqd2luMzIqIHwgKldJTjMyKikKKyAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4MjA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4NTE6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE4NjEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorbWFpbigpe3JldHVybigwKTt9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg2NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCisgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKyAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubworICBlbHNlCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKKyAgZmkKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4ODU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgorY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODkwOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19HTlVDX18KKyAgeWVzOworI2VuZGlmCitFT0YKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODk5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5MTg6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCitpZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBhY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTk2MTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCisgICAgY2FzZSAiJGFjX2Rpci8iIGluCisgICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7CisgICAgKikKKyAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAgICMgYnkgZGVmYXVsdC4KKyAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbHNlCisJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKKwkgICAgYnJlYWsgMgorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9JRlMiCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKyAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCisgICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCisgIGZpCitmaQorZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKKworIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgoraWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KKyAgQ0NfRk9SX0JVSUxEPSckKENDKScKK2Vsc2UKKyAgQ0NfRk9SX0JVSUxEPWdjYworZmkKKworCisKKworQVI9JHtBUi1hcn0KKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDI3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgorZmkKK2ZpCitSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCitBTExfTElOR1VBUz0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCit1bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwNjE6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMDY2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDcxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCitfX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjEwMTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjEwNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTI5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KKyAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMTU4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMTYzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxODY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgIGZpCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgorICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TVFBDUFkgMQorRU9GCisKKyAgIGZpCisKKyAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjIyMDogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMjI1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsb2NhbGUuaD4KK2ludCBtYWluKCkgeworcmV0dXJuIExDX01FU1NBR0VTCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2CisgICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCisgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCitFT0YKKworICAgIGZpCisgIGZpCisgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyNTM6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1CisgICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKKyAgVVNFX05MUz0kZW5hYmxldmFsCitlbHNlCisgIFVTRV9OTFM9eWVzCitmaQorCisgICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2CisgICAgCisKKyAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubworCisgICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgRU5BQkxFX05MUyAxCitFT0YKKworICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjI3MzogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1CisgICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAorZWxzZQorICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCitmaQorCisgICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKKworICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQorCW5sc19jdl9oZWFkZXJfbGliZ3Q9CisJQ0FUT0JKRVhUPU5PTkUKKworCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjkyOiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMjk3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMDI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzE5OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzMjQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpYmludGwuaD4KK2ludCBtYWluKCkgeworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMzE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgorCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjM0NzogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1CithY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxpbnRsICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzNTUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBiaW5kdGV4dGRvbWFpbigpOworCitpbnQgbWFpbigpIHsKK2JpbmR0ZXh0ZG9tYWluKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzY2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzgyOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzODcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzk0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJICAgZmkKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCisJICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCisJICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfR0VUVEVYVCAxCitFT0YKKworCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQyMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KKwlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKKyAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKwkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCisJCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQ1NjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjQ2MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDg0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTExOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRHTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgID86LyopCQkJIAorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgorICA7OworZXNhYworZmkKK0dNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCitpZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTQ2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkWEdFVFRFWFQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKKyAgOzsKK2VzYWMKK2ZpCitYR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCitpZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI1NzggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKKwkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1ODY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0uZ21vCisJCSAgIERBVEFESVJOQU1FPXNoYXJlCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0ubW8KKwkJICAgREFUQURJUk5BTUU9bGliCitmaQorcm0gLWYgY29uZnRlc3QqCisJCUlOU1RPQkpFWFQ9Lm1vCisJICAgICAgZmkKKwkgICAgZmkKKwkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKwkgICAgICAgIAorICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgorCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNjE4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKKyAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjY1MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjY4NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAKKwlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICAgICAgQ0FUT0JKRVhUPS5nbW8KKyAgICAgICAgSU5TVE9CSkVYVD0ubW8KKyAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKKwlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJworCUlOVExMSUJTPSRJTlRMREVQUworCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAorICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCisgICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgorCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgorCSAgOiA7CisJZWxzZQorCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgorCSAgWEdFVFRFWFQ9IjoiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgorICAgICAgUE9TVUI9cG8KKyAgICBlbHNlCisgICAgICBEQVRBRElSTkFNRT1zaGFyZQorICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKKyAgICBmaQorCisgICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJworICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCisgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgorICAgICAgVVNFX05MUz15ZXMKKyAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgIGZpCisKKyAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKKyAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgorICAgIGRvbmUKKworICAgICAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgCisKKyAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KKyAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KKyAgICAgICBMSU5HVUFTPQorICAgICBlbHNlCisgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjc3NzogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1CisgICAgICAgTkVXX0xJTkdVQVM9CisgICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCisgICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCisgICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKKyAgICAgICAgIGVzYWMKKyAgICAgICBkb25lCisgICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKKyAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKKyAgICAgZmkKKworICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgorICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKKyAgICAgZmkKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgorICAgZWxzZQorICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCisvKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCisgICBmaQorICAgCisKKyAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgorCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjgwNTogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjgxMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODE1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgbXNnZm9ybWF0PWxpbnV4CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorbXNnZm9ybWF0PXhvcGVuCitmaQorCisKKwkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKKyAgICAgIGZpCisgICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKKwkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAorICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCisgICAgIEdUX05PPSIjTk8jIgorICAgICBHVF9ZRVM9CisgICBlbHNlCisgICAgIEdUX05PPQorICAgICBHVF9ZRVM9IiNZRVMjIgorICAgZmkKKyAgIAorICAgCisKKyAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKKyAgIAorCisgICAgICBsPQorICAgCisKKyAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgorICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbworICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KKwkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KKwkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgorCSBlbHNlCisJICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKKwkgZmkKKyAgICAgIGVsc2UKKwkgcG9zcmNwcmVmaXg9Ii4uLyIKKyAgICAgIGZpCisgICAgICBybSAtZiBwby9QT1RGSUxFUworICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCisJIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCisgICBmaQorICAKKworIyBDaGVjayBmb3IgY29tbW9uIGhlYWRlcnMuCisjIEZJWE1FOiBTZWVtcyB0byBtZSB0aGlzIGNhbiBjYXVzZSBwcm9ibGVtcyBmb3IgaTM4Ni13aW5kb3dzIGhvc3RzLgorIyBBdCBvbmUgcG9pbnQgdGhlcmUgd2VyZSBoYXJkY29kZWQgQUNfREVGSU5FJ3MgaWYgJHtob3N0fSA9IGkzODYtKi13aW5kb3dzKi4KK2ZvciBhY19oZHIgaW4gc3RkbGliLmggc3RyaW5nLmggc3RyaW5ncy5oIHVuaXN0ZC5oIHRpbWUuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI4ODQ6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyODg5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODk0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2hkciBpbiBzeXMvdGltZS5oIHN5cy9yZXNvdXJjZS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjkyNDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI5MjkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI5MzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfaGRyIGluIGZjbnRsLmggZnB1X2NvbnRyb2wuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5NjQ6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTY5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTc0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2hkciBpbiBkbGZjbi5oIGVycm5vLmggc3lzL3N0YXQuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMwMDQ6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDA5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDE0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2Z1bmMgaW4gZ2V0cnVzYWdlIHRpbWUgc2lnYWN0aW9uIF9fc2V0ZnB1Y3cKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMwNDM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMwNDggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA3MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisjIENoZWNrIGZvciBzb2NrZXQgbGlicmFyaWVzCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZCBpbiAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzA5ODogY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiID4mNQorYWNfbGliX3Zhcj1gZWNobyBzb2NrZXQnXydiaW5kIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbHNvY2tldCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMTA2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgYmluZCgpOworCitpbnQgbWFpbigpIHsKK2JpbmQoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gc29ja2V0IHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2xpYiAxCitFT0YKKworICBMSUJTPSItbHNvY2tldCAkTElCUyIKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMTQ1OiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIgPiY1CithY19saWJfdmFyPWBlY2hvIG5zbCdfJ2dldGhvc3RieW5hbWUgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sbnNsICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMxNTMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBnZXRob3N0YnluYW1lKCk7CisKK2ludCBtYWluKCkgeworZ2V0aG9zdGJ5bmFtZSgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE2NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBuc2wgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKKyAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfbGliIDEKK0VPRgorCisgIExJQlM9Ii1sbnNsICRMSUJTIgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisuICR7c3JjZGlyfS8uLi8uLi9iZmQvY29uZmlndXJlLmhvc3QKKworCisKK1VTRV9NQUlOVEFJTkVSX01PREU9bm8KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCU1BSU5UPSIiIFVTRV9NQUlOVEFJTkVSX01PREU9eWVzIDs7CisgIG5vKQlNQUlOVD0iIyIgOzsKKyAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgTUFJTlQ9IiMiIDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkTUFJTlQiID0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgbWFpbnRhaW5lciBtb2RlIiA2PiYxCitmaQorZWxzZQorICBNQUlOVD0iIyIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWJzd2FwIG9yIC0tZGlzYWJsZS1zaW0tYnN3YXAgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2Jzd2FwK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fYnN3YXAiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0xIC1EVVNFX0JTV0FQPTEiOzsKKyAgbm8pCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTAiOzsKKyAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLWJzd2FwIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2Jzd2FwPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYnN3YXAiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGJzd2FwIGZsYWdzID0gJHNpbV9ic3dhcCIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2Jzd2FwPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1jZmxhZ3Mgb3IgLS1kaXNhYmxlLXNpbS1jZmxhZ3Mgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2NmbGFncytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2NmbGFncyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCSBzaW1fY2ZsYWdzPSItTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIiOzsKKyAgdHJhY2UpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlBsZWFzZSB1c2UgLS1lbmFibGUtc2ltLWRlYnVnIGluc3RlYWQuIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fY2ZsYWdzPSIiOzsKKyAgbm8pCSBzaW1fY2ZsYWdzPSIiOzsKKyAgKikJIHNpbV9jZmxhZ3M9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2NmbGFncyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIGNmbGFncyA9ICRzaW1fY2ZsYWdzIiA2PiYxCitmaQorZWxzZQorICBzaW1fY2ZsYWdzPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1kZWJ1ZyBvciAtLWRpc2FibGUtc2ltLWRlYnVnIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9kZWJ1ZytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2RlYnVnIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykgc2ltX2RlYnVnPSItRERFQlVHPTcgLURXSVRIX0RFQlVHPTciOzsKKyAgbm8pICBzaW1fZGVidWc9Ii1EREVCVUc9MCAtRFdJVEhfREVCVUc9MCI7OworICAqKSAgIHNpbV9kZWJ1Zz0iLURERUJVRz0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9ERUJVRz0nKCR7ZW5hYmxldmFsfSknIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2RlYnVnIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gZGVidWcgPSAkc2ltX2RlYnVnIiA2PiYxCitmaQorZWxzZQorICBzaW1fZGVidWc9IiIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXN0ZGlvIG9yIC0tZGlzYWJsZS1zaW0tc3RkaW8gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3N0ZGlvK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fc3RkaW8iCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET19VU0VfU1RESU8iOzsKKyAgbm8pCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPTlRfVVNFX1NURElPIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLXN0ZGlvIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fc3RkaW89IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zdGRpbyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc3RkaW8gZmxhZ3MgPSAkc2ltX3N0ZGlvIiA2PiYxCitmaQorZWxzZQorICBzaW1fc3RkaW89IiIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXRyYWNlIG9yIC0tZGlzYWJsZS1zaW0tdHJhY2Ugd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3RyYWNlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fdHJhY2UiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MSAtRFdJVEhfVFJBQ0U9LTEiOzsKKyAgbm8pCXNpbV90cmFjZT0iLURUUkFDRT0wIC1EV0lUSF9UUkFDRT0wIjs7CisgIFstMC05XSopCisJc2ltX3RyYWNlPSItRFRSQUNFPScoJHtlbmFibGV2YWx9KScgLURXSVRIX1RSQUNFPScoJHtlbmFibGV2YWx9KSciOzsKKyAgW2Etel0qKQorCXNpbV90cmFjZT0iIgorCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbworCSAgaWYgdGVzdCB4IiRzaW1fdHJhY2UiID0geDsgdGhlbgorCSAgICBzaW1fdHJhY2U9Ii1EV0lUSF9UUkFDRT0nKFRSQUNFXyR4IgorCSAgZWxzZQorCSAgICBzaW1fdHJhY2U9IiR7c2ltX3RyYWNlfXxUUkFDRV8keCIKKwkgIGZpCisJZG9uZQorCXNpbV90cmFjZT0iJHNpbV90cmFjZSknIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV90cmFjZSIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIHRyYWNlID0gJHNpbV90cmFjZSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3RyYWNlPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1wcm9maWxlIG9yIC0tZGlzYWJsZS1zaW0tcHJvZmlsZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fcHJvZmlsZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3Byb2ZpbGUiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTEgLURXSVRIX1BST0ZJTEU9LTEiOzsKKyAgbm8pCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9MCAtRFdJVEhfUFJPRklMRT0wIjs7CisgIFstMC05XSopCisJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9QUk9GSUxFPScoJHtlbmFibGV2YWx9KSciOzsKKyAgW2Etel0qKQorCXNpbV9wcm9maWxlPSIiCisJZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCisJICBpZiB0ZXN0IHgiJHNpbV9wcm9maWxlIiA9IHg7IHRoZW4KKwkgICAgc2ltX3Byb2ZpbGU9Ii1EV0lUSF9QUk9GSUxFPScoUFJPRklMRV8keCIKKwkgIGVsc2UKKwkgICAgc2ltX3Byb2ZpbGU9IiR7c2ltX3Byb2ZpbGV9fFBST0ZJTEVfJHgiCisJICBmaQorCWRvbmUKKwlzaW1fcHJvZmlsZT0iJHNpbV9wcm9maWxlKSciIDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBwcm9maWxlID0gJHNpbV9wcm9maWxlIiA2PiYxCitmaQorZWxzZQorICBzaW1fcHJvZmlsZT0iIgorZmkKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzM0MDogY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpZ25hbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMzNDUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2lmZGVmIHNpZ25hbAorI3VuZGVmIHNpZ25hbAorI2VuZGlmCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgdm9pZCAoKnNpZ25hbCAoaW50LCB2b2lkICgqKShpbnQpKSkoaW50KTsKKyNlbHNlCit2b2lkICgqc2lnbmFsICgpKSAoKTsKKyNlbmRpZgorCitpbnQgbWFpbigpIHsKK2ludCBpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNjI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpZ25hbD12b2lkCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2lnbmFsPWludAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpZ25hbCIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgUkVUU0lHVFlQRSAkYWNfY3ZfdHlwZV9zaWduYWwKK0VPRgorCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMzgyOiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRDWUdXSU4zMiIgPSB5ZXM7IHRoZW4KK2FtX2N2X2V4ZWV4dD0uZXhlCitlbHNlCitjYXQgPiBhbV9jX3Rlc3QuYyA8PCAnRU9GJworaW50IG1haW4oKSB7CisvKiBOb3RoaW5nIG5lZWRlZCBoZXJlICovCit9CitFT0YKKyR7Q0MtY2N9IC1vIGFtX2NfdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBhbV9jX3Rlc3QuYyAkTElCUyAxPiY1CithbV9jdl9leGVleHQ9YGxzIGFtX2NfdGVzdC4qIHwgZ3JlcCAtdiBhbV9jX3Rlc3QuYyB8IHNlZCAtZSBzL2FtX2NfdGVzdC8vYAorcm0gLWYgYW1fY190ZXN0KgorZmkKKwordGVzdCB4IiR7YW1fY3ZfZXhlZXh0fSIgPSB4ICYmIGFtX2N2X2V4ZWV4dD1ubworZmkKK0VYRUVYVD0iIgordGVzdCB4IiR7YW1fY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FtX2N2X2V4ZWV4dH0KK2VjaG8gIiRhY190IiIke2FtX2N2X2V4ZWV4dH0iIDE+JjYKKworCitzaW1fbGlua19maWxlcz0KK3NpbV9saW5rX2xpbmtzPQorCitzaW1fbGlua19saW5rcz10Y29uZmlnLmgKK2lmIHRlc3QgLWYgJHtzcmNkaXJ9L3Rjb25maWcuaW4KK3RoZW4KKyAgc2ltX2xpbmtfZmlsZXM9dGNvbmZpZy5pbgorZWxzZQorICBzaW1fbGlua19maWxlcz0uLi9jb21tb24vdGNvbmZpZy5pbgorZmkKKworIyB0YXJnLXZhbHMuZGVmIHBvaW50cyB0byB0aGUgbGliYyBtYWNybyBkZXNjcmlwdGlvbiBmaWxlLgorY2FzZSAiJHt0YXJnZXR9IiBpbgorKi0qLSopIFRBUkdfVkFMU19ERUY9Li4vY29tbW9uL25sdHZhbHMuZGVmIDs7Citlc2FjCitzaW1fbGlua19maWxlcz0iJHtzaW1fbGlua19maWxlc30gJHtUQVJHX1ZBTFNfREVGfSIKK3NpbV9saW5rX2xpbmtzPSIke3NpbV9saW5rX2xpbmtzfSB0YXJnLXZhbHMuZGVmIgorCisKKworCit3aXJlX2VuZGlhbj0iQklHX0VORElBTiIKK2RlZmF1bHRfZW5kaWFuPSIiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWVuZGlhbiBvciAtLWRpc2FibGUtc2ltLWVuZGlhbiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fZW5kaWFuK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZW5kaWFuIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIGIqfEIqKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9QklHX0VORElBTiI7OworICBsKnxMKikgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iOzsKKyAgeWVzKQkgaWYgdGVzdCB4IiR3aXJlX2VuZGlhbiIgIT0geDsgdGhlbgorCSAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0ke3dpcmVfZW5kaWFufSIKKwkgZWxzZQorICAgICAgICAgICBpZiB0ZXN0IHgiJGRlZmF1bHRfZW5kaWFuIiAhPSB4OyB0aGVuCisJICAgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9JHtkZWZhdWx0X2VuZGlhbn0iCisJICAgZWxzZQorCSAgICAgZWNobyAiTm8gaGFyZC13aXJlZCBlbmRpYW4gZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2CisJICAgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9MCIKKwkgICBmaQorCSBmaTs7CisgIG5vKQkgaWYgdGVzdCB4IiRkZWZhdWx0X2VuZGlhbiIgIT0geDsgdGhlbgorCSAgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPSR7ZGVmYXVsdF9lbmRpYW59IgorCSBlbHNlCisJICAgaWYgdGVzdCB4IiR3aXJlX2VuZGlhbiIgIT0geDsgdGhlbgorCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9JHt3aXJlX2VuZGlhbn0iCisJICAgZWxzZQorCSAgICAgZWNobyAiTm8gZGVmYXVsdCBlbmRpYW4gZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2CisJICAgICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0wIgorCSAgIGZpCisJIGZpOzsKKyAgKikJIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBmb3IgLS1lbmFibGUtc2ltLWVuZGlhbiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2VuZGlhbj0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2VuZGlhbiIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgZW5kaWFuIGZsYWdzID0gJHNpbV9lbmRpYW4iIDY+JjEKK2ZpCitlbHNlCisgIGlmIHRlc3QgeCIkZGVmYXVsdF9lbmRpYW4iICE9IHg7IHRoZW4KKyAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9JHtkZWZhdWx0X2VuZGlhbn0iCitlbHNlCisgIGlmIHRlc3QgeCIkd2lyZV9lbmRpYW4iICE9IHg7IHRoZW4KKyAgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9JHt3aXJlX2VuZGlhbn0iCisgIGVsc2UKKyAgICBzaW1fZW5kaWFuPQorICBmaQorZmkKK2ZpCisKK3dpcmVfYWxpZ25tZW50PSJTVFJJQ1RfQUxJR05NRU5UIgorZGVmYXVsdF9hbGlnbm1lbnQ9IiIKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQgb3IgLS1kaXNhYmxlLXNpbS1hbGlnbm1lbnQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2FsaWdubWVudCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2FsaWdubWVudCIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICBzdHJpY3QgfCBTVFJJQ1QpICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9U1RSSUNUX0FMSUdOTUVOVCI7OworICBub25zdHJpY3QgfCBOT05TVFJJQ1QpIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9Tk9OU1RSSUNUX0FMSUdOTUVOVCI7OworICBmb3JjZWQgfCBGT1JDRUQpICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9Rk9SQ0VEX0FMSUdOTUVOVCI7OworICB5ZXMpIGlmIHRlc3QgeCIkd2lyZV9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKwkgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0ke3dpcmVfYWxpZ25tZW50fSIKKyAgICAgICBlbHNlCisgICAgICAgICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCisgICAgICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCisgICAgICAgICBlbHNlCisJICAgZWNobyAiTm8gaGFyZC13aXJlZCBhbGlnbm1lbnQgZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2CisJICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0wIgorICAgICAgICAgZmkKKyAgICAgICBmaTs7CisgIG5vKSAgaWYgdGVzdCB4IiRkZWZhdWx0X2FsaWdubWVudCIgIT0geDsgdGhlbgorCSBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCisgICAgICAgZWxzZQorICAgICAgICAgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgorCSAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke3dpcmVfYWxpZ25tZW50fSIKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgZWNobyAiTm8gZGVmYXVsdCBhbGlnbm1lbnQgZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2CisgICAgICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0wIgorICAgICAgICAgZmkKKyAgICAgICBmaTs7CisgICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tYWxpZ25tZW50IiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYWxpZ25tZW50PSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYWxpZ25tZW50IiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBhbGlnbm1lbnQgZmxhZ3MgPSAkc2ltX2FsaWdubWVudCIgNj4mMQorZmkKK2Vsc2UKKyAgaWYgdGVzdCB4IiRkZWZhdWx0X2FsaWdubWVudCIgIT0geDsgdGhlbgorICBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCitlbHNlCisgIGlmIHRlc3QgeCIkd2lyZV9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKyAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgorICBlbHNlCisgICAgc2ltX2FsaWdubWVudD0KKyAgZmkKK2ZpCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbiBvciAtLWRpc2FibGUtc2ltLWhvc3RlbmRpYW4gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2hvc3RlbmRpYW4rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ob3N0ZW5kaWFuIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIG5vKQkgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9MCI7OworICBiKnxCKikgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9QklHX0VORElBTiI7OworICBsKnxMKikgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiI7OworICAqKQkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2hvc3RlbmRpYW49IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ob3N0ZW5kaWFuIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBob3N0ZW5kaWFuIGZsYWdzID0gJHNpbV9ob3N0ZW5kaWFuIiA2PiYxCitmaQorZWxzZQorICAKK2lmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM1MzY6IGNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4iID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfYmlnZW5kaWFuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bgorIyBTZWUgaWYgc3lzL3BhcmFtLmggZGVmaW5lcyB0aGUgQllURV9PUkRFUiBtYWNyby4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM1NDMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgoraW50IG1haW4oKSB7CisKKyNpZiAhQllURV9PUkRFUiB8fCAhQklHX0VORElBTiB8fCAhTElUVExFX0VORElBTgorIGJvZ3VzIGVuZGlhbiBtYWNyb3MKKyNlbmRpZgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1NTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICAjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIEJJR19FTkRJQU4gb3Igbm90LgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzU1OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CitpbnQgbWFpbigpIHsKKworI2lmIEJZVEVfT1JERVIgIT0gQklHX0VORElBTgorIG5vdCBiaWcgZW5kaWFuCisjZW5kaWYKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTY5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfYmlnZW5kaWFuPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgoraWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZyIgMT4mMjsgZXhpdCAxOyB9CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM1ODkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorbWFpbiAoKSB7CisgIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KKyAgdW5pb24KKyAgeworICAgIGxvbmcgbDsKKyAgICBjaGFyIGNbc2l6ZW9mIChsb25nKV07CisgIH0gdTsKKyAgdS5sID0gMTsKKyAgZXhpdCAodS5jW3NpemVvZiAobG9uZykgLSAxXSA9PSAxKTsKK30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2NfYmlnZW5kaWFuPW5vCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfYmlnZW5kaWFuIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKK0VPRgorCitmaQorCisgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0geWVzOyB0aGVuCisgICAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9QklHX0VORElBTiIKKyAgZWxzZQorICAgIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iCisgIGZpCitlbHNlCisgIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPTAiCitmaQorZmkKKworCitkZWZhdWx0X3NpbV9zY2FjaGU9IjE2Mzg0IgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zY2FjaGUgb3IgLS1kaXNhYmxlLXNpbS1zY2FjaGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3NjYWNoZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3NjYWNoZSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9zY2FjaGU9Ii1EV0lUSF9TQ0FDSEU9JHtkZWZhdWx0X3NpbV9zY2FjaGV9Ijs7CisgIG5vKQlzaW1fc2NhY2hlPSItRFdJVEhfU0NBQ0hFPTAiIDs7CisgIFswLTldKikgc2ltX2NhY2hlPSR7ZW5hYmxldmFsfTs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIkJhZCB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tc2NhY2hlIiIgMT4mMjsgZXhpdCAxOyB9OworCXNpbV9zY2FjaGU9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zY2FjaGUiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNjYWNoZSBzaXplID0gJHNpbV9zY2FjaGUiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9zY2FjaGU9Ii1EV0lUSF9TQ0FDSEU9JHtkZWZhdWx0X3NpbV9zY2FjaGV9IgorZmkKKworCisKK2RlZmF1bHRfc2ltX2RlZmF1bHRfbW9kZWw9Im0zMnIvZCIKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVmYXVsdC1tb2RlbCBvciAtLWRpc2FibGUtc2ltLWRlZmF1bHQtbW9kZWwgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2RlZmF1bHRfbW9kZWwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWZhdWx0X21vZGVsIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllc3xubykgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiTWlzc2luZyBhcmd1bWVudCB0byAtLWVuYWJsZS1zaW0tZGVmYXVsdC1tb2RlbCIiIDE+JjI7IGV4aXQgMTsgfTs7CisgICopCXNpbV9kZWZhdWx0X21vZGVsPSItRFdJVEhfREVGQVVMVF9NT0RFTD0nXCIke2VuYWJsZXZhbH1cIiciOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVmYXVsdF9tb2RlbCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgZGVmYXVsdCBtb2RlbCA9ICRzaW1fZGVmYXVsdF9tb2RlbCIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2RlZmF1bHRfbW9kZWw9Ii1EV0lUSF9ERUZBVUxUX01PREVMPSdcIiR7ZGVmYXVsdF9zaW1fZGVmYXVsdF9tb2RlbH1cIiciCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1lbnZpcm9ubWVudCBvciAtLWRpc2FibGUtc2ltLWVudmlyb25tZW50IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9lbnZpcm9ubWVudCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Vudmlyb25tZW50IgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIGFsbCB8IEFMTCkgICAgICAgICAgICAgc2ltX2Vudmlyb25tZW50PSItRFdJVEhfRU5WSVJPTk1FTlQ9QUxMX0VOVklST05NRU5UIjs7CisgIHVzZXIgfCBVU0VSKSAgICAgICAgICAgc2ltX2Vudmlyb25tZW50PSItRFdJVEhfRU5WSVJPTk1FTlQ9VVNFUl9FTlZJUk9OTUVOVCI7OworICB2aXJ0dWFsIHwgVklSVFVBTCkgICAgIHNpbV9lbnZpcm9ubWVudD0iLURXSVRIX0VOVklST05NRU5UPVZJUlRVQUxfRU5WSVJPTk1FTlQiOzsKKyAgb3BlcmF0aW5nIHwgT1BFUkFUSU5HKSBzaW1fZW52aXJvbm1lbnQ9Ii1EV0lUSF9FTlZJUk9OTUVOVD1PUEVSQVRJTkdfRU5WSVJPTk1FTlQiOzsKKyAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1lbnZpcm9ubWVudCIiIDE+JjI7IGV4aXQgMTsgfTsKKyAgICAgICBzaW1fZW52aXJvbm1lbnQ9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9lbnZpcm9ubWVudCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIGVudmlyb25tZW50ID0gJHNpbV9lbnZpcm9ubWVudCIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2Vudmlyb25tZW50PSItRFdJVEhfRU5WSVJPTk1FTlQ9QUxMX0VOVklST05NRU5UIgorZmkKKworCitkZWZhdWx0X3NpbV9pbmxpbmU9IiIKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0taW5saW5lIG9yIC0tZGlzYWJsZS1zaW0taW5saW5lIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9pbmxpbmUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9pbmxpbmUiCisgIHNpbV9pbmxpbmU9IiIKK2Nhc2UgIiRlbmFibGV2YWwiIGluCisgIG5vKQkJc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIjs7CisgIDApCQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiOzsKKyAgeWVzIHwgMikJc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT1BTExfQ19JTkxJTkUiOzsKKyAgMSkJCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9SU5MSU5FX0xPQ0FMUyI7OworICAqKSBmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKyAgICAgICBuZXdfZmxhZz0iIgorICAgICAgIGNhc2UgIiR4IiBpbgorCSAqX0lOTElORT0qKQluZXdfZmxhZz0iLUQkeCI7OworCSAqPSopCQluZXdfZmxhZz1gZWNobyAiJHgiIHwgc2VkIC1lICJzLz0vX0lOTElORT0vIiAtZSAicy9eLy1ELyJgOzsKKwkgKl9JTkxJTkUpCW5ld19mbGFnPSItRCR4PUFMTF9DX0lOTElORSI7OworCSAqKQkJbmV3X2ZsYWc9Ii1EJHgiIl9JTkxJTkU9QUxMX0NfSU5MSU5FIjs7CisgICAgICAgZXNhYworICAgICAgIGlmIHRlc3QgeCIkc2ltX2lubGluZSIgPSB4IiI7IHRoZW4KKwkgc2ltX2lubGluZT0iJG5ld19mbGFnIgorICAgICAgIGVsc2UKKwkgc2ltX2lubGluZT0iJHNpbV9pbmxpbmUgJG5ld19mbGFnIgorICAgICAgIGZpCisgICAgIGRvbmU7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9pbmxpbmUiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGlubGluZSBmbGFncyA9ICRzaW1faW5saW5lIiA2PiYxCitmaQorZWxzZQorICAKK2lmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisgIGlmIHRlc3QgeCIkR0NDIiAhPSAieCIgLWEgeCIke2RlZmF1bHRfc2ltX2lubGluZX0iICE9ICJ4IiA7IHRoZW4KKyAgICBzaW1faW5saW5lPSIke2RlZmF1bHRfc2ltX2lubGluZX0iCisgICAgaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgorICAgICAgZWNobyAiU2V0dGluZyBpbmxpbmUgZmxhZ3MgPSAkc2ltX2lubGluZSIgNj4mMQorICAgIGZpCisgIGVsc2UKKyAgICBzaW1faW5saW5lPSIiCisgIGZpCitlbHNlCisgIHNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKK2ZpCitmaQorCisKK2NnZW5fbWFpbnQ9bm8KK2NnZW49Li4vLi4vY2dlbi9jZ2VuCitjZ2VuZGlyPSckKHNyY2RpcikvLi4vLi4vY2dlbicKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jZ2VuLW1haW50IG9yIC0tZGlzYWJsZS1jZ2VuLW1haW50IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2NnZW5fbWFpbnQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2NnZW5fbWFpbnQiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQljZ2VuX21haW50PXllcyA7OworICBubykJY2dlbl9tYWludD1ubyA7OworICAqKQorCSMgYXJndW1lbnQgaXMgY2dlbiBpbnN0YWxsIGRpcmVjdG9yeSAobm90IGltcGxlbWVudGVkIHlldCkuCisJIyBIYXZpbmcgYSBgc2hhcmUnIGRpcmVjdG9yeSBtaWdodCBiZSBtb3JlIGFwcHJvcHJpYXRlIGZvciB0aGUgLnNjbSwKKwkjIC5jcHUsIGV0Yy4gZmlsZXMuCisJY2dlbmRpcj0ke2NnZW5fbWFpbnR9L2xpYi9jZ2VuCisJY2dlbj0ke2NnZW5kaXJ9L2Jpbi9jZ2VuCisJOzsKK2VzYWMKK2ZpCitpZiB0ZXN0IHgke2NnZW5fbWFpbnR9ICE9IHhubyA7IHRoZW4KKyAgQ0dFTl9NQUlOVD0nJworZWxzZQorICBDR0VOX01BSU5UPScjJworZmkKKworCisKKworCisKKwordHJhcCAnJyAxIDIgMTUKK2NhdCA+IGNvbmZjYWNoZSA8PFxFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgorIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAorIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCisjIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgorIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCisjIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgorIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCisjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworRU9GCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKyhzZXQpIDI+JjEgfAorICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjEgfCBncmVwIGFjX3NwYWNlYCBpbgorICAqYWNfc3BhY2U9XCAqKQorICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCisgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICBzZWQgLW4gXAorICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKKyAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKyAgICA7OworICAqKQorICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJworICAgIDs7CisgIGVzYWMgPj4gY29uZmNhY2hlCitpZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKyMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCitmaQorCit0cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKKyMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgorOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorCitlY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCitybSAtZiAkQ09ORklHX1NUQVRVUworY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyMhIC9iaW4vc2gKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCisjIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIworIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKKyMKKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCithY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgorZm9yIGFjX29wdGlvbgorZG8KKyAgY2FzZSAiXCRhY19vcHRpb24iIGluCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKKyAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCisgICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQHNpbV9lbnZpcm9ubWVudEAlJHNpbV9lbnZpcm9ubWVudCVnCitzJUBzaW1fYWxpZ25tZW50QCUkc2ltX2FsaWdubWVudCVnCitzJUBzaW1fYXNzZXJ0QCUkc2ltX2Fzc2VydCVnCitzJUBzaW1fYml0c2l6ZUAlJHNpbV9iaXRzaXplJWcKK3MlQHNpbV9lbmRpYW5AJSRzaW1fZW5kaWFuJWcKK3MlQHNpbV9ob3N0ZW5kaWFuQCUkc2ltX2hvc3RlbmRpYW4lZworcyVAc2ltX2Zsb2F0QCUkc2ltX2Zsb2F0JWcKK3MlQHNpbV9zY2FjaGVAJSRzaW1fc2NhY2hlJWcKK3MlQHNpbV9kZWZhdWx0X21vZGVsQCUkc2ltX2RlZmF1bHRfbW9kZWwlZworcyVAc2ltX2h3X2NmbGFnc0AlJHNpbV9od19jZmxhZ3MlZworcyVAc2ltX2h3X29ianNAJSRzaW1faHdfb2JqcyVnCitzJUBzaW1faHdAJSRzaW1faHclZworcyVAc2ltX2lubGluZUAlJHNpbV9pbmxpbmUlZworcyVAc2ltX3BhY2thZ2VzQCUkc2ltX3BhY2thZ2VzJWcKK3MlQHNpbV9yZWdwYXJtQCUkc2ltX3JlZ3Bhcm0lZworcyVAc2ltX3Jlc2VydmVkX2JpdHNAJSRzaW1fcmVzZXJ2ZWRfYml0cyVnCitzJUBzaW1fc21wQCUkc2ltX3NtcCVnCitzJUBzaW1fc3RkY2FsbEAlJHNpbV9zdGRjYWxsJWcKK3MlQHNpbV94b3JfZW5kaWFuQCUkc2ltX3hvcl9lbmRpYW4lZworcyVAYnVpbGRfd2FybmluZ3NAJSRidWlsZF93YXJuaW5ncyVnCitzJUBTSEVMTEAlJFNIRUxMJWcKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBob3N0QCUkaG9zdCVnCitzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCitzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKK3MlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZworcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKK3MlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCitzJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCitzJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCitzJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZworcyVAYnVpbGRAJSRidWlsZCVnCitzJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKK3MlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCitzJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZworcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCitzJUBDQ0AlJENDJWcKK3MlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCitzJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZworcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKK3MlQEhERUZJTkVTQCUkSERFRklORVMlZworcyVAQVJAJSRBUiVnCitzJUBSQU5MSUJAJSRSQU5MSUIlZworcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCitzJUBDUFBAJSRDUFAlZworcyVAQUxMT0NBQCUkQUxMT0NBJWcKK3MlQFVTRV9OTFNAJSRVU0VfTkxTJWcKK3MlQE1TR0ZNVEAlJE1TR0ZNVCVnCitzJUBHTVNHRk1UQCUkR01TR0ZNVCVnCitzJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKK3MlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZworcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCitzJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZworcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCitzJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKK3MlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKK3MlQElOVExERVBTQCUkSU5UTERFUFMlZworcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCitzJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKK3MlQFBPRklMRVNAJSRQT0ZJTEVTJWcKK3MlQFBPU1VCQCUkUE9TVUIlZworcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZworcyVAR1RfTk9AJSRHVF9OTyVnCitzJUBHVF9ZRVNAJSRHVF9ZRVMlZworcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZworcyVAbEAlJGwlZworcyVATUFJTlRAJSRNQUlOVCVnCitzJUBzaW1fYnN3YXBAJSRzaW1fYnN3YXAlZworcyVAc2ltX2NmbGFnc0AlJHNpbV9jZmxhZ3MlZworcyVAc2ltX2RlYnVnQCUkc2ltX2RlYnVnJWcKK3MlQHNpbV9zdGRpb0AlJHNpbV9zdGRpbyVnCitzJUBzaW1fdHJhY2VAJSRzaW1fdHJhY2UlZworcyVAc2ltX3Byb2ZpbGVAJSRzaW1fcHJvZmlsZSVnCitzJUBFWEVFWFRAJSRFWEVFWFQlZworcyVAQ0dFTl9NQUlOVEAlJENHRU5fTUFJTlQlZworcyVAY2dlbmRpckAlJGNnZW5kaXIlZworcyVAY2dlbkAlJGNnZW4lZworCitDRU9GCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCithY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KK2FjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfbW9yZV9saW5lcz06CithY19zZWRfY21kcz0iIgord2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZmkKKyAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGVsc2UKKyAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGZpCisgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCisgICAgYWNfYmVnPSRhY19lbmQKKyAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgIGFjX3NlZF9jbWRzPWNhdAorZmkKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4ifQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KKworICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgIC4pICBzcmNkaXI9LgorICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgorICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7CisgIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgorICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgZXNhYworCisgIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgorICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKKyAgcm0gLWYgIiRhY19maWxlIgorICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorIyAkY29uZmlndXJlX2lucHV0IiA7OworICAqKSBhY19jb21zdWI9IDs7CisgIGVzYWMKKworICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBzZWQgLWUgIiRhY19jb21zdWIKK3MlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCitzJUBzcmNkaXJAJSRzcmNkaXIlZworcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworcyVASU5TVEFMTEAlJElOU1RBTEwlZworIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQorZmk7IGRvbmUKK3JtIC1mIGNvbmZ0ZXN0LnMqCisKKyMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCisjIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCisjCisjIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCithY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKK2FjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJworYWNfZEM9J1wzJworYWNfZEQ9JyVnJworIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCithY191Qz0nICcKK2FjX3VEPSdcNCVnJworIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKK2FjX2VDPScgJworYWNfZUQ9JyVnJworCitpZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZmkKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKKworICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAorICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KKworRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCisjIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCitybSAtZiBjb25mdGVzdC52YWxzCitjYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCitzL1tcXCYlXS9cXCYvZworcyVbXFwkYF0lXFwmJWcKK3MlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCitzJWFjX2QlYWNfdSVncAorcyVhY191JWFjX2UlZ3AKK0VPRgorc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscworcm0gLWYgY29uZnRlc3QuaGRyCisKKyMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKKyMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCitzJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQorRU9GCisKKyMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgorIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KKworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgOgorZG8KKyAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAorICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCisgIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKKyAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCisgIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUworICBlY2hvICdDRU9GCisgIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0CisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgorJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKKyAgcm0gLWYgY29uZnRlc3QudmFscworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKKyAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCisgIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCisgICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgorICAgIHJtIC1mIGNvbmZ0ZXN0LmgKKyAgZWxzZQorICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgZmkKKyAgICBybSAtZiAkYWNfZmlsZQorICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKKyAgZmkKK2ZpOyBkb25lCisKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKK2FjX3NvdXJjZXM9IiRzaW1fbGlua19maWxlcyIKK2FjX2Rlc3RzPSIkc2ltX2xpbmtfbGlua3MiCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorc3JjZGlyPSRhY19naXZlbl9zcmNkaXIKK3doaWxlIHRlc3QgLW4gIiRhY19zb3VyY2VzIjsgZG8KKyAgc2V0ICRhY19kZXN0czsgYWNfZGVzdD0kMTsgc2hpZnQ7IGFjX2Rlc3RzPSQqCisgIHNldCAkYWNfc291cmNlczsgYWNfc291cmNlPSQxOyBzaGlmdDsgYWNfc291cmNlcz0kKgorCisgIGVjaG8gImxpbmtpbmcgJHNyY2Rpci8kYWNfc291cmNlIHRvICRhY19kZXN0IgorCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY19zb3VyY2U7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRzcmNkaXIvJGFjX3NvdXJjZTogRmlsZSBub3QgZm91bmQiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorICBybSAtZiAkYWNfZGVzdAorCisgICMgTWFrZSByZWxhdGl2ZSBzeW1saW5rcy4KKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rlc3RfZGlyPWBlY2hvICRhY19kZXN0fHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAiJGFjX2Rlc3QiICYmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGRlc3QgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kZXN0X2RpciIgJiYgbWtkaXIgIiRhY19kZXN0X2RpciIKKyAgICBhY19kZXN0X2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGVzdF9kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rlc3RfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kZXN0X2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kZXN0X2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJHNyY2RpciIgaW4KKyAgWy8kXSopIGFjX3JlbF9zb3VyY2U9IiRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKKyAgKikgYWNfcmVsX3NvdXJjZT0iJGFjX2RvdHMkc3JjZGlyLyRhY19zb3VyY2UiIDs7CisgIGVzYWMKKworICAjIE1ha2UgYSBzeW1saW5rIGlmIHBvc3NpYmxlOyBvdGhlcndpc2UgdHJ5IGEgaGFyZCBsaW5rLgorICBpZiBsbiAtcyAkYWNfcmVsX3NvdXJjZSAkYWNfZGVzdCAyPi9kZXYvbnVsbCB8fAorICAgIGxuICRzcmNkaXIvJGFjX3NvdXJjZSAkYWNfZGVzdDsgdGhlbiA6CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgbGluayAkYWNfZGVzdCB0byAkc3JjZGlyLyRhY19zb3VyY2UiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZG9uZQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitjYXNlICJ4JENPTkZJR19GSUxFUyIgaW4KKyB4TWFrZWZpbGUqKQorICAgZWNobyAiTWVyZ2luZyBNYWtlZmlsZS5zaW0rTWFrZS1jb21tb24uc2ltIGludG8gTWFrZWZpbGUgLi4uIgorICAgcm0gLWYgTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcCBNYWtlZmlsZQorICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QUkVfLywvXiMjIEVuZCBDT01NT05fUFJFXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTEudG1wCisgICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BPU1RfLywvXiMjIEVuZCBDT01NT05fUE9TVF8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0yLnRtcAorICAgc2VkIC1lICcvXiMjIENPTU1PTl9QUkVfLyByIE1ha2VzaW0xLnRtcCcgXAorCS1lICcvXiMjIENPTU1PTl9QT1NUXy8gciBNYWtlc2ltMi50bXAnIFwKKwk8TWFrZWZpbGUuc2ltID5NYWtlZmlsZQorICAgcm0gLWYgTWFrZWZpbGUuc2ltIE1ha2UtY29tbW9uLnNpbSBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wCisgICA7OworIGVzYWMKKyBjYXNlICJ4JENPTkZJR19IRUFERVJTIiBpbiB4Y29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjCisKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCisKZGlmZiAtLWdpdCBhL3NpbS9tMzJyL2NvbmZpZ3VyZS5pbiBiL3NpbS9tMzJyL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTk4ZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL20zMnIvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsMTcgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Lgorc2luY2x1ZGUoLi4vY29tbW9uL2FjbG9jYWwubTQpCitBQ19QUkVSRVEoMi41KWRubAorQUNfSU5JVChNYWtlZmlsZS5pbikKKworU0lNX0FDX0NPTU1PTgorCitTSU1fQUNfT1BUSU9OX0VORElBTihCSUdfRU5ESUFOKQorU0lNX0FDX09QVElPTl9BTElHTk1FTlQoU1RSSUNUX0FMSUdOTUVOVCkKK1NJTV9BQ19PUFRJT05fSE9TVEVORElBTgorU0lNX0FDX09QVElPTl9TQ0FDSEUoMTYzODQpCitTSU1fQUNfT1BUSU9OX0RFRkFVTFRfTU9ERUwobTMyci9kKQorU0lNX0FDX09QVElPTl9FTlZJUk9OTUVOVAorU0lNX0FDX09QVElPTl9JTkxJTkUoKQorU0lNX0FDX09QVElPTl9DR0VOX01BSU5UCisKK1NJTV9BQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3NpbS9tMzJyL2NwdS5jIGIvc2ltL20zMnIvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4NTZmNQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tMzJyL2NwdS5jCkBAIC0wLDAgKzEsMTk2IEBACisvKiBNaXNjLiBzdXBwb3J0IGZvciBDUFUgZmFtaWx5IG0zMnJiZi4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2RlZmluZSBXQU5UX0NQVSBtMzJyYmYKKyNkZWZpbmUgV0FOVF9DUFVfTTMyUkJGCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtcGMuICAqLworCitVU0kKK20zMnJiZl9oX3BjX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHJldHVybiBDUFUgKGhfcGMpOworfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC1wYy4gICovCisKK3ZvaWQKK20zMnJiZl9oX3BjX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVTSSBuZXd2YWwpCit7CisgIENQVSAoaF9wYykgPSBuZXd2YWw7Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1nci4gICovCisKK1NJCittMzJyYmZfaF9ncl9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vKQoreworICByZXR1cm4gQ1BVIChoX2dyW3JlZ25vXSk7Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLWdyLiAgKi8KKwordm9pZAorbTMycmJmX2hfZ3Jfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubywgU0kgbmV3dmFsKQoreworICBDUFUgKGhfZ3JbcmVnbm9dKSA9IG5ld3ZhbDsKK30KKworLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWNyLiAgKi8KKworVVNJCittMzJyYmZfaF9jcl9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vKQoreworICByZXR1cm4gR0VUX0hfQ1IgKHJlZ25vKTsKK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtY3IuICAqLworCit2b2lkCittMzJyYmZfaF9jcl9zZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIHJlZ25vLCBVU0kgbmV3dmFsKQoreworICBTRVRfSF9DUiAocmVnbm8sIG5ld3ZhbCk7Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1hY2N1bS4gICovCisKK0RJCittMzJyYmZfaF9hY2N1bV9nZXQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1KQoreworICByZXR1cm4gR0VUX0hfQUNDVU0gKCk7Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLWFjY3VtLiAgKi8KKwordm9pZAorbTMycmJmX2hfYWNjdW1fc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgREkgbmV3dmFsKQoreworICBTRVRfSF9BQ0NVTSAobmV3dmFsKTsKK30KKworLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWFjY3Vtcy4gICovCisKK0RJCittMzJyYmZfaF9hY2N1bXNfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubykKK3sKKyAgcmV0dXJuIEdFVF9IX0FDQ1VNUyAocmVnbm8pOworfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC1hY2N1bXMuICAqLworCit2b2lkCittMzJyYmZfaF9hY2N1bXNfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVUlOVCByZWdubywgREkgbmV3dmFsKQoreworICBTRVRfSF9BQ0NVTVMgKHJlZ25vLCBuZXd2YWwpOworfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtY29uZC4gICovCisKK0JJCittMzJyYmZfaF9jb25kX2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHJldHVybiBDUFUgKGhfY29uZCk7Cit9CisKKy8qIFNldCBhIHZhbHVlIGZvciBoLWNvbmQuICAqLworCit2b2lkCittMzJyYmZfaF9jb25kX3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIEJJIG5ld3ZhbCkKK3sKKyAgQ1BVIChoX2NvbmQpID0gbmV3dmFsOworfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtcHN3LiAgKi8KKworVVFJCittMzJyYmZfaF9wc3dfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKK3sKKyAgcmV0dXJuIEdFVF9IX1BTVyAoKTsKK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtcHN3LiAgKi8KKwordm9pZAorbTMycmJmX2hfcHN3X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVRSSBuZXd2YWwpCit7CisgIFNFVF9IX1BTVyAobmV3dmFsKTsKK30KKworLyogR2V0IHRoZSB2YWx1ZSBvZiBoLWJwc3cuICAqLworCitVUUkKK20zMnJiZl9oX2Jwc3dfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKK3sKKyAgcmV0dXJuIENQVSAoaF9icHN3KTsKK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtYnBzdy4gICovCisKK3ZvaWQKK20zMnJiZl9oX2Jwc3dfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVVFJIG5ld3ZhbCkKK3sKKyAgQ1BVIChoX2Jwc3cpID0gbmV3dmFsOworfQorCisvKiBHZXQgdGhlIHZhbHVlIG9mIGgtYmJwc3cuICAqLworCitVUUkKK20zMnJiZl9oX2JicHN3X2dldCAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHJldHVybiBDUFUgKGhfYmJwc3cpOworfQorCisvKiBTZXQgYSB2YWx1ZSBmb3IgaC1iYnBzdy4gICovCisKK3ZvaWQKK20zMnJiZl9oX2JicHN3X3NldCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVRSSBuZXd2YWwpCit7CisgIENQVSAoaF9iYnBzdykgPSBuZXd2YWw7Cit9CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgaC1sb2NrLiAgKi8KKworQkkKK20zMnJiZl9oX2xvY2tfZ2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSkKK3sKKyAgcmV0dXJuIENQVSAoaF9sb2NrKTsKK30KKworLyogU2V0IGEgdmFsdWUgZm9yIGgtbG9jay4gICovCisKK3ZvaWQKK20zMnJiZl9oX2xvY2tfc2V0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgQkkgbmV3dmFsKQoreworICBDUFUgKGhfbG9jaykgPSBuZXd2YWw7Cit9CisKKy8qIFJlY29yZCB0cmFjZSByZXN1bHRzIGZvciBJTlNOLiAgKi8KKwordm9pZAorbTMycmJmX3JlY29yZF90cmFjZV9yZXN1bHRzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgQ0dFTl9JTlNOICppbnNuLAorCQkJICAgIGludCAqaW5kaWNlcywgVFJBQ0VfUkVDT1JEICp0cikKK3sKK30KZGlmZiAtLWdpdCBhL3NpbS9tMzJyL2NwdS5oIGIvc2ltL20zMnIvY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NiNDY3NgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tMzJyL2NwdS5oCkBAIC0wLDAgKzEsODUyIEBACisvKiBDUFUgZmFtaWx5IGhlYWRlciBmb3IgbTMycmJmLgorCitUSElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgorCitDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisqLworCisjaWZuZGVmIENQVV9NMzJSQkZfSAorI2RlZmluZSBDUFVfTTMyUkJGX0gKKworLyogTWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIGZldGNoZWQgYXQgYSB0aW1lLgorICAgVGhpcyBpcyBmb3IgTElXIHR5cGUgaW5zdHJ1Y3Rpb25zIHNldHMgKGUuZy4gbTMycikuICAqLworI2RlZmluZSBNQVhfTElXX0lOU05TIDIKKworLyogTWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiAgKi8KKyNkZWZpbmUgTUFYX1BBUkFMTEVMX0lOU05TIDEKKworLyogQ1BVIHN0YXRlIGluZm9ybWF0aW9uLiAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogSGFyZHdhcmUgZWxlbWVudHMuICAqLworICBzdHJ1Y3QgeworICAvKiBwcm9ncmFtIGNvdW50ZXIgKi8KKyAgVVNJIGhfcGM7CisjZGVmaW5lIEdFVF9IX1BDKCkgQ1BVIChoX3BjKQorI2RlZmluZSBTRVRfSF9QQyh4KSAoQ1BVIChoX3BjKSA9ICh4KSkKKyAgLyogZ2VuZXJhbCByZWdpc3RlcnMgKi8KKyAgU0kgaF9nclsxNl07CisjZGVmaW5lIEdFVF9IX0dSKGExKSBDUFUgKGhfZ3IpW2ExXQorI2RlZmluZSBTRVRfSF9HUihhMSwgeCkgKENQVSAoaF9ncilbYTFdID0gKHgpKQorICAvKiBjb250cm9sIHJlZ2lzdGVycyAqLworICBVU0kgaF9jclsxNl07CisvKiBHRVRfSF9DUiBtYWNybyB1c2VyLXdyaXR0ZW4gKi8KKy8qIFNFVF9IX0NSIG1hY3JvIHVzZXItd3JpdHRlbiAqLworICAvKiBhY2N1bXVsYXRvciAqLworICBESSBoX2FjY3VtOworLyogR0VUX0hfQUNDVU0gbWFjcm8gdXNlci13cml0dGVuICovCisvKiBTRVRfSF9BQ0NVTSBtYWNybyB1c2VyLXdyaXR0ZW4gKi8KKyAgLyogY29uZGl0aW9uIGJpdCAqLworICBCSSBoX2NvbmQ7CisjZGVmaW5lIEdFVF9IX0NPTkQoKSBDUFUgKGhfY29uZCkKKyNkZWZpbmUgU0VUX0hfQ09ORCh4KSAoQ1BVIChoX2NvbmQpID0gKHgpKQorICAvKiBwc3cgcGFydCBvZiBwc3cgKi8KKyAgVVFJIGhfcHN3OworLyogR0VUX0hfUFNXIG1hY3JvIHVzZXItd3JpdHRlbiAqLworLyogU0VUX0hfUFNXIG1hY3JvIHVzZXItd3JpdHRlbiAqLworICAvKiBiYWNrdXAgcHN3ICovCisgIFVRSSBoX2Jwc3c7CisjZGVmaW5lIEdFVF9IX0JQU1coKSBDUFUgKGhfYnBzdykKKyNkZWZpbmUgU0VUX0hfQlBTVyh4KSAoQ1BVIChoX2Jwc3cpID0gKHgpKQorICAvKiBiYWNrdXAgYnBzdyAqLworICBVUUkgaF9iYnBzdzsKKyNkZWZpbmUgR0VUX0hfQkJQU1coKSBDUFUgKGhfYmJwc3cpCisjZGVmaW5lIFNFVF9IX0JCUFNXKHgpIChDUFUgKGhfYmJwc3cpID0gKHgpKQorICAvKiBsb2NrICovCisgIEJJIGhfbG9jazsKKyNkZWZpbmUgR0VUX0hfTE9DSygpIENQVSAoaF9sb2NrKQorI2RlZmluZSBTRVRfSF9MT0NLKHgpIChDUFUgKGhfbG9jaykgPSAoeCkpCisgIH0gaGFyZHdhcmU7CisjZGVmaW5lIENQVV9DR0VOX0hXKGNwdSkgKCYgKGNwdSktPmNwdV9kYXRhLmhhcmR3YXJlKQorfSBNMzJSQkZfQ1BVX0RBVEE7CisKKy8qIENvdmVyIGZucyBmb3IgcmVnaXN0ZXIgYWNjZXNzLiAgKi8KK1VTSSBtMzJyYmZfaF9wY19nZXQgKFNJTV9DUFUgKik7Cit2b2lkIG0zMnJiZl9oX3BjX3NldCAoU0lNX0NQVSAqLCBVU0kpOworU0kgbTMycmJmX2hfZ3JfZ2V0IChTSU1fQ1BVICosIFVJTlQpOwordm9pZCBtMzJyYmZfaF9ncl9zZXQgKFNJTV9DUFUgKiwgVUlOVCwgU0kpOworVVNJIG0zMnJiZl9oX2NyX2dldCAoU0lNX0NQVSAqLCBVSU5UKTsKK3ZvaWQgbTMycmJmX2hfY3Jfc2V0IChTSU1fQ1BVICosIFVJTlQsIFVTSSk7CitESSBtMzJyYmZfaF9hY2N1bV9nZXQgKFNJTV9DUFUgKik7Cit2b2lkIG0zMnJiZl9oX2FjY3VtX3NldCAoU0lNX0NQVSAqLCBESSk7CitESSBtMzJyYmZfaF9hY2N1bXNfZ2V0IChTSU1fQ1BVICosIFVJTlQpOwordm9pZCBtMzJyYmZfaF9hY2N1bXNfc2V0IChTSU1fQ1BVICosIFVJTlQsIERJKTsKK0JJIG0zMnJiZl9oX2NvbmRfZ2V0IChTSU1fQ1BVICopOwordm9pZCBtMzJyYmZfaF9jb25kX3NldCAoU0lNX0NQVSAqLCBCSSk7CitVUUkgbTMycmJmX2hfcHN3X2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgbTMycmJmX2hfcHN3X3NldCAoU0lNX0NQVSAqLCBVUUkpOworVVFJIG0zMnJiZl9oX2Jwc3dfZ2V0IChTSU1fQ1BVICopOwordm9pZCBtMzJyYmZfaF9icHN3X3NldCAoU0lNX0NQVSAqLCBVUUkpOworVVFJIG0zMnJiZl9oX2JicHN3X2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgbTMycmJmX2hfYmJwc3dfc2V0IChTSU1fQ1BVICosIFVRSSk7CitCSSBtMzJyYmZfaF9sb2NrX2dldCAoU0lNX0NQVSAqKTsKK3ZvaWQgbTMycmJmX2hfbG9ja19zZXQgKFNJTV9DUFUgKiwgQkkpOworCisvKiBUaGVzZSBtdXN0IGJlIGhhbmQtd3JpdHRlbi4gICovCitleHRlcm4gQ1BVUkVHX0ZFVENIX0ZOIG0zMnJiZl9mZXRjaF9yZWdpc3RlcjsKK2V4dGVybiBDUFVSRUdfU1RPUkVfRk4gbTMycmJmX3N0b3JlX3JlZ2lzdGVyOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFVJTlQgaF9ncjsKK30gTU9ERUxfTTMyUl9EX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGVtcHR5OworfSBNT0RFTF9URVNUX0RBVEE7CisKK3VuaW9uIHNlbV9maWVsZHMgeworICAgIHN0cnVjdCB7IC8qIGVtcHR5IHNmb3JtYXQgZm9yIHVuc3BlY2lmaWVkIGZpZWxkIGxpc3QgKi8KKyAgICAgIGludCBlbXB0eTsKKyAgICB9IGZtdF9lbXB0eTsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGFkZCAkZHIsJHNyICovCisgICAgICBTSSAqIGlfZHI7CisgICAgICBTSSAqIGlfc3I7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2RyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RyOworICAgIH0gZm10X2FkZDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGFkZDMgJGRyLCRzciwkaGFzaCRzbG8xNiAqLworICAgICAgSU5UIGZfc2ltbTE2OworICAgICAgU0kgKiBpX3NyOworICAgICAgU0kgKiBpX2RyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RyOworICAgIH0gZm10X2FkZDM7CisgICAgc3RydWN0IHsgLyogZS5nLiBhbmQzICRkciwkc3IsJHVpbW0xNiAqLworICAgICAgVUlOVCBmX3VpbW0xNjsKKyAgICAgIFNJICogaV9zcjsKKyAgICAgIFNJICogaV9kcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3I7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKKyAgICB9IGZtdF9hbmQzOworICAgIHN0cnVjdCB7IC8qIGUuZy4gb3IzICRkciwkc3IsJGhhc2gkdWxvMTYgKi8KKyAgICAgIFVJTlQgZl91aW1tMTY7CisgICAgICBTSSAqIGlfc3I7CisgICAgICBTSSAqIGlfZHI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHI7CisgICAgfSBmbXRfb3IzOworICAgIHN0cnVjdCB7IC8qIGUuZy4gYWRkaSAkZHIsJHNpbW04ICovCisgICAgICBJTlQgZl9zaW1tODsKKyAgICAgIFNJICogaV9kcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fZHI7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKKyAgICB9IGZtdF9hZGRpOworICAgIHN0cnVjdCB7IC8qIGUuZy4gYWRkdiAkZHIsJHNyICovCisgICAgICBTSSAqIGlfZHI7CisgICAgICBTSSAqIGlfc3I7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2RyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RyOworICAgIH0gZm10X2FkZHY7CisgICAgc3RydWN0IHsgLyogZS5nLiBhZGR2MyAkZHIsJHNyLCRzaW1tMTYgKi8KKyAgICAgIElOVCBmX3NpbW0xNjsKKyAgICAgIFNJICogaV9zcjsKKyAgICAgIFNJICogaV9kcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3I7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKKyAgICB9IGZtdF9hZGR2MzsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGFkZHggJGRyLCRzciAqLworICAgICAgU0kgKiBpX2RyOworICAgICAgU0kgKiBpX3NyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9kcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3I7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKKyAgICB9IGZtdF9hZGR4OworICAgIHN0cnVjdCB7IC8qIGUuZy4gY21wICRzcmMxLCRzcmMyICovCisgICAgICBTSSAqIGlfc3JjMTsKKyAgICAgIFNJICogaV9zcmMyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMxOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMyOworICAgIH0gZm10X2NtcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGNtcGkgJHNyYzIsJHNpbW0xNiAqLworICAgICAgSU5UIGZfc2ltbTE2OworICAgICAgU0kgKiBpX3NyYzI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzI7CisgICAgfSBmbXRfY21waTsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGRpdiAkZHIsJHNyICovCisgICAgICBTSSAqIGlfZHI7CisgICAgICBTSSAqIGlfc3I7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2RyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RyOworICAgIH0gZm10X2RpdjsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkICRkcixAJHNyICovCisgICAgICBTSSAqIGlfc3I7CisgICAgICBTSSAqIGlfZHI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHI7CisgICAgfSBmbXRfbGQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZCAkZHIsQCgkc2xvMTYsJHNyKSAqLworICAgICAgSU5UIGZfc2ltbTE2OworICAgICAgU0kgKiBpX3NyOworICAgICAgU0kgKiBpX2RyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RyOworICAgIH0gZm10X2xkX2Q7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZGIgJGRyLEAkc3IgKi8KKyAgICAgIFNJICogaV9zcjsKKyAgICAgIFNJICogaV9kcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3I7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKKyAgICB9IGZtdF9sZGI7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZGIgJGRyLEAoJHNsbzE2LCRzcikgKi8KKyAgICAgIElOVCBmX3NpbW0xNjsKKyAgICAgIFNJICogaV9zcjsKKyAgICAgIFNJICogaV9kcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3I7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKKyAgICB9IGZtdF9sZGJfZDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkaCAkZHIsQCRzciAqLworICAgICAgU0kgKiBpX3NyOworICAgICAgU0kgKiBpX2RyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RyOworICAgIH0gZm10X2xkaDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkaCAkZHIsQCgkc2xvMTYsJHNyKSAqLworICAgICAgSU5UIGZfc2ltbTE2OworICAgICAgU0kgKiBpX3NyOworICAgICAgU0kgKiBpX2RyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RyOworICAgIH0gZm10X2xkaF9kOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGQgJGRyLEAkc3IrICovCisgICAgICBTSSAqIGlfc3I7CisgICAgICBTSSAqIGlfZHI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHI7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9zcjsKKyAgICB9IGZtdF9sZF9wbHVzOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbGQyNCAkZHIsJHVpbW0yNCAqLworICAgICAgQUREUiBpX3VpbW0yNDsKKyAgICAgIFNJICogaV9kcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RyOworICAgIH0gZm10X2xkMjQ7CisgICAgc3RydWN0IHsgLyogZS5nLiBsZGk4ICRkciwkc2ltbTggKi8KKyAgICAgIElOVCBmX3NpbW04OworICAgICAgU0kgKiBpX2RyOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHI7CisgICAgfSBmbXRfbGRpODsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGxkaTE2ICRkciwkaGFzaCRzbG8xNiAqLworICAgICAgSU5UIGZfc2ltbTE2OworICAgICAgU0kgKiBpX2RyOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHI7CisgICAgfSBmbXRfbGRpMTY7CisgICAgc3RydWN0IHsgLyogZS5nLiBsb2NrICRkcixAJHNyICovCisgICAgICBTSSAqIGlfc3I7CisgICAgICBTSSAqIGlfZHI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHI7CisgICAgfSBmbXRfbG9jazsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIG1hY2hpICRzcmMxLCRzcmMyICovCisgICAgICBTSSAqIGlfc3JjMTsKKyAgICAgIFNJICogaV9zcmMyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMxOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMyOworICAgIH0gZm10X21hY2hpOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbXVsaGkgJHNyYzEsJHNyYzIgKi8KKyAgICAgIFNJICogaV9zcmMxOworICAgICAgU0kgKiBpX3NyYzI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzE7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzI7CisgICAgfSBmbXRfbXVsaGk7CisgICAgc3RydWN0IHsgLyogZS5nLiBtdiAkZHIsJHNyICovCisgICAgICBTSSAqIGlfc3I7CisgICAgICBTSSAqIGlfZHI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHI7CisgICAgfSBmbXRfbXY7CisgICAgc3RydWN0IHsgLyogZS5nLiBtdmZhY2hpICRkciAqLworICAgICAgU0kgKiBpX2RyOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHI7CisgICAgfSBmbXRfbXZmYWNoaTsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIG12ZmMgJGRyLCRzY3IgKi8KKyAgICAgIFVJTlQgZl9yMjsKKyAgICAgIFNJICogaV9kcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2RyOworICAgIH0gZm10X212ZmM7CisgICAgc3RydWN0IHsgLyogZS5nLiBtdnRhY2hpICRzcmMxICovCisgICAgICBTSSAqIGlfc3JjMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMTsKKyAgICB9IGZtdF9tdnRhY2hpOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbXZ0YyAkc3IsJGRjciAqLworICAgICAgVUlOVCBmX3IxOworICAgICAgU0kgKiBpX3NyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcjsKKyAgICB9IGZtdF9tdnRjOworICAgIHN0cnVjdCB7IC8qIGUuZy4gbm9wICovCisgICAgICBpbnQgZW1wdHk7CisgICAgfSBmbXRfbm9wOworICAgIHN0cnVjdCB7IC8qIGUuZy4gcmFjICovCisgICAgICBpbnQgZW1wdHk7CisgICAgfSBmbXRfcmFjOworICAgIHN0cnVjdCB7IC8qIGUuZy4gc2V0aCAkZHIsJGhhc2gkaGkxNiAqLworICAgICAgVUlOVCBmX2hpMTY7CisgICAgICBTSSAqIGlfZHI7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKKyAgICB9IGZtdF9zZXRoOworICAgIHN0cnVjdCB7IC8qIGUuZy4gc2xsMyAkZHIsJHNyLCRzaW1tMTYgKi8KKyAgICAgIElOVCBmX3NpbW0xNjsKKyAgICAgIFNJICogaV9zcjsKKyAgICAgIFNJICogaV9kcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3I7CisgICAgICB1bnNpZ25lZCBjaGFyIG91dF9kcjsKKyAgICB9IGZtdF9zbGwzOworICAgIHN0cnVjdCB7IC8qIGUuZy4gc2xsaSAkZHIsJHVpbW01ICovCisgICAgICBVSU5UIGZfdWltbTU7CisgICAgICBTSSAqIGlfZHI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX2RyOworICAgICAgdW5zaWduZWQgY2hhciBvdXRfZHI7CisgICAgfSBmbXRfc2xsaTsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0ICRzcmMxLEAkc3JjMiAqLworICAgICAgU0kgKiBpX3NyYzE7CisgICAgICBTSSAqIGlfc3JjMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMjsKKyAgICB9IGZtdF9zdDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHN0ICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLworICAgICAgSU5UIGZfc2ltbTE2OworICAgICAgU0kgKiBpX3NyYzE7CisgICAgICBTSSAqIGlfc3JjMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMjsKKyAgICB9IGZtdF9zdF9kOworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3RiICRzcmMxLEAkc3JjMiAqLworICAgICAgU0kgKiBpX3NyYzE7CisgICAgICBTSSAqIGlfc3JjMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMjsKKyAgICB9IGZtdF9zdGI7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdGIgJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCisgICAgICBJTlQgZl9zaW1tMTY7CisgICAgICBTSSAqIGlfc3JjMTsKKyAgICAgIFNJICogaV9zcmMyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMxOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMyOworICAgIH0gZm10X3N0Yl9kOworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3RoICRzcmMxLEAkc3JjMiAqLworICAgICAgU0kgKiBpX3NyYzE7CisgICAgICBTSSAqIGlfc3JjMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMjsKKyAgICB9IGZtdF9zdGg7CisgICAgc3RydWN0IHsgLyogZS5nLiBzdGggJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCisgICAgICBJTlQgZl9zaW1tMTY7CisgICAgICBTSSAqIGlfc3JjMTsKKyAgICAgIFNJICogaV9zcmMyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMxOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcmMyOworICAgIH0gZm10X3N0aF9kOworICAgIHN0cnVjdCB7IC8qIGUuZy4gc3QgJHNyYzEsQCskc3JjMiAqLworICAgICAgU0kgKiBpX3NyYzE7CisgICAgICBTSSAqIGlfc3JjMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X3NyYzI7CisgICAgfSBmbXRfc3RfcGx1czsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHVubG9jayAkc3JjMSxAJHNyYzIgKi8KKyAgICAgIFNJICogaV9zcmMxOworICAgICAgU0kgKiBpX3NyYzI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzE7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzI7CisgICAgfSBmbXRfdW5sb2NrOworICAvKiBjdGkgaW5zbnMsIGtlcHQgc2VwYXJhdGVseSBzbyBhZGRyX2NhY2hlIGlzIGluIGZpeGVkIHBsYWNlICovCisgIHN0cnVjdCB7CisgICAgdW5pb24geworICAgIHN0cnVjdCB7IC8qIGUuZy4gYmMucyAkZGlzcDggKi8KKyAgICAgIElBRERSIGlfZGlzcDg7CisgICAgfSBmbXRfYmM4OworICAgIHN0cnVjdCB7IC8qIGUuZy4gYmMubCAkZGlzcDI0ICovCisgICAgICBJQUREUiBpX2Rpc3AyNDsKKyAgICB9IGZtdF9iYzI0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gYmVxICRzcmMxLCRzcmMyLCRkaXNwMTYgKi8KKyAgICAgIElBRERSIGlfZGlzcDE2OworICAgICAgU0kgKiBpX3NyYzE7CisgICAgICBTSSAqIGlfc3JjMjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgaW5fc3JjMjsKKyAgICB9IGZtdF9iZXE7CisgICAgc3RydWN0IHsgLyogZS5nLiBiZXF6ICRzcmMyLCRkaXNwMTYgKi8KKyAgICAgIElBRERSIGlfZGlzcDE2OworICAgICAgU0kgKiBpX3NyYzI7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyYzI7CisgICAgfSBmbXRfYmVxejsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGJsLnMgJGRpc3A4ICovCisgICAgICBJQUREUiBpX2Rpc3A4OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xNDsKKyAgICB9IGZtdF9ibDg7CisgICAgc3RydWN0IHsgLyogZS5nLiBibC5sICRkaXNwMjQgKi8KKyAgICAgIElBRERSIGlfZGlzcDI0OworICAgICAgdW5zaWduZWQgY2hhciBvdXRfaF9ncl8xNDsKKyAgICB9IGZtdF9ibDI0OworICAgIHN0cnVjdCB7IC8qIGUuZy4gYnJhLnMgJGRpc3A4ICovCisgICAgICBJQUREUiBpX2Rpc3A4OworICAgIH0gZm10X2JyYTg7CisgICAgc3RydWN0IHsgLyogZS5nLiBicmEubCAkZGlzcDI0ICovCisgICAgICBJQUREUiBpX2Rpc3AyNDsKKyAgICB9IGZtdF9icmEyNDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIGpsICRzciAqLworICAgICAgU0kgKiBpX3NyOworICAgICAgdW5zaWduZWQgY2hhciBpbl9zcjsKKyAgICAgIHVuc2lnbmVkIGNoYXIgb3V0X2hfZ3JfMTQ7CisgICAgfSBmbXRfamw7CisgICAgc3RydWN0IHsgLyogZS5nLiBqbXAgJHNyICovCisgICAgICBTSSAqIGlfc3I7CisgICAgICB1bnNpZ25lZCBjaGFyIGluX3NyOworICAgIH0gZm10X2ptcDsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHJ0ZSAqLworICAgICAgaW50IGVtcHR5OworICAgIH0gZm10X3J0ZTsKKyAgICBzdHJ1Y3QgeyAvKiBlLmcuIHRyYXAgJHVpbW00ICovCisgICAgICBVSU5UIGZfdWltbTQ7CisgICAgfSBmbXRfdHJhcDsKKyAgICB9IGZpZWxkczsKKyNpZiBXSVRIX1NDQUNIRV9QQkIKKyAgICBTRU1fUEMgYWRkcl9jYWNoZTsKKyNlbmRpZgorICB9IGN0aTsKKyNpZiBXSVRIX1NDQUNIRV9QQkIKKyAgLyogV3JpdGViYWNrIGhhbmRsZXIuICAqLworICBzdHJ1Y3QgeworICAgIC8qIFBvaW50ZXIgdG8gYXJnYnVmIGVudHJ5IGZvciBpbnNuIHdob3NlIHJlc3VsdHMgbmVlZCB3cml0aW5nIGJhY2suICAqLworICAgIGNvbnN0IHN0cnVjdCBhcmdidWYgKmFidWY7CisgIH0gd3JpdGU7CisgIC8qIHgtYmVmb3JlIGhhbmRsZXIgKi8KKyAgc3RydWN0IHsKKyAgICAvKmNvbnN0IFNDQUNIRSAqaW5zbnNbTUFYX1BBUkFMTEVMX0lOU05TXTsqLworICAgIGludCBmaXJzdF9wOworICB9IGJlZm9yZTsKKyAgLyogeC1hZnRlciBoYW5kbGVyICovCisgIHN0cnVjdCB7CisgICAgaW50IGVtcHR5OworICB9IGFmdGVyOworICAvKiBUaGlzIGVudHJ5IGlzIHVzZWQgdG8gdGVybWluYXRlIGVhY2ggcGJiLiAgKi8KKyAgc3RydWN0IHsKKyAgICAvKiBOdW1iZXIgb2YgaW5zbnMgaW4gcGJiLiAgKi8KKyAgICBpbnQgaW5zbl9jb3VudDsKKyAgICAvKiBOZXh0IHBiYiB0byBleGVjdXRlLiAgKi8KKyAgICBTQ0FDSEUgKm5leHQ7CisgIH0gY2hhaW47CisjZW5kaWYKK307CisKKy8qIFRoZSBBUkdCVUYgc3RydWN0LiAgKi8KK3N0cnVjdCBhcmdidWYgeworICAvKiBUaGVzZSBhcmUgdGhlIGJhc2VjbGFzcyBkZWZpbml0aW9ucy4gICovCisgIElBRERSIGFkZHI7CisgIGNvbnN0IElERVNDICppZGVzYzsKKyAgY2hhciB0cmFjZV9wOworICBjaGFyIHByb2ZpbGVfcDsKKyAgLyogY3B1IHNwZWNpZmljIGRhdGEgZm9sbG93cyAqLworICB1bmlvbiBzZW0gc2VtYW50aWM7CisgIGludCB3cml0dGVuOworICB1bmlvbiBzZW1fZmllbGRzIGZpZWxkczsKK307CisKKy8qIEEgY2FjaGVkIGluc24uCisKKyAgID8/PyBTQ0FDSEUgdXNlZCB0byBjb250YWluIG1vcmUgdGhhbiBqdXN0IGFyZ2J1Zi4gIFdlIGNvdWxkIGRlbGV0ZSB0aGUKKyAgIHR5cGUgZW50aXJlbHkgYW5kIGFsd2F5cyBqdXN0IHVzZSBBUkdCVUYsIGJ1dCBmb3IgZnV0dXJlIGNvbmNlcm5zIGFuZCBhcworICAgYSBsZXZlbCBvZiBhYnN0cmFjdGlvbiBpdCBpcyBsZWZ0IGluLiAgKi8KKworc3RydWN0IHNjYWNoZSB7CisgIHN0cnVjdCBhcmdidWYgYXJnYnVmOworfTsKKworLyogTWFjcm9zIHRvIHNpbXBsaWZ5IGV4dHJhY3Rpb24sIHJlYWRpbmcgYW5kIHNlbWFudGljIGNvZGUuCisgICBUaGVzZSBkZWZpbmUgYW5kIGFzc2lnbiB0aGUgbG9jYWwgdmFycyB0aGF0IGNvbnRhaW4gdGhlIGluc24ncyBmaWVsZHMuICAqLworCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9FTVBUWV9WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfRU1QVFlfQ09ERSBcCisgIGxlbmd0aCA9IDA7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfQUREX1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgVUlOVCBmX3IxOyBcCisgIFVJTlQgZl9vcDI7IFwKKyAgVUlOVCBmX3IyOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9BRERfQ09ERSBcCisgIGxlbmd0aCA9IDI7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAorICBmX3IxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAorICBmX3IyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0FERDNfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfcjE7IFwKKyAgVUlOVCBmX29wMjsgXAorICBVSU5UIGZfcjI7IFwKKyAgSU5UIGZfc2ltbTE2OyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9BREQzX0NPREUgXAorICBsZW5ndGggPSA0OyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKKyAgZl9yMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDQsIDQpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgOCwgNCk7IFwKKyAgZl9yMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAorICBmX3NpbW0xNiA9IEVYVFJBQ1RfSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsgXAorCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9BTkQzX1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgVUlOVCBmX3IxOyBcCisgIFVJTlQgZl9vcDI7IFwKKyAgVUlOVCBmX3IyOyBcCisgIFVJTlQgZl91aW1tMTY7IFwKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0FORDNfQ09ERSBcCisgIGxlbmd0aCA9IDQ7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAwLCA0KTsgXAorICBmX3IxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCA4LCA0KTsgXAorICBmX3IyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOyBcCisgIGZfdWltbTE2ID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsgXAorCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9PUjNfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfcjE7IFwKKyAgVUlOVCBmX29wMjsgXAorICBVSU5UIGZfcjI7IFwKKyAgVUlOVCBmX3VpbW0xNjsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfT1IzX0NPREUgXAorICBsZW5ndGggPSA0OyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKKyAgZl9yMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDQsIDQpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgOCwgNCk7IFwKKyAgZl9yMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAorICBmX3VpbW0xNiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDE2LCAxNik7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfQURESV9WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICBVSU5UIGZfb3AxOyBcCisgIFVJTlQgZl9yMTsgXAorICBJTlQgZl9zaW1tODsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfQURESV9DT0RFIFwKKyAgbGVuZ3RoID0gMjsgXAorICBmX29wMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCisgIGZfcjEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAorICBmX3NpbW04ID0gRVhUUkFDVF9JTlQgKGluc24sIDE2LCA4LCA4KTsgXAorCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9BRERWM19WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICBVSU5UIGZfb3AxOyBcCisgIFVJTlQgZl9yMTsgXAorICBVSU5UIGZfb3AyOyBcCisgIFVJTlQgZl9yMjsgXAorICBJTlQgZl9zaW1tMTY7IFwKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0FERFYzX0NPREUgXAorICBsZW5ndGggPSA0OyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKKyAgZl9yMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDQsIDQpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgOCwgNCk7IFwKKyAgZl9yMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAorICBmX3NpbW0xNiA9IEVYVFJBQ1RfSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsgXAorCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9CQzhfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfcjE7IFwKKyAgU0kgZl9kaXNwODsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfQkM4X0NPREUgXAorICBsZW5ndGggPSAyOyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKKyAgZl9yMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCisgIGZfZGlzcDggPSAoKCgoRVhUUkFDVF9JTlQgKGluc24sIDE2LCA4LCA4KSkgPDwgKDIpKSkgKyAoKChwYykgJiAoLTQpKSkpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0JDMjRfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfcjE7IFwKKyAgU0kgZl9kaXNwMjQ7IFwKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0JDMjRfQ09ERSBcCisgIGxlbmd0aCA9IDQ7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAwLCA0KTsgXAorICBmX3IxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKKyAgZl9kaXNwMjQgPSAoKCgoRVhUUkFDVF9JTlQgKGluc24sIDMyLCA4LCAyNCkpIDw8ICgyKSkpICsgKHBjKSk7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfQkVRX1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgVUlOVCBmX3IxOyBcCisgIFVJTlQgZl9vcDI7IFwKKyAgVUlOVCBmX3IyOyBcCisgIFNJIGZfZGlzcDE2OyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9CRVFfQ09ERSBcCisgIGxlbmd0aCA9IDQ7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAwLCA0KTsgXAorICBmX3IxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCA4LCA0KTsgXAorICBmX3IyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOyBcCisgIGZfZGlzcDE2ID0gKCgoKEVYVFJBQ1RfSU5UIChpbnNuLCAzMiwgMTYsIDE2KSkgPDwgKDIpKSkgKyAocGMpKTsgXAorCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9CRVFaX1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgVUlOVCBmX3IxOyBcCisgIFVJTlQgZl9vcDI7IFwKKyAgVUlOVCBmX3IyOyBcCisgIFNJIGZfZGlzcDE2OyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9CRVFaX0NPREUgXAorICBsZW5ndGggPSA0OyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKKyAgZl9yMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDQsIDQpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgOCwgNCk7IFwKKyAgZl9yMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAorICBmX2Rpc3AxNiA9ICgoKChFWFRSQUNUX0lOVCAoaW5zbiwgMzIsIDE2LCAxNikpIDw8ICgyKSkpICsgKHBjKSk7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfQ01QX1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgVUlOVCBmX3IxOyBcCisgIFVJTlQgZl9vcDI7IFwKKyAgVUlOVCBmX3IyOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9DTVBfQ09ERSBcCisgIGxlbmd0aCA9IDI7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAorICBmX3IxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAorICBmX3IyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0NNUElfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfcjE7IFwKKyAgVUlOVCBmX29wMjsgXAorICBVSU5UIGZfcjI7IFwKKyAgSU5UIGZfc2ltbTE2OyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9DTVBJX0NPREUgXAorICBsZW5ndGggPSA0OyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKKyAgZl9yMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDQsIDQpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgOCwgNCk7IFwKKyAgZl9yMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAorICBmX3NpbW0xNiA9IEVYVFJBQ1RfSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsgXAorCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9ESVZfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfcjE7IFwKKyAgVUlOVCBmX29wMjsgXAorICBVSU5UIGZfcjI7IFwKKyAgSU5UIGZfc2ltbTE2OyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9ESVZfQ09ERSBcCisgIGxlbmd0aCA9IDQ7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAwLCA0KTsgXAorICBmX3IxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCA4LCA0KTsgXAorICBmX3IyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOyBcCisgIGZfc2ltbTE2ID0gRVhUUkFDVF9JTlQgKGluc24sIDMyLCAxNiwgMTYpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0pMX1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgVUlOVCBmX3IxOyBcCisgIFVJTlQgZl9vcDI7IFwKKyAgVUlOVCBmX3IyOyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9KTF9DT0RFIFwKKyAgbGVuZ3RoID0gMjsgXAorICBmX29wMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDAsIDQpOyBcCisgIGZfcjEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA0LCA0KTsgXAorICBmX29wMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDgsIDQpOyBcCisgIGZfcjIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAxMiwgNCk7IFwKKworI2RlZmluZSBFWFRSQUNUX0lGTVRfTEQyNF9WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICBVSU5UIGZfb3AxOyBcCisgIFVJTlQgZl9yMTsgXAorICBVSU5UIGZfdWltbTI0OyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9MRDI0X0NPREUgXAorICBsZW5ndGggPSA0OyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKKyAgZl9yMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDQsIDQpOyBcCisgIGZfdWltbTI0ID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgOCwgMjQpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX0xESTE2X1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgVUlOVCBmX3IxOyBcCisgIFVJTlQgZl9vcDI7IFwKKyAgVUlOVCBmX3IyOyBcCisgIElOVCBmX3NpbW0xNjsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfTERJMTZfQ09ERSBcCisgIGxlbmd0aCA9IDQ7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAwLCA0KTsgXAorICBmX3IxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgNCwgNCk7IFwKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCA4LCA0KTsgXAorICBmX3IyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMTIsIDQpOyBcCisgIGZfc2ltbTE2ID0gRVhUUkFDVF9JTlQgKGluc24sIDMyLCAxNiwgMTYpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX01WRkFDSElfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfcjE7IFwKKyAgVUlOVCBmX29wMjsgXAorICBVSU5UIGZfcjI7IFwKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX01WRkFDSElfQ09ERSBcCisgIGxlbmd0aCA9IDI7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAorICBmX3IxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAorICBmX3IyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX01WRkNfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfcjE7IFwKKyAgVUlOVCBmX29wMjsgXAorICBVSU5UIGZfcjI7IFwKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX01WRkNfQ09ERSBcCisgIGxlbmd0aCA9IDI7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAorICBmX3IxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAorICBmX3IyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX01WVEFDSElfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfcjE7IFwKKyAgVUlOVCBmX29wMjsgXAorICBVSU5UIGZfcjI7IFwKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX01WVEFDSElfQ09ERSBcCisgIGxlbmd0aCA9IDI7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAorICBmX3IxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAorICBmX3IyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX01WVENfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfcjE7IFwKKyAgVUlOVCBmX29wMjsgXAorICBVSU5UIGZfcjI7IFwKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX01WVENfQ09ERSBcCisgIGxlbmd0aCA9IDI7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAorICBmX3IxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKKyAgZl9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA4LCA0KTsgXAorICBmX3IyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMTIsIDQpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX05PUF9WQVJTIFwKKyAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLiAgKi8gXAorICBVSU5UIGZfb3AxOyBcCisgIFVJTlQgZl9yMTsgXAorICBVSU5UIGZfb3AyOyBcCisgIFVJTlQgZl9yMjsgXAorICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworI2RlZmluZSBFWFRSQUNUX0lGTVRfTk9QX0NPREUgXAorICBsZW5ndGggPSAyOyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKKyAgZl9yMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7IFwKKyAgZl9yMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsgXAorCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9TRVRIX1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgVUlOVCBmX3IxOyBcCisgIFVJTlQgZl9vcDI7IFwKKyAgVUlOVCBmX3IyOyBcCisgIFVJTlQgZl9oaTE2OyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9TRVRIX0NPREUgXAorICBsZW5ndGggPSA0OyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKKyAgZl9yMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDQsIDQpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgOCwgNCk7IFwKKyAgZl9yMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAorICBmX2hpMTYgPSBFWFRSQUNUX1VJTlQgKGluc24sIDMyLCAxNiwgMTYpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX1NMTElfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfcjE7IFwKKyAgVUlOVCBmX3NoaWZ0X29wMjsgXAorICBVSU5UIGZfdWltbTU7IFwKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX1NMTElfQ09ERSBcCisgIGxlbmd0aCA9IDI7IFwKKyAgZl9vcDEgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCAwLCA0KTsgXAorICBmX3IxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgNCwgNCk7IFwKKyAgZl9zaGlmdF9vcDIgPSBFWFRSQUNUX1VJTlQgKGluc24sIDE2LCA4LCAzKTsgXAorICBmX3VpbW01ID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMTEsIDUpOyBcCisKKyNkZWZpbmUgRVhUUkFDVF9JRk1UX1NUX0RfVkFSUyBcCisgIC8qIEluc3RydWN0aW9uIGZpZWxkcy4gICovIFwKKyAgVUlOVCBmX29wMTsgXAorICBVSU5UIGZfcjE7IFwKKyAgVUlOVCBmX29wMjsgXAorICBVSU5UIGZfcjI7IFwKKyAgSU5UIGZfc2ltbTE2OyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9TVF9EX0NPREUgXAorICBsZW5ndGggPSA0OyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgMCwgNCk7IFwKKyAgZl9yMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDQsIDQpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAzMiwgOCwgNCk7IFwKKyAgZl9yMiA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMzIsIDEyLCA0KTsgXAorICBmX3NpbW0xNiA9IEVYVFJBQ1RfSU5UIChpbnNuLCAzMiwgMTYsIDE2KTsgXAorCisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9UUkFQX1ZBUlMgXAorICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLyBcCisgIFVJTlQgZl9vcDE7IFwKKyAgVUlOVCBmX3IxOyBcCisgIFVJTlQgZl9vcDI7IFwKKyAgVUlOVCBmX3VpbW00OyBcCisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisjZGVmaW5lIEVYVFJBQ1RfSUZNVF9UUkFQX0NPREUgXAorICBsZW5ndGggPSAyOyBcCisgIGZfb3AxID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgMCwgNCk7IFwKKyAgZl9yMSA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDQsIDQpOyBcCisgIGZfb3AyID0gRVhUUkFDVF9VSU5UIChpbnNuLCAxNiwgOCwgNCk7IFwKKyAgZl91aW1tNCA9IEVYVFJBQ1RfVUlOVCAoaW5zbiwgMTYsIDEyLCA0KTsgXAorCisvKiBDb2xsZWN0aW9uIG9mIHZhcmlvdXMgdGhpbmdzIGZvciB0aGUgdHJhY2UgaGFuZGxlciB0byB1c2UuICAqLworCit0eXBlZGVmIHN0cnVjdCB0cmFjZV9yZWNvcmQgeworICBJQUREUiBwYzsKKyAgLyogRklYTUU6d2lwICovCit9IFRSQUNFX1JFQ09SRDsKKworI2VuZGlmIC8qIENQVV9NMzJSQkZfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvY3B1YWxsLmggYi9zaW0vbTMyci9jcHVhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTYzZjc0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL20zMnIvY3B1YWxsLmgKQEAgLTAsMCArMSw3MCBAQAorLyogU2ltdWxhdG9yIENQVSBoZWFkZXIgZm9yIG0zMnIuCisKK1RISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCisKK0NvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyovCisKKyNpZm5kZWYgTTMyUl9DUFVBTExfSAorI2RlZmluZSBNMzJSX0NQVUFMTF9ICisKKy8qIEluY2x1ZGUgZmlsZXMgZm9yIGVhY2ggY3B1IGZhbWlseS4gICovCisKKyNpZmRlZiBXQU5UX0NQVV9NMzJSQkYKKyNpbmNsdWRlICJlbmcuaCIKKyNpbmNsdWRlICJjZ2VuLWVuZ2luZS5oIgorI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgImRlY29kZS5oIgorI2VuZGlmCisKKyNpZmRlZiBXQU5UX0NQVV9NMzJSWEYKKyNpbmNsdWRlICJlbmd4LmgiCisjaW5jbHVkZSAiY2dlbi1lbmdpbmUuaCIKKyNpbmNsdWRlICJjcHV4LmgiCisjaW5jbHVkZSAiZGVjb2RleC5oIgorI2VuZGlmCisKK2V4dGVybiBjb25zdCBNQUNIIG0zMnJfbWFjaDsKKworI2lmbmRlZiBXQU5UX0NQVQorLyogVGhlIEFSR0JVRiBzdHJ1Y3QuICAqLworc3RydWN0IGFyZ2J1ZiB7CisgIC8qIFRoZXNlIGFyZSB0aGUgYmFzZWNsYXNzIGRlZmluaXRpb25zLiAgKi8KKyAgSUFERFIgYWRkcjsKKyAgY29uc3QgSURFU0MgKmlkZXNjOworICBjaGFyIHRyYWNlX3A7CisgIGNoYXIgcHJvZmlsZV9wOworICAvKiBjcHUgc3BlY2lmaWMgZGF0YSBmb2xsb3dzICovCit9OworI2VuZGlmCisKKyNpZm5kZWYgV0FOVF9DUFUKKy8qIEEgY2FjaGVkIGluc24uCisKKyAgID8/PyBTQ0FDSEUgdXNlZCB0byBjb250YWluIG1vcmUgdGhhbiBqdXN0IGFyZ2J1Zi4gIFdlIGNvdWxkIGRlbGV0ZSB0aGUKKyAgIHR5cGUgZW50aXJlbHkgYW5kIGFsd2F5cyBqdXN0IHVzZSBBUkdCVUYsIGJ1dCBmb3IgZnV0dXJlIGNvbmNlcm5zIGFuZCBhcworICAgYSBsZXZlbCBvZiBhYnN0cmFjdGlvbiBpdCBpcyBsZWZ0IGluLiAgKi8KKworc3RydWN0IHNjYWNoZSB7CisgIHN0cnVjdCBhcmdidWYgYXJnYnVmOworfTsKKyNlbmRpZgorCisjZW5kaWYgLyogTTMyUl9DUFVBTExfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvZGVjb2RlLmMgYi9zaW0vbTMyci9kZWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzkxM2FmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL20zMnIvZGVjb2RlLmMKQEAgLTAsMCArMSwxOTk2IEBACisvKiBTaW11bGF0b3IgaW5zdHJ1Y3Rpb24gZGVjb2RlciBmb3IgbTMycmJmLgorCitUSElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgorCitDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisqLworCisjZGVmaW5lIFdBTlRfQ1BVIG0zMnJiZgorI2RlZmluZSBXQU5UX0NQVV9NMzJSQkYKKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAic2ltLWFzc2VydC5oIgorCisvKiBGSVhNRTogTmVlZCB0byByZXZpZXcgY2hvaWNlcyBmb3IgdGhlIGZvbGxvd2luZy4gICovCisKKyNpZiBXSVRIX1NFTV9TV0lUQ0hfRlVMTAorI2RlZmluZSBGVUxMKGZuKQorI2Vsc2UKKyNkZWZpbmUgRlVMTChmbikgQ09OQ0FUMyAobTMycmJmLF9zZW1fLGZuKSAsCisjZW5kaWYKKworI2lmIFdJVEhfRkFTVAorI2lmIFdJVEhfU0VNX1NXSVRDSF9GQVNUCisjZGVmaW5lIEZBU1QoZm4pCisjZWxzZQorI2RlZmluZSBGQVNUKGZuKSBDT05DQVQzIChtMzJyYmYsX3NlbWZfLGZuKSAsIC8qIGYgZm9yIGZhc3QgKi8KKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgRkFTVChmbikKKyNlbmRpZgorCisvKiBUaGUgaW5zdHJ1Y3Rpb24gZGVzY3JpcHRvciBhcnJheS4KKyAgIFRoaXMgaXMgY29tcHV0ZWQgYXQgcnVudGltZS4gIFNwYWNlIGZvciBpdCBpcyBub3QgbWFsbG9jJ2QgdG8gc2F2ZSBhCisgICB0ZWVuc3kgYml0IG9mIGNwdSBpbiB0aGUgZGVjb2Rlci4gIE1vdmluZyBpdCB0byBtYWxsb2Mgc3BhY2UgaXMgdHJpdmlhbAorICAgYnV0IHdvbid0IGJlIGRvbmUgdW50aWwgbmVjZXNzYXJ5ICh3ZSBkb24ndCBjdXJyZW50bHkgc3VwcG9ydCB0aGUgcnVudGltZQorICAgYWRkaXRpb24gb2YgaW5zdHJ1Y3Rpb25zIG5vciBhbiBTTVAgbWFjaGluZSB3aXRoIGRpZmZlcmVudCBjcHVzKS4gICovCitzdGF0aWMgSURFU0MgbTMycmJmX2luc25fZGF0YVtNMzJSQkZfSU5TTl9NQVhdOworCisvKiBUaGUgSU5TTl8gcHJlZml4IGlzIG5vdCBoZXJlIGFuZCBpcyBpbnN0ZWFkIHBhcnQgb2YgdGhlIGBpbnNuJyBhcmd1bWVudAorICAgdG8gYXZvaWQgY29sbGlzaW9ucyB3aXRoIGhlYWRlciBmaWxlcyAoZS5nLiBgQU5EJyBpbiBhbnNpZGVjbC5oKS4gICovCisjZGVmaW5lIElEWChpbnNuKSBDT05DQVQyIChNMzJSQkZfLGluc24pCisjZGVmaW5lIFRZUEUoaW5zbikgQ09OQ0FUMiAoTTMyUl8saW5zbikKKworLyogQ29tbWFzIGJldHdlZW4gZWxlbWVudHMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgbWFjcm9zLgorICAgU29tZSBvZiB0aGVzZSBhcmUgY29uZGl0aW9uYWxseSBjb21waWxlZCBvdXQuICAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGluc25fc2VtIG0zMnJiZl9pbnNuX3NlbVtdID0KK3sKKyAgeyBWSVJUVUFMX0lOU05fWF9JTlZBTElELCBJRFggKElOU05fWF9JTlZBTElEKSwgRlVMTCAoeF9pbnZhbGlkKSBGQVNUICh4X2ludmFsaWQpIH0sCisgIHsgVklSVFVBTF9JTlNOX1hfQUZURVIsIElEWCAoSU5TTl9YX0FGVEVSKSwgRlVMTCAoeF9hZnRlcikgRkFTVCAoeF9hZnRlcikgfSwKKyAgeyBWSVJUVUFMX0lOU05fWF9CRUZPUkUsIElEWCAoSU5TTl9YX0JFRk9SRSksIEZVTEwgKHhfYmVmb3JlKSBGQVNUICh4X2JlZm9yZSkgfSwKKyAgeyBWSVJUVUFMX0lOU05fWF9DVElfQ0hBSU4sIElEWCAoSU5TTl9YX0NUSV9DSEFJTiksIEZVTEwgKHhfY3RpX2NoYWluKSBGQVNUICh4X2N0aV9jaGFpbikgfSwKKyAgeyBWSVJUVUFMX0lOU05fWF9DSEFJTiwgSURYIChJTlNOX1hfQ0hBSU4pLCBGVUxMICh4X2NoYWluKSBGQVNUICh4X2NoYWluKSB9LAorICB7IFZJUlRVQUxfSU5TTl9YX0JFR0lOLCBJRFggKElOU05fWF9CRUdJTiksIEZVTEwgKHhfYmVnaW4pIEZBU1QgKHhfYmVnaW4pIH0sCisgIHsgVFlQRSAoSU5TTl9BREQpLCBJRFggKElOU05fQUREKSwgRlVMTCAoYWRkKSBGQVNUIChhZGQpIH0sCisgIHsgVFlQRSAoSU5TTl9BREQzKSwgSURYIChJTlNOX0FERDMpLCBGVUxMIChhZGQzKSBGQVNUIChhZGQzKSB9LAorICB7IFRZUEUgKElOU05fQU5EKSwgSURYIChJTlNOX0FORCksIEZVTEwgKGFuZCkgRkFTVCAoYW5kKSB9LAorICB7IFRZUEUgKElOU05fQU5EMyksIElEWCAoSU5TTl9BTkQzKSwgRlVMTCAoYW5kMykgRkFTVCAoYW5kMykgfSwKKyAgeyBUWVBFIChJTlNOX09SKSwgSURYIChJTlNOX09SKSwgRlVMTCAob3IpIEZBU1QgKG9yKSB9LAorICB7IFRZUEUgKElOU05fT1IzKSwgSURYIChJTlNOX09SMyksIEZVTEwgKG9yMykgRkFTVCAob3IzKSB9LAorICB7IFRZUEUgKElOU05fWE9SKSwgSURYIChJTlNOX1hPUiksIEZVTEwgKHhvcikgRkFTVCAoeG9yKSB9LAorICB7IFRZUEUgKElOU05fWE9SMyksIElEWCAoSU5TTl9YT1IzKSwgRlVMTCAoeG9yMykgRkFTVCAoeG9yMykgfSwKKyAgeyBUWVBFIChJTlNOX0FEREkpLCBJRFggKElOU05fQURESSksIEZVTEwgKGFkZGkpIEZBU1QgKGFkZGkpIH0sCisgIHsgVFlQRSAoSU5TTl9BRERWKSwgSURYIChJTlNOX0FERFYpLCBGVUxMIChhZGR2KSBGQVNUIChhZGR2KSB9LAorICB7IFRZUEUgKElOU05fQUREVjMpLCBJRFggKElOU05fQUREVjMpLCBGVUxMIChhZGR2MykgRkFTVCAoYWRkdjMpIH0sCisgIHsgVFlQRSAoSU5TTl9BRERYKSwgSURYIChJTlNOX0FERFgpLCBGVUxMIChhZGR4KSBGQVNUIChhZGR4KSB9LAorICB7IFRZUEUgKElOU05fQkM4KSwgSURYIChJTlNOX0JDOCksIEZVTEwgKGJjOCkgRkFTVCAoYmM4KSB9LAorICB7IFRZUEUgKElOU05fQkMyNCksIElEWCAoSU5TTl9CQzI0KSwgRlVMTCAoYmMyNCkgRkFTVCAoYmMyNCkgfSwKKyAgeyBUWVBFIChJTlNOX0JFUSksIElEWCAoSU5TTl9CRVEpLCBGVUxMIChiZXEpIEZBU1QgKGJlcSkgfSwKKyAgeyBUWVBFIChJTlNOX0JFUVopLCBJRFggKElOU05fQkVRWiksIEZVTEwgKGJlcXopIEZBU1QgKGJlcXopIH0sCisgIHsgVFlQRSAoSU5TTl9CR0VaKSwgSURYIChJTlNOX0JHRVopLCBGVUxMIChiZ2V6KSBGQVNUIChiZ2V6KSB9LAorICB7IFRZUEUgKElOU05fQkdUWiksIElEWCAoSU5TTl9CR1RaKSwgRlVMTCAoYmd0eikgRkFTVCAoYmd0eikgfSwKKyAgeyBUWVBFIChJTlNOX0JMRVopLCBJRFggKElOU05fQkxFWiksIEZVTEwgKGJsZXopIEZBU1QgKGJsZXopIH0sCisgIHsgVFlQRSAoSU5TTl9CTFRaKSwgSURYIChJTlNOX0JMVFopLCBGVUxMIChibHR6KSBGQVNUIChibHR6KSB9LAorICB7IFRZUEUgKElOU05fQk5FWiksIElEWCAoSU5TTl9CTkVaKSwgRlVMTCAoYm5leikgRkFTVCAoYm5leikgfSwKKyAgeyBUWVBFIChJTlNOX0JMOCksIElEWCAoSU5TTl9CTDgpLCBGVUxMIChibDgpIEZBU1QgKGJsOCkgfSwKKyAgeyBUWVBFIChJTlNOX0JMMjQpLCBJRFggKElOU05fQkwyNCksIEZVTEwgKGJsMjQpIEZBU1QgKGJsMjQpIH0sCisgIHsgVFlQRSAoSU5TTl9CTkM4KSwgSURYIChJTlNOX0JOQzgpLCBGVUxMIChibmM4KSBGQVNUIChibmM4KSB9LAorICB7IFRZUEUgKElOU05fQk5DMjQpLCBJRFggKElOU05fQk5DMjQpLCBGVUxMIChibmMyNCkgRkFTVCAoYm5jMjQpIH0sCisgIHsgVFlQRSAoSU5TTl9CTkUpLCBJRFggKElOU05fQk5FKSwgRlVMTCAoYm5lKSBGQVNUIChibmUpIH0sCisgIHsgVFlQRSAoSU5TTl9CUkE4KSwgSURYIChJTlNOX0JSQTgpLCBGVUxMIChicmE4KSBGQVNUIChicmE4KSB9LAorICB7IFRZUEUgKElOU05fQlJBMjQpLCBJRFggKElOU05fQlJBMjQpLCBGVUxMIChicmEyNCkgRkFTVCAoYnJhMjQpIH0sCisgIHsgVFlQRSAoSU5TTl9DTVApLCBJRFggKElOU05fQ01QKSwgRlVMTCAoY21wKSBGQVNUIChjbXApIH0sCisgIHsgVFlQRSAoSU5TTl9DTVBJKSwgSURYIChJTlNOX0NNUEkpLCBGVUxMIChjbXBpKSBGQVNUIChjbXBpKSB9LAorICB7IFRZUEUgKElOU05fQ01QVSksIElEWCAoSU5TTl9DTVBVKSwgRlVMTCAoY21wdSkgRkFTVCAoY21wdSkgfSwKKyAgeyBUWVBFIChJTlNOX0NNUFVJKSwgSURYIChJTlNOX0NNUFVJKSwgRlVMTCAoY21wdWkpIEZBU1QgKGNtcHVpKSB9LAorICB7IFRZUEUgKElOU05fRElWKSwgSURYIChJTlNOX0RJViksIEZVTEwgKGRpdikgRkFTVCAoZGl2KSB9LAorICB7IFRZUEUgKElOU05fRElWVSksIElEWCAoSU5TTl9ESVZVKSwgRlVMTCAoZGl2dSkgRkFTVCAoZGl2dSkgfSwKKyAgeyBUWVBFIChJTlNOX1JFTSksIElEWCAoSU5TTl9SRU0pLCBGVUxMIChyZW0pIEZBU1QgKHJlbSkgfSwKKyAgeyBUWVBFIChJTlNOX1JFTVUpLCBJRFggKElOU05fUkVNVSksIEZVTEwgKHJlbXUpIEZBU1QgKHJlbXUpIH0sCisgIHsgVFlQRSAoSU5TTl9KTCksIElEWCAoSU5TTl9KTCksIEZVTEwgKGpsKSBGQVNUIChqbCkgfSwKKyAgeyBUWVBFIChJTlNOX0pNUCksIElEWCAoSU5TTl9KTVApLCBGVUxMIChqbXApIEZBU1QgKGptcCkgfSwKKyAgeyBUWVBFIChJTlNOX0xEKSwgSURYIChJTlNOX0xEKSwgRlVMTCAobGQpIEZBU1QgKGxkKSB9LAorICB7IFRZUEUgKElOU05fTERfRCksIElEWCAoSU5TTl9MRF9EKSwgRlVMTCAobGRfZCkgRkFTVCAobGRfZCkgfSwKKyAgeyBUWVBFIChJTlNOX0xEQiksIElEWCAoSU5TTl9MREIpLCBGVUxMIChsZGIpIEZBU1QgKGxkYikgfSwKKyAgeyBUWVBFIChJTlNOX0xEQl9EKSwgSURYIChJTlNOX0xEQl9EKSwgRlVMTCAobGRiX2QpIEZBU1QgKGxkYl9kKSB9LAorICB7IFRZUEUgKElOU05fTERIKSwgSURYIChJTlNOX0xESCksIEZVTEwgKGxkaCkgRkFTVCAobGRoKSB9LAorICB7IFRZUEUgKElOU05fTERIX0QpLCBJRFggKElOU05fTERIX0QpLCBGVUxMIChsZGhfZCkgRkFTVCAobGRoX2QpIH0sCisgIHsgVFlQRSAoSU5TTl9MRFVCKSwgSURYIChJTlNOX0xEVUIpLCBGVUxMIChsZHViKSBGQVNUIChsZHViKSB9LAorICB7IFRZUEUgKElOU05fTERVQl9EKSwgSURYIChJTlNOX0xEVUJfRCksIEZVTEwgKGxkdWJfZCkgRkFTVCAobGR1Yl9kKSB9LAorICB7IFRZUEUgKElOU05fTERVSCksIElEWCAoSU5TTl9MRFVIKSwgRlVMTCAobGR1aCkgRkFTVCAobGR1aCkgfSwKKyAgeyBUWVBFIChJTlNOX0xEVUhfRCksIElEWCAoSU5TTl9MRFVIX0QpLCBGVUxMIChsZHVoX2QpIEZBU1QgKGxkdWhfZCkgfSwKKyAgeyBUWVBFIChJTlNOX0xEX1BMVVMpLCBJRFggKElOU05fTERfUExVUyksIEZVTEwgKGxkX3BsdXMpIEZBU1QgKGxkX3BsdXMpIH0sCisgIHsgVFlQRSAoSU5TTl9MRDI0KSwgSURYIChJTlNOX0xEMjQpLCBGVUxMIChsZDI0KSBGQVNUIChsZDI0KSB9LAorICB7IFRZUEUgKElOU05fTERJOCksIElEWCAoSU5TTl9MREk4KSwgRlVMTCAobGRpOCkgRkFTVCAobGRpOCkgfSwKKyAgeyBUWVBFIChJTlNOX0xESTE2KSwgSURYIChJTlNOX0xESTE2KSwgRlVMTCAobGRpMTYpIEZBU1QgKGxkaTE2KSB9LAorICB7IFRZUEUgKElOU05fTE9DSyksIElEWCAoSU5TTl9MT0NLKSwgRlVMTCAobG9jaykgRkFTVCAobG9jaykgfSwKKyAgeyBUWVBFIChJTlNOX01BQ0hJKSwgSURYIChJTlNOX01BQ0hJKSwgRlVMTCAobWFjaGkpIEZBU1QgKG1hY2hpKSB9LAorICB7IFRZUEUgKElOU05fTUFDTE8pLCBJRFggKElOU05fTUFDTE8pLCBGVUxMIChtYWNsbykgRkFTVCAobWFjbG8pIH0sCisgIHsgVFlQRSAoSU5TTl9NQUNXSEkpLCBJRFggKElOU05fTUFDV0hJKSwgRlVMTCAobWFjd2hpKSBGQVNUIChtYWN3aGkpIH0sCisgIHsgVFlQRSAoSU5TTl9NQUNXTE8pLCBJRFggKElOU05fTUFDV0xPKSwgRlVMTCAobWFjd2xvKSBGQVNUIChtYWN3bG8pIH0sCisgIHsgVFlQRSAoSU5TTl9NVUwpLCBJRFggKElOU05fTVVMKSwgRlVMTCAobXVsKSBGQVNUIChtdWwpIH0sCisgIHsgVFlQRSAoSU5TTl9NVUxISSksIElEWCAoSU5TTl9NVUxISSksIEZVTEwgKG11bGhpKSBGQVNUIChtdWxoaSkgfSwKKyAgeyBUWVBFIChJTlNOX01VTExPKSwgSURYIChJTlNOX01VTExPKSwgRlVMTCAobXVsbG8pIEZBU1QgKG11bGxvKSB9LAorICB7IFRZUEUgKElOU05fTVVMV0hJKSwgSURYIChJTlNOX01VTFdISSksIEZVTEwgKG11bHdoaSkgRkFTVCAobXVsd2hpKSB9LAorICB7IFRZUEUgKElOU05fTVVMV0xPKSwgSURYIChJTlNOX01VTFdMTyksIEZVTEwgKG11bHdsbykgRkFTVCAobXVsd2xvKSB9LAorICB7IFRZUEUgKElOU05fTVYpLCBJRFggKElOU05fTVYpLCBGVUxMIChtdikgRkFTVCAobXYpIH0sCisgIHsgVFlQRSAoSU5TTl9NVkZBQ0hJKSwgSURYIChJTlNOX01WRkFDSEkpLCBGVUxMIChtdmZhY2hpKSBGQVNUIChtdmZhY2hpKSB9LAorICB7IFRZUEUgKElOU05fTVZGQUNMTyksIElEWCAoSU5TTl9NVkZBQ0xPKSwgRlVMTCAobXZmYWNsbykgRkFTVCAobXZmYWNsbykgfSwKKyAgeyBUWVBFIChJTlNOX01WRkFDTUkpLCBJRFggKElOU05fTVZGQUNNSSksIEZVTEwgKG12ZmFjbWkpIEZBU1QgKG12ZmFjbWkpIH0sCisgIHsgVFlQRSAoSU5TTl9NVkZDKSwgSURYIChJTlNOX01WRkMpLCBGVUxMIChtdmZjKSBGQVNUIChtdmZjKSB9LAorICB7IFRZUEUgKElOU05fTVZUQUNISSksIElEWCAoSU5TTl9NVlRBQ0hJKSwgRlVMTCAobXZ0YWNoaSkgRkFTVCAobXZ0YWNoaSkgfSwKKyAgeyBUWVBFIChJTlNOX01WVEFDTE8pLCBJRFggKElOU05fTVZUQUNMTyksIEZVTEwgKG12dGFjbG8pIEZBU1QgKG12dGFjbG8pIH0sCisgIHsgVFlQRSAoSU5TTl9NVlRDKSwgSURYIChJTlNOX01WVEMpLCBGVUxMIChtdnRjKSBGQVNUIChtdnRjKSB9LAorICB7IFRZUEUgKElOU05fTkVHKSwgSURYIChJTlNOX05FRyksIEZVTEwgKG5lZykgRkFTVCAobmVnKSB9LAorICB7IFRZUEUgKElOU05fTk9QKSwgSURYIChJTlNOX05PUCksIEZVTEwgKG5vcCkgRkFTVCAobm9wKSB9LAorICB7IFRZUEUgKElOU05fTk9UKSwgSURYIChJTlNOX05PVCksIEZVTEwgKG5vdCkgRkFTVCAobm90KSB9LAorICB7IFRZUEUgKElOU05fUkFDKSwgSURYIChJTlNOX1JBQyksIEZVTEwgKHJhYykgRkFTVCAocmFjKSB9LAorICB7IFRZUEUgKElOU05fUkFDSCksIElEWCAoSU5TTl9SQUNIKSwgRlVMTCAocmFjaCkgRkFTVCAocmFjaCkgfSwKKyAgeyBUWVBFIChJTlNOX1JURSksIElEWCAoSU5TTl9SVEUpLCBGVUxMIChydGUpIEZBU1QgKHJ0ZSkgfSwKKyAgeyBUWVBFIChJTlNOX1NFVEgpLCBJRFggKElOU05fU0VUSCksIEZVTEwgKHNldGgpIEZBU1QgKHNldGgpIH0sCisgIHsgVFlQRSAoSU5TTl9TTEwpLCBJRFggKElOU05fU0xMKSwgRlVMTCAoc2xsKSBGQVNUIChzbGwpIH0sCisgIHsgVFlQRSAoSU5TTl9TTEwzKSwgSURYIChJTlNOX1NMTDMpLCBGVUxMIChzbGwzKSBGQVNUIChzbGwzKSB9LAorICB7IFRZUEUgKElOU05fU0xMSSksIElEWCAoSU5TTl9TTExJKSwgRlVMTCAoc2xsaSkgRkFTVCAoc2xsaSkgfSwKKyAgeyBUWVBFIChJTlNOX1NSQSksIElEWCAoSU5TTl9TUkEpLCBGVUxMIChzcmEpIEZBU1QgKHNyYSkgfSwKKyAgeyBUWVBFIChJTlNOX1NSQTMpLCBJRFggKElOU05fU1JBMyksIEZVTEwgKHNyYTMpIEZBU1QgKHNyYTMpIH0sCisgIHsgVFlQRSAoSU5TTl9TUkFJKSwgSURYIChJTlNOX1NSQUkpLCBGVUxMIChzcmFpKSBGQVNUIChzcmFpKSB9LAorICB7IFRZUEUgKElOU05fU1JMKSwgSURYIChJTlNOX1NSTCksIEZVTEwgKHNybCkgRkFTVCAoc3JsKSB9LAorICB7IFRZUEUgKElOU05fU1JMMyksIElEWCAoSU5TTl9TUkwzKSwgRlVMTCAoc3JsMykgRkFTVCAoc3JsMykgfSwKKyAgeyBUWVBFIChJTlNOX1NSTEkpLCBJRFggKElOU05fU1JMSSksIEZVTEwgKHNybGkpIEZBU1QgKHNybGkpIH0sCisgIHsgVFlQRSAoSU5TTl9TVCksIElEWCAoSU5TTl9TVCksIEZVTEwgKHN0KSBGQVNUIChzdCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUX0QpLCBJRFggKElOU05fU1RfRCksIEZVTEwgKHN0X2QpIEZBU1QgKHN0X2QpIH0sCisgIHsgVFlQRSAoSU5TTl9TVEIpLCBJRFggKElOU05fU1RCKSwgRlVMTCAoc3RiKSBGQVNUIChzdGIpIH0sCisgIHsgVFlQRSAoSU5TTl9TVEJfRCksIElEWCAoSU5TTl9TVEJfRCksIEZVTEwgKHN0Yl9kKSBGQVNUIChzdGJfZCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUSCksIElEWCAoSU5TTl9TVEgpLCBGVUxMIChzdGgpIEZBU1QgKHN0aCkgfSwKKyAgeyBUWVBFIChJTlNOX1NUSF9EKSwgSURYIChJTlNOX1NUSF9EKSwgRlVMTCAoc3RoX2QpIEZBU1QgKHN0aF9kKSB9LAorICB7IFRZUEUgKElOU05fU1RfUExVUyksIElEWCAoSU5TTl9TVF9QTFVTKSwgRlVMTCAoc3RfcGx1cykgRkFTVCAoc3RfcGx1cykgfSwKKyAgeyBUWVBFIChJTlNOX1NUX01JTlVTKSwgSURYIChJTlNOX1NUX01JTlVTKSwgRlVMTCAoc3RfbWludXMpIEZBU1QgKHN0X21pbnVzKSB9LAorICB7IFRZUEUgKElOU05fU1VCKSwgSURYIChJTlNOX1NVQiksIEZVTEwgKHN1YikgRkFTVCAoc3ViKSB9LAorICB7IFRZUEUgKElOU05fU1VCViksIElEWCAoSU5TTl9TVUJWKSwgRlVMTCAoc3VidikgRkFTVCAoc3VidikgfSwKKyAgeyBUWVBFIChJTlNOX1NVQlgpLCBJRFggKElOU05fU1VCWCksIEZVTEwgKHN1YngpIEZBU1QgKHN1YngpIH0sCisgIHsgVFlQRSAoSU5TTl9UUkFQKSwgSURYIChJTlNOX1RSQVApLCBGVUxMICh0cmFwKSBGQVNUICh0cmFwKSB9LAorICB7IFRZUEUgKElOU05fVU5MT0NLKSwgSURYIChJTlNOX1VOTE9DSyksIEZVTEwgKHVubG9jaykgRkFTVCAodW5sb2NrKSB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbnNuX3NlbSBtMzJyYmZfaW5zbl9zZW1faW52YWxpZCA9Cit7CisgIFZJUlRVQUxfSU5TTl9YX0lOVkFMSUQsIElEWCAoSU5TTl9YX0lOVkFMSUQpLCBGVUxMICh4X2ludmFsaWQpIEZBU1QgKHhfaW52YWxpZCkKK307CisKKyN1bmRlZiBJRFgKKyN1bmRlZiBUWVBFCisKKy8qIEluaXRpYWxpemUgYW4gSURFU0MgZnJvbSB0aGUgY29tcGlsZS10aW1lIGNvbXB1dGFibGUgcGFydHMuICAqLworCitzdGF0aWMgSU5MSU5FIHZvaWQKK2luaXRfaWRlc2MgKFNJTV9DUFUgKmNwdSwgSURFU0MgKmlkLCBjb25zdCBzdHJ1Y3QgaW5zbl9zZW0gKnQpCit7CisgIGNvbnN0IENHRU5fSU5TTiAqaW5zbl90YWJsZSA9IENHRU5fQ1BVX0lOU05fVEFCTEUgKENQVV9DUFVfREVTQyAoY3B1KSktPmluaXRfZW50cmllczsKKworICBpZC0+bnVtID0gdC0+aW5kZXg7CisgIGlmICgoaW50KSB0LT50eXBlIDw9IDApCisgICAgaWQtPmlkYXRhID0gJiBjZ2VuX3ZpcnR1YWxfaW5zbl90YWJsZVstIChpbnQpIHQtPnR5cGVdOworICBlbHNlCisgICAgaWQtPmlkYXRhID0gJiBpbnNuX3RhYmxlW3QtPnR5cGVdOworICBpZC0+YXR0cnMgPSBDR0VOX0lOU05fQVRUUlMgKGlkLT5pZGF0YSk7CisgIC8qIE9oIG15IGdvZCwgYSBtYWdpYyBudW1iZXIuICAqLworICBpZC0+bGVuZ3RoID0gQ0dFTl9JTlNOX0JJVFNJWkUgKGlkLT5pZGF0YSkgLyA4OworI2lmICEgV0lUSF9TRU1fU1dJVENIX0ZVTEwKKyAgaWQtPnNlbV9mdWxsID0gdC0+c2VtX2Z1bGw7CisjZW5kaWYKKyNpZiBXSVRIX0ZBU1QgJiYgISBXSVRIX1NFTV9TV0lUQ0hfRkFTVAorICBpZC0+c2VtX2Zhc3QgPSB0LT5zZW1fZmFzdDsKKyNlbmRpZgorI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIGlkLT50aW1pbmcgPSAmIE1PREVMX1RJTUlORyAoQ1BVX01PREVMIChjcHUpKSBbdC0+aW5kZXhdOworICB7CisgICAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7CisgICAgU0lNX0FTU0VSVCAodC0+aW5kZXggPT0gaWQtPnRpbWluZy0+bnVtKTsKKyAgfQorI2VuZGlmCit9CisKKy8qIEluaXRpYWxpemUgdGhlIGluc3RydWN0aW9uIGRlc2NyaXB0b3IgdGFibGUuICAqLworCit2b2lkCittMzJyYmZfaW5pdF9pZGVzY190YWJsZSAoU0lNX0NQVSAqY3B1KQoreworICBJREVTQyAqaWQsKnRhYmVuZDsKKyAgY29uc3Qgc3RydWN0IGluc25fc2VtICp0LCp0ZW5kOworICBpbnQgdGFic2l6ZSA9IE0zMlJCRl9JTlNOX01BWDsKKyAgSURFU0MgKnRhYmxlID0gbTMycmJmX2luc25fZGF0YTsKKworICBtZW1zZXQgKHRhYmxlLCAwLCB0YWJzaXplICogc2l6ZW9mIChJREVTQykpOworCisgIC8qIEZpcnN0IHNldCBhbGwgZW50cmllcyB0byB0aGUgYGludmFsaWQgaW5zbicuICAqLworICB0ID0gJiBtMzJyYmZfaW5zbl9zZW1faW52YWxpZDsKKyAgZm9yIChpZCA9IHRhYmxlLCB0YWJlbmQgPSB0YWJsZSArIHRhYnNpemU7IGlkIDwgdGFiZW5kOyArK2lkKQorICAgIGluaXRfaWRlc2MgKGNwdSwgaWQsIHQpOworCisgIC8qIE5vdyBmaWxsIGluIHRoZSB2YWx1ZXMgZm9yIHRoZSBjaG9zZW4gY3B1LiAgKi8KKyAgZm9yICh0ID0gbTMycmJmX2luc25fc2VtLCB0ZW5kID0gdCArIHNpemVvZiAobTMycmJmX2luc25fc2VtKSAvIHNpemVvZiAoKnQpOworICAgICAgIHQgIT0gdGVuZDsgKyt0KQorICAgIHsKKyAgICAgIGluaXRfaWRlc2MgKGNwdSwgJiB0YWJsZVt0LT5pbmRleF0sIHQpOworICAgIH0KKworICAvKiBMaW5rIHRoZSBJREVTQyB0YWJsZSBpbnRvIHRoZSBjcHUuICAqLworICBDUFVfSURFU0MgKGNwdSkgPSB0YWJsZTsKK30KKworLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgYWxsIGluc3RydWN0aW9uIHNlbWFudGljIGZvcm1hdHMuICAqLwordHlwZWRlZiBlbnVtIHNmbXQgeworICBGTVRfRU1QVFksIEZNVF9BREQsIEZNVF9BREQzLCBGTVRfQU5EMworICwgRk1UX09SMywgRk1UX0FEREksIEZNVF9BRERWLCBGTVRfQUREVjMKKyAsIEZNVF9BRERYLCBGTVRfQkM4LCBGTVRfQkMyNCwgRk1UX0JFUQorICwgRk1UX0JFUVosIEZNVF9CTDgsIEZNVF9CTDI0LCBGTVRfQlJBOAorICwgRk1UX0JSQTI0LCBGTVRfQ01QLCBGTVRfQ01QSSwgRk1UX0RJVgorICwgRk1UX0pMLCBGTVRfSk1QLCBGTVRfTEQsIEZNVF9MRF9ECisgLCBGTVRfTERCLCBGTVRfTERCX0QsIEZNVF9MREgsIEZNVF9MREhfRAorICwgRk1UX0xEX1BMVVMsIEZNVF9MRDI0LCBGTVRfTERJOCwgRk1UX0xESTE2CisgLCBGTVRfTE9DSywgRk1UX01BQ0hJLCBGTVRfTVVMSEksIEZNVF9NVgorICwgRk1UX01WRkFDSEksIEZNVF9NVkZDLCBGTVRfTVZUQUNISSwgRk1UX01WVEMKKyAsIEZNVF9OT1AsIEZNVF9SQUMsIEZNVF9SVEUsIEZNVF9TRVRICisgLCBGTVRfU0xMMywgRk1UX1NMTEksIEZNVF9TVCwgRk1UX1NUX0QKKyAsIEZNVF9TVEIsIEZNVF9TVEJfRCwgRk1UX1NUSCwgRk1UX1NUSF9ECisgLCBGTVRfU1RfUExVUywgRk1UX1RSQVAsIEZNVF9VTkxPQ0sKK30gU0ZNVDsKKworLyogVGhlIGRlY29kZXIgdXNlcyB0aGlzIHRvIHJlY29yZCBpbnNucyBhbmQgZGlyZWN0IGV4dHJhY3Rpb24gaGFuZGxpbmcuICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IElERVNDICppZGVzYzsKKyNpZmRlZiBfX0dOVUNfXworICB2b2lkICpzZm10OworI2Vsc2UKKyAgZW51bSBzZm10IHNmbXQ7CisjZW5kaWYKK30gREVDT0RFX0RFU0M7CisKKy8qIE1hY3JvIHRvIGdvIGZyb20gZGVjb2RlIHBoYXNlIHRvIGV4dHJhY3Rpb24gcGhhc2UuICAqLworCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgR09UT19FWFRSQUNUKGlkKSBnb3RvICooaWQpLT5zZm10CisjZWxzZQorI2RlZmluZSBHT1RPX0VYVFJBQ1QoaWQpIGdvdG8gZXh0cmFjdAorI2VuZGlmCisKKy8qIFRoZSBkZWNvZGVyIG5lZWRzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGNvbXB1dGVkIGdvdG8gc3dpdGNoIGNvbnRyb2wuICAqLworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIERFQ09ERV9TV0lUQ0goTiwgWCkgZ290byAqbGFiZWxzXyMjTltYXTsKKyNlbHNlCisjZGVmaW5lIERFQ09ERV9TV0lUQ0goTiwgWCkgc3dpdGNoIChYKQorI2VuZGlmCisKKy8qIEdpdmVuIGFuIGluc3RydWN0aW9uLCByZXR1cm4gYSBwb2ludGVyIHRvIGl0cyBJREVTQyBlbnRyeS4gICovCisKK2NvbnN0IElERVNDICoKK20zMnJiZl9kZWNvZGUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBJQUREUiBwYywKKyAgICAgICAgICAgICAgQ0dFTl9JTlNOX0lOVCBiYXNlX2luc24sIENHRU5fSU5TTl9JTlQgZW50aXJlX2luc24sCisgICAgICAgICAgICAgIEFSR0JVRiAqYWJ1ZikKK3sKKyAgLyogUmVzdWx0IG9mIGRlY29kZXIsIHVzZWQgYnkgZXh0cmFjdG9yLiAgKi8KKyAgY29uc3QgREVDT0RFX0RFU0MgKmlkZWNvZGU7CisKKyAgLyogRmlyc3QgZGVjb2RlIHRoZSBpbnN0cnVjdGlvbi4gICovCisKKyAgeworI2RlZmluZSBJKGluc24pICYgbTMycmJmX2luc25fZGF0YVtDT05DQVQyIChNMzJSQkZfLGluc24pXQorI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIEUoZm10KSAmJiBjYXNlX2V4XyMjZm10CisjZWxzZQorI2RlZmluZSBFKGZtdCkgZm10CisjZW5kaWYKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBiYXNlX2luc247CisgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGlkZWNvZGVfaW52YWxpZCA9IHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH07CisKKyAgICB7CisjaWZkZWYgX19HTlVDX18KKyAgICAgIHN0YXRpYyBjb25zdCB2b2lkICpsYWJlbHNfMFsyNTZdID0geworICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBjYXNlXzBfMjgsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBjYXNlXzBfODcsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBjYXNlXzBfOTUsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsIAorICAgICAgICAmJiBjYXNlXzBfMTEyLCAmJiBjYXNlXzBfMTEzLCAmJiBjYXNlXzBfMTE0LCAmJiBjYXNlXzBfMTE1LCAKKyAgICAgICAgJiYgY2FzZV8wXzExNiwgJiYgY2FzZV8wXzExNywgJiYgY2FzZV8wXzExOCwgJiYgY2FzZV8wXzExOSwgCisgICAgICAgICYmIGNhc2VfMF8xMjAsICYmIGNhc2VfMF8xMjEsICYmIGNhc2VfMF8xMjIsICYmIGNhc2VfMF8xMjMsIAorICAgICAgICAmJiBjYXNlXzBfMTI0LCAmJiBjYXNlXzBfMTI1LCAmJiBjYXNlXzBfMTI2LCAmJiBjYXNlXzBfMTI3LCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgZGVmYXVsdF8wLCAmJiBkZWZhdWx0XzAsICYmIGRlZmF1bHRfMCwgJiYgZGVmYXVsdF8wLCAKKyAgICAgICAgJiYgY2FzZV8wXzI0MCwgJiYgY2FzZV8wXzI0MSwgJiYgY2FzZV8wXzI0MiwgJiYgY2FzZV8wXzI0MywgCisgICAgICAgICYmIGNhc2VfMF8yNDQsICYmIGNhc2VfMF8yNDUsICYmIGNhc2VfMF8yNDYsICYmIGNhc2VfMF8yNDcsIAorICAgICAgICAmJiBjYXNlXzBfMjQ4LCAmJiBjYXNlXzBfMjQ5LCAmJiBjYXNlXzBfMjUwLCAmJiBjYXNlXzBfMjUxLCAKKyAgICAgICAgJiYgY2FzZV8wXzI1MiwgJiYgY2FzZV8wXzI1MywgJiYgY2FzZV8wXzI1NCwgJiYgY2FzZV8wXzI1NSwgCisgICAgICB9OworI2VuZGlmCisgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMjU2XSA9IHsKKyAgICAgICAgeyBJIChJTlNOX1NVQlYpLCBFIChGTVRfQUREVikgfSwgeyBJIChJTlNOX1NVQlgpLCBFIChGTVRfQUREWCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TVUIpLCBFIChGTVRfQUREKSB9LCB7IEkgKElOU05fTkVHKSwgRSAoRk1UX01WKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0NNUCksIEUgKEZNVF9DTVApIH0sIHsgSSAoSU5TTl9DTVBVKSwgRSAoRk1UX0NNUCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fQUREViksIEUgKEZNVF9BRERWKSB9LCB7IEkgKElOU05fQUREWCksIEUgKEZNVF9BRERYKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0FERCksIEUgKEZNVF9BREQpIH0sIHsgSSAoSU5TTl9OT1QpLCBFIChGTVRfTVYpIH0sIAorICAgICAgICB7IEkgKElOU05fQU5EKSwgRSAoRk1UX0FERCkgfSwgeyBJIChJTlNOX1hPUiksIEUgKEZNVF9BREQpIH0sIAorICAgICAgICB7IEkgKElOU05fT1IpLCBFIChGTVRfQUREKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NSTCksIEUgKEZNVF9BREQpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fU1JBKSwgRSAoRk1UX0FERCkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TTEwpLCBFIChGTVRfQUREKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX01VTCksIEUgKEZNVF9BREQpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fTVYpLCBFIChGTVRfTVYpIH0sIHsgSSAoSU5TTl9NVkZDKSwgRSAoRk1UX01WRkMpIH0sIAorICAgICAgICB7IEkgKElOU05fTVZUQyksIEUgKEZNVF9NVlRDKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyAwIH0sIHsgSSAoSU5TTl9SVEUpLCBFIChGTVRfUlRFKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1RSQVApLCBFIChGTVRfVFJBUCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TVEIpLCBFIChGTVRfU1RCKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NUSCksIEUgKEZNVF9TVEgpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fU1QpLCBFIChGTVRfU1QpIH0sIHsgSSAoSU5TTl9VTkxPQ0spLCBFIChGTVRfVU5MT0NLKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NUX1BMVVMpLCBFIChGTVRfU1RfUExVUykgfSwgeyBJIChJTlNOX1NUX01JTlVTKSwgRSAoRk1UX1NUX1BMVVMpIH0sIAorICAgICAgICB7IEkgKElOU05fTERCKSwgRSAoRk1UX0xEQikgfSwgeyBJIChJTlNOX0xEVUIpLCBFIChGTVRfTERCKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xESCksIEUgKEZNVF9MREgpIH0sIHsgSSAoSU5TTl9MRFVIKSwgRSAoRk1UX0xESCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MRCksIEUgKEZNVF9MRCkgfSwgeyBJIChJTlNOX0xPQ0spLCBFIChGTVRfTE9DSykgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MRF9QTFVTKSwgRSAoRk1UX0xEX1BMVVMpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fTVVMSEkpLCBFIChGTVRfTVVMSEkpIH0sIHsgSSAoSU5TTl9NVUxMTyksIEUgKEZNVF9NVUxISSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9NVUxXSEkpLCBFIChGTVRfTVVMSEkpIH0sIHsgSSAoSU5TTl9NVUxXTE8pLCBFIChGTVRfTVVMSEkpIH0sIAorICAgICAgICB7IEkgKElOU05fTUFDSEkpLCBFIChGTVRfTUFDSEkpIH0sIHsgSSAoSU5TTl9NQUNMTyksIEUgKEZNVF9NQUNISSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9NQUNXSEkpLCBFIChGTVRfTUFDSEkpIH0sIHsgSSAoSU5TTl9NQUNXTE8pLCBFIChGTVRfTUFDSEkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0FEREkpLCBFIChGTVRfQURESSkgfSwgeyBJIChJTlNOX0FEREkpLCBFIChGTVRfQURESSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9BRERJKSwgRSAoRk1UX0FEREkpIH0sIHsgSSAoSU5TTl9BRERJKSwgRSAoRk1UX0FEREkpIH0sIAorICAgICAgICB7IEkgKElOU05fQURESSksIEUgKEZNVF9BRERJKSB9LCB7IEkgKElOU05fQURESSksIEUgKEZNVF9BRERJKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0FEREkpLCBFIChGTVRfQURESSkgfSwgeyBJIChJTlNOX0FEREkpLCBFIChGTVRfQURESSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9BRERJKSwgRSAoRk1UX0FEREkpIH0sIHsgSSAoSU5TTl9BRERJKSwgRSAoRk1UX0FEREkpIH0sIAorICAgICAgICB7IEkgKElOU05fQURESSksIEUgKEZNVF9BRERJKSB9LCB7IEkgKElOU05fQURESSksIEUgKEZNVF9BRERJKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0FEREkpLCBFIChGTVRfQURESSkgfSwgeyBJIChJTlNOX0FEREkpLCBFIChGTVRfQURESSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9BRERJKSwgRSAoRk1UX0FEREkpIH0sIHsgSSAoSU5TTl9BRERJKSwgRSAoRk1UX0FEREkpIH0sIAorICAgICAgICB7IEkgKElOU05fU1JMSSksIEUgKEZNVF9TTExJKSB9LCB7IEkgKElOU05fU1JMSSksIEUgKEZNVF9TTExJKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NSQUkpLCBFIChGTVRfU0xMSSkgfSwgeyBJIChJTlNOX1NSQUkpLCBFIChGTVRfU0xMSSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TTExJKSwgRSAoRk1UX1NMTEkpIH0sIHsgSSAoSU5TTl9TTExJKSwgRSAoRk1UX1NMTEkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IDAgfSwgCisgICAgICAgIHsgSSAoSU5TTl9SQUNIKSwgRSAoRk1UX1JBQykgfSwgeyBJIChJTlNOX1JBQyksIEUgKEZNVF9SQUMpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgMCB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xESTgpLCBFIChGTVRfTERJOCkgfSwgeyBJIChJTlNOX0xESTgpLCBFIChGTVRfTERJOCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MREk4KSwgRSAoRk1UX0xESTgpIH0sIHsgSSAoSU5TTl9MREk4KSwgRSAoRk1UX0xESTgpIH0sIAorICAgICAgICB7IEkgKElOU05fTERJOCksIEUgKEZNVF9MREk4KSB9LCB7IEkgKElOU05fTERJOCksIEUgKEZNVF9MREk4KSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xESTgpLCBFIChGTVRfTERJOCkgfSwgeyBJIChJTlNOX0xESTgpLCBFIChGTVRfTERJOCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MREk4KSwgRSAoRk1UX0xESTgpIH0sIHsgSSAoSU5TTl9MREk4KSwgRSAoRk1UX0xESTgpIH0sIAorICAgICAgICB7IEkgKElOU05fTERJOCksIEUgKEZNVF9MREk4KSB9LCB7IEkgKElOU05fTERJOCksIEUgKEZNVF9MREk4KSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xESTgpLCBFIChGTVRfTERJOCkgfSwgeyBJIChJTlNOX0xESTgpLCBFIChGTVRfTERJOCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MREk4KSwgRSAoRk1UX0xESTgpIH0sIHsgSSAoSU5TTl9MREk4KSwgRSAoRk1UX0xESTgpIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9DTVBJKSwgRSAoRk1UX0NNUEkpIH0sIHsgSSAoSU5TTl9DTVBVSSksIEUgKEZNVF9DTVBJKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9BRERWMyksIEUgKEZNVF9BRERWMykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9BREQzKSwgRSAoRk1UX0FERDMpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fQU5EMyksIEUgKEZNVF9BTkQzKSB9LCB7IEkgKElOU05fWE9SMyksIEUgKEZNVF9BTkQzKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX09SMyksIEUgKEZNVF9PUjMpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fRElWKSwgRSAoRk1UX0RJVikgfSwgeyBJIChJTlNOX0RJVlUpLCBFIChGTVRfRElWKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1JFTSksIEUgKEZNVF9ESVYpIH0sIHsgSSAoSU5TTl9SRU1VKSwgRSAoRk1UX0RJVikgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NSTDMpLCBFIChGTVRfU0xMMykgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TUkEzKSwgRSAoRk1UX1NMTDMpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fU0xMMyksIEUgKEZNVF9TTEwzKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX0xESTE2KSwgRSAoRk1UX0xESTE2KSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NUQl9EKSwgRSAoRk1UX1NUQl9EKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NUSF9EKSwgRSAoRk1UX1NUSF9EKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1NUX0QpLCBFIChGTVRfU1RfRCkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fTERCX0QpLCBFIChGTVRfTERCX0QpIH0sIHsgSSAoSU5TTl9MRFVCX0QpLCBFIChGTVRfTERCX0QpIH0sIAorICAgICAgICB7IEkgKElOU05fTERIX0QpLCBFIChGTVRfTERIX0QpIH0sIHsgSSAoSU5TTl9MRFVIX0QpLCBFIChGTVRfTERIX0QpIH0sIAorICAgICAgICB7IEkgKElOU05fTERfRCksIEUgKEZNVF9MRF9EKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9CRVEpLCBFIChGTVRfQkVRKSB9LCB7IEkgKElOU05fQk5FKSwgRSAoRk1UX0JFUSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9CRVFaKSwgRSAoRk1UX0JFUVopIH0sIHsgSSAoSU5TTl9CTkVaKSwgRSAoRk1UX0JFUVopIH0sIAorICAgICAgICB7IEkgKElOU05fQkxUWiksIEUgKEZNVF9CRVFaKSB9LCB7IEkgKElOU05fQkdFWiksIEUgKEZNVF9CRVFaKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0JMRVopLCBFIChGTVRfQkVRWikgfSwgeyBJIChJTlNOX0JHVFopLCBFIChGTVRfQkVRWikgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9TRVRIKSwgRSAoRk1UX1NFVEgpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xEMjQpLCBFIChGTVRfTEQyNCkgfSwgeyBJIChJTlNOX0xEMjQpLCBFIChGTVRfTEQyNCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MRDI0KSwgRSAoRk1UX0xEMjQpIH0sIHsgSSAoSU5TTl9MRDI0KSwgRSAoRk1UX0xEMjQpIH0sIAorICAgICAgICB7IEkgKElOU05fTEQyNCksIEUgKEZNVF9MRDI0KSB9LCB7IEkgKElOU05fTEQyNCksIEUgKEZNVF9MRDI0KSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xEMjQpLCBFIChGTVRfTEQyNCkgfSwgeyBJIChJTlNOX0xEMjQpLCBFIChGTVRfTEQyNCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MRDI0KSwgRSAoRk1UX0xEMjQpIH0sIHsgSSAoSU5TTl9MRDI0KSwgRSAoRk1UX0xEMjQpIH0sIAorICAgICAgICB7IEkgKElOU05fTEQyNCksIEUgKEZNVF9MRDI0KSB9LCB7IEkgKElOU05fTEQyNCksIEUgKEZNVF9MRDI0KSB9LCAKKyAgICAgICAgeyBJIChJTlNOX0xEMjQpLCBFIChGTVRfTEQyNCkgfSwgeyBJIChJTlNOX0xEMjQpLCBFIChGTVRfTEQyNCkgfSwgCisgICAgICAgIHsgSSAoSU5TTl9MRDI0KSwgRSAoRk1UX0xEMjQpIH0sIHsgSSAoSU5TTl9MRDI0KSwgRSAoRk1UX0xEMjQpIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgICB7IDAgfSwgeyAwIH0sIAorICAgICAgfTsKKyAgICAgIHVuc2lnbmVkIGludCB2YWw7CisgICAgICB2YWwgPSAoKChpbnNuID4+IDgpICYgKDE1IDw8IDQpKSB8ICgoaW5zbiA+PiA0KSAmICgxNSA8PCAwKSkpOworICAgICAgREVDT0RFX1NXSVRDSCAoMCwgdmFsKQorICAgICAgICB7CisgICAgICAgIENBU0UgKDAsIDI4KSA6CisgICAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IERFQ09ERV9ERVNDIGluc25zWzE2XSA9IHsKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9KTCksIEUgKEZNVF9KTCkgfSwgeyBJIChJTlNOX0pNUCksIEUgKEZNVF9KTVApIH0sIAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDgpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgIH0KKyAgICAgICAgQ0FTRSAoMCwgODcpIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fTVZUQUNISSksIEUgKEZNVF9NVlRBQ0hJKSB9LCB7IEkgKElOU05fTVZUQUNMTyksIEUgKEZNVF9NVlRBQ0hJKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gMCkgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgfQorICAgICAgICBDQVNFICgwLCA5NSkgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9NVkZBQ0hJKSwgRSAoRk1UX01WRkFDSEkpIH0sIHsgSSAoSU5TTl9NVkZBQ0xPKSwgRSAoRk1UX01WRkFDSEkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fTVZGQUNNSSksIEUgKEZNVF9NVkZBQ0hJKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmFsID0gKCgoaW5zbiA+PiAwKSAmICgxNSA8PCAwKSkpOworICAgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgICAgR09UT19FWFRSQUNUIChpZGVjb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIENBU0UgKDAsIDExMikgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9OT1ApLCBFIChGTVRfTk9QKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fQkM4KSwgRSAoRk1UX0JDOCkgfSwgeyBJIChJTlNOX0JOQzgpLCBFIChGTVRfQkM4KSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX0JMOCksIEUgKEZNVF9CTDgpIH0sIHsgSSAoSU5TTl9CUkE4KSwgRSAoRk1UX0JSQTgpIH0sIAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAoKChpbnNuID4+IDgpICYgKDE1IDw8IDApKSk7CisgICAgICAgICAgICBpZGVjb2RlID0gJmluc25zW3ZhbF07CisgICAgICAgICAgICBHT1RPX0VYVFJBQ1QgKGlkZWNvZGUpOworICAgICAgICAgIH0KKyAgICAgICAgQ0FTRSAoMCwgMTEzKSA6IC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBDQVNFICgwLCAxMTQpIDogLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIENBU0UgKDAsIDExNSkgOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgQ0FTRSAoMCwgMTE2KSA6IC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBDQVNFICgwLCAxMTcpIDogLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIENBU0UgKDAsIDExOCkgOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgQ0FTRSAoMCwgMTE5KSA6IC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBDQVNFICgwLCAxMjApIDogLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIENBU0UgKDAsIDEyMSkgOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgQ0FTRSAoMCwgMTIyKSA6IC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBDQVNFICgwLCAxMjMpIDogLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIENBU0UgKDAsIDEyNCkgOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgQ0FTRSAoMCwgMTI1KSA6IC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBDQVNFICgwLCAxMjYpIDogLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIENBU0UgKDAsIDEyNykgOgorICAgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBERUNPREVfREVTQyBpbnNuc1sxNl0gPSB7CisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9CQzgpLCBFIChGTVRfQkM4KSB9LCB7IEkgKElOU05fQk5DOCksIEUgKEZNVF9CQzgpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fQkw4KSwgRSAoRk1UX0JMOCkgfSwgeyBJIChJTlNOX0JSQTgpLCBFIChGTVRfQlJBOCkgfSwgCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gOCkgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgfQorICAgICAgICBDQVNFICgwLCAyNDApIDogLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIENBU0UgKDAsIDI0MSkgOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgQ0FTRSAoMCwgMjQyKSA6IC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBDQVNFICgwLCAyNDMpIDogLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIENBU0UgKDAsIDI0NCkgOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgQ0FTRSAoMCwgMjQ1KSA6IC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBDQVNFICgwLCAyNDYpIDogLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIENBU0UgKDAsIDI0NykgOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgQ0FTRSAoMCwgMjQ4KSA6IC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBDQVNFICgwLCAyNDkpIDogLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIENBU0UgKDAsIDI1MCkgOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgQ0FTRSAoMCwgMjUxKSA6IC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBDQVNFICgwLCAyNTIpIDogLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIENBU0UgKDAsIDI1MykgOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgQ0FTRSAoMCwgMjU0KSA6IC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBDQVNFICgwLCAyNTUpIDoKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgREVDT0RFX0RFU0MgaW5zbnNbMTZdID0geworICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCB7IEkgKElOU05fWF9JTlZBTElEKSwgRSAoRk1UX0VNUFRZKSB9LCAKKyAgICAgICAgICAgICAgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgeyBJIChJTlNOX1hfSU5WQUxJRCksIEUgKEZNVF9FTVBUWSkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIHsgSSAoSU5TTl9YX0lOVkFMSUQpLCBFIChGTVRfRU1QVFkpIH0sIAorICAgICAgICAgICAgICB7IEkgKElOU05fQkMyNCksIEUgKEZNVF9CQzI0KSB9LCB7IEkgKElOU05fQk5DMjQpLCBFIChGTVRfQkMyNCkgfSwgCisgICAgICAgICAgICAgIHsgSSAoSU5TTl9CTDI0KSwgRSAoRk1UX0JMMjQpIH0sIHsgSSAoSU5TTl9CUkEyNCksIEUgKEZNVF9CUkEyNCkgfSwgCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdW5zaWduZWQgaW50IHZhbCA9ICgoKGluc24gPj4gOCkgJiAoMTUgPDwgMCkpKTsKKyAgICAgICAgICAgIGlkZWNvZGUgPSAmaW5zbnNbdmFsXTsKKyAgICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgICAgfQorICAgICAgICBERUZBVUxUICgwKSA6CisgICAgICAgICAgaWRlY29kZSA9ICZpbnNuc1t2YWxdOworICAgICAgICAgIEdPVE9fRVhUUkFDVCAoaWRlY29kZSk7CisgICAgICAgIH0KKyAgICAgIEVORFNXSVRDSCAoMCkKKyAgICB9CisjdW5kZWYgSQorI3VuZGVmIEUKKyAgfQorCisgIC8qIFRoZSBpbnN0cnVjdGlvbiBoYXMgYmVlbiBkZWNvZGVkLCBub3cgZXh0cmFjdCB0aGUgZmllbGRzLiAgKi8KKworIGV4dHJhY3Q6CisgIHsKKyNpZm5kZWYgX19HTlVDX18KKyAgICBzd2l0Y2ggKGlkZWNvZGUtPnNmbXQpCisjZW5kaWYKKyAgICAgIHsKKworICBDQVNFIChleCwgRk1UX0VNUFRZKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgorICBFWFRSQUNUX0lGTVRfRU1QVFlfVkFSUyAvKiAqLworCisgIEVYVFJBQ1RfSUZNVF9FTVBUWV9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfZW1wdHkiLCAoY2hhciAqKSAwKSk7CisKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQUREKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkLmYKKyAgRVhUUkFDVF9JRk1UX0FERF9WQVJTIC8qIGYtb3AxIGYtcjEgZi1vcDIgZi1yMiAqLworCisgIEVYVFJBQ1RfSUZNVF9BRERfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07CisgIEZMRCAoaV9zcikgPSAmIENQVSAoaF9ncilbZl9yMl07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2FkZCIsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAic3IgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX2RyKSA9IGZfcjE7CisgICAgICBGTEQgKGluX3NyKSA9IGZfcjI7CisgICAgICBGTEQgKG91dF9kcikgPSBmX3IxOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9BREQzKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkMy5mCisgIEVYVFJBQ1RfSUZNVF9BREQzX1ZBUlMgLyogZi1vcDEgZi1yMSBmLW9wMiBmLXIyIGYtc2ltbTE2ICovCisKKyAgRVhUUkFDVF9JRk1UX0FERDNfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zaW1tMTYpID0gZl9zaW1tMTY7CisgIEZMRCAoaV9zcikgPSAmIENQVSAoaF9ncilbZl9yMl07CisgIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2FkZDMiLCAiZl9zaW1tMTYgMHgleCIsICd4JywgZl9zaW1tMTYsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAiZHIgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyKSA9IGZfcjI7CisgICAgICBGTEQgKG91dF9kcikgPSBmX3IxOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9BTkQzKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYW5kMy5mCisgIEVYVFJBQ1RfSUZNVF9BTkQzX1ZBUlMgLyogZi1vcDEgZi1yMSBmLW9wMiBmLXIyIGYtdWltbTE2ICovCisKKyAgRVhUUkFDVF9JRk1UX0FORDNfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl91aW1tMTYpID0gZl91aW1tMTY7CisgIEZMRCAoaV9zcikgPSAmIENQVSAoaF9ncilbZl9yMl07CisgIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2FuZDMiLCAiZl91aW1tMTYgMHgleCIsICd4JywgZl91aW1tMTYsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAiZHIgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyKSA9IGZfcjI7CisgICAgICBGTEQgKG91dF9kcikgPSBmX3IxOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9PUjMpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9vcjMuZgorICBFWFRSQUNUX0lGTVRfT1IzX1ZBUlMgLyogZi1vcDEgZi1yMSBmLW9wMiBmLXIyIGYtdWltbTE2ICovCisKKyAgRVhUUkFDVF9JRk1UX09SM19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3VpbW0xNikgPSBmX3VpbW0xNjsKKyAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKKyAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfb3IzIiwgImZfdWltbTE2IDB4JXgiLCAneCcsIGZfdWltbTE2LCAic3IgMHgleCIsICd4JywgZl9yMiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zcikgPSBmX3IyOworICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQURESSkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZGkuZgorICBFWFRSQUNUX0lGTVRfQURESV9WQVJTIC8qIGYtb3AxIGYtcjEgZi1zaW1tOCAqLworCisgIEVYVFJBQ1RfSUZNVF9BRERJX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc2ltbTgpID0gZl9zaW1tODsKKyAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfYWRkaSIsICJmX3NpbW04IDB4JXgiLCAneCcsIGZfc2ltbTgsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fZHIpID0gZl9yMTsKKyAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0FERFYpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGR2LmYKKyAgRVhUUkFDVF9JRk1UX0FERF9WQVJTIC8qIGYtb3AxIGYtcjEgZi1vcDIgZi1yMiAqLworCisgIEVYVFJBQ1RfSUZNVF9BRERfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07CisgIEZMRCAoaV9zcikgPSAmIENQVSAoaF9ncilbZl9yMl07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2FkZHYiLCAiZHIgMHgleCIsICd4JywgZl9yMSwgInNyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9kcikgPSBmX3IxOworICAgICAgRkxEIChpbl9zcikgPSBmX3IyOworICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQUREVjMpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGR2My5mCisgIEVYVFJBQ1RfSUZNVF9BRERWM19WQVJTIC8qIGYtb3AxIGYtcjEgZi1vcDIgZi1yMiBmLXNpbW0xNiAqLworCisgIEVYVFJBQ1RfSUZNVF9BRERWM19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NpbW0xNikgPSBmX3NpbW0xNjsKKyAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKKyAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfYWRkdjMiLCAiZl9zaW1tMTYgMHgleCIsICd4JywgZl9zaW1tMTYsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAiZHIgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyKSA9IGZfcjI7CisgICAgICBGTEQgKG91dF9kcikgPSBmX3IxOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9BRERYKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkeC5mCisgIEVYVFJBQ1RfSUZNVF9BRERfVkFSUyAvKiBmLW9wMSBmLXIxIGYtb3AyIGYtcjIgKi8KKworICBFWFRSQUNUX0lGTVRfQUREX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOworICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9hZGR4IiwgImRyIDB4JXgiLCAneCcsIGZfcjEsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fZHIpID0gZl9yMTsKKyAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKKyAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0JDOCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmM4LmYKKyAgRVhUUkFDVF9JRk1UX0JDOF9WQVJTIC8qIGYtb3AxIGYtcjEgZi1kaXNwOCAqLworCisgIEVYVFJBQ1RfSUZNVF9CQzhfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9kaXNwOCkgPSBmX2Rpc3A4OworICBTRU1fQlJBTkNIX0lOSVRfRVhUUkFDVCAoYWJ1Zik7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2JjOCIsICJkaXNwOCAweCV4IiwgJ3gnLCBmX2Rpc3A4LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQkMyNCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmMyNC5mCisgIEVYVFJBQ1RfSUZNVF9CQzI0X1ZBUlMgLyogZi1vcDEgZi1yMSBmLWRpc3AyNCAqLworCisgIEVYVFJBQ1RfSUZNVF9CQzI0X0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfZGlzcDI0KSA9IGZfZGlzcDI0OworICBTRU1fQlJBTkNIX0lOSVRfRVhUUkFDVCAoYWJ1Zik7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2JjMjQiLCAiZGlzcDI0IDB4JXgiLCAneCcsIGZfZGlzcDI0LCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQkVRKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iZXEuZgorICBFWFRSQUNUX0lGTVRfQkVRX1ZBUlMgLyogZi1vcDEgZi1yMSBmLW9wMiBmLXIyIGYtZGlzcDE2ICovCisKKyAgRVhUUkFDVF9JRk1UX0JFUV9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX2Rpc3AxNikgPSBmX2Rpc3AxNjsKKyAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOworICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07CisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfYmVxIiwgImRpc3AxNiAweCV4IiwgJ3gnLCBmX2Rpc3AxNiwgInNyYzEgMHgleCIsICd4JywgZl9yMSwgInNyYzIgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyYzEpID0gZl9yMTsKKyAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3IyOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9CRVFaKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iZXF6LmYKKyAgRVhUUkFDVF9JRk1UX0JFUVpfVkFSUyAvKiBmLW9wMSBmLXIxIGYtb3AyIGYtcjIgZi1kaXNwMTYgKi8KKworICBFWFRSQUNUX0lGTVRfQkVRWl9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX2Rpc3AxNikgPSBmX2Rpc3AxNjsKKyAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOworICBTRU1fQlJBTkNIX0lOSVRfRVhUUkFDVCAoYWJ1Zik7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2JlcXoiLCAiZGlzcDE2IDB4JXgiLCAneCcsIGZfZGlzcDE2LCAic3JjMiAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3IyOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9CTDgpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JsOC5mCisgIEVYVFJBQ1RfSUZNVF9CQzhfVkFSUyAvKiBmLW9wMSBmLXIxIGYtZGlzcDggKi8KKworICBFWFRSQUNUX0lGTVRfQkM4X0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfZGlzcDgpID0gZl9kaXNwODsKKyAgU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QgKGFidWYpOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9ibDgiLCAiZGlzcDggMHgleCIsICd4JywgZl9kaXNwOCwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9oX2dyXzE0KSA9IDE0OworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9CTDI0KSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibDI0LmYKKyAgRVhUUkFDVF9JRk1UX0JDMjRfVkFSUyAvKiBmLW9wMSBmLXIxIGYtZGlzcDI0ICovCisKKyAgRVhUUkFDVF9JRk1UX0JDMjRfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9kaXNwMjQpID0gZl9kaXNwMjQ7CisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfYmwyNCIsICJkaXNwMjQgMHgleCIsICd4JywgZl9kaXNwMjQsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChvdXRfaF9ncl8xNCkgPSAxNDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQlJBOCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYnJhOC5mCisgIEVYVFJBQ1RfSUZNVF9CQzhfVkFSUyAvKiBmLW9wMSBmLXIxIGYtZGlzcDggKi8KKworICBFWFRSQUNUX0lGTVRfQkM4X0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfZGlzcDgpID0gZl9kaXNwODsKKyAgU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QgKGFidWYpOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9icmE4IiwgImRpc3A4IDB4JXgiLCAneCcsIGZfZGlzcDgsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9CUkEyNCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYnJhMjQuZgorICBFWFRSQUNUX0lGTVRfQkMyNF9WQVJTIC8qIGYtb3AxIGYtcjEgZi1kaXNwMjQgKi8KKworICBFWFRSQUNUX0lGTVRfQkMyNF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX2Rpc3AyNCkgPSBmX2Rpc3AyNDsKKyAgU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QgKGFidWYpOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9icmEyNCIsICJkaXNwMjQgMHgleCIsICd4JywgZl9kaXNwMjQsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9DTVApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXAuZgorICBFWFRSQUNUX0lGTVRfQ01QX1ZBUlMgLyogZi1vcDEgZi1yMSBmLW9wMiBmLXIyICovCisKKyAgRVhUUkFDVF9JRk1UX0NNUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOworICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2NtcCIsICJzcmMxIDB4JXgiLCAneCcsIGZfcjEsICJzcmMyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zcmMxKSA9IGZfcjE7CisgICAgICBGTEQgKGluX3NyYzIpID0gZl9yMjsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfQ01QSSkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkuZgorICBFWFRSQUNUX0lGTVRfQ01QSV9WQVJTIC8qIGYtb3AxIGYtcjEgZi1vcDIgZi1yMiBmLXNpbW0xNiAqLworCisgIEVYVFJBQ1RfSUZNVF9DTVBJX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc2ltbTE2KSA9IGZfc2ltbTE2OworICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2NtcGkiLCAiZl9zaW1tMTYgMHgleCIsICd4JywgZl9zaW1tMTYsICJzcmMyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zcmMyKSA9IGZfcjI7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0RJVikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rpdi5mCisgIEVYVFJBQ1RfSUZNVF9ESVZfVkFSUyAvKiBmLW9wMSBmLXIxIGYtb3AyIGYtcjIgZi1zaW1tMTYgKi8KKworICBFWFRSQUNUX0lGTVRfRElWX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOworICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9kaXYiLCAiZHIgMHgleCIsICd4JywgZl9yMSwgInNyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9kcikgPSBmX3IxOworICAgICAgRkxEIChpbl9zcikgPSBmX3IyOworICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfSkwpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2psLmYKKyAgRVhUUkFDVF9JRk1UX0pMX1ZBUlMgLyogZi1vcDEgZi1yMSBmLW9wMiBmLXIyICovCisKKyAgRVhUUkFDVF9JRk1UX0pMX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOworICBTRU1fQlJBTkNIX0lOSVRfRVhUUkFDVCAoYWJ1Zik7CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2psIiwgInNyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zcikgPSBmX3IyOworICAgICAgRkxEIChvdXRfaF9ncl8xNCkgPSAxNDsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfSk1QKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9qbXAuZgorICBFWFRSQUNUX0lGTVRfSkxfVkFSUyAvKiBmLW9wMSBmLXIxIGYtb3AyIGYtcjIgKi8KKworICBFWFRSQUNUX0lGTVRfSkxfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9zcikgPSAmIENQVSAoaF9ncilbZl9yMl07CisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfam1wIiwgInNyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zcikgPSBmX3IyOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkLmYKKyAgRVhUUkFDVF9JRk1UX0FERF9WQVJTIC8qIGYtb3AxIGYtcjEgZi1vcDIgZi1yMiAqLworCisgIEVYVFJBQ1RfSUZNVF9BRERfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9zcikgPSAmIENQVSAoaF9ncilbZl9yMl07CisgIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkIiwgInNyIDB4JXgiLCAneCcsIGZfcjIsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKKyAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xEX0QpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZF9kLmYKKyAgRVhUUkFDVF9JRk1UX0FERDNfVkFSUyAvKiBmLW9wMSBmLXIxIGYtb3AyIGYtcjIgZi1zaW1tMTYgKi8KKworICBFWFRSQUNUX0lGTVRfQUREM19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NpbW0xNikgPSBmX3NpbW0xNjsKKyAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKKyAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRfZCIsICJmX3NpbW0xNiAweCV4IiwgJ3gnLCBmX3NpbW0xNiwgInNyIDB4JXgiLCAneCcsIGZfcjIsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKKyAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xEQikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYi5mCisgIEVYVFJBQ1RfSUZNVF9BRERfVkFSUyAvKiBmLW9wMSBmLXIxIGYtb3AyIGYtcjIgKi8KKworICBFWFRSQUNUX0lGTVRfQUREX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOworICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZGIiLCAic3IgMHgleCIsICd4JywgZl9yMiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zcikgPSBmX3IyOworICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERCX0QpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGJfZC5mCisgIEVYVFJBQ1RfSUZNVF9BREQzX1ZBUlMgLyogZi1vcDEgZi1yMSBmLW9wMiBmLXIyIGYtc2ltbTE2ICovCisKKyAgRVhUUkFDVF9JRk1UX0FERDNfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zaW1tMTYpID0gZl9zaW1tMTY7CisgIEZMRCAoaV9zcikgPSAmIENQVSAoaF9ncilbZl9yMl07CisgIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkYl9kIiwgImZfc2ltbTE2IDB4JXgiLCAneCcsIGZfc2ltbTE2LCAic3IgMHgleCIsICd4JywgZl9yMiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zcikgPSBmX3IyOworICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERIKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRoLmYKKyAgRVhUUkFDVF9JRk1UX0FERF9WQVJTIC8qIGYtb3AxIGYtcjEgZi1vcDIgZi1yMiAqLworCisgIEVYVFJBQ1RfSUZNVF9BRERfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9zcikgPSAmIENQVSAoaF9ncilbZl9yMl07CisgIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkaCIsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAiZHIgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyKSA9IGZfcjI7CisgICAgICBGTEQgKG91dF9kcikgPSBmX3IxOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MREhfRCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaF9kLmYKKyAgRVhUUkFDVF9JRk1UX0FERDNfVkFSUyAvKiBmLW9wMSBmLXIxIGYtb3AyIGYtcjIgZi1zaW1tMTYgKi8KKworICBFWFRSQUNUX0lGTVRfQUREM19DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NpbW0xNikgPSBmX3NpbW0xNjsKKyAgRkxEIChpX3NyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKKyAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRoX2QiLCAiZl9zaW1tMTYgMHgleCIsICd4JywgZl9zaW1tMTYsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAiZHIgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyKSA9IGZfcjI7CisgICAgICBGTEQgKG91dF9kcikgPSBmX3IxOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRF9QTFVTKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfcGx1cy5mCisgIEVYVFJBQ1RfSUZNVF9BRERfVkFSUyAvKiBmLW9wMSBmLXIxIGYtb3AyIGYtcjIgKi8KKworICBFWFRSQUNUX0lGTVRfQUREX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOworICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZF9wbHVzIiwgInNyIDB4JXgiLCAneCcsIGZfcjIsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKKyAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7CisgICAgICBGTEQgKG91dF9zcikgPSBmX3IyOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MRDI0KSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGQyNC5mCisgIEVYVFJBQ1RfSUZNVF9MRDI0X1ZBUlMgLyogZi1vcDEgZi1yMSBmLXVpbW0yNCAqLworCisgIEVYVFJBQ1RfSUZNVF9MRDI0X0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfdWltbTI0KSA9IGZfdWltbTI0OworICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sZDI0IiwgInVpbW0yNCAweCV4IiwgJ3gnLCBmX3VpbW0yNCwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTERJOCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaTguZgorICBFWFRSQUNUX0lGTVRfQURESV9WQVJTIC8qIGYtb3AxIGYtcjEgZi1zaW1tOCAqLworCisgIEVYVFJBQ1RfSUZNVF9BRERJX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc2ltbTgpID0gZl9zaW1tODsKKyAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbGRpOCIsICJmX3NpbW04IDB4JXgiLCAneCcsIGZfc2ltbTgsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX0xESTE2KSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpMTYuZgorICBFWFRSQUNUX0lGTVRfTERJMTZfVkFSUyAvKiBmLW9wMSBmLXIxIGYtb3AyIGYtcjIgZi1zaW1tMTYgKi8KKworICBFWFRSQUNUX0lGTVRfTERJMTZfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zaW1tMTYpID0gZl9zaW1tMTY7CisgIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X2xkaTE2IiwgImZfc2ltbTE2IDB4JXgiLCAneCcsIGZfc2ltbTE2LCAiZHIgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9kcikgPSBmX3IxOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9MT0NLKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbG9jay5mCisgIEVYVFJBQ1RfSUZNVF9BRERfVkFSUyAvKiBmLW9wMSBmLXIxIGYtb3AyIGYtcjIgKi8KKworICBFWFRSQUNUX0lGTVRfQUREX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOworICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9sb2NrIiwgInNyIDB4JXgiLCAneCcsIGZfcjIsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fc3IpID0gZl9yMjsKKyAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX01BQ0hJKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbWFjaGkuZgorICBFWFRSQUNUX0lGTVRfQ01QX1ZBUlMgLyogZi1vcDEgZi1yMSBmLW9wMiBmLXIyICovCisKKyAgRVhUUkFDVF9JRk1UX0NNUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOworICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X21hY2hpIiwgInNyYzEgMHgleCIsICd4JywgZl9yMSwgInNyYzIgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyYzEpID0gZl9yMTsKKyAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3IyOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9NVUxISSkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bGhpLmYKKyAgRVhUUkFDVF9JRk1UX0NNUF9WQVJTIC8qIGYtb3AxIGYtcjEgZi1vcDIgZi1yMiAqLworCisgIEVYVFJBQ1RfSUZNVF9DTVBfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKKyAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9tdWxoaSIsICJzcmMxIDB4JXgiLCAneCcsIGZfcjEsICJzcmMyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zcmMxKSA9IGZfcjE7CisgICAgICBGTEQgKGluX3NyYzIpID0gZl9yMjsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTVYpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdi5mCisgIEVYVFJBQ1RfSUZNVF9BRERfVkFSUyAvKiBmLW9wMSBmLXIxIGYtb3AyIGYtcjIgKi8KKworICBFWFRSQUNUX0lGTVRfQUREX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOworICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9tdiIsICJzciAweCV4IiwgJ3gnLCBmX3IyLCAiZHIgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyKSA9IGZfcjI7CisgICAgICBGTEQgKG91dF9kcikgPSBmX3IxOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9NVkZBQ0hJKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXZmYWNoaS5mCisgIEVYVFJBQ1RfSUZNVF9NVkZBQ0hJX1ZBUlMgLyogZi1vcDEgZi1yMSBmLW9wMiBmLXIyICovCisKKyAgRVhUUkFDVF9JRk1UX01WRkFDSElfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9kcikgPSAmIENQVSAoaF9ncilbZl9yMV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X212ZmFjaGkiLCAiZHIgMHgleCIsICd4JywgZl9yMSwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKG91dF9kcikgPSBmX3IxOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9NVkZDKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXZmYy5mCisgIEVYVFJBQ1RfSUZNVF9NVkZDX1ZBUlMgLyogZi1vcDEgZi1yMSBmLW9wMiBmLXIyICovCisKKyAgRVhUUkFDVF9JRk1UX01WRkNfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9yMikgPSBmX3IyOworICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9tdmZjIiwgImZfcjIgMHgleCIsICd4JywgZl9yMiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfTVZUQUNISSkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X212dGFjaGkuZgorICBFWFRSQUNUX0lGTVRfTVZUQUNISV9WQVJTIC8qIGYtb3AxIGYtcjEgZi1vcDIgZi1yMiAqLworCisgIEVYVFJBQ1RfSUZNVF9NVlRBQ0hJX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9yMV07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X212dGFjaGkiLCAic3JjMSAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3IxOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9NVlRDKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXZ0Yy5mCisgIEVYVFJBQ1RfSUZNVF9NVlRDX1ZBUlMgLyogZi1vcDEgZi1yMSBmLW9wMiBmLXIyICovCisKKyAgRVhUUkFDVF9JRk1UX01WVENfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9yMSkgPSBmX3IxOworICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9tdnRjIiwgImZfcjEgMHgleCIsICd4JywgZl9yMSwgInNyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zcikgPSBmX3IyOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9OT1ApIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3AuZgorICBFWFRSQUNUX0lGTVRfTk9QX1ZBUlMgLyogZi1vcDEgZi1yMSBmLW9wMiBmLXIyICovCisKKyAgRVhUUkFDVF9JRk1UX05PUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfbm9wIiwgKGNoYXIgKikgMCkpOworCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1JBQykgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3JhYy5mCisgIEVYVFJBQ1RfSUZNVF9OT1BfVkFSUyAvKiBmLW9wMSBmLXIxIGYtb3AyIGYtcjIgKi8KKworICBFWFRSQUNUX0lGTVRfTk9QX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9yYWMiLCAoY2hhciAqKSAwKSk7CisKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfUlRFKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ydGUuZgorICBFWFRSQUNUX0lGTVRfTk9QX1ZBUlMgLyogZi1vcDEgZi1yMSBmLW9wMiBmLXIyICovCisKKyAgRVhUUkFDVF9JRk1UX05PUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgU0VNX0JSQU5DSF9JTklUX0VYVFJBQ1QgKGFidWYpOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9ydGUiLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU0VUSCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3NldGguZgorICBFWFRSQUNUX0lGTVRfU0VUSF9WQVJTIC8qIGYtb3AxIGYtcjEgZi1vcDIgZi1yMiBmLWhpMTYgKi8KKworICBFWFRSQUNUX0lGTVRfU0VUSF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX2hpMTYpID0gZl9oaTE2OworICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zZXRoIiwgImZfaGkxNiAweCV4IiwgJ3gnLCBmX2hpMTYsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NMTDMpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zbGwzLmYKKyAgRVhUUkFDVF9JRk1UX0FERFYzX1ZBUlMgLyogZi1vcDEgZi1yMSBmLW9wMiBmLXIyIGYtc2ltbTE2ICovCisKKyAgRVhUUkFDVF9JRk1UX0FERFYzX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfc2ltbTE2KSA9IGZfc2ltbTE2OworICBGTEQgKGlfc3IpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOworICBGTEQgKGlfZHIpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zbGwzIiwgImZfc2ltbTE2IDB4JXgiLCAneCcsIGZfc2ltbTE2LCAic3IgMHgleCIsICd4JywgZl9yMiwgImRyIDB4JXgiLCAneCcsIGZfcjEsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zcikgPSBmX3IyOworICAgICAgRkxEIChvdXRfZHIpID0gZl9yMTsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisgIENBU0UgKGV4LCBGTVRfU0xMSSkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3NsbGkuZgorICBFWFRSQUNUX0lGTVRfU0xMSV9WQVJTIC8qIGYtb3AxIGYtcjEgZi1zaGlmdC1vcDIgZi11aW1tNSAqLworCisgIEVYVFJBQ1RfSUZNVF9TTExJX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGZfdWltbTUpID0gZl91aW1tNTsKKyAgRkxEIChpX2RyKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc2xsaSIsICJmX3VpbW01IDB4JXgiLCAneCcsIGZfdWltbTUsICJkciAweCV4IiwgJ3gnLCBmX3IxLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fZHIpID0gZl9yMTsKKyAgICAgIEZMRCAob3V0X2RyKSA9IGZfcjE7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3QuZgorICBFWFRSQUNUX0lGTVRfQ01QX1ZBUlMgLyogZi1vcDEgZi1yMSBmLW9wMiBmLXIyICovCisKKyAgRVhUUkFDVF9JRk1UX0NNUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOworICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0IiwgInNyYzEgMHgleCIsICd4JywgZl9yMSwgInNyYzIgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyYzEpID0gZl9yMTsKKyAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3IyOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVF9EKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfZC5mCisgIEVYVFJBQ1RfSUZNVF9TVF9EX1ZBUlMgLyogZi1vcDEgZi1yMSBmLW9wMiBmLXIyIGYtc2ltbTE2ICovCisKKyAgRVhUUkFDVF9JRk1UX1NUX0RfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoZl9zaW1tMTYpID0gZl9zaW1tMTY7CisgIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKKyAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdF9kIiwgImZfc2ltbTE2IDB4JXgiLCAneCcsIGZfc2ltbTE2LCAic3JjMSAweCV4IiwgJ3gnLCBmX3IxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3IxOworICAgICAgRkxEIChpbl9zcmMyKSA9IGZfcjI7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUQikgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0Yi5mCisgIEVYVFJBQ1RfSUZNVF9DTVBfVkFSUyAvKiBmLW9wMSBmLXIxIGYtb3AyIGYtcjIgKi8KKworICBFWFRSQUNUX0lGTVRfQ01QX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9yMV07CisgIEZMRCAoaV9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RiIiwgInNyYzEgMHgleCIsICd4JywgZl9yMSwgInNyYzIgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyYzEpID0gZl9yMTsKKyAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3IyOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVEJfRCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0Yl9kLmYKKyAgRVhUUkFDVF9JRk1UX1NUX0RfVkFSUyAvKiBmLW9wMSBmLXIxIGYtb3AyIGYtcjIgZi1zaW1tMTYgKi8KKworICBFWFRSQUNUX0lGTVRfU1RfRF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NpbW0xNikgPSBmX3NpbW0xNjsKKyAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOworICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0Yl9kIiwgImZfc2ltbTE2IDB4JXgiLCAneCcsIGZfc2ltbTE2LCAic3JjMSAweCV4IiwgJ3gnLCBmX3IxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3IxOworICAgICAgRkxEIChpbl9zcmMyKSA9IGZfcjI7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUSCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0aC5mCisgIEVYVFJBQ1RfSUZNVF9DTVBfVkFSUyAvKiBmLW9wMSBmLXIxIGYtb3AyIGYtcjIgKi8KKworICBFWFRSQUNUX0lGTVRfQ01QX0NPREUKKworICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgdGhlIHNlbWFudGljIGhhbmRsZXIuICAqLworICBGTEQgKGlfc3JjMSkgPSAmIENQVSAoaF9ncilbZl9yMV07CisgIEZMRCAoaV9zcmMyKSA9ICYgQ1BVIChoX2dyKVtmX3IyXTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfc3RoIiwgInNyYzEgMHgleCIsICd4JywgZl9yMSwgInNyYzIgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyYzEpID0gZl9yMTsKKyAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3IyOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9TVEhfRCkgOgorICB7CisgICAgQ0dFTl9JTlNOX0lOVCBpbnNuID0gZW50aXJlX2luc247CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0aF9kLmYKKyAgRVhUUkFDVF9JRk1UX1NUX0RfVkFSUyAvKiBmLW9wMSBmLXIxIGYtb3AyIGYtcjIgZi1zaW1tMTYgKi8KKworICBFWFRSQUNUX0lGTVRfU1RfRF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3NpbW0xNikgPSBmX3NpbW0xNjsKKyAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOworICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3N0aF9kIiwgImZfc2ltbTE2IDB4JXgiLCAneCcsIGZfc2ltbTE2LCAic3JjMSAweCV4IiwgJ3gnLCBmX3IxLCAic3JjMiAweCV4IiwgJ3gnLCBmX3IyLCAoY2hhciAqKSAwKSk7CisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorICAvKiBSZWNvcmQgdGhlIGZpZWxkcyBmb3IgcHJvZmlsaW5nLiAgKi8KKyAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpKQorICAgIHsKKyAgICAgIEZMRCAoaW5fc3JjMSkgPSBmX3IxOworICAgICAgRkxEIChpbl9zcmMyKSA9IGZfcjI7CisgICAgfQorI2VuZGlmCisjdW5kZWYgRkxECisgIEJSRUFLIChleCk7CisgIH0KKworICBDQVNFIChleCwgRk1UX1NUX1BMVVMpIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9wbHVzLmYKKyAgRVhUUkFDVF9JRk1UX0NNUF9WQVJTIC8qIGYtb3AxIGYtcjEgZi1vcDIgZi1yMiAqLworCisgIEVYVFJBQ1RfSUZNVF9DTVBfQ09ERQorCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciB0aGUgc2VtYW50aWMgaGFuZGxlci4gICovCisgIEZMRCAoaV9zcmMxKSA9ICYgQ1BVIChoX2dyKVtmX3IxXTsKKyAgRkxEIChpX3NyYzIpID0gJiBDUFUgKGhfZ3IpW2ZfcjJdOworICBUUkFDRV9FWFRSQUNUIChjdXJyZW50X2NwdSwgYWJ1ZiwgKGN1cnJlbnRfY3B1LCBwYywgImZtdF9zdF9wbHVzIiwgInNyYzEgMHgleCIsICd4JywgZl9yMSwgInNyYzIgMHgleCIsICd4JywgZl9yMiwgKGNoYXIgKikgMCkpOworCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHByb2ZpbGluZy4gICovCisgIGlmIChQUk9GSUxFX01PREVMX1AgKGN1cnJlbnRfY3B1KSkKKyAgICB7CisgICAgICBGTEQgKGluX3NyYzEpID0gZl9yMTsKKyAgICAgIEZMRCAoaW5fc3JjMikgPSBmX3IyOworICAgICAgRkxEIChvdXRfc3JjMikgPSBmX3IyOworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9UUkFQKSA6CisgIHsKKyAgICBDR0VOX0lOU05fSU5UIGluc24gPSBlbnRpcmVfaW5zbjsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF90cmFwLmYKKyAgRVhUUkFDVF9JRk1UX1RSQVBfVkFSUyAvKiBmLW9wMSBmLXIxIGYtb3AyIGYtdWltbTQgKi8KKworICBFWFRSQUNUX0lGTVRfVFJBUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChmX3VpbW00KSA9IGZfdWltbTQ7CisgIFNFTV9CUkFOQ0hfSU5JVF9FWFRSQUNUIChhYnVmKTsKKyAgVFJBQ0VfRVhUUkFDVCAoY3VycmVudF9jcHUsIGFidWYsIChjdXJyZW50X2NwdSwgcGMsICJmbXRfdHJhcCIsICJmX3VpbW00IDB4JXgiLCAneCcsIGZfdWltbTQsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgIH0KKyNlbmRpZgorI3VuZGVmIEZMRAorICBCUkVBSyAoZXgpOworICB9CisKKyAgQ0FTRSAoZXgsIEZNVF9VTkxPQ0spIDoKKyAgeworICAgIENHRU5fSU5TTl9JTlQgaW5zbiA9IGVudGlyZV9pbnNuOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF91bmxvY2suZgorICBFWFRSQUNUX0lGTVRfQ01QX1ZBUlMgLyogZi1vcDEgZi1yMSBmLW9wMiBmLXIyICovCisKKyAgRVhUUkFDVF9JRk1UX0NNUF9DT0RFCisKKyAgLyogUmVjb3JkIHRoZSBmaWVsZHMgZm9yIHRoZSBzZW1hbnRpYyBoYW5kbGVyLiAgKi8KKyAgRkxEIChpX3NyYzEpID0gJiBDUFUgKGhfZ3IpW2ZfcjFdOworICBGTEQgKGlfc3JjMikgPSAmIENQVSAoaF9ncilbZl9yMl07CisgIFRSQUNFX0VYVFJBQ1QgKGN1cnJlbnRfY3B1LCBhYnVmLCAoY3VycmVudF9jcHUsIHBjLCAiZm10X3VubG9jayIsICJzcmMxIDB4JXgiLCAneCcsIGZfcjEsICJzcmMyIDB4JXgiLCAneCcsIGZfcjIsIChjaGFyICopIDApKTsKKworI2lmIFdJVEhfUFJPRklMRV9NT0RFTF9QCisgIC8qIFJlY29yZCB0aGUgZmllbGRzIGZvciBwcm9maWxpbmcuICAqLworICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkpCisgICAgeworICAgICAgRkxEIChpbl9zcmMxKSA9IGZfcjE7CisgICAgICBGTEQgKGluX3NyYzIpID0gZl9yMjsKKyAgICB9CisjZW5kaWYKKyN1bmRlZiBGTEQKKyAgQlJFQUsgKGV4KTsKKyAgfQorCisKKyAgICAgIH0KKyAgICBFTkRTV0lUQ0ggKGV4KQorCisgIH0KKworICByZXR1cm4gaWRlY29kZS0+aWRlc2M7Cit9CmRpZmYgLS1naXQgYS9zaW0vbTMyci9kZWNvZGUuaCBiL3NpbS9tMzJyL2RlY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNDcxZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbTMyci9kZWNvZGUuaApAQCAtMCwwICsxLDIwOCBAQAorLyogRGVjb2RlIGhlYWRlciBmb3IgbTMycmJmLgorCitUSElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgorCitDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisqLworCisjaWZuZGVmIE0zMlJCRl9ERUNPREVfSAorI2RlZmluZSBNMzJSQkZfREVDT0RFX0gKKworZXh0ZXJuIGNvbnN0IElERVNDICptMzJyYmZfZGVjb2RlIChTSU1fQ1BVICosIElBRERSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHRU5fSU5TTl9JTlQsIENHRU5fSU5TTl9JTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJHQlVGICopOworZXh0ZXJuIHZvaWQgbTMycmJmX2luaXRfaWRlc2NfdGFibGUgKFNJTV9DUFUgKik7CisKKy8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc3RydWN0aW9ucyBpbiBjcHUgZmFtaWx5IG0zMnJiZi4gICovCit0eXBlZGVmIGVudW0gbTMycmJmX2luc25fdHlwZSB7CisgIE0zMlJCRl9JTlNOX1hfSU5WQUxJRCwgTTMyUkJGX0lOU05fWF9BRlRFUiwgTTMyUkJGX0lOU05fWF9CRUZPUkUsIE0zMlJCRl9JTlNOX1hfQ1RJX0NIQUlOCisgLCBNMzJSQkZfSU5TTl9YX0NIQUlOLCBNMzJSQkZfSU5TTl9YX0JFR0lOLCBNMzJSQkZfSU5TTl9BREQsIE0zMlJCRl9JTlNOX0FERDMKKyAsIE0zMlJCRl9JTlNOX0FORCwgTTMyUkJGX0lOU05fQU5EMywgTTMyUkJGX0lOU05fT1IsIE0zMlJCRl9JTlNOX09SMworICwgTTMyUkJGX0lOU05fWE9SLCBNMzJSQkZfSU5TTl9YT1IzLCBNMzJSQkZfSU5TTl9BRERJLCBNMzJSQkZfSU5TTl9BRERWCisgLCBNMzJSQkZfSU5TTl9BRERWMywgTTMyUkJGX0lOU05fQUREWCwgTTMyUkJGX0lOU05fQkM4LCBNMzJSQkZfSU5TTl9CQzI0CisgLCBNMzJSQkZfSU5TTl9CRVEsIE0zMlJCRl9JTlNOX0JFUVosIE0zMlJCRl9JTlNOX0JHRVosIE0zMlJCRl9JTlNOX0JHVFoKKyAsIE0zMlJCRl9JTlNOX0JMRVosIE0zMlJCRl9JTlNOX0JMVFosIE0zMlJCRl9JTlNOX0JORVosIE0zMlJCRl9JTlNOX0JMOAorICwgTTMyUkJGX0lOU05fQkwyNCwgTTMyUkJGX0lOU05fQk5DOCwgTTMyUkJGX0lOU05fQk5DMjQsIE0zMlJCRl9JTlNOX0JORQorICwgTTMyUkJGX0lOU05fQlJBOCwgTTMyUkJGX0lOU05fQlJBMjQsIE0zMlJCRl9JTlNOX0NNUCwgTTMyUkJGX0lOU05fQ01QSQorICwgTTMyUkJGX0lOU05fQ01QVSwgTTMyUkJGX0lOU05fQ01QVUksIE0zMlJCRl9JTlNOX0RJViwgTTMyUkJGX0lOU05fRElWVQorICwgTTMyUkJGX0lOU05fUkVNLCBNMzJSQkZfSU5TTl9SRU1VLCBNMzJSQkZfSU5TTl9KTCwgTTMyUkJGX0lOU05fSk1QCisgLCBNMzJSQkZfSU5TTl9MRCwgTTMyUkJGX0lOU05fTERfRCwgTTMyUkJGX0lOU05fTERCLCBNMzJSQkZfSU5TTl9MREJfRAorICwgTTMyUkJGX0lOU05fTERILCBNMzJSQkZfSU5TTl9MREhfRCwgTTMyUkJGX0lOU05fTERVQiwgTTMyUkJGX0lOU05fTERVQl9ECisgLCBNMzJSQkZfSU5TTl9MRFVILCBNMzJSQkZfSU5TTl9MRFVIX0QsIE0zMlJCRl9JTlNOX0xEX1BMVVMsIE0zMlJCRl9JTlNOX0xEMjQKKyAsIE0zMlJCRl9JTlNOX0xESTgsIE0zMlJCRl9JTlNOX0xESTE2LCBNMzJSQkZfSU5TTl9MT0NLLCBNMzJSQkZfSU5TTl9NQUNISQorICwgTTMyUkJGX0lOU05fTUFDTE8sIE0zMlJCRl9JTlNOX01BQ1dISSwgTTMyUkJGX0lOU05fTUFDV0xPLCBNMzJSQkZfSU5TTl9NVUwKKyAsIE0zMlJCRl9JTlNOX01VTEhJLCBNMzJSQkZfSU5TTl9NVUxMTywgTTMyUkJGX0lOU05fTVVMV0hJLCBNMzJSQkZfSU5TTl9NVUxXTE8KKyAsIE0zMlJCRl9JTlNOX01WLCBNMzJSQkZfSU5TTl9NVkZBQ0hJLCBNMzJSQkZfSU5TTl9NVkZBQ0xPLCBNMzJSQkZfSU5TTl9NVkZBQ01JCisgLCBNMzJSQkZfSU5TTl9NVkZDLCBNMzJSQkZfSU5TTl9NVlRBQ0hJLCBNMzJSQkZfSU5TTl9NVlRBQ0xPLCBNMzJSQkZfSU5TTl9NVlRDCisgLCBNMzJSQkZfSU5TTl9ORUcsIE0zMlJCRl9JTlNOX05PUCwgTTMyUkJGX0lOU05fTk9ULCBNMzJSQkZfSU5TTl9SQUMKKyAsIE0zMlJCRl9JTlNOX1JBQ0gsIE0zMlJCRl9JTlNOX1JURSwgTTMyUkJGX0lOU05fU0VUSCwgTTMyUkJGX0lOU05fU0xMCisgLCBNMzJSQkZfSU5TTl9TTEwzLCBNMzJSQkZfSU5TTl9TTExJLCBNMzJSQkZfSU5TTl9TUkEsIE0zMlJCRl9JTlNOX1NSQTMKKyAsIE0zMlJCRl9JTlNOX1NSQUksIE0zMlJCRl9JTlNOX1NSTCwgTTMyUkJGX0lOU05fU1JMMywgTTMyUkJGX0lOU05fU1JMSQorICwgTTMyUkJGX0lOU05fU1QsIE0zMlJCRl9JTlNOX1NUX0QsIE0zMlJCRl9JTlNOX1NUQiwgTTMyUkJGX0lOU05fU1RCX0QKKyAsIE0zMlJCRl9JTlNOX1NUSCwgTTMyUkJGX0lOU05fU1RIX0QsIE0zMlJCRl9JTlNOX1NUX1BMVVMsIE0zMlJCRl9JTlNOX1NUX01JTlVTCisgLCBNMzJSQkZfSU5TTl9TVUIsIE0zMlJCRl9JTlNOX1NVQlYsIE0zMlJCRl9JTlNOX1NVQlgsIE0zMlJCRl9JTlNOX1RSQVAKKyAsIE0zMlJCRl9JTlNOX1VOTE9DSywgTTMyUkJGX0lOU05fTUFYCit9IE0zMlJCRl9JTlNOX1RZUEU7CisKKyNpZiAhIFdJVEhfU0VNX1NXSVRDSF9GVUxMCisjZGVmaW5lIFNFTUZVTEwoZm4pIGV4dGVybiBTRU1BTlRJQ19GTiBDT05DQVQzIChtMzJyYmYsX3NlbV8sZm4pOworI2Vsc2UKKyNkZWZpbmUgU0VNRlVMTChmbikKKyNlbmRpZgorCisjaWYgISBXSVRIX1NFTV9TV0lUQ0hfRkFTVAorI2RlZmluZSBTRU1GQVNUKGZuKSBleHRlcm4gU0VNQU5USUNfRk4gQ09OQ0FUMyAobTMycmJmLF9zZW1mXyxmbik7CisjZWxzZQorI2RlZmluZSBTRU1GQVNUKGZuKQorI2VuZGlmCisKKyNkZWZpbmUgU0VNKGZuKSBTRU1GVUxMIChmbikgU0VNRkFTVCAoZm4pCisKKy8qIFRoZSBmdW5jdGlvbiB2ZXJzaW9uIG9mIHRoZSBiZWZvcmUvYWZ0ZXIgaGFuZGxlcnMgaXMgYWx3YXlzIG5lZWRlZCwKKyAgIHNvIHdlIGFsd2F5cyB3YW50IHRoZSBTRU1GVUxMIGRlY2xhcmF0aW9uIG9mIHRoZW0uICAqLworZXh0ZXJuIFNFTUFOVElDX0ZOIENPTkNBVDMgKG0zMnJiZixfc2VtXyx4X2JlZm9yZSk7CitleHRlcm4gU0VNQU5USUNfRk4gQ09OQ0FUMyAobTMycmJmLF9zZW1fLHhfYWZ0ZXIpOworCitTRU0gKHhfaW52YWxpZCkKK1NFTSAoeF9hZnRlcikKK1NFTSAoeF9iZWZvcmUpCitTRU0gKHhfY3RpX2NoYWluKQorU0VNICh4X2NoYWluKQorU0VNICh4X2JlZ2luKQorU0VNIChhZGQpCitTRU0gKGFkZDMpCitTRU0gKGFuZCkKK1NFTSAoYW5kMykKK1NFTSAob3IpCitTRU0gKG9yMykKK1NFTSAoeG9yKQorU0VNICh4b3IzKQorU0VNIChhZGRpKQorU0VNIChhZGR2KQorU0VNIChhZGR2MykKK1NFTSAoYWRkeCkKK1NFTSAoYmM4KQorU0VNIChiYzI0KQorU0VNIChiZXEpCitTRU0gKGJlcXopCitTRU0gKGJnZXopCitTRU0gKGJndHopCitTRU0gKGJsZXopCitTRU0gKGJsdHopCitTRU0gKGJuZXopCitTRU0gKGJsOCkKK1NFTSAoYmwyNCkKK1NFTSAoYm5jOCkKK1NFTSAoYm5jMjQpCitTRU0gKGJuZSkKK1NFTSAoYnJhOCkKK1NFTSAoYnJhMjQpCitTRU0gKGNtcCkKK1NFTSAoY21waSkKK1NFTSAoY21wdSkKK1NFTSAoY21wdWkpCitTRU0gKGRpdikKK1NFTSAoZGl2dSkKK1NFTSAocmVtKQorU0VNIChyZW11KQorU0VNIChqbCkKK1NFTSAoam1wKQorU0VNIChsZCkKK1NFTSAobGRfZCkKK1NFTSAobGRiKQorU0VNIChsZGJfZCkKK1NFTSAobGRoKQorU0VNIChsZGhfZCkKK1NFTSAobGR1YikKK1NFTSAobGR1Yl9kKQorU0VNIChsZHVoKQorU0VNIChsZHVoX2QpCitTRU0gKGxkX3BsdXMpCitTRU0gKGxkMjQpCitTRU0gKGxkaTgpCitTRU0gKGxkaTE2KQorU0VNIChsb2NrKQorU0VNIChtYWNoaSkKK1NFTSAobWFjbG8pCitTRU0gKG1hY3doaSkKK1NFTSAobWFjd2xvKQorU0VNIChtdWwpCitTRU0gKG11bGhpKQorU0VNIChtdWxsbykKK1NFTSAobXVsd2hpKQorU0VNIChtdWx3bG8pCitTRU0gKG12KQorU0VNIChtdmZhY2hpKQorU0VNIChtdmZhY2xvKQorU0VNIChtdmZhY21pKQorU0VNIChtdmZjKQorU0VNIChtdnRhY2hpKQorU0VNIChtdnRhY2xvKQorU0VNIChtdnRjKQorU0VNIChuZWcpCitTRU0gKG5vcCkKK1NFTSAobm90KQorU0VNIChyYWMpCitTRU0gKHJhY2gpCitTRU0gKHJ0ZSkKK1NFTSAoc2V0aCkKK1NFTSAoc2xsKQorU0VNIChzbGwzKQorU0VNIChzbGxpKQorU0VNIChzcmEpCitTRU0gKHNyYTMpCitTRU0gKHNyYWkpCitTRU0gKHNybCkKK1NFTSAoc3JsMykKK1NFTSAoc3JsaSkKK1NFTSAoc3QpCitTRU0gKHN0X2QpCitTRU0gKHN0YikKK1NFTSAoc3RiX2QpCitTRU0gKHN0aCkKK1NFTSAoc3RoX2QpCitTRU0gKHN0X3BsdXMpCitTRU0gKHN0X21pbnVzKQorU0VNIChzdWIpCitTRU0gKHN1YnYpCitTRU0gKHN1YngpCitTRU0gKHRyYXApCitTRU0gKHVubG9jaykKKworI3VuZGVmIFNFTUZVTEwKKyN1bmRlZiBTRU1GQVNUCisjdW5kZWYgU0VNCisKKy8qIEZ1bmN0aW9uIHVuaXQgaGFuZGxlcnMgKHVzZXIgd3JpdHRlbikuICAqLworCitleHRlcm4gaW50IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9zdG9yZSAoU0lNX0NQVSAqLCBjb25zdCBJREVTQyAqLCBpbnQgLyp1bml0X251bSovLCBpbnQgLypyZWZlcmVuY2VkKi8sIElOVCAvKnNyYzEqLywgSU5UIC8qc3JjMiovKTsKK2V4dGVybiBpbnQgbTMycmJmX21vZGVsX20zMnJfZF91X2xvYWQgKFNJTV9DUFUgKiwgY29uc3QgSURFU0MgKiwgaW50IC8qdW5pdF9udW0qLywgaW50IC8qcmVmZXJlbmNlZCovLCBJTlQgLypzciovLCBJTlQgLypkciovKTsKK2V4dGVybiBpbnQgbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoU0lNX0NQVSAqLCBjb25zdCBJREVTQyAqLCBpbnQgLyp1bml0X251bSovLCBpbnQgLypyZWZlcmVuY2VkKi8sIElOVCAvKnNyKi8pOworZXh0ZXJuIGludCBtMzJyYmZfbW9kZWxfbTMycl9kX3VfbWFjIChTSU1fQ1BVICosIGNvbnN0IElERVNDICosIGludCAvKnVuaXRfbnVtKi8sIGludCAvKnJlZmVyZW5jZWQqLywgSU5UIC8qc3JjMSovLCBJTlQgLypzcmMyKi8pOworZXh0ZXJuIGludCBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY21wIChTSU1fQ1BVICosIGNvbnN0IElERVNDICosIGludCAvKnVuaXRfbnVtKi8sIGludCAvKnJlZmVyZW5jZWQqLywgSU5UIC8qc3JjMSovLCBJTlQgLypzcmMyKi8pOworZXh0ZXJuIGludCBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoU0lNX0NQVSAqLCBjb25zdCBJREVTQyAqLCBpbnQgLyp1bml0X251bSovLCBpbnQgLypyZWZlcmVuY2VkKi8sIElOVCAvKnNyKi8sIElOVCAvKmRyKi8sIElOVCAvKmRyKi8pOworZXh0ZXJuIGludCBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKFNJTV9DUFUgKiwgY29uc3QgSURFU0MgKiwgaW50IC8qdW5pdF9udW0qLywgaW50IC8qcmVmZXJlbmNlZCovKTsKKworLyogUHJvZmlsaW5nIGJlZm9yZS9hZnRlciBoYW5kbGVycyAodXNlciB3cml0dGVuKSAqLworCitleHRlcm4gdm9pZCBtMzJyYmZfbW9kZWxfaW5zbl9iZWZvcmUgKFNJTV9DUFUgKiwgaW50IC8qZmlyc3RfcCovKTsKK2V4dGVybiB2b2lkIG0zMnJiZl9tb2RlbF9pbnNuX2FmdGVyIChTSU1fQ1BVICosIGludCAvKmxhc3RfcCovLCBpbnQgLypjeWNsZXMqLyk7CisKKyNlbmRpZiAvKiBNMzJSQkZfREVDT0RFX0ggKi8KZGlmZiAtLWdpdCBhL3NpbS9tMzJyL2RldmljZXMuYyBiL3NpbS9tMzJyL2RldmljZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzA2ODY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL20zMnIvZGV2aWNlcy5jCkBAIC0wLDAgKzEsMTA4IEBACisvKiBtMzJyIGRldmljZSBzdXBwb3J0CisgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorCisjaWZkZWYgSEFWRV9EVl9TT0NLU0VSCisjaW5jbHVkZSAiZHYtc29ja3Nlci5oIgorI2VuZGlmCisKKy8qIEhhbmRsaW5nIHRoZSBNU1BSIHJlZ2lzdGVyIGlzIGRvbmUgYnkgY3JlYXRpbmcgYSBkZXZpY2UgaW4gdGhlIGNvcmUKKyAgIG1hcHBpbmcgdGhhdCB3aW5kcyB1cCBoZXJlLiAgKi8KKworZGV2aWNlIG0zMnJfZGV2aWNlczsKKworaW50CitkZXZpY2VfaW9fcmVhZF9idWZmZXIgKGRldmljZSAqbWUsIHZvaWQgKnNvdXJjZSwgaW50IHNwYWNlLAorCQkgICAgICAgYWRkcmVzc193b3JkIGFkZHIsIHVuc2lnbmVkIG5yX2J5dGVzLAorCQkgICAgICAgU0lNX0NQVSAqY3B1LCBzaW1fY2lhIGNpYSkKK3sKKyAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGNwdSk7CisKKyAgaWYgKFNUQVRFX0VOVklST05NRU5UIChzZCkgIT0gT1BFUkFUSU5HX0VOVklST05NRU5UKQorICAgIHJldHVybiBucl9ieXRlczsKKworI2lmZGVmIEhBVkVfRFZfU09DS1NFUgorICBpZiAoYWRkciA9PSBVQVJUX0lOQ0hBUl9BRERSKQorICAgIHsKKyAgICAgIGludCBjID0gZHZfc29ja3Nlcl9yZWFkIChzZCk7CisgICAgICBpZiAoYyA9PSAtMSkKKwlyZXR1cm4gMDsKKyAgICAgICooY2hhciAqKSBzb3VyY2UgPSBjOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBpZiAoYWRkciA9PSBVQVJUX1NUQVRVU19BRERSKQorICAgIHsKKyAgICAgIGludCBzdGF0dXMgPSBkdl9zb2Nrc2VyX3N0YXR1cyAoc2QpOworICAgICAgdW5zaWduZWQgY2hhciAqcCA9IHNvdXJjZTsKKyAgICAgIHBbMF0gPSAwOworICAgICAgcFsxXSA9ICgoKHN0YXR1cyAmIERWX1NPQ0tTRVJfSU5QVVRfRU1QVFkpCisjaWZkZWYgVUFSVF9JTlBVVF9SRUFEWTAKKwkgICAgICAgPyBVQVJUX0lOUFVUX1JFQURZIDogMCkKKyNlbHNlCisJICAgICAgID8gMCA6IFVBUlRfSU5QVVRfUkVBRFkpCisjZW5kaWYKKwkgICAgICArICgoc3RhdHVzICYgRFZfU09DS1NFUl9PVVRQVVRfRU1QVFkpID8gVUFSVF9PVVRQVVRfUkVBRFkgOiAwKSk7CisgICAgICByZXR1cm4gMjsKKyAgICB9CisjZW5kaWYKKworICByZXR1cm4gbnJfYnl0ZXM7Cit9CisKK2ludAorZGV2aWNlX2lvX3dyaXRlX2J1ZmZlciAoZGV2aWNlICptZSwgY29uc3Qgdm9pZCAqc291cmNlLCBpbnQgc3BhY2UsCisJCQlhZGRyZXNzX3dvcmQgYWRkciwgdW5zaWduZWQgbnJfYnl0ZXMsCisJCQlTSU1fQ1BVICpjcHUsIHNpbV9jaWEgY2lhKQoreworICBTSU1fREVTQyBzZCA9IENQVV9TVEFURSAoY3B1KTsKKworI2lmIFdJVEhfU0NBQ0hFCisgIC8qIE1TUFIgc3VwcG9ydCBpcyBkZXByZWNhdGVkIGJ1dCBpcyBrZXB0IGluIGZvciB1cHdhcmQgY29tcGF0aWJpbGl0eQorICAgICB3aXRoIGV4aXN0aW5nIG92ZXJsYXkgc3VwcG9ydC4gICovCisgIGlmIChhZGRyID09IE1TUFJfQUREUikKKyAgICB7CisgICAgICBpZiAoKCooY29uc3QgY2hhciAqKSBzb3VyY2UgJiBNU1BSX1BVUkdFKSAhPSAwKQorCXNjYWNoZV9mbHVzaCAoc2QpOworICAgICAgcmV0dXJuIG5yX2J5dGVzOworICAgIH0KKyAgaWYgKGFkZHIgPT0gTUNDUl9BRERSKQorICAgIHsKKyAgICAgIGlmICgoKihjb25zdCBjaGFyICopIHNvdXJjZSAmIE1DQ1JfQ1ApICE9IDApCisJc2NhY2hlX2ZsdXNoIChzZCk7CisgICAgICByZXR1cm4gbnJfYnl0ZXM7CisgICAgfQorI2VuZGlmCisKKyAgaWYgKFNUQVRFX0VOVklST05NRU5UIChzZCkgIT0gT1BFUkFUSU5HX0VOVklST05NRU5UKQorICAgIHJldHVybiBucl9ieXRlczsKKworI2lmZGVmIEhBVkVfRFZfU09DS1NFUgorICBpZiAoYWRkciA9PSBVQVJUX09VVENIQVJfQUREUikKKyAgICB7CisgICAgICBpbnQgcmMgPSBkdl9zb2Nrc2VyX3dyaXRlIChzZCwgKihjaGFyICopIHNvdXJjZSk7CisgICAgICByZXR1cm4gcmMgPT0gMTsKKyAgICB9CisjZW5kaWYKKworICByZXR1cm4gbnJfYnl0ZXM7Cit9CisKK3ZvaWQgZGV2aWNlX2Vycm9yICgpIHt9CmRpZmYgLS1naXQgYS9zaW0vbTMyci9tMzJyLXNpbS5oIGIvc2ltL20zMnIvbTMyci1zaW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGQxODc4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL20zMnIvbTMyci1zaW0uaApAQCAtMCwwICsxLDIwMyBAQAorLyogY29sbGVjdGlvbiBvZiBqdW5rIHdhaXRpbmcgdGltZSB0byBzb3J0IG91dAorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgU2ltdWxhdG9ycy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBNMzJSX1NJTV9ICisjZGVmaW5lIE0zMlJfU0lNX0gKKworLyogZ2RiIHJlZ2lzdGVyIG51bWJlcnMgKi8KKyNkZWZpbmUgUFNXX1JFR05VTQkxNgorI2RlZmluZSBDQlJfUkVHTlVNCTE3CisjZGVmaW5lIFNQSV9SRUdOVU0JMTgKKyNkZWZpbmUgU1BVX1JFR05VTQkxOQorI2RlZmluZSBCUENfUkVHTlVNCTIwCisjZGVmaW5lIFBDX1JFR05VTQkyMQorI2RlZmluZSBBQ0NMX1JFR05VTQkyMgorI2RlZmluZSBBQ0NIX1JFR05VTQkyMworI2RlZmluZSBBQ0MxTF9SRUdOVU0JMjQKKyNkZWZpbmUgQUNDMUhfUkVHTlVNCTI1CisjZGVmaW5lIEJCUFNXX1JFR05VTQkyNgorI2RlZmluZSBCQlBDX1JFR05VTQkyNworCitleHRlcm4gaW50IG0zMnJfZGVjb2RlX2dkYl9jdHJsX3JlZ251bSAoaW50KTsKKworLyogQ292ZXIgbWFjcm9zIGZvciBoYXJkd2FyZSBhY2Nlc3Nlcy4KKyAgIEZJWE1FOiBFdmVudHVhbGx5IG1vdmUgdG8gY2dlbi4gICovCisjZGVmaW5lIEdFVF9IX1NNKCkgKChDUFUgKGhfcHN3KSAmIDB4ODApICE9IDApCisKK2V4dGVybiBVU0kgbTMycmJmX2hfY3JfZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKiwgVUlOVCk7CitleHRlcm4gdm9pZCBtMzJyYmZfaF9jcl9zZXRfaGFuZGxlciAoU0lNX0NQVSAqLCBVSU5ULCBVU0kpOworI2RlZmluZSBHRVRfSF9DUihyZWdubykgXAorICBYQ09OQ0FUMiAoV0FOVF9DUFUsX2hfY3JfZ2V0X2hhbmRsZXIpIChjdXJyZW50X2NwdSwgKHJlZ25vKSkKKyNkZWZpbmUgU0VUX0hfQ1IocmVnbm8sIHZhbCkgXAorICBYQ09OQ0FUMiAoV0FOVF9DUFUsX2hfY3Jfc2V0X2hhbmRsZXIpIChjdXJyZW50X2NwdSwgKHJlZ25vKSwgKHZhbCkpCisKK2V4dGVybiBVUUkgbTMycmJmX2hfcHN3X2dldF9oYW5kbGVyIChTSU1fQ1BVICopOworZXh0ZXJuIHZvaWQgbTMycmJmX2hfcHN3X3NldF9oYW5kbGVyIChTSU1fQ1BVICosIFVRSSk7CisjZGVmaW5lIEdFVF9IX1BTVygpIFwKKyAgWENPTkNBVDIgKFdBTlRfQ1BVLF9oX3Bzd19nZXRfaGFuZGxlcikgKGN1cnJlbnRfY3B1KQorI2RlZmluZSBTRVRfSF9QU1codmFsKSBcCisgIFhDT05DQVQyIChXQU5UX0NQVSxfaF9wc3dfc2V0X2hhbmRsZXIpIChjdXJyZW50X2NwdSwgKHZhbCkpCisKK2V4dGVybiBESSBtMzJyYmZfaF9hY2N1bV9nZXRfaGFuZGxlciAoU0lNX0NQVSAqKTsKK2V4dGVybiB2b2lkIG0zMnJiZl9oX2FjY3VtX3NldF9oYW5kbGVyIChTSU1fQ1BVICosIERJKTsKKyNkZWZpbmUgR0VUX0hfQUNDVU0oKSBcCisgIFhDT05DQVQyIChXQU5UX0NQVSxfaF9hY2N1bV9nZXRfaGFuZGxlcikgKGN1cnJlbnRfY3B1KQorI2RlZmluZSBTRVRfSF9BQ0NVTSh2YWwpIFwKKyAgWENPTkNBVDIgKFdBTlRfQ1BVLF9oX2FjY3VtX3NldF9oYW5kbGVyKSAoY3VycmVudF9jcHUsICh2YWwpKQorCisMCisvKiBNaXNjLiBwcm9maWxlIGRhdGEuICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIG5vcCBpbnNuIHNsb3QgZmlsbGVyIGNvdW50ICovCisgIHVuc2lnbmVkIGludCBmaWxsbm9wX2NvdW50OworICAvKiBudW1iZXIgb2YgcGFyYWxsZWwgaW5zbnMgKi8KKyAgdW5zaWduZWQgaW50IHBhcmFsbGVsX2NvdW50OworCisgIC8qIEZJWE1FOiBnZW5lcmFsaXplIHRoaXMgdG8gaGFuZGxlIGFsbCBpbnNuIGxlbmd0aHMsIG1vdmUgdG8gY29tbW9uLiAgKi8KKyAgLyogbnVtYmVyIG9mIHNob3J0IGluc25zLCBub3QgaW5jbHVkaW5nIHBhcmFsbGVsIG9uZXMgKi8KKyAgdW5zaWduZWQgaW50IHNob3J0X2NvdW50OworICAvKiBudW1iZXIgb2YgbG9uZyBpbnNucyAqLworICB1bnNpZ25lZCBpbnQgbG9uZ19jb3VudDsKKworICAvKiBXb3JraW5nIGFyZWEgZm9yIGNvbXB1dGluZyBjeWNsZSBjb3VudHMuICAqLworICB1bnNpZ25lZCBsb25nIGluc25fY3ljbGVzOyAvKiBGSVhNRTogZGVsZXRlICovCisgIHVuc2lnbmVkIGxvbmcgY3RpX3N0YWxsOworICB1bnNpZ25lZCBsb25nIGxvYWRfc3RhbGw7CisgIHVuc2lnbmVkIGxvbmcgYmlnZ2VzdF9jeWNsZXM7CisKKyAgLyogQml0bWFzayBvZiByZWdpc3RlcnMgbG9hZGVkIGJ5IHByZXZpb3VzIGluc24uICAqLworICB1bnNpZ25lZCBpbnQgbG9hZF9yZWdzOworICAvKiBCaXRtYXNrIG9mIHJlZ2lzdGVycyBsb2FkZWQgYnkgY3VycmVudCBpbnNuLiAgKi8KKyAgdW5zaWduZWQgaW50IGxvYWRfcmVnc19wZW5kaW5nOworfSBNMzJSX01JU0NfUFJPRklMRTsKKworLyogSW5pdGlhbGl6ZSB0aGUgd29ya2luZyBhcmVhLiAgKi8KK3ZvaWQgbTMycl9pbml0X2luc25fY3ljbGVzIChTSU1fQ1BVICosIGludCk7CisvKiBVcGRhdGUgdGhlIHRvdGFscyBmb3IgdGhlIGluc24uICAqLwordm9pZCBtMzJyX3JlY29yZF9pbnNuX2N5Y2xlcyAoU0lNX0NQVSAqLCBpbnQpOworCisvKiBUaGlzIGlzIGludm9rZWQgYnkgdGhlIG5vcCBwYXR0ZXJuIGluIHRoZSAuY3B1IGZpbGUuICAqLworI2RlZmluZSBQUk9GSUxFX0NPVU5UX0ZJTExOT1BTKGNwdSwgYWRkcikgXAorZG8geyBcCisgIGlmIChQUk9GSUxFX0lOU05fUCAoY3B1KSBcCisgICAgICAmJiAoYWRkciAmIDMpICE9IDApIFwKKyAgICArKyBDUFVfTTMyUl9NSVNDX1BST0ZJTEUgKGNwdSktPmZpbGxub3BfY291bnQ7IFwKK30gd2hpbGUgKDApCisKKy8qIFRoaXMgaXMgaW52b2tlZCBieSB0aGUgZXhlY3V0ZSBzZWN0aW9uIG9mIG1sb29weyx4fS5pbi4gICovCisjZGVmaW5lIFBST0ZJTEVfQ09VTlRfUEFSSU5TTlMoY3B1KSBcCitkbyB7IFwKKyAgaWYgKFBST0ZJTEVfSU5TTl9QIChjcHUpKSBcCisgICAgKysgQ1BVX00zMlJfTUlTQ19QUk9GSUxFIChjcHUpLT5wYXJhbGxlbF9jb3VudDsgXAorfSB3aGlsZSAoMCkKKworLyogVGhpcyBpcyBpbnZva2VkIGJ5IHRoZSBleGVjdXRlIHNlY3Rpb24gb2YgbWxvb3B7LHh9LmluLiAgKi8KKyNkZWZpbmUgUFJPRklMRV9DT1VOVF9TSE9SVElOU05TKGNwdSkgXAorZG8geyBcCisgIGlmIChQUk9GSUxFX0lOU05fUCAoY3B1KSkgXAorICAgICsrIENQVV9NMzJSX01JU0NfUFJPRklMRSAoY3B1KS0+c2hvcnRfY291bnQ7IFwKK30gd2hpbGUgKDApCisKKy8qIFRoaXMgaXMgaW52b2tlZCBieSB0aGUgZXhlY3V0ZSBzZWN0aW9uIG9mIG1sb29weyx4fS5pbi4gICovCisjZGVmaW5lIFBST0ZJTEVfQ09VTlRfTE9OR0lOU05TKGNwdSkgXAorZG8geyBcCisgIGlmIChQUk9GSUxFX0lOU05fUCAoY3B1KSkgXAorICAgICsrIENQVV9NMzJSX01JU0NfUFJPRklMRSAoY3B1KS0+bG9uZ19jb3VudDsgXAorfSB3aGlsZSAoMCkKKwwKKyNkZWZpbmUgR0VUVFdJIEdFVFRTSQorI2RlZmluZSBTRVRUV0kgU0VUVFNJCisMCisvKiBBZGRpdGlvbmFsIGV4ZWN1dGlvbiBzdXBwb3J0LiAgKi8KKworDAorLyogSGFyZHdhcmUvZGV2aWNlIHN1cHBvcnQuCisgICA/Pz8gV2lsbCBldmVudHVhbGx5IHdhbnQgdG8gbW92ZSBkZXZpY2Ugc3R1ZmYgdG8gY29uZmlnIGZpbGVzLiAgKi8KKworLyogRXhjZXB0aW9uLCBJbnRlcnJ1cHQsIGFuZCBUcmFwIGFkZHJlc3NlcyAqLworI2RlZmluZSBFSVRfU1lTQlJFQUtfQUREUgkweDEwCisjZGVmaW5lIEVJVF9SU1ZEX0lOU05fQUREUgkweDIwCisjZGVmaW5lIEVJVF9BRERSX0VYQ1BfQUREUgkweDMwCisjZGVmaW5lIEVJVF9UUkFQX0JBU0VfQUREUgkweDQwCisjZGVmaW5lIEVJVF9FWFRFUk5fQUREUgkJMHg4MAorI2RlZmluZSBFSVRfUkVTRVRfQUREUgkJMHg3ZmZmZmZmMAorI2RlZmluZSBFSVRfV0FLRVVQX0FERFIJCTB4N2ZmZmZmZjAKKworLyogU3BlY2lhbCBwdXJwb3NlIHRyYXBzLiAgKi8KKyNkZWZpbmUgVFJBUF9TWVNDQUxMCTAKKyNkZWZpbmUgVFJBUF9CUkVBS1BPSU5UCTEKKworLyogU3VwcG9ydCBmb3IgdGhlIE1TUFIgcmVnaXN0ZXIgKENhY2hlIFB1cmdlIENvbnRyb2wgUmVnaXN0ZXIpCisgICBhbmQgdGhlIE1DQ1IgcmVnaXN0ZXIgKENhY2hlIENvbnRyb2wgUmVnaXN0ZXIpIGFyZSBuZWVkZWQgaW4gb3JkZXIgZm9yCisgICBvdmVybGF5cyB0byB3b3JrIGNvcnJlY3RseSB3aXRoIHRoZSBzY2FjaGUuCisgICBNU1BSIG5vIGxvbmdlciBleGlzdHMgYnV0IGlzIHN1cHBvcnRlZCBmb3IgdXB3YXJkIGNvbXBhdGliaWxpdHkgd2l0aAorICAgZWFybHkgb3ZlcmxheSBzdXBwb3J0LiAgKi8KKworLyogQ2FjaGUgUHVyZ2UgQ29udHJvbCAob25seSBleGlzdHMgb24gZWFybHkgdmVyc2lvbnMgb2YgY2hpcHMpICovCisjZGVmaW5lIE1TUFJfQUREUiAweGZmZmZmZmY3CisjZGVmaW5lIE1TUFJfUFVSR0UgMQorCisvKiBMb2NrIENvbnRyb2wgUmVnaXN0ZXIgKG5vdCBzdXBwb3J0ZWQpICovCisjZGVmaW5lIE1MQ1JfQUREUiAweGZmZmZmZmY3CisjZGVmaW5lIE1MQ1JfTE0gMQorCisvKiBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXIgKG5vdCBzdXBwb3J0ZWQpICovCisjZGVmaW5lIE1QTVJfQUREUiAweGZmZmZmZmZiCisKKy8qIENhY2hlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUNDUl9BRERSIDB4ZmZmZmZmZmYKKyNkZWZpbmUgTUNDUl9DUCAweDgwCisvKiBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIE1DQ1JfQ00wIDIKKyNkZWZpbmUgTUNDUl9DTTEgMQorCisvKiBTZXJpYWwgZGV2aWNlIGFkZHJlc3Nlcy4gICovCisjaWZkZWYgTTMyUl9FVkEgLyogb3JpZyBldmEgYm9hcmQsIG5vIGxvbmdlciBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgVUFSVF9JTkNIQVJfQUREUgkweGZmMTAyMDEzCisjZGVmaW5lIFVBUlRfT1VUQ0hBUl9BRERSCTB4ZmYxMDIwMGYKKyNkZWZpbmUgVUFSVF9TVEFUVVNfQUREUgkweGZmMTAyMDA2CisvKiBJbmRpY2F0ZSByZWFkeSBiaXQgaXMgaW52ZXJ0ZWQuICAqLworI2RlZmluZSBVQVJUX0lOUFVUX1JFQURZMAorI2Vsc2UKKy8qIFRoZXNlIGFyZSB0aGUgdmFsdWVzIGZvciB0aGUgTVNBMjAwMCBib2FyZC4KKyAgID8/PyBXaWxsIGV2ZW50dWFsbHkgbmVlZCB0byBtb3ZlIHRoaXMgdG8gYSBjb25maWcgZmlsZS4gICovCisjZGVmaW5lIFVBUlRfSU5DSEFSX0FERFIJMHhmZjAwNDAwOQorI2RlZmluZSBVQVJUX09VVENIQVJfQUREUgkweGZmMDA0MDA3CisjZGVmaW5lIFVBUlRfU1RBVFVTX0FERFIJMHhmZjAwNDAwMgorI2VuZGlmCisKKyNkZWZpbmUgVUFSVF9JTlBVVF9SRUFEWQkweDQKKyNkZWZpbmUgVUFSVF9PVVRQVVRfUkVBRFkJMHgxCisKKy8qIFN0YXJ0IGFkZHJlc3MgYW5kIGxlbmd0aCBvZiBhbGwgZGV2aWNlIHN1cHBvcnQuICAqLworI2RlZmluZSBNMzJSX0RFVklDRV9BRERSCTB4ZmYwMDAwMDAKKyNkZWZpbmUgTTMyUl9ERVZJQ0VfTEVOCQkweDAwZmZmZmZmCisKKy8qIHNpbV9jb3JlX2F0dGFjaCBkZXZpY2UgYXJndW1lbnQuICAqLworZXh0ZXJuIGRldmljZSBtMzJyX2RldmljZXM7CisKKy8qIEZJWE1FOiBUZW1wb3JhcnksIHVudGlsIGRldmljZSBzdXBwb3J0IHJlYWR5LiAgKi8KK3N0cnVjdCBfZGV2aWNlIHsgaW50IGZvbzsgfTsKKworLyogSGFuZGxlIHRoZSB0cmFwIGluc24uICAqLworVVNJIG0zMnJfdHJhcCAoU0lNX0NQVSAqLCBQQ0FERFIsIGludCk7CisKKyNlbmRpZiAvKiBNMzJSX1NJTV9IICovCmRpZmYgLS1naXQgYS9zaW0vbTMyci9tMzJyLmMgYi9zaW0vbTMyci9tMzJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlNzFlNgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tMzJyL20zMnIuYwpAQCAtMCwwICsxLDQxMyBAQAorLyogbTMyciBzaW11bGF0b3Igc3VwcG9ydCBjb2RlCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjZGVmaW5lIFdBTlRfQ1BVIG0zMnJiZgorI2RlZmluZSBXQU5UX0NQVV9NMzJSQkYKKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAiY2dlbi1tZW0uaCIKKyNpbmNsdWRlICJjZ2VuLW9wcy5oIgorCisvKiBEZWNvZGUgZ2RiIGN0cmwgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KKworaW50CittMzJyX2RlY29kZV9nZGJfY3RybF9yZWdudW0gKGludCBnZGJfcmVnbnVtKQoreworICBzd2l0Y2ggKGdkYl9yZWdudW0pCisgICAgeworICAgICAgY2FzZSBQU1dfUkVHTlVNIDogcmV0dXJuIEhfQ1JfUFNXOworICAgICAgY2FzZSBDQlJfUkVHTlVNIDogcmV0dXJuIEhfQ1JfQ0JSOworICAgICAgY2FzZSBTUElfUkVHTlVNIDogcmV0dXJuIEhfQ1JfU1BJOworICAgICAgY2FzZSBTUFVfUkVHTlVNIDogcmV0dXJuIEhfQ1JfU1BVOworICAgICAgY2FzZSBCUENfUkVHTlVNIDogcmV0dXJuIEhfQ1JfQlBDOworICAgICAgY2FzZSBCQlBTV19SRUdOVU0gOiByZXR1cm4gSF9DUl9CQlBTVzsKKyAgICAgIGNhc2UgQkJQQ19SRUdOVU0gOiByZXR1cm4gSF9DUl9CQlBDOworICAgIH0KKyAgYWJvcnQgKCk7Cit9CisKKy8qIFRoZSBjb250ZW50cyBvZiBCVUYgYXJlIGluIHRhcmdldCBieXRlIG9yZGVyLiAgKi8KKworaW50CittMzJyYmZfZmV0Y2hfcmVnaXN0ZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBpbnQgcm4sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKyAgaWYgKHJuIDwgMTYpCisgICAgU0VUVFdJIChidWYsIGFfbTMycl9oX2dyX2dldCAoY3VycmVudF9jcHUsIHJuKSk7CisgIGVsc2UKKyAgICBzd2l0Y2ggKHJuKQorICAgICAgeworICAgICAgY2FzZSBQU1dfUkVHTlVNIDoKKyAgICAgIGNhc2UgQ0JSX1JFR05VTSA6CisgICAgICBjYXNlIFNQSV9SRUdOVU0gOgorICAgICAgY2FzZSBTUFVfUkVHTlVNIDoKKyAgICAgIGNhc2UgQlBDX1JFR05VTSA6CisgICAgICBjYXNlIEJCUFNXX1JFR05VTSA6CisgICAgICBjYXNlIEJCUENfUkVHTlVNIDoKKwlTRVRUV0kgKGJ1ZiwgYV9tMzJyX2hfY3JfZ2V0IChjdXJyZW50X2NwdSwKKwkJCQkgICAgICBtMzJyX2RlY29kZV9nZGJfY3RybF9yZWdudW0gKHJuKSkpOworCWJyZWFrOworICAgICAgY2FzZSBQQ19SRUdOVU0gOgorCVNFVFRXSSAoYnVmLCBhX20zMnJfaF9wY19nZXQgKGN1cnJlbnRfY3B1KSk7CisJYnJlYWs7CisgICAgICBjYXNlIEFDQ0xfUkVHTlVNIDoKKwlTRVRUV0kgKGJ1ZiwgR0VUTE9ESSAoYV9tMzJyX2hfYWNjdW1fZ2V0IChjdXJyZW50X2NwdSkpKTsKKwlicmVhazsKKyAgICAgIGNhc2UgQUNDSF9SRUdOVU0gOgorCVNFVFRXSSAoYnVmLCBHRVRISURJIChhX20zMnJfaF9hY2N1bV9nZXQgKGN1cnJlbnRfY3B1KSkpOworCWJyZWFrOworICAgICAgZGVmYXVsdCA6CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgcmV0dXJuIC0xOyAvKkZJWE1FKi8KK30KKworLyogVGhlIGNvbnRlbnRzIG9mIEJVRiBhcmUgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuICAqLworCitpbnQKK20zMnJiZl9zdG9yZV9yZWdpc3RlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIGludCBybiwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworICBpZiAocm4gPCAxNikKKyAgICBhX20zMnJfaF9ncl9zZXQgKGN1cnJlbnRfY3B1LCBybiwgR0VUVFdJIChidWYpKTsKKyAgZWxzZQorICAgIHN3aXRjaCAocm4pCisgICAgICB7CisgICAgICBjYXNlIFBTV19SRUdOVU0gOgorICAgICAgY2FzZSBDQlJfUkVHTlVNIDoKKyAgICAgIGNhc2UgU1BJX1JFR05VTSA6CisgICAgICBjYXNlIFNQVV9SRUdOVU0gOgorICAgICAgY2FzZSBCUENfUkVHTlVNIDoKKyAgICAgIGNhc2UgQkJQU1dfUkVHTlVNIDoKKyAgICAgIGNhc2UgQkJQQ19SRUdOVU0gOgorCWFfbTMycl9oX2NyX3NldCAoY3VycmVudF9jcHUsCisJCQkgbTMycl9kZWNvZGVfZ2RiX2N0cmxfcmVnbnVtIChybiksCisJCQkgR0VUVFdJIChidWYpKTsKKwlicmVhazsKKyAgICAgIGNhc2UgUENfUkVHTlVNIDoKKwlhX20zMnJfaF9wY19zZXQgKGN1cnJlbnRfY3B1LCBHRVRUV0kgKGJ1ZikpOworCWJyZWFrOworICAgICAgY2FzZSBBQ0NMX1JFR05VTSA6CisJeworCSAgREkgdmFsID0gYV9tMzJyX2hfYWNjdW1fZ2V0IChjdXJyZW50X2NwdSk7CisJICBTRVRMT0RJICh2YWwsIEdFVFRXSSAoYnVmKSk7CisJICBhX20zMnJfaF9hY2N1bV9zZXQgKGN1cnJlbnRfY3B1LCB2YWwpOworCSAgYnJlYWs7CisJfQorICAgICAgY2FzZSBBQ0NIX1JFR05VTSA6CisJeworCSAgREkgdmFsID0gYV9tMzJyX2hfYWNjdW1fZ2V0IChjdXJyZW50X2NwdSk7CisJICBTRVRISURJICh2YWwsIEdFVFRXSSAoYnVmKSk7CisJICBhX20zMnJfaF9hY2N1bV9zZXQgKGN1cnJlbnRfY3B1LCB2YWwpOworCSAgYnJlYWs7CisJfQorICAgICAgZGVmYXVsdCA6CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgcmV0dXJuIC0xOyAvKkZJWE1FKi8KK30KKwwKK1VTSQorbTMycmJmX2hfY3JfZ2V0X2hhbmRsZXIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBVSU5UIGNyKQoreworICBzd2l0Y2ggKGNyKQorICAgIHsKKyAgICBjYXNlIEhfQ1JfUFNXIDogLyogcHN3ICovCisgICAgICByZXR1cm4gKCgoQ1BVIChoX2Jwc3cpICYgMHhjMSkgPDwgOCkKKwkgICAgICB8ICgoQ1BVIChoX3BzdykgJiAweGMwKSA8PCAwKQorCSAgICAgIHwgR0VUX0hfQ09ORCAoKSk7CisgICAgY2FzZSBIX0NSX0JCUFNXIDogLyogYmFja3VwIGJhY2t1cCBwc3cgKi8KKyAgICAgIHJldHVybiBDUFUgKGhfYmJwc3cpICYgMHhjMTsKKyAgICBjYXNlIEhfQ1JfQ0JSIDogLyogY29uZGl0aW9uIGJpdCAqLworICAgICAgcmV0dXJuIEdFVF9IX0NPTkQgKCk7CisgICAgY2FzZSBIX0NSX1NQSSA6IC8qIGludGVycnVwdCBzdGFjayBwb2ludGVyICovCisgICAgICBpZiAoISBHRVRfSF9TTSAoKSkKKwlyZXR1cm4gQ1BVIChoX2dyW0hfR1JfU1BdKTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gQ1BVIChoX2NyW0hfQ1JfU1BJXSk7CisgICAgY2FzZSBIX0NSX1NQVSA6IC8qIHVzZXIgc3RhY2sgcG9pbnRlciAqLworICAgICAgaWYgKEdFVF9IX1NNICgpKQorCXJldHVybiBDUFUgKGhfZ3JbSF9HUl9TUF0pOworICAgICAgZWxzZQorCXJldHVybiBDUFUgKGhfY3JbSF9DUl9TUFVdKTsKKyAgICBjYXNlIEhfQ1JfQlBDIDogLyogYmFja3VwIHBjICovCisgICAgICByZXR1cm4gQ1BVIChoX2NyW0hfQ1JfQlBDXSkgJiAweGZmZmZmZmZlOworICAgIGNhc2UgSF9DUl9CQlBDIDogLyogYmFja3VwIGJhY2t1cCBwYyAqLworICAgICAgcmV0dXJuIENQVSAoaF9jcltIX0NSX0JCUENdKSAmIDB4ZmZmZmZmZmU7CisgICAgY2FzZSA0IDogLyogPz8/IHVuc3BlY2lmaWVkLCBidXQgYXBwYXJlbnRseSBhdmFpbGFibGUgKi8KKyAgICBjYXNlIDUgOiAvKiA/Pz8gdW5zcGVjaWZpZWQsIGJ1dCBhcHBhcmVudGx5IGF2YWlsYWJsZSAqLworICAgICAgcmV0dXJuIENQVSAoaF9jcltjcl0pOworICAgIGRlZmF1bHQgOgorICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCit2b2lkCittMzJyYmZfaF9jcl9zZXRfaGFuZGxlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFVJTlQgY3IsIFVTSSBuZXd2YWwpCit7CisgIHN3aXRjaCAoY3IpCisgICAgeworICAgIGNhc2UgSF9DUl9QU1cgOiAvKiBwc3cgKi8KKyAgICAgIHsKKwlpbnQgb2xkX3NtID0gKENQVSAoaF9wc3cpICYgMHg4MCkgIT0gMDsKKwlpbnQgbmV3X3NtID0gKG5ld3ZhbCAmIDB4ODApICE9IDA7CisJQ1BVIChoX2Jwc3cpID0gKG5ld3ZhbCA+PiA4KSAmIDB4ZmY7CisJQ1BVIChoX3BzdykgPSBuZXd2YWwgJiAweGZmOworCVNFVF9IX0NPTkQgKG5ld3ZhbCAmIDEpOworCS8qIFdoZW4gc3dpdGNoaW5nIHN0YWNrIG1vZGVzLCB1cGRhdGUgdGhlIHJlZ2lzdGVycy4gICovCisJaWYgKG9sZF9zbSAhPSBuZXdfc20pCisJICB7CisJICAgIGlmIChvbGRfc20pCisJICAgICAgeworCQkvKiBTd2l0Y2hpbmcgdXNlciAtPiBzeXN0ZW0uICAqLworCQlDUFUgKGhfY3JbSF9DUl9TUFVdKSA9IENQVSAoaF9ncltIX0dSX1NQXSk7CisJCUNQVSAoaF9ncltIX0dSX1NQXSkgPSBDUFUgKGhfY3JbSF9DUl9TUEldKTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCS8qIFN3aXRjaGluZyBzeXN0ZW0gLT4gdXNlci4gICovCisJCUNQVSAoaF9jcltIX0NSX1NQSV0pID0gQ1BVIChoX2dyW0hfR1JfU1BdKTsKKwkJQ1BVIChoX2dyW0hfR1JfU1BdKSA9IENQVSAoaF9jcltIX0NSX1NQVV0pOworCSAgICAgIH0KKwkgIH0KKwlicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIEhfQ1JfQkJQU1cgOiAvKiBiYWNrdXAgYmFja3VwIHBzdyAqLworICAgICAgQ1BVIChoX2JicHN3KSA9IG5ld3ZhbCAmIDB4ZmY7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhfQ1JfQ0JSIDogLyogY29uZGl0aW9uIGJpdCAqLworICAgICAgU0VUX0hfQ09ORCAobmV3dmFsICYgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhfQ1JfU1BJIDogLyogaW50ZXJydXB0IHN0YWNrIHBvaW50ZXIgKi8KKyAgICAgIGlmICghIEdFVF9IX1NNICgpKQorCUNQVSAoaF9ncltIX0dSX1NQXSkgPSBuZXd2YWw7CisgICAgICBlbHNlCisJQ1BVIChoX2NyW0hfQ1JfU1BJXSkgPSBuZXd2YWw7CisgICAgICBicmVhazsKKyAgICBjYXNlIEhfQ1JfU1BVIDogLyogdXNlciBzdGFjayBwb2ludGVyICovCisgICAgICBpZiAoR0VUX0hfU00gKCkpCisJQ1BVIChoX2dyW0hfR1JfU1BdKSA9IG5ld3ZhbDsKKyAgICAgIGVsc2UKKwlDUFUgKGhfY3JbSF9DUl9TUFVdKSA9IG5ld3ZhbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSF9DUl9CUEMgOiAvKiBiYWNrdXAgcGMgKi8KKyAgICAgIENQVSAoaF9jcltIX0NSX0JQQ10pID0gbmV3dmFsOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIX0NSX0JCUEMgOiAvKiBiYWNrdXAgYmFja3VwIHBjICovCisgICAgICBDUFUgKGhfY3JbSF9DUl9CQlBDXSkgPSBuZXd2YWw7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQgOiAvKiA/Pz8gdW5zcGVjaWZpZWQsIGJ1dCBhcHBhcmVudGx5IGF2YWlsYWJsZSAqLworICAgIGNhc2UgNSA6IC8qID8/PyB1bnNwZWNpZmllZCwgYnV0IGFwcGFyZW50bHkgYXZhaWxhYmxlICovCisgICAgICBDUFUgKGhfY3JbY3JdKSA9IG5ld3ZhbDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQgOgorICAgICAgLyogaWdub3JlICovCisgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIENvdmVyIGZucyB0byBhY2Nlc3MgaC1wc3cuICAqLworCitVUUkKK20zMnJiZl9oX3Bzd19nZXRfaGFuZGxlciAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIHJldHVybiAoQ1BVIChoX3BzdykgJiAweGZlKSB8IChDUFUgKGhfY29uZCkgJiAxKTsKK30KKwordm9pZAorbTMycmJmX2hfcHN3X3NldF9oYW5kbGVyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgVVFJIG5ld3ZhbCkKK3sKKyAgQ1BVIChoX3BzdykgPSBuZXd2YWw7CisgIENQVSAoaF9jb25kKSA9IG5ld3ZhbCAmIDE7Cit9CisKKy8qIENvdmVyIGZucyB0byBhY2Nlc3MgaC1hY2N1bS4gICovCisKK0RJCittMzJyYmZfaF9hY2N1bV9nZXRfaGFuZGxlciAoU0lNX0NQVSAqY3VycmVudF9jcHUpCit7CisgIC8qIFNpZ24gZXh0ZW5kIHRoZSB0b3AgOCBiaXRzLiAgKi8KKyAgREkgcjsKKyNpZiAxCisgIHIgPSBBTkRESSAoQ1BVIChoX2FjY3VtKSwgTUFLRURJICgweGZmZmZmZiwgMHhmZmZmZmZmZikpOworICByID0gWE9SREkgKHIsIE1BS0VESSAoMHg4MDAwMDAsIDApKTsKKyAgciA9IFNVQkRJIChyLCBNQUtFREkgKDB4ODAwMDAwLCAwKSk7CisjZWxzZQorICBTSSBoaSxsbzsKKyAgciA9IENQVSAoaF9hY2N1bSk7CisgIGhpID0gR0VUSElESSAocik7CisgIGxvID0gR0VUTE9ESSAocik7CisgIGhpID0gKChoaSAmIDB4ZmZmZmZmKSBeIDB4ODAwMDAwKSAtIDB4ODAwMDAwOworICByID0gTUFLRURJIChoaSwgbG8pOworI2VuZGlmCisgIHJldHVybiByOworfQorCit2b2lkCittMzJyYmZfaF9hY2N1bV9zZXRfaGFuZGxlciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIERJIG5ld3ZhbCkKK3sKKyAgQ1BVIChoX2FjY3VtKSA9IG5ld3ZhbDsKK30KKwwKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorCisvKiBGSVhNRTogU29tZSBvZiB0aGVzZSBzaG91bGQgYmUgaW5saW5lIG9yIG1hY3Jvcy4gIExhdGVyLiAgKi8KKworLyogSW5pdGlhbGl6ZSBjeWNsZSBjb3VudGluZyBmb3IgYW4gaW5zbi4KKyAgIEZJUlNUX1AgaXMgbm9uLXplcm8gaWYgdGhpcyBpcyB0aGUgZmlyc3QgaW5zbiBpbiBhIHNldCBvZiBwYXJhbGxlbAorICAgaW5zbnMuICAqLworCit2b2lkCittMzJyYmZfbW9kZWxfaW5zbl9iZWZvcmUgKFNJTV9DUFUgKmNwdSwgaW50IGZpcnN0X3ApCit7CisgIE0zMlJfTUlTQ19QUk9GSUxFICptcCA9IENQVV9NMzJSX01JU0NfUFJPRklMRSAoY3B1KTsKKyAgbXAtPmN0aV9zdGFsbCA9IDA7CisgIG1wLT5sb2FkX3N0YWxsID0gMDsKKyAgaWYgKGZpcnN0X3ApCisgICAgeworICAgICAgbXAtPmxvYWRfcmVnc19wZW5kaW5nID0gMDsKKyAgICAgIG1wLT5iaWdnZXN0X2N5Y2xlcyA9IDA7CisgICAgfQorfQorCisvKiBSZWNvcmQgdGhlIGN5Y2xlcyBjb21wdXRlZCBmb3IgYW4gaW5zbi4KKyAgIExBU1RfUCBpcyBub24temVybyBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc24gaW4gYSBzZXQgb2YgcGFyYWxsZWwgaW5zbnMsCisgICBhbmQgd2UgdXBkYXRlIHRoZSB0b3RhbCBjeWNsZSBjb3VudC4KKyAgIENZQ0xFUyBpcyB0aGUgY3ljbGUgY291bnQgb2YgdGhlIGluc24uICAqLworCit2b2lkCittMzJyYmZfbW9kZWxfaW5zbl9hZnRlciAoU0lNX0NQVSAqY3B1LCBpbnQgbGFzdF9wLCBpbnQgY3ljbGVzKQoreworICBQUk9GSUxFX0RBVEEgKnAgPSBDUFVfUFJPRklMRV9EQVRBIChjcHUpOworICBNMzJSX01JU0NfUFJPRklMRSAqbXAgPSBDUFVfTTMyUl9NSVNDX1BST0ZJTEUgKGNwdSk7CisgIHVuc2lnbmVkIGxvbmcgdG90YWwgPSBjeWNsZXMgKyBtcC0+Y3RpX3N0YWxsICsgbXAtPmxvYWRfc3RhbGw7CisKKyAgaWYgKGxhc3RfcCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGJpZ2dlc3QgPSB0b3RhbCA+IG1wLT5iaWdnZXN0X2N5Y2xlcyA/IHRvdGFsIDogbXAtPmJpZ2dlc3RfY3ljbGVzOworICAgICAgUFJPRklMRV9NT0RFTF9UT1RBTF9DWUNMRVMgKHApICs9IGJpZ2dlc3Q7CisgICAgICBQUk9GSUxFX01PREVMX0NVUl9JTlNOX0NZQ0xFUyAocCkgPSB0b3RhbDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBIZXJlIHdlIHRha2UgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgIWxhc3RfcCAtPiBmaXJzdF9wLiAgKi8KKyAgICAgIG1wLT5iaWdnZXN0X2N5Y2xlcyA9IHRvdGFsOworICAgICAgUFJPRklMRV9NT0RFTF9DVVJfSU5TTl9DWUNMRVMgKHApID0gdG90YWw7CisgICAgfQorCisgIC8qIEJyYW5jaCBhbmQgbG9hZCBzdGFsbCBjb3VudHMgYXJlIHJlY29yZGVkIGluZGVwZW5kZW50bHkgb2YgdGhlCisgICAgIHRvdGFsIGN5Y2xlIGNvdW50LiAgKi8KKyAgUFJPRklMRV9NT0RFTF9DVElfU1RBTExfQ1lDTEVTIChwKSArPSBtcC0+Y3RpX3N0YWxsOworICBQUk9GSUxFX01PREVMX0xPQURfU1RBTExfQ1lDTEVTIChwKSArPSBtcC0+bG9hZF9zdGFsbDsKKworICBtcC0+bG9hZF9yZWdzID0gbXAtPmxvYWRfcmVnc19wZW5kaW5nOworfQorCitzdGF0aWMgSU5MSU5FIHZvaWQKK2NoZWNrX2xvYWRfc3RhbGwgKFNJTV9DUFUgKmNwdSwgaW50IHJlZ25vKQoreworICBVSU5UIGhfZ3IgPSBDUFVfTTMyUl9NSVNDX1BST0ZJTEUgKGNwdSktPmxvYWRfcmVnczsKKworICBpZiAocmVnbm8gIT0gLTEKKyAgICAgICYmIChoX2dyICYgKDEgPDwgcmVnbm8pKSAhPSAwKQorICAgIHsKKyAgICAgIENQVV9NMzJSX01JU0NfUFJPRklMRSAoY3B1KS0+bG9hZF9zdGFsbCArPSAyOworICAgICAgaWYgKFRSQUNFX0lOU05fUCAoY3B1KSkKKwljZ2VuX3RyYWNlX3ByaW50ZiAoY3B1LCAiIDsgTG9hZCBzdGFsbCBvZiAyIGN5Y2xlcy4iKTsKKyAgICB9Cit9CisKK2ludAorbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKFNJTV9DUFUgKmNwdSwgY29uc3QgSURFU0MgKmlkZXNjLAorCQkJICAgIGludCB1bml0X251bSwgaW50IHJlZmVyZW5jZWQsCisJCQkgICAgSU5UIHNyLCBJTlQgc3IyLCBJTlQgZHIpCit7CisgIGNoZWNrX2xvYWRfc3RhbGwgKGNwdSwgc3IpOworICBjaGVja19sb2FkX3N0YWxsIChjcHUsIHNyMik7CisgIHJldHVybiBpZGVzYy0+dGltaW5nLT51bml0c1t1bml0X251bV0uZG9uZTsKK30KKworaW50CittMzJyYmZfbW9kZWxfbTMycl9kX3VfY21wIChTSU1fQ1BVICpjcHUsIGNvbnN0IElERVNDICppZGVzYywKKwkJCSAgIGludCB1bml0X251bSwgaW50IHJlZmVyZW5jZWQsCisJCQkgICBJTlQgc3JjMSwgSU5UIHNyYzIpCit7CisgIGNoZWNrX2xvYWRfc3RhbGwgKGNwdSwgc3JjMSk7CisgIGNoZWNrX2xvYWRfc3RhbGwgKGNwdSwgc3JjMik7CisgIHJldHVybiBpZGVzYy0+dGltaW5nLT51bml0c1t1bml0X251bV0uZG9uZTsKK30KKworaW50CittMzJyYmZfbW9kZWxfbTMycl9kX3VfbWFjIChTSU1fQ1BVICpjcHUsIGNvbnN0IElERVNDICppZGVzYywKKwkJCSAgIGludCB1bml0X251bSwgaW50IHJlZmVyZW5jZWQsCisJCQkgICBJTlQgc3JjMSwgSU5UIHNyYzIpCit7CisgIGNoZWNrX2xvYWRfc3RhbGwgKGNwdSwgc3JjMSk7CisgIGNoZWNrX2xvYWRfc3RhbGwgKGNwdSwgc3JjMik7CisgIHJldHVybiBpZGVzYy0+dGltaW5nLT51bml0c1t1bml0X251bV0uZG9uZTsKK30KKworaW50CittMzJyYmZfbW9kZWxfbTMycl9kX3VfY3RpIChTSU1fQ1BVICpjcHUsIGNvbnN0IElERVNDICppZGVzYywKKwkJCSAgIGludCB1bml0X251bSwgaW50IHJlZmVyZW5jZWQsCisJCQkgICBJTlQgc3IpCit7CisgIFBST0ZJTEVfREFUQSAqcHJvZmlsZSA9IENQVV9QUk9GSUxFX0RBVEEgKGNwdSk7CisgIGludCB0YWtlbl9wID0gKHJlZmVyZW5jZWQgJiAoMSA8PCAxKSkgIT0gMDsKKworICBjaGVja19sb2FkX3N0YWxsIChjcHUsIHNyKTsKKyAgaWYgKHRha2VuX3ApCisgICAgeworICAgICAgQ1BVX00zMlJfTUlTQ19QUk9GSUxFIChjcHUpLT5jdGlfc3RhbGwgKz0gMjsKKyAgICAgIFBST0ZJTEVfTU9ERUxfVEFLRU5fQ09VTlQgKHByb2ZpbGUpICs9IDE7CisgICAgfQorICBlbHNlCisgICAgUFJPRklMRV9NT0RFTF9VTlRBS0VOX0NPVU5UIChwcm9maWxlKSArPSAxOworICByZXR1cm4gaWRlc2MtPnRpbWluZy0+dW5pdHNbdW5pdF9udW1dLmRvbmU7Cit9CisKK2ludAorbTMycmJmX21vZGVsX20zMnJfZF91X2xvYWQgKFNJTV9DUFUgKmNwdSwgY29uc3QgSURFU0MgKmlkZXNjLAorCQkJICAgIGludCB1bml0X251bSwgaW50IHJlZmVyZW5jZWQsCisJCQkgICAgSU5UIHNyLCBJTlQgZHIpCit7CisgIENQVV9NMzJSX01JU0NfUFJPRklMRSAoY3B1KS0+bG9hZF9yZWdzX3BlbmRpbmcgfD0gKDEgPDwgZHIpOworICBjaGVja19sb2FkX3N0YWxsIChjcHUsIHNyKTsKKyAgcmV0dXJuIGlkZXNjLT50aW1pbmctPnVuaXRzW3VuaXRfbnVtXS5kb25lOworfQorCitpbnQKK20zMnJiZl9tb2RlbF9tMzJyX2RfdV9zdG9yZSAoU0lNX0NQVSAqY3B1LCBjb25zdCBJREVTQyAqaWRlc2MsCisJCQkgICAgIGludCB1bml0X251bSwgaW50IHJlZmVyZW5jZWQsCisJCQkgICAgIElOVCBzcmMxLCBJTlQgc3JjMikKK3sKKyAgY2hlY2tfbG9hZF9zdGFsbCAoY3B1LCBzcmMxKTsKKyAgY2hlY2tfbG9hZF9zdGFsbCAoY3B1LCBzcmMyKTsKKyAgcmV0dXJuIGlkZXNjLT50aW1pbmctPnVuaXRzW3VuaXRfbnVtXS5kb25lOworfQorCitpbnQKK20zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoU0lNX0NQVSAqY3B1LCBjb25zdCBJREVTQyAqaWRlc2MsCisJCQkgIGludCB1bml0X251bSwgaW50IHJlZmVyZW5jZWQpCit7CisgIHJldHVybiBpZGVzYy0+dGltaW5nLT51bml0c1t1bml0X251bV0uZG9uZTsKK30KKworI2VuZGlmIC8qIFdJVEhfUFJPRklMRV9NT0RFTF9QICovCmRpZmYgLS1naXQgYS9zaW0vbTMyci9tbG9vcC5pbiBiL3NpbS9tMzJyL21sb29wLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OWI3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbTMyci9tbG9vcC5pbgpAQCAtMCwwICsxLDMxOSBAQAorIyBTaW11bGF0b3IgbWFpbiBsb29wIGZvciBtMzJyLiAtKi0gQyAtKi0KKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMgU3ludGF4OgorIyAvYmluL3NoIG1haW5sb29wLmluIGNvbW1hbmQKKyMKKyMgQ29tbWFuZCBpcyBvbmUgb2Y6CisjCisjIGluaXQKKyMgc3VwcG9ydAorIyBleHRyYWN0LXtzaW1wbGUsc2NhY2hlLHBiYn0KKyMge2Z1bGwsZmFzdH0tZXhlYy17c2ltcGxlLHNjYWNoZSxwYmJ9CisjCisjIEEgdGFyZ2V0IG5lZWQgb25seSBwcm92aWRlIGEgImZ1bGwiIHZlcnNpb24gb2Ygb25lIG9mIHNpbXBsZSxzY2FjaGUscGJiLgorIyBJZiB0aGUgdGFyZ2V0IHdhbnRzIGl0IGNhbiBhbHNvIHByb3ZpZGUgYSBmYXN0IHZlcnNpb24gb2Ygc2FtZSwgb3IgaWYKKyMgdGhlIHNsb3cgKGZ1bGwgZmVhdHVyZWQpIHZlcnNpb24gaXMgYHNpbXBsZScsIHRoZW4gdGhlIGZhc3QgdmVyc2lvbiBjYW4gYmUKKyMgb25lIG9mIHNjYWNoZS9wYmIuCisjIEEgdGFyZ2V0IGNhbid0IHByb3ZpZGUgbW9yZSB0aGFuIHRoaXMuCisjIEhvd2V2ZXIgZm9yIGlsbHVzdHJhdGlvbidzIHNha2UgdGhpcyBmaWxlIHByb3ZpZGVzIGV4YW1wbGVzIG9mIGFsbC4KKworIyA/Pz8gQWZ0ZXIgYSBmZXcgbW9yZSBwb3J0cyBhcmUgZG9uZSwgcmV2aXNpdC4KKyMgV2lsbCBldmVudHVhbGx5IG5lZWQgdG8gbWFjaGluZSBnZW5lcmF0ZSBhIGxvdCBvZiB0aGlzLgorCitjYXNlICJ4JDEiIGluCisKK3hzdXBwb3J0KQorCitjYXQgPDxFT0YKKworc3RhdGljIElOTElORSBjb25zdCBJREVTQyAqCitleHRyYWN0MTYgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBQQ0FERFIgcGMsIENHRU5fSU5TTl9JTlQgaW5zbiwKKwkgICBBUkdCVUYgKmFidWYsIGludCBmYXN0X3ApCit7CisgIGNvbnN0IElERVNDICppZCA9IEBjcHVAX2RlY29kZSAoY3VycmVudF9jcHUsIHBjLCBpbnNuLCBpbnNuLCBhYnVmKTsKKworICBAY3B1QF9maWxsX2FyZ2J1ZiAoY3VycmVudF9jcHUsIGFidWYsIGlkLCBwYywgZmFzdF9wKTsKKyAgaWYgKCEgZmFzdF9wKQorICAgIHsKKyAgICAgIGludCB0cmFjZV9wID0gUENfSU5fVFJBQ0VfUkFOR0VfUCAoY3VycmVudF9jcHUsIHBjKTsKKyAgICAgIGludCBwcm9maWxlX3AgPSBQQ19JTl9QUk9GSUxFX1JBTkdFX1AgKGN1cnJlbnRfY3B1LCBwYyk7CisgICAgICBAY3B1QF9maWxsX2FyZ2J1Zl90cCAoY3VycmVudF9jcHUsIGFidWYsIHRyYWNlX3AsIHByb2ZpbGVfcCk7CisgICAgfQorICByZXR1cm4gaWQ7Cit9CisKK3N0YXRpYyBJTkxJTkUgY29uc3QgSURFU0MgKgorZXh0cmFjdDMyIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgUENBRERSIHBjLCBDR0VOX0lOU05fSU5UIGluc24sCisJICAgQVJHQlVGICphYnVmLCBpbnQgZmFzdF9wKQoreworICBjb25zdCBJREVTQyAqaWQgPSBAY3B1QF9kZWNvZGUgKGN1cnJlbnRfY3B1LCBwYywgKFVTSSkgaW5zbiA+PiAxNiwgaW5zbiwgYWJ1Zik7CisKKyAgQGNwdUBfZmlsbF9hcmdidWYgKGN1cnJlbnRfY3B1LCBhYnVmLCBpZCwgcGMsIGZhc3RfcCk7CisgIGlmICghIGZhc3RfcCkKKyAgICB7CisgICAgICBpbnQgdHJhY2VfcCA9IFBDX0lOX1RSQUNFX1JBTkdFX1AgKGN1cnJlbnRfY3B1LCBwYyk7CisgICAgICBpbnQgcHJvZmlsZV9wID0gUENfSU5fUFJPRklMRV9SQU5HRV9QIChjdXJyZW50X2NwdSwgcGMpOworICAgICAgQGNwdUBfZmlsbF9hcmdidWZfdHAgKGN1cnJlbnRfY3B1LCBhYnVmLCB0cmFjZV9wLCBwcm9maWxlX3ApOworICAgIH0KKyAgcmV0dXJuIGlkOworfQorCitzdGF0aWMgSU5MSU5FIFNFTV9QQworZXhlY3V0ZSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNDQUNIRSAqc2MsIGludCBmYXN0X3ApCit7CisgIFNFTV9QQyB2cGM7CisKKyAgaWYgKGZhc3RfcCkKKyAgICB7CisjaWYgISBXSVRIX1NFTV9TV0lUQ0hfRkFTVAorI2lmIFdJVEhfU0NBQ0hFCisgICAgICB2cGMgPSAoKnNjLT5hcmdidWYuc2VtYW50aWMuc2VtX2Zhc3QpIChjdXJyZW50X2NwdSwgc2MpOworI2Vsc2UKKyAgICAgIHZwYyA9ICgqc2MtPmFyZ2J1Zi5zZW1hbnRpYy5zZW1fZmFzdCkgKGN1cnJlbnRfY3B1LCAmc2MtPmFyZ2J1Zik7CisjZW5kaWYKKyNlbHNlCisgICAgICBhYm9ydCAoKTsKKyNlbmRpZiAvKiBXSVRIX1NFTV9TV0lUQ0hfRkFTVCAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyNpZiAhIFdJVEhfU0VNX1NXSVRDSF9GVUxMCisgICAgICBBUkdCVUYgKmFidWYgPSAmc2MtPmFyZ2J1ZjsKKyAgICAgIGNvbnN0IElERVNDICppZGVzYyA9IGFidWYtPmlkZXNjOworICAgICAgY29uc3QgQ0dFTl9JTlNOICppZGF0YSA9IGlkZXNjLT5pZGF0YTsKKyNpZiBXSVRIX1NDQUNIRV9QQkIKKyAgICAgIGludCB2aXJ0dWFsX3AgPSBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaWRhdGEsIENHRU5fSU5TTl9WSVJUVUFMKTsKKyNlbHNlCisgICAgICBpbnQgdmlydHVhbF9wID0gMDsKKyNlbmRpZgorCisgICAgICBpZiAoISB2aXJ0dWFsX3ApCisJeworCSAgLyogRklYTUU6IGNhbGwgeC1iZWZvcmUgKi8KKwkgIGlmIChBUkdCVUZfUFJPRklMRV9QIChhYnVmKSkKKwkgICAgUFJPRklMRV9DT1VOVF9JTlNOIChjdXJyZW50X2NwdSwgYWJ1Zi0+YWRkciwgaWRlc2MtPm51bSk7CisJICAvKiBGSVhNRTogTGF0ZXIgbWFrZSBjb3ZlciBtYWNyb3M6IFBST0ZJTEVfSU5TTl97SU5JVCxGSU5JfS4gICovCisJICBpZiAoUFJPRklMRV9NT0RFTF9QIChjdXJyZW50X2NwdSkKKwkgICAgICAmJiBBUkdCVUZfUFJPRklMRV9QIChhYnVmKSkKKwkgICAgQGNwdUBfbW9kZWxfaW5zbl9iZWZvcmUgKGN1cnJlbnRfY3B1LCAxIC8qZmlyc3RfcCovKTsKKwkgIFRSQUNFX0lOU05fSU5JVCAoY3VycmVudF9jcHUsIGFidWYsIDEpOworCSAgVFJBQ0VfSU5TTiAoY3VycmVudF9jcHUsIGlkYXRhLAorCQkgICAgICAoY29uc3Qgc3RydWN0IGFyZ2J1ZiAqKSBhYnVmLCBhYnVmLT5hZGRyKTsKKwl9CisjaWYgV0lUSF9TQ0FDSEUKKyAgICAgIHZwYyA9ICgqc2MtPmFyZ2J1Zi5zZW1hbnRpYy5zZW1fZnVsbCkgKGN1cnJlbnRfY3B1LCBzYyk7CisjZWxzZQorICAgICAgdnBjID0gKCpzYy0+YXJnYnVmLnNlbWFudGljLnNlbV9mdWxsKSAoY3VycmVudF9jcHUsIGFidWYpOworI2VuZGlmCisgICAgICBpZiAoISB2aXJ0dWFsX3ApCisJeworCSAgLyogRklYTUU6IGNhbGwgeC1hZnRlciAqLworCSAgaWYgKFBST0ZJTEVfTU9ERUxfUCAoY3VycmVudF9jcHUpCisJICAgICAgJiYgQVJHQlVGX1BST0ZJTEVfUCAoYWJ1ZikpCisJICAgIHsKKwkgICAgICBpbnQgY3ljbGVzOworCisJICAgICAgY3ljbGVzID0gKCppZGVzYy0+dGltaW5nLT5tb2RlbF9mbikgKGN1cnJlbnRfY3B1LCBzYyk7CisJICAgICAgQGNwdUBfbW9kZWxfaW5zbl9hZnRlciAoY3VycmVudF9jcHUsIDEgLypsYXN0X3AqLywgY3ljbGVzKTsKKwkgICAgfQorCSAgVFJBQ0VfSU5TTl9GSU5JIChjdXJyZW50X2NwdSwgYWJ1ZiwgMSk7CisJfQorI2Vsc2UKKyAgICAgIGFib3J0ICgpOworI2VuZGlmIC8qIFdJVEhfU0VNX1NXSVRDSF9GVUxMICovCisgICAgfQorCisgIHJldHVybiB2cGM7Cit9CisKK0VPRgorCis7OworCit4aW5pdCkKKworIyBOb3RoaW5nIG5lZWRlZC4KKworOzsKKworeGV4dHJhY3Qtc2ltcGxlIHwgeGV4dHJhY3Qtc2NhY2hlKQorCitjYXQgPDxFT0YKK3sKKyAgaWYgKChwYyAmIDMpICE9IDApCisgICAgeworICAgICAgLyogVGhpcyBvbmx5IG9jY3VycyB3aGVuIHNpbmdsZSBzdGVwcGluZy4KKwkgVGhlIHRlc3QgaXMgdW5uZWNlc3Nhcnkgb3RoZXJ3aXNlLCBidXQgdGhlIGNvc3QgaXMgdGVlbnN5LAorCSBjb21wYXJlZCB3aXRoIGRlY29kaW5nL2V4dHJhY3Rpb24uICAqLworICAgICAgVUhJIGluc24gPSBHRVRJTUVNVUhJIChjdXJyZW50X2NwdSwgcGMpOworICAgICAgZXh0cmFjdDE2IChjdXJyZW50X2NwdSwgcGMsIGluc24gJiAweDdmZmYsIHNjLCBGQVNUX1ApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIFVTSSBpbnNuID0gR0VUSU1FTVVTSSAoY3VycmVudF9jcHUsIHBjKTsKKyAgICAgIGlmICgoU0kpIGluc24gPCAwKQorCXsKKwkgIGV4dHJhY3QzMiAoY3VycmVudF9jcHUsIHBjLCBpbnNuLCBzYywgRkFTVF9QKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZXh0cmFjdDE2IChjdXJyZW50X2NwdSwgcGMsIGluc24gPj4gMTYsIHNjLCBGQVNUX1ApOworCSAgZXh0cmFjdDE2IChjdXJyZW50X2NwdSwgcGMgKyAyLCBpbnNuICYgMHg3ZmZmLCBzYyArIDEsIEZBU1RfUCk7CisJICAvKiBUaGUgbTMyciBkb2Vzbid0IHN1cHBvcnQgcGFyYWxsZWwgZXhlY3V0aW9uLiAgKi8KKwkgIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMAorCSAgICAgICYmIChpbnNuICYgMHg3ZmZmKSAhPSAweDcwMDApIC8qIHBhcmFsbGVsIG5vcHMgYXJlIG9rICovCisJICAgIHNpbV9lbmdpbmVfaWxsZWdhbF9pbnNuIChjdXJyZW50X2NwdSwgcGMpOworCX0KKyAgICB9Cit9CitFT0YKKworOzsKKworeGV4dHJhY3QtcGJiKQorCisjIElucHV0czogIGN1cnJlbnRfY3B1LCBwYywgc2MsIG1heF9pbnNucywgRkFTVF9QCisjIE91dHB1dHM6IHNjLCBwYworIyBzYyBtdXN0IGJlIGxlZnQgcG9pbnRpbmcgcGFzdCB0aGUgbGFzdCBjcmVhdGVkIGVudHJ5LgorIyBwYyBtdXN0IGJlIGxlZnQgcG9pbnRpbmcgcGFzdCB0aGUgbGFzdCBjcmVhdGVkIGVudHJ5LgorIyBJZiB0aGUgcGJiIGlzIHRlcm1pbmF0ZWQgYnkgYSBjdGkgaW5zbiwgU0VUX0NUSV9WUEMoc2MpIG11c3QgYmUgY2FsbGVkCisjIHRvIHJlY29yZCB0aGUgdnBjIG9mIHRoZSBjdGkgaW5zbi4KKyMgU0VUX0lOU05fQ09VTlQobikgbXVzdCBiZSBjYWxsZWQgdG8gcmVjb3JkIG51bWJlciBvZiByZWFsIGluc25zLgorCitjYXQgPDxFT0YKK3sKKyAgY29uc3QgSURFU0MgKmlkZXNjOworICBpbnQgaWNvdW50ID0gMDsKKworICBpZiAoKHBjICYgMykgIT0gMCkKKyAgICB7CisgICAgICAvKiBUaGlzIG9ubHkgb2NjdXJzIHdoZW4gc2luZ2xlIHN0ZXBwaW5nLgorCSBUaGUgdGVzdCBpcyB1bm5lY2Vzc2FyeSBvdGhlcndpc2UsIGJ1dCB0aGUgY29zdCBpcyB0ZWVuc3ksCisJIGNvbXBhcmVkIHdpdGggZGVjb2RpbmcvZXh0cmFjdGlvbi4gICovCisgICAgICBVSEkgaW5zbiA9IEdFVElNRU1VSEkgKGN1cnJlbnRfY3B1LCBwYyk7CisgICAgICBpZGVzYyA9IGV4dHJhY3QxNiAoY3VycmVudF9jcHUsIHBjLCBpbnNuICYgMHg3ZmZmLCAmc2MtPmFyZ2J1ZiwgRkFTVF9QKTsKKyAgICAgICsrc2M7CisgICAgICAtLW1heF9pbnNuczsKKyAgICAgICsraWNvdW50OworICAgICAgcGMgKz0gMjsKKyAgICAgIGlmIChJREVTQ19DVElfUCAoaWRlc2MpKQorCXsKKwkgIFNFVF9DVElfVlBDIChzYyAtIDEpOworCSAgZ290byBGaW5pc2g7CisJfQorICAgIH0KKworICB3aGlsZSAobWF4X2luc25zID4gMCkKKyAgICB7CisgICAgICBVU0kgaW5zbiA9IEdFVElNRU1VU0kgKGN1cnJlbnRfY3B1LCBwYyk7CisgICAgICBpZiAoKFNJKSBpbnNuIDwgMCkKKwl7CisJICBpZGVzYyA9IGV4dHJhY3QzMiAoY3VycmVudF9jcHUsIHBjLCBpbnNuLCAmc2MtPmFyZ2J1ZiwgRkFTVF9QKTsKKwkgICsrc2M7CisJICAtLW1heF9pbnNuczsKKwkgICsraWNvdW50OworCSAgcGMgKz0gNDsKKwkgIGlmIChJREVTQ19DVElfUCAoaWRlc2MpKQorCSAgICB7CisJICAgICAgU0VUX0NUSV9WUEMgKHNjIC0gMSk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgaWRlc2MgPSBleHRyYWN0MTYgKGN1cnJlbnRfY3B1LCBwYywgaW5zbiA+PiAxNiwgJnNjLT5hcmdidWYsIEZBU1RfUCk7CisJICArK3NjOworCSAgLS1tYXhfaW5zbnM7CisJICArK2ljb3VudDsKKwkgIHBjICs9IDI7CisJICBpZiAoSURFU0NfQ1RJX1AgKGlkZXNjKSkKKwkgICAgeworCSAgICAgIFNFVF9DVElfVlBDIChzYyAtIDEpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAvKiBUaGUgbTMyciBkb2Vzbid0IHN1cHBvcnQgcGFyYWxsZWwgZXhlY3V0aW9uLiAgKi8KKwkgIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKKwkgICAgeworCSAgICAgIC8qID8/PyBEZWZlciBzaWduYWxsaW5nIHRvIGV4ZWN1dGlvbi4gICovCisJICAgICAgaWYgKChpbnNuICYgMHg3ZmZmKSAhPSAweDcwMDApIC8qIHBhcmFsbGVsIG5vcHMgYXJlIG9rICovCisJCXNpbV9lbmdpbmVfaW52YWxpZF9pbnNuIChjdXJyZW50X2NwdSwgcGMgLSAyKTsKKwkgICAgICAvKiBUaGVyZSdzIG5vIHBvaW50IGluIHByb2Nlc3NpbmcgcGFyYWxsZWwgbm9wcyBpbiBmYXN0IG1vZGUuCisJCSBXZSBtaWdodCBhcyB3ZWxsIGRvIHRoaXMgdGVzdCBzaW5jZSB3ZSd2ZSBhbHJlYWR5IHRlc3RlZAorCQkgdGhhdCB3ZSBoYXZlIGEgcGFyYWxsZWwgbm9wLiAgKi8KKwkgICAgICBpZiAoMCAmJiBGQVNUX1ApCisJCXsKKwkJICBwYyArPSAyOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIE5vbi1wYXJhbGxlbCBjYXNlLgorCQkgV2hpbGUgd2UncmUgZ3VhcmFudGVlZCB0aGF0IHRoZXJlJ3Mgcm9vbSB0byBleHRyYWN0IHRoZQorCQkgaW5zbiwgd2hlbiBzaW5nbGUgc3RlcHBpbmcgd2UgY2FuJ3Q7IHRoZSBwYmIgbXVzdCBzdG9wCisJCSBhZnRlciB0aGUgZmlyc3QgaW5zbi4gICovCisJICAgICAgaWYgKG1heF9pbnNucyA9PSAwKQorCQlicmVhazsKKwkgICAgfQorCSAgLyogV2UncmUgZ3VhcmFudGVlZCB0aGF0IHdlIGNhbiBhbHdheXMgcHJvY2VzcyAxNiBiaXQgaW5zbnMgaW4KKwkgICAgIHBhaXJzLiAgKi8KKwkgIGlkZXNjID0gZXh0cmFjdDE2IChjdXJyZW50X2NwdSwgcGMsIGluc24gJiAweDdmZmYsICZzYy0+YXJnYnVmLCBGQVNUX1ApOworCSAgKytzYzsKKwkgIC0tbWF4X2luc25zOworCSAgKytpY291bnQ7CisJICBwYyArPSAyOworCSAgaWYgKElERVNDX0NUSV9QIChpZGVzYykpCisJICAgIHsKKwkgICAgICBTRVRfQ1RJX1ZQQyAoc2MgLSAxKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyBGaW5pc2g6CisgIFNFVF9JTlNOX0NPVU5UIChpY291bnQpOworfQorRU9GCisKKzs7CisKK3hmdWxsLWV4ZWMtKiB8IHhmYXN0LWV4ZWMtKikKKworIyBJbnB1dHM6IGN1cnJlbnRfY3B1LCB2cGMsIEZBU1RfUAorIyBPdXRwdXRzOiB2cGMKKyMgdnBjIGlzIHRoZSB2aXJ0dWFsIHByb2dyYW0gY291bnRlci4KKworY2F0IDw8RU9GCisjaWYgKCEgRkFTVF9QICYmIFdJVEhfU0VNX1NXSVRDSF9GVUxMKSB8fCAoRkFTVF9QICYmIFdJVEhfU0VNX1NXSVRDSF9GQVNUKQorI2RlZmluZSBERUZJTkVfU1dJVENICisjaW5jbHVkZSAic2VtLXN3aXRjaC5jIgorI2Vsc2UKKyAgdnBjID0gZXhlY3V0ZSAoY3VycmVudF9jcHUsIHZwYywgRkFTVF9QKTsKKyNlbmRpZgorRU9GCisKKzs7CisKKyopCisgIGVjaG8gIkludmFsaWQgYXJndW1lbnQgdG8gbWFpbmxvb3AuaW46ICQxIiA+JjIKKyAgZXhpdCAxCisgIDs7CisKK2VzYWMKZGlmZiAtLWdpdCBhL3NpbS9tMzJyL21vZGVsLmMgYi9zaW0vbTMyci9tb2RlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDQ1NGUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbTMyci9tb2RlbC5jCkBAIC0wLDAgKzEsNDE2OCBAQAorLyogU2ltdWxhdG9yIG1vZGVsIHN1cHBvcnQgZm9yIG0zMnJiZi4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2RlZmluZSBXQU5UX0NQVSBtMzJyYmYKKyNkZWZpbmUgV0FOVF9DUFVfTTMyUkJGCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorCisvKiBUaGUgcHJvZmlsaW5nIGRhdGEgaXMgcmVjb3JkZWQgaGVyZSwgYnV0IGlzIGFjY2Vzc2VkIHZpYSB0aGUgcHJvZmlsaW5nCisgICBtZWNoYW5pc20uICBBZnRlciBhbGwsIHRoaXMgaXMgaW5mb3JtYXRpb24gZm9yIHByb2ZpbGluZy4gICovCisKKyNpZiBXSVRIX1BST0ZJTEVfTU9ERUxfUAorCisvKiBNb2RlbCBoYW5kbGVycyBmb3IgZWFjaCBpbnNuLiAgKi8KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX2FkZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIGluX3NyID0gRkxEIChpbl9zcik7CisgICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKKyAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfYWRkMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZDMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIElOVCBpbl9kciA9IC0xOworICAgIElOVCBvdXRfZHIgPSAtMTsKKyAgICBpbl9zciA9IEZMRCAoaW5fc3IpOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9hbmQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIElOVCBpbl9kciA9IC0xOworICAgIElOVCBvdXRfZHIgPSAtMTsKKyAgICBpbl9zciA9IEZMRCAoaW5fc3IpOworICAgIGluX2RyID0gRkxEIChpbl9kcik7CisgICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX2FuZDMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmQzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBJTlQgaW5fZHIgPSAtMTsKKyAgICBJTlQgb3V0X2RyID0gLTE7CisgICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKKyAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2Rfb3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIElOVCBpbl9kciA9IC0xOworICAgIElOVCBvdXRfZHIgPSAtMTsKKyAgICBpbl9zciA9IEZMRCAoaW5fc3IpOworICAgIGluX2RyID0gRkxEIChpbl9kcik7CisgICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX29yMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X29yMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIGluX3NyID0gRkxEIChpbl9zcik7CisgICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX3hvciAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIGluX3NyID0gRkxEIChpbl9zcik7CisgICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKKyAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfeG9yMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FuZDMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIElOVCBpbl9kciA9IC0xOworICAgIElOVCBvdXRfZHIgPSAtMTsKKyAgICBpbl9zciA9IEZMRCAoaW5fc3IpOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9hZGRpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkaS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIGluX2RyID0gRkxEIChpbl9kcik7CisgICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX2FkZHYgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGR2LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBJTlQgaW5fZHIgPSAtMTsKKyAgICBJTlQgb3V0X2RyID0gLTE7CisgICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKKyAgICBpbl9kciA9IEZMRCAoaW5fZHIpOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9hZGR2MyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZHYzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBJTlQgaW5fZHIgPSAtMTsKKyAgICBJTlQgb3V0X2RyID0gLTE7CisgICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKKyAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfYWRkeCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZHguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIElOVCBpbl9kciA9IC0xOworICAgIElOVCBvdXRfZHIgPSAtMTsKKyAgICBpbl9zciA9IEZMRCAoaW5fc3IpOworICAgIGluX2RyID0gRkxEIChpbl9kcik7CisgICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX2JjOCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmM4LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfYmMyNCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmMyNC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX2JlcSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmVxLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMykpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKKyAgfQorICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3JjMSA9IC0xOworICAgIElOVCBpbl9zcmMyID0gLTE7CisgICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7CisgICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9jbXAgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX2JlcXogKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcXouZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zcmMxID0gLTE7CisgICAgSU5UIGluX3NyYzIgPSAtMTsKKyAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2NtcCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfYmdleiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmVxei5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyYzEgPSAtMTsKKyAgICBJTlQgaW5fc3JjMiA9IC0xOworICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY21wIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9iZ3R6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iZXF6LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKKyAgfQorICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3JjMSA9IC0xOworICAgIElOVCBpbl9zcmMyID0gLTE7CisgICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9jbXAgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX2JsZXogKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcXouZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zcmMxID0gLTE7CisgICAgSU5UIGluX3NyYzIgPSAtMTsKKyAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2NtcCAoY3VycmVudF9jcHUsIGlkZXNjLCAxLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfYmx0eiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmVxei5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyYzEgPSAtMTsKKyAgICBJTlQgaW5fc3JjMiA9IC0xOworICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY21wIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9ibmV6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iZXF6LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKKyAgfQorICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3JjMSA9IC0xOworICAgIElOVCBpbl9zcmMyID0gLTE7CisgICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9jbXAgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX2JsOCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmw4LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX2JsMjQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JsMjQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfYm5jOCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmM4LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY3RpIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfYm5jMjQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JjMjQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9ibmUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDMpKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyYzEgPSAtMTsKKyAgICBJTlQgaW5fc3JjMiA9IC0xOworICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOworICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY21wIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9icmE4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9icmE4LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX2JyYTI0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9icmEyNC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9jbXAgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXAuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zcmMxID0gLTE7CisgICAgSU5UIGluX3NyYzIgPSAtMTsKKyAgICBpbl9zcmMxID0gRkxEIChpbl9zcmMxKTsKKyAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2NtcCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfY21waSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zcmMxID0gLTE7CisgICAgSU5UIGluX3NyYzIgPSAtMTsKKyAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2NtcCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfY21wdSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyYzEgPSAtMTsKKyAgICBJTlQgaW5fc3JjMiA9IC0xOworICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOworICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfY21wIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9jbXB1aSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zcmMxID0gLTE7CisgICAgSU5UIGluX3NyYzIgPSAtMTsKKyAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2NtcCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfZGl2IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZGl2LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBJTlQgaW5fZHIgPSAtMTsKKyAgICBJTlQgb3V0X2RyID0gLTE7CisgICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKKyAgICBpbl9kciA9IEZMRCAoaW5fZHIpOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMCkpIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAyKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfZGl2dSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rpdi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIGluX3NyID0gRkxEIChpbl9zcik7CisgICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKKyAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDApKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX3JlbSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rpdi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIGluX3NyID0gRkxEIChpbl9zcik7CisgICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKKyAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDApKSByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBpZiAoaW5zbl9yZWZlcmVuY2VkICYgKDEgPDwgMikpIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX3JlbXUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kaXYuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIElOVCBpbl9kciA9IC0xOworICAgIElOVCBvdXRfZHIgPSAtMTsKKyAgICBpbl9zciA9IEZMRCAoaW5fc3IpOworICAgIGluX2RyID0gRkxEIChpbl9kcik7CisgICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIGlmIChpbnNuX3JlZmVyZW5jZWQgJiAoMSA8PCAwKSkgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgaWYgKGluc25fcmVmZXJlbmNlZCAmICgxIDw8IDIpKSByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9qbCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfamwuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIGluX3NyID0gRkxEIChpbl9zcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9jdGkgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9qbXAgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2ptcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2N0aSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX2xkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IDA7CisgICAgSU5UIG91dF9kciA9IDA7CisgICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKKyAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9sZF9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gMDsKKyAgICBJTlQgb3V0X2RyID0gMDsKKyAgICBpbl9zciA9IEZMRCAoaW5fc3IpOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX2xkYiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gMDsKKyAgICBJTlQgb3V0X2RyID0gMDsKKyAgICBpbl9zciA9IEZMRCAoaW5fc3IpOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX2xkYl9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRiX2QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IDA7CisgICAgSU5UIG91dF9kciA9IDA7CisgICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKKyAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9sZGggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IDA7CisgICAgSU5UIG91dF9kciA9IDA7CisgICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKKyAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9sZGhfZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaF9kLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAwOworICAgIElOVCBvdXRfZHIgPSAwOworICAgIGluX3NyID0gRkxEIChpbl9zcik7CisgICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfbGR1YiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gMDsKKyAgICBJTlQgb3V0X2RyID0gMDsKKyAgICBpbl9zciA9IEZMRCAoaW5fc3IpOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX2xkdWJfZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYl9kLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAwOworICAgIElOVCBvdXRfZHIgPSAwOworICAgIGluX3NyID0gRkxEIChpbl9zcik7CisgICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfbGR1aCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gMDsKKyAgICBJTlQgb3V0X2RyID0gMDsKKyAgICBpbl9zciA9IEZMRCAoaW5fc3IpOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX2xkdWhfZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaF9kLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAwOworICAgIElOVCBvdXRfZHIgPSAwOworICAgIGluX3NyID0gRkxEIChpbl9zcik7CisgICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfbGRfcGx1cyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkX3BsdXMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IDA7CisgICAgSU5UIG91dF9kciA9IDA7CisgICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKKyAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9sb2FkIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBvdXRfZHIpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIElOVCBpbl9kciA9IC0xOworICAgIElOVCBvdXRfZHIgPSAtMTsKKyAgICBpbl9kciA9IEZMRCAoaW5fc3IpOworICAgIG91dF9kciA9IEZMRCAob3V0X3NyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9sZDI0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGQyNC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9sZGk4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRpOC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9sZGkxNiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaTE2LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBJTlQgaW5fZHIgPSAtMTsKKyAgICBJTlQgb3V0X2RyID0gLTE7CisgICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX2xvY2sgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sb2NrLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAwOworICAgIElOVCBvdXRfZHIgPSAwOworICAgIGluX3NyID0gRkxEIChpbl9zcik7CisgICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfbG9hZCAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfbWFjaGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tYWNoaS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyYzEgPSAtMTsKKyAgICBJTlQgaW5fc3JjMiA9IC0xOworICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOworICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfbWFjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9tYWNsbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21hY2hpLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3JjMSA9IC0xOworICAgIElOVCBpbl9zcmMyID0gLTE7CisgICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7CisgICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX21hY3doaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21hY2hpLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3JjMSA9IC0xOworICAgIElOVCBpbl9zcmMyID0gLTE7CisgICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7CisgICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX21hY3dsbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21hY2hpLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3JjMSA9IC0xOworICAgIElOVCBpbl9zcmMyID0gLTE7CisgICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7CisgICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX211bCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIGluX3NyID0gRkxEIChpbl9zcik7CisgICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKKyAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfbXVsaGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxoaS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyYzEgPSAtMTsKKyAgICBJTlQgaW5fc3JjMiA9IC0xOworICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOworICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfbWFjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9tdWxsbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bGhpLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3JjMSA9IC0xOworICAgIElOVCBpbl9zcmMyID0gLTE7CisgICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7CisgICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX211bHdoaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bGhpLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3JjMSA9IC0xOworICAgIElOVCBpbl9zcmMyID0gLTE7CisgICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7CisgICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX211bHdsbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bGhpLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3JjMSA9IC0xOworICAgIElOVCBpbl9zcmMyID0gLTE7CisgICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7CisgICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX212IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXYuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIElOVCBpbl9kciA9IC0xOworICAgIElOVCBvdXRfZHIgPSAtMTsKKyAgICBpbl9zciA9IEZMRCAoaW5fc3IpOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9tdmZhY2hpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXZmYWNoaS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9tdmZhY2xvIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXZmYWNoaS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9tdmZhY21pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXZmYWNoaS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9tdmZjIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXZmYy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9tdnRhY2hpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXZ0YWNoaS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIGluX3NyID0gRkxEIChpbl9zcmMxKTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9tdnRhY2xvIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXZ0YWNoaS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIGluX3NyID0gRkxEIChpbl9zcmMxKTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9tdnRjIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXZ0Yy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIGluX3NyID0gRkxEIChpbl9zcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfbmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXYuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIElOVCBpbl9kciA9IC0xOworICAgIElOVCBvdXRfZHIgPSAtMTsKKyAgICBpbl9zciA9IEZMRCAoaW5fc3IpOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9ub3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIElOVCBpbl9kciA9IC0xOworICAgIElOVCBvdXRfZHIgPSAtMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9ub3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIGluX3NyID0gRkxEIChpbl9zcik7CisgICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX3JhYyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3JhYy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyYzEgPSAtMTsKKyAgICBJTlQgaW5fc3JjMiA9IC0xOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfbWFjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9yYWNoIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfcmFjLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3JjMSA9IC0xOworICAgIElOVCBpbl9zcmMyID0gLTE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9tYWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX3J0ZSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfcnRlLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBJTlQgaW5fZHIgPSAtMTsKKyAgICBJTlQgb3V0X2RyID0gLTE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2Rfc2V0aCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3NldGguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIElOVCBpbl9kciA9IC0xOworICAgIElOVCBvdXRfZHIgPSAtMTsKKyAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2Rfc2xsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBJTlQgaW5fZHIgPSAtMTsKKyAgICBJTlQgb3V0X2RyID0gLTE7CisgICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKKyAgICBpbl9kciA9IEZMRCAoaW5fZHIpOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9zbGwzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc2xsMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIGluX3NyID0gRkxEIChpbl9zcik7CisgICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX3NsbGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zbGxpLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBJTlQgaW5fZHIgPSAtMTsKKyAgICBJTlQgb3V0X2RyID0gLTE7CisgICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKKyAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2Rfc3JhIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBJTlQgaW5fZHIgPSAtMTsKKyAgICBJTlQgb3V0X2RyID0gLTE7CisgICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKKyAgICBpbl9kciA9IEZMRCAoaW5fZHIpOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9zcmEzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc2xsMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIGluX3NyID0gRkxEIChpbl9zcik7CisgICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX3NyYWkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zbGxpLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBJTlQgaW5fZHIgPSAtMTsKKyAgICBJTlQgb3V0X2RyID0gLTE7CisgICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKKyAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2Rfc3JsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBJTlQgaW5fZHIgPSAtMTsKKyAgICBJTlQgb3V0X2RyID0gLTE7CisgICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKKyAgICBpbl9kciA9IEZMRCAoaW5fZHIpOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9zcmwzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc2xsMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIGluX3NyID0gRkxEIChpbl9zcik7CisgICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX3NybGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zbGxpLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBJTlQgaW5fZHIgPSAtMTsKKyAgICBJTlQgb3V0X2RyID0gLTE7CisgICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKKyAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2Rfc3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyYzEgPSAwOworICAgIElOVCBpbl9zcmMyID0gMDsKKyAgICBpbl9zcmMxID0gRkxEIChpbl9zcmMxKTsKKyAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9zdF9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyYzEgPSAwOworICAgIElOVCBpbl9zcmMyID0gMDsKKyAgICBpbl9zcmMxID0gRkxEIChpbl9zcmMxKTsKKyAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9zdGIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGIuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zcmMxID0gMDsKKyAgICBJTlQgaW5fc3JjMiA9IDA7CisgICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7CisgICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2Rfc3RiX2QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGJfZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyYzEgPSAwOworICAgIElOVCBpbl9zcmMyID0gMDsKKyAgICBpbl9zcmMxID0gRkxEIChpbl9zcmMxKTsKKyAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9zdGggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zcmMxID0gMDsKKyAgICBJTlQgaW5fc3JjMiA9IDA7CisgICAgaW5fc3JjMSA9IEZMRCAoaW5fc3JjMSk7CisgICAgaW5fc3JjMiA9IEZMRCAoaW5fc3JjMik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9zdG9yZSAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zcmMxLCBpbl9zcmMyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2Rfc3RoX2QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGhfZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyYzEgPSAwOworICAgIElOVCBpbl9zcmMyID0gMDsKKyAgICBpbl9zcmMxID0gRkxEIChpbl9zcmMxKTsKKyAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9zdF9wbHVzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfcGx1cy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyYzEgPSAwOworICAgIElOVCBpbl9zcmMyID0gMDsKKyAgICBpbl9zcmMxID0gRkxEIChpbl9zcmMxKTsKKyAgICBpbl9zcmMyID0gRkxEIChpbl9zcmMyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X3N0b3JlIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyYzEsIGluX3NyYzIpOworICB9CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIElOVCBpbl9kciA9IC0xOworICAgIElOVCBvdXRfZHIgPSAtMTsKKyAgICBpbl9kciA9IEZMRCAoaW5fc3JjMik7CisgICAgb3V0X2RyID0gRkxEIChvdXRfc3JjMik7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDEsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2Rfc3RfbWludXMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9wbHVzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3JjMSA9IDA7CisgICAgSU5UIGluX3NyYzIgPSAwOworICAgIGluX3NyYzEgPSBGTEQgKGluX3NyYzEpOworICAgIGluX3NyYzIgPSBGTEQgKGluX3NyYzIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3Vfc3RvcmUgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3JjMSwgaW5fc3JjMik7CisgIH0KKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIGluX2RyID0gRkxEIChpbl9zcmMyKTsKKyAgICBvdXRfZHIgPSBGTEQgKG91dF9zcmMyKTsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMSwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9zdWIgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIElOVCBpbl9zciA9IC0xOworICAgIElOVCBpbl9kciA9IC0xOworICAgIElOVCBvdXRfZHIgPSAtMTsKKyAgICBpbl9zciA9IEZMRCAoaW5fc3IpOworICAgIGluX2RyID0gRkxEIChpbl9kcik7CisgICAgb3V0X2RyID0gRkxEIChvdXRfZHIpOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAwOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAxOworICAgIHJlZmVyZW5jZWQgfD0gMSA8PCAyOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX3N1YnYgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGR2LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBJTlQgaW5fc3IgPSAtMTsKKyAgICBJTlQgaW5fZHIgPSAtMTsKKyAgICBJTlQgb3V0X2RyID0gLTE7CisgICAgaW5fc3IgPSBGTEQgKGluX3NyKTsKKyAgICBpbl9kciA9IEZMRCAoaW5fZHIpOworICAgIG91dF9kciA9IEZMRCAob3V0X2RyKTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMDsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMTsKKyAgICByZWZlcmVuY2VkIHw9IDEgPDwgMjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIGluX2RyLCBvdXRfZHIpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX20zMnJfZF9zdWJ4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkeC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIGluX3NyID0gRkxEIChpbl9zcik7CisgICAgaW5fZHIgPSBGTEQgKGluX2RyKTsKKyAgICBvdXRfZHIgPSBGTEQgKG91dF9kcik7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDA7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDE7CisgICAgcmVmZXJlbmNlZCB8PSAxIDw8IDI7CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF9tMzJyX2RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQsIGluX3NyLCBpbl9kciwgb3V0X2RyKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF9tMzJyX2RfdHJhcCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfdHJhcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gLTE7CisgICAgSU5UIGluX2RyID0gLTE7CisgICAgSU5UIG91dF9kciA9IC0xOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfbTMycl9kX3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkLCBpbl9zciwgaW5fZHIsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfbTMycl9kX3VubG9jayAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3VubG9jay5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgSU5UIGluX3NyID0gMDsKKyAgICBJTlQgb3V0X2RyID0gMDsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX20zMnJfZF91X2xvYWQgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCwgaW5fc3IsIG91dF9kcik7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9hZGQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9hZGQzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X2FuZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X2FuZDMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hbmQzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3Rfb3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9vcjMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9vcjMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF94b3IgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF94b3IzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYW5kMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X2FkZGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGRpLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfYWRkdiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZHYuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9hZGR2MyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZHYzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfYWRkeCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZHguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9iYzggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JjOC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X2JjMjQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JjMjQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9iZXEgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X2JlcXogKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcXouZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9iZ2V6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iZXF6LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfYmd0eiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmVxei5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X2JsZXogKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcXouZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9ibHR6IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iZXF6LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfYm5leiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmVxei5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X2JsOCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmw4LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfYmwyNCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmwyNC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X2JuYzggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JjOC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X2JuYzI0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iYzI0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfYm5lIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iZXEuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9icmE4IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9icmE4LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfYnJhMjQgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JyYTI0LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfY21wIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY21wLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfY21waSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9jbXB1IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfY21wLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfY21wdWkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXBpLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfZGl2IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZGl2LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfZGl2dSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rpdi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X3JlbSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rpdi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X3JlbXUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9kaXYuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9qbCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfamwuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9qbXAgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2ptcC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X2xkIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9sZF9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X2xkYiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X2xkYl9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRiX2QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9sZGggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9sZGhfZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaF9kLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfbGR1YiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X2xkdWJfZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYl9kLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfbGR1aCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X2xkdWhfZCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaF9kLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfbGRfcGx1cyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkX3BsdXMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9sZDI0IChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGQyNC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X2xkaTggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGk4LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfbGRpMTYgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGkxNi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X2xvY2sgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sb2NrLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfbWFjaGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tYWNoaS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X21hY2xvIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbWFjaGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9tYWN3aGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tYWNoaS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X21hY3dsbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21hY2hpLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfbXVsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfbXVsaGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxoaS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X211bGxvIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsaGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9tdWx3aGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxoaS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X211bHdsbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bGhpLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfbXYgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X212ZmFjaGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdmZhY2hpLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfbXZmYWNsbyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X212ZmFjaGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9tdmZhY21pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXZmYWNoaS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X212ZmMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdmZjLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfbXZ0YWNoaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X212dGFjaGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9tdnRhY2xvIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXZ0YWNoaS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X212dGMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdnRjLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfbmVnIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXYuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9ub3AgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3AuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9ub3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdi5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X3JhYyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3JhYy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X3JhY2ggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9yYWMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9ydGUgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X3J0ZS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X3NldGggKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zZXRoLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3Rfc2xsIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3Rfc2xsMyAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3NsbDMuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9zbGxpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc2xsaS5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X3NyYSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X3NyYTMgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zbGwzLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3Rfc3JhaSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3NsbGkuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9zcmwgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9zcmwzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc2xsMy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X3NybGkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zbGxpLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3Rfc3QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X3N0X2QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdF9kLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3Rfc3RiIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RiLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3Rfc3RiX2QgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGJfZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X3N0aCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0aC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X3N0aF9kIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RoX2QuZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF9zdF9wbHVzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfcGx1cy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X3N0X21pbnVzIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfcGx1cy5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X3N1YiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZC5mCisgIGNvbnN0IEFSR0JVRiAqIFVOVVNFRCBhYnVmID0gU0VNX0FSR0JVRiAoKFNFTV9BUkcpIHNlbV9hcmcpOworICBjb25zdCBJREVTQyAqIFVOVVNFRCBpZGVzYyA9IGFidWYtPmlkZXNjOworICBpbnQgY3ljbGVzID0gMDsKKyAgeworICAgIGludCByZWZlcmVuY2VkID0gMDsKKyAgICBpbnQgVU5VU0VEIGluc25fcmVmZXJlbmNlZCA9IGFidWYtPndyaXR0ZW47CisgICAgY3ljbGVzICs9IG0zMnJiZl9tb2RlbF90ZXN0X3VfZXhlYyAoY3VycmVudF9jcHUsIGlkZXNjLCAwLCByZWZlcmVuY2VkKTsKKyAgfQorICByZXR1cm4gY3ljbGVzOworI3VuZGVmIEZMRAorfQorCitzdGF0aWMgaW50Cittb2RlbF90ZXN0X3N1YnYgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCB2b2lkICpzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGR2LmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3Rfc3VieCAoU0lNX0NQVSAqY3VycmVudF9jcHUsIHZvaWQgKnNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZHguZgorICBjb25zdCBBUkdCVUYgKiBVTlVTRUQgYWJ1ZiA9IFNFTV9BUkdCVUYgKChTRU1fQVJHKSBzZW1fYXJnKTsKKyAgY29uc3QgSURFU0MgKiBVTlVTRUQgaWRlc2MgPSBhYnVmLT5pZGVzYzsKKyAgaW50IGN5Y2xlcyA9IDA7CisgIHsKKyAgICBpbnQgcmVmZXJlbmNlZCA9IDA7CisgICAgaW50IFVOVVNFRCBpbnNuX3JlZmVyZW5jZWQgPSBhYnVmLT53cml0dGVuOworICAgIGN5Y2xlcyArPSBtMzJyYmZfbW9kZWxfdGVzdF91X2V4ZWMgKGN1cnJlbnRfY3B1LCBpZGVzYywgMCwgcmVmZXJlbmNlZCk7CisgIH0KKyAgcmV0dXJuIGN5Y2xlczsKKyN1bmRlZiBGTEQKK30KKworc3RhdGljIGludAorbW9kZWxfdGVzdF90cmFwIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF90cmFwLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKK3N0YXRpYyBpbnQKK21vZGVsX3Rlc3RfdW5sb2NrIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgdm9pZCAqc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfdW5sb2NrLmYKKyAgY29uc3QgQVJHQlVGICogVU5VU0VEIGFidWYgPSBTRU1fQVJHQlVGICgoU0VNX0FSRykgc2VtX2FyZyk7CisgIGNvbnN0IElERVNDICogVU5VU0VEIGlkZXNjID0gYWJ1Zi0+aWRlc2M7CisgIGludCBjeWNsZXMgPSAwOworICB7CisgICAgaW50IHJlZmVyZW5jZWQgPSAwOworICAgIGludCBVTlVTRUQgaW5zbl9yZWZlcmVuY2VkID0gYWJ1Zi0+d3JpdHRlbjsKKyAgICBjeWNsZXMgKz0gbTMycmJmX21vZGVsX3Rlc3RfdV9leGVjIChjdXJyZW50X2NwdSwgaWRlc2MsIDAsIHJlZmVyZW5jZWQpOworICB9CisgIHJldHVybiBjeWNsZXM7CisjdW5kZWYgRkxECit9CisKKy8qIFdlIGFzc3VtZSBVTklUX05PTkUgPT0gMCBiZWNhdXNlIHRoZSB0YWJsZXMgZG9uJ3QgYWx3YXlzIHRlcm1pbmF0ZQorICAgZW50cmllcyB3aXRoIGl0LiAgKi8KKworLyogTW9kZWwgdGltaW5nIGRhdGEgZm9yIGBtMzJyL2QnLiAgKi8KKworc3RhdGljIGNvbnN0IElOU05fVElNSU5HIG0zMnJfZF90aW1pbmdbXSA9IHsKKyAgeyBNMzJSQkZfSU5TTl9YX0lOVkFMSUQsIDAsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fWF9BRlRFUiwgMCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9YX0JFRk9SRSwgMCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9YX0NUSV9DSEFJTiwgMCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9YX0NIQUlOLCAwLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1hfQkVHSU4sIDAsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fQURELCBtb2RlbF9tMzJyX2RfYWRkLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0FERDMsIG1vZGVsX20zMnJfZF9hZGQzLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0FORCwgbW9kZWxfbTMycl9kX2FuZCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9BTkQzLCBtb2RlbF9tMzJyX2RfYW5kMywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9PUiwgbW9kZWxfbTMycl9kX29yLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX09SMywgbW9kZWxfbTMycl9kX29yMywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9YT1IsIG1vZGVsX20zMnJfZF94b3IsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fWE9SMywgbW9kZWxfbTMycl9kX3hvcjMsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fQURESSwgbW9kZWxfbTMycl9kX2FkZGksIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fQUREViwgbW9kZWxfbTMycl9kX2FkZHYsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fQUREVjMsIG1vZGVsX20zMnJfZF9hZGR2MywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9BRERYLCBtb2RlbF9tMzJyX2RfYWRkeCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9CQzgsIG1vZGVsX20zMnJfZF9iYzgsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9CQzI0LCBtb2RlbF9tMzJyX2RfYmMyNCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ1RJLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0JFUSwgbW9kZWxfbTMycl9kX2JlcSwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ1RJLCAxLCAxIH0sIHsgKGludCkgVU5JVF9NMzJSX0RfVV9DTVAsIDEsIDAgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fQkVRWiwgbW9kZWxfbTMycl9kX2JlcXosIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0NUSSwgMSwgMSB9LCB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ01QLCAxLCAwIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0JHRVosIG1vZGVsX20zMnJfZF9iZ2V6LCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9DVEksIDEsIDEgfSwgeyAoaW50KSBVTklUX00zMlJfRF9VX0NNUCwgMSwgMCB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9CR1RaLCBtb2RlbF9tMzJyX2RfYmd0eiwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ1RJLCAxLCAxIH0sIHsgKGludCkgVU5JVF9NMzJSX0RfVV9DTVAsIDEsIDAgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fQkxFWiwgbW9kZWxfbTMycl9kX2JsZXosIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0NUSSwgMSwgMSB9LCB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ01QLCAxLCAwIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0JMVFosIG1vZGVsX20zMnJfZF9ibHR6LCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9DVEksIDEsIDEgfSwgeyAoaW50KSBVTklUX00zMlJfRF9VX0NNUCwgMSwgMCB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9CTkVaLCBtb2RlbF9tMzJyX2RfYm5leiwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ1RJLCAxLCAxIH0sIHsgKGludCkgVU5JVF9NMzJSX0RfVV9DTVAsIDEsIDAgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fQkw4LCBtb2RlbF9tMzJyX2RfYmw4LCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9DVEksIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fQkwyNCwgbW9kZWxfbTMycl9kX2JsMjQsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9CTkM4LCBtb2RlbF9tMzJyX2RfYm5jOCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ1RJLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0JOQzI0LCBtb2RlbF9tMzJyX2RfYm5jMjQsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0NUSSwgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9CTkUsIG1vZGVsX20zMnJfZF9ibmUsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0NUSSwgMSwgMSB9LCB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ01QLCAxLCAwIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0JSQTgsIG1vZGVsX20zMnJfZF9icmE4LCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9DVEksIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fQlJBMjQsIG1vZGVsX20zMnJfZF9icmEyNCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ1RJLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0NNUCwgbW9kZWxfbTMycl9kX2NtcCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ01QLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0NNUEksIG1vZGVsX20zMnJfZF9jbXBpLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9DTVAsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fQ01QVSwgbW9kZWxfbTMycl9kX2NtcHUsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0NNUCwgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9DTVBVSSwgbW9kZWxfbTMycl9kX2NtcHVpLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9DTVAsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fRElWLCBtb2RlbF9tMzJyX2RfZGl2LCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAzNyB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9ESVZVLCBtb2RlbF9tMzJyX2RfZGl2dSwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMzcgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fUkVNLCBtb2RlbF9tMzJyX2RfcmVtLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAzNyB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9SRU1VLCBtb2RlbF9tMzJyX2RfcmVtdSwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMzcgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fSkwsIG1vZGVsX20zMnJfZF9qbCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ1RJLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0pNUCwgbW9kZWxfbTMycl9kX2ptcCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfQ1RJLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0xELCBtb2RlbF9tMzJyX2RfbGQsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0xPQUQsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTERfRCwgbW9kZWxfbTMycl9kX2xkX2QsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0xPQUQsIDEsIDIgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTERCLCBtb2RlbF9tMzJyX2RfbGRiLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9MT0FELCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0xEQl9ELCBtb2RlbF9tMzJyX2RfbGRiX2QsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0xPQUQsIDEsIDIgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTERILCBtb2RlbF9tMzJyX2RfbGRoLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9MT0FELCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0xESF9ELCBtb2RlbF9tMzJyX2RfbGRoX2QsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0xPQUQsIDEsIDIgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTERVQiwgbW9kZWxfbTMycl9kX2xkdWIsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0xPQUQsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTERVQl9ELCBtb2RlbF9tMzJyX2RfbGR1Yl9kLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9MT0FELCAxLCAyIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0xEVUgsIG1vZGVsX20zMnJfZF9sZHVoLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9MT0FELCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0xEVUhfRCwgbW9kZWxfbTMycl9kX2xkdWhfZCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfTE9BRCwgMSwgMiB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9MRF9QTFVTLCBtb2RlbF9tMzJyX2RfbGRfcGx1cywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfTE9BRCwgMSwgMSB9LCB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMCB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9MRDI0LCBtb2RlbF9tMzJyX2RfbGQyNCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9MREk4LCBtb2RlbF9tMzJyX2RfbGRpOCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9MREkxNiwgbW9kZWxfbTMycl9kX2xkaTE2LCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0xPQ0ssIG1vZGVsX20zMnJfZF9sb2NrLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9MT0FELCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX01BQ0hJLCBtb2RlbF9tMzJyX2RfbWFjaGksIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX01BQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9NQUNMTywgbW9kZWxfbTMycl9kX21hY2xvLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9NQUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTUFDV0hJLCBtb2RlbF9tMzJyX2RfbWFjd2hpLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9NQUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTUFDV0xPLCBtb2RlbF9tMzJyX2RfbWFjd2xvLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9NQUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTVVMLCBtb2RlbF9tMzJyX2RfbXVsLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCA0IH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX01VTEhJLCBtb2RlbF9tMzJyX2RfbXVsaGksIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX01BQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9NVUxMTywgbW9kZWxfbTMycl9kX211bGxvLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9NQUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTVVMV0hJLCBtb2RlbF9tMzJyX2RfbXVsd2hpLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9NQUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTVVMV0xPLCBtb2RlbF9tMzJyX2RfbXVsd2xvLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9NQUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTVYsIG1vZGVsX20zMnJfZF9tdiwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9NVkZBQ0hJLCBtb2RlbF9tMzJyX2RfbXZmYWNoaSwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMiB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9NVkZBQ0xPLCBtb2RlbF9tMzJyX2RfbXZmYWNsbywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMiB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9NVkZBQ01JLCBtb2RlbF9tMzJyX2RfbXZmYWNtaSwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMiB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9NVkZDLCBtb2RlbF9tMzJyX2RfbXZmYywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9NVlRBQ0hJLCBtb2RlbF9tMzJyX2RfbXZ0YWNoaSwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9NVlRBQ0xPLCBtb2RlbF9tMzJyX2RfbXZ0YWNsbywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9NVlRDLCBtb2RlbF9tMzJyX2RfbXZ0YywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9ORUcsIG1vZGVsX20zMnJfZF9uZWcsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTk9QLCBtb2RlbF9tMzJyX2Rfbm9wLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAwIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX05PVCwgbW9kZWxfbTMycl9kX25vdCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9SQUMsIG1vZGVsX20zMnJfZF9yYWMsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX01BQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9SQUNILCBtb2RlbF9tMzJyX2RfcmFjaCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfTUFDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1JURSwgbW9kZWxfbTMycl9kX3J0ZSwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9TRVRILCBtb2RlbF9tMzJyX2Rfc2V0aCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9TTEwsIG1vZGVsX20zMnJfZF9zbGwsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fU0xMMywgbW9kZWxfbTMycl9kX3NsbDMsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fU0xMSSwgbW9kZWxfbTMycl9kX3NsbGksIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fU1JBLCBtb2RlbF9tMzJyX2Rfc3JhLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1NSQTMsIG1vZGVsX20zMnJfZF9zcmEzLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1NSQUksIG1vZGVsX20zMnJfZF9zcmFpLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1NSTCwgbW9kZWxfbTMycl9kX3NybCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9TUkwzLCBtb2RlbF9tMzJyX2Rfc3JsMywgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9TUkxJLCBtb2RlbF9tMzJyX2Rfc3JsaSwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9TVCwgbW9kZWxfbTMycl9kX3N0LCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9TVE9SRSwgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9TVF9ELCBtb2RlbF9tMzJyX2Rfc3RfZCwgeyB7IChpbnQpIFVOSVRfTTMyUl9EX1VfU1RPUkUsIDEsIDIgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fU1RCLCBtb2RlbF9tMzJyX2Rfc3RiLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9TVE9SRSwgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9TVEJfRCwgbW9kZWxfbTMycl9kX3N0Yl9kLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9TVE9SRSwgMSwgMiB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9TVEgsIG1vZGVsX20zMnJfZF9zdGgsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX1NUT1JFLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1NUSF9ELCBtb2RlbF9tMzJyX2Rfc3RoX2QsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX1NUT1JFLCAxLCAyIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1NUX1BMVVMsIG1vZGVsX20zMnJfZF9zdF9wbHVzLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9TVE9SRSwgMSwgMSB9LCB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMCB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9TVF9NSU5VUywgbW9kZWxfbTMycl9kX3N0X21pbnVzLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9TVE9SRSwgMSwgMSB9LCB7IChpbnQpIFVOSVRfTTMyUl9EX1VfRVhFQywgMSwgMCB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9TVUIsIG1vZGVsX20zMnJfZF9zdWIsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fU1VCViwgbW9kZWxfbTMycl9kX3N1YnYsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fU1VCWCwgbW9kZWxfbTMycl9kX3N1YngsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fVFJBUCwgbW9kZWxfbTMycl9kX3RyYXAsIHsgeyAoaW50KSBVTklUX00zMlJfRF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fVU5MT0NLLCBtb2RlbF9tMzJyX2RfdW5sb2NrLCB7IHsgKGludCkgVU5JVF9NMzJSX0RfVV9MT0FELCAxLCAxIH0gfSB9LAorfTsKKworLyogTW9kZWwgdGltaW5nIGRhdGEgZm9yIGB0ZXN0Jy4gICovCisKK3N0YXRpYyBjb25zdCBJTlNOX1RJTUlORyB0ZXN0X3RpbWluZ1tdID0geworICB7IE0zMlJCRl9JTlNOX1hfSU5WQUxJRCwgMCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fWF9BRlRFUiwgMCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fWF9CRUZPUkUsIDAsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1hfQ1RJX0NIQUlOLCAwLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9YX0NIQUlOLCAwLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9YX0JFR0lOLCAwLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9BREQsIG1vZGVsX3Rlc3RfYWRkLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9BREQzLCBtb2RlbF90ZXN0X2FkZDMsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0FORCwgbW9kZWxfdGVzdF9hbmQsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0FORDMsIG1vZGVsX3Rlc3RfYW5kMywgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fT1IsIG1vZGVsX3Rlc3Rfb3IsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX09SMywgbW9kZWxfdGVzdF9vcjMsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1hPUiwgbW9kZWxfdGVzdF94b3IsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1hPUjMsIG1vZGVsX3Rlc3RfeG9yMywgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fQURESSwgbW9kZWxfdGVzdF9hZGRpLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9BRERWLCBtb2RlbF90ZXN0X2FkZHYsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0FERFYzLCBtb2RlbF90ZXN0X2FkZHYzLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9BRERYLCBtb2RlbF90ZXN0X2FkZHgsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0JDOCwgbW9kZWxfdGVzdF9iYzgsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0JDMjQsIG1vZGVsX3Rlc3RfYmMyNCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fQkVRLCBtb2RlbF90ZXN0X2JlcSwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fQkVRWiwgbW9kZWxfdGVzdF9iZXF6LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9CR0VaLCBtb2RlbF90ZXN0X2JnZXosIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0JHVFosIG1vZGVsX3Rlc3RfYmd0eiwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fQkxFWiwgbW9kZWxfdGVzdF9ibGV6LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9CTFRaLCBtb2RlbF90ZXN0X2JsdHosIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0JORVosIG1vZGVsX3Rlc3RfYm5leiwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fQkw4LCBtb2RlbF90ZXN0X2JsOCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fQkwyNCwgbW9kZWxfdGVzdF9ibDI0LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9CTkM4LCBtb2RlbF90ZXN0X2JuYzgsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0JOQzI0LCBtb2RlbF90ZXN0X2JuYzI0LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9CTkUsIG1vZGVsX3Rlc3RfYm5lLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9CUkE4LCBtb2RlbF90ZXN0X2JyYTgsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0JSQTI0LCBtb2RlbF90ZXN0X2JyYTI0LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9DTVAsIG1vZGVsX3Rlc3RfY21wLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9DTVBJLCBtb2RlbF90ZXN0X2NtcGksIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0NNUFUsIG1vZGVsX3Rlc3RfY21wdSwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fQ01QVUksIG1vZGVsX3Rlc3RfY21wdWksIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0RJViwgbW9kZWxfdGVzdF9kaXYsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0RJVlUsIG1vZGVsX3Rlc3RfZGl2dSwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fUkVNLCBtb2RlbF90ZXN0X3JlbSwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fUkVNVSwgbW9kZWxfdGVzdF9yZW11LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9KTCwgbW9kZWxfdGVzdF9qbCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fSk1QLCBtb2RlbF90ZXN0X2ptcCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTEQsIG1vZGVsX3Rlc3RfbGQsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0xEX0QsIG1vZGVsX3Rlc3RfbGRfZCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTERCLCBtb2RlbF90ZXN0X2xkYiwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTERCX0QsIG1vZGVsX3Rlc3RfbGRiX2QsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0xESCwgbW9kZWxfdGVzdF9sZGgsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0xESF9ELCBtb2RlbF90ZXN0X2xkaF9kLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9MRFVCLCBtb2RlbF90ZXN0X2xkdWIsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0xEVUJfRCwgbW9kZWxfdGVzdF9sZHViX2QsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0xEVUgsIG1vZGVsX3Rlc3RfbGR1aCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTERVSF9ELCBtb2RlbF90ZXN0X2xkdWhfZCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTERfUExVUywgbW9kZWxfdGVzdF9sZF9wbHVzLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9MRDI0LCBtb2RlbF90ZXN0X2xkMjQsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0xESTgsIG1vZGVsX3Rlc3RfbGRpOCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTERJMTYsIG1vZGVsX3Rlc3RfbGRpMTYsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX0xPQ0ssIG1vZGVsX3Rlc3RfbG9jaywgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTUFDSEksIG1vZGVsX3Rlc3RfbWFjaGksIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX01BQ0xPLCBtb2RlbF90ZXN0X21hY2xvLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9NQUNXSEksIG1vZGVsX3Rlc3RfbWFjd2hpLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9NQUNXTE8sIG1vZGVsX3Rlc3RfbWFjd2xvLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9NVUwsIG1vZGVsX3Rlc3RfbXVsLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9NVUxISSwgbW9kZWxfdGVzdF9tdWxoaSwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTVVMTE8sIG1vZGVsX3Rlc3RfbXVsbG8sIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX01VTFdISSwgbW9kZWxfdGVzdF9tdWx3aGksIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX01VTFdMTywgbW9kZWxfdGVzdF9tdWx3bG8sIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX01WLCBtb2RlbF90ZXN0X212LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9NVkZBQ0hJLCBtb2RlbF90ZXN0X212ZmFjaGksIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX01WRkFDTE8sIG1vZGVsX3Rlc3RfbXZmYWNsbywgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTVZGQUNNSSwgbW9kZWxfdGVzdF9tdmZhY21pLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9NVkZDLCBtb2RlbF90ZXN0X212ZmMsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX01WVEFDSEksIG1vZGVsX3Rlc3RfbXZ0YWNoaSwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fTVZUQUNMTywgbW9kZWxfdGVzdF9tdnRhY2xvLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9NVlRDLCBtb2RlbF90ZXN0X212dGMsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX05FRywgbW9kZWxfdGVzdF9uZWcsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX05PUCwgbW9kZWxfdGVzdF9ub3AsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX05PVCwgbW9kZWxfdGVzdF9ub3QsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1JBQywgbW9kZWxfdGVzdF9yYWMsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1JBQ0gsIG1vZGVsX3Rlc3RfcmFjaCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fUlRFLCBtb2RlbF90ZXN0X3J0ZSwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fU0VUSCwgbW9kZWxfdGVzdF9zZXRoLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9TTEwsIG1vZGVsX3Rlc3Rfc2xsLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9TTEwzLCBtb2RlbF90ZXN0X3NsbDMsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1NMTEksIG1vZGVsX3Rlc3Rfc2xsaSwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fU1JBLCBtb2RlbF90ZXN0X3NyYSwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fU1JBMywgbW9kZWxfdGVzdF9zcmEzLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9TUkFJLCBtb2RlbF90ZXN0X3NyYWksIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1NSTCwgbW9kZWxfdGVzdF9zcmwsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1NSTDMsIG1vZGVsX3Rlc3Rfc3JsMywgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fU1JMSSwgbW9kZWxfdGVzdF9zcmxpLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9TVCwgbW9kZWxfdGVzdF9zdCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fU1RfRCwgbW9kZWxfdGVzdF9zdF9kLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9TVEIsIG1vZGVsX3Rlc3Rfc3RiLCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9TVEJfRCwgbW9kZWxfdGVzdF9zdGJfZCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fU1RILCBtb2RlbF90ZXN0X3N0aCwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fU1RIX0QsIG1vZGVsX3Rlc3Rfc3RoX2QsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1NUX1BMVVMsIG1vZGVsX3Rlc3Rfc3RfcGx1cywgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fU1RfTUlOVVMsIG1vZGVsX3Rlc3Rfc3RfbWludXMsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1NVQiwgbW9kZWxfdGVzdF9zdWIsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1NVQlYsIG1vZGVsX3Rlc3Rfc3VidiwgeyB7IChpbnQpIFVOSVRfVEVTVF9VX0VYRUMsIDEsIDEgfSB9IH0sCisgIHsgTTMyUkJGX0lOU05fU1VCWCwgbW9kZWxfdGVzdF9zdWJ4LCB7IHsgKGludCkgVU5JVF9URVNUX1VfRVhFQywgMSwgMSB9IH0gfSwKKyAgeyBNMzJSQkZfSU5TTl9UUkFQLCBtb2RlbF90ZXN0X3RyYXAsIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorICB7IE0zMlJCRl9JTlNOX1VOTE9DSywgbW9kZWxfdGVzdF91bmxvY2ssIHsgeyAoaW50KSBVTklUX1RFU1RfVV9FWEVDLCAxLCAxIH0gfSB9LAorfTsKKworI2VuZGlmIC8qIFdJVEhfUFJPRklMRV9NT0RFTF9QICovCisKK3N0YXRpYyB2b2lkCittMzJyX2RfbW9kZWxfaW5pdCAoU0lNX0NQVSAqY3B1KQoreworICBDUFVfTU9ERUxfREFUQSAoY3B1KSA9ICh2b2lkICopIHphbGxvYyAoc2l6ZW9mIChNT0RFTF9NMzJSX0RfREFUQSkpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9tb2RlbF9pbml0IChTSU1fQ1BVICpjcHUpCit7CisgIENQVV9NT0RFTF9EQVRBIChjcHUpID0gKHZvaWQgKikgemFsbG9jIChzaXplb2YgKE1PREVMX1RFU1RfREFUQSkpOworfQorCisjaWYgV0lUSF9QUk9GSUxFX01PREVMX1AKKyNkZWZpbmUgVElNSU5HX0RBVEEodGQpIHRkCisjZWxzZQorI2RlZmluZSBUSU1JTkdfREFUQSh0ZCkgMAorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBNT0RFTCBtMzJyX21vZGVsc1tdID0KK3sKKyAgeyAibTMyci9kIiwgJiBtMzJyX21hY2gsIE1PREVMX00zMlJfRCwgVElNSU5HX0RBVEEgKCYgbTMycl9kX3RpbWluZ1swXSksIG0zMnJfZF9tb2RlbF9pbml0IH0sCisgIHsgInRlc3QiLCAmIG0zMnJfbWFjaCwgTU9ERUxfVEVTVCwgVElNSU5HX0RBVEEgKCYgdGVzdF90aW1pbmdbMF0pLCB0ZXN0X21vZGVsX2luaXQgfSwKKyAgeyAwIH0KK307CisKKy8qIFRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgY3B1J3MgaW1wbGVtZW50YXRpb24uICAqLworCitzdGF0aWMgY29uc3QgTUFDSF9JTVBfUFJPUEVSVElFUyBtMzJyYmZfaW1wX3Byb3BlcnRpZXMgPQoreworICBzaXplb2YgKFNJTV9DUFUpLAorI2lmIFdJVEhfU0NBQ0hFCisgIHNpemVvZiAoU0NBQ0hFKQorI2Vsc2UKKyAgMAorI2VuZGlmCit9OworCisKK3N0YXRpYyB2b2lkCittMzJyYmZfcHJlcGFyZV9ydW4gKFNJTV9DUFUgKmNwdSkKK3sKKyAgaWYgKENQVV9JREVTQyAoY3B1KSA9PSBOVUxMKQorICAgIG0zMnJiZl9pbml0X2lkZXNjX3RhYmxlIChjcHUpOworfQorCitzdGF0aWMgY29uc3QgQ0dFTl9JTlNOICoKK20zMnJiZl9nZXRfaWRhdGEgKFNJTV9DUFUgKmNwdSwgaW50IGludW0pCit7CisgIHJldHVybiBDUFVfSURFU0MgKGNwdSkgW2ludW1dLmlkYXRhOworfQorCitzdGF0aWMgdm9pZAorbTMycl9pbml0X2NwdSAoU0lNX0NQVSAqY3B1KQoreworICBDUFVfUkVHX0ZFVENIIChjcHUpID0gbTMycmJmX2ZldGNoX3JlZ2lzdGVyOworICBDUFVfUkVHX1NUT1JFIChjcHUpID0gbTMycmJmX3N0b3JlX3JlZ2lzdGVyOworICBDUFVfUENfRkVUQ0ggKGNwdSkgPSBtMzJyYmZfaF9wY19nZXQ7CisgIENQVV9QQ19TVE9SRSAoY3B1KSA9IG0zMnJiZl9oX3BjX3NldDsKKyAgQ1BVX0dFVF9JREFUQSAoY3B1KSA9IG0zMnJiZl9nZXRfaWRhdGE7CisgIENQVV9NQVhfSU5TTlMgKGNwdSkgPSBNMzJSQkZfSU5TTl9NQVg7CisgIENQVV9JTlNOX05BTUUgKGNwdSkgPSBjZ2VuX2luc25fbmFtZTsKKyAgQ1BVX0ZVTExfRU5HSU5FX0ZOIChjcHUpID0gbTMycmJmX2VuZ2luZV9ydW5fZnVsbDsKKyNpZiBXSVRIX0ZBU1QKKyAgQ1BVX0ZBU1RfRU5HSU5FX0ZOIChjcHUpID0gbTMycmJmX2VuZ2luZV9ydW5fZmFzdDsKKyNlbHNlCisgIENQVV9GQVNUX0VOR0lORV9GTiAoY3B1KSA9IG0zMnJiZl9lbmdpbmVfcnVuX2Z1bGw7CisjZW5kaWYKK30KKworY29uc3QgTUFDSCBtMzJyX21hY2ggPQoreworICAibTMyciIsICJtMzJyIiwKKyAgMzIsIDMyLCAmIG0zMnJfbW9kZWxzWzBdLCAmIG0zMnJiZl9pbXBfcHJvcGVydGllcywKKyAgbTMycl9pbml0X2NwdSwKKyAgbTMycmJmX3ByZXBhcmVfcnVuCit9OworCmRpZmYgLS1naXQgYS9zaW0vbTMyci9zZW0tc3dpdGNoLmMgYi9zaW0vbTMyci9zZW0tc3dpdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyOTA3NAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tMzJyL3NlbS1zd2l0Y2guYwpAQCAtMCwwICsxLDI1MDMgQEAKKy8qIFNpbXVsYXRvciBpbnN0cnVjdGlvbiBzZW1hbnRpY3MgZm9yIG0zMnJiZi4KKworVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KKworQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIFNpbXVsYXRvcnMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworKi8KKworI2lmZGVmIERFRklORV9MQUJFTFMKKworICAvKiBUaGUgbGFiZWxzIGhhdmUgdGhlIGNhc2UgdGhleSBoYXZlIGJlY2F1c2UgdGhlIGVudW0gb2YgaW5zbiB0eXBlcworICAgICBpcyBhbGwgdXBwZXJjYXNlIGFuZCBpbiB0aGUgbm9uLXN0ZGMgY2FzZSB0aGUgaW5zbiBzeW1ib2wgaXMgYnVpbHQKKyAgICAgaW50byB0aGUgZW51bSBuYW1lLiAgKi8KKworICBzdGF0aWMgc3RydWN0IHsKKyAgICBpbnQgaW5kZXg7CisgICAgdm9pZCAqbGFiZWw7CisgIH0gbGFiZWxzW10gPSB7CisgICAgeyBNMzJSQkZfSU5TTl9YX0lOVkFMSUQsICYmIGNhc2Vfc2VtX0lOU05fWF9JTlZBTElEIH0sCisgICAgeyBNMzJSQkZfSU5TTl9YX0FGVEVSLCAmJiBjYXNlX3NlbV9JTlNOX1hfQUZURVIgfSwKKyAgICB7IE0zMlJCRl9JTlNOX1hfQkVGT1JFLCAmJiBjYXNlX3NlbV9JTlNOX1hfQkVGT1JFIH0sCisgICAgeyBNMzJSQkZfSU5TTl9YX0NUSV9DSEFJTiwgJiYgY2FzZV9zZW1fSU5TTl9YX0NUSV9DSEFJTiB9LAorICAgIHsgTTMyUkJGX0lOU05fWF9DSEFJTiwgJiYgY2FzZV9zZW1fSU5TTl9YX0NIQUlOIH0sCisgICAgeyBNMzJSQkZfSU5TTl9YX0JFR0lOLCAmJiBjYXNlX3NlbV9JTlNOX1hfQkVHSU4gfSwKKyAgICB7IE0zMlJCRl9JTlNOX0FERCwgJiYgY2FzZV9zZW1fSU5TTl9BREQgfSwKKyAgICB7IE0zMlJCRl9JTlNOX0FERDMsICYmIGNhc2Vfc2VtX0lOU05fQUREMyB9LAorICAgIHsgTTMyUkJGX0lOU05fQU5ELCAmJiBjYXNlX3NlbV9JTlNOX0FORCB9LAorICAgIHsgTTMyUkJGX0lOU05fQU5EMywgJiYgY2FzZV9zZW1fSU5TTl9BTkQzIH0sCisgICAgeyBNMzJSQkZfSU5TTl9PUiwgJiYgY2FzZV9zZW1fSU5TTl9PUiB9LAorICAgIHsgTTMyUkJGX0lOU05fT1IzLCAmJiBjYXNlX3NlbV9JTlNOX09SMyB9LAorICAgIHsgTTMyUkJGX0lOU05fWE9SLCAmJiBjYXNlX3NlbV9JTlNOX1hPUiB9LAorICAgIHsgTTMyUkJGX0lOU05fWE9SMywgJiYgY2FzZV9zZW1fSU5TTl9YT1IzIH0sCisgICAgeyBNMzJSQkZfSU5TTl9BRERJLCAmJiBjYXNlX3NlbV9JTlNOX0FEREkgfSwKKyAgICB7IE0zMlJCRl9JTlNOX0FERFYsICYmIGNhc2Vfc2VtX0lOU05fQUREViB9LAorICAgIHsgTTMyUkJGX0lOU05fQUREVjMsICYmIGNhc2Vfc2VtX0lOU05fQUREVjMgfSwKKyAgICB7IE0zMlJCRl9JTlNOX0FERFgsICYmIGNhc2Vfc2VtX0lOU05fQUREWCB9LAorICAgIHsgTTMyUkJGX0lOU05fQkM4LCAmJiBjYXNlX3NlbV9JTlNOX0JDOCB9LAorICAgIHsgTTMyUkJGX0lOU05fQkMyNCwgJiYgY2FzZV9zZW1fSU5TTl9CQzI0IH0sCisgICAgeyBNMzJSQkZfSU5TTl9CRVEsICYmIGNhc2Vfc2VtX0lOU05fQkVRIH0sCisgICAgeyBNMzJSQkZfSU5TTl9CRVFaLCAmJiBjYXNlX3NlbV9JTlNOX0JFUVogfSwKKyAgICB7IE0zMlJCRl9JTlNOX0JHRVosICYmIGNhc2Vfc2VtX0lOU05fQkdFWiB9LAorICAgIHsgTTMyUkJGX0lOU05fQkdUWiwgJiYgY2FzZV9zZW1fSU5TTl9CR1RaIH0sCisgICAgeyBNMzJSQkZfSU5TTl9CTEVaLCAmJiBjYXNlX3NlbV9JTlNOX0JMRVogfSwKKyAgICB7IE0zMlJCRl9JTlNOX0JMVFosICYmIGNhc2Vfc2VtX0lOU05fQkxUWiB9LAorICAgIHsgTTMyUkJGX0lOU05fQk5FWiwgJiYgY2FzZV9zZW1fSU5TTl9CTkVaIH0sCisgICAgeyBNMzJSQkZfSU5TTl9CTDgsICYmIGNhc2Vfc2VtX0lOU05fQkw4IH0sCisgICAgeyBNMzJSQkZfSU5TTl9CTDI0LCAmJiBjYXNlX3NlbV9JTlNOX0JMMjQgfSwKKyAgICB7IE0zMlJCRl9JTlNOX0JOQzgsICYmIGNhc2Vfc2VtX0lOU05fQk5DOCB9LAorICAgIHsgTTMyUkJGX0lOU05fQk5DMjQsICYmIGNhc2Vfc2VtX0lOU05fQk5DMjQgfSwKKyAgICB7IE0zMlJCRl9JTlNOX0JORSwgJiYgY2FzZV9zZW1fSU5TTl9CTkUgfSwKKyAgICB7IE0zMlJCRl9JTlNOX0JSQTgsICYmIGNhc2Vfc2VtX0lOU05fQlJBOCB9LAorICAgIHsgTTMyUkJGX0lOU05fQlJBMjQsICYmIGNhc2Vfc2VtX0lOU05fQlJBMjQgfSwKKyAgICB7IE0zMlJCRl9JTlNOX0NNUCwgJiYgY2FzZV9zZW1fSU5TTl9DTVAgfSwKKyAgICB7IE0zMlJCRl9JTlNOX0NNUEksICYmIGNhc2Vfc2VtX0lOU05fQ01QSSB9LAorICAgIHsgTTMyUkJGX0lOU05fQ01QVSwgJiYgY2FzZV9zZW1fSU5TTl9DTVBVIH0sCisgICAgeyBNMzJSQkZfSU5TTl9DTVBVSSwgJiYgY2FzZV9zZW1fSU5TTl9DTVBVSSB9LAorICAgIHsgTTMyUkJGX0lOU05fRElWLCAmJiBjYXNlX3NlbV9JTlNOX0RJViB9LAorICAgIHsgTTMyUkJGX0lOU05fRElWVSwgJiYgY2FzZV9zZW1fSU5TTl9ESVZVIH0sCisgICAgeyBNMzJSQkZfSU5TTl9SRU0sICYmIGNhc2Vfc2VtX0lOU05fUkVNIH0sCisgICAgeyBNMzJSQkZfSU5TTl9SRU1VLCAmJiBjYXNlX3NlbV9JTlNOX1JFTVUgfSwKKyAgICB7IE0zMlJCRl9JTlNOX0pMLCAmJiBjYXNlX3NlbV9JTlNOX0pMIH0sCisgICAgeyBNMzJSQkZfSU5TTl9KTVAsICYmIGNhc2Vfc2VtX0lOU05fSk1QIH0sCisgICAgeyBNMzJSQkZfSU5TTl9MRCwgJiYgY2FzZV9zZW1fSU5TTl9MRCB9LAorICAgIHsgTTMyUkJGX0lOU05fTERfRCwgJiYgY2FzZV9zZW1fSU5TTl9MRF9EIH0sCisgICAgeyBNMzJSQkZfSU5TTl9MREIsICYmIGNhc2Vfc2VtX0lOU05fTERCIH0sCisgICAgeyBNMzJSQkZfSU5TTl9MREJfRCwgJiYgY2FzZV9zZW1fSU5TTl9MREJfRCB9LAorICAgIHsgTTMyUkJGX0lOU05fTERILCAmJiBjYXNlX3NlbV9JTlNOX0xESCB9LAorICAgIHsgTTMyUkJGX0lOU05fTERIX0QsICYmIGNhc2Vfc2VtX0lOU05fTERIX0QgfSwKKyAgICB7IE0zMlJCRl9JTlNOX0xEVUIsICYmIGNhc2Vfc2VtX0lOU05fTERVQiB9LAorICAgIHsgTTMyUkJGX0lOU05fTERVQl9ELCAmJiBjYXNlX3NlbV9JTlNOX0xEVUJfRCB9LAorICAgIHsgTTMyUkJGX0lOU05fTERVSCwgJiYgY2FzZV9zZW1fSU5TTl9MRFVIIH0sCisgICAgeyBNMzJSQkZfSU5TTl9MRFVIX0QsICYmIGNhc2Vfc2VtX0lOU05fTERVSF9EIH0sCisgICAgeyBNMzJSQkZfSU5TTl9MRF9QTFVTLCAmJiBjYXNlX3NlbV9JTlNOX0xEX1BMVVMgfSwKKyAgICB7IE0zMlJCRl9JTlNOX0xEMjQsICYmIGNhc2Vfc2VtX0lOU05fTEQyNCB9LAorICAgIHsgTTMyUkJGX0lOU05fTERJOCwgJiYgY2FzZV9zZW1fSU5TTl9MREk4IH0sCisgICAgeyBNMzJSQkZfSU5TTl9MREkxNiwgJiYgY2FzZV9zZW1fSU5TTl9MREkxNiB9LAorICAgIHsgTTMyUkJGX0lOU05fTE9DSywgJiYgY2FzZV9zZW1fSU5TTl9MT0NLIH0sCisgICAgeyBNMzJSQkZfSU5TTl9NQUNISSwgJiYgY2FzZV9zZW1fSU5TTl9NQUNISSB9LAorICAgIHsgTTMyUkJGX0lOU05fTUFDTE8sICYmIGNhc2Vfc2VtX0lOU05fTUFDTE8gfSwKKyAgICB7IE0zMlJCRl9JTlNOX01BQ1dISSwgJiYgY2FzZV9zZW1fSU5TTl9NQUNXSEkgfSwKKyAgICB7IE0zMlJCRl9JTlNOX01BQ1dMTywgJiYgY2FzZV9zZW1fSU5TTl9NQUNXTE8gfSwKKyAgICB7IE0zMlJCRl9JTlNOX01VTCwgJiYgY2FzZV9zZW1fSU5TTl9NVUwgfSwKKyAgICB7IE0zMlJCRl9JTlNOX01VTEhJLCAmJiBjYXNlX3NlbV9JTlNOX01VTEhJIH0sCisgICAgeyBNMzJSQkZfSU5TTl9NVUxMTywgJiYgY2FzZV9zZW1fSU5TTl9NVUxMTyB9LAorICAgIHsgTTMyUkJGX0lOU05fTVVMV0hJLCAmJiBjYXNlX3NlbV9JTlNOX01VTFdISSB9LAorICAgIHsgTTMyUkJGX0lOU05fTVVMV0xPLCAmJiBjYXNlX3NlbV9JTlNOX01VTFdMTyB9LAorICAgIHsgTTMyUkJGX0lOU05fTVYsICYmIGNhc2Vfc2VtX0lOU05fTVYgfSwKKyAgICB7IE0zMlJCRl9JTlNOX01WRkFDSEksICYmIGNhc2Vfc2VtX0lOU05fTVZGQUNISSB9LAorICAgIHsgTTMyUkJGX0lOU05fTVZGQUNMTywgJiYgY2FzZV9zZW1fSU5TTl9NVkZBQ0xPIH0sCisgICAgeyBNMzJSQkZfSU5TTl9NVkZBQ01JLCAmJiBjYXNlX3NlbV9JTlNOX01WRkFDTUkgfSwKKyAgICB7IE0zMlJCRl9JTlNOX01WRkMsICYmIGNhc2Vfc2VtX0lOU05fTVZGQyB9LAorICAgIHsgTTMyUkJGX0lOU05fTVZUQUNISSwgJiYgY2FzZV9zZW1fSU5TTl9NVlRBQ0hJIH0sCisgICAgeyBNMzJSQkZfSU5TTl9NVlRBQ0xPLCAmJiBjYXNlX3NlbV9JTlNOX01WVEFDTE8gfSwKKyAgICB7IE0zMlJCRl9JTlNOX01WVEMsICYmIGNhc2Vfc2VtX0lOU05fTVZUQyB9LAorICAgIHsgTTMyUkJGX0lOU05fTkVHLCAmJiBjYXNlX3NlbV9JTlNOX05FRyB9LAorICAgIHsgTTMyUkJGX0lOU05fTk9QLCAmJiBjYXNlX3NlbV9JTlNOX05PUCB9LAorICAgIHsgTTMyUkJGX0lOU05fTk9ULCAmJiBjYXNlX3NlbV9JTlNOX05PVCB9LAorICAgIHsgTTMyUkJGX0lOU05fUkFDLCAmJiBjYXNlX3NlbV9JTlNOX1JBQyB9LAorICAgIHsgTTMyUkJGX0lOU05fUkFDSCwgJiYgY2FzZV9zZW1fSU5TTl9SQUNIIH0sCisgICAgeyBNMzJSQkZfSU5TTl9SVEUsICYmIGNhc2Vfc2VtX0lOU05fUlRFIH0sCisgICAgeyBNMzJSQkZfSU5TTl9TRVRILCAmJiBjYXNlX3NlbV9JTlNOX1NFVEggfSwKKyAgICB7IE0zMlJCRl9JTlNOX1NMTCwgJiYgY2FzZV9zZW1fSU5TTl9TTEwgfSwKKyAgICB7IE0zMlJCRl9JTlNOX1NMTDMsICYmIGNhc2Vfc2VtX0lOU05fU0xMMyB9LAorICAgIHsgTTMyUkJGX0lOU05fU0xMSSwgJiYgY2FzZV9zZW1fSU5TTl9TTExJIH0sCisgICAgeyBNMzJSQkZfSU5TTl9TUkEsICYmIGNhc2Vfc2VtX0lOU05fU1JBIH0sCisgICAgeyBNMzJSQkZfSU5TTl9TUkEzLCAmJiBjYXNlX3NlbV9JTlNOX1NSQTMgfSwKKyAgICB7IE0zMlJCRl9JTlNOX1NSQUksICYmIGNhc2Vfc2VtX0lOU05fU1JBSSB9LAorICAgIHsgTTMyUkJGX0lOU05fU1JMLCAmJiBjYXNlX3NlbV9JTlNOX1NSTCB9LAorICAgIHsgTTMyUkJGX0lOU05fU1JMMywgJiYgY2FzZV9zZW1fSU5TTl9TUkwzIH0sCisgICAgeyBNMzJSQkZfSU5TTl9TUkxJLCAmJiBjYXNlX3NlbV9JTlNOX1NSTEkgfSwKKyAgICB7IE0zMlJCRl9JTlNOX1NULCAmJiBjYXNlX3NlbV9JTlNOX1NUIH0sCisgICAgeyBNMzJSQkZfSU5TTl9TVF9ELCAmJiBjYXNlX3NlbV9JTlNOX1NUX0QgfSwKKyAgICB7IE0zMlJCRl9JTlNOX1NUQiwgJiYgY2FzZV9zZW1fSU5TTl9TVEIgfSwKKyAgICB7IE0zMlJCRl9JTlNOX1NUQl9ELCAmJiBjYXNlX3NlbV9JTlNOX1NUQl9EIH0sCisgICAgeyBNMzJSQkZfSU5TTl9TVEgsICYmIGNhc2Vfc2VtX0lOU05fU1RIIH0sCisgICAgeyBNMzJSQkZfSU5TTl9TVEhfRCwgJiYgY2FzZV9zZW1fSU5TTl9TVEhfRCB9LAorICAgIHsgTTMyUkJGX0lOU05fU1RfUExVUywgJiYgY2FzZV9zZW1fSU5TTl9TVF9QTFVTIH0sCisgICAgeyBNMzJSQkZfSU5TTl9TVF9NSU5VUywgJiYgY2FzZV9zZW1fSU5TTl9TVF9NSU5VUyB9LAorICAgIHsgTTMyUkJGX0lOU05fU1VCLCAmJiBjYXNlX3NlbV9JTlNOX1NVQiB9LAorICAgIHsgTTMyUkJGX0lOU05fU1VCViwgJiYgY2FzZV9zZW1fSU5TTl9TVUJWIH0sCisgICAgeyBNMzJSQkZfSU5TTl9TVUJYLCAmJiBjYXNlX3NlbV9JTlNOX1NVQlggfSwKKyAgICB7IE0zMlJCRl9JTlNOX1RSQVAsICYmIGNhc2Vfc2VtX0lOU05fVFJBUCB9LAorICAgIHsgTTMyUkJGX0lOU05fVU5MT0NLLCAmJiBjYXNlX3NlbV9JTlNOX1VOTE9DSyB9LAorICAgIHsgMCwgMCB9CisgIH07CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGxhYmVsc1tpXS5sYWJlbCAhPSAwOyArK2kpCisjaWYgRkFTVF9QCisgICAgQ1BVX0lERVNDIChjdXJyZW50X2NwdSkgW2xhYmVsc1tpXS5pbmRleF0uc2VtX2Zhc3RfbGFiID0gbGFiZWxzW2ldLmxhYmVsOworI2Vsc2UKKyAgICBDUFVfSURFU0MgKGN1cnJlbnRfY3B1KSBbbGFiZWxzW2ldLmluZGV4XS5zZW1fZnVsbF9sYWIgPSBsYWJlbHNbaV0ubGFiZWw7CisjZW5kaWYKKworI3VuZGVmIERFRklORV9MQUJFTFMKKyNlbmRpZiAvKiBERUZJTkVfTEFCRUxTICovCisKKyNpZmRlZiBERUZJTkVfU1dJVENICisKKy8qIElmIGh5cGVyLWZhc3QgW3dlbGwgbm90IHVubmVjZXNzYXJpbHkgc2xvd10gZXhlY3V0aW9uIGlzIHNlbGVjdGVkLCB0dXJuCisgICBvZmYgZnJpbGxzIGxpa2UgdHJhY2luZyBhbmQgcHJvZmlsaW5nLiAgKi8KKy8qIEZJWE1FOiBBIGJldHRlciB3YXkgd291bGQgYmUgdG8gaGF2ZSBUUkFDRV9SRVNVTFQgY2hlY2sgZm9yIHNvbWV0aGluZworICAgdGhhdCBjYW4gY2F1c2UgaXQgdG8gYmUgb3B0aW1pemVkIG91dC4gIEFub3RoZXIgd2F5IHdvdWxkIGJlIHRvIGVtaXQKKyAgIHNwZWNpYWwgaGFuZGxlcnMgaW50byB0aGUgaW5zdHJ1Y3Rpb24gInN0cmVhbSIuICAqLworCisjaWYgRkFTVF9QCisjdW5kZWYgVFJBQ0VfUkVTVUxUCisjZGVmaW5lIFRSQUNFX1JFU1VMVChjcHUsIGFidWYsIG5hbWUsIHR5cGUsIHZhbCkKKyNlbmRpZgorCisjdW5kZWYgR0VUX0FUVFIKKyNkZWZpbmUgR0VUX0FUVFIoY3B1LCBudW0sIGF0dHIpIENHRU5fQVRUUl9WQUxVRSAoTlVMTCwgYWJ1Zi0+aWRlc2MtPmF0dHJzLCBDR0VOX0lOU05fIyNhdHRyKQorCit7CisKKyNpZiBXSVRIX1NDQUNIRV9QQkIKKworLyogQnJhbmNoIHRvIG5leHQgaGFuZGxlciB3aXRob3V0IGdvaW5nIGFyb3VuZCBtYWluIGxvb3AuICAqLworI2RlZmluZSBORVhUKHZwYykgZ290byAqIFNFTV9BUkdCVUYgKHZwYykgLT4gc2VtYW50aWMuc2VtX2Nhc2UKK1NXSVRDSCAoc2VtLCBTRU1fQVJHQlVGICh2cGMpIC0+IHNlbWFudGljLnNlbV9jYXNlKQorCisjZWxzZSAvKiAhIFdJVEhfU0NBQ0hFX1BCQiAqLworCisjZGVmaW5lIE5FWFQodnBjKSBCUkVBSyAoc2VtKQorI2lmZGVmIF9fR05VQ19fCisjaWYgRkFTVF9QCisgIFNXSVRDSCAoc2VtLCBTRU1fQVJHQlVGIChzYykgLT4gaWRlc2MtPnNlbV9mYXN0X2xhYikKKyNlbHNlCisgIFNXSVRDSCAoc2VtLCBTRU1fQVJHQlVGIChzYykgLT4gaWRlc2MtPnNlbV9mdWxsX2xhYikKKyNlbmRpZgorI2Vsc2UKKyAgU1dJVENIIChzZW0sIFNFTV9BUkdCVUYgKHNjKSAtPiBpZGVzYy0+bnVtKQorI2VuZGlmCisKKyNlbmRpZiAvKiAhIFdJVEhfU0NBQ0hFX1BCQiAqLworCisgICAgeworCisgIENBU0UgKHNlbSwgSU5TTl9YX0lOVkFMSUQpIDogLyogLS1pbnZhbGlkLS0gKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKKworICB7CisjaWYgV0lUSF9TQ0FDSEUKKyAgICAvKiBVcGRhdGUgdGhlIHJlY29yZGVkIHBjIGluIHRoZSBjcHUgc3RhdGUgc3RydWN0LiAgKi8KKyAgICBTRVRfSF9QQyAocGMpOworI2VuZGlmCisgICAgc2ltX2VuZ2luZV9pbnZhbGlkX2luc24gKGN1cnJlbnRfY3B1LCBwYyk7CisgICAgc2ltX2lvX2Vycm9yIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSwgImludmFsaWQgaW5zbiBub3QgaGFuZGxlZFxuIik7CisgICAgLyogTk9UUkVBQ0hFRCAqLworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fWF9BRlRFUikgOiAvKiAtLWFmdGVyLS0gKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKKworICB7CisjaWYgV0lUSF9TQ0FDSEVfUEJCX00zMlJCRgorICAgIG0zMnJiZl9wYmJfYWZ0ZXIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnKTsKKyNlbmRpZgorICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fWF9CRUZPUkUpIDogLyogLS1iZWZvcmUtLSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOworCisgIHsKKyNpZiBXSVRIX1NDQUNIRV9QQkJfTTMyUkJGCisgICAgbTMycmJmX3BiYl9iZWZvcmUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnKTsKKyNlbmRpZgorICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fWF9DVElfQ0hBSU4pIDogLyogLS1jdGktY2hhaW4tLSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOworCisgIHsKKyNpZiBXSVRIX1NDQUNIRV9QQkJfTTMyUkJGCisjaWZkZWYgREVGSU5FX1NXSVRDSAorICAgIHZwYyA9IG0zMnJiZl9wYmJfY3RpX2NoYWluIChjdXJyZW50X2NwdSwgc2VtX2FyZywKKwkJCSAgICAgICBwYmJfYnJfbnBjX3B0ciwgcGJiX2JyX25wYyk7CisgICAgQlJFQUsgKHNlbSk7CisjZWxzZQorICAgIC8qIEZJWE1FOiBBbGxvdyBwcm92aXNpb24gb2YgZXhwbGljaXQgaWZtdCBzcGVjIGluIGluc24gc3BlYy4gICovCisgICAgdnBjID0gbTMycmJmX3BiYl9jdGlfY2hhaW4gKGN1cnJlbnRfY3B1LCBzZW1fYXJnLAorCQkJICAgICAgIENQVV9QQkJfQlJfTlBDX1BUUiAoY3VycmVudF9jcHUpLAorCQkJICAgICAgIENQVV9QQkJfQlJfTlBDIChjdXJyZW50X2NwdSkpOworI2VuZGlmCisjZW5kaWYKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1hfQ0hBSU4pIDogLyogLS1jaGFpbi0tICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7CisKKyAgeworI2lmIFdJVEhfU0NBQ0hFX1BCQl9NMzJSQkYKKyAgICB2cGMgPSBtMzJyYmZfcGJiX2NoYWluIChjdXJyZW50X2NwdSwgc2VtX2FyZyk7CisjaWZkZWYgREVGSU5FX1NXSVRDSAorICAgIEJSRUFLIChzZW0pOworI2VuZGlmCisjZW5kaWYKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1hfQkVHSU4pIDogLyogLS1iZWdpbi0tICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7CisKKyAgeworI2lmIFdJVEhfU0NBQ0hFX1BCQl9NMzJSQkYKKyNpZmRlZiBERUZJTkVfU1dJVENICisgICAgLyogSW4gdGhlIHN3aXRjaCBjYXNlIEZBU1RfUCBpcyBhIGNvbnN0YW50LCBhbGxvd2luZyBzZXZlcmFsIG9wdGltaXphdGlvbnMKKyAgICAgICBpbiBhbnkgY2FsbGVkIGlubGluZSBmdW5jdGlvbnMuICAqLworICAgIHZwYyA9IG0zMnJiZl9wYmJfYmVnaW4gKGN1cnJlbnRfY3B1LCBGQVNUX1ApOworI2Vsc2UKKyAgICB2cGMgPSBtMzJyYmZfcGJiX2JlZ2luIChjdXJyZW50X2NwdSwgU1RBVEVfUlVOX0ZBU1RfUCAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpKTsKKyNlbmRpZgorI2VuZGlmCisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9BREQpIDogLyogYWRkICRkciwkc3IgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0FERDMpIDogLyogYWRkMyAkZHIsJHNyLCRoYXNoJHNsbzE2ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZDMuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfc2ltbTE2KSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9BTkQpIDogLyogYW5kICRkciwkc3IgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gQU5EU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0FORDMpIDogLyogYW5kMyAkZHIsJHNyLCR1aW1tMTYgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYW5kMy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9zciksIEZMRCAoZl91aW1tMTYpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX09SKSA6IC8qIG9yICRkciwkc3IgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gT1JTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fT1IzKSA6IC8qIG9yMyAkZHIsJHNyLCRoYXNoJHVsbzE2ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X29yMy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE9SU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3VpbW0xNikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fWE9SKSA6IC8qIHhvciAkZHIsJHNyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFhPUlNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9YT1IzKSA6IC8qIHhvcjMgJGRyLCRzciwkdWltbTE2ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FuZDMuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBYT1JTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfdWltbTE2KSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9BRERJKSA6IC8qIGFkZGkgJGRyLCRzaW1tOCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGRpLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX2RyKSwgRkxEIChmX3NpbW04KSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9BRERWKSA6IC8qIGFkZHYgJGRyLCRzciAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGR2LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgQkkgdGVtcDE7U0kgdGVtcDA7CisgIHRlbXAwID0gQUREU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKKyAgdGVtcDEgPSBBRERPRlNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSwgMCk7CisgIHsKKyAgICBTSSBvcHZhbCA9IHRlbXAwOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IHRlbXAxOworICAgIENQVSAoaF9jb25kKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0FERFYzKSA6IC8qIGFkZHYzICRkciwkc3IsJHNpbW0xNiAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGR2My5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitkbyB7CisgIEJJIHRlbXAxO1NJIHRlbXAwOworICB0ZW1wMCA9IEFERFNJICgqIEZMRCAoaV9zciksIEZMRCAoZl9zaW1tMTYpKTsKKyAgdGVtcDEgPSBBRERPRlNJICgqIEZMRCAoaV9zciksIEZMRCAoZl9zaW1tMTYpLCAwKTsKKyAgeworICAgIFNJIG9wdmFsID0gdGVtcDA7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gdGVtcDE7CisgICAgQ1BVIChoX2NvbmQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQUREWCkgOiAvKiBhZGR4ICRkciwkc3IgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkeC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIEJJIHRlbXAxO1NJIHRlbXAwOworICB0ZW1wMCA9IEFERENTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zciksIENQVSAoaF9jb25kKSk7CisgIHRlbXAxID0gQUREQ0ZTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zciksIENQVSAoaF9jb25kKSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IHRlbXAwOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IHRlbXAxOworICAgIENQVSAoaF9jb25kKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JDOCkgOiAvKiBiYy5zICRkaXNwOCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JjOC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworaWYgKENQVSAoaF9jb25kKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3A4KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CQzI0KSA6IC8qIGJjLmwgJGRpc3AyNCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JjMjQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChDUFUgKGhfY29uZCkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMjQpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JFUSkgOiAvKiBiZXEgJHNyYzEsJHNyYzIsJGRpc3AxNiAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKEVRU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAzKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JFUVopIDogLyogYmVxeiAkc3JjMiwkZGlzcDE2ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmVxei5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKEVRU0kgKCogRkxEIChpX3NyYzIpLCAwKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3AxNik7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQkdFWikgOiAvKiBiZ2V6ICRzcmMyLCRkaXNwMTYgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iZXF6LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoR0VTSSAoKiBGTEQgKGlfc3JjMiksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDE2KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CR1RaKSA6IC8qIGJndHogJHNyYzIsJGRpc3AxNiAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcXouZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChHVFNJICgqIEZMRCAoaV9zcmMyKSwgMCkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JMRVopIDogLyogYmxleiAkc3JjMiwkZGlzcDE2ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmVxei5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKExFU0kgKCogRkxEIChpX3NyYzIpLCAwKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3AxNik7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQkxUWikgOiAvKiBibHR6ICRzcmMyLCRkaXNwMTYgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iZXF6LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoTFRTSSAoKiBGTEQgKGlfc3JjMiksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDE2KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CTkVaKSA6IC8qIGJuZXogJHNyYzIsJGRpc3AxNiAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcXouZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJICgqIEZMRCAoaV9zcmMyKSwgMCkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JMOCkgOiAvKiBibC5zICRkaXNwOCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JsOC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQU5EU0kgKHBjLCAtNCksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwOCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9CTDI0KSA6IC8qIGJsLmwgJGRpc3AyNCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JsMjQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKHBjLCA0KTsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDI0KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JOQzgpIDogLyogYm5jLnMgJGRpc3A4ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmM4LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitpZiAoTk9UQkkgKENQVSAoaF9jb25kKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwOCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQk5DMjQpIDogLyogYm5jLmwgJGRpc3AyNCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JjMjQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChOT1RCSSAoQ1BVIChoX2NvbmQpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3AyNCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQk5FKSA6IC8qIGJuZSAkc3JjMSwkc3JjMiwkZGlzcDE2ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmVxLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoTkVTSSAoKiBGTEQgKGlfc3JjMSksICogRkxEIChpX3NyYzIpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3AxNik7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQlJBOCkgOiAvKiBicmEucyAkZGlzcDggKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9icmE4LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDgpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0JSQTI0KSA6IC8qIGJyYS5sICRkaXNwMjQgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9icmEyNC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3AyNCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ01QKSA6IC8qIGNtcCAkc3JjMSwkc3JjMiAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXAuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgQkkgb3B2YWwgPSBMVFNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOworICAgIENQVSAoaF9jb25kKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9DTVBJKSA6IC8qIGNtcGkgJHNyYzIsJHNpbW0xNiAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXBpLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIEJJIG9wdmFsID0gTFRTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zaW1tMTYpKTsKKyAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fQ01QVSkgOiAvKiBjbXB1ICRzcmMxLCRzcmMyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBCSSBvcHZhbCA9IExUVVNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOworICAgIENQVSAoaF9jb25kKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9DTVBVSSkgOiAvKiBjbXB1aSAkc3JjMiwkc2ltbTE2ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgQkkgb3B2YWwgPSBMVFVTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zaW1tMTYpKTsKKyAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fRElWKSA6IC8qIGRpdiAkZHIsJHNyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rpdi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoTkVTSSAoKiBGTEQgKGlfc3IpLCAwKSkgeworICB7CisgICAgU0kgb3B2YWwgPSBESVZTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fRElWVSkgOiAvKiBkaXZ1ICRkciwkc3IgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZGl2LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJICgqIEZMRCAoaV9zciksIDApKSB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFVESVZTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fUkVNKSA6IC8qIHJlbSAkZHIsJHNyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rpdi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoTkVTSSAoKiBGTEQgKGlfc3IpLCAwKSkgeworICB7CisgICAgU0kgb3B2YWwgPSBNT0RTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fUkVNVSkgOiAvKiByZW11ICRkciwkc3IgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZGl2LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJICgqIEZMRCAoaV9zciksIDApKSB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFVNT0RTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fSkwpIDogLyogamwgJHNyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfamwuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgVVNJIHRlbXAxO1NJIHRlbXAwOworICB0ZW1wMCA9IEFERFNJIChBTkRTSSAocGMsIC00KSwgNCk7CisgIHRlbXAxID0gQU5EU0kgKCogRkxEIChpX3NyKSwgLTQpOworICB7CisgICAgU0kgb3B2YWwgPSB0ZW1wMDsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBVU0kgb3B2YWwgPSB0ZW1wMTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fSk1QKSA6IC8qIGptcCAkc3IgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9qbXAuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFVTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9zciksIC00KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xEKSA6IC8qIGxkICRkcixAJHNyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3IpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xEX0QpIDogLyogbGQgJGRyLEAoJHNsbzE2LCRzcikgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRfZC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9zciksIEZMRCAoZl9zaW1tMTYpKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MREIpIDogLyogbGRiICRkcixAJHNyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEVYVFFJU0kgKEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyKSkpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERCX0QpIDogLyogbGRiICRkcixAKCRzbG8xNiwkc3IpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkYl9kLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gRVhUUUlTSSAoR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3NpbW0xNikpKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MREgpIDogLyogbGRoICRkcixAJHNyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEVYVEhJU0kgKEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyKSkpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERIX0QpIDogLyogbGRoICRkcixAKCRzbG8xNiwkc3IpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaF9kLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gRVhUSElTSSAoR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3NpbW0xNikpKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRFVCKSA6IC8qIGxkdWIgJGRyLEAkc3IgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRiLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gWkVYVFFJU0kgKEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyKSkpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERVQl9EKSA6IC8qIGxkdWIgJGRyLEAoJHNsbzE2LCRzcikgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRiX2QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBaRVhUUUlTSSAoR0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3NpbW0xNikpKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRFVIKSA6IC8qIGxkdWggJGRyLEAkc3IgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRoLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gWkVYVEhJU0kgKEdFVE1FTUhJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyKSkpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTERVSF9EKSA6IC8qIGxkdWggJGRyLEAoJHNsbzE2LCRzcikgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRoX2QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBaRVhUSElTSSAoR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3NpbW0xNikpKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MRF9QTFVTKSA6IC8qIGxkICRkcixAJHNyKyAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZF9wbHVzLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgU0kgdGVtcDE7U0kgdGVtcDA7CisgIHRlbXAwID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3IpKTsKKyAgdGVtcDEgPSBBRERTSSAoKiBGTEQgKGlfc3IpLCA0KTsKKyAgeworICAgIFNJIG9wdmFsID0gdGVtcDA7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gdGVtcDE7CisgICAgKiBGTEQgKGlfc3IpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInNyIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xEMjQpIDogLyogbGQyNCAkZHIsJHVpbW0yNCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZDI0LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gRkxEIChpX3VpbW0yNCk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9MREk4KSA6IC8qIGxkaTggJGRyLCRzaW1tOCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGk4LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gRkxEIChmX3NpbW04KTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX0xESTE2KSA6IC8qIGxkaTE2ICRkciwkaGFzaCRzbG8xNiAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGkxNi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEZMRCAoZl9zaW1tMTYpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTE9DSykgOiAvKiBsb2NrICRkcixAJHNyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xvY2suZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgQkkgb3B2YWwgPSAxOworICAgIENQVSAoaF9sb2NrKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJsb2NrLTAiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBHRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9NQUNISSkgOiAvKiBtYWNoaSAkc3JjMSwkc3JjMiAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tYWNoaS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoQUREREkgKEdFVF9IX0FDQ1VNICgpLCBNVUxESSAoRVhUU0lESSAoQU5EU0kgKCogRkxEIChpX3NyYzEpLCAweGZmZmYwMDAwKSksIEVYVEhJREkgKFRSVU5DU0lISSAoU1JBU0kgKCogRkxEIChpX3NyYzIpLCAxNikpKSkpLCA4KSwgOCk7CisgICAgU0VUX0hfQUNDVU0gKG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW0iLCAnRCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX01BQ0xPKSA6IC8qIG1hY2xvICRzcmMxLCRzcmMyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21hY2hpLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIERJIG9wdmFsID0gU1JBREkgKFNMTERJIChBRERESSAoR0VUX0hfQUNDVU0gKCksIE1VTERJIChFWFRTSURJIChTTExTSSAoKiBGTEQgKGlfc3JjMSksIDE2KSksIEVYVEhJREkgKFRSVU5DU0lISSAoKiBGTEQgKGlfc3JjMikpKSkpLCA4KSwgOCk7CisgICAgU0VUX0hfQUNDVU0gKG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW0iLCAnRCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX01BQ1dISSkgOiAvKiBtYWN3aGkgJHNyYzEsJHNyYzIgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbWFjaGkuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgREkgb3B2YWwgPSBTUkFESSAoU0xMREkgKEFERERJIChHRVRfSF9BQ0NVTSAoKSwgTVVMREkgKEVYVFNJREkgKCogRkxEIChpX3NyYzEpKSwgRVhUSElESSAoVFJVTkNTSUhJIChTUkFTSSAoKiBGTEQgKGlfc3JjMiksIDE2KSkpKSksIDgpLCA4KTsKKyAgICBTRVRfSF9BQ0NVTSAob3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2N1bSIsICdEJywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTUFDV0xPKSA6IC8qIG1hY3dsbyAkc3JjMSwkc3JjMiAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tYWNoaS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoQUREREkgKEdFVF9IX0FDQ1VNICgpLCBNVUxESSAoRVhUU0lESSAoKiBGTEQgKGlfc3JjMSkpLCBFWFRISURJIChUUlVOQ1NJSEkgKCogRkxEIChpX3NyYzIpKSkpKSwgOCksIDgpOworICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9NVUwpIDogLyogbXVsICRkciwkc3IgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gTVVMU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX01VTEhJKSA6IC8qIG11bGhpICRzcmMxLCRzcmMyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bGhpLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIERJIG9wdmFsID0gU1JBREkgKFNMTERJIChNVUxESSAoRVhUU0lESSAoQU5EU0kgKCogRkxEIChpX3NyYzEpLCAweGZmZmYwMDAwKSksIEVYVEhJREkgKFRSVU5DU0lISSAoU1JBU0kgKCogRkxEIChpX3NyYzIpLCAxNikpKSksIDE2KSwgMTYpOworICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9NVUxMTykgOiAvKiBtdWxsbyAkc3JjMSwkc3JjMiAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxoaS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoTVVMREkgKEVYVFNJREkgKFNMTFNJICgqIEZMRCAoaV9zcmMxKSwgMTYpKSwgRVhUSElESSAoVFJVTkNTSUhJICgqIEZMRCAoaV9zcmMyKSkpKSwgMTYpLCAxNik7CisgICAgU0VUX0hfQUNDVU0gKG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW0iLCAnRCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX01VTFdISSkgOiAvKiBtdWx3aGkgJHNyYzEsJHNyYzIgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsaGkuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgREkgb3B2YWwgPSBTUkFESSAoU0xMREkgKE1VTERJIChFWFRTSURJICgqIEZMRCAoaV9zcmMxKSksIEVYVEhJREkgKFRSVU5DU0lISSAoU1JBU0kgKCogRkxEIChpX3NyYzIpLCAxNikpKSksIDgpLCA4KTsKKyAgICBTRVRfSF9BQ0NVTSAob3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2N1bSIsICdEJywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTVVMV0xPKSA6IC8qIG11bHdsbyAkc3JjMSwkc3JjMiAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdWxoaS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoTVVMREkgKEVYVFNJREkgKCogRkxEIChpX3NyYzEpKSwgRVhUSElESSAoVFJVTkNTSUhJICgqIEZMRCAoaV9zcmMyKSkpKSwgOCksIDgpOworICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9NVikgOiAvKiBtdiAkZHIsJHNyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X212LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3IpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTVZGQUNISSkgOiAvKiBtdmZhY2hpICRkciAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdmZhY2hpLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChTUkFESSAoR0VUX0hfQUNDVU0gKCksIDMyKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9NVkZBQ0xPKSA6IC8qIG12ZmFjbG8gJGRyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X212ZmFjaGkuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKEdFVF9IX0FDQ1VNICgpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX01WRkFDTUkpIDogLyogbXZmYWNtaSAkZHIgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXZmYWNoaS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAoU1JBREkgKEdFVF9IX0FDQ1VNICgpLCAxNikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTVZGQykgOiAvKiBtdmZjICRkciwkc2NyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X212ZmMuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBHRVRfSF9DUiAoRkxEIChmX3IyKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9NVlRBQ0hJKSA6IC8qIG12dGFjaGkgJHNyYzEgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXZ0YWNoaS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBESSBvcHZhbCA9IE9SREkgKEFORERJIChHRVRfSF9BQ0NVTSAoKSwgTUFLRURJICgwLCAweGZmZmZmZmZmKSksIFNMTERJIChFWFRTSURJICgqIEZMRCAoaV9zcmMxKSksIDMyKSk7CisgICAgU0VUX0hfQUNDVU0gKG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW0iLCAnRCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX01WVEFDTE8pIDogLyogbXZ0YWNsbyAkc3JjMSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdnRhY2hpLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIERJIG9wdmFsID0gT1JESSAoQU5EREkgKEdFVF9IX0FDQ1VNICgpLCBNQUtFREkgKDB4ZmZmZmZmZmYsIDApKSwgWkVYVFNJREkgKCogRkxEIChpX3NyYzEpKSk7CisgICAgU0VUX0hfQUNDVU0gKG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW0iLCAnRCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX01WVEMpIDogLyogbXZ0YyAkc3IsJGRjciAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdnRjLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFVTSSBvcHZhbCA9ICogRkxEIChpX3NyKTsKKyAgICBTRVRfSF9DUiAoRkxEIChmX3IxKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkY3IiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX05FRykgOiAvKiBuZWcgJGRyLCRzciAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE5FR1NJICgqIEZMRCAoaV9zcikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fTk9QKSA6IC8qIG5vcCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9ub3AuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworUFJPRklMRV9DT1VOVF9GSUxMTk9QUyAoY3VycmVudF9jcHUsIGFidWYtPmFkZHIpOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX05PVCkgOiAvKiBub3QgJGRyLCRzciAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IElOVlNJICgqIEZMRCAoaV9zcikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fUkFDKSA6IC8qIHJhYyAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9yYWMuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBESSB0bXBfdG1wMTsKKyAgdG1wX3RtcDEgPSBTTExESSAoR0VUX0hfQUNDVU0gKCksIDEpOworICB0bXBfdG1wMSA9IEFERERJICh0bXBfdG1wMSwgTUFLRURJICgwLCAzMjc2OCkpOworICB7CisgICAgREkgb3B2YWwgPSAoR1RESSAodG1wX3RtcDEsIE1BS0VESSAoMzI3NjcsIDB4ZmZmZjAwMDApKSkgPyAoTUFLRURJICgzMjc2NywgMHhmZmZmMDAwMCkpIDogKExUREkgKHRtcF90bXAxLCBNQUtFREkgKDB4ZmZmZjgwMDAsIDApKSkgPyAoTUFLRURJICgweGZmZmY4MDAwLCAwKSkgOiAoQU5EREkgKHRtcF90bXAxLCBNQUtFREkgKDB4ZmZmZmZmZmYsIDB4ZmZmZjAwMDApKSk7CisgICAgU0VUX0hfQUNDVU0gKG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW0iLCAnRCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fUkFDSCkgOiAvKiByYWNoICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3JhYy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIERJIHRtcF90bXAxOworICB0bXBfdG1wMSA9IEFORERJIChHRVRfSF9BQ0NVTSAoKSwgTUFLRURJICgxNjc3NzIxNSwgMHhmZmZmZmZmZikpOworaWYgKEFORElGIChHRURJICh0bXBfdG1wMSwgTUFLRURJICgxNjM4MywgMHg4MDAwMDAwMCkpLCBMRURJICh0bXBfdG1wMSwgTUFLRURJICg4Mzg4NjA3LCAweGZmZmZmZmZmKSkpKSB7CisgIHRtcF90bXAxID0gTUFLRURJICgxNjM4MywgMHg4MDAwMDAwMCk7Cit9IGVsc2UgeworaWYgKEFORElGIChHRURJICh0bXBfdG1wMSwgTUFLRURJICg4Mzg4NjA4LCAwKSksIExFREkgKHRtcF90bXAxLCBNQUtFREkgKDE2NzYwODMyLCAwKSkpKSB7CisgIHRtcF90bXAxID0gTUFLRURJICgxNjc2MDgzMiwgMCk7Cit9IGVsc2UgeworICB0bXBfdG1wMSA9IEFORERJIChBRERESSAoR0VUX0hfQUNDVU0gKCksIE1BS0VESSAoMCwgMTA3Mzc0MTgyNCkpLCBNQUtFREkgKDB4ZmZmZmZmZmYsIDB4ODAwMDAwMDApKTsKK30KK30KKyAgdG1wX3RtcDEgPSBTTExESSAodG1wX3RtcDEsIDEpOworICB7CisgICAgREkgb3B2YWwgPSBTUkFESSAoU0xMREkgKHRtcF90bXAxLCA3KSwgNyk7CisgICAgU0VUX0hfQUNDVU0gKG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW0iLCAnRCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fUlRFKSA6IC8qIHJ0ZSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X3J0ZS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgVVNJIG9wdmFsID0gQU5EU0kgKEdFVF9IX0NSICgoKFVJTlQpIDYpKSwgLTQpOworICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgVVNJIG9wdmFsID0gR0VUX0hfQ1IgKCgoVUlOVCkgMTQpKTsKKyAgICBTRVRfSF9DUiAoKChVSU5UKSA2KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjci02IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFVRSSBvcHZhbCA9IENQVSAoaF9icHN3KTsKKyAgICBTRVRfSF9QU1cgKG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicHN3LTAiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgVVFJIG9wdmFsID0gQ1BVIChoX2JicHN3KTsKKyAgICBDUFUgKGhfYnBzdykgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnBzdy0wIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU0VUSCkgOiAvKiBzZXRoICRkciwkaGFzaCRoaTE2ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3NldGguZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTTExTSSAoRkxEIChmX2hpMTYpLCAxNik7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TTEwpIDogLyogc2xsICRkciwkc3IgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gU0xMU0kgKCogRkxEIChpX2RyKSwgQU5EU0kgKCogRkxEIChpX3NyKSwgMzEpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NMTDMpIDogLyogc2xsMyAkZHIsJHNyLCRzaW1tMTYgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc2xsMy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFNMTFNJICgqIEZMRCAoaV9zciksIEFORFNJIChGTEQgKGZfc2ltbTE2KSwgMzEpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NMTEkpIDogLyogc2xsaSAkZHIsJHVpbW01ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3NsbGkuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTTExTSSAoKiBGTEQgKGlfZHIpLCBGTEQgKGZfdWltbTUpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NSQSkgOiAvKiBzcmEgJGRyLCRzciAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTUkFTSSAoKiBGTEQgKGlfZHIpLCBBTkRTSSAoKiBGTEQgKGlfc3IpLCAzMSkpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1JBMykgOiAvKiBzcmEzICRkciwkc3IsJHNpbW0xNiAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zbGwzLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gU1JBU0kgKCogRkxEIChpX3NyKSwgQU5EU0kgKEZMRCAoZl9zaW1tMTYpLCAzMSkpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1JBSSkgOiAvKiBzcmFpICRkciwkdWltbTUgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc2xsaS5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFNSQVNJICgqIEZMRCAoaV9kciksIEZMRCAoZl91aW1tNSkpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1JMKSA6IC8qIHNybCAkZHIsJHNyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFNSTFNJICgqIEZMRCAoaV9kciksIEFORFNJICgqIEZMRCAoaV9zciksIDMxKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TUkwzKSA6IC8qIHNybDMgJGRyLCRzciwkc2ltbTE2ICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3NsbDMuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTUkxTSSAoKiBGTEQgKGlfc3IpLCBBTkRTSSAoRkxEIChmX3NpbW0xNiksIDMxKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TUkxJKSA6IC8qIHNybGkgJGRyLCR1aW1tNSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zbGxpLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gU1JMU0kgKCogRkxEIChpX2RyKSwgRkxEIChmX3VpbW01KSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVCkgOiAvKiBzdCAkc3JjMSxAJHNyYzIgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcmMyKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUX0QpIDogLyogc3QgJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0X2QuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zaW1tMTYpKSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJtZW1vcnkiLCAneCcsIG9wdmFsKTsKKyAgfQorCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUQikgOiAvKiBzdGIgJHNyYzEsQCRzcmMyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0Yi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBRSSBvcHZhbCA9ICogRkxEIChpX3NyYzEpOworICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyYzIpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RCX0QpIDogLyogc3RiICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGJfZC5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBRSSBvcHZhbCA9ICogRkxEIChpX3NyYzEpOworICAgIFNFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9zcmMyKSwgRkxEIChmX3NpbW0xNikpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1RIKSA6IC8qIHN0aCAkc3JjMSxAJHNyYzIgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RoLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7CisgICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3JjMiksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVEhfRCkgOiAvKiBzdGggJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0aF9kLmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7CisgICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc2ltbTE2KSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVF9QTFVTKSA6IC8qIHN0ICRzcmMxLEArJHNyYzIgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfcGx1cy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF9uZXdfc3JjMjsKKyAgdG1wX25ld19zcmMyID0gQUREU0kgKCogRkxEIChpX3NyYzIpLCA0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX25ld19zcmMyLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IHRtcF9uZXdfc3JjMjsKKyAgICAqIEZMRCAoaV9zcmMyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJzcmMyIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NUX01JTlVTKSA6IC8qIHN0ICRzcmMxLEAtJHNyYzIgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfcGx1cy5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRtcF9uZXdfc3JjMjsKKyAgdG1wX25ld19zcmMyID0gU1VCU0kgKCogRkxEIChpX3NyYzIpLCA0KTsKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgdG1wX25ld19zcmMyLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IHRtcF9uZXdfc3JjMjsKKyAgICAqIEZMRCAoaV9zcmMyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJzcmMyIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1NVQikgOiAvKiBzdWIgJGRyLCRzciAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fU1VCVikgOiAvKiBzdWJ2ICRkciwkc3IgKi8KK3sKKyAgU0VNX0FSRyBzZW1fYXJnID0gU0VNX1NFTV9BUkcgKHZwYywgc2MpOworICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkdi5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIEJJIHRlbXAxO1NJIHRlbXAwOworICB0ZW1wMCA9IFNVQlNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSk7CisgIHRlbXAxID0gU1VCT0ZTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zciksIDApOworICB7CisgICAgU0kgb3B2YWwgPSB0ZW1wMDsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSB0ZW1wMTsKKyAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisgIENBU0UgKHNlbSwgSU5TTl9TVUJYKSA6IC8qIHN1YnggJGRyLCRzciAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGR4LmYKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgQkkgdGVtcDE7U0kgdGVtcDA7CisgIHRlbXAwID0gU1VCQ1NJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSwgQ1BVIChoX2NvbmQpKTsKKyAgdGVtcDEgPSBTVUJDRlNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSwgQ1BVIChoX2NvbmQpKTsKKyAgeworICAgIFNJIG9wdmFsID0gdGVtcDA7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gdGVtcDE7CisgICAgQ1BVIChoX2NvbmQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyN1bmRlZiBGTEQKK30KKyAgTkVYVCAodnBjKTsKKworICBDQVNFIChzZW0sIElOU05fVFJBUCkgOiAvKiB0cmFwICR1aW1tNCAqLworeworICBTRU1fQVJHIHNlbV9hcmcgPSBTRU1fU0VNX0FSRyAodnBjLCBzYyk7CisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X3RyYXAuZgorICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEdFVF9IX0NSICgoKFVJTlQpIDYpKTsKKyAgICBTRVRfSF9DUiAoKChVSU5UKSAxNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY3ItMTQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgVVNJIG9wdmFsID0gQUREU0kgKHBjLCA0KTsKKyAgICBTRVRfSF9DUiAoKChVSU5UKSA2KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjci02IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFVRSSBvcHZhbCA9IENQVSAoaF9icHN3KTsKKyAgICBDUFUgKGhfYmJwc3cpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImJicHN3LTAiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgVVFJIG9wdmFsID0gR0VUX0hfUFNXICgpOworICAgIENQVSAoaF9icHN3KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJicHN3LTAiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgVVFJIG9wdmFsID0gQU5EUUkgKEdFVF9IX1BTVyAoKSwgMTI4KTsKKyAgICBTRVRfSF9QU1cgKG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicHN3LTAiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBtMzJyX3RyYXAgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX3VpbW00KSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisjdW5kZWYgRkxECit9CisgIE5FWFQgKHZwYyk7CisKKyAgQ0FTRSAoc2VtLCBJTlNOX1VOTE9DSykgOiAvKiB1bmxvY2sgJHNyYzEsQCRzcmMyICovCit7CisgIFNFTV9BUkcgc2VtX2FyZyA9IFNFTV9TRU1fQVJHICh2cGMsIHNjKTsKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3VubG9jay5mCisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CitpZiAoQ1BVIChoX2xvY2spKSB7CisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3NyYzEpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyYzIpLCBvcHZhbCk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCA0KTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKyAgeworICAgIEJJIG9wdmFsID0gMDsKKyAgICBDUFUgKGhfbG9jaykgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibG9jay0wIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworI3VuZGVmIEZMRAorfQorICBORVhUICh2cGMpOworCisKKyAgICB9CisgIEVORFNXSVRDSCAoc2VtKSAvKiBFbmQgb2Ygc2VtYW50aWMgc3dpdGNoLiAgKi8KKworICAvKiBBdCB0aGlzIHBvaW50IGB2cGMnIGNvbnRhaW5zIHRoZSBuZXh0IGluc24gdG8gZXhlY3V0ZS4gICovCit9CisKKyN1bmRlZiBERUZJTkVfU1dJVENICisjZW5kaWYgLyogREVGSU5FX1NXSVRDSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvc2VtLmMgYi9zaW0vbTMyci9zZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmZlNzBjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL20zMnIvc2VtLmMKQEAgLTAsMCArMSwyNTQ0IEBACisvKiBTaW11bGF0b3IgaW5zdHJ1Y3Rpb24gc2VtYW50aWNzIGZvciBtMzJyYmYuCisKK1RISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCisKK0NvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBTaW11bGF0b3JzLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyovCisKKyNkZWZpbmUgV0FOVF9DUFUgbTMycmJmCisjZGVmaW5lIFdBTlRfQ1BVX00zMlJCRgorCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJjZ2VuLW1lbS5oIgorI2luY2x1ZGUgImNnZW4tb3BzLmgiCisKKyN1bmRlZiBHRVRfQVRUUgorI2RlZmluZSBHRVRfQVRUUihjcHUsIG51bSwgYXR0cikgQ0dFTl9BVFRSX1ZBTFVFIChOVUxMLCBhYnVmLT5pZGVzYy0+YXR0cnMsIENHRU5fSU5TTl8jI2F0dHIpCisKKy8qIHgtaW52YWxpZDogLS1pbnZhbGlkLS0gKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLHhfaW52YWxpZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2VtcHR5LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAwKTsKKworICB7CisjaWYgV0lUSF9TQ0FDSEUKKyAgICAvKiBVcGRhdGUgdGhlIHJlY29yZGVkIHBjIGluIHRoZSBjcHUgc3RhdGUgc3RydWN0LiAgKi8KKyAgICBTRVRfSF9QQyAocGMpOworI2VuZGlmCisgICAgc2ltX2VuZ2luZV9pbnZhbGlkX2luc24gKGN1cnJlbnRfY3B1LCBwYyk7CisgICAgc2ltX2lvX2Vycm9yIChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSwgImludmFsaWQgaW5zbiBub3QgaGFuZGxlZFxuIik7CisgICAgLyogTk9UUkVBQ0hFRCAqLworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogeC1hZnRlcjogLS1hZnRlci0tICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZix4X2FmdGVyKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOworCisgIHsKKyNpZiBXSVRIX1NDQUNIRV9QQkJfTTMyUkJGCisgICAgbTMycmJmX3BiYl9hZnRlciAoY3VycmVudF9jcHUsIHNlbV9hcmcpOworI2VuZGlmCisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiB4LWJlZm9yZTogLS1iZWZvcmUtLSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYseF9iZWZvcmUpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7CisKKyAgeworI2lmIFdJVEhfU0NBQ0hFX1BCQl9NMzJSQkYKKyAgICBtMzJyYmZfcGJiX2JlZm9yZSAoY3VycmVudF9jcHUsIHNlbV9hcmcpOworI2VuZGlmCisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiB4LWN0aS1jaGFpbjogLS1jdGktY2hhaW4tLSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYseF9jdGlfY2hhaW4pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7CisKKyAgeworI2lmIFdJVEhfU0NBQ0hFX1BCQl9NMzJSQkYKKyNpZmRlZiBERUZJTkVfU1dJVENICisgICAgdnBjID0gbTMycmJmX3BiYl9jdGlfY2hhaW4gKGN1cnJlbnRfY3B1LCBzZW1fYXJnLAorCQkJICAgICAgIHBiYl9icl9ucGNfcHRyLCBwYmJfYnJfbnBjKTsKKyAgICBCUkVBSyAoc2VtKTsKKyNlbHNlCisgICAgLyogRklYTUU6IEFsbG93IHByb3Zpc2lvbiBvZiBleHBsaWNpdCBpZm10IHNwZWMgaW4gaW5zbiBzcGVjLiAgKi8KKyAgICB2cGMgPSBtMzJyYmZfcGJiX2N0aV9jaGFpbiAoY3VycmVudF9jcHUsIHNlbV9hcmcsCisJCQkgICAgICAgQ1BVX1BCQl9CUl9OUENfUFRSIChjdXJyZW50X2NwdSksCisJCQkgICAgICAgQ1BVX1BCQl9CUl9OUEMgKGN1cnJlbnRfY3B1KSk7CisjZW5kaWYKKyNlbmRpZgorICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogeC1jaGFpbjogLS1jaGFpbi0tICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZix4X2NoYWluKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZW1wdHkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDApOworCisgIHsKKyNpZiBXSVRIX1NDQUNIRV9QQkJfTTMyUkJGCisgICAgdnBjID0gbTMycmJmX3BiYl9jaGFpbiAoY3VycmVudF9jcHUsIHNlbV9hcmcpOworI2lmZGVmIERFRklORV9TV0lUQ0gKKyAgICBCUkVBSyAoc2VtKTsKKyNlbmRpZgorI2VuZGlmCisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiB4LWJlZ2luOiAtLWJlZ2luLS0gKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLHhfYmVnaW4pIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9lbXB0eS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMCk7CisKKyAgeworI2lmIFdJVEhfU0NBQ0hFX1BCQl9NMzJSQkYKKyNpZmRlZiBERUZJTkVfU1dJVENICisgICAgLyogSW4gdGhlIHN3aXRjaCBjYXNlIEZBU1RfUCBpcyBhIGNvbnN0YW50LCBhbGxvd2luZyBzZXZlcmFsIG9wdGltaXphdGlvbnMKKyAgICAgICBpbiBhbnkgY2FsbGVkIGlubGluZSBmdW5jdGlvbnMuICAqLworICAgIHZwYyA9IG0zMnJiZl9wYmJfYmVnaW4gKGN1cnJlbnRfY3B1LCBGQVNUX1ApOworI2Vsc2UKKyAgICB2cGMgPSBtMzJyYmZfcGJiX2JlZ2luIChjdXJyZW50X2NwdSwgU1RBVEVfUlVOX0ZBU1RfUCAoQ1BVX1NUQVRFIChjdXJyZW50X2NwdSkpKTsKKyNlbmRpZgorI2VuZGlmCisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBhZGQ6IGFkZCAkZHIsJHNyICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixhZGQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFERFNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBhZGQzOiBhZGQzICRkciwkc3IsJGhhc2gkc2xvMTYgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLGFkZDMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQzLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfc2ltbTE2KSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBhbmQ6IGFuZCAkZHIsJHNyICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixhbmQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBhbmQzOiBhbmQzICRkciwkc3IsJHVpbW0xNiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsYW5kMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FuZDMuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEFORFNJICgqIEZMRCAoaV9zciksIEZMRCAoZl91aW1tMTYpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG9yOiBvciAkZHIsJHNyICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixvcikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gT1JTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogb3IzOiBvcjMgJGRyLCRzciwkaGFzaCR1bG8xNiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsb3IzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfb3IzLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBPUlNJICgqIEZMRCAoaV9zciksIEZMRCAoZl91aW1tMTYpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHhvcjogeG9yICRkciwkc3IgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLHhvcikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gWE9SU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHhvcjM6IHhvcjMgJGRyLCRzciwkdWltbTE2ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZix4b3IzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYW5kMy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gWE9SU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3VpbW0xNikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYWRkaTogYWRkaSAkZHIsJHNpbW04ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixhZGRpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkaS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gQUREU0kgKCogRkxEIChpX2RyKSwgRkxEIChmX3NpbW04KSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBhZGR2OiBhZGR2ICRkciwkc3IgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLGFkZHYpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGR2LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBCSSB0ZW1wMTtTSSB0ZW1wMDsKKyAgdGVtcDAgPSBBRERTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOworICB0ZW1wMSA9IEFERE9GU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpLCAwKTsKKyAgeworICAgIFNJIG9wdmFsID0gdGVtcDA7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIEJJIG9wdmFsID0gdGVtcDE7CisgICAgQ1BVIChoX2NvbmQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYWRkdjM6IGFkZHYzICRkciwkc3IsJHNpbW0xNiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsYWRkdjMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGR2My5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2RvIHsKKyAgQkkgdGVtcDE7U0kgdGVtcDA7CisgIHRlbXAwID0gQUREU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3NpbW0xNikpOworICB0ZW1wMSA9IEFERE9GU0kgKCogRkxEIChpX3NyKSwgRkxEIChmX3NpbW0xNiksIDApOworICB7CisgICAgU0kgb3B2YWwgPSB0ZW1wMDsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSB0ZW1wMTsKKyAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBhZGR4OiBhZGR4ICRkciwkc3IgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLGFkZHgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGR4LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBCSSB0ZW1wMTtTSSB0ZW1wMDsKKyAgdGVtcDAgPSBBRERDU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpLCBDUFUgKGhfY29uZCkpOworICB0ZW1wMSA9IEFERENGU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpLCBDUFUgKGhfY29uZCkpOworICB7CisgICAgU0kgb3B2YWwgPSB0ZW1wMDsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgQkkgb3B2YWwgPSB0ZW1wMTsKKyAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBiYzg6IGJjLnMgJGRpc3A4ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixiYzgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JjOC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitpZiAoQ1BVIChoX2NvbmQpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDgpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJjMjQ6IGJjLmwgJGRpc3AyNCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsYmMyNCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmMyNC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoQ1BVIChoX2NvbmQpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDI0KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBiZXE6IGJlcSAkc3JjMSwkc3JjMiwkZGlzcDE2ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixiZXEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoRVFTSSAoKiBGTEQgKGlfc3JjMSksICogRkxEIChpX3NyYzIpKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3AxNik7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYmVxejogYmVxeiAkc3JjMiwkZGlzcDE2ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixiZXF6KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iZXF6LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChFUVNJICgqIEZMRCAoaV9zcmMyKSwgMCkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJnZXo6IGJnZXogJHNyYzIsJGRpc3AxNiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsYmdleikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmVxei5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoR0VTSSAoKiBGTEQgKGlfc3JjMiksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDE2KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBiZ3R6OiBiZ3R6ICRzcmMyLCRkaXNwMTYgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLGJndHopIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcXouZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKEdUU0kgKCogRkxEIChpX3NyYzIpLCAwKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3AxNik7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYmxlejogYmxleiAkc3JjMiwkZGlzcDE2ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixibGV6KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iZXF6LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChMRVNJICgqIEZMRCAoaV9zcmMyKSwgMCkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMTYpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJsdHo6IGJsdHogJHNyYzIsJGRpc3AxNiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsYmx0eikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmVxei5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoTFRTSSAoKiBGTEQgKGlfc3JjMiksIDApKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDE2KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBibmV6OiBibmV6ICRzcmMyLCRkaXNwMTYgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLGJuZXopIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JlcXouZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKE5FU0kgKCogRkxEIChpX3NyYzIpLCAwKSkgeworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3AxNik7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYmw4OiBibC5zICRkaXNwOCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsYmw4KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ibDguZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAoQU5EU0kgKHBjLCAtNCksIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwOCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQ0FDSEUgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjLCBTRU1fQlJBTkNIX0FERFJfQ0FDSEUgKHNlbV9hcmcpKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBibDI0OiBibC5sICRkaXNwMjQgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLGJsMjQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JsMjQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworZG8geworICB7CisgICAgU0kgb3B2YWwgPSBBRERTSSAocGMsIDQpOworICAgIENQVSAoaF9nclsoKFVJTlQpIDE0KV0pID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImdyLTE0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMjQpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogYm5jODogYm5jLnMgJGRpc3A4ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixibmM4KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9iYzguZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworaWYgKE5PVEJJIChDUFUgKGhfY29uZCkpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDgpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJuYzI0OiBibmMubCAkZGlzcDI0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixibmMyNCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmMyNC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCitpZiAoTk9UQkkgKENQVSAoaF9jb25kKSkpIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMjQpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgd3JpdHRlbiB8PSAoMSA8PCAyKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorfQorCisgIGFidWYtPndyaXR0ZW4gPSB3cml0dGVuOworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGJuZTogYm5lICRzcmMxLCRzcmMyLCRkaXNwMTYgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLGJuZSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuY3RpLmZpZWxkcy5mbXRfYmVxLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpKSB7CisgIHsKKyAgICBVU0kgb3B2YWwgPSBGTEQgKGlfZGlzcDE2KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBicmE4OiBicmEucyAkZGlzcDggKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLGJyYTgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JyYTguZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgVVNJIG9wdmFsID0gRkxEIChpX2Rpc3A4KTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9DQUNIRSAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMsIFNFTV9CUkFOQ0hfQUREUl9DQUNIRSAoc2VtX2FyZykpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBicmEyNDogYnJhLmwgJGRpc3AyNCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsYnJhMjQpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2JyYTI0LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFVTSSBvcHZhbCA9IEZMRCAoaV9kaXNwMjQpOworICAgIFNFTV9CUkFOQ0hfVklBX0NBQ0hFIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYywgU0VNX0JSQU5DSF9BRERSX0NBQ0hFIChzZW1fYXJnKSk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNtcDogY21wICRzcmMxLCRzcmMyICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixjbXApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXAuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX3NyYzEpLCAqIEZMRCAoaV9zcmMyKSk7CisgICAgQ1BVIChoX2NvbmQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNtcGk6IGNtcGkgJHNyYzIsJHNpbW0xNiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsY21waSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2NtcGkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBCSSBvcHZhbCA9IExUU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc2ltbTE2KSk7CisgICAgQ1BVIChoX2NvbmQpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImNvbmRiaXQiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGNtcHU6IGNtcHUgJHNyYzEsJHNyYzIgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLGNtcHUpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXAuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBCSSBvcHZhbCA9IExUVVNJICgqIEZMRCAoaV9zcmMxKSwgKiBGTEQgKGlfc3JjMikpOworICAgIENQVSAoaF9jb25kKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBjbXB1aTogY21wdWkgJHNyYzIsJHNpbW0xNiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsY21wdWkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9jbXBpLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgQkkgb3B2YWwgPSBMVFVTSSAoKiBGTEQgKGlfc3JjMiksIEZMRCAoZl9zaW1tMTYpKTsKKyAgICBDUFUgKGhfY29uZCkgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY29uZGJpdCIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogZGl2OiBkaXYgJGRyLCRzciAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsZGl2KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZGl2LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKE5FU0kgKCogRkxEIChpX3NyKSwgMCkpIHsKKyAgeworICAgIFNJIG9wdmFsID0gRElWU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGRpdnU6IGRpdnUgJGRyLCRzciAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsZGl2dSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rpdi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJICgqIEZMRCAoaV9zciksIDApKSB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFVESVZTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogcmVtOiByZW0gJGRyLCRzciAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYscmVtKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfZGl2LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworaWYgKE5FU0kgKCogRkxEIChpX3NyKSwgMCkpIHsKKyAgeworICAgIFNJIG9wdmFsID0gTU9EU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICB3cml0dGVuIHw9ICgxIDw8IDIpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9Cit9CisKKyAgYWJ1Zi0+d3JpdHRlbiA9IHdyaXR0ZW47CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHJlbXU6IHJlbXUgJGRyLCRzciAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYscmVtdSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2Rpdi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKK2lmIChORVNJICgqIEZMRCAoaV9zciksIDApKSB7CisgIHsKKyAgICBTSSBvcHZhbCA9IFVNT0RTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgMik7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30KKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogamw6IGpsICRzciAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsamwpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2psLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgVVNJIHRlbXAxO1NJIHRlbXAwOworICB0ZW1wMCA9IEFERFNJIChBTkRTSSAocGMsIC00KSwgNCk7CisgIHRlbXAxID0gQU5EU0kgKCogRkxEIChpX3NyKSwgLTQpOworICB7CisgICAgU0kgb3B2YWwgPSB0ZW1wMDsKKyAgICBDUFUgKGhfZ3JbKChVSU5UKSAxNCldKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJnci0xNCIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBVU0kgb3B2YWwgPSB0ZW1wMTsKKyAgICBTRU1fQlJBTkNIX1ZJQV9BRERSIChjdXJyZW50X2NwdSwgc2VtX2FyZywgb3B2YWwsIHZwYyk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInBjIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogam1wOiBqbXAgJHNyICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixqbXApIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmN0aS5maWVsZHMuZm10X2ptcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fQlJBTkNIX0lOSVQKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBVU0kgb3B2YWwgPSBBTkRTSSAoKiBGTEQgKGlfc3IpLCAtNCk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9CisKKyAgU0VNX0JSQU5DSF9GSU5JICh2cGMpOworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZDogbGQgJGRyLEAkc3IgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLGxkKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZC1kOiBsZCAkZHIsQCgkc2xvMTYsJHNyKSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsbGRfZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkX2QuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9zciksIEZMRCAoZl9zaW1tMTYpKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZGI6IGxkYiAkZHIsQCRzciAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsbGRiKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRiLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBFWFRRSVNJIChHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcikpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkYi1kOiBsZGIgJGRyLEAoJHNsbzE2LCRzcikgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLGxkYl9kKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRiX2QuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEVYVFFJU0kgKEdFVE1FTVFJIChjdXJyZW50X2NwdSwgcGMsIEFERFNJICgqIEZMRCAoaV9zciksIEZMRCAoZl9zaW1tMTYpKSkpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRoOiBsZGggJGRyLEAkc3IgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLGxkaCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gRVhUSElTSSAoR0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3IpKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZGgtZDogbGRoICRkcixAKCRzbG8xNiwkc3IpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixsZGhfZCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkaF9kLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBFWFRISVNJIChHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfc2ltbTE2KSkpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkdWI6IGxkdWIgJGRyLEAkc3IgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLGxkdWIpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGIuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFpFWFRRSVNJIChHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcikpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkdWItZDogbGR1YiAkZHIsQCgkc2xvMTYsJHNyKSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsbGR1Yl9kKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRiX2QuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFpFWFRRSVNJIChHRVRNRU1RSSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfc2ltbTE2KSkpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkdWg6IGxkdWggJGRyLEAkc3IgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLGxkdWgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGguZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFpFWFRISVNJIChHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcikpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkdWgtZDogbGR1aCAkZHIsQCgkc2xvMTYsJHNyKSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsbGR1aF9kKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGRoX2QuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFpFWFRISVNJIChHRVRNRU1ISSAoY3VycmVudF9jcHUsIHBjLCBBRERTSSAoKiBGTEQgKGlfc3IpLCBGTEQgKGZfc2ltbTE2KSkpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIGxkLXBsdXM6IGxkICRkcixAJHNyKyAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsbGRfcGx1cykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2xkX3BsdXMuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIFNJIHRlbXAxO1NJIHRlbXAwOworICB0ZW1wMCA9IEdFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyKSk7CisgIHRlbXAxID0gQUREU0kgKCogRkxEIChpX3NyKSwgNCk7CisgIHsKKyAgICBTSSBvcHZhbCA9IHRlbXAwOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBTSSBvcHZhbCA9IHRlbXAxOworICAgICogRkxEIChpX3NyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJzciIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZDI0OiBsZDI0ICRkciwkdWltbTI0ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixsZDI0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbGQyNC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gRkxEIChpX3VpbW0yNCk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsZGk4OiBsZGk4ICRkciwkc2ltbTggKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLGxkaTgpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGk4LmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBGTEQgKGZfc2ltbTgpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbGRpMTY6IGxkaTE2ICRkciwkaGFzaCRzbG8xNiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsbGRpMTYpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9sZGkxNi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gRkxEIChmX3NpbW0xNik7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBsb2NrOiBsb2NrICRkcixAJHNyICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixsb2NrKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbG9jay5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIEJJIG9wdmFsID0gMTsKKyAgICBDUFUgKGhfbG9jaykgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibG9jay0wIiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gR0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3IpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbWFjaGk6IG1hY2hpICRzcmMxLCRzcmMyICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixtYWNoaSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X21hY2hpLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgREkgb3B2YWwgPSBTUkFESSAoU0xMREkgKEFERERJIChHRVRfSF9BQ0NVTSAoKSwgTVVMREkgKEVYVFNJREkgKEFORFNJICgqIEZMRCAoaV9zcmMxKSwgMHhmZmZmMDAwMCkpLCBFWFRISURJIChUUlVOQ1NJSEkgKFNSQVNJICgqIEZMRCAoaV9zcmMyKSwgMTYpKSkpKSwgOCksIDgpOworICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtYWNsbzogbWFjbG8gJHNyYzEsJHNyYzIgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLG1hY2xvKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbWFjaGkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoQUREREkgKEdFVF9IX0FDQ1VNICgpLCBNVUxESSAoRVhUU0lESSAoU0xMU0kgKCogRkxEIChpX3NyYzEpLCAxNikpLCBFWFRISURJIChUUlVOQ1NJSEkgKCogRkxEIChpX3NyYzIpKSkpKSwgOCksIDgpOworICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtYWN3aGk6IG1hY3doaSAkc3JjMSwkc3JjMiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsbWFjd2hpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbWFjaGkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoQUREREkgKEdFVF9IX0FDQ1VNICgpLCBNVUxESSAoRVhUU0lESSAoKiBGTEQgKGlfc3JjMSkpLCBFWFRISURJIChUUlVOQ1NJSEkgKFNSQVNJICgqIEZMRCAoaV9zcmMyKSwgMTYpKSkpKSwgOCksIDgpOworICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtYWN3bG86IG1hY3dsbyAkc3JjMSwkc3JjMiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsbWFjd2xvKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbWFjaGkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoQUREREkgKEdFVF9IX0FDQ1VNICgpLCBNVUxESSAoRVhUU0lESSAoKiBGTEQgKGlfc3JjMSkpLCBFWFRISURJIChUUlVOQ1NJSEkgKCogRkxEIChpX3NyYzIpKSkpKSwgOCksIDgpOworICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtdWw6IG11bCAkZHIsJHNyICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixtdWwpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE1VTFNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtdWxoaTogbXVsaGkgJHNyYzEsJHNyYzIgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLG11bGhpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsaGkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoTVVMREkgKEVYVFNJREkgKEFORFNJICgqIEZMRCAoaV9zcmMxKSwgMHhmZmZmMDAwMCkpLCBFWFRISURJIChUUlVOQ1NJSEkgKFNSQVNJICgqIEZMRCAoaV9zcmMyKSwgMTYpKSkpLCAxNiksIDE2KTsKKyAgICBTRVRfSF9BQ0NVTSAob3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2N1bSIsICdEJywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbXVsbG86IG11bGxvICRzcmMxLCRzcmMyICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixtdWxsbykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X211bGhpLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgREkgb3B2YWwgPSBTUkFESSAoU0xMREkgKE1VTERJIChFWFRTSURJIChTTExTSSAoKiBGTEQgKGlfc3JjMSksIDE2KSksIEVYVEhJREkgKFRSVU5DU0lISSAoKiBGTEQgKGlfc3JjMikpKSksIDE2KSwgMTYpOworICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtdWx3aGk6IG11bHdoaSAkc3JjMSwkc3JjMiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsbXVsd2hpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsaGkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoTVVMREkgKEVYVFNJREkgKCogRkxEIChpX3NyYzEpKSwgRVhUSElESSAoVFJVTkNTSUhJIChTUkFTSSAoKiBGTEQgKGlfc3JjMiksIDE2KSkpKSwgOCksIDgpOworICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtdWx3bG86IG11bHdsbyAkc3JjMSwkc3JjMiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsbXVsd2xvKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXVsaGkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAoTVVMREkgKEVYVFNJREkgKCogRkxEIChpX3NyYzEpKSwgRVhUSElESSAoVFJVTkNTSUhJICgqIEZMRCAoaV9zcmMyKSkpKSwgOCksIDgpOworICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtdjogbXYgJGRyLCRzciAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsbXYpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3IpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbXZmYWNoaTogbXZmYWNoaSAkZHIgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLG12ZmFjaGkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdmZhY2hpLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBUUlVOQ0RJU0kgKFNSQURJIChHRVRfSF9BQ0NVTSAoKSwgMzIpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG12ZmFjbG86IG12ZmFjbG8gJGRyICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixtdmZhY2xvKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXZmYWNoaS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gVFJVTkNESVNJIChHRVRfSF9BQ0NVTSAoKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtdmZhY21pOiBtdmZhY21pICRkciAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsbXZmYWNtaSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X212ZmFjaGkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFRSVU5DRElTSSAoU1JBREkgKEdFVF9IX0FDQ1VNICgpLCAxNikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbXZmYzogbXZmYyAkZHIsJHNjciAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsbXZmYykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X212ZmMuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IEdFVF9IX0NSIChGTEQgKGZfcjIpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG12dGFjaGk6IG12dGFjaGkgJHNyYzEgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLG12dGFjaGkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdnRhY2hpLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgREkgb3B2YWwgPSBPUkRJIChBTkRESSAoR0VUX0hfQUNDVU0gKCksIE1BS0VESSAoMCwgMHhmZmZmZmZmZikpLCBTTExESSAoRVhUU0lESSAoKiBGTEQgKGlfc3JjMSkpLCAzMikpOworICAgIFNFVF9IX0FDQ1VNIChvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImFjY3VtIiwgJ0QnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBtdnRhY2xvOiBtdnRhY2xvICRzcmMxICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixtdnRhY2xvKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXZ0YWNoaS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIERJIG9wdmFsID0gT1JESSAoQU5EREkgKEdFVF9IX0FDQ1VNICgpLCBNQUtFREkgKDB4ZmZmZmZmZmYsIDApKSwgWkVYVFNJREkgKCogRkxEIChpX3NyYzEpKSk7CisgICAgU0VUX0hfQUNDVU0gKG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW0iLCAnRCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIG12dGM6IG12dGMgJHNyLCRkY3IgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLG12dGMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdnRjLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgVVNJIG9wdmFsID0gKiBGTEQgKGlfc3IpOworICAgIFNFVF9IX0NSIChGTEQgKGZfcjEpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRjciIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbmVnOiBuZWcgJGRyLCRzciAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsbmVnKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfbXYuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IE5FR1NJICgqIEZMRCAoaV9zcikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogbm9wOiBub3AgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLG5vcCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X25vcC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK1BST0ZJTEVfQ09VTlRfRklMTE5PUFMgKGN1cnJlbnRfY3B1LCBhYnVmLT5hZGRyKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBub3Q6IG5vdCAkZHIsJHNyICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixub3QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9tdi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gSU5WU0kgKCogRkxEIChpX3NyKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiByYWM6IHJhYyAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYscmFjKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfcmFjLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICBESSB0bXBfdG1wMTsKKyAgdG1wX3RtcDEgPSBTTExESSAoR0VUX0hfQUNDVU0gKCksIDEpOworICB0bXBfdG1wMSA9IEFERERJICh0bXBfdG1wMSwgTUFLRURJICgwLCAzMjc2OCkpOworICB7CisgICAgREkgb3B2YWwgPSAoR1RESSAodG1wX3RtcDEsIE1BS0VESSAoMzI3NjcsIDB4ZmZmZjAwMDApKSkgPyAoTUFLRURJICgzMjc2NywgMHhmZmZmMDAwMCkpIDogKExUREkgKHRtcF90bXAxLCBNQUtFREkgKDB4ZmZmZjgwMDAsIDApKSkgPyAoTUFLRURJICgweGZmZmY4MDAwLCAwKSkgOiAoQU5EREkgKHRtcF90bXAxLCBNQUtFREkgKDB4ZmZmZmZmZmYsIDB4ZmZmZjAwMDApKSk7CisgICAgU0VUX0hfQUNDVU0gKG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYWNjdW0iLCAnRCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogcmFjaDogcmFjaCAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYscmFjaCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3JhYy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgREkgdG1wX3RtcDE7CisgIHRtcF90bXAxID0gQU5EREkgKEdFVF9IX0FDQ1VNICgpLCBNQUtFREkgKDE2Nzc3MjE1LCAweGZmZmZmZmZmKSk7CitpZiAoQU5ESUYgKEdFREkgKHRtcF90bXAxLCBNQUtFREkgKDE2MzgzLCAweDgwMDAwMDAwKSksIExFREkgKHRtcF90bXAxLCBNQUtFREkgKDgzODg2MDcsIDB4ZmZmZmZmZmYpKSkpIHsKKyAgdG1wX3RtcDEgPSBNQUtFREkgKDE2MzgzLCAweDgwMDAwMDAwKTsKK30gZWxzZSB7CitpZiAoQU5ESUYgKEdFREkgKHRtcF90bXAxLCBNQUtFREkgKDgzODg2MDgsIDApKSwgTEVESSAodG1wX3RtcDEsIE1BS0VESSAoMTY3NjA4MzIsIDApKSkpIHsKKyAgdG1wX3RtcDEgPSBNQUtFREkgKDE2NzYwODMyLCAwKTsKK30gZWxzZSB7CisgIHRtcF90bXAxID0gQU5EREkgKEFERERJIChHRVRfSF9BQ0NVTSAoKSwgTUFLRURJICgwLCAxMDczNzQxODI0KSksIE1BS0VESSAoMHhmZmZmZmZmZiwgMHg4MDAwMDAwMCkpOworfQorfQorICB0bXBfdG1wMSA9IFNMTERJICh0bXBfdG1wMSwgMSk7CisgIHsKKyAgICBESSBvcHZhbCA9IFNSQURJIChTTExESSAodG1wX3RtcDEsIDcpLCA3KTsKKyAgICBTRVRfSF9BQ0NVTSAob3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJhY2N1bSIsICdEJywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBydGU6IHJ0ZSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYscnRlKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF9ydGUuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX0JSQU5DSF9JTklUCisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworICB7CisgICAgVVNJIG9wdmFsID0gQU5EU0kgKEdFVF9IX0NSICgoKFVJTlQpIDYpKSwgLTQpOworICAgIFNFTV9CUkFOQ0hfVklBX0FERFIgKGN1cnJlbnRfY3B1LCBzZW1fYXJnLCBvcHZhbCwgdnBjKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicGMiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgVVNJIG9wdmFsID0gR0VUX0hfQ1IgKCgoVUlOVCkgMTQpKTsKKyAgICBTRVRfSF9DUiAoKChVSU5UKSA2KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjci02IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFVRSSBvcHZhbCA9IENQVSAoaF9icHN3KTsKKyAgICBTRVRfSF9QU1cgKG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicHN3LTAiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgVVFJIG9wdmFsID0gQ1BVIChoX2JicHN3KTsKKyAgICBDUFUgKGhfYnBzdykgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiYnBzdy0wIiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIFNFTV9CUkFOQ0hfRklOSSAodnBjKTsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc2V0aDogc2V0aCAkZHIsJGhhc2gkaGkxNiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsc2V0aCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3NldGguZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFNMTFNJIChGTEQgKGZfaGkxNiksIDE2KTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHNsbDogc2xsICRkciwkc3IgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLHNsbCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gU0xMU0kgKCogRkxEIChpX2RyKSwgQU5EU0kgKCogRkxEIChpX3NyKSwgMzEpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHNsbDM6IHNsbDMgJGRyLCRzciwkc2ltbTE2ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixzbGwzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc2xsMy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gU0xMU0kgKCogRkxEIChpX3NyKSwgQU5EU0kgKEZMRCAoZl9zaW1tMTYpLCAzMSkpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc2xsaTogc2xsaSAkZHIsJHVpbW01ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixzbGxpKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc2xsaS5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFNJIG9wdmFsID0gU0xMU0kgKCogRkxEIChpX2RyKSwgRkxEIChmX3VpbW01KSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzcmE6IHNyYSAkZHIsJHNyICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixzcmEpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9hZGQuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFNSQVNJICgqIEZMRCAoaV9kciksIEFORFNJICgqIEZMRCAoaV9zciksIDMxKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzcmEzOiBzcmEzICRkciwkc3IsJHNpbW0xNiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsc3JhMykgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3NsbDMuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDQpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFNSQVNJICgqIEZMRCAoaV9zciksIEFORFNJIChGTEQgKGZfc2ltbTE2KSwgMzEpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHNyYWk6IHNyYWkgJGRyLCR1aW1tNSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsc3JhaSkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3NsbGkuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9IFNSQVNJICgqIEZMRCAoaV9kciksIEZMRCAoZl91aW1tNSkpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3JsOiBzcmwgJGRyLCRzciAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsc3JsKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTUkxTSSAoKiBGTEQgKGlfZHIpLCBBTkRTSSAoKiBGTEQgKGlfc3IpLCAzMSkpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3JsMzogc3JsMyAkZHIsJHNyLCRzaW1tMTYgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLHNybDMpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zbGwzLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCA0KTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTUkxTSSAoKiBGTEQgKGlfc3IpLCBBTkRTSSAoRkxEIChmX3NpbW0xNiksIDMxKSk7CisgICAgKiBGTEQgKGlfZHIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImRyIiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzcmxpOiBzcmxpICRkciwkdWltbTUgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLHNybGkpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zbGxpLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTUkxTSSAoKiBGTEQgKGlfZHIpLCBGTEQgKGZfdWltbTUpKTsKKyAgICAqIEZMRCAoaV9kcikgPSBvcHZhbDsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiZHIiLCAneCcsIG9wdmFsKTsKKyAgfQorCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN0OiBzdCAkc3JjMSxAJHNyYzIgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLHN0KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3QuZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCisgIHsKKyAgICBTSSBvcHZhbCA9ICogRkxEIChpX3NyYzEpOworICAgIFNFVE1FTVNJIChjdXJyZW50X2NwdSwgcGMsICogRkxEIChpX3NyYzIpLCBvcHZhbCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3QtZDogc3QgJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixzdF9kKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFNJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7CisgICAgU0VUTUVNU0kgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc2ltbTE2KSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdGI6IHN0YiAkc3JjMSxAJHNyYzIgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLHN0YikgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0Yi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIFFJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3JjMiksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdGItZDogc3RiICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsc3RiX2QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGJfZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIFFJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7CisgICAgU0VUTUVNUUkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc2ltbTE2KSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdGg6IHN0aCAkc3JjMSxAJHNyYzIgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLHN0aCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X3N0aC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKKyAgeworICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7CisgICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgKiBGTEQgKGlfc3JjMiksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdGgtZDogc3RoICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsc3RoX2QpIChTSU1fQ1BVICpjdXJyZW50X2NwdSwgU0VNX0FSRyBzZW1fYXJnKQoreworI2RlZmluZSBGTEQoZikgYWJ1Zi0+ZmllbGRzLmZtdF9zdGhfZC5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgNCk7CisKKyAgeworICAgIEhJIG9wdmFsID0gKiBGTEQgKGlfc3JjMSk7CisgICAgU0VUTUVNSEkgKGN1cnJlbnRfY3B1LCBwYywgQUREU0kgKCogRkxEIChpX3NyYzIpLCBGTEQgKGZfc2ltbTE2KSksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKworICByZXR1cm4gdnBjOworI3VuZGVmIEZMRAorfQorCisvKiBzdC1wbHVzOiBzdCAkc3JjMSxAKyRzcmMyICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixzdF9wbHVzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfcGx1cy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgU0kgdG1wX25ld19zcmMyOworICB0bXBfbmV3X3NyYzIgPSBBRERTSSAoKiBGTEQgKGlfc3JjMiksIDQpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfbmV3X3NyYzIsIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gdG1wX25ld19zcmMyOworICAgICogRkxEIChpX3NyYzIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInNyYzIiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3QtbWludXM6IHN0ICRzcmMxLEAtJHNyYzIgKi8KKworU0VNX1BDCitTRU1fRk5fTkFNRSAobTMycmJmLHN0X21pbnVzKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfc3RfcGx1cy5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgU0kgdG1wX25ld19zcmMyOworICB0bXBfbmV3X3NyYzIgPSBTVUJTSSAoKiBGTEQgKGlfc3JjMiksIDQpOworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCB0bXBfbmV3X3NyYzIsIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAibWVtb3J5IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFNJIG9wdmFsID0gdG1wX25ld19zcmMyOworICAgICogRkxEIChpX3NyYzIpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgInNyYzIiLCAneCcsIG9wdmFsKTsKKyAgfQorfSB3aGlsZSAoMCk7CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3ViOiBzdWIgJGRyLCRzciAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsc3ViKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworICB7CisgICAgU0kgb3B2YWwgPSBTVUJTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zcikpOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKworLyogc3Vidjogc3VidiAkZHIsJHNyICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZixzdWJ2KSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfYWRkdi5mCisgIEFSR0JVRiAqYWJ1ZiA9IFNFTV9BUkdCVUYgKHNlbV9hcmcpOworICBpbnQgVU5VU0VEIHdyaXR0ZW4gPSAwOworICBJQUREUiBVTlVTRUQgcGMgPSBhYnVmLT5hZGRyOworICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgQkkgdGVtcDE7U0kgdGVtcDA7CisgIHRlbXAwID0gU1VCU0kgKCogRkxEIChpX2RyKSwgKiBGTEQgKGlfc3IpKTsKKyAgdGVtcDEgPSBTVUJPRlNJICgqIEZMRCAoaV9kciksICogRkxEIChpX3NyKSwgMCk7CisgIHsKKyAgICBTSSBvcHZhbCA9IHRlbXAwOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IHRlbXAxOworICAgIENQVSAoaF9jb25kKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHN1Yng6IHN1YnggJGRyLCRzciAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsc3VieCkgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBTRU1fQVJHIHNlbV9hcmcpCit7CisjZGVmaW5lIEZMRChmKSBhYnVmLT5maWVsZHMuZm10X2FkZHguZgorICBBUkdCVUYgKmFidWYgPSBTRU1fQVJHQlVGIChzZW1fYXJnKTsKKyAgaW50IFVOVVNFRCB3cml0dGVuID0gMDsKKyAgSUFERFIgVU5VU0VEIHBjID0gYWJ1Zi0+YWRkcjsKKyAgU0VNX1BDIHZwYyA9IFNFTV9ORVhUX1ZQQyAoc2VtX2FyZywgcGMsIDIpOworCitkbyB7CisgIEJJIHRlbXAxO1NJIHRlbXAwOworICB0ZW1wMCA9IFNVQkNTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zciksIENQVSAoaF9jb25kKSk7CisgIHRlbXAxID0gU1VCQ0ZTSSAoKiBGTEQgKGlfZHIpLCAqIEZMRCAoaV9zciksIENQVSAoaF9jb25kKSk7CisgIHsKKyAgICBTSSBvcHZhbCA9IHRlbXAwOworICAgICogRkxEIChpX2RyKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJkciIsICd4Jywgb3B2YWwpOworICB9CisgIHsKKyAgICBCSSBvcHZhbCA9IHRlbXAxOworICAgIENQVSAoaF9jb25kKSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjb25kYml0IiwgJ3gnLCBvcHZhbCk7CisgIH0KK30gd2hpbGUgKDApOworCisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHRyYXA6IHRyYXAgJHVpbW00ICovCisKK1NFTV9QQworU0VNX0ZOX05BTUUgKG0zMnJiZix0cmFwKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5jdGkuZmllbGRzLmZtdF90cmFwLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9CUkFOQ0hfSU5JVAorICBTRU1fUEMgdnBjID0gU0VNX05FWFRfVlBDIChzZW1fYXJnLCBwYywgMik7CisKK2RvIHsKKyAgeworICAgIFVTSSBvcHZhbCA9IEdFVF9IX0NSICgoKFVJTlQpIDYpKTsKKyAgICBTRVRfSF9DUiAoKChVSU5UKSAxNCksIG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAiY3ItMTQiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgVVNJIG9wdmFsID0gQUREU0kgKHBjLCA0KTsKKyAgICBTRVRfSF9DUiAoKChVSU5UKSA2KSwgb3B2YWwpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJjci02IiwgJ3gnLCBvcHZhbCk7CisgIH0KKyAgeworICAgIFVRSSBvcHZhbCA9IENQVSAoaF9icHN3KTsKKyAgICBDUFUgKGhfYmJwc3cpID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImJicHN3LTAiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgVVFJIG9wdmFsID0gR0VUX0hfUFNXICgpOworICAgIENQVSAoaF9icHN3KSA9IG9wdmFsOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJicHN3LTAiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgVVFJIG9wdmFsID0gQU5EUUkgKEdFVF9IX1BTVyAoKSwgMTI4KTsKKyAgICBTRVRfSF9QU1cgKG9wdmFsKTsKKyAgICBUUkFDRV9SRVNVTFQgKGN1cnJlbnRfY3B1LCBhYnVmLCAicHN3LTAiLCAneCcsIG9wdmFsKTsKKyAgfQorICB7CisgICAgU0kgb3B2YWwgPSBtMzJyX3RyYXAgKGN1cnJlbnRfY3B1LCBwYywgRkxEIChmX3VpbW00KSk7CisgICAgU0VNX0JSQU5DSF9WSUFfQUREUiAoY3VycmVudF9jcHUsIHNlbV9hcmcsIG9wdmFsLCB2cGMpOworICAgIFRSQUNFX1JFU1VMVCAoY3VycmVudF9jcHUsIGFidWYsICJwYyIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBTRU1fQlJBTkNIX0ZJTkkgKHZwYyk7CisgIHJldHVybiB2cGM7CisjdW5kZWYgRkxECit9CisKKy8qIHVubG9jazogdW5sb2NrICRzcmMxLEAkc3JjMiAqLworCitTRU1fUEMKK1NFTV9GTl9OQU1FIChtMzJyYmYsdW5sb2NrKSAoU0lNX0NQVSAqY3VycmVudF9jcHUsIFNFTV9BUkcgc2VtX2FyZykKK3sKKyNkZWZpbmUgRkxEKGYpIGFidWYtPmZpZWxkcy5mbXRfdW5sb2NrLmYKKyAgQVJHQlVGICphYnVmID0gU0VNX0FSR0JVRiAoc2VtX2FyZyk7CisgIGludCBVTlVTRUQgd3JpdHRlbiA9IDA7CisgIElBRERSIFVOVVNFRCBwYyA9IGFidWYtPmFkZHI7CisgIFNFTV9QQyB2cGMgPSBTRU1fTkVYVF9WUEMgKHNlbV9hcmcsIHBjLCAyKTsKKworZG8geworaWYgKENQVSAoaF9sb2NrKSkgeworICB7CisgICAgU0kgb3B2YWwgPSAqIEZMRCAoaV9zcmMxKTsKKyAgICBTRVRNRU1TSSAoY3VycmVudF9jcHUsIHBjLCAqIEZMRCAoaV9zcmMyKSwgb3B2YWwpOworICAgIHdyaXR0ZW4gfD0gKDEgPDwgNCk7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgIm1lbW9yeSIsICd4Jywgb3B2YWwpOworICB9Cit9CisgIHsKKyAgICBCSSBvcHZhbCA9IDA7CisgICAgQ1BVIChoX2xvY2spID0gb3B2YWw7CisgICAgVFJBQ0VfUkVTVUxUIChjdXJyZW50X2NwdSwgYWJ1ZiwgImxvY2stMCIsICd4Jywgb3B2YWwpOworICB9Cit9IHdoaWxlICgwKTsKKworICBhYnVmLT53cml0dGVuID0gd3JpdHRlbjsKKyAgcmV0dXJuIHZwYzsKKyN1bmRlZiBGTEQKK30KKwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvc2ltLWlmLmMgYi9zaW0vbTMyci9zaW0taWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTE2YWY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL20zMnIvc2ltLWlmLmMKQEAgLTAsMCArMSwyODcgQEAKKy8qIE1haW4gc2ltdWxhdG9yIGVudHJ5IHBvaW50cyBzcGVjaWZpYyB0byB0aGUgTTMyUi4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJzaW0tb3B0aW9ucy5oIgorI2luY2x1ZGUgImxpYmliZXJ0eS5oIgorI2luY2x1ZGUgImJmZC5oIgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGZyZWVfc3RhdGUgKFNJTV9ERVNDKTsKK3N0YXRpYyB2b2lkIHByaW50X20zMnJfbWlzY19jcHUgKFNJTV9DUFUgKmNwdSwgaW50IHZlcmJvc2UpOworCisvKiBSZWNvcmRzIHNpbXVsYXRvciBkZXNjcmlwdG9yIHNvIHV0aWxpdGllcyBsaWtlIG0zMnJfZHVtcF9yZWdzIGNhbiBiZQorICAgY2FsbGVkIGZyb20gZ2RiLiAgKi8KK1NJTV9ERVNDIGN1cnJlbnRfc3RhdGU7CisMCisvKiBDb3ZlciBmdW5jdGlvbiBvZiBzaW1fc3RhdGVfZnJlZSB0byBmcmVlIHRoZSBjcHUgYnVmZmVycyBhcyB3ZWxsLiAgKi8KKworc3RhdGljIHZvaWQKK2ZyZWVfc3RhdGUgKFNJTV9ERVNDIHNkKQoreworICBpZiAoU1RBVEVfTU9EVUxFUyAoc2QpICE9IE5VTEwpCisgICAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKKyAgc2ltX2NwdV9mcmVlX2FsbCAoc2QpOworICBzaW1fc3RhdGVfZnJlZSAoc2QpOworfQorCisvKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHNpbXVsYXRvci4gICovCisKK1NJTV9ERVNDCitzaW1fb3BlbiAoa2luZCwgY2FsbGJhY2ssIGFiZmQsIGFyZ3YpCisgICAgIFNJTV9PUEVOX0tJTkQga2luZDsKKyAgICAgaG9zdF9jYWxsYmFjayAqY2FsbGJhY2s7CisgICAgIHN0cnVjdCBfYmZkICphYmZkOworICAgICBjaGFyICoqYXJndjsKK3sKKyAgU0lNX0RFU0Mgc2QgPSBzaW1fc3RhdGVfYWxsb2MgKGtpbmQsIGNhbGxiYWNrKTsKKyAgY2hhciBjOworICBpbnQgaTsKKworICAvKiBUaGUgY3B1IGRhdGEgaXMga2VwdCBpbiBhIHNlcGFyYXRlbHkgYWxsb2NhdGVkIGNodW5rIG9mIG1lbW9yeS4gICovCisgIGlmIChzaW1fY3B1X2FsbG9jX2FsbCAoc2QsIDEsIGNnZW5fY3B1X21heF9leHRyYV9ieXRlcyAoKSkgIT0gU0lNX1JDX09LKQorICAgIHsKKyAgICAgIGZyZWVfc3RhdGUgKHNkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworI2lmIDAgLyogRklYTUU6IHBjIGlzIGluIG1hY2gtc3BlY2lmaWMgc3RydWN0ICovCisgIC8qIEZJWE1FOiB3YXRjaHBvaW50cyBjb2RlIHNob3VsZG4ndCBuZWVkIHRoaXMgKi8KKyAgeworICAgIFNJTV9DUFUgKmN1cnJlbnRfY3B1ID0gU1RBVEVfQ1BVIChzZCwgMCk7CisgICAgU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKS0+cGMgPSAmKFBDKTsKKyAgICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5zaXplb2ZfcGMgPSBzaXplb2YgKFBDKTsKKyAgfQorI2VuZGlmCisKKyAgaWYgKHNpbV9wcmVfYXJndl9pbml0IChzZCwgYXJndlswXSkgIT0gU0lNX1JDX09LKQorICAgIHsKKyAgICAgIGZyZWVfc3RhdGUgKHNkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworI2lmZGVmIEhBVkVfRFZfU09DS1NFUiAvKiBGSVhNRTogd2FzIGRvbmUgZGlmZmVyZW50bHkgYmVmb3JlICovCisgIGlmIChkdl9zb2Nrc2VyX2luc3RhbGwgKHNkKSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgZnJlZV9zdGF0ZSAoc2QpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorI2VuZGlmCisKKyNpZiAwIC8qIEZJWE1FOiAndHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgZG8gdGhpcyAqLworICAvKiBUaGVzZSBvcHRpb25zIG92ZXJyaWRlIGFueSBtb2R1bGUgb3B0aW9ucy4KKyAgICAgT2J2aW91c2x5IGFtYmlndWl0eSBzaG91bGQgYmUgYXZvaWRlZCwgaG93ZXZlciB0aGUgY2FsbGVyIG1heSB3aXNoIHRvCisgICAgIGF1Z21lbnQgdGhlIG1lYW5pbmcgb2YgYW4gb3B0aW9uLiAgKi8KKyAgaWYgKGV4dHJhX29wdGlvbnMgIT0gTlVMTCkKKyAgICBzaW1fYWRkX29wdGlvbl90YWJsZSAoc2QsIGV4dHJhX29wdGlvbnMpOworI2VuZGlmCisKKyAgLyogZ2V0b3B0IHdpbGwgcHJpbnQgdGhlIGVycm9yIG1lc3NhZ2Ugc28gd2UganVzdCBoYXZlIHRvIGV4aXQgaWYgdGhpcyBmYWlscy4KKyAgICAgRklYTUU6IEhtbW0uLi4gIGluIHRoZSBjYXNlIG9mIGdkYiB3ZSBuZWVkIGdldG9wdCB0byBjYWxsCisgICAgIHByaW50X2ZpbHRlcmVkLiAgKi8KKyAgaWYgKHNpbV9wYXJzZV9hcmdzIChzZCwgYXJndikgIT0gU0lNX1JDX09LKQorICAgIHsKKyAgICAgIGZyZWVfc3RhdGUgKHNkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBBbGxvY2F0ZSBhIGhhbmRsZXIgZm9yIHRoZSBjb250cm9sIHJlZ2lzdGVycyBhbmQgb3RoZXIgZGV2aWNlcworICAgICBpZiBubyBtZW1vcnkgZm9yIHRoYXQgcmFuZ2UgaGFzIGJlZW4gYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLgorICAgICBBbGwgYXJlIGFsbG9jYXRlZCBpbiBvbmUgY2h1bmsgdG8ga2VlcCB0aGluZ3MgZnJvbSBiZWluZworICAgICB1bm5lY2Vzc2FyaWx5IGNvbXBsaWNhdGVkLiAgKi8KKyAgaWYgKHNpbV9jb3JlX3JlYWRfYnVmZmVyIChzZCwgTlVMTCwgcmVhZF9tYXAsICZjLCBNMzJSX0RFVklDRV9BRERSLCAxKSA9PSAwKQorICAgIHNpbV9jb3JlX2F0dGFjaCAoc2QsIE5VTEwsCisJCSAgICAgMCAvKmxldmVsKi8sCisJCSAgICAgYWNjZXNzX3JlYWRfd3JpdGUsCisJCSAgICAgMCAvKnNwYWNlID8/PyovLAorCQkgICAgIE0zMlJfREVWSUNFX0FERFIsIE0zMlJfREVWSUNFX0xFTiAvKm5yX2J5dGVzKi8sCisJCSAgICAgMCAvKm1vZHVsbyovLAorCQkgICAgICZtMzJyX2RldmljZXMsCisJCSAgICAgTlVMTCAvKmJ1ZmZlciovKTsKKworICAvKiBBbGxvY2F0ZSBjb3JlIG1hbmFnZWQgbWVtb3J5IGlmIG5vbmUgc3BlY2lmaWVkIGJ5IHVzZXIuCisgICAgIFVzZSBhZGRyZXNzIDQgaGVyZSBpbiBjYXNlIHRoZSB1c2VyIHdhbnRlZCBhZGRyZXNzIDAgdW5tYXBwZWQuICAqLworICBpZiAoc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLCBOVUxMLCByZWFkX21hcCwgJmMsIDQsIDEpID09IDApCisgICAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSByZWdpb24gMCwweCV4IiwgTTMyUl9ERUZBVUxUX01FTV9TSVpFKTsKKworICAvKiBjaGVjayBmb3IvZXN0YWJsaXNoIHRoZSByZWZlcmVuY2UgcHJvZ3JhbSBpbWFnZSAqLworICBpZiAoc2ltX2FuYWx5emVfcHJvZ3JhbSAoc2QsCisJCQkgICAoU1RBVEVfUFJPR19BUkdWIChzZCkgIT0gTlVMTAorCQkJICAgID8gKlNUQVRFX1BST0dfQVJHViAoc2QpCisJCQkgICAgOiBOVUxMKSwKKwkJCSAgIGFiZmQpICE9IFNJTV9SQ19PSykKKyAgICB7CisgICAgICBmcmVlX3N0YXRlIChzZCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogRXN0YWJsaXNoIGFueSByZW1haW5pbmcgY29uZmlndXJhdGlvbiBvcHRpb25zLiAgKi8KKyAgaWYgKHNpbV9jb25maWcgKHNkKSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgZnJlZV9zdGF0ZSAoc2QpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChzaW1fcG9zdF9hcmd2X2luaXQgKHNkKSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgZnJlZV9zdGF0ZSAoc2QpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qIE9wZW4gYSBjb3B5IG9mIHRoZSBjcHUgZGVzY3JpcHRvciB0YWJsZS4gICovCisgIHsKKyAgICBDR0VOX0NQVV9ERVNDIGNkID0gbTMycl9jZ2VuX2NwdV9vcGVuIChTVEFURV9BUkNISVRFQ1RVUkUgKHNkKS0+bWFjaCwKKwkJCQkJICAgQ0dFTl9FTkRJQU5fQklHKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1BST0NFU1NPUlM7ICsraSkKKyAgICAgIHsKKwlTSU1fQ1BVICpjcHUgPSBTVEFURV9DUFUgKHNkLCBpKTsKKwlDUFVfQ1BVX0RFU0MgKGNwdSkgPSBjZDsKKwlDUFVfRElTQVNTRU1CTEVSIChjcHUpID0gc2ltX2NnZW5fZGlzYXNzZW1ibGVfaW5zbjsKKyAgICAgIH0KKyAgICBtMzJyX2NnZW5faW5pdF9kaXMgKGNkKTsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgdmFyaW91cyBjZ2VuIHRoaW5ncyBub3QgZG9uZSBieSBjb21tb24gZnJhbWV3b3JrLgorICAgICBNdXN0IGJlIGRvbmUgYWZ0ZXIgbTMycl9jZ2VuX2NwdV9vcGVuLiAgKi8KKyAgY2dlbl9pbml0IChzZCk7CisKKyAgZm9yIChjID0gMDsgYyA8IE1BWF9OUl9QUk9DRVNTT1JTOyArK2MpCisgICAgeworICAgICAgLyogT25seSBuZWVkZWQgZm9yIHByb2ZpbGluZywgYnV0IHRoZSBzdHJ1Y3R1cmUgbWVtYmVyIGlzIHNtYWxsLiAgKi8KKyAgICAgIG1lbXNldCAoQ1BVX00zMlJfTUlTQ19QUk9GSUxFIChTVEFURV9DUFUgKHNkLCBpKSksIDAsCisJICAgICAgc2l6ZW9mICgqIENQVV9NMzJSX01JU0NfUFJPRklMRSAoU1RBVEVfQ1BVIChzZCwgaSkpKSk7CisgICAgICAvKiBIb29rIGluIGNhbGxiYWNrIGZvciByZXBvcnRpbmcgdGhlc2Ugc3RhdHMgKi8KKyAgICAgIFBST0ZJTEVfSU5GT19DUFVfQ0FMTEJBQ0sgKENQVV9QUk9GSUxFX0RBVEEgKFNUQVRFX0NQVSAoc2QsIGkpKSkKKwk9IHByaW50X20zMnJfbWlzY19jcHU7CisgICAgfQorCisgIC8qIFN0b3JlIGluIGEgZ2xvYmFsIHNvIHRoaW5ncyBsaWtlIHNwYXJjMzJfZHVtcF9yZWdzIGNhbiBiZSBpbnZva2VkCisgICAgIGZyb20gdGhlIGdkYiBjb21tYW5kIGxpbmUuICAqLworICBjdXJyZW50X3N0YXRlID0gc2Q7CisKKyAgcmV0dXJuIHNkOworfQorCit2b2lkCitzaW1fY2xvc2UgKHNkLCBxdWl0dGluZykKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCBxdWl0dGluZzsKK3sKKyAgbTMycl9jZ2VuX2NwdV9jbG9zZSAoQ1BVX0NQVV9ERVNDIChTVEFURV9DUFUgKHNkLCAwKSkpOworICBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoc2QpOworfQorDAorU0lNX1JDCitzaW1fY3JlYXRlX2luZmVyaW9yIChzZCwgYWJmZCwgYXJndiwgZW52cCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIHN0cnVjdCBfYmZkICphYmZkOworICAgICBjaGFyICoqYXJndjsKKyAgICAgY2hhciAqKmVudnA7Cit7CisgIFNJTV9DUFUgKmN1cnJlbnRfY3B1ID0gU1RBVEVfQ1BVIChzZCwgMCk7CisgIFNJTV9BRERSIGFkZHI7CisKKyAgaWYgKGFiZmQgIT0gTlVMTCkKKyAgICBhZGRyID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKKyAgZWxzZQorICAgIGFkZHIgPSAwOworICBzaW1fcGNfc2V0IChjdXJyZW50X2NwdSwgYWRkcik7CisKKyNpZiAwCisgIFNUQVRFX0FSR1YgKHNkKSA9IHNpbV9jb3B5X2FyZ3YgKGFyZ3YpOworICBTVEFURV9FTlZQIChzZCkgPSBzaW1fY29weV9hcmd2IChlbnZwKTsKKyNlbmRpZgorCisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKKy8qIFBST0ZJTEVfQ1BVX0NBTExCQUNLICovCisKK3N0YXRpYyB2b2lkCitwcmludF9tMzJyX21pc2NfY3B1IChTSU1fQ1BVICpjcHUsIGludCB2ZXJib3NlKQoreworICBTSU1fREVTQyBzZCA9IENQVV9TVEFURSAoY3B1KTsKKyAgY2hhciBidWZbMjBdOworCisgIGlmIChDUFVfUFJPRklMRV9GTEFHUyAoY3B1KSBbUFJPRklMRV9JTlNOX0lEWF0pCisgICAgeworICAgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJNaXNjZWxsYW5lb3VzIFN0YXRpc3RpY3NcblxuIik7CisgICAgICBzaW1faW9fcHJpbnRmIChzZCwgIiAgJS0qcyAlc1xuXG4iLAorCQkgICAgIFBST0ZJTEVfTEFCRUxfV0lEVEgsICJGaWxsIG5vcHM6IiwKKwkJICAgICBzaW1fYWRkX2NvbW1hcyAoYnVmLCBzaXplb2YgKGJ1ZiksCisJCQkJICAgICBDUFVfTTMyUl9NSVNDX1BST0ZJTEUgKGNwdSktPmZpbGxub3BfY291bnQpKTsKKyAgICB9Cit9CisKK3ZvaWQKK3NpbV9kb19jb21tYW5kIChzZCwgY21kKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgY2hhciAqY21kOworeyAKKyAgY2hhciAqKmFyZ3Y7CisKKyAgaWYgKGNtZCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBhcmd2ID0gYnVpbGRhcmd2IChjbWQpOworCisgIGlmIChhcmd2WzBdICE9IE5VTEwKKyAgICAgICYmIHN0cmNhc2VjbXAgKGFyZ3ZbMF0sICJpbmZvIikgPT0gMAorICAgICAgJiYgYXJndlsxXSAhPSBOVUxMCisgICAgICAmJiBzdHJuY2FzZWNtcCAoYXJndlsxXSwgInJlZyIsIDMpID09IDApCisgICAgeworICAgICAgU0kgdmFsOworCisgICAgICAvKiBXZSBvbmx5IHN1cHBvcnQgcHJpbnRpbmcgYmJwc3csYmJwYyBoZXJlIGFzIHRoZXJlIGlzIG5vIGVxdWl2YWxlbnQKKwkgZnVuY3Rpb25hbGl0eSBpbiBnZGIuICAqLworICAgICAgaWYgKGFyZ3ZbMl0gPT0gTlVMTCkKKwlzaW1faW9fZXByaW50ZiAoc2QsICJNaXNzaW5nIHJlZ2lzdGVyIGluIGAlcydcbiIsIGNtZCk7CisgICAgICBlbHNlIGlmIChhcmd2WzNdICE9IE5VTEwpCisJc2ltX2lvX2VwcmludGYgKHNkLCAiVG9vIG1hbnkgYXJndW1lbnRzIGluIGAlcydcbiIsIGNtZCk7CisgICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChhcmd2WzJdLCAiYmJwc3ciKSA9PSAwKQorCXsKKwkgIHZhbCA9IGFfbTMycl9oX2NyX2dldCAoU1RBVEVfQ1BVIChzZCwgMCksIEhfQ1JfQkJQU1cpOworCSAgc2ltX2lvX3ByaW50ZiAoc2QsICJiYnBzdyAweCV4ICVkXG4iLCB2YWwsIHZhbCk7CisJfQorICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAoYXJndlsyXSwgImJicGMiKSA9PSAwKQorCXsKKwkgIHZhbCA9IGFfbTMycl9oX2NyX2dldCAoU1RBVEVfQ1BVIChzZCwgMCksIEhfQ1JfQkJQQyk7CisJICBzaW1faW9fcHJpbnRmIChzZCwgImJicGMgMHgleCAlZFxuIiwgdmFsLCB2YWwpOworCX0KKyAgICAgIGVsc2UKKwlzaW1faW9fZXByaW50ZiAoc2QsICJQcmludGluZyBvZiByZWdpc3RlciBgJXMnIG5vdCBzdXBwb3J0ZWQgd2l0aCBgc2ltIGluZm8nXG4iLAorCQkJYXJndlsyXSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKHNpbV9hcmdzX2NvbW1hbmQgKHNkLCBjbWQpICE9IFNJTV9SQ19PSykKKwlzaW1faW9fZXByaW50ZiAoc2QsICJVbmtub3duIHNpbSBjb21tYW5kIGAlcydcbiIsIGNtZCk7CisgICAgfQorCisgIGZyZWVhcmd2IChhcmd2KTsKK30KZGlmZiAtLWdpdCBhL3NpbS9tMzJyL3NpbS1tYWluLmggYi9zaW0vbTMyci9zaW0tbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzZlMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbTMyci9zaW0tbWFpbi5oCkBAIC0wLDAgKzEsODUgQEAKKy8qIE1haW4gaGVhZGVyIGZvciB0aGUgbTMyci4gICovCisKKyNpZm5kZWYgU0lNX01BSU5fSAorI2RlZmluZSBTSU1fTUFJTl9ICisKKyNkZWZpbmUgVVNJTkdfU0lNX0JBU0VfSCAvKiBGSVhNRTogcXVpY2sgaGFjayAqLworCitzdHJ1Y3QgX3NpbV9jcHU7IC8qIEZJWE1FOiBzaG91bGQgYmUgaW4gc2ltLWJhc2ljcy5oICovCit0eXBlZGVmIHN0cnVjdCBfc2ltX2NwdSBTSU1fQ1BVOworCisjaW5jbHVkZSAic3ltY2F0LmgiCisjaW5jbHVkZSAic2ltLWJhc2ljcy5oIgorI2luY2x1ZGUgImNnZW4tdHlwZXMuaCIKKyNpbmNsdWRlICJtMzJyLWRlc2MuaCIKKyNpbmNsdWRlICJtMzJyLW9wYy5oIgorI2luY2x1ZGUgImFyY2guaCIKKworLyogVGhlc2UgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBzaW0tYmFzZS5oLiAgKi8KK3R5cGVkZWYgVVNJIHNpbV9jaWE7CisKKyNkZWZpbmUgQ0lBX0dFVChjcHUpICAgICBDUFVfUENfR0VUIChjcHUpCisjZGVmaW5lIENJQV9TRVQoY3B1LHZhbCkgQ1BVX1BDX1NFVCAoKGNwdSksICh2YWwpKQorCisjZGVmaW5lIFNJTV9FTkdJTkVfSEFMVF9IT09LKHNkLCBjcHUsIGNpYSkgXAorZG8geyBcCisgIGlmIChjcHUpIC8qIG51bGwgaWYgY3RybC1jICovIFwKKyAgICBzaW1fcGNfc2V0ICgoY3B1KSwgKGNpYSkpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTSU1fRU5HSU5FX1JFU1RBUlRfSE9PSyhzZCwgY3B1LCBjaWEpIFwKK2RvIHsgXAorICBzaW1fcGNfc2V0ICgoY3B1KSwgKGNpYSkpOyBcCit9IHdoaWxlICgwKQorCisjaW5jbHVkZSAic2ltLWJhc2UuaCIKKyNpbmNsdWRlICJjZ2VuLXNpbS5oIgorI2luY2x1ZGUgIm0zMnItc2ltLmgiCisjaW5jbHVkZSAib3Bjb2RlL2NnZW4uaCIKKwwKKy8qIFRoZSBfc2ltX2NwdSBzdHJ1Y3QuICAqLworCitzdHJ1Y3QgX3NpbV9jcHUgeworICAvKiBzaW0vY29tbW9uIGNwdSBiYXNlLiAgKi8KKyAgc2ltX2NwdV9iYXNlIGJhc2U7CisKKyAgLyogU3RhdGljIHBhcnRzIG9mIGNnZW4uICAqLworICBDR0VOX0NQVSBjZ2VuX2NwdTsKKworICBNMzJSX01JU0NfUFJPRklMRSBtMzJyX21pc2NfcHJvZmlsZTsKKyNkZWZpbmUgQ1BVX00zMlJfTUlTQ19QUk9GSUxFKGNwdSkgKCYgKGNwdSktPm0zMnJfbWlzY19wcm9maWxlKQorCisgIC8qIENQVSBzcGVjaWZpYyBwYXJ0cyBnbyBoZXJlLgorICAgICBOb3RlIHRoYXQgaW4gZmlsZXMgdGhhdCBkb24ndCBuZWVkIHRvIGFjY2VzcyB0aGVzZSBwaWVjZXMgV0FOVF9DUFVfRk9PCisgICAgIHdvbid0IGJlIGRlZmluZWQgYW5kIHRodXMgdGhlc2UgcGFydHMgd29uJ3QgYXBwZWFyLiAgVGhpcyBpcyBvayBpbiB0aGUKKyAgICAgc2Vuc2UgdGhhdCB0aGluZ3Mgd29yay4gIEl0IGlzIGEgc291cmNlIG9mIGJ1Z3MgdGhvdWdoLgorICAgICBPbmUgaGFzIHRvIG9mIGNvdXJzZSBiZSBjYXJlZnVsIHRvIG5vdCB0YWtlIHRoZSBzaXplIG9mIHRoaXMKKyAgICAgc3RydWN0IGFuZCBubyBzdHJ1Y3R1cmUgbWVtYmVycyBhY2Nlc3NlZCBpbiBub24tY3B1IHNwZWNpZmljIGZpbGVzIGNhbgorICAgICBnbyBhZnRlciBoZXJlLiAgT2ggZm9yIGEgYmV0dGVyIGxhbmd1YWdlLiAgKi8KKyNpZiBkZWZpbmVkIChXQU5UX0NQVV9NMzJSQkYpCisgIE0zMlJCRl9DUFVfREFUQSBjcHVfZGF0YTsKKyNlbmRpZgorfTsKKwwKKy8qIFRoZSBzaW1fc3RhdGUgc3RydWN0LiAgKi8KKworc3RydWN0IHNpbV9zdGF0ZSB7CisgIHNpbV9jcHUgKmNwdTsKKyNkZWZpbmUgU1RBVEVfQ1BVKHNkLCBuKSAoLyomKi8gKHNkKS0+Y3B1KQorCisgIENHRU5fU1RBVEUgY2dlbl9zdGF0ZTsKKworICBzaW1fc3RhdGVfYmFzZSBiYXNlOworfTsKKwwKKy8qIE1pc2MuICAqLworCisvKiBDYXRjaCBhZGRyZXNzIGV4Y2VwdGlvbnMuICAqLworZXh0ZXJuIFNJTV9DT1JFX1NJR05BTF9GTiBtMzJyX2NvcmVfc2lnbmFsOworI2RlZmluZSBTSU1fQ09SRV9TSUdOQUwoU0QsQ1BVLENJQSxNQVAsTlJfQllURVMsQUREUixUUkFOU0ZFUixFUlJPUikgXAorbTMycl9jb3JlX3NpZ25hbCAoKFNEKSwgKENQVSksIChDSUEpLCAoTUFQKSwgKE5SX0JZVEVTKSwgKEFERFIpLCBcCisJCSAgKFRSQU5TRkVSKSwgKEVSUk9SKSkKKworLyogRGVmYXVsdCBtZW1vcnkgc2l6ZS4gICovCisjZGVmaW5lIE0zMlJfREVGQVVMVF9NRU1fU0laRSAweDgwMDAwMCAvKiA4TSAqLworCisjZW5kaWYgLyogU0lNX01BSU5fSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvdGNvbmZpZy5pbiBiL3NpbS9tMzJyL3Rjb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1OTllMwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tMzJyL3Rjb25maWcuaW4KQEAgLTAsMCArMSw0NyBAQAorLyogTTMyUiB0YXJnZXQgY29uZmlndXJhdGlvbiBmaWxlLiAgLSotIEMgLSotICovCisKKyNpZm5kZWYgTTMyUl9UQ09ORklHX0gKKyNkZWZpbmUgTTMyUl9UQ09ORklHX0gKKworLyogRGVmaW5lIHRoaXMgaWYgdGhlIHNpbXVsYXRvciBjYW4gdmFyeSB0aGUgc2l6ZSBvZiBtZW1vcnkuCisgICBTZWUgdGhlIHh4eCBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCisgICBUaGlzIGVuYWJsZXMgdGhlIGAtbSBzaXplJyBvcHRpb24uCisgICBUaGUgbWVtb3J5IHNpemUgaXMgc3RvcmVkIGluIFNUQVRFX01FTV9TSVpFLiAgKi8KKy8qIE5vdCB1c2VkIGZvciBNMzJSIHNpbmNlIHdlIHVzZSB0aGUgbWVtb3J5IG1vZHVsZS4gICovCisvKiAjZGVmaW5lIFNJTV9IQVZFX01FTV9TSVpFICovCisKKy8qIFNlZSBzaW0taGxvYWQuYy4gIFdlIHByb3Blcmx5IGhhbmRsZSBMTUEuICAqLworI2RlZmluZSBTSU1fSEFORExFU19MTUEgMQorCisvKiBGb3IgTVNQUiBzdXBwb3J0LiAgRklYTUU6IHJldmlzaXQuICAqLworI2RlZmluZSBXSVRIX0RFVklDRVMgMQorCisvKiBGSVhNRTogUmV2aXNpdC4gICovCisjaWZkZWYgSEFWRV9EVl9TT0NLU0VSCitNT0RVTEVfSU5TVEFMTF9GTiBkdl9zb2Nrc2VyX2luc3RhbGw7CisjZGVmaW5lIE1PRFVMRV9MSVNUIGR2X3NvY2tzZXJfaW5zdGFsbCwKKyNlbmRpZgorCisjaWYgMAorLyogRW5hYmxlIHdhdGNocG9pbnRzLiAgKi8KKyNkZWZpbmUgV0lUSF9XQVRDSFBPSU5UUyAxCisjZW5kaWYKKworLyogRGVmaW5lIHRoaXMgdG8gZW5hYmxlIHRoZSBpbnRyaW5zaWMgYnJlYWtwb2ludCBtZWNoYW5pc20uICovCisvKiBGSVhNRTogbWF5IGJlIGFibGUgdG8gcmVtb3ZlIFNJTV9IQVZFX0JSRUFLUE9JTlQgc2luY2UgaXQgZXNzZW50aWFsbHkKKyAgIGR1cGxpY2F0ZXMgaWZkZWYgU0lNX0JSRUFLUE9JTlQgKHJpZ2h0PykgKi8KKyNpZiAwCisjZGVmaW5lIFNJTV9IQVZFX0JSRUFLUE9JTlRTCisjZGVmaW5lIFNJTV9CUkVBS1BPSU5UIHsgMHgxMCwgMHhmMSB9CisjZGVmaW5lIFNJTV9CUkVBS1BPSU5UX1NJWkUgMgorI2VuZGlmCisjaWYgMAorI2RlZmluZSBIQVZFX0RWX1NPQ0tTRVIKKyNlbmRpZgorCisvKiBUaGlzIGlzIGEgZ2xvYmFsIHNldHRpbmcuICBEaWZmZXJlbnQgY3B1IGZhbWlsaWVzIGNhbid0IG1peC1uLW1hdGNoIC1zY2FjaGUKKyAgIGFuZCAtcGJiLiAgSG93ZXZlciBzb21lIGNwdSBmYW1pbGllcyBtYXkgdXNlIC1zaW1wbGUgd2hpbGUgb3RoZXJzIHVzZQorICAgb25lIG9mIC1zY2FjaGUvLXBiYi4gICovCisjZGVmaW5lIFdJVEhfU0NBQ0hFX1BCQiAxCisKKyNlbmRpZiAvKiBNMzJSX1RDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvc2ltL20zMnIvdHJhcHMuYyBiL3NpbS9tMzJyL3RyYXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgxYTg2MgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tMzJyL3RyYXBzLmMKQEAgLTAsMCArMSwxNzAgQEAKKy8qIG0zMnIgZXhjZXB0aW9uLCBpbnRlcnJ1cHQsIGFuZCB0cmFwIChFSVQpIHN1cHBvcnQKKyAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAidGFyZy12YWxzLmgiCisKKy8qIFRoZSBzZW1hbnRpYyBjb2RlIGludm9rZXMgdGhpcyBmb3IgaW52YWxpZCAodW5yZWNvZ25pemVkKSBpbnN0cnVjdGlvbnMuICAqLworCit2b2lkCitzaW1fZW5naW5lX2ludmFsaWRfaW5zbiAoU0lNX0NQVSAqY3VycmVudF9jcHUsIElBRERSIGNpYSkKK3sKKyAgU0lNX0RFU0Mgc2QgPSBDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KTsKKworI2lmIDAKKyAgaWYgKFNUQVRFX0VOVklST05NRU5UIChzZCkgPT0gT1BFUkFUSU5HX0VOVklST05NRU5UKQorICAgIHsKKyAgICAgIGhfYnNtX3NldCAoY3VycmVudF9jcHUsIGhfc21fZ2V0IChjdXJyZW50X2NwdSkpOworICAgICAgaF9iaWVfc2V0IChjdXJyZW50X2NwdSwgaF9pZV9nZXQgKGN1cnJlbnRfY3B1KSk7CisgICAgICBoX2Jjb25kX3NldCAoY3VycmVudF9jcHUsIGhfY29uZF9nZXQgKGN1cnJlbnRfY3B1KSk7CisgICAgICAvKiBzbSBub3QgY2hhbmdlZCAqLworICAgICAgaF9pZV9zZXQgKGN1cnJlbnRfY3B1LCAwKTsKKyAgICAgIGhfY29uZF9zZXQgKGN1cnJlbnRfY3B1LCAwKTsKKworICAgICAgaF9icGNfc2V0IChjdXJyZW50X2NwdSwgY2lhKTsKKworICAgICAgc2ltX2VuZ2luZV9yZXN0YXJ0IChDUFVfU1RBVEUgKGN1cnJlbnRfY3B1KSwgY3VycmVudF9jcHUsIE5VTEwsCisJCQkgIEVJVF9SU1ZEX0lOU05fQUREUik7CisgICAgfQorICBlbHNlCisjZW5kaWYKKyAgICBzaW1fZW5naW5lX2hhbHQgKHNkLCBjdXJyZW50X2NwdSwgTlVMTCwgY2lhLCBzaW1fc3RvcHBlZCwgU0lNX1NJR0lMTCk7Cit9CisKKy8qIFByb2Nlc3MgYW4gYWRkcmVzcyBleGNlcHRpb24uICAqLworCit2b2lkCittMzJyX2NvcmVfc2lnbmFsIChTSU1fREVTQyBzZCwgU0lNX0NQVSAqY3VycmVudF9jcHUsIHNpbV9jaWEgY2lhLAorCQkgIHVuc2lnbmVkIGludCBtYXAsIGludCBucl9ieXRlcywgYWRkcmVzc193b3JkIGFkZHIsCisJCSAgdHJhbnNmZXJfdHlwZSB0cmFuc2Zlciwgc2ltX2NvcmVfc2lnbmFscyBzaWcpCit7CisgIGlmIChTVEFURV9FTlZJUk9OTUVOVCAoc2QpID09IE9QRVJBVElOR19FTlZJUk9OTUVOVCkKKyAgICB7CisgICAgICBhX20zMnJfaF9jcl9zZXQgKGN1cnJlbnRfY3B1LCBIX0NSX0JCUEMsCisJCSAgICAgICBhX20zMnJfaF9jcl9nZXQgKGN1cnJlbnRfY3B1LCBIX0NSX0JQQykpOworICAgICAgYV9tMzJyX2hfYnBzd19zZXQgKGN1cnJlbnRfY3B1LCBhX20zMnJfaF9wc3dfZ2V0IChjdXJyZW50X2NwdSkpOworICAgICAgLyogc20gbm90IGNoYW5nZWQgKi8KKyAgICAgIGFfbTMycl9oX3Bzd19zZXQgKGN1cnJlbnRfY3B1LCBhX20zMnJfaF9wc3dfZ2V0IChjdXJyZW50X2NwdSkgJiAweDgwKTsKKyAgICAgIGFfbTMycl9oX2NyX3NldCAoY3VycmVudF9jcHUsIEhfQ1JfQlBDLCBjaWEpOworCisgICAgICBzaW1fZW5naW5lX3Jlc3RhcnQgKENQVV9TVEFURSAoY3VycmVudF9jcHUpLCBjdXJyZW50X2NwdSwgTlVMTCwKKwkJCSAgRUlUX0FERFJfRVhDUF9BRERSKTsKKyAgICB9CisgIGVsc2UKKyAgICBzaW1fY29yZV9zaWduYWwgKHNkLCBjdXJyZW50X2NwdSwgY2lhLCBtYXAsIG5yX2J5dGVzLCBhZGRyLAorCQkgICAgIHRyYW5zZmVyLCBzaWcpOworfQorDAorLyogUmVhZC93cml0ZSBmdW5jdGlvbnMgZm9yIHN5c3RlbSBjYWxsIGludGVyZmFjZS4gICovCisKK3N0YXRpYyBpbnQKK3N5c2NhbGxfcmVhZF9tZW0gKGhvc3RfY2FsbGJhY2sgKmNiLCBzdHJ1Y3QgY2Jfc3lzY2FsbCAqc2MsCisJCSAgdW5zaWduZWQgbG9uZyB0YWRkciwgY2hhciAqYnVmLCBpbnQgYnl0ZXMpCit7CisgIFNJTV9ERVNDIHNkID0gKFNJTV9ERVNDKSBzYy0+cDE7CisgIFNJTV9DUFUgKmNwdSA9IChTSU1fQ1BVICopIHNjLT5wMjsKKworICByZXR1cm4gc2ltX2NvcmVfcmVhZF9idWZmZXIgKHNkLCBjcHUsIHJlYWRfbWFwLCBidWYsIHRhZGRyLCBieXRlcyk7Cit9CisKK3N0YXRpYyBpbnQKK3N5c2NhbGxfd3JpdGVfbWVtIChob3N0X2NhbGxiYWNrICpjYiwgc3RydWN0IGNiX3N5c2NhbGwgKnNjLAorCQkgICB1bnNpZ25lZCBsb25nIHRhZGRyLCBjb25zdCBjaGFyICpidWYsIGludCBieXRlcykKK3sKKyAgU0lNX0RFU0Mgc2QgPSAoU0lNX0RFU0MpIHNjLT5wMTsKKyAgU0lNX0NQVSAqY3B1ID0gKFNJTV9DUFUgKikgc2MtPnAyOworCisgIHJldHVybiBzaW1fY29yZV93cml0ZV9idWZmZXIgKHNkLCBjcHUsIHdyaXRlX21hcCwgYnVmLCB0YWRkciwgYnl0ZXMpOworfQorCisvKiBUcmFwIHN1cHBvcnQuCisgICBUaGUgcmVzdWx0IGlzIHRoZSBwYyBhZGRyZXNzIHRvIGNvbnRpbnVlIGF0LgorICAgUHJlcHJvY2Vzc2luZyBsaWtlIHNhdmluZyB0aGUgdmFyaW91cyByZWdpc3RlcnMgaGFzIGFscmVhZHkgYmVlbiBkb25lLiAgKi8KKworVVNJCittMzJyX3RyYXAgKFNJTV9DUFUgKmN1cnJlbnRfY3B1LCBQQ0FERFIgcGMsIGludCBudW0pCit7CisgIFNJTV9ERVNDIHNkID0gQ1BVX1NUQVRFIChjdXJyZW50X2NwdSk7CisgIGhvc3RfY2FsbGJhY2sgKmNiID0gU1RBVEVfQ0FMTEJBQ0sgKHNkKTsKKworI2lmZGVmIFNJTV9IQVZFX0JSRUFLUE9JTlRTCisgIC8qIENoZWNrIGZvciBicmVha3BvaW50cyAib3duZWQiIGJ5IHRoZSBzaW11bGF0b3IgZmlyc3QsIHJlZ2FyZGxlc3MKKyAgICAgb2YgLS1lbnZpcm9ubWVudC4gICovCisgIGlmIChudW0gPT0gVFJBUF9CUkVBS1BPSU5UKQorICAgIHsKKyAgICAgIC8qIEZpcnN0IHRyeSBzaW0tYnJlYWsuYy4gIElmIGl0J3MgYSBicmVha3BvaW50IHRoZSBzaW11bGF0b3IgIm93bnMiCisJIGl0IGRvZXNuJ3QgcmV0dXJuLiAgT3RoZXJ3aXNlIGl0IHJldHVybnMgYW5kIGxldCdzIHVzIHRyeS4gICovCisgICAgICBzaW1faGFuZGxlX2JyZWFrcG9pbnQgKHNkLCBjdXJyZW50X2NwdSwgcGMpOworICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyAgICB9CisjZW5kaWYKKworICBpZiAoU1RBVEVfRU5WSVJPTk1FTlQgKHNkKSA9PSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQpCisgICAgeworICAgICAgLyogVGhlIG5ldyBwYyBpcyB0aGUgdHJhcCB2ZWN0b3IgZW50cnkuCisJIFdlIGFzc3VtZSB0aGVyZSdzIGEgYnJhbmNoIHRoZXJlIHRvIHNvbWUgaGFuZGxlci4gICovCisgICAgICBVU0kgbmV3X3BjID0gRUlUX1RSQVBfQkFTRV9BRERSICsgbnVtICogNDsKKyAgICAgIHJldHVybiBuZXdfcGM7CisgICAgfQorCisgIHN3aXRjaCAobnVtKQorICAgIHsKKyAgICBjYXNlIFRSQVBfU1lTQ0FMTCA6CisgICAgICB7CisJQ0JfU1lTQ0FMTCBzOworCisJQ0JfU1lTQ0FMTF9JTklUICgmcyk7CisJcy5mdW5jID0gYV9tMzJyX2hfZ3JfZ2V0IChjdXJyZW50X2NwdSwgMCk7CisJcy5hcmcxID0gYV9tMzJyX2hfZ3JfZ2V0IChjdXJyZW50X2NwdSwgMSk7CisJcy5hcmcyID0gYV9tMzJyX2hfZ3JfZ2V0IChjdXJyZW50X2NwdSwgMik7CisJcy5hcmczID0gYV9tMzJyX2hfZ3JfZ2V0IChjdXJyZW50X2NwdSwgMyk7CisKKwlpZiAocy5mdW5jID09IFRBUkdFVF9TWVNfZXhpdCkKKwkgIHsKKwkgICAgc2ltX2VuZ2luZV9oYWx0IChzZCwgY3VycmVudF9jcHUsIE5VTEwsIHBjLCBzaW1fZXhpdGVkLCBzLmFyZzEpOworCSAgfQorCisJcy5wMSA9IChQVFIpIHNkOworCXMucDIgPSAoUFRSKSBjdXJyZW50X2NwdTsKKwlzLnJlYWRfbWVtID0gc3lzY2FsbF9yZWFkX21lbTsKKwlzLndyaXRlX21lbSA9IHN5c2NhbGxfd3JpdGVfbWVtOworCWNiX3N5c2NhbGwgKGNiLCAmcyk7CisJYV9tMzJyX2hfZ3Jfc2V0IChjdXJyZW50X2NwdSwgMiwgcy5lcnJjb2RlKTsKKwlhX20zMnJfaF9ncl9zZXQgKGN1cnJlbnRfY3B1LCAwLCBzLnJlc3VsdCk7CisJYV9tMzJyX2hfZ3Jfc2V0IChjdXJyZW50X2NwdSwgMSwgcy5yZXN1bHQyKTsKKwlicmVhazsKKyAgICAgIH0KKworICAgIGNhc2UgVFJBUF9CUkVBS1BPSU5UOgorICAgICAgc2ltX2VuZ2luZV9oYWx0IChzZCwgY3VycmVudF9jcHUsIE5VTEwsIHBjLAorCQkgICAgICAgc2ltX3N0b3BwZWQsIFNJTV9TSUdUUkFQKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdCA6CisgICAgICB7CisJVVNJIG5ld19wYyA9IEVJVF9UUkFQX0JBU0VfQUREUiArIG51bSAqIDQ7CisJcmV0dXJuIG5ld19wYzsKKyAgICAgIH0KKyAgICB9CisKKyAgLyogRmFrZSBhbiAicnRlIiBpbnNuLiAgKi8KKyAgLyogRklYTUU6IFNob3VsZCBkdXBsaWNhdGUgYWxsIG9mIHJ0ZSBwcm9jZXNzaW5nLiAgKi8KKyAgcmV0dXJuIChwYyAmIC00KSArIDQ7Cit9CmRpZmYgLS1naXQgYS9zaW0vbWlwcy9DaGFuZ2VMb2cgYi9zaW0vbWlwcy9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4YWM0MAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9taXBzL0NoYW5nZUxvZwpAQCAtMCwwICsxLDIwNDYgQEAKKzE5OTktMDItMDUgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGR2LXR4MzkwNHNpby5jICh0eDM5MDRzaW9fdGlja2xlKTogQWZ0ZXIgYSBwb2xsZWQgSS9PIGZyb20gdGhlCisgCUNQVSwgc3RhcnQgcGVyaW9kaWMgYmFja2dyb3VuZCBJL08gcG9sbHMuCisJKHR4MzkwNHNpb19wb2xsKTogTmV3IGZ1bmN0aW9uOiBwZXJpb2RpYyBJL08gcG9sbGVyLiAKKworMTk5OC0xMi0zMCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogbWlwcy5pZ2VuIChCUkVBSyk6IENhbGwgc2lnbmFsX2V4Y2VwdGlvbiBpbnN0ZWFkIG9mIHNpbV9lbmdpbmVfaGFsdC4KKwkKK1R1ZSBEZWMgMjkgMTY6MDM6NTMgMTk5OCAgUmFpbmVyIE9ydGggIDxyb0BUZWNoRmFrLlVuaS1CaWVsZWZlbGQuREU+CisKKwkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlIChtaXBzNjR2cjUqLSotKik6IEFkZGVkIG1pc3NpbmcgOzsgaW4KKyAJY2FzZSBzdGF0ZW1lbnQuCisKKzE5OTgtMTItMjkgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisJCisJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBBbGxvY2F0ZSBqbTM5MDQgbWVtb3J5IGluIHNtYWxsZXIgY2h1bmtzLiAKKwkobG9hZF93b3JkKTogQ2FsbCBTSU1fQ09SRV9TSUdOQUwgaG9vayBvbiBlcnJvci4KKwkoc2lnbmFsX2V4Y2VwdGlvbik6IENhbGwgU0lNX0NQVV9FWENFUFRJT05fVFJJR0dFUiBob29rIGJlZm9yZQorCXN0YXJ0aW5nLiAgRm9yIGV4Y2VwdGlvbiBkaXNwYXRjaGluZywgcGFzcyBQQyBpbnN0ZWFkIG9mIE5VTExfQ0lBLgorCShkZWNvZGVfY29wcm9jKTogVXNlIENPUDBfQkFEVkFERFIgdG8gc3RvcmUgZmF1bHRpbmcgYWRkcmVzcy4KKwkqIHNpbS1tYWluLmggKENPUDBfQkFEVkFERFIpOiBEZWZpbmUuIAorCShTSU1fQ09SRV9TSUdOQUwpOiBEZWZpbmUgaG9vayB0byBjYWxsIG1pcHNfY29yZV9zaWduYWwuCisJKFNJTV9DUFVfRVhDRVBUSU9OKik6IERlZmluZSBob29rcyB0byBjYWxsIG1pcHNfY3B1X2V4Y2VwdGlvbiooKS4KKwkoX3NpbV9jcHUpOiBBZGQgZXhjXyogZmllbGRzIHRvIHN0b3JlIHJlZ2lzdGVyIHZhbHVlIHNuYXBzaG90cy4JCisJKiBtaXBzLmlnZW4gKCopOiBSZXBsYWNlIG1lbW9yeS1yZWxhdGVkIFNpZ25hbEV4Y2VwdGlvbiogY2FsbHMKKwl3aXRoIHJlZmVyZW5jZXMgdG8gU0lNX0NPUkVfU0lHTkFMIGhvb2suCisJCisJKiBkdi10eDM5MDRpcmMuYyAodHgzOTA0aXJjX3BvcnRfZXZlbnQpOiBwcmludGYgZm9ybWF0IHdhcm5pbmcKKwlmaXguCisJKiBzaW0tbWFpbi5jICgqKTogTWlub3Igd2FybmluZyBjbGVhbnVwcy4KKwkKKzE5OTgtMTItMjQgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBtMTYuaWdlbiAoREFERElVNSk6IENvcnJlY3QgdHlwZS1vLgorCitNb24gRGVjIDIxIDEwOjM0OjQ4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAY2hvb2s+CisKKwkqIG1pcHMuaWdlbiAoZG9fZGRpdiwgZG9fZGRpdnUpOiBQYWNpZnkgR0NDLiBVcGRhdGUgaGkvbG8gdmlhIHRtcAorIAl2YXJpYWJsZXMuCisKK1dlZCBEZWMgMTYgMTg6MjA6MjggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjaG9vaz4KKworCSogTWFrZWZpbGUuaW4gKFNJTV9FWFRSQV9DRkxBR1MpOiBObyBsb25nZXIgbmVlZCB0byBhZGQgLi4uL25ld2xpYgorIAl0byBpbmNsdWRlIHBhdGguCisJKGludGVycC5vKTogQWRkIGRlcGVuZGVuY3kgb24gaXRhYmxlLmgKKwkob2VuZ2luZS5jLCBnZW5jb2RlKTogRGVsZXRlIHJlbWFpbmluZyByZWZlcmVuY2VzLgorCShCVUlMVF9TUkNfRlJPTV9HRU4pOiBDbGVhbiB1cC4KKwkKKzE5OTgtMTItMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCQorCSogdnI0cnVuLmM6IE5ldy4KKwkqIE1ha2VmaWxlLmluIChTSU1fSEFDS19PQkosSEFDS19PQkpTLEhBQ0tfR0VOX1NSQ1MsbGliaGFjay5hLAorCXRtcC1oYWNrLHRtcC1tMzItaGFjayx0bXAtbTE2LWhhY2ssdG1wLWl0YWJsZS1oYWNrLAorCXRtcC1ydW4taGFjaykgOiBOZXcuCisJKiBtMTYuaWdlbiAoTEQsREFERElVLERBRERVSTUsREFESlNQLERBRERJVVNQLERBRERJLERBRERVLERTVUJVLAorCURTTEwsRFNSTCxEU1JBLERTTExWLERTUkFWLERNVUxULERNVUxUVSxERElWLERESVZVLEpBTFgzMixKQUxYKTogCisJRHJvcCB0aGUgIjY0IiBxdWFsaWZpZXIgdG8gZ2V0IHRoZSBIQUNLIGdlbmVyYXRvciB3b3JraW5nLgorCVVzZSBJTU1FRElBVEUgcmF0aGVyIHRoYW4gSU1NRUQuICBVc2UgU0hBTVQgcmF0aGVyIHRoYW4gU0hJRlQuCisJKiBtaXBzLmlnZW4gKGRvX2RhZGRpdSxkb19kZGl2LGRvX2RpdnUpOiBSZW1vdmUgdGhlIDY0LW9ubHkKKwlxdWFsaWZpZXIgdG8gZ2V0IHRoZSBoYWNrIGdlbmVyYXRvciB3b3JraW5nLgorCShkb19kc2xsLGRvX2RzbGx2LGRvX2RzcmEsZG9fZHNybCxkb19kc3Jsdik6IE5ldy4KKwkoRFNMTCk6IFVzZSBkb19kc2xsLgorCShEU0xMVik6IFVzZSBkb19kc2xsdi4KKwkoRFNSQSk6IFVzZSBkb19kc3JhLgorCShEU1JMKTogVXNlIGRvX2RzcmwuCisJKERTUkxWKTogVXNlIGRvX2Rzcmx2LgorCShCQzEpOiBNb3ZlICp2cjQxMDAgdG8gZ2V0IHRoZSBIQUNLIGdlbmVyYXRvciB3b3JraW5nLgorCShDeEMxLCBETXhDMSwgTXhDMSxNQUNDVSxNQUNDSEksTUFDQ0hJVSk6IFJlbmFtZSB0byAKKwlnZXQgdGhlIEhBQ0sgZ2VuZXJhdG9yIHdvcmtpbmcuCisJKE1BQ0MpIFJlbmFtZSB0byBnZXQgdGhlIEhBQ0sgZ2VuZXJhdG9yIHdvcmtpbmcuCisJKERNQUNDLE1BQ0NTLERNQUNDUyk6IEFkZCB0aGUgNjQuCisJCisxOTk4LTEyLTEyICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy5pZ2VuIChCQzEpOiBSZW5hbWVkIHRvIEJDMWEgYW5kIEJDMWIgdG8gYXZvaWQgY29uZmxpY3RzLgorCSogc2ltLW1haW4uaCAoU2l6ZUZHUik6IEhhbmRsZSBUQVJHRVRfRU5BQkxFX0ZSLgorCQorMTk5OC0xMi0xMSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKyAgICAqIG1pcHMvaW50ZXJwLmMgKERFQlVHKTogQ2xlYW51cHMuCisKKzE5OTgtMTItMTAgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGR2LXR4MzkwNHNpby5jICh0eDM5MDRzaW9faW9fcmVhZF9idWZmZXIpOiBFbmRpYW5uZXNzIGZpeGVzLgorCSh0eDM5MDRzaW9fdGlja2xlKTogZmZsdXNoIGFmdGVyIGEgc3Rkb3V0IGNoYXJhY3RlciBvdXRwdXQuCisJCisxOTk4LTEyLTAzICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX2Nsb3NlKTogVW5pbnN0YWxsIG1vZHVsZXMuCisKK1dlZCBOb3YgMjUgMTM6NDE6MDMgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tbWFpbi5oLCBpbnRlcnAuYyAoc2ltX21vbml0b3IpOiBDaGFuZ2UgdG8gZ2xvYmFsCisgCWZ1bmN0aW9uLgorCitXZWQgTm92IDI1IDE3OjMzOjI0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluICh2cjQxMDApOiBPbmx5IGluY2x1ZGUgdnI0MTAwIGluc3RydWN0aW9ucyBpbgorIAlzaW11bGF0b3IuCisJKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgorCSogbTE2LmlnZW4gKCopOiBUYWcgYWxsIG1pcHMxNiBpbnN0cnVjdGlvbnMgYXMgYWxzbyBiZWluZyB2cjQxMDAuCisKK01vbiBOb3YgMjMgMTg6MjA6MzYgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoU0lNX0NGTEFHUyk6IERvIG5vdCBkZWZpbmUgV0lUSF9JR0VOLgorCSogc2ltLW1haW4uaCwgc2ltLW1haW4uYywgaW50ZXJwLmM6IERlbGV0ZSAjaWYgV0lUSF9JR0VOIGtlZXBpbmcKKyAJdHJ1ZSBhbHRlcm5hdGl2ZS4KKworCSogY29uZmlndXJlLmluIChzaW1fZGVmYXVsdF9nZW4sIHNpbV91c2VfZ2VuKTogUmVwbGFjZSB3aXRoCisgCXNpbV9nZW4uCisJKC0tZW5hYmxlLXNpbS1pZ2VuKTogRGVsZXRlIGNvbmZpZyBvcHRpb24uIEFsd2F5cyB1c2luZyBJR0VOLgorCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKwkKKwkqIE1ha2VmaWxlLmluIChnZW5jb2RlKTogS2lsbCwga2lsbCwga2lsbC4KKwkqIGdlbmNvZGUuYzogRGl0dG8uCisJCitNb24gTm92IDIzIDE4OjA3OjM2IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDb25maWd1cmUgbWlwczY0dnI0MTAwLWVsZiBuZWUgbWlwczY0dnI0MSogYXMgYSA2NAorIAliaXQgbWlwczE2IGlnZW4gc2ltdWxhdG9yLgorCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKworCSogbWlwcy5pZ2VuIChjaGVja19kaXZfaGlsbywgY2hlY2tfbXVsdF9oaWxvLCBjaGVja19tZl9oaWxvKTogTWFyaworIAlhcyBwYXJ0IG9mIHZyNDEwMCBJU0EuCisJKiB2ci5pZ2VuOiBNYXJrIGFsbCBpbnN0cnVjdGlvbnMgYXMgNjQgYml0IG9ubHkuCisKK01vbiBOb3YgMjMgMTc6MDc6MzcgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoZ2V0X2NlbGwsIHNpbV9tb25pdG9yLCBmZXRjaF9zdHIsIENvUHJvY1ByZXNlbnQpOgorIAlQYWNpZnkgR0NDLgorCitNb24gTm92IDIzIDEzOjIzOjQwIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDb25maWd1cmUgbWlwcy1sc2ktZWxmIG5lZSBtaXBzKmxzaSogYXMgYQorIAltaXBzSUlJL21pcHMxNiBpZ2VuIHNpbXVsYXRvci4gIEZpeCBzaW1fZ2VuIFZTIHNpbV9pZ2VuIHR5cG9zLgorCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKworCSogbTE2LmlnZW4gKEJSRUFLKTogRGVmaW5lIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24uCisJKEpBTFgzMik6IE1hcmsgaW5zdHJ1Y3Rpb24gYXMgbWlwczE2IGFuZCBub3QgcjM5MDAuCisJKiBtaXBzLmlnZW4gKEMuY29uZC5mbXQpOiBGaXggdHlwbyBpbiBpbnN0cnVjdGlvbiBmb3JtYXQuCisKKwkqIHNpbS1tYWluLmggKFBFTkRJTkdfRklMTCk6IFdyYXAgQyBzdGF0ZW1lbnRzIGluIGRvL3doaWxlLgorCitTYXQgTm92ICA3IDA5OjU0OjM4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZ2VuY29kZS5jIChidWlsZF9pbnN0cnVjdGlvbiAtIEJSRUFLKTogRm9yIE1JUFMxNiwgaGFuZGxlIEJSRUFLCisgCWluc24gYXMgYSBkZWJ1ZyBicmVha3BvaW50LgorCisJKiBzaW0tbWFpbi5oIChQRU5ESU5HX1NMT1RfQklUKTogRml4LCB3YXMgaW5jb3JyZWN0bHkgZGVmaW5lZCBhcworIAlwZW5kaW5nLnNsb3Rfc2l6ZS4KKwkoUEVORElOR19TQ0hFRCk6IENsZWFuIHVwIHRyYWNlIHN0YXRlbWVudC4KKwkoUEVORElOR19TQ0hFRCk6IEluY3JlbWVudCBQRU5ESU5HX0lOIGFuZCBQRU5ESU5HX1RPVEFMLgorCShQRU5ESU5HX0ZJTEwpOiBEZWxheSB3cml0ZSBieSBvbmx5IG9uZSBjeWNsZS4KKwkoUEVORElOR19GSUxMKTogRm9yIEZTUnMsIHdyaXRlIGZtdF91bmludGVycHJldGVkIHRvIEZQUl9TVEFURS4KKworCSogc2ltLW1haW4uYyAocGVuZGluZ190aWNrKTogQ2xlYW4gdXAgdHJhY2Ugc3RhdGVtZW50cy4gQWRkIHRyYWNlCisgCW9mIHBlbmRpbmcgd3JpdGVzLgorCShwZW5kaW5nX3RpY2spOiBGaXggc2l6ZXMgaW4gc3dpdGNoIHN0YXRlbWVudHMsIDQgJiA4IGluc3RlYWQgb2YKKyAJMzIgJiA2NC4KKwkocGVuZGluZ190aWNrKTogTW92ZSBpbmNyZW1lbnRpbmcgb2YgaW5kZXggdG8gRk9SIHN0YXRlbWVudC4KKwkocGVuZGluZ190aWNrKTogT25seSB1cGRhdGUgUEVORElOR19PVVQgYWZ0ZXIgYSB3cml0ZSBoYXMgb2NjdXJlZC4KKwkKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGV4cGxpY2l0IG1pcHMtbHNpLSogdGFyZ2V0LiAgVXNlIGdlbmNvZGUgdG8KKyAJYnVpbGQgc2ltdWxhdG9yLgorCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKwkKKwkqIGludGVycC5jIChzaW1fZW5naW5lX3J1biBPTEQpOiBEZWxldGUgZXhwbGljaXQgY2FsbCB0bworIAlQRU5ESU5HX1RJQ0suIE5vdyBjYWxsZWQgdmlhIEVOR0lORV9JU1NVRV9QUkVGSVhfSE9PSy4KKwkKK1NhdCBPY3QgMzAgMDk6NDk6MTAgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZHYtdHgzOTA0Y3B1LmMgKGRlbGl2ZXJfdHgzOTA0Y3B1X2ludGVycnVwdCk6IEFkZCBkdW1teQorCWludGVycnVwdCBsZXZlbCBudW1iZXIgdG8gbWF0Y2ggY2hhbmdlZCBTaWduYWxFeGNlcHRpb25JbnRlcnJ1cHQKKwltYWNyby4KKworRnJpIE9jdCAgOSAxODowMjoyNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYzogI2luY2x1ZGUgIml0YWJsZS5oIiBpZiBXSVRIX0lHRU4uCisJKGdldF9pbnNuX25hbWUpOiBOZXcgZnVuY3Rpb24uCisJKHNpbV9vcGVuKTogSW5pdGlhbGl6ZSBDUFVfSU5TTl9OQU1FLENQVV9NQVhfSU5TTlMuCisJKiBzaW0tbWFpbi5oIChNQVhfSU5TTlMsSU5TTl9OQU1FKTogRGVsZXRlLgorCitNb24gU2VwIDE0IDEyOjM2OjQ0IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVidWlsdCB0byBpbmhhbGUgbmV3IGNvbW1vbi9hY2xvY2FsLm00LgorCitUdWUgU2VwICAxIDE1OjM5OjE4IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGR2LXR4MzkwNHNpby5jOiBJbmNsdWRlIHNpbS1hc3NlcnQuaC4KKworVHVlIEF1ZyAyNSAxMjo0OTo0NiAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBkdi10eDM5MDRzaW8uYzogTmV3IGZpbGU6IHR4MzkwNCBzZXJpYWwgSS9PIG1vZHVsZS4KKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGR2LXR4MzkwNHNpbywgZHYtc29ja3NlciBmb3IgdHgzOSB0YXJnZXQuCisJUmVvcmdhbml6ZSB0YXJnZXQtc3BlY2lmaWMgc2ltLWhhcmR3YXJlIGNoZWNrcy4KKwkqIGNvbmZpZ3VyZTogcmVidWlsdC4KKwkqIGludGVycC5jIChzaW1fb3Blbik6IEZvciB0eDM5IHRhcmdldCBib2FyZHMsIHNldAorCU9QRVJBVElOR19FTlZJUk9OTUVOVCwgYWRkIHR4MzkwNHNpbyBkZXZpY2VzLgorCSogdGNvbmZpZy5pbjogRm9yIHR4MzkgdGFyZ2V0LCBzZXQgU0lNX0hBTkRMRVNfTE1BIGZvciBsb2FkaW5nCisJUk9NIGV4ZWN1dGFibGVzLiAgSW5zdGFsbCBkdi1zb2Nrc2VyIGludG8gc2ltLW1vZHVsZXMgbGlzdC4KKwkKKwkqIGR2LXR4MzkwNGlyYy5jOiBDb21waWxlciB3YXJuaW5nIGNsZWFuLXVwLgorCSogZHYtdHgzOTA0dG1yLmM6IENvbXBpbGVyIHdhcm5pbmcgY2xlYW4tdXAuICBSZW1vdmUgcGFydGljdWxhcmx5CisJZnJlcXVlbnQgaHctdHJhY2UgbWVzc2FnZXMuCisKK0ZyaSBKdWwgMzEgMTg6MTQ6MTYgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiB2ci5pZ2VuIChNdWxBY2MpOiBJZGVudGlmeSBhcyBhIHZyNDEwMCBzcGVjaWZpYyBmdW5jdGlvbi4KKworU2F0IEp1bCAyNSAxNjowMzoxNCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChJR0VOX0lOQ0xVREUpOiBBZGQgdnIuaWdlbi4KKworCSogdnIuaWdlbjogTmV3IGZpbGUuCisJKE1BQy9NQUREMTYsIERNQUMvRE1BREQxNik6IEltcGxlbWVudCB1c2luZyBjb2RlIGZyb20gZ2VuY29kZS5jLgorCSogbWlwcy5pZ2VuOiBEZWZpbmUgdnI0MTAwIG1vZGVsLiBJbmNsdWRlIHZyLmlnZW4uCitNb24gSnVuIDI5IDA5OjIxOjA3IDE5OTggIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBtaXBzLmlnZW4gKGNoZWNrX21mX2hpbG8pOiBDb3JyZWN0IGNoZWNrLgorCitXZWQgSnVuIDE3IDEyOjIwOjQ5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLW1haW4uaCAoaW50ZXJydXB0X2V2ZW50KTogQWRkIHByb3RvdHlwZS4KKworCSogZHYtdHgzOTA0dG1yLmMgKHR4MzkwNHRtcl9pb193cml0ZV9idWZmZXIpOiBEZWxldGUgdW51c2VkCisgCXJlZ2lzdGVyX3B0ciwgcmVnaXN0ZXJfdmFsdWUuCisJKGRlbGl2ZXJfdHgzOTA0dG1yX3RpY2spOiBGaXggdHlwZXMgcGFzc2VkIHRvIHByaW50ZiBmbXQuCisKKwkqIHNpbS1tYWluLmggKHRyYWNlZmgpOiBNYWtlIGV4dGVybi4KKworVHVlIEp1biAxNiAxNDozOTowMCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBkdi10eDM5MDR0bXIuYzogRGVzY2hlZHVsZSB0aW1lciBldmVudCBhZnRlciBkaXNwYXRjaGluZy4KKwlSZWR1Y2UgdW5uZWNlc3NhcmlseSBoaWdoIHRpbWVyIGV2ZW50IGZyZXF1ZW5jeS4gIAorCSogZHYtdHgzOTA0Y3B1LmM6IERpdHRvIGZvciBpbnRlcnJ1cHQgZXZlbnQuCisJCitXZWQgSnVuIDEwIDEzOjIyOjMyIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChkZWNvZGVfY29wcm9jKTogRm9yIFRYMzksIGFkZCBzdHViIENPUDAgcmVnaXN0ZXIgIzcsCisgCXRvIGFsbGF5IHdhcm5pbmdzLgorCShpbnRlcnJ1cHRfZXZlbnQpOiBNYWRlIG5vbi1zdGF0aWMuCisJCisJKiBkdi10eDM5MDR0bXIuYyAoZGVsaXZlcl90eDM5MDR0bXJfdGljayk6IENvcnJlY3QgYWNjaWRlbnRhbAorIAlpbnRlcmNoYW5nZSBvZiBjb25maWd1cmF0aW9uIHZhbHVlcyBmb3IgZXh0ZXJuYWwgdnMuIGludGVybmFsCisgCWNsb2NrIGRpdmlkZXJzLgorCQorVHVlIEp1biAgOSAxMjo0NjoyNCAxOTk4ICBJYW4gQ2FybWljaGFlbCAgPGlhbmNhcm1AY3lnbnVzLmNvbT4KKworCSogbWlwcy5pZ2VuIChCUkVBSyk6IE1vdmVkIGNvZGUgdG8gaGVyZSBmb3IgCisJc2ltdWxhdG9yLXJlc2VydmVkIGJyZWFrIGluc3RydWN0aW9ucy4KKwkqIGdlbmNvZGUuYyAoYnVpbGRfaW5zdHJ1Y3Rpb24pOiBEaXR0by4KKwkqIGludGVycC5jIChzaWduYWxfZXhjZXB0aW9uKTogQ29kZSBtb3ZlZCBmcm9tIGhlcmUuICBOb24tCisJcmVzZXJ2ZWQgaW5zdHJ1Y3Rpb25zIG5vdyB1c2UgZXhjZXB0aW9uIHZlY3RvciwgcmF0aGVyIAorCXRoYW4gaGFsdGluZyBzaW0uCisJKiBzaW0tbWFpbi5oOiBNb3ZlZCBtYWdpYyBjb25zdGFudHMgdG8gaGVyZS4KKworVHVlIEp1biAgOSAxMjoyOTo1MCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBkdi10eDM5MDRjcHUuYyAoZGVsaXZlcl8qX2ludGVycnVwdCwqX3BvcnRfZXZlbnQpOiBTZXQgdGhlIENBVVNFCisgCXJlZ2lzdGVyIHVwb24gbm9uLXplcm8gaW50ZXJydXB0IGV2ZW50IGxldmVsLCBjbGVhciB1cG9uIHplcm8KKyAJZXZlbnQgdmFsdWUuCisJKiBkdi10eDM5MDRpcmMuYyAoKl9wb3J0X2V2ZW50KTogSGFuZGxlIGRlYWN0aXZhdGVkIGludGVycnVwdCBzaWduYWwKKwlieSBwYXNzaW5nIHplcm8gZXZlbnQgdmFsdWUuCisJKCpfaW9fe3JlYWQsd3JpdGV9X2J1ZmZlcik6IEVuZGlhbm5lc3MgZml4ZXMuCisJKiBkdi10eDM5MDR0bXIuYyAoKl9pb197cmVhZCx3cml0ZX1fYnVmZmVyKTogRW5kaWFubmVzcyBmaXhlcy4KKwkoZGVsaXZlcl8qX3RpY2spOiBSZWR1Y2Ugc2ltIGV2ZW50IGludGVydmFsIHRvIDc1JSBvZiBjb3VudCBpbnRlcnZhbC4KKworCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogQWRkZWQgam1yMzkwNHBhbCBib2FyZCB0eXBlIHRoYXQgYWRkcyBQQUwtYmFzZWQKKwlzZXJpYWwgSS9PIGFuZCB0aW1lciBtb2R1bGUgYXQgYmFzZSBhZGRyZXNzIDB4RkZGRjAwMDAuCisJCitUdWUgSnVuICA5IDExOjUyOjI5IDE5OTggIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBtaXBzLmlnZW4gKFNXQzEpIDogQ29ycmVjdCB0aGUgaGFuZGxpbmcgb2YgUmV2ZXJzZUVuZGlhbiAKKwlhbmQgQmlnRW5kaWFuQ1BVLgorCitUdWUgSnVuICA5IDExOjQwOjU3IDE5OTggIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG1pcHNfZnB1X2JpdHNpemUpIDogU2V0IHRoaXMgY29ycmVjdGx5IGZvciAzMi1iaXQgbWlwcworCXBhcnRzLgorCSogY29uZmlndXJlOiBVcGRhdGUuCisKK1RodSBKdW4gIDQgMTU6Mzc6MzMgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZHYtdHgzOTA0dG1yLmM6IE5ldyBmaWxlIC0gaW1wbGVtZW50cyB0eDM5MDQgdGltZXIuCisJKiBkdi10eDM5MDR7aXJjLGNwdX0uYzogTWlsZCByZWZvcm1hdHRpbmcuCisJKiBjb25maWd1cmUuaW46IEluY2x1ZGUgdHgzOTA0dG1yIGluIGh3X2RldmljZSBsaXN0LgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogSW5zdGFudGlhdGUgdGhyZWUgdGltZXIgaW5zdGFuY2VzLgorCUZpeCBhZGRyZXNzIHR5cG8gb2YgdHgzOTA0aXJjIGluc3RhbmNlLgorCitUdWUgSnVuICAyIDE1OjQ4OjAyIDE5OTggIElhbiBDYXJtaWNoYWVsICA8aWFuY2FybUBjeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2lnbmFsX2V4Y2VwdGlvbik6IFN5c3RlbUNhbGwgZXhjZXB0aW9uIG5vdyB1c2VzCisJdGhlIGV4Y2VwdGlvbiB2ZWN0b3IuCisKK01vbiBKdW4gIDEgMTg6MTg6MjYgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKGRlY29kZV9jb3Byb2MpOiBGb3IgVFgzOSwgYWRkIHN0dWIgQ09QMCByZWdpc3RlciAjMywKKwl0byBhbGxheSB3YXJuaW5ncy4KKworRnJpIE1heSAyOSAxMTo0MDozOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoc2ltX2lnZW5fZmlsdGVyKTogTWF0Y2ggbWlwcyp0eDM5IG5vdCBtaXBzdCp0eDM5LgorCitNb24gTWF5IDI1IDIwOjQ3OjQ1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZHYtdHgzOTA0Y3B1LmMsIGR2LXR4MzkwNGlyYy5jOiBSZW5hbWUgKl9jYWxsYmFjayB0byAqX21ldGhvZC4KKworCSogZHYtdHgzOTA0Y3B1LmMsIGR2LXR4MzkwNGlyYy5jOiBJbmNsdWRlIGh3LW1haW4uaCBhbmQKKyAJc2ltLW1haW4uaC4gRGVjbGFyZSBhIHN0cnVjdCBod19kZXNjcmlwdG9yIGluc3RlYWQgb2Ygc3RydWN0CisgCWh3X2RldmljZV9kZXNjcmlwdG9yLgorCitNb24gTWF5IDI1IDEyOjQxOjM4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogbWlwcy5pZ2VuIChkb19zdG9yZV9sZWZ0LCBkb19sb2FkX2xlZnQpOiBDb21wdXRlIG5yIG9mIGxlZnQgYW5kCisgCXJpZ2h0IGJpdHMgYW5kIHRoZW4gcmUtYWxpZ24gbGVmdCBoYW5kIGJ5dGVzIHRvIGNvcnJlY3QgYnl0ZQorIAlsYW5lcy4gIEZpeCBpbmNvcnJlY3QgY29tcHV0YXRpb24gaW4gZG9fc3RvcmVfbGVmdCB3aGVuIGxvYWRpbmcKKyAJYnl0ZXMgZnJvbSBzZWNvbmQgd29yZC4KKworRnJpIE1heSAyMiAxMzozNDoyMCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoU0lNX0FDX09QVElPTl9IQVJEV0FSRSk6IE9ubHkgZW5hYmxlIHdoZW4gdHgzOTA0LgorCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogT25seSBjcmVhdGUgYSBkZXZpY2UgdHJlZSB3aGVuIEhXIGlzCisgCWVuYWJsZWQuCisKKwkqIGR2LXR4MzkwNGlyYy5jICh0eDM5MDRpcmNfZmluaXNoKTogUGFjaWZ5IEdDQy4KKwkqIGludGVycC5jIChzaWduYWxfZXhjZXB0aW9uKTogRGl0dG8uCisKK1RodSBNYXkgMjEgMTQ6MjQ6MTEgMTk5OCAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIGdlbmNvZGUuYzogTWFyayBCRUdFWkFMTCBhcyBMSUtFTFkuCisKK1RodSBNYXkgMjEgMTg6NTc6MTkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tbWFpbi5oIChBTFUzMl9FTkQpOiBTaWduIGV4dGVuZCAzMiBiaXQgcmVzdWx0cy4KKwkqIG1pcHMuaWdlbiAoQURELCBTVUIsIEFEREksIERBREQsIERTVUIpOiBUcmFjZS4KKwkKK01vbiBNYXkgMTggMTg6MjI6NDIgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChTSU1fQUNfT1BUSU9OX0hBUkRXQVJFKTogQWRkZWQgY29tbW9uIGhhcmR3YXJlCisgCW1vZHVsZXMuICBSZWNvZ25pemUgVFgzOSB0YXJnZXQgd2l0aCAibWlwcyp0eDM5IiBwYXR0ZXJuLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCSogc2ltLW1haW4uaCAoKik6IEFkZGVkIG1hbnkgbWFjcm9zIGRlZmluaW5nIGJpdHMgaW4KKyAJVFgzOSBjb250cm9sIHJlZ2lzdGVycy4KKwkoU2lnbmFsSW50ZXJydXB0KTogU2VuZCBhY3R1YWwgUEMgaW5zdGVhZCBvZiBOVUxMLgorCShTaWduYWxOTUlSZXNldCk6IE5ldyBleGNlcHRpb24gdHlwZS4KKwkqIGludGVycC5jIChib2FyZCk6IE5ldyB2YXJpYWJsZSBmb3IgZnV0dXJlIHVzZSB0byBpZGVudGlmeQorCWEgcGFydGljdWxhciBib2FyZCBiZWluZyBzaW11bGF0ZWQuCisJKG1pcHNfb3B0aW9uX2hhbmRsZXIsbWlwc19vcHRpb25zKTogQWRkZWQgIi0tYm9hcmQiIG9wdGlvbi4KKwkoaW50ZXJydXB0X2V2ZW50KTogU2VuZCBhY3R1YWwgUEMuCisJKHNpbV9vcGVuKTogTWFrZSBtZW1vcnkgbGF5b3V0IGNvbmRpdGlvbmFsIG9uIGJvYXJkIHNldHRpbmcuCisJKHNpZ25hbF9leGNlcHRpb24pOiBJbml0aWFsIGltcGxlbWVudGF0aW9uIG9mIGhhcmR3YXJlIGludGVycnVwdAorIAloYW5kbGluZy4gIEFjY2VwdCBhbm90aGVyIGJyZWFrIGluc3RydWN0aW9uIHZhcmlhbnQgZm9yIHNpbXVsYXRvcgorIAlleGl0LgorCShkZWNvZGVfY29wcm9jKTogSW1wbGVtZW50IFJGRSBpbnN0cnVjdGlvbiBmb3IgVFgzOS4KKwkobWlwcy5pZ2VuKTogRGVjb2RlIFJGRSBpbnN0cnVjdGlvbiBhcyBzdWNoLgorCSogY29uZmlndXJlLmluICh0eDM5MDRjcHUsdHgzOTA0aXJjKTogQWRkZWQgZGV2aWNlcyBmb3IgdHgzOTA0LgorCSogaW50ZXJwLmM6IERlZmluZSAiam1yMzkwNCIgYW5kICJqbXIzOTA0ZGVidWciIGJvYXJkIHR5cGVzIGFuZAorCWJiZWdpbiB0byBpbXBsZW1lbnQgbWVtb3J5IG1hcC4KKwkqIGR2LXR4MzkwNGNwdS5jOiBOZXcgZmlsZS4KKwkqIGR2LXR4MzkwNGlyYy5jOiBOZXcgZmlsZS4KKworV2VkIE1heSAxMyAxNDo0MDoxMSAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogbWlwcy5pZ2VuIChjaGVja19tdF9oaWxvKTogQ3JlYXRlIGEgc2VwYXJhdGUgcjM5MDAgdmVyc2lvbi4KKworV2VkIE1heSAxMyAxNDoxMTo0NiAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogdHguaWdlbiAobWFkZCxtYWRkdSk6ICBSZXBsYWNlIGNhbGxzIHRvIGNoZWNrX29wX2hpbG8KKwl3aXRoIGNhbGxzIHRvIGNoZWNrX2Rpdl9oaWxvLgorCitXZWQgTWF5IDEzIDA5OjU5OjI3IDE5OTggIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBtaXBzL21pcHMuaWdlbiAoY2hlY2tfb3BfaGlsbyxjaGVja19tdWx0X2hpbG8sY2hlY2tfZGl2X2hpbG8pOgorCVJlcGxhY2UgY2hlY2tfb3BfaGlsbyB3aXRoIGNoZWNrX211bHRfaGlsbyBhbmQgY2hlY2tfZGl2X2hpbG8uCisJQWRkIHNwZWNpYWwgcjM5MDAgdmVyc2lvbiBvZiBkb19tdWx0X2hpbG8uICAKKwkoZG9fZG11bHR4LGRvX211bHQsZG9fbXVsdHUpOiBSZXBsYWNlIGNhbGxzIHRvIGNoZWNrX29wX2hpbG8KKwl3aXRoIGNhbGxzIHRvIGNoZWNrX211bHRfaGlsby4KKwkoZG9fZGRpdixkb19kZGl2dSxkb19kaXYsZG9fZGl2dSk6IFJlcGxhY2UgY2FsbHMgdG8gY2hlY2tfb3BfaGlsbworCXdpdGggY2FsbHMgdG8gY2hlY2tfZGl2X2hpbG8uCisKK1R1ZSBNYXkgMTIgMTU6MjI6MTEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKFNVQlRBUkdFVF9SMzkwMCk6IERlZmluZSBmb3IgbWlwc3R4MzkgdGFyZ2V0LgorICAJRG9jdW1lbnQgYSByZXBsYWNlbWVudC4KKworRnJpIE1heSAgOCAxNzo0ODoxOSAxOTk4ICBJYW4gQ2FybWljaGFlbCAgPGlhbmNhcm1AY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9tb25pdG9yKTogTWFrZSBtb25fcHJpbnRmIHdvcmsuCisKK1dlZCBNYXkgIDYgMTk6NDI6MTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc2ltLW1haW4uaCAoSU5TTl9OQU1FKTogTmV3IGFyZyBgY3B1Jy4KKworVHVlIEFwciAyOCAxODozMzozMSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitTdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitTdW4gQXByIDI2IDE1OjIwOjAxIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogYWNjb25maWcuaDogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KKworRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworRnJpIEFwciAyNCAxMToxOToyMCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBzaW5jbHVkZS4KKworRnJpIEFwciAyNCAxMTozNTowMSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGNob29rLmN5Z251cy5jb20+CisKKwkqIG1pcHMuaWdlbiAoZG9fc3RvcmVfbGVmdCk6IFBhc3MgMCBub3QgTlVMTCB0byBzdG9yZV9tZW1vcnkuCisKK1R1ZSBBcHIgMjEgMTE6NTk6NTAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBtaXBzLmlnZW4gKEVSRVQpOiBJbXBsZW1lbnQuCisKKwkqIGludGVycC5jIChkZWNvZGVfY29wcm9jKTogUmV0dXJuIHNpZ24tZXh0ZW5kZWQgRVBDLgorCisJKiBtaXBzLmlnZW4gKEFOREksIExVSSwgTUZDMCk6IEFkZCB0cmFjaW5nIGNvZGUuCisKKwkqIGludGVycC5jIChzaWduYWxfZXhjZXB0aW9uKTogRG8gbm90IGlnbm9yZSBUcmFwLgorCShzaWduYWxfZXhjZXB0aW9uKTogT24gVFJBUCwgcmVzdGFydCBhdCBleGNlcHRpb24gYWRkcmVzcy4KKwkoSEFMVF9JTlNUUlVDVElPTiwgSEFMVF9JTlNUUlVDVElPTl9NQVNLKTogRGVmaW5lLgorCShzaWduYWxfZXhjZXB0aW9uKTogVXBkYXRlLgorCShzaW1fb3Blbik6IFBhdGNoIFZfQ09NTU9OIGludGVycnVwdCB2ZWN0b3Igd2l0aCBhbiBhYm9ydCBzZXF1ZW5jZQorIAlzbyB0aGF0IFRSQVAgaW5zdHJ1Y3Rpb25zIGFyZSBjYXVnaHQuCisKK01vbiBBcHIgMjAgMTE6MjY6NTUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tbWFpbi5oIChzdHJ1Y3QgaGlsb19hY2Nlc3MsIHN0cnVjdCBoaWxvX2hpc3RvcnkpOiBEZWZpbmUsCisgCWNvbnRhaW5zIEhJL0xPIGFjY2VzcyBoaXN0b3J5LgorCShzdHJ1Y3QgX3NpbV9jcHUpOiBNYWtlIGhpYWNjZXNzIGFuZCBsb2FjY2VzcyBvZiB0eXBlIGhpbG9fYWNjZXNzLgorCShISUFDQ0VTUywgTE9BQ0NFU1MpOiBEZWxldGUsIHJlcGxhY2Ugd2l0aAorCShISUhJU1RPUlksIExPSElTVE9SWSk6IE5ldyBtYWNyb3MuCisJKENIRUNLSElMTyk6IERlbGV0ZSBhbGwsIG1vdmVkIHRvIG1pcHMuaWdlbgorCQorCSogZ2VuY29kZS5jIChidWlsZF9pbnN0cnVjdGlvbik6IERvIG5vdCBnZW5lcmF0ZSBjaGVja3MgZm9yCisgCWNvcnJlY3QgSEkvTE8gcmVnaXN0ZXIgdXNhZ2UuCisKKwkqIGludGVycC5jIChvbGRfZW5naW5lX3J1bik6IERlbGV0ZSBjaGVja3MgZm9yIGNvcnJlY3QgSEkvTE8KKyAJcmVnaXN0ZXIgdXNhZ2UuCisKKwkqIG1pcHMuaWdlbiAoY2hlY2tfbXRfaGlsbywgY2hlY2tfbWZfaGlsbywgY2hlY2tfb3BfaGlsbywKKyAJY2hlY2tfbWZfY3ljbGVzKTogTmV3IGZ1bmN0aW9ucy4KKwkoZG9fbWZoaSwgZG9fbWZsbywgIm10aGkiLCAibXRsbyIsIGRvX2RkaXYsIGRvX2RkaXZ1LCBkb19kaXYsCisgCWRvX2RpdnUsIGRvbXVsdHgsIGRvX211bHQsIGRvX211bHR1KTogVXNlLgorCisJKiB0eC5pZ2VuICgibWFkZCIsICJtYWRkdSIpOiBVc2UuCisJCitXZWQgQXByIDE1IDE4OjMxOjU0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogbWlwcy5pZ2VuIChEU1JBVik6IFVzZSBmdW5jdGlvbiBkb19kc3Jhdi4KKwkoU1JBVik6IFVzZSBuZXcgZnVuY3Rpb24gZG9fc3Jhdi4KKworCSogbTE2LmlnZW4gKEJFUVosIEJORVopOiBDb21wYXJlIEdQUltUUlhdIG5vdCBHUFJbUlhdLgorCShCKTogU2lnbiBleHRlbmQgMTEgYml0IGltbWVkaWF0ZS4KKwkoRVhULUIqKTogU2hpZnQgMTYgYml0IGltbWVkaWF0ZSBsZWZ0IGJ5IDEuCisJKEFERElVKik6IERvbid0IHNpZ24gZXh0ZW5kIGltbWVkaWF0ZSB2YWx1ZS4KKworV2VkIEFwciAxNSAxMDozMjoxNSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIG0xNnJ1bi5jIChzaW1fZW5naW5lX3J1bik6IFJlc3RvcmUgQ0lBIGFmdGVyIGhhbmRsaW5nIGFuIGV2ZW50LgorCisJKiBzaW0tbWFpbi5oIChERUxBWV9TTE9ULCBOVUxMSUZZX05FWFRfSU5TVFJVQ1RJT04pOiBGb3IgSUdFTiwgdXNlCisgCWZ1bmN0aW9ucy4KKworCSogbWlwcy5pZ2VuIChkZWxheXNsb3QzMiwgbnVsbGlmeV9uZXh0X2luc24pOiBOZXcgZnVuY3Rpb25zLgorCShtMTYuaWdlbik6IEFsd2F5cyBpbmNsdWRlLgorCShkb18qKTogQWRkIG1vcmUgdHJhY2luZy4KKworCSogbTE2LmlnZW4gKGRlbGF5c2xvdDE2KTogQWRkIE5JQSBhcmd1bWVudCwgY291bGQgYmUgY2FsbGVkIGJ5IGEKKyAJMzIgYml0IE1JUFMxNiBpbnN0cnVjdGlvbi4KKwkKKwkqIGludGVycC5jIChpZmV0Y2gxNik6IE1vdmUgZnVuY3Rpb24gZnJvbSBoZXJlLgorCSogc2ltLW1haW4uYyAoaWZldGNoMTYpOiBUbyBoZXJlLgorCQorCSogc2ltLW1haW4uYyAoaWZldGNoMTYsIGlmZXRjaDMyKTogVXBkYXRlIHRvIG1hdGNoIGN1cnJlbnQKKyAJaW1wbGVtZW50YXRpb25zIG9mIExILCBMVy4KKwkoc2lnbmFsX2V4Y2VwdGlvbik6IERvbid0IHByaW50IG91dCBpbmNvcnJlY3QgaGV4IHZhbHVlIG9mIGlsbGVnYWwKKyAJaW5zdHJ1Y3Rpb24uCisKK1dlZCBBcHIgMTUgMDA6MTc6MjUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBtMTZydW4uYyAoc2ltX2VuZ2luZV9ydW4pOiBVc2UgSU1FTTE2IGFuZCBJTUVNMzIgdG8gZmV0Y2ggYW4KKyAJaW5zdHJ1Y3Rpb24uCisKKwkqIG0xNi5pZ2VuOiBJbXBsZW1lbnQgTUlQUzE2IGluc3RydWN0aW9ucy4KKwkKKwkqIG1pcHMuaWdlbiAoZG9fYWRkaXUsIGRvX2FkZHUsIGRvX2FuZCwgZG9fZGFkZGl1LCBkb19kYWRkdSwKKyAJZG9fZGRpdiwgZG9fZGRpdnUsIGRvX2RpdiwgZG9fZGl2dSwgZG9fZG11bHR4LCBkb19kbXVsdHUsIGRvX3NyYXYsCisgCWRvX2RzdWJ1LCBkb19tZmhpLCBkb19tZmxvLCBkb19tdWx0LCBkb19tdWx0dSwgZG9fbm9yLCBkb19vciwKKyAJZG9fc2xsLCBkb19zbGx2LCBkb19zbHQsIGRvX3NsdGksIGRvX3NsdGl1LCBkb19zbHR1LCBkb19zcmEsCisgCWRvX3NybCwgZG9fc3JsdiwgZG9fc3VidSwgZG9feG9yLCBkb194b3JpKTogTmV3IGZ1bmN0aW9ucy4gIE1vdmUKKyAJYm9kaWVzIG9mIGNvcnJlc3BvbmRpbmcgY29kZSBmcm9tIDMyIGJpdCBpbnNuIHRvIHRoZXNlLiAgQWxzbyB1c2VkCisgCWJ5IE1JUFMxNiB2ZXJzaW9ucyBvZiBmdW5jdGlvbnMuCisJCisJKiBzaW0tbWFpbi5oIChSQUlEWCwgVDhJRFgsIFQ4LCBTUElEWCk6IERlZmluZS4KKwkoSU1FTTE2KTogRHJvcCBOUiBhcmd1bWVudCBmcm9tIG1hY3JvLgorCitTYXQgQXByICA0IDIyOjM5OjUwIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFNJTV9PQkpTKTogQWRkIHNpbS1tYWluLm8uCisKKwkqIHNpbS1tYWluLmggKGFkZHJlc3NfdHJhbnNsYXRpb24sIGxvYWRfbWVtb3J5LCBzdG9yZV9tZW1vcnksCisgCWNhY2hlX29wLCBzeW5jX29wZXJhdGlvbiwgcHJlZmV0Y2gsIGlmZXRjaDMyLCBwZW5kaW5nX3RpY2spOiBNYXJrCisgCWFzIElOTElORV9TSU1fTUFJTi4KKwkocHJfYWRkciwgcHJfdXdvcmQ2NCk6IERlY2xhcmUuCisJKHNpbS1tYWluLmMpOiBJbmNsdWRlIHdoZW4gSF9SRVZFQUxTX01PRFVMRV9QLgorCQorCSogaW50ZXJwLmMgKGFkZHJlc3NfdHJhbnNsYXRpb24sIGxvYWRfbWVtb3J5LCBzdG9yZV9tZW1vcnksCisgCWNhY2hlX29wLCBzeW5jX29wZXJhdGlvbiwgcHJlZmV0Y2gsIGlmZXRjaDMyLCBwZW5kaW5nX3RpY2spOiBNb3ZlCisgCWZyb20gaGVyZS4KKwkqIHNpbS1tYWluLmM6IFRvIGhlcmUuIEZpeCBjb21waWxhdGlvbiBwcm9ibGVtcy4KKwkKKwkqIGNvbmZpZ3VyZS5pbjogRW5hYmxlIGlubGluaW5nLgorCSogY29uZmlndXJlOiBSZS1jb25maWcuCisKK1NhdCBBcHIgIDQgMjA6MzY6MjUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK0ZyaSBBcHIgIDMgMDQ6MzI6MzUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBtaXBzLmlnZW46IEluY2x1ZGUgdHguaWdlbi4KKwkqIE1ha2VmaWxlLmluIChJR0VOX0lOQ0xVREUpOiBBZGQgdHguaWdlbi4KKwkqIHR4LmlnZW46IE5ldyBmaWxlLCBjb250YWlucyBNQUREIGFuZCBNQUREVS4KKworCSogaW50ZXJwLmMgKGxvYWRfbWVtb3J5KTogV2hlbiBzaGlmdGluZyBieXRlcywgdXNlIExPQUREUk1BU0sgbm90CisgCXRoZSBoYXJkd2lyZWQgY29uc3RhbnQgYDcnLgorCShzdG9yZV9tZW1vcnkpOiBEaXR0by4KKwkoTE9BRERSTUFTSyk6IE1vdmUgZGVmaW5pdGlvbiB0byBzaW0tbWFpbi5oLgorCisJbWlwcy5pZ2VuIChNVEMwKTogRW5hYmxlIGZvciByMzkwMC4KKwkoQUREVSk6IEFkZCB0cmFjZS4KKworCW1pcHMuaWdlbiAoZG9fbG9hZF9ieXRlKTogRGVsZXRlLgorCShkb19sb2FkLCBkb19zdG9yZSwgZG9fbG9hZF9sZWZ0LCBkb19sb2FkX3dyaXRlLCBkb19zdG9yZV9sZWZ0LAorIAlkb19zdG9yZV9yaWdodCk6IE5ldyBmdW5jdGlvbnMuCisJKFNXKiwgTFcqLCBTRCosIExEKiwgU0gsIExILCBTQiwgTEIpOiBVc2UuCisKKwljb25maWd1cmUuaW46IExldCB0aGUgdHgzOSB1c2UgaWdlbiBhZ2Fpbi4KKwljb25maWd1cmU6IFVwZGF0ZS4KKwkKK1RodSBBcHIgIDIgMTA6NTk6MzkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX21vbml0b3IpOiBnZXRfbWVtX2luZm8gcmV0dXJucyBhIDQgYnl0ZSBxdWFudGl0eSwKKyAJbm90IGFuIGFkZHJlc3Mgc2l6ZWQgcXVhbnRpdHkuICBSZXR1cm4gemVybyBmb3IgY2FjaGUgc2l6ZXMuCisKK1dlZCBBcHIgIDEgMjM6NDc6NTMgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBtaXBzLmlnZW4gKHIzOTAwKTogcjM5MDAgZG9lcyBub3Qgc3VwcG9ydCA2NCBiaXQgaW50ZWdlcgorIAlvcGVyYXRpb25zLgorCitNb24gTWFyIDMwIDE0OjQ2OjA1IDE5OTggIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKG1pcHN0eDM5Ki0qLSopOiBVc2UgZ2VuY29kZSBzaW11bGF0b3IgcmF0aGVyCisJdGhhbiBpZ2VuIG9uZS4KKwkqIGNvbmZpZ3VyZSA6IFJlYnVpbGQuCisJCitGcmkgTWFyIDI3IDE2OjE1OjUyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitGcmkgTWFyIDI3IDE1OjAxOjUwIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKG1pcHNfb3B0aW9uX2hhbmRsZXIpOiBJdGVyYXRlIG92ZXIgTUFYX05SX1BST0NFU1NPUlMuCisKK1dlZCBNYXIgMjUgMTY6NDQ6MjcgMTk5OCAgSWFuIENhcm1pY2hhZWwgIDxpYW5jYXJtQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIE1hciAyNSAxMjozNToyOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIE1hciAyNSAxMDowNTo0NiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChNYXgsIE1pbik6IENvbW1lbnQgb3V0IGZ1bmN0aW9ucy4gTm90IHlldCB1c2VkLgorCitXZWQgTWFyIDE4IDEyOjM4OjEyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgTWFyIDE3IDE5OjA1OjIwIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChNSVBTX0VYVFJBX0xJQlMsIFNJTV9FWFRSQV9MSUJTKTogQWRkZWQKKyAJY29uZmlndXJhYmxlIHNldHRpbmdzIGZvciBzdGFuZC1hbG9uZSBzaW11bGF0b3IuCisJCisJKiBjb25maWd1cmUuaW46IEFkZGVkIFgxMSBzZWFyY2gsIGp1c3QgaW4gY2FzZS4KKwkKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK1dlZCBNYXIgMTEgMTQ6MDk6MTAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX3dyaXRlLCBzaW1fcmVhZCwgbG9hZF9tZW1vcnksIHN0b3JlX21lbW9yeSk6CisgCVJlcGxhY2Ugc2ltX2NvcmVfKl9tYXAgd2l0aCByZWFkX21hcCwgd3JpdGVfbWFwLCBleGVjX21hcCByZXNwLgorCitUdWUgTWFyICAzIDEzOjU4OjQzIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLW1haW4uaCAoR0VURkNDKTogUmV0dXJuIGFuIHVuc2lnbmVkIHZhbHVlLgorCitUdWUgTWFyICAzIDEzOjIxOjM3IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogbWlwcy5pZ2VuIChESVYpOiBGaXggY2hlY2sgZm9yIC0xIC8gTUlOX0lOVC4KKwkoREFERCk6IFJlc3VsdCBkZXN0aW5hdGlvbiBpcyBSRCBub3QgUlQuCisKK0ZyaSBGZWIgMjcgMTM6NDk6NDkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tbWFpbi5oIChISUFDQ0VTUywgTE9BQ0NFU1MpOiBBbHdheXMgZGVmaW5lLgorCisJKiBtZG14LmlnZW4gKE1heGksIE1pbmkpOiBSZW5hbWUgTWF4LCBNaW4uCisKKwkqIGludGVycC5jIChzaW1faW5mbyk6IERlbGV0ZS4KKworRnJpIEZlYiAyNyAxODo0MTowMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoREVDTEFSRV9PUFRJT05fSEFORExFUik6IFVzZSBpdC4KKwkobWlwc19vcHRpb25faGFuZGxlcik6IE5ldyBhcmd1bWVudCBgY3B1Jy4KKwkoc2ltX29wZW4pOiBVcGRhdGUgY2FsbCB0byBzaW1fYWRkX29wdGlvbl90YWJsZS4KKworV2VkIEZlYiAyNSAxODo1NjoyMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIG1pcHMuaWdlbiAoQ3hDMSk6IEFkZCB0cmFjaW5nLgorCitGcmkgRmViIDIwIDE3OjQzOjIxIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLW1haW4uaCAoTWF4LCBNaW4pOiBEZWNsYXJlLgorCisJKiBpbnRlcnAuYyAoTWF4LCBNaW4pOiBOZXcgZnVuY3Rpb25zLgorCisJKiBtaXBzLmlnZW4gKEJDMSk6IEFkZCB0cmFjaW5nLgorCQorVGh1IEZlYiAxOSAxNDo1MDowMCAxOTk4ICBKb2huIE1ldHpsZXIgIDxqbWV0emxlckBjeWdudXMuY29tPgorCQorCSogaW50ZXJwLmMgQWRkZWQgbWVtb3J5IG1hcCBmb3Igc3RhY2sgaW4gdnI0MTAwCisJCitUaHUgRmViIDE5IDEwOjIxOjIxIDE5OTggIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAobG9hZF9tZW1vcnkpOiBBZGQgbWlzc2luZyAiYnJlYWsiJ3MuCisKK1R1ZSBGZWIgMTcgMTI6NDU6MzUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX3N0b3JlX3JlZ2lzdGVyLCBzaW1fZmV0Y2hfcmVnaXN0ZXIpOiBQYXNzIGluCisgCWxlbmd0aCBwYXJhbWV0ZXIuICBSZXR1cm4gLTEuCisKK1R1ZSBGZWIgMTAgMTE6NTc6NDAgMTk5OCAgSWFuIENhcm1pY2hhZWwgIDxpYW5jYXJtQGN5Z251cy5jb20+CisKKwkqIGludGVycC5jOiBBZGRlZCBoYXJkd2FyZSBpbml0IGhvb2ssIGZpeGVkIHdhcm5pbmdzLgorCitTYXQgRmViICA3IDE3OjE2OjIwIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGl0YWJsZS5oIGl0YWJsZS5jKTogRGVwZW5kIG9uIFNJTV9Ac2ltX2dlbkBfQUxMLgorCitUdWUgRmViICAzIDExOjM2OjAyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKGlmZXRjaDE2KTogTmV3IGZ1bmN0aW9uLgorCisJKiBzaW0tbWFpbi5oIChJTUVNMzIpOiBSZW5hbWUgSU1FTS4KKwkoSU1FTTE2X0lNTUVEKTogRGVmaW5lLgorCShJTUVNMTYpOiBEZWZpbmUuCisJKERFTEFZX1NMT1QpOiBVcGRhdGUuCisJCisJKiBtMTZydW4uYyAoc2ltX2VuZ2luZV9ydW4pOiBOZXcgZmlsZS4KKwkKKwkqIG0xNi5pZ2VuOiBBbGwgaW5zdHJ1Y3Rpb25zIGV4Y2VwdCBMQi4KKwkoTEIpOiBDYWxsIGRvX2xvYWRfYnl0ZS4KKwkqIG1pcHMuaWdlbiAoZG9fbG9hZF9ieXRlKTogTmV3IGZ1bmN0aW9uLgorCShMQik6IENhbGwgZG9fbG9hZF9ieXRlLgorCisJKiBtaXBzLmlnZW46IE1vdmUgc3BlYyBmb3IgaW5zbiBiaXQgc2l6ZSBhbmQgaGlnaCBiaXQgZnJvbSBoZXJlLgorCSogTWFrZWZpbGUuaW4gKHRtcC1pZ2VuLCB0bXAtbTE2KTogVG8gaGVyZS4KKworCSogbTE2LmRjOiBOZXcgZmlsZSwgZGVjb2RlIG1pcHMxNiBpbnN0cnVjdGlvbnMuCisKKwkqIE1ha2VmaWxlLmluIChTSU1fTk9fQUxMKTogRGVmaW5lLgorCSh0bXAtbTE2KTogR2VuZXJhdGUgYm90aCAxNiBiaXQgYW5kIDMyIGJpdCBzaW11bGF0b3IgZW5naW5lcy4KKworVHVlIEZlYiAgMyAxMToyODowMCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAobWlwc19mcHVfYml0c2l6ZSk6IEZvciB0eDM5LCByZXN0cmljdCBmbG9hdGluZworIAlwb2ludCB1bml0IHRvIDMyIGJpdCByZWdpc3RlcnMuCisJKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgorCitTdW4gRmViICAxIDE1OjQ3OjE0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChzaW1fdXNlX2dlbik6IE1ha2UgSUdFTiB0aGUgZGVmYXVsdCBzaW11bGF0b3IKKyAJZ2VuZXJhdG9yIGZvciBnZW5lcmljIDMyIGFuZCA2NCBiaXQgbWlwcyB0YXJnZXRzLgorCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKworU3VuIEZlYiAgMSAxNjo1MjozNyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1tYWluLmggKFNpemVGR1IpOiBEZXRlcm1pbmUgZnJvbSBmbG9hdGluZy1wb2ludCBhbmQgbm90IGdwcgorIAliaXRzaXplLgorCisJKiBpbnRlcnAuYyAoc2ltX2ZldGNoX3JlZ2lzdGVyLCBzaW1fc3RvcmVfcmVnaXN0ZXIpOiBSZWFkL3dyaXRlCisgCUZHUiBmcm9tIGNvcnJlY3QgbG9jYXRpb24uCisJKHNpbV9vcGVuKTogU2V0IHNpemUgb2YgRkdSJ3MgYWNjb3JkaW5nIHRvCisgCVdJVEhfVEFSR0VUX0ZMT0FUSU5HX1BPSU5UX0JJVFNJWkUuCisJCisJKiBzaW0tbWFpbi5oIChGR1IpOiBTdG9yZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgaW4gYSBzZXBhcmF0ZQorIAlhcnJheS4KKworU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVHVlIEZlYiAgMyAwMDoxMDo1MCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChDb2xkUmVzZXQpOiBDYWxsIFBFTkRJTkdfSU5WQUxJREFURS4KKworCSogc2ltLW1haW4uaCAoRU5HSU5FX0lTU1VFX1BSRUZJWF9IT09LKTogQ2FsbCBQRU5ESU5HX1RJQ0suCisKKwkqIGludGVycC5jIChwZW5kaW5nX3RpY2spOiBOZXcgZnVuY3Rpb24uICBEZWxpdmVyIHBlbmRpbmcgd3JpdGVzLgorCisJKiBzaW0tbWFpbi5oIChQRU5ESU5HX0ZJTEwsIFBFTkRJTkdfVElDSywgUEVORElOR19TQ0hFRCwKKyAJUEVORElOR19CSVQsIFBFTkRJTkdfSU5WQUxJREFURSk6IFJlLXdyaXRlIHBpcGVsaW5lIGNvZGUgc28gdGhhdAorIAlpdCBjYW4gaGFuZGxlIG1peGVkIHNpemVkIHF1YW50aXRlcyBhbmQgc2luZ2xlIGJpdHMuCisJCitNb24gRmViICAyIDE3OjQzOjE1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKG9lbmdpbmUuaCk6IERvIG5vdCBpbmNsdWRlIHdoZW4gYnVpbGRpbmcgd2l0aCBJR0VOLgorCShzaW1fb3Blbik6IFJlcGxhY2UgR1BSTEVOIGJ5IFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRS4KKwkoc2ltX2luZm8pOiBEaXR0byBmb3IgUFJPQ0VTU09SXzY0QklULgorCShzaW1fbW9uaXRvcik6IFJlcGxhY2UgdXRfcmVnIHdpdGggdW5zaWduZWRfd29yZC4KKwkoKik6IERpdHRvIGZvciB0X3JlZy4KKwkoTE9BRERSTUFTSyk6IERlZmluZS4KKwkoc2ltX29wZW4pOiBSZW1vdmUgZGVmdW5jdCBjaGVjayB0aGF0IGhvc3QgRlAgaXMgSUVFRSBjb21wbGlhbnQsCisgCXVzaW5nIHNvZnR3YXJlIHRvIGVtdWxhdGUgZmxvYXRpbmcgcG9pbnQuCisJKHZhbHVlX2ZwciwgLi4uKTogQWx3YXlzIGNvbXBpbGUsIHdhcyBjb25kaXRpb25hbCBvbiBIQVNGUFUuCisKK1N1biBGZWIgIDEgMTE6MTU6MjkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tbWFpbi5oIChzaW1fc3RhdGUpOiBNYWtlIHRoZSBjcHUgYXJyYXkgTUFYX05SX1BST0NFU1NPUlMgaW4KKyAJc2l6ZS4KKworCSogaW50ZXJwLmMgKFNELCBDUFUpOiBEZWZpbmUuCisJKG1pcHNfb3B0aW9uX2hhbmRsZXIpOiBTZXQgZmxhZ3MgaW4gZWFjaCBDUFUuCisJKGludGVycnVwdF9ldmVudCk6IEFzc3VtZSBDUFUgMCBpcyB0aGUgb25lIGJlaW5nIGl0ZXJydXB0ZWQuCisJKHNpbV9jbG9zZSk6IERvIG5vdCBjbGVhciBTVEFURSwgZGVsZXRlZCBhbnl3YXkuCisJKHNpbV93cml0ZSwgc2ltX3JlYWQpOiBBc3N1bWUgQ1BVIHplcm8ncyB2bSBzaG91bGQgYmUgdXNlZCBmb3IKKyAJZGF0YSB0cmFuc2ZlcnMuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBTZXQgdGhlIFBDIGZvciBhbGwgcHJvY2Vzc29ycy4KKwkoc2ltX21vbml0b3IsIHN0b3JlX3dvcmQsIGxvYWRfd29yZCwgbWlwczE2X2VudHJ5KTogQWRkIGNwdQorIAlhcmd1bWVudC4KKwkobWlwczE2X2VudHJ5KTogUGFzcyBjb3JyZWN0IG5yIG9mIGFyZ3MgdG8gc3RvcmVfd29yZCwgbG9hZF93b3JkLgorCShDb2xkUmVzZXQpOiBDb2xkIHJlc2V0IGFsbCBjcHUncy4KKwkoc2lnbmFsX2V4Y2VwdGlvbik6IFBhc3MgY3B1IHRvIHNpbV9tb25pdG9yICYgbWlwczE2X2VudHJ5LgorCShzaW1fbW9uaXRvciwgbG9hZF9tZW1vcnksIHN0b3JlX21lbW9yeSwgc2lnbmFsX2V4Y2VwdGlvbik6IFVzZQorIAlgQ1BVJyBpbnN0ZWFkIG9mIFNUQVRFX0NQVS4KKworCisJKiBzaW0tbWFpbi5oOiBSZXBsYWNlIHVzZXMgb2YgU1RBVEVfQ1BVIHdpdGggQ1BVLiBSZXBsYWNlIHNkIHdpdGgKKyAJU0Qgb3IgQ1BVXy4KKwkKKwkqIHNpbS1tYWluLmggKHNpZ25hbF9leGNlcHRpb24pOiBBZGQgc2ltX2NwdSBhcmcuCisJKFNpZ25hbEV4Y2VwdGlvbiopOiBQYXNzIGJvdGggU0QgYW5kIENQVSB0byBzaWduYWxfZXhjZXB0aW9uLgorCSogaW50ZXJwLmMgKHNpZ25hbF9leGNlcHRpb24pOiBVcGRhdGUuCisJCisJKiBzaW0tbWFpbi5oICh2YWx1ZV9mcHIsIHN0b3JlX2ZwciwgZG90cmFjZSwgaWZldGNoMzIpLCBpbnRlcnAuYzoKKyAJRGl0dG8KKwkoc3luY19vcGVyYXRpb24sIHByZWZldGNoLCBjYWNoZV9vcCwgc3RvcmVfbWVtb3J5LCBsb2FkX21lbW9yeSwKKyAJYWRkcmVzc190cmFuc2xhdGlvbik6IERpdHRvCisJKGRlY29kZV9jb3Byb2MsIGNvcF9sdywgY29wX2xkLCBjb3Bfc3csIGNvcF9zZCk6IERpdHRvLgorCQorU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworU2F0IEphbiAzMSAxNDo0OToyNCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fZW5naW5lX3J1bik6IEFkZCBgbnJfY3B1cycgYXJndW1lbnQuCisKKwkqIG1pcHMuaWdlbiAobW9kZWwpOiBNYXAgcHJvY2Vzc29yIG5hbWVzIG9udG8gQkZEIG5hbWUuCQorCisJKiBzaW0tbWFpbi5oIChDUFVfQ0lBKTogRGVsZXRlLgorIAkoU0VUX0NJQSwgR0VUX0NJQSk6IERlZmluZQorCitXZWQgSmFuIDIxIDE2OjE2OjI3IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLW1haW4uaCAoR1BSX1NFVCk6IERlZmluZSwgdXNlZCBieSBpZ2VuIHdoZW4gemVyb2luZyBhCisgCXJlZ2lzZXIuCisKKwkqIGNvbmZpZ3VyZS5pbiAoZGVmYXVsdF9lbmRpYW4pOiBDb25maWd1cmUgYSBiaWctZW5kaWFuIHNpbXVsYXRvcgorIAlieSBkZWZhdWx0LgorCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKwkKK01vbiBKYW4gMTkgMjI6MjY6MjkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK01vbiBKYW4gIDUgMjA6Mzg6NTQgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX21vbml0b3IpOiBIYW5kbGUgRGVuc2FuIG1vbml0b3Igb3V0Ynl0ZQorCWFuZCBpbmJ5dGUgZnVuY3Rpb25zLgorCisxOTk3LTEyLTI5ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fZW5naW5lX3J1bik6IG1zdmMgY3BwIGJhcmZzIG9uICNpZiAoYT09YiE9YykuCisKK1dlZCBEZWMgMTcgMTQ6NDg6MjAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBNYWtlZmlsZS5pbiAodG1wLWlnZW4pOiBBcnJhbmdlIGZvciAkemVybyB0byBhbHdheXMgYmUKKwlyZXNldCB0byB6ZXJvIGFmdGVyIGV2ZXJ5IGluc3RydWN0aW9uLgorCitNb24gRGVjIDE1IDIzOjE3OjExIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworV2VkIERlYyAxMCAxNzoxMDo0NSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1pcHMuaWdlbiAoTVNVQik6IEZpeCB0byB3b3JrIGxpa2UgTUFERC4KKwkqIGdlbmNvZGUuYyAoTVNVQik6IFNpbWlsYXJseS4KKworVGh1IERlYyAgNCAwOToyMTowNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBOb3YgMjYgMTE6MDA6MjMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBtaXBzLmlnZW4gKExXQzEpOiBDb3JyZWN0IGFzc2VtYmxlciAtIGx3YzEgbm90IHN3YzEuCisKK1N1biBOb3YgMjMgMDE6NDU6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tbWFpbi5oIChzaW0tZnB1LmgpOiBJbmNsdWRlLgorCisJKiBpbnRlcnAuYyAoY29udmVydCwgU3F1YXJlUm9vdCwgUmVjaXAsIERpdmlkZSwgTXVsdGlwbHksIFN1YiwKKyAJQWRkLCBOZWdhdGUsIEFic29sdXRlVmFsdWUsIEVxdWFsLCBMZXNzLCBJbmZpbml0eSwgTmFOKTogUmV3cml0ZQorIAl1c2luZyBob3N0IGluZGVwZW5kYW50IHNpbV9mcHUgbW9kdWxlLgorCitUaHUgTm92IDIwIDE5OjU2OjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpZ25hbF9leGNlcHRpb24pOiBSZXBvcnQgaW50ZXJuYWwgZXJyb3JzIHdpdGggU0lHQUJSVAorIAlub3QgU0lHUVVJVC4KKworCSogc2ltLW1haW4uaCAoQzBfQ09ORklHKTogTmV3IHJlZ2lzdGVyLgorCShzaWduYWwuaCk6IE5vIGxvbmdlciBpbmNsdWRlLgorCisJKiBpbnRlcnAuYyAoZGVjb2RlX2NvcHJvYyk6IEFsbG93IGFjY2VzcyBDMF9DT05GSUcgdG8gcmVnaXN0ZXIuCisKK1R1ZSBOb3YgMTggMTU6MzM6NDggMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFNJTV9PQkpTKTogVXNlICQoU0lNX05FV19DT01NT05fT0JKUykuCisKK0ZyaSBOb3YgMTQgMTE6NTY6NDggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBtaXBzLmlnZW46IFRhZyB2cjUwMDAgaW5zdHJ1Y3Rpb25zLgorCShBTkRJKTogV2FzIG1pc3NpbmcgbWlwc0lWIG1vZGVsLCBmaXggYXNzZW1ibGVyIHN5bnRheC4KKwkoZG9fY19jb25kX2ZtdCk6IE5ldyBmdW5jdGlvbi4KKwkoQy5jb25kLmZtdCk6IEhhbmRsZSBtaXBzIEktSUlJIHdoaWNoIGRvIG5vdCBzdXBwb3J0IENDIGZpZWxkCisgCXNlcGFyYXRseS4KKwkoYmMxKTogSGFuZGxlIG1pcHMgSVYgd2hpY2ggZG8gbm90IGhhdmUgYSBkZWxhZWQgRkNDIHNlcGFyYXRseS4KKwkoU0RSKTogTWFzayBwYWRkciB3aGVuIEJpZ0VuZGlhbk1lbSwgbm90IHRoZSBjb252ZXJzZSBhcyBzcGVjaWZpZWQKKyAJaW4gSVYzLjIgc3BlYy4KKwkoRE1VTFQsIERNVUxUVSk6IEZvcmNlIHVzZSBvZiBob3N0cyA2NGJpdCBtdWx0aXBsaWNhdGlvbi4gIEhhbmRsZQorIAl2cjUwMDAgd2hpY2ggc2F2ZXMgTE8gaW4gYSBHUFIgc2VwYXJhdGx5LgorCQorCSogY29uZmlndXJlLmluIChlbmFibGUtc2ltLWlnZW4pOiBGb3IgdnI1MDAwLCBzZWxlY3QgdnI1MDAwCisgCXNwZWNpZmljIGluc3RydWN0aW9ucy4KKwkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCisJCitXZWQgTm92IDEyIDE0OjQyOjUyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFNJTV9PQkpTKTogQWRkIHNpbS1mcHUgbW9kdWxlLgorCisJKiBpbnRlcnAuYyAoc3RvcmVfZnByKSwgc2ltLW1haW4uaDogQWRkIHNlcGFyYXRlIGZtdF91bmludGVycHJldGVkXzMyIGFuZAorIAlmbXRfdW5pbnRlcnByZXRlZF82NCBiaXQgY2FzZXMgdG8gc3dpdGNoLiAgQ29udmVydCB0bworIAlmbXRfZm9ybWF0dGVkLAorCisJKiBzaW0tbWFpbi5oIChFTkdJTkVfSVNTVUVfUFJFRklYX0hPT0spOiBEZWZpbmUsCisKKwkqIG1pcHMuaWdlbiAoU1dSKTogTWFzayBwYWRkciB3aGVuIEJpZ0VuZGlhbk1lbSwgbm90IHRoZSBjb252ZXJzZQorIAlhcyBzcGVjaWZpZWQgaW4gSVYzLjIgc3BlYy4KKwkoTVRDMSwgRE1UQzEpOiBDYWxsIFN0b3JlRlBSIHRvIHN0b3JlIHRoZSBHUFIgaW4gdGhlIEZQUi4KKworVHVlIE5vdiAxMSAxMjozODoyMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIG1pcHMuaWdlbjogRGVsYXkgc2xvdCBicmFuY2hlcyBhZGQgT0ZGU0VUIHRvIE5JQSBub3QgQ0lBLgorIAkoTUZDMCwgTVRDMCwgU1dDMSwgTFdDMSwgU0RDMSwgTERDMSk6IEltcGxlbWVudC4KKwkoTVRDMSwgTUZDMSwgRE1UQzEsIERNRkMxLCBDRkMxLCBDVEMxKTogSW1wbGVtZW50IHNlcGFyYXRlIG5vbgorIAlQRU5ESU5HX0ZJTEwgdmVyc2lvbnMgb2YgaW5zdHJ1Y3Rpb25zLiAgU2ltcGxpZnkuCisJKFgpOiBOZXcgZnVuY3Rpb24uCisJKE1VTFQsIE1VTFRVKTogSW1wbGVtZW50IHNlcGFyYXRlIFJEPT0wIGFuZCBSRCE9MCB2ZXJzaW9ucyBvZgorIAlpbnN0cnVjdGlvbnMuCisJKEJFUVosIC4uLiwgU0xULCBTTFRJLCBUTFQsIFRMRSwgVExJLCAuLi4pOiBFeHBsaWNpdGx5IGNhc3QgR1BSIHRvCisgCWEgc2lnbmVkIHZhbHVlLgorCShNVEhJLCBNRkhJKTogRGlzYWJsZSBjb2RlIGNoZWNraW5nIEhJLUxPLgorCQorCSogc2ltLW1haW4uaCAoZG90cmFjZSx0cmFjZWZoKSwgaW50ZXJwLmM6IE1ha2UgZG90cmFjZSAmIHRyYWNlZmgKKyAJZ2xvYmFsLgorCShOVUxMSUZZX05FWFRfSU5TVFJVQ1RJT04pOiBDYWxsIGRvdHJhY2UuCisKK1RodSBOb3YgIDYgMTY6MzY6MzUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBnZW5jb2RlLmMgKGJ1aWxkX21pcHMxNl9vcGVyYW5kcyk6IFJlcGxhY2UgSVBDIHdpdGggY2lhLgorCisJKiBpbnRlcnAuYyAoc2ltX21vbml0b3IsIHNpZ25hbF9leGNlcHRpb24sIGNhY2hlX29wLCBzdG9yZV9mcHIsCisgCXZhbHVlX2ZwciwgY29wX2xkLCBjb3BfbHcsIGNvcF9zdywgY29wX3NkLCBkZWNvZGVfY29wcm9jKTogUmVwbGFjZQorIAlJUEMgdG8gYGNpYScuCisJKFVuZGVmaW5lZFJlc3VsdCk6IFJlcGxhY2UgZnVuY3Rpb24gd2l0aCBtYWNyby9mdW5jdGlvbgorIAljb21iaW5hdGlvbi4KKwkoc2ltX2VuZ2luZV9ydW4pOiBEb24ndCBzYXZlIFBDIGluIElQQy4KKworCSogc2ltLW1haW4uaCAoSVBDKTogRGVsZXRlLgorCisKKwkqIGludGVycC5jIChzaWduYWxfZXhjZXB0aW9uLCBzdG9yZV93b3JkLCBsb2FkX3dvcmQsCisgCWFkZHJlc3NfdHJhbnNsYXRpb24sIGxvYWRfbWVtb3J5LCBzdG9yZV9tZW1vcnksIGNhY2hlX29wLAorIAlwcmVmZXRjaCwgc3luY19vcGVyYXRpb24sIGlmZXRjaCwgdmFsdWVfZnByLCBzdG9yZV9mcHIsIGNvbnZlcnQsCisgCWNvcF9sdywgY29wX2xkLCBjb3Bfc3csIGNvcF9zZCwgZGVjb2RlX2NvcHJvYywgc2ltX21vbml0b3IpOiBBZGQKKyAJY3VycmVudCBpbnN0cnVjdGlvbiBhZGRyZXNzIC0gY2lhIC0gYXJndW1lbnQuCisJKHNpbV9yZWFkLCBzaW1fd3JpdGUpOiBDYWxsIGFkZHJlc3NfdHJhbnNsYXRpb24gZGlyZWN0bHkuCisJKHNpbV9lbmdpbmVfcnVuKTogUmVuYW1lIHZhcmlhYmxlIHZhZGRyIHRvIGNpYS4KKwkoc2lnbmFsX2V4Y2VwdGlvbik6IFBhc3MgY2lhIHRvIHNpbV9tb25pdG9yCisJCisJKiBzaW0tbWFpbi5oIChTaWduYWxFeGNlcHRpb24sIExvYWRXb3JkLCBTdG9yZVdvcmQsIENhY2hlT3AsCisgCVByZWZldGNoLCBTeW5jT3BlcmF0aW9uLCBWYWx1ZUZQUiwgU3RvcmVGUFIsIENvbnZlcnQsIENPUF9MVywKKyAJQ09QX0xELCBDT1BfU1csIENPUF9TRCwgRGVjb2RlQ29wcm9jKTogVXBkYXRlLgorCisJKiBzaW0tbWFpbi5oIChTaWduYWxFeGNlcHRpb25TaW11bGF0b3JGYXVsdCk6IERlbGV0ZSBkZWZpbml0aW9uLgorICAJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBSZXBsYWNlIFNpZ25hbEV4Y2VwdGlvblNpbXVsYXRvckZhdWx0IHdpdGgKKyAJU0lNX0FTU0VSVC4KKwkKKwkqIGludGVycC5jIChzaWduYWxfZXhjZXB0aW9uKTogUGFzcyByZXN0YXJ0IGFkZHJlc3MgdG8KKyAJc2ltX2VuZ2luZV9yZXN0YXJ0LgorCisJKiBNYWtlZmlsZS5pbiAoc2VtYW50aWNzLm8sIGVuZ2luZS5vLCBzdXBwb3J0Lm8sIGl0YWJsZS5vLAorIAlpZGVjb2RlLm8pOiBBZGQgZGVwZW5kZW5jeS4KKworCSogc2ltLW1haW4uaCAoU0lNX0VOR0lORV9IQUxUX0hPT0ssIFNJTV9FTkdJTkVfUkVTVU1FX0hPT0spOgorIAlEZWxldGUgZGVmaW5pdGlvbnMKKwkoREVMQVlfU0xPVCk6IFVwZGF0ZSBOSUEgbm90IFBDIHdpdGggYnJhbmNoIGFkZHJlc3MuCisJKE5VTExJRllfTkVYVF9JTlNUUlVDVElPTik6IFNldCBOSUEgdG8gaW5zdHJ1Y3Rpb24gYWZ0ZXIgbmV4dC4KKworCSogbWlwcy5pZ2VuOiBVc2UgQ0lBIG5vdCBQQyBpbiBicmFuY2ggY2FsY3VsYXRpb25zLgorCShpbGxlZ2FsKTogQ2FsbCBTaWduYWxFeGNlcHRpb24uCisgCShCRVEsIEFERElVKTogRml4IGFzc2VtYmxlci4KKworV2VkIE5vdiAgNSAxMjoxOTo1NiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIG0xNi5pZ2VuIChKQUxYKTogV2FzIG1pc3NpbmcuCisKKwkqIGNvbmZpZ3VyZS5pbiAoZW5hYmxlLXNpbS1pZ2VuKTogTmV3IGNvbmZpZ3VyYXRpb24gb3B0aW9uLgorCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKwkKKwkqIHNpbS1tYWluLmggKE1BWF9JTlNOUywgSU5TTl9OQU1FKTogRGVmaW5lLgorCisJKiBpbnRlcnAuYyAobG9hZF9tZW1vcnksIHN0b3JlX21lbW9yeSk6IERlbGV0ZSBwYXJhbWV0ZXIgUkFXLgorCShzaW1fcmVhZCwgc2ltX3dyaXRlKTogVXNlIHNpbV9jb3JlX3tyZWFkLHdyaXRlfV9idWZmZXIgZGlyZWN0bHkKKyAJYnlwYXNzaW5nIHtsb2FkLHN0b3JlfV9tZW1vcnkuCisKKwkqIHNpbS1tYWluLmggKEJ5dGVTd2FwTWVtKTogRGVsZXRlIGRlZmluaXRpb24uCisKKwkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbWVtb3B0IG1vZHVsZS4KKworCSogaW50ZXJwLmMgKHNpbV9kb19jb21tYW5kLCBzaW1fY29tbWFuZHMpOiBEZWxldGUgbWlwcyBzcGVjaWZpYworIAljb21tYW5kcy4gIEhhbmRsZWQgYnkgbW9kdWxlIHNpbS1vcHRpb25zLgorCQkKKwkqIHNpbS1tYWluLmggKFNJTV9IQVZFX0ZMQVRNRU0pOiBVbmRlZmluZSwgdXNlIHNpbS1jb3JlLm8gbW9kdWxlLgorCShXSVRIX01PRFVMT19NRU1PUlkpOiBEZWZpbmUuCisKKwkqIGludGVycC5jIChzaW1faW5mbyk6IERlbGV0ZSBjb2RlIHByaW50aW5nIG1lbW9yeSBzaXplLgorCisJKiBpbnRlcnAuYyAobWlwc19zaXplKTogTmVlIHNpbV9zaXplLCBkZWxldGUgZnVuY3Rpb24uCisJKHBvd2VyMik6IERlbGV0ZS4KKwkobW9uaXRvciwgbW9uaXRvcl9iYXNlLCBtb25pdG9yX3NpemUpOiBEZWxldGUgZ2xvYmFsIHZhcmlhYmxlcy4KKwkoc2ltX29wZW4sIHNpbV9jbG9zZSk6IERlbGV0ZSBjb2RlIGNyZWF0aW5nIG1vbml0b3IgYW5kIG90aGVyCisgCW1lbW9yeSByZWdpb25zLiAgVXNlIHNpbS1tZW1vcHRzIG1vZHVsZSwgdmlhIHNpbV9kb19jb21tYW5kZiwgdG8KKyAJbWFuYWdlIG1lbW9yeSByZWdpb25zLgorCShsb2FkX21lbW9yeSwgc3RvcmVfbWVtb3J5KTogVXNlIHNpbS1jb3JlIGZvciBtZW1vcnkgbW9kZWwuCisJCisJKiBpbnRlcnAuYyAoYWRkcmVzc190cmFuc2xhdGlvbik6IERlbGV0ZSBhbGwgbWVtb3J5IG1hcCBjb2RlCisgCWV4Y2VwdCBsaW5lIGZvcmNpbmcgMzIgYml0IGFkZHJlc3Nlcy4KKworV2VkIE5vdiAgNSAxMToyMToxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1tYWluLmggKFdJVEhfVFJBQ0UpOiBEZWxldGUgZGVmaW5pdGlvbi4gIEVuYWJsZXMgY29tbW9uCisgCXRyYWNlIG9wdGlvbnMuCisKKwkqIGludGVycC5jIChsb2dmaCwgbG9nZmlsZSk6IERlbGV0ZSBnbG9iYWxzLgorCShzaW1fb3Blbiwgc2ltX2Nsb3NlKTogRGVsZXRlIGNvZGUgb3BlbmluZyAmIGNsb3NpbmcgbG9nIGZpbGUuCisJKG1pcHNfb3B0aW9uX2hhbmRsZXIpOiBEZWxldGUgLWwgYW5kIC1uIG9wdGlvbnMuCisJKE9QVElPTiBtaXBzX29wdGlvbnMpOiBEaXR0by4KKworCSogaW50ZXJwLmMgKE9QVElPTiBtaXBzX29wdGlvbnMpOiBSZW5hbWUgb3B0aW9uIHRyYWNlIHRvIGRpbmVyby4KKwkobWlwc19vcHRpb25faGFuZGxlcik6IFVwZGF0ZS4KKworV2VkIE5vdiAgNSAwOTozNTo1OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChmZXRjaF9zdHIpOiBOZXcgZnVuY3Rpb24uCisJKHNpbV9tb25pdG9yKTogUmV3cml0ZSB1c2luZyBzaW1fcmVhZCAmIHNpbV93cml0ZS4KKwkoc2ltX29wZW4pOiBDaGVjayBtYWdpYyBudW1iZXIuCisJKHNpbV9vcGVuKTogV3JpdGUgbW9uaXRvciB2ZWN0b3JzIGludG8gbWVtb3J5IHVzaW5nIHNpbV93cml0ZS4KKwkoTU9OSVRPUl9CQVNFLCBNT05JVE9SX1NJWkUsIE1FTV9TSVpFKTogRGVmaW5lLgorCShzaW1fcmVhZCwgc2ltX3dyaXRlKTogU2ltcGxpZnkgLSB0cmFuc2ZlciBkYXRhIG9uZSBieXRlIGF0IGEKKyAJdGltZS4KKwkobG9hZF9tZW1vcnksIHN0b3JlX21lbW9yeSk6IENsYXJpZnkgbWVhbmluZyBvZiBwYXJhbWV0ZXIgUkFXLgorCisJKiBzaW0tbWFpbi5oIChpc0hPU1QpOiBEZWZldGUgZGVmaW5pdGlvbi4KKwkoaXNUQVJHRVQpOiBNYXJrIGFzIGRlcHJlY2lhdGVkLgorCShhZGRyZXNzX3RyYW5zbGF0aW9uKTogRGVsZXRlIHBhcmFtZXRlciBIT1NULgorCisJKiBpbnRlcnAuYyAoYWRkcmVzc190cmFuc2xhdGlvbik6IERlbGV0ZSBwYXJhbWV0ZXIgSE9TVC4KKworV2VkIE9jdCAyOSAxMToxMzo1NiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIG1pcHMuaWdlbjogCisKKwkqIE1ha2VmaWxlLmluIChJR0VOX0lOQ0xVREUpOiBGaWxlcyBpbmNsdWRlZCBieSBtaXBzLmlnZW4uCisJKHRtcC1pZ2VuLCB0bXAtbTE2KTogRGVwZW5kIG9uIElHRU5fSU5DTFVERS4KKworVHVlIE9jdCAyOCAxMTowNjo0NyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIG1pcHMuaWdlbjogQWRkIG1vZGVsIGZpbHRlciBmaWVsZCB0byByZWNvcmRzLgorCitNb24gT2N0IDI3IDE3OjUzOjU5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFNJTV9OT19DRkxBR1MpOiBEZWZpbmUuICBEZWZpbmUgV0lUSF9JR0VOPTAuCisJCisJaW50ZXJwLmMgKHNpbV9lbmdpbmVfcnVuKTogRG8gbm90IGNvbXBpbGUgZnVuY3Rpb24gc2ltX2VuZ2luZV9ydW4KKyAJd2hlbiBXSVRIX0lHRU4gPT0gMS4KKworCSogY29uZmlndXJlLmluIChzaW1faWdlbl9mbGFncywgc2ltX20xNl9mbGFncyk6IFNldCBhY2NvcmRpbmcgdG8KKyAJdGFyZ2V0IGFyY2hpdGVjdHVyZS4KKworCU1ha2VmaWxlLmluICh0bXAtaWdlbiwgdG1wLW0xNik6IERyb3AgLUYgYW5kIC1NIG9wdGlvbnMgdG8KKyAJaWdlbi4gUmVwbGFjZSB3aXRoIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIHNpbV9pZ2VuX2ZsYWdzIC8KKyAJc2ltX20xNl9mbGFncy4KKworCSogbTE2LmlnZW46IE5ldyBmaWxlLiAgQ29weSBtaXBzMTYgaW5zbnMgaGVyZS4KKwkqIG1pcHMuaWdlbjogRnJvbSBoZXJlLgorCitNb24gT2N0IDI3IDEzOjUzOjU5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFNJTV9OT19PQkopOiBEZWZpbmUsIG1vdmUgU0lNX00xNl9PQkosIFNJTV9JR0VOX09CSgorIAl0byB0b3AuCisJKHRtcC1pZ2VuLCB0bXAtbTE2KTogUGFzcyAtSSBzcmNkaXIgdG8gaWdlbi4KKworU2F0IE9jdCAyNSAxNjo1MTo0MCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogZ2VuY29kZS5jIChidWlsZF9pbnN0cnVjdGlvbik6IEZvbGxvdyBzaW1fd3JpdGUncyBsZWFkIGluIHVzaW5nCisJQmlnRW5kaWFuTWVtIGluc3RlYWQgb2YgIUJ5dGVTd2FwTWVtLgorCitGcmkgT2N0IDI0IDE3OjQxOjQ5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluIChzaW1fZ2VuKTogRGVwZW5kZW50IG9uIHRhcmdldCwgc2VsZWN0IHR5cGUgb2YKKyAJZ2VuZXJhdG9yLiAgQWx3YXlzIHNlbGVjdCBvbGQgc3R5bGUgZ2VuZXJhdG9yLgorCisJY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKworCU1ha2VmaWxlLmluICh0bXAtaWdlbiwgdG1wLW0xNiwgY2xlYW4tbTE2LCBjbGVhbi1pZ2VuKTogTmV3CisgCXRhcmdldHMuCisJKFNJTV9NMTZfQ0ZMQUdTLCBTSU1fTTE2X0FMTCwgU0lNX00xNl9PQkosIEJVSUxUX1NSQ19GUk9NX00xNiwKKyAJU0lNX0lHRU5fQ0ZMQUdTLCBTSU1fSUdFTl9BTEwsIFNJTV9JR0VOX09CSiwgQlVJTFRfU1JDX0ZST01fSUdFTiwKKyAJSUdFTl9UUkFDRSwgSUdFTl9JTlNOLCBJR0VOX0RDKTogRGVmaW5lCisJKFNJTV9FWFRSQV9DRkxBR1MsIFNJTV9FWFRSQV9BTEwsIFNJTV9PQkpTKTogQWRkIG1lbWJlcgorIAlTSU1fQHNpbV9nZW5AXyosIHNldCBieSBhdXRvY29uZi4KKwkKK1dlZCBPY3QgMjIgMTI6NTI6MDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tbWFpbi5oIChOVUxMSUZZX05FWFRfSU5TVFJVQ1RJT04sIERFTEFZX1NMT1QpOiBEZWZpbmUuCisKKwkqIGludGVycC5jIChDb2xkUmVzZXQpOiBSZW1vdmUgI2lmZGVmIEhBU0ZQVSwgY2hlY2sKKyAJQ1VSUkVOVF9GTE9BVElOR19QT0lOVCBpbnN0ZWFkLgorCisJKiBpbnRlcnAuYyAoaWZldGNoMzIpOiBOZXcgZnVuY3Rpb24uIEZldGNoIDMyIGJpdCBpbnN0cnVjdGlvbi4KKwkoYWRkcmVzc190cmFuc2xhdGlvbik6IFJhaXNlIGV4Y2VwdGlvbiBJbnN0cnVjdGlvbkZldGNoIHdoZW4KKyAJdHJhbnNsYXRpb24gZmFpbHMgYW5kIGlzSU5TVFJVQ1RJT04uCisJCisJKiBpbnRlcnAuYyAoc2ltX29wZW4sIHNpbV93cml0ZSwgc2ltX21vbml0b3IsIHN0b3JlX3dvcmQsCisgCXNpbV9lbmdpbmVfcnVuKTogQ2hhbmdlIHR5cGUgb2Ygb2YgdmFkZHIgYW5kIHBhZGRyIHRvCisgCWFkZHJlc3Nfd29yZC4KKwkoYWRkcmVzc190cmFuc2xhdGlvbiwgcHJlZmV0Y2gsIGxvYWRfbWVtb3J5LCBzdG9yZV9tZW1vcnksCisgCWNhY2hlX29wKTogQ2hhbmdlIHR5cGUgb2YgdkFkZHIgYW5kIHBBZGRyIHRvIGFkZHJlc3Nfd29yZC4KKworCSogZ2VuY29kZS5jIChidWlsZF9pbnN0cnVjdGlvbik6IENoYW5nZSB0eXBlIG9mIHZhZGRyIGFuZCBwYWRkciB0bworIAlhZGRyZXNzX3dvcmQuCisKK01vbiBPY3QgMjAgMTU6Mjk6MDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW0tbWFpbi5oIChBTFU2NF9FTkQsIEFMVTMyX0VORCk6IFVzZSBBTFUqX09WRVJGTE9XX1JFU1VMVAorIAltYWNybyB0byBvYnRhaW4gcmVzdWx0IG9mIEFMVSBvcC4KKworVHVlIE9jdCAyMSAxNzozOToxNCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1faW5mbyk6IENhbGwgcHJvZmlsZV9wcmludC4KKworTW9uIE9jdCAyMCAxMzozMToyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tcHJvZmlsZS5vIG1vZHVsZS4KKworCSogc2ltLW1haW4uaCAoV0lUSF9QUk9GSUxFKTogRG8gbm90IGRlZmluZSwgZGVmaW5lZCBpbgorIAljb21tb24vc2ltLWNvbmZpZy5oLiAgVXNlIHNpbS1wcm9maWxlIG1vZHVsZS4KKwkoc2ltUFJPRklMRSk6IERlbGV0ZSBkZWZpbnRpb24uCisKKwkqIGludGVycC5jIChQUk9GSUxFKTogRGVsZXRlIGRlZmluaXRpb24uCisJKG1pcHNfb3B0aW9uX2hhbmRsZXIpOiBEZWxldGUgJ3AnLCAneScgYW5kICd4JyBwcm9maWxlIG9wdGlvbnMuCisJKHNpbV9jbG9zZSk6IERlbGV0ZSBjb2RlIHdyaXRpbmcgcHJvZmlsZSBoaXN0b2dyYW0uCisJKG1pcHNfc2V0X3Byb2ZpbGUsIG1pcHNfc2V0X3Byb2ZpbGVfc2l6ZSwgd3JpdGVvdXQxNiwgd3JpdGVvdXQzMik6CisgCURlbGV0ZS4KKwkoc2ltX2VuZ2luZV9ydW4pOiBEZWxldGUgY29kZSBwcm9maWxpbmcgdGhlIFBDLgorCitNb24gT2N0IDIwIDEzOjMxOjIwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLW1haW4uaCAoU0lHTkVYVEVORCk6IEZvcmNlIHR5cGUgb2YgcmVzdWx0IHRvIHVuc2lnbmVkX3dvcmQuCisKKwkqIGludGVycC5jIChzaW1fbW9uaXRvcik6IE1ha2UgcmVnaXN0ZXIgcG9pbnRlcnMgb2YgdHlwZQorIAl1bnNpZ25lZF93b3JkKi4KKworCSogc2ltLW1haW4uaDogTWFrZSByZWdpc3RlcnMgb2YgdHlwZSB1bnNpZ25lZF93b3JkIG5vdAorIAlzaWduZWRfd29yZC4KKworVGh1IE9jdCAxNiAxMDozMTozOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzeW5jX29wZXJhdGlvbik6IFJlbmFtZSBmcm9tIFN5bmNPcGVyYXRpb24sIG1ha2UKKyAJZ2xvYmFsLCBhZGQgU0QgYXJndW1lbnQuCisJKHByZWZldGNoKTogUmVuYW1lIGZyb20gUHJlZmV0Y2gsIG1ha2UgZ2xvYmFsLCBhZGQgU0QgYXJndW1lbnQuCisJKGRlY29kZV9jb3Byb2MpOiBNYWtlIGdsb2JhbC4KKworCSogc2ltLW1haW4uaCAoU3luY09wZXJhdGlvbiwgRGVjb2RlQ29wcm9jLCBQZWZldGNoKTogRGVmaW5lLgorCisJKiBnZW5jb2RlLmMgKGJ1aWxkX2luc3RydWN0aW9uKTogR2VuZXJhdGUgRGVjb2RlQ29wcm9jIG5vdAorIAlkZWNvZGVfY29wcm9jIGNhbGxzLgorCisJKiBpbnRlcnAuYyAoU0VURkNDLCBHRVRGQ0MsIFBSRVZDT0MxKTogTW92ZSB0byBzaW0tbWFpbi5oCisJKFNpemVGR1IpOiBNb3ZlIHRvIHNpbS1tYWluLmgKKwkoc2ltSEFMVEVYLCBzaW1IQUxUSU4sIHNpbVRSQUNFLCBzaW1QUk9GSUxFLCBzaW1ERUxBWVNMT1QsCisgCXNpbVNJR0lOVCwgc2ltSkFMREVMQVlTTE9UKTogTW92ZSB0byBzaW0tbWFpbi5oCisJKEZQX0ZMQUdTLCBGUF9FTkFCTEUsIEZQX0NBVVNFLCBJUiwgVUYsIE9GLCBEWiwgSU8sIFVPKTogTW92ZSB0bworIAlzaW0tbWFpbi5oLgorCShGUF9GUywgRlBfTUFTS19STSwgRlBfU0hfUk0sIEZQX1JNX05FQVJFU1QsIEZQX1JNX1RPUElORiwKKyAJRlBfUk1fVE9NSU5GLCBHRVRSTSk6IE1vdmUgdG8gc2ltLW1haW4uaC4KKwkoVW5jYWNoZWQsIENhY2hlZE5vbmNvaGVyZW50LCBDYWNoZWRDb2hlcmVudCwgQ2FjaGVkLAorIAlpc0lOU1RSVUNUSU9OLCAuLi4sIEFjY2Vzc0xlbmd0aF9CWVRFLCAuLi4pOiBNb3ZlIHRvIHNpbS1tYWluLmguCisJKFVzZXJNb2RlLCBCaWdFbmRpYW5NZW0sIEJ5dGVTd2FwTWVtLCBSZXZlcnNlRW5kaWFuLAorIAlCaWdFbmRpYW5DUFUsIHN0YXR1c19LU1VfbWFzaywgLi4uKS4gTW92ZWQgdG8gc2ltLW1haW4uaAorCQorCSogc2ltLW1haW4uaCAoQUxVMzJfRU5ELCBBTFU2NF9FTkQpOiBEZWZpbmUuIFdoZW4gb3ZlcmZsb3cgcmFpc2UKKyAJZXhjZXB0aW9uLgorCShzaW0tYWx1LmgpOiBJbmNsdWRlLgorCShOVUxMSUZZX05JQSwgTlVMTF9DSUEsIENQVV9DSUEpOiBEZWZpbmUuCisgCShzaW1fY2lhKTogVHlwZWRlZiB0byBpbnN0cnVjdGlvbl9hZGRyZXNzLgorCQorVGh1IE9jdCAxNiAxMDozMTo0MSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChpbnRlcnAubyk6IFJlbmFtZSBnZW5lcmF0ZWQgZmlsZSBlbmdpbmUuYyB0bworCW9lbmdpbmUuYy4KKyAgCQorCSogaW50ZXJwLmM6IFVwZGF0ZS4KKwkKK1RodSBPY3QgMTYgMTA6MzE6NDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBnZW5jb2RlLmMgKGJ1aWxkX2luc3RydWN0aW9uKTogVXNlIEZQUl9TVEFURSBub3QgZnByX3N0YXRlLgorCQorVGh1IE9jdCAxNiAxMDozMTozOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdlbmNvZGUuYyAoYnVpbGRfaW5zdHJ1Y3Rpb24pOiBGb3IgIkZQU1FSVCIsIG91dHB1dCBjb3JyZWN0CisgCW51bWJlciBvZiBhcmd1bWVudHMgdG8gUmVjaXAuCisJCitUdWUgT2N0IDE0IDE3OjM4OjE4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGludGVycC5vKTogRGVwZW5kcyBvbiBzaW0tbWFpbi5oCisKKwkqIGludGVycC5jIChtaXBzMTZfZW50cnksIENvbGRSZXNldCxkb3RyYWNlKTogQWRkIFNEIGFyZ3VtZW50LiBVc2UgR1BSIG5vdCByZWdpc3RlcnMuCisKKwkqIHNpbS1tYWluLmggKHNpbV9jcHUpOiBBZGQgcmVnaXN0ZXJzLCByZWdpc3Rlcl93aWR0aHMsIGZwcl9zdGF0ZSwKKyAJaXBjLCBkc3BjLCBwZW5kaW5nXyosIGhpYWNjZXNzLCBsb2FjY2Vzcywgc3RhdGUsIGRzc3RhdGUgZmllbGRzLgorIAkoUkVHSVNURVJTLCBSRUdJU1RFUl9XSURUSFMsIEZQUl9TVEFURSwgSVBDLCBEU1BDLCBQRU5ESU5HXyosCisgCVNUQVRFLCBEU1NUQVRFKTogRGVmaW5lCisJKEdQUiwgRkdSSURYLCAuLik6IERlZmluZS4KKworCSogaW50ZXJwLmMgKHJlZ2lzdGVycywgcmVnaXN0ZXJfd2lkdGhzLCBmcHJfc3RhdGUsIGlwYywgZHNwYywKKyAJcGVuZGluZ18qLCBoaWFjY2VzcywgbG9hY2Nlc3MsIHN0YXRlLCBkc3N0YXRlKTogRGVsZXRlIGdsb2JhbHMuCisJKEdQUiwgRkdSSURYLCAuLi4pOiBEZWxldGUgbWFjcm9zLgorCQorCSogaW50ZXJwLmM6IFVwZGF0ZSBuYW1lcyB0byBtYXRjaCBkZWZpbmVzIGZyb20gc2ltLW1haW4uaAorCQorVHVlIE9jdCAxNCAxNToxMTo0NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fbW9uaXRvcik6IEFkZCBTRCBhcmd1bWVudC4KKwkoc2ltX3dhcm5pbmcpOiBEZWxldGUuICBSZXBsYWNlIGNhbGxzIHdpdGggY2FsbHMgdG8KKyAJc2ltX2lvX2VwcmludGYuCisJKHNpbV9lcnJvcik6IERlbGV0ZS4gUmVwbGFjZSBjYWxscyB3aXRoIHNpbV9pb19lcnJvci4KKwkob3Blbl90cmFjZSwgd3JpdGVvdXQzMiwgd3JpdGVvdXQxNiwgZ2V0bnVtKTogQWRkIFNEIGFyZ3VtZW50LgorCShtaXBzX3NldF9wcm9maWxlKTogUmVuYW1lIGZyb20gc2ltX3NldF9wcm9maWxlLiBBZGQgU0QgYXJndW1lbnQuCisJKG1pcHNfc2V0X3Byb2ZpbGVfc2l6ZSk6IFJlbmFtZSBmcm9tIHNpbV9zZXRfcHJvZmlsZV9zaXplLiBBZGQgU0QKKyAJYXJndW1lbnQuCisJKG1pcHNfc2l6ZSk6IFJlbmFtZSBmcm9tIHNpbV9zaXplLiBBZGQgU0QgYXJndW1lbnQuCisKKwkqIGludGVycC5jIChzaW11bGF0b3IpOiBEZWxldGUgZ2xvYmFsIHZhcmlhYmxlLgorCShjYWxsYmFjayk6IERlbGV0ZSBnbG9iYWwgdmFyaWFibGUuCisJKG1pcHNfb3B0aW9uX2hhbmRsZXIsIHNpbV9vcGVuLCBzaW1fd3JpdGUsIHNpbV9yZWFkLAorIAlzaW1fc3RvcmVfcmVnaXN0ZXIsIHNpbV9mZXRjaF9yZWdpc3Rlciwgc2ltX2luZm8sIHNpbV9kb19jb21tYW5kLAorIAlzaW1fc2l6ZSxzaW1fbW9uaXRvcik6IFVzZSBzaW1faW9fKiBub3QgY2FsbGJhY2stPiouCisJKHNpbV9vcGVuKTogWkFMTE9DIHNpbXVsYXRvciBzdHJ1Y3QuCisJKFBST0ZJTEUpOiBEbyBub3QgZGVmaW5lLgorCitUdWUgT2N0IDE0IDEzOjM1OjQ4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9vcGVuKSwgc3VwcG9ydC5oOiBSZXBsYWNlIENIRUNLU0lNIG1hY3JvIGZvdW5kIGluCisgCXN1cHBvcnQuaCB3aXRoIGNvcnJlc3BvbmRpbmcgY29kZS4KKworCSogc2ltLW1haW4uaCAod29yZDY0LCB1d29yZDY0KSwgc3VwcG9ydC5oOiBNb3ZlIGRlZmluaXRpb24gdG8KKyAJc2ltLW1haW4uaC4KKwkoV09SRDY0TE8sIFdPUkQ2NEhJLCBTRVQ2NExPLCBTRVQ2NEhJLCBXT1JENjQsIFVXT1JENjQpOiBEaXR0by4KKworCSogc3VwcG9ydC5oOiBEZWxldGUKKwkqIE1ha2VmaWxlLmluOiBVcGRhdGUgZGVwZW5kZW5jaWVzCisJKiBpbnRlcnAuYzogRG8gbm90IGluY2x1ZGUuCisJCitUdWUgT2N0IDE0IDEzOjM1OjQ4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKGFkZHJlc3NfdHJhbnNsYXRpb24sIGxvYWRfbWVtb3J5LCBzdG9yZV9tZW1vcnksCisgCWNhY2hlX29wKTogUmVuYW1lIHRvIGZyb20gQWRkcmVzc1RyYW5zbGF0aW9uIGV0LmFsLiwgbWFrZSBnbG9iYWwsCisgCWFkZCBTRCBhcmd1bWVudAorCQorCSogc2ltLW1haW4uaCAoQWRkcmVzc1RyYW5zbGF0aW9uLCBMb2FkTWVtb3J5LCBTdG9yZU1lbW9yeSwKKyAJQ2FjaGVPcCk6IERlZmluZS4KKwkKKwkqIGludGVycC5jIChTaWduYWxFeGNlcHRpb24pOiBSZW5hbWUgdG8gc2lnbmFsX2V4Y2VwdGlvbiwgbWFrZQorIAlnbG9iYWwuCisKKwkqIGludGVycC5jIChJbnRlcnJ1cHQsIC4uLik6IE1vdmUgZGVmaW5pdGlvbnMgdG8gc2ltLW1haW4uaC4KKwkKKwkqIHNpbS1tYWluLmggKFNpZ25hbEV4Y2VwdGlvbiwgU2lnbmFsRXhjZXB0aW9uSW50ZXJydXB0LAorIAlTaWduYWxFeGNlcHRpb25JbnN0cnVjdGlvbkZldGNoLCBTaWduYWxFeGNlcHRpb25BZGRyZXNzU3RvcmUsCisgCVNpZ25hbEV4Y2VwdGlvbkFkZHJlc3NMb2FkLCBTaWduYWxFeGNlcHRpb25TaW11bGF0b3JGYXVsdCwKKyAJU2lnbmFsRXhjZXB0aW9uSW50ZWdlck92ZXJmbG93LCBTaWduYWxFeGNlcHRpb25Db1Byb2Nlc3NvclVudXNhYmxlKToKKyAJRGVmaW5lLgorICAJCisJKiBpbnRlcnAuYywgc3VwcG9ydC5oOiBVc2UuCisJCitUdWUgT2N0IDE0IDEzOjE5OjIwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKFZhbHVlRlBSLCBTdG9yZUZQUiksIHNpbS1tYWluLmg6IE1ha2UgZ2xvYmFsLCByZW5hbWUKKyAJdG8gdmFsdWVfZnByIC8gc3RvcmVfZnByLiBBZGQgU0QgYXJndW1lbnQuCisJKE5hTiwgSW5maW5pdHksIExlc3MsIEVxdWFsLCBBYnNvbHV0ZVZhbHVlLCBOZWdhdGUsIEFkZCwgU3ViLAorIAlNdWx0aXBseSwgRGl2aWRlLCBSZWNpcCwgU3F1YXJlUm9vdCwgQ29udmVydCk6IE1ha2UgZ2xvYmFsLgorCisJKiBzaW0tbWFpbi5oIChWYWx1ZUZQUiwgU3RvcmVGUFIpOiBEZWZpbmUuCisJCitUdWUgT2N0IDE0IDEzOjA2OjU1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9lbmdpbmVfcnVuKTogQ2hlY2sgY29uc2lzdGVuY3kgYmV0d2VlbiBjb25maWd1cmUKKyAJV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFIGFuZCBXSVRIX0ZMT0FUSU5HX1BPSU5UIGFuZCBnZW5zaW0gR1BSTEVOCisgCWFuZCBIQVNGUFUuCisKKwkqIGNvbmZpZ3VyZS5pbiAobWlwc19iaXRzaXplKTogQ29uZmlndXJlIFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRS4KKyAgICAgICAgKG1pcHNfZnB1KTogQ29uZmlndXJlIFdJVEhfRkxPQVRJTkdfUE9JTlQuCisJKG1pcHNfZW5kaWFuKTogQ29uZmlndXJlIFdJVEhfVEFSR0VUX0VORElBTi4KKwkqIGNvbmZpZ3VyZTogVXBkYXRlLgorCitGcmkgT2N0ICAzIDA5OjI4OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gU2VwIDI5IDE0OjQ1OjAwIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitGcmkgU2VwIDI2IDEyOjQ4OjE4IDE5OTcgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmM6IEFsbG93IERlYnVnLCBERVBDLCBhbmQgRVBDIHJlZ2lzdGVycyB0byBiZSBleGFtaW5lZCBpbiBHREIuCisKK1RodSBTZXAgMjUgMTE6MTU6MjIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBnZW5jb2RlLmMgKHByaW50X2lnZW5faW5zbl9tb2RlbHMpOiBBc3N1bWUgY2VydGFpbiBhcmNoaXRlY3R1cmVzCisgCWluY2x1ZGUgYWxsIG1pcHMqIGluc3RydWN0aW9ucy4KKwkocHJpbnRfaWdlbl9pbnNuX2Zvcm1hdCk6IFVzZSBkYXRhX3NpemU9PS0xIGFzIG1hcmtlciBmb3IgTUlQUzE2CisgCWluc3RydWN0aW9uLgorCisJKiBNYWtlZmlsZS5pbiAodG1wLmlnZW4pOiBBZGQgdGFyZ2V0LiBHZW5lcmF0ZSBpZ2VuIGlucHV0IGZyb20KKyAJZ2VuY29kZSBmaWxlLgorCisJKiBnZW5jb2RlLmMgKEZFQVRVUkVfSUdFTik6IERlZmluZS4KKwkobWFpbik6IEFkZCAtLWlnZW4gb3B0aW9uLiAgR2VuZXJhdGUgb3V0cHV0IGluIGlnZW4gZm9ybWF0LgorCShwcm9jZXNzX2luc3RydWN0aW9ucyk6IEZvcm1hdCBvdXRwdXQgYWNjb3JkaW5nIHRvIGlnZW4gb3B0aW9uLgorCShwcmludF9pZ2VuX2luc25fZm9ybWF0KTogTmV3IGZ1bmN0aW9uLgorCShwcmludF9pZ2VuX2luc25fbW9kZWxzKTogTmV3IGZ1bmN0aW9uLgorCShwcm9jZXNzX2luc3RydWN0aW9ucyk6IE9ubHkgaXNzdWUgd2FybmluZ3MgYW5kIGlnbm9yZQorIAlpbnN0cnVjdGlvbnMgd2hlbiBubyBGRUFUVVJFX0lHRU4uCisKK1dlZCBTZXAgMjQgMTc6Mzg6NTcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoQ09QX1NELCBDT1BfTEQpOiBBZGQgVU5VU0VEIHRvIHBhY2lmeSBHQ0MgZm9yIHNvbWUKKyAJTUlQUyB0YXJnZXRzLgorCitUdWUgU2VwIDIzIDExOjA0OjM4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgU2VwIDIzIDEwOjE5OjUxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFNJTV9BTElHTk1FTlQsIFNJTV9FTkRJQU4sIFNJTV9IT1NURU5ESUFOLAorIAlTSU1fUkVTRVJWRURfQklUUyk6IERlbGV0ZSwgbW92ZWQgdG8gY29tbW9uLgorCShTSU1fRVhUUkFfQ0ZMQUdTKTogVXBkYXRlLgorCQorTW9uIFNlcCAyMiAxMTo0NjoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ29uZmlndXJlIG5vbi1zdHJpY3QgbWVtb3J5IGFsaWdubWVudC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworRnJpIFNlcCAxOSAxNzo0NToyNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworU2F0IFNlcCAyMCAxNDowNzoyOCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogZ2VuY29kZS5jIChTREJCUCxERVJFVCk6IEFkZGVkICgzOTAwKSBpbnNucy4KKwkoUkZFKTogVHVybiBvbiBmb3IgMzkwMC4KKwkqIGludGVycC5jIChEZWJ1Z0JyZWFrUG9pbnQsREVQQyxEZWJ1ZyxEZWJ1Z18qKTogQWRkZWQuCisJKGRzc3RhdGUpOiBNYWRlIGdsb2JhbC4KKwkoU1VCVEFSR0VUX1IzOTAwKTogQWRkZWQuCisJKENBTkNFTERFTEFZU0xPVCk6IE5ldy4KKwkoU2lnbmFsRXhjZXB0aW9uKTogSWdub3JlIFN5c3RlbUNhbGwgcmF0aGVyIHRoYW4gaWdub3JlIGFuZAorCXRlcm1pbmF0ZS4gIEFkZCBEZWJ1Z0JyZWFrUG9pbnQgaGFuZGxpbmcuCisJKGRlY29kZV9jb3Byb2MpOiBOZXcgaW5zbnMgUkZFLCBERVJFVDsgYW5kIG5ldyByZWdpc3RlcnMgRGVidWcKKwlhbmQgREVQQyBwcm90ZWN0ZWQgYnkgU1VCVEFSR0VUX1IzOTAwLgorCShzaW1fZW5naW5lX3J1bik6IFVzZSBDQU5DRUxERUxBWVNMT1QgcmF0aGVyIHRoYW4gY2xlYXJpbmcKKwliaXRzIGV4cGxpY2l0bHkuCisJKiBNYWtlZmlsZS5pbixjb25maWd1cmUuaW46IEFkZCBtaXBzIHN1YnRhcmdldCBvcHRpb24uCisJKiBjb25maWd1cmU6IFVwZGF0ZS4JCisKK0ZyaSBTZXAgMTkgMDk6MzM6MjcgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIGdlbmNvZGUuYzogQWRkIHIzOTAwICh0eDM5KS4KKwkKKworVHVlIFNlcCAxNiAxNTo1MjowNCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogZ2VuY29kZS5jIChidWlsZF9pbnN0cnVjdGlvbik6IERvbid0IG5lZWQgdG8gc3VidHJhY3QgNCBmb3IKKwlKQUxSLCBqdXN0IDIuCisKK1R1ZSBTZXAgMTYgMTE6MzI6MjggMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisKKwkqIGludGVycC5jOiBDb3JyZWN0IHNvbWUgSEFTRlBVIHByb2JsZW1zLgorCitNb24gU2VwIDE1IDE3OjM2OjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitGcmkgU2VwIDEyIDEyOjAxOjM5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKG1pcHNfb3B0aW9ucyk6IEZpeCBzYW1wbGVzIG9wdGlvbiBzaG9ydCBmb3JtLCBzaG91bGQKKyAJYmUgYHgnLgorCitUaHUgU2VwIDExIDA5OjM1OjI5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9pbmZvKTogRW5hYmxlIGluZm8gY29kZS4gIFdhcyBqdXN0IHJldHVybmluZy4KKworVHVlIFNlcCAgOSAxNzozMDo1NyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChkZWNvZGVfY29wcm9jKTogQ2xhcmlmeSB3YXJuaW5nIGFib3V0IHVuc3Vwb3J0ZWQgTVRDMCwKKyAJTUZDMC4KKworVHVlIFNlcCAgOSAxNjoyODoyOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdlbmNvZGUuYyAoYnVpbGRfaW5zdHJ1Y3Rpb24pOiBVc2UgU0lHTkVENjQgZm9yIDY0IGJpdAorIAljb25zdGFudHMuCisJKGJ1aWxkX2luc3RydWN0aW9uKTogRGl0dG8gZm9yIExMLgorCitUaHUgU2VwICA0IDE3OjIxOjIzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgQXVnIDI3IDE4OjEzOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworV2VkIEF1ZyAyNyAxNDoxMjoyNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IEFkZCBjYWxsIHRvIHNpbV9hbmFseXplX3Byb2dyYW0sIHVwZGF0ZQorIAljYWxsIHRvIHNpbV9jb25maWcuCisKK1R1ZSBBdWcgMjYgMTA6NDA6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX2tpbGwpOiBEZWxldGUuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBBZGQgQUJGRCBhcmd1bWVudC4gU2V0IFBDIGZyb20gc2FtZS4KKwkoc2ltX2xvYWQpOiBNb3ZlIGNvZGUgaW5pdGlhbGl6aW5nIHRyYXAgaGFuZGxlcnMgZnJvbSBoZXJlLgorCShzaW1fb3Blbik6IFRvIGhlcmUuCisJKHNpbV9sb2FkKTogRGVsZXRlLCB1c2Ugc2ltLWhsb2FkLmMuCisKKwkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0taGxvYWQubyBtb2R1bGUuCisKK01vbiBBdWcgMjUgMTc6NTA6MjIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitNb24gQXVnIDI1IDE1OjU5OjQ4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogQWRkIEFCRkQgYXJndW1lbnQuCisJKHNpbV9sb2FkKTogTW92ZSBjYWxsIHRvIHNpbV9jb25maWcgZnJvbSBoZXJlLgorCShzaW1fb3Blbik6IFRvIGhlcmUuICBDaGVjayByZXR1cm4gc3RhdHVzLgorCitGcmkgSnVsIDI1IDE1OjAwOjQ1IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgorIAorIAkqIGdlbmNvZGUuYyAoYnVpbGRfaW5zdHJ1Y3Rpb24pOiBUd28gYXJnIE1BREQgc2hvdWxkCisgCW5vdCBhc3NpZ24gcmVzdWx0IHRvICQwLgorIAorVGh1IEp1biAyNiAxMjoxMzoxNyAxOTk3ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKKworCSogc2ltL21pcHMvY29uZmlndXJlOiBDaGFuZ2UgZGVmYXVsdF9zaW1fZW5kaWFuIHRvIDAgKGJpLWVuZGlhbikKKwkqIHNpbS9taXBzL2NvbmZpZ3VyZS5pbjogUmVnZW5lcmF0ZS4KKworV2VkIEp1bCAgOSAxMDoyOToyMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGNyaXR0ZXJzLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChTVUJfUkVHX1VXLCBTVUJfUkVHX1NXLCBTVUJfUkVHXyopOiBVc2UgbW9yZSBleHBsaWNpdAorIAlzaWduZWQ4LCB1bnNpZ25lZDggZXQuYWwuIHR5cGVzLgorCisJKiBpbnRlcnAuYyAoU1VCX1JFR19GRVRDSCk6IEhhbmRsZSBib3RoIGxpdHRsZSBhbmQgYmlnIGVuZGlhbgorIAlob3N0cyB3aGVuIHNlbGVjdGluZyBzdWJyZWcuCisKK1dlZCBKdWwgIDIgMTE6NTQ6MTAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBpbnRlcnAuYyAoc2ltX2VuZ2luZV9ydW4pOiBSZXNldCB0aGUgWkVSTyByZWdpc3RlciB0byB6ZXJvCisJcmVnYXJkbGVzcyBvZiBGRUFUVVJFX1dBUk5fWkVSTy4KKwkqIGdlbmNvZGUuYyAoRkVBVFVSRV9XQVJOSU5HUyk6IFJlbW92ZSBGRUFUVVJFX1dBUk5fWkVSTy4KKworV2VkIEp1biAgNCAxMDo0MzoxNCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChkZWNvZGVfY29wcm9jKTogSW1wbGVtZW50IE1UQzAgTiwgQ0FVU0UuCisJKFNpZ25hbEV4Y2VwdGlvbik6IEZvciBCcmVha1BvaW50cyBpZ25vcmUgYW55IG1vZGUgYml0cyBhbmQganVzdAorIAlzYXZlIHRoZSBQQy4KKwkoU2lnbmFsRXhjZXB0aW9uKTogQWx3YXlzIHNldCB0aGUgQ0FVU0UgcmVnaXN0ZXIuCisKK1R1ZSBKdW4gIDMgMDU6MDA6MzMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoU2lnbmFsRXhjZXB0aW9uKTogQ2xlYXIgdGhlIHNpbURFTEFZU0xPVCBmbGFnIHdoZW4gYW4KKyAJZXhjZXB0aW9uIGhhcyBiZWVuIHRha2VuLgorCisJKiBpbnRlcnAuYzogSW1wbGVtZW50IHRoZSBFUkVUIGFuZCBtdC9mIHNyIGluc3RydWN0aW9ucy4KKworU2F0IE1heSAzMSAwMDo0NDoxNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChTaWduYWxFeGNlcHRpb24pOiBEb24ndCBib3RoZXIgcmVzdGFydGluZyBhbgorIAlpbnRlcnJ1cHQuCisKK0ZyaSBNYXkgMzAgMjM6NDE6NDggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoU2lnbmFsRXhjZXB0aW9uKTogUmVhbGx5IHRha2UgYW4gaW50ZXJydXB0LgorCShpbnRlcnJ1cHRfZXZlbnQpOiBPbmx5IGRlbGl2ZXIgaW50ZXJydXB0cyB3aGVuIGVuYWJsZWQuCisKK1R1ZSBNYXkgMjcgMjA6MDg6MDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX2luZm8pOiBPbmx5IHByaW50IGluZm8gd2hlbiB2ZXJib3NlLgorCShzaW1faW5mbykgVXNlIHNpbV9pb19wcmludGYgZm9yIG91dHB1dC4KKwkKK1R1ZSBNYXkgMjcgMTQ6MjI6MjMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoQ29Qcm9jUHJlc2VudCk6IEFkZCBVTlVTRUQgYXR0cmlidXRlIC0gbm90IHVzZWQgYnkgYWxsCisgCW1pcHMgYXJjaGl0ZWN0dXJlcy4KKworVHVlIE1heSAyNyAxNDoyMjoyMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fZG9fY29tbWFuZCk6IENoZWNrIGZvciBjb21tb24gY29tbWFuZHMgaWYgYQorIAlzaW11bGF0b3Igc3BlY2lmaWMgY29tbWFuZCBmYWlscy4KKworVGh1IE1heSAyMiAwOTozMjowMyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9lbmdpbmVfcnVuKTogaWZkZWYgb3V0IHVzZXMgb2Ygc2ltU1RPUCwgc2ltU1RFUAorCWFuZCBzaW1CRSB3aGVuIERFQlVHIGlzIGRlZmluZWQuCisKK1dlZCBNYXkgMjEgMDk6MDg6MTAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoaW50ZXJydXB0X2V2ZW50KTogTmV3IGZ1bmN0aW9uLiAgUGFzcyBleGNlcHRpb24gZXZlbnQKKyAJb250byBleGNlcHRpb24gaGFuZGxlci4KKworCSogY29uZmlndXJlLmluOiBDaGVjayBmb3Igc3RkbGliLmguCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKwkqIGdlbmNvZGUuYyAoYnVpbGRfaW5zdHJ1Y3Rpb24pOiBBZGQgVU5VU0VEIGF0dHJpYnV0ZSB0byB0ZW1wUworIAl2YXJpYWJsZSBkZWNsYXJhdGlvbi4KKwkoYnVpbGRfaW5zdHJ1Y3Rpb24pOiBJbml0aWFsaXplIG1lbXZhbDEuCisJKGJ1aWxkX2luc3RydWN0aW9uKTogQWRkIFVOVVNFRCBhdHRyaWJ1dGUgdG8gYnl0ZSwgYmlnZW5kLAorIAlyZXZlcnNlLgorCShidWlsZF9vcGVyYW5kcyk6IERpdHRvLgorCisJKiBpbnRlcnAuYzogRml4IEdDQyB3YXJuaW5ncy4KKwkoc2ltX2dldF9xdWl0X2NvZGUpOiBEZWxldGUuCisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIElOTElORSwgRU5ESUFOLCBIT1NURU5ESUFOIGFuZCBXQVJOSU5HUy4KKwkqIE1ha2VmaWxlLmluOiBEaXR0by4KKwkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCisJCisJKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgc2ltLXdhdGNoLm8gbW9kdWxlLgorCitUdWUgTWF5IDIwIDE1OjA4OjU2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKG1pcHNfb3B0aW9uX2hhbmRsZXIpOiBOZXcgZnVuY3Rpb24gcGFyc2UgYXJndW1lcyB1c2luZworIAlzaW0tb3B0aW9ucy4KKwkobXluYW1lKTogUmVwbGFjZSB3aXRoIFNUQVRFX01ZX05BTUUuCisJKHNpbV9vcGVuKTogRGVsZXRlIGNoZWNrIGZvciBob3N0IGVuZGlhbm5lc3MgLSBwZXJmb3JtZWQgYnkKKyAJc2ltX2NvbmZpZy4KKwkoc2ltSE9TVEJFLCBzaW1CRSk6IERlbGV0ZSwgcmVwbGFjZWQgYnkgc2ltLWVuZGlhbiBmbGFncy4KKwkoc2ltX29wZW4pOiBNb3ZlIG11Y2ggb2YgdGhlIGluaXRpYWxpemF0aW9uIGZyb20gaGVyZS4KKwkoc2ltX2xvYWQpOiBUbyBoZXJlLiAgQWZ0ZXIgdGhlIGltYWdlIGhhcyBiZWVuIGxvYWRlZCBhbmQKKyAJZW5kaWFubmVzcyBzZXQuCisJKHNpbV9vcGVuKTogTW92ZSBDb2xkUmVzZXQgZnJvbSBoZXJlLgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogVG8gaGVyZS4KKwkoc2ltX29wZW4pOiBNYWtlIEZQIGNoZWNrIGxlc3MgZGVwZW5kYW50IG9uIGhvc3QgZW5kaWFubmVzcy4KKworCSogTWFrZWZpbGUuaW4gKFNJTV9SVU5fT0JKUyk6IFNldCB0byBucnVuLm8gLSB1c2UgbmV3IHZlcnNpb24gb3IKKyAJcnVuLgorCSogaW50ZXJwLmMgKHNpbV9zZXRfY2FsbGJhY2tzKTogRGVsZXRlLgorCisJKiBpbnRlcnAuYyAobWVtYmFuaywgbWVtYmFua19iYXNlLCBtZW1iYW5rX3NpemUpOiBSZXBsYWNlIHdpdGgKKyAJU1RBVEVfTUVNT1JZLCBTVEFURV9NRU1fU0laRSwgU1RBVEVfTUVNX0JBU0UuCisJKHNpbV9vcGVuKTogUmVtb3ZlIGNhbGwgdG8gY2FsbGJhY2stPmluaXQuIGdkYi9ydW4gZG8gdGhpcy4KKworCSogaW50ZXJwLmM6IFVwZGF0ZQorCisJKiBzaW0tbWFpbi5oIChTSU1fSEFWRV9GTEFUTUVNKTogRGVmaW5lLgorCisJKiBpbnRlcnAuYyAoYmlnX2VuZGlhbl9wKTogRGVsZXRlLCByZXBsYWNlZCBieQorIAljdXJyZW50X3RhcmdldF9ieXRlX29yZGVyLgorCitUdWUgTWF5IDIwIDEzOjU1OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKGhvc3RfcmVhZF9sb25nLCBob3N0X3JlYWRfd29yZCwgaG9zdF9zd2FwX3dvcmQsCisgCWhvc3Rfc3dhcF9sb25nKTogRGVsZXRlLiBVc2luZyBjb21tb24gc2ltLWVuZGlhbi4KKwkoc2ltX2ZldGNoX3JlZ2lzdGVyLCBzaW1fc3RvcmVfcmVnaXN0ZXIpOiBVc2UgSDJULgorCShwaXBlbGluZV90aWNrcyk6IERlbGV0ZS4gIEhhbmRsZWQgYnkgc2ltLWV2ZW50cy4KKwkoc2ltX2luZm8pOiBVcGRhdGUuCisJKHNpbV9lbmdpbmVfcnVuKTogVXBkYXRlLgorCitUdWUgTWF5IDIwIDEzOjQyOjAzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9zdG9wX3JlYXNvbik6IE1vdmUgY29kZSBkZXRlcm1pbmluZyBzaW1FWENFUFRJT04KKyAJcmVhc29uIGZyb20gaGVyZS4KKwkoU2lnbmFsRXhjZXB0aW9uKTogVG8gaGVyZS4gU2lnbmFsIHVzaW5nIHNpbV9lbmdpbmVfaGFsdC4KKwkoc2ltX3N0b3BfcmVhc29uKTogRGVsZXRlLCBtb3ZlZCB0byBjb21tb24uCisJCitUdWUgTWF5IDIwIDEwOjE5OjQ4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjIuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogQWRkIGNhbGxiYWNrIGFyZ3VtZW50LgorCShzaW1fc2V0X2NhbGxiYWNrcyk6IERlbGV0ZSBTSU1fREVTQyBhcmd1bWVudC4KKwkoc2ltX3NpemUpOiBEaXR0by4KKworTW9uIE1heSAxOSAxODoyMDozOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBjb21tb24gbW9kdWxlcy4KKworCSogaW50ZXJwLmMgKHNpbV9zZXRfY2FsbGJhY2tzKTogQWxzbyBzZXQgU0QgY2FsbGJhY2suCisJKHNldF9lbmRpYW5uZXNzLCB4ZmVyXyosIHN3YXBfKik6IERlbGV0ZS4KKwkoaG9zdF9yZWFkX3dvcmQsIGhvc3RfcmVhZF9sb25nLCBob3N0X3N3YXBfd29yZCwgaG9zdF9zd2FwX2xvbmcpOgorIAlDaGFuZ2UgdG8gZnVuY3Rpb25zIHVzaW5nIHNpbS1lbmRpYW4gbWFjcm9zLgorCShjb250cm9sX2MsIHNpbV9zdG9wKTogRGVsZXRlLCB1c2UgY29tbW9uIHZlcnNpb24uCisJKHNpbXVsYXRlKTogQ29udmVydCBpbnRvLgorCShzaW1fZW5naW5lX3J1bik6IFRoaXMgZnVuY3Rpb24uCisJKHNpbV9yZXN1bWUpOiBEZWxldGUuCisJCisJKiBpbnRlcnAuYyAoc2ltdWxhdGlvbik6IE5ldyB2YXJpYWJsZSAtIHRoZSBzaW11bGF0b3Igb2JqZWN0LgorCShzaW1fa2luZCk6IERlbGV0ZSBnbG9iYWwgLSBtZXJnZWQgaW50byBzaW11bGF0aW9uLgorCShzaW1fbG9hZCk6IENsZWFudXAuICBNb3ZlIFBDIGFzc2lnbm1lbnQgZnJvbSBoZXJlLgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogVG8gaGVyZS4KKworCSogc2ltLW1haW4uaDogTmV3IGZpbGUuCisJKiBpbnRlcnAuYyAoc2ltLW1haW4uaCk6IEluY2x1ZGUuCisJCitUaHUgQXByIDI0IDAwOjM5OjUxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIEFwciAyMyAxNzozMjoxOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiB0Y29uZmlnLmluIChTSU1fSEFWRV9CSUVORElBTik6IERlZmluZS4KKworTW9uIEFwciAyMSAxNzoxNjoxMyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KKworCSogZ2VuY29kZS5jIChidWlsZF9pbnN0cnVjdGlvbik6IERJViBpbnN0cnVjdGlvbnM6IGNoZWNrIAorCWZvciBkaXZpc2lvbiBieSB6ZXJvIGFuZCBpbnRlZ2VyIG92ZXJmbG93IGJlZm9yZSB1c2luZyAKKwlob3N0J3MgZGl2aXNpb24gb3BlcmF0aW9uLgorCitUaHUgQXByIDE3IDAzOjE4OjE0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbG9hZC5vLgorCSogaW50ZXJwLmM6ICNpbmNsdWRlIGJmZC5oLgorCSh0YXJnZXRfYnl0ZV9vcmRlcik6IERlbGV0ZS4KKwkoc2ltX2tpbmQsIG15bmFtZSwgYmlnX2VuZGlhbl9wKTogTmV3IHN0YXRpYyBsb2NhbHMuCisJKHNpbV9vcGVuKTogU2V0IHNpbV9raW5kLCBteW5hbWUuICBNb3ZlIGNhbGwgdG8gc2V0X2VuZGlhbm5lc3MgdG8KKwlhZnRlciBhcmd1bWVudCBwYXJzaW5nLiAgUmVjb2duaXplIC1FIGFyZywgc2V0IGVuZGlhbm5lc3MgYWNjb3JkaW5nbHkuCisJKHNpbV9sb2FkKTogUmV0dXJuIFNJTV9SQy4gIE5ldyBhcmcgYWJmZC4gIENhbGwgc2ltX2xvYWRfZmlsZSB0bworCWxvYWQgZmlsZSBpbnRvIHNpbXVsYXRvci4gIFNldCBQQyBmcm9tIGJmZC4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFJldHVybiBTSU1fUkMuICBEZWxldGUgYXJnIHN0YXJ0X2FkZHJlc3MuCisJKHNldF9lbmRpYW5uZXNzKTogVXNlIGJpZ19lbmRpYW5fcCBpbnN0ZWFkIG9mIHRhcmdldF9ieXRlX29yZGVyLgorCitXZWQgQXByIDE2IDE3OjU1OjM3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9zaXplKTogRGVsZXRlIHByb3RvdHlwZSAtIGNvbmZsaWN0cyB3aXRoCisgCWRlZmluaXRpb24gaW4gcmVtb3RlLXNpbS5oLiAgQ29ycmVjdCBkZWZpbml0aW9uLgorCitNb24gQXByICA3IDE1OjQ1OjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitXZWQgQXByICAyIDE1OjA2OjI4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IE5ldyBhcmcgYGtpbmQnLgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBBcHIgIDIgMTQ6MzQ6MTkgMTk5NyBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1R1ZSBNYXIgMjUgMTE6Mzg6MjIgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogU2V0IG9wdGluZCB0byAwIGJlZm9yZSBjYWxsaW5nIGdldG9wdC4KKworV2VkIE1hciAxOSAwMToxNDowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gTWFyIDE3IDEwOjUyOjU5IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjZXR1cy5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyA6IFJlcGxhY2UgdXNlcyBvZiBwcl9hZGRyIHdpdGggcHJfdXdvcmQ2NAorCXdoZXJlIHRoZSBiaXQgbGVuZ3RoIGlzIGFsd2F5cyA2NCBpbmRlcGVuZGVudCBvZiBTSU1fQUREUi4KKwkocHJfdXdvcmQ2NCkgOiBhZGRlZC4KKworTW9uIE1hciAxNyAxNToxMDowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKworRnJpIE1hciAxNCAxMDozNDoxMSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1RodSBNYXIgMTMgMTI6NTE6MzYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogTmV3IFNJTV9ERVNDIHJlc3VsdC4gIEFyZ3VtZW50IGlzIG5vdworCWluIGFyZ3YgZm9ybS4KKwkob3RoZXIgc2ltXyopOiBOZXcgU0lNX0RFU0MgYXJndW1lbnQuCisKK01vbiBGZWIgMjQgMjI6NDc6MTQgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBpbnRlcnAuYzogRml4IHByaW50aW5nIG9mIGFkZHJlc3NlcyBmb3Igbm9uLTY0LWJpdCB0YXJnZXRzLgorCShwcl9hZGRyKTogQWRkIGZ1bmN0aW9uIHRvIHByaW50IGFkZHJlc3MgYmFzZWQgb24gc2l6ZS4KKworV2VkIEZlYiAxOSAxNDo0MjowOSAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1vcGVuKTogQWRkIHN1cHBvcnQgZm9yIExTSSBNaW5pUklTQyBQTU9OIHZlY3RvcnMuCisKK1RodSBGZWIgMTMgMTQ6MDg6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnZW5jb2RlLmMgKGJ1aWxkX21pcHMxNl9vcGVyYW5kcyk6IENvcnJlY3QgY29tcHV0YXRpb24gb2YgYmFzZQorCWFkZHJlc3MgZm9yIGV4dGVuZGVkIFBDIHJlbGF0aXZlIGluc3RydWN0aW9uLgorCitUaHUgRmViICA2IDE3OjE2OjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKG1pcHMxNl9lbnRyeSk6IEFkZCBzdXBwb3J0IGZvciBmbG9hdGluZyBwb2ludCBjYXNlcy4KKwkoU2lnbmFsRXhjZXB0aW9uKTogUGFzcyBmbG9hdGluZyBwb2ludCBjYXNlcyB0byBtaXBzMTZfZW50cnkuCisJKFZhbHVlRlBSKTogRG9uJ3QgcmVzdHJpY3QgZm10X3NpbmdsZSBhbmQgZm10X3dvcmQgdG8gZXZlbgorCXJlZ2lzdGVycy4KKwkoU3RvcmVGUFIpOiBMaWtld2lzZS4gIEFsc28sIGRvbid0IGNsb2JiZXIgZnByICsgMSBmb3IgZm10X3NpbmdsZQorCW9yIGZtdF93b3JkLgorCShDT1BfTFcpOiBQYXNzIGZtdF93b3JkIHJhdGhlciB0aGFuIGZtdF91bmludGVycHJldGVkIHRvIFN0b3JlRlBSLAorCWFuZCB0aGVuIHNldCB0aGUgc3RhdGUgdG8gZm10X3VuaW50ZXJwcmV0ZWQuCisJKENPUF9TVyk6IFRlbXBvcmFyaWx5IHNldCB0aGUgc3RhdGUgdG8gZm10X3dvcmQgd2hpbGUgY2FsbGluZworCVZhbHVlRlBSLgorCitUdWUgRmViICA0IDE2OjQ4OjI1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2VuY29kZS5jIChidWlsZF9pbnN0cnVjdGlvbik6IFRoZSBoaWdoIG9yZGVyIG1heSBiZSBzZXQgaW4gdGhlCisJY29tcGFyaXNvbiBmbGFncyBhdCBhbnkgSVNBIGxldmVsLCBub3QganVzdCBJU0EgNC4KKworVHVlIEZlYiAgNCAxMzozMzozMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQENPTU1PTl9NQUtFRklMRV9GUkFHKTogVXNlCisJQ09NTU9OX3tQUkUsUE9TVH1fQ09ORklHX0ZSQUcgaW5zdGVhZC4KKwkqIGNvbmZpZ3VyZS5pbjogc2luY2x1ZGUgLi4vY29tbW9uL2FjbG9jYWwubTQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitGcmkgSmFuIDMxIDExOjExOjQ1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWJ1aWxkIGFmdGVyIGNoYW5nZSB0byBhY2xvY2FsLm00LgorCitUaHUgSmFuIDIzIDExOjQ2OjIzIDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4gTWFrZWZpbGUuaW46ICBVcGRhdGUgdG8gbmV3IGNvbmZpZ3VyZQorCXNjaGVtZSB3aGljaCBpcyBtb3JlIGNvbXBhdGlibGUgd2l0aCBXaW5HREIgYnVpbGRzLgorCSogY29uZmlndXJlLmluOiAgSW1wcm92ZSBjb21tZW50IG9uIGhvdyB0byBydW4gYXV0b2NvbmYuCisJKiBjb25maWd1cmU6ICBSZS1ydW4gYXV0b2NvbmYgdG8gZ2V0IG5ldyAuLi9jb21tb24vYWNsb2NhbC5tNC4KKwkqIE1ha2VmaWxlLmluOiAgVXNlIGF1dG9jb25mIHN1YnN0aXR1dGlvbiB0byBpbnN0YWxsIGNvbW1vbgorCW1ha2VmaWxlIGZyYWdtZW50LgorCitXZWQgSmFuICA4IDEyOjM5OjAzIDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KKworCSogZ2VuY29kZS5jIChidWlsZF9pbnN0cnVjdGlvbik6IFVzZSBCaWdFbmRpYW5DUFUgaW5zdGVhZCBvZgorCUJ5dGVTd2FwTWVtLgorCitUaHUgSmFuIDAyIDIyOjIzOjA0IDE5OTcgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9tb25pdG9yKTogTWFrZSBvdXRwdXQgdG8gc3Rkb3V0IHZpc2libGUgaW4KKwl3aW5nZGIncyBJL08gbG9nIHdpbmRvdy4KKworVHVlIERlYyAzMSAwNzowNDowMCAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIHN1cHBvcnQuaDogVW5kbyBwcmV2aW91cyBjaGFuZ2UgdG8gU0lHVFJBUAorCWFuZCBTSUdRVUlUIHZhbHVlcy4KKworTW9uIERlYyAzMCAxNzozNjowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzdG9yZV93b3JkLCBsb2FkX3dvcmQpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KKwkobWlwczE2X2VudHJ5KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkoU2lnbmFsRXhjZXB0aW9uKTogTG9vayBmb3IgbWlwczE2IGVudHJ5IGFuZCBleGl0IGluc3RydWN0aW9ucy4KKwkoc2ltdWxhdGUpOiBVc2UgdGhlIGNvcnJlY3QgaW5kZXggd2hlbiBzZXR0aW5nIGZwcl9zdGF0ZSBhZnRlcgorCWRvaW5nIGEgcGVuZGluZyBtb3ZlLgorCitTdW4gRGVjIDI5IDA5OjM3OjE4IDE5OTYgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmM6IEZpeCBieXRlLXN3YXBwaW5nIGNvZGUgdGhyb3VnaG91dCB0byB3b3JrIG9uCisJYm90aCBsaXR0bGUtIGFuZCBiaWctZW5kaWFuIGhvc3RzLgorCitTdW4gRGVjIDI5IDA5OjE4OjMyIDE5OTYgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogc3VwcG9ydC5oOiBNYWtlIGRlZmluaXRpb25zIG9mIFNJR1RSQVAgYW5kIFNJR1FVSVQgY29uc2lzdGVudAorCXdpdGggZ2RiL2NvbmZpZy9pMzg2L3htLXdpbmRvd3MuaC4KKworRnJpIERlYyAyNyAyMjo0ODo1MSAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGdlbmNvZGUuYyAoYnVpbGRfaW5zdHJ1Y3Rpb24pOiBXb3JrIGFyb3VuZCBNU1ZDKysgY29kZSBnZW4gYnVnCisJdGhhdCBtZXNzZXMgdXAgYXJpdGhtZXRpYyBzaGlmdHMuCisKK0ZyaSBEZWMgMjAgMTE6MDQ6MDUgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogc3VwcG9ydC5oOiAgVXNlIF9XSU4zMiBpbnN0ZWFkIG9mIF9fV0lOMzJfXy4gIEFsc28gYWRkIGRlZnMgZm9yCisJU0lHVFJBUCBhbmQgU0lHUVVJVCBmb3IgX1dJTjMyLgorCitUaHUgRGVjIDE5IDE0OjA3OjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2VuY29kZS5jIChidWlsZF9pbnN0cnVjdGlvbikgW01VTF06IENhc3Qgb3BlcmFuZHMgdG8gd29yZDY0LCB0bworCWZvcmNlIGEgNjQgYml0IG11bHRpcGxpY2F0aW9uLgorCShidWlsZF9pbnN0cnVjdGlvbikgW09SXTogSW4gbWlwczE2IG1vZGUsIGRvbid0IGRvIGFueXRoaW5nIGlmIHRoZQorCWRlc3RpbmF0aW9uIHJlZ2lzdGVyIGlzIDAsIHNpbmNlIHRoYXQgaXMgdGhlIGRlZmF1bHQgbWlwczE2IG5vcAorCWluc3RydWN0aW9uLgorCitNb24gRGVjIDE2IDE0OjU5OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogZ2VuY29kZS5jIChNSVBTMTZfREVDT0RFKTogU1dSQVNQIGlzIEk4LCBub3QgUkkuCisJKGJ1aWxkX2VuZGlhbl9zaGlmdCk6IERvbid0IGNoZWNrIHByb2M2NC4KKwkoYnVpbGRfaW5zdHJ1Y3Rpb24pOiBBbHdheXMgc2V0IG1lbXZhbCB0byB1d29yZDY0LiAgQ2FzdCBvcDIgdG8KKwl1d29yZDY0IHdoZW4gc2hpZnRpbmcgaXQgbGVmdCBpbiBtZW1vcnkgaW5zdHJ1Y3Rpb25zLiAgQWx3YXlzIHVzZQorCXRoZSBzYW1lIGNvZGUgZm9yIHN0b3Jlcy0tZG9uJ3Qgc3BlY2lhbCBjYXNlIHByb2M2NC4KKworCSogZ2VuY29kZS5jIChidWlsZF9taXBzMTZfb3BlcmFuZHMpOiBGaXggYmFzZSBQQyB2YWx1ZSBmb3IgUEMKKwlyZWxhdGl2ZSBvcGVyYW5kcy4KKwkoYnVpbGRfaW5zdHJ1Y3Rpb24pOiBDYWxsIEpBTERFTEFZU0xPVCByYXRoZXIgdGhhbiBERUxBWVNMT1QgZm9yIGEKKwlqYWwgaW5zdHJ1Y3Rpb24uCisJKiBpbnRlcnAuYyAoc2ltSkFMREVMQVlTTE9UKTogRGVmaW5lLgorIAkoSkFMREVMQVlTTE9UKTogRGVmaW5lLgorCShJTkRFTEFZU0xPVCwgSU5KQUxERUxBWVNMT1QpOiBEZWZpbmUuCisJKHNpbXVsYXRlKTogQ2xlYXIgc2ltSkFMREVMQVlTTE9UIHdoZW4gc2ltREVMQVlTTE9UIGlzIGNsZWFyZWQuCisKK1R1ZSBEZWMgMjQgMjI6MTE6MjAgMTk5NiAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IGFkZCBmbHVzaF9jYWNoZSBhcyBhIFBNT04gcm91dGluZQorCShzaW1fbW9uaXRvcik6IGhhbmRsZSBmbHVzaF9jYWNoZSBieSBpZ25vcmluZyBpdAorCitXZWQgRGVjIDExIDEzOjUzOjUxIDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KKworCSogZ2VuY29kZS5jIChidWlsZF9pbnN0cnVjdGlvbik6IFVzZSAhQnl0ZVN3YXBNZW0gaW5zdGVhZCBvZgorCUJpZ0VuZGlhbk1lbS4KKwkqIGludGVycC5jIChDT05GSUcsIGNvbmZpZ19FUF97bWFzayxzaGlmdCxELER4eER4eCwgY29uZmlnX0JFKTogRGVsZXRlLgorCShCaWdFbmRpYW5NZW0pOiBSZW5hbWUgdG8gQnl0ZVN3YXBNZW0gYW5kIGNoYW5nZSBzZW5zZS4KKwkoQmlnRW5kaWFuQ1BVLCBzaW1fd3JpdGUsIExvYWRNZW1vcnksIFN0b3JlTWVtb3J5KTogQ2hhbmdlCisJQmlnRW5kaWFuTWVtIHJlZmVyZW5jZXMgdG8gIUJ5dGVTd2FwTWVtLgorCShzZXRfZW5kaWFubmVzcyk6IE5ldyBmdW5jdGlvbiwgd2l0aCBwcm90b3R5cGUuCisJKHNpbV9vcGVuKTogQ2FsbCBzZXRfZW5kaWFubmVzcy4KKwkoc2ltX2luZm8pOiBVc2Ugc2ltQkUgaW5zdGVhZCBvZiBCaWdFbmRpYW5NZW0uCisJKHhmZXJfZGlyZWN0X3dvcmQsIHhmZXJfZGlyZWN0X2xvbmcsIHN3YXBfZGlyZWN0X3dvcmQsCisJc3dhcF9kaXJlY3RfbG9uZywgeGZlcl9iaWdfd29yZCwgeGZlcl9iaWdfbG9uZywgeGZlcl9saXR0bGVfd29yZCwKKwl4ZmVyX2xpdHRsZV9sb25nLCBzd2FwX3dvcmQsIHN3YXBfbG9uZyk6IERlbGV0ZSB1bm5lY2Vzc2FyeSBNU0NfVkVSCisJaWZkZWZzLCBrZWVwaW5nIHRoZSBwcm90b3R5cGUgZGVjbGFyYXRpb24uCisJKHN3YXBfd29yZCk6IFJld3JpdGUgY29ycmVjdGx5LgorCShDb2xkUmVzZXQpOiBEZWxldGUgcmVmZXJlbmNlcyB0byBDT05GSUcuICBEZWxldGUgZW5kaWFubmVzcyByZWxhdGVkCisJY29kZTsgbW92ZWQgdG8gc2V0X2VuZGlhbm5lc3MuCisJCitUdWUgRGVjIDEwIDExOjMyOjA0IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KKworCSogZ2VuY29kZS5jIChidWlsZF9pbnN0cnVjdGlvbiwgY2FzZSBKVU1QKTogVHJ1bmNhdGUgUEMgdG8gMzIgYml0cy4KKwkqIGludGVycC5jIChDSEVDS0hJTE8pOiBEZWZpbmUgYXdheS4KKwkoc2ltU0lHSU5UKTogTmV3IG1hY3JvLgorCShtZW1iYW5rX3NpemUpOiBJbmNyZWFzZSBmcm9tIDFNQiB0byAyTUIuCisJKGNvbnRyb2xfYyk6IE5ldyBmdW5jdGlvbi4KKwkoc2ltX3Jlc3VtZSk6IFJlbmFtZSBwYXJhbWV0ZXIgc2lnbmFsIHRvIHNpZ25hbF9udW1iZXIuICBBZGQgbG9jYWwKKwl2YXJpYWJsZSBwcmV2LiAgQ2FsbCBzaWduYWwgYmVmb3JlIGFuZCBhZnRlciBzaW11bGF0ZS4KKwkoc2ltX3N0b3BfcmVhc29uKTogQWRkIHNpbVNJR0lOVCBzdXBwb3J0LgorCShzaW1fd2FybmluZywgc2ltX2Vycm9yLCBkb3RyYWNlLCBTaWduYWxFeGNlcHRpb24pOiBEZWZpbmUgYXMgc3RkYXJnCisJZnVuY3Rpb25zIGFsd2F5cy4KKwkoc2ltX3dhcm5pbmcpOiBEZWxldGUgY2FsbCB0byBTaWduYWxFeGNlcHRpb24uICBEbyBjYWxsIHByaW50Zl9maWx0ZXJlZAorCWlmIGxvZ2ZoIGlzIE5VTEwuCisJKEFkZHJlc3NUcmFuc2xhdGlvbik6IEFkZCAjaWZkZWYgREVCVUcgYXJvdW5kIGRlYnVnZ2luZyBtZXNzYWdlIGFuZAorCWEgY2FsbCB0byBzaW1fd2FybmluZy4KKworV2VkIE5vdiAyNyAxMTo1Mzo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdlbmNvZGUuYyAocHJvY2Vzc19pbnN0cnVjdGlvbnMpOiBJZiAhIHByb2M2NCwgc2tpcCBET1VCTEVXT1JECisJMTYgYml0IGluc3RydWN0aW9ucy4KKworVHVlIE5vdiAyNiAxMTo1MzoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwlBZGQgc3VwcG9ydCBmb3IgbWlwczE2ICgxNiBiaXQgTUlQUyBpbXBsZW1lbnRhdGlvbik6CisJKiBnZW5jb2RlLmMgKGluc3RfdHlwZSk6IEFkZCBtaXBzMTYgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcgdHlwZXMuCisJKEdFVERBVEFTSVpFSU5TTik6IERlZmluZS4KKwkoTUlQU19ERUNPREUpOiBBZGQgUkVHIGZsYWcgdG8gZHNsbHYsIGRzcmF2LCBhbmQgZHNybHYuICBBZGQKKwlqYWx4LiAgQWRkIExFRlQgZmxhZyB0byBtZmhpIGFuZCBtZmxvLiAgQWRkIFJJR0hUIGZsYWcgdG8gbXRoaSBhbmQKKwltdGxvLgorCShNSVBTMTZfREVDT0RFKTogTmV3IHRhYmxlLCBmb3IgbWlwczE2IGluc3RydWN0aW9ucy4KKwkoYml0bWFwX3ZhbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCisJKHN0cnVjdCBtaXBzMTZfb3ApOiBEZWZpbmUuCisJKG1pcHMxNl9vcF90YWJsZSk6IE5ldyB0YWJsZSwgZm9yIG1pcHMxNiBvcGVyYW5kcy4KKwkoYnVpbGRfbWlwczE2X29wZXJhbmRzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KKwkocHJvY2Vzc19pbnN0cnVjdGlvbnMpOiBJZiBQQyBpcyBvZGQsIGRlY29kZSBhIG1pcHMxNgorCWluc3RydWN0aW9uLiAgQnJlYWsgb3V0IGluc3RydWN0aW9uIGhhbmRsaW5nIGludG8gbmV3CisJYnVpbGRfaW5zdHJ1Y3Rpb24gZnVuY3Rpb24uCisJKGJ1aWxkX2luc3RydWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgorCXByb2Nlc3NfaW5zdHJ1Y3Rpb25zLiAgQ2hlY2sgbW9kaWZpZXJzIHJhdGhlciB0aGFuIGZsYWdzIGZvciBTSElGVAorCWJpdCBjb3VudCBhbmQgbVtmdF17aGksbG99IGRpcmVjdGlvbi4KKwkodXNhZ2UpOiBQYXNzIHByb2dyYW0gbmFtZSB0byBmcHJpbnRmLgorCShtYWluKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSB0aGlzX29wdGlvbl9vcHRpbmQuICBDaGFuZ2UKKwlgYCpsb3B0YXJnKysnJyB0byBgYGxvcHRhcmcrKycnLgorCShteV9zdHJ0b3VsKTogUGFyZW50aGVzaXplICYmIHdpdGhpbiB8fC4KKwkqIGludGVycC5jIChMb2FkTWVtb3J5KTogQWNjZXB0IGEgaGFsZndvcmQgcEFkZHIgaWYgdkFkZHIgaXMgb2RkLgorCShzaW11bGF0ZSk6IElmIFBDIGlzIG9kZCwgZmV0Y2ggYSAxNiBiaXQgaW5zdHJ1Y3Rpb24sIGFuZAorCWluY3JlbWVudCBQQyBieSAyIHJhdGhlciB0aGFuIDQuCisJKiBjb25maWd1cmUuaW46IEFkZCBjYXNlIGZvciBtaXBzMTYqLSotKi4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKworRnJpIE5vdiAyMiAwODo0OTozNiAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIGludGVycC5jOiBBbGxvdyAtdCB0byBlbmFibGUgdHJhY2luZyBpbiBzdGFuZGFsb25lIHNpbXVsYXRvci4KKwlGaXggZ2FyYmFnZSBvdXRwdXQgaW4gdHJhY2UgZmlsZSBhbmQgZXJyb3IgbWVzc2FnZXMuCisKK1dlZCBOb3YgMjAgMDE6NTQ6MzcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IERlbGV0ZSBzdHVmZiBtb3ZlZCB0byAuLi9jb21tb24vTWFrZS1jb21tb24uaW4uCisJKFNJTV97T0JKUyxFWFRSQV9DRkxBR1MsRVhUUkFfQ0xFQU59KTogRGVmaW5lLgorCSogY29uZmlndXJlLmluOiBTaW1wbGlmeSB1c2luZyBtYWNyb3MgaW4gLi4vY29tbW9uL2FjbG9jYWwubTQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogdGNvbmZpZy5pbjogTmV3IGZpbGUuCisKK1R1ZSBOb3YgMTIgMTM6MzQ6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgorCisJKiBpbnRlcnAuYzogRml4IGJ1Z3MgaW4gNjQtYml0IHBvcnQuCisJVXNlIGFuc2kgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGZvciBtc3ZjIGNvbXBpbGVyLgorCUluaXRpYWxpemUgYW5kIHRlc3QgZmlsZSBwb2ludGVyIGluIHRyYWNlIGNvZGUuCisJUHJldmVudCBkdXBsaWNhdGUgZGVmaW5pdGlvbiBvZiBMQVNUX0VNRURfUkVHTlVNLgorCitUdWUgT2N0IDE1IDExOjA3OjA2IDE5OTYgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHhmZXJfYmlnX2xvbmcpOiBQcmV2ZW50IHVud2FudGVkIHNpZ24gZXh0ZW5zaW9uLgorCitUaHUgU2VwIDI2IDE3OjM1OjAwIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KKworCSogaW50ZXJwLmMgKFNpZ25hbEV4Y2VwdGlvbik6IENoZWNrIGZvciBleHBsaWNpdCB0ZXJtaW5hdGluZworIAlicmVha3BvaW50IHZhbHVlLgorCSogZ2VuY29kZS5jOiBQYXNzIGluc3RydWN0aW9uIHZhbHVlIHRocm91Z2ggU2lnbmFsRXhjZXB0aW9uKCkKKyAJY2FsbHMgZm9yIFRyYXAsIEJyZWFrcG9pbnQgYW5kIFN5c2NhbGwuCisKK1RodSBTZXAgMjYgMTE6MzU6MTcgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgorCisJKiBpbnRlcnAuYyAoU3F1YXJlUm9vdCk6IEFkZCBIQVZFX1NRUlQgY2hlY2sgdG8gZW5zdXJlIHNxcnQoKSBpcworIAlvbmx5IHVzZWQgb24gdGhvc2UgaG9zdHMgdGhhdCBwcm92aWRlIGl0LgorCSogY29uZmlndXJlLmluOiBBZGQgc3FydCgpIHRvIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIGJlIGNoZWNrZWQgZm9yLgorCSogY29uZmlnLmluOiBSZS1nZW5lcmF0ZWQuCisJKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlZC4KKworRnJpIFNlcCAyMCAxNTo0NzoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGdlbmNvZGUuYyAocHJvY2Vzc19pbnN0cnVjdGlvbnMpOiBDYWxsIGJ1aWxkX2VuZGlhbl9zaGlmdCB3aGVuCisJZXhwYW5kaW5nIFNUT1JFIFJJR0hULCB0byBmaXggc3dyLgorCSogc3VwcG9ydC5oIChTSUdORVhURU5EKTogSWYgdGhlIHNpZ24gYml0IGlzIG5vdCBzZXQsIGV4cGxpY2l0bHkKKwljbGVhciB0aGUgaGlnaCBiaXRzLgorCSogaW50ZXJwLmMgKENvbnZlcnQpOiBGaXggZm10X3NpbmdsZSB0byBmbXRfbG9uZyB0byBub3QgdHJ1bmNhdGUuCisJRml4IGZsb2F0IHRvIGludCBjb252ZXJzaW9ucyB0byBwcm9kdWNlIHNpZ25lZCB2YWx1ZXMuCisKK1RodSBTZXAgMTkgMTU6MzQ6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBnZW5jb2RlLmMgKE1JUFNfREVDT0RFKTogU2V0IFVOU0lHTkVEIGZvciBtdWx0dSBpbnN0cnVjdGlvbi4KKwkocHJvY2Vzc19pbnN0cnVjdGlvbnMpOiBDb3JyZWN0IGhhbmRsaW5nIG9mIG5vciBpbnN0cnVjdGlvbi4KKwlDb3JyZWN0IHNoaWZ0IGNvdW50IGZvciAzMiBiaXQgc2hpZnQgaW5zdHJ1Y3Rpb25zLiBDb3JyZWN0IHNpZ24KKwlleHRlbnNpb24gZm9yIGFyaXRobWV0aWMgc2hpZnRzIHRvIG5vdCBzaGlmdCB0aGUgbnVtYmVyIG9mIGJpdHMgaW4KKwl0aGUgdHlwZS4gIEZpeCA2NCBiaXQgbXVsdGlwbHkgaGlnaCB3b3JkIGNhbGN1bGF0aW9uLiAgRml4IDMyIGJpdAorCXVuc2lnbmVkIG11bHRpcGx5LiAgRml4IGxkeGMxIGFuZCBmcmllbmRzIHRvIHVzZSBjb3Byb2Nlc3NvciAxLgorCUZpeCBtYWRkLgorCSogaW50ZXJwLmMgKENIRUNLSElMTyk6IERvbid0IHNldCBISUFDQ0VTUywgTE9BQ0NFU1MsIG9yIEhMUEMuCisJSXQncyBPSyB0byBoYXZlIGEgbXVsdCBmb2xsb3cgYSBtdWx0LiAgV2hhdCdzIG5vdCBPSyBpcyB0byBoYXZlIGEKKwltdWx0IGZvbGxvdyBhbiBtZmhpLgorCShDb252ZXJ0KTogQ29tbWVudCBvdXQgaW5jb3JyZWN0IHJvdW5kaW5nIGNvZGUuCisKK01vbiBTZXAgMTYgMTE6Mzg6MTYgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgorCisJKiBpbnRlcnAuYyAoc2ltX21vbml0b3IpOiBJbXByb3ZlZCBtb25pdG9yIHByaW50ZgorIAlzaW11bGF0aW9uLiBUaWRpZWQgdXAgc2ltdWxhdG9yIHdhcm5pbmdzLCBhbmQgYWRkZWQgIi0tbG9nIiBvcHRpb24KKyAJZm9yIGRpcmVjdGluZyB3YXJuaW5nIG1lc3NhZ2Ugb3V0cHV0LgorCSogZ2VuY29kZS5jOiBVc2Ugc2ltX3dhcm5pbmcoKSByYXRoZXIgdGhhbiBXQVJOSU5HIG1hY3JvLgorCitUaHUgQXVnIDIyIDE1OjAzOjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGdlbmNvZGUpOiBEZXBlbmQgdXBvbiBnZW5jb2RlLm8sIGdldG9wdC5vLCBhbmQKKwlnZXRvcHQxLm8sIHJhdGhlciB0aGFuIG9uIGdlbmNvZGUuYy4gIExpbmsgb2JqZWN0cyB0b2dldGhlci4KKwlEb24ndCBsaW5rIGFnYWluc3QgLWxpYmVydHkuCisJKGdlbmNvZGUubywgZ2V0b3B0Lm8sIGdldG9wdDEubyk6IE5ldyB0YXJnZXRzLgorCSogZ2VuY29kZS5jOiBJbmNsdWRlIDxjdHlwZS5oPiBhbmQgImFuc2lkZWNsLmgiLgorCShBTkQpOiBVbmRlZmluZSBhZnRlciBpbmNsdWRpbmcgImFuc2lkZWNsLmgiLgorCShVTE9OR19NQVgpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCisJKE9QXyopOiBEb24ndCBkZWZpbmUgbWFjcm9zOyBub3cgZGVmaW5lZCBpbiBvcGNvZGUvbWlwcy5oLgorCShtYWluKTogQ2FsbCBteV9zdHJ0b3VsIHJhdGhlciB0aGFuIHN0cnRvdWwuCisJKG15X3N0cnRvdWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgorCitXZWQgSnVsIDE3IDE4OjEyOjM4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGdlbmNvZGUuYyAocHJvY2Vzc19pbnN0cnVjdGlvbnMpOiAgR2VuZXJhdGUgd29yZDY0IGFuZCB1d29yZDY0CisJaW5zdGVhZCBvZiBgbG9uZyBsb25nJyBhbmQgYHVuc2lnbmVkIGxvbmcgbG9uZycgZGF0YSB0eXBlcy4KKwkqIGludGVycC5jOiAgI2luY2x1ZGUgc3lzZGVwLmggdG8gZ2V0IHNpZ25hbHMsIGFuZCBkZWZpbmUgZGVmYXVsdAorCWZvciBTSUdCVVMuCisJKiAoQ29udmVydCk6ICBXb3JrIGFyb3VuZCBmb3IgVmlzdWFsLUMrKyBjb21waWxlciBidWcgd2l0aCB0eXBlCisJY29udmVyc2lvbi4KKwkqIHN1cHBvcnQuaDogIE1ha2UgdGhpbmdzIGNvbXBpbGUgdW5kZXIgVmlzdWFsLUMrKyBieSB1c2luZworCV9faW50NjQgaW5zdGVhZCBvZiBgbG9uZyBsb25nJy4gIENoYW5nZSBtYW55IHJlZnMgdG8gbG9uZyBsb25nCisJaW50byB3b3JkNjQvdXdvcmQ2NCB0eXBlZGVmcy4KKworV2VkIEp1biAyNiAxMjoyNDo1NSAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQorCisgICAgICAgICogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsCisgICAgICAgIElOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCisgICAgICAgIChkb2NkaXIpOiBSZW1vdmVkLgorICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KKyAgICAgICAgKEFDX1BST0dfSU5TVEFMTCk6IEFkZGVkLgorCShBQ19QUk9HX0NDKTogTW92ZWQgdG8gYmVmb3JlIGNvbmZpZ3VyZS5ob3N0IGNhbGwuCisgICAgICAgICogY29uZmlndXJlOiBSZWJ1aWx0LgorCQorV2VkIEp1biAgNSAwODoyODoxMyAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIEBTSU1DT05GQCBkZXBlbmRpbmcgb24gbWlwcyB0YXJnZXQuCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBNYWtlZmlsZS5pbiAocnVuKTogQWRkIEBTSU1DT05GQCB0byBjb250cm9sIHNpbXVsYXRvcgorIAljb25zdHJ1Y3Rpb24uCisJKiBnZW5jb2RlLmM6IENoYW5nZSBMT0FERFJNQVNLIHRvIDY0Yml0IG1lbW9yeSBtb2RlbCBvbmx5LgorCSogaW50ZXJwLmM6IFJlbW92ZSBzb21lIGRlYnVnZ2luZywgcHJvdmlkZSBtb3JlIGRldGFpbGVkIGVycm9yCisgCW1lc3NhZ2VzLCB1cGRhdGUgbWVtb3J5IGFjY2Vzc2VzIHRvIHVzZSBMT0FERFJNQVNLLgorCQorTW9uIEp1biAgMyAxMTo1NTowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIGNhbGxzIHRvIEFDX0NPTkZJR19IRUFERVIsIEFDX0NIRUNLX0hFQURFUlMsCisJQUNfQ0hFQ0tfTElCLCBhbmQgQUNfQ0hFQ0tfRlVOQ1MuICBDaGFuZ2UgQUNfT1VUUFVUIHRvIHNldAorCXN0YW1wLWguCisJKiBjb25maWd1cmU6IFJlYnVpbGQuCisJKiBjb25maWcuaW46IE5ldyBmaWxlLCBnZW5lcmF0ZWQgYnkgYXV0b2hlYWRlci4KKwkqIGludGVycC5jOiBJbmNsdWRlICJjb25maWcuaCIuICBJbmNsdWRlIDxzdGRsaWIuaD4sIDxzdHJpbmcuaD4sCisJYW5kIDxzdHJpbmdzLmg+IGlmIHRoZXkgZXhpc3QuICBSZXBsYWNlICNpZmRlZiBzdW4gd2l0aCAjaWZkZWYKKwlIQVZFX0FOSU5UIGFuZCBIQVZFX0FJTlQsIGFzIGFwcHJvcHJpYXRlLgorCSogTWFrZWZpbGUuaW4gKHJ1bik6IFVzZSBATElCU0AgcmF0aGVyIHRoYW4gLWxtLgorCShpbnRlcnAubyk6IERlcGVuZCB1cG9uIGNvbmZpZy5oLgorCShNYWtlZmlsZSk6IEp1c3QgcmVidWlsZCBNYWtlZmlsZS4KKwkoY2xlYW4pOiBSZW1vdmUgc3RhbXAtaC4KKwkobW9zdGx5Y2xlYW4pOiBNYWtlIHRoZSBzYW1lIGFzIGNsZWFuLCBub3QgYXMgZGlzdGNsZWFuLgorCShjb25maWcuaCwgc3RhbXAtaCk6IE5ldyB0YXJnZXRzLgorCitGcmkgTWF5IDEwIDAwOjQxOjE3IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KKworCSogaW50ZXJwLmMgKENvbGRSZXNldCk6IEZpeCBib29sZWFuIHRlc3QuIE1ha2UgYWxsIHNpbXVsYXRvcgorIAlnbG9iYWxzIHN0YXRpYy4KKworV2VkIE1heSAgOCAxNToxMjo1OCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGludGVycC5jICh4ZmVyX2RpcmVjdF93b3JkLCB4ZmVyX2RpcmVjdF9sb25nLAorCXN3YXBfZGlyZWN0X3dvcmQsIHN3YXBfZGlyZWN0X2xvbmcsIHhmZXJfYmlnX3dvcmQsCisJeGZlcl9iaWdfbG9uZywgeGZlcl9saXR0bGVfd29yZCwgeGZlcl9saXR0bGVfbG9uZywKKwlzd2FwX3dvcmQsc3dhcF9sb25nKTogQWRkZWQuCisJKiBpbnRlcnAuYyAoQ29sZFJlc2V0KTogUHJvdmlkZSBmdW5jdGlvbiBpbmRpcmVjdGlvbiB0bworIAlob3N0PC0+c2ltdWxhdGVkX3RhcmdldCB0cmFuc2ZlciByb3V0aW5lcy4KKwkqIGludGVycC5jIChzaW1fc3RvcmVfcmVnaXN0ZXIsIHNpbV9mZXRjaF9yZWdpc3Rlcik6IFVwZGF0ZWQgdG8KKyAJbWFrZSB1c2Ugb2YgaW5kaXJlY3RlZCB0cmFuc2ZlciByb3V0aW5lcy4KKworRnJpIEFwciAxOSAxNTo0ODoyNCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGdlbmNvZGUuYyAocHJvY2Vzc19pbnN0cnVjdGlvbnMpOiBFbnN1cmUgRlAgQUJTIGluc3RydWN0aW9uCisgCXJlY29nbmlzZWQuCisJKiBpbnRlcnAuYyAoQWJzb2x1dGVWYWx1ZSk6IEFkZCByb3V0aW5lLiBBbHNvIHByb3ZpZGUgc2ltcGxlIFBNT04KKyAJc3lzdGVtIGNhbGwgc3VwcG9ydC4KKworV2VkIEFwciAxMCAwOTo1MTozOCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGludGVycC5jIChzaW1fZG9fY29tbWFuZCk6IENvbXBsYWluIGlmIGNhbGxiYWNrIHN0cnVjdHVyZSBub3QKKyAJaW5pdGlhbGlzZWQuCisKK1RodSBNYXIgMjggMTM6NTA6NTEgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgorCisJKiBpbnRlcnAuYyAoQ29udmVydCk6IFByb3ZpZGUgcm91bmQtdG8tbmVhcmVzdCBhbmQgcm91bmQtdG8temVybworIAlzdXBwb3J0IGZvciBTdW4gaG9zdHMuCisJKiBNYWtlZmlsZS5pbiAoZ2VuY29kZSk6IEVuc3VyZSB0aGUgaG9zdCBjb21waWxlciBhbmQgbGlicmFyaWVzCisgCXVzZWQgZm9yIGNyb3NzLWhvc3RlZCBidWlsZC4KKworV2VkIE1hciAyNyAxNDo0MjoxMiAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGludGVycC5jLCBnZW5jb2RlLmM6IFNvbWUgbW9yZSAoVE9ETykgdGlkeWluZy4KKworVGh1IE1hciAgNyAxMToxOTozMyAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+CisKKwkqIGdlbmNvZGUuYywgaW50ZXJwLmM6IFJlcGxhY2VkIGV4cGxpY2l0IGxvbmcgbG9uZyByZWZlcmVuY2VzIHdpdGgKKyAJV09SRDY0SEksIFdPUkQ2NExPLCBTRVQ2NEhJIGFuZCBTRVQ2NExPIG1hY3JvIGNhbGxzLgorCSogc3VwcG9ydC5oIChTRVQ2NExPLCBTRVQ2NEhJKTogTWFjcm9zIGFkZGVkLgorCitXZWQgRmViIDIxIDEyOjE2OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi43LgorCitUdWUgSmFuIDMwIDA4OjQ4OjE4IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoTG9hZE1lbW9yeSk6IEVuY2xvc2UgdGV4dCBmb2xsb3dpbmcgI2VuZGlmIGluIC8qICovLgorCSogc3VwcG9ydC5oOiBSZW1vdmUgc3VwZXJmbHVvdXMgIjEiIGZyb20gI2lmLgorCSogc3VwcG9ydC5oIChDSEVDS1NJTSk6IFJlbW92ZSBzdHJheSAnYScgYXQgZW5kIG9mIGxpbmUuCisKK01vbiBEZWMgIDQgMTE6NDQ6NDAgMTk5NSAgSmFtaWUgU21pdGggIDxqc21pdGhAY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKFN0b3JlRlBSKTogQ29udHJvbCBVbmRlZmluZWRSZXN1bHQoKSBjYWxsIG9uCisgCVdBUk5fUkVTVUxUIG1hbmlmZXN0LgorCitGcmkgRGVjICAxIDE2OjM3OjE5IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KKworCSogZ2VuY29kZS5jOiBUaWRpZWQgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcsIGFuZCBhZGRlZCBGUCBpbnN0cnVjdGlvbgorIAlzdXBwb3J0LgorCisJKiBpbnRlcnAuYzogQWRkZWQgZGluZXJvSUlJLCBhbmQgQlNEIHByb2ZpbGluZyBzdXBwb3J0LiBBbHNvCisgCXJ1bi10aW1lIEZQIGhhbmRsaW5nLgorCitTdW4gT2N0IDIyIDAwOjU3OjE4IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQHBhc2FuZGEuY3lnbnVzLmNvLnVrPgorCisJKiBDaGFuZ2Vsb2csIE1ha2VmaWxlLmluLCBSRUFETUUuQ3lnbnVzLCBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbiwKKyAJZ2VuY29kZS5jLCBpbnRlcnAuYywgc3VwcG9ydC5oOiBjcmVhdGVkLgpkaWZmIC0tZ2l0IGEvc2ltL21pcHMvTWFrZWZpbGUuaW4gYi9zaW0vbWlwcy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTRiZDVmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL21pcHMvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwyOTMgQEAKKyMgICAgTWFrZWZpbGUgdGVtcGxhdGUgZm9yIENvbmZpZ3VyZSBmb3IgdGhlIE1JUFMgc2ltdWxhdG9yLgorIyAgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgorCisjIyBDT01NT05fUFJFX0NPTkZJR19GUkFHCisKK3NyY2Rpcj1Ac3JjZGlyQAorc3Jjcm9vdD0kKHNyY2RpcikvLi4vLi4vCisKKyMgT2JqZWN0IGZpbGVzIGNyZWF0ZWQgYnkgdmFyaW91cyBzaW11bGF0b3IgZ2VuZXJhdG9ycy4KKworCitTSU1fSUdFTl9PQkogPSBcCisJc3VwcG9ydC5vIFwKKwlpdGFibGUubyBcCisJc2VtYW50aWNzLm8gXAorCWlkZWNvZGUubyBcCisJaWNhY2hlLm8gXAorCUBtaXBzX2lnZW5fZW5naW5lQCBcCisJaXJ1bi5vIFwKKworCitTSU1fTTE2X09CSiA9IFwKKwltMTZfc3VwcG9ydC5vIFwKKwltMTZfc2VtYW50aWNzLm8gXAorCW0xNl9pZGVjb2RlLm8gXAorCW0xNl9pY2FjaGUubyBcCisJXAorCW0zMl9zdXBwb3J0Lm8gXAorCW0zMl9zZW1hbnRpY3MubyBcCisJbTMyX2lkZWNvZGUubyBcCisJbTMyX2ljYWNoZS5vIFwKKwlcCisJaXRhYmxlLm8gXAorCW0xNnJ1bi5vIFwKKworCitNSVBTX0VYVFJBX09CSlMgPSBAbWlwc19leHRyYV9vYmpzQAorTUlQU19FWFRSQV9MSUJTID0gQG1pcHNfZXh0cmFfbGlic0AKKworU0lNX09CSlMgPSBcCisJJChTSU1fQHNpbV9nZW5AX09CSikgXAorCSQoU0lNX05FV19DT01NT05fT0JKUykgXAorCSQoTUlQU19FWFRSQV9PQkpTKSBcCisJaW50ZXJwLm8gXAorCXNpbS1tYWluLm8gXAorCXNpbS1obG9hZC5vIFwKKwlzaW0tZW5naW5lLm8gXAorCXNpbS1zdG9wLm8gXAorCXNpbS1yZXN1bWUubyBcCisJc2ltLXJlYXNvbi5vIFwKKworCisjIExpc3Qgb2YgZmxhZ3MgdG8gYWx3YXlzIHBhc3MgdG8gJChDQykuCitTSU1fU1VCVEFSR0VUPUBTSU1fU1VCVEFSR0VUQAorU0lNX0VYVFJBX0NGTEFHUyA9ICQoU0lNX1NVQlRBUkdFVCkKKworU0lNX0VYVFJBX0NMRUFOID0gY2xlYW4tZXh0cmEKKworU0lNX0VYVFJBX0FMTCA9ICQoU0lNX0BzaW1fZ2VuQF9BTEwpCisKK1NJTV9FWFRSQV9MSUJTID0gJChNSVBTX0VYVFJBX0xJQlMpCisKKyMgTGlzdCBvZiBtYWluIG9iamVjdCBmaWxlcyBmb3IgYHJ1bicuCitTSU1fUlVOX09CSlMgPSBucnVuLm8KKworCisKKyMjIENPTU1PTl9QT1NUX0NPTkZJR19GUkFHCisKK2ludGVycC5vOiAkKHNyY2RpcikvaW50ZXJwLmMgY29uZmlnLmggc2ltLW1haW4uaCBpdGFibGUuaAorCisKKy4uL2lnZW4vaWdlbjoKKwljZCAuLi9pZ2VuICYmICQoTUFLRSkKKworSUdFTl9UUkFDRT0gIyAtRyBvbWl0LWxpbmUtbnVtYmVycyAjIC1HIHRyYWNlLXJ1bGUtc2VsZWN0aW9uIC1HIHRyYWNlLXJ1bGUtcmVqZWN0aW9uIC1HIHRyYWNlLWVudHJpZXMgIyAtRyB0cmFjZS1hbGwKK0lHRU5fSU5TTj0kKHNyY2RpcikvbWlwcy5pZ2VuCitJR0VOX0RDPSQoc3JjZGlyKS9taXBzLmRjCitNMTZfREM9JChzcmNkaXIpL20xNi5kYworSUdFTl9JTkNMVURFPVwKKwkkKHNyY2RpcikvbTE2LmlnZW4gXAorCSQoc3JjZGlyKS90eC5pZ2VuIFwKKwkkKHNyY2RpcikvdnIuaWdlbiBcCisKKyMgTkI6CVNpbmNlIHRoZXNlIGNhbiBiZSBidWlsdCBieSBhIG51bWJlciBvZiBnZW5lcmF0b3JzLCBjYXJlCisjCW11c3QgYmUgdGFrZW4gdG8gZW5zdXJlIHRoYXQgdGhleSBhcmUgb25seSBkZXBlbmRhbnQgb24KKyMJb25lIG9mIHRob3NlIGdlbmVyYXRvcnMuCitCVUlMVF9TUkNfRlJPTV9HRU4gPSBcCisJaXRhYmxlLmggXAorCWl0YWJsZS5jIFwKKworU0lNX0lHRU5fQUxMID0gdG1wLWlnZW4KK1NJTV9NMTZfQUxMID0gdG1wLW0xNgorCiskKEJVSUxUX1NSQ19GUk9NX0dFTik6ICQoU0lNX0BzaW1fZ2VuQF9BTEwpCisKKworCitCVUlMVF9TUkNfRlJPTV9JR0VOID0gXAorCWljYWNoZS5oIFwKKwlpY2FjaGUuYyBcCisJaWRlY29kZS5oIFwKKwlpZGVjb2RlLmMgXAorCXNlbWFudGljcy5oIFwKKwlzZW1hbnRpY3MuYyBcCisJbW9kZWwuaCBcCisJbW9kZWwuYyBcCisJc3VwcG9ydC5oIFwKKwlzdXBwb3J0LmMgXAorCWVuZ2luZS5oIFwKKwllbmdpbmUuYyBcCisJaXJ1bi5jIFwKKworJChCVUlMVF9TUkNfRlJPTV9JR0VOKTogdG1wLWlnZW4KKwordG1wLWlnZW46ICQoSUdFTl9JTlNOKSAkKElHRU5fREMpIC4uL2lnZW4vaWdlbiAkKElHRU5fSU5DTFVERSkKKwljZCAuLi9pZ2VuICYmICQoTUFLRSkKKwkuLi9pZ2VuL2lnZW4gXAorCQkkKElHRU5fVFJBQ0UpIFwKKwkJLUkgJChzcmNkaXIpIFwKKwkJLVdlcnJvciBcCisJCS1Xbm9kaXNjYXJkIFwKKwkJQHNpbV9pZ2VuX2ZsYWdzQCBcCisJCS1HIGdlbi1kaXJlY3QtYWNjZXNzIFwKKwkJLUcgZ2VuLXplcm8tcjAgXAorCQktQiAzMiBcCisJCS1IIDMxIFwKKwkJLWkgJChJR0VOX0lOU04pIFwKKwkJLW8gJChJR0VOX0RDKSBcCisJCS14IFwKKwkJLW4gaWNhY2hlLmggICAgLWhjIHRtcC1pY2FjaGUuaCBcCisJCS1uIGljYWNoZS5jICAgIC1jICB0bXAtaWNhY2hlLmMgXAorCQktbiBzZW1hbnRpY3MuaCAtaHMgdG1wLXNlbWFudGljcy5oIFwKKwkJLW4gc2VtYW50aWNzLmMgLXMgIHRtcC1zZW1hbnRpY3MuYyBcCisJCS1uIGlkZWNvZGUuaCAgIC1oZCB0bXAtaWRlY29kZS5oIFwKKwkJLW4gaWRlY29kZS5jICAgLWQgIHRtcC1pZGVjb2RlLmMgXAorCQktbiBtb2RlbC5oICAgICAtaG0gdG1wLW1vZGVsLmggXAorCQktbiBtb2RlbC5jICAgICAtbSAgdG1wLW1vZGVsLmMgXAorCQktbiBzdXBwb3J0LmggICAtaGYgdG1wLXN1cHBvcnQuaCBcCisJCS1uIHN1cHBvcnQuYyAgIC1mICB0bXAtc3VwcG9ydC5jIFwKKwkJLW4gaXRhYmxlLmggICAgLWh0IHRtcC1pdGFibGUuaCBcCisJCS1uIGl0YWJsZS5jICAgIC10ICB0bXAtaXRhYmxlLmMgXAorCQktbiBlbmdpbmUuaCAgICAtaGUgdG1wLWVuZ2luZS5oIFwKKwkJLW4gZW5naW5lLmMgICAgLWUgIHRtcC1lbmdpbmUuYyBcCisJCS1uIGlydW4uYyAgICAgIC1yICB0bXAtaXJ1bi5jCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pY2FjaGUuaCBpY2FjaGUuaAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWNhY2hlLmMgaWNhY2hlLmMKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWlkZWNvZGUuaCBpZGVjb2RlLmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWlkZWNvZGUuYyBpZGVjb2RlLmMKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXNlbWFudGljcy5oIHNlbWFudGljcy5oCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zZW1hbnRpY3MuYyBzZW1hbnRpY3MuYworCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtbW9kZWwuaCBtb2RlbC5oCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1tb2RlbC5jIG1vZGVsLmMKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXN1cHBvcnQuaCBzdXBwb3J0LmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXN1cHBvcnQuYyBzdXBwb3J0LmMKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWl0YWJsZS5oIGl0YWJsZS5oCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pdGFibGUuYyBpdGFibGUuYworCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtZW5naW5lLmggZW5naW5lLmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWVuZ2luZS5jIGVuZ2luZS5jCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pcnVuLmMgaXJ1bi5jCisJdG91Y2ggdG1wLWlnZW4KKworc2VtYW50aWNzLm86IHNpbS1tYWluLmggc2VtYW50aWNzLmMgJChTSU1fRVhUUkFfREVQUykKK2VuZ2luZS5vOiBzaW0tbWFpbi5oIGVuZ2luZS5jICQoU0lNX0VYVFJBX0RFUFMpCitzdXBwb3J0Lm86IHNpbS1tYWluLmggc3VwcG9ydC5jICQoU0lNX0VYVFJBX0RFUFMpCitpZGVjb2RlLm86IHNpbS1tYWluLmggaWRlY29kZS5jICQoU0lNX0VYVFJBX0RFUFMpCitpdGFibGUubzogc2ltLW1haW4uaCBpdGFibGUuYyAkKFNJTV9FWFRSQV9ERVBTKQorCisKKworCitCVUlMVF9TUkNfRlJPTV9NMTYgPSBcCisJbTE2X2ljYWNoZS5oIFwKKwltMTZfaWNhY2hlLmMgXAorCW0xNl9pZGVjb2RlLmggXAorCW0xNl9pZGVjb2RlLmMgXAorCW0xNl9zZW1hbnRpY3MuaCBcCisJbTE2X3NlbWFudGljcy5jIFwKKwltMTZfbW9kZWwuaCBcCisJbTE2X21vZGVsLmMgXAorCW0xNl9zdXBwb3J0LmggXAorCW0xNl9zdXBwb3J0LmMgXAorCVwKKwltMzJfaWNhY2hlLmggXAorCW0zMl9pY2FjaGUuYyBcCisJbTMyX2lkZWNvZGUuaCBcCisJbTMyX2lkZWNvZGUuYyBcCisJbTMyX3NlbWFudGljcy5oIFwKKwltMzJfc2VtYW50aWNzLmMgXAorCW0zMl9tb2RlbC5oIFwKKwltMzJfbW9kZWwuYyBcCisJbTMyX3N1cHBvcnQuaCBcCisJbTMyX3N1cHBvcnQuYyBcCisKKyQoQlVJTFRfU1JDX0ZST01fTTE2KTogdG1wLW0xNgorCit0bXAtbTE2OiAkKElHRU5fSU5TTikgJChJR0VOX0RDKSAuLi9pZ2VuL2lnZW4gJChJR0VOX0lOQ0xVREUpCisJY2QgLi4vaWdlbiAmJiAkKE1BS0UpCisJLi4vaWdlbi9pZ2VuIFwKKwkJJChJR0VOX1RSQUNFKSBcCisJCS1JICQoc3JjZGlyKSBcCisJCS1XZXJyb3IgXAorCQktV25vZGlzY2FyZCBcCisJCUBzaW1fbTE2X2ZsYWdzQCBcCisJCS1HIGdlbi1kaXJlY3QtYWNjZXNzIFwKKwkJLUcgZ2VuLXplcm8tcjAgXAorCQktQiAxNiBcCisJCS1IIDE1IFwKKwkJLWkgJChJR0VOX0lOU04pIFwKKwkJLW8gJChNMTZfREMpIFwKKwkJLVAgbTE2XyBcCisJCS14IFwKKwkJLW4gbTE2X2ljYWNoZS5oICAgIC1oYyB0bXAtaWNhY2hlLmggXAorCQktbiBtMTZfaWNhY2hlLmMgICAgLWMgIHRtcC1pY2FjaGUuYyBcCisJCS1uIG0xNl9zZW1hbnRpY3MuaCAtaHMgdG1wLXNlbWFudGljcy5oIFwKKwkJLW4gbTE2X3NlbWFudGljcy5jIC1zICB0bXAtc2VtYW50aWNzLmMgXAorCQktbiBtMTZfaWRlY29kZS5oICAgLWhkIHRtcC1pZGVjb2RlLmggXAorCQktbiBtMTZfaWRlY29kZS5jICAgLWQgIHRtcC1pZGVjb2RlLmMgXAorCQktbiBtMTZfbW9kZWwuaCAgICAgLWhtIHRtcC1tb2RlbC5oIFwKKwkJLW4gbTE2X21vZGVsLmMgICAgIC1tICB0bXAtbW9kZWwuYyBcCisJCS1uIG0xNl9zdXBwb3J0LmggICAtaGYgdG1wLXN1cHBvcnQuaCBcCisJCS1uIG0xNl9zdXBwb3J0LmMgICAtZiAgdG1wLXN1cHBvcnQuYyBcCisJCSMKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWljYWNoZS5oIG0xNl9pY2FjaGUuaAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWNhY2hlLmMgbTE2X2ljYWNoZS5jCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pZGVjb2RlLmggbTE2X2lkZWNvZGUuaAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWRlY29kZS5jIG0xNl9pZGVjb2RlLmMKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXNlbWFudGljcy5oIG0xNl9zZW1hbnRpY3MuaAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc2VtYW50aWNzLmMgbTE2X3NlbWFudGljcy5jCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1tb2RlbC5oIG0xNl9tb2RlbC5oCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1tb2RlbC5jIG0xNl9tb2RlbC5jCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zdXBwb3J0LmggbTE2X3N1cHBvcnQuaAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc3VwcG9ydC5jIG0xNl9zdXBwb3J0LmMKKwkuLi9pZ2VuL2lnZW4gXAorCQkkKElHRU5fVFJBQ0UpIFwKKwkJLUkgJChzcmNkaXIpIFwKKwkJLVdlcnJvciBcCisJCS1Xbm9kaXNjYXJkIFwKKwkJQHNpbV9pZ2VuX2ZsYWdzQCBcCisJCS1HIGdlbi1kaXJlY3QtYWNjZXNzIFwKKwkJLUcgZ2VuLXplcm8tcjAgXAorCQktQiAzMiBcCisJCS1IIDMxIFwKKwkJLWkgJChJR0VOX0lOU04pIFwKKwkJLW8gJChJR0VOX0RDKSBcCisJCS1QIG0zMl8gXAorCQkteCBcCisJCS1uIG0zMl9pY2FjaGUuaCAgICAtaGMgdG1wLWljYWNoZS5oIFwKKwkJLW4gbTMyX2ljYWNoZS5jICAgIC1jICB0bXAtaWNhY2hlLmMgXAorCQktbiBtMzJfc2VtYW50aWNzLmggLWhzIHRtcC1zZW1hbnRpY3MuaCBcCisJCS1uIG0zMl9zZW1hbnRpY3MuYyAtcyAgdG1wLXNlbWFudGljcy5jIFwKKwkJLW4gbTMyX2lkZWNvZGUuaCAgIC1oZCB0bXAtaWRlY29kZS5oIFwKKwkJLW4gbTMyX2lkZWNvZGUuYyAgIC1kICB0bXAtaWRlY29kZS5jIFwKKwkJLW4gbTMyX21vZGVsLmggICAgIC1obSB0bXAtbW9kZWwuaCBcCisJCS1uIG0zMl9tb2RlbC5jICAgICAtbSAgdG1wLW1vZGVsLmMgXAorCQktbiBtMzJfc3VwcG9ydC5oICAgLWhmIHRtcC1zdXBwb3J0LmggXAorCQktbiBtMzJfc3VwcG9ydC5jICAgLWYgIHRtcC1zdXBwb3J0LmMgXAorCQkjCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pY2FjaGUuaCBtMzJfaWNhY2hlLmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWljYWNoZS5jIG0zMl9pY2FjaGUuYworCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWRlY29kZS5oIG0zMl9pZGVjb2RlLmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWlkZWNvZGUuYyBtMzJfaWRlY29kZS5jCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zZW1hbnRpY3MuaCBtMzJfc2VtYW50aWNzLmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXNlbWFudGljcy5jIG0zMl9zZW1hbnRpY3MuYworCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtbW9kZWwuaCBtMzJfbW9kZWwuaAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtbW9kZWwuYyBtMzJfbW9kZWwuYworCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc3VwcG9ydC5oIG0zMl9zdXBwb3J0LmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXN1cHBvcnQuYyBtMzJfc3VwcG9ydC5jCisJLi4vaWdlbi9pZ2VuIFwKKwkJJChJR0VOX1RSQUNFKSBcCisJCS1JICQoc3JjZGlyKSBcCisJCS1XZXJyb3IgXAorCQktV25vZGlzY2FyZCBcCisJCS1Xbm93aWR0aCBcCisJCUBzaW1faWdlbl9mbGFnc0AgQHNpbV9tMTZfZmxhZ3NAIFwKKwkJLUcgZ2VuLWRpcmVjdC1hY2Nlc3MgXAorCQktRyBnZW4temVyby1yMCBcCisJCS1pICQoSUdFTl9JTlNOKSBcCisJCS1uIGl0YWJsZS5oICAgIC1odCB0bXAtaXRhYmxlLmggXAorCQktbiBpdGFibGUuYyAgICAtdCAgdG1wLWl0YWJsZS5jIFwKKwkJIworCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaXRhYmxlLmggaXRhYmxlLmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWl0YWJsZS5jIGl0YWJsZS5jCisJdG91Y2ggdG1wLW0xNgorCisKK2NsZWFuLWV4dHJhOgorCXJtIC1mICQoQlVJTFRfU1JDX0ZST01fR0VOKQorCXJtIC1mICQoQlVJTFRfU1JDX0ZST01fSUdFTikKKwlybSAtZiAkKEJVSUxUX1NSQ19GUk9NX00xNikKKwlybSAtZiB0bXAtKgorCXJtIC1mIG0xNiogbTMyKiBpdGFibGUqCisKZGlmZiAtLWdpdCBhL3NpbS9taXBzL2FjY29uZmlnLmggYi9zaW0vbWlwcy9hY2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Yjg3YTEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbWlwcy9hY2NvbmZpZy5oCkBAIC0wLDAgKzEsMTUgQEAKKworLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCisjdW5kZWYgRU5BQkxFX05MUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCisjdW5kZWYgSEFWRV9DQVRHRVRTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0dFVFRFWFQKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCisjdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwpkaWZmIC0tZ2l0IGEvc2ltL21pcHMvY29uZmlnLmluIGIvc2ltL21pcHMvY29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZDY1MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbWlwcy9jb25maWcuaW4KQEAgLTAsMCArMSwxNzQgQEAKKy8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLworCisvKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLworI3VuZGVmIENfQUxMT0NBCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KKyN1bmRlZiBjb25zdAorCisvKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCisgICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLworI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLworI3VuZGVmIEhBVkVfQUxMT0NBCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLworI3VuZGVmIEhBVkVfQUxMT0NBX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLworI3VuZGVmIEhBVkVfTU1BUAorCisvKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLworI3VuZGVmIGlubGluZQorCisvKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIG9mZl90CisKKy8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLworI3VuZGVmIF9QT1NJWF9TT1VSQ0UKKworLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGludCBvciB2b2lkKS4gICovCisjdW5kZWYgUkVUU0lHVFlQRQorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBzaXplX3QKKworLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCisgICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKKyAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KKyBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCisgU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCisgU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KKyAqLworI3VuZGVmIFNUQUNLX0RJUkVDVElPTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLworI3VuZGVmIFNURENfSEVBREVSUworCisvKiBEZWZpbmUgaWYgeW91ciBwcm9jZXNzb3Igc3RvcmVzIHdvcmRzIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQKKyAgIGJ5dGUgZmlyc3QgKGxpa2UgTW90b3JvbGEgYW5kIFNQQVJDLCB1bmxpa2UgSW50ZWwgYW5kIFZBWCkuICAqLworI3VuZGVmIFdPUkRTX0JJR0VORElBTgorCisvKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KKyN1bmRlZiBFTkFCTEVfTkxTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0dFVFRFWFQKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCisjdW5kZWYgSEFWRV9MQ19NRVNTQUdFUworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fc2V0ZnB1Y3cgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19TRVRGUFVDVworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGFpbnQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfQUlOVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGFuaW50IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0FOSU5UCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0RDR0VUVEVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRDV0QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRQQUdFU0laRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHJ1c2FnZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRSVVNBR0UKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfTVVOTUFQCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1BVVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VUTE9DQUxFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lnYWN0aW9uIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NJR0FDVElPTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNxcnQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1FSVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0hSCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGltZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9USU1FCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfQVJHWl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZnB1X2NvbnRyb2wuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfRlBVX0NPTlRST0xfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9NQUxMT0NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9OTF9UWVBFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVkFMVUVTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtIGxpYnJhcnkgKC1sbSkuICAqLworI3VuZGVmIEhBVkVfTElCTQpkaWZmIC0tZ2l0IGEvc2ltL21pcHMvY29uZmlndXJlIGIvc2ltL21pcHMvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU4YmUwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbWlwcy9jb25maWd1cmUKQEAgLTAsMCArMSw0ODkwIEBACisjISAvYmluL3NoCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3NpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisjIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKKyMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KKworIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMworCisKKworCisKKyMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKKworCisjIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKKworCisjIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIEN5Z3dpbjMyLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgQ1lHV0lOMzIgdG8gInllcyIuCisjIE90aGVyd2lzZSBzZXQgaXQgdG8gIm5vIi4KKworCisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgV2luMzIsIHdpdGhvdXQgdXNpbmcKKyMgQUNfQ0FOT05JQ0FMXyouICBJZiBzbywgc2V0IG91dHB1dCB2YXJpYWJsZSBFWEVFWFQgdG8gIi5leGUiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICIiLgorCisKKworCisKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCithY19oZWxwPSIkYWNfaGVscAorICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQkJRW5hYmxlIGRldmVsb3BlciBmdW5jdGlvbmFsaXR5LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1ic3dhcAkJCVVzZSBIb3N0IHNwZWNpZmljIEJTV0FQIGluc3RydWN0aW9uLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1jZmxhZ3M9b3B0cwkJRXh0cmEgQ0ZMQUdTIGZvciB1c2UgaW4gYnVpbGRpbmcgc2ltdWxhdG9yIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWRlYnVnPW9wdHMJCUVuYWJsZSBkZWJ1Z2dpbmcgZmxhZ3MiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tc3RkaW8JCQlTcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIHN0ZGlvIGZvciBjb25zb2xlIGlucHV0L291dHB1dC4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tdHJhY2U9b3B0cwkJRW5hYmxlIHRyYWNpbmcgZmxhZ3MiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tcHJvZmlsZT1vcHRzCQlFbmFibGUgcHJvZmlsaW5nIGZsYWdzIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWlubGluZT1pbmxpbmVzCQlTcGVjaWZ5IHdoaWNoIGZ1bmN0aW9ucyBzaG91bGQgYmUgaW5saW5lZC4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tYWxpZ25tZW50PWFsaWduCQlTcGVjaWZ5IHN0cmljdCwgIG5vbnN0cmljdCBvciBmb3JjZWQgYWxpZ25tZW50IG9mIG1lbW9yeSBhY2Nlc3Nlcy4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbj1lbmQJCVNwZWNpZnkgaG9zdCBieXRlIGVuZGlhbiBvcmllbnRhdGlvbi4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1idWlsZC13YXJuaW5nc1s9TElTVF0JCUVuYWJsZSBidWlsZC10aW1lIGNvbXBpbGVyIHdhcm5pbmdzIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWVuZGlhbj1lbmRpYW4JCVNwZWNpZnkgdGFyZ2V0IGJ5dGUgZW5kaWFuIG9yaWVudGF0aW9uLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1iaXRzaXplPU4JCVNwZWNpZnkgdGFyZ2V0IGJpdHNpemUgKDMyIG9yIDY0KS4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZmxvYXQJCQlTcGVjaWZ5IHRoYXQgdGhlIHRhcmdldCBwcm9jZXNzb3IgaGFzIGZsb2F0aW5nIHBvaW50IGhhcmR3YXJlLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1zbXA9bgkJCVNwZWNpZnkgbnVtYmVyIG9mIHByb2Nlc3NvcnMgdG8gY29uZmlndXJlIGZvciAoZGVmYXVsdCAke2RlZmF1bHRfc2ltX3NtcH0pLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1oYXJkd2FyZT1MSVNUCQlTcGVjaWZ5IHRoZSBoYXJkd2FyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLXggICAgICAgICAgICAgICAgdXNlIHRoZSBYIFdpbmRvdyBTeXN0ZW0iCithY19oZWxwPSIkYWNfaGVscAorICAtLXdpdGgtc2ltLWdwdTI9cGF0aAkJCVVzZSBHUFUyIGxpYnJhcnkgdW5kZXIgZ2l2ZW4gZGlyZWN0b3J5IgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS13aXRoLXggICAgICAgICAgICAgICAgdXNlIHRoZSBYIFdpbmRvdyBTeXN0ZW0iCithY19oZWxwPSIkYWNfaGVscAorICAtLXdpdGgtc2ltLWZ1bml0PXBhdGgJCVVzZSB0YXJnZXQgRlAgbGlicmFyeSB1bmRlciBnaXZlbiBkaXJlY3RvcnkiCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCisgICAgZXhpdCAwIDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Li9jb25maWcubG9nCisKK2VjaG8gIlwKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorIiAxPiY1CisKKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCithY19jb25maWd1cmVfYXJncz0KK2ZvciBhY19hcmcKK2RvCisgIGNhc2UgIiRhY19hcmciIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBlc2FjCitkb25lCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKyMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCisjIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCitpZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID4gY29uZmRlZnMuaAorCisjIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0CisjIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCithY19leGVleHQ9CithY19vYmpleHQ9bworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3MDU6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBDUFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKKyAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KKyAgQ1BQPSIke0NDLWNjfSAtRSIKKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzIwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MjY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDczNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NzQzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3NTQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjc2MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0vbGliL2NwcAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCisgIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgorZWxzZQorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCitlY2hvICIkYWNfdCIiJENQUCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3ODU6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQorc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKK2FsbDoKKwlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJworRU9GCisjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KK2V2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAoraWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKK2Vsc2UKKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KK2ZpCitybSAtZiBjb25mdGVzdG1ha2UKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIFNFVF9NQUtFPQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjgxMjogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQoraWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCisgIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKK3RoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCitFT0YKKworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENDPSIkQ0MgLXBvc2l4IgorICBlbHNlCisgICAgQ0M9IiRDQyAtWHAiCisgIGZpCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBJU0M9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODMzOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4MzggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjg0NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4NjMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODgxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICA6CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDkwMiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQoraWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKK2V4aXQgKDApOyB9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgOgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTM3OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDk0MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwordHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OworLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK2NoYXIgY29uc3QgKmNvbnN0ICpjY3A7CitjaGFyICoqcDsKKy8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCitzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CitzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKKy8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KKyAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQorICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KK2NvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKK2NjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKy8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCisrK2NjcDsKK3AgPSAoY2hhcioqKSBjY3A7CitjY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKK3sgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgKnQ7CisgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7CisKKyAgKnQrKyA9IDA7Cit9Cit7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLworICBpbnQgeFtdID0gezI1LCAxN307CisgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICsrZm9vOworfQoreyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOworICBpcHRyIHAgPSAwOworICArK3A7Cit9Cit7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKKyAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OworICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Cit9Cit7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLworICBjb25zdCBpbnQgZm9vID0gMTA7Cit9CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5OTE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgY29uc3QgCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTAxMjogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19jdl9jX2lubGluZT1ubworZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbworICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDE5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7Cit9ICRhY19rdyBmb28oKSB7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAyNjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitmaQorcm0gLWYgY29uZnRlc3QqCitkb25lCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKK2Nhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KKyAgaW5saW5lIHwgeWVzKSA7OworICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGlubGluZSAKK0VPRgorIDs7CisgICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCitFT0YKKyA7OworZXNhYworCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwNTI6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwNTcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgb2ZmX3QgbG9uZworRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwODU6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA5MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAic2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZAorRU9GCisKK2ZpCisKKyMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCisjIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExMjA6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTI1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhbGxvY2EuaD4KK2ludCBtYWluKCkgeworY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTUzOiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExNTggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZWxzZQorIyBpZmRlZiBfTVNDX1ZFUgorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgZWxzZQorIyAgaWYgSEFWRV9BTExPQ0FfSAorIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KK2NoYXIgKmFsbG9jYSAoKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE4NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0EgMQorRU9GCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KKyAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKKyAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCisgICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAorICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KKyAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIENfQUxMT0NBIDEKK0VPRgorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyMTg6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjIzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKK3dlYmVjcmF5CisjZWxzZQord2Vub3RiZWNyYXkKKyNlbmRpZgorCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9vc19jcmF5PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCitmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTI0ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTI1MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjc2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCitFT0YKKworICBicmVhaworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2RvbmUKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzMDM6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMzExICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK2ZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCit7CisgIHN0YXRpYyBjaGFyICphZGRyID0gMDsKKyAgYXV0byBjaGFyIGR1bW15OworICBpZiAoYWRkciA9PSAwKQorICAgIHsKKyAgICAgIGFkZHIgPSAmZHVtbXk7CisgICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKK30KK21haW4gKCkKK3sKKyAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQorZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KK0VPRgorCitmaQorCitmb3IgYWNfaGRyIGluIHVuaXN0ZC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTM1NTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzNjAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjEzNjU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTM5NDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM5OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDIyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDQ3OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNDU1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCisgICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKKwltbWFwIHByaXZhdGUgbm90IGZpeGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisJbW1hcCBzaGFyZWQgbm90IGZpeGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKKyAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKKyAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQorICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQorICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCisgICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQorICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKKyAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgorCisgICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCisgICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgorICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCisgICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisvKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCisjaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKyMgaWZkZWYgSEFWRV9VTklTVERfSAorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGVuZGlmCisKKy8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCisjIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisjIGVuZGlmCisKKyMgaWZkZWYgX1NDX1BBR0VTSVpFCisjICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKKyMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKyMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCisjICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKKyMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgICAgaWZkZWYgTkJQRworIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQorIyAgICAgaWZuZGVmIENMU0laRQorIyAgICAgIGRlZmluZSBDTFNJWkUgMQorIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCisjICAgIGVsc2UgLyogbm8gTkJQRyAqLworIyAgICAgaWZkZWYgTkJQQworIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKKyMgICAgIGVsc2UgLyogbm8gTkJQQyAqLworIyAgICAgIGlmZGVmIFBBR0VTSVpFCisjICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCisjICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KKyMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KKyMgICAgZW5kaWYgLyogbm8gTkJQRyAqLworIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCisjICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLworCisjZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9CisjZWxzZQorY2hhciAqbWFsbG9jKCk7CisjZW5kaWYKKworaW50CittYWluKCkKK3sKKwljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKKwlpbnQgaSwgcGFnZXNpemU7CisJaW50IGZkOworCisJcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOworCisJLyoKKwkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCisJICovCisJZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKKwl1bWFzaygwKTsKKwlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKworCS8qCisJICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCisJICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAorCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCisJICovCisJZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEyKQorCQlleGl0KDEpOworCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKKwlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQorCQkJZXhpdCgxKTsKKworCS8qCisJICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKKwkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCisJICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCisJICovCisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7CisJZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YTMpCisJCWV4aXQoMSk7CisJaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCisJCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOworCWV4aXQoMCk7Cit9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTk1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTU1BUCAxCitFT0YKKworZmkKKworCisjIGF1dG9jb25mLmluZm8gc2F5cyB0aGlzIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgQUNfSU5JVC4KKworCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCithY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKK2FjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisKKyMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgorIyBUaGUgaW5wdXRzIGFyZToKKyMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAorIworIyBUaGUgcnVsZXMgYXJlOgorIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKKyMgICAgc2FtZSB0aW1lLgorIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KKyMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAorIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KKyMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KKyMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCisKKyMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KKyMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KK2Nhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgorTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OworKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCisKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgoraWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2Njg6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorCitob3N0X2FsaWFzPSRob3N0CitjYXNlICIkaG9zdF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKQorICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKKyAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaSA7OworICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKK2hvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY4OTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKwordGFyZ2V0X2FsaWFzPSR0YXJnZXQKK2Nhc2UgIiR0YXJnZXRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKwordGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAordGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK3RhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCit0YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTcwNzogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorCitidWlsZF9hbGlhcz0kYnVpbGQKK2Nhc2UgIiRidWlsZF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKK2J1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitidWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgorCit0ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCisgIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKKyAgICBOT05FTk9ORXMseCx4LCAmJgorICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCisKK2lmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQorZWxzZQorICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCisgIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKK3MsXFwsXFxcXCxnOyBzLFwkLCQkLGcKK0VPRl9TRUQKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKKyAgcm0gLWYgY29uZnRlc3RzZWQKK2ZpCit0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KK3Rlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKworIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgordGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3NTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3ODA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODMwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorIDs7CisgICAgZXNhYworICBmaQorICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODYxOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxODcxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK21haW4oKXtyZXR1cm4oMCk7fQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4NzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcworICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCisgIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KKyAgZWxzZQorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCisgIGZpCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODk1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1CitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTkwMDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTkwOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2N2X3Byb2dfZ2NjPXllcworZWxzZQorICBhY19jdl9wcm9nX2djYz1ubworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKKworaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorCithY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKK2FjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTI4OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYworaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19nPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQorCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5NzE6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisKKyMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KK2lmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisgIENDX0ZPUl9CVUlMRD0nJChDQyknCitlbHNlCisgIENDX0ZPUl9CVUlMRD1nY2MKK2ZpCisKKworCisKK0FSPSR7QVItYXJ9CisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjAzNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKK2ZpCitmaQorUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworQUxMX0xJTkdVQVM9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAordW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDcxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjA3NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjA4MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAorX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIxMTE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIxMTYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEzOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCisgICAgIGZvciBhY19mdW5jIGluIHN0cGNweQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjE2ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjE3MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmaQorICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KKyAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1RQQ1BZIDEKK0VPRgorCisgICBmaQorCisgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyMzA6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjIzNSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bG9jYWxlLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiBMQ19NRVNTQUdFUworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgorICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQorRU9GCisKKyAgICBmaQorICBmaQorICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjYzOiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCisgIFVTRV9OTFM9JGVuYWJsZXZhbAorZWxzZQorICBVU0VfTkxTPXllcworZmkKKworICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgorICAgIAorCisgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KKworICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEVOQUJMRV9OTFMgMQorRU9GCisKKyAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyODM6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKK2Vsc2UKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubworZmkKKworICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2CisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KKwlubHNfY3ZfaGVhZGVyX2xpYmd0PQorCUNBVE9CSkVYVD1OT05FCisKKwlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjMwMjogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjMwNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzEyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjMyOTogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzM0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzQxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKwkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzNTc6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQorYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1saW50bCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzY1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgYmluZHRleHRkb21haW4oKTsKKworaW50IG1haW4oKSB7CitiaW5kdGV4dGRvbWFpbigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM3NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjM5MjogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzk3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQwNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0dFVFRFWFQgMQorRU9GCisKKwkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0MzI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisJICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgorCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0NjY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI0NzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ5NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjUyMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjU1NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNTg4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CitleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CisJCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTk2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9LmdtbworCQkgICBEQVRBRElSTkFNRT1zaGFyZQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9Lm1vCisJCSAgIERBVEFESVJOQU1FPWxpYgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCQlJTlNUT0JKRVhUPS5tbworCSAgICAgIGZpCisJICAgIGZpCisJCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisJICAgICAgICAKKyAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KKwkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCisgICAgICAgIGZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjYyODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KKwlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2NjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2OTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KKwkgIDogOworCWVsc2UKKwkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCisgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKKyAgICBkb25lCisKKyAgICAgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgIAorCisgICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCisgICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCisgICAgICAgTElOR1VBUz0KKyAgICAgZWxzZQorICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3ODc6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQorICAgICAgIE5FV19MSU5HVUFTPQorICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbworICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgorICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7CisgICAgICAgICBlc2FjCisgICAgICAgZG9uZQorICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCisgICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2CisgICAgIGZpCisKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCisgICAgIGZpCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKKyAgIGVsc2UKKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAorLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgorICAgZmkKKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgorICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KKwkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI4MTU6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI4MjAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjgyNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIG1zZ2Zvcm1hdD1saW51eAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK21zZ2Zvcm1hdD14b3BlbgorZmkKKworCisJICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCisgICAgICBmaQorICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCisJICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICAKKyAgIAorCisgICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCisgICAKKworICAgICAgbD0KKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgCisKKyMgQ2hlY2sgZm9yIGNvbW1vbiBoZWFkZXJzLgorIyBGSVhNRTogU2VlbXMgdG8gbWUgdGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgZm9yIGkzODYtd2luZG93cyBob3N0cy4KKyMgQXQgb25lIHBvaW50IHRoZXJlIHdlcmUgaGFyZGNvZGVkIEFDX0RFRklORSdzIGlmICR7aG9zdH0gPSBpMzg2LSotd2luZG93cyouCitmb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB1bmlzdGQuaCB0aW1lLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyODk0OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjg5OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjkwNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19oZHIgaW4gc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5MzQ6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTM5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTQ0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2hkciBpbiBmY250bC5oIGZwdV9jb250cm9sLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTc0OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjk3OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk4NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19oZHIgaW4gZGxmY24uaCBlcnJuby5oIHN5cy9zdGF0LmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMDE0OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzAxOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MzAyNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHJ1c2FnZSB0aW1lIHNpZ2FjdGlvbiBfX3NldGZwdWN3CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMDUzOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDU4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwODE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworIyBDaGVjayBmb3Igc29ja2V0IGxpYnJhcmllcworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMxMDg6IGNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nYmluZCB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxzb2NrZXQgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzExNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGJpbmQoKTsKKworaW50IG1haW4oKSB7CitiaW5kKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTI3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHNvY2tldCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9saWIgMQorRU9GCisKKyAgTElCUz0iLWxzb2NrZXQgJExJQlMiCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzE1NTogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQorYWNfbGliX3Zhcj1gZWNobyBuc2wnXydnZXRob3N0YnluYW1lIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbG5zbCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMTYzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZ2V0aG9zdGJ5bmFtZSgpOworCitpbnQgbWFpbigpIHsKK2dldGhvc3RieW5hbWUoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbnNsIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2xpYiAxCitFT0YKKworICBMSUJTPSItbG5zbCAkTElCUyIKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0CisKKworCitVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlNQUlOVD0iIiBVU0VfTUFJTlRBSU5FUl9NT0RFPXllcyA7OworICBubykJTUFJTlQ9IiMiIDs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLW1haW50YWluZXItbW9kZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IE1BSU5UPSIjIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQorZmkKK2Vsc2UKKyAgTUFJTlQ9IiMiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSAtRFVTRV9CU1dBUD0xIjs7CisgIG5vKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0wIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1ic3dhcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ic3dhcD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9ic3dhcD0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY2ZsYWdzIG9yIC0tZGlzYWJsZS1zaW0tY2ZsYWdzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jZmxhZ3MiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQkgc2ltX2NmbGFncz0iLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIjs7CisgIHRyYWNlKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJQbGVhc2UgdXNlIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpbnN0ZWFkLiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2NmbGFncz0iIjs7CisgIG5vKQkgc2ltX2NmbGFncz0iIjs7CisgICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2NmbGFncz0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVidWcgb3IgLS1kaXNhYmxlLXNpbS1kZWJ1ZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWJ1ZyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpIHNpbV9kZWJ1Zz0iLURERUJVRz03IC1EV0lUSF9ERUJVRz03Ijs7CisgIG5vKSAgc2ltX2RlYnVnPSItRERFQlVHPTAgLURXSVRIX0RFQlVHPTAiOzsKKyAgKikgICBzaW1fZGVidWc9Ii1EREVCVUc9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfREVCVUc9Jygke2VuYWJsZXZhbH0pJyI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWJ1ZyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIGRlYnVnID0gJHNpbV9kZWJ1ZyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2RlYnVnPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zdGRpbyBvciAtLWRpc2FibGUtc2ltLXN0ZGlvIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zdGRpbytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N0ZGlvIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7CisgIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zdGRpbyIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGlvPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkaW8iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHN0ZGlvIGZsYWdzID0gJHNpbV9zdGRpbyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3N0ZGlvPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS10cmFjZSBvciAtLWRpc2FibGUtc2ltLXRyYWNlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV90cmFjZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3RyYWNlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3RyYWNlPSItRFRSQUNFPTEgLURXSVRIX1RSQUNFPS0xIjs7CisgIG5vKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MCAtRFdJVEhfVFJBQ0U9MCI7OworICBbLTAtOV0qKQorCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fdHJhY2U9IiIKKwlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKwkgIGlmIHRlc3QgeCIkc2ltX3RyYWNlIiA9IHg7IHRoZW4KKwkgICAgc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9JyhUUkFDRV8keCIKKwkgIGVsc2UKKwkgICAgc2ltX3RyYWNlPSIke3NpbV90cmFjZX18VFJBQ0VfJHgiCisJICBmaQorCWRvbmUKKwlzaW1fdHJhY2U9IiRzaW1fdHJhY2UpJyIgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSB0cmFjZSA9ICRzaW1fdHJhY2UiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV90cmFjZT0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcHJvZmlsZSBvciAtLWRpc2FibGUtc2ltLXByb2ZpbGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3Byb2ZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9wcm9maWxlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7CisgIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OworICBbLTAtOV0qKQorCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fcHJvZmlsZT0iIgorCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbworCSAgaWYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgPSB4OyB0aGVuCisJICAgIHNpbV9wcm9maWxlPSItRFdJVEhfUFJPRklMRT0nKFBST0ZJTEVfJHgiCisJICBlbHNlCisJICAgIHNpbV9wcm9maWxlPSIke3NpbV9wcm9maWxlfXxQUk9GSUxFXyR4IgorCSAgZmkKKwlkb25lCisJc2ltX3Byb2ZpbGU9IiRzaW1fcHJvZmlsZSknIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9wcm9maWxlIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gcHJvZmlsZSA9ICRzaW1fcHJvZmlsZSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3Byb2ZpbGU9IiIKK2ZpCisKKworCitlY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMzNTA6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMzU1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBzaWduYWwKKyN1bmRlZiBzaWduYWwKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7CisjZWxzZQordm9pZCAoKnNpZ25hbCAoKSkgKCk7CisjZW5kaWYKKworaW50IG1haW4oKSB7CitpbnQgaTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzcyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpZ25hbD1pbnQKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCitFT0YKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzM5MjogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkQ1lHV0lOMzIiID0geWVzOyB0aGVuCithbV9jdl9leGVleHQ9LmV4ZQorZWxzZQorY2F0ID4gYW1fY190ZXN0LmMgPDwgJ0VPRicKK2ludCBtYWluKCkgeworLyogTm90aGluZyBuZWVkZWQgaGVyZSAqLworfQorRU9GCiske0NDLWNjfSAtbyBhbV9jX3Rlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgYW1fY190ZXN0LmMgJExJQlMgMT4mNQorYW1fY3ZfZXhlZXh0PWBscyBhbV9jX3Rlc3QuKiB8IGdyZXAgLXYgYW1fY190ZXN0LmMgfCBzZWQgLWUgcy9hbV9jX3Rlc3QvL2AKK3JtIC1mIGFtX2NfdGVzdCoKK2ZpCisKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iID0geCAmJiBhbV9jdl9leGVleHQ9bm8KK2ZpCitFWEVFWFQ9IiIKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthbV9jdl9leGVleHR9CitlY2hvICIkYWNfdCIiJHthbV9jdl9leGVleHR9IiAxPiY2CisKKworc2ltX2xpbmtfZmlsZXM9CitzaW1fbGlua19saW5rcz0KKworc2ltX2xpbmtfbGlua3M9dGNvbmZpZy5oCitpZiB0ZXN0IC1mICR7c3JjZGlyfS90Y29uZmlnLmluCit0aGVuCisgIHNpbV9saW5rX2ZpbGVzPXRjb25maWcuaW4KK2Vsc2UKKyAgc2ltX2xpbmtfZmlsZXM9Li4vY29tbW9uL3Rjb25maWcuaW4KK2ZpCisKKyMgdGFyZy12YWxzLmRlZiBwb2ludHMgdG8gdGhlIGxpYmMgbWFjcm8gZGVzY3JpcHRpb24gZmlsZS4KK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyotKi0qKSBUQVJHX1ZBTFNfREVGPS4uL2NvbW1vbi9ubHR2YWxzLmRlZiA7OworZXNhYworc2ltX2xpbmtfZmlsZXM9IiR7c2ltX2xpbmtfZmlsZXN9ICR7VEFSR19WQUxTX0RFRn0iCitzaW1fbGlua19saW5rcz0iJHtzaW1fbGlua19saW5rc30gdGFyZy12YWxzLmRlZiIKKworCisKKworZGVmYXVsdF9zaW1faW5saW5lPSIiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWlubGluZSBvciAtLWRpc2FibGUtc2ltLWlubGluZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1faW5saW5lK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1faW5saW5lIgorICBzaW1faW5saW5lPSIiCitjYXNlICIkZW5hYmxldmFsIiBpbgorICBubykJCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCI7OworICAwKQkJc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIjs7CisgIHllcyB8IDIpCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9QUxMX0NfSU5MSU5FIjs7CisgIDEpCQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPUlOTElORV9MT0NBTFMiOzsKKyAgKikgZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCisgICAgICAgbmV3X2ZsYWc9IiIKKyAgICAgICBjYXNlICIkeCIgaW4KKwkgKl9JTkxJTkU9KikJbmV3X2ZsYWc9Ii1EJHgiOzsKKwkgKj0qKQkJbmV3X2ZsYWc9YGVjaG8gIiR4IiB8IHNlZCAtZSAicy89L19JTkxJTkU9LyIgLWUgInMvXi8tRC8iYDs7CisJICpfSU5MSU5FKQluZXdfZmxhZz0iLUQkeD1BTExfQ19JTkxJTkUiOzsKKwkgKikJCW5ld19mbGFnPSItRCR4IiJfSU5MSU5FPUFMTF9DX0lOTElORSI7OworICAgICAgIGVzYWMKKyAgICAgICBpZiB0ZXN0IHgiJHNpbV9pbmxpbmUiID0geCIiOyB0aGVuCisJIHNpbV9pbmxpbmU9IiRuZXdfZmxhZyIKKyAgICAgICBlbHNlCisJIHNpbV9pbmxpbmU9IiRzaW1faW5saW5lICRuZXdfZmxhZyIKKyAgICAgICBmaQorICAgICBkb25lOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1faW5saW5lIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBpbmxpbmUgZmxhZ3MgPSAkc2ltX2lubGluZSIgNj4mMQorZmkKK2Vsc2UKKyAgCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICBpZiB0ZXN0IHgiJEdDQyIgIT0gIngiIC1hIHgiJHtkZWZhdWx0X3NpbV9pbmxpbmV9IiAhPSAieCIgOyB0aGVuCisgICAgc2ltX2lubGluZT0iJHtkZWZhdWx0X3NpbV9pbmxpbmV9IgorICAgIGlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KKyAgICAgIGVjaG8gIlNldHRpbmcgaW5saW5lIGZsYWdzID0gJHNpbV9pbmxpbmUiIDY+JjEKKyAgICBmaQorICBlbHNlCisgICAgc2ltX2lubGluZT0iIgorICBmaQorZWxzZQorICBzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCitmaQorZmkKKword2lyZV9hbGlnbm1lbnQ9Ik5PTlNUUklDVF9BTElHTk1FTlQiCitkZWZhdWx0X2FsaWdubWVudD0iIgorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWFsaWdubWVudCBvciAtLWRpc2FibGUtc2ltLWFsaWdubWVudCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fYWxpZ25tZW50K3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fYWxpZ25tZW50IgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHN0cmljdCB8IFNUUklDVCkgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1TVFJJQ1RfQUxJR05NRU5UIjs7CisgIG5vbnN0cmljdCB8IE5PTlNUUklDVCkgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1OT05TVFJJQ1RfQUxJR05NRU5UIjs7CisgIGZvcmNlZCB8IEZPUkNFRCkgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1GT1JDRURfQUxJR05NRU5UIjs7CisgIHllcykgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgorCSBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgorICAgICAgIGVsc2UKKyAgICAgICAgIGlmIHRlc3QgeCIkZGVmYXVsdF9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKyAgICAgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKKyAgICAgICAgIGVsc2UKKwkgICBlY2hvICJObyBoYXJkLXdpcmVkIGFsaWdubWVudCBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKKwkgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPTAiCisgICAgICAgICBmaQorICAgICAgIGZpOzsKKyAgbm8pICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCisJIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKKyAgICAgICBlbHNlCisgICAgICAgICBpZiB0ZXN0IHgiJHdpcmVfYWxpZ25tZW50IiAhPSB4OyB0aGVuCisJICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgorICAgICAgICAgZWxzZQorICAgICAgICAgICBlY2hvICJObyBkZWZhdWx0IGFsaWdubWVudCBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKKyAgICAgICAgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPTAiCisgICAgICAgICBmaQorICAgICAgIGZpOzsKKyAgKikgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9hbGlnbm1lbnQ9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9hbGlnbm1lbnQiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGFsaWdubWVudCBmbGFncyA9ICRzaW1fYWxpZ25tZW50IiA2PiYxCitmaQorZWxzZQorICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCisgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke2RlZmF1bHRfYWxpZ25tZW50fSIKK2Vsc2UKKyAgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgorICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9JHt3aXJlX2FsaWdubWVudH0iCisgIGVsc2UKKyAgICBzaW1fYWxpZ25tZW50PQorICBmaQorZmkKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ob3N0ZW5kaWFuIG9yIC0tZGlzYWJsZS1zaW0taG9zdGVuZGlhbiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1faG9zdGVuZGlhbitzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2hvc3RlbmRpYW4iCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgbm8pCSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj0wIjs7CisgIGIqfEIqKSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1CSUdfRU5ESUFOIjs7CisgIGwqfEwqKSBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIjs7CisgICopCSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1ob3N0ZW5kaWFuIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1faG9zdGVuZGlhbj0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2hvc3RlbmRpYW4iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGhvc3RlbmRpYW4gZmxhZ3MgPSAkc2ltX2hvc3RlbmRpYW4iIDY+JjEKK2ZpCitlbHNlCisgIAoraWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzU0NTogY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19iaWdlbmRpYW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCisjIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzU1MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CitpbnQgbWFpbigpIHsKKworI2lmICFCWVRFX09SREVSIHx8ICFCSUdfRU5ESUFOIHx8ICFMSVRUTEVfRU5ESUFOCisgYm9ndXMgZW5kaWFuIG1hY3JvcworI2VuZGlmCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU2MzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgICMgSXQgZG9lczsgbm93IHNlZSB3aGV0aGVyIGl0IGRlZmluZWQgdG8gQklHX0VORElBTiBvciBub3QuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNTY3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KK2ludCBtYWluKCkgeworCisjaWYgQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOCisgbm90IGJpZyBlbmRpYW4KKyNlbmRpZgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1Nzg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19iaWdlbmRpYW49bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitmaQorcm0gLWYgY29uZnRlc3QqCitpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nIiAxPiYyOyBleGl0IDE7IH0KK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzU5OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCittYWluICgpIHsKKyAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLworICB1bmlvbgorICB7CisgICAgbG9uZyBsOworICAgIGNoYXIgY1tzaXplb2YgKGxvbmcpXTsKKyAgfSB1OworICB1LmwgPSAxOworICBleGl0ICh1LmNbc2l6ZW9mIChsb25nKSAtIDFdID09IDEpOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2MTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfY19iaWdlbmRpYW49bm8KK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19iaWdlbmRpYW4iIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBXT1JEU19CSUdFTkRJQU4gMQorRU9GCisKK2ZpCisKKyAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB5ZXM7IHRoZW4KKyAgICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1CSUdfRU5ESUFOIgorICBlbHNlCisgICAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiIKKyAgZmkKK2Vsc2UKKyAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9MCIKK2ZpCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1idWlsZC13YXJuaW5ncyBvciAtLWRpc2FibGUtYnVpbGQtd2FybmluZ3Mgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfYnVpbGRfd2FybmluZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX2J1aWxkX3dhcm5pbmdzIgorICBidWlsZF93YXJuaW5ncz0iLVdhbGwgLVdwb2ludGVyLWFyaXRoIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyIKK2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQk7OworICBubykJYnVpbGRfd2FybmluZ3M9Ii13Ijs7CisgICwqKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAorCWJ1aWxkX3dhcm5pbmdzPSIke2J1aWxkX3dhcm5pbmdzfSAke3R9Ijs7CisgICosKSAgIHQ9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYAorCWJ1aWxkX3dhcm5pbmdzPSIke3R9ICR7YnVpbGRfd2FybmluZ3N9Ijs7CisgICopCWJ1aWxkX3dhcm5pbmdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJGJ1aWxkX3dhcm5pbmdzIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyB3YXJuaW5nIGZsYWdzID0gJGJ1aWxkX3dhcm5pbmdzIiA2PiYxCitmaQorZWxzZQorICBidWlsZF93YXJuaW5ncz0iIgorZmkKKworCisjIERFUFJFQ0FURUQKKyMKKyMgSW5zdGVhZCBvZiBkZWZpbmluZyBhIGBzdWJ0YXJnZXQnIG1hY3JvLCBjb2RlIHNob3VsZCBiZSBjaGVja2luZworIyB0aGUgdmFsdWUgb2Yge1NUQVRFLENQVX1fQVJDSElURUNUVVJFIHRvIGlkZW50aWZ5IHRoZSBhcmNoaXRlY3R1cmUKKyMgaW4gcXVlc3Rpb24uCisjCitjYXNlICIke3RhcmdldH0iIGluCisgIG1pcHMqdHgzOSopICAgICAgICAgICBTSU1fU1VCVEFSR0VUPSItRFNVQlRBUkdFVF9SMzkwMD0xIjs7CisgICopICAgICAgICAgICAgICAgICAgICBTSU1fU1VCVEFSR0VUPSIiOzsKK2VzYWMKKworCisKKworIworIyBTZWxlY3QgdGhlIGJ5dGUgb3JkZXIgb2YgdGhlIHRhcmdldAorIworbWlwc19lbmRpYW49CitkZWZhdWx0X2VuZGlhbj0KK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyAgbWlwczY0ZWwqLSotKikJbWlwc19lbmRpYW49TElUVExFX0VORElBTiA7OworICBtaXBzNjQqLSotKikgICAgICAgICAgZGVmYXVsdF9lbmRpYW49QklHX0VORElBTiA7OworICBtaXBzMTYqLSotKikgICAgICAgICAgZGVmYXVsdF9lbmRpYW49QklHX0VORElBTiA7OworICBtaXBzKi0qLSopICAgICAgICAgICAgZGVmYXVsdF9lbmRpYW49QklHX0VORElBTiA7OworICAqKSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9lbmRpYW49QklHX0VORElBTiA7OworZXNhYworCit3aXJlX2VuZGlhbj0iJG1pcHNfZW5kaWFuIgorZGVmYXVsdF9lbmRpYW49IiRkZWZhdWx0X2VuZGlhbiIKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZW5kaWFuIG9yIC0tZGlzYWJsZS1zaW0tZW5kaWFuIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9lbmRpYW4rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9lbmRpYW4iCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgYip8QiopIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj1CSUdfRU5ESUFOIjs7CisgIGwqfEwqKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiI7OworICB5ZXMpCSBpZiB0ZXN0IHgiJHdpcmVfZW5kaWFuIiAhPSB4OyB0aGVuCisJICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPSR7d2lyZV9lbmRpYW59IgorCSBlbHNlCisgICAgICAgICAgIGlmIHRlc3QgeCIkZGVmYXVsdF9lbmRpYW4iICE9IHg7IHRoZW4KKwkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0ke2RlZmF1bHRfZW5kaWFufSIKKwkgICBlbHNlCisJICAgICBlY2hvICJObyBoYXJkLXdpcmVkIGVuZGlhbiBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKKwkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0wIgorCSAgIGZpCisJIGZpOzsKKyAgbm8pCSBpZiB0ZXN0IHgiJGRlZmF1bHRfZW5kaWFuIiAhPSB4OyB0aGVuCisJICAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9JHtkZWZhdWx0X2VuZGlhbn0iCisJIGVsc2UKKwkgICBpZiB0ZXN0IHgiJHdpcmVfZW5kaWFuIiAhPSB4OyB0aGVuCisJICAgICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0ke3dpcmVfZW5kaWFufSIKKwkgICBlbHNlCisJICAgICBlY2hvICJObyBkZWZhdWx0IGVuZGlhbiBmb3IgdGFyZ2V0ICR0YXJnZXQiIDE+JjYKKwkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPTAiCisJICAgZmkKKwkgZmk7OworICAqKQkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0tZW5kaWFuIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fZW5kaWFuPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZW5kaWFuIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBlbmRpYW4gZmxhZ3MgPSAkc2ltX2VuZGlhbiIgNj4mMQorZmkKK2Vsc2UKKyAgaWYgdGVzdCB4IiRkZWZhdWx0X2VuZGlhbiIgIT0geDsgdGhlbgorICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0ke2RlZmF1bHRfZW5kaWFufSIKK2Vsc2UKKyAgaWYgdGVzdCB4IiR3aXJlX2VuZGlhbiIgIT0geDsgdGhlbgorICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0ke3dpcmVfZW5kaWFufSIKKyAgZWxzZQorICAgIHNpbV9lbmRpYW49CisgIGZpCitmaQorZmkKKworCisKKworIworIyBTZWxlY3QgdGhlIGJpdHNpemUgb2YgdGhlIHRhcmdldAorIworbWlwc19hZGRyX2JpdHNpemU9CitjYXNlICIke3RhcmdldH0iIGluCisgIG1pcHM2NCotKi0qKSAgICAgICAgICBtaXBzX2JpdHNpemU9NjQgOyBtaXBzX21zYj02MyA7OworICBtaXBzMTYqLSotKikgICAgICAgICAgbWlwc19iaXRzaXplPTY0IDsgbWlwc19tc2I9NjMgOzsKKyAgbWlwcyotKi0qKSAgICAgICAgICAgIG1pcHNfYml0c2l6ZT0zMiA7IG1pcHNfbXNiPTMxIDs7CisgICopICAgICAgICAgICAgICAgICAgICBtaXBzX2JpdHNpemU9NjQgOyBtaXBzX21zYj02MyA7OworZXNhYword2lyZV93b3JkX2JpdHNpemU9IiRtaXBzX2JpdHNpemUiCit3aXJlX3dvcmRfbXNiPSIkbWlwc19tc2IiCit3aXJlX2FkZHJlc3NfYml0c2l6ZT0iJG1pcHNfYWRkcl9iaXRzaXplIgord2lyZV9jZWxsX2JpdHNpemU9IiIKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYml0c2l6ZSBvciAtLWRpc2FibGUtc2ltLWJpdHNpemUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2JpdHNpemUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9iaXRzaXplIgorICBzaW1fYml0c2l6ZT0KK2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgNjQsNjMgfCA2NCw2MywqICkgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTY0IC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9NjMiOzsKKyAgMzIsMzEgfCAzMiwzMSwqICkgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTMyIC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MzEiOzsKKyAgNjQsMCB8IDY0LDAsKiApIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT0zMiAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTAiOzsKKyAgMzIsMCB8IDY0LDAsKiApIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT0zMiAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTAiOzsKKyAgMzIpIGlmIHRlc3QgeCIkd2lyZV93b3JkX21zYiIgIT0geCAtYSB4IiR3aXJlX3dvcmRfbXNiIiAhPSB4MDsgdGhlbgorICAgICAgICBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9MzIgLURXSVRIX1RBUkdFVF9XT1JEX01TQj0zMSIKKyAgICAgIGVsc2UKKyAgICAgICAgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTMyIC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MCIKKyAgICAgIGZpIDs7CisgIDY0KSBpZiB0ZXN0IHgiJHdpcmVfd29yZF9tc2IiICE9IHggLWEgeCIkd2lyZV93b3JkX21zYiIgIT0geDA7IHRoZW4KKyAgICAgICAgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTY0IC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9NjMiCisgICAgICBlbHNlCisgICAgICAgIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT02NCAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTAiCisgICAgICBmaSA7OworICAqKSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLWJpdHNpemUgd2FzIGdpdmVuICRlbmFibGV2YWwuICBFeHBlY3RlZCAzMiBvciA2NCIiIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworIyBhZGRyZXNzIGJpdHNpemUKK3RtcD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy9eWzAtOV0qLCpbMC05XSosKi8vImAKK2Nhc2UgeCIke3RtcH0iIGluCisgIHggKSA7OworICB4MzIgfCB4MzIsKiApIHNpbV9iaXRzaXplPSIke3NpbV9iaXRzaXplfSAtRFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRT0zMiIgOzsKKyAgeDY0IHwgeDY0LCogKSBzaW1fYml0c2l6ZT0iJHtzaW1fYml0c2l6ZX0gLURXSVRIX1RBUkdFVF9BRERSRVNTX0JJVFNJWkU9NjQiIDs7CisgICogKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYml0c2l6ZSB3YXMgZ2l2ZW4gYWRkcmVzcyBzaXplICRlbmFibGV2YWwuICBFeHBlY3RlZCAzMiBvciA2NCIiIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworIyBjZWxsIGJpdHNpemUKK3RtcD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy9eWzAtOV0qLCpbMC05Kl0qLCpbMC05XSosKi8vImAKK2Nhc2UgeCIke3RtcH0iIGluCisgIHggKSA7OworICB4MzIgfCB4MzIsKiApIHNpbV9iaXRzaXplPSIke3NpbV9iaXRzaXplfSAtRFdJVEhfVEFSR0VUX0NFTExfQklUU0laRT0zMiIgOzsKKyAgeDY0IHwgeDY0LCogKSBzaW1fYml0c2l6ZT0iJHtzaW1fYml0c2l6ZX0gLURXSVRIX1RBUkdFVF9DRUxMX0JJVFNJWkU9NjQiIDs7CisgICogKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYml0c2l6ZSB3YXMgZ2l2ZW4gY2VsbCBzaXplICRlbmFibGV2YWwuICBFeHBlY3RlZCAzMiBvciA2NCIiIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9iaXRzaXplIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBiaXRzaXplIGZsYWdzID0gJHNpbV9iaXRzaXplIiA2PiYxCitmaQorZWxzZQorICBzaW1fYml0c2l6ZT0iIgoraWYgdGVzdCB4IiR3aXJlX3dvcmRfYml0c2l6ZSIgIT0geDsgdGhlbgorICBzaW1fYml0c2l6ZT0iJHNpbV9iaXRzaXplIC1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPSR3aXJlX3dvcmRfYml0c2l6ZSIKK2ZpCitpZiB0ZXN0IHgiJHdpcmVfd29yZF9tc2IiICE9IHg7IHRoZW4KKyAgc2ltX2JpdHNpemU9IiRzaW1fYml0c2l6ZSAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPSR3aXJlX3dvcmRfbXNiIgorZmkKK2lmIHRlc3QgeCIkd2lyZV9hZGRyZXNzX2JpdHNpemUiICE9IHg7IHRoZW4KKyAgc2ltX2JpdHNpemU9IiRzaW1fYml0c2l6ZSAtRFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRT0kd2lyZV9hZGRyZXNzX2JpdHNpemUiCitmaQoraWYgdGVzdCB4IiR3aXJlX2NlbGxfYml0c2l6ZSIgIT0geDsgdGhlbgorICBzaW1fYml0c2l6ZT0iJHNpbV9iaXRzaXplIC1EV0lUSF9UQVJHRVRfQ0VMTF9CSVRTSVpFPSR3aXJlX2NlbGxfYml0c2l6ZSIKK2ZpCitmaQorCisKKworCisjCisjIFNlbGVjdCB0aGUgZmxvYXRpbmcgaGFyZHdhcmUgc3VwcG9ydCBvZiB0aGUgdGFyZ2V0CisjCittaXBzX2ZwdT1IQVJEV0FSRV9GTE9BVElOR19QT0lOVAorbWlwc19mcHVfYml0c2l6ZT0KK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyAgbWlwcyp0eDM5KikJCW1pcHNfZnB1PUhBUkRfRkxPQVRJTkdfUE9JTlQKKwkJCW1pcHNfZnB1X2JpdHNpemU9MzIKKwkJCTs7CisgIG1pcHM2NCotKi0qKSAgICAgICAgICBtaXBzX2ZwdT1IQVJEX0ZMT0FUSU5HX1BPSU5UIDs7CisgIG1pcHMxNiotKi0qKSAgICAgICAgICBtaXBzX2ZwdT1IQVJEX0ZMT0FUSU5HX1BPSU5UIDs7CisgIG1pcHMqLSotKikgICAgICAgICAgICBtaXBzX2ZwdT1IQVJEX0ZMT0FUSU5HX1BPSU5UIDsgbWlwc19mcHVfYml0c2l6ZT0zMiA7OworICAqKSAgICAgICAgICAgICAgICAgICAgbWlwc19mcHU9SEFSRF9GTE9BVElOR19QT0lOVCA7OworZXNhYworCitkZWZhdWx0X3NpbV9mbG9hdD0iJG1pcHNfZnB1IgorZGVmYXVsdF9zaW1fZmxvYXRfYml0c2l6ZT0iJG1pcHNfZnB1X2JpdHNpemUiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWZsb2F0IG9yIC0tZGlzYWJsZS1zaW0tZmxvYXQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2Zsb2F0K3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZmxvYXQiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzIHwgaGFyZCkJc2ltX2Zsb2F0PSItRFdJVEhfRkxPQVRJTkdfUE9JTlQ9SEFSRF9GTE9BVElOR19QT0lOVCI7OworICBubyB8IHNvZnQpCXNpbV9mbG9hdD0iLURXSVRIX0ZMT0FUSU5HX1BPSU5UPVNPRlRfRkxPQVRJTkdfUE9JTlQiOzsKKyAgMzIpICAgICAgICAgICBzaW1fZmxvYXQ9Ii1EV0lUSF9GTE9BVElOR19QT0lOVD1IQVJEX0ZMT0FUSU5HX1BPSU5UIC1EV0lUSF9UQVJHRVRfRkxPQVRJTkdfUE9JTlRfQklUU0laRT0zMiI7OworICA2NCkgICAgICAgICAgIHNpbV9mbG9hdD0iLURXSVRIX0ZMT0FUSU5HX1BPSU5UPUhBUkRfRkxPQVRJTkdfUE9JTlQgLURXSVRIX1RBUkdFVF9GTE9BVElOR19QT0lOVF9CSVRTSVpFPTY0Ijs7CisgICopCQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1mbG9hdCIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2Zsb2F0PSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZmxvYXQiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGZsb2F0IGZsYWdzID0gJHNpbV9mbG9hdCIgNj4mMQorZmkKK2Vsc2UKKyAgCitzaW1fZmxvYXQ9CitpZiB0ZXN0IHgiJHtkZWZhdWx0X3NpbV9mbG9hdH0iICE9IHgiIjsgdGhlbgorICBzaW1fZmxvYXQ9Ii1EV0lUSF9GTE9BVElOR19QT0lOVD0ke2RlZmF1bHRfc2ltX2Zsb2F0fSIKK2ZpCitpZiB0ZXN0IHgiJHtkZWZhdWx0X3NpbV9mbG9hdF9iaXRzaXplfSIgIT0geCIiOyB0aGVuCisgIHNpbV9mbG9hdD0iJHNpbV9mbG9hdCAtRFdJVEhfVEFSR0VUX0ZMT0FUSU5HX1BPSU5UX0JJVFNJWkU9JHtkZWZhdWx0X3NpbV9mbG9hdF9iaXRzaXplfSIKK2ZpCisKK2ZpCisKKworCisKKyMKKyMgU2VsZWN0IHRoZSBsZXZlbCBvZiBTTVAgc3VwcG9ydAorIworY2FzZSAiJHt0YXJnZXR9IiBpbgorICAqKSAgICAgICAgICAgICAgICAgICAgbWlwc19zbXA9MCA7OworZXNhYworCitkZWZhdWx0X3NpbV9zbXA9IiRtaXBzX3NtcCIKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tc21wIG9yIC0tZGlzYWJsZS1zaW0tc21wIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zbXArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9zbXAiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fc21wPSItRFdJVEhfU01QPTUiIDsgc2ltX2lnZW5fc21wPSItTiA1Ijs7CisgIG5vKQlzaW1fc21wPSItRFdJVEhfU01QPTAiIDsgc2ltX2lnZW5fc21wPSItTiAwIjs7CisgICopCXNpbV9zbXA9Ii1EV0lUSF9TTVA9JGVuYWJsZXZhbCIgOyBzaW1faWdlbl9zbXA9Ii1OICRlbmFibGV2YWwiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc21wIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzbXAgZmxhZ3MgPSAkc2ltX3NtcCIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3NtcD0iLURXSVRIX1NNUD0ke2RlZmF1bHRfc2ltX3NtcH0iIDsgc2ltX2lnZW5fc21wPSItTiAke2RlZmF1bHRfc2ltX3NtcH0iCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc21wIGZsYWdzID0gJHNpbV9zbXAiIDY+JjEKK2ZpCitmaQorCisKKworCisjCisjIFNlbGVjdCB0aGUgSUdFTiBhcmNoaXRlY3R1cmUKKyMKK3NpbV9nZW49SUdFTgorc2ltX2lnZW5fbWFjaGluZT0iLU0gbWlwc0lWIgorc2ltX20xNl9tYWNoaW5lPSItTSBtaXBzMTYiCitzaW1faWdlbl9maWx0ZXI9IjMyLDY0LGYiCitzaW1fbTE2X2ZpbHRlcj0iMTYiCitjYXNlICIke3RhcmdldH0iIGluCisgIG1pcHMqdHgzOSopCQlzaW1fZ2VuPUlHRU4KKwkJCXNpbV9pZ2VuX2ZpbHRlcj0iMzIsZiIKKwkJCXNpbV9pZ2VuX21hY2hpbmU9Ii1NIHIzOTAwIgorCQkJOzsKKyAgbWlwczY0dnI0MyotKi0qKQlzaW1fZ2VuPUlHRU4KKwkJCXNpbV9pZ2VuX21hY2hpbmU9Ii1NIG1pcHNJViIKKwkJCTs7CisgIG1pcHM2NHZyNSotKi0qKQlzaW1fZ2VuPUlHRU4KKwkJCXNpbV9pZ2VuX21hY2hpbmU9Ii1NIHZyNTAwMCIKKwkJCTs7CisgIG1pcHM2NHZyNDEqKQkJc2ltX2dlbj1NMTYKKwkJCXNpbV9pZ2VuX21hY2hpbmU9Ii1NIHZyNDEwMCIKKwkJCXNpbV9tMTZfbWFjaGluZT0iLU0gdnI0MTAwIgorCQkJc2ltX2lnZW5fZmlsdGVyPSIzMiw2NCxmIgorCQkJc2ltX20xNl9maWx0ZXI9IjE2IgorICAgICAgICAgICAgICAgICAgICAgICAgOzsKKyAgbWlwczY0Ki0qLSopCQlzaW1faWdlbl9maWx0ZXI9IjMyLDY0LGYiCisJCQlzaW1fZ2VuPUlHRU4KKwkJCTs7CisgIG1pcHMxNiotKi0qKQkJc2ltX2dlbj1NMTYKKwkJCXNpbV9pZ2VuX2ZpbHRlcj0iMzIsNjQsZiIKKwkJCXNpbV9tMTZfZmlsdGVyPSIxNiIKKwkJCTs7CisgIG1pcHMqbHNpKikJICAgICAgICBzaW1fZ2VuPU0xNgorCQkJc2ltX2lnZW5fbWFjaGluZT0iLU0gbWlwc0lJSSxtaXBzMTYiCisJCQlzaW1fbTE2X21hY2hpbmU9Ii1NIG1pcHMxNixtaXBzSUlJIgorCQkJc2ltX2lnZW5fZmlsdGVyPSIzMixmIgorCQkJc2ltX20xNl9maWx0ZXI9IjE2IgorICAgICAgICAgICAgICAgICAgICAgICAgOzsKKyAgbWlwcyotKi0qKQkJc2ltX2dlbj1JR0VOCisJCQlzaW1faWdlbl9maWx0ZXI9IjMyLGYiCisJCQk7OworZXNhYworc2ltX2lnZW5fZmxhZ3M9Ii1GICR7c2ltX2lnZW5fZmlsdGVyfSAke3NpbV9pZ2VuX21hY2hpbmV9ICR7c2ltX2lnZW5fc21wfSIKK3NpbV9tMTZfZmxhZ3M9IiAtRiAke3NpbV9tMTZfZmlsdGVyfSAgJHtzaW1fbTE2X21hY2hpbmV9ICAke3NpbV9pZ2VuX3NtcH0iCisKKworCisKKworIworIyBBZGQgc2ltdWxhdGVkIGhhcmR3YXJlIGRldmljZXMKKyMKK2h3X2VuYWJsZWQ9bm8KK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyAgbWlwcyp0eDM5KikKKwlod19lbmFibGVkPXllcworCWh3X2V4dHJhX2RldmljZXM9InR4MzkwNGNwdSB0eDM5MDRpcmMgdHgzOTA0dG1yIHR4MzkwNHNpbyIgCisJbWlwc19leHRyYV9vYmpzPSJkdi1zb2Nrc2VyLm8iCisJU0lNX1NVQlRBUkdFVD0iJFNJTV9TVUJUQVJHRVQgLURUQVJHRVRfVFgzOTA0PTEiCisJOzsKKyAgKikKKwltaXBzX2V4dHJhX29ianM9IiIgCisJOzsKK2VzYWMKKworaWYgdGVzdCB4IiRod19lbmFibGVkIiA9IHgieWVzIjsgdGhlbgorICBzaW1faHdfcD15ZXMKK2Vsc2UKKyAgc2ltX2h3X3A9bm8KK2ZpCitpZiB0ZXN0ICIkaHdfZGV2aWNlcyI7IHRoZW4KKyAgaGFyZHdhcmU9ImNvcmUgcGFsIGdsdWUiCitlbHNlCisgIGhhcmR3YXJlPSJjb3JlIHBhbCBnbHVlICRod19leHRyYV9kZXZpY2VzIgorZmkKK3NpbV9od19jZmxhZ3M9Ii1EV0lUSF9IVz0xIgorc2ltX2h3PSIkaGFyZHdhcmUiCitzaW1faHdfb2Jqcz0iXCQoU0lNX0NPTU1PTl9IV19PQkpTKSBgZWNobyAkc2ltX2h3IHwgc2VkIC1lICdzL1woW14gXVteIF0qXCkvZHYtXDEuby9nJ2AiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWhhcmR3YXJlIG9yIC0tZGlzYWJsZS1zaW0taGFyZHdhcmUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2hhcmR3YXJlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1faGFyZHdhcmUiCisgIAorY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9od19wPXllczs7CisgIG5vKQlzaW1faHdfcD1ubzs7CisgICwqKSAgIHNpbV9od19wPXllczsgaGFyZHdhcmU9IiR7aGFyZHdhcmV9IGBlY2hvICR7ZW5hYmxldmFsfSB8IHNlZCAtZSAncy8sLyAvJ2AiOzsKKyAgKiwpICAgc2ltX2h3X3A9eWVzOyBoYXJkd2FyZT0iYGVjaG8gJHtlbmFibGV2YWx9IHwgc2VkIC1lICdzLywvIC8nYCAke2hhcmR3YXJlfSI7OworICAqKQlzaW1faHdfcD15ZXM7IGhhcmR3YXJlPSJgZWNobyAke2VuYWJsZXZhbH0gfCBzZWQgLWUgJ3MvLC8gLydgIicnOzsKK2VzYWMKK2lmIHRlc3QgIiRzaW1faHdfcCIgIT0geWVzOyB0aGVuCisgIHNpbV9od19vYmpzPQorICBzaW1faHdfY2ZsYWdzPSItRFdJVEhfSFc9MCIKKyAgc2ltX2h3PQorZWxzZQorICBzaW1faHdfY2ZsYWdzPSItRFdJVEhfSFc9MSIKKyAgIyByZW1vdmUgZHVwbGljYXRlcworICBzaW1faHc9IiIKKyAgc2ltX2h3X29ianM9IlwkKFNJTV9DT01NT05fSFdfT0JKUykiCisgIGZvciBpIGluIHggJGhhcmR3YXJlIDsgZG8KKyAgICBjYXNlICIgJGYgIiBpbgorICAgICAgeCkgOzsKKyAgICAgICoiICRpICIqKSA7OworICAgICAgKikgc2ltX2h3PSIkc2ltX2h3ICRpIiA7IHNpbV9od19vYmpzPSIkc2ltX2h3X29ianMgZHYtJGkubyI7OworICAgIGVzYWMKKyAgZG9uZQorZmkKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCAiJHNpbV9od19wIiA9ICJ5ZXMiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgaGFyZHdhcmUgdG8gJHNpbV9od19jZmxhZ3MsICRzaW1faHcsICRzaW1faHdfb2JqcyIKK2ZpCitlbHNlCisgIAoraWYgdGVzdCAiJHNpbV9od19wIiAhPSB5ZXM7IHRoZW4KKyAgc2ltX2h3X29ianM9CisgIHNpbV9od19jZmxhZ3M9Ii1EV0lUSF9IVz0wIgorICBzaW1faHc9CitmaQoraWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGhhcmR3YXJlIHRvICRzaW1faHdfY2ZsYWdzLCAkc2ltX2h3LCAkc2ltX2h3X29ianMiCitmaQorZmkKKworCisKKworIyBDaG9vc2Ugc2ltdWxhdG9yIGVuZ2luZQorY2FzZSAiJHt0YXJnZXR9IiBpbgorICAqKSAgICBtaXBzX2lnZW5fZW5naW5lPSJlbmdpbmUubyIKKwk7OworZXNhYworCisKKworIyBJZiB3ZSBmaW5kIFgsIHNldCBzaGVsbCB2YXJzIHhfaW5jbHVkZXMgYW5kIHhfbGlicmFyaWVzIHRvIHRoZQorIyBwYXRocywgb3RoZXJ3aXNlIHNldCBub194PXllcy4KKyMgVXNlcyBhY18gdmFycyBhcyB0ZW1wcyB0byBhbGxvdyBjb21tYW5kIGxpbmUgdG8gb3ZlcnJpZGUgY2FjaGUgYW5kIGNoZWNrcy4KKyMgLS13aXRob3V0LXggb3ZlcnJpZGVzIGV2ZXJ5dGhpbmcgZWxzZSwgYnV0IGRvZXMgbm90IHRvdWNoIHRoZSBjYWNoZS4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBYIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MTI1OiBjaGVja2luZyBmb3IgWCIgPiY1CisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgteCBvciAtLXdpdGhvdXQteCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfeCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF94IgorICA6CitmaQorCisjICRoYXZlX3ggaXMgYHllcycsIGBubycsIGBkaXNhYmxlZCcsIG9yIGVtcHR5IHdoZW4gd2UgZG8gbm90IHlldCBrbm93LgoraWYgdGVzdCAieCR3aXRoX3giID0geG5vOyB0aGVuCisgICMgVGhlIHVzZXIgZXhwbGljaXRseSBkaXNhYmxlZCBYLgorICBoYXZlX3g9ZGlzYWJsZWQKK2Vsc2UKKyAgaWYgdGVzdCAieCR4X2luY2x1ZGVzIiAhPSB4Tk9ORSAmJiB0ZXN0ICJ4JHhfbGlicmFyaWVzIiAhPSB4Tk9ORTsgdGhlbgorICAgICMgQm90aCB2YXJpYWJsZXMgYXJlIGFscmVhZHkgc2V0LgorICAgIGhhdmVfeD15ZXMKKyAgZWxzZQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hhdmVfeCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICMgT25lIG9yIGJvdGggb2YgdGhlIHZhcnMgYXJlIG5vdCBzZXQsIGFuZCB0aGVyZSBpcyBubyBjYWNoZWQgdmFsdWUuCithY194X2luY2x1ZGVzPU5PIGFjX3hfbGlicmFyaWVzPU5PCitybSAtZnIgY29uZnRlc3RkaXIKK2lmIG1rZGlyIGNvbmZ0ZXN0ZGlyOyB0aGVuCisgIGNkIGNvbmZ0ZXN0ZGlyCisgICMgTWFrZSBzdXJlIHRvIG5vdCBwdXQgIm1ha2UiIGluIHRoZSBJbWFrZWZpbGUgcnVsZXMsIHNpbmNlIHdlIGdyZXAgaXQgb3V0LgorICBjYXQgPiBJbWFrZWZpbGUgPDwnRU9GJworYWNmaW5keDoKKwlAZWNobyAnYWNfaW1faW5jcm9vdD0iJHtJTkNST09UfSI7IGFjX2ltX3VzcmxpYmRpcj0iJHtVU1JMSUJESVJ9IjsgYWNfaW1fbGliZGlyPSIke0xJQkRJUn0iJworRU9GCisgIGlmICh4bWttZikgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCAmJiB0ZXN0IC1mIE1ha2VmaWxlOyB0aGVuCisgICAgIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCisgICAgZXZhbCBgJHtNQUtFLW1ha2V9IGFjZmluZHggMj4vZGV2L251bGwgfCBncmVwIC12IG1ha2VgCisgICAgIyBPcGVuIFdpbmRvd3MgeG1rbWYgcmVwb3J0ZWRseSBzZXRzIExJQkRJUiBpbnN0ZWFkIG9mIFVTUkxJQkRJUi4KKyAgICBmb3IgYWNfZXh0ZW5zaW9uIGluIGEgc28gc2w7IGRvCisgICAgICBpZiB0ZXN0ICEgLWYgJGFjX2ltX3VzcmxpYmRpci9saWJYMTEuJGFjX2V4dGVuc2lvbiAmJgorICAgICAgICB0ZXN0IC1mICRhY19pbV9saWJkaXIvbGliWDExLiRhY19leHRlbnNpb247IHRoZW4KKyAgICAgICAgYWNfaW1fdXNybGliZGlyPSRhY19pbV9saWJkaXI7IGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgICAjIFNjcmVlbiBvdXQgYm9ndXMgdmFsdWVzIGZyb20gdGhlIGltYWtlIGNvbmZpZ3VyYXRpb24uICBUaGV5IGFyZQorICAgICMgYm9ndXMgYm90aCBiZWNhdXNlIHRoZXkgYXJlIHRoZSBkZWZhdWx0IGFueXdheSwgYW5kIGJlY2F1c2UKKyAgICAjIHVzaW5nIHRoZW0gd291bGQgYnJlYWsgZ2NjIG9uIHN5c3RlbXMgd2hlcmUgaXQgbmVlZHMgZml4ZWQgaW5jbHVkZXMuCisgICAgY2FzZSAiJGFjX2ltX2luY3Jvb3QiIGluCisJL3Vzci9pbmNsdWRlKSA7OworCSopIHRlc3QgLWYgIiRhY19pbV9pbmNyb290L1gxMS9Yb3MuaCIgJiYgYWNfeF9pbmNsdWRlcz0iJGFjX2ltX2luY3Jvb3QiIDs7CisgICAgZXNhYworICAgIGNhc2UgIiRhY19pbV91c3JsaWJkaXIiIGluCisJL3Vzci9saWIgfCAvbGliKSA7OworCSopIHRlc3QgLWQgIiRhY19pbV91c3JsaWJkaXIiICYmIGFjX3hfbGlicmFyaWVzPSIkYWNfaW1fdXNybGliZGlyIiA7OworICAgIGVzYWMKKyAgZmkKKyAgY2QgLi4KKyAgcm0gLWZyIGNvbmZ0ZXN0ZGlyCitmaQorCitpZiB0ZXN0ICIkYWNfeF9pbmNsdWRlcyIgPSBOTzsgdGhlbgorICAjIEd1ZXNzIHdoZXJlIHRvIGZpbmQgaW5jbHVkZSBmaWxlcywgYnkgbG9va2luZyBmb3IgdGhpcyBvbmUgWDExIC5oIGZpbGUuCisgIHRlc3QgLXogIiR4X2RpcmVjdF90ZXN0X2luY2x1ZGUiICYmIHhfZGlyZWN0X3Rlc3RfaW5jbHVkZT1YMTEvSW50cmluc2ljLmgKKworICAjIEZpcnN0LCB0cnkgdXNpbmcgdGhhdCBmaWxlIHdpdGggbm8gc3BlY2lhbCBkaXJlY3Rvcnkgc3BlY2lmaWVkLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDE4NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JHhfZGlyZWN0X3Rlc3RfaW5jbHVkZT4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NDE5MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgIyBXZSBjYW4gY29tcGlsZSB1c2luZyBYIGhlYWRlcnMgd2l0aCBubyBzcGVjaWFsIGluY2x1ZGUgZGlyZWN0b3J5LgorYWNfeF9pbmNsdWRlcz0KK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgICMgTG9vayBmb3IgdGhlIGhlYWRlciBmaWxlIGluIGEgc3RhbmRhcmQgc2V0IG9mIGNvbW1vbiBkaXJlY3Rvcmllcy4KKyMgQ2hlY2sgWDExIGJlZm9yZSBYMTFSbiBiZWNhdXNlIGl0IGlzIG9mdGVuIGEgc3ltbGluayB0byB0aGUgY3VycmVudCByZWxlYXNlLgorICBmb3IgYWNfZGlyIGluICAgICAgICAgICAgICAgXAorICAgIC91c3IvWDExL2luY2x1ZGUgICAgICAgICAgXAorICAgIC91c3IvWDExUjYvaW5jbHVkZSAgICAgICAgXAorICAgIC91c3IvWDExUjUvaW5jbHVkZSAgICAgICAgXAorICAgIC91c3IvWDExUjQvaW5jbHVkZSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvaW5jbHVkZS9YMTEgICAgICAgICAgXAorICAgIC91c3IvaW5jbHVkZS9YMTFSNiAgICAgICAgXAorICAgIC91c3IvaW5jbHVkZS9YMTFSNSAgICAgICAgXAorICAgIC91c3IvaW5jbHVkZS9YMTFSNCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvbG9jYWwvWDExL2luY2x1ZGUgICAgXAorICAgIC91c3IvbG9jYWwvWDExUjYvaW5jbHVkZSAgXAorICAgIC91c3IvbG9jYWwvWDExUjUvaW5jbHVkZSAgXAorICAgIC91c3IvbG9jYWwvWDExUjQvaW5jbHVkZSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvbG9jYWwvaW5jbHVkZS9YMTEgICAgXAorICAgIC91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNiAgXAorICAgIC91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNSAgXAorICAgIC91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvWDM4Ni9pbmNsdWRlICAgICAgICAgXAorICAgIC91c3IveDM4Ni9pbmNsdWRlICAgICAgICAgXAorICAgIC91c3IvWEZyZWU4Ni9pbmNsdWRlL1gxMSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvaW5jbHVkZSAgICAgICAgICAgICAgXAorICAgIC91c3IvbG9jYWwvaW5jbHVkZSAgICAgICAgXAorICAgIC91c3IvdW5zdXBwb3J0ZWQvaW5jbHVkZSAgXAorICAgIC91c3IvYXRoZW5hL2luY2x1ZGUgICAgICAgXAorICAgIC91c3IvbG9jYWwveDExcjUvaW5jbHVkZSAgXAorICAgIC91c3IvbHBwL1hhbXBsZXMvaW5jbHVkZSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3Ivb3Blbndpbi9pbmNsdWRlICAgICAgXAorICAgIC91c3Ivb3Blbndpbi9zaGFyZS9pbmNsdWRlIFwKKyAgICA7IFwKKyAgZG8KKyAgICBpZiB0ZXN0IC1yICIkYWNfZGlyLyR4X2RpcmVjdF90ZXN0X2luY2x1ZGUiOyB0aGVuCisgICAgICBhY194X2luY2x1ZGVzPSRhY19kaXIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkgIyAkYWNfeF9pbmNsdWRlcyA9IE5PCisKK2lmIHRlc3QgIiRhY194X2xpYnJhcmllcyIgPSBOTzsgdGhlbgorICAjIENoZWNrIGZvciB0aGUgbGlicmFyaWVzLgorCisgIHRlc3QgLXogIiR4X2RpcmVjdF90ZXN0X2xpYnJhcnkiICYmIHhfZGlyZWN0X3Rlc3RfbGlicmFyeT1YdAorICB0ZXN0IC16ICIkeF9kaXJlY3RfdGVzdF9mdW5jdGlvbiIgJiYgeF9kaXJlY3RfdGVzdF9mdW5jdGlvbj1YdE1hbGxvYworCisgICMgU2VlIGlmIHdlIGZpbmQgdGhlbSB3aXRob3V0IGFueSBzcGVjaWFsIG9wdGlvbnMuCisgICMgRG9uJ3QgYWRkIHRvICRMSUJTIHBlcm1hbmVudGx5LgorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorICBMSUJTPSItbCR4X2RpcmVjdF90ZXN0X2xpYnJhcnkgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0MjYxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7Ciske3hfZGlyZWN0X3Rlc3RfZnVuY3Rpb259KCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MjY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorIyBXZSBjYW4gbGluayBYIHByb2dyYW1zIHdpdGggbm8gc3BlY2lhbCBsaWJyYXJ5IHBhdGguCithY194X2xpYnJhcmllcz0KK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgTElCUz0iJGFjX3NhdmVfTElCUyIKKyMgRmlyc3Qgc2VlIGlmIHJlcGxhY2luZyB0aGUgaW5jbHVkZSBieSBsaWIgd29ya3MuCisjIENoZWNrIFgxMSBiZWZvcmUgWDExUm4gYmVjYXVzZSBpdCBpcyBvZnRlbiBhIHN5bWxpbmsgdG8gdGhlIGN1cnJlbnQgcmVsZWFzZS4KK2ZvciBhY19kaXIgaW4gYGVjaG8gIiRhY194X2luY2x1ZGVzIiB8IHNlZCBzL2luY2x1ZGUvbGliL2AgXAorICAgIC91c3IvWDExL2xpYiAgICAgICAgICBcCisgICAgL3Vzci9YMTFSNi9saWIgICAgICAgIFwKKyAgICAvdXNyL1gxMVI1L2xpYiAgICAgICAgXAorICAgIC91c3IvWDExUjQvbGliICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvdXNyL2xpYi9YMTEgICAgICAgICAgXAorICAgIC91c3IvbGliL1gxMVI2ICAgICAgICBcCisgICAgL3Vzci9saWIvWDExUjUgICAgICAgIFwKKyAgICAvdXNyL2xpYi9YMTFSNCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgL3Vzci9sb2NhbC9YMTEvbGliICAgIFwKKyAgICAvdXNyL2xvY2FsL1gxMVI2L2xpYiAgXAorICAgIC91c3IvbG9jYWwvWDExUjUvbGliICBcCisgICAgL3Vzci9sb2NhbC9YMTFSNC9saWIgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvbG9jYWwvbGliL1gxMSAgICBcCisgICAgL3Vzci9sb2NhbC9saWIvWDExUjYgIFwKKyAgICAvdXNyL2xvY2FsL2xpYi9YMTFSNSAgXAorICAgIC91c3IvbG9jYWwvbGliL1gxMVI0ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvdXNyL1gzODYvbGliICAgICAgICAgXAorICAgIC91c3IveDM4Ni9saWIgICAgICAgICBcCisgICAgL3Vzci9YRnJlZTg2L2xpYi9YMTEgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvbGliICAgICAgICAgICAgICBcCisgICAgL3Vzci9sb2NhbC9saWIgICAgICAgIFwKKyAgICAvdXNyL3Vuc3VwcG9ydGVkL2xpYiAgXAorICAgIC91c3IvYXRoZW5hL2xpYiAgICAgICBcCisgICAgL3Vzci9sb2NhbC94MTFyNS9saWIgIFwKKyAgICAvdXNyL2xwcC9YYW1wbGVzL2xpYiAgXAorICAgIC9saWIvdXNyL2xpYi9YMTEJICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvdXNyL29wZW53aW4vbGliICAgICAgXAorICAgIC91c3Ivb3Blbndpbi9zaGFyZS9saWIgXAorICAgIDsgXAorZG8KKyAgZm9yIGFjX2V4dGVuc2lvbiBpbiBhIHNvIHNsOyBkbworICAgIGlmIHRlc3QgLXIgJGFjX2Rpci9saWIke3hfZGlyZWN0X3Rlc3RfbGlicmFyeX0uJGFjX2V4dGVuc2lvbjsgdGhlbgorICAgICAgYWNfeF9saWJyYXJpZXM9JGFjX2RpcgorICAgICAgYnJlYWsgMgorICAgIGZpCisgIGRvbmUKK2RvbmUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpICMgJGFjX3hfbGlicmFyaWVzID0gTk8KKworaWYgdGVzdCAiJGFjX3hfaW5jbHVkZXMiID0gTk8gfHwgdGVzdCAiJGFjX3hfbGlicmFyaWVzIiA9IE5POyB0aGVuCisgICMgRGlkbid0IGZpbmQgWCBhbnl3aGVyZS4gIENhY2hlIHRoZSBrbm93biBhYnNlbmNlIG9mIFguCisgIGFjX2N2X2hhdmVfeD0iaGF2ZV94PW5vIgorZWxzZQorICAjIFJlY29yZCB3aGVyZSB3ZSBmb3VuZCBYIGZvciB0aGUgY2FjaGUuCisgIGFjX2N2X2hhdmVfeD0iaGF2ZV94PXllcyBcCisJICAgICAgICBhY194X2luY2x1ZGVzPSRhY194X2luY2x1ZGVzIGFjX3hfbGlicmFyaWVzPSRhY194X2xpYnJhcmllcyIKK2ZpCitmaQorICBmaQorICBldmFsICIkYWNfY3ZfaGF2ZV94IgorZmkgIyAkd2l0aF94ICE9IG5vCisKK2lmIHRlc3QgIiRoYXZlX3giICE9IHllczsgdGhlbgorICBlY2hvICIkYWNfdCIiJGhhdmVfeCIgMT4mNgorICBub194PXllcworZWxzZQorICAjIElmIGVhY2ggb2YgdGhlIHZhbHVlcyB3YXMgb24gdGhlIGNvbW1hbmQgbGluZSwgaXQgb3ZlcnJpZGVzIGVhY2ggZ3Vlc3MuCisgIHRlc3QgIngkeF9pbmNsdWRlcyIgPSB4Tk9ORSAmJiB4X2luY2x1ZGVzPSRhY194X2luY2x1ZGVzCisgIHRlc3QgIngkeF9saWJyYXJpZXMiID0geE5PTkUgJiYgeF9saWJyYXJpZXM9JGFjX3hfbGlicmFyaWVzCisgICMgVXBkYXRlIHRoZSBjYWNoZSB2YWx1ZSB0byByZWZsZWN0IHRoZSBjb21tYW5kIGxpbmUgdmFsdWVzLgorICBhY19jdl9oYXZlX3g9ImhhdmVfeD15ZXMgXAorCQlhY194X2luY2x1ZGVzPSR4X2luY2x1ZGVzIGFjX3hfbGlicmFyaWVzPSR4X2xpYnJhcmllcyIKKyAgZWNobyAiJGFjX3QiImxpYnJhcmllcyAkeF9saWJyYXJpZXMsIGhlYWRlcnMgJHhfaW5jbHVkZXMiIDE+JjYKK2ZpCisKK21pcHNfZXh0cmFfbGlicz0iIgorCisKK2ZvciBhY19oZHIgaW4gc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHN0ZGxpYi5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTE1NTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDUxNjAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjUxNjU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZmFicyBpbiAtbG0iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjUxOTI6IGNoZWNraW5nIGZvciBmYWJzIGluIC1sbSIgPiY1CithY19saWJfdmFyPWBlY2hvIG0nXydmYWJzIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbG0gICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTIwMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGZhYnMoKTsKKworaW50IG1haW4oKSB7CitmYWJzKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MjExOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIG0gfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKKyAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfbGliIDEKK0VPRgorCisgIExJQlM9Ii1sbSAkTElCUyIKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2ZvciBhY19mdW5jIGluIGFpbnQgYW5pbnQgc3FydAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTI0MTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNTI0NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MjY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisKKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCithY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAc2ltX2Vudmlyb25tZW50QCUkc2ltX2Vudmlyb25tZW50JWcKK3MlQHNpbV9hbGlnbm1lbnRAJSRzaW1fYWxpZ25tZW50JWcKK3MlQHNpbV9hc3NlcnRAJSRzaW1fYXNzZXJ0JWcKK3MlQHNpbV9iaXRzaXplQCUkc2ltX2JpdHNpemUlZworcyVAc2ltX2VuZGlhbkAlJHNpbV9lbmRpYW4lZworcyVAc2ltX2hvc3RlbmRpYW5AJSRzaW1faG9zdGVuZGlhbiVnCitzJUBzaW1fZmxvYXRAJSRzaW1fZmxvYXQlZworcyVAc2ltX3NjYWNoZUAlJHNpbV9zY2FjaGUlZworcyVAc2ltX2RlZmF1bHRfbW9kZWxAJSRzaW1fZGVmYXVsdF9tb2RlbCVnCitzJUBzaW1faHdfY2ZsYWdzQCUkc2ltX2h3X2NmbGFncyVnCitzJUBzaW1faHdfb2Jqc0AlJHNpbV9od19vYmpzJWcKK3MlQHNpbV9od0AlJHNpbV9odyVnCitzJUBzaW1faW5saW5lQCUkc2ltX2lubGluZSVnCitzJUBzaW1fcGFja2FnZXNAJSRzaW1fcGFja2FnZXMlZworcyVAc2ltX3JlZ3Bhcm1AJSRzaW1fcmVncGFybSVnCitzJUBzaW1fcmVzZXJ2ZWRfYml0c0AlJHNpbV9yZXNlcnZlZF9iaXRzJWcKK3MlQHNpbV9zbXBAJSRzaW1fc21wJWcKK3MlQHNpbV9zdGRjYWxsQCUkc2ltX3N0ZGNhbGwlZworcyVAc2ltX3hvcl9lbmRpYW5AJSRzaW1feG9yX2VuZGlhbiVnCitzJUBidWlsZF93YXJuaW5nc0AlJGJ1aWxkX3dhcm5pbmdzJWcKK3MlQFNIRUxMQCUkU0hFTEwlZworcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBERUZTQCUkREVGUyVnCitzJUBMREZMQUdTQCUkTERGTEFHUyVnCitzJUBMSUJTQCUkTElCUyVnCitzJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKK3MlQHByZWZpeEAlJHByZWZpeCVnCitzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCitzJUBiaW5kaXJAJSRiaW5kaXIlZworcyVAc2JpbmRpckAlJHNiaW5kaXIlZworcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworcyVAZGF0YWRpckAlJGRhdGFkaXIlZworcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZworcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCitzJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCitzJUBsaWJkaXJAJSRsaWJkaXIlZworcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworcyVAaW5mb2RpckAlJGluZm9kaXIlZworcyVAbWFuZGlyQCUkbWFuZGlyJWcKK3MlQGhvc3RAJSRob3N0JWcKK3MlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKK3MlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCitzJUBob3N0X29zQCUkaG9zdF9vcyVnCitzJUB0YXJnZXRAJSR0YXJnZXQlZworcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKK3MlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKK3MlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKK3MlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCitzJUBidWlsZEAlJGJ1aWxkJWcKK3MlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZworcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKK3MlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCitzJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKK3MlQENDQCUkQ0MlZworcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKK3MlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCitzJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZworcyVASERFRklORVNAJSRIREVGSU5FUyVnCitzJUBBUkAlJEFSJWcKK3MlQFJBTkxJQkAlJFJBTkxJQiVnCitzJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKK3MlQENQUEAlJENQUCVnCitzJUBBTExPQ0FAJSRBTExPQ0ElZworcyVAVVNFX05MU0AlJFVTRV9OTFMlZworcyVATVNHRk1UQCUkTVNHRk1UJWcKK3MlQEdNU0dGTVRAJSRHTVNHRk1UJWcKK3MlQFhHRVRURVhUQCUkWEdFVFRFWFQlZworcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCitzJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKK3MlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCitzJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKK3MlQEdNT0ZJTEVTQCUkR01PRklMRVMlZworcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZworcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCitzJUBJTlRMTElCU0AlJElOVExMSUJTJWcKK3MlQElOVExPQkpTQCUkSU5UTE9CSlMlZworcyVAUE9GSUxFU0AlJFBPRklMRVMlZworcyVAUE9TVUJAJSRQT1NVQiVnCitzJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCitzJUBHVF9OT0AlJEdUX05PJWcKK3MlQEdUX1lFU0AlJEdUX1lFUyVnCitzJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCitzJUBsQCUkbCVnCitzJUBNQUlOVEAlJE1BSU5UJWcKK3MlQHNpbV9ic3dhcEAlJHNpbV9ic3dhcCVnCitzJUBzaW1fY2ZsYWdzQCUkc2ltX2NmbGFncyVnCitzJUBzaW1fZGVidWdAJSRzaW1fZGVidWclZworcyVAc2ltX3N0ZGlvQCUkc2ltX3N0ZGlvJWcKK3MlQHNpbV90cmFjZUAlJHNpbV90cmFjZSVnCitzJUBzaW1fcHJvZmlsZUAlJHNpbV9wcm9maWxlJWcKK3MlQEVYRUVYVEAlJEVYRUVYVCVnCitzJUBTSU1fU1VCVEFSR0VUQCUkU0lNX1NVQlRBUkdFVCVnCitzJUBzaW1faWdlbl9mbGFnc0AlJHNpbV9pZ2VuX2ZsYWdzJWcKK3MlQHNpbV9tMTZfZmxhZ3NAJSRzaW1fbTE2X2ZsYWdzJWcKK3MlQHNpbV9nZW5AJSRzaW1fZ2VuJWcKK3MlQG1pcHNfZXh0cmFfb2Jqc0AlJG1pcHNfZXh0cmFfb2JqcyVnCitzJUBtaXBzX2lnZW5fZW5naW5lQCUkbWlwc19pZ2VuX2VuZ2luZSVnCitzJUBtaXBzX2V4dHJhX2xpYnNAJSRtaXBzX2V4dHJhX2xpYnMlZworCitDRU9GCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCithY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KK2FjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfbW9yZV9saW5lcz06CithY19zZWRfY21kcz0iIgord2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZmkKKyAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGVsc2UKKyAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGZpCisgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCisgICAgYWNfYmVnPSRhY19lbmQKKyAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgIGFjX3NlZF9jbWRzPWNhdAorZmkKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4ifQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KKworICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgIC4pICBzcmNkaXI9LgorICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgorICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7CisgIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgorICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgZXNhYworCisgIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgorICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKKyAgcm0gLWYgIiRhY19maWxlIgorICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorIyAkY29uZmlndXJlX2lucHV0IiA7OworICAqKSBhY19jb21zdWI9IDs7CisgIGVzYWMKKworICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBzZWQgLWUgIiRhY19jb21zdWIKK3MlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCitzJUBzcmNkaXJAJSRzcmNkaXIlZworcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworcyVASU5TVEFMTEAlJElOU1RBTEwlZworIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQorZmk7IGRvbmUKK3JtIC1mIGNvbmZ0ZXN0LnMqCisKKyMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCisjIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCisjCisjIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCithY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKK2FjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJworYWNfZEM9J1wzJworYWNfZEQ9JyVnJworIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCithY191Qz0nICcKK2FjX3VEPSdcNCVnJworIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKK2FjX2VDPScgJworYWNfZUQ9JyVnJworCitpZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZmkKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKKworICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAorICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KKworRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCisjIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCitybSAtZiBjb25mdGVzdC52YWxzCitjYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCitzL1tcXCYlXS9cXCYvZworcyVbXFwkYF0lXFwmJWcKK3MlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCitzJWFjX2QlYWNfdSVncAorcyVhY191JWFjX2UlZ3AKK0VPRgorc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscworcm0gLWYgY29uZnRlc3QuaGRyCisKKyMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKKyMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCitzJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQorRU9GCisKKyMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgorIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KKworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgOgorZG8KKyAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAorICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCisgIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKKyAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCisgIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUworICBlY2hvICdDRU9GCisgIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0CisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgorJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKKyAgcm0gLWYgY29uZnRlc3QudmFscworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKKyAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCisgIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCisgICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgorICAgIHJtIC1mIGNvbmZ0ZXN0LmgKKyAgZWxzZQorICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgZmkKKyAgICBybSAtZiAkYWNfZmlsZQorICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKKyAgZmkKK2ZpOyBkb25lCisKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKK2FjX3NvdXJjZXM9IiRzaW1fbGlua19maWxlcyIKK2FjX2Rlc3RzPSIkc2ltX2xpbmtfbGlua3MiCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorc3JjZGlyPSRhY19naXZlbl9zcmNkaXIKK3doaWxlIHRlc3QgLW4gIiRhY19zb3VyY2VzIjsgZG8KKyAgc2V0ICRhY19kZXN0czsgYWNfZGVzdD0kMTsgc2hpZnQ7IGFjX2Rlc3RzPSQqCisgIHNldCAkYWNfc291cmNlczsgYWNfc291cmNlPSQxOyBzaGlmdDsgYWNfc291cmNlcz0kKgorCisgIGVjaG8gImxpbmtpbmcgJHNyY2Rpci8kYWNfc291cmNlIHRvICRhY19kZXN0IgorCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY19zb3VyY2U7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRzcmNkaXIvJGFjX3NvdXJjZTogRmlsZSBub3QgZm91bmQiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorICBybSAtZiAkYWNfZGVzdAorCisgICMgTWFrZSByZWxhdGl2ZSBzeW1saW5rcy4KKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rlc3RfZGlyPWBlY2hvICRhY19kZXN0fHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAiJGFjX2Rlc3QiICYmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGRlc3QgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kZXN0X2RpciIgJiYgbWtkaXIgIiRhY19kZXN0X2RpciIKKyAgICBhY19kZXN0X2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGVzdF9kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rlc3RfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kZXN0X2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kZXN0X2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJHNyY2RpciIgaW4KKyAgWy8kXSopIGFjX3JlbF9zb3VyY2U9IiRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKKyAgKikgYWNfcmVsX3NvdXJjZT0iJGFjX2RvdHMkc3JjZGlyLyRhY19zb3VyY2UiIDs7CisgIGVzYWMKKworICAjIE1ha2UgYSBzeW1saW5rIGlmIHBvc3NpYmxlOyBvdGhlcndpc2UgdHJ5IGEgaGFyZCBsaW5rLgorICBpZiBsbiAtcyAkYWNfcmVsX3NvdXJjZSAkYWNfZGVzdCAyPi9kZXYvbnVsbCB8fAorICAgIGxuICRzcmNkaXIvJGFjX3NvdXJjZSAkYWNfZGVzdDsgdGhlbiA6CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgbGluayAkYWNfZGVzdCB0byAkc3JjZGlyLyRhY19zb3VyY2UiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZG9uZQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitjYXNlICJ4JENPTkZJR19GSUxFUyIgaW4KKyB4TWFrZWZpbGUqKQorICAgZWNobyAiTWVyZ2luZyBNYWtlZmlsZS5zaW0rTWFrZS1jb21tb24uc2ltIGludG8gTWFrZWZpbGUgLi4uIgorICAgcm0gLWYgTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcCBNYWtlZmlsZQorICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QUkVfLywvXiMjIEVuZCBDT01NT05fUFJFXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTEudG1wCisgICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BPU1RfLywvXiMjIEVuZCBDT01NT05fUE9TVF8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0yLnRtcAorICAgc2VkIC1lICcvXiMjIENPTU1PTl9QUkVfLyByIE1ha2VzaW0xLnRtcCcgXAorCS1lICcvXiMjIENPTU1PTl9QT1NUXy8gciBNYWtlc2ltMi50bXAnIFwKKwk8TWFrZWZpbGUuc2ltID5NYWtlZmlsZQorICAgcm0gLWYgTWFrZWZpbGUuc2ltIE1ha2UtY29tbW9uLnNpbSBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wCisgICA7OworIGVzYWMKKyBjYXNlICJ4JENPTkZJR19IRUFERVJTIiBpbiB4Y29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjCisKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCisKZGlmZiAtLWdpdCBhL3NpbS9taXBzL2NvbmZpZ3VyZS5pbiBiL3NpbS9taXBzL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTk1OWZlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL21pcHMvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsMTcwIEBACitkbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK3NpbmNsdWRlKC4uL2NvbW1vbi9hY2xvY2FsLm00KQorQUNfUFJFUkVRKDIuNSlkbmwKK0FDX0lOSVQoTWFrZWZpbGUuaW4pCisKK1NJTV9BQ19DT01NT04KKworZG5sIE9wdGlvbnMgYXZhaWxhYmxlIGluIHRoaXMgbW9kdWxlCitTSU1fQUNfT1BUSU9OX0lOTElORSgpCitTSU1fQUNfT1BUSU9OX0FMSUdOTUVOVChOT05TVFJJQ1RfQUxJR05NRU5UKQorU0lNX0FDX09QVElPTl9IT1NURU5ESUFOCitTSU1fQUNfT1BUSU9OX1dBUk5JTkdTCisKKyMgREVQUkVDQVRFRAorIworIyBJbnN0ZWFkIG9mIGRlZmluaW5nIGEgYHN1YnRhcmdldCcgbWFjcm8sIGNvZGUgc2hvdWxkIGJlIGNoZWNraW5nCisjIHRoZSB2YWx1ZSBvZiB7U1RBVEUsQ1BVfV9BUkNISVRFQ1RVUkUgdG8gaWRlbnRpZnkgdGhlIGFyY2hpdGVjdHVyZQorIyBpbiBxdWVzdGlvbi4KKyMKK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyAgbWlwcyp0eDM5KikgICAgICAgICAgIFNJTV9TVUJUQVJHRVQ9Ii1EU1VCVEFSR0VUX1IzOTAwPTEiOzsKKyAgKikgICAgICAgICAgICAgICAgICAgIFNJTV9TVUJUQVJHRVQ9IiI7OworZXNhYworQUNfU1VCU1QoU0lNX1NVQlRBUkdFVCkKKworCisKKyMKKyMgU2VsZWN0IHRoZSBieXRlIG9yZGVyIG9mIHRoZSB0YXJnZXQKKyMKK21pcHNfZW5kaWFuPQorZGVmYXVsdF9lbmRpYW49CitjYXNlICIke3RhcmdldH0iIGluCisgIG1pcHM2NGVsKi0qLSopCW1pcHNfZW5kaWFuPUxJVFRMRV9FTkRJQU4gOzsKKyAgbWlwczY0Ki0qLSopICAgICAgICAgIGRlZmF1bHRfZW5kaWFuPUJJR19FTkRJQU4gOzsKKyAgbWlwczE2Ki0qLSopICAgICAgICAgIGRlZmF1bHRfZW5kaWFuPUJJR19FTkRJQU4gOzsKKyAgbWlwcyotKi0qKSAgICAgICAgICAgIGRlZmF1bHRfZW5kaWFuPUJJR19FTkRJQU4gOzsKKyAgKikgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfZW5kaWFuPUJJR19FTkRJQU4gOzsKK2VzYWMKK1NJTV9BQ19PUFRJT05fRU5ESUFOKCRtaXBzX2VuZGlhbiwkZGVmYXVsdF9lbmRpYW4pCisKKworCisjCisjIFNlbGVjdCB0aGUgYml0c2l6ZSBvZiB0aGUgdGFyZ2V0CisjCittaXBzX2FkZHJfYml0c2l6ZT0KK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyAgbWlwczY0Ki0qLSopICAgICAgICAgIG1pcHNfYml0c2l6ZT02NCA7IG1pcHNfbXNiPTYzIDs7CisgIG1pcHMxNiotKi0qKSAgICAgICAgICBtaXBzX2JpdHNpemU9NjQgOyBtaXBzX21zYj02MyA7OworICBtaXBzKi0qLSopICAgICAgICAgICAgbWlwc19iaXRzaXplPTMyIDsgbWlwc19tc2I9MzEgOzsKKyAgKikgICAgICAgICAgICAgICAgICAgIG1pcHNfYml0c2l6ZT02NCA7IG1pcHNfbXNiPTYzIDs7Citlc2FjCitTSU1fQUNfT1BUSU9OX0JJVFNJWkUoJG1pcHNfYml0c2l6ZSwkbWlwc19tc2IsJG1pcHNfYWRkcl9iaXRzaXplKQorCisKKworIworIyBTZWxlY3QgdGhlIGZsb2F0aW5nIGhhcmR3YXJlIHN1cHBvcnQgb2YgdGhlIHRhcmdldAorIworbWlwc19mcHU9SEFSRFdBUkVfRkxPQVRJTkdfUE9JTlQKK21pcHNfZnB1X2JpdHNpemU9CitjYXNlICIke3RhcmdldH0iIGluCisgIG1pcHMqdHgzOSopCQltaXBzX2ZwdT1IQVJEX0ZMT0FUSU5HX1BPSU5UCisJCQltaXBzX2ZwdV9iaXRzaXplPTMyCisJCQk7OworICBtaXBzNjQqLSotKikgICAgICAgICAgbWlwc19mcHU9SEFSRF9GTE9BVElOR19QT0lOVCA7OworICBtaXBzMTYqLSotKikgICAgICAgICAgbWlwc19mcHU9SEFSRF9GTE9BVElOR19QT0lOVCA7OworICBtaXBzKi0qLSopICAgICAgICAgICAgbWlwc19mcHU9SEFSRF9GTE9BVElOR19QT0lOVCA7IG1pcHNfZnB1X2JpdHNpemU9MzIgOzsKKyAgKikgICAgICAgICAgICAgICAgICAgIG1pcHNfZnB1PUhBUkRfRkxPQVRJTkdfUE9JTlQgOzsKK2VzYWMKK1NJTV9BQ19PUFRJT05fRkxPQVQoJG1pcHNfZnB1LCRtaXBzX2ZwdV9iaXRzaXplKQorCisKKworIworIyBTZWxlY3QgdGhlIGxldmVsIG9mIFNNUCBzdXBwb3J0CisjCitjYXNlICIke3RhcmdldH0iIGluCisgICopICAgICAgICAgICAgICAgICAgICBtaXBzX3NtcD0wIDs7Citlc2FjCitTSU1fQUNfT1BUSU9OX1NNUCgkbWlwc19zbXApCisKKworCisjCisjIFNlbGVjdCB0aGUgSUdFTiBhcmNoaXRlY3R1cmUKKyMKK3NpbV9nZW49SUdFTgorc2ltX2lnZW5fbWFjaGluZT0iLU0gbWlwc0lWIgorc2ltX20xNl9tYWNoaW5lPSItTSBtaXBzMTYiCitzaW1faWdlbl9maWx0ZXI9IjMyLDY0LGYiCitzaW1fbTE2X2ZpbHRlcj0iMTYiCitjYXNlICIke3RhcmdldH0iIGluCisgIG1pcHMqdHgzOSopCQlzaW1fZ2VuPUlHRU4KKwkJCXNpbV9pZ2VuX2ZpbHRlcj0iMzIsZiIKKwkJCXNpbV9pZ2VuX21hY2hpbmU9Ii1NIHIzOTAwIgorCQkJOzsKKyAgbWlwczY0dnI0MyotKi0qKQlzaW1fZ2VuPUlHRU4KKwkJCXNpbV9pZ2VuX21hY2hpbmU9Ii1NIG1pcHNJViIKKwkJCTs7CisgIG1pcHM2NHZyNSotKi0qKQlzaW1fZ2VuPUlHRU4KKwkJCXNpbV9pZ2VuX21hY2hpbmU9Ii1NIHZyNTAwMCIKKwkJCTs7CisgIG1pcHM2NHZyNDEqKQkJc2ltX2dlbj1NMTYKKwkJCXNpbV9pZ2VuX21hY2hpbmU9Ii1NIHZyNDEwMCIKKwkJCXNpbV9tMTZfbWFjaGluZT0iLU0gdnI0MTAwIgorCQkJc2ltX2lnZW5fZmlsdGVyPSIzMiw2NCxmIgorCQkJc2ltX20xNl9maWx0ZXI9IjE2IgorICAgICAgICAgICAgICAgICAgICAgICAgOzsKKyAgbWlwczY0Ki0qLSopCQlzaW1faWdlbl9maWx0ZXI9IjMyLDY0LGYiCisJCQlzaW1fZ2VuPUlHRU4KKwkJCTs7CisgIG1pcHMxNiotKi0qKQkJc2ltX2dlbj1NMTYKKwkJCXNpbV9pZ2VuX2ZpbHRlcj0iMzIsNjQsZiIKKwkJCXNpbV9tMTZfZmlsdGVyPSIxNiIKKwkJCTs7CisgIG1pcHMqbHNpKikJICAgICAgICBzaW1fZ2VuPU0xNgorCQkJc2ltX2lnZW5fbWFjaGluZT0iLU0gbWlwc0lJSSxtaXBzMTYiCisJCQlzaW1fbTE2X21hY2hpbmU9Ii1NIG1pcHMxNixtaXBzSUlJIgorCQkJc2ltX2lnZW5fZmlsdGVyPSIzMixmIgorCQkJc2ltX20xNl9maWx0ZXI9IjE2IgorICAgICAgICAgICAgICAgICAgICAgICAgOzsKKyAgbWlwcyotKi0qKQkJc2ltX2dlbj1JR0VOCisJCQlzaW1faWdlbl9maWx0ZXI9IjMyLGYiCisJCQk7OworZXNhYworc2ltX2lnZW5fZmxhZ3M9Ii1GICR7c2ltX2lnZW5fZmlsdGVyfSAke3NpbV9pZ2VuX21hY2hpbmV9ICR7c2ltX2lnZW5fc21wfSIKK3NpbV9tMTZfZmxhZ3M9IiAtRiAke3NpbV9tMTZfZmlsdGVyfSAgJHtzaW1fbTE2X21hY2hpbmV9ICAke3NpbV9pZ2VuX3NtcH0iCitBQ19TVUJTVChzaW1faWdlbl9mbGFncykKK0FDX1NVQlNUKHNpbV9tMTZfZmxhZ3MpCitBQ19TVUJTVChzaW1fZ2VuKQorCisKKyMKKyMgQWRkIHNpbXVsYXRlZCBoYXJkd2FyZSBkZXZpY2VzCisjCitod19lbmFibGVkPW5vCitjYXNlICIke3RhcmdldH0iIGluCisgIG1pcHMqdHgzOSopCisJaHdfZW5hYmxlZD15ZXMKKwlod19leHRyYV9kZXZpY2VzPSJ0eDM5MDRjcHUgdHgzOTA0aXJjIHR4MzkwNHRtciB0eDM5MDRzaW8iIAorCW1pcHNfZXh0cmFfb2Jqcz0iZHYtc29ja3Nlci5vIgorCVNJTV9TVUJUQVJHRVQ9IiRTSU1fU1VCVEFSR0VUIC1EVEFSR0VUX1RYMzkwND0xIgorCTs7CisgICopCisJbWlwc19leHRyYV9vYmpzPSIiIAorCTs7Citlc2FjCitTSU1fQUNfT1BUSU9OX0hBUkRXQVJFKCRod19lbmFibGVkLCRod19kZXZpY2VzLCRod19leHRyYV9kZXZpY2VzKQorQUNfU1VCU1QobWlwc19leHRyYV9vYmpzKQorCisKKyMgQ2hvb3NlIHNpbXVsYXRvciBlbmdpbmUKK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyAgKikgICAgbWlwc19pZ2VuX2VuZ2luZT0iZW5naW5lLm8iCisJOzsKK2VzYWMKK0FDX1NVQlNUKG1pcHNfaWdlbl9lbmdpbmUpCisKKworQUNfUEFUSF9YCittaXBzX2V4dHJhX2xpYnM9IiIKK0FDX1NVQlNUKG1pcHNfZXh0cmFfbGlicykKKworQUNfQ0hFQ0tfSEVBREVSUyhzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggc3RkbGliLmgpCitBQ19DSEVDS19MSUIobSwgZmFicykKK0FDX0NIRUNLX0ZVTkNTKGFpbnQgYW5pbnQgc3FydCkKKworU0lNX0FDX09VVFBVVApkaWZmIC0tZ2l0IGEvc2ltL21pcHMvZHYtdHgzOTA0Y3B1LmMgYi9zaW0vbWlwcy9kdi10eDM5MDRjcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2I4NTIxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL21pcHMvZHYtdHgzOTA0Y3B1LmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICAgCisgICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICAgIAorICAgICovCisKKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAiaHctbWFpbi5oIgorCisvKiBERVZJQ0UKKworICAgCisgICB0eDM5MDRjcHUgLSB0eDM5MDQgY3B1IHZpcnR1YWwgZGV2aWNlCisKKyAgIAorICAgREVTQ1JJUFRJT04KKworICAgCisgICBJbXBsZW1lbnRzIHRoZSBleHRlcm5hbCB0eDM5MDQgZnVuY3Rpb25hbGl0eS4gIFRoaXMgaW5jbHVkZXMgdGhlCisgICBkZWxpdmVyeSBvZiBvZiBpbnRlcnJ1cHRzIGdlbmVyYXRlZCBmcm9tIG90aGVyIGRldmljZXMgYW5kIHRoZQorICAgaGFuZGxpbmcgb2YgZGV2aWNlIHNwZWNpZmljIHJlZ2lzdGVycy4KKworCisgICBQUk9QRVJUSUVTCisgICAKKyAgIG5vbmUKKworCisgICBQT1JUUworCisKKyAgIHJlc2V0IChpbnB1dCkKKworICAgQ3VycmVudGx5IGlnbm9yZWQuCisKKworICAgbm1pIChpbnB1dCkKKworICAgRGVsaXZlciBhIG5vbi1tYXNrYWJsZSBpbnRlcnJ1cHQgdG8gdGhlIHByb2Nlc3Nvci4KKworCisgICBsZXZlbCAoaW5wdXQpCisKKyAgIERlbGl2ZXIgYSBtYXNrYWJsZSBpbnRlcnJ1cHQgb2YgZ2l2ZW4gbGV2ZWwsIGNvcnJlc3BvbmRpbmcgdG8KKyAgIElQWzU6MF0sIHRvIHByb2Nlc3Nvci4KKworCisKKyAgIEJVR1MKKworCisgICBXaGVuIGRlbGl2ZXJpbmcgYW4gaW50ZXJydXB0LCB0aGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZXJlIGlzIG9ubHkKKyAgIG9uZSBwcm9jZXNzb3IgKG51bWJlciAwKS4KKworICAgVGhpcyBjb2RlIGRvZXMgbm90IGF0dGVtcHQgdG8gYmUgZWZmaWNpZW50IGF0IGhhbmRsaW5nIHBlbmRpbmcKKyAgIGludGVycnVwdHMuICBJdCBzaW1wbHkgc2NoZWR1bGVzIHRoZSBpbnRlcnJ1cHQgZGVsaXZlcnkgaGFuZGxlcgorICAgZXZlcnkgaW5zdHJ1Y3Rpb24gY3ljbGUgdW50aWwgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyBnbyBhd2F5LiAgQW4KKyAgIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIG1pZ2h0IG1vZGlmeSBpbnN0cnVjdGlvbnMgdGhhdCBjaGFuZ2UKKyAgIHRoZSBQU1cgYW5kIGhhdmUgdGhlbSBjaGVjayB0byBzZWUgaWYgdGhlIGNoYW5nZSBtYWtlcyBhbiBpbnRlcnJ1cHQKKyAgIGRlbGl2ZXJ5IHBvc3NpYmxlLgorCisgICAqLworCisKKworc3RydWN0IHR4MzkwNGNwdSB7CisgIC8qIFBlbmRpbmcgaW50ZXJydXB0cyBmb3IgZGVsaXZlcnkgYnkgZXZlbnQgaGFuZGxlciAqLworICBpbnQgcGVuZGluZ19yZXNldCwgcGVuZGluZ19ubWksIHBlbmRpbmdfbGV2ZWw7CisgIHN0cnVjdCBod19ldmVudCogZXZlbnQ7Cit9OworCisKKworLyogaW5wdXQgcG9ydCBJRCdzICovIAorCitlbnVtIHsKKyAgUkVTRVRfUE9SVCwKKyAgTk1JX1BPUlQsCisgIExFVkVMX1BPUlQsCit9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdfcG9ydF9kZXNjcmlwdG9yIHR4MzkwNGNwdV9wb3J0c1tdID0geworCisgIC8qIGludGVycnVwdCBpbnB1dHMgKi8KKyAgeyAicmVzZXQiLCBSRVNFVF9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAorICB7ICJubWkiLCBOTUlfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKyAgeyAibGV2ZWwiLCBMRVZFTF9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAorCisgIHsgTlVMTCwgfSwKK307CisKKworLyogRmluaXNoIG9mZiB0aGUgcGFydGlhbGx5IGNyZWF0ZWQgaHcgZGV2aWNlLiAgQXR0YWNoIG91ciBsb2NhbAorICAgY2FsbGJhY2tzLiAgV2lyZSB1cCBvdXIgcG9ydCBuYW1lcyBldGMgKi8KKworc3RhdGljIGh3X3BvcnRfZXZlbnRfbWV0aG9kIHR4MzkwNGNwdV9wb3J0X2V2ZW50OworCisKKworc3RhdGljIHZvaWQKK3R4MzkwNGNwdV9maW5pc2ggKHN0cnVjdCBodyAqbWUpCit7CisgIHN0cnVjdCB0eDM5MDRjcHUgKmNvbnRyb2xsZXI7CisKKyAgY29udHJvbGxlciA9IEhXX1pBTExPQyAobWUsIHN0cnVjdCB0eDM5MDRjcHUpOworICBzZXRfaHdfZGF0YSAobWUsIGNvbnRyb2xsZXIpOworICBzZXRfaHdfcG9ydHMgKG1lLCB0eDM5MDRjcHVfcG9ydHMpOworICBzZXRfaHdfcG9ydF9ldmVudCAobWUsIHR4MzkwNGNwdV9wb3J0X2V2ZW50KTsKKworICAvKiBJbml0aWFsaXplIHRoZSBwZW5kaW5nIGludGVycnVwdCBmbGFncyAqLworICBjb250cm9sbGVyLT5wZW5kaW5nX2xldmVsID0gMDsKKyAgY29udHJvbGxlci0+cGVuZGluZ19yZXNldCA9IDA7CisgIGNvbnRyb2xsZXItPnBlbmRpbmdfbm1pID0gMDsKKyAgY29udHJvbGxlci0+ZXZlbnQgPSBOVUxMOworfQorCisKKworLyogQW4gZXZlbnQgYXJyaXZlcyBvbiBhbiBpbnRlcnJ1cHQgcG9ydCAqLworCitzdGF0aWMgdm9pZAorZGVsaXZlcl90eDM5MDRjcHVfaW50ZXJydXB0IChzdHJ1Y3QgaHcgKm1lLAorCQkJICAgIHZvaWQgKmRhdGEpCit7CisgIHN0cnVjdCB0eDM5MDRjcHUgKmNvbnRyb2xsZXIgPSBod19kYXRhIChtZSk7CisgIFNJTV9ERVNDIHNkID0gaHdfc3lzdGVtIChtZSk7CisgIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIDApOyAvKiBOQjogZml4IENQVSAwLiAqLworICBhZGRyZXNzX3dvcmQgY2lhID0gQ0lBX0dFVCAoY3B1KTsKKworI2RlZmluZSBDUFUgY3B1CisjZGVmaW5lIFNEIGN1cnJlbnRfc3RhdGUKKworICBpZiAoY29udHJvbGxlci0+cGVuZGluZ19yZXNldCkKKyAgICB7CisgICAgICBjb250cm9sbGVyLT5wZW5kaW5nX3Jlc2V0ID0gMDsKKyAgICAgIEhXX1RSQUNFICgobWUsICJyZXNldCBwYz0weCUwOGx4IiwgKGxvbmcpIENJQV9HRVQgKGNwdSkpKTsKKyAgICAgIFNpZ25hbEV4Y2VwdGlvbk5NSVJlc2V0KCk7CisgICAgfQorICBlbHNlIGlmIChjb250cm9sbGVyLT5wZW5kaW5nX25taSkKKyAgICB7CisgICAgICBjb250cm9sbGVyLT5wZW5kaW5nX25taSA9IDA7CisgICAgICBIV19UUkFDRSAoKG1lLCAibm1pIHBjPTB4JTA4bHgiLCAobG9uZykgQ0lBX0dFVCAoY3B1KSkpOworICAgICAgU2lnbmFsRXhjZXB0aW9uTk1JUmVzZXQoKTsKKyAgICB9CisgIGVsc2UgaWYgKGNvbnRyb2xsZXItPnBlbmRpbmdfbGV2ZWwpCisgICAgeworICAgICAgSFdfVFJBQ0UgKChtZSwgImludGVycnVwdCBsZXZlbD0lZCBwYz0weCUwOGx4IHNyPTB4JTA4bHgiLAorCQkgY29udHJvbGxlci0+cGVuZGluZ19sZXZlbCwKKwkJIChsb25nKSBDSUFfR0VUIChjcHUpLCAobG9uZykgU1IpKTsKKworICAgICAgLyogQ2xlYXIgQ0FVU0UgcmVnaXN0ZXIuICBJdCBtYXkgc3RheSB0aGlzIHdheSBpZiB0aGUgaW50ZXJydXB0CisJIHdhcyBjbGVhcmVkIHdpdGggYSBuZWdhdGl2ZSBwZW5kaW5nX2xldmVsLiAqLworICAgICAgQ0FVU0UgJj0gfiAoY2F1c2VfSVBfbWFzayA8PCBjYXVzZV9JUF9zaGlmdCk7CisKKyAgICAgIGlmKGNvbnRyb2xsZXItPnBlbmRpbmdfbGV2ZWwgPiAwKSAvKiBpbnRlcnJ1cHQgc2V0ICovCisJeworCSAgLyogc2V0IGhhcmR3YXJlLWludGVycnVwdCBzdWJmaWVsZHMgb2YgQ0FVU0UgcmVnaXN0ZXIgKi8KKwkgIENBVVNFIHw9IChjb250cm9sbGVyLT5wZW5kaW5nX2xldmVsICYgY2F1c2VfSVBfbWFzaykgPDwgY2F1c2VfSVBfc2hpZnQ7CisKKwkgIC8qIGNoZWNrIGZvciBlbmFibGVkIC8gdW5tYXNrZWQgaW50ZXJydXB0cyAqLworCSAgaWYoKFNSICYgc3RhdHVzX0lFYykgJiYKKwkgICAgIChjb250cm9sbGVyLT5wZW5kaW5nX2xldmVsICYgKChTUiA+PiBzdGF0dXNfSU1fc2hpZnQpICYgc3RhdHVzX0lNX21hc2spKSkKKwkgICAgeworCSAgICAgIGNvbnRyb2xsZXItPnBlbmRpbmdfbGV2ZWwgPSAwOworCSAgICAgIFNpZ25hbEV4Y2VwdGlvbkludGVycnVwdCgwIC8qIGR1bW15IHZhbHVlICovKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogcmVzY2hlZHVsZSBzb29uICovCisJICAgICAgaWYoY29udHJvbGxlci0+ZXZlbnQgIT0gTlVMTCkKKwkJaHdfZXZlbnRfcXVldWVfZGVzY2hlZHVsZShtZSwgY29udHJvbGxlci0+ZXZlbnQpOworCSAgICAgIGNvbnRyb2xsZXItPmV2ZW50ID0KKwkJaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUgKG1lLCAxLCBkZWxpdmVyX3R4MzkwNGNwdV9pbnRlcnJ1cHQsIE5VTEwpOworCSAgICB9CisJfSAvKiBpbnRlcnJ1cHQgc2V0ICovCisgICAgfQorI3VuZGVmIENQVSBjcHUKKyN1bmRlZiBTRCBjdXJyZW50X3N0YXRlCit9CisKKworc3RhdGljIHZvaWQKK3R4MzkwNGNwdV9wb3J0X2V2ZW50IChzdHJ1Y3QgaHcgKm1lLAorCQkgICAgIGludCBteV9wb3J0LAorCQkgICAgIHN0cnVjdCBodyAqc291cmNlLAorCQkgICAgIGludCBzb3VyY2VfcG9ydCwKKwkJICAgICBpbnQgbGV2ZWwpCit7CisgIHN0cnVjdCB0eDM5MDRjcHUgKmNvbnRyb2xsZXIgPSBod19kYXRhIChtZSk7CisKKyAgc3dpdGNoIChteV9wb3J0KQorICAgIHsgICAgICAKKyAgICBjYXNlIFJFU0VUX1BPUlQ6CisgICAgICBjb250cm9sbGVyLT5wZW5kaW5nX3Jlc2V0ID0gMTsKKyAgICAgIEhXX1RSQUNFICgobWUsICJwb3J0LWluIHJlc2V0IikpOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE5NSV9QT1JUOgorICAgICAgY29udHJvbGxlci0+cGVuZGluZ19ubWkgPSAxOworICAgICAgSFdfVFJBQ0UgKChtZSwgInBvcnQtaW4gbm1pIikpOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIExFVkVMX1BPUlQ6CisgICAgICAvKiBsZXZlbCA9PSAwIG1lYW5zIHRoYXQgdGhlIGludGVycnVwdCB3YXMgY2xlYXJlZCAqLworICAgICAgaWYobGV2ZWwgPT0gMCkKKwljb250cm9sbGVyLT5wZW5kaW5nX2xldmVsID0gLTE7IC8qIHNpZ25hbCBlbmQgb2YgaW50ZXJydXB0ICovCisgICAgICBlbHNlCisJY29udHJvbGxlci0+cGVuZGluZ19sZXZlbCA9IGxldmVsOworICAgICAgSFdfVFJBQ0UgKChtZSwgInBvcnQtaW4gbGV2ZWw9JWQiLCBsZXZlbCkpOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBkZWZhdWx0OgorICAgICAgaHdfYWJvcnQgKG1lLCAiYmFkIHN3aXRjaCIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIFNjaGVkdWxlIGFuIGV2ZW50IHRvIGJlIGRlbGl2ZXJlZCBpbW1lZGlhdGVseSBhZnRlciBjdXJyZW50CisgICAgIGluc3RydWN0aW9uLiAqLworICBpZihjb250cm9sbGVyLT5ldmVudCAhPSBOVUxMKQorICAgIGh3X2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUobWUsIGNvbnRyb2xsZXItPmV2ZW50KTsKKyAgY29udHJvbGxlci0+ZXZlbnQgPQorICAgIGh3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlIChtZSwgMCwgZGVsaXZlcl90eDM5MDRjcHVfaW50ZXJydXB0LCBOVUxMKTsKK30KKworCitjb25zdCBzdHJ1Y3QgaHdfZGVzY3JpcHRvciBkdl90eDM5MDRjcHVfZGVzY3JpcHRvcltdID0geworICB7ICJ0eDM5MDRjcHUiLCB0eDM5MDRjcHVfZmluaXNoLCB9LAorICB7IE5VTEwgfSwKK307CmRpZmYgLS1naXQgYS9zaW0vbWlwcy9kdi10eDM5MDRpcmMuYyBiL3NpbS9taXBzL2R2LXR4MzkwNGlyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODRlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbWlwcy9kdi10eDM5MDRpcmMuYwpAQCAtMCwwICsxLDQxMyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgICAKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgICAgCisgICAgKi8KKworCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJody1tYWluLmgiCisKKworLyogREVWSUNFCisKKyAgIAorICAgdHgzOTA0aXJjIC0gdHgzOTA0IGludGVycnVwdCBjb250cm9sbGVyCisKKyAgIAorICAgREVTQ1JJUFRJT04KKworICAgCisgICBJbXBsZW1lbnRzIHRoZSB0eDM5MDQgaW50ZXJydXB0IGNvbnRyb2xsZXIgZGVzY3JpYmVkIGluIHRoZSB0eDM5MDQKKyAgIHVzZXIgZ3VpZGUuICBJdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBpbnRlcnJ1cHQgZGV0ZWN0aW9uIGNpcmN1aXQKKyAgIHRoYXQgcHJlcHJvY2Vzc2VzIHRoZSBlaWdodCBleHRlcm5hbCBpbnRlcnJ1cHRzLCBzbyBhc3N1bWVzIHRoYXQKKyAgIGVhY2ggZXZlbnQgb24gYW4gaW5wdXQgaW50ZXJydXB0IHBvcnQgc2lnbmFscyBhIG5ldyBpbnRlcnJ1cHQuCisgICBUaGF0IGlzLCBpdCBpbXBsZW1lbnRzIGVkZ2UtIHJhdGhlciB0aGFuIGxldmVsLXRyaWdnZXJlZAorICAgaW50ZXJydXB0cy4KKworICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGNvbmN1cnJlbnQKKyAgIGludGVycnVwdHMuCisKKworICAgUFJPUEVSVElFUworCisKKyAgIHJlZyA8YmFzZT4gPGxlbmd0aD4KKworICAgQmFzZSBvZiBJUkMgY29udHJvbCByZWdpc3RlciBiYW5rLiAgPGxlbmd0aD4gbXVzdCBlcXVhbCAweDIwLgorICAgUmVnaXN0ZXJzIG9mZnNldHM6ICAgICAgIDA6IElTUjogaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6IElNUjogaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OiBJTFIwOiBpbnRlcnJ1cHQgbGV2ZWwgcmVnaXN0ZXIgMy4uMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA6IElMUjE6IGludGVycnVwdCBsZXZlbCByZWdpc3RlciA3Li40CisgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDogSUxSMjogaW50ZXJydXB0IGxldmVsIHJlZ2lzdGVyIDExLi44CisgICAgICAgICAgICAgICAgICAgICAgICAgICAyODogSUxSMzogaW50ZXJydXB0IGxldmVsIHJlZ2lzdGVyIDE1Li4xMgorCisKKworICAgUE9SVFMKKworCisgICBpcCAob3V0cHV0KQorCisgICBJbnRlcnJ1cHQgcHJpb3JpdHkgcG9ydC4gIEFuIGV2ZW50IGlzIGdlbmVyYXRlZCB3aGVuIGFuIGludGVycnVwdAorICAgb2YgYSBzdWZmaWNpZW50IHByaW9yaXR5IGlzIHBhc3NlZCB0aHJvdWdoIHRoZSBJUkMuICBUaGUgdmFsdWUKKyAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQgaXMgdGhlIGludGVycnVwdCBsZXZlbCAoMTYtMzEpLCBhcyBnaXZlbgorICAgZm9yIGJpdHMgSVBbNTowXSBpbiB0aGUgYm9vayBUTVBSMzkwNEYgUmV2LiAyLjAsIHBnLiAxMS0zLiAgTm90ZQorICAgdGhhdCBldmVuIHRob3VnaCBJTlRbMF0gaXMgdGllZCBleHRlcm5hbGx5IHRvIElQWzVdLCB3ZSBzaW11bGF0ZQorICAgaXQgYXMgcGFzc2luZyB0aHJvdWdoIHRoZSBjb250cm9sbGVyLgorCisgICBBbiBvdXRwdXQgbGV2ZWwgb2YgemVybyBzaWduYWxzIHRoZSBjbGVhcmluZyBvZiBhIGxldmVsIGludGVycnVwdC4KKworCisgICBpbnQwLTcgKGlucHV0KQorCisgICBFeHRlcm5hbCBpbnRlcnJ1cHRzLiAgTGV2ZWwgPSAwIC0+IGxldmVsIGludGVycnVwdCBjbGVhcmVkLgorCisgICAKKyAgIGRtYWMwLTMgKGlucHV0KQorCisgICBETUEgaW50ZXJuYWwgaW50ZXJydXB0cywgY29ycmVzcG9uZCB0byBETUEgY2hhbm5lbHMgMC0zLiAgTGV2ZWwgPSAwIC0+IGxldmVsIGludGVycnVwdCBjbGVhcmVkLgorCisKKyAgIHNpbzAtMSAoaW5wdXQpCisKKyAgIFNJTyBpbnRlcm5hbCBpbnRlcnJ1cHRzLiAgTGV2ZWwgPSAwIC0+IGxldmVsIGludGVycnVwdCBjbGVhcmVkLgorCisKKyAgIHRtcjAtMiAoaW5wdXQpCisKKyAgIFRpbWVyIGludGVybmFsIGludGVycnVwdHMuICBMZXZlbCA9IDAgLT4gbGV2ZWwgaW50ZXJydXB0IGNsZWFyZWQuCisKKyAgICovCisKKworCisKKworLyogcmVnaXN0ZXIgbnVtYmVyczsgZWFjaCBpcyBvbmUgd29yZCBsb25nICovCitlbnVtCit7CisgIElTUl9SRUcgPSAwLAorICBJTVJfUkVHID0gMSwKKyAgSUxSMF9SRUcgPSA0LAorICBJTFIxX1JFRyA9IDUsCisgIElMUjJfUkVHID0gNiwKKyAgSUxSM19SRUcgPSA3LAorfTsKKworCisvKiBwb3J0IElEJ3MgKi8KKworZW51bQoreworICAvKiBpbnB1dHMsIG9yZGVyZWQgdG8gY29ycmVzcG9uZCB0byBpbnRlcnJ1cHQgc291cmNlcyAwLi4xNSAqLworICBJTlQxX1BPUlQgPSAwLCBJTlQyX1BPUlQsIElOVDNfUE9SVCwgSU5UNF9QT1JULCBJTlQ1X1BPUlQsIElOVDZfUE9SVCwgSU5UN19QT1JULAorICBETUFDM19QT1JULCBETUFDMl9QT1JULCBETUFDMV9QT1JULCBETUFDMF9QT1JULCBTSU8wX1BPUlQsIFNJTzFfUE9SVCwKKyAgVE1SMF9QT1JULCBUTVIxX1BPUlQsIFRNUjJfUE9SVCwKKworICAvKiBzcGVjaWFsIElOVFswXSBwb3J0ICovCisgIElOVDBfUE9SVCwKKworICAvKiByZXNldCAqLworICBSRVNFVF9QT1JULAorCisgIC8qIG91dHB1dCAqLworICBJUF9QT1JUCit9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdfcG9ydF9kZXNjcmlwdG9yIHR4MzkwNGlyY19wb3J0c1tdID0geworCisgIC8qIGludGVycnVwdCBvdXRwdXQgKi8KKworICB7ICJpcCIsIElQX1BPUlQsIDAsIG91dHB1dF9wb3J0LCB9LAorCisgIC8qIGludGVycnVwdCBpbnB1dHMgKGFzIG5hbWVzKSAqLworICAvKiBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mIGxldmVsIG51bWJlciAqLworCisgIHsgImludDEiLCBJTlQxX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgImludDIiLCBJTlQyX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgImludDMiLCBJTlQzX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgImludDQiLCBJTlQ0X1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgImludDUiLCBJTlQ1X1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgImludDYiLCBJTlQ2X1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgImludDciLCBJTlQ3X1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisKKyAgeyAiZG1hYzMiLCBETUFDM19QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAorICB7ICJkbWFjMiIsIERNQUMyX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgImRtYWMxIiwgRE1BQzFfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKyAgeyAiZG1hYzAiLCBETUFDMF9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAorCisgIHsgInNpbzAiLCBTSU8wX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgInNpbzEiLCBTSU8xX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisKKyAgeyAidG1yMCIsIFRNUjBfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKyAgeyAidG1yMSIsIFRNUjFfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKyAgeyAidG1yMiIsIFRNUjJfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKworICB7ICJyZXNldCIsIFJFU0VUX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgImludDAiLCBJTlQwX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisKKyAgeyBOVUxMLCB9LAorfTsKKworCisjZGVmaW5lIE5SX1NPVVJDRVMgKFRNUjNfUE9SVCAtIElOVDFfUE9SVCArIDEpIC8qIDE2OiBudW1iZXIgb2YgaW50ZXJydXB0IHNvdXJjZXMgKi8KKworCisvKiBUaGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgcmVnaXN0ZXIgaW50ZXJuYWwgc3RhdGUuICBOb3RlIHRoYXQgd2UKKyAgIHN0b3JlIHN0YXRlIHVzaW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyIGltYWdlcywgaW4gaG9zdCBlbmRpYW4KKyAgIG9yZGVyLiAqLworCitzdHJ1Y3QgdHgzOTA0aXJjIHsKKyAgYWRkcmVzc193b3JkIGJhc2VfYWRkcmVzczsgLyogY29udHJvbCByZWdpc3RlciBiYXNlICovCisgIHVuc2lnbmVkXzQgaXNyOworI2RlZmluZSBJU1JfU0VUKGMscykgKChjKS0+aXNyICY9IH4gKDEgPDwgKHMpKSkKKyAgdW5zaWduZWRfNCBpbXI7CisjZGVmaW5lIElNUl9HRVQoYykgKChjKS0+aW1yKQorICB1bnNpZ25lZF80IGlscls0XTsKKyNkZWZpbmUgSUxSX0dFVChjLHMpIExTRVhUUkFDVEVEMzIoKGMpLT5pbHJbKHMpLzRdLCAocykgJSA0ICogOCArIDIsIChzKSAlIDQgKiA4KQorfTsKKworCisKKy8qIEZpbmlzaCBvZmYgdGhlIHBhcnRpYWxseSBjcmVhdGVkIGh3IGRldmljZS4gIEF0dGFjaCBvdXIgbG9jYWwKKyAgIGNhbGxiYWNrcy4gIFdpcmUgdXAgb3VyIHBvcnQgbmFtZXMgZXRjICovCisKK3N0YXRpYyBod19pb19yZWFkX2J1ZmZlcl9tZXRob2QgdHgzOTA0aXJjX2lvX3JlYWRfYnVmZmVyOworc3RhdGljIGh3X2lvX3dyaXRlX2J1ZmZlcl9tZXRob2QgdHgzOTA0aXJjX2lvX3dyaXRlX2J1ZmZlcjsKK3N0YXRpYyBod19wb3J0X2V2ZW50X21ldGhvZCB0eDM5MDRpcmNfcG9ydF9ldmVudDsKKworc3RhdGljIHZvaWQKK2F0dGFjaF90eDM5MDRpcmNfcmVncyAoc3RydWN0IGh3ICptZSwKKwkJICAgICAgc3RydWN0IHR4MzkwNGlyYyAqY29udHJvbGxlcikKK3sKKyAgdW5zaWduZWRfd29yZCBhdHRhY2hfYWRkcmVzczsKKyAgaW50IGF0dGFjaF9zcGFjZTsKKyAgdW5zaWduZWQgYXR0YWNoX3NpemU7CisgIHJlZ19wcm9wZXJ0eV9zcGVjIHJlZzsKKworICBpZiAoaHdfZmluZF9wcm9wZXJ0eSAobWUsICJyZWciKSA9PSBOVUxMKQorICAgIGh3X2Fib3J0IChtZSwgIk1pc3NpbmcgXCJyZWdcIiBwcm9wZXJ0eSIpOworCisgIGlmICghaHdfZmluZF9yZWdfYXJyYXlfcHJvcGVydHkgKG1lLCAicmVnIiwgMCwgJnJlZykpCisgICAgaHdfYWJvcnQgKG1lLCAiXCJyZWdcIiBwcm9wZXJ0eSBtdXN0IGNvbnRhaW4gb25lIGFkZHIvc2l6ZSBlbnRyeSIpOworCisgIGh3X3VuaXRfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyAoaHdfcGFyZW50IChtZSksCisJCQkJICAgICAmcmVnLmFkZHJlc3MsCisJCQkJICAgICAmYXR0YWNoX3NwYWNlLAorCQkJCSAgICAgJmF0dGFjaF9hZGRyZXNzLAorCQkJCSAgICAgbWUpOworICBod191bml0X3NpemVfdG9fYXR0YWNoX3NpemUgKGh3X3BhcmVudCAobWUpLAorCQkJICAgICAgICZyZWcuc2l6ZSwKKwkJCSAgICAgICAmYXR0YWNoX3NpemUsIG1lKTsKKworICBod19hdHRhY2hfYWRkcmVzcyAoaHdfcGFyZW50IChtZSksIDAsCisJCSAgICAgYXR0YWNoX3NwYWNlLCBhdHRhY2hfYWRkcmVzcywgYXR0YWNoX3NpemUsCisJCSAgICAgbWUpOworCisgIGNvbnRyb2xsZXItPmJhc2VfYWRkcmVzcyA9IGF0dGFjaF9hZGRyZXNzOworfQorCisKK3N0YXRpYyB2b2lkCit0eDM5MDRpcmNfZmluaXNoIChzdHJ1Y3QgaHcgKm1lKQoreworICBzdHJ1Y3QgdHgzOTA0aXJjICpjb250cm9sbGVyOworCisgIGNvbnRyb2xsZXIgPSBIV19aQUxMT0MgKG1lLCBzdHJ1Y3QgdHgzOTA0aXJjKTsKKyAgc2V0X2h3X2RhdGEgKG1lLCBjb250cm9sbGVyKTsKKyAgc2V0X2h3X2lvX3JlYWRfYnVmZmVyIChtZSwgdHgzOTA0aXJjX2lvX3JlYWRfYnVmZmVyKTsKKyAgc2V0X2h3X2lvX3dyaXRlX2J1ZmZlciAobWUsIHR4MzkwNGlyY19pb193cml0ZV9idWZmZXIpOworICBzZXRfaHdfcG9ydHMgKG1lLCB0eDM5MDRpcmNfcG9ydHMpOworICBzZXRfaHdfcG9ydF9ldmVudCAobWUsIHR4MzkwNGlyY19wb3J0X2V2ZW50KTsKKworICAvKiBBdHRhY2ggb3Vyc2VsZiB0byBvdXIgcGFyZW50IGJ1cyAqLworICBhdHRhY2hfdHgzOTA0aXJjX3JlZ3MgKG1lLCBjb250cm9sbGVyKTsKKworICAvKiBJbml0aWFsaXplIHRvIHJlc2V0IHN0YXRlICovCisgIGNvbnRyb2xsZXItPmlzciA9IDB4MDAwMGZmZmY7CisgIGNvbnRyb2xsZXItPmltciA9IDA7CisgIGNvbnRyb2xsZXItPmlsclswXSA9CisgICAgY29udHJvbGxlci0+aWxyWzFdID0KKyAgICBjb250cm9sbGVyLT5pbHJbMl0gPQorICAgIGNvbnRyb2xsZXItPmlsclszXSA9IDA7Cit9CisKKworCisvKiBBbiBldmVudCBhcnJpdmVzIG9uIGFuIGludGVycnVwdCBwb3J0ICovCisKK3N0YXRpYyB2b2lkCit0eDM5MDRpcmNfcG9ydF9ldmVudCAoc3RydWN0IGh3ICptZSwKKwkJICAgICBpbnQgbXlfcG9ydCwKKwkJICAgICBzdHJ1Y3QgaHcgKnNvdXJjZV9kZXYsCisJCSAgICAgaW50IHNvdXJjZV9wb3J0LAorCQkgICAgIGludCBsZXZlbCkKK3sKKyAgc3RydWN0IHR4MzkwNGlyYyAqY29udHJvbGxlciA9IGh3X2RhdGEgKG1lKTsKKworICAvKiBoYW5kbGUgZGVhY3RpdmF0ZWQgaW50ZXJydXB0ICovCisgIGlmKGxldmVsID09IDApCisgICAgeworICAgICAgSFdfVFJBQ0UgKChtZSwgImludGVycnVwdCBjbGVhcmVkIG9uIHBvcnQgJWQiLCBteV9wb3J0KSk7CisgICAgICBod19wb3J0X2V2ZW50KG1lLCBJUF9QT1JULCAwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc3dpdGNoIChteV9wb3J0KQorICAgIHsKKyAgICBjYXNlIElOVDBfUE9SVDogCisgICAgICB7CisJaW50IGlwX251bWJlciA9IDMyOyAvKiBjb21wdXRlIElQWzU6MF0gKi8KKwlIV19UUkFDRSAoKG1lLCAicG9ydC1ldmVudCBJTlRbMF0iKSk7CisJaHdfcG9ydF9ldmVudChtZSwgSVBfUE9SVCwgaXBfbnVtYmVyKTsKKwlicmVhazsKKyAgICAgIH0KKworICAgIGNhc2UgSU5UMV9QT1JUOiBjYXNlIElOVDJfUE9SVDogY2FzZSBJTlQzX1BPUlQ6IGNhc2UgSU5UNF9QT1JUOgorICAgIGNhc2UgSU5UNV9QT1JUOiBjYXNlIElOVDZfUE9SVDogY2FzZSBJTlQ3X1BPUlQ6IGNhc2UgRE1BQzNfUE9SVDoKKyAgICBjYXNlIERNQUMyX1BPUlQ6IGNhc2UgRE1BQzFfUE9SVDogY2FzZSBETUFDMF9QT1JUOiBjYXNlIFNJTzBfUE9SVDoKKyAgICBjYXNlIFNJTzFfUE9SVDogY2FzZSBUTVIwX1BPUlQ6IGNhc2UgVE1SMV9QT1JUOiBjYXNlIFRNUjJfUE9SVDoKKyAgICAgIHsKKwlpbnQgc291cmNlID0gbXlfcG9ydCAtIElOVDFfUE9SVDsKKworCUhXX1RSQUNFICgobWUsICJpbnRlcnJ1cHQgYXNzZXJ0ZWQgb24gcG9ydCAlZCIsIHNvdXJjZSkpOworCUlTUl9TRVQoY29udHJvbGxlciwgc291cmNlKTsKKwlpZihJTFJfR0VUKGNvbnRyb2xsZXIsIHNvdXJjZSkgPiBJTVJfR0VUKGNvbnRyb2xsZXIpKQorCSAgeworCSAgICBpbnQgaXBfbnVtYmVyID0gMTYgKyBzb3VyY2U7IC8qIGNvbXB1dGUgSVBbNDowXSAqLworCSAgICBIV19UUkFDRSAoKG1lLCAiaW50ZXJydXB0IGxldmVsICVkIiwgSUxSX0dFVChjb250cm9sbGVyLHNvdXJjZSkpKTsKKwkgICAgaHdfcG9ydF9ldmVudChtZSwgSVBfUE9SVCwgaXBfbnVtYmVyKTsKKwkgIH0KKwlicmVhazsKKyAgICAgIH0KKworICAgIGNhc2UgUkVTRVRfUE9SVDoKKyAgICAgIHsKKwlIV19UUkFDRSAoKG1lLCAicmVzZXQiKSk7CisJY29udHJvbGxlci0+aXNyID0gMHgwMDAwZmZmZjsKKwljb250cm9sbGVyLT5pbXIgPSAwOworCWNvbnRyb2xsZXItPmlsclswXSA9CisJICBjb250cm9sbGVyLT5pbHJbMV0gPQorCSAgY29udHJvbGxlci0+aWxyWzJdID0KKwkgIGNvbnRyb2xsZXItPmlsclszXSA9IDA7CisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIElQX1BPUlQ6CisgICAgICBod19hYm9ydCAobWUsICJFdmVudCBvbiBvdXRwdXQgcG9ydCAlZCIsIG15X3BvcnQpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgaHdfYWJvcnQgKG1lLCAiRXZlbnQgb24gdW5rbm93biBwb3J0ICVkIiwgbXlfcG9ydCk7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKworLyogZ2VuZXJpYyByZWFkL3dyaXRlICovCisKK3N0YXRpYyB1bnNpZ25lZAordHgzOTA0aXJjX2lvX3JlYWRfYnVmZmVyIChzdHJ1Y3QgaHcgKm1lLAorCQkJIHZvaWQgKmRlc3QsCisJCQkgaW50IHNwYWNlLAorCQkJIHVuc2lnbmVkX3dvcmQgYmFzZSwKKwkJCSB1bnNpZ25lZCBucl9ieXRlcykKK3sKKyAgc3RydWN0IHR4MzkwNGlyYyAqY29udHJvbGxlciA9IGh3X2RhdGEgKG1lKTsKKyAgdW5zaWduZWQgYnl0ZTsKKworICBIV19UUkFDRSAoKG1lLCAicmVhZCAweCUwOGx4ICVkIiwgKGxvbmcpIGJhc2UsIChpbnQpIG5yX2J5dGVzKSk7CisgIGZvciAoYnl0ZSA9IDA7IGJ5dGUgPCBucl9ieXRlczsgYnl0ZSsrKQorICAgIHsKKyAgICAgIGFkZHJlc3Nfd29yZCBhZGRyZXNzID0gYmFzZSArIGJ5dGU7CisgICAgICBpbnQgcmVnX251bWJlciA9IChhZGRyZXNzIC0gY29udHJvbGxlci0+YmFzZV9hZGRyZXNzKSAvIDQ7CisgICAgICBpbnQgcmVnX29mZnNldCA9IChhZGRyZXNzIC0gY29udHJvbGxlci0+YmFzZV9hZGRyZXNzKSAlIDQ7CisgICAgICB1bnNpZ25lZF80IHJlZ2lzdGVyX3ZhbHVlOyAvKiBpbiB0YXJnZXQgYnl0ZSBvcmRlciAqLworCisgICAgICAvKiBmaWxsIGluIGVudGlyZSByZWdpc3Rlcl92YWx1ZSB3b3JkICovCisgICAgICBzd2l0Y2ggKHJlZ19udW1iZXIpCisJeworCWNhc2UgSVNSX1JFRzogcmVnaXN0ZXJfdmFsdWUgPSBjb250cm9sbGVyLT5pc3I7IGJyZWFrOworCWNhc2UgSU1SX1JFRzogcmVnaXN0ZXJfdmFsdWUgPSBjb250cm9sbGVyLT5pbXI7IGJyZWFrOworCWNhc2UgSUxSMF9SRUc6IHJlZ2lzdGVyX3ZhbHVlID0gY29udHJvbGxlci0+aWxyWzBdOyBicmVhazsKKwljYXNlIElMUjFfUkVHOiByZWdpc3Rlcl92YWx1ZSA9IGNvbnRyb2xsZXItPmlsclsxXTsgYnJlYWs7CisJY2FzZSBJTFIyX1JFRzogcmVnaXN0ZXJfdmFsdWUgPSBjb250cm9sbGVyLT5pbHJbMl07IGJyZWFrOworCWNhc2UgSUxSM19SRUc6IHJlZ2lzdGVyX3ZhbHVlID0gY29udHJvbGxlci0+aWxyWzNdOyBicmVhazsKKwlkZWZhdWx0OiByZWdpc3Rlcl92YWx1ZSA9IDA7CisJfQorCisgICAgICAvKiB3cml0ZSByZXF1ZXN0ZWQgYnl0ZSBvdXQgKi8KKyAgICAgIHJlZ2lzdGVyX3ZhbHVlID0gSDJUXzQocmVnaXN0ZXJfdmFsdWUpOworICAgICAgbWVtY3B5ICgoY2hhciopIGRlc3QgKyBieXRlLCAoKGNoYXIqKSYgcmVnaXN0ZXJfdmFsdWUpK3JlZ19vZmZzZXQsIDEpOworICAgIH0KKworICByZXR1cm4gbnJfYnl0ZXM7Cit9ICAgICAKKworCisKK3N0YXRpYyB1bnNpZ25lZAordHgzOTA0aXJjX2lvX3dyaXRlX2J1ZmZlciAoc3RydWN0IGh3ICptZSwKKwkJCSAgY29uc3Qgdm9pZCAqc291cmNlLAorCQkJICBpbnQgc3BhY2UsCisJCQkgIHVuc2lnbmVkX3dvcmQgYmFzZSwKKwkJCSAgdW5zaWduZWQgbnJfYnl0ZXMpCit7CisgIHN0cnVjdCB0eDM5MDRpcmMgKmNvbnRyb2xsZXIgPSBod19kYXRhIChtZSk7CisgIHVuc2lnbmVkIGJ5dGU7CisKKyAgSFdfVFJBQ0UgKChtZSwgIndyaXRlIDB4JTA4bHggJWQiLCAobG9uZykgYmFzZSwgKGludCkgbnJfYnl0ZXMpKTsKKyAgZm9yIChieXRlID0gMDsgYnl0ZSA8IG5yX2J5dGVzOyBieXRlKyspCisgICAgeworICAgICAgYWRkcmVzc193b3JkIGFkZHJlc3MgPSBiYXNlICsgYnl0ZTsKKyAgICAgIGludCByZWdfbnVtYmVyID0gKGFkZHJlc3MgLSBjb250cm9sbGVyLT5iYXNlX2FkZHJlc3MpIC8gNDsKKyAgICAgIGludCByZWdfb2Zmc2V0ID0gKGFkZHJlc3MgLSBjb250cm9sbGVyLT5iYXNlX2FkZHJlc3MpICUgNDsKKyAgICAgIHVuc2lnbmVkXzQqIHJlZ2lzdGVyX3B0cjsKKyAgICAgIHVuc2lnbmVkXzQgcmVnaXN0ZXJfdmFsdWU7CisKKyAgICAgIC8qIGZpbGwgaW4gZW50aXJlIHJlZ2lzdGVyX3ZhbHVlIHdvcmQgKi8KKyAgICAgIHN3aXRjaCAocmVnX251bWJlcikKKwl7CisJY2FzZSBJU1JfUkVHOiByZWdpc3Rlcl9wdHIgPSAmIGNvbnRyb2xsZXItPmlzcjsgYnJlYWs7CisJY2FzZSBJTVJfUkVHOiByZWdpc3Rlcl9wdHIgPSAmIGNvbnRyb2xsZXItPmltcjsgYnJlYWs7CisJY2FzZSBJTFIwX1JFRzogcmVnaXN0ZXJfcHRyID0gJiBjb250cm9sbGVyLT5pbHJbMF07IGJyZWFrOworCWNhc2UgSUxSMV9SRUc6IHJlZ2lzdGVyX3B0ciA9ICYgY29udHJvbGxlci0+aWxyWzFdOyBicmVhazsKKwljYXNlIElMUjJfUkVHOiByZWdpc3Rlcl9wdHIgPSAmIGNvbnRyb2xsZXItPmlsclsyXTsgYnJlYWs7CisJY2FzZSBJTFIzX1JFRzogcmVnaXN0ZXJfcHRyID0gJiBjb250cm9sbGVyLT5pbHJbM107IGJyZWFrOworCWRlZmF1bHQ6IHJlZ2lzdGVyX3B0ciA9ICYgcmVnaXN0ZXJfdmFsdWU7IC8qIHVzZWQgYXMgYSBkdW1teSAqLworCX0KKworICAgICAgLyogSFdfVFJBQ0UgKChtZSwgInJlZyAlZCBwcmU6ICUwOGx4IiwgcmVnX251bWJlciwgKGxvbmcpICpyZWdpc3Rlcl9wdHIpKTsgKi8KKworICAgICAgLyogb3ZlcndyaXRlIHJlcXVlc3RlZCBieXRlICovCisgICAgICByZWdpc3Rlcl92YWx1ZSA9IEgyVF80KCogcmVnaXN0ZXJfcHRyKTsKKyAgICAgIG1lbWNweSAoKChjaGFyKikmcmVnaXN0ZXJfdmFsdWUpK3JlZ19vZmZzZXQsIChjb25zdCBjaGFyKilzb3VyY2UgKyBieXRlLCAxKTsKKyAgICAgICogcmVnaXN0ZXJfcHRyID0gVDJIXzQocmVnaXN0ZXJfdmFsdWUpOworCisgICAgICAvKiBIV19UUkFDRSAoKG1lLCAicG9zdDogJTA4bHgiLCAobG9uZykgKnJlZ2lzdGVyX3B0cikpOyAqLworICAgIH0KKyAgcmV0dXJuIG5yX2J5dGVzOworfSAgICAgCisKKworY29uc3Qgc3RydWN0IGh3X2Rlc2NyaXB0b3IgZHZfdHgzOTA0aXJjX2Rlc2NyaXB0b3JbXSA9IHsKKyAgeyAidHgzOTA0aXJjIiwgdHgzOTA0aXJjX2ZpbmlzaCwgfSwKKyAgeyBOVUxMIH0sCit9OwpkaWZmIC0tZ2l0IGEvc2ltL21pcHMvZHYtdHgzOTA0c2lvLmMgYi9zaW0vbWlwcy9kdi10eDM5MDRzaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWUzZGRiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL21pcHMvZHYtdHgzOTA0c2lvLmMKQEAgLTAsMCArMSw2MjEgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICAgCisgICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICAgIAorICAgICovCisKKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAiaHctbWFpbi5oIgorI2luY2x1ZGUgImR2LXNvY2tzZXIuaCIKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisKKworLyogREVWSUNFCisKKyAgIAorICAgdHgzOTA0c2lvIC0gdHgzOTA0IHNlcmlhbCBJL08KKworICAgCisgICBERVNDUklQVElPTgorCisgICAKKyAgIEltcGxlbWVudHMgb25lIHR4MzkwNCBzZXJpYWwgSS9PIGNvbnRyb2xsZXIgZGVzY3JpYmVkIGluIHRoZSB0eDM5MDQKKyAgIHVzZXIgZ3VpZGUuICBUaHJlZSBpbnN0YW5jZXMgYXJlIHJlcXVpcmVkIGZvciBTSU8wIGFuZCBTSU8xIHdpdGhpbgorICAgdGhlIHR4MzkwNCwgYXQgZGlmZmVyZW50IGJhc2UgYWRkcmVzc2VzLgorCisgICBCb3RoIGludGVybmFsIGFuZCBzeXN0ZW0gY2xvY2tzIGFyZSBzeW50aGVzaXplZCBhcyBkaXZpZGVkIHZlcnNpb25zCisgICBvZiB0aGUgc2ltdWxhdG9yIGNsb2NrLgorICAgCisgICBUaGVyZSBpcyBubyBzdXBwb3J0IGZvcjoKKyAgICAtIENUUy9SVFMgZmxvdyBjb250cm9sCisgICAgLSBiYXVkIHJhdGUgZW11bGF0aW9uIC0gdXNlIGluZmluaXRlIHNwZWVkIGluc3RlYWQKKyAgICAtIGdlbmVyYWwgZnJhbWUgZm9ybWF0IC0gdXNlIDhOMQorICAgIC0gbXVsdGktY29udHJvbGxlciBzeXN0ZW0KKyAgICAtIERNQSAtIHVzZSBpbnRlcnJ1cHQtZHJpdmVuIG9yIHBvbGxlZC1JL08gaW5zdGVhZAorCisKKyAgIFBST1BFUlRJRVMKKworCisgICByZWcgPGJhc2U+IDxsZW5ndGg+CisKKyAgIEJhc2Ugb2YgU0lPIGNvbnRyb2wgcmVnaXN0ZXIgYmFuay4gIDxsZW5ndGg+IG11c3QgZXF1YWwgMHgxMDAuCisgICBSZWdpc3RlciBvZmZzZXRzOiAgICAgICAwOiBTTENSOiBsaW5lIGNvbnRyb2wgcmVnaXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6IFNMU1I6IGxpbmUgc3RhdHVzIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICA4OiBTRElDUjogRE1BL2ludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOiBTRElTUjogRE1BL2ludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMTY6IFNGQ1I6IEZJRk8gY29udHJvbCByZWdpc3RlcgorCQkJICAyMDogU0JHUjogYmF1ZCByYXRlIGNvbnRyb2wgcmVnaXN0ZXIKKwkJCSAgMzI6IHRyYW5zZmVyIEZJRk8gYnVmZmVyCisJCQkgIDQ4OiB0cmFuc2ZlciBGSUZPIGJ1ZmZlcgorCisgICBiYWNrZW5kIHt0Y3AgfCBzdGRpb30KKworICAgVXNlIGR2LXNvY2tzZXIgVENQLXBvcnQgYmFja2VuZCBvciBzdGRpbyBmb3IgYmFja2VuZC4gIERlZmF1bHQ6IHN0ZGlvLgorCisKKworICAgUE9SVFMKKworCisgICBpbnQgKG91dHB1dCkKKworICAgSW50ZXJydXB0IHBvcnQuICBBbiBldmVudCBpcyBnZW5lcmF0ZWQgd2hlbiBhIHRpbWVyIGludGVycnVwdAorICAgb2NjdXJzLgorCisKKyAgIHJlc2V0IChpbnB1dCkKKworICAgUmVzZXQgcG9ydC4KKworICAgKi8KKworCisKKy8qIHN0YXRpYyBmdW5jdGlvbnMgKi8KKworc3RydWN0IHR4MzkwNHNpb19maWZvOworCitzdGF0aWMgdm9pZCB0eDM5MDRzaW9fdGlja2xlKHN0cnVjdCBodyopOworc3RhdGljIGludCB0eDM5MDRzaW9fZmlmb19ub25lbXB0eShzdHJ1Y3QgaHcqLCBzdHJ1Y3QgdHgzOTA0c2lvX2ZpZm8qKTsKK3N0YXRpYyBjaGFyIHR4MzkwNHNpb19maWZvX3BvcChzdHJ1Y3QgaHcqLCBzdHJ1Y3QgdHgzOTA0c2lvX2ZpZm8qKTsKK3N0YXRpYyB2b2lkIHR4MzkwNHNpb19maWZvX3B1c2goc3RydWN0IGh3Kiwgc3RydWN0IHR4MzkwNHNpb19maWZvKiwgY2hhcik7CitzdGF0aWMgdm9pZCB0eDM5MDRzaW9fZmlmb19yZXNldChzdHJ1Y3QgaHcqLCBzdHJ1Y3QgdHgzOTA0c2lvX2ZpZm8qKTsKK3N0YXRpYyB2b2lkIHR4MzkwNHNpb19wb2xsKHN0cnVjdCBodyosIHZvaWQqIGRhdGEpOworCisKKy8qIHJlZ2lzdGVyIG51bWJlcnM7IGVhY2ggaXMgb25lIHdvcmQgbG9uZyAqLworZW51bSAKK3sKKyAgU0xDUl9SRUcgPSAwLAorICBTTFNSX1JFRyA9IDEsCisgIFNESUNSX1JFRyA9IDIsCisgIFNESVNSX1JFRyA9IDMsCisgIFNGQ1JfUkVHID0gNCwKKyAgU0JHUl9SRUcgPSA1LAorICBURklGT19SRUcgPSA4LAorICBTRklGT19SRUcgPSAxMiwKK307CisKKworCisvKiBwb3J0IElEJ3MgKi8KKworZW51bQorIHsKKyAgUkVTRVRfUE9SVCwKKyAgSU5UX1BPUlQsCit9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdfcG9ydF9kZXNjcmlwdG9yIHR4MzkwNHNpb19wb3J0c1tdID0gCit7CisgIHsgImludCIsIElOVF9QT1JULCAwLCBvdXRwdXRfcG9ydCwgfSwKKyAgeyAicmVzZXQiLCBSRVNFVF9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAorICB7IE5VTEwsIH0sCit9OworCisKKworLyogR2VuZXJpYyBGSUZPICovCitzdHJ1Y3QgdHgzOTA0c2lvX2ZpZm8gCit7CisgIGludCBzaXplLCB1c2VkOworICB1bnNpZ25lZF8xICpidWZmZXI7Cit9OworCisKKworLyogVGhlIHRpbWVyL2NvdW50ZXIgcmVnaXN0ZXIgaW50ZXJuYWwgc3RhdGUuICBOb3RlIHRoYXQgd2Ugc3RvcmUKKyAgIHN0YXRlIHVzaW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyIGltYWdlcywgaW4gaG9zdCBlbmRpYW4gb3JkZXIuICovCisKK3N0cnVjdCB0eDM5MDRzaW8gCit7CisgIGFkZHJlc3Nfd29yZCBiYXNlX2FkZHJlc3M7IC8qIGNvbnRyb2wgcmVnaXN0ZXIgYmFzZSAqLworICBlbnVtIHtzaW9fdGNwLCBzaW9fc3RkaW99IGJhY2tlbmQ7IC8qIGJhY2tlbmQgKi8KKworICBzdHJ1Y3QgdHgzOTA0c2lvX2ZpZm8gcnhfZmlmbywgdHhfZmlmbzsgLyogRklGT3MgKi8KKworICB1bnNpZ25lZF80IHNsY3I7CisjZGVmaW5lIFNMQ1JfV1JfTUFTSyAgICAgICAgMHhlMTdmMDAwMFUKKyNkZWZpbmUgU0xDUl9TRVRfQllURShjLG8sYikgKChjKS0+c2xjciA9IFNMQ1JfV1JfTUFTSyAmICgoKGMpLT5zbGNyICYgfkxTTUFTSzMyKChvKSo4KzcsKG8pKjgpKSB8ICgoYik8PCAobykqOCkpKQorICB1bnNpZ25lZF80IHNsc3I7CisjZGVmaW5lIFNMU1JfV1JfTUFTSyAgICAgICAgMHgwMDAwMDAwMCAvKiBVRkVSL1VQRVIvVU9FUiB1bmltcGxlbWVudGVkICovCisgIHVuc2lnbmVkXzQgc2RpY3I7CisjZGVmaW5lIFNESUNSX1dSX01BU0sgICAgICAgMHgwMDBmMDAwMFUKKyNkZWZpbmUgU0RJQ1JfU0VUX0JZVEUoYyxvLGIpICgoYyktPnNkaWNyID0gU0RJQ1JfV1JfTUFTSyAmICgoKGMpLT5zZGljciAmIH5MU01BU0szMigobykqOCs3LChvKSo4KSkgfCAoKGIpPDwgKG8pKjgpKSkKKyNkZWZpbmUgU0RJQ1JfR0VUX1NETUFFKGMpICAoKGMpLT5zZGljciAmIDB4MDAwODAwMDApCisjZGVmaW5lIFNESUNSX0dFVF9FUklFKGMpICAgKChjKS0+c2RpY3IgJiAweDAwMDQwMDAwKQorI2RlZmluZSBTRElDUl9HRVRfVERJRShjKSAgICgoYyktPnNkaWNyICYgMHgwMDAyMDAwMCkKKyNkZWZpbmUgU0RJQ1JfR0VUX1JESUUoYykgICAoKGMpLT5zZGljciAmIDB4MDAwMTAwMDApCisgIHVuc2lnbmVkXzQgc2Rpc3I7CisjZGVmaW5lIFNESVNSX1dSX01BU0sgICAgICAgMHgwMDA3MDAwMFUKKyNkZWZpbmUgU0RJU1JfU0VUX0JZVEUoYyxvLGIpICgoYyktPnNkaXNyID0gU0RJU1JfV1JfTUFTSyAmICgoKGMpLT5zZGlzciAmIH5MU01BU0szMigobykqOCs3LChvKSo4KSkgfCAoKGIpPDwgKG8pKjgpKSkKKyNkZWZpbmUgU0RJU1JfR0VUX1RESVMoYykgICAoKGMpLT5zZGlzciAmIDB4MDAwMjAwMDApCisjZGVmaW5lIFNESVNSX1NFVF9URElTKGMpICAgKChjKS0+c2Rpc3IgfD0gMHgwMDAyMDAwMCkKKyNkZWZpbmUgU0RJU1JfR0VUX1JESVMoYykgICAoKGMpLT5zZGlzciAmIDB4MDAwMTAwMDApCisjZGVmaW5lIFNESVNSX1NFVF9SRElTKGMpICAgKChjKS0+c2Rpc3IgfD0gMHgwMDAxMDAwMCkKKyAgdW5zaWduZWRfNCBzZmNyOworI2RlZmluZSBTRkNSX1dSX01BU0sgICAgICAgMHgwMDFmMDAwMFUKKyNkZWZpbmUgU0ZDUl9TRVRfQllURShjLG8sYikgKChjKS0+c2ZjciA9IFNGQ1JfV1JfTUFTSyAmICgoKGMpLT5zZmNyICYgfkxTTUFTSzMyKChvKSo4KzcsKG8pKjgpKSB8ICgoYik8PCAobykqOCkpKQorI2RlZmluZSBTRkNSX0dFVF9URlJTVChjKSAgICgoYyktPnNmY3IgJiAweDAwMDQwMDAwKQorI2RlZmluZSBTRkNSX0dFVF9SRlJTVChjKSAgICgoYyktPnNmY3IgJiAweDAwMDIwMDAwKQorI2RlZmluZSBTRkNSX0dFVF9GUlNURShjKSAgICgoYyktPnNmY3IgJiAweDAwMDEwMDAwKQorICB1bnNpZ25lZF80IHNiZ3I7CisjZGVmaW5lIFNCR1JfV1JfTUFTSyAgICAgICAweDAzZmYwMDAwVQorI2RlZmluZSBTQkdSX1NFVF9CWVRFKGMsbyxiKSAoKGMpLT5zYmdyID0gU0JHUl9XUl9NQVNLICYgKCgoYyktPnNiZ3IgJiB+TFNNQVNLMzIoKG8pKjgrNywobykqOCkpIHwgKChiKTw8IChvKSo4KSkpCisKKyAgLyogUGVyaW9kaWMgSS9PIHBvbGxpbmcgKi8KKyAgc3RydWN0IGh3X2V2ZW50KiBwb2xsX2V2ZW50OworfTsKKworCisKKy8qIEZpbmlzaCBvZmYgdGhlIHBhcnRpYWxseSBjcmVhdGVkIGh3IGRldmljZS4gIEF0dGFjaCBvdXIgbG9jYWwKKyAgIGNhbGxiYWNrcy4gIFdpcmUgdXAgb3VyIHBvcnQgbmFtZXMgZXRjICovCisKK3N0YXRpYyBod19pb19yZWFkX2J1ZmZlcl9tZXRob2QgdHgzOTA0c2lvX2lvX3JlYWRfYnVmZmVyOworc3RhdGljIGh3X2lvX3dyaXRlX2J1ZmZlcl9tZXRob2QgdHgzOTA0c2lvX2lvX3dyaXRlX2J1ZmZlcjsKK3N0YXRpYyBod19wb3J0X2V2ZW50X21ldGhvZCB0eDM5MDRzaW9fcG9ydF9ldmVudDsKKworCitzdGF0aWMgdm9pZAorYXR0YWNoX3R4MzkwNHNpb19yZWdzIChzdHJ1Y3QgaHcgKm1lLAorCQkgICAgICBzdHJ1Y3QgdHgzOTA0c2lvICpjb250cm9sbGVyKQoreworICB1bnNpZ25lZF93b3JkIGF0dGFjaF9hZGRyZXNzOworICBpbnQgYXR0YWNoX3NwYWNlOworICB1bnNpZ25lZCBhdHRhY2hfc2l6ZTsKKyAgcmVnX3Byb3BlcnR5X3NwZWMgcmVnOworCisgIGlmIChod19maW5kX3Byb3BlcnR5IChtZSwgInJlZyIpID09IE5VTEwpCisgICAgaHdfYWJvcnQgKG1lLCAiTWlzc2luZyBcInJlZ1wiIHByb3BlcnR5Iik7CisKKyAgaWYgKCFod19maW5kX3JlZ19hcnJheV9wcm9wZXJ0eSAobWUsICJyZWciLCAwLCAmcmVnKSkKKyAgICBod19hYm9ydCAobWUsICJcInJlZ1wiIHByb3BlcnR5IG11c3QgY29udGFpbiBvbmUgYWRkci9zaXplIGVudHJ5Iik7CisKKyAgaHdfdW5pdF9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzIChod19wYXJlbnQgKG1lKSwKKwkJCQkgICAgICZyZWcuYWRkcmVzcywKKwkJCQkgICAgICZhdHRhY2hfc3BhY2UsCisJCQkJICAgICAmYXR0YWNoX2FkZHJlc3MsCisJCQkJICAgICBtZSk7CisgIGh3X3VuaXRfc2l6ZV90b19hdHRhY2hfc2l6ZSAoaHdfcGFyZW50IChtZSksCisJCQkgICAgICAgJnJlZy5zaXplLAorCQkJICAgICAgICZhdHRhY2hfc2l6ZSwgbWUpOworCisgIGh3X2F0dGFjaF9hZGRyZXNzIChod19wYXJlbnQgKG1lKSwgMCwKKwkJICAgICBhdHRhY2hfc3BhY2UsIGF0dGFjaF9hZGRyZXNzLCBhdHRhY2hfc2l6ZSwKKwkJICAgICBtZSk7CisKKyAgaWYoaHdfZmluZF9wcm9wZXJ0eShtZSwgImJhY2tlbmQiKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIqIHZhbHVlID0gaHdfZmluZF9zdHJpbmdfcHJvcGVydHkobWUsICJiYWNrZW5kIik7CisgICAgICBpZighIHN0cmNtcCh2YWx1ZSwgInRjcCIpKQorCWNvbnRyb2xsZXItPmJhY2tlbmQgPSBzaW9fdGNwOworICAgICAgZWxzZSBpZighIHN0cmNtcCh2YWx1ZSwgInN0ZGlvIikpCisJY29udHJvbGxlci0+YmFja2VuZCA9IHNpb19zdGRpbzsKKyAgICAgIGVsc2UKKwlod19hYm9ydChtZSwgImlsbGVnYWwgdmFsdWUgZm9yIGJhY2tlbmQgcGFyYW1ldGVyIGAlcyc6IHVzZSB0Y3Agb3Igc3RkaW8iLCB2YWx1ZSk7CisgICAgfQorCisgIGNvbnRyb2xsZXItPmJhc2VfYWRkcmVzcyA9IGF0dGFjaF9hZGRyZXNzOworfQorCisKK3N0YXRpYyB2b2lkCit0eDM5MDRzaW9fZmluaXNoIChzdHJ1Y3QgaHcgKm1lKQoreworICBzdHJ1Y3QgdHgzOTA0c2lvICpjb250cm9sbGVyOworCisgIGNvbnRyb2xsZXIgPSBIV19aQUxMT0MgKG1lLCBzdHJ1Y3QgdHgzOTA0c2lvKTsKKyAgc2V0X2h3X2RhdGEgKG1lLCBjb250cm9sbGVyKTsKKyAgc2V0X2h3X2lvX3JlYWRfYnVmZmVyIChtZSwgdHgzOTA0c2lvX2lvX3JlYWRfYnVmZmVyKTsKKyAgc2V0X2h3X2lvX3dyaXRlX2J1ZmZlciAobWUsIHR4MzkwNHNpb19pb193cml0ZV9idWZmZXIpOworICBzZXRfaHdfcG9ydHMgKG1lLCB0eDM5MDRzaW9fcG9ydHMpOworICBzZXRfaHdfcG9ydF9ldmVudCAobWUsIHR4MzkwNHNpb19wb3J0X2V2ZW50KTsKKworICAvKiBQcmVzZXQgZGVmYXVsdHMgKi8KKyAgY29udHJvbGxlci0+YmFja2VuZCA9IHNpb19zdGRpbzsKKworICAvKiBBdHRhY2ggb3Vyc2VsZiB0byBvdXIgcGFyZW50IGJ1cyAqLworICBhdHRhY2hfdHgzOTA0c2lvX3JlZ3MgKG1lLCBjb250cm9sbGVyKTsKKworICAvKiBJbml0aWFsaXplIHRvIHJlc2V0IHN0YXRlICovCisgIHR4MzkwNHNpb19maWZvX3Jlc2V0KG1lLCAmIGNvbnRyb2xsZXItPnJ4X2ZpZm8pOworICB0eDM5MDRzaW9fZmlmb19yZXNldChtZSwgJiBjb250cm9sbGVyLT50eF9maWZvKTsKKyAgY29udHJvbGxlci0+c2xzciA9IGNvbnRyb2xsZXItPnNkaWNyCisgICAgPSBjb250cm9sbGVyLT5zZGlzciA9IGNvbnRyb2xsZXItPnNmY3IKKyAgICA9IGNvbnRyb2xsZXItPnNiZ3IgPSAwOworICBjb250cm9sbGVyLT5zbGNyID0gMHg0MDAwMDAwMDsgLyogc2V0IFRXVUIgKi8KKyAgY29udHJvbGxlci0+c2JnciA9IDB4MDNmZjAwMDA7IC8qIHNldCBCQ0xLPTMsIEJSRD1GRiAqLworICBjb250cm9sbGVyLT5wb2xsX2V2ZW50ID0gTlVMTDsKK30KKworCisKKy8qIEFuIGV2ZW50IGFycml2ZXMgb24gYW4gaW50ZXJydXB0IHBvcnQgKi8KKworc3RhdGljIHZvaWQKK3R4MzkwNHNpb19wb3J0X2V2ZW50IChzdHJ1Y3QgaHcgKm1lLAorCQkgICAgIGludCBteV9wb3J0LAorCQkgICAgIHN0cnVjdCBodyAqc291cmNlLAorCQkgICAgIGludCBzb3VyY2VfcG9ydCwKKwkJICAgICBpbnQgbGV2ZWwpCit7CisgIHN0cnVjdCB0eDM5MDRzaW8gKmNvbnRyb2xsZXIgPSBod19kYXRhIChtZSk7CisKKyAgc3dpdGNoIChteV9wb3J0KQorICAgIHsKKyAgICBjYXNlIFJFU0VUX1BPUlQ6CisgICAgICB7CisJSFdfVFJBQ0UgKChtZSwgInJlc2V0IikpOworCisJdHgzOTA0c2lvX2ZpZm9fcmVzZXQobWUsICYgY29udHJvbGxlci0+cnhfZmlmbyk7CisJdHgzOTA0c2lvX2ZpZm9fcmVzZXQobWUsICYgY29udHJvbGxlci0+dHhfZmlmbyk7CisJY29udHJvbGxlci0+c2xzciA9IGNvbnRyb2xsZXItPnNkaWNyCisJICA9IGNvbnRyb2xsZXItPnNkaXNyID0gY29udHJvbGxlci0+c2ZjcgorCSAgPSBjb250cm9sbGVyLT5zYmdyID0gMDsKKwljb250cm9sbGVyLT5zbGNyID0gMHg0MDAwMDAwMDsgLyogc2V0IFRXVUIgKi8KKwljb250cm9sbGVyLT5zYmdyID0gMHgwM2ZmMDAwMDsgLyogc2V0IEJDTEs9MywgQlJEPUZGICovCisJLyogRG9uJ3QgaW50ZXJmZXJlIHdpdGggSS9PIHBvbGxlci4gKi8KKwlicmVhazsKKyAgICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBod19hYm9ydCAobWUsICJFdmVudCBvbiB1bmtub3duIHBvcnQgJWQiLCBteV9wb3J0KTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworCisvKiBnZW5lcmljIHJlYWQvd3JpdGUgKi8KKworc3RhdGljIHVuc2lnbmVkCit0eDM5MDRzaW9faW9fcmVhZF9idWZmZXIgKHN0cnVjdCBodyAqbWUsCisJCQkgdm9pZCAqZGVzdCwKKwkJCSBpbnQgc3BhY2UsCisJCQkgdW5zaWduZWRfd29yZCBiYXNlLAorCQkJIHVuc2lnbmVkIG5yX2J5dGVzKQoreworICBzdHJ1Y3QgdHgzOTA0c2lvICpjb250cm9sbGVyID0gaHdfZGF0YSAobWUpOworICB1bnNpZ25lZCBieXRlOworCisgIEhXX1RSQUNFICgobWUsICJyZWFkIDB4JTA4bHggJWQiLCAobG9uZykgYmFzZSwgKGludCkgbnJfYnl0ZXMpKTsKKworICAvKiB0aWNrbGUgZmlmb3MgKi8KKyAgdHgzOTA0c2lvX3RpY2tsZShtZSk7CisKKyAgZm9yIChieXRlID0gMDsgYnl0ZSA8IG5yX2J5dGVzOyBieXRlKyspCisgICAgeworICAgICAgYWRkcmVzc193b3JkIGFkZHJlc3MgPSBiYXNlICsgYnl0ZTsKKyAgICAgIGludCByZWdfbnVtYmVyID0gKGFkZHJlc3MgLSBjb250cm9sbGVyLT5iYXNlX2FkZHJlc3MpIC8gNDsKKyAgICAgIGludCByZWdfb2Zmc2V0ID0gKGFkZHJlc3MgLSBjb250cm9sbGVyLT5iYXNlX2FkZHJlc3MpICUgNDsKKyAgICAgIHVuc2lnbmVkXzQgcmVnaXN0ZXJfdmFsdWU7IC8qIGluIHRhcmdldCBieXRlIG9yZGVyICovCisKKyAgICAgIC8qIGZpbGwgaW4gZW50aXJlIHJlZ2lzdGVyX3ZhbHVlIHdvcmQgKi8KKyAgICAgIHN3aXRjaCAocmVnX251bWJlcikKKwl7CisJY2FzZSBTTENSX1JFRzogcmVnaXN0ZXJfdmFsdWUgPSBjb250cm9sbGVyLT5zbGNyOyBicmVhazsKKwljYXNlIFNMU1JfUkVHOiByZWdpc3Rlcl92YWx1ZSA9IGNvbnRyb2xsZXItPnNsc3I7IGJyZWFrOworCWNhc2UgU0RJQ1JfUkVHOiByZWdpc3Rlcl92YWx1ZSA9IGNvbnRyb2xsZXItPnNkaWNyOyBicmVhazsKKwljYXNlIFNESVNSX1JFRzogcmVnaXN0ZXJfdmFsdWUgPSBjb250cm9sbGVyLT5zZGlzcjsgYnJlYWs7CisJY2FzZSBTRkNSX1JFRzogcmVnaXN0ZXJfdmFsdWUgPSBjb250cm9sbGVyLT5zZmNyOyBicmVhazsKKwljYXNlIFNCR1JfUkVHOiByZWdpc3Rlcl92YWx1ZSA9IGNvbnRyb2xsZXItPnNiZ3I7IGJyZWFrOworCWNhc2UgVEZJRk9fUkVHOiByZWdpc3Rlcl92YWx1ZSA9IDA7IGJyZWFrOworCWNhc2UgU0ZJRk9fUkVHOgorCSAgLyogY29uc3VtZSByeCBmaWZvIGZvciBNUyBieXRlICovCisJICBpZihyZWdfb2Zmc2V0ID09IDAgJiYgdHgzOTA0c2lvX2ZpZm9fbm9uZW1wdHkobWUsICYgY29udHJvbGxlci0+cnhfZmlmbykpCisJICAgIHJlZ2lzdGVyX3ZhbHVlID0gKHR4MzkwNHNpb19maWZvX3BvcChtZSwgJiBjb250cm9sbGVyLT5yeF9maWZvKSA8PCAyNCk7CisJICBlbHNlCisJICAgIHJlZ2lzdGVyX3ZhbHVlID0gMDsKKwkgIGJyZWFrOworCWRlZmF1bHQ6IHJlZ2lzdGVyX3ZhbHVlID0gMDsKKwl9CisKKyAgICAgIC8qIHdyaXRlIHJlcXVlc3RlZCBieXRlIG91dCAqLworICAgICAgcmVnaXN0ZXJfdmFsdWUgPSBIMlRfNChyZWdpc3Rlcl92YWx1ZSk7CisgICAgICAvKiBIV19UUkFDRSAoKG1lLCAiYnl0ZSAlZCAlMDJ4IiwgcmVnX29mZnNldCwgKChjaGFyKikmIHJlZ2lzdGVyX3ZhbHVlKVtyZWdfb2Zmc2V0XSkpOyAqLworICAgICAgbWVtY3B5ICgoY2hhciopIGRlc3QgKyBieXRlLCAoKGNoYXIqKSYgcmVnaXN0ZXJfdmFsdWUpK3JlZ19vZmZzZXQsIDEpOworICAgIH0KKworICByZXR1cm4gbnJfYnl0ZXM7Cit9ICAgICAKKworCisKK3N0YXRpYyB1bnNpZ25lZAordHgzOTA0c2lvX2lvX3dyaXRlX2J1ZmZlciAoc3RydWN0IGh3ICptZSwKKwkJCSAgY29uc3Qgdm9pZCAqc291cmNlLAorCQkJICBpbnQgc3BhY2UsCisJCQkgIHVuc2lnbmVkX3dvcmQgYmFzZSwKKwkJCSAgdW5zaWduZWQgbnJfYnl0ZXMpCit7CisgIHN0cnVjdCB0eDM5MDRzaW8gKmNvbnRyb2xsZXIgPSBod19kYXRhIChtZSk7CisgIHVuc2lnbmVkIGJ5dGU7CisKKyAgSFdfVFJBQ0UgKChtZSwgIndyaXRlIDB4JTA4bHggJWQiLCAobG9uZykgYmFzZSwgKGludCkgbnJfYnl0ZXMpKTsKKyAgZm9yIChieXRlID0gMDsgYnl0ZSA8IG5yX2J5dGVzOyBieXRlKyspCisgICAgeworICAgICAgYWRkcmVzc193b3JkIGFkZHJlc3MgPSBiYXNlICsgYnl0ZTsKKyAgICAgIHVuc2lnbmVkXzEgd3JpdGVfYnl0ZSA9ICgoY29uc3QgdW5zaWduZWQgY2hhciopIHNvdXJjZSlbYnl0ZV07CisgICAgICBpbnQgcmVnX251bWJlciA9IChhZGRyZXNzIC0gY29udHJvbGxlci0+YmFzZV9hZGRyZXNzKSAvIDQ7CisgICAgICBpbnQgcmVnX29mZnNldCA9IDMgLSAoYWRkcmVzcyAtIGNvbnRyb2xsZXItPmJhc2VfYWRkcmVzcykgJSA0OworCisgICAgICAvKiBIV19UUkFDRSAoKG1lLCAiYnl0ZSAlZCAlMDJ4IiwgcmVnX29mZnNldCwgd3JpdGVfYnl0ZSkpOyAqLworCisgICAgICAvKiBmaWxsIGluIGVudGlyZSByZWdpc3Rlcl92YWx1ZSB3b3JkICovCisgICAgICBzd2l0Y2ggKHJlZ19udW1iZXIpCisJeworCWNhc2UgU0xDUl9SRUc6CisJICBTTENSX1NFVF9CWVRFKGNvbnRyb2xsZXIsIHJlZ19vZmZzZXQsIHdyaXRlX2J5dGUpOworCSAgYnJlYWs7CisKKwljYXNlIFNMU1JfUkVHOiAvKiB1bndyaXRlYWJsZSAqLyBicmVhazsKKworCWNhc2UgU0RJQ1JfUkVHOgorCSAgeworCSAgICB1bnNpZ25lZF80IGxhc3RfaW50LCBuZXh0X2ludDsKKwkgICAgCisJICAgIC8qIGRlYXNzZXJ0IGludGVycnVwdCB1cG9uIGNsZWFyICovCisJICAgIGxhc3RfaW50ID0gY29udHJvbGxlci0+c2Rpc3IgJiBjb250cm9sbGVyLT5zZGljcjsKKwkgICAgLyogSFdfVFJBQ0UgKChtZSwgInNkaWNyIC0gc2Rpc3IgJTA4eCBzZGljciAlMDh4IiwKKwkgICAgICAgY29udHJvbGxlci0+c2Rpc3IsIGNvbnRyb2xsZXItPnNkaWNyKSk7ICovCisJICAgIFNESUNSX1NFVF9CWVRFKGNvbnRyb2xsZXIsIHJlZ19vZmZzZXQsIHdyaXRlX2J5dGUpOworCSAgICAvKiBIV19UUkFDRSAoKG1lLCAic2RpY3IgKyBzZGlzciAlMDh4IHNkaWNyICUwOHgiLAorCSAgICAgICBjb250cm9sbGVyLT5zZGlzciwgY29udHJvbGxlci0+c2RpY3IpKTsgKi8KKwkgICAgbmV4dF9pbnQgPSBjb250cm9sbGVyLT5zZGlzciAmIGNvbnRyb2xsZXItPnNkaWNyOworCSAgICAKKwkgICAgaWYoU0RJQ1JfR0VUX1NETUFFKGNvbnRyb2xsZXIpKQorCSAgICAgIGh3X2Fib3J0KG1lLCAiQ2Fubm90IHN1cHBvcnQgRE1BLWRyaXZlbiBzaW8uIik7CisKKwkgICAgaWYofmxhc3RfaW50ICYgbmV4dF9pbnQpIC8qIGFueSBiaXRzIHNldD8gKi8KKwkgICAgICBod19wb3J0X2V2ZW50KG1lLCBJTlRfUE9SVCwgMSk7CisJICAgIGlmKGxhc3RfaW50ICYgfm5leHRfaW50KSAvKiBhbnkgYml0cyBjbGVhcmVkPyAqLworCSAgICAgIGh3X3BvcnRfZXZlbnQobWUsIElOVF9QT1JULCAwKTsKKwkgIH0KKwlicmVhazsKKworCWNhc2UgU0RJU1JfUkVHOgorCSAgeworCSAgICB1bnNpZ25lZF80IGxhc3RfaW50LCBuZXh0X2ludDsKKworCSAgICAvKiBkZWFzc2VydCBpbnRlcnJ1cHQgdXBvbiBjbGVhciAqLworCSAgICBsYXN0X2ludCA9IGNvbnRyb2xsZXItPnNkaXNyICYgY29udHJvbGxlci0+c2RpY3I7CisJICAgIC8qIEhXX1RSQUNFICgobWUsICJzZGlzciAtIHNkaXNyICUwOHggc2RpY3IgJTA4eCIsIAorCSAgICAgICBjb250cm9sbGVyLT5zZGlzciwgY29udHJvbGxlci0+c2RpY3IpKTsgKi8KKwkgICAgU0RJU1JfU0VUX0JZVEUoY29udHJvbGxlciwgcmVnX29mZnNldCwgd3JpdGVfYnl0ZSk7CisJICAgIC8qIEhXX1RSQUNFICgobWUsICJzZGlzciArIHNkaXNyICUwOHggc2RpY3IgJTA4eCIsIAorCSAgICAgICBjb250cm9sbGVyLT5zZGlzciwgY29udHJvbGxlci0+c2RpY3IpKTsgKi8KKwkgICAgbmV4dF9pbnQgPSBjb250cm9sbGVyLT5zZGlzciAmIGNvbnRyb2xsZXItPnNkaWNyOworCisJICAgIGlmKH5sYXN0X2ludCAmIG5leHRfaW50KSAvKiBhbnkgYml0cyBzZXQ/ICovCisJICAgICAgaHdfcG9ydF9ldmVudChtZSwgSU5UX1BPUlQsIDEpOworCSAgICBpZihsYXN0X2ludCAmIH5uZXh0X2ludCkgLyogYW55IGJpdHMgY2xlYXJlZD8gKi8KKwkgICAgICBod19wb3J0X2V2ZW50KG1lLCBJTlRfUE9SVCwgMCk7CisJICB9CisJYnJlYWs7CisJCisJY2FzZSBTRkNSX1JFRzoKKwkgIFNGQ1JfU0VUX0JZVEUoY29udHJvbGxlciwgcmVnX29mZnNldCwgd3JpdGVfYnl0ZSk7CisJICBpZihTRkNSX0dFVF9GUlNURShjb250cm9sbGVyKSkKKwkgICAgeworCSAgICAgIGlmKFNGQ1JfR0VUX1RGUlNUKGNvbnRyb2xsZXIpKSB0eDM5MDRzaW9fZmlmb19yZXNldChtZSwgJiBjb250cm9sbGVyLT50eF9maWZvKTsKKwkgICAgICBpZihTRkNSX0dFVF9SRlJTVChjb250cm9sbGVyKSkgdHgzOTA0c2lvX2ZpZm9fcmVzZXQobWUsICYgY29udHJvbGxlci0+cnhfZmlmbyk7CisJICAgIH0KKwkgIGJyZWFrOworCSAgCisJY2FzZSBTQkdSX1JFRzoKKwkgIFNCR1JfU0VUX0JZVEUoY29udHJvbGxlciwgcmVnX29mZnNldCwgd3JpdGVfYnl0ZSk7CisJICBicmVhazsKKwkgIAorCWNhc2UgU0ZJRk9fUkVHOiAvKiB1bndyaXRlYWJsZSAqLyBicmVhazsKKwkgIAorCWNhc2UgVEZJRk9fUkVHOiAKKwkgIGlmKHJlZ19vZmZzZXQgPT0gMykgLyogZmlyc3QgYnl0ZSAqLworCSAgICB0eDM5MDRzaW9fZmlmb19wdXNoKG1lLCAmIGNvbnRyb2xsZXItPnR4X2ZpZm8sIHdyaXRlX2J5dGUpOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OiAKKwkgIEhXX1RSQUNFICgobWUsICJ3cml0ZSB0byBpbGxlZ2FsIHJlZ2lzdGVyICVkIiwgcmVnX251bWJlcikpOworCX0KKyAgICB9IC8qIGxvb3Agb3ZlciBieXRlcyAqLworCisgIC8qIHRpY2tsZSBmaWZvcyAqLworICB0eDM5MDRzaW9fdGlja2xlKG1lKTsKKworICByZXR1cm4gbnJfYnl0ZXM7Cit9ICAgICAKKworCisKKworCisKKy8qIFNlbmQgZW5xdWV1ZWQgY2hhcmFjdGVycyBmcm9tIHR4X2ZpZm8gYW5kIHRyaWdnZXIgVFggaW50ZXJydXB0LgorUmVjZWl2ZSBjaGFyYWN0ZXJzIGludG8gcnhfZmlmbyBhbmQgdHJpZ2dlciBSWCBpbnRlcnJ1cHQuICovCit2b2lkCit0eDM5MDRzaW9fdGlja2xlKHN0cnVjdCBodyAqbWUpCit7CisgIHN0cnVjdCB0eDM5MDRzaW8qIGNvbnRyb2xsZXIgPSBod19kYXRhKG1lKTsKKyAgaW50IGM7CisgIGNoYXIgY2M7CisgIHVuc2lnbmVkXzQgbGFzdF9pbnQsIG5leHRfaW50OworCisgIC8qIEhXX1RSQUNFICgobWUsICJ0aWNrbGUgYmFja2VuZDogJTAyeCIsIGNvbnRyb2xsZXItPmJhY2tlbmQpKTsgKi8KKyAgc3dpdGNoKGNvbnRyb2xsZXItPmJhY2tlbmQpIAorICAgIHsKKyAgICBjYXNlIHNpb190Y3A6CisKKyAgICAgIHdoaWxlKHR4MzkwNHNpb19maWZvX25vbmVtcHR5KG1lLCAmIGNvbnRyb2xsZXItPnR4X2ZpZm8pKQorCXsKKwkgIGNjID0gdHgzOTA0c2lvX2ZpZm9fcG9wKG1lLCAmIGNvbnRyb2xsZXItPnR4X2ZpZm8pOworCSAgZHZfc29ja3Nlcl93cml0ZShod19zeXN0ZW0obWUpLCBjYyk7CisJICBIV19UUkFDRSAoKG1lLCAidGNwIG91dHB1dDogJTAyeCIsIGNjKSk7CisJfQorCisgICAgICBjID0gZHZfc29ja3Nlcl9yZWFkKGh3X3N5c3RlbShtZSkpOworICAgICAgd2hpbGUoYyAhPSAtMSkKKwl7CisJICBjYyA9IChjaGFyKSBjOworCSAgSFdfVFJBQ0UgKChtZSwgInRjcCBpbnB1dDogJTAyeCIsIGNjKSk7CisJICB0eDM5MDRzaW9fZmlmb19wdXNoKG1lLCAmIGNvbnRyb2xsZXItPnJ4X2ZpZm8sIGNjKTsKKwkgIGMgPSBkdl9zb2Nrc2VyX3JlYWQoaHdfc3lzdGVtKG1lKSk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHNpb19zdGRpbzoKKworICAgICAgd2hpbGUodHgzOTA0c2lvX2ZpZm9fbm9uZW1wdHkobWUsICYgY29udHJvbGxlci0+dHhfZmlmbykpCisJeworCSAgY2MgPSB0eDM5MDRzaW9fZmlmb19wb3AobWUsICYgY29udHJvbGxlci0+dHhfZmlmbyk7CisJICBzaW1faW9fd3JpdGVfc3Rkb3V0KGh3X3N5c3RlbShtZSksICYgY2MsIDEpOworCSAgc2ltX2lvX2ZsdXNoX3N0ZG91dChod19zeXN0ZW0obWUpKTsKKwkgIEhXX1RSQUNFICgobWUsICJzdGRpbyBvdXRwdXQ6ICUwMngiLCBjYykpOworCX0KKworICAgICAgYyA9IHNpbV9pb19wb2xsX3JlYWQoaHdfc3lzdGVtKG1lKSwgMCAvKiBzdGRpbiAqLywgJiBjYywgMSk7CisgICAgICB3aGlsZShjID09IDEpCisJeworCSAgSFdfVFJBQ0UgKChtZSwgInN0ZGlvIGlucHV0OiAlMDJ4IiwgY2MpKTsKKwkgIHR4MzkwNHNpb19maWZvX3B1c2gobWUsICYgY29udHJvbGxlci0+cnhfZmlmbywgY2MpOworCSAgYyA9IHNpbV9pb19wb2xsX3JlYWQoaHdfc3lzdGVtKG1lKSwgMCAvKiBzdGRpbiAqLywgJiBjYywgMSk7CisJfQorCisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBod19hYm9ydChtZSwgIklsbGVnYWwgYmFja2VuZCBtb2RlOiAlZCIsIGNvbnRyb2xsZXItPmJhY2tlbmQpOworICAgIH0KKworICAvKiBVcGRhdGUgUkRJUyAvIFRESVMgZmxhZ3MgKi8KKyAgbGFzdF9pbnQgPSBjb250cm9sbGVyLT5zZGlzciAmIGNvbnRyb2xsZXItPnNkaWNyOworICAvKiBIV19UUkFDRSAoKG1lLCAidGlja2xlIC0gc2Rpc3IgJTA4eCBzZGljciAlMDh4IiwgY29udHJvbGxlci0+c2Rpc3IsIGNvbnRyb2xsZXItPnNkaWNyKSk7ICovCisgIGlmKHR4MzkwNHNpb19maWZvX25vbmVtcHR5KG1lLCAmIGNvbnRyb2xsZXItPnJ4X2ZpZm8pKQorICAgIFNESVNSX1NFVF9SRElTKGNvbnRyb2xsZXIpOworICBpZighIHR4MzkwNHNpb19maWZvX25vbmVtcHR5KG1lLCAmIGNvbnRyb2xsZXItPnR4X2ZpZm8pKQorICAgIFNESVNSX1NFVF9URElTKGNvbnRyb2xsZXIpOworICBuZXh0X2ludCA9IGNvbnRyb2xsZXItPnNkaXNyICYgY29udHJvbGxlci0+c2RpY3I7CisgIC8qIEhXX1RSQUNFICgobWUsICJ0aWNrbGUgKyBzZGlzciAlMDh4IHNkaWNyICUwOHgiLCBjb250cm9sbGVyLT5zZGlzciwgY29udHJvbGxlci0+c2RpY3IpKTsgKi8KKworICBpZih+bGFzdF9pbnQgJiBuZXh0X2ludCkgLyogYW55IGJpdHMgc2V0PyAqLworICAgIGh3X3BvcnRfZXZlbnQobWUsIElOVF9QT1JULCAxKTsKKyAgaWYobGFzdF9pbnQgJiB+bmV4dF9pbnQpIC8qIGFueSBiaXRzIGNsZWFyZWQ/ICovCisgICAgaHdfcG9ydF9ldmVudChtZSwgSU5UX1BPUlQsIDApOworCisgIC8qIEFkZCBwZXJpb2RpYyBwb2xsaW5nIGZvciB0aGlzIHBvcnQsIGlmIGl0J3Mgbm90IGFscmVhZHkgZ29pbmcuICovCisgIGlmKGNvbnRyb2xsZXItPnBvbGxfZXZlbnQgPT0gTlVMTCkKKyAgICB7CisgICAgICBjb250cm9sbGVyLT5wb2xsX2V2ZW50ID0gaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUgKG1lLCAxMDAwLAorCQkJCQkJCXR4MzkwNHNpb19wb2xsLCBOVUxMKTsKKworICAgIH0KK30KKworCisKKworaW50Cit0eDM5MDRzaW9fZmlmb19ub25lbXB0eShzdHJ1Y3QgaHcqIG1lLCBzdHJ1Y3QgdHgzOTA0c2lvX2ZpZm8qIGZpZm8pCit7CisgIC8qIEhXX1RSQUNFICgobWUsICJmaWZvIHVzZWQ6ICVkIiwgZmlmby0+dXNlZCkpOyAqLworICByZXR1cm4oZmlmby0+dXNlZCA+IDApOworfQorCisKK2NoYXIKK3R4MzkwNHNpb19maWZvX3BvcChzdHJ1Y3QgaHcqIG1lLCBzdHJ1Y3QgdHgzOTA0c2lvX2ZpZm8qIGZpZm8pCit7CisgIGNoYXIgaXQ7CisgIEFTU0VSVChmaWZvLT51c2VkID4gMCk7CisgIEFTU0VSVChmaWZvLT5idWZmZXIgIT0gTlVMTCk7CisgIGl0ID0gZmlmby0+YnVmZmVyWzBdOworICBtZW1jcHkoJiBmaWZvLT5idWZmZXJbMF0sICYgZmlmby0+YnVmZmVyWzFdLCBmaWZvLT51c2VkIC0gMSk7CisgIGZpZm8tPnVzZWQgLS07CisgIC8qIEhXX1RSQUNFICgobWUsICJwb3AgZmlmbyAtPiAlMDJ4IiwgaXQpKTsgKi8KKyAgcmV0dXJuIGl0OworfQorCisKK3ZvaWQKK3R4MzkwNHNpb19maWZvX3B1c2goc3RydWN0IGh3KiBtZSwgc3RydWN0IHR4MzkwNHNpb19maWZvKiBmaWZvLCBjaGFyIGl0KQoreworICAvKiBIV19UUkFDRSAoKG1lLCAicHVzaCAlMDJ4IC0+IGZpZm8iLCBpdCkpOyAqLworICBpZihmaWZvLT5zaXplID09IGZpZm8tPnVzZWQpIC8qIGZ1bGwgKi8KKyAgICB7CisgICAgICBpbnQgbmV4dF9zaXplID0gZmlmby0+c2l6ZSAqIDIgKyAxNjsKKyAgICAgIGNoYXIqIG5leHRfYnVmID0gemFsbG9jKG5leHRfc2l6ZSk7CisgICAgICBtZW1jcHkobmV4dF9idWYsIGZpZm8tPmJ1ZmZlciwgZmlmby0+dXNlZCk7CisKKyAgICAgIGlmKGZpZm8tPmJ1ZmZlciAhPSBOVUxMKSB6ZnJlZShmaWZvLT5idWZmZXIpOworICAgICAgZmlmby0+YnVmZmVyID0gbmV4dF9idWY7CisgICAgICBmaWZvLT5zaXplID0gbmV4dF9zaXplOworICAgIH0KKworICBmaWZvLT5idWZmZXJbZmlmby0+dXNlZF0gPSBpdDsKKyAgZmlmby0+dXNlZCArKzsKK30KKworCit2b2lkCit0eDM5MDRzaW9fZmlmb19yZXNldChzdHJ1Y3QgaHcqIG1lLCBzdHJ1Y3QgdHgzOTA0c2lvX2ZpZm8qIGZpZm8pCit7CisgIC8qIEhXX1RSQUNFICgobWUsICJyZXNldCBmaWZvIikpOyAqLworICBmaWZvLT51c2VkID0gMDsKKyAgZmlmby0+c2l6ZSA9IDA7CisgIHpmcmVlKGZpZm8tPmJ1ZmZlcik7CisgIGZpZm8tPmJ1ZmZlciA9IDA7Cit9CisKKwordm9pZAordHgzOTA0c2lvX3BvbGwoc3RydWN0IGh3KiBtZSwgdm9pZCogaWdub3JlZCkKK3sKKyAgc3RydWN0IHR4MzkwNHNpbyogY29udHJvbGxlciA9IGh3X2RhdGEgKG1lKTsKKyAgdHgzOTA0c2lvX3RpY2tsZSAobWUpOworICBod19ldmVudF9xdWV1ZV9kZXNjaGVkdWxlIChtZSwgY29udHJvbGxlci0+cG9sbF9ldmVudCk7CisgIGNvbnRyb2xsZXItPnBvbGxfZXZlbnQgPSBod19ldmVudF9xdWV1ZV9zY2hlZHVsZSAobWUsIDEwMDAsCisJCQkJCQkgICAgdHgzOTA0c2lvX3BvbGwsIE5VTEwpOworfQorCisKKworY29uc3Qgc3RydWN0IGh3X2Rlc2NyaXB0b3IgZHZfdHgzOTA0c2lvX2Rlc2NyaXB0b3JbXSA9IHsKKyAgeyAidHgzOTA0c2lvIiwgdHgzOTA0c2lvX2ZpbmlzaCwgfSwKKyAgeyBOVUxMIH0sCit9OwpkaWZmIC0tZ2l0IGEvc2ltL21pcHMvZHYtdHgzOTA0dG1yLmMgYi9zaW0vbWlwcy9kdi10eDM5MDR0bXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWM3YjhjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL21pcHMvZHYtdHgzOTA0dG1yLmMKQEAgLTAsMCArMSw2OTggQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICAgCisgICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICAgIAorICAgICovCisKKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAiaHctbWFpbi5oIgorCisKKy8qIERFVklDRQorCisgICAKKyAgIHR4MzkwNHRtciAtIHR4MzkwNCB0aW1lcgorCisgICAKKyAgIERFU0NSSVBUSU9OCisKKyAgIAorICAgSW1wbGVtZW50cyBvbmUgdHgzOTA0IHRpbWVyL2NvdW50ZXIgZGVzY3JpYmVkIGluIHRoZSB0eDM5MDQKKyAgIHVzZXIgZ3VpZGUuICBUaHJlZSBpbnN0YW5jZXMgYXJlIHJlcXVpcmVkIGZvciBUTVIwLCBUTVIxLCBhbmQKKyAgIFRNUjMgd2l0aGluIHRoZSB0eDM5MDQsIGF0IGRpZmZlcmVudCBiYXNlIGFkZHJlc3Nlcy4gIAorCisgICBCb3RoIGludGVybmFsIGFuZCBzeXN0ZW0gY2xvY2tzIGFyZSBzeW50aGVzaXplZCBhcyBkaXZpZGVkIHZlcnNpb25zCisgICBvZiB0aGUgc2ltdWxhdG9yIGNsb2NrLgorICAgCisgICBUaGVyZSBpcyBubyBzdXBwb3J0IGZvcjoKKyAgICAtIGVkZ2Ugc2Vuc2l0aXZpdHkgb2YgZXh0ZXJuYWwgY2xvY2sKKyAgICAtIGRpZmZlcmVudCBtb2RlIHJlc3RyaWN0aW9ucyBmb3IgVE1SMC4uMgorICAgIC0gbGV2ZWwgaW50ZXJydXB0cyAoaW50ZXJydXB0cyBhcmUgdHJlYXRlZCBhcyBldmVudHMgdGhhdCBvY2N1ciBhdCBlZGdlcykKKworCisKKyAgIFBST1BFUlRJRVMKKworCisgICByZWcgPGJhc2U+IDxsZW5ndGg+CisKKyAgIEJhc2Ugb2YgVE1SIGNvbnRyb2wgcmVnaXN0ZXIgYmFuay4gIDxsZW5ndGg+IG11c3QgZXF1YWwgMHgxMDAuCisgICBSZWdpc3RlciBvZmZzZXRzOiAgICAgICAwOiBUQ1I6IHRpbWVyIGNvbnRyb2wgIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICA0OiBUSVNSOiB0aW1lciBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICA4OiBDUFJBOiBjb21wYXJlIHJlZ2lzdGVyIEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMTI6IENQUkI6IGNvbXBhcmUgcmVnaXN0ZXIgQgorICAgICAgICAgICAgICAgICAgICAgICAgICAxNjogSVRNUjogaW50ZXJ2YWwgdGltZXIgbW9kZSByZWdpc3RlcgorCQkJICAzMjogQ0NEUjogZGl2aWRlciByZWdpc3RlcgorCQkJICA0ODogUE1HUjogcHVsc2UgZ2VuZXJhdG9yIG1vZGUgcmVnaXN0ZXIKKwkJCSAgNjQ6IFdUTVI6IHdhdGNoZG9nIHRpbWVyIG1vZGUgcmVnaXN0ZXIKKwkJCSAyNDA6IFRSUjogdGltZXIgcmVhZCByZWdpc3RlcgorCisKKyAgIGNsb2NrIDx0aWNrcz4KKworICAgUmF0ZSBvZiB0aW1lciBjbG9jayBzaWduYWwuICBUaGlzIG51bWJlciBpcyB0aGUgbnVtYmVyIG9mIHNpbXVsYXRvcgorICAgdGlja3MgcGVyIGNsb2NrIHNpZ25hbCB0aWNrLiAgRGVmYXVsdCAxLgorCisgICAKKyAgIGV4dCA8dGlja3M+CisKKyAgIFJhdGUgb2YgImV4dGVybmFsIGlucHV0IGNsb2NrIHNpZ25hbCIsIHRoZSBvdGhlciBjbG9jayBpbnB1dCBvZiB0aGUKKyAgIHRpbWVyLiAgSXQgdXNlcyB0aGUgc2FtZSBzY2FsZSBhcyBhYm92ZS4gIERlZmF1bHQgMTAwLgorCisKKworICAgUE9SVFMKKworCisgICBpbnQgKG91dHB1dCkKKworICAgSW50ZXJydXB0IHBvcnQuICBBbiBldmVudCBpcyBnZW5lcmF0ZWQgd2hlbiBhIHRpbWVyIGludGVycnVwdAorICAgb2NjdXJzLgorCisKKyAgIGZmIChvdXRwdXQpCisKKyAgIEZsaXAtZmxvcCBvdXRwdXQsIGNvcnJlc3BvbmRzIHRvIHRoZSBUTUZGT1VUIHBvcnQuICBBbiBldmVudCBpcworICAgZ2VuZXJhdGVkIHdoZW4gZmxpcC1mbG9wIGNoYW5nZXMgdmFsdWUuICBUaGUgaW50ZWdlciBhc3NvY2lhdGVkCisgICB3aXRoIHRoZSBldmVudCBpcyAxLzAgYWNjb3JkaW5nIHRvIGZsaXAtZmxvcCB2YWx1ZS4KKworCisgICByZXNldCAoaW5wdXQpCisKKyAgIFJlc2V0IHBvcnQuCisKKyAgICovCisKKworCisvKiBzdGF0aWMgZnVuY3Rpb25zICovCisKK3N0YXRpYyB2b2lkIGRlbGl2ZXJfdHgzOTA0dG1yX3RpY2sgKHN0cnVjdCBodyAqbWUsIHZvaWQgKmRhdGEpOworCisKKy8qIHJlZ2lzdGVyIG51bWJlcnM7IGVhY2ggaXMgb25lIHdvcmQgbG9uZyAqLworZW51bSAKK3sKKyAgVENSX1JFRyA9IDAsCisgIFRJU1JfUkVHID0gMSwKKyAgQ1BSQV9SRUcgPSAyLAorICBDUFJCX1JFRyA9IDMsCisgIElUTVJfUkVHID0gNCwKKyAgQ0NEUl9SRUcgPSA4LAorICBQTUdSX1JFRyA9IDEyLAorICBXVE1SX1JFRyA9IDE2LAorICBUUlJfUkVHID0gNjAKK307CisKKworCisvKiBwb3J0IElEJ3MgKi8KKworZW51bQorIHsKKyAgUkVTRVRfUE9SVCwKKyAgSU5UX1BPUlQsCisgIEZGX1BPUlQKK307CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod19wb3J0X2Rlc2NyaXB0b3IgdHgzOTA0dG1yX3BvcnRzW10gPSAKK3sKKyAgeyAiaW50IiwgSU5UX1BPUlQsIDAsIG91dHB1dF9wb3J0LCB9LAorICB7ICJmZiIsIEZGX1BPUlQsIDAsIG91dHB1dF9wb3J0LCB9LAorICB7ICJyZXNldCIsIFJFU0VUX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgTlVMTCwgfSwKK307CisKKworCisvKiBUaGUgdGltZXIvY291bnRlciByZWdpc3RlciBpbnRlcm5hbCBzdGF0ZS4gIE5vdGUgdGhhdCB3ZSBzdG9yZQorICAgc3RhdGUgdXNpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgaW1hZ2VzLCBpbiBob3N0IGVuZGlhbiBvcmRlci4gKi8KKworc3RydWN0IHR4MzkwNHRtciB7CisgIGFkZHJlc3Nfd29yZCBiYXNlX2FkZHJlc3M7IC8qIGNvbnRyb2wgcmVnaXN0ZXIgYmFzZSAqLworICB1bnNpZ25lZF80IGNsb2NrX3RpY2tzLCBleHRfdGlja3M7IC8qIGNsb2NrIGZyZXF1ZW5jaWVzICovCisgIHNpZ25lZF84IGxhc3RfdGlja3M7IC8qIHRpbWUgYXQgbGFzdCBkZWxpdmVyXypfdGljayBjYWxsICovCisgIHNpZ25lZF84IHJvdW5kb2ZmX3RpY2tzOyAvKiBzaW0gdGlja3MgdW5wcm9jZXNzZWQgZHVyaW5nIGxhc3QgdGljayBjYWxsICovCisgIGludCBmZjsgLyogcHVsc2UgZ2VuZXJhdG9yIGZsaXAtZmxvcCB2YWx1ZTogMS8wICovCisgIHN0cnVjdCBod19ldmVudCogZXZlbnQ7IC8qIGxhc3Qgc2NoZWR1bGVkIGV2ZW50ICovCisKKyAgdW5zaWduZWRfNCB0Y3I7CisjZGVmaW5lIEdFVF9UQ1JfVENFKGMpICAgICAgKCgoYyktPnRjciAmIDB4ODApID4+IDcpCisjZGVmaW5lIEdFVF9UQ1JfQ0NERShjKSAgICAgKCgoYyktPnRjciAmIDB4NDApID4+IDYpCisjZGVmaW5lIEdFVF9UQ1JfQ1JFKGMpICAgICAgKCgoYyktPnRjciAmIDB4MjApID4+IDUpCisjZGVmaW5lIEdFVF9UQ1JfQ0NTKGMpICAgICAgKCgoYyktPnRjciAmIDB4MDQpID4+IDIpCisjZGVmaW5lIEdFVF9UQ1JfVE1PREUoYykgICAgKCgoYyktPnRjciAmIDB4MDMpID4+IDApCisgIHVuc2lnbmVkXzQgdGlzcjsKKyNkZWZpbmUgU0VUX1RJU1JfVFdJUyhjKSAgICAoKGMpLT50aXNyIHw9IDB4MDgpCisjZGVmaW5lIFNFVF9USVNSX1RQSUJTKGMpICAgKChjKS0+dGlzciB8PSAweDA0KQorI2RlZmluZSBTRVRfVElTUl9UUElBUyhjKSAgICgoYyktPnRpc3IgfD0gMHgwMikKKyNkZWZpbmUgU0VUX1RJU1JfVElJUyhjKSAgICAoKGMpLT50aXNyIHw9IDB4MDEpCisgIHVuc2lnbmVkXzQgY3ByYTsKKyAgdW5zaWduZWRfNCBjcHJiOworICB1bnNpZ25lZF80IGl0bXI7CisjZGVmaW5lIEdFVF9JVE1SX1RJSUUoYykgICAgKCgoYyktPml0bXIgJiAweDgwMDApID4+IDE1KQorI2RlZmluZSBTRVRfSVRNUl9USUlFKGMsdikgIEJMSVQzMigoYyktPml0bXIsIDE1LCAodikgPyAxIDogMCkKKyNkZWZpbmUgR0VUX0lUTVJfVFpDRShjKSAgICAoKChjKS0+aXRtciAmIDB4MDAwMSkgPj4gMCkKKyNkZWZpbmUgU0VUX0lUTVJfVFpDRShjLHYpICBCTElUMzIoKGMpLT5pdG1yLCAwLCAodikgPyAxIDogMCkKKyAgdW5zaWduZWRfNCBjY2RyOworI2RlZmluZSBHRVRfQ0NEUl9DRFIoYykgICAgICgoKGMpLT5jY2RyICYgMHgwNykgPj4gMCkKKyAgdW5zaWduZWRfNCBwbWdyOworI2RlZmluZSBHRVRfUE1HUl9UUElCRShjKSAgICgoKGMpLT5wbWdyICYgMHg4MDAwKSA+PiAxNSkKKyNkZWZpbmUgU0VUX1BNR1JfVFBJQkUoYyx2KSBCTElUMzIoKGMpLT5wbWdyLCAxNSwgKHYpID8gMSA6IDApCisjZGVmaW5lIEdFVF9QTUdSX1RQSUFFKGMpICAgKCgoYyktPnBtZ3IgJiAweDQwMDApID4+IDE0KQorI2RlZmluZSBTRVRfUE1HUl9UUElBRShjLHYpIEJMSVQzMigoYyktPnBtZ3IsIDE0LCAodikgPyAxIDogMCkKKyNkZWZpbmUgR0VUX1BNR1JfRkZJKGMpICAgICAoKChjKS0+cG1nciAmIDB4MDAwMSkgPj4gMCkKKyNkZWZpbmUgU0VUX1BNR1JfRkZJKGMsdikgICBCTElUMzIoKGMpLT5wbWdyLCAwLCAodikgPyAxIDogMCkKKyAgdW5zaWduZWRfNCB3dG1yOworI2RlZmluZSBHRVRfV1RNUl9UV0lFKGMpICAgICgoKGMpLT53dG1yICYgMHg4MDAwKSA+PiAxNSkKKyNkZWZpbmUgU0VUX1dUTVJfVFdJRShjLHYpICBCTElUMzIoKGMpLT53dG1yLCAxNSwgKHYpID8gMSA6IDApCisjZGVmaW5lIEdFVF9XVE1SX1dESVMoYykgICAgKCgoYyktPnd0bXIgJiAweDAwODApID4+IDcpCisjZGVmaW5lIFNFVF9XVE1SX1dESVMoYyx2KSAgQkxJVDMyKChjKS0+d3RtciwgNywgKHYpID8gMSA6IDApCisjZGVmaW5lIEdFVF9XVE1SX1RXQyhjKSAgICAgKCgoYyktPnd0bXIgJiAweDAwMDEpID4+IDApCisjZGVmaW5lIFNFVF9XVE1SX1RXQyhjLHYpICAgQkxJVDMyKChjKS0+d3RtciwgMCwgKHYpID8gMSA6IDApCisgIHVuc2lnbmVkXzQgdHJyOworfTsKKworCisKKy8qIEZpbmlzaCBvZmYgdGhlIHBhcnRpYWxseSBjcmVhdGVkIGh3IGRldmljZS4gIEF0dGFjaCBvdXIgbG9jYWwKKyAgIGNhbGxiYWNrcy4gIFdpcmUgdXAgb3VyIHBvcnQgbmFtZXMgZXRjICovCisKK3N0YXRpYyBod19pb19yZWFkX2J1ZmZlcl9tZXRob2QgdHgzOTA0dG1yX2lvX3JlYWRfYnVmZmVyOworc3RhdGljIGh3X2lvX3dyaXRlX2J1ZmZlcl9tZXRob2QgdHgzOTA0dG1yX2lvX3dyaXRlX2J1ZmZlcjsKK3N0YXRpYyBod19wb3J0X2V2ZW50X21ldGhvZCB0eDM5MDR0bXJfcG9ydF9ldmVudDsKKworc3RhdGljIHZvaWQKK2F0dGFjaF90eDM5MDR0bXJfcmVncyAoc3RydWN0IGh3ICptZSwKKwkJICAgICAgc3RydWN0IHR4MzkwNHRtciAqY29udHJvbGxlcikKK3sKKyAgdW5zaWduZWRfd29yZCBhdHRhY2hfYWRkcmVzczsKKyAgaW50IGF0dGFjaF9zcGFjZTsKKyAgdW5zaWduZWQgYXR0YWNoX3NpemU7CisgIHJlZ19wcm9wZXJ0eV9zcGVjIHJlZzsKKworICBpZiAoaHdfZmluZF9wcm9wZXJ0eSAobWUsICJyZWciKSA9PSBOVUxMKQorICAgIGh3X2Fib3J0IChtZSwgIk1pc3NpbmcgXCJyZWdcIiBwcm9wZXJ0eSIpOworCisgIGlmICghaHdfZmluZF9yZWdfYXJyYXlfcHJvcGVydHkgKG1lLCAicmVnIiwgMCwgJnJlZykpCisgICAgaHdfYWJvcnQgKG1lLCAiXCJyZWdcIiBwcm9wZXJ0eSBtdXN0IGNvbnRhaW4gb25lIGFkZHIvc2l6ZSBlbnRyeSIpOworCisgIGh3X3VuaXRfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyAoaHdfcGFyZW50IChtZSksCisJCQkJICAgICAmcmVnLmFkZHJlc3MsCisJCQkJICAgICAmYXR0YWNoX3NwYWNlLAorCQkJCSAgICAgJmF0dGFjaF9hZGRyZXNzLAorCQkJCSAgICAgbWUpOworICBod191bml0X3NpemVfdG9fYXR0YWNoX3NpemUgKGh3X3BhcmVudCAobWUpLAorCQkJICAgICAgICZyZWcuc2l6ZSwKKwkJCSAgICAgICAmYXR0YWNoX3NpemUsIG1lKTsKKworICBod19hdHRhY2hfYWRkcmVzcyAoaHdfcGFyZW50IChtZSksIDAsCisJCSAgICAgYXR0YWNoX3NwYWNlLCBhdHRhY2hfYWRkcmVzcywgYXR0YWNoX3NpemUsCisJCSAgICAgbWUpOworCisgIGlmKGh3X2ZpbmRfcHJvcGVydHkobWUsICJjbG9jayIpICE9IE5VTEwpCisgICAgY29udHJvbGxlci0+Y2xvY2tfdGlja3MgPSAodW5zaWduZWRfNCkgaHdfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAiY2xvY2siKTsKKworICBpZihod19maW5kX3Byb3BlcnR5KG1lLCAiZXh0IikgIT0gTlVMTCkKKyAgICBjb250cm9sbGVyLT5leHRfdGlja3MgPSAodW5zaWduZWRfNCkgaHdfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAiZXh0Iik7CisKKyAgY29udHJvbGxlci0+YmFzZV9hZGRyZXNzID0gYXR0YWNoX2FkZHJlc3M7Cit9CisKKworc3RhdGljIHZvaWQKK3R4MzkwNHRtcl9maW5pc2ggKHN0cnVjdCBodyAqbWUpCit7CisgIHN0cnVjdCB0eDM5MDR0bXIgKmNvbnRyb2xsZXI7CisKKyAgY29udHJvbGxlciA9IEhXX1pBTExPQyAobWUsIHN0cnVjdCB0eDM5MDR0bXIpOworICBzZXRfaHdfZGF0YSAobWUsIGNvbnRyb2xsZXIpOworICBzZXRfaHdfaW9fcmVhZF9idWZmZXIgKG1lLCB0eDM5MDR0bXJfaW9fcmVhZF9idWZmZXIpOworICBzZXRfaHdfaW9fd3JpdGVfYnVmZmVyIChtZSwgdHgzOTA0dG1yX2lvX3dyaXRlX2J1ZmZlcik7CisgIHNldF9od19wb3J0cyAobWUsIHR4MzkwNHRtcl9wb3J0cyk7CisgIHNldF9od19wb3J0X2V2ZW50IChtZSwgdHgzOTA0dG1yX3BvcnRfZXZlbnQpOworCisgIC8qIFByZXNldCBjbG9jayBkaXZpZGVycyAqLworICBjb250cm9sbGVyLT5jbG9ja190aWNrcyA9IDE7CisgIGNvbnRyb2xsZXItPmV4dF90aWNrcyA9IDEwMDsKKworICAvKiBBdHRhY2ggb3Vyc2VsZiB0byBvdXIgcGFyZW50IGJ1cyAqLworICBhdHRhY2hfdHgzOTA0dG1yX3JlZ3MgKG1lLCBjb250cm9sbGVyKTsKKworICAvKiBJbml0aWFsaXplIHRvIHJlc2V0IHN0YXRlICovCisgIGNvbnRyb2xsZXItPnRjciA9IAorICAgIGNvbnRyb2xsZXItPml0bXIgPQorICAgIGNvbnRyb2xsZXItPmNjZHIgPQorICAgIGNvbnRyb2xsZXItPnBtZ3IgPSAKKyAgICBjb250cm9sbGVyLT53dG1yID0KKyAgICBjb250cm9sbGVyLT50aXNyID0gCisgICAgY29udHJvbGxlci0+dHJyID0gMDsKKyAgY29udHJvbGxlci0+Y3ByYSA9IGNvbnRyb2xsZXItPmNwcmIgPSAweDAwRkZGRkZGOworICBjb250cm9sbGVyLT5mZiA9IDA7CisgIGNvbnRyb2xsZXItPmxhc3RfdGlja3MgPSBjb250cm9sbGVyLT5yb3VuZG9mZl90aWNrcyA9IDA7CisgIGNvbnRyb2xsZXItPmV2ZW50ID0gTlVMTDsKK30KKworCisKKy8qIEFuIGV2ZW50IGFycml2ZXMgb24gYW4gaW50ZXJydXB0IHBvcnQgKi8KKworc3RhdGljIHZvaWQKK3R4MzkwNHRtcl9wb3J0X2V2ZW50IChzdHJ1Y3QgaHcgKm1lLAorCQkgICAgIGludCBteV9wb3J0LAorCQkgICAgIHN0cnVjdCBodyAqc291cmNlLAorCQkgICAgIGludCBzb3VyY2VfcG9ydCwKKwkJICAgICBpbnQgbGV2ZWwpCit7CisgIHN0cnVjdCB0eDM5MDR0bXIgKmNvbnRyb2xsZXIgPSBod19kYXRhIChtZSk7CisKKyAgc3dpdGNoIChteV9wb3J0KQorICAgIHsKKyAgICBjYXNlIFJFU0VUX1BPUlQ6CisgICAgICB7CisJSFdfVFJBQ0UgKChtZSwgInJlc2V0IikpOworCisJLyogcHJlc2V0IGZsaXAtZmxvcCB0byBGRkkgdmFsdWUgKi8KKwljb250cm9sbGVyLT5mZiA9IEdFVF9QTUdSX0ZGSShjb250cm9sbGVyKTsKKworCWNvbnRyb2xsZXItPnRjciA9IAorCSAgY29udHJvbGxlci0+aXRtciA9CisJICBjb250cm9sbGVyLT5jY2RyID0KKwkgIGNvbnRyb2xsZXItPnBtZ3IgPSAKKwkgIGNvbnRyb2xsZXItPnd0bXIgPQorCSAgY29udHJvbGxlci0+dGlzciA9IAorCSAgY29udHJvbGxlci0+dHJyID0gMDsKKwljb250cm9sbGVyLT5jcHJhID0gY29udHJvbGxlci0+Y3ByYiA9IDB4MDBGRkZGRkY7CisJY29udHJvbGxlci0+bGFzdF90aWNrcyA9IGNvbnRyb2xsZXItPnJvdW5kb2ZmX3RpY2tzID0gMDsKKwlpZihjb250cm9sbGVyLT5ldmVudCAhPSBOVUxMKQorCSAgaHdfZXZlbnRfcXVldWVfZGVzY2hlZHVsZShtZSwgY29udHJvbGxlci0+ZXZlbnQpOworCWNvbnRyb2xsZXItPmV2ZW50ID0gTlVMTDsKKwlicmVhazsKKyAgICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICBod19hYm9ydCAobWUsICJFdmVudCBvbiB1bmtub3duIHBvcnQgJWQiLCBteV9wb3J0KTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworCisvKiBnZW5lcmljIHJlYWQvd3JpdGUgKi8KKworc3RhdGljIHVuc2lnbmVkCit0eDM5MDR0bXJfaW9fcmVhZF9idWZmZXIgKHN0cnVjdCBodyAqbWUsCisJCQkgdm9pZCAqZGVzdCwKKwkJCSBpbnQgc3BhY2UsCisJCQkgdW5zaWduZWRfd29yZCBiYXNlLAorCQkJIHVuc2lnbmVkIG5yX2J5dGVzKQoreworICBzdHJ1Y3QgdHgzOTA0dG1yICpjb250cm9sbGVyID0gaHdfZGF0YSAobWUpOworICB1bnNpZ25lZCBieXRlOworCisgIEhXX1RSQUNFICgobWUsICJyZWFkIDB4JTA4bHggJWQiLCAobG9uZykgYmFzZSwgKGludCkgbnJfYnl0ZXMpKTsKKyAgZm9yIChieXRlID0gMDsgYnl0ZSA8IG5yX2J5dGVzOyBieXRlKyspCisgICAgeworICAgICAgYWRkcmVzc193b3JkIGFkZHJlc3MgPSBiYXNlICsgYnl0ZTsKKyAgICAgIGludCByZWdfbnVtYmVyID0gKGFkZHJlc3MgLSBjb250cm9sbGVyLT5iYXNlX2FkZHJlc3MpIC8gNDsKKyAgICAgIGludCByZWdfb2Zmc2V0ID0gMyAtIChhZGRyZXNzIC0gY29udHJvbGxlci0+YmFzZV9hZGRyZXNzKSAlIDQ7CisgICAgICB1bnNpZ25lZF80IHJlZ2lzdGVyX3ZhbHVlOyAvKiBpbiB0YXJnZXQgYnl0ZSBvcmRlciAqLworCisgICAgICAvKiBmaWxsIGluIGVudGlyZSByZWdpc3Rlcl92YWx1ZSB3b3JkICovCisgICAgICBzd2l0Y2ggKHJlZ19udW1iZXIpCisJeworCWNhc2UgVENSX1JFRzogcmVnaXN0ZXJfdmFsdWUgPSBjb250cm9sbGVyLT50Y3I7IGJyZWFrOworCWNhc2UgVElTUl9SRUc6IHJlZ2lzdGVyX3ZhbHVlID0gY29udHJvbGxlci0+dGlzcjsgYnJlYWs7CisJY2FzZSBDUFJBX1JFRzogcmVnaXN0ZXJfdmFsdWUgPSBjb250cm9sbGVyLT5jcHJhOyBicmVhazsKKwljYXNlIENQUkJfUkVHOiByZWdpc3Rlcl92YWx1ZSA9IGNvbnRyb2xsZXItPmNwcmI7IGJyZWFrOworCWNhc2UgSVRNUl9SRUc6IHJlZ2lzdGVyX3ZhbHVlID0gY29udHJvbGxlci0+aXRtcjsgYnJlYWs7CisJY2FzZSBDQ0RSX1JFRzogcmVnaXN0ZXJfdmFsdWUgPSBjb250cm9sbGVyLT5jY2RyOyBicmVhazsKKwljYXNlIFBNR1JfUkVHOiByZWdpc3Rlcl92YWx1ZSA9IGNvbnRyb2xsZXItPnBtZ3I7IGJyZWFrOworCWNhc2UgV1RNUl9SRUc6IHJlZ2lzdGVyX3ZhbHVlID0gY29udHJvbGxlci0+d3RtcjsgYnJlYWs7CisJY2FzZSBUUlJfUkVHOiByZWdpc3Rlcl92YWx1ZSA9IGNvbnRyb2xsZXItPnRycjsgYnJlYWs7CisJZGVmYXVsdDogcmVnaXN0ZXJfdmFsdWUgPSAwOworCX0KKworICAgICAgLyogd3JpdGUgcmVxdWVzdGVkIGJ5dGUgb3V0ICovCisgICAgICBtZW1jcHkgKChjaGFyKikgZGVzdCArIGJ5dGUsICgoY2hhciopJiByZWdpc3Rlcl92YWx1ZSkrcmVnX29mZnNldCwgMSk7CisgICAgfQorCisgIHJldHVybiBucl9ieXRlczsKK30gICAgIAorCisKKworc3RhdGljIHVuc2lnbmVkCit0eDM5MDR0bXJfaW9fd3JpdGVfYnVmZmVyIChzdHJ1Y3QgaHcgKm1lLAorCQkJICBjb25zdCB2b2lkICpzb3VyY2UsCisJCQkgIGludCBzcGFjZSwKKwkJCSAgdW5zaWduZWRfd29yZCBiYXNlLAorCQkJICB1bnNpZ25lZCBucl9ieXRlcykKK3sKKyAgc3RydWN0IHR4MzkwNHRtciAqY29udHJvbGxlciA9IGh3X2RhdGEgKG1lKTsKKyAgdW5zaWduZWQgYnl0ZTsKKworICBIV19UUkFDRSAoKG1lLCAid3JpdGUgMHglMDhseCAlZCIsIChsb25nKSBiYXNlLCAoaW50KSBucl9ieXRlcykpOworICBmb3IgKGJ5dGUgPSAwOyBieXRlIDwgbnJfYnl0ZXM7IGJ5dGUrKykKKyAgICB7CisgICAgICBhZGRyZXNzX3dvcmQgYWRkcmVzcyA9IGJhc2UgKyBieXRlOworICAgICAgdW5zaWduZWRfMSB3cml0ZV9ieXRlID0gKChjb25zdCBjaGFyKikgc291cmNlKVtieXRlXTsKKyAgICAgIGludCByZWdfbnVtYmVyID0gKGFkZHJlc3MgLSBjb250cm9sbGVyLT5iYXNlX2FkZHJlc3MpIC8gNDsKKyAgICAgIGludCByZWdfb2Zmc2V0ID0gMyAtIChhZGRyZXNzIC0gY29udHJvbGxlci0+YmFzZV9hZGRyZXNzKSAlIDQ7CisKKyAgICAgIC8qIGZpbGwgaW4gZW50aXJlIHJlZ2lzdGVyX3ZhbHVlIHdvcmQgKi8KKyAgICAgIHN3aXRjaCAocmVnX251bWJlcikKKwl7CisJY2FzZSBUQ1JfUkVHOgorCSAgaWYocmVnX29mZnNldCA9PSAwKSAvKiBmaXJzdCBieXRlICovCisJICAgIHsKKwkgICAgICAvKiB1cGRhdGUgcmVnaXN0ZXIsIGJ1dCBtYXNrIG91dCBOT1AgYml0cyAqLworCSAgICAgIGNvbnRyb2xsZXItPnRjciA9ICh1bnNpZ25lZF80KSAod3JpdGVfYnl0ZSAmIDB4ZWYpOworCisJICAgICAgLyogUmVzZXQgY291bnRlciB2YWx1ZSBpZiB0aW1lciBzdXNwZW5kZWQgYW5kIENSRSBpcyBzZXQuICovCisJICAgICAgaWYoR0VUX1RDUl9UQ0UoY29udHJvbGxlcikgPT0gMCAmJgorCQkgR0VUX1RDUl9DUkUoY29udHJvbGxlcikgPT0gMSkKKwkJY29udHJvbGxlci0+dHJyID0gMDsKKwkgICAgfQorCSAgLyogSFdfVFJBQ0UgKChtZSwgInRjcjogJTA4bHgiLCAobG9uZykgY29udHJvbGxlci0+dGNyKSk7ICovCisJICBicmVhazsKKworCWNhc2UgSVRNUl9SRUc6CisJICBpZihyZWdfb2Zmc2V0ID09IDEpIC8qIHNlY29uZCBieXRlICovCisJICAgIHsKKwkgICAgICBTRVRfSVRNUl9USUlFKGNvbnRyb2xsZXIsIHdyaXRlX2J5dGUgJiAweDgwKTsKKwkgICAgfQorCSAgZWxzZSBpZihyZWdfb2Zmc2V0ID09IDApIC8qIGZpcnN0IGJ5dGUgKi8KKwkgICAgeworCSAgICAgIFNFVF9JVE1SX1RaQ0UoY29udHJvbGxlciwgd3JpdGVfYnl0ZSAmIDB4MDEpOworCSAgICB9CisJICAvKiBIV19UUkFDRSAoKG1lLCAiaXRtcjogJTA4bHgiLCAobG9uZykgY29udHJvbGxlci0+aXRtcikpOyAqLworCSAgYnJlYWs7CisKKwljYXNlIENDRFJfUkVHOgorCSAgaWYocmVnX29mZnNldCA9PSAwKSAvKiBmaXJzdCBieXRlICovCisJICAgIHsKKwkgICAgICBjb250cm9sbGVyLT5jY2RyID0gd3JpdGVfYnl0ZSAmIDB4MDc7CisJICAgIH0KKwkgIC8qIEhXX1RSQUNFICgobWUsICJjY2RyOiAlMDhseCIsIChsb25nKSBjb250cm9sbGVyLT5jY2RyKSk7ICovCisJICBicmVhazsKKworCWNhc2UgUE1HUl9SRUc6CisJICBpZihyZWdfb2Zmc2V0ID09IDEpIC8qIHNlY29uZCBieXRlICovCisJICAgIHsKKwkgICAgICBTRVRfUE1HUl9UUElCRShjb250cm9sbGVyLCB3cml0ZV9ieXRlICYgMHg4MCk7CisJICAgICAgU0VUX1BNR1JfVFBJQUUoY29udHJvbGxlciwgd3JpdGVfYnl0ZSAmIDB4NDApOworCSAgICB9CisJICBlbHNlIGlmKHJlZ19vZmZzZXQgPT0gMCkgLyogZmlyc3QgYnl0ZSAqLworCSAgICB7CisJICAgICAgU0VUX1BNR1JfRkZJKGNvbnRyb2xsZXIsIHdyaXRlX2J5dGUgJiAweDAxKTsKKwkgICAgfQorCSAgLyogSFdfVFJBQ0UgKChtZSwgInBtZ3I6ICUwOGx4IiwgKGxvbmcpIGNvbnRyb2xsZXItPnBtZ3IpKTsgKi8KKwkgIGJyZWFrOworCisJY2FzZSBXVE1SX1JFRzoKKwkgIGlmKHJlZ19vZmZzZXQgPT0gMSkgLyogc2Vjb25kIGJ5dGUgKi8KKwkgICAgeworCSAgICAgIFNFVF9XVE1SX1RXSUUoY29udHJvbGxlciwgd3JpdGVfYnl0ZSAmIDB4ODApOworCSAgICB9CisJICBlbHNlIGlmKHJlZ19vZmZzZXQgPT0gMCkgLyogZmlyc3QgYnl0ZSAqLworCSAgICB7CisJICAgICAgU0VUX1dUTVJfV0RJUyhjb250cm9sbGVyLCB3cml0ZV9ieXRlICYgMHg4MCk7CisJICAgICAgU0VUX1dUTVJfVFdDKGNvbnRyb2xsZXIsIHdyaXRlX2J5dGUgJiAweDAxKTsKKwkgICAgfQorCSAgLyogSFdfVFJBQ0UgKChtZSwgInd0bXI6ICUwOGx4IiwgKGxvbmcpIGNvbnRyb2xsZXItPnd0bXIpKTsgKi8KKwkgIGJyZWFrOworCisJY2FzZSBUSVNSX1JFRzoKKwkgIGlmKHJlZ19vZmZzZXQgPT0gMCkgLyogZmlyc3QgYnl0ZSAqLworCSAgICB7CisJICAgICAgLyogQWxsIGJpdHMgbXVzdCBiZSB6ZXJvIGluIGdpdmVuIGJ5dGUsIGFjY29yZGluZyB0bworICAgICAgICAgICAgICAgICBzcGVjLiAqLworCisJICAgICAgLyogU2VuZCBhbiAiaW50ZXJydXB0IG9mZiIgZXZlbnQgb24gdGhlIGludGVycnVwdCBwb3J0ICovCisJICAgICAgaWYoY29udHJvbGxlci0+dGlzciAhPSAwKSAvKiBhbnkgaW50ZXJydXB0cyBhY3RpdmU/ICovCisJCXsKKwkJICBod19wb3J0X2V2ZW50KG1lLCBJTlRfUE9SVCwgMCk7CQkgIAorCQl9CisJICAgICAgCisJICAgICAgLyogY2xlYXIgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworCSAgICAgIGNvbnRyb2xsZXItPnRpc3IgPSAwOworCSAgICB9CisJICAvKiBIV19UUkFDRSAoKG1lLCAidGlzcjogJTA4bHgiLCAobG9uZykgY29udHJvbGxlci0+dGlzcikpOyAqLworCSAgYnJlYWs7CisKKwljYXNlIENQUkFfUkVHOgorCSAgaWYocmVnX29mZnNldCA8IDMpIC8qIGZpcnN0LCBzZWNvbmQsIG9yIHRoaXJkIGJ5dGUgKi8KKwkgICAgeworCSAgICAgIE1CTElUMzIoY29udHJvbGxlci0+Y3ByYSwgKHJlZ19vZmZzZXQqOCkrNywgKHJlZ19vZmZzZXQqOCksIHdyaXRlX2J5dGUpOworCSAgICB9CisJICAvKiBIV19UUkFDRSAoKG1lLCAiY3ByYTogJTA4bHgiLCAobG9uZykgY29udHJvbGxlci0+Y3ByYSkpOyAqLworCSAgYnJlYWs7CisKKwljYXNlIENQUkJfUkVHOgorCSAgaWYocmVnX29mZnNldCA8IDMpIC8qIGZpcnN0LCBzZWNvbmQsIG9yIHRoaXJkIGJ5dGUgKi8KKwkgICAgeworCSAgICAgIE1CTElUMzIoY29udHJvbGxlci0+Y3ByYiwgKHJlZ19vZmZzZXQqOCkrNywgKHJlZ19vZmZzZXQqOCksIHdyaXRlX2J5dGUpOworCSAgICB9CisJICAvKiBIV19UUkFDRSAoKG1lLCAiY3ByYjogJTA4bHgiLCAobG9uZykgY29udHJvbGxlci0+Y3ByYikpOyAqLworCSAgYnJlYWs7CisKKwlkZWZhdWx0OiAKKwkgIEhXX1RSQUNFICgobWUsICJ3cml0ZSB0byBpbGxlZ2FsIHJlZ2lzdGVyICVkIiwgcmVnX251bWJlcikpOworCX0KKyAgICB9IC8qIGxvb3Agb3ZlciBieXRlcyAqLworCisgIC8qIFNjaGVkdWxlIGEgdGltZXIgZXZlbnQgaW4gbmVhciBmdXR1cmUsIHNvIHdlIGNhbiBpbmNyZW1lbnQgb3IKKyAgICAgc3RvcCB0aGUgY291bnRlciwgdG8gcmVzcG9uZCB0byByZWdpc3RlciB1cGRhdGVzLiAqLworICBod19ldmVudF9xdWV1ZV9zY2hlZHVsZShtZSwgMSwgZGVsaXZlcl90eDM5MDR0bXJfdGljaywgTlVMTCk7CisKKyAgcmV0dXJuIG5yX2J5dGVzOworfSAgICAgCisKKworCisvKiBEZWxpdmVyIGEgY2xvY2sgdGljayB0byB0aGUgY291bnRlci4gKi8KK3N0YXRpYyB2b2lkCitkZWxpdmVyX3R4MzkwNHRtcl90aWNrIChzdHJ1Y3QgaHcgKm1lLAorCQkJdm9pZCAqZGF0YSkKK3sKKyAgc3RydWN0IHR4MzkwNHRtciAqY29udHJvbGxlciA9IGh3X2RhdGEgKG1lKTsKKyAgU0lNX0RFU0Mgc2QgPSBod19zeXN0ZW0gKG1lKTsKKyAgc2lnbmVkXzggdGhpc190aWNrcyA9IHNpbV9ldmVudHNfdGltZShzZCk7CisKKyAgc2lnbmVkXzggd2FycDsKKyAgc2lnbmVkXzggZGl2aXNvcjsKKyAgc2lnbmVkXzggcXVvdGllbnQsIHJlbWFpbmRlcjsKKworICAvKiBjb21wdXRlIHNpbXVsYXRpb24gdGlja3MgYmV0d2VlbiBsYXN0IHRpY2sgYW5kIHRoaXMgdGljayAqLworICBpZihjb250cm9sbGVyLT5sYXN0X3RpY2tzICE9IDApCisgICAgd2FycCA9IHRoaXNfdGlja3MgLSBjb250cm9sbGVyLT5sYXN0X3RpY2tzICsgY29udHJvbGxlci0+cm91bmRvZmZfdGlja3M7CisgIGVsc2UKKyAgICB7CisgICAgICBjb250cm9sbGVyLT5sYXN0X3RpY2tzID0gdGhpc190aWNrczsgLyogaW5pdGlhbGl6ZSAqLworICAgICAgd2FycCA9IGNvbnRyb2xsZXItPnJvdW5kb2ZmX3RpY2tzOworICAgIH0KKworICBpZihjb250cm9sbGVyLT5ldmVudCAhPSBOVUxMKQorICAgIGh3X2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUobWUsIGNvbnRyb2xsZXItPmV2ZW50KTsKKyAgY29udHJvbGxlci0+ZXZlbnQgPSBOVUxMOworCisgIC8qIENoZWNrIHdoZXRoZXIgdGhlIHRpbWVyIHRpY2tpbmcgaXMgZW5hYmxlZCBhdCB0aGlzIG1vbWVudC4gIFRoaXMKKyAgICAgbGFyZ2VseSBhIGZ1bmN0aW9uIG9mIHRoZSBUQ0UgYml0LCBidXQgaXMgYWxzbyBzbGlnaHRseQorICAgICBtb2RlLWRlcGVuZGVudC4gKi8KKyAgc3dpdGNoKChpbnQpIEdFVF9UQ1JfVE1PREUoY29udHJvbGxlcikpCisgICAgeworICAgIGNhc2UgMDogLyogaW50ZXJ2YWwgKi8KKyAgICAgIC8qIGRvIG5vdCBhZHZhbmNlIGNvdW50ZXIgaWYgVENFID0gMCBvciBpZiBob2xkaW5nIGF0IGNvdW50ID0gQ1BSQSAqLworICAgICAgaWYoR0VUX1RDUl9UQ0UoY29udHJvbGxlcikgPT0gMCB8fAorCSBjb250cm9sbGVyLT50cnIgPT0gY29udHJvbGxlci0+Y3ByYSkKKwlyZXR1cm47CisgICAgICBicmVhazsKKworICAgIGNhc2UgMTogLyogcHVsc2UgZ2VuZXJhdG9yICovCisgICAgICAvKiBkbyBub3QgYWR2YW5jZSBjb3VudGVyIGlmIFRDRSA9IDAgKi8KKyAgICAgIGlmKEdFVF9UQ1JfVENFKGNvbnRyb2xsZXIpID09IDApCisJcmV0dXJuOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI6IC8qIHdhdGNoZG9nICovCisgICAgICAvKiBkbyBub3QgYWR2YW5jZSBjb3VudGVyIGlmIFRDRSA9IDAgYW5kIFdESVMgPSAxICovCisgICAgICBpZihHRVRfVENSX1RDRShjb250cm9sbGVyKSA9PSAwICYmCisJIEdFVF9XVE1SX1dESVMoY29udHJvbGxlcikgPT0gMSkKKwlyZXR1cm47CisgICAgICBicmVhazsKKworICAgIGNhc2UgMzogLyogZGlzYWJsZWQgKi8KKyAgICAgIC8qIHJlZ2FyZGxlc3Mgb2YgVENFLCBkbyBub3QgYWR2YW5jZSBjb3VudGVyICovCisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIEluIGFueSBvZiB0aGUgYWJvdmUgY2FzZXMgdGhhdCByZXR1cm4sIGEgc3Vic2VxdWVudCByZWdpc3RlcgorICAgICB3cml0ZSB3aWxsIGJlIG5lZWRlZCB0byByZXN0YXJ0IHRoZSB0aW1lci4gIEEgdGljayBldmVudCBpcworICAgICBzY2hlZHVsZWQgYnkgYW55IHJlZ2lzdGVyIHdyaXRlLCBzbyBpdCBpcyBtb3JlIGVmZmljaWVudCBub3QgdG8KKyAgICAgcmVzY2hlZHVsZSBkdW1teSBldmVudHMgaGVyZS4gKi8KKworCisgIC8qIGZpbmQgYXBwcm9wcmlhdGUgZGl2aXNvciBldGMuICovIAorICBpZihHRVRfVENSX0NDUyhjb250cm9sbGVyKSA9PSAwKSAvKiBpbnRlcm5hbCBzeXN0ZW0gY2xvY2sgKi8KKyAgICB7CisgICAgICAvKiBhcHBseSBpbnRlcm5hbCBjbG9jayBkaXZpZGVyICovCisgICAgICBpZihHRVRfVENSX0NDREUoY29udHJvbGxlcikpIC8qIGRpdmlzb3IgY2lyY3VpdCBlbmFibGVkPyAqLworCWRpdmlzb3IgPSBjb250cm9sbGVyLT5jbG9ja190aWNrcyAqICgxIDw8ICgxICsgR0VUX0NDRFJfQ0RSKGNvbnRyb2xsZXIpKSk7CisgICAgICBlbHNlCisJZGl2aXNvciA9IGNvbnRyb2xsZXItPmNsb2NrX3RpY2tzOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRpdmlzb3IgPSBjb250cm9sbGVyLT5leHRfdGlja3M7CisgICAgfQorCisgIC8qIGhvdyBtYW55IHRpbWVzIHRvIGluY3JlYXNlIGNvdW50ZXI/ICovCisgIHF1b3RpZW50ID0gd2FycCAvIGRpdmlzb3I7CisgIHJlbWFpbmRlciA9IHdhcnAgJSBkaXZpc29yOworCisgIC8qIE5PVEU6IElmIHRoZSBldmVudCByZXNjaGVkdWxpbmcgY29kZSB3b3JrcyBwcm9wZXJseSwgdGhlIHF1b3RpZW50CisgICAgIHNob3VsZCBuZXZlciBiZSBsYXJnZXIgdGhhbiAxLiAgVGhhdCBpcywgd2Ugc2hvdWxkIHJlY2VpdmUgZXZlbnRzCisgICAgIGhlcmUgYXQgbGVhc3QgYXMgZnJlcXVlbnRseSBhcyB0aGUgc2ltdWxhdGVkIGNvdW50ZXIgaXMgc3VwcG9zZWQKKyAgICAgdG8gZGVjcmVtZW50LiAgU28gdGhlIHJlbWFpbmRlciAoLT4gcm91bmRvZmZfdGlja3MpIHdpbGwgc2xvd2x5CisgICAgIGFjY3VtdWxhdGUsIHdpdGggdGhlIHF1b3RpZW50ID09IDAuICBPbmNlIGluIGEgd2hpbGUsIHF1b3RpZW50CisgICAgIHdpbGwgZXF1YWwgMS4gKi8KKworICBjb250cm9sbGVyLT5yb3VuZG9mZl90aWNrcyA9IHJlbWFpbmRlcjsKKyAgY29udHJvbGxlci0+bGFzdF90aWNrcyA9IHRoaXNfdGlja3M7CisgIHdoaWxlKHF1b3RpZW50ID4gMCkgLyogSXMgaXQgdGltZSB0byBpbmNyZW1lbnQgY291bnRlcj8gKi8KKyAgICB7CisgICAgICAvKiBuZXh0IDI0LWJpdCBjb3VudGVyIHZhbHVlICovCisgICAgICB1bnNpZ25lZF80IG5leHRfdHJyID0gKGNvbnRyb2xsZXItPnRyciArIDEpICUgKDEgPDwgMjQpOworICAgICAgcXVvdGllbnQgLS07CisgICAgICAKKyAgICAgIHN3aXRjaCgoaW50KSBHRVRfVENSX1RNT0RFKGNvbnRyb2xsZXIpKQorCXsKKwljYXNlIDA6IC8qIGludGVydmFsIHRpbWVyIG1vZGUgKi8KKwkgIHsKKwkgICAgLyogQ3VycmVudCBvciBuZXh0IGNvdW50ZXIgdmFsdWUgbWF0Y2hlcyBDUFJBIHZhbHVlPyAgVGhlCisJICAgICAgIGZpcnN0IGNhc2UgY292ZXJzIGNvdW50ZXIgaG9sZGluZyBhdCBtYXhpbXVtIGJlZm9yZQorCSAgICAgICByZXNldC4gIFRoZSBzZWNvbmQgY2FzZSBjb3ZlcnMgbm9ybWFsIGNvdW50aW5nCisJICAgICAgIGJlaGF2aW9yLiAqLworCSAgICBpZihjb250cm9sbGVyLT50cnIgPT0gY29udHJvbGxlci0+Y3ByYSB8fAorCSAgICAgICBuZXh0X3RyciA9PSBjb250cm9sbGVyLT5jcHJhKQorCSAgICAgIHsKKwkJLyogbGlrZWx5IGhvbGQgQ1BSQSB2YWx1ZSAqLworCQlpZihjb250cm9sbGVyLT50cnIgPT0gY29udHJvbGxlci0+Y3ByYSkKKwkJICBuZXh0X3RyciA9IGNvbnRyb2xsZXItPmNwcmE7CisKKwkJU0VUX1RJU1JfVElJUyhjb250cm9sbGVyKTsKKworCQkvKiBTaWduYWwgYW4gaW50ZXJydXB0IGlmIGl0IGlzIGVuYWJsZWQgd2l0aCBUSUlFLAorCQkgICBhbmQgaWYgd2UganVzdCBhcnJpdmVkIGF0IENQUkEuICBEb24ndCByZXBlYXRlZGx5CisJCSAgIGludGVycnVwdCBpZiBob2xkaW5nIGR1ZSB0byBUWkNFPTAgKi8KKwkJaWYoR0VUX0lUTVJfVElJRShjb250cm9sbGVyKSAmJgorCQkgICBuZXh0X3RyciAhPSBjb250cm9sbGVyLT50cnIpCisJCSAgeworCQkgICAgaHdfcG9ydF9ldmVudChtZSwgSU5UX1BPUlQsIDEpOworCQkgIH0KKworCQkvKiBSZXNldCBjb3VudGVyPyAqLworCQlpZihHRVRfSVRNUl9UWkNFKGNvbnRyb2xsZXIpKQorCQkgIHsKKwkJICAgIG5leHRfdHJyID0gMDsKKwkJICB9CisJICAgICAgfQorCSAgfQorCWJyZWFrOworCisJY2FzZSAxOiAvKiBwdWxzZSBnZW5lcmF0b3IgbW9kZSAqLworCSAgeworCSAgICAvKiBmaXJzdCB0cmlwIHBvaW50ICovCisJICAgIGlmKG5leHRfdHJyID09IGNvbnRyb2xsZXItPmNwcmEpCisJICAgICAgeworCQkvKiBmbGlwIGZsaXAtZmxvcCAmIHJlcG9ydCAqLworCQljb250cm9sbGVyLT5mZiBePSAxOworCQlod19wb3J0X2V2ZW50KG1lLCBGRl9QT1JULCBjb250cm9sbGVyLT5mZik7CisJCVNFVF9USVNSX1RQSUFTKGNvbnRyb2xsZXIpOworCisJCS8qIHNpZ25hbCBpbnRlcnJ1cHQgKi8KKwkJaWYoR0VUX1BNR1JfVFBJQUUoY29udHJvbGxlcikpCisJCSAgeworCQkgICAgaHdfcG9ydF9ldmVudChtZSwgSU5UX1BPUlQsIDEpOworCQkgIH0KKworCSAgICAgIH0KKwkgICAgLyogc2Vjb25kIHRyaXAgcG9pbnQgKi8KKwkgICAgZWxzZSBpZihuZXh0X3RyciA9PSBjb250cm9sbGVyLT5jcHJiKQorCSAgICAgIHsKKwkJLyogZmxpcCBmbGlwLWZsb3AgJiByZXBvcnQgKi8KKwkJY29udHJvbGxlci0+ZmYgXj0gMTsKKwkJaHdfcG9ydF9ldmVudChtZSwgRkZfUE9SVCwgY29udHJvbGxlci0+ZmYpOworCQlTRVRfVElTUl9UUElCUyhjb250cm9sbGVyKTsKKworCQkvKiBzaWduYWwgaW50ZXJydXB0ICovCisJCWlmKEdFVF9QTUdSX1RQSUJFKGNvbnRyb2xsZXIpKQorCQkgIHsKKwkJICAgIGh3X3BvcnRfZXZlbnQobWUsIElOVF9QT1JULCAxKTsKKwkJICB9CisKKwkJLyogY2xlYXIgY291bnRlciAqLworCQluZXh0X3RyciA9IDA7CisJICAgICAgfQorCSAgfQorCWJyZWFrOworCisJY2FzZSAyOiAvKiB3YXRjaGRvZyB0aW1lciBtb2RlICovCisJICB7CisJICAgIC8qIHdhdGNoZG9nIHRpbWVyIGV4cGlyeSAqLworCSAgICBpZihuZXh0X3RyciA9PSBjb250cm9sbGVyLT5jcHJhKQorCSAgICAgIHsKKwkJU0VUX1RJU1JfVFdJUyhjb250cm9sbGVyKTsKKworCQkvKiBzaWduYWwgaW50ZXJydXB0ICovCisJCWlmKEdFVF9XVE1SX1RXSUUoY29udHJvbGxlcikpCisJCSAgeworCQkgICAgaHdfcG9ydF9ldmVudChtZSwgSU5UX1BPUlQsIDEpOworCQkgIH0KKworCQkvKiBjbGVhciBjb3VudGVyICovCisJCW5leHRfdHJyID0gMDsKKwkgICAgICB9CisJICB9CisJYnJlYWs7CisKKwljYXNlIDM6IC8qIGRpc2FibGVkICovCisJZGVmYXVsdDoKKwl9CisKKyAgICAgIC8qIHVwZGF0ZSBjb3VudGVyIGFuZCByZXBvcnQgKi8KKyAgICAgIGNvbnRyb2xsZXItPnRyciA9IG5leHRfdHJyOworICAgICAgLyogSFdfVFJBQ0UgKChtZSwgImNvdW50ZXIgdHJyICVsZCB0aXNyICVseCIsCisJIChsb25nKSBjb250cm9sbGVyLT50cnIsIChsb25nKSBjb250cm9sbGVyLT50aXNyKSk7ICovCisgICAgfSAvKiBlbmQgcXVvdGllbnQgbG9vcCAqLworCisgIC8qIFJlc2NoZWR1bGUgYSB0aW1lciBldmVudCBpbiBuZWFyIGZ1dHVyZSwgc28gd2UgY2FuIGluY3JlbWVudCB0aGUKKyAgICAgY291bnRlciBhZ2Fpbi4gIFNldCB0aGUgZXZlbnQgYWJvdXQgNzUlIG9mIGRpdmlzb3IgdGltZSBhd2F5LCBzbworICAgICB3ZSB3aWxsIGV4cGVyaWVuY2Ugcm91Z2hseSAxLjMgZXZlbnRzIHBlciBjb3VudGVyIGluY3JlbWVudC4gKi8KKyAgY29udHJvbGxlci0+ZXZlbnQgPSBod19ldmVudF9xdWV1ZV9zY2hlZHVsZShtZSwgZGl2aXNvciozLzQsIGRlbGl2ZXJfdHgzOTA0dG1yX3RpY2ssIE5VTEwpOworfQorCisKKworCitjb25zdCBzdHJ1Y3QgaHdfZGVzY3JpcHRvciBkdl90eDM5MDR0bXJfZGVzY3JpcHRvcltdID0geworICB7ICJ0eDM5MDR0bXIiLCB0eDM5MDR0bXJfZmluaXNoLCB9LAorICB7IE5VTEwgfSwKK307CmRpZmYgLS1naXQgYS9zaW0vbWlwcy9pbnRlcnAuYyBiL3NpbS9taXBzL2ludGVycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YmM1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbWlwcy9pbnRlcnAuYwpAQCAtMCwwICsxLDMyMjggQEAKKy8qPiBpbnRlcnAuYyA8Ki8KKy8qIFNpbXVsYXRvciBmb3IgdGhlIE1JUFMgYXJjaGl0ZWN0dXJlLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTUlQUyBzaW0KKworCQlUSElTIFNPRlRXQVJFIElTIE5PVCBDT1BZUklHSFRFRAorCisgICBDeWdudXMgb2ZmZXJzIHRoZSBmb2xsb3dpbmcgZm9yIHVzZSBpbiB0aGUgcHVibGljIGRvbWFpbi4gIEN5Z251cworICAgbWFrZXMgbm8gd2FycmFudHkgd2l0aCByZWdhcmQgdG8gdGhlIHNvZnR3YXJlIG9yIGl0J3MgcGVyZm9ybWFuY2UKKyAgIGFuZCB0aGUgdXNlciBhY2NlcHRzIHRoZSBzb2Z0d2FyZSAiQVMgSVMiIHdpdGggYWxsIGZhdWx0cy4KKworICAgQ1lHTlVTIERJU0NMQUlNUyBBTlkgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBXSVRIIFJFR0FSRCBUTworICAgVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorCisgICAkUmV2aXNpb24kCisgICAkRGF0ZSQgICAgICAgICAgICAgCisKK05PVEVzOgorCitUaGUgSURUIG1vbml0b3IgKGZvdW5kIG9uIHRoZSBWUjQzMDAgYm9hcmQpLCBzZWVtcyB0byBsaWUgYWJvdXQKK3JlZ2lzdGVyIGNvbnRlbnRzLiBJdCBzZWVtcyB0byB0cmVhdCB0aGUgcmVnaXN0ZXJzIGFzIHNpZ24tZXh0ZW5kZWQKKzMyLWJpdCB2YWx1ZXMuIFRoaXMgY2F1c2UgKlJFQUwqIHByb2JsZW1zIHdoZW4gc2luZ2xlLXN0ZXBwaW5nIDY0LWJpdAorY29kZSBvbiB0aGUgaGFyZHdhcmUuCisKKyovCisKKy8qIFRoZSBUUkFDRSBtYW5pZmVzdHMgZW5hYmxlIHRoZSBwcm92aXNpb24gb2YgZXh0cmEgZmVhdHVyZXMuIElmIHRoZXkKKyAgIGFyZSBub3QgZGVmaW5lZCB0aGVuIGEgc2ltcGxlciAocXVpY2tlcikgc2ltdWxhdG9yIGlzIGNvbnN0cnVjdGVkCisgICB3aXRob3V0IHRoZSByZXF1aXJlZCBydW4tdGltZSBjaGVja3MsIGV0Yy4gKi8KKyNpZiAxIC8qIDAgdG8gYWxsb3cgdXNlciBidWlsZCBzZWxlY3Rpb24sIDEgdG8gZm9yY2UgaW5jbHVzaW9uICovCisjZGVmaW5lIFRSQUNFICgxKQorI2VuZGlmCisKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2luY2x1ZGUgInNpbS11dGlscy5oIgorI2luY2x1ZGUgInNpbS1vcHRpb25zLmgiCisjaW5jbHVkZSAic2ltLWFzc2VydC5oIgorI2luY2x1ZGUgInNpbS1ody5oIgorCisjaW5jbHVkZSAiaXRhYmxlLmgiCisKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxhbnNpZGVjbC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAiZ2V0b3B0LmgiCisjaW5jbHVkZSAibGliaWJlcnR5LmgiCisjaW5jbHVkZSAiYmZkLmgiCisjaW5jbHVkZSAiY2FsbGJhY2suaCIgICAvKiBHREIgc2ltdWxhdG9yIGNhbGxiYWNrIGludGVyZmFjZSAqLworI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIgLyogR0RCIHNpbXVsYXRvciBpbnRlcmZhY2UgKi8KKworI2luY2x1ZGUgInN5c2RlcC5oIgorCisjaWZuZGVmIFBBUkFNUworI2RlZmluZSBQQVJBTVMoeCkgCisjZW5kaWYKKworY2hhciogcHJfYWRkciBQQVJBTVMgKChTSU1fQUREUiBhZGRyKSk7CitjaGFyKiBwcl91d29yZDY0IFBBUkFNUyAoKHV3b3JkNjQgYWRkcikpOworCisKKy8qIFdpdGhpbiBpbnRlcnAuYyB3ZSByZWZlciB0byB0aGUgc2ltX3N0YXRlIGFuZCBzaW1fY3B1IGRpcmVjdGx5LiAqLworI2RlZmluZSBDUFUgY3B1CisjZGVmaW5lIFNEIHNkCisKKworLyogVGhlIGZvbGxvd2luZyByZXNlcnZlZCBpbnN0cnVjdGlvbiB2YWx1ZSBpcyB1c2VkIHdoZW4gYSBzaW11bGF0b3IKKyAgIHRyYXAgaXMgcmVxdWlyZWQuIE5PVEU6IENhcmUgbXVzdCBiZSB0YWtlbiwgc2luY2UgdGhpcyB2YWx1ZSBtYXkgYmUKKyAgIHVzZWQgaW4gbGF0ZXIgcmV2aXNpb25zIG9mIHRoZSBNSVBTIElTQS4gKi8KKworI2RlZmluZSBSU1ZEX0lOU1RSVUNUSU9OICAgICAgICAgICAoMHgwMDAwMDAwNSkKKyNkZWZpbmUgUlNWRF9JTlNUUlVDVElPTl9NQVNLICAgICAgKDB4RkMwMDAwM0YpCisKKyNkZWZpbmUgUlNWRF9JTlNUUlVDVElPTl9BUkdfU0hJRlQgNgorI2RlZmluZSBSU1ZEX0lOU1RSVUNUSU9OX0FSR19NQVNLICAweEZGRkZGICAKKworCisvKiBCaXRzIGluIHRoZSBEZWJ1ZyByZWdpc3RlciAqLworI2RlZmluZSBEZWJ1Z19EQkQgMHg4MDAwMDAwMCAgIC8qIERlYnVnIEJyYW5jaCBEZWxheSAqLworI2RlZmluZSBEZWJ1Z19ETSAgMHg0MDAwMDAwMCAgIC8qIERlYnVnIE1vZGUgICAgICAgICAqLworI2RlZmluZSBEZWJ1Z19EQnAgMHgwMDAwMDAwMiAgIC8qIERlYnVnIEJyZWFrcG9pbnQgaW5kaWNhdG9yICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0gR0RCIHNpbXVsYXRvciBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgQ29sZFJlc2V0IFBBUkFNUygoU0lNX0RFU0Mgc2QpKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKworI2RlZmluZSBERUxBWVNMT1QoKSAgICAge1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNUQVRFICYgc2ltREVMQVlTTE9UKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1faW9fZXByaW50ZihzZCwiRGVsYXkgc2xvdCBhbHJlYWR5IGFjdGl2YXRlZCAoYnJhbmNoIGluIGRlbGF5IHNsb3Q/KVxuIik7XAorICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFURSB8PSBzaW1ERUxBWVNMT1Q7XAorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjZGVmaW5lIEpBTERFTEFZU0xPVCgpCXtcCisJCQkgIERFTEFZU0xPVCAoKTtcCisJCQkgIFNUQVRFIHw9IHNpbUpBTERFTEFZU0xPVDtcCisJCQl9CisKKyNkZWZpbmUgTlVMTElGWSgpICAgICAgIHtcCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFICY9IH5zaW1ERUxBWVNMT1Q7XAorICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFURSB8PSBzaW1TS0lQTkVYVDtcCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyNkZWZpbmUgQ0FOQ0VMREVMQVlTTE9UKCkge1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU1NUQVRFID0gMDtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVEUgJj0gfihzaW1ERUxBWVNMT1QgfCBzaW1KQUxERUxBWVNMT1QpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjZGVmaW5lIElOREVMQVlTTE9UKCkJKChTVEFURSAmIHNpbURFTEFZU0xPVCkgIT0gMCkKKyNkZWZpbmUgSU5KQUxERUxBWVNMT1QoKSAoKFNUQVRFICYgc2ltSkFMREVMQVlTTE9UKSAhPSAwKQorCisjZGVmaW5lIEswQkFTRSAgKDB4ODAwMDAwMDApCisjZGVmaW5lIEswU0laRSAgKDB4MjAwMDAwMDApCisjZGVmaW5lIEsxQkFTRSAgKDB4QTAwMDAwMDApCisjZGVmaW5lIEsxU0laRSAgKDB4MjAwMDAwMDApCisjZGVmaW5lIE1PTklUT1JfQkFTRSAoMHhCRkMwMDAwMCkKKyNkZWZpbmUgTU9OSVRPUl9TSVpFICgxIDw8IDExKQorI2RlZmluZSBNRU1fU0laRSAoMiA8PCAyMCkKKworCisjaWYgZGVmaW5lZChUUkFDRSkKK3N0YXRpYyBjaGFyICp0cmFjZWZpbGUgPSAidHJhY2UuZGluIjsgLyogZGVmYXVsdCBmaWxlbmFtZSBmb3IgdHJhY2UgbG9nICovCitGSUxFICp0cmFjZWZoID0gTlVMTDsKK3N0YXRpYyB2b2lkIG9wZW5fdHJhY2UgUEFSQU1TKChTSU1fREVTQyBzZCkpOworI2VuZGlmIC8qIFRSQUNFICovCisKK3N0YXRpYyBjb25zdCBjaGFyICogZ2V0X2luc25fbmFtZSAoc2ltX2NwdSAqLCBpbnQpOworCisvKiBzaW11bGF0aW9uIHRhcmdldCBib2FyZC4gIE5VTEw9Y2Fub25pY2FsICovCitzdGF0aWMgY2hhciogYm9hcmQgPSBOVUxMOworCisKK3N0YXRpYyBERUNMQVJFX09QVElPTl9IQU5ETEVSIChtaXBzX29wdGlvbl9oYW5kbGVyKTsKKworZW51bSB7CisgIE9QVElPTl9ESU5FUk9fVFJBQ0UgPSBPUFRJT05fU1RBUlQsCisgIE9QVElPTl9ESU5FUk9fRklMRSwKKyAgT1BUSU9OX0JPQVJECit9OworCisKK3N0YXRpYyBTSU1fUkMKK21pcHNfb3B0aW9uX2hhbmRsZXIgKHNkLCBjcHUsIG9wdCwgYXJnLCBpc19jb21tYW5kKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgc2ltX2NwdSAqY3B1OworICAgICBpbnQgb3B0OworICAgICBjaGFyICphcmc7CisgICAgIGludCBpc19jb21tYW5kOworeworICBpbnQgY3B1X25yOworICBzd2l0Y2ggKG9wdCkKKyAgICB7CisgICAgY2FzZSBPUFRJT05fRElORVJPX1RSQUNFOiAvKiA/Pz8gKi8KKyNpZiBkZWZpbmVkKFRSQUNFKQorICAgICAgLyogRXZlbnR1YWxseSB0aGUgc2ltVFJBQ0UgZmxhZyBjb3VsZCBiZSB0cmVhdGVkIGFzIGEgdG9nZ2xlLCB0bworCSBhbGxvdyBleHRlcm5hbCBjb250cm9sIG9mIHRoZSBwcm9ncmFtIHBvaW50cyBiZWluZyB0cmFjZWQKKwkgKGkuZS4gb25seSBmcm9tIG1haW4gb253YXJkcywgZXhjbHVkaW5nIHRoZSBydW4tdGltZSBzZXR1cCwKKwkgZXRjLikuICovCisgICAgICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IE1BWF9OUl9QUk9DRVNTT1JTOyBjcHVfbnIrKykKKwl7CisJICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCBjcHVfbnIpOworCSAgaWYgKGFyZyA9PSBOVUxMKQorCSAgICBTVEFURSB8PSBzaW1UUkFDRTsKKwkgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAieWVzIikgPT0gMCkKKwkgICAgU1RBVEUgfD0gc2ltVFJBQ0U7CisJICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIm5vIikgPT0gMCkKKwkgICAgU1RBVEUgJj0gfnNpbVRSQUNFOworCSAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJvbiIpID09IDApCisJICAgIFNUQVRFIHw9IHNpbVRSQUNFOworCSAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJvZmYiKSA9PSAwKQorCSAgICBTVEFURSAmPSB+c2ltVFJBQ0U7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbnJlY29nbml6ZWQgZGluZXJvLXRyYWNlIG9wdGlvbiBgJXMnXG4iLCBhcmcpOworCSAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBTSU1fUkNfT0s7CisjZWxzZSAvKiAhVFJBQ0UgKi8KKyAgICAgIGZwcmludGYoc3RkZXJyLCJcCitTaW11bGF0b3IgY29uc3RydWN0ZWQgd2l0aG91dCBkaW5lcm8gdHJhY2luZyBzdXBwb3J0IChmb3IgcGVyZm9ybWFuY2UpLlxuXAorUmUtY29tcGlsZSBzaW11bGF0b3Igd2l0aCBcIi1EVFJBQ0VcIiB0byBlbmFibGUgdGhpcyBvcHRpb24uXG4iKTsKKyAgICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKyNlbmRpZiAvKiAhVFJBQ0UgKi8KKworICAgIGNhc2UgT1BUSU9OX0RJTkVST19GSUxFOgorI2lmIGRlZmluZWQoVFJBQ0UpCisgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKKwljaGFyICp0bXA7CisJdG1wID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKG9wdGFyZykgKyAxKTsKKwlpZiAodG1wID09IE5VTEwpCisJICB7CisJICAgIHNpbV9pb19wcmludGYoc2QsIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIHRyYWNlZmlsZSBuYW1lIFwiJXNcIlxuIixvcHRhcmcpOworCSAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisJICB9CisJZWxzZSB7CisJICBzdHJjcHkodG1wLG9wdGFyZyk7CisJICB0cmFjZWZpbGUgPSB0bXA7CisJICBzaW1faW9fcHJpbnRmKHNkLCJQbGFjaW5nIHRyYWNlIGluZm9ybWF0aW9uIGludG8gZmlsZSBcIiVzXCJcbiIsdHJhY2VmaWxlKTsKKwl9CisgICAgICB9CisjZW5kaWYgLyogVFJBQ0UgKi8KKyAgICAgIHJldHVybiBTSU1fUkNfT0s7CisKKyAgICBjYXNlIE9QVElPTl9CT0FSRDoKKyAgICAgIHsKKwlpZiAoYXJnKQorCSAgeworCSAgICBib2FyZCA9IHphbGxvYyhzdHJsZW4oYXJnKSArIDEpOworCSAgICBzdHJjcHkoYm9hcmQsIGFyZyk7CisJICB9CisJcmV0dXJuIFNJTV9SQ19PSzsKKyAgICAgIH0KKyAgICB9CisgIAorICByZXR1cm4gU0lNX1JDX09LOworfQorCisKK3N0YXRpYyBjb25zdCBPUFRJT04gbWlwc19vcHRpb25zW10gPQoreworICB7IHsiZGluZXJvLXRyYWNlIiwgb3B0aW9uYWxfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ESU5FUk9fVFJBQ0V9LAorICAgICAgJ1wwJywgIm9ufG9mZiIsICJFbmFibGUgZGluZXJvIHRyYWNpbmciLAorICAgICAgbWlwc19vcHRpb25faGFuZGxlciB9LAorICB7IHsiZGluZXJvLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RJTkVST19GSUxFfSwKKyAgICAgICdcMCcsICJGSUxFIiwgIldyaXRlIGRpbmVybyB0cmFjZSB0byBGSUxFIiwKKyAgICAgIG1pcHNfb3B0aW9uX2hhbmRsZXIgfSwKKyAgeyB7ImJvYXJkIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CT0FSRH0sCisgICAgICdcMCcsICJub25lIiAvKiByZWx5IG9uIGNvbXBpbGUtdGltZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiBmb3Igb3RoZXIgb3B0aW9ucyAqLworCisjZGVmaW5lIEJPQVJEX0pNUjM5MDQgImptcjM5MDQiCisgICAgICAgICAgICJ8IiBCT0FSRF9KTVIzOTA0CisjZGVmaW5lIEJPQVJEX0pNUjM5MDRfUEFMICJqbXIzOTA0cGFsIgorICAgICAgICAgICAifCIgQk9BUkRfSk1SMzkwNF9QQUwKKyNkZWZpbmUgQk9BUkRfSk1SMzkwNF9ERUJVRyAiam1yMzkwNGRlYnVnIgorICAgICAgICAgICAifCIgQk9BUkRfSk1SMzkwNF9ERUJVRworCisgICAgLCAiQ3VzdG9taXplIHNpbXVsYXRpb24gZm9yIGEgcGFydGljdWxhciBib2FyZC4iLCBtaXBzX29wdGlvbl9oYW5kbGVyIH0sCisKKyAgeyB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9LCAnXDAnLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKKworaW50IGludGVycnVwdF9wZW5kaW5nOworCit2b2lkCitpbnRlcnJ1cHRfZXZlbnQgKFNJTV9ERVNDIHNkLCB2b2lkICpkYXRhKQoreworICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCAwKTsgLyogRklYTUUgKi8KKyAgYWRkcmVzc193b3JkIGNpYSA9IENJQV9HRVQgKGNwdSk7CisgIGlmIChTUiAmIHN0YXR1c19JRSkKKyAgICB7CisgICAgICBpbnRlcnJ1cHRfcGVuZGluZyA9IDA7CisgICAgICBTaWduYWxFeGNlcHRpb25JbnRlcnJ1cHQgKDEpOyAvKiBpbnRlcnJ1cHQgIjEiICovCisgICAgfQorICBlbHNlIGlmICghaW50ZXJydXB0X3BlbmRpbmcpCisgICAgc2ltX2V2ZW50c19zY2hlZHVsZSAoc2QsIDEsIGludGVycnVwdF9ldmVudCwgZGF0YSk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLSBEZXZpY2UgcmVnaXN0cmF0aW9uIGhvb2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgZGV2aWNlX2luaXQoU0lNX0RFU0Mgc2QpIHsKKyNpZmRlZiBERVZJQ0VfSU5JVAorICBleHRlcm4gdm9pZCByZWdpc3Rlcl9kZXZpY2VzKFNJTV9ERVNDKTsKKyAgcmVnaXN0ZXJfZGV2aWNlcyhzZCk7CisjZW5kaWYKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLSBHREIgc2ltdWxhdG9yIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitTSU1fREVTQworc2ltX29wZW4gKGtpbmQsIGNiLCBhYmZkLCBhcmd2KQorICAgICBTSU1fT1BFTl9LSU5EIGtpbmQ7CisgICAgIGhvc3RfY2FsbGJhY2sgKmNiOworICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIFNJTV9ERVNDIHNkID0gc2ltX3N0YXRlX2FsbG9jIChraW5kLCBjYik7CisgIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIDApOyAvKiBGSVhNRSAqLworCisgIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7CisKKyAgLyogRklYTUU6IHdhdGNocG9pbnRzIGNvZGUgc2hvdWxkbid0IG5lZWQgdGhpcyAqLworICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5wYyA9ICYoUEMpOworICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5zaXplb2ZfcGMgPSBzaXplb2YgKFBDKTsKKyAgU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKS0+aW50ZXJydXB0X2hhbmRsZXIgPSBpbnRlcnJ1cHRfZXZlbnQ7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgbWVjaGFuaXNtIGZvciBkb2luZyBpbnNuIHByb2ZpbGluZy4gICovCisgIENQVV9JTlNOX05BTUUgKGNwdSkgPSBnZXRfaW5zbl9uYW1lOworICBDUFVfTUFYX0lOU05TIChjcHUpID0gbnJfaXRhYmxlX2VudHJpZXM7CisKKyAgU1RBVEUgPSAwOworICAKKyAgaWYgKHNpbV9wcmVfYXJndl9pbml0IChzZCwgYXJndlswXSkgIT0gU0lNX1JDX09LKQorICAgIHJldHVybiAwOworICBzaW1fYWRkX29wdGlvbl90YWJsZSAoc2QsIE5VTEwsIG1pcHNfb3B0aW9ucyk7CisKKworICAvKiBnZXRvcHQgd2lsbCBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSBzbyB3ZSBqdXN0IGhhdmUgdG8gZXhpdCBpZiB0aGlzIGZhaWxzLgorICAgICBGSVhNRTogSG1tbS4uLiAgaW4gdGhlIGNhc2Ugb2YgZ2RiIHdlIG5lZWQgZ2V0b3B0IHRvIGNhbGwKKyAgICAgcHJpbnRfZmlsdGVyZWQuICAqLworICBpZiAoc2ltX3BhcnNlX2FyZ3MgKHNkLCBhcmd2KSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgLyogVW5pbnN0YWxsIHRoZSBtb2R1bGVzIHRvIGF2b2lkIG1lbW9yeSBsZWFrcywKKwkgZmlsZSBkZXNjcmlwdG9yIGxlYWtzLCBldGMuICAqLworICAgICAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBoYW5kbGUgYm9hcmQtc3BlY2lmaWMgbWVtb3J5IG1hcHMgKi8KKyAgaWYgKGJvYXJkID09IE5VTEwpCisgICAgeworICAgICAgLyogQWxsb2NhdGUgY29yZSBtYW5hZ2VkIG1lbW9yeSAqLworICAgICAgCisgICAgICAvKiB0aGUgbW9uaXRvciAgKi8KKyAgICAgIHNpbV9kb19jb21tYW5kZiAoc2QsICJtZW1vcnkgcmVnaW9uIDB4JWx4LDB4JWx4IiwgTU9OSVRPUl9CQVNFLCBNT05JVE9SX1NJWkUpOworICAgICAgLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkIGNvZGUgLSB1bmRlciB0aGlzIChhdCBsZXZlbCBvbmUpCisJIGFyZSB0aGUga2VybmVsIHNwYWNlcyBLMCAmIEsxLiAgQm90aCBvZiB0aGVzZSBtYXAgdG8gYSBzaW5nbGUKKwkgc21hbGxlciBzdWIgcmVnaW9uICovCisgICAgICBzaW1fZG9fY29tbWFuZChzZCwiIG1lbW9yeSByZWdpb24gMHg3ZmZmODAwMCwweDgwMDAiKSA7IC8qIE1UWi0gMzIgayBzdGFjayAqLworICAgICAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSBhbGlhcyAweCVseEAxLDB4JWx4JSUweCVseCwweCUweCIsCisJCSAgICAgICBLMUJBU0UsIEswU0laRSwKKwkJICAgICAgIE1FTV9TSVpFLCAvKiBhY3R1YWwgc2l6ZSAqLworCQkgICAgICAgSzBCQVNFKTsKKyAgICAgIAorICAgICAgZGV2aWNlX2luaXQoc2QpOworICAgIH0KKyAgCisjaWYgKFdJVEhfSFcpCisgIGlmIChib2FyZCAhPSBOVUxMCisgICAgICAmJiAoc3RyY21wKGJvYXJkLCBCT0FSRF9KTVIzOTA0KSA9PSAwIHx8CisJICBzdHJjbXAoYm9hcmQsIEJPQVJEX0pNUjM5MDRfUEFMKSA9PSAwIHx8CisJICBzdHJjbXAoYm9hcmQsIEJPQVJEX0pNUjM5MDRfREVCVUcpID09IDApKQorICAgIHsKKyAgICAgIC8qIG1hdGNoIFZJUlRVQUwgbWVtb3J5IGxheW91dCBvZiBKTVItVFgzOTA0IGJvYXJkICovCisgICAgICBpbnQgaTsKKworICAgICAgLyogLS0tIGVudmlyb25tZW50IC0tLSAqLworCisgICAgICBTVEFURV9FTlZJUk9OTUVOVCAoc2QpID0gT1BFUkFUSU5HX0VOVklST05NRU5UOworCisgICAgICAvKiAtLS0gbWVtb3J5IC0tLSAqLworCisgICAgICAvKiBST006IDB4OUZDMF8wMDAwIC0gMHg5RkZGX0ZGRkYgYW5kIDB4QkZDMF8wMDAwIC0gMHhCRkZGX0ZGRkYgKi8KKyAgICAgIHNpbV9kb19jb21tYW5kZiAoc2QsICJtZW1vcnkgYWxpYXMgMHglbHhAMSwweCVseCwweCUweCIsCisJCSAgICAgICAweDlGQzAwMDAwLCAKKwkJICAgICAgIDQgKiAxMDI0ICogMTAyNCwgLyogNCBNQiAqLworCQkgICAgICAgMHhCRkMwMDAwMCk7CisKKyAgICAgIC8qIFNSQU06IDB4ODAwMF8wMDAwIC0gMHg4MDNGX0ZGRkYgYW5kIDB4QTAwMF8wMDAwIC0gMHhBMDNGX0ZGRkYgKi8KKyAgICAgIHNpbV9kb19jb21tYW5kZiAoc2QsICJtZW1vcnkgYWxpYXMgMHglbHhAMSwweCVseCwweCUweCIsCisJCSAgICAgICAweDgwMDAwMDAwLCAKKwkJICAgICAgIDQgKiAxMDI0ICogMTAyNCwgLyogNCBNQiAqLworCQkgICAgICAgMHhBMDAwMDAwMCk7CisKKyAgICAgIC8qIERSQU06IDB4ODgwMF8wMDAwIC0gMHg4OUZGX0ZGRkYgYW5kIDB4QTgwMF8wMDAwIC0gMHhBOUZGX0ZGRkYgKi8KKyAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykgLyogMzIgTUIgdG90YWwgKi8KKwl7CisJICB1bnNpZ25lZCBzaXplID0gNCAqIDEwMjQgKiAxMDI0OyAgLyogNCBNQiAqLworCSAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSBhbGlhcyAweCVseEAxLDB4JWx4LDB4JTB4IiwKKwkJCSAgIDB4ODgwMDAwMDAgKyAoaSAqIHNpemUpLCAKKwkJCSAgIHNpemUsIAorCQkJICAgMHhBODAwMDAwMCArIChpICogc2l6ZSkpOworCX0KKworICAgICAgLyogRHVtbXkgbWVtb3J5IHJlZ2lvbnMgZm9yIHVuc2ltdWxhdGVkIGRldmljZXMgKi8KKworICAgICAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSBhbGlhcyAweCVseEAxLDB4JWx4IiwgMHhGRkZGRTAxMCwgMHgwMGMpOyAvKiBFQklGICovCisgICAgICBzaW1fZG9fY29tbWFuZGYgKHNkLCAibWVtb3J5IGFsaWFzIDB4JWx4QDEsMHglbHgiLCAweEZGRkY5MDAwLCAweDIwMCk7IC8qIEVCSUYgKi8KKyAgICAgIHNpbV9kb19jb21tYW5kZiAoc2QsICJtZW1vcnkgYWxpYXMgMHglbHhAMSwweCVseCIsIDB4RkZGRkY1MDAsIDB4MzAwKTsgLyogUElPICovCisKKyAgICAgIC8qIC0tLSBzaW11bGF0ZWQgZGV2aWNlcyAtLS0gKi8KKyAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvdHgzOTA0aXJjQDB4ZmZmZmMwMDAvcmVnIDB4ZmZmZmMwMDAgMHgyMCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi90eDM5MDRjcHUiKTsKKyAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvdHgzOTA0dG1yQDB4ZmZmZmYwMDAvcmVnIDB4ZmZmZmYwMDAgMHgxMDAiKTsKKyAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvdHgzOTA0dG1yQDB4ZmZmZmYxMDAvcmVnIDB4ZmZmZmYxMDAgMHgxMDAiKTsKKyAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvdHgzOTA0dG1yQDB4ZmZmZmYyMDAvcmVnIDB4ZmZmZmYyMDAgMHgxMDAiKTsKKyAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvdHgzOTA0c2lvQDB4ZmZmZmYzMDAvcmVnIDB4ZmZmZmYzMDAgMHgxMDAiKTsKKyAgICAgIHsKKwkvKiBGSVhNRTogcG9raW5nIGF0IGR2LXNvY2tzZXIgaW50ZXJuYWxzLCB1c2UgdGNwIGJhY2tlbmQgaWYKKwkgLS1zb2Nrc2VyX2FkZHIgb3B0aW9uIHdhcyBnaXZlbi4qLworCWV4dGVybiBjaGFyKiBzb2Nrc2VyX2FkZHI7CisJaWYoc29ja3Nlcl9hZGRyID09IE5VTEwpCisJICBzaW1faHdfcGFyc2UgKHNkLCAiL3R4MzkwNHNpb0AweGZmZmZmMzAwL2JhY2tlbmQgc3RkaW8iKTsKKwllbHNlCisJICBzaW1faHdfcGFyc2UgKHNkLCAiL3R4MzkwNHNpb0AweGZmZmZmMzAwL2JhY2tlbmQgdGNwIik7CisgICAgICB9CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3R4MzkwNHNpb0AweGZmZmZmNDAwL3JlZyAweGZmZmZmNDAwIDB4MTAwIik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3R4MzkwNHNpb0AweGZmZmZmNDAwL2JhY2tlbmQgc3RkaW8iKTsKKworICAgICAgLyogLS0gZGV2aWNlIGNvbm5lY3Rpb25zIC0tLSAqLworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi90eDM5MDRpcmMgPiBpcCBsZXZlbCAvdHgzOTA0Y3B1Iik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3R4MzkwNHRtckAweGZmZmZmMDAwID4gaW50IHRtcjAgL3R4MzkwNGlyYyIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi90eDM5MDR0bXJAMHhmZmZmZjEwMCA+IGludCB0bXIxIC90eDM5MDRpcmMiKTsKKyAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvdHgzOTA0dG1yQDB4ZmZmZmYyMDAgPiBpbnQgdG1yMiAvdHgzOTA0aXJjIik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3R4MzkwNHNpb0AweGZmZmZmMzAwID4gaW50IHNpbzAgL3R4MzkwNGlyYyIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi90eDM5MDRzaW9AMHhmZmZmZjQwMCA+IGludCBzaW8xIC90eDM5MDRpcmMiKTsKKworICAgICAgLyogYWRkIFBBTCB0aW1lciAmIEkvTyBtb2R1bGUgKi8KKyAgICAgIGlmKCEgc3RyY21wKGJvYXJkLCBCT0FSRF9KTVIzOTA0X1BBTCkpCisJeworCSAvKiB0aGUgZGV2aWNlICovCisJIHNpbV9od19wYXJzZSAoc2QsICIvcGFsQDB4ZmZmZjAwMDAiKTsKKwkgc2ltX2h3X3BhcnNlIChzZCwgIi9wYWxAMHhmZmZmMDAwMC9yZWcgMHhmZmZmMDAwMCA2NCIpOworCisJIC8qIHdpcmUgdXAgaW50ZXJydXB0IHBvcnRzIHRvIGlyYyAqLworCSBzaW1faHdfcGFyc2UgKHNkLCAiL3BhbEAweDMxMDAwMDAwID4gY291bnRkb3duIHRtcjAgL3R4MzkwNGlyYyIpOworCSBzaW1faHdfcGFyc2UgKHNkLCAiL3BhbEAweDMxMDAwMDAwID4gdGltZXIgdG1yMSAvdHgzOTA0aXJjIik7CisJIHNpbV9od19wYXJzZSAoc2QsICIvcGFsQDB4MzEwMDAwMDAgPiBpbnQgaW50MCAvdHgzOTA0aXJjIik7CisJfQorCisgICAgICBpZighIHN0cmNtcChib2FyZCwgQk9BUkRfSk1SMzkwNF9ERUJVRykpCisJeworCSAgLyogLS0gREVCVUc6IGdsdWUgaW50ZXJydXB0IGdlbmVyYXRvcnMgLS0tICovCisJICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHhmZmZmMDAwMC9yZWcgMHhmZmZmMDAwMCAweDUwIik7CisJICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHhmZmZmMDAwMCA+IGludDAgaW50MCAvdHgzOTA0aXJjIik7CisJICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHhmZmZmMDAwMCA+IGludDEgaW50MSAvdHgzOTA0aXJjIik7CisJICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHhmZmZmMDAwMCA+IGludDIgaW50MiAvdHgzOTA0aXJjIik7CisJICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHhmZmZmMDAwMCA+IGludDMgaW50MyAvdHgzOTA0aXJjIik7CisJICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHhmZmZmMDAwMCA+IGludDQgaW50NCAvdHgzOTA0aXJjIik7CisJICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHhmZmZmMDAwMCA+IGludDUgaW50NSAvdHgzOTA0aXJjIik7CisJICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHhmZmZmMDAwMCA+IGludDYgaW50NiAvdHgzOTA0aXJjIik7CisJICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHhmZmZmMDAwMCA+IGludDcgaW50NyAvdHgzOTA0aXJjIik7CisJICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHhmZmZmMDAwMCA+IGludDggZG1hYzAgL3R4MzkwNGlyYyIpOworCSAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4ZmZmZjAwMDAgPiBpbnQ5IGRtYWMxIC90eDM5MDRpcmMiKTsKKwkgIHNpbV9od19wYXJzZSAoc2QsICIvZ2x1ZUAweGZmZmYwMDAwID4gaW50MTAgZG1hYzIgL3R4MzkwNGlyYyIpOworCSAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4ZmZmZjAwMDAgPiBpbnQxMSBkbWFjMyAvdHgzOTA0aXJjIik7CisJICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHhmZmZmMDAwMCA+IGludDEyIHNpbzAgL3R4MzkwNGlyYyIpOworCSAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4ZmZmZjAwMDAgPiBpbnQxMyBzaW8xIC90eDM5MDRpcmMiKTsKKwkgIHNpbV9od19wYXJzZSAoc2QsICIvZ2x1ZUAweGZmZmYwMDAwID4gaW50MTQgdG1yMCAvdHgzOTA0aXJjIik7CisJICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHhmZmZmMDAwMCA+IGludDE1IHRtcjEgL3R4MzkwNGlyYyIpOworCSAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4ZmZmZjAwMDAgPiBpbnQxNiB0bXIyIC90eDM5MDRpcmMiKTsKKwkgIHNpbV9od19wYXJzZSAoc2QsICIvZ2x1ZUAweGZmZmYwMDAwID4gaW50MTcgbm1pIC90eDM5MDRjcHUiKTsKKwl9CisKKyAgICAgIGRldmljZV9pbml0KHNkKTsKKyAgICB9CisjZW5kaWYKKworCisgIC8qIGNoZWNrIGZvci9lc3RhYmxpc2ggdGhlIGEgcmVmZXJlbmNlIHByb2dyYW0gaW1hZ2UgKi8KKyAgaWYgKHNpbV9hbmFseXplX3Byb2dyYW0gKHNkLAorCQkJICAgKFNUQVRFX1BST0dfQVJHViAoc2QpICE9IE5VTEwKKwkJCSAgICA/ICpTVEFURV9QUk9HX0FSR1YgKHNkKQorCQkJICAgIDogTlVMTCksCisJCQkgICBhYmZkKSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBDb25maWd1cmUvdmVyaWZ5IHRoZSB0YXJnZXQgYnl0ZSBvcmRlciBhbmQgb3RoZXIgcnVudGltZQorICAgICBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKyAgaWYgKHNpbV9jb25maWcgKHNkKSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoc2ltX3Bvc3RfYXJndl9pbml0IChzZCkgIT0gU0lNX1JDX09LKQorICAgIHsKKyAgICAgIC8qIFVuaW5zdGFsbCB0aGUgbW9kdWxlcyB0byBhdm9pZCBtZW1vcnkgbGVha3MsCisJIGZpbGUgZGVzY3JpcHRvciBsZWFrcywgZXRjLiAgKi8KKyAgICAgIHNpbV9tb2R1bGVfdW5pbnN0YWxsIChzZCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogdmVyaWZ5IGFzc3VtcHRpb25zIHRoZSBzaW11bGF0b3IgbWFkZSBhYm91dCB0aGUgaG9zdCB0eXBlIHN5c3RlbS4KKyAgICAgVGhpcyBtYWNybyBkb2VzIG5vdCByZXR1cm4gaWYgdGhlcmUgaXMgYSBwcm9ibGVtICovCisgIFNJTV9BU1NFUlQgKHNpemVvZihpbnQpID09ICg0ICogc2l6ZW9mKGNoYXIpKSk7CisgIFNJTV9BU1NFUlQgKHNpemVvZih3b3JkNjQpID09ICg4ICogc2l6ZW9mKGNoYXIpKSk7CisKKyAgLyogVGhpcyBpcyBOQVNUWSwgaW4gdGhhdCB3ZSBhcmUgYXNzdW1pbmcgdGhlIHNpemUgb2Ygc3BlY2lmaWMKKyAgICAgcmVnaXN0ZXJzOiAqLworICB7CisgICAgaW50IHJuOworICAgIGZvciAocm4gPSAwOyAocm4gPCAoTEFTVF9FTUJFRF9SRUdOVU0gKyAxKSk7IHJuKyspCisgICAgICB7CisJaWYgKHJuIDwgMzIpCisJICBjcHUtPnJlZ2lzdGVyX3dpZHRoc1tybl0gPSBXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU7CisJZWxzZSBpZiAoKHJuID49IEZHUklEWCkgJiYgKHJuIDwgKEZHUklEWCArIE5SX0ZHUikpKQorCSAgY3B1LT5yZWdpc3Rlcl93aWR0aHNbcm5dID0gV0lUSF9UQVJHRVRfRkxPQVRJTkdfUE9JTlRfQklUU0laRTsKKwllbHNlIGlmICgocm4gPj0gMzMpICYmIChybiA8PSAzNykpCisJICBjcHUtPnJlZ2lzdGVyX3dpZHRoc1tybl0gPSBXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU7CisJZWxzZSBpZiAoKHJuID09IFNSSURYKQorCQkgfHwgKHJuID09IEZDUjBJRFgpCisJCSB8fCAocm4gPT0gRkNSMzFJRFgpCisJCSB8fCAoKHJuID49IDcyKSAmJiAocm4gPD0gODkpKSkKKwkgIGNwdS0+cmVnaXN0ZXJfd2lkdGhzW3JuXSA9IDMyOworCWVsc2UKKwkgIGNwdS0+cmVnaXN0ZXJfd2lkdGhzW3JuXSA9IDA7CisgICAgICB9CisKKworICB9CisKKyNpZiBkZWZpbmVkKFRSQUNFKQorICBpZiAoU1RBVEUgJiBzaW1UUkFDRSkKKyAgICBvcGVuX3RyYWNlKHNkKTsKKyNlbmRpZiAvKiBUUkFDRSAqLworCisgIC8qIFdyaXRlIGFuIGFib3J0IHNlcXVlbmNlIGludG8gdGhlIFRSQVAgKGNvbW1vbikgZXhjZXB0aW9uIHZlY3RvcgorICAgICBhZGRyZXNzZXMuICBUaGlzIGlzIHRvIGNhdGNoIGNvZGUgZXhlY3V0aW5nIGEgVFJBUCAoZXQuYWwuKQorICAgICBpbnN0cnVjdGlvbiB3aXRob3V0IGluc3RhbGxpbmcgYSB0cmFwIGhhbmRsZXIuICovCisgIHsKKyAgICB1bnNpZ25lZDMyIGhhbHRbMl0gPSB7IDB4MjQwNDAwMmYgLyogYWRkaXUgcjQsIHIwLCA0NyAqLywKKwkJCSAgIEhBTFRfSU5TVFJVQ1RJT04gLyogQlJFQUsgKi8gfTsKKyAgICBIMlQgKGhhbHRbMF0pOworICAgIEgyVCAoaGFsdFsxXSk7CisgICAgc2ltX3dyaXRlIChzZCwgMHg4MDAwMDAwMCwgKGNoYXIgKikgaGFsdCwgc2l6ZW9mIChoYWx0KSk7CisgICAgc2ltX3dyaXRlIChzZCwgMHg4MDAwMDE4MCwgKGNoYXIgKikgaGFsdCwgc2l6ZW9mIChoYWx0KSk7CisgICAgc2ltX3dyaXRlIChzZCwgMHg4MDAwMDIwMCwgKGNoYXIgKikgaGFsdCwgc2l6ZW9mIChoYWx0KSk7CisgICAgc2ltX3dyaXRlIChzZCwgMHhCRkMwMDIwMCwgKGNoYXIgKikgaGFsdCwgc2l6ZW9mIChoYWx0KSk7CisgICAgc2ltX3dyaXRlIChzZCwgMHhCRkMwMDM4MCwgKGNoYXIgKikgaGFsdCwgc2l6ZW9mIChoYWx0KSk7CisgICAgc2ltX3dyaXRlIChzZCwgMHhCRkMwMDQwMCwgKGNoYXIgKikgaGFsdCwgc2l6ZW9mIChoYWx0KSk7CisgIH0KKworCisgIC8qIFdyaXRlIHRoZSBtb25pdG9yIHRyYXAgYWRkcmVzcyBoYW5kbGVycyBpbnRvIHRoZSBtb25pdG9yIChlZXByb20pCisgICAgIGFkZHJlc3Mgc3BhY2UuICBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgb25jZSB0aGUgdGFyZ2V0IGVuZGlhbm5lc3MKKyAgICAgaGFzIGJlZW4gZGV0ZXJtaW5lZC4gKi8KKyAgeworICAgIHVuc2lnbmVkIGxvb3A7CisgICAgLyogRW50cnkgaW50byB0aGUgSURUIG1vbml0b3IgaXMgdmlhIGZpeGVkIGFkZHJlc3MgdmVjdG9ycywgYW5kCisgICAgICAgbm90IHVzaW5nIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLiBUbyBhdm9pZCBjbGFzaGluZyB3aXRoIHVzZSBvZgorICAgICAgIHRoZSBNSVBTIFRSQVAgc3lzdGVtLCB3ZSBwbGFjZSBvdXIgb3duIChzaW11bGF0b3Igc3BlY2lmaWMpCisgICAgICAgInVuZGVmaW5lZCIgaW5zdHJ1Y3Rpb25zIGludG8gdGhlIHJlbGV2YW50IHZlY3RvciBzbG90cy4gKi8KKyAgICBmb3IgKGxvb3AgPSAwOyAobG9vcCA8IE1PTklUT1JfU0laRSk7IGxvb3AgKz0gNCkKKyAgICAgIHsKKwlhZGRyZXNzX3dvcmQgdmFkZHIgPSAoTU9OSVRPUl9CQVNFICsgbG9vcCk7CisJdW5zaWduZWQzMiBpbnNuID0gKFJTVkRfSU5TVFJVQ1RJT04gfCAoKChsb29wID4+IDIpICYgUlNWRF9JTlNUUlVDVElPTl9BUkdfTUFTSykgPDwgUlNWRF9JTlNUUlVDVElPTl9BUkdfU0hJRlQpKTsKKwlIMlQgKGluc24pOworCXNpbV93cml0ZSAoc2QsIHZhZGRyLCAoY2hhciAqKSZpbnNuLCBzaXplb2YgKGluc24pKTsKKyAgICAgIH0KKyAgICAvKiBUaGUgUE1PTiBtb25pdG9yIHVzZXMgdGhlIHNhbWUgYWRkcmVzcyBzcGFjZSwgYnV0IHJhdGhlciB0aGFuCisgICAgICAgYnJhbmNoaW5nIGludG8gaXQgdGhlIGFkZHJlc3Mgb2YgYSByb3V0aW5lIGlzIGxvYWRlZC4gV2UgY2FuCisgICAgICAgY2hlYXQgZm9yIHRoZSBtb21lbnQsIGFuZCBkaXJlY3QgdGhlIFBNT04gcm91dGluZSB0byBJRFQgc3R5bGUKKyAgICAgICBpbnN0cnVjdGlvbnMgd2l0aGluIHRoZSBtb25pdG9yIHNwYWNlLiBUaGlzIHJlbGllcyBvbiB0aGUgSURUCisgICAgICAgbW9uaXRvciBub3QgdXNpbmcgdGhlIGxvY2F0aW9ucyBmcm9tIDB4QkZDMDA1MDAgb253YXJkcyBhcyBpdHMKKyAgICAgICBlbnRyeSBwb2ludHMuKi8KKyAgICBmb3IgKGxvb3AgPSAwOyAobG9vcCA8IDI0KTsgbG9vcCsrKQorICAgICAgeworICAgICAgICBhZGRyZXNzX3dvcmQgdmFkZHIgPSAoTU9OSVRPUl9CQVNFICsgMHg1MDAgKyAobG9vcCAqIDQpKTsKKyAgICAgICAgdW5zaWduZWQzMiB2YWx1ZSA9ICgoMHg1MDAgLSA4KSAvIDgpOyAvKiBkZWZhdWx0IFVOREVGSU5FRCByZWFzb24gY29kZSAqLworICAgICAgICBzd2l0Y2ggKGxvb3ApCisgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAwOiAvKiByZWFkICovCisgICAgICAgICAgICAgIHZhbHVlID0gNzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6IC8qIHdyaXRlICovCisgICAgICAgICAgICAgIHZhbHVlID0gODsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IC8qIG9wZW4gKi8KKyAgICAgICAgICAgICAgdmFsdWUgPSA2OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzogLyogY2xvc2UgKi8KKyAgICAgICAgICAgICAgdmFsdWUgPSAxMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU6IC8qIHByaW50ZiAqLworICAgICAgICAgICAgICB2YWx1ZSA9ICgoMHg1MDAgLSAxNikgLyA4KTsgLyogbm90IGFuIElEVCByZWFzb24gY29kZSAqLworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODogLyogY2xpZXhpdCAqLworICAgICAgICAgICAgICB2YWx1ZSA9IDE3OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTE6IC8qIGZsdXNoX2NhY2hlICovCisgICAgICAgICAgICAgIHZhbHVlID0gMjg7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKwkvKiBGSVhNRSAtIHNob3VsZCBtb25pdG9yX2Jhc2UgYmUgU0lNX0FERFI/PyAqLworICAgICAgICB2YWx1ZSA9ICgodW5zaWduZWQgaW50KU1PTklUT1JfQkFTRSArICh2YWx1ZSAqIDgpKTsKKwlIMlQgKHZhbHVlKTsKKwlzaW1fd3JpdGUgKHNkLCB2YWRkciwgKGNoYXIgKikmdmFsdWUsIHNpemVvZiAodmFsdWUpKTsKKworCS8qIFRoZSBMU0kgTWluaVJJU0MgUE1PTiBoYXMgaXRzIHZlY3RvcnMgYXQgMHgyMDAsIG5vdCAweDUwMC4gICovCisJdmFkZHIgLT0gMHgzMDA7CisJc2ltX3dyaXRlIChzZCwgdmFkZHIsIChjaGFyICopJnZhbHVlLCBzaXplb2YgKHZhbHVlKSk7CisgICAgICB9CisgIH0KKworCisKKyAgcmV0dXJuIHNkOworfQorCisjaWYgZGVmaW5lZChUUkFDRSkKK3N0YXRpYyB2b2lkCitvcGVuX3RyYWNlKHNkKQorICAgICBTSU1fREVTQyBzZDsKK3sKKyAgdHJhY2VmaCA9IGZvcGVuKHRyYWNlZmlsZSwid2IrIik7CisgIGlmICh0cmFjZWZoID09IE5VTEwpCisgICAgeworICAgICAgc2ltX2lvX2VwcmludGYoc2QsIkZhaWxlZCB0byBjcmVhdGUgZmlsZSBcIiVzXCIsIHdyaXRpbmcgdHJhY2UgaW5mb3JtYXRpb24gdG8gc3RkZXJyLlxuIix0cmFjZWZpbGUpOworICAgICAgdHJhY2VmaCA9IHN0ZGVycjsKKyAgfQorfQorI2VuZGlmIC8qIFRSQUNFICovCisKKy8qIFJldHVybiBuYW1lIG9mIGFuIGluc24sIHVzZWQgYnkgaW5zbiBwcm9maWxpbmcuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorZ2V0X2luc25fbmFtZSAoc2ltX2NwdSAqY3B1LCBpbnQgaSkKK3sKKyAgcmV0dXJuIGl0YWJsZVtpXS5uYW1lOworfQorCit2b2lkCitzaW1fY2xvc2UgKHNkLCBxdWl0dGluZykKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCBxdWl0dGluZzsKK3sKKyNpZmRlZiBERUJVRworICBwcmludGYoIkRCRzogc2ltX2Nsb3NlOiBlbnRlcmVkIChxdWl0dGluZyA9ICVkKVxuIixxdWl0dGluZyk7CisjZW5kaWYKKworCisgIC8qICJxdWl0dGluZyIgaXMgbm9uLXplcm8gaWYgd2UgY2Fubm90IGhhbmcgb24gZXJyb3JzICovCisKKyAgLyogc2h1dCBkb3duIG1vZHVsZXMgKi8KKyAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKKworICAvKiBFbnN1cmUgdGhhdCBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCB0aHJvdWdoIHRoZSBjYWxsYmFjaworICAgICBtZWNoYW5pc20gYXJlIHJlbGVhc2VkOiAqLworICBzaW1faW9fc2h1dGRvd24gKHNkKTsKKworI2lmIGRlZmluZWQoVFJBQ0UpCisgIGlmICh0cmFjZWZoICE9IE5VTEwgJiYgdHJhY2VmaCAhPSBzdGRlcnIpCisgICBmY2xvc2UodHJhY2VmaCk7CisgIHRyYWNlZmggPSBOVUxMOworI2VuZGlmIC8qIFRSQUNFICovCisKKyAgLyogRklYTUUgLSBmcmVlIFNEICovCisKKyAgcmV0dXJuOworfQorCisKK2ludAorc2ltX3dyaXRlIChzZCxhZGRyLGJ1ZmZlcixzaXplKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgU0lNX0FERFIgYWRkcjsKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICAgICBpbnQgc2l6ZTsKK3sKKyAgaW50IGluZGV4OworICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCAwKTsgLyogRklYTUUgKi8KKworICAvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLCBvciB6ZXJvIGlmIGVycm9yLiAqLworI2lmZGVmIERFQlVHCisgIHNpbV9pb19wcmludGYoc2QsInNpbV93cml0ZSgweCVzLGJ1ZmZlciwlZCk7XG4iLHByX2FkZHIoYWRkciksc2l6ZSk7CisjZW5kaWYKKworICAvKiBXZSB1c2UgcmF3IHJlYWQgYW5kIHdyaXRlIHJvdXRpbmVzLCBzaW5jZSB3ZSBkbyBub3Qgd2FudCB0byBjb3VudAorICAgICB0aGUgR0RCIG1lbW9yeSBhY2Nlc3NlcyBpbiBvdXIgc3RhdGlzdGljcyBnYXRoZXJpbmcuICovCisKKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgaW5kZXgrKykKKyAgICB7CisgICAgICBhZGRyZXNzX3dvcmQgdmFkZHIgPSAoYWRkcmVzc193b3JkKWFkZHIgKyBpbmRleDsKKyAgICAgIGFkZHJlc3Nfd29yZCBwYWRkcjsKKyAgICAgIGludCBjY2E7CisgICAgICBpZiAoIWFkZHJlc3NfdHJhbnNsYXRpb24gKFNELCBDUFUsIE5VTExfQ0lBLCB2YWRkciwgaXNEQVRBLCBpc1NUT1JFLCAmcGFkZHIsICZjY2EsIGlzUkFXKSkKKwlicmVhazsKKyAgICAgIGlmIChzaW1fY29yZV93cml0ZV9idWZmZXIgKFNELCBDUFUsIHJlYWRfbWFwLCBidWZmZXIgKyBpbmRleCwgcGFkZHIsIDEpICE9IDEpCisJYnJlYWs7CisgICAgfQorCisgIHJldHVybihpbmRleCk7Cit9CisKK2ludAorc2ltX3JlYWQgKHNkLGFkZHIsYnVmZmVyLHNpemUpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBTSU1fQUREUiBhZGRyOworICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgICAgIGludCBzaXplOworeworICBpbnQgaW5kZXg7CisgIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIDApOyAvKiBGSVhNRSAqLworCisgIC8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIHplcm8gaWYgZXJyb3IuICovCisjaWZkZWYgREVCVUcKKyAgc2ltX2lvX3ByaW50ZihzZCwic2ltX3JlYWQoMHglcyxidWZmZXIsJWQpO1xuIixwcl9hZGRyKGFkZHIpLHNpemUpOworI2VuZGlmIC8qIERFQlVHICovCisKKyAgZm9yIChpbmRleCA9IDA7IChpbmRleCA8IHNpemUpOyBpbmRleCsrKQorICAgIHsKKyAgICAgIGFkZHJlc3Nfd29yZCB2YWRkciA9IChhZGRyZXNzX3dvcmQpYWRkciArIGluZGV4OworICAgICAgYWRkcmVzc193b3JkIHBhZGRyOworICAgICAgaW50IGNjYTsKKyAgICAgIGlmICghYWRkcmVzc190cmFuc2xhdGlvbiAoU0QsIENQVSwgTlVMTF9DSUEsIHZhZGRyLCBpc0RBVEEsIGlzTE9BRCwgJnBhZGRyLCAmY2NhLCBpc1JBVykpCisJYnJlYWs7CisgICAgICBpZiAoc2ltX2NvcmVfcmVhZF9idWZmZXIgKFNELCBDUFUsIHJlYWRfbWFwLCBidWZmZXIgKyBpbmRleCwgcGFkZHIsIDEpICE9IDEpCisJYnJlYWs7CisgICAgfQorCisgIHJldHVybihpbmRleCk7Cit9CisKK2ludAorc2ltX3N0b3JlX3JlZ2lzdGVyIChzZCxybixtZW1vcnksbGVuZ3RoKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgaW50IHJuOworICAgICB1bnNpZ25lZCBjaGFyICptZW1vcnk7CisgICAgIGludCBsZW5ndGg7Cit7CisgIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIDApOyAvKiBGSVhNRSAqLworICAvKiBOT1RFOiBnZGIgKHRoZSBjbGllbnQpIHN0b3JlcyByZWdpc3RlcnMgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIKKyAgICAgd2hpbGUgdGhlIHNpbXVsYXRvciB1c2VzIGhvc3QgYnl0ZSBvcmRlciAqLworI2lmZGVmIERFQlVHCisgIHNpbV9pb19wcmludGYoc2QsInNpbV9zdG9yZV9yZWdpc3RlciglZCwqbWVtb3J5PTB4JXMpO1xuIixybixwcl9hZGRyKCooKFNJTV9BRERSICopbWVtb3J5KSkpOworI2VuZGlmIC8qIERFQlVHICovCisKKyAgLyogVW5mb3J0dW5hdGVseSB0aGlzIHN1ZmZlcnMgZnJvbSB0aGUgc2FtZSBwcm9ibGVtIGFzIHRoZSByZWdpc3RlcgorICAgICBudW1iZXJpbmcgb25lLiBXZSBuZWVkIHRvIGtub3cgd2hhdCB0aGUgd2lkdGggb2YgZWFjaCBsb2dpY2FsCisgICAgIHJlZ2lzdGVyIG51bWJlciBpcyBmb3IgdGhlIGFyY2hpdGVjdHVyZSBiZWluZyBzaW11bGF0ZWQuICovCisKKyAgaWYgKGNwdS0+cmVnaXN0ZXJfd2lkdGhzW3JuXSA9PSAwKQorICAgIHsKKyAgICAgIHNpbV9pb19lcHJpbnRmKHNkLCJJbnZhbGlkIHJlZ2lzdGVyIHdpZHRoIGZvciAlZCAocmVnaXN0ZXIgc3RvcmUgaWdub3JlZClcbiIscm4pOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisKKworICBpZiAocm4gPj0gRkdSSURYICYmIHJuIDwgRkdSSURYICsgTlJfRkdSKQorICAgIHsKKyAgICAgIGlmIChjcHUtPnJlZ2lzdGVyX3dpZHRoc1tybl0gPT0gMzIpCisJeworCSAgY3B1LT5mZ3Jbcm4gLSBGR1JJRFhdID0gVDJIXzQgKCoodW5zaWduZWQzMiopbWVtb3J5KTsKKwkgIHJldHVybiA0OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjcHUtPmZncltybiAtIEZHUklEWF0gPSBUMkhfOCAoKih1bnNpZ25lZDY0KiltZW1vcnkpOworCSAgcmV0dXJuIDg7CisJfQorICAgIH0KKworICBpZiAoY3B1LT5yZWdpc3Rlcl93aWR0aHNbcm5dID09IDMyKQorICAgIHsKKyAgICAgIGNwdS0+cmVnaXN0ZXJzW3JuXSA9IFQySF80ICgqKHVuc2lnbmVkMzIqKW1lbW9yeSk7CisgICAgICByZXR1cm4gNDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjcHUtPnJlZ2lzdGVyc1tybl0gPSBUMkhfOCAoKih1bnNpZ25lZDY0KiltZW1vcnkpOworICAgICAgcmV0dXJuIDg7CisgICAgfQorCisgIHJldHVybiAwOworfQorCitpbnQKK3NpbV9mZXRjaF9yZWdpc3RlciAoc2Qscm4sbWVtb3J5LGxlbmd0aCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCBybjsKKyAgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OworICAgICBpbnQgbGVuZ3RoOworeworICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNkLCAwKTsgLyogRklYTUUgKi8KKyAgLyogTk9URTogZ2RiICh0aGUgY2xpZW50KSBzdG9yZXMgcmVnaXN0ZXJzIGluIHRhcmdldCBieXRlIG9yZGVyCisgICAgIHdoaWxlIHRoZSBzaW11bGF0b3IgdXNlcyBob3N0IGJ5dGUgb3JkZXIgKi8KKyNpZmRlZiBERUJVRworI2lmIDAgIC8qIEZJWE1FOiBkb2Vzbid0IGNvbXBpbGUgKi8KKyAgc2ltX2lvX3ByaW50ZihzZCwic2ltX2ZldGNoX3JlZ2lzdGVyKCVkPTB4JXMsbWVtKSA6IHBsYWNlIHNpbXVsYXRvciByZWdpc3RlcnMgaW50byBtZW1vcnlcbiIscm4scHJfYWRkcihyZWdpc3RlcnNbcm5dKSk7CisjZW5kaWYKKyNlbmRpZiAvKiBERUJVRyAqLworCisgIGlmIChjcHUtPnJlZ2lzdGVyX3dpZHRoc1tybl0gPT0gMCkKKyAgICB7CisgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJJbnZhbGlkIHJlZ2lzdGVyIHdpZHRoIGZvciAlZCAocmVnaXN0ZXIgZmV0Y2ggaWdub3JlZClcbiIscm4pOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisKKworICAvKiBBbnkgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKi8KKyAgaWYgKHJuID49IEZHUklEWCAmJiBybiA8IEZHUklEWCArIE5SX0ZHUikKKyAgICB7CisgICAgICBpZiAoY3B1LT5yZWdpc3Rlcl93aWR0aHNbcm5dID09IDMyKQorCXsKKwkgICoodW5zaWduZWQzMiopbWVtb3J5ID0gSDJUXzQgKGNwdS0+ZmdyW3JuIC0gRkdSSURYXSk7CisJICByZXR1cm4gNDsKKwl9CisgICAgICBlbHNlCisJeworCSAgKih1bnNpZ25lZDY0KiltZW1vcnkgPSBIMlRfOCAoY3B1LT5mZ3Jbcm4gLSBGR1JJRFhdKTsKKwkgIHJldHVybiA4OworCX0KKyAgICB9CisKKyAgaWYgKGNwdS0+cmVnaXN0ZXJfd2lkdGhzW3JuXSA9PSAzMikKKyAgICB7CisgICAgICAqKHVuc2lnbmVkMzIqKW1lbW9yeSA9IEgyVF80ICgodW5zaWduZWQzMikoY3B1LT5yZWdpc3RlcnNbcm5dKSk7CisgICAgICByZXR1cm4gNDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqKHVuc2lnbmVkNjQqKW1lbW9yeSA9IEgyVF84ICgodW5zaWduZWQ2NCkoY3B1LT5yZWdpc3RlcnNbcm5dKSk7CisgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKworU0lNX1JDCitzaW1fY3JlYXRlX2luZmVyaW9yIChzZCwgYWJmZCwgYXJndixlbnYpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKKyAgICAgY2hhciAqKmFyZ3Y7CisgICAgIGNoYXIgKiplbnY7Cit7CisKKyNpZmRlZiBERUJVRworI2lmIDAgLyogRklYTUU6IGRvZXNuJ3QgY29tcGlsZSAqLworICBwcmludGYoIkRCRzogc2ltX2NyZWF0ZV9pbmZlcmlvciBlbnRlcmVkOiBzdGFydF9hZGRyZXNzID0gMHglc1xuIiwKKwkgcHJfYWRkcihQQykpOworI2VuZGlmCisjZW5kaWYgLyogREVCVUcgKi8KKworICBDb2xkUmVzZXQoc2QpOworCisgIGlmIChhYmZkICE9IE5VTEwpCisgICAgeworICAgICAgLyogb3ZlcnJpZGUgUEMgdmFsdWUgc2V0IGJ5IENvbGRSZXNldCAoKSAqLworICAgICAgaW50IGNwdV9ucjsKKyAgICAgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgc2ltX2VuZ2luZV9ucl9jcHVzIChzZCk7IGNwdV9ucisrKQorCXsKKwkgIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVSAoc2QsIGNwdV9ucik7CisJICBDSUFfU0VUIChjcHUsICh1bnNpZ25lZDY0KSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpKTsKKwl9CisgICAgfQorCisjaWYgMCAvKiBkZWYgREVCVUcgKi8KKyAgaWYgKGFyZ3YgfHwgZW52KQorICAgIHsKKyAgICAgIC8qIFdlIHNob3VsZCByZWFsbHkgcGxhY2UgdGhlIGFyZ3Ygc2xvdCB2YWx1ZXMgaW50byB0aGUgYXJndW1lbnQKKwkgcmVnaXN0ZXJzLCBhbmQgb250byB0aGUgc3RhY2sgYXMgcmVxdWlyZWQuIEhvd2V2ZXIsIHRoaXMKKwkgYXNzdW1lcyB0aGF0IHdlIGhhdmUgYSBzdGFjayBkZWZpbmVkLCB3aGljaCBpcyBub3QKKwkgbmVjZXNzYXJpbHkgdHJ1ZSBhdCB0aGUgbW9tZW50LiAqLworICAgICAgY2hhciAqKmNwdHI7CisgICAgICBzaW1faW9fcHJpbnRmKHNkLCJzaW1fY3JlYXRlX2luZmVyaW9yKCkgOiBwYXNzZWQgYXJndW1lbnRzIGlnbm9yZWRcbiIpOworICAgICAgZm9yIChjcHRyID0gYXJndjsgKGNwdHIgJiYgKmNwdHIpOyBjcHRyKyspCisJcHJpbnRmKCJEQkc6IGFyZyBcIiVzXCJcbiIsKmNwdHIpOworICAgIH0KKyNlbmRpZiAvKiBERUJVRyAqLworCisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKK3ZvaWQKK3NpbV9kb19jb21tYW5kIChzZCxjbWQpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBjaGFyICpjbWQ7Cit7CisgIGlmIChzaW1fYXJnc19jb21tYW5kIChzZCwgY21kKSAhPSBTSU1fUkNfT0spCisgICAgc2ltX2lvX3ByaW50ZiAoc2QsICJFcnJvcjogXCIlc1wiIGlzIG5vdCBhIHZhbGlkIE1JUFMgc2ltdWxhdG9yIGNvbW1hbmQuXG4iLAorCQkgICBjbWQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tIFByaXZhdGUgc2ltdWxhdG9yIHN1cHBvcnQgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFJlYWQgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gbWVtb3J5LCByZXR1cm4gaW4gYSBidWZmZXIgKi8KK3N0YXRpYyBjaGFyICoKK2ZldGNoX3N0ciAoU0lNX0RFU0Mgc2QsCisJICAgYWRkcmVzc193b3JkIGFkZHIpCit7CisgIGNoYXIgKmJ1ZjsKKyAgaW50IG5yID0gMDsKKyAgY2hhciBudWxsOworICB3aGlsZSAoc2ltX3JlYWQgKHNkLCBhZGRyICsgbnIsICZudWxsLCAxKSA9PSAxICYmIG51bGwgIT0gMCkKKyAgICBucisrOworICBidWYgPSBOWkFMTE9DIChjaGFyLCBuciArIDEpOworICBzaW1fcmVhZCAoc2QsIGFkZHIsIGJ1ZiwgbnIpOworICByZXR1cm4gYnVmOworfQorCisvKiBTaW1wbGUgbW9uaXRvciBpbnRlcmZhY2UgKGN1cnJlbnRseSBzZXR1cCBmb3IgdGhlIElEVCBhbmQgUE1PTiBtb25pdG9ycykgKi8KK3ZvaWQKK3NpbV9tb25pdG9yIChTSU1fREVTQyBzZCwKKwkgICAgIHNpbV9jcHUgKmNwdSwKKwkgICAgIGFkZHJlc3Nfd29yZCBjaWEsCisJICAgICB1bnNpZ25lZCBpbnQgcmVhc29uKQoreworI2lmZGVmIERFQlVHCisgIHByaW50ZigiREJHOiBzaW1fbW9uaXRvcjogZW50ZXJlZCAocmVhc29uID0gJWQpXG4iLHJlYXNvbik7CisjZW5kaWYgLyogREVCVUcgKi8KKworICAvKiBUaGUgSURUIG1vbml0b3IgYWN0dWFsbHkgYWxsb3dzIHR3byBpbnN0cnVjdGlvbnMgcGVyIHZlY3RvcgorICAgICBzbG90LiBIb3dldmVyLCB0aGUgc2ltdWxhdG9yIGN1cnJlbnRseSBjYXVzZXMgYSB0cmFwIG9uIGVhY2gKKyAgICAgaW5kaXZpZHVhbCBpbnN0cnVjdGlvbi4gV2UgY2hlYXQsIGFuZCBsb3NlIHRoZSBib3R0b20gYml0LiAqLworICByZWFzb24gPj49IDE7CisKKyAgLyogVGhlIGZvbGxvd2luZyBjYWxsYmFjayBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSwgaG93ZXZlciB0aGUKKyAgICAgbW9uaXRvciB3ZSBhcmUgc2ltdWxhdGluZyBkb2VzIG5vdCBtYWtlIHVzZSBvZiB0aGVtOiBnZXRfZXJybm8sCisgICAgIGlzYXR0eSwgbHNlZWssIHJlbmFtZSwgc3lzdGVtLCB0aW1lIGFuZCB1bmxpbmsgKi8KKyAgc3dpdGNoIChyZWFzb24pCisgICAgeworCisgICAgY2FzZSA2OiAvKiBpbnQgb3BlbihjaGFyICpwYXRoLGludCBmbGFncykgKi8KKyAgICAgIHsKKwljaGFyICpwYXRoID0gZmV0Y2hfc3RyIChzZCwgQTApOworCVYwID0gc2ltX2lvX29wZW4gKHNkLCBwYXRoLCAoaW50KUExKTsKKwl6ZnJlZSAocGF0aCk7CisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIDc6IC8qIGludCByZWFkKGludCBmaWxlLGNoYXIgKnB0cixpbnQgbGVuKSAqLworICAgICAgeworCWludCBmZCA9IEEwOworCWludCBuciA9IEEyOworCWNoYXIgKmJ1ZiA9IHphbGxvYyAobnIpOworCVYwID0gc2ltX2lvX3JlYWQgKHNkLCBmZCwgYnVmLCBucik7CisJc2ltX3dyaXRlIChzZCwgQTEsIGJ1ZiwgbnIpOworCXpmcmVlIChidWYpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDg6IC8qIGludCB3cml0ZShpbnQgZmlsZSxjaGFyICpwdHIsaW50IGxlbikgKi8KKyAgICAgIHsKKwlpbnQgZmQgPSBBMDsKKwlpbnQgbnIgPSBBMjsKKwljaGFyICpidWYgPSB6YWxsb2MgKG5yKTsKKwlzaW1fcmVhZCAoc2QsIEExLCBidWYsIG5yKTsKKwlWMCA9IHNpbV9pb193cml0ZSAoc2QsIGZkLCBidWYsIG5yKTsKKwl6ZnJlZSAoYnVmKTsKKwlicmVhazsKKyAgICAgIH0KKworICAgIGNhc2UgMTA6IC8qIGludCBjbG9zZShpbnQgZmlsZSkgKi8KKyAgICAgIHsKKwlWMCA9IHNpbV9pb19jbG9zZSAoc2QsIChpbnQpQTApOworCWJyZWFrOworICAgICAgfQorCisgICAgY2FzZSAyOiAgLyogRGVuc2FuIG1vbml0b3I6IGNoYXIgaW5ieXRlKGludCB3YWl0ZmxhZykgKi8KKyAgICAgIHsKKwlpZiAoQTAgPT0gMCkJLyogd2FpdGZsYWcgPT0gTk9XQUlUICovCisJICBWMCA9ICh1bnNpZ25lZF93b3JkKS0xOworICAgICAgfQorICAgICAvKiBEcm9wIHRocm91Z2ggdG8gY2FzZSAxMSAqLworCisgICAgY2FzZSAxMTogLyogY2hhciBpbmJ5dGUodm9pZCkgKi8KKyAgICAgIHsKKyAgICAgICAgY2hhciB0bXA7CisgICAgICAgIGlmIChzaW1faW9fcmVhZF9zdGRpbiAoc2QsICZ0bXAsIHNpemVvZihjaGFyKSkgIT0gc2l6ZW9mKGNoYXIpKQorCSAgeworCSAgICBzaW1faW9fZXJyb3Ioc2QsIkludmFsaWQgcmV0dXJuIGZyb20gY2hhcmFjdGVyIHJlYWQiKTsKKwkgICAgVjAgPSAodW5zaWduZWRfd29yZCktMTsKKwkgIH0KKyAgICAgICAgZWxzZQorCSAgVjAgPSAodW5zaWduZWRfd29yZCl0bXA7CisJYnJlYWs7CisgICAgICB9CisKKyAgICBjYXNlIDM6ICAvKiBEZW5zYW4gbW9uaXRvcjogdm9pZCBjbyhjaGFyIGNocikgKi8KKyAgICBjYXNlIDEyOiAvKiB2b2lkIG91dGJ5dGUoY2hhciBjaHIpIDogd3JpdGUgYSBieXRlIHRvICJzdGRvdXQiICovCisgICAgICB7CisgICAgICAgIGNoYXIgdG1wID0gKGNoYXIpKEEwICYgMHhGRik7CisgICAgICAgIHNpbV9pb193cml0ZV9zdGRvdXQgKHNkLCAmdG1wLCBzaXplb2YoY2hhcikpOworCWJyZWFrOworICAgICAgfQorCisgICAgY2FzZSAxNzogLyogdm9pZCBfZXhpdCgpICovCisgICAgICB7CisJc2ltX2lvX2VwcmludGYgKHNkLCAic2ltX21vbml0b3IoMTcpOiBfZXhpdChpbnQgcmVhc29uKSB0byBiZSBjb2RlZFxuIik7CisJc2ltX2VuZ2luZV9oYWx0IChTRCwgQ1BVLCBOVUxMLCBOVUxMX0NJQSwgc2ltX2V4aXRlZCwKKwkJCSAodW5zaWduZWQgaW50KShBMCAmIDB4RkZGRkZGRkYpKTsKKwlicmVhazsKKyAgICAgIH0KKworICAgIGNhc2UgMjggOiAvKiBQTU9OIGZsdXNoX2NhY2hlICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgNTU6IC8qIHZvaWQgZ2V0X21lbV9pbmZvKHVuc2lnbmVkIGludCAqcHRyKSAqLworICAgICAgLyogaW46ICBBMCA9IHBvaW50ZXIgdG8gdGhyZWUgd29yZCBtZW1vcnkgbG9jYXRpb24gKi8KKyAgICAgIC8qIG91dDogW0EwICsgMF0gPSBzaXplICovCisgICAgICAvKiAgICAgIFtBMCArIDRdID0gaW5zdHJ1Y3Rpb24gY2FjaGUgc2l6ZSAqLworICAgICAgLyogICAgICBbQTAgKyA4XSA9IGRhdGEgY2FjaGUgc2l6ZSAqLworICAgICAgeworCXVuc2lnbmVkXzQgdmFsdWUgPSBNRU1fU0laRSAvKiBGSVhNRSBTVEFURV9NRU1fU0laRSAoc2QpICovOworCXVuc2lnbmVkXzQgemVybyA9IDA7CisJSDJUICh2YWx1ZSk7CisJc2ltX3dyaXRlIChzZCwgQTAgKyAwLCAoY2hhciAqKSZ2YWx1ZSwgNCk7CisJc2ltX3dyaXRlIChzZCwgQTAgKyA0LCAoY2hhciAqKSZ6ZXJvLCA0KTsKKwlzaW1fd3JpdGUgKHNkLCBBMCArIDgsIChjaGFyICopJnplcm8sIDQpOworCS8qIHNpbV9pb19lcHJpbnRmIChzZCwgInNpbTogZ2V0X21lbV9pbmZvKCkgZGVwcmVjaWF0ZWRcbiIpOyAqLworCWJyZWFrOworICAgICAgfQorICAgIAorICAgIGNhc2UgMTU4IDogLyogUE1PTiBwcmludGYgKi8KKyAgICAgIC8qIGluOiAgQTAgPSBwb2ludGVyIHRvIGZvcm1hdCBzdHJpbmcgKi8KKyAgICAgIC8qICAgICAgQTEgPSBvcHRpb25hbCBhcmd1bWVudCAxICovCisgICAgICAvKiAgICAgIEEyID0gb3B0aW9uYWwgYXJndW1lbnQgMiAqLworICAgICAgLyogICAgICBBMyA9IG9wdGlvbmFsIGFyZ3VtZW50IDMgKi8KKyAgICAgIC8qIG91dDogdm9pZCAqLworICAgICAgLyogVGhlIGZvbGxvd2luZyBpcyBiYXNlZCBvbiB0aGUgUE1PTiBwcmludGYgc291cmNlICovCisgICAgICB7CisJYWRkcmVzc193b3JkIHMgPSBBMDsKKwljaGFyIGM7CisJc2lnbmVkX3dvcmQgKmFwID0gJkExOyAvKiAxc3QgYXJndW1lbnQgKi8KKyAgICAgICAgLyogVGhpcyBpc24ndCB0aGUgcXVpY2tlc3Qgd2F5LCBzaW5jZSB3ZSBjYWxsIHRoZSBob3N0IHByaW50CisgICAgICAgICAgIHJvdXRpbmUgZm9yIGV2ZXJ5IGNoYXJhY3RlciBhbG1vc3QuIEJ1dCBpdCBkb2VzIGF2b2lkCisgICAgICAgICAgIGhhdmluZyB0byBhbGxvY2F0ZSBhbmQgbWFuYWdlIGEgdGVtcG9yYXJ5IHN0cmluZyBidWZmZXIuICovCisJLyogVE9ETzogSW5jbHVkZSBjaGVjayB0aGF0IHdlIG9ubHkgdXNlIHRocmVlIGFyZ3VtZW50cyAoQTEsCisgICAgICAgICAgIEEyIGFuZCBBMykgKi8KKwl3aGlsZSAoc2ltX3JlYWQgKHNkLCBzKyssICZjLCAxKSAmJiBjICE9ICdcMCcpCisJICB7CisgICAgICAgICAgICBpZiAoYyA9PSAnJScpCisJICAgICAgeworCQljaGFyIHRtcFs0MF07CisJCWVudW0ge0ZNVF9SSlVTVCwgRk1UX0xKVVNULCBGTVRfUkpVU1QwLCBGTVRfQ0VOVEVSfSBmbXQgPSBGTVRfUkpVU1Q7CisJCWludCB3aWR0aCA9IDAsIHRydW5jID0gMCwgaGFkZG90ID0gMCwgbG9uZ2xvbmcgPSAwOworCQl3aGlsZSAoc2ltX3JlYWQgKHNkLCBzKyssICZjLCAxKSAmJiBjICE9ICdcMCcpCisJCSAgeworCQkgICAgaWYgKHN0cmNociAoImRvYnhYdWxzY2VmZyUiLCBjKSkKKwkJICAgICAgYnJlYWs7CisJCSAgICBlbHNlIGlmIChjID09ICctJykKKwkJICAgICAgZm10ID0gRk1UX0xKVVNUOworCQkgICAgZWxzZSBpZiAoYyA9PSAnMCcpCisJCSAgICAgIGZtdCA9IEZNVF9SSlVTVDA7CisJCSAgICBlbHNlIGlmIChjID09ICd+JykKKwkJICAgICAgZm10ID0gRk1UX0NFTlRFUjsKKwkJICAgIGVsc2UgaWYgKGMgPT0gJyonKQorCQkgICAgICB7CisJCQlpZiAoaGFkZG90KQorCQkJICB0cnVuYyA9IChpbnQpKmFwKys7CisJCQllbHNlCisJCQkgIHdpZHRoID0gKGludCkqYXArKzsKKwkJICAgICAgfQorCQkgICAgZWxzZSBpZiAoYyA+PSAnMScgJiYgYyA8PSAnOScpCisJCSAgICAgIHsKKwkJCWFkZHJlc3Nfd29yZCB0ID0gczsKKwkJCXVuc2lnbmVkIGludCBuOworCQkJd2hpbGUgKHNpbV9yZWFkIChzZCwgcysrLCAmYywgMSkgPT0gMSAmJiBpc2RpZ2l0IChjKSkKKwkJCSAgdG1wW3MgLSB0XSA9IGM7CisJCQl0bXBbcyAtIHRdID0gJ1wwJzsKKwkJCW4gPSAodW5zaWduZWQgaW50KXN0cnRvbCh0bXAsTlVMTCwxMCk7CisJCQlpZiAoaGFkZG90KQorCQkJICB0cnVuYyA9IG47CisJCQllbHNlCisJCQkgIHdpZHRoID0gbjsKKwkJCXMtLTsKKwkJICAgICAgfQorCQkgICAgZWxzZSBpZiAoYyA9PSAnLicpCisJCSAgICAgIGhhZGRvdCA9IDE7CisJCSAgfQorCQlzd2l0Y2ggKGMpCisJCSAgeworCQkgIGNhc2UgJyUnOgorCQkgICAgc2ltX2lvX3ByaW50ZiAoc2QsICIlJSIpOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSAncyc6CisJCSAgICBpZiAoKGludCkqYXAgIT0gMCkKKwkJICAgICAgeworCQkJYWRkcmVzc193b3JkIHAgPSAqYXArKzsKKwkJCWNoYXIgY2g7CisJCQl3aGlsZSAoc2ltX3JlYWQgKHNkLCBwKyssICZjaCwgMSkgPT0gMSAmJiBjaCAhPSAnXDAnKQorCQkJICBzaW1faW9fcHJpbnRmKHNkLCAiJWMiLCBjaCk7CisJCSAgICAgIH0KKwkJICAgIGVsc2UKKwkJICAgICAgc2ltX2lvX3ByaW50ZihzZCwiKG51bGwpIik7CisJCSAgICBicmVhazsKKwkJICBjYXNlICdjJzoKKwkJICAgIHNpbV9pb19wcmludGYgKHNkLCAiJWMiLCAoaW50KSphcCsrKTsKKwkJICAgIGJyZWFrOworCQkgIGRlZmF1bHQ6CisJCSAgICBpZiAoYyA9PSAnbCcpCisJCSAgICAgIHsKKwkJCXNpbV9yZWFkIChzZCwgcysrLCAmYywgMSk7CisJCQlpZiAoYyA9PSAnbCcpCisJCQkgIHsKKwkJCSAgICBsb25nbG9uZyA9IDE7CisJCQkgICAgc2ltX3JlYWQgKHNkLCBzKyssICZjLCAxKTsKKwkJCSAgfQorCQkgICAgICB9CisJCSAgICBpZiAoc3RyY2hyICgiZG9ieFh1IiwgYykpCisJCSAgICAgIHsKKwkJCXdvcmQ2NCBsdiA9ICh3b3JkNjQpICphcCsrOworCQkJaWYgKGMgPT0gJ2InKQorCQkJICBzaW1faW9fcHJpbnRmKHNkLCI8YmluYXJ5IG5vdCBzdXBwb3J0ZWQ+Iik7CisJCQllbHNlCisJCQkgIHsKKwkJCSAgICBzcHJpbnRmICh0bXAsICIlJSVzJWMiLCBsb25nbG9uZyA/ICJsbCIgOiAiIiwgYyk7CisJCQkgICAgaWYgKGxvbmdsb25nKQorCQkJICAgICAgc2ltX2lvX3ByaW50ZihzZCwgdG1wLCBsdik7CisJCQkgICAgZWxzZQorCQkJICAgICAgc2ltX2lvX3ByaW50ZihzZCwgdG1wLCAoaW50KWx2KTsKKwkJCSAgfQorCQkgICAgICB9CisJCSAgICBlbHNlIGlmIChzdHJjaHIgKCJlRWZnRyIsIGMpKQorCQkgICAgICB7CisJCQlkb3VibGUgZGJsID0gKihkb3VibGUqKShhcCsrKTsKKwkJCXNwcmludGYgKHRtcCwgIiUlJWQuJWQlYyIsIHdpZHRoLCB0cnVuYywgYyk7CisJCQlzaW1faW9fcHJpbnRmIChzZCwgdG1wLCBkYmwpOworCQkJdHJ1bmMgPSAwOworCQkgICAgICB9CisJCSAgfQorCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHNpbV9pb19wcmludGYoc2QsICIlYyIsIGMpOworCSAgfQorCWJyZWFrOworICAgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgIHNpbV9pb19lcnJvciAoc2QsICJUT0RPOiBzaW1fbW9uaXRvciglZCkgOiBQQyA9IDB4JXNcbiIsCisJCSAgICByZWFzb24sIHByX2FkZHIoY2lhKSk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm47Cit9CisKKy8qIFN0b3JlIGEgd29yZCBpbnRvIG1lbW9yeS4gICovCisKK3N0YXRpYyB2b2lkCitzdG9yZV93b3JkIChTSU1fREVTQyBzZCwKKwkgICAgc2ltX2NwdSAqY3B1LAorCSAgICBhZGRyZXNzX3dvcmQgY2lhLAorCSAgICB1d29yZDY0IHZhZGRyLAorCSAgICBzaWduZWRfd29yZCB2YWwpCit7CisgIGFkZHJlc3Nfd29yZCBwYWRkcjsKKyAgaW50IHVuY2FjaGVkOworCisgIGlmICgodmFkZHIgJiAzKSAhPSAwKQorICAgIFNpZ25hbEV4Y2VwdGlvbkFkZHJlc3NTdG9yZSAoKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChBZGRyZXNzVHJhbnNsYXRpb24gKHZhZGRyLCBpc0RBVEEsIGlzU1RPUkUsICZwYWRkciwgJnVuY2FjaGVkLAorCQkJICAgICAgaXNUQVJHRVQsIGlzUkVBTCkpCisJeworCSAgY29uc3QgdXdvcmQ2NCBtYXNrID0gNzsKKwkgIHV3b3JkNjQgbWVtdmFsOworCSAgdW5zaWduZWQgaW50IGJ5dGU7CisKKwkgIHBhZGRyID0gKHBhZGRyICYgfm1hc2spIHwgKChwYWRkciAmIG1hc2spIF4gKFJldmVyc2VFbmRpYW4gPDwgMikpOworCSAgYnl0ZSA9ICh2YWRkciAmIG1hc2spIF4gKEJpZ0VuZGlhbkNQVSA8PCAyKTsKKwkgIG1lbXZhbCA9ICgodXdvcmQ2NCkgdmFsKSA8PCAoOCAqIGJ5dGUpOworCSAgU3RvcmVNZW1vcnkgKHVuY2FjaGVkLCBBY2Nlc3NMZW5ndGhfV09SRCwgbWVtdmFsLCAwLCBwYWRkciwgdmFkZHIsCisJCSAgICAgICBpc1JFQUwpOworCX0KKyAgICB9Cit9CisKKy8qIExvYWQgYSB3b3JkIGZyb20gbWVtb3J5LiAgKi8KKworc3RhdGljIHNpZ25lZF93b3JkCitsb2FkX3dvcmQgKFNJTV9ERVNDIHNkLAorCSAgIHNpbV9jcHUgKmNwdSwKKwkgICBhZGRyZXNzX3dvcmQgY2lhLAorCSAgIHV3b3JkNjQgdmFkZHIpCit7CisgIGlmICgodmFkZHIgJiAzKSAhPSAwKQorICAgIHsKKyAgICAgIFNJTV9DT1JFX1NJR05BTCAoU0QsIGNwdSwgY2lhLCByZWFkX21hcCwgQWNjZXNzTGVuZ3RoX1dPUkQrMSwgdmFkZHIsIHJlYWRfdHJhbnNmZXIsIHNpbV9jb3JlX3VuYWxpZ25lZF9zaWduYWwpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFkZHJlc3Nfd29yZCBwYWRkcjsKKyAgICAgIGludCB1bmNhY2hlZDsKKworICAgICAgaWYgKEFkZHJlc3NUcmFuc2xhdGlvbiAodmFkZHIsIGlzREFUQSwgaXNMT0FELCAmcGFkZHIsICZ1bmNhY2hlZCwKKwkJCSAgICAgIGlzVEFSR0VULCBpc1JFQUwpKQorCXsKKwkgIGNvbnN0IHV3b3JkNjQgbWFzayA9IDB4NzsKKwkgIGNvbnN0IHVuc2lnbmVkIGludCByZXZlcnNlID0gUmV2ZXJzZUVuZGlhbiA/IDEgOiAwOworCSAgY29uc3QgdW5zaWduZWQgaW50IGJpZ2VuZCA9IEJpZ0VuZGlhbkNQVSA/IDEgOiAwOworCSAgdXdvcmQ2NCBtZW12YWw7CisJICB1bnNpZ25lZCBpbnQgYnl0ZTsKKworCSAgcGFkZHIgPSAocGFkZHIgJiB+bWFzaykgfCAoKHBhZGRyICYgbWFzaykgXiAocmV2ZXJzZSA8PCAyKSk7CisJICBMb2FkTWVtb3J5ICgmbWVtdmFsLE5VTEwsdW5jYWNoZWQsIEFjY2Vzc0xlbmd0aF9XT1JELCBwYWRkciwgdmFkZHIsCisJCQkgICAgICAgaXNEQVRBLCBpc1JFQUwpOworCSAgYnl0ZSA9ICh2YWRkciAmIG1hc2spIF4gKGJpZ2VuZCA8PCAyKTsKKwkgIHJldHVybiBTSUdORVhURU5EICgoKG1lbXZhbCA+PiAoOCAqIGJ5dGUpKSAmIDB4ZmZmZmZmZmYpLCAzMik7CisJfQorICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogU2ltdWxhdGUgdGhlIG1pcHMxNiBlbnRyeSBhbmQgZXhpdCBwc2V1ZG8taW5zdHJ1Y3Rpb25zLiAgVGhlc2UKKyAgIHdvdWxkIG5vcm1hbGx5IGJlIGhhbmRsZWQgYnkgdGhlIHJlc2VydmVkIGluc3RydWN0aW9uIGV4Y2VwdGlvbgorICAgY29kZSwgYnV0IGZvciBlYXNlIG9mIHNpbXVsYXRpb24gd2UganVzdCBoYW5kbGUgdGhlbSBkaXJlY3RseS4gICovCisKK3N0YXRpYyB2b2lkCittaXBzMTZfZW50cnkgKFNJTV9ERVNDIHNkLAorCSAgICAgIHNpbV9jcHUgKmNwdSwKKwkgICAgICBhZGRyZXNzX3dvcmQgY2lhLAorCSAgICAgIHVuc2lnbmVkIGludCBpbnNuKQoreworICBpbnQgYXJlZ3MsIHNyZWdzLCBycmVnOworCisjaWZkZWYgREVCVUcKKyAgcHJpbnRmKCJEQkc6IG1pcHMxNl9lbnRyeTogZW50ZXJlZCAoaW5zbiA9IDB4JTA4WClcbiIsaW5zbik7CisjZW5kaWYgLyogREVCVUcgKi8KKworICBhcmVncyA9IChpbnNuICYgMHg3MDApID4+IDg7CisgIHNyZWdzID0gKGluc24gJiAweDBjMCkgPj4gNjsKKyAgcnJlZyA9ICAoaW5zbiAmIDB4MDIwKSA+PiA1OworCisgIC8qIFRoaXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgdGhlIGNhbGxlci4gICovCisgIGlmIChzcmVncyA9PSAzKQorICAgIGFib3J0ICgpOworCisgIGlmIChhcmVncyA8IDUpCisgICAgeworICAgICAgaW50IGk7CisgICAgICBzaWduZWRfd29yZCB0c3A7CisKKyAgICAgIC8qIFRoaXMgaXMgdGhlIGVudHJ5IHBzZXVkby1pbnN0cnVjdGlvbi4gICovCisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmVnczsgaSsrKQorCXN0b3JlX3dvcmQgKFNELCBDUFUsIGNpYSwgKHV3b3JkNjQpIChTUCArIDQgKiBpKSwgR1BSW2kgKyA0XSk7CisKKyAgICAgIHRzcCA9IFNQOworICAgICAgU1AgLT0gMzI7CisKKyAgICAgIGlmIChycmVnKQorCXsKKwkgIHRzcCAtPSA0OworCSAgc3RvcmVfd29yZCAoU0QsIENQVSwgY2lhLCAodXdvcmQ2NCkgdHNwLCBSQSk7CisJfQorCisgICAgICBmb3IgKGkgPSAwOyBpIDwgc3JlZ3M7IGkrKykKKwl7CisJICB0c3AgLT0gNDsKKwkgIHN0b3JlX3dvcmQgKFNELCBDUFUsIGNpYSwgKHV3b3JkNjQpIHRzcCwgR1BSWzE2ICsgaV0pOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIHNpZ25lZF93b3JkIHRzcDsKKworICAgICAgLyogVGhpcyBpcyB0aGUgZXhpdCBwc2V1ZG8taW5zdHJ1Y3Rpb24uICAqLworCisgICAgICB0c3AgPSBTUCArIDMyOworCisgICAgICBpZiAocnJlZykKKwl7CisJICB0c3AgLT0gNDsKKwkgIFJBID0gbG9hZF93b3JkIChTRCwgQ1BVLCBjaWEsICh1d29yZDY0KSB0c3ApOworCX0KKworICAgICAgZm9yIChpID0gMDsgaSA8IHNyZWdzOyBpKyspCisJeworCSAgdHNwIC09IDQ7CisJICBHUFJbaSArIDE2XSA9IGxvYWRfd29yZCAoU0QsIENQVSwgY2lhLCAodXdvcmQ2NCkgdHNwKTsKKwl9CisKKyAgICAgIFNQICs9IDMyOworCisgICAgICBpZiAoQ1VSUkVOVF9GTE9BVElOR19QT0lOVCA9PSBIQVJEX0ZMT0FUSU5HX1BPSU5UKQorCXsKKwkgIGlmIChhcmVncyA9PSA1KQorCSAgICB7CisJICAgICAgRkdSWzBdID0gV09SRDY0TE8gKEdQUls0XSk7CisJICAgICAgRlBSX1NUQVRFWzBdID0gZm10X3VuaW50ZXJwcmV0ZWQ7CisJICAgIH0KKwkgIGVsc2UgaWYgKGFyZWdzID09IDYpCisJICAgIHsKKwkgICAgICBGR1JbMF0gPSBXT1JENjRMTyAoR1BSWzVdKTsKKwkgICAgICBGR1JbMV0gPSBXT1JENjRMTyAoR1BSWzRdKTsKKwkgICAgICBGUFJfU1RBVEVbMF0gPSBmbXRfdW5pbnRlcnByZXRlZDsKKwkgICAgICBGUFJfU1RBVEVbMV0gPSBmbXRfdW5pbnRlcnByZXRlZDsKKwkgICAgfQorCX0JICAKKworICAgICAgUEMgPSBSQTsKKyAgICB9CisgIAorfQorCisvKi0tIHRyYWNlIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRoZSBUUkFDRSBzdXBwb3J0IGlzIHByb3ZpZGVkIChpZiByZXF1aXJlZCkgaW4gdGhlIG1lbW9yeSBhY2Nlc3NpbmcKKyAgIHJvdXRpbmVzLiBTaW5jZSB3ZSBhcmUgYWxzbyBwcm92aWRpbmcgdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYworICAgZmVhdHVyZXMsIHRoZSBhcmNoaXRlY3R1cmUgc2ltdWxhdGlvbiBjb2RlIGNhbiBhbHNvIGRlYWwgd2l0aAorICAgbm90aWZ5aW5nIHRoZSBUUkFDRSB3b3JsZCBvZiBjYWNoZSBmbHVzaGVzLCBldGMuIFNpbWlsYXJseSB3ZSBkbworICAgbm90IG5lZWQgdG8gcHJvdmlkZSBwcm9maWxpbmcgc3VwcG9ydCBpbiB0aGUgc2ltdWxhdG9yIGVuZ2luZSwKKyAgIHNpbmNlIHdlIGNhbiBzYW1wbGUgaW4gdGhlIGluc3RydWN0aW9uIGZldGNoIGNvbnRyb2wgbG9vcC4gQnkKKyAgIGRlZmluaW5nIHRoZSBUUkFDRSBtYW5pZmVzdCwgd2UgYWRkIHRyYWNpbmcgYXMgYSBydW4tdGltZQorICAgb3B0aW9uLiAqLworCisjaWYgZGVmaW5lZChUUkFDRSkKKy8qIFRyYWNpbmcgYnkgZGVmYXVsdCBwcm9kdWNlcyAiZGluIiBmb3JtYXQgKGFzIHJlcXVpcmVkIGJ5CisgICBkaW5lcm9JSUkpLiBFYWNoIGxpbmUgb2Ygc3VjaCBhIHRyYWNlIGZpbGUgKk1VU1QqIGhhdmUgYSBkaW4gbGFiZWwKKyAgIGFuZCBhZGRyZXNzIGZpZWxkLiBUaGUgcmVzdCBvZiB0aGUgbGluZSBpcyBpZ25vcmVkLCBzbyBjb21tZW50cyBjYW4KKyAgIGJlIGluY2x1ZGVkIGlmIGRlc2lyZWQuIFRoZSBmaXJzdCBmaWVsZCBpcyB0aGUgbGFiZWwgd2hpY2ggbXVzdCBiZQorICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorCisJMCAgICAgICByZWFkIGRhdGEKKyAgICAgICAgMSAgICAgICB3cml0ZSBkYXRhCisgICAgICAgIDIgICAgICAgaW5zdHJ1Y3Rpb24gZmV0Y2gKKyAgICAgICAgMyAgICAgICBlc2NhcGUgcmVjb3JkICh0cmVhdGVkIGFzIHVua25vd24gYWNjZXNzIHR5cGUpCisgICAgICAgIDQgICAgICAgZXNjYXBlIHJlY29yZCAoY2F1c2VzIGNhY2hlIGZsdXNoKQorCisgICBUaGUgYWRkcmVzcyBmaWVsZCBpcyBhIDMyYml0IChsb3dlci1jYXNlKSBoZXhhZGVjaW1hbCBhZGRyZXNzCisgICB2YWx1ZS4gVGhlIGFkZHJlc3Mgc2hvdWxkICpOT1QqIGJlIHByZWNlZGVkIGJ5ICIweCIuCisKKyAgIFRoZSBzaXplIG9mIHRoZSBtZW1vcnkgdHJhbnNmZXIgaXMgbm90IGltcG9ydGFudCB3aGVuIGRlYWxpbmcgd2l0aAorICAgY2FjaGUgbGluZXMgKGFzIGxvbmcgYXMgbm8gbW9yZSB0aGFuIGEgY2FjaGUgbGluZSBjYW4gYmUKKyAgIHRyYW5zZmVycmVkIGluIGEgc2luZ2xlIG9wZXJhdGlvbiA6LSksIGhvd2V2ZXIgbW9yZSBpbmZvcm1hdGlvbgorICAgY291bGQgYmUgZ2l2ZW4gZm9sbG93aW5nIHRoZSBkaW5lcm9JSUkgcmVxdWlyZW1lbnQgdG8gYWxsb3cgbW9yZQorICAgY29tcGxldGUgbWVtb3J5IGFuZCBjYWNoZSBzaW11bGF0b3JzIHRvIHByb3ZpZGUgYmV0dGVyCisgICByZXN1bHRzLiBpLmUuIHRoZSBVbml2ZXJzaXR5IG9mIFBpc2EgaGFzIGEgY2FjaGUgc2ltdWxhdG9yIHRoYXQgY2FuCisgICBhbHNvIHRha2UgYnVzIHNpemUgYW5kIHNwZWVkIGFzICh2YXJpYWJsZSkgaW5wdXRzIHRvIGNhbGN1bGF0ZQorICAgY29tcGxldGUgc3lzdGVtIHBlcmZvcm1hbmNlIChhIG11Y2ggbW9yZSB1c2VmdWwgYWJpbGl0eSB3aGVuIHRyeWluZworICAgdG8gY29uc3RydWN0IGFuIGVuZCBwcm9kdWN0LCByYXRoZXIgdGhhbiBhIHByb2Nlc3NvcikuIFRoZXkKKyAgIGN1cnJlbnRseSBoYXZlIGFuIEFSTSB2ZXJzaW9uIG9mIHRoZWlyIHRvb2wgY2FsbGVkIENoQVJNLiAqLworCisKK3ZvaWQKK2RvdHJhY2UgKFNJTV9ERVNDIHNkLAorCSBzaW1fY3B1ICpjcHUsCisJIEZJTEUgKnRyYWNlZmgsCisJIGludCB0eXBlLAorCSBTSU1fQUREUiBhZGRyZXNzLAorCSBpbnQgd2lkdGgsCisJIGNoYXIgKmNvbW1lbnQsLi4uKQoreworICBpZiAoU1RBVEUgJiBzaW1UUkFDRSkgeworICAgIHZhX2xpc3QgYXA7CisgICAgZnByaW50Zih0cmFjZWZoLCIlZCAlcyA7IHdpZHRoICVkIDsgIiwgCisJCXR5cGUsCisJCXByX2FkZHIoYWRkcmVzcyksCisJCXdpZHRoKTsKKyAgICB2YV9zdGFydChhcCxjb21tZW50KTsKKyAgICB2ZnByaW50Zih0cmFjZWZoLGNvbW1lbnQsYXApOworICAgIHZhX2VuZChhcCk7CisgICAgZnByaW50Zih0cmFjZWZoLCJcbiIpOworICB9CisgIC8qIE5PVEU6IFNpbmNlIHRoZSAiZGluIiBmb3JtYXQgd2lsbCBvbmx5IGFjY2VwdCAzMmJpdCBhZGRyZXNzZXMsIGFuZAorICAgICB3ZSBtYXkgYmUgZ2VuZXJhdGluZyA2NGJpdCBvbmVzLCB3ZSBzaG91bGQgcHV0IHRoZSBoaS0zMmJpdHMgb2YgdGhlCisgICAgIGFkZHJlc3MgaW50byB0aGUgY29tbWVudCBmaWVsZC4gKi8KKworICAvKiBUT0RPOiBQcm92aWRlIGEgYnVmZmVyIGZvciB0aGUgdHJhY2UgbGluZXMuIFdlIGNhbiB0aGVuIGF2b2lkCisgICAgIHBlcmZvcm1pbmcgd3JpdGVzIHVudGlsIHRoZSBidWZmZXIgaXMgZmlsbGVkLCBvciB0aGUgZmlsZSBpcworICAgICBiZWluZyBjbG9zZWQuICovCisKKyAgLyogTk9URTogV2UgY291bGQgY29uc2lkZXIgYWRkaW5nIGEgY29tbWVudCBmaWVsZCB0byB0aGUgImRpbiIgZmlsZQorICAgICBwcm9kdWNlZCB1c2luZyB0eXBlIDMgbWFya2VycyAodW5rbm93biBhY2Nlc3MpLiBUaGlzIHdvdWxkIHRoZW4KKyAgICAgYWxsb3cgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2dyYW0gdGhhdCB0aGUgImRpbiIgaXMgZm9yLCBhbmQKKyAgICAgdGhlIE1JUHMgd29ybGQgdGhhdCB3YXMgYmVpbmcgc2ltdWxhdGVkLCB0byBiZSBwbGFjZWQgaW50byB0aGUKKyAgICAgdHJhY2UgZmlsZS4gKi8KKworICByZXR1cm47Cit9CisjZW5kaWYgLyogVFJBQ0UgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLSBzaW11bGF0b3IgZW5naW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZAorQ29sZFJlc2V0IChTSU1fREVTQyBzZCkKK3sKKyAgaW50IGNwdV9ucjsKKyAgZm9yIChjcHVfbnIgPSAwOyBjcHVfbnIgPCBzaW1fZW5naW5lX25yX2NwdXMgKHNkKTsgY3B1X25yKyspCisgICAgeworICAgICAgc2ltX2NwdSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgY3B1X25yKTsKKyAgICAgIC8qIFJFU0VUOiBGaXhlZCBQQyBhZGRyZXNzOiAqLworICAgICAgUEMgPSAodW5zaWduZWRfd29yZCkgVU5TSUdORUQ2NCAoMHhGRkZGRkZGRkJGQzAwMDAwKTsKKyAgICAgIC8qIFRoZSByZXNldCB2ZWN0b3IgYWRkcmVzcyBpcyBpbiB0aGUgdW5tYXBwZWQsIHVuY2FjaGVkIG1lbW9yeSBzcGFjZS4gKi8KKyAgICAgIAorICAgICAgU1IgJj0gfihzdGF0dXNfU1IgfCBzdGF0dXNfVFMgfCBzdGF0dXNfUlApOworICAgICAgU1IgfD0gKHN0YXR1c19FUkwgfCBzdGF0dXNfQkVWKTsKKyAgICAgIAorICAgICAgLyogQ2hlYXQgYW5kIGFsbG93IGFjY2VzcyB0byB0aGUgY29tcGxldGUgcmVnaXN0ZXIgc2V0IGltbWVkaWF0ZWx5ICovCisgICAgICBpZiAoQ1VSUkVOVF9GTE9BVElOR19QT0lOVCA9PSBIQVJEX0ZMT0FUSU5HX1BPSU5UCisJICAmJiBXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCisJU1IgfD0gc3RhdHVzX0ZSOyAvKiA2NGJpdCByZWdpc3RlcnMgKi8KKyAgICAgIAorICAgICAgLyogRW5zdXJlIHRoYXQgYW55IGluc3RydWN0aW9ucyB3aXRoIHBlbmRpbmcgcmVnaXN0ZXIgdXBkYXRlcyBhcmUKKwkgY2xlYXJlZDogKi8KKyAgICAgIFBFTkRJTkdfSU5WQUxJREFURSgpOworICAgICAgCisgICAgICAvKiBJbml0aWFsaXNlIHRoZSBGUFUgcmVnaXN0ZXJzIHRvIHRoZSB1bmtub3duIHN0YXRlICovCisgICAgICBpZiAoQ1VSUkVOVF9GTE9BVElOR19QT0lOVCA9PSBIQVJEX0ZMT0FUSU5HX1BPSU5UKQorCXsKKwkgIGludCBybjsKKwkgIGZvciAocm4gPSAwOyAocm4gPCAzMik7IHJuKyspCisJICAgIEZQUl9TVEFURVtybl0gPSBmbXRfdW5pbnRlcnByZXRlZDsKKwl9CisgICAgICAKKyAgICB9Cit9CisKKworCisKKy8qIERlc2NyaXB0aW9uIGZyb20gcGFnZSBBLTI2IG9mIHRoZSAiTUlQUyBJViBJbnN0cnVjdGlvbiBTZXQiIG1hbnVhbCAocmV2aXNpb24gMy4xKSAqLworLyogU2lnbmFsIGFuIGV4Y2VwdGlvbiBjb25kaXRpb24uIFRoaXMgd2lsbCByZXN1bHQgaW4gYW4gZXhjZXB0aW9uCisgICB0aGF0IGFib3J0cyB0aGUgaW5zdHJ1Y3Rpb24uIFRoZSBpbnN0cnVjdGlvbiBvcGVyYXRpb24gcHNldWRvY29kZQorICAgd2lsbCBuZXZlciBzZWUgYSByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uIGNhbGwuICovCisKK3ZvaWQKK3NpZ25hbF9leGNlcHRpb24gKFNJTV9ERVNDIHNkLAorCQkgIHNpbV9jcHUgKmNwdSwKKwkJICBhZGRyZXNzX3dvcmQgY2lhLAorCQkgIGludCBleGNlcHRpb24sLi4uKQoreworICAvKiBpbnQgdmVjdG9yOyAqLworCisjaWZkZWYgREVCVUcKKyAgc2ltX2lvX3ByaW50ZihzZCwiREJHOiBTaWduYWxFeGNlcHRpb24oJWQpIFBDID0gMHglc1xuIixleGNlcHRpb24scHJfYWRkcihjaWEpKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgIC8qIEVuc3VyZSB0aGF0IGFueSBhY3RpdmUgYXRvbWljIHJlYWQvbW9kaWZ5L3dyaXRlIG9wZXJhdGlvbiB3aWxsIGZhaWw6ICovCisgIExMQklUID0gMDsKKworICAvKiBTYXZlIHJlZ2lzdGVycyBiZWZvcmUgaW50ZXJydXB0IGRpc3BhdGNoaW5nICovCisjaWZkZWYgU0lNX0NQVV9FWENFUFRJT05fVFJJR0dFUgorICBTSU1fQ1BVX0VYQ0VQVElPTl9UUklHR0VSKHNkLCBjcHUsIGNpYSk7CisjZW5kaWYKKworICBzd2l0Y2ggKGV4Y2VwdGlvbikgeworCisgICAgY2FzZSBEZWJ1Z0JyZWFrUG9pbnQgOgorICAgICAgaWYgKCEgKERlYnVnICYgRGVidWdfRE0pKQorICAgICAgICB7CisgICAgICAgICAgaWYgKElOREVMQVlTTE9UKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIENBTkNFTERFTEFZU0xPVCgpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgRGVidWcgfD0gRGVidWdfREJEOyAgLyogc2lnbmFsZWQgZnJvbSB3aXRoaW4gaW4gZGVsYXkgc2xvdCAqLworICAgICAgICAgICAgICBERVBDID0gY2lhIC0gNDsgICAgICAvKiByZWZlcmVuY2UgdGhlIGJyYW5jaCBpbnN0cnVjdGlvbiAqLworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgRGVidWcgJj0gfkRlYnVnX0RCRDsgLyogbm90IHNpZ25hbGVkIGZyb20gd2l0aGluIGEgZGVsYXkgc2xvdCAqLworICAgICAgICAgICAgICBERVBDID0gY2lhOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICBEZWJ1ZyB8PSBEZWJ1Z19ETTsgICAgICAgICAgICAvKiBpbiBkZWJ1Z2dpbmcgbW9kZSAqLworICAgICAgICAgIERlYnVnIHw9IERlYnVnX0RCcDsgICAgICAgICAgIC8qIHJhaXNpbmcgYSBEQnAgZXhjZXB0aW9uICovCisgICAgICAgICAgUEMgPSAweEJGQzAwMjAwOworICAgICAgICAgIHNpbV9lbmdpbmVfcmVzdGFydCAoU0QsIENQVSwgTlVMTCwgTlVMTF9DSUEpOworICAgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgUmVzZXJ2ZWRJbnN0cnVjdGlvbiA6CisgICAgIHsKKyAgICAgICB2YV9saXN0IGFwOworICAgICAgIHVuc2lnbmVkIGludCBpbnN0cnVjdGlvbjsKKyAgICAgICB2YV9zdGFydChhcCxleGNlcHRpb24pOworICAgICAgIGluc3RydWN0aW9uID0gdmFfYXJnKGFwLHVuc2lnbmVkIGludCk7CisgICAgICAgdmFfZW5kKGFwKTsKKyAgICAgICAvKiBQcm92aWRlIHNpbXBsZSBtb25pdG9yIHN1cHBvcnQgdXNpbmcgUmVzZXJ2ZWRJbnN0cnVjdGlvbgorICAgICAgICAgIGV4Y2VwdGlvbnMuIFRoZSBmb2xsb3dpbmcgY29kZSBzaW11bGF0ZXMgdGhlIGZpeGVkIHZlY3RvcgorICAgICAgICAgIGVudHJ5IHBvaW50cyBpbnRvIHRoZSBJRFQgbW9uaXRvciBieSBjYXVzaW5nIGEgc2ltdWxhdG9yCisgICAgICAgICAgdHJhcCwgcGVyZm9ybWluZyB0aGUgbW9uaXRvciBvcGVyYXRpb24sIGFuZCByZXR1cm5pbmcgdG8KKyAgICAgICAgICB0aGUgYWRkcmVzcyBoZWxkIGluIHRoZSAkcmEgcmVnaXN0ZXIgKHN0YW5kYXJkIFBDUyByZXR1cm4KKyAgICAgICAgICBhZGRyZXNzKS4gVGhpcyBtZWFucyB3ZSBvbmx5IG5lZWQgdG8gcHJlLWxvYWQgdGhlIHZlY3RvcgorICAgICAgICAgIHNwYWNlIHdpdGggc3VpdGFibGUgaW5zdHJ1Y3Rpb24gdmFsdWVzLiBGb3Igc3lzdGVtcyB3ZXJlCisgICAgICAgICAgYWN0dWFsIHRyYXAgaW5zdHJ1Y3Rpb25zIGFyZSB1c2VkLCB3ZSB3b3VsZCBub3QgbmVlZCB0bworICAgICAgICAgIHBlcmZvcm0gdGhpcyBtYWdpYy4gKi8KKyAgICAgICBpZiAoKGluc3RydWN0aW9uICYgUlNWRF9JTlNUUlVDVElPTl9NQVNLKSA9PSBSU1ZEX0lOU1RSVUNUSU9OKQorCSB7CisJICAgc2ltX21vbml0b3IgKFNELCBDUFUsIGNpYSwgKChpbnN0cnVjdGlvbiA+PiBSU1ZEX0lOU1RSVUNUSU9OX0FSR19TSElGVCkgJiBSU1ZEX0lOU1RSVUNUSU9OX0FSR19NQVNLKSApOworCSAgIC8qIE5PVEU6IFRoaXMgYXNzdW1lcyB0aGF0IGEgYnJhbmNoLWFuZC1saW5rIHN0eWxlCisJICAgICAgaW5zdHJ1Y3Rpb24gd2FzIHVzZWQgdG8gZW50ZXIgdGhlIHZlY3RvciAod2hpY2ggaXMgdGhlCisJICAgICAgY2FzZSB3aXRoIHRoZSBjdXJyZW50IElEVCBtb25pdG9yKS4gKi8KKwkgICBzaW1fZW5naW5lX3Jlc3RhcnQgKFNELCBDUFUsIE5VTEwsIFJBKTsKKwkgfQorICAgICAgIC8qIExvb2sgZm9yIHRoZSBtaXBzMTYgZW50cnkgYW5kIGV4aXQgaW5zdHJ1Y3Rpb25zLCBhbmQKKyAgICAgICAgICBzaW11bGF0ZSBhIGhhbmRsZXIgZm9yIHRoZW0uICAqLworICAgICAgIGVsc2UgaWYgKChjaWEgJiAxKSAhPSAwCisJCSYmIChpbnN0cnVjdGlvbiAmIDB4ZjgxZikgPT0gMHhlODA5CisJCSYmIChpbnN0cnVjdGlvbiAmIDB4MGMwKSAhPSAweDBjMCkKKwkgeworCSAgIG1pcHMxNl9lbnRyeSAoU0QsIENQVSwgY2lhLCBpbnN0cnVjdGlvbik7CisJICAgc2ltX2VuZ2luZV9yZXN0YXJ0IChzZCwgTlVMTCwgTlVMTCwgTlVMTF9DSUEpOworCSB9CisgICAgICAgLyogZWxzZSBmYWxsIHRocm91Z2ggdG8gbm9ybWFsIGV4Y2VwdGlvbiBwcm9jZXNzaW5nICovCisgICAgICAgc2ltX2lvX2VwcmludGYoc2QsIlJlc2VydmVkSW5zdHJ1Y3Rpb24gYXQgUEMgPSAweCVzXG4iLCBwcl9hZGRyIChjaWEpKTsKKyAgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgLyogU3RvcmUgZXhjZXB0aW9uIGNvZGUgaW50byBjdXJyZW50IGV4Y2VwdGlvbiBpZCB2YXJpYWJsZSAodXNlZAorICAgICAgICBieSBleGl0IGNvZGUpOiAqLworCisgICAgIC8qIFRPRE86IElmIG5vdCBzaW11bGF0aW5nIGV4Y2VwdGlvbnMgdGhlbiBzdG9wIHRoZSBzaW11bGF0b3IKKyAgICAgICAgZXhlY3V0aW9uLiBBdCB0aGUgbW9tZW50IHdlIGFsd2F5cyBzdG9wIHRoZSBzaW11bGF0aW9uLiAqLworCisjaWZkZWYgU1VCVEFSR0VUX1IzOTAwCisgICAgICAvKiB1cGRhdGUgaW50ZXJydXB0LXJlbGF0ZWQgcmVnaXN0ZXJzICovCisKKyAgICAgIC8qIGluc2VydCBleGNlcHRpb24gY29kZSBpbiBiaXRzIDY6MiAqLworICAgICAgQ0FVU0UgPSBMU01BU0tFRDMyKENBVVNFLCAzMSwgNykgfCBMU0lOU0VSVEVEMzIoZXhjZXB0aW9uLCA2LCAyKTsKKyAgICAgIC8qIHNoaWZ0IElFL0tVIGhpc3RvcnkgYml0cyBsZWZ0ICovCisgICAgICBTUiA9IExTTUFTS0VEMzIoU1IsIDMxLCA0KSB8IExTSU5TRVJURUQzMihMU0VYVFJBQ1RFRDMyKFNSLCAzLCAwKSwgNSwgMik7CisKKyAgICAgIGlmIChTVEFURSAmIHNpbURFTEFZU0xPVCkKKwl7CisJICBTVEFURSAmPSB+c2ltREVMQVlTTE9UOworCSAgQ0FVU0UgfD0gY2F1c2VfQkQ7CisJICBFUEMgPSAoY2lhIC0gNCk7IC8qIHJlZmVyZW5jZSB0aGUgYnJhbmNoIGluc3RydWN0aW9uICovCisJfQorICAgICAgZWxzZQorCUVQQyA9IGNpYTsKKworICAgICBpZiAoU1IgJiBzdGF0dXNfQkVWKQorICAgICAgIFBDID0gKHNpZ25lZCkweEJGQzAwMDAwICsgMHgxODA7CisgICAgIGVsc2UKKyAgICAgICBQQyA9IChzaWduZWQpMHg4MDAwMDAwMCArIDB4MDgwOworI2Vsc2UKKyAgICAgLyogU2VlIGZpZ3VyZSA1LTE3IGZvciBhbiBvdXRsaW5lIG9mIHRoZSBjb2RlIGJlbG93ICovCisgICAgIGlmICghIChTUiAmIHN0YXR1c19FWEwpKQorICAgICAgIHsKKwkgQ0FVU0UgPSAoZXhjZXB0aW9uIDw8IDIpOworCSBpZiAoU1RBVEUgJiBzaW1ERUxBWVNMT1QpCisJICAgeworCSAgICAgU1RBVEUgJj0gfnNpbURFTEFZU0xPVDsKKwkgICAgIENBVVNFIHw9IGNhdXNlX0JEOworCSAgICAgRVBDID0gKGNpYSAtIDQpOyAvKiByZWZlcmVuY2UgdGhlIGJyYW5jaCBpbnN0cnVjdGlvbiAqLworCSAgIH0KKwkgZWxzZQorCSAgIEVQQyA9IGNpYTsKKwkgLyogRklYTUU6IFRMQiBldC5hbC4gKi8KKwkgLyogdmVjdG9yID0gMHgxODA7ICovCisgICAgICAgfQorICAgICBlbHNlCisgICAgICAgeworCSBDQVVTRSA9IChleGNlcHRpb24gPDwgMik7CisJIC8qIHZlY3RvciA9IDB4MTgwOyAqLworICAgICAgIH0KKyAgICAgU1IgfD0gc3RhdHVzX0VYTDsKKyAgICAgLyogU3RvcmUgZXhjZXB0aW9uIGNvZGUgaW50byBjdXJyZW50IGV4Y2VwdGlvbiBpZCB2YXJpYWJsZSAodXNlZAorICAgICAgICBieSBleGl0IGNvZGUpOiAqLworCisgICAgIGlmIChTUiAmIHN0YXR1c19CRVYpCisgICAgICAgUEMgPSAoc2lnbmVkKTB4QkZDMDAyMDAgKyAweDE4MDsKKyAgICAgZWxzZQorICAgICAgIFBDID0gKHNpZ25lZCkweDgwMDAwMDAwICsgMHgxODA7CisjZW5kaWYKKworICAgICBzd2l0Y2ggKChDQVVTRSA+PiAyKSAmIDB4MUYpCisgICAgICAgeworICAgICAgIGNhc2UgSW50ZXJydXB0OgorCSAvKiBJbnRlcnJ1cHRzIGFycml2ZSBkdXJpbmcgZXZlbnQgcHJvY2Vzc2luZywgbm8gbmVlZCB0bworICAgICAgICAgICAgcmVzdGFydCAqLworCSByZXR1cm47CisKKyAgICAgICBjYXNlIE5NSVJlc2V0OgorCSAvKiBEaXR0byAqLworI2lmZGVmIFNVQlRBUkdFVF8zOTAwCisJIC8qIEV4Y2VwdGlvbiB2ZWN0b3I6IEJFVj0wIEJGQzAwMDAwIC8gQkVGPTEgQkZDMDAwMDAgICovCisJIFBDID0gKHNpZ25lZCkweEJGQzAwMDAwOworI2VuZGlmIFNVQlRBUkdFVF8zOTAwCisJIHJldHVybjsKKworICAgICAgIGNhc2UgVExCTW9kaWZpY2F0aW9uOgorICAgICAgIGNhc2UgVExCTG9hZDoKKyAgICAgICBjYXNlIFRMQlN0b3JlOgorICAgICAgIGNhc2UgQWRkcmVzc0xvYWQ6CisgICAgICAgY2FzZSBBZGRyZXNzU3RvcmU6CisgICAgICAgY2FzZSBJbnN0cnVjdGlvbkZldGNoOgorICAgICAgIGNhc2UgRGF0YVJlZmVyZW5jZToKKwkgLyogVGhlIGZvbGxvd2luZyBpcyBzbyB0aGF0IHRoZSBzaW11bGF0b3Igd2lsbCBjb250aW51ZSBmcm9tIHRoZQorCSAgICBleGNlcHRpb24gaGFuZGxlciBhZGRyZXNzLiAqLworCSBzaW1fZW5naW5lX2hhbHQgKFNELCBDUFUsIE5VTEwsIFBDLAorCQkJICBzaW1fc3RvcHBlZCwgU0lNX1NJR0JVUyk7CisKKyAgICAgICBjYXNlIFJlc2VydmVkSW5zdHJ1Y3Rpb246CisgICAgICAgY2FzZSBDb1Byb2Nlc3NvclVudXNhYmxlOgorCSBQQyA9IEVQQzsKKwkgc2ltX2VuZ2luZV9oYWx0IChTRCwgQ1BVLCBOVUxMLCBQQywKKwkJCSAgc2ltX3N0b3BwZWQsIFNJTV9TSUdJTEwpOworCisgICAgICAgY2FzZSBJbnRlZ2VyT3ZlcmZsb3c6CisgICAgICAgY2FzZSBGUEU6CisJIHNpbV9lbmdpbmVfaGFsdCAoU0QsIENQVSwgTlVMTCwgUEMsCisJCQkgIHNpbV9zdG9wcGVkLCBTSU1fU0lHRlBFKTsKKwkgCisgICAgICAgY2FzZSBCcmVha1BvaW50OgorCSBzaW1fZW5naW5lX2hhbHQgKFNELCBDUFUsIE5VTEwsIFBDLCBzaW1fc3RvcHBlZCwgU0lNX1NJR1RSQVApOworCSBicmVhazsKKworICAgICAgIGNhc2UgU3lzdGVtQ2FsbDoKKyAgICAgICBjYXNlIFRyYXA6CisJIHNpbV9lbmdpbmVfcmVzdGFydCAoU0QsIENQVSwgTlVMTCwgUEMpOworCSBicmVhazsKKworICAgICAgIGNhc2UgV2F0Y2g6CisJIFBDID0gRVBDOworCSBzaW1fZW5naW5lX2hhbHQgKFNELCBDUFUsIE5VTEwsIFBDLAorCQkJICBzaW1fc3RvcHBlZCwgU0lNX1NJR1RSQVApOworCisgICAgICAgZGVmYXVsdCA6IC8qIFVua25vd24gaW50ZXJuYWwgZXhjZXB0aW9uICovCisJIFBDID0gRVBDOworCSBzaW1fZW5naW5lX2hhbHQgKFNELCBDUFUsIE5VTEwsIFBDLAorCQkJICBzaW1fc3RvcHBlZCwgU0lNX1NJR0FCUlQpOworCisgICAgICAgfQorCisgICAgY2FzZSBTaW11bGF0b3JGYXVsdDoKKyAgICAgeworICAgICAgIHZhX2xpc3QgYXA7CisgICAgICAgY2hhciAqbXNnOworICAgICAgIHZhX3N0YXJ0KGFwLGV4Y2VwdGlvbik7CisgICAgICAgbXNnID0gdmFfYXJnKGFwLGNoYXIgKik7CisgICAgICAgdmFfZW5kKGFwKTsKKyAgICAgICBzaW1fZW5naW5lX2Fib3J0IChTRCwgQ1BVLCBOVUxMX0NJQSwKKwkJCSAiRkFUQUw6IFNpbXVsYXRvciBlcnJvciBcIiVzXCJcbiIsbXNnKTsKKyAgICAgfQorICAgfQorCisgIHJldHVybjsKK30KKworCisKKyNpZiBkZWZpbmVkKFdBUk5fUkVTVUxUKQorLyogRGVzY3JpcHRpb24gZnJvbSBwYWdlIEEtMjYgb2YgdGhlICJNSVBTIElWIEluc3RydWN0aW9uIFNldCIgbWFudWFsIChyZXZpc2lvbiAzLjEpICovCisvKiBUaGlzIGZ1bmN0aW9uIGluZGljYXRlcyB0aGF0IHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBpcworICAgdW5kZWZpbmVkLiBIb3dldmVyLCB0aGlzIHNob3VsZCBub3QgYWZmZWN0IHRoZSBpbnN0cnVjdGlvbgorICAgc3RyZWFtLiBBbGwgdGhhdCBpcyBtZWFudCB0byBoYXBwZW4gaXMgdGhhdCB0aGUgZGVzdGluYXRpb24KKyAgIHJlZ2lzdGVyIGlzIHNldCB0byBhbiB1bmRlZmluZWQgcmVzdWx0LiBUbyBrZWVwIHRoZSBzaW11bGF0b3IKKyAgIHNpbXBsZSwgd2UganVzdCBkb24ndCBib3RoZXIgdXBkYXRpbmcgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLCBzbworICAgdGhlIG92ZXJhbGwgcmVzdWx0IHdpbGwgYmUgdW5kZWZpbmVkLiBJZiBkZXNpcmVkIHdlIGNhbiBzdG9wIHRoZQorICAgc2ltdWxhdG9yIGJ5IHJhaXNpbmcgYSBwc2V1ZG8tZXhjZXB0aW9uLiAqLworI2RlZmluZSBVbmRlZmluZWRSZXN1bHQoKSB1bmRlZmluZWRfcmVzdWx0IChzZCxjaWEpCitzdGF0aWMgdm9pZAordW5kZWZpbmVkX3Jlc3VsdChzZCxjaWEpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBhZGRyZXNzX3dvcmQgY2lhOworeworICBzaW1faW9fZXByaW50ZihzZCwiVW5kZWZpbmVkUmVzdWx0OiBQQyA9IDB4JXNcbiIscHJfYWRkcihjaWEpKTsKKyNpZiAwIC8qIERpc2FibGVkIGZvciB0aGUgbW9tZW50LCBzaW5jZSBpdCBhY3R1YWxseSBoYXBwZW5zIGEgbG90IGF0IHRoZSBtb21lbnQuICovCisgIHN0YXRlIHw9IHNpbVNUT1A7CisjZW5kaWYKKyAgcmV0dXJuOworfQorI2VuZGlmIC8qIFdBUk5fUkVTVUxUICovCisKKy8qLS0gRlBVIHN1cHBvcnQgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogTnVtYmVycyBhcmUgaGVsZCBpbiBub3JtYWxpemVkIGZvcm0uIFRoZSBTSU5HTEUgYW5kIERPVUJMRSBiaW5hcnkKKyAgIGZvcm1hdHMgY29uZm9ybSB0byBBTlNJL0lFRUUgU3RkIDc1NC0xOTg1LiAqLworLyogU0lOR0xFIHByZWNpc2lvbiBmbG9hdGluZzoKKyAqICAgIHNlZWVlZWVlZWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmCisgKiAgICAgIHMgPSAgMWJpdCAgPSBzaWduCisgKiAgICAgIGUgPSAgOGJpdHMgPSBleHBvbmVudAorICogICAgICBmID0gMjNiaXRzID0gZnJhY3Rpb24KKyAqLworLyogU0lOR0xFIHByZWNpc2lvbiBmaXhlZDoKKyAqICAgIHNpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpCisgKiAgICAgIHMgPSAgMWJpdCAgPSBzaWduCisgKiAgICAgIGkgPSAzMWJpdHMgPSBpbnRlZ2VyCisgKi8KKy8qIERPVUJMRSBwcmVjaXNpb24gZmxvYXRpbmc6CisgKiAgICBzZWVlZWVlZWVlZWVmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmCisgKiAgICAgIHMgPSAgMWJpdCAgPSBzaWduCisgKiAgICAgIGUgPSAxMWJpdHMgPSBleHBvbmVudAorICogICAgICBmID0gNTJiaXRzID0gZnJhY3Rpb24KKyAqLworLyogRE9VQkxFIHByZWNpc2lvbiBmaXhlZDoKKyAqICAgIHNpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkKKyAqICAgICAgcyA9ICAxYml0ICA9IHNpZ24KKyAqICAgICAgaSA9IDYzYml0cyA9IGludGVnZXIKKyAqLworCisvKiBFeHRyYWN0IHNpZ24tYml0OiAqLworI2RlZmluZSBGUF9TX3ModikgICAgKCgodikgJiAoKHVuc2lnbmVkKTEgPDwgMzEpKSA/IDEgOiAwKQorI2RlZmluZSBGUF9EX3ModikgICAgKCgodikgJiAoKHV3b3JkNjQpMSA8PCA2MykpID8gMSA6IDApCisvKiBFeHRyYWN0IGJpYXNlZCBleHBvbmVudDogKi8KKyNkZWZpbmUgRlBfU19iZSh2KSAgICgoKHYpID4+IDIzKSAmIDB4RkYpCisjZGVmaW5lIEZQX0RfYmUodikgICAoKCh2KSA+PiA1MikgJiAweDdGRikKKy8qIEV4dHJhY3QgdW5iaWFzZWQgRXhwb25lbnQ6ICovCisjZGVmaW5lIEZQX1NfZSh2KSAgICAoRlBfU19iZSh2KSAtIDB4N0YpCisjZGVmaW5lIEZQX0RfZSh2KSAgICAoRlBfRF9iZSh2KSAtIDB4M0ZGKQorLyogRXh0cmFjdCBjb21wbGV0ZSBmcmFjdGlvbiBmaWVsZDogKi8KKyNkZWZpbmUgRlBfU19mKHYpICAgICgodikgJiB+KCh1bnNpZ25lZCkweDFGRiA8PCAyMykpCisjZGVmaW5lIEZQX0RfZih2KSAgICAoKHYpICYgfigodXdvcmQ2NCkweEZGRiA8PCA1MikpCisvKiBFeHRyYWN0IG51bWJlcmVkIGZyYWN0aW9uIGJpdDogKi8KKyNkZWZpbmUgRlBfU19mYihiLHYpICgoKHYpICYgKDEgPDwgKDIzIC0gKGIpKSkpID8gMSA6IDApCisjZGVmaW5lIEZQX0RfZmIoYix2KSAoKCh2KSAmICgxIDw8ICg1MiAtIChiKSkpKSA/IDEgOiAwKQorCisvKiBFeHBsaWNpdCBRTmFOIHZhbHVlcyB1c2VkIHdoZW4gdmFsdWUgcmVxdWlyZWQ6ICovCisjZGVmaW5lIEZQUU5hTl9TSU5HTEUgICAoMHg3RkJGRkZGRikKKyNkZWZpbmUgRlBRTmFOX1dPUkQgICAgICgweDdGRkZGRkZGKQorI2RlZmluZSBGUFFOYU5fRE9VQkxFICAgKCgodXdvcmQ2NCkweDdGRjdGRkZGIDw8IDMyKSB8IDB4RkZGRkZGRkYpCisjZGVmaW5lIEZQUU5hTl9MT05HICAgICAoKCh1d29yZDY0KTB4N0ZGRkZGRkYgPDwgMzIpIHwgMHhGRkZGRkZGRikKKworLyogRXhwbGljaXQgSW5maW5pdHkgdmFsdWVzIHVzZWQgd2hlbiByZXF1aXJlZDogKi8KKyNkZWZpbmUgRlBJTkZfU0lOR0xFICAgICgweDdGODAwMDAwKQorI2RlZmluZSBGUElORl9ET1VCTEUgICAgKCgodXdvcmQ2NCkweDdGRjAwMDAwIDw8IDMyKSB8IDB4MDAwMDAwMDApCisKKyNkZWZpbmUgUk1NT0RFKHYpICgoKHYpID09IEZQX1JNX05FQVJFU1QpID8gIlJvdW5kIiA6ICgoKHYpID09IEZQX1JNX1RPWkVSTykgPyAiVHJ1bmMiIDogKCgodikgPT0gRlBfUk1fVE9QSU5GKSA/ICJDZWlsIiA6ICJGbG9vciIpKSkKKyNkZWZpbmUgRE9GTVQodikgICgoKHYpID09IGZtdF9zaW5nbGUpID8gInNpbmdsZSIgOiAoKCh2KSA9PSBmbXRfZG91YmxlKSA/ICJkb3VibGUiIDogKCgodikgPT0gZm10X3dvcmQpID8gIndvcmQiIDogKCgodikgPT0gZm10X2xvbmcpID8gImxvbmciIDogKCgodikgPT0gZm10X3Vua25vd24pID8gIjx1bmtub3duPiIgOiAoKCh2KSA9PSBmbXRfdW5pbnRlcnByZXRlZCkgPyAiPHVuaW50ZXJwcmV0ZWQ+IiA6ICgoKHYpID09IGZtdF91bmludGVycHJldGVkXzMyKSA/ICI8dW5pbnRlcnByZXRlZF8zMj4iIDogKCgodikgPT0gZm10X3VuaW50ZXJwcmV0ZWRfNjQpID8gIjx1bmludGVycHJldGVkXzY0PiIgOiAiPGZvcm1hdCBlcnJvcj4iKSkpKSkpKSkKKwordXdvcmQ2NAordmFsdWVfZnByIChTSU1fREVTQyBzZCwKKwkgICBzaW1fY3B1ICpjcHUsCisJICAgYWRkcmVzc193b3JkIGNpYSwKKwkgICBpbnQgZnByLAorCSAgIEZQX2Zvcm1hdHMgZm10KQoreworICB1d29yZDY0IHZhbHVlID0gMDsKKyAgaW50IGVyciA9IDA7CisKKyAgLyogVHJlYXQgdW51c2VkIHJlZ2lzdGVyIHZhbHVlcywgYXMgZml4ZWQtcG9pbnQgNjRiaXQgdmFsdWVzOiAqLworICBpZiAoKGZtdCA9PSBmbXRfdW5pbnRlcnByZXRlZCkgfHwgKGZtdCA9PSBmbXRfdW5rbm93bikpCisjaWYgMQorICAgLyogSWYgcmVxdWVzdCB0byByZWFkIGRhdGEgYXMgInVuaW50ZXJwcmV0ZWQiLCB0aGVuIHVzZSB0aGUgY3VycmVudAorICAgICAgZW5jb2Rpbmc6ICovCisgICBmbXQgPSBGUFJfU1RBVEVbZnByXTsKKyNlbHNlCisgICBmbXQgPSBmbXRfbG9uZzsKKyNlbmRpZgorCisgIC8qIEZvciB2YWx1ZXMgbm90IHlldCBhY2Nlc3NlZCwgc2V0IHRvIHRoZSBkZXNpcmVkIGZvcm1hdDogKi8KKyAgaWYgKEZQUl9TVEFURVtmcHJdID09IGZtdF91bmludGVycHJldGVkKSB7CisgICAgRlBSX1NUQVRFW2Zwcl0gPSBmbXQ7CisjaWZkZWYgREVCVUcKKyAgICBwcmludGYoIkRCRzogUmVnaXN0ZXIgJWQgd2FzIGZtdF91bmludGVycHJldGVkLiBOb3cgJXNcbiIsZnByLERPRk1UKGZtdCkpOworI2VuZGlmIC8qIERFQlVHICovCisgIH0KKyAgaWYgKGZtdCAhPSBGUFJfU1RBVEVbZnByXSkgeworICAgIHNpbV9pb19lcHJpbnRmKHNkLCJGUFIgJWQgKGZvcm1hdCAlcykgYmVpbmcgYWNjZXNzZWQgd2l0aCBmb3JtYXQgJXMgLSBzZXR0aW5nIHRvIHVua25vd24gKFBDID0gMHglcylcbiIsZnByLERPRk1UKEZQUl9TVEFURVtmcHJdKSxET0ZNVChmbXQpLHByX2FkZHIoY2lhKSk7CisgICAgRlBSX1NUQVRFW2Zwcl0gPSBmbXRfdW5rbm93bjsKKyAgfQorCisgIGlmIChGUFJfU1RBVEVbZnByXSA9PSBmbXRfdW5rbm93bikgeworICAgLyogU2V0IFFOYU4gdmFsdWU6ICovCisgICBzd2l0Y2ggKGZtdCkgeworICAgIGNhc2UgZm10X3NpbmdsZToKKyAgICAgdmFsdWUgPSBGUFFOYU5fU0lOR0xFOworICAgICBicmVhazsKKworICAgIGNhc2UgZm10X2RvdWJsZToKKyAgICAgdmFsdWUgPSBGUFFOYU5fRE9VQkxFOworICAgICBicmVhazsKKworICAgIGNhc2UgZm10X3dvcmQ6CisgICAgIHZhbHVlID0gRlBRTmFOX1dPUkQ7CisgICAgIGJyZWFrOworCisgICAgY2FzZSBmbXRfbG9uZzoKKyAgICAgdmFsdWUgPSBGUFFOYU5fTE9ORzsKKyAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICBlcnIgPSAtMTsKKyAgICAgYnJlYWs7CisgICB9CisgIH0gZWxzZSBpZiAoU2l6ZUZHUigpID09IDY0KSB7CisgICAgc3dpdGNoIChmbXQpIHsKKyAgICAgY2FzZSBmbXRfc2luZ2xlOgorICAgICBjYXNlIGZtdF93b3JkOgorICAgICAgdmFsdWUgPSAoRkdSW2Zwcl0gJiAweEZGRkZGRkZGKTsKKyAgICAgIGJyZWFrOworCisgICAgIGNhc2UgZm10X3VuaW50ZXJwcmV0ZWQ6CisgICAgIGNhc2UgZm10X2RvdWJsZToKKyAgICAgY2FzZSBmbXRfbG9uZzoKKyAgICAgIHZhbHVlID0gRkdSW2Zwcl07CisgICAgICBicmVhazsKKworICAgICBkZWZhdWx0IDoKKyAgICAgIGVyciA9IC0xOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIHN3aXRjaCAoZm10KSB7CisgICAgIGNhc2UgZm10X3NpbmdsZToKKyAgICAgY2FzZSBmbXRfd29yZDoKKyAgICAgIHZhbHVlID0gKEZHUltmcHJdICYgMHhGRkZGRkZGRik7CisgICAgICBicmVhazsKKworICAgICBjYXNlIGZtdF91bmludGVycHJldGVkOgorICAgICBjYXNlIGZtdF9kb3VibGU6CisgICAgIGNhc2UgZm10X2xvbmc6CisgICAgICBpZiAoKGZwciAmIDEpID09IDApIHsgLyogZXZlbiByZWdpc3RlcnMgb25seSAqLworI2lmZGVmIERFQlVHCisJcHJpbnRmKCJEQkc6IFZhbHVlRlBSOiBGR1JbJWRdID0gJXMsIEZHUlslZF0gPSAlc1xuIiwgCisJICAgICAgIGZwcisxLCBwcl91d29yZDY0KCAodXdvcmQ2NCkgRkdSW2ZwcisxXSApLAorCSAgICAgICBmcHIsIHByX3V3b3JkNjQoICh1d29yZDY0KSBGR1JbZnByXSApKTsKKyNlbmRpZgorCXZhbHVlID0gKCgoKHV3b3JkNjQpRkdSW2ZwcisxXSkgPDwgMzIpIHwgKEZHUltmcHJdICYgMHhGRkZGRkZGRikpOworICAgICAgfSBlbHNlIHsKKwlTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbiwwKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgIGRlZmF1bHQgOgorICAgICAgZXJyID0gLTE7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoZXJyKQorICAgU2lnbmFsRXhjZXB0aW9uU2ltdWxhdG9yRmF1bHQgKCJVbnJlY29nbmlzZWQgRlAgZm9ybWF0IGluIFZhbHVlRlBSKCkiKTsKKworI2lmZGVmIERFQlVHCisgIHByaW50ZigiREJHOiBWYWx1ZUZQUjogZnByID0gJWQsIGZtdCA9ICVzLCB2YWx1ZSA9IDB4JXMgOiBQQyA9IDB4JXMgOiBTaXplRkdSKCkgPSAlZFxuIixmcHIsRE9GTVQoZm10KSxwcl91d29yZDY0KHZhbHVlKSxwcl9hZGRyKGNpYSksU2l6ZUZHUigpKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgIHJldHVybih2YWx1ZSk7Cit9CisKK3ZvaWQKK3N0b3JlX2ZwciAoU0lNX0RFU0Mgc2QsCisJICAgc2ltX2NwdSAqY3B1LAorCSAgIGFkZHJlc3Nfd29yZCBjaWEsCisJICAgaW50IGZwciwKKwkgICBGUF9mb3JtYXRzIGZtdCwKKwkgICB1d29yZDY0IHZhbHVlKQoreworICBpbnQgZXJyID0gMDsKKworI2lmZGVmIERFQlVHCisgIHByaW50ZigiREJHOiBTdG9yZUZQUjogZnByID0gJWQsIGZtdCA9ICVzLCB2YWx1ZSA9IDB4JXMgOiBQQyA9IDB4JXMgOiBTaXplRkdSKCkgPSAlZCxcbiIsZnByLERPRk1UKGZtdCkscHJfdXdvcmQ2NCh2YWx1ZSkscHJfYWRkcihjaWEpLFNpemVGR1IoKSk7CisjZW5kaWYgLyogREVCVUcgKi8KKworICBpZiAoU2l6ZUZHUigpID09IDY0KSB7CisgICAgc3dpdGNoIChmbXQpIHsKKyAgICAgIGNhc2UgZm10X3VuaW50ZXJwcmV0ZWRfMzI6CisJZm10ID0gZm10X3VuaW50ZXJwcmV0ZWQ7CisgICAgICBjYXNlIGZtdF9zaW5nbGUgOgorICAgICAgY2FzZSBmbXRfd29yZCA6CisgICAgICAgRkdSW2Zwcl0gPSAoKCh1d29yZDY0KTB4REVBREMwREUgPDwgMzIpIHwgKHZhbHVlICYgMHhGRkZGRkZGRikpOworICAgICAgIEZQUl9TVEFURVtmcHJdID0gZm10OworICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGZtdF91bmludGVycHJldGVkXzY0OgorCWZtdCA9IGZtdF91bmludGVycHJldGVkOworICAgICAgY2FzZSBmbXRfdW5pbnRlcnByZXRlZDoKKyAgICAgIGNhc2UgZm10X2RvdWJsZSA6CisgICAgICBjYXNlIGZtdF9sb25nIDoKKyAgICAgICBGR1JbZnByXSA9IHZhbHVlOworICAgICAgIEZQUl9TVEFURVtmcHJdID0gZm10OworICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICBGUFJfU1RBVEVbZnByXSA9IGZtdF91bmtub3duOworICAgICAgIGVyciA9IC0xOworICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZtdCkgeworICAgICAgY2FzZSBmbXRfdW5pbnRlcnByZXRlZF8zMjoKKwlmbXQgPSBmbXRfdW5pbnRlcnByZXRlZDsKKyAgICAgIGNhc2UgZm10X3NpbmdsZSA6CisgICAgICBjYXNlIGZtdF93b3JkIDoKKyAgICAgICBGR1JbZnByXSA9ICh2YWx1ZSAmIDB4RkZGRkZGRkYpOworICAgICAgIEZQUl9TVEFURVtmcHJdID0gZm10OworICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGZtdF91bmludGVycHJldGVkXzY0OgorCWZtdCA9IGZtdF91bmludGVycHJldGVkOworICAgICAgY2FzZSBmbXRfdW5pbnRlcnByZXRlZDoKKyAgICAgIGNhc2UgZm10X2RvdWJsZSA6CisgICAgICBjYXNlIGZtdF9sb25nIDoKKwlpZiAoKGZwciAmIDEpID09IDApIHsgLyogZXZlbiByZWdpc3RlciBudW1iZXIgb25seSAqLworCSAgRkdSW2ZwcisxXSA9ICh2YWx1ZSA+PiAzMik7CisJICBGR1JbZnByXSA9ICh2YWx1ZSAmIDB4RkZGRkZGRkYpOworCSAgRlBSX1NUQVRFW2ZwciArIDFdID0gZm10OworCSAgRlBSX1NUQVRFW2Zwcl0gPSBmbXQ7CisJfSBlbHNlIHsKKwkgIEZQUl9TVEFURVtmcHJdID0gZm10X3Vua25vd247CisJICBGUFJfU1RBVEVbZnByICsgMV0gPSBmbXRfdW5rbm93bjsKKwkgIFNpZ25hbEV4Y2VwdGlvbihSZXNlcnZlZEluc3RydWN0aW9uLDApOworCX0KKyAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgRlBSX1NUQVRFW2Zwcl0gPSBmbXRfdW5rbm93bjsKKyAgICAgICBlcnIgPSAtMTsKKyAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyNpZiBkZWZpbmVkKFdBUk5fUkVTVUxUKQorICBlbHNlCisgICAgVW5kZWZpbmVkUmVzdWx0KCk7CisjZW5kaWYgLyogV0FSTl9SRVNVTFQgKi8KKworICBpZiAoZXJyKQorICAgU2lnbmFsRXhjZXB0aW9uU2ltdWxhdG9yRmF1bHQgKCJVbnJlY29nbmlzZWQgRlAgZm9ybWF0IGluIFN0b3JlRlBSKCkiKTsKKworI2lmZGVmIERFQlVHCisgIHByaW50ZigiREJHOiBTdG9yZUZQUjogZnByWyVkXSA9IDB4JXMgKGZvcm1hdCAlcylcbiIsZnByLHByX3V3b3JkNjQoRkdSW2Zwcl0pLERPRk1UKGZtdCkpOworI2VuZGlmIC8qIERFQlVHICovCisKKyAgcmV0dXJuOworfQorCitpbnQKK05hTihvcCxmbXQpCisgICAgIHV3b3JkNjQgb3A7CisgICAgIEZQX2Zvcm1hdHMgZm10OyAKK3sKKyAgaW50IGJvb2xlYW4gPSAwOworICBzd2l0Y2ggKGZtdCkgeworICAgY2FzZSBmbXRfc2luZ2xlOgorICAgY2FzZSBmbXRfd29yZDoKKyAgICB7CisgICAgICBzaW1fZnB1IHdvcDsKKyAgICAgIHNpbV9mcHVfMzJ0byAoJndvcCwgb3ApOworICAgICAgYm9vbGVhbiA9IHNpbV9mcHVfaXNfbmFuICgmd29wKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgIGNhc2UgZm10X2RvdWJsZToKKyAgIGNhc2UgZm10X2xvbmc6CisgICAgeworICAgICAgc2ltX2ZwdSB3b3A7CisgICAgICBzaW1fZnB1XzY0dG8gKCZ3b3AsIG9wKTsKKyAgICAgIGJvb2xlYW4gPSBzaW1fZnB1X2lzX25hbiAoJndvcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICBkZWZhdWx0OgorICAgIGZwcmludGYgKHN0ZGVyciwgIkJhZCBzd2l0Y2hcbiIpOworICAgIGFib3J0ICgpOworICB9CisKKyNpZmRlZiBERUJVRworcHJpbnRmKCJEQkc6IE5hTjogcmV0dXJuaW5nICVkIGZvciAweCVzIChmb3JtYXQgPSAlcylcbiIsYm9vbGVhbixwcl9hZGRyKG9wKSxET0ZNVChmbXQpKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgIHJldHVybihib29sZWFuKTsKK30KKworaW50CitJbmZpbml0eShvcCxmbXQpCisgICAgIHV3b3JkNjQgb3A7CisgICAgIEZQX2Zvcm1hdHMgZm10OyAKK3sKKyAgaW50IGJvb2xlYW4gPSAwOworCisjaWZkZWYgREVCVUcKKyAgcHJpbnRmKCJEQkc6IEluZmluaXR5OiBmb3JtYXQgJXMgMHglc1xuIixET0ZNVChmbXQpLHByX2FkZHIob3ApKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgIHN3aXRjaCAoZm10KSB7CisgICBjYXNlIGZtdF9zaW5nbGU6CisgICAgeworICAgICAgc2ltX2ZwdSB3b3A7CisgICAgICBzaW1fZnB1XzMydG8gKCZ3b3AsIG9wKTsKKyAgICAgIGJvb2xlYW4gPSBzaW1fZnB1X2lzX2luZmluaXR5ICgmd29wKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgIGNhc2UgZm10X2RvdWJsZToKKyAgICB7CisgICAgICBzaW1fZnB1IHdvcDsKKyAgICAgIHNpbV9mcHVfNjR0byAoJndvcCwgb3ApOworICAgICAgYm9vbGVhbiA9IHNpbV9mcHVfaXNfaW5maW5pdHkgKCZ3b3ApOworICAgICAgYnJlYWs7CisgICAgfQorICAgZGVmYXVsdDoKKyAgICBwcmludGYoIkRCRzogVE9ETzogdW5yZWNvZ25pc2VkIGZvcm1hdCAoJXMpIGZvciBJbmZpbml0eSBjaGVja1xuIixET0ZNVChmbXQpKTsKKyAgICBicmVhazsKKyAgfQorCisjaWZkZWYgREVCVUcKKyAgcHJpbnRmKCJEQkc6IEluZmluaXR5OiByZXR1cm5pbmcgJWQgZm9yIDB4JXMgKGZvcm1hdCA9ICVzKVxuIixib29sZWFuLHByX2FkZHIob3ApLERPRk1UKGZtdCkpOworI2VuZGlmIC8qIERFQlVHICovCisKKyAgcmV0dXJuKGJvb2xlYW4pOworfQorCitpbnQKK0xlc3Mob3AxLG9wMixmbXQpCisgICAgIHV3b3JkNjQgb3AxOworICAgICB1d29yZDY0IG9wMjsKKyAgICAgRlBfZm9ybWF0cyBmbXQ7IAoreworICBpbnQgYm9vbGVhbiA9IDA7CisKKyAgLyogQXJndW1lbnQgY2hlY2tpbmcgYWxyZWFkeSBwZXJmb3JtZWQgYnkgdGhlIEZQQ09NUEFSRSBjb2RlICovCisKKyNpZmRlZiBERUJVRworICBwcmludGYoIkRCRzogTGVzczogJXM6IG9wMSA9IDB4JXMgOiBvcDIgPSAweCVzXG4iLERPRk1UKGZtdCkscHJfYWRkcihvcDEpLHByX2FkZHIob3AyKSk7CisjZW5kaWYgLyogREVCVUcgKi8KKworICAvKiBUaGUgZm9ybWF0IHR5cGUgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGNoZWNrZWQ6ICovCisgIHN3aXRjaCAoZm10KSB7CisgICBjYXNlIGZtdF9zaW5nbGU6CisgICAgeworICAgICAgc2ltX2ZwdSB3b3AxOworICAgICAgc2ltX2ZwdSB3b3AyOworICAgICAgc2ltX2ZwdV8zMnRvICgmd29wMSwgb3AxKTsKKyAgICAgIHNpbV9mcHVfMzJ0byAoJndvcDIsIG9wMik7CisgICAgICBib29sZWFuID0gc2ltX2ZwdV9pc19sdCAoJndvcDEsICZ3b3AyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgIGNhc2UgZm10X2RvdWJsZToKKyAgICB7CisgICAgICBzaW1fZnB1IHdvcDE7CisgICAgICBzaW1fZnB1IHdvcDI7CisgICAgICBzaW1fZnB1XzY0dG8gKCZ3b3AxLCBvcDEpOworICAgICAgc2ltX2ZwdV82NHRvICgmd29wMiwgb3AyKTsKKyAgICAgIGJvb2xlYW4gPSBzaW1fZnB1X2lzX2x0ICgmd29wMSwgJndvcDIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgZGVmYXVsdDoKKyAgICBmcHJpbnRmIChzdGRlcnIsICJCYWQgc3dpdGNoXG4iKTsKKyAgICBhYm9ydCAoKTsKKyAgfQorCisjaWZkZWYgREVCVUcKKyAgcHJpbnRmKCJEQkc6IExlc3M6IHJldHVybmluZyAlZCAoZm9ybWF0ID0gJXMpXG4iLGJvb2xlYW4sRE9GTVQoZm10KSk7CisjZW5kaWYgLyogREVCVUcgKi8KKworICByZXR1cm4oYm9vbGVhbik7Cit9CisKK2ludAorRXF1YWwob3AxLG9wMixmbXQpCisgICAgIHV3b3JkNjQgb3AxOworICAgICB1d29yZDY0IG9wMjsKKyAgICAgRlBfZm9ybWF0cyBmbXQ7IAoreworICBpbnQgYm9vbGVhbiA9IDA7CisKKyAgLyogQXJndW1lbnQgY2hlY2tpbmcgYWxyZWFkeSBwZXJmb3JtZWQgYnkgdGhlIEZQQ09NUEFSRSBjb2RlICovCisKKyNpZmRlZiBERUJVRworICBwcmludGYoIkRCRzogRXF1YWw6ICVzOiBvcDEgPSAweCVzIDogb3AyID0gMHglc1xuIixET0ZNVChmbXQpLHByX2FkZHIob3AxKSxwcl9hZGRyKG9wMikpOworI2VuZGlmIC8qIERFQlVHICovCisKKyAgLyogVGhlIGZvcm1hdCB0eXBlIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBjaGVja2VkOiAqLworICBzd2l0Y2ggKGZtdCkgeworICAgY2FzZSBmbXRfc2luZ2xlOgorICAgIHsKKyAgICAgIHNpbV9mcHUgd29wMTsKKyAgICAgIHNpbV9mcHUgd29wMjsKKyAgICAgIHNpbV9mcHVfMzJ0byAoJndvcDEsIG9wMSk7CisgICAgICBzaW1fZnB1XzMydG8gKCZ3b3AyLCBvcDIpOworICAgICAgYm9vbGVhbiA9IHNpbV9mcHVfaXNfZXEgKCZ3b3AxLCAmd29wMik7CisgICAgICBicmVhazsKKyAgICB9CisgICBjYXNlIGZtdF9kb3VibGU6CisgICAgeworICAgICAgc2ltX2ZwdSB3b3AxOworICAgICAgc2ltX2ZwdSB3b3AyOworICAgICAgc2ltX2ZwdV82NHRvICgmd29wMSwgb3AxKTsKKyAgICAgIHNpbV9mcHVfNjR0byAoJndvcDIsIG9wMik7CisgICAgICBib29sZWFuID0gc2ltX2ZwdV9pc19lcSAoJndvcDEsICZ3b3AyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgIGRlZmF1bHQ6CisgICAgZnByaW50ZiAoc3RkZXJyLCAiQmFkIHN3aXRjaFxuIik7CisgICAgYWJvcnQgKCk7CisgIH0KKworI2lmZGVmIERFQlVHCisgIHByaW50ZigiREJHOiBFcXVhbDogcmV0dXJuaW5nICVkIChmb3JtYXQgPSAlcylcbiIsYm9vbGVhbixET0ZNVChmbXQpKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgIHJldHVybihib29sZWFuKTsKK30KKwordXdvcmQ2NAorQWJzb2x1dGVWYWx1ZShvcCxmbXQpCisgICAgIHV3b3JkNjQgb3A7CisgICAgIEZQX2Zvcm1hdHMgZm10OyAKK3sKKyAgdXdvcmQ2NCByZXN1bHQgPSAwOworCisjaWZkZWYgREVCVUcKKyAgcHJpbnRmKCJEQkc6IEFic29sdXRlVmFsdWU6ICVzOiBvcCA9IDB4JXNcbiIsRE9GTVQoZm10KSxwcl9hZGRyKG9wKSk7CisjZW5kaWYgLyogREVCVUcgKi8KKworICAvKiBUaGUgZm9ybWF0IHR5cGUgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGNoZWNrZWQ6ICovCisgIHN3aXRjaCAoZm10KSB7CisgICBjYXNlIGZtdF9zaW5nbGU6CisgICAgeworICAgICAgc2ltX2ZwdSB3b3A7CisgICAgICB1bnNpZ25lZDMyIGFuczsKKyAgICAgIHNpbV9mcHVfMzJ0byAoJndvcCwgb3ApOworICAgICAgc2ltX2ZwdV9hYnMgKCZ3b3AsICZ3b3ApOworICAgICAgc2ltX2ZwdV90bzMyICgmYW5zLCAmd29wKTsKKyAgICAgIHJlc3VsdCA9IGFuczsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgIGNhc2UgZm10X2RvdWJsZToKKyAgICB7CisgICAgICBzaW1fZnB1IHdvcDsKKyAgICAgIHVuc2lnbmVkNjQgYW5zOworICAgICAgc2ltX2ZwdV82NHRvICgmd29wLCBvcCk7CisgICAgICBzaW1fZnB1X2FicyAoJndvcCwgJndvcCk7CisgICAgICBzaW1fZnB1X3RvNjQgKCZhbnMsICZ3b3ApOworICAgICAgcmVzdWx0ID0gYW5zOworICAgICAgYnJlYWs7CisgICAgfQorICAgZGVmYXVsdDoKKyAgICBmcHJpbnRmIChzdGRlcnIsICJCYWQgc3dpdGNoXG4iKTsKKyAgICBhYm9ydCAoKTsKKyAgfQorCisgIHJldHVybihyZXN1bHQpOworfQorCit1d29yZDY0CitOZWdhdGUob3AsZm10KQorICAgICB1d29yZDY0IG9wOworICAgICBGUF9mb3JtYXRzIGZtdDsgCit7CisgIHV3b3JkNjQgcmVzdWx0ID0gMDsKKworI2lmZGVmIERFQlVHCisgIHByaW50ZigiREJHOiBOZWdhdGU6ICVzOiBvcCA9IDB4JXNcbiIsRE9GTVQoZm10KSxwcl9hZGRyKG9wKSk7CisjZW5kaWYgLyogREVCVUcgKi8KKworICAvKiBUaGUgZm9ybWF0IHR5cGUgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGNoZWNrZWQ6ICovCisgIHN3aXRjaCAoZm10KSB7CisgICBjYXNlIGZtdF9zaW5nbGU6CisgICAgeworICAgICAgc2ltX2ZwdSB3b3A7CisgICAgICB1bnNpZ25lZDMyIGFuczsKKyAgICAgIHNpbV9mcHVfMzJ0byAoJndvcCwgb3ApOworICAgICAgc2ltX2ZwdV9uZWcgKCZ3b3AsICZ3b3ApOworICAgICAgc2ltX2ZwdV90bzMyICgmYW5zLCAmd29wKTsKKyAgICAgIHJlc3VsdCA9IGFuczsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgIGNhc2UgZm10X2RvdWJsZToKKyAgICB7CisgICAgICBzaW1fZnB1IHdvcDsKKyAgICAgIHVuc2lnbmVkNjQgYW5zOworICAgICAgc2ltX2ZwdV82NHRvICgmd29wLCBvcCk7CisgICAgICBzaW1fZnB1X25lZyAoJndvcCwgJndvcCk7CisgICAgICBzaW1fZnB1X3RvNjQgKCZhbnMsICZ3b3ApOworICAgICAgcmVzdWx0ID0gYW5zOworICAgICAgYnJlYWs7CisgICAgfQorICAgZGVmYXVsdDoKKyAgICBmcHJpbnRmIChzdGRlcnIsICJCYWQgc3dpdGNoXG4iKTsKKyAgICBhYm9ydCAoKTsKKyAgfQorCisgIHJldHVybihyZXN1bHQpOworfQorCit1d29yZDY0CitBZGQob3AxLG9wMixmbXQpCisgICAgIHV3b3JkNjQgb3AxOworICAgICB1d29yZDY0IG9wMjsKKyAgICAgRlBfZm9ybWF0cyBmbXQ7IAoreworICB1d29yZDY0IHJlc3VsdCA9IDA7CisKKyNpZmRlZiBERUJVRworICBwcmludGYoIkRCRzogQWRkOiAlczogb3AxID0gMHglcyA6IG9wMiA9IDB4JXNcbiIsRE9GTVQoZm10KSxwcl9hZGRyKG9wMSkscHJfYWRkcihvcDIpKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgIC8qIFRoZSByZWdpc3RlcnMgbXVzdCBzcGVjaWZ5IEZQUnMgdmFsaWQgZm9yIG9wZXJhbmRzIG9mIHR5cGUKKyAgICAgImZtdCIuIElmIHRoZXkgYXJlIG5vdCB2YWxpZCwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuICovCisKKyAgLyogVGhlIGZvcm1hdCB0eXBlIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBjaGVja2VkOiAqLworICBzd2l0Y2ggKGZtdCkgeworICAgY2FzZSBmbXRfc2luZ2xlOgorICAgIHsKKyAgICAgIHNpbV9mcHUgd29wMTsKKyAgICAgIHNpbV9mcHUgd29wMjsKKyAgICAgIHNpbV9mcHUgYW5zOworICAgICAgdW5zaWduZWQzMiByZXM7CisgICAgICBzaW1fZnB1XzMydG8gKCZ3b3AxLCBvcDEpOworICAgICAgc2ltX2ZwdV8zMnRvICgmd29wMiwgb3AyKTsKKyAgICAgIHNpbV9mcHVfYWRkICgmYW5zLCAmd29wMSwgJndvcDIpOworICAgICAgc2ltX2ZwdV90bzMyICgmcmVzLCAmYW5zKTsKKyAgICAgIHJlc3VsdCA9IHJlczsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgIGNhc2UgZm10X2RvdWJsZToKKyAgICB7CisgICAgICBzaW1fZnB1IHdvcDE7CisgICAgICBzaW1fZnB1IHdvcDI7CisgICAgICBzaW1fZnB1IGFuczsKKyAgICAgIHVuc2lnbmVkNjQgcmVzOworICAgICAgc2ltX2ZwdV82NHRvICgmd29wMSwgb3AxKTsKKyAgICAgIHNpbV9mcHVfNjR0byAoJndvcDIsIG9wMik7CisgICAgICBzaW1fZnB1X2FkZCAoJmFucywgJndvcDEsICZ3b3AyKTsKKyAgICAgIHNpbV9mcHVfdG82NCAoJnJlcywgJmFucyk7CisgICAgICByZXN1bHQgPSByZXM7CisgICAgICBicmVhazsKKyAgICB9CisgICBkZWZhdWx0OgorICAgIGZwcmludGYgKHN0ZGVyciwgIkJhZCBzd2l0Y2hcbiIpOworICAgIGFib3J0ICgpOworICB9CisKKyNpZmRlZiBERUJVRworICBwcmludGYoIkRCRzogQWRkOiByZXR1cm5pbmcgMHglcyAoZm9ybWF0ID0gJXMpXG4iLHByX2FkZHIocmVzdWx0KSxET0ZNVChmbXQpKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgIHJldHVybihyZXN1bHQpOworfQorCit1d29yZDY0CitTdWIob3AxLG9wMixmbXQpCisgICAgIHV3b3JkNjQgb3AxOworICAgICB1d29yZDY0IG9wMjsKKyAgICAgRlBfZm9ybWF0cyBmbXQ7IAoreworICB1d29yZDY0IHJlc3VsdCA9IDA7CisKKyNpZmRlZiBERUJVRworICBwcmludGYoIkRCRzogU3ViOiAlczogb3AxID0gMHglcyA6IG9wMiA9IDB4JXNcbiIsRE9GTVQoZm10KSxwcl9hZGRyKG9wMSkscHJfYWRkcihvcDIpKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgIC8qIFRoZSByZWdpc3RlcnMgbXVzdCBzcGVjaWZ5IEZQUnMgdmFsaWQgZm9yIG9wZXJhbmRzIG9mIHR5cGUKKyAgICAgImZtdCIuIElmIHRoZXkgYXJlIG5vdCB2YWxpZCwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuICovCisKKyAgLyogVGhlIGZvcm1hdCB0eXBlIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBjaGVja2VkOiAqLworICBzd2l0Y2ggKGZtdCkgeworICAgY2FzZSBmbXRfc2luZ2xlOgorICAgIHsKKyAgICAgIHNpbV9mcHUgd29wMTsKKyAgICAgIHNpbV9mcHUgd29wMjsKKyAgICAgIHNpbV9mcHUgYW5zOworICAgICAgdW5zaWduZWQzMiByZXM7CisgICAgICBzaW1fZnB1XzMydG8gKCZ3b3AxLCBvcDEpOworICAgICAgc2ltX2ZwdV8zMnRvICgmd29wMiwgb3AyKTsKKyAgICAgIHNpbV9mcHVfc3ViICgmYW5zLCAmd29wMSwgJndvcDIpOworICAgICAgc2ltX2ZwdV90bzMyICgmcmVzLCAmYW5zKTsKKyAgICAgIHJlc3VsdCA9IHJlczsKKyAgICB9CisgICAgYnJlYWs7CisgICBjYXNlIGZtdF9kb3VibGU6CisgICAgeworICAgICAgc2ltX2ZwdSB3b3AxOworICAgICAgc2ltX2ZwdSB3b3AyOworICAgICAgc2ltX2ZwdSBhbnM7CisgICAgICB1bnNpZ25lZDY0IHJlczsKKyAgICAgIHNpbV9mcHVfNjR0byAoJndvcDEsIG9wMSk7CisgICAgICBzaW1fZnB1XzY0dG8gKCZ3b3AyLCBvcDIpOworICAgICAgc2ltX2ZwdV9zdWIgKCZhbnMsICZ3b3AxLCAmd29wMik7CisgICAgICBzaW1fZnB1X3RvNjQgKCZyZXMsICZhbnMpOworICAgICAgcmVzdWx0ID0gcmVzOworICAgIH0KKyAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgZnByaW50ZiAoc3RkZXJyLCAiQmFkIHN3aXRjaFxuIik7CisgICAgYWJvcnQgKCk7CisgIH0KKworI2lmZGVmIERFQlVHCisgIHByaW50ZigiREJHOiBTdWI6IHJldHVybmluZyAweCVzIChmb3JtYXQgPSAlcylcbiIscHJfYWRkcihyZXN1bHQpLERPRk1UKGZtdCkpOworI2VuZGlmIC8qIERFQlVHICovCisKKyAgcmV0dXJuKHJlc3VsdCk7Cit9CisKK3V3b3JkNjQKK011bHRpcGx5KG9wMSxvcDIsZm10KQorICAgICB1d29yZDY0IG9wMTsKKyAgICAgdXdvcmQ2NCBvcDI7CisgICAgIEZQX2Zvcm1hdHMgZm10OyAKK3sKKyAgdXdvcmQ2NCByZXN1bHQgPSAwOworCisjaWZkZWYgREVCVUcKKyAgcHJpbnRmKCJEQkc6IE11bHRpcGx5OiAlczogb3AxID0gMHglcyA6IG9wMiA9IDB4JXNcbiIsRE9GTVQoZm10KSxwcl9hZGRyKG9wMSkscHJfYWRkcihvcDIpKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgIC8qIFRoZSByZWdpc3RlcnMgbXVzdCBzcGVjaWZ5IEZQUnMgdmFsaWQgZm9yIG9wZXJhbmRzIG9mIHR5cGUKKyAgICAgImZtdCIuIElmIHRoZXkgYXJlIG5vdCB2YWxpZCwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuICovCisKKyAgLyogVGhlIGZvcm1hdCB0eXBlIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBjaGVja2VkOiAqLworICBzd2l0Y2ggKGZtdCkgeworICAgY2FzZSBmbXRfc2luZ2xlOgorICAgIHsKKyAgICAgIHNpbV9mcHUgd29wMTsKKyAgICAgIHNpbV9mcHUgd29wMjsKKyAgICAgIHNpbV9mcHUgYW5zOworICAgICAgdW5zaWduZWQzMiByZXM7CisgICAgICBzaW1fZnB1XzMydG8gKCZ3b3AxLCBvcDEpOworICAgICAgc2ltX2ZwdV8zMnRvICgmd29wMiwgb3AyKTsKKyAgICAgIHNpbV9mcHVfbXVsICgmYW5zLCAmd29wMSwgJndvcDIpOworICAgICAgc2ltX2ZwdV90bzMyICgmcmVzLCAmYW5zKTsKKyAgICAgIHJlc3VsdCA9IHJlczsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgIGNhc2UgZm10X2RvdWJsZToKKyAgICB7CisgICAgICBzaW1fZnB1IHdvcDE7CisgICAgICBzaW1fZnB1IHdvcDI7CisgICAgICBzaW1fZnB1IGFuczsKKyAgICAgIHVuc2lnbmVkNjQgcmVzOworICAgICAgc2ltX2ZwdV82NHRvICgmd29wMSwgb3AxKTsKKyAgICAgIHNpbV9mcHVfNjR0byAoJndvcDIsIG9wMik7CisgICAgICBzaW1fZnB1X211bCAoJmFucywgJndvcDEsICZ3b3AyKTsKKyAgICAgIHNpbV9mcHVfdG82NCAoJnJlcywgJmFucyk7CisgICAgICByZXN1bHQgPSByZXM7CisgICAgICBicmVhazsKKyAgICB9CisgICBkZWZhdWx0OgorICAgIGZwcmludGYgKHN0ZGVyciwgIkJhZCBzd2l0Y2hcbiIpOworICAgIGFib3J0ICgpOworICB9CisKKyNpZmRlZiBERUJVRworICBwcmludGYoIkRCRzogTXVsdGlwbHk6IHJldHVybmluZyAweCVzIChmb3JtYXQgPSAlcylcbiIscHJfYWRkcihyZXN1bHQpLERPRk1UKGZtdCkpOworI2VuZGlmIC8qIERFQlVHICovCisKKyAgcmV0dXJuKHJlc3VsdCk7Cit9CisKK3V3b3JkNjQKK0RpdmlkZShvcDEsb3AyLGZtdCkKKyAgICAgdXdvcmQ2NCBvcDE7CisgICAgIHV3b3JkNjQgb3AyOworICAgICBGUF9mb3JtYXRzIGZtdDsgCit7CisgIHV3b3JkNjQgcmVzdWx0ID0gMDsKKworI2lmZGVmIERFQlVHCisgIHByaW50ZigiREJHOiBEaXZpZGU6ICVzOiBvcDEgPSAweCVzIDogb3AyID0gMHglc1xuIixET0ZNVChmbXQpLHByX2FkZHIob3AxKSxwcl9hZGRyKG9wMikpOworI2VuZGlmIC8qIERFQlVHICovCisKKyAgLyogVGhlIHJlZ2lzdGVycyBtdXN0IHNwZWNpZnkgRlBScyB2YWxpZCBmb3Igb3BlcmFuZHMgb2YgdHlwZQorICAgICAiZm10Ii4gSWYgdGhleSBhcmUgbm90IHZhbGlkLCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4gKi8KKworICAvKiBUaGUgZm9ybWF0IHR5cGUgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGNoZWNrZWQ6ICovCisgIHN3aXRjaCAoZm10KSB7CisgICBjYXNlIGZtdF9zaW5nbGU6CisgICAgeworICAgICAgc2ltX2ZwdSB3b3AxOworICAgICAgc2ltX2ZwdSB3b3AyOworICAgICAgc2ltX2ZwdSBhbnM7CisgICAgICB1bnNpZ25lZDMyIHJlczsKKyAgICAgIHNpbV9mcHVfMzJ0byAoJndvcDEsIG9wMSk7CisgICAgICBzaW1fZnB1XzMydG8gKCZ3b3AyLCBvcDIpOworICAgICAgc2ltX2ZwdV9kaXYgKCZhbnMsICZ3b3AxLCAmd29wMik7CisgICAgICBzaW1fZnB1X3RvMzIgKCZyZXMsICZhbnMpOworICAgICAgcmVzdWx0ID0gcmVzOworICAgICAgYnJlYWs7CisgICAgfQorICAgY2FzZSBmbXRfZG91YmxlOgorICAgIHsKKyAgICAgIHNpbV9mcHUgd29wMTsKKyAgICAgIHNpbV9mcHUgd29wMjsKKyAgICAgIHNpbV9mcHUgYW5zOworICAgICAgdW5zaWduZWQ2NCByZXM7CisgICAgICBzaW1fZnB1XzY0dG8gKCZ3b3AxLCBvcDEpOworICAgICAgc2ltX2ZwdV82NHRvICgmd29wMiwgb3AyKTsKKyAgICAgIHNpbV9mcHVfZGl2ICgmYW5zLCAmd29wMSwgJndvcDIpOworICAgICAgc2ltX2ZwdV90bzY0ICgmcmVzLCAmYW5zKTsKKyAgICAgIHJlc3VsdCA9IHJlczsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgIGRlZmF1bHQ6CisgICAgZnByaW50ZiAoc3RkZXJyLCAiQmFkIHN3aXRjaFxuIik7CisgICAgYWJvcnQgKCk7CisgIH0KKworI2lmZGVmIERFQlVHCisgIHByaW50ZigiREJHOiBEaXZpZGU6IHJldHVybmluZyAweCVzIChmb3JtYXQgPSAlcylcbiIscHJfYWRkcihyZXN1bHQpLERPRk1UKGZtdCkpOworI2VuZGlmIC8qIERFQlVHICovCisKKyAgcmV0dXJuKHJlc3VsdCk7Cit9CisKK3V3b3JkNjQgVU5VU0VECitSZWNpcChvcCxmbXQpCisgICAgIHV3b3JkNjQgb3A7CisgICAgIEZQX2Zvcm1hdHMgZm10OyAKK3sKKyAgdXdvcmQ2NCByZXN1bHQgPSAwOworCisjaWZkZWYgREVCVUcKKyAgcHJpbnRmKCJEQkc6IFJlY2lwOiAlczogb3AgPSAweCVzXG4iLERPRk1UKGZtdCkscHJfYWRkcihvcCkpOworI2VuZGlmIC8qIERFQlVHICovCisKKyAgLyogVGhlIHJlZ2lzdGVycyBtdXN0IHNwZWNpZnkgRlBScyB2YWxpZCBmb3Igb3BlcmFuZHMgb2YgdHlwZQorICAgICAiZm10Ii4gSWYgdGhleSBhcmUgbm90IHZhbGlkLCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4gKi8KKworICAvKiBUaGUgZm9ybWF0IHR5cGUgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGNoZWNrZWQ6ICovCisgIHN3aXRjaCAoZm10KSB7CisgICBjYXNlIGZtdF9zaW5nbGU6CisgICAgeworICAgICAgc2ltX2ZwdSB3b3A7CisgICAgICBzaW1fZnB1IGFuczsKKyAgICAgIHVuc2lnbmVkMzIgcmVzOworICAgICAgc2ltX2ZwdV8zMnRvICgmd29wLCBvcCk7CisgICAgICBzaW1fZnB1X2ludiAoJmFucywgJndvcCk7CisgICAgICBzaW1fZnB1X3RvMzIgKCZyZXMsICZhbnMpOworICAgICAgcmVzdWx0ID0gcmVzOworICAgICAgYnJlYWs7CisgICAgfQorICAgY2FzZSBmbXRfZG91YmxlOgorICAgIHsKKyAgICAgIHNpbV9mcHUgd29wOworICAgICAgc2ltX2ZwdSBhbnM7CisgICAgICB1bnNpZ25lZDY0IHJlczsKKyAgICAgIHNpbV9mcHVfNjR0byAoJndvcCwgb3ApOworICAgICAgc2ltX2ZwdV9pbnYgKCZhbnMsICZ3b3ApOworICAgICAgc2ltX2ZwdV90bzY0ICgmcmVzLCAmYW5zKTsKKyAgICAgIHJlc3VsdCA9IHJlczsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgIGRlZmF1bHQ6CisgICAgZnByaW50ZiAoc3RkZXJyLCAiQmFkIHN3aXRjaFxuIik7CisgICAgYWJvcnQgKCk7CisgIH0KKworI2lmZGVmIERFQlVHCisgIHByaW50ZigiREJHOiBSZWNpcDogcmV0dXJuaW5nIDB4JXMgKGZvcm1hdCA9ICVzKVxuIixwcl9hZGRyKHJlc3VsdCksRE9GTVQoZm10KSk7CisjZW5kaWYgLyogREVCVUcgKi8KKworICByZXR1cm4ocmVzdWx0KTsKK30KKwordXdvcmQ2NAorU3F1YXJlUm9vdChvcCxmbXQpCisgICAgIHV3b3JkNjQgb3A7CisgICAgIEZQX2Zvcm1hdHMgZm10OyAKK3sKKyAgdXdvcmQ2NCByZXN1bHQgPSAwOworCisjaWZkZWYgREVCVUcKKyAgcHJpbnRmKCJEQkc6IFNxdWFyZVJvb3Q6ICVzOiBvcCA9IDB4JXNcbiIsRE9GTVQoZm10KSxwcl9hZGRyKG9wKSk7CisjZW5kaWYgLyogREVCVUcgKi8KKworICAvKiBUaGUgcmVnaXN0ZXJzIG11c3Qgc3BlY2lmeSBGUFJzIHZhbGlkIGZvciBvcGVyYW5kcyBvZiB0eXBlCisgICAgICJmbXQiLiBJZiB0aGV5IGFyZSBub3QgdmFsaWQsIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLiAqLworCisgIC8qIFRoZSBmb3JtYXQgdHlwZSBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gY2hlY2tlZDogKi8KKyAgc3dpdGNoIChmbXQpIHsKKyAgIGNhc2UgZm10X3NpbmdsZToKKyAgICB7CisgICAgICBzaW1fZnB1IHdvcDsKKyAgICAgIHNpbV9mcHUgYW5zOworICAgICAgdW5zaWduZWQzMiByZXM7CisgICAgICBzaW1fZnB1XzMydG8gKCZ3b3AsIG9wKTsKKyAgICAgIHNpbV9mcHVfc3FydCAoJmFucywgJndvcCk7CisgICAgICBzaW1fZnB1X3RvMzIgKCZyZXMsICZhbnMpOworICAgICAgcmVzdWx0ID0gcmVzOworICAgICAgYnJlYWs7CisgICAgfQorICAgY2FzZSBmbXRfZG91YmxlOgorICAgIHsKKyAgICAgIHNpbV9mcHUgd29wOworICAgICAgc2ltX2ZwdSBhbnM7CisgICAgICB1bnNpZ25lZDY0IHJlczsKKyAgICAgIHNpbV9mcHVfNjR0byAoJndvcCwgb3ApOworICAgICAgc2ltX2ZwdV9zcXJ0ICgmYW5zLCAmd29wKTsKKyAgICAgIHNpbV9mcHVfdG82NCAoJnJlcywgJmFucyk7CisgICAgICByZXN1bHQgPSByZXM7CisgICAgICBicmVhazsKKyAgICB9CisgICBkZWZhdWx0OgorICAgIGZwcmludGYgKHN0ZGVyciwgIkJhZCBzd2l0Y2hcbiIpOworICAgIGFib3J0ICgpOworICB9CisKKyNpZmRlZiBERUJVRworICBwcmludGYoIkRCRzogU3F1YXJlUm9vdDogcmV0dXJuaW5nIDB4JXMgKGZvcm1hdCA9ICVzKVxuIixwcl9hZGRyKHJlc3VsdCksRE9GTVQoZm10KSk7CisjZW5kaWYgLyogREVCVUcgKi8KKworICByZXR1cm4ocmVzdWx0KTsKK30KKworI2lmIDAKK3V3b3JkNjQKK01heCAodXdvcmQ2NCBvcDEsCisgICAgIHV3b3JkNjQgb3AyLAorICAgICBGUF9mb3JtYXRzIGZtdCkKK3sKKyAgaW50IGNtcDsKKyAgdW5zaWduZWQ2NCByZXN1bHQ7CisKKyNpZmRlZiBERUJVRworICBwcmludGYoIkRCRzogTWF4OiAlczogb3AxID0gMHglcyA6IG9wMiA9IDB4JXNcbiIsRE9GTVQoZm10KSxwcl9hZGRyKG9wMSkscHJfYWRkcihvcDIpKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgIC8qIFRoZSByZWdpc3RlcnMgbXVzdCBzcGVjaWZ5IEZQUnMgdmFsaWQgZm9yIG9wZXJhbmRzIG9mIHR5cGUKKyAgICAgImZtdCIuIElmIHRoZXkgYXJlIG5vdCB2YWxpZCwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuICovCisKKyAgLyogVGhlIGZvcm1hdCB0eXBlIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBjaGVja2VkOiAqLworICBzd2l0Y2ggKGZtdCkKKyAgICB7CisgICAgY2FzZSBmbXRfc2luZ2xlOgorICAgICAgeworCXNpbV9mcHUgd29wMTsKKwlzaW1fZnB1IHdvcDI7CisJc2ltX2ZwdV8zMnRvICgmd29wMSwgb3AxKTsKKwlzaW1fZnB1XzMydG8gKCZ3b3AyLCBvcDIpOworCWNtcCA9IHNpbV9mcHVfY21wICgmd29wMSwgJndvcDIpOworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgZm10X2RvdWJsZToKKyAgICAgIHsKKwlzaW1fZnB1IHdvcDE7CisJc2ltX2ZwdSB3b3AyOworCXNpbV9mcHVfNjR0byAoJndvcDEsIG9wMSk7CisJc2ltX2ZwdV82NHRvICgmd29wMiwgb3AyKTsKKwljbXAgPSBzaW1fZnB1X2NtcCAoJndvcDEsICZ3b3AyKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQmFkIHN3aXRjaFxuIik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisgIAorICBzd2l0Y2ggKGNtcCkKKyAgICB7CisgICAgY2FzZSBTSU1fRlBVX0lTX1NOQU46CisgICAgY2FzZSBTSU1fRlBVX0lTX1FOQU46CisgICAgICByZXN1bHQgPSBvcDE7CisgICAgY2FzZSBTSU1fRlBVX0lTX05JTkY6CisgICAgY2FzZSBTSU1fRlBVX0lTX05OVU1CRVI6CisgICAgY2FzZSBTSU1fRlBVX0lTX05ERU5PUk06CisgICAgY2FzZSBTSU1fRlBVX0lTX05aRVJPOgorICAgICAgcmVzdWx0ID0gb3AyOyAvKiBvcDEgLSBvcDIgPCAwICovCisgICAgY2FzZSBTSU1fRlBVX0lTX1BJTkY6CisgICAgY2FzZSBTSU1fRlBVX0lTX1BOVU1CRVI6CisgICAgY2FzZSBTSU1fRlBVX0lTX1BERU5PUk06CisgICAgY2FzZSBTSU1fRlBVX0lTX1BaRVJPOgorICAgICAgcmVzdWx0ID0gb3AxOyAvKiBvcDEgLSBvcDIgPiAwICovCisgICAgZGVmYXVsdDoKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkJhZCBzd2l0Y2hcbiIpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisjaWZkZWYgREVCVUcKKyAgcHJpbnRmKCJEQkc6IE1heDogcmV0dXJuaW5nIDB4JXMgKGZvcm1hdCA9ICVzKVxuIixwcl9hZGRyKHJlc3VsdCksRE9GTVQoZm10KSk7CisjZW5kaWYgLyogREVCVUcgKi8KKworICByZXR1cm4ocmVzdWx0KTsKK30KKyNlbmRpZiAKKworI2lmIDAKK3V3b3JkNjQKK01pbiAodXdvcmQ2NCBvcDEsCisgICAgIHV3b3JkNjQgb3AyLAorICAgICBGUF9mb3JtYXRzIGZtdCkKK3sKKyAgaW50IGNtcDsKKyAgdW5zaWduZWQ2NCByZXN1bHQ7CisKKyNpZmRlZiBERUJVRworICBwcmludGYoIkRCRzogTWluOiAlczogb3AxID0gMHglcyA6IG9wMiA9IDB4JXNcbiIsRE9GTVQoZm10KSxwcl9hZGRyKG9wMSkscHJfYWRkcihvcDIpKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgIC8qIFRoZSByZWdpc3RlcnMgbXVzdCBzcGVjaWZ5IEZQUnMgdmFsaWQgZm9yIG9wZXJhbmRzIG9mIHR5cGUKKyAgICAgImZtdCIuIElmIHRoZXkgYXJlIG5vdCB2YWxpZCwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuICovCisKKyAgLyogVGhlIGZvcm1hdCB0eXBlIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBjaGVja2VkOiAqLworICBzd2l0Y2ggKGZtdCkKKyAgICB7CisgICAgY2FzZSBmbXRfc2luZ2xlOgorICAgICAgeworCXNpbV9mcHUgd29wMTsKKwlzaW1fZnB1IHdvcDI7CisJc2ltX2ZwdV8zMnRvICgmd29wMSwgb3AxKTsKKwlzaW1fZnB1XzMydG8gKCZ3b3AyLCBvcDIpOworCWNtcCA9IHNpbV9mcHVfY21wICgmd29wMSwgJndvcDIpOworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgZm10X2RvdWJsZToKKyAgICAgIHsKKwlzaW1fZnB1IHdvcDE7CisJc2ltX2ZwdSB3b3AyOworCXNpbV9mcHVfNjR0byAoJndvcDEsIG9wMSk7CisJc2ltX2ZwdV82NHRvICgmd29wMiwgb3AyKTsKKwljbXAgPSBzaW1fZnB1X2NtcCAoJndvcDEsICZ3b3AyKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQmFkIHN3aXRjaFxuIik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisgIAorICBzd2l0Y2ggKGNtcCkKKyAgICB7CisgICAgY2FzZSBTSU1fRlBVX0lTX1NOQU46CisgICAgY2FzZSBTSU1fRlBVX0lTX1FOQU46CisgICAgICByZXN1bHQgPSBvcDE7CisgICAgY2FzZSBTSU1fRlBVX0lTX05JTkY6CisgICAgY2FzZSBTSU1fRlBVX0lTX05OVU1CRVI6CisgICAgY2FzZSBTSU1fRlBVX0lTX05ERU5PUk06CisgICAgY2FzZSBTSU1fRlBVX0lTX05aRVJPOgorICAgICAgcmVzdWx0ID0gb3AxOyAvKiBvcDEgLSBvcDIgPCAwICovCisgICAgY2FzZSBTSU1fRlBVX0lTX1BJTkY6CisgICAgY2FzZSBTSU1fRlBVX0lTX1BOVU1CRVI6CisgICAgY2FzZSBTSU1fRlBVX0lTX1BERU5PUk06CisgICAgY2FzZSBTSU1fRlBVX0lTX1BaRVJPOgorICAgICAgcmVzdWx0ID0gb3AyOyAvKiBvcDEgLSBvcDIgPiAwICovCisgICAgZGVmYXVsdDoKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkJhZCBzd2l0Y2hcbiIpOworICAgICAgYWJvcnQgKCk7CisgICAgfQorCisjaWZkZWYgREVCVUcKKyAgcHJpbnRmKCJEQkc6IE1pbjogcmV0dXJuaW5nIDB4JXMgKGZvcm1hdCA9ICVzKVxuIixwcl9hZGRyKHJlc3VsdCksRE9GTVQoZm10KSk7CisjZW5kaWYgLyogREVCVUcgKi8KKworICByZXR1cm4ocmVzdWx0KTsKK30KKyNlbmRpZgorCit1d29yZDY0Citjb252ZXJ0IChTSU1fREVTQyBzZCwKKwkgc2ltX2NwdSAqY3B1LAorCSBhZGRyZXNzX3dvcmQgY2lhLAorCSBpbnQgcm0sCisJIHV3b3JkNjQgb3AsCisJIEZQX2Zvcm1hdHMgZnJvbSwKKwkgRlBfZm9ybWF0cyB0bykKK3sKKyAgc2ltX2ZwdSB3b3A7CisgIHNpbV9mcHVfcm91bmQgcm91bmQ7CisgIHVuc2lnbmVkMzIgcmVzdWx0MzI7CisgIHVuc2lnbmVkNjQgcmVzdWx0NjQ7CisKKyNpZmRlZiBERUJVRworI2lmIDAgLyogRklYTUU6IGRvZXNuJ3QgY29tcGlsZSAqLworICBwcmludGYoIkRCRzogQ29udmVydDogbW9kZSAlcyA6IG9wIDB4JXMgOiBmcm9tICVzIDogdG8gJXMgOiAoUEMgPSAweCVzKVxuIixSTU1PREUocm0pLHByX2FkZHIob3ApLERPRk1UKGZyb20pLERPRk1UKHRvKSxwcl9hZGRyKElQQykpOworI2VuZGlmCisjZW5kaWYgLyogREVCVUcgKi8KKworICBzd2l0Y2ggKHJtKQorICAgIHsKKyAgICBjYXNlIEZQX1JNX05FQVJFU1Q6CisgICAgICAvKiBSb3VuZCByZXN1bHQgdG8gbmVhcmVzdCByZXByZXNlbnRhYmxlIHZhbHVlLiBXaGVuIHR3bworCSByZXByZXNlbnRhYmxlIHZhbHVlcyBhcmUgZXF1YWxseSBuZWFyLCByb3VuZCB0byB0aGUgdmFsdWUKKwkgdGhhdCBoYXMgYSBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgemVybyAoaS5lLiBpcyBldmVuKS4gKi8KKyAgICAgIHJvdW5kID0gc2ltX2ZwdV9yb3VuZF9uZWFyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUF9STV9UT1pFUk86CisgICAgICAvKiBSb3VuZCByZXN1bHQgdG8gdGhlIHZhbHVlIGNsb3Nlc3QgdG8sIGFuZCBub3QgZ3JlYXRlciBpbgorCSBtYWduaXR1ZGUgdGhhbiwgdGhlIHJlc3VsdC4gKi8KKyAgICAgIHJvdW5kID0gc2ltX2ZwdV9yb3VuZF96ZXJvOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUF9STV9UT1BJTkY6CisgICAgICAvKiBSb3VuZCByZXN1bHQgdG8gdGhlIHZhbHVlIGNsb3Nlc3QgdG8sIGFuZCBub3QgbGVzcyB0aGFuLAorCSB0aGUgcmVzdWx0LiAqLworICAgICAgcm91bmQgPSBzaW1fZnB1X3JvdW5kX3VwOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIEZQX1JNX1RPTUlORjoKKyAgICAgIC8qIFJvdW5kIHJlc3VsdCB0byB0aGUgdmFsdWUgY2xvc2VzdCB0bywgYW5kIG5vdCBncmVhdGVyIHRoYW4sCisJIHRoZSByZXN1bHQuICovCisgICAgICByb3VuZCA9IHNpbV9mcHVfcm91bmRfZG93bjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByb3VuZCA9IDA7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJCYWQgc3dpdGNoXG4iKTsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKyAgCisgIC8qIENvbnZlcnQgdGhlIGlucHV0IHRvIHNpbV9mcHUgaW50ZXJuYWwgZm9ybWF0ICovCisgIHN3aXRjaCAoZnJvbSkKKyAgICB7CisgICAgY2FzZSBmbXRfZG91YmxlOgorICAgICAgc2ltX2ZwdV82NHRvICgmd29wLCBvcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGZtdF9zaW5nbGU6CisgICAgICBzaW1fZnB1XzMydG8gKCZ3b3AsIG9wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgZm10X3dvcmQ6CisgICAgICBzaW1fZnB1X2kzMnRvICgmd29wLCBvcCwgcm91bmQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBmbXRfbG9uZzoKKyAgICAgIHNpbV9mcHVfaTY0dG8gKCZ3b3AsIG9wLCByb3VuZCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQmFkIHN3aXRjaFxuIik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisKKyAgLyogQ29udmVydCBzaW1fZnB1IGZvcm1hdCBpbnRvIHRoZSBvdXRwdXQgKi8KKyAgLyogVGhlIHZhbHVlIFdPUCBpcyBjb252ZXJ0ZWQgdG8gdGhlIGRlc3RpbmF0aW9uIGZvcm1hdCwgcm91bmRpbmcKKyAgICAgdXNpbmcgbW9kZSBSTS4gV2hlbiB0aGUgZGVzdGluYXRpb24gaXMgYSBmaXhlZC1wb2ludCBmb3JtYXQsIHRoZW4KKyAgICAgYSBzb3VyY2UgdmFsdWUgb2YgSW5maW5pdHksIE5hTiBvciBvbmUgd2hpY2ggd291bGQgcm91bmQgdG8gYW4KKyAgICAgaW50ZWdlciBvdXRzaWRlIHRoZSBmaXhlZCBwb2ludCByYW5nZSB0aGVuIGFuIElFRUUgSW52YWxpZAorICAgICBPcGVyYXRpb24gY29uZGl0aW9uIGlzIHJhaXNlZC4gKi8KKyAgc3dpdGNoICh0bykKKyAgICB7CisgICAgY2FzZSBmbXRfc2luZ2xlOgorICAgICAgc2ltX2ZwdV9yb3VuZF8zMiAoJndvcCwgcm91bmQsIDApOworICAgICAgc2ltX2ZwdV90bzMyICgmcmVzdWx0MzIsICZ3b3ApOworICAgICAgcmVzdWx0NjQgPSByZXN1bHQzMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgZm10X2RvdWJsZToKKyAgICAgIHNpbV9mcHVfcm91bmRfNjQgKCZ3b3AsIHJvdW5kLCAwKTsKKyAgICAgIHNpbV9mcHVfdG82NCAoJnJlc3VsdDY0LCAmd29wKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgZm10X3dvcmQ6CisgICAgICBzaW1fZnB1X3RvMzJpICgmcmVzdWx0MzIsICZ3b3AsIHJvdW5kKTsKKyAgICAgIHJlc3VsdDY0ID0gcmVzdWx0MzI7CisgICAgICBicmVhazsKKyAgICBjYXNlIGZtdF9sb25nOgorICAgICAgc2ltX2ZwdV90bzY0aSAoJnJlc3VsdDY0LCAmd29wLCByb3VuZCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmVzdWx0NjQgPSAwOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQmFkIHN3aXRjaFxuIik7CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisgCisjaWZkZWYgREVCVUcKKyAgcHJpbnRmKCJEQkc6IENvbnZlcnQ6IHJldHVybmluZyAweCVzICh0byBmb3JtYXQgPSAlcylcbiIscHJfYWRkcihyZXN1bHQ2NCksRE9GTVQodG8pKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgIHJldHVybihyZXN1bHQ2NCk7Cit9CisKKworLyotLSBjby1wcm9jZXNzb3Igc3VwcG9ydCByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IFVOVVNFRAorQ29Qcm9jUHJlc2VudCh1bnNpZ25lZCBpbnQgY29wcm9jX251bWJlcikKK3sKKyAgLyogUmV0dXJuIFRSVUUgaWYgc2ltdWxhdG9yIHByb3ZpZGVzIGEgbW9kZWwgZm9yIHRoZSBnaXZlbiBjby1wcm9jZXNzb3IgbnVtYmVyICovCisgIHJldHVybigwKTsKK30KKwordm9pZAorY29wX2x3IChTSU1fREVTQyBzZCwKKwlzaW1fY3B1ICpjcHUsCisJYWRkcmVzc193b3JkIGNpYSwKKwlpbnQgY29wcm9jX251bSwKKwlpbnQgY29wcm9jX3JlZywKKwl1bnNpZ25lZCBpbnQgbWVtd29yZCkKK3sKKyAgc3dpdGNoIChjb3Byb2NfbnVtKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBpZiAoQ1VSUkVOVF9GTE9BVElOR19QT0lOVCA9PSBIQVJEX0ZMT0FUSU5HX1BPSU5UKQorCXsKKyNpZmRlZiBERUJVRworCSAgcHJpbnRmKCJEQkc6IENPUF9MVzogbWVtd29yZCA9IDB4JTA4WCAodXdvcmQ2NCltZW13b3JkID0gMHglc1xuIixtZW13b3JkLHByX2FkZHIobWVtd29yZCkpOworI2VuZGlmCisJICBTdG9yZUZQUihjb3Byb2NfcmVnLGZtdF93b3JkLCh1d29yZDY0KW1lbXdvcmQpOworCSAgRlBSX1NUQVRFW2NvcHJvY19yZWddID0gZm10X3VuaW50ZXJwcmV0ZWQ7CisJICBicmVhazsKKwl9CisKKyAgICBkZWZhdWx0OgorI2lmIDAgLyogdGhpcyBzaG91bGQgYmUgY29udHJvbGxlZCBieSBhIGNvbmZpZ3VyYXRpb24gb3B0aW9uICovCisgICAgICBzaW1faW9fcHJpbnRmKHNkLCJDT1BfTFcoJWQsJWQsMHglMDhYKSBhdCBQQyA9IDB4JXMgOiBUT0RPIChhcmNoaXRlY3R1cmUgc3BlY2lmaWMpXG4iLGNvcHJvY19udW0sY29wcm9jX3JlZyxtZW13b3JkLHByX2FkZHIoY2lhKSk7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm47Cit9CisKK3ZvaWQKK2NvcF9sZCAoU0lNX0RFU0Mgc2QsCisJc2ltX2NwdSAqY3B1LAorCWFkZHJlc3Nfd29yZCBjaWEsCisJaW50IGNvcHJvY19udW0sCisJaW50IGNvcHJvY19yZWcsCisJdXdvcmQ2NCBtZW13b3JkKQoreworCisjaWZkZWYgREVCVUcKKyAgcHJpbnRmKCJEQkc6IENPUF9MRDogY29wcm9jX251bSA9ICVkLCBjb3Byb2NfcmVnID0gJWQsIHZhbHVlID0gMHglcyA6IFBDID0gMHglc1xuIiwgY29wcm9jX251bSwgY29wcm9jX3JlZywgcHJfdXdvcmQ2NChtZW13b3JkKSwgcHJfYWRkcihjaWEpICk7CisjZW5kaWYKKworICBzd2l0Y2ggKGNvcHJvY19udW0pIHsKKyAgICBjYXNlIDE6CisgICAgICBpZiAoQ1VSUkVOVF9GTE9BVElOR19QT0lOVCA9PSBIQVJEX0ZMT0FUSU5HX1BPSU5UKQorCXsKKwkgIFN0b3JlRlBSKGNvcHJvY19yZWcsZm10X3VuaW50ZXJwcmV0ZWQsbWVtd29yZCk7CisJICBicmVhazsKKwl9CisKKyAgICBkZWZhdWx0OgorI2lmIDAgLyogdGhpcyBtZXNzYWdlIHNob3VsZCBiZSBjb250cm9sbGVkIGJ5IGEgY29uZmlndXJhdGlvbiBvcHRpb24gKi8KKyAgICAgc2ltX2lvX3ByaW50ZihzZCwiQ09QX0xEKCVkLCVkLDB4JXMpIGF0IFBDID0gMHglcyA6IFRPRE8gKGFyY2hpdGVjdHVyZSBzcGVjaWZpYylcbiIsY29wcm9jX251bSxjb3Byb2NfcmVnLHByX2FkZHIobWVtd29yZCkscHJfYWRkcihjaWEpKTsKKyNlbmRpZgorICAgICBicmVhazsKKyAgfQorCisgIHJldHVybjsKK30KKworCisKKwordW5zaWduZWQgaW50Citjb3Bfc3cgKFNJTV9ERVNDIHNkLAorCXNpbV9jcHUgKmNwdSwKKwlhZGRyZXNzX3dvcmQgY2lhLAorCWludCBjb3Byb2NfbnVtLAorCWludCBjb3Byb2NfcmVnKQoreworICB1bnNpZ25lZCBpbnQgdmFsdWUgPSAwOworCisgIHN3aXRjaCAoY29wcm9jX251bSkKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgaWYgKENVUlJFTlRfRkxPQVRJTkdfUE9JTlQgPT0gSEFSRF9GTE9BVElOR19QT0lOVCkKKwl7CisJICBGUF9mb3JtYXRzIGhvbGQ7CisJICBob2xkID0gRlBSX1NUQVRFW2NvcHJvY19yZWddOworCSAgRlBSX1NUQVRFW2NvcHJvY19yZWddID0gZm10X3dvcmQ7CisJICB2YWx1ZSA9ICh1bnNpZ25lZCBpbnQpVmFsdWVGUFIoY29wcm9jX3JlZyxmbXRfdW5pbnRlcnByZXRlZCk7CisJICBGUFJfU1RBVEVbY29wcm9jX3JlZ10gPSBob2xkOworCSAgYnJlYWs7CisJfQorCisgICAgZGVmYXVsdDoKKyNpZiAwIC8qIHNob3VsZCBiZSBjb250cm9sbGVkIGJ5IGNvbmZpZ3VyYXRpb24gb3B0aW9uICovCisgICAgICBzaW1faW9fcHJpbnRmKHNkLCJDT1BfU1coJWQsJWQpIGF0IFBDID0gMHglcyA6IFRPRE8gKGFyY2hpdGVjdHVyZSBzcGVjaWZpYylcbiIsY29wcm9jX251bSxjb3Byb2NfcmVnLHByX2FkZHIoY2lhKSk7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4odmFsdWUpOworfQorCit1d29yZDY0Citjb3Bfc2QgKFNJTV9ERVNDIHNkLAorCXNpbV9jcHUgKmNwdSwKKwlhZGRyZXNzX3dvcmQgY2lhLAorCWludCBjb3Byb2NfbnVtLAorCWludCBjb3Byb2NfcmVnKQoreworICB1d29yZDY0IHZhbHVlID0gMDsKKyAgc3dpdGNoIChjb3Byb2NfbnVtKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBpZiAoQ1VSUkVOVF9GTE9BVElOR19QT0lOVCA9PSBIQVJEX0ZMT0FUSU5HX1BPSU5UKQorCXsKKwkgIHZhbHVlID0gVmFsdWVGUFIoY29wcm9jX3JlZyxmbXRfdW5pbnRlcnByZXRlZCk7CisJICBicmVhazsKKwl9CisKKyAgICBkZWZhdWx0OgorI2lmIDAgLyogc2hvdWxkIGJlIGNvbnRyb2xsZWQgYnkgY29uZmlndXJhdGlvbiBvcHRpb24gKi8KKyAgICAgIHNpbV9pb19wcmludGYoc2QsIkNPUF9TRCglZCwlZCkgYXQgUEMgPSAweCVzIDogVE9ETyAoYXJjaGl0ZWN0dXJlIHNwZWNpZmljKVxuIixjb3Byb2NfbnVtLGNvcHJvY19yZWcscHJfYWRkcihjaWEpKTsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybih2YWx1ZSk7Cit9CisKKworCisKK3ZvaWQKK2RlY29kZV9jb3Byb2MgKFNJTV9ERVNDIHNkLAorCSAgICAgICBzaW1fY3B1ICpjcHUsCisJICAgICAgIGFkZHJlc3Nfd29yZCBjaWEsCisJICAgICAgIHVuc2lnbmVkIGludCBpbnN0cnVjdGlvbikKK3sKKyAgaW50IGNvcHJvY251bSA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjYpICYgMyk7CisKKyAgc3dpdGNoIChjb3Byb2NudW0pCisgICAgeworICAgIGNhc2UgMDogLyogc3RhbmRhcmQgQ1BVIGNvbnRyb2wgYW5kIGNhY2hlIHJlZ2lzdGVycyAqLworICAgICAgeworICAgICAgICBpbnQgY29kZSA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgxRik7CisJaW50IHJ0ID0gKChpbnN0cnVjdGlvbiA+PiAxNikgJiAweDFGKTsKKwlpbnQgcmQgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MUYpOworCWludCB0YWlsID0gaW5zdHJ1Y3Rpb24gJiAweDNmZjsKKyAgICAgICAgLyogUjQwMDAgVXNlcnMgTWFudWFsIChzZWNvbmQgZWRpdGlvbikgbGlzdHMgdGhlIGZvbGxvd2luZyBDUDAKKyAgICAgICAgICAgaW5zdHJ1Y3Rpb25zOgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERT48LVJUPjxSRC0+PC0tVEFJTC0tLT4KKwkgICBETUZDMCAgIERvdWJsZXdvcmQgTW92ZSBGcm9tIENQMCAgICAgICAgKFZSNDEwMCA9IDAxMDAwMDAwMDAxdHR0dHRkZGRkZDAwMDAwMDAwMDAwKQorCSAgIERNVEMwICAgRG91Ymxld29yZCBNb3ZlIFRvIENQMCAgICAgICAgICAoVlI0MTAwID0gMDEwMDAwMDAxMDF0dHR0dGRkZGRkMDAwMDAwMDAwMDApCisJICAgTUZDMCAgICB3b3JkIE1vdmUgRnJvbSBDUDAgICAgICAgICAgICAgIChWUjQxMDAgPSAwMTAwMDAwMDAwMHR0dHR0ZGRkZGQwMDAwMDAwMDAwMCkKKwkgICBNVEMwICAgIHdvcmQgTW92ZSBUbyBDUDAgICAgICAgICAgICAgICAgKFZSNDEwMCA9IDAxMDAwMDAwMTAwdHR0dHRkZGRkZDAwMDAwMDAwMDAwKQorCSAgIFRMQlIgICAgUmVhZCBJbmRleGVkIFRMQiBFbnRyeSAgICAgICAgICAoVlI0MTAwID0gMDEwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEpCisJICAgVExCV0kgICBXcml0ZSBJbmRleGVkIFRMQiBFbnRyeSAgICAgICAgIChWUjQxMDAgPSAwMTAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMCkKKwkgICBUTEJXUiAgIFdyaXRlIFJhbmRvbSBUTEIgRW50cnkgICAgICAgICAgKFZSNDEwMCA9IDAxMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEwKQorCSAgIFRMQlAgICAgUHJvYmUgVExCIGZvciBNYXRjaGluZyBFbnRyeSAgICAoVlI0MTAwID0gMDEwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDApCisJICAgQ0FDSEUgICBDYWNoZSBvcGVyYXRpb24gICAgICAgICAgICAgICAgIChWUjQxMDAgPSAxMDExMTFiYmJiYnBwcHBwaWlpaWlpaWlpaWlpaWlpaSkKKwkgICBFUkVUICAgIEV4Y2VwdGlvbiByZXR1cm4gICAgICAgICAgICAgICAgKFZSNDEwMCA9IDAxMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwKQorCSAgICovCisgICAgICAgIGlmICgoKGNvZGUgPT0gMHgwMCkgfHwgKGNvZGUgPT0gMHgwNCkpICYmIHRhaWwgPT0gMCkKKwkgIHsKKwkgICAgLyogTVtURl1DMCAtIDMyIGJpdCB3b3JkICovCisJICAgIAorCSAgICBzd2l0Y2ggKHJkKSAgLyogTk9URXM6IFN0YW5kYXJkIENQMCByZWdpc3RlcnMgKi8KKwkgICAgICB7CisJCS8qIDAgPSBJbmRleCAgICAgICAgICAgICAgIFI0MDAwICAgVlI0MTAwICBWUjQzMDAgKi8KKwkJLyogMSA9IFJhbmRvbSAgICAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLworCQkvKiAyID0gRW50cnlMbzAgICAgICAgICAgICBSNDAwMCAgIFZSNDEwMCAgVlI0MzAwICovCisJCS8qIDMgPSBFbnRyeUxvMSAgICAgICAgICAgIFI0MDAwICAgVlI0MTAwICBWUjQzMDAgKi8KKwkJLyogNCA9IENvbnRleHQgICAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLworCQkvKiA1ID0gUGFnZU1hc2sgICAgICAgICAgICBSNDAwMCAgIFZSNDEwMCAgVlI0MzAwICovCisJCS8qIDYgPSBXaXJlZCAgICAgICAgICAgICAgIFI0MDAwICAgVlI0MTAwICBWUjQzMDAgKi8KKwkJLyogOCA9IEJhZFZBZGRyICAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLworCQkvKiA5ID0gQ291bnQgICAgICAgICAgICAgICBSNDAwMCAgIFZSNDEwMCAgVlI0MzAwICovCisJCS8qIDEwID0gRW50cnlIaSAgICAgICAgICAgIFI0MDAwICAgVlI0MTAwICBWUjQzMDAgKi8KKwkJLyogMTEgPSBDb21wYXJlICAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLworCQkvKiAxMiA9IFNSICAgICAgICAgICAgICAgICBSNDAwMCAgIFZSNDEwMCAgVlI0MzAwICovCisjaWZkZWYgU1VCVEFSR0VUX1IzOTAwCisJICAgICAgY2FzZSAzOgorCQkvKiAzID0gQ29uZmlnICAgICAgICAgICAgICBSMzkwMCAgICAgICAgICAgICAgICAgICovCisJICAgICAgY2FzZSA3OgorCQkvKiA3ID0gQ2FjaGUgICAgICAgICAgICAgICBSMzkwMCAgICAgICAgICAgICAgICAgICovCisJICAgICAgY2FzZSAxNToKKwkJLyogMTUgPSBQUklEICAgICAgICAgICAgICAgUjM5MDAgICAgICAgICAgICAgICAgICAqLworCisJCS8qIGlnbm9yZSAqLworCQlicmVhazsKKworCSAgICAgIGNhc2UgODoKKwkJLyogOCA9IEJhZFZBZGRyICAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLworCQlpZiAoY29kZSA9PSAweDAwKQorCQkgIEdQUltydF0gPSBDT1AwX0JBRFZBRERSOworCQllbHNlCisJCSAgQ09QMF9CQURWQUREUiA9IEdQUltydF07CisJCWJyZWFrOworCisjZW5kaWYgLyogU1VCVEFSR0VUX1IzOTAwICovCisJICAgICAgY2FzZSAxMjoKKwkJaWYgKGNvZGUgPT0gMHgwMCkKKwkJICBHUFJbcnRdID0gU1I7CisJCWVsc2UKKwkJICBTUiA9IEdQUltydF07CisJCWJyZWFrOworCQkvKiAxMyA9IENhdXNlICAgICAgICAgICAgICBSNDAwMCAgIFZSNDEwMCAgVlI0MzAwICovCisJICAgICAgY2FzZSAxMzoKKwkJaWYgKGNvZGUgPT0gMHgwMCkKKwkJICBHUFJbcnRdID0gQ0FVU0U7CisJCWVsc2UKKwkJICBDQVVTRSA9IEdQUltydF07CisJCWJyZWFrOworCQkvKiAxNCA9IEVQQyAgICAgICAgICAgICAgICBSNDAwMCAgIFZSNDEwMCAgVlI0MzAwICovCisJICAgICAgY2FzZSAxNDoKKwkJaWYgKGNvZGUgPT0gMHgwMCkKKwkJICBHUFJbcnRdID0gKHNpZ25lZF93b3JkKSAoc2lnbmVkX2FkZHJlc3MpIEVQQzsKKwkJZWxzZQorCQkgIEVQQyA9IEdQUltydF07CisJCWJyZWFrOworCQkvKiAxNSA9IFBSSWQgICAgICAgICAgICAgICBSNDAwMCAgIFZSNDEwMCAgVlI0MzAwICovCisjaWZkZWYgU1VCVEFSR0VUX1IzOTAwCisgICAgICAgICAgICAgICAgLyogMTYgPSBEZWJ1ZyAqLworICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDB4MDApCisgICAgICAgICAgICAgICAgICBHUFJbcnRdID0gRGVidWc7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgRGVidWcgPSBHUFJbcnRdOworICAgICAgICAgICAgICAgIGJyZWFrOworI2Vsc2UKKwkJLyogMTYgPSBDb25maWcgICAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLworICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDB4MDApCisgICAgICAgICAgICAgICAgICBHUFJbcnRdID0gQzBfQ09ORklHOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIEMwX0NPTkZJRyA9IEdQUltydF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBTVUJUQVJHRVRfUjM5MDAKKyAgICAgICAgICAgICAgICAvKiAxNyA9IERlYnVnICovCisgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMHgwMCkKKyAgICAgICAgICAgICAgICAgIEdQUltydF0gPSBERVBDOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIERFUEMgPSBHUFJbcnRdOworICAgICAgICAgICAgICAgIGJyZWFrOworI2Vsc2UKKwkJLyogMTcgPSBMTEFkZHIgICAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLworI2VuZGlmCisJCS8qIDE4ID0gV2F0Y2hMbyAgICAgICAgICAgIFI0MDAwICAgVlI0MTAwICBWUjQzMDAgKi8KKwkJLyogMTkgPSBXYXRjaEhpICAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLworCQkvKiAyMCA9IFhDb250ZXh0ICAgICAgICAgICBSNDAwMCAgIFZSNDEwMCAgVlI0MzAwICovCisJCS8qIDI2ID0gUEVyciBvciBFQ0MgICAgICAgIFI0MDAwICAgVlI0MTAwICBWUjQzMDAgKi8KKwkJLyogMjcgPSBDYWNoZUVyciAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgKi8KKwkJLyogMjggPSBUYWdMbyAgICAgICAgICAgICAgUjQwMDAgICBWUjQxMDAgIFZSNDMwMCAqLworCQkvKiAyOSA9IFRhZ0hpICAgICAgICAgICAgICBSNDAwMCAgIFZSNDEwMCAgVlI0MzAwICovCisJCS8qIDMwID0gRXJyb3JFUEMgICAgICAgICAgIFI0MDAwICAgVlI0MTAwICBWUjQzMDAgKi8KKwkJR1BSW3J0XSA9IDB4REVBREMwREU7IC8qIENQUlswLHJkXSAqLworCQkvKiBDUFJbMCxyZF0gPSBHUFJbcnRdOyAqLworCSAgICAgIGRlZmF1bHQ6CisJCWlmIChjb2RlID09IDB4MDApCisJCSAgR1BSW3J0XSA9IChzaWduZWRfd29yZCkgKHNpZ25lZDMyKSBDT1AwX0dQUltyZF07CisJCWVsc2UKKwkJICBDT1AwX0dQUltyZF0gPSBHUFJbcnRdOworI2lmIDAKKwkJaWYgKGNvZGUgPT0gMHgwMCkKKwkJICBzaW1faW9fcHJpbnRmKHNkLCJXYXJuaW5nOiBNRkMwICVkLCVkIGlnbm9yZWQsIFBDPSUwOHggKGFyY2hpdGVjdHVyZSBzcGVjaWZpYylcbiIscnQscmQsICh1bnNpZ25lZCljaWEpOworCQllbHNlCisJCSAgc2ltX2lvX3ByaW50ZihzZCwiV2FybmluZzogTVRDMCAlZCwlZCBpZ25vcmVkLCBQQz0lMDh4IChhcmNoaXRlY3R1cmUgc3BlY2lmaWMpXG4iLHJ0LHJkLCAodW5zaWduZWQpY2lhKTsKKyNlbmRpZgorCSAgICAgIH0KKwkgIH0KKwllbHNlIGlmIChjb2RlID09IDB4MTAgJiYgKHRhaWwgJiAweDNmKSA9PSAweDE4KQorCSAgeworCSAgICAvKiBFUkVUICovCisJICAgIGlmIChTUiAmIHN0YXR1c19FUkwpCisJICAgICAgeworCQkvKiBPb3BzLCBub3QgeWV0IGF2YWlsYWJsZSAqLworCQlzaW1faW9fcHJpbnRmKHNkLCJXYXJuaW5nOiBFUkVUIHdoZW4gU1JbRVJMXSBzZXQgbm90IGhhbmRsZWQgeWV0Iik7CisJCVBDID0gRVBDOworCQlTUiAmPSB+c3RhdHVzX0VSTDsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCVBDID0gRVBDOworCQlTUiAmPSB+c3RhdHVzX0VYTDsKKwkgICAgICB9CisJICB9CisgICAgICAgIGVsc2UgaWYgKGNvZGUgPT0gMHgxMCAmJiAodGFpbCAmIDB4M2YpID09IDB4MTApCisgICAgICAgICAgeworICAgICAgICAgICAgLyogUkZFICovCisjaWZkZWYgU1VCVEFSR0VUX1IzOTAwCisJICAgIC8qIFRYMzk6IENvcHkgSUVwL0tVcCAtPiBJRWMvS1VjLCBhbmQgSUVvL0tVbyAtPiBJRXAvS1VwICovCisKKwkgICAgLyogc2hpZnQgSUUvS1UgaGlzdG9yeSBiaXRzIHJpZ2h0ICovCisJICAgIFNSID0gTFNNQVNLRUQzMihTUiwgMzEsIDQpIHwgTFNJTlNFUlRFRDMyKExTRVhUUkFDVEVEMzIoU1IsIDUsIDIpLCAzLCAwKTsKKworCSAgICAvKiBUT0RPOiBDQUNIRSByZWdpc3RlciAqLworI2VuZGlmIC8qIFNVQlRBUkdFVF9SMzkwMCAqLworICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY29kZSA9PSAweDEwICYmICh0YWlsICYgMHgzZikgPT0gMHgxRikKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBERVJFVCAqLworICAgICAgICAgICAgRGVidWcgJj0gfkRlYnVnX0RNOworICAgICAgICAgICAgREVMQVlTTE9UKCk7CisgICAgICAgICAgICBEU1BDID0gREVQQzsKKyAgICAgICAgICB9CisJZWxzZQorCSAgc2ltX2lvX2VwcmludGYoc2QsIlVucmVjb2duaXNlZCBDT1AwIGluc3RydWN0aW9uIDB4JTA4WCBhdCBQQyA9IDB4JXMgOiBObyBoYW5kbGVyIHByZXNlbnRcbiIsaW5zdHJ1Y3Rpb24scHJfYWRkcihjaWEpKTsKKyAgICAgICAgLyogVE9ETzogV2hlbiBleGVjdXRpbmcgYW4gRVJFVCBvciBSRkUgaW5zdHJ1Y3Rpb24gd2Ugc2hvdWxkCisgICAgICAgICAgIGNsZWFyIExMQklULCB0byBlbnN1cmUgdGhhdCBhbnkgb3V0LXN0YW5kaW5nIGF0b21pYworICAgICAgICAgICByZWFkL21vZGlmeS93cml0ZSBzZXF1ZW5jZSBmYWlscy4gKi8KKyAgICAgIH0KKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIDI6IC8qIGNvLXByb2Nlc3NvciAyICovCisgICAgICB7CisJaW50IGhhbmRsZSA9IDA7CisKKworCWlmKCEgaGFuZGxlKQorCSAgeworCSAgICBzaW1faW9fZXByaW50ZihzZCwgIkNPUDIgaW5zdHJ1Y3Rpb24gMHglMDhYIGF0IFBDID0gMHglcyA6IE5vIGhhbmRsZXIgcHJlc2VudFxuIiwKKwkJCSAgIGluc3RydWN0aW9uLHByX2FkZHIoY2lhKSk7CisJICB9CisgICAgICB9CisgICAgYnJlYWs7CisgICAgCisgICAgY2FzZSAxOiAvKiBzaG91bGQgbm90IG9jY3VyIChGUFUgY28tcHJvY2Vzc29yKSAqLworICAgIGNhc2UgMzogLyogc2hvdWxkIG5vdCBvY2N1ciAoRlBVIGNvLXByb2Nlc3NvcikgKi8KKyAgICAgIFNpZ25hbEV4Y2VwdGlvbihSZXNlcnZlZEluc3RydWN0aW9uLGluc3RydWN0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgCisgIHJldHVybjsKK30KKworCisvKiBUaGlzIGNvZGUgY29waWVkIGZyb20gZ2RiJ3MgdXRpbHMuYy4gIFdvdWxkIGxpa2UgdG8gc2hhcmUgdGhpcyBjb2RlLAorICAgYnV0IGRvbid0IGtub3cgb2YgYSBjb21tb24gcGxhY2Ugd2hlcmUgYm90aCBjb3VsZCBnZXQgdG8gaXQuICovCisKKy8qIFRlbXBvcmFyeSBzdG9yYWdlIHVzaW5nIGNpcmN1bGFyIGJ1ZmZlciAqLworI2RlZmluZSBOVU1DRUxMUyAxNgorI2RlZmluZSBDRUxMU0laRSAzMgorc3RhdGljIGNoYXIqCitnZXRfY2VsbCAodm9pZCkKK3sKKyAgc3RhdGljIGNoYXIgYnVmW05VTUNFTExTXVtDRUxMU0laRV07CisgIHN0YXRpYyBpbnQgY2VsbD0wOworICBpZiAoKytjZWxsPj1OVU1DRUxMUykgY2VsbD0wOworICByZXR1cm4gYnVmW2NlbGxdOworfSAgICAgCisKKy8qIFByaW50IHJvdXRpbmVzIHRvIGhhbmRsZSB2YXJpYWJsZSBzaXplIHJlZ3MsIGV0YyAqLworCisvKiBFbGltaW5hdGUgd2FybmluZyBmcm9tIGNvbXBpbGVyIG9uIDMyLWJpdCBzeXN0ZW1zICovCitzdGF0aWMgaW50IHRoaXJ0eV90d28gPSAzMjsJCisKK2NoYXIqIAorcHJfYWRkcihhZGRyKQorICBTSU1fQUREUiBhZGRyOworeworICBjaGFyICpwYWRkcl9zdHI9Z2V0X2NlbGwoKTsKKyAgc3dpdGNoIChzaXplb2YoYWRkcikpCisgICAgeworICAgICAgY2FzZSA4OgorICAgICAgICBzcHJpbnRmKHBhZGRyX3N0ciwiJTA4bHglMDhseCIsCisJCSh1bnNpZ25lZCBsb25nKShhZGRyPj50aGlydHlfdHdvKSwodW5zaWduZWQgbG9uZykoYWRkciYweGZmZmZmZmZmKSk7CisJYnJlYWs7CisgICAgICBjYXNlIDQ6CisgICAgICAgIHNwcmludGYocGFkZHJfc3RyLCIlMDhseCIsKHVuc2lnbmVkIGxvbmcpYWRkcik7CisJYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIHNwcmludGYocGFkZHJfc3RyLCIlMDR4IiwodW5zaWduZWQgc2hvcnQpKGFkZHImMHhmZmZmKSk7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBzcHJpbnRmKHBhZGRyX3N0ciwiJXgiLGFkZHIpOworICAgIH0KKyAgcmV0dXJuIHBhZGRyX3N0cjsKK30KKworY2hhciogCitwcl91d29yZDY0KGFkZHIpCisgIHV3b3JkNjQgYWRkcjsKK3sKKyAgY2hhciAqcGFkZHJfc3RyPWdldF9jZWxsKCk7CisgIHNwcmludGYocGFkZHJfc3RyLCIlMDhseCUwOGx4IiwKKyAgICAgICAgICAodW5zaWduZWQgbG9uZykoYWRkcj4+dGhpcnR5X3R3byksKHVuc2lnbmVkIGxvbmcpKGFkZHImMHhmZmZmZmZmZikpOworICByZXR1cm4gcGFkZHJfc3RyOworfQorCisKK3ZvaWQKK21pcHNfY29yZV9zaWduYWwgKFNJTV9ERVNDIHNkLAorICAgICAgICAgICAgICAgICBzaW1fY3B1ICpjcHUsCisgICAgICAgICAgICAgICAgIHNpbV9jaWEgY2lhLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtYXAsCisgICAgICAgICAgICAgICAgIGludCBucl9ieXRlcywKKyAgICAgICAgICAgICAgICAgYWRkcmVzc193b3JkIGFkZHIsCisgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXIsCisgICAgICAgICAgICAgICAgIHNpbV9jb3JlX3NpZ25hbHMgc2lnKQoreworICBjb25zdCBjaGFyICpjb3B5ID0gKHRyYW5zZmVyID09IHJlYWRfdHJhbnNmZXIgPyAicmVhZCIgOiAid3JpdGUiKTsKKyAgYWRkcmVzc193b3JkIGlwID0gQ0lBX0FERFIgKGNpYSk7CisKKyAgc3dpdGNoIChzaWcpCisgICAgeworICAgIGNhc2Ugc2ltX2NvcmVfdW5tYXBwZWRfc2lnbmFsOgorICAgICAgc2ltX2lvX2VwcmludGYgKHNkLCAibWlwcy1jb3JlOiAlZCBieXRlICVzIHRvIHVubWFwcGVkIGFkZHJlc3MgMHglbHggYXQgMHglbHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbnJfYnl0ZXMsIGNvcHksIAorCQkgICAgICAodW5zaWduZWQgbG9uZykgYWRkciwgKHVuc2lnbmVkIGxvbmcpIGlwKTsKKyAgICAgIENPUDBfQkFEVkFERFIgPSBhZGRyOworICAgICAgU2lnbmFsRXhjZXB0aW9uRGF0YVJlZmVyZW5jZSgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHNpbV9jb3JlX3VuYWxpZ25lZF9zaWduYWw6CisgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJtaXBzLWNvcmU6ICVkIGJ5dGUgJXMgdG8gdW5hbGlnbmVkIGFkZHJlc3MgMHglbHggYXQgMHglbHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbnJfYnl0ZXMsIGNvcHksIAorCQkgICAgICAodW5zaWduZWQgbG9uZykgYWRkciwgKHVuc2lnbmVkIGxvbmcpIGlwKTsKKyAgICAgIENPUDBfQkFEVkFERFIgPSBhZGRyOworICAgICAgaWYodHJhbnNmZXIgPT0gcmVhZF90cmFuc2ZlcikgCisJU2lnbmFsRXhjZXB0aW9uQWRkcmVzc0xvYWQoKTsKKyAgICAgIGVsc2UKKwlTaWduYWxFeGNlcHRpb25BZGRyZXNzU3RvcmUoKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHNpbV9lbmdpbmVfYWJvcnQgKHNkLCBjcHUsIGNpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtaXBzX2NvcmVfc2lnbmFsIC0gaW50ZXJuYWwgZXJyb3IgLSBiYWQgc3dpdGNoIik7CisgICAgfQorfQorCisKK3ZvaWQKK21pcHNfY3B1X2V4Y2VwdGlvbl90cmlnZ2VyKFNJTV9ERVNDIHNkLCBzaW1fY3B1KiBjcHUsIGFkZHJlc3Nfd29yZCBjaWEpCit7CisgIEFTU0VSVChjcHUgIT0gTlVMTCk7CisKKyAgaWYoY3B1LT5leGNfc3VzcGVuZGVkID4gMCkKKyAgICBzaW1faW9fZXByaW50ZihzZCwgIldhcm5pbmcsIG5lc3RlZCBleGNlcHRpb24gdHJpZ2dlcmVkICglZClcbiIsIGNwdS0+ZXhjX3N1c3BlbmRlZCk7IAorCisgIFBDID0gY2lhOworICBtZW1jcHkoY3B1LT5leGNfdHJpZ2dlcl9yZWdpc3RlcnMsIGNwdS0+cmVnaXN0ZXJzLCBzaXplb2YoY3B1LT5leGNfdHJpZ2dlcl9yZWdpc3RlcnMpKTsKKyAgY3B1LT5leGNfc3VzcGVuZGVkID0gMDsKK30KKwordm9pZAorbWlwc19jcHVfZXhjZXB0aW9uX3N1c3BlbmQoU0lNX0RFU0Mgc2QsIHNpbV9jcHUqIGNwdSwgaW50IGV4Y2VwdGlvbikKK3sKKyAgQVNTRVJUKGNwdSAhPSBOVUxMKTsKKworICBpZihjcHUtPmV4Y19zdXNwZW5kZWQgPiAwKQorICAgIHNpbV9pb19lcHJpbnRmKHNkLCAiV2FybmluZywgbmVzdGVkIGV4Y2VwdGlvbiBzaWduYWwgKCVkIHRoZW4gJWQpXG4iLCAKKwkJICAgY3B1LT5leGNfc3VzcGVuZGVkLCBleGNlcHRpb24pOyAKKworICBtZW1jcHkoY3B1LT5leGNfc3VzcGVuZF9yZWdpc3RlcnMsIGNwdS0+cmVnaXN0ZXJzLCBzaXplb2YoY3B1LT5leGNfc3VzcGVuZF9yZWdpc3RlcnMpKTsKKyAgbWVtY3B5KGNwdS0+cmVnaXN0ZXJzLCBjcHUtPmV4Y190cmlnZ2VyX3JlZ2lzdGVycywgc2l6ZW9mKGNwdS0+cmVnaXN0ZXJzKSk7CisgIGNwdS0+ZXhjX3N1c3BlbmRlZCA9IGV4Y2VwdGlvbjsKK30KKwordm9pZAorbWlwc19jcHVfZXhjZXB0aW9uX3Jlc3VtZShTSU1fREVTQyBzZCwgc2ltX2NwdSogY3B1LCBpbnQgZXhjZXB0aW9uKQoreworICBBU1NFUlQoY3B1ICE9IE5VTEwpOworCisgIGlmKGV4Y2VwdGlvbiA9PSAwICYmIGNwdS0+ZXhjX3N1c3BlbmRlZCA+IDApCisgICAgeworICAgICAgLyogd2FybiBub3QgZm9yIGJyZWFrcG9pbnRzICovCisgICAgICBpZihjcHUtPmV4Y19zdXNwZW5kZWQgIT0gc2ltX3NpZ25hbF90b19ob3N0KHNkLCBTSU1fU0lHVFJBUCkpCisJc2ltX2lvX2VwcmludGYoc2QsICJXYXJuaW5nLCByZXN1bWluZyBidXQgaWdub3JpbmcgcGVuZGluZyBleGNlcHRpb24gc2lnbmFsICglZClcbiIsCisJCSAgICAgICBjcHUtPmV4Y19zdXNwZW5kZWQpOyAKKyAgICB9CisgIGVsc2UgaWYoZXhjZXB0aW9uICE9IDAgJiYgY3B1LT5leGNfc3VzcGVuZGVkID4gMCkKKyAgICB7CisgICAgICBpZihleGNlcHRpb24gIT0gY3B1LT5leGNfc3VzcGVuZGVkKSAKKwlzaW1faW9fZXByaW50ZihzZCwgIldhcm5pbmcsIHJlc3VtaW5nIHdpdGggbWlzbWF0Y2hlZCBleGNlcHRpb24gc2lnbmFsICglZCB2cyAlZClcbiIsCisJCSAgICAgICBjcHUtPmV4Y19zdXNwZW5kZWQsIGV4Y2VwdGlvbik7IAorICAgICAgCisgICAgICBtZW1jcHkoY3B1LT5yZWdpc3RlcnMsIGNwdS0+ZXhjX3N1c3BlbmRfcmVnaXN0ZXJzLCBzaXplb2YoY3B1LT5yZWdpc3RlcnMpKTsgCisgICAgfQorICBlbHNlIGlmKGV4Y2VwdGlvbiAhPSAwICYmIGNwdS0+ZXhjX3N1c3BlbmRlZCA9PSAwKQorICAgIHsKKyAgICAgIHNpbV9pb19lcHJpbnRmKHNkLCAiV2FybmluZywgaWdub3Jpbmcgc3BvbnRhbm91cyBleGNlcHRpb24gc2lnbmFsICglZClcbiIsIGV4Y2VwdGlvbik7IAorICAgIH0KKyAgY3B1LT5leGNfc3VzcGVuZGVkID0gMDsgCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyo+IEVPRiBpbnRlcnAuYyA8Ki8KZGlmZiAtLWdpdCBhL3NpbS9taXBzL20xNi5kYyBiL3NpbS9taXBzL20xNi5kYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTI1ODdjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL21pcHMvbTE2LmRjCkBAIC0wLDAgKzEsMjUgQEAKKyMgbW9zdCBpbnN0cnVjdGlvbnMKKyMgLS0tLS0tIG9wdGlvbnMgLS0tLS0tIDogRnN0IDogTHN0IDogZmYgOiBmbCA6IGZlIDogd29yZCA6IC0tLSBmbXQgLS0tIDogbW9kZWwgLi4uCisjIHsgOiBtYXNrIDogdmFsdWUgOiB3b3JkIH0KKworIyBUb3AgbGV2ZWwgLSBjcmVhdGUgYSB2ZXJ5IGJpZyBzd2l0Y2ggc3RhdGVtZW50LgorCisgIHBhZGRlZC1zd2l0Y2gsY29tYmluZSA6ICAxNSA6ICAxMSA6ICAgIDogICAgOiAgICA6ICAgICAgOiAgICAgICAgICAgICA6CisKKyAgc3dpdGNoLGNvbWJpbmUgICAgICAgIDogIDEwIDogICA4IDogICAgOiAgICA6ICAgIDogICAgICA6ICAgICAgICAgICAgIDoKKworICBzd2l0Y2gsY29tYmluZSAgICAgICAgOiAgIDQgOiAgIDAgOiAgICA6ICAgIDogICAgOiAgICAgIDogICAgICAgICAgICAgOgorCisgIHN3aXRjaCxjb21iaW5lICAgICAgICA6ICAgNyA6ICAgNSA6ICAgIDogICAgOiAgICA6ICAgICAgOiAgICAgICAgICAgICA6CisKKworIyBFeHRlbmRlZCBpbnN0cnVjdGlvbnMsIGRlY29kZSB0aGUgc2FtZSB3YXkKKworICBwYWRkZWQtc3dpdGNoLGNvbWJpbmUgOiAgMTUgOiAgMTEgOiAgICA6ICAgIDogICAgOiAgICAxIDogICAgICAgICAgICAgOgorCisgIHN3aXRjaCxjb21iaW5lICAgICAgICA6ICAxMCA6ICAgOCA6ICAgIDogICAgOiAgICA6ICAgIDEgOiAgICAgICAgICAgICA6CisKKyAgc3dpdGNoLGNvbWJpbmUgICAgICAgIDogICA0IDogICAwIDogICAgOiAgICA6ICAgIDogICAgMSA6ICAgICAgICAgICAgIDoKKworICBzd2l0Y2gsY29tYmluZSAgICAgICAgOiAgIDcgOiAgIDUgOiAgICA6ICAgIDogICAgOiAgICAxIDogICAgICAgICAgICAgOgorCmRpZmYgLS1naXQgYS9zaW0vbWlwcy9tMTYuaWdlbiBiL3NpbS9taXBzL20xNi5pZ2VuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMzZmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbWlwcy9tMTYuaWdlbgpAQCAtMCwwICsxLDEyMzYgQEAKKy8vIC0qLSBDIC0qLQorLy8KKy8vCisvLyBNSVBTIEFyY2hpdGVjdHVyZToKKy8vCisvLyAgICAgICAgQ1BVIEluc3RydWN0aW9uIFNldCAobWlwczE2KQorLy8KKworLy8gVGhlIGluc3RydWN0aW9ucyBpbiB0aGlzIHNlY3Rpb24gYXJlIG9yZGVyZWQgYWNjb3JkaW5nCisvLyB0byBodHRwOi8vd3d3LnNnaS5jb20vTUlQUy9hcmNoL01JUFMxNi9taXBzMTYucGRmLgorCisKKy8vIFRoZSBNSVBTMTYgY29kZXMgcmVnaXN0ZXJzIGluIGEgc3BlY2lhbCB3YXksIG1hcCBmcm9tIG9uZSB0byB0aGUgb3RoZXIuCisvLyA6PHR5cGU+OjxmbGFncz46PG1vZGVscz46PHR5cGVkZWY+OjxuYW1lPjo8ZmllbGQ+OjxleHByZXNzaW9uPgorOmNvbXB1dGU6OjppbnQ6VFJYOlJYOigoUlggPCAyKSA/ICgxNiArIFJYKSBcOiBSWCkKKzpjb21wdXRlOjo6aW50OlRSWTpSWTooKFJZIDwgMikgPyAoMTYgKyBSWSkgXDogUlkpCis6Y29tcHV0ZTo6OmludDpUUlo6Ulo6KChSWiA8IDIpID8gKDE2ICsgUlopIFw6IFJaKQorOmNvbXB1dGU6OjppbnQ6U0hJRlQ6U0hBTVQ6KChTSEFNVCA9PSAwKSA/IDggXDogU0hBTVQpCisKKzpjb21wdXRlOjo6aW50OlNIQU1UOlNIQU1UXzRfMCxTNTooTFNJTlNFUlRFRCAoUzUsIDUsIDUpIHwgU0hBTVRfNF8wKQorCis6Y29tcHV0ZTo6OmFkZHJlc3Nfd29yZDpJTU1FRElBVEU6SU1NXzI1XzIxLElNTV8yMF8xNixJTU1FRF8xNV8wOihMU0lOU0VSVEVEIChJTU1fMjVfMjEsIDI1LCAyMSkgfCBMU0lOU0VSVEVEIChJTU1fMjBfMTYsIDIwLCAxNikgfCBMU0lOU0VSVEVEIChJTU1FRF8xNV8wLCAxNSwgMCkpCis6Y29tcHV0ZTo6OmludDpSMzI6UjMyTCxSMzJIOigoUjMySCA8PCAzKSB8IFIzMkwpCisKKzpjb21wdXRlOjo6YWRkcmVzc193b3JkOklNTUVESUFURTpJTU1fMTBfNSxJTU1fMTVfMTEsSU1NXzRfMDooTFNJTlNFUlRFRCAoSU1NXzEwXzUsIDEwLCA1KSB8IExTSU5TRVJURUQgKElNTV8xNV8xMSwgMTUsIDExKSB8IExTSU5TRVJURUQgKElNTV80XzAsIDQsIDApKQorCis6Y29tcHV0ZTo6OmFkZHJlc3Nfd29yZDpJTU1FRElBVEU6SU1NXzEwXzQsSU1NXzE0XzExLElNTV8zXzA6KExTSU5TRVJURUQgKElNTV8xMF80LCAxMCwgNCkgfCBMU0lOU0VSVEVEIChJTU1fMTRfMTEsIDE0LCAxMSkgfCBMU0lOU0VSVEVEIChJTU1fM18wLCAzLCAwKSkKKworCisvLyBMb2FkIGFuZCBTdG9yZSBJbnN0cnVjdGlvbnMKKworCisxMDAwMCwzLlJYLDMuUlksNS5JTU1FRDpSUkk6MTY6OkxCCisibGIgcjxUUlk+LCA8SU1NRUQ+IChyPFRSWD4pIgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIEdQUltUUlldID0gRVhURU5EOCAoZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfQllURSwgR1BSW1RSWF0sIElNTUVEKSk7Cit9CisKKzExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAxMDAwMCwzLlJYLDMuUlksNS5JTU1fNF8wOkVYVC1SUkk6MTY6OkxCCisibGIgcjxUUlk+LCA8SU1NRURJQVRFPiAocjxUUlg+KSIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBHUFJbVFJZXSA9IEVYVEVORDggKGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX0JZVEUsIEdQUltUUlhdLCBFWFRFTkQxNiAoSU1NRURJQVRFKSkpOworfQorCisKKworMTAxMDAsMy5SWCwzLlJZLDUuSU1NRUQ6UlJJOjE2OjpMQlUKKyJsYnUgcjxUUlk+LCA8SU1NRUQ+IChyPFRSWD4pIgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIEdQUltUUlldID0gZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfQllURSwgR1BSW1RSWF0sIElNTUVEKTsKK30KKworMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDEwMTAwLDMuUlgsMy5SWSw1LklNTV80XzA6RVhULVJSSToxNjo6TEJVCisibGJ1IHI8VFJZPiwgPElNTUVESUFURT4gKHI8VFJYPikiCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgR1BSW1RSWV0gPSBkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9CWVRFLCBHUFJbVFJYXSwgRVhURU5EMTYgKElNTUVESUFURSkpOworfQorCisKKworMTAwMDEsMy5SWCwzLlJZLDUuSU1NRUQ6UlJJOjE2OjpMSAorImxoIHI8VFJZPiwgPElNTUVEPiAocjxUUlg+KSIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBHUFJbVFJZXSA9IEVYVEVORDE2IChkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9IQUxGV09SRCwgR1BSW1RSWF0sIElNTUVEIDw8IDEpKTsKK30KKworMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDEwMDAxLDMuUlgsMy5SWSw1LklNTV80XzA6RVhULVJSSToxNjo6TEgKKyJsaCByPFRSWT4sIDxJTU1FRElBVEU+IChyPFRSWD4pIgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIEdQUltUUlldID0gRVhURU5EMTYgKGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX0hBTEZXT1JELCBHUFJbVFJYXSwgRVhURU5EMTYgKElNTUVESUFURSkpKTsKK30KKworCisKKzEwMTAxLDMuUlgsMy5SWSw1LklNTUVEOlJSSToxNjo6TEhVCisibGh1IHI8VFJZPiwgPElNTUVEPiAocjxUUlg+KSIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBHUFJbVFJZXSA9IGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX0hBTEZXT1JELCBHUFJbVFJYXSwgSU1NRUQgPDwgMSk7Cit9CisKKzExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAxMDEwMSwzLlJYLDMuUlksNS5JTU1fNF8wOkVYVC1SUkk6MTY6OkxIVQorImxodSByPFRSWT4sIDxJTU1FRElBVEU+IChyPFRSWD4pIgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIEdQUltUUlldID0gZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfSEFMRldPUkQsIEdQUltUUlhdLCBFWFRFTkQxNiAoSU1NRURJQVRFKSk7Cit9CisKKworCisxMDAxMSwzLlJYLDMuUlksNS5JTU1FRDpSUkk6MTY6OkxXCisibHcgcjxUUlk+LCA8SU1NRUQ+IChyPFRSWD4pIgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIEdQUltUUlldID0gRVhURU5EMzIgKGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX1dPUkQsIEdQUltUUlhdLCBJTU1FRCA8PCAyKSk7Cit9CisKKzExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAxMDAxMSwzLlJYLDMuUlksNS5JTU1fNF8wOkVYVC1SUkk6MTY6OkxXCisibHcgcjxUUlk+LCA8SU1NRURJQVRFPiAocjxUUlg+KSIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBHUFJbVFJZXSA9IEVYVEVORDMyIChkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBHUFJbVFJYXSwgRVhURU5EMTYgKElNTUVESUFURSkpKTsKK30KKworCisKKzEwMTEwLDMuUlgsOC5JTU1FRDpSSToxNjo6TFdQQworImx3IHI8VFJYPiwgPElNTUVEPiAoUEMpIgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIEdQUltUUlhdID0gRVhURU5EMzIgKGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX1dPUkQsCisJCQkJYmFzZXBjIChTRF8pICYgfjMsIElNTUVEIDw8IDIpKTsKK30KKworMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDEwMTEwLDMuUlgsMDAwLDUuSU1NXzRfMDpFWFQtUkk6MTY6OkxXUEMKKyJsdyByPFRSWD4sIDxJTU1FRElBVEU+IChQQykiCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgR1BSW1RSWF0gPSBFWFRFTkQzMiAoZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfV09SRCwgYmFzZXBjIChTRF8pICYgfjMsIEVYVEVORDE2IChJTU1FRElBVEUpKSk7Cit9CisKKworCisxMDAxMCwzLlJYLDguSU1NRUQ6Ukk6MTY6OkxXU1AKKyJsdyByPFRSWD4sIDxJTU1FRD4gKFNQKSIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBHUFJbVFJYXSA9IEVYVEVORDMyIChkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBTUCwgSU1NRUQgPDwgMikpOworfQorCisxMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMTAwMTAsMy5SWCwwMDAsNS5JTU1fNF8wOkVYVC1SSToxNjo6TFdTUAorImx3IHI8VFJYPiwgPElNTUVESUFURT4gKFNQKSIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBHUFJbVFJYXSA9IEVYVEVORDMyIChkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBTUCwgRVhURU5EMTYgKElNTUVESUFURSkpKTsKK30KKworCisKKzEwMTExLDMuUlgsMy5SWSw1LklNTUVEOlJSSToxNjo6TFdVCisibHd1IHI8VFJZPiwgPElNTUVEPiAocjxUUlg+KSIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBHUFJbVFJZXSA9IGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX1dPUkQsIEdQUltUUlhdLCBJTU1FRCA8PCAyKTsKK30KKworMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDEwMTExLDMuUlgsMy5SWSw1LklNTV80XzA6RVhULVJSSToxNjo6TFdVCisibHd1IHI8VFJZPiwgPElNTUVESUFURT4gKHI8VFJYPikiCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgR1BSW1RSWV0gPSBkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBHUFJbVFJYXSwgRVhURU5EMTYgKElNTUVESUFURSkpOworfQorCisKKworMDAxMTEsMy5SWCwzLlJZLDUuSU1NRUQ6UlJJOjE2OjpMRAorImxkIHI8VFJZPiwgPElNTUVEPiAocjxUUlg+KSIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBHUFJbVFJZXSA9IGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX0RPVUJMRVdPUkQsIEdQUltUUlhdLCBJTU1FRCA8PCAzKTsKK30KKworMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDAwMTExLDMuUlgsMy5SWSw1LklNTV80XzA6RVhULVJSSToxNjo6TEQKKyJsZCByPFRSWT4sIDxJTU1FRElBVEU+IChyPFRSWD4pIgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIEdQUltUUlldID0gZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgR1BSW1RSWF0sIEVYVEVORDE2IChJTU1FRElBVEUpKTsKK30KKworCisKKzExMTExLDEwMCwzLlJZLDUuSU1NRUQ6Ukk2NDoxNjo6TERQQworImxkIHI8VFJZPiwgPElNTUVEPiAoUEMpIgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIEdQUltUUlldID0gZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwKKwkJICAgICAgYmFzZXBjIChTRF8pICYgfjcsIElNTUVEIDw8IDMpOworfQorCisxMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMTExMTEsMTAwLDMuUlksNS5JTU1fNF8wOkVYVC1SSTY0OjE2OjpMRFBDCisibGQgcjxUUlk+LCA8SU1NRURJQVRFPiAoUEMpIgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIEdQUltUUlldID0gZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgYmFzZXBjIChTRF8pICYgfjcsIEVYVEVORDE2IChJTU1FRElBVEUpKTsKK30KKworCisKKzExMTExLDAwMCwzLlJZLDUuSU1NRUQ6Ukk2NDoxNjo6TERTUAorImxkIHI8VFJZPiwgPElNTUVEPiAoU1ApIgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIEdQUltUUlldID0gZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgU1AsIElNTUVEIDw8IDMpOworfQorCisxMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMTExMTEsMDAwLDMuUlksNS5JTU1fNF8wOkVYVC1SSTY0OjE2OjpMRFNQCisibGQgcjxUUlk+LCA8SU1NRURJQVRFPiAoU1ApIgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIEdQUltUUlldID0gZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgU1AsIEVYVEVORDE2IChJTU1FRElBVEUpKTsKK30KKworCisKKzExMDAwLDMuUlgsMy5SWSw1LklNTUVEOlJSSToxNjo6U0IKKyJzYiByPFRSWT4sIDxJTU1FRD4gKHI8VFJYPikiCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fc3RvcmUgKFNEXywgQWNjZXNzTGVuZ3RoX0JZVEUsIEdQUltUUlhdLCBJTU1FRCwgR1BSW1RSWV0pOworfQorCisxMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMTEwMDAsMy5SWCwzLlJZLDUuSU1NXzRfMDpFWFQtUlJJOjE2OjpTQgorInNiIHI8VFJZPiwgPElNTUVESUFURT4gKHI8VFJYPikiCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fc3RvcmUgKFNEXywgQWNjZXNzTGVuZ3RoX0JZVEUsIEdQUltUUlhdLCBFWFRFTkQxNiAoSU1NRURJQVRFKSwgR1BSW1RSWV0pOworfQorCisKKworMTEwMDEsMy5SWCwzLlJZLDUuSU1NRUQ6UlJJOjE2OjpTSAorInNoIHI8VFJZPiwgPElNTUVEPiAocjxUUlg+KSIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19zdG9yZSAoU0RfLCBBY2Nlc3NMZW5ndGhfSEFMRldPUkQsIEdQUltUUlhdLCBJTU1FRCA8PCAxLCBHUFJbVFJZXSk7Cit9CisKKzExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAxMTAwMSwzLlJYLDMuUlksNS5JTU1fNF8wOkVYVC1SUkk6MTY6OlNICisic2ggcjxUUlk+LCA8SU1NRURJQVRFPiAocjxUUlg+KSIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19zdG9yZSAoU0RfLCBBY2Nlc3NMZW5ndGhfSEFMRldPUkQsIEdQUltUUlhdLCBFWFRFTkQxNiAoSU1NRURJQVRFKSwgR1BSW1RSWV0pOworfQorCisKKworMTEwMTEsMy5SWCwzLlJZLDUuSU1NRUQ6UlJJOjE2OjpTVworInN3IHI8VFJZPiwgPElNTUVEPiAocjxUUlg+KSIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19zdG9yZSAoU0RfLCBBY2Nlc3NMZW5ndGhfV09SRCwgR1BSW1RSWF0sIElNTUVEIDw8IDIsIEdQUltUUlldKTsKK30KKworMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDExMDExLDMuUlgsMy5SWSw1LklNTV80XzA6RVhULVJSSToxNjo6U1cKKyJzdyByPFRSWT4sIDxJTU1FRElBVEU+IChyPFRSWD4pIgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBHUFJbVFJYXSwgRVhURU5EMTYgKElNTUVESUFURSksIEdQUltUUlldKTsKK30KKworCisKKzExMDEwLDMuUlgsOC5JTU1FRDpSSToxNjo6U1dTUAorInN3IHI8VFJYPiwgPElNTUVEPiAoU1ApIgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBTUCwgSU1NRUQgPDwgMiwgR1BSW1RSWF0pOworfQorCisxMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMTEwMTAsMy5SWCwwMDAsNS5JTU1fNF8wOkVYVC1SSToxNjo6U1dTUAorInN3IHI8VFJYPiwgPElNTUVESUFURT4gKFNQKSIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19zdG9yZSAoU0RfLCBBY2Nlc3NMZW5ndGhfV09SRCwgU1AsIEVYVEVORDE2IChJTU1FRElBVEUpLCBHUFJbVFJYXSk7Cit9CisKKworCiswMTEwMCwwMTAsOC5JTU1FRDpJODoxNjo6U1dSQVNQCisic3cgcjxSQUlEWD4sIDxJTU1FRD4gKFNQKSIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19zdG9yZSAoU0RfLCBBY2Nlc3NMZW5ndGhfV09SRCwgU1AsIElNTUVEIDw8IDIsIFJBKTsKK30KKworMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDAxMTAwLDAxMCwwMDAsNS5JTU1fNF8wOkVYVC1JODoxNjo6U1dSQVNQCisic3cgcjxSQUlEWD4sIDxJTU1FRElBVEU+IChTUCkiCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fc3RvcmUgKFNEXywgQWNjZXNzTGVuZ3RoX1dPUkQsIFNQLCBFWFRFTkQxNiAoSU1NRURJQVRFKSwgUkEpOworfQorCisKKworMDExMTEsMy5SWCwzLlJZLDUuSU1NRUQ6UlJJOjE2OjpTRAorInNkIHI8VFJZPiwgPElNTUVEPiAocjxUUlg+KSIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19zdG9yZSAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgR1BSW1RSWF0sIElNTUVEIDw8IDMsIEdQUltUUlldKTsKK30KKworMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDAxMTExLDMuUlgsMy5SWSw1LklNTV80XzA6RVhULVJSSToxNjo6U0QKKyJzZCByPFRSWT4sIDxJTU1FRElBVEU+IChyPFRSWD4pIgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JELCBHUFJbVFJYXSwgRVhURU5EMTYgKElNTUVESUFURSksIEdQUltUUlldKTsKK30KKworCisKKzExMTExLDAwMSwzLlJZLDUuSU1NRUQ6Ukk2NDoxNjo6U0RTUAorInNkIHI8VFJZPiwgPElNTUVEPiAoU1ApIgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JELCBTUCwgSU1NRUQgPDwgMywgR1BSW1RSWV0pOworfQorCisxMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMTExMTEsMDAxLDMuUlksNS5JTU1fNF8wOkVYVC1SSTY0OjE2OjpTRFNQCisic2QgcjxUUlk+LCA8SU1NRURJQVRFPiAoU1ApIgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JELCBTUCwgRVhURU5EMTYgKElNTUVESUFURSksIEdQUltUUlldKTsKK30KKworCisKKzExMTExLDAxMCw4LklNTUVEOkk2NDoxNjo6U0RSQVNQCisic2QgcjxSQUlEWD4sIDxJTU1FRD4gKFNQKSIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19zdG9yZSAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgU1AsIElNTUVEIDw8IDMsIFJBKTsKK30KKworMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDExMTExLDAxMCwwMDAsNS5JTU1fNF8wOkVYVC1JNjQ6MTY6OlNEUkFTUAorInNkIHI8UkFJRFg+LCA8SU1NRURJQVRFPiAoU1ApIgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JELCBTUCwgRVhURU5EMTYgKElNTUVESUFURSksIFJBKTsKK30KKworCisKKy8vIEFMVSBJbW1lZGlhdGUgSW5zdHJ1Y3Rpb25zCisKKworMDExMDEsMy5SWCw4LklNTUVEOlJJOjE2OjpMSQorImxpIHI8VFJYPiwgPElNTUVEPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19vcmkgKFNEXywgMCwgVFJYLCBJTU1FRCk7Cit9CisKKzExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAwMTEwMSwzLlJYLDAwMCw1LklNTV80XzA6RVhULVJJOjE2OjpMSQorImxpIHI8VFJYPiwgPElNTUVESUFURT4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fb3JpIChTRF8sIDAsIFRSWCwgSU1NRURJQVRFKTsKK30KKworCisKKzAxMDAwLDMuUlgsMy5SWSwwLDQuSU1NRUQ6UlJJLUE6MTY6OkFERElVCisiYWRkaXUgcjxUUlk+LCByPFRSWD4sIDxJTU1FRD4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fYWRkaXUgKFNEXywgVFJYLCBUUlksIEVYVEVORDQgKElNTUVEKSk7Cit9CisKKzExMTEwLDcuSU1NXzEwXzQsNC5JTU1fMTRfMTEgKyAwMTAwMCwzLlJYLDMuUlksMCw0LklNTV8zXzA6RVhULVJSSS1BOjE2OjpBRERJVQorImFkZGl1IHI8VFJZPiwgcjxUUlg+LCA8SU1NRURJQVRFPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19hZGRpdSAoU0RfLCBUUlgsIFRSWSwgRVhURU5EMTUgKElNTUVESUFURSkpOworfQorCisKKworMDEwMDEsMy5SWCw4LklNTUVEOlJJOjE2OjpBRERJVTgKKyJhZGRpdSByPFRSWD4sIDxJTU1FRD4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fYWRkaXUgKFNEXywgVFJYLCBUUlgsIEVYVEVORDggKElNTUVEKSk7Cit9CisKKzExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAwMTAwMSwzLlJYLDAwMCw1LklNTV80XzA6RVhULVJJOjE2OjpBRERJVTgKKyJhZGRpdSByPFRSWD4sIDxJTU1FRElBVEU+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX2FkZGl1IChTRF8sIFRSWCwgVFJYLCBFWFRFTkQxNiAoSU1NRURJQVRFKSk7Cit9CisKKworCiswMTEwMCwwMTEsOC5JTU1FRDpJODoxNjo6QURKU1AKKyJhZGRpdSBTUCwgPElNTUVEPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19hZGRpdSAoU0RfLCBTUElEWCwgU1BJRFgsIEVYVEVORDggKElNTUVEKSA8PCAzKTsKK30KKworMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDAxMTAwLDAxMSwwMDAsNS5JTU1fNF8wOkVYVC1JODoxNjo6QURKU1AKKyJhZGRpdSBTUCwgPElNTUVESUFURT4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fYWRkaXUgKFNEXywgU1BJRFgsIFNQSURYLCBFWFRFTkQxNiAoSU1NRURJQVRFKSk7Cit9CisKKworCiswMDAwMSwzLlJYLDguSU1NRUQ6Ukk6MTY6OkFERElVUEMKKyJhZGRpdSByPFRSWD4sIFBDLCA8SU1NRUQ+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIHVuc2lnbmVkMzIgdGVtcCA9IChiYXNlcGMgKFNEXykgJiB+MykgKyAoSU1NRUQgPDwgMik7CisgIEdQUltUUlhdID0gRVhURU5EMzIgKHRlbXApOworfQorCisxMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMDAwMDEsMy5SWCwwMDAsNS5JTU1fNF8wOkVYVC1SSToxNjo6QURESVVQQworImFkZGl1IHI8VFJYPiwgUEMsIDxJTU1FRElBVEU+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIHVuc2lnbmVkMzIgdGVtcCA9IChiYXNlcGMgKFNEXykgJiB+MykgKyBFWFRFTkQxNiAoSU1NRURJQVRFKTsKKyAgR1BSW1RSWF0gPSBFWFRFTkQzMiAodGVtcCk7Cit9CisKKworCiswMDAwMCwzLlJYLDguSU1NRUQ6Ukk6MTY6OkFERElVU1AKKyJhZGRpdSByPFRSWD4sIFNQLCA8SU1NRUQ+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX2FkZGl1IChTRF8sIFNQSURYLCBUUlgsIElNTUVEIDw8IDIpOworfQorCisxMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMDAwMDAsMy5SWCwwMDAsNS5JTU1fNF8wOkVYVC1SSToxNjo6QURESVVTUAorImFkZGl1IHI8VFJYPiwgU1AsIDxJTU1FRElBVEU+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX2FkZGl1IChTRF8sIFNQSURYLCBUUlgsIEVYVEVORDE2IChJTU1FRElBVEUpKTsKK30KKworCisKKzAxMDAwLDMuUlgsMy5SWSwxLDQuSU1NRUQ6UlJJLUE6MTY6OkRBRERJVQorImRhZGRpdSByPFRSWT4sIHI8VFJYPiwgPElNTUVEPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19kYWRkaXUgKFNEXywgVFJYLCBUUlksIEVYVEVORDQgKElNTUVEKSk7Cit9CisKKzExMTEwLDcuSU1NXzEwXzQsNC5JTU1fMTRfMTEgKyAwMTAwMCwzLlJYLDMuUlksMSw0LklNTV8zXzA6RVhULVJSSS1BOjE2OjpEQURESVUKKyJkYWRkaXUgcjxUUlk+LCByPFRSWD4sIDxJTU1FRElBVEU+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX2RhZGRpdSAoU0RfLCBUUlgsIFRSWSwgRVhURU5EMTUgKElNTUVESUFURSkpOworfQorCisKKworMTExMTEsMTAxLDMuUlksNS5JTU1FRDpSSTY0OjE2OjpEQURESVU1CisiZGFkZGl1IHI8VFJZPiwgPElNTUVEPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19kYWRkaXUgKFNEXywgVFJZLCBUUlksIEVYVEVORDUgKElNTUVEKSk7Cit9CisKKzExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAxMTExMSwxMDEsMy5SWSw1LklNTV80XzA6RVhULVJJNjQ6MTY6OkRBRERJVTUKKyJkYWRkaXUgcjxUUlk+LCA8SU1NRURJQVRFPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19kYWRkaXUgKFNEXywgVFJZLCBUUlksIEVYVEVORDE2IChJTU1FRElBVEUpKTsKK30KKworCisKKzExMTExLDAxMSw4LklNTUVEOkk2NDoxNjo6REFESlNQCisiZGFkZGl1IFNQLCA8SU1NRUQ+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX2RhZGRpdSAoU0RfLCBTUElEWCwgU1BJRFgsIEVYVEVORDggKElNTUVEKSA8PCAzKTsKK30KKworMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDExMTExLDAxMSwwMDAsNS5JTU1fNF8wOkVYVC1JNjQ6MTY6OkRBREpTUAorImRhZGRpdSBTUCwgPElNTUVESUFURT4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fZGFkZGl1IChTRF8sIFNQSURYLCBTUElEWCwgRVhURU5EMTYgKElNTUVESUFURSkpOworfQorCisKKworMTExMTEsMTEwLDMuUlksNS5JTU1FRDpSSTY0OjE2OjpEQURESVVQQworImRhZGRpdSByPFRSWT4sIFBDLCA8SU1NRUQ+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIEdQUltUUlldID0gKGJhc2VwYyAoU0RfKSAmIH4zKSArIChJTU1FRCA8PCAyKTsKK30KKworMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDExMTExLDExMCwzLlJZLDUuSU1NXzRfMDpFWFQtUkk2NDoxNjo6REFERElVUEMKKyJkYWRkaXUgcjxUUlk+LCBQQywgPElNTUVESUFURT4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgR1BSW1RSWV0gPSAoYmFzZXBjIChTRF8pICYgfjMpICsgRVhURU5EMTYgKElNTUVESUFURSk7Cit9CisKKworCisxMTExMSwxMTEsMy5SWSw1LklNTUVEOlJJNjQ6MTY6OkRBRERJVVNQCisiZGFkZGl1IHI8VFJZPiwgU1AsIDxJTU1FRD4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fZGFkZGl1IChTRF8sIFNQSURYLCBUUlksIElNTUVEIDw8IDIpOworfQorCisxMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMTExMTEsMTExLDMuUlksNS5JTU1fNF8wOkVYVC1SSTY0OjE2OjpEQURESVVTUAorImRhZGRpdSByPFRSWT4sIFNQLCA8SU1NRURJQVRFPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19kYWRkaXUgKFNEXywgU1BJRFgsIFRSWSwgRVhURU5EMTYgKElNTUVESUFURSkpOworfQorCisKKworMDEwMTAsMy5SWCw4LklNTUVEOlJJOjE2OjpTTFRJCisic2x0aSByPFRSWD4sIDxJTU1FRD4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fc2x0aSAoU0RfLCBUUlgsIFQ4SURYLCBJTU1FRCk7Cit9CisKKzExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAwMTAxMCwzLlJYLDAwMCw1LklNTV80XzA6RVhULVJJOjE2OjpTTFRJCisic2x0aSByPFRSWD4sIDxJTU1FRElBVEU+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX3NsdGkgKFNEXywgVFJYLCBUOElEWCwgSU1NRURJQVRFKTsKK30KKworCisKKzAxMDExLDMuUlgsOC5JTU1FRDpSSToxNjo6U0xUSVUKKyJzbHRpdSByPFRSWD4sIDxJTU1FRD4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fc2x0aXUgKFNEXywgVFJYLCBUOElEWCwgSU1NRUQpOworfQorCisxMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMDEwMTEsMy5SWCwwMDAsNS5JTU1fNF8wOkVYVC1SSToxNjo6U0xUSVUKKyJzbHRpdSByPFRSWD4sIDxJTU1FRElBVEU+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX3NsdGl1IChTRF8sIFRSWCwgVDhJRFgsIElNTUVESUFURSk7Cit9CisKKworCisxMTEwMSwzLlJYLDMuUlksMDEwMTA6UlI6MTY6OkNNUAorInNsdGl1IHI8VFJYPiwgcjxUUlk+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX3hvciAoU0RfLCBUUlgsIFRSWSwgVDhJRFgpOworfQorCisKKzAxMTEwLDMuUlgsOC5JTU1FRDpSSToxNjo6Q01QSQorInNsdGl1IHI8VFJYPiwgPElNTUVEPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb194b3JpIChTRF8sIFRSWCwgVDhJRFgsIElNTUVEKTsKK30KKworMTExMTAsNi5JTU1fMTBfNSw1LklNTV8xNV8xMSArIDAxMTEwLDMuUlgsMDAwLDUuSU1NXzRfMDpFWFQtUkk6MTY6OkNNUEkKKyJzbHRpdSByPFRSWD4sIDxJTU1FRElBVEU+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX3hvcmkgKFNEXywgVFJYLCBUOElEWCwgSU1NRURJQVRFKTsKK30KKworCisKKy8vIFR3by9UaHJlZSBPcGVyYW5kLCBSZWdpc3Rlci1UeXBlCisKKworCisxMTEwMCwzLlJYLDMuUlksMy5SWiwwMTpSUlI6MTY6OkFERFUKKyJhZGR1IHI8VFJaPiwgcjxUUlg+LCByPFRSWT4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fYWRkdSAoU0RfLCBUUlgsIFRSWSwgVFJaKTsKK30KKworCisKKzExMTAwLDMuUlgsMy5SWSwzLlJaLDExOlJSUjoxNjo6U1VCVQorInN1YnUgcjxUUlo+LCByPFRSWD4sIHI8VFJZPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19zdWJ1IChTRF8sIFRSWCwgVFJZLCBUUlopOworfQorCisxMTEwMCwzLlJYLDMuUlksMy5SWiwwMDpSUlI6MTY6OkRBRERVCisiZGFkZHUgcjxUUlo+LCByPFRSWD4sIHI8VFJZPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19kYWRkdSAoU0RfLCBUUlgsIFRSWSwgVFJaKTsKK30KKworCisKKzExMTAwLDMuUlgsMy5SWSwzLlJaLDEwOlJSUjoxNjo6RFNVQlUKKyJkc3VidSByPFRSWj4sIHI8VFJYPiwgcjxUUlk+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX2RzdWJ1IChTRF8sIFRSWCwgVFJZLCBUUlopOworfQorCisKKworMTExMDEsMy5SWCwzLlJZLDAwMDEwOlJSOjE2OjpTTFQKKyJzbHQgcjxUUlg+LCByPFRSWT4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fc2x0IChTRF8sIFRSWCwgVFJZLCBUOElEWCk7Cit9CisKKworCisxMTEwMSwzLlJYLDMuUlksMDAwMTE6UlI6MTY6OlNMVFUKKyJzbHR1IHI8VFJYPiwgcjxUUlk+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX3NsdHUgKFNEXywgVFJYLCBUUlksIFQ4SURYKTsKK30KKworCisKKzExMTAxLDMuUlgsMy5SWSwwMTAxMTpSUjoxNjo6TkVHCisibmVnIHI8VFJYPiwgcjxUUlk+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX3N1YnUgKFNEXywgMCwgVFJZLCBUUlgpOworfQorCisKKworMTExMDEsMy5SWCwzLlJZLDAxMTAwOlJSOjE2OjpBTkQKKyJhbmQgcjxUUlg+LCByPFRSWT4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fYW5kIChTRF8sIFRSWCwgVFJZLCBUUlgpOworfQorCisKKworMTExMDEsMy5SWCwzLlJZLDAxMTAxOlJSOjE2OjpPUgorIm9yIHI8VFJYPiwgcjxUUlk+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX29yIChTRF8sIFRSWCwgVFJZLCBUUlgpOworfQorCisKKworMTExMDEsMy5SWCwzLlJZLDAxMTEwOlJSOjE2OjpYT1IKKyJ4b3IgcjxUUlg+LCByPFRSWT4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9feG9yIChTRF8sIFRSWCwgVFJZLCBUUlgpOworfQorCisKKworMTExMDEsMy5SWCwzLlJZLDAxMTExOlJSOjE2OjpOT1QKKyJub3QgcjxUUlg+LCByPFRSWT4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fbm9yIChTRF8sIDAsIFRSWSwgVFJYKTsKK30KKworCisKKzAxMTAwLDExMSwzLlJZLDUuUjMyOkk4X01PVlIzMjoxNjo6TU9WUjMyCisibW92ZSByPFRSWT4sIHI8UjMyPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19vciAoU0RfLCBSMzIsIDAsIFRSWSk7Cit9CisKKworCiswMTEwMCwxMDEsMy5SMzJMLDIuUjMySCwzLlJaOkk4X01PVjMyUjoxNjo6TU9WMzJSCisibW92ZSByPFIzMj4sIHI8VFJaPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19vciAoU0RfLCBUUlosIDAsIFIzMik7Cit9CisKKworCiswMDExMCwzLlJYLDMuUlksMy5TSEFNVCwwMDpTSElGVDoxNjo6U0xMCisic2xsIHI8VFJYPiwgcjxUUlk+LCA8U0hJRlQ+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX3NsbCAoU0RfLCBUUlksIFRSWCwgU0hJRlQpOworfQorCisxMTExMCw1LlNIQU1ULDAsMDAwMDAgKyAwMDExMCwzLlJYLDMuUlksMDAwLDAwOkVYVC1TSElGVDoxNjo6U0xMCisic2xsIHI8VFJYPiwgcjxUUlk+LCA8U0hJRlQ+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX3NsbCAoU0RfLCBUUlksIFRSWCwgU0hBTVQpOworfQorCisKKworMDAxMTAsMy5SWCwzLlJZLDMuU0hBTVQsMTA6U0hJRlQ6MTY6OlNSTAorInNybCByPFRSWD4sIHI8VFJZPiwgPFNISUZUPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19zcmwgKFNEXywgVFJZLCBUUlgsIFNISUZUKTsKK30KKworMTExMTAsNS5TSEFNVCwwLDAwMDAwICsgMDAxMTAsMy5SWCwzLlJZLDAwMCwxMDpFWFQtU0hJRlQ6MTY6OlNSTAorInNybCByPFRSWD4sIHI8VFJZPiwgPFNISUZUPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19zcmwgKFNEXywgVFJZLCBUUlgsIFNIQU1UKTsKK30KKworCisKKzAwMTEwLDMuUlgsMy5SWSwzLlNIQU1ULDExOlNISUZUOjE2OjpTUkEKKyJzcmEgcjxUUlg+LCByPFRSWT4sIDxTSElGVD4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fc3JhIChTRF8sIFRSWSwgVFJYLCBTSElGVCk7Cit9CisKKzExMTEwLDUuU0hBTVQsMCwwMDAwMCArIDAwMTEwLDMuUlgsMy5SWSwwMDAsMTE6RVhULVNISUZUOjE2OjpTUkEKKyJzcmEgcjxUUlg+LCByPFRSWT4sIDxTSElGVD4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fc3JhIChTRF8sIFRSWSwgVFJYLCBTSEFNVCk7Cit9CisKKworCisxMTEwMSwzLlJYLDMuUlksMDAxMDA6UlI6MTY6OlNMTFYKKyJzbGx2IHI8VFJZPiwgcjxUUlg+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX3NsbHYgKFNEXywgVFJYLCBUUlksIFRSWSk7Cit9CisKKworMTExMDEsMy5SWCwzLlJZLDAwMTEwOlJSOjE2OjpTUkxWCisic3JsdiByPFRSWT4sIHI8VFJYPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19zcmx2IChTRF8sIFRSWCwgVFJZLCBUUlkpOworfQorCisKKzExMTAxLDMuUlgsMy5SWSwwMDExMTpSUjoxNjo6U1JBVgorInNyYXYgcjxUUlk+LCByPFRSWD4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fc3JhdiAoU0RfLCBUUlgsIFRSWSwgVFJZKTsKK30KKworCiswMDExMCwzLlJYLDMuUlksMy5TSEFNVCwwMTpTSElGVDoxNjo6RFNMTAorImRzbGwgcjxUUlk+LCByPFRSWD4sIDxTSElGVD4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fZHNsbCAoU0RfLCBUUlksIFRSWCwgU0hJRlQpOworfQorICAKKzExMTEwLDUuU0hBTVRfNF8wLDEuUzUsMDAwMDAgKyAwMDExMCwzLlJYLDMuUlksMDAwLDAxOkVYVC1TSElGVDoxNjo6RFNMTAorImRzbGwgcjxUUlk+LCByPFRSWD4sIDxTSEFNVD4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fZHNsbCAoU0RfLCBUUlksIFRSWCwgU0hBTVQpOworfQorICAKKyAgCisgIAorMTExMDEsMy5TSEFNVCwzLlJZLDAxMDAwOlNISUZUNjQ6MTY6OkRTUkwKKyJkc3JsIHI8VFJZPiwgPFNISUZUPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19kc3JsIChTRF8sIFRSWSwgVFJZLCBTSElGVCk7Cit9CisKKzExMTEwLDUuU0hBTVRfNF8wLDEuUzUsMDAwMDAgKyAxMTEwMSwwMDAsMy5SWSwwMTAwMDpFWFQtU0hJRlQ2NDoxNjo6RFNSTAorImRzcmwgcjxUUlk+LCA8U0hBTVQ+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX2RzcmwgKFNEXywgVFJZLCBUUlksIFNIQU1UKTsKK30KKworCisKKzExMTAxLDMuU0hBTVQsMy5SWSwxMDAxMTpTSElGVDY0OjE2OjpEU1JBCisiZHNyYSByPFRSWT4sIDxTSElGVD4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fZHNyYSAoU0RfLCBUUlksIFRSWSwgU0hJRlQpOworfQorCisxMTExMCw1LlNIQU1UXzRfMCwxLlM1LDAwMDAwICsgMTExMDEsMDAwLDMuUlksMTAwMTE6RVhULVNISUZUNjQ6MTY6OkRTUkEKKyJkc3JhIHI8VFJZPiwgPFNIQU1UPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19kc3JhIChTRF8sIFRSWSwgVFJZLCBTSEFNVCk7Cit9CisKKworCisxMTEwMSwzLlJYLDMuUlksMTAxMDA6UlI6MTY6OkRTTExWCisiZHNsbHYgcjxUUlk+LCByPFRSWD4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fZHNsbHYgKFNEXywgVFJYLCBUUlksIFRSWSk7Cit9CisKKworMTExMDEsMy5SWCwzLlJZLDEwMTEwOlJSOjE2OjpEU1JMVgorImRzcmx2IHI8VFJZPiwgcjxUUlg+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX2Rzcmx2IChTRF8sIFRSWCwgVFJZLCBUUlkpOworfQorCisKKzExMTAxLDMuUlgsMy5SWSwxMDExMTpSUjoxNjo6RFNSQVYKKyJkc3JhdiByPFRSWT4sIHI8VFJYPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19kc3JhdiAoU0RfLCBUUlgsIFRSWSwgVFJZKTsKK30KKworCisvLyBNdWx0aXBseSAvRGl2aWRlIEluc3RydWN0aW9ucworCisKKzExMTAxLDMuUlgsMy5SWSwxMTAwMDpSUjoxNjo6TVVMVAorIm11bHQgcjxUUlg+LCByPFRSWT4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fbXVsdCAoU0RfLCBUUlgsIFRSWSwgMCk7Cit9CisKKworMTExMDEsMy5SWCwzLlJZLDExMDAxOlJSOjE2OjpNVUxUVQorIm11bHR1IHI8VFJYPiwgcjxUUlk+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX211bHR1IChTRF8sIFRSWCwgVFJZLCAwKTsKK30KKworCisxMTEwMSwzLlJYLDMuUlksMTEwMTA6UlI6MTY6OkRJVgorImRpdiByPFRSWD4sIHI8VFJZPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19kaXYgKFNEXywgVFJYLCBUUlkpOworfQorCisKKzExMTAxLDMuUlgsMy5SWSwxMTAxMTpSUjoxNjo6RElWVQorImRpdnUgcjxUUlg+LCByPFRSWT4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fZGl2dSAoU0RfLCBUUlgsIFRSWSk7Cit9CisKKworMTExMDEsMy5SWCwwMDAsMTAwMDA6UlI6MTY6Ok1GSEkKKyJtZmhpIHI8VFJYPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19tZmhpIChTRF8sIFRSWCk7Cit9CisKKworMTExMDEsMy5SWCwwMDAsMTAwMTA6UlI6MTY6Ok1GTE8KKyJtZmxvIHI8VFJYPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19tZmxvIChTRF8sIFRSWCk7Cit9CisKKworMTExMDEsMy5SWCwzLlJZLDExMTAwOlJSOjE2OjpETVVMVAorImRtdWx0IHI8VFJYPiwgcjxUUlk+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX2RtdWx0IChTRF8sIFRSWCwgVFJZLCAwKTsKK30KKworCisxMTEwMSwzLlJYLDMuUlksMTExMDE6UlI6MTY6OkRNVUxUVQorImRtdWx0dSByPFRSWD4sIHI8VFJZPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBkb19kbXVsdHUgKFNEXywgVFJYLCBUUlksIDApOworfQorCisKKzExMTAxLDMuUlgsMy5SWSwxMTExMDpSUjoxNjo6RERJVgorImRkaXYgcjxUUlg+LCByPFRSWT4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgZG9fZGRpdiAoU0RfLCBUUlgsIFRSWSk7Cit9CisKKworMTExMDEsMy5SWCwzLlJZLDExMTExOlJSOjE2OjpERElWVQorImRkaXZ1IHI8VFJYPiwgcjxUUlk+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGRvX2RkaXZ1IChTRF8sIFRSWCwgVFJZKTsKK30KKworCisvLyBKdW1wIGFuZCBCcmFuY2ggSW5zdHJ1Y3Rpb25zCisKKworCisvLyBJc3N1ZSBpbnN0cnVjdGlvbiBpbiBkZWxheSBzbG90IG9mIGJyYW5jaAorOmZ1bmN0aW9uOjo6YWRkcmVzc193b3JkOmRlbGF5c2xvdDE2OmFkZHJlc3Nfd29yZCBuaWEsIGFkZHJlc3Nfd29yZCB0YXJnZXQKK3sKKyAgaW5zdHJ1Y3Rpb25fd29yZCBkZWxheV9pbnNuOworICBzaW1fZXZlbnRzX3NsaXAgKFNELCAxKTsKKyAgRFNQQyA9IENJQTsgLyogc2F2ZSBjdXJyZW50IFBDIHNvbWV3aGVyZSAqLworICBTVEFURSB8PSBzaW1ERUxBWVNMT1Q7CisgIGRlbGF5X2luc24gPSBJTUVNMTYgKG5pYSk7IC8qIE5PVEU6IG1pcHMxNiAqLworICBpZGVjb2RlX2lzc3VlIChDUFVfLCBkZWxheV9pbnNuLCAobmlhKSk7CisgIFNUQVRFICY9IH5zaW1ERUxBWVNMT1Q7CisgIHJldHVybiB0YXJnZXQ7Cit9CisgIAorLy8gY29tcHV0ZSBiYXNlcGMgZGVwZW5kYW50IG9uIHVzIGJlaW5nIGluIGEgZGVsYXkgc2xvdAorOmZ1bmN0aW9uOjo6YWRkcmVzc193b3JkOmJhc2VwYzoKK3sKKyAgaWYgKFNUQVRFICYgc2ltREVMQVlTTE9UKQorICAgIHsKKyAgICAgIHJldHVybiBEU1BDOyAvKiByZXR1cm4gc2F2ZWQgYWRkcmVzcyBvZiBwcmVjZWVkaW5nIGptcCAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJldHVybiBDSUE7CisgICAgfQorfQorCisKKy8vIEpBTAorMDAwMTEsMCw1LklNTV8yMF8xNiw1LklNTV8yNV8yMSArIDE2LklNTUVEXzE1XzA6SkFMOjE2OjpKQUwKKyJqYWwgPElNTUVESUFURT4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgYWRkcmVzc193b3JkIHJlZ2lvbiA9IChOSUEgJiBNQVNLICg2MywgMjgpKTsKKyAgUkEgPSBOSUEgKyAyOyAvKiBza2lwIDE2IGJpdCBkZWxheXNsb3QgaW5zbiAqLworICBOSUEgPSBkZWxheXNsb3QxNiAoU0RfLCBOSUEsIChyZWdpb24gfCAoSU1NRURJQVRFIDw8IDIpKSkgfCAxOworfQorCisKKworLy8gSkFMWCAtIDMyIGFuZCAxNiBiaXQgdmVyc2lvbnMuCisKKzAxMTEwMSwyNi5JTU1FRDpKQUxYOjMyOjpKQUxYMzIKKyJqYWx4IDxJTU1FRD4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgYWRkcmVzc193b3JkIHJlZ2lvbiA9IChOSUEgJiBNQVNLICg2MywgMjgpKTsKKyAgUkEgPSBOSUEgKyA0OyAvKiBza2lwIDMyIGJpdCBkZWxheXNsb3QgaW5zbiAqLworICBOSUEgPSBkZWxheXNsb3QzMiAoU0RfLCAocmVnaW9uIHwgKElNTUVEIDw8IDIpKSB8IDEpOworfQorCiswMDAxMSwxLDUuSU1NXzIwXzE2LDUuSU1NXzI1XzIxICsgMTYuSU1NRURfMTVfMDpKQUxYOjE2OjpKQUxYMTYKKyJqYWx4IDxJTU1FRElBVEU+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGFkZHJlc3Nfd29yZCByZWdpb24gPSAoTklBICYgTUFTSyAoNjMsIDI4KSk7CisgIFJBID0gTklBICsgMjsgLyogMTYgYml0IElOU04gKi8KKyAgTklBID0gZGVsYXlzbG90MTYgKFNEXywgTklBLCAocmVnaW9uIHwgKElNTUVESUFURSA8PCAyKSkgJiB+MSk7Cit9CisKKworCisxMTEwMSwzLlJYLDAwMCwwMDAwMDpSUjoxNjo6SlIKKyJqciByPFRSWD4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgTklBID0gZGVsYXlzbG90MTYgKFNEXywgTklBLCBHUFJbVFJYXSk7Cit9CisKKworMTExMDEsMDAwLDAwMSwwMDAwMDpSUjoxNjo6SlJSQQorImpycmEiCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgTklBID0gZGVsYXlzbG90MTYgKFNEXywgTklBLCBSQSk7Cit9CisKKworCisxMTEwMSwzLlJYLDAxMCwwMDAwMDpSUjoxNjo6SkFMUgorImphbHIgcjxUUlg+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIFJBID0gTklBICsgMjsKKyAgTklBID0gZGVsYXlzbG90MTYgKFNEXywgTklBLCBHUFJbVFJYXSk7Cit9CisKKworCiswMDEwMCwzLlJYLDguSU1NRUQ6Ukk6MTY6OkJFUVoKKyJiZXF6IHI8VFJYPiwgPElNTUVEPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBpZiAoR1BSW1RSWF0gPT0gMCkKKyAgICBOSUEgPSAoTklBICsgKEVYVEVORDggKElNTUVEKSA8PCAxKSk7Cit9CisKKzExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAwMDEwMCwzLlJYLDAwMCw1LklNTV80XzA6RVhULVJJOjE2OjpCRVFaCisiYmVxeiByPFRSWD4sIDxJTU1FRElBVEU+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGlmIChHUFJbVFJYXSA9PSAwKQorICAgIE5JQSA9IChOSUEgKyAoRVhURU5EMTYgKElNTUVESUFURSkgPDwgMSkpOworfQorCisKKworMDAxMDEsMy5SWCw4LklNTUVEOlJJOjE2OjpCTkVaCisiYm5leiByPFRSWD4sIDxJTU1FRD4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgaWYgKEdQUltUUlhdICE9IDApCisgICAgTklBID0gKE5JQSArIChFWFRFTkQ4IChJTU1FRCkgPDwgMSkpOworfQorCisxMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMDAxMDEsMy5SWCwwMDAsNS5JTU1fNF8wOkVYVC1SSToxNjo6Qk5FWgorImJuZXogcjxUUlg+LCA8SU1NRURJQVRFPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBpZiAoR1BSW1RSWF0gIT0gMCkKKyAgICBOSUEgPSAoTklBICsgKEVYVEVORDE2IChJTU1FRElBVEUpIDw8IDEpKTsKK30KKworCisKKzAxMTAwLDAwMCw4LklNTUVEOkk4OjE2OjpCVEVRWgorImJ0ZXF6IDxJTU1FRD4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgaWYgKFQ4ID09IDApCisgICAgTklBID0gKE5JQSArIChFWFRFTkQ4IChJTU1FRCkgPDwgMSkpOworfQorCisxMTExMCw2LklNTV8xMF81LDUuSU1NXzE1XzExICsgMDExMDAsMDAwLDAwMCw1LklNTV80XzA6RVhULUk4OjE2OjpCVEVRWgorImJ0ZXF6IDxJTU1FRElBVEU+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIGlmIChUOCA9PSAwKQorICAgIE5JQSA9IChOSUEgKyAoRVhURU5EMTYgKElNTUVESUFURSkgPDwgMSkpOworfQorCisKKworMDExMDAsMDAxLDguSU1NRUQ6STg6MTY6OkJUTkVaCisiYnRuZXogPElNTUVEPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBpZiAoVDggIT0gMCkKKyAgICBOSUEgPSAoTklBICsgKEVYVEVORDggKElNTUVEKSA8PCAxKSk7Cit9CisKKzExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAwMTEwMCwwMDEsMDAwLDUuSU1NXzRfMDpFWFQtSTg6MTY6OkJUTkVaCisiYnRuZXogPElNTUVESUFURT4iCisqbWlwczE2OgorKnZyNDEwMDoKK3sKKyAgaWYgKFQ4ICE9IDApCisgICAgTklBID0gKE5JQSArIChFWFRFTkQxNiAoSU1NRURJQVRFKSA8PCAxKSk7Cit9CisKKworCiswMDAxMCwxMS5JTU1FRDpJOjE2OjpCCisiYiA8SU1NRUQ+IgorKm1pcHMxNjoKKyp2cjQxMDA6Cit7CisgIE5JQSA9IChOSUEgKyAoRVhURU5EMTEgKElNTUVEKSA8PCAxKSk7Cit9CisKKzExMTEwLDYuSU1NXzEwXzUsNS5JTU1fMTVfMTEgKyAwMDAxMCw2LjAsNS5JTU1fNF8wOkVYVC1JOjE2OjpCCisiYiA8SU1NRURJQVRFPiIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBOSUEgPSAoTklBICsgKEVYVEVORDE2IChJTU1FRElBVEUpIDw8IDEpKTsKK30KKworCisKKzExMTAxLDMuUlgsMy5SWSwwMDEwMTpSUjoxNjo6QlJFQUsKKyJicmVhayIKKyptaXBzMTY6CisqdnI0MTAwOgoreworICBpZiAoU1RBVEUgJiBzaW1ERUxBWVNMT1QpCisgICAgUEMgPSBjaWEgLSAyOyAvKiByZWZlcmVuY2UgdGhlIGJyYW5jaCBpbnN0cnVjdGlvbiAqLworICBlbHNlCisgICAgUEMgPSBjaWE7CisgIHNpbV9lbmdpbmVfaGFsdCAoU0QsIENQVSwgTlVMTCwgY2lhLCBzaW1fc3RvcHBlZCwgU0lNX1NJR1RSQVApOworfQpkaWZmIC0tZ2l0IGEvc2ltL21pcHMvbTE2cnVuLmMgYi9zaW0vbWlwcy9tMTZydW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTVkNjA3Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL21pcHMvbTE2cnVuLmMKQEAgLTAsMCArMSw3NCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJtMTZfaWRlY29kZS5oIgorI2luY2x1ZGUgIm0zMl9pZGVjb2RlLmgiCisjaW5jbHVkZSAiYmZkLmgiCisKKworI2RlZmluZSBTRCBzZAorI2RlZmluZSBDUFUgY3B1CisKK3ZvaWQKK3NpbV9lbmdpbmVfcnVuIChTSU1fREVTQyBzZCwKKwkJaW50IG5leHRfY3B1X25yLAorCQlpbnQgbnJfY3B1cywgLyogaWdub3JlICovCisJCWludCBzaWdnbmFsKSAvKiBpZ25vcmUgKi8KK3sKKyAgc2ltX2NwdSAqY3B1ID0gU1RBVEVfQ1BVIChzZCwgbmV4dF9jcHVfbnIpOworICBhZGRyZXNzX3dvcmQgY2lhID0gQ0lBX0dFVCAoY3B1KTsKKworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBhZGRyZXNzX3dvcmQgbmlhOworCisjaWYgZGVmaW5lZCAoRU5HSU5FX0lTU1VFX1BSRUZJWF9IT09LKQorICAgICAgRU5HSU5FX0lTU1VFX1BSRUZJWF9IT09LICgpOworI2VuZGlmCisKKyAgICAgIGlmICgoY2lhICYgMSkpCisJeworCSAgbTE2X2luc3RydWN0aW9uX3dvcmQgaW5zdHJ1Y3Rpb25fMCA9IElNRU0xNiAoY2lhKTsKKwkgIG5pYSA9IG0xNl9pZGVjb2RlX2lzc3VlIChzZCwgaW5zdHJ1Y3Rpb25fMCwgY2lhKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbTMyX2luc3RydWN0aW9uX3dvcmQgaW5zdHJ1Y3Rpb25fMCA9IElNRU0zMiAoY2lhKTsKKwkgIG5pYSA9IG0zMl9pZGVjb2RlX2lzc3VlIChzZCwgaW5zdHJ1Y3Rpb25fMCwgY2lhKTsKKwl9CisKKyNpZiBkZWZpbmVkIChFTkdJTkVfSVNTVUVfUE9TVEZJWF9IT09LKQorICAgICAgRU5HSU5FX0lTU1VFX1BPU1RGSVhfSE9PSyAoKTsKKyNlbmRpZgorCisgICAgICAvKiBVcGRhdGUgdGhlIGluc3RydWN0aW9uIGFkZHJlc3MgKi8KKyAgICAgIGNpYSA9IG5pYTsKKworICAgICAgLyogcHJvY2VzcyBhbnkgZXZlbnRzICovCisgICAgICBpZiAoc2ltX2V2ZW50c190aWNrIChzZCkpCisgICAgICAgIHsKKyAgICAgICAgICBDSUFfU0VUIChDUFUsIGNpYSk7CisgICAgICAgICAgc2ltX2V2ZW50c19wcm9jZXNzIChzZCk7CisJICBjaWEgPSBDSUFfR0VUIChDUFUpOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zaW0vbWlwcy9taXBzLmRjIGIvc2ltL21pcHMvbWlwcy5kYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGRhMDI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL21pcHMvbWlwcy5kYwpAQCAtMCwwICsxLDE2IEBACisjIG1vc3QgaW5zdHJ1Y3Rpb25zCisjIC0tLS0tLSBvcHRpb25zIC0tLS0tLSA6IEZzdCA6IExzdCA6IGZmIDogZmwgOiBmZSA6IHdvcmQgOiAtLS0gZm10IC0tLSA6IG1vZGVsIC4uLgorIyB7IDogbWFzayA6IHZhbHVlIDogd29yZCB9CisKKyMgVG9wIGxldmVsIC0gY3JlYXRlIGEgdmVyeSBiaWcgc3dpdGNoIHN0YXRlbWVudC4KKworICBwYWRkZWQtc3dpdGNoLGNvbWJpbmUgOiAgMzEgOiAgMjYgOiAgICA6ICAgIDogICAgOiAgICAgIDogICAgICAgICAgICAgOgorCisgIHN3aXRjaCxjb21iaW5lICAgICAgICA6ICAgNSA6ICAgMCA6ICAgIDogICAgOiAgICA6ICAgICAgOiAgICAgICAgICAgICA6CisKKyAgc3dpdGNoLGNvbWJpbmUgICAgICAgIDogIDIwIDogIDE2IDogICAgOiAgICA6ICAgIDogICAgICA6ICAgICAgICAgICAgIDoKKworICBzd2l0Y2gsY29tYmluZSAgICAgICAgOiAgMjUgOiAgMjEgOiAgICA6ICAgIDogICAgOiAgICAgIDogICAgICAgICAgICAgOgorCisgIHN3aXRjaCxjb21iaW5lICAgICAgICA6ICAxMCA6ICAgNiA6ICAgIDogICAgOiAgICA6ICAgICAgOiAgICAgICAgICAgICA6CisKZGlmZiAtLWdpdCBhL3NpbS9taXBzL21pcHMuaWdlbiBiL3NpbS9taXBzL21pcHMuaWdlbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmMyMDlhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL21pcHMvbWlwcy5pZ2VuCkBAIC0wLDAgKzEsMzg5NSBAQAorLy8gLSotIEMgLSotCisvLworLy8gSW4gbWlwcy5pZ2VuLCB0aGUgc2VtYW50aWNzIGZvciBtYW55IG9mIHRoZSBpbnN0cnVjdGlvbnMgd2VyZSBjcmVhdGVkCisvLyB1c2luZyBjb2RlIGdlbmVyYXRlZCBieSBnZW5jb2RlLiAgVGhvc2Ugc2VtYW50aWMgc2VnbWVudHMgY291bGQgYmUKKy8vIGdyZWF0bHkgc2ltcGxpZmllZC4KKy8vCisvLyAgICA8aW5zbj4gOjo9CisvLyAgICAgICAgPGluc24td29yZD4geyAiKyIgPGluc24td29yZD4gfQorLy8gICAgICAgICI6IiA8Zm9ybWF0LW5hbWU+CisvLyAgICAgICAgIjoiIDxmaWx0ZXItZmxhZ3M+CisvLyAgICAgICAgIjoiIDxvcHRpb25zPgorLy8gICAgICAgICI6IiA8bmFtZT4KKy8vICAgICAgICA8bmw+CisvLyAgICAgICAgeyA8aW5zbi1tb2RlbD4gfQorLy8gICAgICAgIHsgPGluc24tbW5lbW9uaWM+IH0KKy8vICAgICAgICA8Y29kZS1ibG9jaz4KKy8vCisKKworLy8gSUdFTiBjb25maWcgLSBtaXBzMTYKKy8vIDpvcHRpb246MTY6Omluc24tYml0LXNpemU6MTYKKy8vIDpvcHRpb246MTY6OmhpLWJpdC1ucjoxNQorOm9wdGlvbjoxNjo6aW5zbi1zcGVjaWZ5aW5nLXdpZHRoczp0cnVlCis6b3B0aW9uOjE2OjpnZW4tZGVsYXllZC1icmFuY2g6ZmFsc2UKKworLy8gSUdFTiBjb25maWcgLSBtaXBzMzIvNjQuLgorLy8gOm9wdGlvbjozMjo6aW5zbi1iaXQtc2l6ZTozMgorLy8gOm9wdGlvbjozMjo6aGktYml0LW5yOjMxCis6b3B0aW9uOjMyOjppbnNuLXNwZWNpZnlpbmctd2lkdGhzOnRydWUKKzpvcHRpb246MzI6Omdlbi1kZWxheWVkLWJyYW5jaDpmYWxzZQorCisKKy8vIEdlbmVyYXRlIHNlcGFyYXRlIHNpbXVsYXRvcnMgZm9yIGVhY2ggdGFyZ2V0CisvLyA6b3B0aW9uOjo6bXVsdGktc2ltOnRydWUKKworCisvLyBNb2RlbHMga25vd24gYnkgdGhpcyBzaW11bGF0b3IKKzptb2RlbDo6Om1pcHNJOm1pcHMzMDAwOgorOm1vZGVsOjo6bWlwc0lJOm1pcHM2MDAwOgorOm1vZGVsOjo6bWlwc0lJSTptaXBzNDAwMDoKKzptb2RlbDo6Om1pcHNJVjptaXBzODAwMDoKKzptb2RlbDo6Om1pcHMxNjptaXBzMTY6Cis6bW9kZWw6OjpyMzkwMDptaXBzMzkwMDoKKzptb2RlbDo6OnZyNDEwMDptaXBzNDEwMDoKKzptb2RlbDo6OnZyNTAwMDptaXBzNTAwMDoKKworCisKKy8vIFBzZXVkbyBpbnN0cnVjdGlvbnMga25vd24gYnkgSUdFTgorOmludGVybmFsOjo6OmlsbGVnYWw6Cit7CisgIFNpZ25hbEV4Y2VwdGlvbiAoUmVzZXJ2ZWRJbnN0cnVjdGlvbiwgMCk7Cit9CisKKworLy8gUHNldWRvIGluc3RydWN0aW9ucyBrbm93biBieSBpbnRlcnAuYworLy8gRm9yIGdyZXAgLSBSU1ZEX0lOU1RSVUNUSU9OLCBSU1ZEX0lOU1RSVUNUSU9OX01BU0sKKzAwMDAwMCw1LiosNS4qLDUuKiw1Lk9QLDAwMDEwMTpTUEVDSUFMOjMyOjpSU1ZECisicnN2ZCA8T1A+IgoreworICBTaWduYWxFeGNlcHRpb24gKFJlc2VydmVkSW5zdHJ1Y3Rpb24sIGluc3RydWN0aW9uXzApOworfQorCisKKworLy8gSGVscGVyOgorLy8KKy8vIFNpbXVsYXRlIGEgMzIgYml0IGRlbGF5c2xvdCBpbnN0cnVjdGlvbgorLy8KKworOmZ1bmN0aW9uOjo6YWRkcmVzc193b3JkOmRlbGF5c2xvdDMyOmFkZHJlc3Nfd29yZCB0YXJnZXQKK3sKKyAgaW5zdHJ1Y3Rpb25fd29yZCBkZWxheV9pbnNuOworICBzaW1fZXZlbnRzX3NsaXAgKFNELCAxKTsKKyAgRFNQQyA9IENJQTsKKyAgQ0lBID0gQ0lBICsgNDsgLyogTk9URSBub3QgbWlwczE2ICovCisgIFNUQVRFIHw9IHNpbURFTEFZU0xPVDsKKyAgZGVsYXlfaW5zbiA9IElNRU0zMiAoQ0lBKTsgLyogTk9URSBub3QgbWlwczE2ICovCisgIGlkZWNvZGVfaXNzdWUgKENQVV8sIGRlbGF5X2luc24sIChDSUEpKTsKKyAgU1RBVEUgJj0gfnNpbURFTEFZU0xPVDsKKyAgcmV0dXJuIHRhcmdldDsKK30KKworOmZ1bmN0aW9uOjo6YWRkcmVzc193b3JkOm51bGxpZnlfbmV4dF9pbnNuMzI6Cit7CisgIHNpbV9ldmVudHNfc2xpcCAoU0QsIDEpOworICBkb3RyYWNlIChTRCwgQ1BVLCB0cmFjZWZoLCAyLCBDSUEgKyA0LCA0LCAibG9hZCBpbnN0cnVjdGlvbiIpOworICByZXR1cm4gQ0lBICsgODsKK30KKworLy8gSGVscGVyOgorLy8gCisvLyBDaGVjayB0aGF0IGFuIGFjY2VzcyB0byBhIEhJL0xPIHJlZ2lzdGVyIG1lZXRzIHRpbWluZyByZXF1aXJlbWVudHMKKy8vCisvLyBUaGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyBleGlzdDoKKy8vCisvLyAgIC0gIEEgTVQge0hJLExPfSB1cGRhdGUgd2FzIG5vdCBpbW1lZGlhdGx5IHByZWNlZWRlZCBieSBhIE1GIHtISSxMT30gcmVhZAorLy8gICAtICBBIE9QIHtISSxMT30gdXBkYXRlIHdhcyBub3QgaW1tZWRpYXRseSBwcmVjZWVkZWQgYnkgYSBNRiB7SEksTE99IHJlYWQKKy8vICAgLSAgQSBNRiB7SEksTE99IHJlYWQgd2FzIG5vdCBjb3JydXB0ZWQgYnkgYSBwcmVjZWVkaW5nIE1Ue0xPLEhJfSB1cGRhdGUKKy8vICAgICAgY29ycnVwdGlvbiBvY2N1cmVzIHdoZW4gTVR7TE8sSEl9IGlzIHByZWNlZWRlZCBieSBhIE9QIHtISSxMT30uCisvLworCis6ZnVuY3Rpb246OjppbnQ6Y2hlY2tfbWZfY3ljbGVzOmhpbG9faGlzdG9yeSAqaGlzdG9yeSwgc2lnbmVkNjQgdGltZSwgY29uc3QgY2hhciAqbmV3Cit7CisgIGlmIChoaXN0b3J5LT5tZi50aW1lc3RhbXAgKyAzID4gdGltZSkKKyAgICB7CisgICAgICBzaW1fZW5naW5lX2Fib3J0IChTRCwgQ1BVLCBDSUEsICJISUxPOiAlczogJXMgYXQgMHglMDhseCB0b28gY2xvc2UgdG8gTUYgYXQgMHglMDhseFxuIiwKKwkJCWl0YWJsZVtNWV9JTkRFWF0ubmFtZSwKKwkJCW5ldywgKGxvbmcpIENJQSwKKwkJCShsb25nKSBoaXN0b3J5LT5tZi5jaWEpOyAgICAgIAorICAgICAgcmV0dXJuIDA7CisgICAgfQorICByZXR1cm4gMTsKK30KKworOmZ1bmN0aW9uOjo6aW50OmNoZWNrX210X2hpbG86aGlsb19oaXN0b3J5ICpoaXN0b3J5CisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6Cit7CisgIHNpZ25lZDY0IHRpbWUgPSBzaW1fZXZlbnRzX3RpbWUgKFNEKTsKKyAgaW50IG9rID0gY2hlY2tfbWZfY3ljbGVzIChTRF8sIGhpc3RvcnksIHRpbWUsICJNVCIpOworICBoaXN0b3J5LT5tdC50aW1lc3RhbXAgPSB0aW1lOworICBoaXN0b3J5LT5tdC5jaWEgPSBDSUE7CisgIHJldHVybiBvazsKK30KKworOmZ1bmN0aW9uOjo6aW50OmNoZWNrX210X2hpbG86aGlsb19oaXN0b3J5ICpoaXN0b3J5CisqcjM5MDA6Cit7CisgIHNpZ25lZDY0IHRpbWUgPSBzaW1fZXZlbnRzX3RpbWUgKFNEKTsKKyAgaGlzdG9yeS0+bXQudGltZXN0YW1wID0gdGltZTsKKyAgaGlzdG9yeS0+bXQuY2lhID0gQ0lBOworICByZXR1cm4gMTsKK30KKworCis6ZnVuY3Rpb246OjppbnQ6Y2hlY2tfbWZfaGlsbzpoaWxvX2hpc3RvcnkgKmhpc3RvcnksIGhpbG9faGlzdG9yeSAqcGVlcgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBzaWduZWQ2NCB0aW1lID0gc2ltX2V2ZW50c190aW1lIChTRCk7CisgIGludCBvayA9IDE7CisgIGlmIChwZWVyICE9IE5VTEwKKyAgICAgICYmIHBlZXItPm10LnRpbWVzdGFtcCA+IGhpc3RvcnktPm9wLnRpbWVzdGFtcAorICAgICAgJiYgaGlzdG9yeS0+bXQudGltZXN0YW1wIDwgaGlzdG9yeS0+b3AudGltZXN0YW1wCisgICAgICAmJiAhIChoaXN0b3J5LT5tZi50aW1lc3RhbXAgPiBoaXN0b3J5LT5vcC50aW1lc3RhbXAKKwkgICAgJiYgaGlzdG9yeS0+bWYudGltZXN0YW1wIDwgcGVlci0+bXQudGltZXN0YW1wKQorICAgICAgJiYgISAocGVlci0+bWYudGltZXN0YW1wID4gaGlzdG9yeS0+b3AudGltZXN0YW1wCisJICAgICYmIHBlZXItPm1mLnRpbWVzdGFtcCA8IHBlZXItPm10LnRpbWVzdGFtcCkpCisgICAgeworICAgICAgLyogVGhlIHBlZXIgaGFzIGJlZW4gd3JpdHRlbiB0byBzaW5jZSB0aGUgbGFzdCBPUCB5ZXQgd2UgaGF2ZQorICAgICAgICAgbm90ICovCisgICAgICBzaW1fZW5naW5lX2Fib3J0IChTRCwgQ1BVLCBDSUEsICJISUxPOiAlczogTUYgYXQgMHglMDhseCBmb2xsb3dpbmcgT1AgYXQgMHglMDhseCBjb3JydXB0ZWQgYnkgTVQgYXQgMHglMDhseFxuIiwKKwkJCWl0YWJsZVtNWV9JTkRFWF0ubmFtZSwKKwkJCShsb25nKSBDSUEsCisJCQkobG9uZykgaGlzdG9yeS0+b3AuY2lhLAorCQkJKGxvbmcpIHBlZXItPm10LmNpYSk7ICAgICAgCisgICAgICBvayA9IDA7CisgICAgfQorICBoaXN0b3J5LT5tZi50aW1lc3RhbXAgPSB0aW1lOworICBoaXN0b3J5LT5tZi5jaWEgPSBDSUE7CisgIHJldHVybiBvazsKK30KKworCisKKzpmdW5jdGlvbjo6OmludDpjaGVja19tdWx0X2hpbG86aGlsb19oaXN0b3J5ICpoaSwgaGlsb19oaXN0b3J5ICpsbworKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICBzaWduZWQ2NCB0aW1lID0gc2ltX2V2ZW50c190aW1lIChTRCk7CisgIGludCBvayA9IChjaGVja19tZl9jeWNsZXMgKFNEXywgaGksIHRpbWUsICJPUCIpCisJICAgICYmIGNoZWNrX21mX2N5Y2xlcyAoU0RfLCBsbywgdGltZSwgIk9QIikpOworICBoaS0+b3AudGltZXN0YW1wID0gdGltZTsKKyAgbG8tPm9wLnRpbWVzdGFtcCA9IHRpbWU7CisgIGhpLT5vcC5jaWEgPSBDSUE7CisgIGxvLT5vcC5jaWEgPSBDSUE7CisgIHJldHVybiBvazsKK30KKworLy8gVGhlIHIzOTAwIG11bHQgYW5kIG11bHR1IGluc25zIF9jYW5fIGJlIGV4ZWN0dXRlZCBpbW1lZGlhdGx5IGFmdGVyCisvLyBhIG1me2hpLGxvfQorOmZ1bmN0aW9uOjo6aW50OmNoZWNrX211bHRfaGlsbzpoaWxvX2hpc3RvcnkgKmhpLCBoaWxvX2hpc3RvcnkgKmxvCisqcjM5MDA6Cit7CisgIC8qIEZJWE1FOiBjb3VsZCByZWNvcmQgdGhlIGZhY3QgdGhhdCBhIHN0YWxsIG9jY3VyZWQgaWYgd2Ugd2FudCAqLworICBzaWduZWQ2NCB0aW1lID0gc2ltX2V2ZW50c190aW1lIChTRCk7CisgIGhpLT5vcC50aW1lc3RhbXAgPSB0aW1lOworICBsby0+b3AudGltZXN0YW1wID0gdGltZTsKKyAgaGktPm9wLmNpYSA9IENJQTsKKyAgbG8tPm9wLmNpYSA9IENJQTsKKyAgcmV0dXJuIDE7Cit9CisKKworOmZ1bmN0aW9uOjo6aW50OmNoZWNrX2Rpdl9oaWxvOmhpbG9faGlzdG9yeSAqaGksIGhpbG9faGlzdG9yeSAqbG8KKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgc2lnbmVkNjQgdGltZSA9IHNpbV9ldmVudHNfdGltZSAoU0QpOworICBpbnQgb2sgPSAoY2hlY2tfbWZfY3ljbGVzIChTRF8sIGhpLCB0aW1lLCAiT1AiKQorCSAgICAmJiBjaGVja19tZl9jeWNsZXMgKFNEXywgbG8sIHRpbWUsICJPUCIpKTsKKyAgaGktPm9wLnRpbWVzdGFtcCA9IHRpbWU7CisgIGxvLT5vcC50aW1lc3RhbXAgPSB0aW1lOworICBoaS0+b3AuY2lhID0gQ0lBOworICBsby0+b3AuY2lhID0gQ0lBOworICByZXR1cm4gb2s7Cit9CisKKworCisKKworLy8KKy8vIE1pcHMgQXJjaGl0ZWN0dXJlOgorLy8KKy8vICAgICAgICBDUFUgSW5zdHJ1Y3Rpb24gU2V0IChtaXBzSSAtIG1pcHNJVikKKy8vCisKKworCiswMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAsMTAwMDAwOlNQRUNJQUw6MzI6OkFERAorImFkZCByPFJEPiwgcjxSUz4sIHI8UlQ+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbUlNdLCBHUFJbUlRdKTsKKyAgeworICAgIEFMVTMyX0JFR0lOIChHUFJbUlNdKTsKKyAgICBBTFUzMl9BREQgKEdQUltSVF0pOworICAgIEFMVTMyX0VORCAoR1BSW1JEXSk7CisgIH0KKyAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW1JEXSk7Cit9CisKKworCiswMDEwMDAsNS5SUyw1LlJULDE2LklNTUVESUFURTpOT1JNQUw6MzI6OkFEREkKKyJhZGRpIHI8UlQ+LCByPFJTPiwgSU1NRURJQVRFIgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbUlNdLCBFWFRFTkQxNiAoSU1NRURJQVRFKSk7CisgIHsKKyAgICBBTFUzMl9CRUdJTiAoR1BSW1JTXSk7CisgICAgQUxVMzJfQUREIChFWFRFTkQxNiAoSU1NRURJQVRFKSk7CisgICAgQUxVMzJfRU5EIChHUFJbUlRdKTsKKyAgfQorICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbUlRdKTsKK30KKworCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fYWRkaXU6aW50IHJzLCBpbnQgcnQsIHVuc2lnbmVkMTYgaW1tZWRpYXRlCit7CisgIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltyc10sIEVYVEVORDE2IChpbW1lZGlhdGUpKTsKKyAgR1BSW3J0XSA9IEVYVEVORDMyIChHUFJbcnNdICsgRVhURU5EMTYgKGltbWVkaWF0ZSkpOworICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbcnRdKTsKK30KKworMDAxMDAxLDUuUlMsNS5SVCwxNi5JTU1FRElBVEU6Tk9STUFMOjMyOjpBRERJVQorImFkZGl1IHI8UlQ+LCByPFJTPiwgPElNTUVESUFURT4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGRvX2FkZGl1IChTRF8sIFJTLCBSVCwgSU1NRURJQVRFKTsKK30KKworCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fYWRkdTppbnQgcnMsIGludCBydCwgaW50IHJkCit7CisgIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltyc10sIEdQUltydF0pOworICBHUFJbcmRdID0gRVhURU5EMzIgKEdQUltyc10gKyBHUFJbcnRdKTsKKyAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3JkXSk7Cit9CisKKzAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMCwxMDAwMDE6U1BFQ0lBTDozMjo6QUREVQorImFkZHUgcjxSRD4sIHI8UlM+LCByPFJUPiIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgZG9fYWRkdSAoU0RfLCBSUywgUlQsIFJEKTsKK30KKworCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fYW5kOmludCBycywgaW50IHJ0LCBpbnQgcmQKK3sKKyAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3JzXSwgR1BSW3J0XSk7CisgIEdQUltyZF0gPSBHUFJbcnNdICYgR1BSW3J0XTsKKyAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3JkXSk7Cit9CisKKzAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMCwxMDAxMDA6U1BFQ0lBTDozMjo6QU5ECisiYW5kIHI8UkQ+LCByPFJTPiwgcjxSVD4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGRvX2FuZCAoU0RfLCBSUywgUlQsIFJEKTsKK30KKworCisKKzAwMTEwMCw1LlJTLDUuUlQsMTYuSU1NRURJQVRFOk5PUk1BTDozMjo6QU5ESQorImFuZCByPFJUPiwgcjxSUz4sIDxJTU1FRElBVEU+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbUlNdLCBJTU1FRElBVEUpOworICBHUFJbUlRdID0gR1BSW1JTXSAmIElNTUVESUFURTsKKyAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW1JUXSk7Cit9CisKKworCiswMDAxMDAsNS5SUyw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6MzI6OkJFUQorImJlcSByPFJTPiwgcjxSVD4sIDxPRkZTRVQ+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBhZGRyZXNzX3dvcmQgb2Zmc2V0ID0gRVhURU5EMTYgKE9GRlNFVCkgPDwgMjsKKyAgY2hlY2tfYnJhbmNoX2J1ZyAoKTsKKyAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA9PSAoc2lnbmVkX3dvcmQpIEdQUltSVF0pCisgICAgeworICAgICAgbWFya19icmFuY2hfYnVnIChOSUErb2Zmc2V0KTsKKyAgICAgIERFTEFZX1NMT1QgKE5JQSArIG9mZnNldCk7CisgICAgfQorfQorCisKKworMDEwMTAwLDUuUlMsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpCRVFMCisiYmVxbCByPFJTPiwgcjxSVD4sIDxPRkZTRVQ+IgorKm1pcHNJSToKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBhZGRyZXNzX3dvcmQgb2Zmc2V0ID0gRVhURU5EMTYgKE9GRlNFVCkgPDwgMjsKKyAgY2hlY2tfYnJhbmNoX2J1ZyAoKTsKKyAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA9PSAoc2lnbmVkX3dvcmQpIEdQUltSVF0pCisgICAgeworICAgICAgbWFya19icmFuY2hfYnVnIChOSUErb2Zmc2V0KTsKKyAgICAgIERFTEFZX1NMT1QgKE5JQSArIG9mZnNldCk7CisgICAgfQorICBlbHNlCisgICAgTlVMTElGWV9ORVhUX0lOU1RSVUNUSU9OICgpOworfQorCisKKworMDAwMDAxLDUuUlMsMDAwMDEsMTYuT0ZGU0VUOlJFR0lNTTozMjo6QkdFWgorImJnZXogcjxSUz4sIDxPRkZTRVQ+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBhZGRyZXNzX3dvcmQgb2Zmc2V0ID0gRVhURU5EMTYgKE9GRlNFVCkgPDwgMjsKKyAgY2hlY2tfYnJhbmNoX2J1ZyAoKTsKKyAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA+PSAwKQorICAgIHsKKyAgICAgIG1hcmtfYnJhbmNoX2J1ZyAoTklBK29mZnNldCk7CisgICAgICBERUxBWV9TTE9UIChOSUEgKyBvZmZzZXQpOworICAgIH0KK30KKworCisKKzAwMDAwMSw1LlJTITMxLDEwMDAxLDE2Lk9GRlNFVDpSRUdJTU06MzI6OkJHRVpBTAorImJnZXphbCByPFJTPiwgPE9GRlNFVD4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGFkZHJlc3Nfd29yZCBvZmZzZXQgPSBFWFRFTkQxNiAoT0ZGU0VUKSA8PCAyOworICBjaGVja19icmFuY2hfYnVnICgpOworICBSQSA9IChDSUEgKyA4KTsKKyAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA+PSAwKQorICAgIHsKKyAgICAgIG1hcmtfYnJhbmNoX2J1ZyAoTklBK29mZnNldCk7CisgICAgICBERUxBWV9TTE9UIChOSUEgKyBvZmZzZXQpOworICAgIH0KK30KKworCisKKzAwMDAwMSw1LlJTITMxLDEwMDExLDE2Lk9GRlNFVDpSRUdJTU06MzI6OkJHRVpBTEwKKyJiZ2V6YWxsIHI8UlM+LCA8T0ZGU0VUPiIKKyptaXBzSUk6CisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgYWRkcmVzc193b3JkIG9mZnNldCA9IEVYVEVORDE2IChPRkZTRVQpIDw8IDI7CisgIGNoZWNrX2JyYW5jaF9idWcgKCk7CisgIFJBID0gKENJQSArIDgpOworICAvKiBOT1RFOiBUaGUgYnJhbmNoIG9jY3VycyBBRlRFUiB0aGUgbmV4dCBpbnN0cnVjdGlvbiBoYXMgYmVlbgorICAgICBleGVjdXRlZCAqLworICBpZiAoKHNpZ25lZF93b3JkKSBHUFJbUlNdID49IDApCisgICAgeworICAgICAgbWFya19icmFuY2hfYnVnIChOSUErb2Zmc2V0KTsKKyAgICAgIERFTEFZX1NMT1QgKE5JQSArIG9mZnNldCk7CisgICAgfQorICBlbHNlCisgICAgTlVMTElGWV9ORVhUX0lOU1RSVUNUSU9OICgpOworfQorCisKKworMDAwMDAxLDUuUlMsMDAwMTEsMTYuT0ZGU0VUOlJFR0lNTTozMjo6QkdFWkwKKyJiZ2V6bCByPFJTPiwgPE9GRlNFVD4iCisqbWlwc0lJOgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGFkZHJlc3Nfd29yZCBvZmZzZXQgPSBFWFRFTkQxNiAoT0ZGU0VUKSA8PCAyOworICBjaGVja19icmFuY2hfYnVnICgpOworICBpZiAoKHNpZ25lZF93b3JkKSBHUFJbUlNdID49IDApCisgICAgeworICAgICAgbWFya19icmFuY2hfYnVnIChOSUErb2Zmc2V0KTsKKyAgICAgIERFTEFZX1NMT1QgKE5JQSArIG9mZnNldCk7CisgICAgfQorICBlbHNlCisgICAgTlVMTElGWV9ORVhUX0lOU1RSVUNUSU9OICgpOworfQorCisKKworMDAwMTExLDUuUlMsMDAwMDAsMTYuT0ZGU0VUOk5PUk1BTDozMjo6QkdUWgorImJndHogcjxSUz4sIDxPRkZTRVQ+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBhZGRyZXNzX3dvcmQgb2Zmc2V0ID0gRVhURU5EMTYgKE9GRlNFVCkgPDwgMjsKKyAgY2hlY2tfYnJhbmNoX2J1ZyAoKTsKKyAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA+IDApCisgICAgeworICAgICAgbWFya19icmFuY2hfYnVnIChOSUErb2Zmc2V0KTsKKyAgICAgIERFTEFZX1NMT1QgKE5JQSArIG9mZnNldCk7CisgICAgfQorfQorCisKKworMDEwMTExLDUuUlMsMDAwMDAsMTYuT0ZGU0VUOk5PUk1BTDozMjo6QkdUWkwKKyJiZ3R6bCByPFJTPiwgPE9GRlNFVD4iCisqbWlwc0lJOgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGFkZHJlc3Nfd29yZCBvZmZzZXQgPSBFWFRFTkQxNiAoT0ZGU0VUKSA8PCAyOworICBjaGVja19icmFuY2hfYnVnICgpOworICAvKiBOT1RFOiBUaGUgYnJhbmNoIG9jY3VycyBBRlRFUiB0aGUgbmV4dCBpbnN0cnVjdGlvbiBoYXMgYmVlbgorICAgICBleGVjdXRlZCAqLworICBpZiAoKHNpZ25lZF93b3JkKSBHUFJbUlNdID4gMCkKKyAgICB7CisgICAgICBtYXJrX2JyYW5jaF9idWcgKE5JQStvZmZzZXQpOworICAgICAgREVMQVlfU0xPVCAoTklBICsgb2Zmc2V0KTsKKyAgICB9CisgIGVsc2UKKyAgICBOVUxMSUZZX05FWFRfSU5TVFJVQ1RJT04gKCk7Cit9CisKKworCiswMDAxMTAsNS5SUywwMDAwMCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpCTEVaCisiYmxleiByPFJTPiwgPE9GRlNFVD4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGFkZHJlc3Nfd29yZCBvZmZzZXQgPSBFWFRFTkQxNiAoT0ZGU0VUKSA8PCAyOworICBjaGVja19icmFuY2hfYnVnICgpOworICAvKiBOT1RFOiBUaGUgYnJhbmNoIG9jY3VycyBBRlRFUiB0aGUgbmV4dCBpbnN0cnVjdGlvbiBoYXMgYmVlbgorICAgICBleGVjdXRlZCAqLworICBpZiAoKHNpZ25lZF93b3JkKSBHUFJbUlNdIDw9IDApCisgICAgeworICAgICAgbWFya19icmFuY2hfYnVnIChOSUErb2Zmc2V0KTsKKyAgICAgIERFTEFZX1NMT1QgKE5JQSArIG9mZnNldCk7CisgICAgfQorfQorCisKKworMDEwMTEwLDUuUlMsMDAwMDAsMTYuT0ZGU0VUOk5PUk1BTDozMjo6QkxFWkwKKyJiZ2V6bCByPFJTPiwgPE9GRlNFVD4iCisqbWlwc0lJOgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGFkZHJlc3Nfd29yZCBvZmZzZXQgPSBFWFRFTkQxNiAoT0ZGU0VUKSA8PCAyOworICBjaGVja19icmFuY2hfYnVnICgpOworICBpZiAoKHNpZ25lZF93b3JkKSBHUFJbUlNdIDw9IDApCisgICAgeworICAgICAgbWFya19icmFuY2hfYnVnIChOSUErb2Zmc2V0KTsKKyAgICAgIERFTEFZX1NMT1QgKE5JQSArIG9mZnNldCk7CisgICAgfQorICBlbHNlCisgICAgTlVMTElGWV9ORVhUX0lOU1RSVUNUSU9OICgpOworfQorCisKKworMDAwMDAxLDUuUlMsMDAwMDAsMTYuT0ZGU0VUOlJFR0lNTTozMjo6QkxUWgorImJsdHogcjxSUz4sIDxPRkZTRVQ+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBhZGRyZXNzX3dvcmQgb2Zmc2V0ID0gRVhURU5EMTYgKE9GRlNFVCkgPDwgMjsKKyAgY2hlY2tfYnJhbmNoX2J1ZyAoKTsKKyAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA8IDApCisgICAgeworICAgICAgbWFya19icmFuY2hfYnVnIChOSUErb2Zmc2V0KTsKKyAgICAgIERFTEFZX1NMT1QgKE5JQSArIG9mZnNldCk7CisgICAgfQorfQorCisKKworMDAwMDAxLDUuUlMhMzEsMTAwMDAsMTYuT0ZGU0VUOlJFR0lNTTozMjo6QkxUWkFMCisiYmx0emFsIHI8UlM+LCA8T0ZGU0VUPiIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgYWRkcmVzc193b3JkIG9mZnNldCA9IEVYVEVORDE2IChPRkZTRVQpIDw8IDI7CisgIGNoZWNrX2JyYW5jaF9idWcgKCk7CisgIFJBID0gKENJQSArIDgpOworICAvKiBOT1RFOiBUaGUgYnJhbmNoIG9jY3VycyBBRlRFUiB0aGUgbmV4dCBpbnN0cnVjdGlvbiBoYXMgYmVlbgorICAgICBleGVjdXRlZCAqLworICBpZiAoKHNpZ25lZF93b3JkKSBHUFJbUlNdIDwgMCkKKyAgICB7CisgICAgICBtYXJrX2JyYW5jaF9idWcgKE5JQStvZmZzZXQpOworICAgICAgREVMQVlfU0xPVCAoTklBICsgb2Zmc2V0KTsKKyAgICB9Cit9CisKKworCiswMDAwMDEsNS5SUyEzMSwxMDAxMCwxNi5PRkZTRVQ6UkVHSU1NOjMyOjpCTFRaQUxMCisiYmx0emFsbCByPFJTPiwgPE9GRlNFVD4iCisqbWlwc0lJOgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGFkZHJlc3Nfd29yZCBvZmZzZXQgPSBFWFRFTkQxNiAoT0ZGU0VUKSA8PCAyOworICBjaGVja19icmFuY2hfYnVnICgpOworICBSQSA9IChDSUEgKyA4KTsKKyAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA8IDApCisgICAgeworICAgICAgbWFya19icmFuY2hfYnVnIChOSUErb2Zmc2V0KTsKKyAgICAgIERFTEFZX1NMT1QgKE5JQSArIG9mZnNldCk7CisgICAgfQorICBlbHNlCisgICAgTlVMTElGWV9ORVhUX0lOU1RSVUNUSU9OICgpOworfQorCisKKworMDAwMDAxLDUuUlMsMDAwMTAsMTYuT0ZGU0VUOlJFR0lNTTozMjo6QkxUWkwKKyJibHR6bCByPFJTPiwgPE9GRlNFVD4iCisqbWlwc0lJOgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGFkZHJlc3Nfd29yZCBvZmZzZXQgPSBFWFRFTkQxNiAoT0ZGU0VUKSA8PCAyOworICBjaGVja19icmFuY2hfYnVnICgpOworICAvKiBOT1RFOiBUaGUgYnJhbmNoIG9jY3VycyBBRlRFUiB0aGUgbmV4dCBpbnN0cnVjdGlvbiBoYXMgYmVlbgorICAgICBleGVjdXRlZCAqLworICBpZiAoKHNpZ25lZF93b3JkKSBHUFJbUlNdIDwgMCkKKyAgICB7CisgICAgICBtYXJrX2JyYW5jaF9idWcgKE5JQStvZmZzZXQpOworICAgICAgREVMQVlfU0xPVCAoTklBICsgb2Zmc2V0KTsKKyAgICB9CisgIGVsc2UKKyAgICBOVUxMSUZZX05FWFRfSU5TVFJVQ1RJT04gKCk7Cit9CisKKworCiswMDAxMDEsNS5SUyw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6MzI6OkJORQorImJuZSByPFJTPiwgcjxSVD4sIDxPRkZTRVQ+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBhZGRyZXNzX3dvcmQgb2Zmc2V0ID0gRVhURU5EMTYgKE9GRlNFVCkgPDwgMjsKKyAgY2hlY2tfYnJhbmNoX2J1ZyAoKTsKKyAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSAhPSAoc2lnbmVkX3dvcmQpIEdQUltSVF0pCisgICAgeworICAgICAgbWFya19icmFuY2hfYnVnIChOSUErb2Zmc2V0KTsKKyAgICAgIERFTEFZX1NMT1QgKE5JQSArIG9mZnNldCk7CisgICAgfQorfQorCisKKworMDEwMTAxLDUuUlMsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpCTkVMCisiYm5lbCByPFJTPiwgcjxSVD4sIDxPRkZTRVQ+IgorKm1pcHNJSToKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBhZGRyZXNzX3dvcmQgb2Zmc2V0ID0gRVhURU5EMTYgKE9GRlNFVCkgPDwgMjsKKyAgY2hlY2tfYnJhbmNoX2J1ZyAoKTsKKyAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSAhPSAoc2lnbmVkX3dvcmQpIEdQUltSVF0pCisgICAgeworICAgICAgbWFya19icmFuY2hfYnVnIChOSUErb2Zmc2V0KTsKKyAgICAgIERFTEFZX1NMT1QgKE5JQSArIG9mZnNldCk7CisgICAgfQorICBlbHNlCisgICAgTlVMTElGWV9ORVhUX0lOU1RSVUNUSU9OICgpOworfQorCisKKworMDAwMDAwLDIwLkNPREUsMDAxMTAxOlNQRUNJQUw6MzI6OkJSRUFLCisiYnJlYWsiCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIC8qIENoZWNrIGZvciBzb21lIGJyZWFrIGluc3RydWN0aW9uIHdoaWNoIGFyZSByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZSBzaW11bGF0b3IuICAqLworICB1bnNpZ25lZCBpbnQgYnJlYWtfY29kZSA9IGluc3RydWN0aW9uXzAgJiBIQUxUX0lOU1RSVUNUSU9OX01BU0s7CisgIGlmIChicmVha19jb2RlID09IChIQUxUX0lOU1RSVUNUSU9OICAmIEhBTFRfSU5TVFJVQ1RJT05fTUFTSykgfHwKKyAgICAgIGJyZWFrX2NvZGUgPT0gKEhBTFRfSU5TVFJVQ1RJT04yICYgSEFMVF9JTlNUUlVDVElPTl9NQVNLKSkKKyAgICB7CisgICAgICBzaW1fZW5naW5lX2hhbHQgKFNELCBDUFUsIE5VTEwsIGNpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2ltX2V4aXRlZCwgKHVuc2lnbmVkIGludCkoQTAgJiAweEZGRkZGRkZGKSk7CisgICAgfQorICBlbHNlIGlmIChicmVha19jb2RlID09IChCUkVBS1BPSU5UX0lOU1RSVUNUSU9OICAmIEhBTFRfSU5TVFJVQ1RJT05fTUFTSykgfHwKKyAgICAgICAgICAgYnJlYWtfY29kZSA9PSAoQlJFQUtQT0lOVF9JTlNUUlVDVElPTjIgJiBIQUxUX0lOU1RSVUNUSU9OX01BU0spKQorICAgIHsKKyAgICAgIGlmIChTVEFURSAmIHNpbURFTEFZU0xPVCkKKyAgICAgICAgUEMgPSBjaWEgLSA0OyAvKiByZWZlcmVuY2UgdGhlIGJyYW5jaCBpbnN0cnVjdGlvbiAqLworICAgICAgZWxzZQorICAgICAgICBQQyA9IGNpYTsKKyAgICAgIFNpZ25hbEV4Y2VwdGlvbihCcmVha1BvaW50LCBpbnN0cnVjdGlvbl8wKTsKKyAgICB9CisKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHdlIGdldCB0aGlzIGZhciwgd2UncmUgbm90IGFuIGluc3RydWN0aW9uIHJlc2VydmVkIGJ5IHRoZSBzaW0uICBSYWlzZSAKKwkgdGhlIGV4Y2VwdGlvbi4gKi8KKyAgICAgIFNpZ25hbEV4Y2VwdGlvbihCcmVha1BvaW50LCBpbnN0cnVjdGlvbl8wKTsKKyAgICB9Cit9CisKKworCisKKworCiswMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAsMTAxMTAwOlNQRUNJQUw6NjQ6OkRBREQKKyJkYWRkIHI8UkQ+LCByPFJTPiwgcjxSVD4iCisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKK3sKKyAgLyogdGhpcyBjaGVjaydzIGZvciBvdmVyZmxvdyAqLworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbUlNdLCBHUFJbUlRdKTsKKyAgeworICAgIEFMVTY0X0JFR0lOIChHUFJbUlNdKTsKKyAgICBBTFU2NF9BREQgKEdQUltSVF0pOworICAgIEFMVTY0X0VORCAoR1BSW1JEXSk7CisgIH0KKyAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW1JEXSk7Cit9CisKKworCiswMTEwMDAsNS5SUyw1LlJULDE2LklNTUVESUFURTpOT1JNQUw6NjQ6OkRBRERJCisiZGFkZGkgcjxSVD4sIHI8UlM+LCA8SU1NRURJQVRFPiIKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbUlNdLCBFWFRFTkQxNiAoSU1NRURJQVRFKSk7CisgIHsKKyAgICBBTFU2NF9CRUdJTiAoR1BSW1JTXSk7CisgICAgQUxVNjRfQUREIChFWFRFTkQxNiAoSU1NRURJQVRFKSk7CisgICAgQUxVNjRfRU5EIChHUFJbUlRdKTsKKyAgfQorICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbUlRdKTsKK30KKworCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fZGFkZGl1OmludCBycywgaW50IHJ0LCB1bnNpZ25lZDE2IGltbWVkaWF0ZQoreworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnNdLCBFWFRFTkQxNiAoaW1tZWRpYXRlKSk7CisgIEdQUltydF0gPSBHUFJbcnNdICsgRVhURU5EMTYgKGltbWVkaWF0ZSk7CisgIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltydF0pOworfQorCiswMTEwMDEsNS5SUyw1LlJULDE2LklNTUVESUFURTpOT1JNQUw6NjQ6OkRBRERJVQorImRhZGR1IHI8UlQ+LCByPFJTPiwgPElNTUVESUFURT4iCisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKK3sKKyAgZG9fZGFkZGl1IChTRF8sIFJTLCBSVCwgSU1NRURJQVRFKTsKK30KKworCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fZGFkZHU6aW50IHJzLCBpbnQgcnQsIGludCByZAoreworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnNdLCBHUFJbcnRdKTsKKyAgR1BSW3JkXSA9IEdQUltyc10gKyBHUFJbcnRdOworICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbcmRdKTsKK30KKworMDAwMDAwLDUuUlMsNS5SVCw1LlJELDAwMDAwLDEwMTEwMTpTUEVDSUFMOjY0OjpEQUREVQorImRhZGR1IHI8UkQ+LCByPFJTPiwgcjxSVD4iCisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKK3sKKyAgZG9fZGFkZHUgKFNEXywgUlMsIFJULCBSRCk7Cit9CisKKworCis6ZnVuY3Rpb246Ojp2b2lkOmRvX2RkaXY6aW50IHJzLCBpbnQgcnQKK3sKKyAgY2hlY2tfZGl2X2hpbG8gKFNEXywgSElISVNUT1JZLCBMT0hJU1RPUlkpOworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnNdLCBHUFJbcnRdKTsKKyAgeworICAgIHNpZ25lZDY0IG4gPSBHUFJbcnNdOworICAgIHNpZ25lZDY0IGQgPSBHUFJbcnRdOworICAgIHNpZ25lZDY0IGhpOworICAgIHNpZ25lZDY0IGxvOworICAgIGlmIChkID09IDApCisgICAgICB7CisJbG8gPSBTSUdORUQ2NCAoMHg4MDAwMDAwMDAwMDAwMDAwKTsKKwloaSA9IDA7CisgICAgICB9CisgICAgZWxzZSBpZiAoZCA9PSAtMSAmJiBuID09IFNJR05FRDY0ICgweDgwMDAwMDAwMDAwMDAwMDApKQorICAgICAgeworCWxvID0gU0lHTkVENjQgKDB4ODAwMDAwMDAwMDAwMDAwMCk7CisJaGkgPSAwOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwlsbyA9IChuIC8gZCk7CisJaGkgPSAobiAlIGQpOworICAgICAgfQorICAgIEhJID0gaGk7CisgICAgTE8gPSBsbzsKKyAgfQorICBUUkFDRV9BTFVfUkVTVUxUMiAoSEksIExPKTsKK30KKworMDAwMDAwLDUuUlMsNS5SVCwwMDAwMDAwMDAwMDExMTEwOlNQRUNJQUw6NjQ6OkRESVYKKyJkZGl2IHI8UlM+LCByPFJUPiIKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICBkb19kZGl2IChTRF8sIFJTLCBSVCk7Cit9CisKKworCis6ZnVuY3Rpb246Ojp2b2lkOmRvX2RkaXZ1OmludCBycywgaW50IHJ0Cit7CisgIGNoZWNrX2Rpdl9oaWxvIChTRF8sIEhJSElTVE9SWSwgTE9ISVNUT1JZKTsKKyAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3JzXSwgR1BSW3J0XSk7CisgIHsKKyAgICB1bnNpZ25lZDY0IG4gPSBHUFJbcnNdOworICAgIHVuc2lnbmVkNjQgZCA9IEdQUltydF07CisgICAgdW5zaWduZWQ2NCBoaTsKKyAgICB1bnNpZ25lZDY0IGxvOworICAgIGlmIChkID09IDApCisgICAgICB7CisJbG8gPSBTSUdORUQ2NCAoMHg4MDAwMDAwMDAwMDAwMDAwKTsKKwloaSA9IDA7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCWxvID0gKG4gLyBkKTsKKwloaSA9IChuICUgZCk7CisgICAgICB9CisgICAgSEkgPSBoaTsKKyAgICBMTyA9IGxvOworICB9CisgIFRSQUNFX0FMVV9SRVNVTFQyIChISSwgTE8pOworfQorCiswMDAwMDAsNS5SUyw1LlJULDAwMDAwMDAwMDAsMDExMTExOlNQRUNJQUw6NjQ6OkRESVZVCisiZGRpdnUgcjxSUz4sIHI8UlQ+IgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6Cit7CisgIGRvX2RkaXZ1IChTRF8sIFJTLCBSVCk7Cit9CisKKworCis6ZnVuY3Rpb246Ojp2b2lkOmRvX2RpdjppbnQgcnMsIGludCBydAoreworICBjaGVja19kaXZfaGlsbyAoU0RfLCBISUhJU1RPUlksIExPSElTVE9SWSk7CisgIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltyc10sIEdQUltydF0pOworICB7CisgICAgc2lnbmVkMzIgbiA9IEdQUltyc107CisgICAgc2lnbmVkMzIgZCA9IEdQUltydF07CisgICAgaWYgKGQgPT0gMCkKKyAgICAgIHsKKwlMTyA9IEVYVEVORDMyICgweDgwMDAwMDAwKTsKKwlISSA9IEVYVEVORDMyICgwKTsKKyAgICAgIH0KKyAgICBlbHNlIGlmIChuID09IFNJR05FRDMyICgweDgwMDAwMDAwKSAmJiBkID09IC0xKQorICAgICAgeworCUxPID0gRVhURU5EMzIgKDB4ODAwMDAwMDApOworCUhJID0gRVhURU5EMzIgKDApOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwlMTyA9IEVYVEVORDMyIChuIC8gZCk7CisJSEkgPSBFWFRFTkQzMiAobiAlIGQpOworICAgICAgfQorICB9CisgIFRSQUNFX0FMVV9SRVNVTFQyIChISSwgTE8pOworfQorCiswMDAwMDAsNS5SUyw1LlJULDAwMDAwMDAwMDAwMTEwMTA6U1BFQ0lBTDozMjo6RElWCisiZGl2IHI8UlM+LCByPFJUPiIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgZG9fZGl2IChTRF8sIFJTLCBSVCk7Cit9CisKKworCis6ZnVuY3Rpb246Ojp2b2lkOmRvX2RpdnU6aW50IHJzLCBpbnQgcnQKK3sKKyAgY2hlY2tfZGl2X2hpbG8gKFNEXywgSElISVNUT1JZLCBMT0hJU1RPUlkpOworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnNdLCBHUFJbcnRdKTsKKyAgeworICAgIHVuc2lnbmVkMzIgbiA9IEdQUltyc107CisgICAgdW5zaWduZWQzMiBkID0gR1BSW3J0XTsKKyAgICBpZiAoZCA9PSAwKQorICAgICAgeworCUxPID0gRVhURU5EMzIgKDB4ODAwMDAwMDApOworCUhJID0gRVhURU5EMzIgKDApOworICAgICAgfQorICAgZWxzZQorICAgICB7CisgICAgICAgTE8gPSBFWFRFTkQzMiAobiAvIGQpOworICAgICAgIEhJID0gRVhURU5EMzIgKG4gJSBkKTsKKyAgICAgfQorICB9CisgIFRSQUNFX0FMVV9SRVNVTFQyIChISSwgTE8pOworfQorCiswMDAwMDAsNS5SUyw1LlJULDAwMDAwMDAwMDAwMTEwMTE6U1BFQ0lBTDozMjo6RElWVQorImRpdnUgcjxSUz4sIHI8UlQ+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBkb19kaXZ1IChTRF8sIFJTLCBSVCk7Cit9CisKKworCis6ZnVuY3Rpb246Ojp2b2lkOmRvX2RtdWx0eDppbnQgcnMsIGludCBydCwgaW50IHJkLCBpbnQgc2lnbmVkX3AKK3sKKyAgdW5zaWduZWQ2NCBsbzsKKyAgdW5zaWduZWQ2NCBoaTsKKyAgdW5zaWduZWQ2NCBtMDA7CisgIHVuc2lnbmVkNjQgbTAxOworICB1bnNpZ25lZDY0IG0xMDsKKyAgdW5zaWduZWQ2NCBtMTE7CisgIHVuc2lnbmVkNjQgbWlkOworICBpbnQgc2lnbjsKKyAgdW5zaWduZWQ2NCBvcDEgPSBHUFJbcnNdOworICB1bnNpZ25lZDY0IG9wMiA9IEdQUltydF07CisgIGNoZWNrX211bHRfaGlsbyAoU0RfLCBISUhJU1RPUlksIExPSElTVE9SWSk7CisgIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltyc10sIEdQUltydF0pOworICAvKiBtYWtlIHNpZ25lZCBtdWx0aXBseSB1bnNpZ25lZCAqLyAKKyAgc2lnbiA9IDA7CisgIGlmIChzaWduZWRfcCkKKyAgICB7CisgICAgICBpZiAob3AxIDwgMCkKKwl7CisJICBvcDEgPSAtIG9wMTsKKwkgICsrc2lnbjsKKwl9CisgICAgICBpZiAob3AyIDwgMCkKKwl7CisJICBvcDIgPSAtIG9wMjsKKwkgICsrc2lnbjsKKwl9CisgICAgfQorICAvKiBtdWx0dXBseSBvdXQgdGhlIDQgc3ViIHByb2R1Y3RzICovCisgIG0wMCA9ICgodW5zaWduZWQ2NCkgVkw0XzggKG9wMSkgKiAodW5zaWduZWQ2NCkgVkw0XzggKG9wMikpOworICBtMTAgPSAoKHVuc2lnbmVkNjQpIFZINF84IChvcDEpICogKHVuc2lnbmVkNjQpIFZMNF84IChvcDIpKTsKKyAgbTAxID0gKCh1bnNpZ25lZDY0KSBWTDRfOCAob3AxKSAqICh1bnNpZ25lZDY0KSBWSDRfOCAob3AyKSk7CisgIG0xMSA9ICgodW5zaWduZWQ2NCkgVkg0XzggKG9wMSkgKiAodW5zaWduZWQ2NCkgVkg0XzggKG9wMikpOworICAvKiBhZGQgdGhlIHByb2R1Y3RzICovCisgIG1pZCA9ICgodW5zaWduZWQ2NCkgVkg0XzggKG0wMCkKKwkgKyAodW5zaWduZWQ2NCkgVkw0XzggKG0xMCkKKwkgKyAodW5zaWduZWQ2NCkgVkw0XzggKG0wMSkpOworICBsbyA9IFU4XzQgKG1pZCwgbTAwKTsKKyAgaGkgPSAobTExCisJKyAodW5zaWduZWQ2NCkgVkg0XzggKG1pZCkKKwkrICh1bnNpZ25lZDY0KSBWSDRfOCAobTAxKQorCSsgKHVuc2lnbmVkNjQpIFZINF84IChtMTApKTsKKyAgLyogZml4IHRoZSBzaWduICovCisgIGlmIChzaWduICYgMSkKKyAgICB7CisgICAgICBsbyA9IC1sbzsKKyAgICAgIGlmIChsbyA9PSAwKQorCWhpID0gLWhpOworICAgICAgZWxzZQorCWhpID0gLWhpIC0gMTsKKyAgICB9CisgIC8qIHNhdmUgdGhlIHJlc3VsdCBISS9MTyAoYW5kIGEgZ3ByKSAqLworICBMTyA9IGxvOworICBISSA9IGhpOworICBpZiAocmQgIT0gMCkKKyAgICBHUFJbcmRdID0gbG87CisgIFRSQUNFX0FMVV9SRVNVTFQyIChISSwgTE8pOworfQorCis6ZnVuY3Rpb246Ojp2b2lkOmRvX2RtdWx0OmludCBycywgaW50IHJ0LCBpbnQgcmQKK3sKKyAgZG9fZG11bHR4IChTRF8sIHJzLCBydCwgcmQsIDEpOworfQorCiswMDAwMDAsNS5SUyw1LlJULDAwMDAwMDAwMDAwMTExMDA6U1BFQ0lBTDo2NDo6RE1VTFQKKyJkbXVsdCByPFJTPiwgcjxSVD4iCisqbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgoreworICBkb19kbXVsdCAoU0RfLCBSUywgUlQsIDApOworfQorCiswMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAwMTExMDA6U1BFQ0lBTDo2NDo6RE1VTFQKKyJkbXVsdCByPFJTPiwgcjxSVD4iOlJEID09IDAKKyJkbXVsdCByPFJEPiwgcjxSUz4sIHI8UlQ+IgorKnZyNTAwMDoKK3sKKyAgZG9fZG11bHQgKFNEXywgUlMsIFJULCBSRCk7Cit9CisKKworCis6ZnVuY3Rpb246Ojp2b2lkOmRvX2RtdWx0dTppbnQgcnMsIGludCBydCwgaW50IHJkCit7CisgIGRvX2RtdWx0eCAoU0RfLCBycywgcnQsIHJkLCAwKTsKK30KKworMDAwMDAwLDUuUlMsNS5SVCwwMDAwMDAwMDAwMDExMTAxOlNQRUNJQUw6NjQ6OkRNVUxUVQorImRtdWx0dSByPFJTPiwgcjxSVD4iCisqbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgoreworICBkb19kbXVsdHUgKFNEXywgUlMsIFJULCAwKTsKK30KKworMDAwMDAwLDUuUlMsNS5SVCw1LlJELDAwMDAwMDExMTAxOlNQRUNJQUw6NjQ6OkRNVUxUVQorImRtdWx0dSByPFJEPiwgcjxSUz4sIHI8UlQ+IjpSRCA9PSAwCisiZG11bHR1IHI8UlM+LCByPFJUPiIKKyp2cjUwMDA6Cit7CisgIGRvX2RtdWx0dSAoU0RfLCBSUywgUlQsIFJEKTsKK30KKworOmZ1bmN0aW9uOjo6dm9pZDpkb19kc2xsOmludCBydCwgaW50IHJkLCBpbnQgc2hpZnQKK3sKKyAgR1BSW3JkXSA9IEdQUltydF0gPDwgc2hpZnQ7Cit9CisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fZHNsbHY6aW50IHJzLCBpbnQgcnQsIGludCByZAoreworICBpbnQgcyA9IE1BU0tFRDY0IChHUFJbcnNdLCA1LCAwKTsKKyAgR1BSW3JkXSA9IEdQUltydF0gPDwgczsKK30KKworCiswMDAwMDAwMDAwMCw1LlJULDUuUkQsNS5TSElGVCwxMTEwMDA6U1BFQ0lBTDo2NDo6RFNMTAorImRzbGwgcjxSRD4sIHI8UlQ+LCA8U0hJRlQ+IgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6Cit7CisgIGRvX2RzbGwgKFNEXywgUlQsIFJELCBTSElGVCk7Cit9CisKKworMDAwMDAwMDAwMDAsNS5SVCw1LlJELDUuU0hJRlQsMTExMTAwOlNQRUNJQUw6NjQ6OkRTTEwzMgorImRzbGwzMiByPFJEPiwgcjxSVD4sIDxTSElGVD4iCisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKK3sKKyAgaW50IHMgPSAzMiArIFNISUZUOworICBHUFJbUkRdID0gR1BSW1JUXSA8PCBzOworfQorCiswMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAwMTAxMDA6U1BFQ0lBTDo2NDo6RFNMTFYKKyJkc2xsdiByPFJEPiwgcjxSVD4sIHI8UlM+IgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6Cit7CisgIGRvX2RzbGx2IChTRF8sIFJTLCBSVCwgUkQpOworfQorCis6ZnVuY3Rpb246Ojp2b2lkOmRvX2RzcmE6aW50IHJ0LCBpbnQgcmQsIGludCBzaGlmdAoreworICBHUFJbcmRdID0gKChzaWduZWQ2NCkgR1BSW3J0XSkgPj4gc2hpZnQ7Cit9CisKKworMDAwMDAwMDAwMDAsNS5SVCw1LlJELDUuU0hJRlQsMTExMDExOlNQRUNJQUw6NjQ6OkRTUkEKKyJkc3JhIHI8UkQ+LCByPFJUPiwgPFNISUZUPiIKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICBkb19kc3JhIChTRF8sIFJULCBSRCwgU0hJRlQpOworfQorCisKKzAwMDAwMDAwMDAwLDUuUlQsNS5SRCw1LlNISUZULDExMTExMTpTUEVDSUFMOjY0OjpEU1JBMzIKKyJkc3JhMzIgcjxSVD4sIHI8UkQ+LCA8U0hJRlQ+IgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6Cit7CisgIGludCBzID0gMzIgKyBTSElGVDsKKyAgR1BSW1JEXSA9ICgoc2lnbmVkNjQpIEdQUltSVF0pID4+IHM7Cit9CisKKworOmZ1bmN0aW9uOjo6dm9pZDpkb19kc3JhdjppbnQgcnMsIGludCBydCwgaW50IHJkCit7CisgIGludCBzID0gTUFTS0VENjQgKEdQUltyc10sIDUsIDApOworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnRdLCBzKTsKKyAgR1BSW3JkXSA9ICgoc2lnbmVkNjQpIEdQUltydF0pID4+IHM7CisgIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltyZF0pOworfQorCiswMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAwMTAxMTE6U1BFQ0lBTDo2NDo6RFNSQVYKKyJkc3JhMzIgcjxSVD4sIHI8UkQ+LCByPFJTPiIKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICBkb19kc3JhdiAoU0RfLCBSUywgUlQsIFJEKTsKK30KKworOmZ1bmN0aW9uOjo6dm9pZDpkb19kc3JsOmludCBydCwgaW50IHJkLCBpbnQgc2hpZnQKK3sKKyAgR1BSW3JkXSA9ICh1bnNpZ25lZDY0KSBHUFJbcnRdID4+IHNoaWZ0OworfQorCisKKzAwMDAwMDAwMDAwLDUuUlQsNS5SRCw1LlNISUZULDExMTAxMDpTUEVDSUFMOjY0OjpEU1JMCisiZHNybCByPFJEPiwgcjxSVD4sIDxTSElGVD4iCisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKK3sKKyAgZG9fZHNybCAoU0RfLCBSVCwgUkQsIFNISUZUKTsKK30KKworCiswMDAwMDAwMDAwMCw1LlJULDUuUkQsNS5TSElGVCwxMTExMTA6U1BFQ0lBTDo2NDo6RFNSTDMyCisiZHNybDMyIHI8UkQ+LCByPFJUPiwgPFNISUZUPiIKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICBpbnQgcyA9IDMyICsgU0hJRlQ7CisgIEdQUltSRF0gPSAodW5zaWduZWQ2NCkgR1BSW1JUXSA+PiBzOworfQorCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fZHNybHY6aW50IHJzLCBpbnQgcnQsIGludCByZAoreworICBpbnQgcyA9IE1BU0tFRDY0IChHUFJbcnNdLCA1LCAwKTsKKyAgR1BSW3JkXSA9ICh1bnNpZ25lZDY0KSBHUFJbcnRdID4+IHM7Cit9CisKKworCiswMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAwMTAxMTA6U1BFQ0lBTDo2NDo6RFNSTFYKKyJkc3JsMzIgcjxSRD4sIHI8UlQ+LCByPFJTPiIKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICBkb19kc3JsdiAoU0RfLCBSUywgUlQsIFJEKTsKK30KKworCiswMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAxMDExMTA6U1BFQ0lBTDo2NDo6RFNVQgorImRzdWIgcjxSRD4sIHI8UlM+LCByPFJUPiIKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbUlNdLCBHUFJbUlRdKTsKKyAgeworICAgIEFMVTY0X0JFR0lOIChHUFJbUlNdKTsKKyAgICBBTFU2NF9TVUIgKEdQUltSVF0pOworICAgIEFMVTY0X0VORCAoR1BSW1JEXSk7CisgIH0KKyAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW1JEXSk7Cit9CisKKworOmZ1bmN0aW9uOjo6dm9pZDpkb19kc3VidTppbnQgcnMsIGludCBydCwgaW50IHJkCit7CisgIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltyc10sIEdQUltydF0pOworICBHUFJbcmRdID0gR1BSW3JzXSAtIEdQUltydF07CisgIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltyZF0pOworfQorCiswMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAxMDExMTE6U1BFQ0lBTDo2NDo6RFNVQlUKKyJkc3VidSByPFJEPiwgcjxSUz4sIHI8UlQ+IgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6Cit7CisgIGRvX2RzdWJ1IChTRF8sIFJTLCBSVCwgUkQpOworfQorCisKKzAwMDAxMCwyNi5JTlNUUl9JTkRFWDpOT1JNQUw6MzI6OkoKKyJqIDxJTlNUUl9JTkRFWD4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIC8qIE5PVEU6IFRoZSByZWdpb24gdXNlZCBpcyB0aGF0IG9mIHRoZSBkZWxheSBzbG90IE5JQSBhbmQgTk9UIHRoZQorICAgICBjdXJyZW50IGluc3RydWN0aW9uICovCisgIGFkZHJlc3Nfd29yZCByZWdpb24gPSAoTklBICYgTUFTSyAoNjMsIDI4KSk7CisgIERFTEFZX1NMT1QgKHJlZ2lvbiB8IChJTlNUUl9JTkRFWCA8PCAyKSk7Cit9CisKKworMDAwMDExLDI2LklOU1RSX0lOREVYOk5PUk1BTDozMjo6SkFMCisiamFsIDxJTlNUUl9JTkRFWD4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIC8qIE5PVEU6IFRoZSByZWdpb24gdXNlZCBpcyB0aGF0IG9mIHRoZSBkZWxheSBzbG90IGFuZCBOT1QgdGhlCisgICAgIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gKi8KKyAgYWRkcmVzc193b3JkIHJlZ2lvbiA9IChOSUEgJiBNQVNLICg2MywgMjgpKTsKKyAgR1BSWzMxXSA9IENJQSArIDg7CisgIERFTEFZX1NMT1QgKHJlZ2lvbiB8IChJTlNUUl9JTkRFWCA8PCAyKSk7Cit9CisKKzAwMDAwMCw1LlJTLDAwMDAwLDUuUkQsMDAwMDAwMDEwMDE6U1BFQ0lBTDozMjo6SkFMUgorImphbHIgcjxSUz4iOlJEID09IDMxCisiamFsciByPFJEPiwgcjxSUz4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGFkZHJlc3Nfd29yZCB0ZW1wID0gR1BSW1JTXTsKKyAgR1BSW1JEXSA9IENJQSArIDg7CisgIERFTEFZX1NMT1QgKHRlbXApOworfQorCisKKzAwMDAwMCw1LlJTLDAwMDAwMDAwMDAwMDAwMDAwMTAwMDpTUEVDSUFMOjMyOjpKUgorImpyIHI8UlM+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBERUxBWV9TTE9UIChHUFJbUlNdKTsKK30KKworCis6ZnVuY3Rpb246Ojp1bnNpZ25lZF93b3JkOmRvX2xvYWQ6dW5zaWduZWQgYWNjZXNzLCBhZGRyZXNzX3dvcmQgYmFzZSwgYWRkcmVzc193b3JkIG9mZnNldAoreworICBhZGRyZXNzX3dvcmQgbWFzayA9IChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQgPyAweDcgOiAweDMpOworICBhZGRyZXNzX3dvcmQgcmV2ZXJzZWVuZGlhbiA9IChSZXZlcnNlRW5kaWFuID8gKG1hc2sgXiBhY2Nlc3MpIDogMCk7CisgIGFkZHJlc3Nfd29yZCBiaWdlbmRpYW5jcHUgPSAoQmlnRW5kaWFuQ1BVID8gKG1hc2sgXiBhY2Nlc3MpIDogMCk7CisgIHVuc2lnbmVkIGludCBieXRlOworICBhZGRyZXNzX3dvcmQgcGFkZHI7CisgIGludCB1bmNhY2hlZDsKKyAgdW5zaWduZWQ2NCBtZW12YWw7CisgIGFkZHJlc3Nfd29yZCB2YWRkcjsKKworICB2YWRkciA9IGJhc2UgKyBvZmZzZXQ7CisgIGlmICgodmFkZHIgJiBhY2Nlc3MpICE9IDApCisgICAgeworICAgICAgU0lNX0NPUkVfU0lHTkFMIChTRCwgU1RBVEVfQ1BVIChTRCwgMCksIGNpYSwgcmVhZF9tYXAsIGFjY2VzcysxLCB2YWRkciwgcmVhZF90cmFuc2Zlciwgc2ltX2NvcmVfdW5hbGlnbmVkX3NpZ25hbCk7CisgICAgfQorICBBZGRyZXNzVHJhbnNsYXRpb24gKHZhZGRyLCBpc0RBVEEsIGlzTE9BRCwgJnBhZGRyLCAmdW5jYWNoZWQsIGlzVEFSR0VULCBpc1JFQUwpOworICBwYWRkciA9ICgocGFkZHIgJiB+bWFzaykgfCAoKHBhZGRyICYgbWFzaykgXiByZXZlcnNlZW5kaWFuKSk7CisgIExvYWRNZW1vcnkgKCZtZW12YWwsIE5VTEwsIHVuY2FjaGVkLCBhY2Nlc3MsIHBhZGRyLCB2YWRkciwgaXNEQVRBLCBpc1JFQUwpOworICBieXRlID0gKCh2YWRkciAmIG1hc2spIF4gYmlnZW5kaWFuY3B1KTsKKyAgcmV0dXJuIChtZW12YWwgPj4gKDggKiBieXRlKSk7Cit9CisKKworMTAwMDAwLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6MzI6OkxCCisibGIgcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBHUFJbUlRdID0gRVhURU5EOCAoZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfQllURSwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSkpOworfQorCisKKzEwMDEwMCw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpMQlUKKyJsYnUgcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBHUFJbUlRdID0gZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfQllURSwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSk7Cit9CisKKworMTEwMTExLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6NjQ6OkxECisibGQgcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6Cit7CisgIEdQUltSVF0gPSBFWFRFTkQ2NCAoZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSkpOworfQorCisKKzExMDEsWlohMCExITMsNS5CQVNFLDUuUlQsMTYuT0ZGU0VUOk5PUk1BTDo2NDo6TERDegorImxkYzxaWj4gcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgorKm1pcHNJSToKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBDT1BfTEQgKFpaLCBSVCwgZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSkpOworfQorCisKKworCiswMTEwMTAsNS5CQVNFLDUuUlQsMTYuT0ZGU0VUOk5PUk1BTDo2NDo6TERMCisibGRsIHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICBHUFJbUlRdID0gZG9fbG9hZF9sZWZ0IChTRF8sIEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JELCBHUFJbQkFTRV0sIEVYVEVORDE2IChPRkZTRVQpLCBHUFJbUlRdKTsKK30KKworCiswMTEwMTEsNS5CQVNFLDUuUlQsMTYuT0ZGU0VUOk5PUk1BTDo2NDo6TERSCisibGRyIHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICBHUFJbUlRdID0gZG9fbG9hZF9yaWdodCAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSwgR1BSW1JUXSk7Cit9CisKKworMTAwMDAxLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6MzI6OkxICisibGggcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBHUFJbUlRdID0gRVhURU5EMTYgKGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX0hBTEZXT1JELCBHUFJbQkFTRV0sIEVYVEVORDE2IChPRkZTRVQpKSk7Cit9CisKKworMTAwMTAxLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6MzI6OkxIVQorImxodSByPFJUPiwgPE9GRlNFVD4ocjxCQVNFPikiCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIEdQUltSVF0gPSBkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9IQUxGV09SRCwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSk7Cit9CisKKworMTEwMDAwLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6MzI6OkxMCisibGwgcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgorKm1pcHNJSToKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKKyAgc2lnbmVkX3dvcmQgb2Zmc2V0ID0gU0lHTkVYVEVORCgoc2lnbmVkX3dvcmQpKChpbnN0cnVjdGlvbiA+PiAwKSAmIDB4MDAwMEZGRkYpLDE2KTsKKyAgaW50IGRlc3RyZWcgPSAoKGluc3RydWN0aW9uID4+IDE2KSAmIDB4MDAwMDAwMUYpOworICBzaWduZWRfd29yZCBvcDEgPSBHUFJbKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDFGKV07CisgIHsKKyAgICBhZGRyZXNzX3dvcmQgdmFkZHIgPSAoKHVuc2lnbmVkNjQpb3AxICsgb2Zmc2V0KTsKKyAgICBhZGRyZXNzX3dvcmQgcGFkZHI7CisgICAgaW50IHVuY2FjaGVkOworICAgIGlmICgodmFkZHIgJiAzKSAhPSAwKQorICAgICAgeworICAgICAgICBTSU1fQ09SRV9TSUdOQUwgKFNELCBDUFUsIGNpYSwgcmVhZF9tYXAsIDQsIHZhZGRyLCByZWFkX3RyYW5zZmVyLCBzaW1fY29yZV91bmFsaWduZWRfc2lnbmFsKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJaWYgKEFkZHJlc3NUcmFuc2xhdGlvbih2YWRkcixpc0RBVEEsaXNMT0FELCZwYWRkciwmdW5jYWNoZWQsaXNUQVJHRVQsaXNSRUFMKSkKKwkgIHsKKwkgICAgdW5zaWduZWQ2NCBtZW12YWwgPSAwOworCSAgICB1bnNpZ25lZDY0IG1lbXZhbDEgPSAwOworCSAgICB1bnNpZ25lZDY0IG1hc2sgPSAweDc7CisJICAgIHVuc2lnbmVkIGludCBzaGlmdCA9IDI7CisJICAgIHVuc2lnbmVkIGludCByZXZlcnNlID0gKFJldmVyc2VFbmRpYW4gPyAobWFzayA+PiBzaGlmdCkgOiAwKTsKKwkgICAgdW5zaWduZWQgaW50IGJpZ2VuZCA9IChCaWdFbmRpYW5DUFUgPyAobWFzayA+PiBzaGlmdCkgOiAwKTsKKwkgICAgdW5zaWduZWQgaW50IGJ5dGU7CisJICAgIHBhZGRyID0gKChwYWRkciAmIH5tYXNrKSB8ICgocGFkZHIgJiBtYXNrKSBeIChyZXZlcnNlIDw8IHNoaWZ0KSkpOworCSAgICBMb2FkTWVtb3J5KCZtZW12YWwsJm1lbXZhbDEsdW5jYWNoZWQsQWNjZXNzTGVuZ3RoX1dPUkQscGFkZHIsdmFkZHIsaXNEQVRBLGlzUkVBTCk7CisJICAgIGJ5dGUgPSAoKHZhZGRyICYgbWFzaykgXiAoYmlnZW5kIDw8IHNoaWZ0KSk7CisJICAgIEdQUltkZXN0cmVnXSA9IChTSUdORVhURU5EKCgobWVtdmFsID4+ICg4ICogYnl0ZSkpICYgMHhGRkZGRkZGRiksMzIpKTsKKwkgICAgTExCSVQgPSAxOworCSAgfQorICAgICAgfQorICB9Cit9CisKKworMTEwMTAwLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6NjQ6OkxMRAorImxsZCByPFJUPiwgPE9GRlNFVD4ocjxCQVNFPikiCisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIHNpZ25lZF93b3JkIG9mZnNldCA9IFNJR05FWFRFTkQoKHNpZ25lZF93b3JkKSgoaW5zdHJ1Y3Rpb24gPj4gMCkgJiAweDAwMDBGRkZGKSwxNik7CisgIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGKTsKKyAgc2lnbmVkX3dvcmQgb3AxID0gR1BSWygoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAxRildOworICB7CisgICAgYWRkcmVzc193b3JkIHZhZGRyID0gKCh1bnNpZ25lZDY0KW9wMSArIG9mZnNldCk7CisgICAgYWRkcmVzc193b3JkIHBhZGRyOworICAgIGludCB1bmNhY2hlZDsKKyAgICBpZiAoKHZhZGRyICYgNykgIT0gMCkKKyAgICAgIHsKKwlTSU1fQ09SRV9TSUdOQUwgKFNELCBDUFUsIGNpYSwgcmVhZF9tYXAsIDgsIHZhZGRyLCByZWFkX3RyYW5zZmVyLCBzaW1fY29yZV91bmFsaWduZWRfc2lnbmFsKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJaWYgKEFkZHJlc3NUcmFuc2xhdGlvbih2YWRkcixpc0RBVEEsaXNMT0FELCZwYWRkciwmdW5jYWNoZWQsaXNUQVJHRVQsaXNSRUFMKSkKKwkgIHsKKwkgICAgdW5zaWduZWQ2NCBtZW12YWwgPSAwOworCSAgICB1bnNpZ25lZDY0IG1lbXZhbDEgPSAwOworCSAgICBMb2FkTWVtb3J5KCZtZW12YWwsJm1lbXZhbDEsdW5jYWNoZWQsQWNjZXNzTGVuZ3RoX0RPVUJMRVdPUkQscGFkZHIsdmFkZHIsaXNEQVRBLGlzUkVBTCk7CisJICAgIEdQUltkZXN0cmVnXSA9IG1lbXZhbDsKKwkgICAgTExCSVQgPSAxOworCSAgfQorICAgICAgfQorICB9Cit9CisKKworMDAxMTExLDAwMDAwLDUuUlQsMTYuSU1NRURJQVRFOk5PUk1BTDozMjo6TFVJCisibHVpIHI8UlQ+LCA8SU1NRURJQVRFPiIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgVFJBQ0VfQUxVX0lOUFVUMSAoSU1NRURJQVRFKTsKKyAgR1BSW1JUXSA9IEVYVEVORDMyIChJTU1FRElBVEUgPDwgMTYpOworICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbUlRdKTsKK30KKworCisxMDAwMTEsNS5CQVNFLDUuUlQsMTYuT0ZGU0VUOk5PUk1BTDozMjo6TFcKKyJsdyByPFJUPiwgPE9GRlNFVD4ocjxCQVNFPikiCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIEdQUltSVF0gPSBFWFRFTkQzMiAoZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfV09SRCwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSkpOworfQorCisKKzExMDAsWlohMCExITMsNS5CQVNFLDUuUlQsMTYuT0ZGU0VUOk5PUk1BTDozMjo6TFdDegorImx3YzxaWj4gcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBDT1BfTFcgKFpaLCBSVCwgZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfV09SRCwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSkpOworfQorCisKKzpmdW5jdGlvbjo6OnVuc2lnbmVkX3dvcmQ6ZG9fbG9hZF9sZWZ0OnVuc2lnbmVkIGFjY2VzcywgYWRkcmVzc193b3JkIGJhc2UsIGFkZHJlc3Nfd29yZCBvZmZzZXQsIHVuc2lnbmVkX3dvcmQgcnQKK3sKKyAgYWRkcmVzc193b3JkIG1hc2sgPSAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0ID8gMHg3IDogMHgzKTsKKyAgYWRkcmVzc193b3JkIHJldmVyc2VlbmRpYW4gPSAoUmV2ZXJzZUVuZGlhbiA/IC0xIDogMCk7CisgIGFkZHJlc3Nfd29yZCBiaWdlbmRpYW5jcHUgPSAoQmlnRW5kaWFuQ1BVID8gLTEgOiAwKTsKKyAgdW5zaWduZWQgaW50IGJ5dGU7CisgIHVuc2lnbmVkIGludCB3b3JkOworICBhZGRyZXNzX3dvcmQgcGFkZHI7CisgIGludCB1bmNhY2hlZDsKKyAgdW5zaWduZWQ2NCBtZW12YWw7CisgIGFkZHJlc3Nfd29yZCB2YWRkcjsKKyAgaW50IG5yX2xoc19iaXRzOworICBpbnQgbnJfcmhzX2JpdHM7CisgIHVuc2lnbmVkX3dvcmQgbGhzX21hc2s7CisgIHVuc2lnbmVkX3dvcmQgdGVtcDsKKworICB2YWRkciA9IGJhc2UgKyBvZmZzZXQ7CisgIEFkZHJlc3NUcmFuc2xhdGlvbiAodmFkZHIsIGlzREFUQSwgaXNMT0FELCAmcGFkZHIsICZ1bmNhY2hlZCwgaXNUQVJHRVQsIGlzUkVBTCk7CisgIHBhZGRyID0gKHBhZGRyIF4gKHJldmVyc2VlbmRpYW4gJiBtYXNrKSk7CisgIGlmIChCaWdFbmRpYW5NZW0gPT0gMCkKKyAgICBwYWRkciA9IHBhZGRyICYgfmFjY2VzczsKKworICAvKiBjb21wdXRlIHdoZXJlIHdpdGhpbiB0aGUgd29yZC9tZW0gd2UgYXJlICovCisgIGJ5dGUgPSAoKHZhZGRyIF4gYmlnZW5kaWFuY3B1KSAmIGFjY2Vzcyk7IC8qIDAuLmFjY2VzcyAqLworICB3b3JkID0gKCh2YWRkciBeIGJpZ2VuZGlhbmNwdSkgJiAobWFzayAmIH5hY2Nlc3MpKSAvIChhY2Nlc3MgKyAxKTsgLyogMC4uMSAqLworICBucl9saHNfYml0cyA9IDggKiBieXRlICsgODsKKyAgbnJfcmhzX2JpdHMgPSA4ICogYWNjZXNzIC0gOCAqIGJ5dGU7CisgIC8qIG5yX2xoc19iaXRzICsgbnJfcmhzX2JpdHMgPT0gOCAqIChhY2Nlc3NzICsgMSkgKi8KKworICAvKiBmcHJpbnRmIChzdGRlcnIsICJsW3dkXWw6IDB4JTA4bHglMDhseCAweCUwOGx4JTA4bHggJWQ6JWQgJWQrJWRcbiIsCisJICAgKGxvbmcpICgodW5zaWduZWQ2NCkgdmFkZHIgPj4gMzIpLCAobG9uZykgdmFkZHIsCisJICAgKGxvbmcpICgodW5zaWduZWQ2NCkgcGFkZHIgPj4gMzIpLCAobG9uZykgcGFkZHIsCisJICAgd29yZCwgYnl0ZSwgbnJfbGhzX2JpdHMsIG5yX3Joc19iaXRzKTsgKi8KKworICBMb2FkTWVtb3J5ICgmbWVtdmFsLCBOVUxMLCB1bmNhY2hlZCwgYnl0ZSwgcGFkZHIsIHZhZGRyLCBpc0RBVEEsIGlzUkVBTCk7CisgIGlmICh3b3JkID09IDApCisgICAgeworICAgICAgLyogR1BSezMxLi4zMi1OUl9MSFNfQklUU30gPSBtZW12YWx7TlJfTEhTX0JJVFMtMS4uMH0gKi8KKyAgICAgIHRlbXAgPSAobWVtdmFsIDw8IG5yX3Joc19iaXRzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBHUFJ7MzEuLjMyLU5SX0xIU19CSVRTID0gbWVtdmFsezMyK05SX0xIU19CSVRTLi4zMn0gKi8KKyAgICAgIHRlbXAgPSAobWVtdmFsID4+IG5yX2xoc19iaXRzKTsKKyAgICB9CisgIGxoc19tYXNrID0gTFNNQVNLIChucl9saHNfYml0cyArIG5yX3Joc19iaXRzIC0gMSwgbnJfcmhzX2JpdHMpOworICBydCA9IChydCAmIH5saHNfbWFzaykgfCAodGVtcCAmIGxoc19tYXNrKTsKKworICAvKiBmcHJpbnRmIChzdGRlcnIsICJsW3dkXWw6IDB4JTA4bHglMDhseCAtPiAweCUwOGx4JTA4bHggJiAweCUwOGx4JTA4bHggLT4gMHglMDhseCUwOGx4XG4iLAorCSAgIChsb25nKSAoKHVuc2lnbmVkNjQpIG1lbXZhbCA+PiAzMiksIChsb25nKSBtZW12YWwsCisJICAgKGxvbmcpICgodW5zaWduZWQ2NCkgdGVtcCA+PiAzMiksIChsb25nKSB0ZW1wLAorCSAgIChsb25nKSAoKHVuc2lnbmVkNjQpIGxoc19tYXNrID4+IDMyKSwgKGxvbmcpIGxoc19tYXNrLAorCSAgIChsb25nKSAocnQgPj4gMzIpLCAobG9uZykgcnQpOyAqLworICByZXR1cm4gcnQ7Cit9CisKKworMTAwMDEwLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6MzI6OkxXTAorImx3bCByPFJUPiwgPE9GRlNFVD4ocjxCQVNFPikiCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIEdQUltSVF0gPSBFWFRFTkQzMiAoZG9fbG9hZF9sZWZ0IChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBHUFJbQkFTRV0sIEVYVEVORDMyIChPRkZTRVQpLCBHUFJbUlRdKSk7Cit9CisKKworOmZ1bmN0aW9uOjo6dW5zaWduZWRfd29yZDpkb19sb2FkX3JpZ2h0OnVuc2lnbmVkIGFjY2VzcywgYWRkcmVzc193b3JkIGJhc2UsIGFkZHJlc3Nfd29yZCBvZmZzZXQsIHVuc2lnbmVkX3dvcmQgcnQKK3sKKyAgYWRkcmVzc193b3JkIG1hc2sgPSAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0ID8gMHg3IDogMHgzKTsKKyAgYWRkcmVzc193b3JkIHJldmVyc2VlbmRpYW4gPSAoUmV2ZXJzZUVuZGlhbiA/IC0xIDogMCk7CisgIGFkZHJlc3Nfd29yZCBiaWdlbmRpYW5jcHUgPSAoQmlnRW5kaWFuQ1BVID8gLTEgOiAwKTsKKyAgdW5zaWduZWQgaW50IGJ5dGU7CisgIGFkZHJlc3Nfd29yZCBwYWRkcjsKKyAgaW50IHVuY2FjaGVkOworICB1bnNpZ25lZDY0IG1lbXZhbDsKKyAgYWRkcmVzc193b3JkIHZhZGRyOworCisgIHZhZGRyID0gYmFzZSArIG9mZnNldDsKKyAgQWRkcmVzc1RyYW5zbGF0aW9uICh2YWRkciwgaXNEQVRBLCBpc0xPQUQsICZwYWRkciwgJnVuY2FjaGVkLCBpc1RBUkdFVCwgaXNSRUFMKTsKKyAgLyogTk9URTogU1BFQyBpcyB3cm9uZywgaGFzIGBCaWdFbmRpYW5NZW0gPT0gMCcgbm90IGBCaWdFbmRpYW5NZW0gIT0gMCcgKi8KKyAgcGFkZHIgPSAocGFkZHIgXiAocmV2ZXJzZWVuZGlhbiAmIG1hc2spKTsKKyAgaWYgKEJpZ0VuZGlhbk1lbSAhPSAwKQorICAgIHBhZGRyID0gcGFkZHIgJiB+YWNjZXNzOworICBieXRlID0gKCh2YWRkciAmIG1hc2spIF4gKGJpZ2VuZGlhbmNwdSAmIG1hc2spKTsKKyAgLyogTk9URTogU1BFQyBpcyB3cm9uZywgaGFkIGBieXRlJyBub3QgYGFjY2VzcyAtIGJ5dGUnLiAgU2VlIFNXLiAqLworICBMb2FkTWVtb3J5ICgmbWVtdmFsLCBOVUxMLCB1bmNhY2hlZCwgYWNjZXNzIC0gKGFjY2VzcyAmIGJ5dGUpLCBwYWRkciwgdmFkZHIsIGlzREFUQSwgaXNSRUFMKTsKKyAgLyogcHJpbnRmICgibHI6IDB4JTA4bHggJWRAMHglMDhseCAweCUwOGx4XG4iLAorICAgICAobG9uZykgcGFkZHIsIGJ5dGUsIChsb25nKSBwYWRkciwgKGxvbmcpIG1lbXZhbCk7ICovCisgIHsKKyAgICB1bnNpZ25lZF93b3JkIHNjcmVlbiA9IExTTUFTSyAoOCAqIChhY2Nlc3MgLSAoYnl0ZSAmIGFjY2VzcykgKyAxKSAtIDEsIDApOworICAgIHJ0ICY9IH5zY3JlZW47CisgICAgcnQgfD0gKG1lbXZhbCA+PiAoOCAqIGJ5dGUpKSAmIHNjcmVlbjsKKyAgfQorICByZXR1cm4gcnQ7Cit9CisKKworMTAwMTEwLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6MzI6OkxXUgorImx3ciByPFJUPiwgPE9GRlNFVD4ocjxCQVNFPikiCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIEdQUltSVF0gPSBFWFRFTkQzMiAoZG9fbG9hZF9yaWdodCAoU0RfLCBBY2Nlc3NMZW5ndGhfV09SRCwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSwgR1BSW1JUXSkpOworfQorCisKKzEwMDExMSw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpMV1UKKyJsd3UgcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6Cit7CisgIEdQUltSVF0gPSBkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBHUFJbQkFTRV0sIEVYVEVORDE2IChPRkZTRVQpKTsKK30KKworCis6ZnVuY3Rpb246Ojp2b2lkOmRvX21maGk6aW50IHJkCit7CisgIGNoZWNrX21mX2hpbG8gKFNEXywgSElISVNUT1JZLCBMT0hJU1RPUlkpOworICBUUkFDRV9BTFVfSU5QVVQxIChISSk7CisgIEdQUltyZF0gPSBISTsKKyAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3JkXSk7Cit9CisKKzAwMDAwMCwwMDAwMDAwMDAwLDUuUkQsMDAwMDAsMDEwMDAwOlNQRUNJQUw6MzI6Ok1GSEkKKyJtZmhpIHI8UkQ+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBkb19tZmhpIChTRF8sIFJEKTsKK30KKworCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fbWZsbzppbnQgcmQKK3sKKyAgY2hlY2tfbWZfaGlsbyAoU0RfLCBMT0hJU1RPUlksIEhJSElTVE9SWSk7CisgIFRSQUNFX0FMVV9JTlBVVDEgKExPKTsKKyAgR1BSW3JkXSA9IExPOworICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbcmRdKTsKK30KKworMDAwMDAwLDAwMDAwMDAwMDAsNS5SRCwwMDAwMCwwMTAwMTA6U1BFQ0lBTDozMjo6TUZMTworIm1mbG8gcjxSRD4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGRvX21mbG8gKFNEXywgUkQpOworfQorCisKKworMDAwMDAwLDUuUlMsNS5SVCw1LlJELDAwMDAwMDAxMDExOlNQRUNJQUw6MzI6Ok1PVk4KKyJtb3ZuIHI8UkQ+LCByPFJTPiwgcjxSVD4iCisqbWlwc0lWOgorKnZyNTAwMDoKK3sKKyAgaWYgKEdQUltSVF0gIT0gMCkKKyAgICBHUFJbUkRdID0gR1BSW1JTXTsKK30KKworCisKKzAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMDAwMTAxMDpTUEVDSUFMOjMyOjpNT1ZaCisibW92eiByPFJEPiwgcjxSUz4sIHI8UlQ+IgorKm1pcHNJVjoKKyp2cjUwMDA6Cit7CisgIGlmIChHUFJbUlRdID09IDApCisgICAgR1BSW1JEXSA9IEdQUltSU107Cit9CisKKworCiswMDAwMDAsNS5SUywwMDAwMDAwMDAwMDAwMDAsMDEwMDAxOlNQRUNJQUw6MzI6Ok1USEkKKyJtdGhpIHI8UlM+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBjaGVja19tdF9oaWxvIChTRF8sIEhJSElTVE9SWSk7CisgIEhJID0gR1BSW1JTXTsKK30KKworCisKKzAwMDAwMCw1LlJTLDAwMDAwMDAwMDAwMDAwMDAxMDAxMTpTUEVDSUFMOjMyOjpNVExPCisibXRsbyByPFJTPiIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgY2hlY2tfbXRfaGlsbyAoU0RfLCBMT0hJU1RPUlkpOworICBMTyA9IEdQUltSU107Cit9CisKKworCis6ZnVuY3Rpb246Ojp2b2lkOmRvX211bHQ6aW50IHJzLCBpbnQgcnQsIGludCByZAoreworICBzaWduZWQ2NCBwcm9kOworICBjaGVja19tdWx0X2hpbG8gKFNEXywgSElISVNUT1JZLCBMT0hJU1RPUlkpOworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnNdLCBHUFJbcnRdKTsKKyAgcHJvZCA9ICgoKHNpZ25lZDY0KShzaWduZWQzMikgR1BSW3JzXSkKKwkgICogKChzaWduZWQ2NCkoc2lnbmVkMzIpIEdQUltydF0pKTsKKyAgTE8gPSBFWFRFTkQzMiAoVkw0XzggKHByb2QpKTsKKyAgSEkgPSBFWFRFTkQzMiAoVkg0XzggKHByb2QpKTsKKyAgaWYgKHJkICE9IDApCisgICAgR1BSW3JkXSA9IExPOworICBUUkFDRV9BTFVfUkVTVUxUMiAoSEksIExPKTsKK30KKworMDAwMDAwLDUuUlMsNS5SVCwwMDAwMCwwMDAwMDAxMTAwMDpTUEVDSUFMOjMyOjpNVUxUCisibXVsdCByPFJTPiwgcjxSVD4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKK3sKKyAgZG9fbXVsdCAoU0RfLCBSUywgUlQsIDApOworfQorCisKKzAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMDAxMTAwMDpTUEVDSUFMOjMyOjpNVUxUCisibXVsdCByPFJEPiwgcjxSUz4sIHI8UlQ+IgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgZG9fbXVsdCAoU0RfLCBSUywgUlQsIFJEKTsKK30KKworCis6ZnVuY3Rpb246Ojp2b2lkOmRvX211bHR1OmludCBycywgaW50IHJ0LCBpbnQgcmQKK3sKKyAgdW5zaWduZWQ2NCBwcm9kOworICBjaGVja19tdWx0X2hpbG8gKFNEXywgSElISVNUT1JZLCBMT0hJU1RPUlkpOworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnNdLCBHUFJbcnRdKTsKKyAgcHJvZCA9ICgoKHVuc2lnbmVkNjQpKHVuc2lnbmVkMzIpIEdQUltyc10pCisJICAqICgodW5zaWduZWQ2NCkodW5zaWduZWQzMikgR1BSW3J0XSkpOworICBMTyA9IEVYVEVORDMyIChWTDRfOCAocHJvZCkpOworICBISSA9IEVYVEVORDMyIChWSDRfOCAocHJvZCkpOworICBpZiAocmQgIT0gMCkKKyAgICBHUFJbcmRdID0gTE87CisgIFRSQUNFX0FMVV9SRVNVTFQyIChISSwgTE8pOworfQorCiswMDAwMDAsNS5SUyw1LlJULDAwMDAwLDAwMDAwMDExMDAxOlNQRUNJQUw6MzI6Ok1VTFRVCisibXVsdHUgcjxSUz4sIHI8UlQ+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6Cit7CisgIGRvX211bHR1IChTRF8sIFJTLCBSVCwgMCk7Cit9CisKKzAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMDAxMTAwMTpTUEVDSUFMOjMyOjpNVUxUVQorIm11bHR1IHI8UkQ+LCByPFJTPiwgcjxSVD4iCisqdnI1MDAwOgorKnIzOTAwOgoreworICBkb19tdWx0dSAoU0RfLCBSUywgUlQsIDApOworfQorCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fbm9yOmludCBycywgaW50IHJ0LCBpbnQgcmQKK3sKKyAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3JzXSwgR1BSW3J0XSk7CisgIEdQUltyZF0gPSB+IChHUFJbcnNdIHwgR1BSW3J0XSk7CisgIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltyZF0pOworfQorCiswMDAwMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAsMTAwMTExOlNQRUNJQUw6MzI6Ok5PUgorIm5vciByPFJEPiwgcjxSUz4sIHI8UlQ+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBkb19ub3IgKFNEXywgUlMsIFJULCBSRCk7Cit9CisKKworOmZ1bmN0aW9uOjo6dm9pZDpkb19vcjppbnQgcnMsIGludCBydCwgaW50IHJkCit7CisgIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltyc10sIEdQUltydF0pOworICBHUFJbcmRdID0gKEdQUltyc10gfCBHUFJbcnRdKTsKKyAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3JkXSk7Cit9CisKKzAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMCwxMDAxMDE6U1BFQ0lBTDozMjo6T1IKKyJvciByPFJEPiwgcjxSUz4sIHI8UlQ+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBkb19vciAoU0RfLCBSUywgUlQsIFJEKTsKK30KKworCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fb3JpOmludCBycywgaW50IHJ0LCB1bnNpZ25lZCBpbW1lZGlhdGUKK3sKKyAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3JzXSwgaW1tZWRpYXRlKTsKKyAgR1BSW3J0XSA9IChHUFJbcnNdIHwgaW1tZWRpYXRlKTsKKyAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3J0XSk7Cit9CisKKzAwMTEwMSw1LlJTLDUuUlQsMTYuSU1NRURJQVRFOk5PUk1BTDozMjo6T1JJCisib3JpIHI8UlQ+LCByPFJTPiwgPElNTUVESUFURT4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGRvX29yaSAoU0RfLCBSUywgUlQsIElNTUVESUFURSk7Cit9CisKKworMTEwMDExLDUuUlMsbm5ubm4sMTYuT0ZGU0VUOk5PUk1BTDozMjo6UFJFRgorKm1pcHNJVjoKKyp2cjUwMDA6Cit7CisgIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOworICBzaWduZWRfd29yZCBvZmZzZXQgPSBTSUdORVhURU5EKChzaWduZWRfd29yZCkoKGluc3RydWN0aW9uID4+IDApICYgMHgwMDAwRkZGRiksMTYpOworICBpbnQgaGludCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTYpICYgMHgwMDAwMDAxRik7CisgIHNpZ25lZF93b3JkIG9wMSA9IEdQUlsoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMUYpXTsKKyAgeworICAgIGFkZHJlc3Nfd29yZCB2YWRkciA9ICgodW5zaWduZWQ2NClvcDEgKyBvZmZzZXQpOworICAgIGFkZHJlc3Nfd29yZCBwYWRkcjsKKyAgICBpbnQgdW5jYWNoZWQ7CisgICAgeworICAgICAgaWYgKEFkZHJlc3NUcmFuc2xhdGlvbih2YWRkcixpc0RBVEEsaXNMT0FELCZwYWRkciwmdW5jYWNoZWQsaXNUQVJHRVQsaXNSRUFMKSkKKwlQcmVmZXRjaCh1bmNhY2hlZCxwYWRkcix2YWRkcixpc0RBVEEsaGludCk7CisgICAgfQorICB9Cit9CisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fc3RvcmU6dW5zaWduZWQgYWNjZXNzLCBhZGRyZXNzX3dvcmQgYmFzZSwgYWRkcmVzc193b3JkIG9mZnNldCwgdW5zaWduZWRfd29yZCB3b3JkCit7CisgIGFkZHJlc3Nfd29yZCBtYXNrID0gKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCA/IDB4NyA6IDB4Myk7CisgIGFkZHJlc3Nfd29yZCByZXZlcnNlZW5kaWFuID0gKFJldmVyc2VFbmRpYW4gPyAobWFzayBeIGFjY2VzcykgOiAwKTsKKyAgYWRkcmVzc193b3JkIGJpZ2VuZGlhbmNwdSA9IChCaWdFbmRpYW5DUFUgPyAobWFzayBeIGFjY2VzcykgOiAwKTsKKyAgdW5zaWduZWQgaW50IGJ5dGU7CisgIGFkZHJlc3Nfd29yZCBwYWRkcjsKKyAgaW50IHVuY2FjaGVkOworICB1bnNpZ25lZDY0IG1lbXZhbDsKKyAgYWRkcmVzc193b3JkIHZhZGRyOworCisgIHZhZGRyID0gYmFzZSArIG9mZnNldDsKKyAgaWYgKCh2YWRkciAmIGFjY2VzcykgIT0gMCkKKyAgICB7CisgICAgICBTSU1fQ09SRV9TSUdOQUwgKFNELCBTVEFURV9DUFUoU0QsIDApLCBjaWEsIHJlYWRfbWFwLCBhY2Nlc3MrMSwgdmFkZHIsIHdyaXRlX3RyYW5zZmVyLCBzaW1fY29yZV91bmFsaWduZWRfc2lnbmFsKTsKKyAgICB9CisgIEFkZHJlc3NUcmFuc2xhdGlvbiAodmFkZHIsIGlzREFUQSwgaXNTVE9SRSwgJnBhZGRyLCAmdW5jYWNoZWQsIGlzVEFSR0VULCBpc1JFQUwpOworICBwYWRkciA9ICgocGFkZHIgJiB+bWFzaykgfCAoKHBhZGRyICYgbWFzaykgXiByZXZlcnNlZW5kaWFuKSk7CisgIGJ5dGUgPSAoKHZhZGRyICYgbWFzaykgXiBiaWdlbmRpYW5jcHUpOworICBtZW12YWwgPSAod29yZCA8PCAoOCAqIGJ5dGUpKTsKKyAgU3RvcmVNZW1vcnkgKHVuY2FjaGVkLCBhY2Nlc3MsIG1lbXZhbCwgMCwgcGFkZHIsIHZhZGRyLCBpc1JFQUwpOworfQorCisKKzEwMTAwMCw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpTQgorInNiIHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgZG9fc3RvcmUgKFNEXywgQWNjZXNzTGVuZ3RoX0JZVEUsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCksIEdQUltSVF0pOworfQorCisKKzExMTAwMCw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpTQworInNjIHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKKyptaXBzSUk6CisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIHNpZ25lZF93b3JkIG9mZnNldCA9IFNJR05FWFRFTkQoKHNpZ25lZF93b3JkKSgoaW5zdHJ1Y3Rpb24gPj4gMCkgJiAweDAwMDBGRkZGKSwxNik7CisgIHNpZ25lZF93b3JkIG9wMiA9IEdQUlsoKGluc3RydWN0aW9uID4+IDE2KSAmIDB4MDAwMDAwMUYpXTsKKyAgc2lnbmVkX3dvcmQgb3AxID0gR1BSWygoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAxRildOworICB7CisgICAgYWRkcmVzc193b3JkIHZhZGRyID0gKCh1bnNpZ25lZDY0KW9wMSArIG9mZnNldCk7CisgICAgYWRkcmVzc193b3JkIHBhZGRyOworICAgIGludCB1bmNhY2hlZDsKKyAgICBpZiAoKHZhZGRyICYgMykgIT0gMCkKKyAgICAgIHsKKwlTSU1fQ09SRV9TSUdOQUwgKFNELCBDUFUsIGNpYSwgcmVhZF9tYXAsIDQsIHZhZGRyLCB3cml0ZV90cmFuc2Zlciwgc2ltX2NvcmVfdW5hbGlnbmVkX3NpZ25hbCk7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCWlmIChBZGRyZXNzVHJhbnNsYXRpb24odmFkZHIsaXNEQVRBLGlzU1RPUkUsJnBhZGRyLCZ1bmNhY2hlZCxpc1RBUkdFVCxpc1JFQUwpKQorCSAgeworCSAgICB1bnNpZ25lZDY0IG1lbXZhbCA9IDA7CisJICAgIHVuc2lnbmVkNjQgbWVtdmFsMSA9IDA7CisJICAgIHVuc2lnbmVkNjQgbWFzayA9IDB4NzsKKwkgICAgdW5zaWduZWQgaW50IGJ5dGU7CisJICAgIHBhZGRyID0gKChwYWRkciAmIH5tYXNrKSB8ICgocGFkZHIgJiBtYXNrKSBeIChSZXZlcnNlRW5kaWFuIDw8IDIpKSk7CisJICAgIGJ5dGUgPSAoKHZhZGRyICYgbWFzaykgXiAoQmlnRW5kaWFuQ1BVIDw8IDIpKTsKKwkgICAgbWVtdmFsID0gKCh1bnNpZ25lZDY0KSBvcDIgPDwgKDggKiBieXRlKSk7CisJICAgIGlmIChMTEJJVCkKKwkgICAgICB7CisJCVN0b3JlTWVtb3J5KHVuY2FjaGVkLEFjY2Vzc0xlbmd0aF9XT1JELG1lbXZhbCxtZW12YWwxLHBhZGRyLHZhZGRyLGlzUkVBTCk7CisJICAgICAgfQorCSAgICBHUFJbKGluc3RydWN0aW9uID4+IDE2KSAmIDB4MDAwMDAwMUZdID0gTExCSVQ7CisJICB9CisgICAgICB9CisgIH0KK30KKworCisxMTExMDAsNS5CQVNFLDUuUlQsMTYuT0ZGU0VUOk5PUk1BTDo2NDo6U0NECisic2NkIHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKKyAgc2lnbmVkX3dvcmQgb2Zmc2V0ID0gU0lHTkVYVEVORCgoc2lnbmVkX3dvcmQpKChpbnN0cnVjdGlvbiA+PiAwKSAmIDB4MDAwMEZGRkYpLDE2KTsKKyAgc2lnbmVkX3dvcmQgb3AyID0gR1BSWygoaW5zdHJ1Y3Rpb24gPj4gMTYpICYgMHgwMDAwMDAxRildOworICBzaWduZWRfd29yZCBvcDEgPSBHUFJbKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDFGKV07CisgIHsKKyAgICBhZGRyZXNzX3dvcmQgdmFkZHIgPSAoKHVuc2lnbmVkNjQpb3AxICsgb2Zmc2V0KTsKKyAgICBhZGRyZXNzX3dvcmQgcGFkZHI7CisgICAgaW50IHVuY2FjaGVkOworICAgIGlmICgodmFkZHIgJiA3KSAhPSAwKQorICAgICAgeworCVNJTV9DT1JFX1NJR05BTCAoU0QsIENQVSwgY2lhLCByZWFkX21hcCwgOCwgdmFkZHIsIHdyaXRlX3RyYW5zZmVyLCBzaW1fY29yZV91bmFsaWduZWRfc2lnbmFsKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJaWYgKEFkZHJlc3NUcmFuc2xhdGlvbih2YWRkcixpc0RBVEEsaXNTVE9SRSwmcGFkZHIsJnVuY2FjaGVkLGlzVEFSR0VULGlzUkVBTCkpCisJICB7CisJICAgIHVuc2lnbmVkNjQgbWVtdmFsID0gMDsKKwkgICAgdW5zaWduZWQ2NCBtZW12YWwxID0gMDsKKwkgICAgbWVtdmFsID0gb3AyOworCSAgICBpZiAoTExCSVQpCisJICAgICAgeworCQlTdG9yZU1lbW9yeSh1bmNhY2hlZCxBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCxtZW12YWwsbWVtdmFsMSxwYWRkcix2YWRkcixpc1JFQUwpOworCSAgICAgIH0KKwkgICAgR1BSWyhpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGXSA9IExMQklUOworCSAgfQorICAgICAgfQorICB9Cit9CisKKworMTExMTExLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6NjQ6OlNECisic2QgcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6Cit7CisgIGRvX3N0b3JlIChTRF8sIEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JELCBHUFJbQkFTRV0sIEVYVEVORDE2IChPRkZTRVQpLCBHUFJbUlRdKTsKK30KKworCisxMTExLFpaITAhMSEzLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6NjQ6OlNEQ3oKKyJzZGM8Wlo+IHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKKyptaXBzSUk6CisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKK3sKKyAgZG9fc3RvcmUgKFNEXywgQWNjZXNzTGVuZ3RoX0RPVUJMRVdPUkQsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCksIENPUF9TRCAoWlosIFJUKSk7Cit9CisKKworMTAxMTAwLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6NjQ6OlNETAorInNkbCByPFJUPiwgPE9GRlNFVD4ocjxCQVNFPikiCisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKK3sKKyAgZG9fc3RvcmVfbGVmdCAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSwgR1BSW1JUXSk7Cit9CisKKworMTAxMTAxLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6NjQ6OlNEUgorInNkciByPFJUPiwgPE9GRlNFVD4ocjxCQVNFPikiCisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKK3sKKyAgZG9fc3RvcmVfcmlnaHQgKFNEXywgQWNjZXNzTGVuZ3RoX0RPVUJMRVdPUkQsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCksIEdQUltSVF0pOworfQorCisKKzEwMTAwMSw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpTSAorInNoIHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgZG9fc3RvcmUgKFNEXywgQWNjZXNzTGVuZ3RoX0hBTEZXT1JELCBHUFJbQkFTRV0sIEVYVEVORDE2IChPRkZTRVQpLCBHUFJbUlRdKTsKK30KKworCis6ZnVuY3Rpb246Ojp2b2lkOmRvX3NsbDppbnQgcnQsIGludCByZCwgaW50IHNoaWZ0Cit7CisgIHVuc2lnbmVkMzIgdGVtcCA9IChHUFJbcnRdIDw8IHNoaWZ0KTsKKyAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3J0XSwgc2hpZnQpOworICBHUFJbcmRdID0gRVhURU5EMzIgKHRlbXApOworICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbcmRdKTsKK30KKworMDAwMDAwMDAwMDAsNS5SVCw1LlJELDUuU0hJRlQsMDAwMDAwOlNQRUNJQUw6MzI6OlNMTAorInNsbCByPFJEPiwgcjxSVD4sIDxTSElGVD4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGRvX3NsbCAoU0RfLCBSVCwgUkQsIFNISUZUKTsKK30KKworCis6ZnVuY3Rpb246Ojp2b2lkOmRvX3NsbHY6aW50IHJzLCBpbnQgcnQsIGludCByZAoreworICBpbnQgcyA9IE1BU0tFRCAoR1BSW3JzXSwgNCwgMCk7CisgIHVuc2lnbmVkMzIgdGVtcCA9IChHUFJbcnRdIDw8IHMpOworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnRdLCBzKTsKKyAgR1BSW3JkXSA9IEVYVEVORDMyICh0ZW1wKTsKKyAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3JkXSk7Cit9CisKKzAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMDAwMDEwMDpTUEVDSUFMOjMyOjpTTExWCisic2xsdiByPFJEPiwgcjxSVD4sIHI8UlM+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBkb19zbGx2IChTRF8sIFJTLCBSVCwgUkQpOworfQorCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fc2x0OmludCBycywgaW50IHJ0LCBpbnQgcmQKK3sKKyAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3JzXSwgR1BSW3J0XSk7CisgIEdQUltyZF0gPSAoKHNpZ25lZF93b3JkKSBHUFJbcnNdIDwgKHNpZ25lZF93b3JkKSBHUFJbcnRdKTsKKyAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3JkXSk7Cit9CisKKzAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMDEwMTAxMDpTUEVDSUFMOjMyOjpTTFQKKyJzbHQgcjxSRD4sIHI8UlM+LCByPFJUPiIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgZG9fc2x0IChTRF8sIFJTLCBSVCwgUkQpOworfQorCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fc2x0aTppbnQgcnMsIGludCBydCwgdW5zaWduZWQxNiBpbW1lZGlhdGUKK3sKKyAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3JzXSwgRVhURU5EMTYgKGltbWVkaWF0ZSkpOworICBHUFJbcnRdID0gKChzaWduZWRfd29yZCkgR1BSW3JzXSA8IChzaWduZWRfd29yZCkgRVhURU5EMTYgKGltbWVkaWF0ZSkpOworICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbcnRdKTsKK30KKworMDAxMDEwLDUuUlMsNS5SVCwxNi5JTU1FRElBVEU6Tk9STUFMOjMyOjpTTFRJCisic2x0aSByPFJUPiwgcjxSUz4sIDxJTU1FRElBVEU+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBkb19zbHRpIChTRF8sIFJTLCBSVCwgSU1NRURJQVRFKTsKK30KKworCis6ZnVuY3Rpb246Ojp2b2lkOmRvX3NsdGl1OmludCBycywgaW50IHJ0LCB1bnNpZ25lZDE2IGltbWVkaWF0ZQoreworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnNdLCBFWFRFTkQxNiAoaW1tZWRpYXRlKSk7CisgIEdQUltydF0gPSAoKHVuc2lnbmVkX3dvcmQpIEdQUltyc10gPCAodW5zaWduZWRfd29yZCkgRVhURU5EMTYgKGltbWVkaWF0ZSkpOworICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbcnRdKTsKK30KKworMDAxMDExLDUuUlMsNS5SVCwxNi5JTU1FRElBVEU6Tk9STUFMOjMyOjpTTFRJVQorInNsdGl1IHI8UlQ+LCByPFJTPiwgPElNTUVESUFURT4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGRvX3NsdGl1IChTRF8sIFJTLCBSVCwgSU1NRURJQVRFKTsKK30KKworCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fc2x0dTppbnQgcnMsIGludCBydCwgaW50IHJkCit7CisgIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltyc10sIEdQUltydF0pOworICBHUFJbcmRdID0gKCh1bnNpZ25lZF93b3JkKSBHUFJbcnNdIDwgKHVuc2lnbmVkX3dvcmQpIEdQUltydF0pOworICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbcmRdKTsKK30KKworMDAwMDAwLDUuUlMsNS5SVCw1LlJELDAwMDAwMTAxMDExOlNQRUNJQUw6MzI6OlNMVFUKKyJzbHR1IHI8UkQ+LCByPFJTPiwgcjxSVD4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGRvX3NsdHUgKFNEXywgUlMsIFJULCBSRCk7Cit9CisKKworOmZ1bmN0aW9uOjo6dm9pZDpkb19zcmE6aW50IHJ0LCBpbnQgcmQsIGludCBzaGlmdAoreworICBzaWduZWQzMiB0ZW1wID0gKHNpZ25lZDMyKSBHUFJbcnRdID4+IHNoaWZ0OworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnRdLCBzaGlmdCk7CisgIEdQUltyZF0gPSBFWFRFTkQzMiAodGVtcCk7CisgIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltyZF0pOworfQorCiswMDAwMDAsMDAwMDAsNS5SVCw1LlJELDUuU0hJRlQsMDAwMDExOlNQRUNJQUw6MzI6OlNSQQorInNyYSByPFJEPiwgcjxSVD4sIDxTSElGVD4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGRvX3NyYSAoU0RfLCBSVCwgUkQsIFNISUZUKTsKK30KKworCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fc3JhdjppbnQgcnMsIGludCBydCwgaW50IHJkCit7CisgIGludCBzID0gTUFTS0VEIChHUFJbcnNdLCA0LCAwKTsKKyAgc2lnbmVkMzIgdGVtcCA9IChzaWduZWQzMikgR1BSW3J0XSA+PiBzOworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnRdLCBzKTsKKyAgR1BSW3JkXSA9IEVYVEVORDMyICh0ZW1wKTsKKyAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3JkXSk7Cit9CisKKzAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMDAwMDExMTpTUEVDSUFMOjMyOjpTUkFWCisic3JhdiByPFJEPiwgcjxSVD4sIHI8UlM+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBkb19zcmF2IChTRF8sIFJTLCBSVCwgUkQpOworfQorCisKKworOmZ1bmN0aW9uOjo6dm9pZDpkb19zcmw6aW50IHJ0LCBpbnQgcmQsIGludCBzaGlmdAoreworICB1bnNpZ25lZDMyIHRlbXAgPSAodW5zaWduZWQzMikgR1BSW3J0XSA+PiBzaGlmdDsKKyAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3J0XSwgc2hpZnQpOworICBHUFJbcmRdID0gRVhURU5EMzIgKHRlbXApOworICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbcmRdKTsKK30KKworMDAwMDAwLDAwMDAwLDUuUlQsNS5SRCw1LlNISUZULDAwMDAxMDpTUEVDSUFMOjMyOjpTUkwKKyJzcmwgcjxSRD4sIHI8UlQ+LCA8U0hJRlQ+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBkb19zcmwgKFNEXywgUlQsIFJELCBTSElGVCk7Cit9CisKKworOmZ1bmN0aW9uOjo6dm9pZDpkb19zcmx2OmludCBycywgaW50IHJ0LCBpbnQgcmQKK3sKKyAgaW50IHMgPSBNQVNLRUQgKEdQUltyc10sIDQsIDApOworICB1bnNpZ25lZDMyIHRlbXAgPSAodW5zaWduZWQzMikgR1BSW3J0XSA+PiBzOworICBUUkFDRV9BTFVfSU5QVVQyIChHUFJbcnRdLCBzKTsKKyAgR1BSW3JkXSA9IEVYVEVORDMyICh0ZW1wKTsKKyAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3JkXSk7Cit9CisKKzAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMDAwMDExMDpTUEVDSUFMOjMyOjpTUkxWCisic3JsdiByPFJEPiwgcjxSVD4sIHI8UlM+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBkb19zcmx2IChTRF8sIFJTLCBSVCwgUkQpOworfQorCisKKzAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMDEwMDAxMDpTUEVDSUFMOjMyOjpTVUIKKyJzdWIgcjxSRD4sIHI8UlM+LCByPFJUPiIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW1JTXSwgR1BSW1JUXSk7CisgIHsKKyAgICBBTFUzMl9CRUdJTiAoR1BSW1JTXSk7CisgICAgQUxVMzJfU1VCIChHUFJbUlRdKTsKKyAgICBBTFUzMl9FTkQgKEdQUltSRF0pOworICB9CisgIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltSRF0pOworfQorCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fc3VidTppbnQgcnMsIGludCBydCwgaW50IHJkCit7CisgIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltyc10sIEdQUltydF0pOworICBHUFJbcmRdID0gRVhURU5EMzIgKEdQUltyc10gLSBHUFJbcnRdKTsKKyAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3JkXSk7Cit9CisKKzAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMDEwMDAxMTpTUEVDSUFMOjMyOjpTVUJVCisic3VidSByPFJEPiwgcjxSUz4sIHI8UlQ+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBkb19zdWJ1IChTRF8sIFJTLCBSVCwgUkQpOworfQorCisKKzEwMTAxMSw1LkJBU0UsNS5SVCwxNi5PRkZTRVQ6Tk9STUFMOjMyOjpTVworInN3IHI8UlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnIzOTAwOgorKnZyNTAwMDoKK3sKKyAgZG9fc3RvcmUgKFNEXywgQWNjZXNzTGVuZ3RoX1dPUkQsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCksIEdQUltSVF0pOworfQorCisKKzExMTAsWlohMCExITMsNS5CQVNFLDUuUlQsMTYuT0ZGU0VUOk5PUk1BTDozMjo6U1dDegorInN3YzxaWj4gcjxSVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBkb19zdG9yZSAoU0RfLCBBY2Nlc3NMZW5ndGhfV09SRCwgR1BSW0JBU0VdLCBFWFRFTkQxNiAoT0ZGU0VUKSwgQ09QX1NXIChaWiwgUlQpKTsKK30KKworCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fc3RvcmVfbGVmdDp1bnNpZ25lZCBhY2Nlc3MsIGFkZHJlc3Nfd29yZCBiYXNlLCBhZGRyZXNzX3dvcmQgb2Zmc2V0LCB1bnNpZ25lZF93b3JkIHJ0Cit7CisgIGFkZHJlc3Nfd29yZCBtYXNrID0gKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCA/IDB4NyA6IDB4Myk7CisgIGFkZHJlc3Nfd29yZCByZXZlcnNlZW5kaWFuID0gKFJldmVyc2VFbmRpYW4gPyAtMSA6IDApOworICBhZGRyZXNzX3dvcmQgYmlnZW5kaWFuY3B1ID0gKEJpZ0VuZGlhbkNQVSA/IC0xIDogMCk7CisgIHVuc2lnbmVkIGludCBieXRlOworICB1bnNpZ25lZCBpbnQgd29yZDsKKyAgYWRkcmVzc193b3JkIHBhZGRyOworICBpbnQgdW5jYWNoZWQ7CisgIHVuc2lnbmVkNjQgbWVtdmFsOworICBhZGRyZXNzX3dvcmQgdmFkZHI7CisgIGludCBucl9saHNfYml0czsKKyAgaW50IG5yX3Joc19iaXRzOworCisgIHZhZGRyID0gYmFzZSArIG9mZnNldDsKKyAgQWRkcmVzc1RyYW5zbGF0aW9uICh2YWRkciwgaXNEQVRBLCBpc1NUT1JFLCAmcGFkZHIsICZ1bmNhY2hlZCwgaXNUQVJHRVQsIGlzUkVBTCk7CisgIHBhZGRyID0gKHBhZGRyIF4gKHJldmVyc2VlbmRpYW4gJiBtYXNrKSk7CisgIGlmIChCaWdFbmRpYW5NZW0gPT0gMCkKKyAgICBwYWRkciA9IHBhZGRyICYgfmFjY2VzczsKKworICAvKiBjb21wdXRlIHdoZXJlIHdpdGhpbiB0aGUgd29yZC9tZW0gd2UgYXJlICovCisgIGJ5dGUgPSAoKHZhZGRyIF4gYmlnZW5kaWFuY3B1KSAmIGFjY2Vzcyk7IC8qIDAuLmFjY2VzcyAqLworICB3b3JkID0gKCh2YWRkciBeIGJpZ2VuZGlhbmNwdSkgJiAobWFzayAmIH5hY2Nlc3MpKSAvIChhY2Nlc3MgKyAxKTsgLyogMC4uMSAqLworICBucl9saHNfYml0cyA9IDggKiBieXRlICsgODsKKyAgbnJfcmhzX2JpdHMgPSA4ICogYWNjZXNzIC0gOCAqIGJ5dGU7CisgIC8qIG5yX2xoc19iaXRzICsgbnJfcmhzX2JpdHMgPT0gOCAqIChhY2Nlc3NzICsgMSkgKi8KKyAgLyogZnByaW50ZiAoc3RkZXJyLCAic1t3ZF1sOiAweCUwOGx4JTA4bHggMHglMDhseCUwOGx4ICVkOiVkICVkKyVkXG4iLAorCSAgIChsb25nKSAoKHVuc2lnbmVkNjQpIHZhZGRyID4+IDMyKSwgKGxvbmcpIHZhZGRyLAorCSAgIChsb25nKSAoKHVuc2lnbmVkNjQpIHBhZGRyID4+IDMyKSwgKGxvbmcpIHBhZGRyLAorCSAgIHdvcmQsIGJ5dGUsIG5yX2xoc19iaXRzLCBucl9yaHNfYml0cyk7ICovCisKKyAgaWYgKHdvcmQgPT0gMCkKKyAgICB7CisgICAgICBtZW12YWwgPSAocnQgPj4gbnJfcmhzX2JpdHMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIG1lbXZhbCA9IChydCA8PCBucl9saHNfYml0cyk7CisgICAgfQorICAvKiBmcHJpbnRmIChzdGRlcnIsICJzW3dkXWw6IDB4JTA4bHglMDhseCAtPiAweCUwOGx4JTA4bHhcbiIsCisJICAgKGxvbmcpICgodW5zaWduZWQ2NCkgcnQgPj4gMzIpLCAobG9uZykgcnQsCisJICAgKGxvbmcpICgodW5zaWduZWQ2NCkgbWVtdmFsID4+IDMyKSwgKGxvbmcpIG1lbXZhbCk7ICovCisgIFN0b3JlTWVtb3J5ICh1bmNhY2hlZCwgYnl0ZSwgbWVtdmFsLCAwLCBwYWRkciwgdmFkZHIsIGlzUkVBTCk7Cit9CisKKworMTAxMDEwLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6MzI6OlNXTAorInN3bCByPFJUPiwgPE9GRlNFVD4ocjxCQVNFPikiCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGRvX3N0b3JlX2xlZnQgKFNEXywgQWNjZXNzTGVuZ3RoX1dPUkQsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCksIEdQUltSVF0pOworfQorCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9fc3RvcmVfcmlnaHQ6dW5zaWduZWQgYWNjZXNzLCBhZGRyZXNzX3dvcmQgYmFzZSwgYWRkcmVzc193b3JkIG9mZnNldCwgdW5zaWduZWRfd29yZCBydAoreworICBhZGRyZXNzX3dvcmQgbWFzayA9IChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQgPyAweDcgOiAweDMpOworICBhZGRyZXNzX3dvcmQgcmV2ZXJzZWVuZGlhbiA9IChSZXZlcnNlRW5kaWFuID8gLTEgOiAwKTsKKyAgYWRkcmVzc193b3JkIGJpZ2VuZGlhbmNwdSA9IChCaWdFbmRpYW5DUFUgPyAtMSA6IDApOworICB1bnNpZ25lZCBpbnQgYnl0ZTsKKyAgYWRkcmVzc193b3JkIHBhZGRyOworICBpbnQgdW5jYWNoZWQ7CisgIHVuc2lnbmVkNjQgbWVtdmFsOworICBhZGRyZXNzX3dvcmQgdmFkZHI7CisKKyAgdmFkZHIgPSBiYXNlICsgb2Zmc2V0OworICBBZGRyZXNzVHJhbnNsYXRpb24gKHZhZGRyLCBpc0RBVEEsIGlzU1RPUkUsICZwYWRkciwgJnVuY2FjaGVkLCBpc1RBUkdFVCwgaXNSRUFMKTsKKyAgcGFkZHIgPSAocGFkZHIgXiAocmV2ZXJzZWVuZGlhbiAmIG1hc2spKTsKKyAgaWYgKEJpZ0VuZGlhbk1lbSAhPSAwKQorICAgIHBhZGRyICY9IH5hY2Nlc3M7CisgIGJ5dGUgPSAoKHZhZGRyICYgbWFzaykgXiAoYmlnZW5kaWFuY3B1ICYgbWFzaykpOworICBtZW12YWwgPSAocnQgPDwgKGJ5dGUgKiA4KSk7CisgIFN0b3JlTWVtb3J5ICh1bmNhY2hlZCwgYWNjZXNzIC0gKGFjY2VzcyAmIGJ5dGUpLCBtZW12YWwsIDAsIHBhZGRyLCB2YWRkciwgaXNSRUFMKTsKK30KKworMTAxMTEwLDUuQkFTRSw1LlJULDE2Lk9GRlNFVDpOT1JNQUw6MzI6OlNXUgorInN3ciByPFJUPiwgPE9GRlNFVD4ocjxCQVNFPikiCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGRvX3N0b3JlX3JpZ2h0IChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBHUFJbQkFTRV0sIEVYVEVORDE2IChPRkZTRVQpLCBHUFJbUlRdKTsKK30KKworCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAsNS5TVFlQRSwwMDExMTE6U1BFQ0lBTDozMjo6U1lOQworInN5bmMiOlNUWVBFID09IDAKKyJzeW5jIDxTVFlQRT4iCisqbWlwc0lJOgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIFN5bmNPcGVyYXRpb24gKFNUWVBFKTsKK30KKworCiswMDAwMDAsMjAuQ09ERSwwMDExMDA6U1BFQ0lBTDozMjo6U1lTQ0FMTAorInN5c2NhbGwgPENPREU+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBTaWduYWxFeGNlcHRpb24oU3lzdGVtQ2FsbCwgaW5zdHJ1Y3Rpb25fMCk7Cit9CisKKworMDAwMDAwLDUuUlMsNS5SVCwxMC5DT0RFLDExMDEwMDpTUEVDSUFMOjMyOjpURVEKKyJ0ZXEgcjxSUz4sIHI8UlQ+IgorKm1pcHNJSToKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICBpZiAoKHNpZ25lZF93b3JkKSBHUFJbUlNdID09IChzaWduZWRfd29yZCkgR1BSW1JUXSkKKyAgICBTaWduYWxFeGNlcHRpb24oVHJhcCwgaW5zdHJ1Y3Rpb25fMCk7Cit9CisKKworMDAwMDAxLDUuUlMsMDExMDAsMTYuSU1NRURJQVRFOlJFR0lNTTozMjo6VEVRSQorInRlcWkgcjxSUz4sIDxJTU1FRElBVEU+IgorKm1pcHNJSToKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICBpZiAoKHNpZ25lZF93b3JkKSBHUFJbUlNdID09IChzaWduZWRfd29yZCkgRVhURU5EMTYgKElNTUVESUFURSkpCisgICAgU2lnbmFsRXhjZXB0aW9uKFRyYXAsIGluc3RydWN0aW9uXzApOworfQorCisKKzAwMDAwMCw1LlJTLDUuUlQsMTAuQ09ERSwxMTAwMDA6U1BFQ0lBTDozMjo6VEdFCisidGdlIHI8UlM+LCByPFJUPiIKKyptaXBzSUk6CisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKK3sKKyAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA+PSAoc2lnbmVkX3dvcmQpIEdQUltSVF0pCisgICAgU2lnbmFsRXhjZXB0aW9uKFRyYXAsIGluc3RydWN0aW9uXzApOworfQorCisKKzAwMDAwMSw1LlJTLDAxMDAwLDE2LklNTUVESUFURTpSRUdJTU06MzI6OlRHRUkKKyJ0Z2VpIHI8UlM+LCA8SU1NRURJQVRFPiIKKyptaXBzSUk6CisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKK3sKKyAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSA+PSAoc2lnbmVkX3dvcmQpIEVYVEVORDE2IChJTU1FRElBVEUpKQorICAgIFNpZ25hbEV4Y2VwdGlvbihUcmFwLCBpbnN0cnVjdGlvbl8wKTsKK30KKworCiswMDAwMDEsNS5SUywwMTAwMSwxNi5JTU1FRElBVEU6UkVHSU1NOjMyOjpUR0VJVQorInRnZWl1IHI8UlM+LCA8SU1NRURJQVRFPiIKKyptaXBzSUk6CisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKK3sKKyAgaWYgKCh1bnNpZ25lZF93b3JkKSBHUFJbUlNdID49ICh1bnNpZ25lZF93b3JkKSBFWFRFTkQxNiAoSU1NRURJQVRFKSkKKyAgICBTaWduYWxFeGNlcHRpb24oVHJhcCwgaW5zdHJ1Y3Rpb25fMCk7Cit9CisKKworMDAwMDAwLDUuUlMsNS5SVCwxMC5DT0RFLDExMDAwMTpTUEVDSUFMOjMyOjpUR0VVCisidGdldSByPFJTPiwgcjxSVD4iCisqbWlwc0lJOgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6Cit7CisgIGlmICgodW5zaWduZWRfd29yZCkgR1BSW1JTXSA+PSAodW5zaWduZWRfd29yZCkgR1BSW1JUXSkKKyAgICBTaWduYWxFeGNlcHRpb24oVHJhcCwgaW5zdHJ1Y3Rpb25fMCk7Cit9CisKKworMDAwMDAwLDUuUlMsNS5SVCwxMC5DT0RFLDExMDAxMDpTUEVDSUFMOjMyOjpUTFQKKyJ0bHQgcjxSUz4sIHI8UlQ+IgorKm1pcHNJSToKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICBpZiAoKHNpZ25lZF93b3JkKSBHUFJbUlNdIDwgKHNpZ25lZF93b3JkKSBHUFJbUlRdKQorICAgIFNpZ25hbEV4Y2VwdGlvbihUcmFwLCBpbnN0cnVjdGlvbl8wKTsKK30KKworCiswMDAwMDEsNS5SUywwMTAxMCwxNi5JTU1FRElBVEU6UkVHSU1NOjMyOjpUTFRJCisidGx0aSByPFJTPiwgPElNTUVESUFURT4iCisqbWlwc0lJOgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6Cit7CisgIGlmICgoc2lnbmVkX3dvcmQpIEdQUltSU10gPCAoc2lnbmVkX3dvcmQpIEVYVEVORDE2IChJTU1FRElBVEUpKQorICAgIFNpZ25hbEV4Y2VwdGlvbihUcmFwLCBpbnN0cnVjdGlvbl8wKTsKK30KKworCiswMDAwMDEsNS5SUywwMTAxMSwxNi5JTU1FRElBVEU6UkVHSU1NOjMyOjpUTFRJVQorInRsdGl1IHI8UlM+LCA8SU1NRURJQVRFPiIKKyptaXBzSUk6CisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKK3sKKyAgaWYgKCh1bnNpZ25lZF93b3JkKSBHUFJbUlNdIDwgKHVuc2lnbmVkX3dvcmQpIEVYVEVORDE2IChJTU1FRElBVEUpKQorICAgIFNpZ25hbEV4Y2VwdGlvbihUcmFwLCBpbnN0cnVjdGlvbl8wKTsKK30KKworCiswMDAwMDAsNS5SUyw1LlJULDEwLkNPREUsMTEwMDExOlNQRUNJQUw6MzI6OlRMVFUKKyJ0bHR1IHI8UlM+LCByPFJUPiIKKyptaXBzSUk6CisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKK3sKKyAgaWYgKCh1bnNpZ25lZF93b3JkKSBHUFJbUlNdIDwgKHVuc2lnbmVkX3dvcmQpIEdQUltSVF0pCisgICAgU2lnbmFsRXhjZXB0aW9uKFRyYXAsIGluc3RydWN0aW9uXzApOworfQorCisKKzAwMDAwMCw1LlJTLDUuUlQsMTAuQ09ERSwxMTAxMTA6U1BFQ0lBTDozMjo6VE5FCisidG5lIHI8UlM+LCByPFJUPiIKKyptaXBzSUk6CisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKK3sKKyAgaWYgKChzaWduZWRfd29yZCkgR1BSW1JTXSAhPSAoc2lnbmVkX3dvcmQpIEdQUltSVF0pCisgICAgU2lnbmFsRXhjZXB0aW9uKFRyYXAsIGluc3RydWN0aW9uXzApOworfQorCisKKzAwMDAwMSw1LlJTLDAxMTEwLDE2LklNTUVESUFURTpSRUdJTU06MzI6OlRORUkKKyJ0bmUgcjxSUz4sIDxJTU1FRElBVEU+IgorKm1pcHNJSToKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICBpZiAoKHNpZ25lZF93b3JkKSBHUFJbUlNdICE9IChzaWduZWRfd29yZCkgRVhURU5EMTYgKElNTUVESUFURSkpCisgICAgU2lnbmFsRXhjZXB0aW9uKFRyYXAsIGluc3RydWN0aW9uXzApOworfQorCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9feG9yOmludCBycywgaW50IHJ0LCBpbnQgcmQKK3sKKyAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3JzXSwgR1BSW3J0XSk7CisgIEdQUltyZF0gPSBHUFJbcnNdIF4gR1BSW3J0XTsKKyAgVFJBQ0VfQUxVX1JFU1VMVCAoR1BSW3JkXSk7Cit9CisKKzAwMDAwMCw1LlJTLDUuUlQsNS5SRCwwMDAwMDEwMDExMDpTUEVDSUFMOjMyOjpYT1IKKyJ4b3IgcjxSRD4sIHI8UlM+LCByPFJUPiIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgZG9feG9yIChTRF8sIFJTLCBSVCwgUkQpOworfQorCisKKzpmdW5jdGlvbjo6OnZvaWQ6ZG9feG9yaTppbnQgcnMsIGludCBydCwgdW5zaWduZWQxNiBpbW1lZGlhdGUKK3sKKyAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW3JzXSwgaW1tZWRpYXRlKTsKKyAgR1BSW3J0XSA9IEdQUltyc10gXiBpbW1lZGlhdGU7CisgIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltydF0pOworfQorCiswMDExMTAsNS5SUyw1LlJULDE2LklNTUVESUFURTpOT1JNQUw6MzI6OlhPUkkKKyJ4b3JpIHI8UlQ+LCByPFJTPiwgPElNTUVESUFURT4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGRvX3hvcmkgKFNEXywgUlMsIFJULCBJTU1FRElBVEUpOworfQorCisMCisvLworLy8gTUlQUyBBcmNoaXRlY3R1cmU6CisvLworLy8gICAgICAgIEZQVSBJbnN0cnVjdGlvbiBTZXQgKENPUDEgJiBDT1AxWCkKKy8vCisKKworOiVzOjo6OkZNVDppbnQgZm10Cit7CisgIHN3aXRjaCAoZm10KQorICAgIHsKKyAgICBjYXNlIGZtdF9zaW5nbGU6IHJldHVybiAicyI7CisgICAgY2FzZSBmbXRfZG91YmxlOiByZXR1cm4gImQiOworICAgIGNhc2UgZm10X3dvcmQ6IHJldHVybiAidyI7CisgICAgY2FzZSBmbXRfbG9uZzogcmV0dXJuICJsIjsKKyAgICBkZWZhdWx0OiByZXR1cm4gIj8iOworICAgIH0KK30KKworOiVzOjo6Olg6aW50IHgKK3sKKyAgc3dpdGNoICh4KQorICAgIHsKKyAgICBjYXNlIDA6IHJldHVybiAiZiI7CisgICAgY2FzZSAxOiByZXR1cm4gInQiOworICAgIGRlZmF1bHQ6IHJldHVybiAiPyI7CisgICAgfQorfQorCis6JXM6Ojo6VEY6aW50IHRmCit7CisgIGlmICh0ZikKKyAgICByZXR1cm4gInQiOworICBlbHNlCisgICAgcmV0dXJuICJmIjsKK30KKworOiVzOjo6Ok5EOmludCBuZAoreworICBpZiAobmQpCisgICAgcmV0dXJuICJsIjsKKyAgZWxzZQorICAgIHJldHVybiAiIjsKK30KKworOiVzOjo6OkNPTkQ6aW50IGNvbmQKK3sKKyAgc3dpdGNoIChjb25kKQorICAgIHsKKyAgICBjYXNlIDAwOiByZXR1cm4gImYiOworICAgIGNhc2UgMDE6IHJldHVybiAidW4iOworICAgIGNhc2UgMDI6IHJldHVybiAiZXEiOworICAgIGNhc2UgMDM6IHJldHVybiAidWVxIjsKKyAgICBjYXNlIDA0OiByZXR1cm4gIm9sdCI7CisgICAgY2FzZSAwNTogcmV0dXJuICJ1bHQiOworICAgIGNhc2UgMDY6IHJldHVybiAib2xlIjsKKyAgICBjYXNlIDA3OiByZXR1cm4gInVsZSI7CisgICAgY2FzZSAwMTA6IHJldHVybiAic2YiOworICAgIGNhc2UgMDExOiByZXR1cm4gIm5nbGUiOworICAgIGNhc2UgMDEyOiByZXR1cm4gInNlcSI7CisgICAgY2FzZSAwMTM6IHJldHVybiAibmdsIjsKKyAgICBjYXNlIDAxNDogcmV0dXJuICJsdCI7CisgICAgY2FzZSAwMTU6IHJldHVybiAibmdlIjsKKyAgICBjYXNlIDAxNjogcmV0dXJuICJsZSI7CisgICAgY2FzZSAwMTc6IHJldHVybiAibmd0IjsKKyAgICBkZWZhdWx0OiByZXR1cm4gIj8iOworICAgIH0KK30KKworCiswMTAwMDEsMTAsMy5GTVQsMDAwMDAsNS5GUyw1LkZELDAwMDEwMTpDT1AxOjMyLGY6OkFCUy5mbXQKKyJhYnMuJXM8Rk1UPiBmPEZEPiwgZjxGUz4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOworICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7CisgIHsKKyAgICBpZiAoKGZvcm1hdCAhPSBmbXRfc2luZ2xlKSAmJiAoZm9ybWF0ICE9IGZtdF9kb3VibGUpKQorICAgICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOworICAgIGVsc2UKKyAgICAgIFN0b3JlRlBSKGRlc3RyZWcsZm9ybWF0LEFic29sdXRlVmFsdWUoVmFsdWVGUFIoZnMsZm9ybWF0KSxmb3JtYXQpKTsKKyAgfQorfQorCisKKworMDEwMDAxLDEwLDMuRk1ULDUuRlQsNS5GUyw1LkZELDAwMDAwMDpDT1AxOjMyLGY6OkFERC5mbXQKKyJhZGQuJXM8Rk1UPiBmPEZEPiwgZjxGUz4sIGY8RlQ+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKKyAgaW50IGRlc3RyZWcgPSAoKGluc3RydWN0aW9uID4+IDYpICYgMHgwMDAwMDAxRik7CisgIGludCBmcyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTEpICYgMHgwMDAwMDAxRik7CisgIGludCBmdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTYpICYgMHgwMDAwMDAxRik7CisgIGludCBmb3JtYXQgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMDcpOworICB7CisgICAgaWYgKChmb3JtYXQgIT0gZm10X3NpbmdsZSkgJiYgKGZvcm1hdCAhPSBmbXRfZG91YmxlKSkKKyAgICAgIFNpZ25hbEV4Y2VwdGlvbihSZXNlcnZlZEluc3RydWN0aW9uLCBpbnN0cnVjdGlvbik7CisgICAgZWxzZQorICAgICAgU3RvcmVGUFIoZGVzdHJlZyxmb3JtYXQsQWRkKFZhbHVlRlBSKGZzLGZvcm1hdCksVmFsdWVGUFIoZnQsZm9ybWF0KSxmb3JtYXQpKTsKKyAgfQorfQorCisKKworLy8gQkMxRgorLy8gQkMxRkwKKy8vIEJDMVQKKy8vIEJDMVRMCisKKzAxMDAwMSwwMTAwMCwzLjAsMS5ORCwxLlRGLDE2Lk9GRlNFVDpDT1AxUzozMixmOjpCQzFhCisiYmMxJXM8VEY+JXM8TkQ+IDxPRkZTRVQ+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJOgoreworICBjaGVja19icmFuY2hfYnVnICgpOworICBUUkFDRV9CUkFOQ0hfSU5QVVQgKFBSRVZDT0MxKCkpOworICBpZiAoUFJFVkNPQzEoKSA9PSBURikKKyAgICB7CisgICAgICBhZGRyZXNzX3dvcmQgZGVzdCA9IE5JQSArIChFWFRFTkQxNiAoT0ZGU0VUKSA8PCAyKTsKKyAgICAgIFRSQUNFX0JSQU5DSF9SRVNVTFQgKGRlc3QpOworICAgICAgbWFya19icmFuY2hfYnVnIChkZXN0KTsKKyAgICAgIERFTEFZX1NMT1QgKGRlc3QpOworICAgIH0KKyAgZWxzZSBpZiAoTkQpCisgICAgeworICAgICAgVFJBQ0VfQlJBTkNIX1JFU1VMVCAoMCk7CisgICAgICBOVUxMSUZZX05FWFRfSU5TVFJVQ1RJT04gKCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgVFJBQ0VfQlJBTkNIX1JFU1VMVCAoTklBKTsKKyAgICB9Cit9CisKKzAxMDAwMSwwMTAwMCwzLkNDLDEuTkQsMS5URiwxNi5PRkZTRVQ6Q09QMVM6MzIsZjo6QkMxYgorImJjMSVzPFRGPiVzPE5EPiA8T0ZGU0VUPiI6Q0MgPT0gMAorImJjMSVzPFRGPiVzPE5EPiA8Q0M+LCA8T0ZGU0VUPiIKKyptaXBzSVY6CisqdnI1MDAwOgorIyp2cjQxMDA6CisqcjM5MDA6Cit7CisgIGNoZWNrX2JyYW5jaF9idWcgKCk7CisgIGlmIChHRVRGQ0MoQ0MpID09IFRGKQorICAgIHsKKyAgICAgIGFkZHJlc3Nfd29yZCBkZXN0ID0gTklBICsgKEVYVEVORDE2IChPRkZTRVQpIDw8IDIpOworICAgICAgbWFya19icmFuY2hfYnVnIChkZXN0KTsKKyAgICAgIERFTEFZX1NMT1QgKGRlc3QpOworICAgIH0KKyAgZWxzZSBpZiAoTkQpCisgICAgeworICAgICAgTlVMTElGWV9ORVhUX0lOU1RSVUNUSU9OICgpOworICAgIH0KK30KKworCisKKworCisKKy8vIEMuRVEuUworLy8gQy5FUS5ECisvLyAuLi4KKworOmZ1bmN0aW9uOjo6dm9pZDpkb19jX2NvbmRfZm10OmludCBmbXQsIGludCBmdCwgaW50IGZzLCBpbnQgY2MsIGludCBjb25kLCBpbnN0cnVjdGlvbl93b3JkIGluc24KK3sKKyAgaWYgKChmbXQgIT0gZm10X3NpbmdsZSkgJiYgKGZtdCAhPSBmbXRfZG91YmxlKSkKKyAgICBTaWduYWxFeGNlcHRpb24gKFJlc2VydmVkSW5zdHJ1Y3Rpb24sIGluc24pOworICBlbHNlCisgICAgeworICAgICAgaW50IGxlc3M7CisgICAgICBpbnQgZXF1YWw7CisgICAgICBpbnQgdW5vcmRlcmVkOworICAgICAgaW50IGNvbmRpdGlvbjsKKyAgICAgIHVuc2lnbmVkNjQgb2ZzID0gVmFsdWVGUFIgKGZzLCBmbXQpOworICAgICAgdW5zaWduZWQ2NCBvZnQgPSBWYWx1ZUZQUiAoZnQsIGZtdCk7CisgICAgICBpZiAoTmFOIChvZnMsIGZtdCkgfHwgTmFOIChvZnQsIGZtdCkpCisJeworCSAgaWYgKEZDU1IgJiBGUF9FTkFCTEUgKElPKSkKKwkgICAgeworCSAgICAgIEZDU1IgfD0gRlBfQ0FVU0UgKElPKTsKKwkgICAgICBTaWduYWxFeGNlcHRpb25GUEUgKCk7CisJICAgIH0KKwkgIGxlc3MgPSAwOworCSAgZXF1YWwgPSAwOworCSAgdW5vcmRlcmVkID0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbGVzcyA9IExlc3MgKG9mcywgb2Z0LCBmbXQpOworCSAgZXF1YWwgPSBFcXVhbCAob2ZzLCBvZnQsIGZtdCk7CisJICB1bm9yZGVyZWQgPSAwOworCX0KKyAgICAgIGNvbmRpdGlvbiA9ICgoKGNvbmQgJiAoMSA8PCAyKSkgJiYgbGVzcykKKwkJICAgfHwgKChjb25kICYgKDEgPDwgMSkpICYmIGVxdWFsKQorCQkgICB8fCAoKGNvbmQgJiAoMSA8PCAwKSkgJiYgdW5vcmRlcmVkKSk7CisgICAgICBTRVRGQ0MgKGNjLCBjb25kaXRpb24pOworICAgIH0KK30KKworMDEwMDAxLDEwLDMuRk1ULDUuRlQsNS5GUywzLjAsMDAsMTEsNC5DT05EOkNPUDE6MzI6OkMuY29uZC5mbXRhCisiYy4lczxDT05EPi4lczxGTVQ+IGY8RlM+LCBmPEZUPiIKKyptaXBzSSxtaXBzSUksbWlwc0lJSToKK3sKKyAgZG9fY19jb25kX2ZtdCAoU0RfLCBGTVQsIEZULCBGUywgMCwgQ09ORCwgaW5zdHJ1Y3Rpb25fMCk7Cit9CisKKzAxMDAwMSwxMCwzLkZNVCw1LkZULDUuRlMsMy5DQywwMCwxMSw0LkNPTkQ6Q09QMTozMjo6Qy5jb25kLmZtdGIKKyJjLiVzPENPTkQ+LiVzPEZNVD4gZjxGUz4sIGY8RlQ+IjpDQyA9PSAwCisiYy4lczxDT05EPi4lczxGTVQ+IDxDQz4sIGY8RlM+LCBmPEZUPiIKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgZG9fY19jb25kX2ZtdCAoU0RfLCBGTVQsIEZULCBGUywgQ0MsIENPTkQsIGluc3RydWN0aW9uXzApOworfQorCisKKzAxMDAwMSwxMCwzLkZNVCwwMDAwMCw1LkZTLDUuRkQsMDAxMDEwOkNPUDE6NjQ6OkNFSUwuTC5mbXQKKyJjZWlsLmwuJXM8Rk1UPiBmPEZEPiwgZjxGUz4iCisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOworICBpbnQgZm9ybWF0ID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDA3KTsKKyAgeworICAgIGlmICgoZm9ybWF0ICE9IGZtdF9zaW5nbGUpICYmIChmb3JtYXQgIT0gZm10X2RvdWJsZSkpCisgICAgICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbixpbnN0cnVjdGlvbik7CisgICAgZWxzZQorICAgICAgU3RvcmVGUFIoZGVzdHJlZyxmbXRfbG9uZyxDb252ZXJ0KEZQX1JNX1RPUElORixWYWx1ZUZQUihmcyxmb3JtYXQpLGZvcm1hdCxmbXRfbG9uZykpOworICB9Cit9CisKKworMDEwMDAxLDEwLDMuRk1ULDAwMDAwLDUuRlMsNS5GRCwwMDExMTA6Q09QMTozMjo6Q0VJTC5XCisqbWlwc0lJOgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOworICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7CisgIHsKKyAgaWYgKChmb3JtYXQgIT0gZm10X3NpbmdsZSkgJiYgKGZvcm1hdCAhPSBmbXRfZG91YmxlKSkKKyAgIFNpZ25hbEV4Y2VwdGlvbihSZXNlcnZlZEluc3RydWN0aW9uLGluc3RydWN0aW9uKTsKKyAgZWxzZQorICAgU3RvcmVGUFIoZGVzdHJlZyxmbXRfd29yZCxDb252ZXJ0KEZQX1JNX1RPUElORixWYWx1ZUZQUihmcyxmb3JtYXQpLGZvcm1hdCxmbXRfd29yZCkpOworICB9Cit9CisKKworLy8gQ0ZDMQorLy8gQ1RDMQorMDEwMDAxLDAwLFgsMTAsNS5SVCw1LkZTLDAwMDAwMDAwMDAwOkNPUDFTYTozMjo6Q3hDMQorImMlczxYPmMxIHI8UlQ+LCBmPEZTPiIKKyptaXBzSToKKyptaXBzSUk6CisqbWlwc0lJSToKK3sKKyAgaWYgKFgpCisgICAgeworICAgICAgaWYgKEZTID09IDApCisJUEVORElOR19GSUxMKChGUyArIEZDUjBJRFgpLFZMNF84KEdQUltSVF0pKTsKKyAgICAgIGVsc2UgaWYgKEZTID09IDMxKQorCVBFTkRJTkdfRklMTCgoRlMgKyBGQ1IzMUlEWCksVkw0XzgoR1BSW1JUXSkpOworICAgICAgLyogZWxzZSBOT1AgKi8KKyAgICAgIFBFTkRJTkdfRklMTChDT0NJRFgsMCk7IC8qIHNwZWNpYWwgY2FzZSAqLworICAgIH0KKyAgZWxzZQorICAgIHsgLyogY29udHJvbCBmcm9tICovCisgICAgICBpZiAoRlMgPT0gMCkKKyAJUEVORElOR19GSUxMKFJULFNJR05FWFRFTkQoRkNSMCwzMikpOworICAgICAgZWxzZSBpZiAoRlMgPT0gMzEpCisgCVBFTkRJTkdfRklMTChSVCxTSUdORVhURU5EKEZDUjMxLDMyKSk7CisgICAgICAvKiBlbHNlIE5PUCAqLworICAgIH0KK30KKzAxMDAwMSwwMCxYLDEwLDUuUlQsNS5GUywwMDAwMDAwMDAwMDpDT1AxU2I6MzI6OkN4QzEKKyJjJXM8WD5jMSByPFJUPiwgZjxGUz4iCisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGlmIChYKQorICAgIHsKKyAgICAgIC8qIGNvbnRyb2wgdG8gKi8KKyAgICAgIFRSQUNFX0FMVV9JTlBVVDEgKEdQUltSVF0pOworICAgICAgaWYgKEZTID09IDApCisJeworCSAgRkNSMCA9IFZMNF84KEdQUltSVF0pOworCSAgVFJBQ0VfQUxVX1JFU1VMVCAoRkNSMCk7CisJfQorICAgICAgZWxzZSBpZiAoRlMgPT0gMzEpCisJeworCSAgRkNSMzEgPSBWTDRfOChHUFJbUlRdKTsKKwkgIFNFVEZDQygwLCgoRkNSMzEgJiAoMSA8PCAyMykpID8gMSA6IDApKTsKKwkgIFRSQUNFX0FMVV9SRVNVTFQgKEZDUjMxKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgVFJBQ0VfQUxVX1JFU1VMVDAgKCk7CisJfQorICAgICAgLyogZWxzZSBOT1AgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7IC8qIGNvbnRyb2wgZnJvbSAqLworICAgICAgaWYgKEZTID09IDApCisJeworCSAgVFJBQ0VfQUxVX0lOUFVUMSAoRkNSMCk7CisJICBHUFJbUlRdID0gU0lHTkVYVEVORCAoRkNSMCwgMzIpOworCX0KKyAgICAgIGVsc2UgaWYgKEZTID09IDMxKQorCXsKKwkgIFRSQUNFX0FMVV9JTlBVVDEgKEZDUjMxKTsKKwkgIEdQUltSVF0gPSBTSUdORVhURU5EIChGQ1IzMSwgMzIpOworCX0KKyAgICAgIFRSQUNFX0FMVV9SRVNVTFQgKEdQUltSVF0pOworICAgICAgLyogZWxzZSBOT1AgKi8KKyAgICB9Cit9CisKKworLy8KKy8vIEZJWE1FOiBEb2VzIG5vdCBjb3JyZWN0bHkgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG1pcHMqCisvLworMDEwMDAxLDEwLDMuRk1ULDAwMDAwLDUuRlMsNS5GRCwxMDAwMDE6Q09QMTozMjo6Q1ZULkQuZm10CisiY3Z0LmQuJXM8Rk1UPiBmPEZEPiwgZjxGUz4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOworICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7CisgIHsKKyAgICBpZiAoKGZvcm1hdCA9PSBmbXRfZG91YmxlKSB8IDApCisgICAgICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbixpbnN0cnVjdGlvbik7CisgICAgZWxzZQorICAgICAgU3RvcmVGUFIoZGVzdHJlZyxmbXRfZG91YmxlLENvbnZlcnQoR0VUUk0oKSxWYWx1ZUZQUihmcyxmb3JtYXQpLGZvcm1hdCxmbXRfZG91YmxlKSk7CisgIH0KK30KKworCiswMTAwMDEsMTAsMy5GTVQsMDAwMDAsNS5GUyw1LkZELDEwMDEwMTpDT1AxOjY0OjpDVlQuTC5mbXQKKyJjdnQubC4lczxGTVQ+IGY8RkQ+LCBmPEZTPiIKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKKyAgaW50IGRlc3RyZWcgPSAoKGluc3RydWN0aW9uID4+IDYpICYgMHgwMDAwMDAxRik7CisgIGludCBmcyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTEpICYgMHgwMDAwMDAxRik7CisgIGludCBmb3JtYXQgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMDcpOworICB7CisgICAgaWYgKChmb3JtYXQgPT0gZm10X2xvbmcpIHwgKChmb3JtYXQgPT0gZm10X2xvbmcpIHx8IChmb3JtYXQgPT0gZm10X3dvcmQpKSkKKyAgICAgIFNpZ25hbEV4Y2VwdGlvbihSZXNlcnZlZEluc3RydWN0aW9uLGluc3RydWN0aW9uKTsKKyAgICBlbHNlCisgICAgICBTdG9yZUZQUihkZXN0cmVnLGZtdF9sb25nLENvbnZlcnQoR0VUUk0oKSxWYWx1ZUZQUihmcyxmb3JtYXQpLGZvcm1hdCxmbXRfbG9uZykpOworICB9Cit9CisKKworLy8KKy8vIEZJWE1FOiBEb2VzIG5vdCBjb3JyZWN0bHkgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG1pcHMqCisvLworMDEwMDAxLDEwLDMuRk1ULDAwMDAwLDUuRlMsNS5GRCwxMDAwMDA6Q09QMTozMjo6Q1ZULlMuZm10CisiY3Z0LnMuJXM8Rk1UPiBmPEZEPiwgZjxGUz4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOworICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7CisgIHsKKyAgICBpZiAoKGZvcm1hdCA9PSBmbXRfc2luZ2xlKSB8IDApCisgICAgICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbixpbnN0cnVjdGlvbik7CisgICAgZWxzZQorICAgICAgU3RvcmVGUFIoZGVzdHJlZyxmbXRfc2luZ2xlLENvbnZlcnQoR0VUUk0oKSxWYWx1ZUZQUihmcyxmb3JtYXQpLGZvcm1hdCxmbXRfc2luZ2xlKSk7CisgIH0KK30KKworCiswMTAwMDEsMTAsMy5GTVQsMDAwMDAsNS5GUyw1LkZELDEwMDEwMDpDT1AxOjMyOjpDVlQuVy5mbXQKKyJjdnQudy4lczxGTVQ+IGY8RkQ+LCBmPEZTPiIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOworICBpbnQgZm9ybWF0ID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDA3KTsKKyAgeworICAgIGlmICgoZm9ybWF0ID09IGZtdF93b3JkKSB8ICgoZm9ybWF0ID09IGZtdF9sb25nKSB8fCAoZm9ybWF0ID09IGZtdF93b3JkKSkpCisgICAgICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbixpbnN0cnVjdGlvbik7CisgICAgZWxzZQorICAgICAgU3RvcmVGUFIoZGVzdHJlZyxmbXRfd29yZCxDb252ZXJ0KEdFVFJNKCksVmFsdWVGUFIoZnMsZm9ybWF0KSxmb3JtYXQsZm10X3dvcmQpKTsKKyAgfQorfQorCisKKzAxMDAwMSwxMCwzLkZNVCw1LkZULDUuRlMsNS5GRCwwMDAwMTE6Q09QMTozMjo6RElWLmZtdAorImRpdi4lczxGTVQ+IGY8RkQ+LCBmPEZTPiwgZjxGVD4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOworICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZ0ID0gKChpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7CisgIHsKKyAgICBpZiAoKGZvcm1hdCAhPSBmbXRfc2luZ2xlKSAmJiAoZm9ybWF0ICE9IGZtdF9kb3VibGUpKQorICAgICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOworICAgIGVsc2UKKyAgICAgIFN0b3JlRlBSKGRlc3RyZWcsZm9ybWF0LERpdmlkZShWYWx1ZUZQUihmcyxmb3JtYXQpLFZhbHVlRlBSKGZ0LGZvcm1hdCksZm9ybWF0KSk7CisgIH0KK30KKworCisvLyBETUZDMQorLy8gRE1UQzEKKzAxMDAwMSwwMCxYLDAxLDUuUlQsNS5GUywwMDAwMDAwMDAwMDpDT1AxU2E6NjQ6OkRNeEMxCisiZG0lczxYPmMxIHI8UlQ+LCBmPEZTPiIKKyptaXBzSUlJOgoreworICBpZiAoWCkKKyAgICB7CisgICAgICBpZiAoU2l6ZUZHUigpID09IDY0KQorCVBFTkRJTkdfRklMTCgoRlMgKyBGR1JJRFgpLEdQUltSVF0pOworICAgICAgZWxzZSBpZiAoKEZTICYgMHgxKSA9PSAwKQorCXsKKwkgIFBFTkRJTkdfRklMTCgoKEZTICsgMSkgKyBGR1JJRFgpLFZINF84KEdQUltSVF0pKTsKKwkgIFBFTkRJTkdfRklMTCgoRlMgKyBGR1JJRFgpLFZMNF84KEdQUltSVF0pKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKFNpemVGR1IoKSA9PSA2NCkKKwlQRU5ESU5HX0ZJTEwoUlQsRkdSW0ZTXSk7CisgICAgICBlbHNlIGlmICgoRlMgJiAweDEpID09IDApCisJUEVORElOR19GSUxMKFJULChTRVQ2NEhJKEZHUltGUysxXSkgfCBGR1JbRlNdKSk7CisgICAgICBlbHNlCisJUEVORElOR19GSUxMKFJULFNFVDY0SEkoMHhERUFEQzBERSkgfCAweEJBRDBCQUQwKTsKKyAgICB9Cit9CiswMTAwMDEsMDAsWCwwMSw1LlJULDUuRlMsMDAwMDAwMDAwMDA6Q09QMVNiOjY0OjpETXhDMQorImRtJXM8WD5jMSByPFJUPiwgZjxGUz4iCisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIGlmIChYKQorICAgIHsKKyAgICAgIGlmIChTaXplRkdSKCkgPT0gNjQpCisJU3RvcmVGUFIgKEZTLCBmbXRfdW5pbnRlcnByZXRlZF82NCwgR1BSW1JUXSk7CisgICAgICBlbHNlIGlmICgoRlMgJiAweDEpID09IDApCisJU3RvcmVGUFIgKEZTLCBmbXRfdW5pbnRlcnByZXRlZF82NCwgU0VUNjRISSAoRkdSW0ZTKzFdKSB8IEZHUltGU10pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChTaXplRkdSKCkgPT0gNjQpCisJR1BSW1JUXSA9IEZHUltGU107CisgICAgICBlbHNlIGlmICgoRlMgJiAweDEpID09IDApCisJR1BSW1JUXSA9IFNFVDY0SEkgKEZHUltGUysxXSkgfCBGR1JbRlNdOworICAgICAgZWxzZQorCUdQUltSVF0gPSBTRVQ2NEhJICgweERFQURDMERFKSB8IDB4QkFEMEJBRDA7CisgICAgfQorfQorCisKKzAxMDAwMSwxMCwzLkZNVCwwMDAwMCw1LkZTLDUuRkQsMDAxMDExOkNPUDE6NjQ6OkZMT09SLkwuZm10CisiZmxvb3IubC4lczxGTVQ+IGY8RkQ+LCBmPEZTPiIKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKKyAgaW50IGRlc3RyZWcgPSAoKGluc3RydWN0aW9uID4+IDYpICYgMHgwMDAwMDAxRik7CisgIGludCBmcyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTEpICYgMHgwMDAwMDAxRik7CisgIGludCBmb3JtYXQgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMDcpOworICB7CisgICAgaWYgKChmb3JtYXQgIT0gZm10X3NpbmdsZSkgJiYgKGZvcm1hdCAhPSBmbXRfZG91YmxlKSkKKyAgICAgIFNpZ25hbEV4Y2VwdGlvbihSZXNlcnZlZEluc3RydWN0aW9uLGluc3RydWN0aW9uKTsKKyAgICBlbHNlCisgICAgICBTdG9yZUZQUihkZXN0cmVnLGZtdF9sb25nLENvbnZlcnQoRlBfUk1fVE9NSU5GLFZhbHVlRlBSKGZzLGZvcm1hdCksZm9ybWF0LGZtdF9sb25nKSk7CisgIH0KK30KKworCiswMTAwMDEsMTAsMy5GTVQsMDAwMDAsNS5GUyw1LkZELDAwMTExMTpDT1AxOjMyOjpGTE9PUi5XLmZtdAorImZsb29yLncuJXM8Rk1UPiBmPEZEPiwgZjxGUz4iCisqbWlwc0lJOgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOworICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7CisgIHsKKyAgICBpZiAoKGZvcm1hdCAhPSBmbXRfc2luZ2xlKSAmJiAoZm9ybWF0ICE9IGZtdF9kb3VibGUpKQorICAgICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOworICAgIGVsc2UKKyAgICAgIFN0b3JlRlBSKGRlc3RyZWcsZm10X3dvcmQsQ29udmVydChGUF9STV9UT01JTkYsVmFsdWVGUFIoZnMsZm9ybWF0KSxmb3JtYXQsZm10X3dvcmQpKTsKKyAgfQorfQorCisKKzExMDEwMSw1LkJBU0UsNS5GVCwxNi5PRkZTRVQ6Q09QMTo2NDo6TERDMQorImxkYzEgZjxGVD4sIDxPRkZTRVQ+KHI8QkFTRT4pIgorKm1pcHNJSToKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBDT1BfTEQgKDEsIEZULCBkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JELCBHUFJbQkFTRV0sIEVYVEVORDE2IChPRkZTRVQpKSk7Cit9CisKKworMDEwMDExLDUuQkFTRSw1LklOREVYLDUuMCw1LkZELDAwMDAwMTpDT1AxWDo2NDo6TERYQzEKKyJsZHhjMSBmPEZEPiwgcjxJTkRFWD4ocjxCQVNFPikiCisqbWlwc0lWOgorKnZyNTAwMDoKK3sKKyAgQ09QX0xEICgxLCBGRCwgZG9fbG9hZCAoU0RfLCBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCwgR1BSW0JBU0VdLCBHUFJbSU5ERVhdKSk7Cit9CisKKworCisxMTAwMDEsNS5CQVNFLDUuRlQsMTYuT0ZGU0VUOkNPUDE6MzI6OkxXQzEgCisibHdjMSBmPEZUPiwgPE9GRlNFVD4ocjxCQVNFPikiCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIENPUF9MVyAoMSwgRlQsIGRvX2xvYWQgKFNEXywgQWNjZXNzTGVuZ3RoX1dPUkQsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCkpKTsKK30KKworCiswMTAwMTEsNS5CQVNFLDUuSU5ERVgsNS4wLDUuRkQsMDAwMDAwOkNPUDFYOjMyOjpMV1hDMQorImx3eGMxIGY8RkQ+LCByPElOREVYPihyPEJBU0U+KSIKKyptaXBzSVY6CisqdnI1MDAwOgoreworICBDT1BfTFcgKDEsIEZELCBkb19sb2FkIChTRF8sIEFjY2Vzc0xlbmd0aF9XT1JELCBHUFJbQkFTRV0sIEdQUltJTkRFWF0pKTsKK30KKworCisKKy8vCisvLyBGSVhNRTogTm90IGNvcnJlY3QgZm9yIG1pcHMqCisvLworMDEwMDExLDUuRlIsNS5GVCw1LkZTLDUuRkQsMTAwLDAwMTpDT1AxWDozMixmOjpNQURELkQKKyJtYWRkLmQgZjxGRD4sIGY8RlI+LCBmPEZTPiwgZjxGVD4iCisqbWlwc0lWOgorKnZyNTAwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnQgPSAoKGluc3RydWN0aW9uID4+IDE2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnIgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMUYpOworICB7CisgICAgU3RvcmVGUFIoZGVzdHJlZyxmbXRfZG91YmxlLEFkZChNdWx0aXBseShWYWx1ZUZQUihmcyxmbXRfZG91YmxlKSxWYWx1ZUZQUihmdCxmbXRfZG91YmxlKSxmbXRfZG91YmxlKSxWYWx1ZUZQUihmcixmbXRfZG91YmxlKSxmbXRfZG91YmxlKSk7CisgIH0KK30KKworCiswMTAwMTEsNS5GUiw1LkZULDUuRlMsNS5GRCwxMDAsMDAwOkNPUDFYOjMyLGY6Ok1BREQuUworIm1hZGQucyBmPEZEPiwgZjxGUj4sIGY8RlM+LCBmPEZUPiIKKyptaXBzSVY6CisqdnI1MDAwOgoreworICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKKyAgaW50IGRlc3RyZWcgPSAoKGluc3RydWN0aW9uID4+IDYpICYgMHgwMDAwMDAxRik7CisgIGludCBmcyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTEpICYgMHgwMDAwMDAxRik7CisgIGludCBmdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTYpICYgMHgwMDAwMDAxRik7CisgIGludCBmciA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAxRik7CisgIHsKKyAgICBTdG9yZUZQUihkZXN0cmVnLGZtdF9zaW5nbGUsQWRkKE11bHRpcGx5KFZhbHVlRlBSKGZzLGZtdF9zaW5nbGUpLFZhbHVlRlBSKGZ0LGZtdF9zaW5nbGUpLGZtdF9zaW5nbGUpLFZhbHVlRlBSKGZyLGZtdF9zaW5nbGUpLGZtdF9zaW5nbGUpKTsKKyAgfQorfQorCisKKy8vIE1GQzEKKy8vIE1UQzEKKzAxMDAwMSwwMCxYLDAwLDUuUlQsNS5GUywwMDAwMDAwMDAwMDpDT1AxU2E6MzI6Ok14QzEKKyJtJXM8WD5jMSByPFJUPiwgZjxGUz4iCisqbWlwc0k6CisqbWlwc0lJOgorKm1pcHNJSUk6Cit7CisgIGlmIChYKQorICAgIHsgLypNVEMxKi8KKyAgICAgIGlmIChTaXplRkdSKCkgPT0gNjQpCisJUEVORElOR19GSUxMICgoRlMgKyBGR1JJRFgpLCAoU0VUNjRISSgweERFQURDMERFKSB8IFZMNF84KEdQUltSVF0pKSk7CisgICAgICBlbHNlCisJUEVORElOR19GSUxMICgoRlMgKyBGR1JJRFgpLCBWTDRfOChHUFJbUlRdKSk7CisgICAgfQorICBlbHNlIC8qTUZDMSovCisgICAgUEVORElOR19GSUxMIChSVCwgU0lHTkVYVEVORChGR1JbRlNdLDMyKSk7Cit9CiswMTAwMDEsMDAsWCwwMCw1LlJULDUuRlMsMDAwMDAwMDAwMDA6Q09QMVNiOjMyOjpNeEMxCisibSVzPFg+YzEgcjxSVD4sIGY8RlM+IgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICBpbnQgZnMgPSBGUzsKKyAgaWYgKFgpCisgICAgLypNVEMxKi8KKyAgICBTdG9yZUZQUiAoRlMsIGZtdF91bmludGVycHJldGVkXzMyLCBWTDRfOCAoR1BSW1JUXSkpOworICBlbHNlIC8qTUZDMSovCisgICAgR1BSW1JUXSA9IFNJR05FWFRFTkQoRkdSW0ZTXSwzMik7Cit9CisKKworMDEwMDAxLDEwLDMuRk1ULDAwMDAwLDUuRlMsNS5GRCwwMDAxMTA6Q09QMTozMjo6TU9WLmZtdAorIm1vdi4lczxGTVQ+IGY8RkQ+LCBmPEZTPiIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOworICBpbnQgZm9ybWF0ID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDA3KTsKKyAgeworICAgIFN0b3JlRlBSKGRlc3RyZWcsZm9ybWF0LFZhbHVlRlBSKGZzLGZvcm1hdCkpOworICB9Cit9CisKKworLy8gTU9WRgorMDAwMDAwLDUuUlMsMy5DQywwLDEuVEYsNS5SRCwwMDAwMDAwMDAwMTpTUEVDSUFMOjMyOjpNT1Z0ZgorIm1vdiVzPFRGPiByPFJEPiwgcjxSUz4sIDxDQz4iCisqbWlwc0lWOgorKnZyNTAwMDoKK3sKKyAgaWYgKEdFVEZDQyhDQykgPT0gVEYpCisgICAgR1BSW1JEXSA9IEdQUltSU107Cit9CisKKworLy8gTU9WRi5mbXQKKzAxMDAwMSwxMCwzLkZNVCwzLkNDLDAsMS5URiw1LkZTLDUuRkQsMDEwMDAxOkNPUDE6MzI6Ok1PVnRmLmZtdAorIm1vdiVzPFRGPi4lczxGTVQ+IGY8RkQ+LCBmPEZTPiwgPENDPiIKKyptaXBzSVY6CisqdnI1MDAwOgoreworICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKKyAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7CisgIHsKKyAgIGlmIChHRVRGQ0MoQ0MpID09IFRGKQorICAgICBTdG9yZUZQUiAoRkQsIGZvcm1hdCwgVmFsdWVGUFIgKEZTLCBmb3JtYXQpKTsKKyAgIGVsc2UKKyAgICAgU3RvcmVGUFIgKEZELCBmb3JtYXQsIFZhbHVlRlBSIChGRCwgZm9ybWF0KSk7CisgIH0KK30KKworCiswMTAwMDEsMTAsMy5GTVQsNS5SVCw1LkZTLDUuRkQsMDEwMDExOkNPUDE6MzI6Ok1PVk4uZm10CisqbWlwc0lWOgorKnZyNTAwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOworICBpbnQgZm9ybWF0ID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDA3KTsKKyAgeworICAgIFN0b3JlRlBSKGRlc3RyZWcsZm9ybWF0LFZhbHVlRlBSKGZzLGZvcm1hdCkpOworICB9Cit9CisKKworLy8gTU9WVCBzZWUgTU9WdGYKKworCisvLyBNT1ZULmZtdCBzZWUgTU9WdGYuZm10CisKKworCiswMTAwMDEsMTAsMy5GTVQsNS5SVCw1LkZTLDUuRkQsMDEwMDEwOkNPUDE6MzI6Ok1PVlouZm10CisibW92ei4lczxGTVQ+IGY8RkQ+LCBmPEZTPiwgcjxSVD4iCisqbWlwc0lWOgorKnZyNTAwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOworICBpbnQgZm9ybWF0ID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDA3KTsKKyAgeworICAgU3RvcmVGUFIoZGVzdHJlZyxmb3JtYXQsVmFsdWVGUFIoZnMsZm9ybWF0KSk7CisgIH0KK30KKworCisvLyBNU1VCLmZtdAorMDEwMDExLDUuRlIsNS5GVCw1LkZTLDUuRkQsMTAxLDAwMTpDT1AxWDozMjo6TVNVQi5ECisibXN1Yi5kIGY8RkQ+LCBmPEZSPiwgZjxGUz4sIGY8RlQ+IgorKm1pcHNJVjoKKyp2cjUwMDA6Cit7CisgIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOworICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZ0ID0gKChpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZyID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDFGKTsKKyAgeworICAgIFN0b3JlRlBSKGRlc3RyZWcsZm10X2RvdWJsZSxTdWIoTXVsdGlwbHkoVmFsdWVGUFIoZnMsZm10X2RvdWJsZSksVmFsdWVGUFIoZnQsZm10X2RvdWJsZSksZm10X2RvdWJsZSksVmFsdWVGUFIoZnIsZm10X2RvdWJsZSksZm10X2RvdWJsZSkpOworICB9Cit9CisKKworLy8gTVNVQi5mbXQKKzAxMDAxMSw1LkZSLDUuRlQsNS5GUyw1LkZELDEwMTAwMDpDT1AxWDozMjo6TVNVQi5TCisibXN1Yi5zIGY8RkQ+LCBmPEZSPiwgZjxGUz4sIGY8RlQ+IgorKm1pcHNJVjoKKyp2cjUwMDA6Cit7CisgIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOworICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZ0ID0gKChpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZyID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDFGKTsKKyAgeworICAgU3RvcmVGUFIoZGVzdHJlZyxmbXRfc2luZ2xlLFN1YihNdWx0aXBseShWYWx1ZUZQUihmcyxmbXRfc2luZ2xlKSxWYWx1ZUZQUihmdCxmbXRfc2luZ2xlKSxmbXRfc2luZ2xlKSxWYWx1ZUZQUihmcixmbXRfc2luZ2xlKSxmbXRfc2luZ2xlKSk7CisgIH0KK30KKworCisvLyBNVEMxIHNlZSBNeEMxCisKKworMDEwMDAxLDEwLDMuRk1ULDUuRlQsNS5GUyw1LkZELDAwMDAxMDpDT1AxOjMyOjpNVUwuZm10CisibXVsLiVzPEZNVD4gZjxGRD4sIGY8RlM+LCBmPEZUPiIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnQgPSAoKGluc3RydWN0aW9uID4+IDE2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZm9ybWF0ID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDA3KTsKKyAgeworICAgIGlmICgoZm9ybWF0ICE9IGZtdF9zaW5nbGUpICYmIChmb3JtYXQgIT0gZm10X2RvdWJsZSkpCisgICAgICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbixpbnN0cnVjdGlvbik7CisgICAgZWxzZQorICAgICAgU3RvcmVGUFIoZGVzdHJlZyxmb3JtYXQsTXVsdGlwbHkoVmFsdWVGUFIoZnMsZm9ybWF0KSxWYWx1ZUZQUihmdCxmb3JtYXQpLGZvcm1hdCkpOworICB9Cit9CisKKworMDEwMDAxLDEwLDMuRk1ULDAwMDAwLDUuRlMsNS5GRCwwMDAxMTE6Q09QMTozMjo6TkVHLmZtdAorIm5lZy4lczxGTVQ+IGY8RkQ+LCBmPEZTPiIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOworICBpbnQgZm9ybWF0ID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDA3KTsKKyAgeworICAgIGlmICgoZm9ybWF0ICE9IGZtdF9zaW5nbGUpICYmIChmb3JtYXQgIT0gZm10X2RvdWJsZSkpCisgICAgICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbixpbnN0cnVjdGlvbik7CisgICAgZWxzZQorICAgICAgU3RvcmVGUFIoZGVzdHJlZyxmb3JtYXQsTmVnYXRlKFZhbHVlRlBSKGZzLGZvcm1hdCksZm9ybWF0KSk7CisgIH0KK30KKworCisvLyBOTUFERC5mbXQKKzAxMDAxMSw1LkZSLDUuRlQsNS5GUyw1LkZELDExMDAwMTpDT1AxWDozMjo6Tk1BREQuRAorIm5tYWRkLmQgZjxGRD4sIGY8RlI+LCBmPEZTPiwgZjxGVD4iCisqbWlwc0lWOgorKnZyNTAwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnQgPSAoKGluc3RydWN0aW9uID4+IDE2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnIgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMUYpOworICB7CisgICBTdG9yZUZQUihkZXN0cmVnLGZtdF9kb3VibGUsTmVnYXRlKEFkZChNdWx0aXBseShWYWx1ZUZQUihmcyxmbXRfZG91YmxlKSxWYWx1ZUZQUihmdCxmbXRfZG91YmxlKSxmbXRfZG91YmxlKSxWYWx1ZUZQUihmcixmbXRfZG91YmxlKSxmbXRfZG91YmxlKSxmbXRfZG91YmxlKSk7CisgIH0KK30KKworCisvLyBOTUFERC5mbXQKKzAxMDAxMSw1LkZSLDUuRlQsNS5GUyw1LkZELDExMDAwMDpDT1AxWDozMjo6Tk1BREQuUworIm5tYWRkLnMgZjxGRD4sIGY8RlI+LCBmPEZTPiwgZjxGVD4iCisqbWlwc0lWOgorKnZyNTAwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnQgPSAoKGluc3RydWN0aW9uID4+IDE2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnIgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMUYpOworICB7CisgICBTdG9yZUZQUihkZXN0cmVnLGZtdF9zaW5nbGUsTmVnYXRlKEFkZChNdWx0aXBseShWYWx1ZUZQUihmcyxmbXRfc2luZ2xlKSxWYWx1ZUZQUihmdCxmbXRfc2luZ2xlKSxmbXRfc2luZ2xlKSxWYWx1ZUZQUihmcixmbXRfc2luZ2xlKSxmbXRfc2luZ2xlKSxmbXRfc2luZ2xlKSk7CisgIH0KK30KKworCisvLyBOTVNVQi5mbXQKKzAxMDAxMSw1LkZSLDUuRlQsNS5GUyw1LkZELDExMTAwMTpDT1AxWDozMjo6Tk1TVUIuRAorIm5tc3ViLmQgZjxGRD4sIGY8RlI+LCBmPEZTPiwgZjxGVD4iCisqbWlwc0lWOgorKnZyNTAwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnQgPSAoKGluc3RydWN0aW9uID4+IDE2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnIgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMUYpOworICB7CisgICBTdG9yZUZQUihkZXN0cmVnLGZtdF9kb3VibGUsTmVnYXRlKFN1YihNdWx0aXBseShWYWx1ZUZQUihmcyxmbXRfZG91YmxlKSxWYWx1ZUZQUihmdCxmbXRfZG91YmxlKSxmbXRfZG91YmxlKSxWYWx1ZUZQUihmcixmbXRfZG91YmxlKSxmbXRfZG91YmxlKSxmbXRfZG91YmxlKSk7CisgIH0KK30KKworCisvLyBOTVNVQi5mbXQKKzAxMDAxMSw1LkZSLDUuRlQsNS5GUyw1LkZELDExMTAwMDpDT1AxWDozMjo6Tk1TVUIuUworIm5tc3ViLnMgZjxGRD4sIGY8RlI+LCBmPEZTPiwgZjxGVD4iCisqbWlwc0lWOgorKnZyNTAwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnQgPSAoKGluc3RydWN0aW9uID4+IDE2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnIgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMUYpOworICB7CisgICAgU3RvcmVGUFIoZGVzdHJlZyxmbXRfc2luZ2xlLE5lZ2F0ZShTdWIoTXVsdGlwbHkoVmFsdWVGUFIoZnMsZm10X3NpbmdsZSksVmFsdWVGUFIoZnQsZm10X3NpbmdsZSksZm10X3NpbmdsZSksVmFsdWVGUFIoZnIsZm10X3NpbmdsZSksZm10X3NpbmdsZSksZm10X3NpbmdsZSkpOworICB9Cit9CisKKworMDEwMDExLDUuQkFTRSw1LklOREVYLDUuSElOVCwwMDAwMDAwMTExMTpDT1AxWDozMjo6UFJFRlgKKyJwcmVmeCA8SElOVD4sIHI8SU5ERVg+KHI8QkFTRT4pIgorKm1pcHNJVjoKKyp2cjUwMDA6Cit7CisgIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOworICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOworICBzaWduZWRfd29yZCBvcDIgPSBHUFJbKChpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGKV07CisgIHNpZ25lZF93b3JkIG9wMSA9IEdQUlsoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMUYpXTsKKyAgeworICAgIGFkZHJlc3Nfd29yZCB2YWRkciA9ICgodW5zaWduZWQ2NClvcDEgKyAodW5zaWduZWQ2NClvcDIpOworICAgIGFkZHJlc3Nfd29yZCBwYWRkcjsKKyAgICBpbnQgdW5jYWNoZWQ7CisgICAgaWYgKEFkZHJlc3NUcmFuc2xhdGlvbih2YWRkcixpc0RBVEEsaXNMT0FELCZwYWRkciwmdW5jYWNoZWQsaXNUQVJHRVQsaXNSRUFMKSkKKyAgICAgIFByZWZldGNoKHVuY2FjaGVkLHBhZGRyLHZhZGRyLGlzREFUQSxmcyk7CisgIH0KK30KKworMDEwMDAxLDEwLDMuRk1ULDAwMDAwLDUuRlMsNS5GRCwwMTAxMDE6Q09QMTozMjo6UkVDSVAuZm10CisqbWlwc0lWOgorInJlY2lwLiVzPEZNVD4gZjxGRD4sIGY8RlM+IgorKnZyNTAwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOworICBpbnQgZm9ybWF0ID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDA3KTsKKyAgeworICBpZiAoKGZvcm1hdCAhPSBmbXRfc2luZ2xlKSAmJiAoZm9ybWF0ICE9IGZtdF9kb3VibGUpKQorICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOworICBlbHNlCisgICBTdG9yZUZQUihkZXN0cmVnLGZvcm1hdCxSZWNpcChWYWx1ZUZQUihmcyxmb3JtYXQpLGZvcm1hdCkpOworICB9Cit9CisKKworMDEwMDAxLDEwLDMuRk1ULDAwMDAwLDUuRlMsNS5GRCwwMDEwMDA6Q09QMTo2NDo6Uk9VTkQuTC5mbXQKKyJyb3VuZC5sLiVzPEZNVD4gZjxGRD4sIGY8RlM+IgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOworICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7CisgIHsKKyAgICBpZiAoKGZvcm1hdCAhPSBmbXRfc2luZ2xlKSAmJiAoZm9ybWF0ICE9IGZtdF9kb3VibGUpKQorICAgICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOworICAgIGVsc2UKKyAgICAgIFN0b3JlRlBSKGRlc3RyZWcsZm10X2xvbmcsQ29udmVydChGUF9STV9ORUFSRVNULFZhbHVlRlBSKGZzLGZvcm1hdCksZm9ybWF0LGZtdF9sb25nKSk7CisgIH0KK30KKworCiswMTAwMDEsMTAsMy5GTVQsMDAwMDAsNS5GUyw1LkZELDAwMTEwMDpDT1AxOjMyOjpST1VORC5XLmZtdAorInJvdW5kLncuJXM8Rk1UPiBmPEZEPiwgZjxGUz4iCisqbWlwc0lJOgorKm1pcHNJSUk6CisqbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisqcjM5MDA6Cit7CisgIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOworICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7CisgIHsKKyAgaWYgKChmb3JtYXQgIT0gZm10X3NpbmdsZSkgJiYgKGZvcm1hdCAhPSBmbXRfZG91YmxlKSkKKyAgIFNpZ25hbEV4Y2VwdGlvbihSZXNlcnZlZEluc3RydWN0aW9uLGluc3RydWN0aW9uKTsKKyAgZWxzZQorICAgU3RvcmVGUFIoZGVzdHJlZyxmbXRfd29yZCxDb252ZXJ0KEZQX1JNX05FQVJFU1QsVmFsdWVGUFIoZnMsZm9ybWF0KSxmb3JtYXQsZm10X3dvcmQpKTsKKyAgfQorfQorCisKKzAxMDAwMSwxMCwzLkZNVCwwMDAwMCw1LkZTLDUuRkQsMDEwMTEwOkNPUDE6MzI6OlJTUVJULmZtdAorKm1pcHNJVjoKKyJyc3FydC4lczxGTVQ+IGY8RkQ+LCBmPEZTPiIKKyp2cjUwMDA6Cit7CisgIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbl8wOworICBpbnQgZGVzdHJlZyA9ICgoaW5zdHJ1Y3Rpb24gPj4gNikgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKKyAgaW50IGZvcm1hdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAwNyk7CisgIHsKKyAgaWYgKChmb3JtYXQgIT0gZm10X3NpbmdsZSkgJiYgKGZvcm1hdCAhPSBmbXRfZG91YmxlKSkKKyAgIFNpZ25hbEV4Y2VwdGlvbihSZXNlcnZlZEluc3RydWN0aW9uLGluc3RydWN0aW9uKTsKKyAgZWxzZQorICAgU3RvcmVGUFIoZGVzdHJlZyxmb3JtYXQsUmVjaXAoU3F1YXJlUm9vdChWYWx1ZUZQUihmcyxmb3JtYXQpLGZvcm1hdCksZm9ybWF0KSk7CisgIH0KK30KKworCisxMTExMDEsNS5CQVNFLDUuRlQsMTYuT0ZGU0VUOkNPUDE6NjQ6OlNEQzEKKyJzZGMxIGY8RlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKKyptaXBzSUk6CisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgZG9fc3RvcmUgKFNEXywgQWNjZXNzTGVuZ3RoX0RPVUJMRVdPUkQsIEdQUltCQVNFXSwgRVhURU5EMTYgKE9GRlNFVCksIENPUF9TRCAoMSwgRlQpKTsKK30KKworCiswMTAwMTEsNS5CQVNFLDUuSU5ERVgsNS5GUywwMDAwMDAwMTAwMTpDT1AxWDo2NDo6U0RYQzEKKyJsZHhjMSBmPEZTPiwgcjxJTkRFWD4ocjxCQVNFPikiCisqbWlwc0lWOgorKnZyNTAwMDoKK3sKKyAgZG9fc3RvcmUgKFNEXywgQWNjZXNzTGVuZ3RoX0RPVUJMRVdPUkQsIEdQUltCQVNFXSwgR1BSW0lOREVYXSwgQ09QX1NEICgxLCBGUykpOworfQorCisKKzAxMDAwMSwxMCwzLkZNVCwwMDAwMCw1LkZTLDUuRkQsMDAwMTAwOkNPUDE6MzI6OlNRUlQuZm10Cisic3FydC4lczxGTVQ+IGY8RkQ+LCBmPEZTPiIKKyptaXBzSUk6CisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOworICBpbnQgZm9ybWF0ID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDA3KTsKKyAgeworICAgIGlmICgoZm9ybWF0ICE9IGZtdF9zaW5nbGUpICYmIChmb3JtYXQgIT0gZm10X2RvdWJsZSkpCisgICAgICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbixpbnN0cnVjdGlvbik7CisgICAgZWxzZQorICAgICAgU3RvcmVGUFIoZGVzdHJlZyxmb3JtYXQsKFNxdWFyZVJvb3QoVmFsdWVGUFIoZnMsZm9ybWF0KSxmb3JtYXQpKSk7CisgIH0KK30KKworCiswMTAwMDEsMTAsMy5GTVQsNS5GVCw1LkZTLDUuRkQsMDAwMDAxOkNPUDE6MzI6OlNVQi5mbXQKKyJzdWIuJXM8Rk1UPiBmPEZEPiwgZjxGUz4sIGY8RlQ+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorKnIzOTAwOgoreworICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKKyAgaW50IGRlc3RyZWcgPSAoKGluc3RydWN0aW9uID4+IDYpICYgMHgwMDAwMDAxRik7CisgIGludCBmcyA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTEpICYgMHgwMDAwMDAxRik7CisgIGludCBmdCA9ICgoaW5zdHJ1Y3Rpb24gPj4gMTYpICYgMHgwMDAwMDAxRik7CisgIGludCBmb3JtYXQgPSAoKGluc3RydWN0aW9uID4+IDIxKSAmIDB4MDAwMDAwMDcpOworICB7CisgICAgaWYgKChmb3JtYXQgIT0gZm10X3NpbmdsZSkgJiYgKGZvcm1hdCAhPSBmbXRfZG91YmxlKSkKKyAgICAgIFNpZ25hbEV4Y2VwdGlvbihSZXNlcnZlZEluc3RydWN0aW9uLGluc3RydWN0aW9uKTsKKyAgICBlbHNlCisgICAgICBTdG9yZUZQUihkZXN0cmVnLGZvcm1hdCxTdWIoVmFsdWVGUFIoZnMsZm9ybWF0KSxWYWx1ZUZQUihmdCxmb3JtYXQpLGZvcm1hdCkpOworICB9Cit9CisKKworCisxMTEwMDEsNS5CQVNFLDUuRlQsMTYuT0ZGU0VUOkNPUDE6MzI6OlNXQzEKKyJzd2MxIGY8RlQ+LCA8T0ZGU0VUPihyPEJBU0U+KSIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIHNpZ25lZF93b3JkIG9mZnNldCA9IEVYVEVORDE2IChPRkZTRVQpOworICBpbnQgZGVzdHJlZyBVTlVTRUQgPSAoKGluc3RydWN0aW9uID4+IDE2KSAmIDB4MDAwMDAwMUYpOworICBzaWduZWRfd29yZCBvcDEgVU5VU0VEID0gR1BSWygoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAxRildOworICB7CisgICAgYWRkcmVzc193b3JkIHZhZGRyID0gKCh1d29yZDY0KW9wMSArIG9mZnNldCk7CisgICAgYWRkcmVzc193b3JkIHBhZGRyOworICAgIGludCB1bmNhY2hlZDsKKyAgICBpZiAoKHZhZGRyICYgMykgIT0gMCkKKyAgICAgIHsKKwlTSU1fQ09SRV9TSUdOQUwgKFNELCBDUFUsIGNpYSwgcmVhZF9tYXAsIEFjY2Vzc0xlbmd0aF9XT1JEKzEsIHZhZGRyLCB3cml0ZV90cmFuc2Zlciwgc2ltX2NvcmVfdW5hbGlnbmVkX3NpZ25hbCk7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCWlmIChBZGRyZXNzVHJhbnNsYXRpb24odmFkZHIsaXNEQVRBLGlzU1RPUkUsJnBhZGRyLCZ1bmNhY2hlZCxpc1RBUkdFVCxpc1JFQUwpKQorCSAgeworCSAgICB1d29yZDY0IG1lbXZhbCA9IDA7CisJICAgIHV3b3JkNjQgbWVtdmFsMSA9IDA7CisJICAgIHV3b3JkNjQgbWFzayA9IChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQgPyAweDcgOiAweDMpOworCSAgICBhZGRyZXNzX3dvcmQgcmV2ZXJzZWVuZGlhbiA9IChSZXZlcnNlRW5kaWFuID8obWFzayBeIEFjY2Vzc0xlbmd0aF9XT1JEKTogMCk7CisJICAgIGFkZHJlc3Nfd29yZCBiaWdlbmRpYW5jcHUgPSAoQmlnRW5kaWFuQ1BVID8obWFzayBeIEFjY2Vzc0xlbmd0aF9XT1JEKTogMCk7CisJICAgIHVuc2lnbmVkIGludCBieXRlOworCSAgICBwYWRkciA9ICgocGFkZHIgJiB+bWFzaykgfCAoKHBhZGRyICYgbWFzaykgXiByZXZlcnNlZW5kaWFuKSk7CisJICAgIGJ5dGUgPSAoKHZhZGRyICYgbWFzaykgXiBiaWdlbmRpYW5jcHUpOworCSAgICBtZW12YWwgPSAoKCh1d29yZDY0KUNPUF9TVygoKGluc3RydWN0aW9uID4+IDI2KSAmIDB4MyksZGVzdHJlZykpIDw8ICg4ICogYnl0ZSkpOworCSAgICBTdG9yZU1lbW9yeSh1bmNhY2hlZCxBY2Nlc3NMZW5ndGhfV09SRCxtZW12YWwsbWVtdmFsMSxwYWRkcix2YWRkcixpc1JFQUwpOworCSAgfQorICAgICAgfQorICB9Cit9CisKKworMDEwMDExLDUuQkFTRSw1LklOREVYLDUuRlMsMDAwMDAsMDAxMDAwOkNPUDFYOjMyOjpTV1hDMQorInN3eGMxIGY8RlM+LCByPElOREVYPihyPEJBU0U+KSIKKyptaXBzSVY6CisqdnI1MDAwOgoreworICB1bnNpZ25lZDMyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25fMDsKKyAgaW50IGZzID0gKChpbnN0cnVjdGlvbiA+PiAxMSkgJiAweDAwMDAwMDFGKTsKKyAgc2lnbmVkX3dvcmQgb3AyID0gR1BSWygoaW5zdHJ1Y3Rpb24gPj4gMTYpICYgMHgwMDAwMDAxRildOworICBzaWduZWRfd29yZCBvcDEgPSBHUFJbKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDFGKV07CisgIHsKKyAgIGFkZHJlc3Nfd29yZCB2YWRkciA9ICgodW5zaWduZWQ2NClvcDEgKyBvcDIpOworICAgYWRkcmVzc193b3JkIHBhZGRyOworICAgaW50IHVuY2FjaGVkOworICAgaWYgKCh2YWRkciAmIDMpICE9IDApCisgICAgIHsKKyAgICAgICBTSU1fQ09SRV9TSUdOQUwgKFNELCBDUFUsIGNpYSwgcmVhZF9tYXAsIDQsIHZhZGRyLCB3cml0ZV90cmFuc2Zlciwgc2ltX2NvcmVfdW5hbGlnbmVkX3NpZ25hbCk7CisgICAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICBpZiAoQWRkcmVzc1RyYW5zbGF0aW9uKHZhZGRyLGlzREFUQSxpc1NUT1JFLCZwYWRkciwmdW5jYWNoZWQsaXNUQVJHRVQsaXNSRUFMKSkKKyAgICB7CisgICAgIHVuc2lnbmVkNjQgbWVtdmFsID0gMDsKKyAgICAgdW5zaWduZWQ2NCBtZW12YWwxID0gMDsKKyAgICAgdW5zaWduZWQ2NCBtYXNrID0gMHg3OworICAgICB1bnNpZ25lZCBpbnQgYnl0ZTsKKyAgICAgcGFkZHIgPSAoKHBhZGRyICYgfm1hc2spIHwgKChwYWRkciAmIG1hc2spIF4gKFJldmVyc2VFbmRpYW4gPDwgMikpKTsKKyAgICAgYnl0ZSA9ICgodmFkZHIgJiBtYXNrKSBeIChCaWdFbmRpYW5DUFUgPDwgMikpOworICAgICBtZW12YWwgPSAoKCh1bnNpZ25lZDY0KUNPUF9TVygxLGZzKSkgPDwgKDggKiBieXRlKSk7CisgICAgICB7CisgICAgICAgU3RvcmVNZW1vcnkodW5jYWNoZWQsQWNjZXNzTGVuZ3RoX1dPUkQsbWVtdmFsLG1lbXZhbDEscGFkZHIsdmFkZHIsaXNSRUFMKTsKKyAgICAgIH0KKyAgICB9CisgICB9CisgIH0KK30KKworCiswMTAwMDEsMTAsMy5GTVQsMDAwMDAsNS5GUyw1LkZELDAwMTAwMTpDT1AxOjY0OjpUUlVOQy5MLmZtdAorInRydW5jLmwuJXM8Rk1UPiBmPEZEPiwgZjxGUz4iCisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOworICBpbnQgZm9ybWF0ID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDA3KTsKKyAgeworICBpZiAoKGZvcm1hdCAhPSBmbXRfc2luZ2xlKSAmJiAoZm9ybWF0ICE9IGZtdF9kb3VibGUpKQorICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOworICBlbHNlCisgICBTdG9yZUZQUihkZXN0cmVnLGZtdF9sb25nLENvbnZlcnQoRlBfUk1fVE9aRVJPLFZhbHVlRlBSKGZzLGZvcm1hdCksZm9ybWF0LGZtdF9sb25nKSk7CisgIH0KK30KKworCiswMTAwMDEsMTAsMy5GTVQsMDAwMDAsNS5GUyw1LkZELDAwMTEwMTpDT1AxOjMyOjpUUlVOQy5XCisidHJ1bmMudy4lczxGTVQ+IGY8RkQ+LCBmPEZTPiIKKyptaXBzSUk6CisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIGludCBkZXN0cmVnID0gKChpbnN0cnVjdGlvbiA+PiA2KSAmIDB4MDAwMDAwMUYpOworICBpbnQgZnMgPSAoKGluc3RydWN0aW9uID4+IDExKSAmIDB4MDAwMDAwMUYpOworICBpbnQgZm9ybWF0ID0gKChpbnN0cnVjdGlvbiA+PiAyMSkgJiAweDAwMDAwMDA3KTsKKyAgeworICBpZiAoKGZvcm1hdCAhPSBmbXRfc2luZ2xlKSAmJiAoZm9ybWF0ICE9IGZtdF9kb3VibGUpKQorICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOworICBlbHNlCisgICBTdG9yZUZQUihkZXN0cmVnLGZtdF93b3JkLENvbnZlcnQoRlBfUk1fVE9aRVJPLFZhbHVlRlBSKGZzLGZvcm1hdCksZm9ybWF0LGZtdF93b3JkKSk7CisgIH0KK30KKworDAorLy8KKy8vIE1JUFMgQXJjaGl0ZWN0dXJlOgorLy8KKy8vICAgICAgICBTeXN0ZW0gQ29udHJvbCBJbnN0cnVjdGlvbiBTZXQgKENPUDApCisvLworCisKKzAxMDAwMCwwMTAwMCwwMDAwMCwxNi5PRkZTRVQ6Q09QMDozMjo6QkMwRgorImJjMGYgPE9GRlNFVD4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisKKworMDEwMDAwLDAxMDAwLDAwMDEwLDE2Lk9GRlNFVDpDT1AwOjMyOjpCQzBGTAorImJjMGZsIDxPRkZTRVQ+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorCisKKzAxMDAwMCwwMTAwMCwwMDAwMSwxNi5PRkZTRVQ6Q09QMDozMjo6QkMwVAorImJjMHQgPE9GRlNFVD4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKworCiswMTAwMDAsMDEwMDAsMDAwMTEsMTYuT0ZGU0VUOkNPUDA6MzI6OkJDMFRMCisiYmMwdGwgPE9GRlNFVD4iCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisKKworMTAxMTExLDUuQkFTRSw1Lk9QLDE2Lk9GRlNFVDpOT1JNQUw6MzI6OkNBQ0hFCisqbWlwc0lJSToKKyptaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKypyMzkwMDoKK3sKKyAgdW5zaWduZWQzMiBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uXzA7CisgIHNpZ25lZF93b3JkIG9mZnNldCA9IFNJR05FWFRFTkQoKHNpZ25lZF93b3JkKSgoaW5zdHJ1Y3Rpb24gPj4gMCkgJiAweDAwMDBGRkZGKSwxNik7CisgIGludCBoaW50ID0gKChpbnN0cnVjdGlvbiA+PiAxNikgJiAweDAwMDAwMDFGKTsKKyAgc2lnbmVkX3dvcmQgb3AxID0gR1BSWygoaW5zdHJ1Y3Rpb24gPj4gMjEpICYgMHgwMDAwMDAxRildOworICB7CisgICAgYWRkcmVzc193b3JkIHZhZGRyID0gKG9wMSArIG9mZnNldCk7CisgICAgYWRkcmVzc193b3JkIHBhZGRyOworICAgIGludCB1bmNhY2hlZDsKKyAgICBpZiAoQWRkcmVzc1RyYW5zbGF0aW9uKHZhZGRyLGlzREFUQSxpc0xPQUQsJnBhZGRyLCZ1bmNhY2hlZCxpc1RBUkdFVCxpc1JFQUwpKQorICAgICAgQ2FjaGVPcChoaW50LHZhZGRyLHBhZGRyLGluc3RydWN0aW9uKTsKKyAgfQorfQorCisKKzAxMDAwMCwxMDAwMCwwMDAwMDAwMDAwMDAwMDAsMTExMDAxOkNPUDA6MzI6OkRJCisiZGkiCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisKKworMDEwMDAwLDEwMDAwLDAwMDAwMDAwMDAwMDAwMCwxMTEwMDA6Q09QMDozMjo6RUkKKyJlaSIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKworCiswMTAwMDAsMTAwMDAsMDAwMDAwMDAwMDAwMDAwLDAxMTAwMDpDT1AwOjMyOjpFUkVUCisiZXJldCIKKyptaXBzSUlJOgorKm1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICBpZiAoU1IgJiBzdGF0dXNfRVJMKQorICAgIHsKKyAgICAgIC8qIE9vcHMsIG5vdCB5ZXQgYXZhaWxhYmxlICovCisgICAgICBzaW1faW9fcHJpbnRmIChTRCwgIldhcm5pbmc6IEVSRVQgd2hlbiBTUltFUkxdIHNldCBub3Qgc3VwcG9ydGVkIik7CisgICAgICBOSUEgPSBFUEM7CisgICAgICBTUiAmPSB+c3RhdHVzX0VSTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBOSUEgPSBFUEM7CisgICAgICBTUiAmPSB+c3RhdHVzX0VYTDsKKyAgICB9Cit9CisKKworMDEwMDAwLDAwMDAwLDUuUlQsNS5SRCwwMDAwMCw2LlJFR1g6Q09QMDozMjo6TUZDMAorIm1mYzAgcjxSVD4sIHI8UkQ+ICMgPFJFR1g+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKypyMzkwMDoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICBUUkFDRV9BTFVfSU5QVVQwICgpOworICBEZWNvZGVDb3Byb2MgKGluc3RydWN0aW9uXzApOworICBUUkFDRV9BTFVfUkVTVUxUIChHUFJbUlRdKTsKK30KKworMDEwMDAwLDAwMTAwLDUuUlQsNS5SRCwwMDAwMCw2LlJFR1g6Q09QMDozMjo6TVRDMAorIm10YzAgcjxSVD4sIHI8UkQ+ICMgPFJFR1g+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKypyMzkwMDoKKyp2cjQxMDA6CisqdnI1MDAwOgoreworICBEZWNvZGVDb3Byb2MgKGluc3RydWN0aW9uXzApOworfQorCisKKzAxMDAwMCwxMDAwMCwwMDAwMDAwMDAwMDAwMDAsMDEwMDAwOkNPUDA6MzI6OlJGRQorInJmZSIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqcjM5MDA6CisqdnI0MTAwOgorKnZyNTAwMDoKK3sKKyAgRGVjb2RlQ29wcm9jIChpbnN0cnVjdGlvbl8wKTsKK30KKworCiswMTAwLFpaITAhMSEzLDUuQ09QX0ZVTjAhOCw1LkNPUF9GVU4xLDE2LkNPUF9GVU4yOk5PUk1BTDozMjo6Q09QegorImNvcDxaWj4gPENPUF9GVU4wPjxDT1BfRlVOMT48Q09QX0ZVTjI+IgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqcjM5MDA6Cit7CisgIERlY29kZUNvcHJvYyAoaW5zdHJ1Y3Rpb25fMCk7Cit9CisKKworCiswMTAwMDAsMTAwMDAsMDAwMDAwMDAwMDAwMDAwLDAwMTAwMDpDT1AwOjMyOjpUTEJQCisidGxicCIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKworCiswMTAwMDAsMTAwMDAsMDAwMDAwMDAwMDAwMDAwLDAwMDAwMTpDT1AwOjMyOjpUTEJSCisidGxiciIKKyptaXBzSSxtaXBzSUksbWlwc0lJSSxtaXBzSVY6CisqdnI0MTAwOgorKnZyNTAwMDoKKworCiswMTAwMDAsMTAwMDAsMDAwMDAwMDAwMDAwMDAwLDAwMDAxMDpDT1AwOjMyOjpUTEJXSQorInRsYndpIgorKm1pcHNJLG1pcHNJSSxtaXBzSUlJLG1pcHNJVjoKKyp2cjQxMDA6CisqdnI1MDAwOgorCisKKzAxMDAwMCwxMDAwMCwwMDAwMDAwMDAwMDAwMDAsMDAwMTEwOkNPUDA6MzI6OlRMQldSCisidGxid3IiCisqbWlwc0ksbWlwc0lJLG1pcHNJSUksbWlwc0lWOgorKnZyNDEwMDoKKyp2cjUwMDA6CisKKwwKKzppbmNsdWRlOjo6bTE2LmlnZW4KKzppbmNsdWRlOjo6dHguaWdlbgorOmluY2x1ZGU6Ojp2ci5pZ2VuCisMCmRpZmYgLS1naXQgYS9zaW0vbWlwcy9zaW0tbWFpbi5jIGIvc2ltL21pcHMvc2ltLW1haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGU2M2RjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL21pcHMvc2ltLW1haW4uYwpAQCAtMCwwICsxLDU3OSBAQAorLyogIENvcHlyaWdodCAoQykgMTk5OCwgQ3lnbnVzIFNvbHV0aW9ucworCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworICAgICovCisKKworI2lmbmRlZiBTSU1fTUFJTl9DCisjZGVmaW5lIFNJTV9NQUlOX0MKKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAic2ltLWFzc2VydC5oIgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0gc2ltdWxhdG9yIGVuZ2luZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKiBEZXNjcmlwdGlvbiBmcm9tIHBhZ2UgQS0yMiBvZiB0aGUgIk1JUFMgSVYgSW5zdHJ1Y3Rpb24gU2V0IiBtYW51YWwKKyAgIChyZXZpc2lvbiAzLjEpICovCisvKiBUcmFuc2xhdGUgYSB2aXJ0dWFsIGFkZHJlc3MgdG8gYSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBjYWNoZQorICAgY29oZXJlbmNlIGFsZ29yaXRobSBkZXNjcmliaW5nIHRoZSBtZWNoYW5pc20gdXNlZCB0byByZXNvbHZlIHRoZQorICAgbWVtb3J5IHJlZmVyZW5jZS4gR2l2ZW4gdGhlIHZpcnR1YWwgYWRkcmVzcyB2QWRkciwgYW5kIHdoZXRoZXIgdGhlCisgICByZWZlcmVuY2UgaXMgdG8gSW5zdHJ1Y3Rpb25zIG90IERhdGEgKElvckQpLCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nCisgICBwaHlzaWNhbCBhZGRyZXNzIChwQWRkcikgYW5kIHRoZSBjYWNoZSBjb2hlcmVuY2UgYWxnb3JpdGhtIChDQ0EpCisgICB1c2VkIHRvIHJlc29sdmUgdGhlIHJlZmVyZW5jZS4gSWYgdGhlIHZpcnR1YWwgYWRkcmVzcyBpcyBpbiBvbmUgb2YKKyAgIHRoZSB1bm1hcHBlZCBhZGRyZXNzIHNwYWNlcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBhbmQgdGhlIENDQSBhcmUKKyAgIGRldGVybWluZWQgZGlyZWN0bHkgYnkgdGhlIHZpcnR1YWwgYWRkcmVzcy4gSWYgdGhlIHZpcnR1YWwgYWRkcmVzcworICAgaXMgaW4gb25lIG9mIHRoZSBtYXBwZWQgYWRkcmVzcyBzcGFjZXMgdGhlbiB0aGUgVExCIGlzIHVzZWQgdG8KKyAgIGRldGVybWluZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBhbmQgYWNjZXNzIHR5cGU7IGlmIHRoZSByZXF1aXJlZAorICAgdHJhbnNsYXRpb24gaXMgbm90IHByZXNlbnQgaW4gdGhlIFRMQiBvciB0aGUgZGVzaXJlZCBhY2Nlc3MgaXMgbm90CisgICBwZXJtaXR0ZWQgdGhlIGZ1bmN0aW9uIGZhaWxzIGFuZCBhbiBleGNlcHRpb24gaXMgdGFrZW4uCisKKyAgIE5PVEU6IE5vcm1hbGx5IChSQVcgPT0gMCksIHdoZW4gYWRkcmVzcyB0cmFuc2xhdGlvbiBmYWlscywgdGhpcworICAgZnVuY3Rpb24gcmFpc2VzIGFuIGV4Y2VwdGlvbiBhbmQgZG9lcyBub3QgcmV0dXJuLiAqLworCitJTkxJTkVfU0lNX01BSU4KKyhpbnQpCithZGRyZXNzX3RyYW5zbGF0aW9uIChTSU1fREVTQyBzZCwKKwkJICAgICBzaW1fY3B1ICogY3B1LAorCQkgICAgIGFkZHJlc3Nfd29yZCBjaWEsCisJCSAgICAgYWRkcmVzc193b3JkIHZBZGRyLAorCQkgICAgIGludCBJb3JELAorCQkgICAgIGludCBMb3JTLAorCQkgICAgIGFkZHJlc3Nfd29yZCAqIHBBZGRyLAorCQkgICAgIGludCAqQ0NBLAorCQkgICAgIGludCByYXcpCit7CisgIGludCByZXMgPSAtMTsJCQkvKiBUUlVFIDogQXNzdW1lIGdvb2QgcmV0dXJuICovCisKKyNpZmRlZiBERUJVRworICBzaW1faW9fcHJpbnRmIChzZCwgIkFkZHJlc3NUcmFuc2xhdGlvbigweCVzLCVzLCVzLC4uLik7XG4iLCBwcl9hZGRyICh2QWRkciksIChJb3JEID8gImlzREFUQSIgOiAiaXNJTlNUUlVDVElPTiIpLCAoTG9yUyA/ICJpU1RPUkUiIDogImlzTE9BRCIpKTsKKyNlbmRpZgorCisgIC8qIENoZWNrIHRoYXQgdGhlIGFkZHJlc3MgaXMgdmFsaWQgZm9yIHRoaXMgbWVtb3J5IG1vZGVsICovCisKKyAgLyogRm9yIGEgc2ltcGxlIChmbGF0KSBtZW1vcnkgbW9kZWwsIHdlIHNpbXBseSBwYXNzIHZpcnR1YWwKKyAgICAgYWRkcmVzc2VzcyB0aHJvdWdoIChtb3N0bHkpIHVuY2hhbmdlZC4gKi8KKyAgdkFkZHIgJj0gMHhGRkZGRkZGRjsKKworICAqcEFkZHIgPSB2QWRkcjsJCS8qIGRlZmF1bHQgZm9yIGlzVEFSR0VUICovCisgICpDQ0EgPSBVbmNhY2hlZDsJCS8qIG5vdCB1c2VkIGZvciBpc0hPU1QgKi8KKworICByZXR1cm4gKHJlcyk7Cit9CisKKworCisvKiBEZXNjcmlwdGlvbiBmcm9tIHBhZ2UgQS0yMyBvZiB0aGUgIk1JUFMgSVYgSW5zdHJ1Y3Rpb24gU2V0IiBtYW51YWwKKyAgIChyZXZpc2lvbiAzLjEpICovCisvKiBQcmVmZXRjaCBkYXRhIGZyb20gbWVtb3J5LiBQcmVmZXRjaCBpcyBhbiBhZHZpc29yeSBpbnN0cnVjdGlvbiBmb3IKKyAgIHdoaWNoIGFuIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGFjdGlvbiBpcyB0YWtlbi4gVGhlIGFjdGlvbiB0YWtlbgorICAgbWF5IGluY3JlYXNlIHBlcmZvcm1hbmNlLCBidXQgbXVzdCBub3QgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZQorICAgcHJvZ3JhbSwgb3IgYWx0ZXIgYXJjaGl0ZWN0dXJhbGx5LXZpc2libGUgc3RhdGUuICovCisKK0lOTElORV9TSU1fTUFJTiAodm9pZCkKK3ByZWZldGNoIChTSU1fREVTQyBzZCwKKwkgIHNpbV9jcHUgKmNwdSwKKwkgIGFkZHJlc3Nfd29yZCBjaWEsCisJICBpbnQgQ0NBLAorCSAgYWRkcmVzc193b3JkIHBBZGRyLAorCSAgYWRkcmVzc193b3JkIHZBZGRyLAorCSAgaW50IERBVEEsCisJICBpbnQgaGludCkKK3sKKyNpZmRlZiBERUJVRworICBzaW1faW9fcHJpbnRmKHNkLCJQcmVmZXRjaCglZCwweCVzLDB4JXMsJWQsJWQpO1xuIixDQ0EscHJfYWRkcihwQWRkcikscHJfYWRkcih2QWRkciksREFUQSxoaW50KTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgIC8qIEZvciBvdXIgc2ltcGxlIG1lbW9yeSBtb2RlbCB3ZSBkbyBub3RoaW5nICovCisgIHJldHVybjsKK30KKworLyogRGVzY3JpcHRpb24gZnJvbSBwYWdlIEEtMjIgb2YgdGhlICJNSVBTIElWIEluc3RydWN0aW9uIFNldCIgbWFudWFsCisgICAocmV2aXNpb24gMy4xKSAqLworLyogTG9hZCBhIHZhbHVlIGZyb20gbWVtb3J5LiBVc2UgdGhlIGNhY2hlIGFuZCBtYWluIG1lbW9yeSBhcworICAgc3BlY2lmaWVkIGluIHRoZSBDYWNoZSBDb2hlcmVuY2UgQWxnb3JpdGhtIChDQ0EpIGFuZCB0aGUgc29ydCBvZgorICAgYWNjZXNzIChJb3JEKSB0byBmaW5kIHRoZSBjb250ZW50cyBvZiBBY2Nlc3NMZW5ndGggbWVtb3J5IGJ5dGVzCisgICBzdGFydGluZyBhdCBwaHlzaWNhbCBsb2NhdGlvbiBwQWRkci4gVGhlIGRhdGEgaXMgcmV0dXJuZWQgaW4gdGhlCisgICBmaXhlZCB3aWR0aCBuYXR1cmFsbHktYWxpZ25lZCBtZW1vcnkgZWxlbWVudCAoTWVtRWxlbSkuIFRoZQorICAgbG93LW9yZGVyIHR3byAob3IgdGhyZWUpIGJpdHMgb2YgdGhlIGFkZHJlc3MgYW5kIHRoZSBBY2Nlc3NMZW5ndGgKKyAgIGluZGljYXRlIHdoaWNoIG9mIHRoZSBieXRlcyB3aXRoaW4gTWVtRWxlbSBuZWVkcyB0byBiZSBnaXZlbiB0byB0aGUKKyAgIHByb2Nlc3Nvci4gSWYgdGhlIG1lbW9yeSBhY2Nlc3MgdHlwZSBvZiB0aGUgcmVmZXJlbmNlIGlzIHVuY2FjaGVkCisgICB0aGVuIG9ubHkgdGhlIHJlZmVyZW5jZWQgYnl0ZXMgYXJlIHJlYWQgZnJvbSBtZW1vcnkgYW5kIHZhbGlkCisgICB3aXRoaW4gdGhlIG1lbW9yeSBlbGVtZW50LiBJZiB0aGUgYWNjZXNzIHR5cGUgaXMgY2FjaGVkLCBhbmQgdGhlCisgICBkYXRhIGlzIG5vdCBwcmVzZW50IGluIGNhY2hlLCBhbiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBzaXplIGFuZAorICAgYWxpZ25tZW50IGJsb2NrIG9mIG1lbW9yeSBpcyByZWFkIGFuZCBsb2FkZWQgaW50byB0aGUgY2FjaGUgdG8KKyAgIHNhdGlzZnkgYSBsb2FkIHJlZmVyZW5jZS4gQXQgYSBtaW5pbXVtLCB0aGUgYmxvY2sgaXMgdGhlIGVudGlyZQorICAgbWVtb3J5IGVsZW1lbnQuICovCitJTkxJTkVfU0lNX01BSU4gKHZvaWQpCitsb2FkX21lbW9yeSAoU0lNX0RFU0MgU0QsCisJICAgICBzaW1fY3B1ICpDUFUsCisJICAgICBhZGRyZXNzX3dvcmQgY2lhLAorCSAgICAgdXdvcmQ2NCogbWVtdmFscCwKKwkgICAgIHV3b3JkNjQqIG1lbXZhbDFwLAorCSAgICAgaW50IENDQSwKKwkgICAgIHVuc2lnbmVkIGludCBBY2Nlc3NMZW5ndGgsCisJICAgICBhZGRyZXNzX3dvcmQgcEFkZHIsCisJICAgICBhZGRyZXNzX3dvcmQgdkFkZHIsCisJICAgICBpbnQgSW9yRCkKK3sKKyAgdXdvcmQ2NCB2YWx1ZSA9IDA7CisgIHV3b3JkNjQgdmFsdWUxID0gMDsKKworI2lmZGVmIERFQlVHCisgIHNpbV9pb19wcmludGYoc2QsIkRCRzogTG9hZE1lbW9yeSglcCwlcCwlZCwlZCwweCVzLDB4JXMsJXMpXG4iLG1lbXZhbHAsbWVtdmFsMXAsQ0NBLEFjY2Vzc0xlbmd0aCxwcl9hZGRyKHBBZGRyKSxwcl9hZGRyKHZBZGRyKSwoSW9yRCA/ICJpc0RBVEEiIDogImlzSU5TVFJVQ1RJT04iKSk7CisjZW5kaWYgLyogREVCVUcgKi8KKworI2lmIGRlZmluZWQoV0FSTl9NRU0pCisgIGlmIChDQ0EgIT0gdW5jYWNoZWQpCisgICAgc2ltX2lvX2VwcmludGYoc2QsIkxvYWRNZW1vcnkgQ0NBICglZCkgaXMgbm90IHVuY2FjaGVkIChjdXJyZW50bHkgYWxsIGFjY2Vzc2VzIHRyZWF0ZWQgYXMgY2FjaGVkKVxuIixDQ0EpOworI2VuZGlmIC8qIFdBUk5fTUVNICovCisKKyAgaWYgKCgocEFkZHIgJiBMT0FERFJNQVNLKSArIEFjY2Vzc0xlbmd0aCkgPiBMT0FERFJNQVNLKQorICAgIHsKKyAgICAgIC8qIEluIHJlYWxpdHkgdGhpcyBzaG91bGQgYmUgYSBCdXMgRXJyb3IgKi8KKyAgICAgIHNpbV9pb19lcnJvciAoU0QsICJMT0FEIEFjY2Vzc0xlbmd0aCBvZiAlZCB3b3VsZCBleHRlbmQgb3ZlciAlZCBiaXQgYWxpZ25lZCBib3VuZGFyeSBmb3IgcGh5c2ljYWwgYWRkcmVzcyAweCVzXG4iLAorCQkgICAgQWNjZXNzTGVuZ3RoLAorCQkgICAgKExPQUREUk1BU0sgKyAxKSA8PCAzLAorCQkgICAgcHJfYWRkciAocEFkZHIpKTsKKyAgICB9CisKKyNpZiBkZWZpbmVkKFRSQUNFKQorICBkb3RyYWNlIChTRCwgQ1BVLCB0cmFjZWZoLCgoSW9yRCA9PSBpc0RBVEEpID8gMCA6IDIpLCh1bnNpZ25lZCBpbnQpKHBBZGRyJjB4RkZGRkZGRkYpLChBY2Nlc3NMZW5ndGggKyAxKSwibG9hZCVzIiwoKElvckQgPT0gaXNEQVRBKSA/ICIiIDogIiBpbnN0cnVjdGlvbiIpKTsKKyNlbmRpZiAvKiBUUkFDRSAqLworICAKKyAgLyogUmVhZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIG1lbW9yeS4gIEFkanVzdCBmb3IKKyAgICAgaG9zdC90YXJnZXQgYnl0ZSBvcmRlcmluZy8gQWxpZ24gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUKKyAgICAgcmVhZC4gKi8KKworICBzd2l0Y2ggKEFjY2Vzc0xlbmd0aCkKKyAgICB7CisgICAgY2FzZSBBY2Nlc3NMZW5ndGhfUVVBRFdPUkQgOgorICAgICAgeworCXVuc2lnbmVkXzE2IHZhbCA9IHNpbV9jb3JlX3JlYWRfYWxpZ25lZF8xNiAoQ1BVLCBOVUxMX0NJQSwgcmVhZF9tYXAsIHBBZGRyKTsKKwl2YWx1ZTEgPSBWSDhfMTYgKHZhbCk7CisJdmFsdWUgPSBWTDhfMTYgKHZhbCk7CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBBY2Nlc3NMZW5ndGhfRE9VQkxFV09SRCA6CisgICAgICB2YWx1ZSA9IHNpbV9jb3JlX3JlYWRfYWxpZ25lZF84IChDUFUsIE5VTExfQ0lBLAorCQkJCSAgICAgICByZWFkX21hcCwgcEFkZHIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBY2Nlc3NMZW5ndGhfU0VQVElCWVRFIDoKKyAgICAgIHZhbHVlID0gc2ltX2NvcmVfcmVhZF9taXNhbGlnbmVkXzcgKENQVSwgTlVMTF9DSUEsCisJCQkJCSAgcmVhZF9tYXAsIHBBZGRyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQWNjZXNzTGVuZ3RoX1NFWFRJQllURSA6CisgICAgICB2YWx1ZSA9IHNpbV9jb3JlX3JlYWRfbWlzYWxpZ25lZF82IChDUFUsIE5VTExfQ0lBLAorCQkJCQkgIHJlYWRfbWFwLCBwQWRkcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFjY2Vzc0xlbmd0aF9RVUlOVElCWVRFIDoKKyAgICAgIHZhbHVlID0gc2ltX2NvcmVfcmVhZF9taXNhbGlnbmVkXzUgKENQVSwgTlVMTF9DSUEsCisJCQkJCSAgcmVhZF9tYXAsIHBBZGRyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQWNjZXNzTGVuZ3RoX1dPUkQgOgorICAgICAgdmFsdWUgPSBzaW1fY29yZV9yZWFkX2FsaWduZWRfNCAoQ1BVLCBOVUxMX0NJQSwKKwkJCQkgICAgICAgcmVhZF9tYXAsIHBBZGRyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQWNjZXNzTGVuZ3RoX1RSSVBMRUJZVEUgOgorICAgICAgdmFsdWUgPSBzaW1fY29yZV9yZWFkX21pc2FsaWduZWRfMyAoQ1BVLCBOVUxMX0NJQSwKKwkJCQkJICByZWFkX21hcCwgcEFkZHIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBY2Nlc3NMZW5ndGhfSEFMRldPUkQgOgorICAgICAgdmFsdWUgPSBzaW1fY29yZV9yZWFkX2FsaWduZWRfMiAoQ1BVLCBOVUxMX0NJQSwKKwkJCQkgICAgICAgcmVhZF9tYXAsIHBBZGRyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQWNjZXNzTGVuZ3RoX0JZVEUgOgorICAgICAgdmFsdWUgPSBzaW1fY29yZV9yZWFkX2FsaWduZWRfMSAoQ1BVLCBOVUxMX0NJQSwKKwkJCQkgICAgICAgcmVhZF9tYXAsIHBBZGRyKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisgIAorI2lmZGVmIERFQlVHCisgIHByaW50ZigiREJHOiBMb2FkTWVtb3J5KCkgOiAob2Zmc2V0ICVkKSA6IHZhbHVlID0gMHglcyVzXG4iLAorCSAoaW50KShwQWRkciAmIExPQUREUk1BU0spLHByX3V3b3JkNjQodmFsdWUxKSxwcl91d29yZDY0KHZhbHVlKSk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgCisgIC8qIFNlZSBhbHNvIHN0b3JlX21lbW9yeS4gUG9zaXRpb24gZGF0YSBpbiBjb3JyZWN0IGJ5dGUgbGFuZXMuICovCisgIGlmIChBY2Nlc3NMZW5ndGggPD0gTE9BRERSTUFTSykKKyAgICB7CisgICAgICBpZiAoQmlnRW5kaWFuTWVtKQorCS8qIGZvciBiaWcgZW5kaWFuIHRhcmdldCwgYnl0ZSAocEFkZHImTE9BRERSTUFTSyA9PSAwKSBpcworCSAgIHNoaWZ0ZWQgdG8gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBwb3NpdGlvbi4gICovCisJdmFsdWUgPDw9ICgoKExPQUREUk1BU0sgLSAocEFkZHIgJiBMT0FERFJNQVNLKSkgLSBBY2Nlc3NMZW5ndGgpICogOCk7CisgICAgICBlbHNlCisJLyogRm9yIGxpdHRsZSBlbmRpYW4gdGFyZ2V0LCBieXRlIChwQWRkciZMT0FERFJNQVNLID09IDApCisJICAgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBwb3N0aXRpb24uICovCisJdmFsdWUgPDw9ICgocEFkZHIgJiBMT0FERFJNQVNLKSAqIDgpOworICAgIH0KKyAgCisjaWZkZWYgREVCVUcKKyAgcHJpbnRmKCJEQkc6IExvYWRNZW1vcnkoKSA6IHNoaWZ0ZWQgdmFsdWUgPSAweCVzJXNcbiIsCisJIHByX3V3b3JkNjQodmFsdWUxKSxwcl91d29yZDY0KHZhbHVlKSk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgCisgICptZW12YWxwID0gdmFsdWU7CisgIGlmIChtZW12YWwxcCkgKm1lbXZhbDFwID0gdmFsdWUxOworfQorCisKKy8qIERlc2NyaXB0aW9uIGZyb20gcGFnZSBBLTIzIG9mIHRoZSAiTUlQUyBJViBJbnN0cnVjdGlvbiBTZXQiIG1hbnVhbAorICAgKHJldmlzaW9uIDMuMSkgKi8KKy8qIFN0b3JlIGEgdmFsdWUgdG8gbWVtb3J5LiBUaGUgc3BlY2lmaWVkIGRhdGEgaXMgc3RvcmVkIGludG8gdGhlCisgICBwaHlzaWNhbCBsb2NhdGlvbiBwQWRkciB1c2luZyB0aGUgbWVtb3J5IGhpZXJhcmNoeSAoZGF0YSBjYWNoZXMgYW5kCisgICBtYWluIG1lbW9yeSkgYXMgc3BlY2lmaWVkIGJ5IHRoZSBDYWNoZSBDb2hlcmVuY2UgQWxnb3JpdGhtCisgICAoQ0NBKS4gVGhlIE1lbUVsZW0gY29udGFpbnMgdGhlIGRhdGEgZm9yIGFuIGFsaWduZWQsIGZpeGVkLXdpZHRoCisgICBtZW1vcnkgZWxlbWVudCAod29yZCBmb3IgMzItYml0IHByb2Nlc3NvcnMsIGRvdWJsZXdvcmQgZm9yIDY0LWJpdAorICAgcHJvY2Vzc29ycyksIHRob3VnaCBvbmx5IHRoZSBieXRlcyB0aGF0IHdpbGwgYWN0dWFsbHkgYmUgc3RvcmVkIHRvCisgICBtZW1vcnkgbmVlZCB0byBiZSB2YWxpZC4gVGhlIGxvdy1vcmRlciB0d28gKG9yIHRocmVlKSBiaXRzIG9mIHBBZGRyCisgICBhbmQgdGhlIEFjY2Vzc0xlbmd0aCBmaWVsZCBpbmRpY2F0ZXMgd2hpY2ggb2YgdGhlIGJ5dGVzIHdpdGhpbiB0aGUKKyAgIE1lbUVsZW0gZGF0YSBzaG91bGQgYWN0dWFsbHkgYmUgc3RvcmVkOyBvbmx5IHRoZXNlIGJ5dGVzIGluIG1lbW9yeQorICAgd2lsbCBiZSBjaGFuZ2VkLiAqLworCitJTkxJTkVfU0lNX01BSU4gKHZvaWQpCitzdG9yZV9tZW1vcnkgKFNJTV9ERVNDIFNELAorCSAgICAgIHNpbV9jcHUgKkNQVSwKKwkgICAgICBhZGRyZXNzX3dvcmQgY2lhLAorCSAgICAgIGludCBDQ0EsCisJICAgICAgdW5zaWduZWQgaW50IEFjY2Vzc0xlbmd0aCwKKwkgICAgICB1d29yZDY0IE1lbUVsZW0sCisJICAgICAgdXdvcmQ2NCBNZW1FbGVtMSwgICAvKiBIaWdoIG9yZGVyIDY0IGJpdHMgKi8KKwkgICAgICBhZGRyZXNzX3dvcmQgcEFkZHIsCisJICAgICAgYWRkcmVzc193b3JkIHZBZGRyKQoreworI2lmZGVmIERFQlVHCisgIHNpbV9pb19wcmludGYoc2QsIkRCRzogU3RvcmVNZW1vcnkoJWQsJWQsMHglcywweCVzLDB4JXMsMHglcylcbiIsQ0NBLEFjY2Vzc0xlbmd0aCxwcl91d29yZDY0KE1lbUVsZW0pLHByX3V3b3JkNjQoTWVtRWxlbTEpLHByX2FkZHIocEFkZHIpLHByX2FkZHIodkFkZHIpKTsKKyNlbmRpZiAvKiBERUJVRyAqLworICAKKyNpZiBkZWZpbmVkKFdBUk5fTUVNKQorICBpZiAoQ0NBICE9IHVuY2FjaGVkKQorICAgIHNpbV9pb19lcHJpbnRmKHNkLCJTdG9yZU1lbW9yeSBDQ0EgKCVkKSBpcyBub3QgdW5jYWNoZWQgKGN1cnJlbnRseSBhbGwgYWNjZXNzZXMgdHJlYXRlZCBhcyBjYWNoZWQpXG4iLENDQSk7CisjZW5kaWYgLyogV0FSTl9NRU0gKi8KKyAgCisgIGlmICgoKHBBZGRyICYgTE9BRERSTUFTSykgKyBBY2Nlc3NMZW5ndGgpID4gTE9BRERSTUFTSykKKyAgICBzaW1faW9fZXJyb3IgKFNELCAiU1RPUkUgQWNjZXNzTGVuZ3RoIG9mICVkIHdvdWxkIGV4dGVuZCBvdmVyICVkIGJpdCBhbGlnbmVkIGJvdW5kYXJ5IGZvciBwaHlzaWNhbCBhZGRyZXNzIDB4JXNcbiIsCisJCSAgQWNjZXNzTGVuZ3RoLAorCQkgIChMT0FERFJNQVNLICsgMSkgPDwgMywKKwkJICBwcl9hZGRyKHBBZGRyKSk7CisgIAorI2lmIGRlZmluZWQoVFJBQ0UpCisgIGRvdHJhY2UgKFNELCBDUFUsIHRyYWNlZmgsMSwodW5zaWduZWQgaW50KShwQWRkciYweEZGRkZGRkZGKSwoQWNjZXNzTGVuZ3RoICsgMSksInN0b3JlIik7CisjZW5kaWYgLyogVFJBQ0UgKi8KKyAgCisjaWZkZWYgREVCVUcKKyAgcHJpbnRmKCJEQkc6IFN0b3JlTWVtb3J5OiBvZmZzZXQgPSAlZCBNZW1FbGVtID0gMHglcyVzXG4iLCh1bnNpZ25lZCBpbnQpKHBBZGRyICYgTE9BRERSTUFTSykscHJfdXdvcmQ2NChNZW1FbGVtMSkscHJfdXdvcmQ2NChNZW1FbGVtKSk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgCisgIC8qIFNlZSBhbHNvIGxvYWRfbWVtb3J5LiBQb3NpdGlvbiBkYXRhIGluIGNvcnJlY3QgYnl0ZSBsYW5lcy4gKi8KKyAgaWYgKEFjY2Vzc0xlbmd0aCA8PSBMT0FERFJNQVNLKQorICAgIHsKKyAgICAgIGlmIChCaWdFbmRpYW5NZW0pCisJLyogZm9yIGJpZyBlbmRpYW4gdGFyZ2V0LCBieXRlIChwQWRkciZMT0FERFJNQVNLID09IDApIGlzCisJICAgc2hpZnRlZCB0byB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIHBvc2l0aW9uLiAgKi8KKwlNZW1FbGVtID4+PSAoKChMT0FERFJNQVNLIC0gKHBBZGRyICYgTE9BRERSTUFTSykpIC0gQWNjZXNzTGVuZ3RoKSAqIDgpOworICAgICAgZWxzZQorCS8qIEZvciBsaXR0bGUgZW5kaWFuIHRhcmdldCwgYnl0ZSAocEFkZHImTE9BRERSTUFTSyA9PSAwKQorCSAgIGlzIGFscmVhZHkgaW4gdGhlIGNvcnJlY3QgcG9zdGl0aW9uLiAqLworCU1lbUVsZW0gPj49ICgocEFkZHIgJiBMT0FERFJNQVNLKSAqIDgpOworICAgIH0KKyAgCisjaWZkZWYgREVCVUcKKyAgcHJpbnRmKCJEQkc6IFN0b3JlTWVtb3J5OiBzaGlmdCA9ICVkIE1lbUVsZW0gPSAweCVzJXNcbiIsc2hpZnQscHJfdXdvcmQ2NChNZW1FbGVtMSkscHJfdXdvcmQ2NChNZW1FbGVtKSk7CisjZW5kaWYgLyogREVCVUcgKi8KKyAgCisgIHN3aXRjaCAoQWNjZXNzTGVuZ3RoKQorICAgIHsKKyAgICBjYXNlIEFjY2Vzc0xlbmd0aF9RVUFEV09SRCA6CisgICAgICB7CisJdW5zaWduZWRfMTYgdmFsID0gVTE2XzggKE1lbUVsZW0xLCBNZW1FbGVtKTsKKwlzaW1fY29yZV93cml0ZV9hbGlnbmVkXzE2IChDUFUsIE5VTExfQ0lBLCB3cml0ZV9tYXAsIHBBZGRyLCB2YWwpOworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgQWNjZXNzTGVuZ3RoX0RPVUJMRVdPUkQgOgorICAgICAgc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF84IChDUFUsIE5VTExfQ0lBLAorCQkJCXdyaXRlX21hcCwgcEFkZHIsIE1lbUVsZW0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBY2Nlc3NMZW5ndGhfU0VQVElCWVRFIDoKKyAgICAgIHNpbV9jb3JlX3dyaXRlX21pc2FsaWduZWRfNyAoQ1BVLCBOVUxMX0NJQSwKKwkJCQkgICB3cml0ZV9tYXAsIHBBZGRyLCBNZW1FbGVtKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQWNjZXNzTGVuZ3RoX1NFWFRJQllURSA6CisgICAgICBzaW1fY29yZV93cml0ZV9taXNhbGlnbmVkXzYgKENQVSwgTlVMTF9DSUEsCisJCQkJICAgd3JpdGVfbWFwLCBwQWRkciwgTWVtRWxlbSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFjY2Vzc0xlbmd0aF9RVUlOVElCWVRFIDoKKyAgICAgIHNpbV9jb3JlX3dyaXRlX21pc2FsaWduZWRfNSAoQ1BVLCBOVUxMX0NJQSwKKwkJCQkgICB3cml0ZV9tYXAsIHBBZGRyLCBNZW1FbGVtKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQWNjZXNzTGVuZ3RoX1dPUkQgOgorICAgICAgc2ltX2NvcmVfd3JpdGVfYWxpZ25lZF80IChDUFUsIE5VTExfQ0lBLAorCQkJCXdyaXRlX21hcCwgcEFkZHIsIE1lbUVsZW0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBY2Nlc3NMZW5ndGhfVFJJUExFQllURSA6CisgICAgICBzaW1fY29yZV93cml0ZV9taXNhbGlnbmVkXzMgKENQVSwgTlVMTF9DSUEsCisJCQkJICAgd3JpdGVfbWFwLCBwQWRkciwgTWVtRWxlbSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFjY2Vzc0xlbmd0aF9IQUxGV09SRCA6CisgICAgICBzaW1fY29yZV93cml0ZV9hbGlnbmVkXzIgKENQVSwgTlVMTF9DSUEsCisJCQkJd3JpdGVfbWFwLCBwQWRkciwgTWVtRWxlbSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFjY2Vzc0xlbmd0aF9CWVRFIDoKKyAgICAgIHNpbV9jb3JlX3dyaXRlX2FsaWduZWRfMSAoQ1BVLCBOVUxMX0NJQSwKKwkJCQl3cml0ZV9tYXAsIHBBZGRyLCBNZW1FbGVtKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CQorICAKKyAgcmV0dXJuOworfQorCisKK0lOTElORV9TSU1fTUFJTiAodW5zaWduZWQzMikKK2lmZXRjaDMyIChTSU1fREVTQyBTRCwKKwkgIHNpbV9jcHUgKkNQVSwKKwkgIGFkZHJlc3Nfd29yZCBjaWEsCisJICBhZGRyZXNzX3dvcmQgdmFkZHIpCit7CisgIC8qIENvcHkgdGhlIGFjdGlvbiBvZiB0aGUgTFcgaW5zdHJ1Y3Rpb24gKi8KKyAgYWRkcmVzc193b3JkIG1hc2sgPSBMT0FERFJNQVNLOworICBhZGRyZXNzX3dvcmQgYWNjZXNzID0gQWNjZXNzTGVuZ3RoX1dPUkQ7CisgIGFkZHJlc3Nfd29yZCByZXZlcnNlZW5kaWFuID0gKFJldmVyc2VFbmRpYW4gPyAobWFzayBeIGFjY2VzcykgOiAwKTsKKyAgYWRkcmVzc193b3JkIGJpZ2VuZGlhbmNwdSA9IChCaWdFbmRpYW5DUFUgPyAobWFzayBeIGFjY2VzcykgOiAwKTsKKyAgdW5zaWduZWQgaW50IGJ5dGU7CisgIGFkZHJlc3Nfd29yZCBwYWRkcjsKKyAgaW50IHVuY2FjaGVkOworICB1bnNpZ25lZDY0IG1lbXZhbDsKKworICBpZiAoKHZhZGRyICYgYWNjZXNzKSAhPSAwKQorICAgIFNpZ25hbEV4Y2VwdGlvbkluc3RydWN0aW9uRmV0Y2ggKCk7CisgIEFkZHJlc3NUcmFuc2xhdGlvbiAodmFkZHIsIGlzSU5TVFJVQ1RJT04sIGlzTE9BRCwgJnBhZGRyLCAmdW5jYWNoZWQsIGlzVEFSR0VULCBpc1JFQUwpOworICBwYWRkciA9ICgocGFkZHIgJiB+bWFzaykgfCAoKHBhZGRyICYgbWFzaykgXiByZXZlcnNlZW5kaWFuKSk7CisgIExvYWRNZW1vcnkgKCZtZW12YWwsIE5VTEwsIHVuY2FjaGVkLCBhY2Nlc3MsIHBhZGRyLCB2YWRkciwgaXNJTlNUUlVDVElPTiwgaXNSRUFMKTsKKyAgYnl0ZSA9ICgodmFkZHIgJiBtYXNrKSBeIGJpZ2VuZGlhbmNwdSk7CisgIHJldHVybiAobWVtdmFsID4+ICg4ICogYnl0ZSkpOworfQorCisKK0lOTElORV9TSU1fTUFJTiAodW5zaWduZWQxNikKK2lmZXRjaDE2IChTSU1fREVTQyBTRCwKKwkgIHNpbV9jcHUgKkNQVSwKKwkgIGFkZHJlc3Nfd29yZCBjaWEsCisJICBhZGRyZXNzX3dvcmQgdmFkZHIpCit7CisgIC8qIENvcHkgdGhlIGFjdGlvbiBvZiB0aGUgTEggaW5zdHJ1Y3Rpb24gKi8KKyAgYWRkcmVzc193b3JkIG1hc2sgPSBMT0FERFJNQVNLOworICBhZGRyZXNzX3dvcmQgYWNjZXNzID0gQWNjZXNzTGVuZ3RoX0hBTEZXT1JEOworICBhZGRyZXNzX3dvcmQgcmV2ZXJzZWVuZGlhbiA9IChSZXZlcnNlRW5kaWFuID8gKG1hc2sgXiBhY2Nlc3MpIDogMCk7CisgIGFkZHJlc3Nfd29yZCBiaWdlbmRpYW5jcHUgPSAoQmlnRW5kaWFuQ1BVID8gKG1hc2sgXiBhY2Nlc3MpIDogMCk7CisgIHVuc2lnbmVkIGludCBieXRlOworICBhZGRyZXNzX3dvcmQgcGFkZHI7CisgIGludCB1bmNhY2hlZDsKKyAgdW5zaWduZWQ2NCBtZW12YWw7CisKKyAgaWYgKCh2YWRkciAmIGFjY2VzcykgIT0gMCkKKyAgICBTaWduYWxFeGNlcHRpb25JbnN0cnVjdGlvbkZldGNoICgpOworICBBZGRyZXNzVHJhbnNsYXRpb24gKHZhZGRyLCBpc0lOU1RSVUNUSU9OLCBpc0xPQUQsICZwYWRkciwgJnVuY2FjaGVkLCBpc1RBUkdFVCwgaXNSRUFMKTsKKyAgcGFkZHIgPSAoKHBhZGRyICYgfm1hc2spIHwgKChwYWRkciAmIG1hc2spIF4gcmV2ZXJzZWVuZGlhbikpOworICBMb2FkTWVtb3J5ICgmbWVtdmFsLCBOVUxMLCB1bmNhY2hlZCwgYWNjZXNzLCBwYWRkciwgdmFkZHIsIGlzSU5TVFJVQ1RJT04sIGlzUkVBTCk7CisgIGJ5dGUgPSAoKHZhZGRyICYgbWFzaykgXiBiaWdlbmRpYW5jcHUpOworICByZXR1cm4gKG1lbXZhbCA+PiAoOCAqIGJ5dGUpKTsKK30KKworCisKKy8qIERlc2NyaXB0aW9uIGZyb20gcGFnZSBBLTI2IG9mIHRoZSAiTUlQUyBJViBJbnN0cnVjdGlvbiBTZXQiIG1hbnVhbCAocmV2aXNpb24gMy4xKSAqLworLyogT3JkZXIgbG9hZHMgYW5kIHN0b3JlcyB0byBzeW5jaHJvbmlzZSBzaGFyZWQgbWVtb3J5LiBQZXJmb3JtIHRoZQorICAgYWN0aW9uIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBlZmZlY3RzIG9mIGdyb3VwcyBvZiBzeW5jaHJvbml6YWJsZQorICAgbG9hZHMgYW5kIHN0b3JlcyBpbmRpY2F0ZWQgYnkgc3R5cGUgb2NjdXIgaW4gdGhlIHNhbWUgb3JkZXIgZm9yIGFsbAorICAgcHJvY2Vzc29ycy4gKi8KK0lOTElORV9TSU1fTUFJTiAodm9pZCkKK3N5bmNfb3BlcmF0aW9uIChTSU1fREVTQyBzZCwKKwkJc2ltX2NwdSAqY3B1LAorCQlhZGRyZXNzX3dvcmQgY2lhLAorCQlpbnQgc3R5cGUpCit7CisjaWZkZWYgREVCVUcKKyAgc2ltX2lvX3ByaW50ZihzZCwiU3luY09wZXJhdGlvbiglZCkgOiBUT0RPXG4iLHN0eXBlKTsKKyNlbmRpZiAvKiBERUJVRyAqLworICByZXR1cm47Cit9CisKK0lOTElORV9TSU1fTUFJTiAodm9pZCkKK2NhY2hlX29wIChTSU1fREVTQyBTRCwKKwkgIHNpbV9jcHUgKkNQVSwKKwkgIGFkZHJlc3Nfd29yZCBjaWEsCisJICBpbnQgb3AsCisJICBhZGRyZXNzX3dvcmQgcEFkZHIsCisJICBhZGRyZXNzX3dvcmQgdkFkZHIsCisJICB1bnNpZ25lZCBpbnQgaW5zdHJ1Y3Rpb24pCit7CisjaWYgMSAvKiBzdG9wIHdhcm5pbmcgbWVzc2FnZSBiZWluZyBkaXNwbGF5ZWQgKHdlIHNob3VsZCByZWFsbHkganVzdCByZW1vdmUgdGhlIGNvZGUpICovCisgIHN0YXRpYyBpbnQgaWNhY2hlX3dhcm5pbmcgPSAxOworICBzdGF0aWMgaW50IGRjYWNoZV93YXJuaW5nID0gMTsKKyNlbHNlCisgIHN0YXRpYyBpbnQgaWNhY2hlX3dhcm5pbmcgPSAwOworICBzdGF0aWMgaW50IGRjYWNoZV93YXJuaW5nID0gMDsKKyNlbmRpZgorCisgIC8qIElmIENQMCBpcyBub3QgdXNlYWJsZSAoVXNlciBvciBTdXBlcnZpc29yIG1vZGUpIGFuZCB0aGUgQ1AwCisgICAgIGVuYWJsZSBiaXQgaW4gdGhlIFN0YXR1cyBSZWdpc3RlciBpcyBjbGVhciAtIGEgY29wcm9jZXNzb3IKKyAgICAgdW51c2FibGUgZXhjZXB0aW9uIGlzIHRha2VuLiAqLworI2lmIDAKKyAgc2ltX2lvX3ByaW50ZihTRCwiVE9ETzogQ2FjaGUgYXZhaWxhYmlsaXR5IGNoZWNraW5nIChQQyA9IDB4JXMpXG4iLHByX2FkZHIoY2lhKSk7CisjZW5kaWYKKworICBzd2l0Y2ggKG9wICYgMHgzKSB7CisgICAgY2FzZSAwOiAvKiBpbnN0cnVjdGlvbiBjYWNoZSAqLworICAgICAgc3dpdGNoIChvcCA+PiAyKSB7CisgICAgICAgIGNhc2UgMDogLyogSW5kZXggSW52YWxpZGF0ZSAqLworICAgICAgICBjYXNlIDE6IC8qIEluZGV4IExvYWQgVGFnICovCisgICAgICAgIGNhc2UgMjogLyogSW5kZXggU3RvcmUgVGFnICovCisgICAgICAgIGNhc2UgNDogLyogSGl0IEludmFsaWRhdGUgKi8KKyAgICAgICAgY2FzZSA1OiAvKiBGaWxsICovCisgICAgICAgIGNhc2UgNjogLyogSGl0IFdyaXRlYmFjayAqLworICAgICAgICAgIGlmICghaWNhY2hlX3dhcm5pbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNpbV9pb19lcHJpbnRmKFNELCJJbnN0cnVjdGlvbiBDQUNIRSBvcGVyYXRpb24gJWQgdG8gYmUgY29kZWRcbiIsKG9wID4+IDIpKTsKKyAgICAgICAgICAgICAgaWNhY2hlX3dhcm5pbmcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgU2lnbmFsRXhjZXB0aW9uKFJlc2VydmVkSW5zdHJ1Y3Rpb24saW5zdHJ1Y3Rpb24pOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDE6IC8qIGRhdGEgY2FjaGUgKi8KKyAgICAgIHN3aXRjaCAob3AgPj4gMikgeworICAgICAgICBjYXNlIDA6IC8qIEluZGV4IFdyaXRlYmFjayBJbnZhbGlkYXRlICovCisgICAgICAgIGNhc2UgMTogLyogSW5kZXggTG9hZCBUYWcgKi8KKyAgICAgICAgY2FzZSAyOiAvKiBJbmRleCBTdG9yZSBUYWcgKi8KKyAgICAgICAgY2FzZSAzOiAvKiBDcmVhdGUgRGlydHkgKi8KKyAgICAgICAgY2FzZSA0OiAvKiBIaXQgSW52YWxpZGF0ZSAqLworICAgICAgICBjYXNlIDU6IC8qIEhpdCBXcml0ZWJhY2sgSW52YWxpZGF0ZSAqLworICAgICAgICBjYXNlIDY6IC8qIEhpdCBXcml0ZWJhY2sgKi8gCisgICAgICAgICAgaWYgKCFkY2FjaGVfd2FybmluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc2ltX2lvX2VwcmludGYoU0QsIkRhdGEgQ0FDSEUgb3BlcmF0aW9uICVkIHRvIGJlIGNvZGVkXG4iLChvcCA+PiAyKSk7CisgICAgICAgICAgICAgIGRjYWNoZV93YXJuaW5nID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIFNpZ25hbEV4Y2VwdGlvbihSZXNlcnZlZEluc3RydWN0aW9uLGluc3RydWN0aW9uKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDogLyogdW5yZWNvZ25pc2VkIGNhY2hlIElEICovCisgICAgICBTaWduYWxFeGNlcHRpb24oUmVzZXJ2ZWRJbnN0cnVjdGlvbixpbnN0cnVjdGlvbik7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybjsKK30KKworCitJTkxJTkVfU0lNX01BSU4gKHZvaWQpCitwZW5kaW5nX3RpY2sgKFNJTV9ERVNDIFNELAorCSAgICAgIHNpbV9jcHUgKkNQVSwKKwkgICAgICBhZGRyZXNzX3dvcmQgY2lhKQoreworICBpZiAoUEVORElOR19UUkFDRSkJCQkJCQkJCisgICAgc2ltX2lvX2VwcmludGYgKFNELCAiUEVORElOR19EUkFJTiAtIDB4JWx4IC0gcGVuZGluZ19pbiA9ICVkLCBwZW5kaW5nX291dCA9ICVkLCBwZW5kaW5nX3RvdGFsID0gJWRcbiIsICh1bnNpZ25lZCBsb25nKSBjaWEsIFBFTkRJTkdfSU4sIFBFTkRJTkdfT1VULCBQRU5ESU5HX1RPVEFMKTsgCisgIGlmIChQRU5ESU5HX09VVCAhPSBQRU5ESU5HX0lOKQkJCQkJCisgICAgewkJCQkJCQkJCQorICAgICAgaW50IGxvb3A7CQkJCQkJCQorICAgICAgaW50IGluZGV4ID0gUEVORElOR19PVVQ7CQkJCQkKKyAgICAgIGludCB0b3RhbCA9IFBFTkRJTkdfVE9UQUw7CQkJCQkKKyAgICAgIGlmIChQRU5ESU5HX1RPVEFMID09IDApCQkJCQkJCisJc2ltX2VuZ2luZV9hYm9ydCAoU0QsIENQVSwgY2lhLCAiUEVORElOR19EUkFJTiAtIE1pcy1tYXRjaCBvbiBwZW5kaW5nIHVwZGF0ZSBwb2ludGVyc1xuIik7IAorICAgICAgZm9yIChsb29wID0gMCwgaW5kZXggPSBQRU5ESU5HX09VVDsKKwkgICAobG9vcCA8IHRvdGFsKTsKKwkgICBsb29wKyssIGluZGV4ID0gKGluZGV4ICsgMSkgJSBQU0xPVFMpCisJewkJCQkJCQkJCisJICBpZiAoUEVORElOR19TTE9UX0RFU1RbaW5kZXhdICE9IE5VTEwpCQkJCisJICAgIHsJCQkJCQkJCQorCSAgICAgIFBFTkRJTkdfU0xPVF9ERUxBWVtpbmRleF0gLT0gMTsJCQkJCisJICAgICAgaWYgKFBFTkRJTkdfU0xPVF9ERUxBWVtpbmRleF0gPT0gMCkJCQkKKwkJewkJCQkJCQkKKwkJICBpZiAoUEVORElOR19UUkFDRSkKKwkJICAgIHNpbV9pb19lcHJpbnRmIChTRCwgIlBFTkRJTkdfRFJBSU4gLSBkcmFpbmVkIC0gaW5kZXggJWQsIGRlc3QgMHglbHgsIGJpdCAlZCwgdmFsIDB4JWx4LCBzaXplICVkXG4iLAorCQkJCSAgICBpbmRleCwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcpIFBFTkRJTkdfU0xPVF9ERVNUW2luZGV4XSwKKwkJCQkgICAgUEVORElOR19TTE9UX0JJVFtpbmRleF0sCisJCQkJICAgICh1bnNpZ25lZCBsb25nKSBQRU5ESU5HX1NMT1RfVkFMVUVbaW5kZXhdLAorCQkJCSAgICBQRU5ESU5HX1NMT1RfU0laRVtpbmRleF0pOworCQkgIGlmIChQRU5ESU5HX1NMT1RfQklUW2luZGV4XSA+PSAwKQkJCQorCQkgICAgc3dpdGNoIChQRU5ESU5HX1NMT1RfU0laRVtpbmRleF0pICAgICAgICAgICAgICAgICAKKwkJICAgICAgewkJCQkJCQorCQkgICAgICBjYXNlIDQ6CisJCQlpZiAoUEVORElOR19TTE9UX1ZBTFVFW2luZGV4XSkJCQorCQkJICAqKHVuc2lnbmVkMzIqKVBFTkRJTkdfU0xPVF9ERVNUW2luZGV4XSB8PSAJCisJCQkgICAgQklUMzIgKFBFTkRJTkdfU0xPVF9CSVRbaW5kZXhdKTsJCQorCQkJZWxzZQkJCQkJCQorCQkJICAqKHVuc2lnbmVkMzIqKVBFTkRJTkdfU0xPVF9ERVNUW2luZGV4XSAmPSAJCisJCQkgICAgQklUMzIgKFBFTkRJTkdfU0xPVF9CSVRbaW5kZXhdKTsJCQorCQkJYnJlYWs7CQkJCQkKKwkJICAgICAgY2FzZSA4OgkJCQkJCisJCQlpZiAoUEVORElOR19TTE9UX1ZBTFVFW2luZGV4XSkJCQorCQkJICAqKHVuc2lnbmVkNjQqKVBFTkRJTkdfU0xPVF9ERVNUW2luZGV4XSB8PSAJCisJCQkgICAgQklUNjQgKFBFTkRJTkdfU0xPVF9CSVRbaW5kZXhdKTsJCQorCQkJZWxzZQkJCQkJCQorCQkJICAqKHVuc2lnbmVkNjQqKVBFTkRJTkdfU0xPVF9ERVNUW2luZGV4XSAmPSAJCisJCQkgICAgQklUNjQgKFBFTkRJTkdfU0xPVF9CSVRbaW5kZXhdKTsJCQorCQkJYnJlYWs7CQkJCQkKKwkJICAgICAgfQorCQkgIGVsc2UKKwkJICAgIHN3aXRjaCAoUEVORElOR19TTE9UX1NJWkVbaW5kZXhdKSAgICAgICAgICAgICAgICAgCisJCSAgICAgIHsJCQkJCQkKKwkJICAgICAgY2FzZSA0OgkJCQkJCisJCQkqKHVuc2lnbmVkMzIqKVBFTkRJTkdfU0xPVF9ERVNUW2luZGV4XSA9IAkKKwkJCSAgUEVORElOR19TTE9UX1ZBTFVFW2luZGV4XTsJCQkKKwkJCWJyZWFrOwkJCQkJCisJCSAgICAgIGNhc2UgODoJCQkJCQorCQkJKih1bnNpZ25lZDY0KilQRU5ESU5HX1NMT1RfREVTVFtpbmRleF0gPSAJCisJCQkgIFBFTkRJTkdfU0xPVF9WQUxVRVtpbmRleF07CQkJCisJCQlicmVhazsJCQkJCQorCQkgICAgICB9CQkJCQkJCQorCQkgIGlmIChQRU5ESU5HX09VVCA9PSBpbmRleCkKKwkJICAgIHsKKwkJICAgICAgUEVORElOR19TTE9UX0RFU1RbaW5kZXhdID0gTlVMTDsKKwkJICAgICAgUEVORElOR19PVVQgPSAoUEVORElOR19PVVQgKyAxKSAlIFBTTE9UUzsKKwkJICAgICAgUEVORElOR19UT1RBTC0tOworCQkgICAgfQorCQl9CQkJCQkJCQorCSAgICAgIGVsc2UgaWYgKFBFTkRJTkdfVFJBQ0UgJiYgUEVORElOR19TTE9UX0RFTEFZW2luZGV4XSA+IDApCisJCXNpbV9pb19lcHJpbnRmIChTRCwgIlBFTkRJTkdfRFJBSU4gLSBxdWV1ZWQgLSBpbmRleCAlZCwgZGVsYXkgJWQsIGRlc3QgMHglbHgsIGJpdCAlZCwgdmFsIDB4JWx4LCBzaXplICVkXG4iLAorCQkJCWluZGV4LCBQRU5ESU5HX1NMT1RfREVMQVlbaW5kZXhdLAorCQkJCSh1bnNpZ25lZCBsb25nKSBQRU5ESU5HX1NMT1RfREVTVFtpbmRleF0sCisJCQkJUEVORElOR19TTE9UX0JJVFtpbmRleF0sCisJCQkJKHVuc2lnbmVkIGxvbmcpIFBFTkRJTkdfU0xPVF9WQUxVRVtpbmRleF0sCisJCQkJUEVORElOR19TTE9UX1NJWkVbaW5kZXhdKTsKKworCSAgICB9CQkJCQkJCQkKKwl9CQkJCQkJCQkKKyAgICB9CQkJCQkJCQkJCit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vbWlwcy9zaW0tbWFpbi5oIGIvc2ltL21pcHMvc2ltLW1haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjZhNmY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL21pcHMvc2ltLW1haW4uaApAQCAtMCwwICsxLDc4NSBAQAorLyogTUlQUyBTaW11bGF0b3IgZGVmaW5pdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCit3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgU0lNX01BSU5fSAorI2RlZmluZSBTSU1fTUFJTl9ICisKKy8qIFRoaXMgc2ltdWxhdG9yIGRvZXNuJ3QgY2FjaGUgdGhlIEN1cnJlbnQgSW5zdHJ1Y3Rpb24gQWRkcmVzcyAqLworLyogI2RlZmluZSBTSU1fRU5HSU5FX0hBTFRfSE9PSyhTRCwgTEFTVF9DUFUsIENJQSkgKi8KKy8qICNkZWZpbmUgU0lNX0VOR0lORV9SRVNVTUVfSE9PSyhTRCwgTEFTVF9DUFUsIENJQSkgKi8KKworI2RlZmluZSBTSU1fSEFWRV9CSUVORElBTgorCisKKy8qIGhvYmJsZSBzb21lIGNvbW1vbiBmZWF0dXJlcyBmb3IgbW9tZW50ICovCisjZGVmaW5lIFdJVEhfV0FUQ0hQT0lOVFMgMQorI2RlZmluZSBXSVRIX01PRFVMT19NRU1PUlkgMQorCisKKyNkZWZpbmUgU0lNX0NPUkVfU0lHTkFMKFNELENQVSxDSUEsTUFQLE5SX0JZVEVTLEFERFIsVFJBTlNGRVIsRVJST1IpIFwKK21pcHNfY29yZV9zaWduYWwgKChTRCksIChDUFUpLCAoQ0lBKSwgKE1BUCksIChOUl9CWVRFUyksIChBRERSKSwgKFRSQU5TRkVSKSwgKEVSUk9SKSkKKworI2luY2x1ZGUgInNpbS1iYXNpY3MuaCIKKwordHlwZWRlZiBhZGRyZXNzX3dvcmQgc2ltX2NpYTsKKworI2luY2x1ZGUgInNpbS1iYXNlLmgiCisKKworLyogRGVwcmVjaWF0ZWQgbWFjcm9zIGFuZCB0eXBlcyBmb3IgbWFuaXB1bGF0aW5nIDY0Yml0IHZhbHVlcy4gIFVzZQorICAgLi4vY29tbW9uL3NpbS1iaXRzLmggYW5kIC4uL2NvbW1vbi9zaW0tZW5kaWFuLmggbWFjcm9zIGluc3RlYWQuICovCisKK3R5cGVkZWYgc2lnbmVkNjQgd29yZDY0OwordHlwZWRlZiB1bnNpZ25lZDY0IHV3b3JkNjQ7CisKKyNkZWZpbmUgV09SRDY0TE8odCkgICAgICh1bnNpZ25lZCBpbnQpKCh0KSYweEZGRkZGRkZGKQorI2RlZmluZSBXT1JENjRISSh0KSAgICAgKHVuc2lnbmVkIGludCkoKCh1d29yZDY0KSh0KSk+PjMyKQorI2RlZmluZSBTRVQ2NExPKHQpICAgICAgKCgodXdvcmQ2NCkodCkpJjB4RkZGRkZGRkYpCisjZGVmaW5lIFNFVDY0SEkodCkJKCgodXdvcmQ2NCkodCkpPDwzMikKKyNkZWZpbmUgV09SRDY0KGgsbCkgICAgICgod29yZDY0KSgoU0VUNjRISShoKXxTRVQ2NExPKGwpKSkpCisjZGVmaW5lIFVXT1JENjQoaCxsKSAgICAgKFNFVDY0SEkoaCl8U0VUNjRMTyhsKSkKKworLyogU2lnbi1leHRlbmQgdGhlIGdpdmVuIHZhbHVlIChlKSBhcyBhIHZhbHVlIChiKSBiaXRzIGxvbmcuIFdlIGNhbm5vdAorICAgYXNzdW1lIHRoZSBISTMyYml0cyBvZiB0aGUgb3BlcmFuZCBhcmUgemVybywgc28gd2UgbXVzdCBwZXJmb3JtIGEKKyAgIG1hc2sgdG8gZW5zdXJlIHdlIGNhbiB1c2UgdGhlIHNpbXBsZSBzdWJ0cmFjdGlvbiB0byBzaWduLWV4dGVuZC4gKi8KKyNkZWZpbmUgU0lHTkVYVEVORChlLGIpIFwKKyAoKHVuc2lnbmVkX3dvcmQpIFwKKyAgKCgoZSkgJiAoKHV3b3JkNjQpIDEgPDwgKChiKSAtIDEpKSkgXAorICAgPyAoKChlKSAmICgoKHV3b3JkNjQpIDEgPDwgKGIpKSAtIDEpKSAtICgodXdvcmQ2NCkxIDw8IChiKSkpIFwKKyAgIDogKChlKSAmICgoKCgodXdvcmQ2NCkgMSA8PCAoKGIpIC0gMSkpIC0gMSkgPDwgMSkgfCAxKSkpKQorCisvKiBDaGVjayBpZiBhIHZhbHVlIHdpbGwgZml0IHdpdGhpbiBhIGhhbGZ3b3JkOiAqLworI2RlZmluZSBOT1RIQUxGV09SRFZBTFVFKHYpICgoKCgoKHV3b3JkNjQpKHYpPj4xNikgPT0gMCkgJiYgISgodikgJiAoKHVuc2lnbmVkKTEgPDwgMTUpKSkgfHwgKCgoKCh1d29yZDY0KSh2KT4+MzIpID09IDB4RkZGRkZGRkYpICYmICgoKCh1d29yZDY0KSh2KT4+MTYpICYgMHhGRkZGKSA9PSAweEZGRkYpKSAmJiAoKHYpICYgKCh1bnNpZ25lZCkxIDw8IDE1KSkpKSA/ICgxID09IDApIDogKDEgPT0gMSkpCisKKworCisvKiBGbG9hdGluZy1wb2ludCBvcGVyYXRpb25zOiAqLworCisjaW5jbHVkZSAic2ltLWZwdS5oIgorCisvKiBGUFUgcmVnaXN0ZXJzIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMuIEFsbCBvdGhlciB2YWx1ZXMKKyAgIGFyZSByZXNlcnZlZCAoYW5kIHVuZGVmaW5lZCkuICovCit0eXBlZGVmIGVudW0geworIGZtdF9zaW5nbGUgID0gMCwKKyBmbXRfZG91YmxlICA9IDEsCisgZm10X3dvcmQgICAgPSA0LAorIGZtdF9sb25nICAgID0gNSwKKyAvKiBUaGUgZm9sbG93aW5nIGFyZSB3ZWxsIG91dHNpZGUgdGhlIG5vcm1hbCBhY2NlcHRhYmxlIGZvcm1hdAorICAgIHJhbmdlLCBhbmQgYXJlIHVzZWQgaW4gdGhlIHJlZ2lzdGVyIHN0YXR1cyB2ZWN0b3IuICovCisgZm10X3Vua25vd24gICAgICAgPSAweDEwMDAwMDAwLAorIGZtdF91bmludGVycHJldGVkID0gMHgyMDAwMDAwMCwKKyBmbXRfdW5pbnRlcnByZXRlZF8zMiA9IDB4NDAwMDAwMDAsCisgZm10X3VuaW50ZXJwcmV0ZWRfNjQgPSAweDgwMDAwMDAwVSwKK30gRlBfZm9ybWF0czsKKwordW5zaWduZWQ2NCB2YWx1ZV9mcHIgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgYWRkcmVzc193b3JkIGNpYSwgaW50IGZwciwgRlBfZm9ybWF0cykpOworI2RlZmluZSBWYWx1ZUZQUihGUFIsRk1UKSB2YWx1ZV9mcHIgKFNELCBDUFUsIGNpYSwgKEZQUiksIChGTVQpKQorCit2b2lkIHN0b3JlX2ZwciBQQVJBTVMgKChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBhZGRyZXNzX3dvcmQgY2lhLCBpbnQgZnByLCBGUF9mb3JtYXRzIGZtdCwgdW5zaWduZWQ2NCB2YWx1ZSkpOworI2RlZmluZSBTdG9yZUZQUihGUFIsRk1ULFZBTFVFKSBzdG9yZV9mcHIgKFNELCBDUFUsIGNpYSwgKEZQUiksIChGTVQpLCAoVkFMVUUpKQorCitpbnQgTmFOIFBBUkFNUyAoKHVuc2lnbmVkNjQgb3AsIEZQX2Zvcm1hdHMgZm10KSk7CitpbnQgSW5maW5pdHkgUEFSQU1TICgodW5zaWduZWQ2NCBvcCwgRlBfZm9ybWF0cyBmbXQpKTsKK2ludCBMZXNzIFBBUkFNUyAoKHVuc2lnbmVkNjQgb3AxLCB1bnNpZ25lZDY0IG9wMiwgRlBfZm9ybWF0cyBmbXQpKTsKK2ludCBFcXVhbCBQQVJBTVMgKCh1bnNpZ25lZDY0IG9wMSwgdW5zaWduZWQ2NCBvcDIsIEZQX2Zvcm1hdHMgZm10KSk7Cit1bnNpZ25lZDY0IEFic29sdXRlVmFsdWUgUEFSQU1TICgodW5zaWduZWQ2NCBvcCwgRlBfZm9ybWF0cyBmbXQpKTsKK3Vuc2lnbmVkNjQgTmVnYXRlIFBBUkFNUyAoKHVuc2lnbmVkNjQgb3AsIEZQX2Zvcm1hdHMgZm10KSk7Cit1bnNpZ25lZDY0IEFkZCBQQVJBTVMgKCh1bnNpZ25lZDY0IG9wMSwgdW5zaWduZWQ2NCBvcDIsIEZQX2Zvcm1hdHMgZm10KSk7Cit1bnNpZ25lZDY0IFN1YiBQQVJBTVMgKCh1bnNpZ25lZDY0IG9wMSwgdW5zaWduZWQ2NCBvcDIsIEZQX2Zvcm1hdHMgZm10KSk7Cit1bnNpZ25lZDY0IE11bHRpcGx5IFBBUkFNUyAoKHVuc2lnbmVkNjQgb3AxLCB1bnNpZ25lZDY0IG9wMiwgRlBfZm9ybWF0cyBmbXQpKTsKK3Vuc2lnbmVkNjQgRGl2aWRlIFBBUkFNUyAoKHVuc2lnbmVkNjQgb3AxLCB1bnNpZ25lZDY0IG9wMiwgRlBfZm9ybWF0cyBmbXQpKTsKK3Vuc2lnbmVkNjQgUmVjaXAgUEFSQU1TICgodW5zaWduZWQ2NCBvcCwgRlBfZm9ybWF0cyBmbXQpKTsKK3Vuc2lnbmVkNjQgU3F1YXJlUm9vdCBQQVJBTVMgKCh1bnNpZ25lZDY0IG9wLCBGUF9mb3JtYXRzIGZtdCkpOwordW5zaWduZWQ2NCBNYXggUEFSQU1TICgodW5zaWduZWQ2NCBvcDEsIHVuc2lnbmVkNjQgb3AyLCBGUF9mb3JtYXRzIGZtdCkpOwordW5zaWduZWQ2NCBNaW4gUEFSQU1TICgodW5zaWduZWQ2NCBvcDEsIHVuc2lnbmVkNjQgb3AyLCBGUF9mb3JtYXRzIGZtdCkpOwordW5zaWduZWQ2NCBjb252ZXJ0IFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGFkZHJlc3Nfd29yZCBjaWEsIGludCBybSwgdW5zaWduZWQ2NCBvcCwgRlBfZm9ybWF0cyBmcm9tLCBGUF9mb3JtYXRzIHRvKSk7CisjZGVmaW5lIENvbnZlcnQocm0sb3AsZnJvbSx0bykgXAorY29udmVydCAoU0QsIENQVSwgY2lhLCBybSwgb3AsIGZyb20sIHRvKQorCisvKiBNYWNybyB0byB1cGRhdGUgRlBTUiBjb25kaXRpb24tY29kZSBmaWVsZC4gVGhpcyBpcyBjb21wbGljYXRlZCBieQorICAgdGhlIGZhY3QgdGhhdCB0aGVyZSBpcyBhIGhvbGUgaW4gdGhlIGluZGV4IHJhbmdlIG9mIHRoZSBiaXRzIHdpdGhpbgorICAgdGhlIEZDU1IgcmVnaXN0ZXIuIEFsc28sIHRoZSBudW1iZXIgb2YgYml0cyB2aXNpYmxlIGRlcGVuZHMgb24gdGhlCisgICBNSVBTIElTQSB2ZXJzaW9uIGJlaW5nIHN1cHBvcnRlZC4gKi8KKworI2RlZmluZSBTRVRGQ0MoY2Msdikge1wKKyAgaW50IGJpdCA9ICgoY2MgPT0gMCkgPyAyMyA6ICgyNCArIChjYykpKTtcCisgIEZDU1IgPSAoKEZDU1IgJiB+KDEgPDwgYml0KSkgfCAoKHYpIDw8IGJpdCkpO1wKK30KKyNkZWZpbmUgR0VURkNDKGNjKSAoKCgoKGNjKSA9PSAwKSA/IChGQ1NSICYgKDEgPDwgMjMpKSA6IChGQ1NSICYgKDEgPDwgKDI0ICsgKGNjKSkpKSkgIT0gMCkgPyAxVSA6IDApCisKKy8qIFRoaXMgc2hvdWxkIGJlIHRoZSBDT0MxIHZhbHVlIGF0IHRoZSBzdGFydCBvZiB0aGUgcHJlY2VkaW5nCisgICBpbnN0cnVjdGlvbjogKi8KKyNkZWZpbmUgUFJFVkNPQzEoKSAoKFNUQVRFICYgc2ltUENPQzEpID8gMSA6IDApCisKKyNpZmRlZiBUQVJHRVRfRU5BQkxFX0ZSCisvKiBGSVhNRTogdGhpcyBzaG91bGQgYmUgZW5hYmxlZCBmb3IgYWxsIHRhcmdldHMsIGJ1dCBuZWVkcyB0ZXN0aW5nIGZpcnN0LiAqLworI2RlZmluZSBTaXplRkdSKCkgKCgoV0lUSF9UQVJHRVRfRkxPQVRJTkdfUE9JTlRfQklUU0laRSkgPT0gNjQpIFwKKyAgID8gKChTUiAmIHN0YXR1c19GUikgPyA2NCA6IDMyKSBcCisgICA6IChXSVRIX1RBUkdFVF9GTE9BVElOR19QT0lOVF9CSVRTSVpFKSkKKyNlbHNlCisjZGVmaW5lIFNpemVGR1IoKSAoV0lUSF9UQVJHRVRfRkxPQVRJTkdfUE9JTlRfQklUU0laRSkKKyNlbmRpZgorCisvKiBTdGFuZGFyZCBGQ1JTIGJpdHM6ICovCisjZGVmaW5lIElSICgwKSAvKiBJbmV4YWN0IFJlc3VsdCAqLworI2RlZmluZSBVRiAoMSkgLyogVW5kZXJGbG93ICovCisjZGVmaW5lIE9GICgyKSAvKiBPdmVyRmxvdyAqLworI2RlZmluZSBEWiAoMykgLyogRGl2aXNpb24gYnkgWmVybyAqLworI2RlZmluZSBJTyAoNCkgLyogSW52YWxpZCBPcGVyYXRpb24gKi8KKyNkZWZpbmUgVU8gKDUpIC8qIFVuaW1wbGVtZW50ZWQgT3BlcmF0aW9uICovCisKKy8qIEdldCBtYXNrcyBmb3IgaW5kaXZpZHVhbCBmbGFnczogKi8KKyNpZiAxIC8qIFNBRkUgdmVyc2lvbiAqLworI2RlZmluZSBGUF9GTEFHUyhiKSAgKCgodW5zaWduZWQpKGIpIDwgNSkgPyAoMSA8PCAoKGIpICsgMikpIDogMCkKKyNkZWZpbmUgRlBfRU5BQkxFKGIpICgoKHVuc2lnbmVkKShiKSA8IDUpID8gKDEgPDwgKChiKSArIDcpKSA6IDApCisjZGVmaW5lIEZQX0NBVVNFKGIpICAoKCh1bnNpZ25lZCkoYikgPCA2KSA/ICgxIDw8ICgoYikgKyAxMikpIDogMCkKKyNlbHNlCisjZGVmaW5lIEZQX0ZMQUdTKGIpICAoMSA8PCAoKGIpICsgMikpCisjZGVmaW5lIEZQX0VOQUJMRShiKSAoMSA8PCAoKGIpICsgNykpCisjZGVmaW5lIEZQX0NBVVNFKGIpICAoMSA8PCAoKGIpICsgMTIpKQorI2VuZGlmCisKKyNkZWZpbmUgRlBfRlMgICAgICAgICAoMSA8PCAyNCkgLyogTUlQUyBJSUkgb253YXJkcyA6IEZsdXNoIHRvIFplcm8gKi8KKworI2RlZmluZSBGUF9NQVNLX1JNICAgICgweDMpCisjZGVmaW5lIEZQX1NIX1JNICAgICAgKDApCisjZGVmaW5lIEZQX1JNX05FQVJFU1QgKDApIC8qIFJvdW5kIHRvIG5lYXJlc3QgICAgICAgIChSb3VuZCkgKi8KKyNkZWZpbmUgRlBfUk1fVE9aRVJPICAoMSkgLyogUm91bmQgdG8gemVybyAgICAgICAgICAgKFRydW5jKSAqLworI2RlZmluZSBGUF9STV9UT1BJTkYgICgyKSAvKiBSb3VuZCB0byBQbHVzIGluZmluaXR5ICAoQ2VpbCkgKi8KKyNkZWZpbmUgRlBfUk1fVE9NSU5GICAoMykgLyogUm91bmQgdG8gTWludXMgaW5maW5pdHkgKEZsb29yKSAqLworI2RlZmluZSBHRVRSTSgpICAgICAgIChpbnQpKChGQ1NSID4+IEZQX1NIX1JNKSAmIEZQX01BU0tfUk0pCisKKworCisKKworCisvKiBISS9MTyByZWdpc3RlciBhY2Nlc3NlcyAqLworCisvKiBGb3Igc29tZSBNSVBTIHRhcmdldHMsIHRoZSBISS9MTyByZWdpc3RlcnMgaGF2ZSBjZXJ0YWluIHRpbWluZworICAgcmVzdHJpY3Rpb25zIGluIHRoYXQsIGZvciBpbnN0YW5jZSwgYSByZWFkIG9mIGEgSEkgcmVnaXN0ZXIgbXVzdCBiZQorICAgc2VwYXJhdGVkIGJ5IGF0IGxlYXN0IHRocmVlIGluc3RydWN0aW9ucyBmcm9tIGEgcHJlY2VlZGluZyByZWFkLgorCisgICBUaGUgc3RydWN0IGJlbG93IGlzIHVzZWQgdG8gcmVjb3JkIHRoZSBsYXN0IGFjY2VzcyBieSBlYWNoIG9mIEEgTVQsCisgICBNRiBvciBvdGhlciBPUCBpbnN0cnVjdGlvbiB0byBhIEhJL0xPIHJlZ2lzdGVyLiAgU2VlIG1pcHMuaWdlbiBmb3IKKyAgIG1vcmUgZGV0YWlscy4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2hpbG9fYWNjZXNzIHsKKyAgc2lnbmVkNjQgdGltZXN0YW1wOworICBhZGRyZXNzX3dvcmQgY2lhOworfSBoaWxvX2FjY2VzczsKKwordHlwZWRlZiBzdHJ1Y3QgX2hpbG9faGlzdG9yeSB7CisgIGhpbG9fYWNjZXNzIG10OworICBoaWxvX2FjY2VzcyBtZjsKKyAgaGlsb19hY2Nlc3Mgb3A7Cit9IGhpbG9faGlzdG9yeTsKKworCisKKworLyogSW50ZWdlciBBTFUgb3BlcmF0aW9uczogKi8KKworI2luY2x1ZGUgInNpbS1hbHUuaCIKKworI2RlZmluZSBBTFUzMl9FTkQoQU5TKSBcCisgIGlmIChBTFUzMl9IQURfT1ZFUkZMT1cpIFwKKyAgICBTaWduYWxFeGNlcHRpb25JbnRlZ2VyT3ZlcmZsb3cgKCk7IFwKKyAgKEFOUykgPSAoc2lnbmVkMzIpIEFMVTMyX09WRVJGTE9XX1JFU1VMVAorCisKKyNkZWZpbmUgQUxVNjRfRU5EKEFOUykgXAorICBpZiAoQUxVNjRfSEFEX09WRVJGTE9XKSBcCisgICAgU2lnbmFsRXhjZXB0aW9uSW50ZWdlck92ZXJmbG93ICgpOyBcCisgIChBTlMpID0gQUxVNjRfT1ZFUkZMT1dfUkVTVUxUOworCisKKworCisKKy8qIFRoZSBmb2xsb3dpbmcgaXMgcHJvYmFibHkgbm90IHVzZWQgZm9yIE1JUFMgSVYgb253YXJkczogKi8KKy8qIFNsb3RzIGZvciBkZWxheWVkIHJlZ2lzdGVyIHVwZGF0ZXMuIEZvciB0aGUgbW9tZW50IHdlIGp1c3QgaGF2ZSBhCisgICBmaXhlZCBudW1iZXIgb2Ygc2xvdHMgKHJhdGhlciB0aGFuIGEgbW9yZSBnZW5lcmljLCBkeW5hbWljCisgICBzeXN0ZW0pLiBUaGlzIGtlZXBzIHRoZSBzaW11bGF0b3IgZmFzdC4gSG93ZXZlciwgd2Ugb25seSBhbGxvdworICAgZm9yIHRoZSByZWdpc3RlciB1cGRhdGUgdG8gYmUgZGVsYXllZCBmb3IgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24KKyAgIGN5Y2xlLiAqLworI2RlZmluZSBQU0xPVFMgKDgpIC8qIE1heGltdW0gbnVtYmVyIG9mIGluc3RydWN0aW9uIGN5Y2xlcyAqLworCit0eXBlZGVmIHN0cnVjdCBfcGVuZGluZ193cml0ZV9xdWV1ZSB7CisgIGludCBpbjsKKyAgaW50IG91dDsKKyAgaW50IHRvdGFsOworICBpbnQgc2xvdF9kZWxheVtQU0xPVFNdOworICBpbnQgc2xvdF9zaXplW1BTTE9UU107CisgIGludCBzbG90X2JpdFtQU0xPVFNdOworICB2b2lkICpzbG90X2Rlc3RbUFNMT1RTXTsKKyAgdW5zaWduZWQ2NCBzbG90X3ZhbHVlW1BTTE9UU107Cit9IHBlbmRpbmdfd3JpdGVfcXVldWU7CisKKyNpZm5kZWYgUEVORElOR19UUkFDRQorI2RlZmluZSBQRU5ESU5HX1RSQUNFIDAKKyNlbmRpZgorI2RlZmluZSBQRU5ESU5HX0lOICgoQ1BVKS0+cGVuZGluZy5pbikKKyNkZWZpbmUgUEVORElOR19PVVQgKChDUFUpLT5wZW5kaW5nLm91dCkKKyNkZWZpbmUgUEVORElOR19UT1RBTCAoKENQVSktPnBlbmRpbmcudG90YWwpCisjZGVmaW5lIFBFTkRJTkdfU0xPVF9TSVpFICgoQ1BVKS0+cGVuZGluZy5zbG90X3NpemUpCisjZGVmaW5lIFBFTkRJTkdfU0xPVF9CSVQgKChDUFUpLT5wZW5kaW5nLnNsb3RfYml0KQorI2RlZmluZSBQRU5ESU5HX1NMT1RfREVMQVkgKChDUFUpLT5wZW5kaW5nLnNsb3RfZGVsYXkpCisjZGVmaW5lIFBFTkRJTkdfU0xPVF9ERVNUICgoQ1BVKS0+cGVuZGluZy5zbG90X2Rlc3QpCisjZGVmaW5lIFBFTkRJTkdfU0xPVF9WQUxVRSAoKENQVSktPnBlbmRpbmcuc2xvdF92YWx1ZSkKKworLyogSW52YWxpZGF0ZSB0aGUgcGVuZGluZyB3cml0ZSBxdWV1ZSwgYWxsIHBlbmRpbmcgd3JpdGVzIGFyZQorICAgZGlzY2FyZGVkLiAqLworCisjZGVmaW5lIFBFTkRJTkdfSU5WQUxJREFURSgpIFwKK21lbXNldCAoJihDUFUpLT5wZW5kaW5nLCAwLCBzaXplb2YgKChDUFUpLT5wZW5kaW5nKSkKKworLyogU2NoZWR1bGUgYSB3cml0ZSB0byBERVNUIGZvciBOIGN5Y2xlcyB0aW1lLiAgRm9yIDY0IGJpdAorICAgZGVzdGluYXRpb25zLCBzY2hlZHVsZSB0d28gd3JpdGVzLiAgRm9yIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycywKKyAgIHRoZSBjYWxsZXIgc2hvdWxkIHNjaGVkdWxlIGEgd3JpdGUgdG8gYm90aCB0aGUgZGVzdCByZWdpc3RlciBhbmQKKyAgIHRoZSBGUFJfU1RBVEUgcmVnaXN0ZXIuICBXaGVuIEJJVCBpcyBub24tbmVnYXRpdmUsIG9ubHkgQklUIG9mIERFU1QKKyAgIGlzIHVwZGF0ZWQuICovCisKKyNkZWZpbmUgUEVORElOR19TQ0hFRChERVNULFZBTCxERUxBWSxCSVQpCQkJCVwKKyAgZG8gewkJCQkJCQkJCVwKKyAgICBpZiAoUEVORElOR19TTE9UX0RFU1RbUEVORElOR19JTl0gIT0gTlVMTCkJCQkJXAorICAgICAgc2ltX2VuZ2luZV9hYm9ydCAoU0QsIENQVSwgY2lhLAkJCQkJXAorCQkgICAgICAgICJQRU5ESU5HX1NDSEVEIC0gYnVmZmVyIG92ZXJmbG93XG4iKTsJCVwKKyAgICBpZiAoUEVORElOR19UUkFDRSkJCQkJCQkJXAorICAgICAgc2ltX2lvX2VwcmludGYgKFNELCAiUEVORElOR19TQ0hFRCAtIDB4JWx4IC0gZGVzdCAweCVseCwgdmFsIDB4JWx4LCBiaXQgJWQsIHNpemUgJWQsIHBlbmRpbmdfaW4gJWQsIHBlbmRpbmdfb3V0ICVkLCBwZW5kaW5nX3RvdGFsICVkXG4iLAkJCVwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpIGNpYSwgKHVuc2lnbmVkIGxvbmcpICYoREVTVCksCVwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpIChWQUwpLCAoQklUKSwgKGludCkgc2l6ZW9mIChERVNUKSxcCisJCSAgICAgIFBFTkRJTkdfSU4sIFBFTkRJTkdfT1VULCBQRU5ESU5HX1RPVEFMKTsJCVwKKyAgICBQRU5ESU5HX1NMT1RfREVMQVlbUEVORElOR19JTl0gPSAoREVMQVkpICsgMTsJCQlcCisgICAgUEVORElOR19TTE9UX0RFU1RbUEVORElOR19JTl0gPSAmKERFU1QpOwkJCQlcCisgICAgUEVORElOR19TTE9UX1ZBTFVFW1BFTkRJTkdfSU5dID0gKFZBTCk7CQkJCVwKKyAgICBQRU5ESU5HX1NMT1RfU0laRVtQRU5ESU5HX0lOXSA9IHNpemVvZiAoREVTVCk7CQkJXAorICAgIFBFTkRJTkdfU0xPVF9CSVRbUEVORElOR19JTl0gPSAoQklUKTsJCQkJXAorICAgIFBFTkRJTkdfSU4gPSAoUEVORElOR19JTiArIDEpICUgUFNMT1RTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBFTkRJTkdfVE9UQUwgKz0gMTsJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBQRU5ESU5HX1dSSVRFKERFU1QsVkFMLERFTEFZKSBQRU5ESU5HX1NDSEVEKERFU1QsVkFMLERFTEFZLC0xKQorI2RlZmluZSBQRU5ESU5HX0JJVChERVNULFZBTCxERUxBWSxCSVQpIFBFTkRJTkdfU0NIRUQoREVTVCxWQUwsREVMQVksQklUKQorCisjZGVmaW5lIFBFTkRJTkdfVElDSygpIHBlbmRpbmdfdGljayAoU0QsIENQVSwgY2lhKQorCisjZGVmaW5lIFBFTkRJTkdfRkxVU0goKSBhYm9ydCAoKSAvKiB0aGluayBhYm91dCB0aGlzIG9uZSAqLworI2RlZmluZSBQRU5ESU5HX0ZQKCkgYWJvcnQgKCkgLyogdGhpbmsgYWJvdXQgdGhpcyBvbmUgKi8KKworLyogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgUEVORElOR19GSUxMKFIsVkFMKSAJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorICBpZiAoKFIpID49IEZHUklEWCAmJiAoUikgPCBGR1JJRFggKyBOUl9GR1IpCQkJCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgUEVORElOR19TQ0hFRChGR1JbKFIpIC0gRkdSSURYXSwgVkFMLCAxLCAtMSk7CQkJXAorICAgICAgUEVORElOR19TQ0hFRChGUFJfU1RBVEVbKFIpIC0gRkdSSURYXSwgZm10X3VuaW50ZXJwcmV0ZWQsIDEsIC0xKTsJXAorICAgIH0JCQkJCQkJCQlcCisgIGVsc2UJCQkJCQkJCQlcCisgICAgUEVORElOR19TQ0hFRChHUFJbKFIpXSwgVkFMLCAxLCAtMSk7CQkJCVwKK30gd2hpbGUgKDApCisKKworCitzdHJ1Y3QgX3NpbV9jcHUgeworCisKKyAgLyogVGhlIGZvbGxvd2luZyBhcmUgaW50ZXJuYWwgc2ltdWxhdG9yIHN0YXRlIHZhcmlhYmxlczogKi8KKyNkZWZpbmUgQ0lBX0dFVChDUFUpICgoQ1BVKS0+cmVnaXN0ZXJzW1BDSURYXSArIDApCisjZGVmaW5lIENJQV9TRVQoQ1BVLENJQSkgKChDUFUpLT5yZWdpc3RlcnNbUENJRFhdID0gKENJQSkpCisgIGFkZHJlc3Nfd29yZCBkc3BjOyAgLyogZGVsYXktc2xvdCBQQyAqLworI2RlZmluZSBEU1BDICgoQ1BVKS0+ZHNwYykKKworI2RlZmluZSBERUxBWV9TTE9UKFRBUkdFVCkgTklBID0gZGVsYXlzbG90MzIgKFNEXywgKFRBUkdFVCkpCisjZGVmaW5lIE5VTExJRllfTkVYVF9JTlNUUlVDVElPTigpIE5JQSA9IG51bGxpZnlfbmV4dF9pbnNuMzIgKFNEXykKKworCisgIC8qIFN0YXRlIG9mIHRoZSBzaW11bGF0b3IgKi8KKyAgdW5zaWduZWQgaW50IHN0YXRlOworICB1bnNpZ25lZCBpbnQgZHNzdGF0ZTsKKyNkZWZpbmUgU1RBVEUgKChDUFUpLT5zdGF0ZSkKKyNkZWZpbmUgRFNTVEFURSAoKENQVSktPmRzc3RhdGUpCisKKy8qIEZsYWdzIGluIHRoZSAic3RhdGUiIHZhcmlhYmxlOiAqLworI2RlZmluZSBzaW1IQUxURVggICAgICAgKDEgPDwgMikgIC8qIDAgPSBydW47IDEgPSBoYWx0IG9uIGV4Y2VwdGlvbiAqLworI2RlZmluZSBzaW1IQUxUSU4gICAgICAgKDEgPDwgMykgIC8qIDAgPSBydW47IDEgPSBoYWx0IG9uIGludGVycnVwdCAqLworI2RlZmluZSBzaW1UUkFDRSAgICAgICAgKDEgPDwgOCkgIC8qIDAgPSBkbyBub3RoaW5nOyAxID0gdHJhY2UgYWRkcmVzcyBhY3Rpdml0eSAqLworI2RlZmluZSBzaW1QQ09DMCAgICAgICAgKDEgPDwgMTcpIC8qIENPQ1sxXSBmcm9tIGN1cnJlbnQgKi8KKyNkZWZpbmUgc2ltUENPQzEgICAgICAgICgxIDw8IDE4KSAvKiBDT0NbMV0gZnJvbSBwcmV2aW91cyAqLworI2RlZmluZSBzaW1ERUxBWVNMT1QgICAgKDEgPDwgMjQpIC8qIDAgPSBkbyBub3RoaW5nOyAxID0gZGVsYXkgc2xvdCBlbnRyeSBleGlzdHMgKi8KKyNkZWZpbmUgc2ltU0tJUE5FWFQgICAgICgxIDw8IDI1KSAvKiAwID0gZG8gbm90aGluZzsgMSA9IHNraXAgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgc2ltU0lHSU5UCSgxIDw8IDI4KSAgLyogMCA9IGRvIG5vdGhpbmc7IDEgPSBTSUdJTlQgaGFzIG9jY3VyZWQgKi8KKyNkZWZpbmUgc2ltSkFMREVMQVlTTE9UCSgxIDw8IDI5KSAvKiAxID0gaW4gamFsIGRlbGF5IHNsb3QgKi8KKworI2RlZmluZSBFTkdJTkVfSVNTVUVfUFJFRklYX0hPT0soKSBcCisgIHsgXAorICAgIC8qIFBlcmZvcm0gYW55IHBlbmRpbmcgd3JpdGVzICovIFwKKyAgICBQRU5ESU5HX1RJQ0soKTsgXAorICAgIC8qIFNldCBwcmV2aW91cyBmbGFnLCBkZXBlbmRpbmcgb24gY3VycmVudDogKi8gXAorICAgIGlmIChTVEFURSAmIHNpbVBDT0MwKSBcCisgICAgIFNUQVRFIHw9IHNpbVBDT0MxOyBcCisgICAgZWxzZSBcCisgICAgIFNUQVRFICY9IH5zaW1QQ09DMTsgXAorICAgIC8qIGFuZCB1cGRhdGUgdGhlIGN1cnJlbnQgdmFsdWU6ICovIFwKKyAgICBpZiAoR0VURkNDKDApKSBcCisgICAgIFNUQVRFIHw9IHNpbVBDT0MwOyBcCisgICAgZWxzZSBcCisgICAgIFNUQVRFICY9IH5zaW1QQ09DMDsgXAorICB9CisKKworLyogVGhpcyBpcyBuYXN0eSwgc2luY2Ugd2UgaGF2ZSB0byByZWx5IG9uIG1hdGNoaW5nIHRoZSByZWdpc3RlcgorICAgbnVtYmVycyB1c2VkIGJ5IEdEQi4gVW5mb3J0dW5hdGVseSwgZGVwZW5kaW5nIG9uIHRoZSBNSVBTIHRhcmdldAorICAgR0RCIHVzZXMgZGlmZmVyZW50IHJlZ2lzdGVyIG51bWJlcnMuIFdlIGNhbm5vdCBqdXN0IGluY2x1ZGUgdGhlCisgICByZWxldmFudCAiZ2RiL3RtLmgiIGxpbmssIHNpbmNlIEdEQiBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgYmVmb3JlCisgICB0aGUgc2ltIHdvcmxkLCBhbmQgYWxzbyB0aGUgR0RCIGhlYWRlciBmaWxlIHJlcXVpcmVzIHRvbyBtdWNoIG90aGVyCisgICBzdGF0ZS4gKi8KKworI2lmbmRlZiBUTV9NSVBTX0gKKyNkZWZpbmUgTEFTVF9FTUJFRF9SRUdOVU0gKDg5KQorI2RlZmluZSBOVU1fUkVHUyAoTEFTVF9FTUJFRF9SRUdOVU0gKyAxKQorCisKKyNlbmRpZgorCisKK2VudW0gZmxvYXRfb3BlcmF0aW9uCisgIHsKKyAgICBGTE9QX0FERCwgICAgRkxPUF9TVUIsICAgIEZMT1BfTVVMLCAgICBGTE9QX01BREQsCisgICAgRkxPUF9NU1VCLCAgIEZMT1BfTUFYPTEwLCBGTE9QX01JTiwgICAgRkxPUF9BQlMsCisgICAgRkxPUF9JVE9GMD0xNCwgRkxPUF9GVE9JMD0xOCwgRkxPUF9ORUc9MjMKKyAgfTsKKworLyogVG8ga2VlcCB0aGlzIGRlZmF1bHQgc2ltdWxhdG9yIHNpbXBsZSwgYW5kIGZhc3QsIHdlIHVzZSBhIGRpcmVjdAorICAgdmVjdG9yIG9mIHJlZ2lzdGVycy4gVGhlIGludGVybmFsIHNpbXVsYXRvciBlbmdpbmUgdGhlbiB1c2VzCisgICBtYW5pZmVzdHMgdG8gYWNjZXNzIHRoZSBjb3JyZWN0IHNsb3QuICovCisKKyAgdW5zaWduZWRfd29yZCByZWdpc3RlcnNbTEFTVF9FTUJFRF9SRUdOVU0gKyAxXTsKKworICBpbnQgcmVnaXN0ZXJfd2lkdGhzW05VTV9SRUdTXTsKKyNkZWZpbmUgUkVHSVNURVJTICAgICAgICgoQ1BVKS0+cmVnaXN0ZXJzKQorCisjZGVmaW5lIEdQUiAgICAgKCZSRUdJU1RFUlNbMF0pCisjZGVmaW5lIEdQUl9TRVQoTixWQUwpIChSRUdJU1RFUlNbKE4pXSA9IChWQUwpKQorCisgIC8qIFdoaWxlIHNwYWNlIGlzIGFsbG9jYXRlZCBmb3IgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBpbiB0aGUKKyAgICAgbWFpbiByZWdpc3RlcnMgYXJyYXksIHRoZXkgYXJlIHN0b3JlZCBzZXBhcmF0bHkuICBUaGlzIGlzIGJlY2F1c2UKKyAgICAgdGhlaXIgc2l6ZSBtYXkgbm90IG5lY2Vzc2FyaWx5IG1hdGNoIHRoZSBzaXplIG9mIGVpdGhlciB0aGUKKyAgICAgZ2VuZXJhbC1wdXJwb3NlIG9yIHN5c3RlbSBzcGVjaWZpYyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlJfRkdSICAoMzIpCisjZGVmaW5lIEZHUklEWCAgKDM4KQorICBmcF93b3JkIGZncltOUl9GR1JdOworI2RlZmluZSBGR1IgICAgICgoQ1BVKS0+ZmdyKQorCisjZGVmaW5lIExPICAgICAgKFJFR0lTVEVSU1szM10pCisjZGVmaW5lIEhJICAgICAgKFJFR0lTVEVSU1szNF0pCisjZGVmaW5lIFBDSURYCTM3CisjZGVmaW5lIFBDICAgICAgKFJFR0lTVEVSU1tQQ0lEWF0pCisjZGVmaW5lIENBVVNFICAgKFJFR0lTVEVSU1szNl0pCisjZGVmaW5lIFNSSURYICAgKDMyKQorI2RlZmluZSBTUiAgICAgIChSRUdJU1RFUlNbU1JJRFhdKSAgICAgIC8qIENQVSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkNSMElEWCAgKDcxKQorI2RlZmluZSBGQ1IwICAgIChSRUdJU1RFUlNbRkNSMElEWF0pICAgIC8qIHJlYWxseSBhIDMyYml0IHJlZ2lzdGVyICovCisjZGVmaW5lIEZDUjMxSURYICg3MCkKKyNkZWZpbmUgRkNSMzEgICAoUkVHSVNURVJTW0ZDUjMxSURYXSkgICAvKiByZWFsbHkgYSAzMmJpdCByZWdpc3RlciAqLworI2RlZmluZSBGQ1NSICAgIChGQ1IzMSkKKyNkZWZpbmUgRGVidWcJKFJFR0lTVEVSU1s4Nl0pCisjZGVmaW5lIERFUEMJKFJFR0lTVEVSU1s4N10pCisjZGVmaW5lIEVQQwkoUkVHSVNURVJTWzg4XSkKKyNkZWZpbmUgQ09DSURYICAoTEFTVF9FTUJFRF9SRUdOVU0gKyAyKSAvKiBzcGVjaWFsIGNhc2UgOiBvdXRzaWRlIHRoZSBub3JtYWwgcmFuZ2UgKi8KKworICAvKiBBbGwgaW50ZXJuYWwgc3RhdGUgbW9kaWZpZWQgYnkgc2lnbmFsX2V4Y2VwdGlvbigpIHRoYXQgbWF5IG5lZWQgdG8gYmUKKyAgICAgcm9sbGVkIGJhY2sgZm9yIHBhc3NpbmcgbW9tZW50LW9mLWV4Y2VwdGlvbiBpbWFnZSBiYWNrIHRvIGdkYi4gKi8KKyAgdW5zaWduZWRfd29yZCBleGNfdHJpZ2dlcl9yZWdpc3RlcnNbTEFTVF9FTUJFRF9SRUdOVU0gKyAxXTsKKyAgdW5zaWduZWRfd29yZCBleGNfc3VzcGVuZF9yZWdpc3RlcnNbTEFTVF9FTUJFRF9SRUdOVU0gKyAxXTsKKyAgaW50IGV4Y19zdXNwZW5kZWQ7CisKKyNkZWZpbmUgU0lNX0NQVV9FWENFUFRJT05fVFJJR0dFUihTRCxDUFUsQ0lBKSBtaXBzX2NwdV9leGNlcHRpb25fdHJpZ2dlcihTRCxDUFUsQ0lBKQorI2RlZmluZSBTSU1fQ1BVX0VYQ0VQVElPTl9TVVNQRU5EKFNELENQVSxFWEMpIG1pcHNfY3B1X2V4Y2VwdGlvbl9zdXNwZW5kKFNELENQVSxFWEMpCisjZGVmaW5lIFNJTV9DUFVfRVhDRVBUSU9OX1JFU1VNRShTRCxDUFUsRVhDKSBtaXBzX2NwdV9leGNlcHRpb25fcmVzdW1lKFNELENQVSxFWEMpCisKKyAgdW5zaWduZWRfd29yZCBjMF9jb25maWdfcmVnOworI2RlZmluZSBDMF9DT05GSUcgKChDUFUpLT5jMF9jb25maWdfcmVnKQorCisvKiBUaGUgZm9sbG93aW5nIGFyZSBwc2V1ZG9ueW1zIGZvciBzdGFuZGFyZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgWkVSTyAgICAoUkVHSVNURVJTWzBdKQorI2RlZmluZSBWMCAgICAgIChSRUdJU1RFUlNbMl0pCisjZGVmaW5lIEEwICAgICAgKFJFR0lTVEVSU1s0XSkKKyNkZWZpbmUgQTEgICAgICAoUkVHSVNURVJTWzVdKQorI2RlZmluZSBBMiAgICAgIChSRUdJU1RFUlNbNl0pCisjZGVmaW5lIEEzICAgICAgKFJFR0lTVEVSU1s3XSkKKyNkZWZpbmUgVDhJRFggICAyNAorI2RlZmluZSBUOAkoUkVHSVNURVJTW1Q4SURYXSkKKyNkZWZpbmUgU1BJRFggICAyOQorI2RlZmluZSBTUCAgICAgIChSRUdJU1RFUlNbU1BJRFhdKQorI2RlZmluZSBSQUlEWCAgIDMxCisjZGVmaW5lIFJBICAgICAgKFJFR0lTVEVSU1tSQUlEWF0pCisKKyAgLyogV2hpbGUgc3BhY2UgaXMgYWxsb2NhdGVkIGluIHRoZSBtYWluIHJlZ2lzdGVycyBhcnJyYXkgZm9yIHNvbWUgb2YKKyAgICAgdGhlIENPUDAgcmVnaXN0ZXJzLCB0aGF0IHNwYWNlIGlzbid0IHN1ZmZpY2llbnQuICBVbmtub3duIENPUDAKKyAgICAgcmVnaXN0ZXJzIG92ZXJmbG93IGludG8gdGhlIGFycmF5IGJlbG93ICovCisKKyNkZWZpbmUgTlJfQ09QMF9HUFIJMzIKKyAgdW5zaWduZWRfd29yZCBjb3AwX2dwcltOUl9DT1AwX0dQUl07CisjZGVmaW5lIENPUDBfR1BSCSgoQ1BVKS0+Y29wMF9ncHIpCisjZGVmaW5lIENPUDBfQkFEVkFERFIgKCh1bnNpZ25lZDMyKShDT1AwX0dQUls4XSkpCisKKyAgLyogS2VlcCB0aGUgY3VycmVudCBmb3JtYXQgc3RhdGUgZm9yIGVhY2ggcmVnaXN0ZXI6ICovCisgIEZQX2Zvcm1hdHMgZnByX3N0YXRlWzMyXTsKKyNkZWZpbmUgRlBSX1NUQVRFICgoQ1BVKS0+ZnByX3N0YXRlKQorCisgIHBlbmRpbmdfd3JpdGVfcXVldWUgcGVuZGluZzsKKworICAvKiBMTEJJVCA9IExvYWQtTGlua2VkIGJpdC4gQSBiaXQgb2YgInZpcnR1YWwiIHN0YXRlIHVzZWQgYnkgYXRvbWljCisgICAgIHJlYWQtd3JpdGUgaW5zdHJ1Y3Rpb25zLiBJdCBpcyBzZXQgd2hlbiBhIGxpbmtlZCBsb2FkIG9jY3Vycy4gSXQKKyAgICAgaXMgdGVzdGVkIGFuZCBjbGVhcmVkIGJ5IHRoZSBjb25kaXRpb25hbCBzdG9yZS4gSXQgaXMgY2xlYXJlZAorICAgICAoZHVyaW5nIG90aGVyIENQVSBvcGVyYXRpb25zKSB3aGVuIGEgc3RvcmUgdG8gdGhlIGxvY2F0aW9uIHdvdWxkCisgICAgIG5vIGxvbmdlciBiZSBhdG9taWMuIEluIHBhcnRpY3VsYXIsIGl0IGlzIGNsZWFyZWQgYnkgZXhjZXB0aW9uCisgICAgIHJldHVybiBpbnN0cnVjdGlvbnMuICovCisgIGludCBsbGJpdDsKKyNkZWZpbmUgTExCSVQgKChDUFUpLT5sbGJpdCkKKworCisvKiBUaGUgSElISVNUT1JZIGFuZCBMT0hJU1RPUlkgdGltZXN0YW1wcyBhcmUgdXNlZCB0byBlbnN1cmUgdGhhdAorICAgY29ycnVwdGlvbnMgY2F1c2VkIGJ5IHVzaW5nIHRoZSBISSBvciBMTyByZWdpc3RlciB0b28gY2xvc2UgdG8gYQorICAgZm9sbG93aW5nIG9wZXJhdGlvbiBpcyBzcG90dGVkLiBTZWUgbWlwcy5pZ2VuIGZvciBtb3JlIGRldGFpbHMuICovCisKKyAgaGlsb19oaXN0b3J5IGhpX2hpc3Rvcnk7CisjZGVmaW5lIEhJSElTVE9SWSAoJihDUFUpLT5oaV9oaXN0b3J5KQorICBoaWxvX2hpc3RvcnkgbG9faGlzdG9yeTsKKyNkZWZpbmUgTE9ISVNUT1JZICgmKENQVSktPmxvX2hpc3RvcnkpCisKKyNkZWZpbmUgY2hlY2tfYnJhbmNoX2J1ZygpIAorI2RlZmluZSBtYXJrX2JyYW5jaF9idWcoVEFSR0VUKSAKKworCisKKyAgc2ltX2NwdV9iYXNlIGJhc2U7Cit9OworCisKKy8qIE1JUFMgc3BlY2lmaWMgc2ltdWxhdG9yIHdhdGNoIGNvbmZpZyAqLworCit2b2lkIHdhdGNoX29wdGlvbnNfaW5zdGFsbCBQQVJBTVMgKChTSU1fREVTQyBzZCkpOworCitzdHJ1Y3Qgc3dhdGNoIHsKKyAgc2ltX2V2ZW50ICpwYzsKKyAgc2ltX2V2ZW50ICpjbG9jazsKKyAgc2ltX2V2ZW50ICpjeWNsZXM7Cit9OworCisKKy8qIEZJWE1FOiBBdCBwcmVzZW50IG11Y2ggb2YgdGhlIHNpbXVsYXRvciBpcyBzdGlsbCBzdGF0aWMgKi8KK3N0cnVjdCBzaW1fc3RhdGUgeworCisgIHN0cnVjdCBzd2F0Y2ggd2F0Y2g7CisKKyAgc2ltX2NwdSBjcHVbTUFYX05SX1BST0NFU1NPUlNdOworI2lmIChXSVRIX1NNUCkKKyNkZWZpbmUgU1RBVEVfQ1BVKHNkLG4pICgmKHNkKS0+Y3B1W25dKQorI2Vsc2UKKyNkZWZpbmUgU1RBVEVfQ1BVKHNkLG4pICgmKHNkKS0+Y3B1WzBdKQorI2VuZGlmCisKKworICBzaW1fc3RhdGVfYmFzZSBiYXNlOworfTsKKworCisKKy8qIFN0YXR1cyBpbmZvcm1hdGlvbjogKi8KKworLyogVE9ETyA6IHRoZXNlIHNob3VsZCBiZSB0aGUgYml0bWFza3MgZm9yIHRoZXNlIGJpdHMgd2l0aGluIHRoZQorICAgc3RhdHVzIHJlZ2lzdGVyLiBBdCB0aGUgbW9tZW50IHRoZSBmb2xsb3dpbmcgYXJlIFZSNDMwMAorICAgYml0LXBvc2l0aW9uczogKi8KKyNkZWZpbmUgc3RhdHVzX0tTVV9tYXNrICAoMHgxOCkgICAgICAgICAvKiBtYXNrIGZvciBLU1UgYml0cyAqLworI2RlZmluZSBzdGF0dXNfS1NVX3NoaWZ0ICgzKSAgICAgICAgICAgIC8qIHNoaWZ0IGZvciBmaWVsZCAqLworI2RlZmluZSBrc3Vfa2VybmVsICAgICAgICgweDApCisjZGVmaW5lIGtzdV9zdXBlcnZpc29yICAgKDB4MSkKKyNkZWZpbmUga3N1X3VzZXIgICAgICAgICAoMHgyKQorI2RlZmluZSBrc3VfdW5rbm93biAgICAgICgweDMpCisKKyNkZWZpbmUgU1JfS1NVCQkgKChTUiAmIHN0YXR1c19LU1VfbWFzaykgPj4gc3RhdHVzX0tTVV9zaGlmdCkKKworI2RlZmluZSBzdGF0dXNfSUUJICgxIDw8ICAwKSAgICAgIC8qIEludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgc3RhdHVzX0VJRQkgKDEgPDwgMTYpICAgICAgLyogRW5hYmxlIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgc3RhdHVzX0VYTAkgKDEgPDwgIDEpCS8qIEV4Y2VwdGlvbiBsZXZlbCAqLworI2RlZmluZSBzdGF0dXNfUkUgICAgICAgICgxIDw8IDI1KSAgICAgIC8qIFJldmVyc2UgRW5kaWFuIGluIHVzZXIgbW9kZSAqLworI2RlZmluZSBzdGF0dXNfRlIgICAgICAgICgxIDw8IDI2KSAgICAgIC8qIGVuYWJsZXMgTUlQUyBJSUkgYWRkaXRpb25hbCBGUCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgc3RhdHVzX1NSICAgICAgICAoMSA8PCAyMCkgICAgICAvKiBzb2Z0IHJlc2V0IG9yIE5NSSAqLworI2RlZmluZSBzdGF0dXNfQkVWICAgICAgICgxIDw8IDIyKSAgICAgIC8qIExvY2F0aW9uIG9mIGdlbmVyYWwgZXhjZXB0aW9uIHZlY3RvcnMgKi8KKyNkZWZpbmUgc3RhdHVzX1RTICAgICAgICAoMSA8PCAyMSkgICAgICAvKiBUTEIgc2h1dGRvd24gaGFzIG9jY3VycmVkICovCisjZGVmaW5lIHN0YXR1c19FUkwgICAgICAgKDEgPDwgIDIpICAgICAgLyogRXJyb3IgbGV2ZWwgKi8KKyNkZWZpbmUgc3RhdHVzX0lNNyAgICAgICAoMSA8PCAxNSkgICAgICAvKiBUaW1lciBJbnRlcnJ1cHQgTWFzayAqLworI2RlZmluZSBzdGF0dXNfUlAgICAgICAgICgxIDw8IDI3KSAgICAgIC8qIFJlZHVjZWQgUG93ZXIgbW9kZSAqLworCisvKiBTcGVjaWFsaXphdGlvbnMgZm9yIFRYMzkgZmFtaWx5ICovCisjZGVmaW5lIHN0YXR1c19JRWMgICAgICAgKDEgPDwgMCkgICAgICAgLyogSW50ZXJydXB0IGVuYWJsZSAoY3VycmVudCkgKi8KKyNkZWZpbmUgc3RhdHVzX0tVYyAgICAgICAoMSA8PCAxKSAgICAgICAvKiBLZXJuZWwvVXNlciBtb2RlICovCisjZGVmaW5lIHN0YXR1c19JRXAgICAgICAgKDEgPDwgMikgICAgICAgLyogSW50ZXJydXB0IGVuYWJsZSAocHJldmlvdXMpICovCisjZGVmaW5lIHN0YXR1c19LVXAgICAgICAgKDEgPDwgMykgICAgICAgLyogS2VybmVsL1VzZXIgbW9kZSAqLworI2RlZmluZSBzdGF0dXNfSUVvICAgICAgICgxIDw8IDQpICAgICAgIC8qIEludGVycnVwdCBlbmFibGUgKG9sZCkgKi8KKyNkZWZpbmUgc3RhdHVzX0tVbyAgICAgICAoMSA8PCA1KSAgICAgICAvKiBLZXJuZWwvVXNlciBtb2RlICovCisjZGVmaW5lIHN0YXR1c19JTV9tYXNrICAgKDB4ZmYpICAgICAgICAgLyogSW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgc3RhdHVzX0lNX3NoaWZ0ICAoOCkKKyNkZWZpbmUgc3RhdHVzX05NSSAgICAgICAoMSA8PCAyMCkgICAgICAvKiBOTUkgKi8KKyNkZWZpbmUgc3RhdHVzX05NSSAgICAgICAoMSA8PCAyMCkgICAgICAvKiBOTUkgKi8KKworI2RlZmluZSBjYXVzZV9CRCAoKHVuc2lnbmVkKTEgPDwgMzEpICAgIC8qIEwxIEV4Y2VwdGlvbiBpbiBicmFuY2ggZGVsYXkgc2xvdCAqLworI2RlZmluZSBjYXVzZV9CRDIgICAgICAgICAoMSA8PCAzMCkgICAgIC8qIEwyIEV4Y2VwdGlvbiBpbiBicmFuY2ggZGVsYXkgc2xvdCAqLworI2RlZmluZSBjYXVzZV9DRV9tYXNrICAgICAweDMwMDAwMDAwCS8qIENvcHJvY2Vzc29yIGV4Y2VwdGlvbiAqLworI2RlZmluZSBjYXVzZV9DRV9zaGlmdCAgICAyOAorI2RlZmluZSBjYXVzZV9FWEMyX21hc2sgICAweDAwMDcwMDAwCisjZGVmaW5lIGNhdXNlX0VYQzJfc2hpZnQgIDE2CisjZGVmaW5lIGNhdXNlX0lQNyAJICAoMSA8PCAxNSkJLyogSW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUgY2F1c2VfU0lPUCAgICAgICAgKDEgPDwgMTIpICAgICAvKiBTSU8gcGVuZGluZyAqLworI2RlZmluZSBjYXVzZV9JUDMgCSAgKDEgPDwgMTEpCS8qIEludCAwIHBlbmRpbmcgKi8KKyNkZWZpbmUgY2F1c2VfSVAyIAkgICgxIDw8IDEwKQkvKiBJbnQgMSBwZW5kaW5nICovCisKKyNkZWZpbmUgY2F1c2VfRVhDX21hc2sgICgweDFjKSAgICAgICAgICAvKiBFeGNlcHRpb24gY29kZSAqLworI2RlZmluZSBjYXVzZV9FWENfc2hpZnQgKDIpCisKKyNkZWZpbmUgY2F1c2VfU1cwICAgICAgICgxIDw8IDgpICAgICAgICAvKiBTb2Z0d2FyZSBpbnRlcnJ1cHQgMCAqLworI2RlZmluZSBjYXVzZV9TVzEgICAgICAgKDEgPDwgOSkgICAgICAgIC8qIFNvZnR3YXJlIGludGVycnVwdCAxICovCisjZGVmaW5lIGNhdXNlX0lQX21hc2sgICAoMHgzZikgICAgICAgICAgLyogSW50ZXJydXB0IHBlbmRpbmcgZmllbGQgKi8KKyNkZWZpbmUgY2F1c2VfSVBfc2hpZnQgICgxMCkKKworI2RlZmluZSBjYXVzZV9zZXRfRVhDKHgpICBDQVVTRSA9IChDQVVTRSAmIH5jYXVzZV9FWENfbWFzaykgIHwgKCh4IDw8IGNhdXNlX0VYQ19zaGlmdCkgICYgY2F1c2VfRVhDX21hc2spCisjZGVmaW5lIGNhdXNlX3NldF9FWEMyKHgpIENBVVNFID0gKENBVVNFICYgfmNhdXNlX0VYQzJfbWFzaykgfCAoKHggPDwgY2F1c2VfRVhDMl9zaGlmdCkgJiBjYXVzZV9FWEMyX21hc2spCisKKworLyogTk9URTogV2Uga2VlcCB0aGUgZm9sbG93aW5nIHN0YXR1cyBmbGFncyBhcyBiaXQgdmFsdWVzICgxIGZvciB0cnVlLAorICAgMCBmb3IgZmFsc2UpLiBUaGlzIGFsbG93cyB0aGVtIHRvIGJlIHVzZWQgaW4gYmluYXJ5IGJvb2xlYW4KKyAgIG9wZXJhdGlvbnMgd2l0aG91dCB3b3JyeWluZyBhYm91dCB3aGF0IGV4YWN0bHkgdGhlIG5vbi16ZXJvIHRydWUKKyAgIHZhbHVlIGlzLiAqLworCisvKiBVc2VyTW9kZSAqLworI2lmZGVmIFNVQlRBUkdFVF9SMzkwMAorI2RlZmluZSBVc2VyTW9kZSAgICAgICAgKChTUiAmIHN0YXR1c19LVWMpID8gMSA6IDApCisjZWxzZQorI2RlZmluZSBVc2VyTW9kZQkoKCgoU1IgJiBzdGF0dXNfS1NVX21hc2spID4+IHN0YXR1c19LU1Vfc2hpZnQpID09IGtzdV91c2VyKSA/IDEgOiAwKQorI2VuZGlmIC8qIFNVQlRBUkdFVF9SMzkwMCAqLworCisvKiBCaWdFbmRpYW5NZW0gKi8KKy8qIEhhcmR3YXJlIGNvbmZpZ3VyYXRpb24uIEFmZmVjdHMgZW5kaWFubmVzcyBvZiBMb2FkTWVtb3J5IGFuZAorICAgU3RvcmVNZW1vcnkgYW5kIHRoZSBlbmRpYW5uZXNzIG9mIEtlcm5lbCBhbmQgU3VwZXJ2aXNvciBtb2RlCisgICBleGVjdXRpb24uIFRoZSB2YWx1ZSBpcyAwIGZvciBsaXR0bGUtZW5kaWFuOyAxIGZvciBiaWctZW5kaWFuLiAqLworI2RlZmluZSBCaWdFbmRpYW5NZW0gICAgKENVUlJFTlRfVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikKKy8qKHN0YXRlICYgc2ltQkUpID8gMSA6IDApKi8KKworLyogUmV2ZXJzZUVuZGlhbiAqLworLyogVGhpcyBtb2RlIGlzIHNlbGVjdGVkIGlmIGluIFVzZXIgbW9kZSB3aXRoIHRoZSBSRSBiaXQgYmVpbmcgc2V0IGluCisgICBTUiAoU3RhdHVzIFJlZ2lzdGVyKS4gSXQgcmV2ZXJzZXMgdGhlIGVuZGlhbm5lc3Mgb2YgbG9hZCBhbmQgc3RvcmUKKyAgIGluc3RydWN0aW9ucy4gKi8KKyNkZWZpbmUgUmV2ZXJzZUVuZGlhbiAgICgoKFNSICYgc3RhdHVzX1JFKSAmJiBVc2VyTW9kZSkgPyAxIDogMCkKKworLyogQmlnRW5kaWFuQ1BVICovCisvKiBUaGUgZW5kaWFubmVzcyBmb3IgbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zICgwPWxpdHRsZTsxPWJpZykuIEluCisgICBVc2VyIG1vZGUgdGhpcyBlbmRpYW5uZXNzIG1heSBiZSBzd2l0Y2hlZCBieSBzZXR0aW5nIHRoZSBzdGF0ZV9SRQorICAgYml0IGluIHRoZSBTUiByZWdpc3Rlci4gVGh1cywgQmlnRW5kaWFuQ1BVIG1heSBiZSBjb21wdXRlZCBhcworICAgKEJpZ0VuZGlhbk1lbSBFT1IgUmV2ZXJzZUVuZGlhbikuICovCisjZGVmaW5lIEJpZ0VuZGlhbkNQVSAgICAoQmlnRW5kaWFuTWVtIF4gUmV2ZXJzZUVuZGlhbikgLyogQWxyZWFkeSBiaXRzICovCisKKworCisvKiBFeGNlcHRpb25zOiAqLworCisvKiBOT1RFOiBUaGVzZSBudW1iZXJzIGRlcGVuZCBvbiB0aGUgcHJvY2Vzc29yIGFyY2hpdGVjdHVyZSBiZWluZworICAgc2ltdWxhdGVkOiAqLworZW51bSBFeGNlcHRpb25DYXVzZSB7CisgIEludGVycnVwdCAgICAgICAgICAgICAgID0gMCwKKyAgVExCTW9kaWZpY2F0aW9uICAgICAgICAgPSAxLAorICBUTEJMb2FkICAgICAgICAgICAgICAgICA9IDIsCisgIFRMQlN0b3JlICAgICAgICAgICAgICAgID0gMywKKyAgQWRkcmVzc0xvYWQgICAgICAgICAgICAgPSA0LAorICBBZGRyZXNzU3RvcmUgICAgICAgICAgICA9IDUsCisgIEluc3RydWN0aW9uRmV0Y2ggICAgICAgID0gNiwKKyAgRGF0YVJlZmVyZW5jZSAgICAgICAgICAgPSA3LAorICBTeXN0ZW1DYWxsICAgICAgICAgICAgICA9IDgsCisgIEJyZWFrUG9pbnQgICAgICAgICAgICAgID0gOSwKKyAgUmVzZXJ2ZWRJbnN0cnVjdGlvbiAgICAgPSAxMCwKKyAgQ29Qcm9jZXNzb3JVbnVzYWJsZSAgICAgPSAxMSwKKyAgSW50ZWdlck92ZXJmbG93ICAgICAgICAgPSAxMiwgICAgLyogQXJpdGhtZXRpYyBvdmVyZmxvdyAoSURUIG1vbml0b3IgcmFpc2VzIFNJR0ZQRSkgKi8KKyAgVHJhcCAgICAgICAgICAgICAgICAgICAgPSAxMywKKyAgRlBFICAgICAgICAgICAgICAgICAgICAgPSAxNSwKKyAgRGVidWdCcmVha1BvaW50ICAgICAgICAgPSAxNiwKKyAgV2F0Y2ggICAgICAgICAgICAgICAgICAgPSAyMywKKyAgTk1JUmVzZXQgICAgICAgICAgICAgICAgPSAzMSwKKworCisvKiBUaGUgZm9sbG93aW5nIGV4Y2VwdGlvbiBjb2RlIGlzIGFjdHVhbGx5IHByaXZhdGUgdG8gdGhlIHNpbXVsYXRvcgorICAgd29ybGQuIEl0IGlzICpOT1QqIGEgcHJvY2Vzc29yIGZlYXR1cmUsIGFuZCBpcyB1c2VkIHRvIHNpZ25hbAorICAgcnVuLXRpbWUgZXJyb3JzIGluIHRoZSBzaW11bGF0b3IuICovCisgIFNpbXVsYXRvckZhdWx0ICAgICAgCSAgPSAweEZGRkZGRkZGCit9OworCisjZGVmaW5lIFRMQl9SRUZJTEwgICgwKQorI2RlZmluZSBUTEJfSU5WQUxJRCAoMSkKKworCisvKiBUaGUgZm9sbG93aW5nIGJyZWFrIGluc3RydWN0aW9ucyBhcmUgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUKKyAgIHNpbXVsYXRvci4gIFRoZSBmaXJzdCBpcyB1c2VkIHRvIGhhbHQgdGhlIHNpbXVsYXRpb24uICBUaGUgc2Vjb25kCisgICBpcyB1c2VkIGJ5IGdkYiBmb3IgYnJlYWstcG9pbnRzLiAgTk9URTogQ2FyZSBtdXN0IGJlIHRha2VuLCBzaW5jZSAKKyAgIHRoaXMgdmFsdWUgbWF5IGJlIHVzZWQgaW4gbGF0ZXIgcmV2aXNpb25zIG9mIHRoZSBNSVBTIElTQS4gKi8KKyNkZWZpbmUgSEFMVF9JTlNUUlVDVElPTl9NQVNLICAgKDB4MDNGRkZGQzApCisKKyNkZWZpbmUgSEFMVF9JTlNUUlVDVElPTiAgICAgICAgKDB4MDNmZjAwMGQpCisjZGVmaW5lIEhBTFRfSU5TVFJVQ1RJT04yICAgICAgICgweDAwMDBmZmNkKQorCisKKyNkZWZpbmUgQlJFQUtQT0lOVF9JTlNUUlVDVElPTiAgKDB4MDAwNTAwMGQpCisjZGVmaW5lIEJSRUFLUE9JTlRfSU5TVFJVQ1RJT04yICgweDAwMDAwMTRkKQorCisKKwordm9pZCBpbnRlcnJ1cHRfZXZlbnQgKFNJTV9ERVNDIHNkLCB2b2lkICpkYXRhKTsKKwordm9pZCBzaWduYWxfZXhjZXB0aW9uIChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBhZGRyZXNzX3dvcmQgY2lhLCBpbnQgZXhjZXB0aW9uLCAuLi4pOworI2RlZmluZSBTaWduYWxFeGNlcHRpb24oZXhjLGluc3RydWN0aW9uKSAgICAgc2lnbmFsX2V4Y2VwdGlvbiAoU0QsIENQVSwgY2lhLCAoZXhjKSwgKGluc3RydWN0aW9uKSkKKyNkZWZpbmUgU2lnbmFsRXhjZXB0aW9uSW50ZXJydXB0KGxldmVsKSAgICAgIHNpZ25hbF9leGNlcHRpb24gKFNELCBDUFUsIGNpYSwgSW50ZXJydXB0LCBsZXZlbCkKKyNkZWZpbmUgU2lnbmFsRXhjZXB0aW9uSW5zdHJ1Y3Rpb25GZXRjaCgpICAgIHNpZ25hbF9leGNlcHRpb24gKFNELCBDUFUsIGNpYSwgSW5zdHJ1Y3Rpb25GZXRjaCkKKyNkZWZpbmUgU2lnbmFsRXhjZXB0aW9uQWRkcmVzc1N0b3JlKCkgICAgICAgIHNpZ25hbF9leGNlcHRpb24gKFNELCBDUFUsIGNpYSwgQWRkcmVzc1N0b3JlKQorI2RlZmluZSBTaWduYWxFeGNlcHRpb25BZGRyZXNzTG9hZCgpICAgICAgICAgc2lnbmFsX2V4Y2VwdGlvbiAoU0QsIENQVSwgY2lhLCBBZGRyZXNzTG9hZCkKKyNkZWZpbmUgU2lnbmFsRXhjZXB0aW9uRGF0YVJlZmVyZW5jZSgpICAgICAgIHNpZ25hbF9leGNlcHRpb24gKFNELCBDUFUsIGNpYSwgRGF0YVJlZmVyZW5jZSkKKyNkZWZpbmUgU2lnbmFsRXhjZXB0aW9uU2ltdWxhdG9yRmF1bHQoYnVmKSAgIHNpZ25hbF9leGNlcHRpb24gKFNELCBDUFUsIGNpYSwgU2ltdWxhdG9yRmF1bHQsIGJ1ZikKKyNkZWZpbmUgU2lnbmFsRXhjZXB0aW9uRlBFKCkgICAgICAgICAgICAgICAgIHNpZ25hbF9leGNlcHRpb24gKFNELCBDUFUsIGNpYSwgRlBFKQorI2RlZmluZSBTaWduYWxFeGNlcHRpb25JbnRlZ2VyT3ZlcmZsb3coKSAgICAgc2lnbmFsX2V4Y2VwdGlvbiAoU0QsIENQVSwgY2lhLCBJbnRlZ2VyT3ZlcmZsb3cpCisjZGVmaW5lIFNpZ25hbEV4Y2VwdGlvbkNvUHJvY2Vzc29yVW51c2FibGUoKSBzaWduYWxfZXhjZXB0aW9uIChTRCwgQ1BVLCBjaWEsIENvUHJvY2Vzc29yVW51c2FibGUpCisjZGVmaW5lIFNpZ25hbEV4Y2VwdGlvbk5NSVJlc2V0KCkgICAgICAgICAgICBzaWduYWxfZXhjZXB0aW9uIChTRCwgQ1BVLCBjaWEsIE5NSVJlc2V0KQorI2RlZmluZSBTaWduYWxFeGNlcHRpb25UTEJSZWZpbGxTdG9yZSgpICAgICAgc2lnbmFsX2V4Y2VwdGlvbiAoU0QsIENQVSwgY2lhLCBUTEJTdG9yZSwgVExCX1JFRklMTCkKKyNkZWZpbmUgU2lnbmFsRXhjZXB0aW9uVExCUmVmaWxsTG9hZCgpICAgICAgIHNpZ25hbF9leGNlcHRpb24gKFNELCBDUFUsIGNpYSwgVExCTG9hZCwgVExCX1JFRklMTCkKKyNkZWZpbmUgU2lnbmFsRXhjZXB0aW9uVExCSW52YWxpZFN0b3JlKCkgICAgIHNpZ25hbF9leGNlcHRpb24gKFNELCBDUFUsIGNpYSwgVExCU3RvcmUsIFRMQl9JTlZBTElEKQorI2RlZmluZSBTaWduYWxFeGNlcHRpb25UTEJJbnZhbGlkTG9hZCgpICAgICAgc2lnbmFsX2V4Y2VwdGlvbiAoU0QsIENQVSwgY2lhLCBUTEJMb2FkLCBUTEJfSU5WQUxJRCkKKyNkZWZpbmUgU2lnbmFsRXhjZXB0aW9uVExCTW9kaWZpY2F0aW9uKCkgICAgIHNpZ25hbF9leGNlcHRpb24gKFNELCBDUFUsIGNpYSwgVExCTW9kaWZpY2F0aW9uKQorCisvKiBDby1wcm9jZXNzb3IgYWNjZXNzZXMgKi8KKwordm9pZCBjb3BfbHcgIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGFkZHJlc3Nfd29yZCBjaWEsIGludCBjb3Byb2NfbnVtLCBpbnQgY29wcm9jX3JlZywgdW5zaWduZWQgaW50IG1lbXdvcmQpKTsKK3ZvaWQgY29wX2xkICBQQVJBTVMgKChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBhZGRyZXNzX3dvcmQgY2lhLCBpbnQgY29wcm9jX251bSwgaW50IGNvcHJvY19yZWcsIHV3b3JkNjQgbWVtd29yZCkpOwordW5zaWduZWQgaW50IGNvcF9zdyBQQVJBTVMgKChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBhZGRyZXNzX3dvcmQgY2lhLCBpbnQgY29wcm9jX251bSwgaW50IGNvcHJvY19yZWcpKTsKK3V3b3JkNjQgY29wX3NkIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGFkZHJlc3Nfd29yZCBjaWEsIGludCBjb3Byb2NfbnVtLCBpbnQgY29wcm9jX3JlZykpOworCisjZGVmaW5lIENPUF9MVyhjb3Byb2NfbnVtLGNvcHJvY19yZWcsbWVtd29yZCkgXAorY29wX2x3IChTRCwgQ1BVLCBjaWEsIGNvcHJvY19udW0sIGNvcHJvY19yZWcsIG1lbXdvcmQpCisjZGVmaW5lIENPUF9MRChjb3Byb2NfbnVtLGNvcHJvY19yZWcsbWVtd29yZCkgXAorY29wX2xkIChTRCwgQ1BVLCBjaWEsIGNvcHJvY19udW0sIGNvcHJvY19yZWcsIG1lbXdvcmQpCisjZGVmaW5lIENPUF9TVyhjb3Byb2NfbnVtLGNvcHJvY19yZWcpIFwKK2NvcF9zdyAoU0QsIENQVSwgY2lhLCBjb3Byb2NfbnVtLCBjb3Byb2NfcmVnKQorI2RlZmluZSBDT1BfU0QoY29wcm9jX251bSxjb3Byb2NfcmVnKSBcCitjb3Bfc2QgKFNELCBDUFUsIGNpYSwgY29wcm9jX251bSwgY29wcm9jX3JlZykKKworCit2b2lkIGRlY29kZV9jb3Byb2MgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgYWRkcmVzc193b3JkIGNpYSwgdW5zaWduZWQgaW50IGluc3RydWN0aW9uKSk7CisjZGVmaW5lIERlY29kZUNvcHJvYyhpbnN0cnVjdGlvbikgXAorZGVjb2RlX2NvcHJvYyAoU0QsIENQVSwgY2lhLCAoaW5zdHJ1Y3Rpb24pKQorCit2b2lkIHNpbV9tb25pdG9yIChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBhZGRyZXNzX3dvcmQgY2lhLCB1bnNpZ25lZCBpbnQgYXJnKTsKKyAgCisKKworLyogTWVtb3J5IGFjY2Vzc2VzICovCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIGdlbmVyaWMgdG8gYWxsIHZlcnNpb25zIG9mIHRoZSBNSVBTIGFyY2hpdGVjdHVyZQorICAgdG8gZGF0ZTogKi8KKworLyogTWVtb3J5IEFjY2VzcyBUeXBlcyAoZm9yIENDQSk6ICovCisjZGVmaW5lIFVuY2FjaGVkICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBDYWNoZWROb25jb2hlcmVudCAgICAgICAoMSkKKyNkZWZpbmUgQ2FjaGVkQ29oZXJlbnQgICAgICAgICAgKDIpCisjZGVmaW5lIENhY2hlZCAgICAgICAgICAgICAgICAgICgzKQorCisjZGVmaW5lIGlzSU5TVFJVQ1RJT04gICAoMSA9PSAwKSAvKiBGQUxTRSAqLworI2RlZmluZSBpc0RBVEEgICAgICAgICAgKDEgPT0gMSkgLyogVFJVRSAqLworI2RlZmluZSBpc0xPQUQgICAgICAgICAgKDEgPT0gMCkgLyogRkFMU0UgKi8KKyNkZWZpbmUgaXNTVE9SRSAgICAgICAgICgxID09IDEpIC8qIFRSVUUgKi8KKyNkZWZpbmUgaXNSRUFMICAgICAgICAgICgxID09IDApIC8qIEZBTFNFICovCisjZGVmaW5lIGlzUkFXICAgICAgICAgICAoMSA9PSAxKSAvKiBUUlVFICovCisvKiBUaGUgcGFyYW1ldGVyIEhPU1QgKGlzVEFSR0VUIC8gaXNIT1NUKSBpcyBpZ25vcmVkICovCisjZGVmaW5lIGlzVEFSR0VUICAgICAgICAoMSA9PSAwKSAvKiBGQUxTRSAqLworLyogI2RlZmluZSBpc0hPU1QgICAgICAgICAgKDEgPT0gMSkgVFJVRSAqLworCisvKiBUaGUgIkFjY2Vzc0xlbmd0aCIgc3BlY2lmaWNhdGlvbnMgZm9yIExvYWRzIGFuZCBTdG9yZXMuIE5PVEU6IFRoaXMKKyAgIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgbWludXMgMS4gKi8KKyNkZWZpbmUgQWNjZXNzTGVuZ3RoX0JZVEUgICAgICAgKDApCisjZGVmaW5lIEFjY2Vzc0xlbmd0aF9IQUxGV09SRCAgICgxKQorI2RlZmluZSBBY2Nlc3NMZW5ndGhfVFJJUExFQllURSAoMikKKyNkZWZpbmUgQWNjZXNzTGVuZ3RoX1dPUkQgICAgICAgKDMpCisjZGVmaW5lIEFjY2Vzc0xlbmd0aF9RVUlOVElCWVRFICg0KQorI2RlZmluZSBBY2Nlc3NMZW5ndGhfU0VYVElCWVRFICAoNSkKKyNkZWZpbmUgQWNjZXNzTGVuZ3RoX1NFUFRJQllURSAgKDYpCisjZGVmaW5lIEFjY2Vzc0xlbmd0aF9ET1VCTEVXT1JEICg3KQorI2RlZmluZSBBY2Nlc3NMZW5ndGhfUVVBRFdPUkQgICAoMTUpCisKKyNkZWZpbmUgTE9BRERSTUFTSyAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0IFwKKwkJICAgID8gQWNjZXNzTGVuZ3RoX0RPVUJMRVdPUkQgLyo3Ki8gXAorCQkgICAgOiBBY2Nlc3NMZW5ndGhfV09SRCAvKjMqLykKKyNkZWZpbmUgUFNJWkUgKFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRSkKKworCitJTkxJTkVfU0lNX01BSU4gKGludCkgYWRkcmVzc190cmFuc2xhdGlvbiBQQVJBTVMgKChTSU1fREVTQyBzZCwgc2ltX2NwdSAqLCBhZGRyZXNzX3dvcmQgY2lhLCBhZGRyZXNzX3dvcmQgdkFkZHIsIGludCBJb3JELCBpbnQgTG9yUywgYWRkcmVzc193b3JkICpwQWRkciwgaW50ICpDQ0EsIGludCByYXcpKTsKKyNkZWZpbmUgQWRkcmVzc1RyYW5zbGF0aW9uKHZBZGRyLElvckQsTG9yUyxwQWRkcixDQ0EsaG9zdCxyYXcpIFwKK2FkZHJlc3NfdHJhbnNsYXRpb24gKFNELCBDUFUsIGNpYSwgdkFkZHIsIElvckQsIExvclMsIHBBZGRyLCBDQ0EsIHJhdykKKworSU5MSU5FX1NJTV9NQUlOICh2b2lkKSBsb2FkX21lbW9yeSBQQVJBTVMgKChTSU1fREVTQyBzZCwgc2ltX2NwdSAqY3B1LCBhZGRyZXNzX3dvcmQgY2lhLCB1d29yZDY0KiBtZW12YWxwLCB1d29yZDY0KiBtZW12YWwxcCwgaW50IENDQSwgdW5zaWduZWQgaW50IEFjY2Vzc0xlbmd0aCwgYWRkcmVzc193b3JkIHBBZGRyLCBhZGRyZXNzX3dvcmQgdkFkZHIsIGludCBJb3JEKSk7CisjZGVmaW5lIExvYWRNZW1vcnkobWVtdmFscCxtZW12YWwxcCxDQ0EsQWNjZXNzTGVuZ3RoLHBBZGRyLHZBZGRyLElvckQscmF3KSBcCitsb2FkX21lbW9yeSAoU0QsIENQVSwgY2lhLCBtZW12YWxwLCBtZW12YWwxcCwgQ0NBLCBBY2Nlc3NMZW5ndGgsIHBBZGRyLCB2QWRkciwgSW9yRCkKKworSU5MSU5FX1NJTV9NQUlOICh2b2lkKSBzdG9yZV9tZW1vcnkgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgYWRkcmVzc193b3JkIGNpYSwgaW50IENDQSwgdW5zaWduZWQgaW50IEFjY2Vzc0xlbmd0aCwgdXdvcmQ2NCBNZW1FbGVtLCB1d29yZDY0IE1lbUVsZW0xLCBhZGRyZXNzX3dvcmQgcEFkZHIsIGFkZHJlc3Nfd29yZCB2QWRkcikpOworI2RlZmluZSBTdG9yZU1lbW9yeShDQ0EsQWNjZXNzTGVuZ3RoLE1lbUVsZW0sTWVtRWxlbTEscEFkZHIsdkFkZHIscmF3KSBcCitzdG9yZV9tZW1vcnkgKFNELCBDUFUsIGNpYSwgQ0NBLCBBY2Nlc3NMZW5ndGgsIE1lbUVsZW0sIE1lbUVsZW0xLCBwQWRkciwgdkFkZHIpCisKK0lOTElORV9TSU1fTUFJTiAodm9pZCkgY2FjaGVfb3AgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgYWRkcmVzc193b3JkIGNpYSwgaW50IG9wLCBhZGRyZXNzX3dvcmQgcEFkZHIsIGFkZHJlc3Nfd29yZCB2QWRkciwgdW5zaWduZWQgaW50IGluc3RydWN0aW9uKSk7CisjZGVmaW5lIENhY2hlT3Aob3AscEFkZHIsdkFkZHIsaW5zdHJ1Y3Rpb24pIFwKK2NhY2hlX29wIChTRCwgQ1BVLCBjaWEsIG9wLCBwQWRkciwgdkFkZHIsIGluc3RydWN0aW9uKQorCitJTkxJTkVfU0lNX01BSU4gKHZvaWQpIHN5bmNfb3BlcmF0aW9uIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGFkZHJlc3Nfd29yZCBjaWEsIGludCBzdHlwZSkpOworI2RlZmluZSBTeW5jT3BlcmF0aW9uKHN0eXBlKSBcCitzeW5jX29wZXJhdGlvbiAoU0QsIENQVSwgY2lhLCAoc3R5cGUpKQorCitJTkxJTkVfU0lNX01BSU4gKHZvaWQpIHByZWZldGNoIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGFkZHJlc3Nfd29yZCBjaWEsIGludCBDQ0EsIGFkZHJlc3Nfd29yZCBwQWRkciwgYWRkcmVzc193b3JkIHZBZGRyLCBpbnQgREFUQSwgaW50IGhpbnQpKTsKKyNkZWZpbmUgUHJlZmV0Y2goQ0NBLHBBZGRyLHZBZGRyLERBVEEsaGludCkgXAorcHJlZmV0Y2ggKFNELCBDUFUsIGNpYSwgQ0NBLCBwQWRkciwgdkFkZHIsIERBVEEsIGhpbnQpCisKK0lOTElORV9TSU1fTUFJTiAodW5zaWduZWQzMikgaWZldGNoMzIgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIHNpbV9jcHUgKmNwdSwgYWRkcmVzc193b3JkIGNpYSwgYWRkcmVzc193b3JkIHZhZGRyKSk7CisjZGVmaW5lIElNRU0zMihDSUEpIGlmZXRjaDMyIChTRCwgQ1BVLCAoQ0lBKSwgKENJQSkpCitJTkxJTkVfU0lNX01BSU4gKHVuc2lnbmVkMTYpIGlmZXRjaDE2IFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGFkZHJlc3Nfd29yZCBjaWEsIGFkZHJlc3Nfd29yZCB2YWRkcikpOworI2RlZmluZSBJTUVNMTYoQ0lBKSBpZmV0Y2gxNiAoU0QsIENQVSwgKENJQSksICgoQ0lBKSAmIH4xKSkKKyNkZWZpbmUgSU1FTTE2X0lNTUVEKENJQSxOUikgaWZldGNoMTYgKFNELCBDUFUsIChDSUEpLCAoKENJQSkgJiB+MSkgKyAyICogKE5SKSkKKwordm9pZCBkb3RyYWNlIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIEZJTEUgKnRyYWNlZmgsIGludCB0eXBlLCBTSU1fQUREUiBhZGRyZXNzLCBpbnQgd2lkdGgsIGNoYXIgKmNvbW1lbnQsIC4uLikpOworZXh0ZXJuIEZJTEUgKnRyYWNlZmg7CisKK0lOTElORV9TSU1fTUFJTiAodm9pZCkgcGVuZGluZ190aWNrIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIGFkZHJlc3Nfd29yZCBjaWEpKTsKK2V4dGVybiBTSU1fQ09SRV9TSUdOQUxfRk4gbWlwc19jb3JlX3NpZ25hbDsKKworY2hhciogcHJfYWRkciBQQVJBTVMgKChTSU1fQUREUiBhZGRyKSk7CitjaGFyKiBwcl91d29yZDY0IFBBUkFNUyAoKHV3b3JkNjQgYWRkcikpOworCisKK3ZvaWQgbWlwc19jcHVfZXhjZXB0aW9uX3RyaWdnZXIoU0lNX0RFU0Mgc2QsIHNpbV9jcHUqIGNwdSwgYWRkcmVzc193b3JkIHBjKTsKK3ZvaWQgbWlwc19jcHVfZXhjZXB0aW9uX3N1c3BlbmQoU0lNX0RFU0Mgc2QsIHNpbV9jcHUqIGNwdSwgaW50IGV4Y2VwdGlvbik7Cit2b2lkIG1pcHNfY3B1X2V4Y2VwdGlvbl9yZXN1bWUoU0lNX0RFU0Mgc2QsIHNpbV9jcHUqIGNwdSwgaW50IGV4Y2VwdGlvbik7CisKKworI2lmIEhfUkVWRUFMU19NT0RVTEVfUCAoU0lNX01BSU5fSU5MSU5FKQorI2luY2x1ZGUgInNpbS1tYWluLmMiCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vbWlwcy90Y29uZmlnLmluIGIvc2ltL21pcHMvdGNvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODA2MmEzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL21pcHMvdGNvbmZpZy5pbgpAQCAtMCwwICsxLDMxIEBACisvKiBtaXBzIHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuICAqLworCisvKiBTZWUgc2ltLWhsb2FkLmMuICBXZSBwcm9wZXJseSBoYW5kbGUgTE1BLiAgKi8KKyNpZmRlZiBUQVJHRVRfVFgzOTA0CisjZGVmaW5lIFNJTV9IQU5ETEVTX0xNQSAxCisKKy8qIEZJWE1FOiBUaGlzIGlzIHVubmVjZXNzYXJpbHkgbmVjZXNzYXJ5OiAqLworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlICJyZW1vdGUtc2ltLmgiCisjaW5jbHVkZSAic2ltLW1vZHVsZS5oIgorCitNT0RVTEVfSU5TVEFMTF9GTiBkdl9zb2Nrc2VyX2luc3RhbGw7CisjZGVmaW5lIE1PRFVMRV9MSVNUIGR2X3NvY2tzZXJfaW5zdGFsbCwKKyNlbmRpZgorCisvKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHN1cHBvcnRzIHByb2ZpbGluZy4KKyAgIFNlZSB0aGUgbWlwcyBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCisgICBUaGlzIGVuYWJsZXMgdGhlIGAtcCBmb28nIGFuZCBgLXMgYmFyJyBvcHRpb25zLgorICAgVGhlIHRhcmdldCBpcyByZXF1aXJlZCB0byBwcm92aWRlIHNpbV9zZXRfcHJvZmlsZXssX3NpemV9LiAgKi8KKyNkZWZpbmUgU0lNX0hBVkVfUFJPRklMRQorCisvKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHVzZXMgYW4gaW5zdHJ1Y3Rpb24gY2FjaGUuCisgICBTZWUgdGhlIGg4LzMwMCBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCisgICBUaGlzIGVuYWJsZXMgdGhlIGAtYyBzaXplJyBvcHRpb24gdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBjYWNoZS4KKyAgIFRoZSB0YXJnZXQgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzaW1fc2V0X3NpbWNhY2hlX3NpemUuICAqLworLyogI2RlZmluZSBTSU1fSEFWRV9TSU1DQUNIRSAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB0aGUgdGFyZ2V0IGNwdSBpcyBiaS1lbmRpYW4KKyAgIGFuZCB0aGUgc2ltdWxhdG9yIHN1cHBvcnRzIGl0LiAgKi8KKyNkZWZpbmUgU0lNX0hBVkVfQklFTkRJQU4KZGlmZiAtLWdpdCBhL3NpbS9taXBzL3R4LmlnZW4gYi9zaW0vbWlwcy90eC5pZ2VuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MjdlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbWlwcy90eC5pZ2VuCkBAIC0wLDAgKzEsNDEgQEAKKy8vIC0qLSBDIC0qLQorLy8KKy8vIHRvc2hpYmEgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zLgorLy8KKworMDExMTAwLDUuUlMsNS5SVCw1LlJELDAwMDAwMDAwMDAwOk1NSU5PUk06OjpNQURECisibWFkZCByPFJTPiwgcjxSVD4iOlJEID09IDAKKyJtYWRkIHI8UkQ+LCByPFJTPiwgcjxSVD4iCisqcjM5MDAKK3sKKyAgc2lnbmVkNjQgcHJvZCA9IChVOF80IChWTDRfOCAoSEkpLCBWTDRfOCAoTE8pKQorCQkgICArICgoc2lnbmVkNjQpIEVYVEVORDMyIChHUFJbUlRdKQorCQkgICAgICAqIChzaWduZWQ2NCkgRVhURU5EMzIgKEdQUltSU10pKSk7CisgIGNoZWNrX211bHRfaGlsbyAoU0RfLCBISUhJU1RPUlksIExPSElTVE9SWSk7CisgIFRSQUNFX0FMVV9JTlBVVDIgKEdQUltSU10sIEdQUltSVF0pOworICBMTyA9IEVYVEVORDMyIChwcm9kKTsKKyAgSEkgPSBFWFRFTkQzMiAoVkg0XzggKHByb2QpKTsKKyAgVFJBQ0VfQUxVX1JFU1VMVDIgKEhJLCBMTyk7CisgIGlmKFJEICE9IDAgKQorICAgIEdQUltSRF0gPSBMTzsKK30KKworCiswMTExMDAsNS5SUyw1LlJULDUuUkQsMDAwMDAwMDAwMDE6TU1JTk9STTo6Ok1BRERVCisibWFkZHUgcjxSUz4sIHI8UlQ+IjpSRCA9PSAwCisibWFkZHUgcjxSRD4sIHI8UlM+LCByPFJUPiIKKypyMzkwMAoreworICB1bnNpZ25lZDY0IHByb2QgPSAoVThfNCAoVkw0XzggKEhJKSwgVkw0XzggKExPKSkKKwkJICAgICArICgodW5zaWduZWQ2NCkgVkw0XzggKEdQUltSU10pCisJCQkqICh1bnNpZ25lZDY0KSBWTDRfOCAoR1BSW1JUXSkpKTsKKyAgY2hlY2tfbXVsdF9oaWxvIChTRF8sIEhJSElTVE9SWSwgTE9ISVNUT1JZKTsKKyAgVFJBQ0VfQUxVX0lOUFVUMiAoR1BSW1JTXSwgR1BSW1JUXSk7CisgIExPID0gRVhURU5EMzIgKHByb2QpOworICBISSA9IEVYVEVORDMyIChWSDRfOCAocHJvZCkpOworICBUUkFDRV9BTFVfUkVTVUxUMiAoSEksIExPKTsKKyAgaWYoUkQgIT0gMCkKKyAgICBHUFJbUkRdID0gTE87Cit9CisKKwpkaWZmIC0tZ2l0IGEvc2ltL21pcHMvdnIuaWdlbiBiL3NpbS9taXBzL3ZyLmlnZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzYmI1NQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9taXBzL3ZyLmlnZW4KQEAgLTAsMCArMSw3OCBAQAorLy8gLSotIEMgLSotCisvLworLy8gTkVDIHNwZWNpZmljIGluc3RydWN0aW9ucworLy8KKworLy8gSW50ZWdlciBJbnN0cnVjdGlvbnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTXVsQWNjIGlzIHRoZSBNdWx0aXBseSBBY2N1bXVsYXRvci4KKy8vICAgICBUaGlzIHJlZ2lzdGVyIGlzIG1hcHBlZCBvbiB0aGUgdGhlIEhJIGFuZCBMTyByZWdpc3RlcnMuCisvLyAgICAgVXBwZXIgMzIgYml0cyBvZiBNdWxBY2MgaXMgbWFwcGVkIG9uIHRvIGxvd2VyIDMyIGJpdHMgb2YgSEkgcmVnaXN0ZXIuCisvLyAgICAgTG93ZXIgMzIgYml0cyBvZiBNdWxBY2MgaXMgbWFwcGVkIG9uIHRvIGxvd2VyIDMyIGJpdHMgb2YgTE8gcmVnaXN0ZXIuCisKKworOmZ1bmN0aW9uOjo6dW5zaWduZWQ2NDpNdWxBY2M6CisqdnI0MTAwOgoreworICB1bnNpZ25lZDY0IHJlc3VsdCA9IFU4XzQgKEhJLCBMTyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKzpmdW5jdGlvbjo6OnZvaWQ6U0VUX011bEFjYzp1bnNpZ25lZDY0IHZhbHVlCisqdnI0MTAwOgoreworICAvKiA2NCBiaXQgc3BlY2lmaWMgKi8KKyAgKkFMNF84ICgmSEkpID0gVkg0XzggKHZhbHVlKTsKKyAgKkFMNF84ICgmTE8pID0gVkw0XzggKHZhbHVlKTsKK30KKworOmZ1bmN0aW9uOjo6c2lnbmVkNjQ6U2lnbmVkTXVsdGlwbHk6c2lnbmVkMzIgbCwgc2lnbmVkMzIgcgorKnZyNDEwMDoKK3sKKyAgc2lnbmVkNjQgcmVzdWx0ID0gKHNpZ25lZDY0KSBsICogKHNpZ25lZDY0KSByOworICByZXR1cm4gcmVzdWx0OworfQorCis6ZnVuY3Rpb246Ojp1bnNpZ25lZDY0OlVuc2lnbmVkTXVsdGlwbHk6dW5zaWduZWQzMiBsLCB1bnNpZ25lZDMyIHIKKyp2cjQxMDA6Cit7CisgIHVuc2lnbmVkNjQgcmVzdWx0ID0gKHVuc2lnbmVkNjQpIGwgKiAodW5zaWduZWQ2NCkgcjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworOmZ1bmN0aW9uOjo6dW5zaWduZWQ2NDpMb3czMkJpdHM6dW5zaWduZWQ2NCB2YWx1ZQorKnZyNDEwMDoKK3sKKyAgdW5zaWduZWQ2NCByZXN1bHQgPSAoc2lnbmVkNjQpIChzaWduZWQzMikgVkw0XzggKHZhbHVlKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworOmZ1bmN0aW9uOjo6dW5zaWduZWQ2NDpIaWdoMzJCaXRzOnVuc2lnbmVkNjQgdmFsdWUKKyp2cjQxMDA6Cit7CisgIHVuc2lnbmVkNjQgcmVzdWx0ID0gKHNpZ25lZDY0KSAoc2lnbmVkMzIpIFZINF84ICh2YWx1ZSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworCisvLyBNdWx0aXBseSwgQWNjdW11bGF0ZQorMDAwMDAwLDUuUlMsNS5SVCwwMDAwMCwwMDAwMCwxMDEwMDA6OjY0OjpNQUMKKyJtYWMgcjxSUz4sIHI8UlQ+IgorKnZyNDEwMDoKK3sKKyAgU0VUX011bEFjYyAoU0RfLCBNdWxBY2MgKFNEXykgKyBTaWduZWRNdWx0aXBseSAoU0RfLCBHUFJbUlNdLCBHUFJbUlRdKSk7Cit9CisKKworLy8gRC1NdWx0aXBseSwgQWNjdW11bGF0ZQorMDAwMDAwLDUuUlMsNS5SVCwwMDAwMCwwMDAwMCwxMDEwMDE6OjY0OjpETUFDCisiZG1hYyByPFJTPiwgcjxSVD4iCisqdnI0MTAwOgoreworICBMTyA9IExPICsgU2lnbmVkTXVsdGlwbHkgKFNEXywgR1BSW1JTXSwgR1BSW1JUXSk7Cit9CisKKworCmRpZmYgLS1naXQgYS9zaW0vbW4xMDIwMC9DaGFuZ2VMb2cgYi9zaW0vbW4xMDIwMC9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzOGYxMwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tbjEwMjAwL0NoYW5nZUxvZwpAQCAtMCwwICsxLDQyNCBAQAorV2VkIEp1biAxNyAxMTozNzo1OSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBEZWZpbmUgTkxfVEFSR0VUIHNvIHRoYXQgdGFyZy12YWxzLmggd2lsbCBiZSB1c2VkCisJaW5zdGVhZCBvZiBzeXNjYWxsLmguCisJKiBzaW1vcHMuYzogVXNlIHRhcmctdmFscy5oIGluc3RlYWQgb2Ygc3lzY2FsbC5oLgorCitUdWUgQXByIDI4IDE4OjMzOjMxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1N1biBBcHIgMjYgMTU6MzE6NTUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1N1biBBcHIgMjYgMTU6MTk6NTggMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZ3VyZS5pbjogUmV2ZXJ0ZWQgY2hhbmdlIG9mIEFwciAyNDsgdXNlIHNpbmNsdWRlIGFnYWluLgorCitGcmkgQXByIDI0IDE0OjE2OjQwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitGcmkgQXByIDI0IDExOjE5OjEzIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEb24ndCBjYWxsIHNpbmNsdWRlLgorCitUaHUgQXByIDIzIDA5OjQ4OjE0IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1NhdCBBcHIgIDQgMjA6MzY6MjUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK0ZyaSBNYXIgMjcgMTY6MTU6NTIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBNYXIgMjUgMTI6MzU6MjkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBNYXIgMTggMTI6Mzg6MTIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1R1ZSBGZWIgMTcgMTI6NDY6MjIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX3N0b3JlX3JlZ2lzdGVyLCBzaW1fZmV0Y2hfcmVnaXN0ZXIpOiBQYXNzIGluCisgCWxlbmd0aCBwYXJhbWV0ZXIuICBSZXR1cm4gLTEuCisKK1N1biBGZWIgIDEgMTY6NDc6NTEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1NhdCBKYW4gMzEgMTg6MTU6NDEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK01vbiBKYW4gMTkgMjI6MjY6MjkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1R1ZSBKYW4gMTMgMDA6MDE6NDAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYzogU3RvcmVzIHRvIGFiczE2IG1lbW9yeSBhZGRyZXNzZXMgemVybyBleHRlbmQgdGhlCisJYWJzMTYgYWRkcmVzcy4KKworTW9uIERlYyAxNSAyMzoxNzoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1RodSBEZWMgIDQgMDk6MjE6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgT2N0IDIyIDE0OjQzOjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9sb2FkKTogUGFzcyBsbWFfcCBhbmQgc2ltX3dyaXRlIGFyZ3MgdG8KKyAJc2ltX2xvYWRfZmlsZS4KKworRnJpIE9jdCAgMyAwOToyODowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIFNlcCAyNCAxNzozODo1NyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVHVlIFNlcCAyMyAxMTowNDozOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIFNlcCAyMiAxMTo0NjoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworRnJpIFNlcCAxOSAxNzo0NToyNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIFNlcCAxNSAxNzozNjoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVGh1IFNlcCAgNCAxNzoyMToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmE+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVHVlIFNlcCAgMiAxODo0MToyMyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKyAgICAgICAgKiBzaW1vcHMuYzogUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgbmV4dAorCWluc3RydWN0aW9uLCBub3QgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uCisKK1dlZCBBdWcgMjcgMTg6MTM6MjIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitUdWUgQXVnIDI2IDEwOjQwOjQ1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9raWxsKTogRGVsZXRlLgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogQWRkIEFCRkQgYXJndW1lbnQuCisJKHNpbV9sb2FkKTogTW92ZSBzZXR0aW5nIG9mIFBDIGZyb20gaGVyZS4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFRvIGhlcmUuCisKK01vbiBBdWcgMjUgMTc6NTA6MjIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitNb24gQXVnIDI1IDE2OjE0OjQ0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogQWRkIEFCRkQgYXJndW1lbnQuCisKK1R1ZSBKdW4gMjQgMTM6NDQ6MDggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBpbnRlcnAuYyAoc2ltX3Jlc3VtZSk6IENsZWFyIFN0YXRlLmV4aXRlZC4KKwkoc2ltX3N0b3BfcmVhc29uKTogSWYgU3RhdGUuZXhpdGVkIGlzIG5vbnplcm8sIHRoZW4gaW5kaWNhdGUgdGhhdAorCXRoZSBzaW11bGF0b3IgZXhpdGVkIGluc3RlYWQgb2Ygc3RvcHBlZC4KKwkqIG1uMTAyMDBfc2ltLmggKHN0cnVjdCBfc3RhdGUpOiBBZGQgZXhpdGVkIGZpZWxkLgorCSogc2ltb3BzLmMgKHN5c2NhbGwpOiBTZXQgU3RhdGUuZXhpdGVkIGZvciBTWVNfZXhpdC4KKworVHVlIE1heSAyMCAxNzo0NTo0NyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGludGVycC5jOiBSZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIGxvYWRfbWVtIGFuZCBzdG9yZV9tZW0KKwl3aXRoIHJlZmVyZW5jZXMgdG8gbG9hZF9ieXRlLCBsb2FkX2hhbGYsIGxvYWRfM19ieXRlLCBsb2FkX3dvcmQKKwlhbmQgc3RvcmVfYnl0ZSwgc3RvcmVfaGFsZiwgc3RvcmVfM19ieXRlLCBzdG9yZV93b3JkLgorCShJTkxJTkUpOiBEZWxldGUgZGVmaW5pdGlvbi4KKwkobG9hZF9tZW1fYmlnKTogTGlrZXdpc2UuCisJKG1heF9tZW0pOiBNYWtlIGl0IGdsb2JhbC4KKwkoZGlzcGF0Y2gpOiBNYWtlIHRoaXMgZnVuY3Rpb24gaW5saW5lLgorCShsb2FkX21lbSwgc3RvcmVfbWVtKTogRGVsZXRlIGZ1bmN0aW9ucy4KKwkqIG1uMTAyMDBfc2ltLmggKElOTElORSk6IERlZmluZS4KKwkoUkxXKTogRGVsZXRlIHVudXNlZCBkZWZpbml0aW9uLgorCShsb2FkX21lbSwgc3RvcmVfbWVtKTogRGVsZXRlIGRlY2xhcmF0aW9ucy4KKwkobG9hZF9tZW1fYmlnKTogTmV3IGRlZmluaXRpb24uCisJKGxvYWRfYnl0ZSwgbG9hZF9oYWxmLCBsb2FkXzNfYnl0ZSwgbG9hZF93b3JkKTogTmV3IGZ1bmN0aW9ucy4KKwkoc3RvcmVfYnl0ZSwgc3RvcmVfaGFsZiwgc3RvcmVfM19ieXRlLCBzdG9yZV93b3JkKTogTmV3IGZ1bmN0aW9ucy4KKwkqIHNpbW9wcy5jOiAgUmVwbGFjZSBhbGwgcmVmZXJlbmNlcyB0byBsb2FkX21lbSBhbmQgc3RvcmVfbWVtCisJd2l0aCByZWZlcmVuY2VzIHRvIGxvYWRfYnl0ZSwgbG9hZF9oYWxmLCBsb2FkXzNfYnl0ZSwgbG9hZF93b3JkCisJYW5kIHN0b3JlX2J5dGUsIHN0b3JlX2hhbGYsIHN0b3JlXzNfYnl0ZSwgc3RvcmVfd29yZC4KKworVHVlIE1heSAyMCAxMDoyMTowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IEFkZCBjYWxsYmFjayBhcmd1bWVudC4KKwkoc2ltX3NldF9jYWxsYmFja3MpOiBEZWxldGUgU0lNX0RFU0MgYXJndW1lbnQuCisKK1N1biBNYXkgMTggMTY6NTk6MDkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBpbnRlcnAuYyAoY29tcGFyZV9zaW1vcHMpOiBOZXcgZnVuY3Rpb24uCisJKHNpbV9vcGVuKTogU29ydCB0aGUgU2ltb3BzIHRhYmxlIGJlZm9yZSBpbnNlcnRpbmcgZW50cmllcworCWludG8gdGhlIGhhc2ggdGFibGUuCisKK0ZyaSBNYXkgMTYgMTY6Mjk6MTggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBpbnRlcnAuYyAobG9hZF9tZW0pOiBGaXggZm9ybWF0dGluZy9pbmRlbnRpb24gcHJvYmxlbXMgd2l0aAorCWxhc3QgY2hhbmdlLiAgSWYgd2UgZ2V0IGEgbG9hZCBmcm9tIGFuIG91dCBvZiByYW5nZSBhZGRyZXNzLAorCWFib3J0IGluc3RlYWQgb2YgcmV0dXJuaW5nIHplcm8uCisJKHN0b3JlX21lbSk6IEFib3J0IGlmIHdlIHRyeSB0byBzdG9yZSB0byBhbiBvdXQgb2YgcmFuZ2UgYWRkcmVzcy4KKworV2VkIE1heSAxNCAyMToyMTozMCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KKworCSogc2ltb3BzLmMgKE9QX0YwMTApOiBGaXggc29tZSBhcmd1bWVudHMgdG8gY29ycmVzcG9uZAorCXdpdGggcmVhbGl0eSAodHlwZXMgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBsc2VlaywgcmVhZCwKKwl3cml0ZSwgb3BlbikuCisKKwkqIGludGVycC5jIChtYXhfbWVtKTogTmV3IHZhcmlhYmxlLgorCShsb2FkX21lbSk6IENoZWNrIG1lbW9yeSBhZGRyZXNzIGFnYWluc3QgbWF4X21lbSB0bworCWF2b2lkIHNvbWUgc2VsZi1kZXN0cnVjdGl2ZSBiZWhhdmlvcnMuCisKK1R1ZSBNYXkgMTMgMjE6NDU6MjQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYzogRml4IHR5cG8gaW4gY2MwIHNldHRpbmcgZm9yIGxzci4KKworVHVlIE1heSAgNiAxMzoyMjoxMiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGludGVycC5jOiBSYW5kb20gdHlwby90aGlua28gY2xlYW51cHMuCisKK1RodSBBcHIgMjQgMDA6Mzk6NTEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gQXByIDIxIDEwOjI5OjMwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltb3BzLmM6IEZpeCB0eXBvIGluICJvcGVuIiBzeXNjYWxsIGVtdWxhdGlvbi4KKworRnJpIEFwciAxOCAxNDowNDozMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fc3RvcCk6IEFkZCBzdHViIGZ1bmN0aW9uLgorCitUaHUgQXByIDE3IDAzOjIzOjU4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbG9hZC5vLgorCSogaW50ZXJwLmMgKHNpbV9raW5kLCBteW5hbWUpOiBOZXcgc3RhdGljIGxvY2Fscy4KKwkoc2ltX29wZW4pOiBTZXQgc2ltX2tpbmQsIG15bmFtZS4gIElnbm9yZSAtRSBhcmcuCisJKHNpbV9sb2FkKTogUmV0dXJuIFNJTV9SQy4gIE5ldyBhcmcgYWJmZC4gIENhbGwgc2ltX2xvYWRfZmlsZSB0bworCWxvYWQgZmlsZSBpbnRvIHNpbXVsYXRvci4gIFNldCBzdGFydCBhZGRyZXNzIGZyb20gYmZkLgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogUmV0dXJuIFNJTV9SQy4gIERlbGV0ZSBhcmcgc3RhcnRfYWRkcmVzcy4KKworV2VkIEFwciAxNiAxODowNjo1MCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF9GMDEwKTogU1lTX2V4ZWN2LCBTWVNfdGltZSwgU1lTX3RpbWVzLCBTWVNfdXRpbWUKKyAJb25seSBpbmNsdWRlIGlmIGltcGxlbWVudGVkIGJ5IGhvc3QuCisKK01vbiBBcHIgIDcgMTU6NDU6MDIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK0ZyaSBBcHIgIDQgMjA6MDE6NTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbjogQ2hhbmdlIG1uMTAyMDAtb3BjLm8gdG8gbTEwMjAwLW9wYy5vLCB0byBtYXRjaAorCWNvcnJlc3BvbmRpbmcgY2hhbmdlIGluIG9wY29kZXMgZGlyZWN0b3J5LgorCitXZWQgQXByICAyIDE1OjA2OjI4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IE5ldyBhcmcgYGtpbmQnLgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBBcHIgIDIgMTQ6MzQ6MTkgMTk5NyBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1RodSBNYXIgMjAgMjA6Mjg6MTQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMjAwX3NpbS5oOiBQcm90ZWN0IHVzZXMgb2YgInNpZ25lZCIgdG8gY2F0ZXIgdG8gYnJva2VuCisJbm9uLWFuc2kgY29tcGlsZXJzIChIUHMpLiAgRG9uJ3QgdXNlICNlcnJvciBmb3IgdGhlIHNhbWUgcmVhc29uLgorCitUdWUgTWFyIDE4IDEyOjIzOjMxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltb3BzLmM6IERvbid0IHNpZ24tZXh0ZW5kIGltbWVkaWF0ZSBmb3IgIm1vdiBpbW0xNixhbiIuCisJU2ltcGxpZnkgInN1YiIgaGFuZGxpbmcuICBGaXggIm11bCIgdG8gcHJvcGVybHkgc2lnbiBleHRlbmQKKwlvcGVyYW5kcy4gIFNldCBDRiBhcHByb3ByaWF0ZWx5IGZvciBidHN0IGltbTE2LGRuLiAgSW1wbGVtZW50ICJydGkiLgorCisJKiBnZW5jb2RlLmM6IERlbGV0ZSB1bnVzZWQgIk9wY29kZXMiIGFuZCAiY3Vyb3AiIHZhcmlhYmxlcy4KKworV2VkIE1hciAxOSAwMToxNDowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gTWFyIDE3IDE1OjEwOjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgorCitGcmkgTWFyIDE0IDEwOjM0OjExIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVGh1IE1hciAxMyAxMjo1MzoxNCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBOZXcgU0lNX0RFU0MgcmVzdWx0LiAgQXJndW1lbnQgaXMgbm93CisJaW4gYXJndiBmb3JtLgorCShvdGhlciBzaW1fKik6IE5ldyBTSU1fREVTQyBhcmd1bWVudC4KKworV2VkIE1hciAxMiAxNTowMjozNSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNpbW9wcy5jOiBGaXggdHlwbyBmb3IgImJjbHIiLgorCitXZWQgRmViIDI2IDE2OjQ2OjEzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltb3BzLmM6IEhhbmRsZSBuZXcgY2FsbGluZyBjb252ZW50aW9uIGluIGVtdWxhdGVkIHN5c2NhbGwKKwljb2RlLgorCitNb24gRmViIDI0IDE0OjI1OjExIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaW50ZXJwLmMgKGxvYWRfbWVtX2JpZyk6IEFkZCBzb21lIG1pc3NpbmcgcGFyZW5zLgorCitXZWQgRmViIDE5IDIzOjE5OjA4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltb3BzLmM6IERvbid0IHVzZSAibG9uZyBsb25nIiBkYXRhIHR5cGVzIGZvciBpbnRlcm1lZGlhdGUKKwl2YWx1ZXMgaW4gImRpdnUiLCAibXVsIiBhbmQgIm11bHUiIGluc3RydWN0aW9ucy4KKworRnJpIEZlYiAxNCAwMjo0Njo0NiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGludGVycC5jIChoYXNoKTogUmV3b3JrIHRvIGJlIG1vcmUgZWZmaWNpZW50LgorCShkaXNwYXRjaCk6IFJlbmFtZWQgZnJvbSBsb29rdXBfaGFzaC4gIERpc3BhdGNoIHRvIHRoZSB0YXJnZXQKKwlmdW5jdGlvbiBhbmQgdXBkYXRlIHRoZSBQQyBoZXJlLgorCShsb2FkX21lbV9iaWcpOiBOb3cgYSBtYWNyby4KKwkoc2ltX3Jlc3VtZSk6IFJlc3RydWN0dXJlIGNvZGUgdG8gcmVhZCBhbiBpbnNuLCBkZXRlcm1pbmUgaXRzCisJbGVuZ3RoLCBjYWxsIGRpc3BhdGNoIHJvdXRpbmVzLCBldGMgdG8gYmUgbXVjaCBtb3JlIGVmZmljaWVudC4KKworRnJpIEZlYiAgNyAxMjo1OTozNiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGludGVycC5jIChNQVhfSEFTSCk6IFJlZGVmaW5lIHRvIDEyNy4KKwkoc3RydWN0IGhhc2hfZW50cnkpOiBBZGQgImNvdW50IiBmaWVsZCB3aGVuIEhBU0hfU1RBVCBpcyBkZWZpbmVkLgorCShoYXNoKTogSW1wcm92ZSBoYXNoaW5nIGZvciBtYW55IGhlYXZpbHkgdXNlZCBvcGNvZGVzLgorCShsb29rdXBfaGFzaCk6IEJ1bXAgY291bnRlcnMgaWYgSEFTSF9TVEFUIGlzIGRlZmluZWQuCisJKHNpbV9vcGVuKTogRG9uJ3QgcHV0IHRoZSBzYW1lIG9wY29kZSBpbiB0aGUgaGFzaCB0YWJsZSBtb3JlCisJdGhhbiBvbmNlLiAgQ2xlYXIgY291bnRlcnMgaWYgSEFTSF9TVEFUIGlzIGRlZmluZWQuCisJKHNpbV9yZXN1bWUpOiBBZnRlciBwcm9ncmFtIGV4aXRzLCBkdW1wIGhhc2ggdGFibGUgc3RhdHMgaWYKKwlIQVNIX1NUQVQgaXMgZGVmaW5lZC4KKworV2VkIEZlYiAgNSAxMDoyODozNyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNpbW9wcy5jOiBGaXggcmVnaXN0ZXIgZXh0cmFjdGlvbiBmb3IgImV4dCBkbiIuCisKK1R1ZSBGZWIgIDQgMTc6Mjc6NDEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYzogRml4IHJlZ2lzdGVyIGV4dHJhY3Rpb25zIGZvciAibW92YnUgKGFuKSwgZG0iLgorCitUdWUgRmViICA0IDEzOjMzOjMwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChAQ09NTU9OX01BS0VGSUxFX0ZSQUcpOiBVc2UKKwlDT01NT05fe1BSRSxQT1NUfV9DT05GSUdfRlJBRyBpbnN0ZWFkLgorCSogY29uZmlndXJlLmluOiBzaW5jbHVkZSAuLi9jb21tb24vYWNsb2NhbC5tNC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK0ZyaSBKYW4gMzEgMDE6MTk6MDIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYzogR2V0IGNhcnJ5LWluIGJpdCByaWdodCBmb3Igcm9sLiAgSnVzdCBjbGVhciB0aGUKKwlORiBmbGFnIGZvciBidHN0IGltbTgsZG4uCisKK1dlZCBKYW4gMjkgMTU6NDc6NDIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYzogUHJvcGVybHkgY29tcHV0ZSBaRiBmbGFnIGZvciBtYW55IGluc25zLgorCitTYXQgSmFuIDI1IDE3OjA2OjU1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltb3BzLmM6IFByb3Blcmx5IHRydW5jYXRlIGRpdmlzb3IgYW5kIGRpdmlkZW5kIGJlZm9yZQorCXBlcmZvcm1pbmcgImRpdnUiIG9wZXJhdGlvbi4KKworRnJpIEphbiAyNCAxMDo0Nzo0OCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNpbW9wcy5jIChpbml0X3N5c3RlbSk6IEFsbG9jYXRlIDJeMTkgYnl0ZXMgb2Ygc3BhY2UgZm9yCisJdGhlIHNpbXVsYXRvci4KKworVGh1IEphbiAyMyAyMToxNzozMyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNpbW9wcy5jOiBSZXdvcmsgY29kZSB0byBleHRyYWN0IGFyZ3VtZW50cyBmb3IgZW11bGF0ZWQKKwlzeXNjYWxscyB0byBoYW5kbGUgMjRiaXQgcG9pbnRlcnMuCisKK1RodSBKYW4gMjMgMTQ6MDY6MDQgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBNYWtlZmlsZS5pbjogIFVwZGF0ZSB0byBuZXcgY29uZmlndXJlCisJc2NoZW1lIHdoaWNoIGlzIG1vcmUgY29tcGF0aWJsZSB3aXRoIFdpbkdEQiBidWlsZHMuCisJKiBjb25maWd1cmUuaW46ICBJbXByb3ZlIGNvbW1lbnQgb24gaG93IHRvIHJ1biBhdXRvY29uZi4KKwkqIGNvbmZpZ3VyZTogIFJlLXJ1biBhdXRvY29uZiB0byBnZXQgbmV3IC4uL2NvbW1vbi9hY2xvY2FsLm00LgorCSogTWFrZWZpbGUuaW46ICBVc2UgYXV0b2NvbmYgc3Vic3RpdHV0aW9uIHRvIGluc3RhbGwgY29tbW9uCisJbWFrZWZpbGUgZnJhZ21lbnQuCisKK1RodSBKYW4gMjMgMTI6MDQ6MzggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYzogRml4IGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGZvciAibW92IChhYnMyNCksYW4iLgorCitUdWUgSmFuIDIxIDE1OjU5OjIxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltb3BzLmM6ICJydHMiIGFkZHMgNCB0byB0aGUgc3RhY2sgcG9pbnRlci4KKworCSogc2ltb3BzLmM6IEZpeCBDRiBhbmQgQ1ggY29tcHV0YXRpb24gZm9yIGFkZCBpbnN0cnVjdGlvbnMuCisKKwkqIHNpbW9wcy5jOiBMZWF2ZSB0aGUgdXBwZXIgOCBiaXRzIGFsb25lIGZvciBsb2dpY2FsIG9wcy4KKwlNYXNrIG9mZiBoaWdoIDggYml0cyBiZWZvcmUgZG9pbmcgYW55IHNoaWZ0cy9yb3RhdGVzLgorCUZpeCBjYXJyeSBiaXQgaGFuZGxpbmcgaW4gcm90YXRlcyBhZ2Fpbi4KKworTW9uIEphbiAyMCAxMDo0NTowOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNpbW9wcy5jOiBEb24ndCBsb3NlIHRoZSBzaWduIGJpdCBmb3IgImFzciIuCisKK0ZyaSBKYW4gMTcgMDE6NDU6MTQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYzogRml4IG92ZXJmbG93IGNvbXB1dGF0aW9uIGZvciAiY21wIiBhbmQgInN1YiIKKwlpbnN0cnVjdGlvbnMuCisKKwkqIHNpbW9wcy5jOiBVc2UgdGhlIHJpZ2h0IHJlZ2lzdGVyIGZvciAiam1wIChhbikiIGFuZCAianNyIChhbikiLgorCisJKiBpbnRlcnAuYyAoaGFzaCk6IEltcHJvdmUgaGFzaGluZyBmb3IgMyBieXRlIGluc3RydWN0aW9ucy4KKworCSogc2ltb3BzLmM6IEZpeCBleHRyYWN0aW9uIG9mIDE2LzI0Yml0IGltbWVkaWF0ZXMgZm9yIHNvbWUKKwlpbnN0cnVjdGlvbnMuICAiY21wIiBpbnN0cnVjdGlvbnMgb25seSBtb2RpZnkgdGhlIFBTVy4KKwlGaXggdmFyaW91cyB0aGlua29zIHdoZW4gZXh0cmFjdGluZyByZWdpc3RlciBvcGVyYW5kcyB0b28uCisKK1RodSBKYW4gMTYgMDc6NDc6NTYgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYzogRml4ICJyb2wiIGFuZCAicm9yIi4KKworCSogc2ltb3BzLmM6IFRydW5jYXRlIFBDIHRvIDI0Yml0cyBhZnRlciBtb2RpZnlpbmcgaXQuCisJQ2xvc2VyIHN0YWIgYXQgZW11bGF0ZWQgc3lzdGVtIGNhbGxzLgorCitUdWUgSmFuIDE0IDEyOjMzOjEyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaW50ZXJwLmMgKGhhc2gpOiBJbXByb3ZlIGhhc2hpbmcgb2YgdHdvIGJ5dGUgaW5zbnMuCisJKHN0b3JlX21lbSk6IEhhbmRsZSBzdG9yaW5nIDMgYnl0ZSBxdWFudGl0aWVzLgorCisJKiBzaW1vcHMuYzogRml4IHZhcmlvdXMgdHlwb3MvdGhpbmtvcy4KKworCSogaW50ZXJwLmMgKGxvYWRfbWVtX2JpZywgbG9hZF9tZW0sIHN0b3JlX21lbSk6IEZpeCB0aGlua28gaW4KKwljb2RlIHRvIGhhbmRsZSAyNGJpdCBhZGRyZXNzZXMuCisJKiBzaW1vcHMuYyAoUkVHMF84LCBSRUcwXzE2KTogRml4IHR5cG8uCisKK01vbiBKYW4gIDYgMTY6MTc6MDkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMjAwX3NpbS5oOiBWYXJpb3VzIGZpeGVzIGZvciBtaXhlZCAxNi8yNGJpdCBhcmNoaXRlY3R1cmUuCisJKiBpbnRlcnAuYzogU2ltaWxhcmx5LgorCSogc2ltb3BzLmM6IFNpbWlsYXJseS4KKworCSogTWFrZWZpbGUuaW4sIGNvbmZpZy5pbiwgY29uZmlndXJlLCBjb25maWd1cmUuaW46IE5ldyBmaWxlcy4KKwkqIGdlbmNvZGUuYywgaW50ZXJwLmMsIG1uMTAyMDBfc2ltLmgsIHNpbW9wcy5jOiBOZXcgZmlsZXMuCisJCmRpZmYgLS1naXQgYS9zaW0vbW4xMDIwMC9NYWtlZmlsZS5pbiBiL3NpbS9tbjEwMjAwL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOTU4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbW4xMDIwMC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDUyIEBACisjICAgIE1ha2VmaWxlIHRlbXBsYXRlIGZvciBDb25maWd1cmUgZm9yIHRoZSBtbjEwMjAwIHNpbSBsaWJyYXJ5LgorIyAgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMjIENPTU1PTl9QUkVfQ09ORklHX0ZSQUcKKworU0lNX09CSlMgPSBpbnRlcnAubyB0YWJsZS5vIHNpbW9wcy5vIHNpbS1sb2FkLm8KK1NJTV9FWFRSQV9DRkxBR1MgPSAtSSQoc3JjZGlyKS8uLi8uLi9uZXdsaWIvbGliYy9zeXMvc3lzbWVjCitTSU1fRVhUUkFfQ0xFQU4gPSBjbGVhbi1leHRyYQorCisjIFNlbGVjdCBtbjEwMjAwIHN1cHBvcnQgaW4gbmx0dmFscy5kZWYuCitOTF9UQVJHRVQgPSAtRE5MX1RBUkdFVF9tbjEwMjAwCisKK0lOQ0xVREUgPSBtbjEwMjAwX3NpbS5oICQoc3JjZGlyKS8uLi8uLi9pbmNsdWRlL2NhbGxiYWNrLmgKKworIyMgQ09NTU9OX1BPU1RfQ09ORklHX0ZSQUcKKworc2ltb3BzLmg6IGdlbmNvZGUKKwkuL2dlbmNvZGUgLWggPiRACisKK3RhYmxlLmM6IGdlbmNvZGUgc2ltb3BzLmgKKwkuL2dlbmNvZGUgPiRACisKK2dlbmNvZGUubzogZ2VuY29kZS5jICQoSU5DTFVERSkKKwkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS9nZW5jb2RlLmMKKworbTEwMjAwLW9wYy5vOiAkKHNyY2RpcikvLi4vLi4vb3Bjb2Rlcy9tMTAyMDAtb3BjLmMKKwkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS8uLi8uLi9vcGNvZGVzL20xMDIwMC1vcGMuYworCitnZW5jb2RlOiBnZW5jb2RlLm8gbTEwMjAwLW9wYy5vCisJJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtbyBnZW5jb2RlIGdlbmNvZGUubyBtMTAyMDAtb3BjLm8gJChCVUlMRF9MSUIpCisKK2NsZWFuLWV4dHJhOgorCXJtIC1mIHRhYmxlLmMgc2ltb3BzLmggZ2VuY29kZQorCitpbnRlcnAubzogaW50ZXJwLmMgdGFibGUuYyAkKElOQ0xVREUpCitzaW1vcHMubzogc2ltb3BzLmMgJChJTkNMVURFKQordGFibGUubzogdGFibGUuYwpkaWZmIC0tZ2l0IGEvc2ltL21uMTAyMDAvYWNjb25maWcuaCBiL3NpbS9tbjEwMjAwL2FjY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliODdhMQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tbjEwMjAwL2FjY29uZmlnLmgKQEAgLTAsMCArMSwxNSBAQAorCisvKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KKyN1bmRlZiBFTkFCTEVfTkxTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0NBVEdFVFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCmRpZmYgLS1naXQgYS9zaW0vbW4xMDIwMC9jb25maWcuaW4gYi9zaW0vbW4xMDIwMC9jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY4N2EyYgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tbjEwMjAwL2NvbmZpZy5pbgpAQCAtMCwwICsxLDE1OCBAQAorLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCisjdW5kZWYgQ19BTExPQ0EKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCisjdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCisjdW5kZWYgSEFWRV9BTExPQ0EKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCisjdW5kZWYgaW5saW5lCisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgb2ZmX3QKKworLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCisjdW5kZWYgX1BPU0lYX1NPVVJDRQorCisvKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoaW50IG9yIHZvaWQpLiAgKi8KKyN1bmRlZiBSRVRTSUdUWVBFCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIHNpemVfdAorCisvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKKyAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgorIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgorICovCisjdW5kZWYgU1RBQ0tfRElSRUNUSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19zZXRmcHVjdyBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX1NFVEZQVUNXCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0RDR0VUVEVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRDV0QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRQQUdFU0laRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHJ1c2FnZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRSVVNBR0UKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfTVVOTUFQCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1BVVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VUTE9DQUxFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lnYWN0aW9uIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NJR0FDVElPTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0hSCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGltZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9USU1FCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfQVJHWl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZnB1X2NvbnRyb2wuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfRlBVX0NPTlRST0xfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9NQUxMT0NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9OTF9UWVBFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVkFMVUVTX0gKZGlmZiAtLWdpdCBhL3NpbS9tbjEwMjAwL2NvbmZpZ3VyZSBiL3NpbS9tbjEwMjAwL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNjQ2ZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL21uMTAyMDAvY29uZmlndXJlCkBAIC0wLDAgKzEsMzg5MiBAQAorIyEgL2Jpbi9zaAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCisjIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCisKKyMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDMKKworCisKKworCisjIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCisKKworIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCisKKworIyBDaGVjayB0byBzZWUgaWYgd2UncmUgcnVubmluZyB1bmRlciBDeWd3aW4zMiwgd2l0aG91dCB1c2luZworIyBBQ19DQU5PTklDQUxfKi4gIElmIHNvLCBzZXQgb3V0cHV0IHZhcmlhYmxlIENZR1dJTjMyIHRvICJ5ZXMiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICJubyIuCisKKworCisjIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIFdpbjMyLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgRVhFRVhUIHRvICIuZXhlIi4KKyMgT3RoZXJ3aXNlIHNldCBpdCB0byAiIi4KKworCisKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCithY19oZWxwPSIkYWNfaGVscAorICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQkJRW5hYmxlIGRldmVsb3BlciBmdW5jdGlvbmFsaXR5LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1ic3dhcAkJCVVzZSBIb3N0IHNwZWNpZmljIEJTV0FQIGluc3RydWN0aW9uLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1jZmxhZ3M9b3B0cwkJRXh0cmEgQ0ZMQUdTIGZvciB1c2UgaW4gYnVpbGRpbmcgc2ltdWxhdG9yIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWRlYnVnPW9wdHMJCUVuYWJsZSBkZWJ1Z2dpbmcgZmxhZ3MiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tc3RkaW8JCQlTcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIHN0ZGlvIGZvciBjb25zb2xlIGlucHV0L291dHB1dC4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tdHJhY2U9b3B0cwkJRW5hYmxlIHRyYWNpbmcgZmxhZ3MiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tcHJvZmlsZT1vcHRzCQlFbmFibGUgcHJvZmlsaW5nIGZsYWdzIgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorYWNfbWF4X2hlcmVfbGluZXM9MTIKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19wcm9nPSQwCisgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCisKKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgLiAkY2FjaGVfZmlsZQorZWxzZQorICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgPiAkY2FjaGVfZmlsZQorZmkKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworYWNfZXhlZXh0PQorYWNfb2JqZXh0PW8KK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCitlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Njc3OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0CisgICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCisgIENQUD0iJHtDQy1jY30gLUUiCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDY5MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Njk4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3MDkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjcxNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzI2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MzI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9L2xpYi9jcHAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzU3OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKK3NldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCithbGw6CisJQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKK0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCitldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKK2lmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCitlbHNlCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCitmaQorcm0gLWYgY29uZnRlc3RtYWtlCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBTRVRfTUFLRT0KK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3ODQ6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKK2lmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgorICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQorRU9GCisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDQz0iJENDIC1wb3NpeCIKKyAgZWxzZQorICAgIENDPSIkQ0MgLVhwIgorICBmaQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgSVNDPQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjgwNTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODEwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MTg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODM1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDg1MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4NzQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKK2ludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKK2lmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7CitleGl0ICgwKTsgfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODg1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNURENfSEVBREVSUyAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkwOTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5MTQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKworLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3R5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKKy8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCitjaGFyIGNvbnN0ICpjb25zdCAqY2NwOworY2hhciAqKnA7CisvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Oworc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07CisvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KKyAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCitjb25zdCBjaGFyICpnID0gInN0cmluZyI7CitjY3AgPSAmZyArIChnID8gZy1nIDogMCk7CisvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLworKytjY3A7CitwID0gKGNoYXIqKikgY2NwOworY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Cit7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLworICBjaGFyICp0OworICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOworCisgICp0KysgPSAwOworfQoreyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KKyAgaW50IHhbXSA9IHsyNSwgMTd9OworICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOworICArK2ZvbzsKK30KK3sgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLworICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKKyAgaXB0ciBwID0gMDsKKyAgKytwOworfQoreyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCisgICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KKyAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKKyAgc3RydWN0IHMgKmI7IGItPmogPSA1OworfQoreyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KKyAgY29uc3QgaW50IGZvbyA9IDEwOworfQorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTYzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGNvbnN0IAorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjk4NDogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19jdl9jX2lubGluZT1ubworZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbworICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5OTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK30gJGFjX2t3IGZvbygpIHsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5OTg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZG9uZQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2CitjYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCisgIGlubGluZSB8IHllcykgOzsKKyAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBpbmxpbmUgCitFT0YKKyA7OworICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQorRU9GCisgOzsKK2VzYWMKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDI0OiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDI5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIG9mZl90IGxvbmcKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDU3OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwNjIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgInNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2l6ZV90PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2l6ZV90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBzaXplX3QgdW5zaWduZWQKK0VPRgorCitmaQorCisjIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcworIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDkyOiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA5NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YWxsb2NhLmg+CitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTEyNTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTMwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorI2Vsc2UKKyMgaWZkZWYgX01TQ19WRVIKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjIGVsc2UKKyMgIGlmIEhBVkVfQUxMT0NBX0gKKyMgICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgIGVsc2UKKyMgICBpZmRlZiBfQUlYCisgI3ByYWdtYSBhbGxvY2EKKyMgICBlbHNlCisjICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCitjaGFyICphbGxvY2EgKCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworaW50IG1haW4oKSB7CitjaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBIDEKK0VPRgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCisgICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCisgICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgorICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKKyAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCisgIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBDX0FMTE9DQSAxCitFT0YKKworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTkwOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTE5NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCit3ZWJlY3JheQorI2Vsc2UKK3dlbm90YmVjcmF5CisjZW5kaWYKKworRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9vc19jcmF5PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgoraWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgorZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbworICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyMjA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyMjUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYworRU9GCisKKyAgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitkb25lCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjc1OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTI4MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCitmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKQoreworICBzdGF0aWMgY2hhciAqYWRkciA9IDA7CisgIGF1dG8gY2hhciBkdW1teTsKKyAgaWYgKGFkZHIgPT0gMCkKKyAgICB7CisgICAgICBhZGRyID0gJmR1bW15OworICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Cit9CittYWluICgpCit7CisgIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKK30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCitFT0YKKworZmkKKworZm9yIGFjX2hkciBpbiB1bmlzdGQuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzMjc6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMzMyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzM3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzNjY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzNzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM5NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTQxOTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTQyNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKy8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgorICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6CisJbW1hcCBwcml2YXRlIG5vdCBmaXhlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKyAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCisgICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50CisgICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKKyAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKKyAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQorICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKKyAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0CisgICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KKworICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgorICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKKyAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQorICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLworI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCisjIGlmZGVmIEhBVkVfVU5JU1REX0gKKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBlbmRpZgorCisvKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLworIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQorIyBlbmRpZgorCisjIGlmZGVmIF9TQ19QQUdFU0laRQorIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCisjIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCisjICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICAgaWZkZWYgRVhFQ19QQUdFU0laRQorIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCisjICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICAgIGlmZGVmIE5CUEcKKyMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKKyMgICAgIGlmbmRlZiBDTFNJWkUKKyMgICAgICBkZWZpbmUgQ0xTSVpFIDEKKyMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLworIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KKyMgICAgIGlmZGVmIE5CUEMKKyMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCisjICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KKyMgICAgICBpZmRlZiBQQUdFU0laRQorIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQorIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCisjICAgICBlbmRpZiAvKiBubyBOQlBDICovCisjICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KKyMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLworIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKworI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQorI2Vsc2UKK2NoYXIgKm1hbGxvYygpOworI2VuZGlmCisKK2ludAorbWFpbigpCit7CisJY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7CisJaW50IGksIHBhZ2VzaXplOworCWludCBmZDsKKworCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKKworCS8qCisJICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgorCSAqLworCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJKihkYXRhICsgaSkgPSByYW5kKCk7CisJdW1hc2soMCk7CisJZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgxKTsKKwlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKwkJZXhpdCgxKTsKKwljbG9zZShmZCk7CisKKwkvKgorCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAorCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKKwkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgorCSAqLworCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7CisJaWYgKCFkYXRhMikKKwkJZXhpdCgxKTsKKwlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7CisJaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKKwkJCWV4aXQoMSk7CisKKwkvKgorCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCisJICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgorCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOworCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEzKQorCQlleGl0KDEpOworCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQorCQkJZXhpdCgxKTsKKwljbG9zZShmZCk7CisJdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKKwlleGl0KDApOworfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU2NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX01NQVAgMQorRU9GCisKK2ZpCisKKworIyBhdXRvY29uZi5pbmZvIHNheXMgdGhpcyBzaG91bGQgYmUgY2FsbGVkIHJpZ2h0IGFmdGVyIEFDX0lOSVQuCisKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworCisjIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KKyMgVGhlIGlucHV0cyBhcmU6CisjICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKKyMKKyMgVGhlIHJ1bGVzIGFyZToKKyMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCisjICAgIHNhbWUgdGltZS4KKyMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCisjIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKKyMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCisjIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCisjIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgorCisjIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCisjIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCitjYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KK05PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKKyopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KK2lmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKK2Vsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjQwOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKKworaG9zdF9hbGlhcz0kaG9zdAorY2FzZSAiJGhvc3RfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkKKyAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6CisgICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkgOzsKKyAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCitob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkaG9zdCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2NjE6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1CisKK3RhcmdldF9hbGlhcz0kdGFyZ2V0CitjYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK3RhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKK3RhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCit0YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAordGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2Nzk6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKworYnVpbGRfYWxpYXM9JGJ1aWxkCitjYXNlICIkYnVpbGRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2J1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCitidWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2J1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAorYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKKwordGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgorICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCisgICAgTk9ORU5PTkVzLHgseCwgJiYKKyAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQorCitpZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KK2Vsc2UKKyAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCitzLFxcLFxcXFwsZzsgcyxcJCwkJCxnCitFT0ZfU0VECisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCisgIHJtIC1mIGNvbmZ0ZXN0c2VkCitmaQordGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCit0ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisKKyMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KK3Rlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzIzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzUyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisgICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisJY29udGludWUKKyAgICAgIGZpCisgICAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2lmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgc2hpZnQKKyAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJEAiCisgIGZpCitmaQorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgorICAgICp3aW4zMiogfCAqV0lOMzIqKQorICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTgwMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJjbCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKyA7OworICAgIGVzYWMKKyAgZmkKKyAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTgzMzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTg0MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCittYWluKCl7cmV0dXJuKDApO30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODQ3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKyAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisgIGVsc2UKKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcworICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KK2ZpCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTg2NzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Citjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4NzI6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKKyNpZmRlZiBfX0dOVUNfXworICB5ZXM7CisjZW5kaWYKK0VPRgoraWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4ODE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhY19jdl9wcm9nX2djYz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19nY2M9bm8KK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2CisKK2lmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCisgIEdDQz15ZXMKK2Vsc2UKKyAgR0NDPQorZmkKKworYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCithY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKK0NGTEFHUz0KK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTkwMDogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKK2lmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfY2NfZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTQzOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KKyAgICBjYXNlICIkYWNfZGlyLyIgaW4KKyAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKKyAgICAqKQorICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKyAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICAgIyBieSBkZWZhdWx0LgorICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbworICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisgICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJICAgIDoKKwkgIGVsc2UKKwkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgorCSAgICBicmVhayAyCisJICBmaQorCWZpCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX0lGUyIKKworZmkKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQorICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KKyAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKKyAgZmkKK2ZpCitlY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworCisjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJworZWxzZQorICBDQ19GT1JfQlVJTEQ9Z2NjCitmaQorCisKKworCitBUj0ke0FSLWFyfQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwMDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKK0FMTF9MSU5HVUFTPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKK3VuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjA0MzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIwNDggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNTM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKK19fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDgzOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMDg4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgorICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIxNDA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIxNDUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworICAgZmkKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCisgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NUUENQWSAxCitFT0YKKworICAgZmkKKworICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjAyOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIyMDcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxvY2FsZS5oPgoraW50IG1haW4oKSB7CityZXR1cm4gTENfTUVTU0FHRVMKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjE0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKKyAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKK0VPRgorCisgICAgZmkKKyAgZmkKKyAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjIzNTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgorICBVU0VfTkxTPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX05MUz15ZXMKK2ZpCisKKyAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKKyAgICAKKworICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCisKKyAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBFTkFCTEVfTkxTIDEKK0VPRgorCisgICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjU1OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgorICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCitlbHNlCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KK2ZpCisKKyAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgorCisgICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9CisJbmxzX2N2X2hlYWRlcl9saWJndD0KKwlDQVRPQkpFWFQ9Tk9ORQorCisJYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyNzQ6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIyNzkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpYmludGwuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjI4NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMDE6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjMwNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgoraW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMxMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2CisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCisJICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzI5OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbGludGwgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjMzNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGJpbmR0ZXh0ZG9tYWluKCk7CisKK2ludCBtYWluKCkgeworYmluZHRleHRkb21haW4oKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzNjQ6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjM2OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkgICBmaQorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKKwkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KKwkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9HRVRURVhUIDEKK0VPRgorCisJICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNDA0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgorICA7OworZXNhYworZmkKK01TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgoraWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KKwkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNDM4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNDQzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0OTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI1Mjg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjU2MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ0FUT0JKRVhUPS5nbW8KKwkJICAgREFUQURJUk5BTUU9c2hhcmUKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ0FUT0JKRVhUPS5tbworCQkgICBEQVRBRElSTkFNRT1saWIKK2ZpCitybSAtZiBjb25mdGVzdCoKKwkJSU5TVE9CSkVYVD0ubW8KKwkgICAgICBmaQorCSAgICBmaQorCQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworCSAgICAgICAgCisgICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCisJICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcworICAgICAgICBmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KKyAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgorICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2MDA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgorICA7OworZXNhYworZmkKK01TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgoraWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNjM0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRHTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgID86LyopCQkJIAorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgorICA7OworZXNhYworZmkKK0dNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCitpZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNjY5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkWEdFVFRFWFQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKKyAgOzsKK2VzYWMKK2ZpCitYR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCitpZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgIAorCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgICAgICBDQVRPQkpFWFQ9LmdtbworICAgICAgICBJTlNUT0JKRVhUPS5tbworICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQorCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCisJSU5UTExJQlM9JElOVExERVBTCisJTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCisgICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKKyAgICAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCisJCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCisJICA6IDsKKwllbHNlCisJICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2CisJICBYR0VUVEVYVD0iOiIKKwlmaQorICAgICAgZmkKKworICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCisgICAgICBQT1NVQj1wbworICAgIGVsc2UKKyAgICAgIERBVEFESVJOQU1FPXNoYXJlCisgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCisgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgIGZpCisKKyAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCisgICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KKyAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCisgICAgICBVU0VfTkxTPXllcworICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgZmkKKworICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KKyAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgorICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCisgICAgZG9uZQorCisgICAgICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAKKworICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgorICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgorICAgICAgIExJTkdVQVM9CisgICAgIGVsc2UKKyAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNzU5OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKKyAgICAgICBORVdfTElOR1VBUz0KKyAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KKyAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KKyAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OworICAgICAgICAgZXNhYworICAgICAgIGRvbmUKKyAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUworICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgorICAgICBmaQorCisgICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCisgICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQorICAgICBmaQorICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCisgICBlbHNlCisgICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKKy8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKKyAgIGZpCisgICAKKworICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCisJIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNzg3OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNzkyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI3OTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBtc2dmb3JtYXQ9bGludXgKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Cittc2dmb3JtYXQ9eG9wZW4KK2ZpCisKKworCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAorICAgICAgZmkKKyAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAorCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KKyAgICAgR1RfTk89IiNOTyMiCisgICAgIEdUX1lFUz0KKyAgIGVsc2UKKyAgICAgR1RfTk89CisgICAgIEdUX1lFUz0iI1lFUyMiCisgICBmaQorICAgCisgICAKKworICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgorICAgCisKKyAgICAgIGw9CisgICAKKworICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCisgICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCisgICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgorCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgorCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCisJIGVsc2UKKwkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgorCSBmaQorICAgICAgZWxzZQorCSBwb3NyY3ByZWZpeD0iLi4vIgorICAgICAgZmkKKyAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCisgICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKKwkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKKyAgIGZpCisgIAorCisjIENoZWNrIGZvciBjb21tb24gaGVhZGVycy4KKyMgRklYTUU6IFNlZW1zIHRvIG1lIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIGZvciBpMzg2LXdpbmRvd3MgaG9zdHMuCisjIEF0IG9uZSBwb2ludCB0aGVyZSB3ZXJlIGhhcmRjb2RlZCBBQ19ERUZJTkUncyBpZiAke2hvc3R9ID0gaTM4Ni0qLXdpbmRvd3MqLgorZm9yIGFjX2hkciBpbiBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdW5pc3RkLmggdGltZS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjg2NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI4NzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI4NzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfaGRyIGluIHN5cy90aW1lLmggc3lzL3Jlc291cmNlLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTA2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjkxMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjkxNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19oZHIgaW4gZmNudGwuaCBmcHVfY29udHJvbC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjk0NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI5NTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI5NTY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXRydXNhZ2UgdGltZSBzaWdhY3Rpb24gX19zZXRmcHVjdworZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjk4NTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjk5MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDEzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisKKyMgQ2hlY2sgZm9yIHNvY2tldCBsaWJyYXJpZXMKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMDQwOiBjaGVja2luZyBmb3IgYmluZCBpbiAtbHNvY2tldCIgPiY1CithY19saWJfdmFyPWBlY2hvIHNvY2tldCdfJ2JpbmQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sc29ja2V0ICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMwNDggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBiaW5kKCk7CisKK2ludCBtYWluKCkgeworYmluZCgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA1OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBzb2NrZXQgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKKyAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfbGliIDEKK0VPRgorCisgIExJQlM9Ii1sc29ja2V0ICRMSUJTIgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMwODc6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gbnNsJ18nZ2V0aG9zdGJ5bmFtZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxuc2wgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzA5NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGdldGhvc3RieW5hbWUoKTsKKworaW50IG1haW4oKSB7CitnZXRob3N0YnluYW1lKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIG5zbCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9saWIgMQorRU9GCisKKyAgTElCUz0iLWxuc2wgJExJQlMiCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKy4gJHtzcmNkaXJ9Ly4uLy4uL2JmZC9jb25maWd1cmUuaG9zdAorCisKKworVVNFX01BSU5UQUlORVJfTU9ERT1ubworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJTUFJTlQ9IiIgVVNFX01BSU5UQUlORVJfTU9ERT15ZXMgOzsKKyAgbm8pCU1BSU5UPSIjIiA7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBNQUlOVD0iIyIgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRNQUlOVCIgPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBtYWludGFpbmVyIG1vZGUiIDY+JjEKK2ZpCitlbHNlCisgIE1BSU5UPSIjIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYnN3YXAgb3IgLS1kaXNhYmxlLXNpbS1ic3dhcCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fYnN3YXArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ic3dhcCIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTEgLURVU0VfQlNXQVA9MSI7OworICBubykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MCI7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYnN3YXAgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYnN3YXA9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ic3dhcCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgYnN3YXAgZmxhZ3MgPSAkc2ltX2Jzd2FwIiA2PiYxCitmaQorZWxzZQorICBzaW1fYnN3YXA9IiIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWNmbGFncyBvciAtLWRpc2FibGUtc2ltLWNmbGFncyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fY2ZsYWdzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fY2ZsYWdzIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJIHNpbV9jZmxhZ3M9Ii1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciI7OworICB0cmFjZSkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiUGxlYXNlIHVzZSAtLWVuYWJsZS1zaW0tZGVidWcgaW5zdGVhZC4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9jZmxhZ3M9IiI7OworICBubykJIHNpbV9jZmxhZ3M9IiI7OworICAqKQkgc2ltX2NmbGFncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fY2ZsYWdzIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gY2ZsYWdzID0gJHNpbV9jZmxhZ3MiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9jZmxhZ3M9IiIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWRlYnVnIG9yIC0tZGlzYWJsZS1zaW0tZGVidWcgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZGVidWciCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKSBzaW1fZGVidWc9Ii1EREVCVUc9NyAtRFdJVEhfREVCVUc9NyI7OworICBubykgIHNpbV9kZWJ1Zz0iLURERUJVRz0wIC1EV0lUSF9ERUJVRz0wIjs7CisgICopICAgc2ltX2RlYnVnPSItRERFQlVHPScoJHtlbmFibGV2YWx9KScgLURXSVRIX0RFQlVHPScoJHtlbmFibGV2YWx9KSciOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVidWciICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBkZWJ1ZyA9ICRzaW1fZGVidWciIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9kZWJ1Zz0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tc3RkaW8gb3IgLS1kaXNhYmxlLXNpbS1zdGRpbyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fc3RkaW8rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9zdGRpbyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPX1VTRV9TVERJTyI7OworICBubykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9OVF9VU0VfU1RESU8iOzsKKyAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tc3RkaW8iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9zdGRpbz0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3N0ZGlvIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzdGRpbyBmbGFncyA9ICRzaW1fc3RkaW8iIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9zdGRpbz0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tdHJhY2Ugb3IgLS1kaXNhYmxlLXNpbS10cmFjZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fdHJhY2Urc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV90cmFjZSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV90cmFjZT0iLURUUkFDRT0xIC1EV0lUSF9UUkFDRT0tMSI7OworICBubykJc2ltX3RyYWNlPSItRFRSQUNFPTAgLURXSVRIX1RSQUNFPTAiOzsKKyAgWy0wLTldKikKKwlzaW1fdHJhY2U9Ii1EVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyI7OworICBbYS16XSopCisJc2ltX3RyYWNlPSIiCisJZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCisJICBpZiB0ZXN0IHgiJHNpbV90cmFjZSIgPSB4OyB0aGVuCisJICAgIHNpbV90cmFjZT0iLURXSVRIX1RSQUNFPScoVFJBQ0VfJHgiCisJICBlbHNlCisJICAgIHNpbV90cmFjZT0iJHtzaW1fdHJhY2V9fFRSQUNFXyR4IgorCSAgZmkKKwlkb25lCisJc2ltX3RyYWNlPSIkc2ltX3RyYWNlKSciIDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3RyYWNlIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gdHJhY2UgPSAkc2ltX3RyYWNlIiA2PiYxCitmaQorZWxzZQorICBzaW1fdHJhY2U9IiIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXByb2ZpbGUgb3IgLS1kaXNhYmxlLXNpbS1wcm9maWxlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9wcm9maWxlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fcHJvZmlsZSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSI7OworICBubykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0wIC1EV0lUSF9QUk9GSUxFPTAiOzsKKyAgWy0wLTldKikKKwlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPScoJHtlbmFibGV2YWx9KScgLURXSVRIX1BST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyI7OworICBbYS16XSopCisJc2ltX3Byb2ZpbGU9IiIKKwlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKwkgIGlmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiID0geDsgdGhlbgorCSAgICBzaW1fcHJvZmlsZT0iLURXSVRIX1BST0ZJTEU9JyhQUk9GSUxFXyR4IgorCSAgZWxzZQorCSAgICBzaW1fcHJvZmlsZT0iJHtzaW1fcHJvZmlsZX18UFJPRklMRV8keCIKKwkgIGZpCisJZG9uZQorCXNpbV9wcm9maWxlPSIkc2ltX3Byb2ZpbGUpJyIgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIHByb2ZpbGUgPSAkc2ltX3Byb2ZpbGUiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9wcm9maWxlPSIiCitmaQorCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMjgyOiBjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2lnbmFsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzI4NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaWZkZWYgc2lnbmFsCisjdW5kZWYgc2lnbmFsCisjZW5kaWYKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB2b2lkICgqc2lnbmFsIChpbnQsIHZvaWQgKCopKGludCkpKShpbnQpOworI2Vsc2UKK3ZvaWQgKCpzaWduYWwgKCkpICgpOworI2VuZGlmCisKK2ludCBtYWluKCkgeworaW50IGk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMwNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2lnbmFsPXZvaWQKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9aW50CitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2lnbmFsIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBSRVRTSUdUWVBFICRhY19jdl90eXBlX3NpZ25hbAorRU9GCisKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMzMjQ6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJENZR1dJTjMyIiA9IHllczsgdGhlbgorYW1fY3ZfZXhlZXh0PS5leGUKK2Vsc2UKK2NhdCA+IGFtX2NfdGVzdC5jIDw8ICdFT0YnCitpbnQgbWFpbigpIHsKKy8qIE5vdGhpbmcgbmVlZGVkIGhlcmUgKi8KK30KK0VPRgorJHtDQy1jY30gLW8gYW1fY190ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGFtX2NfdGVzdC5jICRMSUJTIDE+JjUKK2FtX2N2X2V4ZWV4dD1gbHMgYW1fY190ZXN0LiogfCBncmVwIC12IGFtX2NfdGVzdC5jIHwgc2VkIC1lIHMvYW1fY190ZXN0Ly9gCitybSAtZiBhbV9jX3Rlc3QqCitmaQorCit0ZXN0IHgiJHthbV9jdl9leGVleHR9IiA9IHggJiYgYW1fY3ZfZXhlZXh0PW5vCitmaQorRVhFRVhUPSIiCit0ZXN0IHgiJHthbV9jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YW1fY3ZfZXhlZXh0fQorZWNobyAiJGFjX3QiIiR7YW1fY3ZfZXhlZXh0fSIgMT4mNgorCisKK3NpbV9saW5rX2ZpbGVzPQorc2ltX2xpbmtfbGlua3M9CisKK3NpbV9saW5rX2xpbmtzPXRjb25maWcuaAoraWYgdGVzdCAtZiAke3NyY2Rpcn0vdGNvbmZpZy5pbgordGhlbgorICBzaW1fbGlua19maWxlcz10Y29uZmlnLmluCitlbHNlCisgIHNpbV9saW5rX2ZpbGVzPS4uL2NvbW1vbi90Y29uZmlnLmluCitmaQorCisjIHRhcmctdmFscy5kZWYgcG9pbnRzIHRvIHRoZSBsaWJjIG1hY3JvIGRlc2NyaXB0aW9uIGZpbGUuCitjYXNlICIke3RhcmdldH0iIGluCisqLSotKikgVEFSR19WQUxTX0RFRj0uLi9jb21tb24vbmx0dmFscy5kZWYgOzsKK2VzYWMKK3NpbV9saW5rX2ZpbGVzPSIke3NpbV9saW5rX2ZpbGVzfSAke1RBUkdfVkFMU19ERUZ9Igorc2ltX2xpbmtfbGlua3M9IiR7c2ltX2xpbmtfbGlua3N9IHRhcmctdmFscy5kZWYiCisKKworCitmb3IgYWNfaGRyIGluIHVuaXN0ZC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzM3MjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMzNzcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjMzODI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisKKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCithY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAc2ltX2Vudmlyb25tZW50QCUkc2ltX2Vudmlyb25tZW50JWcKK3MlQHNpbV9hbGlnbm1lbnRAJSRzaW1fYWxpZ25tZW50JWcKK3MlQHNpbV9hc3NlcnRAJSRzaW1fYXNzZXJ0JWcKK3MlQHNpbV9iaXRzaXplQCUkc2ltX2JpdHNpemUlZworcyVAc2ltX2VuZGlhbkAlJHNpbV9lbmRpYW4lZworcyVAc2ltX2hvc3RlbmRpYW5AJSRzaW1faG9zdGVuZGlhbiVnCitzJUBzaW1fZmxvYXRAJSRzaW1fZmxvYXQlZworcyVAc2ltX3NjYWNoZUAlJHNpbV9zY2FjaGUlZworcyVAc2ltX2RlZmF1bHRfbW9kZWxAJSRzaW1fZGVmYXVsdF9tb2RlbCVnCitzJUBzaW1faHdfY2ZsYWdzQCUkc2ltX2h3X2NmbGFncyVnCitzJUBzaW1faHdfb2Jqc0AlJHNpbV9od19vYmpzJWcKK3MlQHNpbV9od0AlJHNpbV9odyVnCitzJUBzaW1faW5saW5lQCUkc2ltX2lubGluZSVnCitzJUBzaW1fcGFja2FnZXNAJSRzaW1fcGFja2FnZXMlZworcyVAc2ltX3JlZ3Bhcm1AJSRzaW1fcmVncGFybSVnCitzJUBzaW1fcmVzZXJ2ZWRfYml0c0AlJHNpbV9yZXNlcnZlZF9iaXRzJWcKK3MlQHNpbV9zbXBAJSRzaW1fc21wJWcKK3MlQHNpbV9zdGRjYWxsQCUkc2ltX3N0ZGNhbGwlZworcyVAc2ltX3hvcl9lbmRpYW5AJSRzaW1feG9yX2VuZGlhbiVnCitzJUBidWlsZF93YXJuaW5nc0AlJGJ1aWxkX3dhcm5pbmdzJWcKK3MlQFNIRUxMQCUkU0hFTEwlZworcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBERUZTQCUkREVGUyVnCitzJUBMREZMQUdTQCUkTERGTEFHUyVnCitzJUBMSUJTQCUkTElCUyVnCitzJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKK3MlQHByZWZpeEAlJHByZWZpeCVnCitzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCitzJUBiaW5kaXJAJSRiaW5kaXIlZworcyVAc2JpbmRpckAlJHNiaW5kaXIlZworcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworcyVAZGF0YWRpckAlJGRhdGFkaXIlZworcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZworcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCitzJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCitzJUBsaWJkaXJAJSRsaWJkaXIlZworcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworcyVAaW5mb2RpckAlJGluZm9kaXIlZworcyVAbWFuZGlyQCUkbWFuZGlyJWcKK3MlQGhvc3RAJSRob3N0JWcKK3MlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKK3MlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCitzJUBob3N0X29zQCUkaG9zdF9vcyVnCitzJUB0YXJnZXRAJSR0YXJnZXQlZworcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKK3MlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKK3MlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKK3MlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCitzJUBidWlsZEAlJGJ1aWxkJWcKK3MlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZworcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKK3MlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCitzJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKK3MlQENDQCUkQ0MlZworcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKK3MlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCitzJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZworcyVASERFRklORVNAJSRIREVGSU5FUyVnCitzJUBBUkAlJEFSJWcKK3MlQFJBTkxJQkAlJFJBTkxJQiVnCitzJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKK3MlQENQUEAlJENQUCVnCitzJUBBTExPQ0FAJSRBTExPQ0ElZworcyVAVVNFX05MU0AlJFVTRV9OTFMlZworcyVATVNHRk1UQCUkTVNHRk1UJWcKK3MlQEdNU0dGTVRAJSRHTVNHRk1UJWcKK3MlQFhHRVRURVhUQCUkWEdFVFRFWFQlZworcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCitzJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKK3MlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCitzJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKK3MlQEdNT0ZJTEVTQCUkR01PRklMRVMlZworcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZworcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCitzJUBJTlRMTElCU0AlJElOVExMSUJTJWcKK3MlQElOVExPQkpTQCUkSU5UTE9CSlMlZworcyVAUE9GSUxFU0AlJFBPRklMRVMlZworcyVAUE9TVUJAJSRQT1NVQiVnCitzJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCitzJUBHVF9OT0AlJEdUX05PJWcKK3MlQEdUX1lFU0AlJEdUX1lFUyVnCitzJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCitzJUBsQCUkbCVnCitzJUBNQUlOVEAlJE1BSU5UJWcKK3MlQHNpbV9ic3dhcEAlJHNpbV9ic3dhcCVnCitzJUBzaW1fY2ZsYWdzQCUkc2ltX2NmbGFncyVnCitzJUBzaW1fZGVidWdAJSRzaW1fZGVidWclZworcyVAc2ltX3N0ZGlvQCUkc2ltX3N0ZGlvJWcKK3MlQHNpbV90cmFjZUAlJHNpbV90cmFjZSVnCitzJUBzaW1fcHJvZmlsZUAlJHNpbV9wcm9maWxlJWcKK3MlQEVYRUVYVEAlJEVYRUVYVCVnCisKK0NFT0YKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KK2FjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCithY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19tb3JlX2xpbmVzPToKK2FjX3NlZF9jbWRzPSIiCit3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBmaQorICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCisgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZWxzZQorICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZmkKKyAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKyAgICBhY19iZWc9JGFjX2VuZAorICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgYWNfc2VkX2NtZHM9Y2F0CitmaQorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitDT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKyAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCisgIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCitzJUBJTlNUQUxMQCUkSU5TVEFMTCVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKKyMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyMKKyMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KK2FjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJworYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCithY19kQz0nXDMnCithY19kRD0nJWcnCisjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKK2FjX3VDPScgJworYWNfdUQ9J1w0JWcnCisjIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY19lQj0nJCVcMSNcMmRlZmluZVwzJworYWNfZUM9JyAnCithY19lRD0nJWcnCisKK2lmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmaQorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQorCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0CisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgorCitFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKKyMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKK2NhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKK3MvW1xcJiVdL1xcJi9nCitzJVtcXCRgXSVcXCYlZworcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKK3MlYWNfZCVhY191JWdwCitzJWFjX3UlYWNfZSVncAorRU9GCitzZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCitybSAtZiBjb25mdGVzdC5oZHIKKworIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgorIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCitjYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKK3MlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCitFT0YKKworIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCisjIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgorCitybSAtZiBjb25mdGVzdC50YWlsCit3aGlsZSA6CitkbworICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCisgICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KKyAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQorICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KKyAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCisnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAorICBybSAtZiBjb25mdGVzdC52YWxzCisgIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscworZG9uZQorcm0gLWYgY29uZnRlc3QudmFscworCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAorICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKKyAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCisgICAgcm0gLWYgY29uZnRlc3QuaAorICBlbHNlCisgICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBmaQorICAgIHJtIC1mICRhY19maWxlCisgICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQorICBmaQorZmk7IGRvbmUKKworRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorYWNfc291cmNlcz0iJHNpbV9saW5rX2ZpbGVzIgorYWNfZGVzdHM9IiRzaW1fbGlua19saW5rcyIKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitzcmNkaXI9JGFjX2dpdmVuX3NyY2Rpcgord2hpbGUgdGVzdCAtbiAiJGFjX3NvdXJjZXMiOyBkbworICBzZXQgJGFjX2Rlc3RzOyBhY19kZXN0PSQxOyBzaGlmdDsgYWNfZGVzdHM9JCoKKyAgc2V0ICRhY19zb3VyY2VzOyBhY19zb3VyY2U9JDE7IHNoaWZ0OyBhY19zb3VyY2VzPSQqCisKKyAgZWNobyAibGlua2luZyAkc3JjZGlyLyRhY19zb3VyY2UgdG8gJGFjX2Rlc3QiCisKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3NvdXJjZTsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBGaWxlIG5vdCBmb3VuZCIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCisgIHJtIC1mICRhY19kZXN0CisKKyAgIyBNYWtlIHJlbGF0aXZlIHN5bWxpbmtzLgorICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGVzdF9kaXI9YGVjaG8gJGFjX2Rlc3R8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9ICIkYWNfZGVzdCIgJiYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZGVzdCBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2Rlc3RfZGlyIiAmJiBta2RpciAiJGFjX2Rlc3RfZGlyIgorICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kZXN0X2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGVzdF9kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rlc3RfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkc3JjZGlyIiBpbgorICBbLyRdKikgYWNfcmVsX3NvdXJjZT0iJHNyY2Rpci8kYWNfc291cmNlIiA7OworICAqKSBhY19yZWxfc291cmNlPSIkYWNfZG90cyRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKKyAgZXNhYworCisgICMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGU7IG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsuCisgIGlmIGxuIC1zICRhY19yZWxfc291cmNlICRhY19kZXN0IDI+L2Rldi9udWxsIHx8CisgICAgbG4gJHNyY2Rpci8kYWNfc291cmNlICRhY19kZXN0OyB0aGVuIDoKKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBsaW5rICRhY19kZXN0IHRvICRzcmNkaXIvJGFjX3NvdXJjZSIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitkb25lCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2Nhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgorIHhNYWtlZmlsZSopCisgICBlY2hvICJNZXJnaW5nIE1ha2VmaWxlLnNpbStNYWtlLWNvbW1vbi5zaW0gaW50byBNYWtlZmlsZSAuLi4iCisgICBybSAtZiBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wIE1ha2VmaWxlCisgICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BSRV8vLC9eIyMgRW5kIENPTU1PTl9QUkVfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMS50bXAKKyAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUE9TVF8vLC9eIyMgRW5kIENPTU1PTl9QT1NUXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTIudG1wCisgICBzZWQgLWUgJy9eIyMgQ09NTU9OX1BSRV8vIHIgTWFrZXNpbTEudG1wJyBcCisJLWUgJy9eIyMgQ09NTU9OX1BPU1RfLyByIE1ha2VzaW0yLnRtcCcgXAorCTxNYWtlZmlsZS5zaW0gPk1ha2VmaWxlCisgICBybSAtZiBNYWtlZmlsZS5zaW0gTWFrZS1jb21tb24uc2ltIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAKKyAgIDs7CisgZXNhYworIGNhc2UgIngkQ09ORklHX0hFQURFUlMiIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWMKKworZXhpdCAwCitFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCitybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwordGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisKKwpkaWZmIC0tZ2l0IGEvc2ltL21uMTAyMDAvY29uZmlndXJlLmluIGIvc2ltL21uMTAyMDAvY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzM2IwYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbW4xMDIwMC9jb25maWd1cmUuaW4KQEAgLTAsMCArMSwxMCBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitzaW5jbHVkZSguLi9jb21tb24vYWNsb2NhbC5tNCkKK0FDX1BSRVJFUSgyLjUpZG5sCitBQ19JTklUKE1ha2VmaWxlLmluKQorCitTSU1fQUNfQ09NTU9OCisKK0FDX0NIRUNLX0hFQURFUlModW5pc3RkLmgpCisKK1NJTV9BQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3NpbS9tbjEwMjAwL2dlbmNvZGUuYyBiL3NpbS9tbjEwMjAwL2dlbmNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmE4NzNlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL21uMTAyMDAvZ2VuY29kZS5jCkBAIC0wLDAgKzEsMTU0IEBACisjaW5jbHVkZSAibW4xMDIwMF9zaW0uaCIKKworc3RhdGljIHZvaWQgd3JpdGVfaGVhZGVyIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHdyaXRlX29wY29kZXMgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgd3JpdGVfdGVtcGxhdGUgUEFSQU1TICgodm9pZCkpOworCitpbnQKK21haW4gKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICphcmd2W107Cit7CisgIGlmICgoYXJnYyA+IDEpICYmIChzdHJjbXAgKGFyZ3ZbMV0sICItaCIpID09IDApKQorICAgIHdyaXRlX2hlYWRlcigpOworICBlbHNlIGlmICgoYXJnYyA+IDEpICYmIChzdHJjbXAgKGFyZ3ZbMV0sICItdCIpID09IDApKQorICAgIHdyaXRlX3RlbXBsYXRlICgpOworICBlbHNlCisgICAgd3JpdGVfb3Bjb2RlcygpOworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZAord3JpdGVfaGVhZGVyICgpCit7CisgIHN0cnVjdCBtbjEwMjAwX29wY29kZSAqb3Bjb2RlOworCisgIGZvciAob3Bjb2RlID0gKHN0cnVjdCBtbjEwMjAwX29wY29kZSAqKW1uMTAyMDBfb3Bjb2Rlczsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKKyAgICBwcmludGYoInZvaWQgT1BfJVggUEFSQU1TICgodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZykpO1x0XHQvKiAlcyAqL1xuIiwKKwkgICBvcGNvZGUtPm9wY29kZSwgb3Bjb2RlLT5uYW1lKTsKK30KKworCisvKiB3cml0ZV90ZW1wbGF0ZSBjcmVhdGVzIGEgZmlsZSBhbGwgcmVxdWlyZWQgZnVuY3Rpb25zLCByZWFkeSAqLworLyogdG8gYmUgZmlsbGVkIG91dCAqLworCitzdGF0aWMgdm9pZAord3JpdGVfdGVtcGxhdGUgKCkKK3sKKyAgc3RydWN0IG1uMTAyMDBfb3Bjb2RlICpvcGNvZGU7CisgIGludCBpLGo7CisKKyAgcHJpbnRmICgiI2luY2x1ZGUgXCJtbjEwMjAwX3NpbS5oXCJcbiIpOworICBwcmludGYgKCIjaW5jbHVkZSBcInNpbW9wcy5oXCJcbiIpOworCisgIGZvciAob3Bjb2RlID0gKHN0cnVjdCBtbjEwMjAwX29wY29kZSAqKW1uMTAyMDBfb3Bjb2Rlczsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKKyAgICB7CisgICAgICBwcmludGYoIi8qICVzICovXG52b2lkXG5PUF8lWCAoaW5zbiwgZXh0ZW5zaW9uKVxuICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjtcbntcbiIsIG9wY29kZS0+bmFtZSwgb3Bjb2RlLT5vcGNvZGUpOworCSAgCisgICAgICAvKiBjb3VudCBvcGVyYW5kcyAqLworICAgICAgaiA9IDA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXsKKwkgIGludCBmbGFncyA9IG1uMTAyMDBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3M7CisKKwkgIGlmIChmbGFncykKKwkgICAgaisrOworCX0KKyAgICAgIHN3aXRjaCAoaikKKwl7CisJY2FzZSAwOgorCSAgcHJpbnRmICgicHJpbnRmKFwiICAgJXNcXG5cIik7XG4iLCBvcGNvZGUtPm5hbWUpOworCSAgYnJlYWs7CisJY2FzZSAxOgorCSAgcHJpbnRmICgicHJpbnRmKFwiICAgJXNcXHQlJXhcXG5cIiwgT1BbMF0pO1xuIiwgb3Bjb2RlLT5uYW1lKTsKKwkgIGJyZWFrOworCWNhc2UgMjoKKwkgIHByaW50ZiAoInByaW50ZihcIiAgICVzXFx0JSV4LCUleFxcblwiLE9QWzBdLE9QWzFdKTtcbiIsCisJCSAgb3Bjb2RlLT5uYW1lKTsKKwkgIGJyZWFrOworCWNhc2UgMzoKKwkgIHByaW50ZiAoInByaW50ZihcIiAgICVzXFx0JSV4LCUleCwlJXhcXG5cIixPUFswXSxPUFsxXSxPUFsyXSk7XG4iLAorCQkgIG9wY29kZS0+bmFtZSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgZnByaW50ZiAoc3RkZXJyLCJUb28gbWFueSBvcGVyYW5kczogJWRcbiIsIGopOworCX0KKyAgICAgIHByaW50ZiAoIn1cblxuIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAord3JpdGVfb3Bjb2RlcyAoKQoreworICBzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgKm9wY29kZTsKKyAgaW50IGksIGo7CisgIGludCBudW1vcHM7CisgIAorICAvKiB3cml0ZSBvdXQgb3Bjb2RlIHRhYmxlICovCisgIHByaW50ZiAoIiNpbmNsdWRlIFwibW4xMDIwMF9zaW0uaFwiXG4iKTsKKyAgcHJpbnRmICgiI2luY2x1ZGUgXCJzaW1vcHMuaFwiXG5cbiIpOworICBwcmludGYgKCJzdHJ1Y3Qgc2ltb3BzIFNpbW9wc1tdID0ge1xuIik7CisgIAorICBmb3IgKG9wY29kZSA9IChzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgKiltbjEwMjAwX29wY29kZXM7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCisgICAgeworICAgICAgaW50IHNpemU7CisKKyAgICAgIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfMSkKKwlzaXplID0gMTsKKyAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF8yIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF80KQorCXNpemUgPSAyOworICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzMgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzUpCisJc2l6ZSA9IDM7CisgICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNikKKwlzaXplID0gNDsKKyAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF83KQorCXNpemUgPSA1OworICAgICAgZWxzZQorCWFib3J0ICgpOworCisgICAgICBwcmludGYgKCIgIHsgMHgleCwweCV4LE9QXyVYLCVkLCVkLCIsCisJICAgICAgb3Bjb2RlLT5vcGNvZGUsIG9wY29kZS0+bWFzaywgb3Bjb2RlLT5vcGNvZGUsCisJICAgICAgc2l6ZSwgb3Bjb2RlLT5mb3JtYXQpOworICAgICAgCisgICAgICAvKiBjb3VudCBvcGVyYW5kcyAqLworICAgICAgaiA9IDA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXsKKwkgIGludCBmbGFncyA9IG1uMTAyMDBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3M7CisKKwkgIGlmIChmbGFncykKKwkgICAgaisrOworCX0KKyAgICAgIHByaW50ZiAoIiVkLHsiLGopOworCSAgCisgICAgICBqID0gMDsKKyAgICAgIG51bW9wcyA9IDA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXsKKwkgIGludCBmbGFncyA9IG1uMTAyMDBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3M7CisJICBpbnQgc2hpZnQgPSBtbjEwMjAwX29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLnNoaWZ0OworCisJICBpZiAoZmxhZ3MpCisJICAgIHsKKwkgICAgICBpZiAoaikKKwkJcHJpbnRmICgiLCAiKTsKKwkgICAgICBwcmludGYgKCIlZCwlZCwlZCIsIHNoaWZ0LAorCQkgICAgICBtbjEwMjAwX29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmJpdHMsZmxhZ3MpOworCSAgICAgIGogPSAxOworCSAgICAgIG51bW9wcysrOworCSAgICB9CisJfQorCisgICAgICBzd2l0Y2ggKG51bW9wcykKKwl7CisJY2FzZSAwOgorCSAgcHJpbnRmICgiMCwwLDAiKTsKKwljYXNlIDE6CisJICBwcmludGYgKCIsMCwwLDAiKTsKKwl9CisKKyAgICAgIHByaW50ZiAoIn19LFxuIik7CisgICAgfQorICBwcmludGYgKCJ7IDAsMCxOVUxMLDAsMCwwLHswLDAsMCwwLDAsMH19LFxufTtcbiIpOworfQpkaWZmIC0tZ2l0IGEvc2ltL21uMTAyMDAvaW50ZXJwLmMgYi9zaW0vbW4xMDIwMC9pbnRlcnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjk1YjdjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL21uMTAyMDAvaW50ZXJwLmMKQEAgLTAsMCArMSw4MDAgQEAKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJiZmQuaCIKKworI2luY2x1ZGUgIm1uMTAyMDBfc2ltLmgiCisKK2hvc3RfY2FsbGJhY2sgKm1uMTAyMDBfY2FsbGJhY2s7CitpbnQgbW4xMDIwMF9kZWJ1ZzsKK3N0YXRpYyBTSU1fT1BFTl9LSU5EIHNpbV9raW5kOworc3RhdGljIGNoYXIgKm15bmFtZTsKKworc3RhdGljIHZvaWQgZGlzcGF0Y2ggUEFSQU1TICgodWludDMyLCB1aW50MzIsIGludCkpOworc3RhdGljIGxvbmcgaGFzaCBQQVJBTVMgKChsb25nKSk7CitzdGF0aWMgdm9pZCBpbml0X3N5c3RlbSBQQVJBTVMgKCh2b2lkKSk7CisjZGVmaW5lIE1BWF9IQVNIICAxMjcKKworc3RydWN0IGhhc2hfZW50cnkKK3sKKyAgc3RydWN0IGhhc2hfZW50cnkgKm5leHQ7CisgIGxvbmcgb3Bjb2RlOworICBsb25nIG1hc2s7CisgIHN0cnVjdCBzaW1vcHMgKm9wczsKKyNpZmRlZiBIQVNIX1NUQVQKKyAgdW5zaWduZWQgbG9uZyBjb3VudDsKKyNlbmRpZgorfTsKKworaW50IG1heF9tZW0gPSAwOworc3RydWN0IGhhc2hfZW50cnkgaGFzaF90YWJsZVtNQVhfSEFTSCsxXTsKKworCisvKiBUaGlzIHByb2JhYmx5IGRvZXNuJ3QgZG8gYSB2ZXJ5IGdvb2Qgam9iIGF0IGJ1Y2tldCBmaWxsaW5nLCBidXQKKyAgIGl0J3Mgc2ltcGxlLi4uICovCitzdGF0aWMgSU5MSU5FIGxvbmcgCitoYXNoKGluc24pCisgICAgIGxvbmcgaW5zbjsKK3sKKyAgLyogVGhlc2UgYXJlIG9uZSBieXRlIGluc25zLiAgKi8KKyAgaWYgKChpbnNuICYgMHhmZmZmZmYwMCkgPT0gMHgwMCkKKyAgICB7CisgICAgICBpZiAoKGluc24gJiAweGYwKSAhPSAweDgwKQorCXJldHVybiAoKGluc24gJiAweGYwKSA+PiA0KSAmIDB4N2Y7CisKKyAgICAgIGlmICgoaW5zbiAmIDB4ZjApID09IDB4ODAKKwkgICAmJiAoaW5zbiAmIDB4MGMpID4+IDIgIT0gKGluc24gJiAweDAzKSkKKwlyZXR1cm4gKGluc24gJiAweGYwKSAmIDB4N2Y7CisKKyAgICAgIHJldHVybiAoaW5zbiAmIDB4ZmYpICYgMHg3ZjsKKyAgICB9CisKKyAgaWYgKChpbnNuICYgMHhmZmZmMDAwMCkgPT0gMCkKKyAgICB7CisgICAgICBpZiAoKGluc24gJiAweGYwMDApID09IDB4ZDAwMCkKKwlyZXR1cm4gKChpbnNuICYgMHhmYzAwKSA+PiAxMCkgJiAweDdmOworCisgICAgICBpZiAoKGluc24gJiAweGYwMDApID09IDB4ZTAwMCkKKwlyZXR1cm4gKChpbnNuICYgMHhmZjAwKSA+PiA4KSAmIDB4N2Y7CisKKyAgICAgIGlmICgoaW5zbiAmIDB4ZjIwMCkgPT0gMHhmMjAwKQorCXJldHVybiAoKGluc24gJiAweGZmZjApID4+IDQpICYgMHg3ZjsKKworICAgICAgaWYgKChpbnNuICYgMHhjMDAwKSA9PSAweDQwMDAKKwkgIHx8IChpbnNuICYgMHhmMDAwKSA9PSAweDgwMDApCisJcmV0dXJuICgoaW5zbiAmIDB4ZjAwMCkgPj4gOCkgJiAweDdmOworCisgICAgICBpZiAoKGluc24gJiAweGYyMDApID09IDB4ZjAwMCkKKwlyZXR1cm4gKChpbnNuICYgMHhmZmMwKSA+PiA4KSAmIDB4N2Y7CisKKyAgICAgIHJldHVybiAoKGluc24gJiAweGZmMDApID4+IDgpICYgMHg3ZjsKKyAgICB9CisKKyAgaWYgKChpbnNuICYgMHhmZjAwMDAwMCkgPT0gMCkKKyAgICB7CisKKyAgICAgIGlmICgoaW5zbiAmIDB4ZjAwMDAwKSAhPSAweGYwMDAwMAorCSAgIHx8IChpbnNuICYgMHhmYzAwMDApID09IDB4ZjgwMDAwKQorCXJldHVybiAoKGluc24gJiAweGZjMDAwMCkgPj4gMTYpICYgMHg3ZjsKKworICAgICAgaWYgKChpbnNuICYgMHhmZjAwMDApID09IDB4ZjUwMDAwKQorCXJldHVybiAoKGluc24gJiAweGZmZjAwMCkgPj4gMTIpICYgMHg3ZjsKKyAgICAgIHJldHVybiAoKGluc24gJiAweGZmMDAwMCkgPj4gMTYpICYgMHg3ZjsKKyAgICB9CisKKyAgcmV0dXJuICgoaW5zbiAmIDB4ZmZmMDAwMCkgPj4gMjApICYgMHg3ZjsKK30KKworc3RhdGljIElOTElORSB2b2lkCitkaXNwYXRjaCAoaW5zbiwgZXh0ZW5zaW9uLCBsZW5ndGgpCisgICAgIHVpbnQzMiBpbnNuOworICAgICB1aW50MzIgZXh0ZW5zaW9uOworICAgICBpbnQgbGVuZ3RoOworeworICBzdHJ1Y3QgaGFzaF9lbnRyeSAqaDsKKworICBoID0gJmhhc2hfdGFibGVbaGFzaChpbnNuKV07CisKKyAgd2hpbGUgKChpbnNuICYgaC0+bWFzaykgIT0gaC0+b3Bjb2RlCisJICB8fCAobGVuZ3RoICE9IGgtPm9wcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICBpZiAoIWgtPm5leHQpCisJeworCSAgKCptbjEwMjAwX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChtbjEwMjAwX2NhbGxiYWNrLAorCSAgICAiRVJST1IgbG9va2luZyB1cCBoYXNoIGZvciAweCV4LCBQQz0weCV4XG4iLCBpbnNuLCBQQyk7CisJICBleGl0KDEpOworCX0KKyAgICAgIGggPSBoLT5uZXh0OworICAgIH0KKworCisjaWZkZWYgSEFTSF9TVEFUCisgIGgtPmNvdW50Kys7CisjZW5kaWYKKworICAvKiBOb3cgY2FsbCB0aGUgcmlnaHQgZnVuY3Rpb24uICAqLworICAoaC0+b3BzLT5mdW5jKShpbnNuLCBleHRlbnNpb24pOworICBQQyArPSBsZW5ndGg7Cit9CisKKy8qIEZJWE1FIFRoZXNlIHdvdWxkIG1vcmUgZWZmaWNpZW50IHRvIHVzZSB0aGFuIGxvYWRfbWVtL3N0b3JlX21lbSwKKyAgIGJ1dCBuZWVkIHRvIGJlIGNoYW5nZWQgdG8gdXNlIHRoZSBtZW1vcnkgbWFwLiAgKi8KKwordWludDMyCitnZXRfd29yZCAoeCkKKyAgICAgIHVpbnQ4ICp4OworeworICB1aW50OCAqYSA9IHg7CisgIHJldHVybiAoYVszXTw8MjQpICsgKGFbMl08PDE2KSArIChhWzFdPDw4KSArIChhWzBdKTsKK30KKwordm9pZAorcHV0X3dvcmQgKGFkZHIsIGRhdGEpCisgICAgIHVpbnQ4ICphZGRyOworICAgICB1aW50MzIgZGF0YTsKK3sKKyAgdWludDggKmEgPSBhZGRyOworICBhWzBdID0gZGF0YSAmIDB4ZmY7CisgIGFbMV0gPSAoZGF0YSA+PiA4KSAmIDB4ZmY7CisgIGFbMl0gPSAoZGF0YSA+PiAxNikgJiAweGZmOworICBhWzNdID0gKGRhdGEgPj4gMjQpICYgMHhmZjsKK30KKwordm9pZAorc2ltX3NpemUgKHBvd2VyKQorICAgICBpbnQgcG93ZXI7CisKK3sKKyAgaWYgKFN0YXRlLm1lbSkKKyAgICBmcmVlIChTdGF0ZS5tZW0pOworCisgIG1heF9tZW0gPSAxIDw8IHBvd2VyOworICBTdGF0ZS5tZW0gPSAodWludDggKikgY2FsbG9jICgxLCAgMSA8PCBwb3dlcik7CisgIGlmICghU3RhdGUubWVtKQorICAgIHsKKyAgICAgICgqbW4xMDIwMF9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAobW4xMDIwMF9jYWxsYmFjaywgIkFsbG9jYXRpb24gb2YgbWFpbiBtZW1vcnkgZmFpbGVkLlxuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitpbml0X3N5c3RlbSAoKQoreworICBpZiAoIVN0YXRlLm1lbSkKKyAgICBzaW1fc2l6ZSgxOSk7Cit9CisKK2ludAorc2ltX3dyaXRlIChzZCxhZGRyLCBidWZmZXIsIHNpemUpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBTSU1fQUREUiBhZGRyOworICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgICAgIGludCBzaXplOworeworICBpbnQgaTsKKworICBpbml0X3N5c3RlbSAoKTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHN0b3JlX2J5dGUgKGFkZHIgKyBpLCBidWZmZXJbaV0pOworCisgIHJldHVybiBzaXplOworfQorCisvKiBDb21wYXJlIHR3byBvcGNvZGUgdGFibGUgZW50cmllcyBmb3IgcXNvcnQuICAqLworc3RhdGljIGludAorY29tcGFyZV9zaW1vcHMgKGFyZzEsIGFyZzIpCisgICAgIGNvbnN0IFBUUiBhcmcxOworICAgICBjb25zdCBQVFIgYXJnMjsKK3sKKyAgdW5zaWduZWQgbG9uZyBjb2RlMSA9ICgoc3RydWN0IHNpbW9wcyAqKWFyZzEpLT5vcGNvZGU7CisgIHVuc2lnbmVkIGxvbmcgY29kZTIgPSAoKHN0cnVjdCBzaW1vcHMgKilhcmcyKS0+b3Bjb2RlOworCisgIGlmIChjb2RlMSA8IGNvZGUyKQorICAgIHJldHVybiAtMTsKKyAgaWYgKGNvZGUyIDwgY29kZTEpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitTSU1fREVTQworc2ltX29wZW4gKGtpbmQsIGNiLCBhYmZkLCBhcmd2KQorICAgICBTSU1fT1BFTl9LSU5EIGtpbmQ7CisgICAgIGhvc3RfY2FsbGJhY2sgKmNiOworICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIHN0cnVjdCBzaW1vcHMgKnM7CisgIHN0cnVjdCBoYXNoX2VudHJ5ICpoOworICBjaGFyICoqcDsKKyAgaW50IGk7CisKKyAgbW4xMDIwMF9jYWxsYmFjayA9IGNiOworCisgIC8qIFNvcnQgdGhlIG9wY29kZSBhcnJheSBmcm9tIHNtYWxsZXN0IG9wY29kZSB0byBsYXJnZXN0LgorICAgICBUaGlzIHdpbGwgZ2VuZXJhbGx5IGltcHJvdmUgc2ltdWxhdG9yIHBlcmZvcm1hbmNlIGFzIHRoZSBzbWFsbGVyCisgICAgIG9wY29kZXMgYXJlIGdlbmVyYWxseSBwcmVmZXJyZWQgdG8gdGhlIGxhcmdlciBvcGNvZGVzLiAgKi8KKyAgZm9yIChpID0gMCwgcyA9IFNpbW9wczsgcy0+ZnVuYzsgcysrLCBpKyspCisgICAgOworICBxc29ydCAoU2ltb3BzLCBpLCBzaXplb2YgKFNpbW9wc1swXSksIGNvbXBhcmVfc2ltb3BzKTsKKworICBzaW1fa2luZCA9IGtpbmQ7CisgIG15bmFtZSA9IGFyZ3ZbMF07CisKKyAgZm9yIChwID0gYXJndiArIDE7ICpwOyArK3ApCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoKnAsICItRSIpID09IDApCisJKytwOyAvKiBpZ25vcmUgZW5kaWFuIHNwZWMgKi8KKyAgICAgIGVsc2UKKyNpZmRlZiBERUJVRworICAgICAgaWYgKHN0cmNtcCAoKnAsICItdCIpID09IDApCisJbW4xMDIwMF9kZWJ1ZyA9IERFQlVHOworICAgICAgZWxzZQorI2VuZGlmCisJKCptbjEwMjAwX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChtbjEwMjAwX2NhbGxiYWNrLCAiRVJST1I6IHVuc3VwcG9ydGVkIG9wdGlvbihzKTogJXNcbiIsKnApOworICAgIH0KKworICAvKiBwdXQgYWxsIHRoZSBvcGNvZGVzIGluIHRoZSBoYXNoIHRhYmxlICovCisgIGZvciAocyA9IFNpbW9wczsgcy0+ZnVuYzsgcysrKQorICAgIHsKKyAgICAgIGggPSAmaGFzaF90YWJsZVtoYXNoKHMtPm9wY29kZSldOworICAgICAgCisgICAgICAvKiBnbyB0byB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgY2hhaW4gKi8KKyAgICAgIHdoaWxlIChoLT5uZXh0KQorCXsKKwkgIC8qIERvbid0IGluc2VydCB0aGUgc2FtZSBvcGNvZGUgbW9yZSB0aGFuIG9uY2UuICAqLworCSAgaWYgKGgtPm9wY29kZSA9PSBzLT5vcGNvZGUKKwkgICAgICAmJiBoLT5tYXNrID09IHMtPm1hc2sKKwkgICAgICAmJiBoLT5vcHMgPT0gcykKKwkgICAgYnJlYWs7CisJICBlbHNlCisJICAgIGggPSBoLT5uZXh0OworCX0KKworICAgICAgLyogRG9uJ3QgaW5zZXJ0IHRoZSBzYW1lIG9wY29kZSBtb3JlIHRoYW4gb25jZS4gICovCisgICAgICBpZiAoaC0+b3Bjb2RlID09IHMtPm9wY29kZQorCSAgJiYgaC0+bWFzayA9PSBzLT5tYXNrCisJICAmJiBoLT5vcHMgPT0gcykKKwljb250aW51ZTsKKworICAgICAgaWYgKGgtPm9wcykKKwl7CisJICBoLT5uZXh0ID0gY2FsbG9jKDEsc2l6ZW9mKHN0cnVjdCBoYXNoX2VudHJ5KSk7CisJICBoID0gaC0+bmV4dDsKKwl9CisgICAgICBoLT5vcHMgPSBzOworICAgICAgaC0+bWFzayA9IHMtPm1hc2s7CisgICAgICBoLT5vcGNvZGUgPSBzLT5vcGNvZGU7CisjaWZkZWYgSEFTSF9TVEFUCisgICAgICBoLT5jb3VudCA9IDA7CisjZW5kaWYKKyAgICB9CisKKyAgLyogZnVkZ2Ugb3VyIGRlc2NyaXB0b3IgZm9yIG5vdyAqLworICByZXR1cm4gKFNJTV9ERVNDKSAxOworfQorCisKK3ZvaWQKK3NpbV9zZXRfcHJvZmlsZSAobikKKyAgICAgaW50IG47Cit7CisgICgqbW4xMDIwMF9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAobW4xMDIwMF9jYWxsYmFjaywgInNpbV9zZXRfcHJvZmlsZSAlZFxuIiwgbik7Cit9CisKK3ZvaWQKK3NpbV9zZXRfcHJvZmlsZV9zaXplIChuKQorICAgICBpbnQgbjsKK3sKKyAgKCptbjEwMjAwX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChtbjEwMjAwX2NhbGxiYWNrLCAic2ltX3NldF9wcm9maWxlX3NpemUgJWRcbiIsIG4pOworfQorCitpbnQKK3NpbV9zdG9wIChzZCkKKyAgICAgU0lNX0RFU0Mgc2Q7Cit7CisgIHJldHVybiAwOworfQorCit2b2lkCitzaW1fcmVzdW1lIChzZCwgc3RlcCwgc2lnZ25hbCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCBzdGVwLCBzaWdnbmFsOworeworICB1aW50MzIgaW5zdDsKKworICBpZiAoc3RlcCkKKyAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdUUkFQOworICBlbHNlCisgICAgU3RhdGUuZXhjZXB0aW9uID0gMDsKKworICBTdGF0ZS5leGl0ZWQgPSAwOworCisgIGRvCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247CisKKyAgICAgIC8qIEZldGNoIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLCBmZXRjaCBhIGRvdWJsZSB3b3JkIHRvCisJIGF2b2lkIHJlZHVuZGFudCBmZXRjaGluZyBmb3IgdGhlIGNvbW1vbiBjYXNlcyBiZWxvdy4gICovCisgICAgICBpbnN0ID0gbG9hZF9tZW1fYmlnIChQQywgMik7CisKKyAgICAgIC8qIFVzaW5nIGEgZ2lhbnQgY2FzZSBzdGF0ZW1lbnQgbWF5IHNlZW0gbGlrZSBhIHdhc3RlIGJlY2F1c2Ugb2YgdGhlCisJIGNvZGUvcm9kYXRhIHNpemUgdGhlIHRhYmxlIGl0c2VsZiB3aWxsIGNvbnN1bWUuICBIb3dldmVyLCB1c2luZworCSBhIGdpYW50IGNhc2Ugc3RhdGVtZW50IHNwZWVkcyB1cCB0aGUgc2ltdWxhdG9yIGJ5IDEwLTE1JSBieSBhdm9pZGluZworCSBjYXNjYWRpbmcgaWYvZWxzZSBzdGF0ZW1lbnRzIG9yIGNhc2NhZGluZyBjYXNlIHN0YXRlbWVudHMuICAqLworICAgICAgc3dpdGNoICgoaW5zdCA+PiA4KSAmIDB4ZmYpCisJeworCS8qIEFsbCB0aGUgc2luZ2xlIGJ5dGUgaW5zbnMgZXhjZXB0IDB4ODAsIHdoaWNoIG11c3QKKwkgICBiZSBoYW5kbGVkIHNwZWNpYWxseS4gICovCisJY2FzZSAweDAwOgorCWNhc2UgMHgwMToKKwljYXNlIDB4MDI6CisJY2FzZSAweDAzOgorCWNhc2UgMHgwNDoKKwljYXNlIDB4MDU6CisJY2FzZSAweDA2OgorCWNhc2UgMHgwNzoKKwljYXNlIDB4MDg6CisJY2FzZSAweDA5OgorCWNhc2UgMHgwYToKKwljYXNlIDB4MGI6CisJY2FzZSAweDBjOgorCWNhc2UgMHgwZDoKKwljYXNlIDB4MGU6CisJY2FzZSAweDBmOgorCWNhc2UgMHgxMDoKKwljYXNlIDB4MTE6CisJY2FzZSAweDEyOgorCWNhc2UgMHgxMzoKKwljYXNlIDB4MTQ6CisJY2FzZSAweDE1OgorCWNhc2UgMHgxNjoKKwljYXNlIDB4MTc6CisJY2FzZSAweDE4OgorCWNhc2UgMHgxOToKKwljYXNlIDB4MWE6CisJY2FzZSAweDFiOgorCWNhc2UgMHgxYzoKKwljYXNlIDB4MWQ6CisJY2FzZSAweDFlOgorCWNhc2UgMHgxZjoKKwljYXNlIDB4MjA6CisJY2FzZSAweDIxOgorCWNhc2UgMHgyMjoKKwljYXNlIDB4MjM6CisJY2FzZSAweDI0OgorCWNhc2UgMHgyNToKKwljYXNlIDB4MjY6CisJY2FzZSAweDI3OgorCWNhc2UgMHgyODoKKwljYXNlIDB4Mjk6CisJY2FzZSAweDJhOgorCWNhc2UgMHgyYjoKKwljYXNlIDB4MmM6CisJY2FzZSAweDJkOgorCWNhc2UgMHgyZToKKwljYXNlIDB4MmY6CisJY2FzZSAweDMwOgorCWNhc2UgMHgzMToKKwljYXNlIDB4MzI6CisJY2FzZSAweDMzOgorCWNhc2UgMHgzNDoKKwljYXNlIDB4MzU6CisJY2FzZSAweDM2OgorCWNhc2UgMHgzNzoKKwljYXNlIDB4Mzg6CisJY2FzZSAweDM5OgorCWNhc2UgMHgzYToKKwljYXNlIDB4M2I6CisJY2FzZSAweDNjOgorCWNhc2UgMHgzZDoKKwljYXNlIDB4M2U6CisJY2FzZSAweDNmOgorCWNhc2UgMHg5MDoKKwljYXNlIDB4OTE6CisJY2FzZSAweDkyOgorCWNhc2UgMHg5MzoKKwljYXNlIDB4OTQ6CisJY2FzZSAweDk1OgorCWNhc2UgMHg5NjoKKwljYXNlIDB4OTc6CisJY2FzZSAweDk4OgorCWNhc2UgMHg5OToKKwljYXNlIDB4OWE6CisJY2FzZSAweDliOgorCWNhc2UgMHg5YzoKKwljYXNlIDB4OWQ6CisJY2FzZSAweDllOgorCWNhc2UgMHg5ZjoKKwljYXNlIDB4YTA6CisJY2FzZSAweGExOgorCWNhc2UgMHhhMjoKKwljYXNlIDB4YTM6CisJY2FzZSAweGE0OgorCWNhc2UgMHhhNToKKwljYXNlIDB4YTY6CisJY2FzZSAweGE3OgorCWNhc2UgMHhhODoKKwljYXNlIDB4YTk6CisJY2FzZSAweGFhOgorCWNhc2UgMHhhYjoKKwljYXNlIDB4YWM6CisJY2FzZSAweGFkOgorCWNhc2UgMHhhZToKKwljYXNlIDB4YWY6CisJY2FzZSAweGIwOgorCWNhc2UgMHhiMToKKwljYXNlIDB4YjI6CisJY2FzZSAweGIzOgorCWNhc2UgMHhiNDoKKwljYXNlIDB4YjU6CisJY2FzZSAweGI2OgorCWNhc2UgMHhiNzoKKwljYXNlIDB4Yjg6CisJY2FzZSAweGI5OgorCWNhc2UgMHhiYToKKwljYXNlIDB4YmI6CisJY2FzZSAweGJjOgorCWNhc2UgMHhiZDoKKwljYXNlIDB4YmU6CisJY2FzZSAweGJmOgorICAgICAgICBjYXNlIDB4ZWI6CisJY2FzZSAweGY2OgorCWNhc2UgMHhmZToKKwljYXNlIDB4ZmY6CisJICBpbnNuID0gKGluc3QgPj4gOCkgJiAweGZmOworCSAgZXh0ZW5zaW9uID0gMDsKKwkgIGRpc3BhdGNoIChpbnNuLCBleHRlbnNpb24sIDEpOworCSAgYnJlYWs7CisKKwkvKiBTcGVjaWFsIGNhc2UgYXMgbW92IGRYLGRYIHJlYWxseSBtZWFucyBtb3YgaW1tOCxkWC4gICovCisJY2FzZSAweDgwOgorCWNhc2UgMHg4NToKKwljYXNlIDB4OGE6CisJY2FzZSAweDhmOgorCSAgLyogRmV0Y2ggdGhlIGZ1bGwgaW5zdHJ1Y3Rpb24uICAqLworCSAgaW5zbiA9IGluc3Q7CisJICBleHRlbnNpb24gPSAwOworCSAgZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgMik7CisJICBicmVhazsKKworCWNhc2UgMHg4MToKKwljYXNlIDB4ODI6CisJY2FzZSAweDgzOgorCWNhc2UgMHg4NDoKKwljYXNlIDB4ODY6CisJY2FzZSAweDg3OgorCWNhc2UgMHg4ODoKKwljYXNlIDB4ODk6CisJY2FzZSAweDhiOgorCWNhc2UgMHg4YzoKKwljYXNlIDB4OGQ6CisJY2FzZSAweDhlOgorCSAgaW5zbiA9IChpbnN0ID4+IDgpICYgMHhmZjsKKwkgIGV4dGVuc2lvbiA9IDA7CisJICBkaXNwYXRjaCAoaW5zbiwgZXh0ZW5zaW9uLCAxKTsKKwkgIGJyZWFrOworCisgICAgICAgIC8qIEFuZCB0aGUgdHdvIGJ5dGUgaW5zbnMuICAqLworCWNhc2UgMHg0MDoKKwljYXNlIDB4NDE6CisJY2FzZSAweDQyOgorCWNhc2UgMHg0MzoKKwljYXNlIDB4NDQ6CisJY2FzZSAweDQ1OgorCWNhc2UgMHg0NjoKKwljYXNlIDB4NDc6CisJY2FzZSAweDQ4OgorCWNhc2UgMHg0OToKKwljYXNlIDB4NGE6CisJY2FzZSAweDRiOgorCWNhc2UgMHg0YzoKKwljYXNlIDB4NGQ6CisJY2FzZSAweDRlOgorCWNhc2UgMHg0ZjoKKwljYXNlIDB4NTA6CisJY2FzZSAweDUxOgorCWNhc2UgMHg1MjoKKwljYXNlIDB4NTM6CisJY2FzZSAweDU0OgorCWNhc2UgMHg1NToKKwljYXNlIDB4NTY6CisJY2FzZSAweDU3OgorCWNhc2UgMHg1ODoKKwljYXNlIDB4NTk6CisJY2FzZSAweDVhOgorCWNhc2UgMHg1YjoKKwljYXNlIDB4NWM6CisJY2FzZSAweDVkOgorCWNhc2UgMHg1ZToKKwljYXNlIDB4NWY6CisJY2FzZSAweDYwOgorCWNhc2UgMHg2MToKKwljYXNlIDB4NjI6CisJY2FzZSAweDYzOgorCWNhc2UgMHg2NDoKKwljYXNlIDB4NjU6CisJY2FzZSAweDY2OgorCWNhc2UgMHg2NzoKKwljYXNlIDB4Njg6CisJY2FzZSAweDY5OgorCWNhc2UgMHg2YToKKwljYXNlIDB4NmI6CisJY2FzZSAweDZjOgorCWNhc2UgMHg2ZDoKKwljYXNlIDB4NmU6CisJY2FzZSAweDZmOgorCWNhc2UgMHg3MDoKKwljYXNlIDB4NzE6CisJY2FzZSAweDcyOgorCWNhc2UgMHg3MzoKKwljYXNlIDB4NzQ6CisJY2FzZSAweDc1OgorCWNhc2UgMHg3NjoKKwljYXNlIDB4Nzc6CisJY2FzZSAweDc4OgorCWNhc2UgMHg3OToKKwljYXNlIDB4N2E6CisJY2FzZSAweDdiOgorCWNhc2UgMHg3YzoKKwljYXNlIDB4N2Q6CisJY2FzZSAweDdlOgorCWNhc2UgMHg3ZjoKKwljYXNlIDB4ZDA6CisJY2FzZSAweGQxOgorCWNhc2UgMHhkMjoKKwljYXNlIDB4ZDM6CisJY2FzZSAweGQ0OgorCWNhc2UgMHhkNToKKwljYXNlIDB4ZDY6CisJY2FzZSAweGQ3OgorCWNhc2UgMHhkODoKKwljYXNlIDB4ZDk6CisJY2FzZSAweGRhOgorCWNhc2UgMHhkYjoKKwljYXNlIDB4ZTA6CisJY2FzZSAweGUxOgorCWNhc2UgMHhlMjoKKwljYXNlIDB4ZTM6CisJY2FzZSAweGU0OgorCWNhc2UgMHhlNToKKwljYXNlIDB4ZTY6CisJY2FzZSAweGU3OgorCWNhc2UgMHhlODoKKwljYXNlIDB4ZTk6CisJY2FzZSAweGVhOgorCWNhc2UgMHhmMDoKKwljYXNlIDB4ZjE6CisJY2FzZSAweGYyOgorCWNhc2UgMHhmMzoKKwkgIC8qIEZldGNoIHRoZSBmdWxsIGluc3RydWN0aW9uLiAgKi8KKwkgIGluc24gPSBpbnN0OworCSAgZXh0ZW5zaW9uID0gMDsKKwkgIGRpc3BhdGNoIChpbnNuLCBleHRlbnNpb24sIDIpOworCSAgYnJlYWs7CisKKwkvKiBBbmQgdGhlIDMgYnl0ZSBpbnNucyB3aXRoIGEgMTZiaXQgb3BlcmFuZCBpbiBsaXR0bGUKKwkgICBlbmRpYW4gZm9ybWF0LiAgKi8KKwljYXNlIDB4YzA6CisJY2FzZSAweGMxOgorCWNhc2UgMHhjMjoKKwljYXNlIDB4YzM6CisJY2FzZSAweGM0OgorCWNhc2UgMHhjNToKKwljYXNlIDB4YzY6CisJY2FzZSAweGM3OgorCWNhc2UgMHhjODoKKwljYXNlIDB4Yzk6CisJY2FzZSAweGNhOgorCWNhc2UgMHhjYjoKKwljYXNlIDB4Y2M6CisJY2FzZSAweGNkOgorCWNhc2UgMHhjZToKKwljYXNlIDB4Y2Y6CisJY2FzZSAweGRjOgorCWNhc2UgMHhkZDoKKwljYXNlIDB4ZGU6CisJY2FzZSAweGRmOgorCWNhc2UgMHhlYzoKKwljYXNlIDB4ZWQ6CisJY2FzZSAweGVlOgorCWNhc2UgMHhlZjoKKwljYXNlIDB4Zjg6CisJY2FzZSAweGY5OgorCWNhc2UgMHhmYToKKwljYXNlIDB4ZmI6CisJY2FzZSAweGZjOgorCWNhc2UgMHhmZDoKKwkgIGluc24gPSBsb2FkX2J5dGUgKFBDKTsKKwkgIGluc24gPDw9IDE2OworCSAgaW5zbiB8PSBsb2FkX2hhbGYgKFBDICsgMSk7CisJICBleHRlbnNpb24gPSAwOworCSAgZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgMyk7CisJICBicmVhazsKKworCS8qIDMgYnl0ZSBpbnNucyB3aXRob3V0IDE2Yml0IG9wZXJhbmQuICAqLworCWNhc2UgMHhmNToKKwkgIGluc24gPSBsb2FkX21lbV9iaWcgKFBDLCAzKTsKKwkgIGV4dGVuc2lvbiA9IDA7CisJICBkaXNwYXRjaCAoaW5zbiwgZXh0ZW5zaW9uLCAzKTsKKwkgIGJyZWFrOworCisJLyogNCBieXRlIGluc25zLiAgKi8KKwljYXNlIDB4Zjc6CisJICBpbnNuID0gaW5zdDsKKwkgIGluc24gPDw9IDE2OworCSAgaW5zbiB8PSBsb2FkX2hhbGYgKFBDICsgMik7CisJICBleHRlbnNpb24gPSAwOworCSAgZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgNCk7CisJICBicmVhazsKKworCWNhc2UgMHhmNDoKKwkgIGluc24gPSBpbnN0OworCSAgaW5zbiA8PD0gMTY7CisJICBpbnNuIHw9IGxvYWRfbWVtX2JpZyAoUEMgKyA0LCAxKSA8PCA4OworCSAgaW5zbiB8PSBsb2FkX21lbV9iaWcgKFBDICsgMywgMSk7CisJICBleHRlbnNpb24gPSBsb2FkX21lbV9iaWcgKFBDICsgMiwgMSk7CisJICBkaXNwYXRjaCAoaW5zbiwgZXh0ZW5zaW9uLCA1KTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIGFib3J0ICgpOworICAgICAgICB9CisgICAgfQorICB3aGlsZSAoIVN0YXRlLmV4Y2VwdGlvbik7CisKKyNpZmRlZiBIQVNIX1NUQVQKKyAgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfSEFTSDsgaSsrKQorICAgICAgeworICAgICAgICBzdHJ1Y3QgaGFzaF9lbnRyeSAqaDsKKwloID0gJmhhc2hfdGFibGVbaV07CisKKwlwcmludGYoImhhc2ggMHgleDpcbiIsIGkpOworCisJd2hpbGUgKGgpCisJICB7CisJICAgIHByaW50ZigiaC0+b3Bjb2RlID0gMHgleCwgY291bnQgPSAweCV4XG4iLCBoLT5vcGNvZGUsIGgtPmNvdW50KTsKKwkgICAgaCA9IGgtPm5leHQ7CisJICB9CisKKwlwcmludGYoIlxuXG4iKTsKKyAgICAgIH0KKyAgICBmZmx1c2ggKHN0ZG91dCk7CisgIH0KKyNlbmRpZgorICAKK30KKworCit2b2lkCitzaW1fY2xvc2UgKHNkLCBxdWl0dGluZykKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCBxdWl0dGluZzsKK3sKKyAgLyogbm90aGluZyB0byBkbyAqLworfQorCitpbnQKK3NpbV90cmFjZSAoc2QpCisgICAgIFNJTV9ERVNDIHNkOworeworI2lmZGVmIERFQlVHCisgIG1uMTAyMDBfZGVidWcgPSBERUJVRzsKKyNlbmRpZgorICBzaW1fcmVzdW1lIChzZCwgMCwgMCk7CisgIHJldHVybiAxOworfQorCit2b2lkCitzaW1faW5mbyAoc2QsIHZlcmJvc2UpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgdmVyYm9zZTsKK3sKKyAgKCptbjEwMjAwX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChtbjEwMjAwX2NhbGxiYWNrLCAic2ltX2luZm9cbiIpOworfQorCitTSU1fUkMKK3NpbV9jcmVhdGVfaW5mZXJpb3IgKHNkLCBhYmZkLCBhcmd2LCBlbnYpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKKyAgICAgY2hhciAqKmFyZ3Y7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGlmIChhYmZkICE9IE5VTEwpCisgICAgUEMgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOworICBlbHNlCisgICAgUEMgPSAwOworICByZXR1cm4gU0lNX1JDX09LOworfQorCit2b2lkCitzaW1fc2V0X2NhbGxiYWNrcyAocCkKKyAgICAgaG9zdF9jYWxsYmFjayAqcDsKK3sKKyAgbW4xMDIwMF9jYWxsYmFjayA9IHA7Cit9CisKKy8qIEFsbCB0aGUgY29kZSBmb3IgZXhpdGluZywgc2lnbmFscywgZXRjIG5lZWRzIHRvIGJlIHJldmFtcGVkLgorCisgICBUaGlzIGlzIGVub3VnaCB0byBnZXQgYy10b3J0dXJlIGxpbXBpbmcgdGhvdWdoLiAgKi8KKwordm9pZAorc2ltX3N0b3BfcmVhc29uIChzZCwgcmVhc29uLCBzaWdyYykKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGVudW0gc2ltX3N0b3AgKnJlYXNvbjsKKyAgICAgaW50ICpzaWdyYzsKK3sKKyAgaWYgKFN0YXRlLmV4aXRlZCkKKyAgICAqcmVhc29uID0gc2ltX2V4aXRlZDsKKyAgZWxzZQorICAgICpyZWFzb24gPSBzaW1fc3RvcHBlZDsKKyAgaWYgKFN0YXRlLmV4Y2VwdGlvbiA9PSBTSUdRVUlUKQorICAgICpzaWdyYyA9IDA7CisgIGVsc2UKKyAgICAqc2lncmMgPSBTdGF0ZS5leGNlcHRpb247Cit9CisKK2ludAorc2ltX2ZldGNoX3JlZ2lzdGVyIChzZCwgcm4sIG1lbW9yeSwgbGVuZ3RoKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgaW50IHJuOworICAgICB1bnNpZ25lZCBjaGFyICptZW1vcnk7CisgICAgIGludCBsZW5ndGg7Cit7CisgIHB1dF93b3JkIChtZW1vcnksIFN0YXRlLnJlZ3Nbcm5dKTsKKyAgcmV0dXJuIC0xOworfQorIAoraW50CitzaW1fc3RvcmVfcmVnaXN0ZXIgKHNkLCBybiwgbWVtb3J5LCBsZW5ndGgpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgcm47CisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgU3RhdGUucmVnc1tybl0gPSBnZXRfd29yZCAobWVtb3J5KTsKKyAgcmV0dXJuIC0xOworfQorCitpbnQKK3NpbV9yZWFkIChzZCwgYWRkciwgYnVmZmVyLCBzaXplKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgU0lNX0FERFIgYWRkcjsKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICAgICBpbnQgc2l6ZTsKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgYnVmZmVyW2ldID0gbG9hZF9ieXRlIChhZGRyICsgaSk7CisKKyAgcmV0dXJuIHNpemU7Cit9IAorCit2b2lkCitzaW1fZG9fY29tbWFuZCAoc2QsIGNtZCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGNoYXIgKmNtZDsKK3sKKyAgKCptbjEwMjAwX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChtbjEwMjAwX2NhbGxiYWNrLCAiXCIlc1wiIGlzIG5vdCBhIHZhbGlkIG1uMTAyMDAgc2ltdWxhdG9yIGNvbW1hbmQuXG4iLCBjbWQpOworfQorCitTSU1fUkMKK3NpbV9sb2FkIChzZCwgcHJvZywgYWJmZCwgZnJvbV90dHkpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBjaGFyICpwcm9nOworICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZXh0ZXJuIGJmZCAqc2ltX2xvYWRfZmlsZSAoKTsgLyogPz8/IERvbid0IGtub3cgd2hlcmUgdGhpcyBzaG91bGQgbGl2ZS4gICovCisgIGJmZCAqcHJvZ19iZmQ7CisKKyAgcHJvZ19iZmQgPSBzaW1fbG9hZF9maWxlIChzZCwgbXluYW1lLCBtbjEwMjAwX2NhbGxiYWNrLCBwcm9nLCBhYmZkLAorCQkJICAgIHNpbV9raW5kID09IFNJTV9PUEVOX0RFQlVHLAorCQkJICAgIDAsIHNpbV93cml0ZSk7CisgIGlmIChwcm9nX2JmZCA9PSBOVUxMKQorICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKyAgaWYgKGFiZmQgPT0gTlVMTCkKKyAgICBiZmRfY2xvc2UgKHByb2dfYmZkKTsKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30gCmRpZmYgLS1naXQgYS9zaW0vbW4xMDIwMC9tbjEwMjAwX3NpbS5oIGIvc2ltL21uMTAyMDAvbW4xMDIwMF9zaW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2I3YzRkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL21uMTAyMDAvbW4xMDIwMF9zaW0uaApAQCAtMCwwICsxLDI5NyBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAib3Bjb2RlL21uMTAyMDAuaCIKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJyZW1vdGUtc2ltLmgiCisKKyNpZm5kZWYgSU5MSU5FCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgSU5MSU5FIGlubGluZQorI2Vsc2UKKyNkZWZpbmUgSU5MSU5FCisjZW5kaWYKKyNlbmRpZgorCitleHRlcm4gaG9zdF9jYWxsYmFjayAqbW4xMDIwMF9jYWxsYmFjazsKKworI2RlZmluZSBERUJVR19UUkFDRQkJMHgwMDAwMDAwMQorI2RlZmluZSBERUJVR19WQUxVRVMJCTB4MDAwMDAwMDIKKworZXh0ZXJuIGludCBtbjEwMjAwX2RlYnVnOworCisjaWZkZWYgX19TVERDX18KKyNkZWZpbmUgU0lHTkVEIHNpZ25lZAorI2Vsc2UKKyNkZWZpbmUgU0lHTkVECisjZW5kaWYKKworI2lmIFVDSEFSX01BWCA9PSAyNTUKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50ODsKK3R5cGVkZWYgU0lHTkVEIGNoYXIgaW50ODsKKyNlbHNlCitlcnJvciAiQ2hhciBpcyBub3QgYW4gOC1iaXQgdHlwZSIKKyNlbmRpZgorCisjaWYgU0hSVF9NQVggPT0gMzI3NjcKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2OwordHlwZWRlZiBTSUdORUQgc2hvcnQgaW50MTY7CisjZWxzZQorZXJyb3IgIlNob3J0IGlzIG5vdCBhIDE2LWJpdCB0eXBlIgorI2VuZGlmCisKKyNpZiBJTlRfTUFYID09IDIxNDc0ODM2NDcKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyOwordHlwZWRlZiBTSUdORUQgaW50IGludDMyOworCisjZWxzZQorIyAgaWYgTE9OR19NQVggPT0gMjE0NzQ4MzY0NworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludDMyOwordHlwZWRlZiBTSUdORUQgbG9uZyBpbnQzMjsKKworIyAgZWxzZQorICBlcnJvciAiTmVpdGhlciBpbnQgbm9yIGxvbmcgaXMgYSAzMi1iaXQgdHlwZSIKKyMgIGVuZGlmCisjZW5kaWYKKwordHlwZWRlZiB1aW50MzIgcmVnX3Q7CisKK3N0cnVjdCBzaW1vcHMgCit7CisgIGxvbmcgb3Bjb2RlOworICBsb25nIG1hc2s7CisgIHZvaWQgKCpmdW5jKSgpOworICBpbnQgbGVuZ3RoOworICBpbnQgZm9ybWF0OworICBpbnQgbnVtb3BzOworICBpbnQgb3BlcmFuZHNbMTZdOworfTsKKworLyogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHByb2Nlc3NvcjsgcmVnaXN0ZXJzLCBtZW1vcnksIGV0Yy4gICovCisKK3N0cnVjdCBfc3RhdGUKK3sKKyAgcmVnX3QgcmVnc1sxMV07CQkvKiByZWdpc3RlcnMsIGQwLWQzLCBhMC1hMywgcGMsIG1kciwgcHN3ICovCisgIHVpbnQ4ICptZW07CQkJLyogbWFpbiBtZW1vcnkgKi8KKyAgaW50IGV4Y2VwdGlvbjsJCS8qIEFjdHVhbGx5IGEgc2lnbmFsIG51bWJlci4gICovCisgIGludCBleGl0ZWQ7CQkJLyogRGlkIHRoZSBwcm9ncmFtIGV4aXQ/ICovCit9IFN0YXRlOworCitleHRlcm4gdWludDMyIE9QWzRdOworZXh0ZXJuIHN0cnVjdCBzaW1vcHMgU2ltb3BzW107CisKKyNkZWZpbmUgUEMJKFN0YXRlLnJlZ3NbOF0pCisKKyNkZWZpbmUgUFNXIChTdGF0ZS5yZWdzWzEwXSkKKyNkZWZpbmUgUFNXX1pGIDB4MQorI2RlZmluZSBQU1dfTkYgMHgyCisjZGVmaW5lIFBTV19DRiAweDQKKyNkZWZpbmUgUFNXX1ZGIDB4OAorI2RlZmluZSBQU1dfWlggMHgxMAorI2RlZmluZSBQU1dfTlggMHgyMAorI2RlZmluZSBQU1dfQ1ggMHg0MAorI2RlZmluZSBQU1dfVlggMHg4MAorCisjZGVmaW5lIFJFR19EMCAwCisjZGVmaW5lIFJFR19BMCA0CisjZGVmaW5lIFJFR19TUCA3CisjZGVmaW5lIFJFR19QQyA4CisjZGVmaW5lIFJFR19NRFIgOQorI2RlZmluZSBSRUdfUFNXIDEwCisKKyNkZWZpbmUgU0VYVDMoeCkJKCgoKHgpJjB4NyleKH4weDMpKSsweDQpCQorCisvKiBzaWduLWV4dGVuZCBhIDQtYml0IG51bWJlciAqLworI2RlZmluZSBTRVhUNCh4KQkoKCgoeCkmMHhmKV4ofjB4NykpKzB4OCkJCisKKy8qIHNpZ24tZXh0ZW5kIGEgNS1iaXQgbnVtYmVyICovCisjZGVmaW5lIFNFWFQ1KHgpCSgoKCh4KSYweDFmKV4ofjB4ZikpKzB4MTApCQorCisvKiBzaWduLWV4dGVuZCBhbiA4LWJpdCBudW1iZXIgKi8KKyNkZWZpbmUgU0VYVDgoeCkJKCgoKHgpJjB4ZmYpXih+MHg3ZikpKzB4ODApCisKKy8qIHNpZ24tZXh0ZW5kIGEgOS1iaXQgbnVtYmVyICovCisjZGVmaW5lIFNFWFQ5KHgpCSgoKCh4KSYweDFmZileKH4weGZmKSkrMHgxMDApCisKKy8qIHNpZ24tZXh0ZW5kIGEgMTYtYml0IG51bWJlciAqLworI2RlZmluZSBTRVhUMTYoeCkJKCgoKHgpJjB4ZmZmZileKH4weDdmZmYpKSsweDgwMDApCisKKy8qIHNpZ24tZXh0ZW5kIGEgMjItYml0IG51bWJlciAqLworI2RlZmluZSBTRVhUMjIoeCkJKCgoKHgpJjB4M2ZmZmZmKV4ofjB4MWZmZmZmKSkrMHgyMDAwMDApCisKKy8qIHNpZ24tZXh0ZW5kIGEgMjQtYml0IG51bWJlciAqLworI2RlZmluZSBTRVhUMjQoeCkJKCgoKHgpJjB4ZmZmZmZmKV4ofjB4N2ZmZmZmKSkrMHg4MDAwMDApCisKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgU0lHVFJBUCA1CisjZGVmaW5lIFNJR1FVSVQgMworI2VuZGlmCisKK2V4dGVybiBpbnQgbWF4X21lbTsKKworI2RlZmluZSBsb2FkX21lbV9iaWcoYWRkcixsZW4pIFwKKyAgKGxlbiA9PSAxID8gKigoKGFkZHIpICYgMHhmZmZmZmYpICsgU3RhdGUubWVtKSA6IFwKKyAgIGxlbiA9PSAyID8gKCgqKCgoYWRkcikgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW0pIDw8IDgpIFwKKwkgICAgICAgfCAqKCgoKGFkZHIpICsgMSkgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW0pKSA6IFwKKyAgIAkgICAgICAoKCooKChhZGRyKSAmIDB4ZmZmZmZmKSArIFN0YXRlLm1lbSkgPDwgMTYpIFwKKwkgICAgICAgfCAoKigoKChhZGRyKSArIDEpICYgMHhmZmZmZmYpICsgU3RhdGUubWVtKSA8PCA4KSBcCisJICAgICAgIHwgKigoKChhZGRyKSArIDIpICYgMHhmZmZmZmYpICsgU3RhdGUubWVtKSkpCisKK3N0YXRpYyBJTkxJTkUgdWludDMyCitsb2FkX2J5dGUgKGFkZHIpCisgICAgIFNJTV9BRERSIGFkZHI7Cit7CisgIHVpbnQ4ICpwID0gKGFkZHIgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW07CisKKyNpZmRlZiBDSEVDS19BRERSCisgIGlmICgoYWRkciAmIDB4ZmZmZmZmKSA+IG1heF9tZW0pCisgICAgYWJvcnQgKCk7CisjZW5kaWYKKworICByZXR1cm4gcFswXTsKK30KKworc3RhdGljIElOTElORSB1aW50MzIKK2xvYWRfaGFsZiAoYWRkcikKKyAgICAgU0lNX0FERFIgYWRkcjsKK3sKKyAgdWludDggKnAgPSAoYWRkciAmIDB4ZmZmZmZmKSArIFN0YXRlLm1lbTsKKworI2lmZGVmIENIRUNLX0FERFIKKyAgaWYgKChhZGRyICYgMHhmZmZmZmYpID4gbWF4X21lbSkKKyAgICBhYm9ydCAoKTsKKyNlbmRpZgorCisgIHJldHVybiBwWzFdIDw8IDggfCBwWzBdOworfQorCitzdGF0aWMgSU5MSU5FIHVpbnQzMgorbG9hZF8zX2J5dGUgKGFkZHIpCisgICAgIFNJTV9BRERSIGFkZHI7Cit7CisgIHVpbnQ4ICpwID0gKGFkZHIgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW07CisKKyNpZmRlZiBDSEVDS19BRERSCisgIGlmICgoYWRkciAmIDB4ZmZmZmZmKSA+IG1heF9tZW0pCisgICAgYWJvcnQgKCk7CisjZW5kaWYKKworICByZXR1cm4gcFsyXSA8PCAxNiB8IHBbMV0gPDwgOCB8IHBbMF07Cit9CisKK3N0YXRpYyBJTkxJTkUgdWludDMyCitsb2FkX3dvcmQgKGFkZHIpCisgICAgIFNJTV9BRERSIGFkZHI7Cit7CisgIHVpbnQ4ICpwID0gKGFkZHIgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW07CisKKyNpZmRlZiBDSEVDS19BRERSCisgIGlmICgoYWRkciAmIDB4ZmZmZmZmKSA+IG1heF9tZW0pCisgICAgYWJvcnQgKCk7CisjZW5kaWYKKworICByZXR1cm4gcFszXSA8PCAyNCB8IHBbMl0gPDwgMTYgfCBwWzFdIDw8IDggfCBwWzBdOworfQorCitzdGF0aWMgSU5MSU5FIHVpbnQzMgorbG9hZF9tZW0gKGFkZHIsIGxlbikKKyAgICAgU0lNX0FERFIgYWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgdWludDggKnAgPSAoYWRkciAmIDB4ZmZmZmZmKSArIFN0YXRlLm1lbTsKKworI2lmZGVmIENIRUNLX0FERFIKKyAgaWYgKChhZGRyICYgMHhmZmZmZmYpID4gbWF4X21lbSkKKyAgICBhYm9ydCAoKTsKKyNlbmRpZgorCisgIHN3aXRjaCAobGVuKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gcFswXTsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gcFsxXSA8PCA4IHwgcFswXTsKKyAgICBjYXNlIDM6CisgICAgICByZXR1cm4gcFsyXSA8PCAxNiB8IHBbMV0gPDwgOCB8IHBbMF07CisgICAgY2FzZSA0OgorICAgICAgcmV0dXJuIHBbM10gPDwgMjQgfCBwWzJdIDw8IDE2IHwgcFsxXSA8PCA4IHwgcFswXTsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCitzdGF0aWMgSU5MSU5FIHZvaWQKK3N0b3JlX2J5dGUgKGFkZHIsIGRhdGEpCisgICAgIFNJTV9BRERSIGFkZHI7CisgICAgIHVpbnQzMiBkYXRhOworeworICB1aW50OCAqcCA9IChhZGRyICYgMHhmZmZmZmYpICsgU3RhdGUubWVtOworCisjaWZkZWYgQ0hFQ0tfQUREUgorICBpZiAoKGFkZHIgJiAweGZmZmZmZikgPiBtYXhfbWVtKQorICAgIGFib3J0ICgpOworI2VuZGlmCisKKyAgcFswXSA9IGRhdGE7Cit9CisKK3N0YXRpYyBJTkxJTkUgdm9pZAorc3RvcmVfaGFsZiAoYWRkciwgZGF0YSkKKyAgICAgU0lNX0FERFIgYWRkcjsKKyAgICAgdWludDMyIGRhdGE7Cit7CisgIHVpbnQ4ICpwID0gKGFkZHIgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW07CisKKyNpZmRlZiBDSEVDS19BRERSCisgIGlmICgoYWRkciAmIDB4ZmZmZmZmKSA+IG1heF9tZW0pCisgICAgYWJvcnQgKCk7CisjZW5kaWYKKworICBwWzBdID0gZGF0YTsKKyAgcFsxXSA9IGRhdGEgPj4gODsKK30KKworc3RhdGljIElOTElORSB2b2lkCitzdG9yZV8zX2J5dGUgKGFkZHIsIGRhdGEpCisgICAgIFNJTV9BRERSIGFkZHI7CisgICAgIHVpbnQzMiBkYXRhOworeworICB1aW50OCAqcCA9IChhZGRyICYgMHhmZmZmZmYpICsgU3RhdGUubWVtOworCisjaWZkZWYgQ0hFQ0tfQUREUgorICBpZiAoKGFkZHIgJiAweGZmZmZmZikgPiBtYXhfbWVtKQorICAgIGFib3J0ICgpOworI2VuZGlmCisKKyAgcFswXSA9IGRhdGE7CisgIHBbMV0gPSBkYXRhID4+IDg7CisgIHBbMl0gPSBkYXRhID4+IDE2OworfQorCitzdGF0aWMgSU5MSU5FIHZvaWQKK3N0b3JlX3dvcmQgKGFkZHIsIGRhdGEpCisgICAgIFNJTV9BRERSIGFkZHI7CisgICAgIHVpbnQzMiBkYXRhOworeworICB1aW50OCAqcCA9IChhZGRyICYgMHhmZmZmZmYpICsgU3RhdGUubWVtOworCisjaWZkZWYgQ0hFQ0tfQUREUgorICBpZiAoKGFkZHIgJiAweGZmZmZmZikgPiBtYXhfbWVtKQorICAgIGFib3J0ICgpOworI2VuZGlmCisKKyAgcFswXSA9IGRhdGE7CisgIHBbMV0gPSBkYXRhID4+IDg7CisgIHBbMl0gPSBkYXRhID4+IDE2OworICBwWzNdID0gZGF0YSA+PiAyNDsKK30KKworLyogRnVuY3Rpb24gZGVjbGFyYXRpb25zLiAgKi8KKwordWludDMyIGdldF93b3JkIFBBUkFNUyAoKHVpbnQ4ICopKTsKK3ZvaWQgcHV0X3dvcmQgUEFSQU1TICgodWludDggKiwgdWludDMyKSk7CisKK2V4dGVybiB1aW50OCAqbWFwIFBBUkFNUyAoKFNJTV9BRERSIGFkZHIpKTsKZGlmZiAtLWdpdCBhL3NpbS9tbjEwMjAwL3NpbW9wcy5jIGIvc2ltL21uMTAyMDAvc2ltb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNjZWNjYQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tbjEwMjAwL3NpbW9wcy5jCkBAIC0wLDAgKzEsMjQ0OSBAQAorI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSAibW4xMDIwMF9zaW0uaCIKKyNpbmNsdWRlICJzaW1vcHMuaCIKKyNpbmNsdWRlICJ0YXJnLXZhbHMuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2RlZmluZSBSRUcwKFgpICgoWCkgJiAweDMpCisjZGVmaW5lIFJFRzEoWCkgKCgoWCkgJiAweGMpID4+IDIpCisjZGVmaW5lIFJFRzBfNChYKSAoKChYKSAmIDB4MzApID4+IDQpCisjZGVmaW5lIFJFRzBfOChYKSAoKChYKSAmIDB4MzAwKSA+PiA4KQorI2RlZmluZSBSRUcxXzgoWCkgKCgoWCkgJiAweGMwMCkgPj4gMTApCisjZGVmaW5lIFJFRzBfMTYoWCkgKCgoWCkgJiAweDMwMDAwKSA+PiAxNikKKyNkZWZpbmUgUkVHMV8xNihYKSAoKChYKSAmIDB4YzAwMDApID4+IDE4KQorI2RlZmluZSBUUlVOQyhYKSAoKFgpICYgMHhmZmZmZmYpCisMCisvKiBtb3YgaW1tOCwgZG4gKi8KK3ZvaWQgT1BfODAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSA9IFNFWFQ4IChpbnNuICYgMHhmZik7Cit9CisKKy8qIG1vdiBkbiwgZG0gKi8KK3ZvaWQgT1BfODAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07Cit9CisKKy8qIG1vdiBkbSwgYW4gKi8KK3ZvaWQgT1BfRjIzMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0gPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKK30KKworLyogbW92IGFuLCBkbSAqLwordm9pZCBPUF9GMkYwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildOworfQorCisvKiBtb3YgYW4sIGFtICovCit2b2lkIE9QX0YyNzAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV07Cit9CisKKy8qIG1vdiBwc3csIGRuICovCit2b2lkIE9QX0YzRjAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gUFNXICYgMHhmZmZmOworfQorCisvKiBtb3YgZG4sIHBzdyAqLwordm9pZCBPUF9GM0QwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBQU1cgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSAmIDB4ZmZmZiA7Cit9CisKKy8qIG1vdiBtZHIsIGRuICovCit2b2lkIE9QX0YzRTAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gU3RhdGUucmVnc1tSRUdfTURSXSAmIDB4ZmZmZjsKK30KKworLyogbW92IGRuLCBtZHIgKi8KK3ZvaWQgT1BfRjNDMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfTURSXSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildICYgMHhmZmZmOworfQorCisvKiBtb3YgKGFuKSwgZG0gKi8KK3ZvaWQgT1BfMjAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildCisgICAgPSBTRVhUMTYgKGxvYWRfaGFsZiAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV0pKTsKK30KKworLyogbW92IChkOCxhbiksIGRtICovCit2b2lkIE9QXzYwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0KKyAgICA9IFNFWFQxNiAobG9hZF9oYWxmICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzggKGluc24pXQorCQkJICsgU0VYVDggKGluc24gJiAweGZmKSkpKTsKK30KKworLyogbW92IChkMTYsYW4pLCBkbSAqLwordm9pZCBPUF9GN0MwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0KKyAgICA9IFNFWFQxNiAobG9hZF9oYWxmICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0KKwkgICAgICArIFNFWFQxNiAoaW5zbiAmIDB4ZmZmZikpKSk7Cit9CisKKy8qIG1vdiAoZDI0LGFtKSwgZG4gKi8KK3ZvaWQgT1BfRjQ4MDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCisgICAgPSBTRVhUMTYgKGxvYWRfaGFsZiAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMV8xNiAoaW5zbildCisJCQkgKyBTRVhUMjQgKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pKSkpOworfQorCisvKiBtb3YgKGRpLGFuKSwgZG0gKi8KK3ZvaWQgT1BfRjE0MCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0KKyAgICA9IFNFWFQxNiAobG9hZF9oYWxmICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV0KKwkJCSArIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF80IChpbnNuKV0pKSk7Cit9CisKKy8qIG1vdiAoYWJzMTYpLCBkbiAqLwordm9pZCBPUF9DODAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID0gU0VYVDE2IChsb2FkX2hhbGYgKChpbnNuICYgMHhmZmZmKSkpOworfQorCisvKiBtb3YgKGFiczI0KSwgZG4gKi8KK3ZvaWQgT1BfRjRDMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCisgICAgPSBTRVhUMTYgKGxvYWRfaGFsZiAoKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pKSk7Cit9CisKKy8qIG1vdiAoZDgsYW4pLCBhbSAqLwordm9pZCBPUF83MDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfOCAoaW5zbildCisgICAgPSBTRVhUMjQgKGxvYWRfM19ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzggKGluc24pXQorCQkJICsgU0VYVDggKGluc24gJiAweGZmKSkpKTsKK30KKworLyogbW92IChkMTYsYW4pLCBhbSAqLwordm9pZCBPUF9GN0IwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KKyAgICA9IFNFWFQyNCAobG9hZF8zX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXQorCQkJICsgU0VYVDE2IChpbnNuICYgMHhmZmZmKSkpKTsKK30KKworLyogbW92IChkMjQsYW0pLCBhbiAqLwordm9pZCBPUF9GNEYwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KKyAgICA9IFNFWFQyNCAobG9hZF8zX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXQorCQkJICAgKyBTRVhUMjQgKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pKSkpOworfQorCisvKiBtb3YgKGRpLGFuKSwgYW0gKi8KK3ZvaWQgT1BfRjEwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0KKyAgICA9IFNFWFQyNCAobG9hZF8zX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXQorCQkJICAgKyBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfNCAoaW5zbildKSkpOworfQorCisvKiBtb3YgKGFiczE2KSwgYW4gKi8KK3ZvaWQgT1BfRjczMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildID0gU0VYVDI0IChsb2FkXzNfYnl0ZSAoKGluc24gJiAweGZmZmYpKSk7Cit9CisKKy8qIG1vdiAoYWJzMjQpLCBhbiAqLwordm9pZCBPUF9GNEQwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KKyAgICA9IFNFWFQyNCAobG9hZF8zX2J5dGUgKCgoKGluc24gJiAweGZmZmYpIDw8IDgpICsgZXh0ZW5zaW9uKSkpOworfQorCisvKiBtb3YgZG0sIChhbikgKi8KK3ZvaWQgT1BfMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfaGFsZiAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV0sCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pOworfQorCisvKiBtb3YgZG0sIChkOCxhbikgKi8KK3ZvaWQgT1BfNDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfaGFsZiAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzggKGluc24pXSArIFNFWFQ4IChpbnNuICYgMHhmZiksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSk7Cit9CisKKy8qIG1vdiBkbSwgKGQxNixhbikgKi8KK3ZvaWQgT1BfRjc4MDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX2hhbGYgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMV8xNiAoaW5zbildICsgU0VYVDE2IChpbnNuICYgMHhmZmZmKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSk7Cit9CisKKy8qIG1vdiBkbSwgKGQyNCxhbSkgKi8KK3ZvaWQgT1BfRjQwMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXQorCSAgICAgICArIFNFWFQyNCAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbikpLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildKTsKK30KKworLyogbW92IGRtLCAoZGksYW4pICovCit2b2lkIE9QX0YxQzAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXQorCSAgICAgICArIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF80IChpbnNuKV0pLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildKTsKK30KKworLyogbW92IGRuLCAoYWJzMTYpICovCit2b2lkIE9QX0MwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfaGFsZiAoKGluc24gJiAweGZmZmYpLCBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSk7Cit9CisKKy8qIG1vdiBkbiwgKGFiczI0KSAqLwordm9pZCBPUF9GNDQwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfaGFsZiAoU0VYVDI0ICgoKGluc24gJiAweGZmZmYpIDw8IDgpICsgZXh0ZW5zaW9uKSwKKwkgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildKTsKK30KKworLyogbW92IGFtLCAoZDgsYW4pICovCit2b2lkIE9QXzUwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlXzNfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzggKGluc24pXSArIFNFWFQ4IChpbnNuICYgMHhmZiksCisJCVN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF84IChpbnNuKV0pOworfQorCisvKiBtb3YgYW0sIChkMTYsYW4pICovCit2b2lkIE9QX0Y3QTAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBzdG9yZV8zX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMV8xNiAoaW5zbildICsgU0VYVDE2IChpbnNuICYgMHhmZmZmKSwKKwkJU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0pOworfQorCisvKiBtb3YgYW0sIChkMjQsYW4pICovCit2b2lkIE9QX0Y0MTAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBzdG9yZV8zX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXQorCQkgKyBTRVhUMjQgKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pKSwKKwkJU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0pOworfQorCisvKiBtb3YgYW0sIChkaSxhbikgKi8KK3ZvaWQgT1BfRjE4MCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfM19ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV0KKwkgICAgICAgICArIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF80IChpbnNuKV0pLAorCQlTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSk7Cit9CisKKy8qIG1vdiBhbiwgKGFiczE2KSAqLwordm9pZCBPUF9GNzIwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfM19ieXRlICgoaW5zbiAmIDB4ZmZmZiksIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildKTsKK30KKworLyogbW92IGFuLCAoYWJzMjQpICovCit2b2lkIE9QX0Y0NTAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBzdG9yZV8zX2J5dGUgKFNFWFQyNCAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbiksCisJCVN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildKTsKK30KKworLyogbW92IGltbTE2LCBkbiAqLwordm9pZCBPUF9GODAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID0gU0VYVDE2IChpbnNuICYgMHhmZmZmKTsKK30KKworLyogbW92IGltbTI0LCBkbiAqLwordm9pZCBPUF9GNDcwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0KKyAgICA9IFNFWFQyNCAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbik7Cit9CisKKy8qIG1vdiBpbW0xNiwgYW4gKi8KK3ZvaWQgT1BfREMwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXSA9IGluc24gJiAweGZmZmY7Cit9CisKKy8qIG1vdiBpbW0yNCwgYW4gKi8KK3ZvaWQgT1BfRjQ3NDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildCisgICAgPSBTRVhUMjQgKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pOworfQorCisvKiBtb3Z4IChkOCxhbiksIGRtICovCit2b2lkIE9QX0Y1NzAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXQorICAgID0gU0VYVDI0IChsb2FkXzNfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMV84IChpbnNuKV0KKwkJCSAgICsgU0VYVDggKGluc24gJiAweGZmKSkpKTsKK30KKworLyogbW92eCAoZDE2LGFuKSwgZG0gKi8KK3ZvaWQgT1BfRjc3MDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCisgICAgPSBTRVhUMjQgKGxvYWRfM19ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0KKwkJCSAgICsgU0VYVDE2IChpbnNuICYgMHhmZmZmKSkpKTsKK30KKworLyogbW92eCAoZDI0LGFtKSwgZG4gKi8KK3ZvaWQgT1BfRjRCMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCisgICAgPSBTRVhUMjQgKGxvYWRfM19ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0KKwkJCSAgICsgU0VYVDI0ICgoKGluc24gJiAweGZmZmYpIDw8IDgpICsgZXh0ZW5zaW9uKSkpKTsKK30KKworLyogbW92eCBkbSwgKGQ4LGFuKSAqLwordm9pZCBPUF9GNTUwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlXzNfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzggKGluc24pXSArIFNFWFQ4IChpbnNuICYgMHhmZiksCisJCVN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0pOworfQorCisvKiBtb3Z4IGRtLCAoZDE2LGFuKSAqLwordm9pZCBPUF9GNzYwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfM19ieXRlIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXSArIFNFWFQxNiAoaW5zbiAmIDB4ZmZmZiksCisJCVN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildKTsKK30KKworLyogbW92eCBkbSwgKGQyNCxhbSkgKi8KK3ZvaWQgT1BfRjQzMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlXzNfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMV8xNiAoaW5zbildCisJCSArIFNFWFQyNCAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbikpLAorCQlTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSk7Cit9CisKKy8qIG1vdmIgKGQ4LGFuKSwgZG0gKi8KK3ZvaWQgT1BfRjUyMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildCisgICAgPSBTRVhUOCAobG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzggKGluc24pXQorCQkJKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKSkpOworfQorCisvKiBtb3ZiIChkMTYsYW4pLCBkbSAqLwordm9pZCBPUF9GN0QwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0KKyAgICA9IFNFWFQ4IChsb2FkX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXQorCQkJKyBTRVhUMTYgKGluc24gJiAweGZmZmYpKSkpOworfQorCisvKiBtb3ZiIChkMjQsYW0pLCBkbiAqLwordm9pZCBPUF9GNEEwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0KKyAgICA9IFNFWFQ4IChsb2FkX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXQorCQkJKyBTRVhUMjQgKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pKSkpOworfQorCisvKiBtb3ZiIChkaSxhbiksIGRtICovCit2b2lkIE9QX0YwNDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildCisgICAgPSBTRVhUOCAobG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV0KKwkJCSsgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzQgKGluc24pXSkpKTsKK30KKworLyogbW92IChhYnMyNCksIGRuICovCit2b2lkIE9QX0Y0QzQwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQorICAgID0gU0VYVDggKGxvYWRfYnl0ZSAoKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pKSk7Cit9CisKKy8qIG1vdmIgZG0sIChhbikgKi8KK3ZvaWQgT1BfMTAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildKTsKK30KKworLyogbW92YiBkbSwgKGQ4LGFuKSAqLwordm9pZCBPUF9GNTEwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMV84IChpbnNuKV0gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0pOworfQorCisvKiBtb3ZiIGRtLCAoZDE2LGFuKSAqLwordm9pZCBPUF9GNzkwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0gKyBTRVhUMTYgKGluc24gJiAweGZmZmYpLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildKTsKK30KKworLyogbW92YiBkbSwgKGQyNCxhbSkgKi8KK3ZvaWQgT1BfRjQyMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXQorCSAgICAgICsgU0VYVDI0ICgoKGluc24gJiAweGZmZmYpIDw8IDgpICsgZXh0ZW5zaW9uKSksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0pOworfQorCisvKiBtb3ZiIGRtLCAoZGksYW4pICovCit2b2lkIE9QX0YwQzAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXQorCSAgICAgICsgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzQgKGluc24pXSksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pOworfQorCisvKiBtb3ZiIGRuLCAoYWJzMTYpICovCit2b2lkIE9QX0M0MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfYnl0ZSAoKGluc24gJiAweGZmZmYpLCBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSk7Cit9CisKKy8qIG1vdmIgZG4sIChhYnMyNCkgKi8KK3ZvaWQgT1BfRjQ0NDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX2J5dGUgKFNFWFQyNCAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbiksCisJICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSk7Cit9CisKKy8qIG1vdmJ1IChhbiksIGRtICovCit2b2lkIE9QXzMwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXQorICAgID0gbG9hZF9ieXRlIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSk7Cit9CisKKy8qIG1vdmJ1IChkOCxhbiksIGRtICovCit2b2lkIE9QX0Y1MzAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXQorICAgID0gbG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzggKGluc24pXSArIFNFWFQ4IChpbnNuICYgMHhmZikpKTsKK30KKworLyogbW92YnUgKGQxNixhbiksIGRtICovCit2b2lkIE9QX0Y3NTAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQorICAgID0gbG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0KKwkJICArIFNFWFQxNiAoaW5zbiAmIDB4ZmZmZikpKTsKK30KKworLyogbW92YnUgKGQyNCxhbSksIGRuICovCit2b2lkIE9QX0Y0OTAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQorICAgID0gbG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0KKwkJICArIFNFWFQyNCAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbikpKTsKK30KKworLyogbW92YnUgKGRpLGFuKSwgZG0gKi8KK3ZvaWQgT1BfRjA4MCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0KKyAgICA9IGxvYWRfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildCisJCSAgKyBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfNCAoaW5zbildKSk7Cit9CisKKy8qIG1vdmJ1IChhYnMxNiksIGRuICovCit2b2lkIE9QX0NDMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gPSBsb2FkX2J5dGUgKChpbnNuICYgMHhmZmZmKSk7Cit9CisKKy8qIG1vdmJ1IChhYnMyNCksIGRuICovCit2b2lkIE9QX0Y0QzgwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQorICAgID0gbG9hZF9ieXRlICgoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbikpOworfQorCisvKiBleHQgZG4gKi8KK3ZvaWQgT1BfRjNDMSAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaWYgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildICYgMHg4MDAwKQorICAgIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSAweGZmZmY7CisgIGVsc2UKKyAgICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gMDsKK30KKworLyogZXh0eCBkbiAqLwordm9pZCBPUF9CMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSBTRVhUMTYgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildKTsKK30KKworLyogZXh0eHUgZG4gKi8KK3ZvaWQgT1BfQjQgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweGZmZmY7Cit9CisKKy8qIGV4dHhiIGRuICovCit2b2lkIE9QX0I4IChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IFNFWFQ4IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSk7Cit9CisKKy8qIGV4dHhidSBkbiAqLwordm9pZCBPUF9CQyAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ZmY7Cit9CisKKy8qIGFkZCBkbixkbSAqLwordm9pZCBPUF85MCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHosIGMsIG4sIHYsIHp4LCBjeCwgbngsIHZ4OworICB1bnNpZ25lZCBsb25nIHJlZzEsIHJlZzIsIHZhbHVlOworCisgIHJlZzEgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0pOworICByZWcyID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildKTsKKyAgdmFsdWUgPSBUUlVOQyAocmVnMSArIHJlZzIpOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHZhbHVlOworCisgIHogPSAoKHZhbHVlICYgMHhmZmZmKSA9PSAwKTsKKyAgenggPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDApOworICBueCA9ICh2YWx1ZSAmIDB4ODAwMDAwKTsKKyAgYyA9ICgodmFsdWUgJiAweGZmZmYpIDwgKHJlZzEgJiAweGZmZmYpKQorICAgICAgIHx8ICgodmFsdWUgJiAweGZmZmYpIDwgKHJlZzIgJiAweGZmZmYpKTsKKyAgY3ggPSAodmFsdWUgPCByZWcxKSB8fCAodmFsdWUgPCByZWcyKTsKKyAgdiA9ICgocmVnMiAmIDB4ODAwMCkgPT0gKHJlZzEgJiAweDgwMDApCisgICAgICAgJiYgKHJlZzIgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOworICB2eCA9ICgocmVnMiAmIDB4ODAwMDAwKSA9PSAocmVnMSAmIDB4ODAwMDAwKQorICAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgorCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQorCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQorCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCisJICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOworfQorCisvKiBhZGQgZG0sIGFuICovCit2b2lkIE9QX0YyMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKKyAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCB2YWx1ZTsKKworICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKTsKKyAgcmVnMiA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSk7CisgIHZhbHVlID0gVFJVTkMgKHJlZzEgKyByZWcyKTsKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKKworICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7CisgIHp4ID0gKHZhbHVlID09IDApOworICBuID0gKHZhbHVlICYgMHg4MDAwKTsKKyAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7CisgIGMgPSAoKHZhbHVlICYgMHhmZmZmKSA8IChyZWcxICYgMHhmZmZmKSkKKyAgICAgICB8fCAoKHZhbHVlICYgMHhmZmZmKSA8IChyZWcyICYgMHhmZmZmKSk7CisgIGN4ID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgcmVnMik7CisgIHYgPSAoKHJlZzIgJiAweDgwMDApID09IChyZWcxICYgMHg4MDAwKQorICAgICAgICYmIChyZWcyICYgMHg4MDAwKSAhPSAodmFsdWUgJiAweDgwMDApKTsKKyAgdnggPSAoKHJlZzIgJiAweDgwMDAwMCkgPT0gKHJlZzEgJiAweDgwMDAwMCkKKyAgICAgICAgJiYgKHJlZzIgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKKwkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKKwkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKKwkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQorCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKK30KKworLyogYWRkIGFuLCBkbSAqLwordm9pZCBPUF9GMkMwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7CisKKyAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSk7CisgIHJlZzIgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pOworICB2YWx1ZSA9IFRSVU5DIChyZWcxICsgcmVnMik7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gdmFsdWU7CisKKyAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOworICB6eCA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7CisgIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOworICBjID0gKCh2YWx1ZSAmIDB4ZmZmZikgPCAocmVnMSAmIDB4ZmZmZikpCisgICAgICAgfHwgKCh2YWx1ZSAmIDB4ZmZmZikgPCAocmVnMiAmIDB4ZmZmZikpOworICBjeCA9ICh2YWx1ZSA8IHJlZzEpIHx8ICh2YWx1ZSA8IHJlZzIpOworICB2ID0gKChyZWcyICYgMHg4MDAwKSA9PSAocmVnMSAmIDB4ODAwMCkKKyAgICAgICAmJiAocmVnMiAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7CisgIHZ4ID0gKChyZWcyICYgMHg4MDAwMDApID09IChyZWcxICYgMHg4MDAwMDApCisgICAgICAgICYmIChyZWcyICYgMHg4MDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGCisJICAgfCBQU1dfWlggfCBQU1dfTlggfCBQU1dfQ1ggfCBQU1dfVlgpOworICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApCisJICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApCisJICB8ICh6eCA/IFBTV19aWCA6IDApIHwgKG54ID8gUFNXX05YIDogMCkKKwkgIHwgKGN4ID8gUFNXX0NYIDogMCkgfCAodnggPyBQU1dfVlggOiAwKSk7Cit9CisKKy8qIGFkZCBhbixhbSAqLwordm9pZCBPUF9GMjQwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7CisKKyAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSk7CisgIHJlZzIgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0pOworICB2YWx1ZSA9IFRSVU5DIChyZWcxICsgcmVnMik7CisgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildID0gdmFsdWU7CisKKyAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOworICB6eCA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7CisgIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOworICBjID0gKCh2YWx1ZSAmIDB4ZmZmZikgPCAocmVnMSAmIDB4ZmZmZikpCisgICAgICAgfHwgKCh2YWx1ZSAmIDB4ZmZmZikgPCAocmVnMiAmIDB4ZmZmZikpOworICBjeCA9ICh2YWx1ZSA8IHJlZzEpIHx8ICh2YWx1ZSA8IHJlZzIpOworICB2ID0gKChyZWcyICYgMHg4MDAwKSA9PSAocmVnMSAmIDB4ODAwMCkKKyAgICAgICAmJiAocmVnMiAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7CisgIHZ4ID0gKChyZWcyICYgMHg4MDAwMDApID09IChyZWcxICYgMHg4MDAwMDApCisgICAgICAgICYmIChyZWcyICYgMHg4MDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGCisJICAgfCBQU1dfWlggfCBQU1dfTlggfCBQU1dfQ1ggfCBQU1dfVlgpOworICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApCisJICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApCisJICB8ICh6eCA/IFBTV19aWCA6IDApIHwgKG54ID8gUFNXX05YIDogMCkKKwkgIHwgKGN4ID8gUFNXX0NYIDogMCkgfCAodnggPyBQU1dfVlggOiAwKSk7Cit9CisKKy8qIGFkZCBpbW04LCBkbiAqLwordm9pZCBPUF9ENDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKKworICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0pOworICBpbW0gPSBUUlVOQyAoU0VYVDggKGluc24gJiAweGZmKSk7CisgIHZhbHVlID0gVFJVTkMgKHJlZzEgKyBpbW0pOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildID0gdmFsdWU7CisKKyAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOworICB6eCA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7CisgIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOworICBjID0gKCh2YWx1ZSAmIDB4ZmZmZikgPCAocmVnMSAmIDB4ZmZmZikpCisgICAgICAgfHwgKCh2YWx1ZSAmIDB4ZmZmZikgPCAoaW1tICYgMHhmZmZmKSk7CisgIGN4ID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgaW1tKTsKKyAgdiA9ICgocmVnMSAmIDB4ODAwMCkgPT0gKGltbSAmIDB4ODAwMCkKKyAgICAgICAmJiAocmVnMSAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7CisgIHZ4ID0gKChyZWcxICYgMHg4MDAwMDApID09IChpbW0gJiAweDgwMDAwMCkKKyAgICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKKwkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKKwkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKKwkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQorCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKK30KKworLyogYWRkIGltbTE2LCBkbiAqLwordm9pZCBPUF9GNzE4MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHosIGMsIG4sIHYsIHp4LCBjeCwgbngsIHZ4OworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSk7CisgIGltbSA9IFRSVU5DIChTRVhUMTYgKGluc24gJiAweGZmZmYpKTsKKyAgdmFsdWUgPSBUUlVOQyAocmVnMSArIGltbSk7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID0gdmFsdWU7CisKKyAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOworICB6eCA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7CisgIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOworICBjID0gKCh2YWx1ZSAmIDB4ZmZmZikgPCAocmVnMSAmIDB4ZmZmZikpCisgICAgICAgfHwgKCh2YWx1ZSAmIDB4ZmZmZikgPCAoaW1tICYgMHhmZmZmKSk7CisgIGN4ID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgaW1tKTsKKyAgdiA9ICgocmVnMSAmIDB4ODAwMCkgPT0gKGltbSAmIDB4ODAwMCkKKyAgICAgICAmJiAocmVnMSAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7CisgIHZ4ID0gKChyZWcxICYgMHg4MDAwMDApID09IChpbW0gJiAweDgwMDAwMCkKKyAgICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKKwkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKKwkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKKwkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQorCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKK30KKworLyogYWRkIGltbTI0LGRuICovCit2b2lkIE9QX0Y0NjAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKKworICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildKTsKKyAgaW1tID0gVFJVTkMgKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pOworICB2YWx1ZSA9IFRSVU5DIChyZWcxICsgaW1tKTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gPSB2YWx1ZTsKKworICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7CisgIHp4ID0gKHZhbHVlID09IDApOworICBuID0gKHZhbHVlICYgMHg4MDAwKTsKKyAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7CisgIGMgPSAoKHZhbHVlICYgMHhmZmZmKSA8IChyZWcxICYgMHhmZmZmKSkKKyAgICAgICB8fCAoKHZhbHVlICYgMHhmZmZmKSA8IChpbW0gJiAweGZmZmYpKTsKKyAgY3ggPSAodmFsdWUgPCByZWcxKSB8fCAodmFsdWUgPCBpbW0pOworICB2ID0gKChyZWcxICYgMHg4MDAwKSA9PSAoaW1tICYgMHg4MDAwKQorICAgICAgICYmIChyZWcxICYgMHg4MDAwKSAhPSAodmFsdWUgJiAweDgwMDApKTsKKyAgdnggPSAoKHJlZzEgJiAweDgwMDAwMCkgPT0gKGltbSAmIDB4ODAwMDAwKQorICAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgorCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQorCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQorCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCisJICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOworfQorCisvKiBhZGQgaW1tOCwgYW4gKi8KK3ZvaWQgT1BfRDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHosIGMsIG4sIHYsIHp4LCBjeCwgbngsIHZ4OworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfOCAoaW5zbildKTsKKyAgaW1tID0gVFJVTkMgKFNFWFQ4IChpbnNuICYgMHhmZikpOworICB2YWx1ZSA9IFRSVU5DIChyZWcxICsgaW1tKTsKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzggKGluc24pXSA9IHZhbHVlOworCisgIHogPSAoKHZhbHVlICYgMHhmZmZmKSA9PSAwKTsKKyAgenggPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDApOworICBueCA9ICh2YWx1ZSAmIDB4ODAwMDAwKTsKKyAgYyA9ICgodmFsdWUgJiAweGZmZmYpIDwgKHJlZzEgJiAweGZmZmYpKQorICAgICAgIHx8ICgodmFsdWUgJiAweGZmZmYpIDwgKGltbSAmIDB4ZmZmZikpOworICBjeCA9ICh2YWx1ZSA8IHJlZzEpIHx8ICh2YWx1ZSA8IGltbSk7CisgIHYgPSAoKHJlZzEgJiAweDgwMDApID09IChpbW0gJiAweDgwMDApCisgICAgICAgJiYgKHJlZzEgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOworICB2eCA9ICgocmVnMSAmIDB4ODAwMDAwKSA9PSAoaW1tICYgMHg4MDAwMDApCisgICAgICAgICYmIChyZWcxICYgMHg4MDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGCisJICAgfCBQU1dfWlggfCBQU1dfTlggfCBQU1dfQ1ggfCBQU1dfVlgpOworICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApCisJICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApCisJICB8ICh6eCA/IFBTV19aWCA6IDApIHwgKG54ID8gUFNXX05YIDogMCkKKwkgIHwgKGN4ID8gUFNXX0NYIDogMCkgfCAodnggPyBQU1dfVlggOiAwKSk7Cit9CisKKy8qIGFkZCBpbW0xNiwgYW4gKi8KK3ZvaWQgT1BfRjcwODAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKKyAgdW5zaWduZWQgbG9uZyByZWcxLCBpbW0sIHZhbHVlOworCisgIHJlZzEgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0pOworICBpbW0gPSBUUlVOQyAoU0VYVDE2IChpbnNuICYgMHhmZmZmKSk7CisgIHZhbHVlID0gVFJVTkMgKHJlZzEgKyBpbW0pOworICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXSA9IHZhbHVlOworCisgIHogPSAoKHZhbHVlICYgMHhmZmZmKSA9PSAwKTsKKyAgenggPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDApOworICBueCA9ICh2YWx1ZSAmIDB4ODAwMDAwKTsKKyAgYyA9ICgodmFsdWUgJiAweGZmZmYpIDwgKHJlZzEgJiAweGZmZmYpKQorICAgICAgIHx8ICgodmFsdWUgJiAweGZmZmYpIDwgKGltbSAmIDB4ZmZmZikpOworICBjeCA9ICh2YWx1ZSA8IHJlZzEpIHx8ICh2YWx1ZSA8IGltbSk7CisgIHYgPSAoKHJlZzEgJiAweDgwMDApID09IChpbW0gJiAweDgwMDApCisgICAgICAgJiYgKHJlZzEgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOworICB2eCA9ICgocmVnMSAmIDB4ODAwMDAwKSA9PSAoaW1tICYgMHg4MDAwMDApCisgICAgICAgICYmIChyZWcxICYgMHg4MDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGCisJICAgfCBQU1dfWlggfCBQU1dfTlggfCBQU1dfQ1ggfCBQU1dfVlgpOworICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApCisJICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApCisJICB8ICh6eCA/IFBTV19aWCA6IDApIHwgKG54ID8gUFNXX05YIDogMCkKKwkgIHwgKGN4ID8gUFNXX0NYIDogMCkgfCAodnggPyBQU1dfVlggOiAwKSk7Cit9CisKKy8qIGFkZCBpbW0yNCwgYW4gKi8KK3ZvaWQgT1BfRjQ2NDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKKyAgdW5zaWduZWQgbG9uZyByZWcxLCBpbW0sIHZhbHVlOworCisgIHJlZzEgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0pOworICBpbW0gPSBUUlVOQyAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbik7CisgIHZhbHVlID0gVFJVTkMgKHJlZzEgKyBpbW0pOworICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXSA9IHZhbHVlOworCisgIHogPSAoKHZhbHVlICYgMHhmZmZmKSA9PSAwKTsKKyAgenggPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDApOworICBueCA9ICh2YWx1ZSAmIDB4ODAwMDAwKTsKKyAgYyA9ICgodmFsdWUgJiAweGZmZmYpIDwgKHJlZzEgJiAweGZmZmYpKSB8fCAoKHZhbHVlICYgMHhmZmZmKSA8IChpbW0gJiAweGZmZmYpKTsKKyAgY3ggPSAodmFsdWUgPCByZWcxKSB8fCAodmFsdWUgPCBpbW0pOworICB2ID0gKChyZWcxICYgMHg4MDAwKSA9PSAoaW1tICYgMHg4MDAwKQorICAgICAgICYmIChyZWcxICYgMHg4MDAwKSAhPSAodmFsdWUgJiAweDgwMDApKTsKKyAgdnggPSAoKHJlZzEgJiAweDgwMDAwMCkgPT0gKGltbSAmIDB4ODAwMDAwKQorICAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgorCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQorCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQorCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCisJICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOworfQorCisvKiBhZGRjIGRtLGRuICovCit2b2lkIE9QX0YyODAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKKyAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCB2YWx1ZTsKKworICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKTsKKyAgcmVnMiA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSk7CisgIHZhbHVlID0gVFJVTkMgKHJlZzEgKyByZWcyICsgKChQU1cgJiBQU1dfQ0YpICE9IDApKTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKKworICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7CisgIHp4ID0gKHZhbHVlID09IDApOworICBuID0gKHZhbHVlICYgMHg4MDAwKTsKKyAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7CisgIGMgPSAoKHZhbHVlICYgMHhmZmZmKSA8IChyZWcxICYgMHhmZmZmKSkKKyAgICAgICB8fCAoKHZhbHVlICYgMHhmZmZmKSA8IChyZWcyICYgMHhmZmZmKSk7CisgIGN4ID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgcmVnMik7CisgIHYgPSAoKHJlZzIgJiAweDgwMDApID09IChyZWcxICYgMHg4MDAwKQorICAgICAgICYmIChyZWcyICYgMHg4MDAwKSAhPSAodmFsdWUgJiAweDgwMDApKTsKKyAgdnggPSAoKHJlZzIgJiAweDgwMDAwMCkgPT0gKHJlZzEgJiAweDgwMDAwMCkKKyAgICAgICAgJiYgKHJlZzIgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKKwkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKKwkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKKwkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQorCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKK30KKworLyogYWRkbmYgaW1tOCwgYW4gKi8KK3ZvaWQgT1BfRjUwQzAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF84IChpbnNuKV07CisgIGltbSA9IFNFWFQ4IChpbnNuICYgMHhmZik7CisgIHZhbHVlID0gcmVnMSArIGltbTsKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzggKGluc24pXSA9IFRSVU5DICh2YWx1ZSk7Cit9CisKKy8qIHN1YiBkbiwgZG0gKi8KK3ZvaWQgT1BfQTAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKKyAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCB2YWx1ZTsKKworICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKTsKKyAgcmVnMiA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSk7CisgIHZhbHVlID0gVFJVTkMgKHJlZzIgLSByZWcxKTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKKworICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7CisgIHp4ID0gKHZhbHVlID09IDApOworICBuID0gKHZhbHVlICYgMHg4MDAwKTsKKyAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7CisgIGMgPSAoKHJlZzEgJiAweGZmZmYpID4gKHJlZzIgJiAweGZmZmYpKTsKKyAgY3ggPSAocmVnMSA+IHJlZzIpOworICB2ID0gKChyZWcyICYgMHg4MDAwKSAhPSAocmVnMSAmIDB4ODAwMCkKKyAgICAgICAmJiAocmVnMiAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7CisgIHZ4ID0gKChyZWcyICYgMHg4MDAwMDApICE9IChyZWcxICYgMHg4MDAwMDApCisgICAgICAgICYmIChyZWcyICYgMHg4MDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGCisJICAgfCBQU1dfWlggfCBQU1dfTlggfCBQU1dfQ1ggfCBQU1dfVlgpOworICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApCisJICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApCisJICB8ICh6eCA/IFBTV19aWCA6IDApIHwgKG54ID8gUFNXX05YIDogMCkKKwkgIHwgKGN4ID8gUFNXX0NYIDogMCkgfCAodnggPyBQU1dfVlggOiAwKSk7Cit9CisKKy8qIHN1YiBkbSwgYW4gKi8KK3ZvaWQgT1BfRjIxMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHosIGMsIG4sIHYsIHp4LCBjeCwgbngsIHZ4OworICB1bnNpZ25lZCBsb25nIHJlZzEsIHJlZzIsIHZhbHVlOworCisgIHJlZzEgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0pOworICByZWcyID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildKTsKKyAgdmFsdWUgPSBUUlVOQyAocmVnMiAtIHJlZzEpOworICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSA9IHZhbHVlOworCisgIHogPSAoKHZhbHVlICYgMHhmZmZmKSA9PSAwKTsKKyAgenggPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDApOworICBueCA9ICh2YWx1ZSAmIDB4ODAwMDAwKTsKKyAgYyA9ICgocmVnMSAmIDB4ZmZmZikgPiAocmVnMiAmIDB4ZmZmZikpOworICBjeCA9IChyZWcxID4gcmVnMik7CisgIHYgPSAoKHJlZzIgJiAweDgwMDApICE9IChyZWcxICYgMHg4MDAwKQorICAgICAgICYmIChyZWcyICYgMHg4MDAwKSAhPSAodmFsdWUgJiAweDgwMDApKTsKKyAgdnggPSAoKHJlZzIgJiAweDgwMDAwMCkgIT0gKHJlZzEgJiAweDgwMDAwMCkKKyAgICAgICAgJiYgKHJlZzIgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKKwkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKKwkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKKwkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQorCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKK30KKworLyogc3ViIGFuLCBkbSAqLwordm9pZCBPUF9GMkQwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7CisKKyAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSk7CisgIHJlZzIgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pOworICB2YWx1ZSA9IFRSVU5DIChyZWcyIC0gcmVnMSk7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gdmFsdWU7CisKKyAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOworICB6eCA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7CisgIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOworICBjID0gKChyZWcxICYgMHhmZmZmKSA+IChyZWcyICYgMHhmZmZmKSk7CisgIGN4ID0gKHJlZzEgPiByZWcyKTsKKyAgdiA9ICgocmVnMiAmIDB4ODAwMCkgIT0gKHJlZzEgJiAweDgwMDApCisgICAgICAgJiYgKHJlZzIgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOworICB2eCA9ICgocmVnMiAmIDB4ODAwMDAwKSAhPSAocmVnMSAmIDB4ODAwMDAwKQorICAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgorCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQorCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQorCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCisJICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOworfQorCisvKiBzdWIgYW4sIGFtICovCit2b2lkIE9QX0YyNTAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKKyAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCB2YWx1ZTsKKworICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildKTsKKyAgcmVnMiA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSk7CisgIHZhbHVlID0gVFJVTkMgKHJlZzIgLSByZWcxKTsKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKKworICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7CisgIHp4ID0gKHZhbHVlID09IDApOworICBuID0gKHZhbHVlICYgMHg4MDAwKTsKKyAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7CisgIGMgPSAoKHJlZzEgJiAweGZmZmYpID4gKHJlZzIgJiAweGZmZmYpKTsKKyAgY3ggPSAocmVnMSA+IHJlZzIpOworICB2ID0gKChyZWcyICYgMHg4MDAwKSAhPSAocmVnMSAmIDB4ODAwMCkKKyAgICAgICAmJiAocmVnMiAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7CisgIHZ4ID0gKChyZWcyICYgMHg4MDAwMDApICE9IChyZWcxICYgMHg4MDAwMDApCisgICAgICAgICYmIChyZWcyICYgMHg4MDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGCisJICAgfCBQU1dfWlggfCBQU1dfTlggfCBQU1dfQ1ggfCBQU1dfVlgpOworICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApCisJICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApCisJICB8ICh6eCA/IFBTV19aWCA6IDApIHwgKG54ID8gUFNXX05YIDogMCkKKwkgIHwgKGN4ID8gUFNXX0NYIDogMCkgfCAodnggPyBQU1dfVlggOiAwKSk7Cit9CisKKy8qIHN1YiBpbW0xNiwgZG4gKi8KK3ZvaWQgT1BfRjcxQzAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKKyAgdW5zaWduZWQgbG9uZyByZWcxLCBpbW0sIHZhbHVlOworCisgIHJlZzEgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0pOworICBpbW0gPSBUUlVOQyAoU0VYVDE2IChpbnNuICYgMHhmZmZmKSk7CisgIHZhbHVlID0gVFJVTkMgKHJlZzEgLSBpbW0pOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSA9IHZhbHVlOworCisgIHogPSAoKHZhbHVlICYgMHhmZmZmKSA9PSAwKTsKKyAgenggPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDApOworICBueCA9ICh2YWx1ZSAmIDB4ODAwMDAwKTsKKyAgYyA9ICgocmVnMSAmIDB4ZmZmZikgPCAoaW1tICYgMHhmZmZmKSk7CisgIGN4ID0gKHJlZzEgPCBpbW0pOworICB2ID0gKChyZWcxICYgMHg4MDAwKSAhPSAoaW1tICYgMHg4MDAwKQorICAgICAgICYmIChyZWcxICYgMHg4MDAwKSAhPSAodmFsdWUgJiAweDgwMDApKTsKKyAgdnggPSAoKHJlZzEgJiAweDgwMDAwMCkgIT0gKGltbSAmIDB4ODAwMDAwKQorICAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgorCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQorCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQorCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCisJICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOworfQorCisvKiBzdWIgaW1tMjQsIGRuICovCit2b2lkIE9QX0Y0NjgwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKKworICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildKTsKKyAgaW1tID0gVFJVTkMgKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pOworICB2YWx1ZSA9IFRSVU5DIChyZWcxIC0gaW1tKTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gPSB2YWx1ZTsKKworICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7CisgIHp4ID0gKHZhbHVlID09IDApOworICBuID0gKHZhbHVlICYgMHg4MDAwKTsKKyAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7CisgIGMgPSAoKHJlZzEgJiAweGZmZmYpIDwgKGltbSAmIDB4ZmZmZikpOworICBjeCA9IChyZWcxIDwgaW1tKTsKKyAgdiA9ICgocmVnMSAmIDB4ODAwMCkgIT0gKGltbSAmIDB4ODAwMCkKKyAgICAgICAmJiAocmVnMSAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7CisgIHZ4ID0gKChyZWcxICYgMHg4MDAwMDApICE9IChpbW0gJiAweDgwMDAwMCkKKyAgICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKKwkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKKwkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKKwkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQorCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKK30KKworLyogc3ViIGltbTE2LCBhbiAqLwordm9pZCBPUF9GNzBDMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHosIGMsIG4sIHYsIHp4LCBjeCwgbngsIHZ4OworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXSk7CisgIGltbSA9IFRSVU5DIChTRVhUMTYgKGluc24gJiAweGZmZmYpKTsKKyAgdmFsdWUgPSBUUlVOQyAocmVnMSAtIGltbSk7CisgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildID0gdmFsdWU7CisKKyAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOworICB6eCA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7CisgIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOworICBjID0gKChyZWcxICYgMHhmZmZmKSA8IChpbW0gJiAweGZmZmYpKTsKKyAgY3ggPSAocmVnMSA8IGltbSk7CisgIHYgPSAoKHJlZzEgJiAweDgwMDApICE9IChpbW0gJiAweDgwMDApCisgICAgICAgJiYgKHJlZzEgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOworICB2eCA9ICgocmVnMSAmIDB4ODAwMDAwKSAhPSAoaW1tICYgMHg4MDAwMDApCisgICAgICAgICYmIChyZWcxICYgMHg4MDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGCisJICAgfCBQU1dfWlggfCBQU1dfTlggfCBQU1dfQ1ggfCBQU1dfVlgpOworICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApCisJICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApCisJICB8ICh6eCA/IFBTV19aWCA6IDApIHwgKG54ID8gUFNXX05YIDogMCkKKwkgIHwgKGN4ID8gUFNXX0NYIDogMCkgfCAodnggPyBQU1dfVlggOiAwKSk7Cit9CisKKy8qIHN1YiBpbW0yNCwgYW4gKi8KK3ZvaWQgT1BfRjQ2QzAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKKyAgdW5zaWduZWQgbG9uZyByZWcxLCBpbW0sIHZhbHVlOworCisgIHJlZzEgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0pOworICBpbW0gPSBUUlVOQyAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbik7CisgIHZhbHVlID0gVFJVTkMgKHJlZzEgLSBpbW0pOworICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXSA9IHZhbHVlOworCisgIHogPSAoKHZhbHVlICYgMHhmZmZmKSA9PSAwKTsKKyAgenggPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDApOworICBueCA9ICh2YWx1ZSAmIDB4ODAwMDAwKTsKKyAgYyA9ICgocmVnMSAmIDB4ZmZmZikgPCAoaW1tICYgMHhmZmZmKSk7CisgIGN4ID0gKHJlZzEgPCBpbW0pOworICB2ID0gKChyZWcxICYgMHg4MDAwKSAhPSAoaW1tICYgMHg4MDAwKQorICAgICAgICYmIChyZWcxICYgMHg4MDAwKSAhPSAodmFsdWUgJiAweDgwMDApKTsKKyAgdnggPSAoKHJlZzEgJiAweDgwMDAwMCkgIT0gKGltbSAmIDB4ODAwMDAwKQorICAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgorCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQorCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQorCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCisJICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOworfQorCisvKiBzdWJjIGRtLCBkbiAqLwordm9pZCBPUF9GMjkwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7CisKKyAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSk7CisgIHJlZzIgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pOworICB2YWx1ZSA9IFRSVU5DIChyZWcyIC0gcmVnMSAtICgoUFNXICYgUFNXX0NGKSAhPSAwKSk7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gdmFsdWU7CisKKyAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOworICB6eCA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7CisgIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOworICBjID0gKChyZWcxICYgMHhmZmZmKSA+IChyZWcyICYgMHhmZmZmKSk7CisgIGN4ID0gKHJlZzEgPiByZWcyKTsKKyAgdiA9ICgocmVnMiAmIDB4ODAwMCkgIT0gKHJlZzEgJiAweDgwMDApCisgICAgICAgJiYgKHJlZzIgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOworICB2eCA9ICgocmVnMiAmIDB4ODAwMDAwKSAhPSAocmVnMSAmIDB4ODAwMDAwKQorICAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgorCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQorCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQorCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCisJICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOworfQorCisvKiBtdWwgZG4sIGRtICovCit2b2lkIE9QX0YzNDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGxvbmcgdGVtcDsKKyAgaW50IG4sIHo7CisKKyAgdGVtcCA9IChTRVhUMTYgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICYgMHhmZmZmKQorICAgICAgICAgICogIFNFWFQxNiAoKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildICYgMHhmZmZmKSkpOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHRlbXAgJiAweGZmZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfTURSXSA9IHRlbXAgPj4gMTY7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweGZmZmYpID09IDA7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19WRik7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkpOworfQorCisvKiBtdWx1IGRuLCBkbSAqLwordm9pZCBPUF9GMzUwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIHRlbXA7CisgIGludCBuLCB6OworCisgIHRlbXAgPSAoKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICYgMHhmZmZmKQorICAgICAgICAgICogIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSAmIDB4ZmZmZikpOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHRlbXAgJiAweGZmZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfTURSXSA9IHRlbXAgPj4gMTY7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweGZmZmYpID09IDA7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19WRik7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkpOworfQorCisKKy8qIGRpdnUgZG0sIGRuICovCit2b2lkIE9QX0YzNjAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGxvbmcgdGVtcDsKKyAgaW50IG4sIHo7CisKKyAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX01EUl07CisgIHRlbXAgJj0gMHhmZmZmOworICB0ZW1wIDw8PSAxNjsKKyAgdGVtcCB8PSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweGZmZmYpOworICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gKHRlbXAKKwkJCSAgJSAodW5zaWduZWQgbG9uZykoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0gJiAweGZmZmYpKTsKKyAgdGVtcCAvPSAodW5zaWduZWQgbG9uZykoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0gJiAweGZmZmYpOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHRlbXAgJiAweGZmZmY7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweGZmZmYpID09IDA7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkpOworfQorCisvKiBjbXAgaW1tOCwgZG4gKi8KK3ZvaWQgT1BfRDgwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHosIGMsIG4sIHYsIHp4LCBjeCwgbngsIHZ4OworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildKTsKKyAgaW1tID0gVFJVTkMgKFNFWFQ4IChpbnNuICYgMHhmZikpOworICB2YWx1ZSA9IFRSVU5DIChyZWcxIC0gaW1tKTsKKworICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7CisgIHp4ID0gKHZhbHVlID09IDApOworICBuID0gKHZhbHVlICYgMHg4MDAwKTsKKyAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7CisgIGMgPSAoKHJlZzEgJiAweGZmZmYpIDwgKGltbSAmIDB4ZmZmZikpOworICBjeCA9IChyZWcxIDwgaW1tKTsKKyAgdiA9ICgocmVnMSAmIDB4ODAwMCkgIT0gKGltbSAmIDB4ODAwMCkKKyAgICAgICAmJiAocmVnMSAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7CisgIHZ4ID0gKChyZWcxICYgMHg4MDAwMDApICE9IChpbW0gJiAweDgwMDAwMCkKKyAgICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKKwkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKKwkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKKwkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQorCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKK30KKworLyogY21wIGRuLCBkbSAqLwordm9pZCBPUF9GMzkwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7CisKKyAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSk7CisgIHJlZzIgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pOworICB2YWx1ZSA9IFRSVU5DIChyZWcyIC0gcmVnMSk7CisKKyAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOworICB6eCA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7CisgIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOworICBjID0gKChyZWcxICYgMHhmZmZmKSA+IChyZWcyICYgMHhmZmZmKSk7CisgIGN4ID0gKHJlZzEgPiByZWcyKTsKKyAgdiA9ICgocmVnMiAmIDB4ODAwMCkgIT0gKHJlZzEgJiAweDgwMDApCisgICAgICAgJiYgKHJlZzIgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOworICB2eCA9ICgocmVnMiAmIDB4ODAwMDAwKSAhPSAocmVnMSAmIDB4ODAwMDAwKQorICAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgorCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQorCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQorCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCisJICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOworCisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8ICggbiA/IFBTV19ORiA6IDApCisJICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApKTsKK30KKworLyogY21wIGRtLCBhbiAqLwordm9pZCBPUF9GMjIwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7CisKKyAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSk7CisgIHJlZzIgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0pOworICB2YWx1ZSA9IFRSVU5DIChyZWcyIC0gcmVnMSk7CisKKyAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOworICB6eCA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7CisgIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOworICBjID0gKChyZWcxICYgMHhmZmZmKSA+IChyZWcyICYgMHhmZmZmKSk7CisgIGN4ID0gKHJlZzEgPiByZWcyKTsKKyAgdiA9ICgocmVnMiAmIDB4ODAwMCkgIT0gKHJlZzEgJiAweDgwMDApCisgICAgICAgJiYgKHJlZzIgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOworICB2eCA9ICgocmVnMiAmIDB4ODAwMDAwKSAhPSAocmVnMSAmIDB4ODAwMDAwKQorICAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgorCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQorCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQorCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCisJICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOworCisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8ICggbiA/IFBTV19ORiA6IDApCisJICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApKTsKK30KKworLyogY21wIGFuLCBkbSAqLwordm9pZCBPUF9GMkUwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7CisKKyAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSk7CisgIHJlZzIgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pOworICB2YWx1ZSA9IFRSVU5DIChyZWcyIC0gcmVnMSk7CisKKyAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOworICB6eCA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7CisgIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOworICBjID0gKChyZWcxICYgMHhmZmZmKSA+IChyZWcyICYgMHhmZmZmKSk7CisgIGN4ID0gKHJlZzEgPiByZWcyKTsKKyAgdiA9ICgocmVnMiAmIDB4ODAwMCkgIT0gKHJlZzEgJiAweDgwMDApCisgICAgICAgJiYgKHJlZzIgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOworICB2eCA9ICgocmVnMiAmIDB4ODAwMDAwKSAhPSAocmVnMSAmIDB4ODAwMDAwKQorICAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgorCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQorCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQorCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCisJICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOworCisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8ICggbiA/IFBTV19ORiA6IDApCisJICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApKTsKK30KKworLyogY21wIGFuLCBhbSAqLwordm9pZCBPUF9GMjYwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7CisKKyAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSk7CisgIHJlZzIgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0pOworICB2YWx1ZSA9IFRSVU5DIChyZWcyIC0gcmVnMSk7CisKKyAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOworICB6eCA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7CisgIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOworICBjID0gKChyZWcxICYgMHhmZmZmKSA+IChyZWcyICYgMHhmZmZmKSk7CisgIGN4ID0gKHJlZzEgPiByZWcyKTsKKyAgdiA9ICgocmVnMiAmIDB4ODAwMCkgIT0gKHJlZzEgJiAweDgwMDApCisgICAgICAgJiYgKHJlZzIgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOworICB2eCA9ICgocmVnMiAmIDB4ODAwMDAwKSAhPSAocmVnMSAmIDB4ODAwMDAwKQorICAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgorCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQorCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQorCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCisJICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOworCisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8ICggbiA/IFBTV19ORiA6IDApCisJICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApKTsKK30KKworLyogY21wIGltbTE2LCBkbiAqLwordm9pZCBPUF9GNzQ4MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHosIGMsIG4sIHYsIHp4LCBjeCwgbngsIHZ4OworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSk7CisgIGltbSA9IFRSVU5DIChTRVhUMTYgKGluc24gJiAweGZmZmYpKTsKKyAgdmFsdWUgPSBUUlVOQyAocmVnMSAtIGltbSk7CisKKyAgeiA9ICgodmFsdWUgJiAweGZmZmYpID09IDApOworICB6eCA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMCk7CisgIG54ID0gKHZhbHVlICYgMHg4MDAwMDApOworICBjID0gKChyZWcxICYgMHhmZmZmKSA8IChpbW0gJiAweGZmZmYpKTsKKyAgY3ggPSAocmVnMSA8IGltbSk7CisgIHYgPSAoKHJlZzEgJiAweDgwMDApICE9IChpbW0gJiAweDgwMDApCisgICAgICAgJiYgKHJlZzEgJiAweDgwMDApICE9ICh2YWx1ZSAmIDB4ODAwMCkpOworICB2eCA9ICgocmVnMSAmIDB4ODAwMDAwKSAhPSAoaW1tICYgMHg4MDAwMDApCisgICAgICAgICYmIChyZWcxICYgMHg4MDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGCisJICAgfCBQU1dfWlggfCBQU1dfTlggfCBQU1dfQ1ggfCBQU1dfVlgpOworICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApCisJICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApCisJICB8ICh6eCA/IFBTV19aWCA6IDApIHwgKG54ID8gUFNXX05YIDogMCkKKwkgIHwgKGN4ID8gUFNXX0NYIDogMCkgfCAodnggPyBQU1dfVlggOiAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKCBuID8gUFNXX05GIDogMCkKKwkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkpOworfQorCisvKiBjbXAgaW1tMjQsIGRuICovCit2b2lkIE9QX0Y0NzgwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKKworICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildKTsKKyAgaW1tID0gVFJVTkMgKCgoaW5zbiAmIDB4ZmZmZikgPDwgOCkgKyBleHRlbnNpb24pOworICB2YWx1ZSA9IFRSVU5DIChyZWcxIC0gaW1tKTsKKworICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7CisgIHp4ID0gKHZhbHVlID09IDApOworICBuID0gKHZhbHVlICYgMHg4MDAwKTsKKyAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7CisgIGMgPSAoKHJlZzEgJiAweGZmZmYpIDwgKGltbSAmIDB4ZmZmZikpOworICBjeCA9IChyZWcxIDwgaW1tKTsKKyAgdiA9ICgocmVnMSAmIDB4ODAwMCkgIT0gKGltbSAmIDB4ODAwMCkKKyAgICAgICAmJiAocmVnMSAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7CisgIHZ4ID0gKChyZWcxICYgMHg4MDAwMDApICE9IChpbW0gJiAweDgwMDAwMCkKKyAgICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKKwkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKKwkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKKwkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQorCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKKworICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYpOworICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAoIG4gPyBQU1dfTkYgOiAwKQorCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKSk7Cit9CisKKy8qIGNtcCBpbW0xNiwgYW4gKi8KK3ZvaWQgT1BfRUMwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdiwgengsIGN4LCBueCwgdng7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKKworICByZWcxID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildKTsKKyAgaW1tID0gVFJVTkMgKGluc24gJiAweGZmZmYpOworICB2YWx1ZSA9IFRSVU5DIChyZWcxIC0gaW1tKTsKKworICB6ID0gKCh2YWx1ZSAmIDB4ZmZmZikgPT0gMCk7CisgIHp4ID0gKHZhbHVlID09IDApOworICBuID0gKHZhbHVlICYgMHg4MDAwKTsKKyAgbnggPSAodmFsdWUgJiAweDgwMDAwMCk7CisgIGMgPSAoKHJlZzEgJiAweGZmZmYpIDwgKGltbSAmIDB4ZmZmZikpOworICBjeCA9IChyZWcxIDwgaW1tKTsKKyAgdiA9ICgocmVnMSAmIDB4ODAwMCkgIT0gKGltbSAmIDB4ODAwMCkKKyAgICAgICAmJiAocmVnMSAmIDB4ODAwMCkgIT0gKHZhbHVlICYgMHg4MDAwKSk7CisgIHZ4ID0gKChyZWcxICYgMHg4MDAwMDApICE9IChpbW0gJiAweDgwMDAwMCkKKyAgICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYKKwkgICB8IFBTV19aWCB8IFBTV19OWCB8IFBTV19DWCB8IFBTV19WWCk7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkKKwkgIHwgKGMgPyBQU1dfQ0YgOiAwKSB8ICh2ID8gUFNXX1ZGIDogMCkKKwkgIHwgKHp4ID8gUFNXX1pYIDogMCkgfCAobnggPyBQU1dfTlggOiAwKQorCSAgfCAoY3ggPyBQU1dfQ1ggOiAwKSB8ICh2eCA/IFBTV19WWCA6IDApKTsKKworICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYpOworICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAoIG4gPyBQU1dfTkYgOiAwKQorCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKSk7Cit9CisKKy8qIGNtcCBpbW0yNCwgYW4gKi8KK3ZvaWQgT1BfRjQ3QzAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2LCB6eCwgY3gsIG54LCB2eDsKKyAgdW5zaWduZWQgbG9uZyByZWcxLCBpbW0sIHZhbHVlOworCisgIHJlZzEgPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0pOworICBpbW0gPSBUUlVOQyAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbik7CisgIHZhbHVlID0gVFJVTkMgKHJlZzEgLSBpbW0pOworCisgIHogPSAoKHZhbHVlICYgMHhmZmZmKSA9PSAwKTsKKyAgenggPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDApOworICBueCA9ICh2YWx1ZSAmIDB4ODAwMDAwKTsKKyAgYyA9ICgocmVnMSAmIDB4ZmZmZikgPCAoaW1tICYgMHhmZmZmKSk7CisgIGN4ID0gKHJlZzEgPCBpbW0pOworICB2ID0gKChyZWcxICYgMHg4MDAwKSAhPSAoaW1tICYgMHg4MDAwKQorICAgICAgICYmIChyZWcxICYgMHg4MDAwKSAhPSAodmFsdWUgJiAweDgwMDApKTsKKyAgdnggPSAoKHJlZzEgJiAweDgwMDAwMCkgIT0gKGltbSAmIDB4ODAwMDAwKQorICAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRgorCSAgIHwgUFNXX1pYIHwgUFNXX05YIHwgUFNXX0NYIHwgUFNXX1ZYKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKQorCSAgfCAoYyA/IFBTV19DRiA6IDApIHwgKHYgPyBQU1dfVkYgOiAwKQorCSAgfCAoenggPyBQU1dfWlggOiAwKSB8IChueCA/IFBTV19OWCA6IDApCisJICB8IChjeCA/IFBTV19DWCA6IDApIHwgKHZ4ID8gUFNXX1ZYIDogMCkpOworCisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8ICggbiA/IFBTV19ORiA6IDApCisJICB8IChjID8gUFNXX0NGIDogMCkgfCAodiA/IFBTV19WRiA6IDApKTsKK30KKworLyogYW5kIGRuLCBkbSAqLwordm9pZCBPUF9GMzAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgbiwgejsKKyAgdW5zaWduZWQgbG9uZyB0ZW1wOworCisgIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOworICB0ZW1wICY9IDB4ZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJj0gfjB4ZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gfD0gdGVtcDsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ZmZmZikgPT0gMDsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKSk7Cit9CisKKy8qIGFuZCBpbW04LCBkbiAqLwordm9pZCBPUF9GNTAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCBuLCB6OworICB1bnNpZ25lZCBsb25nIHRlbXA7CisKKyAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gJiAoaW5zbiAmIDB4ZmYpOworICB0ZW1wICY9IDB4ZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSAmPSB+MHhmZmZmOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildIHw9IHRlbXA7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSAmIDB4ZmZmZikgPT0gMDsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildICYgMHg4MDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYpOworICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApKTsKK30KKworLyogYW5kIGltbTE2LCBkbiAqLwordm9pZCBPUF9GNzAwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IG4sIHo7CisgIHVuc2lnbmVkIGxvbmcgdGVtcDsKKworICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gJiAoaW5zbiAmIDB4ZmZmZik7CisgIHRlbXAgJj0gMHhmZmZmOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSAmPSB+MHhmZmZmOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSB8PSB0ZW1wOworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildICYgMHhmZmZmKSA9PSAwOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildICYgMHg4MDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYpOworICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApKTsKK30KKworLyogYW5kIGltbTE2LCBwc3cgKi8KK3ZvaWQgT1BfRjcxMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFBTVyAmPSAoaW5zbiAmIDB4ZmZmZik7Cit9CisKKy8qIG9yIGRuLCBkbSAqLwordm9pZCBPUF9GMzEwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgbiwgejsKKyAgdW5zaWduZWQgbG9uZyB0ZW1wOworCisgIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSB8IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOworICB0ZW1wICY9IDB4ZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJj0gfjB4ZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gfD0gdGVtcDsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ZmZmZikgPT0gMDsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKSk7Cit9CisKKy8qIG9yIGltbTgsIGRuICovCit2b2lkIE9QX0Y1MDgwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IG4sIHo7CisgIHVuc2lnbmVkIGxvbmcgdGVtcDsKKworICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSB8IChpbnNuICYgMHhmZik7CisgIHRlbXAgJj0gMHhmZmZmOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildICY9IH4weGZmZmY7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gfD0gdGVtcDsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildICYgMHhmZmZmKSA9PSAwOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gJiAweDgwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkpOworfQorCisvKiBvciBpbW0xNiwgZG4gKi8KK3ZvaWQgT1BfRjc0MDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCBuLCB6OworICB1bnNpZ25lZCBsb25nIHRlbXA7CisKKyAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildIHwgKGluc24gJiAweGZmZmYpOworICB0ZW1wICY9IDB4ZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gJj0gfjB4ZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gfD0gdGVtcDsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSAmIDB4ZmZmZikgPT0gMDsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSAmIDB4ODAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKSk7Cit9CisKKy8qIG9yIGltbTE2LCBwc3cgKi8KK3ZvaWQgT1BfRjcxNDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFBTVyB8PSAoaW5zbiAmIDB4ZmZmZik7Cit9CisKKy8qIHhvciBkbiwgZG0gKi8KK3ZvaWQgT1BfRjMyMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IG4sIHo7CisgIHVuc2lnbmVkIGxvbmcgdGVtcDsKKworICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gXiBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKKyAgdGVtcCAmPSAweGZmZmY7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICY9IH4weGZmZmY7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildIHw9IHRlbXA7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweGZmZmYpID09IDA7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkpOworfQorCisvKiB4b3IgaW1tMTYsIGRuICovCit2b2lkIE9QX0Y3NEMwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgbiwgejsKKyAgdW5zaWduZWQgbG9uZyB0ZW1wOworCisgIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSBeIChpbnNuICYgMHhmZmZmKTsKKyAgdGVtcCAmPSAweGZmZmY7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildICY9IH4weGZmZmY7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildIHw9IHRlbXA7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gJiAweGZmZmYpID09IDA7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gJiAweDgwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRiB8IFBTV19WRik7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkpOworfQorCisvKiBub3QgZG4gKi8KK3ZvaWQgT1BfRjNFNCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IG4sIHo7CisgIHVuc2lnbmVkIGxvbmcgdGVtcDsKKworICB0ZW1wID0gflN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildOworICB0ZW1wICY9IDB4ZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJj0gfjB4ZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gfD0gdGVtcDsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ZmZmZikgPT0gMDsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKSk7Cit9CisKKy8qIGFzciBkbiAqLwordm9pZCBPUF9GMzM4IChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBsb25nIHRlbXA7CisgIGludCB6LCBuLCBjLCBoaWdoOworCisgIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ZmZmZjsKKyAgYyA9IHRlbXAgJiAxOworICBoaWdoID0gdGVtcCAmIDB4ODAwMDsKKyAgdGVtcCA+Pj0gMTsKKyAgdGVtcCB8PSBoaWdoOworICB0ZW1wICY9IDB4ZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJj0gfjB4ZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gfD0gdGVtcDsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ZmZmZikgPT0gMDsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aRiA6IDApIHwgKG4gPyBQU1dfTkYgOiAwKSB8IChjID8gUFNXX0NGIDogMCkpOworfQorCisvKiBsc3IgZG4gKi8KK3ZvaWQgT1BfRjMzQyAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHosIG4sIGM7CisgIGxvbmcgdGVtcDsKKworICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweGZmZmY7CisgIGMgPSB0ZW1wICYgMTsKKyAgdGVtcCA+Pj0gMTsKKyAgdGVtcCAmPSAweGZmZmY7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICY9IH4weGZmZmY7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildIHw9IHRlbXA7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweGZmZmYpID09IDA7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aRiB8IFBTV19ORiB8IFBTV19DRik7CisgIFBTVyB8PSAoKHogPyBQU1dfWkYgOiAwKSB8IChuID8gUFNXX05GIDogMCkgfCAoYyA/IFBTV19DRiA6IDApKTsKK30KKworLyogcm9yIGRuICovCit2b2lkIE9QX0YzMzQgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisgIGludCBjLG4sejsKKworICB2YWx1ZSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICYgMHhmZmZmOworICBjID0gKHZhbHVlICYgMHgxKTsKKworICB2YWx1ZSA+Pj0gMTsKKyAgdmFsdWUgfD0gKFBTVyAmIFBTV19DRiA/IDB4ODAwMCA6IDApOworICB2YWx1ZSAmPSAweGZmZmY7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICY9IH4weGZmZmY7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildIHw9IHZhbHVlOworICB6ID0gKHZhbHVlID09IDApOworICBuID0gKHZhbHVlICYgMHg4MDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYpOworICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApIHwgKGMgPyBQU1dfQ0YgOiAwKSk7Cit9CisKKy8qIHJvbCBkbiAqLwordm9pZCBPUF9GMzMwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIHZhbHVlOworICBpbnQgYyxuLHo7CisKKyAgdmFsdWUgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ZmZmZjsKKyAgYyA9ICh2YWx1ZSAmIDB4ODAwMCkgPyAxIDogMDsKKworICB2YWx1ZSA8PD0gMTsKKyAgdmFsdWUgfD0gKFBTVyAmIFBTV19DRiA/IDB4MSA6IDApOworICB2YWx1ZSAmPSAweGZmZmY7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICY9IH4weGZmZmY7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildIHw9IHZhbHVlOworICB6ID0gKHZhbHVlID09IDApOworICBuID0gKHZhbHVlICYgMHg4MDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYpOworICBQU1cgfD0gKCh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApIHwgKGMgPyBQU1dfQ0YgOiAwKSk7Cit9CisKKy8qIGJ0c3QgaW1tOCwgZG4gKi8KK3ZvaWQgT1BfRjUwNDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIHRlbXA7CisgIGludCB6OworCisgIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildOworICB0ZW1wICY9IChpbnNuICYgMHhmZik7CisgIHogPSAodGVtcCA9PSAwKTsKKyAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGKTsKKyAgUFNXIHw9ICh6ID8gUFNXX1pGIDogMCk7Cit9CisKKy8qIGJ0c3QgaW1tMTYsIGRuICovCit2b2lkIE9QX0Y3MDQwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIHRlbXA7CisgIGludCB6LCBuLCBjOworCisgIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXTsKKyAgYyA9IHRlbXAgJiAweDE7CisgIHRlbXAgJj0gKGluc24gJiAweGZmZmYpOworICBuID0gKHRlbXAgJiAweDgwMDApICE9IDA7CisgIHogPSAodGVtcCA9PSAwKTsKKyAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGKTsKKyAgUFNXIHw9ICh6ID8gUFNXX1pGIDogMCkgfCAobiA/IFBTV19ORiA6IDApIHwgKGMgPyBQU1dfQ0YgOiAwKTsKK30KKworLyogYnNldCBkbSwgKGFuKSAqLwordm9pZCBPUF9GMDIwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIHRlbXA7CisgIGludCB6OworCisgIHRlbXAgPSBsb2FkX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildKTsKKyAgeiA9ICh0ZW1wICYgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pID09IDA7CisgIHRlbXAgfD0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV07CisgIHN0b3JlX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildLCB0ZW1wKTsKKyAgUFNXICY9IH4oUFNXX1pGIHwgUFNXX05GIHwgUFNXX0NGIHwgUFNXX1ZGKTsKKyAgUFNXIHw9ICh6ID8gUFNXX1pGIDogMCk7Cit9CisKKy8qIGJjbHIgZG0sIChhbikgKi8KK3ZvaWQgT1BfRjAzMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgdW5zaWduZWQgbG9uZyB0ZW1wOworICBpbnQgejsKKworICB0ZW1wID0gbG9hZF9ieXRlIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSk7CisgIHogPSAodGVtcCAmIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildKSA9PSAwOworICB0ZW1wID0gdGVtcCAmIH5TdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXTsKKyAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV0sIHRlbXApOworICBQU1cgJj0gfihQU1dfWkYgfCBQU1dfTkYgfCBQU1dfQ0YgfCBQU1dfVkYpOworICBQU1cgfD0gKHogPyBQU1dfWkYgOiAwKTsKK30KKworLyogYmVxeCBsYWJlbDo4ICovCit2b2lkIE9QX0Y1RTgwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMyBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKFBTVyAmIFBTV19aWCkKKyAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfUENdICsgU0VYVDggKGluc24gJiAweGZmKSk7Cit9CisKKy8qIGJuZXggbGFiZWw6OCAqLwordm9pZCBPUF9GNUU5MDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmICghKFBTVyAmIFBTV19aWCkpCisgICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOworfQorCisvKiBiZ3R4IGxhYmVsOjggKi8KK3ZvaWQgT1BfRjVFMTAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAzIGFmdGVyIHdlIHJldHVybiwgc28KKyAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLworICBpZiAoISgoUFNXICYgUFNXX1pYKQorICAgICAgICB8fCAoKChQU1cgJiBQU1dfTlgpICE9IDApIF4gKChQU1cgJiBQU1dfVlgpICE9IDApKSkpCisgICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOworfQorCisvKiBiZ2V4IGxhYmVsOjggKi8KK3ZvaWQgT1BfRjVFMjAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAzIGFmdGVyIHdlIHJldHVybiwgc28KKyAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLworICBpZiAoISgoKFBTVyAmIFBTV19OWCkgIT0gMCkgXiAoKFBTVyAmIFBTV19WWCkgIT0gMCkpKQorICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKK30KKworLyogYmxleCBsYWJlbDo4ICovCit2b2lkIE9QX0Y1RTMwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMyBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKChQU1cgJiBQU1dfWlgpCisgICAgICAgfHwgKCgoUFNXICYgUFNXX05YKSAhPSAwKSBeICgoUFNXICYgUFNXX1ZYKSAhPSAwKSkpCisgICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOworfQorCisvKiBibHR4IGxhYmVsOjggKi8KK3ZvaWQgT1BfRjVFMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAzIGFmdGVyIHdlIHJldHVybiwgc28KKyAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLworICBpZiAoKChQU1cgJiBQU1dfTlgpICE9IDApIF4gKChQU1cgJiBQU1dfVlgpICE9IDApKQorICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKK30KKworLyogYmhpeCBsYWJlbDo4ICovCit2b2lkIE9QX0Y1RTUwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMyBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKCEoKChQU1cgJiBQU1dfQ1gpICE9IDApIHx8IChQU1cgJiBQU1dfWlgpICE9IDApKQorICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKK30KKworLyogYmNjeCBsYWJlbDo4ICovCit2b2lkIE9QX0Y1RTYwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMyBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKCEoUFNXICYgUFNXX0NYKSkKKyAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfUENdICsgU0VYVDggKGluc24gJiAweGZmKSk7Cit9CisKKy8qIGJsc3ggbGFiZWw6OCAqLwordm9pZCBPUF9GNUU3MDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmICgoKFBTVyAmIFBTV19DWCkgIT0gMCkgfHwgKFBTVyAmIFBTV19aWCkgIT0gMCkKKyAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfUENdICsgU0VYVDggKGluc24gJiAweGZmKSk7Cit9CisKKy8qIGJjc3ggbGFiZWw6OCAqLwordm9pZCBPUF9GNUU0MDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmIChQU1cgJiBQU1dfQ1gpCisgICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOworfQorCisvKiBidmN4IGxhYmVsOjggKi8KK3ZvaWQgT1BfRjVFQzAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAzIGFmdGVyIHdlIHJldHVybiwgc28KKyAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLworICBpZiAoIShQU1cgJiBQU1dfVlgpKQorICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKK30KKworLyogYnZzeCBsYWJlbDo4ICovCit2b2lkIE9QX0Y1RUQwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMyBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKFBTVyAmIFBTV19WWCkKKyAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfUENdICsgU0VYVDggKGluc24gJiAweGZmKSk7Cit9CisKKy8qIGJuY3ggbGFiZWw6OCAqLwordm9pZCBPUF9GNUVFMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmICghKFBTVyAmIFBTV19OWCkpCisgICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOworfQorCisvKiBibnN4IGxhYmVsOjggKi8KK3ZvaWQgT1BfRjVFRjAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAzIGFmdGVyIHdlIHJldHVybiwgc28KKyAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLworICBpZiAoUFNXICYgUFNXX05YKQorICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKK30KKworLyogYmVxIGxhYmVsOjggKi8KK3ZvaWQgT1BfRTgwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMiBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKFBTVyAmIFBTV19aRikKKyAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfUENdICsgU0VYVDggKGluc24gJiAweGZmKSk7Cit9CisKKy8qIGJuZSBsYWJlbDo4ICovCit2b2lkIE9QX0U5MDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDIgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmICghKFBTVyAmIFBTV19aRikpCisgICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOworfQorCisvKiBiZ3QgbGFiZWw6OCAqLwordm9pZCBPUF9FMTAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAyIGFmdGVyIHdlIHJldHVybiwgc28KKyAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLworICBpZiAoISgoUFNXICYgUFNXX1pGKQorICAgICAgICB8fCAoKChQU1cgJiBQU1dfTkYpICE9IDApIF4gKChQU1cgJiBQU1dfVkYpICE9IDApKSkpCisgICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOworfQorCisvKiBiZ2UgbGFiZWw6OCAqLwordm9pZCBPUF9FMjAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAyIGFmdGVyIHdlIHJldHVybiwgc28KKyAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLworICBpZiAoISgoKFBTVyAmIFBTV19ORikgIT0gMCkgXiAoKFBTVyAmIFBTV19WRikgIT0gMCkpKQorICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKK30KKworLyogYmxlIGxhYmVsOjggKi8KK3ZvaWQgT1BfRTMwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMiBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKChQU1cgJiBQU1dfWkYpCisgICAgICAgfHwgKCgoUFNXICYgUFNXX05GKSAhPSAwKSBeICgoUFNXICYgUFNXX1ZGKSAhPSAwKSkpCisgICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOworfQorCisvKiBibHQgbGFiZWw6OCAqLwordm9pZCBPUF9FMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAyIGFmdGVyIHdlIHJldHVybiwgc28KKyAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLworICBpZiAoKChQU1cgJiBQU1dfTkYpICE9IDApIF4gKChQU1cgJiBQU1dfVkYpICE9IDApKQorICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKK30KKworLyogYmhpIGxhYmVsOjggKi8KK3ZvaWQgT1BfRTUwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMiBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKCEoKChQU1cgJiBQU1dfQ0YpICE9IDApIHx8IChQU1cgJiBQU1dfWkYpICE9IDApKQorICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKK30KKworLyogYmNjIGxhYmVsOjggKi8KK3ZvaWQgT1BfRTYwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMiBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKCEoUFNXICYgUFNXX0NGKSkKKyAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfUENdICsgU0VYVDggKGluc24gJiAweGZmKSk7Cit9CisKKy8qIGJscyBsYWJlbDo4ICovCit2b2lkIE9QX0U3MDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDIgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmICgoKFBTVyAmIFBTV19DRikgIT0gMCkgfHwgKFBTVyAmIFBTV19aRikgIT0gMCkKKyAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBUUlVOQyAoU3RhdGUucmVnc1tSRUdfUENdICsgU0VYVDggKGluc24gJiAweGZmKSk7Cit9CisKKy8qIGJjcyBsYWJlbDo4ICovCit2b2lkIE9QX0U0MDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDIgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmIChQU1cgJiBQU1dfQ0YpCisgICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOworfQorCisvKiBidmMgbGFiZWw6OCAqLwordm9pZCBPUF9GNUZDMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmICghKFBTVyAmIFBTV19WRikpCisgICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOworfQorCisvKiBidnMgbGFiZWw6OCAqLwordm9pZCBPUF9GNUZEMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmIChQU1cgJiBQU1dfVkYpCisgICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOworfQorCisvKiBibmMgbGFiZWw6OCAqLwordm9pZCBPUF9GNUZFMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmICghKFBTVyAmIFBTV19ORikpCisgICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOworfQorCisvKiBibnMgbGFiZWw6OCAqLwordm9pZCBPUF9GNUZGMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmIChQU1cgJiBQU1dfTkYpCisgICAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArIFNFWFQ4IChpbnNuICYgMHhmZikpOworfQorCisvKiBicmEgbGFiZWw6OCAqLwordm9pZCBPUF9FQTAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAyIGFmdGVyIHdlIHJldHVybiwgc28KKyAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLworICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKTsKK30KKworLyogam1wIChhbikgKi8KK3ZvaWQgT1BfRjAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfUENdID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildIC0gMik7Cit9CisKKy8qIGptcCBsYWJlbDoxNiAqLwordm9pZCBPUF9GQzAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUMTYgKGluc24gJiAweGZmZmYpKTsKK30KKworLyogam1wIGxhYmVsOjI0ICovCit2b2lkIE9QX0Y0RTAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19QQ10KKyAgICA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyAoKChpbnNuICYgMHhmZmZmKSA8PCA4KSArIGV4dGVuc2lvbikpOworfQorCisvKiBqc3IgKGFuKSAqLwordm9pZCBPUF9GMDAxIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBpbnQgbmV4dF9wYywgc3A7CisKKyAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07CisgIHNwIC09IDQ7CisgIFN0YXRlLnJlZ3NbUkVHX1NQXSA9IHNwOworICBuZXh0X3BjID0gU3RhdGUucmVnc1tSRUdfUENdICsgMjsKKyAgU3RhdGUubWVtW3NwXSA9IG5leHRfcGMgJiAweGZmOworICBTdGF0ZS5tZW1bc3ArMV0gPSAobmV4dF9wYyAmIDB4ZmYwMCkgPj4gODsKKyAgU3RhdGUubWVtW3NwKzJdID0gKG5leHRfcGMgJiAweGZmMDAwMCkgPj4gMTY7CisgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSAtIDIpOworfQorCisvKiBqc3IgbGFiZWw6MTYgKi8KK3ZvaWQgT1BfRkQwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBpbnQgbmV4dF9wYywgc3A7CisKKyAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07CisgIHNwIC09IDQ7CisgIFN0YXRlLnJlZ3NbUkVHX1NQXSA9IHNwOworICBuZXh0X3BjID0gU3RhdGUucmVnc1tSRUdfUENdICsgMzsKKyAgU3RhdGUubWVtW3NwXSA9IG5leHRfcGMgJiAweGZmOworICBTdGF0ZS5tZW1bc3ArMV0gPSAobmV4dF9wYyAmIDB4ZmYwMCkgPj4gODsKKyAgU3RhdGUubWVtW3NwKzJdID0gKG5leHRfcGMgJiAweGZmMDAwMCkgPj4gMTY7CisgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFRSVU5DIChTdGF0ZS5yZWdzW1JFR19QQ10gKyBTRVhUMTYgKGluc24gJiAweGZmZmYpKTsKK30KKworLyoganNyIGxhYmVsOjI0ICovCit2b2lkIE9QX0Y0RTEwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBpbnQgbmV4dF9wYywgc3A7CisKKyAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07CisgIHNwIC09IDQ7CisgIFN0YXRlLnJlZ3NbUkVHX1NQXSA9IHNwOworICBuZXh0X3BjID0gU3RhdGUucmVnc1tSRUdfUENdICsgNTsKKyAgU3RhdGUubWVtW3NwXSA9IG5leHRfcGMgJiAweGZmOworICBTdGF0ZS5tZW1bc3ArMV0gPSAobmV4dF9wYyAmIDB4ZmYwMCkgPj4gODsKKyAgU3RhdGUubWVtW3NwKzJdID0gKG5leHRfcGMgJiAweGZmMDAwMCkgPj4gMTY7CisgIFN0YXRlLnJlZ3NbUkVHX1BDXQorICAgID0gVFJVTkMgKFN0YXRlLnJlZ3NbUkVHX1BDXSArICgoKGluc24gJiAweGZmZmYpIDw8IDgpICsgZXh0ZW5zaW9uKSk7Cit9CisKKy8qIHJ0cyAqLwordm9pZCBPUF9GRSAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgdW5zaWduZWQgaW50IHNwOworCisgIHNwID0gU3RhdGUucmVnc1tSRUdfU1BdOworICBTdGF0ZS5yZWdzW1JFR19QQ10gPSAoU3RhdGUubWVtW3NwXSB8IChTdGF0ZS5tZW1bc3ArMV0gPDwgOCkKKwkgICAgICB8IChTdGF0ZS5tZW1bc3ArMl0gPDwgMTYpKTsKKyAgU3RhdGUucmVnc1tSRUdfUENdIC09IDE7CisgIFN0YXRlLnJlZ3NbUkVHX1NQXSArPSA0OworfQorCisvKiBydGkgKi8KK3ZvaWQgT1BfRUIgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFBTVyA9IGxvYWRfaGFsZiAoU3RhdGUucmVnc1tSRUdfQTAgKyAzXSk7CisgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IGxvYWRfM19ieXRlIChTdGF0ZS5yZWdzW1JFR19BMCArIDNdICsgMikgLSAxOworICBTdGF0ZS5yZWdzW1JFR19BMCArIDNdICs9IDY7Cit9CisKKy8qIHN5c2NhbGwgKi8KK3ZvaWQgT1BfRjAxMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogV2UgdXNlIHRoaXMgZm9yIHNpbXVsYXRlZCBzeXN0ZW0gY2FsbHM7IHdlIG1heSBuZWVkIHRvIGNoYW5nZQorICAgICBpdCB0byBhIHJlc2VydmVkIGluc3RydWN0aW9uIGlmIHdlIGNvbmZsaWN0IHdpdGggdXNlcyBhdAorICAgICBNYXRzdXNoaXRhLiAgKi8KKyAgaW50IHNhdmVfZXJybm8gPSBlcnJubzsJCisgIGludCBvZmZzZXQgPSA2OworICBlcnJubyA9IDA7CisKKy8qIFJlZ2lzdGVycyBwYXNzZWQgdG8gc3lzY2FsbCAwICovCisKKy8qIEZ1bmN0aW9uIG51bWJlci4gICovCisjZGVmaW5lIEZVTkMgICAoU3RhdGUucmVnc1swXSkKKworI2RlZmluZSBQQVJNMSAgKFN0YXRlLnJlZ3NbMV0pCisKKy8qIFBhcmFtZXRlcnMuICAqLworI2RlZmluZSBQQVJNKHgsIHkpIChsb2FkX21lbSAoU3RhdGUucmVnc1tSRUdfU1BdICsgeCwgeSkpCisKKy8qIFJlZ2lzdGVycyBzZXQgYnkgc3lzY2FsbCAwICovCisKKyNkZWZpbmUgUkVUVkFMIFN0YXRlLnJlZ3NbMF0JLyogcmV0dXJuIHZhbHVlICovCisjZGVmaW5lIFJFVEVSUiBTdGF0ZS5yZWdzWzFdCS8qIHJldHVybiBlcnJvciBjb2RlICovCisKKy8qIFR1cm4gYSBwb2ludGVyIGluIGEgcmVnaXN0ZXIgaW50byBhIHBvaW50ZXIgaW50byByZWFsIG1lbW9yeS4gKi8KKworI2RlZmluZSBNRU1QVFIoeCkgKFN0YXRlLm1lbSArICh4ICYgMHhmZmZmZmYpKQorCisgIHN3aXRjaCAoRlVOQykKKyAgICB7CisjaWYgIWRlZmluZWQoX19HTzMyX18pICYmICFkZWZpbmVkKF9XSU4zMikKKyNpZmRlZiBUQVJHRVRfU1lTX2ZvcmsKKyAgICAgIGNhc2UgVEFSR0VUX1NZU19mb3JrOgorICAgICAgUkVUVkFMID0gZm9yayAoKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgVEFSR0VUX1NZU19leGVjdmUKKyAgICBjYXNlIFRBUkdFVF9TWVNfZXhlY3ZlOgorICAgICAgUkVUVkFMID0gZXhlY3ZlIChNRU1QVFIgKFBBUk0xKSwgKGNoYXIgKiopIE1FTVBUUiAoUEFSTSAoNCwgNCkpLAorCQkgICAgICAgKGNoYXIgKiopTUVNUFRSIChQQVJNICg4LCA0KSkpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBUQVJHRVRfU1lTX2V4ZWN2CisgICAgY2FzZSBUQVJHRVRfU1lTX2V4ZWN2OgorICAgICAgUkVUVkFMID0gZXhlY3ZlIChNRU1QVFIgKFBBUk0xKSwgKGNoYXIgKiopIE1FTVBUUiAoUEFSTSAoNCwgNCkpLCBOVUxMKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisjZW5kaWYKKworICAgIGNhc2UgVEFSR0VUX1NZU19yZWFkOgorICAgICAgUkVUVkFMID0gbW4xMDIwMF9jYWxsYmFjay0+cmVhZCAobW4xMDIwMF9jYWxsYmFjaywgUEFSTTEsIAorCQkJCSAgICAgICBNRU1QVFIgKFBBUk0gKDQsIDQpKSwgUEFSTSAoOCwgNCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQVJHRVRfU1lTX3dyaXRlOgorICAgICAgUkVUVkFMID0gKGludCltbjEwMjAwX2NhbGxiYWNrLT53cml0ZSAobW4xMDIwMF9jYWxsYmFjaywgUEFSTTEsCisJCQkJCSAgICAgTUVNUFRSIChQQVJNICg0LCA0KSksCisJCQkJCSAgICAgUEFSTSAoOCwgNCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQVJHRVRfU1lTX2xzZWVrOgorICAgICAgUkVUVkFMID0gbW4xMDIwMF9jYWxsYmFjay0+bHNlZWsgKG1uMTAyMDBfY2FsbGJhY2ssIFBBUk0xLAorCQkJCQlQQVJNICg0LCA0KSwgUEFSTSAoOCwgMikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQVJHRVRfU1lTX2Nsb3NlOgorICAgICAgUkVUVkFMID0gbW4xMDIwMF9jYWxsYmFjay0+Y2xvc2UgKG1uMTAyMDBfY2FsbGJhY2ssIFBBUk0xKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFSR0VUX1NZU19vcGVuOgorICAgICAgUkVUVkFMID0gbW4xMDIwMF9jYWxsYmFjay0+b3BlbiAobW4xMDIwMF9jYWxsYmFjaywgTUVNUFRSIChQQVJNMSksCisJCQkJICAgICAgIFBBUk0gKDQsIDIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFSR0VUX1NZU19leGl0OgorICAgICAgLyogRVhJVCAtIGNhbGxlciBjYW4gbG9vayBpbiBQQVJNMSB0byB3b3JrIG91dCB0aGUgCisJIHJlYXNvbiAqLworICAgICAgaWYgKFBBUk0xID09IDB4ZGVhZCkKKwlTdGF0ZS5leGNlcHRpb24gPSBTSUdBQlJUOworICAgICAgZWxzZQorCVN0YXRlLmV4Y2VwdGlvbiA9IFNJR1FVSVQ7CisgICAgICBTdGF0ZS5leGl0ZWQgPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRBUkdFVF9TWVNfc3RhdDoJLyogYWRkZWQgYXQgaG1zaSAqLworICAgICAgLyogc3RhdCBzeXN0ZW0gY2FsbCAqLworICAgICAgeworCXN0cnVjdCBzdGF0IGhvc3Rfc3RhdDsKKwlyZWdfdCBidWY7CisKKwlSRVRWQUwgPSBzdGF0IChNRU1QVFIgKFBBUk0xKSwgJmhvc3Rfc3RhdCk7CisJCisJYnVmID0gUEFSTSAoNCwgNCk7CisKKwkvKiBKdXN0IHdpbGQtYXNzZWQgZ3Vlc3Nlcy4gICovCisJc3RvcmVfaGFsZiAoYnVmLCBob3N0X3N0YXQuc3RfZGV2KTsKKwlzdG9yZV9oYWxmIChidWYgKyAyLCBob3N0X3N0YXQuc3RfaW5vKTsKKwlzdG9yZV93b3JkIChidWYgKyA0LCBob3N0X3N0YXQuc3RfbW9kZSk7CisJc3RvcmVfaGFsZiAoYnVmICsgOCwgaG9zdF9zdGF0LnN0X25saW5rKTsKKwlzdG9yZV9oYWxmIChidWYgKyAxMCwgaG9zdF9zdGF0LnN0X3VpZCk7CisJc3RvcmVfaGFsZiAoYnVmICsgMTIsIGhvc3Rfc3RhdC5zdF9naWQpOworCXN0b3JlX2hhbGYgKGJ1ZiArIDE0LCBob3N0X3N0YXQuc3RfcmRldik7CisJc3RvcmVfd29yZCAoYnVmICsgMTYsIGhvc3Rfc3RhdC5zdF9zaXplKTsKKwlzdG9yZV93b3JkIChidWYgKyAyMCwgaG9zdF9zdGF0LnN0X2F0aW1lKTsKKwlzdG9yZV93b3JkIChidWYgKyAyOCwgaG9zdF9zdGF0LnN0X210aW1lKTsKKwlzdG9yZV93b3JkIChidWYgKyAzNiwgaG9zdF9zdGF0LnN0X2N0aW1lKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisjaWZkZWYgVEFSR0VUX1NZU19jaG93bgorICAgIGNhc2UgVEFSR0VUX1NZU19jaG93bjoKKyAgICAgIFJFVFZBTCA9IGNob3duIChNRU1QVFIgKFBBUk0xKSwgUEFSTSAoNCwgMiksIFBBUk0gKDYsIDIpKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBUQVJHRVRfU1lTX2NobW9kOgorICAgICAgUkVUVkFMID0gY2htb2QgKE1FTVBUUiAoUEFSTTEpLCBQQVJNICg0LCAyKSk7CisgICAgICBicmVhazsKKyNpZmRlZiBUQVJHRVRfU1lTX3RpbWUKKyAgICBjYXNlIFRBUkdFVF9TWVNfdGltZToKKyAgICAgIFJFVFZBTCA9IHRpbWUgKCh0aW1lX3QgKilNRU1QVFIgKFBBUk0xKSk7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIFRBUkdFVF9TWVNfdGltZXMKKyAgICBjYXNlIFRBUkdFVF9TWVNfdGltZXM6CisgICAgICB7CisJc3RydWN0IHRtcyB0bXM7CisJUkVUVkFMID0gdGltZXMgKCZ0bXMpOworCXN0b3JlX3dvcmQgKFBBUk0xLCB0bXMudG1zX3V0aW1lKTsKKwlzdG9yZV93b3JkIChQQVJNMSArIDQsIHRtcy50bXNfc3RpbWUpOworCXN0b3JlX3dvcmQgKFBBUk0xICsgOCwgdG1zLnRtc19jdXRpbWUpOworCXN0b3JlX3dvcmQgKFBBUk0xICsgMTIsIHRtcy50bXNfY3N0aW1lKTsKKwlicmVhazsKKyAgICAgIH0KKyNlbmRpZgorI2lmZGVmIFRBUkdFVF9TWVNfZ2V0dGltZW9mZGF5CisgICAgY2FzZSBUQVJHRVRfU1lTX2dldHRpbWVvZmRheToKKyAgICAgIHsKKwlzdHJ1Y3QgdGltZXZhbCB0OworCXN0cnVjdCB0aW1lem9uZSB0ejsKKwlSRVRWQUwgPSBnZXR0aW1lb2ZkYXkgKCZ0LCAmdHopOworCXN0b3JlX3dvcmQgKFBBUk0xLCB0LnR2X3NlYyk7CisJc3RvcmVfd29yZCAoUEFSTTEgKyA0LCB0LnR2X3VzZWMpOworCXN0b3JlX3dvcmQgKFBBUk0gKDQsIDQpLCB0ei50el9taW51dGVzd2VzdCk7CisJc3RvcmVfd29yZCAoUEFSTSAoNCwgNCkgKyA0LCB0ei50el9kc3R0aW1lKTsKKwlicmVhazsKKyAgICAgIH0KKyNlbmRpZgorI2lmZGVmIFRBUkdFVF9TWVNfdXRpbWUKKyAgICBjYXNlIFRBUkdFVF9TWVNfdXRpbWU6CisgICAgICAvKiBDYXN0IHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdm9pZCAqLCB0byBhdm9pZCB0eXBlIG1pc21hdGNoCisJIGlmIGEgcHJvdG90eXBlIGlzIHByZXNlbnQuICAqLworICAgICAgUkVUVkFMID0gdXRpbWUgKE1FTVBUUiAoUEFSTTEpLCAodm9pZCAqKSBNRU1QVFIgKFBBUk0gKDQsIDQpKSk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9CisgIFJFVEVSUiA9IGVycm5vOworICBlcnJubyA9IHNhdmVfZXJybm87Cit9CisKKy8qIG5vcCAqLwordm9pZCBPUF9GNiAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKK30KKworLyogYnJlYWtwb2ludCAqLwordm9pZAorT1BfRkYgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR1RSQVA7CisgIFBDIC09IDE7Cit9CmRpZmYgLS1naXQgYS9zaW0vbW4xMDMwMC9DaGFuZ2VMb2cgYi9zaW0vbW4xMDMwMC9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5MjA5OQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tbjEwMzAwL0NoYW5nZUxvZwpAQCAtMCwwICsxLDgxNSBAQAorMTk5OC0xMi0yOSAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFdJVEhfQ09NTU9OX09CSlMpOiBCdWlsZCBhbHNvIGR2LXNvY2tzZXIuby4KKwkqIGludGVycC5jIChzaW1fb3Blbik6IEFkZCBzdHViIG1uMTAzMDAyIGNhY2hlIGNvbnRyb2wgbWVtb3J5IHJlZ2lvbnMuCisJU2V0IE9QRVJBVElOR19FTlZJUk9OTUVOVCBvbiAic3RkZXZhbDEiIGJvYXJkLgorCShtbjEwMzAwX2NvcmVfc2lnbmFsKTogTmV3IGZ1bmN0aW9uIHRvIGludGVyY2VwdCBtZW1vcnkgZXJyb3JzLgorCShwcm9ncmFtX2ludGVycnVwdCk6IE5ldyBmdW5jdGlvbiB0byBkaXNwYXRjaCB0byBleGNlcHRpb24gdmVjdG9yCisJKG1uMTAzMDBfZXhjZXB0aW9uXyopOiBOZXcgZnVuY3Rpb25zIHRvIHNuYXBzaG90IHByZS9wb3N0IGV4Y2VwdGlvbgorCXN0YXRlLgorCSogc2ltLW1haW4uaCAoU0lNX0NPUkVfU0lHTkFMKTogRGVmaW5lIGhvb2sgLSBjYWxsIG1uMTAzMDBfY29yZV9zaWduYWwuCisJKFNJTV9FTkdJTkVfSEFMVF9IT09LKTogRG8gbm90aGluZy4gCisJKFNJTV9DUFVfRVhDRVBUSU9OKik6IERlZmluZSBob29rcyB0byBjYWxsIG1uMTAzMDBfY3B1X2V4Y2VwdGlvbiooKS4KKwkoX3NpbV9jcHUpOiBBZGQgZXhjXyogZmllbGRzIHRvIHN0b3JlIHJlZ2lzdGVyIHZhbHVlIHNuYXBzaG90cy4JCisJKiBkdi1tbjEwM3Nlci5jICgqKTogU3VwcG9ydCBkdi1zb2Nrc2VyIGJhY2tlbmQgZm9yIFVBUlQgSS9PLgorCVZhcmlvdXMgZW5kaWFubmVzcyBhbmQgd2FybmluZyBmaXhlcy4KKwkqIG1uMTAzMDAuaWdlbiAoaWxsZWdhbCk6IENhbGwgcHJvZ3JhbV9pbnRlcnJ1cHQgb24gZXJyb3IuCisJKGJyZWFrKTogQ2FsbCBwcm9ncmFtX2ludGVycnVwdCBvbiBicmVha3BvaW50CisJCisJU2V2ZXJhbCBjaGFuZ2VzIGZyb20gPGphbmN6eW5AY3lnbnVzLmNvbT4gYW5kIDxjYWduZXlAY3lnbnVzLmNvbT4KKwltZXJnZWQgaW46CisJKiBkdi1tbjEwM2ludC5jIChtbjEwM2ludF9pb2N0bCk6IE5ldyBmdW5jdGlvbiBmb3IgTk1JCisJZ2VuZXJhdGlvbi4gKG1uMTAzaW50X2ZpbmlzaCk6IEluc3RhbGwgaXQgYXMgaW9jdGwgaGFuZGxlci4KKwkqIGR2LW1uMTAzdGltLmM6IFN1cHBvcnQgdGltZXIgNiBzcGVjaWFsbHkuICBFbmRpYW5uZXNzIGZpeGVzLgorCQorRnJpIEF1ZyAyOCAxNDo0MDo0OSAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBDaGVjayBmb3IgaW52YWxpZCAtLWJvYXJkIG9wdGlvbiwgZml4CisJaW5kZW50YXRpb24sIGFsbG9jYXRlIG1lbW9yeSBmb3IgbWVtIGNvbnRyb2wgYW5kIERNQSByZWdzLgorCitXZWQgQXVnIDI2IDA5OjI5OjM4IDE5OTggIEpveWNlIEphbmN6eW4gIDxqYW5jenluQGN5Z251cy5jb20+CisKKwkqIG1uMTAzMDAuaWdlbiAoZGl2LGRpdnUpOiBGaXggZGl2aWRlIGluc3RydWN0aW9ucyBzbyBkaXZpZGUgYnkgMAorCWJlaGF2ZXMgbGlrZSB0aGUgaGFyZHdhcmUuCisKK01vbiBBdWcgMjQgMTE6NTA6MDkgMTk5OCAgSm95Y2UgSmFuY3p5biAgPGphbmN6eW5AY3lnbnVzLmNvbT4KKworCSogc2ltLW1haW4uaCAoU0lNX0hBTkRMRVNfTE1BKTogRGVmaW5lIFNJTV9IQU5ETEVTX0xNQS4KKworRnJpIEp1bCAyNCAxODoxNToyMSAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgorCisJKiBvcF91dGlscy5jIChkb19zeXNjYWxsKTogUmV3cml0ZSB0byB1c2UgY29tbW9uL3N5c2NhbGwuYy4KKwkoc3lzY2FsbF9yZWFkX21lbSwgc3lzY2FsbF93cml0ZV9tZW0pOiBOZXcgZnVuY3Rpb25zIGZvciBzeXNjYWxsCisJY2FsbGJhY2tzLgorCSogbW4xMDMwMF9zaW0uaDogQWRkIHByb3RvdHlwZXMgZm9yIHN5c2NhbGxfcmVhZF9tZW0gYW5kCisJc3lzY2FsbF93cml0ZV9tZW0uIAorCSogbW4xMDMwMC5pZ2VuOiBDaGFuZ2UgQysrIHN0eWxlIGNvbW1lbnRzIHRvIEMgc3R5bGUgY29tbWVudHMuCisJQ2hlY2sgZm9yIGRpdmlkZSBieSB6ZXJvIGluIGRpdiBhbmQgZGl2dSBvcHMuCisKK1RodSBKdWwgIDkgMTA6MDY6NTUgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMzAwLmlnZW46IEZpeCBaIGJpdCBmb3IgYWRkYyBhbmQgc3ViYyBpbnN0cnVjdGlvbnMuCisJTWlub3IgZml4ZXMgaW4gbXVsdGlwbHkvZGl2aWRlIHBhdHRlcm5zLgorCisKK1dlZCBKdWwgIDEgMTc6MDc6MDkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMzAwX3NpbS5oIChGRVRDSDI0KTogRGVmaW5lLgorCisKK1R1ZSBKdW4gMzAgMTE6MjM6MjAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMzAwX3NpbS5oOiBJbmNsdWRlIGJmZC5oCisJKHN0cnVjdCBzdGF0ZSk6IEFkZCBtb3JlIHJvb20gZm9yIHByb2Nlc3NvciBzcGVjaWZpYyByZWdpc3RlcnMuCisKK1RodSBKdW4gMjUgMTA6MTI6MDMgMTk5OCAgSm95Y2UgSmFuY3p5biAgPGphbmN6eW5AY3lnbnVzLmNvbT4KKworCSogZHYtbW4xMDN0aW0uYzogSW5jbHVkZSBzaW0tYXNzZXJ0LmgKKwkqIGR2LW1uMTAzc2VyLmMgKGRvX3BvbGxpbmdfZXZlbnQpOiBDaGVjayBmb3IgaW5jb21pbmcgZGF0YSBvbgorCXNlcmlhbCBsaW5lIGFuZCBzY2hlZHVsZSBuZXh0IHBvbGxpbmcgZXZlbnQuCisJKHJlYWRfc3RhdHVzX3JlZyk6IHNjaGVkdWxlIGV2ZW50cyB0byBjaGVjayBmb3IgaW5jb21pbmcgZGF0YSBvbgorCXNlcmlhbCBsaW5lIGFuZCBpc3N1ZSBpbnRlcnJ1cHQgaWYgbmVjZXNzYXJ5LgorCQorRnJpIEp1biAxOSAxNjo0NzoyNyAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBob29rIHVwIHNlcmlhbCAxIGFuZCAyIHBvcnRzIHByb3Blcmx5ICh0eXBvKS4KKworRnJpIEp1biAxOSAxMTo1OToyNiAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoYm9hcmQpOiBSZW5hbWUgYW0zMiB0byBzdGRldmFsMSBhcyB0aGlzIGlzIHRoZSBuYW1lCisJY29uc2lzdGVudGx5IHVzZWQgdG8gcmVmZXIgdG8gdGhlIG1uMTAzMDAwMiBib2FyZC4KKworVGh1IEp1bmUgMTggMTQ6Mzc6MTQgMTk5OCAgSm95Y2UgSmFuY3p5biAgPGphbmN6eW5AY3lnbnVzLmNvbT4KKwkqIGludGVycC5jIChzaW1fb3Blbik6IEZpeCB0eXBvIGluIGFkZHJlc3Mgb2YgRVhUTUQgcmVnaXN0ZXIKKwkoMHgzNDAwMDI4MCwgbm90IDB4MzQwMDI4MCkuCisKK1dlZCBKdW4gMTcgMTg6MDA6MTggMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYyAoc3lzY2FsbCk6IEhhbmRsZSBjaGFuZ2UgaW4gb3Bjb2RlICMgZm9yIHN5c2NhbGwuCisJKiBtbjEwMzAwLmlnZW4gKHN5c2NhbGwpOiBMaWtld2lzZS4KKworVHVlIEp1bmUgMTYgMDk6MzY6MjEgMTk5OCAgSm95Y2UgSmFuY3p5biAgPGphbmN6eW5AY3lnbnVzLmNvbT4KKwkqIGR2LW1uMTAzaW50LmMgKG1uMTAzaW50X2ZpbmlzaCk6IFJlZ3VsYXIgaW50ZXJydXB0cyAobm90IE5NSSBvcgorCXJlc2V0KSBhcmUgbm90IGVuYWJsZWQgb24gcmVzZXQuCisJCitTdW4gSnVuZSAxNCAxNzowNDowMCAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgorCSogZHYtbW4xMDNpb3AuYyAod3JpdGVfKl9yZWcpOiBDaGVjayBmb3IgYXR0ZW1wdCB0byB3cml0ZSByL28KKwlyZWdpc3RlciBiaXRzLgorCSogZHYtbW4xMDNzZXIuYzogRmlsbCBpbiBtZXRob2RzIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHRvIHNlcmlhbAorCWRldmljZSByZWdpc3RlcnMuCisJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBNYWtlIHRoZSBzZXJpYWwgZGV2aWNlIGEgcG9sbGluZyBkZXZpY2UuCisJCitGcmkgSnVuZSAxMiAxNjoyNDowMCAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgorCSogZHYtbW4xMDNpb3AuYzogTmV3IGZpbGUgZm9yIGhhbmRsaW5nIGFtMzIgaW8gcG9ydHMuCisJKiBjb25maWd1cmUuaW46IEFkZCBtbjEwM2lvcCB0byBod19kZXZpY2UgbGlzdC4KKwkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCisJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBDcmVhdGUgaW8gcG9ydCBkZXZpY2UuCisKK1dlZCBKdW5lIDEwIDE0OjM0OjAwIDE5OTggIEpveWNlIEphbmN6eW4gIDxqYW5jenluQGN5Z251cy5jb20+CisJKiBkdi1tbjEwM2ludC5jIChleHRlcm5hbF9ncm91cCk6IFVzZSBlbnVtZXJhdGVkIHR5cGVzIHRvIGFjY2VzcworCWNvcnJlY3QgZ3JvdXAgYWRkcmVzc2VzLgorCSogZHYtbW4xMDN0aW0uYyAoZG9fY291bnRlcl9ldmVudCk6IFVuZGVyZmxvdyBvZiBjYXNjYWRlZCB0aW1lcgorCXRyaWdnZXJzIGFuIGludGVycnVwdCBvbiB0aGUgaGlnaGVyLW51bWJlcmVkIHRpbWVyJ3MgcG9ydC4KKworTW9uIEp1bmUgOCAxMzozMDowMCAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgorCSogaW50ZXJwLmM6IChtbjEwMzAwX29wdGlvbl9oYW5kbGVyKTogTmV3IGZ1bmN0aW9uIHBhcnNlcyBhcmd1bWVudHMKKwl1c2luZyBzaW0tb3B0aW9ucy4KKwkqIChib2FyZCk6IEFkZCAtLWJvYXJkIG9wdGlvbiBmb3Igc3BlY2lmeWluZyBhbTMyLgorCSogKHNpbV9vcGVuKTogQ3JlYXRlIG5ldyB0aW1lciBhbmQgc2VyaWFsIGRldmljZXMgYW5kIGNvbnRyb2wKKwljb25maWd1cmF0aW9uIG9mIG90aGVyIGFtMzIgZGV2aWNlcyB2aWEgYm9hcmQgb3B0aW9uLgorCSogZHYtbW4xMDN0aW0uYywgZHYtbW4xMDNzZXIuYzogTmV3IGZpbGVzIGZvciB0aW1lcnMgYW5kIHNlcmlhbCBkZXZpY2VzLgorCSogZHYtbW4xMDNjcHUuYzogRml4IHR5cG9zIGluIG9wZW5pbmcgY29tbWVudHMuCisJKiBkdi1tbjEwM2ludC5jOiBBZGp1c3QgaW50ZXJydXB0IGNvbnRyb2xsZXIgc2V0dGluZ3MgZm9yIGFtMzIgaW5zdGVhZCBvZiBhbTMwLgorCSogY29uZmlndXJlLmluOiBBZGQgbW4xMDN0aW0gYW5kIG1uMTAzc2VyIHRvIGh3X2RldmljZSBsaXN0LgorCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKworTW9uIE1heSAyNSAyMDo1MDozNSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGR2LW1uMTAzaW50LmMsIGR2LW1uMTAzY3B1LmM6IFJlbmFtZSAqX2NhbGxiYWNrIHRvICpfbWV0aG9kLgorCisJKiBkdi1tbjEwM2NwdS5jLCBkdi1tbjEwM2ludC5jOiBJbmNsdWRlIGh3LW1haW4uaCBhbmQKKyAJc2ltLW1haW4uaC4gRGVjbGFyZSBhIHN0cnVjdCBod19kZXNjcmlwdG9yIGluc3RlYWQgb2Ygc3RydWN0CisgCWh3X2RldmljZV9kZXNjcmlwdG9yLgorCitNb24gTWF5IDI1IDE3OjMzOjMzIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogZHYtbW4xMDNjcHUuYyAoc3RydWN0IG1uMTAzY3B1KTogQ2hhbmdlIHR5cGUgb2YgcGVuZGluZ19oYW5kbGVyCisgCXRvIHN0cnVjdCBod19ldmVudC4KKworRnJpIE1heSAyMiAxMjoxNzo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoU0lNX0FDX09QVElPTl9IQVJEV0FSRSk6IEFkZCBhcmd1bWVudCAieWVzIi4KKworV2VkIE1heSAgNiAxMzoyOTowNiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IENyZWF0ZSBhIHBvbGxpbmcgUEFMIGRldmljZS4KKworRnJpIE1heSAgMSAxNjozOToxNSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGR2LW1uMTAzaW50LmMgKG1uMTAzaW50X3BvcnRfZXZlbnQpOiAKKwkobW4xMDNpbnRfcG9ydF9ldmVudCk6IAorCShtbjEwM2ludF9pb19yZWFkX2J1ZmZlcik6IAorCShtbjEwM2ludF9pb193cml0ZV9idWZmZXIpOiAKKworCSogZHYtbW4xMDNjcHUuYyAoZGVsaXZlcl9tbjEwM2NwdV9pbnRlcnJ1cHQpOiBEcm9wIENQVS9DSUEgYXJncy4KKwkobW4xMDNjcHVfcG9ydF9ldmVudCk6IERpdHRvLgorCShtbjEwM2NwdV9pb19yZWFkX2J1ZmZlcik6IERpdHRvLgorCShtbjEwM2NwdV9pb193cml0ZV9idWZmZXIpOiBEaXR0by4KKworVHVlIEFwciAyOCAxODozMzozMSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitTdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitTdW4gQXByIDI2IDE1OjE5OjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogYWNjb25maWcuaDogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KKworRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworRnJpIEFwciAyNCAxMToxOTowNyAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY2FsbCBzaW5jbHVkZS4KKworVHVlIEFwciAxNCAxMDowMzowMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIG1uMTAzMDBfc2ltLmg6IERlY2xhcmUgYWxsIGZ1bmN0aW9ucyBpbiBvcF91dGlscy5jIHVzaW5nCisgCUlOTElORV9TSU1fTUFJTi4KKwkqIG9wX3V0aWxzLmM6IERpdHRvLgorCSogc2ltLW1haW4uYzogTmV3IGZpbGUuICBJbmNsdWRlIG9wX3V0aWxzLmMuCisJCisJKiBtbjEwMzAwLmlnZW4gKG1vdiwgY21wKTogVXNlIG5ldyBpZ2VuIG9wZXJhdG9ycyBgIScgYW5kIGA9JyB0bworIAlkaWZmZXJlbnRpYXRlIGJldHdlZW4gTU9WL0NNUCBpbW1lZGlhdGUvcmVnaXN0ZXIgaW5zdHJ1Y3Rpb25zLgorCisJKiBjb25maWd1cmUuaW4gKFNJTV9BQ19PUFRJT05fSU5MSU5FKTogQWRkIGFuZCBlbmFibGUuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKK1NhdCBBcHIgIDQgMjA6MzY6MjUgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK0ZyaSBNYXIgMjcgMTY6MTU6NTIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoaHcpOiBEZWxldGUgdmFyaWFibGUsIG1vdmVkIHRvIFNJTV9ERVNDLgorCShzaW1fb3Blbik6IERlbGV0ZSBjYWxscyB0byBod190cmVlX2NyZWF0ZSwgaHdfdHJlZV9maW5pc2guCisgIAlIYW5kbGVkIGJ5IHNpbS1tb2R1bGUuCisJKHNpbV9vcGVuKTogRG8gbm90IGFub3RhdGUgdHJlZSB3aXRoIHRyYWNlIHByb3BlcnRpZXMsIGhhbmRsZWQgYnkKKyAJc2ltLWh3LmMKKwkoc2ltX29wZW4pOiBDYWxsIHNpbV9od19wYXJzZSBpbnN0ZWFkIG9mIGh3X3RyZWVfcGFyc2UuCisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVGh1IE1hciAyNiAyMDo0NjoxOCAxOTk4ICBTdHUgR3Jvc3NtYW4gIDxncm9zc21hbkBiaHVuYS5jeWdudXMuY28udWs+CisKKwkqIGR2LW1uMTAzY3B1LmMgKGRlbGl2ZXJfbW4xMDNjcHVfaW50ZXJydXB0KTogIFNhdmUgdGhlIGVudGlyZSBQQworCW9uIHRoZSBzdGFjayB3aGVuIGRlbGl2ZXJpbmcgaW50ZXJydXB0cyAobm90IGp1c3QgdGhlIGxvd2VyCisJaGFsZikuLi4KKwkqIG1uMTAzMDAuaWdlbiAobW92IChEaSxBbSksRG4pOiAgRml4IGRlY29kZS4gIFJlZ2lzdGVycyB3ZXJlCisJc3BlY2lmaWVkIGluIHRoZSB3cm9uZyBvcmRlci4KKworRnJpIE1hciAyNyAwMDo1Njo0MCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGR2LW1uMTAzY3B1LmMgKGRlbGl2ZXJfbW4xMDNjcHVfaW50ZXJydXB0KTogU3RvcCBsb3NzIG9mCisgCXN1Y2NlZWRpbmcgaW50ZXJydXB0cywgY2xlYXIgcGVuZGluZ19oYW5kbGVyIHdoZW4gdGhlIGhhbmRsZXIKKyAJaXNuJ3QgcmUtc2NoZWR1bGVkLgorCitUaHUgTWFyIDI2IDEwOjExOjAxIDE5OTggIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJodW5hLmN5Z251cy5jby51az4KKworCSogTWFrZWZpbGUuaW4gKHRtcC1pZ2VuKTogIFByZWZpeCBhbGwgdXNhZ2Ugb2YgbW92ZS1pZi1jaGFuZ2UKKwlzY3JpcHQgd2l0aCAkKFNIRUxMKSB0byBtYWtlIE5UIG5hdGl2ZSBidWlsZHMgaGFwcHkuCisJKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlIGJlY2F1c2Ugb2YgY2hhbmdlIHRvIC4uL2NvbW1vbi9hY2xvY2FsLm00LgorCQorVGh1IE1hciAyNiAxMToyMjozMSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogTWFrZSAtLWVuYWJsZS1zaW0tY29tbW9uIHRoZSBkZWZhdWx0LgorCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKwkKKwkqIHNpbS1tYWluLmggKENJQV9HRVQsIENJQV9TRVQpOiBTYXZlL3Jlc3RvcmUgY3VycmVudCBpbnN0cnVjdGlvbgorIAlhZGRyZXNzIGludG8gU2F0ZS5yZWdzW1JFR19QQ10gaW5zdGVhZCBvZiBjb21tb24gc3RydWN0LgorCitXZWQgTWFyIDI1IDE3OjQyOjAwIDE5OTggIEpveWNlIEphbmN6eW4gIDxqYW5jenluQGN5Z251cy5jb20+CisKKwkqIG1uMTAzMDAuaWdlbiAoY21wIGltbTgsQW4pOiBEbyBub3Qgc2lnbiBleHRlbmQgaW1tOCB2YWx1ZS4KKworV2VkIE1hciAyNSAxMjowODowMCAxOTk4ICBKb3ljZSBKYW5jenluICA8amFuY3p5bkBjeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAoT1BfRjBGRCk6IEluaXRpYWxpc2UgdmFyaWFibGUgJ3NwJy4KKworVGh1IE1hciAyNiAwMDoyMTozMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGR2LW1uMTAzaW50LmMgKGRlY29kZV9ncm91cCk6IEEgZ3JvdXAgcmVnaXN0ZXIgZXZlcnkgNCBieXRlcyBub3QKKyAJOC4KKwkod3JpdGVfaWNyKTogUmV3cml0ZSBlcXVhdGlvbiB1cGRhdGluZyByZXF1ZXN0IGZpZWxkLgorCShyZWFkX2lhZ3IpOiBGaXggY2hlY2sgdGhhdCBpbnRlcnJ1cHQgaXMgc3RpbGwgcGVuZGluZy4KKworV2VkIE1hciAyNSAxNjoxNDo1MCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IFRpZHkgdXAgZGV2aWNlIGNyZWF0aW9uLgorCisJKiBkdi1tbjEwM2ludC5jIChtbjEwM2ludF9wb3J0X2V2ZW50KTogRHJpdmUgTk1JIHdpdGggbm9uLXplcm8KKyAJdmFsdWUuCisJKG1uMTAzaW50X2lvX3JlYWRfYnVmZmVyKTogQ29udmVydCBhYnNvbHV0ZSBhZGRyZXNzIHRvIHJlZ2lzdGVyCisgCWJsb2NrIG9mZnNldHMuCisJKHJlYWRfaWNyLCB3cml0ZV9pY3IpOiBDb252ZXJ0IGJsb2NrIG9mZnNldCBpbnRvIGdyb3VwIG9mZnNldC4KKwkKK1dlZCBNYXIgMjUgMTU6MDg6NDkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBDcmVhdGUgc2Vjb25kIDFtYiBtZW1vcnkgcmVnaW9uIGF0CisgCTB4NDAwMDAwMDAuCisJKHNpbV9vcGVuKTogQ3JlYXRlIGEgZGV2aWNlIHRyZWUuCisJKHNpbS1ody5oKTogSW5jbHVkZS4KKwkoZG9faW50ZXJydXB0KTogRGVsZXRlLCBuZWVkcyB0byB1c2UgZHYtbW4xMDNjcHUuYworCisJKiBkdi1tbjEwM2ludC5jLCBkdi1tbjEwM2NwdS5jOiBOZXcgZmlsZXMuCisKK1dlZCBNYXIgMjUgMDg6NDc6MzggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBtbjEwMzAwX3NpbS5oIChFWFRSQUNUX1BTV19MTSwgSU5TRVJUX1BTV19MTSwgUFNXX0lFLCBQU1dfTE0pOgorIAlEZWZpbmUuCisJKFNQKTogRGVmaW5lLgorCQorV2VkIE1hciAyNSAxMjozNToyOSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIE1hciAyNSAxMDoyNDo0OCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW0tb3B0aW9ucy5oKTogSW5jbHVkZS4KKwkoc2ltX2tpbmQsIG15bmFtZSk6IERlY2xhcmUgd2hlbiBub3QgdXNpbmcgY29tbW9uIGZyYW1ld29yay4KKworCSogbW4xMDMwMF9zaW0uaCAoZG9fc3lzY2FsbCwgZ2VuZXJpYyopOiBQcm92aWRlIHByb3RvdHlwZXMgZm9yCisgCWZ1bmN0aW9ucyBmb3VuZCBpbiBvcF91dGlscy5jCisKKwkqIG1uMTAzMDAuaWdlbiAoYWRkKTogRGlzY2FyZCB1bnVzZWQgdmFyaWFibGVzLgorCisJKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmUtZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjEyLjEuCisJCitUdWUgTWFyIDI0IDE1OjI3OjAwIDE5OTggIEpveWNlIEphbmN6eW4gIDxqYW5jenluQGN5Z251cy5jb20+CisKKwlBZGQgc3VwcG9ydCBmb3IgLS1lbmFibGUtc2ltLWNvbW1vbiBvcHRpb24uCisJKiBNYWtlZmlsZS5pbiAoV0lUSE9VVF9DT01NT05fT0JKUyk6IEZpbGVzIGluY2x1ZGVkIGlmCisJISAtLWVuYWJsZS1zaW0tY29tbW9uCisJKFdJVEhfQ09NTU9OX09CSlMpOiBGaWxlcyBpbmNsdWRlZCBpZiAtLWVuYWJsZS1zaW0tY29tbW9uLgorCShNTjEwMzAwX09CSlMsTU4xMDMwMF9JTlRFUlBfREVQKTogTmV3IHZhcmlhYmxlcy4KKwkoU0lNX09CSlMpOiBSZXdyaXRlLgorCSh7V0lUSE9VVCxXSVRIfV9DT01NT05fUlVOX09CSlMsU0lNX1JVTl9PQkpTKTogTmV3IHZhcmlhYmxlcy4KKwkoU0lNX0VYVFJBX0NGTEFHUyk6IE5ldyB2YXJpYWJsZS4KKwkoY2xlYW4tZXh0cmEpOiBDbGVhbiB1cCBpZ2VuIGZpbGVzLgorCSguLi9pZ2VuL2lnZW4sY2xlYW4taWdlbix0bXAtaWdlbik6IE5ldyBydWxlcy4KKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIGNvbW1vbiBmcmFtZXdvcmsgdmlhIAorCS0tZW5hYmxlLXNpbS1jb21tb24uCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJKiBpbnRlcnAuYzogI2luY2x1ZGUgc2ltLW1haW4gaWYgV0lUSF9DT01NT04sIG5vdCBtbjEwMzAwX3NpbS5oLgorCShoYXNoLGRpc3BhdGNoLHNpbV9zaXplKTogRG9uJ3QgY29tcGlsZSBpZiAhIFdJVEhfQ09NTU9OLgorCShpbml0X3N5c3RlbSxzaW1fd3JpdGUsY29tcGFyZV9zaW1vcHMpOiBMaWtld2lzZS4KKwkoc2ltX3NldF9wcm9maWxlLHNpbV9zZXRfcHJvZmlsZV9zaXplKTogTGlrZXdpc2UuCisJKHNpbV9zdG9wLHNpbV9yZXN1bWUsc2ltX3RyYWNlLHNpbV9pbmZvKTogTGlrZXdpc2UuCisJKHNpbV9zZXRfY2FsbGJhY2tzLHNpbV9zdG9wX3JlYXNvbixzaW1fcmVhZCxzaW1fbG9hZCk6IExpa2V3aXNlLgorCShlbnVtIGludGVycnVwdF90eXBlKTogTmV3IGVudW0uCisJKGludGVycnVwdF9uYW1lcyk6IE5ldyBnbG9iYWwuCisJKGRvX2ludGVycnVwdCk6IE5ldyBmdW5jdGlvbi4KKwkoc2ltX29wZW4pOiBEZWZpbmUgZGlmZmVyZW50bHkgaWYgV0lUSF9DT01NT04uCisJKHNpbV9jbG9zZSxzaW1fY3JlYXRlX2luZmVyaW9yLHNpbV9kb19jb21tYW5kKTogTGlrZXdpc2UuCisJKiBtbjEwMzAwX3NpbS5oICh7bG9hZCxzdG9yZX1fe2J5dGUsaGFsZix3b3JkfSk6IERlZmluZSB2ZXJzaW9ucworCWZvciBXSVRIX0NPTU1PTi4KKwkqIG1uMTAzMDAuaWdlbjogTmV3IGZpbGUuCisJKiBtbjEwMzAwLmRjOiBOZXcgZmlsZS4KKwkqIG9wX3V0aWxzLmM6IE5ldyBmaWxlLgorCSogc2ltLW1haW4uaDogTmV3IGZpbGUuCisKK1dlZCBNYXIgMTggMTI6Mzg6MTIgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK0ZyaSBGZWIgMjcgMTg6MzY6MDQgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYyAoaW5jKTogRml4IHR5cG8uCisKK1dlZCBGZWIgMjUgMDE6NTk6MjkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisgICAgICAgICogc2ltb3BzLmMgKHNpZ25lZCBtdWx0aXBseSBpbnN0cnVjdGlvbnMpOiBDYXN0IGlucHV0IG9wZXJhbmRzIHRvCisgICAgICAgIHNpZ25lZDMyIGJlZm9yZSBjYXN0aW5nIHRoZW0gdG8gc2lnbmVkNjQgc28gdGhhdCB0aGUgc2lnbiBiaXQKKyAgICAgICAgaXMgcHJvcGFnYXRlZCBwcm9wZXJseS4KKworTW9uIEZlYiAyMyAyMDoyMzoxOSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBMYXN0IGNoYW5nZSB3YXMgYmFkLiAgRGVmaW5lIE5MX1RBUkdFVAorCXNvIHRoYXQgdGFyZy12YWxzLmggd2lsbCBiZSB1c2VkIGluc3RlYWQgb2Ygc3lzY2FsbC5oLgorCSogc2ltb3BzLmM6IFVzZSB0YXJnLXZhbHMuaCBpbnN0ZWFkIG9mIHN5c2NhbGwuaC4KKwkoT1BfRjAyMCk6IERpc2FibGUgdW5zdXBwb3J0ZWQgc3lzdGVtIGNhbGxzLgorCitNb24gRmViIDIzIDA5OjQ0OjM4IDE5OTggIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IEdldCBoZWFkZXIgZmlsZXMgZnJvbSBsaWJnbG9zcy9tbjEwMzAwL3N5cy4KKworU3VuIEZlYiAyMiAxNjowMjoyNCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNpbW9wcy5jOiBJbmNsdWRlIHNpbS10eXBlcy5oLgorCitXZWQgRmViIDE4IDEzOjA3OjA4IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltb3BzLmMgKG11bHRpcGx5IGluc3RydWN0aW9ucyk6IENhc3QgaW5wdXQgb3BlcmFuZHMgdG8gYQorCXNpZ25lZDY0L3Vuc2lnbmVkNjQgdHlwZSBhcyBhcHByb3ByaWF0ZS4KKworVHVlIEZlYiAxNyAxMjo0NzoxNiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fc3RvcmVfcmVnaXN0ZXIsIHNpbV9mZXRjaF9yZWdpc3Rlcik6IFBhc3MgaW4KKyAJbGVuZ3RoIHBhcmFtZXRlci4gIFJldHVybiAtMS4KKworU3VuIEZlYiAgMSAxNjo0Nzo1MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworU2F0IEphbiAzMSAxODoxNTo0MSAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIEphbiAxOSAyMjoyNjoyOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmE+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIERlYyAxNSAyMzoxNzoxMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1RodSBEZWMgIDQgMDk6MjE6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgTm92IDExIDEwOjM4OjUyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltb3BzLmMgKGNhbGw6MTYgY2FsbDozMik6IFN0YWNrIGFkanVzdG1lbnQgaXMgZGV0ZXJtaW5lZCBzb2xlbHkKKwlieSB0aGUgaW1tOCBmaWVsZC4KKworV2VkIE9jdCAyMiAxNDo0MzowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fbG9hZCk6IFBhc3MgbG1hX3AgYW5kIHNpbV93cml0ZSBhcmdzIHRvCisgCXNpbV9sb2FkX2ZpbGUuCisKK1R1ZSBPY3QgMjEgMTA6MTI6MDMgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYzogQ29ycmVjdGx5IGhhbmRsZSByZWdpc3RlciByZXN0b3JlcyBmb3IgInJldCIgYW5kICJyZXRmIgorCWluc3RydWN0aW9ucy4KKworRnJpIE9jdCAgMyAwOToyODowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIFNlcCAyNCAxNzozODo1NyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVHVlIFNlcCAyMyAxMTowNDozOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIFNlcCAyMiAxMTo0NjoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworRnJpIFNlcCAxOSAxNzo0NToyNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIFNlcCAxNSAxNzozNjoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVGh1IFNlcCAgNCAxNzoyMToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmE+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIEF1ZyAyNyAxODoxMzoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1R1ZSBBdWcgMjYgMTA6NDE6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX2tpbGwpOiBEZWxldGUuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBBZGQgQUJGRCBhcmd1bWVudC4KKwkoc2ltX2xvYWQpOiBNb3ZlIHNldHRpbmcgb2YgUEMgZnJvbSBoZXJlLgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogVG8gaGVyZS4gCisKK01vbiBBdWcgMjUgMTc6NTA6MjIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitNb24gQXVnIDI1IDE2OjE0OjQ0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogQWRkIEFCRkQgYXJndW1lbnQuCisKK1R1ZSBKdW4gMjQgMTM6NDY6MjAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBpbnRlcnAuYyAoc2ltX3Jlc3VtZSk6IENsZWFyIFN0YXRlLmV4aXRlZC4KKwkoc2ltX3N0b3BfcmVhc29uKTogSWYgU3RhdGUuZXhpdGVkIGlzIG5vbnplcm8sIHRoZW4gaW5kaWNhdGUgdGhhdAorCXRoZSBzaW11bGF0b3IgZXhpdGVkIGluc3RlYWQgb2Ygc3RvcHBlZC4KKwkqIG1uMTAzMDBfc2ltLmggKHN0cnVjdCBfc3RhdGUpOiBBZGQgZXhpdGVkIGZpZWxkLgorCSogc2ltb3BzLmMgKHN5c2NhbGwpOiBTZXQgU3RhdGUuZXhpdGVkIGZvciBTWVNfZXhpdC4KKworV2VkIEp1biAxMSAyMjowNzo1NiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNpbW9wcy5jOiBGaXggdGhpbmtvIGluIGxhc3QgY2hhbmdlLgorCitUdWUgSnVuIDEwIDEyOjMxOjMyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltb3BzLmM6ICJjYWxsIiBzdG9yZXMgdGhlIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMgaW50byB0aGUKKwlzdGFjayEgIFVwZGF0ZSB0aGUgc3RhY2sgcG9pbnRlciBwcm9wZXJseSB3aGVuIGRvbmUgd2l0aAorCXJlZ2lzdGVyIHNhdmVzLgorCisJKiBzaW1vcHMuYzogRml4IHJldHVybiBhZGRyZXNzIGNvbXB1dGF0aW9uIGZvciAiY2FsbCIgaW5zdHJ1Y3Rpb25zLgorCitUaHUgTWF5IDIyIDAxOjQzOjExIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogRml4IHR5cG8uCisKK1dlZCBNYXkgMjEgMjM6Mjc6NTggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBpbnRlcnAuYyAoc2ltX3Jlc3VtZSk6IEFkZCBtaXNzaW5nIGNhc2UgaW4gYmlnIHN3aXRjaAorCXN0YXRlbWVudCAoZm9yIGV4dGIgaW5zdHJ1Y3Rpb24pLgorCitUdWUgTWF5IDIwIDE3OjUxOjMwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaW50ZXJwLmM6IFJlcGxhY2UgYWxsIHJlZmVyZW5jZXMgdG8gbG9hZF9tZW0gYW5kIHN0b3JlX21lbQorCXdpdGggcmVmZXJlbmNlcyB0byBsb2FkX2J5dGUsIGxvYWRfaGFsZiwgbG9hZF8zX2J5dGUsIGxvYWRfd29yZAorCWFuZCBzdG9yZV9ieXRlLCBzdG9yZV9oYWxmLCBzdG9yZV8zX2J5dGUsIHN0b3JlX3dvcmQuCisJKElOTElORSk6IERlbGV0ZSBkZWZpbml0aW9uLgorCShsb2FkX21lbV9iaWcpOiBMaWtld2lzZS4KKwkobWF4X21lbSk6IE1ha2UgaXQgZ2xvYmFsLgorCShkaXNwYXRjaCk6IE1ha2UgdGhpcyBmdW5jdGlvbiBpbmxpbmUuCisJKGxvYWRfbWVtLCBzdG9yZV9tZW0pOiBEZWxldGUgZnVuY3Rpb25zLgorCSogbW4xMDMwMF9zaW0uaCAoSU5MSU5FKTogRGVmaW5lLgorCShSTFcpOiBEZWxldGUgdW51c2VkIGRlZmluaXRpb24uCisJKGxvYWRfbWVtLCBzdG9yZV9tZW0pOiBEZWxldGUgZGVjbGFyYXRpb25zLgorCShsb2FkX21lbV9iaWcpOiBOZXcgZGVmaW5pdGlvbi4KKwkobG9hZF9ieXRlLCBsb2FkX2hhbGYsIGxvYWRfM19ieXRlLCBsb2FkX3dvcmQpOiBOZXcgZnVuY3Rpb25zLgorCShzdG9yZV9ieXRlLCBzdG9yZV9oYWxmLCBzdG9yZV8zX2J5dGUsIHN0b3JlX3dvcmQpOiBOZXcgZnVuY3Rpb25zLgorCSogc2ltb3BzLmM6ICBSZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIGxvYWRfbWVtIGFuZCBzdG9yZV9tZW0KKwl3aXRoIHJlZmVyZW5jZXMgdG8gbG9hZF9ieXRlLCBsb2FkX2hhbGYsIGxvYWRfM19ieXRlLCBsb2FkX3dvcmQKKwlhbmQgc3RvcmVfYnl0ZSwgc3RvcmVfaGFsZiwgc3RvcmVfM19ieXRlLCBzdG9yZV93b3JkLgorCitUdWUgTWF5IDIwIDEwOjIxOjUxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogQWRkIGNhbGxiYWNrIHRvIGFyZ3VtZW50cy4KKwkoc2ltX3NldF9jYWxsYmFja3MpOiBEZWxldGUgU0lNX0RFU0MgYXJndW1lbnQuCisKK01vbiBNYXkgMTkgMTM6NTQ6MjIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBpbnRlcnAuYyAoZGlzcGF0Y2gpOiBNYWtlIHRoaXMgYW4gaW5saW5lIGZ1bmN0aW9uLgorCisJKiBzaW1vcHMuYyAoc3lzY2FsbCk6IFVzZSBjYWxsYmFjay0+d3JpdGUgcmVnYXJkbGVzcyBvZgorCXdoYXQgZmlsZSBkZXNjcmlwdG9yIHdlJ3JlIHdyaXRpbmcgdG9vLgorCitTdW4gTWF5IDE4IDE2OjQ2OjMxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaW50ZXJwLmMgKGxvYWRfbWVtX2JpZyk6IFJlbW92ZSBmdW5jdGlvbi4gIEl0J3Mgbm93IGEgbWFjcm8KKwlkZWZpbmVkIGVsc2V3aGVyZS4KKwkoY29tcGFyZV9zaW1vcHMpOiBOZXcgZnVuY3Rpb24uCisJKHNpbV9vcGVuKTogU29ydCB0aGUgU2ltb3BzIHRhYmxlIGJlZm9yZSBpbnNlcnRpbmcgZW50cmllcworCWludG8gdGhlIGhhc2ggdGFibGUuCisJKiBtbjEwMzAwX3NpbS5oOiBSZW1vdmUgdW51c2VkICNkZWZpbmVzLgorCShsb2FkX21lbV9iaWcpOiBEZWZpbmUuCisKK0ZyaSBNYXkgMTYgMTY6MzY6MTcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBpbnRlcnAuYyAobG9hZF9tZW0pOiBJZiB3ZSBnZXQgYSBsb2FkIGZyb20gYW4gb3V0IG9mIHJhbmdlCisJYWRkcmVzcywgYWJvcnQuCisJKHN0b3JlX21lbSk6IExpa2V3aXNlIGZvciBzdG9yZXMuCisJKG1heF9tZW0pOiBOZXcgdmFyaWFibGUuCisKK1R1ZSBNYXkgIDYgMTM6MjQ6MzYgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBtbjEwMzAwX3NpbS5oOiBGaXggb3JkZXJpbmcgb2YgYml0cyBpbiB0aGUgUFNXLgorCisJKiBpbnRlcnAuYzogSW1wcm92ZSBoYXNoaW5nIHJvdXRpbmUgdG8gYXZvaWQgbG9uZyBsaXN0CisJdHJhdmVyc2FscyBmb3IgY29tbW9uIGluc3RydWN0aW9ucy4gIEFkZCBIQVNIX1NUQVQgc3VwcG9ydC4KKwlSZXdyaXRlIG9wY29kZSBkaXNwYXRjaCBjb2RlIHVzaW5nIGEgYmlnIHN3aXRjaCBpbnN0ZWFkIG9mCisJY2FzY2FkZWQgaWYvZWxzZSBzdGF0ZW1lbnRzLiAgQXZvaWQgdXNlbGVzcyBjYWxscyB0byBsb2FkX21lbS4KKworTW9uIE1heSAgNSAxODowNzo0OCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIG1uMTAzMDBfc2ltLmggKHN0cnVjdCBfc3RhdGUpOiBBZGQgc3BhY2UgZm9yIG1kcnEgcmVnaXN0ZXIuCisJKFJFR19NRFJRKTogRGVmaW5lLgorCSogc2ltb3BzLmM6IERvbid0IGFib3J0IGZvciB0cmFwLiAgQWRkIHN1cHBvcnQgZm9yIHRoZSBleHRlbmRlZAorCWluc3RydWN0aW9ucywgImdldHgiLCAicHV0eCIsICJtdWxxIiwgIm11bHF1IiwgInNhdDE2IiwgInNhdDI0IiwKKwlhbmQgImJzY2giLgorCitUaHUgQXByIDI0IDAwOjM5OjUxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworRnJpIEFwciAxOCAxNDowNDowNCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fc3RvcCk6IEFkZCBzdHViIGZ1bmN0aW9uLgorCitUaHUgQXByIDE3IDAzOjI2OjU5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbG9hZC5vLgorCSogaW50ZXJwLmMgKHNpbV9raW5kLCBteW5hbWUpOiBOZXcgc3RhdGljIGxvY2Fscy4KKwkoc2ltX29wZW4pOiBTZXQgc2ltX2tpbmQsIG15bmFtZS4gIElnbm9yZSAtRSBhcmcuCisJKHNpbV9sb2FkKTogUmV0dXJuIFNJTV9SQy4gIE5ldyBhcmcgYWJmZC4gIENhbGwgc2ltX2xvYWRfZmlsZSB0bworCWxvYWQgZmlsZSBpbnRvIHNpbXVsYXRvci4gIFNldCBzdGFydCBhZGRyZXNzIGZyb20gYmZkLgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogUmV0dXJuIFNJTV9SQy4gIERlbGV0ZSBhcmcgc3RhcnRfYWRkcmVzcy4KKworV2VkIEFwciAxNiAxOTozMDo0NCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF9GMDIwKTogU1lTX2V4ZWN2LCBTWVNfdGltZSwgU1lTX3RpbWVzLCBTWVNfdXRpbWUKKyAJb25seSBpbmNsdWRlIGlmIGltcGxlbWVudGVkIGJ5IGhvc3QuCisJKE9QX0YwMjApOiBUeXBlY2FzdCBhcmcgcGFzc2VkIHRvIHRpbWUgZnVuY3Rpb247CisKK01vbiBBcHIgIDcgMjM6NTc6NDkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYyAoc3lzY2FsbCk6IEhhbmRsZSBuZXcgbW4xMDMwMCBjYWxsaW5nIGNvbnZlbnRpb25zLgorCitNb24gQXByICA3IDE1OjQ1OjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitGcmkgQXByICA0IDIwOjAyOjM3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IENoYW5nZSBtbjEwMzAwLW9wYy5vIHRvIG0xMDMwMC1vcGMubywgdG8gbWF0Y2gKKwljb3JyZXNwb25kaW5nIGNoYW5nZSBpbiBvcGNvZGVzIGRpcmVjdG9yeS4KKworV2VkIEFwciAgMiAxNTowNjoyOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBOZXcgYXJnIGBraW5kJy4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgQXByICAyIDE0OjM0OjE5IDE5OTcgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUaHUgTWFyIDIwIDExOjU4OjAyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltb3BzLmM6IEZpeCByZWdpc3RlciBleHRyYWN0aW9uIGZvciBhIHR3byAibW92YnUiIHZhcmlhbnRzLgorCVNvbWV3aGF0IHNpbXBsaWZ5ICJzdWIiIGluc3RydWN0aW9ucy4KKwlDb3JyZWN0bHkgc2lnbiBleHRlbmQgb3BlcmFuZHMgZm9yICJtdWwiLiAgUHV0IHRoZSBjb3JyZWN0CisJaGFsZiBvZiB0aGUgcmVzdWx0IGluIE1EUiBmb3IgIm11bCIgYW5kICJtdWx1Ii4KKwlJbXBsZW1lbnQgcmVtYWluaW5nIGluc3RydWN0aW9ucy4KKwlUd2VhayBvcGNvZGUgZm9yICJzeXNjYWxsIi4KKworVHVlIE1hciAxOCAxNDoyMToyMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNpbW9wcy5jOiBEbyBzeXNjYWxsIGVtdWxhdGlvbiBpbiAic3lzY2FsbCIgaW5zdHJ1Y3Rpb24uICBBZGQKKwlkdW1teSAidHJhcCIgaW5zdHJ1Y3Rpb24uCisKK1dlZCBNYXIgMTkgMDE6MTQ6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIE1hciAxNyAxNToxMDowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZS1nZW5lcmF0ZS4KKworRnJpIE1hciAxNCAxMDozNDoxMSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1RodSBNYXIgMTMgMTI6NTQ6NDUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogTmV3IFNJTV9ERVNDIHJlc3VsdC4gIEFyZ3VtZW50IGlzIG5vdworCWluIGFyZ3YgZm9ybS4KKwkob3RoZXIgc2ltXyopOiBOZXcgU0lNX0RFU0MgYXJndW1lbnQuCisKK1dlZCBNYXIgMTIgMTU6MDQ6MDAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYzogRml4IGNhcnJ5IGJpdCBjb21wdXRhdGlvbiBmb3IgImFkZCIgaW5zdHJ1Y3Rpb25zLgorCisJKiBzaW1vcHMuYzogRml4IHR5cG9zIGluIGJzZXQgaW5zbnMuICBGaXggYXJndW1lbnRzIHRvIHN0b3JlX21lbQorCWZvciBic2V0IGltbTgsKGQ4LGFuKSBhbmQgYmNsciBpbW04LChkOCxhbikuCisKK1dlZCBNYXIgIDUgMTU6MDA6MTAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYzogRml4IHJlZ2lzdGVyIHJlZmVyZW5jZXMgd2hlbiBjb21wdXRpbmcgWiBhbmQgTiBiaXRzCisJZm9yIGxzciBpbW04LGRuLgorCitUdWUgRmViICA0IDEzOjMzOjMwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChAQ09NTU9OX01BS0VGSUxFX0ZSQUcpOiBVc2UKKwlDT01NT05fe1BSRSxQT1NUfV9DT05GSUdfRlJBRyBpbnN0ZWFkLgorCSogY29uZmlndXJlLmluOiBzaW5jbHVkZSAuLi9jb21tb24vYWNsb2NhbC5tNC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK0ZyaSBKYW4gMjQgMTA6NDc6MjUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBpbnRlcnAuYyAoaW5pdF9zeXN0ZW0pOiBBbGxvY2F0ZSAyXjE5IGJ5dGVzIG9mIHNwYWNlIGZvciB0aGUKKwlzaW11bGF0b3IuCisKK1RodSBKYW4gMjMgMTE6NDY6MjMgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBNYWtlZmlsZS5pbjogIFVwZGF0ZSB0byBuZXcgY29uZmlndXJlCisJc2NoZW1lIHdoaWNoIGlzIG1vcmUgY29tcGF0aWJsZSB3aXRoIFdpbkdEQiBidWlsZHMuCisJKiBjb25maWd1cmUuaW46ICBJbXByb3ZlIGNvbW1lbnQgb24gaG93IHRvIHJ1biBhdXRvY29uZi4KKwkqIGNvbmZpZ3VyZTogIFJlLXJ1biBhdXRvY29uZiB0byBnZXQgbmV3IC4uL2NvbW1vbi9hY2xvY2FsLm00LgorCSogTWFrZWZpbGUuaW46ICBVc2UgYXV0b2NvbmYgc3Vic3RpdHV0aW9uIHRvIGluc3RhbGwgY29tbW9uCisJbWFrZWZpbGUgZnJhZ21lbnQuCisKK1R1ZSBKYW4gMjEgMTU6MDM6MDQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYzogVW5kbyBsYXN0IGNoYW5nZSB0byAicm9sIiBhbmQgInJvciIsIG9yaWdpbmFsIGNvZGUKKwl3YXMgY29ycmVjdCEKKworVGh1IEphbiAxNiAxMToyODoxNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNpbW9wcy5jOiBGaXggInJvbCIgYW5kICJyb3IiLgorCitXZWQgSmFuIDE1IDA2OjQ1OjU4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltb3BzLmM6IEZpeCB0eXBvIGluIGxhc3QgY2hhbmdlLgorCitNb24gSmFuIDEzIDEzOjIyOjM1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltb3BzLmM6IFVzZSBSRUcgbWFjcm9zIGluIGZldyBwbGFjZXMgbm90IHVzaW5nIHRoZW0geWV0LgorCitNb24gSmFuICA2IDE2OjIxOjE5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDMwMF9zaW0uaCAoc3RydWN0IF9zdGF0ZSk6IEZpeCBudW1iZXIgb2YgcmVnaXN0ZXJzIQorCitUdWUgRGVjIDMxIDE2OjIwOjQxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogbW4xMDMwMF9zaW0uaCAoc3RydWN0IF9zdGF0ZSk6IFB1dCBhbGwgcmVnaXN0ZXJzIGludG8gYSBzaW5nbGUKKwlhcnJheSB0byBtYWtlIGdkYiBpbXBsZW1lbnRhdGlvbiBlYXNpZXIuCisJKFJFR18qKTogQWRkIGRlZmluaXRpb25zIGZvciBhbGwgcmVnaXN0ZXJzIGluIHRoZSBzdGF0ZSBhcnJheS4KKwkoU0VYVDMyLCBTRVhUNDAsIFNFWFQ0NCwgU0VYVDYwKTogUmVtb3ZlIHVudXNlZCBtYWNyb3MuCisJKiBzaW1vcHMuYzogUmVsYXRlZCBjaGFuZ2VzLgorCitXZWQgRGVjIDE4IDEwOjEwOjQ1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaW50ZXJwLmMgKHNpbV9yZXN1bWUpOiBIYW5kbGUgMHhmZiBhcyBhIHNpbmdsZSBieXRlIGluc24uCisKKwkqIHNpbW9wcy5jOiBGaXggb3ZlcmZsb3cgY29tcHV0YXRpb24gZm9yICJhZGQiIGFuZCAiaW5jIgorCWluc3RydWN0aW9ucy4KKworTW9uIERlYyAxNiAxMDowMzo1MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNpbW9wcy5jOiBIYW5kbGUgImJyZWFrIiBpbnN0cnVjdGlvbi4KKworCSogc2ltb3BzLmM6IEZpeCByZXN0b3JpbmcgdGhlIFBDIGZvciAicmV0IiBhbmQgInJldGYiIGluc3RydWN0aW9ucy4KKworV2VkIERlYyAxMSAwOTo1MzoxMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGdlbmNvZGUuYyAod3JpdGVfb3Bjb2Rlcyk6IEFsc28gd3JpdGUgb3V0IHRoZSBmb3JtYXQgb2YgdGhlCisJb3Bjb2RlLgorCSogbW4xMDMwMF9zaW0uaCAoc2ltb3BzKTogQWRkICJmb3JtYXQiIGZpZWxkLgorCSogaW50ZXJwLmMgKHNpbV9yZXN1bWUpOiBEZWFsIHdpdGggZW5kaWFubmVzcyBpc3N1ZXMgaGVyZS4KKworVHVlIERlYyAxMCAxNTowNTozNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNpbW9wcy5jIChSRUcwXzQpOiBEZWZpbmUuCisJVXNlIFJFRzBfNCBmb3IgaW5kZXhlZCBsb2Fkcy9zdG9yZXMuCisKK1NhdCBEZWMgIDcgMDk6NTA6MjggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYyAoUkVHMF8xNik6IEZpeCB0eXBvLgorCitGcmkgRGVjICA2IDE0OjEzOjM0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltb3BzLmM6IENhbGwgYWJvcnQgZm9yIGFueSBpbnN0cnVjdGlvbiB0aGF0J3Mgbm90IGN1cnJlbnRseQorCXNpbXVsYXRlZC4KKworCSogc2ltb3BzLmM6IERlZmluZSBhY2Nlc3NvciBtYWNyb3MgdG8gZXh0cmFjdCByZWdpc3RlcgorCXZhbHVlcyBmcm9tIGluc3RydWN0aW9ucy4gIFVzZSB0aGVtIGNvbnNpc3RlbnRseS4KKworCSogaW50ZXJwLmM6IERlbGV0ZSB1bnVzZWQgZ2xvYmFsIHZhcmlhYmxlICJPUCIuCisJKHNpbV9yZXN1bWUpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlICJvcGNvZGUiLgorCSogc2ltb3BzLmM6IEZpeCBzb21lIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgcHJvYmxlbXMsIGFkZAorCXBhcmVucyB0byBmaXggdmFyaW91cyAtV2FsbCB3YXJuaW5ncy4KKworCSogZ2VuY29kZS5jICh3cml0ZV9oZWFkZXIpOiBBZGQgImluc24iIGFuZCAiZXh0ZW5zaW9uIiBhcmd1bWVudHMKKwl0byB0aGUgT1BfKiBkZWNsYXJhdGlvbnMuCisJKHdyaXRlX3RlbXBsYXRlKTogU2ltaWxhcmx5IGZvciBmdW5jdGlvbiB0ZW1wbGF0ZXMuCisJKiBpbnRlcnAuYyAoaW5zbiwgZXh0ZW5zaW9uKTogUmVtb3ZlIGdsb2JhbCB2YXJpYWJsZXMuICBJbnN0ZWFkCisJcGFzcyB0aGVtIGFzIGFyZ3VtZW50cyB0byB0aGUgT1BfKiBmdW5jdGlvbnMuCisJKiBtbjEwMzAwX3NpbS5oOiBSZW1vdmUgZGVjbHMgZm9yICJpbnNuIiBhbmQgImV4dGVuc2lvbiIuCisJKiBzaW1vcHMuYyAoT1BfKik6IEFjY2VwdCAiaW5zbiIgYW5kICJleHRlbnNpb24iIGFzIGFyZ3VtZW50cworCWluc3RlYWQgb2YgdXNpbmcgZ2xvYmFscy4KKworVGh1IERlYyAgNSAyMjoyNjozMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNpbW9wcy5jOiBGaXggdHlwb3MgaW4gIm1vdiBhbSwoZDE2LGFuKSIgYW5kICJtb3YgYW0sKGQzMixhbikiCisKKwkqIHNpbW9wcy5jOiBGaXggdGhpbmtvcyBpbiBsYXN0IGNoYW5nZSB0byAiaW5jIGRuIi4KKworV2VkIERlYyAgNCAxMDo1Nzo1MyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNpbW9wcy5jOiAiYWRkIGltbSxzcCIgZG9lcyBub3QgZWZmZWN0IHRoZSBjb25kaXRpb24gY29kZXMuCisJImluYyBkbiIgZG9lcyBlZmZlY3QgdGhlIGNvbmRpdGlvbiBjb2Rlcy4KKworVHVlIERlYyAgMyAxNzozNzo0NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNpbW9wcy5jOiBUcmVhdCBib3RoIG9wZXJhbmRzIGFzIHNpZ25lZCB2YWx1ZXMgZm9yCisJImRpdiIgaW5zdHJ1Y3Rpb24uCisKKwkqIHNpbW9wcy5jOiBGaXggc2ltdWxhdGlvbiBvZiBkaXZpc2lvbiBpbnN0cnVjdGlvbnMuCisJRml4IHR5cG9zL3RoaW5rb3MgaW4gc2V2ZXJhbCAiY21wIiBhbmQgInN1YiIgaW5zdHJ1Y3Rpb25zLgorCitNb24gRGVjICAyIDEyOjMxOjQwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltb3BzLmM6IEZpeCBjYXJyeSBiaXQgaGFuZGxpbmcgaW4gInN1YiIgYW5kICJjbXAiCisJaW5zdHJ1Y3Rpb25zLgorCisJKiBzaW1vcHMuYzogRml4ICJtb3YgaW1tOCxhbiIgYW5kICJtb3YgaW1tMTYsZG4iLgorCitTdW4gRGVjICAxIDE2OjA1OjQyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltb3BzLmM6IEZpeCBvdmVyZmxvdyBjb21wdXRhdGlvbiBmb3IgbWFueSBpbnN0cnVjdGlvbnMuCisKKwkqIHNpbW9wcy5jOiBGaXggIm1vdiBkbSwgYW4iLCAibW92YnUgZG0sIChhbikiLCBhbmQgIm1vdmh1IGRtLCAoYW4pIi4KKworCSogc2ltb3BzLmM6IEZpeCAibW92IGFtLCBkbiIuCisKKwkqIHNpbW9wcy5jOiBGaXggbW9yZSBidWdzIGluICJhZGQgaW1tLGFuIiBhbmQKKwkiYWRkIGltbSxkbiIuCisKK1dlZCBOb3YgMjcgMDk6MjA6NDIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYzogRml4IGJ1Z3MgaW4gIm1vdm0iIGFuZCAiYWRkIGltbSxhbiIuCisKKwkqIHNpbW9wcy5jOiBEb24ndCBsb3NlIHRoZSB1cHBlciAyNCBiaXRzIG9mIHRoZSByZXR1cm4KKwlwb2ludGVyIGluICJjYWxsIiBhbmQgImNhbGxzIiBpbnN0cnVjdGlvbnMuICBSb3VnaCBjdXQKKwlhdCBlbXVsYXRlZCBzeXN0ZW0gY2FsbHMuCisKKwkqIHNpbW9wcy5jOiBJbXBsZW1lbnQgdGhlIHJlbWFpbmluZyA1LCA2IGFuZCA3IGJ5dGUgaW5zdHJ1Y3Rpb25zLgorCisJKiBzaW1vcHMuYzogSW1wbGVtZW50IHJlbWFpbmluZyA0IGJ5dGUgaW5zdHJ1Y3Rpb25zLgorCisJKiBzaW1vcHMuYzogSW1wbGVtZW50IHJlbWFpbmluZyAzIGJ5dGUgaW5zdHJ1Y3Rpb25zLgorCisJKiBzaW1vcHMuYzogSW1wbGVtZW50IHJlbWFpbmluZyAyIGJ5dGUgaW5zdHJ1Y3Rpb25zLiAgQ2FsbAorCWFib3J0IGZvciBpbnN0cnVjdGlvbnMgd2UncmUgbm90IGltcGxlbWVudGluZyBub3cuCisKK1R1ZSBOb3YgMjYgMTU6NDM6NDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYzogSW1wbGVtZW50IGxvdHMgb2YgcmFuZG9tIGluc3RydWN0aW9ucy4KKworCSogc2ltb3BzLmM6IEltcGxlbWVudCAibW92bSIgYW5kICJiQ0MiIGluc25zLgorCisJKiBtbjEwMzAwX3NpbS5oIChfc3RhdGUpOiBBZGQgYW5vdGhlciByZWdpc3RlciAoTURSKS4KKwkoUkVHX01EUik6IERlZmluZS4KKwkqIHNpbW9wcy5jOiBJbXBsZW1lbnQgImNtcCIsICJjYWxscyIsICJyZXRzIiwgImptcCIgYW5kCisJYSBmZXcgYWRkaXRpb25hbCByYW5kb20gaW5zbnMuCisKKwkqIG1uMTAzMDBfc2ltLmggKFBTV18qKTogRGVmaW5lIGZvciBDQyBzdGF0dXMgdHJhY2tpbmcuCisJKFJFR19EMCwgUkVHX0EwLCBSRUdfU1ApOiBEZWZpbmUuCisJKiBzaW1vcHMuYzogSW1wbGVtZW50ICJhZGQiLCAiYWRkYyIgYW5kIGEgZmV3IG90aGVyIHJhbmRvbQorCWluc3RydWN0aW9ucy4KKworCSogZ2VuY29kZS5jLCBpbnRlcnAuYzogU25hcHNob3QgY3VycmVudCBzaW11bGF0b3IgY29kZS4KKworTW9uIE5vdiAyNSAxMjo0NjozOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluLCBjb25maWcuaW4sIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluOiBOZXcgZmlsZXMuCisJKiBnZW5jb2RlLmMsIGludGVycC5jLCBtbjEwMzAwX3NpbS5oLCBzaW1vcHMuYzogTmV3IGZpbGVzLgorCQpkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvTWFrZWZpbGUuaW4gYi9zaW0vbW4xMDMwMC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTEyM2M0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL21uMTAzMDAvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxNTcgQEAKKyMgICAgTWFrZWZpbGUgdGVtcGxhdGUgZm9yIENvbmZpZ3VyZSBmb3IgdGhlIG1uMTAzMDAgc2ltIGxpYnJhcnkuCisjICAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworIyMgQ09NTU9OX1BSRV9DT05GSUdfRlJBRworCitXSVRIT1VUX0NPTU1PTl9PQkpTID0gdGFibGUubyBzaW1vcHMubyBzaW0tbG9hZC5vCitXSVRIT1VUX0NPTU1PTl9JTlRFUlBfREVQID0gdGFibGUuYworV0lUSF9DT01NT05fT0JKUyA9IFwKKwlpdGFibGUubyBzZW1hbnRpY3MubyBpZGVjb2RlLm8gaWNhY2hlLm8gZW5naW5lLm8gaXJ1bi5vIHN1cHBvcnQubyBcCisJJChTSU1fTkVXX0NPTU1PTl9PQkpTKSBcCisJb3BfdXRpbHMubyBcCisJc2ltLWVuZ2luZS5vIFwKKwlzaW0taGxvYWQubyBcCisJc2ltLWhydy5vIFwKKwlzaW0tcmVzdW1lLm8gXAorCXNpbS1yZWFzb24ubyBcCisJc2ltLXN0b3AubyBcCisJZHYtc29ja3Nlci5vCitXSVRIX0NPTU1PTl9JTlRFUlBfREVQID0gCisKK01OMTAzMDBfT0JKUyA9ICQoQG1uMTAzMDBfY29tbW9uQF9DT01NT05fT0JKUykKK01OMTAzMDBfSU5URVJQX0RFUCA9ICQoQG1uMTAzMDBfY29tbW9uQF9DT01NT05fSU5URVJQX0RFUCkKKworU0lNX09CSlMgPSAkKE1OMTAzMDBfT0JKUykgaW50ZXJwLm8KKworIyBMaXN0IG9mIG1haW4gb2JqZWN0IGZpbGVzIGZvciBgcnVuJy4KK1dJVEhPVVRfQ09NTU9OX1JVTl9PQkpTID0gcnVuLm8KK1dJVEhfQ09NTU9OX1JVTl9PQkpTID0gbnJ1bi5vCitTSU1fUlVOX09CSlMgPSAkKEBtbjEwMzAwX2NvbW1vbkBfQ09NTU9OX1JVTl9PQkpTKQorCitTSU1fRVhUUkFfQ0xFQU4gPSBjbGVhbi1leHRyYQorCisjIFNlbGVjdCBtbjEwMzAwIHN1cHBvcnQgaW4gbmx0dmFscy5kZWYuCitOTF9UQVJHRVQgPSAtRE5MX1RBUkdFVF9tbjEwMzAwCisKK0lOQ0xVREUgPSBtbjEwMzAwX3NpbS5oICQoc3JjZGlyKS8uLi8uLi9pbmNsdWRlL2NhbGxiYWNrLmgKKworIyBMaXN0IG9mIGV4dHJhIGZsYWdzIHRvIGFsd2F5cyBwYXNzIHRvICQoQ0MpLgorU0lNX0VYVFJBX0NGTEFHUyA9IEBzaW1fZ2VuQAorCisjIyBDT01NT05fUE9TVF9DT05GSUdfRlJBRworCisKKyMKKyMgT2xkIGdlbmVyYXRvciAoZGVmYXVsdCkKKyMKKworc2ltb3BzLmg6IGdlbmNvZGUKKwkuL2dlbmNvZGUgLWggPiRACisKK3RhYmxlLmM6IGdlbmNvZGUgc2ltb3BzLmgKKwkuL2dlbmNvZGUgPiRACisKK2dlbmNvZGUubzogZ2VuY29kZS5jICQoSU5DTFVERSkKKwkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS9nZW5jb2RlLmMKKworbTEwMzAwLW9wYy5vOiAkKHNyY2RpcikvLi4vLi4vb3Bjb2Rlcy9tMTAzMDAtb3BjLmMKKwkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS8uLi8uLi9vcGNvZGVzL20xMDMwMC1vcGMuYworCitnZW5jb2RlOiBnZW5jb2RlLm8gbTEwMzAwLW9wYy5vCisJJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtbyBnZW5jb2RlIGdlbmNvZGUubyBtMTAzMDAtb3BjLm8gJChCVUlMRF9MSUIpCisKKworCisKK0JVSUxUX1NSQ19GUk9NX0lHRU4gPSBcCisJaWNhY2hlLmggXAorCWljYWNoZS5jIFwKKwlpZGVjb2RlLmggXAorCWlkZWNvZGUuYyBcCisJc2VtYW50aWNzLmggXAorCXNlbWFudGljcy5jIFwKKwltb2RlbC5oIFwKKwltb2RlbC5jIFwKKwlzdXBwb3J0LmggXAorCXN1cHBvcnQuYyBcCisJaXRhYmxlLmggXAorCWl0YWJsZS5jIFwKKwllbmdpbmUuaCBcCisJZW5naW5lLmMgXAorCWlydW4uYworJChCVUlMVF9TUkNfRlJPTV9JR0VOKTogdG1wLWlnZW4KKworCisuUEhPTlk6IGNsZWFuLWlnZW4KK2NsZWFuLWlnZW46CisJcm0gLWYgJChCVUlMVF9TUkNfRlJPTV9JR0VOKQorCXJtIC1mIHRtcC1pZ2VuIHRtcC1pbnNucworCisuLi9pZ2VuL2lnZW46CisJY2QgLi4vaWdlbiAmJiAkKE1BS0UpCisKK0lHRU5fVFJBQ0U9ICMgLUcgb21pdC1saW5lLW51bWJlcnMgIyAtRyB0cmFjZS1ydWxlLXNlbGVjdGlvbiAtRyB0cmFjZS1ydWxlLXJlamVjdGlvbiAtRyB0cmFjZS1lbnRyaWVzCitJR0VOX0lOU049JChzcmNkaXIpL21uMTAzMDAuaWdlbgorSUdFTl9EQz0kKHNyY2RpcikvbW4xMDMwMC5kYwordG1wLWlnZW46ICQoSUdFTl9JTlNOKSAkKElHRU5fREMpIC4uL2lnZW4vaWdlbgorCWNkIC4uL2lnZW4gJiYgJChNQUtFKQorCS4uL2lnZW4vaWdlbiBcCisJCSQoSUdFTl9UUkFDRSkgXAorCQktRyBnZW4tZGlyZWN0LWFjY2VzcyBcCisJCS1pICQoSUdFTl9JTlNOKSBcCisJCS1vICQoSUdFTl9EQykgXAorCQkteCBcCisJCS1uIGljYWNoZS5oICAgIC1oYyB0bXAtaWNhY2hlLmggXAorCQktbiBpY2FjaGUuYyAgICAtYyAgdG1wLWljYWNoZS5jIFwKKwkJLW4gc2VtYW50aWNzLmggLWhzIHRtcC1zZW1hbnRpY3MuaCBcCisJCS1uIHNlbWFudGljcy5jIC1zICB0bXAtc2VtYW50aWNzLmMgXAorCQktbiBpZGVjb2RlLmggICAtaGQgdG1wLWlkZWNvZGUuaCBcCisJCS1uIGlkZWNvZGUuYyAgIC1kICB0bXAtaWRlY29kZS5jIFwKKwkJLW4gbW9kZWwuaCAgICAgLWhtIHRtcC1tb2RlbC5oIFwKKwkJLW4gbW9kZWwuYyAgICAgLW0gIHRtcC1tb2RlbC5jIFwKKwkJLW4gc3VwcG9ydC5oICAgLWhmIHRtcC1zdXBwb3J0LmggXAorCQktbiBzdXBwb3J0LmMgICAtZiAgdG1wLXN1cHBvcnQuYyBcCisJCS1uIGl0YWJsZS5oICAgIC1odCB0bXAtaXRhYmxlLmggXAorCQktbiBpdGFibGUuYyAgICAtdCAgdG1wLWl0YWJsZS5jIFwKKwkJLW4gZW5naW5lLmggICAgLWhlIHRtcC1lbmdpbmUuaCBcCisJCS1uIGVuZ2luZS5jICAgIC1lICB0bXAtZW5naW5lLmMgXAorCQktbiBpcnVuLmMgICAgICAtciAgdG1wLWlydW4uYworCSQoU0hFTEwpICQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWNhY2hlLmggaWNhY2hlLmgKKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWljYWNoZS5jIGljYWNoZS5jCisJJChTSEVMTCkgJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pZGVjb2RlLmggaWRlY29kZS5oCisJJChTSEVMTCkgJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pZGVjb2RlLmMgaWRlY29kZS5jCisJJChTSEVMTCkgJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zZW1hbnRpY3MuaCBzZW1hbnRpY3MuaAorCSQoU0hFTEwpICQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc2VtYW50aWNzLmMgc2VtYW50aWNzLmMKKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLW1vZGVsLmggbW9kZWwuaAorCSQoU0hFTEwpICQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtbW9kZWwuYyBtb2RlbC5jCisJJChTSEVMTCkgJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zdXBwb3J0Lmggc3VwcG9ydC5oCisJJChTSEVMTCkgJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zdXBwb3J0LmMgc3VwcG9ydC5jCisJJChTSEVMTCkgJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pdGFibGUuaCBpdGFibGUuaAorCSQoU0hFTEwpICQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaXRhYmxlLmMgaXRhYmxlLmMKKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWVuZ2luZS5oIGVuZ2luZS5oCisJJChTSEVMTCkgJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1lbmdpbmUuYyBlbmdpbmUuYworCSQoU0hFTEwpICQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaXJ1bi5jIGlydW4uYworCXRvdWNoIHRtcC1pZ2VuCisKKworaW50ZXJwLm86IGludGVycC5jICQoTU4xMDMwMF9JTlRFUlBfREVQKSAkKElOQ0xVREUpCitzaW1vcHMubzogc2ltb3BzLmMgJChJTkNMVURFKQordGFibGUubzogdGFibGUuYworCitjbGVhbi1leHRyYTogY2xlYW4taWdlbgorCXJtIC1mIHRhYmxlLmMgc2ltb3BzLmggZ2VuY29kZQpkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvYWNjb25maWcuaCBiL3NpbS9tbjEwMzAwL2FjY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliODdhMQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tbjEwMzAwL2FjY29uZmlnLmgKQEAgLTAsMCArMSwxNSBAQAorCisvKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KKyN1bmRlZiBFTkFCTEVfTkxTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0NBVEdFVFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCmRpZmYgLS1naXQgYS9zaW0vbW4xMDMwMC9jb25maWcuaW4gYi9zaW0vbW4xMDMwMC9jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5Y2E5YwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tbjEwMzAwL2NvbmZpZy5pbgpAQCAtMCwwICsxLDE4MyBAQAorLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCisjdW5kZWYgQ19BTExPQ0EKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCisjdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCisjdW5kZWYgSEFWRV9BTExPQ0EKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCisjdW5kZWYgaW5saW5lCisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgb2ZmX3QKKworLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCisjdW5kZWYgX1BPU0lYX1NPVVJDRQorCisvKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoaW50IG9yIHZvaWQpLiAgKi8KKyN1bmRlZiBSRVRTSUdUWVBFCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIHNpemVfdAorCisvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKKyAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgorIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgorICovCisjdW5kZWYgU1RBQ0tfRElSRUNUSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIERlZmluZSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAorICAgYnl0ZSBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCBhbmQgVkFYKS4gICovCisjdW5kZWYgV09SRFNfQklHRU5ESUFOCisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19zZXRmcHVjdyBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX1NFVEZQVUNXCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgY2htb2QgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfQ0hNT0QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBjaG93biBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9DSE9XTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9EQ0dFVFRFWFQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBleGVjdiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9FWEVDVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGV4ZWN2ZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9FWEVDVkUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmb3JrIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0ZPUksKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUQ1dECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUlVTQUdFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX01VTk1BUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9QVVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VURU5WCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NFVExPQ0FMRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ2FjdGlvbiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TSUdBQ1RJT04KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDQVNFQ01QCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUkNIUgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRpbWUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfVElNRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHV0aW1lIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1VUSU1FCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfQVJHWl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZnB1X2NvbnRyb2wuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfRlBVX0NPTlRST0xfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9NQUxMT0NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9OTF9UWVBFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1dGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9VVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9WQUxVRVNfSApkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvY29uZmlndXJlIGIvc2ltL21uMTAzMDAvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY1MzI3NjMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbW4xMDMwMC9jb25maWd1cmUKQEAgLTAsMCArMSw0Mzk3IEBACisjISAvYmluL3NoCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3NpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisjIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKKyMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KKworIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMworCisKKworCisKKyMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKKworCisjIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKKworCisjIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIEN5Z3dpbjMyLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgQ1lHV0lOMzIgdG8gInllcyIuCisjIE90aGVyd2lzZSBzZXQgaXQgdG8gIm5vIi4KKworCisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgV2luMzIsIHdpdGhvdXQgdXNpbmcKKyMgQUNfQ0FOT05JQ0FMXyouICBJZiBzbywgc2V0IG91dHB1dCB2YXJpYWJsZSBFWEVFWFQgdG8gIi5leGUiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICIiLgorCisKKworCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZW5kaWFuPWVuZGlhbgkJU3BlY2lmeSB0YXJnZXQgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWFsaWdubWVudD1hbGlnbgkJU3BlY2lmeSBzdHJpY3QsICBub25zdHJpY3Qgb3IgZm9yY2VkIGFsaWdubWVudCBvZiBtZW1vcnkgYWNjZXNzZXMuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW49ZW5kCQlTcGVjaWZ5IGhvc3QgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtYnVpbGQtd2FybmluZ3NbPUxJU1RdCQlFbmFibGUgYnVpbGQtdGltZSBjb21waWxlciB3YXJuaW5ncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1yZXNlcnZlZC1iaXRzCQlTcGVjaWZ5IHdoZXRoZXIgdG8gY2hlY2sgcmVzZXJ2ZWQgYml0cyBpbiBpbnN0cnVjdGlvbi4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tYml0c2l6ZT1OCQlTcGVjaWZ5IHRhcmdldCBiaXRzaXplICgzMiBvciA2NCkuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWlubGluZT1pbmxpbmVzCQlTcGVjaWZ5IHdoaWNoIGZ1bmN0aW9ucyBzaG91bGQgYmUgaW5saW5lZC4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0taGFyZHdhcmU9TElTVAkJU3BlY2lmeSB0aGUgaGFyZHdhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1jb21tb24JCQlFbmFibGUgY29tbW9uIHNpbXVsYXRvciIKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2J1aWxkPU5PTkUKK2NhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2V4ZWNfcHJlZml4PU5PTkUKK2hvc3Q9Tk9ORQorbm9fY3JlYXRlPQorbm9ub3B0PU5PTkUKK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3RhcmdldD1OT05FCit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorc3ViZGlycz0KK01GTEFHUz0gTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT1NYWtlZmlsZS5pbgorCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2FjX2V4ZWV4dD0KK2FjX29iamV4dD1vCitpZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KKyAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKyAgICBhY19uPSBhY19jPScKKycgYWNfdD0nCScKKyAgZWxzZQorICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKyAgZmkKK2Vsc2UKKyAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CitmaQorCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY5NTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAorICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgorICBDUFA9IiR7Q0MtY2N9IC1FIgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3MTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjcxNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzI3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MzM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDc0NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NzUwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPS9saWIvY3BwCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKKyAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCitlbHNlCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKK2VjaG8gIiRhY190IiIkQ1BQIiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc3NTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1CitzZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgorYWxsOgorCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCitFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCitpZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcworZWxzZQorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0bWFrZQorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgU0VUX01BS0U9CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODAyOiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1CitpZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKKyAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQordGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKK0VPRgorCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0M9IiRDQyAtcG9zaXgiCisgIGVsc2UKKyAgICBDQz0iJENDIC1YcCIKKyAgZmkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgIElTQz0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4MjM6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDgyOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODM2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDg1MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4NzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODkyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCisjZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCitpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOworZXhpdCAoMCk7IH0KKworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjkwMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICA6CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBTVERDX0hFQURFUlMgMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5Mjc6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgOTMyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKy8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCit0eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7CisvKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLworY2hhciBjb25zdCAqY29uc3QgKmNjcDsKK2NoYXIgKipwOworLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3N0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKK3N0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OworLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgorICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCisgICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLworY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOworY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOworLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KKysrY2NwOworcCA9IChjaGFyKiopIGNjcDsKK2NjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOworeyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgY2hhciAqdDsKKyAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKKworICAqdCsrID0gMDsKK30KK3sgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCisgIGludCB4W10gPSB7MjUsIDE3fTsKKyAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKKyAgKytmb287Cit9Cit7IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KKyAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7CisgIGlwdHIgcCA9IDA7CisgICsrcDsKK30KK3sgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZworICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCisgIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07CisgIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKK30KK3sgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCisgIGNvbnN0IGludCBmb28gPSAxMDsKK30KKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk4MTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBjb25zdCAKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDAyOiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX2N2X2NfaW5saW5lPW5vCitmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwMDkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK30gJGFjX2t3IGZvbygpIHsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDE2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhaworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2RvbmUKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgorY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgorICBpbmxpbmUgfCB5ZXMpIDs7CisgIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgaW5saW5lIAorRU9GCisgOzsKKyAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKK0VPRgorIDs7Citlc2FjCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA0MjogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA0NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAib2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBvZmZfdCBsb25nCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA3NTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDgwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCitFT0YKKworZmkKKworIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKKyMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTExMDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExMTUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFsbG9jYS5oPgoraW50IG1haW4oKSB7CitjaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEyMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExNDM6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTE0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBIQVZFX0FMTE9DQV9ICisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLworY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKK2ludCBtYWluKCkgeworY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTc2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQSAxCitFT0YKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgorICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucworICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKKyAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCisgICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgorICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgQ19BTExPQ0EgMQorRU9GCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIwODogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyMTMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQord2ViZWNyYXkKKyNlbHNlCit3ZW5vdGJlY3JheQorI2VuZGlmCisKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KK2ZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjM4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjQzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKK0VPRgorCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZG9uZQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTI5MzogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzMDEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorZmluZF9zdGFja19kaXJlY3Rpb24gKCkKK3sKKyAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOworICBhdXRvIGNoYXIgZHVtbXk7CisgIGlmIChhZGRyID09IDApCisgICAgeworICAgICAgYWRkciA9ICZkdW1teTsKKyAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOworfQorbWFpbiAoKQoreworICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMyMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgorRU9GCisKK2ZpCisKK2ZvciBhY19oZHIgaW4gdW5pc3RkLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzQ1OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM1MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTM1NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzg0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMzg5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0Mzc6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE0NDUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisvKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KKyAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgorCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKwltbWFwIHNoYXJlZCBub3QgZml4ZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisgICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQorICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAorICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5CisgICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCisgICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKKyAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCisgICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAorICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCisKKyAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KKyAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6CisgICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKKyAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKy8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KKyNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQorIyBpZmRlZiBIQVZFX1VOSVNURF9ICisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgZW5kaWYKKworLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KKyMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKKyMgZW5kaWYKKworIyBpZmRlZiBfU0NfUEFHRVNJWkUKKyMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQorIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLworIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKKyMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQorIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgICBpZmRlZiBOQlBHCisjICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCisjICAgICBpZm5kZWYgQ0xTSVpFCisjICAgICAgZGVmaW5lIENMU0laRSAxCisjICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KKyMgICAgZWxzZSAvKiBubyBOQlBHICovCisjICAgICBpZmRlZiBOQlBDCisjICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQworIyAgICAgZWxzZSAvKiBubyBOQlBDICovCisjICAgICAgaWZkZWYgUEFHRVNJWkUKKyMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKKyMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLworIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLworIyAgICBlbmRpZiAvKiBubyBOQlBHICovCisjICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KKyMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCisKKyNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KKyNlbHNlCitjaGFyICptYWxsb2MoKTsKKyNlbmRpZgorCitpbnQKK21haW4oKQoreworCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOworCWludCBpLCBwYWdlc2l6ZTsKKwlpbnQgZmQ7CisKKwlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisKKwkvKgorCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KKwkgKi8KKwlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YSArIGkpID0gcmFuZCgpOworCXVtYXNrKDApOworCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCisJLyoKKwkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKKwkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCisJICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KKwkgKi8KKwlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgxKTsKKwlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOworCWlmICghZGF0YTIpCisJCWV4aXQoMSk7CisJZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOworCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCisJCQlleGl0KDEpOworCisJLyoKKwkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQorCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KKwkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKKwlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhMykKKwkJZXhpdCgxKTsKKwlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKKwkJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCXVubGluaygiY29uZnRlc3RtbWFwIik7CisJZXhpdCgwKTsKK30KKworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1ODU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9NTUFQIDEKK0VPRgorCitmaQorCisKKyMgYXV0b2NvbmYuaW5mbyBzYXlzIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCByaWdodCBhZnRlciBBQ19JTklULgorCisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY1ODogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisKK2hvc3RfYWxpYXM9JGhvc3QKK2Nhc2UgIiRob3N0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpCisgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpIDs7CisgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2hvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAoraG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjc5OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorCit0YXJnZXRfYWxpYXM9JHRhcmdldAorY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCit0YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCit0YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjk3OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9CitlbHNlCisgICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KKyAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAorcyxcXCxcXFxcLGc7IHMsXCQsJCQsZworRU9GX1NFRAorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgorICBybSAtZiBjb25mdGVzdHNlZAorZmkKK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorCisjIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCit0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTc0MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTc3MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBhY19wcm9nX3JlamVjdGVkPW5vCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgorICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworCWNvbnRpbnVlCisgICAgICBmaQorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KKyAgICAqd2luMzIqIHwgKldJTjMyKikKKyAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4MjA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4NTE6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE4NjEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorbWFpbigpe3JldHVybigwKTt9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg2NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCisgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKyAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubworICBlbHNlCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKKyAgZmkKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4ODU6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgorY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODkwOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19HTlVDX18KKyAgeWVzOworI2VuZGlmCitFT0YKK2lmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODk5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5MTg6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCitpZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBhY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCisjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKKyMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTk2MTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCisgICAgY2FzZSAiJGFjX2Rpci8iIGluCisgICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7CisgICAgKikKKyAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKyAgICAgICMgYnkgZGVmYXVsdC4KKyAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCisJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbHNlCisJICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKKwkgICAgYnJlYWsgMgorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgICAgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9JRlMiCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKyAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCisgICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCisgIGZpCitmaQorZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2CisKKyMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KKyMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCit0ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCisKK3Rlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisKKworIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgoraWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KKyAgQ0NfRk9SX0JVSUxEPSckKENDKScKK2Vsc2UKKyAgQ0NfRk9SX0JVSUxEPWdjYworZmkKKworCisKKworQVI9JHtBUi1hcn0KKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDI3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgorZmkKK2ZpCitSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCitBTExfTElOR1VBUz0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCit1bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwNjE6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMDY2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDcxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCitfX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjEwMTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjEwNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTI5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KKyAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMTU4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMTYzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxODY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgIGZpCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgorICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TVFBDUFkgMQorRU9GCisKKyAgIGZpCisKKyAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjIyMDogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMjI1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsb2NhbGUuaD4KK2ludCBtYWluKCkgeworcmV0dXJuIExDX01FU1NBR0VTCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2CisgICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCisgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCitFT0YKKworICAgIGZpCisgIGZpCisgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyNTM6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1CisgICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKKyAgVVNFX05MUz0kZW5hYmxldmFsCitlbHNlCisgIFVTRV9OTFM9eWVzCitmaQorCisgICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2CisgICAgCisKKyAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubworCisgICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgRU5BQkxFX05MUyAxCitFT0YKKworICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjI3MzogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1CisgICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAorZWxzZQorICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCitmaQorCisgICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKKworICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQorCW5sc19jdl9oZWFkZXJfbGliZ3Q9CisJQ0FUT0JKRVhUPU5PTkUKKworCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjkyOiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMjk3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMDI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzE5OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzMjQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpYmludGwuaD4KK2ludCBtYWluKCkgeworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMzE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgorCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjM0NzogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1CithY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxpbnRsICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzNTUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBiaW5kdGV4dGRvbWFpbigpOworCitpbnQgbWFpbigpIHsKK2JpbmR0ZXh0ZG9tYWluKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzY2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzgyOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzODcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzk0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJICAgZmkKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCisJICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCisJICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfR0VUVEVYVCAxCitFT0YKKworCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQyMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KKwlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKKyAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKwkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCisJCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQ1NjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjQ2MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDg0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTExOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRHTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgID86LyopCQkJIAorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgorICA7OworZXNhYworZmkKK0dNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCitpZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTQ2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkWEdFVFRFWFQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKKyAgOzsKK2VzYWMKK2ZpCitYR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCitpZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI1NzggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKKwkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1ODY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0uZ21vCisJCSAgIERBVEFESVJOQU1FPXNoYXJlCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0ubW8KKwkJICAgREFUQURJUk5BTUU9bGliCitmaQorcm0gLWYgY29uZnRlc3QqCisJCUlOU1RPQkpFWFQ9Lm1vCisJICAgICAgZmkKKwkgICAgZmkKKwkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKwkgICAgICAgIAorICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgorCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNjE4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKKyAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjY1MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjY4NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAKKwlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICAgICAgQ0FUT0JKRVhUPS5nbW8KKyAgICAgICAgSU5TVE9CSkVYVD0ubW8KKyAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKKwlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJworCUlOVExMSUJTPSRJTlRMREVQUworCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAorICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCisgICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgorCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgorCSAgOiA7CisJZWxzZQorCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgorCSAgWEdFVFRFWFQ9IjoiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgorICAgICAgUE9TVUI9cG8KKyAgICBlbHNlCisgICAgICBEQVRBRElSTkFNRT1zaGFyZQorICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKKyAgICBmaQorCisgICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJworICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCisgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgorICAgICAgVVNFX05MUz15ZXMKKyAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgIGZpCisKKyAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKKyAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgorICAgIGRvbmUKKworICAgICAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgCisKKyAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KKyAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KKyAgICAgICBMSU5HVUFTPQorICAgICBlbHNlCisgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjc3NzogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1CisgICAgICAgTkVXX0xJTkdVQVM9CisgICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCisgICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCisgICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKKyAgICAgICAgIGVzYWMKKyAgICAgICBkb25lCisgICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKKyAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKKyAgICAgZmkKKworICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgorICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKKyAgICAgZmkKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgorICAgZWxzZQorICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCisvKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCisgICBmaQorICAgCisKKyAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgorCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjgwNTogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjgxMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODE1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgbXNnZm9ybWF0PWxpbnV4CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorbXNnZm9ybWF0PXhvcGVuCitmaQorCisKKwkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKKyAgICAgIGZpCisgICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKKwkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAorICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCisgICAgIEdUX05PPSIjTk8jIgorICAgICBHVF9ZRVM9CisgICBlbHNlCisgICAgIEdUX05PPQorICAgICBHVF9ZRVM9IiNZRVMjIgorICAgZmkKKyAgIAorICAgCisKKyAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKKyAgIAorCisgICAgICBsPQorICAgCisKKyAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgorICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbworICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KKwkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KKwkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgorCSBlbHNlCisJICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKKwkgZmkKKyAgICAgIGVsc2UKKwkgcG9zcmNwcmVmaXg9Ii4uLyIKKyAgICAgIGZpCisgICAgICBybSAtZiBwby9QT1RGSUxFUworICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCisJIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCisgICBmaQorICAKKworIyBDaGVjayBmb3IgY29tbW9uIGhlYWRlcnMuCisjIEZJWE1FOiBTZWVtcyB0byBtZSB0aGlzIGNhbiBjYXVzZSBwcm9ibGVtcyBmb3IgaTM4Ni13aW5kb3dzIGhvc3RzLgorIyBBdCBvbmUgcG9pbnQgdGhlcmUgd2VyZSBoYXJkY29kZWQgQUNfREVGSU5FJ3MgaWYgJHtob3N0fSA9IGkzODYtKi13aW5kb3dzKi4KK2ZvciBhY19oZHIgaW4gc3RkbGliLmggc3RyaW5nLmggc3RyaW5ncy5oIHVuaXN0ZC5oIHRpbWUuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI4ODQ6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyODg5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODk0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2hkciBpbiBzeXMvdGltZS5oIHN5cy9yZXNvdXJjZS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjkyNDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI5MjkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI5MzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfaGRyIGluIGZjbnRsLmggZnB1X2NvbnRyb2wuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5NjQ6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTY5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTc0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2Z1bmMgaW4gZ2V0cnVzYWdlIHRpbWUgc2lnYWN0aW9uIF9fc2V0ZnB1Y3cKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMwMDM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMwMDggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzAzMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisjIENoZWNrIGZvciBzb2NrZXQgbGlicmFyaWVzCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZCBpbiAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzA1ODogY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiID4mNQorYWNfbGliX3Zhcj1gZWNobyBzb2NrZXQnXydiaW5kIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbHNvY2tldCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDY2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgYmluZCgpOworCitpbnQgbWFpbigpIHsKK2JpbmQoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNzc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gc29ja2V0IHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2xpYiAxCitFT0YKKworICBMSUJTPSItbHNvY2tldCAkTElCUyIKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMTA1OiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIgPiY1CithY19saWJfdmFyPWBlY2hvIG5zbCdfJ2dldGhvc3RieW5hbWUgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sbnNsICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMxMTMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBnZXRob3N0YnluYW1lKCk7CisKK2ludCBtYWluKCkgeworZ2V0aG9zdGJ5bmFtZSgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzEyNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBuc2wgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKKyAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfbGliIDEKK0VPRgorCisgIExJQlM9Ii1sbnNsICRMSUJTIgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisuICR7c3JjZGlyfS8uLi8uLi9iZmQvY29uZmlndXJlLmhvc3QKKworCisKK1VTRV9NQUlOVEFJTkVSX01PREU9bm8KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3IgLS1kaXNhYmxlLW1haW50YWluZXItbW9kZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9tYWludGFpbmVyX21vZGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX21haW50YWluZXJfbW9kZSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCU1BSU5UPSIiIFVTRV9NQUlOVEFJTkVSX01PREU9eWVzIDs7CisgIG5vKQlNQUlOVD0iIyIgOzsKKyAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgTUFJTlQ9IiMiIDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkTUFJTlQiID0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgbWFpbnRhaW5lciBtb2RlIiA2PiYxCitmaQorZWxzZQorICBNQUlOVD0iIyIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWJzd2FwIG9yIC0tZGlzYWJsZS1zaW0tYnN3YXAgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2Jzd2FwK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fYnN3YXAiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0xIC1EVVNFX0JTV0FQPTEiOzsKKyAgbm8pCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTAiOzsKKyAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLWJzd2FwIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2Jzd2FwPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYnN3YXAiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGJzd2FwIGZsYWdzID0gJHNpbV9ic3dhcCIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2Jzd2FwPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1jZmxhZ3Mgb3IgLS1kaXNhYmxlLXNpbS1jZmxhZ3Mgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2NmbGFncytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2NmbGFncyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCSBzaW1fY2ZsYWdzPSItTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIiOzsKKyAgdHJhY2UpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlBsZWFzZSB1c2UgLS1lbmFibGUtc2ltLWRlYnVnIGluc3RlYWQuIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fY2ZsYWdzPSIiOzsKKyAgbm8pCSBzaW1fY2ZsYWdzPSIiOzsKKyAgKikJIHNpbV9jZmxhZ3M9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2NmbGFncyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIGNmbGFncyA9ICRzaW1fY2ZsYWdzIiA2PiYxCitmaQorZWxzZQorICBzaW1fY2ZsYWdzPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1kZWJ1ZyBvciAtLWRpc2FibGUtc2ltLWRlYnVnIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9kZWJ1ZytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2RlYnVnIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykgc2ltX2RlYnVnPSItRERFQlVHPTcgLURXSVRIX0RFQlVHPTciOzsKKyAgbm8pICBzaW1fZGVidWc9Ii1EREVCVUc9MCAtRFdJVEhfREVCVUc9MCI7OworICAqKSAgIHNpbV9kZWJ1Zz0iLURERUJVRz0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9ERUJVRz0nKCR7ZW5hYmxldmFsfSknIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2RlYnVnIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gZGVidWcgPSAkc2ltX2RlYnVnIiA2PiYxCitmaQorZWxzZQorICBzaW1fZGVidWc9IiIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXN0ZGlvIG9yIC0tZGlzYWJsZS1zaW0tc3RkaW8gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3N0ZGlvK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fc3RkaW8iCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET19VU0VfU1RESU8iOzsKKyAgbm8pCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPTlRfVVNFX1NURElPIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLXN0ZGlvIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fc3RkaW89IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zdGRpbyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc3RkaW8gZmxhZ3MgPSAkc2ltX3N0ZGlvIiA2PiYxCitmaQorZWxzZQorICBzaW1fc3RkaW89IiIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXRyYWNlIG9yIC0tZGlzYWJsZS1zaW0tdHJhY2Ugd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3RyYWNlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fdHJhY2UiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MSAtRFdJVEhfVFJBQ0U9LTEiOzsKKyAgbm8pCXNpbV90cmFjZT0iLURUUkFDRT0wIC1EV0lUSF9UUkFDRT0wIjs7CisgIFstMC05XSopCisJc2ltX3RyYWNlPSItRFRSQUNFPScoJHtlbmFibGV2YWx9KScgLURXSVRIX1RSQUNFPScoJHtlbmFibGV2YWx9KSciOzsKKyAgW2Etel0qKQorCXNpbV90cmFjZT0iIgorCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbworCSAgaWYgdGVzdCB4IiRzaW1fdHJhY2UiID0geDsgdGhlbgorCSAgICBzaW1fdHJhY2U9Ii1EV0lUSF9UUkFDRT0nKFRSQUNFXyR4IgorCSAgZWxzZQorCSAgICBzaW1fdHJhY2U9IiR7c2ltX3RyYWNlfXxUUkFDRV8keCIKKwkgIGZpCisJZG9uZQorCXNpbV90cmFjZT0iJHNpbV90cmFjZSknIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV90cmFjZSIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIHRyYWNlID0gJHNpbV90cmFjZSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3RyYWNlPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1wcm9maWxlIG9yIC0tZGlzYWJsZS1zaW0tcHJvZmlsZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fcHJvZmlsZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3Byb2ZpbGUiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTEgLURXSVRIX1BST0ZJTEU9LTEiOzsKKyAgbm8pCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9MCAtRFdJVEhfUFJPRklMRT0wIjs7CisgIFstMC05XSopCisJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9QUk9GSUxFPScoJHtlbmFibGV2YWx9KSciOzsKKyAgW2Etel0qKQorCXNpbV9wcm9maWxlPSIiCisJZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCisJICBpZiB0ZXN0IHgiJHNpbV9wcm9maWxlIiA9IHg7IHRoZW4KKwkgICAgc2ltX3Byb2ZpbGU9Ii1EV0lUSF9QUk9GSUxFPScoUFJPRklMRV8keCIKKwkgIGVsc2UKKwkgICAgc2ltX3Byb2ZpbGU9IiR7c2ltX3Byb2ZpbGV9fFBST0ZJTEVfJHgiCisJICBmaQorCWRvbmUKKwlzaW1fcHJvZmlsZT0iJHNpbV9wcm9maWxlKSciIDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBwcm9maWxlID0gJHNpbV9wcm9maWxlIiA2PiYxCitmaQorZWxzZQorICBzaW1fcHJvZmlsZT0iIgorZmkKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzMwMDogY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpZ25hbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMzMDUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2lmZGVmIHNpZ25hbAorI3VuZGVmIHNpZ25hbAorI2VuZGlmCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgdm9pZCAoKnNpZ25hbCAoaW50LCB2b2lkICgqKShpbnQpKSkoaW50KTsKKyNlbHNlCit2b2lkICgqc2lnbmFsICgpKSAoKTsKKyNlbmRpZgorCitpbnQgbWFpbigpIHsKK2ludCBpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzMjI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpZ25hbD12b2lkCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2lnbmFsPWludAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpZ25hbCIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgUkVUU0lHVFlQRSAkYWNfY3ZfdHlwZV9zaWduYWwKK0VPRgorCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMzQyOiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRDWUdXSU4zMiIgPSB5ZXM7IHRoZW4KK2FtX2N2X2V4ZWV4dD0uZXhlCitlbHNlCitjYXQgPiBhbV9jX3Rlc3QuYyA8PCAnRU9GJworaW50IG1haW4oKSB7CisvKiBOb3RoaW5nIG5lZWRlZCBoZXJlICovCit9CitFT0YKKyR7Q0MtY2N9IC1vIGFtX2NfdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBhbV9jX3Rlc3QuYyAkTElCUyAxPiY1CithbV9jdl9leGVleHQ9YGxzIGFtX2NfdGVzdC4qIHwgZ3JlcCAtdiBhbV9jX3Rlc3QuYyB8IHNlZCAtZSBzL2FtX2NfdGVzdC8vYAorcm0gLWYgYW1fY190ZXN0KgorZmkKKwordGVzdCB4IiR7YW1fY3ZfZXhlZXh0fSIgPSB4ICYmIGFtX2N2X2V4ZWV4dD1ubworZmkKK0VYRUVYVD0iIgordGVzdCB4IiR7YW1fY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FtX2N2X2V4ZWV4dH0KK2VjaG8gIiRhY190IiIke2FtX2N2X2V4ZWV4dH0iIDE+JjYKKworCitzaW1fbGlua19maWxlcz0KK3NpbV9saW5rX2xpbmtzPQorCitzaW1fbGlua19saW5rcz10Y29uZmlnLmgKK2lmIHRlc3QgLWYgJHtzcmNkaXJ9L3Rjb25maWcuaW4KK3RoZW4KKyAgc2ltX2xpbmtfZmlsZXM9dGNvbmZpZy5pbgorZWxzZQorICBzaW1fbGlua19maWxlcz0uLi9jb21tb24vdGNvbmZpZy5pbgorZmkKKworIyB0YXJnLXZhbHMuZGVmIHBvaW50cyB0byB0aGUgbGliYyBtYWNybyBkZXNjcmlwdGlvbiBmaWxlLgorY2FzZSAiJHt0YXJnZXR9IiBpbgorKi0qLSopIFRBUkdfVkFMU19ERUY9Li4vY29tbW9uL25sdHZhbHMuZGVmIDs7Citlc2FjCitzaW1fbGlua19maWxlcz0iJHtzaW1fbGlua19maWxlc30gJHtUQVJHX1ZBTFNfREVGfSIKK3NpbV9saW5rX2xpbmtzPSIke3NpbV9saW5rX2xpbmtzfSB0YXJnLXZhbHMuZGVmIgorCisKKworCit3aXJlX2VuZGlhbj0iTElUVExFX0VORElBTiIKK2RlZmF1bHRfZW5kaWFuPSIiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWVuZGlhbiBvciAtLWRpc2FibGUtc2ltLWVuZGlhbiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fZW5kaWFuK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZW5kaWFuIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIGIqfEIqKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9QklHX0VORElBTiI7OworICBsKnxMKikgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iOzsKKyAgeWVzKQkgaWYgdGVzdCB4IiR3aXJlX2VuZGlhbiIgIT0geDsgdGhlbgorCSAgIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0ke3dpcmVfZW5kaWFufSIKKwkgZWxzZQorICAgICAgICAgICBpZiB0ZXN0IHgiJGRlZmF1bHRfZW5kaWFuIiAhPSB4OyB0aGVuCisJICAgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9JHtkZWZhdWx0X2VuZGlhbn0iCisJICAgZWxzZQorCSAgICAgZWNobyAiTm8gaGFyZC13aXJlZCBlbmRpYW4gZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2CisJICAgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9MCIKKwkgICBmaQorCSBmaTs7CisgIG5vKQkgaWYgdGVzdCB4IiRkZWZhdWx0X2VuZGlhbiIgIT0geDsgdGhlbgorCSAgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPSR7ZGVmYXVsdF9lbmRpYW59IgorCSBlbHNlCisJICAgaWYgdGVzdCB4IiR3aXJlX2VuZGlhbiIgIT0geDsgdGhlbgorCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9JHt3aXJlX2VuZGlhbn0iCisJICAgZWxzZQorCSAgICAgZWNobyAiTm8gZGVmYXVsdCBlbmRpYW4gZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2CisJICAgICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0wIgorCSAgIGZpCisJIGZpOzsKKyAgKikJIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBmb3IgLS1lbmFibGUtc2ltLWVuZGlhbiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2VuZGlhbj0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2VuZGlhbiIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgZW5kaWFuIGZsYWdzID0gJHNpbV9lbmRpYW4iIDY+JjEKK2ZpCitlbHNlCisgIGlmIHRlc3QgeCIkZGVmYXVsdF9lbmRpYW4iICE9IHg7IHRoZW4KKyAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9JHtkZWZhdWx0X2VuZGlhbn0iCitlbHNlCisgIGlmIHRlc3QgeCIkd2lyZV9lbmRpYW4iICE9IHg7IHRoZW4KKyAgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9JHt3aXJlX2VuZGlhbn0iCisgIGVsc2UKKyAgICBzaW1fZW5kaWFuPQorICBmaQorZmkKK2ZpCisKK3dpcmVfYWxpZ25tZW50PSJOT05TVFJJQ1RfQUxJR05NRU5UIgorZGVmYXVsdF9hbGlnbm1lbnQ9IiIKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQgb3IgLS1kaXNhYmxlLXNpbS1hbGlnbm1lbnQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2FsaWdubWVudCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2FsaWdubWVudCIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICBzdHJpY3QgfCBTVFJJQ1QpICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9U1RSSUNUX0FMSUdOTUVOVCI7OworICBub25zdHJpY3QgfCBOT05TVFJJQ1QpIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9Tk9OU1RSSUNUX0FMSUdOTUVOVCI7OworICBmb3JjZWQgfCBGT1JDRUQpICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9Rk9SQ0VEX0FMSUdOTUVOVCI7OworICB5ZXMpIGlmIHRlc3QgeCIkd2lyZV9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKwkgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0ke3dpcmVfYWxpZ25tZW50fSIKKyAgICAgICBlbHNlCisgICAgICAgICBpZiB0ZXN0IHgiJGRlZmF1bHRfYWxpZ25tZW50IiAhPSB4OyB0aGVuCisgICAgICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCisgICAgICAgICBlbHNlCisJICAgZWNobyAiTm8gaGFyZC13aXJlZCBhbGlnbm1lbnQgZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2CisJICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0wIgorICAgICAgICAgZmkKKyAgICAgICBmaTs7CisgIG5vKSAgaWYgdGVzdCB4IiRkZWZhdWx0X2FsaWdubWVudCIgIT0geDsgdGhlbgorCSBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCisgICAgICAgZWxzZQorICAgICAgICAgaWYgdGVzdCB4IiR3aXJlX2FsaWdubWVudCIgIT0geDsgdGhlbgorCSAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0ke3dpcmVfYWxpZ25tZW50fSIKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgZWNobyAiTm8gZGVmYXVsdCBhbGlnbm1lbnQgZm9yIHRhcmdldCAkdGFyZ2V0IiAxPiY2CisgICAgICAgICAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9ERUZBVUxUX0FMSUdOTUVOVD0wIgorICAgICAgICAgZmkKKyAgICAgICBmaTs7CisgICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tYWxpZ25tZW50IiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYWxpZ25tZW50PSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYWxpZ25tZW50IiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBhbGlnbm1lbnQgZmxhZ3MgPSAkc2ltX2FsaWdubWVudCIgNj4mMQorZmkKK2Vsc2UKKyAgaWYgdGVzdCB4IiRkZWZhdWx0X2FsaWdubWVudCIgIT0geDsgdGhlbgorICBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9JHtkZWZhdWx0X2FsaWdubWVudH0iCitlbHNlCisgIGlmIHRlc3QgeCIkd2lyZV9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKyAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPSR7d2lyZV9hbGlnbm1lbnR9IgorICBlbHNlCisgICAgc2ltX2FsaWdubWVudD0KKyAgZmkKK2ZpCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbiBvciAtLWRpc2FibGUtc2ltLWhvc3RlbmRpYW4gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2hvc3RlbmRpYW4rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ob3N0ZW5kaWFuIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIG5vKQkgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9MCI7OworICBiKnxCKikgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9QklHX0VORElBTiI7OworICBsKnxMKikgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiI7OworICAqKQkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2hvc3RlbmRpYW49IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ob3N0ZW5kaWFuIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBob3N0ZW5kaWFuIGZsYWdzID0gJHNpbV9ob3N0ZW5kaWFuIiA2PiYxCitmaQorZWxzZQorICAKK2lmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM0OTY6IGNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4iID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfYmlnZW5kaWFuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bgorIyBTZWUgaWYgc3lzL3BhcmFtLmggZGVmaW5lcyB0aGUgQllURV9PUkRFUiBtYWNyby4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM1MDMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgoraW50IG1haW4oKSB7CisKKyNpZiAhQllURV9PUkRFUiB8fCAhQklHX0VORElBTiB8fCAhTElUVExFX0VORElBTgorIGJvZ3VzIGVuZGlhbiBtYWNyb3MKKyNlbmRpZgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1MTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICAjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIEJJR19FTkRJQU4gb3Igbm90LgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzUxOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CitpbnQgbWFpbigpIHsKKworI2lmIEJZVEVfT1JERVIgIT0gQklHX0VORElBTgorIG5vdCBiaWcgZW5kaWFuCisjZW5kaWYKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTI5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfYmlnZW5kaWFuPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgoraWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZyIgMT4mMjsgZXhpdCAxOyB9CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM1NDkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorbWFpbiAoKSB7CisgIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KKyAgdW5pb24KKyAgeworICAgIGxvbmcgbDsKKyAgICBjaGFyIGNbc2l6ZW9mIChsb25nKV07CisgIH0gdTsKKyAgdS5sID0gMTsKKyAgZXhpdCAodS5jW3NpemVvZiAobG9uZykgLSAxXSA9PSAxKTsKK30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTYyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2NfYmlnZW5kaWFuPW5vCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfYmlnZW5kaWFuIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKK0VPRgorCitmaQorCisgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0geWVzOyB0aGVuCisgICAgc2ltX2hvc3RlbmRpYW49Ii1EV0lUSF9IT1NUX0JZVEVfT1JERVI9QklHX0VORElBTiIKKyAgZWxzZQorICAgIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iCisgIGZpCitlbHNlCisgIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPTAiCitmaQorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtYnVpbGQtd2FybmluZ3Mgb3IgLS1kaXNhYmxlLWJ1aWxkLXdhcm5pbmdzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2J1aWxkX3dhcm5pbmdzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9idWlsZF93YXJuaW5ncyIKKyAgYnVpbGRfd2FybmluZ3M9Ii1XYWxsIC1XcG9pbnRlci1hcml0aCAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMiCitjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJOzsKKyAgbm8pCWJ1aWxkX3dhcm5pbmdzPSItdyI7OworICAsKikgICB0PWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImAKKwlidWlsZF93YXJuaW5ncz0iJHtidWlsZF93YXJuaW5nc30gJHt0fSI7OworICAqLCkgICB0PWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImAKKwlidWlsZF93YXJuaW5ncz0iJHt0fSAke2J1aWxkX3dhcm5pbmdzfSI7OworICAqKQlidWlsZF93YXJuaW5ncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRidWlsZF93YXJuaW5ncyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgd2FybmluZyBmbGFncyA9ICRidWlsZF93YXJuaW5ncyIgNj4mMQorZmkKK2Vsc2UKKyAgYnVpbGRfd2FybmluZ3M9IiIKK2ZpCisKKworZGVmYXVsdF9zaW1fcmVzZXJ2ZWRfYml0cz0iMSIKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cyBvciAtLWRpc2FibGUtc2ltLXJlc2VydmVkLWJpdHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3Jlc2VydmVkX2JpdHMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9yZXNlcnZlZF9iaXRzIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3Jlc2VydmVkX2JpdHM9Ii1EV0lUSF9SRVNFUlZFRF9CSVRTPTEiOzsKKyAgbm8pCXNpbV9yZXNlcnZlZF9iaXRzPSItRFdJVEhfUkVTRVJWRURfQklUUz0wIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1yZXNlcnZlZC1iaXRzIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3Jlc2VydmVkX2JpdHM9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9yZXNlcnZlZF9iaXRzIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyByZXNlcnZlZCBmbGFncyA9ICRzaW1fcmVzZXJ2ZWRfYml0cyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3Jlc2VydmVkX2JpdHM9Ii1EV0lUSF9SRVNFUlZFRF9CSVRTPSR7ZGVmYXVsdF9zaW1fcmVzZXJ2ZWRfYml0c30iCitmaQorCit3aXJlX3dvcmRfYml0c2l6ZT0iMzIiCit3aXJlX3dvcmRfbXNiPSIzMSIKK3dpcmVfYWRkcmVzc19iaXRzaXplPSIiCit3aXJlX2NlbGxfYml0c2l6ZT0iIgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1iaXRzaXplIG9yIC0tZGlzYWJsZS1zaW0tYml0c2l6ZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fYml0c2l6ZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2JpdHNpemUiCisgIHNpbV9iaXRzaXplPQorY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICA2NCw2MyB8IDY0LDYzLCogKSBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9NjQgLURXSVRIX1RBUkdFVF9XT1JEX01TQj02MyI7OworICAzMiwzMSB8IDMyLDMxLCogKSBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9MzIgLURXSVRIX1RBUkdFVF9XT1JEX01TQj0zMSI7OworICA2NCwwIHwgNjQsMCwqICkgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTMyIC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MCI7OworICAzMiwwIHwgNjQsMCwqICkgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTMyIC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MCI7OworICAzMikgaWYgdGVzdCB4IiR3aXJlX3dvcmRfbXNiIiAhPSB4IC1hIHgiJHdpcmVfd29yZF9tc2IiICE9IHgwOyB0aGVuCisgICAgICAgIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT0zMiAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTMxIgorICAgICAgZWxzZQorICAgICAgICBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9MzIgLURXSVRIX1RBUkdFVF9XT1JEX01TQj0wIgorICAgICAgZmkgOzsKKyAgNjQpIGlmIHRlc3QgeCIkd2lyZV93b3JkX21zYiIgIT0geCAtYSB4IiR3aXJlX3dvcmRfbXNiIiAhPSB4MDsgdGhlbgorICAgICAgICBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9NjQgLURXSVRIX1RBUkdFVF9XT1JEX01TQj02MyIKKyAgICAgIGVsc2UKKyAgICAgICAgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTY0IC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MCIKKyAgICAgIGZpIDs7CisgICopICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYml0c2l6ZSB3YXMgZ2l2ZW4gJGVuYWJsZXZhbC4gIEV4cGVjdGVkIDMyIG9yIDY0IiIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCisjIGFkZHJlc3MgYml0c2l6ZQordG1wPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzL15bMC05XSosKlswLTldKiwqLy8iYAorY2FzZSB4IiR7dG1wfSIgaW4KKyAgeCApIDs7CisgIHgzMiB8IHgzMiwqICkgc2ltX2JpdHNpemU9IiR7c2ltX2JpdHNpemV9IC1EV0lUSF9UQVJHRVRfQUREUkVTU19CSVRTSVpFPTMyIiA7OworICB4NjQgfCB4NjQsKiApIHNpbV9iaXRzaXplPSIke3NpbV9iaXRzaXplfSAtRFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRT02NCIgOzsKKyAgKiApIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1iaXRzaXplIHdhcyBnaXZlbiBhZGRyZXNzIHNpemUgJGVuYWJsZXZhbC4gIEV4cGVjdGVkIDMyIG9yIDY0IiIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCisjIGNlbGwgYml0c2l6ZQordG1wPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzL15bMC05XSosKlswLTkqXSosKlswLTldKiwqLy8iYAorY2FzZSB4IiR7dG1wfSIgaW4KKyAgeCApIDs7CisgIHgzMiB8IHgzMiwqICkgc2ltX2JpdHNpemU9IiR7c2ltX2JpdHNpemV9IC1EV0lUSF9UQVJHRVRfQ0VMTF9CSVRTSVpFPTMyIiA7OworICB4NjQgfCB4NjQsKiApIHNpbV9iaXRzaXplPSIke3NpbV9iaXRzaXplfSAtRFdJVEhfVEFSR0VUX0NFTExfQklUU0laRT02NCIgOzsKKyAgKiApIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1iaXRzaXplIHdhcyBnaXZlbiBjZWxsIHNpemUgJGVuYWJsZXZhbC4gIEV4cGVjdGVkIDMyIG9yIDY0IiIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2JpdHNpemUiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGJpdHNpemUgZmxhZ3MgPSAkc2ltX2JpdHNpemUiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9iaXRzaXplPSIiCitpZiB0ZXN0IHgiJHdpcmVfd29yZF9iaXRzaXplIiAhPSB4OyB0aGVuCisgIHNpbV9iaXRzaXplPSIkc2ltX2JpdHNpemUgLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9JHdpcmVfd29yZF9iaXRzaXplIgorZmkKK2lmIHRlc3QgeCIkd2lyZV93b3JkX21zYiIgIT0geDsgdGhlbgorICBzaW1fYml0c2l6ZT0iJHNpbV9iaXRzaXplIC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9JHdpcmVfd29yZF9tc2IiCitmaQoraWYgdGVzdCB4IiR3aXJlX2FkZHJlc3NfYml0c2l6ZSIgIT0geDsgdGhlbgorICBzaW1fYml0c2l6ZT0iJHNpbV9iaXRzaXplIC1EV0lUSF9UQVJHRVRfQUREUkVTU19CSVRTSVpFPSR3aXJlX2FkZHJlc3NfYml0c2l6ZSIKK2ZpCitpZiB0ZXN0IHgiJHdpcmVfY2VsbF9iaXRzaXplIiAhPSB4OyB0aGVuCisgIHNpbV9iaXRzaXplPSIkc2ltX2JpdHNpemUgLURXSVRIX1RBUkdFVF9DRUxMX0JJVFNJWkU9JHdpcmVfY2VsbF9iaXRzaXplIgorZmkKK2ZpCisKKworZGVmYXVsdF9zaW1faW5saW5lPSIiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWlubGluZSBvciAtLWRpc2FibGUtc2ltLWlubGluZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1faW5saW5lK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1faW5saW5lIgorICBzaW1faW5saW5lPSIiCitjYXNlICIkZW5hYmxldmFsIiBpbgorICBubykJCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCI7OworICAwKQkJc2ltX2lubGluZT0iLURERUZBVUxUX0lOTElORT0wIjs7CisgIHllcyB8IDIpCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9QUxMX0NfSU5MSU5FIjs7CisgIDEpCQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPUlOTElORV9MT0NBTFMiOzsKKyAgKikgZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCisgICAgICAgbmV3X2ZsYWc9IiIKKyAgICAgICBjYXNlICIkeCIgaW4KKwkgKl9JTkxJTkU9KikJbmV3X2ZsYWc9Ii1EJHgiOzsKKwkgKj0qKQkJbmV3X2ZsYWc9YGVjaG8gIiR4IiB8IHNlZCAtZSAicy89L19JTkxJTkU9LyIgLWUgInMvXi8tRC8iYDs7CisJICpfSU5MSU5FKQluZXdfZmxhZz0iLUQkeD1BTExfQ19JTkxJTkUiOzsKKwkgKikJCW5ld19mbGFnPSItRCR4IiJfSU5MSU5FPUFMTF9DX0lOTElORSI7OworICAgICAgIGVzYWMKKyAgICAgICBpZiB0ZXN0IHgiJHNpbV9pbmxpbmUiID0geCIiOyB0aGVuCisJIHNpbV9pbmxpbmU9IiRuZXdfZmxhZyIKKyAgICAgICBlbHNlCisJIHNpbV9pbmxpbmU9IiRzaW1faW5saW5lICRuZXdfZmxhZyIKKyAgICAgICBmaQorICAgICBkb25lOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1faW5saW5lIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBpbmxpbmUgZmxhZ3MgPSAkc2ltX2lubGluZSIgNj4mMQorZmkKK2Vsc2UKKyAgCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICBpZiB0ZXN0IHgiJEdDQyIgIT0gIngiIC1hIHgiJHtkZWZhdWx0X3NpbV9pbmxpbmV9IiAhPSAieCIgOyB0aGVuCisgICAgc2ltX2lubGluZT0iJHtkZWZhdWx0X3NpbV9pbmxpbmV9IgorICAgIGlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KKyAgICAgIGVjaG8gIlNldHRpbmcgaW5saW5lIGZsYWdzID0gJHNpbV9pbmxpbmUiIDY+JjEKKyAgICBmaQorICBlbHNlCisgICAgc2ltX2lubGluZT0iIgorICBmaQorZWxzZQorICBzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCitmaQorZmkKKworCitpZiB0ZXN0IHgieWVzIiA9IHgieWVzIjsgdGhlbgorICBzaW1faHdfcD15ZXMKK2Vsc2UKKyAgc2ltX2h3X3A9bm8KK2ZpCitpZiB0ZXN0ICIiOyB0aGVuCisgIGhhcmR3YXJlPSJjb3JlIHBhbCBnbHVlIgorZWxzZQorICBoYXJkd2FyZT0iY29yZSBwYWwgZ2x1ZSBtbjEwM2NwdSBtbjEwM2ludCBtbjEwM3RpbSBtbjEwM3NlciBtbjEwM2lvcCIKK2ZpCitzaW1faHdfY2ZsYWdzPSItRFdJVEhfSFc9MSIKK3NpbV9odz0iJGhhcmR3YXJlIgorc2ltX2h3X29ianM9IlwkKFNJTV9DT01NT05fSFdfT0JKUykgYGVjaG8gJHNpbV9odyB8IHNlZCAtZSAncy9cKFteIF1bXiBdKlwpL2R2LVwxLm8vZydgIgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1oYXJkd2FyZSBvciAtLWRpc2FibGUtc2ltLWhhcmR3YXJlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9oYXJkd2FyZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2hhcmR3YXJlIgorICAKK2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1faHdfcD15ZXM7OworICBubykJc2ltX2h3X3A9bm87OworICAsKikgICBzaW1faHdfcD15ZXM7IGhhcmR3YXJlPSIke2hhcmR3YXJlfSBgZWNobyAke2VuYWJsZXZhbH0gfCBzZWQgLWUgJ3MvLC8gLydgIjs7CisgICosKSAgIHNpbV9od19wPXllczsgaGFyZHdhcmU9ImBlY2hvICR7ZW5hYmxldmFsfSB8IHNlZCAtZSAncy8sLyAvJ2AgJHtoYXJkd2FyZX0iOzsKKyAgKikJc2ltX2h3X3A9eWVzOyBoYXJkd2FyZT0iYGVjaG8gJHtlbmFibGV2YWx9IHwgc2VkIC1lICdzLywvIC8nYCInJzs7Citlc2FjCitpZiB0ZXN0ICIkc2ltX2h3X3AiICE9IHllczsgdGhlbgorICBzaW1faHdfb2Jqcz0KKyAgc2ltX2h3X2NmbGFncz0iLURXSVRIX0hXPTAiCisgIHNpbV9odz0KK2Vsc2UKKyAgc2ltX2h3X2NmbGFncz0iLURXSVRIX0hXPTEiCisgICMgcmVtb3ZlIGR1cGxpY2F0ZXMKKyAgc2ltX2h3PSIiCisgIHNpbV9od19vYmpzPSJcJChTSU1fQ09NTU9OX0hXX09CSlMpIgorICBmb3IgaSBpbiB4ICRoYXJkd2FyZSA7IGRvCisgICAgY2FzZSAiICRmICIgaW4KKyAgICAgIHgpIDs7CisgICAgICAqIiAkaSAiKikgOzsKKyAgICAgICopIHNpbV9odz0iJHNpbV9odyAkaSIgOyBzaW1faHdfb2Jqcz0iJHNpbV9od19vYmpzIGR2LSRpLm8iOzsKKyAgICBlc2FjCisgIGRvbmUKK2ZpCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgIiRzaW1faHdfcCIgPSAieWVzIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGhhcmR3YXJlIHRvICRzaW1faHdfY2ZsYWdzLCAkc2ltX2h3LCAkc2ltX2h3X29ianMiCitmaQorZWxzZQorICAKK2lmIHRlc3QgIiRzaW1faHdfcCIgIT0geWVzOyB0aGVuCisgIHNpbV9od19vYmpzPQorICBzaW1faHdfY2ZsYWdzPSItRFdJVEhfSFc9MCIKKyAgc2ltX2h3PQorZmkKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBoYXJkd2FyZSB0byAkc2ltX2h3X2NmbGFncywgJHNpbV9odywgJHNpbV9od19vYmpzIgorZmkKK2ZpCisKKworZm9yIGFjX2Z1bmMgaW4gdGltZSBjaG1vZCB1dGltZSBmb3JrIGV4ZWN2ZSBleGVjdiBjaG93bgorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzgwMTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzgwNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozODI5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfaGRyIGluIHVuaXN0ZC5oIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB1dGltZS5oIHRpbWUuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM4NTc6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzODYyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozODY3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisjCisjIEVuYWJsZSBjb21tb24KKyMKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY29tbW9uIG9yIC0tZGlzYWJsZS1zaW0tY29tbW9uIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jb21tb24rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jb21tb24iCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKSBzaW1fZ2VuPSItRFdJVEhfQ09NTU9OPTEiOyBtbjEwMzAwX2NvbW1vbj0iV0lUSCI7OworICBubykgIHNpbV9nZW49Ii1EV0lUSF9DT01NT049MCI7IG1uMTAzMDBfY29tbW9uPSJXSVRIT1VUIjs7CisgICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tY29tbW9uIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fZ2VuPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZ2VuIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW1fY29tbW9uID0gJHNpbV9jb21tb24iIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9nZW49Ii1EV0lUSF9DT01NT049MSI7IG1uMTAzMDBfY29tbW9uPSJXSVRIIgorZmkKKworCisKKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCithY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAc2ltX2Vudmlyb25tZW50QCUkc2ltX2Vudmlyb25tZW50JWcKK3MlQHNpbV9hbGlnbm1lbnRAJSRzaW1fYWxpZ25tZW50JWcKK3MlQHNpbV9hc3NlcnRAJSRzaW1fYXNzZXJ0JWcKK3MlQHNpbV9iaXRzaXplQCUkc2ltX2JpdHNpemUlZworcyVAc2ltX2VuZGlhbkAlJHNpbV9lbmRpYW4lZworcyVAc2ltX2hvc3RlbmRpYW5AJSRzaW1faG9zdGVuZGlhbiVnCitzJUBzaW1fZmxvYXRAJSRzaW1fZmxvYXQlZworcyVAc2ltX3NjYWNoZUAlJHNpbV9zY2FjaGUlZworcyVAc2ltX2RlZmF1bHRfbW9kZWxAJSRzaW1fZGVmYXVsdF9tb2RlbCVnCitzJUBzaW1faHdfY2ZsYWdzQCUkc2ltX2h3X2NmbGFncyVnCitzJUBzaW1faHdfb2Jqc0AlJHNpbV9od19vYmpzJWcKK3MlQHNpbV9od0AlJHNpbV9odyVnCitzJUBzaW1faW5saW5lQCUkc2ltX2lubGluZSVnCitzJUBzaW1fcGFja2FnZXNAJSRzaW1fcGFja2FnZXMlZworcyVAc2ltX3JlZ3Bhcm1AJSRzaW1fcmVncGFybSVnCitzJUBzaW1fcmVzZXJ2ZWRfYml0c0AlJHNpbV9yZXNlcnZlZF9iaXRzJWcKK3MlQHNpbV9zbXBAJSRzaW1fc21wJWcKK3MlQHNpbV9zdGRjYWxsQCUkc2ltX3N0ZGNhbGwlZworcyVAc2ltX3hvcl9lbmRpYW5AJSRzaW1feG9yX2VuZGlhbiVnCitzJUBidWlsZF93YXJuaW5nc0AlJGJ1aWxkX3dhcm5pbmdzJWcKK3MlQFNIRUxMQCUkU0hFTEwlZworcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBERUZTQCUkREVGUyVnCitzJUBMREZMQUdTQCUkTERGTEFHUyVnCitzJUBMSUJTQCUkTElCUyVnCitzJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKK3MlQHByZWZpeEAlJHByZWZpeCVnCitzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCitzJUBiaW5kaXJAJSRiaW5kaXIlZworcyVAc2JpbmRpckAlJHNiaW5kaXIlZworcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworcyVAZGF0YWRpckAlJGRhdGFkaXIlZworcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZworcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCitzJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCitzJUBsaWJkaXJAJSRsaWJkaXIlZworcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworcyVAaW5mb2RpckAlJGluZm9kaXIlZworcyVAbWFuZGlyQCUkbWFuZGlyJWcKK3MlQGhvc3RAJSRob3N0JWcKK3MlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKK3MlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCitzJUBob3N0X29zQCUkaG9zdF9vcyVnCitzJUB0YXJnZXRAJSR0YXJnZXQlZworcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKK3MlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKK3MlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKK3MlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCitzJUBidWlsZEAlJGJ1aWxkJWcKK3MlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZworcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKK3MlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCitzJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKK3MlQENDQCUkQ0MlZworcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKK3MlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCitzJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZworcyVASERFRklORVNAJSRIREVGSU5FUyVnCitzJUBBUkAlJEFSJWcKK3MlQFJBTkxJQkAlJFJBTkxJQiVnCitzJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKK3MlQENQUEAlJENQUCVnCitzJUBBTExPQ0FAJSRBTExPQ0ElZworcyVAVVNFX05MU0AlJFVTRV9OTFMlZworcyVATVNHRk1UQCUkTVNHRk1UJWcKK3MlQEdNU0dGTVRAJSRHTVNHRk1UJWcKK3MlQFhHRVRURVhUQCUkWEdFVFRFWFQlZworcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCitzJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKK3MlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCitzJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKK3MlQEdNT0ZJTEVTQCUkR01PRklMRVMlZworcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZworcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCitzJUBJTlRMTElCU0AlJElOVExMSUJTJWcKK3MlQElOVExPQkpTQCUkSU5UTE9CSlMlZworcyVAUE9GSUxFU0AlJFBPRklMRVMlZworcyVAUE9TVUJAJSRQT1NVQiVnCitzJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCitzJUBHVF9OT0AlJEdUX05PJWcKK3MlQEdUX1lFU0AlJEdUX1lFUyVnCitzJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCitzJUBsQCUkbCVnCitzJUBNQUlOVEAlJE1BSU5UJWcKK3MlQHNpbV9ic3dhcEAlJHNpbV9ic3dhcCVnCitzJUBzaW1fY2ZsYWdzQCUkc2ltX2NmbGFncyVnCitzJUBzaW1fZGVidWdAJSRzaW1fZGVidWclZworcyVAc2ltX3N0ZGlvQCUkc2ltX3N0ZGlvJWcKK3MlQHNpbV90cmFjZUAlJHNpbV90cmFjZSVnCitzJUBzaW1fcHJvZmlsZUAlJHNpbV9wcm9maWxlJWcKK3MlQEVYRUVYVEAlJEVYRUVYVCVnCitzJUBzaW1fZ2VuQCUkc2ltX2dlbiVnCitzJUBtbjEwMzAwX2NvbW1vbkAlJG1uMTAzMDBfY29tbW9uJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlLnNpbTpNYWtlZmlsZS5pbiBNYWtlLWNvbW1vbi5zaW06Li4vY29tbW9uL01ha2UtY29tbW9uLmluIC5nZGJpbml0Oi4uL2NvbW1vbi9nZGJpbml0LmluIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KKyAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OworICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKK3MlQElOU1RBTExAJSRJTlNUQUxMJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCisjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgorIworIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCithY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKK2FjX2RDPSdcMycKK2FjX2REPSclZycKKyMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJworYWNfdUM9JyAnCithY191RD0nXDQlZycKKyMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX2VCPSckJVwxI1wyZGVmaW5lXDMnCithY19lQz0nICcKK2FjX2VEPSclZycKKworaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisgIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZpCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICRhY19maWxlCisKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCisKK0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcworIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6CisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgorcm0gLWYgY29uZnRlc3QudmFscworY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgorcy9bXFwmJV0vXFwmL2cKK3MlW1xcJGBdJVxcJiVnCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAorcyVhY19kJWFjX3UlZ3AKK3MlYWNfdSVhY19lJWdwCitFT0YKK3NlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKK3JtIC1mIGNvbmZ0ZXN0LmhkcgorCisjIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCisjIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCisjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KK2NhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgorcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKK0VPRgorCisjIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KKyMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCisKK3JtIC1mIGNvbmZ0ZXN0LnRhaWwKK3doaWxlIDoKK2RvCisgIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKKyAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgorICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCisgICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgorICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKKyAgZWNobyAnQ0VPRgorICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAorICBybSAtZiBjb25mdGVzdC5pbgorICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KKycgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKKyAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCitkb25lCitybSAtZiBjb25mdGVzdC52YWxzCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCisgIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAorICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAorICBybSAtZiBjb25mdGVzdC5pbgorICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKKyAgICBybSAtZiBjb25mdGVzdC5oCisgIGVsc2UKKyAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGZpCisgICAgcm0gLWYgJGFjX2ZpbGUKKyAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCisgIGZpCitmaTsgZG9uZQorCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCithY19zb3VyY2VzPSIkc2ltX2xpbmtfZmlsZXMiCithY19kZXN0cz0iJHNpbV9saW5rX2xpbmtzIgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK3NyY2Rpcj0kYWNfZ2l2ZW5fc3JjZGlyCit3aGlsZSB0ZXN0IC1uICIkYWNfc291cmNlcyI7IGRvCisgIHNldCAkYWNfZGVzdHM7IGFjX2Rlc3Q9JDE7IHNoaWZ0OyBhY19kZXN0cz0kKgorICBzZXQgJGFjX3NvdXJjZXM7IGFjX3NvdXJjZT0kMTsgc2hpZnQ7IGFjX3NvdXJjZXM9JCoKKworICBlY2hvICJsaW5raW5nICRzcmNkaXIvJGFjX3NvdXJjZSB0byAkYWNfZGVzdCIKKworICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfc291cmNlOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkc3JjZGlyLyRhY19zb3VyY2U6IEZpbGUgbm90IGZvdW5kIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKKyAgcm0gLWYgJGFjX2Rlc3QKKworICAjIE1ha2UgcmVsYXRpdmUgc3ltbGlua3MuCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kZXN0X2Rpcj1gZWNobyAkYWNfZGVzdHxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gIiRhY19kZXN0IiAmJiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBkZXN0IGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGVzdF9kaXIiICYmIG1rZGlyICIkYWNfZGVzdF9kaXIiCisgICAgYWNfZGVzdF9kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2Rlc3RfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kZXN0X2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGVzdF9kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGVzdF9kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRzcmNkaXIiIGluCisgIFsvJF0qKSBhY19yZWxfc291cmNlPSIkc3JjZGlyLyRhY19zb3VyY2UiIDs7CisgICopIGFjX3JlbF9zb3VyY2U9IiRhY19kb3RzJHNyY2Rpci8kYWNfc291cmNlIiA7OworICBlc2FjCisKKyAgIyBNYWtlIGEgc3ltbGluayBpZiBwb3NzaWJsZTsgb3RoZXJ3aXNlIHRyeSBhIGhhcmQgbGluay4KKyAgaWYgbG4gLXMgJGFjX3JlbF9zb3VyY2UgJGFjX2Rlc3QgMj4vZGV2L251bGwgfHwKKyAgICBsbiAkc3JjZGlyLyRhY19zb3VyY2UgJGFjX2Rlc3Q7IHRoZW4gOgorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGxpbmsgJGFjX2Rlc3QgdG8gJHNyY2Rpci8kYWNfc291cmNlIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2RvbmUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorY2FzZSAieCRDT05GSUdfRklMRVMiIGluCisgeE1ha2VmaWxlKikKKyAgIGVjaG8gIk1lcmdpbmcgTWFrZWZpbGUuc2ltK01ha2UtY29tbW9uLnNpbSBpbnRvIE1ha2VmaWxlIC4uLiIKKyAgIHJtIC1mIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAgTWFrZWZpbGUKKyAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUFJFXy8sL14jIyBFbmQgQ09NTU9OX1BSRV8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0xLnRtcAorICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QT1NUXy8sL14jIyBFbmQgQ09NTU9OX1BPU1RfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMi50bXAKKyAgIHNlZCAtZSAnL14jIyBDT01NT05fUFJFXy8gciBNYWtlc2ltMS50bXAnIFwKKwktZSAnL14jIyBDT01NT05fUE9TVF8vIHIgTWFrZXNpbTIudG1wJyBcCisJPE1ha2VmaWxlLnNpbSA+TWFrZWZpbGUKKyAgIHJtIC1mIE1ha2VmaWxlLnNpbSBNYWtlLWNvbW1vbi5zaW0gTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcAorICAgOzsKKyBlc2FjCisgY2FzZSAieCRDT05GSUdfSEVBREVSUyIgaW4geGNvbmZpZy5oOmNvbmZpZy5pbikgZWNobyA+IHN0YW1wLWggOzsgZXNhYworCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKworCmRpZmYgLS1naXQgYS9zaW0vbW4xMDMwMC9jb25maWd1cmUuaW4gYi9zaW0vbW4xMDMwMC9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE2MDYwOQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tbjEwMzAwL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDM3IEBACitkbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK3NpbmNsdWRlKC4uL2NvbW1vbi9hY2xvY2FsLm00KQorZG5sIDIuMTIgYm90Y2hlcyBTSEVMTCBzdWJzdGl0dXRpb24KK0FDX1BSRVJFUSgyLjEyLjEpZG5sCitBQ19JTklUKE1ha2VmaWxlLmluKQorCitTSU1fQUNfQ09NTU9OCisKK1NJTV9BQ19PUFRJT05fRU5ESUFOKExJVFRMRV9FTkRJQU4pCitTSU1fQUNfT1BUSU9OX0FMSUdOTUVOVChOT05TVFJJQ1RfQUxJR05NRU5UKQorU0lNX0FDX09QVElPTl9IT1NURU5ESUFOCitTSU1fQUNfT1BUSU9OX1dBUk5JTkdTCitTSU1fQUNfT1BUSU9OX1JFU0VSVkVEX0JJVFMKK1NJTV9BQ19PUFRJT05fQklUU0laRSgzMiwzMSkKK1NJTV9BQ19PUFRJT05fSU5MSU5FKCkKK1NJTV9BQ19PUFRJT05fSEFSRFdBUkUoeWVzLCxtbjEwM2NwdSBtbjEwM2ludCBtbjEwM3RpbSBtbjEwM3NlciBtbjEwM2lvcCkKKworQUNfQ0hFQ0tfRlVOQ1ModGltZSBjaG1vZCB1dGltZSBmb3JrIGV4ZWN2ZSBleGVjdiBjaG93bikKK0FDX0NIRUNLX0hFQURFUlModW5pc3RkLmggc3RkbGliLmggc3RyaW5nLmggc3RyaW5ncy5oIHV0aW1lLmggdGltZS5oKQorCisjCisjIEVuYWJsZSBjb21tb24KKyMKK0FDX0FSR19FTkFCTEUoc2ltLWNvbW1vbiwKK1sgIC0tZW5hYmxlLXNpbS1jb21tb24JCQlFbmFibGUgY29tbW9uIHNpbXVsYXRvcl0sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpIHNpbV9nZW49Ii1EV0lUSF9DT01NT049MSI7IG1uMTAzMDBfY29tbW9uPSJXSVRIIjs7CisgIG5vKSAgc2ltX2dlbj0iLURXSVRIX0NPTU1PTj0wIjsgbW4xMDMwMF9jb21tb249IldJVEhPVVQiOzsKKyAgKikgICBBQ19NU0dfRVJST1IoIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWNvbW1vbiIpOyBzaW1fZ2VuPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZ2VuIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW1fY29tbW9uID0gJHNpbV9jb21tb24iIDY+JjEKK2ZpXSxbc2ltX2dlbj0iLURXSVRIX0NPTU1PTj0xIjsgbW4xMDMwMF9jb21tb249IldJVEgiXSlkbmwKK0FDX1NVQlNUKHNpbV9nZW4pCitBQ19TVUJTVChtbjEwMzAwX2NvbW1vbikKKworU0lNX0FDX09VVFBVVApkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvZHYtbW4xMDNjcHUuYyBiL3NpbS9tbjEwMzAwL2R2LW1uMTAzY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyNDVhMgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tbjEwMzAwL2R2LW1uMTAzY3B1LmMKQEAgLTAsMCArMSw0MzEgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICAgCisgICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICAgIAorICAgICovCisKKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAiaHctbWFpbi5oIgorCisvKiBERVZJQ0UKKworICAgCisgICBtbjEwM2NwdSAtIG1uMTAzMDAgY3B1IHZpcnR1YWwgZGV2aWNlCisKKyAgIAorICAgREVTQ1JJUFRJT04KKworICAgCisgICBJbXBsZW1lbnRzIHRoZSBleHRlcm5hbCBtbjEwMzAwIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGluY2x1ZGVzIHRoZQorICAgZGVsaXZlcnkgb2YgaW50ZXJydXB0cyBnZW5lcmF0ZWQgZnJvbSBvdGhlciBkZXZpY2VzIGFuZCB0aGUKKyAgIGhhbmRsaW5nIG9mIGRldmljZSBzcGVjaWZpYyByZWdpc3RlcnMuCisKKworICAgUFJPUEVSVElFUworICAgCisKKyAgIHJlZyA9IDxhZGRyZXNzPiA8c2l6ZT4KKworICAgU3BlY2lmeSB0aGUgYWRkcmVzcyBvZiB0aGUgbW4xMDMwMCdzIGNvbnRyb2wgcmVnaXN0ZXIgYmxvY2suICBUaGlzCisgICBibG9jayBjb250YWlucyB0aGUgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlcnMuCisKKyAgIFRoZSByZWcgcHJvcGVydHkgdmFsdWUgYDB4MjAwMDAwMDAgMHg0MicgbG9jYXRlcyB0aGUgcmVnaXN0ZXIgYmxvY2sKKyAgIGF0IHRoZSBhZGRyZXNzIHNwZWNpZmllZCBpbiB0aGUgbW4xMDMwMCB1c2VyIGd1aWRlLgorCisKKyAgIFBPUlRTCisKKworICAgcmVzZXQgKGlucHV0KQorCisgICBDdXJyZW50bHkgaWdub3JlZC4KKworCisgICBubWkgKGlucHV0KQorCisgICBEZWxpdmVyIGEgbm9uLW1hc2thYmxlIGludGVycnVwdCB0byB0aGUgcHJvY2Vzc29yLgorCisKKyAgIGxldmVsIChpbnB1dCkKKworICAgTWFza2FibGUgaW50ZXJydXB0IGxldmVsIHBvcnQgcG9ydC4gIFRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcgorICAgbm90aWZpZXMgdGhlIHByb2Nlc3NvciBvZiBhbnkgY2hhbmdlIGluIHRoZSBsZXZlbCBvZiBwZW5kaW5nCisgICByZXF1ZXN0ZWQgaW50ZXJydXB0cyB2aWEgdGhpcyBwb3J0LgorCisKKyAgIGFjayAob3V0cHV0KQorCisgICBPdXRwdXQgc2lnbmFsIGluZGljYXRpbmcgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIGRlbGl2ZXJpbmcgYSBsZXZlbAorICAgaW50ZXJydXB0LiAgVGhlIHZhbHVlIHBhc3NlZCB3aXRoIHRoZSBldmVudCBzcGVjaWZpZXMgdGhlIGxldmVsIG9mCisgICB0aGUgaW50ZXJydXB0IGJlaW5nIGRlbGl2ZXJlZC4KKworCisgICBCVUdTCisKKworICAgV2hlbiBkZWxpdmVyaW5nIGFuIGludGVycnVwdCwgdGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGVyZSBpcyBvbmx5CisgICBvbmUgcHJvY2Vzc29yIChudW1iZXIgMCkuCisKKyAgIFRoaXMgY29kZSBkb2VzIG5vdCBhdHRlbXB0IHRvIGJlIGVmZmljaWVudCBhdCBoYW5kbGluZyBwZW5kaW5nCisgICBpbnRlcnJ1cHRzLiAgSXQgc2ltcGx5IHNjaGVkdWxlcyB0aGUgaW50ZXJydXB0IGRlbGl2ZXJ5IGhhbmRsZXIKKyAgIGV2ZXJ5IGluc3RydWN0aW9uIGN5Y2xlIHVudGlsIGFsbCBwZW5kaW5nIGludGVycnVwdHMgZ28gYXdheS4gIEFuCisgICBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBtaWdodCBtb2RpZnkgaW5zdHJ1Y3Rpb25zIHRoYXQgY2hhbmdlCisgICB0aGUgUFNXIGFuZCBoYXZlIHRoZW0gY2hlY2sgdG8gc2VlIGlmIHRoZSBjaGFuZ2UgbWFrZXMgYW4gaW50ZXJydXB0CisgICBkZWxpdmVyeSBwb3NzaWJsZS4KKworICAgKi8KKworCisvKiBUaGUgaW50ZXJydXB0IHZlY3RvcnMgKi8KKworZW51bSB7IE5SX1ZFQ1RPUlMgPSA3LCB9OworCisKKy8qIFRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciByZWdpc3RlciBhZGRyZXNzIGJsb2NrcyAqLworCitzdHJ1Y3QgbW4xMDNjcHVfYmxvY2sgeworICB1bnNpZ25lZF93b3JkIGJhc2U7CisgIHVuc2lnbmVkX3dvcmQgYm91bmQ7Cit9OworCisKK3N0cnVjdCBtbjEwM2NwdSB7CisgIHN0cnVjdCBtbjEwM2NwdV9ibG9jayBibG9jazsKKyAgc3RydWN0IGh3X2V2ZW50ICpwZW5kaW5nX2hhbmRsZXI7CisgIGludCBwZW5kaW5nX2xldmVsOworICBpbnQgcGVuZGluZ19ubWk7CisgIGludCBwZW5kaW5nX3Jlc2V0OworICAvKiB0aGUgdmlzaWJsZSByZWdpc3RlcnMgKi8KKyAgdW5zaWduZWQxNiBpbnRlcnJ1cHRfdmVjdG9yW05SX1ZFQ1RPUlNdOworICB1bnNpZ25lZDE2IGludGVybmFsX21lbW9yeV9jb250cm9sOworICB1bnNpZ25lZDE2IGNwdV9tb2RlOworfTsKKworCisKKy8qIGlucHV0IHBvcnQgSUQncyAqLyAKKworZW51bSB7CisgIFJFU0VUX1BPUlQsCisgIE5NSV9QT1JULAorICBMRVZFTF9QT1JULAorfTsKKworCisvKiBvdXRwdXQgcG9ydCBJRCdzICovCisKK2VudW0geworICBBQ0tfUE9SVCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdfcG9ydF9kZXNjcmlwdG9yIG1uMTAzY3B1X3BvcnRzW10gPSB7CisKKyAgLyogaW50ZXJydXB0IGlucHV0cyAqLworICB7ICJyZXNldCIsIFJFU0VUX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgIm5taSIsIE5NSV9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAorICB7ICJsZXZlbCIsIExFVkVMX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisKKyAgLyogaW50ZXJydXB0IGFjayAobGF0Y2gpIG91dHB1dCBmcm9tIGNwdSAqLworICB7ICJhY2siLCBBQ0tfUE9SVCwgMCwgb3V0cHV0X3BvcnQsIH0sCisKKyAgeyBOVUxMLCB9LAorfTsKKworCisvKiBGaW5pc2ggb2ZmIHRoZSBwYXJ0aWFsbHkgY3JlYXRlZCBodyBkZXZpY2UuICBBdHRhY2ggb3VyIGxvY2FsCisgICBjYWxsYmFja3MuICBXaXJlIHVwIG91ciBwb3J0IG5hbWVzIGV0YyAqLworCitzdGF0aWMgaHdfaW9fcmVhZF9idWZmZXJfbWV0aG9kIG1uMTAzY3B1X2lvX3JlYWRfYnVmZmVyOworc3RhdGljIGh3X2lvX3dyaXRlX2J1ZmZlcl9tZXRob2QgbW4xMDNjcHVfaW9fd3JpdGVfYnVmZmVyOworc3RhdGljIGh3X3BvcnRfZXZlbnRfbWV0aG9kIG1uMTAzY3B1X3BvcnRfZXZlbnQ7CisKK3N0YXRpYyB2b2lkCithdHRhY2hfbW4xMDNjcHVfcmVncyAoc3RydWN0IGh3ICptZSwKKwkJICAgICAgc3RydWN0IG1uMTAzY3B1ICpjb250cm9sbGVyKQoreworICB1bnNpZ25lZF93b3JkIGF0dGFjaF9hZGRyZXNzOworICBpbnQgYXR0YWNoX3NwYWNlOworICB1bnNpZ25lZCBhdHRhY2hfc2l6ZTsKKyAgcmVnX3Byb3BlcnR5X3NwZWMgcmVnOworICBpZiAoaHdfZmluZF9wcm9wZXJ0eSAobWUsICJyZWciKSA9PSBOVUxMKQorICAgIGh3X2Fib3J0IChtZSwgIk1pc3NpbmcgXCJyZWdcIiBwcm9wZXJ0eSIpOworICBpZiAoIWh3X2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5IChtZSwgInJlZyIsIDAsICZyZWcpKQorICAgIGh3X2Fib3J0IChtZSwgIlwicmVnXCIgcHJvcGVydHkgbXVzdCBjb250YWluIHRocmVlIGFkZHIvc2l6ZSBlbnRyaWVzIik7CisgIGh3X3VuaXRfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyAoaHdfcGFyZW50IChtZSksCisJCQkJICAgICAmcmVnLmFkZHJlc3MsCisJCQkJICAgICAmYXR0YWNoX3NwYWNlLAorCQkJCSAgICAgJmF0dGFjaF9hZGRyZXNzLAorCQkJCSAgICAgbWUpOworICBjb250cm9sbGVyLT5ibG9jay5iYXNlID0gYXR0YWNoX2FkZHJlc3M7CisgIGh3X3VuaXRfc2l6ZV90b19hdHRhY2hfc2l6ZSAoaHdfcGFyZW50IChtZSksCisJCQkgICAgICAgJnJlZy5zaXplLAorCQkJICAgICAgICZhdHRhY2hfc2l6ZSwgbWUpOworICBjb250cm9sbGVyLT5ibG9jay5ib3VuZCA9IGF0dGFjaF9hZGRyZXNzICsgKGF0dGFjaF9zaXplIC0gMSk7CisgIGlmICgoY29udHJvbGxlci0+YmxvY2suYmFzZSAmIDMpICE9IDApCisgICAgaHdfYWJvcnQgKG1lLCAiY3B1IHJlZ2lzdGVyIGJsb2NrIG11c3QgYmUgNCBieXRlIGFsaWduZWQiKTsKKyAgaHdfYXR0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLAorCQkgICAgIDAsCisJCSAgICAgYXR0YWNoX3NwYWNlLCBhdHRhY2hfYWRkcmVzcywgYXR0YWNoX3NpemUsCisJCSAgICAgbWUpOworfQorCisKK3N0YXRpYyB2b2lkCittbjEwM2NwdV9maW5pc2ggKHN0cnVjdCBodyAqbWUpCit7CisgIHN0cnVjdCBtbjEwM2NwdSAqY29udHJvbGxlcjsKKworICBjb250cm9sbGVyID0gSFdfWkFMTE9DIChtZSwgc3RydWN0IG1uMTAzY3B1KTsKKyAgc2V0X2h3X2RhdGEgKG1lLCBjb250cm9sbGVyKTsKKyAgc2V0X2h3X2lvX3JlYWRfYnVmZmVyIChtZSwgbW4xMDNjcHVfaW9fcmVhZF9idWZmZXIpOworICBzZXRfaHdfaW9fd3JpdGVfYnVmZmVyIChtZSwgbW4xMDNjcHVfaW9fd3JpdGVfYnVmZmVyKTsKKyAgc2V0X2h3X3BvcnRzIChtZSwgbW4xMDNjcHVfcG9ydHMpOworICBzZXRfaHdfcG9ydF9ldmVudCAobWUsIG1uMTAzY3B1X3BvcnRfZXZlbnQpOworCisgIC8qIEF0dGFjaCBvdXJzZWxmIHRvIG91ciBwYXJlbnQgYnVzICovCisgIGF0dGFjaF9tbjEwM2NwdV9yZWdzIChtZSwgY29udHJvbGxlcik7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgcmVhZC1vbmx5IHJlZ2lzdGVycyAqLworICBjb250cm9sbGVyLT5wZW5kaW5nX2xldmVsID0gNzsgLyogRklYTUUgKi8KKyAgLyogLi4uICovCit9CisKKworCisvKiBBbiBldmVudCBhcnJpdmVzIG9uIGFuIGludGVycnVwdCBwb3J0ICovCisKK3N0YXRpYyB2b2lkCitkZWxpdmVyX21uMTAzY3B1X2ludGVycnVwdCAoc3RydWN0IGh3ICptZSwKKwkJCSAgICB2b2lkICpkYXRhKQoreworICBzdHJ1Y3QgbW4xMDNjcHUgKmNvbnRyb2xsZXIgPSBod19kYXRhIChtZSk7CisgIFNJTV9ERVNDIHNpbXVsYXRvciA9IGh3X3N5c3RlbSAobWUpOworICBzaW1fY3B1ICpjcHUgPSBTVEFURV9DUFUgKHNpbXVsYXRvciwgMCk7CisKKyAgaWYgKGNvbnRyb2xsZXItPnBlbmRpbmdfcmVzZXQpCisgICAgeworICAgICAgY29udHJvbGxlci0+cGVuZGluZ19yZXNldCA9IDA7CisgICAgICAvKiBuZWVkIHRvIGNsZWFyIGFsbCByZWdpc3RlcnMgZXQuYWwhICovCisgICAgICBIV19UUkFDRSAoKG1lLCAiUmVzZXQhIikpOworICAgICAgaHdfYWJvcnQgKG1lLCAiUmVzZXQhIik7CisgICAgfQorICBlbHNlIGlmIChjb250cm9sbGVyLT5wZW5kaW5nX25taSkKKyAgICB7CisgICAgICBjb250cm9sbGVyLT5wZW5kaW5nX25taSA9IDA7CisgICAgICBzdG9yZV93b3JkIChTUCAtIDQsIENJQV9HRVQgKGNwdSkpOworICAgICAgc3RvcmVfaGFsZiAoU1AgLSA4LCBQU1cpOworICAgICAgUFNXICY9IH5QU1dfSUU7CisgICAgICBTUCA9IFNQIC0gODsKKyAgICAgIENJQV9TRVQgKGNwdSwgMHg0MDAwMDAwOCk7CisgICAgICBIV19UUkFDRSAoKG1lLCAibm1pIHBjPTB4JTA4bHggcHN3PTB4JTA0eCBzcD0weCUwOGx4IiwKKwkJIChsb25nKSBDSUFfR0VUIChjcHUpLCAodW5zaWduZWQpIFBTVywgKGxvbmcpIFNQKSk7CisgICAgfQorICBlbHNlIGlmICgoY29udHJvbGxlci0+cGVuZGluZ19sZXZlbCA8IEVYVFJBQ1RfUFNXX0xNKQorCSAgICYmIChQU1cgJiBQU1dfSUUpKQorICAgIHsKKyAgICAgIC8qIERvbid0IGNsZWFyIHBlbmRpbmcgbGV2ZWwuICBSZXF1ZXN0IGNvbnRpbnVlcyB0byBiZSBwZW5kaW5nCisgICAgICAgICB1bnRpbCB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgY2xlYXJzL2NoYW5nZXMgaXQgKi8KKyAgICAgIHN0b3JlX3dvcmQgKFNQIC0gNCwgQ0lBX0dFVCAoY3B1KSk7CisgICAgICBzdG9yZV9oYWxmIChTUCAtIDgsIFBTVyk7CisgICAgICBQU1cgJj0gflBTV19JRTsKKyAgICAgIFBTVyAmPSB+UFNXX0xNOworICAgICAgUFNXIHw9IElOU0VSVF9QU1dfTE0gKGNvbnRyb2xsZXItPnBlbmRpbmdfbGV2ZWwpOworICAgICAgU1AgPSBTUCAtIDg7CisgICAgICBDSUFfU0VUIChjcHUsIDB4NDAwMDAwMDAgKyBjb250cm9sbGVyLT5pbnRlcnJ1cHRfdmVjdG9yW2NvbnRyb2xsZXItPnBlbmRpbmdfbGV2ZWxdKTsKKyAgICAgIEhXX1RSQUNFICgobWUsICJwb3J0LW91dCBhY2sgJWQiLCBjb250cm9sbGVyLT5wZW5kaW5nX2xldmVsKSk7CisgICAgICBod19wb3J0X2V2ZW50IChtZSwgQUNLX1BPUlQsIGNvbnRyb2xsZXItPnBlbmRpbmdfbGV2ZWwpOworICAgICAgSFdfVFJBQ0UgKChtZSwgImludCBsZXZlbD0lZCBwYz0weCUwOGx4IHBzdz0weCUwNHggc3A9MHglMDhseCIsCisJCSBjb250cm9sbGVyLT5wZW5kaW5nX2xldmVsLAorCQkgKGxvbmcpIENJQV9HRVQgKGNwdSksICh1bnNpZ25lZCkgUFNXLCAobG9uZykgU1ApKTsKKyAgICB9CisKKyAgaWYgKGNvbnRyb2xsZXItPnBlbmRpbmdfbGV2ZWwgPCA3KSAvKiBGSVhNRSAqLworICAgIHsKKyAgICAgIC8qIEFzIGxvbmcgYXMgdGhlcmUgaXMgdGhlIHBvdGVudGlhbCBuZWVkIHRvIGRlbGl2ZXIgYW4KKwkgaW50ZXJydXB0IHdlIGtlZXAgcmVzY2hlZHVsaW5nIHRoaXMgcm91dGluZS4gKi8KKyAgICAgIGlmIChjb250cm9sbGVyLT5wZW5kaW5nX2hhbmRsZXIgIT0gTlVMTCkKKwljb250cm9sbGVyLT5wZW5kaW5nX2hhbmRsZXIgPQorCSAgaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUgKG1lLCAxLCBkZWxpdmVyX21uMTAzY3B1X2ludGVycnVwdCwgTlVMTCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogRG9uJ3QgYm90aGVyIHJlLXNjaGVkdWxpbmcgdGhlIGludGVycnVwdCBoYW5kbGVyIGFzIHRoZXJlIGlzCisgICAgICAgICBub3RoaW5nIHRvIGRlbGl2ZXIgKi8KKyAgICAgIGNvbnRyb2xsZXItPnBlbmRpbmdfaGFuZGxlciA9IE5VTEw7CisgICAgfQorCit9CisKKworc3RhdGljIHZvaWQKK21uMTAzY3B1X3BvcnRfZXZlbnQgKHN0cnVjdCBodyAqbWUsCisJCSAgICAgaW50IG15X3BvcnQsCisJCSAgICAgc3RydWN0IGh3ICpzb3VyY2UsCisJCSAgICAgaW50IHNvdXJjZV9wb3J0LAorCQkgICAgIGludCBsZXZlbCkKK3sKKyAgc3RydWN0IG1uMTAzY3B1ICpjb250cm9sbGVyID0gaHdfZGF0YSAobWUpOworCisgIC8qIFNjaGVkdWxlIG91ciBldmVudCBoYW5kbGVyICpub3cqICovCisgIGlmIChjb250cm9sbGVyLT5wZW5kaW5nX2hhbmRsZXIgPT0gTlVMTCkKKyAgICBjb250cm9sbGVyLT5wZW5kaW5nX2hhbmRsZXIgPQorICAgICAgaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUgKG1lLCAwLCBkZWxpdmVyX21uMTAzY3B1X2ludGVycnVwdCwgTlVMTCk7CisKKyAgc3dpdGNoIChteV9wb3J0KQorICAgIHsKKyAgICAgIAorICAgIGNhc2UgUkVTRVRfUE9SVDoKKyAgICAgIGNvbnRyb2xsZXItPnBlbmRpbmdfcmVzZXQgPSAxOworICAgICAgSFdfVFJBQ0UgKChtZSwgInBvcnQtaW4gcmVzZXQiKSk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgTk1JX1BPUlQ6CisgICAgICBjb250cm9sbGVyLT5wZW5kaW5nX25taSA9IDE7CisgICAgICBIV19UUkFDRSAoKG1lLCAicG9ydC1pbiBubWkiKSk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgTEVWRUxfUE9SVDoKKyAgICAgIGNvbnRyb2xsZXItPnBlbmRpbmdfbGV2ZWwgPSBsZXZlbDsKKyAgICAgIEhXX1RSQUNFICgobWUsICJwb3J0LWluIGxldmVsPSVkIiwgbGV2ZWwpKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgZGVmYXVsdDoKKyAgICAgIGh3X2Fib3J0IChtZSwgImJhZCBzd2l0Y2giKTsKKyAgICAgIGJyZWFrOworCisgICAgfQorfQorCisKKy8qIFJlYWQvd3JpdGUgdG8gYSBDUFUgcmVnaXN0ZXIgKi8KKworZW51bSBtbjEwM2NwdV9yZWdzIHsKKyAgSU5WQUxJRF9SRUcsCisgIElWUjBfUkVHLAorICBJVlIxX1JFRywKKyAgSVZSMl9SRUcsCisgIElWUjNfUkVHLAorICBJVlI0X1JFRywKKyAgSVZSNV9SRUcsCisgIElWUjZfUkVHLAorICBJTUNSX1JFRywKKyAgQ1BVTV9SRUcsCit9OworCitzdGF0aWMgZW51bSBtbjEwM2NwdV9yZWdzCitkZWNvZGVfbW4xMDNjcHVfYWRkciAoc3RydWN0IGh3ICptZSwKKwkJICAgICAgc3RydWN0IG1uMTAzY3B1ICpjb250cm9sbGVyLAorCQkgICAgICB1bnNpZ25lZF93b3JkIGJhc2UpCit7CisgIHN3aXRjaCAoYmFzZSAtIGNvbnRyb2xsZXItPmJsb2NrLmJhc2UpCisgICAgeworICAgIGNhc2UgMHgwMDA6IHJldHVybiBJVlIwX1JFRzsKKyAgICBjYXNlIDB4MDA0OiByZXR1cm4gSVZSMV9SRUc7CisgICAgY2FzZSAweDAwODogcmV0dXJuIElWUjJfUkVHOworICAgIGNhc2UgMHgwMGM6IHJldHVybiBJVlIzX1JFRzsKKyAgICBjYXNlIDB4MDEwOiByZXR1cm4gSVZSNF9SRUc7CisgICAgY2FzZSAweDAxNDogcmV0dXJuIElWUjVfUkVHOworICAgIGNhc2UgMHgwMTg6IHJldHVybiBJVlI2X1JFRzsKKyAgICBjYXNlIDB4MDIwOiByZXR1cm4gSU1DUl9SRUc7CisgICAgY2FzZSAweDA0MDogcmV0dXJuIENQVU1fUkVHOworICAgIGRlZmF1bHQ6IHJldHVybiBJTlZBTElEX1JFRzsKKyAgICB9Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorbW4xMDNjcHVfaW9fcmVhZF9idWZmZXIgKHN0cnVjdCBodyAqbWUsCisJCQkgdm9pZCAqZGVzdCwKKwkJCSBpbnQgc3BhY2UsCisJCQkgdW5zaWduZWRfd29yZCBiYXNlLAorCQkJIHVuc2lnbmVkIG5yX2J5dGVzKQoreworICBzdHJ1Y3QgbW4xMDNjcHUgKmNvbnRyb2xsZXIgPSBod19kYXRhIChtZSk7CisgIHVuc2lnbmVkMTYgdmFsID0gMDsKKyAgZW51bSBtbjEwM2NwdV9yZWdzIHJlZyA9IGRlY29kZV9tbjEwM2NwdV9hZGRyIChtZSwgY29udHJvbGxlciwgYmFzZSk7CisKKyAgc3dpdGNoIChyZWcpCisgICAgeworICAgIGNhc2UgSVZSMF9SRUc6CisgICAgY2FzZSBJVlIxX1JFRzoKKyAgICBjYXNlIElWUjJfUkVHOgorICAgIGNhc2UgSVZSM19SRUc6CisgICAgY2FzZSBJVlI0X1JFRzoKKyAgICBjYXNlIElWUjVfUkVHOgorICAgIGNhc2UgSVZSNl9SRUc6CisgICAgICB2YWwgPSBjb250cm9sbGVyLT5pbnRlcnJ1cHRfdmVjdG9yW3JlZyAtIElWUjBfUkVHXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSU1DUl9SRUc6CisgICAgICB2YWwgPSBjb250cm9sbGVyLT5pbnRlcm5hbF9tZW1vcnlfY29udHJvbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BVTV9SRUc6CisgICAgICB2YWwgPSBjb250cm9sbGVyLT5jcHVfbW9kZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvKiBqdXN0IGlnbm9yZSB0aGUgcmVhZCAqLworICAgICAgYnJlYWs7CisgICAgfQorCisgIGlmIChucl9ieXRlcyA9PSAyKQorICAgICoodW5zaWduZWQxNiopIGRlc3QgPSBIMkxFXzIgKHZhbCk7CisKKyAgcmV0dXJuIG5yX2J5dGVzOworfSAgICAgCisKK3N0YXRpYyB1bnNpZ25lZAorbW4xMDNjcHVfaW9fd3JpdGVfYnVmZmVyIChzdHJ1Y3QgaHcgKm1lLAorCQkJICBjb25zdCB2b2lkICpzb3VyY2UsCisJCQkgIGludCBzcGFjZSwKKwkJCSAgdW5zaWduZWRfd29yZCBiYXNlLAorCQkJICB1bnNpZ25lZCBucl9ieXRlcykKK3sKKyAgc3RydWN0IG1uMTAzY3B1ICpjb250cm9sbGVyID0gaHdfZGF0YSAobWUpOworICB1bnNpZ25lZDE2IHZhbDsKKyAgZW51bSBtbjEwM2NwdV9yZWdzIHJlZzsKKworICBpZiAobnJfYnl0ZXMgIT0gMikKKyAgICBod19hYm9ydCAobWUsICJtdXN0IGJlIHR3byBieXRlIHdyaXRlIik7CisKKyAgcmVnID0gZGVjb2RlX21uMTAzY3B1X2FkZHIgKG1lLCBjb250cm9sbGVyLCBiYXNlKTsKKyAgdmFsID0gTEUySF8yICgqICh1bnNpZ25lZDE2ICopIHNvdXJjZSk7CisKKyAgc3dpdGNoIChyZWcpCisgICAgeworICAgIGNhc2UgSVZSMF9SRUc6CisgICAgY2FzZSBJVlIxX1JFRzoKKyAgICBjYXNlIElWUjJfUkVHOgorICAgIGNhc2UgSVZSM19SRUc6CisgICAgY2FzZSBJVlI0X1JFRzoKKyAgICBjYXNlIElWUjVfUkVHOgorICAgIGNhc2UgSVZSNl9SRUc6CisgICAgICBjb250cm9sbGVyLT5pbnRlcnJ1cHRfdmVjdG9yW3JlZyAtIElWUjBfUkVHXSA9IHZhbDsKKyAgICAgIEhXX1RSQUNFICgobWUsICJpdnIlZCA9IDB4JTA0bHgiLCByZWcgLSBJVlIwX1JFRywgKGxvbmcpIHZhbCkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIGp1c3QgaWdub3JlIHRoZSB3cml0ZSAqLworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBucl9ieXRlczsKK30gICAgIAorCisKK2NvbnN0IHN0cnVjdCBod19kZXNjcmlwdG9yIGR2X21uMTAzY3B1X2Rlc2NyaXB0b3JbXSA9IHsKKyAgeyAibW4xMDNjcHUiLCBtbjEwM2NwdV9maW5pc2gsIH0sCisgIHsgTlVMTCB9LAorfTsKZGlmZiAtLWdpdCBhL3NpbS9tbjEwMzAwL2R2LW1uMTAzaW50LmMgYi9zaW0vbW4xMDMwMC9kdi1tbjEwM2ludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOTgyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbW4xMDMwMC9kdi1tbjEwM2ludC5jCkBAIC0wLDAgKzEsODI0IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorICAgIAorICAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgorICAgIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgICAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAgICAKKyAgICAqLworCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2luY2x1ZGUgImh3LW1haW4uaCIKKyNpbmNsdWRlICJzaW0taHcuaCIKKworLyogREVWSUNFCisKKyAgIAorICAgbW4xMDNpbnQgLSBtbjEwMzAwMiBpbnRlcnJ1cHQgY29udHJvbGxlcgorCisgICAKKyAgIERFU0NSSVBUSU9OCisKKyAgIAorICAgSW1wbGVtZW50cyB0aGUgbW4xMDMwMDIgaW50ZXJydXB0IGNvbnRyb2xsZXIgZGVzY3JpYmVkIGluIHRoZQorICAgbW4xMDMwMDIgdXNlciBndWlkZS4KKworCisgICBQUk9QRVJUSUVTCisgICAKKworICAgcmVnID0gPGljci1hZHI+IDxpY3Itc2l6PiA8aWFnci1hZHI+IDxpYWRyLXNpej4gPGV4dG1kLWFkcj4gPGV4dG1kLXNpej4KKworICAgU3BlY2lmeSB0aGUgYWRkcmVzcyBvZiB0aGUgSUNSICh0b3RhbCBvZiAzMCByZWdpc3RlcnMpLCBJQUdSIGFuZAorICAgRVhUTUQgcmVnaXN0ZXJzICh3aXRoaW4gdGhlIHBhcmVudCBidXMpLgorCisgICBUaGUgcmVnIHByb3BlcnR5IHZhbHVlIGAweDM0MDAwMTAwIDB4N0MgMHgzNDAwMDIwMCAweDggMHgzNDAwMjgwCisgICAweDgnIGxvY2F0ZXMgdGhlIGludGVycnVwdCBjb250cm9sbGVyIGF0IHRoZSBhZGRyZXNzZXMgc3BlY2lmaWVkIGluCisgICB0aGUgbW4xMDMwMDIgaW50ZXJydXB0IGNvbnRyb2xsZXIgdXNlciBndWlkZS4KKworCisgICBQT1JUUworCisKKyAgIG5taSAob3V0cHV0KQorCisgICBOb24tbWFza2FibGUgaW50ZXJydXB0IG91dHB1dCBwb3J0LiAgQW4gZXZlbnQgb24gdGhpcyBvdXRwdXQgcG9ydHMKKyAgIGluZGljYXRlcyBhIE5NSSByZXF1ZXN0IGZyb20gdGhlIGludGVycnVwdCBjb250cm9sbGVyLiAgVGhlIHZhbHVlCisgICBhdHRhY2hlZCB0byB0aGUgZXZlbnQgc2hvdWxkIGJlIGlnbm9yZWQuCisKKworICAgbGV2ZWwgKG91dHB1dCkKKworICAgTWFza2FibGUgaW50ZXJydXB0IGxldmVsIG91dHB1dCBwb3J0LiAgQW4gZXZlbnQgb24gdGhpcyBvdXRwdXQgcG9ydAorICAgaW5kaWNhdGVzIGEgbWFza2FibGUgaW50ZXJydXB0IHJlcXVlc3QgYXQgdGhlIHNwZWNpZmllZCBsZXZlbC4gIFRoZQorICAgZXZlbnQgdmFsdWUgZGVmaW5lcyB0aGUgbGV2ZWwgYmVpbmcgcmVxdWVzdGVkLgorCisgICBUaGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgd2lsbCBnZW5lcmF0ZSBhbiBldmVudCBvbiB0aGlzIHBvcnQKKyAgIHdoZW5ldmVyIHRoZXJlIGlzIGEgY2hhbmdlIHRvIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgaW50ZXJydXB0CisgICBjb250cm9sbGVyLgorCisKKyAgIGFjayAoaW5wdXQpCisKKyAgIFNpZ25hbCBmcm9tIHByb2Nlc3NvciBpbmRpY2F0aW5nIHRoYXQgYSBtYXNrYWJsZSBpbnRlcnJ1cHQgaGFzIGJlZW4KKyAgIGFjY2VwdGVkIGFuZCB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgc2hvdWxkIGxhdGNoIHRoZSBJQUdSIHdpdGgKKyAgIHZhbHVlIG9mIHRoZSBjdXJyZW50IGhpZ2hlc3QgcHJpb3JpdHkgaW50ZXJydXB0aW5nIGdyb3VwLgorCisgICBUaGUgZXZlbnQgdmFsdWUgaXMgdGhlIGludGVycnVwdCBsZXZlbCBiZWluZyBhY2NlcHRlZCBieSB0aGUKKyAgIHByb2Nlc3Nvci4gIEl0IHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIG1vc3QgcmVjZW50IExFVkVMIHNlbnQKKyAgIHRvIHRoZSBwcm9jZXNzb3IgZnJvbSB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIuCisKKworICAgaW50WzAuLjEwMF0gKGlucHV0KQorCisgICBMZXZlbCBvciBlZGdlIHRyaWdnZXJlZCBpbnRlcnJ1cHQgaW5wdXQgcG9ydC4gIEVhY2ggb2YgdGhlIDMwCisgICBncm91cHMgKDAuLjMwKSBjYW4gaGF2ZSB1cCB0byA0ICgwLi4zKSBpbnRlcnJ1cHQgaW5wdXRzLiAgVGhlCisgICBpbnRlcnByZXRhdGlvbiBvZiBhIHBvcnQgZXZlbnQvdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUKKyAgIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0IGdyb3VwLgorCisgICBGb3IgY29udmVuaWVuY2UsIG51bWVyb3VzIGFsaWFzZXMgdG8gdGhlc2UgaW50ZXJydXB0IGlucHV0cyBhcmUKKyAgIHByb3ZpZGVkLgorCisKKyAgIEJVR1MKKworCisgICBGb3IgZWRnZSB0cmlnZ2VyZWQgaW50ZXJydXB0cywgdGhlIGludGVycnVwdCBjb250cm9sbGVyIGRvZXMgbm90CisgICBkaWZmZXJlbnRpYXRlIGJldHdlZW4gUE9TSVRJVkUgKHJpc2luZykgYW5kIE5FR0FUSVZFIChmYWxsaW5nKQorICAgZWRnZXMuICBJbnN0ZWFkIGFueSBpbnB1dCBwb3J0IGV2ZW50IGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4KKyAgIGludGVycnVwdCB0cmlnZ2VyLgorCisgICBGb3IgbGV2ZWwgc2Vuc2l0aXZlIGludGVycnVwdHMsIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBpZ25vcmVzCisgICBhY3RpdmUgSElHSC9MT1cgc2V0dGluZ3MgYW5kIGluc3RlYWQgYWx3YXlzIGludGVycHJldHMgYSBub256ZXJvCisgICBwb3J0IHZhbHVlIGFzIGFuIGludGVycnVwdCBhc3NlcnRpb24gYW5kIGEgemVybyBwb3J0IHZhbHVlIGFzIGEKKyAgIG5lZ2F0aW9uLgorCisgICAqLworCisKKy8qIFRoZSBpbnRlcnJ1cHQgZ3JvdXBzIC0gbnVtYmVyZWQgYWNjb3JkaW5nIHRvIG1uMTAzMDAyIGNvbnZlbnRpb24gKi8KKworZW51bSBtbjEwM2ludF90cmlnZ2VyIHsKKyAgQUNUSVZFX0xPVywKKyAgQUNUSVZFX0hJR0gsCisgIFBPU0lUSVZFX0VER0UsCisgIE5FR0FUSVZFX0VER0UsCit9OworCitlbnVtIG1uMTAzaW50X3R5cGUgeworICBOTUlfR1JPVVAsCisgIExFVkVMX0dST1VQLAorfTsKKworc3RydWN0IG1uMTAzaW50X2dyb3VwIHsKKyAgaW50IGdpZDsKKyAgaW50IGxldmVsOworICB1bnNpZ25lZCBlbmFibGU7CisgIHVuc2lnbmVkIHJlcXVlc3Q7CisgIHVuc2lnbmVkIGlucHV0OworICBlbnVtIG1uMTAzaW50X3RyaWdnZXIgdHJpZ2dlcjsKKyAgZW51bSBtbjEwM2ludF90eXBlIHR5cGU7Cit9OworCitlbnVtIHsKKyAgRklSU1RfTk1JX0dST1VQID0gMCwKKyAgTEFTVF9OTUlfR1JPVVAgPSAxLAorICBGSVJTVF9MRVZFTF9HUk9VUCA9IDIsCisgIExBU1RfTEVWRUxfR1JPVVAgPSAzMCwKKyAgTlJfR1JPVVBTLAorfTsKKworZW51bSB7CisgIExPV0VTVF9MRVZFTCA9IDcsCit9OworCisvKiBUaGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgcmVnaXN0ZXIgYWRkcmVzcyBibG9ja3MgKi8KKworc3RydWN0IG1uMTAzaW50X2Jsb2NrIHsKKyAgdW5zaWduZWRfd29yZCBiYXNlOworICB1bnNpZ25lZF93b3JkIGJvdW5kOworfTsKKworZW51bSB7IElDUl9CTE9DSywgSUFHUl9CTE9DSywgRVhUTURfQkxPQ0ssIE5SX0JMT0NLUyB9OworCisKK3N0cnVjdCBtbjEwM2ludCB7CisgIHN0cnVjdCBtbjEwM2ludF9ibG9jayBibG9ja1tOUl9CTE9DS1NdOworICBzdHJ1Y3QgbW4xMDNpbnRfZ3JvdXAgZ3JvdXBbTlJfR1JPVVBTXTsKKyAgdW5zaWduZWQgaW50ZXJydXB0X2FjY2VwdGVkX2dyb3VwOworfTsKKworCisKKy8qIG91dHB1dCBwb3J0IElEJ3MgKi8gCisKK2VudW0geworICBOTUlfUE9SVCwKKyAgTEVWRUxfUE9SVCwKK307CisKKworLyogaW5wdXQgcG9ydCBJRCdzICovCisKK2VudW0geworICBHMF9QT1JUID0gMCwKKyAgRzFfUE9SVCA9IDQsCisgIEcyX1BPUlQgPSA4LAorICBHM19QT1JUID0gMTIsCisgIEc0X1BPUlQgPSAxNiwKKyAgRzVfUE9SVCA9IDIwLAorICBHNl9QT1JUID0gMjQsCisgIEc3X1BPUlQgPSAyOCwKKyAgRzhfUE9SVCA9IDMyLAorICBHOV9QT1JUID0gMzYsCisgIEcxMF9QT1JUID0gNDAsCisgIEcxMV9QT1JUID0gNDQsCisgIEcxMl9QT1JUID0gNDgsCisgIEcxM19QT1JUID0gNTIsCisgIEcxNF9QT1JUID0gNTYsCisgIEcxNV9QT1JUID0gNjAsCisgIEcxNl9QT1JUID0gNjQsCisgIEcxN19QT1JUID0gNjgsCisgIEcxOF9QT1JUID0gNzIsCisgIEcxOV9QT1JUID0gNzYsCisgIEcyMF9QT1JUID0gODAsCisgIEcyMV9QT1JUID0gODQsCisgIEcyMl9QT1JUID0gODgsCisgIEcyM19QT1JUID0gOTIsCisgIElSUTBfUE9SVCA9IEcyM19QT1JULAorICBHMjRfUE9SVCA9IDk2LAorICBHMjVfUE9SVCA9IDEwMCwKKyAgRzI2X1BPUlQgPSAxMDQsCisgIEcyN19QT1JUID0gMTA4LAorICBJUlE0X1BPUlQgPSBHMjdfUE9SVCwKKyAgRzI4X1BPUlQgPSAxMTIsCisgIEcyOV9QT1JUID0gMTE2LAorICBHMzBfUE9SVCA9IDEyMCwKKyAgTlJfR19QT1JUUyA9IDEyNCwKKyAgQUNLX1BPUlQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3X3BvcnRfZGVzY3JpcHRvciBtbjEwM2ludF9wb3J0c1tdID0geworCisgIC8qIGludGVycnVwdCBvdXRwdXRzICovCisKKyAgeyAibm1pIiwgTk1JX1BPUlQsIDAsIG91dHB1dF9wb3J0LCB9LAorICB7ICJsZXZlbCIsIExFVkVMX1BPUlQsIDAsIG91dHB1dF9wb3J0LCB9LAorCisgIC8qIGludGVycnVwdCBhY2sgKGxhdGNoKSBpbnB1dCBmcm9tIGNwdSAqLworCisgIHsgImFjayIsIEFDS19QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAorCisgIC8qIGludGVycnVwdCBpbnB1dHMgKGFzIG5hbWVzKSAqLworCisgIHsgIm5taXJxIiwgRzBfUE9SVCArIDAsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgIndhdGNoZG9nIiwgRzBfUE9SVCArIDEsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgInN5c2VyciIsIEcwX1BPUlQgKyAyLCAwLCBpbnB1dF9wb3J0LCB9LAorCisgIHsgInRpbWVyLTAtdW5kZXJmbG93IiwgRzJfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKyAgeyAidGltZXItMS11bmRlcmZsb3ciLCBHM19QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAorICB7ICJ0aW1lci0yLXVuZGVyZmxvdyIsIEc0X1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgInRpbWVyLTMtdW5kZXJmbG93IiwgRzVfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKyAgeyAidGltZXItNC11bmRlcmZsb3ciLCBHNl9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAorICB7ICJ0aW1lci01LXVuZGVyZmxvdyIsIEc3X1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgInRpbWVyLTYtdW5kZXJmbG93IiwgRzhfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKworICB7ICJ0aW1lci02LWNvbXBhcmUtYSIsIEc5X1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgInRpbWVyLTYtY29tcGFyZS1iIiwgRzEwX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisKKyAgeyAiZG1hLTAtZW5kIiwgRzEyX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgImRtYS0xLWVuZCIsIEcxM19QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAorICB7ICJkbWEtMi1lbmQiLCBHMTRfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKyAgeyAiZG1hLTMtZW5kIiwgRzE1X1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisKKyAgeyAic2VyaWFsLTAtcmVjZWl2ZSIsICBHMTZfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKyAgeyAic2VyaWFsLTAtdHJhbnNtaXQiLCBHMTdfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKworICB7ICJzZXJpYWwtMS1yZWNlaXZlIiwgIEcxOF9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAorICB7ICJzZXJpYWwtMS10cmFuc21pdCIsIEcxOV9QT1JULCAwLCBpbnB1dF9wb3J0LCB9LAorCisgIHsgInNlcmlhbC0yLXJlY2VpdmUiLCAgRzIwX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisgIHsgInNlcmlhbC0yLXRyYW5zbWl0IiwgRzIxX1BPUlQsIDAsIGlucHV0X3BvcnQsIH0sCisKKyAgeyAiaXJxLTAiLCBHMjNfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKyAgeyAiaXJxLTEiLCBHMjRfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKyAgeyAiaXJxLTIiLCBHMjVfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKyAgeyAiaXJxLTMiLCBHMjZfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKyAgeyAiaXJxLTQiLCBHMjdfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKyAgeyAiaXJxLTUiLCBHMjhfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKyAgeyAiaXJxLTYiLCBHMjlfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKyAgeyAiaXJxLTciLCBHMzBfUE9SVCwgMCwgaW5wdXRfcG9ydCwgfSwKKworICAvKiBpbnRlcnJ1cHQgaW5wdXRzIChhcyBnZW5lcmljIG51bWJlcnMpICovCisKKyAgeyAiaW50IiwgMCwgTlJfR19QT1JUUywgaW5wdXRfcG9ydCwgfSwKKworICB7IE5VTEwsIH0sCit9OworCisKKy8qIE1hY3JvcyBmb3IgZXh0cmFjdGluZy9yZXN0b3JpbmcgdGhlIHZhcmlvdXMgcmVnaXN0ZXIgYml0cyAqLworCisjZGVmaW5lIEVYVFJBQ1RfSUQoWCkgKExTRVhUUkFDVEVEOCAoKFgpLCAzLCAwKSkKKyNkZWZpbmUgSU5TRVJUX0lEKFgpIChMU0lOU0VSVEVEOCAoKFgpLCAzLCAwKSkKKworI2RlZmluZSBFWFRSQUNUX0lSKFgpIChMU0VYVFJBQ1RFRDggKChYKSwgNywgNCkpCisjZGVmaW5lIElOU0VSVF9JUihYKSAoTFNJTlNFUlRFRDggKChYKSwgNywgNCkpCisKKyNkZWZpbmUgRVhUUkFDVF9JRShYKSAoTFNFWFRSQUNURUQ4ICgoWCksIDMsIDApKQorI2RlZmluZSBJTlNFUlRfSUUoWCkgKExTSU5TRVJURUQ4ICgoWCksIDMsIDApKQorCisjZGVmaW5lIEVYVFJBQ1RfTFYoWCkgKExTRVhUUkFDVEVEOCAoKFgpLCA2LCA0KSkKKyNkZWZpbmUgSU5TRVJUX0xWKFgpIChMU0lOU0VSVEVEOCAoKFgpLCA2LCA0KSkKKworCisKKy8qIEZpbmlzaCBvZmYgdGhlIHBhcnRpYWxseSBjcmVhdGVkIGh3IGRldmljZS4gIEF0dGFjaCBvdXIgbG9jYWwKKyAgIGNhbGxiYWNrcy4gIFdpcmUgdXAgb3VyIHBvcnQgbmFtZXMgZXRjICovCisKK3N0YXRpYyBod19pb19yZWFkX2J1ZmZlcl9tZXRob2QgbW4xMDNpbnRfaW9fcmVhZF9idWZmZXI7CitzdGF0aWMgaHdfaW9fd3JpdGVfYnVmZmVyX21ldGhvZCBtbjEwM2ludF9pb193cml0ZV9idWZmZXI7CitzdGF0aWMgaHdfcG9ydF9ldmVudF9tZXRob2QgbW4xMDNpbnRfcG9ydF9ldmVudDsKK3N0YXRpYyBod19pb2N0bF9tZXRob2QgbW4xMDNpbnRfaW9jdGw7CisKKworCitzdGF0aWMgdm9pZAorYXR0YWNoX21uMTAzaW50X3JlZ3MgKHN0cnVjdCBodyAqbWUsCisJCSAgICAgIHN0cnVjdCBtbjEwM2ludCAqY29udHJvbGxlcikKK3sKKyAgaW50IGk7CisgIGlmIChod19maW5kX3Byb3BlcnR5IChtZSwgInJlZyIpID09IE5VTEwpCisgICAgaHdfYWJvcnQgKG1lLCAiTWlzc2luZyBcInJlZ1wiIHByb3BlcnR5Iik7CisgIGZvciAoaSA9IDA7IGkgPCBOUl9CTE9DS1M7IGkrKykKKyAgICB7CisgICAgICB1bnNpZ25lZF93b3JkIGF0dGFjaF9hZGRyZXNzOworICAgICAgaW50IGF0dGFjaF9zcGFjZTsKKyAgICAgIHVuc2lnbmVkIGF0dGFjaF9zaXplOworICAgICAgcmVnX3Byb3BlcnR5X3NwZWMgcmVnOworICAgICAgaWYgKCFod19maW5kX3JlZ19hcnJheV9wcm9wZXJ0eSAobWUsICJyZWciLCBpLCAmcmVnKSkKKwlod19hYm9ydCAobWUsICJcInJlZ1wiIHByb3BlcnR5IG11c3QgY29udGFpbiB0aHJlZSBhZGRyL3NpemUgZW50cmllcyIpOworICAgICAgaHdfdW5pdF9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzIChod19wYXJlbnQgKG1lKSwKKwkJCQkJICZyZWcuYWRkcmVzcywKKwkJCQkJICZhdHRhY2hfc3BhY2UsCisJCQkJCSAmYXR0YWNoX2FkZHJlc3MsCisJCQkJCSBtZSk7CisgICAgICBjb250cm9sbGVyLT5ibG9ja1tpXS5iYXNlID0gYXR0YWNoX2FkZHJlc3M7CisgICAgICBod191bml0X3NpemVfdG9fYXR0YWNoX3NpemUgKGh3X3BhcmVudCAobWUpLAorCQkJCSAgICZyZWcuc2l6ZSwKKwkJCQkgICAmYXR0YWNoX3NpemUsIG1lKTsKKyAgICAgIGNvbnRyb2xsZXItPmJsb2NrW2ldLmJvdW5kID0gYXR0YWNoX2FkZHJlc3MgKyAoYXR0YWNoX3NpemUgLSAxKTsKKyAgICAgIGh3X2F0dGFjaF9hZGRyZXNzIChod19wYXJlbnQgKG1lKSwKKwkJCSAwLAorCQkJIGF0dGFjaF9zcGFjZSwgYXR0YWNoX2FkZHJlc3MsIGF0dGFjaF9zaXplLAorCQkJIG1lKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCittbjEwM2ludF9maW5pc2ggKHN0cnVjdCBodyAqbWUpCit7CisgIGludCBnaWQ7CisgIHN0cnVjdCBtbjEwM2ludCAqY29udHJvbGxlcjsKKworICBjb250cm9sbGVyID0gSFdfWkFMTE9DIChtZSwgc3RydWN0IG1uMTAzaW50KTsKKyAgc2V0X2h3X2RhdGEgKG1lLCBjb250cm9sbGVyKTsKKyAgc2V0X2h3X2lvX3JlYWRfYnVmZmVyIChtZSwgbW4xMDNpbnRfaW9fcmVhZF9idWZmZXIpOworICBzZXRfaHdfaW9fd3JpdGVfYnVmZmVyIChtZSwgbW4xMDNpbnRfaW9fd3JpdGVfYnVmZmVyKTsKKyAgc2V0X2h3X3BvcnRzIChtZSwgbW4xMDNpbnRfcG9ydHMpOworICBzZXRfaHdfcG9ydF9ldmVudCAobWUsIG1uMTAzaW50X3BvcnRfZXZlbnQpOworICBtZS0+dG9faW9jdGwgPSBtbjEwM2ludF9pb2N0bDsKKworICAvKiBBdHRhY2ggb3Vyc2VsZiB0byBvdXIgcGFyZW50IGJ1cyAqLworICBhdHRhY2hfbW4xMDNpbnRfcmVncyAobWUsIGNvbnRyb2xsZXIpOworCisgIC8qIEluaXRpYWxpemUgYWxsIHRoZSBncm91cHMgYWNjb3JkaW5nIHRvIHRoZWlyIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLworICBmb3IgKGdpZCA9IDA7IGdpZCA8IE5SX0dST1VQUzsgZ2lkKyspCisgICAgeworICAgICAgc3RydWN0IG1uMTAzaW50X2dyb3VwICpncm91cCA9ICZjb250cm9sbGVyLT5ncm91cFtnaWRdOworICAgICAgZ3JvdXAtPnRyaWdnZXIgPSBORUdBVElWRV9FREdFOworICAgICAgZ3JvdXAtPmdpZCA9IGdpZDsKKyAgICAgIGlmIChGSVJTVF9OTUlfR1JPVVAgPD0gZ2lkICYmIGdpZCA8PSBMQVNUX05NSV9HUk9VUCkKKwl7CisJICBncm91cC0+ZW5hYmxlID0gMHhmOworCSAgZ3JvdXAtPnR5cGUgPSBOTUlfR1JPVVA7CisJfQorICAgICAgZWxzZSBpZiAoRklSU1RfTEVWRUxfR1JPVVAgPD0gZ2lkICYmIGdpZCA8PSBMQVNUX0xFVkVMX0dST1VQKQorCXsKKwkgIGdyb3VwLT5lbmFibGUgPSAweDA7CisJICBncm91cC0+dHlwZSA9IExFVkVMX0dST1VQOworCX0KKyAgICAgIGVsc2UKKwlod19hYm9ydCAobWUsICJpbnRlcm5hbCBlcnJvciAtIHVua25vd24gZ3JvdXAgaWQiKTsKKyAgICB9Cit9CisKKworCisvKiBQZXJmb3JtIHRoZSBuYXN0eSB3b3JrIG9mIGZpZ3VyaW5nIG91dCB3aGljaCBvZiB0aGUgaW50ZXJydXB0CisgICBncm91cHMgc2hvdWxkIGhhdmUgaXRzIGludGVycnVwdCBkZWxpdmVyZWQuICovCisKK3N0YXRpYyBpbnQKK2ZpbmRfaGlnaGVzdF9pbnRlcnJ1cHRfZ3JvdXAgKHN0cnVjdCBodyAqbWUsCisJCQkgICAgICBzdHJ1Y3QgbW4xMDNpbnQgKmNvbnRyb2xsZXIpCit7CisgIGludCBnaWQ7CisgIGludCBzZWxlY3RlZDsKKworICAvKiBGSVJTVF9OTUlfR1JPVVAgKGdyb3VwIHplcm8pIGlzIHVzZWQgYXMgYSBzcGVjaWFsIGRlZmF1bHQgdmFsdWUKKyAgICAgd2hlbiBzZWFyY2hpbmcgZm9yIGFuIGludGVycnVwdCBncm91cC4qLworICBzZWxlY3RlZCA9IEZJUlNUX05NSV9HUk9VUDsgCisgIGNvbnRyb2xsZXItPmdyb3VwW0ZJUlNUX05NSV9HUk9VUF0ubGV2ZWwgPSA3OworICAKKyAgZm9yIChnaWQgPSBGSVJTVF9MRVZFTF9HUk9VUDsgZ2lkIDw9IExBU1RfTEVWRUxfR1JPVVA7IGdpZCsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBtbjEwM2ludF9ncm91cCAqZ3JvdXAgPSAmY29udHJvbGxlci0+Z3JvdXBbZ2lkXTsKKyAgICAgIGlmICgoZ3JvdXAtPnJlcXVlc3QgJiBncm91cC0+ZW5hYmxlKSAhPSAwKQorCXsKKwkgIC8qIFJlbWVtYmVyLCBsb3dlciBsZXZlbCwgaGlnaGVyIHByaW9yaXR5LiAgKi8KKwkgIGlmIChncm91cC0+bGV2ZWwgPCBjb250cm9sbGVyLT5ncm91cFtzZWxlY3RlZF0ubGV2ZWwpCisJICAgIHsKKwkgICAgICBzZWxlY3RlZCA9IGdpZDsKKwkgICAgfQorCX0KKyAgICB9CisgIHJldHVybiBzZWxlY3RlZDsKK30KKworCisvKiBOb3RpZnkgdGhlIHByb2Nlc3NvciBvZiBhbiBpbnRlcnJ1cHQgbGV2ZWwgdXBkYXRlICovCisKK3N0YXRpYyB2b2lkCitwdXNoX2ludGVycnVwdF9sZXZlbCAoc3RydWN0IGh3ICptZSwKKwkJICAgICAgc3RydWN0IG1uMTAzaW50ICpjb250cm9sbGVyKQoreworICBpbnQgc2VsZWN0ZWQgPSBmaW5kX2hpZ2hlc3RfaW50ZXJydXB0X2dyb3VwIChtZSwgY29udHJvbGxlcik7CisgIGludCBsZXZlbCA9IGNvbnRyb2xsZXItPmdyb3VwW3NlbGVjdGVkXS5sZXZlbDsKKyAgSFdfVFJBQ0UgKChtZSwgInBvcnQtb3V0IC0gc2VsZWN0ZWQ9JWQgbGV2ZWw9JWQiLCBzZWxlY3RlZCwgbGV2ZWwpKTsKKyAgaHdfcG9ydF9ldmVudCAobWUsIExFVkVMX1BPUlQsIGxldmVsKTsKK30KKworCisvKiBBbiBldmVudCBhcnJpdmVzIG9uIGFuIGludGVycnVwdCBwb3J0ICovCisKK3N0YXRpYyB2b2lkCittbjEwM2ludF9wb3J0X2V2ZW50IChzdHJ1Y3QgaHcgKm1lLAorCQkgICAgIGludCBteV9wb3J0LAorCQkgICAgIHN0cnVjdCBodyAqc291cmNlLAorCQkgICAgIGludCBzb3VyY2VfcG9ydCwKKwkJICAgICBpbnQgbGV2ZWwpCit7CisgIHN0cnVjdCBtbjEwM2ludCAqY29udHJvbGxlciA9IGh3X2RhdGEgKG1lKTsKKworICBzd2l0Y2ggKG15X3BvcnQpCisgICAgeworCisgICAgY2FzZSBBQ0tfUE9SVDoKKyAgICAgIHsKKwlpbnQgc2VsZWN0ZWQgPSBmaW5kX2hpZ2hlc3RfaW50ZXJydXB0X2dyb3VwIChtZSwgY29udHJvbGxlcik7CisJaWYgKGNvbnRyb2xsZXItPmdyb3VwW3NlbGVjdGVkXS5sZXZlbCAhPSBsZXZlbCkKKwkgIGh3X2Fib3J0IChtZSwgImJvdGNoZWQgbGV2ZWwgc3luY2hyb25pc2F0aW9uIik7CisJY29udHJvbGxlci0+aW50ZXJydXB0X2FjY2VwdGVkX2dyb3VwID0gc2VsZWN0ZWQ7CQorCUhXX1RSQUNFICgobWUsICJwb3J0LWV2ZW50IHBvcnQ9YWNrIGxldmVsPSVkIC0gc2VsZWN0ZWQ9JWQiLAorCQkgICBsZXZlbCwgc2VsZWN0ZWQpKTsKKwlicmVhazsKKyAgICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICB7CisJaW50IGdpZDsKKwlpbnQgaWlkOworCXN0cnVjdCBtbjEwM2ludF9ncm91cCAqZ3JvdXA7CisJdW5zaWduZWQgaW50ZXJydXB0OworCWlmIChteV9wb3J0ID4gTlJfR19QT1JUUykKKwkgIGh3X2Fib3J0IChtZSwgIkV2ZW50IG9uIHVua25vd24gcG9ydCAlZCIsIG15X3BvcnQpOworCisJLyogbWFwIHRoZSBwb3J0IG9udG8gYW4gaW50ZXJydXB0IGdyb3VwICovCisJZ2lkID0gKG15X3BvcnQgJSBOUl9HX1BPUlRTKSAvIDQ7CisJZ3JvdXAgPSAmY29udHJvbGxlci0+Z3JvdXBbZ2lkXTsKKwlpaWQgPSAobXlfcG9ydCAlIDQpOworCWludGVycnVwdCA9IDEgPDwgaWlkOworCisJLyogdXBkYXRlIG91ciBjYWNoZWQgaW5wdXQgKi8KKwlpZiAobGV2ZWwpCisJICBncm91cC0+aW5wdXQgfD0gaW50ZXJydXB0OworCWVsc2UKKwkgIGdyb3VwLT5pbnB1dCAmPSB+aW50ZXJydXB0OworCisJLyogdXBkYXRlIHRoZSByZXF1ZXN0IGJpdHMgKi8KKwlzd2l0Y2ggKGdyb3VwLT50cmlnZ2VyKQorCSAgeworCSAgY2FzZSBBQ1RJVkVfTE9XOgorCSAgY2FzZSBBQ1RJVkVfSElHSDoKKwkgICAgaWYgKGxldmVsKQorCSAgICAgIGdyb3VwLT5yZXF1ZXN0IHw9IGludGVycnVwdDsKKwkgICAgYnJlYWs7CisJICBjYXNlIE5FR0FUSVZFX0VER0U6CisJICBjYXNlIFBPU0lUSVZFX0VER0U6CisJICAgIGdyb3VwLT5yZXF1ZXN0IHw9IGludGVycnVwdDsKKwkgIH0KKworCS8qIGZvcmNlIGEgY29ycmVzcG9uZGluZyBvdXRwdXQgKi8KKwlzd2l0Y2ggKGdyb3VwLT50eXBlKQorCSAgeworCisJICBjYXNlIE5NSV9HUk9VUDoKKwkgICAgeworCSAgICAgIC8qIGZvciBOTUkncyB0aGUgZXZlbnQgaXMgdGhlIHRyaWdnZXIgKi8KKwkgICAgICBIV19UUkFDRSAoKG1lLCAicG9ydC1pbiBwb3J0PSVkIGdyb3VwPSVkIGludGVycnVwdD0lZCAtIE5NSSIsCisJCQkgbXlfcG9ydCwgZ2lkLCBpaWQpKTsKKwkgICAgICBpZiAoKGdyb3VwLT5yZXF1ZXN0ICYgZ3JvdXAtPmVuYWJsZSkgIT0gMCkKKwkJeworCQkgIEhXX1RSQUNFICgobWUsICJwb3J0LW91dCBOTUkiKSk7CisJCSAgaHdfcG9ydF9ldmVudCAobWUsIE5NSV9QT1JULCAxKTsKKwkJfQorCSAgICAgIGJyZWFrOworCSAgICB9CisJICAgICAgCisJICBjYXNlIExFVkVMX0dST1VQOgorCSAgICB7CisJICAgICAgLyogaWYgYW4gaW50ZXJydXB0IGlzIG5vdyBwZW5kaW5nICovCisJICAgICAgSFdfVFJBQ0UgKChtZSwgInBvcnQtaW4gcG9ydD0lZCBncm91cD0lZCBpbnRlcnJ1cHQ9JWQgLSBJTlQiLAorCQkJIG15X3BvcnQsIGdpZCwgaWlkKSk7CisJICAgICAgcHVzaF9pbnRlcnJ1cHRfbGV2ZWwgKG1lLCBjb250cm9sbGVyKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgfQorCWJyZWFrOworICAgICAgfQorCisgICAgfQorfQorCisvKiBSZWFkL3dyaXRlIHRvIHRvIGFuIElDUiAoZ3JvdXAgY29udHJvbCByZWdpc3RlcikgKi8KKworc3RhdGljIHN0cnVjdCBtbjEwM2ludF9ncm91cCAqCitkZWNvZGVfZ3JvdXAgKHN0cnVjdCBodyAqbWUsCisJICAgICAgc3RydWN0IG1uMTAzaW50ICpjb250cm9sbGVyLAorCSAgICAgIHVuc2lnbmVkX3dvcmQgYmFzZSwKKwkgICAgICB1bnNpZ25lZF93b3JkICpvZmZzZXQpCit7CisgIGludCBnaWQgPSAoYmFzZSAvIDQpICUgTlJfR1JPVVBTOworICAqb2Zmc2V0ID0gKGJhc2UgJSA0KTsKKyAgcmV0dXJuICZjb250cm9sbGVyLT5ncm91cFtnaWRdOworfQorCitzdGF0aWMgdW5zaWduZWQ4CityZWFkX2ljciAoc3RydWN0IGh3ICptZSwKKwkgIHN0cnVjdCBtbjEwM2ludCAqY29udHJvbGxlciwKKwkgIHVuc2lnbmVkX3dvcmQgYmFzZSkKK3sKKyAgdW5zaWduZWRfd29yZCBvZmZzZXQ7CisgIHN0cnVjdCBtbjEwM2ludF9ncm91cCAqZ3JvdXAgPSBkZWNvZGVfZ3JvdXAgKG1lLCBjb250cm9sbGVyLCBiYXNlLCAmb2Zmc2V0KTsKKyAgdW5zaWduZWQ4IHZhbCA9IDA7CisgIHN3aXRjaCAoZ3JvdXAtPnR5cGUpCisgICAgeworCisgICAgY2FzZSBOTUlfR1JPVVA6CisgICAgICBzd2l0Y2ggKG9mZnNldCkKKwl7CisJY2FzZSAwOgorCSAgdmFsID0gSU5TRVJUX0lEIChncm91cC0+cmVxdWVzdCk7CisJICBIV19UUkFDRSAoKG1lLCAicmVhZC1pY3IgZ3JvdXA9JWQ6MCBubWkgMHglMDJ4IiwKKwkJICAgICBncm91cC0+Z2lkLCB2YWwpKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTEVWRUxfR1JPVVA6CisgICAgICBzd2l0Y2ggKG9mZnNldCkKKwl7CisJY2FzZSAwOgorCSAgdmFsID0gKElOU0VSVF9JUiAoZ3JvdXAtPnJlcXVlc3QpCisJCSB8IElOU0VSVF9JRCAoZ3JvdXAtPnJlcXVlc3QgJiBncm91cC0+ZW5hYmxlKSk7CisJICBIV19UUkFDRSAoKG1lLCAicmVhZC1pY3IgZ3JvdXA9JWQ6MCBsZXZlbCAweCUwMngiLAorCQkgICAgIGdyb3VwLT5naWQsIHZhbCkpOworCSAgYnJlYWs7CisJY2FzZSAxOgorCSAgdmFsID0gKElOU0VSVF9MViAoZ3JvdXAtPmxldmVsKQorCQkgfCBJTlNFUlRfSUUgKGdyb3VwLT5lbmFibGUpKTsKKwkgIEhXX1RSQUNFICgobWUsICJyZWFkLWljciBsZXZlbC0lZDoxIGxldmVsIDB4JTAyeCIsCisJCSAgICAgZ3JvdXAtPmdpZCwgdmFsKSk7CisJICBicmVhazsKKwl9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKworICAgIH0KKworICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfaWNyIChzdHJ1Y3QgaHcgKm1lLAorCSAgIHN0cnVjdCBtbjEwM2ludCAqY29udHJvbGxlciwKKwkgICB1bnNpZ25lZF93b3JkIGJhc2UsCisJICAgdW5zaWduZWQ4IHZhbCkKK3sKKyAgdW5zaWduZWRfd29yZCBvZmZzZXQ7CisgIHN0cnVjdCBtbjEwM2ludF9ncm91cCAqZ3JvdXAgPSBkZWNvZGVfZ3JvdXAgKG1lLCBjb250cm9sbGVyLCBiYXNlLCAmb2Zmc2V0KTsKKyAgc3dpdGNoIChncm91cC0+dHlwZSkKKyAgICB7CisKKyAgICBjYXNlIE5NSV9HUk9VUDoKKyAgICAgIHN3aXRjaCAob2Zmc2V0KQorCXsKKwljYXNlIDA6CisJICBIV19UUkFDRSAoKG1lLCAid3JpdGUtaWNyIGdyb3VwPSVkOjAgbm1pIDB4JTAyeCIsCisJCSAgICAgZ3JvdXAtPmdpZCwgdmFsKSk7CisJICBncm91cC0+cmVxdWVzdCAmPSB+RVhUUkFDVF9JRCAodmFsKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTEVWRUxfR1JPVVA6CisgICAgICBzd2l0Y2ggKG9mZnNldCkKKwl7CisJY2FzZSAwOiAvKiByZXF1ZXN0L2RldGVjdCAqLworCSAgLyogQ2xlYXIgYW55IElEIGJpdHMgYW5kIHRoZW4gc2V0IHRoZW0gYWNjb3JkaW5nIHRvIElSICovCisJICBIV19UUkFDRSAoKG1lLCAid3JpdGUtaWNyIGdyb3VwPSVkOjAgbGV2ZWwgMHglMDJ4ICV4OiV4OiV4IiwKKwkJICAgICBncm91cC0+Z2lkLCB2YWwsCisJCSAgICAgZ3JvdXAtPnJlcXVlc3QsIEVYVFJBQ1RfSVIgKHZhbCksIEVYVFJBQ1RfSUQgKHZhbCkpKTsKKwkgIGdyb3VwLT5yZXF1ZXN0ID0KKwkgICAgKChFWFRSQUNUX0lSICh2YWwpICYgRVhUUkFDVF9JRCAodmFsKSkKKwkgICAgIHwgKEVYVFJBQ1RfSVIgKHZhbCkgJiBncm91cC0+cmVxdWVzdCkKKwkgICAgIHwgKH5FWFRSQUNUX0lSICh2YWwpICYgfkVYVFJBQ1RfSUQgKHZhbCkgJiBncm91cC0+cmVxdWVzdCkpOworCSAgYnJlYWs7CisJY2FzZSAxOiAvKiBsZXZlbC9lbmFibGUgKi8KKwkgIEhXX1RSQUNFICgobWUsICJ3cml0ZS1pY3IgZ3JvdXA9JWQ6MSBsZXZlbCAweCUwMngiLAorCQkgICAgIGdyb3VwLT5naWQsIHZhbCkpOworCSAgZ3JvdXAtPmxldmVsID0gRVhUUkFDVF9MViAodmFsKTsKKwkgIGdyb3VwLT5lbmFibGUgPSBFWFRSQUNUX0lFICh2YWwpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIC8qIGlnbm9yZSAqLworCSAgYnJlYWs7CisJfQorICAgICAgcHVzaF9pbnRlcnJ1cHRfbGV2ZWwgKG1lLCBjb250cm9sbGVyKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworCisgICAgfQorfQorCisKKy8qIFJlYWQgdGhlIElBR1IgKEludGVycnVwdCBhY2NlcHRlZCBncm91cCByZWdpc3RlcikgKi8KKworc3RhdGljIHVuc2lnbmVkOAorcmVhZF9pYWdyIChzdHJ1Y3QgaHcgKm1lLAorCSAgIHN0cnVjdCBtbjEwM2ludCAqY29udHJvbGxlciwKKwkgICB1bnNpZ25lZF93b3JkIG9mZnNldCkKK3sKKyAgdW5zaWduZWQ4IHZhbDsKKyAgc3dpdGNoIChvZmZzZXQpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIHsKKwlpZiAoIShjb250cm9sbGVyLT5ncm91cFtjb250cm9sbGVyLT5pbnRlcnJ1cHRfYWNjZXB0ZWRfZ3JvdXBdLnJlcXVlc3QKKwkgICAgICAmIGNvbnRyb2xsZXItPmdyb3VwW2NvbnRyb2xsZXItPmludGVycnVwdF9hY2NlcHRlZF9ncm91cF0uZW5hYmxlKSkKKwkgIHsKKwkgICAgLyogb29wcywgbG9zdCB0aGUgcmVxdWVzdCAqLworCSAgICB2YWwgPSAwOworCSAgICBIV19UUkFDRSAoKG1lLCAicmVhZC1pYWdyOjAgbG9zdC0wIikpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgdmFsID0gKGNvbnRyb2xsZXItPmludGVycnVwdF9hY2NlcHRlZF9ncm91cCA8PCAyKTsKKwkgICAgSFdfVFJBQ0UgKChtZSwgInJlYWQtaWFncjowICVkIiwgKGludCkgdmFsKSk7CisJICB9CisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAxOgorICAgICAgdmFsID0gMDsKKyAgICAgIEhXX1RSQUNFICgobWUsICJyZWFkLWlhZ3I6MSAlZCIsIChpbnQpIHZhbCkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHZhbCA9IDA7CisgICAgICBIV19UUkFDRSAoKG1lLCAicmVhZC1pYWdyIDB4JTA4bHggYmFkIG9mZnNldCIsIChsb25nKSBvZmZzZXQpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIHZhbDsKK30KKworCisvKiBSZWFkcy93cml0ZXMgdG8gdGhlIEVYVE1EIChleHRlcm5hbCBpbnRlcnJ1cHQgdHJpZ2dlciBjb25maWd1cmF0aW9uCisgICByZWdpc3RlcikgKi8KKworc3RhdGljIHN0cnVjdCBtbjEwM2ludF9ncm91cCAqCitleHRlcm5hbF9ncm91cCAoc3RydWN0IG1uMTAzaW50ICpjb250cm9sbGVyLAorCQl1bnNpZ25lZF93b3JkIG9mZnNldCkKK3sKKyAgc3dpdGNoIChvZmZzZXQpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiAmY29udHJvbGxlci0+Z3JvdXBbSVJRMF9QT1JULzRdOworICAgIGNhc2UgMToKKyAgICAgIHJldHVybiAmY29udHJvbGxlci0+Z3JvdXBbSVJRNF9QT1JULzRdOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyB1bnNpZ25lZDgKK3JlYWRfZXh0bWQgKHN0cnVjdCBodyAqbWUsCisJICAgIHN0cnVjdCBtbjEwM2ludCAqY29udHJvbGxlciwKKwkgICAgdW5zaWduZWRfd29yZCBvZmZzZXQpCit7CisgIGludCBnaWQ7CisgIHVuc2lnbmVkOCB2YWwgPSAwOworICBzdHJ1Y3QgbW4xMDNpbnRfZ3JvdXAgKmdyb3VwID0gZXh0ZXJuYWxfZ3JvdXAgKGNvbnRyb2xsZXIsIG9mZnNldCk7CisgIGlmIChncm91cCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZvciAoZ2lkID0gMDsgZ2lkIDwgNDsgZ2lkKyspCisJeworCSAgdmFsIHw9IChncm91cFtnaWRdLnRyaWdnZXIgPDwgKGdpZCAqIDIpKTsKKwl9CisgICAgfQorICBIV19UUkFDRSAoKG1lLCAicmVhZC1leHRtZCAweCUwMmx4IiwgKGxvbmcpIHZhbCkpOworICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfZXh0bWQgKHN0cnVjdCBodyAqbWUsCisJICAgICBzdHJ1Y3QgbW4xMDNpbnQgKmNvbnRyb2xsZXIsCisJICAgICB1bnNpZ25lZF93b3JkIG9mZnNldCwKKwkgICAgIHVuc2lnbmVkOCB2YWwpCit7CisgIGludCBnaWQ7CisgIHN0cnVjdCBtbjEwM2ludF9ncm91cCAqZ3JvdXAgPSBleHRlcm5hbF9ncm91cCAoY29udHJvbGxlciwgb2Zmc2V0KTsKKyAgaWYgKGdyb3VwICE9IE5VTEwpCisgICAgeworICAgICAgZm9yIChnaWQgPSAwOyBnaWQgPCA0OyBnaWQrKykKKwl7CisJICBncm91cFtnaWRdLnRyaWdnZXIgPSAodmFsID4+IChnaWQgKiAyKSkgJiAweDM7CisJICAvKiBNQVlCRTogaW50ZXJydXB0cyBhbHJlYWR5IHBlbmRpbmc/ICovCisJfQorICAgIH0KKyAgSFdfVFJBQ0UgKChtZSwgIndyaXRlLWV4dG1kIDB4JTAybHgiLCAobG9uZykgdmFsKSk7Cit9CisKKworLyogZ2VuZXJpYyByZWFkL3dyaXRlICovCisKK3N0YXRpYyBpbnQKK2RlY29kZV9hZGRyIChzdHJ1Y3QgaHcgKm1lLAorCSAgICAgc3RydWN0IG1uMTAzaW50ICpjb250cm9sbGVyLAorCSAgICAgdW5zaWduZWRfd29yZCBhZGRyZXNzLAorCSAgICAgdW5zaWduZWRfd29yZCAqb2Zmc2V0KQoreworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IE5SX0JMT0NLUzsgaSsrKQorICAgIHsKKyAgICAgIGlmIChhZGRyZXNzID49IGNvbnRyb2xsZXItPmJsb2NrW2ldLmJhc2UKKwkgICYmIGFkZHJlc3MgPD0gY29udHJvbGxlci0+YmxvY2tbaV0uYm91bmQpCisJeworCSAgKm9mZnNldCA9IGFkZHJlc3MgLSBjb250cm9sbGVyLT5ibG9ja1tpXS5iYXNlOworCSAgcmV0dXJuIGk7CisJfQorICAgIH0KKyAgaHdfYWJvcnQgKG1lLCAiYmFkIGFkZHJlc3MiKTsKKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgdW5zaWduZWQKK21uMTAzaW50X2lvX3JlYWRfYnVmZmVyIChzdHJ1Y3QgaHcgKm1lLAorCQkJIHZvaWQgKmRlc3QsCisJCQkgaW50IHNwYWNlLAorCQkJIHVuc2lnbmVkX3dvcmQgYmFzZSwKKwkJCSB1bnNpZ25lZCBucl9ieXRlcykKK3sKKyAgc3RydWN0IG1uMTAzaW50ICpjb250cm9sbGVyID0gaHdfZGF0YSAobWUpOworICB1bnNpZ25lZDggKmJ1ZiA9IGRlc3Q7CisgIHVuc2lnbmVkIGJ5dGU7CisgIC8qIEhXX1RSQUNFICgobWUsICJyZWFkIDB4JTA4bHggJWQiLCAobG9uZykgYmFzZSwgKGludCkgbnJfYnl0ZXMpKTsgKi8KKyAgZm9yIChieXRlID0gMDsgYnl0ZSA8IG5yX2J5dGVzOyBieXRlKyspCisgICAgeworICAgICAgdW5zaWduZWRfd29yZCBhZGRyZXNzID0gYmFzZSArIGJ5dGU7CisgICAgICB1bnNpZ25lZF93b3JkIG9mZnNldDsKKyAgICAgIHN3aXRjaCAoZGVjb2RlX2FkZHIgKG1lLCBjb250cm9sbGVyLCBhZGRyZXNzLCAmb2Zmc2V0KSkKKwl7CisJY2FzZSBJQ1JfQkxPQ0s6CisJICBidWZbYnl0ZV0gPSByZWFkX2ljciAobWUsIGNvbnRyb2xsZXIsIG9mZnNldCk7CisJICBicmVhazsKKwljYXNlIElBR1JfQkxPQ0s6CisJICBidWZbYnl0ZV0gPSByZWFkX2lhZ3IgKG1lLCBjb250cm9sbGVyLCBvZmZzZXQpOworCSAgYnJlYWs7CisJY2FzZSBFWFRNRF9CTE9DSzoKKwkgIGJ1ZltieXRlXSA9IHJlYWRfZXh0bWQgKG1lLCBjb250cm9sbGVyLCBvZmZzZXQpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGh3X2Fib3J0IChtZSwgImJhZCBzd2l0Y2giKTsKKwl9CisgICAgfQorICByZXR1cm4gbnJfYnl0ZXM7Cit9ICAgICAKKworc3RhdGljIHVuc2lnbmVkCittbjEwM2ludF9pb193cml0ZV9idWZmZXIgKHN0cnVjdCBodyAqbWUsCisJCQkgIGNvbnN0IHZvaWQgKnNvdXJjZSwKKwkJCSAgaW50IHNwYWNlLAorCQkJICB1bnNpZ25lZF93b3JkIGJhc2UsCisJCQkgIHVuc2lnbmVkIG5yX2J5dGVzKQoreworICBzdHJ1Y3QgbW4xMDNpbnQgKmNvbnRyb2xsZXIgPSBod19kYXRhIChtZSk7CisgIGNvbnN0IHVuc2lnbmVkOCAqYnVmID0gc291cmNlOworICB1bnNpZ25lZCBieXRlOworICAvKiBIV19UUkFDRSAoKG1lLCAid3JpdGUgMHglMDhseCAlZCIsIChsb25nKSBiYXNlLCAoaW50KSBucl9ieXRlcykpOyAqLworICBmb3IgKGJ5dGUgPSAwOyBieXRlIDwgbnJfYnl0ZXM7IGJ5dGUrKykKKyAgICB7CisgICAgICB1bnNpZ25lZF93b3JkIGFkZHJlc3MgPSBiYXNlICsgYnl0ZTsKKyAgICAgIHVuc2lnbmVkX3dvcmQgb2Zmc2V0OworICAgICAgc3dpdGNoIChkZWNvZGVfYWRkciAobWUsIGNvbnRyb2xsZXIsIGFkZHJlc3MsICZvZmZzZXQpKQorCXsKKwljYXNlIElDUl9CTE9DSzoKKwkgIHdyaXRlX2ljciAobWUsIGNvbnRyb2xsZXIsIG9mZnNldCwgYnVmW2J5dGVdKTsKKwkgIGJyZWFrOworCWNhc2UgSUFHUl9CTE9DSzoKKwkgIC8qIG5vdCBhbGxvd2VkICovCisJICBicmVhazsKKwljYXNlIEVYVE1EX0JMT0NLOgorCSAgd3JpdGVfZXh0bWQgKG1lLCBjb250cm9sbGVyLCBvZmZzZXQsIGJ1ZltieXRlXSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgaHdfYWJvcnQgKG1lLCAiYmFkIHN3aXRjaCIpOworCX0KKyAgICB9CisgIHJldHVybiBucl9ieXRlczsKK30gICAgIAorCitzdGF0aWMgaW50CittbjEwM2ludF9pb2N0bChzdHJ1Y3QgaHcgKm1lLAorCSAgICAgICBod19pb2N0bF9yZXF1ZXN0IHJlcXVlc3QsCisJICAgICAgIHZhX2xpc3QgYXApCit7CisgIHN0cnVjdCBtbjEwM2ludCAqY29udHJvbGxlciA9IChzdHJ1Y3QgbW4xMDNpbnQgKilod19kYXRhKG1lKTsKKyAgY29udHJvbGxlci0+Z3JvdXBbMF0ucmVxdWVzdCA9IEVYVFJBQ1RfSUQoNCk7CisgIG1uMTAzaW50X3BvcnRfZXZlbnQobWUsIDIgLyogbm1pX3BvcnQoc3lzZXJyKSAqLywgTlVMTCwgMCwgMCk7Cit9CisKKworY29uc3Qgc3RydWN0IGh3X2Rlc2NyaXB0b3IgZHZfbW4xMDNpbnRfZGVzY3JpcHRvcltdID0geworICB7ICJtbjEwM2ludCIsIG1uMTAzaW50X2ZpbmlzaCwgfSwKKyAgeyBOVUxMIH0sCit9OwpkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvZHYtbW4xMDNpb3AuYyBiL3NpbS9tbjEwMzAwL2R2LW1uMTAzaW9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzNzlmYwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tbjEwMzAwL2R2LW1uMTAzaW9wLmMKQEAgLTAsMCArMSw1NTUgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICAgCisgICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICAgIAorICAgICovCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2luY2x1ZGUgImh3LW1haW4uaCIKKworLyogREVWSUNFCisKKyAgIAorICAgbW4xMDNpb3AgLSBtbjEwMzAwMiBJL08gcG9ydHMgMC0zLgorCisgICAKKyAgIERFU0NSSVBUSU9OCisgICAKKyAgIEltcGxlbWVudHMgdGhlIG1uMTAzMDAyIGkvbyBwb3J0cyBhcyBkZXNjcmliZWQgaW4gdGhlIG1uMTAzMDAyIHVzZXIgZ3VpZGUuCisKKworICAgUFJPUEVSVElFUyAgIAorCisgICByZWcgPSA8aW9wb3J0LWFkZHI+IDxpb3BvcnQtc2l6ZT4gLi4uCisKKworICAgQlVHUworCisgICAqLworCisKKy8qIFRoZSBJL08gcG9ydHMnIHJlZ2lzdGVycycgYWRkcmVzcyBibG9jayAqLworCitzdHJ1Y3QgbW4xMDNpb3BfYmxvY2sgeworICB1bnNpZ25lZF93b3JkIGJhc2U7CisgIHVuc2lnbmVkX3dvcmQgYm91bmQ7Cit9OworCisKKworZW51bSBpb19wb3J0X3JlZ2lzdGVyX3R5cGVzIHsKKyAgUDBPVVQsCisgIFAxT1VULAorICBQMk9VVCwKKyAgUDNPVVQsCisgIFAwTUQsCisgIFAxTUQsCisgIFAyTUQsCisgIFAzTUQsCisgIFAyU1MsCisgIFA0U1MsCisgIFAwRElSLAorICBQMURJUiwKKyAgUDJESVIsCisgIFAzRElSLAorICBQMElOLAorICBQMUlOLAorICBQMklOLAorICBQM0lOLAorfTsKKworI2RlZmluZSBOUl9QT1JUUyAgNAorCitlbnVtIHsKKyAgT1VUUFVUX0JMT0NLLAorICBNT0RFX0JMT0NLLAorICBERURfQ1RSTF9CTE9DSywKKyAgQ1RSTF9CTE9DSywKKyAgUElOX0JMT0NLLAorICBOUl9CTE9DS1MKK307CisKK3R5cGVkZWYgc3RydWN0IF9tbjEwMzAwX2lvcG9ydCB7CisgIHVuc2lnbmVkOCBvdXRwdXQsIG91dHB1dF9tb2RlLCBjb250cm9sLCBwaW47CisgIHN0cnVjdCBod19ldmVudCAqZXZlbnQ7Cit9IG1uMTAzMDBfaW9wb3J0OworCisKKworc3RydWN0IG1uMTAzaW9wIHsKKyAgc3RydWN0IG1uMTAzaW9wX2Jsb2NrIGJsb2NrW05SX0JMT0NLU107CisgIG1uMTAzMDBfaW9wb3J0IHBvcnRbTlJfUE9SVFNdOworICB1bnNpZ25lZDggICAgICBwMnNzLCBwNHNzOworfTsKKworCisvKiBGaW5pc2ggb2ZmIHRoZSBwYXJ0aWFsbHkgY3JlYXRlZCBodyBkZXZpY2UuICBBdHRhY2ggb3VyIGxvY2FsCisgICBjYWxsYmFja3MuICBXaXJlIHVwIG91ciBwb3J0IG5hbWVzIGV0YyAqLworCitzdGF0aWMgaHdfaW9fcmVhZF9idWZmZXJfbWV0aG9kIG1uMTAzaW9wX2lvX3JlYWRfYnVmZmVyOworc3RhdGljIGh3X2lvX3dyaXRlX2J1ZmZlcl9tZXRob2QgbW4xMDNpb3BfaW9fd3JpdGVfYnVmZmVyOworCitzdGF0aWMgdm9pZAorYXR0YWNoX21uMTAzaW9wX3JlZ3MgKHN0cnVjdCBodyAqbWUsCisJCSAgICAgIHN0cnVjdCBtbjEwM2lvcCAqaW9fcG9ydCkKK3sKKyAgaW50IGk7CisgIHVuc2lnbmVkX3dvcmQgYXR0YWNoX2FkZHJlc3M7CisgIGludCBhdHRhY2hfc3BhY2U7CisgIHVuc2lnbmVkIGF0dGFjaF9zaXplOworICByZWdfcHJvcGVydHlfc3BlYyByZWc7CisKKyAgaWYgKGh3X2ZpbmRfcHJvcGVydHkgKG1lLCAicmVnIikgPT0gTlVMTCkKKyAgICBod19hYm9ydCAobWUsICJNaXNzaW5nIFwicmVnXCIgcHJvcGVydHkiKTsKKworICBmb3IgKGk9MDsgaSA8IE5SX0JMT0NLUzsgKytpICkKKyAgICB7CisgICAgICBpZiAoIWh3X2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5IChtZSwgInJlZyIsIGksICZyZWcpKQorCWh3X2Fib3J0IChtZSwgIlwicmVnXCIgcHJvcGVydHkgbXVzdCBjb250YWluIGZpdmUgYWRkci9zaXplIGVudHJpZXMiKTsKKyAgICAgIGh3X3VuaXRfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyAoaHdfcGFyZW50IChtZSksCisJCQkJCSAmcmVnLmFkZHJlc3MsCisJCQkJCSAmYXR0YWNoX3NwYWNlLAorCQkJCQkgJmF0dGFjaF9hZGRyZXNzLAorCQkJCQkgbWUpOworICAgICAgaW9fcG9ydC0+YmxvY2tbaV0uYmFzZSA9IGF0dGFjaF9hZGRyZXNzOworICAgICAgaHdfdW5pdF9zaXplX3RvX2F0dGFjaF9zaXplIChod19wYXJlbnQgKG1lKSwKKwkJCQkgICAmcmVnLnNpemUsCisJCQkJICAgJmF0dGFjaF9zaXplLCBtZSk7CisgICAgICBpb19wb3J0LT5ibG9ja1tpXS5ib3VuZCA9IGF0dGFjaF9hZGRyZXNzICsgKGF0dGFjaF9zaXplIC0gMSk7CisgICAgICBod19hdHRhY2hfYWRkcmVzcyAoaHdfcGFyZW50IChtZSksCisJCQkgMCwKKwkJCSBhdHRhY2hfc3BhY2UsIGF0dGFjaF9hZGRyZXNzLCBhdHRhY2hfc2l6ZSwKKwkJCSBtZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorbW4xMDNpb3BfZmluaXNoIChzdHJ1Y3QgaHcgKm1lKQoreworICBzdHJ1Y3QgbW4xMDNpb3AgKmlvX3BvcnQ7CisgIGludCBpOworCisgIGlvX3BvcnQgPSBIV19aQUxMT0MgKG1lLCBzdHJ1Y3QgbW4xMDNpb3ApOworICBzZXRfaHdfZGF0YSAobWUsIGlvX3BvcnQpOworICBzZXRfaHdfaW9fcmVhZF9idWZmZXIgKG1lLCBtbjEwM2lvcF9pb19yZWFkX2J1ZmZlcik7CisgIHNldF9od19pb193cml0ZV9idWZmZXIgKG1lLCBtbjEwM2lvcF9pb193cml0ZV9idWZmZXIpOworCisgIC8qIEF0dGFjaCBvdXJzZWxmIHRvIG91ciBwYXJlbnQgYnVzICovCisgIGF0dGFjaF9tbjEwM2lvcF9yZWdzIChtZSwgaW9fcG9ydCk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgaS9vIHBvcnQgcmVnaXN0ZXJzLiAqLworICBmb3IgKCBpPTA7IGk8TlJfUE9SVFM7ICsraSApCisgICAgeworICAgICAgaW9fcG9ydC0+cG9ydFtpXS5vdXRwdXQgPSAwOworICAgICAgaW9fcG9ydC0+cG9ydFtpXS5vdXRwdXRfbW9kZSA9IDA7CisgICAgICBpb19wb3J0LT5wb3J0W2ldLmNvbnRyb2wgPSAwOworICAgICAgaW9fcG9ydC0+cG9ydFtpXS5waW4gPSAwOworICAgIH0KKyAgaW9fcG9ydC0+cG9ydFsyXS5vdXRwdXRfbW9kZSA9IDB4ZmY7CisgIGlvX3BvcnQtPnAyc3MgPSAwOworICBpb19wb3J0LT5wNHNzID0gMHgwZjsKK30KKworCisvKiByZWFkIGFuZCB3cml0ZSAqLworCitzdGF0aWMgaW50CitkZWNvZGVfYWRkciAoc3RydWN0IGh3ICptZSwKKwkgICAgIHN0cnVjdCBtbjEwM2lvcCAqaW9fcG9ydCwKKwkgICAgIHVuc2lnbmVkX3dvcmQgYWRkcmVzcykKK3sKKyAgdW5zaWduZWRfd29yZCBvZmZzZXQ7CisgIG9mZnNldCA9IGFkZHJlc3MgLSBpb19wb3J0LT5ibG9ja1swXS5iYXNlOworICBzd2l0Y2ggKG9mZnNldCkKKyAgICB7CisgICAgY2FzZSAweDAwOiByZXR1cm4gUDBPVVQ7CisgICAgY2FzZSAweDAxOiByZXR1cm4gUDFPVVQ7CisgICAgY2FzZSAweDA0OiByZXR1cm4gUDJPVVQ7CisgICAgY2FzZSAweDA1OiByZXR1cm4gUDNPVVQ7CisgICAgY2FzZSAweDIwOiByZXR1cm4gUDBNRDsKKyAgICBjYXNlIDB4MjE6IHJldHVybiBQMU1EOworICAgIGNhc2UgMHgyNDogcmV0dXJuIFAyTUQ7CisgICAgY2FzZSAweDI1OiByZXR1cm4gUDNNRDsKKyAgICBjYXNlIDB4NDQ6IHJldHVybiBQMlNTOworICAgIGNhc2UgMHg0ODogcmV0dXJuIFA0U1M7CisgICAgY2FzZSAweDYwOiByZXR1cm4gUDBESVI7CisgICAgY2FzZSAweDYxOiByZXR1cm4gUDFESVI7CisgICAgY2FzZSAweDY0OiByZXR1cm4gUDJESVI7CisgICAgY2FzZSAweDY1OiByZXR1cm4gUDNESVI7CisgICAgY2FzZSAweDgwOiByZXR1cm4gUDBJTjsKKyAgICBjYXNlIDB4ODE6IHJldHVybiBQMUlOOworICAgIGNhc2UgMHg4NDogcmV0dXJuIFAySU47CisgICAgY2FzZSAweDg1OiByZXR1cm4gUDNJTjsKKyAgICBkZWZhdWx0OiAKKyAgICAgIHsKKwlod19hYm9ydCAobWUsICJiYWQgYWRkcmVzcyIpOworCXJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3JlYWRfb3V0cHV0X3JlZyAoc3RydWN0IGh3ICptZSwKKwkJIHN0cnVjdCBtbjEwM2lvcCAqaW9fcG9ydCwKKwkJIHVuc2lnbmVkX3dvcmQgaW9fcG9ydF9yZWcsCisJCSBjb25zdCB2b2lkICpkZXN0LAorCQkgdW5zaWduZWQgIG5yX2J5dGVzKQoreworICBpZiAoIG5yX2J5dGVzID09IDEgKQorICAgIHsKKyAgICAgICoodW5zaWduZWQ4ICopZGVzdCA9IGlvX3BvcnQtPnBvcnRbaW9fcG9ydF9yZWddLm91dHB1dDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBod19hYm9ydCAobWUsICJiYWQgcmVhZCBzaXplIG9mICVkIGJ5dGVzIGZyb20gUCVkT1VULiIsIG5yX2J5dGVzLCAKKwkJaW9fcG9ydF9yZWcpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorcmVhZF9vdXRwdXRfbW9kZV9yZWcgKHN0cnVjdCBodyAqbWUsCisJCSAgICAgIHN0cnVjdCBtbjEwM2lvcCAqaW9fcG9ydCwKKwkJICAgICAgdW5zaWduZWRfd29yZCBpb19wb3J0X3JlZywKKwkJICAgICAgY29uc3Qgdm9pZCAqZGVzdCwKKwkJICAgICAgdW5zaWduZWQgIG5yX2J5dGVzKQoreworICBpZiAoIG5yX2J5dGVzID09IDEgKQorICAgIHsKKyAgICAgIC8qIGNoZWNrIGlmIHRoZXJlIGFyZSBmaWVsZHMgd2hpY2ggY2FuJ3QgYmUgd3JpdHRlbiBhbmQKKwkgdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gZGVwZW5kaW5nIHdoYXQgYml0cyBhcmUgc2V0ICovCisgICAgICAqKHVuc2lnbmVkOCAqKWRlc3QgPSBpb19wb3J0LT5wb3J0W2lvX3BvcnRfcmVnXS5vdXRwdXRfbW9kZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBod19hYm9ydCAobWUsICJiYWQgcmVhZCBzaXplIG9mICVkIGJ5dGVzIHRvIFAlZE1ELiIsIG5yX2J5dGVzLCAKKwkJaW9fcG9ydF9yZWcpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorcmVhZF9jb250cm9sX3JlZyAoc3RydWN0IGh3ICptZSwKKwkJICBzdHJ1Y3QgbW4xMDNpb3AgKmlvX3BvcnQsCisJCSAgdW5zaWduZWRfd29yZCBpb19wb3J0X3JlZywKKwkJICBjb25zdCB2b2lkICpkZXN0LAorCQkgIHVuc2lnbmVkICBucl9ieXRlcykKK3sKKyAgaWYgKCBucl9ieXRlcyA9PSAxICkKKyAgICB7CisgICAgICAqKHVuc2lnbmVkOCAqKWRlc3QgPSBpb19wb3J0LT5wb3J0W2lvX3BvcnRfcmVnXS5jb250cm9sOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGh3X2Fib3J0IChtZSwgImJhZCByZWFkIHNpemUgb2YgJWQgYnl0ZXMgdG8gUCVkRElSLiIsIG5yX2J5dGVzLCAKKwkJaW9fcG9ydF9yZWcpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorcmVhZF9waW5fcmVnIChzdHJ1Y3QgaHcgKm1lLAorCSAgICAgIHN0cnVjdCBtbjEwM2lvcCAqaW9fcG9ydCwKKwkgICAgICB1bnNpZ25lZF93b3JkIGlvX3BvcnRfcmVnLAorCSAgICAgIGNvbnN0IHZvaWQgKmRlc3QsCisJICAgICAgdW5zaWduZWQgIG5yX2J5dGVzKQoreworICBpZiAoIG5yX2J5dGVzID09IDEgKQorICAgIHsKKyAgICAgICoodW5zaWduZWQ4ICopZGVzdCA9IGlvX3BvcnQtPnBvcnRbaW9fcG9ydF9yZWddLnBpbjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBod19hYm9ydCAobWUsICJiYWQgcmVhZCBzaXplIG9mICVkIGJ5dGVzIHRvIFAlZElOLiIsIG5yX2J5dGVzLCAKKwkJaW9fcG9ydF9yZWcpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorcmVhZF9kZWRpY2F0ZWRfY29udHJvbF9yZWcgKHN0cnVjdCBodyAqbWUsCisJCQkgICAgc3RydWN0IG1uMTAzaW9wICppb19wb3J0LAorCQkJICAgIHVuc2lnbmVkX3dvcmQgaW9fcG9ydF9yZWcsCisJCQkgICAgY29uc3Qgdm9pZCAqZGVzdCwKKwkJCSAgICB1bnNpZ25lZCAgbnJfYnl0ZXMpCit7CisgIGlmICggbnJfYnl0ZXMgPT0gMSApCisgICAgeworICAgICAgLyogc2VsZWN0IG9uIGlvX3BvcnRfcmVnOiAqLworICAgICAgaWYgKCBpb19wb3J0X3JlZyA9PSBQMlNTICkKKwl7CisJICAqKHVuc2lnbmVkOCAqKWRlc3QgPSBpb19wb3J0LT5wMnNzOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAqKHVuc2lnbmVkOCAqKWRlc3QgPSBpb19wb3J0LT5wNHNzOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBod19hYm9ydCAobWUsICJiYWQgcmVhZCBzaXplIG9mICVkIGJ5dGVzIHRvIFBTUy4iLCBucl9ieXRlcyk7IAorICAgIH0KK30KKworCitzdGF0aWMgdW5zaWduZWQKK21uMTAzaW9wX2lvX3JlYWRfYnVmZmVyIChzdHJ1Y3QgaHcgKm1lLAorCQkJIHZvaWQgKmRlc3QsCisJCQkgaW50IHNwYWNlLAorCQkJIHVuc2lnbmVkX3dvcmQgYmFzZSwKKwkJCSB1bnNpZ25lZCBucl9ieXRlcykKK3sKKyAgc3RydWN0IG1uMTAzaW9wICppb19wb3J0ID0gaHdfZGF0YSAobWUpOworICBlbnVtIGlvX3BvcnRfcmVnaXN0ZXJfdHlwZXMgaW9fcG9ydF9yZWc7CisgIEhXX1RSQUNFICgobWUsICJyZWFkIDB4JTA4bHggJWQiLCAobG9uZykgYmFzZSwgKGludCkgbnJfYnl0ZXMpKTsKKworICBpb19wb3J0X3JlZyA9IGRlY29kZV9hZGRyIChtZSwgaW9fcG9ydCwgYmFzZSk7CisgIHN3aXRjaCAoaW9fcG9ydF9yZWcpCisgICAgeworICAgIC8qIFBvcnQgb3V0cHV0IHJlZ2lzdGVycyAqLworICAgIGNhc2UgUDBPVVQ6CisgICAgY2FzZSBQMU9VVDoKKyAgICBjYXNlIFAyT1VUOgorICAgIGNhc2UgUDNPVVQ6CisgICAgICByZWFkX291dHB1dF9yZWcobWUsIGlvX3BvcnQsIGlvX3BvcnRfcmVnLVAwT1VULCBkZXN0LCBucl9ieXRlcyk7CisgICAgICBicmVhazsKKworICAgIC8qIFBvcnQgb3V0cHV0IG1vZGUgcmVnaXN0ZXJzICovCisgICAgY2FzZSBQME1EOgorICAgIGNhc2UgUDFNRDoKKyAgICBjYXNlIFAyTUQ6CisgICAgY2FzZSBQM01EOgorICAgICAgcmVhZF9vdXRwdXRfbW9kZV9yZWcobWUsIGlvX3BvcnQsIGlvX3BvcnRfcmVnLVAwTUQsIGRlc3QsIG5yX2J5dGVzKTsKKyAgICAgIGJyZWFrOworCisgICAgLyogUG9ydCBjb250cm9sIHJlZ2lzdGVycyAqLworICAgIGNhc2UgUDBESVI6CisgICAgY2FzZSBQMURJUjoKKyAgICBjYXNlIFAyRElSOgorICAgIGNhc2UgUDNESVI6CisgICAgICByZWFkX2NvbnRyb2xfcmVnKG1lLCBpb19wb3J0LCBpb19wb3J0X3JlZy1QMERJUiwgZGVzdCwgbnJfYnl0ZXMpOworICAgICAgYnJlYWs7CisKKyAgICAvKiBQb3J0IHBpbiByZWdpc3RlcnMgKi8KKyAgICBjYXNlIFAwSU46CisgICAgY2FzZSBQMUlOOgorICAgIGNhc2UgUDJJTjoKKyAgICAgIHJlYWRfcGluX3JlZyhtZSwgaW9fcG9ydCwgaW9fcG9ydF9yZWctUDBJTiwgZGVzdCwgbnJfYnl0ZXMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFAyU1M6CisgICAgY2FzZSBQNFNTOgorICAgICAgcmVhZF9kZWRpY2F0ZWRfY29udHJvbF9yZWcobWUsIGlvX3BvcnQsIGlvX3BvcnRfcmVnLCBkZXN0LCBucl9ieXRlcyk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBod19hYm9ydChtZSwgImludmFsaWQgYWRkcmVzcyIpOworICAgIH0KKworICByZXR1cm4gbnJfYnl0ZXM7Cit9ICAgICAKKworCitzdGF0aWMgdm9pZAord3JpdGVfb3V0cHV0X3JlZyAoc3RydWN0IGh3ICptZSwKKwkJICBzdHJ1Y3QgbW4xMDNpb3AgKmlvX3BvcnQsCisJCSAgdW5zaWduZWRfd29yZCBpb19wb3J0X3JlZywKKwkJICBjb25zdCB2b2lkICpzb3VyY2UsCisJCSAgdW5zaWduZWQgIG5yX2J5dGVzKQoreworICB1bnNpZ25lZDggYnVmID0gKih1bnNpZ25lZDggKilzb3VyY2U7CisgIGlmICggbnJfYnl0ZXMgPT0gMSApCisgICAgeworICAgICAgaWYgKCBpb19wb3J0X3JlZyA9PSAzICYmIChidWYgJiAweGZjKSAhPSAwICkKKwl7CisJICBod19hYm9ydChtZSwgIkNhbm5vdCB3cml0ZSB0byByZWFkLW9ubHkgYml0cyBvZiBQM09VVC4iKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW9fcG9ydC0+cG9ydFtpb19wb3J0X3JlZ10ub3V0cHV0ID0gYnVmOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBod19hYm9ydCAobWUsICJiYWQgcmVhZCBzaXplIG9mICVkIGJ5dGVzIGZyb20gUCVkT1VULiIsIG5yX2J5dGVzLCAKKwkJaW9fcG9ydF9yZWcpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAord3JpdGVfb3V0cHV0X21vZGVfcmVnIChzdHJ1Y3QgaHcgKm1lLAorCQkgICAgICAgc3RydWN0IG1uMTAzaW9wICppb19wb3J0LAorCQkgICAgICAgdW5zaWduZWRfd29yZCBpb19wb3J0X3JlZywKKwkJICAgICAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKKwkJICAgICAgIHVuc2lnbmVkICBucl9ieXRlcykKK3sKKyAgdW5zaWduZWQ4IGJ1ZiA9ICoodW5zaWduZWQ4ICopc291cmNlOworICBpZiAoIG5yX2J5dGVzID09IDEgKQorICAgIHsKKyAgICAgIC8qIGNoZWNrIGlmIHRoZXJlIGFyZSBmaWVsZHMgd2hpY2ggY2FuJ3QgYmUgd3JpdHRlbiBhbmQKKwkgdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gZGVwZW5kaW5nIHdoYXQgYml0cyBhcmUgc2V0ICovCisgICAgICBpZiAoICggaW9fcG9ydF9yZWcgPT0gMyAmJiAoYnVmICYgMHhmYykgIT0gMCApCisJICAgfHwgKCAoaW9fcG9ydF9yZWcgPT0gMCB8fCBpb19wb3J0X3JlZyA9PSAxKSAgJiYgKGJ1ZiAmIDB4ZmUpICE9IDAgKSApCisJeworCSAgaHdfYWJvcnQobWUsICJDYW5ub3Qgd3JpdGUgdG8gcmVhZC1vbmx5IGJpdHMgb2Ygb3V0cHV0IG1vZGUgcmVnaXN0ZXIuIik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlvX3BvcnQtPnBvcnRbaW9fcG9ydF9yZWddLm91dHB1dF9tb2RlID0gYnVmOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBod19hYm9ydCAobWUsICJiYWQgd3JpdGUgc2l6ZSBvZiAlZCBieXRlcyB0byBQJWRNRC4iLCBucl9ieXRlcywgCisJCWlvX3BvcnRfcmVnKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3dyaXRlX2NvbnRyb2xfcmVnIChzdHJ1Y3QgaHcgKm1lLAorCQkgICBzdHJ1Y3QgbW4xMDNpb3AgKmlvX3BvcnQsCisJCSAgIHVuc2lnbmVkX3dvcmQgaW9fcG9ydF9yZWcsCisJCSAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKKwkJICAgdW5zaWduZWQgIG5yX2J5dGVzKQoreworICB1bnNpZ25lZDggYnVmID0gKih1bnNpZ25lZDggKilzb3VyY2U7CisgIGlmICggbnJfYnl0ZXMgPT0gMSApCisgICAgeworICAgICAgaWYgKCBpb19wb3J0X3JlZyA9PSAzICYmIChidWYgJiAweGZjKSAhPSAwICkKKwl7CisJICBod19hYm9ydChtZSwgIkNhbm5vdCB3cml0ZSB0byByZWFkLW9ubHkgYml0cyBvZiBQM0RJUi4iKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaW9fcG9ydC0+cG9ydFtpb19wb3J0X3JlZ10uY29udHJvbCA9IGJ1ZjsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaHdfYWJvcnQgKG1lLCAiYmFkIHdyaXRlIHNpemUgb2YgJWQgYnl0ZXMgdG8gUCVkRElSLiIsIG5yX2J5dGVzLCAKKwkJaW9fcG9ydF9yZWcpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAord3JpdGVfZGVkaWNhdGVkX2NvbnRyb2xfcmVnIChzdHJ1Y3QgaHcgKm1lLAorCQkJICAgICBzdHJ1Y3QgbW4xMDNpb3AgKmlvX3BvcnQsCisJCQkgICAgIHVuc2lnbmVkX3dvcmQgaW9fcG9ydF9yZWcsCisJCQkgICAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKKwkJCSAgICAgdW5zaWduZWQgIG5yX2J5dGVzKQoreworICB1bnNpZ25lZDggYnVmID0gKih1bnNpZ25lZDggKilzb3VyY2U7CisgIGlmICggbnJfYnl0ZXMgPT0gMSApCisgICAgeworICAgICAgLyogc2VsZWN0IG9uIGlvX3BvcnRfcmVnOiAqLworICAgICAgaWYgKCBpb19wb3J0X3JlZyA9PSBQMlNTICkKKwl7CisJICBpZiAoIChidWYgJiYgMHhmYykgICE9IDAgKQorCSAgICB7CisJICAgICAgaHdfYWJvcnQobWUsICJDYW5ub3Qgd3JpdGUgdG8gcmVhZC1vbmx5IGJpdHMgaW4gcDJzcy4iKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaW9fcG9ydC0+cDJzcyA9IGJ1ZjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoIChidWYgJiYgMHhmMCkgIT0gMCApCisJICAgIHsKKwkgICAgICBod19hYm9ydChtZSwgIkNhbm5vdCB3cml0ZSB0byByZWFkLW9ubHkgYml0cyBpbiBwNHNzLiIpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpb19wb3J0LT5wNHNzID0gYnVmOworCSAgICB9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGh3X2Fib3J0IChtZSwgImJhZCB3cml0ZSBzaXplIG9mICVkIGJ5dGVzIHRvIFBTUy4iLCBucl9ieXRlcyk7IAorICAgIH0KK30KKworCitzdGF0aWMgdW5zaWduZWQKK21uMTAzaW9wX2lvX3dyaXRlX2J1ZmZlciAoc3RydWN0IGh3ICptZSwKKwkJCSAgY29uc3Qgdm9pZCAqc291cmNlLAorCQkJICBpbnQgc3BhY2UsCisJCQkgIHVuc2lnbmVkX3dvcmQgYmFzZSwKKwkJCSAgdW5zaWduZWQgbnJfYnl0ZXMpCit7CisgIHN0cnVjdCBtbjEwM2lvcCAqaW9fcG9ydCA9IGh3X2RhdGEgKG1lKTsKKyAgZW51bSBpb19wb3J0X3JlZ2lzdGVyX3R5cGVzIGlvX3BvcnRfcmVnOworICBIV19UUkFDRSAoKG1lLCAid3JpdGUgMHglMDhseCAlZCIsIChsb25nKSBiYXNlLCAoaW50KSBucl9ieXRlcykpOworCisgIGlvX3BvcnRfcmVnID0gZGVjb2RlX2FkZHIgKG1lLCBpb19wb3J0LCBiYXNlKTsKKyAgc3dpdGNoIChpb19wb3J0X3JlZykKKyAgICB7CisgICAgLyogUG9ydCBvdXRwdXQgcmVnaXN0ZXJzICovCisgICAgY2FzZSBQME9VVDoKKyAgICBjYXNlIFAxT1VUOgorICAgIGNhc2UgUDJPVVQ6CisgICAgY2FzZSBQM09VVDoKKyAgICAgIHdyaXRlX291dHB1dF9yZWcobWUsIGlvX3BvcnQsIGlvX3BvcnRfcmVnLVAwT1VULCBzb3VyY2UsIG5yX2J5dGVzKTsKKyAgICAgIGJyZWFrOworCisgICAgLyogUG9ydCBvdXRwdXQgbW9kZSByZWdpc3RlcnMgKi8KKyAgICBjYXNlIFAwTUQ6CisgICAgY2FzZSBQMU1EOgorICAgIGNhc2UgUDJNRDoKKyAgICBjYXNlIFAzTUQ6CisgICAgICB3cml0ZV9vdXRwdXRfbW9kZV9yZWcobWUsIGlvX3BvcnQsIGlvX3BvcnRfcmVnLVAwTUQsIHNvdXJjZSwgbnJfYnl0ZXMpOworICAgICAgYnJlYWs7CisKKyAgICAvKiBQb3J0IGNvbnRyb2wgcmVnaXN0ZXJzICovCisgICAgY2FzZSBQMERJUjoKKyAgICBjYXNlIFAxRElSOgorICAgIGNhc2UgUDJESVI6CisgICAgY2FzZSBQM0RJUjoKKyAgICAgIHdyaXRlX2NvbnRyb2xfcmVnKG1lLCBpb19wb3J0LCBpb19wb3J0X3JlZy1QMERJUiwgc291cmNlLCBucl9ieXRlcyk7CisgICAgICBicmVhazsKKworICAgIC8qIFBvcnQgcGluIHJlZ2lzdGVycyAqLworICAgIGNhc2UgUDBJTjoKKyAgICBjYXNlIFAxSU46CisgICAgY2FzZSBQMklOOgorICAgICAgaHdfYWJvcnQobWUsICJDYW5ub3Qgd3JpdGUgdG8gcGluIHJlZ2lzdGVyLiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFAyU1M6CisgICAgY2FzZSBQNFNTOgorICAgICAgd3JpdGVfZGVkaWNhdGVkX2NvbnRyb2xfcmVnKG1lLCBpb19wb3J0LCBpb19wb3J0X3JlZywgc291cmNlLCBucl9ieXRlcyk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBod19hYm9ydChtZSwgImludmFsaWQgYWRkcmVzcyIpOworICAgIH0KKworICByZXR1cm4gbnJfYnl0ZXM7Cit9ICAgICAKKworCitjb25zdCBzdHJ1Y3QgaHdfZGVzY3JpcHRvciBkdl9tbjEwM2lvcF9kZXNjcmlwdG9yW10gPSB7CisgIHsgIm1uMTAzaW9wIiwgbW4xMDNpb3BfZmluaXNoLCB9LAorICB7IE5VTEwgfSwKK307CmRpZmYgLS1naXQgYS9zaW0vbW4xMDMwMC9kdi1tbjEwM3Nlci5jIGIvc2ltL21uMTAzMDAvZHYtbW4xMDNzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjIwZWQxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL21uMTAzMDAvZHYtbW4xMDNzZXIuYwpAQCAtMCwwICsxLDcxMiBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgICAKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucy4KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgICAgCisgICAgKi8KKworI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAiaHctbWFpbi5oIgorI2luY2x1ZGUgImR2LXNvY2tzZXIuaCIKKworCisvKiBERVZJQ0UKKworICAgCisgICBtbjEwM3NlciAtIG1uMTAzMDAyIHNlcmlhbCBkZXZpY2VzIDAsIDEgYW5kIDIuCisKKyAgIAorICAgREVTQ1JJUFRJT04KKyAgIAorICAgSW1wbGVtZW50cyB0aGUgbW4xMDMwMDIgc2VyaWFsIGludGVyZmFjZXMgYXMgZGVzY3JpYmVkIGluIHRoZQorICAgbW4xMDMwMDIgdXNlciBndWlkZS4gCisKKworICAgUFJPUEVSVElFUyAgIAorCisgICByZWcgPSA8c2VyaWFsLWFkZHI+IDxzZXJpYWwtc2l6ZT4KKworCisgICBCVUdTCisKKyAgICovCisKKworLyogVGhlIHNlcmlhbCBkZXZpY2VzJyByZWdpc3RlcnMnIGFkZHJlc3MgYmxvY2sgKi8KKworc3RydWN0IG1uMTAzc2VyX2Jsb2NrIHsKKyAgdW5zaWduZWRfd29yZCBiYXNlOworICB1bnNpZ25lZF93b3JkIGJvdW5kOworfTsKKworCisKK2VudW0gc2VyaWFsX3JlZ2lzdGVyX3R5cGVzIHsKKyAgICBTQzBDVFIsCisgICAgU0MxQ1RSLAorICAgIFNDMkNUUiwKKyAgICBTQzBJQ1IsCisgICAgU0MxSUNSLAorICAgIFNDMklDUiwKKyAgICBTQzBUWEIsCisgICAgU0MxVFhCLAorICAgIFNDMlRYQiwKKyAgICBTQzBSWEIsCisgICAgU0MxUlhCLAorICAgIFNDMlJYQiwKKyAgICBTQzBTVFIsCisgICAgU0MxU1RSLAorICAgIFNDMlNUUiwKKyAgICBTQzJUSU0sCit9OworCisKKy8qIEFjY2VzcyBkdi1zb2Nrc2VyIHN0YXRlICovCitleHRlcm4gY2hhciogc29ja3Nlcl9hZGRyOworI2RlZmluZSBVU0VfU09DS1NFUl9QIChzb2Nrc2VyX2FkZHIgIT0gTlVMTCkKKworCisjZGVmaW5lIE5SX1NFUklBTF9ERVZTICAzCisjZGVmaW5lIFNJT19TVEFUX1JSRFkgMHgwMDEwCisKK3R5cGVkZWYgc3RydWN0IF9tbjEwMzAwX3NlcmlhbCB7CisgIHVuc2lnbmVkMTYgc3RhdHVzLCBjb250cm9sOworICB1bnNpZ25lZDggIHR4YiwgcnhiLCBpbnRtb2RlOworICBzdHJ1Y3QgaHdfZXZlbnQgKmV2ZW50OworfSBtbjEwMzAwX3NlcmlhbDsKKworCisKK3N0cnVjdCBtbjEwM3NlciB7CisgIHN0cnVjdCBtbjEwM3Nlcl9ibG9jayBibG9jazsKKyAgbW4xMDMwMF9zZXJpYWwgZGV2aWNlW05SX1NFUklBTF9ERVZTXTsKKyAgdW5zaWduZWQ4ICAgICAgc2VyaWFsMl90aW1lcl9yZWc7CisgIGRvX2h3X3BvbGxfcmVhZF9tZXRob2QgKnJlYWRlcjsKK307CisKKy8qIG91dHB1dCBwb3J0IElEJ3MgKi8KKworLyogZm9yIG1uMTAzMDAyICovCitlbnVtIHsKKyAgU0VSSUFMMF9SRUNFSVZFLAorICBTRVJJQUwxX1JFQ0VJVkUsCisgIFNFUklBTDJfUkVDRUlWRSwKKyAgU0VSSUFMMF9TRU5ELAorICBTRVJJQUwxX1NFTkQsCisgIFNFUklBTDJfU0VORCwKK307CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod19wb3J0X2Rlc2NyaXB0b3IgbW4xMDNzZXJfcG9ydHNbXSA9IHsKKworICB7ICJzZXJpYWwtMC1yZWNlaXZlIiwgIFNFUklBTDBfUkVDRUlWRSwgMCwgb3V0cHV0X3BvcnQsIH0sCisgIHsgInNlcmlhbC0xLXJlY2VpdmUiLCAgU0VSSUFMMV9SRUNFSVZFLCAwLCBvdXRwdXRfcG9ydCwgfSwKKyAgeyAic2VyaWFsLTItcmVjZWl2ZSIsICBTRVJJQUwyX1JFQ0VJVkUsIDAsIG91dHB1dF9wb3J0LCB9LAorICB7ICJzZXJpYWwtMC10cmFuc21pdCIsIFNFUklBTDBfU0VORCwgMCwgb3V0cHV0X3BvcnQsIH0sCisgIHsgInNlcmlhbC0xLXRyYW5zbWl0IiwgU0VSSUFMMV9TRU5ELCAwLCBvdXRwdXRfcG9ydCwgfSwKKyAgeyAic2VyaWFsLTItdHJhbnNtaXQiLCBTRVJJQUwyX1NFTkQsIDAsIG91dHB1dF9wb3J0LCB9LAorCisgIHsgTlVMTCwgfSwKK307CisKKworCisvKiBGaW5pc2ggb2ZmIHRoZSBwYXJ0aWFsbHkgY3JlYXRlZCBodyBkZXZpY2UuICBBdHRhY2ggb3VyIGxvY2FsCisgICBjYWxsYmFja3MuICBXaXJlIHVwIG91ciBwb3J0IG5hbWVzIGV0YyAqLworCitzdGF0aWMgaHdfaW9fcmVhZF9idWZmZXJfbWV0aG9kIG1uMTAzc2VyX2lvX3JlYWRfYnVmZmVyOworc3RhdGljIGh3X2lvX3dyaXRlX2J1ZmZlcl9tZXRob2QgbW4xMDNzZXJfaW9fd3JpdGVfYnVmZmVyOworCitzdGF0aWMgdm9pZAorYXR0YWNoX21uMTAzc2VyX3JlZ3MgKHN0cnVjdCBodyAqbWUsCisJCSAgICAgIHN0cnVjdCBtbjEwM3NlciAqc2VyaWFsKQoreworICB1bnNpZ25lZF93b3JkIGF0dGFjaF9hZGRyZXNzOworICBpbnQgYXR0YWNoX3NwYWNlOworICB1bnNpZ25lZCBhdHRhY2hfc2l6ZTsKKyAgcmVnX3Byb3BlcnR5X3NwZWMgcmVnOworCisgIGlmIChod19maW5kX3Byb3BlcnR5IChtZSwgInJlZyIpID09IE5VTEwpCisgICAgaHdfYWJvcnQgKG1lLCAiTWlzc2luZyBcInJlZ1wiIHByb3BlcnR5Iik7CisKKyAgaWYgKCFod19maW5kX3JlZ19hcnJheV9wcm9wZXJ0eSAobWUsICJyZWciLCAwLCAmcmVnKSkKKyAgICBod19hYm9ydCAobWUsICJcInJlZ1wiIHByb3BlcnR5IG11c3QgY29udGFpbiB0aHJlZSBhZGRyL3NpemUgZW50cmllcyIpOworICBod191bml0X2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLAorCQkJCSAgICAgJnJlZy5hZGRyZXNzLAorCQkJCSAgICAgJmF0dGFjaF9zcGFjZSwKKwkJCQkgICAgICZhdHRhY2hfYWRkcmVzcywKKwkJCQkgICAgIG1lKTsKKyAgc2VyaWFsLT5ibG9jay5iYXNlID0gYXR0YWNoX2FkZHJlc3M7CisgIGh3X3VuaXRfc2l6ZV90b19hdHRhY2hfc2l6ZSAoaHdfcGFyZW50IChtZSksCisJCQkgICAgICAgJnJlZy5zaXplLAorCQkJICAgICAgICZhdHRhY2hfc2l6ZSwgbWUpOworICBzZXJpYWwtPmJsb2NrLmJvdW5kID0gYXR0YWNoX2FkZHJlc3MgKyAoYXR0YWNoX3NpemUgLSAxKTsKKyAgaHdfYXR0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLAorCQkgICAgIDAsCisJCSAgICAgYXR0YWNoX3NwYWNlLCBhdHRhY2hfYWRkcmVzcywgYXR0YWNoX3NpemUsCisJCSAgICAgbWUpOworfQorCitzdGF0aWMgdm9pZAorbW4xMDNzZXJfZmluaXNoIChzdHJ1Y3QgaHcgKm1lKQoreworICBzdHJ1Y3QgbW4xMDNzZXIgKnNlcmlhbDsKKyAgaW50IGk7CisKKyAgc2VyaWFsID0gSFdfWkFMTE9DIChtZSwgc3RydWN0IG1uMTAzc2VyKTsKKyAgc2V0X2h3X2RhdGEgKG1lLCBzZXJpYWwpOworICBzZXRfaHdfaW9fcmVhZF9idWZmZXIgKG1lLCBtbjEwM3Nlcl9pb19yZWFkX2J1ZmZlcik7CisgIHNldF9od19pb193cml0ZV9idWZmZXIgKG1lLCBtbjEwM3Nlcl9pb193cml0ZV9idWZmZXIpOworICBzZXRfaHdfcG9ydHMgKG1lLCBtbjEwM3Nlcl9wb3J0cyk7CisKKyAgLyogQXR0YWNoIG91cnNlbGYgdG8gb3VyIHBhcmVudCBidXMgKi8KKyAgYXR0YWNoX21uMTAzc2VyX3JlZ3MgKG1lLCBzZXJpYWwpOworCisgIC8qIElmIHNvIGNvbmZpZ3VyZWQsIGVuYWJsZSBwb2xsZWQgaW5wdXQgKi8KKyAgaWYgKGh3X2ZpbmRfcHJvcGVydHkgKG1lLCAicG9sbD8iKSAhPSBOVUxMCisgICAgICAmJiBod19maW5kX2Jvb2xlYW5fcHJvcGVydHkgKG1lLCAicG9sbD8iKSkKKyAgICB7CisgICAgICBzZXJpYWwtPnJlYWRlciA9IHNpbV9pb19wb2xsX3JlYWQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2VyaWFsLT5yZWFkZXIgPSBzaW1faW9fcmVhZDsKKyAgICB9CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgc2VyaWFsIGRldmljZSByZWdpc3RlcnMuICovCisgIGZvciAoIGk9MDsgaTxOUl9TRVJJQUxfREVWUzsgKytpICkKKyAgICB7CisgICAgICBzZXJpYWwtPmRldmljZVtpXS50eGIgPSAwOworICAgICAgc2VyaWFsLT5kZXZpY2VbaV0ucnhiID0gMDsKKyAgICAgIHNlcmlhbC0+ZGV2aWNlW2ldLnN0YXR1cyA9IDA7CisgICAgICBzZXJpYWwtPmRldmljZVtpXS5jb250cm9sID0gMDsKKyAgICAgIHNlcmlhbC0+ZGV2aWNlW2ldLmludG1vZGUgPSAwOworICAgICAgc2VyaWFsLT5kZXZpY2VbaV0uZXZlbnQgPSBOVUxMOworICAgIH0KK30KKworCisvKiByZWFkIGFuZCB3cml0ZSAqLworCitzdGF0aWMgaW50CitkZWNvZGVfYWRkciAoc3RydWN0IGh3ICptZSwKKwkgICAgIHN0cnVjdCBtbjEwM3NlciAqc2VyaWFsLAorCSAgICAgdW5zaWduZWRfd29yZCBhZGRyZXNzKQoreworICB1bnNpZ25lZF93b3JkIG9mZnNldDsKKyAgb2Zmc2V0ID0gYWRkcmVzcyAtIHNlcmlhbC0+YmxvY2suYmFzZTsKKyAgc3dpdGNoIChvZmZzZXQpCisgICAgeworICAgIGNhc2UgMHgwMDogcmV0dXJuIFNDMENUUjsKKyAgICBjYXNlIDB4MDQ6IHJldHVybiBTQzBJQ1I7CisgICAgY2FzZSAweDA4OiByZXR1cm4gU0MwVFhCOworICAgIGNhc2UgMHgwOTogcmV0dXJuIFNDMFJYQjsKKyAgICBjYXNlIDB4MEM6IHJldHVybiBTQzBTVFI7CisgICAgY2FzZSAweDEwOiByZXR1cm4gU0MxQ1RSOworICAgIGNhc2UgMHgxNDogcmV0dXJuIFNDMUlDUjsKKyAgICBjYXNlIDB4MTg6IHJldHVybiBTQzFUWEI7CisgICAgY2FzZSAweDE5OiByZXR1cm4gU0MxUlhCOworICAgIGNhc2UgMHgxQzogcmV0dXJuIFNDMVNUUjsKKyAgICBjYXNlIDB4MjA6IHJldHVybiBTQzJDVFI7CisgICAgY2FzZSAweDI0OiByZXR1cm4gU0MySUNSOworICAgIGNhc2UgMHgyODogcmV0dXJuIFNDMlRYQjsKKyAgICBjYXNlIDB4Mjk6IHJldHVybiBTQzJSWEI7CisgICAgY2FzZSAweDJDOiByZXR1cm4gU0MyU1RSOworICAgIGNhc2UgMHgyRDogcmV0dXJuIFNDMlRJTTsKKyAgICBkZWZhdWx0OiAKKyAgICAgIHsKKwlod19hYm9ydCAobWUsICJiYWQgYWRkcmVzcyIpOworCXJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitkb19wb2xsaW5nX2V2ZW50IChzdHJ1Y3QgaHcgKm1lLAorCQkgIHZvaWQgKmRhdGEpCit7CisgIHN0cnVjdCBtbjEwM3NlciAqc2VyaWFsID0gaHdfZGF0YShtZSk7CisgIGludCBzZXJpYWxfcmVnID0gKGludCkgZGF0YTsKKyAgY2hhciBjOworICBpbnQgY291bnQ7CisKKyAgaWYoVVNFX1NPQ0tTRVJfUCkKKyAgICB7CisgICAgICBpbnQgcmQ7CisgICAgICByZCA9IGR2X3NvY2tzZXJfcmVhZCAoaHdfc3lzdGVtIChtZSkpOworICAgICAgaWYocmQgIT0gLTEpCisJeworCSAgYyA9IChjaGFyKSByZDsKKwkgIGNvdW50ID0gMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgY291bnQgPSBIV19JT19OT1RfUkVBRFk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNvdW50ID0gZG9faHdfcG9sbF9yZWFkIChtZSwgc2VyaWFsLT5yZWFkZXIsCisJCQkgICAgICAgMC8qU1RESU4qLywgJmMsIHNpemVvZihjKSk7CisgICAgfQorCisKKyAgc3dpdGNoIChjb3VudCkKKyAgICB7CisgICAgY2FzZSBIV19JT19OT1RfUkVBRFk6CisgICAgY2FzZSBIV19JT19FT0Y6CisgICAgICBzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS5yeGIgPSAwOworICAgICAgc2VyaWFsLT5kZXZpY2Vbc2VyaWFsX3JlZ10uc3RhdHVzICY9IH5TSU9fU1RBVF9SUkRZOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLnJ4YiA9IGM7CisgICAgICBzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS5zdGF0dXMgfD0gU0lPX1NUQVRfUlJEWTsKKyAgICAgIGh3X3BvcnRfZXZlbnQgKG1lLCBzZXJpYWxfcmVnK1NFUklBTDBfUkVDRUlWRSwgMSk7CisgICAgfQorCisgIC8qIFNjaGVkdWxlIG5leHQgcG9sbGluZyBldmVudCAqLworICBzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS5ldmVudAorICAgID0gaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUgKG1lLCAxMDAwLAorCQkJICAgICAgIGRvX3BvbGxpbmdfZXZlbnQsICh2b2lkICopc2VyaWFsX3JlZyk7CisKK30KKworc3RhdGljIHZvaWQKK3JlYWRfY29udHJvbF9yZWcgKHN0cnVjdCBodyAqbWUsCisJCSAgc3RydWN0IG1uMTAzc2VyICpzZXJpYWwsCisJCSAgdW5zaWduZWRfd29yZCBzZXJpYWxfcmVnLAorCQkgIHZvaWQgKmRlc3QsCisJCSAgdW5zaWduZWQgIG5yX2J5dGVzKQoreworICAvKiByZWFsbHkgYWxsb3cgMSBieXRlIHJlYWQsIHRvbyAqLworICBpZiAoIG5yX2J5dGVzID09IDIgKQorICAgIHsKKyAgICAgICoodW5zaWduZWQxNiAqKWRlc3QgPSBIMkxFXzIgKHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLmNvbnRyb2wpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGh3X2Fib3J0IChtZSwgImJhZCByZWFkIHNpemUgb2YgJWQgYnl0ZXMgZnJvbSBTQyVkQ1RSLiIsIG5yX2J5dGVzLCAKKwkJc2VyaWFsX3JlZyk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCityZWFkX2ludG1vZGVfcmVnIChzdHJ1Y3QgaHcgKm1lLAorCQkgIHN0cnVjdCBtbjEwM3NlciAqc2VyaWFsLAorCQkgIHVuc2lnbmVkX3dvcmQgc2VyaWFsX3JlZywKKwkJICB2b2lkICpkZXN0LAorCQkgIHVuc2lnbmVkICBucl9ieXRlcykKK3sKKyAgaWYgKCBucl9ieXRlcyA9PSAxICkKKyAgICB7CisgICAgICAqKHVuc2lnbmVkOCAqKWRlc3QgPSBzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS5pbnRtb2RlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGh3X2Fib3J0IChtZSwgImJhZCByZWFkIHNpemUgb2YgJWQgYnl0ZXMgZnJvbSBTQyVkSUNSLiIsIG5yX2J5dGVzLCAKKwkJc2VyaWFsX3JlZyk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCityZWFkX3R4YiAoc3RydWN0IGh3ICptZSwKKwkgIHN0cnVjdCBtbjEwM3NlciAqc2VyaWFsLAorCSAgdW5zaWduZWRfd29yZCBzZXJpYWxfcmVnLAorCSAgdm9pZCAqZGVzdCwKKwkgIHVuc2lnbmVkICBucl9ieXRlcykKK3sKKyAgaWYgKCBucl9ieXRlcyA9PSAxICkKKyAgICB7CisgICAgICAqKHVuc2lnbmVkOCAqKWRlc3QgPSBzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS50eGI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaHdfYWJvcnQgKG1lLCAiYmFkIHJlYWQgc2l6ZSBvZiAlZCBieXRlcyBmcm9tIFNDJWRUWEIuIiwgbnJfYnl0ZXMsIAorCQlzZXJpYWxfcmVnKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3JlYWRfcnhiIChzdHJ1Y3QgaHcgKm1lLAorCSAgc3RydWN0IG1uMTAzc2VyICpzZXJpYWwsCisJICB1bnNpZ25lZF93b3JkIHNlcmlhbF9yZWcsCisJICB2b2lkICpkZXN0LAorCSAgdW5zaWduZWQgIG5yX2J5dGVzKQoreworICBpZiAoIG5yX2J5dGVzID09IDEgKQorICAgIHsKKyAgICAgICoodW5zaWduZWQ4ICopZGVzdCA9IHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLnJ4YjsKKyAgICAgIC8qIFJlY2VwdGlvbiBidWZmZXIgaXMgbm93IGVtcHR5LiAqLworICAgICAgc2VyaWFsLT5kZXZpY2Vbc2VyaWFsX3JlZ10uc3RhdHVzICY9IH5TSU9fU1RBVF9SUkRZOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGh3X2Fib3J0IChtZSwgImJhZCByZWFkIHNpemUgb2YgJWQgYnl0ZXMgZnJvbSBTQyVkUlhCLiIsIG5yX2J5dGVzLCAKKwkJc2VyaWFsX3JlZyk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCityZWFkX3N0YXR1c19yZWcgKHN0cnVjdCBodyAqbWUsCisJCSBzdHJ1Y3QgbW4xMDNzZXIgKnNlcmlhbCwKKwkJIHVuc2lnbmVkX3dvcmQgc2VyaWFsX3JlZywKKwkJIHZvaWQgKmRlc3QsCisJCSB1bnNpZ25lZCAgbnJfYnl0ZXMpCit7CisgIGNoYXIgYzsKKyAgaW50IGNvdW50OworCisgIGlmICggKHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLnN0YXR1cyAmIFNJT19TVEFUX1JSRFkpID09IDAgKQorICAgIHsKKyAgICAgIC8qIEZJRk8gaXMgZW1wdHkgKi8KKyAgICAgIC8qIEtpbGwgY3VycmVudCBwb2xsIGV2ZW50ICovCisgICAgICBpZiAoIE5VTEwgIT0gc2VyaWFsLT5kZXZpY2Vbc2VyaWFsX3JlZ10uZXZlbnQgKQorCXsKKwkgIGh3X2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUgKG1lLCBzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS5ldmVudCk7CisJICBzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS5ldmVudCA9IE5VTEw7CisJfQorCisgICAgICBpZihVU0VfU09DS1NFUl9QKQorCXsKKwkgIGludCByZDsKKwkgIHJkID0gZHZfc29ja3Nlcl9yZWFkIChod19zeXN0ZW0gKG1lKSk7CisJICBpZihyZCAhPSAtMSkKKwkgICAgeworCSAgICAgIGMgPSAoY2hhcikgcmQ7CisJICAgICAgY291bnQgPSAxOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb3VudCA9IEhXX0lPX05PVF9SRUFEWTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBjb3VudCA9IGRvX2h3X3BvbGxfcmVhZCAobWUsIHNlcmlhbC0+cmVhZGVyLAorCQkJCSAgIDAvKlNURElOKi8sICZjLCBzaXplb2YoYykpOworCX0KKworICAgICAgc3dpdGNoIChjb3VudCkKKwl7CisJY2FzZSBIV19JT19OT1RfUkVBRFk6CisJY2FzZSBIV19JT19FT0Y6CisJICBzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS5yeGIgPSAwOworCSAgc2VyaWFsLT5kZXZpY2Vbc2VyaWFsX3JlZ10uc3RhdHVzICY9IH5TSU9fU1RBVF9SUkRZOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLnJ4YiA9IGM7CisJICBzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS5zdGF0dXMgfD0gU0lPX1NUQVRfUlJEWTsKKwkgIGh3X3BvcnRfZXZlbnQgKG1lLCBzZXJpYWxfcmVnK1NFUklBTDBfUkVDRUlWRSwgMSk7CisJfQorCisgICAgICAvKiBzY2hlZHVsZSBwb2xsaW5nIGV2ZW50ICovCisgICAgICBzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS5ldmVudAorCT0gaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUgKG1lLCAxMDAwLAorCQkJCSAgIGRvX3BvbGxpbmdfZXZlbnQsCisJCQkJICAgKHZvaWQgKilzZXJpYWxfcmVnKTsKKyAgICB9CisKKyAgaWYgKCBucl9ieXRlcyA9PSAxICkKKyAgICB7CisgICAgICAqKHVuc2lnbmVkOCAqKWRlc3QgPSAodW5zaWduZWQ4KXNlcmlhbC0+ZGV2aWNlW3NlcmlhbF9yZWddLnN0YXR1czsKKyAgICB9CisgIGVsc2UgaWYgKCBucl9ieXRlcyA9PSAyICYmIHNlcmlhbF9yZWcgIT0gU0MyU1RSICkKKyAgICB7CisgICAgICAqKHVuc2lnbmVkMTYgKilkZXN0ID0gSDJMRV8yIChzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS5zdGF0dXMpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGh3X2Fib3J0IChtZSwgImJhZCByZWFkIHNpemUgb2YgJWQgYnl0ZXMgZnJvbSBTQyVkU1RSLiIsIG5yX2J5dGVzLCAKKwkJc2VyaWFsX3JlZyk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCityZWFkX3NlcmlhbDJfdGltZXJfcmVnIChzdHJ1Y3QgaHcgKm1lLAorCQkJc3RydWN0IG1uMTAzc2VyICpzZXJpYWwsCisJCQl2b2lkICpkZXN0LAorCQkJdW5zaWduZWQgIG5yX2J5dGVzKQoreworICBpZiAoIG5yX2J5dGVzID09IDEgKQorICAgIHsKKyAgICAgICogKHVuc2lnbmVkOCAqKSBkZXN0ID0gKHVuc2lnbmVkOCkgc2VyaWFsLT5zZXJpYWwyX3RpbWVyX3JlZzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBod19hYm9ydCAobWUsICJiYWQgcmVhZCBzaXplIG9mICVkIGJ5dGVzIHRvIFNDMlRJTS4iLCBucl9ieXRlcyk7CisgICAgfQorfQorCisKK3N0YXRpYyB1bnNpZ25lZAorbW4xMDNzZXJfaW9fcmVhZF9idWZmZXIgKHN0cnVjdCBodyAqbWUsCisJCQkgdm9pZCAqZGVzdCwKKwkJCSBpbnQgc3BhY2UsCisJCQkgdW5zaWduZWRfd29yZCBiYXNlLAorCQkJIHVuc2lnbmVkIG5yX2J5dGVzKQoreworICBzdHJ1Y3QgbW4xMDNzZXIgKnNlcmlhbCA9IGh3X2RhdGEgKG1lKTsKKyAgZW51bSBzZXJpYWxfcmVnaXN0ZXJfdHlwZXMgc2VyaWFsX3JlZzsKKyAgSFdfVFJBQ0UgKChtZSwgInJlYWQgMHglMDhseCAlZCIsIChsb25nKSBiYXNlLCAoaW50KSBucl9ieXRlcykpOworCisgIHNlcmlhbF9yZWcgPSBkZWNvZGVfYWRkciAobWUsIHNlcmlhbCwgYmFzZSk7CisgIHN3aXRjaCAoc2VyaWFsX3JlZykKKyAgICB7CisgICAgLyogY29udHJvbCByZWdpc3RlcnMgKi8KKyAgICBjYXNlIFNDMENUUjoKKyAgICBjYXNlIFNDMUNUUjoKKyAgICBjYXNlIFNDMkNUUjoKKyAgICAgIHJlYWRfY29udHJvbF9yZWcobWUsIHNlcmlhbCwgc2VyaWFsX3JlZy1TQzBDVFIsIGRlc3QsIG5yX2J5dGVzKTsKKyAgICAgIEhXX1RSQUNFICgobWUsICJyZWFkIC0gY3RybCByZWclZCBoYXMgMHgleFxuIiwgc2VyaWFsX3JlZy1TQzBDVFIsCisJCSAqKHVuc2lnbmVkOCAqKWRlc3QpKTsKKyAgICAgIGJyZWFrOworCisgICAgLyogaW50ZXJydXB0IG1vZGUgcmVnaXN0ZXJzICovCisgICAgY2FzZSBTQzBJQ1I6CisgICAgY2FzZSBTQzFJQ1I6CisgICAgY2FzZSBTQzJJQ1I6CisgICAgICByZWFkX2ludG1vZGVfcmVnKG1lLCBzZXJpYWwsIHNlcmlhbF9yZWctU0MwSUNSLCBkZXN0LCBucl9ieXRlcyk7CisgICAgICBIV19UUkFDRSAoKG1lLCAicmVhZCAtIGludG1vZGUgcmVnJWQgaGFzIDB4JXhcbiIsIHNlcmlhbF9yZWctU0MwSUNSLAorCQkgKih1bnNpZ25lZDggKilkZXN0KSk7CisgICAgICBicmVhazsKKworICAgIC8qIHRyYW5zbWlzc2lvbiBidWZmZXJzICovCisgICAgY2FzZSBTQzBUWEI6CisgICAgY2FzZSBTQzFUWEI6CisgICAgY2FzZSBTQzJUWEI6CisgICAgICByZWFkX3R4YihtZSwgc2VyaWFsLCBzZXJpYWxfcmVnLVNDMFRYQiwgZGVzdCwgbnJfYnl0ZXMpOworICAgICAgSFdfVFJBQ0UgKChtZSwgInJlYWQgLSB0eGIlZCBoYXMgJWNcbiIsIHNlcmlhbF9yZWctU0MwVFhCLAorCQkgKihjaGFyICopZGVzdCkpOworICAgICAgYnJlYWs7CisKKyAgICAvKiByZWNlcHRpb24gYnVmZmVycyAqLworICAgIGNhc2UgU0MwUlhCOiAKKyAgICBjYXNlIFNDMVJYQjoKKyAgICBjYXNlIFNDMlJYQjoKKyAgICAgIHJlYWRfcnhiKG1lLCBzZXJpYWwsIHNlcmlhbF9yZWctU0MwUlhCLCBkZXN0LCBucl9ieXRlcyk7CisgICAgICBIV19UUkFDRSAoKG1lLCAicmVhZCAtIHJ4YiVkIGhhcyAlY1xuIiwgc2VyaWFsX3JlZy1TQzBSWEIsCisJCSAqKGNoYXIgKilkZXN0KSk7CisgICAgIGJyZWFrOworCisgICAgLyogc3RhdHVzIHJlZ2lzdGVycyAqLworICAgIGNhc2UgU0MwU1RSOiAKKyAgICBjYXNlIFNDMVNUUjogCisgICAgY2FzZSBTQzJTVFI6IAorICAgICAgcmVhZF9zdGF0dXNfcmVnKG1lLCBzZXJpYWwsIHNlcmlhbF9yZWctU0MwU1RSLCBkZXN0LCBucl9ieXRlcyk7CisgICAgICBIV19UUkFDRSAoKG1lLCAicmVhZCAtIHN0YXR1cyByZWclZCBoYXMgMHgleFxuIiwgc2VyaWFsX3JlZy1TQzBTVFIsCisJCSAqKHVuc2lnbmVkOCAqKWRlc3QpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTQzJUSU06CisgICAgICByZWFkX3NlcmlhbDJfdGltZXJfcmVnKG1lLCBzZXJpYWwsIGRlc3QsIG5yX2J5dGVzKTsKKyAgICAgIEhXX1RSQUNFICgobWUsICJyZWFkIC0gc2VyaWFsMiB0aW1lciByZWcgJWRcbiIsICoodW5zaWduZWQ4ICopZGVzdCkpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgaHdfYWJvcnQobWUsICJpbnZhbGlkIGFkZHJlc3MiKTsKKyAgICB9CisKKyAgcmV0dXJuIG5yX2J5dGVzOworfSAgICAgCisKKworc3RhdGljIHZvaWQKK3dyaXRlX2NvbnRyb2xfcmVnIChzdHJ1Y3QgaHcgKm1lLAorCQkgICBzdHJ1Y3QgbW4xMDNzZXIgKnNlcmlhbCwKKwkJICAgdW5zaWduZWRfd29yZCBzZXJpYWxfcmVnLAorCQkgICBjb25zdCB2b2lkICpzb3VyY2UsCisJCSAgIHVuc2lnbmVkICBucl9ieXRlcykKK3sKKyAgdW5zaWduZWQxNiB2YWwgPSBMRTJIXzIgKCoodW5zaWduZWQxNiAqKXNvdXJjZSk7CisKKyAgLyogcmVhbGx5IGFsbG93IDEgYnl0ZSB3cml0ZSwgdG9vICovCisgIGlmICggbnJfYnl0ZXMgPT0gMiApCisgICAgeworICAgICAgaWYgKCBzZXJpYWxfcmVnID09IDIgJiYgKHZhbCAmIDB4MEMwNCkgIT0gMCApCisJeworCSAgaHdfYWJvcnQobWUsICJDYW5ub3Qgd3JpdGUgdG8gcmVhZC1vbmx5IGJpdHMgb2YgU0MyQ1RSLiIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS5jb250cm9sID0gdmFsOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBod19hYm9ydCAobWUsICJiYWQgcmVhZCBzaXplIG9mICVkIGJ5dGVzIGZyb20gU0MlZFNUUi4iLCBucl9ieXRlcywgCisJCXNlcmlhbF9yZWcpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAord3JpdGVfaW50bW9kZV9yZWcgKHN0cnVjdCBodyAqbWUsCisJCSAgIHN0cnVjdCBtbjEwM3NlciAqc2VyaWFsLAorCQkgICB1bnNpZ25lZF93b3JkIHNlcmlhbF9yZWcsCisJCSAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKKwkJICAgdW5zaWduZWQgIG5yX2J5dGVzKQorewordW5zaWduZWQ4IHZhbCA9ICoodW5zaWduZWQ4ICopc291cmNlOworCisgIGlmICggbnJfYnl0ZXMgPT0gMSApCisgICAgeworICAgICAgLyogQ2hlY2sgZm9yIGF0dGVtcHQgdG8gd3JpdGUgdG8gcmVhZC1vbmx5IGJpdHMgb2YgcmVnaXN0ZXIuICovCisgICAgICBpZiAoICggc2VyaWFsX3JlZyA9PSAyICYmICh2YWwgJiAweENBKSAhPSAwICkKKwkgICB8fCAoIHNlcmlhbF9yZWcgIT0gMiAmJiAodmFsICYgMHg0QSkgIT0gMCApICkKKwl7CisJICBod19hYm9ydChtZSwgIkNhbm5vdCB3cml0ZSB0byByZWFkLW9ubHkgYml0cyBvZiBTQyVkSUNSLiIsCisJCSAgIHNlcmlhbF9yZWcpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzZXJpYWwtPmRldmljZVtzZXJpYWxfcmVnXS5pbnRtb2RlID0gdmFsOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBod19hYm9ydCAobWUsICJiYWQgd3JpdGUgc2l6ZSBvZiAlZCBieXRlcyB0byBTQyVkSUNSLiIsIG5yX2J5dGVzLCAKKwkJc2VyaWFsX3JlZyk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCit3cml0ZV90eGIgKHN0cnVjdCBodyAqbWUsCisJICAgc3RydWN0IG1uMTAzc2VyICpzZXJpYWwsCisJICAgdW5zaWduZWRfd29yZCBzZXJpYWxfcmVnLAorCSAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKKwkgICB1bnNpZ25lZCAgbnJfYnl0ZXMpCit7CisgIGlmICggbnJfYnl0ZXMgPT0gMSApCisgICAgeworICAgICAgc2VyaWFsLT5kZXZpY2Vbc2VyaWFsX3JlZ10udHhiID0gKih1bnNpZ25lZDggKilzb3VyY2U7CisKKyAgICAgIGlmKFVTRV9TT0NLU0VSX1ApCisJeworCSAgZHZfc29ja3Nlcl93cml0ZShod19zeXN0ZW0gKG1lKSwgKiAoY2hhciopIHNvdXJjZSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHNpbV9pb193cml0ZV9zdGRvdXQoaHdfc3lzdGVtIChtZSksIChjaGFyICopc291cmNlLCAxKTsKKwkgIHNpbV9pb19mbHVzaF9zdGRvdXQoaHdfc3lzdGVtIChtZSkpOworCX0KKworICAgICAgaHdfcG9ydF9ldmVudCAobWUsIHNlcmlhbF9yZWcrU0VSSUFMMF9TRU5ELCAxKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBod19hYm9ydCAobWUsICJiYWQgd3JpdGUgc2l6ZSBvZiAlZCBieXRlcyB0byBTQyVkVFhCLiIsIG5yX2J5dGVzLCAKKwkJc2VyaWFsX3JlZyk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCit3cml0ZV9zZXJpYWwyX3RpbWVyX3JlZyAoc3RydWN0IGh3ICptZSwKKwkJCSBzdHJ1Y3QgbW4xMDNzZXIgKnNlcmlhbCwKKwkJCSBjb25zdCB2b2lkICpzb3VyY2UsCisJCQkgdW5zaWduZWQgIG5yX2J5dGVzKQoreworICBpZiAoIG5yX2J5dGVzID09IDEgKQorICAgIHsKKyAgICAgIHNlcmlhbC0+c2VyaWFsMl90aW1lcl9yZWcgPSAqKHVuc2lnbmVkOCAqKXNvdXJjZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBod19hYm9ydCAobWUsICJiYWQgd3JpdGUgc2l6ZSBvZiAlZCBieXRlcyB0byBTQzJUSU0uIiwgbnJfYnl0ZXMpOyAKKyAgICB9Cit9CisKKworc3RhdGljIHVuc2lnbmVkCittbjEwM3Nlcl9pb193cml0ZV9idWZmZXIgKHN0cnVjdCBodyAqbWUsCisJCQkgIGNvbnN0IHZvaWQgKnNvdXJjZSwKKwkJCSAgaW50IHNwYWNlLAorCQkJICB1bnNpZ25lZF93b3JkIGJhc2UsCisJCQkgIHVuc2lnbmVkIG5yX2J5dGVzKQoreworICBzdHJ1Y3QgbW4xMDNzZXIgKnNlcmlhbCA9IGh3X2RhdGEgKG1lKTsKKyAgZW51bSBzZXJpYWxfcmVnaXN0ZXJfdHlwZXMgc2VyaWFsX3JlZzsKKyAgSFdfVFJBQ0UgKChtZSwgIndyaXRlIDB4JTA4bHggJWQiLCAobG9uZykgYmFzZSwgKGludCkgbnJfYnl0ZXMpKTsKKworICBzZXJpYWxfcmVnID0gZGVjb2RlX2FkZHIgKG1lLCBzZXJpYWwsIGJhc2UpOworICBzd2l0Y2ggKHNlcmlhbF9yZWcpCisgICAgeworICAgIC8qIGNvbnRyb2wgcmVnaXN0ZXJzICovCisgICAgY2FzZSBTQzBDVFI6CisgICAgY2FzZSBTQzFDVFI6CisgICAgY2FzZSBTQzJDVFI6CisgICAgICBIV19UUkFDRSAoKG1lLCAid3JpdGUgLSBjdHJsIHJlZyVkIGhhcyAweCV4LCBucmJ5dGVzPSVkLlxuIiwKKwkJIHNlcmlhbF9yZWctU0MwQ1RSLCAqKHVuc2lnbmVkOCAqKXNvdXJjZSwgbnJfYnl0ZXMpKTsKKyAgICAgIHdyaXRlX2NvbnRyb2xfcmVnKG1lLCBzZXJpYWwsIHNlcmlhbF9yZWctU0MwQ1RSLCBzb3VyY2UsIG5yX2J5dGVzKTsKKyAgICAgIGJyZWFrOworCisgICAgLyogaW50ZXJydXB0IG1vZGUgcmVnaXN0ZXJzICovCisgICAgY2FzZSBTQzBJQ1I6CisgICAgY2FzZSBTQzFJQ1I6CisgICAgY2FzZSBTQzJJQ1I6CisgICAgICBIV19UUkFDRSAoKG1lLCAid3JpdGUgLSBpbnRtb2RlIHJlZyVkIGhhcyAweCV4LCBucmJ5dGVzPSVkLlxuIiwKKwkJIHNlcmlhbF9yZWctU0MwSUNSLCAqKHVuc2lnbmVkOCAqKXNvdXJjZSwgbnJfYnl0ZXMpKTsKKyAgICAgIHdyaXRlX2ludG1vZGVfcmVnKG1lLCBzZXJpYWwsIHNlcmlhbF9yZWctU0MwSUNSLCBzb3VyY2UsIG5yX2J5dGVzKTsKKyAgICAgIGJyZWFrOworCisgICAgLyogdHJhbnNtaXNzaW9uIGJ1ZmZlcnMgKi8KKyAgICBjYXNlIFNDMFRYQjoKKyAgICBjYXNlIFNDMVRYQjoKKyAgICBjYXNlIFNDMlRYQjoKKyAgICAgIEhXX1RSQUNFICgobWUsICJ3cml0ZSAtIHR4YiVkIGhhcyAlYywgbnJieXRlcz0lZC5cbiIsCisJCSBzZXJpYWxfcmVnLVNDMFRYQiwgKihjaGFyICopc291cmNlLCBucl9ieXRlcykpOworICAgICAgd3JpdGVfdHhiKG1lLCBzZXJpYWwsIHNlcmlhbF9yZWctU0MwVFhCLCBzb3VyY2UsIG5yX2J5dGVzKTsKKyAgICAgIGJyZWFrOworCisgICAgLyogcmVjZXB0aW9uIGJ1ZmZlcnMgKi8KKyAgICBjYXNlIFNDMFJYQjogCisgICAgY2FzZSBTQzFSWEI6CisgICAgY2FzZSBTQzJSWEI6CisgICAgICBod19hYm9ydChtZSwgIkNhbm5vdCB3cml0ZSB0byByZWNlcHRpb24gYnVmZmVyLiIpOworICAgICBicmVhazsKKworICAgIC8qIHN0YXR1cyByZWdpc3RlcnMgKi8KKyAgICBjYXNlIFNDMFNUUjogCisgICAgY2FzZSBTQzFTVFI6IAorICAgIGNhc2UgU0MyU1RSOiAKKyAgICAgIGh3X2Fib3J0KG1lLCAiQ2Fubm90IHdyaXRlIHRvIHN0YXR1cyByZWdpc3Rlci4iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTQzJUSU06CisgICAgICBIV19UUkFDRSAoKG1lLCAicmVhZCAtIHNlcmlhbDIgdGltZXIgcmVnICVkIChucmJ5dGVzPSVkKVxuIiwKKwkJICoodW5zaWduZWQ4ICopc291cmNlLCBucl9ieXRlcykpOworICAgICAgd3JpdGVfc2VyaWFsMl90aW1lcl9yZWcobWUsIHNlcmlhbCwgc291cmNlLCBucl9ieXRlcyk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBod19hYm9ydChtZSwgImludmFsaWQgYWRkcmVzcyIpOworICAgIH0KKworICByZXR1cm4gbnJfYnl0ZXM7Cit9ICAgICAKKworCitjb25zdCBzdHJ1Y3QgaHdfZGVzY3JpcHRvciBkdl9tbjEwM3Nlcl9kZXNjcmlwdG9yW10gPSB7CisgIHsgIm1uMTAzc2VyIiwgbW4xMDNzZXJfZmluaXNoLCB9LAorICB7IE5VTEwgfSwKK307CmRpZmYgLS1naXQgYS9zaW0vbW4xMDMwMC9kdi1tbjEwM3RpbS5jIGIvc2ltL21uMTAzMDAvZHYtbW4xMDN0aW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTNiYjcxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL21uMTAzMDAvZHYtbW4xMDN0aW0uYwpAQCAtMCwwICsxLDEwMzIgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBHREIsIHRoZSBHTlUgZGVidWdnZXIuCisgICAgCisgICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTb2x1dGlvbnMuCisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICAgIAorICAgICovCisKKyNpbmNsdWRlICJzaW0tbWFpbi5oIgorI2luY2x1ZGUgImh3LW1haW4uaCIKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisKKy8qIERFVklDRQorCisgICAKKyAgIG1uMTAzdGltIC0gbW4xMDMwMDIgdGltZXJzICg4IGFuZCAxNiBiaXQpCisKKyAgIAorICAgREVTQ1JJUFRJT04KKyAgIAorICAgSW1wbGVtZW50cyB0aGUgbW4xMDMwMDIgOCBhbmQgMTYgYml0IHRpbWVycyBhcyBkZXNjcmliZWQgaW4gdGhlIG1uMTAzMDAyIHVzZXIgZ3VpZGUuCisKKworICAgUFJPUEVSVElFUyAgIAorCisgICByZWcgPSA8OGJpdC10aW1lcnMtYWRkcj4gPDhiaXQtdGltZXJzLXNpemU+IDwxNmJpdC10aW1lcnMtYWRkcj4gPDE2Yml0LXRpbWVycy1zaXplPgorCisKKyAgIEJVR1MKKworICAgKi8KKworCisvKiBUaGUgdGltZXJzJyByZWdpc3RlciBhZGRyZXNzIGJsb2NrcyAqLworCitzdHJ1Y3QgbW4xMDN0aW1fYmxvY2sgeworICB1bnNpZ25lZF93b3JkIGJhc2U7CisgIHVuc2lnbmVkX3dvcmQgYm91bmQ7Cit9OworCitlbnVtIHsgVElNRVI4X0JMT0NLLCBUSU1FUjE2X0JMT0NLLCBOUl9USU1FUl9CTE9DS1MgfTsKKworZW51bSB0aW1lcl9yZWdpc3Rlcl90eXBlcyB7CisgIEZJUlNUX01PREVfUkVHID0gMCwKKyAgVE0wTUQgPSBGSVJTVF9NT0RFX1JFRywKKyAgVE0xTUQsCisgIFRNMk1ELAorICBUTTNNRCwKKyAgVE00TUQsCisgIFRNNU1ELAorICBUTTZNRCwKKyAgTEFTVF9NT0RFX1JFRyA9IFRNNk1ELAorICBGSVJTVF9CQVNFX1JFRywKKyAgVE0wQlIgPSBGSVJTVF9CQVNFX1JFRywKKyAgVE0xQlIsCisgIFRNMkJSLAorICBUTTNCUiwKKyAgVE00QlIsCisgIFRNNUJSLAorICBMQVNUX0JBU0VfUkVHID0gVE01QlIsCisgIEZJUlNUX0NPVU5URVIsCisgIFRNMEJDID0gRklSU1RfQ09VTlRFUiwKKyAgVE0xQkMsCisgIFRNMkJDLAorICBUTTNCQywKKyAgVE00QkMsCisgIFRNNUJDLAorICBUTTZCQywKKyAgTEFTVF9DT1VOVEVSID0gVE02QkMsCisgIFRNNk1EQSwKKyAgVE02TURCLAorICBUTTZDQSwKKyAgVE02Q0IsCisgIExBU1RfVElNRVJfUkVHID0gVE02QkMsCit9OworCisKKy8qIERvbid0IGluY2x1ZGUgdGltZXIgNiBiZWNhdXNlIGl0J3MgaGFuZGxlZCBzcGVjaWFsbHkuICovCisjZGVmaW5lIE5SXzhCSVRfVElNRVJTIDQKKyNkZWZpbmUgTlJfMTZCSVRfVElNRVJTIDIKKyNkZWZpbmUgTlJfUkVHX1RJTUVSUyA2IC8qIEV4Y2x1ZGUgdGltZXIgNiAtIGl0J3MgaGFuZGxlZCBzcGVjaWFsbHkuICovCisjZGVmaW5lIE5SX1RJTUVSUyA3CisKK3R5cGVkZWYgc3RydWN0IF9tbjEwMzAwX3RpbWVyX3JlZ3MgeworICB1bnNpZ25lZDMyIGJhc2U7CisgIHVuc2lnbmVkOCAgbW9kZTsKK30gbW4xMDMwMF90aW1lcl9yZWdzOworCit0eXBlZGVmIHN0cnVjdCBfbW4xMDMwMF90aW1lciB7CisgIHVuc2lnbmVkMzIgZGl2X3JhdGlvLCBzdGFydDsKKyAgc3RydWN0IGh3X2V2ZW50ICpldmVudDsKK30gbW4xMDMwMF90aW1lcjsKKworCitzdHJ1Y3QgbW4xMDN0aW0geworICBzdHJ1Y3QgbW4xMDN0aW1fYmxvY2sgYmxvY2tbTlJfVElNRVJfQkxPQ0tTXTsKKyAgbW4xMDMwMF90aW1lcl9yZWdzIHJlZ1tOUl9SRUdfVElNRVJTXTsKKyAgbW4xMDMwMF90aW1lciB0aW1lcltOUl9USU1FUlNdOworCisgIC8qIHRyZWF0IHRpbWVyIDYgcmVnaXN0ZXJzIHNwZWNpYWxseS4gKi8KKyAgdW5zaWduZWQxNiAgIHRtNm1kMCwgdG02bWQxLCB0bTZiYywgdG02Y2EsIHRtNmNiOyAKKyAgdW5zaWduZWQ4ICB0bTZtZGEsIHRtNm1kYjsgIC8qIGNvbXBhcmUvY2FwdHVyZSBtb2RlIHJlZ3MgZm9yIHRpbWVyIDYgKi8KK307CisKKy8qIG91dHB1dCBwb3J0IElEJ3MgKi8KKworLyogZm9yIG1uMTAzMDAyICovCitlbnVtIHsKKyAgVElNRVIwX1VGTE9XLAorICBUSU1FUjFfVUZMT1csCisgIFRJTUVSMl9VRkxPVywKKyAgVElNRVIzX1VGTE9XLAorICBUSU1FUjRfVUZMT1csCisgIFRJTUVSNV9VRkxPVywKKyAgVElNRVI2X1VGTE9XLAorICBUSU1FUjZfQ01QQSwKKyAgVElNRVI2X0NNUEIsCit9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdfcG9ydF9kZXNjcmlwdG9yIG1uMTAzdGltX3BvcnRzW10gPSB7CisKKyAgeyAidGltZXItMC11bmRlcmZsb3ciLCBUSU1FUjBfVUZMT1csIDAsIG91dHB1dF9wb3J0LCB9LAorICB7ICJ0aW1lci0xLXVuZGVyZmxvdyIsIFRJTUVSMV9VRkxPVywgMCwgb3V0cHV0X3BvcnQsIH0sCisgIHsgInRpbWVyLTItdW5kZXJmbG93IiwgVElNRVIyX1VGTE9XLCAwLCBvdXRwdXRfcG9ydCwgfSwKKyAgeyAidGltZXItMy11bmRlcmZsb3ciLCBUSU1FUjNfVUZMT1csIDAsIG91dHB1dF9wb3J0LCB9LAorICB7ICJ0aW1lci00LXVuZGVyZmxvdyIsIFRJTUVSNF9VRkxPVywgMCwgb3V0cHV0X3BvcnQsIH0sCisgIHsgInRpbWVyLTUtdW5kZXJmbG93IiwgVElNRVI1X1VGTE9XLCAwLCBvdXRwdXRfcG9ydCwgfSwKKworICB7ICJ0aW1lci02LXVuZGVyZmxvdyIsIFRJTUVSNl9VRkxPVywgMCwgb3V0cHV0X3BvcnQsIH0sCisgIHsgInRpbWVyLTYtY29tcGFyZS1hIiwgVElNRVI2X0NNUEEsIDAsIG91dHB1dF9wb3J0LCB9LAorICB7ICJ0aW1lci02LWNvbXBhcmUtYiIsIFRJTUVSNl9DTVBCLCAwLCBvdXRwdXRfcG9ydCwgfSwKKworICB7IE5VTEwsIH0sCit9OworCisjZGVmaW5lIGJpdHMydG81X21hc2sgMHgzYworI2RlZmluZSBiaXRzMHRvMl9tYXNrIDB4MDcKKyNkZWZpbmUgbG9hZF9tYXNrICAgICAweDQwCisjZGVmaW5lIGNvdW50X21hc2sgICAgMHg4MAorI2RlZmluZSBjb3VudF9hbmRfbG9hZF9tYXNrIChsb2FkX21hc2sgfCBjb3VudF9tYXNrKQorI2RlZmluZSBjbG9ja19tYXNrICAgIDB4MDMKKyNkZWZpbmUgY2xrX2lvY2xrICAgIDB4MDAKKyNkZWZpbmUgY2xrX2Nhc2NhZGVkIDB4MDMKKworCisvKiBGaW5pc2ggb2ZmIHRoZSBwYXJ0aWFsbHkgY3JlYXRlZCBodyBkZXZpY2UuICBBdHRhY2ggb3VyIGxvY2FsCisgICBjYWxsYmFja3MuICBXaXJlIHVwIG91ciBwb3J0IG5hbWVzIGV0YyAqLworCitzdGF0aWMgaHdfaW9fcmVhZF9idWZmZXJfbWV0aG9kIG1uMTAzdGltX2lvX3JlYWRfYnVmZmVyOworc3RhdGljIGh3X2lvX3dyaXRlX2J1ZmZlcl9tZXRob2QgbW4xMDN0aW1faW9fd3JpdGVfYnVmZmVyOworCitzdGF0aWMgdm9pZAorYXR0YWNoX21uMTAzdGltX3JlZ3MgKHN0cnVjdCBodyAqbWUsCisJCSAgICAgIHN0cnVjdCBtbjEwM3RpbSAqdGltZXJzKQoreworICBpbnQgaTsKKyAgaWYgKGh3X2ZpbmRfcHJvcGVydHkgKG1lLCAicmVnIikgPT0gTlVMTCkKKyAgICBod19hYm9ydCAobWUsICJNaXNzaW5nIFwicmVnXCIgcHJvcGVydHkiKTsKKyAgZm9yIChpID0gMDsgaSA8IE5SX1RJTUVSX0JMT0NLUzsgaSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkX3dvcmQgYXR0YWNoX2FkZHJlc3M7CisgICAgICBpbnQgYXR0YWNoX3NwYWNlOworICAgICAgdW5zaWduZWQgYXR0YWNoX3NpemU7CisgICAgICByZWdfcHJvcGVydHlfc3BlYyByZWc7CisgICAgICBpZiAoIWh3X2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5IChtZSwgInJlZyIsIGksICZyZWcpKQorCWh3X2Fib3J0IChtZSwgIlwicmVnXCIgcHJvcGVydHkgbXVzdCBjb250YWluIHRocmVlIGFkZHIvc2l6ZSBlbnRyaWVzIik7CisgICAgICBod191bml0X2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MgKGh3X3BhcmVudCAobWUpLAorCQkJCQkgJnJlZy5hZGRyZXNzLAorCQkJCQkgJmF0dGFjaF9zcGFjZSwKKwkJCQkJICZhdHRhY2hfYWRkcmVzcywKKwkJCQkJIG1lKTsKKyAgICAgIHRpbWVycy0+YmxvY2tbaV0uYmFzZSA9IGF0dGFjaF9hZGRyZXNzOworICAgICAgaHdfdW5pdF9zaXplX3RvX2F0dGFjaF9zaXplIChod19wYXJlbnQgKG1lKSwKKwkJCQkgICAmcmVnLnNpemUsCisJCQkJICAgJmF0dGFjaF9zaXplLCBtZSk7CisgICAgICB0aW1lcnMtPmJsb2NrW2ldLmJvdW5kID0gYXR0YWNoX2FkZHJlc3MgKyAoYXR0YWNoX3NpemUgLSAxKTsKKyAgICAgIGh3X2F0dGFjaF9hZGRyZXNzIChod19wYXJlbnQgKG1lKSwKKwkJCSAwLAorCQkJIGF0dGFjaF9zcGFjZSwgYXR0YWNoX2FkZHJlc3MsIGF0dGFjaF9zaXplLAorCQkJIG1lKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCittbjEwM3RpbV9maW5pc2ggKHN0cnVjdCBodyAqbWUpCit7CisgIHN0cnVjdCBtbjEwM3RpbSAqdGltZXJzOworICBpbnQgaTsKKworICB0aW1lcnMgPSBIV19aQUxMT0MgKG1lLCBzdHJ1Y3QgbW4xMDN0aW0pOworICBzZXRfaHdfZGF0YSAobWUsIHRpbWVycyk7CisgIHNldF9od19pb19yZWFkX2J1ZmZlciAobWUsIG1uMTAzdGltX2lvX3JlYWRfYnVmZmVyKTsKKyAgc2V0X2h3X2lvX3dyaXRlX2J1ZmZlciAobWUsIG1uMTAzdGltX2lvX3dyaXRlX2J1ZmZlcik7CisgIHNldF9od19wb3J0cyAobWUsIG1uMTAzdGltX3BvcnRzKTsKKworICAvKiBBdHRhY2ggb3Vyc2VsZiB0byBvdXIgcGFyZW50IGJ1cyAqLworICBhdHRhY2hfbW4xMDN0aW1fcmVncyAobWUsIHRpbWVycyk7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgdGltZXJzICovCisgIGZvciAoIGk9MDsgaSA8IE5SX1JFR19USU1FUlM7ICsraSApCisgICAgeworICAgICAgdGltZXJzLT5yZWdbaV0ubW9kZSA9IDB4MDA7CisgICAgICB0aW1lcnMtPnJlZ1tpXS5iYXNlID0gMDsKKyAgICB9CisgIGZvciAoIGk9MDsgaSA8IE5SX1RJTUVSUzsgKytpICkKKyAgICB7CisgICAgICB0aW1lcnMtPnRpbWVyW2ldLmV2ZW50ID0gTlVMTDsKKyAgICAgIHRpbWVycy0+dGltZXJbaV0uZGl2X3JhdGlvID0gMDsKKyAgICAgIHRpbWVycy0+dGltZXJbaV0uc3RhcnQgPSAwOworICAgIH0KKyAgdGltZXJzLT50bTZtZDAgPSAweDAwOworICB0aW1lcnMtPnRtNm1kMSA9IDB4MDA7CisgIHRpbWVycy0+dG02YmMgPSAweDAwMDA7CisgIHRpbWVycy0+dG02Y2EgPSAweDAwMDA7CisgIHRpbWVycy0+dG02Y2IgPSAweDAwMDA7CisgIHRpbWVycy0+dG02bWRhID0gMHgwMDsKKyAgdGltZXJzLT50bTZtZGIgPSAweDAwOworfQorCisKKworLyogcmVhZCBhbmQgd3JpdGUgKi8KKworc3RhdGljIGludAorZGVjb2RlX2FkZHIgKHN0cnVjdCBodyAqbWUsCisJICAgICBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycywKKwkgICAgIHVuc2lnbmVkX3dvcmQgYWRkcmVzcykKK3sKKyAgdW5zaWduZWRfd29yZCBvZmZzZXQ7CisgIG9mZnNldCA9IGFkZHJlc3MgLSB0aW1lcnMtPmJsb2NrWzBdLmJhc2U7CisKKyAgc3dpdGNoIChvZmZzZXQpCisgICAgeworICAgIGNhc2UgMHgwMDogcmV0dXJuIFRNME1EOworICAgIGNhc2UgMHgwMTogcmV0dXJuIFRNMU1EOworICAgIGNhc2UgMHgwMjogcmV0dXJuIFRNMk1EOworICAgIGNhc2UgMHgwMzogcmV0dXJuIFRNM01EOworICAgIGNhc2UgMHgxMDogcmV0dXJuIFRNMEJSOworICAgIGNhc2UgMHgxMTogcmV0dXJuIFRNMUJSOworICAgIGNhc2UgMHgxMjogcmV0dXJuIFRNMkJSOworICAgIGNhc2UgMHgxMzogcmV0dXJuIFRNM0JSOworICAgIGNhc2UgMHgyMDogcmV0dXJuIFRNMEJDOworICAgIGNhc2UgMHgyMTogcmV0dXJuIFRNMUJDOworICAgIGNhc2UgMHgyMjogcmV0dXJuIFRNMkJDOworICAgIGNhc2UgMHgyMzogcmV0dXJuIFRNM0JDOworICAgIGNhc2UgMHg4MDogcmV0dXJuIFRNNE1EOworICAgIGNhc2UgMHg4MjogcmV0dXJuIFRNNU1EOworICAgIGNhc2UgMHg4NDogLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSAweDg1OiByZXR1cm4gVE02TUQ7CisgICAgY2FzZSAweDkwOiByZXR1cm4gVE00QlI7CisgICAgY2FzZSAweDkyOiByZXR1cm4gVE01QlI7CisgICAgY2FzZSAweGEwOiByZXR1cm4gVE00QkM7CisgICAgY2FzZSAweGEyOiByZXR1cm4gVE01QkM7CisgICAgY2FzZSAweGE0OiByZXR1cm4gVE02QkM7CisgICAgY2FzZSAweGI0OiByZXR1cm4gVE02TURBOworICAgIGNhc2UgMHhiNTogcmV0dXJuIFRNNk1EQjsKKyAgICBjYXNlIDB4YzQ6IHJldHVybiBUTTZDQTsKKyAgICBjYXNlIDB4ZDQ6IHJldHVybiBUTTZDQjsKKyAgICBkZWZhdWx0OiAKKyAgICAgIHsKKwlod19hYm9ydCAobWUsICJiYWQgYWRkcmVzcyIpOworCXJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCityZWFkX21vZGVfcmVnIChzdHJ1Y3QgaHcgKm1lLAorCSAgICAgICBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycywKKwkgICAgICAgaW50IHRpbWVyX25yLAorCSAgICAgICB2b2lkICpkZXN0LAorCSAgICAgICB1bnNpZ25lZCBucl9ieXRlcykKK3sKKyAgdW5zaWduZWQxNiB2YWwxNjsKKyAgdW5zaWduZWQzMiB2YWwzMjsKKworICBzd2l0Y2ggKCBucl9ieXRlcyApCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIC8qIEFjY2Vzc2luZyAxIGJ5dGUgaXMgb2sgZm9yIGFsbCBtb2RlIHJlZ2lzdGVycy4gKi8KKyAgICAgIGlmICggdGltZXJfbnIgPT0gNiApCisJeworCSAgKih1bnNpZ25lZDgqKWRlc3QgPSB0aW1lcnMtPnRtNm1kMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgKih1bnNpZ25lZDgqKWRlc3QgPSB0aW1lcnMtPnJlZ1t0aW1lcl9ucl0ubW9kZTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgMjoKKyAgICAgIGlmICggdGltZXJfbnIgPT0gNiApCisJeworCSAgKih1bnNpZ25lZDE2ICopZGVzdCA9ICh0aW1lcnMtPnRtNm1kMCA8PCA4KSB8IHRpbWVycy0+dG02bWQxOworCX0KKyAgICAgIGVsc2UgaWYgKCB0aW1lcl9uciA9PSAwIHx8IHRpbWVyX25yID09IDIgKQorCXsKKwkgIHZhbDE2ID0gKHRpbWVycy0+cmVnW3RpbWVyX25yXS5tb2RlIDw8IDgpCisJICAgIHwgdGltZXJzLT5yZWdbdGltZXJfbnIrMV0ubW9kZTsKKwkgICoodW5zaWduZWQxNiopZGVzdCA9IHZhbDE2OworCX0KKyAgICAgIGVsc2UKKwl7CisJICBod19hYm9ydCAobWUsICJiYWQgcmVhZCBzaXplIG9mIDIgYnl0ZXMgdG8gVE0lZE1ELiIsIHRpbWVyX25yKTsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgNDoKKyAgICAgIGlmICggdGltZXJfbnIgPT0gMCApCisJeworCSAgdmFsMzIgPSAodGltZXJzLT5yZWdbMF0ubW9kZSA8PCAyNCApCisJICAgIHwgKHRpbWVycy0+cmVnWzFdLm1vZGUgPDwgMTYpCisJICAgIHwgKHRpbWVycy0+cmVnWzJdLm1vZGUgPDwgOCkKKwkgICAgfCB0aW1lcnMtPnJlZ1szXS5tb2RlOworCSAgKih1bnNpZ25lZDMyKilkZXN0ID0gdmFsMzI7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGh3X2Fib3J0IChtZSwgImJhZCByZWFkIHNpemUgb2YgNCBieXRlcyB0byBUTSVkTUQuIiwgdGltZXJfbnIpOworCX0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGh3X2Fib3J0IChtZSwgImJhZCByZWFkIHNpemUgb2YgJWQgYnl0ZXMgdG8gVE0lZE1ELiIsCisJCW5yX2J5dGVzLCB0aW1lcl9ucik7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCityZWFkX2Jhc2VfcmVnIChzdHJ1Y3QgaHcgKm1lLAorCSAgICAgICBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycywKKwkgICAgICAgaW50IHRpbWVyX25yLAorCSAgICAgICB2b2lkICpkZXN0LAorCSAgICAgICB1bnNpZ25lZCAgbnJfYnl0ZXMpCit7CisgIHVuc2lnbmVkMTYgdmFsMTY7CisgIHVuc2lnbmVkMzIgdmFsMzI7CisKKyAgLyogQ2hlY2sgbnJfYnl0ZXM6IGFjY2Vzc2VzIG9mIDEsIDIgYW5kIDQgYnl0ZXMgYWxsb3dlZCBkZXBlbmRpbmcgb24gdGltZXIuICovCisgIHN3aXRjaCAoIG5yX2J5dGVzICkKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgLyogUmVhZGluZyAxIGJ5dGUgaXMgb2sgZm9yIGFsbCByZWdpc3RlcnMuICovCisgICAgICBpZiAoIHRpbWVyX25yIDwgTlJfOEJJVF9USU1FUlMgKQorCXsKKwkgICoodW5zaWduZWQ4KilkZXN0ID0gdGltZXJzLT5yZWdbdGltZXJfbnJdLmJhc2U7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI6CisgICAgICBpZiAoIHRpbWVyX25yID09IDEgfHwgdGltZXJfbnIgPT0gMyApCisJeworCSAgaHdfYWJvcnQgKG1lLCAiYmFkIHJlYWQgc2l6ZSBvZiAyIGJ5dGVzIHRvIFRNJWRCUi4iLCB0aW1lcl9ucik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmICggdGltZXJfbnIgPCBOUl84QklUX1RJTUVSUyApCisJICAgIHsKKwkgICAgICB2YWwxNiA9ICh0aW1lcnMtPnJlZ1t0aW1lcl9ucl0uYmFzZTw8OCkKKwkJfCB0aW1lcnMtPnJlZ1t0aW1lcl9ucisxXS5iYXNlOworCSAgICB9CisJICBlbHNlIAorCSAgICB7CisJICAgICAgdmFsMTYgPSB0aW1lcnMtPnJlZ1t0aW1lcl9ucl0uYmFzZTsKKwkgICAgfQorCSAgKih1bnNpZ25lZDE2KilkZXN0ID0gdmFsMTY7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDQ6CisgICAgICBpZiAoIHRpbWVyX25yID09IDAgKQorCXsKKwkgIHZhbDMyID0gKHRpbWVycy0+cmVnWzBdLmJhc2UgPDwgMjQpIHwgKHRpbWVycy0+cmVnWzFdLmJhc2UgPDwgMTYpCisJICAgIHwgKHRpbWVycy0+cmVnWzJdLmJhc2UgPDwgOCkgfCB0aW1lcnMtPnJlZ1szXS5iYXNlOworCSAgKih1bnNpZ25lZDMyKilkZXN0ID0gdmFsMzI7CisJfQorICAgICAgZWxzZSBpZiAoIHRpbWVyX25yID09IDQgKSAKKwl7CisJICB2YWwzMiA9ICh0aW1lcnMtPnJlZ1s0XS5iYXNlIDw8IDE2KSB8IHRpbWVycy0+cmVnWzVdLmJhc2U7CisJICAqKHVuc2lnbmVkMzIqKWRlc3QgPSB2YWwzMjsKKwl9CisgICAgICBlbHNlCisJeworCSAgaHdfYWJvcnQgKG1lLCAiYmFkIHJlYWQgc2l6ZSBvZiA0IGJ5dGVzIHRvIFRNJWRCUi4iLCB0aW1lcl9ucik7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgaHdfYWJvcnQgKG1lLCAiYmFkIHJlYWQgc2l6ZSBtdXN0IG9mICVkIGJ5dGVzIHRvIFRNJWRCUi4iLAorCQlucl9ieXRlcywgdGltZXJfbnIpOyAKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3JlYWRfY291bnRlciAoc3RydWN0IGh3ICptZSwKKwkgICAgICBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycywKKwkgICAgICBpbnQgdGltZXJfbnIsCisJICAgICAgdm9pZCAqZGVzdCwKKwkgICAgICB1bnNpZ25lZCAgbnJfYnl0ZXMpCit7CisgIHVuc2lnbmVkMzIgdmFsOworCisgIGlmICggTlVMTCA9PSB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudCApCisgICAgeworICAgICAgLyogVGltZXIgaXMgbm90IGNvdW50aW5nLCB1c2UgdmFsdWUgaW4gYmFzZSByZWdpc3Rlci4gKi8KKyAgICAgIGlmICggdGltZXJfbnIgPT0gNiApCisJeworCSAgdmFsID0gMDsgIC8qIHRpbWVyIDYgaXMgYW4gdXAgY291bnRlciAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICB2YWwgPSB0aW1lcnMtPnJlZ1t0aW1lcl9ucl0uYmFzZTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCB0aW1lcl9uciA9PSA2ICkgIC8qIHRpbWVyIDYgaXMgYW4gdXAgY291bnRlci4gKi8KKwl7CisJICB2YWwgPSBod19ldmVudF9xdWV1ZV90aW1lKG1lKSAtIHRpbWVycy0+dGltZXJbdGltZXJfbnJdLnN0YXJ0OworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiB0aWNrcyBsZWZ0ID0gc3RhcnQgdGltZSArIGRpdiByYXRpbyAtIGN1cnIgdGltZSAqLworCSAgLyogQ2Fubm90IHVzZSBiYXNlIHJlZ2lzdGVyIGJlY2F1c2UgaXQgY2FuIGJlIHdyaXR0ZW4gZHVyaW5nIGNvdW50aW5nIGFuZCBpdAorCSAgICAgZG9lc24ndCBhZmZlY3QgY291bnRlciB1bnRpbCB1bmRlcmZsb3cgb2NjdXJzLiAqLworCSAgCisJICB2YWwgPSB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5zdGFydCArIHRpbWVycy0+dGltZXJbdGltZXJfbnJdLmRpdl9yYXRpbworCSAgICAtIGh3X2V2ZW50X3F1ZXVlX3RpbWUobWUpOworCX0KKyAgICB9CisKKyAgc3dpdGNoIChucl9ieXRlcykgeworICBjYXNlIDE6CisgICAgKih1bnNpZ25lZDggKilkZXN0ID0gdmFsOworICAgIGJyZWFrOworICAgIAorICBjYXNlIDI6CisgICAgKih1bnNpZ25lZDE2ICopZGVzdCA9IHZhbDsKKyAgICBicmVhazsKKworICBjYXNlIDQ6CisgICAgKih1bnNpZ25lZDMyICopZGVzdCA9IHZhbDsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIGh3X2Fib3J0KG1lLCAiYmFkIHJlYWQgc2l6ZSBmb3IgcmVhZGluZyBjb3VudGVyIik7CisgIH0KKyAgICAgIAorfQorCisKK3N0YXRpYyB2b2lkCityZWFkX3NwZWNpYWxfdGltZXI2X3JlZyAoc3RydWN0IGh3ICptZSwKKwkJCSBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycywKKwkJCSBpbnQgdGltZXJfbnIsCisJCQkgdm9pZCAqZGVzdCwKKwkJCSB1bnNpZ25lZCAgbnJfYnl0ZXMpCit7CisgIHVuc2lnbmVkMzIgdmFsOworCisgIHN3aXRjaCAobnJfYnl0ZXMpIHsKKyAgY2FzZSAxOgorICAgIHsKKyAgICAgIHN3aXRjaCAoIHRpbWVyX25yICkgeworICAgICAgY2FzZSBUTTZNREE6CisJKih1bnNpZ25lZDggKilkZXN0ID0gdGltZXJzLT50bTZtZGE7CisJYnJlYWs7CisgICAgCisgICAgICBjYXNlIFRNNk1EQjoKKwkqKHVuc2lnbmVkOCAqKWRlc3QgPSB0aW1lcnMtPnRtNm1kYjsKKwlicmVhazsKKyAgICAKKyAgICAgIGNhc2UgVE02Q0E6CisJKih1bnNpZ25lZDggKilkZXN0ID0gdGltZXJzLT50bTZjYTsKKwlicmVhazsKKyAgICAKKyAgICAgIGNhc2UgVE02Q0I6CisJKih1bnNpZ25lZDggKilkZXN0ID0gdGltZXJzLT50bTZjYjsKKwlicmVhazsKKyAgICAgIAorICAgICAgZGVmYXVsdDoKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgY2FzZSAyOgorICAgIGlmICggdGltZXJfbnIgPT0gVE02Q0EgKQorICAgICAgeworCSoodW5zaWduZWQxNiAqKWRlc3QgPSB0aW1lcnMtPnRtNmNhOworICAgICAgfQorICAgIGVsc2UgaWYgKCB0aW1lcl9uciA9PSBUTTZDQiApCisgICAgICB7CisJKih1bnNpZ25lZDE2ICopZGVzdCA9IHRpbWVycy0+dG02Y2I7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCWh3X2Fib3J0KG1lLCAiYmFkIHJlYWQgc2l6ZSBmb3IgdGltZXIgNiBtb2RlIEEvQiByZWdpc3RlciIpOworICAgICAgfQorICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgaHdfYWJvcnQobWUsICJiYWQgcmVhZCBzaXplIGZvciB0aW1lciA2IHJlZ2lzdGVyIik7CisgIH0KKyAgICAgIAorfQorCisKK3N0YXRpYyB1bnNpZ25lZAorbW4xMDN0aW1faW9fcmVhZF9idWZmZXIgKHN0cnVjdCBodyAqbWUsCisJCQkgdm9pZCAqZGVzdCwKKwkJCSBpbnQgc3BhY2UsCisJCQkgdW5zaWduZWRfd29yZCBiYXNlLAorCQkJIHVuc2lnbmVkIG5yX2J5dGVzKQoreworICBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycyA9IGh3X2RhdGEgKG1lKTsKKyAgZW51bSB0aW1lcl9yZWdpc3Rlcl90eXBlcyB0aW1lcl9yZWc7CisKKyAgSFdfVFJBQ0UgKChtZSwgInJlYWQgMHglMDhseCAlZCIsIChsb25nKSBiYXNlLCAoaW50KSBucl9ieXRlcykpOworCisgIHRpbWVyX3JlZyA9IGRlY29kZV9hZGRyIChtZSwgdGltZXJzLCBiYXNlKTsKKworICAvKiBJdCBjYW4gYmUgZWl0aGVyIGEgbW9kZSByZWdpc3RlciwgYSBiYXNlIHJlZ2lzdGVyLCBhIGJpbmFyeSBjb3VudGVyLCAqLworICAvKiBvciBhIHNwZWNpYWwgdGltZXIgNiByZWdpc3Rlci4gIENoZWNrIGluIHRoYXQgb3JkZXIuICovCisgIGlmICggdGltZXJfcmVnID49IEZJUlNUX01PREVfUkVHICYmIHRpbWVyX3JlZyA8PSBMQVNUX01PREVfUkVHICkKKyAgICB7CisgICAgICByZWFkX21vZGVfcmVnKG1lLCB0aW1lcnMsIHRpbWVyX3JlZy1GSVJTVF9NT0RFX1JFRywgZGVzdCwgbnJfYnl0ZXMpOworICAgIH0KKyAgZWxzZSBpZiAoIHRpbWVyX3JlZyA8PSBMQVNUX0JBU0VfUkVHICkKKyAgICB7CisgICAgICByZWFkX2Jhc2VfcmVnKG1lLCB0aW1lcnMsIHRpbWVyX3JlZy1GSVJTVF9CQVNFX1JFRywgZGVzdCwgbnJfYnl0ZXMpOworICAgIH0KKyAgZWxzZSBpZiAoIHRpbWVyX3JlZyA8PSBMQVNUX0NPVU5URVIgKQorICAgIHsKKyAgICAgIHJlYWRfY291bnRlcihtZSwgdGltZXJzLCB0aW1lcl9yZWctRklSU1RfQ09VTlRFUiwgZGVzdCwgbnJfYnl0ZXMpOworICAgIH0KKyAgZWxzZSBpZiAoIHRpbWVyX3JlZyA8PSBMQVNUX1RJTUVSX1JFRyApCisgICAgeworICAgICAgcmVhZF9zcGVjaWFsX3RpbWVyNl9yZWcobWUsIHRpbWVycywgdGltZXJfcmVnLCBkZXN0LCBucl9ieXRlcyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaHdfYWJvcnQobWUsICJpbnZhbGlkIHRpbWVyIHJlZ2lzdGVyIGFkZHJlc3MuIik7CisgICAgfQorCisgIHJldHVybiBucl9ieXRlczsKK30gICAgIAorCisKK3N0YXRpYyB2b2lkCitkb19jb3VudGVyX2V2ZW50IChzdHJ1Y3QgaHcgKm1lLAorCQkgIHZvaWQgKmRhdGEpCit7CisgIHN0cnVjdCBtbjEwM3RpbSAqdGltZXJzID0gaHdfZGF0YShtZSk7CisgIGludCB0aW1lcl9uciA9IChpbnQpIGRhdGE7CisgIGludCBuZXh0X3RpbWVyOworCisgIC8qIENoZWNrIGlmIGNvdW50aW5nIGlzIHN0aWxsIGVuYWJsZWQuICovCisgIGlmICggKHRpbWVycy0+cmVnW3RpbWVyX25yXS5tb2RlICYgY291bnRfbWFzaykgIT0gMCApCisgICAgeworICAgICAgLyogR2VuZXJhdGUgYW4gaW50ZXJydXB0IGZvciB0aGUgdGltZXIgdW5kZXJmbG93IChUSU1FUm5fVUZMT1cpLiAqLworCisgICAgICAvKiBQb3J0IGV2ZW50IG9jY3VycyBvbiBwb3J0IG9mIGxhc3QgY2FzY2FkZWQgdGltZXIuICovCisgICAgICAvKiBUaGlzIHdvcmtzIGFjcm9zcyB0aW1lciByYW5nZSBmcm9tIDAgdG8gTlJfUkVHX1RJTUVSUyBiZWNhdXNlICovCisgICAgICAvKiB0aGUgZmlyc3QgMTYgYml0IHRpbWVyICh0aW1lciA0KSBpcyBub3QgYWxsb3dlZCB0byBiZSBzZXQgYXMgICovCisgICAgICAvKiBhIGNhc2NhZGluZyB0aW1lci4gKi8KKyAgICAgIGZvciAoIG5leHRfdGltZXIgPSB0aW1lcl9ucisxOyBuZXh0X3RpbWVyIDwgTlJfUkVHX1RJTUVSUzsgKytuZXh0X3RpbWVyICkKKwl7CisJICBpZiAoICh0aW1lcnMtPnJlZ1tuZXh0X3RpbWVyXS5tb2RlICYgY2xvY2tfbWFzaykgIT0gY2xrX2Nhc2NhZGVkICkKKwkgICAgeworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgaHdfcG9ydF9ldmVudCAobWUsIG5leHRfdGltZXItMSwgMSk7CisKKyAgICAgIC8qIFNjaGVkdWxlIG5leHQgdGltZW91dC4gICovCisgICAgICB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5zdGFydCA9IGh3X2V2ZW50X3F1ZXVlX3RpbWUobWUpOworICAgICAgLyogRklYOiBDaGVjayBpZiBkaXZfcmF0aW8gaGFzIGNoYW5nZWQgYW5kIGlmIGl0J3Mgbm93IDAuICovCisgICAgICB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudAorCT0gaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUgKG1lLCB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5kaXZfcmF0aW8sCisJCQkJICAgZG9fY291bnRlcl9ldmVudCwgKHZvaWQgKil0aW1lcl9ucik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdGltZXJzLT50aW1lclt0aW1lcl9ucl0uZXZlbnQgPSBOVUxMOworICAgIH0KKworfQorCisKK3N0YXRpYyB2b2lkCitkb19jb3VudGVyNl9ldmVudCAoc3RydWN0IGh3ICptZSwKKwkJICB2b2lkICpkYXRhKQoreworICBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycyA9IGh3X2RhdGEobWUpOworICBpbnQgdGltZXJfbnIgPSAoaW50KSBkYXRhOworICBpbnQgbmV4dF90aW1lcjsKKworICAvKiBDaGVjayBpZiBjb3VudGluZyBpcyBzdGlsbCBlbmFibGVkLiAqLworICBpZiAoICh0aW1lcnMtPnJlZ1t0aW1lcl9ucl0ubW9kZSAmIGNvdW50X21hc2spICE9IDAgKQorICAgIHsKKyAgICAgIC8qIEdlbmVyYXRlIGFuIGludGVycnVwdCBmb3IgdGhlIHRpbWVyIHVuZGVyZmxvdyAoVElNRVJuX1VGTE9XKS4gKi8KKyAgICAgIGh3X3BvcnRfZXZlbnQgKG1lLCB0aW1lcl9uciwgMSk7CisKKyAgICAgIC8qIFNjaGVkdWxlIG5leHQgdGltZW91dC4gICovCisgICAgICB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5zdGFydCA9IGh3X2V2ZW50X3F1ZXVlX3RpbWUobWUpOworICAgICAgLyogRklYOiBDaGVjayBpZiBkaXZfcmF0aW8gaGFzIGNoYW5nZWQgYW5kIGlmIGl0J3Mgbm93IDAuICovCisgICAgICB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudAorCT0gaHdfZXZlbnRfcXVldWVfc2NoZWR1bGUgKG1lLCB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5kaXZfcmF0aW8sCisJCQkJICAgZG9fY291bnRlcjZfZXZlbnQsICh2b2lkICopdGltZXJfbnIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHRpbWVycy0+dGltZXJbdGltZXJfbnJdLmV2ZW50ID0gTlVMTDsKKyAgICB9CisKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX2Jhc2VfcmVnIChzdHJ1Y3QgaHcgKm1lLAorCQlzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycywKKwkJaW50IHRpbWVyX25yLAorCQljb25zdCB2b2lkICpzb3VyY2UsCisJCXVuc2lnbmVkICBucl9ieXRlcykKK3sKKyAgdW5zaWduZWQgaTsKKyAgY29uc3QgdW5zaWduZWQ4ICpidWY4ID0gc291cmNlOworICBjb25zdCB1bnNpZ25lZDE2ICpidWYxNiA9IHNvdXJjZTsKKworICAvKiBJZiBUTW5DTkUgPT0gMCAoY291bnRpbmcgaXMgb2ZmKSwgIHdyaXRpbmcgdG8gdGhlIGJhc2UgcmVnaXN0ZXIKKyAgICAgKFRNbkJSKSBjYXVzZXMgYSBzaW11bHRhbmVvdXMgd3JpdGUgdG8gdGhlIGNvdW50ZXIgcmVnIChUTW5CQykuCisgICAgIEVsc2UsIHRoZSBUTW5CQyBpcyByZWxvYWRlZCB3aXRoIHRoZSB2YWx1ZSBmcm9tIFRNbkJSIHdoZW4KKyAgICAgdW5kZXJmbG93IG9jY3Vycy4gIFNpbmNlIHRoZSBjb3VudGVyIHJlZ2lzdGVyIGlzIG5vdCBleHBsaWNpdGx5CisgICAgIG1haW50YWluZWQsIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBoYW5kbGVkIGluIHJlYWRfY291bnRlci4gKi8KKworICAvKiBDaGVjayBucl9ieXRlczogd3JpdGUgb2YgMSwgMiBvciA0IGJ5dGVzIGFsbG93ZWQgZGVwZW5kaW5nIG9uIHRpbWVyLiAqLworICBzd2l0Y2ggKCBucl9ieXRlcyApCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIC8qIFN0b3JpbmcgMSBieXRlIGlzIG9rIGZvciBhbGwgcmVnaXN0ZXJzLiAqLworICAgICAgdGltZXJzLT5yZWdbdGltZXJfbnJdLmJhc2UgPSBidWY4WzBdOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI6CisgICAgICBpZiAoIHRpbWVyX25yID09IDEgfHwgdGltZXJfbnIgPT0gMyApCisJeworCSAgaHdfYWJvcnQgKG1lLCAiYmFkIHdyaXRlIHNpemUgb2YgMiBieXRlcyB0byBUTSVkQlIuIiwgdGltZXJfbnIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoIHRpbWVyX25yIDwgTlJfOEJJVF9USU1FUlMgKQorCSAgICB7CisJICAgICAgdGltZXJzLT5yZWdbdGltZXJfbnJdLmJhc2UgPSBidWY4WzBdOworCSAgICAgIHRpbWVycy0+cmVnW3RpbWVyX25yKzFdLmJhc2UgPSBidWY4WzFdOworCSAgICB9CisJICBlbHNlIAorCSAgICB7CisJICAgICAgdGltZXJzLT5yZWdbdGltZXJfbnJdLmJhc2UgPSBidWYxNlswXTsKKwkgICAgfQorCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSA0OgorICAgICAgaWYgKCB0aW1lcl9uciA9PSAwICkKKwl7CisJICB0aW1lcnMtPnJlZ1swXS5iYXNlID0gYnVmOFswXTsKKwkgIHRpbWVycy0+cmVnWzFdLmJhc2UgPSBidWY4WzFdOworCSAgdGltZXJzLT5yZWdbMl0uYmFzZSA9IGJ1ZjhbMl07CisJICB0aW1lcnMtPnJlZ1szXS5iYXNlID0gYnVmOFszXTsKKwl9CisgICAgICBlbHNlIGlmICggdGltZXJfbnIgPT0gNCApCisJeworCSAgdGltZXJzLT5yZWdbNF0uYmFzZSA9IGJ1ZjE2WzBdOworCSAgdGltZXJzLT5yZWdbNV0uYmFzZSA9IGJ1ZjE2WzFdOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBod19hYm9ydCAobWUsICJiYWQgd3JpdGUgc2l6ZSBvZiA0IGJ5dGVzIHRvIFRNJWRCUi4iLCB0aW1lcl9ucik7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgaHdfYWJvcnQgKG1lLCAiYmFkIHdyaXRlIHNpemUgbXVzdCBvZiAlZCBieXRlcyB0byBUTSVkQlIuIiwKKwkJbnJfYnl0ZXMsIHRpbWVyX25yKTsKKyAgICB9CisgICAgIAorfQorCitzdGF0aWMgdm9pZAord3JpdGVfbW9kZV9yZWcgKHN0cnVjdCBodyAqbWUsCisJCXN0cnVjdCBtbjEwM3RpbSAqdGltZXJzLAorCQlpbnQgdGltZXJfbnIsCisJCWNvbnN0IHZvaWQgKnNvdXJjZSwKKwkJdW5zaWduZWQgbnJfYnl0ZXMpCisgICAgIC8qIGZvciB0aW1lcnMgMCB0byA1ICovCit7CisgIHVuc2lnbmVkIGk7CisgIHVuc2lnbmVkOCBtb2RlX3ZhbCwgbmV4dF9tb2RlX3ZhbDsKKyAgdW5zaWduZWQzMiBkaXZfcmF0aW87CisKKyAgaWYgKCBucl9ieXRlcyAhPSAxICkKKyAgICB7CisgICAgICBod19hYm9ydCAobWUsICJiYWQgd3JpdGUgc2l6ZSBvZiAlZCBieXRlcyB0byBUTSVkTUQuIiwgbnJfYnl0ZXMsIHRpbWVyX25yKTsKKyAgICB9CisKKyAgbW9kZV92YWwgPSAqKHVuc2lnbmVkOCAqKXNvdXJjZTsKKyAgdGltZXJzLT5yZWdbdGltZXJfbnJdLm1vZGUgPSBtb2RlX3ZhbDsKKyAgICAgIAorICBpZiAoICggbW9kZV92YWwgJiBjb3VudF9hbmRfbG9hZF9tYXNrICkgPT0gY291bnRfYW5kX2xvYWRfbWFzayApCisgICAgeworICAgICAgaHdfYWJvcnQobWUsICJDYW5ub3QgbG9hZCBiYXNlIHJlZyBhbmQgc3RhcnQgY291bnRpbmcgc2ltdWx0YW5lb3VzbHkuIik7CisgICAgfQorICBpZiAoICggbW9kZV92YWwgJiBiaXRzMnRvNV9tYXNrICkgIT0gMCApCisgICAgeworICAgICAgaHdfYWJvcnQobWUsICJDYW5ub3Qgd3JpdGUgdG8gYml0cyAyIHRvIDUgb2YgbW9kZSByZWdpc3RlciIpOworICAgIH0KKworICBpZiAoIG1vZGVfdmFsICYgY291bnRfbWFzayApCisgICAgeworICAgICAgLyogLSBkZS1zY2hlZHVsZSBhbnkgcHJldmlvdXMgZXZlbnQuICovCisgICAgICAvKiAtIGFkZCBuZXcgZXZlbnQgdG8gcXVldWUgdG8gc3RhcnQgY291bnRpbmcuICovCisgICAgICAvKiAtIGFzc2VydCB0aGF0IGNvdW50ZXIgPT0gYmFzZSByZWc/ICovCisKKyAgICAgIC8qIEZvciBjYXNjYWRlZCB0aW1lcnMsICovCisgICAgICBpZiAoIChtb2RlX3ZhbCAmIGNsb2NrX21hc2spID09IGNsa19jYXNjYWRlZCApCisJeworCSAgaWYgKCB0aW1lcl9uciA9PSAwIHx8IHRpbWVyX25yID09IDQgKQorCSAgICB7CisJICAgICAgaHdfYWJvcnQobWUsICJUaW1lciAlZCBjYW5ub3QgYmUgY2FzY2FkZWQuIiwgdGltZXJfbnIpOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGRpdl9yYXRpbyA9IHRpbWVycy0+cmVnW3RpbWVyX25yXS5iYXNlOworCisJICAvKiBDaGVjayBmb3IgY2FzY2FkaW5nLiAqLworCSAgaWYgKCB0aW1lcl9uciA8IE5SXzhCSVRfVElNRVJTICkKKwkgICAgeworCSAgICAgIGZvciAoIGkgPSB0aW1lcl9uciArIDE7IGkgPD0gMzsgKytpICkgCisJCXsKKwkJICBuZXh0X21vZGVfdmFsID0gdGltZXJzLT5yZWdbaV0ubW9kZTsKKwkJICBpZiAoICggbmV4dF9tb2RlX3ZhbCAmIGNsb2NrX21hc2sgKSA9PSBjbGtfY2FzY2FkZWQgKQorCQkgICAgeworCQkgICAgICAvKiBDaGVjayB0aGF0IENORSBpcyBvbi4gKi8KKwkJICAgICAgaWYgKCAoIG5leHRfbW9kZV92YWwgJiBjb3VudF9tYXNrICkgPT0gMCApIAorCQkJeworCQkJICBod19hYm9ydCAobWUsICJjYXNjYWRlZCB0aW1lciBub3QgcmVhZHkgZm9yIGNvdW50aW5nIik7CisJCQl9CisJCSAgICAgIEFTU0VSVCh0aW1lcnMtPnRpbWVyW2ldLmV2ZW50ID09IE5VTEwpOworCQkgICAgICBBU1NFUlQodGltZXJzLT50aW1lcltpXS5kaXZfcmF0aW8gPT0gMCk7CisJCSAgICAgIGRpdl9yYXRpbyA9IGRpdl9yYXRpbworCQkJfCAodGltZXJzLT5yZWdbaV0uYmFzZSA8PCAoOCooaS10aW1lcl9ucikpKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIE1vZGUgcmVnaXN0ZXIgZm9yIGEgMTYgYml0IHRpbWVyICovCisJICAgICAgbmV4dF9tb2RlX3ZhbCA9IHRpbWVycy0+cmVnW3RpbWVyX25yKzFdLm1vZGU7CisJICAgICAgaWYgKCAoIG5leHRfbW9kZV92YWwgJiBjbG9ja19tYXNrICkgPT0gY2xrX2Nhc2NhZGVkICkKKwkJeworCQkgIC8qIENoZWNrIHRoYXQgQ05FIGlzIG9uLiAqLworCQkgIGlmICggKCBuZXh0X21vZGVfdmFsICYgY291bnRfbWFzayApID09IDAgKSAKKwkJICAgIHsKKwkJICAgICAgaHdfYWJvcnQgKG1lLCAiY2FzY2FkZWQgdGltZXIgbm90IHJlYWR5IGZvciBjb3VudGluZyIpOworCQkgICAgfQorCQkgIEFTU0VSVCh0aW1lcnMtPnRpbWVyW3RpbWVyX25yKzFdLmV2ZW50ID09IE5VTEwpOworCQkgIEFTU0VSVCh0aW1lcnMtPnRpbWVyW3RpbWVyX25yKzFdLmRpdl9yYXRpbyA9PSAwKTsKKwkJICBkaXZfcmF0aW8gPSBkaXZfcmF0aW8gfCAodGltZXJzLT5yZWdbdGltZXJfbnIrMV0uYmFzZSA8PCAxNik7CisJCX0KKwkgICAgfQorCisJICB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5kaXZfcmF0aW8gPSBkaXZfcmF0aW87CisKKwkgIGlmICggTlVMTCAhPSB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudCApCisJICAgIHsKKwkgICAgICBod19ldmVudF9xdWV1ZV9kZXNjaGVkdWxlIChtZSwgdGltZXJzLT50aW1lclt0aW1lcl9ucl0uZXZlbnQpOworCSAgICAgIHRpbWVycy0+dGltZXJbdGltZXJfbnJdLmV2ZW50ID0gTlVMTDsKKwkgICAgfQorCisJICBpZiAoIGRpdl9yYXRpbyA+IDAgKQorCSAgICB7CisJICAgICAgLyogU2V0IHN0YXJ0IHRpbWUuICovCisJICAgICAgdGltZXJzLT50aW1lclt0aW1lcl9ucl0uc3RhcnQgPSBod19ldmVudF9xdWV1ZV90aW1lKG1lKTsKKwkgICAgICB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudAorCQk9IGh3X2V2ZW50X3F1ZXVlX3NjaGVkdWxlKG1lLCBkaXZfcmF0aW8sCisJCQkJCSAgZG9fY291bnRlcl9ldmVudCwKKwkJCQkJICAodm9pZCAqKSh0aW1lcl9ucikpOyAKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUdXJuIG9mZiBjb3VudGluZyAqLworICAgICAgaWYgKCBOVUxMICE9IHRpbWVycy0+dGltZXJbdGltZXJfbnJdLmV2ZW50ICkKKwl7CisJICBBU1NFUlQoKHRpbWVycy0+cmVnW3RpbWVyX25yXS5tb2RlICYgY2xvY2tfbWFzaykgIT0gY2xrX2Nhc2NhZGVkKTsKKwkgIGh3X2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUgKG1lLCB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudCk7CisJICB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudCA9IE5VTEw7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmICggKHRpbWVycy0+cmVnW3RpbWVyX25yXS5tb2RlICYgY2xvY2tfbWFzaykgPT0gY2xrX2Nhc2NhZGVkICkKKwkgICAgeworCSAgICAgIEFTU0VSVCh0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudCA9PSBOVUxMKTsKKwkgICAgfQorCX0KKyAgICAgIAorICAgIH0KKworfQorCitzdGF0aWMgdm9pZAord3JpdGVfdG02bWQgKHN0cnVjdCBodyAqbWUsCisJICAgICBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycywKKwkgICAgIHVuc2lnbmVkX3dvcmQgYWRkcmVzcywKKwkgICAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKKwkgICAgIHVuc2lnbmVkIG5yX2J5dGVzKQoreworICB1bnNpZ25lZDggbW9kZV92YWwwID0gMHgwMCwgbW9kZV92YWwxID0gMHgwMDsKKyAgdW5zaWduZWQzMiBkaXZfcmF0aW87CisgIGludCB0aW1lcl9uciA9IDY7CisKKyAgdW5zaWduZWRfd29yZCBvZmZzZXQgPSBhZGRyZXNzIC0gdGltZXJzLT5ibG9ja1swXS5iYXNlOworICAKKyAgaWYgKCBvZmZzZXQgIT0gMHg4NCAmJiBucl9ieXRlcyA+IDEgfHwgbnJfYnl0ZXMgPiAyICkKKyAgICB7CisgICAgICBod19hYm9ydCAobWUsICJCYWQgd3JpdGUgc2l6ZSBvZiAlZCBieXRlcyB0byBUTTZNRCIsIG5yX2J5dGVzKTsKKyAgICB9CisKKyAgaWYgKCBvZmZzZXQgPT0gMHg4NCApICAvKiBhZGRyZXNzIG9mIFRNNk1EICovCisgICAgeworICAgICAgLyogIEZpbGwgaW4gZmlyc3QgYnl0ZSBvZiBtb2RlICovCisgICAgICBtb2RlX3ZhbDAgPSAqKHVuc2lnbmVkOCAqKXNvdXJjZTsKKyAgICAgIHRpbWVycy0+dG02bWQwID0gbW9kZV92YWwwOworICAgIAorICAgICAgaWYgKCAoIG1vZGVfdmFsMCAmIDB4MjYgKSAhPSAwICkKKwl7CisJICBod19hYm9ydChtZSwgIkNhbm5vdCB3cml0ZSB0byBiaXRzIDUsIDMsIGFuZCAyIG9mIFRNNk1EIik7CisJfQorICAgIH0KKyAgCisgIGlmICggb2Zmc2V0ID09IDB4ODUgfHwgbnJfYnl0ZXMgPT0gMiApCisgICAgeworICAgICAgLyogIEZpbGwgaW4gc2Vjb25kIGJ5dGUgb2YgbW9kZSAqLworICAgICAgaWYgKCBucl9ieXRlcyA9PSAyICkKKwl7CisJICBtb2RlX3ZhbDEgPSAqKHVuc2lnbmVkOCAqKXNvdXJjZSsxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBtb2RlX3ZhbDEgPSAqKHVuc2lnbmVkOCAqKXNvdXJjZTsKKwl9CisKKyAgICAgIHRpbWVycy0+dG02bWQxID0gbW9kZV92YWwxOworCisgICAgICBpZiAoICggbW9kZV92YWwxICYgY291bnRfYW5kX2xvYWRfbWFzayApID09IGNvdW50X2FuZF9sb2FkX21hc2sgKQorCXsKKwkgIGh3X2Fib3J0KG1lLCAiQ2Fubm90IGxvYWQgYmFzZSByZWcgYW5kIHN0YXJ0IGNvdW50aW5nIHNpbXVsdGFuZW91c2x5LiIpOworCX0KKyAgICAgIGlmICggKCBtb2RlX3ZhbDEgJiBiaXRzMHRvMl9tYXNrICkgIT0gMCApCisJeworCSAgaHdfYWJvcnQobWUsICJDYW5ub3Qgd3JpdGUgdG8gYml0cyA4IHRvIDEwIG9mIFRNNk1EIik7CisJfQorICAgIH0KKworICBpZiAoIG1vZGVfdmFsMSAmIGNvdW50X21hc2sgKQorICAgIHsKKyAgICAgIC8qIC0gZGUtc2NoZWR1bGUgYW55IHByZXZpb3VzIGV2ZW50LiAqLworICAgICAgLyogLSBhZGQgbmV3IGV2ZW50IHRvIHF1ZXVlIHRvIHN0YXJ0IGNvdW50aW5nLiAqLworICAgICAgLyogLSBhc3NlcnQgdGhhdCBjb3VudGVyID09IGJhc2UgcmVnPyAqLworCisgICAgICBkaXZfcmF0aW8gPSB0aW1lcnMtPnRtNmNhOyAgLyogYmluYXJ5IGNvdW50ZXIgZm9yIHRpbWVyIDYgKi8KKyAgICAgIHRpbWVycy0+dGltZXJbdGltZXJfbnJdLmRpdl9yYXRpbyA9IGRpdl9yYXRpbzsKKyAgICAgIGlmICggTlVMTCAhPSB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5ldmVudCApCisJeworCSAgaHdfZXZlbnRfcXVldWVfZGVzY2hlZHVsZSAobWUsIHRpbWVycy0+dGltZXJbdGltZXJfbnJdLmV2ZW50KTsKKwkgIHRpbWVycy0+dGltZXJbdGltZXJfbnJdLmV2ZW50ID0gTlVMTDsKKwl9CisKKyAgICAgIGlmICggZGl2X3JhdGlvID4gMCApCisJeworCSAgLyogU2V0IHN0YXJ0IHRpbWUuICovCisJICB0aW1lcnMtPnRpbWVyW3RpbWVyX25yXS5zdGFydCA9IGh3X2V2ZW50X3F1ZXVlX3RpbWUobWUpOworCSAgdGltZXJzLT50aW1lclt0aW1lcl9ucl0uZXZlbnQKKwkgICAgPSBod19ldmVudF9xdWV1ZV9zY2hlZHVsZShtZSwgZGl2X3JhdGlvLAorCQkJCSAgICAgIGRvX2NvdW50ZXI2X2V2ZW50LAorCQkJCSAgICAgICh2b2lkICopKHRpbWVyX25yKSk7IAorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUdXJuIG9mZiBjb3VudGluZyAqLworICAgICAgaWYgKCBOVUxMICE9IHRpbWVycy0+dGltZXJbdGltZXJfbnJdLmV2ZW50ICkKKwl7CisJICBod19ldmVudF9xdWV1ZV9kZXNjaGVkdWxlIChtZSwgdGltZXJzLT50aW1lclt0aW1lcl9ucl0uZXZlbnQpOworCSAgdGltZXJzLT50aW1lclt0aW1lcl9ucl0uZXZlbnQgPSBOVUxMOworCX0KKyAgICB9Cit9CisKKworCitzdGF0aWMgdm9pZAord3JpdGVfc3BlY2lhbF90aW1lcjZfcmVnIChzdHJ1Y3QgaHcgKm1lLAorCQkJICBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycywKKwkJCSAgaW50IHRpbWVyX25yLAorCQkJICBjb25zdCB2b2lkICpzb3VyY2UsCisJCQkgIHVuc2lnbmVkICBucl9ieXRlcykKK3sKKyAgdW5zaWduZWQzMiB2YWw7CisKKyAgc3dpdGNoIChucl9ieXRlcykgeworICBjYXNlIDE6CisgICAgeworICAgICAgc3dpdGNoICggdGltZXJfbnIgKSB7CisgICAgICBjYXNlIFRNNk1EQToKKwl0aW1lcnMtPnRtNm1kYSA9ICoodW5zaWduZWQ4ICopc291cmNlOworCWJyZWFrOworICAgIAorICAgICAgY2FzZSBUTTZNREI6CisJdGltZXJzLT50bTZtZGIgPSAqKHVuc2lnbmVkOCAqKXNvdXJjZTsKKwlicmVhazsKKyAgICAKKyAgICAgIGNhc2UgVE02Q0E6CisJdGltZXJzLT50bTZjYSA9ICoodW5zaWduZWQ4ICopc291cmNlOworCWJyZWFrOworICAgIAorICAgICAgY2FzZSBUTTZDQjoKKwl0aW1lcnMtPnRtNmNiID0gKih1bnNpZ25lZDggKilzb3VyY2U7CisJYnJlYWs7CisgICAgICAKKyAgICAgIGRlZmF1bHQ6CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgCisgIGNhc2UgMjoKKyAgICBpZiAoIHRpbWVyX25yID09IFRNNkNBICkKKyAgICAgIHsKKwl0aW1lcnMtPnRtNmNhID0gKih1bnNpZ25lZDE2ICopc291cmNlOworICAgICAgfQorICAgIGVsc2UgaWYgKCB0aW1lcl9uciA9PSBUTTZDQiApCisgICAgICB7CisJdGltZXJzLT50bTZjYiA9ICoodW5zaWduZWQxNiAqKXNvdXJjZTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJaHdfYWJvcnQobWUsICJiYWQgcmVhZCBzaXplIGZvciB0aW1lciA2IG1vZGUgQS9CIHJlZ2lzdGVyIik7CisgICAgICB9CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICBod19hYm9ydChtZSwgImJhZCByZWFkIHNpemUgZm9yIHRpbWVyIDYgcmVnaXN0ZXIiKTsKKyAgfQorICAgICAgCit9CisKKworc3RhdGljIHVuc2lnbmVkCittbjEwM3RpbV9pb193cml0ZV9idWZmZXIgKHN0cnVjdCBodyAqbWUsCisJCQkgIGNvbnN0IHZvaWQgKnNvdXJjZSwKKwkJCSAgaW50IHNwYWNlLAorCQkJICB1bnNpZ25lZF93b3JkIGJhc2UsCisJCQkgIHVuc2lnbmVkIG5yX2J5dGVzKQoreworICBzdHJ1Y3QgbW4xMDN0aW0gKnRpbWVycyA9IGh3X2RhdGEgKG1lKTsKKyAgZW51bSB0aW1lcl9yZWdpc3Rlcl90eXBlcyB0aW1lcl9yZWc7CisKKyAgSFdfVFJBQ0UgKChtZSwgIndyaXRlIHRvIDB4JTA4bHggbGVuZ3RoICVkIHdpdGggMHgleCIsIChsb25nKSBiYXNlLAorCSAgICAgKGludCkgbnJfYnl0ZXMsICoodW5zaWduZWQzMiAqKXNvdXJjZSkpOworCisgIHRpbWVyX3JlZyA9IGRlY29kZV9hZGRyIChtZSwgdGltZXJzLCBiYXNlKTsKKworICAvKiBJdCBjYW4gYmUgZWl0aGVyIGEgbW9kZSByZWdpc3RlciwgYSBiYXNlIHJlZ2lzdGVyLCBhIGJpbmFyeSBjb3VudGVyLCAqLworICAvKiBvciBhIHNwZWNpYWwgdGltZXIgNiByZWdpc3Rlci4gIENoZWNrIGluIHRoYXQgb3JkZXIuICovCisgIGlmICggdGltZXJfcmVnIDw9IExBU1RfTU9ERV9SRUcgKQorICAgIHsKKyAgICAgIGlmICggdGltZXJfcmVnID09IDYgKSAKKwl7CisJICB3cml0ZV90bTZtZChtZSwgdGltZXJzLCBiYXNlLCBzb3VyY2UsIG5yX2J5dGVzKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgd3JpdGVfbW9kZV9yZWcobWUsIHRpbWVycywgdGltZXJfcmVnLUZJUlNUX01PREVfUkVHLAorCQkJIHNvdXJjZSwgbnJfYnl0ZXMpOworCX0KKyAgICB9CisgIGVsc2UgaWYgKCB0aW1lcl9yZWcgPD0gTEFTVF9CQVNFX1JFRyApCisgICAgeworICAgICAgd3JpdGVfYmFzZV9yZWcobWUsIHRpbWVycywgdGltZXJfcmVnLUZJUlNUX0JBU0VfUkVHLCBzb3VyY2UsIG5yX2J5dGVzKTsKKyAgICB9CisgIGVsc2UgaWYgKCB0aW1lcl9yZWcgPD0gTEFTVF9DT1VOVEVSICkKKyAgICB7CisgICAgICBod19hYm9ydChtZSwgImNhbm5vdCB3cml0ZSB0byBjb3VudGVyIik7CisgICAgfQorICBlbHNlIGlmICggdGltZXJfcmVnIDw9IExBU1RfVElNRVJfUkVHICkKKyAgICB7CisgICAgICB3cml0ZV9zcGVjaWFsX3RpbWVyNl9yZWcobWUsIHRpbWVycywgdGltZXJfcmVnLCBzb3VyY2UsIG5yX2J5dGVzKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBod19hYm9ydChtZSwgImludmFsaWQgcmVnIHR5cGUiKTsKKyAgICB9CisKKyAgcmV0dXJuIG5yX2J5dGVzOworfSAgICAgCisKKworY29uc3Qgc3RydWN0IGh3X2Rlc2NyaXB0b3IgZHZfbW4xMDN0aW1fZGVzY3JpcHRvcltdID0geworICB7ICJtbjEwM3RpbSIsIG1uMTAzdGltX2ZpbmlzaCwgfSwKKyAgeyBOVUxMIH0sCit9OwpkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvZ2VuY29kZS5jIGIvc2ltL21uMTAzMDAvZ2VuY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjMxMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbW4xMDMwMC9nZW5jb2RlLmMKQEAgLTAsMCArMSwxNjMgQEAKKyNpbmNsdWRlICJtbjEwMzAwX3NpbS5oIgorCitzdGF0aWMgdm9pZCB3cml0ZV9oZWFkZXIgUEFSQU1TICgodm9pZCkpOworc3RhdGljIHZvaWQgd3JpdGVfb3Bjb2RlcyBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCB3cml0ZV90ZW1wbGF0ZSBQQVJBTVMgKCh2b2lkKSk7CisKK2xvbmcgT3Bjb2Rlc1s1MTJdOworc3RhdGljIGludCBjdXJvcD0wOworCitpbnQKK21haW4gKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICphcmd2W107Cit7CisgIGlmICgoYXJnYyA+IDEpICYmIChzdHJjbXAgKGFyZ3ZbMV0sICItaCIpID09IDApKQorICAgIHdyaXRlX2hlYWRlcigpOworICBlbHNlIGlmICgoYXJnYyA+IDEpICYmIChzdHJjbXAgKGFyZ3ZbMV0sICItdCIpID09IDApKQorICAgIHdyaXRlX3RlbXBsYXRlICgpOworICBlbHNlCisgICAgd3JpdGVfb3Bjb2RlcygpOworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZAord3JpdGVfaGVhZGVyICgpCit7CisgIHN0cnVjdCBtbjEwMzAwX29wY29kZSAqb3Bjb2RlOworCisgIGZvciAob3Bjb2RlID0gKHN0cnVjdCBtbjEwMzAwX29wY29kZSAqKW1uMTAzMDBfb3Bjb2Rlczsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKKyAgICBwcmludGYoInZvaWQgT1BfJVggUEFSQU1TICgodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZykpO1x0XHQvKiAlcyAqL1xuIiwKKwkgICBvcGNvZGUtPm9wY29kZSwgb3Bjb2RlLT5uYW1lKTsKK30KKworCisvKiB3cml0ZV90ZW1wbGF0ZSBjcmVhdGVzIGEgZmlsZSBhbGwgcmVxdWlyZWQgZnVuY3Rpb25zLCByZWFkeSAqLworLyogdG8gYmUgZmlsbGVkIG91dCAqLworCitzdGF0aWMgdm9pZAord3JpdGVfdGVtcGxhdGUgKCkKK3sKKyAgc3RydWN0IG1uMTAzMDBfb3Bjb2RlICpvcGNvZGU7CisgIGludCBpLGo7CisKKyAgcHJpbnRmICgiI2luY2x1ZGUgXCJtbjEwMzAwX3NpbS5oXCJcbiIpOworICBwcmludGYgKCIjaW5jbHVkZSBcInNpbW9wcy5oXCJcbiIpOworCisgIGZvciAob3Bjb2RlID0gKHN0cnVjdCBtbjEwMzAwX29wY29kZSAqKW1uMTAzMDBfb3Bjb2Rlczsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKKyAgICB7CisgICAgICBwcmludGYoIi8qICVzICovXG52b2lkXG5PUF8lWCAoaW5zbiwgZXh0ZW5zaW9uKVxuICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjtcbntcbiIsIG9wY29kZS0+bmFtZSwgb3Bjb2RlLT5vcGNvZGUpOworCSAgCisgICAgICAvKiBjb3VudCBvcGVyYW5kcyAqLworICAgICAgaiA9IDA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXsKKwkgIGludCBmbGFncyA9IG1uMTAzMDBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3M7CisKKwkgIGlmIChmbGFncykKKwkgICAgaisrOworCX0KKyAgICAgIHN3aXRjaCAoaikKKwl7CisJY2FzZSAwOgorCSAgcHJpbnRmICgicHJpbnRmKFwiICAgJXNcXG5cIik7XG4iLCBvcGNvZGUtPm5hbWUpOworCSAgYnJlYWs7CisJY2FzZSAxOgorCSAgcHJpbnRmICgicHJpbnRmKFwiICAgJXNcXHQlJXhcXG5cIiwgT1BbMF0pO1xuIiwgb3Bjb2RlLT5uYW1lKTsKKwkgIGJyZWFrOworCWNhc2UgMjoKKwkgIHByaW50ZiAoInByaW50ZihcIiAgICVzXFx0JSV4LCUleFxcblwiLE9QWzBdLE9QWzFdKTtcbiIsCisJCSAgb3Bjb2RlLT5uYW1lKTsKKwkgIGJyZWFrOworCWNhc2UgMzoKKwkgIHByaW50ZiAoInByaW50ZihcIiAgICVzXFx0JSV4LCUleCwlJXhcXG5cIixPUFswXSxPUFsxXSxPUFsyXSk7XG4iLAorCQkgIG9wY29kZS0+bmFtZSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgZnByaW50ZiAoc3RkZXJyLCJUb28gbWFueSBvcGVyYW5kczogJWRcbiIsIGopOworCX0KKyAgICAgIHByaW50ZiAoIn1cblxuIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAord3JpdGVfb3Bjb2RlcyAoKQoreworICBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKm9wY29kZTsKKyAgaW50IGksIGo7CisgIGludCBudW1vcHM7CisgIAorICAvKiB3cml0ZSBvdXQgb3Bjb2RlIHRhYmxlICovCisgIHByaW50ZiAoIiNpbmNsdWRlIFwibW4xMDMwMF9zaW0uaFwiXG4iKTsKKyAgcHJpbnRmICgiI2luY2x1ZGUgXCJzaW1vcHMuaFwiXG5cbiIpOworICBwcmludGYgKCJzdHJ1Y3Qgc2ltb3BzIFNpbW9wc1tdID0ge1xuIik7CisgIAorICBmb3IgKG9wY29kZSA9IChzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKiltbjEwMzAwX29wY29kZXM7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCisgICAgeworICAgICAgaW50IHNpemU7CisKKyAgICAgIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzApCisJc2l6ZSA9IDE7CisgICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzEKKyAgICAgICAgICAgICAgIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMCkKKwlzaXplID0gMjsKKyAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMgorICAgICAgICAgICAgICAgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QxKQorCXNpemUgPSAzOworICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M0KQorCXNpemUgPSA1OworICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QyKQorCXNpemUgPSA0OworICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q0KQorCXNpemUgPSA2OworICAgICAgZWxzZQorCXNpemUgPSA3OworCisgICAgICBwcmludGYgKCIgIHsgMHgleCwweCV4LE9QXyVYLCVkLCVkLCIsCisJICAgICAgb3Bjb2RlLT5vcGNvZGUsIG9wY29kZS0+bWFzaywgb3Bjb2RlLT5vcGNvZGUsCisJICAgICAgc2l6ZSwgb3Bjb2RlLT5mb3JtYXQpOworICAgICAgCisgICAgICBPcGNvZGVzW2N1cm9wKytdID0gb3Bjb2RlLT5vcGNvZGU7CisKKyAgICAgIC8qIGNvdW50IG9wZXJhbmRzICovCisgICAgICBqID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJeworCSAgaW50IGZsYWdzID0gbW4xMDMwMF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKKworCSAgaWYgKGZsYWdzKQorCSAgICBqKys7CisJfQorICAgICAgcHJpbnRmICgiJWQseyIsaik7CisJICAKKyAgICAgIGogPSAwOworICAgICAgbnVtb3BzID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJeworCSAgaW50IGZsYWdzID0gbW4xMDMwMF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKKwkgIGludCBzaGlmdCA9IG1uMTAzMDBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uc2hpZnQ7CisKKwkgIGlmIChmbGFncykKKwkgICAgeworCSAgICAgIGlmIChqKQorCQlwcmludGYgKCIsICIpOworCSAgICAgIHByaW50ZiAoIiVkLCVkLCVkIiwgc2hpZnQsCisJCSAgICAgIG1uMTAzMDBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uYml0cyxmbGFncyk7CisJICAgICAgaiA9IDE7CisJICAgICAgbnVtb3BzKys7CisJICAgIH0KKwl9CisKKyAgICAgIHN3aXRjaCAobnVtb3BzKQorCXsKKwljYXNlIDA6CisJICBwcmludGYgKCIwLDAsMCIpOworCWNhc2UgMToKKwkgIHByaW50ZiAoIiwwLDAsMCIpOworCX0KKworICAgICAgcHJpbnRmICgifX0sXG4iKTsKKyAgICB9CisgIHByaW50ZiAoInsgMCwwLE5VTEwsMCwwLDAsezAsMCwwLDAsMCwwfX0sXG59O1xuIik7Cit9CmRpZmYgLS1naXQgYS9zaW0vbW4xMDMwMC9pbnRlcnAuYyBiL3NpbS9tbjEwMzAwL2ludGVycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZTgzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbW4xMDMwMC9pbnRlcnAuYwpAQCAtMCwwICsxLDE0MDIgQEAKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2lmIFdJVEhfQ09NTU9OCisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJzaW0tb3B0aW9ucy5oIgorI2luY2x1ZGUgInNpbS1ody5oIgorI2Vsc2UKKyNpbmNsdWRlICJtbjEwMzAwX3NpbS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJzaW0tYXNzZXJ0LmgiCisKKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJiZmQuaCIKKworI2lmbmRlZiBJTkxJTkUKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBJTkxJTkUgaW5saW5lCisjZWxzZQorI2RlZmluZSBJTkxJTkUKKyNlbmRpZgorI2VuZGlmCisKKworaG9zdF9jYWxsYmFjayAqbW4xMDMwMF9jYWxsYmFjazsKK2ludCBtbjEwMzAwX2RlYnVnOworc3RydWN0IF9zdGF0ZSBTdGF0ZTsKKworCisvKiBzaW11bGF0aW9uIHRhcmdldCBib2FyZC4gIE5VTEw9ZGVmYXVsdCBjb25maWd1cmF0aW9uICovCitzdGF0aWMgY2hhciogYm9hcmQgPSBOVUxMOworCitzdGF0aWMgREVDTEFSRV9PUFRJT05fSEFORExFUiAobW4xMDMwMF9vcHRpb25faGFuZGxlcik7CisKK2VudW0geworICBPUFRJT05fQk9BUkQgPSBPUFRJT05fU1RBUlQsCit9OworCitzdGF0aWMgU0lNX1JDCittbjEwMzAwX29wdGlvbl9oYW5kbGVyIChzZCwgY3B1LCBvcHQsIGFyZywgaXNfY29tbWFuZCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIHNpbV9jcHUgKmNwdTsKKyAgICAgaW50IG9wdDsKKyAgICAgY2hhciAqYXJnOworICAgICBpbnQgaXNfY29tbWFuZDsKK3sKKyAgaW50IGNwdV9ucjsKKyAgc3dpdGNoIChvcHQpCisgICAgeworICAgIGNhc2UgT1BUSU9OX0JPQVJEOgorICAgICAgeworCWlmIChhcmcpCisJICB7CisJICAgIGJvYXJkID0gemFsbG9jKHN0cmxlbihhcmcpICsgMSk7CisJICAgIHN0cmNweShib2FyZCwgYXJnKTsKKwkgIH0KKwlyZXR1cm4gU0lNX1JDX09LOworICAgICAgfQorICAgIH0KKyAgCisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKK3N0YXRpYyBjb25zdCBPUFRJT04gbW4xMDMwMF9vcHRpb25zW10gPSAKK3sKKyNkZWZpbmUgQk9BUkRfQU0zMiAic3RkZXZhbDEiCisgIHsgeyJib2FyZCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQk9BUkR9LAorICAgICAnXDAnLCAibm9uZSIgLyogcmVseSBvbiBjb21waWxlLXRpbWUgc3RyaW5nIGNvbmNhdGVuYXRpb24gZm9yIG90aGVyIG9wdGlvbnMgKi8KKyAgICAgICAgICAgInwiIEJPQVJEX0FNMzIKKyAgICAsICJDdXN0b21pemUgc2ltdWxhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGJvYXJkLiIsIG1uMTAzMDBfb3B0aW9uX2hhbmRsZXIgfSwKKworICB7IHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0sICdcMCcsIE5VTEwsIE5VTEwsIE5VTEwgfQorfTsKKworI2lmIFdJVEhfQ09NTU9OCisjZWxzZQorc3RhdGljIHZvaWQgZGlzcGF0Y2ggUEFSQU1TICgodWludDMyLCB1aW50MzIsIGludCkpOworc3RhdGljIGxvbmcgaGFzaCBQQVJBTVMgKChsb25nKSk7CitzdGF0aWMgdm9pZCBpbml0X3N5c3RlbSBQQVJBTVMgKCh2b2lkKSk7CisKK3N0YXRpYyBTSU1fT1BFTl9LSU5EIHNpbV9raW5kOworc3RhdGljIGNoYXIgKm15bmFtZTsKKyNkZWZpbmUgTUFYX0hBU0ggIDEyNworCitzdHJ1Y3QgaGFzaF9lbnRyeQoreworICBzdHJ1Y3QgaGFzaF9lbnRyeSAqbmV4dDsKKyAgbG9uZyBvcGNvZGU7CisgIGxvbmcgbWFzazsKKyAgc3RydWN0IHNpbW9wcyAqb3BzOworI2lmZGVmIEhBU0hfU1RBVAorICB1bnNpZ25lZCBsb25nIGNvdW50OworI2VuZGlmCit9OworCitzdGF0aWMgaW50IG1heF9tZW0gPSAwOworc3RydWN0IGhhc2hfZW50cnkgaGFzaF90YWJsZVtNQVhfSEFTSCsxXTsKKworCisvKiBUaGlzIHByb2JhYmx5IGRvZXNuJ3QgZG8gYSB2ZXJ5IGdvb2Qgam9iIGF0IGJ1Y2tldCBmaWxsaW5nLCBidXQKKyAgIGl0J3Mgc2ltcGxlLi4uICovCitzdGF0aWMgSU5MSU5FIGxvbmcgCitoYXNoKGluc24pCisgICAgIGxvbmcgaW5zbjsKK3sKKyAgLyogVGhlc2UgYXJlIG9uZSBieXRlIGluc25zLCB3ZSBzcGVjaWFsIGNhc2UgdGhlc2Ugc2luY2UsIGluIHRoZW9yeSwKKyAgICAgdGhleSBzaG91bGQgYmUgdGhlIG1vc3QgaGVhdmlseSB1c2VkLiAgKi8KKyAgaWYgKChpbnNuICYgMHhmZmZmZmYwMCkgPT0gMCkKKyAgICB7CisgICAgICBzd2l0Y2ggKGluc24gJiAweGYwKQorCXsKKwkgIGNhc2UgMHgwMDoKKwkgICAgcmV0dXJuIDB4NzA7CisKKwkgIGNhc2UgMHg0MDoKKwkgICAgcmV0dXJuIDB4NzE7CisKKwkgIGNhc2UgMHgxMDoKKwkgICAgcmV0dXJuIDB4NzI7CisKKwkgIGNhc2UgMHgzMDoKKwkgICAgcmV0dXJuIDB4NzM7CisKKwkgIGNhc2UgMHg1MDoKKwkgICAgcmV0dXJuIDB4NzQ7CisKKwkgIGNhc2UgMHg2MDoKKwkgICAgcmV0dXJuIDB4NzU7CisKKwkgIGNhc2UgMHg3MDoKKwkgICAgcmV0dXJuIDB4NzY7CisKKwkgIGNhc2UgMHg4MDoKKwkgICAgcmV0dXJuIDB4Nzc7CisKKwkgIGNhc2UgMHg5MDoKKwkgICAgcmV0dXJuIDB4Nzg7CisKKwkgIGNhc2UgMHhhMDoKKwkgICAgcmV0dXJuIDB4Nzk7CisKKwkgIGNhc2UgMHhiMDoKKwkgICAgcmV0dXJuIDB4N2E7CisKKwkgIGNhc2UgMHhlMDoKKwkgICAgcmV0dXJuIDB4N2I7CisKKwkgIGRlZmF1bHQ6CisJICAgIHJldHVybiAweDdjOworCX0KKyAgICB9CisKKyAgLyogVGhlc2UgYXJlIHR3byBieXRlIGluc25zICovCisgIGlmICgoaW5zbiAmIDB4ZmZmZjAwMDApID09IDApCisgICAgeworICAgICAgaWYgKChpbnNuICYgMHhmMDAwKSA9PSAweDIwMDAKKwkgIHx8IChpbnNuICYgMHhmMDAwKSA9PSAweDUwMDApCisJcmV0dXJuICgoaW5zbiAmIDB4ZmMwMCkgPj4gOCkgJiAweDdmOworCisgICAgICBpZiAoKGluc24gJiAweGYwMDApID09IDB4NDAwMCkKKwlyZXR1cm4gKChpbnNuICYgMHhmMzAwKSA+PiA4KSAmIDB4N2Y7CisKKyAgICAgIGlmICgoaW5zbiAmIDB4ZjAwMCkgPT0gMHg4MDAwCisJICB8fCAoaW5zbiAmIDB4ZjAwMCkgPT0gMHg5MDAwCisJICB8fCAoaW5zbiAmIDB4ZjAwMCkgPT0gMHhhMDAwCisJICB8fCAoaW5zbiAmIDB4ZjAwMCkgPT0gMHhiMDAwKQorCXJldHVybiAoKGluc24gJiAweGYwMDApID4+IDgpICYgMHg3ZjsKKworICAgICAgaWYgKChpbnNuICYgMHhmZjAwKSA9PSAweGYwMDAKKwkgIHx8IChpbnNuICYgMHhmZjAwKSA9PSAweGYxMDAKKwkgIHx8IChpbnNuICYgMHhmZjAwKSA9PSAweGYyMDAKKwkgIHx8IChpbnNuICYgMHhmZjAwKSA9PSAweGY1MDAKKwkgIHx8IChpbnNuICYgMHhmZjAwKSA9PSAweGY2MDApCisJcmV0dXJuICgoaW5zbiAmIDB4ZmZmMCkgPj4gNCkgJiAweDdmOworIAorICAgICAgaWYgKChpbnNuICYgMHhmMDAwKSA9PSAweGMwMDApCisJcmV0dXJuICgoaW5zbiAmIDB4ZmYwMCkgPj4gOCkgJiAweDdmOworCisgICAgICByZXR1cm4gKChpbnNuICYgMHhmZmMwKSA+PiA2KSAmIDB4N2Y7CisgICAgfQorCisgIC8qIFRoZXNlIGFyZSB0aHJlZSBieXRlIGluc25zLiAgKi8KKyAgaWYgKChpbnNuICYgMHhmZjAwMDAwMCkgPT0gMCkKKyAgICB7CisgICAgICBpZiAoKGluc24gJiAweGYwMDAwMCkgPT0gMHgwMDAwMDApCisJcmV0dXJuICgoaW5zbiAmIDB4ZjMwMDAwKSA+PiAxNikgJiAweDdmOworCisgICAgICBpZiAoKGluc24gJiAweGYwMDAwMCkgPT0gMHgyMDAwMDAKKwkgIHx8IChpbnNuICYgMHhmMDAwMDApID09IDB4MzAwMDAwKQorCXJldHVybiAoKGluc24gJiAweGZjMDAwMCkgPj4gMTYpICYgMHg3ZjsKKworICAgICAgaWYgKChpbnNuICYgMHhmZjAwMDApID09IDB4ZjgwMDAwKQorCXJldHVybiAoKGluc24gJiAweGZmZjAwMCkgPj4gMTIpICYgMHg3ZjsKKworICAgICAgaWYgKChpbnNuICYgMHhmZjAwMDApID09IDB4ZjkwMDAwKQorCXJldHVybiAoKGluc24gJiAweGZmZmMwMCkgPj4gMTApICYgMHg3ZjsKKworICAgICAgcmV0dXJuICgoaW5zbiAmIDB4ZmYwMDAwKSA+PiAxNikgJiAweDdmOworICAgIH0KKworICAvKiBUaGVzZSBhcmUgZm91ciBieXRlIG9yIGxhcmdlciBpbnNucy4gICovCisgIGlmICgoaW5zbiAmIDB4ZjAwMDAwMDApID09IDB4ZjAwMDAwMDApCisgICAgcmV0dXJuICgoaW5zbiAmIDB4ZmZmMDAwMDApID4+IDIwKSAmIDB4N2Y7CisKKyAgcmV0dXJuICgoaW5zbiAmIDB4ZmYwMDAwMDApID4+IDI0KSAmIDB4N2Y7Cit9CisKK3N0YXRpYyBJTkxJTkUgdm9pZAorZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgbGVuZ3RoKQorICAgICB1aW50MzIgaW5zbjsKKyAgICAgdWludDMyIGV4dGVuc2lvbjsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgc3RydWN0IGhhc2hfZW50cnkgKmg7CisKKyAgaCA9ICZoYXNoX3RhYmxlW2hhc2goaW5zbildOworCisgIHdoaWxlICgoaW5zbiAmIGgtPm1hc2spICE9IGgtPm9wY29kZQorCSAgfHwgKGxlbmd0aCAhPSBoLT5vcHMtPmxlbmd0aCkpCisgICAgeworICAgICAgaWYgKCFoLT5uZXh0KQorCXsKKwkgICgqbW4xMDMwMF9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAobW4xMDMwMF9jYWxsYmFjaywKKwkgICAgIkVSUk9SIGxvb2tpbmcgdXAgaGFzaCBmb3IgMHgleCwgUEM9MHgleFxuIiwgaW5zbiwgUEMpOworCSAgZXhpdCgxKTsKKwl9CisgICAgICBoID0gaC0+bmV4dDsKKyAgICB9CisKKworI2lmZGVmIEhBU0hfU1RBVAorICBoLT5jb3VudCsrOworI2VuZGlmCisKKyAgLyogTm93IGNhbGwgdGhlIHJpZ2h0IGZ1bmN0aW9uLiAgKi8KKyAgKGgtPm9wcy0+ZnVuYykoaW5zbiwgZXh0ZW5zaW9uKTsKKyAgUEMgKz0gbGVuZ3RoOworfQorCit2b2lkCitzaW1fc2l6ZSAocG93ZXIpCisgICAgIGludCBwb3dlcjsKKworeworICBpZiAoU3RhdGUubWVtKQorICAgIGZyZWUgKFN0YXRlLm1lbSk7CisKKyAgbWF4X21lbSA9IDEgPDwgcG93ZXI7CisgIFN0YXRlLm1lbSA9ICh1aW50OCAqKSBjYWxsb2MgKDEsICAxIDw8IHBvd2VyKTsKKyAgaWYgKCFTdGF0ZS5tZW0pCisgICAgeworICAgICAgKCptbjEwMzAwX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChtbjEwMzAwX2NhbGxiYWNrLCAiQWxsb2NhdGlvbiBvZiBtYWluIG1lbW9yeSBmYWlsZWQuXG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2luaXRfc3lzdGVtICgpCit7CisgIGlmICghU3RhdGUubWVtKQorICAgIHNpbV9zaXplKDE5KTsKK30KKworaW50CitzaW1fd3JpdGUgKHNkLCBhZGRyLCBidWZmZXIsIHNpemUpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBTSU1fQUREUiBhZGRyOworICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgICAgIGludCBzaXplOworeworICBpbnQgaTsKKworICBpbml0X3N5c3RlbSAoKTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHN0b3JlX2J5dGUgKGFkZHIgKyBpLCBidWZmZXJbaV0pOworCisgIHJldHVybiBzaXplOworfQorCisvKiBDb21wYXJlIHR3byBvcGNvZGUgdGFibGUgZW50cmllcyBmb3IgcXNvcnQuICAqLworc3RhdGljIGludAorY29tcGFyZV9zaW1vcHMgKGFyZzEsIGFyZzIpCisgICAgIGNvbnN0IFBUUiBhcmcxOworICAgICBjb25zdCBQVFIgYXJnMjsKK3sKKyAgdW5zaWduZWQgbG9uZyBjb2RlMSA9ICgoc3RydWN0IHNpbW9wcyAqKWFyZzEpLT5vcGNvZGU7CisgIHVuc2lnbmVkIGxvbmcgY29kZTIgPSAoKHN0cnVjdCBzaW1vcHMgKilhcmcyKS0+b3Bjb2RlOworCisgIGlmIChjb2RlMSA8IGNvZGUyKQorICAgIHJldHVybiAtMTsKKyAgaWYgKGNvZGUyIDwgY29kZTEpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitTSU1fREVTQworc2ltX29wZW4gKGtpbmQsIGNiLCBhYmZkLCBhcmd2KQorICAgICBTSU1fT1BFTl9LSU5EIGtpbmQ7CisgICAgIGhvc3RfY2FsbGJhY2sgKmNiOworICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIHN0cnVjdCBzaW1vcHMgKnM7CisgIHN0cnVjdCBoYXNoX2VudHJ5ICpoOworICBjaGFyICoqcDsKKyAgaW50IGk7CisKKyAgbW4xMDMwMF9jYWxsYmFjayA9IGNiOworCisgIC8qIFNvcnQgdGhlIG9wY29kZSBhcnJheSBmcm9tIHNtYWxsZXN0IG9wY29kZSB0byBsYXJnZXN0LgorICAgICBUaGlzIHdpbGwgZ2VuZXJhbGx5IGltcHJvdmUgc2ltdWxhdG9yIHBlcmZvcm1hbmNlIGFzIHRoZSBzbWFsbGVyCisgICAgIG9wY29kZXMgYXJlIGdlbmVyYWxseSBwcmVmZXJyZWQgdG8gdGhlIGxhcmdlciBvcGNvZGVzLiAgKi8KKyAgZm9yIChpID0gMCwgcyA9IFNpbW9wczsgcy0+ZnVuYzsgcysrLCBpKyspCisgICAgOworICBxc29ydCAoU2ltb3BzLCBpLCBzaXplb2YgKFNpbW9wc1swXSksIGNvbXBhcmVfc2ltb3BzKTsKKworICBzaW1fa2luZCA9IGtpbmQ7CisgIG15bmFtZSA9IGFyZ3ZbMF07CisKKyAgZm9yIChwID0gYXJndiArIDE7ICpwOyArK3ApCisgICAgeworICAgICAgaWYgKHN0cmNtcCAoKnAsICItRSIpID09IDApCisJKytwOyAvKiBpZ25vcmUgZW5kaWFuIHNwZWMgKi8KKyAgICAgIGVsc2UKKyNpZmRlZiBERUJVRworICAgICAgaWYgKHN0cmNtcCAoKnAsICItdCIpID09IDApCisJbW4xMDMwMF9kZWJ1ZyA9IERFQlVHOworICAgICAgZWxzZQorI2VuZGlmCisJKCptbjEwMzAwX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChtbjEwMzAwX2NhbGxiYWNrLCAiRVJST1I6IHVuc3VwcG9ydGVkIG9wdGlvbihzKTogJXNcbiIsKnApOworICAgIH0KKworIC8qIHB1dCBhbGwgdGhlIG9wY29kZXMgaW4gdGhlIGhhc2ggdGFibGUgKi8KKyAgZm9yIChzID0gU2ltb3BzOyBzLT5mdW5jOyBzKyspCisgICAgeworICAgICAgaCA9ICZoYXNoX3RhYmxlW2hhc2gocy0+b3Bjb2RlKV07CisKKyAgICAgIC8qIGdvIHRvIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBjaGFpbiAqLworICAgICAgd2hpbGUgKGgtPm5leHQpCisJeworCSAgLyogRG9uJ3QgaW5zZXJ0IHRoZSBzYW1lIG9wY29kZSBtb3JlIHRoYW4gb25jZS4gICovCisJICBpZiAoaC0+b3Bjb2RlID09IHMtPm9wY29kZQorCSAgICAgICYmIGgtPm1hc2sgPT0gcy0+bWFzaworCSAgICAgICYmIGgtPm9wcyA9PSBzKQorCSAgICBicmVhazsKKwkgIGVsc2UKKwkgICAgaCA9IGgtPm5leHQ7CisJfQorCisgICAgICAvKiBEb24ndCBpbnNlcnQgdGhlIHNhbWUgb3Bjb2RlIG1vcmUgdGhhbiBvbmNlLiAgKi8KKyAgICAgIGlmIChoLT5vcGNvZGUgPT0gcy0+b3Bjb2RlCisJICAmJiBoLT5tYXNrID09IHMtPm1hc2sKKwkgICYmIGgtPm9wcyA9PSBzKQorCWNvbnRpbnVlOworCisgICAgICBpZiAoaC0+b3BzKQorCXsKKwkgIGgtPm5leHQgPSBjYWxsb2MoMSxzaXplb2Yoc3RydWN0IGhhc2hfZW50cnkpKTsKKwkgIGggPSBoLT5uZXh0OworCX0KKyAgICAgIGgtPm9wcyA9IHM7CisgICAgICBoLT5tYXNrID0gcy0+bWFzazsKKyAgICAgIGgtPm9wY29kZSA9IHMtPm9wY29kZTsKKyNpZiBIQVNIX1NUQVQKKyAgICAgIGgtPmNvdW50ID0gMDsKKyNlbmRpZgorICAgIH0KKworCisgIC8qIGZ1ZGdlIG91ciBkZXNjcmlwdG9yIGZvciBub3cgKi8KKyAgcmV0dXJuIChTSU1fREVTQykgMTsKK30KKworCit2b2lkCitzaW1fY2xvc2UgKHNkLCBxdWl0dGluZykKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCBxdWl0dGluZzsKK3sKKyAgLyogbm90aGluZyB0byBkbyAqLworfQorCit2b2lkCitzaW1fc2V0X3Byb2ZpbGUgKG4pCisgICAgIGludCBuOworeworICAoKm1uMTAzMDBfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKG1uMTAzMDBfY2FsbGJhY2ssICJzaW1fc2V0X3Byb2ZpbGUgJWRcbiIsIG4pOworfQorCit2b2lkCitzaW1fc2V0X3Byb2ZpbGVfc2l6ZSAobikKKyAgICAgaW50IG47Cit7CisgICgqbW4xMDMwMF9jYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAobW4xMDMwMF9jYWxsYmFjaywgInNpbV9zZXRfcHJvZmlsZV9zaXplICVkXG4iLCBuKTsKK30KKworaW50CitzaW1fc3RvcCAoc2QpCisgICAgIFNJTV9ERVNDIHNkOworeworICByZXR1cm4gMDsKK30KKwordm9pZAorc2ltX3Jlc3VtZSAoc2QsIHN0ZXAsIHNpZ2duYWwpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgc3RlcCwgc2lnZ25hbDsKK3sKKyAgdWludDMyIGluc3Q7CisgIHJlZ190IG9sZHBjOworICBzdHJ1Y3QgaGFzaF9lbnRyeSAqaDsKKworICBpZiAoc3RlcCkKKyAgICBTdGF0ZS5leGNlcHRpb24gPSBTSUdUUkFQOworICBlbHNlCisgICAgU3RhdGUuZXhjZXB0aW9uID0gMDsKKworICBTdGF0ZS5leGl0ZWQgPSAwOworCisgIGRvCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247CisKKyAgICAgIC8qIEZldGNoIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLiAgKi8KKyAgICAgIGluc3QgPSBsb2FkX21lbV9iaWcgKFBDLCAyKTsKKyAgICAgIG9sZHBjID0gUEM7CisKKyAgICAgIC8qIFVzaW5nIGEgZ2lhbnQgY2FzZSBzdGF0ZW1lbnQgbWF5IHNlZW0gbGlrZSBhIHdhc3RlIGJlY2F1c2Ugb2YgdGhlCisgCWNvZGUvcm9kYXRhIHNpemUgdGhlIHRhYmxlIGl0c2VsZiB3aWxsIGNvbnN1bWUuICBIb3dldmVyLCB1c2luZworIAlhIGdpYW50IGNhc2Ugc3RhdGVtZW50IHNwZWVkcyB1cCB0aGUgc2ltdWxhdG9yIGJ5IDEwLTE1JSBieSBhdm9pZGluZworIAljYXNjYWRpbmcgaWYvZWxzZSBzdGF0ZW1lbnRzIG9yIGNhc2NhZGluZyBjYXNlIHN0YXRlbWVudHMuICAqLworCisgICAgICBzd2l0Y2ggKChpbnN0ID4+IDgpICYgMHhmZikKKwl7CisJICAvKiBBbGwgdGhlIHNpbmdsZSBieXRlIGluc25zIGV4Y2VwdCAweDgwLCAweDkwLCAweGEwLCAweGIwCisJICAgICB3aGljaCBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5LiAgKi8KKwkgIGNhc2UgMHgwMDoKKwkgIGNhc2UgMHgwNDoKKwkgIGNhc2UgMHgwODoKKwkgIGNhc2UgMHgwYzoKKwkgIGNhc2UgMHgxMDoKKwkgIGNhc2UgMHgxMToKKwkgIGNhc2UgMHgxMjoKKwkgIGNhc2UgMHgxMzoKKwkgIGNhc2UgMHgxNDoKKwkgIGNhc2UgMHgxNToKKwkgIGNhc2UgMHgxNjoKKwkgIGNhc2UgMHgxNzoKKwkgIGNhc2UgMHgxODoKKwkgIGNhc2UgMHgxOToKKwkgIGNhc2UgMHgxYToKKwkgIGNhc2UgMHgxYjoKKwkgIGNhc2UgMHgxYzoKKwkgIGNhc2UgMHgxZDoKKwkgIGNhc2UgMHgxZToKKwkgIGNhc2UgMHgxZjoKKwkgIGNhc2UgMHgzYzoKKwkgIGNhc2UgMHgzZDoKKwkgIGNhc2UgMHgzZToKKwkgIGNhc2UgMHgzZjoKKwkgIGNhc2UgMHg0MDoKKwkgIGNhc2UgMHg0MToKKwkgIGNhc2UgMHg0NDoKKwkgIGNhc2UgMHg0NToKKwkgIGNhc2UgMHg0ODoKKwkgIGNhc2UgMHg0OToKKwkgIGNhc2UgMHg0YzoKKwkgIGNhc2UgMHg0ZDoKKwkgIGNhc2UgMHg1MDoKKwkgIGNhc2UgMHg1MToKKwkgIGNhc2UgMHg1MjoKKwkgIGNhc2UgMHg1MzoKKwkgIGNhc2UgMHg1NDoKKwkgIGNhc2UgMHg1NToKKwkgIGNhc2UgMHg1NjoKKwkgIGNhc2UgMHg1NzoKKwkgIGNhc2UgMHg2MDoKKwkgIGNhc2UgMHg2MToKKwkgIGNhc2UgMHg2MjoKKwkgIGNhc2UgMHg2MzoKKwkgIGNhc2UgMHg2NDoKKwkgIGNhc2UgMHg2NToKKwkgIGNhc2UgMHg2NjoKKwkgIGNhc2UgMHg2NzoKKwkgIGNhc2UgMHg2ODoKKwkgIGNhc2UgMHg2OToKKwkgIGNhc2UgMHg2YToKKwkgIGNhc2UgMHg2YjoKKwkgIGNhc2UgMHg2YzoKKwkgIGNhc2UgMHg2ZDoKKwkgIGNhc2UgMHg2ZToKKwkgIGNhc2UgMHg2ZjoKKwkgIGNhc2UgMHg3MDoKKwkgIGNhc2UgMHg3MToKKwkgIGNhc2UgMHg3MjoKKwkgIGNhc2UgMHg3MzoKKwkgIGNhc2UgMHg3NDoKKwkgIGNhc2UgMHg3NToKKwkgIGNhc2UgMHg3NjoKKwkgIGNhc2UgMHg3NzoKKwkgIGNhc2UgMHg3ODoKKwkgIGNhc2UgMHg3OToKKwkgIGNhc2UgMHg3YToKKwkgIGNhc2UgMHg3YjoKKwkgIGNhc2UgMHg3YzoKKwkgIGNhc2UgMHg3ZDoKKwkgIGNhc2UgMHg3ZToKKwkgIGNhc2UgMHg3ZjoKKwkgIGNhc2UgMHhjYjoKKwkgIGNhc2UgMHhkMDoKKwkgIGNhc2UgMHhkMToKKwkgIGNhc2UgMHhkMjoKKwkgIGNhc2UgMHhkMzoKKwkgIGNhc2UgMHhkNDoKKwkgIGNhc2UgMHhkNToKKwkgIGNhc2UgMHhkNjoKKwkgIGNhc2UgMHhkNzoKKwkgIGNhc2UgMHhkODoKKwkgIGNhc2UgMHhkOToKKwkgIGNhc2UgMHhkYToKKwkgIGNhc2UgMHhkYjoKKwkgIGNhc2UgMHhlMDoKKwkgIGNhc2UgMHhlMToKKwkgIGNhc2UgMHhlMjoKKwkgIGNhc2UgMHhlMzoKKwkgIGNhc2UgMHhlNDoKKwkgIGNhc2UgMHhlNToKKwkgIGNhc2UgMHhlNjoKKwkgIGNhc2UgMHhlNzoKKwkgIGNhc2UgMHhlODoKKwkgIGNhc2UgMHhlOToKKwkgIGNhc2UgMHhlYToKKwkgIGNhc2UgMHhlYjoKKwkgIGNhc2UgMHhlYzoKKwkgIGNhc2UgMHhlZDoKKwkgIGNhc2UgMHhlZToKKwkgIGNhc2UgMHhlZjoKKwkgIGNhc2UgMHhmZjoKKwkgICAgaW5zbiA9IChpbnN0ID4+IDgpICYgMHhmZjsKKwkgICAgZXh0ZW5zaW9uID0gMDsKKwkgICAgZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgMSk7CisJICAgIGJyZWFrOworCisJICAvKiBTcGVjaWFsIGNhc2VzIHdoZXJlIGRtID09IGRuIGlzIHVzZWQgdG8gZW5jb2RlIGEgZGlmZmVyZW50CisJICAgICBpbnN0cnVjdGlvbi4gICovCisJICBjYXNlIDB4ODA6CisJICBjYXNlIDB4ODU6CisJICBjYXNlIDB4OGE6CisJICBjYXNlIDB4OGY6CisJICBjYXNlIDB4OTA6CisJICBjYXNlIDB4OTU6CisJICBjYXNlIDB4OWE6CisJICBjYXNlIDB4OWY6CisJICBjYXNlIDB4YTA6CisJICBjYXNlIDB4YTU6CisJICBjYXNlIDB4YWE6CisJICBjYXNlIDB4YWY6CisJICBjYXNlIDB4YjA6CisJICBjYXNlIDB4YjU6CisJICBjYXNlIDB4YmE6CisJICBjYXNlIDB4YmY6CisJICAgIGluc24gPSBpbnN0OworCSAgICBleHRlbnNpb24gPSAwOworCSAgICBkaXNwYXRjaCAoaW5zbiwgZXh0ZW5zaW9uLCAyKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgMHg4MToKKwkgIGNhc2UgMHg4MjoKKwkgIGNhc2UgMHg4MzoKKwkgIGNhc2UgMHg4NDoKKwkgIGNhc2UgMHg4NjoKKwkgIGNhc2UgMHg4NzoKKwkgIGNhc2UgMHg4ODoKKwkgIGNhc2UgMHg4OToKKwkgIGNhc2UgMHg4YjoKKwkgIGNhc2UgMHg4YzoKKwkgIGNhc2UgMHg4ZDoKKwkgIGNhc2UgMHg4ZToKKwkgIGNhc2UgMHg5MToKKwkgIGNhc2UgMHg5MjoKKwkgIGNhc2UgMHg5MzoKKwkgIGNhc2UgMHg5NDoKKwkgIGNhc2UgMHg5NjoKKwkgIGNhc2UgMHg5NzoKKwkgIGNhc2UgMHg5ODoKKwkgIGNhc2UgMHg5OToKKwkgIGNhc2UgMHg5YjoKKwkgIGNhc2UgMHg5YzoKKwkgIGNhc2UgMHg5ZDoKKwkgIGNhc2UgMHg5ZToKKwkgIGNhc2UgMHhhMToKKwkgIGNhc2UgMHhhMjoKKwkgIGNhc2UgMHhhMzoKKwkgIGNhc2UgMHhhNDoKKwkgIGNhc2UgMHhhNjoKKwkgIGNhc2UgMHhhNzoKKwkgIGNhc2UgMHhhODoKKwkgIGNhc2UgMHhhOToKKwkgIGNhc2UgMHhhYjoKKwkgIGNhc2UgMHhhYzoKKwkgIGNhc2UgMHhhZDoKKwkgIGNhc2UgMHhhZToKKwkgIGNhc2UgMHhiMToKKwkgIGNhc2UgMHhiMjoKKwkgIGNhc2UgMHhiMzoKKwkgIGNhc2UgMHhiNDoKKwkgIGNhc2UgMHhiNjoKKwkgIGNhc2UgMHhiNzoKKwkgIGNhc2UgMHhiODoKKwkgIGNhc2UgMHhiOToKKwkgIGNhc2UgMHhiYjoKKwkgIGNhc2UgMHhiYzoKKwkgIGNhc2UgMHhiZDoKKwkgIGNhc2UgMHhiZToKKwkgICAgaW5zbiA9IChpbnN0ID4+IDgpICYgMHhmZjsKKwkgICAgZXh0ZW5zaW9uID0gMDsKKwkgIGRpc3BhdGNoIChpbnNuLCBleHRlbnNpb24sIDEpOworCSAgYnJlYWs7CisKKwkgIC8qIFRoZSB0d28gYnl0ZSBpbnN0cnVjdGlvbnMuICAqLworCSAgY2FzZSAweDIwOgorCSAgY2FzZSAweDIxOgorCSAgY2FzZSAweDIyOgorCSAgY2FzZSAweDIzOgorCSAgY2FzZSAweDI4OgorCSAgY2FzZSAweDI5OgorCSAgY2FzZSAweDJhOgorCSAgY2FzZSAweDJiOgorCSAgY2FzZSAweDQyOgorCSAgY2FzZSAweDQzOgorCSAgY2FzZSAweDQ2OgorCSAgY2FzZSAweDQ3OgorCSAgY2FzZSAweDRhOgorCSAgY2FzZSAweDRiOgorCSAgY2FzZSAweDRlOgorCSAgY2FzZSAweDRmOgorCSAgY2FzZSAweDU4OgorCSAgY2FzZSAweDU5OgorCSAgY2FzZSAweDVhOgorCSAgY2FzZSAweDViOgorCSAgY2FzZSAweDVjOgorCSAgY2FzZSAweDVkOgorCSAgY2FzZSAweDVlOgorCSAgY2FzZSAweDVmOgorCSAgY2FzZSAweGMwOgorCSAgY2FzZSAweGMxOgorCSAgY2FzZSAweGMyOgorCSAgY2FzZSAweGMzOgorCSAgY2FzZSAweGM0OgorCSAgY2FzZSAweGM1OgorCSAgY2FzZSAweGM2OgorCSAgY2FzZSAweGM3OgorCSAgY2FzZSAweGM4OgorCSAgY2FzZSAweGM5OgorCSAgY2FzZSAweGNhOgorCSAgY2FzZSAweGNlOgorCSAgY2FzZSAweGNmOgorCSAgY2FzZSAweGYwOgorCSAgY2FzZSAweGYxOgorCSAgY2FzZSAweGYyOgorCSAgY2FzZSAweGYzOgorCSAgY2FzZSAweGY0OgorCSAgY2FzZSAweGY1OgorCSAgY2FzZSAweGY2OgorCSAgICBpbnNuID0gaW5zdDsKKwkgICAgZXh0ZW5zaW9uID0gMDsKKwkgICAgZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgMik7CisJICAgIGJyZWFrOworCisJICAvKiBUaGUgdGhyZWUgYnl0ZSBpbnNucyB3aXRoIGEgMTZiaXQgb3BlcmFuZCBpbiBsaXR0bGUgZW5kaWFuCisJICAgICBmb3JtYXQuICAqLworCSAgY2FzZSAweDAxOgorCSAgY2FzZSAweDAyOgorCSAgY2FzZSAweDAzOgorCSAgY2FzZSAweDA1OgorCSAgY2FzZSAweDA2OgorCSAgY2FzZSAweDA3OgorCSAgY2FzZSAweDA5OgorCSAgY2FzZSAweDBhOgorCSAgY2FzZSAweDBiOgorCSAgY2FzZSAweDBkOgorCSAgY2FzZSAweDBlOgorCSAgY2FzZSAweDBmOgorCSAgY2FzZSAweDI0OgorCSAgY2FzZSAweDI1OgorCSAgY2FzZSAweDI2OgorCSAgY2FzZSAweDI3OgorCSAgY2FzZSAweDJjOgorCSAgY2FzZSAweDJkOgorCSAgY2FzZSAweDJlOgorCSAgY2FzZSAweDJmOgorCSAgY2FzZSAweDMwOgorCSAgY2FzZSAweDMxOgorCSAgY2FzZSAweDMyOgorCSAgY2FzZSAweDMzOgorCSAgY2FzZSAweDM0OgorCSAgY2FzZSAweDM1OgorCSAgY2FzZSAweDM2OgorCSAgY2FzZSAweDM3OgorCSAgY2FzZSAweDM4OgorCSAgY2FzZSAweDM5OgorCSAgY2FzZSAweDNhOgorCSAgY2FzZSAweDNiOgorCSAgY2FzZSAweGNjOgorCSAgICBpbnNuID0gbG9hZF9ieXRlIChQQyk7CisJICAgIGluc24gPDw9IDE2OworCSAgICBpbnNuIHw9IGxvYWRfaGFsZiAoUEMgKyAxKTsKKwkgICAgZXh0ZW5zaW9uID0gMDsKKwkgICAgZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgMyk7CisJICAgIGJyZWFrOworCisJICAvKiBUaGUgdGhyZWUgYnl0ZSBpbnNucyB3aXRob3V0IDE2Yml0IG9wZXJhbmQuICAqLworCSAgY2FzZSAweGRlOgorCSAgY2FzZSAweGRmOgorCSAgY2FzZSAweGY4OgorCSAgY2FzZSAweGY5OgorCSAgICBpbnNuID0gbG9hZF9tZW1fYmlnIChQQywgMyk7CisJICAgIGV4dGVuc2lvbiA9IDA7CisJICAgIGRpc3BhdGNoIChpbnNuLCBleHRlbnNpb24sIDMpOworCSAgICBicmVhazsKKwkgIAorCSAgLyogRm91ciBieXRlIGluc25zLiAgKi8KKwkgIGNhc2UgMHhmYToKKwkgIGNhc2UgMHhmYjoKKwkgICAgaWYgKChpbnN0ICYgMHhmZmZjKSA9PSAweGZhZjAKKwkJfHwgKGluc3QgJiAweGZmZmMpID09IDB4ZmFmNAorCQl8fCAoaW5zdCAmIDB4ZmZmYykgPT0gMHhmYWY4KQorCSAgICAgIGluc24gPSBsb2FkX21lbV9iaWcgKFBDLCA0KTsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJaW5zbiA9IGluc3Q7CisJCWluc24gPDw9IDE2OworCQlpbnNuIHw9IGxvYWRfaGFsZiAoUEMgKyAyKTsKKwkJZXh0ZW5zaW9uID0gMDsKKwkgICAgICB9CisJICAgIGRpc3BhdGNoIChpbnNuLCBleHRlbnNpb24sIDQpOworCSAgICBicmVhazsKKworCSAgLyogRml2ZSBieXRlIGluc25zLiAgKi8KKwkgIGNhc2UgMHhjZDoKKwkgICAgaW5zbiA9IGxvYWRfYnl0ZSAoUEMpOworCSAgICBpbnNuIDw8PSAyNDsKKwkgICAgaW5zbiB8PSAobG9hZF9oYWxmIChQQyArIDEpIDw8IDgpOworCSAgICBpbnNuIHw9IGxvYWRfYnl0ZSAoUEMgKyAzKTsKKwkgICAgZXh0ZW5zaW9uID0gbG9hZF9ieXRlIChQQyArIDQpOworCSAgICBkaXNwYXRjaCAoaW5zbiwgZXh0ZW5zaW9uLCA1KTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgMHhkYzoKKwkgICAgaW5zbiA9IGxvYWRfYnl0ZSAoUEMpOworCSAgICBpbnNuIDw8PSAyNDsKKwkgICAgZXh0ZW5zaW9uID0gbG9hZF93b3JkIChQQyArIDEpOworCSAgICBpbnNuIHw9IChleHRlbnNpb24gJiAweGZmZmZmZjAwKSA+PiA4OworCSAgICBleHRlbnNpb24gJj0gMHhmZjsKKwkgICAgZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgNSk7CisJICAgIGJyZWFrOworCQorCSAgLyogU2l4IGJ5dGUgaW5zbnMuICAqLworCSAgY2FzZSAweGZjOgorCSAgY2FzZSAweGZkOgorCSAgICBpbnNuID0gKGluc3QgPDwgMTYpOworCSAgICBleHRlbnNpb24gPSBsb2FkX3dvcmQgKFBDICsgMik7CisJICAgIGluc24gfD0gKChleHRlbnNpb24gJiAweGZmZmYwMDAwKSA+PiAxNik7CisJICAgIGV4dGVuc2lvbiAmPSAweGZmZmY7CisJICAgIGRpc3BhdGNoIChpbnNuLCBleHRlbnNpb24sIDYpOworCSAgICBicmVhazsKKwkgICAgCisJICBjYXNlIDB4ZGQ6CisJICAgIGluc24gPSBsb2FkX2J5dGUgKFBDKSA8PCAyNDsKKwkgICAgZXh0ZW5zaW9uID0gbG9hZF93b3JkIChQQyArIDEpOworCSAgICBpbnNuIHw9ICgoZXh0ZW5zaW9uID4+IDgpICYgMHhmZmZmZmYpOworCSAgICBleHRlbnNpb24gPSAoZXh0ZW5zaW9uICYgMHhmZikgPDwgMTY7CisJICAgIGV4dGVuc2lvbiB8PSBsb2FkX2J5dGUgKFBDICsgNSkgPDwgODsKKwkgICAgZXh0ZW5zaW9uIHw9IGxvYWRfYnl0ZSAoUEMgKyA2KTsKKwkgICAgZGlzcGF0Y2ggKGluc24sIGV4dGVuc2lvbiwgNyk7CisJICAgIGJyZWFrOworCisJICBjYXNlIDB4ZmU6CisJICAgIGluc24gPSBpbnN0IDw8IDE2OworCSAgICBleHRlbnNpb24gPSBsb2FkX3dvcmQgKFBDICsgMik7CisJICAgIGluc24gfD0gKChleHRlbnNpb24gPj4gMTYpICYgMHhmZmZmKTsKKwkgICAgZXh0ZW5zaW9uIDw8PSA4OworCSAgICBleHRlbnNpb24gJj0gMHhmZmZmMDA7CisJICAgIGV4dGVuc2lvbiB8PSBsb2FkX2J5dGUgKFBDICsgNik7CisJICAgIGRpc3BhdGNoIChpbnNuLCBleHRlbnNpb24sIDcpOworCSAgICBicmVhazsKKworCSAgZGVmYXVsdDoKKwkgICAgYWJvcnQgKCk7CisJfQorICAgIH0KKyAgd2hpbGUgKCFTdGF0ZS5leGNlcHRpb24pOworCisjaWZkZWYgSEFTSF9TVEFUCisgIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0hBU0g7IGkrKykKKyAgICAgIHsKKwkgc3RydWN0IGhhc2hfZW50cnkgKmg7CisJIGggPSAmaGFzaF90YWJsZVtpXTsKKworCSBwcmludGYoImhhc2ggMHgleDpcbiIsIGkpOworCisJIHdoaWxlIChoKQorCSAgIHsKKwkgICAgIHByaW50ZigiaC0+b3Bjb2RlID0gMHgleCwgY291bnQgPSAweCV4XG4iLCBoLT5vcGNvZGUsIGgtPmNvdW50KTsKKwkgICAgIGggPSBoLT5uZXh0OworCSAgIH0KKworCSBwcmludGYoIlxuXG4iKTsKKyAgICAgIH0KKyAgICBmZmx1c2ggKHN0ZG91dCk7CisgIH0KKyNlbmRpZgorCit9CisKK2ludAorc2ltX3RyYWNlIChzZCkKKyAgICAgU0lNX0RFU0Mgc2Q7Cit7CisjaWZkZWYgREVCVUcKKyAgbW4xMDMwMF9kZWJ1ZyA9IERFQlVHOworI2VuZGlmCisgIHNpbV9yZXN1bWUgKHNkLCAwLCAwKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQKK3NpbV9pbmZvIChzZCwgdmVyYm9zZSkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCB2ZXJib3NlOworeworICAoKm1uMTAzMDBfY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCkgKG1uMTAzMDBfY2FsbGJhY2ssICJzaW1faW5mb1xuIik7Cit9CisKK1NJTV9SQworc2ltX2NyZWF0ZV9pbmZlcmlvciAoc2QsIGFiZmQsIGFyZ3YsIGVudikKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIHN0cnVjdCBfYmZkICphYmZkOworICAgICBjaGFyICoqYXJndjsKKyAgICAgY2hhciAqKmVudjsKK3sKKyAgaWYgKGFiZmQgIT0gTlVMTCkKKyAgICBQQyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CisgIGVsc2UKKyAgICBQQyA9IDA7CisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKK3ZvaWQKK3NpbV9zZXRfY2FsbGJhY2tzIChwKQorICAgICBob3N0X2NhbGxiYWNrICpwOworeworICBtbjEwMzAwX2NhbGxiYWNrID0gcDsKK30KKworLyogQWxsIHRoZSBjb2RlIGZvciBleGl0aW5nLCBzaWduYWxzLCBldGMgbmVlZHMgdG8gYmUgcmV2YW1wZWQuCisKKyAgIFRoaXMgaXMgZW5vdWdoIHRvIGdldCBjLXRvcnR1cmUgbGltcGluZyB0aG91Z2guICAqLworCit2b2lkCitzaW1fc3RvcF9yZWFzb24gKHNkLCByZWFzb24sIHNpZ3JjKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgZW51bSBzaW1fc3RvcCAqcmVhc29uOworICAgICBpbnQgKnNpZ3JjOworeworICBpZiAoU3RhdGUuZXhpdGVkKQorICAgICpyZWFzb24gPSBzaW1fZXhpdGVkOworICBlbHNlCisgICAgKnJlYXNvbiA9IHNpbV9zdG9wcGVkOworCisgIGlmIChTdGF0ZS5leGNlcHRpb24gPT0gU0lHUVVJVCkKKyAgICAqc2lncmMgPSAwOworICBlbHNlCisgICAgKnNpZ3JjID0gU3RhdGUuZXhjZXB0aW9uOworfQorCitpbnQKK3NpbV9yZWFkIChzZCwgYWRkciwgYnVmZmVyLCBzaXplKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgU0lNX0FERFIgYWRkcjsKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICAgICBpbnQgc2l6ZTsKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgYnVmZmVyW2ldID0gbG9hZF9ieXRlIChhZGRyICsgaSk7CisKKyAgcmV0dXJuIHNpemU7Cit9IAorCit2b2lkCitzaW1fZG9fY29tbWFuZCAoc2QsIGNtZCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGNoYXIgKmNtZDsKK3sKKyAgKCptbjEwMzAwX2NhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChtbjEwMzAwX2NhbGxiYWNrLCAiXCIlc1wiIGlzIG5vdCBhIHZhbGlkIG1uMTAzMDAgc2ltdWxhdG9yIGNvbW1hbmQuXG4iLCBjbWQpOworfQorCitTSU1fUkMKK3NpbV9sb2FkIChzZCwgcHJvZywgYWJmZCwgZnJvbV90dHkpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBjaGFyICpwcm9nOworICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZXh0ZXJuIGJmZCAqc2ltX2xvYWRfZmlsZSAoKTsgLyogPz8/IERvbid0IGtub3cgd2hlcmUgdGhpcyBzaG91bGQgbGl2ZS4gICovCisgIGJmZCAqcHJvZ19iZmQ7CisKKyAgcHJvZ19iZmQgPSBzaW1fbG9hZF9maWxlIChzZCwgbXluYW1lLCBtbjEwMzAwX2NhbGxiYWNrLCBwcm9nLCBhYmZkLAorCQkJICAgIHNpbV9raW5kID09IFNJTV9PUEVOX0RFQlVHLAorCQkJICAgIDAsIHNpbV93cml0ZSk7CisgIGlmIChwcm9nX2JmZCA9PSBOVUxMKQorICAgIHJldHVybiBTSU1fUkNfRkFJTDsKKyAgaWYgKGFiZmQgPT0gTlVMTCkKKyAgICBiZmRfY2xvc2UgKHByb2dfYmZkKTsKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30gCisjZW5kaWYgIC8qIG5vdCBXSVRIX0NPTU1PTiAqLworCisKKyNpZiBXSVRIX0NPTU1PTgorCisvKiBGb3IgY29tcGF0aWJpbGl0eSAqLworU0lNX0RFU0Mgc2ltdWxhdG9yOworCisvKiBUaGVzZSBkZWZhdWx0IHZhbHVlcyBjb3JyZXNwb25kIHRvIGV4cGVjdGVkIHVzYWdlIGZvciB0aGUgY2hpcC4gICovCisKK1NJTV9ERVNDCitzaW1fb3BlbiAoa2luZCwgY2IsIGFiZmQsIGFyZ3YpCisgICAgIFNJTV9PUEVOX0tJTkQga2luZDsKKyAgICAgaG9zdF9jYWxsYmFjayAqY2I7CisgICAgIHN0cnVjdCBfYmZkICphYmZkOworICAgICBjaGFyICoqYXJndjsKK3sKKyAgU0lNX0RFU0Mgc2QgPSBzaW1fc3RhdGVfYWxsb2MgKGtpbmQsIGNiKTsKKyAgbW4xMDMwMF9jYWxsYmFjayA9IGNiOworCisgIFNJTV9BU1NFUlQgKFNUQVRFX01BR0lDIChzZCkgPT0gU0lNX01BR0lDX05VTUJFUik7CisKKyAgLyogZm9yIGNvbXBhdGliaWxpdHkgKi8KKyAgc2ltdWxhdG9yID0gc2Q7CisKKyAgLyogRklYTUU6IHNob3VsZCBiZSBiZXR0ZXIgd2F5IG9mIHNldHRpbmcgdXAgaW50ZXJydXB0cy4gIEZvcgorICAgICBtb21lbnQsIG9ubHkgc3VwcG9ydCB3YXRjaHBvaW50cyBjYXVzaW5nIGEgYnJlYWtwb2ludCAoZ2RiCisgICAgIGhhbHQpLiAqLworICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5wYyA9ICYoUEMpOworICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5zaXplb2ZfcGMgPSBzaXplb2YgKFBDKTsKKyAgU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKS0+aW50ZXJydXB0X2hhbmRsZXIgPSBOVUxMOworICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5pbnRlcnJ1cHRfbmFtZXMgPSBOVUxMOworCisgIGlmIChzaW1fcHJlX2FyZ3ZfaW5pdCAoc2QsIGFyZ3ZbMF0pICE9IFNJTV9SQ19PSykKKyAgICByZXR1cm4gMDsKKyAgc2ltX2FkZF9vcHRpb25fdGFibGUgKHNkLCBOVUxMLCBtbjEwMzAwX29wdGlvbnMpOworCisgIC8qIEFsbG9jYXRlIGNvcmUgbWFuYWdlZCBtZW1vcnkgKi8KKyAgc2ltX2RvX2NvbW1hbmQgKHNkLCAibWVtb3J5IHJlZ2lvbiAwLDB4MTAwMDAwIik7CisgIHNpbV9kb19jb21tYW5kIChzZCwgIm1lbW9yeSByZWdpb24gMHg0MDAwMDAwMCwweDIwMDAwMCIpOworCisgIC8qIGdldG9wdCB3aWxsIHByaW50IHRoZSBlcnJvciBtZXNzYWdlIHNvIHdlIGp1c3QgaGF2ZSB0byBleGl0IGlmIHRoaXMgZmFpbHMuCisgICAgIEZJWE1FOiBIbW1tLi4uICBpbiB0aGUgY2FzZSBvZiBnZGIgd2UgbmVlZCBnZXRvcHQgdG8gY2FsbAorICAgICBwcmludF9maWx0ZXJlZC4gICovCisgIGlmIChzaW1fcGFyc2VfYXJncyAoc2QsIGFyZ3YpICE9IFNJTV9SQ19PSykKKyAgICB7CisgICAgICAvKiBVbmluc3RhbGwgdGhlIG1vZHVsZXMgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLAorCSBmaWxlIGRlc2NyaXB0b3IgbGVha3MsIGV0Yy4gICovCisgICAgICBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoc2QpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmICggTlVMTCAhPSBib2FyZAorICAgICAgICYmIChzdHJjbXAoYm9hcmQsIEJPQVJEX0FNMzIpID09IDAgKSApCisgICAgeworICAgICAgLyogZW52aXJvbm1lbnQgKi8KKyAgICAgIFNUQVRFX0VOVklST05NRU5UIChzZCkgPSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQ7CisKKyAgICAgIHNpbV9kb19jb21tYW5kIChzZCwgIm1lbW9yeSByZWdpb24gMHg0NDAwMDAwMCwweDQwMDAwIik7CisgICAgICBzaW1fZG9fY29tbWFuZCAoc2QsICJtZW1vcnkgcmVnaW9uIDB4NDgwMDAwMDAsMHg0MDAwMDAiKTsKKworICAgICAgLyogZGV2aWNlIHN1cHBvcnQgZm9yIG1uMTAzMDAwMiAqLworICAgICAgLyogaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KKworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9tbjEwM2ludEAweDM0MDAwMTAwL3JlZyAweDM0MDAwMTAwIDB4N0MgMHgzNDAwMDIwMCAweDggMHgzNDAwMDI4MCAweDgiKTsKKworICAgICAgLyogREVCVUc6IE5NSSBpbnB1dCdzICovCisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHgzMDAwMDAwMC9yZWcgMHgzMDAwMDAwMCAxMiIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDAwMDAgPiBpbnQwIG5taXJxIC9tbjEwM2ludCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDAwMDAgPiBpbnQxIHdhdGNoZG9nIC9tbjEwM2ludCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDAwMDAgPiBpbnQyIHN5c2VyciAvbW4xMDNpbnQiKTsKKyAgICAgIAorICAgICAgLyogREVCVUc6IEFDSyBpbnB1dCAqLworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDIwMDAvcmVnIDB4MzAwMDIwMDAgNCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDIwMDAgPiBpbnQgYWNrIC9tbjEwM2ludCIpOworICAgICAgCisgICAgICAvKiBERUJVRzogTEVWRUwgb3V0cHV0ICovCisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHgzMDAwNDAwMC9yZWcgMHgzMDAwNDAwMCA4Iik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzaW50ID4gbm1pIGludDAgL2dsdWVAMHgzMDAwNDAwMCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9tbjEwM2ludCA+IGxldmVsIGludDEgL2dsdWVAMHgzMDAwNDAwMCIpOworICAgICAgCisgICAgICAvKiBERUJVRzogQSBidW5jaCBvZiBpbnRlcnJ1cHQgaW5wdXRzICovCisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHgzMDAwNjAwMC9yZWcgMHgzMDAwNjAwMCAzMiIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDYwMDAgPiBpbnQwIGlycS0wIC9tbjEwM2ludCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDYwMDAgPiBpbnQxIGlycS0xIC9tbjEwM2ludCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDYwMDAgPiBpbnQyIGlycS0yIC9tbjEwM2ludCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDYwMDAgPiBpbnQzIGlycS0zIC9tbjEwM2ludCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDYwMDAgPiBpbnQ0IGlycS00IC9tbjEwM2ludCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDYwMDAgPiBpbnQ1IGlycS01IC9tbjEwM2ludCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDYwMDAgPiBpbnQ2IGlycS02IC9tbjEwM2ludCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzAwMDYwMDAgPiBpbnQ3IGlycS03IC9tbjEwM2ludCIpOworICAgICAgCisgICAgICAvKiBwcm9jZXNzb3IgaW50ZXJydXB0IGRldmljZSAqLworICAgICAgCisgICAgICAvKiB0aGUgZGV2aWNlICovCisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzY3B1QDB4MjAwMDAwMDAiKTsKKyAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvbW4xMDNjcHVAMHgyMDAwMDAwMC9yZWcgMHgyMDAwMDAwMCAweDQyIik7CisgICAgICAKKyAgICAgIC8qIERFQlVHOiBBQ0sgb3V0cHV0IHdpcmVkIHVwdG8gYSBnbHVlIGRldmljZSAqLworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MjAwMDIwMDAiKTsKKyAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvZ2x1ZUAweDIwMDAyMDAwL3JlZyAweDIwMDAyMDAwIDQiKTsKKyAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvbW4xMDNjcHUgPiBhY2sgaW50MCAvZ2x1ZUAweDIwMDAyMDAwIik7CisgICAgICAKKyAgICAgIC8qIERFQlVHOiBSRVNFVC9OTUkvTEVWRUwgd2lyZWQgdXAgdG8gYSBnbHVlIGRldmljZSAqLworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MjAwMDQwMDAiKTsKKyAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvZ2x1ZUAweDIwMDA0MDAwL3JlZyAweDIwMDA0MDAwIDEyIik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHgyMDAwNDAwMCA+IGludDAgcmVzZXQgL21uMTAzY3B1Iik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHgyMDAwNDAwMCA+IGludDEgbm1pIC9tbjEwM2NwdSIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MjAwMDQwMDAgPiBpbnQyIGxldmVsIC9tbjEwM2NwdSIpOworICAgICAgCisgICAgICAvKiBSRUFMOiBUaGUgcHJvY2Vzc29yIHdpcmVkIHVwIHRvIHRoZSByZWFsIGludGVycnVwdCBjb250cm9sbGVyICovCisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzY3B1ID4gYWNrIGFjayAvbW4xMDNpbnQiKTsKKyAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvbW4xMDNpbnQgPiBsZXZlbCBsZXZlbCAvbW4xMDNjcHUiKTsKKyAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvbW4xMDNpbnQgPiBubWkgbm1pIC9tbjEwM2NwdSIpOworICAgICAgCisgICAgICAKKyAgICAgIC8qIFBBTCAqLworICAgICAgCisgICAgICAvKiB0aGUgZGV2aWNlICovCisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3BhbEAweDMxMDAwMDAwIik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3BhbEAweDMxMDAwMDAwL3JlZyAweDMxMDAwMDAwIDY0Iik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3BhbEAweDMxMDAwMDAwL3BvbGw/IHRydWUiKTsKKyAgICAgIAorICAgICAgLyogREVCVUc6IFBBTCB3aXJlZCB1cCB0byBhIGdsdWUgZGV2aWNlICovCisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL2dsdWVAMHgzMTAwMjAwMCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzEwMDIwMDAvcmVnIDB4MzEwMDIwMDAgMTYiKTsKKyAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvcGFsQDB4MzEwMDAwMDAgPiBjb3VudGRvd24gaW50MCAvZ2x1ZUAweDMxMDAyMDAwIik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3BhbEAweDMxMDAwMDAwID4gdGltZXIgaW50MSAvZ2x1ZUAweDMxMDAyMDAwIik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3BhbEAweDMxMDAwMDAwID4gaW50IGludDIgL2dsdWVAMHgzMTAwMjAwMCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzEwMDIwMDAgPiBpbnQwIGludDMgL2dsdWVAMHgzMTAwMjAwMCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzEwMDIwMDAgPiBpbnQxIGludDMgL2dsdWVAMHgzMTAwMjAwMCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9nbHVlQDB4MzEwMDIwMDAgPiBpbnQyIGludDMgL2dsdWVAMHgzMTAwMjAwMCIpOworICAgICAgCisgICAgICAvKiBSRUFMOiBUaGUgUEFMIHdpcmVkIHVwIHRvIHRoZSByZWFsIGludGVycnVwdCBjb250cm9sbGVyICovCisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL3BhbEAweDMxMDAwMDAwID4gY291bnRkb3duIGlycS0wIC9tbjEwM2ludCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9wYWxAMHgzMTAwMDAwMCA+IHRpbWVyIGlycS0xIC9tbjEwM2ludCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9wYWxAMHgzMTAwMDAwMCA+IGludCBpcnEtMiAvbW4xMDNpbnQiKTsKKyAgICAgIAorICAgICAgLyogOCBhbmQgMTYgYml0IHRpbWVycyAqLworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9tbjEwM3RpbUAweDM0MDAxMDAwL3JlZyAweDM0MDAxMDAwIDM2IDB4MzQwMDEwODAgMTAwIDB4MzQwMDQwMDAgMTYiKTsKKworICAgICAgLyogSG9vayB0aW1lciBpbnRlcnJ1cHRzIHVwIHRvIGludGVycnVwdCBjb250cm9sbGVyICovCisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItMC11bmRlcmZsb3cgdGltZXItMC11bmRlcmZsb3cgL21uMTAzaW50Iik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItMS11bmRlcmZsb3cgdGltZXItMS11bmRlcmZsb3cgL21uMTAzaW50Iik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItMi11bmRlcmZsb3cgdGltZXItMi11bmRlcmZsb3cgL21uMTAzaW50Iik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItMy11bmRlcmZsb3cgdGltZXItMy11bmRlcmZsb3cgL21uMTAzaW50Iik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItNC11bmRlcmZsb3cgdGltZXItNC11bmRlcmZsb3cgL21uMTAzaW50Iik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItNS11bmRlcmZsb3cgdGltZXItNS11bmRlcmZsb3cgL21uMTAzaW50Iik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItNi11bmRlcmZsb3cgdGltZXItNi11bmRlcmZsb3cgL21uMTAzaW50Iik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItNi1jb21wYXJlLWEgdGltZXItNi1jb21wYXJlLWEgL21uMTAzaW50Iik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzdGltID4gdGltZXItNi1jb21wYXJlLWIgdGltZXItNi1jb21wYXJlLWIgL21uMTAzaW50Iik7CisgICAgICAKKyAgICAgIAorICAgICAgLyogU2VyaWFsIGRldmljZXMgMCwxLDIgKi8KKyAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvbW4xMDNzZXJAMHgzNDAwMDgwMC9yZWcgMHgzNDAwMDgwMCA0OCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9tbjEwM3NlckAweDM0MDAwODAwL3BvbGw/IHRydWUiKTsKKyAgICAgIAorICAgICAgLyogSG9vayBzZXJpYWwgaW50ZXJydXB0cyB1cCB0byBpbnRlcnJ1cHQgY29udHJvbGxlciAqLworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9tbjEwM3NlciA+IHNlcmlhbC0wLXJlY2VpdmUgc2VyaWFsLTAtcmVjZWl2ZSAvbW4xMDNpbnQiKTsKKyAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvbW4xMDNzZXIgPiBzZXJpYWwtMC10cmFuc21pdCBzZXJpYWwtMC10cmFuc21pdCAvbW4xMDNpbnQiKTsKKyAgICAgIHNpbV9od19wYXJzZSAoc2QsICIvbW4xMDNzZXIgPiBzZXJpYWwtMS1yZWNlaXZlIHNlcmlhbC0xLXJlY2VpdmUgL21uMTAzaW50Iik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzc2VyID4gc2VyaWFsLTEtdHJhbnNtaXQgc2VyaWFsLTEtdHJhbnNtaXQgL21uMTAzaW50Iik7CisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzc2VyID4gc2VyaWFsLTItcmVjZWl2ZSBzZXJpYWwtMi1yZWNlaXZlIC9tbjEwM2ludCIpOworICAgICAgc2ltX2h3X3BhcnNlIChzZCwgIi9tbjEwM3NlciA+IHNlcmlhbC0yLXRyYW5zbWl0IHNlcmlhbC0yLXRyYW5zbWl0IC9tbjEwM2ludCIpOworICAgICAgCisgICAgICBzaW1faHdfcGFyc2UgKHNkLCAiL21uMTAzaW9wQDB4MzYwMDgwMDAvcmVnIDB4MzYwMDgwMDAgOCAweDM2MDA4MDIwIDggMHgzNjAwODA0MCAweGMgMHgzNjAwODA2MCA4IDB4MzYwMDgwODAgOCIpOworCisgICAgICAvKiBNZW1vcnkgY29udHJvbCByZWdpc3RlcnMgKi8KKyAgICAgIHNpbV9kb19jb21tYW5kIChzZCwgIm1lbW9yeSByZWdpb24gMHgzMjAwMDAyMCwweDMwIik7CisgICAgICAvKiBDYWNoZSBjb250cm9sIHJlZ2lzdGVyICovCisgICAgICBzaW1fZG9fY29tbWFuZCAoc2QsICJtZW1vcnkgcmVnaW9uIDB4MjAwMDAwNzAsMHg0Iik7CisgICAgICAvKiBDYWNoZSBwdXJnZSByZWdpb25zICovCisgICAgICBzaW1fZG9fY29tbWFuZCAoc2QsICJtZW1vcnkgcmVnaW9uIDB4Mjg0MDAwMDAsMHg4MDAiKTsKKyAgICAgIHNpbV9kb19jb21tYW5kIChzZCwgIm1lbW9yeSByZWdpb24gMHgyODQwMTAwMCwweDgwMCIpOworICAgICAgLyogRE1BIHJlZ2lzdGVycyAqLworICAgICAgc2ltX2RvX2NvbW1hbmQgKHNkLCAibWVtb3J5IHJlZ2lvbiAweDMyMDAwMTAwLDB4RiIpOworICAgICAgc2ltX2RvX2NvbW1hbmQgKHNkLCAibWVtb3J5IHJlZ2lvbiAweDMyMDAwMjAwLDB4RiIpOworICAgICAgc2ltX2RvX2NvbW1hbmQgKHNkLCAibWVtb3J5IHJlZ2lvbiAweDMyMDAwNDAwLDB4RiIpOworICAgICAgc2ltX2RvX2NvbW1hbmQgKHNkLCAibWVtb3J5IHJlZ2lvbiAweDMyMDAwODAwLDB4RiIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICggTlVMTCAhPSBib2FyZCApCisJeworCSAgcHJpbnRmKCJFcnJvcjogaW52YWxpZCAtLWJvYXJkIG9wdGlvbi5cbiIpOworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKyAgCisgIAorCisgIC8qIGNoZWNrIGZvci9lc3RhYmxpc2ggdGhlIGEgcmVmZXJlbmNlIHByb2dyYW0gaW1hZ2UgKi8KKyAgaWYgKHNpbV9hbmFseXplX3Byb2dyYW0gKHNkLAorCQkJICAgKFNUQVRFX1BST0dfQVJHViAoc2QpICE9IE5VTEwKKwkJCSAgICA/ICpTVEFURV9QUk9HX0FSR1YgKHNkKQorCQkJICAgIDogTlVMTCksCisJCQkgICBhYmZkKSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBlc3RhYmxpc2ggYW55IHJlbWFpbmluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKyAgaWYgKHNpbV9jb25maWcgKHNkKSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoc2ltX3Bvc3RfYXJndl9pbml0IChzZCkgIT0gU0lNX1JDX09LKQorICAgIHsKKyAgICAgIC8qIFVuaW5zdGFsbCB0aGUgbW9kdWxlcyB0byBhdm9pZCBtZW1vcnkgbGVha3MsCisJIGZpbGUgZGVzY3JpcHRvciBsZWFrcywgZXRjLiAgKi8KKyAgICAgIHNpbV9tb2R1bGVfdW5pbnN0YWxsIChzZCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKworICAvKiBzZXQgbWFjaGluZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uICovCisvKiAgIFNUQVRFX0NQVSAoc2QsIDApLT5wc3dfbWFzayA9IChQU1dfTlAgfCBQU1dfRVAgfCBQU1dfSUQgfCBQU1dfU0FUICovCisvKiAJCQkgICAgIHwgUFNXX0NZIHwgUFNXX09WIHwgUFNXX1MgfCBQU1dfWik7ICovCisKKyAgcmV0dXJuIHNkOworfQorCisKK3ZvaWQKK3NpbV9jbG9zZSAoc2QsIHF1aXR0aW5nKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgaW50IHF1aXR0aW5nOworeworICBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoc2QpOworfQorCisKK1NJTV9SQworc2ltX2NyZWF0ZV9pbmZlcmlvciAoc2QsIHByb2dfYmZkLCBhcmd2LCBlbnYpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBzdHJ1Y3QgX2JmZCAqcHJvZ19iZmQ7CisgICAgIGNoYXIgKiphcmd2OworICAgICBjaGFyICoqZW52OworeworICBtZW1zZXQgKCZTdGF0ZSwgMCwgc2l6ZW9mIChTdGF0ZSkpOworICBpZiAocHJvZ19iZmQgIT0gTlVMTCkgeworICAgIFBDID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChwcm9nX2JmZCk7CisgIH0gZWxzZSB7CisgICAgUEMgPSAwOworICB9CisgIENJQV9TRVQgKFNUQVRFX0NQVSAoc2QsIDApLCAodW5zaWduZWQ2NCkgUEMpOworCisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKK3ZvaWQKK3NpbV9kb19jb21tYW5kIChzZCwgY21kKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgY2hhciAqY21kOworeworICBjaGFyICptbV9jbWQgPSAibWVtb3J5LW1hcCI7CisgIGNoYXIgKmludF9jbWQgPSAiaW50ZXJydXB0IjsKKworICBpZiAoc2ltX2FyZ3NfY29tbWFuZCAoc2QsIGNtZCkgIT0gU0lNX1JDX09LKQorICAgIHsKKyAgICAgIGlmIChzdHJuY21wIChjbWQsIG1tX2NtZCwgc3RybGVuIChtbV9jbWQpID09IDApKQorCXNpbV9pb19lcHJpbnRmIChzZCwgImBtZW1vcnktbWFwJyBjb21tYW5kIHJlcGxhY2VkIGJ5IGBzaW0gbWVtb3J5J1xuIik7CisgICAgICBlbHNlIGlmIChzdHJuY21wIChjbWQsIGludF9jbWQsIHN0cmxlbiAoaW50X2NtZCkpID09IDApCisJc2ltX2lvX2VwcmludGYgKHNkLCAiYGludGVycnVwdCcgY29tbWFuZCByZXBsYWNlZCBieSBgc2ltIHdhdGNoJ1xuIik7CisgICAgICBlbHNlCisJc2ltX2lvX2VwcmludGYgKHNkLCAiVW5rbm93biBjb21tYW5kIGAlcydcbiIsIGNtZCk7CisgICAgfQorfQorI2VuZGlmICAvKiBXSVRIX0NPTU1PTiAqLworCisvKiBGSVhNRSBUaGVzZSB3b3VsZCBtb3JlIGVmZmljaWVudCB0byB1c2UgdGhhbiBsb2FkX21lbS9zdG9yZV9tZW0sCisgICBidXQgbmVlZCB0byBiZSBjaGFuZ2VkIHRvIHVzZSB0aGUgbWVtb3J5IG1hcC4gICovCisKK3VpbnQ4CitnZXRfYnl0ZSAoeCkKKyAgICAgdWludDggKng7Cit7CisgIHJldHVybiAqeDsKK30KKwordWludDE2CitnZXRfaGFsZiAoeCkKKyAgICAgdWludDggKng7Cit7CisgIHVpbnQ4ICphID0geDsKKyAgcmV0dXJuIChhWzFdIDw8IDgpICsgKGFbMF0pOworfQorCit1aW50MzIKK2dldF93b3JkICh4KQorICAgICAgdWludDggKng7Cit7CisgIHVpbnQ4ICphID0geDsKKyAgcmV0dXJuIChhWzNdPDwyNCkgKyAoYVsyXTw8MTYpICsgKGFbMV08PDgpICsgKGFbMF0pOworfQorCit2b2lkCitwdXRfYnl0ZSAoYWRkciwgZGF0YSkKKyAgICAgdWludDggKmFkZHI7CisgICAgIHVpbnQ4IGRhdGE7Cit7CisgIHVpbnQ4ICphID0gYWRkcjsKKyAgYVswXSA9IGRhdGE7Cit9CisKK3ZvaWQKK3B1dF9oYWxmIChhZGRyLCBkYXRhKQorICAgICB1aW50OCAqYWRkcjsKKyAgICAgdWludDE2IGRhdGE7Cit7CisgIHVpbnQ4ICphID0gYWRkcjsKKyAgYVswXSA9IGRhdGEgJiAweGZmOworICBhWzFdID0gKGRhdGEgPj4gOCkgJiAweGZmOworfQorCit2b2lkCitwdXRfd29yZCAoYWRkciwgZGF0YSkKKyAgICAgdWludDggKmFkZHI7CisgICAgIHVpbnQzMiBkYXRhOworeworICB1aW50OCAqYSA9IGFkZHI7CisgIGFbMF0gPSBkYXRhICYgMHhmZjsKKyAgYVsxXSA9IChkYXRhID4+IDgpICYgMHhmZjsKKyAgYVsyXSA9IChkYXRhID4+IDE2KSAmIDB4ZmY7CisgIGFbM10gPSAoZGF0YSA+PiAyNCkgJiAweGZmOworfQorCitpbnQKK3NpbV9mZXRjaF9yZWdpc3RlciAoc2QsIHJuLCBtZW1vcnksIGxlbmd0aCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCBybjsKKyAgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OworICAgICBpbnQgbGVuZ3RoOworeworICBwdXRfd29yZCAobWVtb3J5LCBTdGF0ZS5yZWdzW3JuXSk7CisgIHJldHVybiAtMTsKK30KKyAKK2ludAorc2ltX3N0b3JlX3JlZ2lzdGVyIChzZCwgcm4sIG1lbW9yeSwgbGVuZ3RoKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgaW50IHJuOworICAgICB1bnNpZ25lZCBjaGFyICptZW1vcnk7CisgICAgIGludCBsZW5ndGg7Cit7CisgIFN0YXRlLnJlZ3Nbcm5dID0gZ2V0X3dvcmQgKG1lbW9yeSk7CisgIHJldHVybiAtMTsKK30KKworCit2b2lkCittbjEwMzAwX2NvcmVfc2lnbmFsIChTSU1fREVTQyBzZCwKKyAgICAgICAgICAgICAgICAgc2ltX2NwdSAqY3B1LAorICAgICAgICAgICAgICAgICBzaW1fY2lhIGNpYSwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWFwLAorICAgICAgICAgICAgICAgICBpbnQgbnJfYnl0ZXMsCisgICAgICAgICAgICAgICAgIGFkZHJlc3Nfd29yZCBhZGRyLAorICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyLAorICAgICAgICAgICAgICAgICBzaW1fY29yZV9zaWduYWxzIHNpZykKK3sKKyAgY29uc3QgY2hhciAqY29weSA9ICh0cmFuc2ZlciA9PSByZWFkX3RyYW5zZmVyID8gInJlYWQiIDogIndyaXRlIik7CisgIGFkZHJlc3Nfd29yZCBpcCA9IENJQV9BRERSIChjaWEpOworCisgIHN3aXRjaCAoc2lnKQorICAgIHsKKyAgICBjYXNlIHNpbV9jb3JlX3VubWFwcGVkX3NpZ25hbDoKKyAgICAgIHNpbV9pb19lcHJpbnRmIChzZCwgIm1uMTAzMDAtY29yZTogJWQgYnl0ZSAlcyB0byB1bm1hcHBlZCBhZGRyZXNzIDB4JWx4IGF0IDB4JWx4XG4iLAorICAgICAgICAgICAgICAgICAgICAgIG5yX2J5dGVzLCBjb3B5LCAKKyAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgYWRkciwgKHVuc2lnbmVkIGxvbmcpIGlwKTsKKyAgICAgIHByb2dyYW1faW50ZXJydXB0KHNkLCBjcHUsIGNpYSwgU0lNX1NJR1NFR1YpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHNpbV9jb3JlX3VuYWxpZ25lZF9zaWduYWw6CisgICAgICBzaW1faW9fZXByaW50ZiAoc2QsICJtbjEwMzAwLWNvcmU6ICVkIGJ5dGUgJXMgdG8gdW5hbGlnbmVkIGFkZHJlc3MgMHglbHggYXQgMHglbHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbnJfYnl0ZXMsIGNvcHksIAorICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBhZGRyLCAodW5zaWduZWQgbG9uZykgaXApOworICAgICAgcHJvZ3JhbV9pbnRlcnJ1cHQoc2QsIGNwdSwgY2lhLCBTSU1fU0lHQlVTKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHNpbV9lbmdpbmVfYWJvcnQgKHNkLCBjcHUsIGNpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtbjEwMzAwX2NvcmVfc2lnbmFsIC0gaW50ZXJuYWwgZXJyb3IgLSBiYWQgc3dpdGNoIik7CisgICAgfQorfQorCisKK3ZvaWQKK3Byb2dyYW1faW50ZXJydXB0IChTSU1fREVTQyBzZCwKKwkJICAgc2ltX2NwdSAqY3B1LAorCQkgICBzaW1fY2lhIGNpYSwKKwkJICAgU0lNX1NJR05BTCBzaWcpCit7CisgIGludCBzdGF0dXM7CisgIHN0cnVjdCBodyAqZGV2aWNlOworCisjaWZkZWYgU0lNX0NQVV9FWENFUFRJT05fVFJJR0dFUgorICBTSU1fQ1BVX0VYQ0VQVElPTl9UUklHR0VSKHNkLGNwdSxjaWEpOworI2VuZGlmCisKKyAgLyogY29weSBOTUkgaGFuZGxlciBjb2RlIGZyb20gZHYtbW4xMDNjcHUuYyAqLworICAvKiBYWFg6IHBvc3NpYmxlIGluZmluaXRlIHJlY3Vyc2lvbiBpZiB0aGVzZSBzdG9yZV8qKCkgY2FsbHMgZmFpbCEgKi8KKyAgc3RvcmVfd29yZCAoU1AgLSA0LCBDSUFfR0VUIChjcHUpKTsKKyAgc3RvcmVfaGFsZiAoU1AgLSA4LCBQU1cpOworICBQU1cgJj0gflBTV19JRTsKKyAgU1AgPSBTUCAtIDg7CisgIENJQV9TRVQgKGNwdSwgMHg0MDAwMDAwOCk7CisKKyAgc2ltX2VuZ2luZV9oYWx0KHNkLCBjcHUsIE5VTEwsIGNpYSwgc2ltX3N0b3BwZWQsIHNpZyk7Cit9CisKKwordm9pZAorbW4xMDMwMF9jcHVfZXhjZXB0aW9uX3RyaWdnZXIoU0lNX0RFU0Mgc2QsIHNpbV9jcHUqIGNwdSwgYWRkcmVzc193b3JkIGNpYSkKK3sKKyAgQVNTRVJUKGNwdSAhPSBOVUxMKTsKKworICBpZihTdGF0ZS5leGNfc3VzcGVuZGVkID4gMCkKKyAgICBzaW1faW9fZXByaW50ZihzZCwgIldhcm5pbmcsIG5lc3RlZCBleGNlcHRpb24gdHJpZ2dlcmVkICglZClcbiIsIFN0YXRlLmV4Y19zdXNwZW5kZWQpOyAKKworICBDSUFfU0VUIChjcHUsIGNpYSk7CisgIG1lbWNweShTdGF0ZS5leGNfdHJpZ2dlcl9yZWdzLCBTdGF0ZS5yZWdzLCBzaXplb2YoU3RhdGUuZXhjX3RyaWdnZXJfcmVncykpOworICBTdGF0ZS5leGNfc3VzcGVuZGVkID0gMDsKK30KKwordm9pZAorbW4xMDMwMF9jcHVfZXhjZXB0aW9uX3N1c3BlbmQoU0lNX0RFU0Mgc2QsIHNpbV9jcHUqIGNwdSwgaW50IGV4Y2VwdGlvbikKK3sKKyAgQVNTRVJUKGNwdSAhPSBOVUxMKTsKKworICBpZihTdGF0ZS5leGNfc3VzcGVuZGVkID4gMCkKKyAgICBzaW1faW9fZXByaW50ZihzZCwgIldhcm5pbmcsIG5lc3RlZCBleGNlcHRpb24gc2lnbmFsICglZCB0aGVuICVkKVxuIiwgCisJCSAgIFN0YXRlLmV4Y19zdXNwZW5kZWQsIGV4Y2VwdGlvbik7IAorCisgIG1lbWNweShTdGF0ZS5leGNfc3VzcGVuZF9yZWdzLCBTdGF0ZS5yZWdzLCBzaXplb2YoU3RhdGUuZXhjX3N1c3BlbmRfcmVncykpOworICBtZW1jcHkoU3RhdGUucmVncywgU3RhdGUuZXhjX3RyaWdnZXJfcmVncywgc2l6ZW9mKFN0YXRlLnJlZ3MpKTsKKyAgQ0lBX1NFVCAoY3B1LCBQQyk7IC8qIGNvcHkgUEMgYmFjayBmcm9tIG5ldyBTdGF0ZS5yZWdzICovCisgIFN0YXRlLmV4Y19zdXNwZW5kZWQgPSBleGNlcHRpb247Cit9CisKK3ZvaWQKK21uMTAzMDBfY3B1X2V4Y2VwdGlvbl9yZXN1bWUoU0lNX0RFU0Mgc2QsIHNpbV9jcHUqIGNwdSwgaW50IGV4Y2VwdGlvbikKK3sKKyAgQVNTRVJUKGNwdSAhPSBOVUxMKTsKKworICBpZihleGNlcHRpb24gPT0gMCAmJiBTdGF0ZS5leGNfc3VzcGVuZGVkID4gMCkKKyAgICB7CisgICAgICBpZihTdGF0ZS5leGNfc3VzcGVuZGVkICE9IFNJR1RSQVApIC8qIHdhcm4gbm90IGZvciBicmVha3BvaW50cyAqLworICAgICAgICAgc2ltX2lvX2VwcmludGYoc2QsICJXYXJuaW5nLCByZXN1bWluZyBidXQgaWdub3JpbmcgcGVuZGluZyBleGNlcHRpb24gc2lnbmFsICglZClcbiIsCisgIAkJICAgICAgIFN0YXRlLmV4Y19zdXNwZW5kZWQpOyAKKyAgICB9CisgIGVsc2UgaWYoZXhjZXB0aW9uICE9IDAgJiYgU3RhdGUuZXhjX3N1c3BlbmRlZCA+IDApCisgICAgeworICAgICAgaWYoZXhjZXB0aW9uICE9IFN0YXRlLmV4Y19zdXNwZW5kZWQpIAorCXNpbV9pb19lcHJpbnRmKHNkLCAiV2FybmluZywgcmVzdW1pbmcgd2l0aCBtaXNtYXRjaGVkIGV4Y2VwdGlvbiBzaWduYWwgKCVkIHZzICVkKVxuIiwKKwkJICAgICAgIFN0YXRlLmV4Y19zdXNwZW5kZWQsIGV4Y2VwdGlvbik7IAorICAgICAgCisgICAgICBtZW1jcHkoU3RhdGUucmVncywgU3RhdGUuZXhjX3N1c3BlbmRfcmVncywgc2l6ZW9mKFN0YXRlLnJlZ3MpKTsgCisgICAgICBDSUFfU0VUIChjcHUsIFBDKTsgLyogY29weSBQQyBiYWNrIGZyb20gbmV3IFN0YXRlLnJlZ3MgKi8KKyAgICB9CisgIGVsc2UgaWYoZXhjZXB0aW9uICE9IDAgJiYgU3RhdGUuZXhjX3N1c3BlbmRlZCA9PSAwKQorICAgIHsKKyAgICAgIHNpbV9pb19lcHJpbnRmKHNkLCAiV2FybmluZywgaWdub3Jpbmcgc3BvbnRhbm91cyBleGNlcHRpb24gc2lnbmFsICglZClcbiIsIGV4Y2VwdGlvbik7IAorICAgIH0KKyAgU3RhdGUuZXhjX3N1c3BlbmRlZCA9IDA7IAorfQpkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvbW4xMDMwMC5kYyBiL3NpbS9tbjEwMzAwL21uMTAzMDAuZGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViZjNmZAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tbjEwMzAwL21uMTAzMDAuZGMKQEAgLTAsMCArMSw0IEBACitzd2l0Y2ggOiAgIDcgOiAgIDAgOiAgICA6ICAgIDogICAgOiAgICAwIDogICAgICAgICAgICAgOgorc3dpdGNoIDogICA3IDogICAwIDogICAgOiAgICA6ICAgIDogICAgMSA6ICAgICAgICAgICAgIDoKK3N3aXRjaCA6ICAgNyA6ICAgMCA6ICAgIDogICAgOiAgICA6ICAgIDIgOiAgICAgICAgICAgICA6Citzd2l0Y2ggOiAgIDcgOiAgIDAgOiAgICA6ICAgIDogICAgOiAgICAzIDogICAgICAgICAgICAgOgpkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvbW4xMDMwMC5pZ2VuIGIvc2ltL21uMTAzMDAvbW4xMDMwMC5pZ2VuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNGYwM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbW4xMDMwMC9tbjEwMzAwLmlnZW4KQEAgLTAsMCArMSwzNTM3IEBACisvLyAtKi0gQyAtKi0KKzpvcHRpb246OjppbnNuLWJpdC1zaXplOjgKKzpvcHRpb246OjppbnNuLXNwZWNpZnlpbmctd2lkdGhzOnRydWUKKzpvcHRpb246OjpoaS1iaXQtbnI6NworOm1vZGVsOjo6bW4xMDMwMDptbjEwMzAwOgorCisvLyBXaGF0IGRvIHdlIGRvIHdpdGggYW4gaWxsZWdhbCBpbnN0cnVjdGlvbj8KKzppbnRlcm5hbDo6OjppbGxlZ2FsOgoreworICBQQyA9IGNpYTsKKyAgcHJvZ3JhbV9pbnRlcnJ1cHQoU0QsIENQVSwgY2lhLCBTSU1fU0lHSUxMKTsKK30KKworLy8gMTAwMCBEbkRuIGltbTguLi4uOyBtb3YgaW1tOCxEbiAoaW1tOCBpcyBzaWduIGV4dGVuZGVkKQorNC4weDgsMi5ETTEsMi5ETjA9RE0xKzguSU1NODpTMGk6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiAgT1BfODAwMCAoKTsgKi8KKyAgc2lnbmVkMzIgaW1tZWQgPSBFWFRFTkQ4IChJTU04KTsKKyAgU3RhdGUucmVnc1tSRUdfRDArRE4wXSA9IGltbWVkOworICBQQyA9IGNpYTsKK30KKworLy8gMTAwMCBEbURuOyBtb3YgRG0sRG4gKERtICE9IERuLCBzZWUgYWJvdmUgd2hlbiBEbSA9PSBEbikKKzQuMHg4LDIuRE0xLDIuRE4wIURNMTpTMDo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIFBDID0gY2lhOworICAvKiBPUF84MCAoKTsgKi8KKyAgU3RhdGUucmVnc1tSRUdfRDArRE4wXSA9IFN0YXRlLnJlZ3NbUkVHX0QwK0RNMV07Cit9CisKKworLy8gMTExMSAwMDAxIDExMTAgRG1BbjsgbW92IERtLEFuCis4LjB4ZjErMTExMCwyLkRNMSwyLkFOMDpEMDo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0YxRTAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gPSBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV07Cit9CisKKworLy8gMTExMSAwMDAxIDExMDEgQW1EbjsgbW92IEFtLERuCis4LjB4ZjErMTEwMSwyLkFNMSwyLkROMDpEMGE6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF9GMUQwICgpOyAqLworICBQQyA9IGNpYTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gU3RhdGUucmVnc1tSRUdfQTAgKyBBTTFdOworfQorCisKKy8vIDEwMDEgQW5BbiBpbW04Li4uLjsgbW92IGltbTgsQW4gKGltbTggaXMgemVyby1leHRlbmRlZCkKKzQuMHg5LDIuQU0xLDIuQU4wPUFNMSs4LklNTTg6UzBhaTo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgICBQQyA9IGNpYTsKKyAgIC8qIE9QXzkwMDAgKCk7ICovCisgICBTdGF0ZS5yZWdzW1JFR19BMCtBTjBdID0gSU1NODsKK30KKworCisvLyAxMDAxIEFtQW47IG1vdiBBbSxBbiAoQW0gIT0gQW4sIHNhdmUgYWJvdmUgd2hlbiBBbSA9PSBBbikKKzQuMHg5LDIuQU0xLDIuQU4wIUFNMTpTMGE6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAgUEMgPSBjaWE7CisgICAvKiBPUF85MCAoKTsgKi8KKyAgIFN0YXRlLnJlZ3NbUkVHX0EwK0FOMF0gPSBTdGF0ZS5yZWdzW1JFR19BMCtBTTFdOworfQorCisKKy8vIDAwMTEgMTFBbjsgbW92IFNQLEFuCis0LjB4MywxMSwyLkFOMDpTMGI6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF8zQyAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKK30KKworCisvLyAxMTExIDAwMTAgMTExMSBBbTAwOyBtb3YgQW0sU1AKKzguMHhmMis0LjB4ZiwyLkFNMSwwMDpEMGI6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF9GMkYwICgpOyAqLworICBQQyA9IGNpYTsKKyAgU3RhdGUucmVnc1tSRUdfU1BdID0gU3RhdGUucmVnc1tSRUdfQTAgKyBBTTFdOworfQorCisKKy8vIDExMTEgMDAxMCAxMTEwIDAxRG47IG1vdiBQU1csRG4KKzguMHhmMis0LjB4ZSwwMSwyLkROMDpEMGM6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF9GMkU0ICgpOyAqLworICBQQyA9IGNpYTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gUFNXOworfQorCisKKy8vIDExMTEgMDAxMCAxMTExIERtMTE7IG1vdiBEbSxQU1cKKzguMHhmMis0LjB4ZiwyLkRNMSwxMTpEMGQ6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF9GMkYzICgpOyAqLworICBQQyA9IGNpYTsKKyAgUFNXID0gU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdOworfQorCisKKy8vIDExMTEgMDAxMCAxMTEwIDAwRG47IG1vdiBNRFIsRG4KKzguMHhmMis0LjB4ZSwwMCwyLkROMDpEMGU6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF9GMkUwICgpOyAqLworICBQQyA9IGNpYTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gU3RhdGUucmVnc1tSRUdfTURSXTsKK30KKworCisvLyAxMTExIDAwMTAgMTExMSBEbTEwOyBtb3YgRG0sTURSCis4LjB4ZjIrNC4weGYsMi5ETTEsMTA6RDBmOjo6bW92CisibW92IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjJGMiAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV07Cit9CisKKworLy8gMDExMSBEbkFtOyBtb3YgKEFtKSxEbgorNC4weDcsMi5ETjEsMi5BTTA6UzBjOjo6bW92CisibW92IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfNzAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMV0gPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0wXSk7Cit9CisKKworLy8gMTExMSAxMDAwIDAwMDAgRG5BbSBkOC4uLi4uLjsgbW92IChkOCxBbSksRG4gKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCis4LjB4ZjgrNC4weDAsMi5ETjEsMi5BTTArOC5EODpEMTo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y4MDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4xXQorICAgID0gbG9hZF93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTTBdICsgRVhURU5EOCAoRDgpKSk7Cit9CisKKworLy8gMTExMSAxMDEwIDAwMDAgRG5BbSBkMTYuLi4uLjsgbW92IChkMTYsQW0pLERuIChkMTYgaXMgc2lnbi1leHRlbmRlZC4pCis4LjB4ZmErNC4weDAsMi5ETjEsMi5BTTArOC5EMTZBKzguRDE2QjpEMjo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZBMDAwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjFdCisgICAgPSBsb2FkX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMF0gKyBFWFRFTkQxNiAoRkVUQ0gxNihEMTZBLCBEMTZCKSkpKTsKK30KKworCisvLyAxMTExIDExMDAgMDAwMCBEbkFtIGQzMi4uLi4uOyBtb3YgKGQzMixBbSksRG4KKzguMHhmYys0LjB4MCwyLkROMSwyLkFNMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENDo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZDMDAwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjFdCisgICAgPSBsb2FkX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMF0KKwkJICArIEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSkpOworfQorCisKKy8vIDAxMDEgMTBEbiBkOC4uLi4uLjsgbW92IChkOCxTUCksRG4gKGQ4IGlzIHplcm8tZXh0ZW5kZWQpCis0LjB4NSwxMCwyLkROMCs4LkQ4OlMxOjo6bW92CisibW92IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfNTgwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgRDgpOworfQorCisKKy8vIDExMTEgMTAxMCAxMDExIDAxRG4gZDE2Li4uLi47IG1vdiAoZDE2LFNQKSxEbiAoZDE2IGlzIHplcm8tZXh0ZW5kZWQuKQorOC4weGZhKzQuMHhiLDAxLDIuRE4wKzguSU1NMTZBKzguSU1NMTZCOkQyYTo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZBQjQwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdCisgICAgPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpKTsKK30KKworCisvLyAxMTExIDEwMTAgMTAxMSAwMURuIGQzMi4uLi4uOyBtb3YgKGQzMixTUCksRG4KKzguMHhmYys0LjB4YiwwMSwyLkROMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGE6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF9GQ0I0MDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXQorICAgICA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKTsKK30KKworCisvLyAxMTExIDAwMTEgMDBEbiBEaUFtOyBtb3YgKERpLEFtKSxEbgorOC4weGYzKzAwLDIuRE4yLDIuREksMi5BTTA6RDBnOjo6bW92CisibW92IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjMwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4yXQorICAgID0gbG9hZF93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTTBdICsgU3RhdGUucmVnc1tSRUdfRDAgKyBESV0pKTsKK30KKworCisvLyAwMDExIDAwRG4gYWJzMTYuLi47IG1vdiAoYWJzMTYpLERuIChhYnMxNiBpcyB6ZXJvLWV4dGVuZGVkKQorNC4weDMsMDAsMi5ETjArOC5JTU0xNkErOC5JTU0xNkI6UzI6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF8zMDAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSBsb2FkX3dvcmQgKEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpKTsKK30KKworLy8gMTExMSAxMTAwIDEwMTAgMDFEbiBhYnMzMi4uLjsgbW92IChhYnMzMiksRG4KKzguMHhmYys0LjB4YSwwMSwyLkROMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGI6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF9GQ0E0MDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IGxvYWRfd29yZCAoRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKTsKK30KKworCisvLyAxMTExIDAwMDAgMDAwMCBBbkFtOyBtb3YgKEFtKSxBbgorOC4weGYwKzQuMHgwLDIuQU4xLDIuQU0wOkQwaDo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0YwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMV0gPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0wXSk7Cit9CisKKworLy8gMTExMSAxMDAwIDAwMTAgQW5BbSBkOC4uLi4uLjsgbW92IChkOCxBbSksQW4gKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCis4LjB4ZjgrNC4weDIsMi5BTjEsMi5BTTArOC5EODpEMWE6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF9GODIwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMV0KKyAgICA9IGxvYWRfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0wXSArIEVYVEVORDggKEQ4KSkpOworfQorCisKKy8vIDExMTEgMTAxMCAwMDEwIEFuQW0gZDE2Li4uLi47IG1vdiAoZDE2LEFtKSxBbiAoZDE2IGlzIHNpZ24tZXh0ZW5kZWQuKQorOC4weGZhKzQuMHgyLDIuQU4xLDIuQU0wKzguRDE2QSs4LkQxNkI6RDJiOjo6bW92CisibW92IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkEyMDAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMV0KKyAgICA9IGxvYWRfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0wXQorCQkgICsgRVhURU5EMTYgKEZFVENIMTYoRDE2QSwgRDE2QikpKSk7Cit9CisKKworLy8gMTExMSAxMTAwIDAwMTAgQW5BbSBkMzIuLi4uLjsgbW92IChkMzIsQW0pLEFuCis4LjB4ZmMrNC4weDIsMi5BTjEsMi5BTTArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDRjOjo6bW92CisibW92IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkMyMDAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMV0KKyAgICA9IGxvYWRfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0wXQorCQkgICsgRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKSk7Cit9CisKKworLy8gMDEwMSAxMUFuIGQ4Li4uLi4uOyBtb3YgKGQ4LFNQKSxBbiAoZDggaXMgemVyby1leHRlbmRlZCkKKzQuMHg1LDExLDIuQU4wKzguRDg6UzFhOjo6bW92CisibW92IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfNUMwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXQorICAgID0gbG9hZF93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0gKyBEOCk7Cit9CisKKworLy8gMTExMSAxMDEwIDEwMTEgMDBBbiBkMTYuLi4uLjsgbW92IChkMTYsU1ApLEFuIChkMTYgaXMgemVyby1leHRlbmRlZC4pCis4LjB4ZmErNC4weGIsMDAsMi5BTjArOC5JTU0xNkErOC5JTU0xNkI6RDJjOjo6bW92CisibW92IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkFCMDAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0KKyAgICA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgRkVUQ0gxNihJTU0xNkEsIElNTTE2QikpOworfQorCisKKy8vIDExMTEgMTEwMCAxMDExIDAwQW4gZDMyLi4uLi47IG1vdiAoZDMyLFNQKSxBbgorOC4weGZjKzQuMHhiLDAwLDIuQU4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0ZDo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZDQjAwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdCisgICAgPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXQorCQkgKyBGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpOworfQorCisKKy8vIDExMTEgMDAxMSAxMEFuIERpQW07IG1vdiAoRGksQW0pLEFuCis4LjB4ZjMrMTAsMi5BTjIsMi5ESSwyLkFNMDpEMGk6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF9GMzgwICgpOyAqLworICBQQyA9IGNpYTsKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTjJdCisgICAgPSBsb2FkX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMF0KKwkJICsgU3RhdGUucmVnc1tSRUdfRDAgKyBESV0pKTsKK30KKworCisvLyAxMTExIDEwMTAgMTAxMCAwMEFuIGFiczE2Li4uOyBtb3YgKGFiczE2KSxBbiAoYWJzMTYgaXMgemVyby1leHRlbmRlZCkKKzguMHhmYSs0LjB4YSwwMCwyLkFOMCs4LklNTTE2QSs4LklNTTE2QjpEMmQ6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF9GQUEwMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSA9IGxvYWRfd29yZCAoRkVUQ0gxNihJTU0xNkEsIElNTTE2QikpOworfQorCisKKy8vIDExMTEgMTEwMCAxMDEwIDAwQW4gYWJzMzIuLi47IG1vdiAoYWJzMzIpLEFuCis4LjB4ZmMrNC4weGEsMDAsMi5BTjArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDRlOjo6bW92CisibW92IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkNBMDAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0KKyAgICA9IGxvYWRfd29yZCAoRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKTsKK30KKworCisvLyAxMTExIDEwMDAgMTExMSAwMEFtIGQ4Li4uLi4uOyBtb3YgKGQ4LEFtKSxTUCAoZDggaXMgc2lnbi1leHRlbmRlZCkKKzguMHhmOCs0LjB4ZiwwMCwyLkFNMCs4LkQ4OkQxYjo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y4RjAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX1NQXQorICAgID0gbG9hZF93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTTBdICsgRVhURU5EOCAoRDgpKSk7Cit9CisKKworLy8gMDExMCBEbUFuOyBtb3YgRG0sKEFuKQorNC4weDYsMi5ETTEsMi5BTjA6UzBkOjo6bW92CisibW92IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfNjAgKCk7ICovCisgIFBDID0gY2lhOworICBzdG9yZV93b3JkIChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0sIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7Cit9CisKKworLy8gMTExMSAxMDAwIDAwMDEgRG1BbiBkOC4uLi4uLjsgbW92IERtLChkOCxBbikgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCis4LjB4ZjgrNC4weDEsMi5ETTEsMi5BTjArOC5EODpEMWM6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF9GODEwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBzdG9yZV93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdICsgRVhURU5EOCAoRDgpKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOworfQorCisKKy8vIDExMTEgMTAxMCAwMDAxIERtQW4gZDE2Li4uLi47IG1vdiBEbSwoZDE2LEFuKSAoZDE2IGlzIHNpZ24tZXh0ZW5kZWQuKQorOC4weGZhKzQuMHgxLDIuRE0xLDIuQU4wKzguRDE2QSs4LkQxNkI6RDJlOjo6bW92CisibW92IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkExMDAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBzdG9yZV93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdICsgRVhURU5EMTYgKEZFVENIMTYoRDE2QSwgRDE2QikpKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOworfQorCisKKy8vIDExMTEgMTEwMCAwMDAxIERtQW4gZDMyLi4uLi47IG1vdiBEbSwoZDMyLEFuKQorOC4weGZjKzQuMHgxLDIuRE0xLDIuQU4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0Zjo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZDMTAwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgc3RvcmVfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXQorCSAgICAgICArIEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKK30KKworCisvLyAwMTAwIERtMTAgZDguLi4uLi47IG1vdiBEbSwoZDgsU1ApIChkOCBpcyB6ZXJvLWV4dGVuZGVkKQorNC4weDQsMi5ETTEsMTArOC5EODpTMWI6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF80MjAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgc3RvcmVfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgRDgsIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7Cit9CisKKworLy8gMTExMSAxMDEwIDEwMDEgRG0wMSBkMTYuLi4uLjsgbW92IERtLChkMTYsU1ApIChkMTYgaXMgemVyby1leHRlbmRlZC4pCis4LjB4ZmErNC4weDksMi5ETTEsMDErOC5JTU0xNkErOC5JTU0xNkI6RDJmOjo6bW92CisibW92IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkE5MTAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBzdG9yZV93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0gKyBGRVRDSDE2KElNTTE2QSwgSU1NMTZCKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOworfQorCisKKy8vIDExMTEgMTEwMCAxMDAxIERtMDEgZDMyLi4uLi47IG1vdiBEbSwoZDMyLFNQKQorOC4weGZjKzQuMHg5LDIuRE0xLDAxKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0Zzo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZDOTEwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgc3RvcmVfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7Cit9CisKKworLy8gMTExMSAwMDExIDAxRG0gRGlBbjsgbW92IERtLChEaSxBbikKKzguMHhmMyswMSwyLkRNMiwyLkRJLDIuQU4wOkQwajo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0YzNDAgKCk7ICovCisgIFBDID0gY2lhOworICBzdG9yZV93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdICsgU3RhdGUucmVnc1tSRUdfRDAgKyBESV0pLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0yXSk7Cit9CisKKworLy8gMDAwMCBEbTAxIGFiczE2Li4uLCBtb3YgRG0sKGFiczE2KSAoYWJzMTYgaXMgemVyby1leHRlbmRlZCkuCis0LjB4MCwyLkRNMSwwMSs4LklNTTE2QSs4LklNTTE2QjpTMmE6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF8xMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIHN0b3JlX3dvcmQgKEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpLCBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOworfQorCisKKy8vIDExMTEgMTEwMCAxMDAwIERtMDEgYWJzMzIuLi47IG1vdiBEbSwoYWJzMzIpCis4LjB4ZmMrNC4weDgsMi5ETTEsMDErOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDRoOjo6bW92CisibW92IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkM4MTAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBzdG9yZV93b3JkIChGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKK30KKworCisvLyAxMTExIDAwMDAgMDAwMSBBbUFuOyBtb3YgQW0sKEFuKQorOC4weGYwKzQuMHgxLDIuQU0xLDIuQU4wOkQwazo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0YwMTAgKCk7ICovCisgIFBDID0gY2lhOworICBzdG9yZV93b3JkIChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0sIFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0xXSk7Cit9CisKKworLy8gMTExMSAxMDAwIDAwMTEgQW1BbiBkOC4uLi4uLjsgbW92IEFtLChkOCxBbikgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCis4LjB4ZjgrNC4weDMsMi5BTTEsMi5BTjArOC5EODpEMWQ6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF9GODMwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBzdG9yZV93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdICsgRVhURU5EOCAoRDgpKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIEFNMV0pOworfQorCisKKy8vIDExMTEgMTAxMCAwMDExIEFtQW4gZDE2Li4uLi47IG1vdiBBbSwoZDE2LEFuKSAoZDE2IGlzIHNpZ24tZXh0ZW5kZWQuKQorOC4weGZhKzQuMHgzLDIuQU0xLDIuQU4wKzguRDE2QSs4LkQxNkI6RDJnOjo6bW92CisibW92IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkEzMDAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBzdG9yZV93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdICsgRVhURU5EMTYgKEZFVENIMTYoRDE2QSwgRDE2QikpKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIEFNMV0pOworfQorCisKKy8vIDExMTEgMTEwMCAwMDExIEFtQW4gZDMyLi4uLi47IG1vdiBBbSwoZDMyLEFuKQorOC4weGZjKzQuMHgzLDIuQU0xLDIuQU4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0aTo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZDMzAwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgc3RvcmVfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXQorCSAgICAgICArIEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSksCisJICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTTFdKTsKK30KKworCisvLyAwMTAwIEFtMTEgZDguLi4uLi47IG1vdiBBbSwoZDgsU1ApIChkOCBpcyB6ZXJvLWV4dGVuZGVkKQorNC4weDQsMi5BTTEsMTErOC5EODpTMWM6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF80MzAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgc3RvcmVfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgKEQ4KSwgU3RhdGUucmVnc1tSRUdfQTAgKyAoQU0xKV0pOworfQorCisKKy8vIDExMTEgMTAxMCAxMDAxIEFtMDAgZDE2Li4uLi47IG1vdiBBbSwoZDE2LFNQKSAoZDE2IGlzIHplcm8tZXh0ZW5kZWQuKQorOC4weGZhKzQuMHg5LDIuQU0xLDAwKzguSU1NMTZBKzguSU1NMTZCOkQyaDo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZBOTAwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgc3RvcmVfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgRkVUQ0gxNihJTU0xNkEsIElNTTE2QiksCisJICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTTFdKTsKK30KKworCisvLyAxMTExIDExMDAgMTAwMSBBbTAwIGQzMi4uLi4uOyBtb3YgQW0sKGQzMixTUCkKKzguMHhmYys0LjB4OSwyLkFNMSwwMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGo6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF9GQzkwMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIHN0b3JlX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIEFNMV0pOworfQorCisKKy8vIDExMTEgMDAxMSAxMUFtIERpQW47IG1vdiBBbSwoRGksQW4pCis4LjB4ZjMrMTEsMi5BTTIsMi5ESSwyLkFOMDpEMGw6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF9GM0MwICgpOyAqLworICBQQyA9IGNpYTsKKyAgc3RvcmVfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSArIFN0YXRlLnJlZ3NbUkVHX0QwICsgREldKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIEFNMl0pOworfQorCisKKy8vIDExMTEgMTAxMCAxMDAwIEFtMDAgYWJzMTYuLi47IG1vdiBBbSwoYWJzMTYpIChhYnMxNiBpcyB6ZXJvLWV4dGVuZGVkKQorOC4weGZhKzQuMHg4LDIuQU0xLDAwKzguSU1NMTZBKzguSU1NMTZCOkQyaTo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZBODAwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgc3RvcmVfd29yZCAoRkVUQ0gxNihJTU0xNkEsIElNTTE2QiksCisJICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTTFdKTsKK30KKworCisvLyAxMTExIDExMDAgMTAwMCBBbTAwIGFiczMyLi4uOyBtb3YgQW0sKGFiczMyKQorOC4weGZjKzQuMHg4LDIuQU0xLDAwKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0azo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZDODAwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgc3RvcmVfd29yZCAoRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0xXSk7Cit9CisKKworLy8gMTExMSAxMDAwIDExMTEgMDFBbiBkOC4uLi4uLjsgbW92IFNQLChkOCxBbikgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCis4LjB4ZjgrNC4weGYsMDEsMi5BTjArOC5EODpEMWU6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF9GOEY0MDAgKCk7ICovCisgIFBDID0gY2lhOworICBzdG9yZV93b3JkIChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gKyBFWFRFTkQ4IChEOCksCisJICAgICAgU3RhdGUucmVnc1tSRUdfU1BdKTsKK30KKworCisvLyAwMDEwIDExRG4gaW1tMTYuLi47IG1vdiBpbW0xNixEbiAoaW1tMTYgaXMgc2lnbi1leHRlbmRlZCkKKzQuMHgyLDExLDIuRE4wKzguSU1NMTZBKzguSU1NMTZCOlMyYjo6Om1vdgorIm1vdiIKKyptbjEwMzAwCit7CisgIC8qIE9QXzJDMDAwMCAoKTsgKi8KKyAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworICBQQyA9IGNpYTsKKyAgdmFsdWUgPSBFWFRFTkQxNiAoRkVUQ0gxNihJTU0xNkEsIElNTTE2QikpOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSB2YWx1ZTsKK30KKworCisvLyAxMTExIDExMDAgMTEwMCAxMURuIGltbTMyLi4uOyBtb3YgaW1tMzIsRG4KKzguMHhmYys0LjB4YywxMSwyLkROMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGw6Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAvKiBPUF9GQ0NDMDAwMCAoKTsgKi8KKyAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworICBQQyA9IGNpYTsKKyAgdmFsdWUgPSBGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCk7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IHZhbHVlOworfQorCisKKy8vIDAwMTAgMDFBbiBpbW0xNi4uLjsgbW92IGltbTE2LEFuIChpbW0xNiBpcyB6ZXJvLWV4dGVuZGVkKQorNC4weDIsMDEsMi5BTjArOC5JTU0xNkErOC5JTU0xNkI6UzJjOjo6bW92CisibW92IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfMjQwMDAwICgpOyAqLworICB1bnNpZ25lZCBsb25nIHZhbHVlOworCisgIFBDID0gY2lhOworICB2YWx1ZSA9IEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpOworICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gPSB2YWx1ZTsKK30KKworCisvLyAxMTExIDExMDAgMTEwMSAxMUFuIGltbTMyLi4uOyBtb3YgaW1tMzIsQW4KKzguMHhmYys0LjB4ZCwxMSwyLkFOMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENG06Ojptb3YKKyJtb3YiCisqbW4xMDMwMAoreworICAgIC8qIE9QX0ZDREMwMDAwICgpOyAqLworICAgIFBDID0gY2lhOworICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSA9IEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKTsKK30KKworCisvLyAxMTExIDAwMDAgMDEwMCBEbkFtOyBtb3ZidSAoQW0pLERuCis4LjB4ZjArNC4weDQsMi5ETjEsMi5BTTA6RDA6Ojptb3ZidQorIm1vdmJ1IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjA0MCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4xXQorICAgID0gbG9hZF9ieXRlIChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMF0pOworfQorCisKKy8vIDExMTEgMTAwMCAwMTAwIERuQW0gZDguLi4uLi47IG1vdmJ1IChkOCxBbSksRG4gKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCis4LjB4ZjgrNC4weDQsMi5ETjEsMi5BTTArOC5EODpEMWY6Ojptb3ZidQorIm1vdmJ1IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjg0MDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjFdCisgICAgPSBsb2FkX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMF0gKyBFWFRFTkQ4IChEOCkpKTsKK30KKworCisvLyAxMTExIDEwMTAgMDEwMCBEbkFtIGQxNi4uLi4uOyBtb3ZidSAoZDE2LEFtKSxEbiAoZDE2IGlzIHNpZ24tZXh0ZW5kZWQuKQorOC4weGZhKzQuMHg0LDIuRE4xLDIuQU0wKzguRDE2QSs4LkQxNkI6RDI6Ojptb3ZidQorIm1vdmJ1IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkE0MDAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMV0KKyAgICA9IGxvYWRfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0wXQorCQkgICsgRVhURU5EMTYgKEZFVENIMTYoRDE2QSwgRDE2QikpKSk7Cit9CisKKworLy8gMTExMSAxMTAwIDAxMDAgRG5BbSBkMzIuLi4uLjsgbW92YnUgKGQzMixBbSksRG4KKzguMHhmYys0LjB4NCwyLkROMSwyLkFNMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENDo6Om1vdmJ1CisibW92YnUiCisqbW4xMDMwMAoreworICAvKiBPUF9GQzQwMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4xXQorICAgID0gbG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTTBdCisJCSAgKyBGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpKTsKK30KKworCisvLyAxMTExIDEwMDAgMTAxMSAxMERuIGQ4Li4uLi4uOyBtb3ZidSAoZDgsU1ApLERuIChkOCBpcyB6ZXJvLWV4dGVuZGVkKQorOC4weGY4KzQuMHhiLDEwLDIuRE4wKzguRDg6RDFhOjo6bW92YnUKKyJtb3ZidSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y4QjgwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXQorICAgID0gbG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfU1BdICsgKEQ4KSkpOworfQorCisKKy8vIDExMTEgMTAxMCAxMDExIDEwRG4gZDE2Li4uLi47IG1vdmJ1IChkMTYsU1ApLERuIChkMTYgaXMgemVyby1leHRlbmRlZC4pCis4LjB4ZmErNC4weGIsMTAsMi5ETjArOC5JTU0xNkErOC5JTU0xNkI6RDJhOjo6bW92YnUKKyJtb3ZidSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZBQjgwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdCisgICAgPSBsb2FkX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19TUF0KKwkJICArIEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpKSk7Cit9CisKKworLy8gMTExMSAxMTAwIDEwMTEgMTBEbiBkMzIuLi4uLjsgbW92YnUgKGQzMixTUCksRG4KKzguMHhmYys0LjB4YiwxMCwyLkROMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGE6Ojptb3ZidQorIm1vdmJ1IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkNCODAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KKyAgICA9IGxvYWRfYnl0ZSAoU3RhdGUucmVnc1tSRUdfU1BdCisJCSArIEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSk7Cit9CisKKworLy8gMTExMSAwMTAwIDAwRG4gRGlBbTsgbW92YnUgKERpLEFtKSxEbgorOC4weGY0KzAwLDIuRE4yLDIuREksMi5BTTA6RDBhOjo6bW92YnUKKyJtb3ZidSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y0MDAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMl0KKyAgICA9IGxvYWRfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0wXQorCQkgICsgU3RhdGUucmVnc1tSRUdfRDAgKyBESV0pKTsKK30KKworCisvLyAwMDExIDAxRG4gYWJzMTYuLi47IG1vdmJ1IChhYnMxNiksRG4gKGFiczE2IGlzIHplcm8tZXh0ZW5kZWQpCis0LjB4MywwMSwyLkROMCs4LklNTTE2QSs4LklNTTE2QjpTMjo6Om1vdmJ1CisibW92YnUiCisqbW4xMDMwMAoreworICAvKiBPUF8zNDAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSBsb2FkX2J5dGUgKEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpKTsKK30KKworCisvLyAxMTExIDExMDAgMTAxMCAxMERuIGFiczMyLi4uOyBtb3ZidSAoYWJzMzIpLERuCis4LjB4ZmMrNC4weGEsMTAsMi5ETjArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDRiOjo6bW92YnUKKyJtb3ZidSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZDQTgwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdCisgICAgPSBsb2FkX2J5dGUgKEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSk7Cit9CisKKworLy8gMTExMSAwMDAwIDAxMDEgRG1BbjsgbW92YnUgRG0sKEFuKQorOC4weGYwKzQuMHg1LDIuRE0xLDIuQU4wOkQwYjo6Om1vdmJ1CisibW92YnUiCisqbW4xMDMwMAoreworICAvKiBPUF9GMDUwICgpOyAqLworICBQQyA9IGNpYTsKKyAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdLCBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOworfQorCisKKy8vIDExMTEgMTAwMCAwMTAxIERtQW4gZDguLi4uLi47IG1vdmJ1IERtLChkOCxBbikgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCis4LjB4ZjgrNC4weDUsMi5ETTEsMi5BTjArOC5EODpEMWI6Ojptb3ZidQorIm1vdmJ1IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjg1MDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgc3RvcmVfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSArIEVYVEVORDggKEQ4KSksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKK30KKworCisvLyAxMTExIDEwMTAgMDEwMSBEbUFuIGQxNi4uLi4uOyBtb3ZidSBEbSwoZDE2LEFuKSAoZDE2IGlzIHNpZ24tZXh0ZW5kZWQuKQorOC4weGZhKzQuMHg1LDIuRE0xLDIuQU4wKzguRDE2QSs4LkQxNkI6RDJiOjo6bW92YnUKKyJtb3ZidSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZBNTAwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgc3RvcmVfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSArIEVYVEVORDE2IChGRVRDSDE2KEQxNkEsIEQxNkIpKSksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKK30KKworCisvLyAxMTExIDExMDAgMDEwMSBEbUFuIGQzMi4uLi4uOyBtb3ZidSBEbSwoZDMyLEFuKQorOC4weGZjKzQuMHg1LDIuRE0xLDIuQU4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0Yzo6Om1vdmJ1CisibW92YnUiCisqbW4xMDMwMAoreworICAvKiBPUF9GQzUwMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIHN0b3JlX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0KKwkgICAgICAgKyBGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7Cit9CisKKworLy8gMTExMSAxMDAwIDEwMDEgRG0xMCBkOC4uLi4uLjsgbW92YnUgRG0sKGQ4LFNQKSAoZDggaXMgemVyby1leHRlbmRlZCkKKzguMHhmOCs0LjB4OSwyLkRNMSwxMCs4LkQ4OkQxYzo6Om1vdmJ1CisibW92YnUiCisqbW4xMDMwMAoreworICAvKiBPUF9GODkyMDAgKCk7ICovCisgIFBDID0gY2lhOworICBzdG9yZV9ieXRlIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAoRDgpLCBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOworfQorCisKKy8vIDExMTEgMTAxMCAxMDAxIERtMTAgZDE2Li4uLi47IG1vdmJ1IERtLChkMTYsU1ApIChkMTYgaXMgemVyby1leHRlbmRlZC4pCis4LjB4ZmErNC4weDksMi5ETTEsMTArOC5JTU0xNkErOC5JTU0xNkI6RDJjOjo6bW92YnUKKyJtb3ZidSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZBOTIwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tSRUdfU1BdICsgRkVUQ0gxNihJTU0xNkEsIElNTTE2QiksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKK30KKworCisvLyAxMTExIDExMDAgMTAwMSBEbTEwIGQzMi4uLi4uOyBtb3ZidSBEbSwoZDMyLFNQKQorOC4weGZjKzQuMHg5LDIuRE0xLDEwKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0ZDo6Om1vdmJ1CisibW92YnUiCisqbW4xMDMwMAoreworICAvKiBPUF9GQzkyMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIHN0b3JlX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOworfQorCisKKy8vIDExMTEgMDEwMCAwMURtIERpQW47IG1vdmJ1IERtLChEaSxBbikKKzguMHhmNCswMSwyLkRNMiwyLkRJLDIuQU4wOkQwYzo6Om1vdmJ1CisibW92YnUiCisqbW4xMDMwMAoreworICAvKiBPUF9GNDQwICgpOyAqLworICBQQyA9IGNpYTsKKyAgc3RvcmVfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSArIFN0YXRlLnJlZ3NbUkVHX0QwICsgREldKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIERNMl0pOworfQorCisKKy8vIDAwMDAgRG0xMCBhYnMxNi4uLjsgbW92YnUgRG0sKGFiczE2KSAoYWJzMTYgaXMgemVyby1leHRlbmRlZCkKKzQuMHgwLDIuRE0xLDEwKzguSU1NMTZBKzguSU1NMTZCOlMyYTo6Om1vdmJ1CisibW92YnUiCisqbW4xMDMwMAoreworICAvKiBPUF8yMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIHN0b3JlX2J5dGUgKEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7Cit9CisKKworLy8gMTExMSAxMTAwIDEwMDAgRG0xMCBhYnMzMi4uLjsgbW92YnUgRG0sKGFiczMyKQorOC4weGZjKzQuMHg4LDIuRE0xLDEwKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0ZTo6Om1vdmJ1CisibW92YnUiCisqbW4xMDMwMAoreworICAvKiBPUF9GQzgyMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIHN0b3JlX2J5dGUgKEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOworfQorCisKKy8vIDExMTEgMDAwMCAwMTEwIERuQW07IG1vdmh1IChBbSksRG4KKzguMHhmMCs0LjB4NiwyLkROMSwyLkFNMDpEMDo6Om1vdmh1CisibW92aHUiCisqbW4xMDMwMAoreworICAvKiBPUF9GMDYwICgpOyAqLworICBQQyA9IGNpYTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjFdCisgICAgPSBsb2FkX2hhbGYgKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0wXSk7Cit9CisKKworLy8gMTExMSAxMDAwIDAxMTAgRG5BbSBkOC4uLi4uLjsgbW92aHUgKGQ4LEFtKSxEbiAoZDggaXMgc2lnbi1leHRlbmRlZCkKKzguMHhmOCs0LjB4NiwyLkROMSwyLkFNMCs4LkQ4OkQxZDo6Om1vdmh1CisibW92aHUiCisqbW4xMDMwMAoreworICAvKiBPUF9GODYwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMV0KKyAgICA9IGxvYWRfaGFsZiAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0wXSArIEVYVEVORDggKEQ4KSkpOworfQorCisKKy8vIDExMTEgMTAxMCAwMTEwIERuQW0gZDE2Li4uLi47IG1vdmh1IChkMTYsQW0pLERuIChkMTYgaXMgc2lnbi1leHRlbmRlZC4pCis4LjB4ZmErNC4weDYsMi5ETjEsMi5BTTArOC5EMTZBKzguRDE2QjpEMjo6Om1vdmh1CisibW92aHUiCisqbW4xMDMwMAoreworICAvKiBPUF9GQTYwMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4xXQorICAgID0gbG9hZF9oYWxmICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTTBdCisJCSAgKyBFWFRFTkQxNiAoRkVUQ0gxNihEMTZBLCBEMTZCKSkpKTsKK30KKworCisvLyAxMTExIDExMDAgMDExMCBEbkFtIGQzMi4uLi4uOyBtb3ZodSAoZDMyLEFtKSxEbgorOC4weGZjKzQuMHg2LDIuRE4xLDIuQU0wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0Ojo6bW92aHUKKyJtb3ZodSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZDNjAwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjFdCisgICAgPSBsb2FkX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMF0KKwkJICArIEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSkpOworfQorCisKKy8vIDExMTEgMTAwMCAxMDExIDExRG4gZDguLi4uLjsgbW92aHUgKGQ4LFNQKSxEbiAoZDggaXMgemVyby1leHRlbmRlZCkKKzguMHhmOCs0LjB4YiwxMSwyLkROMCs4LkQ4OkQxYTo6Om1vdmh1CisibW92aHUiCisqbW4xMDMwMAoreworICAvKiBPUF9GOEJDMDAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KKyAgICA9IGxvYWRfaGFsZiAoKFN0YXRlLnJlZ3NbUkVHX1NQXSArIChEOCkpKTsKK30KKworCisvLyAxMTExIDEwMTAgMTAxMSAxMURuIGQxNi4uLi4uOyBtb3ZodSAoZDE2LFNQKSxEbiAoZDE2IGlzIHplcm8tZXh0ZW5kZWQuKQorOC4weGZhKzQuMHhiLDExLDIuRE4wKzguSU1NMTZBKzguSU1NMTZCOkQyYTo6Om1vdmh1CisibW92aHUiCisqbW4xMDMwMAoreworICAvKiBPUF9GQUJDMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXQorICAgID0gbG9hZF9oYWxmICgoU3RhdGUucmVnc1tSRUdfU1BdICsgRkVUQ0gxNihJTU0xNkEsIElNTTE2QikpKTsKK30KKworCisvLyAxMTExIDExMDAgMTAxMSAxMURuIGQzMi4uLi4uOyBtb3ZodSAoZDMyLFNQKSxEbgorOC4weGZjKzQuMHhiLDExLDIuRE4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0YTo6Om1vdmh1CisibW92aHUiCisqbW4xMDMwMAoreworICAvKiBPUF9GQ0JDMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXQorICAgID0gbG9hZF9oYWxmIChTdGF0ZS5yZWdzW1JFR19TUF0gKyBGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpOworfQorCisKKy8vIDExMTEgMDEwMCAxMERuIERpQW07IG1vdmh1IChEaSxBbSksRG4KKzguMHhmNCsxMCwyLkROMiwyLkRJLDIuQU0wOkQwYTo6Om1vdmh1CisibW92aHUiCisqbW4xMDMwMAoreworICAvKiBPUF9GNDgwICgpOyAqLworICBQQyA9IGNpYTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjJdCisgICAgPSBsb2FkX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMF0gKyBTdGF0ZS5yZWdzW1JFR19EMCArIERJXSkpOworfQorCisKKy8vIDAwMTEgMTBEbiBhYnMxNi4uLjsgbW92aHUgKGFiczE2KSxEbiAoYWJzMTYgaXMgemVyby1leHRlbmRlZCkKKzQuMHgzLDEwLDIuRE4wKzguSU1NMTZBKzguSU1NMTZCOlMyOjo6bW92aHUKKyJtb3ZodSIKKyptbjEwMzAwCit7CisgIC8qIE9QXzM4MDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IGxvYWRfaGFsZiAoRkVUQ0gxNihJTU0xNkEsIElNTTE2QikpOworfQorCisKKy8vIDExMTEgMTEwMCAxMDEwIDExRG4gYWJzMzIuLi47IG1vdmh1IChhYnMzMiksRG4KKzguMHhmYys0LjB4YSwxMSwyLkROMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGI6Ojptb3ZodQorIm1vdmh1IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkNBQzAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KKyAgICA9IGxvYWRfaGFsZiAoRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKTsKK30KKworCisvLyAxMTExIDAwMDAgMDExMSBEbUFuOyBtb3ZodSBEbSwoQW4pCis4LjB4ZjArNC4weDcsMi5ETTEsMi5BTjA6RDBiOjo6bW92aHUKKyJtb3ZodSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0YwNzAgKCk7ICovCisgIFBDID0gY2lhOworICBzdG9yZV9oYWxmIChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0sCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKK30KKworCisvLyAxMTExIDEwMDAgMDExMSBEbUFuIGQ4Li4uLi4uOyBtb3ZodSBEbSwoZDgsQW4pIChkOCBpcyBzaWduLWV4dGVuZGVkKQorOC4weGY4KzQuMHg3LDIuRE0xLDIuQU4wKzguRDg6RDFiOjo6bW92aHUKKyJtb3ZodSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y4NzAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIHN0b3JlX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gKyBFWFRFTkQ4IChEOCkpLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7Cit9CisKKworLy8gMTExMSAxMDEwIDAxMTEgRG5BbSBkMTYuLi4uLjsgbW92aHUgRG0sKGQxNixBbikgKGQxNiBpcyBzaWduLWV4dGVuZGVkLikKKzguMHhmYSs0LjB4NywyLkRNMSwyLkFOMCs4LkQxNkErOC5EMTZCOkQyYjo6Om1vdmh1CisibW92aHUiCisqbW4xMDMwMAoreworICAvKiBPUF9GQTcwMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIHN0b3JlX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gKyBFWFRFTkQxNiAoRkVUQ0gxNihEMTZBLCBEMTZCKSkpLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7Cit9CisKKworLy8gMTExMSAxMTAwIDAxMTEgRG1BbiBkMzIuLi4uLjsgbW92aHUgRG0sKGQzMixBbikKKzguMHhmYys0LjB4NywyLkRNMSwyLkFOMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGM6Ojptb3ZodQorIm1vdmh1IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkM3MDAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBzdG9yZV9oYWxmICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdCisJICAgICAgICsgRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pOworfQorCisKKy8vIDExMTEgMTAwMCAxMDAxIERtMTEgZDguLi4uOyBtb3ZodSBEbSwoZDgsU1ApIChkOCBpcyB6ZXJvLWV4dGVuZGVkKQorOC4weGY4KzQuMHg5LDIuRE0xLDExKzguRDg6RDFjOjo6bW92aHUKKyJtb3ZodSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y4OTMwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIHN0b3JlX2hhbGYgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIChEOCksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKK30KKworCisvLyAxMTExIDEwMTAgMTAwMSBEbTExIGQxNi4uLi4uOyBtb3ZodSBEbSwoZDE2LFNQKSAoZDE2IGlzIHplcm8tZXh0ZW5kZWQuKQorOC4weGZhKzQuMHg5LDIuRE0xLDExKzguSU1NMTZBKzguSU1NMTZCOkQyYzo6Om1vdmh1CisibW92aHUiCisqbW4xMDMwMAoreworICAvKiBPUF9GQTkzMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIHN0b3JlX2hhbGYgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7Cit9CisKKworLy8gMTExMSAxMTAwIDEwMDEgRG0xMSBkMzIuLi4uLjsgbW92aHUgRG0sKGQzMixTUCkKKzguMHhmYys0LjB4OSwyLkRNMSwxMSs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGQ6Ojptb3ZodQorIm1vdmh1IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkM5MzAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBzdG9yZV9oYWxmIChTdGF0ZS5yZWdzW1JFR19TUF0gKyBGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKK30KKworCisvLyAxMTExIDAxMDAgMTFEbSBEaUFuOyBtb3ZodSBEbSwoRGksQW4pCis4LjB4ZjQrMTEsMi5ETTIsMi5ESSwyLkFOMDpEMGM6Ojptb3ZodQorIm1vdmh1IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjRDMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIHN0b3JlX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gKyBTdGF0ZS5yZWdzW1JFR19EMCArIERJXSksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETTJdKTsKK30KKworCisvLyAwMDAwIERtMTEgYWJzMTYuLi47IG1vdmh1IERtLChhYnMxNikgKGFiczE2IGlzIHplcm8tZXh0ZW5kZWQpCis0LjB4MCwyLkRNMSwxMSs4LklNTTE2QSs4LklNTTE2QjpTMmE6Ojptb3ZodQorIm1vdmh1IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfMzAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBzdG9yZV9oYWxmIChGRVRDSDE2KElNTTE2QSwgSU1NMTZCKSwgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKK30KKworCisvLyAxMTExIDExMDAgMTAwMCBEbTExIGFiczMyLi4uOyBtb3ZodSBEbSwoYWJzMzIpCis4LjB4ZmMrNC4weDgsMi5ETTEsMTErOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDRlOjo6bW92aHUKKyJtb3ZodSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZDODMwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgc3RvcmVfaGFsZiAoRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7Cit9CisKKworLy8gMTExMSAwMDEwIDExMDEgMDBEbjsgZXh0IERuCis4LjB4ZjIrNC4weGQsMDAsMi5ETjA6RDA6OjpleHQKKyJleHQiCisqbW4xMDMwMAoreworICAvKiBPUF9GMkQwICgpOyAqLworICBQQyA9IGNpYTsKKyAgaWYgKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4ODAwMDAwMDApCisgICAgU3RhdGUucmVnc1tSRUdfTURSXSA9IC0xOworICBlbHNlCisgICAgU3RhdGUucmVnc1tSRUdfTURSXSA9IDA7Cit9CisKKworLy8gMDAwMSAwMERuOyBleHRiIERuCis0LjB4MSwwMCwyLkROMDpTMDo6OmV4dGIKKyJleHRiIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfMTAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSBFWFRFTkQ4IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0pOworfQorCisKKy8vIDAwMDEgMDFEbjsgZXh0YnUgRG4KKzQuMHgxLDAxLDIuRE4wOlMwOjo6ZXh0YnUKKyJleHRidSIKKyptbjEwMzAwCit7CisgIC8qIE9QXzE0ICgpOyAqLworICBQQyA9IGNpYTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICY9IDB4ZmY7Cit9CisKKworLy8gMDAwMSAxMERuOyBleHRoIERuCis0LjB4MSwxMCwyLkROMDpTMDo6OmV4dGgKKyJleHRoIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfMTggKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSBFWFRFTkQxNiAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdKTsKK30KKworCisvLyAwMDAxIDExRG47IGV4dGh1IERuCis0LjB4MSwxMSwyLkROMDpTMDo6OmV4dGh1CisiZXh0aHUiCisqbW4xMDMwMAoreworICAvKiBPUF8xQyAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmPSAweGZmZmY7Cit9CisKKworLy8gMDAwMCBEbjAwOyBjbHIgRG4KKzQuMHgwLDIuRE4xLDAwOlMwOjo6Y2xyCisiY2xyIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4xXSA9IDA7CisKKyAgUFNXIHw9IFBTV19aOworICBQU1cgJj0gfihQU1dfViB8IFBTV19DIHwgUFNXX04pOworfQorCisKKy8vIDExMTAgRG1EbjsgYWRkIERtLERuCis0LjB4ZSwyLkRNMSwyLkROMDpTMDo6OmFkZAorImFkZCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0UwICgpOyAqLworICBQQyA9IGNpYTsKKyAgZ2VuZXJpY0FkZChTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0sIFJFR19EMCArIEROMCk7Cit9CisKKy8vIDExMTEgMDAwMSAwMTEwIERtQW47IGFkZCBEbSxBbgorOC4weGYxKzQuMHg2LDIuRE0xLDIuQU4wOkQwOjo6YWRkCisiYWRkIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjE2MCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGdlbmVyaWNBZGQoU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdLCBSRUdfQTAgKyBBTjApOworfQorCisKKy8vIDExMTEgMDAwMSAwMTAxIEFtRG47IGFkZCBBbSxEbgorOC4weGYxKzQuMHg1LDIuQU0xLDIuRE4wOkQwYTo6OmFkZAorImFkZCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0YxNTAgKCk7ICovCisgIFBDID0gY2lhOworICBnZW5lcmljQWRkKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0xXSwgUkVHX0QwICsgRE4wKTsKK30KKworCisvLyAxMTExIDAwMDEgMDExMSBBbUFuOyBhZGQgQW0sQW4KKzguMHhmMSs0LjB4NywyLkFNMSwyLkFOMDpEMGI6OjphZGQKKyJhZGQiCisqbW4xMDMwMAoreworICAvKiBPUF9GMTcwICgpOyAqLworICBQQyA9IGNpYTsKKyAgZ2VuZXJpY0FkZChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMV0sIFJFR19BMCArIEFOMCk7Cit9CisKKworLy8gMDAxMCAxMERuIGltbTguLi4uOyBhZGQgaW1tOCxEbiAoaW1tOCBpcyBzaWduLWV4dGVuZGVkKQorNC4weDIsMTAsMi5ETjArOC5JTU04OlMxOjo6YWRkCisiYWRkIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfMjgwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGdlbmVyaWNBZGQoRVhURU5EOChJTU04KSwgUkVHX0QwICsgRE4wKTsKK30KKworCisvLyAxMTExIDEwMTAgMTEwMCAwMERuIGltbTE2Li4uOyBhZGQgaW1tMTYsRG4KKzguMHhmYSs0LjB4YywwMCwyLkROMCs4LklNTTE2QSs4LklNTTE2QjpEMjo6OmFkZAorImFkZCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZBQzAwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgZ2VuZXJpY0FkZChFWFRFTkQxNihGRVRDSDE2KElNTTE2QSwgSU1NMTZCKSksIFJFR19EMCArIEROMCk7Cit9CisKKworLy8gMTExMSAxMTAwIDExMDAgMDBEbiBpbW0zMi4uLjsgYWRkIGltbTMyLERuCis4LjB4ZmMrNC4weGMsMDAsMi5ETjArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDQ6OjphZGQKKyJhZGQiCisqbW4xMDMwMAoreworICAvKiBPUF9GQ0MwMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGdlbmVyaWNBZGQoRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpLCBSRUdfRDAgKyBETjApOworfQorCisKKy8vIDAwMTAgMDBBbiBpbW04Li4uLjsgYWRkIGltbTgsQW4gKGltbTggaXMgc2lnbi1leHRlbmRlZCkKKzQuMHgyLDAwLDIuQU4wKzguSU1NODpTMWE6OjphZGQKKyJhZGQiCisqbW4xMDMwMAoreworICAvKiBPUF8yMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgZ2VuZXJpY0FkZChFWFRFTkQ4KElNTTgpLCBSRUdfQTAgKyBBTjApOworfQorCisKKy8vIDExMTEgMTAxMCAxMTAxIDAwQW4gaW1tMTYuLi47IGFkZCBpbW0xNixBbiAoaW1tMTYgaXMgc2lnbi1leHRlbmRlZC4pCis4LjB4ZmErNC4weGQsMDAsMi5BTjArOC5JTU0xNkErOC5JTU0xNkI6RDJhOjo6YWRkCisiYWRkIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkFEMDAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBnZW5lcmljQWRkKEVYVEVORDE2KEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpKSwgUkVHX0EwICsgQU4wKTsKK30KKworCisvLyAxMTExIDExMDAgMTEwMSAwMEFuIGltbTMyLi4uOyBhZGQgaW1tMzIsQW4KKzguMHhmYys0LjB4ZCwwMCwyLkFOMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRDpENGE6OjphZGQKKyJhZGQiCisqbW4xMDMwMAoreworICAvKiBPUF9GQ0QwMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGdlbmVyaWNBZGQoRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpLCBSRUdfQTAgKyBBTjApOworfQorCisKKy8vIDExMTEgMTAwMCAxMTExIDExMTAgaW1tOC4uLi47IGFkZCBpbW04LFNQIChpbW04IGlzIHNpZ24tZXh0ZW5kZWQuKQorOC4weGY4KzguMHhmZSs4LklNTTg6RDE6OjphZGQKKyJhZGQiCisqbW4xMDMwMAoreworICAvKiBPUF9GOEZFMDAgKCk7ICovCisgIHVuc2lnbmVkIGxvbmcgaW1tOworCisgIC8qIE5vdGU6IG5vIFBTVyBjaGFuZ2VzLiAqLworICBQQyA9IGNpYTsKKyAgaW1tID0gRVhURU5EOCAoSU1NOCk7CisgIFN0YXRlLnJlZ3NbUkVHX1NQXSArPSBpbW07Cit9CisKKworLy8gMTExMSAxMDEwIDExMTEgMTExMCBpbW0xNi4uLjsgYWRkIGltbTE2LFNQIChpbW0xNiBpcyBzaWduLWV4dGVuZGVkLikKKzguMHhmYSs4LjB4ZmUrOC5JTU0xNkErOC5JTU0xNkI6RDJiOjo6YWRkCisiYWRkIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkFGRTAwMDAgKCk7ICovCisgIHVuc2lnbmVkIGxvbmcgaW1tOworCisgIC8qIE5vdGU6IG5vIFBTVyBjaGFuZ2VzLiAqLworICBQQyA9IGNpYTsKKyAgaW1tID0gRVhURU5EMTYgKEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpKTsKKyAgU3RhdGUucmVnc1tSRUdfU1BdICs9IGltbTsKK30KKworCisvLyAxMTExIDExMDAgMTExMSAxMTEwIGltbTMyLi4uOyBhZGQgaW1tMzIsU1AKKzguMHhmYys4LjB4ZmUrOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDRiOjo6YWRkCisiYWRkIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkNGRTAwMDAgKCk7ICovCisgIHVuc2lnbmVkIGxvbmcgaW1tOworCisgIC8qIE5vdGU6IG5vIFBTVyBjaGFuZ2VzLiAqLworICBQQyA9IGNpYTsKKyAgaW1tID0gRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpOworICBTdGF0ZS5yZWdzW1JFR19TUF0gKz0gaW1tOworfQorCisKKy8vIDExMTEgMDAwMSAwMTAwIERtRG47IGFkZGMgRG0sRG4KKzguMHhmMSs0LjB4NCwyLkRNMSwyLkROMDpEMDo6OmFkZGMKKyJhZGRjIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjE0MCAoKTsgKi8KKyAgaW50IHosIGMsIG4sIHY7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgc3VtOworCisgIFBDID0gY2lhOworICByZWcxID0gU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdOworICByZWcyID0gU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdOworICBzdW0gPSByZWcxICsgcmVnMiArICgoUFNXICYgUFNXX0MpICE9IDApOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSBzdW07CisKKyAgeiA9ICgoUFNXICYgUFNXX1opICE9IDApICYmIChzdW0gPT0gMCk7CisgIG4gPSAoc3VtICYgMHg4MDAwMDAwMCk7CisgIGMgPSAoc3VtIDwgcmVnMSkgfHwgKHN1bSA8IHJlZzIpOworICB2ID0gKChyZWcyICYgMHg4MDAwMDAwMCkgPT0gKHJlZzEgJiAweDgwMDAwMDAwKQorICAgICAgICYmIChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHN1bSAmIDB4ODAwMDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQorCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOworfQorCisKKy8vIDExMTEgMDAwMSAwMDAwIERtRG47IHN1YiBEbSxEbgorOC4weGYxKzQuMHgwLDIuRE0xLDIuRE4wOkQwOjo6c3ViCisic3ViIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjEwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGdlbmVyaWNTdWIoU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdLCBSRUdfRDAgKyBETjApOworfQorCisvLyAxMTExIDAwMDEgMDAxMCBEbUFuOyBzdWIgRG1BbgorOC4weGYxKzQuMHgyLDIuRE0xLDIuQU4wOkQwYTo6OnN1YgorInN1YiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0YxMjAgKCk7ICovCisgIFBDID0gY2lhOworICBnZW5lcmljU3ViKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSwgUkVHX0EwICsgQU4wKTsKK30KKworCisvLyAxMTExIDAwMDEgMDAwMSBBbURuOyBzdWIgQW1EbgorOC4weGYxKzQuMHgxLDIuQU0xLDIuRE4wOkQwYjo6OnN1YgorInN1YiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0YxMTAgKCk7ICovCisgIFBDID0gY2lhOworICBnZW5lcmljU3ViKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU0xXSwgUkVHX0QwICsgRE4wKTsKK30KKworCisvLyAxMTExIDAwMDEgMDAxMSBBbUFuOyBzdWIgQW0sQW4KKzguMHhmMSs0LjB4MywyLkFNMSwyLkFOMDpEMGM6OjpzdWIKKyJzdWIiCisqbW4xMDMwMAoreworICAvKiBPUF9GMTMwICgpOyAqLworICBQQyA9IGNpYTsKKyAgZ2VuZXJpY1N1YihTdGF0ZS5yZWdzW1JFR19BMCArIEFNMV0sIFJFR19BMCArIEFOMCk7Cit9CisKKworLy8gMTExMSAxMTAwIDExMDAgMDFEbiBpbW0zMi4uLjsgc3ViIGltbTMyLERuCis4LjB4ZmMrNC4weGMsMDEsMi5ETjArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDQ6OjpzdWIKKyJzdWIiCisqbW4xMDMwMAoreworICAvKiBPUF9GQ0M0MDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGdlbmVyaWNTdWIoRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpLCBSRUdfRDAgKyBETjApOworfQorCisKKy8vIDExMTEgMTEwMCAxMTAxIDAxQW4gaW1tMzIuLi47IHN1YiBpbW0zMixBbgorOC4weGZjKzQuMHhkLDAxLDIuQU4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0YTo6OnN1YgorInN1YiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZDRDQwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgZ2VuZXJpY1N1YihGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCksIFJFR19BMCArIEFOMCk7Cit9CisKKworLy8gMTExMSAwMDAxIDEwMDAgRG1Ebjsgc3ViYyBEbSxEbgorOC4weGYxKzQuMHg4LDIuRE0xLDIuRE4wOkQwOjo6c3ViYworInN1YmMiCisqbW4xMDMwMAoreworICAvKiBPUF9GMTgwICgpOyAqLworICBpbnQgeiwgYywgbiwgdjsKKyAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCBkaWZmZXJlbmNlOworCisgIFBDID0gY2lhOworICByZWcxID0gU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdOworICByZWcyID0gU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdOworICBkaWZmZXJlbmNlID0gcmVnMiAtIHJlZzEgLSAoKFBTVyAmIFBTV19DKSAhPSAwKTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gZGlmZmVyZW5jZTsKKworICB6ID0gKChQU1cgJiBQU1dfWikgIT0gMCkgJiYgKGRpZmZlcmVuY2UgPT0gMCk7CisgIG4gPSAoZGlmZmVyZW5jZSAmIDB4ODAwMDAwMDApOworICBjID0gKHJlZzEgPiByZWcyKTsKKyAgdiA9ICgocmVnMiAmIDB4ODAwMDAwMDApICE9IChyZWcxICYgMHg4MDAwMDAwMCkKKyAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwMDApICE9IChkaWZmZXJlbmNlICYgMHg4MDAwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCisJICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Cit9CisKKworLy8gMTExMSAwMDEwIDAxMDAgRG1EbjsgbXVsIERtLERuCis4LjB4ZjIrNC4weDQsMi5ETTEsMi5ETjA6RDA6OjptdWwKKyJtdWwiCisqbW4xMDMwMAoreworICAvKiBPUF9GMjQwICgpOyAqLworICB1bnNpZ25lZCBsb25nIGxvbmcgdGVtcDsKKyAgaW50IG4sIHo7CisKKyAgUEMgPSBjaWE7CisgIHRlbXAgPSAoKHNpZ25lZDY0KShzaWduZWQzMilTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KKyAgICAgICAgICAqICAoc2lnbmVkNjQpKHNpZ25lZDMyKVN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IHRlbXAgJiAweGZmZmZmZmZmOworICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gKHRlbXAgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkgPj4gMzI7OworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJiAweDgwMDAwMDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKK30KKworCisvLyAxMTExIDAwMTAgMDEwMSBEbURuOyBtdWx1IERtLERuCis4LjB4ZjIrNC4weDUsMi5ETTEsMi5ETjA6RDA6OjptdWx1CisibXVsdSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0YyNTAgKCk7ICovCisgIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZW1wOworICBpbnQgbiwgejsKKworICBQQyA9IGNpYTsKKyAgdGVtcCA9ICgodW5zaWduZWQ2NClTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KKyAgICAgICAgICAqICh1bnNpZ25lZDY0KVN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IHRlbXAgJiAweGZmZmZmZmZmOworICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gKHRlbXAgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkgPj4gMzI7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOworfQorCisKKy8vIDExMTEgMDAxMCAwMTEwIERtRG47IGRpdiBEbSxEbgorOC4weGYyKzQuMHg2LDIuRE0xLDIuRE4wOkQwOjo6ZGl2CisiZGl2IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjI2MCAoKTsgKi8KKyAgc2lnbmVkNjQgdGVtcDsKKyAgc2lnbmVkMzIgZGVub207CisgIGludCBuLCB6LCB2OworCisgIFBDID0gY2lhOworICBkZW5vbSA9IChzaWduZWQzMilTdGF0ZS5yZWdzW1JFR19EMCArIERNMV07CisKKyAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX01EUl07CisgIHRlbXAgPDw9IDMyOworICB0ZW1wIHw9IFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXTsKKyAgaWYgKCAhKHYgPSAoMCA9PSBkZW5vbSkpICkKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gdGVtcCAlIChzaWduZWQzMilTdGF0ZS5yZWdzW1JFR19EMCArIERNMV07CisgICAgICB0ZW1wIC89IChzaWduZWQzMilTdGF0ZS5yZWdzW1JFR19EMCArIERNMV07CisgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSB0ZW1wICYgMHhmZmZmZmZmZjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gdGVtcDsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IDB4ZmY7CisgICAgfQorICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJiAweDgwMDAwMDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKK30KKworCisvLyAxMTExIDAwMTAgMDExMSBEbURuOyBkaXZ1IERtLERuCis4LjB4ZjIrNC4weDcsMi5ETTEsMi5ETjA6RDA6OjpkaXZ1CisiZGl2dSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0YyNzAgKCk7ICovCisgIHVuc2lnbmVkNjQgdGVtcDsKKyAgdW5zaWduZWQzMiBkZW5vbTsKKyAgaW50IG4sIHosIHY7CisKKyAgUEMgPSBjaWE7CisgIGRlbm9tID0gKHVuc2lnbmVkMzIpU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdOworICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfTURSXTsKKyAgdGVtcCA8PD0gMzI7CisgIHRlbXAgfD0gU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdOworICBpZiAoICEodiA9ICgwID09IGRlbm9tKSkgKSAKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gdGVtcCAlIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXTsKKyAgICAgIHRlbXAgLz0gU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdOworICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gdGVtcCAmIDB4ZmZmZmZmZmY7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfTURSXSA9IHRlbXA7CisgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSAweGZmOworICAgIH0KKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Cit9CisKKworLy8gMDEwMCBEbjAwOyBpbmMgRG4KKzQuMHg0LDIuRE4xLDAwOlMwOjo6aW5jCisiaW5jIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfNDAgKCk7ICovCisgIHVuc2lnbmVkIGludCBpbW07CisKKyAgUEMgPSBjaWE7CisgIGltbSA9IDE7CisgIGdlbmVyaWNBZGQoaW1tLCBSRUdfRDAgKyBETjEpOworfQorCisKKy8vIDAxMDAgQW4wMQorNC4weDQsMi5BTjEsMDE6UzBhOjo6aW5jCisiaW5jIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfNDEgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMV0gKz0gMTsKK30KKworCisvLyAwMTAxIDAwQW47IGluYzQgQW4KKzQuMHg1LDAwLDIuQU4wOlMwOjo6aW5jNAorImluYzQiCisqbW4xMDMwMAoreworICAvKiBPUF81MCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSArPSA0OworfQorCisKKy8vIDEwMTAgRG5EbiBpbW04Li4uLjsgY21wIGltbTgsRG4gKGltbTggaXMgc2lnbi1leHRlbmRlZC4pCis0LjB4YSwyLkRNMSwyLkROMD1ETTErSU1NODpTMGk6OjpjbXAKKyJjbXAiCisqbW4xMDMwMAoreworICBQQyA9IGNpYTsKKyAgLyogT1BfQTAwMCAoKTsgKi8KKyAgZ2VuZXJpY0NtcChFWFRFTkQ4IChJTU04KSwgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdKTsKK30KKworCisvLyAxMDEwIERtRG47IGNtcCBEbSxEbiAoRG0gIT0gRG4sIHNlZSBhYm92ZSB3aGVuIERtID09IERuKQorNC4weGEsMi5ETTEsMi5ETjAhRE0xOlMwOjo6Y21wCisiY21wIgorKm1uMTAzMDAKK3sKKyAgUEMgPSBjaWE7CisgIC8qIE9QX0EwICgpOyAqLworICBnZW5lcmljQ21wKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSwgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdKTsKK30KKworCisvLyAxMTExIDAwMDEgMTAxMCBEbUFuOyBjbXAgRG0sQW4KKzguMHhmMSs0LjB4YSwyLkRNMSwyLkFOMDpEMDo6OmNtcAorImNtcCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0YxQTAgKCk7ICovCisgIFBDID0gY2lhOworICBnZW5lcmljQ21wKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSwgU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdKTsKK30KKworCisvLyAxMTExIDAwMDEgMTAwMSBBbURuOyBjbXAgQW0sRG4KKzguMHhmMSs0LjB4OSwyLkFNMSwyLkROMDpEMGE6OjpjbXAKKyJjbXAiCisqbW4xMDMwMAoreworICAvKiBPUF9GMTkwICgpOyAqLworICBQQyA9IGNpYTsKKyAgZ2VuZXJpY0NtcChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMV0sIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSk7Cit9CisKKworLy8gMTAxMSBBbkFuIGltbTguLi4uOyBjbXAgaW1tOCxBbiAoaW1tOCBpcyB6ZXJvLWV4dGVuZGVkLikKKzQuMHhiLDIuQU0xLDIuQU4wPUFNMStJTU04OlMwYWk6OjpjbXAKKyJjbXAiCisqbW4xMDMwMAoreworICBQQyA9IGNpYTsKKyAgLyogT1BfQjAwMCAoKTsgKi8KKyAgZ2VuZXJpY0NtcChJTU04LAorCSAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdKTsKK30KKworCisvLyAxMDExIEFtQW47IGNtcCBBbSxBbiAoRG0gIT0gRG4sIHNlZSBhYm92ZSB3aGVuIERtID09IERuKQorNC4weGIsMi5BTTEsMi5BTjAhQU0xOlMwYTo6OmNtcAorImNtcCIKKyptbjEwMzAwCit7CisgIFBDID0gY2lhOworICAvKiBPUF9CMCAoKTsgKi8KKyAgZ2VuZXJpY0NtcChTdGF0ZS5yZWdzW1JFR19BMCArIEFNMV0sIFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSk7Cit9CisKKworLy8gMTExMSAxMDEwIDExMDAgMTBEbiBpbW0xNi4uLjsgY21wIGltbTE2LERuIChpbW0xNiBpcyBzaWduLWV4dGVuZGVkLikKKzguMHhmYSs0LjB4YywxMCwyLkROMCs4LklNTTE2QSs4LklNTTE2QjpEMjo6OmNtcAorImNtcCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZBQzgwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgZ2VuZXJpY0NtcChFWFRFTkQxNihGRVRDSDE2KElNTTE2QSwgSU1NMTZCKSksCisJICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0pOworfQorCisKKy8vIDExMTEgMTEwMCAxMTAwIDEwRG4gaW1tMzIuLi47IGNtcCBpbW0zMixEbgorOC4weGZjKzQuMHhjLDEwLDIuRE4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0Ojo6Y21wCisiY21wIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkNDODAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBnZW5lcmljQ21wKEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwKKwkgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSk7Cit9CisKKworLy8gMTExMSAxMDEwIDExMDEgMTBBbiBpbW0xNi4uLjsgY21wIGltbTE2LEFuIChpbW0xNiBpcyB6ZXJvLWV4dGVuZGVkLikKKzguMHhmYSs0LjB4ZCwxMCwyLkFOMCs4LklNTTE2QSs4LklNTTE2QjpEMmE6OjpjbXAKKyJjbXAiCisqbW4xMDMwMAoreworICAvKiBPUF9GQUQ4MDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGdlbmVyaWNDbXAoRkVUQ0gxNihJTU0xNkEsIElNTTE2QiksCisJICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0pOworfQorCisKKy8vIDExMTEgMTEwMCAxMTAxIDEwQW4gaW1tMzIuLi47IGNtcCBpbW0zMixBbgorOC4weGZjKzQuMHhkLDEwLDIuQU4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0YTo6OmNtcAorImNtcCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZDRDgwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgZ2VuZXJpY0NtcChGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCksCisJICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0pOworfQorCisKKy8vIDExMTEgMDAxMCAwMDAwIERtRG47IGFuZCBEbSxEbgorOC4weGYyKzQuMHgwLDIuRE0xLDIuRE4wOkQwOjo6YW5kCisiYW5kIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjIwMCAoKTsgKi8KKyAgaW50IG4sIHo7CisKKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmPSBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV07CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOworfQorCisKKy8vIDExMTEgMTAwMCAxMTEwIDAwRG4gaW1tOC4uLi47IGFuZCBpbW04LERuIChpbW04IGlzIHplcm8tZXh0ZW5kZWQuKQorOC4weGY4KzQuMHhlLDAwLDIuRE4wKzguSU1NODpEMTo6OmFuZAorImFuZCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y4RTAwMCAoKTsgKi8KKyAgaW50IG4sIHo7CisKKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmPSBJTU04OworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJiAweDgwMDAwMDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKK30KKworCisvLyAxMTExIDEwMTAgMTExMCAwMERuIGltbTE2Li4uOyBhbmQgaW1tMTYsRG4gKGltbTE2IGlzIHplcm8tZXh0ZW5kZWQuKQorOC4weGZhKzQuMHhlLDAwLDIuRE4wKzguSU1NMTZBKzguSU1NMTZCOkQyOjo6YW5kCisiYW5kIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkFFMDAwMDAgKCk7ICovCisgIGludCBuLCB6OworCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJj0gRkVUQ0gxNihJTU0xNkEsIElNTTE2Qik7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOworfQorCisKKy8vIDExMTEgMTEwMCAxMTEwIDAwRG4gaW1tMzIuLi47IGFuZCBpbW0zMixEbgorOC4weGZjKzQuMHhlLDAwLDIuRE4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0Ojo6YW5kCisiYW5kIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkNFMDAwMDAgKCk7ICovCisgIGludCBuLCB6OworCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KKyAgICAmPSBGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCk7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOworfQorCisKKy8vIDExMTEgMTAxMCAxMTExIDExMDAgaW1tMTYuLi47IGFuZCBpbW0xNixQU1cgKGltbTE2IGlzIHplcm8tZXh0ZW5kZWQuKQorOC4weGZhKzguMHhmYys4LklNTTE2QSs4LklNTTE2QjpEMmE6OjphbmQKKyJhbmQiCisqbW4xMDMwMAoreworICAvKiBPUF9GQUZDMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFBTVyAmPSBGRVRDSDE2KElNTTE2QSwgSU1NMTZCKTsKK30KKworCisKKy8vIDExMTEgMDAxMCAwMDAxIERtRG47IG9yIERtRG4KKzguMHhmMis0LjB4MSwyLkRNMSwyLkROMDpEMDo6Om9yCisib3IiCisqbW4xMDMwMAoreworICAvKiBPUF9GMjEwICgpOyAqLworICBQQyA9IGNpYTsKKyAgZ2VuZXJpY09yKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSwgUkVHX0QwICsgRE4wKTsKK30KKworCisvLyAxMTExIDEwMDAgMTExMCAwMURuIGltbTguLi4uOyBvciBpbW04LERuIChpbW04IGlzIHplcm8tZXh0ZW5kZWQuKW4KKzguMHhmOCs0LjB4ZSwwMSwyLkROMCs4LklNTTg6RDE6OjpvcgorIm9yIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjhFNDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgZ2VuZXJpY09yKElNTTgsIFJFR19EMCArIEROMCk7Cit9CisKKworLy8gMTExMSAxMDEwIDExMTAgMDFEbiBpbW0xNi4uLjsgb3IgaW1tMTYsRE4gKGltbTE2IGlzIHplcm8tZXh0ZW5kZWQuKQorOC4weGZhKzQuMHhlLDAxLDIuRE4wKzguSU1NMTZBKzguSU1NMTZCOkQyOjo6b3IKKyJvciIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZBRTQwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgZ2VuZXJpY09yKEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpLCBSRUdfRDAgKyBETjApOworfQorCisKKy8vIDExMTEgMTEwMCAxMTEwIDAxRG4gaW1tMzIuLi47IG9yIGltbTMyLERuCis4LjB4ZmMrNC4weGUsMDEsMi5ETjArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDQ6OjpvcgorIm9yIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkNFNDAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBnZW5lcmljT3IoRkVUQ0gzMihJTU0zMkEsIElNTTMyQiwgSU1NMzJDLCBJTU0zMkQpLCBSRUdfRDAgKyBETjApOworfQorCisKKy8vIDExMTEgMTAxMCAxMTExIDExMDEgaW1tMTYuLi47IG9yIGltbTE2LFBTVyAoaW1tMTYgaXMgemVyby1leHRlbmRlZC4pCis4LjB4ZmErOC4weGZkKzguSU1NMTZBKzguSU1NMTZCOkQyYTo6Om9yCisib3IiCisqbW4xMDMwMAoreworICAvKiBPUF9GQUZEMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFBTVyB8PSBGRVRDSDE2KElNTTE2QSwgSU1NMTZCKTsKK30KKworCisvLyAxMTExIDAwMTAgMDAxMCBEbURuOyB4b3IgRG0sRG4KKzguMHhmMis0LjB4MiwyLkRNMSwyLkROMDpEMDo6OnhvcgorInhvciIKKyptbjEwMzAwCit7CisgIC8qIE9QX0YyMjAgKCk7ICovCisgIFBDID0gY2lhOworICBnZW5lcmljWG9yKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSwgUkVHX0QwICsgRE4wKTsKK30KKworCisvLyAxMTExIDEwMTAgMTExMCAxMERuIGltbTE2Li4uOyB4b3IgaW1tMTYsRG4gKGltbTE2IGlzIHplcm8tZXh0ZW5kZWQuKQorOC4weGZhKzQuMHhlLDEwLDIuRE4wKzguSU1NMTZBKzguSU1NMTZCOkQyOjo6eG9yCisieG9yIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkFFODAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBnZW5lcmljWG9yKEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpLCBSRUdfRDAgKyBETjApOworfQorCisKKy8vIDExMTEgMTEwMCAxMTEwIDEwRG4gaW1tMzIuLi47IHhvciBpbW0zMixEbgorOC4weGZjKzQuMHhlLDEwLDIuRE4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0Ojo6eG9yCisieG9yIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkNFODAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBnZW5lcmljWG9yKEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwgUkVHX0QwICsgRE4wKTsKK30KKworCisvLyAxMTExIDAwMTAgMDAxMSAwMERuOyBub3QgRG4KKzguMHhmMis0LjB4MywwMCwyLkROMDpEMDo6Om5vdAorIm5vdCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0YyMzAgKCk7ICovCisgIGludCBuLCB6OworCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSB+U3RhdGUucmVnc1tSRUdfRDAgKyBETjBdOworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJiAweDgwMDAwMDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKK30KKworCisvLyAxMTExIDEwMDAgMTExMCAxMURuIGltbTguLi4uOyBidHN0IGltbTgsRG4gKGltbTggaXMgemVyby1leHRlbmRlZC4pCis4LjB4ZjgrNC4weGUsMTEsMi5ETjArOC5JTU04OkQxOjo6YnRzdAorImJ0c3QiCisqbW4xMDMwMAoreworICAvKiBPUF9GOEVDMDAgKCk7ICovCisgIFBDID0gY2lhOworICBnZW5lcmljQnRzdChJTU04LCBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0pOworfQorCisKKy8vIDExMTEgMTAxMCAxMTEwIDExRG4gaW1tMTYuLi4uLjsgYnRzdCBpbW0xNixEbiAoaW1tMTYgaXMgemVyby1leHRlbmRlZC4pCis4LjB4ZmErNC4weGUsMTEsMi5ETjArOC5JTU0xNkErOC5JTU0xNkI6RDI6OjpidHN0CisiYnRzdCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZBRUMwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgZ2VuZXJpY0J0c3QoRkVUQ0gxNihJTU0xNkEsIElNTTE2QiksIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSk7Cit9CisKKworLy8gMTExMSAxMTAwIDExMTAgMTFEbiBpbW0zMi4uLjsgYnRzdCBpbW0zMixEbgorOC4weGZjKzQuMHhlLDExLDIuRE4wKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEOkQ0Ojo6YnRzdAorImJ0c3QiCisqbW4xMDMwMAoreworICAvKiBPUF9GQ0VDMDAwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGdlbmVyaWNCdHN0KEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0pOworfQorCisKKy8vIDExMTEgMTExMCAwMDAwIDAwMTAgYWJzMzIuLi4gaW1tOC4uLi47IGJ0c3QgaW1tOCwoYWJzMzIpIChpbW04IGlzIHplcm8tZXh0ZW5kZWQuLCBwcm9jZXNzaW5nIHVuaXQ6IGJ5dGUpCis4LjB4ZmUrOC4weDAyKzguSU1NMzJBKzguSU1NMzJCKzguSU1NMzJDKzguSU1NMzJEKzguSU1NODpENTo6OmJ0c3QKKyJidHN0IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkUwMjAwMDAgKCk7ICovCisgIFBDID0gY2lhOworICBnZW5lcmljQnRzdChJTU04LAorCSAgICAgIGxvYWRfYnl0ZShGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpKTsKK30KKworCisvLyAxMTExIDEwMTAgMTExMSAxMEFuIGQ4Li4uLi4uIGltbTguLi4uOyAKKy8vIGJ0c3QgaW1tOCwoZDgsQW4pIChkOCBpcyBzaWduLWV4dGVuZGVkLGltbTggaXMgemVyby1leHRlbmRlZC4sIHByb2Nlc3NpbmcgdW5pdDogYnl0ZSkKKzguMHhmYSs0LjB4ZiwxMCwyLkFOMCs4LkQ4KzguSU1NODpEMmE6OjpidHN0CisiYnRzdCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZBRjgwMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgZ2VuZXJpY0J0c3QoSU1NOCwKKwkgICAgICBsb2FkX2J5dGUoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdICsgRVhURU5EOChEOCkpKTsKK30KKworCisvLyAxMTExIDAwMDAgMTAwMCBEbUFuOyBic2V0IERtLChBbikgKFByb2Nlc3NpbmcgdW5pdCBieXRlKQorOC4weGYwKzQuOCwyLkRNMSwyLkFOMDpEMDo6OmJzZXQKKyJic2V0IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjA4MCAoKTsgKi8KKyAgdW5zaWduZWQgbG9uZyB0ZW1wOworICBpbnQgejsKKworICBQQyA9IGNpYTsKKyAgdGVtcCA9IGxvYWRfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdKTsKKyAgeiA9ICh0ZW1wICYgU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKSA9PSAwOworICB0ZW1wIHw9IFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXTsKKyAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdLCB0ZW1wKTsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKHogPyBQU1dfWiA6IDApOworfQorCisKKy8vIDExMTEgMTExMCAwMDAwIDAwMDAgYWJzMzIuLi4gaW1tOC4uLi47CisvLyBic2V0IGltbTgsKGFiczMyKSAoaW1tOCBpcyB6ZXJvLWV4dGVuZGVkLiwgcHJvY2Vzc2luZyB1bml0OiBieXRlKQorOC4weGZlKzguMHgwMCs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRCs4LklNTTg6RDU6Ojpic2V0CisiYnNldCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZFMDAwMDAwICgpOyAqLworICB1bnNpZ25lZCBsb25nIHRlbXA7CisgIGludCB6OworCisgIFBDID0gY2lhOworICB0ZW1wID0gbG9hZF9ieXRlIChGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpOworICB6ID0gKHRlbXAgJiBJTU04KSA9PSAwOworICB0ZW1wIHw9IElNTTg7CisgIHN0b3JlX2J5dGUgKEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwgdGVtcCk7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKTsKK30KKworCisvLyAxMTExIDEwMTAgMTExMSAwMEFuQW4gZDguLi4uLi4gaW1tOC4uLi47CisvLyBic2V0IGltbTgsKGQ4LEFuKSAoZDggaXMgc2lnbi1leHRlbmRlZCwgaW1tOCBpcyB6ZXJvLWV4dGVuZGVkLiwgcHJvY2Vzc2luZyB1bml0OiBieXRlKQorOC4weGZhKzQuMHhmLDAwLDIuQU4wKzguRDgrOC5JTU04OkQyOjo6YnNldAorImJzZXQiCisqbW4xMDMwMAoreworICAvKiBPUF9GQUYwMDAwMCAoKTsgKi8KKyAgdW5zaWduZWQgbG9uZyB0ZW1wOworICBpbnQgejsKKworICBQQyA9IGNpYTsKKyAgdGVtcCA9IGxvYWRfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgQU4wXSArIEVYVEVORDggKEQ4KSkpOworICB6ID0gKHRlbXAgJiAoSU1NOCkpID09IDA7CisgIHRlbXAgfD0gKElNTTgpOworICBzdG9yZV9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdICsgRVhURU5EOCAoRDgpKSwgdGVtcCk7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKTsKK30KKworCisvLyAxMTExIDAwMDAgMTAwMSBEbUFuOyBiY2xyIERtLChBbikgKFByb2Nlc3NpbmcgdW5pdCBieXRlKQorOC4weGYwKzQuMHg5LDIuRE0xLDIuQU4wOkQwOjo6YmNscgorImJjbHIiCisqbW4xMDMwMAoreworICAvKiBPUF9GMDkwICgpOyAqLworICB1bnNpZ25lZCBsb25nIHRlbXA7CisgIGludCB6OworCisgIFBDID0gY2lhOworICB0ZW1wID0gbG9hZF9ieXRlIChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0pOworICB6ID0gKHRlbXAgJiBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV0pID09IDA7CisgIHRlbXAgPSB0ZW1wICYgflN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXTsKKyAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdLCB0ZW1wKTsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKHogPyBQU1dfWiA6IDApOworfQorCisKKy8vIDExMTEgMTExMCAwMDAwIDAwMDEgYWJzMzIuLi4gaW1tOC4uLi47CisvLyBiY2xyIGltbTgsKGFiczMyKSAoaW1tOCBpcyB6ZXJvLWV4dGVuZGVkLiwgcHJvY2Vzc2luZyB1bml0OiBieXRlKQorOC4weGZlKzguMHgwMSs4LklNTTMyQSs4LklNTTMyQis4LklNTTMyQys4LklNTTMyRCs4LklNTTg6RDU6OjpiY2xyCisiYmNsciIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZFMDEwMDAwICgpOyAqLworICB1bnNpZ25lZCBsb25nIHRlbXA7CisgIGludCB6OworCisgIFBDID0gY2lhOworICB0ZW1wID0gbG9hZF9ieXRlIChGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpOworICB6ID0gKHRlbXAgJiBJTU04KSA9PSAwOworICB0ZW1wID0gdGVtcCAmIH4oSU1NOCk7CisgIHN0b3JlX2J5dGUgKEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSwgdGVtcCk7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKTsKK30KKworCisvLyAxMTExIDEwMTAgMTExMSAwMUFuIGQ4Li4uLi4uIGltbTguLi4uOworLy8gYmNsciBpbW04LChkOCxBbikgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQsIGltbTggaXMgemVyby1leHRlbmRlZC4sIHByb2Nlc3NpbmcgdW5pdDogYnl0ZSkKKzguMHhmYSs0LjB4ZiwwMSwyLkFOMCs4LkQ4KzguSU1NODpEMjo6OmJjbHIKKyJiY2xyIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkFGNDAwMDAgKCk7ICovCisgIHVuc2lnbmVkIGxvbmcgdGVtcDsKKyAgaW50IHo7CisKKyAgUEMgPSBjaWE7CisgIHRlbXAgPSBsb2FkX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gKyBFWFRFTkQ4IChEOCkpKTsKKyAgeiA9ICh0ZW1wICYgKElNTTgpKSA9PSAwOworICB0ZW1wID0gdGVtcCAmIH4oSU1NOCk7CisgIHN0b3JlX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF0gKyBFWFRFTkQ4IChEOCkpLCB0ZW1wKTsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKHogPyBQU1dfWiA6IDApOworfQorCisKKy8vIDExMTEgMDAxMCAxMDExIERtRG47IGFzciBEbSxEbgorOC4weGYyKzQuMHhiLDIuRE0xLDIuRE4wOkQwOjo6YXNyCisiYXNyIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjJCMCAoKTsgKi8KKyAgbG9uZyB0ZW1wOworICBpbnQgeiwgbiwgYzsKKworICBQQyA9IGNpYTsKKyAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXTsKKyAgYyA9IHRlbXAgJiAxOworICB0ZW1wID4+PSBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV07CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IHRlbXA7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyk7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApIHwgKGMgPyBQU1dfQyA6IDApKTsKK30KKworCisvLyAxMTExIDEwMDAgMTEwMCAxMERuIGltbTguLi47IGFzciBpbW04LERuIChpbW04IGlzIHplcm8tZXh0ZW5kZWQuKQorOC4weGY4KzQuMHhjLDEwLDIuRE4wKzguSU1NODpEMTo6OmFzcgorImFzciIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y4QzgwMCAoKTsgKi8KKyAgbG9uZyB0ZW1wOworICBpbnQgeiwgbiwgYzsKKworICBQQyA9IGNpYTsKKyAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXTsKKyAgYyA9IHRlbXAgJiAxOworICB0ZW1wID4+PSBJTU04OworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSB0ZW1wOworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJiAweDgwMDAwMDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSB8IChjID8gUFNXX0MgOiAwKSk7Cit9CisKKworLy8gMTExMSAwMDEwIDEwMTAgRG1EbjsgbHNyIERtLERuCis4LjB4ZjIrNC4weGEsMi5ETTEsMi5ETjA6RDA6Ojpsc3IKKyJsc3IiCisqbW4xMDMwMAoreworICAvKiBPUF9GMkEwICgpOyAqLworICBpbnQgeiwgbiwgYzsKKworICBQQyA9IGNpYTsKKyAgYyA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXQorICAgID4+PSBTdGF0ZS5yZWdzW1JFR19EMCArIERNMV07CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyk7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApIHwgKGMgPyBQU1dfQyA6IDApKTsKK30KKworCisvLyAxMTExIDEwMDAgMTEwMCAwMURuIGltbTguLi47IGxzciBpbW04LERuIChpbW04IGlzIHplcm8tZXh0ZW5kZWQuKQorOC4weGY4KzQuMHhjLDAxLDIuRE4wKzguSU1NODpEMTo6OmxzcgorImxzciIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y4QzQwMCAoKTsgKi8KKyAgaW50IHosIG4sIGM7CisKKyAgUEMgPSBjaWE7CisgIGMgPSBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJiAxOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPj49ICBJTU04OworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJiAweDgwMDAwMDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSB8IChjID8gUFNXX0MgOiAwKSk7Cit9CisKKworLy8gMTExMSAwMDEwIDEwMDEgRG1EbjsgYXNsIERtLERuCis4LjB4ZjIrNC4weDksMi5ETTEsMi5ETjA6RDA6Ojphc2wKKyJhc2wiCisqbW4xMDMwMAoreworICAvKiBPUF9GMjkwICgpOyAqLworICBpbnQgbiwgejsKKworICBQQyA9IGNpYTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdCisgICAgPDw9IFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXTsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKK30KKworCisvLyAxMTExIDEwMDAgMTEwMCAwMERuIGltbTguLi47IGFzbCBpbW04LERuIChpbW04IGlzIHplcm8tZXh0ZW5kZWQuKQorOC4weGY4KzQuMHhjLDAwLDIuRE4wKzguSU1NODpEMTo6OmFzbAorImFzbCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y4QzAwMCAoKTsgKi8KKyAgaW50IG4sIHo7CisKKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA8PD0gSU1NODsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKK30KKworCisvLyAwMTAxIDAxRG47IGFsczIgRG4KKzQuMHg1LDAxLDIuRE4wOlMwOjo6YXNsMgorImFzbDIiCisqbW4xMDMwMAoreworICAvKiBPUF81NCAoKTsgKi8KKyAgaW50IG4sIHo7CisgIFBDID0gY2lhOworCisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA8PD0gMjsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKK30KKworCisvLyAxMTExIDAwMTAgMTAwMCAwMURuOyByb3IgRG4KKzguMHhmMis0LjB4OCwwMSwyLkROMDpEMDo6OnJvcgorInJvciIKKyptbjEwMzAwCit7CisgIC8qIE9QX0YyODQgKCk7ICovCisgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisgIGludCBjLG4sejsKKworICBQQyA9IGNpYTsKKyAgdmFsdWUgPSBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF07CisgIGMgPSAodmFsdWUgJiAweDEpOworCisgIHZhbHVlID4+PSAxOworICB2YWx1ZSB8PSAoKFBTVyAmIFBTV19DKSAhPSAwKSA/IDB4ODAwMDAwMDAgOiAwOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSB2YWx1ZTsKKyAgeiA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkgfCAoYyA/IFBTV19DIDogMCkpOworfQorCisKKy8vIDExMTEgMDAxMCAxMDAwIDAwRG47IHJvbCBEbgorOC4weGYyKzQuMHg4LDAwLDIuRE4wOkQwOjo6cm9sCisicm9sIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjI4MCAoKTsgKi8KKyAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKKyAgaW50IGMsbix6OworCisgIFBDID0gY2lhOworICB2YWx1ZSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXTsKKyAgYyA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApID8gMSA6IDA7CisKKyAgdmFsdWUgPDw9IDE7CisgIHZhbHVlIHw9ICgoUFNXICYgUFNXX0MpICE9IDApOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSB2YWx1ZTsKKyAgeiA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkgfCAoYyA/IFBTV19DIDogMCkpOworfQorCisKKy8vIDExMDAgMTAwMCBkOC4uLi4uLjsgYmVxIChkOCxQQykgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCis4LjB4YzgrOC5EODpTMTo6OmJlcQorImJlcSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0M4MDAgKCk7ICovCisgIFBDID0gY2lhOworICBpZiAoKFBTVyAmIFBTV19aKSkKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gRVhURU5EOCAoRDgpOworICAgICAgbmlhID0gUEM7CisgICAgfQorfQorCisKKy8vIDExMDAgMTAwMSBkOC4uLi4uLjsgYm5lIChkOCxQQykgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCis4LjB4YzkrOC5EODpTMTo6OmJuZQorImJuZSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0M5MDAgKCk7ICovCisgIFBDID0gY2lhOworICBpZiAoIShQU1cgJiBQU1dfWikpCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfUENdICs9IEVYVEVORDggKEQ4KTsKKyAgICAgIG5pYSA9IFBDOworICAgIH0KK30KKworCisvLyAxMTAwIDAwMDEgZDguLi4uLi47IGJndCAoZDgsUEMpIChkOCBpcyBzaWduLWV4dGVuZGVkKQorOC4weGMxKzguRDg6UzE6OjpiZ3QKKyJiZ3QiCisqbW4xMDMwMAoreworICAvKiBPUF9DMTAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgaWYgKCEoKFBTVyAmIFBTV19aKQorICAgICAgICB8fCAoKChQU1cgJiBQU1dfTikgIT0gMCkgXiAoKFBTVyAmIFBTV19WKSAhPSAwKSkpKQorICAgIHsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBFWFRFTkQ4IChEOCk7CisgICAgICBuaWEgPSBQQzsKKyAgICB9Cit9CisKKworLy8gMTEwMCAwMDEwIGQ4Li4uLi4uOyBiZ2UgKGQ4LFBDKSAoZDggaXMgc2lnbi1leHRlbmRlZCkKKzguMHhjMis4LkQ4OlMxOjo6YmdlCisiYmdlIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfQzIwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGlmICghKCgoUFNXICYgUFNXX04pICE9IDApIF4gKChQU1cgJiBQU1dfVikgIT0gMCkpKQorICAgIHsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBFWFRFTkQ4IChEOCk7CisgICAgICBuaWEgPSBQQzsKKyAgICB9Cit9CisKKworLy8gMTEwMCAwMDExIGQ4Li4uLi4uOyBibGUgKGQ4LFBDKSAoZDggaXMgc2lnbi1leHRlbmRlZCkKKzguMHhjMys4LkQ4OlMxOjo6YmxlCisiYmxlIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfQzMwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGlmICgoUFNXICYgUFNXX1opCisgICAgICB8fCAoKChQU1cgJiBQU1dfTikgIT0gMCkgXiAoKFBTVyAmIFBTV19WKSAhPSAwKSkpCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfUENdICs9IEVYVEVORDggKEQ4KTsKKyAgICAgIG5pYSA9IFBDOworICAgIH0KK30KKworCisvLyAxMTAwIDAwMDAgZDguLi4uLi47IGJsdCAoZDgsUEMpIChkOCBpcyBzaWduLWV4dGVuZGVkKQorOC4weGMwKzguRDg6UzE6OjpibHQKKyJibHQiCisqbW4xMDMwMAoreworICAvKiBPUF9DMDAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgaWYgKCgoUFNXICYgUFNXX04pICE9IDApIF4gKChQU1cgJiBQU1dfVikgIT0gMCkpCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfUENdICs9IEVYVEVORDggKEQ4KTsKKyAgICAgIG5pYSA9IFBDOworICAgIH0KK30KKworCisvLyAxMTAwIDAxMDEgZDguLi4uLi47IGJoaSAoZDgsUEMpIChkOCBpcyBzaWduLWV4dGVuZGVkKQorOC4weGM1KzguRDg6UzE6OjpiaGkKKyJiaGkiCisqbW4xMDMwMAoreworICAvKiBPUF9DNTAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgaWYgKCEoKChQU1cgJiBQU1dfQykgIT0gMCkgfHwgKFBTVyAmIFBTV19aKSAhPSAwKSkKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gRVhURU5EOCAoRDgpOworICAgICAgbmlhID0gUEM7CisgICAgfQorfQorCisKKy8vIDExMDAgMDExMCBkOC4uLi4uLjsgYmNjIChkOCxQQykgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCis4LjB4YzYrOC5EODpTMTo6OmJjYworImJjYyIKKyptbjEwMzAwCit7CisgIC8qIE9QX0M2MDAgKCk7ICovCisgIFBDID0gY2lhOworICBpZiAoIShQU1cgJiBQU1dfQykpCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfUENdICs9IEVYVEVORDggKEQ4KTsKKyAgICAgIG5pYSA9IFBDOworICAgIH0KK30KKworCisvLyAxMTAwIDAxMDEgZDguLi4uLi47IGJscyAoZDgsUEMpIChkOCBpcyBzaWduLWV4dGVuZGVkKQorOC4weGM3KzguRDg6UzE6OjpibHMKKyJibHMiCisqbW4xMDMwMAoreworICAvKiBPUF9DNzAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgaWYgKCgoUFNXICYgUFNXX0MpICE9IDApIHx8IChQU1cgJiBQU1dfWikgIT0gMCkKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gRVhURU5EOCAoRDgpOworICAgICAgbmlhID0gUEM7CisgICAgfQorfQorCisKKy8vIDExMDAgMDEwMCBkOC4uLi4uLjsgYmNzIChkOCxQQykgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCis4LjB4YzQrOC5EODpTMTo6OmJjcworImJjcyIKKyptbjEwMzAwCit7CisgIC8qIE9QX0M0MDAgKCk7ICovCisgIFBDID0gY2lhOworICBpZiAoUFNXICYgUFNXX0MpCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfUENdICs9IEVYVEVORDggKEQ4KTsKKyAgICAgIG5pYSA9IFBDOworICAgIH0KK30KKworCisvLyAxMTExIDEwMDAgMTExMCAxMDAwIGQ4Li4uLi4uOyBidmMgKGQ4LFBDKSAoZDggaXMgc2lnbi1leHRlbmRlZCkKKzguMHhmOCs4LjB4ZTgrOC5EODpEMTo6OmJ2YworImJ2YyIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y4RTgwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGlmICghKFBTVyAmIFBTV19WKSkKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gRVhURU5EOCAoRDgpOworICAgICAgbmlhID0gUEM7CisgICAgfQorfQorCisKKy8vIDExMTEgMTAwMCAxMTEwIDEwMDEgZDguLi4uLi47IGJ2cyAoZDgsUEMpIChkOCBpcyBzaWduLWV4dGVuZGVkKQorOC4weGY4KzguMHhlOSs4LkQ4OkQxOjo6YnZzCisiYnZzIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjhFOTAwICgpOyAqLworICBQQyA9IGNpYTsKKyAgaWYgKFBTVyAmIFBTV19WKQorICAgIHsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBFWFRFTkQ4IChEOCk7CisgICAgICBuaWEgPSBQQzsKKyAgICB9Cit9CisKKworLy8gMTExMSAxMDAwIDExMTAgMTAxMCBkOC4uLi4uLjsgYm5jIChkOCxQQykgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCis4LjB4ZjgrOC4weGVhKzguRDg6RDE6OjpibmMKKyJibmMiCisqbW4xMDMwMAoreworICAvKiBPUF9GOEVBMDAgKCk7ICovCisgIFBDID0gY2lhOworICBpZiAoIShQU1cgJiBQU1dfTikpCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfUENdICs9IEVYVEVORDggKEQ4KTsKKyAgICAgIG5pYSA9IFBDOworICAgIH0KK30KKworCisvLyAxMTExIDEwMDAgMTExMCAxMDEwIGQ4Li4uLi4uOyBibnMgKGQ4LFBDKSAoZDggaXMgc2lnbi1leHRlbmRlZCkKKzguMHhmOCs4LjB4ZWIrOC5EODpEMTo6OmJucworImJucyIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y4RUIwMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGlmIChQU1cgJiBQU1dfTikKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gRVhURU5EOCAoRDgpOworICAgICAgbmlhID0gUEM7CisgICAgfQorfQorCisKKy8vIDExMDAgMTAxMCBkOC4uLi4uLjsgYnJhIChkOCxQQykgKGQ4IGlzIHNpZ24tZXh0ZW5kZWQpCis4LjB4Y2ErOC5EODpTMTo6OmJyYQorImJyYSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0NBMDAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gRVhURU5EOCAoRDgpOworICBuaWEgPSBQQzsKK30KKworCisvLyAxMTAxIDEwMDA7IGxlcQorOC4weGQ4OlMwOjo6bGVxCisibGVxIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRDggKCk7ICovCisgIFBDID0gY2lhOworICBpZiAoUFNXICYgUFNXX1opCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQ7CisgICAgICBuaWEgPSBQQzsKKyAgICB9Cit9CisKKworLy8gMTEwMSAxMDAxOyBsbmUKKzguMHhkOTpTMDo6OmxuZQorImxuZSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Q5ICgpOyAqLworICBQQyA9IGNpYTsKKyAgaWYgKCEoUFNXICYgUFNXX1opKQorICAgIHsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0OworICAgICAgbmlhID0gUEM7CisgICAgfQorfQorCisKKy8vIDExMDEgMDAwMTsgbGd0Cis4LjB4ZDE6UzA6OjpsZ3QKKyJsZ3QiCisqbW4xMDMwMAoreworICAvKiBPUF9EMSAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGlmICghKChQU1cgJiBQU1dfWikKKyAgICAgICAgfHwgKCgoUFNXICYgUFNXX04pICE9IDApIF4gKChQU1cgJiBQU1dfVikgIT0gMCkpKSkKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBTdGF0ZS5yZWdzW1JFR19MQVJdIC0gNDsKKyAgICAgIG5pYSA9IFBDOworICAgIH0KK30KKworCisvLyAxMTAxIDAwMTA7IGxnZQorOC4weGQyOlMwOjo6bGdlCisibGdlIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRDIgKCk7ICovCisgIFBDID0gY2lhOworICBpZiAoISgoKFBTVyAmIFBTV19OKSAhPSAwKSBeICgoUFNXICYgUFNXX1YpICE9IDApKSkKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBTdGF0ZS5yZWdzW1JFR19MQVJdIC0gNDsKKyAgICAgIG5pYSA9IFBDOworICAgIH0KK30KKworCisvLyAxMTAxIDAwMTE7IGxsZQorOC4weGQzOlMwOjo6bGxlCisibGxlIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRDMgKCk7ICovCisgIFBDID0gY2lhOworICBpZiAoKFBTVyAmIFBTV19aKQorICAgICAgfHwgKCgoUFNXICYgUFNXX04pICE9IDApIF4gKChQU1cgJiBQU1dfVikgIT0gMCkpKQorICAgIHsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0OworICAgICAgbmlhID0gUEM7CisgICAgfQorfQorCisKKy8vIDExMDEgMDAwMDsgbGx0Cis4LjB4ZDA6UzA6OjpsbHQKKyJsbHQiCisqbW4xMDMwMAoreworICAvKiBPUF9EMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGlmICgoKFBTVyAmIFBTV19OKSAhPSAwKSBeICgoUFNXICYgUFNXX1YpICE9IDApKQorICAgIHsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0OworICAgICAgbmlhID0gUEM7CisgICAgfQorfQorCisKKy8vIDExMDEgMDEwMTsgbGhpCis4LjB4ZDU6UzA6OjpsaGkKKyJsaGkiCisqbW4xMDMwMAoreworICAvKiBPUF9ENSAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGlmICghKCgoUFNXICYgUFNXX0MpICE9IDApIHx8IChQU1cgJiBQU1dfWikgIT0gMCkpCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQ7CisgICAgICBuaWEgPSBQQzsKKyAgICB9Cit9CisKKworLy8gMTEwMSAwMTEwOyBsY2MKKzguMHhkNjpTMDo6OmxjYworImxjYyIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Q2ICgpOyAqLworICBQQyA9IGNpYTsKKyAgaWYgKCEoUFNXICYgUFNXX0MpKQorICAgIHsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0OworICAgICAgbmlhID0gUEM7CisgICAgfQorfQorCisKKy8vIDExMDEgMDExMTsgbGxzCis4LjB4ZDc6UzA6OjpsbHMKKyJsbHMiCisqbW4xMDMwMAoreworICAvKiBPUF9ENyAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGlmICgoKFBTVyAmIFBTV19DKSAhPSAwKSB8fCAoUFNXICYgUFNXX1opICE9IDApCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQ7CisgICAgICBuaWEgPSBQQzsKKyAgICB9Cit9CisKKworLy8gMTEwMSAwMTAwOyBsY3MKKzguMHhkNDpTMDo6OmxjcworImxjcyIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Q0ICgpOyAqLworICBQQyA9IGNpYTsKKyAgaWYgKFBTVyAmIFBTV19DKQorICAgIHsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0OworICAgICAgbmlhID0gUEM7CisgICAgfQorfQorCisKKy8vIDExMDEgMTAxMDsgbHJhCis4LjB4ZGE6UzA6OjpscmEKKyJscmEiCisqbW4xMDMwMAoreworICAvKiBPUF9EQSAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0OworICBuaWEgPSBQQzsKK30KKworCisvLyAxMTAxIDEwMTA7IHNldGxiCis4LjB4ZGI6UzA6OjpzZXRsYgorInNldGxiIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfREIgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19MSVJdID0gbG9hZF93b3JkIChTdGF0ZS5yZWdzW1JFR19QQ10gKyAxKTsKKyAgU3RhdGUucmVnc1tSRUdfTEFSXSA9IFN0YXRlLnJlZ3NbUkVHX1BDXSArIDU7Cit9CisKKworLy8gMTExMSAwMDAwIDExMTEgMDFBbjsgam1wIChBbikKKzguMHhmMCs0LjB4ZiwwMSwyLkFOMDpEMDo6OmptcAorImptcCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0YwRjQgKCk7ICovCisgIFBDID0gU3RhdGUucmVnc1tSRUdfQTAgKyBBTjBdOworICBuaWEgPSBQQzsKK30KKworCisvLyAxMTAwIDExMDAgZDE2Li4uLi47IGptcCAoZDE2LFBDKSAoZDE2IGlzIHNpZ24tZXh0ZW5kZWQuKQorOC4weGNjKzguRDE2QSs4LkQxNkI6UzI6OjpqbXAKKyJqbXAiCisqbW4xMDMwMAoreworICAvKiBPUF9DQzAwMDAgKCk7ICovCisgIFBDID0gY2lhICsgRVhURU5EMTYoRkVUQ0gxNihEMTZBLCBEMTZCKSk7CisgIG5pYSA9IFBDOworfQorCisKKy8vIDExMDEgMTEwMCBkMzIuLi4uLi4uLjsgam1wIChkMzIsIFBDKQorOC4weGRjKzguRDMyQSs4LkQzMkIrOC5EMzJDKzguRDMyRDpTNDo6OmptcAorImptcCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0RDMDAwMDAwICgpOyAqLworICBQQyA9IGNpYSArIEZFVENIMzIoRDMyQSwgRDMyQiwgRDMyQywgRDMyRCk7CisgIG5pYSA9IFBDOworfQorCisKKy8vIDExMTEgMDAwMCAxMTExIDAwQW47IGNhbGxzIChBbikKKzguMHhmMCs0LjB4ZiwwMCwyLkFOMDpEMDo6OmNhbGxzCisiY2FsbHMiCisqbW4xMDMwMAoreworICAvKiBPUF9GMEYwICgpOyAqLworICB1bnNpZ25lZCBpbnQgbmV4dF9wYywgc3A7CisKKyAgUEMgPSBjaWE7CisgIHNwID0gU3RhdGUucmVnc1tSRUdfU1BdOworICBuZXh0X3BjID0gU3RhdGUucmVnc1tSRUdfUENdICsgMjsKKyAgc3RvcmVfd29yZChzcCwgbmV4dF9wYyk7CisgIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSBuZXh0X3BjOworICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBTdGF0ZS5yZWdzW1JFR19BMCArIEFOMF07CisgIG5pYSA9IFBDOworfQorCisKKy8vIDExMTEgMTAxMCAxMTExIDExMTEgZDE2Li4uLi47IGNhbGxzIChkMTYsUEMpIChkMTYgaXMgc2lnbi1leHRlbmRlZC4pCis4LjB4ZmErOC4weGZmKzguRDE2QSs4LkQxNkI6RDI6OjpjYWxscworImNhbGxzIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkFGRjAwMDAgKCk7ICovCisgIHVuc2lnbmVkIGludCBuZXh0X3BjLCBzcDsKKworICBQQyA9IGNpYTsKKyAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07CisgIG5leHRfcGMgPSBTdGF0ZS5yZWdzW1JFR19QQ10gKyA0OworICBzdG9yZV93b3JkKHNwLCBuZXh0X3BjKTsKKyAgU3RhdGUucmVnc1tSRUdfTURSXSA9IG5leHRfcGM7CisgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBFWFRFTkQxNiAoRkVUQ0gxNihEMTZBLCBEMTZCKSk7CisgIG5pYSA9IFBDOworfQorCisKKy8vIDExMTEgMTEwMCAxMTExIDExMTEgZDMyLi4uLi47IGNhbGxzIChkMzIsUEMpCis4LjB4ZmMrOC4weGZmKzguRDMyQSs4LkQzMkIrOC5EMzJDKzguRDMyRDpENDo6OmNhbGxzCisiY2FsbHMiCisqbW4xMDMwMAoreworICAvKiBPUF9GQ0ZGMDAwMCAoKTsgKi8KKyAgdW5zaWduZWQgaW50IG5leHRfcGMsIHNwOworCisgIFBDID0gY2lhOworICBzcCA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKKyAgbmV4dF9wYyA9IFN0YXRlLnJlZ3NbUkVHX1BDXSArIDY7CisgIHN0b3JlX3dvcmQoc3AsIG5leHRfcGMpOworICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gbmV4dF9wYzsKKyAgU3RhdGUucmVnc1tSRUdfUENdICs9IEZFVENIMzIoRDMyQSwgRDMyQiwgRDMyQywgRDMyRCk7CisgIG5pYSA9IFBDOworfQorCisKKy8vIDExMTEgMDAwMCAxMTExIDExMDA7IHJldHMKKzguMHhmMCs4LjB4ZmM6RDA6OjpyZXRzCisicmV0cyIKKyptbjEwMzAwCit7CisgIC8qIE9QX0YwRkMgKCk7ICovCisgIHVuc2lnbmVkIGludCBzcDsKKworICBzcCA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKKyAgU3RhdGUucmVnc1tSRUdfUENdID0gbG9hZF93b3JkKHNwKTsKKyAgbmlhID0gUEM7Cit9CisKKworLy8gMTExMSAwMDAwIDExMTEgMTEwMTsgcnRpCis4LjB4ZjArOC4weGZkOkQwOjo6cnRpCisicnRpIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjBGRCAoKTsgKi8KKyAgdW5zaWduZWQgaW50IHNwOworCisgIHNwID0gU3RhdGUucmVnc1tSRUdfU1BdOworICBQU1cgPSBsb2FkX2hhbGYoc3ApOworICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBsb2FkX3dvcmQoc3ArNCk7CisgIFN0YXRlLnJlZ3NbUkVHX1NQXSArPTg7CisgIG5pYSA9IFBDOworfQorCisKKy8vIDExMTEgMDAwMCAxMTExIDExMTA7IHRyYXAKKzguMHhmMCs4LjB4ZmU6RDA6Ojp0cmFwCisidHJhcCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0YwRkUgKCk7ICovCisgIHVuc2lnbmVkIGludCBzcCwgbmV4dF9wYzsKKworICBQQyA9IGNpYTsKKyAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07CisgIG5leHRfcGMgPSBTdGF0ZS5yZWdzW1JFR19QQ10gKyAyOworICBzdG9yZV93b3JkKHNwLCBuZXh0X3BjKTsKKyAgbmlhID0gUEM7Cit9CisKKworLy8gMTExMSAwMDAwIDExMTEgMTExMTsgcnRtCis4LjB4ZjArOC4weGZmOkQwOjo6cnRtCisicnRtIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjBGRiAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGFib3J0ICgpOworfQorCisKKy8vIDExMDAgMTAxMTsgbm9wCis4LjB4Y2I6UzA6Ojpub3AKKyJub3AiCisqbW4xMDMwMAoreworICAvKiBPUF9DQiAoKTsgKi8KKyAgUEMgPSBjaWE7Cit9CisKKworLy8gMTExMSAwMTAxIDAwMDAgIERtRG47IHVkZjIwIERtLERuCis4LjB4ZjUrNC4weDAsMi5ETTEsMi5ETjA6RDA6OjpwdXR4CisicHV0eCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y1MDAgKCk7ICovCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19NRFJRXSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXTsKK30KKworCisvLyAxMTExIDAxMTAgMTExMSBEbURuOyB1ZGYxNSBEbSxEbgorOC4weGY2KzQuMHhmLDIuRE0xLDIuRE4wOkQwOjo6Z2V0eAorImdldHgiCisqbW4xMDMwMAoreworICAvKiBPUF9GNkYwICgpOyAqLworICBpbnQgeiwgbjsKKworICBQQyA9IGNpYTsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19NRFJRXSA9PSAwKTsKKyAgbiA9ICgoU3RhdGUucmVnc1tSRUdfTURSUV0gJiAweDgwMDAwMDAwKSAhPSAwKTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gU3RhdGUucmVnc1tSRUdfTURSUV07CisKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApOworfQorCisKKy8vIDExMTEgMDExMCAwMDAwIERtRG47IHVkZjAwIERtLERuCis4LjB4ZjYrNC4weDAsMi5ETTEsMi5ETjA6RDA6OjptdWxxCisibXVscSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y2MDAgKCk7ICovCisgIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZW1wOworICBpbnQgbiwgejsKKworICBQQyA9IGNpYTsKKyAgdGVtcCA9ICgoc2lnbmVkNjQpKHNpZ25lZDMyKVN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXQorICAgICAgICAgICogIChzaWduZWQ2NCkoc2lnbmVkMzIpU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdKTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gdGVtcCAmIDB4ZmZmZmZmZmY7CisgIFN0YXRlLnJlZ3NbUkVHX01EUlFdID0gKHRlbXAgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkgPj4gMzI7OworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJiAweDgwMDAwMDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKK30KKworCisvLyAxMTExIDEwMDEgMDAwMCAwMERuIGltbTguLi4uOyB1ZGYwMCBpbW04LERuIChpbW04IGlzIHNpZ24tZXh0ZW5kZWQuKQorOC4weGY5KzQuMHgsMDAsMi5ETjArOC5JTU04OkQxOjo6bXVscQorIm11bHEiCisqbW4xMDMwMAoreworICAvKiBPUF9GOTAwMDAgKCk7ICovCisgIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZW1wOworICBpbnQgbiwgejsKKworICBQQyA9IGNpYTsKKyAgdGVtcCA9ICgoc2lnbmVkNjQpKHNpZ25lZDMyKVN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXQorICAgICAgICAgICogKHNpZ25lZDY0KShzaWduZWQzMilFWFRFTkQ4IChJTU04KSk7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IHRlbXAgJiAweGZmZmZmZmZmOworICBTdGF0ZS5yZWdzW1JFR19NRFJRXSA9ICh0ZW1wICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpID4+IDMyOzsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Cit9CisKKworLy8gMTExMSAxMDExIDAwMDAgMDBEbiBpbW0xNi4uLjsgdWRmMDAgaW1tMTYsRG4gKGltbTE2IGlzIHNpZ24tZXh0ZW5kZWQuKQorOC4weGZiKzQuMHgwLDAwLDIuRE4wKzguSU1NMTZBKzguSU1NMTZCOkQyOjo6bXVscQorIm11bHEiCisqbW4xMDMwMAoreworICAvKiBPUF9GQjAwMDAwMCAoKTsgKi8KKyAgdW5zaWduZWQgbG9uZyBsb25nIHRlbXA7CisgIGludCBuLCB6OworCisgIFBDID0gY2lhOworICB0ZW1wID0gKChzaWduZWQ2NCkoc2lnbmVkMzIpU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdCisgICAgICAgICAgKiAoc2lnbmVkNjQpKHNpZ25lZDMyKUVYVEVORDE2IChGRVRDSDE2KElNTTE2QSwgSU1NMTZCKSkpOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSB0ZW1wICYgMHhmZmZmZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfTURSUV0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjs7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOworfQorCisKKy8vIDExMTEgMTEwMSAwMDAwIDAwRG4gaW1tMzIuLi47IHVkZjAwIGltbTMyLERuCis4LjB4ZmQrNC4weDAsMDAsMi5ETjArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDQ6OjptdWxxCisibXVscSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZEMDAwMDAwICgpOyAqLworICB1bnNpZ25lZCBsb25nIGxvbmcgdGVtcDsKKyAgaW50IG4sIHo7CisKKyAgUEMgPSBjaWE7CisgIHRlbXAgPSAoKHNpZ25lZDY0KShzaWduZWQzMilTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KKyAgICAgICAgICAqIChzaWduZWQ2NCkoc2lnbmVkMzIpKEZFVENIMzIoSU1NMzJBLCBJTU0zMkIsIElNTTMyQywgSU1NMzJEKSkpOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSB0ZW1wICYgMHhmZmZmZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfTURSUV0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjs7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOworfQorCisKKy8vIDExMTEgMDExMCAwMDAxIERtRG47IHVkZjAxIERtLERuCis4LjB4ZjYrNC4weDEsMi5ETTEsMi5ETjA6RDA6OjptdWxxdQorIm11bHF1IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjYxMCAoKTsgKi8KKyAgdW5zaWduZWQgbG9uZyBsb25nIHRlbXA7CisgIGludCBuLCB6OworCisgIFBDID0gY2lhOworICB0ZW1wID0gKCh1bnNpZ25lZDY0KSBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KKwkgICogKHVuc2lnbmVkNjQpIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE0xXSk7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IHRlbXAgJiAweGZmZmZmZmZmOworICBTdGF0ZS5yZWdzW1JFR19NRFJRXSA9ICh0ZW1wICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpID4+IDMyOzsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Cit9CisKKworLy8gMTExMSAxMDAxIDAwMDEgMDFEbiBpbW04Li4uLjsgdWRmdTAxIGltbTgsRG4gKGltbTggaXMgemVyby1leHRlbmRlZC4pCis4LjB4ZjkrNC4weDEsMDEsMi5ETjArOC5JTU04OkQxOjo6bXVscXUKKyJtdWxxdSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y5MTQwMCAoKTsgKi8KKyAgdW5zaWduZWQgbG9uZyBsb25nIHRlbXA7CisgIGludCBuLCB6OworCisgIFBDID0gY2lhOworICB0ZW1wID0gKCh1bnNpZ25lZDY0KVN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXQorCSAgKiAodW5zaWduZWQ2NClFWFRFTkQ4IChJTU04KSk7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IHRlbXAgJiAweGZmZmZmZmZmOworICBTdGF0ZS5yZWdzW1JFR19NRFJRXSA9ICh0ZW1wICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpID4+IDMyOzsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Cit9CisKKworLy8gMTExMSAxMDExIDAwMDEgMDFEbiBpbW0xNi4uLjsgdWRmdTAxIGltbTE2LERuIChpbW0xNiBpcyB6ZXJvLWV4dGVuZGVkLikKKzguMHhmYis0LjB4MSwwMSwyLkROMCs4LklNTTE2QSs4LklNTTE2QjpEMjo6Om11bHF1CisibXVscXUiCisqbW4xMDMwMAoreworICAvKiBPUF9GQjE0MDAwMCAoKTsgKi8KKyAgdW5zaWduZWQgbG9uZyBsb25nIHRlbXA7CisgIGludCBuLCB6OworCisgIFBDID0gY2lhOworICB0ZW1wID0gKCh1bnNpZ25lZDY0KVN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXQorCSAgKiAodW5zaWduZWQ2NCkgRVhURU5EMTYgKEZFVENIMTYoSU1NMTZBLCBJTU0xNkIpKSk7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9IHRlbXAgJiAweGZmZmZmZmZmOworICBTdGF0ZS5yZWdzW1JFR19NRFJRXSA9ICh0ZW1wICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpID4+IDMyOzsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPT0gMCk7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Cit9CisKKworLy8gMTExMSAxMTAxIDAwMDEgMDFEbiBpbW0zMi4uLjsgdWRmdTAxIGltbTMyLERuCis4LjB4ZmQrNC4weDEsMDEsMi5ETjArOC5JTU0zMkErOC5JTU0zMkIrOC5JTU0zMkMrOC5JTU0zMkQ6RDQ6OjptdWxxdQorIm11bHF1IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRkQxNDAwMDAgKCk7ICovCisgIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZW1wOworICBpbnQgbiwgejsKKworICBQQyA9IGNpYTsKKyAgdGVtcCA9ICgodW5zaWduZWQ2NClTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0KKyAgICAgICAgICAqICh1bnNpZ25lZDY0KShGRVRDSDMyKElNTTMyQSwgSU1NMzJCLCBJTU0zMkMsIElNTTMyRCkpKTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gdGVtcCAmIDB4ZmZmZmZmZmY7CisgIFN0YXRlLnJlZ3NbUkVHX01EUlFdID0gKHRlbXAgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkgPj4gMzI7OworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgRE4wXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gJiAweDgwMDAwMDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKK30KKworCisvLyAxMTExIDAxMTAgMDEwMCBEbURuOyB1ZGYwNCBEbSxEbgorOC4weGY2KzQuMHg0LDIuRE0xLDIuRE4wOkQwOjo6c2F0MTYKKyJzYXQxNiIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y2NDAgKCk7ICovCisgIGludCB0ZW1wOworCisgIFBDID0gY2lhOworICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdOworICB0ZW1wID0gKHRlbXAgPiAweDdmZmYgPyAweDdmZmYgOiB0ZW1wKTsKKyAgdGVtcCA9ICh0ZW1wIDwgLTB4ODAwMCA/IC0weDgwMDAgOiB0ZW1wKTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdID0gdGVtcDsKK30KKworCisvLyAxMTExIDAxMTAgMDEwMSBEbURuOyB1ZGYwNSBEbSxEbgorOC4weGY2KzQuMHg1LDIuRE0xLDIuRE4wOkQwOjo6c2F0MjQKKyJzYXQyNCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y2NTAgKCk7ICovCisgIGludCB0ZW1wOworCisgIFBDID0gY2lhOworICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdOworICB0ZW1wID0gKHRlbXAgPiAweDdmZmZmZiA/IDB4N2ZmZmZmIDogdGVtcCk7CisgIHRlbXAgPSAodGVtcCA8IC0weDgwMDAwMCA/IC0weDgwMDAwMCA6IHRlbXApOworICBTdGF0ZS5yZWdzW1JFR19EMCArIEROMF0gPSB0ZW1wOworfQorCisKKy8vIDExMTEgMDExMCAwMTExIERtRG47IHVkZjA3IERtLERuCis4LjB4ZjYrNC4weDcsMi5ETTEsMi5ETjA6RDA6Ojpic2NoCisiYnNjaCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0Y2NzAgKCk7ICovCisgIGludCB0ZW1wLCBjOworCisgIFBDID0gY2lhOworICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBETTFdOworICB0ZW1wIDw8PSAoU3RhdGUucmVnc1tSRUdfRDAgKyBETjBdICYgMHgxZik7CisgIGMgPSAodGVtcCAhPSAwID8gMSA6IDApOworICBQU1cgJj0gfihQU1dfQyk7CisgIFBTVyB8PSAoYyA/IFBTV19DIDogMCk7Cit9CisKKworLy8gMTExMSAwMDAwIDExMDAgMDAwMDsgc3lzY2FsbAorOC4weGYwKzguMHhjMDpEMDo6OnN5c2NhbGwKKyJzeXNjYWxsIgorKm1uMTAzMDAKK3sKKyAgLyogT1BfRjBDMCAoKTsgKi8KKyAgUEMgPSBjaWE7CisgIGRvX3N5c2NhbGwgKCk7Cit9CisKKworLy8gMTExMSAxMTExOyBicmVhaworOC4weGZmOlMwOjo6YnJlYWsKKyJicmVhayIKKyptbjEwMzAwCit7CisgIC8qIE9QX0ZGICgpOyAqLworICBQQyA9IGNpYTsKKyAgcHJvZ3JhbV9pbnRlcnJ1cHQoU0QsIENQVSwgY2lhLCBTSU1fU0lHVFJBUCk7Cit9CisKKy8vIDExMDAgMTExMCByZWdzLi4uLjsgbW92bSAoU1ApLHJlZ3MKKzguMHhjZSs4LlJFR1M6UzE6Ojptb3ZtCisibW92bSIKKyptbjEwMzAwCit7CisgIC8qIE9QX0NFMDAgKCk7ICovCisgIHVuc2lnbmVkIGxvbmcgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07CisgIHVuc2lnbmVkIGxvbmcgbWFzazsKKworICBQQyA9IGNpYTsKKyAgbWFzayA9IFJFR1M7CisKKyAgaWYgKG1hc2sgJiAweDgpCisgICAgeworICAgICAgc3AgKz0gNDsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0xBUl0gPSBsb2FkX3dvcmQgKHNwKTsKKyAgICAgIHNwICs9IDQ7CisgICAgICBTdGF0ZS5yZWdzW1JFR19MSVJdID0gbG9hZF93b3JkIChzcCk7CisgICAgICBzcCArPSA0OworICAgICAgU3RhdGUucmVnc1tSRUdfTURSXSA9IGxvYWRfd29yZCAoc3ApOworICAgICAgc3AgKz0gNDsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgMV0gPSBsb2FkX3dvcmQgKHNwKTsKKyAgICAgIHNwICs9IDQ7CisgICAgICBTdGF0ZS5yZWdzW1JFR19BMF0gPSBsb2FkX3dvcmQgKHNwKTsKKyAgICAgIHNwICs9IDQ7CisgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIDFdID0gbG9hZF93b3JkIChzcCk7CisgICAgICBzcCArPSA0OworICAgICAgU3RhdGUucmVnc1tSRUdfRDBdID0gbG9hZF93b3JkIChzcCk7CisgICAgICBzcCArPSA0OworICAgIH0KKworICBpZiAobWFzayAmIDB4MTApCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyAzXSA9IGxvYWRfd29yZCAoc3ApOworICAgICAgc3AgKz0gNDsKKyAgICB9CisKKyAgaWYgKG1hc2sgJiAweDIwKQorICAgIHsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgMl0gPSBsb2FkX3dvcmQgKHNwKTsKKyAgICAgIHNwICs9IDQ7CisgICAgfQorCisgIGlmIChtYXNrICYgMHg0MCkKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIDNdID0gbG9hZF93b3JkIChzcCk7CisgICAgICBzcCArPSA0OworICAgIH0KKworICBpZiAobWFzayAmIDB4ODApCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyAyXSA9IGxvYWRfd29yZCAoc3ApOworICAgICAgc3AgKz0gNDsKKyAgICB9CisKKworICAvKiBBbmQgbWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGUgc3RhY2sgcG9pbnRlci4gICovCisgIFN0YXRlLnJlZ3NbUkVHX1NQXSA9IHNwOworfQorCisKKy8vIDExMDAgMTExMSByZWdzLi4uLjsgbW92bSByZWdzLChTUCkKKzguMHhjZis4LlJFR1M6UzFhOjo6bW92bQorIm1vdm0iCisqbW4xMDMwMAoreworICAvKiBPUF9DRjAwICgpOyAqLworICB1bnNpZ25lZCBsb25nIHNwID0gU3RhdGUucmVnc1tSRUdfU1BdOworICB1bnNpZ25lZCBsb25nIG1hc2s7CisKKyAgUEMgPSBjaWE7CisgIG1hc2sgPSBSRUdTOworCisKKyAgaWYgKG1hc2sgJiAweDgwKQorICAgIHsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAyXSk7CisgICAgfQorCisgIGlmIChtYXNrICYgMHg0MCkKKyAgICB7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0QwICsgM10pOworICAgIH0KKworICBpZiAobWFzayAmIDB4MjApCisgICAgeworICAgICAgc3AgLT0gNDsKKyAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19BMCArIDJdKTsKKyAgICB9CisKKyAgaWYgKG1hc2sgJiAweDEwKQorICAgIHsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfQTAgKyAzXSk7CisgICAgfQorCisgIGlmIChtYXNrICYgMHg4KQorICAgIHsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDBdKTsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAxXSk7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwXSk7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwICsgMV0pOworICAgICAgc3AgLT0gNDsKKyAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19NRFJdKTsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfTElSXSk7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0xBUl0pOworICAgICAgc3AgLT0gNDsKKyAgICB9CisKKyAgLyogQW5kIG1ha2Ugc3VyZSB0byB1cGRhdGUgdGhlIHN0YWNrIHBvaW50ZXIuICAqLworICBTdGF0ZS5yZWdzW1JFR19TUF0gPSBzcDsKK30KKworLy8gMTEwMCAxMTAxIGQxNi4uLi4uIHJlZ3MuLi4uIGltbTguLi4uOworLy8gY2FsbCAoZDE2LFBDKSxyZWdzLGltbTggKGQxNiBpcyBzaWduLWV4dGVuZGVkLiwgaW1tOCBpcyB6ZXJvLWV4dGVuZGVkLikKKzguMHhjZCs4LkQxNkErOC5EMTZCKzguUkVHUys4LklNTTg6UzQ6OjpjYWxsCisiY2FsbCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0NEMDAwMDAwICgpOyAqLworICB1bnNpZ25lZCBpbnQgbmV4dF9wYywgc3A7CisgIHVuc2lnbmVkIGxvbmcgbWFzazsKKworICBQQyA9IGNpYTsKKyAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07CisgIG5leHRfcGMgPSBQQyArIDU7CisgIHN0b3JlX3dvcmQoc3AsIG5leHRfcGMpOworCisgIG1hc2sgPSBSRUdTOworCisKKyAgaWYgKG1hc2sgJiAweDgwKQorICAgIHsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAyXSk7CisgICAgfQorCisgIGlmIChtYXNrICYgMHg0MCkKKyAgICB7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0QwICsgM10pOworICAgIH0KKworICBpZiAobWFzayAmIDB4MjApCisgICAgeworICAgICAgc3AgLT0gNDsKKyAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19BMCArIDJdKTsKKyAgICB9CisKKyAgaWYgKG1hc2sgJiAweDEwKQorICAgIHsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfQTAgKyAzXSk7CisgICAgfQorCisgIGlmIChtYXNrICYgMHg4KQorICAgIHsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDBdKTsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAxXSk7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwXSk7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwICsgMV0pOworICAgICAgc3AgLT0gNDsKKyAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19NRFJdKTsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfTElSXSk7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0xBUl0pOworICAgICAgc3AgLT0gNDsKKyAgICB9CisKKyAgLyogVXBkYXRlIHRoZSBzdGFjayBwb2ludGVyLCBub3RlIHRoYXQgdGhlIHJlZ2lzdGVyIHNhdmVzIHRvIGRvIG5vdAorICAgICBtb2RpZnkgU1AuICBUaGUgU1AgYWRqdXN0bWVudCBpcyBkZXJpdmVkIHRvdGFsbHkgZnJvbSB0aGUgaW1tOAorICAgICBmaWVsZC4gICovCisgIFN0YXRlLnJlZ3NbUkVHX1NQXSAtPSBJTU04OworICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gbmV4dF9wYzsKKyAgU3RhdGUucmVnc1tSRUdfUENdICs9IEVYVEVORDE2IChGRVRDSDE2KEQxNkEsIEQxNkIpKTsKKyAgbmlhID0gUEM7Cit9CisKKworLy8gMTEwMSAxMTAxIGQzMi4uLi4uIHJlZ3MuLi4uIGltbTguLi4uOworLy8gY2FsbCAoZDMyLFBDKSxyZWdzLGltbTggKGltbTggaXMgemVyby1leHRlbmRlZC4pCis4LjB4ZGQrOC5EMzJBKzguRDMyQis4LkQzMkMrOC5EMzJEKzguUkVHUys4LklNTTg6UzY6OjpjYWxsCisiY2FsbCIKKyptbjEwMzAwCit7CisgIC8qIE9QX0REMDAwMDAwICgpOyAqLworICB1bnNpZ25lZCBpbnQgbmV4dF9wYywgc3A7CisgIHVuc2lnbmVkIGxvbmcgbWFzazsKKworICBQQyA9IGNpYTsKKyAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07CisgIG5leHRfcGMgPSBTdGF0ZS5yZWdzW1JFR19QQ10gKyA3OworICAvKiBjb3VsZCBhc3NlcnQgdGhhdCBuaWEgPT0gbmV4dF9wYyBoZXJlICovCisgIHN0b3JlX3dvcmQoc3AsIG5leHRfcGMpOworCisgIG1hc2sgPSBSRUdTOworCisKKyAgaWYgKG1hc2sgJiAweDgwKQorICAgIHsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAyXSk7CisgICAgfQorCisgIGlmIChtYXNrICYgMHg0MCkKKyAgICB7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0QwICsgM10pOworICAgIH0KKworICBpZiAobWFzayAmIDB4MjApCisgICAgeworICAgICAgc3AgLT0gNDsKKyAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19BMCArIDJdKTsKKyAgICB9CisKKyAgaWYgKG1hc2sgJiAweDEwKQorICAgIHsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfQTAgKyAzXSk7CisgICAgfQorCisgIGlmIChtYXNrICYgMHg4KQorICAgIHsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDBdKTsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAxXSk7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwXSk7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwICsgMV0pOworICAgICAgc3AgLT0gNDsKKyAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19NRFJdKTsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfTElSXSk7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0xBUl0pOworICAgICAgc3AgLT0gNDsKKyAgICB9CisKKyAgLyogVXBkYXRlIHRoZSBzdGFjayBwb2ludGVyLCBub3RlIHRoYXQgdGhlIHJlZ2lzdGVyIHNhdmVzIHRvIGRvIG5vdAorICAgICBtb2RpZnkgU1AuICBUaGUgU1AgYWRqdXN0bWVudCBpcyBkZXJpdmVkIHRvdGFsbHkgZnJvbSB0aGUgaW1tOAorICAgICBmaWVsZC4gICovCisgIFN0YXRlLnJlZ3NbUkVHX1NQXSAtPSBJTU04OworICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gbmV4dF9wYzsKKyAgU3RhdGUucmVnc1tSRUdfUENdICs9IEZFVENIMzIoRDMyQSwgRDMyQiwgRDMyQywgRDMyRCk7CisgIG5pYSA9IFBDOworfQorCisKKy8vIDExMDEgMTExMSByZWdzLi4uLiBpbW04Li4uLjsgcmV0IHJlZ3MsaW1tOCAoaW1tOCBpcyB6ZXJvLWV4dGVuZGVkLikKKzguMHhkZis4LlJFR1MrOC5JTU04OlMyOjo6cmV0CisicmV0IgorKm1uMTAzMDAKK3sKKyAgLyogT1BfREYwMDAwICgpOyAqLworICB1bnNpZ25lZCBpbnQgc3AsIG9mZnNldDsKKyAgdW5zaWduZWQgbG9uZyBtYXNrOworCisgIFBDID0gY2lhOworICBTdGF0ZS5yZWdzW1JFR19TUF0gKz0gSU1NODsKKyAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07CisKKyAgb2Zmc2V0ID0gLTQ7CisgIG1hc2sgPSBSRUdTOworCisKKyAgaWYgKG1hc2sgJiAweDgwKQorICAgIHsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgMl0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgIH0KKworICBpZiAobWFzayAmIDB4NDApCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyAzXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOworICAgICAgb2Zmc2V0IC09IDQ7CisgICAgfQorCisgIGlmIChtYXNrICYgMHgyMCkKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIDJdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7CisgICAgICBvZmZzZXQgLT0gNDsKKyAgICB9CisKKyAgaWYgKG1hc2sgJiAweDEwKQorICAgIHsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgM10gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgIH0KKworICBpZiAobWFzayAmIDB4OCkKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19EMF0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyAxXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOworICAgICAgb2Zmc2V0IC09IDQ7CisgICAgICBTdGF0ZS5yZWdzW1JFR19BMF0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyAxXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOworICAgICAgb2Zmc2V0IC09IDQ7CisgICAgICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7CisgICAgICBvZmZzZXQgLT0gNDsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0xJUl0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgICAgU3RhdGUucmVnc1tSRUdfTEFSXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOworICAgICAgb2Zmc2V0IC09IDQ7CisgICAgfQorCisgIC8qIFJlc3RvcmUgdGhlIFBDIHZhbHVlLiAgKi8KKyAgU3RhdGUucmVnc1tSRUdfUENdID0gbG9hZF93b3JkKHNwKTsKKyAgbmlhID0gUEM7Cit9CisKKworLy8gMTEwMSAxMTEwIHJlZ3MuLi4uIGltbTguLi4uOyByZXRmIHJlZ3MsaW1tOCAoaW1tOCBpcyB6ZXJvLWV4dGVuZGVkLikKKzguMHhkZSs4LlJFR1MrOC5JTU04OlMyOjo6cmV0ZgorInJldGYiCisqbW4xMDMwMAoreworICAvKiBPUF9ERTAwMDAgKCk7ICovCisgIHVuc2lnbmVkIGludCBzcCwgb2Zmc2V0OworICB1bnNpZ25lZCBsb25nIG1hc2s7CisKKyAgUEMgPSBjaWE7CisgIFN0YXRlLnJlZ3NbUkVHX1NQXSArPSBJTU04OworICBzcCA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKKyAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTURSXSAtIDM7CisKKyAgb2Zmc2V0ID0gLTQ7CisgIG1hc2sgPSBSRUdTOworCisKKyAgaWYgKG1hc2sgJiAweDgwKQorICAgIHsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgMl0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgIH0KKworICBpZiAobWFzayAmIDB4NDApCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyAzXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOworICAgICAgb2Zmc2V0IC09IDQ7CisgICAgfQorCisgIGlmIChtYXNrICYgMHgyMCkKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIDJdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7CisgICAgICBvZmZzZXQgLT0gNDsKKyAgICB9CisKKyAgaWYgKG1hc2sgJiAweDEwKQorICAgIHsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgM10gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgIH0KKworICBpZiAobWFzayAmIDB4OCkKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19EMF0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyAxXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOworICAgICAgb2Zmc2V0IC09IDQ7CisgICAgICBTdGF0ZS5yZWdzW1JFR19BMF0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyAxXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOworICAgICAgb2Zmc2V0IC09IDQ7CisgICAgICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7CisgICAgICBvZmZzZXQgLT0gNDsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0xJUl0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgICAgU3RhdGUucmVnc1tSRUdfTEFSXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOworICAgICAgb2Zmc2V0IC09IDQ7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zaW0vbW4xMDMwMC9tbjEwMzAwX3NpbS5oIGIvc2ltL21uMTAzMDAvbW4xMDMwMF9zaW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzk0ZmQwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL21uMTAzMDAvbW4xMDMwMF9zaW0uaApAQCAtMCwwICsxLDM4MyBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAib3Bjb2RlL21uMTAzMDAuaCIKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJyZW1vdGUtc2ltLmgiCisjaW5jbHVkZSAiYmZkLmgiCisKKyNpZm5kZWYgSU5MSU5FCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgSU5MSU5FIGlubGluZQorI2Vsc2UKKyNkZWZpbmUgSU5MSU5FCisjZW5kaWYKKyNlbmRpZgorCitleHRlcm4gaG9zdF9jYWxsYmFjayAqbW4xMDMwMF9jYWxsYmFjazsKK2V4dGVybiBTSU1fREVTQyBzaW11bGF0b3I7CisKKyNkZWZpbmUgREVCVUdfVFJBQ0UJCTB4MDAwMDAwMDEKKyNkZWZpbmUgREVCVUdfVkFMVUVTCQkweDAwMDAwMDAyCisKK2V4dGVybiBpbnQgbW4xMDMwMF9kZWJ1ZzsKKworI2lmIFVDSEFSX01BWCA9PSAyNTUKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50ODsKK3R5cGVkZWYgc2lnbmVkIGNoYXIgaW50ODsKKyNlbHNlCisjZXJyb3IgIkNoYXIgaXMgbm90IGFuIDgtYml0IHR5cGUiCisjZW5kaWYKKworI2lmIFNIUlRfTUFYID09IDMyNzY3Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVpbnQxNjsKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludDE2OworI2Vsc2UKKyNlcnJvciAiU2hvcnQgaXMgbm90IGEgMTYtYml0IHR5cGUiCisjZW5kaWYKKworI2lmIElOVF9NQVggPT0gMjE0NzQ4MzY0NworCit0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzI7Cit0eXBlZGVmIHNpZ25lZCBpbnQgaW50MzI7CisKKyNlbHNlCisjICBpZiBMT05HX01BWCA9PSAyMTQ3NDgzNjQ3CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50MzI7Cit0eXBlZGVmIHNpZ25lZCBsb25nIGludDMyOworCisjICBlbHNlCisjICBlcnJvciAiTmVpdGhlciBpbnQgbm9yIGxvbmcgaXMgYSAzMi1iaXQgdHlwZSIKKyMgIGVuZGlmCisjZW5kaWYKKwordHlwZWRlZiB1aW50MzIgcmVnX3Q7CisKK3N0cnVjdCBzaW1vcHMgCit7CisgIGxvbmcgb3Bjb2RlOworICBsb25nIG1hc2s7CisgIHZvaWQgKCpmdW5jKSgpOworICBpbnQgbGVuZ3RoOworICBpbnQgZm9ybWF0OworICBpbnQgbnVtb3BzOworICBpbnQgb3BlcmFuZHNbMTZdOworfTsKKworLyogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHByb2Nlc3NvcjsgcmVnaXN0ZXJzLCBtZW1vcnksIGV0Yy4gICovCisKK3N0cnVjdCBfc3RhdGUKK3sKKyAgcmVnX3QgcmVnc1szMl07CQkvKiByZWdpc3RlcnMsIGQwLWQzLCBhMC1hMywgc3AsIHBjLCBtZHIsIHBzdywKKwkJCQkgICBsaXIsIGxhciwgbWRycSwgcGx1cyBzb21lIHJvb20gZm9yIHByb2Nlc3NvcgorCQkJCSAgIHNwZWNpZmljIHJlZ3MuICAqLworICB1aW50OCAqbWVtOwkJCS8qIG1haW4gbWVtb3J5ICovCisgIGludCBleGNlcHRpb247CisgIGludCBleGl0ZWQ7CisKKyAgLyogQWxsIGludGVybmFsIHN0YXRlIG1vZGlmaWVkIGJ5IHNpZ25hbF9leGNlcHRpb24oKSB0aGF0IG1heSBuZWVkIHRvIGJlCisgICAgIHJvbGxlZCBiYWNrIGZvciBwYXNzaW5nIG1vbWVudC1vZi1leGNlcHRpb24gaW1hZ2UgYmFjayB0byBnZGIuICovCisgIHJlZ190IGV4Y190cmlnZ2VyX3JlZ3NbMzJdOworICByZWdfdCBleGNfc3VzcGVuZF9yZWdzWzMyXTsKKyAgaW50IGV4Y19zdXNwZW5kZWQ7CisKKyNkZWZpbmUgU0lNX0NQVV9FWENFUFRJT05fVFJJR0dFUihTRCxDUFUsQ0lBKSBtbjEwMzAwX2NwdV9leGNlcHRpb25fdHJpZ2dlcihTRCxDUFUsQ0lBKQorI2RlZmluZSBTSU1fQ1BVX0VYQ0VQVElPTl9TVVNQRU5EKFNELENQVSxFWEMpIG1uMTAzMDBfY3B1X2V4Y2VwdGlvbl9zdXNwZW5kKFNELENQVSxFWEMpCisjZGVmaW5lIFNJTV9DUFVfRVhDRVBUSU9OX1JFU1VNRShTRCxDUFUsRVhDKSBtbjEwMzAwX2NwdV9leGNlcHRpb25fcmVzdW1lKFNELENQVSxFWEMpCit9OworCitleHRlcm4gc3RydWN0IF9zdGF0ZSBTdGF0ZTsKK2V4dGVybiB1aW50MzIgT1BbNF07CitleHRlcm4gc3RydWN0IHNpbW9wcyBTaW1vcHNbXTsKKworI2RlZmluZSBQQwkoU3RhdGUucmVnc1tSRUdfUENdKQorI2RlZmluZSBTUAkoU3RhdGUucmVnc1tSRUdfU1BdKQorCisjZGVmaW5lIFBTVyAoU3RhdGUucmVnc1sxMV0pCisjZGVmaW5lIFBTV19aIDB4MQorI2RlZmluZSBQU1dfTiAweDIKKyNkZWZpbmUgUFNXX0MgMHg0CisjZGVmaW5lIFBTV19WIDB4OAorI2RlZmluZSBQU1dfSUUgTFNCSVQgKDExKQorI2RlZmluZSBQU1dfTE0gTFNNQVNLICgxMCwgOCkKKworI2RlZmluZSBFWFRSQUNUX1BTV19MTSBMU0VYVFJBQ1RFRDE2IChQU1csIDEwLCA4KQorI2RlZmluZSBJTlNFUlRfUFNXX0xNKGwpIExTSU5TRVJURUQxNiAoKGwpLCAxMCwgOCkKKworI2RlZmluZSBSRUdfRDAgMAorI2RlZmluZSBSRUdfQTAgNAorI2RlZmluZSBSRUdfU1AgOAorI2RlZmluZSBSRUdfUEMgOQorI2RlZmluZSBSRUdfTURSIDEwCisjZGVmaW5lIFJFR19QU1cgMTEKKyNkZWZpbmUgUkVHX0xJUiAxMgorI2RlZmluZSBSRUdfTEFSIDEzCisjZGVmaW5lIFJFR19NRFJRIDE0CisKKyNpZiBXSVRIX0NPTU1PTgorLyogVGhlc2UgZGVmaW5pdGlvbnMgY29uZmxpY3Qgd2l0aCBzaW1pbGFyIG1hY3JvcyBpbiBjb21tb24uICAqLworI2Vsc2UKKyNkZWZpbmUgU0VYVDMoeCkJKCgoKHgpJjB4NyleKH4weDMpKSsweDQpCQorCisvKiBzaWduLWV4dGVuZCBhIDQtYml0IG51bWJlciAqLworI2RlZmluZSBTRVhUNCh4KQkoKCgoeCkmMHhmKV4ofjB4NykpKzB4OCkJCisKKy8qIHNpZ24tZXh0ZW5kIGEgNS1iaXQgbnVtYmVyICovCisjZGVmaW5lIFNFWFQ1KHgpCSgoKCh4KSYweDFmKV4ofjB4ZikpKzB4MTApCQorCisvKiBzaWduLWV4dGVuZCBhbiA4LWJpdCBudW1iZXIgKi8KKyNkZWZpbmUgU0VYVDgoeCkJKCgoKHgpJjB4ZmYpXih+MHg3ZikpKzB4ODApCisKKy8qIHNpZ24tZXh0ZW5kIGEgOS1iaXQgbnVtYmVyICovCisjZGVmaW5lIFNFWFQ5KHgpCSgoKCh4KSYweDFmZileKH4weGZmKSkrMHgxMDApCisKKy8qIHNpZ24tZXh0ZW5kIGEgMTYtYml0IG51bWJlciAqLworI2RlZmluZSBTRVhUMTYoeCkJKCgoKHgpJjB4ZmZmZileKH4weDdmZmYpKSsweDgwMDApCisKKy8qIHNpZ24tZXh0ZW5kIGEgMjItYml0IG51bWJlciAqLworI2RlZmluZSBTRVhUMjIoeCkJKCgoKHgpJjB4M2ZmZmZmKV4ofjB4MWZmZmZmKSkrMHgyMDAwMDApCisKKyNkZWZpbmUgTUFYMzIJMHg3ZmZmZmZmZkxMCisjZGVmaW5lIE1JTjMyCTB4ZmY4MDAwMDAwMExMCisjZGVmaW5lIE1BU0szMgkweGZmZmZmZmZmTEwKKyNkZWZpbmUgTUFTSzQwCTB4ZmZmZmZmZmZmZkxMCisjZW5kaWYgIC8qIG5vdCBXSVRIX0NPTU1PTiAqLworCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIFNJR1RSQVAgNQorI2RlZmluZSBTSUdRVUlUIDMKKyNlbmRpZgorCisjaWYgV0lUSF9DT01NT04KKworI2RlZmluZSBGRVRDSDMyKGEsYixjLGQpIFwKKyAoKGEpKygoYik8PDgpKygoYyk8PDE2KSsoKGQpPDwyNCkpCisKKyNkZWZpbmUgRkVUQ0gyNChhLGIsYykgXAorICgoYSkrKChiKTw8OCkrKChjKTw8MTYpKQorCisjZGVmaW5lIEZFVENIMTYoYSxiKSAoKGEpKygoYik8PDgpKQorCisjZGVmaW5lIGxvYWRfYnl0ZShBRERSKSBcCitzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF8xIChTVEFURV9DUFUgKHNpbXVsYXRvciwgMCksIFBDLCByZWFkX21hcCwgKEFERFIpKQorCisjZGVmaW5lIGxvYWRfaGFsZihBRERSKSBcCitzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF8yIChTVEFURV9DUFUgKHNpbXVsYXRvciwgMCksIFBDLCByZWFkX21hcCwgKEFERFIpKQorCisjZGVmaW5lIGxvYWRfd29yZChBRERSKSBcCitzaW1fY29yZV9yZWFkX3VuYWxpZ25lZF80IChTVEFURV9DUFUgKHNpbXVsYXRvciwgMCksIFBDLCByZWFkX21hcCwgKEFERFIpKQorCisjZGVmaW5lIHN0b3JlX2J5dGUoQUREUiwgREFUQSkgXAorc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkXzEgKFNUQVRFX0NQVSAoc2ltdWxhdG9yLCAwKSwgXAorCQkJICAgIFBDLCB3cml0ZV9tYXAsIChBRERSKSwgKERBVEEpKQorCisKKyNkZWZpbmUgc3RvcmVfaGFsZihBRERSLCBEQVRBKSBcCitzaW1fY29yZV93cml0ZV91bmFsaWduZWRfMiAoU1RBVEVfQ1BVIChzaW11bGF0b3IsIDApLCBcCisJCQkgICAgUEMsIHdyaXRlX21hcCwgKEFERFIpLCAoREFUQSkpCisKKworI2RlZmluZSBzdG9yZV93b3JkKEFERFIsIERBVEEpIFwKK3NpbV9jb3JlX3dyaXRlX3VuYWxpZ25lZF80IChTVEFURV9DUFUgKHNpbXVsYXRvciwgMCksIFwKKwkJCSAgICBQQywgd3JpdGVfbWFwLCAoQUREUiksIChEQVRBKSkKKyNlbmRpZiAgLyogV0lUSF9DT01NT04gKi8KKworI2lmIFdJVEhfQ09NTU9OCisjZWxzZQorI2RlZmluZSBsb2FkX21lbV9iaWcoYWRkcixsZW4pIFwKKyAgKGxlbiA9PSAxID8gKigoYWRkcikgKyBTdGF0ZS5tZW0pIDogXAorICAgbGVuID09IDIgPyAoKCooKGFkZHIpICsgU3RhdGUubWVtKSA8PCA4KSBcCisJICAgICAgIHwgKigoKGFkZHIpICsgMSkgKyBTdGF0ZS5tZW0pKSA6IFwKKyAgIGxlbiA9PSAzID8gKCgqKChhZGRyKSArIFN0YXRlLm1lbSkgPDwgMTYpIFwKKwkgICAgICAgfCAoKigoKGFkZHIpICsgMSkgKyBTdGF0ZS5tZW0pIDw8IDgpIFwKKwkgICAgICAgfCAqKCgoYWRkcikgKyAyKSArIFN0YXRlLm1lbSkpIDogXAorCSAgICAgICgoKigoYWRkcikgKyBTdGF0ZS5tZW0pIDw8IDI0KSBcCisJICAgICAgIHwgKCooKChhZGRyKSArIDEpICsgU3RhdGUubWVtKSA8PCAxNikgXAorCSAgICAgICB8ICgqKCgoYWRkcikgKyAyKSArIFN0YXRlLm1lbSkgPDwgOCkgXAorCSAgICAgICB8ICooKChhZGRyKSArIDMpICsgU3RhdGUubWVtKSkpCisKK3N0YXRpYyBJTkxJTkUgdWludDMyCitsb2FkX2J5dGUgKGFkZHIpCisgICAgIFNJTV9BRERSIGFkZHI7Cit7CisgIHVpbnQ4ICpwID0gKGFkZHIgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW07CisKKyNpZmRlZiBDSEVDS19BRERSCisgIGlmICgoYWRkciAmIDB4ZmZmZmZmKSA+IG1heF9tZW0pCisgICAgYWJvcnQgKCk7CisjZW5kaWYKKworICByZXR1cm4gcFswXTsKK30KKworc3RhdGljIElOTElORSB1aW50MzIKK2xvYWRfaGFsZiAoYWRkcikKKyAgICAgU0lNX0FERFIgYWRkcjsKK3sKKyAgdWludDggKnAgPSAoYWRkciAmIDB4ZmZmZmZmKSArIFN0YXRlLm1lbTsKKworI2lmZGVmIENIRUNLX0FERFIKKyAgaWYgKChhZGRyICYgMHhmZmZmZmYpID4gbWF4X21lbSkKKyAgICBhYm9ydCAoKTsKKyNlbmRpZgorCisgIHJldHVybiBwWzFdIDw8IDggfCBwWzBdOworfQorCitzdGF0aWMgSU5MSU5FIHVpbnQzMgorbG9hZF8zX2J5dGUgKGFkZHIpCisgICAgIFNJTV9BRERSIGFkZHI7Cit7CisgIHVpbnQ4ICpwID0gKGFkZHIgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW07CisKKyNpZmRlZiBDSEVDS19BRERSCisgIGlmICgoYWRkciAmIDB4ZmZmZmZmKSA+IG1heF9tZW0pCisgICAgYWJvcnQgKCk7CisjZW5kaWYKKworICByZXR1cm4gcFsyXSA8PCAxNiB8IHBbMV0gPDwgOCB8IHBbMF07Cit9CisKK3N0YXRpYyBJTkxJTkUgdWludDMyCitsb2FkX3dvcmQgKGFkZHIpCisgICAgIFNJTV9BRERSIGFkZHI7Cit7CisgIHVpbnQ4ICpwID0gKGFkZHIgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW07CisKKyNpZmRlZiBDSEVDS19BRERSCisgIGlmICgoYWRkciAmIDB4ZmZmZmZmKSA+IG1heF9tZW0pCisgICAgYWJvcnQgKCk7CisjZW5kaWYKKworICByZXR1cm4gcFszXSA8PCAyNCB8IHBbMl0gPDwgMTYgfCBwWzFdIDw8IDggfCBwWzBdOworfQorCitzdGF0aWMgSU5MSU5FIHVpbnQzMgorbG9hZF9tZW0gKGFkZHIsIGxlbikKKyAgICAgU0lNX0FERFIgYWRkcjsKKyAgICAgaW50IGxlbjsKK3sKKyAgdWludDggKnAgPSAoYWRkciAmIDB4ZmZmZmZmKSArIFN0YXRlLm1lbTsKKworI2lmZGVmIENIRUNLX0FERFIKKyAgaWYgKChhZGRyICYgMHhmZmZmZmYpID4gbWF4X21lbSkKKyAgICBhYm9ydCAoKTsKKyNlbmRpZgorCisgIHN3aXRjaCAobGVuKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gcFswXTsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gcFsxXSA8PCA4IHwgcFswXTsKKyAgICBjYXNlIDM6CisgICAgICByZXR1cm4gcFsyXSA8PCAxNiB8IHBbMV0gPDwgOCB8IHBbMF07CisgICAgY2FzZSA0OgorICAgICAgcmV0dXJuIHBbM10gPDwgMjQgfCBwWzJdIDw8IDE2IHwgcFsxXSA8PCA4IHwgcFswXTsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCitzdGF0aWMgSU5MSU5FIHZvaWQKK3N0b3JlX2J5dGUgKGFkZHIsIGRhdGEpCisgICAgIFNJTV9BRERSIGFkZHI7CisgICAgIHVpbnQzMiBkYXRhOworeworICB1aW50OCAqcCA9IChhZGRyICYgMHhmZmZmZmYpICsgU3RhdGUubWVtOworCisjaWZkZWYgQ0hFQ0tfQUREUgorICBpZiAoKGFkZHIgJiAweGZmZmZmZikgPiBtYXhfbWVtKQorICAgIGFib3J0ICgpOworI2VuZGlmCisKKyAgcFswXSA9IGRhdGE7Cit9CisKK3N0YXRpYyBJTkxJTkUgdm9pZAorc3RvcmVfaGFsZiAoYWRkciwgZGF0YSkKKyAgICAgU0lNX0FERFIgYWRkcjsKKyAgICAgdWludDMyIGRhdGE7Cit7CisgIHVpbnQ4ICpwID0gKGFkZHIgJiAweGZmZmZmZikgKyBTdGF0ZS5tZW07CisKKyNpZmRlZiBDSEVDS19BRERSCisgIGlmICgoYWRkciAmIDB4ZmZmZmZmKSA+IG1heF9tZW0pCisgICAgYWJvcnQgKCk7CisjZW5kaWYKKworICBwWzBdID0gZGF0YTsKKyAgcFsxXSA9IGRhdGEgPj4gODsKK30KKworc3RhdGljIElOTElORSB2b2lkCitzdG9yZV8zX2J5dGUgKGFkZHIsIGRhdGEpCisgICAgIFNJTV9BRERSIGFkZHI7CisgICAgIHVpbnQzMiBkYXRhOworeworICB1aW50OCAqcCA9IChhZGRyICYgMHhmZmZmZmYpICsgU3RhdGUubWVtOworCisjaWZkZWYgQ0hFQ0tfQUREUgorICBpZiAoKGFkZHIgJiAweGZmZmZmZikgPiBtYXhfbWVtKQorICAgIGFib3J0ICgpOworI2VuZGlmCisKKyAgcFswXSA9IGRhdGE7CisgIHBbMV0gPSBkYXRhID4+IDg7CisgIHBbMl0gPSBkYXRhID4+IDE2OworfQorCitzdGF0aWMgSU5MSU5FIHZvaWQKK3N0b3JlX3dvcmQgKGFkZHIsIGRhdGEpCisgICAgIFNJTV9BRERSIGFkZHI7CisgICAgIHVpbnQzMiBkYXRhOworeworICB1aW50OCAqcCA9IChhZGRyICYgMHhmZmZmZmYpICsgU3RhdGUubWVtOworCisjaWZkZWYgQ0hFQ0tfQUREUgorICBpZiAoKGFkZHIgJiAweGZmZmZmZikgPiBtYXhfbWVtKQorICAgIGFib3J0ICgpOworI2VuZGlmCisKKyAgcFswXSA9IGRhdGE7CisgIHBbMV0gPSBkYXRhID4+IDg7CisgIHBbMl0gPSBkYXRhID4+IDE2OworICBwWzNdID0gZGF0YSA+PiAyNDsKK30KKyNlbmRpZiAgLyogbm90IFdJVEhfQ09NTU9OICovCisKKy8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4gICovCisKK3VpbnQzMiBnZXRfd29yZCBQQVJBTVMgKCh1aW50OCAqKSk7Cit1aW50MTYgZ2V0X2hhbGYgUEFSQU1TICgodWludDggKikpOwordWludDggZ2V0X2J5dGUgUEFSQU1TICgodWludDggKikpOwordm9pZCBwdXRfd29yZCBQQVJBTVMgKCh1aW50OCAqLCB1aW50MzIpKTsKK3ZvaWQgcHV0X2hhbGYgUEFSQU1TICgodWludDggKiwgdWludDE2KSk7Cit2b2lkIHB1dF9ieXRlIFBBUkFNUyAoKHVpbnQ4ICosIHVpbnQ4KSk7CisKK2V4dGVybiB1aW50OCAqbWFwIFBBUkFNUyAoKFNJTV9BRERSIGFkZHIpKTsKKworSU5MSU5FX1NJTV9NQUlOICh2b2lkKSBnZW5lcmljQWRkIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgc291cmNlLCB1bnNpZ25lZCBsb25nIGRlc3RSZWcpKTsKK0lOTElORV9TSU1fTUFJTiAodm9pZCkgZ2VuZXJpY1N1YiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBkZXN0UmVnKSk7CitJTkxJTkVfU0lNX01BSU4gKHZvaWQpIGdlbmVyaWNDbXAgUEFSQU1TICgodW5zaWduZWQgbG9uZyBsZWZ0T3BuZCwgdW5zaWduZWQgbG9uZyByaWdodE9wbmQpKTsKK0lOTElORV9TSU1fTUFJTiAodm9pZCkgZ2VuZXJpY09yIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgc291cmNlLCB1bnNpZ25lZCBsb25nIGRlc3RSZWcpKTsKK0lOTElORV9TSU1fTUFJTiAodm9pZCkgZ2VuZXJpY1hvciBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBkZXN0UmVnKSk7CitJTkxJTkVfU0lNX01BSU4gKHZvaWQpIGdlbmVyaWNCdHN0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgbGVmdE9wbmQsIHVuc2lnbmVkIGxvbmcgcmlnaHRPcG5kKSk7CitJTkxJTkVfU0lNX01BSU4gKGludCkgc3lzY2FsbF9yZWFkX21lbSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICpjYiwKKwkJCQkJCXN0cnVjdCBjYl9zeXNjYWxsICpzYywKKwkJCQkJCXVuc2lnbmVkIGxvbmcgdGFkZHIsCisJCQkJCQljaGFyICpidWYsCisJCQkJCQlpbnQgYnl0ZXMpKTsgCitJTkxJTkVfU0lNX01BSU4gKGludCkgc3lzY2FsbF93cml0ZV9tZW0gUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqY2IsCisJCQkJCQlzdHJ1Y3QgY2Jfc3lzY2FsbCAqc2MsCisJCQkJCQl1bnNpZ25lZCBsb25nIHRhZGRyLAorCQkJCQkJY29uc3QgY2hhciAqYnVmLAorCQkJCQkJaW50IGJ5dGVzKSk7IAorSU5MSU5FX1NJTV9NQUlOICh2b2lkKSBkb19zeXNjYWxsIFBBUkFNUyAoKHZvaWQpKTsKK3ZvaWQgcHJvZ3JhbV9pbnRlcnJ1cHQgKFNJTV9ERVNDIHNkLCBzaW1fY3B1ICpjcHUsIHNpbV9jaWEgY2lhLCBTSU1fU0lHTkFMIHNpZyk7CisKK3ZvaWQgbW4xMDMwMF9jcHVfZXhjZXB0aW9uX3RyaWdnZXIoU0lNX0RFU0Mgc2QsIHNpbV9jcHUqIGNwdSwgYWRkcmVzc193b3JkIHBjKTsKK3ZvaWQgbW4xMDMwMF9jcHVfZXhjZXB0aW9uX3N1c3BlbmQoU0lNX0RFU0Mgc2QsIHNpbV9jcHUqIGNwdSwgaW50IGV4Y2VwdGlvbik7Cit2b2lkIG1uMTAzMDBfY3B1X2V4Y2VwdGlvbl9yZXN1bWUoU0lNX0RFU0Mgc2QsIHNpbV9jcHUqIGNwdSwgaW50IGV4Y2VwdGlvbik7CmRpZmYgLS1naXQgYS9zaW0vbW4xMDMwMC9vcF91dGlscy5jIGIvc2ltL21uMTAzMDAvb3BfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTk2NmVkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL21uMTAzMDAvb3BfdXRpbHMuYwpAQCAtMCwwICsxLDIyNyBAQAorI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAidGFyZy12YWxzLmgiCisKKyNpZmRlZiBIQVZFX1VUSU1FX0gKKyNpbmNsdWRlIDx1dGltZS5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1RJTUVfSAorI2luY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKworCisjZGVmaW5lIFJFRzAoWCkgKChYKSAmIDB4MykKKyNkZWZpbmUgUkVHMShYKSAoKChYKSAmIDB4YykgPj4gMikKKyNkZWZpbmUgUkVHMF80KFgpICgoKFgpICYgMHgzMCkgPj4gNCkKKyNkZWZpbmUgUkVHMF84KFgpICgoKFgpICYgMHgzMDApID4+IDgpCisjZGVmaW5lIFJFRzFfOChYKSAoKChYKSAmIDB4YzAwKSA+PiAxMCkKKyNkZWZpbmUgUkVHMF8xNihYKSAoKChYKSAmIDB4MzAwMDApID4+IDE2KQorI2RlZmluZSBSRUcxXzE2KFgpICgoKFgpICYgMHhjMDAwMCkgPj4gMTgpCisKKworSU5MSU5FX1NJTV9NQUlOICh2b2lkKQorZ2VuZXJpY0FkZCh1bnNpZ25lZCBsb25nIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBkZXN0UmVnKQoreworICBpbnQgeiwgYywgbiwgdjsKKyAgdW5zaWduZWQgbG9uZyBkZXN0LCBzdW07CisKKyAgZGVzdCA9IFN0YXRlLnJlZ3NbZGVzdFJlZ107CisgIHN1bSA9IHNvdXJjZSArIGRlc3Q7CisgIFN0YXRlLnJlZ3NbZGVzdFJlZ10gPSBzdW07CisKKyAgeiA9IChzdW0gPT0gMCk7CisgIG4gPSAoc3VtICYgMHg4MDAwMDAwMCk7CisgIGMgPSAoc3VtIDwgc291cmNlKSB8fCAoc3VtIDwgZGVzdCk7CisgIHYgPSAoKGRlc3QgJiAweDgwMDAwMDAwKSA9PSAoc291cmNlICYgMHg4MDAwMDAwMCkKKyAgICAgICAmJiAoZGVzdCAmIDB4ODAwMDAwMDApICE9IChzdW0gJiAweDgwMDAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKKwkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKK30KKworCisKKworSU5MSU5FX1NJTV9NQUlOICh2b2lkKQorZ2VuZXJpY1N1Yih1bnNpZ25lZCBsb25nIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBkZXN0UmVnKQoreworICBpbnQgeiwgYywgbiwgdjsKKyAgdW5zaWduZWQgbG9uZyBkZXN0LCBkaWZmZXJlbmNlOworCisgIGRlc3QgPSBTdGF0ZS5yZWdzW2Rlc3RSZWddOworICBkaWZmZXJlbmNlID0gZGVzdCAtIHNvdXJjZTsKKyAgU3RhdGUucmVnc1tkZXN0UmVnXSA9IGRpZmZlcmVuY2U7CisKKyAgeiA9IChkaWZmZXJlbmNlID09IDApOworICBuID0gKGRpZmZlcmVuY2UgJiAweDgwMDAwMDAwKTsKKyAgYyA9IChzb3VyY2UgPiBkZXN0KTsKKyAgdiA9ICgoZGVzdCAmIDB4ODAwMDAwMDApICE9IChzb3VyY2UgJiAweDgwMDAwMDAwKQorICAgICAgICYmIChkZXN0ICYgMHg4MDAwMDAwMCkgIT0gKGRpZmZlcmVuY2UgJiAweDgwMDAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKKwkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKK30KKworSU5MSU5FX1NJTV9NQUlOICh2b2lkKQorZ2VuZXJpY0NtcCh1bnNpZ25lZCBsb25nIGxlZnRPcG5kLCB1bnNpZ25lZCBsb25nIHJpZ2h0T3BuZCkKK3sKKyAgaW50IHosIGMsIG4sIHY7CisgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKyAgdmFsdWUgPSByaWdodE9wbmQgLSBsZWZ0T3BuZDsKKworICB6ID0gKHZhbHVlID09IDApOworICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7CisgIGMgPSAobGVmdE9wbmQgPiByaWdodE9wbmQpOworICB2ID0gKChyaWdodE9wbmQgJiAweDgwMDAwMDAwKSAhPSAobGVmdE9wbmQgJiAweDgwMDAwMDAwKQorICAgICAgICYmIChyaWdodE9wbmQgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKKwkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKK30KKworCitJTkxJTkVfU0lNX01BSU4gKHZvaWQpCitnZW5lcmljT3IodW5zaWduZWQgbG9uZyBzb3VyY2UsIHVuc2lnbmVkIGxvbmcgZGVzdFJlZykKK3sKKyAgaW50IG4sIHo7CisKKyAgU3RhdGUucmVnc1tkZXN0UmVnXSB8PSBzb3VyY2U7CisgIHogPSAoU3RhdGUucmVnc1tkZXN0UmVnXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW2Rlc3RSZWddICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Cit9CisKKworSU5MSU5FX1NJTV9NQUlOICh2b2lkKQorZ2VuZXJpY1hvcih1bnNpZ25lZCBsb25nIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBkZXN0UmVnKQoreworICBpbnQgbiwgejsKKworICBTdGF0ZS5yZWdzW2Rlc3RSZWddIF49IHNvdXJjZTsKKyAgeiA9IChTdGF0ZS5yZWdzW2Rlc3RSZWddID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbZGVzdFJlZ10gJiAweDgwMDAwMDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKK30KKworCitJTkxJTkVfU0lNX01BSU4gKHZvaWQpCitnZW5lcmljQnRzdCh1bnNpZ25lZCBsb25nIGxlZnRPcG5kLCB1bnNpZ25lZCBsb25nIHJpZ2h0T3BuZCkKK3sKKyAgdW5zaWduZWQgbG9uZyB0ZW1wOworICBpbnQgeiwgbjsKKworICB0ZW1wID0gcmlnaHRPcG5kOworICB0ZW1wICY9IGxlZnRPcG5kOworICBuID0gKHRlbXAgJiAweDgwMDAwMDAwKSAhPSAwOworICB6ID0gKHRlbXAgPT0gMCk7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKTsKK30KKworLyogUmVhZC93cml0ZSBmdW5jdGlvbnMgZm9yIHN5c3RlbSBjYWxsIGludGVyZmFjZS4gICovCitJTkxJTkVfU0lNX01BSU4gKGludCkKK3N5c2NhbGxfcmVhZF9tZW0gKGhvc3RfY2FsbGJhY2sgKmNiLCBzdHJ1Y3QgY2Jfc3lzY2FsbCAqc2MsCisJCSAgdW5zaWduZWQgbG9uZyB0YWRkciwgY2hhciAqYnVmLCBpbnQgYnl0ZXMpCit7CisgIFNJTV9ERVNDIHNkID0gKFNJTV9ERVNDKSBzYy0+cDE7CisgIHNpbV9jcHUgKmNwdSA9IFNUQVRFX0NQVShzZCwgMCk7CisKKyAgcmV0dXJuIHNpbV9jb3JlX3JlYWRfYnVmZmVyIChzZCwgY3B1LCByZWFkX21hcCwgYnVmLCB0YWRkciwgYnl0ZXMpOworfQorCitJTkxJTkVfU0lNX01BSU4gKGludCkKK3N5c2NhbGxfd3JpdGVfbWVtIChob3N0X2NhbGxiYWNrICpjYiwgc3RydWN0IGNiX3N5c2NhbGwgKnNjLAorCQkgICB1bnNpZ25lZCBsb25nIHRhZGRyLCBjb25zdCBjaGFyICpidWYsIGludCBieXRlcykKK3sKKyAgU0lNX0RFU0Mgc2QgPSAoU0lNX0RFU0MpIHNjLT5wMTsKKyAgc2ltX2NwdSAqY3B1ID0gU1RBVEVfQ1BVKHNkLCAwKTsKKworICByZXR1cm4gc2ltX2NvcmVfd3JpdGVfYnVmZmVyIChzZCwgY3B1LCB3cml0ZV9tYXAsIGJ1ZiwgdGFkZHIsIGJ5dGVzKTsKK30KKworCisvKiBzeXNjYWxsICovCitJTkxJTkVfU0lNX01BSU4gKHZvaWQpCitkb19zeXNjYWxsICgpCit7CisKKyAgLyogV2UgdXNlIHRoaXMgZm9yIHNpbXVsYXRlZCBzeXN0ZW0gY2FsbHM7IHdlIG1heSBuZWVkIHRvIGNoYW5nZQorICAgICBpdCB0byBhIHJlc2VydmVkIGluc3RydWN0aW9uIGlmIHdlIGNvbmZsaWN0IHdpdGggdXNlcyBhdAorICAgICBNYXRzdXNoaXRhLiAgKi8KKyAgaW50IHNhdmVfZXJybm8gPSBlcnJubzsJCisgIGVycm5vID0gMDsKKworLyogUmVnaXN0ZXJzIHBhc3NlZCB0byB0cmFwIDAgKi8KKworLyogRnVuY3Rpb24gbnVtYmVyLiAgKi8KKyNkZWZpbmUgRlVOQyAgIChTdGF0ZS5yZWdzWzBdKQorCisvKiBQYXJhbWV0ZXJzLiAgKi8KKyNkZWZpbmUgUEFSTTEgICAoU3RhdGUucmVnc1sxXSkKKyNkZWZpbmUgUEFSTTIgICAobG9hZF93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAxMikpCisjZGVmaW5lIFBBUk0zICAgKGxvYWRfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgMTYpKQorCisvKiBSZWdpc3RlcnMgc2V0IGJ5IHRyYXAgMCAqLworCisjZGVmaW5lIFJFVFZBTCBTdGF0ZS5yZWdzWzBdCS8qIHJldHVybiB2YWx1ZSAqLworI2RlZmluZSBSRVRFUlIgU3RhdGUucmVnc1sxXQkvKiByZXR1cm4gZXJyb3IgY29kZSAqLworCisvKiBUdXJuIGEgcG9pbnRlciBpbiBhIHJlZ2lzdGVyIGludG8gYSBwb2ludGVyIGludG8gcmVhbCBtZW1vcnkuICovCisjZGVmaW5lIE1FTVBUUih4KSAoU3RhdGUubWVtICsgeCkKKworICBpZiAoIEZVTkMgPT0gVEFSR0VUX1NZU19leGl0ICkKKyAgICB7CisgICAgICAvKiBFWElUIC0gY2FsbGVyIGNhbiBsb29rIGluIFBBUk0xIHRvIHdvcmsgb3V0IHRoZSByZWFzb24gKi8KKyAgICAgIGlmIChQQVJNMSA9PSAweGRlYWQpCisJU3RhdGUuZXhjZXB0aW9uID0gU0lHQUJSVDsKKyAgICAgIGVsc2UKKwl7CisJICBzaW1fZW5naW5lX2hhbHQgKHNpbXVsYXRvciwgU1RBVEVfQ1BVIChzaW11bGF0b3IsIDApLCBOVUxMLCBQQywKKwkJCSAgIHNpbV9leGl0ZWQsIFBBUk0xKTsKKwkgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR1FVSVQ7CisJfQorICAgICAgU3RhdGUuZXhpdGVkID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBDQl9TWVNDQUxMIHN5c2NhbGw7CisKKyAgICAgIENCX1NZU0NBTExfSU5JVCAoJnN5c2NhbGwpOworICAgICAgc3lzY2FsbC5hcmcxID0gUEFSTTE7CisgICAgICBzeXNjYWxsLmFyZzIgPSBQQVJNMjsKKyAgICAgIHN5c2NhbGwuYXJnMyA9IFBBUk0zOworICAgICAgc3lzY2FsbC5mdW5jID0gRlVOQzsKKyAgICAgIHN5c2NhbGwucDEgPSAoUFRSKSBzaW11bGF0b3I7CisgICAgICBzeXNjYWxsLnJlYWRfbWVtID0gc3lzY2FsbF9yZWFkX21lbTsKKyAgICAgIHN5c2NhbGwud3JpdGVfbWVtID0gc3lzY2FsbF93cml0ZV9tZW07CisgICAgICBjYl9zeXNjYWxsIChTVEFURV9DQUxMQkFDSyAoc2ltdWxhdG9yKSwgJnN5c2NhbGwpOworICAgICAgUkVURVJSID0gc3lzY2FsbC5lcnJjb2RlOworICAgICAgUkVUVkFMID0gc3lzY2FsbC5yZXN1bHQ7CisgICAgfQorCisKKyAgZXJybm8gPSBzYXZlX2Vycm5vOworfQorCmRpZmYgLS1naXQgYS9zaW0vbW4xMDMwMC9zaW0tbWFpbi5jIGIvc2ltL21uMTAzMDAvc2ltLW1haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQwOTlkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL21uMTAzMDAvc2ltLW1haW4uYwpAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgU0lNX01BSU5fQworI2RlZmluZSBTSU1fTUFJTl9DCisjaW5jbHVkZSAib3BfdXRpbHMuYyIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvc2ltLW1haW4uaCBiL3NpbS9tbjEwMzAwL3NpbS1tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmZjRlNAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9tbjEwMzAwL3NpbS1tYWluLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisgICAgQ29weXJpZ2h0IChDKSAxOTk3LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBTSU1fTUFJTl9ICisjZGVmaW5lIFNJTV9NQUlOX0gKKworI2RlZmluZSBXSVRIX0NPUkUKKyNkZWZpbmUgV0lUSF9XQVRDSFBPSU5UUyAxCisjZGVmaW5lIFNJTV9IQU5ETEVTX0xNQSAxCisKKyNkZWZpbmUgU0lNX0VOR0lORV9IQUxUX0hPT0soU0QsTEFTVF9DUFUsQ0lBKSAwIC8qIGRpc2FibGUgdGhpcyBob29rICovCisKKyNpbmNsdWRlICJzaW0tYmFzaWNzLmgiCisjaW5jbHVkZSAic2ltLXNpZ25hbC5oIgorCisjaW5jbHVkZSA8c2lnbmFsLmg+IC8qIEZvciBraWxsKCkgaW4gaW5zbnM6ZG9fdHJhcCAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworLyogVGhlc2UgYXJlIGdlbmVyYXRlZCBmaWxlcy4gICovCisjaW5jbHVkZSAiaXRhYmxlLmgiCisjaW5jbHVkZSAiaWRlY29kZS5oIgorI2luY2x1ZGUgImlkZWNvZGUuaCIKKwordHlwZWRlZiBpbnN0cnVjdGlvbl9hZGRyZXNzIHNpbV9jaWE7CitzdGF0aWMgY29uc3Qgc2ltX2NpYSBudWxsX2NpYSA9IHswfTsgLyogRHVtbXkgKi8KKyNkZWZpbmUgTlVMTF9DSUEgbnVsbF9jaWEKKy8qIEZJWE1FOiBQZXJoYXBzIGlnZW4gc2hvdWxkIGdlbmVyYXRlIGFjY2VzcyBtYWNyb3MgZm9yCisgICBgaW5zdHJ1Y3Rpb25fYWRkcmVzcycgdGhhdCB3ZSBjb3VsZCB1c2UuICAqLworLyojZGVmaW5lIENJQV9BRERSKGNpYSkgKChjaWEpLmlwKSBkb2Vzbid0IHdvcmsgZm9yIG1uMTAzMDAqLworCisjZGVmaW5lIFdJVEhfV0FUQ0hQT0lOVFMgMQorCisjZGVmaW5lIFNJTV9DT1JFX1NJR05BTChTRCxDUFUsQ0lBLE1BUCxOUl9CWVRFUyxBRERSLFRSQU5TRkVSLEVSUk9SKSAgXAorbW4xMDMwMF9jb3JlX3NpZ25hbCAoKFNEKSwgKENQVSksIChDSUEpLCAoTUFQKSwgKE5SX0JZVEVTKSwgKEFERFIpLCAoVFJBTlNGRVIpLCAoRVJST1IpKQorCisKKyNpbmNsdWRlICJzaW0tYmFzZS5oIgorCisjaW5jbHVkZSAibW4xMDMwMF9zaW0uaCIKKworLyogQnJpbmcgZGF0YSBpbiBmcm9tIHRoZSBjb2xkICovCisKKyNkZWZpbmUgSU1FTTgoRUEpIFwKKyhzaW1fY29yZV9yZWFkX2FsaWduZWRfMShTVEFURV9DUFUoc2QsIDApLCBFQSwgZXhlY19tYXAsIChFQSkpKQorCisjZGVmaW5lIElNRU04X0lNTUVEKEVBLCBOKSBcCisoc2ltX2NvcmVfcmVhZF9hbGlnbmVkXzEoU1RBVEVfQ1BVKHNkLCAwKSwgRUEsIGV4ZWNfbWFwLCAoRUEpICsgKE4pKSkKKworCisvKiBGSVhNRTogRm9yIG1vbWVudCwgc2F2ZS9yZXN0b3JlIFBDIHZhbHVlIGZvdW5kIGluIHN0cnVjdCBTdGF0ZS4KKyAgIFN0cnVjdCBTdGF0ZSB3aWxsIG9uZSBkYXkgZ28gYXdheSwgYmVpbmcgcGxhY2VkIGluIHRoZSBzaW1fY3B1CisgICBzdGF0ZS4gKi8KKyNkZWZpbmUgQ0lBX0dFVChDUFUpICgoUEMpICsgMCkKKyNkZWZpbmUgQ0lBX1NFVChDUFUsVkFMKSAoKENQVSktPmNpYSA9IChWQUwpLCBQQyA9IChWQUwpKQorCisKK3N0cnVjdCBfc2ltX2NwdSB7CisgIHNpbV9ldmVudCAqcGVuZGluZ19ubWk7CisgIHNpbV9jaWEgY2lhOworICBzaW1fY3B1X2Jhc2UgYmFzZTsKK307CisKKworc3RydWN0IHNpbV9zdGF0ZSB7CisKKyAgLyogdGhlIHByb2Nlc3NvcnMgcHJvcGVyICovCisgIHNpbV9jcHUgY3B1OworI2RlZmluZSBTVEFURV9DUFUoc2QsIG4pICgmKHNkKS0+Y3B1KQorCisgIC8qIFRoZSBiYXNlIGNsYXNzLiAgKi8KKyAgc2ltX3N0YXRlX2Jhc2UgYmFzZTsKKworfTsKKworLyogRm9yIGNvbXBhdGliaWxpdHksIHVudGlsIGFsbCBmdW5jdGlvbnMgY29udmVydGVkIHRvIHBhc3NpbmcKKyAgIFNJTV9ERVNDIGFzIGFuIGFyZ3VtZW50ICovCitleHRlcm4gU0lNX0RFU0Mgc2ltdWxhdG9yOworCisvKiAocmUpIGluaXRpYWxpemUgdGhlIHNpbXVsYXRvciAqLworCitleHRlcm4gdm9pZCBlbmdpbmVfaW5pdChTSU1fREVTQyBzZCk7CitleHRlcm4gU0lNX0NPUkVfU0lHTkFMX0ZOIG1uMTAzMDBfY29yZV9zaWduYWw7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL21uMTAzMDAvc2ltb3BzLmMgYi9zaW0vbW4xMDMwMC9zaW1vcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTE5MDU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL21uMTAzMDAvc2ltb3BzLmMKQEAgLTAsMCArMSwzMjM5IEBACisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlICJtbjEwMzAwX3NpbS5oIgorI2luY2x1ZGUgInNpbW9wcy5oIgorI2luY2x1ZGUgInNpbS10eXBlcy5oIgorI2luY2x1ZGUgInRhcmctdmFscy5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjZGVmaW5lIFJFRzAoWCkgKChYKSAmIDB4MykKKyNkZWZpbmUgUkVHMShYKSAoKChYKSAmIDB4YykgPj4gMikKKyNkZWZpbmUgUkVHMF80KFgpICgoKFgpICYgMHgzMCkgPj4gNCkKKyNkZWZpbmUgUkVHMF84KFgpICgoKFgpICYgMHgzMDApID4+IDgpCisjZGVmaW5lIFJFRzFfOChYKSAoKChYKSAmIDB4YzAwKSA+PiAxMCkKKyNkZWZpbmUgUkVHMF8xNihYKSAoKChYKSAmIDB4MzAwMDApID4+IDE2KQorI2RlZmluZSBSRUcxXzE2KFgpICgoKFgpICYgMHhjMDAwMCkgPj4gMTgpCisMCisvKiBtb3YgaW1tOCwgZG4gKi8KK3ZvaWQgT1BfODAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSA9IFNFWFQ4IChpbnNuICYgMHhmZik7Cit9CisKKy8qIG1vdiBkbSwgZG4gKi8KK3ZvaWQgT1BfODAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07Cit9CisKKy8qIG1vdiBkbSwgYW4gKi8KK3ZvaWQgT1BfRjFFMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0gPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKK30KKworLyogbW92IGFtLCBkbiAqLwordm9pZCBPUF9GMUQwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildOworfQorCisvKiBtb3YgaW1tOCwgYW4gKi8KK3ZvaWQgT1BfOTAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzggKGluc24pXSA9IGluc24gJiAweGZmOworfQorCisvKiBtb3YgYW0sIGFuICovCit2b2lkIE9QXzkwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildOworfQorCisvKiBtb3Ygc3AsIGFuICovCit2b2lkIE9QXzNDIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKK30KKworLyogbW92IGFtLCBzcCAqLwordm9pZCBPUF9GMkYwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19TUF0gPSBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXTsKK30KKworLyogbW92IHBzdywgZG4gKi8KK3ZvaWQgT1BfRjJFNCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSBQU1c7Cit9CisKKy8qIG1vdiBkbSwgcHN3ICovCit2b2lkIE9QX0YyRjMgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFBTVyA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOworfQorCisvKiBtb3YgbWRyLCBkbiAqLwordm9pZCBPUF9GMkUwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IFN0YXRlLnJlZ3NbUkVHX01EUl07Cit9CisKKy8qIG1vdiBkbSwgbWRyICovCit2b2lkIE9QX0YyRjIgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKK30KKworLyogbW92IChhbSksIGRuICovCit2b2lkIE9QXzcwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXQorICAgID0gbG9hZF93b3JkIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSk7Cit9CisKKy8qIG1vdiAoZDgsYW0pLCBkbiAqLwordm9pZCBPUF9GODAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV84IChpbnNuKV0KKyAgICA9IGxvYWRfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF84IChpbnNuKV0gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKSk7Cit9CisKKy8qIG1vdiAoZDE2LGFtKSwgZG4gKi8KK3ZvaWQgT1BfRkEwMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV8xNiAoaW5zbildCisgICAgPSBsb2FkX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXQorCQkgICsgU0VYVDE2IChpbnNuICYgMHhmZmZmKSkpOworfQorCisvKiBtb3YgKGQzMixhbSksIGRuICovCit2b2lkIE9QX0ZDMDAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfMTYgKGluc24pXQorICAgID0gbG9hZF93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KKwkJICArICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSk7Cit9CisKKy8qIG1vdiAoZDgsc3ApLCBkbiAqLwordm9pZCBPUF81ODAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildCisgICAgPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIChpbnNuICYgMHhmZikpOworfQorCisvKiBtb3YgKGQxNixzcCksIGRuICovCit2b2lkIE9QX0ZBQjQwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQorICAgID0gbG9hZF93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAoaW5zbiAmIDB4ZmZmZikpOworfQorCisvKiBtb3YgKGQzMixzcCksIGRuICovCit2b2lkIE9QX0ZDQjQwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQorICAgID0gbG9hZF93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAoKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb24pKTsKK30KKworLyogbW92IChkaSxhbSksIGRuICovCit2b2lkIE9QX0YzMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF80IChpbnNuKV0KKyAgICA9IGxvYWRfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildCisJCSAgKyBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSkpOworfQorCisvKiBtb3YgKGFiczE2KSwgZG4gKi8KK3ZvaWQgT1BfMzAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSA9IGxvYWRfd29yZCAoKGluc24gJiAweGZmZmYpKTsKK30KKworLyogbW92IChhYnMzMiksIGRuICovCit2b2lkIE9QX0ZDQTQwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQorICAgID0gbG9hZF93b3JkICgoKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb24pKTsKK30KKworLyogbW92IChhbSksIGFuICovCit2b2lkIE9QX0YwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildCisgICAgPSBsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildKTsKK30KKworLyogbW92IChkOCxhbSksIGFuICovCit2b2lkIE9QX0Y4MjAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzggKGluc24pXQorICAgID0gbG9hZF93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzggKGluc24pXQorCQkgICsgU0VYVDggKGluc24gJiAweGZmKSkpOworfQorCisvKiBtb3YgKGQxNixhbSksIGFuICovCit2b2lkIE9QX0ZBMjAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXQorICAgID0gbG9hZF93b3JkICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KKwkJICArIFNFWFQxNiAoaW5zbiAmIDB4ZmZmZikpKTsKK30KKworLyogbW92IChkMzIsYW0pLCBhbiAqLwordm9pZCBPUF9GQzIwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0KKyAgICA9IGxvYWRfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildCisJCSAgKyAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbikpOworfQorCisvKiBtb3YgKGQ4LHNwKSwgYW4gKi8KK3ZvaWQgT1BfNUMwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzggKGluc24pXQorICAgID0gbG9hZF93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAoaW5zbiAmIDB4ZmYpKTsKK30KKworLyogbW92IChkMTYsc3ApLCBhbiAqLwordm9pZCBPUF9GQUIwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KKyAgICA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgKGluc24gJiAweGZmZmYpKTsKK30KKworLyogbW92IChkMzIsc3ApLCBhbiAqLwordm9pZCBPUF9GQ0IwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KKyAgICA9IGxvYWRfd29yZCAoU3RhdGUucmVnc1tSRUdfU1BdICsgKCgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSk7Cit9CisKKy8qIG1vdiAoZGksYW0pLCBhbiAqLwordm9pZCBPUF9GMzgwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfNCAoaW5zbildCisgICAgPSBsb2FkX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXQorCQkgKyBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSkpOworfQorCisvKiBtb3YgKGFiczE2KSwgYW4gKi8KK3ZvaWQgT1BfRkFBMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildID0gbG9hZF93b3JkICgoaW5zbiAmIDB4ZmZmZikpOworfQorCisvKiBtb3YgKGFiczMyKSwgYW4gKi8KK3ZvaWQgT1BfRkNBMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildCisgICAgPSBsb2FkX3dvcmQgKCgoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbikpOworfQorCisvKiBtb3YgKGQ4LGFtKSwgc3AgKi8KK3ZvaWQgT1BfRjhGMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19TUF0KKyAgICA9IGxvYWRfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF84IChpbnNuKV0KKwkJICArIFNFWFQ4IChpbnNuICYgMHhmZikpKTsKK30KKworLyogbW92IGRtLCAoYW4pICovCit2b2lkIE9QXzYwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBzdG9yZV93b3JkIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSk7Cit9CisKKy8qIG1vdiBkbSwgKGQ4LGFuKSAqLwordm9pZCBPUF9GODEwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfOCAoaW5zbildICsgU0VYVDggKGluc24gJiAweGZmKSksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzggKGluc24pXSk7Cit9CisKKy8qIG1vdiBkbSAoZDE2LGFuKSAqLwordm9pZCBPUF9GQTEwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildICsgU0VYVDE2IChpbnNuICYgMHhmZmZmKSksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzE2IChpbnNuKV0pOworfQorCisvKiBtb3YgZG0gKGQzMixhbikgKi8KK3ZvaWQgT1BfRkMxMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXQorCSAgICAgICArICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfMTYgKGluc24pXSk7Cit9CisKKy8qIG1vdiBkbSwgKGQ4LHNwKSAqLwordm9pZCBPUF80MjAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBzdG9yZV93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAoaW5zbiAmIDB4ZmYpLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV84IChpbnNuKV0pOworfQorCisvKiBtb3YgZG0sIChkMTYsc3ApICovCit2b2lkIE9QX0ZBOTEwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBzdG9yZV93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAoaW5zbiAmIDB4ZmZmZiksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzE2IChpbnNuKV0pOworfQorCisvKiBtb3YgZG0sIChkMzIsc3ApICovCit2b2lkIE9QX0ZDOTEwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBzdG9yZV93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAoKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb24pLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV8xNiAoaW5zbildKTsKK30KKworLyogbW92IGRtLCAoZGksYW4pICovCit2b2lkIE9QX0YzNDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXQorCSAgICAgICArIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfNCAoaW5zbildKTsKK30KKworLyogbW92IGRtLCAoYWJzMTYpICovCit2b2lkIE9QXzEwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBzdG9yZV93b3JkICgoaW5zbiAmIDB4ZmZmZiksIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV8xNiAoaW5zbildKTsKK30KKworLyogbW92IGRtLCAoYWJzMzIpICovCit2b2lkIE9QX0ZDODEwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBzdG9yZV93b3JkICgoKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb24pLCAKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfMTYgKGluc24pXSk7Cit9CisKKy8qIG1vdiBhbSwgKGFuKSAqLwordm9pZCBPUF9GMDEwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBzdG9yZV93b3JkIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXSk7Cit9CisKKy8qIG1vdiBhbSwgKGQ4LGFuKSAqLwordm9pZCBPUF9GODMwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfOCAoaW5zbildICsgU0VYVDggKGluc24gJiAweGZmKSksCisJICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzggKGluc24pXSk7Cit9CisKKy8qIG1vdiBhbSwgKGQxNixhbikgKi8KK3ZvaWQgT1BfRkEzMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX3dvcmQgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXSArIFNFWFQxNiAoaW5zbiAmIDB4ZmZmZikpLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMV8xNiAoaW5zbildKTsKK30KKworLyogbW92IGFtLCAoZDMyLGFuKSAqLwordm9pZCBPUF9GQzMwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildCisJICAgICAgICsgKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb24pLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMV8xNiAoaW5zbildKTsKK30KKworLyogbW92IGFtLCAoZDgsc3ApICovCit2b2lkIE9QXzQzMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIChpbnNuICYgMHhmZiksCisJICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzggKGluc24pXSk7Cit9CisKKy8qIG1vdiBhbSwgKGQxNixzcCkgKi8KK3ZvaWQgT1BfRkE5MDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIChpbnNuICYgMHhmZmZmKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzFfMTYgKGluc24pXSk7Cit9CisKKy8qIG1vdiBhbSwgKGQzMixzcCkgKi8KK3ZvaWQgT1BfRkM5MDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArICgoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbiksCisJICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0pOworfQorCisvKiBtb3YgYW0sIChkaSxhbikgKi8KK3ZvaWQgT1BfRjNDMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfd29yZCAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildCisJICAgICAgICsgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0pLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF80IChpbnNuKV0pOworfQorCisvKiBtb3YgYW0sIChhYnMxNikgKi8KK3ZvaWQgT1BfRkE4MDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX3dvcmQgKChpbnNuICYgMHhmZmZmKSwgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxXzE2IChpbnNuKV0pOworfQorCisvKiBtb3YgYW0sIChhYnMzMikgKi8KK3ZvaWQgT1BfRkM4MDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX3dvcmQgKCgoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbiksIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMV8xNiAoaW5zbildKTsKK30KKworLyogbW92IHNwLCAoZDgsYW4pICovCit2b2lkIE9QX0Y4RjQwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfd29yZCAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzggKGluc24pXSArIFNFWFQ4IChpbnNuICYgMHhmZiksCisJICAgICAgU3RhdGUucmVnc1tSRUdfU1BdKTsKK30KKworLyogbW92IGltbTE2LCBkbiAqLwordm9pZCBPUF8yQzAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKyAgdmFsdWUgPSBTRVhUMTYgKGluc24gJiAweGZmZmYpOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSA9IHZhbHVlOworfQorCisvKiBtb3YgaW1tMzIsZG4gKi8KK3ZvaWQgT1BfRkNDQzAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKyAgdmFsdWUgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbjsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gPSB2YWx1ZTsKK30KKworLyogbW92IGltbTE2LCBhbiAqLwordm9pZCBPUF8yNDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKyAgdmFsdWUgPSBpbnNuICYgMHhmZmZmOworICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXSA9IHZhbHVlOworfQorCisvKiBtb3YgaW1tMzIsIGFuICovCit2b2lkIE9QX0ZDREMwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIHZhbHVlOworCisgIHZhbHVlID0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb247CisgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildID0gdmFsdWU7Cit9CisKKy8qIG1vdmJ1IChhbSksIGRuICovCit2b2lkIE9QX0YwNDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildCisgICAgPSBsb2FkX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildKTsKK30KKworLyogbW92YnUgKGQ4LGFtKSwgZG4gKi8KK3ZvaWQgT1BfRjg0MDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfOCAoaW5zbildCisgICAgPSBsb2FkX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfOCAoaW5zbildCisJCSAgKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKSk7Cit9CisKKy8qIG1vdmJ1IChkMTYsYW0pLCBkbiAqLwordm9pZCBPUF9GQTQwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzE2IChpbnNuKV0KKyAgICA9IGxvYWRfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildCisJCSAgKyBTRVhUMTYgKGluc24gJiAweGZmZmYpKSk7Cit9CisKKy8qIG1vdmJ1IChkMzIsYW0pLCBkbiAqLwordm9pZCBPUF9GQzQwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzE2IChpbnNuKV0KKyAgICA9IGxvYWRfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildCisJCSAgKyAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbikpOworfQorCisvKiBtb3ZidSAoZDgsc3ApLCBkbiAqLwordm9pZCBPUF9GOEI4MDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0KKyAgICA9IGxvYWRfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX1NQXSArIChpbnNuICYgMHhmZikpKTsKK30KKworLyogbW92YnUgKGQxNixzcCksIGRuICovCit2b2lkIE9QX0ZBQjgwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQorICAgID0gbG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfU1BdICsgKGluc24gJiAweGZmZmYpKSk7Cit9CisKKy8qIG1vdmJ1IChkMzIsc3ApLCBkbiAqLwordm9pZCBPUF9GQ0I4MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0KKyAgICA9IGxvYWRfYnl0ZSAoU3RhdGUucmVnc1tSRUdfU1BdICsgKCgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSk7Cit9CisKKy8qIG1vdmJ1IChkaSxhbSksIGRuICovCit2b2lkIE9QX0Y0MDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF80IChpbnNuKV0KKyAgICA9IGxvYWRfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildCisJCSAgKyBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSkpOworfQorCisvKiBtb3ZidSAoYWJzMTYpLCBkbiAqLwordm9pZCBPUF8zNDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID0gbG9hZF9ieXRlICgoaW5zbiAmIDB4ZmZmZikpOworfQorCisvKiBtb3ZidSAoYWJzMzIpLCBkbiAqLwordm9pZCBPUF9GQ0E4MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0KKyAgICA9IGxvYWRfYnl0ZSAoKCgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSk7Cit9CisKKy8qIG1vdmJ1IGRtLCAoYW4pICovCit2b2lkIE9QX0YwNTAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKTsKK30KKworLyogbW92YnUgZG0sIChkOCxhbikgKi8KK3ZvaWQgT1BfRjg1MDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBzdG9yZV9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzggKGluc24pXSArIFNFWFQ4IChpbnNuICYgMHhmZikpLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV84IChpbnNuKV0pOworfQorCisvKiBtb3ZidSBkbSwgKGQxNixhbikgKi8KK3ZvaWQgT1BfRkE1MDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXSArIFNFWFQxNiAoaW5zbiAmIDB4ZmZmZikpLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV8xNiAoaW5zbildKTsKK30KKworLyogbW92YnUgZG0sIChkMzIsYW4pICovCit2b2lkIE9QX0ZDNTAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBzdG9yZV9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KKwkgICAgICAgKyAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbiksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzE2IChpbnNuKV0pOworfQorCisvKiBtb3ZidSBkbSwgKGQ4LHNwKSAqLwordm9pZCBPUF9GODkyMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIChpbnNuICYgMHhmZiksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzggKGluc24pXSk7Cit9CisKKy8qIG1vdmJ1IGRtLCAoZDE2LHNwKSAqLwordm9pZCBPUF9GQTkyMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tSRUdfU1BdICsgKGluc24gJiAweGZmZmYpLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV8xNiAoaW5zbildKTsKK30KKworLyogbW92YnUgZG0gKGQzMixzcCkgKi8KK3ZvaWQgT1BfRkM5MjAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX1NQXSArICgoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbiksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzE2IChpbnNuKV0pOworfQorCisvKiBtb3ZidSBkbSwgKGRpLGFuKSAqLwordm9pZCBPUF9GNDQwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBzdG9yZV9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0KKwkgICAgICAgKyBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzQgKGluc24pXSk7Cit9CisKKy8qIG1vdmJ1IGRtLCAoYWJzMTYpICovCit2b2lkIE9QXzIwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBzdG9yZV9ieXRlICgoaW5zbiAmIDB4ZmZmZiksIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV8xNiAoaW5zbildKTsKK30KKworLyogbW92YnUgZG0sIChhYnMzMikgKi8KK3ZvaWQgT1BfRkM4MjAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX2J5dGUgKCgoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbiksIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV8xNiAoaW5zbildKTsKK30KKworLyogbW92aHUgKGFtKSwgZG4gKi8KK3ZvaWQgT1BfRjA2MCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0KKyAgICA9IGxvYWRfaGFsZiAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0pOworfQorCisvKiBtb3ZodSAoZDgsYW0pLCBkbiAqLwordm9pZCBPUF9GODYwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV84IChpbnNuKV0KKyAgICA9IGxvYWRfaGFsZiAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF84IChpbnNuKV0KKwkJICArIFNFWFQ4IChpbnNuICYgMHhmZikpKTsKK30KKworLyogbW92aHUgKGQxNixhbSksIGRuICovCit2b2lkIE9QX0ZBNjAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfMTYgKGluc24pXQorICAgID0gbG9hZF9oYWxmICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KKwkJICArIFNFWFQxNiAoaW5zbiAmIDB4ZmZmZikpKTsKK30KKworLyogbW92aHUgKGQzMixhbSksIGRuICovCit2b2lkIE9QX0ZDNjAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfMTYgKGluc24pXQorICAgID0gbG9hZF9oYWxmICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KKwkJICArICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSk7Cit9CisKKy8qIG1vdmh1IChkOCxzcCkgZG4gKi8KK3ZvaWQgT1BfRjhCQzAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildCisgICAgPSBsb2FkX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19TUF0gKyAoaW5zbiAmIDB4ZmYpKSk7Cit9CisKKy8qIG1vdmh1IChkMTYsc3ApLCBkbiAqLwordm9pZCBPUF9GQUJDMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0KKyAgICA9IGxvYWRfaGFsZiAoKFN0YXRlLnJlZ3NbUkVHX1NQXSArIChpbnNuICYgMHhmZmZmKSkpOworfQorCisvKiBtb3ZodSAoZDMyLHNwKSwgZG4gKi8KK3ZvaWQgT1BfRkNCQzAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCisgICAgPSBsb2FkX2hhbGYgKFN0YXRlLnJlZ3NbUkVHX1NQXSArICgoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbikpOworfQorCisvKiBtb3ZodSAoZGksYW0pLCBkbiAqLwordm9pZCBPUF9GNDgwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfNCAoaW5zbildCisgICAgPSBsb2FkX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXQorCQkgICsgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0pKTsKK30KKworLyogbW92aHUgKGFiczE2KSwgZG4gKi8KK3ZvaWQgT1BfMzgwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSA9IGxvYWRfaGFsZiAoKGluc24gJiAweGZmZmYpKTsKK30KKworLyogbW92aHUgKGFiczMyKSwgZG4gKi8KK3ZvaWQgT1BfRkNBQzAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCisgICAgPSBsb2FkX2hhbGYgKCgoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbikpOworfQorCisvKiBtb3ZodSBkbSwgKGFuKSAqLwordm9pZCBPUF9GMDcwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBzdG9yZV9oYWxmIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSk7Cit9CisKKy8qIG1vdmh1IGRtLCAoZDgsYW4pICovCit2b2lkIE9QX0Y4NzAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfaGFsZiAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF84IChpbnNuKV0gKyBTRVhUOCAoaW5zbiAmIDB4ZmYpKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfOCAoaW5zbildKTsKK30KKworLyogbW92aHUgZG0sIChkMTYsYW4pICovCit2b2lkIE9QX0ZBNzAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBzdG9yZV9oYWxmICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0gKyBTRVhUMTYgKGluc24gJiAweGZmZmYpKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfMTYgKGluc24pXSk7Cit9CisKKy8qIG1vdmh1IGRtLCAoZDMyLGFuKSAqLwordm9pZCBPUF9GQzcwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfaGFsZiAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildCisJICAgICAgICsgKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb24pLAorCSAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMV8xNiAoaW5zbildKTsKK30KKworLyogbW92aHUgZG0sKGQ4LHNwKSAqLwordm9pZCBPUF9GODkzMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX2hhbGYgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIChpbnNuICYgMHhmZiksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzggKGluc24pXSk7Cit9CisKKy8qIG1vdmh1IGRtLChkMTYsc3ApICovCit2b2lkIE9QX0ZBOTMwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBzdG9yZV9oYWxmIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAoaW5zbiAmIDB4ZmZmZiksCisJICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzE2IChpbnNuKV0pOworfQorCisvKiBtb3ZodSBkbSwoZDMyLHNwKSAqLwordm9pZCBPUF9GQzkzMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfaGFsZiAoU3RhdGUucmVnc1tSRUdfU1BdICsgKCgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzFfMTYgKGluc24pXSk7Cit9CisKKy8qIG1vdmh1IGRtLCAoZGksYW4pICovCit2b2lkIE9QX0Y0QzAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX2hhbGYgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXQorCSAgICAgICArIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKSwKKwkgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfNCAoaW5zbildKTsKK30KKworLyogbW92aHUgZG0sIChhYnMxNikgKi8KK3ZvaWQgT1BfMzAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHN0b3JlX2hhbGYgKChpbnNuICYgMHhmZmZmKSwgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzE2IChpbnNuKV0pOworfQorCisvKiBtb3ZodSBkbSwgKGFiczMyKSAqLwordm9pZCBPUF9GQzgzMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgc3RvcmVfaGFsZiAoKCgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSwgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxXzE2IChpbnNuKV0pOworfQorCisvKiBleHQgZG4gKi8KK3ZvaWQgT1BfRjJEMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaWYgKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICYgMHg4MDAwMDAwMCkKKyAgICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gLTE7CisgIGVsc2UKKyAgICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gMDsKK30KKworLyogZXh0YiBkbiAqLwordm9pZCBPUF8xMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSBTRVhUOCAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pOworfQorCisvKiBleHRidSBkbiAqLwordm9pZCBPUF8xNCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJj0gMHhmZjsKK30KKworLyogZXh0aCBkbiAqLwordm9pZCBPUF8xOCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0KKyAgICA9IFNFWFQxNiAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0pOworfQorCisvKiBleHRodSBkbiAqLwordm9pZCBPUF8xQyAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJj0gMHhmZmZmOworfQorCisvKiBtb3ZtIChzcCksIHJlZ19saXN0ICovCit2b2lkIE9QX0NFMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGxvbmcgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07CisgIHVuc2lnbmVkIGxvbmcgbWFzazsKKworICBtYXNrID0gaW5zbiAmIDB4ZmY7CisKKyAgaWYgKG1hc2sgJiAweDgpCisgICAgeworICAgICAgc3AgKz0gNDsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0xBUl0gPSBsb2FkX3dvcmQgKHNwKTsKKyAgICAgIHNwICs9IDQ7CisgICAgICBTdGF0ZS5yZWdzW1JFR19MSVJdID0gbG9hZF93b3JkIChzcCk7CisgICAgICBzcCArPSA0OworICAgICAgU3RhdGUucmVnc1tSRUdfTURSXSA9IGxvYWRfd29yZCAoc3ApOworICAgICAgc3AgKz0gNDsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgMV0gPSBsb2FkX3dvcmQgKHNwKTsKKyAgICAgIHNwICs9IDQ7CisgICAgICBTdGF0ZS5yZWdzW1JFR19BMF0gPSBsb2FkX3dvcmQgKHNwKTsKKyAgICAgIHNwICs9IDQ7CisgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIDFdID0gbG9hZF93b3JkIChzcCk7CisgICAgICBzcCArPSA0OworICAgICAgU3RhdGUucmVnc1tSRUdfRDBdID0gbG9hZF93b3JkIChzcCk7CisgICAgICBzcCArPSA0OworICAgIH0KKworICBpZiAobWFzayAmIDB4MTApCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyAzXSA9IGxvYWRfd29yZCAoc3ApOworICAgICAgc3AgKz0gNDsKKyAgICB9CisKKyAgaWYgKG1hc2sgJiAweDIwKQorICAgIHsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgMl0gPSBsb2FkX3dvcmQgKHNwKTsKKyAgICAgIHNwICs9IDQ7CisgICAgfQorCisgIGlmIChtYXNrICYgMHg0MCkKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIDNdID0gbG9hZF93b3JkIChzcCk7CisgICAgICBzcCArPSA0OworICAgIH0KKworICBpZiAobWFzayAmIDB4ODApCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyAyXSA9IGxvYWRfd29yZCAoc3ApOworICAgICAgc3AgKz0gNDsKKyAgICB9CisKKyAgLyogQW5kIG1ha2Ugc3VyZSB0byB1cGRhdGUgdGhlIHN0YWNrIHBvaW50ZXIuICAqLworICBTdGF0ZS5yZWdzW1JFR19TUF0gPSBzcDsKK30KKworLyogbW92bSByZWdfbGlzdCwgKHNwKSAqLwordm9pZCBPUF9DRjAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIHNwID0gU3RhdGUucmVnc1tSRUdfU1BdOworICB1bnNpZ25lZCBsb25nIG1hc2s7CisKKyAgbWFzayA9IGluc24gJiAweGZmOworCisgIGlmIChtYXNrICYgMHg4MCkKKyAgICB7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0QwICsgMl0pOworICAgIH0KKworICBpZiAobWFzayAmIDB4NDApCisgICAgeworICAgICAgc3AgLT0gNDsKKyAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19EMCArIDNdKTsKKyAgICB9CisKKyAgaWYgKG1hc2sgJiAweDIwKQorICAgIHsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfQTAgKyAyXSk7CisgICAgfQorCisgIGlmIChtYXNrICYgMHgxMCkKKyAgICB7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwICsgM10pOworICAgIH0KKworICBpZiAobWFzayAmIDB4OCkKKyAgICB7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0QwXSk7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0QwICsgMV0pOworICAgICAgc3AgLT0gNDsKKyAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19BMF0pOworICAgICAgc3AgLT0gNDsKKyAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19BMCArIDFdKTsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfTURSXSk7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0xJUl0pOworICAgICAgc3AgLT0gNDsKKyAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19MQVJdKTsKKyAgICAgIHNwIC09IDQ7CisgICAgfQorCisgIC8qIEFuZCBtYWtlIHN1cmUgdG8gdXBkYXRlIHRoZSBzdGFjayBwb2ludGVyLiAgKi8KKyAgU3RhdGUucmVnc1tSRUdfU1BdID0gc3A7Cit9CisKKy8qIGNsciBkbiAqLwordm9pZCBPUF8wIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXSA9IDA7CisKKyAgUFNXIHw9IFBTV19aOworICBQU1cgJj0gfihQU1dfViB8IFBTV19DIHwgUFNXX04pOworfQorCisvKiBhZGQgZG0sZG4gKi8KK3ZvaWQgT1BfRTAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2OworICB1bnNpZ25lZCBsb25nIHJlZzEsIHJlZzIsIHZhbHVlOworCisgIHJlZzEgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKKyAgcmVnMiA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildOworICB2YWx1ZSA9IHJlZzEgKyByZWcyOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHZhbHVlOworCisgIHogPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKTsKKyAgYyA9ICh2YWx1ZSA8IHJlZzEpIHx8ICh2YWx1ZSA8IHJlZzIpOworICB2ID0gKChyZWcyICYgMHg4MDAwMDAwMCkgPT0gKHJlZzEgJiAweDgwMDAwMDAwKQorICAgICAgICYmIChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCisJICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Cit9CisKKy8qIGFkZCBkbSwgYW4gKi8KK3ZvaWQgT1BfRjE2MCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHosIGMsIG4sIHY7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOworICByZWcyID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV07CisgIHZhbHVlID0gcmVnMSArIHJlZzI7CisgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildID0gdmFsdWU7CisKKyAgeiA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOworICBjID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgcmVnMik7CisgIHYgPSAoKHJlZzIgJiAweDgwMDAwMDAwKSA9PSAocmVnMSAmIDB4ODAwMDAwMDApCisgICAgICAgJiYgKHJlZzIgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKKwkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKK30KKworLyogYWRkIGFtLCBkbiAqLwordm9pZCBPUF9GMTUwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdjsKKyAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCB2YWx1ZTsKKworICByZWcxID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV07CisgIHJlZzIgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXTsKKyAgdmFsdWUgPSByZWcxICsgcmVnMjsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKKworICB6ID0gKHZhbHVlID09IDApOworICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7CisgIGMgPSAodmFsdWUgPCByZWcxKSB8fCAodmFsdWUgPCByZWcyKTsKKyAgdiA9ICgocmVnMiAmIDB4ODAwMDAwMDApID09IChyZWcxICYgMHg4MDAwMDAwMCkKKyAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQorCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOworfQorCisvKiBhZGQgYW0sYW4gKi8KK3ZvaWQgT1BfRjE3MCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHosIGMsIG4sIHY7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildOworICByZWcyID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV07CisgIHZhbHVlID0gcmVnMSArIHJlZzI7CisgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildID0gdmFsdWU7CisKKyAgeiA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOworICBjID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgcmVnMik7CisgIHYgPSAoKHJlZzIgJiAweDgwMDAwMDAwKSA9PSAocmVnMSAmIDB4ODAwMDAwMDApCisgICAgICAgJiYgKHJlZzIgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKKwkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKK30KKworLyogYWRkIGltbTgsIGRuICovCit2b2lkIE9QXzI4MDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2OworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV07CisgIGltbSA9IFNFWFQ4IChpbnNuICYgMHhmZik7CisgIHZhbHVlID0gcmVnMSArIGltbTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSA9IHZhbHVlOworCisgIHogPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKTsKKyAgYyA9ICh2YWx1ZSA8IHJlZzEpIHx8ICh2YWx1ZSA8IGltbSk7CisgIHYgPSAoKHJlZzEgJiAweDgwMDAwMDAwKSA9PSAoaW1tICYgMHg4MDAwMDAwMCkKKyAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQorCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOworfQorCisvKiBhZGQgaW1tMTYsIGRuICovCit2b2lkIE9QX0ZBQzAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdjsKKyAgdW5zaWduZWQgbG9uZyByZWcxLCBpbW0sIHZhbHVlOworCisgIHJlZzEgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXTsKKyAgaW1tID0gU0VYVDE2IChpbnNuICYgMHhmZmZmKTsKKyAgdmFsdWUgPSByZWcxICsgaW1tOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSA9IHZhbHVlOworCisgIHogPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKTsKKyAgYyA9ICh2YWx1ZSA8IHJlZzEpIHx8ICh2YWx1ZSA8IGltbSk7CisgIHYgPSAoKHJlZzEgJiAweDgwMDAwMDAwKSA9PSAoaW1tICYgMHg4MDAwMDAwMCkKKyAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQorCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOworfQorCisvKiBhZGQgaW1tMzIsZG4gKi8KK3ZvaWQgT1BfRkNDMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2OworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildOworICBpbW0gPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbjsKKyAgdmFsdWUgPSByZWcxICsgaW1tOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSA9IHZhbHVlOworCisgIHogPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKTsKKyAgYyA9ICh2YWx1ZSA8IHJlZzEpIHx8ICh2YWx1ZSA8IGltbSk7CisgIHYgPSAoKHJlZzEgJiAweDgwMDAwMDAwKSA9PSAoaW1tICYgMHg4MDAwMDAwMCkKKyAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQorCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOworfQorCisvKiBhZGQgaW1tOCwgYW4gKi8KK3ZvaWQgT1BfMjAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHosIGMsIG4sIHY7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKKworICByZWcxID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzggKGluc24pXTsKKyAgaW1tID0gU0VYVDggKGluc24gJiAweGZmKTsKKyAgdmFsdWUgPSByZWcxICsgaW1tOworICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfOCAoaW5zbildID0gdmFsdWU7CisKKyAgeiA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOworICBjID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgaW1tKTsKKyAgdiA9ICgocmVnMSAmIDB4ODAwMDAwMDApID09IChpbW0gJiAweDgwMDAwMDAwKQorICAgICAgICYmIChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCisJICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Cit9CisKKy8qIGFkZCBpbW0xNiwgYW4gKi8KK3ZvaWQgT1BfRkFEMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2OworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildOworICBpbW0gPSBTRVhUMTYgKGluc24gJiAweGZmZmYpOworICB2YWx1ZSA9IHJlZzEgKyBpbW07CisgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildID0gdmFsdWU7CisKKyAgeiA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOworICBjID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgaW1tKTsKKyAgdiA9ICgocmVnMSAmIDB4ODAwMDAwMDApID09IChpbW0gJiAweDgwMDAwMDAwKQorICAgICAgICYmIChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCisJICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Cit9CisKKy8qIGFkZCBpbW0zMiwgYW4gKi8KK3ZvaWQgT1BfRkNEMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2OworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildOworICBpbW0gPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbjsKKyAgdmFsdWUgPSByZWcxICsgaW1tOworICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXSA9IHZhbHVlOworCisgIHogPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKTsKKyAgYyA9ICh2YWx1ZSA8IHJlZzEpIHx8ICh2YWx1ZSA8IGltbSk7CisgIHYgPSAoKHJlZzEgJiAweDgwMDAwMDAwKSA9PSAoaW1tICYgMHg4MDAwMDAwMCkKKyAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQorCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOworfQorCisvKiBhZGQgaW1tOCwgc3AgKi8KK3ZvaWQgT1BfRjhGRTAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKKyAgaW1tID0gU0VYVDggKGluc24gJiAweGZmKTsKKyAgdmFsdWUgPSByZWcxICsgaW1tOworICBTdGF0ZS5yZWdzW1JFR19TUF0gPSB2YWx1ZTsKK30KKworLyogYWRkIGltbTE2LHNwICovCit2b2lkIE9QX0ZBRkUwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKKyAgaW1tID0gU0VYVDE2IChpbnNuICYgMHhmZmZmKTsKKyAgdmFsdWUgPSByZWcxICsgaW1tOworICBTdGF0ZS5yZWdzW1JFR19TUF0gPSB2YWx1ZTsKK30KKworLyogYWRkIGltbTMyLCBzcCAqLwordm9pZCBPUF9GQ0ZFMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgdW5zaWduZWQgbG9uZyByZWcxLCBpbW0sIHZhbHVlOworCisgIHJlZzEgPSBTdGF0ZS5yZWdzW1JFR19TUF07CisgIGltbSA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uOworICB2YWx1ZSA9IHJlZzEgKyBpbW07CisgIFN0YXRlLnJlZ3NbUkVHX1NQXSA9IHZhbHVlOworfQorCisvKiBhZGRjIGRtLGRuICovCit2b2lkIE9QX0YxNDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2OworICB1bnNpZ25lZCBsb25nIHJlZzEsIHJlZzIsIHZhbHVlOworCisgIHJlZzEgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKKyAgcmVnMiA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildOworICB2YWx1ZSA9IHJlZzEgKyByZWcyICsgKChQU1cgJiBQU1dfQykgIT0gMCk7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gdmFsdWU7CisKKyAgeiA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOworICBjID0gKHZhbHVlIDwgcmVnMSkgfHwgKHZhbHVlIDwgcmVnMik7CisgIHYgPSAoKHJlZzIgJiAweDgwMDAwMDAwKSA9PSAocmVnMSAmIDB4ODAwMDAwMDApCisgICAgICAgJiYgKHJlZzIgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKKwkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKK30KKworLyogc3ViIGRtLCBkbiAqLwordm9pZCBPUF9GMTAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdjsKKyAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCB2YWx1ZTsKKworICByZWcxID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07CisgIHJlZzIgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXTsKKyAgdmFsdWUgPSByZWcyIC0gcmVnMTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKKworICB6ID0gKHZhbHVlID09IDApOworICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7CisgIGMgPSAocmVnMSA+IHJlZzIpOworICB2ID0gKChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHJlZzEgJiAweDgwMDAwMDAwKQorICAgICAgICYmIChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCisJICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Cit9CisKKy8qIHN1YiBkbSwgYW4gKi8KK3ZvaWQgT1BfRjEyMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHosIGMsIG4sIHY7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOworICByZWcyID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV07CisgIHZhbHVlID0gcmVnMiAtIHJlZzE7CisgIFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildID0gdmFsdWU7CisKKyAgeiA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOworICBjID0gKHJlZzEgPiByZWcyKTsKKyAgdiA9ICgocmVnMiAmIDB4ODAwMDAwMDApICE9IChyZWcxICYgMHg4MDAwMDAwMCkKKyAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQorCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOworfQorCisvKiBzdWIgYW0sIGRuICovCit2b2lkIE9QX0YxMTAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2OworICB1bnNpZ25lZCBsb25nIHJlZzEsIHJlZzIsIHZhbHVlOworCisgIHJlZzEgPSBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXTsKKyAgcmVnMiA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildOworICB2YWx1ZSA9IHJlZzIgLSByZWcxOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHZhbHVlOworCisgIHogPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKTsKKyAgYyA9IChyZWcxID4gcmVnMik7CisgIHYgPSAoKHJlZzIgJiAweDgwMDAwMDAwKSAhPSAocmVnMSAmIDB4ODAwMDAwMDApCisgICAgICAgJiYgKHJlZzIgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKKwkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKK30KKworLyogc3ViIGFtLCBhbiAqLwordm9pZCBPUF9GMTMwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdjsKKyAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCB2YWx1ZTsKKworICByZWcxID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV07CisgIHJlZzIgPSBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXTsKKyAgdmFsdWUgPSByZWcyIC0gcmVnMTsKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKKworICB6ID0gKHZhbHVlID09IDApOworICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7CisgIGMgPSAocmVnMSA+IHJlZzIpOworICB2ID0gKChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHJlZzEgJiAweDgwMDAwMDAwKQorICAgICAgICYmIChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCisJICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Cit9CisKKy8qIHN1YiBpbW0zMiwgZG4gKi8KK3ZvaWQgT1BfRkNDNDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2OworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildOworICBpbW0gPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbjsKKyAgdmFsdWUgPSByZWcxIC0gaW1tOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSA9IHZhbHVlOworCisgIHogPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKTsKKyAgYyA9IChyZWcxIDwgaW1tKTsKKyAgdiA9ICgocmVnMSAmIDB4ODAwMDAwMDApICE9IChpbW0gJiAweDgwMDAwMDAwKQorICAgICAgICYmIChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCisJICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Cit9CisKKy8qIHN1YiBpbW0zMiwgYW4gKi8KK3ZvaWQgT1BfRkNENDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2OworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildOworICBpbW0gPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbjsKKyAgdmFsdWUgPSByZWcxIC0gaW1tOworICBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXSA9IHZhbHVlOworCisgIHogPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKTsKKyAgYyA9IChyZWcxIDwgaW1tKTsKKyAgdiA9ICgocmVnMSAmIDB4ODAwMDAwMDApICE9IChpbW0gJiAweDgwMDAwMDAwKQorICAgICAgICYmIChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCisJICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Cit9CisKKy8qIHN1YmMgZG0sIGRuICovCit2b2lkIE9QX0YxODAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2OworICB1bnNpZ25lZCBsb25nIHJlZzEsIHJlZzIsIHZhbHVlOworCisgIHJlZzEgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKKyAgcmVnMiA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildOworICB2YWx1ZSA9IHJlZzIgLSByZWcxIC0gKChQU1cgJiBQU1dfQykgIT0gMCk7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gdmFsdWU7CisKKyAgeiA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOworICBjID0gKHJlZzEgPiByZWcyKTsKKyAgdiA9ICgocmVnMiAmIDB4ODAwMDAwMDApICE9IChyZWcxICYgMHg4MDAwMDAwMCkKKyAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQorCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOworfQorCisvKiBtdWwgZG0sIGRuICovCit2b2lkIE9QX0YyNDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZW1wOworICBpbnQgbiwgejsKKworICB0ZW1wID0gKChzaWduZWQ2NCkoc2lnbmVkMzIpU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0KKyAgICAgICAgICAqICAoc2lnbmVkNjQpKHNpZ25lZDMyKVN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSB0ZW1wICYgMHhmZmZmZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfTURSXSA9ICh0ZW1wICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpID4+IDMyOzsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOworfQorCisvKiBtdWx1IGRtLCBkbiAqLwordm9pZCBPUF9GMjUwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIGxvbmcgdGVtcDsKKyAgaW50IG4sIHo7CisKKyAgdGVtcCA9ICgodW5zaWduZWQ2NClTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXQorICAgICAgICAgICogKHVuc2lnbmVkNjQpU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0pOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHRlbXAgJiAweGZmZmZmZmZmOworICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gKHRlbXAgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkgPj4gMzI7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPT0gMCk7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKK30KKworLyogZGl2IGRtLCBkbiAqLwordm9pZCBPUF9GMjYwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBsb25nIGxvbmcgdGVtcDsKKyAgaW50IG4sIHo7CisKKyAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX01EUl07CisgIHRlbXAgPDw9IDMyOworICB0ZW1wIHw9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildOworICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gdGVtcCAlIChsb25nKVN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOworICB0ZW1wIC89IChsb25nKVN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHRlbXAgJiAweGZmZmZmZmZmOworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Cit9CisKKy8qIGRpdnUgZG0sIGRuICovCit2b2lkIE9QX0YyNzAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZW1wOworICBpbnQgbiwgejsKKworICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfTURSXTsKKyAgdGVtcCA8PD0gMzI7CisgIHRlbXAgfD0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV07CisgIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSB0ZW1wICUgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07CisgIHRlbXAgLz0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gdGVtcCAmIDB4ZmZmZmZmZmY7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPT0gMCk7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKK30KKworLyogaW5jIGRuICovCit2b2lkIE9QXzQwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeixuLGMsdjsKKyAgdW5zaWduZWQgaW50IHZhbHVlLCBpbW0sIHJlZzE7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOworICBpbW0gPSAxOworICB2YWx1ZSA9IHJlZzEgKyBpbW07CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildID0gdmFsdWU7CisKKyAgeiA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOworICBjID0gKHZhbHVlIDwgaW1tKTsKKyAgdiA9ICgocmVnMSAmIDB4ODAwMDAwMDApID09IChpbW0gJiAweDgwMDAwMDAwKQorICAgICAgICYmIChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCisJICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Cit9CisKKy8qIGluYyBhbiAqLwordm9pZCBPUF80MSAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcxIChpbnNuKV0gKz0gMTsKK30KKworLyogaW5jNCBhbiAqLwordm9pZCBPUF81MCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0gKz0gNDsKK30KKworLyogY21wIGltbTgsIGRuICovCit2b2lkIE9QX0EwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2OworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV07CisgIGltbSA9IFNFWFQ4IChpbnNuICYgMHhmZik7CisgIHZhbHVlID0gcmVnMSAtIGltbTsKKworICB6ID0gKHZhbHVlID09IDApOworICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7CisgIGMgPSAocmVnMSA8IGltbSk7CisgIHYgPSAoKHJlZzEgJiAweDgwMDAwMDAwKSAhPSAoaW1tICYgMHg4MDAwMDAwMCkKKyAgICAgICAmJiAocmVnMSAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQorCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOworfQorCisvKiBjbXAgZG0sIGRuICovCit2b2lkIE9QX0EwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdjsKKyAgdW5zaWduZWQgbG9uZyByZWcxLCByZWcyLCB2YWx1ZTsKKworICByZWcxID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07CisgIHJlZzIgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXTsKKyAgdmFsdWUgPSByZWcyIC0gcmVnMTsKKworICB6ID0gKHZhbHVlID09IDApOworICBuID0gKHZhbHVlICYgMHg4MDAwMDAwMCk7CisgIGMgPSAocmVnMSA+IHJlZzIpOworICB2ID0gKChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHJlZzEgJiAweDgwMDAwMDAwKQorICAgICAgICYmIChyZWcyICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCisJICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Cit9CisKKy8qIGNtcCBkbSwgYW4gKi8KK3ZvaWQgT1BfRjFBMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHosIGMsIG4sIHY7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOworICByZWcyID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV07CisgIHZhbHVlID0gcmVnMiAtIHJlZzE7CisKKyAgeiA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOworICBjID0gKHJlZzEgPiByZWcyKTsKKyAgdiA9ICgocmVnMiAmIDB4ODAwMDAwMDApICE9IChyZWcxICYgMHg4MDAwMDAwMCkKKyAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQorCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOworfQorCisvKiBjbXAgYW0sIGRuICovCit2b2lkIE9QX0YxOTAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2OworICB1bnNpZ25lZCBsb25nIHJlZzEsIHJlZzIsIHZhbHVlOworCisgIHJlZzEgPSBTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzEgKGluc24pXTsKKyAgcmVnMiA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildOworICB2YWx1ZSA9IHJlZzIgLSByZWcxOworCisgIHogPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKTsKKyAgYyA9IChyZWcxID4gcmVnMik7CisgIHYgPSAoKHJlZzIgJiAweDgwMDAwMDAwKSAhPSAocmVnMSAmIDB4ODAwMDAwMDApCisgICAgICAgJiYgKHJlZzIgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKKwkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKK30KKworLyogY21wIGltbTgsIGFuICovCit2b2lkIE9QX0IwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2OworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF84IChpbnNuKV07CisgIGltbSA9IGluc24gJiAweGZmOworICB2YWx1ZSA9IHJlZzEgLSBpbW07CisKKyAgeiA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOworICBjID0gKHJlZzEgPCBpbW0pOworICB2ID0gKChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKGltbSAmIDB4ODAwMDAwMDApCisgICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKKwkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKK30KKworLyogY21wIGFtLCBhbiAqLwordm9pZCBPUF9CMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHosIGMsIG4sIHY7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgcmVnMiwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMSAoaW5zbildOworICByZWcyID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV07CisgIHZhbHVlID0gcmVnMiAtIHJlZzE7CisKKyAgeiA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOworICBjID0gKHJlZzEgPiByZWcyKTsKKyAgdiA9ICgocmVnMiAmIDB4ODAwMDAwMDApICE9IChyZWcxICYgMHg4MDAwMDAwMCkKKyAgICAgICAmJiAocmVnMiAmIDB4ODAwMDAwMDApICE9ICh2YWx1ZSAmIDB4ODAwMDAwMDApKTsKKworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKCBuID8gUFNXX04gOiAwKQorCSAgfCAoYyA/IFBTV19DIDogMCkgfCAodiA/IFBTV19WIDogMCkpOworfQorCisvKiBjbXAgaW1tMTYsIGRuICovCit2b2lkIE9QX0ZBQzgwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgYywgbiwgdjsKKyAgdW5zaWduZWQgbG9uZyByZWcxLCBpbW0sIHZhbHVlOworCisgIHJlZzEgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXTsKKyAgaW1tID0gU0VYVDE2IChpbnNuICYgMHhmZmZmKTsKKyAgdmFsdWUgPSByZWcxIC0gaW1tOworCisgIHogPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKTsKKyAgYyA9IChyZWcxIDwgaW1tKTsKKyAgdiA9ICgocmVnMSAmIDB4ODAwMDAwMDApICE9IChpbW0gJiAweDgwMDAwMDAwKQorICAgICAgICYmIChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCisJICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Cit9CisKKy8qIGNtcCBpbW0zMiwgZG4gKi8KK3ZvaWQgT1BfRkNDODAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2OworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildOworICBpbW0gPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbjsKKyAgdmFsdWUgPSByZWcxIC0gaW1tOworCisgIHogPSAodmFsdWUgPT0gMCk7CisgIG4gPSAodmFsdWUgJiAweDgwMDAwMDAwKTsKKyAgYyA9IChyZWcxIDwgaW1tKTsKKyAgdiA9ICgocmVnMSAmIDB4ODAwMDAwMDApICE9IChpbW0gJiAweDgwMDAwMDAwKQorICAgICAgICYmIChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKHZhbHVlICYgMHg4MDAwMDAwMCkpOworCisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAoIG4gPyBQU1dfTiA6IDApCisJICB8IChjID8gUFNXX0MgOiAwKSB8ICh2ID8gUFNXX1YgOiAwKSk7Cit9CisKKy8qIGNtcCBpbW0xNiwgYW4gKi8KK3ZvaWQgT1BfRkFEODAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB6LCBjLCBuLCB2OworICB1bnNpZ25lZCBsb25nIHJlZzEsIGltbSwgdmFsdWU7CisKKyAgcmVnMSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildOworICBpbW0gPSBpbnNuICYgMHhmZmZmOworICB2YWx1ZSA9IHJlZzEgLSBpbW07CisKKyAgeiA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOworICBjID0gKHJlZzEgPCBpbW0pOworICB2ID0gKChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKGltbSAmIDB4ODAwMDAwMDApCisgICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKKwkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKK30KKworLyogY21wIGltbTMyLCBhbiAqLwordm9pZCBPUF9GQ0Q4MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHosIGMsIG4sIHY7CisgIHVuc2lnbmVkIGxvbmcgcmVnMSwgaW1tLCB2YWx1ZTsKKworICByZWcxID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV07CisgIGltbSA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uOworICB2YWx1ZSA9IHJlZzEgLSBpbW07CisKKyAgeiA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApOworICBjID0gKHJlZzEgPCBpbW0pOworICB2ID0gKChyZWcxICYgMHg4MDAwMDAwMCkgIT0gKGltbSAmIDB4ODAwMDAwMDApCisgICAgICAgJiYgKHJlZzEgJiAweDgwMDAwMDAwKSAhPSAodmFsdWUgJiAweDgwMDAwMDAwKSk7CisKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8ICggbiA/IFBTV19OIDogMCkKKwkgIHwgKGMgPyBQU1dfQyA6IDApIHwgKHYgPyBQU1dfViA6IDApKTsKK30KKworLyogYW5kIGRtLCBkbiAqLwordm9pZCBPUF9GMjAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgbiwgejsKKworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOworfQorCisvKiBhbmQgaW1tOCwgZG4gKi8KK3ZvaWQgT1BfRjhFMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgbiwgejsKKworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildICY9IChpbnNuICYgMHhmZik7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Cit9CisKKy8qIGFuZCBpbW0xNiwgZG4gKi8KK3ZvaWQgT1BfRkFFMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCBuLCB6OworCisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildICY9IChpbnNuICYgMHhmZmZmKTsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOworfQorCisvKiBhbmQgaW1tMzIsIGRuICovCit2b2lkIE9QX0ZDRTAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgbiwgejsKKworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQorICAgICY9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uOworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Cit9CisKKy8qIGFuZCBpbW0xNiwgcHN3ICovCit2b2lkIE9QX0ZBRkMwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBQU1cgJj0gKGluc24gJiAweGZmZmYpOworfQorCisvKiBvciBkbSwgZG4qLwordm9pZCBPUF9GMjEwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgbiwgejsKKworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSB8PSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOworfQorCisvKiBvciBpbW04LCBkbiAqLwordm9pZCBPUF9GOEU0MDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCBuLCB6OworCisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gfD0gaW5zbiAmIDB4ZmY7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Cit9CisKKy8qIG9yIGltbTE2LCBkbiovCit2b2lkIE9QX0ZBRTQwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgbiwgejsKKworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSB8PSBpbnNuICYgMHhmZmZmOworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Cit9CisKKy8qIG9yIGltbTMyLCBkbiAqLwordm9pZCBPUF9GQ0U0MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IG4sIHo7CisKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0KKyAgICB8PSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbjsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOworfQorCisvKiBvciBpbW0xNixwc3cgKi8KK3ZvaWQgT1BfRkFGRDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFBTVyB8PSAoaW5zbiAmIDB4ZmZmZik7Cit9CisKKy8qIHhvciBkbSwgZG4gKi8KK3ZvaWQgT1BfRjIyMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IG4sIHo7CisKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gXj0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPT0gMCk7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKK30KKworLyogeG9yIGltbTE2LCBkbiAqLwordm9pZCBPUF9GQUU4MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IG4sIHo7CisKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzE2IChpbnNuKV0gXj0gaW5zbiAmIDB4ZmZmZjsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOworfQorCisvKiB4b3IgaW1tMzIsIGRuICovCit2b2lkIE9QX0ZDRTgwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgbiwgejsKKworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQorICAgIF49ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uOworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Cit9CisKKy8qIG5vdCBkbiAqLwordm9pZCBPUF9GMjMwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgbiwgejsKKworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IH5TdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXTsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOworfQorCisvKiBidHN0IGltbTgsIGRuICovCit2b2lkIE9QX0Y4RUMwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgdW5zaWduZWQgbG9uZyB0ZW1wOworICBpbnQgeiwgbjsKKworICB0ZW1wID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXTsKKyAgdGVtcCAmPSAoaW5zbiAmIDB4ZmYpOworICBuID0gKHRlbXAgJiAweDgwMDAwMDAwKSAhPSAwOworICB6ID0gKHRlbXAgPT0gMCk7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKTsKK30KKworLyogYnRzdCBpbW0xNiwgZG4gKi8KK3ZvaWQgT1BfRkFFQzAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGxvbmcgdGVtcDsKKyAgaW50IHosIG47CisKKyAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildOworICB0ZW1wICY9IChpbnNuICYgMHhmZmZmKTsKKyAgbiA9ICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgeiA9ICh0ZW1wID09IDApOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCk7Cit9CisKKy8qIGJ0c3QgaW1tMzIsIGRuICovCit2b2lkIE9QX0ZDRUMwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIHRlbXA7CisgIGludCB6LCBuOworCisgIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXTsKKyAgdGVtcCAmPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbjsKKyAgbiA9ICh0ZW1wICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgeiA9ICh0ZW1wID09IDApOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCk7Cit9CisKKy8qIGJ0c3QgaW1tOCwoYWJzMzIpICovCit2b2lkIE9QX0ZFMDIwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIHRlbXA7CisgIGludCBuLCB6OworCisgIHRlbXAgPSBsb2FkX2J5dGUgKCgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpIHwgKGV4dGVuc2lvbiA+PiA4KSk7CisgIHRlbXAgJj0gKGV4dGVuc2lvbiAmIDB4ZmYpOworICBuID0gKHRlbXAgJiAweDgwMDAwMDAwKSAhPSAwOworICB6ID0gKHRlbXAgPT0gMCk7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKTsKK30KKworLyogYnRzdCBpbW04LChkOCxhbikgKi8KK3ZvaWQgT1BfRkFGODAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGxvbmcgdGVtcDsKKyAgaW50IG4sIHo7CisKKyAgdGVtcCA9IGxvYWRfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildCisgICAgICAgICAgICAgICAgICAgICArIFNFWFQ4ICgoaW5zbiAmIDB4ZmYwMCkgPj4gOCkpKTsKKyAgdGVtcCAmPSAoaW5zbiAmIDB4ZmYpOworICBuID0gKHRlbXAgJiAweDgwMDAwMDAwKSAhPSAwOworICB6ID0gKHRlbXAgPT0gMCk7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKTsKK30KKworLyogYnNldCBkbSwgKGFuKSAqLwordm9pZCBPUF9GMDgwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIHRlbXA7CisgIGludCB6OworCisgIHRlbXAgPSBsb2FkX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildKTsKKyAgeiA9ICh0ZW1wICYgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV0pID09IDA7CisgIHRlbXAgfD0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07CisgIHN0b3JlX2J5dGUgKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildLCB0ZW1wKTsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKHogPyBQU1dfWiA6IDApOworfQorCisvKiBic2V0IGltbTgsIChhYnMzMikgKi8KK3ZvaWQgT1BfRkUwMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGxvbmcgdGVtcDsKKyAgaW50IHo7CisKKyAgdGVtcCA9IGxvYWRfYnl0ZSAoKChpbnNuICYgMHhmZmZmKSA8PCAxNiB8IChleHRlbnNpb24gPj4gOCkpKTsKKyAgeiA9ICh0ZW1wICYgKGV4dGVuc2lvbiAmIDB4ZmYpKSA9PSAwOworICB0ZW1wIHw9IChleHRlbnNpb24gJiAweGZmKTsKKyAgc3RvcmVfYnl0ZSAoKCgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpIHwgKGV4dGVuc2lvbiA+PiA4KSksIHRlbXApOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoeiA/IFBTV19aIDogMCk7Cit9CisKKy8qIGJzZXQgaW1tOCwoZDgsYW4pICovCit2b2lkIE9QX0ZBRjAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIHRlbXA7CisgIGludCB6OworCisgIHRlbXAgPSBsb2FkX2J5dGUgKChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzBfMTYgKGluc24pXQorICAgICAgICAgICAgICAgICAgICAgKyBTRVhUOCAoKGluc24gJiAweGZmMDApID4+IDgpKSk7CisgIHogPSAodGVtcCAmIChpbnNuICYgMHhmZikpID09IDA7CisgIHRlbXAgfD0gKGluc24gJiAweGZmKTsKKyAgc3RvcmVfYnl0ZSAoKFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMF8xNiAoaW5zbildCisJICAgICAgICsgU0VYVDggKChpbnNuICYgMHhmZjAwKSA+PiA4KSksIHRlbXApOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoeiA/IFBTV19aIDogMCk7Cit9CisKKy8qIGJjbHIgZG0sIChhbikgKi8KK3ZvaWQgT1BfRjA5MCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgdW5zaWduZWQgbG9uZyB0ZW1wOworICBpbnQgejsKKworICB0ZW1wID0gbG9hZF9ieXRlIChTdGF0ZS5yZWdzW1JFR19BMCArIFJFRzAgKGluc24pXSk7CisgIHogPSAodGVtcCAmIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKSA9PSAwOworICB0ZW1wID0gdGVtcCAmIH5TdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKKyAgc3RvcmVfYnl0ZSAoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0sIHRlbXApOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoeiA/IFBTV19aIDogMCk7Cit9CisKKy8qIGJjbHIgaW1tOCwgKGFiczMyKSAqLwordm9pZCBPUF9GRTAxMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgdW5zaWduZWQgbG9uZyB0ZW1wOworICBpbnQgejsKKworICB0ZW1wID0gbG9hZF9ieXRlICgoKGluc24gJiAweGZmZmYpIDw8IDE2KSB8IChleHRlbnNpb24gPj4gOCkpOworICB6ID0gKHRlbXAgJiAoZXh0ZW5zaW9uICYgMHhmZikpID09IDA7CisgIHRlbXAgPSB0ZW1wICYgfihleHRlbnNpb24gJiAweGZmKTsKKyAgc3RvcmVfYnl0ZSAoKChpbnNuICYgMHhmZmZmKSA8PCAxNikgfCAoZXh0ZW5zaW9uID4+IDgpLCB0ZW1wKTsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKHogPyBQU1dfWiA6IDApOworfQorCisvKiBiY2xyIGltbTgsKGQ4LGFuKSAqLwordm9pZCBPUF9GQUY0MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgdW5zaWduZWQgbG9uZyB0ZW1wOworICBpbnQgejsKKworICB0ZW1wID0gbG9hZF9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KKyAgICAgICAgICAgICAgICAgICAgICsgU0VYVDggKChpbnNuICYgMHhmZjAwKSA+PiA4KSkpOworICB6ID0gKHRlbXAgJiAoaW5zbiAmIDB4ZmYpKSA9PSAwOworICB0ZW1wID0gdGVtcCAmIH4oaW5zbiAmIDB4ZmYpOworICBzdG9yZV9ieXRlICgoU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwXzE2IChpbnNuKV0KKwkgICAgICAgKyBTRVhUOCAoKGluc24gJiAweGZmMDApID4+IDgpKSwgdGVtcCk7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICh6ID8gUFNXX1ogOiAwKTsKK30KKworLyogYXNyIGRtLCBkbiAqLwordm9pZCBPUF9GMkIwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBsb25nIHRlbXA7CisgIGludCB6LCBuLCBjOworCisgIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXTsKKyAgYyA9IHRlbXAgJiAxOworICB0ZW1wID4+PSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSB0ZW1wOworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkgfCAoYyA/IFBTV19DIDogMCkpOworfQorCisvKiBhc3IgaW1tOCwgZG4gKi8KK3ZvaWQgT1BfRjhDODAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBsb25nIHRlbXA7CisgIGludCB6LCBuLCBjOworCisgIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildOworICBjID0gdGVtcCAmIDE7CisgIHRlbXAgPj49IChpbnNuICYgMHhmZik7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gPSB0ZW1wOworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gPT0gMCk7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyk7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApIHwgKGMgPyBQU1dfQyA6IDApKTsKK30KKworLyogbHNyIGRtLCBkbiAqLwordm9pZCBPUF9GMkEwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgeiwgbiwgYzsKKworICBjID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAxOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXQorICAgID4+PSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyk7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApIHwgKGMgPyBQU1dfQyA6IDApKTsKK30KKworLyogbHNyIGltbTgsIGRuICovCit2b2lkIE9QX0Y4QzQwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHosIG4sIGM7CisKKyAgYyA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gJiAxOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildID4+PSAgKGluc24gJiAweGZmKTsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSB8IChjID8gUFNXX0MgOiAwKSk7Cit9CisKKy8qIGFzbCBkbSwgZG4gKi8KK3ZvaWQgT1BfRjI5MCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IG4sIHo7CisKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0KKyAgICA8PD0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcxIChpbnNuKV07CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPT0gMCk7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOworfQorCisvKiBhc2wgaW1tOCwgZG4gKi8KK3ZvaWQgT1BfRjhDMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBpbnQgbiwgejsKKworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildIDw8PSAoaW5zbiAmIDB4ZmYpOworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gPT0gMCk7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04pOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Cit9CisKKy8qIGFzbDIgZG4gKi8KK3ZvaWQgT1BfNTQgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCBuLCB6OworCisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildIDw8PSAyOworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKK30KKworLyogcm9yIGRuICovCit2b2lkIE9QX0YyODQgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisgIGludCBjLG4sejsKKworICB2YWx1ZSA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildOworICBjID0gKHZhbHVlICYgMHgxKTsKKworICB2YWx1ZSA+Pj0gMTsKKyAgdmFsdWUgfD0gKChQU1cgJiBQU1dfQykgIT0gMCkgPyAweDgwMDAwMDAwIDogMDsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKKyAgeiA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkgfCAoYyA/IFBTV19DIDogMCkpOworfQorCisvKiByb2wgZG4gKi8KK3ZvaWQgT1BfRjI4MCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKKyAgaW50IGMsbix6OworCisgIHZhbHVlID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV07CisgIGMgPSAodmFsdWUgJiAweDgwMDAwMDAwKSA/IDEgOiAwOworCisgIHZhbHVlIDw8PSAxOworICB2YWx1ZSB8PSAoKFBTVyAmIFBTV19DKSAhPSAwKTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSB2YWx1ZTsKKyAgeiA9ICh2YWx1ZSA9PSAwKTsKKyAgbiA9ICh2YWx1ZSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkgfCAoYyA/IFBTV19DIDogMCkpOworfQorCisvKiBiZXEgbGFiZWw6OCAqLwordm9pZCBPUF9DODAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAyIGFmdGVyIHdlIHJldHVybiwgc28KKyAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLworICBpZiAoUFNXICYgUFNXX1opCisgICAgU3RhdGUucmVnc1tSRUdfUENdICs9IFNFWFQ4IChpbnNuICYgMHhmZikgLSAyOworfQorCisvKiBibmUgbGFiZWw6OCAqLwordm9pZCBPUF9DOTAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAyIGFmdGVyIHdlIHJldHVybiwgc28KKyAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLworICBpZiAoIShQU1cgJiBQU1dfWikpCisgICAgU3RhdGUucmVnc1tSRUdfUENdICs9IFNFWFQ4IChpbnNuICYgMHhmZikgLSAyOworfQorCisvKiBiZ3QgbGFiZWw6OCAqLwordm9pZCBPUF9DMTAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAyIGFmdGVyIHdlIHJldHVybiwgc28KKyAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLworICBpZiAoISgoUFNXICYgUFNXX1opCisgICAgICAgIHx8ICgoKFBTVyAmIFBTV19OKSAhPSAwKSBeICgoUFNXICYgUFNXX1YpICE9IDApKSkpCisgICAgU3RhdGUucmVnc1tSRUdfUENdICs9IFNFWFQ4IChpbnNuICYgMHhmZikgLSAyOworfQorCisvKiBiZ2UgbGFiZWw6OCAqLwordm9pZCBPUF9DMjAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAyIGFmdGVyIHdlIHJldHVybiwgc28KKyAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLworICBpZiAoISgoKFBTVyAmIFBTV19OKSAhPSAwKSBeICgoUFNXICYgUFNXX1YpICE9IDApKSkKKyAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gU0VYVDggKGluc24gJiAweGZmKSAtIDI7Cit9CisKKy8qIGJsZSBsYWJlbDo4ICovCit2b2lkIE9QX0MzMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDIgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmICgoUFNXICYgUFNXX1opCisgICAgICAgfHwgKCgoUFNXICYgUFNXX04pICE9IDApIF4gKChQU1cgJiBQU1dfVikgIT0gMCkpKQorICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBTRVhUOCAoaW5zbiAmIDB4ZmYpIC0gMjsKK30KKworLyogYmx0IGxhYmVsOjggKi8KK3ZvaWQgT1BfQzAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMiBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKCgoUFNXICYgUFNXX04pICE9IDApIF4gKChQU1cgJiBQU1dfVikgIT0gMCkpCisgICAgU3RhdGUucmVnc1tSRUdfUENdICs9IFNFWFQ4IChpbnNuICYgMHhmZikgLSAyOworfQorCisvKiBiaGkgbGFiZWw6OCAqLwordm9pZCBPUF9DNTAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAyIGFmdGVyIHdlIHJldHVybiwgc28KKyAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLworICBpZiAoISgoKFBTVyAmIFBTV19DKSAhPSAwKSB8fCAoUFNXICYgUFNXX1opICE9IDApKQorICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBTRVhUOCAoaW5zbiAmIDB4ZmYpIC0gMjsKK30KKworLyogYmNjIGxhYmVsOjggKi8KK3ZvaWQgT1BfQzYwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMiBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKCEoUFNXICYgUFNXX0MpKQorICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBTRVhUOCAoaW5zbiAmIDB4ZmYpIC0gMjsKK30KKworLyogYmxzIGxhYmVsOjggKi8KK3ZvaWQgT1BfQzcwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMiBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKCgoUFNXICYgUFNXX0MpICE9IDApIHx8IChQU1cgJiBQU1dfWikgIT0gMCkKKyAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gU0VYVDggKGluc24gJiAweGZmKSAtIDI7Cit9CisKKy8qIGJjcyBsYWJlbDo4ICovCit2b2lkIE9QX0M0MDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDIgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmIChQU1cgJiBQU1dfQykKKyAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gU0VYVDggKGluc24gJiAweGZmKSAtIDI7Cit9CisKKy8qIGJ2YyBsYWJlbDo4ICovCit2b2lkIE9QX0Y4RTgwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMyBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKCEoUFNXICYgUFNXX1YpKQorICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBTRVhUOCAoaW5zbiAmIDB4ZmYpIC0gMzsKK30KKworLyogYnZzIGxhYmVsOjggKi8KK3ZvaWQgT1BfRjhFOTAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAzIGFmdGVyIHdlIHJldHVybiwgc28KKyAgICAgd2Ugc3VidHJhY3QgdHdvIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLworICBpZiAoUFNXICYgUFNXX1YpCisgICAgU3RhdGUucmVnc1tSRUdfUENdICs9IFNFWFQ4IChpbnNuICYgMHhmZikgLSAzOworfQorCisvKiBibmMgbGFiZWw6OCAqLwordm9pZCBPUF9GOEVBMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDMgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCB0d28gaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmICghKFBTVyAmIFBTV19OKSkKKyAgICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gU0VYVDggKGluc24gJiAweGZmKSAtIDM7Cit9CisKKy8qIGJucyBsYWJlbDo4ICovCit2b2lkIE9QX0Y4RUIwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMyBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKFBTVyAmIFBTV19OKQorICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSBTRVhUOCAoaW5zbiAmIDB4ZmYpIC0gMzsKK30KKworLyogYnJhIGxhYmVsOjggKi8KK3ZvaWQgT1BfQ0EwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMiBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IHR3byBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgU3RhdGUucmVnc1tSRUdfUENdICs9IFNFWFQ4IChpbnNuICYgMHhmZikgLSAyOworfQorCisvKiBsZXEgKi8KK3ZvaWQgT1BfRDggKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDEgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCBvbmUgaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmIChQU1cgJiBQU1dfWikKKyAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBTdGF0ZS5yZWdzW1JFR19MQVJdIC0gNCAtIDE7Cit9CisKKy8qIGxuZSAqLwordm9pZCBPUF9EOSAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMSBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IG9uZSBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKCEoUFNXICYgUFNXX1opKQorICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0IC0gMTsKK30KKworLyogbGd0ICovCit2b2lkIE9QX0QxIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAxIGFmdGVyIHdlIHJldHVybiwgc28KKyAgICAgd2Ugc3VidHJhY3Qgb25lIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLworICBpZiAoISgoUFNXICYgUFNXX1opCisgICAgICAgIHx8ICgoKFBTVyAmIFBTV19OKSAhPSAwKSBeICgoUFNXICYgUFNXX1YpICE9IDApKSkpCisgICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQgLSAxOworfQorCisvKiBsZ2UgKi8KK3ZvaWQgT1BfRDIgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDEgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCBvbmUgaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmICghKCgoUFNXICYgUFNXX04pICE9IDApIF4gKChQU1cgJiBQU1dfVikgIT0gMCkpKQorICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0IC0gMTsKK30KKworLyogbGxlICovCit2b2lkIE9QX0QzIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBUaGUgZGlzcGF0Y2hpbmcgY29kZSB3aWxsIGFkZCAxIGFmdGVyIHdlIHJldHVybiwgc28KKyAgICAgd2Ugc3VidHJhY3Qgb25lIGhlcmUgdG8gbWFrZSB0aGluZ3MgcmlnaHQuICAqLworICBpZiAoKFBTVyAmIFBTV19aKQorICAgICAgIHx8ICgoKFBTVyAmIFBTV19OKSAhPSAwKSBeICgoUFNXICYgUFNXX1YpICE9IDApKSkKKyAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBTdGF0ZS5yZWdzW1JFR19MQVJdIC0gNCAtIDE7Cit9CisKKy8qIGxsdCAqLwordm9pZCBPUF9EMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMSBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IG9uZSBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKCgoUFNXICYgUFNXX04pICE9IDApIF4gKChQU1cgJiBQU1dfVikgIT0gMCkpCisgICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQgLSAxOworfQorCisvKiBsaGkgKi8KK3ZvaWQgT1BfRDUgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDEgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCBvbmUgaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmICghKCgoUFNXICYgUFNXX0MpICE9IDApIHx8IChQU1cgJiBQU1dfWikgIT0gMCkpCisgICAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfTEFSXSAtIDQgLSAxOworfQorCisvKiBsY2MgKi8KK3ZvaWQgT1BfRDYgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIC8qIFRoZSBkaXNwYXRjaGluZyBjb2RlIHdpbGwgYWRkIDEgYWZ0ZXIgd2UgcmV0dXJuLCBzbworICAgICB3ZSBzdWJ0cmFjdCBvbmUgaGVyZSB0byBtYWtlIHRoaW5ncyByaWdodC4gICovCisgIGlmICghKFBTVyAmIFBTV19DKSkKKyAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBTdGF0ZS5yZWdzW1JFR19MQVJdIC0gNCAtIDE7Cit9CisKKy8qIGxscyAqLwordm9pZCBPUF9ENyAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMSBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IG9uZSBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKCgoUFNXICYgUFNXX0MpICE9IDApIHx8IChQU1cgJiBQU1dfWikgIT0gMCkKKyAgICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBTdGF0ZS5yZWdzW1JFR19MQVJdIC0gNCAtIDE7Cit9CisKKy8qIGxjcyAqLwordm9pZCBPUF9ENCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgLyogVGhlIGRpc3BhdGNoaW5nIGNvZGUgd2lsbCBhZGQgMSBhZnRlciB3ZSByZXR1cm4sIHNvCisgICAgIHdlIHN1YnRyYWN0IG9uZSBoZXJlIHRvIG1ha2UgdGhpbmdzIHJpZ2h0LiAgKi8KKyAgaWYgKFBTVyAmIFBTV19DKQorICAgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0xBUl0gLSA0IC0gMTsKK30KKworLyogbHJhICovCit2b2lkIE9QX0RBIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBTdGF0ZS5yZWdzW1JFR19MQVJdIC0gNCAtIDE7Cit9CisKKy8qIHNldGxiICovCit2b2lkIE9QX0RCIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICBTdGF0ZS5yZWdzW1JFR19MSVJdID0gbG9hZF9tZW1fYmlnIChTdGF0ZS5yZWdzW1JFR19QQ10gKyAxLCA0KTsKKyAgU3RhdGUucmVnc1tSRUdfTEFSXSA9IFN0YXRlLnJlZ3NbUkVHX1BDXSArIDU7Cit9CisKKy8qIGptcCAoYW4pICovCit2b2lkIE9QX0YwRjQgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IFN0YXRlLnJlZ3NbUkVHX0EwICsgUkVHMCAoaW5zbildIC0gMjsKK30KKworLyogam1wIGxhYmVsOjE2ICovCit2b2lkIE9QX0NDMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgU3RhdGUucmVnc1tSRUdfUENdICs9IFNFWFQxNiAoaW5zbiAmIDB4ZmZmZikgLSAzOworfQorCisvKiBqbXAgbGFiZWw6MzIgKi8KK3ZvaWQgT1BfREMwMDAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSAoKChpbnNuICYgMHhmZmZmZmYpIDw8IDgpICsgZXh0ZW5zaW9uKSAtIDU7Cit9CisKKy8qIGNhbGwgbGFiZWw6MTYscmVnX2xpc3QsaW1tOCAqLwordm9pZCBPUF9DRDAwMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgdW5zaWduZWQgaW50IG5leHRfcGMsIHNwOworICB1bnNpZ25lZCBsb25nIG1hc2s7CisKKyAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07CisgIG5leHRfcGMgPSBTdGF0ZS5yZWdzW1JFR19QQ10gKyA1OworICBTdGF0ZS5tZW1bc3BdID0gbmV4dF9wYyAmIDB4ZmY7CisgIFN0YXRlLm1lbVtzcCsxXSA9IChuZXh0X3BjICYgMHhmZjAwKSA+PiA4OworICBTdGF0ZS5tZW1bc3ArMl0gPSAobmV4dF9wYyAmIDB4ZmYwMDAwKSA+PiAxNjsKKyAgU3RhdGUubWVtW3NwKzNdID0gKG5leHRfcGMgJiAweGZmMDAwMDAwKSA+PiAyNDsKKworICBtYXNrID0gaW5zbiAmIDB4ZmY7CisKKyAgaWYgKG1hc2sgJiAweDgwKQorICAgIHsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAyXSk7CisgICAgfQorCisgIGlmIChtYXNrICYgMHg0MCkKKyAgICB7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0QwICsgM10pOworICAgIH0KKworICBpZiAobWFzayAmIDB4MjApCisgICAgeworICAgICAgc3AgLT0gNDsKKyAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19BMCArIDJdKTsKKyAgICB9CisKKyAgaWYgKG1hc2sgJiAweDEwKQorICAgIHsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfQTAgKyAzXSk7CisgICAgfQorCisgIGlmIChtYXNrICYgMHg4KQorICAgIHsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDBdKTsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAxXSk7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwXSk7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwICsgMV0pOworICAgICAgc3AgLT0gNDsKKyAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19NRFJdKTsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfTElSXSk7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0xBUl0pOworICAgICAgc3AgLT0gNDsKKyAgICB9CisKKyAgLyogVXBkYXRlIHRoZSBzdGFjayBwb2ludGVyLCBub3RlIHRoYXQgdGhlIHJlZ2lzdGVyIHNhdmVzIHRvIGRvIG5vdAorICAgICBtb2RpZnkgU1AuICBUaGUgU1AgYWRqdXN0bWVudCBpcyBkZXJpdmVkIHRvdGFsbHkgZnJvbSB0aGUgaW1tOAorICAgICBmaWVsZC4gICovCisgIFN0YXRlLnJlZ3NbUkVHX1NQXSAtPSBleHRlbnNpb247CisgIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSBuZXh0X3BjOworICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gU0VYVDE2ICgoaW5zbiAmIDB4ZmZmZjAwKSA+PiA4KSAtIDU7Cit9CisKKy8qIGNhbGwgbGFiZWw6MzIscmVnX2xpc3QsaW1tOCovCit2b2lkIE9QX0REMDAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBpbnQgbmV4dF9wYywgc3AsIGFkanVzdDsKKyAgdW5zaWduZWQgbG9uZyBtYXNrOworCisgIHNwID0gU3RhdGUucmVnc1tSRUdfU1BdOworICBuZXh0X3BjID0gU3RhdGUucmVnc1tSRUdfUENdICsgNzsKKyAgU3RhdGUubWVtW3NwXSA9IG5leHRfcGMgJiAweGZmOworICBTdGF0ZS5tZW1bc3ArMV0gPSAobmV4dF9wYyAmIDB4ZmYwMCkgPj4gODsKKyAgU3RhdGUubWVtW3NwKzJdID0gKG5leHRfcGMgJiAweGZmMDAwMCkgPj4gMTY7CisgIFN0YXRlLm1lbVtzcCszXSA9IChuZXh0X3BjICYgMHhmZjAwMDAwMCkgPj4gMjQ7CisKKyAgbWFzayA9IChleHRlbnNpb24gJiAweGZmMDApID4+IDg7CisKKyAgaWYgKG1hc2sgJiAweDgwKQorICAgIHsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAyXSk7CisgICAgfQorCisgIGlmIChtYXNrICYgMHg0MCkKKyAgICB7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0QwICsgM10pOworICAgIH0KKworICBpZiAobWFzayAmIDB4MjApCisgICAgeworICAgICAgc3AgLT0gNDsKKyAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19BMCArIDJdKTsKKyAgICB9CisKKyAgaWYgKG1hc2sgJiAweDEwKQorICAgIHsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfQTAgKyAzXSk7CisgICAgfQorCisgIGlmIChtYXNrICYgMHg4KQorICAgIHsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDBdKTsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfRDAgKyAxXSk7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwXSk7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0EwICsgMV0pOworICAgICAgc3AgLT0gNDsKKyAgICAgIHN0b3JlX3dvcmQgKHNwLCBTdGF0ZS5yZWdzW1JFR19NRFJdKTsKKyAgICAgIHNwIC09IDQ7CisgICAgICBzdG9yZV93b3JkIChzcCwgU3RhdGUucmVnc1tSRUdfTElSXSk7CisgICAgICBzcCAtPSA0OworICAgICAgc3RvcmVfd29yZCAoc3AsIFN0YXRlLnJlZ3NbUkVHX0xBUl0pOworICAgICAgc3AgLT0gNDsKKyAgICB9CisKKyAgLyogVXBkYXRlIHRoZSBzdGFjayBwb2ludGVyLCBub3RlIHRoYXQgdGhlIHJlZ2lzdGVyIHNhdmVzIHRvIGRvIG5vdAorICAgICBtb2RpZnkgU1AuICBUaGUgU1AgYWRqdXN0bWVudCBpcyBkZXJpdmVkIHRvdGFsbHkgZnJvbSB0aGUgaW1tOAorICAgICBmaWVsZC4gICovCisgIFN0YXRlLnJlZ3NbUkVHX1NQXSAtPSAoZXh0ZW5zaW9uICYgMHhmZik7CisgIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSBuZXh0X3BjOworICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gKCgoaW5zbiAmIDB4ZmZmZmZmKSA8PCA4KSB8ICgoZXh0ZW5zaW9uICYgMHhmZjAwMDApID4+IDE2KSkgLSA3OworfQorCisvKiBjYWxscyAoYW4pICovCit2b2lkIE9QX0YwRjAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGludCBuZXh0X3BjLCBzcDsKKworICBzcCA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKKyAgbmV4dF9wYyA9IFN0YXRlLnJlZ3NbUkVHX1BDXSArIDI7CisgIFN0YXRlLm1lbVtzcF0gPSBuZXh0X3BjICYgMHhmZjsKKyAgU3RhdGUubWVtW3NwKzFdID0gKG5leHRfcGMgJiAweGZmMDApID4+IDg7CisgIFN0YXRlLm1lbVtzcCsyXSA9IChuZXh0X3BjICYgMHhmZjAwMDApID4+IDE2OworICBTdGF0ZS5tZW1bc3ArM10gPSAobmV4dF9wYyAmIDB4ZmYwMDAwMDApID4+IDI0OworICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gbmV4dF9wYzsKKyAgU3RhdGUucmVnc1tSRUdfUENdID0gU3RhdGUucmVnc1tSRUdfQTAgKyBSRUcwIChpbnNuKV0gLSAyOworfQorCisvKiBjYWxscyBsYWJlbDoxNiAqLwordm9pZCBPUF9GQUZGMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgdW5zaWduZWQgaW50IG5leHRfcGMsIHNwOworCisgIHNwID0gU3RhdGUucmVnc1tSRUdfU1BdOworICBuZXh0X3BjID0gU3RhdGUucmVnc1tSRUdfUENdICsgNDsKKyAgU3RhdGUubWVtW3NwXSA9IG5leHRfcGMgJiAweGZmOworICBTdGF0ZS5tZW1bc3ArMV0gPSAobmV4dF9wYyAmIDB4ZmYwMCkgPj4gODsKKyAgU3RhdGUubWVtW3NwKzJdID0gKG5leHRfcGMgJiAweGZmMDAwMCkgPj4gMTY7CisgIFN0YXRlLm1lbVtzcCszXSA9IChuZXh0X3BjICYgMHhmZjAwMDAwMCkgPj4gMjQ7CisgIFN0YXRlLnJlZ3NbUkVHX01EUl0gPSBuZXh0X3BjOworICBTdGF0ZS5yZWdzW1JFR19QQ10gKz0gU0VYVDE2IChpbnNuICYgMHhmZmZmKSAtIDQ7Cit9CisKKy8qIGNhbGxzIGxhYmVsOjMyICovCit2b2lkIE9QX0ZDRkYwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBpbnQgbmV4dF9wYywgc3A7CisKKyAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07CisgIG5leHRfcGMgPSBTdGF0ZS5yZWdzW1JFR19QQ10gKyA2OworICBTdGF0ZS5tZW1bc3BdID0gbmV4dF9wYyAmIDB4ZmY7CisgIFN0YXRlLm1lbVtzcCsxXSA9IChuZXh0X3BjICYgMHhmZjAwKSA+PiA4OworICBTdGF0ZS5tZW1bc3ArMl0gPSAobmV4dF9wYyAmIDB4ZmYwMDAwKSA+PiAxNjsKKyAgU3RhdGUubWVtW3NwKzNdID0gKG5leHRfcGMgJiAweGZmMDAwMDAwKSA+PiAyNDsKKyAgU3RhdGUucmVnc1tSRUdfTURSXSA9IG5leHRfcGM7CisgIFN0YXRlLnJlZ3NbUkVHX1BDXSArPSAoKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBleHRlbnNpb24pIC0gNjsKK30KKworLyogcmV0IHJlZ19saXN0LCBpbW04ICovCit2b2lkIE9QX0RGMDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgdW5zaWduZWQgaW50IHNwLCBvZmZzZXQ7CisgIHVuc2lnbmVkIGxvbmcgbWFzazsKKworICBTdGF0ZS5yZWdzW1JFR19TUF0gKz0gaW5zbiAmIDB4ZmY7CisgIHNwID0gU3RhdGUucmVnc1tSRUdfU1BdOworCisgIG9mZnNldCA9IC00OworICBtYXNrID0gKGluc24gJiAweGZmMDApID4+IDg7CisKKyAgaWYgKG1hc2sgJiAweDgwKQorICAgIHsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgMl0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgIH0KKworICBpZiAobWFzayAmIDB4NDApCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyAzXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOworICAgICAgb2Zmc2V0IC09IDQ7CisgICAgfQorCisgIGlmIChtYXNrICYgMHgyMCkKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIDJdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7CisgICAgICBvZmZzZXQgLT0gNDsKKyAgICB9CisKKyAgaWYgKG1hc2sgJiAweDEwKQorICAgIHsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgM10gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgIH0KKworICBpZiAobWFzayAmIDB4OCkKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19EMF0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgICAgU3RhdGUucmVnc1tSRUdfRDAgKyAxXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOworICAgICAgb2Zmc2V0IC09IDQ7CisgICAgICBTdGF0ZS5yZWdzW1JFR19BMF0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyAxXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOworICAgICAgb2Zmc2V0IC09IDQ7CisgICAgICBTdGF0ZS5yZWdzW1JFR19NRFJdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7CisgICAgICBvZmZzZXQgLT0gNDsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0xJUl0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgICAgU3RhdGUucmVnc1tSRUdfTEFSXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOworICAgICAgb2Zmc2V0IC09IDQ7CisgICAgfQorCisgIC8qIFJlc3RvcmUgdGhlIFBDIHZhbHVlLiAgKi8KKyAgU3RhdGUucmVnc1tSRUdfUENdID0gKFN0YXRlLm1lbVtzcF0gfCAoU3RhdGUubWVtW3NwKzFdIDw8IDgpCisJICAgICAgfCAoU3RhdGUubWVtW3NwKzJdIDw8IDE2KSB8IChTdGF0ZS5tZW1bc3ArM10gPDwgMjQpKTsKKyAgU3RhdGUucmVnc1tSRUdfUENdIC09IDM7Cit9CisKKy8qIHJldGYgcmVnX2xpc3QsaW1tOCAqLwordm9pZCBPUF9ERTAwMDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGludCBzcCwgb2Zmc2V0OworICB1bnNpZ25lZCBsb25nIG1hc2s7CisKKyAgU3RhdGUucmVnc1tSRUdfU1BdICs9IChpbnNuICYgMHhmZik7CisgIHNwID0gU3RhdGUucmVnc1tSRUdfU1BdOworICBTdGF0ZS5yZWdzW1JFR19QQ10gPSBTdGF0ZS5yZWdzW1JFR19NRFJdIC0gMzsKKworICBvZmZzZXQgPSAtNDsKKyAgbWFzayA9IChpbnNuICYgMHhmZjAwKSA+PiA4OworCisgIGlmIChtYXNrICYgMHg4MCkKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19EMCArIDJdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7CisgICAgICBvZmZzZXQgLT0gNDsKKyAgICB9CisKKyAgaWYgKG1hc2sgJiAweDQwKQorICAgIHsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgM10gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgIH0KKworICBpZiAobWFzayAmIDB4MjApCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfQTAgKyAyXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOworICAgICAgb2Zmc2V0IC09IDQ7CisgICAgfQorCisgIGlmIChtYXNrICYgMHgxMCkKKyAgICB7CisgICAgICBTdGF0ZS5yZWdzW1JFR19BMCArIDNdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7CisgICAgICBvZmZzZXQgLT0gNDsKKyAgICB9CisKKyAgaWYgKG1hc2sgJiAweDgpCisgICAgeworICAgICAgU3RhdGUucmVnc1tSRUdfRDBdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7CisgICAgICBvZmZzZXQgLT0gNDsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0QwICsgMV0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgICAgU3RhdGUucmVnc1tSRUdfQTBdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7CisgICAgICBvZmZzZXQgLT0gNDsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0EwICsgMV0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgICAgU3RhdGUucmVnc1tSRUdfTURSXSA9IGxvYWRfd29yZCAoc3AgKyBvZmZzZXQpOworICAgICAgb2Zmc2V0IC09IDQ7CisgICAgICBTdGF0ZS5yZWdzW1JFR19MSVJdID0gbG9hZF93b3JkIChzcCArIG9mZnNldCk7CisgICAgICBvZmZzZXQgLT0gNDsKKyAgICAgIFN0YXRlLnJlZ3NbUkVHX0xBUl0gPSBsb2FkX3dvcmQgKHNwICsgb2Zmc2V0KTsKKyAgICAgIG9mZnNldCAtPSA0OworICAgIH0KK30KKworLyogcmV0cyAqLwordm9pZCBPUF9GMEZDIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBpbnQgc3A7CisKKyAgc3AgPSBTdGF0ZS5yZWdzW1JFR19TUF07CisgIFN0YXRlLnJlZ3NbUkVHX1BDXSA9IChTdGF0ZS5tZW1bc3BdIHwgKFN0YXRlLm1lbVtzcCsxXSA8PCA4KQorCSAgICAgIHwgKFN0YXRlLm1lbVtzcCsyXSA8PCAxNikgfCAoU3RhdGUubWVtW3NwKzNdIDw8IDI0KSk7CisgIFN0YXRlLnJlZ3NbUkVHX1BDXSAtPSAyOworfQorCisvKiBydGkgKi8KK3ZvaWQgT1BfRjBGRCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgdW5zaWduZWQgaW50IHNwLCBuZXh0X3BjOworCisgIHNwID0gU3RhdGUucmVnc1tSRUdfU1BdOworICBQU1cgPSBTdGF0ZS5tZW1bc3BdIHwgKFN0YXRlLm1lbVtzcCArIDFdIDw8IDgpOworICBTdGF0ZS5yZWdzW1JFR19QQ10gPSAoU3RhdGUubWVtW3NwKzRdIHwgKFN0YXRlLm1lbVtzcCs1XSA8PCA4KQorCSAgICAgIHwgKFN0YXRlLm1lbVtzcCs2XSA8PCAxNikgfCAoU3RhdGUubWVtW3NwKzddIDw8IDI0KSk7CisgIFN0YXRlLnJlZ3NbUkVHX1NQXSArPSA4OworfQorCisvKiB0cmFwICovCit2b2lkIE9QX0YwRkUgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGludCBzcCwgbmV4dF9wYzsKKworICBzcCA9IFN0YXRlLnJlZ3NbUkVHX1NQXTsKKyAgbmV4dF9wYyA9IFN0YXRlLnJlZ3NbUkVHX1BDXSArIDI7CisgIFN0YXRlLm1lbVtzcF0gPSBuZXh0X3BjICYgMHhmZjsKKyAgU3RhdGUubWVtW3NwKzFdID0gKG5leHRfcGMgJiAweGZmMDApID4+IDg7CisgIFN0YXRlLm1lbVtzcCsyXSA9IChuZXh0X3BjICYgMHhmZjAwMDApID4+IDE2OworICBTdGF0ZS5tZW1bc3ArM10gPSAobmV4dF9wYyAmIDB4ZmYwMDAwMDApID4+IDI0OworICBTdGF0ZS5yZWdzW1JFR19QQ10gPSAweDQwMDAwMDEwIC0gMjsKK30KKworLyogc3lzY2FsbCAqLwordm9pZCBPUF9GMEMwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICAvKiBXZSB1c2UgdGhpcyBmb3Igc2ltdWxhdGVkIHN5c3RlbSBjYWxsczsgd2UgbWF5IG5lZWQgdG8gY2hhbmdlCisgICAgIGl0IHRvIGEgcmVzZXJ2ZWQgaW5zdHJ1Y3Rpb24gaWYgd2UgY29uZmxpY3Qgd2l0aCB1c2VzIGF0CisgICAgIE1hdHN1c2hpdGEuICAqLworICBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwkKKyAgZXJybm8gPSAwOworCisvKiBSZWdpc3RlcnMgcGFzc2VkIHRvIHRyYXAgMCAqLworCisvKiBGdW5jdGlvbiBudW1iZXIuICAqLworI2RlZmluZSBGVU5DICAgKFN0YXRlLnJlZ3NbMF0pCisKKy8qIFBhcmFtZXRlcnMuICAqLworI2RlZmluZSBQQVJNMSAgIChTdGF0ZS5yZWdzWzFdKQorI2RlZmluZSBQQVJNMiAgIChsb2FkX3dvcmQgKFN0YXRlLnJlZ3NbUkVHX1NQXSArIDEyKSkKKyNkZWZpbmUgUEFSTTMgICAobG9hZF93b3JkIChTdGF0ZS5yZWdzW1JFR19TUF0gKyAxNikpCisKKy8qIFJlZ2lzdGVycyBzZXQgYnkgdHJhcCAwICovCisKKyNkZWZpbmUgUkVUVkFMIFN0YXRlLnJlZ3NbMF0JLyogcmV0dXJuIHZhbHVlICovCisjZGVmaW5lIFJFVEVSUiBTdGF0ZS5yZWdzWzFdCS8qIHJldHVybiBlcnJvciBjb2RlICovCisKKy8qIFR1cm4gYSBwb2ludGVyIGluIGEgcmVnaXN0ZXIgaW50byBhIHBvaW50ZXIgaW50byByZWFsIG1lbW9yeS4gKi8KKworI2RlZmluZSBNRU1QVFIoeCkgKFN0YXRlLm1lbSArIHgpCisKKyAgc3dpdGNoIChGVU5DKQorICAgIHsKKyNpZiAhZGVmaW5lZChfX0dPMzJfXykgJiYgIWRlZmluZWQoX1dJTjMyKQorI2lmZGVmIFRBUkdFVF9TWVNfZm9yaworICAgICAgY2FzZSBUQVJHRVRfU1lTX2Zvcms6CisgICAgICBSRVRWQUwgPSBmb3JrICgpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBUQVJHRVRfU1lTX2V4ZWN2ZQorICAgIGNhc2UgVEFSR0VUX1NZU19leGVjdmU6CisgICAgICBSRVRWQUwgPSBleGVjdmUgKE1FTVBUUiAoUEFSTTEpLCAoY2hhciAqKikgTUVNUFRSIChQQVJNMiksCisJCSAgICAgICAoY2hhciAqKilNRU1QVFIgKFBBUk0zKSk7CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIFRBUkdFVF9TWVNfZXhlY3YKKyAgICBjYXNlIFRBUkdFVF9TWVNfZXhlY3Y6CisgICAgICBSRVRWQUwgPSBleGVjdmUgKE1FTVBUUiAoUEFSTTEpLCAoY2hhciAqKikgTUVNUFRSIChQQVJNMiksIE5VTEwpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNlbmRpZgkvKiAhIEdPMzIgYW5kICEgV0lOMzIgKi8KKworICAgIGNhc2UgVEFSR0VUX1NZU19yZWFkOgorICAgICAgUkVUVkFMID0gbW4xMDMwMF9jYWxsYmFjay0+cmVhZCAobW4xMDMwMF9jYWxsYmFjaywgUEFSTTEsCisJCQkJICAgIE1FTVBUUiAoUEFSTTIpLCBQQVJNMyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRBUkdFVF9TWVNfd3JpdGU6CisgICAgICBSRVRWQUwgPSAoaW50KW1uMTAzMDBfY2FsbGJhY2stPndyaXRlIChtbjEwMzAwX2NhbGxiYWNrLCBQQVJNMSwKKwkJCQkJICAgICBNRU1QVFIgKFBBUk0yKSwgUEFSTTMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQVJHRVRfU1lTX2xzZWVrOgorICAgICAgUkVUVkFMID0gbW4xMDMwMF9jYWxsYmFjay0+bHNlZWsgKG1uMTAzMDBfY2FsbGJhY2ssIFBBUk0xLCBQQVJNMiwgUEFSTTMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQVJHRVRfU1lTX2Nsb3NlOgorICAgICAgUkVUVkFMID0gbW4xMDMwMF9jYWxsYmFjay0+Y2xvc2UgKG1uMTAzMDBfY2FsbGJhY2ssIFBBUk0xKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFSR0VUX1NZU19vcGVuOgorICAgICAgUkVUVkFMID0gbW4xMDMwMF9jYWxsYmFjay0+b3BlbiAobW4xMDMwMF9jYWxsYmFjaywgTUVNUFRSIChQQVJNMSksIFBBUk0yKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFSR0VUX1NZU19leGl0OgorICAgICAgLyogRVhJVCAtIGNhbGxlciBjYW4gbG9vayBpbiBQQVJNMSB0byB3b3JrIG91dCB0aGUgCisJIHJlYXNvbiAqLworICAgICAgaWYgKFBBUk0xID09IDB4ZGVhZCkKKwlTdGF0ZS5leGNlcHRpb24gPSBTSUdBQlJUOworICAgICAgZWxzZQorCVN0YXRlLmV4Y2VwdGlvbiA9IFNJR1FVSVQ7CisgICAgICBTdGF0ZS5leGl0ZWQgPSAxOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRBUkdFVF9TWVNfc3RhdDoJLyogYWRkZWQgYXQgaG1zaSAqLworICAgICAgLyogc3RhdCBzeXN0ZW0gY2FsbCAqLworICAgICAgeworCXN0cnVjdCBzdGF0IGhvc3Rfc3RhdDsKKwlyZWdfdCBidWY7CisKKwlSRVRWQUwgPSBzdGF0IChNRU1QVFIgKFBBUk0xKSwgJmhvc3Rfc3RhdCk7CisJCisJYnVmID0gUEFSTTI7CisKKwkvKiBKdXN0IHdpbGQtYXNzZWQgZ3Vlc3Nlcy4gICovCisJc3RvcmVfaGFsZiAoYnVmLCBob3N0X3N0YXQuc3RfZGV2KTsKKwlzdG9yZV9oYWxmIChidWYgKyAyLCBob3N0X3N0YXQuc3RfaW5vKTsKKwlzdG9yZV93b3JkIChidWYgKyA0LCBob3N0X3N0YXQuc3RfbW9kZSk7CisJc3RvcmVfaGFsZiAoYnVmICsgOCwgaG9zdF9zdGF0LnN0X25saW5rKTsKKwlzdG9yZV9oYWxmIChidWYgKyAxMCwgaG9zdF9zdGF0LnN0X3VpZCk7CisJc3RvcmVfaGFsZiAoYnVmICsgMTIsIGhvc3Rfc3RhdC5zdF9naWQpOworCXN0b3JlX2hhbGYgKGJ1ZiArIDE0LCBob3N0X3N0YXQuc3RfcmRldik7CisJc3RvcmVfd29yZCAoYnVmICsgMTYsIGhvc3Rfc3RhdC5zdF9zaXplKTsKKwlzdG9yZV93b3JkIChidWYgKyAyMCwgaG9zdF9zdGF0LnN0X2F0aW1lKTsKKwlzdG9yZV93b3JkIChidWYgKyAyOCwgaG9zdF9zdGF0LnN0X210aW1lKTsKKwlzdG9yZV93b3JkIChidWYgKyAzNiwgaG9zdF9zdGF0LnN0X2N0aW1lKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisjaWZkZWYgVEFSR0VUX1NZU19jaG93bgorICAgIGNhc2UgVEFSR0VUX1NZU19jaG93bjoKKyAgICAgIFJFVFZBTCA9IGNob3duIChNRU1QVFIgKFBBUk0xKSwgUEFSTTIsIFBBUk0zKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBUQVJHRVRfU1lTX2NobW9kOgorICAgICAgUkVUVkFMID0gY2htb2QgKE1FTVBUUiAoUEFSTTEpLCBQQVJNMik7CisgICAgICBicmVhazsKKyNpZmRlZiBUQVJHRVRfU1lTX3RpbWUKKyAgICBjYXNlIFRBUkdFVF9TWVNfdGltZToKKyAgICAgIFJFVFZBTCA9IHRpbWUgKCh2b2lkKikgTUVNUFRSIChQQVJNMSkpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBUQVJHRVRfU1lTX3RpbWVzCisgICAgY2FzZSBUQVJHRVRfU1lTX3RpbWVzOgorICAgICAgeworCXN0cnVjdCB0bXMgdG1zOworCVJFVFZBTCA9IHRpbWVzICgmdG1zKTsKKwlzdG9yZV93b3JkIChQQVJNMSwgdG1zLnRtc191dGltZSk7CisJc3RvcmVfd29yZCAoUEFSTTEgKyA0LCB0bXMudG1zX3N0aW1lKTsKKwlzdG9yZV93b3JkIChQQVJNMSArIDgsIHRtcy50bXNfY3V0aW1lKTsKKwlzdG9yZV93b3JkIChQQVJNMSArIDEyLCB0bXMudG1zX2NzdGltZSk7CisJYnJlYWs7CisgICAgICB9CisjZW5kaWYKKyNpZmRlZiBUQVJHRVRfU1lTX2dldHRpbWVvZmRheQorICAgIGNhc2UgVEFSR0VUX1NZU19nZXR0aW1lb2ZkYXk6CisgICAgICB7CisJc3RydWN0IHRpbWV2YWwgdDsKKwlzdHJ1Y3QgdGltZXpvbmUgdHo7CisJUkVUVkFMID0gZ2V0dGltZW9mZGF5ICgmdCwgJnR6KTsKKwlzdG9yZV93b3JkIChQQVJNMSwgdC50dl9zZWMpOworCXN0b3JlX3dvcmQgKFBBUk0xICsgNCwgdC50dl91c2VjKTsKKwlzdG9yZV93b3JkIChQQVJNMiwgdHoudHpfbWludXRlc3dlc3QpOworCXN0b3JlX3dvcmQgKFBBUk0yICsgNCwgdHoudHpfZHN0dGltZSk7CisJYnJlYWs7CisgICAgICB9CisjZW5kaWYKKyNpZmRlZiBUQVJHRVRfU1lTX3V0aW1lCisgICAgY2FzZSBUQVJHRVRfU1lTX3V0aW1lOgorICAgICAgLyogQ2FzdCB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHZvaWQgKiwgdG8gYXZvaWQgdHlwZSBtaXNtYXRjaAorCSBpZiBhIHByb3RvdHlwZSBpcyBwcmVzZW50LiAgKi8KKyAgICAgIFJFVFZBTCA9IHV0aW1lIChNRU1QVFIgKFBBUk0xKSwgKHZvaWQgKikgTUVNUFRSIChQQVJNMikpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorICBSRVRFUlIgPSBlcnJubzsKKyAgZXJybm8gPSBzYXZlX2Vycm5vOworfQorCisvKiBydG0gKi8KK3ZvaWQgT1BfRjBGRiAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyBhYm9ydCAoKTsKK30KKworLyogbm9wICovCit2b2lkIE9QX0NCIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworfQorCisvKiBwdXR4IGRtLGRtICovCit2b2lkIE9QX0Y1MDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLnJlZ3NbUkVHX01EUlFdID0gU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV07Cit9CisKKy8qIGdldHggZG0sZG0gKi8KK3ZvaWQgT1BfRjZGMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHosIG47CisgIHogPSAoU3RhdGUucmVnc1tSRUdfTURSUV0gPT0gMCk7CisgIG4gPSAoKFN0YXRlLnJlZ3NbUkVHX01EUlFdICYgMHg4MDAwMDAwMCkgIT0gMCk7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gU3RhdGUucmVnc1tSRUdfTURSUV07CisKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApOworfQorCisvKiBtdWxxIGRtLGRuICovCit2b2lkIE9QX0Y2MDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZW1wOworICBpbnQgbiwgejsKKworICB0ZW1wID0gKChzaWduZWQ2NCkoc2lnbmVkMzIpU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0KKyAgICAgICAgICAqICAoc2lnbmVkNjQpKHNpZ25lZDMyKVN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSB0ZW1wICYgMHhmZmZmZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfTURSUV0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjs7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPT0gMCk7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKK30KKworLyogbXVscSBpbW04LGRuICovCit2b2lkIE9QX0Y5MDAwMCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgdW5zaWduZWQgbG9uZyBsb25nIHRlbXA7CisgIGludCBuLCB6OworCisgIHRlbXAgPSAoKHNpZ25lZDY0KShzaWduZWQzMilTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildCisgICAgICAgICAgKiAoc2lnbmVkNjQpKHNpZ25lZDMyKVNFWFQ4IChpbnNuICYgMHhmZikpOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildID0gdGVtcCAmIDB4ZmZmZmZmZmY7CisgIFN0YXRlLnJlZ3NbUkVHX01EUlFdID0gKHRlbXAgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkgPj4gMzI7OworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gPT0gMCk7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOworfQorCisvKiBtdWxxIGltbTE2LGRuICovCit2b2lkIE9QX0ZCMDAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIGxvbmcgdGVtcDsKKyAgaW50IG4sIHo7CisKKyAgdGVtcCA9ICgoc2lnbmVkNjQpKHNpZ25lZDMyKVN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCisgICAgICAgICAgKiAoc2lnbmVkNjQpKHNpZ25lZDMyKVNFWFQxNiAoaW5zbiAmIDB4ZmZmZikpOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSA9IHRlbXAgJiAweGZmZmZmZmZmOworICBTdGF0ZS5yZWdzW1JFR19NRFJRXSA9ICh0ZW1wICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpID4+IDMyOzsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOworfQorCisvKiBtdWxxIGltbTMyLGRuICovCit2b2lkIE9QX0ZEMDAwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIGxvbmcgdGVtcDsKKyAgaW50IG4sIHo7CisKKyAgdGVtcCA9ICgoc2lnbmVkNjQpKHNpZ25lZDMyKVN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildCisgICAgICAgICAgKiAoc2lnbmVkNjQpKHNpZ25lZDMyKSgoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGV4dGVuc2lvbikpOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSA9IHRlbXAgJiAweGZmZmZmZmZmOworICBTdGF0ZS5yZWdzW1JFR19NRFJRXSA9ICh0ZW1wICYgMHhmZmZmZmZmZjAwMDAwMDAwTEwpID4+IDMyOzsKKyAgeiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXSAmIDB4ODAwMDAwMDApICE9IDA7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX04gfCBQU1dfQyB8IFBTV19WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAobiA/IFBTV19OIDogMCkpOworfQorCisvKiBtdWxxdSBkbSxkbiAqLwordm9pZCBPUF9GNjEwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIGxvbmcgdGVtcDsKKyAgaW50IG4sIHo7CisKKyAgdGVtcCA9ICgodW5zaWduZWQ2NCkgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0KKwkgICogKHVuc2lnbmVkNjQpIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildKTsKKyAgU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPSB0ZW1wICYgMHhmZmZmZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfTURSUV0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjs7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gPT0gMCk7CisgIG4gPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDgwMDAwMDAwKSAhPSAwOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19OIHwgUFNXX0MgfCBQU1dfVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKG4gPyBQU1dfTiA6IDApKTsKK30KKworLyogbXVscXUgaW1tOCxkbiAqLwordm9pZCBPUF9GOTE0MDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZW1wOworICBpbnQgbiwgejsKKworICB0ZW1wID0gKCh1bnNpZ25lZDY0KVN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0KKwkgICogKHVuc2lnbmVkNjQpU0VYVDggKGluc24gJiAweGZmKSk7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF84IChpbnNuKV0gPSB0ZW1wICYgMHhmZmZmZmZmZjsKKyAgU3RhdGUucmVnc1tSRUdfTURSUV0gPSAodGVtcCAmIDB4ZmZmZmZmZmYwMDAwMDAwMExMKSA+PiAzMjs7CisgIHogPSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwXzggKGluc24pXSA9PSAwKTsKKyAgbiA9IChTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfOCAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Cit9CisKKy8qIG11bHF1IGltbTE2LGRuICovCit2b2lkIE9QX0ZCMTQwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIGxvbmcgdGVtcDsKKyAgaW50IG4sIHo7CisKKyAgdGVtcCA9ICgodW5zaWduZWQ2NClTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQorCSAgKiAodW5zaWduZWQ2NCkgU0VYVDE2IChpbnNuICYgMHhmZmZmKSk7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID0gdGVtcCAmIDB4ZmZmZmZmZmY7CisgIFN0YXRlLnJlZ3NbUkVHX01EUlFdID0gKHRlbXAgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkgPj4gMzI7OworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Cit9CisKKy8qIG11bHF1IGltbTMyLGRuICovCit2b2lkIE9QX0ZEMTQwMDAwIChpbnNuLCBleHRlbnNpb24pCisgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgZXh0ZW5zaW9uOworeworICB1bnNpZ25lZCBsb25nIGxvbmcgdGVtcDsKKyAgaW50IG4sIHo7CisKKyAgdGVtcCA9ICgodW5zaWduZWQ2NClTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzBfMTYgKGluc24pXQorICAgICAgICAgICogKHVuc2lnbmVkNjQpKCgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgZXh0ZW5zaW9uKSk7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID0gdGVtcCAmIDB4ZmZmZmZmZmY7CisgIFN0YXRlLnJlZ3NbUkVHX01EUlFdID0gKHRlbXAgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkgPj4gMzI7OworICB6ID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildID09IDApOworICBuID0gKFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMF8xNiAoaW5zbildICYgMHg4MDAwMDAwMCkgIT0gMDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfTiB8IFBTV19DIHwgUFNXX1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChuID8gUFNXX04gOiAwKSk7Cit9CisKKy8qIHNhdDE2IGRtLGRuICovCit2b2lkIE9QX0Y2NDAgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIGludCB0ZW1wOworCisgIHRlbXAgPSBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzEgKGluc24pXTsKKyAgdGVtcCA9ICh0ZW1wID4gMHg3ZmZmID8gMHg3ZmZmIDogdGVtcCk7CisgIHRlbXAgPSAodGVtcCA8IC0weDgwMDAgPyAtMHg4MDAwIDogdGVtcCk7CisgIFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMCAoaW5zbildID0gdGVtcDsKK30KKworLyogc2F0MjQgZG0sZG4gKi8KK3ZvaWQgT1BfRjY1MCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHRlbXA7CisKKyAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOworICB0ZW1wID0gKHRlbXAgPiAweDdmZmZmZiA/IDB4N2ZmZmZmIDogdGVtcCk7CisgIHRlbXAgPSAodGVtcCA8IC0weDgwMDAwMCA/IC0weDgwMDAwMCA6IHRlbXApOworICBTdGF0ZS5yZWdzW1JFR19EMCArIFJFRzAgKGluc24pXSA9IHRlbXA7Cit9CisKKy8qIGJzY2ggZG0sZG4gKi8KK3ZvaWQgT1BfRjY3MCAoaW5zbiwgZXh0ZW5zaW9uKQorICAgICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbjsKK3sKKyAgaW50IHRlbXAsIGM7CisKKyAgdGVtcCA9IFN0YXRlLnJlZ3NbUkVHX0QwICsgUkVHMSAoaW5zbildOworICB0ZW1wIDw8PSAoU3RhdGUucmVnc1tSRUdfRDAgKyBSRUcwIChpbnNuKV0gJiAweDFmKTsKKyAgYyA9ICh0ZW1wICE9IDAgPyAxIDogMCk7CisgIFBTVyAmPSB+KFBTV19DKTsKKyAgUFNXIHw9IChjID8gUFNXX0MgOiAwKTsKK30KKworLyogYnJlYWtwb2ludCAqLwordm9pZAorT1BfRkYgKGluc24sIGV4dGVuc2lvbikKKyAgICAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb247Cit7CisgIFN0YXRlLmV4Y2VwdGlvbiA9IFNJR1RSQVA7CisgIFBDIC09IDE7Cit9CisKZGlmZiAtLWdpdCBhL3NpbS9tbjEwMzAwL3Rjb25maWcuaW4gYi9zaW0vbW4xMDMwMC90Y29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMWI2ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vbW4xMDMwMC90Y29uZmlnLmluCkBAIC0wLDAgKzEsMjYgQEAKKy8qIG1uMTAzMDAgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gZmlsZS4gICovCisKKy8qIEZJWE1FOiBUaGlzIGlzIHVubmVjZXNzYXJpbHkgbmVjZXNzYXJ5OiAqLworI2luY2x1ZGUgImFuc2lkZWNsLmgiCisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlICJyZW1vdGUtc2ltLmgiCisjaW5jbHVkZSAic2ltLW1vZHVsZS5oIgorCitNT0RVTEVfSU5TVEFMTF9GTiBkdl9zb2Nrc2VyX2luc3RhbGw7CisjZGVmaW5lIE1PRFVMRV9MSVNUIGR2X3NvY2tzZXJfaW5zdGFsbCwKKworLyogRGVmaW5lIHRoaXMgaWYgdGhlIHNpbXVsYXRvciBzdXBwb3J0cyBwcm9maWxpbmcuCisgICBTZWUgdGhlIG1pcHMgc2ltdWxhdG9yIGZvciBhbiBleGFtcGxlLgorICAgVGhpcyBlbmFibGVzIHRoZSBgLXAgZm9vJyBhbmQgYC1zIGJhcicgb3B0aW9ucy4KKyAgIFRoZSB0YXJnZXQgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzaW1fc2V0X3Byb2ZpbGV7LF9zaXplfS4gICovCisvKiAjZGVmaW5lIFNJTV9IQVZFX1BST0ZJTEUgKi8KKworLyogRGVmaW5lIHRoaXMgaWYgdGhlIHNpbXVsYXRvciB1c2VzIGFuIGluc3RydWN0aW9uIGNhY2hlLgorICAgU2VlIHRoZSBoOC8zMDAgc2ltdWxhdG9yIGZvciBhbiBleGFtcGxlLgorICAgVGhpcyBlbmFibGVzIHRoZSBgLWMgc2l6ZScgb3B0aW9uIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUuCisgICBUaGUgdGFyZ2V0IGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgc2ltX3NldF9zaW1jYWNoZV9zaXplLiAgKi8KKy8qICNkZWZpbmUgU0lNX0hBVkVfU0lNQ0FDSEUgKi8KKworLyogRGVmaW5lIHRoaXMgaWYgdGhlIHRhcmdldCBjcHUgaXMgYmktZW5kaWFuCisgICBhbmQgdGhlIHNpbXVsYXRvciBzdXBwb3J0cyBpdC4gICovCisvKiAjZGVmaW5lIFNJTV9IQVZFX0JJRU5ESUFOICovCmRpZmYgLS1naXQgYS9zaW0vcHBjLy5nZGJpbml0IGIvc2ltL3BwYy8uZ2RiaW5pdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWU2MmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy8uZ2RiaW5pdApAQCAtMCwwICsxLDIgQEAKK3NldCBvdXRwdXQtcmFkaXggMTYKK2JyZWFrIGVycm9yCmRpZmYgLS1naXQgYS9zaW0vcHBjL0JVR1MgYi9zaW0vcHBjL0JVR1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyYjA3OQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvQlVHUwpAQCAtMCwwICsxLDEyMyBAQAorQ2hhbmdlTG9nCisKK1NlZSB0aGUgQ2hhbmdlTG9nIGZpbGUgbG9va2luZyBmb3IgbGluZXMgdGFnZWQgd2l0aCB0aGUgd29yZCBGSVhNRS4KKworCitDT1JFRklMRS5DOgorCitUaGUgaW1wbGVtZW50YXRpb24gb2YgY29yZWZpbGUuYyAoZGVmaW5lZCBieSBjb3JlZmlsZS5oKSBpc24ndCB0aGUKK2Jlc3QuICBJdCBpcyBpbnRlbmRlZCB0byBiZSBmdW5jdGlvbmFseSBjb3JyZWN0IHJhdGhlciB0aGFuIGZhc3QuICBPbmUKK29wdGlvbiBiZWluZyBjb25zaWRlcmVkIGlzIHRvIGFkZCBhIGRhdGEgY2FjaGUgdG8gcmVkdWNlIHRoZSBvdmVyaGVhZAorb2YgdGhlIG1vc3QgY29tbW9uIGNhc2Ugb2YgZGF0YSByZWFkL3dyaXRlcy4KKworCitWRUE6CisKK01pc3NpbmcgVkVBIHN5c3RlbSBjYWxscy4KKworcHBjLWluc3RydWN0aW9uczoKKworTWlzc2luZyBvciBjb21tZW50ZWQgb3V0IGluc3RydWN0aW9ucy4KKworCis2NGJpdDoKKworNjRiaXQgdGFyZ2V0IHVudGVzdGVkLiA2NGJpdCBob3N0IGJyb2tlbi4gIEZvciBpbnN0YW5jZSB1c2Ugb2Ygc2NhbmYKKyIleCIsICZsb25nIGxvbmcuCisKKworCitod18qLmM6CisKK0JldHRlciBhbmQgbW9yZSBkZXZpY2VzLgorCitQT1JUQUJJTElUWToKKworKE5vdGVzIHRha2VuIGZyb20gTWljaGFlbCBNZWlzc25lcik6IEhlYXZ5IHVzZSBvZiB0aGUgIyMgb3BlcmF0b3IgLQorZml4IHVzaW5nIHRoZSBjbGFzaWMgWC8qKi9ZIGhhY2s7IFVzZSBvZiB0aGUgc2lnbmVkIGtleXdvcmQuICBJbgorcGFydGljdWxhciwgc2lnbmVkIGNoYXIgaGFzIG5vIGFuYWxvZ3VlIGluIGNsYXNzaWMgQyAodGhvdWdoIG1vc3QKK2ltcGxlbWVudGF0aW9ucyBvZiBjbGFzc2ljIEMgdXNlIHNpZ25lZCBjaGFycyk7IFVzZSBvZiBsb25nIGxvbmcgd2hpY2gKK3Jlc3RyaWN0cyB0aGUgdGFyZ2V0IGNvbXBpbGVyIHRvIGJlIEdDQy4KKworCitUUkFDSU5HOgorCitkZWJ1Zy5jOiBNYWNybydzIHNob3VsZCBiZSBleHRlbmRlZCB0byBpbmNsdWRlOgorCisJSVNfKlRSQUNFOglUcnVlIGlmIHRyYWNpbmcgZW5hYmxlZAorCSpUUkFDRV9QUkVGSVg6CU91dHB1dHMganVzdCB0aGUgcHJlZml4IGxpbmUKKworaHdfdHJhY2UuYzogRmx1c2gsIHJlcGxhY2Ugd2l0aCBhIHBzaW1fc2V0X3RyYWNpbmcgb3Igc29tZQorCXN1Y2ggcHJvZ3JhbS4KKworCitDSUEvTklBOgorCitSZXBsYWNlIHdpdGggZnVuY3Rpb25zIHRvIHJldHVybi9pbmNyZW1lbnQgdGhlIENJQT8KKworCisKK1NNUCAmIEdEQjoKKworR0RCIGRvZXNuJ3QgdW5kZXJzdGFuZCBTTVAhCisKKworCisKK09WRVJBTEwgU1RSVUNUVVJFOgorCitBIG5ldyBmaWxlIHBzdHJ1Y3QuaCBpcyB0byBiZSBjcmVhdGVkIHRoYXQgY29udGFpbnMgYSBzaW5nbGUgZmxhdCBkYXRhCitzdHJ1Y3R1cmUgY29udGFpbmluZzoKKworCQlwc3RydWN0IHsKKwkJCWV2ZW50czsKKwkJCWNvcmU7CisJCQlwcm9jZXNzb3JbbnJfY3B1c107CisJCQltb25pdG9yOworCQkJZGV2aWNlczsKKwkJCXRyYWNlOworCQl9CisKK1RoZSBDUFUncyBzdHJ1Y3R1cmUsIGluIHR1cm4gd291bGQgY29udGFpbiB0aGUgVk0gc3ViIHN0cnVjdHVyZXMuCisKK1doZW4gU01QPT0wLCBldmVyeXRoaW5nIHdvdWxkIGhhdmUgUFNUUlVDVCBwYXNzZWQuICBJbiBTTVAgbW9kZSwKK2hvd2V2ZXIsIHRoZXJlIGFyZSB0d28gY2hvaWNlczogUFNUUlVDVCArIENQVV9OUiBvciBQUk9DRVNTT1IuICBJCitzdXNwZWN0IHRoZSBsYXR0ZXIgaXMgYmV0dGVyLgorCitJdCBpcyBiZWxpZXZlZCB0aGF0IHRoaXMgd291bGQgc2lnbmlmaWNhbnRseSBpbXByb3ZlIHBlcmZvcm1hbmNlIChhdAordGhlIHByaWNlIG9mIHJlZHVjZWQgY29udHJvbCBvdmVyIG9iamVjdCBzY29wZSkuCisKKworCisKK0lHRU46CisKK0lnZW4gYXQgcHJlc2VudCBjYW4ndCBkbyB0aGUgZm9sbG93aW5nOgorCisJbwlkdXBsaWNhdGlvbiBpcyBhbiBhbGwgb3Igbm90aGluZyBhZmFpci4KKworCQlJdCBzaG91bGQgYmUgY29uZmlndXJhYmxlIGFjY29yZGluZyB0bworCQl0aGUgaW5zdHJ1Y3Rpb24gb3IgdGhlIHN1Yi10YWJsZS4KKworCisJbwlEdWUgdG8gdGhlIG5hbWluZywgb25seSBhIHNpbmdsZSBnZW5lcmF0ZWQKKwkJc2ltdWxhdG9yIGNhbiBiZSBpbmNsdWRlZCBpbiBhIHByb2dyYW0uCisKKwkJSUdFTiBzaG91bGQgYmUgYWJsZSB0byBnZW5lcmF0ZSBtdWx0aXBsZQorCQllbmdpbmVzIHRoYXQgY2FuIGFsbCBiZSBpbmNsdWRlZCBpbiBhIHByb2dyYW0KKworCW8JaGFuZGxlIGFsdGVybmF0ZSBhcmNoaXRlY3R1cmVzLgorCisKKwlvCUlnZW4gc2hvdWxkIHN1cHBvcnQgdGhlIGdlbmVyYXRpb24gb2YgYQorCQlkaXNhc2VtYmxlciBhbmQgcG9zaWJseSBhbiBhc3NlbWJsZXIuCisKKwkJSSBzdWdnZXN0IHRoYXQgdGhlIHRhYmxlIGJlIGV4dGVuZGVkIHRvCisJCWluY2x1ZGUsIGZvciBlYWNoIGluc3RydWN0aW9uLCBhZGRpdGlvbmFsCisJCWxpbmVzIGRlc2NyaWJpbmcgdGhlIGV4dHVhbCBmb3JtYXQgb2YgdGhlCisJCWluc3RydWN0aW9uLgorCisJCU9uZSBwb3NzaWJsZSBmb3JtYXQgaXM6CisKKwkJCSJtdGxyICVSUyI6U1BSLnNvbWV0aGluZworCQkJIm10c3ByICVTUFIsICVSUyIKZGlmZiAtLWdpdCBhL3NpbS9wcGMvQ09QWUlORyBiL3NpbS9wcGMvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDU0OWJlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9DT1BZSU5HCkBAIC0wLDAgKzEsMzQwIEBACisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3NpbS9wcGMvQ09QWUlORy5MSUIgYi9zaW0vcHBjL0NPUFlJTkcuTElCCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNjg1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL0NPUFlJTkcuTElCCkBAIC0wLDAgKzEsNDgxIEBACisJCSAgR05VIExJQlJBUlkgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgICAgICAgICAgICAgICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworW1RoaXMgaXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgR1BMLiAgSXQgaXMKKyBudW1iZXJlZCAyIGJlY2F1c2UgaXQgZ29lcyB3aXRoIHZlcnNpb24gMiBvZiB0aGUgb3JkaW5hcnkgR1BMLl0KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKK2ZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4KKworICBUaGlzIGxpY2Vuc2UsIHRoZSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gc29tZQorc3BlY2lhbGx5IGRlc2lnbmF0ZWQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlLCBhbmQgdG8gYW55CitvdGhlciBsaWJyYXJpZXMgd2hvc2UgYXV0aG9ycyBkZWNpZGUgdG8gdXNlIGl0LiAgWW91IGNhbiB1c2UgaXQgZm9yCit5b3VyIGxpYnJhcmllcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmCit5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKK29yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKK3lvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKK2NvZGUuICBJZiB5b3UgbGluayBhIHByb2dyYW0gd2l0aCB0aGUgbGlicmFyeSwgeW91IG11c3QgcHJvdmlkZQorY29tcGxldGUgb2JqZWN0IGZpbGVzIHRvIHRoZSByZWNpcGllbnRzIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KK3dpdGggdGhlIGxpYnJhcnksIGFmdGVyIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5IGFuZCByZWNvbXBpbGluZworaXQuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCisKKyAgT3VyIG1ldGhvZCBvZiBwcm90ZWN0aW5nIHlvdXIgcmlnaHRzIGhhcyB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQKK3RoZSBsaWJyYXJ5LCBhbmQgKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCitwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KKworICBBbHNvLCBmb3IgZWFjaCBkaXN0cmlidXRvcidzIHByb3RlY3Rpb24sIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorbGlicmFyeS4gIElmIHRoZSBsaWJyYXJ5IGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbAordmVyc2lvbiwgc28gdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbgordGhlIG9yaWdpbmFsIGF1dGhvcnMnIHJlcHV0YXRpb25zLgorDAorICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IGNvbXBhbmllcyBkaXN0cmlidXRpbmcgZnJlZQorc29mdHdhcmUgd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgdGh1cyBpbiBlZmZlY3QKK3RyYW5zZm9ybWluZyB0aGUgcHJvZ3JhbSBpbnRvIHByb3ByaWV0YXJ5IHNvZnR3YXJlLiAgVG8gcHJldmVudCB0aGlzLAord2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzCitmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlIG9yZGluYXJ5CitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2hpY2ggd2FzIGRlc2lnbmVkIGZvciB1dGlsaXR5IHByb2dyYW1zLiAgVGhpcworbGljZW5zZSwgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbgorZGVzaWduYXRlZCBsaWJyYXJpZXMuICBUaGlzIGxpY2Vuc2UgaXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5CitvbmU7IGJlIHN1cmUgdG8gcmVhZCBpdCBpbiBmdWxsLCBhbmQgZG9uJ3QgYXNzdW1lIHRoYXQgYW55dGhpbmcgaW4gaXQgaXMKK3RoZSBzYW1lIGFzIGluIHRoZSBvcmRpbmFyeSBsaWNlbnNlLgorCisgIFRoZSByZWFzb24gd2UgaGF2ZSBhIHNlcGFyYXRlIHB1YmxpYyBsaWNlbnNlIGZvciBzb21lIGxpYnJhcmllcyBpcyB0aGF0Cit0aGV5IGJsdXIgdGhlIGRpc3RpbmN0aW9uIHdlIHVzdWFsbHkgbWFrZSBiZXR3ZWVuIG1vZGlmeWluZyBvciBhZGRpbmcgdG8gYQorcHJvZ3JhbSBhbmQgc2ltcGx5IHVzaW5nIGl0LiAgTGlua2luZyBhIHByb2dyYW0gd2l0aCBhIGxpYnJhcnksIHdpdGhvdXQKK2NoYW5naW5nIHRoZSBsaWJyYXJ5LCBpcyBpbiBzb21lIHNlbnNlIHNpbXBseSB1c2luZyB0aGUgbGlicmFyeSwgYW5kIGlzCithbmFsb2dvdXMgdG8gcnVubmluZyBhIHV0aWxpdHkgcHJvZ3JhbSBvciBhcHBsaWNhdGlvbiBwcm9ncmFtLiAgSG93ZXZlciwgaW4KK2EgdGV4dHVhbCBhbmQgbGVnYWwgc2Vuc2UsIHRoZSBsaW5rZWQgZXhlY3V0YWJsZSBpcyBhIGNvbWJpbmVkIHdvcmssIGEKK2Rlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnksIGFuZCB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQordHJlYXRzIGl0IGFzIHN1Y2guCisKKyAgQmVjYXVzZSBvZiB0aGlzIGJsdXJyZWQgZGlzdGluY3Rpb24sIHVzaW5nIHRoZSBvcmRpbmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBmb3IgbGlicmFyaWVzIGRpZCBub3QgZWZmZWN0aXZlbHkgcHJvbW90ZSBzb2Z0d2FyZQorc2hhcmluZywgYmVjYXVzZSBtb3N0IGRldmVsb3BlcnMgZGlkIG5vdCB1c2UgdGhlIGxpYnJhcmllcy4gIFdlCitjb25jbHVkZWQgdGhhdCB3ZWFrZXIgY29uZGl0aW9ucyBtaWdodCBwcm9tb3RlIHNoYXJpbmcgYmV0dGVyLgorCisgIEhvd2V2ZXIsIHVucmVzdHJpY3RlZCBsaW5raW5nIG9mIG5vbi1mcmVlIHByb2dyYW1zIHdvdWxkIGRlcHJpdmUgdGhlCit1c2VycyBvZiB0aG9zZSBwcm9ncmFtcyBvZiBhbGwgYmVuZWZpdCBmcm9tIHRoZSBmcmVlIHN0YXR1cyBvZiB0aGUKK2xpYnJhcmllcyB0aGVtc2VsdmVzLiAgVGhpcyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW50ZW5kZWQgdG8KK3Blcm1pdCBkZXZlbG9wZXJzIG9mIG5vbi1mcmVlIHByb2dyYW1zIHRvIHVzZSBmcmVlIGxpYnJhcmllcywgd2hpbGUKK3ByZXNlcnZpbmcgeW91ciBmcmVlZG9tIGFzIGEgdXNlciBvZiBzdWNoIHByb2dyYW1zIHRvIGNoYW5nZSB0aGUgZnJlZQorbGlicmFyaWVzIHRoYXQgYXJlIGluY29ycG9yYXRlZCBpbiB0aGVtLiAgKFdlIGhhdmUgbm90IHNlZW4gaG93IHRvIGFjaGlldmUKK3RoaXMgYXMgcmVnYXJkcyBjaGFuZ2VzIGluIGhlYWRlciBmaWxlcywgYnV0IHdlIGhhdmUgYWNoaWV2ZWQgaXQgYXMgcmVnYXJkcworY2hhbmdlcyBpbiB0aGUgYWN0dWFsIGZ1bmN0aW9ucyBvZiB0aGUgTGlicmFyeS4pICBUaGUgaG9wZSBpcyB0aGF0IHRoaXMKK3dpbGwgbGVhZCB0byBmYXN0ZXIgZGV2ZWxvcG1lbnQgb2YgZnJlZSBsaWJyYXJpZXMuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQorIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKK2Zvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hpbGUgdGhlIGxhdHRlciBvbmx5Cit3b3JrcyB0b2dldGhlciB3aXRoIHRoZSBsaWJyYXJ5LgorCisgIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgYSBsaWJyYXJ5IHRvIGJlIGNvdmVyZWQgYnkgdGhlIG9yZGluYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJhdGhlciB0aGFuIGJ5IHRoaXMgc3BlY2lhbCBvbmUuCisMCisJCSAgR05VIExJQlJBUlkgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IHdoaWNoCitjb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgb3Igb3RoZXIgYXV0aG9yaXplZAorcGFydHkgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWJyYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuICBFYWNoIGxpY2Vuc2VlIGlzCithZGRyZXNzZWQgYXMgInlvdSIuCisKKyAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQorcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCisod2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgorCisgIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrCit3aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgorY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKK3BvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKK3N0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKK2luY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pCisKKyAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMKK2FsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCitpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24KK2FuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20KK3N1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3IKK3dyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKK2FuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgorICAKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgTGlicmFyeSdzCitjb21wbGV0ZSBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdAoreW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4KK2FwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0CithbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueQord2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUKK0xpYnJhcnkuCisKKyAgWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwKK2FuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEKK2ZlZS4KKwwKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgorCisgICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubworICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCisgICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcworICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKKyAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKKyAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKKyAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgorICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KKworICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCisgICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQorICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55CisgICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKKyAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQorICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCisKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKK2l0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Cit3aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCit0aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCit0aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCitpbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Cit0aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCit0aGVzZSBub3RpY2VzLgorDAorICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCit0aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbAorc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KKworICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKK3RoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4KKworICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcgorZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KK3VuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQoraXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaAorbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCisKKyAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKK2Zyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCitzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8KK2Rpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKyAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKK0xpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKK2xpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhCit3b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCit0aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkKK2NyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdAorY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUKK2xpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgorU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCisKKyAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKK3RoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQorZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuCitXaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQorbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKK3RocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuCisKKyAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKK3N0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQorZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdAorZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQord29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUKK0xpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCisKKyAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkKK2Rpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgorQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCit3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuCisMCisgIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21waWxlIG9yCitsaW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQord29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKK3VuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKK21vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQorZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCisKKyAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCitMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKK3RoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKK2R1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCitjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCitkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCitvZiB0aGVzZSB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZworICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgorICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCisgICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKKyAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQKKyAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQorICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCisgICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKKyAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKKyAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgorICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQorCisgICAgYikgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQKKyAgICBsZWFzdCB0aHJlZSB5ZWFycywgdG8gZ2l2ZSB0aGUgc2FtZSB1c2VyIHRoZSBtYXRlcmlhbHMKKyAgICBzcGVjaWZpZWQgaW4gU3Vic2VjdGlvbiA2YSwgYWJvdmUsIGZvciBhIGNoYXJnZSBubyBtb3JlCisgICAgdGhhbiB0aGUgY29zdCBvZiBwZXJmb3JtaW5nIHRoaXMgZGlzdHJpYnV0aW9uLgorCisgICAgYykgSWYgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKKyAgICBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUgYWJvdmUKKyAgICBzcGVjaWZpZWQgbWF0ZXJpYWxzIGZyb20gdGhlIHNhbWUgcGxhY2UuCisKKyAgICBkKSBWZXJpZnkgdGhhdCB0aGUgdXNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlc2UKKyAgICBtYXRlcmlhbHMgb3IgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyB1c2VyIGEgY29weS4KKworICBGb3IgYW4gZXhlY3V0YWJsZSwgdGhlIHJlcXVpcmVkIGZvcm0gb2YgdGhlICJ3b3JrIHRoYXQgdXNlcyB0aGUKK0xpYnJhcnkiIG11c3QgaW5jbHVkZSBhbnkgZGF0YSBhbmQgdXRpbGl0eSBwcm9ncmFtcyBuZWVkZWQgZm9yCityZXByb2R1Y2luZyB0aGUgZXhlY3V0YWJsZSBmcm9tIGl0LiAgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwKK3RoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkKK2Rpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgorY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgord2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwordGhlIGV4ZWN1dGFibGUuCisKKyAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKK3Jlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKK2FjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QKK3VzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKK2Rpc3RyaWJ1dGUuCisMCisgIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5CitmYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCitsaWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KK3RoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQorcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCisgICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQorICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICAgIFNlY3Rpb25zIGFib3ZlLgorCisgICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKKyAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZworICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KKworICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQordGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKK2F0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCityaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCitvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCit0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKK3N1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisMCisgIDExLiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkgYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQorcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5LAorYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworICAxMi4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBMaWJyYXJ5IGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBMaWJyYXJ5IHVuZGVyIHRoaXMgTGljZW5zZSBtYXkgYWRkCithbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywKK3NvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nIGNvdW50cmllcyBub3QgdGh1cworZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlIGxpbWl0YXRpb24gYXMgaWYKK3dyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEzLiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldwordmVyc2lvbnMgb2YgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4KK1N1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwKK2J1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgTGlicmFyeQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCisiYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCitsaWNlbnNlIHZlcnNpb24gbnVtYmVyLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKwwKKyAgMTQuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAord3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKK2NvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCitkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCitvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZworYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCitXQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgorRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKK09USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCitLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCitMSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQorVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDE2LiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCitXUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQorQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKK0ZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCitMSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HCitSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQorRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgorU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorICAgICBBcHBlbmRpeDogSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB3ZSByZWNvbW1lbmQgbWFraW5nIGl0IGZyZWUgc29mdHdhcmUgdGhhdAorZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCityZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKK29yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UpLgorCisgIFRvIGFwcGx5IHRoZXNlIHRlcm1zLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBsaWJyYXJ5LiAgSXQgaXMKK3NhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUKKyJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCisgIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzIFJhbmRvbSBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwCisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCmRpZmYgLS1naXQgYS9zaW0vcHBjL0NoYW5nZUxvZyBiL3NpbS9wcGMvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5Y2Y4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL0NoYW5nZUxvZwpAQCAtMCwwICsxLDMxODMgQEAKKzE5OTktMDItMDEgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KKworCU1ha2UgdGhlIHNpbXVsYXRvciBjb21wYXRpYmxlIHdpdGggdGhlIE1QQzc1MC4gIEl0IHdvdWxkIGJlIG5pY2VyCisJdG8gbWFrZSB0aGlzIGEgcmVhbCBtdWx0aS1zaW0sIGJ1dCB0aGF0J3MgbW9yZSB3b3JrIHRoYW4gd2UgaGF2ZQorCXRpbWUgZm9yLgorCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfb3B0aW9ucyk6IE9ubHkgcmVxdWlyZSBzdHJpY3QKKwlhbGlnbm1lbnQgaWYgaXQgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGF0IGNvbmZpZ3VyYXRpb24gdGltZS4KKwlEb24ndCBtYWtlIGl0IHRoZSBkZWZhdWx0IGZvciBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLgorCSogcHBjLXNwci10YWJsZSAoVU1NQ1IwLCBVTU1DUjEsIFVQTUMxLCBVUE1DMiwgVVNJQSwgVVBNQzMsIFVQTUM0LAorIAlNTUNSMCwgUE1DMSwgUE1DMiwgU0lBLCBNTUNSMSwgUE1DMywgUE1DNCwgTDJDUiwgSUNUQywgVEhSTTEsCisgCVRIUk0yLCBUSFJNMyk6IFBsb3AgaW4gdGhlIE1QQzc1MCBTUFIgcmVnaXN0ZXJzLgorCShEQUJSKTogVGhpcyBpcyB3ZWlyZC4gIFRoaXMgd2FzIEhJRDUsIGJ1dCB0aGUgUFBDIHNwZWMgc2F5cyB0aGlzCisgCXNob3VsZCBiZSBEQUJSOyB3aHkgZGlkIHNvbWUgcmFuZG9tIHByb2Nlc3NvciB1c2UgaXQgZm9yIHNvbWV0aGluZworIAllbHNlPyAgVGhlIEhJRDUgZW50cnkgZGF0ZXMgYmFjayB0byB0aGUgb3JpZ2luYWwgY2hlY2tpbiBvZiB0aGUKKwlzaW11bGF0b3IgY29kZSBpbiAxOTk1LCBzbyByZW1vdmUgaXQuCisJKiBzaW1fY2FsbHMuYyAocmVnaXN0ZXJfbmFtZXMpOiBEZWxldGUgdGhpczsgc2luY2UgdGhlIHVzZXIgY2FuCisJbm93IGNoYW5nZSBHREIncyBsaXN0IG9mIHJlZ2lzdGVyIG5hbWVzIGR5bmFtaWNhbGx5LCB3ZSBjYW4ndAorCXByZXRlbmQgdGhlcmUncyBhIHN0YXRpYyBtYXBwaW5nIGhlcmUuCisJKHNpbV9mZXRjaF9yZWdpc3Rlciwgc2ltX3N0b3JlX3JlZ2lzdGVyKTogQ2FsbCBHREIncyBSRUdJU1RFUl9OQU1FCisgCWZ1bmN0aW9uIHRvIGdldCB0aGUgcmVnaXN0ZXIgbmFtZS4gIFRoYXQgb3VnaHQgdG8gYmUgYWNjdXJhdGUuCisgIAlIb3dldmVyLCB3ZSdyZSBjaGFuZ2luZyBhIGNvbXBpbGUtdGltZSBkZXBlbmRlbmN5ICh1c2luZyB0aGUKKyAJUkVHSVNURVJfTkFNRVMgbWFjcm8pIGludG8gYSBsaW5rLSBhbmQgcnVuLXRpbWUgZGVwZW5kZW5jeQorCShjYWxsaW5nIFJFR0lTVEVSX05BTUUsIHdoaWNoIGhhcHBlbnMgdG8gYmUgYSBmdW5jdGlvbiBjYWxsIG9uIHRoZQorCVBQQykuCisKKzE5OTktMDEtMjIgIEppbSBMZW1rZSA8amxlbWtlQGN5Z251cy5jb20+CisKKwkqIGlnZW4uYyhnZW5fc2VtYW50aWNzX1tjaF0pOiBzZXR1cC91c2Ugb2YgbmV3IG9wdGlvbgorCSgtbyBtcGM4NjBjMFs9bl0pLgorCWludGVycnVwdHMuW2NoXShtcGM4NjBjMF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk6IGFkZGVkLgorCXBwYy1pbnN0cnVjdGlvbnModGhlIGZvdXIgYnJhbmNoIGluc24gZ3JvdXBzKTogZGV0ZWN0IHByb2JsZW1hdGljIGJyJ3MuCisJcHNpbS5jKGlzX251bSAtIGFkZGVkLCBwc2ltX29wdGlvbnMpOiBQYXJzZSBhbmQgaW5pdCBuZXcgb3B0aW9uLgorCVRoZXNlIGNoYW5nZXMgYXJlIGN1cnJlbnRseSB1bmRlciAjaWZkZWYgV0lUSF9PUFRJT05fTVBDODYwQzAuCisKKzE5OTgtMTItMDEgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgorCisJKiBod19udnJhbS5jIChod19udnJhbV9iY2QpOiBGb3JjZSB2YWx1ZSB0byBmaXQgaW4gMC4uOTkuCisKK0ZyaSBOb3YgMjAgMTI6MTc6MjggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBtYWluLmMgKHNpbV9pb19wb2xsX3F1aXQpOiBTdHViIGZ1bmN0aW9uLgorCisJKiBldmVudHMuYyAoU0lNX0VWRU5UU19QT0xMX1JBVEUpOiBEZWZpbmUuCisJKHNpbV9ldmVudHNfcG9sbCk6IENvcHkgZnVuY3Rpb24gZnJvbSBjb21tb24vc2ltLWV2ZW50cy5jLgorCShldmVudF9xdWV1ZV9pbml0KTogQ29weSBzY2hlZHVsaW5nIG9mIHNpbV9ldmVudHNfcG9sbCBmcm9tIHNhbWUuCisKKwkqIHNpbV9jYWxsYmFja3MuaCwgc2ltX2NhbGxzLmMgKHNpbV9pb19wb2xsX3F1aXQpOiBOZXcgZnVuY3Rpb24sCisgCXBvbGwgdGhlIGV4dGVybmFsIGVudmlyb25tZW50LgorCisxOTk4LTExLTE5ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogcHBjLWluc3RydWN0aW9ucyAoaXNfe05hTixpbmZ9KTogVXNlIHVuc2lnbmVkNjQgdG8gZ2V0IHRoZQorCWZyYWN0aW9uYWwgdHlwZSwgc28gdGhhdCBxdWlldCBOYU4ncyBhcmVuJ3QgdHJlYXRlZCBsaWtlCisJSW5maW5pdGllcy4KKworTW9uIFNlcCAyOCAwOTo0Mjo0NSAxOTk4ICBEcmV3IE1vc2VsZXkgIDxkbW9zZWxleUBjeWdudXMuY29tPgorCisJKiB0YWJsZS5jICh0YWJsZV9vcGVuKTogRm9yIGN5Z3dpbiBob3N0cywgd2UgbmVlZCB0byB1c2UgdGhlCisgCXJldHVybiB2YWx1ZSBmcm9tIHRoZSByZWFkIHJvdXRpbmUgYXMgdGhlIG51bWJlciBvZiBieXRlcyB0bworIAlwcm9jZXNzLiAgVGhpcyBhcHBhcmVudGx5IGlzIGR1ZSB0byB0ZXh0LW1vZGUgdnMgYmluYXJ5LW1vZGUuICBJZgorIAl0aGUgbW91bnRzIGFyZSBkb25lIHRleHQtbW9kZSwgdGhlbiB0aGUgc2l6ZSByZXR1cm5lZGJ5IGZzdGF0KCkKKyAJbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgInJlYWQiIGluIHRleHQgbW9kZS4KKworU3VuIE9jdCAgNCAwMDo1MDo0NyAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIGVtdWxfbmV0YnNkLmMgKGRvX29wZW4pOiBmaXggb3JkZXItb2YtZXZhbHVhdGlvbiBwcm9ibGVtLgorCShkb19jbG9zZSk6IGRpdHRvLgorCShkb19mc3RhdCk6IGRpdHRvLgorCShkb19sc3RhdCk6IGRpdHRvLgorCisxOTk4LTA5LTAzICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogZW11bF97bmV0YnNkLHVuaXh9LmM6IFVwZGF0ZSBjb3B5cmlnaHQgeWVhci4KKworTW9uIEp1biAyOSAxMDo1NzozNiAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgorCisJKiBzaW1fY2FsbHMuYyAoc2ltX2ZldGNoX3JlZ2lzdGVyLCBzaW1fc3RvcmVfcmVnaXN0ZXIpOgorCXJldHVybiB6ZXJvIHdoZW4gbm90aGluZyB0byBkby4KKworMTk5OC0wNi0yNiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoQUNfQ0hFQ0tfSEVBREVSUyk6IERvbid0IGNoZWNrIGZvciBzeXMvbW91bnQuaC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIGVtdWxfe25ldGJzZCx1bml4fS5jICh0b3BsZXZlbCk6IE5vIGxvbmdlciB0cnkgdG8gaW5jbHVkZQorCXN5cy9tb3VudC5oLiBJdCBjb25mbGljdHMgb24gTGludXggd2hlbiBnbnUgbGliYzIgaXMgdXNlZC4KKworVHVlIE1heSAxMiAxMjoxMDozMyBQRFQgMTk5OCAgSmFtZXMgSW5naGFtICA8amluZ2hhbUBsZWRhLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBUaGUgcnVuIHRhcmdldCBkZXBlbmRlZCBvbiBhIHRhcmdldCBwc2ltJChFWEVFWFQpLAorCWJ1dCB0aGVyZSB3YXMgbm8gc3VjaCB0YXJnZXQsIG9ubHkgcGxhaW4gcHNpbS4gIFNvIEkgY2hhbmdlZCB0aGUKKwlydW4gdGFyZ2V0IHRvIGRlcGVuZCBvbiBwc2ltLgorCitTYXQgTWF5ICAyIDAxOjEwOjEyIDE5OTggIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgorCisJKiBhY2xvY2FsLm00OiAgUmVtb3ZlIGRlZnMgb2YgQU1fRVhFRVhUIGFuZCBBTV9DWUdXSU4zMi4gIFRoZXNlIGFyZQorCW5vdyBkZWZpbmVkIGluIC4uL2NvbW1vbi9hY2xvY2FsLm00LCBhbmQgdGhlIGRvdWJsZSBkZWZpbml0aW9uIGNhdXNlcworCXByb2JsZW1zIHdpdGggQUNfU1VCU1Qgb2YgRVhFRVhULgorCSogY29uZmlndXJlOiAgUmVnZW5lcmF0ZS4KKwkKK1dlZCBBcHIgMjkgMTU6NDQ6NTIgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KKworCSogYWNsb2NhbC5tNDogbmV3IGZpbGUgZm9yIEFNX0VYRUVYVCBtYWNybworCSogY29uZmlndXJlLmluOiBjYWxsIEFNX0VYRUVYVAorCSogY29uZmlndXJlOiByZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi4xMi4xLgorCSogTWFrZWZpbGUuaW46IGFkZCBFWEVFWFQgc3VwcG9ydAorCitTdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitTdW4gQXByIDI2IDE1OjE5OjUxIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogYWNjb25maWcuaDogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KKwlEb24ndCBjYWxsIEFDX0NfQ1JPU1MuCisKK0ZyaSBBcHIgMjQgMTQ6MTY6NDAgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK0ZyaSBBcHIgMjQgMTE6MTg6NDYgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAodG9wX2J1aWxkZGlyKTogTmV3IG1hY3JvLgorCShJTlRMTElCUyk6IE5ldyBtYWNyby4KKwkoSU5UTERFUFMpOiBMaWtld2lzZS4KKwkocHNpbSk6IERlcGVuZCBvbiBJTlRMREVQUzsgbGluayBhZ2FpbnN0IElOVExMSUJTLgorCSogY29uZmlndXJlLmluOiBDYWxsIENZX0dOVV9HRVRURVhULgorCitXZWQgQXByIDIyIDE0OjI4OjQ4IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjEyLjEuCisKK0ZyaSBNYXIgMTMgMDk6MjU6NTggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBwc2ltLmMgKHBzaW1fcmVhZF9yZWdpc3RlciwgcHNpbV93cml0ZV9yZWdpc3Rlcik6IEhhbmRsZSB1cGRhdGVzCisgCWZvciBGUFNDUi4KKworCSogcmVnaXN0ZXJzLmMgKHJlZ2lzdGVyX2Rlc2NyaXB0aW9uKTogUmVjb25pemUgIkZQU0NSIi4KKworCSogZW11bF9uZXRic2QuYyAoZW11bF9uZXRic2RfY3JlYXRlKTogV2hlbiBGUCBhdmFpbGFibGUsIGVuYWJsZQorIAlNU1IgRlAgZXhjZXB0aW9uIG1vZGUuIERvIG5vdCBlbmFibGUgRlBTQ1IgYml0cy4KKwkqIGVtdWxfdW5peC5jIChlbXVsX3VuaXhfY3JlYXRlKTogRGl0dG8uCisKK1R1ZSBGZWIgMTcgMTI6NDg6NTggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW1fY2FsbHMuYyAoc2ltX3N0b3JlX3JlZ2lzdGVyLCBzaW1fZmV0Y2hfcmVnaXN0ZXIpOiBQYXNzIGluCisgCWxlbmd0aCBwYXJhbWV0ZXIuICBSZXR1cm4gLTEuCisKK01vbiBGZWIgIDkgMTQ6MTM6MTQgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zIChmZGl2LCBmZGl2cyk6IENoZWNrIGZvciBkaXZpZGUgYnkgemVyby4KKwkoaXNfaW52YWxpZF96ZXJvX2RpdmlkZSwgaW52YWxpZF96ZXJvX2RpdmlkZV9vcGVyYXRpb24pOiBOZXcKKyAJZnVuY3Rpb25zLgorCQorV2VkIERlYyAxMCAxNzozODoyOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbV9jYWxscy5jIChzaW1fbG9hZCk6IERvIG5vdCBwYXJzZSBQUk9HIHVzaW5nIGJ1aWxkYXJndiwgdXNlCisgCXJhdyB2YWx1ZSBpbnN0ZWFkLgorCisxOTk3LTExLTA1ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIGVtdWxfY2hpcnAuYzogI2lmZGVmIEhBVkVfVU5JU1REX0gKKworV2VkIE9jdCAxNSAwODo1MDo1NCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvcmVmaWxlLmMgKGNvcmVfYXR0YWNoKTogUGFkIG91dCBhbGxvY2F0ZWQgbWVtb3J5IHJlZ2lvbnMgc28KKyAJdGhhdCB0aGV5IGFyZSBhbHdheXMgY29ycmVjdGx5IGFsaWduZWQuCisJKHN0cnVjdCBfY29yZV9tYXBwaW5nLCBjb3JlX21hcF9hdHRhY2gsIGNvcmVfaW5pdCwKKyAJbmV3X2NvcmVfbWFwcGluZyk6IENoYW5nZSBmcmVlX2J1ZmZlciB0byB0eXBlIHZvaWQqLgorCitNb24gT2N0ICA2IDE4OjA5OjI2IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBzaW1fY2FsbHMuYyAoemZyZWUpOiBDYWxsIGZyZWUgY29ycmVjdGx5LgorCitNb24gU2VwIDI5IDEwOjA1OjAxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltX2NhbGxzLmMgKHpmcmVlKTogVXNlIGZyZWUsIG5vdCBtZnJlZS4KKwkoc2ltX2lvX2ZsdXNoX3N0ZG91dHB1dCk6IFJlcGxhY2UgZ2RiX2ZsdXNoIHdpdGggY2FsbGJhY2sgLT4KKyAJZmx1c2hfc3Rkb3V0LgorCitGcmkgU2VwIDI2IDA5OjUwOjI5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogcHBjLWluc3RydWN0aW9ucyAoc3Jhdywgc2x3LCBzcncpOiBGcm9tIENoYXJsZXMgTGVmdXJneSwgRml4CisgCW1hc2sgZXh0cmFjdGluZyBzaGlmdCBhbW91bnQuIENvcnJlY3RseSBjb25kaXRpb24gZm9yIHNldHRpbmcgWEVSCisgCWluIHNyYXcuCisgCShsZGhhdSk6IEZyb20gSm9oYW5uZXMgUmVpc2luZ2VyLCB1cGRhdGUgckEgYWZ0ZXIgbG9hZC4KKworVHVlIFNlcCAgOSAyMjoxMzoyMyAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIGJhc2ljcy5oIChDT05DQVQqKTogdG9rZW4tcGFzdGluZyBtYWNyb3MsIGlmIEFMTU9TVF9TVERDLAorIAlmb3IgTVNWQy4KKwkqIHdvcmRzLmg6IF9faW50NjQgaW5zdGVhZCBvZiBsb25nIGxvbmcgZm9yIE1TVkMuCisKK1dlZCBBdWcgMjcgMTA6MjQ6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW1fY2FsbHMuYyAoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IENoZWNrIHRoZSBzaW11bGF0b3Igd2FzCisgCWluaXRpYWxpemVkIGJlZm9yZSBjcmVhdGluZyBpbmZlcmlvci4KKworCSogaWRlY29kZV9leHByZXNzaW9uLmggKEFMVV9FTkQpOiBGcm9tIENoYXJsZXMgTGVmdXJneSAtIEV4dHJhY3QKKyAJc2lnbiBiaXQgdXNpbmcgNjQgYml0IGFuZCBub3QgYSAzMiBiaXQgbWFzay4KKworV2VkIEF1ZyAyNyAxMDoxNTo0OCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbV9jYWxscy5jIChzaW1fbG9hZCk6IEZyb20gSWFuIExhbmNlIFRheWxvciAtIGZyZWUgYXJndiBhZnRlcgorIAlpdCBoYXMgYmVlbiB1c2VkLCBub3QgYmVmb3JlLgorCQorVHVlIEF1ZyAyNiAxMDo0MTozNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbV9jYWxscy5jIChzaW1fa2lsbCk6IERlbGV0ZS4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEFkZCBBQkZEIGFyZ3VtZW50LgorCShlbnRyeV9wb2ludCk6IERlbGV0ZSB2YXJpYWJsZS4KKwkoc2ltX2xvYWQpOiBNb3ZlIHNldHRpbmcgb2YgUEMgZnJvbSBoZXJlLgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogVG8gaGVyZS4KKworTW9uIEF1ZyAyNSAxNjoxNzowNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbV9jYWxscy5jIChzaW1fb3Blbik6IEFkZCBBQkZEIGFyZ3VtZW50LgorCitUaHUgSnVsICAzIDEwOjE4OjA2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogcHBjLWluc3RydWN0aW9ucyAoUFBDX0lOU05fSU5UKTogRnJvbSBNaWNoYWVsIFRoaWVzIC0gTW9uaXRvcmluZworIAlDUiByZWdpc3RlciB1cGRhdGVzIGRlcGVuZGFudCBvbiBSQyB2YWx1ZSBoYWQgbG9naWMgYmFja3dhcmRzLgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zIChMb2FkIFN0cmluZyBXb3JkIEltbWVkaWF0ZSk6IEZyb20gQnJhZCBQYXJrZXIKKyAJLSBzZW5zZSBvZiB3cmFwIHRlc3QgaW4gY2hlY2sgZm9yIG92ZXJ3cml0aW5nIFJBIHdyb25nLgorCShMb2FkIFN0cmluZyBXb3JkIEluZGV4ZWQpOiBEaXR0by4KKwkKKwkqIGNvbmZpZ3VyZS5pbjogRnJvbSBFcmlrIExhbmRyeSAtIHNldCBzaW1fZGVmYXVsdF9tb2RlbCBub3QKKyAJc2ltX21vZGVsIGZvciBzaW0tZGVmYXVsdC1tb2RlbCBvcHRpb24uCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJCisJKiBpbnRlcnJ1cHRzLmMgKGNoZWNrX21hc2tlZF9pbnRlcnJ1cHRzKTogU2NoZWR1bGUgYSBoYXJkd2FyZQorIAlpbnRlcnJ1cHQgZGVsaXZlcnkgd2hlbiBGUCBpbnRlcnJ1cHRzIGdldCBlbmFibGVkLgorCShwcm9ncmFtX2ludGVycnVwdCk6IEdlbmVyYXRlIEZQIGV4Y2VwdGlvbnMgaW5zdGVhZCBvZiBhYm9ydGluZy4KKwkoZGVsaXZlcl9oYXJkd2FyZV9pbnRlcnJ1cHQpOiBEZWxpdmVyIGEgRlAgZXhjZXB0aW9uIGlmIHNvCisgCWVuYWJsZWQuCisKKwkqIHJlZ2lzdGVycy5oOiBBZGQgZGVmaW5pdGlvbiBvZiBmcHNjcl92eF9iaXRzLgorCisJKiBpZGVjb2RlX2V4cHJlc3Npb24uaCAoRlBTQ1JfRU5EKTogQWx3YXlzIHVwZGF0ZSBGRVggYW5kIFZYIGJpdHMKKyAJaW4gRlBTQ1IuCisJKEZQU0NSX0VORCk6IEV4cGxpY2l0bHkgY2hlY2sgZm9yIHBvc3NpYmxlIGZsb2F0aW5nIHBvaW50CisgCWV4Y2VwdGlvbiBjb25kaXRpb25zLgorCShGUFNDUl9CRUdJTik6IFNpbXBsaWZ5LgorCQorCSogcHBjLWluc3RydWN0aW9ucyAoTW92ZSBGcm9tIEZQU0NSKTogRW5hYmxlLgorCShNb3ZlIFRvIEZQU0NSIEJpdCAxKTogRGl0dG8uCisJKE1vdmUgVG8gRlBTQ1IgQml0IDApOiBEaXR0by4KKwkoTW92ZSBUbyBGUFNDUiBGaWVsZCBJbW1lZGlhdGUpOiBEaXR0by4KKwkoTW92ZSB0byBDb25kaXRpb24gUmVnaXN0ZXIgZnJvbSBGUFNDUik6IFNpbXBsaWZ5LgorCShpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbik6IEdlbmVyYXRlIGEgUU5hTiB3aGVuIGludmFsaWQKKyAJb3BlcmF0aW9uIGV4Y2VwdGlvbiBkaXNhYmxlZC4KKwkKK1R1ZSBNYXkgMjAgMTA6MjI6NTAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW1fY2FsbHMuYyAoc2ltX29wZW4pOiBBZGQgY2FsbGJhY2sgYXJndW1lbnQuCisJKHNpbV9zZXRfY2FsbGJhY2tzKTogRGVsZXRlLgorCitUdWUgQXByIDIyIDIyOjM2OjU3IDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBzaW1fY2FsbGJhY2tzLmggKGVycm9yKTogTWFrZSBkZWNsYXJhdGlvbiBtYXRjaCBnZGIncy4KKwkqIG1haW4uYyAoZXJyb3IpOiBEaXR0by4KKworRnJpIEFwciAxOCAxNzowMzowOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbV9jYWxscy5jIChzaW1fc3RvcF9yZWFzb24pOiBTaW1wbGlmeS4gIFdhcyBydW5uaW5nIGltcGxpZXMKKyAJc3RvcHBlZC9TSUdJTlQuIEV4aXQgaW1wbGllcyBhIHN0YXR1cyBjb2RlLgorCisJKiBwc2ltLmMgKGNudHJsX2Nfc2ltdWxhdGlvbik6IEZyb20gbWFpbi5jLiAgRXZlbnQgZnVuY3Rpb24gdGhhdAorIAloYWx0cyB0aGUgc2ltdWxhdG9yLgorCShwc2ltX3N0b3ApOiBOZXcuIEFzeW5jaHJvbm91c2x5IHNjaGVkdWxlIGEgc3RvcCBzaW11bGF0b3IgZXZlbnQuCisJKHBzaW1fcnVuX3VudGlsX3N0b3ApOiBEZWxldGUuIE1hZGUgcmVkdW5kYW50IGJ5IHBzaW1fc3RvcC4KKworCSogbWFpbi5jIChjbnRybF9jKTogVXBkYXRlLgorCShjbnRybF9jX3NpbXVsYXRpb24pOiBNb3ZlZCB0byBwc2ltLmMuCisKKwkqIHNpbV9jYWxscy5jIChzaW1fc3RvcCk6IE5ldyBmdW5jdGlvbi4gVXNlIHBzaW1fc3RvcCB3aGljaAorIAlzY2hlZHVsZXMgYSBzdG9wIGV2ZW50LgorCShzaW1fcmVzdW1lKTogRHJvcCBTSUdJTlQgaGFuZGxlciwgbm93IGluIGdkYi9tYWluLmMuCisJKHNpbV9yZXN1bWUpOiBVc2UgcHNpbV9ydW4gYXMgc3RvcCB2YXJpYWJsZSBubyBsb25nZXIgbmVlZGVkLgorCitGcmkgQXByIDE4IDE3OjAzOjA4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogcHNpbS5jIChwc2ltX29wdGlvbnMpOiBIYW5kbGUgLUUgb3B0aW9uIGNvcnJlY3RseS4KKwkocHNpbV91c2FnZSk6IERvY3VtZW50LgorCitUaHUgQXByIDE3IDAzOjI4OjAzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHBzaW0uYyAocHNpbV9vcHRpb25zKTogSWdub3JlIC1FIG9wdGlvbiAoc2V0cyBlbmRpYW5uZXNzKS4KKwkqIHNpbV9jYWxscy5jOiAjaW5jbHVkZSBiZmQuaC4KKwkoZW50cnlfcG9pbnQpOiBOZXcgc3RhdGljIGxvY2FsLgorCShzaW1fbG9hZCk6IFJldHVybiBTSU1fUkMuICBOZXcgYXJnIGFiZmQuICBTZXQgc3RhcnQgYWRkcmVzcyBmcm9tIGJmZC4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFJldHVybiBTSU1fUkMuICBEZWxldGUgYXJnIHN0YXJ0X2FkZHJlc3MuCisKK1R1ZSBBcHIgMTUgMTQ6NTc6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCisJKElOU1RBTExfWEZPUk0sIElOU1RBTExfWEZPUk0xKTogUmVtb3ZlLgorCShpbnN0YWxsKTogRGVwZW5kIHVwb24gaW5zdGFsbGRpcnMuICBVc2UgJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorCWRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZyAkKElOU1RBTExfWEZPUk0pLgorCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCisKK0ZyaSBBcHIgIDQgMTc6NTQ6MzYgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAodG1wLWh3LCB0bXAtcGspOiBVc2UgZm9yIGxvb3AgdG8gZWxpbWluYXRlIGR1cGxpY2F0ZXMKKwlyYXRoZXIgdGhhbiB0aGUgbm9uLXBvcnRhYmxlIGNhdCAtbi4KKworTW9uIEFwciAxNCAxNjoyOTo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogQ2hhbmdlIGluc3RhbGwuc2ggdG8gaW5zdGFsbC1zaC4KKworVHVlIEFwciAgMSAxODoxNToxNCAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+CisKKwkqIHBwYy1pbnN0cnVjdGlvbnM6IENoYW5nZSBtaWxod3UgdG8gbXVsaHd1LgorCitXZWQgQXByICAyIDE1OjM4OjA4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNpbV9jYWxscy5jIChzaW1fb3Blbik6IE5ldyBhcmcgYGtpbmQnLgorCitXZWQgQXByICAyIDE0OjUxOjE3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogQ09QWUlORzogVXBkYXRlIEZTRiBhZGRyZXNzLgorCitUdWUgTWFyIDI1IDE2OjE3OjU5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBtYWluLmMgKHNpbV9pb19yZWFkX3N0ZGluKTogT25seSBjb21waWxlIHVuYnVmZmVyZWQgSU8gY29kZSBpZgorIAlhbGwgdGhlIHJlcXVpcmVkIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGhvc3QgT1MuCisKK1R1ZSBNYXIgMjUgMTI6MTM6MDIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2NyZWF0ZSk6IEd1YXJkIGFnYWluc3QgTlVMTCBpbWFnZXMuCisKKwkqIGNvbmZpZ3VyZS5pbiAoZW5hYmxlLXNpbS1lbmRhaW4pOiBDb3JyZWN0IHR5cG8gaW4gdXNhZ2UgKGZyb20KKyAJRXJpayBMYW5kcnkgPGxhbmRyeUBFTkdSLk9SU1QuRURVPikuCisJKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgorCitGcmkgTWFyIDE0IDE4OjIzOjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAodGFyZy12YWxzLmRlZik6IFJlLWRvIHJ1bGUgc28gdGhhdCBpdCB3b3JrcyB3aXRoCisgCUZyZWVCU0QncyBtYWtlLiAgRGlkbid0IGxpa2UgJDwuCisKK1RodSBNYXIgMTMgMTI6NTU6NDggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc2ltX2NhbGxzLmMgKHNpbV9vcGVuKTogTmV3IFNJTV9ERVNDIHJlc3VsdC4gIEFyZ3VtZW50IGlzIG5vdworCWluIGFyZ3YgZm9ybS4KKwkob3RoZXIgc2ltXyopOiBOZXcgU0lNX0RFU0MgYXJndW1lbnQuCisKK1RodSBGZWIgMTMgMTA6MzU6MTQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBwaHlkZWF1eC5jeWdudXMuY29tPgorCisJKiBwcGMtb3Bjb2RlLXNpbXBsZS1hcnJheSwgcHBjLW9wY29kZS1zaW1wbGUtZ290bywKKyAJcHBjLW9wY29kZS1zaW1wbGUtc3dpdGNoLCBwcGMtb3Bjb2RlLWNvbXBsZXgtYXJyYXksCisgCXBwYy1vcGNvZGUtY29tcGxleC1nb3RvLCBwcGMtb3Bjb2RlLWNvbXBsZXgtc3dpdGNoLAorIAlwcGMtb3Bjb2RlLWp1bXAsIHBwYy1vcGNvZGUtZ290bywgcHBjLW9wY29kZS1mbGF0OiBEZWxldGUsCisgCXN1cGVyc2VlZGVkIGJ5IC0tc2ltLWRlY29kZS1tZWNoYW5pc20gb3B0aW9uLgorCisJKiBwcGMtb3Bjb2RlLXNpbXBsZSwgZGMtc2ltcGxlOiBSZW5hbWUgdG8gYmUgOC4zCisJKiBwcGMtb3Bjb2RlLWNvbXBsZXgsIGRjLWNvbXBsZXg6IERpdHRvLgorCSogcHBjLW9wY29kZS1zdHVwaWQsIGRjLXN0dXBpZDogRGl0dG8uCisJKiBwcGMtb3Bjb2RlLXRlc3QtMSwgZGMtdGVzdC4wMTogRGl0dG8uCisJKiBwcGMtb3Bjb2RlLXRlc3QtMiwgZGMtdGVzdC4wMjogRGl0dG8uCisKKwkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtc2ltLW9wY29kZSk6IENoYW5nZSBwcmVmaXggdG8gZGMtIGluc3RlYWQKKyAJb2YgcHBjLW9wY29kZS0uCisKK1dlZCBGZWIgMTIgMTk6MzM6NDUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBwaHlkZWF1eC5jeWdudXMuY29tPgorCisJKiBNYW55IG9mIHRoZSBwcGMtb3Bjb2RlLSogZmlsZXMgYXJlIGlkZW50aWNhbCBiYXJpbmcgdGhlIHR5cGUgb2YKKyAJbG9va3VwIHRhYmxlLiAgSW5zdGVhZCBvZiBoYXZpbmcgbXVsdGlwbGUgdGFibGVzLCBpZ2VuIGNhbiBkbyB0aGlzCisJdmlhIGFuIGFkZGl0aW9uYWwgb3B0aW9uLgorCQorCSogbGQtZGVjb2RlLmgsIGxkLWRlY29kZS5jIChmb3JjZV9kZWNvZGVfZ2VuX3R5cGUpOiBOZXcgZnVuY3Rpb24sCisgCWFsbG93IHRoZSB0eXBlIG9mIGdlbmVyYXRlZCB0YWJsZSBzcGVjaWZpZWQgaW4gdGhlIGRlY29kZSBmaWxlIHRvCisgCWJlIG92ZXJyaWRkZW4uCisKKwkqIGxkLWRlY29kZS5jIChsb2FkX2RlY29kZV90YWJsZSk6IEFsbG93IHRoZSB0YWJsZSB0eXBlIHRvIGJlCisgCW92ZXJyaWRkZW4uCisKKwkqIGlnZW4uYyAobWFpbik6IEFkZCAtVCA8bWVjaGFuaXNtPiBvcHRpb24gc28gdGhhdCBhbiBvdmVycmlkaW5nCisgCWluc3RydWN0aW9uIGRlY29kZSBtZWNoYW5pc20gY2FuIGJlIHNwZWNpZmllZC4KKworCSogY29uZmlndXJlLmluOiBOZXcgb3B0aW9uIC0tc2ltLWRlY29kZS1tZWNoYW5pc20gdG8gY29udHJvbAorIAlpZ2VuJ3MgbmV3IC1UIDxtZWNoYW5pc20+IGZsYWcuCisJKiBNYWtlZmlsZS5pbiAoSUdFTl9GTEFHUyk6IEFkZCBJR0VOX0lERUNPREVfTUVDSEFOSVNNIHNldCBieSB0aGUKKyAJY29uZmlndXJlIHNjcmlwdC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkKK1R1ZSBGZWIgMTEgMTM6NDk6MTAgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBldmVudHMuYyAoZXZlbnRfcXVldWVfY3JlYXRlKTogRG9uJ3QgdXNlIE5VTEwgdG8gaW5pdGlhbGl6ZSBhbgorCWludGVnZXIgZmllbGQuCisJKGV2ZW5fcXVldWVfe2luaXQsc2NoZWR1bGVfYWZ0ZXJfc2lnbmFsLHRpY2t9KTogQ29uZGl0aW9uYWxpemUgdXNlCisJb2Ygc2lncHJvY21hc2sgdG8gYXBwcm9wcmlhdGUgYXV0b2NvbmYgdGVzdC4KKworCSogbWFpbi5jICh7Y250cmxfYyxtYWlufSk6IFVzZSBSRVRTSUdUWVBFIGZvciBzaWduYWwgcmV0dXJuIHR5cGUsCisJZG9uJ3QgYXNzdW1lIHZvaWQuCisJKiBzaW1fY2FsbHMuYyAoc2ltX3tjdHJsX2MscmVzdW1lfSk6IERpdHRvLgorCisJKiBNYWtlZmlsZS5pbiAoY2FsbGJhY2subyk6IERlZmluZSBIQVZFX0NPTkZJR19ILCBzbyBjYWxsYmFjay5jCisJaW5jbHVkZXMgb3VyIGNvbmZpZy5oLgorCitUdWUgRmViICA0IDEzOjQyOjU5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRml4IHR5cG8gaW4gdGVzdCBmb3IgY2FsbGJhY2suYy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK0ZyaSBGZWIgIDcgMTA6MDQ6MjUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCisJKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfY3JlYXRlKTogSGFuZGxlIGEgdmlydGJhc2Ugb2YgLTEgYmVpbmcKKyAJZm91bmQgaW4gdGhlIGRldmljZSB0cmVlLgorCitXZWQgRmViICA1IDEwOjU2OjI3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogUHJvcGVydHkgY3JlYXRlL2luaXRpYWxpemF0aW9uIHN0aWxsIHdhc24ndCBjb3JyZWN0bHkgb3JkZXJlZC4KKyAgCVNob3VsZCBiZSBkZWxheWluZyBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gaWhhbmRsZSBjcmVhdGlvbiB1bnRpbAorIAlhZnRlciB0aGUgcmVzdCBvZiB0aGUgdHJlZSBoYXMgYmVlbiBlc3RhYmxpc2hlZC4KKwkKKwkqIGRldmljZS5jIChkZXZpY2VfZmluZF9paGFuZGxlX3J1bnRpbWVfcHJvcGVydHkpOiBVcGRhdGUuCisJKGRldmljZV9hZGRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5KTogVXBkYXRlLgorCisJKiB0cmVlLmMgKHBhcnNlX2loYW5kbGVfcHJvcGVydHkpOiBEZWxheSBsb29rdXAgb2YgdGhlIGRldmljZSB0bworIAliZSBvcGVuZWQgdW50aWwgdGhlIGloYW5kbGUgaW5pdGlhbGl6YXRpb24gcGhhc2UuCisJKiB0cmVlLmMgKHByaW50X3Byb3BlcnRpZXMpOiBVcGRhdGUuCisKK1dlZCBGZWIgIDUgMTA6NTY6MjcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCQorCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfZXh0cmFjdGlvbik6IEFkZCBhIHJlYXNvbiBwYXJhbWV0ZXIuCisgIAlBdWdtZW50IGVhY2ggZXh0cmFjdGVkIGZpZWxkIHdpdGggYSBjb21tZW50IGNpdGluZyB0aGUgY29kZXMKKyAJb3JpZ2luLiAgU2hvdWxkIHNpbXBsaWZ5IHRyYWNraW5nIGRvd24gaW5jb3JyZWN0IGNhY2hlCisgCWV4dHJhY3Rpb25zLgorCitUdWUgRmViICA0IDE3OjQ0OjUxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogZ2VuLWljYWNoZS5jOiBHZW5lcmFsaXplIGNvZGUgaGFuZGxpbmcgWFhYX2lzX05OTiBzbyB0aGF0IGl0CisgCXdvcmtzIGZvciBub3JtYWwgYW5kIGJvb2xlYW4gdGFibGUgZW50cmllcy4KKworCSogcHNpbS5jIChwc2ltX3dyaXRlX21lbW9yeSk6IGxhc3RfY3B1ID09IC0xIG9yIG5yX2NwdXMgaXMgbm93CisgCXZhbGlkLiAgSGFuZGxlIHRoaXMganVzdCBsaWtlICpfe3JlYWQsd3JpdGV9X3JlZ2lzdGVyIG5vdyBoYW5kbGVzCisgCWl0LgorCitNb24gRmViICAzIDE3OjE4OjE2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogZXZlbnRzLmMgKGluc2VydF9ldmVudF9lbnRyeSk6IENvcnJlY3QgbG9vcCB0ZXJtaW5hdGlvbgorIAlhc3NlcnRpb25zLgorCitGcmkgSmFuIDMxIDE2OjIwOjI2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogcHNpbS5jIChwc2ltX29wdGlvbnMpOiBBZGQgbmV3IG9wdGlvbiAtYyBmb3IgbWF4LWl0ZXJhdGlvbnMgb3IKKyAJY291bnQuCisJKHBzaW1fdXNhZ2UpOiBEb2N1bWVudC4KKwkocHNpbV9tYXhfaXRlcmF0aW9uc19leGNlZWRlZCk6IE5ldyBmdW5jdGlvbiwgYWJvcnQgc2ltdWxhdGlvbiBpZgorIAltYXggaXRlcmF0aW9ucyBleGNlZWRlZC4KKworCSogZ2VuLWlkZWNvZGUuYzogUmUtd29yayB0aGUgdGFibGUgbG9va3VwIGNvZGUgc28gdGhhdCBpdCBhc3N1bWVzCisgCXRoYXQgdGhlIGVudHJ5IGlzIGEgbGVhZiBieSBkZWZhdWx0LiAgU2ltcGxpZnkgdGhlIGJvb2xlYW4gdGFibGUKKyAJZW50cnkgY29kZSBzbyB0aGF0IGl0IGludm9sdmVzIGEgbWFzayArIHRlc3QgaW5zdGVhZCBvZiBzaGlmdCArCisgCXNoaWZ0ICsgbWFzayArIHRlc3QuCisKKwkqIGdlbi1pZGVjb2RlLmM6IENvcnJlY3QgZ2VuZXJhdGVkIGlnZW4gYm9keSBzbyB0aGF0IGl0IG5vIGRyb3BzCisgCW9yIGRvdWJsZXMgY2xvY2sgaW50ZXJydXB0cy4KKworCQorVGh1IEphbiAzMCAxMToyMzoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+CisKKwkqIE1ha2VmaWxlLmluIChCVUlMVF9TUkNfV09fQ09ORklHKTogQ2hhbmdlIHRhcmctdmFscy4qIHRvCisgCUBzaW1fdGFyZ192YWxzQAorCisJKiBjb25maWd1cmUuaW4gKHNpbV9jYWxsYmFjaywgc2ltX3RhcmdfdmFscyk6IFNldCBzaW1fdGFyZ192YWxscworIAlpZiBjb21tb24gY2FsbGJhY2sgaXMgcHJlc2VudC4KKworV2VkIEphbiAyOSAxMjozMjo0MSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoc2ltX2NhbGxiYWNrKTogSWYgdGhlIGdkYiBpcyBwb3N0IDQuMTYsIGNvbmZpZ3VyZQorCWNhbGxiYWNrIHN1cHBvcnQgZnJvbSB0aGUgY29tbW9uIGRpcmVjdG9yeS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworCSogTWFrZWZpbGUuaW4gKEJVSUxUX1NSQ19XT19DT05GSUcpOiBBZGQgdGFyZy12YWxzLntoLGRlZn0gYW5kCisJdGFyZy1tYXAuYy4KKwkoR0RCX09CSik6IEFkZCBjYWxsYmFjayBzdXBwb3J0IGNvbmZpZ3VyZWQgaW4uCisJKGdlbnRtYXAsdGFyZy12YWxzLmRlZik6IEJ1aWxkIGZyb20gY29tbW9uIGRpcmVjdG9yeS4KKwkodGFyZy12YWxzLmgsdGFyZy1tYXAuYyk6IEJ1aWxkIGJ5IHJ1bm5pbmcgZ2VudG1hcC4KKwkoY2FsbGJhY2subyk6IEJ1aWxkIGZyb20gc291cmNlIGluIGNvbW1vbiBkaXJlY3RvcnkuCisJKHRhcmctbWFwLm8pOiBBZGQgZGVwZW5kZW5jeS4KKwkoY2xlYW4pOiBSZW1vdmUgZ2VudG1hcC4KKworV2VkIEphbiAyOSAxMjoxNDoxOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+CisKKwkqIGlnZW4gd2Fzbid0IGFib3J0aW5nIGlmIHRoZSBvcGNvZGUgdGFibGUgY29udGFpbmVkIG5vIHZhbGlkCisgCWZpZWxkcy4KKwkKKwkqIG1pc2MuYyAobmFtZTJpKTogUG9zc2libHkgYWJvcnQgaWYgYW4gaW52YWxpZCBuYW1lIGlzCisgCWVuY291bnRlcmVkLgorCSogbGQtZGVjb2RlLmM6IEFib3J0IGlmIHRoZSB0YWJsZSB0eXBlIGlzbid0IGZvdW5kLgorCitXZWQgSmFuIDI5IDEyOjE0OjE5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogV2hlbiBwZXJmb3JtYW5jZSBtb25pdG9yaW5nIGlzIGRpc2FibGVkLCBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0bworIAlkZXRlcm1pbmUgdGhlIHNpbXVsYXRpb24gc3BlZWQgYnkgbG9va2luZyBhdCB0aGUgbnVtYmVyIG9mIGVsYXBzZWQKKyAJdGlja3MgcmVjb3JkZWQgYnkgdGhlIGV2ZW50IHF1ZXVlLgorCQorCSogcHNpbS5jIChwc2ltX3dyaXRlX3JlZ2lzdGVyLCBwc2ltX3JlYWRfcmVnaXN0ZXIpOiBGb3JjZSB0aGUgY3B1CisgCXRvIHplcm8gd2hlbiBpdCBpcyBlaXRoZXIgb2YgYC0xJyBvciBgbnJfY3B1cycuICBJbiBib3RoIGNhc2VzIHRoZQorIAluZXh0IGNwdSB3b3VsZCBiZSB6ZXJvIGFueSB3YXkuCisKKwkqIG1vbi5jIChtb25fcHJpbnRfaW5mbyk6IElmIHBvc3NpYmxlLCBwcmludCB0aGUgc3lzdGVtIGN5Y2xlCisgCXBlcmZvcm1hbmNlLiAgVGhpcyBpcyBhbiBpbmRpY2F0aW9uIG9mIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zCisgCXBlciBzZWNvbmQuCisKK1dlZCBKYW4gMjkgMTI6MTQ6MTkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCisJKiBUaGUgY29kZSB0byBhbGxvdyBhbiBldmVudCBxdWV1ZSB0byBiZSB1cGRhdGVkIGR1cmluZyBhIHNpZ25hbAorIAl3YXMgbWlzc2luZy4gIEZvciBtYWluLmMsIGEgY250cmwtYyBzaW11bGF0aW9uIHRlcm1pbmF0aW9uIHdhc24ndAorIAloYW5kbGVkIGNsZWFubHkuCisJCisJKiBUaGUgc2ltdWxhdGlvbiB3b3VsZCBub3QgY29ycmVjdGx5IHJlc3RhcnQgaWYgYW4gZXZlbnQgcmVxdWVzdGVkCisgCXRoYXQgdGhlIHNpbXVsYXRpb24gYmUgaGFsdGVkLgorCQorCSogcHNpbS5jIChwc2ltX29wdGlvbnMpOiBBZGQgaGFjayB0byAtaSBvcHRpb24gdG8gb3B0aW9uYWxseQorIAlpbmNsdWRlIGEgbGV2ZWwgdmlzIC1pMi4KKwkocHNpbV91c2FnZSk6IERvY3VtZW50LgorCisJKiBtYWluLmMgKGNudHJsX2MsIGNudHJsX2Nfc2ltdWxhdGlvbik6IE5ldyBmdW5jdGlvbnMuICBXaGVuIGEKKyAJY250cmwtYyBvY2N1cmVzIHNjaGVkdWxlIGFuIGV2ZW50IHRvIGhhbHQgdGhlIHNpbXVsYXRpb24uCisJKG1haW4pOiBDYXRjaCBDTlRSTC1DIHNpZ25hbHMgd2l0aCB0aGUgZnVuY3Rpb24gY250cmxfYy4KKworCSogZXZlbnRzLmMgKGV2ZW50X3F1ZXVlX3Byb2Nlc3MpOiBNYXNrIGludGVycnVwdHMgd2hpbGUKKyAJbWFuaXB1bGF0aW5nIHRoZSBhc3luYyBldmVudCBxdWV1ZS4KKwkoZXZlbnRfcXVldWVfaW5pdCk6IERpdHRvLgorCShldmVudF9xdWV1ZV9zY2hlZHVsZV9hZnRlcl9zaWduYWwpOiBEaXR0by4KKworCSogZXZlbnRzLmMgKGV2ZW50X3F1ZXVlX3Byb2Nlc3MpOiBNYXJrIHRoZSBldmVudCBxdWV1ZSBhcyBiZWluZyBpbgorIAl0aGUgcHJvY2Vzc2luZyBzdGF0ZSB3aGVuIHByb2Nlc3NpbmcgaGFzIHN0YXJ0ZWQuICBBZGp1c3QgY29kZQorCXNvIHRoYXQgaXQgaXMgdG9sZXJhbnQgb2YgaGFsdHMuCisJKGV2ZW50X3F1ZXVlX2luaXQpOiBTdGFydCB0aGUgZXZlbnQgcXVldWUgb3V0IHdpdGggcHJvY2Vzc2luZworIAlmYWxzZS4KKwkoZXZlbnRfcXVldWVfdGljayk6IENoZWNrIHRoYXQgcHJvY2Vzc2luZyBpc24ndCBzdGlsbCBiZWluZworIAlwZXJmb3JtZWQuCisJCisJKiBnZW4taWRlY29kZS5jIChwcmludF9ydW5fdW50aWxfc3RvcF9ib2R5KTogQ2FsbAorIAlldmVudF9xdWV1ZV9wcm9jZXNzX2V2ZW50cyB0byBjbGVhciBwb3NzaWJseSBwZW5kaW5nIGV2ZW50cyBiZWZvcmUKKyAJc3RhcnRpbmcgYSBzaW11bGF0aW9uIHJ1bi4gIFJlLWFyYW5nZSBtYWluIGxvb3Agc28gdGhhdCBzaW11bGF0b3IKKyAJaXMgY29ycmVjdGx5IHJlc3RhcnRlZCB3aGVuIGFuIGV2ZW50IGhhbHRzIHRoZSBzaW11bGF0aW9uLgorCisJKiBwc2ltLmMgKHBzaW1faGFsdCk6IEhhbmRsZSBhbiBldmVudCBoYWx0aW5nIHRoZSBzaW11bGF0aW9uLgorCSogcHNpbS5jIChwc2ltX2luaXQpOiBBZGp1c3QgaW5pdGlhbCBjcHUgLSA9PSAtMSAtIHRvIG1hdGNoCisgCXJld29ya2VkIGlkZWNvZGUuCisKK1dlZCBKYW4gMjkgMTI6MTQ6MTkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCisJKiBwcGMtb3Bjb2RlLWNvbXBsZXg6IENvcnJlY3QgdHlwbyAtIHdhcyBleHBhbmRpbmcgT1JBIGluc3RlYWQgb2YKKyAJUkEuICBCYXNlZCBvbiBpbnN0cnVjdGlvbiBmcmVxdWVuY3kgc3RhdHMsIGV4cGFuZCBhZGRpdGlvbmFsCisgCWluc3RydWN0aW9ucy4KKwkqIHBwYy1pbnN0cnVjdGlvbnM6IENoYW5nZSBhbGwgYFJBID09IDAnIHRvIFJBX2lzXzAuCisJCisJKiBwcGMtb3Bjb2RlLXN0dXBpZDogTW92ZSBhbGwgYnV0IHRoZSBiYXNpYyB0YWJsZSBpbiAtY29tcGxleCBpbnRvCisgCWhlcmUuICBVcGRhdGUgdG8gbmV3IGZvcm1hdC4KKwkKKwkqIE1ha2VmaWxlLmluICh0bXAtZGVmaW5lcyk6IE5ldyB0YXJnZXQuIEZvcmNlIGRlZmluZXMuaCB0byBhbHdheXMKKyAJYmUgYnVpbHQuICBIZW5jZSBnZXQgcHBjLW9wY29kZS1nb3RvIHRvIGJ1aWxkLgorCitUdWUgSmFuIDI4IDEzOjAwOjE5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogaHdfY29tLmMgKGh3X2NvbV9pbnN0YW5jZV9yZWFkLCBod19jb21faW5zdGFuY2Vfd3JpdGUpOgorIAlJbXBsZW1lbnQuCisJCitUaHUgSmFuIDIzIDA5OjA3OjI2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogaHdfdHJhY2UuYyAoaHdfdHJhY2VfaW5pdF9kYXRhKTogRGVsZXRlLiAgVGhlIHRyYWNlIG9wdGlvbnMgbmVlZAorIAl0byBiZSBpbml0aWFsaXplZCBpbmRlcGVuZGFudCBvZiB0aGUgcmVzdCBvZiB0aGUgc2ltdWxhdGlvbgorIAlpbml0YWxpemF0aW9uLiAgT3RoZXJ3aXplIGEgdHJhY2Ugb3B0aW9uIGV4cGxpY3RseSBzZXQgZnJvbSBnZGIKKyAJY291bGQgYmUgb3ZlcnJpZGRlbiBieSBod190cmFjZS4KKworCSogcHNpbS5jIChwc2ltX29wdGlvbnMpOiBDbGFyaWZ5IHJlYXNvbiB3aHkgdGhlIHRyYWNlIGlvY3RsIG9jY3VyZXMuCisKKwkqIEZJWE1FOiBUaGUgdHJhY2UgY29kZSBpcyB0b28gc2NhdHRlcmVkIC0gaHdfdHJhY2UuYywgcHNpbS5jLAorIAlkZWJ1Zy5jLiAgSXQgY291bGQgYmUgbXVjaCBzaW1wbGVyLgorCitUaHUgSmFuIDIzIDA5OjA3OjI2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKwkKKwkqIFNvbWUgZGV2aWNlcyBzdXBwb3J0IHJlbW92YWJsZSBtZWRpYS4gIEFkZCBob29rcyB0byB0aGUgZGlzaworIAlkZXZpY2Ugc28gdGhhdCBpdCBzdXBwb3J0cyB0aGlzLgorCQorCSogZGV2aWNlLmMgKGRldmljZV9hZGRfc3RyaW5nX2FycmF5X3Byb3BlcnR5LAorIAlkZXZpY2VfZmluZF9zdHJpbmdfYXJyYXlfcHJvcGVydHkpOiBOZXcgZnVuY3Rpb25zLCBtYW5pcHVsYXRlCisgCXByb3BlcnRpZXMgY29udGFpbmluZyBhbiBhcnJheSBvZiBzdHJpbmdzLgorCShkZXZpY2VfZmluZF9zdHJpbmdfcHJvcGVydHkpOiBBbGxvdyBhIHN0cmluZyBhcnJheS4KKwkoZGV2aWNlX2luaXRfc3RhdGljX3Byb3BlcnRpZXMpOiBVcGRhdGUuCisJKGRldmljZV9pbml0X3J1bnRpbWVfcHJvcGVydGllcyk6IFVwZGF0ZS4KKworCSogaHdfZGlzay5jIChod19kaXNrX2lvY3RsKTogQWRkIGlvY3RsIGZvciBjaGFuZ2luZyB0aGUgZGlzaworIAltZWRpYS4gIElmIG5vIGZpbGUgaW1hZ2UgaXMgc3BlY2lmaWVkLCB1c2UgdGhlIG5leHQgb25lIGluIHRoZQorIAlpbWFnZSBwcm9wZXJ0eSBsaXN0LgorCShod19kaXNrX2luaXRfYWRkcmVzcyk6IENoYW5nZSB0aGUgZmlsZSBwcm9wZXJ0eSBzbyB0aGF0IGl0IGlzIGEKKyAJc3RyaW5nIGFycmF5IC0gdXNlIHRoZSBmaXJzdCBlbnRyeSBmb3IgdGhlIGluaXRpYWwgZmlsZSBpbWFnZS4KKworCSogdHJlZS5jIChwcmludF9zdHJpbmdfYXJheV9wcm9wZXJ0eSk6IE5ldyBmdW5jdGlvbiAtIHByaW50IGEKKyAJc3RyaW5nIGFycmF5LgorCShwcmludF9wcm9wZXJ0aWVzKTogQWRqdXN0LgorCShwcmludF9zdHJpbmcpOiBXcml0ZSBhIHN0cmluZywgaGFuZGxpbmcgZG91YmxlIHF1b3Rlcy4KKworCSogZGV2aWNlLmg6IERlZmluZSBhbiBpb2N0bCB0byBgY2hhbmdlLW1lZGlhJyB3aXRoIGFuIG9wdGlvbmFsIG5ldworIAltZWRpYSBpbWFnZS4KKwkKKwkqIGh3X2Rpc2suYzogQWxsb3cgZmxvcHB5IGRpc2sgZGV2aWNlcyB0byBiZSBzcGVjaWZpZWQuCisKKwkqIHBzaW0uYyAocHNpbV9jb21tYW5kKTogTmV3IGZ1bmN0aW9uLCBwYXJzZSBtb3JlIGNvbXBsZXggcHNpbQorIAljb21tYW5kcyBzdWNoIGFzICJjaGFuZ2UtbWVkaWEiIGFuZCAidHJhY2UiLgorCSogc2ltX2NhbGxzLmMgKHNpbV9kb19jb21tYW5kKTogVXNlLgorCitXZWQgSmFuIDIyIDA5OjM4OjMzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogRm9yIGV4cHJlc3Npb25zIGxpa2UgKFJBID09IDApIHRoYXQgYXJlIGVudGVyZWQgaW4gdG8gdGhlIGNhY2hlCisgCWFzIFJBX2lzXzAuIElmIHBvc3NpYmxlIGdlbmVyYXRlIHRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gc28KKyAJdGhhdCB0aGUgY29tcGlsZXIgZ2V0cyBhIGJldHRlciBjaGFuY2Ugb2YgZWxpbWluYXRpbmcgZGVhZAorIAlicmFuY2hlcy4KKworCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfZXh0cmFjdGlvbik6IEZvciBhIGNhY2hlIGVudHJ5IG9mCisgCXRoZSBmb3JtIDxuYW1lPl9pc188Y29uc3Q+IHdoZXJlIGl0IGlzIGEgYm9vbGVhbiBmaWVsZCwgZ2VuZXJhdGUKKyAJdGhlIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbiBpbnN0ZWFkIG9mIHRoZSBleHByZXNzaW9uIGl0cyBzZWxmLgorCShwcmludF9pY2FjaGVfYm9keSk6IFJlbW92ZSBjb2RlIHRoYXQgd2FzIGxvb2tpbmcgZm9yICpfaXNfMCBhbmQKKyAJdGhlbiBnZW5lcmF0aW5nIGNvcnJlc3BvbmRpbmcgZGVmaW5pdGlvbnMuCisKKwkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX3N0cnVjdCk6IElmIHRoZXJlIGlzIG5vIGNhY2hlLCBkbyBub3QKKyAJb3V0cHV0IGV4cHJlc3Npb25zIGluIGlkZWNvZGUuaCBmaWxlLgorCQorCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfYm9keSk6IE91dHB1dCB0aGVtIGhlcmUuCisJCisJKiBwcGMtb3Bjb2RlLWNvbXBsZXg6IENsYXJpZnkgY29uc3RhbnQgdmFsdWVzIGZvciBTUFI9PUxSIHJlZ2lzdGVyCisgCWV4cGFuc2lvbi4KKworCSogcHBjLWNhY2hlLXJ1bGVzIChSQV9pc18wLCBTUFJfaXNfMjU2KTogVHdvIG5ldyBjYWNoZSBlbnRyaWVzLgorCitXZWQgSmFuIDIyIDEyOjI0OjUyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogVGhlIGNvZGUgdGhhdCBwdXQgdmFsdWVzIGluIGFuZCBleHRyYWN0ZWQgdmFsdWVzIGZyb20gdGhlIGNhY2hlCisgCXdhcyB0b28gY29tcGlsaWNhdGVkLiAgVGhlIGNhY2hlIHRhYmxlIGRpZCBub3QgYWxsb3cgdmFsdWVzIHRvIGJlCisgCWNvbXB1dGVkIGZyb20gY2FjaGUgZW50cmllcy4gICNkZWZpbmVzIGNvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGEKKyAJY2FjaGUgd2FzIHByZXNlbnQsIHJlbW92ZSB0aGUgcmVzdHJpY3Rpb24uCisKKwkqIGxkLWNhY2hlLmgsIGxkLWNhY2hlLmM6IEFkZCBhIG5ldyBjYWNoZSBlbnRyeSB0eXBlIC0gU0NSQVRDSC4gIEEKKyAJc2NyYXRjaCB2YXJpYWJsZSBpcyBkZWZpbmVkIHdoZW4gYSBjYWNoZSBlbnRyeSBpcyBiZWluZgorIAlmaWxsZWQuIENoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiBhIENPTVBVVEUgdmFyaWFibGUgdG8gYmUgZGVmaW5lZAorIAl3aGVuIHRoZSBjYWNoZSBlbnRyeSBpcyBiZWluZyB1c2VkLgorCSogZ2VuLWljYWNoZS5jOiBVcGRhdGUuCisJCisJKiBsZC1jYWNoZS5oLCBsZC1jYWNoZS5jOiBDaGFuZ2UgZmllbGQgbmFtZXMgc28gdGhhdCB0aGVpciBtZWFuaW5nCisgCWlzIG1vcmUgb2J2aW91cy4gIG9sZF9uYW1lLT5maWVsZF9uYW1lLCBuZXdfbmFtZS0+ZGVyaXZlZF9uYW1lLgorCSogZ2VuLWljYWNoZS5jOiBVcGRhdGUKKwkKKwkqIGdlbi1pY2FjaGUuaCwgZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfYm9keSk6IE1ha2UgdGhlIHRocmVlCisgCWRpZmZlcmVudCB0eXBlcyBvZiBjYWNoZSBjb2RlIC0gcHV0IGludG8gY2FjaGUsIGV4dHJhY3QgZnJvbQorIAljYWNoZSwgbm8gY2FjaGUgLSBhbiBleHBsaWNpdCBhcmd1bWVudCB0byBwcmludF9pY2FjaGVfYm9keS4KKwkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2V4dHJhY3Rpb24pOiBEaXR0by4KKwkKKwkqIGdlbi1zZW1hbnRpY3MuYyAocHJpbnRfY19zZW1hbnRpYyk6IFVwZGF0ZSB1c2UuCisJKiBnZW4taWRlY29kZS5jIChwcmludF9qdW1wX2luc24pOiBVcGRhdGUgdXNlLgorCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfZnVuY3Rpb24pOiBVcGRhdGUgdXNlLgorCisJKiBpZ2VuLmMgKG1haW4pOiBDaGFuZ2UgJ1InIG9wdGlvbiBzbyB0aGF0IGl0IGRvZXMgbm90IGZvcmNlIHRoZQorIAljYWNoZS4KKworCSogY29uZmlndXJlLmluIChlbmFibGUtc2ltLWljYWNoZSk6IENsYXJpZnkgZGVzY3JpcHRpb24uICBNYWtlCisgCSNkZWZpbmUgb25lIG9mIHRoZSBkZWZhdWx0cyByZWdhcmRsZXNzIG9mIHRoZSBjYWNoZS4gIFByb2JhYmx5CisgCXNob3VsZCByZXZhbXAgYW5kIGFkZCBhIHNlcGFyYXRlIG9wdGlvbi4KKworVHVlIEphbiAyMSAxMzoyNjoxMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+CisKKwkqIHBrX2Rpc2tsYWJlbC5jIChibG9ja19pc19mZGlzayk6IFRpZHkgdXAgdHJhY2VzIC0gdXNlIGRvcworIAlwYXJ0aXRpb24gbnVtYmVyaW5nLgorCShwa19kaXNrbGFiZWxfY3JlYXRlX2luc3RhbmNlKTogUGFydGl0aW9uIDEuLjQgYXJlIHZhbGlkIC0gbm90CisgCTEuLjMuCisJKGlzX2lzbzk2NjApOiBOZXcgZnVuY3Rpb24sIHZlcmlmeSBhIENEOTY2MCBGaWxlIHN5c3RlbS4KKwkocGtfZGlza2xhYmVsX2NyZWF0ZV9pbnN0YW5jZSk6IFN0YXJ0IGV4cGFuZGluZyBzbyB0aGF0IGFjdGl2ZQorIAlwYXJ0aXRpb24gc2VsZWN0aW9uIGlzIHN1cHBvcnRlZC4KKworTW9uIEphbiAyMCAxMToyMDoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+CisKKwkqIFRoZSBjYXAgb2JqZWN0IHdhcyByZXRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIGluc3RhbmNlIG9mIGEKKyAJZGV2aWNlIGFmdGVyIGl0IHdhcyBkZWxldGVkLiBJbnN0ZWFkIGFkZCBhbmQgcmVtb3ZlIGNhcCdzIGZyb20gdGhlCisgCWNhcCBkYiBhcyB0aGV5IGFyZSBjcmVhdGVkIGFuZCBkZWxldGVkLiAgVGhpcyBlbnN1cmluZyB0aGF0IGEKKyAJY2FwaWJpbGl0eSBpcyBvbmx5IHVzZWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGUgY29ycmVzcG9uZGluZworIAlvYmplY3QuCisJCisJKiBjYXAuaCwgY2FwLmM6IENvcnJlY3QgY2FwIHR5cGUgLSB3YXMgc2lnbmVkMzIgc2hvdWxkIGJlCisgCXNpZ25lZF9jZWxsLgorCQorCSogY2FwLmMgKGNhcF9hZGQsIGNhcF9yZW1vdmUpOiBOZXcgbWV0aG9kcyBmb3IgY2FwIG9iamVjdCB0aGF0CisgCWFsbG93IHRoZSBleHBsaWNpdCBhZGRpdGlvbiBhbmQgcmVtb3ZhbCBvZiBpbnRlcm5hbCBvYmplY3RzIHRoYXQKKyAJdGhlIGNhcCBrbm93cyBhYm91dC4KKwkKKwkqIGNhcC5jIChjYXBfaW5pdCk6IFJld3JpdGUuICBWZXJpZnkgdGhhdCB0aGUgb25seSBvYmplY3RzCisgCXJlbWFpbmluZyBpbiB0aGUgY2FwIGRhdGEgYmFzZSBhcmUgdGhvc2UgdGhhdCB3ZXJlIGVudGVyZWQgZmlyc3QuCisgIAlUaHNlIG9iamVjdHMgd2lsbCBiZSB0aGUgcGVybWVuYW50IG9uZXMuCisJKiBkZXZpY2UuYyAoZGV2aWNlX2luaXRfYWRkcmVzcyk6IFJlbWVtYmVyIHRvIGluaXRpYWxpemUgdGhlIGNhcAorIAlkYXRhYmFzZS4KKwkKKwkqIGRldmljZS5jIChkZXZpY2VfY3JlYXRlX2luc3RhbmNlX2Zyb20pOiBFeHBsaWNpdGx5IGFkZCBkZXZpY2UKKyAJaW5zdGFuY2VzIHRvIHRoZSBjYXAgZGF0YWJhc2UuICBTaW1wbGlmeSBjcmVhdGUgY29kZS4KKwkoZGV2aWNlX2luc3RhbmNlX2RlbGV0ZSk6IEV4cGxpY2l0bHkgcmVtb3ZlIGRldmljZSBpbnN0YW5jZXMgZnJvbQorIAl0aGUgY2FwIGRhdGFiYXNlLgorCQorCSogZGV2aWNlLmMgKGRldmljZV9jcmVhdGVfZnJvbSk6IEV4cGxpY2l0bHkgYWRkIGEgZGV2aWNlIHRvIHRoZQorIAljYXAgZGF0YSBiYXNlLgorCQorCSogZGV2aWNlLmMgKGRldmljZV9jcmVhdGVfZnJvbSk6IEFsd2F5cyBzZXQgdGhlIGNhcCBtZW1iZXJzLgorCisJKiBod19kaXNrLmM6IE91dHB1dCB0aGUgaW5zdGFuY2Ugd2hlbiB0cmFjaW5nLgorCQorU3VuIEphbiAxOSAxNjo0NDoyOSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+CisKKwkqIHRyZWUuYyAoc3BsaXRfZGV2aWNlX3NwZWNpZmllcik6IEFkZCBzdXBwb3J0IGZvciBhbGlhc2VzIHdoZW4KKyAJbG9va2luZyB1cCBhIGRldmljZS4gTm93IG5lZWRzIGEgZGV2aWNlIGFzIGFuIGFyZ3VtZW50LgorCShzcGxpdF9wcm9wZXJ0eV9zcGVjaWZpZXIpOiBEaXR0by4KKworU3VuIEphbiAxOSAxNToyODoyMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+CisKKwkqIFRoZSBtZW1vcnkgImNsYWltIiBhbmQgInJlbGVhc2UiIG1ldGhvZHMgdGFrZSBhbiBhZGRyZXNzIGFuZAorIAlzaXplIGFzIGFyZ3VtZW50cy4gIFRoZXNlIG1heSBiZSBtdWx0aSBjZWxsIHZhbHVlcy4gSW5pdGlhbGx5IGZpeAorIAl0aGUgbWVtb3J5IGNvZGUgc28gdGhhdCB0aGV5IGNoZWNrL2RldGVjdCB0aGlzLiAgTGVhdmUgdGhlCisgCWFkanVzdG1lbnQgb2YgYW55IGNsaWVudHMgdG8gbGF0ZXIuCisJCisJKiBod19tZW1vcnkuYyAoaHdfbWVtb3J5X2luc3RhbmNlX2NsYWltLAorIAlod19tZW1vcnlfaW5zdGFuY2VfcmVsZWFzZSk6IEhhbmRsZSBtdWx0aS1jZWxsIG1lbW9yeSBkZXZpY2VzLgorCQorCSogaHdfbWVtb3J5LmMgKGh3X21lbW9yeV9pbnN0YW5jZV9jbGFpbSk6IEJlIHRvbGVyYW50IHRvd2FyZHMgdGhlCisgCXJlbGVhc2Ugb2YgbWVtb3J5IHJlZ2lvbnMgdGhhdCB3ZXJlIG5vdCBjbGFpbWVkLgorCitGcmkgSmFuIDE3IDEyOjAxOjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogZGV2aWNlLmgsIGRldmljZS5jIChkZXZpY2VfaW5zdGFuY2VfY2FsbF9tZXRob2QpOiBDb3JyZWN0IHJldHVybgorIAl0eXBlIC0gY2FuIHJldHVybiBlaXRoZXIgMCBvciAtMSwgaGVuY2Ugc2hvdWxkIGJlIGEgc2lnbmVkIHR5cGUuCisJKiBkZXZpY2VfdGFibGUuaDogRGl0dG8uCisJCisJKiBod19tZW1vcnkuYyAoaHdfbWVtb3J5X2luc3RhbmNlX2NsYWltLAorIAlod19tZW1vcnlfaW5zdGFuY2VfcmVsZWFzZSk6IFVwZGF0ZS4KKwkqIGh3X2Rpc2suYyAoaHdfZGlza19tYXhfdHJhbnNmZXIsIGh3X2Rpc2tfYmxvY2tfc2l6ZSwKKyAJaHdfZGlza19ucl9ibG9ja3MpOiBEaXR0by4KKwkKK0ZyaSBKYW4gMTcgMTE6NTA6MTMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCisJKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfY2xhaW0pOiBJbXBsZW1lbnQgdXNpbmcgdGhlICJjbGFpbSIKKyAJbWV0aG9kIGJlbG9uZ2luZyB0byAiL2Nob3Nlbi9tZW1vcnkiLgorCShjaGlybV9lbXVsX3JlbGVhc2UpOiBEaXR0by4KKwkKKwkqIE1ha2VmaWxlLmluIChMSUJfSU5MSU5FX1NSQyk6IFJlbW92ZSBlbXVsXyogZnJvbSBsaXN0IG9mIGZpbGVzCisgCXRoYXQgYXJlIGlubGluZWQuICBUaGVzZSBtb2R1bGVzIGFyZSBjYWxsZWQgdmlhIGEgdGFibGUgYW5kIGFyZQorIAlub3QgbWFkZSBpbmxpbmUuCisKKwkqIGh3X2luaXQuYyAodXBkYXRlX2Zvcl9iaW5hcnlfc2VjdGlvbik6IEZpeCBmYWlsdXJlIHRvIGFsbG9jYXRlCisgCW1lbW9yeSB1c2VkIGJ5IHRoZSBiaW5hcnkgaW4gcmVhbC1tb2RlIGV4ZWN1dGlvbnMuIElmICJjbGFpbSIKKyAJcHJvcGVydHkgaXMgcHJlc2VudCwgYWxsb2NhdGUgbWVtb3J5IGZyb20gdGhlICIvY2hvc2VuL21lbW9yeSIKKyAJZGV2aWNlLgorCisJKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfY3JlYXRlKTogU3BlY2lmeSB0aGF0IG1lbW9yeSBzaG91bGQgYmUKKyAJY2xhaW1lZCB3aGVuIGxvYWRpbmcgYSByZWFsIGltYWdlLgorCisJKiBod19tZW1vcnkuYyAoaHdfbWVtb3J5X2luc3RhbmNlX2NsYWltKTogRG9uJ3QgcGFnZSBhbGlnbiBtZW1vcnkKKyAJYWxsb2NhdGlvbnMuCisKKwkqIGh3X21lbW9yeS5jIChod19tZW1vcnlfaW5zdGFuY2VfcmVsZWFzZSk6IEF2b2lkIGluZmluaXRlIGxvb3AKKyAJd2hlbiBtZXJnaW5nIGFkamFjZW50IG1lbW9yeSBjaHVua3MuCisKK1RodSBKYW4gMTYgMDg6NTE6MjUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCisJKiB2bS5oICh2bV9kYXRhX21hcF9yZWFkX2J1ZmZlciwgdm1fZGF0YV9tYXBfd3JpdGVfYnVmZmVyKTogQWRkCisgCW9wdGlvbmFsIFBST0NFU1NPUiAmIENJQSBhcmdzIHNvIHRoYXQgdGhpcyByb3V0aW5lIGFsc28gYWJvcnQgYW4KKyAJYWNjZXNzLgorCisJKiB2bV9uLmggKHZtX2RhdGFfbWFwX3JlYWRfTiwgdm1fZGF0YV9tYXBfd3JpdGVfTik6IEZvciBhCisgCW1pc3MtYWxpZ25lZCBhY2Nlc3Mgd2hlbiBhIHRyYW5zZmVyIGZhaWxzIGFib3J0LgorCQorCSogZW11bF9idWdhcGkuYyAoZW11bF9idWdhcGlfZG9fd3JpdGUpOiBVc2UgZW11bF9yZWFkX2J1ZmZlcgorIAlpbnN0ZWFkIG9mIHRoZSB2bV9yZWFkX2J1ZmZlci4KKwkqIGVtdWxfbmV0YnNkLmMgKGRvX3dyaXRlKTogRGl0dG8uCisJKiBlbXVsX3VuaXguYyAoZG9fdW5peF93cml0ZSk6IERpdHRvLgorCitXZWQgSmFuIDE1IDE0OjM4OjI1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0tanVtcCk6IERlZmF1bHQgaXMgTlVMTCBhbmQgbm90IC1FLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCQorCSogYmFzaWNzLmggKF9fYXR0cmlidXRlX18pOiBFbmFibGUgYXR0cmlidXRlcyBpZiBHQ0MgPj0gMi42LgorCShVTlVTRUQpOiBPbmx5IGVuYWJsZSBVTlVTRUQgaWYgR0NDID49IDIuNy4KKwkKKwkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2V4dHJhY3Rpb24pOiBQcmludCBVTlVTRUQgbWFjcm8KKyAJaW5zdGVhZCBvZiBleHBsaWNpdCBfX3VudXNlZF9fIGF0dHJpYnV0ZS4KKwkocHJpbnRfaWNhY2hlX2JvZHkpOiBEaXR0by4KKwkqIGlkZWNvZGVfZXhwcmVzc2lvbi5oIChGUFNDUl9CRUdJTik6IFVzZSBVTlVTRUQuCisKK1dlZCBKYW4gMTUgMTM6NTQ6NTAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCisJKiBjcHUuaCwgY3B1LmMgKGNwdV9zeW5jaHJvbml6ZV9jb250ZXh0KTogQWRkIENJQSBhcmd1bWVudCBhcworIAlyZWZlcmVuY2UgcG9pbnQuCisKKwkqIHZtLmMgKHZtX3N5bmNocm9uaXplX2NvbnRleHQpOiBBZGQgUFJPQ0VTU09SIGFuZCBDSUEgYXMKKyAJYXJndW1lbnRzIHNvIHRoYXQgdGhlcmUgaXMgYSByZWZlcmVuY2UgcG9pbnQgZm9yIHJlY292ZXJ5LgorCSh2bV9zeW5jaHJvbml6ZV9jb250ZXh0KTogUGFzcyBwcm9jZXNzb3IrY2lhIGZvciBlcnJvcnMuCisJKG9tX3VucGFja19zcik6IERpdHRvLgorCShvbV91bnBhY2tfc3JzKTogRGl0dG8uCisJKiB2bS5jICh2bV9jcmVhdGUpOiBSZXZpZXcgZXJyb3IgbWVzc2FnZXMuCisKKwkqIHZtLmM6IEluY2x1ZGUgImNwdS5oIiBzbyB0aGF0IGNwdV9lcnJvciBpcyB2aXNpYmxlLgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zIChSZXR1cm4gRnJvbSBJbnRlcnJ1cHQpOiBQYXNzIENJQS4KKwkoSW5zdHJ1Y3Rpb24gU3luY2hyb25pemUpOiBEaXR0by4KKwkqIHBzaW0uYyAocHNpbV9pbml0KTogRGl0dG8uCisKK1dlZCBKYW4gMTUgMTI6MjU6MTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCisJKiBjcHUuaCwgY3B1LmMgKGNwdV9lcnJvcik6IEFib3J0cyBzaW11bGF0aW9uIHdpdGggZXJyb3IgbWVzc2FnZSwKKyAJYnV0IGFsc28gc2F2ZXMgY3VycmVudCBwcm9jZXNzb3Igc3RhdGUuCisJCisJKiBiYXNpY3MuaDogTW92ZSAjaW5jbHVkZSA8c3RkYXJnLmg+IHRvIGhlcmUgZnJvbSBkZXZpY2VfdGFibGUuaC4KKworCSogaW50ZXJydXB0cy5jIChwZXJmb3JtX29lYV9pbnRlcnJ1cHQpOiBVc2UuICBObyBsb25nZXIgbG9vc2UgQ0lBCisgCXdoZW4gc2ltdWxhdGlvbiBhYm9ydGVkLgorCShwcm9ncmFtX2ludGVycnVwdCk6IERpdHRvLgorCShmbG9hdGluZ19wb2ludF91bmF2YWlsYWJsZV9pbnRlcnJ1cHQpOiBEaXR0by4KKwkoYWxpZ25tZW50X2ludGVycnVwdCk6IERpdHRvLgorCShmbG9hdGluZ19wb2ludF9hc3Npc3RfaW50ZXJydXB0KTogRGl0dG8uCisJKHBlcmZvcm1fb2VhX2ludGVycnVwdCk6IERpdHRvLgorCShtYWNoaW5lX2NoZWNrX2ludGVycnVwdCk6IERpdHRvLgorCitUdWUgSmFuIDE0IDEyOjE5OjEwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogcHBjLWluc3RydWN0aW9ucyAoTW92ZSBmcm9tIFNwZWNpYWwgUHVycG9zZSBSZWdpc3Rlcik6IFN1cHBvcnQKKyAJbW92ZSBmcm9tIERFQy4KKworTW9uIEphbiAxMyAxNjo1ODoxMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+CisKKwkqIGRlYnVnLmgsIGRlYnVnLmM6IEFkZCAiaW50ZXJydXB0cyIgdHJhY2Ugb3B0aW9uLgorCisJKiBpbnRlcnJ1cHRzLmMgKGRhdGFfc3RvcmFnZV9pbnRlcnJ1cHQpOiBBZGQgdHJhY2luZy4KKwkobWFjaGluZV9jaGVja19pbnRlcnJ1cHQpOiBEaXR0by4KKwkoaW5zdHJ1Y3Rpb25fc3RvcmFnZV9pbnRlcnJ1cHQpOiBEaXR0by4KKwkoYWxpZ25tZW50X2ludGVycnVwdCk6IERpdHRvLgorCShwcm9ncmFtX2ludGVycnVwdCk6IERpdHRvLgorCShmbG9hdGluZ19wb2ludF91bmF2YWlsYWJsZV9pbnRlcnJ1cHQpOiBEaXR0by4KKwkoc3lzdGVtX2NhbGxfaW50ZXJydXB0KTogRGl0dG8uCisJKGZsb2F0aW5nX3BvaW50X2Fzc2lzdF9pbnRlcnJ1cHQpOiBEaXR0by4KKwkoZGVsaXZlcl9oYXJkd2FyZV9pbnRlcnJ1cHQpOiBEaXR0by4KKwkKKwkqIGludGVycnVwdHMuYyAocHJvZ3JhbV9pbnRlcnJ1cHQpOiBGb3IgVUVBIG1vZGUsIGhhbHQgdGhlCisgCXByb2Nlc3NvciAtIHNvIHRoYXQgdGhlIGN1cnJlbnQgc3RhdGUgaXMgc2F2ZWQgLSBpbnN0ZWFkIG9mCisgCWFib3J0aW5nLgorCShmbG9hdGluZ19wb2ludF91bmF2YWlsYWJsZV9pbnRlcnJ1cHQpOiBEaXR0by4KKwkoZmxvYXRpbmdfcG9pbnRfYXNzaXN0X2ludGVycnVwdCk6IERpdHRvLgorCitUaHUgSmFuICAyIDA5OjEwOjQxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogaW50ZXJydXB0cy5jIChwZXJmb3JtX29lYV9pbnRlcnJ1cHQpOiBIYWx0IHJhdGhlciB0aGFuIGFib3J0IG9uCisgCWEgZG91YmxlIGludGVycnVwdC4KKworV2VkIEphbiAgMSAyMjo1NDo1MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+CisKKwkqIHBwYy1pbnN0cnVjdGlvbnMgKFN0b3JlIE11bHRpcGxlIFdvcmQsIExvYWQgTXVsdGlwbGUgV29yZCk6CisgCUVuYWJsZS4KKworCSogdHJlZS5jIChwcmludF9wcm9wZXJ0aWVzKTogRm9yIGFuIGFycmF5IGNvbnNpZGVyIHByaW50aW5nIGl0IG91dAorIAlhcyBhbiBpbnRlZ2VyIGFycmF5LgorCisJKiBod19tZW1vcnkuYyAoaHdfbWVtb3J5X2luaXRfYWRkcmVzcyk6IElmIGFuICJhdmFpbGFibGUiIHByb3BlcnR5CisgCWlzIHByZXNlbnQsIHVzZSB0aGF0IHRvIGluaXRpYWxpemUgdGhlIGF2YWlsYWJsZSBtZW1vcnkgaW5zdGVhZCBvZgorIAl1c2luZyB0aGUgcmVnIHByb3BlcnR5LgorCisJKiBlbXVsX2dlbmVyaWMuYyAoZW11bF9hZGRfdHJlZV9oYXJkd2FyZSk6IEFkZCAiYXZhaWxhYmxlIgorIAlwcm9wZXJ0eSB0byBtZW1vcnkgZGV2aWNlLgorCitGcmkgRGVjIDIwIDEzOjE5OjA3IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogcHBjLWluc3RydWN0aW9ucyAoUm90YXRlIExlZnQgV29yZCB0aGVuIEFORCB3aXRoIE1hc2spOiBFbmFibGUuCisKKwkqIGRldmljZS5jIChkZXZpY2VfaW5zdGFuY2VfY2FsbF9tZXRob2QpOiBXYXMgb25seSBsb29raW5nIGF0IHRoZQorIAlmaXJzdCBtZXRob2QuCisKKwkqIGh3X2Rpc2suYyAoaHdfZGlza19ucl9ibG9ja3MpOiBJbXBsZW1lbnQgI2Jsb2NrcyBtZXRob2QuCisJKGh3X2Rpc2tfYmxvY2tfc2l6ZSk6IEltcGxlbWVudCBibG9jay1zaXplIG1ldGhvZC4KKwkoaHdfZGlza19tYXhfdHJhbnNmZXIpOiBJbXBsZW1lbnQgbWF4LXRyYW5zZmVyIG1ldGhvZC4KKworCSogaHdfcGhiLmMgKGh3X3BoYl9pbml0X2FkZHJlc3MpOiBSZWluaXQgdGhlIHJlc3Qgb2YgdGhlIFBIQi4KKworCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX2luc3RhbmNlX3RvX3BhdGgpOiBSZWNvdmVyIGZyb20gYW4KKyAJaW52YWxpZCBpaGFuZGxlLgorCShjaGlycF9lbXVsX2luc3RhbmNlX3RvX3BhY2thZ2UpOiBEaXR0by4KKwkoY2hpcnBfZW11bF9tZXRob2QpOiBEaXR0by4KKwkoY2hpcnBfZW11bF9yZWFkKTogRGl0dG8uCisJKGNoaXJwX2VtdWxfd3JpdGUpOiBEaXR0by4KKwkoY2hpcnBfZW11bF9jbG9zZSk6IERpdHRvLgorCShjaGlycF9lbXVsX3NlZWspOiBEaXR0by4KKwkoY2hpcnBfZW11bF9wYWNrYWdlX3RvX3BhdGgpOiBEaXR0byAoZm9yIHBoYW5kbGUpLgorCShjaGlycF9lbXVsX3BhY2thZ2VfdG9fcGF0aCk6IFJldHVybiB0aGUgbGVuZ3RoLgorCisJKiBwc2ltLmMgKHBzaW1fbWVyZ2VfZGV2aWNlX2ZpbGUpOiBBbGxvdyBjb250aW51YXRpb24gbGluZXMuCisKK1RodSBEZWMgMTkgMTE6MDk6NDMgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCisJKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfYm9vdCk6IEltcGxlbWVudC4gV2VsbCByZXBvcnQgdGhlIG5ldworIAlzdHJpbmcgYW5kIGV4aXQuCisJCisJKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfZXhpdCk6IENvcnJlY3QgdHlwZSBvZiBhcmdzIHN0cnVjdAorIAltZW1iZXJzIC0gKl9jZWxsIG5vdCBob3N0IGRlcGVuZGFudCBpbnQuCisKK1dlZCBEZWMgMTggMTc6NDk6NTkgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCisJKiBpbnRlcnJ1cHRzLmMgKHBlcmZvcm1fb2VhX2ludGVycnVwdCk6IFByaW50IGFkZGl0aW9uYWwKKyAJaW5mb3JtYXRpb24gaWYgYSBkb3VibGUgaW50ZXJydXB0IGlzIGVuY291bnRlcmVkLgorCitXZWQgRGVjIDE4IDE3OjQ5OjU5IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKwkKKwkqIHBzaW0uYyAocHNpbV9tZXJnZV9kZXZpY2VfZmlsZSk6IFRvbGVyYXRlIGFuIGluY29ycmVjdCBmaWxlLW5hbWUKKyAJYmVpbmcgc3BlY2lmaWVkIHdpdGggdGhlIC1mIG9wdGlvbi4KKwkocHNpbV9tZXJnZV9kZXZpY2VfZmlsZSk6IENvcnJlY3QgY2hlY2sgZm9yIGVuZCBvZiBzdHJpbmcuCisKK1dlZCBEZWMgMTggMTc6NDk6NTkgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCQorCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX3BlZXIpOiBXYXMgZmFsbGluZyBvZmYgdGhlIGVuZCBvZiB0aGUKKyAJbGlzdCBvZiBkZXZpY2VzLiBSZXR1cm4gemVybyB0byB0aGUgY2xpZW50IGluc3RlYWQuCisJKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfY2hpbGQpOiBEaXR0bworCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX3BhcmVudCk6IERpdHRvCisKKwkqIGRldmljZS5jIChkZXZpY2Vfcm9vdCk6IEFzc2VydCBhc3N1bXB0aW9uIGFib3V0IHRoZSBkZXZpY2UgYmVpbmcKKyAJdmFsaWQuCisKK1R1ZSBEZWMgMTcgMTU6MTI6MzggMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCisJKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfY3JlYXRlKTogQWRkIGRlc2NyaXB0aW9uIHByb3BlcnR5IHRvCisgCWVhY2ggc2lnbmlmaWNhbnQgbm9kZSBpbiB0aGUgZGV2aWNlIHRyZWUuCisJKiBlbXVsX2J1Z2FwaS5jIChlbXVsX2J1Z2FwaV9jcmVhdGUpOiBEaXR0by4KKworRnJpIERlYyAxMyAxNDozMDozMSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+CisKKwkqIG1haW4uYyAoc2ltX2lvX3JlYWRfc3RkaW4pOiBGb3IgYSBzaW5nbGUgYnl0ZSBTVERJTyByZWFkLCB1c2UgYQorIAl0ZW1wb2FyeSB0d28gYnl0ZSBidWZmZXIuICBTaW5nbGUgYnl0ZSByZWFkIHdpdGggZmdldHMgd2lsbCBub3QKKyAJd29yay4KKwkqIG1haW4uYzogSW5jbHVkZSBlcnJuby5oLgorCShzaW1faW9fcmVhZF9zdGRpbik6IEZvciBub24tU1RESU8sIG1ha2UgaXQgd29yay4KKworCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX3JlYWQpOiBSZXR1cm4gdGhlIGNvcnJlY3QgZXJyb3Igc3RhdHVzLgorCitGcmkgRGVjIDEzIDE0OjMwOjMxIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogc3RkLWNvbmZpZy5oIChXSVRIX1NURElPKTogRG9uJ3QgaGFyZC13aXJlIHRoZSBTVERJTyBtZWNoYW5pc20uCisgIAlJbnN0ZWFkIGhhdmUgZWFjaCBlbXVsYXRpb24gZGVmYXVsdCBpdCB0byBET19VU0VfU1RESU8uCisKKwkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX29wdGlvbnMpOiBTZWxlY3QgdGhlIFNURElPIEkvTworIAltZWNoYW5pc20gYXMgdGhlIGRlZmF1bHQgaWYgZW5hYmxlZCBvciBpZiBub3RoaW5nIHNlbGVjdGVkLgorCisJKiBzaW1fY2FsbHMuYyAoc2ltX2lvX3JlYWRfc3RkaW4pOiBQYXNzaWZ5IEdDQydzIGRlc2lyZSBmb3IgYQorIAlyZXR1cm4gdmFsdWUuCisJKHNpbV9pb193cml0ZV9zdGRvdXQpOiBEaXR0by4KKwkoc2ltX2lvX3dyaXRlX3N0ZGVycik6IERpdHRvLgorCSogbWFpbi5jIChzaW1faW9fd3JpdGVfc3Rkb3V0KTogRGl0dG8uCisJKHNpbV9pb193cml0ZV9zdGRlcnIpOiBEaXR0by4KKwkoc2ltX2lvX3JlYWRfc3RkaW4pOiBEaXR0by4KKworVHVlIERlYyAxMCAxMDozMTo0OCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGVtdWxfY2hpcnAuYyAoZW11bF9jaGlycF9pbnN0cnVjdGlvbl9jYWxsKTogTWFrZSAqcHJpbnRmIGNhbGxzCisJdHlwZSBjb3JyZWN0LgorCSogdm0uYyAob21fZWZmZWN0aXZlX3RvX3ZpcnR1YWwpOiBEaXR0by4KKwkqIGV2ZW50cy5jIChldmVudF9xdWV1ZV9zY2hlZHVsZXssX2FmdGVyX3NpZ25hbH0pOiBEaXR0by4KKwkoZXZlbnRfcXVldWVfe2Rlc2NoZWR1bGUscHJvY2Vzc30pOiBEaXR0by4KKwkqIGh3X2h0YWIuYyAoaHRhYl9kZWNvZGVfaGFzaF90YWJsZSk6IERpdHRvLgorCShodGFiX21hcF97cGFnZSxiaW5hcnl9KTogRGl0dG8uCisJKiBod19vcGljLmMgKGh3X29waWNfaW5pdF9kYXRhKTogRGl0dG8uCisJKGhhbmRsZV9pbnRlcnJ1cHQpOiBEaXR0by4KKwkoZG9fcHJvY2Vzc29yX2luaXRfcmVnaXN0ZXJfe3JlYWQsd3JpdGV9KTogRGl0dG8uCisJKHdyaXRlX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3Rlcik6IERpdHRvLgorCSh7cmVhZCx3cml0ZX1fZGVzdGluYXRpb25fcmVnaXN0ZXIpOiBEaXR0by4KKwkoZG9fc3VwcmlvdXNfdmVjdG9yX3JlZ2lzdGVyX3tyZWFkLHdyaXRlfSk6IERpdHRvLgorCShkb19jdXJyZW50X3Rhc2tfcHJpb3JpdHlfcmVnaXN0ZXJfTl97cmVhZCx3cml0ZX0pOiBEaXR0by4KKwkoZG9fdGltZXJfZnJlcXVlbmN5X3JlcG9ydGluZ19yZWdpc3Rlcl97cmVhZCx3cml0ZX0pOiBEaXR0by4KKwkoZG9fdGltZXJfTl97Y3VycmVudCxiYXNlfV9jb3VudF9yZWdpc3Rlcl97cmVhZCx3cml0ZX0pOiBEaXR0by4KKwkoZG9faXBpX05fZGlzcGF0Y2hfcmVnaXN0ZXJfd3JpdGUpOiBEaXR0by4KKwkoZG9fdmVuZG9yX2lkZW50aWZpY2F0aW9uX3JlZ2lzdGVyX3JlYWQpOiBEaXR0by4KKwkoZG9fZmVhdHVyZV9yZXBvcnRpbmdfcmVnaXN0ZXJfTl9yZWFkKTogRGl0dG8uCisJKGRvX2dsb2JhbF9jb25maWd1cmF0aW9uX3JlZ2lzdGVyX05fe3JlYWQsd3JpdGV9KTogRGl0dG8uCisJKiBod19waGIuYyAoaHdfcGhiX2F0dGFjaF9hZGRyZXNzKTogRGl0dG8uCisJKGh3X3BoYl91bml0X2RlY29kZSk6IERpdHRvLgorCShod19waGJfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyk6IERpdHRvLgorCShod19waGJfaW9fe3JlYWQsd3JpdGV9X2J1ZmZlcik6IERpdHRvLgorCSogaHdfaWRlLmMgKHNldHVwX2ZpZm8pOiBEaXR0by4KKworCSogc2ltX2NhbGxzLmMgKHtkZWZzLGNhbGxiYWNrLHJlbW90ZS1zaW19LmgpOiBGaW5kIGdkYiBpbmNsdWRlCisJZmlsZXMgdmlhIC1JPGRpcj4gaW5zdGVhZCBvZiB1c2luZyAiLi4vLi4vZ2RiLyIgcHJlZml4ZXMuCisKK1R1ZSBEZWMgMTAgMTA6MTI6NDQgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCisJKiBkZWJ1Zy5oOiBBZGQgdHJhY2luZyBmb3IgdGhlIHBhbCBkZXZpY2UuCisJKiBod19wYWwuYzogVXBkYXRlLgorCisJKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfZ2V0cHJvcCk6IE1vcmUgdHJhY2luZy4KKworVHVlIERlYyAxMCAxMDoxMjo0NCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+CisKKwkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX2ZpbmRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5KTogTmV3CisgCWZ1bmN0aW9uLiBSZXZlcnNlIG9mIGFkZF9paGFuZGxlX3J1bnRpbWUgcHJvcGVydHkuCisJKGRldmljZV9pbml0X3J1bnRpbWVfcHJvcGVydGllcyk6IFVzZSBpdC4KKwkKKwkqIGRldmljZS5jIChmaW5kX3Byb3BlcnR5X2VudHJ5KTogTmV3IGZ1bmN0aW9uIHJldHVybnMgdGhlCisgCWludGVybmFsIHByb3BlcnR5IHNwZWMuCisJKGRldmljZV9zZXRfcHJvcGVydHkpOiBVc2UuCisJKGRldmljZV9maW5kX3Byb3BlcnR5KTogVXNlLgorCitUdWUgRGVjIDEwIDEwOjEyOjQ0IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogcHNpbS5jIChwc2ltX21lcmdlX2RldmljZV9maWxlKTogU3RyaXAgbmV3bGluZSBmcm9tIGRldmljZQorIAlzcGVjcy4KKwkKK1R1ZSBEZWMgMTAgMTA6MTI6NDQgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCisJKiBod19odGFiLmMgKGh0YWJfbWFwX2JpbmFyeSk6IEZvciBvdmVybGFwcGluZyB0ZXh0IC8gZGF0YSBtYXBzCisgCW1lcmdlIHRoZSB0d28uICBBbHNvIGNoZWNrIHRoYXQgdGhlIG1lcmdlIGlzIHNhZmUuCisKKwkqIGVtdWxfY2hpcnAuYyAoZW11bF9jaGlycF9jcmVhdGUpOiBBZGQgYSBkZXNjcmlwdGlvbiBwcm9wZXJ0eSB0bworIAl0aGUgcHRlJ3Mgc28gdGhhdCB0aGV5IGFyZSBlYXNpZXIgdG8gaWRlbnRpZnkuCisJCisJKGVtdWxfY2hpcnBfY3JlYXRlKTogRG9uJ3Qgc3BlY2lmeSBhIGxvYWQgYWRkcmVzcyBmb3IgdGhlIENIUlAKKyAJaW1hZ2UuICBBbHdheXMgdXNlIHRoZSB2YWx1ZXMgc3BlY2lmaWVkIGJ5IHRoZSBleGVjdXRhYmxlLgorCisJKiBod19odGFiLmMgKGh0YWJfbWFwX3BhZ2UpOiBBYm9ydCBpZiBhIGR1cGxpY2F0ZSBtYXAgaXMKKyAJZW5jb3VudGVyZWQuCisKK01vbiBEZWMgIDkgMTI6MDg6NDYgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCisJKiBod19odGFiLmMgKGh0YWJfbWFwX3BhZ2UpOiBGb3JtYXR0aW5nLgorCisJKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfaW5zdHJ1Y3Rpb25fY2FsbCk6IENoZWNrIGZvciBhIE5VTEwKKyAJbWV0aG9kIG5hbWUgd2hlbiBoYW5kbGluZyB0aGUgY2xpZW50IGNhbGwuIEFsc28gY2hlY2sgZm9yIG90aGVyCisgCWJhZCBjYWxsIGFyZ3VtZW50cy4KKwkKKwkqIGVtdWxfY2hpcnAuYyAoZW11bF9jaGlycF9jcmVhdGUpOiBBbGxvdyByZWFsLW1vZGU/LCByZWFsLWJhc2UsCisgCWV0YyB0byBiZSBvdmVycmlkZW4uCisKK01vbiBEZWMgIDkgMTI6MDg6NDYgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LnRwZ2kuY29tLmF1PgorCisJKiBvc19lbXVsLmMgKG9zX2VtdWxfY3JlYXRlKTogVXNlIHRyZWUgZmluZCBwcm9wZXJ0eSBpbnN0ZWFkIG9mCisgCWRldmljZSBmaW5kIHByb3BlcnR5IC0gc2lnaC4KKworVGh1IERlYyAgNSAxMDo0Njo0MiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+CisKKwkqIDk2MTIwNTogUmVsZWFzZSBzbmFwc2hvdCA5NjEyMDUuCisJCitUaHUgRGVjICA1IDEwOjQ2OjQyIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogY29uZmlndXJlLmluIChob3N0Yml0c2l6ZSwgYml0c2l6ZSk6IEZpeCB0eXBvIGluIGVycm9yIG1lc3NhZ2UgLQorIAljYW5ub3QgY29udGFpbiBhIGNvbW1hLgorCShzaW0td2FybmluZ3MpOiBDaGVjayBmb3IgbW9yZSBwb3RlbnRpYWwgZXJyb3JzLgorCisJKiBwc2ltLmMgKHBzaW1fdXNhZ2UpOiBBZGQgLWYgPGZpbGU+IG9wdGlvbi4gIFNwZWNpZmllcyBhIGZpbGUKKyAJY29udGFpbmluZyBkZXZpY2UgdHJlZSBzcGVjaWZpY2F0aW9ucyB0aGF0IHNob3VsZCBiZSBtZXJnZWQgaW50bworIAl0aGUgZGV2aWNlIHRyZWUuCisKKwkqIGNvbmZpZ3VyZS5pbjogU29ydCBvcHRpb25zLgorCSogY29uZmlndXJlOiBSZWJ1aWxkCisJCitXZWQgRGVjICA0IDEzOjU3OjMxIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KKworCSogcHNpbS5jIChwc2ltX3VzYWdlKTogQWRkIC1uIG9wdGlvbiAtIHNwZWNpZnkgbnVtYmVyIG9mCisgCXByb2Nlc3NvcnMuCisKKwkqIGVtdWxfY2hpcnAuYzogQWRkIGRlc2NyaXB0aW9uLgorCSogZW11bF9idWdhcGkuYzogRGl0dG8uCisJKiBlbXVsX3VuaXguYzogRGl0dG8uCisJKiBlbXVsX25ldGJzZC5jOiBEaXR0by4KKworRnJpIE5vdiAyOSAxMToxMjoyMiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+CisKKwkqIGh3X3BhbC5jIChod19wYWxfYXR0YWNoX2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24sIGlmIGFuIGF0dGFjaCBpcworIAllbmNvdW50ZXJlZCwgYXNzdW1lIHRoYXQgaXQgaXMgdGhlIHNpbmdsZSBkaXNrLgorCSogaHdfcGFsLmM6IEFkZCBnZW5lcmljIGRldmljZS9zaXplIGRlY29kZSBtZXRob2RzLgorCQorCSogaHdfbnZyYW0uYyAoaHdfbnZyYW1faW5pdF9hZGRyZXNzKTogVXNlIHRoZSBmaXJzdCBub256ZXJvIHJlZworIAlwcm9wZXJ0eSBlbnRyeSB3aGVuIGRldGVybWluaW5nIHRoZSBudnJhbSBzaXplLgorCisJKiBod19jb3JlLmM6IEFkZCBnZW5lcmljIGFkZHJlc3Mvc2l6ZSBkZWNvZGUgbWV0aG9kcy4KKworCSogZW11bF9jaGlycC5jIChlbXVsX2NoaXJwX2luc3RydWN0aW9uX2NhbGwpOiBSZXR1cm4gYW5kIHRyYWNlCisgCW5vbnplcm8gc3RhdHVzIGZyb20gY2xpZW50IGZ1bmN0aW9ucy4KKworCSogbWFpbi5jIChlcnJvcik6IEFsd2F5cyBpbmNsdWRlIGEgY2FyaWFnZSByZXR1cm4gd2hlbiB3cml0aW5nIG91dAorCWVycm9ycy4KKworV2VkIE5vdiAyMCAwMDozNjo1NSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzaW1fY2FsbHMuYyAoc2ltX3Jlc3VtZSk6IFJlc2V0IHNpbV9zaG91bGRfcnVuIGlmIHNpbmdsZQorIAlzdGVwcGluZy4KKworVGh1IE5vdiAyOCAxMzoxOTo0NiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXgudHBnaS5jb20uYXU+CisKKwkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2RvX2Rpc2tpbyk6IEFkZCBzdXBwb3J0IGZvciBtdWx0aXBsZQorIAlvcHRpb25hbCBkaXNrcy4KKworCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfaGFyZHdhcmUpOiBEcm9wIHRoZSBkdW1teSBlZXByb20uCisgIAlBdHRhY2ggdGhlIHBhbCAtIGZvciBJL08gLSBhcyBhIHBzZXVkbyBkZXZpY2UgaGFuaW5nIGZyb20gdGhlCisgCWZpcm13YXJlIHN1YiB0cmVlLgorCisJKiBlbXVsX2J1Z2FwaS5jIChlbXVsX2J1Z2FwaV9jcmVhdGUpOiBBZGQgYSBzbWFsbCBtZW1vcnkgZGV2aWNlIHRvCisgCXRoZSBkZXZpY2UgdHJlZSBhdCB0aGUgYWRkcmVzcyBvZiB0aGUgaGktbWVtIGludGVycnVwdCB2ZWN0b3IKKyAJYWRkcmVzZXMuICBVc2VkIGJ5IGJ1Z2FwaSB0byBlc3RhYmxpc2ggaXRzIHRyYXAgaW5zdHJ1Y3Rpb25zLgorCQorCSogZGVidWcuaDogQWRkIGEgbmV3IG1hY3JvIERJVFJBQ0UgZm9yIHRyYWNpbmcgZGV2aWNlIGluc3RhbmNlcy4KKwkKKwkqIGRlYnVnLmg6IEV4dGVuZCB0aGUgRFRSQUNFIG1hY3JvIHNvIHRoYXQgaXQgY2FuIGFsc28gdGVzdHMgZm9yCisgCWRldmljZSBzcGVjaWZpYyB0cmFjaW50LgorCQorCSogZGV2aWNlLmgsIGRldmljZS5jIChkZXZpY2VfdHJhY2UpOiBBZGQgbWV0aG9kIHRvIGRldGVybWluZQorIAlkZXZpY2Ugc3BlY2lmaWMgdHJhY2luZy4KKwkoZGV2aWNlX2luaXRfYWRkcmVzcyk6IFNldCB0aGUgZGV2aWNlcyB0cmFjaW5nIGxldmVsLgorCQorVGh1IE5vdiAyMSAxMjowNTozMiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiB0cmVlLmgsIHRyZWUuYyAodHJlZV9kZXZpY2UpOiBOZXcgZmlsZXMgLSBzZXBhcmF0ZSBvdXQgdGhlCisgCWRldmljZSBwYXJzZXIgYW5kIG90aGVyIHRyZWUgb3BlcmF0aW9ucyBmcm9tIHRoZSBkZXZpY2UuCisJCisJKiBpbmxpbmUuaCwgaW5saW5lLmMgKElOTElORV9UUkVFKTogQWRkLgorCSogZGV2aWNlLmgsIGRldmljZS5jIChkZXZpY2VfdHJlZV9hZGRfcGFyc2VkKTogRGVsZXRlLgorCSogTWFrZWZpbGUuaW4gKHRyZWUuYyk6IEFkZCBydWxlcyBmb3IgbmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbjogQmV0dGVyIG9yZGVyIHRoZSBlbXVsXyogZmlsZXMuCisJCisJKiBlbXVsX2dlbmVyaWMuYyAoZW11bF9hZGRfdHJlZV9oYXJkd2FyZSk6IFVwZGF0ZS4KKwkqIGVtdWxfbmV0YnNkLmMgKGVtdWxfbmV0YnNkX2NyZWF0ZSk6IFVwZGF0ZS4KKwkqIGVtdWxfdW5peC5jIChlbXVsX3VuaXhfY3JlYXRlKTogRGl0dG8uCisJKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfY3JlYXRlKTogRGl0dG8uCisJKiBlbXVsX2J1Z2FwaS5jIChlbXVsX2J1Z2FwaV9jcmVhdGUpOiBEaXR0by4KKwkqIHBzaW0uYyAocHNpbV90cmVlKTogRGl0dG8uCisJKiBod19pbml0LmM6IERpdHRvLgorCQorCSogZW11bF9nZW5lcmljLmg6IEluY2x1ZGUgdHJlZS5oCisJKiBNYWtlZmlsZS5pbjogQWRkIHRvIEVNVUxfR0VORVJJQ19IIGRlcGVuZGVuY2llcy4KKwkKKwkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX3Jvb3QpOiBOZXcgZnVuY3Rpb24gLSByZXR1cm5zIHRoZQorIAlyb290IG9mIHRoZSB0cmVlLgorCSogY29yZWZpbGUuYzogVXNlLgorCQorCSogZGV2aWNlLmgsIGRldmljZS5jIChkZXZpY2VfY2xlYW4pOiBOZXcgZnVuY3Rpb24sIGNsZWFuIHVwIGRldmljZQorIAlyZWFkeSBmb3IgbmV4dCBzaW11bGF0aW9uIHJ1bi4gVGhpcyBpbmNsdWRlcyB0aGluZ3MgbGlrZSBkZWxldGluZworIAlpbnRlcnJ1cHQgZWRnZXMgYW5kIHByb3BlcnRpZXMgY3JlYXRlZCBkdXJpbmcgdGhlIHNpbXVsYXRpb24gYW5kCisgCWFsc28gc2NydWJiaW5nIGFueSBwcmUtZGVmaW5lZCBwcm9wZXJ0aWVzLgorCSogdHJlZS5jICh0cmVlX2luaXQpOiBVc2UuCisJCisJKiBkZXZpY2UuaCwgZGV2aWNlLmMgKGRldmljZV9pbml0X3N0YXRpY19wcm9wZXJ0aWVzKTogTmV3CisgCWZ1bmN0aW9uLiAgSW5pdGlhbGl6ZSBhbnkgc3RhdGljIHByZWRlZmluZWQgcHJvcGVydGllcy4gIEJ5IHN0YXRpYworIAl3ZSBtZWFuIHRob3NlIHRoYXQgaGF2ZSB2YWx1ZXMgdGhhdCBjYW4gYmUgZGV0ZXJtaW5lZCBiZWZvcmUgdGhlCisgCWRldmljZSB0cmVlIGluaXRpYWxpemF0aW9uIGhhcyBzdGFydGVkLgorCSogdHJlZS5jICh0cmVlX2luaXQpOiBVc2UuCisKKwkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX2luaXRfYWRkcmVzcyk6IEFkZCBjb2RlIHRvCisgCWNoZWNrL3ZlcmlmeSB0aGUgZGV2aWNlcyAjYWRkcmVzcy1jZWxscyBhbmQgI3NpemUtY2VsbHMuCisJKGRldmljZV9hZGRfaW50ZWdlcl9wcm9wZXJ0eSk6IERlbGV0ZSBjb3JyZXNwb25kaW5nIGNvZGUuCisJKGRldmljZV9ucl9hZGRyZXNzX2NlbGxzLCBkZXZpY2VfbnJfZGF0YV9jZWxscyk6IENoZWNrIGZvcgorCXByb3BlcnR5IHdoZW4gcmV0dXJuaW5nIHZhbHVlLgorCQorCSogZGV2aWNlLmgsIGRldmljZS5jIChkZXZpY2VfaW5pdF9ydW50aW1lX3Byb3BlcnRpZXMpOiBOZXcKKyAJZnVuY3Rpb24uICBJbml0aWFsaXplIHRob3NlIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IGBzdGF0aWMnLiAgQXQKKyAJcHJlc2VudCB0aGUgb25seSBzdWNoIHByb3BlcnR5IGlzIHRoZSBpaGFuZGxlLgorCSogdHJlZS5jICh0cmVlX2luaXQpOiBVc2UuCisJCisJKiBkZXZpY2UuaCwgZGV2aWNlLmMgKHJlZywgcmFuZ2VzKTogUmV3b3JrIHRoZXNlIHNvIHRoYXQgdGhleSB1c2UKKyAJYW4gYXJyYXkgb2YgdGhlIGZ1bmRhbWVudGFsIHR5cGUgLSBzaW5nbGUgcmVnIG9yIHNpbmdsZSByYW5nZQorIAllbnRyeS4KKwkKKwkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX2FkZF9paGFuZGxlX3J1bnRpbWVfcHJvcGVydHkpOgorIAlSZS1pbXBsZW1lbnQgdGhlIGFkZGluZyBvZiBhbiBpaGFuZGxlIGR1cmluZyB0cmVlIGNvbnN0cnVjdGlvbiBzbworIAl0aGF0IGl0IGJldHRlciBmaXRzIGluIHdpdGggZGV2aWNlIGluaXRpYWxpemF0aW9uLgorCQorVGh1IE5vdiAyMSAxMjowNTozMiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBkZXZpY2UuaCwgZGV2aWNlLmMgKGRldmljZV9pb2N0bCk6IEFkZCBhZGRpdGlvbmFsIGFyZ3VtZW50IC0KKyAJcmVxdWVzdCAtIHNvIHRoYXQgdGhlIGNhbGxlciBtdXN0IGFsd2F5cyBzcGVjaWZ5IHRoZSB0eXBlIG9mCisgCXRoZSBpb2N0bCByZXF1ZXN0LgorCisJKiBkZXZpY2VfdGFibGUuaDogVXBkYXRlLgorCSogaHdfdHJhY2UuYyAoaHdfdHJhY2VfaW9jdGwpOiBEaXR0by4KKwkqIGh3X3ZtLmMgKGh3X3ZtX2lvY3RsX2NhbGxiYWNrKTogRGl0dG8uCisJKiBod19pbml0LmMgKGh3X3N0YWNrX2lvY3RsX2NhbGxiYWNrKTogRGl0dG8uCisJKiBwc2ltLmMgKHBzaW1fb3B0aW9ucyk6IERpdHRvLgorCQorVGh1IE5vdiAyMSAxMjowNTozMiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCQorCSogQlVHUzogVXBkYXRlZCBhIGJpdC4KKworV2VkIE5vdiAyMCAxNDowNjozNyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBod19vcGljLmM6IEZpbmlzaCAtIHRoaXJkIHJvdW5kLgorCitXZWQgTm92IDIwIDEyOjAyOjA4IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGh3X2dsdWUuYyAoaHdfZ2x1ZV9pb19yZWFkX2J1ZmZlcl9jYWxsYmFjayk6IEZpeCBtaXNjYWxjIG9mIGdsdWUKKyAJcmVnIGluZGV4LgorCShod19nbHVlX2lvX3dyaXRlX2J1ZmZlcl9jYWxsYmFjayk6IERpdHRvLgorCitUdWUgTm92IDE5IDIxOjE3OjA4IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGV2ZW50cy5jIChldmVudF9xdWV1ZV9wcm9jZXNzKTogV2FzIGluY29ycmVjdGx5IGNvbnN1bWluZyBmdXR1cmUKKyAJZXZlbnRzIG9uIHRoZSBxdWV1ZSB3aGVuIHRoZXkgc2hvdWxkIGJlIGxlZnQgYWxvbmUuCisKKwkqIGRlYnVnLmgsIGRlYnVnLmMgKGV2ZW50cyk6IEFkZCBzdXBwb3J0IGZvciBldmVudCBxdWV1ZSB0cmFjaW5nLgorCSogZXZlbnRzLmM6IEFkZCBldmVudCB0cmFjaW5nLgorCQorCSogZGVidWcuaCwgZGVidWcuYzogT3JkZXIgZGV2aWNlIHRyYWNlIG9wdGlvbnMuCisJCitGcmkgTm92IDE1IDE1OjIzOjM5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogcGtfZGlza2xhYmVsLmMgKHBrX2Rpc2tsYWJlbF9jcmVhdGVfaW5zdGFuY2UpOiBGaXggdXAgc29tZQorCXdhcm5pbmdzIGdlbmVyYXRlZCBieSBHQ0MuCisKK1N1biBOb3YgMTcgMTc6NTk6MTQgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogc2ltLWVuZGlhbi5oOiBBZGQgTEUgdmVyc2lvbnMgb2YgYnl0ZSBzd2FwIG1hY3Jvcy4gIE5lZWRlZCBmb3IKKyAJUENJIGRldmljZXMgd2hpY2ggYXJlIGxpdHRsZS1lbmRpYW4uCisJCisJKiBzaW0tZW5kaWFuLW4uaCAoZW5kaWFuX2xlMmhfTiwgZW5kaWFuX2gybGVfTik6IERpdHRvCisKK1N1biBOb3YgMTcgMTc6NTk6MTQgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogaHdfaW9idXMuYyAoaHdfaW9idXNfYXR0YWNoX2FkZHJlc3NfY2FsbGJhY2spOiBDaGFuZ2UgdGhlIGlvYnVzCisgCXNvIHRoYXQgaXQgaXMgaW1wbGVtZW50aW5nIGEgMS0xIGFkZHJlc3MgbWFwLgorCQorCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfaGFyZHdhcmUpOiBBZGp1c3QuCisKKwkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX2hhcmR3YXJlKTogRG9uJ3QgYWRkIHRoZSBudnJhbSBhcworIAlhIGRlZmF1bHQuCisKK1N1biBOb3YgMTcgMTc6NTk6MTQgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKwkKKwkqIGRldmljZS5jIChzcGxpdF9maW5kX2RldmljZSk6IEJlIHRvbGVyYW50IG9mIG1pc3NpbmcgdW5pdAorIAlhZGRyZXNzZXMuCisKK0ZyaSBOb3YgMTUgMTY6NDk6NDkgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogYmFzaWNzLmggKHBvcnRfZGlyZWN0aW9uKTogTmV3IHR5cGUsIHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZgorIAlhbnkgYHBvcnQnLgorCQorCSogZGV2aWNlLmgsIGRldmljZS5jIChkZXZpY2VfaW50ZXJydXB0X2RlY29kZSk6IEluY2x1ZGUKKyAJc3BlY2lmaWNhdGlvbiBvZiBwb3J0IGRpcmVjdGlvbiBpbiBvcGVyYXRpb25zLgorIAkoZGV2aWNlX2ludGVycnVwdF9lbmNvZGUpOiBEaXR0by4KKwkKKwkqIGRldmljZV90YWJsZS5oOiBBZGQgYSBkaXJlY3Rpb24gZmllbGQgdG8gdGhlIGludGVycnVwdCBwb3J0CisgCXRhYmxlLgorCisJKiBkZXZpY2UuYyAoZGV2aWNlX3RyZWVfYWRkX3BhcnNlZCk6IFNwZWNpZnkgcG9ydCBkaXJlY3Rpb24uCisJCitUaHUgTm92IDE0IDIxOjM4OjEzIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGh3X29waWMuYzogRmluaXNoIC0gc2Vjb25kIHJvdW5kLgorCitUaHUgTm92ICA3IDAwOjE4OjU5IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGh3X2h0YWIuYyAoaHRhYl9pbml0X2RhdGFfY2FsbGJhY2spOiBBbGxvdyB0aGUgdmlydHVhbC1hZGRyZXNzCisgCXRvIGJlIHNwZWNpZmllZCBhcyBhbiBhcnJheSB3aGljaCBhbGxvd3MgNjRiaXQgYWRkcmVzc2VzLgorCisJKiBkZXZpY2UuYyAoZGV2aWNlX2ZpbmRfaW50ZWdlcl9hcnJheV9wcm9wZXJ0eSk6IE5ldyBmdW5jdGlvbi4KKyAgCVNpbXBsaWZ5IHRoZSBxdWVyeWluZyBvZiBlbGVtZW50cyBvZiBhbiBpbnRlZ2VyIGFycmF5LgorCShkZXZpY2VfYWRkX2ludGVnZXJfcHJvcGVydHksIGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkpOgorIAlVcGRhdGUgdG8gY29ycmVjdGx5IHVzZSB0aGUgY2VsbCB0eXBlLgorCisJKiB2bS5jIChvbV91bnBhY2tfc3IpOiBDbGFyaWZ5IHNoaWZ0aW5nIGNvbW1lbnQuCisJKG9tX3B0ZV8wX21hc2tlZF92c2lkKTogRGl0dG8uIEFkZCA2NGJpdCB2ZXJzaW9uLgorCisJKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfY3JlYXRlKTogSW5pdGlhbGl6ZSB0aGUgc2VnbWVudAorIAlyZWdpc3RlcnMuCisKKwkqIHZtLmMgKG9tX2VmZmVjdGl2ZV90b192aXJ0dWFsKTogVHJhY2Ugc2VnbWVudCByZWdpc3RlciB1c2UuCisKKwkqIGh3X2h0YWIuYyAoaHRhYl9tYXBfcGFnZSk6IFByaW50IG91dCB0aGUgcHRlZyBiYXNlIGFkZHJlc3MgdG8KKyAJc2ltcGxpZnkgY3Jvc3MgY2hlY2tpbmcgYmV0d2VlbiB2bSBhbmQgdGhlIGh0YWIuCisJKGh0YWJfZGVjb2RlX2hhc2hfdGFibGUpOiBVc2UgZGV2aWNlX2Vycm9yIGluc3RlYWQgb2YgZXJyb3IuCisJKGh0YWJfbWFwX3BhZ2UpOiBEaXR0by4KKwkoaHRhYl9kbWFfYmluYXJ5KTogRGl0dG8uCisJKGh0YWJfbWFwX2JpbmFyeSk6IERpdHRvLgorCShodGFiX2luaXRfZGF0YV9jYWxsYmFjayk6IERpdHRvLgorCitXZWQgTm92ICA2IDIwOjIwOjU4IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGludGVycnVwdHMuaDogQ2xhcmlmeSB3aGF0IHRoZSBvcHRpb25hbCBpbnN0cnVjdGlvbiBwcm9ncmFtCisgCWludGVycnVwdCBpcyAtIGEgc3Vic2V0IG9mIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gcHJvZ3JhbSBpbnRlcnJ1cHQuCisKKwkqIGludGVycnVwdHMuYyAocHJvZ3JhbV9pbnRlcnJ1cHQpOiBGb3IgVUVBIG1vZGUsIGNsYXJpZnkgd2hhdCBhbgorIAlvcHRpb25hbCBpbnN0cnVjdGlvbiBwcm9ncmFtIGludGVycnVwdCBpcy4KKwkocHJvZ3JhbV9pbnRlcnJ1cHQpOiBGb3IgT0VBIG1vZGUsIGFzIHBlciBzcGVjLCBnZW5lcmF0ZSBhbgorIAlpbGxlZ2FsIGluc3RydWN0aW9uIHByb2dyYW0gaW50ZXJydXB0IHdoZW4gYW4gb3B0aW9uYWwgaW5zdHJ1Y3Rpb24KKyAJaXMgZW5jb3VudGVyZWQuCisJCisJKiBnZW4tc2VtYW50aWNzLmMgKHByaW50X3NlbWFudGljX2JvZHkpOiBEZWxldGUgY29kZQorIAlkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBhbiB1bmltcGxlbWVudGVkIGZsb2F0aW5nIHBvaW50IGFuZCBub3JtYWwKKyAJaW5zdHJ1Y3Rpb24uICBJbnN0ZWFkLCBzdWNoIGEgY2FzZSBjYW4gYmUgaGFuZGxlZCBleHBsaWNpdGx5LgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zIChzdG9yZSBmbG9hdGluZy1wb2ludCBhcyBpbnRlZ2VyIHdvcmQgaW5kZXhlZCk6CisgCU1hcmsgYXMgb3B0aW9uYWwuCisJKEZsb2F0aW5nIENvbnZlcnQgdG8gSW50ZWdlciBEb3VibGV3b3JkKTogTWFrZSB0aGUgZmxvYXRpbmcgcG9pbnQKKyAJYXNzaXN0IGludGVycnVwdCBleHBsaWNpdC4KKwkoRmxvYXRpbmcgQ29udmVydCBUbyBJbnRlZ2VyIERvdWJsZXdvcmQgd2l0aCByb3VuZCB0b3dhcmRzIFplcm8pOgorIAlEaXR0by4KKwkoRmxvYXRpbmcgQ29udmVydCBUbyBJbnRlZ2VyIFdvcmQpOiBEaXR0bworCShNb3ZlIEZyb20gRlBTQ1IpOiBEaXR0by4KKwkoTW92ZSB0byBDb25kaXRpb24gUmVnaXN0ZXIgZnJvbSBGUFNDUik6IERpdHRvLgorCShNb3ZlIFRvIEZQU0NSIEZpZWxkcyk6IERpdHRvLgorCShNb3ZlIFRvIEZQU0NSIEZpZWxkIEltbWVkaWF0ZSk6IERpdHRvLgorCShNb3ZlIFRvIEZQU0NSIEJpdCAwKTogRGl0dG8uCisJKE1vdmUgVG8gRlBTQ1IgQml0IDEpOiBEaXR0by4KKwkKK01vbiBOb3YgIDQgMTI6NDk6MTMgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogY29yZWZpbGUuYyAoY29yZV9tYXBfcmVhZF9idWZmZXIsIGNvcmVfbWFwX3dyaXRlX2J1ZmZlcik6IEF2b2lkCisgCWJyZWFraW5nIHVwIHRyYW5zZmVycy4KKworCSogY29yZWZpbGUuYzogQWRqdXN0IGFyZ3VtZW50cyBzbyB0aGF0IHRoZSBjbGllbnQgc2VydmVyCisJcmVsYXRpb25zaGlwIGlzIGNsYXJpZmllZC4KKwkKKwkqIGh3X2dsdWUuYyAoaHdfZ2x1ZV9pbml0X2FkZHJlc3MpOiBVcGRhdGUgc28gaXQgY2FuIGJlIGF0dGFjaGVkCisgCXRvIGEgUENJIGJ1cy4KKworCSogaHdfZGlzay5jIChod19kaXNrX2luc3RhbmNlX3dyaXRlKTogQWRkIG1vcmUgY2hlY2tzIHRvIGRpc2sgSU8gLQorIAlsb29raW5nIGZvciB0aGluZ3MgbGlrZSBvdmVyZmxvdy91bmRlcmZsb3cuCisKK1N1biBOb3YgIDMgMTg6NDU6MjAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfaGFyZHdhcmUpOiBIYW5nIHRoZSBkaXNrIG9mZiB0aGUKKyAJUEFMIGRldmljZSBpbnN0ZWFkIG9mIHRoZSBJT0JVUy4gIFRoZSBkaXNrIG11c3QgYmUgYXR0YWNoZWQgdG8gYQorIAlsb2dpY2FsIGJ1cy4KKworCSogaHdfZGlzay5jIChod19kaXNrX2luaXRfYWRkcmVzcyk6IEp1c3QgdXNlIHRoZSB1bml0IGFkZHJlc3MKKyAJZGlyZWN0bHkgaW4gdGhlIGF0dGFjaCAtIHRoZSByZXN0IGlzbid0IHJlbGV2YW50LgorCitTYXQgTm92ICAyIDIxOjQ4OjU3IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGNvbmZpZ3VyZS5pbiAoc2ltLWhhcmR3YXJlLCBzaW0tcGFja2FnZXMpOiBBbGxvdyBhZGRpdGlvbmFsCisgCWhhcmR3YXJlIGFuZCBwYWNrYWdlcyB0byBiZSBwcmVmaXhlZCBhcyB3ZWxsIGFzIGFwcGVuZGVkLgorCisJKiBNYWtlZmlsZS5pbiAodG1wLWh3LCB0bXAtcGspOiBSZXRhaW4gdGhlIHVzZXIgc3BlY2lmaWVkIG9yZGVyIG9mCisgCXBhY2thZ2VzIHdoZW4gYnVpbGRpbmcgdGhlbS4gIENvbnNlcXVlbnRseSwgYSB1c2VyIGNhbiBvdmVycmlkZSBhCisgCXN0YW5kYXJkIGRldmljZSBieSBwcmVmaXhpbmcgdGhlaXIgb3duIHZlcnNpb24uCisJCisJKiBNYWtlZmlsZS5pbiAoaHdfb3BpYy5vLCBod19wY2kubywgaHdfaWRlLm8pOiBBZGQgZGVwZW5kZW5jaWVzLgorCitGcmkgTm92ICAxIDE0OjQyOjU3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogbW9uLmMgKF9jcHVfbW9uKTogQWRkIGZpZWxkcyBmb3IgY291bnRpbmcgMSwgMiwgNCwgYW5kIDggYnl0ZQorCXJlYWRzIGFuZCB3cml0ZXMuCisJKG1vbl97cmVhZCx3cml0ZX0pOiBDb3VudCAxLCAyLCA0LCBhbmQgOCBieXRlIHJlYWRzL3dyaXRlcy4KKwkobW9uX3ByaW50X2luZm8pOiBDb3JyZWN0IHR5cG8gcmVnYXJkaW5nICMgb2YgdW5hbGlnbmVkIHJlYWRzIGFuZAorCXdyaXRlcy4gIFByaW50IG91dCBob3cgbWFueSAxLCAyLCA0LCBhbmQgOCBieXRlIHJlYWRzL3dyaXRlcyB0aGVyZQorCWFyZS4KKworVHVlIE9jdCAyOSAxNzo1NTo0MyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoQUNfQ0hFQ0tfRlVOQ1MpOiBBZGQgYWNjZXNzLgorCSogY29uZmlney5pbix1cmV9OiBSZWdlbmVyYXRlLgorCisJKiBlbXVsX3VuaXguYyAoZG9fdW5peF9ub3ApOiBTeXN0ZW0gY2FsbCB0aGF0IGFsd2F5cyBzdWNjZWVkcy4KKwkoZG9fdW5peF9hY2Nlc3MpOiBTdXBwb3J0IGFjY2VzcyBzeXN0ZW0gY2FsbC4KKwkoc29sYXJpc19kZXNjcmlwdG9ycyk6IE1ha2Ugc2lnYWx0c3RhY2sgYW5kIHNpZ2FjdGlvbiBub3BzLgorCSh7c29sYXJpcyxsaW51eH1fZGVzY3JpcHRvcnMpOiBBZGQgc3VwcG9ydCBmb3IgYWNjZXNzLgorCitUdWUsIDggT2N0IDE4OjQyOjI2IDE5OTYgIEphc29uIE1vbGVuZGEgPGNyYXNoQGN5Z251cy5jby5qcD4KKyAgICAgICAgCisJKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiBNb3ZlIGNvbmZpZy5sb2cgdG8gZGlzdGNsZWFuLgorCitGcmkgTm92ICAxIDE2OjQ0OjI4IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGNvcmVmaWxlLW4uaCAoY29yZV9tYXBfd3JpdGVfTik6IEltcHJvdmUgYWJvcnQgbWVzc2FnZXMuCisKKwkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX2F0dGFjaF9hZGRyZXNzKTogUmVtb3ZlIHVudXNlZCBuYW1lCisgCXBhcmFtZXRlci4KKyAJKGRldmljZV9kZXRhY2hfYWRkcmVzcyk6IERpdHRvLgorCSogZGV2aWNlX3RhYmxlLmgsIGRldmljZV90YWJsZS5jOiBVcGRhdGUuCisJKiBod19pb2J1cy5jIChod19pb2J1c19hdHRhY2hfYWRkcmVzc19jYWxsYmFjayk6IERpdHRvLgorCSogaHdfbnZyYW0uYyAoaHdfbnZyYW1faW5pdF9hZGRyZXNzKTogRGl0dG8uCisJKiBod19tZW1vcnkuYyAoaHdfbWVtb3J5X2luaXRfYWRkcmVzcyk6IERpdHRvLgorCSogaHdfdm0uYyAoaHdfdm1faW5pdF9hZGRyZXNzX2NhbGxiYWNrKTogRGl0dG8uCisJKGh3X3ZtX2F0dGFjaF9hZGRyZXNzKTogRGl0dG8uCisJKGh3X3ZtX2FkZF9zcGFjZSk6IERpdHRvLgorCSogaHdfaW5pdC5jICh1cGRhdGVfZm9yX2JpbmFyeV9zZWN0aW9uKTogRGl0dG8uCisJKiBod19jb3JlLmMgKGh3X2NvcmVfYXR0YWNoX2FkZHJlc3NfY2FsbGJhY2spOiBEaXR0by4KKworCSogaHdfaW9idXMuYyAoaHdfaW9idXNfYXR0YWNoX2FkZHJlc3NfY2FsbGJhY2spOiBSZXdyaXRlIHRvIGhhbmRsZQorIAljb25maWd1cmFibGUgcGFyZW50IGJ1c3Nlcy4KKworV2VkIE9jdCAzMCAxODo0NjozMiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBkZXZpY2VfdGFibGUuYyAoZ2VuZXJpY19kZXZpY2Vfc2l6ZV90b19hdHRhY2hfc2l6ZSk6IFByb3ZpZGUKKyAJbGltaXRlZCBzdXBwb3J0IGZvciBtdWx0aS1jZWxsIHNpemVzLgorCShnZW5lcmljX2RldmljZV9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzKTogRGl0dG8gZm9yIGFkZHJlc3Nlcy4KKworVHVlIE9jdCAyOSAwMjowMToyOSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBkZXZpY2UuYyAoZGV2aWNlX2FkZF9pbnRlZ2VyX3Byb3BlcnR5KTogQ2hlY2sgZm9yIHNldHRpbmcgb2YKKyAJI2FkZHJlc3MtY2VsbHMgYW5kICNzaXplLWNlbGxzIHByb3BlcnRpZXMuICBGb3IgdGhlc2UsIHVwZGF0ZSB0aGUKKyAJY29ycmVzcG9uZGluZyBkZXZpY2UgdmFsdWVzLgorCShkZXZpY2VfbnJfYWRkcmVzc19jZWxscywgZGV2aWNlX25yX3NpemVfY2VsbHMpOiBVc2UgdGhlIHZhbHVlCisgCWZyb20gdGhlIGRldmljZSBpbnN0ZWFkIG9mIHRoZSBwcm9wZXJ0eS4KKworCSogaHdfY29yZS5jOiBVc2UgZ2VuZXJpYyBhZGRyZXNzIGFuZCBzaXplIGNvbnZlcnNpb25zIGZvciB0aGUgdG9wCisgCWJ1cy4KKworCSogaHdfbWVtb3J5LmMgKGh3X21lbW9yeV9pbml0X2FkZHJlc3MpOiBUb2xlcmF0ZSBjYXNlIHdoZXJlCisgCSNhZGRyZXNzIGFuZCAjc2l6ZSBjZWxscyBpcyBncmVhdGVyIHRoYW4gMS4KKworCSogZGV2aWNlLmMgKGRldmljZV90cmVlX3ByaW50X2RldmljZSk6IENsZWFuIG91dCBwcmludGluZyBvZgorIAlwcm9wZXJ0aWVzLgorCQorCSogZGV2aWNlLmMgKHNwbGl0X2RldmljZV9zcGVjaWZpZXIpOiBEb24ndCBkZXRlY3QgY29tbWVudHMgaGVyZSAtCisgCSIjIiBjYW4gYmUgYSB2YWxpZCBwcmVmaXggLSBlZyAjc2l6ZS1jZWxscy4KKworCSogcHNpbS5jIChwc2ltX21lcmdlX2RldmljZV9maWxlKTogU3VwcHJlc3MgY29tbWVudHMgYW5kIGJsYW5rCisgCWxpbmVzIGhlcmUuCisKKwkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX2hhcmR3YXJlKTogRml4IHR5cG8gb2YgaW5jb3JyZWN0CisgCXBhbCB1bml0IGFkZHJlc3MuICBBZGQgdGhlIHByb3BlcnR5IC8jYWRkcmVzcy1jZWxscyB0byB0aGUgcm9vdCBvZgorIAl0aGUgdHJlZS4KKworCSogZGV2aWNlLmMgKGRldmljZV90ZW1wbGF0ZV9jcmVhdGVfZGV2aWNlKTogQ2hlY2sgdGhhdCB0aGUgdW5pdAorIAlhZGRyZXNzIHdhcyBzdWNjZXNzZnVsbHkgcGFyc2VkLgorCisJKiBkZXZpY2VfdGFibGUuYyAoZ2VuZXJpY19kZXZpY2VfdW5pdF9kZWNvZGUpOiBSZXdyaXRlIHRvIGJldHRlcgorIAloYW5kbGUgbXVsdGktY2VsbCBhZGRyZXNzZXMuCisJKGdlbmVyaWNfZGV2aWNlX3VuaXRfZW5jb2RlKTogRGl0dG8uCisKKwkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX2hhcmR3YXJlKTogInJlZyIgcHJvcGVydGllcyBubworIAlsb25nZXIgbmVlZCB0aGUgZXhwbGljaXQgYXJyYXkgdHlwZSAtIHRoZSBwYXJzZXIgdGFrZXMgY2FyZSBvZiBpdC4KKworCSogcGtfZGlza2xhYmVsLmMgKHBrX2Rpc2tsYWJlbF9jcmVhdGVfaW5zdGFuY2UpOiBBZGQgTlVMTCByZXR1cm4KKyAJdG8ga2VlcCBHQ0MgaGFwcHkuCisKK01vbiBPY3QgMjggMjI6NTU6NDggMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogaHdfaWRlLmM6IE5ldyBmaWxlLiAgTW9kZWwgb2YgYSBiYXNpYyBJREUgaW50ZXJmYWNlIGF0dGFjaGVkIHRvCisgCWEgUENJIGJ1cy4KKwkKKwkqIGNvbmZpZ3VyZS5pbiAoaGFyZHdhcmUpOiBBZGQgdGhlIGlkZSBkZXZpY2UgdG8gdGhlIGRlZmF1bHQKKyAJY29uZmlndXJhdGlvbi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkKKwkqIGRlYnVnLmgsIGRlYnVnLmM6IEFkZCB0cmFjaW5nIG9wdGlvbiBmb3IgdGhlIElERSBkZXZpY2UuCisJCitGcmkgT2N0IDI1IDIxOjI4OjI1IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGh3X3BoYi5jLCBod19waGIuaDogTmV3IGZpbGVzIC0gaW1wbGVtZW50IGEgUEhCLgorCisJKiBjb25maWd1cmUuaW4gKGhhcmR3YXJlKTogQWRkIHRoZSBwaGIgdG8gdGhlIGxpc3Qgb2YgZGV2aWNlcyB0bworIAlidWlsZCBieSBkZWZhdWx0LgorCitGcmkgT2N0IDI1IDIxOjI4OjI1IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGh3X2NvbS5jOiBSZXZpZXcgZGVzY3JpcHRpb24uCisJKiBod19kaXNrLmM6IERpdHRvLgorCSogaHdfaHRhYi5jOiBEaXR0by4KKwkqIGh3X2VlcHJvbS5jOiBEaXR0by4KKwkqIGh3X2luaXQuYzogRGl0dG8uCisJKiBod19jcHUuYzogRGl0dG8uCisJCisJKiBod19jb20uYzogVXBkYXRlIGV2ZW50IGhhbmRsaW5nLgorCisJKiBod19kaXNrLmM6IEltcGxlbWVudCB0cmFjaW5nLgorCQorRnJpIE9jdCAyNSAyMToyODoyNSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBkZXZpY2VfdGFibGUuYyAoZ2VuZXJpY19kZXZpY2VfaW5pdF9hZGRyZXNzKTogVXNlCisgCWFzc2lnbmVkLWFkZHJlc3NlcyBwcm9wZXJ0eSBpbiBwcmVmZXJlbmNlIHRvIGFueSBvdGhlciByZWcKKyAJcHJvcGVydHkuCisKK0ZyaSBPY3QgMjUgMjE6Mjg6MjUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGV2aWNlLmgsIGRldmljZS5jIChkZXZpY2VfZmluZF9yYW5nZXNfcHJvcGVydHkpOiBOZXcgZnVuY3Rpb24uCisgIAlTaW1wbGlmeSB0aGUgbWFuaXB1bGF0aW9uIG9mICJyYW5nZXMiIHByb3BlcnRpZXMuCisJCisJKiBkZXZpY2UuYyAoZGV2aWNlX2FkZF9wYXJzZWQpOiBFeHRlbmQgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUKKyAJcmFuZ2VzIHByb3BlcnR5LgorCisJKiBkZXZpY2UuYyAoZGV2aWNlX2FkZF9wYXJzZWQpOiBBZGQgYXNzaWduZWQtYWRkcmVzc2VzIHRvIHRoZSBsaXN0CisgCW9mIHJlZyB0eXBlIHByb3BlcnRpZXMuCisJCisJKiBkZXZpY2UuYyAoZGV2aWNlX3RyZWVfcHJpbnRfZGV2aWNlKTogQWRkIGNvZGUgdG8gZm9ybWF0IGFuZAorIAlwcmludCBhIHJhbmdlcyBwcm9wZXJ0eS4KKwkKKwkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX25yX2FkZHJlc3NfY2VsbHMsCisgCWRldmljZV9ucl9zaXplX2NlbGxzKTogTmV3IGZ1bmN0aW9ucy4gRGV0ZXJtaW5lIHRoZSB2YWx1ZXMgb2YgdGhlCisgCXN0YW5kYXJkIHByb3BlcnRpZXMgI2FkZHJlc3MtY2VsbHMgYW5kICNzaXplLWNlbGxzLiAgQm90aCBvZiB3aGljaAorIAlhcmUgb3B0aW9uYWwgYW5kIGhhdmUgZGVmYXVsdCB2YWx1ZXMgb2YgdHdvIGFuZCBvbmUgcmVzcGVjdGZ1bHkuCisgIAlQcmV2aW91c2x5LCBjb2RlIHRoYXQgZGV0ZXJtaW5lZCAjYWRkcmVzcy1jZWxscyB3YXMgaW5jb3JyZWN0bHkKKyAJdXNpbmcgYSB2YWx1ZSBvZiBvbmUuCisKK0ZyaSBPY3QgMjUgMjE6Mjg6MjUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGVidWcuaCwgZGVidWcuYzogU29ydCBkZWJ1ZyBvcHRpb25zLCBBZGQgZW50cmllcyBmb3IgdGhlCisgCWNvbW1pbmcgUEhCIGRldmljZS4KKwkKK0ZyaSBPY3QgMTggMTI6MTI6MjEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zIChGbG9hdGluZyBTZWxlY3QpOiBBZGQgc3VwcG9ydCBmb3IgZnNlbCB1bmxlc3MKKwltb2RlbCBpcyA2MDEuICBBbGxvdyB1c2VyIHRvIGZpbHRlciBvdXQgaW5zdHJ1Y3Rpb24gdW5sZXNzIC1GcyBpcworCXBhc3NlZCB0byBpZ2VuLgorCShTdG9yZSBGbG9hdGluZy1Qb2ludCBhcyBJbnRlZ2VyIFdvcmQgSW5kZXhlZCk6IFJhaXNlIG9wdGlvbmFsCisJaW5zdHJ1Y3Rpb24gcHJvZ3JhbSBhYm9ydC4gIEFsbG93IHVzZXIgdG8gZmlsdGVyIG91dCBpbnN0cnVjdGlvbgorCXVubGVzcyAtRnMgaXMgcGFzc2VkIHRvIGlnZW4uCisJKEZsb2F0aW5nIFNxdWFyZSBSb290eywgU2luZ2xlfSk6IERpdHRvLgorCShGbG9hdGluZyBSZWNpcHJvY2FsIEVzdGltYXRlIFNpbmdsZSk6IERpdHRvLgorCShGbG9hdGluZyBSZWNpcHJvY2FsIFNxdWFyZSBSb290IEVzdGltYXRlKTogRGl0dG8uCisKKwkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtc2ltLWZpbHRlcik6IElmIG5vdCBwYXNzZWQsIHBhc3MgMzIsZixzCisJdG8gaWdlbi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworCSogaW50ZXJydXB0cy5oIChwcm9ncmFtX2ludGVycnVwdF9yZWFzb25zKTogQWRkCisJb3B0aW9uYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQuCisKKwkqIGludGVycnVwdHMuYyAocHJvZ3JhbV9pbnRlcnJ1cHQpOiBDYWxsIGVycm9yIHdpdGggbW9yZSBkZXRhaWxlZAorCWluZm9ybWF0aW9uIG9uIHByb2dyYW0gaW50ZXJydXB0cywgcGFydGljdWxhcmx5IGluIHVzZXIgbW9kZS4gIEFkZAorCXN1cHBvcnQgZm9yIG9wdGlvbmFsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0LgorCitXZWQgU2VwIDI1IDEwOjIwOjI5IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGh3X2dsdWUuYzogTmV3IGRldmljZS4gIEhvb2tzIGZvciBtYW5pcHVsYXRpbmcgaW50ZXJydXB0IHBvcnRzLgorCisJKiBkZWJ1Zy5oLCBkZWJ1Zy5jICh0cmFjZV9nbHVlX2RldmljZSk6IEFkZCB0cmFjaW5nIHN1cHBvcnQgZm9yCisgICAgICAgIHRoZSBpbnRlcnJ1cHQgZ2x1ZSBsb2dpYyBkZXZpY2UuCisKKwkqIGNvbmZpZ3VyZS5pbiAoaGFyZHdhcmUpOiBBZGQgZ2x1ZSBkZXZpY2UuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKK1R1ZSBTZXAgMjQgMjA6NTU6MzggMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGV2aWNlLmMgKGRldmljZV90cmVlX3BhcnNlX2ludGVnZXJfcHJvcGVydHkpOiBOZXcgZnVuY3Rpb24sCisgICAgICAgIHBhcnNlIGEgbGlzdCBvZiBpbnRlZ2VycyBhcyBhbiBhcnJheSBwcm9wZXJ0eS4KKwkoZGV2aWNlX3RyZWVfYWRkX3BhcnNlZCk6IENhbGwgaXQuCisKKwkqIGRldmljZS5jIChkZXZpY2VfdHJlZV9wYXJzZV9zdHJpbmdfcHJvcGVydHkpOiBOZXcgZnVuY3Rpb24sCisgICAgICAgIHBhcnNlIGEgbGlzdCBvZiBzdHJpbmdzIGFzIGEgc3RyaW5nIHByb3BlcnR5ICh3aXRoIGVtYmVkZWQKKyAgICAgICAgbnVsbCdzKS4gIEZvciBtb21lbnQsIGRvbid0IHRyeSB0byBpbXBsZW1lbnQgYSBjb21wbGV4dCBzdHJpbmcKKyAgICAgICAgcGFyc2VyLgorCShkZXZpY2VfdHJlZV9hZGRfcGFyc2VkKTogQ2FsbCBpdC4KKworVHVlIFNlcCAyNCAxNjozMDo0OCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBod19vcGljLmM6IE5ldyBmaWxlLiAgT3BlblBJQyBpbnRlcnJ1cHQgY29udHJvbGxlci4KKworCSogY29uZmlndXJlLmluIChoYXJkd2FyZSk6IEFkZCBvcGljIGRldmljZS4KKwkqIGNvbmZpZ3VyZTogcmUtZ2VuZXJhdGUuCisKKwkqIGh3X3BpYy5jOiBEZWxldGUsIHJlcGxhY2VkIHdpdGggaHdfb3BpYy5jLgorCisJKiBkZWJ1Zy5oLCBkZWJ1Zy5jOiBBZGQgZGVidWcgb3B0aW9uIGZvciBPcGVuUElDIGRldmljZS4gLQorICAgICAgICBvcGljLWRldmljZS4KKworVHVlIFNlcCAyNCAxNjozMDo0OCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBNYWtlZmlsZS5pbiAocHNpbS5vLCBpZGVjb2RlLm8pOiBTaW5jZSBpZGVjb2RlIGFuZCBub3QgcHNpbSBpcworICAgICAgICBub3cgdGhlIGZpbGUgdGhhdCBkb2VzIGFsbCB0aGUgaW5saW5pbmcuCisKKwkqIE1ha2VmaWxlLmluIChMSUJfU1JDLCBMSUJfSU5MSU5FX1NSQywgaWRlY29kZS5vKTogQnJlYWsgb3V0IHRoZQorICAgICAgICBsaWJyYXJ5IHNvdXJjZSBjb2RlIHRoYXQgY291bGQgYmUgaW52b2x2ZWQgaW4gYW4gaW5saW5pbmcuICBNYWtlCisgICAgICAgIGlkZWNvZGUubyBvbmx5IGRlcGVuZGFudCBvbiB0aGUgaW5saW5lZCBsaWJyYXJ5IHNvdXJjZSBjb2RlLgorCisJKiBNYWtlZmlsZS5pbiAoTElCX09CSik6IFB1dCBvcHRpb25zIGxhc3Qgb24gdGhlIGxpc3Qgc28gdGhhdCBpdAorICAgICAgICBpcyBjb21waWxlZCBsYXN0LgorCisJKiBzdGQtY29uZmlnLmggKERFVklDRV9JTkxJTkUpOiBPbmx5IGlubGluZSBsb2NhbHMgd2hlbiB0aGUKKyAgICAgICAgZGVmYXVsdCBpcyB0byBpbmxpbmUuCisKK01vbiBTZXAgMjMgMDA6Mzc6NDkgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogaHdfaHRhYi5jIChodGFiX3N1bV9iaW5hcnkpOiBEZXRlcm1pbmUgdGhlIHJlYWwtYmFzZSBmb3IgdGhlCisgICAgICAgIGJpbmFyeS4KKworCSogaHdfaHRhYi5jIChodGFiX21hcF9iaW5hcnkpOiBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZQorICAgICAgICBsb2FkLWJhc2UsIGVpdGhlciBtYXAgdGhlIHByb2dyYW0gaW4gYXMgYSBjb250aWd1b3VzIHNlY3Rpb24gb3IgYXMKKyAgICAgICAgc2VwYXJhdGUgc2VjdGlvbnMgY29udHJvbGVkIGJ5IHRoIGJpbmFyaWVzIGxtYSB2YWx1ZXMuCisJKGh0YWJfaW5pdF9kYXRhX2NhbGxiYWNrKTogRGl0dG8uCisKK1N1biBTZXAgMjIgMTU6NTY6MjIgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfb3B0aW9ucyk6IFJlbW92ZSBsb2FkLWJhc2Ugb3B0aW9uLgorCisJKiBlbXVsX2NoaXJwLmMgKG1hcF9vdmVyX2NoaXJwX25vdGUpOiBBZGQgbG9hZF9iYXNlIGZpZWxkIHRvIG5vdGUKKyAgICAgICAgc3RydWN0LiAgRG9uJ3QgcmVxdWlyZSB0aGUgbG9hZF9iYXNlIGZpZWxkIHRvIGJlIHByZXNlbnQgLSBqdXN0CisgICAgICAgIGlzc3VlIHdhcm5pbmcgLSBpdCBpcyBhIHJlY2VudCBhZGRpdGlvbi4KKwkoZW11bF9jaGlycF9jcmVhdGUpOiBTdXBwb3J0IGJvdGggdmlydHVhbCBhbmQgcGh5c2ljYWwgbW9kZXMuCisKKwkqIGVtdWxfY2hpcnAuYyAoZW11bF9jaGlycF9jcmVhdGUpOiBBZGQgYSBzdGFjayBpbml0aWFsaXphdGlvbgorICAgICAgICBwcm9wZXJ0eSBzbyB0aGF0IGFueSBhcmd1bWVudHMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgY2FuCisgICAgICAgIGJlIHBhc3NlZCBvbiB0byB1c2VyIHByb2dyYW1zLgorCisJKiBod19pbml0LmMgKGNyZWF0ZV9wcGNfY2hpcnBfYm9vdGFyZ3MpOiBBZGQgc3VwcG9ydCBmb3IgY2hpcnAKKyAgICAgICAgYXJndW1lbnQgcGFzc2luZyB0byB0aGUgcHNldWRvIGRldmljZSBzdGFjay4KKworU2F0IFNlcCAyMSAxOTozOTo1NiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBkZXZpY2UuYyAoZGV2aWNlX2Vycm9yKTogTWFrZSBpdCBtb3JlIHRvbGVyYW50IHRvIGluY29tcGxldGUKKyAgICAgICAgZGV2aWNlcy4KKworCSogaHdfaW5pdC5jIChod19kYXRhX2luaXRfZGF0YV9jYWxsYmFjayk6IEV4dGVuZCB0aGUgZGF0YSBkZXZpY2UKKyAgICAgICAgc28gdGhhdCBpdCBjYW4gcGVyZm9ybSBpbml0aWFsaXphdGlvbiBvcGVyYXRpb25zIGVpdGhlciBkbWEgb3IgYQorICAgICAgICBtb3JlIGNvbXBsZXggaW5zdGFuY2Ugb3Blbiwgc2Vlaywgd3JpdGUgb3BlcmF0aW9uLgorCSogaHdfaW5pdC5jOiBVcGRhdGUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXRhIGRldmljZSB0byByZWZsZWN0CisgICAgICAgIHRoaXMuCisKK1NhdCBTZXAgMjEgMDA6MTM6MDIgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGV2aWNlLmMgKGRldmljZV9ldmVudF9xdWV1ZV9zY2hlZHVsZSwKKyAgICAgICAgZGV2aWNlX2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUsIGRldmljZV9ldmVudF9xdWV1ZV90aW1lKTogSGF2ZSB0aGUKKyAgICAgICAgZGV2aWNlIG9iamVjdCBleHBvcnQgdGhlIGV2ZW50IG9wZXJhdGlvbnMuICBNYWtpbmcgdGhlc2UgYXZhaWxhYmxlCisgICAgICAgIGZyb20gdGhlIGRldmljZSBvYmplY3Qgc2hvdWxkIGhvcGVmdWxseSBzaW1wbGlmeSB3cml0aW5nIGRldmljZQorICAgICAgICBtb2RlbHMuCisKK0ZyaSBTZXAgMjAgMTQ6MDQ6NDAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogY29uZmlndXJlLmluIChzaW0taGFyZHdhcmUpOiBBZGQgZWVwcm9tIGRldmljZSB0byBkZWZhdWx0IGJ1aWxkLgorCisJKiBod19lZXByb20uYzogUmV3cml0ZSBzbyBpdCB3b3Jrcy4KKworCSogZGVidWcuaCwgZGVidWcuYzogQWRkIHRyYWNpbmcgc3VwcG9ydCBmb3IgdGhlIGVlcHJvbSBhbmQgY29tCisgICAgICAgIGRldmljZXMuCisKK1RodSBTZXAgMTkgMTQ6NDA6NDAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGVidWcuaDogQWRkIGRpc2tsYWJlbC1wYWNrYWdlIGFuZCBkaXNrLWRldmljZSB0cmFjZSBvcHRpb25zLgorCWRlYnVnLmggKFBUUkFDRSk6IEFkZCBtYWNybyB0byBzaW1wbGlmeSB0cmFjaW5nIGluIHBhY2thZ2VzLgorCitUaHUgU2VwIDE5IDE0OjQwOjQwIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGRldmljZS5jIChkZXZpY2VfY3JlYXRlX2luc3RhbmNlX2Zyb20pOiBUaWdodGVuIHVwIGxvb3AKKyAgICAgICAgc2VhcmNoaW5nIGZvciBkZXZpY2UgaW5zdGFuY2VzLgorCShkZXZpY2VfaW5zdGFuY2VfZGVsZXRlKTogRGl0dG8uCisJKGRldmljZV9pbnN0YW5jZV9kZWxldGUpOiBPbmx5IGxlYWYgaW5zdGFuY2VzIG5lZWQgdG8gYmUgcmVtb3ZlZAorICAgICAgICBmcm9tIGEgZGV2aWNlcyBsaXN0IG9mIGFjdGl2ZSBpbnN0YW5jZXMuCisKK1RodSBTZXAgMTkgMTQ6NDA6NDAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogaHdfZGlzay5jOiBBZGQgdGhlIGNkcm9tIGFzIGFuIGFsaWFzLgorCisJKiBwa19kaXNrbGFiZWwuYyAoZGlza2xhYmVsX2RlbGV0ZSk6IEltcGxlbWVudCwgcmVtZW1iZXJpbmcgdG8KKyAgICAgICAgZGVsZXRlIHRoZSByYXcgZGlzayBpbnN0YW5jZSB3aGlsZSB3ZSdyZSBhdCBpdC4KKworCSogcGtfZGlza2xhYmVsLmMgKHBrX2Rpc2tsYWJlbF9jcmVhdGVfaW5zdGFuY2UpOiBJbXBsZW1lbnQgYQorICAgICAgICBsaXR0bGUgYml0IG1vcmUgLSBzdGlsbCBhIGxvbmcgd2F5IHRvIGdvLgorCisJKiBwa19kaXNrbGFiZWwuYyAoZGlza2xhYmVsX3dyaXRlLCBkaXNrbGFiZWxfcmVhZCk6IFJlbWVtYmVyIHRoZQorICAgICAgICBuZXcgaGVhZCBwb3NpdGlvbiBhZnRlciBhIHJlYWQgb3Igd3JpdGUuCisKK1RodSBTZXAgMTkgMTM6MDU6NDAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX3JlYWQpOiBBbGxvdyByZWFkcyB0byBiZSBsb25nZXIgdGhlbgorICAgICAgICB0aGUgaW50ZXJuYWwgYnVmZmVyLgorCitUaHUgU2VwIDE5IDEzOjA1OjQwIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGVtdWxfY2hpcnAuYyAoY2hpcnBfcmVhZF90MmhfYXJncyk6IENhbGwgbWVtc2V0LTAgd2l0aCB0aGUgYXJncworICAgICAgICBpbiB0aGUgY29ycmVjdCBvcmRlci4KKworCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX2NhbGxfbWV0aG9kKTogQ29ycmVjdCBjb21wdXRhdGlvbiBmb3IKKyAgICAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHN0YWNrIGFyZ3VtZW50IHBhc3NlZCBpbiBmcm9tIHRoZSBjbGllbnQKKyAgICAgICAgcHJvZ3JhbS4KKworV2VkIFNlcCAxOCAxOTozMzo1NCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiB3b3Jkcy5oOiBBZGQgbmV3IHR5cGVzIHNpZ25lZF9jZWxsIGFuZCB1bnNpZ25lZF9jZWxsIHdoaWNoCisgICAgICAgIGNvcnJlc3BvbmQgdG8gdGhlIHNpZ25lZCBhbmQgdW5zaWduZWQgSUVFRSAxMjc1IG1lbW9yeSBsb2NhdGlvbnMuCisJKiBkZXZpY2UuaCwgZGV2aWNlLmMsIGVtdWxfY2hpcnAuYzogV2hlcmUgcmVmZXJpbmcgdG8gYW4gSUVFRSAxMjc1CisgICAgICAgIG1lbW9yeSBjZWxsLCByZXBsYWNlIHVzZXMgb2YgdW5zaWduZWQzMiB3aXRoIHVuc2lnbmVkX2NlbGwuCisJKiBkZXZpY2VfdGFibGUuaDogRGl0dG8uCisKKwkqIHNpbS1lbmRpYW4uaDogQWRkIG5ldyBtYWNyb3MgSDJCRV9jZWxsIGFuZCBCRTJIX2NlbGwgd2hpY2gKKyAgICAgICAgY29udmVydCBjZWxsIHNpemVkIHZhbHVlcyB0byBmcm9tIGJpZyBlbmRpYW4uCisJKiBkZXZpY2UuYywgZW11bF9jaGlycC5jOiBXaGVyZSByZWZlcmluZyB0byBJRUVFIDEyNzUgbWVtb3J5IGNlbGxzCisgICAgICAgIHVzZSB0aGVzZSBuZXcgbWFjcm9zLgorCitUdWUgU2VwIDE3IDE1OjU3OjQ0IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGRldmljZS5jIChkZXZpY2VfdHJlZV9hZGRfcGFyc2VkKTogRGV0ZWN0IGFuZCByZXBvcnQgYW4KKyAgICAgICAgaW50ZXJydXB0IGJlaW5nIGF0dGFjaGVkIHRvIGFuIGludmFsaWQgZGV2aWNlLiBXYXMgZHVtcGluZyBjb3JlLgorCitNb24gU2VwIDE2IDIzOjA5OjEyIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MsCisgICAgICAgIGRldmljZV9zaXplX3RvX2F0dGFjaF9zaXplKTogTmV3IGZ1bmN0aW9ucy4gIENvbnZlcnQgYSBkZXZpY2VzCisgICAgICAgIHVuaXQgYWRkcmVzcyBvciB1bml0IHNpemUgc3RydWN0dXJlIGludG8gYSBmb3JtIHN1aXRhYmxlIGZvcgorICAgICAgICBwYXNzaW5nIG9uIHRvIHRoZSBhdHRhY2ggYW5kIGRldGFjaCBmdW5jdGlvbnMuCisJKiBkZXZpY2VfdGFibGUuaDogQWRkIGV4dHJhIG1ldGhvZHMgdG8gZGV2aWNlIHRhYmxlLgorCisJKiBkZXZpY2UuaCwgZGV2aWNlLmMgKGRldmljZV9maW5kX3JlZ19wcm9wZXJ0eSk6IE5ldyBmdW5jdGlvbi4KKyAgICAgICAgRm9yIGEgcmVnIHR5cGUgcHJvcGVydHksIHJldHVybiB0aGUgc2VsZWN0ZWQgYWRkcmVzcyArIHNpemUKKyAgICAgICAgdHVwcGxlLCBhbG9uZyB3aXRoIGEgcG9zaXRpdmUgc3VjY2VzcyBzdGF0dXMuICBBZGQgYSByZWdfcHJvcGVydHkKKyAgICAgICAgdG8gdGhlIGxpc3Qgb2YgcHJvcGVydHkgdHlwZXMuCisJKiAoZGV2aWNlX3RyZWVfYWRkX3BhcnNlZCk6IE1ha2UgYXJyYXkgcHJvcGVydGllcyB3aXRoIHRoZSBuYW1lCisgICAgICAgIHJlZyBvciBhbHRlcm5hdGUtcmVnIG9mIHR5cGUgcmVnX3Byb3BlcnR5LgorCisJKiBod19tZW1vcnkuYyAoaHdfbWVtb3J5X2luaXRfYWRkcmVzcyk6IFJld3JpdGUgdG8gdXNlIG5ldworICAgICAgICBmaW5kX3JlZ19wcm9wZXJ0eSBtZXRob2QuCisJKiBod19udnJhbS5jIChod19udnJhbV9pbml0X2FkZHJlc3MpOiBEaXR0by4KKworCSogZGV2aWNlLmMgKGRldmljZV90cmVlX3ByaW50X2RldmljZSk6IEFkZCBjb2RlIHRvIHByaW50IG91dCBhIHJlZworICAgICAgICBwcm9wZXJ0eS4KKworCSogZGV2aWNlX3RhYmxlLmMgKGdlbmVyaWNfZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MsCisgICAgICAgIGdlbmVyaWNfZGV2aWNlX3NpemVfdG9fYXR0YWNoX3NpemUgKTogTmV3IGZ1bmN0aW9ucy4gIEdlbmVyaWMKKyAgICAgICAgZnVuY3Rpb25zIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdW5pdCBhbmQgYXR0YWNoIGFkZHJlc3Mgb3Igc2l6ZS4KKworCSogZGV2aWNlX3RhYmxlLmMgKGdlbmVyaWNfZGV2aWNlX2luaXRfYWRkcmVzcyk6IFJld3JpdGUgdG8gdXNlIHRoZQorICAgICAgICBuZXcgZmluZF9yZWcgYW5kIGFkZHJlc3MgY29udmVydCBmdW5jdGlvbnMuICBMb29rIGZvciBib3RoIHJlZyBhbmQKKyAgICAgICAgYWx0ZXJuYXRlLXJlZyBwcm9wZXJ0aWVzLgorCitNb24gU2VwIDE2IDIzOjA5OjEyIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGh3X2NvbS5jOiBOZXcgZmlsZS4gIEEgJzU1MCBzZXJpYWwgZGV2aWNlIHRoYXQgY2FuIHF1aWNrbHkgYmUKKyAgICAgICAgYXR0YWNoZWQgdG8gYW55IGJ1cy4KKwkqIGNvbmZpZ3VyZS5pbiAoZW5hYmxlLXNpbS1oYXJkd2FyZSk6IEFkZCB0aGUgY29tIGRldmljZS4KKwkqIGNvbmZpZ3VyZTogcmUtZ2VuZXJhdGUuCisKK1RodSBTZXAgMTIgMTc6MzA6NTYgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGV2aWNlLmMgKGRldmljZV90cmVlX3ZlcmlmeV9yZWdfdW5pdF9hZGRyZXNzKTogTmV3CisgICAgICAgIGZ1bmN0aW9uLiBDaGVjayB0aGF0IHRoZSB1bml0IGFkZHJlc3MgYXMgc3BlY2lmaWVkIGJ5IHRoZSByZWcKKyAgICAgICAgcHJvcGVydHkgY29ycmVjdGx5IGNvcnJlc3BvbmRzIHRvIGFueSB1bml0IGFkZHJlc3MgcHJldmlvdXNseQorICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIGRldmljZXMgbmFtZS4KKwkoZGV2aWNlX3RyZWVfYWRkX3BhcnNlZCk6IFdoZW4gYWRkaW5nIGEgcmVnIHByb3BlcnR5LCB2ZXJpZnkKKwl0aGF0IHRoZSB1bml0LWFkZHJlc3MgLSBmaXJzdCB2YWx1ZSBvZiBwcm9wZXJ0eSAtIGNvcnJlY3RseQorCW1hdGNoZXMgYW55IHByZXZpb3VzIHZhbHVlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSBkZXZpY2UKKwlub2RlLgorCitUaHUgU2VwIDEyIDE3OjMwOjU2IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIG1vbi5jIChtb25fZXZlbnQpOiBSZW1vdmUgYXNzZXJ0aW9uIHRoYXQgYW4gdW5zaWduZWQgaXMgPj0gMC4KKworRnJpIEF1ZyAxNiAxMjowNToyNCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGRldmljZS5jIChkZXZpY2VfZnVsbF9uYW1lKTogQ2FzdCBzdHJkdXAgdG8gY2hhciAqLCBzaW5jZSBBSVgKKwkzLjIuNSBtaXN0YWtlbmx5IGRlY2xhcmVzIHRoZSBmdW5jdGlvbiB0byBiZSBjb25zdCBjaGFyICouCisJKGRldmljZV9jcmVhdGVfZnJvbSk6IERpdHRvLgorCShkZXZpY2VfY3JlYXRlX2luc3RhbmNlX2Zyb20pOiBEaXR0by4KKwkoZGV2aWNlX2FkZF9wcm9wZXJ0eSk6IERpdHRvLgorCitUdWUgQXVnIDEzIDExOjQwOjE0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZGVidWcuYyAodHJhY2Vfb3B0aW9uKTogRm9yIC10IGFsbCwgZG8gbm90IHNldCB0aGUKKwl0cmFjZV9kdW1wX2RldmljZV90cmVlIGZsYWcsIHNvIHRoYXQgdGhlIHNpbXVsYXRvciBpcyBydW4uCisKK1R1ZSBBdWcgMTMgMTE6NDA6MTQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAob3B0aW9ucy5vKTogRGVwZW5kIG9uIGRlZmluZXMuaC4KKwkoZGVmaW5lcy5oKTogTmV3IHJ1bGUsIGdvIHRocm91Z2ggY29uZmlnLmggYW5kIG1ha2Ugc3RyaW5ncyBvZiBhbGwKKwlvZiB0aGUgI2RlZmluZSBIQVZFX3h4eCBtYWNyb3MuCisJKGRpc3RjbGVhbik6IFJlbW92ZSBkZWZpbmVzLmguCisKKwkqIG9wdGlvbnMuYyAocHJpbnRfb3B0aW9ucyk6IFByaW50IHdoZXRoZXIgbWFueSBvZiB0aGUKKwljb25maWd1cmF0aW9uIG1hY3JvcyBhcmUgZGVmaW5lZC4KKworCSogbWFpbi5jIChtYWluKTogSWYgLXQgb3B0aW9ucyBhbmQgbm8gZmlsZW5hbWUsIGp1c3QgcHJpbnQgdGhlCisJb3B0aW9ucywgYW5kIGRvbid0IHByaW50IHRoZSB1c2FnZSBtZXNzYWdlLgorCitNb24gQXVnIDEyIDE4OjQyOjM3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBUZXN0IHdoZXRoZXIgL2Rldi96ZXJvIHdvcmtzIG9uIHRoZSBzeXN0ZW0sIGFuZCBpZgorCWl0IGRvZXMsIGRlZmluZSBIQVZFX0RFVlpFUk8uCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKwkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX2hhcmR3YXJlKTogRG8gbm90IGFkZCAvaW9idXMvZGlzaworCWlmIHdlIGRvbid0IGhhdmUgYSB3b3JraW5nIC9kZXYvemVybyBvbiB0aGUgc3lzdGVtLgorCisJKiBlbXVsX2J1Z2FwaS5jIChlbXVsX2J1Z2FwaV9pbml0KTogSWYgSEFWRV9ERVZaRVJPIGlzIG5vdAorCWRlZmluZWQsIGRvbid0IGFkZCBkaXNrIHN1cHBvcnQuCisJKGVtdWxfYnVnYXBpX2RvX2Rpc2tpbyk6IERpdHRvLgorCShlbXVsX2J1Z2FwaV9pbnN0cnVjdGlvbl9jYWxsKTogRGl0dG8uCisKK1dlZCBBdWcgIDcgMTQ6MzQ6MjAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBlbXVsX3VuaXguYyAoSEFWRV9UQ0dFVEFUVFIpOiBJZiBIQVZFX1RFUk1JT1NfU1RSVUNUVVJFIGlzIG5vdAorCWRlZmluZWQsIG1ha2Ugc3VyZSBIQVZFX1RDR0VUQVRUUiBpcyAjdW5kZWYnZWQKKworV2VkIEF1ZyAgNyAxNDozNDoyMCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHN0ZC1jb25maWcuaCAoUkVHUEFSTSk6IE9ubHkgZGVmaW5lIFJFR1BBUk0gYXR0cmlidXRlcyBpZiB1c2luZworCUdOVSBDLiAgVGVzdCBmb3IgX19pNjg2X18gaW4gY2FzZSBHQ0MgZXZlciBkZWZpbmVzIGl0LiAgSWYgbm90IG9uCisJYSB4ODYgcGxhdGZvcm0sIGRlZmluZSBSRUdQQVJNIGFzIG5vdGhpbmcuCisKKwkqIHNpbS1lbmRpYW4uaCAoV0lUSF9IT1NUX0JZVEVfT1JERVIpOiBUZXN0IGZvciBpNjg2IGFuZCBfX2k2ODZfXworCWFsc28uCisKK1dlZCBBdWcgIDcgMjA6MTk6NTUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogbGQtZGVjb2RlLmgsIGxkLWRlY29kZS5jOiBSZW5hbWUgZ290b19nZW4gdG8gdGhlIG1vcmUgY29ycmVjdAorIAlnb3RvX3N3aXRjaF9nZW4uCisJKiBnZW4taWRlY29kZS5jOiBEaXR0by4KKworCSogZ2VuLWlkZWNvZGUuYyAocHJpbnRfaWRlY29kZV90YWJsZSk6IENvbW1lbnQgb3V0IGNoZWNrIGZvcgorIAlzd2l0Y2gvdGFibGUgY29tYmluYXRpb24gdW50aWwgYSBidWcgd2l0aCBpdCBpcyBmaXhlZC4KKworCSogcHBjLW9wY29kZS1nb3RvOiBOZXcgZmlsZS4gIExpa2UgY29tcGxleCBhbmQgZmxhdCBidXQgdXNlcworIAlnb3RvLXN3aXRjaCBpbnN0ZWFkIG9mIHBhZGRlZC1zd2l0Y2ggZm9yIHRoZSB0YWJsZXMuCisKKwkqIGdlbi1pZGVjb2RlLmMgKHByaW50X2dvdG9fc3dpdGNoX25hbWUpOiBOZXcgZnVuY3Rpb24uCisJKHByaW50X2dvdG9fc3dpdGNoX3RhYmxlX2xlYWYpOiBOZXcgZnVuY3Rpb24uCisJKHByaW50X2dvdG9fc3dpdGNoX2JyZWFrKTogTmV3IGZ1bmN0aW9uLgorCShwcmludF9nb3RvX3N3aXRjaF90YWJsZSk6IE5ldyBmdW5jdGlvbi4gUHJpbnRzIGEganVtcCB0YWJsZQorCXRoYXQgY2FuIGJlIGp1bXBlZCBpbnRvIGluc3RlYWQgb2YgYSBzd2l0Y2ggc3RhdGVtZW50LgorCisJKiBnZW4taWRlY29kZS5jICgqc3dpdGNoXyopOiBBcyBhbiBvcHRpb24gb3V0cHV0IGEgc3dpdGNoIHRoYXQgaXMKKyAJaW1wbGVtZW50ZWQgdXNpbmcgYSBqdW1wIHRhYmxlIGJ1dCBvbmx5IGlmIHRoZSBzd2l0Y2ggaXMgbm90CisgCWJvb2xlYW4uCisJCitUdWUgQXVnICA2IDA5OjI4OjIyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0te2hhcmR3YXJlLHBhY2thZ2VzfSk6IEZpeCB0eXBvcy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworCSogZGV2aWNlLmMgKGRldmljZV9pbnN0YW5jZV9jYWxsX21ldGhvZCk6IEZpeHVwIGZvcm1hdCBtZXNzYWdlIGluCisJZXJyb3IgY2FzZS4gIFJldHVybiAwIGluIGNhc2Ugb2YgZXJyb3IgdG8gc2h1dCB1cCBjb21waWxlcgorCXdhcm5pbmdzLgorCitXZWQgQXVnICA3IDAwOjE3OjM3IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGRldmljZV90YWJsZS5jIChnZW5lcmljX2RldmljZV91bml0X2RlY29kZSk6IFJlcXVpcmUgYSBjb21tYQorICAgICAgICBiZXR3ZWVuIGVsZW1lbnRzIG9mIGEgdW5pdCBhZGRyZXNzLgorCisJKiBkZXZpY2UuYyAoZGV2aWNlX3RyZWVfcHJpbnRfZGV2aWNlKTogRm9yIHJlZywgYWx0ZXJuYXRlLXJlZyBhbmQKKyAgICAgICAgcmFuZ2VzIHByb3BlcnRpZXMgdXNlIHNwZWNpYWwgcHJpbnQgZnVuY3Rpb25zLgorCShkZXZpY2VfcHJpbnRfcmFuZ2VzX3Byb3BlcnR5KTogUHJpbnQgZm9ybWF0dGVkIHJhbmdlcyBwcm9wZXJ0eS4KKwkoZGV2aWNlX3ByaW50X3JlZ19wcm9wZXJ0eSk6IFByaW50IGZvcm1hdHRlZCByZWcgcHJvcGVydHkuCisKK1R1ZSBBdWcgIDYgMjE6MzU6MTggMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGV2aWNlLmMgKGRldmljZV90cmVlX2FkZF9wYXJzZWQpOiBGb3IgcmVnLCByYW5nZXMgYW5kCisgICAgICAgIGFsdGVybmF0ZS1yZWcgcHJvcGVydGllcyB1c2UgYSBzcGVjaWFsIHBhcnNlci4KKwkoZGV2aWNlX3RyZWVfcGFyc2VfcmVnX3Byb3BlcnR5KTogTmV3IGZ1bmN0aW9uIHRvIHBhcnNlIGEgcmVnCisJcHJvcGVydHkuCisJKGRldmljZV90cmVlX3BhcnNlX3Jhbmdlc19wcm9wZXJ0eSk6IE5ldyBmdW5jdGlvbiB0byBwYXJzZSBhCisJcmFuZ2VzIHByb3BlcnR5LgorCShkZXZpY2VfZW5jb2RlX3VuaXQpOiBXcmFwcGVyIGZvciBlbmNvZGVfdW5pdCBjYWxsYmFjay4KKwkoZGV2aWNlX2RlY29jZV91bml0KTogV3JhcHBlciBmb3IgZGVjb2RlX3VuaXQgY2FsbGJhY2suCisKK1dlZCBKdWwgMzEgMDA6MDI6MzAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGV2aWNlX3RhYmxlLmggKGRldmljZV9pbnN0YW5jZV9jYWxsYmFja3MpOiBSZWxhY2UgdGhlIGNsYWltIGFuZAorICAgICAgICByZWxlYXNlIG1ldGhvZHMgd2l0aCBhIG1vcmUgZ2VuZXJhbCB0YWJsZSBtYXBwaW5nIGZyb20gbWV0aG9kLW5hbWUKKyAgICAgICAgdG8gbWV0aG9kLWZ1bmN0aW9uLgorCisJKiBkZXZpY2UuYyAoZGV2aWNlX2luc3RhbmNlX2NhbGxfbWV0aG9kKTogTmV3IGZ1bmN0aW9uLiAgSW1wbGVtZW50CisgICAgICAgIHRoZSBPcGVuQm9vdCBjYWxsLW1ldGhvZCBjbGllbnQgaW50ZXJmYWNlLiAgQXR0ZW1wdHMgdG8gbG9jYXRlIHRoZQorICAgICAgICBpbnN0YW5jZXMgbWV0aG9kIGluIHRoZSBjYWxsYmFjayB0YWJsZS4KKwkoZGV2aWNlX2luc3RhbmNlX2NsYWltLCBkZXZpY2VfaW5zdGFuY2VfcmVsZWFzZSk6IERlbGV0ZS4KKyAgICAgICAgUmVwbGFjZWQgd2l0aCBjYWxsLW1ldGhvZCBhbmQgYSBsb29rdXAgdGFibGUuCisKKwkqIGVtdWxfY2hpcnAuYyAoY2hpcnBfZW11bF9jYWxsX21ldGhvZCk6IFVzZSB0aGUgbmV3IGRldmljZQorICAgICAgICBpbnN0YW5jZSBjYWxsIG1ldGhvZCBhbmQgbGV0IHRoYXQgaGFuZGxlIGEgY2xpZW50IGNsYWltIGNhbGwuCisKKwkqIGh3X2h0YWIuYyAoY2xhaW1fbWVtb3J5KTogV3JhcHBlciBmdW5jdGlvbiB0byBjYWxsIHRoZSBtZW1vcnkKKyAgICAgICAgZGV2aWNlcyAiY2xhaW0iIG1ldGhvZCB1c2luZyB0aGUgbmV3IGRldmljZS1pbnN0YW5jZSBjYWxsLW1ldGhvZAorICAgICAgICBpbnRlcmZhY2UuICBSZXBsYWNlcyB0aGUgcHJldmlvdXMgZGlyZWN0IGNhbGxzIHRvIGNsYWltLgorCShodGFiX21hcF9yZWdpb24pOiBVc2UgY2xhaW1fbWVtb3J5LgorCShodGFiX2luaXRfZGF0YV9jYWxsYmFjayk6IERpdHRvLgorCisJKiBod19tZW1vcnkuYyAoaHdfbWVtb3J5X2luc3RhbmNlX2NsYWltKTogVXBkYXRlIGZ1bmN0aW9uCisgICAgICAgIGludGVyZmFjZSBzbyB0aGF0IGl0IGlzIGNvbXBhdGlibGUgd2l0aCBjYWxsLW1ldGhvZC4KKwkoaHdfbWVtb3J5X2luc3RhbmNlX3JlbGVhc2UpOiBEaXR0by4KKwkoaHdfbWVtb3J5X2luc3RhbmNlX21ldGhvZHMpOiBOZXcgdGFibGUgb2YgbWVtb3J5IHNwZWNpZmljCisgICAgICAgIG1ldGhvZHMgY2xhaW0gYW5kIHJlbGVhc2UuICBBZGQgdG8gdGhlIGh3X21lbW9yeV9jYWxsYmFjaworCXRhYmxlLgorCitUdWUgSnVsIDMwIDIxOjI2OjE0IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIHBzaW0uYyAocHNpbV9pbml0KTogQmFjayBvdXQgb2YgY2hhbmdlIHRvIGluaXRpYWwgdmFsdWUgb2YKKyAgICAgICAgc3lzdGVtLT5sYXN0X2NwdS4KKworVHVlIEp1bCAzMCAyMToxMjoyNCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBzaW1fY2FsbGJhY2tzLmggKHNpbV9pb19wcmludGZfZmlsdGVyZWQpOiBSZXBsYWNlCisJcHJpbnRmX2ZpbHRlcmVkIHdpdGggYSBsb2NhbCBzaW11bGF0b3Igc3BlY2lmaWMgdmVyc2lvbi4gIEFkZAorCSNkZWZpbmUgcHJpbnRmX2ZpbHRlcmVkIHRvIHNpbXBsaWZ5IHVwZGF0aW5nIG9mIGV4aXN0aW5nIGNvZGUuCisKKwkqIHNpbV9jYWxsYmFja3MuaCAoc2ltX2lvX3dyaXRlX3N0ZG91dCwgc2ltX2lvX3JlYWRfc3RkaW4sCisgICAgICAgIHNpbV9pb193cml0ZV9zdGRlcnIpOiBOZXcgZnVuY3Rpb25zLiAgUmVhZCAvIHdyaXRlIHRvIHRoZQorICAgICAgICBzaW11bGF0aW9ucyBzdGRpbiBhbmQgc3Rkb3V0IGFuZCBzdGRlcnIgaW50ZXJmYWNlcy4gIE1lcmdlIGluIGNvZGUKKyAgICAgICAgZnJvbSBod19wYWwgdGhhdCBwcmV2aW91c2x5IGhhbmRsZWQgYXN5bmMgSS9PLgorCShzaW1faW9fZmx1c2hfc3Rkb3V0cHV0KTogUmVuYW1lIGZsdXNoX3N0ZG91dHB1dC4gIEFkZCAjZGVmaW5lCisJZmx1c2hfc3Rkb3V0cHV0IHRvIHNpbXBsaWZ5IHVwZGF0aW5nIG9mIGV4aXN0aW5nIGNvZGUuCisKKwkqIGh3X3BhbC5jIChzY2FuX2h3X3BhbCwgd3JpdGVfaHdfcGFsLAorICAgICAgICBod19wYWxfaW5zdGFuY2Vfd3JpdGVfY2FsbGJhY2spOiBVc2UgdGhlIG5ldyBzaW1faW8gZnVuY3Rpb25zLgorCisJKiBtYWluLmM6IEltcGxlbWVudCBzdGFuZGFsb25lIHZlcnNpb25zIG9mIHRoZSBuZXcgc2ltX2lvCisgICAgICAgIGZ1bmN0aW9ucy4gIEluY2x1ZGUgc3VwcG9ydCBmb3IgYXN5bmMgSS9PLgorCSogc2ltX2NhbGxzLmM6IERpdHRvLiAgVGhpcyB0aW1lIHVzaW5nIHRoZSBnZGIgY2FsbGJhY2sgdGFibGUuCisKKwkqIHN0ZC1jb25maWcuaCAoQ1VSUkVOVF9TVERJTywgY3VycmVudF9zdGRpbyk6IE5ldyBtYWNyby4gU2V0IHVwCisgICAgICAgIHN0ZGlvIGNvbmZpZ3VyYXRpb24gc28gdGhhdCBpdCB3b3JrcyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIHJlc3QKKyAgICAgICAgb2YgdGhlIHNpbXVsYXRpb24uCisJKiBwc2ltLmMgKHBzaW1fY3JlYXRlKTogSW5pdGlhbGl6ZSBjdXJyZW50X3N0ZGlvIGZyb20gdGhlIGRldmljZQorICAgICAgICB0cmVlLgorCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfb3B0aW9ucyk6IEVudGVyIGEgZGVmYXVsdCB2YWx1ZQorICAgICAgICBmb3IgdXNlLXN0ZGlvIGluIHRoZSBkZXZpY2UgdHJlZS4KKworRnJpIEp1bCAyNiAxOTo0MzowMyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBnZW4taWRlY29kZS5jIChwcmludF9qdW1wKTogV2FzIGFsd2F5cyBnZW5lcmF0aW5nIGEganVtcCBiYWNrIHRvCisgCWlkZWNvZGUuICBPbmx5IG5lY2Vzc2FyeSBhdCB0YWlsIG9mIHNlbWFudGljIGNvZGUuCisJKHByaW50X2p1bXApOiBXYXMgYWx3YXlzIHNldHRpbmcgdGhlIHByb2Nlc3NvcidzIGNpYSwgZXZlbiBkdXJpbmcKKyAJc3RhcnR1cCB3aGVuIHRoZSBwcm9jZXNzb3Igd2FzIHN0aWxsIHVuZGVmaW5lZC4KKwkocHJpbnRfanVtcCk6IEZvciBzYWZldHksIHJlc3RhcnQgc21wIGxvb3Agd2hlbiBjcHVfbnIgPj0gbnJfY3B1cywKKyAJbm90IGp1c3QgZXF1YWwuCisJCisJKiBvcHRpb25zLmMgKHByaW50X29wdGlvbnMpOiBBZGQgcHJpbnRpbmcgb2YgV0lUSF9SRUdQQVJNIGFuZAorIAlXSVRIX1NURENBTEwuCisKKwkqIHN0ZC1jb25maWcuaCAoV0lUSF9SRUdQQVJNLCBXSVRIX1NURENBTEwpOiBQcm92aWRlIGRlZmF1bHQKKyAJKGRpc2FibGVkKSB2YWx1ZXMgaWYgbm90IGRlZmluZWQuCisKK0ZyaSBKdWwgMjYgMDA6MzY6MzUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogcHBjLWNhY2hlLXJ1bGVzIChjYWNoZSk6IENoYW5nZSBSUyBhbmQgUkIgdG8gY2FjaGUgaW5zdGVhZCBvZgorICAgICAgICBjb21wdXRlLiAgVGhlIGJsb2NrIG1vdmUgaW5zdHJ1Y3Rpb25zIHVzZSB0aGVtLgorCisJKiBpZGVjb2RlX2V4cHJlc3Npb24uaCAoRlBTQ1JfU0VUKTogTmV3IG1hY3JvLCBzZXQgc3BlY2lmaWMgRlBTQ1IKKyAgICAgICAgcmVnaXN0ZXIuCisJKENSX0ZJRUxEKTogTmV3IG1hY3JvLCBleHRyYWN0IHNwZWNpZmljIENSIHJlZ2lzdGVyLgorCShGUFNDUl9GSUVMRCk6IE5ldyBtYWNybywgZXh0cmFjdCBzcGVjaWZpYyBGUFNDUiByZWdpc3Rlci4KKworCSogcmVnaXN0ZXJzLmggKEdQUik6IE5ldyBtYWNybywgc2ltcGxpZnkgYWNjZXNzZXMgdG8gR1BSW2ldLgorCisJKiBiaXRzLmMgKElOU0VSVEVEKTogQ292ZXJ0IElOU0VSVEVEIG1hY3JvIGludG8gYSBmdW5jdGlvbi4KKwkoRVhUUkFDVEVEKTogQ29uZGl0aW9uYWxseSBjb21waWxlIG9uIGNvcnJlY3QgYml0IHNpemUgbWFjcm8uCisKKwkqIGJpdHMuaCAoQklUOCk6IE5ldyBtYWNybywgc2V0IGEgc2luZ2xlIGJpdCBpbiBhbiA4IGJpdCBieXRlLgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zOiBXaXRoIGhpbnRzIGZyb20gUGF1bCBNYXJ0aW4sIHR5cGUgaW4gbWlzc2luZworCXNvbWUgaW5zdHJ1Y3Rpb24gc2VtYW50aWNzLiAgTGVhdmUgZGlzYWJsZWQgZm9yIHRoZSBtb21lbnQuCisJKExvYWQgTXVsdGlwbGUgV29yZCk6IERpdHRvLgorCShTdG9yZSBNdWx0aXBsZSBXb3JkKTogRGl0dG8uCisJKExvYWQgU3RyaW5nIFdvcmQgSW1tZWRpYXRlKTogRGl0dG8uCisJKExvYWQgU3RyaW5nIFdvcmQgSW5kZXhlZCk6IERpdHRvLgorCShTdG9yZSBTdHJpbmcgV29yZCBJbW1lZGF0ZSk6IERpdHRvLgorCShTdG9yZSBTdHJpbmcgV29yZCBJbmRleGVkKTogRGl0dG8uCisJKE1vdmUgdG8gQ29uZGl0aW9uIFJlZ2lzdGVyIGZyb20gWEVSKTogRGl0dG8uCisJKE1vdmUgRnJvbSBDb25kaXRpb24gUmVnaXN0ZXIpOiBEaXR0by4KKwkoTW92ZSBGcm9tIEZQU0NSKTogRGl0dG8uCisJKE1vdmUgdG8gQ29uZGl0aW9uIFJlZ2lzdGVyIGZyb20gRlBTQ1IpOiBEaXR0by4KKwkoTW92ZSBUbyBGUFNDUiBGaWVsZCBJbW1lZGlhdGUpOiBEaXR0by4KKwkoTW92ZSBUbyBGUFNDUiBGaWVsZHMpOiBEaXR0by4KKwkoTW92ZSBUbyBGUFNDUiBCaXQgMCk6IERpdHRvLgorCShNb3ZlIFRvIEZQU0NSIEJpdCAxKTogRGl0dG8uCisKK1RodSBKdWwgMjUgMjI6MTA6NDAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogc3RkLWNvbmZpZy5oIChTRU1BTlRJQ1NfSU5MSU5FKTogQnkgZGVmYXVsdCwgbWFzayBvdXQgdGhlCisgICAgICAgIGlubGluaW5nIG9mIHNlbWFudGljIGZ1bmN0aW9ucyBmcm9tIERFRkFVTFRfSU5MSU5FLiAgQWxtb3N0IGFsbAorICAgICAgICBjb25maWd1cmF0aW9ucyBjYWxsIHRoZSBzZW1hbnRpYyBjb2RlIHZpYSBhIHBvaW50ZXIgc28gdGhlcmUgaXMKKyAgICAgICAgbGl0dGxlIGJlbmVmaXQuCisKKwkqIHN0ZC1jb25maWcuaCAoSUNBQ0hFX0lOTElORSk6IERpdHRvLgorCitUaHUgSnVsIDI1IDIwOjA3OjMwIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGNvbmZpZ3VyZS5pbiAoc2ltX3JlZ3Bhcm0pOiBBZGQgY29uZmlndXJhdGlvbiBvcHRpb24gZm9yCisgICAgICAgIGVuYWJsaW5nIEdDQydzIHJlZ3Bhcm0gYXR0cmlidXRlLgorCSogKHNpbV9zdGRjYWxsKTogQWRkIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGZvciBlbmFibGluZyBHQ0MncworICAgICAgICBzdGRjYWxsIGF0dHJpYnV0ZS4KKworCSogTWFrZWZpbGUuaW4gKFJFR1BBUk1fQ0ZMQUdTKTogUGFzcyByZWdwYXJhbSBjb25maWd1cmF0aW9uIG9udG8KKyAgICAgICAgY29tcGlsYXRpb25zLgorCSogKFNURENBTExfQ0ZMQUdTKTogUGFzcyBzdGRjYWxsIGNvbmZpZ3VyYXRpb24gb250byBjb21waWxhdGlvbnMuCisKKwkqIHN0ZC1jb25maWcuaCAoUkVHUEFSTSk6IEV4dGVuZCBjb25zdHJ1Y3Rpb24gb2YgUkVHUEFSTSBtYWNybyBzbworICAgICAgICB0aGF0IGl0IGNhbiBpbmNsdWRlIF9fc3RkY2FsbF9fIGZ1bmN0aW9uIGF0dHJpYnV0ZS4KKworV2VkIEp1bCAyNCAxOTowNDoyMCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QHNhd25vZmY+CisKKwkqIG9wdGlvbnMuYyAocHJpbnRfb3B0aW9ucyk6IEluY2x1ZGUgU1VQUE9SVF9JTkxJTkUgaW4gaW5mb3JtYXRpb24KKyAJZHVtcC4KKworCSogZ2VuLWlkZWNvZGUuYyAocHJpbnRfcnVuX3VudGlsX3N0b3BfYm9keSk6IE9ubHkgZ2VuZXJhdGUgbG9vcAorIAl0ZXJtaW5hdGlvbiB0ZXN0IGlmIGNyZWF0aW5nIGlkZWNvZGVfcnVuX3VudGlsX3N0b3AuICBQdXNoIHRoZQorIAlsb29wIHRlcm1pbmF0aW9uIHRlc3QgYmFjayBpbnRvIGVhY2ggYWx0ZXJuYXRpdmUgYnJhbmNoLgorCitXZWQgSnVsIDI0IDE1OjQ3OjA5IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGdlbi1pY2FjaGUuYyAocHJpbnRfaWNhY2hlX2Z1bmN0aW9uKTogSGF2ZSB0aGUgY2FjaGUgZnVuY3Rpb24KKyAJYWx3YXlzIHVwZGF0ZSB0aGUgY2FjaGVfZW50cmllcyBzZW1hbnRpYyBhbmQgYWRkcmVzcyBmaWVsZHMuCisKKwkqIGdlbi1pZGVjb2RlLmMgKHByaW50X2lkZWNvZGVfc3dpdGNoX2lsbGVnYWwpOiBJbmNsdWRlIGEgYnJlYWsKKyAJd2hlbiBnZW5lcmF0aW5nIGlsbGVnYWwgaW5zdHJ1Y3Rpb25zLiAgVGhpcyB3YXMgY29tbWVudGVkIG91dAorIAl3aGljaCBpcyBhIGhhbmdvdmVyIGZyb20gbG9va2luZyBhIGF0IHN3aXRjaCBzdGF0ZW1lbnRzIGdlbmVyYXRlZAorIAl1c2luZyBpbmRpcmVjdCBqdW1wcy4KKworVHVlIEp1bCAyMyAyMDo1NzowMSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBpZ2VuLmMgKHByaW50X215X2RlZmluZXMpOiBSZXBsYWNlcyBwcmludF9kZWZpbmVfbXlfaW5kZXguCisgICAgICAgIFByaW50IGJvdGggYSBkZWZpbml0aW9uIGZvciBNWV9JTkRFWCBhbmQgTVlfUFJFRklYLgorCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfZnVuY3Rpb24pOiBBZGp1c3QuCisJKiBnZW4taWRlY29kZS5jIChwcmludF9qdW1wX2luc24pOiBBZGp1c3QuCisJKiBnZW4tc2VtYW50aWNzLmMgKHByaW50X2Nfc2VtYW50aWMpOiBBZGp1c3QuCisKKwkqIGdlbi1zdXBwb3J0LmMgKGdlbl9zdXBwb3J0X2gpOiBBZGQgb3B0aW9uYWwgaW5jbHVkZSB0byBjcmVhdGVkCisgICAgICAgIHN1cHBvcnQuaCBzbyB0aGF0LCBsaWtlIGNwdSwgaXQgaXMgb3B0aW9uYWxseSBpbmxpbmVkIGZvciBhbGwKKyAgICAgICAgbW9kdWxlcyB0aGF0IGluY2x1ZGUgaXQuCisJKiBpbmxpbmUuaCwgaW5saW5lLmM6IEFkanVzdCBzbyB0aGF0IHN1cHBvcnQuW2hjXSBpcyBoYW5kbGVkIHRoZQorICAgICAgICBzYW1lIGFzIGNwdS5baGNdLgorCisJKiBpZGVjb2RlX2ZpZWxkcy5oIChMQUJFTCwgR09UTyk6IE1hY3JvJ3MgdGhhdCBjcmVhdGUgYSB1bmlxdWUKKyAgICAgICAgbmFtZSBmb3IgYSBsYWJsZSBhbmQgdGhlbiBicmFuY2ggdG8gaXQuCisKKwkqIHBwYy1pbnN0cnVjdGlvbnMgKGNvbnZlcnRfdG9faW50ZWdlciwgRmxvYXRpbmcgUm91bmQgdG8KKyAgICAgICAgU2luZ2xlLVByZWNpc2lvbiwgRmxvYXRpbmcgQ29udmVydCBmcm9tIEludGVnZXIgRG91Ymxld29yZCk6IFVzZQorICAgICAgICBMQUJFTCBhbmQgR09UTyBpbnN0ZWFkIG9mIHRoZSByZWNlbnRseSBhZGRlZCBzd2l0Y2ggc3RhdGVtZW50cy4KKworV2VkIEp1bCAyNCAxNDowMjo0MiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QHNhd25vZmYuaGlnaGxhbmQuY29tLmF1PgorCisJKiBnZW4taWRlY29kZS5jIChwcmludF9ydW5fdW50aWxfc3RvcF9ib2R5KTogVG9vIG1hbnkgcnBhcmVuIGluCisgCWdlbmVyYXRlZCBjb2RlLgorCitUdWUgSnVsIDIzIDIwOjU3OjAxIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtc2ltLWxpbmUtbnIpOiBUeXBvIC0gc2ltX2xpbmUtbnIuCisJKiAoLS1lbmFibGUtc2ltLWlubGluZSk6IFJlb3JkZXIgcGF0ZXJuIG1hdGNoaW5nIG9mIGFyZ3VtZW50cyBzbworICAgICAgICB0aGF0IFNVUFBPUlQ9QUxMX0lOTElORSBpcyByZWNvbml6ZWQgYXMgKj0qIGFuZCBub3QgKl9JTkxJTkUuCisKKwkqIGNvbmZpZ3VyZTogcmVidWlsZC4KKworTW9uIEp1bCAyMiAyMzoyNTowOCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0taGFyZHdhcmUsIC0tZW5hYmxlLXNpbS1wYWNrYWdlcyk6IE5ldworICAgICAgICBjb25maWd1cmF0aW9uIG9wdGlvbnMuICBMZXQgdGhlIHVzZXIgc3BlY2lmeSB0aGUgcGFja2FnZXMgb3IKKyAgICAgICAgaGFyZHdhcmUgZGV2aWNlcyB0aGF0IGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuICBNYWtlcyBpdAorICAgICAgICBwb3NzaWJsZSBmb3IgdXNlciBwYWNrYWdlcyB0byBiZSBzcGVjaWZpZWQuCisKKwkqIE1ha2VmaWxlLmluICh0bXAtcGssIHRtcC1odyk6IEp1c3QgdXNlIHRoZSBsaXN0IG9mIHBhY2thZ2VzIGFuZAorCWhhcmR3YXJlIGluc3RlYWQgb2YgY2hlY2tpbmcgaXQgdXNpbmcgbHMuICBjb25maWd1cmUuaW4gc2hvdWxkCisJaGF2ZSB0YWtlbiBjYXJlIG9mIGFueSBwcm9ibGVtcy4KKwkoSFdfU1JDLCBIV19PQkosIFBBQ0tBR0VfU1JDLCBQQUNLQUdFX09CSik6IFNldCBieSBjb25maWd1cmUuCisKK01vbiBKdWwgMjIgMjI6Mzg6NTkgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIHBzaW0uYyAocHNpbV9vcHRpb25zKTogRW50ZXIgdGhlIGFyZ3VtZW50IHRvIHRoZSBtZW1vcnkgc2l6ZQorICAgICAgICBvcHRpb24gZGlyZWN0bHkgaW50byB0aGUgZGV2aWNlIHRyZWUuICBXYXMgdXNpbmcgYXRvbCgpIHdoaWNoIGlzCisgICAgICAgIGRhbmdlcm91c2x5IG5vbiBwb3J0YWJsZS4KKworTW9uIEp1bCAyMiAyMjoxNzowOCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogY29uZmlndXJlLmluIChpY2FjaGUpOiBFeHRlbmQgaWNhY2hlIGZsYWcgdG8gaW5jbHVkZSBhbiBpbnNuCisgICAgICAgIG9wdGlvbi4gIElmIHNwZWNpZnllZCB0aGUgaW5zbiAtIGFrYSBpbnN0cnVjdGlvbiAtIGlzIGluY2x1ZGVkIGluCisgICAgICAgIHRoZSBpbnN0cnVjdGlvbiBjYWNoZS4gIE1ha2UgdGhpcyB0aGUgZGVmYXVsdC4KKwkqIGNvbmZpZ3VyZTogcmUtZ2VuZXJhdGUuCisKKwkqIGlnZW4uYyAobWFpbiksIGlnZW4uaDogQWRkIG9wdGlvbiAtUyAtIGluU24gLSBmb3Igc3BlY2lmeWluZworICAgICAgICB0aGF0IHRoZSBpbnN0cnVjdGlvbiBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGljYWNoZS4KKworCSogZ2VuLWljYWNoZS5jIChwcmludF9pY2FjaGVfYm9keSk6IElmIGVuYWJsZWQsIG91dHB1dCBjb2RlIHRvIHB1dAorICAgICAgICB0aGUgaW5zdHJ1Y3Rpb24gaW50byB0aGUgaWNhY2hlLgorCShwcmludF9pY2FjaGVfc3RydWN0KTogSWYgZW5hYmxlZCwgYWRkIGluc24gdG8gdGhlIGljYWNoZSBzdHJ1Y3QuCisKK01vbiBKdWwgMjIgMjA6NDY6MTIgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIE1ha2VmaWxlLmluIChCVUlMRF9DRkxBR1MpOiBJbmNsdWRlIC1nIHdoZW4gYnVpbGRpbmcgdGhlCisgICAgICAgIGdlbmVyYXRvcnMuCisKK01vbiBKdWwgMjIgMjA6MDA6MjUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX29wdGlvbnMpOiBXYXMgaW5jb3JyZWN0bHkgc2V0dGluZworICAgICAgICB0aGUgc3RyaWN0LWFsaWdubWVudCBvcHRpb24gd2hlbiBoYXJkd2lyZWQgZm9yIG5vbi1zdHJpY3QKKyAgICAgICAgYWxpZ25tZW50LgorCitTdW4gSnVsIDIxIDIxOjE4OjA1IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGdlbi1zZW1hbnRpY3MuYzogTWFrZSB0aGUgbXlfaW5kZXggdmFyaWFibGUgYSBtYWNybyBNWV9JTkRFWC4KKworCSogcHBjLWluc3RydWN0aW9uczogQWRqdXN0IHNvIHRoYXQgcmVmZXJlbmNlcyBhcmUgdG8gTVlfSU5ERVggYW5kCisgICAgICAgIG5vdCBteV9pbmRleC4KKworU3VuIEp1bCAyMSAyMToxODowNSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBnZW4taWRlY29kZS5jOiBPdXRwdXQgdGhlIGNvbXBsZXRlIHJ1bl91bnRpbF9zdG9wIGZ1bmN0aW9uCisgICAgICAgIGluc3RlYWQgb2YganVzdCB0aGUgY29kZSB0byBoYW5kbGUgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gaXNzdWUuCisJKiA6IEhhdmUgdGhlIGdlbmVyYXRlZCBpZGVjb2RlLmMgaW5jbHVkZSBpbmxpbmUuYyAoaW5zdGVhZCBvZiBwc2ltLmMpLgorCisJKiBzdGQtY29uZmlnLmg6IENoYW5nZSBwc2ltLmMgc28gdGhhdCBpdCBpc24ndCBpbmxpbmVkIChhcyB0aGlzIGlzCisgICAgICAgIG5vIGxvbmdlciBuZWVkZWQpLgorCisJKiBwc2ltLmMgKHJ1bl91bnRpbF9zdG9wKTogRGVsZXRlIHRoZSBvbGQgcnVuX3VudGlsX3N0b3AgZnVuY3Rpb24KKyAgICAgICAgaW5zdGVhZCBjYWxsaW5nIHRoZSBpZGVjb2RlX3J1biBhbmQgaWRlY29kZV9ydW5fdW50aWxfc3RvcAorICAgICAgICBmdW5jdGlvbnMgdGhhdCBnZW4taWRlY29kZS5jIGlzIG5vdyBjcmVhdGluZy4KKworU3VuIEp1bCAyMSAyMToxODowNSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBkZ2VuLmM6IE1haW50ZW5hbmNlIC0gdXBkYXRlIHRvIHVzZSBuZXcgZmVhdHVyZXMgZm91bmQgaW4gbGYuYy4KKworCSogZmlsdGVyX2ZpbGVuYW1lLmMgKGZpbHRlcl9maWxlbmFtZSk6IE1haW50ZW5hbmNlIC0gbWFrZSB0aGUKKyAgICAgICAgc3RyaW5nIGNvbnN0YW50LgorCitTdW4gSnVsIDIxIDIxOjE4OjA1IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGRlYnVnLmMgKFRSQUNFLCBJVFJBQ0UsIERUUkFDRSk6IEhhdmUgR0NDIGluc3RlYWQgb2YgQ1BQCisgICAgICAgIGVsaW1pbmF0ZSB0cmFjZSBzdGF0ZW1lbnRzLgorCisJKiBkZWJ1Zy5jOiBDaGFuZ2UgdHJhY2UgZm9ybWF0IHNvIHRoYXQgaXQgaXMgY29uc2lzdGVudAorICAgICAgICAoZmlsZTpsaW5lLW5yKSB3aXRoIENDJ3MgZXJyb3Igb3V0cHV0LgorCisJKiBnZW4taXRhYmxlLmMgKGl0YWJsZV9jX2luc24pOiBBZGQgdGhlIHNvdXJjZSBmaWxlIG5hbWUgYW5kCisgICAgICAgIHNvdXJjZSBsaW5lIG51bWJlciB0byB0aGUgaW5zdHJ1Y3Rpb24ncyBpbmZvcm1hdGlvbmFsIGVudHJ5LgorCisJKiBkZWJ1Zy5jIChJVFJBQ0UpOiBVc2UgdGhlIGl0YWJsZSAoYW5kIG15X2luZGV4KSB0byBnZXQgdGhlCisgICAgICAgIGN1cnJlbnQgaW5zdHJ1Y3Rpb25zIG5hbWUgYW5kIHNvdXJjZSBsaW5lIG51bWJlci4KKworCSogZ2VuLXNlbWFudGljcy5jLCBnZW4taWNhY2hlLmM6IEFkanVzdCBnZW5lcmF0ZWQgSVRSQUNFIGNhbGxzIHRvCisgICAgICAgIG1hdGNoIG5ldyBpbnRlcmZhY2UuCisKKwkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2luc3RydWN0aW9uX2NhbGwpOiBBZGp1c3QKKyAgICAgICAgY29ycmVzcG9uZGluZyBjYWxsIHRvIElUUkFDRSBzbyB0aGF0IGl0IHN0aWxsIG1hdGNoZXMuCisKKwkqIGlkZWNvZGVfZXhwcmVzc2lvbi5oIChBTFVfRU5ELCBDUjBfQ09NUEFSRSk6IFVzZSBUUkFDRSBpbnN0ZWFkCisgICAgICAgIG9mIElUUkFDRS4gIFRoZSBDUFAgbGluZSBkaXJlY3RpdmVzIHdvdWxkIGhhdmUgcHJldmlvdXNseSBzZXQgdGhlCisgICAgICAgIGxpbmUtbnIgYW5kIGZpbGUgbmFtZSBzbyBJVFJBQ0UgaXNuJ3QgbmVlZGVkLgorCitTdW4gSnVsIDIxIDIxOjE4OjA1IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGdlbi1pZGVjb2RlLmMgKHByaW50X2p1bXBfdW50aWxfc3RvcF9ib2R5KTogTmV3IGZ1bmN0aW9uIGFuZAorICAgICAgICBpZGVjb2RlIGdlbmVyYXRpb24gb3B0aW9uLiAgSW5zdGVhZCBvZiBnZW5lcmF0aW5nIGFuZCBjYWxsaW5nCisgICAgICAgIHNlcGFyYXRlIGZ1bmN0aW9ucyBjb250YWluaW5nIHRoZSBzZW1hbnRpYyBhbmQgaWNhY2hlIGNvZGUKKyAgICAgICAgZ2VuZXJhdGUgYSBzaW5nbGUgbW9ub2x5dGhpYyBmdW5jdGlvbiBhbmQgdXNlIGdvdG8ncyAoYW5kIEdDQydzCisgICAgICAgIGluZGlyZWN0IGp1bXApIHRvIG1vdmUgYmV0d2VlbiBjb2RlIGJsb2Nrcy4KKworCSogTWFrZWZpbGUuaW46IEFkZCBzaW1fanVtcCBmbGFnIHRvIHRob3NlIHBhc3NlZCB0byBpZ2VuLgorCisJKiBjb25maWd1cmUuaW46IE5ldyBvcHRpb24gLS1lbmFibGUtc2ltLWp1bXAgKGRlZmF1bHQgZGlzYWJsZWQpCisKKwkqIHBwYy1pbnN0cnVjdGlvbnM6IEVsaW1pbmF0ZSBhbnkgdXNlcyBvZiBsYWJlbHMgYW5kIGdvdG8ncy4KKyAgICAgICAgVGhlc2UgcmVzdWx0IGluIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMgd2hlbiBhIHNpbmdsZSBmbGF0IGZ1bmN0aW9uCisgICAgICAgIGlzIGJlaW5nIGNyZWF0ZS4KKworCSogcHBjLW9wY29kZS1qdW1wOiBOZXcgZmlsZS4gIFNldCBvZiBvcGNvZGUgcnVsZXMgdXNlZnVsIHdoZW4KKyAgICAgICAgdGVzdGluZyBqdW1waW5nIGlkZWNvZGVzLgorCitTdW4gSnVsIDIxIDIxOjE4OjA1IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGdlbi1pZGVjb2RlLmM6IE9wdGlvbmFsbHkgaW5jbHVkZSB0aGUgc2VtYW50aWMgY29kZSBmb3IgYW4KKyAgICAgICAgaW5zdHJ1Y3Rpb24gaW4gdGhlIGZ1bmN0aW9uIHRoYXQgaXMgZG9pbmcgdGhlIGRlY29kaW5nLgorCisJKiBpZ2VuLmM6IEFkZCBvcHRpb24gKC1DKSB0byBnZW5lcmF0ZSBzZW1hbnRpY3MgaW4gdGhlIGluc3RydWN0aW9uCisgICAgICAgIGRlY29kZSBmdW5jdGlvbnMuCisKKwkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtc2ltLWljYWNoZSk6IEFjY2VwdCBhbiBvcHRpb24gbGlzdCBzdWNoCisgICAgICAgIGFzIDEwMjQsZGVmaW5lLiAgQWRkIGEgbmV3IGNob2ljZSB0byB0aGUgbGlzdCAtIHNlbWFudGljIC0gd2hpY2gKKyAgICAgICAgd2lsbCBjYXVzZSBpZ2VuIHRvIGdlbmVyYXRlIGluc3RydWN0aW9uIGRlY29kZSBmdW5jdGlvbnMgdGhhdAorICAgICAgICBpbmNsdWRlIHRoZSBjb3JyZXNwb25kaW5nIHNlbWFudGljIGNvZGUuCisKK1N1biBKdWwgMjEgMjE6MTg6MDUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogY29uZmlndXJlLmluOiBOZXcgb3B0aW9uIC0tZW5hYmxlLXNpbS1saW5lLW5yIChkZWZhdWx0IGVuYWJsZWQpLgorICAgICAgICBFbmFibGUvZGlzYWJsZSB0aGUgaW5jbHVzaW9uIG9mIENQUCBsaW5lIGRpcmVjdGl2ZXMgaW4gdGhlCisgICAgICAgIGdlbmVyYXRlZCBmaWxlcy4gIFN1Y2ggZGlyZWN0aXZlcyByZWZlciBiYWNrIHRvIHRoZSBzb3VyY2UgZmlsZXMKKyAgICAgICAgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIHNpbXVsYXRvciBjb2RlLgorCisJKiBNYWtlZmlsZS5pbiAoc2ltX2xpbmVfbnIpOiBQYXNzIHRvIGlnZW4uCisKK1N1biBKdWwgMjEgMjE6MTg6MDUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogaWdlbi5jIChtYWluKTogUmV2YW1wIHRoZSBvcHRpb25zIHNvIHRoYXQgbW9yZSBsZXR0ZXJzIGFyZQorICAgICAgICBhdmFpbGFibGUuCisKKwkqIGNvbmZpZ3VyZS5pbjogQWRqdXN0IHRvIG1hdGNoIGlnZW4ncyByZXZhbXBlZCBvcHRpb25zCisKK1N1biBKdWwgMjEgMjE6MTg6MDUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogTWFrZWZpbGUuaW4gKHBrLmgsIGh3LmgpOiBSZXdyaXRlIGRlcGVuZW5jaWVzIGZvciBody5oIChldGMpIHNvCisgICAgICAgIHRoYXQgdGhleSB1c2UgdGhlIHNhbWUgdGVjaG5pcXVlIGFzIGlnZW4gKGllIGEgZHVtbXkgdGFyZ2V0cworICAgICAgICB0bXAtcGsgYW5kIHRtcC1odyBhcmUgY3JlYXRlZCkuCisKK01vbiBKdW4gMjQgMjI6Mjg6MDAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogTWFrZWZpbGUuaW4gKEJVSUxEX0NGTEFHUyk6IEluY2x1ZGUgV0FSTklOR19DRkxBR1MuCisKK1dlZCBKdW4gMTkgMjE6NDU6MjggMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogbGQtY2FjaGUuW2hjXSwgbGQtZGVjb2RlLltoY10sIGxkLWluc24uW2hjXTogTmV3IGZpbGVzLiBTZXBhcmF0ZQorICAgICAgICBvdXQgdGhlIGxvYWRpbmcgb2YgZWFjaCBvZiB0aGUgdGFibGVzIGZyb20gdGhlIHJlc3Qgb2YgaWdlbi4KKwkqIE1ha2VmaWxlLmluOiBBZGp1c3QuCisJKiBpZ2VuLmM6IEFkanVzdC4KKworCSogZ2VuLWljYWNoZS5baGNdLCBnZW4taWRlY29kZS5baGNdLCBnZW4taXRhYmxlLltoY10sCisgICAgICAgIGdlbi1tb2RlbC5baGNdLCBnZW4tc2VtYW50aWNzLltoY106IE5ldyBmaWxlcy4gU2VwYXJhdGUgb3V0IHRoZQorICAgICAgICBjb2RlIGNyZWF0aW5nIGVhY2ggc2VwYXJhdGUgc2V0IG9mIGdlbmVyYXRlZCBmaWxlcy4KKwkqIE1ha2VmaWxlLmluOiBBZGp1c3QuCisJKiBpZ2VuLmM6IEFkanVzdC4KKworCSogZ2VuLXN1cHBvcnQuW2NoXTogTmV3IGZpbGVzLiBPdXRwdXQgdGhlIHN1cHBvcnQgZnVuY3Rpb25zIChmb3VuZAorICAgICAgICBpbiB0aGUgcHBjLWluc3RydWN0aW9ucyBmaWxlKSBpbnRvIGEgc2VwYXJhdGUgZmlsZS4KKwkqIE1ha2VmaWxlLmluOiBBZGQuCisJKiBpbmxpbmUuaCwgaW5saW5lLmM6IEFkZC4KKwkqIHN0ZC1jb25maWcuaDogQWRkLgorCisJKiBsZC1jYWNoZS5jOiBSZS1kZXNpZ24gdGhlIGNhY2hlIHRhYmxlIGZvcm1hdC4KKwkqIHBwYy1jYWNoZS1ydWxlczogVXBkYXRlIHRvIG5ldyBmb3JtYXQuCisKKwkqIGxkLWRlY29kZS5jOiBSZS1kZXNpZ24gdGhlIGRlY29kZSB0YWJsZSBmb3JtYXQuCisJKiBwcGMtb3Bjb2RlLXNpbXBsZTogVXBkYXRlIHRvIG5ldyBmb3JtYXQKKwkqIHBwYy1vcGNvZGUtY29tcGxleDogRGl0dG8KKwkqIHBwYy1vcGNvZGUtZmxhdDogRGl0dG8KKworCSogZmlsdGVyLmgsIGZpbHRlci5jOiBOZXcgZmlsZXMuIFNlcGFyYXRlIHRoZSBvcGNvZGUgZmlsdGVyIHRhYmxlCisgICAgICAgIHJlYWRpbmcgY29kZSBmcm9tIHRoZSByZXN0IG9mIGlnZW4uYy4gIFJlLWRlc2lnbiB0aGUgZmlsdGVyIHNvIHRoYXQKKwlpdCB3b3JrcyBpbmNsdXNpdmx5IG5vdCBleGNsdXNpdmx5LgorCSogaWdlbi5jOiBSZW1vdmUgdGhlIG9wY29kZSBmaWx0ZXIgdGFibGUgbG9hZGluZyBjb2RlLgorCSogTWFrZWZpbGUuaW4gKGZpbHRlci5vKTogQWRqdXN0CisJKiBjb25maWd1cmUuaW46IEFkanVzdCBmaWx0ZXIgZmxhZyBzbyB0aGF0IGRlZmF1bHQgaW5jbHVkZXMgMzJiaXQKKwlhbmQgZmxvYXRpbmcgcG9pbnQuCisJKiBwcGMtaW5zdHJ1Y3Rpb25zOiBDbGVhbiB1cCBmaWx0ZXIgZmllbGRzIHNvIHRoYXQgb25seSBpbiB1c2UKKyAgICAgICAgZW50cmllcyBhcmUgc3BlY2lmZWQgKGllIGRlbGV0ZSBgYmUnKS4KKworCSogbWlzYy5jIChuYW1lMmksIGkybmFtZSk6IE5ldyBmdW5jdGlvbi4gIE1hcCBiZXR3ZWVuIGEgc3RyaW5nIGFuZAorICAgICAgICBhbiBpbnRlZ2VyIHZhbHVlLgorCitNb24gSnVuIDE3IDIwOjA4OjAzIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIHNpbV9jYWxscy5jIChzaW1fY2xvc2UpOiBJZiBzaW11bGF0b3Igbm90IGNyZWF0ZWQsIHNraXAgcHJpbnRpbmcKKyAgICAgICAgb2YgcnVuIGluZm9ybWF0aW9uLgorCitNb24gSnVuIDE3IDIwOjA4OjAzIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIHJlZ2lzdGVycy5jIChyZWdpc3Rlcl9kZXNjcmlwdGlvbik6IFR5cG8sIGluc25zIG5vdCBpbnNuLgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zIChtb2RlbF9nZXRfbnVtYmVyX29mX3N0YWxscyk6IE5ldyBtb2RlbCBmdW5jdGlvbiwKKwlyZXR1cm5zIG51bWJlciBvZiBzdGFsbHMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvY2Vzc29yLgorCSogcHNpbS5jIChwc2ltX3JlYWRfcmVnaXN0ZXIpOiBBZGQgY2FsbCB0byBuZXcgZnVuY3Rpb24KKwltb2RlbF9nZXRfbnVtYmVyX29mX3N0YWxscygpLgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zIChtb2RlbF9nZXRfbnVtYmVyX29mX2N5Y2xlcyk6IE5ldyBtb2RlbCBmdW5jdGlvbiwKKwlyZXR1cm5zIG51bWJlciBvZiBzdGFsbHMgZm9yIHRoZSBzcGVjaWZpZWQgcHJvY2Vzc29yLgorCSogcHNpbS5jIChwc2ltX3JlYWRfcmVnaXN0ZXIpOiBBZGQgY2FsbCB0byBuZXcgZnVuY3Rpb24KKwltb2RlbF9nZXRfbnVtYmVyX29mX2N5Y2xlcygpLgorCitGcmkgSnVuIDE0IDAwOjExOjU2IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGRldmljZV90YWJsZS5oOiBEb24ndCBwYXNzIHRoZSBwYXJlbnQgZGV2aWNlIGludG8gYSBkZXZpY2VzCisgICAgICAgIGNyZWF0ZSBmdW5jdGlvbi4gIFRoaXMgbWFrZXMgdGhlIGNyZWF0ZSBmdW5jdGlvbiBjb25zaXN0ZW50IHdpdGgKKyAgICAgICAgdGhlIGRvY3VtZW50YXRpb24uCisJKiBkZXZpY2UuYyAoZGV2aWNlX3RlbXBsYXRlX2NyZWF0ZV9kZXZpY2UpOiBEaXR0bworCSogaHdfcGFsLmMgKGh3X3BhbF9jcmVhdGUpOiBEaXR0bworCSogaHdfY29yZS5jIChod19jb3JlX2NyZWF0ZSk6IERpdHRvCisJKiBod192bS5jIChod192bV9jcmVhdGUpOiBEaXR0bworCSogaHdfZGlzay5jIChod19kaXNrX2NyZWF0ZSk6IERpdHRvCisJKiBod19udnJhbS5jIChod19udnJhbV9jcmVhdGUpOiBEaXR0bworCSogaHdfbWVtb3J5LmMgKGh3X21lbW9yeV9jcmVhdGUpOiBEaXR0bworCSogaHdfY3B1LmMgKGh3X2NwdV9jcmVhdGUpOiBEaXR0by4KKworCSogZGV2aWNlLmMgKHNwbGl0X2ZpbmRfZGV2aWNlKTogQWxsb3cgYSBudWxsIGluaXRpYWwgcGFyZW50IGRldmljZS4KKwkoZGV2aWNlX3RlbXBsYXRlX2NyZWF0ZV9kZXZpY2UpOiBEaXR0by4KKworCSogZGV2aWNlLmMgKGRldmljZV9jcmVhdGVfZnJvbSk6IE1ha2UgbG9jYWwgKHN0YXRpYykgb25seSB1c2VkCisgICAgICAgIHdpdGhpbiBkZXZpY2UuYy4KKwkqIGRldmljZV90YWJsZS5oOiB0eXBlZGVmIGRldmljZV9jYWxsYmFja3MgbW92ZWQgaGVyZSAoZnJvbQorICAgICAgICBkZXZpY2UuaCkgd2hlcmUgaXQgYmVsb25ncy4KKworCSogaHdfY29yZS5jOiBOZXcgZmlsZS4gSW1wbGVtZW50cyBqdXN0IHRoZSBjb3JlIGRldmljZSB1c2luZyB0aGUKKyAgICAgICAgY29yZSBvYmplY3QuCisKKwkqIGNvcmVmaWxlLmM6IE1vdmVkIGFsbCBjb3JlIGRldmljZSBmdW5jdGlvbnMgaW50byB0aGUgbmV3CisgICAgICAgIGh3X2NvcmUuYyBmaWxlLiBjb3JlX2RldmljZV9jcmVhdGUoKSBkaXNhcGVhcnMuCisKKwkqIHBzaW0uYyAocHNpbV90cmVlKTogVXNlIGRldmljZV90cmVlX2FkZF9wYXJzZWQoKSB0byBjcmVhdGUgdGhlCisgICAgICAgIGNvcmUgZGV2aWNlLgorCitUaHUgSnVuIDEzIDAwOjA5OjI5IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGh3X2luaXQuYzogQ29ycmVjdCB0eXBvIGluIGNvbW1lbnQuCisKKwkqIGNvcmVmaWxlLmMgKGNvcmVfaW5pdCk6IFJlbW92ZSBhbnkgcmVtYWluaW5nIHJlZmVyZW5jZXMgdG8gYQorICAgICAgICBkZWZhdWx0IG1hcC4KKwkoY29yZV9tYXBfZmluZF9tYXBwaW5nKTogRGl0dG8uCisKK1dlZCBKdW4gMTIgMjI6MzA6MzIgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogY29yZWZpbGUuYyAoY29yZV9pbml0KTogTWFrZSBmdW5jdGlvbiBnbG9iYWwgc28gdGhhdCBvdGhlcgorICAgICAgICBkZXZpY2VzIGFyZSBhYmxlIHRvIHVzZSB0aGUgZnVsbCBjb3JlIG9iamVjdC4KKworCSogY29yZWZpbGUuYyAoY29yZV9jcmVhdGUsIGNvcmVfZnJvbV9kZXZpY2UpOiBCcmVhayBjb3JlX2NyZWF0ZQorICAgICAgICBpbnRvIHR3byBmdW5jdGlvbnMuICBUaGUgZmlyc3QgY3JlYXRlcyBhIGNvcmUgb2JqZWN0LCB0aGUgc2Vjb25kCisgICAgICAgIHJldHVybnMgdGhlIGNvcmUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIGNvcmUgZGV2aWNlLgorCisJKiBjb3JlZmlsZS5jIChjb3JlX2RldmljZV9jcmVhdGUpOiBVc2UgY29yZV9jcmVhdGUgdG8gbWFrZSB0aGUKKyAgICAgICAgY29yZSBvYmplY3QuCisKKwkqIHBzaW0uYyAocHNpbV9jcmVhdGUpOiBVc2UgY29yZV9mcm9tX2RldmljZSgpIGluc3RlYWQgb2YKKyAgICAgICAgY29yZV9jcmVhdGUoKS4KKworCSogZGV2aWNlLmMgKGRldmljZV90ZW1wbGF0ZV9jcmVhdGVfZGV2aWNlKTogTWFrZSBzdGF0aWMgYXMgb25seQorICAgICAgICBuZWVkZWQgYnkgZnVuY3Rpb25zIGludGVybmFsIHRvIGRldmljZS5jLgorCitGcmkgSnVuICA3IDIzOjQ3OjE4IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIHBwYy1vcGNvZGUtdGVzdC0yOiBSZW1vdmUgZGVzY3JpcHRpb24gb2YgZmllbGRzLgorCSogcHBjLW9wY29kZS1jb21wbGV4OiBEaXR0bworCSogcHBjLW9wY29kZS1mbGF0OiBEaXR0bworCSogcHBjLW9wY29kZS1zaW1wbGU6IERpdHRvCisJKiBwcGMtb3Bjb2RlLXN0dXBpZDogRGl0dG8KKwkqIHBwYy1vcGNvZGUtdGVzdC0xOiBEaXR0bworCSogcHBjLWNhY2hlLXJ1bGVzOiBEaXR0bworCisJKiBpZ2VuLmM6IEFkZCBkZXNjcmlwdGlvbiBvZiBmaWxlcyBhcyBhIGNvbW1lbnQgYXQgdGhlIGZyb250LgorCitXZWQgSnVuIDI2IDEyOjUwOjMzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBDaGVjayBmb3Igd2hldGhlciB0aGUgdGVybWlvcyBhbmQgdGVybWlvCisJc3RydWN0dXJlcyBhcmUgcmVhbGx5IGRlZmluZWQsIGFuZCB3aGV0aGVyIG9yIG5vdCwgdGhleSBkZWZpbmUgdGhlCisJY19saW5lIGZpZWxkLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisJKiBNYWtlZmlsZS5pbiAoeyxURVJNSU9ffUNGTEFHUyk6IEFkZCBURVJNSU9fQ0ZMQUdTIG9wdGlvbnMgc2V0IGJ5CisJY29uZmlndXJlLgorCisJKiBlbXVsX3VuaXguYzogVmFyaW91cyBjaGFuZ2VzIHRvIGFsbG93IGZvciBidWlsZGluZyBvbiBzeXN0ZW1zCisJd2l0aCBkaWZmZXJlbnQgdGVybWlvIGFuZCB0ZXJtaW9zIHN0cnVjdHVyZXMuICBJZiBob3N0IGhhcyBib3RoCisJdGVybWlvIGFuZCB0ZXJtaW9zLCBqdXN0IHVzZSB0ZXJtaW9zLiAgTm8gbG9uZ2VyIGluY2x1ZGUKKwlzeXMvaW9jdGwuaC4KKworV2VkIEp1biAyNiAxMjoyNjo1NSAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQorCisgICAgICAgICogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsCisgICAgICAgIElOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCisgICAgICAgIChkb2NkaXIpOiBSZW1vdmVkLgorICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KKyAgICAgICAgKEFDX1BST0dfSU5TVEFMTCk6IEFkZGVkLgorICAgICAgICAqIGNvbmZpZ3VyZTogUmVidWlsdC4KKworV2VkIEp1biAgNSAyMzo1Mzo0MiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBjb3JlZmlsZS5oOiBSZXdyaXRlIGRvY3VtZW50YXRpb24gc28gdGhhdCBpdCBjYW4gYmUgZXh0cmFjdGVkIGFuZAorICAgICAgICBjb252ZXJ0ZWQgaW50byB0ZXhpbmZvIChhbmQgaGVuY2UgcmVhZHkgZm9yIHRyYW5zbGF0aW9uIGludG8gaHRtbCwKKyAgICAgICAgdGV4IG9yIG5yb2ZmKS4KKwkqIGRldmljZS5oOiBEaXR0bworCitUaHUgSnVuICA2IDA5OjUyOjM3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogaHdfZGlzay5jIChTRUVLX1NFVCk6IElmIFNFRUtfU0VUIGlzIG5vdCBkZWZpbmVkLCBkZWZpbmUgYXMgMC4KKworV2VkIEp1biAgNSAxMTo0Njo1MiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QHB1ZGRpbj4KKworCSogaHdfZGlzay5jOiBJbmNsdWRlIDx1bmlzdGQuaD4gaWYgYXZhaWxhYmxlLiAgVW5kZXIgU3VuT1MsIHRoYXQKKyAJaXMgdGhlIHNvdXJjZSBvZiBTRUVLX1NFVC4KKworV2VkIEp1biAgNSAwMTozOTowNyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBwc2ltLmMgKHBzaW1fb3B0aW9ucyk6IENvcnJlY3QgdHlwZSBvZiBkdW1teSBhcmd1bWVudHMgYmVpbmcKKyAgICAgICAgcGFzc2VkIHRvIGEgZGV2aWNlX2lvY3RsIGNhbGwuCisKKwkqIGh3X2luaXQuYyAoaHdfZGF0YV9pbml0X2RhdGFfY2FsbGJhY2spOiBBZGp1c3QgcHJpbnRmIGFyZ3VtZW50cy4KKwkod3JpdGVfc3RhY2tfYXJndW1lbnRzKTogRGl0dG8uCisJKiBod190cmFjZS5jOiBJbnN0YW5jZSBjYWxsYmFjayBlbnRyeSBubyBsb25nZXIgYSB0YWJsZS4KKworV2VkIEp1biAgNSAwMTozOTowNyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBlbXVsX3VuaXguYyAoZG9fdW5peF91bWFzayk6IENhc3QgcHJpbnRmIGFyZ3VtZW50LgorCShjb252ZXJ0X3RvX2xpbnV4X3Rlcm1pb3MpOiBVc2UgTElOVVhfVlNXVEMgbm90IExJTlVYX1ZTV0NICisKK01vbiBKdW4gIDMgMTU6MDI6MDQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBod19pbml0LmMgKHVwZGF0ZV9mb3JfYmluYXJ5X3NlY3Rpb24pOiBBYm9ydCBpZiB3ZSBmaW5kIGFuCisJLmludGVycCBzZWN0aW9uLCB3aGljaCBpbmRpY2F0ZXMgdGhlIG5lZWQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgdG8KKwliZSBsb2FkZWQuCisKK01vbiBKdW4gIDMgMTU6MDI6MDQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBlbXVsX3VuaXguYyAoZG9fdW5peF97dGltZSxnZXR0aW1lb2ZkYXksZ2V0cnVzYWdlfSk6IEFkZCBzdXBwb3J0CisJZm9yIHRpbWUsIGdldHRpbWVvZmRheSwgYW5kIGdldHJ1c2FnZSBzeXN0ZW0gY2FsbHMuCisJKHtzb2xhcmlzLGxpbnV4fV9kZXNjcmlwdG9ycyk6IEFkZCBuZXcgc3lzdGVtIGNhbGxzLgorCShkb19nZXR7LGV9e3VpZCxnaWR9KTogVXNlIGdpZF90L3VpZF90IHR5cGVzLgorCShkb19nZXR7LHB9cGlkKTogVXNlIHBpY190IHR5cGVzLgorCisJKiBjb25maWd1cmUuaW4gKEFDX1RZUEVfe0dFVEdST1VQUyxTSUdOQUx9KTogRGVmaW5lLgorCShBQ19UWVBFX3tNT0RFLE9GRixQSUQsU0laRSxVSUR9X1QpOiBEZWZpbmUuCisJKiBjb25maWd7LmluLHVyZX06IFJlZ2VuZXJhdGUuCisKK01vbiBKdW4gIDMgMjM6MTk6NTcgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogZW11bF9uZXRic2QuYyAoZW11bF9uZXRic2RfY3JlYXRlKTogVXNlIHRoZSBtb3JlIHNwZWNpZmljIG5hbWVzCisgICAgICAgIGBwcGMtZWxmJyBhbmQgYHBwYy14Y29mZicgZm9yIHRoZSBzdGFjay10eXBlLgorCSogZW11bF91bml4LmMgKGVtdWxfdW5peF9jcmVhdGUpOiBEaXR0by4KKwkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2NyZWF0ZSk6IERpdHRvLgorCSogaHdfaW5pdC5jOiBSZWNvbml6ZSB0aGUgbmV3IG5hbWVzLgorCisJKiBlbXVsX3VuaXguYyAoZG9fdW5peF9icmVhayk6IEFkanVzdCBzbyB0aGF0IHRoZSB1cGRhdGVkIGlvY3RsCisJY2FsbCBpcyB1c2VkIChubyBzeXN0ZW0gcGFyYW1ldGVyKS4KKworU3VuIEp1biAgMiAxMToyMToxNyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGVtdWxfdW5peC57aCxjfTogTmV3IGZpbGVzIHRvIHByb3ZpZGUgU29sYXJpcyBhbmQgTGludXggc3lzdGVtCisJY2FsbCBlbXVsYXRpb25zLgorCisJKiBNYWtlZmlsZS5pbiAoTElCX3tTUkMsT0JKfSk6IEFkZCBlbXVsX3VuaXgue2Msb30uCisJKG9zX2VtdWwubyk6IERlcGVuZCBvbiBlbXVsX3VuaXguaC4KKwkoZW11bF91bml4Lm8pOiBOZXcgZGVwZW5kZW5jeS4KKworCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0tYWxpZ25tZW50KTogQWRkIDB8ZGVmYXVsdCB0byBtZWFuIHNldAorCWFsaWdubWVudCB0byAwLCB3aGljaCBtZWFucyB1c2UgYXBwcm9wcmlhdGUgYWxpZ25tZW50IGZvciBtb2RlLgorCShBQ19DSEVDS19GVU5DUyk6IEFkZCBuZXcgZnVuY3Rpb25zIG5lZWRlZCBieSBlbXVsX3VuaXguYy4KKwkoQUNfQ0hFQ0tfSEVBREVSUyk6IEFkZCBuZXcgaW5jbHVkZSBmaWxlcyBuZWVkZWQgYnkgZW11bF91bml4LmMuCisJKiBjb25maWcuaW46IFJlZ2VuZXJhdGUuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKwkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX3dyaXRlMl9zdGF0dXMpOiBOZXcgZnVuY3Rpb24gdG8gcmV0dXJuCisJcmVzdWx0cyBpbiByMyBhbmQgcjQgZm9yIFNvbGFyaXMgc3lzdGVtIGNhbGxzLgorCShlbXVsX2RvX3N5c3RlbV9jYWxsKTogSWYgdGhlIHN5c3RlbSBjYWxsIGlzIG5vdCBzdXBwb3J0LCBidXQKKwl0aGVyZSBpcyBhIHN0cmluZyBmb3IgdGhlIHN5c3RlbSBjYWxsIG5hbWUsIHByaW50IG91dCB0aGUgc3RyaW5nCisJaW5zdGVhZCBvZiB0aGUgc3lzdGVtIGNhbGwgbnVtYmVyLgorCisJKiBlbXVsX2dlbmVyaWMuaCAoZW11bF93cml0ZTJfc3RhdHVzKTogRGVjbGFyZSBpdC4KKworCSogZW11bF9uZXRic2QuYzogVXNlIC8qICovIGFyb3VuZCBjb21tZW50IG9uICNlbmRpZi4KKworCSogb3NfZW11bC5jOiBJbmNsdWRlIGVtdWxfdW5peC5oLgorCShvc19lbXVsYXRpb25zKTogQWRkIGVtdWxhdGlvbnMgZm9yIFNvbGFyaXMsIGFuZCBMaW51eC4KKworCSogcHNpbS5jIChwc2ltX3VzYWdlKTogQWRkIG1lc3NhZ2UgYWJvdXQgc29sYXJpcywgbGludXgKKwllbXVsYXRpb25zLgorCitUaHUgTWF5IDMwIDAwOjAwOjEwIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGh3X2lvYnVzLmM6IFRpZHkgdXAgbm90ZXMgc28gdGhhdCB0aGV5IGNhbiBiZSBhdXRvLWV4dHJhY3RlZC4KKworCSogUkVBRE1FOiBDb3JyZWN0IFBTSU0ncyB0aXRsZQorCitXZWQgTWF5IDI5IDIzOjUwOjI2IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGJhc2ljcy5oOiBOZXcgZ2xvYmFsIHR5cGUgb2JqZWN0X2Rpc3Bvc2l0aW9uLCB1c2VkIHRvIGluZGljYXRlCisgICAgICAgIHRoZSBzdGF0dXMgb2Ygb2JqZWN0cyB3aGVuIHRoaW5ncyBhcmUgcmVzdGFydGVkLgorCitGcmkgTWF5IDE3IDE3OjI4OjUyIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYmVuamltZW4uaGlnaGxhbmQuY29tLmF1PgorCisJKiBkZXZpY2VfdGFibGUuaDogQ2hhbmdlIHRoZSBpbnRlcnJ1cHQgZGVzY3JpcHRvciBzdHJ1Y3R1cmUgc28KKyAgICAgICAgdGhhdCBpdCBpbmNsdWRlcyBhbiBhZGRpdGlvbmFsIG1lbWJlciAtIGFuIHVwcGVyIGJvdW5kIG9uIHRoZQorICAgICAgICBpbnRlcnJ1cHRzIGJ5IHRoYXQgbmFtZS4KKworCSogZGV2aWNlLmMgKGRldmljZV9pbnRlcnJ1cHRfZGVjb2RlKTogQWxsb3cgYSByYW5nZSBvZiBpbnRlcnJ1cHQKKyAgICAgICAgcG9ydHMgKGVnIHJzdDAgLi4gcnN0NikgaWYgdGhlIHBvcnQgZGVzY3JpcHRvcnMgYm91bmQgaXMgbm9uIHplcm8uCisKKwkqIGRldmljZS5jIChkZXZpY2VfdHJlZV9wcmludF9kZXZpY2UpOiBJbmNsdWRlIGEgbGlzdCBvZiB2YWxpZAorICAgICAgICBpbnRlcnJ1cHQgcG9ydHMgd2hlbiBsaXN0aW5nIHN1cHBvcnRlZCBkZXZpY2VzLgorCisJKiBkZXZpY2UuaCwgZGV2aWNlLmMgKGRldmljZV9jaGlsZF9pbnRlcnJ1cHRfKik6IERlbGV0ZS4gTm90IHVzZWQuCisKKwkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX2hhcmR3YXJlKTogTW9kaWZ5IHRoZSBjcmVhdGlvbiBvZgorICAgICAgICB0aGUgaW50ZXJydXB0IG5ldCBzbyB0aGF0IGl0IHVzZXMgaW50MCAuLiBpbnROLgorCitUdWUgTWF5IDE0IDIzOjAzOjUzIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX2lvY3RsKTogRHJvcCB0aGUgc3lzdGVtIGFyZ3VtZW50LgorICAgICAgICBEZXZpY2VzIGNhbiBub3Qgb2J0YWluIHRoaXMgdXNpbmcgdGhlIGRldmljZV9zeXN0ZW0oKSBjYWxsLgorCSogZGV2aWNlX3RhYmxlLmg6IEFkanVzdCBhY2NvcmRpbmdseS4KKwkqIGh3XyouYzogQWRqdXN0IGFjY29yZGluZ2x5LgorCSogZW11bF9uZXRic2QuYyAoZG9fYnJlYWspOiBBZGp1c3QgY2FsbCB0byB2bSBkZXZpY2UgYWNjb3JkaW5nbHkuCisJKiBwc2ltLmMgKHBzaW1fb3B0aW9ucyk6IFVzZSBhIGRldmljZV9pb2N0bCBjYWxsIHRvIGZvcmNlIHRoZQorICAgICAgICBod190cmFjZSBkZXZpY2UgdG8gdXBkYXRlIHRoZSB0cmFjZSBvcHRpb25zLgorCSogaHdfdHJhY2UuYzogUmVwbGFjZSB0aGUgaW5pdCBmdW5jdGlvbiB3aXRoIGFuIGlvY3RsIGNhbGwuICBBZGp1c3QKKwlkb2MgYWNjb3JkaW5nbHkuCisKKwkqIHBzaW0uYyAocHNpbV9pbml0KTogUmUtb3JkZXIgaW5pdGlhbGl6YXRpb24gc28gdGhhdCB0aGUKKyAgICAgICAgb3MtZW11bGF0aW9uIGlzIGluaXRpYWxpemVkIGFmdGVyIHRoZSBkZXZpY2UgdHJlZS4gIFdpdGhvdXQgdGhpcywKKyAgICAgICAgb3MtZW11bCdzIGFyZSBub3QgYWJsZSB0byBjcmVhdGUgaW5zdGFuY2VzIG9yIGFjY2VzcyBwcm9wZXJ0aWVzCisgICAgICAgIHRoYXQgY29udGFpbiBhbiBpbnN0YW5jZSBoYW5kbGUuCisKKwkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX2FkZF8qX3Byb3BlcnR5KTogTWFrZSB0aGVzZSBmdW5jdGlvbnMKKyAgICAgICAgaW50ZXJuYWwgdG8gZGV2aWNlLmMuICBUaGUgdXNlciBoYXMgYWNjZXNzIHRvIHRoZSBtb3JlIGdlbmVyaWMKKyAgICAgICAgZGV2aWNlX3RyZWVfYWRkX3BhcnNlZCBmdW5jdGlvbi4gIERpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgaW5pdGlhbAorCWFuZCBjdXJyZW50IHZhbHVlIGZvciBlYWNoIHByb3BlcnR5LgorCSogKGNsZWFuX2RldmljZV9wcm9wZXJ0aWVzKTogTmV3IGZ1bmN0aW9uIHRoYXQgZGVsZXRlcyBhbnkKKwlwcm9wZXJ0aWVzIGNyZWF0ZWQgYWZ0ZXIgdGhlIHN0YXJ0IG9mIGEgc2ltdWxhdGlvbiBhbmQgcmVzdG9yZXMKKwl0aGUgaW5pdGlhbCB2YWx1ZSBvZiBhbnkgb3RoZXJzIChpZ25vcmluZyBpaGFuZGxlcykuCisJKiAoaW5pdF9kZXZpY2VfcHJvcGVydGllcyk6IChSZSlJbml0aWFsaXplIGFueSBwcm9wZXJ0aWVzIHRoYXQKKwljb250YWluIGloYW5kbGVzLiBjcmVhdGUKKworCSogKGRldmljZV90cmVlX2luaXQpOiBJbmNsdWRlIGNhbGxzIHRvIGNsZWFuIHRoZSBkZXZpY2UgdHJlZSdzCisgICAgICAgIHByb3BlcnRpZXMgYW5kIHRoZW4gaW5pdGlhbGl6ZSB0aGVtLiAgRG9jdW1lbnQgdGhpcyBpbiB0aGUgZGV2aWNlLmgKKwlmaWxlLgorCitNb24gTWF5ICA2IDE3OjM2OjE1IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGludGVycnVwdHMuYyAoZGVjcmVtZW50ZXJfaW50ZXJydXB0KTogQWx3YXlzIHBlbmQgYSBkZWNyZW1lbnRlcgorICAgICAgICBpbnRlcnJ1cHQgZXZlbiBpZiBpdCBpcyBub3QgeWV0IHBvc3NpYmxlIHRvIGRlbGl2ZXIgaXQuCisKK1dlZCBNYXkgIDEgMTI6MjY6NTEgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiZW5qaW1lbj4KKworCSogbW9uLmgsIG1vbi5jIChtb25fZ2V0X251bWJlcl9vZl9pbnNucyk6IE1ha2UgdGhpcyBleHRlcm5hbGx5CisgCXZpc2FibGUgYWRqdXN0aW5nIHRoZSBhcmd1bWVudHMgc28gdGhhdCB0aGUgaW50ZXJmYWNlIGlzIGNvcnJlY3QuCisJKG1vbl9wcmludF9pbmZvKTogQWRqdXN0IGNhbGxzLgorCQorCSogcmVnaXN0ZXJzLmgsIHJlZ2lzdGVycy5jIChyZWdpc3Rlcl9kZXNjcmlwdGlvbik6IEFkZCBwaG9ueQorIAljeWNsZSwgaW5zbiBhbmQgc3RhbGwgcmVnaXN0ZXJzLgorCisJKiBwc2ltLmMgKHBzaW1fcmVhZF9yZWdpc3Rlcik6IFJldHVybiBuciBvZiBpbnN0cnVjdGlvbnMgZm9yIGdpdmVuCisgCXByb2Nlc3Nvci4KKworVHVlIEFwciAzMCAyMjowOTowOSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBod19odGFiLmM6IE5ldyBmaWxlLiBFeHRyYWN0IGNvbnRlbnRzIGZyb20gZGlza190YWJsZS5jLgorICAgICAgICBDb250YWlucyBhIGRldmljZSB0aGF0LCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gd2lsbCBjcmVhdGUgYQorICAgICAgICBQb3dlclBDIGh0YWIgaW4gbWVtb3J5LgorCSogaHdfcmVnaXN0ZXIuYzogTmV3IGZpbGUuIEV4dHJhY3QgY29udGVudHMgZnJvbSBkaXNrX3RhYmxlLmMuCisgICAgICAgIENvbnRhaW5zIGEgZGV2aWNlIHRoYXQsIGR1cmluZyBpbml0aWFsaXphdGlvbiwgd2lsbCBwYXJzZSBpdHMKKyAgICAgICAgcHJvcGVydHkgbGlzdCBhbmQgdXNlIHRoYXQgdG8gaW5pdGlhbGl6ZSB2YXJpb3VzIHByb2Nlc3NvcgorICAgICAgICByZWdpc3RlcnMgKG5vdCB0YXJnZXQgc3BlY2lmaWMpLgorCSogaHdfdm0uYzogTmV3IGZpbGUuIEV4dHJhY3QgY29udGVudHMgZnJvbSBkaXNrX3RhYmxlLmMuICBDb250YWlucworICAgICAgICBhIGRldmljZSB0aGF0IGhhbmRsZXMgYWNjZXNzZXMgdG8gaW52YWxpZCB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzZXMKKyAgICAgICAgKGluIHVzZXIgbW9kZSkuCisJKiBod19pbml0LmM6IE5ldyBmaWxlLiBFeHRyYWN0IGNvbnRlbnRzIGZyb20gZGlza190YWJsZS5jLiAgTWlzYworICAgICAgICBkZXZpY2VzIHRoYXQgY2FuIGluaXRpYWxpemUgbWVtb3J5IGZyb20gYSBmaWxlLgorCSogaHdfdHJhY2UuYzogTmV3IGZpbGUuIEV4dHJhY3QgY29udGVudHMgZnJvbSBkaXNrX3RhYmxlLmMuCisgICAgICAgIENvbmZpZ3VyZSB0cmFjZSBvcHRpb25zIGZyb20gcHJvcGVydHkgdmFsdWVzLgorCisJKiBNYWtlZmlsZS5pbiAoaHdfaHRhYi5vLCBod19yZWdpc3Rlci5vLCBod192bS5vLCBod19pbml0Lm8sCisgICAgICAgIGh3X3RyYWNlLmMpOiBBZGQgbmV3IGRldmljZSBmaWxlcy4KKworCSogZGV2aWNlX3RhYmxlLmM6IFJlbW92ZSBhYm92ZSBjb2RlLCBub3cgaW4gc2VwYXJhdGUgaW5kZXBlbmRhbnQKKyAgICAgICAgZmlsZXMuCisKK0ZyaSBBcHIgMjYgMDA6MDA6MDcgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogaHdfZGlzay5jOiBOZXcgZmlsZS4gIERpc2sgYW5kIENEUk9NIGRldmljZS4KKworCSogTWFrZWZpbGUuaW4gKGh3X2Rpc2subyk6IEFkZCBkZXZpY2UgaHdfZGlzay5jLgorCisJKiBwa19kaXNrbGFiZWwuYzogTmV3IGZpbGUuICBJbXBsZW1lbnQgdGhlIG1pc3MtbmFtZWQgZGlzay1sYWJlbAorICAgICAgICBwYWNrYWdlLgorCisJKiBNYWtlZmlsZS5pbiAocGsuaCk6IENyZWF0ZSB0aGUgZmlsZSBway5oIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGFsbAorCXRoZSBwYWNrYWdlcy4KKworCSogTWFrZWZpbGUuaW4gKGh3LmgsIGh3LmMpOiBBZGQgZGVwZW5kYW5jeSBvbiBNYWtlZmlsZSBzbyB0aGF0CisgICAgICAgIHRoZXkgYXJlIHJlLWNyZWF0ZWQgd2hlbiB0aGUgbWFrZWZpbGUgaXMgdXBkYXRlZC4KKworCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfaGFyZHdhcmUpOiBBZGQgYSBkaXNrIGRldmljZQorICAgICAgICAoYmVsb3cgdGhlIGlvYnVzKSB0byB0aGUgZGV2aWNlIHRyZWUuICBJbmNsdWRlIGFuIGloYW5kbGUgb2YKKwl0aGUgZGlzayBhcyAvY2hvc2VuL2Rpc2suCisKKwkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2NyZWF0ZSk6IERvbid0IGluaXRpYWxpemUgdGhlIGlucHV0LAorICAgICAgICBvdXRwdXQgYW5kIChuZXcpIGRpc2sgaGFuZGxlcyB5ZXQuCisJKiAoZW11bF9idWdhcGlfaW5pdCk6IEluaXRpYWxpemUgdGhlIGlucHV0LCBvdXRwdXQgKGFuZCBqdXN0IGFkZGVkKQorCWRpc2sgaWhhbmRsZXMgaGVyZS4KKwkqIChlbXVsX2J1Z2FwaV9kb19kaXNraW8pOiBOZXcuICBQZXJmb3JtcyBkaXNrIGkvbyAod2VsbCBhdCBsZWFzdAorCXdoYXQgSSB0aGluayB0aGUgYmVoYXZvdXIgaXMpLgorCSogZW11bF9idWdhcGkuYyAoZW11bF9idWdhcGlfaW5zdHJ1Y3Rpb25fY2FsbCk6IEFkZCBob29rIHRvIGRpc2sKKwlpL28gYnVnIGNhbGwuICBGb3IgUkVUVVJOIGNhbGwsIGV4aXQgdXNpbmcgZ3ByWzNdJ3Mgc3RhdHVzIGV2ZW4KKwl0aG91Z2ggdGhpcyBpc24ndCBwYXJ0IG9mIHRoZSBzcGVjIC0gbWFrZXMgaXQgcG9zc2libGUgZm9yIG1hY2hpbmUKKwljb2RlIHRvIHNpZ25hbCB0aGUgYXBvcnRpbmcgb2YgYSBzaW11bGF0aW9uIHJ1bi4KKworCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX2NhbGxfbWV0aG9kKTogQWRkIHN1cHBvcnQgZm9yIHRoZQorCWNsYWltL3JlbGVhc2UgbWV0aG9kcy4KKwkqIChjaGlycF9lbXVsX2V4aXQpOiBBZGQgYW4gb3B0aW9uYWwgZXhpdCBzdGF0dXMgYXJndW1lbnQgdG8KKwl0aGUgZXhpdCBtZXRob2QuICBNYWtlcyBpdCBwb3NzaWJsZSBmb3IgY2hpcnAgZW11bCBzaW11bGF0aW9ucworCXRvIGFib3J0IHVwb24gYW4gZXJyb3IuCisJKiBkZXZpY2UuaCwgZGV2aWNlLmMgKGRldmljZV9pbnN0YW5jZV9jbGFpbSwKKyAgICAgICAgZGV2aWNlX2luc3RhbmNlX3JlbGVhc2UpOiBOZXcgbWV0aG9kcyBmb3IgY2xhaW1pbmcgYW5kIHJlbGVhc2luZworCW1lbW9yeS4KKwkqIGh3X21lbW9yeS5jOiBhZGQgY2xhaW0gYW5kIHJlbGVhc2UgbWVtb3J5IG1ldGhvZHMuCisJKiBod18qOiBVc2UgdGhlIGNsYWltIG1lbW9yeSBtZXRob2Qgd2hlbiBhbGxvY2F0aW5nIHBoeXNpY2FsCisJbWVtb3J5LgorCitUaHUgQXByIDE4IDIzOjM4OjEwIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGh3X252cmFtLmMgKGh3X252cmFtX3VwZGF0ZV9jbG9jayk6IFVzZSB0aGUgY3VycmVudCBub3QgcHJldmlvdXMKKyAgICAgICAgdGltZSB3aGVuIHVwZGF0aW5nIHRoZSBjbG9jay4KKworCSogaHdfbnZyYW0uYzogVGlkeSB1cCBkb2N1bWVudGF0aW9uCisKK0ZyaSBNYXkgMjQgMTA6MDg6MTAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKEFDX1NUUlVDVF9TVF97QkxLU0laRSxCTE9DS1MsUkRFVn0pOiBVc2UgdGhlc2UKKwltYWNyb3MgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBhcHByb3ByaWF0ZSBzdF88eHh4PiBmaWVsZHMKKwlleGlzdCBpbiB0aGUgc3RhdCBzdHJ1Y3R1cmUuCisJKEFDX0NIRUNLX0ZVTkNTKTogQ2hlY2sgZm9yIGFsbCB1bml4IHN5c3RlbSBjYWxscyB1c2VkLCBleGNlcHQgZm9yCisJdGhlIHJlYWwgYmFzaWMgb25lcyBsaWtlIG9wZW4sIHJlYWQsIHdyaXRlLCBldGMuCisJKiBjb25maWd7LmluLHVyZX06IFJlZ2VuZXJhdGUuCisKKwkqIGVtdWxfbmV0YnNkLmM6IEFkZCBzdXBwb3J0IGZvciBtaXNzaW5nIHN5c3RlbSBjYWxscywgYW5kL29yCisJbWlzc2luZyBzdGF0IGZpZWxkcy4KKwkoTUFYUEFUSExFTik6IFVuZGVmaW5lIGlmIGluY2x1ZGluZyB1bmlzdGQuaCwgc2luY2Ugc3lzL3BhcmFtLmgKKwltaWdodCBkZWZpbmUgaXQuCisKKwkqIGh3X3BhbC5jIChXSVRIX1NURElPKTogUmVkZWZpbmUgaWYgT19OREVMQVksIEZfR0VURkwsIG9yIEZfU0VURkwKKwlhcmUgbm90IGRlZmluZWQuCisJKHNjYW5faHdfcGFsKTogRG8gbm90IGNhdXNlIHN5bnRheCBlcnJvciBpZiBPX05ERUxBWSwgRl9HRVRGTCwgb3IKKwlGX1NFVEZMIG5vdCBkZWZpbmVkLgorCitUdWUgTWF5IDIxIDE3OjI0OjQ1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZW11bF9uZXRic2QuYyAod3JpdGVfc3RhdCk6IERvbid0IGNvbnZlcnQgc3RfYmxvY2tzIHVubGVzcyB0aGUKKwlob3N0IGlzIG5ldGJzZC4KKworVGh1IE1heSAxNiAxMDo1Njo0NSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoQUNfQ0hFQ0tfSEVBREVSUyk6IEFkZCBzeXMvaW9jdGwuaC4KKwkqIGNvbmZpZ3suaW4sdXJlfTogUmVnZW5lcmF0ZS4KKwkqIGVtdWxfbmV0YnNkLmM6IElmIEhBVkVfU1lTX0lPQ1RMX0ggaXMgbm90IGRlZmluZWQsIGRvbid0IGluY2x1ZGUKKwlzeXMvaW9jdGwuaC4KKworVHVlIE1heSAgNyAxNzoyODoxMiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGh3X3BhbC5jIChod19wYWxfaW5zdGFuY2VfcmVhZF9jYWxsYmFjayk6IFJlbW92ZSB1bnVzZWQKKwl2YXJpYWJsZS4KKworCSogbWlzYy5jICh7LHRhcmdldF99YTJpKTogUmV3cml0ZSB0byBub3QgdXNlIHN0cnRvdWwuCisKKwkqIE1ha2VmaWxlLmluICh7c3ByZWcsbWlzY30ubyk6IEFkZCBkZXBlbmRlbmN5IG9uIC5jIGZpbGUuCisJKHtpLGR9Z2VuKTogRG9uJ3QgbGluayBpbiBsaWJlcml0eS4gIFVzZSBCVUlMRF9MSUJTIGluc3RlYWQgb2YKKwlMSUJTLgorCitNb24gTWF5ICA2IDExOjMxOjQzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogaHdfcGFsLmMgKGh3X3BhbF9pbnN0YW5jZV9yZWFkX2NhbGxiYWNrKTogSWYgdXNpbmcgc3RkaW8sIHVzZQorCWZnZXRzIHRvIHJlYWQgbGluZS4gIElmIG5vdCB1c2luZyBzdGRpbywgZG8gYSBzaW1wbGUgYmxvY2tpbmcgcmVhZAorCW9mIGxlbiBieXRlcy4KKworRnJpIE1heSAgMyAxNTowNzo0MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBDb3JyZWN0bHkgYnVpbGQgc2ltdWxhdG9yIGZvciBidWlsZCBtYWNoaW5lICE9IGhvc3QKKwltYWNoaW5lLgorCitUdWUgQXByIDMwIDE4OjQ2OjA1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1ob3N0ZW5kaWFuKTogUmV3b3JrIHNvIHRoZSBkZWZhdWx0IHVzZXMKKwl0aGUgQUNfQ19CSUdFTkRJQU4gcmVzdWx0cy4gIE9ubHkgcnVuIEFDX0NfQklHRU5ESUFOIGlmIG5vdCBjcm9zcworCWNvbXBpbGluZy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkKKwkqIHNpbS1lbmRpYW4uaDogQWRkIG1vcmUgdGVzdHMgZm9yIGhvc3QgZW5kaWFuIHRvIHN1cHBvcnQgbW9yZQorCXBsYXRmb3JtcyBpbiBhIGNyb3NzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50LgorCitXZWQgQXByIDE3IDE0OjM4OjA2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogaHdfcGFsLmMgKHtzY2FuLHdyaXRlfV9od19wYWwpOiBJZiBXSVRIX1NURElPID09IERPX1VTRV9TVERJTywKKwl1c2Ugc3RkaW8sIGluc3RlYWQgb2YgdW5wZW5kZWQgcmVhZC9wcmludGZfZmlsdGVyZWQuCisJKGh3X3BhbF9pbnN0YW5jZV93cml0ZV9jYWxsYmFjayk6IElmIFdJVEhfU1RESU8gPT0gRE9fVVNFX1NURElPLAorCWZsdXNoIHN0ZG91dCBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0ZXJzLgorCisJKiBvcHRpb25zLmMgKHByaW50X29wdGlvbnMpOiBQcmludCBvdXQgV0lUSF9TVERJTy4KKworCSogTWFrZWZpbGUuaW4gKFNURElPX0NGTEFHUyk6IFBhc3Mgb24gcmVzdWx0IG9mIEBzaW1fc3RkaW9ACisJY29uZmlndXJhdGlvbiB2YXJpYWJsZS4KKwkoQ09ORklHX0NGTEFHUyk6IEluY2x1ZGUgU1RESU9fQ0ZMQUdTLgorCShody57YyxofSk6IEFsbG93IGZvciBzb3VyY2UgZGlyICE9IGJ1aWxkIGRpciwgYW5kIGZvciBIV19TUkMKKwlmaWxlcyB0byBjb250YWluIGRpcmVjdG9yeSBwaWVjZXMuCisKKwkqIHN0ZC1jb25maWcuaCAoRE97LE5UfV9VU0VfU1RESU8pOiBOZXcgZmxhZ3MgZm9yIHdoZXRoZXIgd2UKKwlzaG91bGQgdXNlIHN0ZGlvIGZvciBjb25zb2xlIGlucHV0LgorCShXSVRIX1NURElPKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyBET05UX1VTRV9TVERJTy4KKworCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0tc3RkaW8pOiBBZGQgbmV3IHN3aXRjaCB0byBjb250cm9sCisJd2hldGhlciBzdGRpbyBpcyB1c2VkIGZvciBjb25zb2xlIEkvTy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworCSogaW50ZXJydXB0cy5jIChleHRlcm5hbF9pbnRlcnJ1cHQpOiBEZWNsYXJlIGl0IHRvIGJlCisJSU5MSU5FX0lOVEVSUlVQVFMsIG5vdCBJTkxJTkVfQ1BVLgorCitNb24gQXByIDE1IDIzOjMwOjU2IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGV2ZW50cy5jIChpbnNlcnRfZXZlbnRfZW50cnkpOiBBbGxvdyBldmVudHMgdG8gYmUgc2NoZWR1bGVkCisgICAgICAgICpOT1cqIChhdCBkZWx0YSB0aW1lIDApLiAgQWRkIGFzc2VydGlvbnMgdG8gY2xhcmlmeSBiZWhhdm91ciBvZgorICAgICAgICBldmVudCBxdWV1ZS4KKworCSogZXZlbnRzLmMgKHVwZGF0ZV90aW1lX2Zyb21fZXZlbnQpOiBOZXcgZnVuY3Rpb24uIENhbGN1bGF0ZXMgdGhlCisgICAgICAgIG51bWJlciBvZiB0aWNrcyBmcm9tIHRoZSBuZXh0IGV2ZW50LiAgVXNlIHRoaXMuCisKK1N1biBBcHIgMTQgMjE6Mzk6NDUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGVtdWxfbmV0YnNkLmMgKGRvX2JyZWFrKTogUmV0dXJuIDAgaWYgc3VjY2VzcyAoaW5zdGVhZCBvZgorICAgICAgICBhZGp1c3RlZCBicmVhaykuCisKKwkqIGRldmljZV90YWJsZS5jICh2bV9pb2N0bF9jYWxsYmFjayk6IERvbid0IHJldHVybiBhZGp1c3RlZCBicmVhaworICAgICAgICAoaXNuJ3QgbmVlZGVkKS4KKworU3VuIEFwciAxNCAyMTozMjo0MSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGV2aWNlX3RhYmxlLmg6IENoYW5nZSB0eXBlIG9mIHRoZSBkZXZpY2UgaW9jdGwgc28gdGhhdCBpdAorCXJldHVybnMgYW4gaW50IChzdGF0dXMpLgorCSogZGV2aWNlLmggKGRldmljZV9pb2N0bCk6IERpdHRvLgorCSogZGV2aWNlLmMgKGRldmljZV9pb2N0bCk6IERpdHRvLgorCisJKiBkZXZpY2VfdGFibGUuYyAoc3RhY2tfaW9jdGxfY2FsbGJhY2spOiBSZXR1cm4gMCBzdGF0dXMuCisJKHZtX2lvY3RsX2NhbGxiYWNrKTogRGl0dG8KKworU2F0IEFwciAxMyAwMDowMDoyNCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBlbXVsX25ldGJzZC5jIChkb19yZWFkKTogQ29ycmVjdGx5IHNldCB0aGUgcmV0dXJuIHZhbHVlLgorCShkb19nZXRwaWQpOiBEaXR0by4KKwkoZG9fZ2V0dWlkKTogRGl0dG8uCisJKGRvX2dldGV1aWQpOiBEaXR0by4KKwkoZG9fZHVwKTogRGl0dG8uCisJKGRvX2dldGVnaWQpOiBEaXR0by4KKwkoZG9fZ2V0Z2lkKTogRGl0dG8uCisJKGRvX3NpZ3Byb2NtYXNrKTogRGl0dG8uCisJKGRvX3VtYXNrKTogRGl0dG8uCisJKGRvX2R1cDIpOiBEaXR0by4KKwkoZG9fZ2V0dGltZW9mZGF5KTogRGl0dG8uCisJKGRvX2dldHJ1c2FnZSk6IERpdHRvLgorCShkb19mc3RhdCk6IERpdHRvLgorCShkb19zdGF0KTogRGl0dG8uCisJKGRvX2xzZWVrKTogRGl0dG8uCisJKGRvX19fc3lzY3RsKTogRGl0dG8uCisKK0ZyaSBBcHIgMTIgMjA6NTY6NDcgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGV2aWNlX3RhYmxlLmMgKHZtX2lvY3RsX2NhbGxiYWNrKTogRG9uJ3QgYWNjZXNzIHRoZSBwcm9jZXNzb3IKKyAgICAgICAgcmVnaXN0ZXJzIGRpcmVjdGx5LCBpbnN0ZWFkIGxlYXZlIGl0IHRvIHRoZSBjYWxsZXIgdG8gaGFuZGxlIHRoaXMuCisKKwkqIGVtdWxfbmV0YnNkLmMgKGRvX2JyZWFrKTogV2hpY2ggY2FsbHMgdm1faW9jdGxfY2FsbGJhY2sgdG8KKyAgICAgICAgcGVyZm9ybSBhIGJyZWFrLiAgUGFzcyBpbiB0aGUgbmV3IGJyZWFrIHZhbHVlIGFuZCBzZXQgdGhlCisgICAgICAgIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdC4KKworCSogZW11bF9nZW5lcmljLmMgKGVtdWxfd3JpdGVfc3RhdHVzKTogQ2hhbmdlIHNvIHRoYXQgcjMgY29udGFpbnMKKyAgICAgICAgZWl0aGVyIHN0YXR1cyBvciBlcnJubyBhbmQgZmFpbHVyZSBpcyBpbmRpY2F0ZWQgYnkgU08uCisKK1RodSBBcHIgIDQgMjM6MDM6MzggMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogZW11bF9idWdhcGkuYyAoZW11bF9idWdhcGlfY3JlYXRlKTogTW9yZSBzdHJpY3QgY2hlY2sgb2YgT0VBCisgICAgICAgIGFkZHJlc3MuCisKK1RodSBBcHIgIDQgMjA6NTg6MDUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGludGVycnVwdHMuaCAoaW50ZXJydXB0cyk6IE5ldyBzdHJ1Y3R1cmUgY29udGFpbnMgc3RhdGUgb2YKKyAgICAgICAgcGVuZGluZyBpbnRlcnJ1cHRzLgorCisJKiBjcHUuYyAoY3B1X2ludGVycnVwdHMpOiBOZXcgZnVuY3Rpb24uICBQZW5kaW5nIGludGVycnVwdCBzdGF0dXMKKyAgICAgICAgaW4gdGhlIGNwdSBhbmQgZ3JhbnQgYWNjZXNzIHRvIGl0LiAgQWRkIGludGVycnVwdHMgdG8gY3B1CisgICAgICAgIHN0cnVjdHVyZS4KKworRnJpIE1hciAyOSAyMjowOToyNSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGV2aWNlLmMgKGRldmljZV90cmVlX2FkZF9wYXJzZWQpOiBDaGVjayB0aGF0IHRoZSBjcmVhdGlvbiBvZiBhCisgICAgICAgIGRldmljZSBpbnN0YW5jZSB3b3JrZWQgYmVmb3JlIHVzaW5nIGl0LgorCisJKiBwc2ltLmMgKHBzaW1faGFsdCk6IFJlbW92ZSBjaWEgYXJndW1lbnQgZnJvbSBwc2ltX2hhbHQuICBUaGlzCisgICAgICAgIGZ1bmN0aW9uIGRvZXMgbm90IHNhdmUgdGhlIENJQSBzbyBkbyBub3QgcGFzcyBpdCBpbi4KKworRnJpIE1hciAyOSAyMTozMDo1NiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogaHdfcGFsLmMgKGh3X3BhbCk6IE1lcmdlIHRoZSBoYWx0IGFuZCBpY3UgYW5kIGNvbnNvbGUgZGV2aWNlcworICAgICAgICBmb3VuZCBpbiBkZXZpY2VfdGFibGUuYyBpbnRvIGEgc2luZ2xlIGhhY2sgcGFsLgorCisJKiBkZXZpY2VfdGFibGUuYyAoaGFsdCwgaWN1LCBjb25zb2xlKTogRGVsZXRlLgorCisJKiBNYWtlZmlsZS5pbiAoaHdfcGFsLm8pOiBOZXcgZGVwZW5kZW5jeS4KKworCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfaGFyZHdhcmUpOiBSZS1hcmFuZ2UgZGV2aWNlIHRyZWUKKyAgICAgICAgc28gdGhhdCBpdCB1c2VzIHRoZSBwYWwgaW5zdGVhZCBvZiB0aGUgaWN1L2hhbHQvY29uc29sZSBkZXZpY2VzLgorICAgICAgICBXaXJlIHRoZSBwYWwncyBpbnRlcnJ1cHQgcG9ydHMgdXAgdG8gdGhlIGNwdSBub2Rlcy4KKworRnJpIE1hciAyOSAyMDoxNzoxNyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogaHdfaW9idXMuYyAoaHdfaW9idXNfYXR0YWNoX2FkZHJlc3NfY2FsbGJhY2spOiBNb3ZlIGZyb20KKyAgICAgICAgZGV2aWNlX3RhYmxlLmMgdG8gaGVyZS4KKworCSogTWFrZWZpbGUuaW4gKGh3X2lvYnVzLm8pOiBOZXcgZGVwZW5kZW5jeS4KKworRnJpIE1hciAyOSAxMjoxNzo1OCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBlbXVsX2J1Z2FwaS5jIChfb3NfZW11bF9kYXRhKTogQWRkIGZpZWxkcyBmb3Igb3V0cHV0LCBpbnB1dC4KKyAgICAgICAgKGVtdWxfYnVnYXBpX2NyZWF0ZSk6IENyZWF0ZSBpbnB1dCwgb3V0cHV0IGZyb20gL2Nob3Nlbi9zdGRpbiBhbmQKKyAgICAgICAgL2Nob3Nlbi9zdGRvdXQuCisgICAgICAgIChlbXVsX2J1Z2FwaV9kb197cmVhZCx3cml0ZX0pOiBTd2l0Y2ggdG8gdXNlIGRldmljZV9pbnN0YW5jZQorICAgICAgICBpbnRlcmZhY2UuCisgICAgICAgIChlbXVsX2J1Z2FwaV9pbnN0cnVjdGlvbl9jYWxsKTogQ2hhbmdlIGNhbGxzIHRvCisgICAgICAgIGVtdWxfYnVnYXBpX2RvX3tyZWFkLHdyaXRlfSB0byBwYXNzIGRldmljZSBpbnN0YW5jZSBhcmd1bWVudC4KKworVHVlIE1hciAyNiAxNDo1Nzo1OCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGlnZW4uYyAoaWRlY29kZV9zd2l0Y2hfZW5kKTogRml4IDIvMjYgY2hhbmdlIHNvIHRoYXQgYW4gZXh0cmEKKyAgICAgICAgZGVmYXVsdCBpcyBub3Qgd3JpdHRlbiBvdXQgaWYgYSBkZWZhdWx0IHdhcyBhbHJlYWR5IHdyaXR0ZW4uCisKKwkqIHBzaW0uYyAocHNpbV97cmVhZCx3cml0ZX1fcmVnaXN0ZXIpOiBVc2Ugc2l6ZW9mIHVuc2lnbmVkXzggdG8KKyAgICAgICAgc2l6ZSBjb29rZWRfYnVmLCBub3Qgc2l6ZW9mIG5hdHVyYWxfd29yZCwgc2luY2UgZmxvYXRpbmcgcG9pbnQKKyAgICAgICAgcmVnaXN0ZXJzIGFyZSA4IGJ5dGVzLgorCitNb24gTWFyIDI1IDIyOjA3OjEzIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mIDIuOS4KKworVGh1IE1hciAyMSAwMDoxNDoyNiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGV2aWNlX3RhYmxlLmg6IEFsd2F5cyBpbmNsdWRlIHN0cmluZyBoZWFkZXJzLgorCitUaHUgTWFyIDIxIDAwOjA2OjA5IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIG1haW4uYyAoZXJyb3IpOiBCZSBjYXJlZnVsIHRvIG5vdCB0cnkgdG8gcHJpbnQgb3V0IHN0YXRpc3RpY3MKKyAgICAgICAgd2hlbiB0aGUgc2ltdWxhdGlvbiB3YXMgbmV2ZXIgY3JlYXRlZC4KKworU3VuIE1hciAxNyAyMjo0MDo1NyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogYmFzaWNzLmg6IE1vdmUgdGhlIGV2ZW50IHF1ZXVlJ3MgZGVmaW5pdGlvbiB0byBoZXJlIHNvIHRoYXQgaXQKKyAgICAgICAgY2FuIGJlIHJlZmVyZWQgdG8gZ2xvYmFsbHkgd2l0aCBvdXQgaW1wb3J0aW5nIGFsbCBvZiBldmVudHMuaC4KKworCSogcHNpbS5oLCBwc2ltLmMgKHBzaW1fZXZlbnRfcXVldWUpOiBOZXcgZnVuY3Rpb24uICBHcmFudCBhY2Nlc3MKKyAgICAgICAgdG8gdGhlIHNpbXVsYXRpb24gZXZlbnQgcXVldWUuICBXaWxsIG1ha2UgdGhpcyB0aGUgc2luZ2xlIHBvaW50IG9mCisgICAgICAgIGFjY2VzcyAodGhlcmUgaXMgYWZ0ZXIgYWxsIG9ubHkgb25lIGV2ZW50IHF1ZXVlIGluIHRoZQorICAgICAgICBzaW11bGF0aW9uKS4KKworCSogY3B1LmMgKGNwdV9jcmVhdGUpOiBVc2UgcHNpbV9ldmVudF9xdWV1ZSB0byBvYnRhaW4gdGhlIGV2ZW50CisgICAgICAgIHF1ZXVlIGluc3RlYWQgb2YgaXQgYmVpbmcgcGFzc2VkIGluLiAgTm8gbG9uZ2VyIGFsbG93IGFjY2VzcyB0bworICAgICAgICB0aGUgY3B1J3MgY29weSBvZiB0aGUgZXZlbnQgcXVldWUuCisKK1N1biBNYXIgMTcgMjI6NDA6NTcgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGV2ZW50cy5oLCBldmVudHMuYyAoZXZlbnRfaGFuZGxlcik6IFJlbW92ZSBldmVudF9xdWV1ZSBmcm9tCisgICAgICAgIGFyZ3VtZW50cyBwYXNzZWQgdG8gYW4gZXZlbnQgaGFuZGxlci4gIFRoYXQgYXJndW1lbnQgaXMgcmVkdW5kYW50CisgICAgICAgIC0gdGhlIGBkYXRhJyBzaG91bGQgcmVmZXIgdG8gYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZQorICAgICAgICBldmVudCBxdWV1ZSBpZiBxdWVpbmcgaXMgbmVlZGVkLgorCisJKiBjcHUuYyAoY3B1X2RlY3JlbWVudF9ldmVudCk6IGFkanVzdAorCisJKiBldmVudHMuYyAoZXZlbnRfcXVldWVfcHJvY2Vzcyk6IGFkanVzdAorCitTdW4gTWFyIDE3IDIyOjQwOjU3IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBkZXZpY2UuaCwgZGV2aWNlLmMgKGRldmljZV9zeXN0ZW0pOiBOZXcsIHJldHVybnMgYSBoYW5kbGUgZm9yCisgICAgICAgIHRoZSBzeXN0ZW0gZ2l2ZW4gdGhlIGRldmljZS4KKworCSogZGV2aWNlLmMgKGRldmljZV9hZGRyZXNzX2luaXQpOiBTdG9yZSBhIHBvaW50ZXIgYmFjayB0byB0aGUKKyAgICAgICAgc3lzdGVtIGluIGVhY2ggZGV2aWNlcyBub2RlLgorCisJKiBkZXZpY2VfdGFibGUuaDogRG9uJ3QgcGFzcyBgc3lzdGVtJyBpbnRvIGVhY2ggZGV2aWNlIHdoZW4gaXQgaXMKKyAgICAgICAgYmVpbmcgaW5pdGlhbGl6ZWQsIHRoaXMgaXMgbm93IGF2YWlsYWJsZSB1c2luZyBkZXZpY2Vfc3lzdGVtKG1lKS4KKworCSogZGV2aWNlLmMgKGRldmljZV9hZGRyZXNzX2luaXQsIGRldmljZV9kYXRhX2luaXQpOiBBZGp1c3QuCisKKwkqIGh3X2NwdS5jLCBod19udnJhbS5jLCBod19tZW1vcnkuYywgaHdfZWVwcm9tLmMsIGRldmljZV90YWJsZS5jOgorICAgICAgICBBZGp1c3QuCisKK1N1biBNYXIgMTcgMjI6NDA6NTcgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGludGVycnVwdHMuYyAoZGVjcmVtZW50ZXJfaW50ZXJydXB0LCBleHRlcm5hbF9pbnRlcnJ1cHQpOgorICAgICAgICBSZW1lbWJlciB0aGF0IGFuIGludGVycnVwdCB3YXNuJ3QgZGVsaXZlcmVkIHNvIHRoYXQgaXQgY2FuIGJlCisgICAgICAgIHRyaWVkIGFnYWluIGxhdGVyLgorCisJKiBpbnRlcnJ1cHRzLmMgKGNoZWNrX21hc2tlZF9pbnRlcnJ1cHQpOiBOZXcgZnVuY3Rpb24uICAocmUpCisgICAgICAgIGNoZWNrcyBmb3IgdGhlIHBvc2liaWxpdHkgdGhhdCBhIHJlY2VudCBjaGFuZ2UgdG8gdGhlIE1TUiBtYXkgaGF2ZQorICAgICAgICBtYWRlIGl0IHBvc3NpYmxlIHRvIGRlbGl2ZXIgYW4gaW50ZXJydXB0IHRoYXQgd2FzIHByZXZpb3VzbHkKKyAgICAgICAgbWFza2VkIGJlIHRoZSBFRSBiaXQuCisKKwkqIHBwYy1pbnN0cnVjdGlvbnMgKG10bXNyLCBtZm1zciwgcmZpKTogQ2hlY2sgZm9yIHBvc2liaWxpdHkgb2YKKwlhIHBlbmRpbmcgaW50ZXJydXB0IGJlaW5nIGRlbGl2ZXJlZCB1c2luZyBjaGVja19tYXNrZWRfaW50ZXJydXB0KCkuCisKKwkqIGNwdS5jIChjcHVfZGVjcmVtZW50X2V2ZW50KTogSnVzdCBjYWxsIGRlY3JlbWVudGVyX2ludGVycnVwdCgpCisgICAgICAgIGxlYXZpbmcgaXQgdG8gdGhhdCBtb2R1bGUgdG8gaGFuZGxlIGJvdGggaW50ZXJydXB0IHN5bmNocm9uaXphdGlvbgorICAgICAgICBhbmQgbWFza2luZy4KKworCSogY3B1LmMgKHN0cnVjdCBfY3B1KTogcmVtb3ZlIHZhcmlhYmxlcyB0aGF0IHdlcmUgZ29pbmcgdG8gcmVjb3JkCisgICAgICAgIHBlbmRpbmcgZGVjcmVtZW50ZXIgYW5kIGV4dGVybmFsIGludGVycnVwdHMuCisKK1N1biBNYXIgMTcgMjI6NDA6NTcgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGh3X2NwdS5jLCBod19jcHUuaDogTmV3IGZpbGVzLiAgSW1wbGVtZW50IGEgZGV2aWNlIHRoYXQgc2l0cworICAgICAgICBiZXR3ZWVuIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBhbmQgdGhlIHNpbXVsYXRvcnMgaW50ZXJuYWwKKyAgICAgICAgcHJvY2Vzc29yIG1vZGVsLiAgTWFwcyBkZXZpY2UgaW50ZXJydXB0cyBvbnRvIHRoZSBwcm9jZXNzb3IKKwlpbnRlcnJ1cHQgZnVuY3Rpb24gY2FsbHMuCisKK01vbiBNYXIgIDQgMDY6MDY6NTQgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogaHdfbnZyYW0uYzogTlZSQU0gZGV2aWNlIHRoYXQgaW5jbHVkZXMgYSByZWFsLXRpbWUgY2xvY2sgdGhhdCBpcworICAgICAgICB1cGRhdGVkIGVhY2ggc2Vjb25kLgorCitNb24gTWFyICA0IDA0OjE4OjUwIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGRldmljZS5oIChhdHRhY2hfdHlwZSk6IFJlbW92ZSBhdHRhY2hfZGVmYXVsdCB0eXBlIGFkZHJlc3MKKyAgICAgICAgc3BhY2VzLiAgV2lsbCByZXBsYWNlIHdpdGggbGV2ZWxzIG9mIGNhbGxiYWNrIG1lbW9yeS4KKworCSogY29yZWZpbGUuaCwgY29yZWZpbGUuYyAobmV3X2NvcmVfbWFwcGluZyksIGNvcmVmaWxlLmMKKyAgICAgICAgKGNvcmVfbWFwX2F0dGFjaCk6IFJlcGxhY2UgZGVmYXVsdCBhdHRhY2ggd2l0aCBhIGxheWVyZCBjYWxsYmFjaworICAgICAgICBhcHByb2FjaC4KKworU3VuIE1hciAgMyAwMzo1ODo0NiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBkZXZpY2UuYyAoc3BsaXRfcHJvcGVydHlfc3BlY2lmaWVyKTogZW5zdXJlIHRoYXQgb25seSBhIHNpbmdsZQorICAgICAgICBwcm9wZXJ0eSBpcyBmb3VuZC4KKwkoc3BsaXRfdmFsdWUpOiBOZXcgZnVuY3Rpb24sIHBhcnNlcyB0aGUgdmFsdWUgcGFydCBvZiBhIGRldmljZQorCXNwZWMuCisKKwkqIGRldmljZS5jIChkZXZpY2VfdHJlZV9hZGRfcGFyc2VkKTogVXNlIHRoZSBpbnRlcnJ1cHQgY29udmVyc2lvbgorICAgICAgICBmdW5jdGlvbnMgdG8gZGV0ZXJtaW5lIHRoZSBpbnRlcnJ1cHQgcG9ydCBudW1iZXJzLgorCisJKiBkZXZpY2VfdGFibGUuaDogQWRkIHRhYmxlIHRoYXQgbWFwcyBiZXR3ZWVuIGFuIGludGVycnVwdHMKKyAgICAgICAgc3ltYm9saWMgbmFtZSBhbmQgaXRzIHBvcnQgbnVtYmVyLgorCisJKiBkZXZpY2UuaCwgZGV2aWNlLmMgKGRldmljZV9pbnRlcnJ1cHRfZGVjb2RlLAorICAgICAgICBkZXZpY2VfaW50ZXJydXB0X2VuY29kZSk6IG5ldyBmdW5jdGlvbnMgdXNlIHRoZSByZWNlbnRseSBhZGRlZAorICAgICAgICBpbnRlcnJ1cHQgcG9ydCBuYW1lL251bWJlciB0YWJsZXMgdG8gcGVyZm9ybSBjb252ZXJzaW9uLgorCitTdW4gTWFyICAzIDAzOjIzOjU5IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX3NldF9hcnJheV9wcm9wZXJ0eSwKKyAgICAgICAgZGV2aWNlX3NldF9ib29sZWFuX3Byb3BlcnR5LCBkZXZpY2Vfc2V0X2loYW5kbGVfcHJvcGVydHksCisgICAgICAgIGRldmljZV9zZXRfaW50ZWdlcl9wcm9wZXJ0eSwgZGV2aWNlX3NldF9zdHJpbmdfcHJvcGVydHkpOiBOZXcKKyAgICAgICAgZnVuY3Rpb25zIC0gYWxsb3cgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gcHJvcGVydHkgdG8gYmUgY2hhbmdlZC4KKworCSogZGV2aWNlLmgsIGRldmljZS5jOiBSZS1vcmRlciBkZWNsYXJhdGlvbiBhbmQgZGVmaW5pdGlvbiBvZgorICAgICAgICBwcm9wZXJ0eSBmdW5jdGlvbnMuCisKK1N1biBNYXIgIDMgMDM6MTA6MjIgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGV2aWNlLmMgKGRldmljZV90cmVlX3ByaW50X2RldmljZSwgZGV2aWNlX3RyZWVfYWRkX3BhcnNlZCk6CisgICAgICAgIFJlbW92ZSByZWZlcmVuY2VzIHRvIHBoYW5kbGUgcHJvcGVydGllcy4KKworV2VkIEZlYiAyOCAwMDo0MzowNyAxOTk2ICBBbmRyZXcgQ2FnbmV5IC0gYWthIE5vaWQgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBNYWtlZmlsZS5pbiAoY29yZWZpbGUubyk6IG1pc3NpbmcgZGVwZW5kZW5jeSBvbiBkZXZpY2VfdGFibGUuaAorICAgICAgICBldGMuCisKK1R1ZSBGZWIgMjcgMjM6NTk6MzUgMTk5NiAgQW5kcmV3IENhZ25leSAtIGFrYSBOb2lkICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGV2aWNlX3RhYmxlLmg6IFJldmFtcCBkZXZpY2UgaW5pdCBjYWxsYmFja3Mgc28gdGhhdCB0aGV5IGFyZSBhCisgICAgICAgIHN1YiBzdHJ1Y3R1cmUuCisJKiBkZXZpY2UuYyAoZGV2aWNlX2luaXRfZGF0YSwgZGV2aWNlX2luaXRfYWRkcmVzcyk6IElmIGFuIGluaXQKKyAgICAgICAgY2FsbGJhY2sgaXMgTlVMTCBhc3N1bWUgaXQgc2hvdWxkIGRvIG5vdGhpbmcuCisJKiBkZXZpY2VfdGFibGUuYyAoaWdub3JlX2RldmljZV9pbml0LCB1bmltcF9kZXZpY2VfaW5pdCk6IGRlbGV0ZQorICAgICAgICBhcyByZWR1bmRhbnQuCisJKiBkZXZpY2VfdGFibGUuYywgaHdfbWVtb3J5LmM6IGFkanVzdC4KKworCSogKGlvKTogZGl0dG8uCisJKiAoZG1hKTogZGl0dG8uCisJKiAoZGV2aWNlX2luc3RhbmNlKTogZGl0dG8uCisJKiAoaW9jdGwpOiBkaXR0by4KKwkqIChhZGRyZXNzIG5lZSBjb25maWdfYWRkcmVzcyk6IGRpdHRvLgorCSogKGludGVycnVwdCk6IGRpdHRvLgorCitNb24gRmViIDI2IDIxOjExOjIwIDE5OTYgIEFuZHJldyBDYWduZXkgLSBha2EgTm9pZCAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGlnZW4uYyAoaWRlY29kZV9zd2l0Y2hfZW5kKTogT3V0cHV0IGEgZGVmYXVsdCBlbnRyeSB3aGVuIHRoZQorICAgICAgICBzd2l0Y2ggc3RhdGVtZW50IGlzIHBlcmZlY3QuICBGaXJzdGx5IHN0b3BzIEdDQyBjb21wbGFpbmluZyBhYm91dAorICAgICAgICBhbiBpbmNvbXBsZXRlIHN3aXRjaCBhbmQgc2Vjb25kbHkgaXQgd2lsbCBiZSBlbGltaW5hdGVkIGJ5IGEgZ29vZAorICAgICAgICBjb21waWxlciBhbnkgd2F5LgorCitNb24gRmViIDI2IDIyOjQ3OjE1IDE5OTYgIEFuZHJldyBDYWduZXkgLSBha2EgTm9pZCAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIE1ha2VmaWxlLmluIChody5oLCBody5jKTogTmV3IHRhcmdldHMuIENyZWF0ZSBmcm9tIHRoZSBsaXN0IG9mCisgICAgICAgIGh3XyouYyBmaWxlcy4gaHcuaCBkZWNsYXJlcyBhIGRldmljZSBkZXNjcmlwdG9yIHRhYmxlIGZvciBlYWNoIGh3CisgICAgICAgIGRldmljZSB3aGlsZSBody5jIGxpc3RzIHRob3NlIHRhYmxlcyBpbiBhIGZvcm0gc3VpdGFibGUgZm9yIHRoZQorICAgICAgICBjb25zdHJ1Y3Rpb24gb2YgYSB0b3AgbGV2ZWx0YWJsZSBpbiBkZXZpY2VfdGFibGUuYy4KKworCSogTWFrZWZpbGUuaW4gKGRldmljZV90YWJsZS5vKTogbm93IGRlcGVuZHMgb24gaHcuYyBhIGdlbmVyYXRlZAorICAgICAgICB0YWJsZSBvZiBody4KKworCSogZGV2aWNlX3RhYmxlLmMgKGRldmljZV90YWJsZSk6IFJlLWFyYW5nZSB0aGUgdGFibGUgb2YgZGV2aWNlcyBzbworICAgICAgICB0aGF0IHR3byBsZXZlbHMgYXJlIHBvc3NpYmxlLiAgTWFrZSB1c2Ugb2YgaHcuYy4KKwkqIGRldmljZV90YWJsZS5oOiBkaXR0by4KKworCSogZGV2aWNlLmMgKGRldmljZV90ZW1wbGF0ZV9jcmVhdGVfZGV2aWNlKTogSGFuZGxlIG5ldyB0d28gbGV2ZWwKKyAgICAgICAgZGV2aWNlIGxvb2t1cCB0YWJsZS4KKwkqIGRldmljZS5jIChkZXZpY2VfdXNhZ2UpOiBkaXR0by4KKworTW9uIEZlYiAyNiAyMjoyNDowMCAxOTk2ICBBbmRyZXcgQ2FnbmV5IC0gYWthIE5vaWQgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBkZXZpY2VfdGFibGUuYzogRGVsZXRlIHRoZSBtZW1vcnkgZGV2aWNlIChtb3ZlZCB0byBod19tZW1vcnkuYykuCisKKwkqIGh3X21lbW9yeS5jOiBOZXcgZmlsZS4gIEp1c3QgYW4gT3BlbkJvb3QgbWVtb3J5IGRldmljZS4KKworV2VkIEphbiAxNyAyMTo0NzozNCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGV2aWNlLmMgKGRldmljZV9pbml0X2FkZHJlc3MpOiBOZXcuICBTcGxpdCBpbml0aWFsaXphdGlvbiBpbnRvCisgICAgICAgIHR3byBzdGFnZXMsIGFkZHJlc3MgYW5kIGFkZHJlc3Mgc3BhY2VzCisJKiBkZXZpY2UuYyAoZGV2aWNlX2luaXRfZGF0YSk6IE5ldy4gLi4uIGFuZCBkYXRhIG9yIG90aGVyIHdvcmsuCisgICAgICAgIFdpdGggb3V0IHRoaXMsIGRldmljZXMgdHJ5IHRvIG1vZGlmeSBtZW1vcnkgYmVmb3JlIGl0IGFzIGJlZW4KKyAgICAgICAgYXR0YWNoZWQuCisKKwkqIGRldmljZS5jIChkZXZpY2VfdHJlZV9pbml0KTogVXBkYXRlIHRvIHBlcmZvcm0gc3RhZ2VkCisgICAgICAgIGluaXRpYWxpemF0aW9uLgorCisJKiBkZXZpY2UuYyAoZGV2aWNlX2luaXQpOiBEZWxldGUuCisKK1dlZCBKYW4gMTcgMjE6NDM6MDkgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGRldmljZV90YWJsZS5jIChkYXRhXyopOiBSZXdyaXRlIHRvIG1ha2UgaGVhdmVyIHVzZSBvZiBwcm9wZXJ0eQorICAgICAgICBub2Rlcy4gQWxsb3cgaW5pdGlhbGl6YXRpb24gYnkgZGlmZmVyZW50IGRhdGEgdHlwZXMuCisJKiBkZXZpY2VfdGFibGUuYyAoaHRhYl8qIHB0ZV8qKTogUmV3cml0ZSB0byB1c2UgcHJvcGVydGllcy4KKworCSogZW11bF9jaGlycC5jIChlbXVsX2NoaXJwX2NyZWF0ZSk6IFVzZQorCSogZW11bF9idWdhcGkuYyAoZW11bF9idWdhcGlfY3JlYXRlKTogRGl0dG8KKwkqIGVtdWxfbmV0YnNkLmMgKGVtdWxfbmV0YnNkX2NyZWF0ZSk6IERpdHRvCisKK1dlZCBKYW4gMTcgMjE6MjQ6NTAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX29wdGlvbnMpOiBBbm5vdGF0ZSBleGlzdGluZyB0cmVlCisgICAgICAgIHdpdGggb3B0aW9ucyB0aGF0IGhhdmVuJ3QgeWV0IGJlZW4gc3BlY2lmaWVkLgorCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfaGFyZHdhcmUpOiBBbm5vdGF0ZSBleGlzdGluZyB0cmVlCisgICAgICAgIHdpdGggZGVtbyBkZXZpY2VzIGFuZCBwcm9wZXJ0aWVzLgorCisJKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfY3JlYXRlKTogVXBkYXRlIHRvIHVzZSBuZXcKKyAgICAgICAgZGV2aWNlX3RyZWVfYWRkX3BhcnNlZCBjYWxsIGFuZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG5vdworICAgICAgICBpbmNsdWRlZCBpbiB0aGUgZGV2aWNlIHRyZWUuICBVc2UgZW11bF9hZGRfdHJlZSogZnVuY3Rpb25zIHRvIGFkZAorICAgICAgICBhbnkgbWlzc2luZyBkZXRhaWxzLgorCSogZW11bF9idWdhcGkuYyAoZW11bF9idWdhcGlfY3JlYXRlKTogRGl0dG8KKwkqIGVtdWxfbmV0YnNkLmMgKGVtdWxfbmV0YnNkX2NyZWF0ZSk6IERpdHRvCisKK1dlZCBKYW4gMTcgMjE6MTg6MjcgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGRldmljZS5jIChkZXZpY2VfaW5zdGFuY2VfY3JlYXRlKTogTmV3LiBDcmVhdGUvZGVsZXRlIGFuZAorICAgICAgICBvcGVyYXRlIG9uIGluc3RhbmNlcyBvZiBhIGRldmljZS4KKwkqIGRldmljZS5jIChkZXZpY2VfaW5zdGFuY2VfZGVsZXRlKTogRGl0dG8KKwkqIGRldmljZS5jIChkZXZpY2VfaW5zdGFuY2VfcmVhZCk6IERpdHRvCisJKiBkZXZpY2UuYyAoZGV2aWNlX2luc3RhbmNlX3dyaXRlKTogRGl0dG8KKwkqIGRldmljZS5jIChkZXZpY2VfaW5zdGFuY2Vfc2Vlayk6IERpdHRvCisJKiBkZXZpY2UuYyAoZGV2aWNlX2luc3RhbmNlX2RhdGEpOiBEaXR0bworCSogZGV2aWNlLmMgKGRldmljZV9pbnN0YW5jZV9uYW1lKTogRGl0dG8KKwkqIGRldmljZS5jIChkZXZpY2VfaW5zdGFuY2VfcGF0aCk6IERpdHRvCisKKwkqIGVtdWxfY2hpcnAuYyAoY2hpcnBfZW11bF9vcGVuKTogSW1wbGVtZW50IHVzaW5nIGRldmljZV9pbnN0YW5jZS4KKwkqIGVtdWxfY2hpcnAuYyAoY2hpcnBfZW11bF9jbG9zZSk6IERpdHRvCisJKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfcmVhZCk6IERpdHRvCisJKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfd3JpdGUpOiBEaXR0bworCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX3NlZWspOiBEaXR0bworCisJKiBlbXVsX2NoaXJwLmMgKGNoaXJwX3JlYWRfdDJoX2FyZ3MpOiBSZWFkIGFyZ3VtZW50cyBmcm9tIGRldmljZS4KKyAgICAgICAgQmVpbmcgY2FyZWZ1bCB0byBjb252ZXJ0IGFsbCBmcm9tIHRhcmdldCB0byBob3N0IGJ5dGUgb3JkZXIuCisJKiBlbXVsX2NoaXJwLmMgKGNoaXJwX3dyaXRlX2gydF9hcmdzKTogQ29udmVyc2UuCisKK1dlZCBKYW4gMTcgMjA6MDc6MTUgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGRldmljZS5jIChkZXZpY2VfdHJlZV9hZGRfcGFyc2VkKTogTmV3LiAgUmV3cml0ZSBjb2RlIHRvIGFkZAorICAgICAgICBkZXZpY2VzIHRvIHRoZSBkZXZpY2UgdHJlZSBzbyB0aGF0IGEgc2luZ2xlIHByaW50ZiBzdHlsZSBmdW5jdGlvbgorICAgICAgICBpcyB1c2VkLgorCisJKiBkZXZpY2UuYyAoZGV2aWNlX3RyZWVfYWRkXyopOiBEZWxldGUuIFJlcGxhY2VkIGJ5IGFib3ZlLgorCisJKiBkZXZpY2UuYyAoc3BsaXRfZGV2aWNlX3NwZWNpZmllcik6IEZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIGEKKyAgICAgICAgZGV2aWNlIHNwZWNpZmllciAocGF0aCkgYnJlYWtpbmcgaXQgaW50byBpdHMgY29tcG9uZW50cworCSogZGV2aWNlLmMgKHNwbGl0X3Byb3BlcnR5X3NwZWNpZmllcik6IERpdHRvCisJKiBkZXZpY2UuYyAoc3BsaXRfZGV2aWNlX25hbWUpOiBEaXR0bworCSogZGV2aWNlLmMgKHNwbGl0X2ZpbmRfZGV2aWNlKTogRGl0dG8KKworCSogZGV2aWNlLmMgKHNjYW5fKik6IERlbGV0ZQorCisJKiBkZXZpY2UuYyAoZGV2aWNlX3RyZWVfZmluZF9kZXZpY2UpOiBSZXdyaXRlIHRvIHVzZSBhYm92ZS4KKwkqIGRldmljZS5jIChkZXZpY2VfYWRkX3Byb3BlcnR5KTogRGl0dG8KKworV2VkIEphbiAxNyAxOTo1MTo1NiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogcHNpbS5jKHBzaW1fb3B0aW9ucyk6IFBhcnNlIHRoZSBwc2ltIG9wdGlvbnMsIGluc3RhbGxpbmcgdGhlaXIKKyAgICAgICAgdmFsdWUgaW4gdGhlIGRldmljZSB0cmVlLiAgT3B0aW9ucyBhcmUgbm93IGZpcnN0IGVudGVyZWQgaW50byBhCisgICAgICAgIGRldmljZSB0cmVlIGFuZCB0aGVuIGV4dHJhY3RlZCBvdXQgYWdhaW4gd2hlbiBuZWVkZWQuICBUaGlzIGFsbG93cworICAgICAgICBncmVhdGVyIGZsZXhhYmlsaXR5IGluIGNvbmZpZ3VyYXRpb24uCisKKwkqIHBzaW0uYyAocHNpbV90cmVlKTogUmV0dXJucyBhIGJhc2ljIGRldmljZSB0cmVlIHJlYWR5IGZvcgorICAgICAgICBwYXJzaW5nIGJ5IHBzaW1fb3B0aW9ucy4KKwkqIHBzaW0uYyAocHNpbV91c2FnZSk6IE5ldy4gIEdpdmUgdXNhZ2UgdG8gdmFyaW5nIGxldmVscyBvZiBkZXRhaWwKKyAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSB2ZXJib3NpdHkuICBJbiB0dXJuIG91dHB1dCBkZXZpY2UgYW5kIHRyYWNlCisgICAgICAgIHVzYWdlLgorCisJKiBtYWluLmMgKG1haW4pOiBVcGRhdGUgdG8gdXNlIG5ldyBzeXN0ZW0KKwkqIHNpbV9jYWxscy5jIChzaW1fb3Blbiwgc2ltX2RvX2NvbW1hbmQpOiBEaXR0bworCisJKiBwc2ltLmMgKHBzaW1fb3B0aW9ucyk6IEFkZCBgcicgb3B0aW9uIC0gcmFtIHNpemUuCisJKiBwc2ltLmMgKHBzaW1fb3B0aW9ucyk6IEFkZCBgbycgb3B0aW9uIC0gb3BlbmJvb3QgdHJlZSBlbnRyeS4KKwkqIHBzaW0uYyAocHNpbV9vcHRpb25zKTogQWRkIGBoJy9gSCcgb3B0aW9ucyAtIG1vcmUgaGVscC4KKworCSogZGVidWcuYyAodHJhY2VfdXNhZ2UpOiBBZGQgbW9yZSBkZXRhaWxlZCBoZWxwLgorCSogZGV2aWNlLmMgKGRldmljZV91c2FnZSk6IE5ldy4gT3V0cHV0IGhlbHAgaW5jbHVkaW5nIGEgbGlzdCBvZgorICAgICAgICB0aGUgZGV2aWNlcyBjdXJyZW50bHkgYXZhaWxhYmxlIGluIHRoZSBkZXZpY2UgdGFibGUuCisJKiBkZXZpY2VfdGFibGUuYzogQWRkIHVzYWdlIG9wZXJhdG9yIHRvIGVhY2ggZGV2aWNlLgorCisJKiBjb3JlZmlsZS5jIChjb3JlX2NyZWF0ZSwgY29yZV9kZXZpY2VfY3JlYXRlKTogQWRqdXN0IHNvIHRoYXQgdGhlCisgICAgICAgIGNvcmUgZGV2aWNlIGlzIGNyZWF0ZWQgZWFybGllciBmb3IgcHNpbV90cmVlKCkuICBDb3JlIGNhbiBsYXRlciBiZQorICAgICAgICBjcmVhdGVkIGZyb20gaXQuCisKKwkqIHBzaW0uYyAocHNpbV9jcmVhdGUpOiBVcGRhdGUgdG8gaGFuZGxlIGFib3ZlIHdheSBvZiBjcmVhdGluZworICAgICAgICB0aGluZ3MuICBFeHRyYWN0IGFsbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkZXZpY2UgdHJlZS4KKworCSogZGV2aWNlX3RyZWUuYyAodHJhY2VfKik6IE5ldyBkZXZpY2Ugbm9kZSwgaXRzIHByb3BlcnRpZXMgYXJlCisgICAgICAgIHVzZWQgdG8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgdHJhY2Ugb3B0aW9ucy4gIEluaXQgdGhpcyBkZXZpY2UgKGluCisgICAgICAgIHBzaW1fb3B0aW9ucykgd2hlbiBldmVyIHRoZSBvcHRpb25zIGFyZSB1cGRhdGVkLgorCitXZWQgSmFuIDE3IDE5OjQ2OjA3IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBkZWJ1Zy5oOiBBZGQgdHJhY2VfcHJpbnRfaW5mbywgdHJhY2VfcHJpbnRfZGV2aWNlX3RyZWUgYW5kCisgICAgICAgIHRyYWNlX2R1bXBfZGV2aWNlX3RyZWUuICBUaGUgZmlyc3QgaXMgYSByZXBsYWNlbWVudCBmb3IgdGhlCisgICAgICAgIHZhcmlhYmxlIGBwcmludF9pbmZvJyBmb3VuZCBpbiBtYWluLmMgYW5kIHNpbV9jYWxscy5jLiAgVGhlIGxhdHRlcgorICAgICAgICB0d28gZW5hYmxlIHRoZSBkdW1waW5nIG9mIHRoZSBlbnRpcmUgZGV2aWNlIHRyZWUuCisKKwkqIGRlYnVnLmM6IEFkZCB0byB0cmFjZV9kZXNjcmlwdGlvbiB0YWJsZS4KKworCSogbWFpbi5jIChtYWluKTogVXNlIGFib3ZlIHRyYWNlIGluc3RlYWQgb2YgbG9jYWwgdmFyaWFibGUKKwkqIHNpbV9jYWxscy5jIChzaW1fY2xvc2UpOiBEaXR0bworCisJKiBkZXZpY2UuYyAoZGV2aWNlX3RyZWVfcHJpbnRfZGV2aWNlKTogTmV3LiAgUHJpbnRzIHRoZSBkZXZpY2UKKyAgICAgICAgdHJlZSBpbiBhIGZvcm1hdCB0aGF0IGlzIGNvbnNpc3RlbnQgd2l0aCB3aGF0IGNhbiBiZSBwYXJzZWQgYnkgdGhlCisgICAgICAgIGRldmljZSB0cmVlIGxvYWQgZnJvbSBmaWxlIGNvZGUuCisKKwkqIHBzaW0uYyAocHNpbV9jcmVhdGUpOiBEdW1wIGRldmljZSB0cmVlIGlmIGVuYWJsZWQuIElmIG51bXAKKyAgICAgICAgc2VsZWN0ZWQsIGV4aXQgcHNpbSBpbW1lZGlhdGx5LgorCitXZWQgSmFuIDE3IDE5OjM2OjUyIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBjb3JlZmlsZS1uLmggKGNvcmVfbWFwX3JlYWRfTik6IFdoZW4gbWFwcGluZyBmcm9tIGFuIGFkZHJlc3MgdG8KKyAgICAgICAgYSBkZXZpY2UsIGRvIG5vdCBzdWJ0cmFjdCB0aGUgZGV2aWNlcyBiYXNlLiAgVGhlIGRldmljZSBpdHMgc2VsZgorICAgICAgICBjYW4gZG8gdGhpcy4gIEJyaW5ncyB0aGUgYmVoYXZvdXIgaW50byBsaW5lIHdpdGggT3BlbkJvb3QuCisJKiBjb3JlZmlsZS1uLmggKGNvcmVfbWFwX3dyaXRlX04pOiBEaXR0bworCSogY29yZWZpbGUuYyAoY29yZV9tYXBfcmVhZF9idWZmZXIpOiBEaXR0bworCSogY29yZWZpbGUuYyAoY29yZV9tYXBfd3JpdGVfYnVmZmVyKTogRGl0dG8KKworCSogZGV2aWNlX3RhYmxlLmMgKGNvbnNvbGVfaW9fcmVhZF9idWZmZXJfY2FsbGJhY2spOiBBZGp1c3QgdG8KKyAgICAgICAgaGFuZGxlIGJpYXNlZCBhZGRyZXNzLgorCSogZGV2aWNlX3RhYmxlLmMgKGNvbnNvbGVfaW9fd3JpdGVfYnVmZmVyX2NhbGxiYWNrKTogRGl0dG8KKworV2VkIEphbiAxNyAxODozNjowOSAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGV2aWNlLmMgKGF0dGFjaF9kZXZpY2VfaW50ZXJydXB0X2VkZ2UpOiBOZXcuIEludGVycnVwdCBtb2RlbAorICAgICAgICBkaWQgbm90IGFsbG93IGludGVycnVwdHMgdG8gYmUgd2lyZWQgdXAgYXMgYSBnZW5lcmFsIG5ldCAoZWRnZXMpLgorICAgICAgICBSZS1pbXBsZW1lbnQgc28gdGhhdCBpbnRlcnJ1cHQgZXZlbnRzIGNhbiBiZSBwYXNzZWQgdG8gbXVsdGlwbGUKKyAgICAgICAgY29udHJvbGxlcnMgYW5kIGludGVycnVwdCBjb250cm9sbGVycyBjYW4gZnVydGhlciBwcm9wb2dhdGUKKyAgICAgICAgaW50ZXJydXB0IGV2ZW50cy4KKworCSogZGV2aWNlLmMgKGF0dGFjaF9kZXZpY2VfaW50ZXJydXB0X2VkZ2UpIDogTmV3LCBEaXR0bworCSogZGV2aWNlLmMgKGRldGFjaF9kZXZpY2VfaW50ZXJydXB0X2VkZ2UpIDogTmV3LCBEaXR0bworCSogZGV2aWNlLmMgKGNsZWFuX2RldmljZV9pbnRlcnJ1cHRfZWRnZXMpIDogTmV3LCBEaXR0bworCSogZGV2aWNlLmMgKGRldmljZV9pbnRlcnJ1cHRfZXZlbnQpIDogTmV3LCBEaXR0bworCSogZGV2aWNlLmMgKGRldmljZV9pbnRlcnJ1cHRfYXR0YWNoKSA6IE5ldywgRGl0dG8KKwkqIGRldmljZS5jIChkZXZpY2VfaW50ZXJydXB0X2RldGFjaCkgOiBOZXcsIERpdHRvCisJKiBkZXZpY2UuYyAoZGV2aWNlX2NoaWxkX2ludGVycnVwdF9hdHRhY2gpIDogTmV3LCBEaXR0bworCSogZGV2aWNlLmMgKGRldmljZV9jaGlsZF9pbnRlcnJ1cHRfZGV0YWNoKSA6IE5ldywgRGl0dG8KKworCSogZGV2aWNlLmMgKGRldmljZV9hdHRhY2hfaW50ZXJydXB0KSA6IERlbGV0ZSBvbGQKKwkqIGRldmljZS5jIChkZXZpY2VfZGV0YWNoX2ludGVycnVwdCkgOiBEZWxldGUgb2xkCisJKiBkZXZpY2UuYyAoZGV2aWNlX2ludGVycnVwdCkgOiBEZWxldGUgb2xkCisJKiBkZXZpY2UuYyAoZGV2aWNlX2ludGVycnVwdF9hY2spIDogRGVsZXRlIG9sZAorCisJKiBkZXZpY2VfdGFibGUuYyAodW5pbXBfKikgOiBVcGRhdGUgdG8gbWF0Y2gKKwkKKyAgICAgICAgKiBkZXZpY2VfdGFibGUuYyAoaWN1X2lvX3dyaXRlX2J1ZmZlcl9jYWxsYmFjaykgOiBVcGRhdGUgdG8gdXNlCisgICAgICAgIGludGVyZmFjZS4KKwkqIGRldmljZV90YWJsZS5jIChpY3VfaW50ZXJydXB0X2V2ZW50X2NhbGxiYWNrKSA6IERpdHRvCisKK1dlZCBKYW4gMTcgMTg6MTg6NDAgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGRldmljZS5jIChleHRlcm5hbF90b19kZXZpY2UpIDogTmV3IGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYQorICAgICAgICBzdGFuZGFyZCBtYXBwaW5nIGJldHdlZW4gYSBkZXZpY2VzIGludGVybmFsIHJlcHJlc2VudGF0aW9uIChhCisgICAgICAgIHBvaW50ZXIpIGFuZCBpdHMgZXh0ZXJuYWwgKG9yIHdoYXQgaXMgcGFzc2VkIHRvIGEgY2xpZW50KQorICAgICAgICByZXByZXNlbnRhdGlvbiAoYSBwaGFuZGxlKS4gIEltcGxlbWVudCB1c2luZyB0aGUgY2FwIG9iamVjdAorICAgICAgICBhdHRhY2hlZCB0byB0aGUgcm9vdCBub2RlLgorCisJKiBkZXZpY2UuYyAoZGV2aWNlX3RvX2V4dGVybmFsKSA6IERpdHRvCisJKiBkZXZpY2UuYyAoZXh0ZXJuYWxfdG9fZGV2aWNlX2luc3RhbmNlKSA6IERpdHRvIGJ1dCBmb3IgaWhhbmRsZQorICAgICAgICBhbmQgZGV2aWNlIGluc3RhbmNlLgorCSogZGV2aWNlLmMgKGRldmljZV9pbnN0YW5jZV90b19leHRlcm5hbCkgOiBEaXR0bworCisJKiBNYWtlZmlsZSAoZGV2aWNlLm8pOiBBZGQgZGVwZW5kZW5jeSBvbiBjYXAuCisKKwkqIGVtdWxfY2hpcnAuYyAoc3RydWN0IF9lbXVsX2NoaXJwX2RhdGEpIDogRWxpbWF0ZSB1c2Ugb2YgY2FwLiBDb2RlCisgICAgICAgIG5lZWRpbmcgdG8gdHJhbnNsYXRlIGJldHdlZW4gaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucworICAgICAgICBjaGFuZ2VkIHRvIHVzZSB0aGUgZXh0ZXJuYWxfdG9fZGV2aWNlIGV0LmFsLiBkZXZpY2Ugb3BlcmF0aW9ucy4KKwkqIGVtdWxfY2hpcnAuYyAoY2hpcnBfZW11bF8qKSA6IERpdHRvCisKKwkqIE1ha2VmaWxlIChlbXVsX2NoaXJwLm8pOiBSZW1vdmUgZGVwZW5kZW5jeSBvbiBjYXAKKworU2F0IEphbiAgNiAxMDoxMzoyNiAxOTk2ICBBbmRyZXcgQ2FnbmV5IC0gYWthIE5vaWQgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBlbXVsX2NoaXJwLmMgKG1hcF9vdmVyX2NoaXJwX25vdGUpOiBUaWdodGVuIHVwIChhbmQgZml4KSBjaGVja3MKKyAgICAgICAgb24gT3BlbkJvb3Qgbm90ZSBzZWN0aW9uLgorCitGcmkgSmFuICA1IDIwOjI4OjUzIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnbmxhbmQuY29tLmF1PgorCisJKiBlbXVsX2dlbmVyaWMuYyAoZW11bF93cml0ZV9idWZmZXIpOiBVc2Ugdm0gZmF1bHRpbmcgYnl0ZQorIAlyZWFkL3dyaXRlIGNhbGxzIGZvciBidWZmZXIgdHJhbnNmZXJzLiAgVGhpcyB3aWxsIGNhdXNlIGEgZmF1bHQgdG8KKyAJb2NjdXJlIGlmIHRoZSB0cmFuc2ZlciBmYWlscy4gIENIUlAgY2F0Y2hlcyB0aGUgZmF1bHQgd2hpbGUgdGhlCisgCW90aGVycyBzdWZmZXIgdGhlIGNvbnNlcXVlbmNlcy4KKyAgICAgICAgKGVtdWxfcmVhZF9idWZmZXIpOiBEaXR0by4KKyAgICAgICAgKGVtdWxfd3JpdGVfd29yZCk6IERpdHRvLgorICAgICAgICAoZW11bF9yZWFkX3dvcmQpOiBEaXR0by4KKyAgICAgICAgKGVtdWxfcmVhZF9zdHJpbmcpOiBEaXR0by4KKworRnJpIEphbiAgNSAxODo1NTozNCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogZW11bF9jaGlycC5jIChlbXVsX2NoaXJwX2NyZWF0ZSwgZW11bF9jaGlycF9pbnN0cnVjdGlvbl9jYWxsKSwKKyAJZW11bF9nZW5lcmljIChlbXVsX2Jscl9pbnN0cnVjdGlvbik6IFVzZSBhIHJlYWwgYmxyIGluc3RydWN0aW9uIHRvCisgCXJldHVybiBmcm9tIGEgY2xpZW50IHNlcnZpY2UgY2FsbC4KKworCSogZW11bF9jaGlycC5jIChzZXJ2aWNlcyk6IEFkZCBhbGwgT3BlbkJvb3Qgc2VydmljZXMgdG8gdGFibGUuCisKKwkqIGVtdWxfZ2VuZXJpYy5oLCBlbXVsX2J1Z2FwaS5jIChlbXVsX2J1Z2FwaV9jcmVhdGUpLCBlbXVsX2NoaXJwLmMKKyAJKGVtdWxfY2hpcnBfY3JlYXRlKSA6IFVzZSBuYW1lcyBpbnN0ZWFkIG9mIG51bWJlcnMgZm9yCisgCWluc3RydWN0aW9ucyBiZWluZyBzdG9yZWQgaW4gbWVtb3J5LgorCitGcmkgSmFuICA1IDE4OjUyOjI4IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IFJlbW92ZSAubG9nLCBjb3JlIGFuZCAqLmNvcmUKKyAJKEZyb20gTmV0QlNEKSBmaWxlcy4KKworV2VkIE1heSAyOSAyMjo1Nzo0MCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgorCisJKiBDaGFuZ2VMb2cuMDAsIENoYW5nZUxvZzogQ2hhbmdlTG9nIGZyb20gZ2RiLTQuMTYgYmVjb21lcworICAgICAgICBDaGFuZ2VMb2cuMDAKKwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9DaGFuZ2VMb2cuMDAgYi9zaW0vcHBjL0NoYW5nZUxvZy4wMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjhiZTgyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9DaGFuZ2VMb2cuMDAKQEAgLTAsMCArMSwyMTY4IEBACitXZWQgTWF5IDI5IDIyOjU3OjQwIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKwkqIENoYW5nZUxvZy4wMCwgQ2hhbmdlTG9nOiBDaGFuZ2VMb2cgZnJvbSBnZGItNC4xNiBiZWNvbWVzCisgICAgICAgIENoYW5nZUxvZy4wMAorCitUaHUgQXByICA0IDE1OjE3OjIyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogSU5TVEFMTDogRml4IHNvbWUgbG9uZyBsaW5lcyBhbmQgcmVtb3ZlIHg4NiBzcGVjaWZpYyBvcHRpb25zIGluCisJdGhlIGV4YW1wbGVzLgorCitTdW4gTWFyIDMxIDE1OjQ3OjMzIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5oaWdobGFuZC5jb20uYXU+CisKKyAgICAgICAgKiBJTlNUQUxMOiBVcGRhdGUgdG8gcmVmbGVjdCBnZGItNC4xNi4KKworICAgICAgICAqIFJVTjogVXBkYXRlIHRvIHJlZmxlY3QgZ2RiLTQuMTYuICBSZXZpZXcgbm90ZXMgb24gYnVpbGRpbmcgYSBCU0QKKyAgICAgICAgcnVudGltZSBlbnZpcm9ubWVudC4KKworCSogUkVBRE1FOiBQb2ludCBvdXQgY29weXJpZ2h0IHN0YXR1cyBvZiBzaW11bGF0b3IgaW4gaW50cm9kdWN0aW9uLgorCitUaHUgTWFyICA3IDE5OjUzOjQ5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBlbXVsX25ldGJzZC5jOiBPbmx5IGluY2x1ZGUgc3lzL21vdW50LmggaWYgSEFWRV9TWVNfTU9VTlRfSCBpcworCWRlZmluZWQuCisJKiBjb25maWd1cmUuaW46IFRlc3QgZm9yIHN5cy9tb3VudC5oLgorCSogY29uZmlndXJlLGNvbmZpZy5pbjogUmVnZW5lcmF0ZS4KKworVGh1IEZlYiAyMiAyMjo0ODo1NyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogUkVBRE1FLCBSVU4sIElOU1RBTEw6IFVwZGF0ZSB0byByZWZsZWN0IGFubm91bmNlbWVudAorCSogcHNpbTogUFNJTSAxLjAuMSByZWxlYXNlZAorCitUaHUgRmViIDIyIDE0OjAxOjU2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZW11bF9idWdhcGkuYyAoZW11bF9idWdhcGlfZG9fcmVhZCk6IE5ldyBmdW5jdGlvbiB0byBoYW5kbGUKKwlyZWFkcy4KKwkoZW11bF9idWdhcGlfaW5zdHJ1Y3Rpb25fY2FsbCk6IEFkZCBzdXBwb3J0IGZvciAuSU5DSFIvLklOTE4KKwlzeXN0ZW0gY2FsbHMuCisKKwkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2RvX3dyaXRlKTogQ2FsbCBmbHVzaF9zdGRvdXRwdXQuCisJKiBlbXVsX25ldGJzZC5jIChkb193cml0ZSk6IENhbGwgZmx1c2hfc3Rkb3V0cHV0LgorCisJKiBtYWluLmMgKGZsdXNoX3N0ZG91dHB1dCk6IERvIGZmbHVzaCAoc3Rkb3V0KS4KKwkqIHNpbV9jYWxscy5jIChmbHVzaF9zdGRvdXRwdXQpOiBEbyBnZGJfZmx1c2ggKGdkYl9zdGRvdXQpOworCSogc2ltX2NhbGxiYWNrcy5oIChmbHVzaF9zdGRvdXRwdXQpOiBEZWNsYXJlLgorCitXZWQgRmViIDIxIDEwOjM5OjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZW11bF9idWdhcGkuYyAoYnVnX21hcHBpbmcpOiBOZXcgc3RydWN0dXJlIHRvIG1hcCBidWcgc3lzdGVtCisJY2FsbCBudW1iZXJzIHRvIGEgc3RyaW5nLgorCSh0b3BsZXZlbCk6IEFkZCByZW1haW5pbmcgYnVnYXBpIHN5c3RlbSBjYWxscy4KKwkoZW11bF9idWdhcGlfaW5zdHJ1Y3Rpb25fbmFtZSk6IE1hcCBidWdhcGkgc3lzdGVtIGNhbGwgbnVtYmVyIHRvIGEKKwlzdHJpbmcuCisJKGVtdWxfYnVnYXBpX2RvX3dyaXRlKTogQ29tbW9uIGNvZGUgdG8gcHJvY2VzcyB3cml0ZSBzeXN0ZW0gY2FsbHMuCisJKGVtdWxfYnVnYXBpX2luc3RydWN0aW9uX2NhbGwpOiBJZiBvcy1lbXVsIHRyYWNpbmcgaXMgb24sIHRyYWNlCisJdGhlIHN5c3RlbSBjYWxsLiAgVXNlIHRoZSBuYW1lIHRvIHByaW50IHVua25vd24gc3lzdGVtIGNhbGwuCisJQ29ycmVjdCBpbXBsZW1lbnRhdGlvbiBvZiBfT1VUTE4uICBBZGQgc3VwcG9ydCBmb3IgX09VVFNUUiBhbmQKKwlfUENSTFIgc3lzdGVtIGNhbGxzLgorCitXZWQgRmViIDIxIDE3OjA3OjI3IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBOT1RFUzogTmV3IGZpbGUuICBSYW1ibGluZ3Mgb24gd2h5IHRoaW5ncyB3ZXJlIGRvbmUgdGhleSB3YXkKKyAJdGhleSB3ZXJlLgorCQorCSogcHNpbS5jIChwc2ltX29wdGlvbnMpOiBEaWRuJ3QgZW50ZXIgdGhlIG1vZGVsIHZhbHVlIGludG8gdGhlCisgCWRldmljZSB0cmVlIGFzIGEgc3RyaW5nLgorCQorICAJKiBjcHUuYyAoY3B1X3N5bmNocm9uaXplX2NvbnRleHQpOiBXcm9uZyB0ZXN0IGZvciBjb25kaXRpb25hbAorIAlmbHVzaCBvZiBjYWNoZS4KKworCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfaGFyZHdhcmUpOiByZWcgdmFsdWUgZGlkbid0IG1hdGNoCisgCWJ1cyBhZGRyZXNzLgorCQorCSogcHBjLW9wY29kZS1mbGF0OiBuZXcgZmlsZS4gR2VuZXJhdGUgYW4gaW5zdHJ1Y3Rpb24gZGVjb2RlCisgCWZ1bmN0aW9uIGxpa2UgcHBjLW9wY29kZS1jb21wbGV4IGJ1dCB1c2Ugc3dpdGNoIHN0YXRlbWVudHMuCisKKwkqIElOU1RBTEw6IGRvY3VtZW50IG5ldyBvcGNvZGUgZmlsZSwgYWRkIGV4YW1wbGUgY29uZmlndXJhdGlvbnMuCisKK1R1ZSBGZWIgMjAgMTg6NDI6MzEgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIG1haW4uYyAobWFpbik6IHJlbmFtZSBwc2ltIGluc3RhbmNlIChzeXN0ZW0pIHRvIHNpbXVsYXRpb24gYW5kCisgCW1ha2UgZ2xvYmFsLgorCSogbWFpbi5jIChlcnJvcik6IHByaW50IG91dCBwZXJmb3JtYW5jZSBldmVuIHdoZW4gYW4gZXJyb3Igb2NjdXJlcy4KKworCSogZW11bF9idWdhcGkuYyAoZW11bF9idWdhcGlfY3JlYXRlKTogRml4IGFyZ3VtZW50IHBhc3NpbmcuCisKKwkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2FkZF90cmVlX2hhcmR3YXJlKTogTW92ZSBoYXJkd2FyZSBkZXZpY2VzCisgCXRvIDB4ODAwMDAwMDAgZnJvbSAweDQwMDAwMC4KKworTW9uIEZlYiAxOSAyMjo1NDo0MCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogcHBjLWluc3RydWN0aW9ucyAoVExCIEludmFsaWRhdGUgRW50cnksIFRMQiBJbnZhbGlkYXRlIEFMTCk6CisgICAgICAgIEltcGxlbWVudCBieSBwYXNzaW5nIG9uIHJlcXVlc3QgdG8gYWxsIHByb2Nlc3NvcnMuCisJKiBwcGMtaW5zdHJ1Y3Rpb25zIChUTEIgU3luY2hyb25pemUpOiBJbXBsZW1lbnQgYXMgZW1wdHksIHByb2Nlc3NvcgorCXRsYidzIGFyZSBhbHdheXMgaW4gc3luYy4KKworCSogY3B1LmMgKGNwdV9wYWdlX3RsYl9pbnZhbGlkYXRlX2FsbCk6IE5ldyBmdW5jdGlvbi4gIFBhc3Mgb24gVExCCisgICAgICAgIGludmFsaWRhdGUgcmVxdWVzdCB0byBwcm9jZXNzb3JzIFZNIHN1Yi1zeXN0ZW0uCisJKiBjcHUuYyAoY3B1X3BhZ2VfdGxiX2ludmFsaWRhdGVfZW50cnkpOiBEaXR0by4KKworCSogdm0uYyAodm1fcGFnZV90bGJfaW52YWxpZGF0ZV9hbGwpOiBOZXcgZnVuY3Rpb24uIE1hcmsgYWxsIHBhZ2UKKyAgICAgICAgVExCIGVudHJpZXMgYXMgaW52YWxpZC4KKwkqIHZtLmMgKHZtX3BhZ2VfdGxiX2ludmFsaWRhdGVfZW50cnkpOiBOZXcgZnVuY3Rpb24uIERpdHQgYnV0IG9ubHkKKwlpbnZhbGlkYXRlIG9uZSBUTEIgZW50cnkuCisKKwkqIHBzaW0uYyAocHNpbV9pbml0KTogSW52YWxpZGF0ZSBUTEIncyBiZWZvcmUgKHJlKXN0YXJ0aW5nLgorCitNb24gRmViIDE5IDIxOjI1OjU2IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBlbXVsX2dlbmVyaWMuYyAoZW11bF9hZGRfdHJlZV9vcHRpb25zKTogQWRkIGFyZ3VtZW50CisgICAgICAgIG9lYV9pbnRlcnJ1cHRfcHJlZml4ICgwIG9yIDEpIHRoYXQgc3BlY2lmaWVzIHRoZSBwcmVmaXggTVNSW0lQXQorICAgICAgICBhbmQgaGVuY2UgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbnRlcnJ1cHQgdmVjdG9ycy4gIEFkZCB0aGlzIHRvIHRoZQorICAgICAgICBkZXZpY2UgdHJlZS4KKworCSogZW11bF9jaGlycC5jIChlbXVsX2NoaXJwX2NyZWF0ZSk6IEFsbG93IGNvbmZpZ3VyYXRpb24gb2YKKyAgICAgICAgZmxvYXRpbmctcG9pbnQgYW5kIGludGVycnVwdCBwcmVmaXggKGRlZmF1bHQgMCkgdXNpbmcgdGhlIGFib3ZlLgorCisJKiBlbXVsX25ldGJzZC5jIChlbXVsX25ldGJzZF9jcmVhdGUpOiBQYXNzIGR1bW15IGFyZyBmb3IKKyAgICAgICAgaW50ZXJydXB0LXByZWZpeC4KKworCSogZW11bF9idWdhcGkuYyAoZW11bF9idWdhcGlfY3JlYXRlKTogQWxsb3cgY29uZmlndXJhdGlvbiBvZgorICAgICAgICBpbnRlcnJ1cHQgcHJlZml4IChkZWZhdWx0IDEpIGFuZCBjb25maWd1cmUgaW50ZXJydXB0IHRhYmxlIHRyYXBzCisgICAgICAgIGFjY29yZGluZ2x5LgorCisJKiBlbXVsX2dlbmVyaWMuYyAoZW11bF9hZGRfdHJlZV9oYXJkd2FyZSk6IEluY2x1ZGUgYSBzbWFsbCBlZXByb20KKyAgICAgICAgaW4gdGhlIGxpc3Qgb2YgZGV2aWNlcy4KKworCSogZGV2aWNlX3RhYmxlLmM6IEZvciBtb21lbnQgZmFrZSBlZXByb20gZGV2aWNlIGJ5IGEgbWVtb3J5CisgICAgICAgIGRldmljZS4gIEluIGZ1dHVyZSB3aWxsIG5lZWQgYSBwcm9wZXIgZWVwcm9tIGRldmljZS4KKworVHVlIEZlYiAyMCAxNzowMToyNiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZy5pbjogUmVnZW5lcmF0ZWQuCisKK0ZyaSBGZWIgMTYgMTA6NDI6MjcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBwc2ltLmM6IEluY2x1ZGUgb3B0aW9ucy5oIHNvIHByaW50X29wdGlvbnMgaXMgZGVjbGFyZWQuCisKK1RodSBGZWIgMTUgMTg6MTA6MTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBlbXVsX25ldGJzZC5jICh0b3BsZXZlbCk6IERvIG5vdCBpbmNsdWRlIHN5cy9yZXNvdXJjZS5oIGlmIHRoZQorCXN5c3RlbSBkb2Vzbid0IGhhdmUgaXQsIGFuZCB0dXJuIG9mZiBnZXRydXNhZ2UgcHJvY2Vzc2luZy4KKwkod3JpdGVfcnVzYWdlKTogI2lmZGVmIG91dCBpZiB3ZSBkb24ndCBoYXZlIGdldHJ1c2FnZS4KKwkoZG9fZ2V0cnVzYWdlKTogRGVmaW5lIGFzIDAgaWYgd2UgZG9uJ3QgaGF2ZSBnZXRydXNhZ2UuCisKK1dlZCBGZWIgMTQgMTc6Mzg6MTIgMTk5NiAgSi4gVC4gQ29ua2xpbiAgPGp0Y0BjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKEFDX0hFQURFUl9ESVJFTlQpOiBBZGQsIHNvIHRoYXQgd2UgY2FuIGZpZ3VyZSBvdXQKKwl3aGVyZSB0aGUgZGlyZWN0b3J5IGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUKKworCSogZW11bF9uZXRic2QuYzogVXNlIHRoZSBtYWNyb3MgZGVmaW5lZCBieSBjb25maWd1cmUgdG8gZmluZCB0aGUKKwlhcHByb3ByaWF0ZSBkaXJlY3RvcnkgZnVuY3Rpb25zLgorCitUaHUgRmViICA4IDAwOjUzOjEzIDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBjb25maWd1cmUuaW4gKHhvcl9lbmRpYW4pOiBUcmFjZSBzZXR0aW5nIG9mIHhvci1lbmRpYW4gZmxhZy4KKworV2VkIEZlYiAgNyAxODoyMDo1NiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogcHNpbS5jIChwc2ltX3VzYWdlKTogRXh0ZW5kIGRvY3VtZW50YXRpb24uCisKKwkqIHBwYy1pbnN0cnVjdGlvbnMgKG1vZGVsLXByaW50KTogZml4IHR5cG8uCisKK1N1biBGZWIgIDQgMjM6NTg6MDIgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGNvbmZpZ3VyZS5pbiAod2l0aC1zbXApOiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gYWxsb3cgdXAgdG8KKwlmaXZlIHByb2Nlc3NvcnMgKGJ1dCBlbmFibGUgb25seSBvbmUpLgorCisJKiBlbXVsX2J1Z2FwaS5jIChlbXVsX2J1Z2FwaV9jcmVhdGUpOiBJZiBmbG9hdGluZy1wb2ludCBpcworCWFsbG93ZWQsIGVuYWJsZSB0aGUgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24gc2V0IGluIHRoZQorCW1zci4KKworVHVlIEphbiAzMCAyMjo1MjozMiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX3NlZWssIGNoaXJwX2VtdWxfcmVhZCwKKyAgICAgICAgY2hpcnBfZW11bF93cml0ZSk6IFRvbGVyYXRlIGludmFsaWQgaWhhbmRsZXMuCisKKwkqIGRldmljZS5jIChkZXZpY2VfaW5zdGFuY2VfY3JlYXRlLCBkZXZpY2VfaW5zdGFuY2VfZGVsZXRlKToKKwlpbml0L2RlbGV0ZSBpbnN0YW5jZSBuYW1lCisKKwkqIGVtdWxfY2hpcnAuYyAoZW11bF9jaGlycF9pbnN0cnVjdGlvbl9jYWxsKTogUmVhZCB0aGUgbnIgYXJncyBhbmQKKyAgICAgICAgcmV0dXJucyB3aGVuIGRldGVybWluaW5nIHRoZSBzZXJ2aWNlLgorCisJKiBlbXVsX2NoaXJwLmMgKGNoaXJwX3JlYWRfdDJoX2FyZ3MpOiBBbGxvdyB2YXJpYWJsZSBudW1iZXIgb2YKKyAgICAgICAgYXJncyBmb3IgdGhlIG1ldGhvZCAiY2FsbC1tZXRob2QiLgorCisJKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfZ2V0cHJvcCk6IFRvbGVyYXRlIGEgbl9yZXR1cm5zIG9mIHplcm8KKyAgICAgICAgLSBzaG91bGQgYmUgb25lLiBTb21lIE9wZW5Cb290IGNvZGUgZG9lc24ndCBwYXNzIGNvcnJlY3QgYXJnLgorCisJKiBlbXVsX2NoaXJwLmMgKGNoaXJwX2VtdWxfZ2V0cHJvcCk6IFRyYWNlIG1vcmUgcHJvcGVydHkgdHlwZXMuCisKK1R1ZSBKYW4gMzAgMTk6MTI6MjkgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIFJVTjogTmV3IGZpbGUuIERlc2NyaWJlIGhvdyB0byBydW4gUFNJTQorCSogSU5TVEFMTDogTmV3IGZpbGUuIERlc2NyaWJlIGhvdyB0byBpbnN0YWxsIFBTSU0KKwkqIFJFQURNRTogTmV3IGZpbGUuIE92ZXJ2aWV3IFBTSU0uCisJKiBCVUdTOiBOZXcgZmlsZS4gQnJpZWZseSBkaXNjdXNzIGJ1Z3MgYW5kIGxpbWl0YXRpb25zCisJCitXZWQgSmFuIDI0IDIwOjI4OjA4IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBlbXVsX2J1Z2FwaS5jIChPRUFfU1RBUlRfQUREUkVTUyk6IFB1dCBpdCBiYWNrIHRvIDB4MTAwMDAwLAorICAgICAgICB3YXNuJ3QgY29ycmVjdGx5IHVzaW5nIEdMRC4KKworTW9uIEphbiAyMiAyMjo0NDoxMyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogZW11bF9nZW5lcmljLmMgKGVtdWxfYWRkX3RyZWVfb3B0aW9ucyk6IE1ha2UgZGVmYXVsdCBudW1iZXIgb2YKKwlhY3RpdmUgcHJvY2Vzc29ycyAxIChldmVuIHdoZW4gU01QIGVuYWJsZWQpLgorCitNb24gSmFuIDIyIDIyOjM3OjM0IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBkZXZpY2VfdGFibGUuYyAoaWN1X2lvX3JlYWRfYnVmZmVyX2NhbGxiYWNrKTogQWRkIGV4dHJhIHJlZ2lzdGVyCisgICAgICAgIChhdCBhZGRyICsgNCkgdGhhdCByZXR1cm5zIG51bWJlciBvZiBwcm9jZXNzb3JzLgorCisJKiBlbXVsX2dlbmVyaWMuYyAoZW11bF9hZGRfdHJlZV9oYXJkd2FyZSk6IFVwZGF0ZSBkZXZpY2Ugbm9kZSB0bworICAgICAgICBtYXRjaC4KKworTW9uIEphbiAyMiAyMjowMDo0MiAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogZW11bF9idWdhcGkuYyAoT0VBX1NUQVJUX0FERFJFU1MpOiBDaGFuZ2UgdG8gMHg0MDAwIHNvIHRoYXQgaXQKKyAgICAgICAgbWF0Y2hlcyBnYXMtOTYwMTE2L2xkLgorCitGcmkgSmFuIDE5IDAwOjMyOjI3IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBwc2ltLTk2MDExOSByZWxlYXNlZCAtIHBzaW0tMS4wYjAxLgorCitGcmkgSmFuIDE5IDAwOjMyOjI3IDE5OTYgIEFuZHJldyBDYWduZXkgLSBha2EgTm9pZCAgPGNhZ25leUBoaWdobGFuZC5hdS5jb20+CisKKwkqIHBzaW0uYyAocHNpbV9jcmVhdGUpOiBSZS1vcmRlciBzbyB0aGF0IGFsbCBvcHRpb25zIGFyZSBzZXQKKyAgICAgICAgYmVmb3JlIHRoZSBDUFUncyBhcmUgY3JlYXRlZC4gIFdhcyBicmVha2luZyBtb25fY3JlYXRlKCk7CisKKwkqIHBzaW0uYyAocHNpbV9jcmVhdGUpOiBUaWR5IHVwIGNvbmZsaWN0aW5nIGNvbmZpZ3VyYXRpb24gZXJyb3JzLgorCisJKiBkZWJ1Zy5jOiBBZGQgbWlzc2luZyBwcmludC1pbmZvIGVudHJ5IHRvIHRyYWNlIHRhYmxlLgorCisJKiBvc19lbXVsLmMgKG9zX2VtdWxfY3JlYXRlKTogRml4IGAtZScgb3B0aW9uLiBXYXMgbG9va2luZyB1bmRlcgorICAgICAgICB3cm9uZyBuYW1lLgorCisJKiBwc2ltLmMgKHBzaW1fb3B0aW9ucyk6IEZpeCBgLXInIG9wdGlvbi4gV2FzIGVudGVyaW5nIHVuZGVyIHdyb25nCisgICAgICAgIG5hbWUuCisKK1RodSBKYW4gMTggMjA6MzM6NDggMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIHZtLmMgKG9tX3VucGFja19iYXRzKTogRml4IGNoZWNraW5nIG9mIGJhdCBiaXRzLgorCisJKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfY3JlYXRlKTogU3RvcmUgYWRkcmVzcyBvZiBPQiBpbiBtZW1vcnkKKyAJaW4gdGhlIG9zX2VtdWxfZGF0YSBzdHJ1Y3R1cmUuCisKKwkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2NyZWF0ZSk6IFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZQorIAlidWdhcGkgY29kZSAoaW4gbWFpbiBtZW1vcnkpIGluIHRoZSBvc19lbXVsX2RhdGEgc3RydWN0dXJlLgorCitUaHUgSmFuIDE4IDAxOjE0OjU1IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiB2bS5jIChvbV90cmFuc2xhdGVfZWZmZWN0aXZlX3RvX3JlYWwpOiBGaXggdHJhY2Ugb3V0cHV0LgorCitXZWQgSmFuIDE3IDIyOjIxOjU1IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBkZXZpY2VfdGFibGUuYyAoZ2VuZXJpY19kZXZpY2VfaW5pdF9hZGRyZXNzKTogQ3JlYXRlIG1lbW9yeSBmcm9tCisgICAgICAgIGluZm9ybWF0aW9uIG9idGFpbmVkIGZyb20gYHJlZycgcHJvcGVydHkuCisJKiBkZXZpY2VfdGFibGUuYyAodm1faW5pdF9hZGRyZXNzX2NhbGxiYWNrKTogVXNlIGluZm9ybWF0aW9uCisgICAgICAgIG9idGFpbmVkIGZyb20gcHJvcGVydGllcy4KKwkqIGVtdWxfbmV0YnNkLmMgKGVtdWxfbmV0YnNkX2NyZWF0ZSk6IFVwZGF0ZSB0byBjcmVhdGUgZGV2aWNlIGFuZAorICAgICAgICBwcm9wZXJ0eSBlbnRyaWVzIHRvIG1hdGNoCisKK1R1ZSBKYW4gMTYgMDk6NTA6NTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBpZGVjb2RlX2V4cHJlc3Npb24uaCAoQUxVX0VORCk6IEFkZCBJVFJBQ0Ugb2YgdGhlIHJlc3VsdC4KKworCSogcHBjLWluc3RydWN0aW9ucyAoRXF1aXZhbGVudCk6IEVuYWJsZSB0aGlzIGluc3RydWN0aW9uLgorCShBZGQgdG8gTWludXMgT25lIEV4dGVuZGVkKTogRGl0dG8uCisJKFN1YnRyYWN0IGZyb20gTWludXMgT25lIEV4dGVuZGVkKTogRGl0dG8uCisJKEFkZC9BbmQvT3IvWG9yIEltbWVkaWF0ZSk6IEFkZCBhbHUgdHJhY2Ugb2YgcmVzdWx0LgorCShBZGQvQW5kL09yL1hvciBTaGlmdGVkIEltbWVkaWF0ZSk6IERpdHRvLgorCShBbmQvT3IvRXF1aXZhbGVudC9OYW5kL05vcik6IERpdHRvLgorCShBbmQvT3Igd2l0aCBDb21wbGVtZW50KTogRGl0dG8uCisJKEV4dGVuZCBTaWduIEJ5dGUvSGFsZiBXb3JkKTogRGl0dG8uCisJKENvdW50IExlYWRpbmcgWmVyb3MpOiBEaXR0by4KKwkoU2hpZnQgUmlnaHQgQWxnZXJicmFpYyBXb3JkKTogRGl0dG8uCisJKFNoaWZ0IFJpZ2h0IEFsZ2VyYnJhaWMgV29yZCBJbW1lZGlhdGUpOiBEaXR0by4KKworVHVlIEphbiAgOSAxNToxMDoyNyAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogZW11bF9idWdhcGkuYyAoZW11bF9idWdhcGlfaW5zdHJ1Y3Rpb25fY2FsbCkgOiBNYWtlIGZvcm1hdCB0eXBlCisgCWNvcnJlY3QuCisJKiBlbXVsX2NoaXJwLmMgKG1hcF9vdmVyX2NoaXJwX25vdGUpIDogRGl0dG8KKwkqIGVtdWxfY2hpcnAuYyAoY2hpcnBfZW11bF90ZXN0KSA6IERpdHRvCisJKiBkZXZpY2VfdGFibGUuYyAocmVnaXN0ZXJfaW5pdCk6IERpdHRvCisKK1R1ZSBKYW4gIDkgMTQ6MTY6MjYgMTk5NiAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGNvbmZpZ3VyZS5pbjogTWFrZSBkaXNhYmxlLXNpbS1zd2l0Y2ggZGVmYXVsdC4gIFN3aXRjaCBvbmx5CisgCXVzZWZ1bCBpZiB1c2luZyAtLWVuYWJsZS1zaW0tb3Bjb2RlPXBwYy1vcGNvZGUtc3R1cGlkIGFuZCB0aGVuCisgCW9ubHkgbWFyZ2luYWxseSBzby4KKworTW9uIEphbiAgOCAxMjoxNzoyMiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGRldmljZV90YWJsZS5jIChyZWdpc3Rlcl9pbml0KTogTWFrZSBmb3JtYXQgdHlwZSBjb3JyZWN0LgorCitXZWQgSmFuICAzIDE5OjIxOjQ2IDE5OTYgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBlbXVsX2J1Z2FwaS5jIChlbXVsX2J1Z2FwaV9jcmVhdGUpOiBBZGQgbm9kZXMgdG8gaW5pdCB0aGUKKyAJc3lzdGVtLWNhbGwgdHJhcCB0byB0aGUgZW11bCBpbnN0cnVjdGlvbiBjYWxsIGluc3RydWN0aW9uIChBbG9uZworIAl3aXRoIGFuIHJmaSBhbmQgaW5maW5hdGUgbG9vcCkuCisKKwkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2luc3RydWN0aW9uX2NhbGwpOiBFeHBhbmQgdG8gaW5jbHVkZQorIAlhIGZldyByZWFsIFBQQyBidWcgY2FsbHMuICBUZXN0IHdpdGggc2ltcGxlIGhlbGxvIHdvcmxkLgorCitUdWUgSmFuICAyIDIwOjUxOjE5IDE5OTYgIEFuZHJldyBDYWduZXkgLSBha2EgTm9pZCAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGRldmljZS5oLCBkZXZpY2UuYyAoZGV2aWNlX2NoaWxkLCBkZXZpY2Vfc2libGluZyk6IE5ldworICAgICAgICBmdW5jdGlvbnMuICBSZXR1cm4gY29ycmVzcG9uZGluZyBkZXZpY2UgdmFsdWUuCisKKwkqIGVtdWxfY2hpcnAuYyAoY2hpcnBfZW11bF9jaGlsZCwgY2hpcnBfZW11bF9wZWVyLAorICAgICAgICBjaGlycF9lbXVsX3BhcmVudCk6IE5ldyBmdW5jdGlvbnMgLSBlbXVsYXRlIGNvcnJlc3BvbmRpbmcgT3BlbkJvb3QKKyAgICAgICAgaW50ZXJmYWNlcy4KKworCSogZGV2aWNlX3RhYmxlLmMgKHJlZ2lzdGVyX2luaXQpOiBFeHRlbmQgcHJvcGVydGllcyBhdHRhY2hlZCB0bworICAgICAgICByZWdpc3RlciBpbml0IG5vZGUgdG8gYWxsb3cgYSBzcGVjaWZpYyBwcm9jZXNzb3IncyByZWdpc3RlciB0byBiZQorICAgICAgICBzcGVjaWZpZWQuCisKKwkqIGVtdWxfY2hpcnAuYyAoZW11bF9jaGlycF9jcmVhdGUpOiBJbml0IFNNUCBjb3JyZWN0bHkgLSB0aGUKKyAgICAgICAgaW5pdGlhbCBQQyBmb3IgYWxsIHByb2Nlc3NvcnMgaXMgYW4gaW5maW5hdGUgbG9vcCBidXQgdGhlbiwgZm9yCisgICAgICAgIHByb2Nlc3NvciB6ZXJvLCBpcyBxdWlja2x5IGNoYW5nZWQgdG8gYmUgdGhlIGNvcnJlY3QgY29kZSBzdGFydGluZworICAgICAgICBhZGRyZXNzLgorCisJKiBlbXVsX2NoaXJwLmMgKGVtdWxfY2hpcnBfY3JlYXRlKTogQWRkIGZha2UgYm9vdHBhdGgKKyAgICAgICAgZXQuYWwuIHByb3BlcnRpZXMgdG8gdHJlZS4KKworCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX2dldHByb3BsZW4pOiBOZXcgZnVuY3Rpb24uICBFbXVsYXRlIHRoZQorICAgICAgICBnZXRwcm9wbGVuIE9wZW5Cb290IGNhbGwuCisKKwkqIGVtdWxfY2hpcnAuYyAoZW11bF9jaGlycF9pbnN0cnVjdGlvbl9jYWxsKTogRG9jdW1lbnQgb3RoZXIKKyAgICAgICAgcG9zc2libGUgY2hpcnAgZW11bGF0aW9uIGludGVybmFsIHN0YXRlcy4KKworCSogZW11bF9jaGlycC5jIChlbXVsX2NoaXJwX2luc3RydWN0aW9uX2NhbGwpOiBUcmFjZSBmYWlsZWQgbG9va3VwcworIAlhcyB3ZWxsIGFzIHN1Y2Nlc3NmdWwgb25lcy4KKwkKKwkqIGVtdWxfY2hpcnAuYyAoZW11bF9jaGlycF9vcGVuKTogTmV3IGZ1bmN0aW9uIC0gaGFuZGxlIG9wZW4KKyAgICAgICAgY2xpZW50IGNhbGwuCisKKwkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogUHJvcGVyIHJ1bGUgdGhhdCBlbGltaW5hdGVzIG1vcmUKKyAgICAgICAganVuay4KKworVHVlIERlYyAxOSAxMzowMDoxMSAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogZW11bF9jaGlycC5jIChjaGlycF9lbXVsX2V4aXQpOiBGdWxsIG91dCBjYWxsLgorCisJKiBkZXZpY2VfdGFibGUuYyAoaHRhYl9tYXBfcGFnZSk6IFdhc24ndCBoYW5kbGluZyBieXRlIHN3YXAgd2hlbgorCWNyZWF0aW5nIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUuCisKKwkqIGRldmljZS5jIChkZXZpY2VfdHJlZV9maW5kX25vZGUpOiBBbGxvdyBwcmltYXRpdmUgd2lsZC1jYXJkIG1hdGNoCisgCW9mIGRldmljZSBuYW1lcyB3aXRoIHRoZSBwYXRoLgorCisJRklYTUU6IEFzIG1lbnRpb25lZCBlYXJsaWVyLCB0aGUgZGV2aWNlIHN0dWZmIG5lZWRzIHdvcmsgdG8gYnJpbmcKKyAJaXQgaW50byBsaW5lIHdpdGggT3BlbkJvb3QuICBQYXJ0IG9mIHRoaXMgd29yayBpcyByZXdyaXRpbmcgdGhlCisJZmluZF9ub2RlIGZ1bmN0aW9uIHNvIHRoYXQgaXQgYmVoYXZlcyBhcyBzcGVjaWZpZWQgaW4gcDEyNzUuCisKK01vbiBEZWMgMTggMTk6NTg6NTYgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGVtdWxfY2hycC5jIChjaGlycF9lbXVsX3dyaXRlLCBjaGlycF9lbXVsX2ZpbmRkZXZpY2UpOiBhZGQKKyAJYmV0dGVyIHRyYWNpbmcuCisKKwkqIGVtdWxfY2hycC5jOiBDaGFuZ2UgcmV0dXJuIHR5cGUgb2YgZW11bCBmdW5jdGlvbnMgdG8gaW50LiAgRW11bAorIAlmdW5jdGlvbnMgZWl0aGVyIHJldHVybiAtMSBvciB6ZXJvIHNvIHVuc2lnbmVkIHdhcyBhIGJpdAorIAlkYW5nZXJvdXMuCisJCisJKiBpbmxpbmUuaCAoKiksIGlnZW4uYywgZGdlbi5jLCAqOiBVcGRhdGUgSU5MSU5FIG1hY3JvcyBzbyB0aGF0CisgICAgICAgIHRoZXkgYXJlIHBhcmFtYXRlcmlzZWQgd2l0aCB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24uICBHZXRzIGFyb3VuZAorICAgICAgICB0aGUgcHJvYmxlbSBvZiBgc3RhdGljJyBuZWVkaW5nIHRvIGNvbWUgZmlyc3Qgd2l0aCBgYXR0cmlidXRlJworICAgICAgICBjb21taW5nIGxhc3QuICBGb3JtYXQgZGVjbGFyYXRpb25zIGFuZCBkZWZpbml0aW9ucyBzbyB0aGF0IGVtYWNzCisJZG9lc24ndCBnZXQgY29uZnVzZWQuCisKK0ZyaSBEZWMgMTUgMTc6MDY6NDQgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIHN0ZC1jb25maWcuaCAoUFNJTV9JTkxJTkUpOiBBZGQgbWlzc2luZyBpbmxpbmUgY29uZmlndXJhdGlvbgorIAljb250cm9sIGZvciB0aGUgbWFpbiBsb29wLgorCisJKiBtb24uYyAobW9uX3ByaW50X2luZm8pOiBJZiBtb25pdG9yaW5nIGRpc2FibGVkIHN0aWxsIHByaW50IG91dAorIAl0aGUgbnVtYmVyIHNlY29uZHMgdXNlZC4KKworCSogcHNpbS5jIChydW5fdW50aWxfc3RvcCk6IERvbid0IG1vbml0b3IgdGhlIGNhY2hlIG1pc3NlcyB3aGVuCisgCW1vbml0b3JpbmcgaXMgZGlzYWJsZWQuCisKKwkqIGNvbmZpZ3VyZS5pbiAoc2ltX21vbiwgc2ltX21vbml0b3IpOiBDb3JyZWN0IHR5cG8gLSBzaW1fbW9uIC0+CisgCXNpbV9tb25pdG9yIGZvciBzaGVsbCB2YXJpYWJsZSAob3Igc2hvdWxkIHRoYXQgaGF2ZSBiZWVuIHRoZSBvdGhlcgorIAl3YXkgYXJvdW5kPykuCisKKwkqIHZtLmMgKHZtX3N5bmNocm9uaXplX2NvbnRleHQpOiBGaXggd3JvbmcgdGVzdCBmb3IgdW5zdXBvcnRlZAorIAljaGFuZ2UgaW4gZW5kaWFuLW1vZGUuCisJCisJKiBzdGQtY29uZmlnLmggKFdJVEhfUkVHUEFSTSksIGlubGluZS5oIChJREVDT0RFX0lOTElORSwKKwlTRU1BTlRJQ1NfSU5MSU5FKTogQWRkIC1EV0lUSF9SRUdQQVJNPTxuPiBvcHRpb24uICBFbmFibGVzIHRoZQorCV9fYXR0cmlidXRlX18oKF9fcmVncGFybShXSVRIX1JFR1BBUk0pKSkgZm9yIHNvbWUgZnVuY3Rpb25zLgorCWNvbmZpZ3VyZSB3aXRoIC0tZW5hYmxlLXNpbS1jZmxhZ3M9Ii1EV0lUSF9SRUdQQVJBTT0zIiAoc2F5KS4KKwlVbmZvcnR1bmF0bHkgaXQgdGlja2xlcyBhIGJ1ZyAoZ2NjPykgYW5kIGNhbid0IGJlIHVzZWQuCisKK01vbiBEZWMgMTggMTM6MzY6MDYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBkZXZpY2UuYyAoZGV2aWNlX3RyZWVfYWRkX2RldmljZSk6IE1ha2UgdHJhY2UgZnByaW50ZiBhcmd1bWVudHMKKwl0eXBlIGNvcnJlY3QuCisJKiBkZXZpY2VfdGFibGUuYyAoaHRhYl9kZWNvZGVfaGFzaF90YWJsZSk6IERpdHRvLgorCShodGFiX21hcF9iaW5hcnkpOiBEaXR0by4KKwkoaHRhYl9pbml0X2NhbGxiYWNrKTogRGl0dG8uCisJKiB2bS5jIChvbV92aXJ0dWFsX3RvX3JlYWwpOiBEaXR0by4KKworU2F0IERlYyAxNiAwOTo1NDoxOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgorCisJKiBlbXVsX25ldGJzZC5jIChlbXVsX25ldGJzZF9jcmVhdGUpOiBEZWFsIHdpdGggbmV3IEJGRCB0aGF0CisJY2hhbmdlZCBob3cgYmlnL2xpdHRsZSBlbmRpYW4gc3VwcG9ydCBpcyByZWNvcmRlZCwgd2hpbGUgcmVtYWluaW5nCisJY29tcGF0aWJsZSB3aXRoIHRoZSBvbGQgQkZEIHdpdGggI2lmZGVmcy4KKwkqIGVtdWxfY2hpcnAuYyAoZW11bF9jaGlycF9jcmVhdGUpOiBEaXR0by4KKwkqIGVtdWxfYnVnYXBpLmMgKGVtdWxfYnVnYXBpX2NyZWF0ZSk6IERpdHRvLgorCitGcmkgRGVjIDE1IDE1OjU1OjU2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogc3RkLWNvbmZpZy5oIChNT0RFTF9JTkxJTkUpOiBUdXJuIG9mZiBJTkxJTkVfTU9EVUxFIGJ5IGRlZmF1bHQuCisKKwkqIGNvcmVmaWxlLmg6IERlbGV0ZSBkZWNsYXJhdGlvbnMgZm9yIHVua25vd24gZnVuY3Rpb25zLgorCSogZGV2aWNlLmg6IERpdHRvLgorCSogaW50ZXJydXB0cy5oOiBEaXR0by4KKwkqIGludGVycnVwdHMuYzogRGl0dG8uCisKK1RodSBEZWMgMTQgMTg6NDk6MzQgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGxmLmMgKGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUpOiBOZXcgZnVuY3Rpb24uICBNdW5nZXMgYSBmdW5jdGlvbgorIAl0eXBlIHNvIHRoYXQgdGhlIHByZWZpeCAoZWcgSU5MSU5FLi4uKSBpcyBpbnNlcnRlZCBhZnRlciB0aGUgdHlwZQorIAlidXQgYmVmb3JlIGFueSBgKicuCisKKwkqIGlnZW4uYzogQ2hhbmdlIHRvIG91dHB1dCBmdW5jdGlvbnMgdXNpbmcgdGhpcy4KKworV2VkIERlYyAxMyAyMzo0NzowMCAxOTk1ICBBbmRyZXcgQ2FnbmV5ICAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwlGSVhNRTogRW11bCBDSElSUCBkb2VzIG5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZSBmaW5kIGRldmljZQorIAlmdW5jdGlvbi4KKworCUZJWE1FOiBFbXVsIENISVJQIGFuZCBkZXZpY2UgZG8gbm90IGltcGxlbWVudCBkZXZpY2UgaW5zdGFuY2UKKyAJb3BlcmF0aW9ucy4KKworV2VkIERlYyAxMyAyMzo0NzowMCAxOTk1ICBBbmRyZXcgQ2FnbmV5ICAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIG9wdGlvbnMuYyAob3B0aW9uc19pbmxpbmUpOiBGdW5jdGlvbiB0byBvdXRwdXQgbWVhbmluZ2Z1bAorICAgICAgICBkZXNjcmlwdGlvbiBvZiB0aGUgSU5MSU5FIG9wdGlvbnMuCisKKwkqIGNvbmZpZ3VyZS5pbiAoaW5saW5lKTogUmVwbGFjZSBpbmxpbmUgbWFnaWMgbnVtYmVycyB3aXRoIG1hY3JvCisgICAgICAgIG5hbWVzLiBNYXAgMS0+TE9DQUxTX0lOTElORSBhbmQgMi0+QUxMX0lOTElORS4KKworCSogaW5saW5lLmgsIGlubGluZS5jOiB1cGRhdGUgdG8gdXNlIGlubGluZSBtZXRob2QuCisKKwkqIHN0ZC1jb25maWcuaCAoQ1BVX0lOTElORSksIGNwdS5oLCBpbmxpbmUuaCwgaW5saW5lLmM6IG1ha2UgY3B1LmgKKyAgICAgICAgaW5saW5lIGFsd2F5cy4KKworCSogc3RkLWNvbmZpZy5oIChFVkVOVFNfSU5MSU5FKTogSW5saW5lIGV2ZW50cyBpbiBwc2ltLgorCitXZWQgRGVjIDEzIDIyOjAxOjIxIDE5OTUgIEFuZHJldyBDYWduZXkgICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGV2aWNlX3RhYmxlLmMgKGh0YWJfc3VtX2JpbmFyeSk6IERNQSBiaW5hcmllcyB0byBjb3JyZWN0IGJ5dGUKKyAgICAgICAgd2l0aGluIGEgcGFnZS4KKworVHVlIERlYyAxMiAyMjo1MToxOCAxOTk1ICBBbmRyZXcgQ2FnbmV5ICAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIHBzaW0uYyAocHNpbV9tZXJnZV9kZXZpY2VfZmlsZSk6IENoYW5nZSBgPScgdG8gYD09Jywgd2FzIHRoaXMgYW4KKyAgICAgICAgZXJyb3I/CisKK1R1ZSBEZWMgIDUgMTE6NTY6MTQgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIHBwYy1pbnN0cnVjdGlvbnMgKHBwY19ucl9tdGNyZl9jcnMsIHBwY19icmFuY2hfY29uZGl0aW9uYWxfbmFtZSwKKyAJcHBjX2Z1bmN0aW9uX3VuaXRfbmFtZSk6IFNpbXBsaWZ5IGJ5IGRlY2xhcmluZyB0aGVzZSBhcnJheXMgYXMKKyAJcHVyZSBhbmQgc2ltcGxlIHN0YXRpYyAoaW5zdGVhZCBvZiBTVEFUSUNfTU9ERUwpLgorCitUdWUgRGVjICA1IDAwOjQ1OjM0IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBzaW1fY2FsbHMuYyAoc2ltX2NyZWF0ZSwgc2ltX2xvYWQpLCBtYWluLmMgKG1haW4pLCBwc2ltLmM6IFBhc3MKKyAgICAgICAgYW4gb3B0aW9ucyBkZXZpY2UgaW50byBwc2ltX2NyZWF0ZSgpIHNvIHRoYXQgb3B0aW9ucyBjYW4gYmUgbWVyZ2VkCisgICAgICAgIGludG8gdGhlIHRyZWUuCisKKwkqIGRldmljZS5jICgqYWRkKik6IENoYW5nZSBzZW1hbnRpY3Mgc28gdGhlIGFkZCBmdW5jdGlvbnMgb25seSBhZGQKKyAgICAgICAgd2hlbiB0aGUgbmV3IGRldmljZSAob3IgcHJvcGVydHkpIGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4gIFRoaXMKKyAgICAgICAgYWxsb3dzIG1lcmdpbmcgb2Ygb3B0aW9ucyBhbmQgZGF0YS4KKworTW9uIERlYyAgNCAxNzoxMjoxMyAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogTWFrZWZpbGUuaW4gKEJBU0lDU19IKTogRGlkbid0IGluY2x1ZGUgYmFzaWNzLmggaW4gdGhlIGxpc3Qgb2YKKyAgICAgICAgaGVhZGVyIGZpbGVzIHRvIGRlcGVuZCBvbi4KKworTW9uIERlYyAgNCAxNzoxMjoxMyAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogc3RkLWNvbmZpZy5oOiAoKl9NT0RVTEUpOiBFeHRlbmQgdGhlIDxtb2R1bGU+X2lubGluZSBtYWNybydzIHNvCisgICAgICAgIHRoYXQgdGhleSBhbHNvIGFsbG93IGNvbnRyb2wgb3ZlciBzdGF0aWMgZnVuY3Rpb25zLiAgUmV3cml0ZQorICAgICAgICBkb2N1bWVudCB0byByZWZsZWN0IHRoaXMuCisKKwkqIHN0ZC1jb25maWcuaDogKElOTElORSk6IFNpbXBsaWZ5IGRlZmluaXRpb24sIHRoZSBhYm92ZSBhbmQKKyAgICAgICAgZWFybGllciBjaGFuZ2VzIHRvIGlnZW4uaCBlbGltaW5hdGUgdGhlIG5lZWQgdG8gYmUgZGVmZW5zaXZlIGFib3V0CisgICAgICAgIGVuYWJsaW5nIHRoZSBpbmxpbmUgb2Ygc3RhdGljIGZ1bmN0aW9ucy4KKworCSogc3RkLWNvbmZpZy5oOiAoU0lNX0VORElBTl9JTkxJTkUsIEJJVFNfSU5MSU5FKTogRG9jdW1lbnQgbGltaXRlZAorICAgICAgICBzdXBvcnQgZm9yIGlubGluZWluZyBvZiBtb2R1bGVzIGZvciBhbGwgY2FsbGVycy4gIEFkanVzdCByZWxldmFudAorICAgICAgICBtYWNybydzIHNvIHRoYXQgREVGQVVMVF9JTkxJTkUgd2lsbCBlbmFibGUgdGhpcy4KKworCSogYmFzaWNzLmg6IFJlLW9yZGVyICNpbmNsdWRlcyBhbmQgZGVmaW5pdGlvbnMgc28gdGhhdCBjLWNvZGUgZm9yCisgICAgICAgIGJhc2ljIGluY2x1ZGUgZmlsZXMgZG9lcyBub3QgY2FsbCBmdW5jdGlvbnMgZGVsY2FyZWQgaW4gbGF0ZXIKKyAgICAgICAgI2luY2x1ZGVzLgorCisJKiBiYXNpY3MuaCAoX19hdHRyaWJ1dGVfXyksIHNpbV9jYWxsYmFja3MuaDogTW92ZSBhdHRyaWJ1dGUgbWFjcm8KKyAgICAgICAgdG8gYmFzaWNzLmggYW5kIGFkZCBoYWNrIChpbmNsdWRlIDxzdGRpby5oPikgdG8gdHJ5IGFuZCBicmluZyB0aGF0CisgICAgICAgIGFuZCBvdGhlciBwb3NzaWJsZSBjb25mbGljdGluZyBtYWNyb3MgaW50byBzY29wZSBtdWNoIGVhcmxlci4KKworCSogc2ltLWVuZGlhbi5oLGMgKFNJTV9FTkRJQU5fSU5MSU5FKSBiaXRzLmgsYyAoQklUU19JTkxJTkUpOgorICAgICAgICBDaGFuZ2UgdG8gdXNlIHRoZSB1cGRhdGVkIGlubGluZSBkZWZpbml0aW9ucy4gIElmIGVuYWJsZWQKKyAgICAgICAgaW1tZWRpYXRseSBpbmNsdWRlIHRoZSBjb3JyZXNwb25kaW5nIGMtY29kZSBzbyB0aGF0IGl0IHdpbGwgaW5saW5lCisgICAgICAgIGZvciBhbGwgbW9kdWxlcy4KKworCSogaW5saW5lLmgsIGlubGluZS5jIChTSU1fRU5ESUFOX0lOTElORSwgQklUU19JTkxJTkUpOiBSZW1vdmUKKyAgICAgICAgdGhlc2UgY2FzZXMsIG1vdmVkIHRvIG1vZHVsZSBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCisKK1NhdCBEZWMgIDIgMTg6Mzc6NTEgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIHZtLmMsIHZtX24uYzogRml4IGh0YWIgY29kZS4KKworCSogdm0uYyAodm1fZGF0YV9tYXBfcmVhZF9idWZmZXIpOiBXYXMgdXNpbmcgRUEgbm90IFJBIHdoZW4gcmVhZGluZworICAgICAgICB0aGUgZGF0YSBmcm9tIGNvcmUuCisKKwkqIGRldmljZS5jOiBGaXggaHRhYiBjcmVhdGUgY29kZS4KKworRnJpIE5vdiAyNCAyMzoxMDowOSAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogYml0cy5oLCBiaXRzLmMgKEVYVFJBQ1RFRCk6IENvbnZlcnQgdG8gZnVuY3Rpb24sIGZpeCAtIGhhZCAmJgorICAgICAgICBpbnN0ZWFkIG9mICYuCisKKwkqIHNpbS1lbmRpYW4uaCAoU1dBUF9OKSwgc2ltLWVuZGlhbi1uLmgsIHNpbS1lbmRpYW4uYzogSG93CisgICAgICAgIGVtYmFyYXNpbmcgLSBmaXggeWV0IGFub3RoZXIgYnVnIGluIHRoZSBzd2FwIGNvZGUhICBTaW1wbGlmeQorICAgICAgICBldmVyeXRoaW5nIGJ5IHVzaW5nIG1vcmUgZnVuY3Rpb25zLiBBZGQgaG9zdCB0byBiaWctZW5kaWFuIGJ5dGUKKyAgICAgICAgc3dhcHBpbmcgc3VwcG9ydC4KKworRnJpIE5vdiAyNCAyMzoxMDowOSAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGV2aWNlcy5oLCBkZXZpY2VzLmM6IGRlbGV0ZSwgcmVwbGFjZWQgYnkgdGhlIGZpbGVzCisgICAgICAgIGRldmljZV90YWJsZS5bY2hdIGFuZCBkZXZpY2UuW2NoXS4KKwkqIGRldmljZV90cmVlLmgsIGRldmljZV90cmVlLmM6IGRpdHRvCisKKwkqIGRldmljZV90YWJsZS5oLCBkZXZpY2VfdGFibGUuYzogTmV3IGZpbGVzLiAgQ29udGFpbiBhIHRhYmxlIG9mCisgICAgICAgIGRldmljZXMuCisKKwkqIGRldmljZS5oLCBkZXZpY2UuYywgTWFrZWZpbGUuaW4sIHN0ZC1jb25maWcuaCAoREVWSUNFX0lOTElORSksCisgICAgICAgIG9wdGlvbnMuYyAocHJpbnRfb3B0aW9ucyk6IE5ldyBmaWxlcy4gIERlZmluZSB0aGUgZGV2aWNlIG9iamVjdAorICAgICAgICBhbG9uZyB3aXRoIGFueSBhdHRhY2hlZCBwcm9wZXJ0aWVzLgorCisJKiBkZXZpY2VfdHJlZS5oLCBkZXZpY2VfdHJlZS5jOiBVcGRhdGUgdG8gdXNlIG5ldyBkZXZpY2Ugb2JqZWN0LgorICAgICAgICBGb3IgY29udmVuaWVuY2UsIGNoYW5nZSB0aGUgcHJpbnRkIGZ1bmN0aW9ucyBpbnRvIGRldmljZV90cmVlX2FkZAorICAgICAgICBmdW5jdGlvbnMuCisKKwkqIHBzaW0uYyAoY3JlYXRlXypfdHJlZSk6IFVzZSBuZXcgZGV2aWNlX3RyZWUgY3JlYXRlIGZ1bmN0aW9ucy4KKworCSogY29yZWZpbGUuaCwgY29yZWZpbGUuYyBjb3JlZmlsZS1uLmggKGNvcmVfbi5oKTogVXBkYXRlIHRvIHVzZQorICAgICAgICB0aGUgbmV3IGRldmljZS5oIC8gZGV2aWNlX3RhYmxlLmggaW50ZXJmYWNlLiAgUmVuYW1lIGNvcmVfbi5oIHRvCisgICAgICAgIGNvcmVmaWxlLW4uaCB0byBiZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgbiBmaWxlcy4KKworCSogTWFrZWZpbGUuaW4gKHJ1bik6IGFkZCBjb3JlZmlsZS1uLmggdG8gZGVwZW5kZW5jaWVzIGZvcgorICAgICAgICBjb3JlZmlsZS4KKworCSogYmFzaWNzLmggKGRldmljZV9pbnN0YW5jZSksIGRldmljZS5oLCBkZXZpY2UuYywgZGV2aWNlX3RhYmxlLmgsCisgICAgICAgIGRldmljZV90YWJsZS5jOiBBZGQgdGhlIGNvbmNlcHQgb2YgYSBkZXZpY2UgaW5zdGFuY2UgYW5kIG9wZXJhdG9ycworICAgICAgICBvbiB0aGVzZSBpbnN0YW5jZXMgLSBjb3JyZXNwb25kcyB0byBpaGFuZGxlIGluIE9wZW5Cb290IHNwZWFrLgorICAgICAgICBEb24ndCB5ZXQgaW1wbGVtZW50IGl0LgorCitUdWUgTm92IDE0IDEyOjI3OjA4IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBlbXVsX2dlbmVyaWMuaCwgZW11bF9nZW5lcmljLmMgKGVtdWxfc3lzY2FsbF9lbnRlciwKKyAJZW11bF9zeXNjYWxsX2V4aXQpOiByZW5hbWUgZnJvbSBlbXVsX2VudGVyX2NhbGwgLworIAllbXVsX2V4aXRfY2FsbC4gQXMgb25seSB1c2VkIGJ5IGVtdWxfZG9fc3lzdGVtX2NhbGwgc2ltcGxpZnkKKyAJYXNzb2NpYXRlZCBjb2RlLgorCisJKiBvc19lbXVsLmgsIG9zX2VtdWwuYywgZW11bF9nZW5lcmljLmg6IENvcnJlY3QgYW5kIGZpbGwgYW4KKyAJb3NfZW11bCBpbnRlcmZhY2UuCisKKwkqIG9zX2VtdWwuYywgZW11bF9idWdhcGkuaCwgZW11bF9idWdhcGkuYywgTWFrZWZpbGUuaW46IEFkZAorIAlwcmVsaW1pbmFyeSBob29rcyBmb3IgYSBrZXJuZWwgbW9kZSByb20gZW11bGF0aW9uLgorCQorCSogY2FwLmggKG5ldyksIGNhcC5jIChuZXcpOiBDYXBhYmlsaXR5IGRhdGEgYmFzZS4gIFNvbWUgZW11bGF0aW9ucworIAlwYXNzIG9iamVjdCBpZGVudGlmaWVycyAoY2FwYWJpbGl0aWVzPykgdG8vZnJvbSB0aGUgc2ltdWxhdGVkIGNvZGUKKyAJKGZvciBpbnN0YW5jZSB0aGUgcGhhbmRsZSBpbiBPcGVuQm9vdCkuICBUaGUgY2FwIG9iamVjdCBpcyBhYmxlIHRvCisgCWNoZWNrL21hcCBiZXR3ZWVuIGludGVybmFsIGFuZCBleHRlcm5hbCAodGFyZ2V0IHByb2dyYW0pCisgCXJlcHJlc2VudGF0aW9ucyBvZiBlYWNoIGlkZW50aWZpZXIuCisJCisJKiBvc19lbXVsLmMsIGVtdWxfY2hpcnAuaCwgZW11bF9jaGlycC5jLCBNYWtlZmlsZS5pbjogQWRkCisgCXByZWxpbWluYXJ5IGhvb2tzIGZvciBhIGtlcm5lbCBtb2RlIElFRUUtMTI3NSBlbXVsYXRpb24uCisKKwkqIGNwdS5oLCBjcHUuYyAoY3B1X2NyZWF0ZSwgY3B1X29zX2VtdWxhdGlvbiwgY3B1KTogQWRkIG9zX2VtdWwgdG8KKyAJbGlzdCBvZiBhcmd1bWVudHMgcGFzc2VkIGluIHdoZW4gY3JlYXRpbmcgYSBjcHUuICBHcmFudCBhY2Nlc3MgdG8KKyAJdGhlIGVsZW1lbnQuCisKKwkqIHN0ZC1jb25maWcuaCAoT1NfRU1VTF9JTkxJTkUpLCBvcHRpb25zLmMgKHByaW50X29wdGlvbnMpLAorCWlubGluZS5oLCBpbmxpbmUuYzogTmV3IHRvIGFsbG93IGNvbnRyb2wgb3ZlciBpbmxpbmUgb2YKKwljb3JyZXNwb25kaW5nIGNvZGUgZmlsZXMuCisKKwkqIHBwYy1pbnN0cnVjdGlvbnMgKGluc3RydWN0aW9uX2NhbGwpOiBBZGQgaWxsZWdhbCBpbnN0cnVjdGlvbiB0bworIAljYWxsIHRoZSBpbnN0cnVjdGlvbi1jYWxsIGVtdWxhdGlvbiBoYW5kbGVyLgorCQorCSogaW50ZXJydXB0cy5jIChzeXN0ZW1fY2FsbF9pbnRlcnJ1cHQpOiBDYWxsIHJlbmFtZWQKKyAgICAgICAgb3NfZW11bF9zeXN0ZW1fY2FsbCBmdW5jdGlvbigpLgorCisJKiBlbXVsX25ldGJzZC5jOiBVcGRhdGUgdG8gaW50ZXJmYWNlIHRvIGdlbmVyaWMgZW11bGF0aW9uLiAgU2luY2UKKyAgICAgICAgYWxsIGl0cyBmdW5jdGlvbnMgYXJlIGNhbGxlZCB2aWEgYSB0YWJsZSBkb24ndCB3b3JyeSBhYm91dCBhbnkKKyAgICAgICAgaW5saW5lLgorCisJKiBlbXVsX2dlbmVyaWMuaCwgZW11bF9nZW5lcmljLmMsIHNwYS0qKGRlbGV0ZSk6IFJlbW92ZSByZWZlcmVuY2VzCisgICAgICAgIGFuZCBjb2RlIGZvciBzcGEsIG5vIGxvbmdlciB0byBiZSB1c2VkLgorCisJKiBwc2ltLmMgKGNyZWF0ZV9jaGlycF9kZXZpY2VfdHJlZSk6IEZpbGwgb3V0IHdoYXQgd2FzIHByZXZpb3VzbHkKKyAgICAgICAgdGhlIG9wZW5ib290IGNyZWF0ZSBmdW5jdGlvbiBzbyB0aGF0IGl0IHN0YXJ0cyB0byBjcmVhdGUgYSBmdWxsCisgICAgICAgIE9wZW5Cb290IGRldmljZSB0cmVlLgorCitUdWUgTm92IDI4IDIxOjQ4OjA2IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBkZWJ1Zy5oLCBkZWJ1Zy5jOiBwdGUgdHJhY2UgaXMgbWFkZSByZWR1bmRhbnQgYnkgaHRhYiB0cmFjZSwKKyAgICAgICAgZGVsZXRlIGl0LiAgQWRkIHZtIHRvIGxpc3Qgb2Ygb3B0aW9ucy4gIFNpbXBsaWZ5IHRyYWNpbmcgb3V0cHV0IHNvCisgICAgICAgIGxpbmVzIGFyZSBub3QgYXMgbG9uZy4KKworVHVlIE5vdiAxNCAxMjoyNzowOCAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogZXZlbnRzLmgsIGV2ZW50cy5jIChldmVudF9xdWV1ZV9pbml0KSwgcHNpbS5jIChwc2ltX2luaXQpOiAocmUpCisgCWluaXRpYWxpemUgdGhlIGV2ZW50IHF1ZXVlLgorCisKKworCisKKworVHVlIE5vdiAyOCAxMzozODoyNiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHNpbS1lbmRpYW4uaDogTG9vayBhdCBXT1JEU19CSUdFTkRJQU4gdG8gZGV0ZXJtaW5lIGlmIHRoZSBob3N0CisJaXMgYmlnIGVuZGlhbiBvciBsaXR0bGUgZW5kaWFuLiAgRm9yIFNXQVBfbiwgdXNlIGh0b25sL2h0b25zIGlmCisJaG9zdCBpcyBsaXR0bGUgZW5kaWFuLCBub3QgYmlnIGVuZGlhbiBhbmQgaWYgV0lUSF9OVE9IIGlzIGRlZmluZWQuCisKKwkqIGNvbmZpZ3VyZXssLmlufSAoLS1lbmFibGUtc2ltLW1vZGVsLWlzc3VlKTogSW5zdGVhZCBvZiBkZWZpbmluZworCTAvMSwgZGVmaW5lIGl0IHRvIGJlIE1PREVMX0lTU1VFX3tQUk9DRVNTLElHTk9SRX0uICBBZGQKKwlBQ19DX0JJR0VORElBTiB0byBkZXRlcm1pbmUgaWYgdGhlIGhvc3QgaXMgYmlnIGVuZGlhbiBvciBub3QuCisJKiBjb25maWcuaW46IFJlZ2VuZXJhdGUuCisKKwkqIHN0ZC1jb25maWcuaCAoV0lUSF9NT0RFTF9JU1NVRSk6IERlZmF1bHQgdG8gMC4KKwkoQ1VSUkVOVF9NT0RFTF9JU1NVRSk6IFJlZmVyZW5jZSBXSVRIX01PREVMX0lTU1VFLCBhbmQgaWYgdGhhdCBpcworCTAsIHVzZSBjdXJyZW50X21vZGVsX2lzc3VlLgorCShNT0RFTF9JU1NVRV97UFJPQ0VTUyxJR05PUkV9KTogRGVmaW5lIGFzIC0xLzEuCisKKwkqIHBzaW0uYyAoY3VycmVudF9tb2RlbF9pc3N1ZSk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCisKKwkqIGNwdS5jIChjcHVfY3JlYXRlKTogVXNlIENVUlJFTlRfTU9ERUxfSVNTVUUgPiAwIGluc3RlYWQgb2YKKwlXSVRIX01PREVMX0lTU1VFLgorCShjcHVfe2luaXQsaGFsdH0pOiBEaXR0by4KKwkqIG1vbi5jIChtb25fcHJpbnRfaW5mbyk6IERpdHRvLgorCSogcHBjLWluc3RydWN0aW9ucyAoUFBDX0lOU05fKiBtYWNyb3MsIGJyYW5jaCBoYW5kbGluZyk6IERpdHRvLgorCisJKiBtb24uYyAobW9uX3ByaW50X2luZm8pOiBQcmludCBpbnN0cnVjdGlvbnMvc2Vjb25kIGlmIHZlcmJvc2UgPiAwLAorCXJhdGhlciB0aGFuID4gMS4KKworCSogbWFpbi5jIChtYWluKTogU2V0IGN1cnJlbnRfbW9kZWxfaXNzdWUgdG8gTU9ERUxfSVNTVUVfUFJPQ0VTUyBpZgorCXRoZSAtSSBzd2l0Y2ggaXMgdXNlZC4KKwkqIHNpbV9jYWxscyAoc2ltX29wZW4pOiBEaXR0by4KKworCSogcHBjLWluc3RydWN0aW9ucyAobW9kZWwgc3VwcG9ydCk6IEFkZCBzdXBwb3J0IGZvciBkZXRlcm1pbmluZworCXdoZW4gd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggd3JpdGViYWNrIHNsb3RzLiAgQWRkIHRyYWNpbmcgZm9yIHRoZQorCWJlZ2lubmluZyBvZiBlYWNoIGN5Y2xlLgorCitNb24gTm92IDI3IDE3OjQ2OjMzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogbW9uLmM6IENoZWNrIGZvciB3aGV0aGVyIHRvIGluY2x1ZGUgc3lzL3R5cGVzLmggYW5kIHN5cy90aW1lLmguCisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIGluY2x1ZGUgZmlsZXMgc3lzL3R5cGVzLmggYW5kCisJc3lzL3RpbWUuaC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIGNvbmZpZy5pbjogUmVnZW5lcmF0ZS4KKworCSogY3B1LmggKENPTlNUX0FUVFJJQlVURSk6IERlZmluZSBhcyBfX2F0dHJpYnV0ZV9fKChfX2NvbnN0X18pKSBpZgorCW5vdCBhbHJlYWR5IGRlZmluZWQuCisJKGNwdV9zeXN0ZW0pOiBVc2UgQ09OU1RfQVRUUklCVVRFLCBzbyB0aGF0IHdoZW4gd2UncmUgbm90IGlubGluaW5nCisJdGhlIHdvcmxkLCB0aGUgb3B0aW1pemVyIGhhcyBhIGZhaXIgY2hhbmNlIG9mIENTRSdpbmcgZnVuY3Rpb24KKwljYWxscy4KKwkoY3B1X3ttb25pdG9yLG5yLHJlZ2lzdGVycyxtb2RlbH0pOiBEaXR0by4KKworCSogc3RkLWNvbmZpZy5oIChNT0RFTF9JTkxJTkUpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIDEgaWYKKwlERUZBVUxUX0lOTElORSBpcyBub24temVybywgMCBvdGhlcndpc2UsIHJhdGhlciB0aGFuIGp1c3QgdGhlCisJdmFsdWUgb2YgREVGQVVMVF9JTkxJTkUuCisKK0ZyaSBOb3YgMjQgMTE6MjQ6MzQgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBsZi5oIChfX2F0dHJpYnV0ZV9fKTogSWYgbm90IEdDQyBhbmQgYXQgbGVhc3QgMi43LjAsIGRlZmluZSBhcworCW5vdGhpbmcuCisgCShsZl9wcmludGYpOiBBZGQgcHJpbnRmIF9fYXR0cmlidXRlX18sIHNvIHRoZSBjb21waWxlciB3aWxsCisJYXV0b21hdGljYWxseSBjaGVjayB0aGUgZm9ybWF0IHN0cmluZy4KKworCSogY29uZmlndXJleywuaW59ICgtLWVuYWJsZS1zaW0taWNhY2hlKTogSWYgYXJndW1lbnQgaXMgZGVmaW5lLAorCWFkZCAtUiB0byBmbGFncyBwYXNzZWQgdG8gaWdlbi4KKworCSogaWdlbi5jIChzdGRsaWIuaCk6IEluY2x1ZGUgaWYgdGhlIHN5c3RlbSBzdXBwbGllcyBvbmUuCisJKHNlbWFudGljc191c2VfY2FjaGVfc3RydWN0KTogTmV3IGdsb2JhbCBmb3IgLVIgZmxhZyB0byBzYXkKKwlzZW1hbnRpY3MgaXMgdG8gdXNlIHRoZSBjYWNoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkgcmF0aGVyIHRoYW4KKwlwdXR0aW5nIHRoZSB2YWx1ZXMgaW50byBsb2NhbCB2YXJpYWJsZXMuCisJKGZpcnN0X3VuZGVmLCBsYXN0X3VuZGVmKTogTmV3IHN0cnVjdHVyZXMgdG8gcmVtZW1iZXIgbmFtZXMgdG8KKwkjdW5kZWYgaWYgLVIuCisJKGxmX3ByaW50X2NfZXh0cmFjdGlvbik6IElmIC1SIGFuZCB0aGlzIGlzIHNlbWFudGljcywgZW1pdCBuYW1lcworCWFzICNkZWZpbmVzIHBvaW50aW5nIHRvIHRoZSBjYWNoZSBzdHJ1Y3R1cmUsIHJhdGhlciB0aGFuIGxvYWRpbmcKKwl0aGUgdmFsdWVzIGludG8gbG9jYWwgdmFyaWFibGVzLgorCShsZl9wcmludF9jX3NlbWFudGljX2Z1bmN0aW9uKTogSWYgLVIsICN1bmRlZiBhbGwgb2YgdGhlIG5hbWVzCisJZGVmaW5lZCBpbiBsZl9wcmludF9jX2V4dHJhY3Rpb24uCisJKG1haW4pOiBSZWNvZ25pemUgLVIuCisKKwkqIGlkZWNvZGVfZmllbGRzLmggKFNQUl8qKTogUmVkZWZpbmUgc3ByXyogbWFjcm9zIGFzIFNQUl8qIHRvCisJYXZvaWQgYSBuYW1lIGNvbmZpY3QgaWYgLVIgcGFzc2VkIHRvIGlnZW4uCisKKwkqIHBwYy1pbnN0cnVjdGlvbnMgKG1mc3ByLCBtdHNwcik6IFJlbmFtZSBzcHIgZmllbGQgdG8gU1BSLgorCShtb2RlbF9kYXRhKTogQWRkIGZpZWxkIHRvIGNvdW50IHRoZSB2YXJpb3VzICMgb2YgQ1JzIHRoYXQgdGhlCisJbXRjcmYgaW5zdHJ1Y3Rpb24gdXNlZC4KKwkobW9kZWxfbW9uX2luZm8pOiBSZXR1cm4gc3RydWN0dXJlcyBjb3VudGluZyB0aGUgIyBvZiBDUnMgdGhhdCB0aGUKKwltdGNyZiBpbnN0cnVjdGlvbiB1c2VkLgorCShicmFuY2hlcywgc3luYyBpbnN0cnVjdGlvbnMpOiBEbyBub3QgY2FsbCBtb2RlbCBmdW5jdGlvbnMgaWYKKwlXSVRIX01PREVMX0lTU1VFIGlzIDAuCisKKwkqIG1vbi5jIChzdGRsaWIuaCk6IEluY2x1ZGUgaWYgdGhlIHN5c3RlbSBzdXBwbGllcyBvbmUuCisgCShtb25fc29ydF9pbnN0cnVjdGlvbl9uYW1lcyk6IE5ldyBmdW5jdGlvbiB0byBzb3J0IGluc3RydWN0aW9uCisJbmFtZXMgYWxwaGFiZXRpY2FsbHkuCisJKG1vbl9wcmludF9pbmZvKTogQ2FsbCBxc29ydCB3aXRoIG1vbl9zb3J0X2luc3RydWN0aW9uX25hbWVzIHRvCisJc29ydCBpbnN0cnVjdGlvbiBuYW1lcy4gIERvbid0IGFib3J0IGlmIFdJVEhfTU9ERUxfSVNTVUUgaXMgMC4KKwkKKwkqIGRlYnVnLmggKElUUkFDRSk6IE1ha2UgcHJpbnRmX2ZpbHRlcmVkIGFyZ3VtZW50cyB0eXBlIGNvcnJlY3QuCisJKiBpZGVjb2RlX2V4cHJlc3Npb24uaCAoQ1IwX0NPTVBBUkUpOiBEaXR0by4KKwkqIHBzaW0uYyAocHNpbV9yZWFkX3JlZ2lzdGVyKTogRGl0dG8uCisKKwkqIGlnZW4uYyAobGZfcHJpbnRfbXlfcHJlZml4KTogVXNlIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKSB0bworCXNpbGVuY2UgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgdW51c2VkIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisJdmFyaWFibGVzLgorCShsZl9wcmludF9jX2V4dHJhY3Rpb24pOiBEaXR0by4KKwkqIGlkZWNvZGVfZXhwcmVzc2lvbi5oIChGUFNDUl9CRUdJTik6IERpdHRvLgorCisJKiBwcGMtY2FjaGUtcnVsZXM6IERlZmluZSBydWxlcyBmb3IgbWFraW5nIGEgYml0bWFzayBmb3IgYWxsCisJcmVnaXN0ZXJzLgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zOiBSZXdyaXRlIG1vZGVsIHNwZWNpZmljIGZ1bmN0aW9ucyB0byB1c2UgdGhlCisJYml0bWFzayBvZiB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBpbnN0ZWFkIG9mIHVzaW5nIHRoZSByZWdpc3RlcgorCXBvaW50ZXIgdG8gZ2V0IHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0aGVuIG1ha2luZyB0aGUgYml0bWFzay4KKworV2VkIE5vdiAyMiAxNToyNDoyNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHBwYy1pbnN0cnVjdGlvbnMgKG1vZGVsX2JyYW5jaGVzKTogQWRkIGNvbmRpdGlvbmFsIGFyZ3VtZW50IHRvCisJY291bnQgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHR5cGUgb2YgY29uZGl0aW9uYWwgYnJhbmNoIGlzIHVzZWQuCisJKGNvbmRpdGlvbmFsIGJyYW5jaGVzKTogUGFzcyBCMCBvciAtMSB0byBtb2RlbF9icmFuY2hlcy4KKwkobW9kZWxfbW9uX2luZm8pOiBQcmludCBvdXQgY29uZGl0aW9uYWwgYnJhbmNoIGNvdW50cy4KKwkobW9kZWwtZGF0YSk6IEFkZCBzdXBwb3J0IGZvciBwcmludGluZyBvdXQgY29uZGl0aW9uYWwgYnJhbmNoCisJdHlwZXMuCisKK1R1ZSBOb3YgMjEgMTY6MzE6MjUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBpZ2VuLmMgKGluc25fdGFibGVfbG9hZF9pbnNucyk6IEFkZCBzdXBwb3J0IGZvciBtb2RlbC1zdGF0aWMgZm9yCisJaW50ZXJuYWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBpbmxpbmVkLgorCShsZl9wcmludF9jX3NlbWFudGljKTogUmVtb3ZlIG1vZGVsX2NsZWFudXAuCisJKGdlbl9tb2RlbF97YyxofSk6IERpdHRvLgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zOiBSZWRvIG1vZGVsIHNwZWNpZmljIHN1cHBvcnQgb25jZSBhZ2Fpbi4gIEFkZAorCWZsb2F0aW5nIHBvaW50IHN1cHBvcnQgdG8gdGhlIG1vZGVsIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgRmxlc2gKKwlvdXQgYWxsIG9mIHRoZSBmbG9hdGluZyBtdXRpcGx5IGFkZC9zdWJ0cmFjdCBpbnN0cnVjdGlvbnMuICBBZGQKKwliZXR0ZXIgdHJhY2luZyBzdXBwb3J0IHRvIHRoZSBtb2RlbCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KKworU3VuIE5vdiAxOSAyMzowMDo1MiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHBwYy1pbnN0cnVjdGlvbnMgKG1vZGVsIGRhdGEsIG1vZGVsX2J1c3kpOiBSYXRoZXIgdGhhbiB1c2luZyBhCisJYml0IG1hc2sgZm9yIHRoZSBidXN5IHVuaXRzLCBqdXN0IHVzZSBhIGNoYXIgYXJyYXkuICBBbHNvLCBvbmx5CisJc3VwcG9ydCAyIGZ1bmN0aW9uIHVuaXRzIGFuIGluc24gY2FuIHVzZSwgcmF0aGVyIHRoYW4gYSBsb29wLgorCitGcmkgTm92IDE3IDE0OjA4OjA4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogdGFibGUuYyAodGFibGVfZW50cnlfcmVhZCk6IE1vdmUgc2V0dGluZyBlbnRyeS0+bGluZV9uciB0byBhZnRlcgorCXRoZSBtb2RlbCBzcGVjaWZpYyBmaWVsZHMgc28gdGhlIGxpbmUgbnVtYmVycyBmb3IgdGhlIGFubmV4IGFyZQorCWNvcnJlY3QuCisKKwkqIGNwdS5jIChjcHVfe2NyZWF0ZSxpbml0LGhhbHR9KTogQ2hlY2sgZm9yIFdJVEhfTU9ERUxfSVNTVUUKKwliZWZvcmUgY2FsbGluZyB0aGUgbW9kZWwgZnVuY3Rpb25zLgorCisJKiBkZWJ1Zy5jICh0cmFjZV9kZXNjcmlwdG9yKTogQWRkIHRyYWNlX21vZGVsIHN1cHBvcnQuCisJKiBkZWJ1Zy5oICh0cmFjZV9vcHRpb25zKTogRGl0dG8uCisKKwkqIGlnZW4uYyAoZ2VuX2ljYWNoZV9oKTogQ3JlYXRlIHR5cGUgaWRlY29kZV9jYWNoZSBhcyB2b2lkIGlmIG5vdAorCWNhY2hpbmcgaW5zdHJ1Y3Rpb25zLgorCShnZW5fbW9kZWxfe2MsaH0pOiBEcm9wIG1vZGVsX2lzc3VlIHN1cHBvcnQuICBBZGQgc3VwcG9ydCBmb3IKKwltb2RlbF9jbGVhbnVwLgorCShsZl9wcmludF9teV9wcmVmaXgpOiBJbml0aWFsaXplIGEgY29uc3QgaXRhYmxlX2luZGV4IHdpdGggdGhlCisJY3VycmVudCBpbmRleC4KKwkobGZfcHJpbnRfY19zZW1hbnRpYyk6IENhbGwgbW9kZWxfY2xlYW51cCBhdCB0aGUgZW5kIG9mIHRoZQorCWZ1bmN0aW9uIHRvIGNoZWNrIGZvciBpbnN0cnVjdGlvbnMgdGhhdCBhcmVuJ3Qgc3VwcG9ydGVkIHlldCBieQorCXRoZSBzY2hlZHVsaW5nIGNvZGUuCisJCisJKiBtb24uaCAoY291bnRfdHlwZSk6IE5ldyB0eXBlIGZvciBjb3VudGVycy4KKwkqIG1vbi5jOiBVc2UgY291bnRfdHlwZSBpbnN0ZWFkIG9mIHVuc2lnbmVkLgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zOiBSZWRvIHNjaGVkdWxpbmcgY29kZSBvbmNlIGFnYWluLiAgTWFrZSBpdCBhbGwKKwlpbmxpbmUgZnJpZW5kbHkuICBJbnN0ZWFkIG9mIGhhdmluZyBnZW5lcmFsIGNvZGUgZW1pdHRlZCBieSBpZ2VuLAorCWdvIHRoZSByb3V0ZSBvZiBoYXZpbmcgZWFjaCBzZW1hbnRpYyByb3V0aW5lIGNhbGwgdGhlIGFwcHJvcHJpYXRlCisJbW9kdWxlLgorCitUaHUgTm92IDE2IDA5OjUyOjI2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogdGFibGUuYyAodGFibGVfZW50cnlfcmVhZCk6IEFsbG93IHRoZSBhbm5leCB0byBoYXZlIGJsYW5rIGxpbmVzLgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zOiBDaGFuZ2UgbGluZXMgaW4gbW9kZWwgc3R1ZmYgdGhhdCBqdXN0IGhhdmUgYQorCXRhYiB0byBqdXN0IG5ld2xpbmUuICBBZGQgNjAxIHN1cHBvcnQuICBEb2N1bWVudCBtb3N0IGluc3RydWN0aW9ucworCWluIHRlcm1zIG9mIG1vZGVsIHNwZWNpZmljIHRpbWluZyBpbmZvcm1hdGlvbi4gIERyb3AgJ0ZVTkNUSU9OJworCWZyb20gUFBDX0ZVTkNUSU9OX1VOSVRfeHh4IGVudW1zLiAgQ2hhbmdlIFBQQ19VTklUX1VOS05PV04gLT4KKwlQUENfVU5JVF9CQUQuICBBZGQgVFJBQ0UodHJhY2VfdGJkKSBmb3IgYWxsIGRhdGEgY2FjaGUKKwlpbnN0cnVjdGlvbi5zLiAgU2lnbmFsIGlsbGVnYWwgaW5zdHJ1Y2l0b24gaWYgZGF0YSBjYWNoZSBibG9jaworCWludmFsaWRhdGUgaXMgaXNzdWVkIGZyb20gcHJvYmxlbSBzdGF0ZS4KKworCSogaWdlbi5jIChtYXhfbW9kZWxfZmllbGRzX2xlbik6IE5ldyBzdGF0aWMgdG8ga2VlcCB0cmFjayBvZiB0aGUKKwltYXggc2l6ZSBmb3IgdGhlIG1vZGVsIHNwZWNpZmljIGZpZWxkcy4KKwkobW9kZWxfY19pbnNuKTogVXNlIG1heF9tb2RlbF9maWVsZHNfbGVuIHRvIHNpemUgZmllbGRzLgorCShpbnNuX3RhYmxlX2luc2VydF9pbnNuKTogU2V0IG1heF9tb2RlbF9maWVsZHNfbGVuLgorCShtb2RlbF90YWJsZV9pbnNlcnQpOiBEaXR0by4KKwkoZ2VuX21vZGVsX3tjLGh9KTogTW9kZWxfaXNzdWUgaXMgbm93IGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yCisJYXJndW1lbnQuCisKKwkqIGRlYnVnLmMgKHRyYWNlX2Rlc2NyaXB0aW9uKTogQWRkIHN1cHBvcnQgZm9yIHRyYWNlX3RiZC4KKworCSogbW9uLmMgKG1vbl9pc3N1ZSk6IFBhc3MgcHJvY2Vzc29yIGFyZ3VtZW50IHRvIG1vZGVsX2lzc3VlLgorCisJKiBNYWtlZmlsZS5pbjogRGVsZXRlIGFsbCBmdW5jdGlvbiB1bml0IHN1cHBvcnQsIHNpbmNlIHRoZSBuZXdlcgorCXRhYmxlIGRyaXZlbiBtb2RlbCBzdXBwb3J0IHJlcGxhY2VzIGl0LgorCSogY3B1LntjLGh9OiBEaXR0by4KKwkqIG1vbi5jOiBEaXR0by4KKwkqIGlubGluZS57YyxofTogRGl0dG8uCisJKiBzdGQtY29uZmlnLmg6IERpdHRvLgorCSogb3B0aW9ucy5jOiBEaXR0by4KKwkqIGNvbmZpZ3VyZXssLmlufTogRGl0dG8uCisJKiBNYWtlZmlsZS5pbjogRGl0dG8uCisJKiBwc2ltLmM6IERpdHRvLgorCSogZnVuY3Rpb25fdW5pdC57YyxofTogRGVsZXRlIHRoZXNlIG5vdyB1c3VzZWQgZmlsZXMuCisKKwkqIHN0ZC1jb25maWcuaCAoV0lUSF9NT0RFTF9JU1NVRSk6IEFkZCBuZXcgbWFjcm8gb24gd2hldGhlciB0bworCXRyYWNlIGluc3RydWN0aW9ucyBpbiBhIG1vZGVsIHNwZWNpZmljIG1hbm9yLgorCSogb3B0aW9ucy5jIChwcmludF9vcHRpb25zKTogUHJpbnQgaXQgb3V0LgorCSogY29uZmlndXJleywuaW59OiBBZGQgLS1lbmFibGUtc2ltLW1vZGVsLWlzc3VlIG9wdGlvbi4KKwkqIE1ha2VmaWxlLmluOiBBZGQgLS1lbmFibGUtc2ltLW1vZGVsLWlzc3VlIGZsYWdzLgorCSogaWdlbi5jIChsZl9wcmludF9jX3NlbWFudGljKTogQWRkIGNhbGwgdG8gbW9uX2lzc3VlIGhlcmUuICBDaGVjaworCWZvciBXSVRIX01PREVMX0lTU1VFLgorCSogbW9uLmMgKG1vbl9pc3N1ZSk6IFJlbW92ZSBjYWxsIHRvIG1vbl9pc3N1ZV9oZXJlLgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zOiBNb3ZlIGJyYW5jaCB0cmFjaW5nIHRvIHRoZSBhY3R1YWwgYnJhbmNoCisJaW5zdHJ1Y3Rpb25zLCByYXRoZXIgdGhhbiB0ZXN0aW5nIGl0IGluIG1vZGVsX2lzc3VlLiAgQWRkIGNvZGUgdG8KKwljb2RlIHN1Y2Nlc3NmdWwvdW5zdWNjZXNzZnVsIGJyYW5jaCBwcmVkaWN0aW9ucywgYW5kIHRoZSBudW1iZXIgb2YKKwljb25kaXRpb25hbCBicmFuY2hlcyB0aGF0IGZlbGwgdGhyb3VnaC4KKworV2VkIE5vdiAxNSAxNzozMjoxMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNwdS5oIChjcHVfbW9kZWwpOiBBZGQgZGVjbGFyYXRpb24uCisKKwkqIGNwdS5jIChzdHJ1Y3QgX2NwdSk6IEFkZCBtb2RlbF9wdHIgdG8gaG9sZCBtb2RlbCBzcGVjaWZpYworCWluZm9ybWF0aW9uLgorCShjcHVfbW9kZWwpOiBSZXR1cm4gdGhlIG1vZGVsIGludGVybmFsIHBvaW50ZXIuCisJKGNwdV97Y3JlYXRlLGluaXQsaGFsdH0pOiBDYWxsIHRoZSBhcHByb3ByaWF0ZSBtb2RlbCBmdW5jdGlvbi4KKworCSogaW5saW5lLmMgKG1vbi5jKTogTW92ZSBpbmNsdWRlIG9mIG1vbi5jIGFmdGVyIG1vZGVsLmMuCisKKwkqIG1vbi5jIChfY3B1X21vbik6IEFkZCBmaWVsZHMgdG8gY291bnQgdW5hbGlnbmVkIG1lbW9yeQorCXJlZmVyZW5jZXMuCisJKG1vbl9pc3N1ZSk6IENhbGwgbW9kZWxfaXNzdWUsIG5vdCBmdW5jdGlvbl91bml0X2lzc3VlLgorCShtb25fe3JlYWQsd3JpdGV9KTogQ291bnQgIyBvZiB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzLgorCShtb25fcHJpbnRfaW5mbyk6IFN3aXRjaCB0byBjYWxsaW5nIG1vZGVsX21vbl9pbmZvIGFuZAorCW1vZGVsX21vbl9pbmZvX2ZyZWUgaW5zdGVhZCBvZiBmdW5jdGlvbl91bml0IHZlcnNpb24uICBQcmludCBvdXQKKwludW1iZXIgb2YgdW5hbGlnbmVkIHJlYWRzL3dyaXRlcy4KKworCSoge3BwYy1pbnN0cnVjdGlvbnMsaWdlbi5jfTogTW9yZSBnbG9iYWwgY2hhbmdlcyB0byBhZGQgbW9kZWwKKwlzcGVjaWZpYyBmZWF0dXJlcy4KKworCSogaW5saW5lLntjLGh9OiBQcm92aWRlIGZvciBpbmxpbmluZyBvcHRpb25zLmMuCisJKiBvcHRpb25zLntjLGh9OiBEaXR0by4KKwkqIHN0ZC1jb25maWcuaDogQWRkIE9QVElPTlNfSU5MSU5FLgorCitUdWUgTm92IDE0IDA0OjQ3OjI1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGRldmljZXMubywgbWFpbi5vKTogVXBkYXRlIGRlcGVuZGVuY3kuCisKKwkqIGlnZW4uYyAoZ2VuX21vZGVsX2gpOiBVc2UgY29ycmVjdCB2YXJpYWJsZSBpbiBsb29wLgorCShnZW5fbW9kZWxfYyk6IFVzZSBzdHJjbXAsIHN0cmNhc2VjbXAuCisJKGdlbl9tb2RlbF9jKTogVXNlIEVYVEVSTl9NT0RFTCBmb3IgYXJyYXlzLgorCShnZW5fbW9kZWxfaCk6IFVzZSBTVEFUSUNfTU9ERUwgZm9yIGFycmF5cy4KKwkobGZfcHJpbnRfY19zZW1hbnRpY19mdW5jdGlvbl9oZWFkZXIpOiBEZWxldGUgdW51c2VkIGZ1bmN0aW9uLgorCisJKiBtYWluLmMgKGNwdS5oKTogSW5jbHVkZSBjcHUuaCB0byBnZXQgbW9kZWwuaC4KKworCSogaW5saW5lLmggKHtFWFRFUk4sU1RBVElDfV9NT0RFTCk6IERlZmluZS4KKworTW9uIE5vdiAxMyAwOToxNDoxMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGlnZW4uYyAoe2luc24sbW9kZWx9X3RhYmxlX2ZpZWxkcyk6IFNwZWxsIG1uZW1vbmljIGNvcnJlY3RseS4KKwkoZ2VuX2l0YWJsZV9oLGl0YWJsZV9jX2luc24pOiBEaXR0by4KKwkobW9kZWwgc3VwcG9ydCk6IE1vdmUgbW9kZWwgc3VwcG9ydCBhcm91bmQsIGFkZCBzdXBwb3J0IGZvcgorCW1vZGVsLWRhdGEsIG1vZGVsLWludGVybmFsLiAgVXNlIGFubmV4IGZpZWxkIGZvciBtb2RlbC1tYWNyb3MKKwlub3cuCisKKwkqIGNvbmZpZ3VyZS5pbiAoLS1lbmFibGUtc2ltLWlubGluZSk6IElmIC0tZW5hYmxlLXNpbS1pbmxpbmU9bm8sCisJYWxzbyBkZWZpbmUgSU5MSU5FIGFzIG5vdGhpbmcuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKwkqIHN0ZC1jb25maWcuaCAoSU5MSU5FKTogUmF0aGVyIHRoYW4gbnVraW5nIElOTElORSwgb25seSBkZWZpbmUgaXQKKwlhcyBfX2lubGluZV9fIGlmIGFueSBvZiB0aGUgSU5MSU5FIGZsYWdzIGFyZSBub24temVyby4KKworCSogb3B0aW9ucy5jIChwcmludF9vcHRpb25zKTogUHJpbnQgb3V0IFdJVEhfWE9SX0VOREFJTi4KKworTW9uIE5vdiAxMyAyMzowMzo0NSAxOTk1ICBBbmRyZXcgQ2FnbmV5ICAgPGNhZ25leWhpZ2hsYW5kLmNvbS5hdT4KKworCSogcHBjLWluc3RydWN0aW9ucyAocmZpKTogQWRkIG1pc3NpbmcgY29kZS4KKworCSogY3B1LmMgKGNwdV9nZXRfdGltZV9iYXNlKTogRml4IGNhbGN1bGF0aW9uIG9mIGN1cnJlbnQgdmFsdWUgb2YKKyAgICAgICAgdGltZSBiYXNlIHJlZ2lzdGVyLgorCisJKiBwcGMtc3ByLXRhYmxlIChUQkwsIFRCVSk6IEZpeCBUQkwvVEJVIGVudHJpZXMgLSB3YXMgY29uZnVzaW5nCisgICAgICAgIG1bdGZddGIgd2l0aCBtW3RmXXNwci4KKworCSogcHBjLWluc3RydWN0aW9ucyAobXRzcHIsIG1mc3ByKTogRml4IG10dGJsIC0gd2Fzbid0IHN0b3JpbmcKKyAgICAgICAgbG93ZXIgd29yZC4KKworTW9uIE5vdiAxMyAyMTozNTozNyAxOTk1ICBBbmRyZXcgQ2FnbmV5ICAgPGNhZ25leWhpZ2hsYW5kLmNvbS5hdT4KKworCSogc3RkLWNvbmZpZy5oIChJTkxJTkUsIFNUQVRJQ19JTkxJTkUpOiBXYXMgYmVpbmcgc2V0IHRvIHN0YXRpYworICAgICAgICBpbmxpbmUuLiAgT25seSBwcm9ibGVtIGJlaW5nIHRoYXQgd2l0aCBwcGMtb3Bjb2RlLXNpbXBsZSB0aGlzIGdhdmUKKyAgICAgICAgaXQgdGhlIGNoYW5jZSB0byBpbmxpbmUgYWxsIHRoZSBpZGVjb2RlIGZ1bmN0aW9ucyB3aXRoIHBvdGVudGlhbGx5CisgICAgICAgIGRpc2FzdGVyb3VzIHJlc3VsdHMgb24gYSAxNm1iIFBDLiAgRm9yIG1vbWVudCBob2JibGUgSU5MSU5FLgorCisJKiBjb25maWd1cmUuaW4sIHN0ZC1jb25maWcuaCAoV0lUSF9TTVApOiBNYWtlIHRoYXQgNSBwcm9jZXNzb3JzIGJ5CisgICAgICAgIGRlZmF1bHQgLi4uCisKKwkqIGNvbmZpZ3VyZS5pbjogVHdlZWsgZmxhZ3MgcGFzc2VkIHRvIGdjYyBmb3IgLS13aXRoLXNpbS13YXJuaW5ncy4KKyAgICAgICAgRmlyc3RseSBtYWtlIHRoZW0gZXJyb3JzIGFuZCBzZWNvbmRseSByZW1vdmUgdGhlIG9wdGlvbnMgZ2NjLTI0NQorICAgICAgICBkb2Vzbid0IHJlY29uaXplLgorCitNb24gTm92IDEzIDE3OjU3OjI0IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBtaXNjLmMgKHphbGxvYyksIGNwdS5jIChjcHVfaW5pdCksIGRldmljZXMKKyAJKGNvbnNvbGVfaW9fcmVhZF9idWZmZXJfY2FsbGJhY2ssIGljdV9pb19yZWFkX2J1ZmZlcl9jYWxsYmFjaywKKyAJdm1faW9fcmVhZF9idWZmZXJfY2FsbGJhY2spLCBtYWluLmMgKHphbGxvYyksIG1vbi5jIChtZW1zZXQpLAorIAlzaW1fY2FsbHMuYyAoemFsbG9jKSA6IHJlcGxhY2UgYnplcm8oKSB3aXRoIG1lbXNldCgpLgorCisJKiBlbXVsX25ldGJzZC5jICh3cml0ZV9kaXJlbnRyaWVzKSwgcHNpbS5jIChwc2ltX3JlYWRfcmVnaXN0ZXIsCisgCXBzaW1fd3JpdGVfcmVnaXN0ZXIpOiByZXBsYWNlIGJjb3B5KCkgd2l0aCBtZW1jcHkoKS4KKwkKK1N1biBOb3YgMTIgMjA6NTU6NDEgMTk5NSAgQW5kcmV3IENhZ25leSAgIDxjYWduZXloaWdobGFuZC5jb20uYXU+CisKKwkqIGNvbmZpZ3VyZS5pbjogZm9yIC0tZGlzYWJsZS1zaW0taW5saW5lICgtLWVuYWJsZS1zaW0taW5saW5lPW5vKSwKKyAgICAgICAgZm9yY2UgREVGQVVMVF9JTkxJTkUgdG8gMCByYXRoZXIgdGhlbiB0cnVzdGluZyB0aGUgc3RkCisgICAgICAgIGNvbmZpZ3VyYXRpb24uCisKK1N1biBOb3YgMTIgMjA6NTU6NDEgMTk5NSAgQW5kcmV3IENhZ25leSAgIDxjYWduZXloaWdobGFuZC5jb20uYXU+CisKKwkqIGlnZW4uYyAobGZfcHJpbnRfaWRlY29kZV90YWJsZSwgaWRlY29kZV90YWJsZV9sZWFmKTogRml4CisgICAgICAgIGdlbmVyYXRpb24gb2Ygc3dpdGNoIGVudHJpZXMgaW4gdGFibGVzIC0gdHJlYXQgdGhlIHNhbWUgYXMKKyAgICAgICAgY3JhY2tpbmcvc2VtYW50aWMgZnVuY3Rpb25zLgorCisJKiBpZ2VuLmMgKGlkZWNvZGVfc3dpdGNoX2VuZCwgaWRlY29kZV9zd2l0Y2hfbGVhZik6IEZpeCBnZW5lcmF0aW9uCisgICAgICAgIG9mIGEgYm9vbGVhbiBzd2l0Y2ggc3RhdGVtZW50IChmaWVsZCB6ZXJvIG9yIG5vbi16ZXJvKS4KKworCSogcHBjLW9wY29kZS10ZXN0LTEsIHBwYy1vcGNvZGUtdGVzdC0yOiBOZXcgZmlsZXMuICBUaGVzZSB0ZXN0IHRoZQorICAgICAgICBzd2l0Y2gvdGFibGUgZ2VuZXJhdGlvbiBhYmlsaXR5IG9mIGlnZW4uCisKKwkqIGlnZW4uYyAoaWRlY29kZV9zd2l0Y2hfbGVhZik6IEZpeCBjb2RlIG91dHB1dCB3aGVuIGEgc3dpdGNoCisgICAgICAgIHN0YXRlbWVudCBuZWVkcyB0byBsb29rIHVwIGEgdGFibGUuCisKKwkqIGlnZW4uYyAoaWRlY29kZV9kZWNsYXJlX2lmX3N3aXRjaCk6IE5ldyBmdW5jdGlvbiBjYWxsZWQgZnJvbQorICAgICAgICBnZW5faWRlY29kZV9jIC0gbmVlZCB0byBkZWNsYXJlIGFueSBpZGVjb2RlIHN3aXRjaCBmdW5jdGlvbnMKKyAgICAgICAgYmVmb3JlIHRoZXkgYXJlIHVzZWQgaW4gaWRlY29kZSB0YWJsZXMuCisKKwkqIGlnZW4uYyAobGZfcHJpbnRfY19jcmFja2VyX2Z1bmN0aW9uLCBpZGVjb2RlX2NyYWNrX2xlYWYsCisgICAgICAgIGlkZWNvZGVfY3JhY2tfaW5zbik6IEFkZCBpc19pbmxpbmVfZnVuY3Rpb24gYXJndW1lbnQgdG8gY29kZQorICAgICAgICBwcmludGluZyBjcmFja2VyIGZ1bmN0aW9ucyB3aGljaCBpbmRpY2F0ZXMgaWYgU1RBVElDX0lERUNPREUgb3IKKyAgICAgICAgU1RBVElDX0lOTElORV9JREVDT0RFIHNob3VsZCBiZSB1c2VkIGZvciBkZWZpbml0aW9uLiAgRm9yCisgICAgICAgIGlkZWNvZGVfY3JhY2tfaW5zbiAod2hpY2ggaW1wbGllcyBub3QgZHVwbGljYXRpbmcvZXhwYW5kaW5nKSBkb24ndAorICAgICAgICBkZWNsYXJlIGZ1bmN0aW9uIGFzIGlubGluZSAtIHdlIGFzc3VtZSB0aGF0IHRoZSBvbmx5IHRpbWUgdGhpcyBpcworICAgICAgICBjb2RlIGlzIGdlbmVyYXRlZCBpcyB3aGVuIHRoaW5ncyBhcmUgYmVpbmcgdGVzdGVkLiAgRm9yCisgICAgICAgIGlkZWNvZGVfY3JhY2tfbGVhZiwgbWFrZSBzdGF0aWMgKGluc3RlYWQgb2YgSU5MSU5FKSBpZiB0aGUKKyAgICAgICAgaW5zdHJ1Y3Rpb25zIHBhcmVudCBpcyBhIHRhYmxlIGFzIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIGJlIGNhbGxlZAorICAgICAgICB2aWEgYSB0YWJsZS4KKworCSogaWdlbi5jIChpZGVjb2RlX2V4cGFuZF9pZl9zd2l0Y2gpOiBEZWNsYXJlIGFzIFNUQVRJQ19JREVDT0RFIG5vdAorICAgICAgICBTVEFUSUNfSU5MSU5FX0lERUNPREUuIE9ubHkgdGhlIG91dGVybW9zdCBpZGVjb2RlIHN3aXRjaCB3aWxsIGJlCisgICAgICAgIGNhbGxlZCBkaXJlY3RseSwgYWxsIG90aGVycyBhcmUgY2FsbGVkIHZpYSBhIHRhYmxlLgorCisJKiBpZ2VuLmMgKGxmX3ByaW50X3NlbWFudGljX2Z1bmN0aW9uX2hlYWRlciwgc2VtYW50aWNzX2hfbGVhZiwKKyAgICAgICAgc2VtYW50aWNzX2hfaW5zbiwgc2VtYW50aWNzX2hfZnVuY3Rpb24sCisgICAgICAgIGxmX3ByaW50X2Nfc2VtYW50aWNfZnVuY3Rpb24sIHNlbWFudGljc19jX2Z1bmN0aW9uKTogQWRkCisgICAgICAgIGlzX2lubGluZV9mdW5jdGlvbiBhcmd1bWVudCB0byBsZl9wcmludF9zZW1hbnRpY19mdW5jdGlvbl9oZWFkZXIKKyAgICAgICAgdG8gaW5kaWNhdGUgaWYgYW4gaW5saW5lIG9yIHN0YXRpYyBmdW5jdGlvbiBkZWNsYXJhdGlvbi9kZWZpbml0aW9uCisgICAgICAgIHNob3VsZCBiZSBvdXRwdXQuICBEZXBlbmRpbmcgb24gc2l0dXRhdGlvbiBjYWxsIGFjY29yZGluZ2x5OgorICAgICAgICBmdW5jdGlvbnMgKG5vdCBpbnN0cnVjdGlvbiBzZW1hbnRpYyByb3V0aW5lcykgYXJlIGFsd2F5cyBpbmxpbmU7CisgICAgICAgIFNlbWFudGljIHJvdXRpbmVzIGFyZSBtYWRlIGlubGluZSB3aGVuIHRoZXJlIGlzIG5vIGljYWNoZSAoY2FjaGUKKyAgICAgICAgd2lsbCBjb250YWluIHRoZSBmdW5jdGlvbiBhZGRyZXNzKSBhbmQgYXJlIGR1cGxpY2F0aW5nIChzZWUgYWJvdmUpCisgICAgICAgIGFuZCB0aGUgcGFyZW50IG9mIHRoZSBpbnN0cnVjdGlvbiBpcyBhIHN3aXRjaCBzdGF0ZW1lbnQuCisKKwkqIGlnZW4uYyAob3Bjb2RlX2ZpZWxkX25ldyk6IERlbGV0ZS4gIENvZGUgY2hhbmdlZCB0byB1c2UgWkFMTE9DCisgICAgICAgIGFuZCBtb3ZlZCB0byBpbnNuX3RhYmxlX2ZpbmRfb3Bjb2RlX2ZpZWxkLgorCisJKiB0YWJsZS5jICh0YWJsZV9vcGVuKTogRml4IHR5cG8gKG5yX21vZGVsX2ZpZWxkcyB2cyBucl9maWVsZHMpLgorCisJKiBpZ2VuLmMgKG1vZGVsX2NfaW5zbik6IFN1Z2dlc3Rpb24gLSBkb2N1bWVudCB0aGUgbmFtZSBvZiB0aGUKKyAgICAgICAgaW5zdHJ1Y3Rpb24gb24gZWFjaCBsaW5lIG9mIHRoZSBpbnN0cnVjdGlvbiBtb2RlbCB0YWJsZS4KKworRnJpIE5vdiAxMCAwMDo0NDozOCAxOTk1ICBBbmRyZXcgQ2FnbmV5ICAgPGNhZ25leWhpZ2hsYW5kLmNvbS5hdT4KKworCSogZW11bF9uZXRic2QuYyAoZG9faW9jdGwpOiBDbGVhbnVwIGNvbXBpbGF0aW9uLgorCisJKiBzaW1fY2FsbGJhY2tzLmggKF9fYXR0cmlidXRlX18pOiBPbmx5IGRlZmluZSBpZiBub3QgZGVmaW5lZCAod2FzCisgICAgICAgIGFscmVhZHkgZGVmaW5lZCBvbiBOZXRCU0QgaG9zdCkuCisKK1dlZCBOb3YgIDggMjE6NDk6NTIgMTk5NSAgQW5kcmV3IENhZ25leSAgIDxjYWduZXloaWdobGFuZC5jb20uYXU+CisKKwkqIHN0ZC1jb25maWcuaCAoV0lUSF9YT1JfRU5ESUFOKSwgY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjogTmV3CisgICAgICAgIG1hY3JvLCBpbmRpY2F0ZXMgaWYgdGhlIFBvd2VyUEMncyBob3JyaWJsZSBYT1IgZW5kaWFuIG1vZGUgc2hvdWxkCisgICAgICAgIGJlIHN1cG9ydGVkLiAgQWRkIHRvIGNvbmZpZ3VyZSBhbmQgbWFrZS4KKworCSogdm1fbi5oICh2bV9kYXRhX21hcF9yZWFkX04sIHZtX2RhdGFfbWFwX3dyaXRlX04pLCB2bS5jCisgICAgICAgICh2bV9pbnN0cnVjdGlvbl9tYXBfcmVhZCk6IElmIFhPUiBlbmRpYW4sIHhvciB0aGUgYWRkcmVzcworCXdpdGggYSB2YWx1ZSBmcm9tIGFuIHhvciB0YWJsZSAoaW5kZXhlZCBieSBzaXplIG9mIGFjY2VzcykuCisKKwkqIHZtLmMgKHZtX3N5bmNocm9uaXplX2NvbnRleHQpLCBjcHUuYyAoY3B1X3N5bmNocm9uaXplX2NvbnRleHQpOgorICAgICAgICBzZXQgdXAgeG9yIHRhYmxlIHRvIHhvciBpZiB0aGVyZSBpcyBhIGNvbmZsaWN0IGJldHdlZW4gdGhlCisgICAgICAgIENVUlJFTlRfVEFSR0VUX0VORElBTiBhbmQgdGhlIGVuZGlhbiBpbmRpY2F0ZWQgaW4gdGhlIE1TUi4gIE1vdmUKKyAgICAgICAgY2hlY2sgb2Ygc3Vwb3J0ZWQgY2hhbmdlIG9mIGVuZGlhbiBtb2RlIGZyb20gY3B1LmMgdG8gdm0uYy4KKworCSogdm0uYyAodm1fZGF0YV9tYXBfd3JpdGVfYnVmZmVyLCB2bV9kYXRhX21hcF9yZWFkX2J1ZmZlcik6CisgICAgICAgIEhvcGVmdWxseSBhZGRlZCBjb3JyZWN0IGhhY2sgdG8gaGFuZGxlIFhPUiBlbmRpYW4gbW9kZS4KKworCUZJWE1FOiBJZiBOT05TVFJJQ1QgYWxpZ25tZW50IGFuZCBYT1IgRU5ESUFOIGFuZCBNU1IgaW5kaWNhdGVzCisgICAgICAgIGxpdHRsZSBlbmRpYW4gbW9kZSwgdGhlIG1vZGVsIGFjY2VwdHMgbWlzcyBhbGlnbmVkIHRyYW5zZmVycy4KKworCUZJWE1FOiBOZWVkIHRvIGNyZWF0ZSBhbiBgaW5pdCcgZGV2aWNlIHRoYXQsIGR1cmluZworICAgICAgICBpbml0aWFsaXphdGlvaW4gZm9yIFhPUiBtb2RlLCBpdCBtdXNoZXMgKFhPUiBhZGRyZXNzKSBhbGwgdGhlIGRtYQorICAgICAgICBkYXRhIGJlZm9yZSBwYXNzaW5nIGl0IG9uIHRvIHRoZSBjb3JlIGZvciBzdG9yYWdlLiBKdXN0IGxpa2UgdGhlCisgICAgICAgIHJlYWwgdGhpbmcgcmVhbGx5LgorCitXZWQgTm92ICA4IDIxOjQ5OjUyIDE5OTUgIEFuZHJldyBDYWduZXkgICA8Y2FnbmV5aGlnaGxhbmQuY29tLmF1PgorCisJKiBkZXZpY2VzLmMgKGhhbHRfaW9fd3JpdGVfYnVmZmVyX2NhbGxiYWNrKTogVXNlIHZhbHVlIHdyaXR0ZW4gdG8KKyAgICAgICAgaGFsdCBkZXZpY2UgdG8gZGV0ZXJtaW5lIGV4aXQgc3RhdHVzLiAgVGh1cyBhbGxvd2luZworICAgICAgICBzdWNjZXNzL2ZhaWx1cmUgb2YgT0VBIHRlc3RzLgorCitXZWQgTm92ICA4IDAwOjEwOjM4IDE5OTUgIEFuZHJldyBDYWduZXkgICA8Y2FnbmV5aGlnaGxhbmQuY29tLmF1PgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zIChpY2JpKTogSWYgaWNhY2hlIHByZXNlbnQgZmx1c2ggaXQuCisKK1R1ZSBOb3YgIDcgMjM6MzY6MzEgMTk5NSAgQW5kcmV3IENhZ25leSAgIDxjYWduZXloaWdobGFuZC5jb20uYXU+CisKKwkqIGRldmljZXMuYyAoaHRhYl9pbml0X2NhbGxiYWNrKTogQWRkIGNvZGUgdG8gY3JlYXRlIGh0YWIvcHRlLgorCisJKiBkZXZpY2VzLmMgKGRtYV9maWxlLCBmaWxlX2luaXRfY2FsbGJhY2ssIGh0YWJfaW5pdF9jYWxsYmFjayk6CisgICAgICAgIE5ldyBmdW5jdGlvbiAtIERtYSB0aGUgbmFtZWQgZmlsZSBpbnRvIG1lbW9yeSBhdCB0aGUgc3BlY2lmaWVkCisgICAgICAgIGFkZHJlc3MuICBVc2UuCisKKwkqIGRldmljZV90cmVlLmgsIGRldmljZV90cmVlLmMgKHNjYW5kXyopOiBOZXcgZnVuY3Rpb25zLgorCitUdWUgTm92ICA3IDIzOjM2OjMxIDE5OTUgIEFuZHJldyBDYWduZXkgICA8Y2FnbmV5aGlnaGxhbmQuY29tLmF1PgorCisJKiBmaWx0ZXJfZmlsZW5hbWUuYywgTWFrZWZpbGUuaW46IENoYW5nZSBzbyB0aGF0IG9ubHkgZGVwZW5kYW50IG9uCisgICAgICAgIGEgdmVyeSBsaW1pdGVkIG5yIG9mIGZpbGVzLiAgU3RvcHMgYW4gdW5uZWNlc3NhcnkgZGVwZW5kZW5jeS4KKworVHVlIE5vdiAgNyAxNTo0NDozMyAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogY29yZS5jIChjb3JlX21hcF9maW5kX21hcHBpbmcpOiBVc2UgY3B1X2hhbHQgcmF0aGVyIHRoYW4gZXJyb3IKKyAJdG8gYWJvcnQgYW4gYWNjZXNzIHRvIGFuIHVuZGVmaW5lZCBhZGRyZXNzLgorCitTdW4gTm92IDEyIDA3OjU4OjA5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogaWdlbi5jIChtb2RlbF90YWJsZV9pbnNlcnRfe21hY3JvLGZ1bmN0aW9ufSk6IE5ldyBmdW5jdGlvbnMuCisJKGluc25fdGFibGVfbG9hZF9pbnNucyk6IENhbGwgdGhlbS4KKwkoZ2VuX21vZGVsX2gpOiBNb3ZlIHNlY3Rpb24gZW1pdGluZyBtb2RlbC1tYWNyb3MgdG8gYmUgZmlyc3QuCisJKG1vZGVsX3tjLGh9X2Z1bmN0aW9uKTogTmV3IGZ1bmN0aW9ucyBjbG9uZWQgZnJvbSBzZW1hbnRpYworCWZ1bmN0aW9ucyB0byBwcmludCBvdXQgdGhlIHByb3RvdHlwZSBhbmQgZnVuY3Rpb24gZm9yCisJbW9kZWwtZnVuY3Rpb25zLgorCShnZW5fbW9kZWxfe2MsaH0pOiBQcmludCBvdXQgbW9kZWwtZnVuY3Rpb25zLgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zIChtb2RlbF97c3RhcnQsaGFsdCxwcmludF9pbmZvfSk6IEFkZCBkdW1teQorCW1vZGVsLWZ1bmN0aW9ucy4KKworCSogb3B0aW9ucy5jIChwcmludF9vcHRpb25zKTogUHJpbnQgb3V0IFdJVEhfeyxERUZBVUxUX31NT0RFTCwgbm90CisJV0lUSF9QUENfeyxERUZBVUxUX31fTU9ERUwuCisJKG9wdGlvbnNfcHBjKTogRGVsZXRlIG5vdyB1bnVzZWQgZnVuY3Rpb24uCisJKGNwdS5oKTogSW5jbHVkZSBjcHUuaCwgbm90IGp1c3QgYmFzaWNzLmguCisKKwkqIHN0ZC1jb25maWcuaCAoV0lUSF97LERFRkFVTFRffU1PREVMKTogRGVmaW5lLgorCisJKiBpZ2VuLmMgKG1vZGVsX21hY3JvcywgbGFzdF9tb2RlbF9tYWNybyk6IE5ldyBzdGF0aWNzIHRvIGtlZXAKKwl0cmFjayBvZiBtYWNyb3MgdG8gZ28gaW4gbW9kZWwuaC4KKwkoaW5zbl90YWJsZV9sb2FkX2luc25zKTogQWRkIG1vZGVsLW1hY3JvcyB0byBtb2RlbF9tYWNyb3MgbGlua2VkCisJbGlzdC4KKwkobW9kZWxfdGFibGVfZmllbGRzKTogQWRkIGZpZWxkIGZvciBwcmludGFibGUgbmFtZS4KKwkoZ2VuX21vZGVsX2gpOiBJZiB0aGVyZSBhcmUgbW9kZWwgbWFjcm9zIGRlZmluZWQsIHByaW50IHRoZW0gb3V0LgorCVByaW50IG91dCBERUZBVUxUX01PREVMIGFzIHRoZSBmaXJzdCBtb2RlbCBpZiB0aGVyZSBhbnkgbW9kZWxzCisJc3BlY2lmaWVkLCBvdGhlcndpc2UgTU9ERUxfTk9ORS4gIFByaW50IG91dCBleHRlcm5hbCBkZWNsIGZvcgorCWN1cnJlbnRfbW9kZWwuICBQcmludCBvdXQgZGVjbCBmb3IgbW9kZWxfc2V0LgorCShnZW5fbW9kZWxfYyk6IEFkZCBmdW5jdGlvbiBtb2RlbF9zZXQuICBTd2l0Y2ggdG8gdXNlIHByaW50YWJsZQorCW5hbWUgZm9yIHRoZSBtb2RlbCwgbm90IHRoZSBpbnRlcm5hbCBpZGVudGlmaWVyIHVzZWQuCisKKwkqIHBzaW0uYyAoY3VycmVudF9tb2RlbCk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCisKKwkqIHBwYy1pbnN0cnVjdGlvbnM6IEFkZCBtYWNyb3MgZm9yIGZsYWcgZGVmaW5lcy4gIFN3aXRjaCBmaXJzdAorCW1vZGVsIHNvIDYwNCBpcyBmaXJzdC4KKworCSogbWFpbi5jIChtYWluKTogQ2FsbCBtb2RlbF9zZXQsIG5vdCBmdW5jdGlvbl91bml0X21vZGVsLgorCSogc2ltX2NhbGxzLmMgKHNpbV9vcGVuKTogRGl0dG8uCisJKiBzaW1fY2FsbHMuYywgTWFrZWZpbGUuaW46IHNpbV9jYWxscy5jIG5vdyBpbmNsdWRlcyBjcHUuaC4KKworU2F0IE5vdiAxMSAwNzoyNzo0MSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIG1vbi5oIChtb25fZXZlbnRzKTogTmV3IGVudW1lcmF0aW9uIGZvciBvdGhlciBldmVudHMgd2Ugd2FudCB0bworCWhhbmRsZS4KKwkobW9uX2V2ZW50KTogQWRkIGRlY2xhcmF0aW9uIGZvciBmdW5jdGlvbi4KKworCSogbW9uLmMgKG1vbl9ldmVudCk6IE5ldyBmdW5jdGlvbi4KKwkobW9uX3ByaW50X2luZm8pOiBQcmludCBpY2FjaGUgbWlzc2VzLgorCisJKiBwc2ltLmMgKHJ1bl91bnRpbF9zdG9wKTogTW9uaXRvciBpY2FjaGUgbWlzc2VzLgorCisJKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLXNpbS1pbmxpbmUpOiBGaXggdHlwb3MgaW4gaGFuZGxpbmcgY29tbWEKKwlzZXBhcmF0ZWQgaW5saW5lIG9wdGlvbnMuCisJKC0tZW5hYmxlLXNpbS1pY2FjaGUpOiBFY2hvIGljYWNoZSBzaXplLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisJKiBpZ2VuLmMgKHNlbWFudGljc19oX3ByaW50X2Z1bmN0aW9uKTogRW1pdCBTVEFUSUNfU0VNQU5USUNTCisJaW5zdGVhZCBvZiBJTkxJTkVfU0VNQU5USUNTIHNvIHRoYXQgdGhlIGNvbXBpbGVyIHdvbid0IGtlZXAgYWxsIG9mCisJdGhlIHNlbWFudGljIGZ1bmN0aW9ucyBhcyBpbmxpbmUgUlRMLCBnaXZlbiB0aGF0IHRoZSBhZGRyZXNzIG9mCisJdGhlIGZ1bmN0aW9uIGlzIHRha2VuIHdoaWNoIGZvcmNlcyBvdXRsaW5lIGNhbGxzIGFueXdheS4KKwkobGZfcHJpbnRfY19zZW1hbnRpY19mdW5jdGlvbl9oZWFkZXIpOiBEaXR0by4KKwkoZ2VuX3NlbWFudGljc19oKTogRGVmaW5lIFNUQVRJQ19TRU1BTlRJQ1MgYXMgbm90aGluZyBpZiBub3QKKwlkZWZpbmVkLgorCShsZl9wcmludF9jX2NyYWNrZXJfZnVuY3Rpb24pOiBFbWl0IFNUQVRJQ19JREVDT0RFIGluc3RlYWQgb2YKKwlTVEFUSUNfSU5MSU5FX0lERUNPREUuCisJKGdlbl9pZGVjb2RlX2MpOiBEZWZpbmUgU1RBVElDX0lERUNPREUgaWYgbm90IGRlZmluZWQuCisJKGdlbl9tb2RlbF9oKTogVXNlICNpZmRlZnMgdG8gZGVmaW5lIHR5cGVzIHRvIGhvbGQgbW9kZWwgdW5pdHMsCisJY3ljbGVzLCBhbmQgZmxhZ3MuCisJKG1vZGVsX3RhYmxlX2luc2VydCk6IEFkZCBhIHNlbnRpbmVsIGZ1bmN0aW9uYWwgdW5pdCBhdCB0aGUgZW5kIHRvCisJc2ltcGxpZnkgbG9vcCBwcm9jZXNzaW5nLgorCShtb2RlbF9jX2luc24pOiBVc2UgPGZ1bmN0aW9uLXVuaXQ+X1NFTlRJTkFMIGluc3RlYWQgb2YgMCBmb3IgYW55CisJaW5zdHJ1Y3Rpb24gbm90IHNwZWNpZmluZyBhIGZ1bmN0aW9uIHVuaXQgZm9yIHRoZSBjdXJyZW50IG1vZGVsLgorCShnZW5fbW9kZWxfe2MsaH0pOiBQcm92aWRlIGJvdW5kcyBmb3IgbW9kZWxfdGltZV9tYXBwaW5nLgorCQorCSogaW5saW5lLmggKFNUQVRJQ19TRU1BTlRJQ1MpOiBEZWZpbmUgdG8gYmUgc3RhdGljIGlmCisJU0VNQU5USUNTX0lOTElORSBpcyBkZWZpbmVkLgorCShTVEFUSUNfSURFQ09ERSk6IERlZmluZSB0byBiZSBzdGF0aWMgaWYgSURFQ09ERV9JTkxJTkUgaXMKKwlkZWZpbmVkLgorCQorCSogb3B0aW9ucy5jIChwcmludF9vcHRpb25zKTogRml4IHR5cG8uCisKK0ZyaSBOb3YgMTAgMDY6Mzk6NDYgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLXNpbS17b3Bjb2RlLGNvbmZpZ30pOiBVc2UgJHNyY2RpciB3aGVuCisJY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgZmlsZXMuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKwkqIHRhYmxlLmMgKHRhYmxlKTogTmV3IGZpZWxkIG5yX21vZGVsX2ZpZWxkcy4KKwkodGFibGVfb3Blbik6IE5ldyBwYXJhbWV0ZXIgbnJfbW9kZWxfZmllbGRzLgorCSh0YWJsZV9lbnRyeV9yZWFkKTogUGFyc2UgbW9kZWwgZmllbGRzIHRoYXQgYmVnaW4gd2l0aCBhICcqJyBhZnRlcgorCWVhY2ggaW5zdHJ1Y3Rpb24uCisJKiBpZ2VuLmMsIGRnZW4uYzogQ2hhbmdlIGNhbGxlcnMgb2YgdGFibGVfb3Blbi4KKworCSogaWdlbi5jOiBBZGQgc3VwcG9ydCBmb3IgZHVtcGluZyBtb2RlbCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpbgorCW1vZGVsLmggYW5kIG1vZGVsLmMuCisJKGluc25fZmllbGRfbmFtZSk6IERlbGV0ZSB1bnVzZWQgYXJyYXkuCisJKGdsb2JhbCB2YXJpYWJsZXMpOiBNYWtlIGdsb2JhbCB2YXJpYWJsZXMgc3RhdGljLCBzbyB3ZSBjYW4gdGVsbAorCXdoZW4gdGhleSBhcmUgbm8gbG9uZ2VyIHVzZWQuCisJKGNhY2hlX3NlbWFudGljX2FjdHVhbCk6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGUuCisJKGluc25fdGFibGVfbG9hZF9pbnNucyk6IElmIHRoZSBpbnNuIGlzIHJlYWxseSBhIG1hY2hpbmUgbW9kZWwsCisJY2FsbCBtb2RlbF90YWJsZV9pbnNlcnQgaW5zdGVhZCBvZiBvdGhlciBwcm9jZXNzaW5nLgorCShtb2RlbF90YWJsZV9pbnNlcnQpOiBOZXcgZnVuY3Rpb24gdG8gaGFuZGxlIGRlZmluaW5nIHRoZQorCWZ1bmN0aW9uYWwgdW5pdHMgb2YgYSBwYXJ0aWN1bGFyIG1hY2hpbmUgbW9kZWwuCisJKGluc25fdGFibGUpOiBBZGQgbGFzdF9mdW5jdGlvbiBmaWVsZCBzbyB3ZSBjYW4gYWRkIGZ1bmN0aW9ucyBhdAorCXRoZSBlbmQuCisJKGluc25fdGFibGVfaW5zZXJ0X2Z1bmN0aW9uKTogVXNlIGxhc3RfZnVuY3Rpb24gZmllbGQgd2hlbgorCWFwcGVuZGluZyBuZXcgZnVuY3Rpb24uCisKKwkqIHBwYy1pbnN0cnVjdGlvbnM6IEFkZCBhIGZldyBtb2RlbCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBmb3IgNjAzLAorCTYwM2UsIGFuZCA2MDQgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisJCisJKiB0YWJsZS5oICh0YWJsZV9tb2RlbF9lbnRyeSk6IE5ldyBsaW5rZWQgbGlzdCB0byBob2xkIG1vZGVsCisJc3BlY2lmaWMgaW5mb3JtYXRpb24sIG9uZSBwZXIgbGluZS4KKwkodGFibGVfZW50cnkpOiBBZGQgbW9kZWxfZmlyc3QsIG1vZGVsX2xhc3QgZmllbGRzLgorCisJKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLXNpbS1pbmxpbmUpOiBJZiBnY2MgaXMgZm91bmQgYW5kCisJLS1lbmFibGUtc2ltLWlubGluZSBpcyBub3Qgc3BlY2lmaWVkLCBkZWZhaW5lIERFRkFVTFRfSU5MSU5FIHRvIDEsCisJbm90IDIuCisJKC0tZW5hYmxlLXNpbS1yZXNlcnZlZC1iaXRzKTogTmV3IHN3aXRjaCB0byBjaGVjayB3aGV0aGVyIHJlc2VydmVkCisJYml0cyBhcmUgc2V0IGluIHRoZSBpbnN0cnVjdGlvbi4KKwkoLS1lbmFibGUtc2ltLW9wY29kZSk6IE1ha2UgY29tcGxleCB0aGUgZGVmYXVsdC4KKwkoYWxsIHN3aXRjaGVzKTogQWRkIGFwcHJvcHJpYXRlIGNoZWNrcyBhbmQgZXJyb3IgbWVzc2FnZXMuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisKKwkqIE1ha2VmaWxlLmluIChSRVNFUlZFRF9DRkxBR1MpOiBOZXcgdmFyaWFibGUgc2V0IGJ5CisJLS1lbmFibGUtc2ltLXJlc2VydmVkLWJpdHMuCisJKENPTkZJR19DRkxBR1MpOiBJbmNsdWRlIFJFU0VSVkVEX0NGTEFHUy4KKwkoQlVJTFRfU1JDKTogaWdlbiBub3cgZ2VuZXJhdGVzIG1vZGVsLmMgYW5kIG1vZGVsLmguCisJKExJQl9PQkopOiBJbmNsdWRlIHRhYmxlLm8uCisJKHRtcC1pZ2VuKTogQWRkIC1tLy1NIG9wdGlvbnMgdG8gd3JpdGUgbW9kZWwuYy9tb2RlbC5oLgorCShtb2RlbC5vKTogTmV3IG9iamVjdC4KKwkoQ1BVX0gpOiBJbmNsdWRlIG1vZGVsLmguCisKKwkqIGNwdS5oOiBJbmNsdWRlIG1vZGVsLmguCisKKwkqIHN0ZC1jb25maWcuaCAoV0lUSF9SRVNFUlZFRF9CSVRTKTogRGVmaW5lLgorCShNT0RFTF9JTkxJTkUpOiBEaXR0by4KKworCSogb3B0aW9ucy5jIChwcmludF9vcHRpb25zKTogUHJpbnQgb3V0IFdJVEhfUkVTRVJWRURfQklUUy4KKworVGh1IE5vdiAgOSAxMjoyMjoxNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogSWYgLS1zaWxlbnQsIGRvbid0IG91dHB1dCBpbmZvcm1hdGlvbiBtZXNzYWdlcy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworCSogY29uZmlndXJlLmluICgtLWVuYWJsZS1zaW0tYWxpZ25tZW50KTogRml4IHR5cG8gaW4gc3BlY2lmaW5nIG5vbgorCXN0cmljdCBhbGlnbm1lbnQuCisJKC0tZW5hYmxlLXNpbS1zd2l0Y2gpOiBNYWtlIGRlZmF1bHQgb24uCisJKC0tZW5hYmxlLXNpbS1kdXBsaWNhdGUpOiBNYWtlIGRlZmF1bHQgb24uCisJKC0tZW5hYmxlLXNpbS1zbXApOiBNYWtlIGRlZmF1bHQgMC4KKwkoLS1lbmFibGUtc2ltLW1vbik6IERvbid0IHNldCBzaW1fZmxvYXQgaWYgbm90IHNldC4KKwkoLS1lbmFibGUtc2ltLWlubGluZSk6IElmIGdjYyBpcyBmb3VuZCBhbmQgLS1lbmFibGUtc2ltLWlubGluZSBpcworCW5vdCBzcGVjaWZpZWQsIGRlZmluZSBERUZBVUxUX0lOTElORSB0byBiZSAyLgorCShhbGwgLS1lbmFibGUtc2ltLSogcnVsZXMpOiBFY2hvIHJ1bGVzIHNldCB0byBub24gZW1wdHkgdG8gZmlsZQorCWRlc2NyaXB0b3IgNi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworCSogb3B0aW9ucy5jIChvcHRpb25zX2Vudik6IEZpeCB0eXBvIGlmIFdJVEhfRU5WIGlzIDAuCisJKHByaW50X29wdGlvbnMpOiBQcmludCBHQ0MgY29tcGlsZXIgdmVyc2lvbiBpZiBhdmFpbGFibGUgYW5kCisJZGF0ZS90aW1lIG9wdGlvbnMgd2FzIGNvbXBpbGVkLiAgSWYgT1BDT0RFX1JVTEVTLCBJR0VOX0ZMQUdTLAorCWFuZC9vciBER0VOX0ZMQUdTIGFyZSBkZWZpbmVkLCBwcmludCB0aGVtLgorCisJKiBNYWtlZmlsZS5pbiAoYWxsIGxpbmsgYWN0aW9ucyk6IFBhc3MgU0lNX0NGTEFHUyBhcyB3ZWxsIGFzCisJQ0ZMQUdTLgorCShvcHRpb25zLm8pOiBDb21waWxlIG9wdGlvbnMubyB3aXRoIE9QQ09ERV9SVUxFUywgSUdFTl9GTEFHUywgYW5kCisJREdFTl9GTEFHUyBkZWZpbmVkLCBzbyB0aGV5IGNhbiBiZSBwcmludGVkIG91dC4KKworCSogaWdlbi5jIChsZl9wcmludF9jX3ZhbGlkYXRlKTogQ2hlY2sgZm9yIFdJVEhfQVNTRVJULCBzbyB0aGF0CisJdGhpcyB0ZXN0IGNhbiBiZSBjb21waWxlZCBhd2F5IGlmIHRoZSB1c2VyIHJlYWxseSB3YW50cyBhIGZhc3QKKwlzaW11bGF0b3IgYnkgbm90IGRvaW5nIGFzc2VydGlvbiBmYWlsdXJlcy4KKworV2VkIE5vdiAgOCAxMzoxOTo0NyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIG9wdGlvbnMuYzogTmV3IGZpbGUgdG8gcHJpbnQgb3V0IGFsbCBvZiB0aGUgV0lUSF8gb3B0aW9ucy4KKwkqIG9wdGlvbnMuaDogTmV3IGluY2x1ZGUgZmlsZSB0byBkZWNsYXJlIHByaW50X29wdGlvbnMuCisJKiBkZWJ1Zy5oICh0cmFjZV9vcHRpb25zKTogQWRkIHRyYWNlX29wdHMgdG8gY2FsbCBwcmludF9vcHRpb25zLgorCSogZGVidWcuYyAodHJhY2VfZGVzY3JpcHRpb24pOiBBZGQgdHJhY2Vfb3B0cyBzdXBwb3J0LgorCSogbWFpbi5jIChtYWluKTogSWYgdXNlciByZXF1ZXN0ZWQgb3B0aW9ucywgcHJpbnQgdGhlbS4KKwkqIHNpbV9jYWxscy5jIChzaW1fb3Blbik6IERpdHRvLgorCQorCSogaWdlbi5jIChvcGNvZGVfZmllbGRfbmV3KTogQWRkIHZvaWQgdG8gbWFrZSBpdCBhIHByb3BlciBwcm90b3R5cGUuCisKKwkqIGVtdWxfZ2VuZXJpYy5jIChlbXVsX2VudGVyX2NhbGwpOiBNYWtlIHByaW50Zl9maWx0ZXJlZCBhcmd1bWVudHMKKwl0eXBlIGNvcnJlY3QuCisJKiBlbXVsX25ldGJzZC5jIChkb19raWxsKTogRGl0dG8uCisJKiByZWdpc3RlcnMuYyAocmVnaXN0ZXJzX2R1bXApOiBEaXR0by4KKwkqIHZtLmMgKG9tX3RyYW5zbGF0ZV9lZmZlY3RpdmVfdG9fcmVhbCk6IERpdHRvLgorCSogdm1fbi5oICh2bV9kYXRhX21hcF9yZWFkX04pOiBEaXR0by4KKwkodm1fZGF0YV9tYXBfd3JpdGVfTik6IERpdHRvLgorCSogZGV2aWNlcy5oIChEVFJBQ0VfSU5JVCk6IERpdHRvLgorCShEVFJBQ0Vfe0FUVEFDSCxERVRBQ0h9X0FERFJFU1MpOiBEaXR0by4KKwkoRFRSQUNFX0lPX3tSRUFELFdSSVRFfV9CVUZGRVIpOiBEaXR0by4KKwkoRFRSQUNFX0RNQV97UkVBRCxXUklURX1fQlVGRkVSKTogRGl0dG8uCisJKiBkZXZpY2VzLmMgKHVwZGF0ZV9mb3JfYmluYXJ5X3NlY3Rpb24pOiBEaXR0by4KKwkod3JpdGVfc3RhY2tfYXJndW1lbnRzKTogRGl0dG8uCisJKHN0YWNrX2lvY3RsX2NhbGxiYWNrKTogRGl0dG8uCisJKiBkZXZpY2VfdHJlZS5jIChkZXZpY2VfdHJlZV9hZGRfcGFzc3Rocm91Z2gpOiBEaXR0by4KKwkoZGV2aWNlX3RyZWVfe2FkZCxmaW5kfV9kZXZpY2UpOiBEaXR0by4KKwkoZGV2aWNlX3RyZWVfe2FkZCxmaW5kfV9pbnRlZ2VyKTogRGl0dG8uCisJKGRldmljZV90cmVlX2ZpbmRfe3N0cmluZyxib29sZWFufSk6IERpdHRvLgorCShkZXZpY2VfdHJlZV9pbml0eyxfZGV2aWNlfSk6IERpdHRvLgorCShkZXZpY2VfdHJlZV9kdW1wKTogRGl0dG8uCisJKiBzaW1fY2FsbHMuYyAoc2ltX3tyZWFkLHdyaXRlfSk6IERpdHRvLgorCShzaW1fe2ZldGNoLHN0b3JlfV9yZWdpc3Rlcik6IERpdHRvLgorCShzaW1fc3RvcF9yZWFzb24pOiBEaXR0by4KKworCSogc2ltX2NhbGxiYWNrcy5oIChwcmludGZfZmlsdGVyZWQpOiBEZWNsYXJlIHdpdGggYXR0cmlidXRlCisJcHJpbnRmLCBzbyB3ZSBjYW4gZW5hYmxlIGZvcm1hdCBjaGVja3MuCisKKwkqIGRldmljZXMuYyAoY29uc29sZV9pb197cmVhZCx3cml0ZX1fYnVmZmVyX2NhbGxiYWNrKTogQ2FzdCBzd3RpY2gKKwlhcmd1bWVudCB0byBpbnQsIHNpbmNlIEFOU0kgZG9lc24ndCBhbGxvdyBsb25nIHN3aXRjaCB2YWx1ZXMuCisJKiBlbXVsX25ldGJzZC5jIChkb19fX3N5c2N0bCk6IERpdHRvLgorCisJKiBlbXVsX25ldGJzZC5jIChkb19fX3N5c2N0bCk6IEZpeCB1cCBwcmludGYgY2FsbC4KKwkKKwkqIGNvcmVmaWxlLmMgKGNvcmVfdHJhbnNsYXRlKTogRG9uJ3QgZG8gYXJpdGhtZXRpYyB3aXRoIHZvaWQgKgorCXBvaW50ZXJzLiAgQ2FzdCB0byBjaGFyICogZmlyc3QuCisJCisJKiBmdW5jdGlvbl91bml0LmMgKEZVTkNfe0xPQUQsU1RPUkV9KTogUmVuYW1lIGZyb20ge0xPQUQsU1RPUkV9CisJYW5kIGNoYW5nZSBhbGwgdXNlcy4KKworCSogTWFrZWZpbGUuaW4gKHtGVU5DLE1PREVMLFdBUk5JTkd9X0NGTEFHUyk6IE5ldyBmbGFncyBzZXQgYnkKKwljb25maWd1cmUgLS1lbmFibGUgc3dpdGNoZXMuCisJKENPTkZJR19DRkxBR1MpOiBJbmNsdWRlIEZVTkNfQ0ZMQUdTIGFuZCBNT0RFX0NGTEFHUy4KKwkoLmMubyk6IEluY2x1ZGUgV0FSTklOR19DRkxBR1MuCisJKENQVV9IKTogSW5jbHVkZSBmdW5jdGlvbl91bml0LmguCisJKExJQl9PQkopOiBJbmNsdWRlIGZ1bmN0aW9uX3VuaXQuby4KKwkoQlVJTFRfU1JDX1dPX0NPTkZJRyk6IFNwbGl0IGZyb20gQlVJTFRfU1JDIGFuZCBkbyBub3QgaW5jbHVkZQorCWNvbmZpZy5oIG9yIHBwYy1jb25maWcuaC4KKwkoQlVJTFRfU1JDKTogSW5jbHVkZSBCVUlMVF9TUkNfV09fQ09ORklHLCBjb25maWcuaCBhbmQKKwlwcGMtY29uZmlnLmguCisJKGZpbHRlcl9maWxlbmFtZS5vKTogSW5jbHVkZSBjb25maWcuaC9wcGMtY29uZmlnLmggZGVwZW5kZW5jaWVzLgorCShpZGVjb2RlLm8sIHNlbWFudGljcy5vLCBwc2ltLm8pOiBTcGVjaWZ5IENDIGxpbmUgd2l0aG91dAorCVdBUk5JTkdfQ0ZMQUdTIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGFsbCBvZiB0aGUgdW51c2VkIHZhcmlhYmxlCisJd2FybmluZ3MgdGhhdCBhcmUgZ2VuZXJhdGVkLgorCShmdW5jdGlvbl91bml0Lm8pOiBBZGQgcnVsZSB0byBidWlsZC4KKwkobWFpbi5vLCBzaW1fY2FsbHMubyk6IEFkZCBmdW5jdGlvbl91bml0LmgsIGl0YWJsZS5oIGRlcGVuZGVuY2llcy4KKwkobW9uLm8pOiBJbmNsdWRlIG1vbi5jIGRlcGVuZGVuY3kuCisJKFRBR1MpOiBEZXBlbmQgb24gQlVJTFRfU1JDLgorCShjbGVhbik6IERvbid0IGRlbGV0ZSBjb25maWcuaCBvciBwcGMtY29uZmlnLmgKKworCSogYmFzaWNzLmggKHNpbV9jYWxsYmFja3MuaCk6IE1vdmUgaW5jbHVkZSBhZnRlciB0aGUgaW5jbHVkZSBvZgorCWNvbmZpZy5oIGFuZCBwcGMtY29uZmlnLmguCisKKwkqIGJpdHMue2gsY30gKFJPVEwzMixST1RMNjQpOiBNb3ZlIHRoZXNlIGZ1bmN0aW9ucyB0byBiaXRzLmMuICBBZGQKKwlzdXBwb3J0IGZvciBCSVRTX0lOTElORSB0byBpbmxpbmUgdGhlc2UuICBBZGQgZGVjbGFyYXRpb25zIHRvCisJYml0cy5oLgorCisJKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLXNpbS13YXJuaW5ncyk6IEFkZCBuZXcgb3B0aW9uIHRvIHNwZWNpZnkKKwljb21waWxlciB3YXJuaW5ncyBmb3IgYWxsIG1vZHVsZXMgZXhjZXB0IGlkZWNvZGUubyBhbmQgc2VtYW50aWNzLm8KKwl3aGljaCBoYXZlIGxvdHMgb2YgdW51c2VkIHZhcmlhYmxlcyBiZWNhdXNlIHRoZXkgYXJlIG1hY2hpbmUKKwlnZW5lcmF0ZWQuCisJKC0tZW5hYmxlLXNpbS1mdW5jdGlvbi11bml0KTogTmV3IHN3aXRjaCB0byBjb25maWd1cmUgd2hldGhlcgorCWZ1bmN0aW9uIHVuaXQgc3VwcG9ydCBpcyBjb21waWxlZCBpbiBvciBub3QuCisJKC0tZW5hYmxlLXNpbS17LGRlZmF1bHQtfW1vZGUpOiBOZXcgc3dpdGNoZXMgdG8gY29udHJvbCB3aGljaCBjcHUKKwltb2RlbCBpcyB1c2VkLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisJKiBjb3JlZmlsZS5jIChjb3JlX2F0dGFjaF9hZGRyZXNzX2NhbGxiYWNrKTogRGVsZXRlIHVudXNlZAorCXZhcmlhYmxlIGRldmljZV9hZGRyZXNzLgorCisJKiBjcHUuYyAoc3RydWN0IF9jcHUpOiBBZGQgZnVuY3Rpb24gdW5pdCBwb2ludGVyIGZpZWxkIGZ1bmNfdW5pdC4KKwkoY3B1X2NyZWF0ZSk6IElmIFdJVEhfRlVOQ1RJT05fVU5JVCwgY2FsbCBmdW5jdGlvbl91bml0X2NyZWF0ZS4KKwkoY3B1X2luaXQpOiBJZiBXSVRIX0ZVTkNUSU9OX1VOSVQsIGNhbGwgZnVuY3Rpb25fdW5pdF9pbml0LgorCShjcHVfaGFsdCk6IElmIFdJVEhfRlVOQ1RJT05fVU5JVCwgY2FsbCBmdW5jdGlvbl91bml0X2hhbHQuCisJKGNwdV9mdW5jdGlvbl91bml0KTogTmV3IGZ1bmN0aW9uIHRvIHJldHVybiBmdW5jX3VuaXQgZmllbGQuCisKKwkqIGNwdS5oIChmdW5jdGlvbl91bml0LmgpOiBJbmNsdWRlIG5ldyBpbmNsdWRlIGZpbGUuCisJKGNwdV9mdW5jdGlvbl91bml0KTogRGVjbGFyZS4KKworCSogZGVidWcuYyAoc3RkbGliLmgpOiBUZXN0IEhBVkVfU1RETElCX0gsIG5vdCBIQVZFX1NURExJQi4KKwkoY29uZmlnLmgpOiBJbmNsdWRlIGNvbmZpZy5oLgorCisJKiBkZXZpY2VzLmMgKGljdV9pb193cml0ZV9idWZmZXJfY2FsbGJhY2spOiBEZWxldGUgdW51c2VkIHZhcmlhYmxlCisJc3lzdGVtLgorCisJKiBlbXVsX2dlbmVyaWMuYyAoZW11bF9leGl0X2NhbGwpOiBQcmludCBvdXQgc3RhdHVzIHZhbHVlLgorCisJKiBlbXVsX25ldGJzZC5jIChkb19yZWFkKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZSBucl9tb3ZlZC4KKworCSogZmlsdGVyX2ZpbGVuYW1lLmggKGluY2x1ZGVzKTogSW5jbHVkZSBjb25maWcuaCwgcHBjLWNvbmZpZy5oLAorCW5vdCBiYXNpY3MuaC4KKworCSogaW5saW5lLmM6IEluY2x1ZGUgYml0cy5jIGlmIEJJVFNfSU5MSU5FLiAgSW5jbHVkZQorCWZ1bmN0aW9uX3VuaXQuYyBpZiBGVU5DVElPTl9VTklUX0lOTElORS4KKworCSogaW5saW5lLmggKElOTElORV9CSVRTKTogRGVmaW5lIGlmIEJJVFNfSU5MSU5FLgorCShJTkxJTkVfRlVOQ1RJT05fVU5JVCk6IERlZmluZSBpZiBGVU5DVElPTl9VTklUX0lOTElORS4KKworCSogaW50ZXJydXB0cy5jIChpbnN0cnVjdGlvbl9zdG9yYWdlX2ludGVycnVwdCk6IERlbGV0ZSB1bnVzZWQKKwl2YXJpYWJsZSBuaWEuCisKKwkqIGxmLmggKGNvbmZpZy5oKTogSW5jbHVkZSBjb25maWcuaC4KKworCSogbWFpbi5jIChpbmNsdWRlcyk6IEluY2x1ZGUgZnVuY3Rpb25fdW5pdC5jLiAgSWYgSEFWRV9VTklTVERfSCwKKwlpbmNsdWRlIHVuaXN0ZC5oLgorCSh1c2FnZSk6IFVwZGF0ZSBmb3IgLW0gbW9kZWwsIC1pLCBhbmQgLUkgb3B0aW9ucy4KKwkobWFpbik6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGVzIHN0YWNrX3BvaW50ZXIgYW5kIGkuICBBZGQgc3VwcG9ydAorCWZvciAtaSwgLW0gbW9kZWwgYXJndW1lbnRzLiAgQ2FsbCBwc2ltX3ByaW50X2luZm8gd2l0aCB2ZXJib3NlID09CisJMSBpZiAtaSwgYW5kIHZlcmJvc2UgPT0gMiBpZiAtSS4KKworCSogbW9uLmMgKHN0ZGlvLmgpOiBJbmNsdWRlIHN0ZGlvLmggdG8gcGljayB1cCBzcHJpbnRmIHByb3RvdHlwZS4KKwkobW9uX2lzc3VlKTogQ2FsbCBmdW5jdGlvbl91bml0X2lzc3VlIGlmIGZ1bmN0aW9uIHVuaXRzIGFyZQorCXN1cHBvcnRlZC4KKwkobW9uX3ByaW50X2luZm8pOiBUYWtlIHBzaW0gKiBhcmd1bWVudC4gIFByaW50IG91dCBpbmZvcm1hdGlvbgorCWZyb20gZnVuY3Rpb25fdW5pdCBpZiBhdmFpbGFibGUuICBNb3ZlIHJlYWQvd3JpdGUgc3RhdHMgdG8gYWx3YXlzCisJcHJpbnQsIGluc3RlYWQgb2YgcHJpbnRpbmcgaWYgdmVyYm9zZSA+IDEuICBGaXggdXAgcGx1cmFsCisJdnMuIHNpbmd1bGFyIHVzYWdlLgorCisJKiBtb24uaCAobW9uX3ByaW50X2luZm8pOiBVcGRhdGUgcHJvdG90eXBlLgorCisJKiBwc2ltLmMgKGN1cnJlbnRfcHBjX21vZGVsKTogQWRkIGdsb2JhbCB2YXJpYWJsZS4KKwkocHNpbV9wcmludF9pbmZvKTogUGFzcyBzeXN0ZW0gYXJndW1lbnQgdG8gbW9uX3ByaW50X2luZm8uCisKKwkqIHNpbV9jYWxscy5jIChmdW5jdGlvbl91bml0LmgpOiBJbmNsdWRlLgorCShzaW1fb3Blbik6IEFkZCBzdXBwb3J0IGZvciAtaSBhbmQgLW0gbW9kZWwgb3B0aW9ucy4gIElmIC1pIGNhbGwKKwlwc2ltX3ByaW50X2luZm8gd2l0aCB2ZXJib3NlID09IDEsIGlmIC1JLCB3aXRoIHZlcmJvc2UgPT0gMi4KKwkoc2ltX3Jlc3VtZSk6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGUgcHJvZ3JhbV9jb3VudGVyLgorCisJKiBzdGQtY29uZmlnLmggKFdJVEhfRlVOQ1RJT05fVU5JVCk6IERlZmluZS4KKwkocHBjX21vZGVsKTogQWRkIGVudW1lcmF0aW9uIGdpdmluZyBhbGwgUG93ZXJQQyBtb2RlbHMgY3VycmVudGx5CisJa25vd24gYWJvdXQuCisJKHtXSVRILENVUlJFTlR9X1BQQ19NT0RFTCk6IERlZmluZS4KKwkoRlVOQ1RJT05fVU5JVF9JTkxJTkUpOiBEZWZpbmUuCisKKwkqIHRhYmxlLmMgKGNvbmZpZy5oKTogSW5jbHVkZSBjb25maWcuaC4KKworCSogdm0uYyAob21fdmlydHVhbF90b19yZWFsKTogUHJpbnQgcHRlX3dvcmRfezAsMX0gc28gdGhlIGNvbXBpbGVyCisJZG9lc24ndCBjb21wbGFpbiB0aGF0IHRoZXkncmUgdW51c2VkLgorCisJKiB2bV9uLmggKHZtX2RhdGFfbWFwX3JlYWRfTik6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGUgcnZhbC4KKwkKK01vbiBOb3YgIDYgMjM6MTU6NTQgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIHNpbS1lbmRpYW4uYyAocHBjLWVuZGlhbi5jKSwgc2ltLWVuZGlhbi5oIChwcGMtZW5kaWFuLmgpOgorICAgICAgICByZW5hbWVlZC4gIFRoZXNlIGZpbGVzIGFyZSB0YXJnZXQgaW5kZXBlbmRhbnQuCisJKiBNYWtlZmlsZS5pbiwgYmFzaWNzLmg6IHVwZGF0ZSBmb3IgbmV3IG5hbWUuCisKKwkqIHNpbS1lbmRpYW4uaCAoU1dBUF9OKSwgc2ltLWVuZGlhbi5jIChfU1dBUF8xKTogUmVuYW1lIGV4aXN0aW5nCisgICAgICAgIFNXQVBfPE4+IHRvIF9TV0FQXzxOPiBzbyB0aGF0IHNpbS1lbmRpYW4uaCBjYW4gY29udGFpbiBTV0FQX04KKyAgICAgICAgbWFjcm8ncyBhcyByZXF1aXJlZC4KKworCSogc2ltLWVuZGlhbi5jLCBzaW0tZW5kaWFuLW4uaCAobmV3IGZpbGUpOiBNb3ZlIGVuZGlhbiBjb2RlIGludG8gYQorICAgICAgICBkZWJ1Z2FibGUgaGVhZGVyIGZpbGUuCisKKwkqIHBwYy1pbnN0cnVjdGlvbnMgKEJ5dGUtUmV2ZXJzZSk6IEVuYWJsZSBieXRlIHJldmVyc2UKKyAgICAgICAgaW5zdHJ1Y3Rpb25zIHVzaW5nIFNXQVBfTiBtYWNyb3MuCisKK01vbiBOb3YgIDYgMTA6Mzk6MjggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoY29uZmlnLnN0YXR1cyk6IFJlbW92ZSByZWZlcmVuY2VzIHRvIGNvbmZpZy5tYWtlCisJYW5kIGNvbmZpZy5oZHIuCisKKwkqIGNvbmZpZy57bWFrZSxoZHJ9OiBEZWxldGUsIG5vIGxvbmdlciB1c2VkLgorCSogYnVpbGQtcHNpbTogRGl0dG8uCisKK01vbiBOb3YgIDYgMjA6NDk6NTYgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIHNpbV9jYWxscy5jIChzaW1fb3Blbik6IEZpeCBwYXJzaW5nIG9mIGB0YXJnZXQgc2ltJyBvcHRpb25zLgorCisJKiBkZXZpY2VfdHJlZS5jIChkZXZpY2VfdHJlZV9hZGRfc3RyaW5nKTogV2Fzbid0IHNhdmluZyB0aGUgdmFsdWUKKyAJb2YgdGhlIHN0cmluZyBiZWluZyBlbnRlcmVkIGludG8gdGhlIHRyZWUuCisKKwkqIHBzaW0uYyAoY3JlYXRlX2ZpbGVkX2RldmljZV90cmVlKTogTm90IHRlcm1pbmF0aW5nIHN0cmluZyBkZXZpY2UKKyAJbmFtZXMgd2l0aCBhIG51bGwuCisJCisJKiBwc2ltLmMgKHBzaW1fY3JlYXRlKTogVXNlIGBlbnYnIGluc3RlYWQgb2YKKyAJYGVudmlyb25tZW50LWFyY2hpdGVjdHVyZScgdG8gYmUgY29uc2lzdGVudCB3aXRoIGNvbmZpZ3VyZS4KKyAgCVJlY29uaXplIHVzZXIvdWVhLCB2aXJ0dWFsL3ZlYSBhbmQgb3BlcmF0aW5nL29lYS4KKworU2F0IE5vdiAgNCAxMjoyOTo0NSAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogY29yZS5jOiAgUmVuYW1lIHRvIGNvcmVmaWxlLmMKKwkqIGNvcmUuaDogIFJlbmFtZSB0byBjb3JlZmlsZS5oCisJKiBpbmxpbmUuYzogSW5jbHVkZSBjb3JlZmlsZS5oLCByZW5hbWVkIGZyb20gY29yZS5oLgorCSogY3B1Lmg6IEluY2x1ZGUgY29yZWZpbGUuaCwgcmVuYW1lZCBmcm9tIGNvcmUuaAorCSogdm0uYzogSW5jbHVkZSBjb3JlZmlsZS5oLCByZW5hbWVkIGZyb20gY29yZS5oCisJKiBjb3JlZmlsZS5jOiBJbmNsdWRlIGNvcmVmaWxlLmggcmF0aGVyIHRoYW4gY29yZS5oCisJKiBSRUFETUUucHNpbSAoS05PV04gUFJPQkxFTVMpOiBDaGFuZ2UgY29yZS4qIHJlZmVyZW5jZXMgdG8gY29yZWZpbGUuKgorCXJlZmVyZW5jZXMuCisJKiBNYWtlZmlsZS5pbiAoQ1BVX0gpOiBDaGFuZ2UgY29yZS5oIHRvIGNvcmVmaWxlLmgKKwkodm0ubyk6ICBDaGFuZ2UgZGVwZW5kZW5jeSB0byBjb3JlZmlsZS5oCisJKExJQl9TUkMpOiBDaGFuZ2UgY29yZS5jIHRvIGNvcmVmaWxlLmMuCisJKExJQl9PQkopOiBDaGFuZ2UgY29yZS5vIHRvIGNvcmVmaWxlLm8uCisJKGNvcmVmaWxlLm8pOiAgQ2hhbmdlIGRlcGVuZGVuY2llcyB0byBjb3JlZmlsZS5jLCBjb3JlZmlsZS5oLgorCitGcmkgTm92ICAzIDExOjM3OjI0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogcHBjLWluc3RydWN0aW9ucyAoZGF0YSBjYWNoZSBpbnN0cnVjdGlvbnMpOiBNYWtlIGFsbCBkYXRhIGNhY2hlCisJaW5zdHJ1Y3Rpb25zIG5vcHMgaW5zdGVhZCBvZiBpbnZhbGlkIGluc3RydWN0aW9ucy4KKworCSogTWFrZWZpbGUuaW4gKENPTkZJR19DRkxBR1MpOiBBZGQgQUxJR05NRU5UX0NGTEFHUyBhbmQKKwlUSU1FQkFTRV9DRkxBR1Mgd2hpY2ggd2VyZW4ndCBpbmNsdWRlZC4KKworVGh1IE5vdiAgMiAwODo1NDowNCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBVbmNvbW1lbnQgYnVpbHQgZmlsZSBkZXBlbmRlbmNpZXMuCisJCisJKiBjb25maWd1cmUuaW46IFJld3JpdGUgLS1lbmFibGUtc2ltIHN3aXRjaCBoYW5kbGluZyB0byB1c2UgdGhlCisJYXV0b2NvbmYgYnVpbHRpbnMgc28gaXQgd29ya3MgY29ycmVjdGx5IGlmIHRoZSBjb25maWd1cmUgb3IKKwlNYWtlZmlsZS5pbiBmaWxlcyBhcmUgbW9kaWZpZWQgYW5kIG1ha2UgZGVjaWRlcyB0byByZWJ1aWxkCisJTWFrZWZpbGUuICBBbHNvIGRvY3VtZW50IGFsbCBvZiB0aGUgLS1lbmFibGUtc2ltIHN3aXRjaGVzCisJc3VwcG9ydGVkLiAgQ2hlY2sgd2hldGhlciBnZXRydXNhZ2UgYW5kIHN5cy9yZXNvdXJjZS5oIGFyZQorCXN1cHBvcnRlZC4KKwkqIGNvbmZpZy5pbjogUmVnZW5lcmF0ZS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKwkqIE1ha2VmaWxlLmluOiBBZGQgc3VwcG9ydCBmb3IgYWxsIG9mIHRoZSB2YXJpYWJsZXMgc2V0IHdpdGgKKwktLWVuYWJsZS1zaW0gc3dpdGNoZXMuCisKKwkqIE1ha2VmaWxlLmluIChjbGVhbik6IG1ha2UgY2xlYW4gbm93IHJlbW92ZXMgYWxsIGJ1aWx0IHNvdXJjZXMgYXMKKwl3ZWxsLgorCQorCSogY3B1LmM6IFVzZSBIQVZFX1NUUklOR19ILCBIQVZFX1NUUklOR1NfSCwgSEFWRV9VTklTVERfSCwKKwlIQVZFX1RJTUVfSCwgSEFWRV9TWVNfVElNRVNfSCwgSEFWRV9TWVNfUkVTT1VSQ0VfSCBkZWZpbmVkIGluCisJdGhlIGdlbmVyYXRlZCBjb25maWcuaC4KKwkqIGRlYnVnLmM6IERpdHRvLgorCSogZGV2aWNlX3RyZWUuYzogRGl0dG8uCisJKiBkZXZpY2VzLmM6IERpdHRvLgorCSogZGdlbi5jOiBEaXR0by4KKwkqIGVtdWxfbmV0YnNkLmM6IERpdHRvLgorCSogaWdlbi5jOiBEaXR0by4KKwkqIGxmLmM6IERpdHRvLgorCSogbWlzYy5jOiBEaXR0by4KKwkqIHBzaW0uYzogRGl0dG8uCisJKiByZWdpc3RlcnMuYzogRGl0dG8uCisJKiBzaW1fY2FsbHMuYzogRGl0dC4KKwkqIHRhYmxlLmM6IERpdHRvLgorCisKKwkqIG1haW4uYyAobWFpbik6IENhbGwgcHNpbV9wcmludF9pbmZvIHdpdGggdmVyYm9zZSA9PSAyLgorCisJKiBtb24uYyAobW9uX3ByaW50X2luZm8pOiBBbGlnbiB0aGUgY3B1IG51bWJlciBhbmQgbnVtYmVyIG9mCisJaW5zdHJ1Y3Rpb25zIGZpZWxkcy4gIERvIG5vdCBwcmludCBhbiBpbnN0cnVjdGlvbiBjYXRlZ29yeSBpZiB0aGUKKwlDUFUgZGlkIG5vdCBleGVjdXRlIGFueSBvZiB0aG9zZSBpbnN0cnVjdGlvbnMuICBQcmludCBvdXQgbnVtYmVyCisJb2YgcmVhZHMgYW5kIHdyaXRlcy4gIElmIGdldHJ1c2FnZSBpcyBzdXBwb3J0ZWQsIHByaW50IG91dCBudW1iZXIKKwlvZiBzaW11bGF0ZWQgaW5zdHJ1Y3RpbnMgcGVyIHNlY29uZC4KKwkKKwkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIC0tZW5hYmxlLXNpbS1vcGNvZGU9c3R1cGlkLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCitXZWQgTm92ICAxIDIzOjQ2OjU5IDE5OTUgIEFuZHJldyBDYWduZXkgICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogc3RkLWNvbmZpZyAoSU5MSU5FX0RFVklDRV9UUkVFKTogRG9uJ3QgaW5saW5lIGVpdGhlciBvZgorICAgICAgICBkZXZpY2VfdHJlZS5jIG9yIGRldmljZXMuYy4gIFRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGdhaW4uCisKKwkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IGFkZCAtLWVuYWJsZS1zaW0taWNhY2hlPVswLTldKiBhbmQKKyAJSUdFTl9JQ0FDSEUgbWFjcm8uCisJCitXZWQgTm92ICAxIDIzOjQ2OjU5IDE5OTUgIEFuZHJldyBDYWduZXkgICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogaWdlbi5jIChtYWluKSwgbWlzYy5oICh0YXJnZXRfYTJpLCBpMnRhcmdldCksIG1pc2MuYzogQWRkCisgICAgICAgIGZ1bmN0aW9ucyB0byBjb252ZXJ0IGJldHdlZW4gdGFyZ2V0IGFuZCBpZ2VuIGludGVybmFsIGJpdCBudW1iZXJzLgorICAgICAgICBNYWtlIElPIGdvIHRocm91Z2ggdGhlc2UgZnVuY3Rpb25zLiBBZGQgLWIgKGJpdCBzaXplKSBhbmQgLWggKGhpZ2gKKyAgICAgICAgYml0IG5yKSBvcHRpb25zIHRvIGlnZW4uICBUeXBpY2FsIHVzYWdlIHdvdWxkIGJlOiAuL2lnZW4gLWIgMTYgLWgKKyAgICAgICAgMTUgZm9yIGEgMTYgYml0IGluc3RydWN0aW9uIGZvcm1hdCB3aXRoIHRoZSBtc2IgZ2l2ZW4gYSBudW1iZXIgMTUuCisKK1dlZCBOb3YgIDEgMjI6MTc6MzIgMTk5NSAgQW5kcmV3IENhZ25leSAgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBkZ2VuLmMgKG1haW4pOiBXYXMgb3V0cHV0dGluZyBvcHRhcmcgZXZlbiB3aGVuIGl0IHdhcyBOVUxMLgorCitUdWUgT2N0IDMxIDIzOjQ4OjMzIDE5OTUgIEFuZHJldyBDYWduZXkgICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogdm1fbi5oICh2bV9kYXRhX21hcF9sb2FkX04sIHZtX2RhdGFfbWFwX3N0b3JlX24pLCBkZWJ1Zy5oLAorICAgICAgICBkZWJ1Zy5jOiBBZGQgdHJhY2luZyBvZiBsb2FkL3N0b3JlIHVuaXQgKHZpcnR1YWwpIHdpdGggLXQKKyAgICAgICAgbG9hZC1zdG9yZS4KKworVHVlIE9jdCAzMSAyMTo0NDowMSAxOTk1ICBBbmRyZXcgQ2FnbmV5ICAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICAgICAgKiBzdGQtY29uZmlnLmggKFdJVEhfRU5WSVJPTk1FTlQpOiBBZGQgVVNFUl9FTlZJUk9OTUVOVCB3aGljaCBkb2VzCisgICAgICAgIG5vdCBpbmNsdWRlIHRoaW5ncyBzdWNoIGFzIHRoZSB0aW1lIGJhc2UgYW5kIGV2ZW50cy4KKworCSogaW50ZXJydXB0LmMsIHNpbV9jYWxscy5jLCBjcHUuaCwgdm0uYywgY29uZmlndXJlLmluOiBBZGQgVUVBIHRvCisgCWFsbCBlbnZpcm9ubWVudCBzd2l0Y2hlcyBmb3IgYWJvdmUuCisKKwkqIHBzaW0uYyAocHNpbV9jcmVhdGUpOiBkaXR0byAtIG5ldyBkZXZpY2UgdHJlZSBub2RlIG5hbWUgaXMKKyAgICAgICAgL29wdGlvbnMvZW52aXJvbm1lbnQtYXJjaGl0ZWN0dXJlIHdpdGggdmFsdWVzIHVzZXIsIHZpcnR1YWwgYW5kCisgICAgICAgIG9wZXJhdGluZy4KKworVHVlIE9jdCAzMSAyMTozMTozMiAxOTk1ICBBbmRyZXcgQ2FnbmV5ICAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIHBwYy1vcGNvZGUtc3R1cGlkOiBUaGlyZCBleGFtcGxlIG9mIHVzZSBvZiBvcGNvZGUgdGFibGUgLSB0aGlzCisgICAgICAgIG9uZSBleHBhbmRzIGFsbCBtdHNwci9tZnNwciBhbmQgYnJhbmNoIGluc3RydWN0aW9ucy4gIEFwcGVhcnMgdG8KKyAgICAgICAgZ2l2ZSBhYm91dCBhIDEwJSBnYWluIGluIHBlcmZvcm1hbmNlIGlmIGV2ZXJ5dGhpbmcgZW5hYmxlZC4gIEFsc28KKyAgICAgICAgdGFrZXMgYWJvdXQgMTUwbWIgb2Ygc3dhcCB0byBidWlsZC4KKworV2VkIE5vdiAgMSAxMDo0OTo0OCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIGVtdWxfbmV0YnNkLmMgKGRvX2V4aXQpOiBQcmludCBhcmd1bWVudHMgYW5kIGNsb3NlIHBhcmVudGhlc2lzCisJaWYgdHJhY2luZywgc2luY2UgZXhpdCBkb2Vzbid0IGdvIHRocm91Z2ggZW11bF9leGl0X2NhbGwuCisJKGRvX3JlYWQpOiBQcmludCBhcmd1bWVudHMgaWYgdHJhY2luZy4KKwkoZG9fd3JpdGUpOiBEaXR0by4KKwkoZG9fb3Blbik6IERpdHRvLgorCShkb19icmVhayk6IERpdHRvLgorCShkb19raWxsKTogRGl0dG8uCisJKGRvX2R1cCk6IERpdHRvLgorCShkb19zaWdwcm9jbWFzayk6IFJlcGxhY2UgdHJhY2Ugd2l0aCBwcmludGluZyBhcmd1bWVudHMgaWYKKwl0cmFjaW5nLgorCShkb19pb2N0bCk6IFByaW50IGFyZ3VtZW50cyBpZiB0cmFjaW5nLgorCShkb191bWFzayk6IERpdHRvLgorCShkb19kdXAyKTogRGl0dG8uCisJKGRvX2ZjbnRsKTogRGl0dG8uCisJKGRvX2dldHRpbWVvZmRheSk6IERpdHRvLgorCShkb19nZXRydXNhZ2UpOiBEaXR0by4KKwkoZG9fZnN0YXRmcyk6IERpdHRvLgorCisJKiBmaWx0ZXJfZmlsZW5hbWUuYzogTmV3IGZpbGUgdG8gcHJvdmlkZSBmaWx0ZXJfZmlsZW5hbWUgdG8gc3RyaXAKKwl0aGUgZGlyZWN0b3J5IHByZWZpeCBmcm9tIGEgZmlsZS4KKwkqIGZpbHRlcl9maWxlbmFtZS5oOiBOZXcgaW5jbHVkZSBmaWxlIHRvIGRlY2xhcmUgZmlsdGVyX2ZpbGVuYW1lLgorCisJKiBkZWJ1Zy5oOiBJbmNsdWRlIGZpbHRlcl9maWxlbmFtZS5oLgorCShUUkFDRSxEVFJBQ0UsRVJST1IpOiBVc2UgZmlsdGVyX2ZpbGVuYW1lIG9uIF9fRklMRV9fLgorCisJKiBtaXNjLmg6IEluY2x1ZGUgZmlsdGVyX2ZpbGVuYW1lLmguCisgCShBU1NFUlQpOiBVc2UgZmlsdGVyX2ZpbGVuYW1lIG9uIF9fRklMRV9fLgorCisJKiBpZ2VuLmMgKGxmX3ByaW50X215X3ByZWZpeCk6IFVzZSBmaWx0ZXJfZmlsZW5hbWUgb24gdGhlIGZpbGVuYW1lCisJYXJndW1lbnQuCisKKwkqIE1ha2VmaWxlLmluOiBBZGQgZmlsdGVyX2ZpbGVuYW1lIHN1cHBvcnQuCisKKwkqIHBwYy1pbnN0cnVjdGlvbnMgKGRjYmksIGljYmkpOiBNYWtlIHRoZXNlIE5PUHMgcmF0aGVyIHRoYW4KKwlpbnZhbGlkIGluc3RydWN0aW9ucy4KKworCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgbW9yZSAtLWVuYWJsZS1zaW0tKiBzd2l0Y2hlcy4KKwlVc2UgY29uZmlnLm1ha2UgYW5kIGNvbmZpZy5oZHIgdG8gd3JpdGUgdG8gTWFrZWZpbGUgYW5kIGNvbmZpZy5oCisJcmVzcGVjdGl2ZWx5LiAgRG9uJ3QgcmV3cml0ZSBNYWtlZmlsZSwganVzdCBhcHBlbmQgdG8gaXQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJKiBjb25maWcue21ha2UsaGRyfTogTmV3IHNoZWxsIHNjcmlwdHMuCisJCisJKiBNYWtlZmlsZS5pbjogUmVtb3ZlIGFsbCB2YXJpYWJsZXMgc2V0IGJ5IGNvbmZpZ3VyZS5pbi4KKwkocHNpbS5vKTogRGVwZW5kIG9uICQoQlVJTFRfU1JDKSBhbHNvLgorCisJKiBlbXVsX25ldGJzZC5jIChkb19nZXR0aW1lb2ZkYXksZG9fZ2V0cnVzYWdlKTogV2hlbiBjb21wYXJpbmcgYW4KKwlpbnRlZ2VyLCB1c2UgMCwgbm90IE5VTEwuCisKK1R1ZSBPY3QgMzEgMTU6MjA6MDQgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciAtLWVuYWJsZS1zaW0taW5saW5lLAorCS0tZW5hYmxlLXNpbS1ic3dhcCwgLS1lbmFibGUtc2ltLWNmbGFncywgLS1lbmFibGUtc2ltLWNvbXBsZXgsCisJLS1lbmFibGUtc2ltLXN3aXRjaCwgLS1lbmFibGUtc2ltLWR1cGxpY2F0ZSwgLS1lbmFibGUtc2ltLWZpbHRlciwKKwlhbmQgLS1lbmFibGUtc2ltLWVuZGlhbiBzd2l0Y2ggdG8gY29udHJvbCB2YXJpb3VzIE1ha2VmaWxlCisJdmFyaWFibGVzLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIGZyb20gY29uZmlndXJlLmluLgorCSogTWFrZWZpbGUuaW46IEFkZCB2YXJpb3VzIE1ha2UgdmFyaWFibGVzIHRoYXQgdGhlIHZhcmlvdXMKKwlzd2l0Y2hlcyBhbHRlci4KKworCSogc3RkLWNvbmZpZy5oIChERUZBVUxUX0lOTElORSk6IERvbid0IHNldCB0aGlzIHRvIDIgaWYgdXNpbmcgR0NDCisJYW5kIG9wdGltaXppbmcgYnkgZGVmYXVsdC4KKworRnJpIE9jdCAyNyAxOToyNjoyNyAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogYml0cy5oIChST1RMMzIsIFJPVEw2NCk6IFdlcmUgZnVuY3Rpb25zLCBtYWRlIHRoZW0gbWFjcm9zLCBub3cKKyAJbWFrZSB0aGVtIGZ1bmN0aW9ucyBhZ2Fpbi4gIEFwcGVhcnMgMi42LjMgaXMgY29uZnVzZWQgYnkganVzdCBhCisgCW1hY3JvLgorCitUaHUgT2N0IDI2IDE4OjMxOjU4IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBwcGMtZW5kaWFuLmMgKFNXQVBfOCk6IEZpeCA4IGJ5dGUgc3dhcCEKKworCSogcHNpbS5jIChwc2ltX2NyZWF0ZSk6IE5vdCBjb3JyZWN0bHkgY2hlY2tpbmcgdGhhdCBydW50aW1lCisgCWNvbmZpZ3VyYXRpb24gb2YgdGhpbmdzIGxpa2UgRU5ESUFOLCBFTlZJUk9OTUVOVCBhbmQgQUxJR05NRU5UCisgCW1hdGNoZWQgdGhlIGNvbXBpbGVkIGluIG9uZXMuCisKKwkqIGRlYnVnLmggKElUUkFDRSksIGlnZW4uYzogVGlkeSB1cCBtb3JlIHRyYWNpbmcgZmxhZ3MgLQorIAl0cmFjZV9zZW1hbnRpY3MgaXMgbm93IGRpZmZlcmVudCB0byB0cmFjZV9pZGVjb2RlLCB0aGUgZm9ybWVyCisgCWNoZWNrcyB0aGUgY2FjaGUuCisJCitUdWUgT2N0IDI0IDIxOjU0OjEzIDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zIChtdHNyaW4pOiBNaXNzaW5nIGluc3RydWN0aW9uCisJKiBwcGMtaW5zdHJ1Y3Rpb25zIChtZnNyaW4pOiBNaXNzaW5nIGluc3RydWN0aW9uCisJKiBwcGMtaW5zdHJ1Y3Rpb25zIChlaWVpbyk6IE1pc3NpbmcgaW5zdHJ1Y3Rpb24KKworVHVlIE9jdCAyNCAyMDo1NToyOSAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogYnVpbGQtcHNpbTogTmV3IHNoZWxsIHNjcmlwdCAtIHNlZSBpbnRlcm5hbHMgZm9yIHVzYWdlLAorIAlzaW1wbGlmaWVzIHRoZSBwcm9jZXNzIG9mIGJ1aWxkaW5nIGN1c3RvbSBzaW11bGF0b3JzLgorCitNb24gT2N0IDIzIDIzOjQ4OjU5IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBzdGQtY29uZmlnLmggKFNFTUFOVElDU19JTkxJTkUpOiBUaWR5IHVwIG5vdGVzIG9uIGVhY2ggb2YgdGhlCisgICAgICAgIElOTElORSBtYWNyb3MuICBNYWtlIFNFTUFOVElDU19JTkxJTkUgPT0gMSBpZiBERUZBVUxUX0lOTElORSA9PSAyLgorICAgICAgICBEb24ndCB1c2UgREVGQVVMVF9JTkxJTkUgdG8gZGVmaW5lIFJFR0lTVEVSU19JTkxJTkUgREVWSUNFU19JTkxJTkUKKyAgICAgICAgREVWSUNFX1RSRUVfSU5MSU5FIG9yIElOVEVSUlVQVFNfSU5MSU5FIGFzIG5vbmUgb2YgdGhlc2UgYXJlIG9uCisgICAgICAgIHRoZSBpbnN0cnVjdGlvbiBvciBkYXRhIGNyaXRpY2FsIHBhdGhzLgorICAJCisJKiBGSVhNRTogZGV2aWNlcy5jL2VtdWxfbmV0YnNkLmMgd291bGQgYmVuZWZpdCAoc2xpZ2h0bHkpIGZyb20KKyAJdGhlIGluY2x1c2lvbiBvZiBkZXZpY2VfdHJlZS5jL2VtdWxfZ2VuZXJpYy5jLgorCitNb24gT2N0IDIzIDAwOjMxOjUwIDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBvc19lbXVsLltoY10sIGVtdWxfZ2VuZXJpYy5baGNdLCBlbXVsX25ldGJzZC5baGNdOiByZXBsYWNlCisgICAgICAgIHN5c3RlbS5baGNdLiAgU3RhcnQgb2Ygc3Vwb3J0IGZvciBtdWx0aXBsZSBlbXVsYXRpb25zIGFuZAorICAgICAgICBlbXVsYXRpb24gc3RhdGUgKG9zX2VtdWwgb2JqZWN0KS4KKworCSogZW11bF9nZW5lcmljLltoY106IFN0YXJ0IG9mIGNvZGUgdG8gaW1wbGVtZW50IHByb3BlciBzeXN0ZW0gY2FsbAorCXRyYWNpbmcgKGZyb20gc3B5KS4KKworU3VuIE9jdCAyMiAyMTozMzo1MSAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogY3B1LmgsIGNwdS5jIChjcHVfaW5pdCk6IE5ldyBmdW5jdGlvbiwgemVybyB0aGUgcmVnaXN0ZXJzIGJlZm9yZQorICAgICAgICB0aGUgcHJvY2Vzc29yIGlzIHN0YXJ0ZWQuIEZpeGVzIHByb2JsZW0gb2YgcmVnaXN0ZXJzIGJlaW5nCisgICAgICAgIHVuZGVmaW5lZCB3aGVuIHJlc3RhcnRpbmcgZnJvbSB3aXRoaW4gZ2RiLgorCisJKiBjcHUuaCwgY3B1LmMgKGNwdV9mbHVzaF9pY2FjaGUpOiBOZXcgZnVuY3Rpb24sIGZsdXNoZXMgdGhlCisgICAgICAgIGluc3RydWN0aW9uIGNhY2hlIChpZiBwcmVzZW50KS4gIEZpeGVzIHByb2JsZW0gb2YgY3B1IGNhY2hpbmcgZ2RiCisgICAgICAgIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb25zLgorCisJRklYTUU6IFBTSU0gc29tZXRpbWVzIGFib3J0cyBjYWxsaW5nIGVycm9yKCksIGl0IHNob3VsZCBpbnN0ZWFkCisgCWNhbGwgc2ltX2Vycm9yKCkgc2F5IHdoaWNoIHRha2VzIGNhcmUgb2YgaG91c2VrZWVwaW5nIHN1Y2ggYXMKKyAJc2F2aW5nIHRoZSBDSUEgYmVmb3JlIGNhbGxpbmcgZXJyb3IuCisJCisJKiBOT1RFOiBjcHVfZmx1c2hfY2FjaGUoKSBpbnN0ZWFkIG9mIGNwdV9zeW5jaHJvbml6ZV9jb250ZXh0KCkgaXMKKyAJdXNlZCB3aGVuIHJlc3RhcnRpbmcgYSBzaW11bGF0aW9uIGJlY2F1c2UgdGhlIGxhdHRlciBoYXMgdGhlCisgCXVud2FudGVkIHNpZGUgZWZmZWN0ICh3ZWxsIEkgYXMgYSBrZXJuZWwgaGFja2VyIHRoaW5rIGl0IGlzKSBvZgorIAlwZXJmb3JtaW5nIGFuIGlzeW5jIHdoZW4gdGhlIGluc3RydWN0aW9uIHN0cmVhbSBkb2Vzbid0IGNvbnRhaW4KKyAJb25lLgorCitTdW4gT2N0IDIyIDE5OjI3OjQ4IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBtb24uaCAobmV3KSwgbW9uLmMgKG5ldyksIHN0ZC1jb25maWcuaCAoV0lUSF9NT04pOiBQZXJmb3JtYW5jZQorICAgICAgICBtb25pdG9yaW5nIG1vZHVsZS4gQ291bnRzIGJvdGggaW5zdHJ1Y3Rpb25zIGlzc3VlZCBhbmQKKyAgICAgICAgbG9hZC9zdG9yZXMuCisKKwkqIE5PVEU6IG1vbiBkb2VzIG5vdCBjb250YWluIHRvIGNvdW50IGluc3RydWN0aW9uIGxvYWRzIGFzIHRoaXMKKyAJaW5mb3JtYXRpb24gaXMgYWxyZWFkeSBhdmFpbGFibGUgZnJvbSB0aGUgbW9uX2lzc3VlKCkgaG9vay4KKworCSogaWdlbi5jIChsZl9wcmludF9jX3NlbWFudGljKSwgdm1fbi5oOiBBZGQgY291bnRpbmcgY29kZS4KKworCSogcHNpbS5oLCBwc2ltLmMgKHBzaW1fY3JlYXRlKSwgY3B1LmgsIGNwdS5jIChjcHVfY3JlYXRlKTogQXR0YWNoCisgICAgICAgIGEgY29tbW9uIG1vbml0b3IgdG8gZWFjaCBvZiB0aGUgY3B1cy4gRGVsZXRlCisgICAgICAgIGNwdV9pbmNyZW1lbnRfbnVtYmVyX29mX2luc25zKCkgYW5kIGNwdV9nZXRfbnVtYmVyX29mX2luc25zKCkKKyAgICAgICAgcmVwbGFjZWQgYnkgY29waWVkIGNvZGUgaW4gbW9uLltoY10uCisKK1N1biBPY3QgMjIgMTg6NDI6NDUgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIHNpbV9jYWxscy5jLCBtYWluLmMsIHBzaW0uYyAocHNpbV9jcmVhdGUpOiBhbHdheXMgY3JlYXRlCisgICAgICAgIGBXSVRIX1NNUCcgY3B1cy4gIFRoZSBhY3R1YWwgbnVtYmVyIG9mIENQVSdzIGFjdGl2ZSBpbiBhCisgICAgICAgIHNpbXVsYXRpb24gcnVuIGlzIHRha2VuIGZyb20gdGhlIGRldmljZSBub2RlOiAvaW5pdC9zbXAgKGFuCisgICAgICAgIGludGVnZXIpLiBXSVRIX1NNUCBjaGFuZ2VkIHRvIDIgKHJlbWVtYmVyIHRvIHB1dCBpdCBiYWNrIHRvIDApLgorCitGcmkgT2N0IDIwIDE3OjI2OjU0IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBzeXN0ZW0uYzogTW9yZSBzeXN0ZW0gY2FsbCBlbXVsYXRpb24uICBJZiBjb2RlIGFwcGVhcnMgTmV0QlNECisgCXNwZWNpZmljLCBtYWtlIGNvbmRpdGlvbmFsIHRvIGJlaW5nIGNvbXBpbGVkIG9uIGEgTmV0QlNEIHN5c3RlbQorIAkoc2lnaCkuCisKK1dlZCBPY3QgMTggMjM6MDI6MjAgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisJCisJKiBNYWtlZmlsZS5pbiwgZ2VuLmMoZGVsZXRlKSwgaWdlbi5jKG5ldyksIGRnZW4uYyhuZXcpLAorIAlsZi5bY2hdKG5ldyksIHRhYmxlLltjaF0obmV3KTogU3BsaXQgaW50byB0d28gZ2VuZXJhdG9ycyAtIGlnZW4KKyAJdGhhdCBvdXRwdXRzIHRoZSBpbnN0cnVjdGlvbiB0YWJsZXMgYW5kIGRnZW4gdGhhdCBvdXRwdXRzIHRoZSBzcHIKKyAJdGFibGVzLiAgQWRkIC1mIChmaWx0ZXIgb3V0KSBmbGFnIHRvIGlnZW4gdG8gZmlsdGVyIG91dCBjZXJ0YWluCisgCWluc3RydWN0aW9ucyAoZXggNjQgYml0IG9uZXMpIGZyb20gdGhlIGNyZWF0ZWQgdGFibGVzLiAgSW5jbHVkZQorIAkkKExJQklCRVJUWV9MSUIpIGluIGxpbmsgb3B0aW9ucyBpbiBjYXNlIGhvc3QgbGFja3Mgc29tZSBsaWJjCisgCWZ1bmN0aW9ucy4KKworCSogTk9URTogaWdlbiwgc2luY2UgaXQgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBmb3IgdGhlCisgCVBvd2VyUEMvUlM2MDAwLCB0aGluZ3MgdGhlIE1TQiBpcyAwIGFuZCB0aGUgTFNCIGlzIDYzezMxfS4KKwkKKwkqIE1ha2VmaWxlLmluLCBzdGQtY29uZmlnLmgsIHBwYy1jYWNoZS1ydWxlcyhuZXcpLAorIAlwcGMtb3Bjb2RlLWNvbXBsZXgobmV3KSwgcHBjLW9wY29kZS1zaW1wbGUobmV3KTogKGZvciBpZ2VuKSBDcmVhdGUKKyAJY2FjaGUtcnVsZSBhbmQgb3Bjb2RlLXJ1bGUgdGFibGVzIGZyb20gbWFjcm9zIGZvdW5kIHN0ZC1jb25maWcuaC4KKyAJRGVsZXRlIGNvcnJlc3BvbmRpbmcgbWFjcm8ncyBmcm9tIHN0ZC1jb25maWcuaC4KKyAgCQorCSogaWdlbi5jIChnZW5faXRhYmxlX2MsIGdlbl9pdGFibGVfaCksIE1ha2VmaWxlLmluOiBjb2RlIHRvIG91dHB1dAorIAlhbiB0YWJsZSBvZiBhbGwgdGhlIGluc3RydWN0aW9ucy4gIENvZGUgdG8gb3V0cHV0IGEgdHlwZQorIAllbnVtZXJhdGluZyBhbGwgdGhlIGluc3RydWN0aW4gbmFtZXMuCisKKwkqIGlnZW4uYyhsZl9wcmludF9jX3NlbWFudGljKTogTW92ZSBjYWxsIHRvIGluY3JlbWVudCBpbnN0cnVjdGlvbgorIAljb3VudGVyIHNvIHRoYXQgaXQgb2NjdXJlcyBfYWZ0ZXJfIHRoZSBpbnN0cnVjdGlvbiBoYXMgYmVlbiBmdWxseQorIAl2YWxpZGF0ZWQsIHdhcyBkb3VibGUgY291bnRpbmcgaWxsZWdhbC9pbnZhbGlkIGluc3RydWN0aW9ucy4gIEFkZAorIAljb25kaXRpb25hbCBzbyBvbmx5IGNvbXBpbGVkIGluIHdoZW4gV0lUSF9QUk9GSUxFIGVuYWJsZWQgKGVuYWJsZWQKKyAJYnkgZGVmYXVsdCkuCisJCisJKiBpZ2VuLmMsIGNwdS5oLCBjcHUuYyhjcHVfaW5jcmVtZW50X251bWJlcl9vZl9pbnNucyk6IEluY2x1ZGUKKyAJaXRhYmxlLmgsIGNvdW50IGluZGl2aWR1YWwgaW5zdHJ1Y3Rpb24gdHlwZXMgbm90IGp1c3QgdG90YWwsCisgCWFkanVzdCByZXBvcnRpbmcgZnVuY3Rpb25zIHRvIG91dHB1dCB0aGlzLgorCQorCSogcHBjLWluc3RydWN0aW9ucyAoNjQgYml0IExvYWQgRG91Ymxld29yZCB3aXRoIFVwZGF0ZSBJbmRleGVkKToKKyAJSGFkIDMyLi8gaW5zdGVhZCBvZiAzMS4vCisKKwkqIHBwYy1pbnN0cnVjdGlvbnMgKDY0IGJpdCBTdG9yZSBEb3VibGUgV29yZCBDb25kaXRpb25hbCBJbmRleGVkKToKKyAJYml0cm90IC0gdXBkYXRlZCB0byB1c2UgbmV3ZXIgQ1IgcmVnaXN0ZXIgb3BlcmF0b3JzLgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zICg2NGJpdCBGbG9hdGluZyBDb252ZXJ0IGZyb20gSW50ZWdlcgorIAlEb3VibGV3b3JkKTogQ29ycmVjdCBjYWxsIHRvIFJvdW5kX0Zsb2F0KCkuCisKK01vbiBPY3QgMTYgMDA6MzE6MjAgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIGJhc2ljcy5oOiAjaW5jbHVkZSAic2ltX2NhbGxiYWNrcy5oIiBlYXJsaWVyIHNvIHRoYXQgaXRzCisgCXByb3RvdHlwZXMgYXJlIGRlY2xhcmVkIGluIGFsbCBvdGhlciBoZWFkZXIgZmlsZXMuCisKKwkqIGJpdHMuaCwgYml0cy5jLCBpZGVjb2RlX2V4cHJlc3Npb24uaCAoUk9UTDMyLCBST1RMNjQpOiBVcGRhdGUKKyAJZG9jIGluIGJpdHMuaCwgcmVtb3ZlIGRlYWQgY29kZSBpbiBiaXRzLmMsIG1vdmUgUk9UTDMyL1JPVEw2NCBpbnRvCisgCWJpdHMuaC4KKworCSogY3B1LmMoY3B1X2FkZF9jb21tYXMpLCBkZXZpY2VfdHJlZS5oLCBkZXZpY2VfdHJlZS5jKHNjYW5kXyopOgorIAlBZGQgc2l6ZSBvZiBidWZmZXIgYXJndW1lbnQgdG8gZnVuY3Rpb25zIHdyaXRpbmcgYSBzdHJpbmcgaW50byBhCisgCWJ1ZmZlci4gIENoZWNrIGZvciBidWZmZXIgb3ZlcmZsb3cuCisJCitTdW4gT2N0IDE1IDIyOjE2OjExIDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBkZXZpY2VzLmgsIGRldmljZXMuYywgZGVidWcuaCwgZGVidWcuYzogYWRkIG1hY3JvJ3MgZm9yIHRyYWNpbmcKKyAgICAgICAgb2YgZWFjaCBkZXZpY2UuICBNYWtlIHBhcmFtZXRlciBuYW1lcyBjb25zaXN0ZW50IHNvIG1hY3JvcyB3b3JrLgorICAgICAgICBVc2UgbWFjcm8ncyBpbiBkZXZpY2UgZnVuY3Rpb25zLgorCisJKiBkZXZpY2VfdHJlZS5jLCBkZXZpY2VzLmgsIGRldmljZXMuYzogaW5jbHVkZSBwYXRoIHRvIGRldmljZSBpbiBhCisgICAgICAgIGRldmljZXMgbm9kZSB3aGVuIGNyZWF0aW5nIGl0LgorCisJKiBkZXZpY2VfdHJlZS5jLCBkZWJ1Zy5oLCBkZWJ1Zy5jOiBBZGQgdHJhY2luZyBvZiBgZGV2aWNlLXRyZWUnLgorCisJKiBjb3JlLmM6IGFkZCB0cmFjaW5nIG9mIGNvcmUtZGV2aWNlLCBhZGp1c3QgcGFyYW1ldGVyIG5hbWVzIGluCisgCWNvcmUgZnVuY3Rpb25zIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aG9zZSBpbiBkZXZpY2VzKi4KKworU3VuIE9jdCAxNSAyMDozMzoyMCAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgICAgICAqIGRlYnVnLmgsIGRlYnVnLmMgKHRyYWNlX29wdGlvbik6IE5ldyBmdW5jdGlvbi4gUGFyc2VzIHRoZSB0cmFjZQorICAgICAgICBvcHRpb24sIHVwZGF0aW5nIHRoZSB0cmFjZSBhcnJheS4KKworCSogZGVidWcuaCwgZGVidWcuYyAodHJhY2VfdXNhZ2UpOiBOZXcgZnVuY3Rpb24uIE91dHB1dHMgdGhlIGxpc3QKKyAgICAgICAgb2YgYWxsIHBvc3NpYmxlIHRyYWNlIG9wdGlvbnMuCisKKwkqIHNpbV9jYWxscy5jIChzaW1fb3BlbiksIG1haW4uYyAobWFpbik6IFVzZSBuZXcgdHJhY2Vfb3B0aW9uKCkgdG8KKyAJcGFyc2UgdHJhY2Ugb3B0aW9ucyBzcGVjaWZpZWQgd2l0aCB0aGUgc2ltcGxlciAtdCBmbGFnLiAgQWRqdXN0CisgCXVzYWdlLgorCisJKiBGSVhNRTogYmFzaWMgcGFyc2luZyBvZiBjb21tYW5kIGxpbmUgb3B0aW9ucyBpcyBzdGlsbCBkdXBsaWNhdGVkCisgCWJ5IG1haW4uYyBhbmQgc2ltX2NhbGxzLmMKKworVGh1IE9jdCAyNiAxMDo0MjoyOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChjbGVhbik6IERlbGV0ZSAqLmkgYW5kICoub3V0IGZpbGVzLgorCisJKiBwcGMtZW5kaWFuLmMgKFNXQVBfbik6IEFkZCBTRVQgYXJndW1lbnQgdG8gYWxsb3cgdXNlIG9mIFNXQVAKKwltYWNyb3MgZm9yIGVpdGhlciBhc3NpZ25tZW50IG9yIHJldHVybi4gIEZpeCBTV0FQXzggdG8gdXNlIGEKKwl1bmlvbiwgYW5kIHR3byBTV0FQXzQncy4gIERlbGV0ZSBTV0FQX04sIHNpbmNlIG5vYm9keSB1c2VzIGl0IG5vdy4KKwkoRU5ESUFOX04pOiBBZGQgU0VUIGFyZ3VtZW50IHRvIFNXQVBfbiBjYWxscy4gIERlbGV0ZSBtYWNybyBkZWZzCisJdGhhdCBoYXJkd2lyZWQgc3dhcHBpbmcgb24vb2ZmLCBsZXQgb3B0aW1pemVyIGRlbGV0ZSBkZWFkIGNvZGUuCisKKwkqIG1haW4uYyAobWFpbik6IEFkZCBwcmludGYgdGhhdCB3ZSBjYXVnaHQgYSBzaWduYWwgYW5kIHByaW50IG91dAorCXRoZSBmYWlsaW5nIGFkZHJlc3MuCisKK1RodSBPY3QgMTkgMjE6NDM6MzkgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGZpc2hmb29kLmFtaWdhbGliLmNvbT4KKworCSogTWFrZWZpbGUuaW46ICBSZW1vdmUgdGFicyBmcm9tIG90aGVyd2lzZSBlbXB0eSBsaW5lLgorCUNvbmZ1c2VzIG1hbnkgbm9uLUdOVSB2ZXJzaW9ucyBvZiAibWFrZSIuCisKK1dlZCBPY3QgMTggMDg6NTE6MjUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiBEZWxldGUgZmlsZXMgcHJvZHVjZWQgYnkgZ2VuLgorCitNb24gT2N0IDE2IDE3OjM0OjI0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZ2VuLmMgKGxmX3ByaW50X2Nfc2VtYW50aWNfZnVuY3Rpb24pOiBNb3ZlIGNvdW50aW5nICMgb2YKKwlpbnN0cnVjdGlvbnMgaGVyZSBzbyBpdCB3b3JrcyB3aXRoIGNhY2hpbmcuCisJKGdlbl9pZGVjb2RlX2MpOiBNb3ZlIGZyb20gaGVyZS4KKworV2VkIE9jdCAxMSAxNzoxMzoxNSAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogZ2VuLmMsIHBwYy1pbnN0cnVjdGlvbnMsIHBzaW0uYzogRml4IGNvZGUgZm9yIGdlbmVyYXRpbmcKKwljcmFja2luZyBpbnN0cnVjdGlvbiBjYWNoZS4gIERlbGV0ZSB0aGUgY29kZSB0aGF0IGNhY2hlZCBqdXN0IHRoZQorCXJlc3VsdCBmcm9tIGRvaW5nIGFuIGluc3RydWN0aW9uIGxvb2t1cCAtIHRoaXMgcmFuIHNsb3dlciB0aGFuIG5vCisJY2FjaGUgYXQgYWxsLgorCitGcmkgT2N0IDEzIDA5OjU4OjQzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGdlbi5vKTogSW5jbHVkZSAkKElOTElORV9DRkxBR1MpLgorCisJKiBkZWJ1Zy5oIChwcGNfdHJhY2UpOiBSZW5hbWUgZnJvbSB0cmFjZSwgdG8gYXZvaWQgYSBjb25mbGljdCB3aXRoCisJVENMIHdoZW4gZ2RiIGlzIGxpbmtlZCB3aXRoIHRoZSBzaW11bGF0b3IuCisJKiBkZWJ1Zy5jIChwcGNfdHJhY2UpOiBEaXR0by4KKwkqIHNpbV9jYWxscy5jIChzaW1fb3Blbik6IENoYW5nZSB0cmFjZSAtPiBwcGNfdHJhY2UuCisJKiBtYWluLmMgKG1haW4pOiBEaXR0by4KKworCSogY3B1LmMgKGNwdV9hZGRfY29tbWFzKTogUmVtb3ZlIGV4dHJhIHN0YXRpYy4KKworVGh1IE9jdCAxMiAxMTozNTo1MyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChwc2ltLm8pOiBOb3cgdGhhdCBpbmxpbmVzIGFyZSB0dXJuZWQgb24sIG1ha2UKKwlwc2ltLm8gZGVwZW5kIG9uIGFsbCBzb3VyY2VzLgorCisJKiBjcHUuYyAoY3B1X2FkZF9jb21tYXMpOiBOZXcgZnVuY3Rpb24gdG8gZm9ybWF0IGEgbG9uZyB3aXRoCisJY29tbWFzLgorCShjcHVfcHJpbnRfaW5mbyk6IFVzZSBpdCB0byBwcmludCBudW1iZXJfb2ZfaW5zbnMuCisJCisJKiBwcGMtZW5kaWFuLmMgKFNXQVBfbik6IE5ldyBtYWNyb3MgdG8gc3BlZWQgdXAgYnl0ZSBzd2FwcGluZyBmb3IKKwkyLCA0LCBhbmQgOCBieXRlcy4KKwkoRU5ESUFOX04pOiBJZiBib3RoIHRhcmdldCBhbmQgaG9zdCBieXRlIG9yZGVycyBhcmUga25vd24sIGRvbid0CisJYm90aGVyIHRlc3RpbmcgQ1VSUkVOVF97VEFSR0VULEhPU1R9X0JZVEVfT1JERVIuCisKKwkqIHBwYy1lbmRpYW4uaCAodGFyZ2V0IHNwZWNpZmljIEgyVF9uL1QySF9uIG1hY3Jvcyk6IFJlbW92ZSAjaWYgMAorCXRvIGFsbG93IHRhcmdldCBzcGVjaWZpYyBIMlRfbi9UMkhfbiBtYWNyb3MgdG8gYmUgdXNlZC4KKwkoaHRvbmwsIG50b2hsKTogSWYgY29tcGlsZWQgb24gYSA0ODYgYnkgR0NDIGFuZCBXSVRIX0JTV0FQIGlzCisJbm9uLXplcm8sIHJlZGVmaW5lIHRoZSBodG9ubC9udG9obCBtYWNyb3MgdG8gdXNlIHRoZSBCU1dBUCBpbnN0ZWFkCisJb2YgdGhlIDMgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgdGhhdCBydW5zIG9uIDM4NnMuCisKKwkqIHN0ZC1jb25maWcuaCAoV0lUSF97SE9TVCxUQVJHRVR9X0JZVEVfT1JERVIpOiBEb24ndCBvdmVycmlkZSBpZgorCXNwZWNpZmllZCBvbiB0aGUgY29tcGlsZSBsaW5lLgorCShXSVRIX0JTV0FQKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAwLgorCisJKiBNYWtlZmlsZS5pbiAoSU5MSU5FX0NGTEFHUyk6IEFkZCAtRERFRkFVTFRfSU5MSU5FPTIgdG8gYWRkCisJZGVmYXVsdCBpbmxpbmUgc3VwcG9ydC4gIFBhc3MgSU5MSU5FX0NGTEFHUyB3aGVuIGNvbXBpbGluZy4KKworCSogZGV2aWNlcy57aCxjfSAodW5pbXBfZGV2aWNlX2lvY3RsKTogVXNlIFNUQVRJQ19ERVZJQ0VTLCBub3QKKwlJTkxJTkVfREVWSUNFUyBzaW5jZSBHQ0MgZG9lc24ndCBsaWtlIGlubGluZSBmdW5jdGlvbnMgdGhhdAorCWFjY2VwdCB2YXJpYWJsZSBhcmd1bWVudHMuCisJKHN0YWNrX2lvY3RsX2NhbGxiYWNrKTogTWFrZSBmdW5jdGlvbiBqdXN0IHN0YXRpYyBiZWNhdXNlIEdDQworCWRvZXNuJ3QgbGlrZSBpbmxpbmUgZnVuY3Rpb25zIHRoYXQgYWNjZXB0IHZhcmlhYmxlIGFyZ3VtZW50cy4KKworCSogZGV2aWNlcy5oIChTVEFUSUNfREVWSUNFUyk6IERlZmluZSBhcyBlbXB0eSBpZiBub3QgZGVmaW5lZC4KKworCSogaW5saW5lLmM6IENvcnJlY3QgcGF0aG5hbWVzIG9mIGluY2x1ZGVkIEMgZmlsZXMgdG8gbWF0Y2ggY3VycmVudAorCWltcGxlbWVudGF0aW9uLgorCisJKiBpbmxpbmUuaCAoU1RBVElDX0RFVklDRVMpOiBJZiBERVZJQ0VTX0lOTElORSBpcyBkZWZpbmVkIHRvIGJlCisJbm9uLXplcm8sIGRlZmluZSBTVEFUSUNfREVWSUNFUyB0byBiZSBzdGF0aWMuCisKKwkqIHN0ZC1jb25maWcuaCAoSU5MSU5FKTogSWYgR05VIEMgYW5kIG9wdGltaXppbmcsIGRlZmluZSB0aGlzIGFzCisJX19pbmxpbmVfXy4KKwkoREVGQVVMVF9JTkxJTkUpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIDAuCisJKEVORElBTl9JTkxJTkUpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIERFRkFVTFRfSU5MSU5FLgorCSh7Q09SRSxWTSxDUFUsRVZFTlRTLFJFR0lTVEVSUyxJTlRFUlJVUFRTfV9JTkxJTkUpOiBEaXR0by4KKwkoe1NQUkVHLElERUNPREV9X0lOTElORSk6IERpdHRvLgkKKwkKK1dlZCBPY3QgMTEgMTc6MTM6MTUgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICAgICAgKiBwcGMtaW5zdHJ1Y3Rpb25zOiBJbml0aWFsIGN1dCBvZiBmbG9hdGluZyBwb2ludCBzdXBvcnQgYWRkZWQuCisgIAlPZiBub3RlIGluY2x1ZGUgLSB1c2Ugb2YgaG9zdCBJRUVFIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucywKKyAJdXNlIG9mIFBvd2VyUEMgbWFudWFsIHBzZXVkbyBjb2RlIHRvIGhhbmRsZSB0aGUgRlBTQ1IuICBJdCBpcyBub3QKKyAJY3VycmVudGx5IGEgcHJldHR5IHNpZ2h0LgorCQorCSogbWVtb3J5X21hcC5oLCBtZW1vcnlfbWFwLmMsIG1lbW9yeV9tYXBfbi5oLCBjb3JlLmgsIGNvcmUuYzoKKyAJbWVyZ2UgaW50byBjb3JlLmgsIGNvcmUuYywgY29yZV9uLmguIFRoZSB0eXBlIG1lbW9yeV9tYXAgcmVwbGFjZWQKKyAJd2l0aCBjb3JlX21hcC4gIFRoaXMgcmVtb3ZlcyBhIGxldmVsIG9mIHBvaW50ZXIgaW5kaXJlY3Rpb24gd2hlbgorIAl0cmFuc2xhdGluZyBhbiBhZGRyZXNzLgorCisJKiBtZW1vcnlfbWFwLmgsIG1lbW9yeV9tYXAuYywgbWVtb3J5X21hcF9uLmg6IGRlbGV0ZS4KKworCSogTWFrZWZpbGUuaW4gZXQuYWwgKHNvcnJ5KTogdHdlZWsgdG8gdXNlIG5ldyBjb3JlLCBjb3JlX21hcCBhbmQKKyAJY29yZS5oLgorCQorV2VkIE9jdCAxMSAxMjoxMDoyNiAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogc2ltX2NhbGxzLmMsIG1haW4uYzogQWRkIC1nICh0cmFjZV9nZGIpIG9wdGlvbiwgYWRkIHRyYWNpbmcgdG8KKyAJbW9zdCBvZiB0aGUgb3RoZXIgZnVuY3Rpb25zIGluIHNpbV9jYWxscy5jLgorCisJKiBiYXNpY3MuaCAoQ09OQ0FUMyksIG1lbW9yeV9tYXAuYywgbWVtb3J5X21hcF9uLmgsIE1ha2VmaWxlLmluOgorIAlBZGQgbWFjcm9zIHRvIGJldHRlciBjb3ZlciB1cCBgZ2VuZXJpYycgY29kZS4gIE1ha2VzIGl0IHBvc3NpYmxlCisgCXRvIHN0ZXAgdGhyb3VnaCB0aGUgZ2VuZXJpYyBjb2RlIQorCisJKiB2bS5jLCB2bV9uLmgsIE1ha2VmaWxlLmluOiBkaXR0bworCQorVHVlIE9jdCAxMCAxNTo0Mjo1OSAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogZGV2aWNlcy5oLCBkZXZpY2VzLmMsIG1lbW9yeV9tYXAuaCwgbWVtb3J5X21hcC5jOiBDaGFuZ2VkCisgCWNhbGxiYWNrIGludGVyZmFjZSBzbyB0aGF0IHRoZXJlIGlzIGEgcmVhZC93cml0ZSBidWZmZXIgYnV0IG5vCisgCXJlYWQvd3JpdGVfd29yZC4gIFZFQSBkZWZhdWx0IG1lbW9yeSByZWFkL3dyaXRlIGhhbmRsZXIgc29tZXRpbWVzCisgCWNvdWxkbid0IHJlc29sdmUgYW4gYWNjZXNzIGFuZCBvZiB0aG9zZSBzb21lIHdlcmUgZm9yIGEgbWVtb3J5CisgCWZhdWx0IGFuZCBzb21lIHdlcmUgYmVjYXVzZSBnZGIgd2FzIG1ha2luZyBhIGJvZ3VzIHJlcXVlc3QuCisKKwkqIGRldmljZXMuaCwgZGV2aWNlcy5jLCBtZW1vcnlfbWFwLmgsIG1lbW9yeV9tYXAuYywgdm0uaCwgdm0uYzoKKyAJZWxpbWluYXRlIHRyYW5zZmVyX21vZGUgKHJhdyBvciBjb29rZWQpIHBhcmFtZXRlciBmcm9tIHJlYWQvd3JpdGUKKyAJYnVmZmVyLgorCQorRnJpIE9jdCAgNiAyMDoyMzo1NiAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogcHBjLWluc3RydWN0aW9ucyAoZm11bCwgZm11bHMpOiBjb3JyZWN0IGluc3RydWN0aW9uIGZvcm1hdCAtIGhhZAorIAlGUkIgaW5zdGVhZCBvZiBGUkMuCisKK1dlZCBPY3QgIDQgMTc6MzE6MTIgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIHBzaW0uYywgZGV2aWNlX3RyZWUuaCwgZGV2aWNlX3RyZWUuYywgZGV2aWNlcy5jIChwcmludGRfKiwKKyAJc2NhbmRfKik6IG5ldyBmdW5jdGlvbnMgdG8gcGFyc2UvcHJpbnQgZmllbGRzIGluIGRldmljZSBuYW1lcworIAl3aGlsZSBoaWRpbmcgYW55IG1hY2hpbmUgZGVwZW5kZW5jeS4KKworCSogZGV2aWNlcy5jLCBwc2ltLmM6IENoYW5nZSB0aGUgc3RhY2sgaW5pdCBjb2RlIHNvIHRoYXQgaXQgaXMKKyAJaGFuZGxlZCBieSBhIGRldmljZS4gIEFyZ3VtZW50cyBwYXNzZWQgYWNyb3NzIHVzaW5nIGEgZGV2aWNlIGlvY3RsCisgCShoYWNrKS4KKworCSogZGV2aWNlcy5oLCBkZXZpY2VzLmM6IGRldmljZSBpb2N0bCBjYWxsYmFjayBjaGFuZ2VkIHRvIGFsbG93IGEKKyAJdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIFRoaXMgZ2l2ZXMgZ3JlYXRlciBmbGV4YWJpbGl0eSBhbmQKKyAJZ3JlYXRlciBjaGFuY2Ugb2YgYnVncy4KKworVHVlIE9jdCAgMyAyMjowMTo1NiAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogbWFpbi5jIChwcmludGZfZmlsdGVyZWQsIGVycm9yKTogTWlzc2luZyB2YV9lbmQoKSB0byBjbG9zZSBvZmYKKyAgICAgICAgdmFyaWFibGUgYXJndW1lbnQgdXNlLgorCisJKiBNYWtlZmlsZS5pbiAodG1wLWdlbmNvZGUpOiBjb21tZW50IG91dCBoYWNrIHRvIGdldCBhcm91bmQgc29tZQorICAgICAgICB2ZXJzaW9ucyBvZiBtYWtlIG5vdCBoYW5kbGluZyBmaWxlcyBiZWluZyBjcmVhdGVkIGFzIHNpZGUtZWZmZWN0cy4KKworCSogZ2VuLmMgKGxmX29wZW4pOiBBZGQgLW4gKHJlYWxfZmlsZV9uYW1lKSBvcHRpb24uICBTcGVjaWZpZXMgYW4KKyAgICAgICAgYWx0ZXJuYXRpdmUgZmlsZSBuYW1lIHRvIHVzZSBpbiBvdXRwdXQgZmlsZXMgZm9yIHRoaW5ncyBsaWtlICNsaW5lCisgICAgICAgIG1hY3Jvcy4KKworICAgICAgICBNYWtlZmlsZS5pbiAodG1wLWdlbmNvZGUpOiBVc2UgZ2VuIC1uIHNvIHRoYXQgZGVidWcgaW5mbyBpcworICAgICAgICBjb3JyZWN0LgorCisJKiBNYWtlZmlsZS5pbiAoVEFSR0VUTElCKTogVXNlIHRoaXMgaW5zdGVhZCBvZiBsaWJzaW0uYSBpbiB0aGUKKwlNYWtlZmlsZS4KKworU2F0IE9jdCAgNyAyMjo0MDo1OSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHNpbV9jYWxscy5jIChzaW1fc2V0X2NhbGxiYWNrcyk6IERlZmluZSBuZXcgZnVuY3Rpb24uCisKK0ZyaSBPY3QgIDYgMTc6MjM6MTAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBwc2ltLmMgKHBzaW1fcHJpbnRfaW5mbyk6IFByaW50IGV4aXQgc3RhdHVzIG9yIHNpZ25hbCBudW1iZXIuCisKK01vbiBPY3QgIDIgMTE6NDY6MzcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBjcHUuYyAoc3RydWN0IF9jcHUpOiBBZGQgbnVtYmVyX29mX2luc25zIGZpZWxkIHRvIHRyYWNlIGhvdyBtYW55CisJaW5zdHJ1Y3Rpb25zIGFyZSBleGVjdXRlZC4KKwkoY3B1X2luY3JlbWVudF9udW1iZXJfb2ZfaW5zbnMpOiBOZXcgZnVuY3Rpb24gdG8gaW5jcmVtZW50IHRoZQorCW51bWJlciBvZiBpbnN0cnVjdGlvbnMgaXNzdWVkLgorCShjcHVfZ2V0X251bWJlcl9vZl9pbnNucyk6IE5ldyBmdW5jdGlvbiB0byByZXR1cm4gdGhlIG51bWJlciBvZgorCWluc3RydWN0aW9ucyBpc3N1ZWQuCisJKGNwdV9wcmludF9pbmZvKTogTmV3IGZ1bmN0aW9uIHRvIHByaW50IGNwdSByZWxhdGVkIGluZm9ybWF0aW9uLgorCUF0IHByZXNlbnQsIHByaW50IHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkLgorCisJKiBnZW5faWRlY29kZV9jOiBFbWl0IGNhbGwgdG8gY3B1X2luY3JlbWVudF9udW1iZXJfb2ZfaW5zbnMgd2l0aGluCisJaWRlY29kZV9pc3N1ZS4KKworCSogcHNpbS5jIChwc2ltX3ByaW50X2luZm8pOiBOZXcgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGVhY2ggb2YKKwl0aGUgQ1BVJ3MgY2FsbGluZyBjcHVfcHJpbnRfaW5mby4KKwkKKwkqIHBzaW0uaCxjcHUuaDogQWRkIG5ldyBkZWNsYXJhdGlvbnMuCisKKwkqIHNpbV9jYWxscy5jIChzaW1fb3Blbik6IEFkZCBhcmd1bWVudCBwcm9jZXNzaW5nIHRvIGFkZCB0aGUgc2FtZQorCXN3aXRjaGVzIG1haW4uYyBhY2NlcHRzIGZvciB0aGUgc3RhbmRhbG9uZSBwcm9jZXNzb3IuCisJKHNpbV9jbG9zZSk6IENhbGwgcHNpbV9wcmludF9pbmZvIGlmIC1JLgorCisJKiBtYWluLmMgKG1haW4pOiBBZGQgY29tbWVudCBzYXlpbmcgdG8gdXBkYXRlIHNpbV9jYWxscy5jIHdoZW4KKwlhZGRpbmcgc3dpdGNoZXMuICBBZGQgLUkgdG8gY2FsbCBwc2ltX3ByaW50X2luZm8gd2hlbiBkb25lLgorCSh1c2FnZSk6IFVwZGF0ZSB1c2FnZSBtZXNzYWdlLgorCitTdW4gT2N0ICAxIDEzOjUyOjU5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogbWFpbi5jIChwcmludGZfZmlsdGVyZWQpOiBDb3JyZWN0IHRvIG1hdGNoIG5ldyBwcm90b3R5cGUuCisKK1NhdCBTZXAgMzAgMjA6NDc6MDUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBzaW1fY2FsbGJhY2tzLmggKHByaW50Zl9maWx0ZXJlZCk6IENvcnJlY3QgcHJvdG90eXBlLgorCitUaHUgU2VwIDIxIDE2OjI2OjQ5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogZGV2aWNlX3RyZWUuYyAoT0VBX01FTU9SWV9TSVpFKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkIHRvCisJMHgxMDAwMDAuCisJKGNsYXl0b25fbWVtb3J5X3NpemUpOiBEZWZpbmUgYXMgT0VBX01FTU9SWV9TSVpFLgorCisJKiBzdGQtY29uZmlnLmggKFdJVEhfVFJBQ0UpOiBEZWZhdWx0IHRvIDEgbm93LgorCisJKiBwc2ltLmMgKHdyaXRlX3N0YWNrX2FyZ3VtZW50cyk6IERvbid0IHdyaXRlIGFueSBzdGFjayBhcmd1bWVudHMKKwlpZiBPRUEuCisKKwkqIG1haW4uYyAobWFpbik6IFN3aXRjaCB0byB1c2luZyBnZXRvcHQuICBNYWtlIC1wIGFsc28gc2V0CisJdHJhY2Vfc2VtYW50aWNzLiAgTWFrZSAtYSB0dXJuIG9uIGFsbCB0cmFjZSBmbGFncy4gIE1ha2UgLUMgdHVybgorCW9uIGNvbnNvbGUgdHJhY2luZy4KKworCSogZGV2aWNlX3RyZWUuYyAoY3JlYXRlX29wdGlvbl9kZXZpY2Vfbm9kZSk6IEFzc3VtZSBhIHByb2dyYW0gaXMKKwlPRUEgaWYgdGhlIHN0YXJ0IGFkZHJlc3MgaXMgPCA0MDk2LCBub3QganVzdCA9PSAwLgorCitXZWQgU2VwIDIwIDEzOjM2OjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgc3lub255bSBmb3IgcmVhbGNsZWFuLgorCitTdW4gU2VwIDEwIDEwOjIzOjU2IDE5OTUgIE1pY2hhZWwgVGllbWFubiAgPHRpZW1hbm5AYXhvbi5jeWdudXMuY29tPgorCisJKiByZWdpc3RlcnMuYyAocmVnaXN0ZXJfZGVzY3JpcHRpb24pOiBBZGQgZ2RiIHN5bm9ueW1zIGZvciBjcgorCShjbmQpIGFuZCBtc3IgKHBzKS4KKworRnJpIFNlcCAgOCAxMzoxNjoxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgaW5zdGFsbCBpbiAkKHRvb2xkaXIpLgorCisJKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUi4gIERvbid0IHRyeSB0byB1c2UKKwliZmQvaG9zdHMvKi5oIGZpbGUgb3IgYmZkL2NvbmZpZy8qLm1oIGZpbGUuICBDYWxsIEFDX1BST0dfQ0MgYW5kCisJQUNfUFJPR19SQU5MSUIuICBTdWJzdGl0dXRlIGluIHZhbHVlcyBmb3IgQ0ZMQUdTLCBIREVGSU5FUywgQVIsCisJYW5kIENDX0ZPUl9CVUlMRC4gIENhbGwgQUNfQ0hFQ0tfSEVBREVSUyBmb3IgdmFyaW91cyBoZWFkZXIgZmlsZXMuCisJVG91Y2ggc3RhbXAuaCBpZiBjcmVhdGluZyBjb25maWcuaC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIGNvbmZpZy5pbjogTmV3IGZpbGUsIGNyZWF0ZWQgYnkgYXV0b2hlYWRlci4KKwkqIE1ha2VmaWxlLmluIChBUik6IERlZmluZSBhcyBAQVJALgorCShDQyk6IE5ldyB2YXJpYWJsZSwgZGVmaW5lZCBhcyBAQ0NALgorCShDRkxBR1MpOiBEZWZpbmUgYXMgQENGTEFHU0AuCisJKENDX0ZPUl9CVUlMRCk6IE5ldyB2YXJpYWJsZSwgZGVmaW5lZCBhcyBAQ0NfRk9SX0JVSUxEQC4KKwkoUkFOTElCKTogRGVmaW5lIGFzIEBSQU5MSUJALgorCShIREVGSU5FUywgVERFRklORVMpOiBOZXcgdmFyaWFibGVzLgorCShAaG9zdF9tYWtlZmlsZV9mcmFnQCk6IFJlbW92ZS4KKwkobW9zdGx5Y2xlYW4pOiBNYWtlIHRoZSBzYW1lIGFzIGNsZWFuLCBub3QgZGlzdGNsZWFuLgorCShjbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgorCShkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmggYW5kIHN0YW1wLWguCisJKE1ha2VmaWxlKTogRG9uJ3QgZGVwZW5kIHVwb24gQGZyYWdzQC4gIEp1c3QgcmVidWlsZCBNYWtlZmlsZSB3aGVuCisJaW52b2tpbmcgY29uZmlnLnN0YXR1cy4KKwkoY29uZmlnLmgsIHN0YW1wLWgpOiBOZXcgdGFyZ2V0cy4KKwkoZ2VuLCBnZW4ubyk6IEJ1aWxkIHdpdGggQ0NfRk9SX0JVSUxELCBub3QgQ0MuCisJKHBwYy1jb25maWcuaCk6IFJlbmFtZSBmcm9tIG9sZCBjb25maWcuaCBidWlsZC4KKwkqIChiYXNpY3MuaCxnZW4uYyxwcGMtZW5kaWFuLmMscHNpbS5jKTogSW5jbHVkZSBwcGMtY29uZmlnLmguCisJCitGcmkgU2VwICA4IDA5OjUxOjAzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJleywuaW59OiBEb24ndCBpbmNsdWRlIHN5c2RlcC5oIGZyb20gYmZkLCBzaW5jZSBiZmQgbm8KKwlsb25nZXIgcHJvdmlkZXMgaXQuCisJKiBiYXNpY3MuaCAoc3lzZGVwLmgpOiBEb24ndCBpbmNsdWRlIGl0LgorCSogTWFrZWZpbGUuaW4gKEJBU0lDU19IKTogUmVtb3ZlIHN5c2RlcC5oLgorCitXZWQgU2VwICA2IDEzOjI1OjQyIDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorIAorIAkqIGNvcmUuYyAoY29yZV9hZGRfZGF0YSk6IEZpcnN0IGdyb3d0aCBvZiBic3Mgd2FzIGJlaW5nIHB1dCBhdAorICAgICAgICB3cm9uZyBhZGRyZXNzICgwKSBpbnN0ZWFkIG9mICZlbmQuCisgCisgCSogY29yZS5jIChjb3JlX2FkZF9zdGFjaywgY29yZV9hZGRfZGF0YSk6IFdhcyBub3QgaGFuZGxpbmcgY2FzZQorICAgICAgICB3aGVyZSBic3Mvc3RhY2sgaXMgZ3Jvd24gYWNyb3NzIHRoZSBjdXJyZW50IGVuZC1vZi17YnNzLHN0YWNrfS4KKworV2VkIFNlcCAgNiAwMDo0NjoxMCAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogc3lzdGVtLmMgKHN5c3RlbV9jYWxsKTogRml4IFNZU19icmVhayAtIHdhcyBhbGlnbmluZyBic3MgdG8gYQorICAgICAgICBwYWdlIGJvdW5kYXJ5IGluc3RlYWQgb2YganVzdCBhbiA4IGJ5dGUgb25lOyBPbiBmaXJzdCBjYWxsIHNicmsoMCkKKyAgICAgICAgIT0gc2JyaygwKS4KKworVGh1IEF1ZyAyNCAxNDo0ODo1NCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRml4IGluc3RhbGwgcnVsZS4KKworVHVlIEF1ZyAyMiAwOTozMToxOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHN5c3RlbS5jIChzeXN0ZW1fY2FsbCk6IEFkZCByZWFkIHN1cHBvcnQuCisKKwkqIG1haW4uYyAobWFpbik6IC10IHNldHMgdHJhY2VfZGV2aWNlX3RyZWUuICBDb3JyZWN0IHVzYWdlIG1lc3NhZ2UKKwl0byBjdXJyZW50IHJlYWxpdHkuCisKKwkqIGRldmljZV90cmVlLmMgKHVwZGF0ZV9tZW1vcnlfbm9kZV9mb3Jfc2VjdGlvbik6IE1ha2UgdHJhY2luZworCW91dHB1dCBsaW5lIHVwLiAgSWYgbm90IGNvZGUgb3IgcmVhZG9ubHksIGFzc3VtZSB0aGF0IHRoZSBzZWN0aW9uCisJaXMgYSBkYXRhIHNlY3Rpb24gYW5kIGhhcyByZWFkL3dyaXRlIHBlcm1pc3Npb25zLiAgQWRkIHJlYWRvbmx5CisJc3VwcG9ydC4KKworCSogY29yZS5jIChjcmVhdGVfY29yZV9mcm9tX2FkZHJlc3Nlcyk6IFByaW50IGVuZCBhZGRyZXNzIGluIHRyYWNlcworCWFuZCBtYWtlIHRyYWNpbmcgb3V0cHV0IGxpbmUgdXAuCisKKwkqIE1ha2VmaWxlLmluOiBSZXdyaXRlIGZyb20gTWFrZWZpbGUgdG8gd29yayB3aXRoIHRoZSBDeWdudXMKKwllbnZpcm9ubWVudCwgYW5kIHN1cHBvcnQgY29tcGlsaW5nIGluIGEgZGlmZmVyZW50IGRpcmVjdG9yeSB0aGFuCisJdGhlIHNvdXJjZXMgcmVzaWRlIGluLgorCisJKiBwcGMtZW5kaWFuLmg6IFJlbmFtZSBmcm9tIGVuZGlhbi5oIHNvIHRoYXQgaXQgZG9lc24ndCBnZXQKKwljb25mdXNlZCB3aXRoIC91c3IvaW5jbHVkZS9zeXMvZW5kaWFuLmggb24gTGludXguICBBZGQgTGludXgKKwllbmRpYW4gc3VwcG9ydC4KKworCSogcHBjLWVuZGlhbi5jOiBSZW5hbWUgdG8gYmUgY29uc2lzdGFudCB3aXRoIHBwYy1lbmRpYW4uaC4KKwlJbmNsdWRlIHBwYy1lbmRpYW4uaCwgbm90IGVuZGlhbi5oLgorCisJKiBiYXNpY3MuaCAoc3lzZGVwLmgpOiBJbmNsdWRlIHN5c2RlcC5oIHRoYXQgY29uZmlndXJlIG1ha2VzLgorCUluY2x1ZGUgcHBjLWVuZGlhbi5oLCBub3QgZW5kaWFuLmguCisKKwkqIHN0ZC1jb25maWcuaDogUmVuYW1lIGZyb20gcHBjLWNvbmZpZy4gIFB1dCAjaWZuZGVmcyBhcm91bmQgbW9zdAorCWNvbmZpZ3VyYXRpb24gbWFjcm9zLCBzbyB0aGV5IGNhbiBiZSBvdmVycmlkZGVuIHZpYSBDRkxBR1MuICBCeQorCWRlZmF1bHQsIHR1cm4gb2ZmIHRyYWNpbmcuCisKKwkqIGNvbmZpZ3VyZS5pbjogQ2xvbmUgZnJvbSBvdGhlciBzaW11bGF0b3IgdGFyZ2V0cy4KKwkqIGNvbmZpZ3VyZTogR2VuZXJhdGUgdmlhIGF1dG9jb25mIGZyb20gY29uZmlndXJlLmluLgorCitTYXQgQXVnIDE5IDA5OjA1OjMyIDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zOiBmaXggc3Jhd2kgKHdhcyBnZXRpbmcgWEVSW0NBXSByZWFsIHdyb25nKS4KKworCSogaW50ZXJydXB0cy5jIChkYXRhX3N0b3JhZ2VfaW50ZXJydXB0KTogYWxsb3cgc3RhY2sgdG8gZ3JvdyBieQorICAgICAgICB1cHRvIG9uZSBNQiBwZXIgaW5jcmVtZW50LgorCisJKiBwcGMtaW5zdHJ1Y3Rpb25zOiBkaXZ3IHdhcyBjb21wdXRpbmcgckEgLyByQSBub3QgckEgLyByQgorCisJKiBtYWluLmMgKG1haW4pOiByZWFsbHkgc3R1cGlkLiBXYXNuJ3QgZXhpdGluZyB3aXRoIGNvcnJlY3Qgc3RhdHVzCisKK0ZyaSBBdWcgMTggMDA6Mzg6MDEgMTk5NSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKwkqIHN5c3RlbS5jIChzeXN0ZW1fY2FsbCk6IGFkZCBzeXN0ZW0gY2FsbHMga2lsbCgyKSBhbmQgZ2V0cGlkKDIpLgorCisJKiBtYWluLmMgKG1haW4pOiBDaGVjay9yZXR1cm4gZXhpdCBzdGF0dXMgd2hlbiBzaW11bGF0aW9uCisgICAgICAgIGZpbmlzaGVzLgorCitUaHUgQXVnIDE3IDE0OjI5OjE4IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisJKiBkZXZpY2VfdHJlZS5jIChjcmVhdGVfb3B0aW9uX2RldmljZV9ub2RlKTogQWxpZ25tZW50IHJ1bGVzIChhdAorIAlsZWFzdCBmb3IgdGhlIG1vbWVudCkgbm93IGFyZSBmb3Igc3RyaWN0IGFsaWdubWVudCBvbmx5IGZvciBMRSBPRUEKKyAJbW9kZS4gIChCZWNhdXNlIG9mIGNvbXBpbGVyIHByb2JsZW1zKS4KKworCSogc3lzdGVtLmMgKHN5c3RlbV9jYWxsKSBTWVNfZXhpdDogV2Fzbid0IGV4aXRpbmcgd2l0aCBjb3JyZWN0IHN0YXR1cy4KKworVGh1IEF1ZyAxNyAwMToxNjozOCAxOTk1ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworCSogdm0uYyAoREVGSU5FX1ZNX0RBVEFfTUFQX1dSSVRFX04pOiBGb3IgbWlzcyBhbGlnbmVkIHRyYW5zZmVyCisgICAgICAgIGZvcmdvdCB0byByZXR1cm4uCisKKwkqIHN5c3RlbS5jIChzeXN0ZW1fY2FsbCk6IGRpZG4ndCBwYWdlIGFsaWduIGJyZWFrIGFyZ3VtZW50IGJlZm9yZQorICAgICAgICBkZXRlcm1pbmluZyBpbmNyZW1lbnQgYnJlYWsgaW5jcmVtZW50LgorCisJKiBwc2ltL3BwYzogUmUtYXJhbmdlIGVudGlyZSBkaXJlY3Rvcnkgc3RydWN0dXJlIHNvIHRoYXQKKyAgICAgICAgZXZlcnl0aGluZyBsaXZlcyBpbiB0aGUgb25lIGRpcmVjdG9yeS4gIFdoaWxlIGEgcGFpbiBmb3IgY2xlYW5pbmcsCisgICAgICAgIG1ha2VzIGJ1aWxkaW5nIGFjcm9zcyBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzIG11Y2ggc2ltcGxlci4KKworCSogZGV2aWNlcy5jLCBkZXZpY2VfdHJlZS5jOiBBZGRlZCBjb2RlIHRoYXQgcHJvdmlkZXMgYSBzaW1wbGUKKyAgICAgICAgaWxsdXN0cmF0aW9uIG9mIGhvdyBhbiBpbnRlcnJ1cHQgY29udHJvbCBkZXZpY2UgY291bGQgYmUKKyAgICAgICAgaW1wbGVtZW50ZWQuCisKKwkqIGRldmljZXMuYzogQWRkZWQgY29kZSBzbyB0aGF0IHRoZSBkdW1iIGNvbnNvbGUgZGV2aWNlIGNhbiByZWFkCisgICAgICAgIChmcm9tIHN0ZGluKSBhcyB3ZWxsIGFzIHdyaXRlIHRvIHN0ZG91dC4KKwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9JTlNUQUxMIGIvc2ltL3BwYy9JTlNUQUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMjg4ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL0lOU1RBTEwKQEAgLTAsMCArMSw4MTIgQEAKKworCQlQU0lNIC0gbW9kZWwgdGhlIFBvd2VyUEMgZW52aXJvbm1lbnQKKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1Pi4KKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisJCQlCdWlsZGluZyBQU0lNCisKKwlUaGlzIGZpbGUgZGVzY3JpYmVzIGhvdyB0byBidWlsZCB0aGUgcHJvZ3JhbSBQU0lNCisKKwlvCVdhbGsgdGhyb3VnaCBhIGJhc2ljIGJ1aWxkCisKKwlvCURpc2N1c3Npb24gb2YgUFNJTSdzIGNvbXBvbmVudHMgYW5kCisJCWhvdyB0aGV5IHJlbGF0ZSB0byB0aGUgYnVpbGQgcHJvY2VzcworCisJbwlEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBlYWNoIG9mIFBTSU0ncworCQljb21waWxlIHRpbWUgY29uZmlndXJhdGlvbiBvcHRpb25zCisKKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitCVUlMRElORyBQU0lNOgorCitQU0lNIDEuMC4yIGlzIGluY2x1ZGVkIGluIEdEQi00LjE2LiAgVG8gYnVpbGQgUFNJTSB5b3Ugd2lsbCBuZWVkIHRoZQorZm9sbG93aW5nOgorCisJZ2RiLTQuMTYudGFyLmd6CQlBdmFpbGFibGUgZnJvbSB5b3VyIGZhdm9yaXRlIEdOVQorCQkJCWZ0cCBzaXRlCisKKwlnY2MJCQlHQ0MgdmVyc2lvbiB0d28gaW5jbHVkZXMgc3Vwb3J0CisJCQkJZm9yIGxvbmcgbG9uZyAoNjRiaXQgaW50ZWdlcikKKwkJCQlhcnJpdGhlbWV0aWMgd2hpY2ggUFNJTSB1c2VzLiAgSGVuY2UKKwkJCQlpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBidWlsZCBQU0lNCisJCQkJdXNpbmcgR0NDLgorCQkJCQorTWV0aG9kOgorCisJMS4JVW5wYWNrIGdkYgorCisJCSQgY2QgLi4uL3NjcmF0Y2gKKwkJJCBndW56aXAgPCBnZGItNC4xNi50YXIuZ3ogfCB0YXIgeGYgLQorCisKKwkyLglDb25maWd1cmUgZ2RiCisKKwkJRmlyc3QgY29uc3VsdCB0aGUgZ2RiIGRvY3VtZW50YXRpb24KKworCQkkIGNkIC4uLi9zY3JhdGNoCisJCSQgY2QgZ2RiLTQuMTYKKwkJJCBtb3JlIFJFQURNRQorCQkkIG1vcmUgZ2RiL1JFQURNRQorCisJCXRoZW4gc29tZXRoaW5nIGxpa2UgKEkgYXNzdW1lIFNIKToKKworCQkkIENDPWdjYyAuL2NvbmZpZ3VyZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAtLWVuYWJsZS1zaW0tcG93ZXJwYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAtLXRhcmdldD1wb3dlcnBjLXVua25vd24tZWFiaSBcCisgICAgICAgICAgICAgICAgICAgICAgICAtLXByZWZpeD0vYXBwbGljYXRpb25zL3BzaW0KKworCisJNC4JQnVpbGQgKGFnYWluIHNwZWNpZnlpbmcgR0NDKQorCisJCSQgbWFrZSBDQz1nY2MKKworCQlhbHRlcm5hdGl2ZWx5LCBpZiB5b3UgYXJlIHNob3J0IG9uIGRpc2sgc3BhY2Ugb3Igb25seQorCQl3YW50IHRvIGJ1aWxkIHRoZSBzaW11bGF0b3I6CisKKwkJJCAoIGNkIGxpYmliZXJ0eSAmJiBtYWtlIENDPWdjYyApCisJCSQgKCBjZCBiZmQgJiYgbWFrZSBDQz1nY2MgKQorCQkkICggY2Qgc2ltL3BwYyAmJiBtYWtlIENDPWdjYyApCisKKworCTUuCUluc3RhbGwKKworCQkkIG1ha2UgQ0M9Z2NjIGluc3RhbGwKKworCQlvciBqdXN0CisKKwkJJCBjcCBnZGIvZ2RiIH4vYmluL3Bvd2VycGMtdW5rbm93bi1lYWJpc2ltLWdkYgorCQkkIGNwIHNpbS9wcGMvcnVuIH4vYmluL3Bvd2VycGMtdW5rbm93bi1lYWJpc2ltLXJ1bgorCisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworVVBEQVRJTkcgUFNJTToKKworCitBIFBTSU0gaXMgYW4gb25nb2luZyBkZXZlbG9wbWVudC4gIE9jY2FzaW9uYWwgc25hcHNob3RzIHdoaWNoIGJvdGggY29udGFpbiBuZXcKK2ZlYXR1cmVzIGFuZCBmaXggb2xkIGJ1Z3MgYXJlIG1hZGUgYXZhaWxhYmxlLiAgU2VlIHRoZSBmdHAgZGlyZWN0b3J5OgorCisJZnRwOi8vZnRwLmNpLmNvbS5hdS9wdWIvcHNpbS9iZXRhCitvcglmdHA6Ly9jYW1icmlkZ2UuY3lnbnVzLmNvbS9wdWIvcHNpbS9iZXRhCisKK2ZvciB0aGUgbGF0ZXN0IHZlcnNpb24uICBUbyBidWlsZC9pbnN0YWxsIG9uZSBvZiB0aGVzZSBzbmFwc2hvdHMsIHlvdQorcmVwbGFjZSB0aGUgc2ltL3BwYyBmb3VuZCBpbiB0aGUgZ2RiIGFyY2hpdmUgd2l0aCB3aXRoIG9uZSBmcm9tIHRoZQorc25hcHNob3QuICBUaGVuIGp1c3QgcmUtY29uZmlndXJlIGFuZCByZWJ1aWxkL2luc3RhbGwuCisKKwlQcm9jZWR1cmU6CisKKwkwLglBIHN0YXJ0aW5nIHBvaW50CisKKwkJJCBjZCBnZGItNC4xNgorCisKKwkxLglSZW1vdmUgdGhlIG9sZCBwc2ltIGRpcmVjdG9yeQorCisJCSQgbXYgc2ltL3BwYyBzaW0vb2xkLnBwYworCisKKwkyLglVbnBhY2sgdGhlIG5ldyBvbmUKKworCQkkIGd1bnppcCA8IC4uL3BzaW0tTk5OTk5OLnRhci5neiB8IHRhciB0ZiAtCisJCSQgZ3VuemlwIDwgLi4vcHNpbS1OTk5OTk4udGFyLmd6IHwgdGFyIHRmIC0KKworCisJMy4JUmVjb25maWd1cmUvcmVidWlsZCAoYXMgc2VlbiBhYm92ZSk6CisKKwkJJCBDQz1nY2MgLi9jb25maWd1cmUgXAorCQkJLS1lbmFibGUtc2ltLXBvd2VycGMgXAorICAgICAgICAgICAgICAgICAgICAgICAgLS10YXJnZXQ9cG93ZXJwYy11bmtub3duLWVhYmkgXAorICAgICAgICAgICAgICAgICAgICAgICAgLS1wcmVmaXg9L2FwcGxpY2F0aW9ucy9wc2ltCisJCSQgbWFrZSBDQz1nY2MKKworCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1VQREFURVMgVE8gR0RCOgorCitGcm9tIHRpbWUgdG8gdGltZSwgcHJvYmxlbXMgaW52b2x2aW5nIHRoZSBpbnRlZ3JhdGlvbiBvZiBQU0lNIGludG8gZ2RiCithcmUgZm91bmQuICBXaGlsZSBldmVudHVhbGx5IGVhY2ggb2YgdGhlc2UgcHJvYmxlbXMgaXMgcmVzb2x2ZWQgdGhlcmUKK2NhbiBiZSBwZXJpb3VkcyBkdXJpbmcgd2hpY2ggYSBsb2NhbCBoYWNrIG1heSBiZSBuZWVkZWQuCisKK0F0IHRoZSB0aW1lIG9mIHdyaXRpbmcgdGhlIGZvbGxvd2luZyB3ZXJlIG91dHN0YW5kaW5nOgorCisJQVRUQUNIIGNvbW1hbmQ6CisKKwkJZnRwOi8vZnRwLmNpLmNvbS5hdS9wdWIvcHNpbS9nZGItNC4xNSthdHRhY2guZGlmZi5negorCW9yCWZ0cDovL2NhbWJyaWRnZS5jeWdudXMuY29tL3B1Yi9wc2ltL2dkYi00LjE1K2F0dGFjaC5kaWZmLmd6CisJCisJUFNJTSwgdW5saWtlIHRoZSBvdGhlciBzaW11bGF0b3JzIGZvdW5kIGluIEdEQiwgaXMgYWJsZSB0byBsb2FkCisJdGhlIGRlc2NyaXB0aW9uIG9mIGEgdGFyZ2V0IG1hY2hpbmUgKGluY2x1ZGluZyB0aGUgaW5pdGlhbAorCXN0YXRlIG9mIGFsbCBwcm9jZXNzb3IgcmVnaXN0ZXJzKSBmcm9tIGEgZmlsZS4KKworCVVuZm9ydHVuYXRseSBHREIgZG9lcyBub3QgeWV0IGhhdmUgYSBzdGFuZGFyZCBjb21tYW5kIHRoYXQKKwlmYWNpbGl0YXRlcyB0aGUgdXNlIG9mIHRoaXMgZmVhdHVyZS4gIFVudGlsIHN1Y2ggYSBjb21tYW5kIGlzCisJYWRkZWQsIHRoZSBwYXRjaCAoaGFjaz8pIGdkYi00LjE1K2F0dGFjaC5kaWZmLmd6IGNhbiBiZSB1c2VkIHRvCisJZXh0ZW5kIEdEQidzIGF0dGFjaCBjb21tYW5kIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZQorCXRoZSBzaW11bGF0b3JzIGNvbmZpZ3VyYXRpb24gZnJvbSBhIGZpbGUuCisKKworCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1JVTk5JTkcgUFJPR1JBTVM6CisKKworU2VlIHRoZSBmaWxlOgorCisJZnRwOi8vZnRwLmNpLmNvbS5hdS9wdWIvcHNpbS9SVU4KK29yCWZ0cDovL2NhbWJyaWRnZS5jeWdudXMuY29tL3B1Yi9wc2ltL1JVTgorCisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworQ09NUElMRSBUSU1FIENPTkZJR1VSQVRJT04gT1BUSU9OUzoKKworCitQU0lNJ3MgY29tcGlsZSB0aW1lIGNvbmZpZ3VyYXRpb24gaXMgY29udHJvbGxlZCBieSBhdXRvY29uZi4gIFBTSU0ncworY29uZmlndXJlIHNjcmlwdCByZWNvZ25pc2VzIG9wdGlvbnMgb2YgdGhlIGZvcm06CisKKwkJLS1lbmFibGUtc2ltLTxvcHRpb24+Wz08dmFsPl0KKworQW5kIGNhbiBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbmZpZ3VyZSBjb21tYW5kIGxpbmUgKGF0IHRoZSB0b3AgbGV2ZWwKK29mIHRoZSBnZGIgZGlyZWN0b3J5IHRyZWUpIHZpczoKKworCQkkIGNkIGdkYi00LjE1CisJCSQgQ0M9Z2NjIC4vY29uZmlndXJlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tdGFyZ2V0PXBvd2VycGMtdW5rbm93bi1lYWJpc2ltIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tcHJlZml4PS9hcHBsaWNhdGlvbnMvcHNpbSBcCisJCQktLWVuYWJsZS1zaW0taW5saW5lCisJCSQgbWFrZSBDQz1nY2MKKworRm9yIGEgYnJpZWYgbGlzdCBvZiBQU0lNJ3MgY29uZmlndXJhdGlvbiBvcHRpb25zLCBjb25maWd1cmUgLS1oZWxwCit3aWxsIGxpc3QgdGhlbSB2aXM6CisKKwkkIGNkIHNpbS9wcGMKKwkkIC4vY29uZmlndXJlIC0taGVscAorCitFYWNoIFBTSU0gc3BlY2lmaWMgb3B0aW9uIGlzIGRpc2N1c3NlZCBpbiBkZXRhaWwgYmVsb3cuCisKKworCistLWVuYWJsZS1zaW0tY2ZsYWdzPTxvcHRzPgorCisKK1NwZWNpZnkgYWRkaXRpb25hbCBDIGNvbXBpbGVyIGZsYWdzIHRoYXQgYXJlIHRvIGJlIHVzZWQgd2hlbiBjb21waWxpbmcKK2p1c3QgUFNJTS4KKworUFNJTSBwbGFjZXMgaGVhdnkgZGVtYW5kcyBvbiBib3RoIHRoZSBob3N0IG1hY2hpbmUgYW5kIGl0cyBDIGNvbXBpbGVyLiAgU28gdGhhdAordGhlIGJ1aWxkZXIgaGFzIGJldHRlciBjb250cm9sIG92ZXIgdGhlIGNvbXBpbGVyIHRoZSBhYm92ZSBvcHRpb24gY2FuIGJlIHVzZWQKK3RvIHBhc3MgYWRkaXRpb25hbCBvcHRpb25zIHRvIHRoZSBjb21waWxlciB3aGlsZSBQU0lNIGlzIGJlaW5nIGJ1aWx0LgorCitFeDogTm8gZGVidWcgaW5mb3JtYXRpb24KKworUFNJTSBjYW4gYmUgYnVpbHQgd2l0aCBldmVyeXRoaW5nIGlubGluZS4gIFVuZm9ydHVuYXRlbHksIGJlY2F1c2Ugb2YKK2FsbCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGdlbmVyYXRlZCB0aGUgQyBjb21waWxlciBjYW4gZ3JvdyB2ZXJ5Cit2ZXJ5IGxhcmdlIGFzIGEgcmVzdWx0LiAgRm9yIEdDQywgdGhlIGRlYnVnIGluZm9ybWF0aW9uIGNhbiBiZQorcmVzdHJpY3RlZCB3aXRoIHRoZSBgLWcwJyBvcHRpb24uICBUbyBzcGVjaWZ5IHRoYXQgdGhpcyBvcHRpb24gc2hvdWxkCitiZSBpbmNsdWRlIGluIHRoZSBDRkxBR1Mgd2hlbiBjb21waWxpbmcgdGhlIHBzaW0gc291cmNlIGNvZGUgdXNlOgorCisJLS1lbmFibGUtc2ltLWNmbGFncz0tZzAKKworRXg6IEFkZGl0aW9uYWwgb3B0aW1pemF0aW9uIGZsYWdzCisKK0Egc2lnbmlmaWNhbnQgZ2FpbiBpbiBwZXJmb3JtYW5jZSBjYW4gYmUgYWNoaWV2ZWQgYnkgdHVuaW5nIHRoZQorb3B0aW1pemF0aW9uIGZsYWdzIHBhc3NlZCB0byB0aGUgQyBjb21waWxlci4gIEZvciBpbnN0YW5jZSBvbiBhbiB4ODYKK3lvdSBtYXkgY29uc2lkZXI6CisKKwktLWVuYWJsZS1zaW0tY2ZsYWdzPSctZzAgLU8yIC1mbm8tc3RyZW5ndGgtcmVkdWNlIC1mLi4uJworCisKKworLS1lbmFibGUtc2ltLXdhcm5pbmdzPTxmbGFncz4KKworCitUdXJuIG9uIGFkZGl0aW9uYWwgR0NDIHNwZWNpZmljIGNoZWNrcy4KKworU29tZSBob3N0cyAoTmV0QlNELCBMaW51eCwgU29sYXJpcy0yLjUpIGhhdmUgY29tcGxldGUgaGVhZGVyIGZpbGVzCit0aGF0IGluY2x1ZGUgY29ycmVjdCBwcm90b3R5cGVzIGZvciBhbGwgbGlicmFyeSBmdW5jdGlvbnMuICBPbiBzdWNoCitob3N0cywgUFNJTSBjYW4gYmUgYnVpbHQgd2l0aCBtYW55IG1vcmUgdGhhbiB0aGUgc3RhbmRhcmQgQyBjaGVja3MKK2VuYWJsZWQuICBUaGUgb3B0aW9uIC0tZW5hYmxlLXNpbS13YXJuaW5ncyBjb250cm9scyB0aGlzLgorCitFeDogRGVmYXVsdCB3YXJuaW5ncworCitXaXRoIGp1c3QgLS1lbmFibGUtc2ltLXdhcm5pbmdzLCB0aGUgZm9sbG93aW5nIC1XIG9wdGlvbnMgYXJlIGVuYWJsZWQ6CistV2Vycm9yIC1XYWxsIC1XcG9pbnRlci1hcml0aCAtV21pc3NpbmctcHJvdG90eXBlcy4KKworCisKKy0tZW5hYmxlLXNpbS1vcGNvZGU9d2hpY2gKKworCitTcGVjaWZ5IHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHJ1bGVzIGZvciBnZW5lcmF0aW5nIHRoZSBpbnN0cnVjdGlvbgorZGVjb2RlIGFuZCBleGVjdXRlIGZ1bmN0aW9ucyBmcm9tIHRoZSBmaWxlIHBwYy1pbnN0cnVjdGlvbnMuCisKK1RoZSBmb3JtIG9mIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGUgYW5kIGV4ZWN1dGUgZnVuY3Rpb25zIGlzIGNvbnRyb2xsZWQKK2J5IGFuIG9wY29kZSB0YWJsZS4gIEl0IHNwZWNpZmllczogdGhlIGNvbWJpbmF0aW9uIG9mIHN3aXRjaAorc3RhdGVtZW50cyBhbmQganVtcCB0YWJsZXMgdG8gdXNlIHdoZW4gZGVjb2RpbmcgYW4gaW5zdHJ1Y3Rpb24gYW5kIGhvdworbXVjaCBvZiBlYWNoIGluc3RydWN0aW9uIHNob3VsZCBiZSBkZWNvZGVkIGJlZm9yZSBjYWxsaW5nIHRoZQoraW5zdHJ1Y3Rpb24gZXhlY3V0ZSBmdW5jdGlvbi4KKworUFNJTSBpbmNsdWRlcyBhIG51bWJlciBvZiBvcGNvZGUgdGFibGVzOgorCisJcHNpbS1vcGNvZGUtc2ltcGxlCisJCUdlbmVyYXRlcyBhIHNtYWxsIGNvbXBhY3QgdHdvIGxldmVsIHN3aXRjaCBzdGF0ZW1lbnQKKwkJdGhhdCB3aWxsIGNvbXBpbGUgcXVpY2tseSBhbmQgcnVuIHJlYXNvbmFibHkgZmFzdC4KKworCQlUaGlzIG1heSBiZSB1c2VmdWwgb24gYSBzbWFsbCBtYWNoaW5lLgorCisJcHNpbS1vcGNvZGUtY29tcGxleAorCQkodGhlIGRlZmF1bHQpIEEgZmFpcmx5IGFnZ3Jlc3NpdmUgaW5zdHJ1Y3Rpb24gZGVjb2RlCisJCXRhYmxlIHRoYXQgaW5jbHVkZXMgdGhlIGJyZWFraW5nIG91dCBvZiBhIG51bWJlcgorCQlvZiBzcGVjaWFsIGluc3RydWN0aW9uIGNhc2VzIChlZyBSQT09MCB2cyBSQSE9MCkuCisKKwlwc2ltLW9wY29kZS1mbGF0CisJCUlkZW50aWNhbCB0byBjb21wbGV4IGV4Y2VwdCBhIHN3aXRjaCBzdGF0ZW1lbnQKKwkJaXMgdXNlZC4gIElkZWFsIGZvciB3aGVuIHRoZSBpY2FjaGUgaXMgYmVpbmcKKwkJZGlzYWJsZWQuCisKKwlwc2ltLW9wY29kZS1zdHVwaWQKKwkJSW4gYWRkaXRpb24gdG8gdGhlIGluc3RydWN0aW9uIGRlY29kZXMgcGVyZm9ybWVkCisJCWJ5IHBzaW0tb3Bjb2RlLWNvbXBsZXgsIHRoaXMgYWxzbyBmdWxsIGRlY29kZXMgbXRzcHIsCisJCW1mc3ByLCBhbmQgYnJhbmNoIGluc3RydWN0aW9ucy4gIFRoZSB0YWJsZSBnZW5lcmF0ZWQKKwkJaXMgdmVyeSBsYXJnZSBhbmQsIGFzIGEgY29uc2VxdWVuY2UsIG9ubHkgcGVyZm9ybXMKKwkJd2VsbCBvbiBtYWNoaW5lcyB3aXRoIGxhcmdlIGNhY2hlcy4KKworCXBwYy1vcGNvZGUtdGVzdC0xCisJcHBjLW9wY29kZS10ZXN0LTIKKwkJR2VuZXJhdGUgdGVzdCAoYnV0IHdvcmthYmxlKSB0YWJsZXMuICBUaGVzZSBleGVyY2lzZQorCQlQU0lNJ3MgYWJpbGl0eSB0byBnZW5lcmF0ZSBpbnN0cnVjdGlvbiBkZWNvZGUgZnVuY3Rpb25zCisJCXRoYXQgYXJlIGEgY29tYmluYXRpb24gb2YganVtcC10YWJsZXMgYW5kIHN3aXRjaCBzdGF0ZW1lbnRzLgorCitUaGUgcHJvZ3JhbSBpZ2VuIGdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb24gdGFibGVzIGZyb20gdGhlIG9wY29kZQordGFibGUgYW5kIHRoZSBwcGMtaW5zdHJ1Y3Rpb24gdGFibGUuCisKKworCistLWVuYWJsZS1zaW0tc3dpdGNoCisKKworRW5hYmxlL2Rpc2FibGUgdGhlIHVzZSBvZiBhIHN3aXRjaCBzdGF0ZW1lbnQgd2hlbiBsb29raW5nIHVwIHRoZQorYXR0cmlidXRlcyBvZiBhIFNQUiByZWdpc3Rlci4KKworVGhlIFBvd2VyUEMgYXJjaGl0ZWN0dXJlIGRlZmluZXMgYSBudW1iZXIgb2YgU3BlY2lhbCBQdXJwb3NlIFJlZ2lzdGVycworKFNQUidzKS4gIEFzc29jaWF0ZWQgd2l0aCBlYWNoIG9mIHRoZXNlIHJlZ2lzdGVycyBhcmUgYSBudW1iZXIgb2YKK2F0dHJpYnV0ZXMgKHN1Y2ggYXMgdmFsaWRpdHkgb3Igc2l6ZSkgd2hpY2ggdGhlIGluc3RydWN0aW9ucworbXRzcHIvbWZzcHIgcXVlcnkgYXMgcGFydCBvZiB0aGVpciBleGVjdXRpb24uCisKK0ZvciBQU0lNLCB0aGlzIGluZm9ybWF0aW9uIGlzIGtlcHQgaW4gYSB0YWJsZSAocHBjLXNwci10YWJsZSkuICBUaGUKK3Byb2dyYW0gZGdlbiBjb252ZXJ0cyB0aGlzIHRhYmxlIGludG8gbG9va3VwIHJvdXRpbmVzIChjb250YWluZWQgaW4KK3RoZSBnZW5lcmF0ZWQgZmlsZXMgc3ByZWcuaCBzcHJlZy5jKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHF1ZXJ5IGFuCitTUFIncyBhdHRyaWJ1dGVzLiAgVGhvc2UgbG9va3VwIHJvdXRpbmVzIGFyZSBlaXRoZXIgaW1wbGVtZW50ZWQgYXMKK2EgdGFibGUgb3IgYWx0ZXJuYXRpdmVseSBhcyBhIG51bWJlciBvZiBzd2l0Y2ggc3RhdGVtZW50czoKKworCXNwcl90YWJsZSBzcHJfaW5mb1tdID0geyAuLi4uIH07CisJaW50IHNwcl9sZW5ndGgoc3BycyBzcHIpIHsgcmV0dXJuIHNwcl9pbmZvW3Nwcl0ubGVuZ3RoOyB9CisKK3ZzCisKKwlpbnQgc3ByX2xlbmd0aChzcHJzIHNwcikgeyBzd2l0Y2ggKHNwcikgeyBjYXNlIC4uOiByZXR1cm4gLi47IH0gfQorCitJbiBnZW5lcmFsIHRoZSBmaXJzdCBpbXBsZW1lbnRhdGlvbiAoYSB0YWJsZSkgaXMgdGhlIG1vc3QgZWZmaWNpZW50LgorSXQgbWF5LCBob3dldmVyLCBwcm92ZSB0aGF0IHdoZW4gcGVyZm9ybWluZyBhbiBhZ2dyZXNzaXZlIG9wdGltaXphdGlvbgord2hlcmUgYm90aCB0aGUgU1BSIGlzIGtub3duIGFuZCB0aGUgYWJvdmUgZnVuY3Rpb24gaXMgYmVpbmcgaW5saW5lZAorKHdpdGggdGhlIGNvbnNlcXVlbmNlIHRoYXQgR0NDIGNhbiBlbGltaW5hdGUgdGhlIHN3aXRjaCBzdGF0ZW1lbnQpCit0aGF0IHRoZSBzZWNvbmQgY2hvaWNlIGlzIGltcHJvdmVzIHBlcmZvcm1hbmNlLgorCitJbiBwcmFjdGljZSwgb25seSBhIG1hcmdpbmFsIChpZiBhbnkgYmVuZWZpdCkgaGFzIGV2ZXIgYmVlbiBzZWVuLgorCisKKworLS1lbmFibGUtc2ltLWR1cGxpY2F0ZQorCisKK0NyZWF0ZSBhIGR1cGxpY2F0ZSBjb3B5IG9mIGVhY2ggaW5zdHJ1Y3Rpb24gZnVuY3Rpb24gaGFyZHdpcmluZworaW5zdHJ1Y3Rpb24gZmllbGRzIHRoYXQgd291bGQgaGF2ZSBvdGhlcndpc2UgaGF2ZSBiZWVuIHZhcmlhYmxlLgorCitBcyBkaXNjdXNzZWQgYWJvdmUsIGlnZW4gb3V0cHV0cyBhIEMgZnVuY3Rpb24gZ2VuZXJhdGVkIGZyb20gdGhlIGZpbGUKK3BwYy1pbnN0cnVjdGlvbnMgKHVzaW5nIHRoZSBvcGNvZGUgcnVsZXMpIGZvciBlYWNoIG9mIHRoZQoraW5zdHJ1Y3Rpb25zLiAgVGh1cyBtdWx0aXBsZSBlbnRyaWVzIGluIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGUgdGFibGVzCittYXkgYmUgcG9pbnRpbmcgYmFjayBhdCB0aGUgc2FtZSBmdW5jdGlvbi4gIEVuYWJsaW5nIGR1cGxpY2F0ZSwgd2lsbAorcmVzdWx0IGluIHBzaW0gY3JlYXRpbmcgYSBkdXBsaWNhdGUgb2YgdGhlIGluc3RydWN0aW9uJ3MgZnVuY3Rpb24gZm9yCitlYWNoIGRpZmZlcmVudCBlbnRyeSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2RlIHRhYmxlcy4KKworRm9yIGluc3RhbmNlLCBnaXZlbiB0aGUgYnJhbmNoIGluc3RydWN0aW9uOgorCisJMC4xOSw2LkJPLDExLkJJLDE2Li8sMjEuNTI4LDMxLkxLCisJLi4uCisJaWYgKExLKSBMUiA9IChzcHJlZylJRUEoQ0lBICsgNCk7CisJLi4uCisKK2lnZW4gYXMgcGFydCBvZiBpdHMgaW5zdHJ1Y3Rpb24gbG9va3VwIHRhYmxlIG1heSBoYXZlIGdlbmVyYXRlZCB0d28KK2RpZmZlcmVudCBlbnRyaWVzIC0gb25lIGZvciBMSz0wIGFuZCBvbmUgZm9yIExLPTEuICBXaXRoIGR1cGxpY2F0ZQorZW5hYmxlZCwgaWdlbiBvdXRwdXRzIChhbG1vc3QpIGR1cGxpY2F0ZSBjb3BpZXMgb2YgYnJhbmNoIGZ1bmN0aW9uLAorb25lIHdpdGggTEsgaGFyZHdpcmVkIHRvIDAgYW5kIG9uZSB3aXRoIExLIGhhcmR3aXJlZCB0byAxLgorCitCeSBkb2luZyB0aGlzIHRoZSBjb21waWxlciBpcyBwcm92aWRlZCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdAord2lsbCBhbGxvdyBpdCBwb3NzaWJseSBlbGltaW5hdGUgZGVhZCBjb2RlLiAgKHN1Y2ggYXMgdGhlIGFzc2lnbm1lbnQKK3RvIExLIGlmIExSPT0wKS4KKworRXg6IGRlZmF1bHQKKworQmVjYXVzZSB0aGlzIGZlYXR1cmUgaXMgc3VjaCBhIGJpZyB3aW4sIC0tZW5hYmxlLXNpbS1kdXBsaWNhdGUgaXMKK3R1cm5lZCBvbiBieSBkZWZhdWx0LgorCitFeDogQSBzbWFsbCBtYWNoaW5lCisKK09ubHkgcmFyZWx5IChlZyBvbiBhIHZlcnkgc21hbGwgaG9zdCkgd291bGQgdGhpcyBmZWF0dXJlIG5lZWQgdG8gYmUKK2Rpc2FibGVkICh1c2luZzogLS1kaXNhYmxlLXNpbS1kdXBsaWNhdGUpLgorCisKKworLS1lbmFibGUtc2ltLWZpbHRlcj1ydWxlCisKKworSW5jbHVkZS9leGNsdWRlIFBvd2VyUEMgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIHNwZWNpZmljIHRvIGEgcGFydGljdWxhcgoraW1wbGVtZW50YXRpb24uCisKK1NvbWUgb2YgdGhlIFBvd2VyUEMgaW5zdHJ1Y3Rpb25zIGluY2x1ZGVkIGluIHRoZSBmaWxlIHBwYy1pbnN0cnVjdGlvbnMKK2FyZSBsaW1pdGVkIHRvIGNlcnRhaW4gc3BlY2lmaWMgUFBDIGltcGxlbWVudGF0aW9ucy4gIEZvciBpbnN0YW5jZSwKK3RoZSBpbnN0cnVjdGlvbjoKKworCTAuNTgsNi5SVCwxMS5SQSwxNi5EUywzMC4yOkRTOjY0OjpMb2FkIFdvcmQgQWxnZWJyYWljCisKK0lzIG9ubHkgdmFsaWQgZm9yIHRoZSA2NGJpdCBhcmNoaXRlY3R1cmUuICBUaGUgZW5hYmxlLXNpbS1maWx0ZXIgZmxhZworaXMgcGFzc2VkIHRvIGlnZW4gc28gdGhhdCBpdCBjYW4gYGZpbHRlciBvdXQnIGFueSBpbnZhbGlkCitpbnN0cnVjdGlvbnMuICBUaGUgZmlsdGVyIHJ1bGUgaGFzIHRoZSBmb3JtOgorCisJLWYgPG5hbWU+CisKK3RodXM6CisKKwktLWVuYWJsZS1zaW0tZmlsdGVyPSctZiA2NCcKKworKHRoZSBkZWZhdWx0KSB3b3VsZCBmaWx0ZXIgb3V0IGFsbCA2NGJpdCBpbnN0cnVjdGlvbnMuCisKK0V4OiBSZW1vdmUgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zCisKK0EgZ2l2ZW4gMzJiaXQgUG93ZXJQQyBpbXBsZW1lbnRhdGlvbiBtYXkgbm90IGluY2x1ZGUgZmxvYXRpbmcgcG9pbnQKK2hhcmR3YXJlLiAgQ29uc2VxdWVudGx5IHRoZXJlIGlzIGxpdHRsZSBwb2ludCBpbiBpbmNsdWRpbmcgZmxvYXRpbmcKK3BvaW50IGluc3RydWN0aW9ucyBpbiB0aGUgaW5zdHJ1Y3Rpb24gdGFibGUuICBUaGUgb3B0aW9uOgorCisJLS1lbmFibGUtc2ltLWZpbHRlcj0nLWYgNjQgLWYgZicKKword2lsbCBlbGltaW5hdGUgYWxsIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyBmcm9tIHRoZSBpbnN0cnVjdGlvbgordGFibGUuCisKKworCistLWVuYWJsZS1zaW0taWNhY2hlPXNpemUKKworCitTZXQgdGhlIHNpemUgb2YgdGhlIGNhY2hlIHVzZWQgdG8gaG9sZCBkZWNvZGVkIGluc3RydWN0aW9ucy4KKworUHNpbSBleGVjdXRlcyBpbnN0cnVjdGlvbnMgaW4gdHdvIHNlcGFyYXRlIHN0ZXBzOgorCisJbwlpbnN0cnVjdGlvbiBmZXRjaC9kZWNvZGUKKworCW8JaW5zdHJ1Y3Rpb24gZXhlY3V0aW9uCisKK0ZvciBhIGdpdmVuIGluc3RydWN0aW9uLCB0aGUgZmlyc3Qgc3RhZ2UgbmVlZCBvbmx5IGJlIGV4ZWN1dGVkIG9uY2UKKyh0aGUgZmlyc3QgdGltZSB0aGUgaW5zdHJ1Y3Rpb24gaXMgZW5jb3VudGVyZWQpIHdoaWxlIHRoZSBzZWNvbmQgc3RhZ2UKK211c3QgYmUgZXhlY3V0ZWQgZXZlcnkgdGltZSB0aGUgcHJvZ3JhbSBgZXhlY3V0ZXMnIHRoYXQgaW5zdHJ1Y3Rpb24uCisKK0V4cGxvaXRpbmcgdGhpcywgUFNJTSBjYW4gbWFpbnRhaW4gYSBjYWNoZSBvZiBkZWNvZGVkIGluc3RydWN0aW9ucy4KK0l0IHdpbGwgdGhlbiB1c2UgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgY2FjaGUgaW4gcHJlZmVyZW5jZQordG8gZmV0Y2hpbmcvZGVjb2RpbmcgdGhlIHJlYWwgaW5zdHJ1Y3Rpb24gZnJvbSBtZW1vcnkuCisKK0V4OiBkZWZhdWx0CisKK0JlY2F1c2UgdGhpcyBmZWF0dXJlIGlzIG5vcm1hbGx5IHN1Y2ggYSBiaWcgd2luLCBpdCBpcyBlbmFibGVkIGJ5CitkZWZhdWx0ICh3aXRoIHRoZSBjYWNoZSBzaXplIHNldCB0byAxMDI0IGVudHJpZXMpLgorCitUaGUgMTAyNCBlbnRyaWVzIGVxdWFscyA0MDk2IGJ5dGVzIChvciBvbmUgcGFnZSkgb2YgaW5zdHJ1Y3Rpb25zLgorTGFyZ2VyIGNhY2hlcyBjYW4gYmUgdXNlZCBidXQgd2l0aCBjYXV0aW9uIC0gUFNJTSBkb2VzIG5vdCBjaGVjayBmb3IKK2FkZHJlc3MgYWxpYXNpbmcgd2l0aGluIGl0cyBpbnN0cnVjdGlvbiBjYWNoZS4KKworRXg6IGRpc2FibGUgdGhlIGNhY2hlCisKK1RoZXJlIG1heSBiZSBjYXNlcyAoZm9yIGluc3RhbmNlIHdoZXJlIHRoZSBjYWNoZSBoYXMgYSBsb3cgaGl0IHJhdGUpCit3aGVyZSB0aGUgcHNpbSBwZXJmb3JtcyBiZXR0ZXIgd2l0aCBubyBpbnN0cnVjdGlvbiBjYWNoZS4gIEZvciBzdWNoCitzaXR1YXRpb25zLCB0aGUgY2FjaGUgY2FuIGJlIGRpc2FibGVkIHZpczogLS1kaXNhYmxlLXNpbS1pY2FjaGUuCisKKworCistLWVuYWJsZS1zaW0taW5saW5lWz1tb2R1bGVdCisKKworU3BlY2lmeSB0aGUgaW5saW5pbmcgb2Ygb25lIG9yIG1vcmUgbW9kdWxlcy4KKworTWFueSBhcmNoaXRlY3R1cmVzIChpbiBwYXJ0aWN1bGFyIHRoZSB4ODYpIHN1ZmZlciBmcm9tIGEgbGFyZ2UKK2Z1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuICBCeSBlbGltaW5hdGluZyBmdW5jdGlvbiBjYWxscyAodGhyb3VnaAoraW5saW5pbmcgb2YgZnVuY3Rpb25zKSBhIGxhcmdlIHBlcmZvcm1hbmNlIGdhaW4gY2FuIGJlIGFjaGlldmVkLgorCitJbiBQU0lNLCBtb2R1bGVzIGFyZSBpbmxpbmVkIGluIG9uZSBvZiB0d28gcG9zc2libGUgd2F5cy4gIFNvbWUKK21vZHVsZXMgKHN1Y2ggYXMgdGhlIGJ5dGUgc3dhcHBpbmcgY29kZSkgY2FuIGJlIGlubGluZWQgaW50byBhbnkKK21vZHVsZSB0aGF0IGNhbGxzIHRoZW0uICBPdGhlciBtb2R1bGVzLCBkdWUgdG8gY29tcGxleAoraW50ZXJkZXBlbmRlbmNpZXMsIGFyZSBvbmx5IGlubGluZWQgYXMgYSBncm91cCB3aGVuIGNvbXBpbGluZyB0aGUKK2V4dGVybmFsIGludGVyZmFjZSBtb2R1bGUgcHNpbS5jLgorCitFeDogZGVmYXVsdAorCitCeSBkZWZhdWx0IHRoZSBtb2R1bGVzIGVuZGlhbiAoaGFuZGxlIGJlL2xlKSwgYml0cyAobWFuaXB1bGF0ZQorYml0LWZpZWxkcyB3aXRoaW4gd29yZHMpLCBjcHUgKHRoZSBwcm9jZXNzb3Igb2JqZWN0KSBhbmQgZXZlbnRzCisodGltZXJzKSBhcmUgaW5saW5lZCBpbiBhbnkgbW9kdWxlIHRoYXQgY2FsbHMgdGhlbS4gIFRoaXMgZ2l2ZXMgYQorcmVhc29uYWJsZSBwZXJmb3JtYW5jZSBnYWluIHdpdGggbGl0dGxlIGFkZGl0aW9uYWwgY29tcGlsYXRpb24KK292ZXJoZWFkLgorCitFeDogcmVjb21tZW5kZWQgIC0tZW5hYmxlLXNpbS1pbmxpbmUKKworQXNzdW1pbmcgeW91IG1hY2hpbmUgaXMgcmVhc29uYWJseSB3ZWxsIGNvbmZpZ3VyZWQsIHRoaXMgb3B0aW9uIGlzCitoaWdobHkgcmVjb21tZW5kZWQuICBPbiB0aGUgeDg2IHNldmVyYWwgb3JkZXJzIG9mIG1hZ25pdHVkZQoraW1wcm92ZW1lbnQgaW4gcGVyZm9ybWFuY2UgaXMgcG9zc2libGUuCisKK0V4OiBmaW5lIHR1bmluZworCitUaGUgZmlsZSBzdGQtY29uZmlnLmggY29udGFpbnMgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBob3cgdGhlCitpbmxpbmluZyB3b3Jrcy4gIEluZGl2aWR1YWwgbW9kdWxlcyBjYW4gYmUgaW5saW5lZCBieSBzcGVjaWZ5aW5nIHRoZW0uCitGb3IgaWYgeW91IGhhdmUgYSB2ZXJ5IGxhcmdlIGNhY2hlIHRoZSBtb2RlbCBtb2R1bGUgY291bGQgYmUgaW5saW5lZAord2l0aDoKKworCS0tZW5hYmxlLXNpbS1pbmxpbmU9TU9ERUwKKworCisKKy0tZW5hYmxlLXNpbS1ic3dhcAorCisKKyh4ODYgc3BlY2lmaWMpIFVzZSB0aGUgaTQ4Ni9QNS9QNiBieXRlIHN3YXAgaW5zdHJ1Y3Rpb24uCisKK1BTSU0gY29udGFpbnMgZ2VuZXJpYyBieXRlIHN3YXBwaW5nIGNvZGUuICBGb3IgdGhlIHg4NiAoUFs0LTZdKSBQU0lNCitjYW4gYmUgYnVpbHQgc28gdGhhdCBpdCB1c2VzIHRoZSBic3dhcCBpbnN0cnVjdGlvbiBpbnN0ZWFkIG9mIHJlbHlpbmcKK29uIHRoZSBjb21waWxlciB0byBnZW5lcmF0ZSBieXRlIHN3YXAgY29kZS4KKworRXg6IGRlZmF1bHQKKworQnkgZGVmYXVsdCwgd2hlbiBjb21waWxpbmcgd2l0aCBHQ0MtMiBvbiBhbiBpNDg2L1A1L1A2IHRoZSBic3dhcAoraW5zdHJ1Y3Rpb24gaXMgdXNlZC4KKworCisKKy0tZW5hYmxlLXNpbS1lbmRpYW49ZW5kaWFuCisKKworU3BlY2lmeSB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgdGFyZ2V0LgorCitCeSBkZWZhdWx0LCBQU0lNIGlzIGFibGUgdG8gZXhlY3V0ZSBib3RoIGJpZyBhbmQgbGl0dGxlIGVuZGlhbgorZXhlY3V0YWJsZXMuICBBcyBhIGNvbnNlcXVlbmNlLCBldmVyeSBieXRlIHN3YXAgcm91dGluZSBpbmNsdWRlcyBhCit0ZXN0IHRvIHNlZSBpZiB0aGUgYnl0ZSBzd2FwIGlzIHJlYWxseSBuZWVkZWQuICBCeSBzcGVjaWZ5aW5nIHRoZSBieXRlCitvcmRlciBvZiB0aGUgdGFyZ2V0IChhbmQgdGhlIGhvc3QgYmVsb3cpIHRoZSBuZWVkIGZvciB0aGlzIHRlc3QgY2FuIGJlCitlbGltaW5hdGVkLgorCitDbGVhcmx5IHNldHRpbmcgdGhlIGJ5dGUgb3JkZXIgb2YgdGhlIHRhcmdldCBpcyBvbmx5IHVzZWZ1bCB3aGVuIGtub3duCitiZWZvcmUgaGFuZC4KKworCisKKy0tZW5hYmxlLXNpbS1ob3N0ZW5kYWluPWVuZAorCisKK0FzIGFib3ZlIGJ1dCBmb3IgdGhlIGhvc3QuCisKK05vcm1hbGx5IHRoaXMgb3B0aW9uIHNob3VsZCBub3QgYmUgbmVlZGVkLiBjb25maWd1cmUgKGF1dG9jb25mKSBzaG91bGQKK2RldGVybWluZSB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgaG9zdCBhdXRvbWF0aWNhbGx5LiAgSG93ZXZlciBpZiBmb3IKK3NvbWUgcmVhc29uIHRoZXJlIGlzIGEgcHJvYmxlbSwgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUKK2F1dG9jb25mLgorCisKKworLS1lbmFibGUtc2ltLXNtcD1uCisKKworU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9jZXNzb3JzIHRoYXQgUFNJTSBjYW4gbW9kZWwuCisKK1BzaW0gY2FuIG1vZGVsICh3aXRoIHNtYWxsIGxpbWl0YXRpb24gZGlzY3Vzc2VkIGVsc2Ugd2hlcmUpIGEKK211bHRpLXByb2Nlc3NvciBQb3dlclBDIGVudmlyb25tZW50LiAgV2hpbGUgdGhlIG92ZXJoZWFkIG9mCitjby1vcmRpbmF0aW5nIHRoZSBleGVjdXRpb24gb2YgYSBudW1iZXIgb2YgcHJvY2Vzc29ycyBpcyByZWxhdGl2ZWx5CitzbWFsbCBpdCBpcyBzdGlsbCBzaWduaWZpY2FudCB3aGVuIGNvbXBhcmVkIHRvIGhhbmRsaW5nIG9ubHkgb25lCitwcm9jZXNzb3IuCisKK1RoaXMgb3B0aW9uIG9ubHkgc2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcHJvY2Vzc29ycyB0aGF0IGNhbiBiZQorc2ltdWxhdGVkLiAgVGhlIG51bWJlciBhY3RpdmUgZHVyaW5nIGEgZ2l2ZW4gc2ltdWxhdGlvbiBydW4gdXMKK2RldGVybWluZWQgYXQgcnVuIHRpbWUuCisKK0V4OiBkZWZhdWx0CisKK0J5IGRlZmF1bHQgNSBwcm9jZXNzb3JzIGFyZSBjb25maWd1cmVkIGJ1dCBvbmx5IG9uZSBpcyBlbmFibGVkLgorQWRkaXRpb25hbCBwcm9jZXNzb3JzIGNhbiBiZSBlbmFibGVkIHdpdGggdGhlIHJ1bnRpbWUgb3B0aW9uOgorCisJLW8gJy9vcGVucHJvbS9vcHRpb25zL3NtcCA1JworCitFeDogcmVjb21tZW5kZWQKKworVW5sZXNzIHlvdSBpbnRlbmQgc3R1ZHlpbmcgbXVsdGktcHJvY2Vzc29yIHN5c3RlbXMgdGhlcmUgaXMgbGl0dGxlIHJlYXNvbiBmb3IKK2hhdmluZyBQU0lNIGNvbmZpZ3VyZWQgd2l0aCBTTVAgc3VwcG9ydC4gIFNwZWNpZnlpbmc6CisKKwktLWRpc2FibGUtc2ltLXNtcAorb3IJLS1lbmFibGUtc2ltLXNtcD0wCisKK3dpbGwgZWxpbWluYXRlIGFueSBTTVAgc3VjaCBhczoKKworCWZvciAoY3B1ID0gMDsgY3B1IDwgbnJfY3B1czsgY3B1KyspCisJCS4uLgorCisKKworLS1lbmFibGUtc2ltLXhvci1lbmRpYW49bgorCisKK1NldCB0aGUgYnl0ZS1zaXplIG9mIHRoZSBidXMgaW52b2x2ZWQgaW4gdGhlIFBvd2VyUEMncyB4b3IgZW5kaWFuIGJ5dGUKK3N3YXBwaW5nLgorCitUaGUgUG93ZXJQQydzIGltcGxlbWVudGF0aW9uIG9mIEJFL0xFIG1vZGUgaXMgZGlmZmVyZW50IHRvIHdoYXQgYQorcHJvZ3JhbW1lciBtYXkgZmlyc3QgZXhwZWN0LiAgVGhlIGRldGFpbHMgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBhcmUKK2Rpc2N1c3NlZCBhdCBsZW5ndGggaW4gUG93ZXJQQyBkb2N1bWVudGF0aW9uLgorCitFeDogZGVmYXVsdAorCitCeSBkZWZhdWx0IHRoaXMgaXMgY29uZmlndXJlZCB3aXRoIGEgdmFsdWUgb2YgOCAodGhlIGJ1cyBzaXplIG9mIG1vc3QKKzYweCBwcm9jZXNzb3JzKS4KKworRXg6IHJlY29tbWVuZGVkCisKK1VubGVzcyB5b3UgYXJlIGV4cGVjdGluZyB0byB0ZXN0L2RlYnVnIFBvd2VyUEMgYmUvbGUgc3dpdGNoaW5nIGNvZGUKK3RoaXMgb3B0aW9uIGlzIG9mIGxpdHRsZSB1c2UgYW5kIHNob3VsZCBiZSBkaXNhYmxlZDoKKworCS0tZGlzYWJsZS1zaW0teG9yLWVuZGlhbgorCisKKworLS1lbmFibGUtc2ltLWJpdHNpemU9bgorCisKK1NwZWNpZnkgdGhlIGJpdCBzaXplICgzMi82NCkgb2YgdGhlIFBvd2VyUEMgdG8gYmUgbW9kZWxsZWQuCisKK05vdGU6IEJ5IGRlZmF1bHQgMzIgaXMgc3BlY2lmaWVkLiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSA2NGJpdAorYXJjaGl0ZWN0dXJlIGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50LgorCisKKy0tZW5hYmxlLXNpbS1ob3N0Yml0c2l6ZT0zMnw2NAorCitBcyBhYm92ZSBidXQgZm9yIHRoZSBob3N0LgorCitOT1RFOiBQc2ltIGhhcyB5ZXQgdG8gYmUgYnVpbHQgb24gYSA2NGJpdCBob3N0LgorCisKKworLS1lbmFibGUtc2ltLWVudj1lbnYKKworCitIYXJkd2lyZSB0aGUgUG93ZXJQQyBlbnZpcm9ubWVudCBiZWluZyBtb2RlbGxlZCAodXNlciwgdmlydHVhbCBvcgorb3BlcmF0aW5nKS4KKworVGhlIFBvd2VyUEMgYXJjaGl0ZWN0dXJlIGRlZmluZXMgdGhyZWUgZGlmZmVyZW50IGxldmVscyBvZiBjb21wbGlhbmNlIHRvIGl0cworYXJjaGl0ZWN0dXJhbCBzcGVjaWZpY2F0aW9uLiAgVGhlc2UgZW52aXJvbm1lbnRzIGFyZSBkaXNjdXNzZWQgaW4gZGV0YWlsIGluCitQb3dlclBDIHB1YmxpY2F0aW9ucy4KKworCXVzZXIgLSBub3JtYWwgdXNlciBwcm9ncmFtcyAKKwl2aXJ0dWFsIC0gYW4gZXh0ZW5zaW9uIG9mIHRoZSB1c2VyIGVudmlyb25tZW50IChpbmNsdWRlcyB0aW1lcnMpCisJb3BlcmF0aW5nIC0ga2VybmVsIGNvZGUKKworRXg6IGRlZmF1bHQKKworQnkgZGVmYXVsdCBhbGwgdGhyZWUgZW52aXJvbm1lbnRzIGFyZSBzdXBwb3J0ZWQuCisKK0V4OiByZWNvbW1lbmRlZAorCitJZiB5b3Ugb25seSBpbnRlbmQgcnVubmluZyBwc2ltIHdpdGggdXNlciAob3Igb3BlcmF0aW5nKSBjb2RlIHRoZW4KK1BTSU0gc2hvdWxkIGJlIGNvbmZpZ3VyZWQgYWNjb3JkaW5nbHkuICBGb3IgdXNlciBjb2RlLCBpdCBlbGltaW5hdGVzOgorc3VwcG9ydCBmb3IgdGltZXJzIGFuZCBldmVudHMgYW5kIHJlZHVuZGFudCBWTSBjYWxscy4KKworCisKKy0tZW5hYmxlLXNpbS10aW1lYmFzZQorCisKK0VuYWJsZS9kaXNhYmxlIHRoZSB0aW1lIGJhc2UgcmVnaXN0ZXIuCisKK1RoZSBQb3dlclBDIGFyY2hpdGVjdHVyZSAodmlydHVhbCBlbnZpcm9ubWVudCkgaW5jbHVkZXMgYSB0aW1lIGJhc2UKK3JlZ2lzdGVyLiAgTWFpbnRhaW5pbmcgdGhhdCByZWdpc3RlciBpbmN1cnMgYW4gb3ZlcmhlYWQgaW4KK3BlcmZvcm1hbmNlIHRoYXQgY2FuIGJlIGVsaW1pbmF0ZWQgYnkgZWxpbWluYXRpbmcgdGltZS1iYXNlIHJlZ2lzdGVyCitzdXBwb3J0LgorCitFeDogZGVmYXVsdAorCitOb3JtYWxseSB0aGlzIG9wdGlvbiBpcyBub3QgdXNlZC4gIEluc3RlYWQgLS1lbmFibGUtc2ltLWVudiAoYWJvdmUpIHVzCit1c2VkIHRvIGRpc2FibGUvZW5hYmxlIGZlYXR1cmVzIHN1Y2ggYXMgdGhlIHRpbWViYXNlIHJlZ2lzdGVyLgorCisKKworLS1lbmFibGUtc2ltLWFsaWdubWVudD1hbGlnbgorCisKK0NvbnRyb2wgdGhlIFBvd2VyUEMncyBtZW1vcnkgYWNjZXNzIGFsaWdubWVudCByZXN0cmljdGlvbnMuCisKK1RoZSBQb3dlclBDIGluIExFIG1vZGUgb25seSBhbGxvd3MgbWVtb3J5IHRyYW5zZmVycyBvZiBhIGNvcnJlY3RseQorYWxpZ25lZCBzaXplL2FkZHJlc3MuICBUaGUgYWJvdmUgb3B0aW9uIGNvbnRyb2xzIGhvdyBtaXNhbGlnbmVkCithY2Nlc3NlcyBhcmUgaGFuZGxlZC4KKworCXN0cmljdAkJQWxsIGFjY2Vzc2VzIG11c3QgYmUgY29ycmVjdGx5IGFsaWduZWQKKworCW5vbnN0cmljdAlVbmFsaWduZWQgYWNjZXNzIGFsbG93ZWQgKHRoZSBhcmUgc3BsaXQKKwkJCWludG8gYSBudW1iZXIgb2YgYWxpZ25lZCBhY2Nlc3NlcykuCisKK0V4OiBkZWZhdWx0CisKK1VubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIFBTSU0gd2lsbCBhdXRvIGNvbmZpZ3VyZSBhIEJFIHByb2dyYW0gdG8KK2FsbG93IG1pc3MtYWxpZ25lZCBhY2Nlc3NlcyB3aGlsZSBhIExFIHByb2dyYW0gd2lsbCBub3QuCisKK0V4OiA2MDRlCisKK1RoZSByZWNlbnRseSBhbm5vdW5jZWQgNjA0ZSBwcm9jZXNzb3IgYWxsb3dzIG1pc3MtYWxpZ25lZCBhY2Nlc3NlcyBpbiBib3RoCitCRSBhbmQgTEUgbW9kZXMuICBJZiBtb2RlbGluZyB0aGUgNjA0ZSB0aGVuIHlvdSBzaG91bGQgc3BlY2lmeToKKworCS0tZW5hYmxlLXNpbS1hbGlnbm1lbnQ9bm9uc3RyaWN0CisKKworCistLWVuYWJsZS1zaW0tdHJhY2UKKworCitJbmNsdWRlIGNvZGUgdG8gdHJhY2UgUFNJTSdzIGludGVybmFsIHByb2dyZXNzIChhbHNvIGNvbnRyb2xsZWQgYnkgdGhlCistdCBvcHRpb24pLgorCitDaGVja2luZyB0byBzZWUgaWYgYSB0cmFjZSBtZXNzYWdlIHNob3VsZCBiZSBvdXRwdXQgc2xvd3MgZG93biBhCitzaW11bGF0aW9uLiAgRGlzYWJsaW5nIHRoaXMgb3B0aW9uICgtLWRpc2FibGUtc2ltLXRyYWNlKSBlbGltaW5hdGVzCitjb21wbGV0ZWx5IHRoYXQgY29kZS4KKworCisKKy0tZW5hYmxlLXNpbS1hc3NlcnQKKworCitJbmNsdWRlIHRoZSBjb2RlIHRoYXQgY2hlY2tzIHRoZSBjb3JyZWN0bmVzcyBvZiBwYXJ0cyBvZiBQU0lNLgorCitFbGltaW5hdGluZyBzdWNoIGNvZGUgKC0tZGlzYWJsZS1zaW0tYXNzZXJ0KSBlbGltaW5hdGVzIGludGVybmFsCitjb25zaXN0ZW5jeSB0ZXN0cyBhbmQgdGhlaXIgb3ZlcmhlYWQuCisKKworCistLWVuYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cworCisKK0luY2x1ZGUgY29kZSB0byBjaGVjayB0aGF0IHRoZSByZXNlcnZlZCBmaWVsZHMgb2YgdGhlIGluc3RydWN0aW9uIGFyZQoremVyby4KKworVGhlIFBvd2VyUEMgYXJjaGl0ZWN0dXJlIGRlZmluZXMgY2VydGFpbiBmaWVsZHMgb2Ygc29tZSBpbnN0cnVjdGlvbnMKK2FzIHJlc2VydmVkIChgLycpLiAgQnkgZGVmYXVsdCwgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24sIFBTSU0gd2lsbCBjaGVjawordGhlIHJlc2VydmVkIGZpZWxkcyBjYXVzaW5nIGFuIGludmFsaWQgaW5zdHJ1Y3Rpb24gZXhjZXB0aW9uIGlmIGEKK2ZpZWxkIGlzIGludmFsaWQuICBEaXNhYmxpbmcgdGhpcyBvcHRpb24gZWxpbWluYXRlcyB0aGlzIHRlc3QuICBUaGlzCitpcyBhdCB0aGUgc2xpZ2h0IHJpc2sgb2YgUFNJTSB0cmVhdGluZyBhbiBpbnZhbGlkIGluc3RydWN0aW9uIGFzCit2YWxpZC4KKworCisKKy0tZW5hYmxlLXNpbS1mbG9hdAorCisKK0luY2x1ZGUgc3VwcG9ydCBmb3IgaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQuCisKKworCistLWVuYWJsZS1zaW0tbW9uaXRvcj1tb24KKworCitJbmNsdWRlIHN1cHBvcnQgZm9yIGJhc2ljIGluc3RydWN0aW9uIGNvdW50aW5nLgorCitJZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHRoZSBwZXJmb3JtYW5jZSBvZiBlaXRoZXIgeW91IHByb2dyYW0gb3IKK3RoZSBzaW11bGF0b3IgdGhlbiB5b3UgY2FuIGRpc2FibGUgdGhpcyBvcHRpb24uCisKKworCistLWVuYWJsZS1zaW0tbW9kZWw9d2hpY2gKKworSGFyZHdpcmUgdGhlIHByb2Nlc3NvciB0aGF0IHdpbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSB3aGVuIG1vZGVsaW5nCitleGVjdXRpb24gdW5pdHMuCisKKworCistLWVuYWJsZS1zaW0tZGVmYXVsdC1tb2RlbD13aGljaAorCisKK1NwZWNpZnkgdGhlIHByb2Nlc3NvciBvZiBjaG9pY2UgZm9yIHRoZSBleGVjdXRpb24gdW5pdCBtb2RlbC4KKworCisKKy0tZW5hYmxlLXNpbS1tb2RlbC1pc3N1ZQorCisKK0luY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIG1vZGVsaW5nIG9mIHByb2Nlc3NvciBleGVjdXRpb24gdW5pdHMuCisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RZUElDQUwgQ09ORklHVVJBVElPTiBPUFRJT05TOgorCisKKwlWRUEgQ09ERSBPTkxZOgorCisJSGVyZSBvZiBub3RlIGFyZToKKworCQlvCXJhbXAgdXAgdGhlIGNvbXBpbGVyIG9wdGlvbnMgKHNvbWUKKwkJCW9mIHRoZSBiZWxvdyBhcmUgUDUgc3BlY2lmaWMpLgorCisJCW8JZGlzYWJsZSBhbnl0aGluZyBub3QgdXNlZAorCisgICAgICAgIENDPWdjYyAuL2NvbmZpZ3VyZSBcCisgICAgICAgICAgICAgICAgLS1wcmVmaXg9L2FwcGxpY2F0aW9ucy9wc2ltIFwKKyAgICAgICAgICAgICAgICAtLXRhcmdldD1wb3dlcnBjLXVua25vd24tZWFiaSBcCisgICAgICAgICAgICAgICAgLS1lbmFibGUtc2ltLXBvd2VycGMgXAorICAgICAgICAgICAgICAgIC0tZW5hYmxlLXNpbS13YXJuaW5ncyBcCisgICAgICAgICAgICAgICAgLS1lbmFibGUtc2ltLWlubGluZSBcCisgICAgICAgICAgICAgICAgLS1kaXNhYmxlLXNpbS1zbXAgXAorICAgICAgICAgICAgICAgIC0tZW5hYmxlLXNpbS1kdXBsaWNhdGUgXAorICAgICAgICAgICAgICAgIC0tZW5hYmxlLXNpbS1lbmRpYW49YmlnIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtc2ltLXhvci1lbmRpYW4gXAorICAgICAgICAgICAgICAgIC0tZW5hYmxlLXNpbS1lbnY9dXNlciBcCisgICAgICAgICAgICAgICAgLS1kaXNhYmxlLXNpbS1yZXNlcnZlZC1iaXRzIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtc2ltLWFzc2VydCBcCisgICAgICAgICAgICAgICAgLS1kaXNhYmxlLXNpbS10cmFjZSBcCisgICAgICAgICAgICAgICAgLS1lbmFibGUtc2ltLWNmbGFncz0nLWcwLC1PMiwtZm5vLXN0cmVuZ3RoLXJlZHVjZSwtZm9taXQtZnJhbWUtcG9pbnRlcicKKworCisJT0VBIENPREUgT05MWToKKworCVRoZSBrZXkgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGFyZToKKworCQlvCXR1cm4gb2ZmIHRoZSBpbnN0cnVjdGlvbiBjYWNoZS4gIFRoZSBvdmVyaGVhZAorCQkJb2YgZmx1c2hpbmcgYW5kIHJlbG9hZGluZyBpdCBpcyBncmVhdGVyIHRoYW4KKwkJCW5vdCBoYXZpbmcgYSBjYWNoZS4KKworCQlvCXVzZSBhIHN3aXRjaCBzdGF0ZW1lbnQgKHBwYy1vcGNvZGUtZmxhdCkgZm9yCisJCQl0aGUgaW5zdHJ1Y3Rpb24gZGVjb2RlIGFuZCB0aGVuICgtTzMpIGZ1bGx5CisJCQlpbmxpbmUgYWxsIGZ1bmN0aW9ucy4KKworCQlvCS0tZW5hYmxlLXNpbS13YXJuaW5ncyBpcyBub3QgcHJlc2VudC4gIEdDQyAoMi43LjIpCisJCQlnZXRzIGNvbmZ1c2VkIGJ5IHRoZSBpbnN0cnVjdGlvbiBkZWNvZGUgdGFibGUKKwkJCWdlbmVyYXRlZCBieSBpZ2VuIChjb250YWlucyBhIHBlcmZlY3Qgc3dpdGNoKQorCQkJYW5kLCBhcyBhIGNvbnNlcXVlbmNlLCBnZW5lcmF0ZXMgYSBib2d1cyB3YXJuaW5nLgorCisJQ0M9Z2NjIC4vY29uZmlndXJlIFwKKyAgICAgICAgICAgICAgICAtLXByZWZpeD0vYXBwbGljYXRpb25zL3BzaW0gXAorICAgICAgICAgICAgICAgIC0tdGFyZ2V0PXBvd2VycGMtdW5rbm93bi1lYWJpIFwKKyAgICAgICAgICAgICAgICAtLWVuYWJsZS1zaW0tcG93ZXJwYyBcCisgICAgICAgICAgICAgICAgLS1lbmFibGUtc2ltLWlubGluZSBcCisgICAgICAgICAgICAgICAgLS1kaXNhYmxlLXNpbS1zbXAgXAorICAgICAgICAgICAgICAgIC0tZW5hYmxlLXNpbS1kdXBsaWNhdGUgXAorICAgICAgICAgICAgICAgIC0tZW5hYmxlLXNpbS1lbmRpYW49YmlnIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtc2ltLXhvci1lbmRpYW4gXAorICAgICAgICAgICAgICAgIC0tZW5hYmxlLXNpbS1lbnY9b3BlcmF0aW5nIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtc2ltLXJlc2VydmVkLWJpdHMgXAorICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1zaW0tYXNzZXJ0IFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtc2ltLXRyYWNlIFwKKyAgICAgICAgICAgICAgICAtLWVuYWJsZS1zaW0tb3Bjb2RlPXBwYy1vcGNvZGUtZmxhdCBcCisgICAgICAgICAgICAgICAgLS1kaXNhYmxlLXNpbS1pY2FjaGUgXAorICAgICAgICAgICAgICAgIC0tZW5hYmxlLXNpbS1jZmxhZ3M9Jy1nMCwtTzMsLWZuby1zdHJlbmd0aC1yZWR1Y2UsLWZvbWl0LWZyYW1lLXBvaW50ZXInCmRpZmYgLS1naXQgYS9zaW0vcHBjL01ha2VmaWxlLmluIGIvc2ltL3BwYy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjJiMzEwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDY2MCBAQAorIworIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisjCisjICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworCitkZWZhdWx0OiBhbGwKKworVlBBVEggPSBAc3JjZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3NyY3Jvb3QgPSAkKHNyY2RpcikvLi4vLi4KKworcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorCitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorYmluZGlyID0gQGJpbmRpckAKK2xpYmRpciA9IEBsaWJkaXJACit0b29sZGlyID0gJChsaWJkaXIpLyQodGFyZ2V0X2FsaWFzKQorCitkYXRhZGlyID0gQGRhdGFkaXJACittYW5kaXIgPSBAbWFuZGlyQAorbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCittYW4yZGlyID0gJChtYW5kaXIpL21hbjIKK21hbjNkaXIgPSAkKG1hbmRpcikvbWFuMworbWFuNGRpciA9ICQobWFuZGlyKS9tYW40CittYW41ZGlyID0gJChtYW5kaXIpL21hbjUKK21hbjZkaXIgPSAkKG1hbmRpcikvbWFuNgorbWFuN2RpciA9ICQobWFuZGlyKS9tYW43CittYW44ZGlyID0gJChtYW5kaXIpL21hbjgKK21hbjlkaXIgPSAkKG1hbmRpcikvbWFuOQoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAorCisjIFRoaXMgY2FuIGJlIHJlZmVyZW5jZWQgYnkgdGhlIGdldHRleHQgY29uZmlndXJhdGlvbiBjb2RlLgordG9wX2J1aWxkZGlyID0gLi4KKworRVhFRVhUID0gQEVYRUVYVEAKK1NIRUxMID0gL2Jpbi9zaAorCitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKKworQVIgPSBAQVJACitBUl9GTEFHUyA9IHJjCitDQyA9IEBDQ0AKK0NGTEFHUyA9IEBDRkxBR1NACitDQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAorQklTT04gPSBiaXNvbgorTUFLRUlORk8gPSBtYWtlaW5mbworUkFOTElCID0gQFJBTkxJQkAKKworU0lNX0NGTEFHUyA9IEBzaW1fY2ZsYWdzQAorSU5MSU5FX0NGTEFHUyA9IEBzaW1faW5saW5lQAorQlNXQVBfQ0ZMQUdTID0gQHNpbV9ic3dhcEAKK0VORElBTl9DRkxBR1MgPSBAc2ltX2VuZGlhbkAKK1JFR1BBUk1fQ0ZMQUdTID0gQHNpbV9yZWdwYXJtQAorU1REQ0FMTF9DRkxBR1MgPSBAc2ltX3N0ZGNhbGxACitIT1NURU5ESUFOX0NGTEFHUyA9IEBzaW1faG9zdGVuZGlhbkAKK1NNUF9DRkxBR1MgPSBAc2ltX3NtcEAKK1hPUl9FTkRJQU5fQ0ZMQUdTID0gQHNpbV94b3JfZW5kaWFuQAorQklUU0laRV9DRkxBR1MgPSBAc2ltX2JpdHNpemVACitIT1NUQklUU0laRV9DRkxBR1MgPSBAc2ltX2hvc3RiaXRzaXplQAorRU5WX0NGTEFHUyA9IEBzaW1fZW52QAorVElNRUJBU0VfQ0ZMQUdTID0gQHNpbV90aW1lYmFzZUAKK0FMSUdOTUVOVF9DRkxBR1MgPSBAc2ltX2FsaWdubWVudEAKK0ZMT0FUX0NGTEFHUyA9IEBzaW1fZmxvYXRACitUUkFDRV9DRkxBR1MgPSBAc2ltX3RyYWNlQAorQVNTRVJUX0NGTEFHUyA9IEBzaW1fYXNzZXJ0QAorUkVTRVJWRURfQ0ZMQUdTID0gQHNpbV9yZXNlcnZlZEAKK01PTklUT1JfQ0ZMQUdTID0gQHNpbV9tb25pdG9yQAorTU9ERUxfQ0ZMQUdTID0gQHNpbV9tb2RlbEAgQHNpbV9kZWZhdWx0X21vZGVsQCBAc2ltX21vZGVsX2lzc3VlQAorU1RESU9fQ0ZMQUdTID0gQHNpbV9zdGRpb0AKK1RFUk1JT19DRkxBR1MgPSBAc2ltX3Rlcm1pb0AKK1dBUk5JTkdfQ0ZMQUdTID0gQHNpbV93YXJuaW5nc0AKK0RFVlpFUk9fQ0ZMQUdTID0gQHNpbV9kZXZ6ZXJvQAorQ09ORklHX0NGTEFHUyA9ICQoQlNXQVBfQ0ZMQUdTKSBcCisgICQoRU5ESUFOX0NGTEFHUykgXAorICAkKFJFR1BBUk1fQ0ZMQUdTKSBcCisgICQoU1REQ0FMTF9DRkxBR1MpIFwKKyAgJChIT1NURU5ESUFOX0NGTEFHUykgXAorICAkKFNNUF9DRkxBR1MpIFwKKyAgJChYT1JfRU5ESUFOX0NGTEFHUykgXAorICAkKEJJVFNJWkVfQ0ZMQUdTKSBcCisgICQoSE9TVEJJVFNJWkVfQ0ZMQUdTKSBcCisgICQoRU5WX0NGTEFHUykgXAorICAkKFRJTUVCQVNFX0NGTEFHUykgXAorICAkKEFMSUdOTUVOVF9DRkxBR1MpIFwKKyAgJChGTE9BVF9DRkxBR1MpIFwKKyAgJChUUkFDRV9DRkxBR1MpIFwKKyAgJChBU1NFUlRfQ0ZMQUdTKSBcCisgICQoUkVTRVJWRURfQ0ZMQUdTKSBcCisgICQoTU9OSVRPUl9DRkxBR1MpIFwKKyAgJChNT0RFTF9DRkxBR1MpIFwKKyAgJChTVERJT19DRkxBR1MpIFwKKyAgJChURVJNSU9fQ0ZMQUdTKSBcCisgICQoREVWWkVST19DRkxBR1MpCisKK1NURF9DRkxBR1MJPSAkKENGTEFHUykgJChJTkxJTkVfQ0ZMQUdTKSAkKENPTkZJR19DRkxBR1MpICQoV0FSTklOR19DRkxBR1MpICQoU0lNX0NGTEFHUykgJChIREVGSU5FUykgJChUREVGSU5FUykgJChJTkNMVURFUykKK05PV0FSTl9DRkxBR1MJPSAkKENGTEFHUykgJChJTkxJTkVfQ0ZMQUdTKSAkKENPTkZJR19DRkxBR1MpICQoU0lNX0NGTEFHUykgJChIREVGSU5FUykgJChUREVGSU5FUykgJChJTkNMVURFUykKK0JVSUxEX0NGTEFHUwk9IC1nIC1PICQoSU5DTFVERVMpICQoV0FSTklOR19DRkxBR1MpCisKK0JVSUxEX0xERkxBR1MJPQorCitDT05GSUdfRklMRSA9IEBzaW1fY29uZmlnQAorSUdFTl9PUENPREVfUlVMRVMgPSBAc2ltX29wY29kZUAKK0lHRU5fREVDT0RFX01FQ0hBTklTTSA9IEBzaW1fZGVjb2RlX21lY2hhbmlzbUAKK0lHRU5fRFVQTElDQVRFID0gQHNpbV9kdXBACitJR0VOX0pVTVAgPSBAc2ltX2p1bXBACitJR0VOX0ZJTFRFUiA9IEBzaW1fZmlsdGVyQAorSUdFTl9JQ0FDSEUgPSBAc2ltX2ljYWNoZUAKK0lHRU5fU01QID0gQHNpbV9pZ2VuX3NtcEAKK0lHRU5fTElORV9OUiA9IEBzaW1fbGluZV9uckAKK0RHRU5fRkxBR1MgPSBAc2ltX3N3aXRjaEAKKworSERFRklORVMgPSBASERFRklORVNACitUREVGSU5FUyA9CitJR0VOX0ZMQUdTID0gXAorCSQoSUdFTl9ERUNPREVfTUVDSEFOSVNNKSBcCisJJChJR0VOX0RVUExJQ0FURSkgXAorCSQoSUdFTl9KVU1QKSBcCisJJChJR0VOX0ZJTFRFUikgXAorCSQoSUdFTl9JQ0FDSEUpIFwKKwkkKElHRU5fU01QKSBcCisJJChJR0VOX0xJTkVfTlIpCisKKy5OT0VYUE9SVDoKK01BS0VPVkVSUklERVM9CisKK0xJQl9JTkNMVURFUwk9IC1JJChzcmNkaXIpLy4uLy4uL2luY2x1ZGUKK0JGRF9JTkNMVURFUwk9IC1JLi4vLi4vYmZkIC1JJChzcmNkaXIpLy4uLy4uL2JmZAorR0RCX0lOQ0xVREVTCT0gLUkuLi8uLi9nZGIgLUkkKHNyY2RpcikvLi4vLi4vZ2RiICAtSSQoc3JjZGlyKS8uLi8uLi9nZGIvY29uZmlnIC1JJChzcmNkaXIpLy4uLy4uL21tYWxsb2MKK0lOQ0xVREVTCT0gLUkuIC1JJChzcmNkaXIpICQoTElCX0lOQ0xVREVTKSAkKEJGRF9JTkNMVURFUykgJChHREJfSU5DTFVERVMpCisKK0xJQklCRVJUWV9MSUIJPSAuLi8uLi9saWJpYmVydHkvbGliaWJlcnR5LmEKK0JGRF9MSUIJCT0gLi4vLi4vYmZkL2xpYmJmZC5hCisKK0lOVExMSUJTID0gQElOVExMSUJTQAorSU5UTERFUFMgPSBASU5UTERFUFNACisKK1RBUkdFVExJQgk9IGxpYnNpbS5hCisKK2FsbDoJcnVuICQoVEFSR0VUTElCKSAkKEdEQl9PQkopCisKKy5jLm86CisJJChDQykgLWMgJChTVERfQ0ZMQUdTKSAkPAorCisKKworQkFTSUNTX0ggPSBcCisJYmFzaWNzLmggXAorCWNvbmZpZy5oIFwKKwlwcGMtY29uZmlnLmggXAorCWlubGluZS5oIFwKKwlzaW1fY2FsbGJhY2tzLmggXAorCWRlYnVnLmggZmlsdGVyX2ZpbGVuYW1lLmggXAorCXdvcmRzLmggXAorCWJpdHMuaCBcCisJc2ltLWVuZGlhbi5oCisKK1BTSU1fSCA9IFwKKwlwc2ltLmggXAorCSQoQkFTSUNTX0gpCisKK0lERUNPREVfSCA9IFwKKwlpZGVjb2RlLmggXAorCWlkZWNvZGVfZXhwcmVzc2lvbi5oIFwKKwlpZGVjb2RlX2JyYW5jaC5oIFwKKwlpZGVjb2RlX2ZpZWxkcy5oIFwKKwlpY2FjaGUuaAorCitSRUdJU1RFUlNfSCA9IFwKKwlyZWdpc3RlcnMuaCBcCisJc3ByZWcuaAorCitDUFVfSCA9IFwKKwljcHUuaCBcCisJJChCQVNJQ1NfSCkgXAorCSQoUkVHSVNURVJTX0gpIFwKKwkkKElERUNPREVfSCkgXAorCWRldmljZS5oIFwKKwljb3JlZmlsZS5oIFwKKwl2bS5oIFwKKwlldmVudHMuaCBcCisJaW50ZXJydXB0cy5oIFwKKwlwc2ltLmggXAorCWl0YWJsZS5oIFwKKwltb24uaCBcCisJbW9kZWwuaAorCitERVZJQ0VfVEFCTEVfSCA9IFwKKwkkKEJBU0lDU19IKSBcCisJZGV2aWNlX3RhYmxlLmggXAorCWRldmljZS5oIFwKKwl0cmVlLmggXAorCWh3LmgKKworRU1VTF9HRU5FUklDX0ggPSBcCisJJChDUFVfSCkgXAorCSQoSURFQ09ERV9IKSBcCisJZW11bF9nZW5lcmljLmggXAorCXRyZWUuaCBcCisJb3NfZW11bC5oCisKKworSU5MSU5FID0gXAorCWlubGluZS5oIFwKKwlpbmxpbmUuYworCitCVUlMVF9TUkNfV09fQ09ORklHID0gXAorCWljYWNoZS5oIGljYWNoZS5jIFwKKwlzdXBwb3J0Lmggc3VwcG9ydC5jIFwKKwlpZGVjb2RlLmggaWRlY29kZS5jIFwKKwlzZW1hbnRpY3MuaCBzZW1hbnRpY3MuYyBcCisJaXRhYmxlLmggaXRhYmxlLmMgXAorCXNwcmVnLmggc3ByZWcuYyBcCisJbW9kZWwuaCBtb2RlbC5jIFwKKwlzdXBwb3J0Lmggc3VwcG9ydC5jIFwKKwlway5oIFwKKwlody5oIGh3LmMgXAorCWZpbHRlcl9ob3N0LmMgXAorCUBzaW1fdGFyZ192YWxzQAorCitCVUlMVF9TUkMgPSBcCisJJChCVUlMVF9TUkNfV09fQ09ORklHKSBcCisJY29uZmlnLmggXAorCXBwYy1jb25maWcuaCAKKworTElCX0lOTElORV9TUkMgPSBcCisJcHNpbS5jIFwKKwliaXRzLmMgXAorCWRlYnVnLmMgXAorCXNpbS1lbmRpYW4uYyBcCisJc2ltLWVuZGlhbi5oIFwKKwlzaW0tZW5kaWFuLW4uaCBcCisJdm0uYyBcCisJdm1fbi5oIFwKKwljb3JlZmlsZS5jIFwKKwlldmVudHMuYyBcCisJb3NfZW11bC5jIFwKKwlyZWdpc3RlcnMuYyBcCisJY3B1LmMgXAorCWludGVycnVwdHMuYyBcCisJZGV2aWNlLmMgXAorCXRyZWUuYyBcCisJZGV2aWNlX3RhYmxlLmMgXAorCWNhcC5jIFwKKwltb24uYyBcCisJb3B0aW9ucy5jCisKK0xJQl9TUkMgPSBcCisJJChQQUNLQUdFX1NSQykgXAorCSQoSFdfU1JDKSBcCisJJChMSUJfSU5MSU5FX1NSQykKKworTUFJTl9TUkMgPSBcCisJbWFpbi5jIFwKKwlzaW1fY2FsbHMuYworCisKKyMgTk9URTogc2VtYW50aWNzLCBpZGVjb2RlIGFuZCBwc2ltIHB1dCBsYXN0IHNvIHNtYWxsZXIgZmlsZXMgYXJlIGNvbXBpbGVkCisjICAgICAgIGZpcnN0CitMSUJfT0JKID0gXAorCWRlYnVnLm8gXAorCWZpbHRlcl9maWxlbmFtZS5vIFwKKwliaXRzLm8gXAorCXNpbS1lbmRpYW4ubyBcCisJb3NfZW11bC5vIFwKKwllbXVsX2dlbmVyaWMubyBcCisJZW11bF9idWdhcGkubyBcCisJZW11bF9jaGlycC5vIFwKKwllbXVsX25ldGJzZC5vIFwKKwllbXVsX3VuaXgubyBcCisJcmVnaXN0ZXJzLm8gXAorCXZtLm8gXAorCWNvcmVmaWxlLm8gXAorCW1vZGVsLm8gXAorCXNwcmVnLm8gXAorCWNwdS5vIFwKKwlpbnRlcnJ1cHRzLm8gXAorCWV2ZW50cy5vIFwKKwljYXAubyBcCisJZGV2aWNlLm8gXAorCXRyZWUubyBcCisJZGV2aWNlX3RhYmxlLm8gXAorCWl0YWJsZS5vIFwKKwltb24ubyBcCisJaWNhY2hlLm8gXAorCXNlbWFudGljcy5vIFwKKwlpZGVjb2RlLm8gXAorCXN1cHBvcnQubyBcCisJcHNpbS5vIFwKKwkkKFBBQ0tBR0VfT0JKKSBcCisJJChIV19PQkopIFwKKwlvcHRpb25zLm8KKworCitHREJfT0JKID0gc2ltX2NhbGxzLm8gQHNpbV9jYWxsYmFja0AKKworSFdfU1JDID0gQHNpbV9od19zcmNACitIV19PQkogPSBAc2ltX2h3X29iakAKKworUEFDS0FHRV9TUkMgPSBAc2ltX3BrX3NyY0AKK1BBQ0tBR0VfT0JKID0gQHNpbV9wa19vYmpACisKKworcHNpbTogJChUQVJHRVRMSUIpIG1haW4ubyAkKExJQklCRVJUWV9MSUIpICQoQkZEX0xJQikgJChMSUJTKSAkKElOVExERVBTKQorCSQoQ0MpICQoQ0ZMQUdTKSAkKFNJTV9DRkxBR1MpICQoTERGTEFHUykgLW8gcHNpbSQoRVhFRVhUKSBtYWluLm8gJChUQVJHRVRMSUIpICQoQkZEX0xJQikgJChJTlRMTElCUykgJChMSUJJQkVSVFlfTElCKSAkKExJQlMpCisKK3J1bjogcHNpbQorCXJtIC1mIHJ1biQoRVhFRVhUKQorCWxuIHBzaW0kKEVYRUVYVCkgcnVuJChFWEVFWFQpCisKKyQoVEFSR0VUTElCKTogdG1wLWlnZW4gdG1wLWRnZW4gdG1wLWh3IHRtcC1wayB0bXAtZGVmaW5lcyAkKExJQl9PQkopICQoR0RCX09CSikKKwlybSAtZiAkKFRBUkdFVExJQikKKwkkKEFSKSAkKEFSX0ZMQUdTKSAkKFRBUkdFVExJQikgJChMSUJfT0JKKSAkKEdEQl9PQkopCisJJChSQU5MSUIpICQoVEFSR0VUTElCKQorCitwc2ltLm86IHBzaW0uYyBwc2ltLmggdHJlZS5oICQoQ1BVX0gpICQoSURFQ09ERV9IKQorCitiaXRzLm86IGJpdHMuYyAkKEJBU0lDU19IKQorCitkZWJ1Zy5vOiBkZWJ1Zy5jICQoQkFTSUNTX0gpCitmaWx0ZXJfZmlsZW5hbWUubzogZmlsdGVyX2ZpbGVuYW1lLmMgZmlsdGVyX2ZpbGVuYW1lLmggY29uZmlnLmggcHBjLWNvbmZpZy5oCisKK3NpbS1lbmRpYW4ubzogc2ltLWVuZGlhbi5jIHNpbS1lbmRpYW4tbi5oICQoQkFTSUNTX0gpCisKK29zX2VtdWwubzogb3NfZW11bC5jIGVtdWxfbmV0YnNkLmggZW11bF91bml4LmggZW11bF9jaGlycC5oIGVtdWxfYnVnYXBpLmggJChFTVVMX0dFTkVSSUNfSCkKK2VtdWxfZ2VuZXJpYy5vOiBlbXVsX2dlbmVyaWMuYyAkKEVNVUxfR0VORVJJQ19IKQorCitlbXVsX2J1Z2FwaS5vOiBlbXVsX2J1Z2FwaS5jIGVtdWxfYnVnYXBpLmggJChFTVVMX0dFTkVSSUNfSCkKK2VtdWxfY2hpcnAubzogZW11bF9jaGlycC5jIGVtdWxfY2hpcnAuaCAkKEVNVUxfR0VORVJJQ19IKQorZW11bF9uZXRic2QubzogZW11bF9uZXRic2QuYyBlbXVsX25ldGJzZC5oICQoRU1VTF9HRU5FUklDX0gpCitlbXVsX3VuaXgubzogZW11bF91bml4LmMgZW11bF91bml4LmggJChFTVVMX0dFTkVSSUNfSCkKKworcmVnaXN0ZXJzLm86IHJlZ2lzdGVycy5jICQoUkVHSVNURVJTX0gpICQoQkFTSUNTX0gpIAorCitjcHUubzogY3B1LmMgJChDUFVfSCkgJChJREVDT0RFX0gpCisKK2ludGVycnVwdHMubzogaW50ZXJydXB0cy5jICQoQ1BVX0gpICQoSURFQ09ERV9IKSBvc19lbXVsLmgKKworIyBHaXZlbiB0aGF0IGlubGluZXMgYXJlIHR1cm5lZCBvbiBub3csIHJlYnVpbGQgaWRlY29kZSB3aGVuZXZlcgorIyBhbnl0aGluZyBjaGFuZ2VzLgoraWRlY29kZS5vOiBpZGVjb2RlLmMgJChDUFVfSCkgJChJREVDT0RFX0gpIHNlbWFudGljcy5oICQoTElCX0lOTElORV9TUkMpICQoQlVJTFRfU1JDKQorCSQoQ0MpIC1jICQoTk9XQVJOX0NGTEFHUykgJDwKKworIyBkb3VibGUubzogZG91YmxlLmMgZHAtYml0LmMKKwordm0ubzogdm0uYyB2bS5oIHZtX24uaCAkKENQVV9IKQorCitjb3JlZmlsZS5vOiBjb3JlZmlsZS5jIGNvcmVmaWxlLmggY29yZWZpbGUtbi5oICQoQkFTSUNTX0gpICQoREVWSUNFX1RBQkxFX0gpCisKK21vZGVsLm86IG1vZGVsLmMgJChDUFVfSCkKKworZXZlbnRzLm86IGV2ZW50cy5jIGV2ZW50cy5oICQoQkFTSUNTX0gpIAorCitzaW1fY2FsbHMubzogc2ltX2NhbGxzLmMgJChQU0lNX0gpIGl0YWJsZS5oIC4uLy4uL2dkYi90bS5oIG9wdGlvbnMuaAorCitzcHJlZy5vOiBzcHJlZy5jIHNwcmVnLmggc3ByZWcuYyAkKEJBU0lDU19IKQorCittYWluLm86IG1haW4uYyAkKFBTSU1fSCkgaXRhYmxlLmggb3B0aW9ucy5oCisKK2RldmljZS5vOiBkZXZpY2UuYyAkKERFVklDRV9UQUJMRV9IKSBjYXAuaAorCit0cmVlLm86IHRyZWUuYyB0cmVlLmggZGV2aWNlLmggJChERVZJQ0VfVEFCTEVfSCkKKworZGV2aWNlX3RhYmxlLm86IGRldmljZV90YWJsZS5jICQoREVWSUNFX1RBQkxFX0gpIGV2ZW50cy5oIGh3LmMKKworY2FwLm86IGNhcC5jIGNhcC5oICQoQkFTSUNTX0gpCisKK3NlbWFudGljcy5vOiBzZW1hbnRpY3MuYyBzZW1hbnRpY3MuaCAkKENQVV9IKSAkKElERUNPREVfSCkKKwkkKENDKSAtYyAkKE5PV0FSTl9DRkxBR1MpICQ8CisKK2ljYWNoZS5vOiBpY2FjaGUuYyBpY2FjaGUuaCAkKElERUNPREVfSCkgJChDUFVfSCkKKwkkKENDKSAtYyAkKE5PV0FSTl9DRkxBR1MpICQ8CisKK3N1cHBvcnQubzogc3VwcG9ydC5jIHN1cHBvcnQuaCAkKElERUNPREVfSCkgJChDUFVfSCkKKworaXRhYmxlLm86IGl0YWJsZS5jIGl0YWJsZS5oCisKK21vbi5vOiBtb24uYyAkKENQVV9IKQorCisjIEdEQiBhZnRlciA0LjE2IGV4cGVjdHMgdGhlIGRlZmF1bHRfY2FsbGJhY2sgc3RydWN0dXJlIHRvIGJlIHNldHVwLgorIyBBcyBhIGtsdWRnZSwgYnVpbGQgdGhlIGNvbW1vbiBzdHVmZiBoZXJlIGZvciBub3cuCitnZW50bWFwOiAuLi9jb21tb24vZ2VudG1hcC5jIE1ha2VmaWxlIHRhcmctdmFscy5kZWYKKwkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9GTEFHUykgLUkuIC1JLi4vY29tbW9uIC1JJChzcmNkaXIpLy4uL2NvbW1vbiAtbyBnZW50bWFwICQ8ICQoQlVJTERfTElCUykKKwordGFyZy12YWxzLmRlZjogJChzcmNkaXIpLy4uL2NvbW1vbi9ubHR2YWxzLmRlZgorCXJtIC1mIHRhcmctdmFscy5kZWYgdG1wLWRlZgorCWNhdCAkKHNyY2RpcikvLi4vY29tbW9uL25sdHZhbHMuZGVmID4gdG1wLXZhbHMuZGVmCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC12YWxzLmRlZiB0YXJnLXZhbHMuZGVmCisKK3RhcmctdmFscy5oOiBNYWtlZmlsZSBnZW50bWFwICQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZQorCXJtIC1mIHRtcC12YWxzLmgKKwkuL2dlbnRtYXAgLWggPiB0bXAtdmFscy5oCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC12YWxzLmggdGFyZy12YWxzLmgKKwordGFyZy1tYXAuYzogTWFrZWZpbGUgZ2VudG1hcCAkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UKKwlybSAtZiB0bXAtbWFwLmMKKwkuL2dlbnRtYXAgLWMgPiB0bXAtbWFwLmMKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLW1hcC5jIHRhcmctbWFwLmMKKworY2FsbGJhY2subzogLi4vY29tbW9uL2NhbGxiYWNrLmMgdGFyZy12YWxzLmggY29uZmlnLmgKKwkkKENDKSAtYyAkKFNURF9DRkxBR1MpIC1ESEFWRV9DT05GSUdfSCAkPAorCit0YXJnLW1hcC5vOiB0YXJnLW1hcC5jIHRhcmctdmFscy5oCisKKyMgUmVidWlsZCBvcHRpb25zIHdoZW5ldmVyIHNvbWV0aGluZyBjaGFuZ2VzIHNvIHRoZSBkYXRlL3RpbWUgaXMgdXAgdG8gZGF0ZS4KK29wdGlvbnMubzogb3B0aW9ucy5jICQoQkFTSUNTX0gpICQoQ1BVX0gpICQoSURFQ09ERV9IKSAkKElOTElORSkgJChMSUJfU1JDKSAkKEJVSUxUX1NSQykgY29uZmlnLnN0YXR1cyBNYWtlZmlsZSBkZWZpbmVzLmgKKwkkKENDKSAtYyAkKFNURF9DRkxBR1MpICctRE9QQ09ERV9SVUxFUz0iQHNpbV9vcGNvZGVAIicgJy1ESUdFTl9GTEFHUz0iJChJR0VOX0ZMQUdTKSInICctRERHRU5fRkxBR1M9IiQoREdFTl9GTEFHUykiJyAkPAorCit0bXAtZGVmaW5lczogY29uZmlnLmggTWFrZWZpbGUKKwlzZWQgLW4gLWUgJy9eI2RlZmluZSBIQVZFXy9zLyAxJCQvIiwvJyAtZSAnL14jZGVmaW5lIEhBVkVfL3MvLyJIQVZFXy9wJyA8IGNvbmZpZy5oID4gdG1wLWRlZmluZXMuaAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtZGVmaW5lcy5oIGRlZmluZXMuaAorCXRvdWNoIHRtcC1kZWZpbmVzCisKKyMKKyMgUnVsZXMgdG8gY3JlYXRlIHRoZSBidWlsdCBjIHNvdXJjZSBjb2RlIGZpbGVzCisjCisKK3BwYy1jb25maWcuaDogJChDT05GSUdfRklMRSkKKwljcCAkKHNyY2RpcikvJChDT05GSUdfRklMRSkgcHBjLWNvbmZpZy5oCisKKwordG1wLWRnZW46IGRnZW4gcHBjLXNwci10YWJsZSAkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UKKwkuL2RnZW4gJChER0VOX0ZMQUdTKSBcCisJCS1yICQoc3JjZGlyKS9wcGMtc3ByLXRhYmxlIFwKKwkJLW4gc3ByZWcuaCAtaHAgdG1wLXNwcmVnLmggXAorCQktbiBzcHJlZy5jIC1wICB0bXAtc3ByZWcuYworCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc3ByZWcuaCBzcHJlZy5oCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zcHJlZy5jIHNwcmVnLmMKKwl0b3VjaCB0bXAtZGdlbgorCisKK3RtcC1pZ2VuOiBpZ2VuIHBwYy1pbnN0cnVjdGlvbnMgJChJR0VOX09QQ09ERV9SVUxFUykgcHBjLWNhY2hlLXJ1bGVzICQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtbGQtZGVjb2RlIHRtcC1sZC1jYWNoZSB0bXAtbGQtaW5zbiB0bXAtZmlsdGVyCisJLi9pZ2VuCSQoSUdFTl9GTEFHUykgXAorCQktbyAkKHNyY2RpcikvJChJR0VOX09QQ09ERV9SVUxFUykgXAorCQktayAkKHNyY2RpcikvcHBjLWNhY2hlLXJ1bGVzIFwKKwkJLWkgJChzcmNkaXIpL3BwYy1pbnN0cnVjdGlvbnMgXAorCQktbiBpY2FjaGUuaCAgICAtaGMgdG1wLWljYWNoZS5oIFwKKwkJLW4gaWNhY2hlLmMgICAgLWMgIHRtcC1pY2FjaGUuYyBcCisJCS1uIHNlbWFudGljcy5oIC1ocyB0bXAtc2VtYW50aWNzLmggXAorCQktbiBzZW1hbnRpY3MuYyAtcyAgdG1wLXNlbWFudGljcy5jIFwKKwkJLW4gaWRlY29kZS5oICAgLWhkIHRtcC1pZGVjb2RlLmggXAorCQktbiBpZGVjb2RlLmMgICAtZCAgdG1wLWlkZWNvZGUuYyBcCisJCS1uIGl0YWJsZS5oICAgIC1odCB0bXAtaXRhYmxlLmggXAorCQktbiBpdGFibGUuYyAgICAtdCAgdG1wLWl0YWJsZS5jIFwKKwkJLW4gbW9kZWwuaCAgICAgLWhtIHRtcC1tb2RlbC5oIFwKKwkJLW4gbW9kZWwuYyAgICAgLW0gIHRtcC1tb2RlbC5jIFwKKwkJLW4gc3VwcG9ydC5oICAgLWhmIHRtcC1zdXBwb3J0LmggXAorCQktbiBzdXBwb3J0LmMgICAtZiAgdG1wLXN1cHBvcnQuYworCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWNhY2hlLmggaWNhY2hlLmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWljYWNoZS5jIGljYWNoZS5jCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pZGVjb2RlLmggaWRlY29kZS5oCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pZGVjb2RlLmMgaWRlY29kZS5jCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1zZW1hbnRpY3MuaCBzZW1hbnRpY3MuaAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc2VtYW50aWNzLmMgc2VtYW50aWNzLmMKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWl0YWJsZS5oIGl0YWJsZS5oCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pdGFibGUuYyBpdGFibGUuYworCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtbW9kZWwuaCBtb2RlbC5oCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1tb2RlbC5jIG1vZGVsLmMKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXN1cHBvcnQuaCBzdXBwb3J0LmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXN1cHBvcnQuYyBzdXBwb3J0LmMKKwl0b3VjaCB0bXAtaWdlbgorCisjIE5PVEU6IFNvbWUgdmVyc2lvbnMgb2YgbWFrZSBkb24ndCBoYW5kbGUgZmlsZXMgY3JlYXRlZCBhcyBzaWRlLWVmZmVjdHMKKyMgdW5jb21tZW50IHRoZSBiZWxvdyBpZiB0aGF0IGlzIHRoZSBjYXNlLgorCiskKFRBUkdFVExJQik6IHRtcC1pZ2VuIHRtcC1kZ2VuCitpdGFibGUuaCBpdGFibGUuYyBpY2FjaGUuaCBpY2FjaGUuYyBpZGVjb2RlLmggaWRlY29kZS5jIHNlbWFudGljcy5oIHNlbWFudGljcy5jIG1vZGVsLmggbW9kZWwuYyBzdXBwb3J0Lmggc3VwcG9ydC5jOiB0bXAtaWdlbgorc3ByZWcuaCBzcHJlZy5jOiB0bXAtZGdlbgorCitkZ2VuOiBkZ2VuLm8gdGFibGUubyBsZi5vIG1pc2MubyBmaWx0ZXJfaG9zdC5vCisJJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtbyBkZ2VuIGRnZW4ubyB0YWJsZS5vIGxmLm8gbWlzYy5vIGZpbHRlcl9ob3N0Lm8gJChCVUlMRF9MSUJTKQorCitpZ2VuOiBpZ2VuLm8gdGFibGUubyBsZi5vIG1pc2MubyBmaWx0ZXJfaG9zdC5vIGxkLWRlY29kZS5vIGxkLWNhY2hlLm8gZmlsdGVyLm8gbGQtaW5zbi5vIGdlbi1tb2RlbC5vIGdlbi1pdGFibGUubyBnZW4taWNhY2hlLm8gZ2VuLXNlbWFudGljcy5vIGdlbi1pZGVjb2RlLm8gZ2VuLXN1cHBvcnQubworCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgJChCVUlMRF9MREZMQUdTKSAtbyBpZ2VuIGlnZW4ubyB0YWJsZS5vIGxmLm8gbWlzYy5vIGZpbHRlcl9ob3N0Lm8gbGQtZGVjb2RlLm8gbGQtY2FjaGUubyBmaWx0ZXIubyBsZC1pbnNuLm8gZ2VuLW1vZGVsLm8gZ2VuLWl0YWJsZS5vIGdlbi1pY2FjaGUubyBnZW4tc2VtYW50aWNzLm8gZ2VuLWlkZWNvZGUubyBnZW4tc3VwcG9ydC5vICQoQlVJTERfTElCUykKKworZmlsdGVyX2hvc3QuYzogZmlsdGVyX2ZpbGVuYW1lLmMKKwljYXQgJChzcmNkaXIpL2ZpbHRlcl9maWxlbmFtZS5jID4gZmlsdGVyX2hvc3QuYworCitmaWx0ZXJfaG9zdC5vOiBmaWx0ZXJfaG9zdC5jIGZpbHRlcl9maWxlbmFtZS5oIGNvbmZpZy5oIHBwYy1jb25maWcuaAorCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgLWMgZmlsdGVyX2hvc3QuYworCit0YWJsZS5vOiB0YWJsZS5jIG1pc2MuaCBmaWx0ZXJfZmlsZW5hbWUuaCBsZi5oIHRhYmxlLmgKKwkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS90YWJsZS5jCisKK2xmLm86IGxmLmMgbWlzYy5oIGZpbHRlcl9maWxlbmFtZS5oIGxmLmgKKwkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS9sZi5jCisKK2ZpbHRlci5vOiBmaWx0ZXIuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGZpbHRlci5oCisJJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtYyAkKHNyY2RpcikvZmlsdGVyLmMKK3RtcC1maWx0ZXI6IGZpbHRlci5jIG1pc2MuaCBtaXNjLm8KKwkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpICQoQlVJTERfTERGTEFHUykgLW8gdG1wLWZpbHRlciAtRE1BSU4gJChzcmNkaXIpL2ZpbHRlci5jIG1pc2MubyAkKEJVSUxEX0xJQlMpCisKK2xkLWRlY29kZS5vOiBsZC1kZWNvZGUuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGxkLWRlY29kZS5oCisJJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtYyAkKHNyY2RpcikvbGQtZGVjb2RlLmMKK3RtcC1sZC1kZWNvZGU6IGxkLWRlY29kZS5vIG1pc2MubyBsZi5vIHRhYmxlLm8gZmlsdGVyX2hvc3QubyAKKwkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpICQoQlVJTERfTERGTEFHUykgLW8gdG1wLWxkLWRlY29kZSAtRE1BSU4gJChzcmNkaXIpL2xkLWRlY29kZS5jIG1pc2MubyBsZi5vIHRhYmxlLm8gZmlsdGVyX2hvc3QubyAkKEJVSUxEX0xJQlMpCisKK2xkLWNhY2hlLm86IGxkLWNhY2hlLmMgbWlzYy5oIGxmLmggdGFibGUuaCBsZC1jYWNoZS5oCisJJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtYyAkKHNyY2RpcikvbGQtY2FjaGUuYwordG1wLWxkLWNhY2hlOiBsZC1jYWNoZS5vIG1pc2MubyBsZi5vIHRhYmxlLm8gZmlsdGVyX2hvc3QubyAKKwkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpICQoQlVJTERfTERGTEFHUykgLW8gdG1wLWxkLWNhY2hlIC1ETUFJTiAkKHNyY2RpcikvbGQtY2FjaGUuYyBtaXNjLm8gbGYubyB0YWJsZS5vIGZpbHRlcl9ob3N0Lm8gJChCVUlMRF9MSUJTKQorCitsZC1pbnNuLm86IGxkLWluc24uYyBtaXNjLmggbGYuaCB0YWJsZS5oIGxkLWluc24uaCBsZC1kZWNvZGUuaCBpZ2VuLmgKKwkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS9sZC1pbnNuLmMKK3RtcC1sZC1pbnNuOiBsZC1pbnNuLm8gbWlzYy5vIGxmLm8gdGFibGUubyBsZC1kZWNvZGUubyBmaWx0ZXJfaG9zdC5vIGZpbHRlci5vCisJJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAkKEJVSUxEX0xERkxBR1MpIC1vIHRtcC1sZC1pbnNuIC1ETUFJTiAkKHNyY2RpcikvbGQtaW5zbi5jIG1pc2MubyBsZi5vIHRhYmxlLm8gbGQtZGVjb2RlLm8gZmlsdGVyX2hvc3QubyBmaWx0ZXIubyAkKEJVSUxEX0xJQlMpCisKK2dlbi1tb2RlbC5vOiBnZW4tbW9kZWwuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGdlbi1tb2RlbC5oIGxkLWRlY29kZS5oIGlnZW4uaCBsZC1pbnNuLmgKKwkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS9nZW4tbW9kZWwuYworCitnZW4taXRhYmxlLm86IGdlbi1pdGFibGUuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGdlbi1pdGFibGUuaCBsZC1kZWNvZGUuaCBpZ2VuLmggbGQtaW5zbi5oIGlnZW4uaAorCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgLWMgJChzcmNkaXIpL2dlbi1pdGFibGUuYworCitnZW4taWNhY2hlLm86IGdlbi1pY2FjaGUuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGdlbi1pY2FjaGUuaCBsZC1kZWNvZGUuaCBpZ2VuLmggbGQtaW5zbi5oIGdlbi1zZW1hbnRpY3MuaCBnZW4taWRlY29kZS5oCisJJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtYyAkKHNyY2RpcikvZ2VuLWljYWNoZS5jCisKK2dlbi1zZW1hbnRpY3MubzogZ2VuLXNlbWFudGljcy5jIG1pc2MuaCBsZi5oIHRhYmxlLmggZ2VuLXNlbWFudGljcy5oIGxkLWRlY29kZS5oIGlnZW4uaCBsZC1pbnNuLmgKKwkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1jICQoc3JjZGlyKS9nZW4tc2VtYW50aWNzLmMKKworZ2VuLWlkZWNvZGUubzogZ2VuLWlkZWNvZGUuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGdlbi1pZGVjb2RlLmggZ2VuLWljYWNoZS5oIGdlbi1zZW1hbnRpY3MuaCBsZC1kZWNvZGUuaCBpZ2VuLmggbGQtaW5zbi5oIAorCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgLWMgJChzcmNkaXIpL2dlbi1pZGVjb2RlLmMKKworZ2VuLXN1cHBvcnQubzogZ2VuLXN1cHBvcnQuYyBtaXNjLmggbGYuaCB0YWJsZS5oIGdlbi1zdXBwb3J0LmggbGQtZGVjb2RlLmggaWdlbi5oIGxkLWluc24uaAorCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgLWMgJChzcmNkaXIpL2dlbi1zdXBwb3J0LmMKKworZGdlbi5vOiBkZ2VuLmMgbWlzYy5oIGZpbHRlcl9maWxlbmFtZS5oIGxmLmggdGFibGUuaAorCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgLWMgJChzcmNkaXIpL2RnZW4uYworCitpZ2VuLm86IGlnZW4uYyBtaXNjLmggZmlsdGVyX2ZpbGVuYW1lLmggbGYuaCB0YWJsZS5oIGxkLWRlY29kZS5oIGxkLWNhY2hlLmggbGQtaW5zbi5oIGZpbHRlci5oIGdlbi1tb2RlbC5oIGdlbi1pdGFibGUuaCBnZW4taWNhY2hlLmggZ2VuLWlkZWNvZGUuaCBnZW4tc2VtYW50aWNzLmggZ2VuLXN1cHBvcnQuaCBpZ2VuLmggCisJJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtYyAkKHNyY2RpcikvaWdlbi5jCisKK21pc2MubzogbWlzYy5jIG1pc2MuaCBmaWx0ZXJfZmlsZW5hbWUuaAorCSQoQ0NfRk9SX0JVSUxEKSAkKEJVSUxEX0NGTEFHUykgLWMgJChzcmNkaXIpL21pc2MuYworCisKKworIyByZWFsIGhhcmR3YXJlCit0bXAtaHc6IE1ha2VmaWxlICQoSFdfU1JDKSAkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UKKwkjIFRoZSBmaXJzdCBmb3IgbG9vcCBpcyB0byByZW1vdmUgZHVwbGljYXRlcy4KKwlmPSIiOyBcCisJZm9yIGkgaW4gJChIV19TUkMpIDsgZG8gXAorCSAgY2FzZSAiICQkZiAiIGluIFwKKwkgICAgKiIgJCRpICIqKSA7OyBcCisJICAgICopIGY9IiQkZiAkJGkiIDs7IFwKKwkgIGVzYWMgOyBcCisJZG9uZSA7IFwKKwlmb3IgaHcgaW4gJCRmIDsgZG8gZWNobyAkJGh3IDsgZG9uZSBcCisJfCBzZWQgLWUgJ3MvXi4qXChod18uKlwpXC5jL1wxLycgXAorCQktZSAncy9eL2V4dGVybiBjb25zdCBkZXZpY2VfZGVzY3JpcHRvciAvJyBcCisJCS1lICdzLyQkL19kZXZpY2VfZGVzY3JpcHRvclxbXF07LycgXAorCQk+IHRtcC1ody5oCisJZj0iIjsgXAorCWZvciBpIGluICQoSFdfU1JDKSA7IGRvIFwKKwkgIGNhc2UgIiAkJGYgIiBpbiBcCisJICAgICoiICQkaSAiKikgOzsgXAorCSAgICAqKSBmPSIkJGYgJCRpIiA7OyBcCisJICBlc2FjIDsgXAorCWRvbmUgOyBcCisJZm9yIGh3IGluICQkZiA7IGRvIGVjaG8gJCRodyA7IGRvbmUgXAorCXwgc2VkIC1lICdzL14uKlwoaHdfLipcKVwuYy9cMS8nIFwKKwkJLWUgJ3MvXi8gICAgLycgXAorCQktZSAncy8kJC9fZGV2aWNlX2Rlc2NyaXB0b3IsLycgXAorCQk+IHRtcC1ody5jCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1ody5oIGh3LmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWh3LmMgaHcuYworCXRvdWNoIHRtcC1odworCitod19jcHUubzogaHdfY3B1LmMgJChERVZJQ0VfVEFCTEVfSCkKK2h3X2NvcmUubzogaHdfY29yZS5jICQoREVWSUNFX1RBQkxFX0gpCitod19kaXNrLm86IGh3X2Rpc2suYyAkKERFVklDRV9UQUJMRV9IKSBway5oCitod19nbHVlLm86IGh3X2dsdWUuYyAkKERFVklDRV9UQUJMRV9IKQoraHdfaHRhYi5vOiBod19odGFiLmMgJChERVZJQ0VfVEFCTEVfSCkKK2h3X2lkZS5vOiBod19pZGUuYyAkKERFVklDRV9UQUJMRV9IKQoraHdfaW5pdC5vOiBod19pbml0LmMgJChERVZJQ0VfVEFCTEVfSCkKK2h3X2lvYnVzLm86IGh3X2lvYnVzLmMgJChERVZJQ0VfVEFCTEVfSCkKK2h3X21lbW9yeS5vOiBod19tZW1vcnkuYyAkKERFVklDRV9UQUJMRV9IKQoraHdfbnZyYW0ubzogaHdfbnZyYW0uYyAkKERFVklDRV9UQUJMRV9IKQoraHdfb3BpYy5vOiBod19vcGljLmMgJChERVZJQ0VfVEFCTEVfSCkKK2h3X3BhbC5vOiBod19wYWwuYyAkKERFVklDRV9UQUJMRV9IKQoraHdfcGhiLm86IGh3X3BoYi5jICQoREVWSUNFX1RBQkxFX0gpIGh3X3BoYi5oCitod19yZWdpc3Rlci5vOiBod19yZWdpc3Rlci5jICQoREVWSUNFX1RBQkxFX0gpCitod190cmFjZS5vOiBod190cmFjZS5jICQoREVWSUNFX1RBQkxFX0gpCitod192bS5vOiBod192bS5jICQoREVWSUNFX1RBQkxFX0gpCisjIGlnbm9yZSB0aGlzIGxpbmUsIGl0IHN0b3BzIG1ha2UgZnJvbSBnZXR0aW5nIGNvbmZ1c2VkCisKKworCisjIHJlYWwgcGFja2FnZXMKK3RtcC1wazogTWFrZWZpbGUgJChQQUNLQUdFX1NSQykgJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlCisJIyBUaGUgZmlyc3QgZm9yIGxvb3AgaXMgdG8gcmVtb3ZlIGR1cGxpY2F0ZXMuCisJZj0iIjsgXAorCWZvciBpIGluICQoUEFDS0FHRV9TUkMpIDsgZG8gXAorCSAgY2FzZSAiICQkZiAiIGluIFwKKwkgICAgKiIgJCRpICIqKSA7OyBcCisJICAgICopIGY9IiQkZiAkJGkiIDs7IFwKKwkgIGVzYWMgOyBcCisJZG9uZSA7IFwKKwlmb3IgcGsgaW4gJCRmIDsgZG8gZWNobyAkJHBrIDsgZG9uZSBcCisJfCBzZWQgLWUgJ3MvXi4qcGtfXCguKlwpXC5jL1wxLycgXAorCQktZSAncy9eL2V4dGVybiBwYWNrYWdlX2NyZWF0ZV9pbnN0YW5jZV9jYWxsYmFjayBwa18vJyBcCisJCS1lICdzLyQkL19jcmVhdGVfaW5zdGFuY2U7LycgXAorCQk+IHRtcC1way5oCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1way5oIHBrLmgKKwl0b3VjaCB0bXAtcGsKKworcGtfZGlza2xhYmVsLm86IHBrLmggJChERVZJQ0VfVEFCTEVfSCkKKyMgaWdub3JlIHRoaXMgbGluZSwgaXQgc3RvcHMgbWFrZSBmcm9tIGdldHRpbmcgY29uZnVzZWQKKworCisKK3RhZ3MgZXRhZ3M6IFRBR1MKKworVEFHUzogJChCVUlMVF9TUkMpCisJZXRhZ3MgJChzcmNkaXIpLyouaCAkKHNyY2RpcikvKi5jICQoQlVJTFRfU1JDKQorCitjbGVhbiBtb3N0bHljbGVhbjoKKwlybSAtZiB0bXAtKiAqLltvYXNpXSBjb3JlIHBzaW0kKEVYRUVYVCkgcnVuJChFWEVFWFQpIGlnZW4gZGdlbiAkKEJVSUxUX1NSQ19XT19DT05GSUcpIGdlbnRtYXAKKworZGlzdGNsZWFuIHJlYWxjbGVhbjogY2xlYW4KKwlybSAtZiBUQUdTIE1ha2VmaWxlIGNvbmZpZy5jYWNoZSBjb25maWcuc3RhdHVzIGNvbmZpZy5oIGRlZmluZXMuaCBzdGFtcC1oIGNvbmZpZy5sb2cKKworbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCisJcm0gLWYgKn4gKi5sb2cgcHBjLWNvbmZpZy5oIGNvcmUgKi5jb3JlCisKK01ha2VmaWxlOiBNYWtlZmlsZS5pbiBjb25maWcuc3RhdHVzCisJQ09ORklHX0ZJTEVTPU1ha2VmaWxlIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworY29uZmlnLmg6IHN0YW1wLWggOyBAdHJ1ZQorc3RhbXAtaDogY29uZmlnLmluIGNvbmZpZy5zdGF0dXMKKwlDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworY29uZmlnLnN0YXR1czogY29uZmlndXJlCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjaworCitpbnN0YWxsOiBpbnN0YWxsZGlycworCW49YGVjaG8gcnVuIHwgc2VkICckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJ2A7IFwKKwkkKElOU1RBTExfUFJPR1JBTSkgcnVuJChFWEVFWFQpICQoYmluZGlyKS8kJG4kKEVYRUVYVCkKKworaW5zdGFsbGRpcnM6CisJJChTSEVMTCkgJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMgJChiaW5kaXIpCmRpZmYgLS1naXQgYS9zaW0vcHBjL1JFQURNRSBiL3NpbS9wcGMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmM2ZiZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL1JFQURNRQpAQCAtMCwwICsxLDM1MyBAQAorCisKKwkJUFNJTSAxLjAuMSAtIE1vZGVsIG9mIHRoZSBQb3dlclBDIEVudmlyb25tZW50cworCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitQU0lNIGlzIGEgcHJvZ3JhbSB3cml0dGVuIGluIGV4dGVuZGVkIEFOU0ktQyB0aGF0IGltcGxlbWVudHMgYW4KK2luc3RydWN0aW9uIGxldmVsIHNpbXVsYXRpb24gb2YgdGhlIFBvd2VyUEMgZW52aXJvbm1lbnQuICBJdCBpcyBmcmVlbHkKK2F2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlICh2ZXJzaW9uIDIgb3IgbGF0ZXIpLgorCitUaGUgUG93ZXJQQyBBcmNoaXRlY3R1cmUgaXMgZGVzY3JpYmVkIGFzIGhhdmluZyB0aHJlZSBsZXZlbHMgb2YKK2NvbXBsaWFuY2U6CisKKwlVRUEgLSBVc2VyIEVudmlyb25tZW50IEFyY2hpdGVjdHVyZQorCVZFQSAtIFZpcnR1YWwgRW52aXJvbm1lbnQgQXJjaGl0ZWN0dXJlCisJT0VBIC0gT3BlcmF0aW5nIEVudmlyb25tZW50IEFyY2hpdGVjdHVyZQorCitQU0lNIGJvdGggaW1wbGVtZW50cyBhbGwgdGhyZWUgbGV2ZWxzIG9mIHRoZSBQb3dlclBDIGFuZCBpbmNsdWRlcyAoZm9yCitlYWNoIGxldmVsKSBhIGNvcnJlc3BvbmRpbmcgc2ltdWxhdGVkIHJ1bi10aW1lIGVudmlyb25tZW50LgorCitJbiBhZGRpdGlvbiwgUFNJTSwgdG8gdGhlIGV4ZWN1dGlvbiB1bml0IGxldmVsLCBtb2RlbHMgdGhlIHBlcmZvcm1hbmNlCitvZiBtb3N0IG9mIHRoZSBjdXJyZW50IFBvd2VyUEMgaW1wbGVtZW50YXRpb25zIChjb250cmlidXRlZCBieSBNaWNoYWVsCitNZWlzc25lcikuICBUaGlzIGRldGFpbGVkIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgKHVubGlrZSBtYW55IG90aGVyCitzaW11bGF0b3JzKSByZXN1bHRpbmcgaW4gb25seSBhIHJlbGF0aXZlbHkgbWFyZ2luYWwgcmVkdWN0aW9uIGluIHRoZQorc2ltdWxhdG9ycyBwZXJmb3JtYW5jZS4KKworCitBIGRlc2NyaXB0aW9uIG9mIGhvdyB0byBidWlsZCBQU0lNIGlzIGNvbnRhaW5lZCBpbiB0aGUgZmlsZToKKworCQlmdHA6Ly9mdHAuY2kuY29tLmF1L3B1Yi9wc2ltL0lOU1RBTEwKKwlvcglmdHA6Ly9jYW1icmlkZ2UuY3lnbnVzLmNvbS9wdWIvcHNpbS9JTlNUQUxMCisKK3doaWxlIGFuIG92ZXJ2aWV3IG9mIGhvdyB0byB1c2UgUFNJTSBpcyBpbjoKKworCWZ0cDovL2Z0cC5jaS5jb20uYXUvcHViL3BzaW0vUlVOCitvcglmdHA6Ly9jYW1icmlkZ2UuY3lnbnVzLmNvbS9wdWIvcHNpbS9SVU4KKworVGhpcyBmaWxlIGlzIGZvdW5kIGluOgorCisJZnRwOi8vZnRwLmNpLmNvbS5hdS9wdWIvcHNpbS9SRUFETUUKK29yCWZ0cDovL2NhbWJyaWRnZS5jeWdudXMuY29tL3B1Yi9wc2ltL1JFQURNRQorCisKK1RoYW5rcyBnb2VzIGZpcnN0bHkgdG86CisKKwlDb3JpbnRoaWFuIEVuZ2luZWVyaW5nIFB0eSBMdGQKKwlDeWdudXMgU3VwcG9ydAorCUhpZ2hsYW5kIExvZ2ljIFB0eSBMdGQKKword2hvIHByb3ZpZGVkIHRoZSByZXNvdXJjZXMgbmVlZGVkIGZvciBtYWtpbmcgdGhpcyBzb2Z0d2FyZSBhdmFpbGFibGUKK29uIHRoZSBJbnRlcm5ldC4KKworTW9yZSBpbXBvcnRhbnRseSBJJ2QgbGlrZSB0byB0aGFuayB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIHdobyBlYWNoCitjb250cmlidXRlZCBpbiB0aGVpciBvd24gdW5pcXVlIHdheToKKworCUFsbGVuIEJyaWdncywgQmV0dCBLb2NoLCBEYXZpZCBFZGVsc29obiwgR29yZG9uIElybGFtLAorCU1pY2hhZWwgTWVpc3NuZXIsIEJvYiBNZXJjaWVyLCBSaWNoYXJkIFBlcmluaSwgRGFsZSBSYWhuLAorCVJpY2hhcmQgU3RhbGxtYW4sIE1pdGNoZWxlIFdhbGtlcgorCisKKwkJCQlBbmRyZXcgQ2FnbmV5CisJCQkJRmViLCAxOTk1CisKKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgICAgV2hhdCBmZWF0dXJlcyBkb2VzIFBTSU0gaW5jbHVkZT8KKworCU1vbml0b3JpbmcgYW5kIG1vZGVsaW5nCisKKwkJUFNJTSBpbmNsdWRlcyAodGhhbmtzIHRvIE1pY2hhZWwgTWVpc3NuZXIpCisJCWEgZGV0YWlsZWQgbW9kZWwgb2YgbW9zdCBvZiB0aGUgUG93ZXJQQworCQlpbXBsZW1lbnRhdGlvbnMgdG8gdGhlIGZ1bmN0aW9uYWwgdW5pdCBsZXZlbC4KKworCisJU01QCisJCQorCQlUaGUgUG93ZXJQQyBJU0EgZGVmaW5lcyBTTVAgc3luY2hyb25pemluZyBpbnN0cnVjdGlvbnMuCisJCVRoaXMgc2ltdWxhdG9yIGltcGxlbWVudHMgYSBsaW1pdGVkLCBidXQgZnVuY3Rpb25hbCwKKwkJc3Vic2V0IG9mIHRoZSBQb3dlclBDIHN5bmNocm9uaXphdGlvbiBpbnN0cnVjdGlvbnMKKwkJYmVoYXZpb3VyLiAgUHJvZ3JhbXMgdGhhdCByZXN0cmljdCB0aGVpciBzeW5jaHJvbml6YXRpb24KKwkJcHJpbWl0aXZlcyB0byB0aG9zZSB0aGF0IHdvcmsgd2l0aCB0aGlzIGZ1bmN0aW9uYWwKKwkJc3ViLXNldCAoZWcgUCgpIGFuZCBWKCkpIGFyZSBhYmxlIHRvIHJ1biBvbiB0aGUgU01QCisJCXZlcnNpb24gb2YgUFNJTS4KKworCQlQZW9wbGUgaW50ZW5kaW5nIHRvIHVzZSB0aGlzIHN5c3RlbSBzaG91bGQgc3R1ZHkKKwkJdGhlIGNvZGUgaW1wbGVtZW50aW5nIHRoZSBsd2FyeCBpbnN0cnVjdGlvbi4KKwkJCisJRU5ESUFOIFNVUFBPUlQKKworCQlQU0lNIGltcGxlbWVudHMgdGhlIFBvd2VyUEMncyBiaWcgYW5kIGxpdHRsZSAoeG9yCisJCWVuZGlhbikgbW9kZXMgYW5kIGNvcnJlY3RseSBzaW11bGF0ZXMgY29kZSB0aGF0CisJCXN3aXRjaGVzIGJldHdlZW4gdGhlc2UgdHdvIG1vZGVzLgorCisJCUluIGFkZGl0aW9uLCBwc2ltIGNhbiBtb2RlbCBhIHRydWUgbGl0dGxlLWVuZGlhbgorCQltYWNoaW5lLgorCisJSVNBIChJbnN0cnVjdGlvbiBTZXQgQXJjaGl0ZWN0dXJlKSBtb2RlbHMKKworCQlQU0lNIGluY2x1ZGVzIGEgbW9kZWwgb2YgdGhlIFVFQSwgVkVBIGFuZCBPRUEuICBUaGlzCisJCWluY2x1ZGVzIHRoZSB0aW1lIGJhc2UgcmVnaXN0ZXJzIChWRUEpIGFuZCBIVEFCCisJCWFuZCBCQVRTIChPRUEpLgorCisJCUluIGFkZGl0aW9uLCBhIHByZWxpbWluYXJ5IG1vZGVsIG9mIHRoZSA2NCBiaXQKKwkJUG93ZXJQQyBhcmNoaXRlY3R1cmUgaXMgaW1wbGVtZW50ZWQuCisKKwlJTyBIYXJkd2FyZQorCisJCVBTSU0ncyBpbnRlcm5hbHMgYXJlIGJhc2VkIGFyb3VuZCB0aGUgY29uY2VwdAorCQlvZiBhIERldmljZSBUcmVlLiAgVGhpcyB0cmVlIGludGVudGlvbmFsbHkKKwkJcmVzZW1ibGVzIHRoYXQgb2YgdGhlIERldmljZSBUcmVlIGZvdW5kIGluCisJCU9wZW5Cb290IGZpcm13YXJlLiAgUFNJTSBpcyBmbGV4aWJsZSBlbm91Z2gKKwkJdG8gYWxsb3cgdGhlIHVzZXIgdG8gZnVsbHkgY29uZmlndXJlIHRoaXMgZGV2aWNlCisJCXRyZWUgKGFuZCBjb25zZXF1ZW50bHkgdGhlIGhhcmR3YXJlIG1vZGVsKSBhdAorCQlydW4gdGltZS4KKworCVJ1bi10aW1lIGVudmlyb25tZW50czoKKworCQlQU0lNJ3MgVUVBIG1vZGVsIGluY2x1ZGVzIGVtdWxhdGlvbiBmb3IgQlNECisJCWJhc2VkIFVOSVggc3lzdGVtIGNhbGxzLgorCisJCVBTSU0ncyBPRUEgbW9kZWwgaW5jbHVkZXMgZW11bGF0aW9uIG9mIGVpdGhlcjoKKworCQkJbwlPcGVuQm9vdCBjbGllbnQgaW50ZXJmYWNlCisKKwkJCW8JTU9UTydzIEJVRyBpbnRlcmZhY2UuCisKKworCUZsb2F0aW5nIHBvaW50CisKKwkJUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgZmxvYXRpbmcgcG9pbnQgaXMgaW5jbHVkZWQuCisKKworICAgIFdobyB3b3VsZCBiZSBpbnRlcmVzdGVkIGluIFBTSU0/CisKKwlvCXRoZSBjdXJpb3VzCisKKwkJVXNpbmcgcHNpbSwgZ2RiLCBnY2MgYW5kIGJpbnV0aWxzIHRoZSBjdXJpb3VzCisJCXVzZXIgY2FuIGNvbnN0cnVjdCBhbiBlbnZpcm9ubWVudCB0aGF0IGFsbG93cworCQl0aGVtIHRvIHBsYXkgd2l0aCBQb3dlclBDIEVudmlyb25tZW50IHdpdGhvdXQKKwkJdGhlIG5lZWQgZm9yIHJlYWwgaGFyZHdhcmUuCisKKworCW8JdGhlIGFuYWx5c3QKKworCQlQU0lNIGluY2x1ZGVzIG1hbnkgKGNvbnRyaWJ1dGVkKSBtb25pdG9yaW5nCisJCWZlYXR1cmVzIHdoaWNoICh1bmxpa2UgbWFueSBvdGhlciBzaW11bGF0b3JzKQorCQlkbyBub3QgY29tZSB3aXRoIGEgZ3JlYXQgcGVuYWx0eSBpbiBwZXJmb3JtYW5jZS4KKworCQlUaHVzIHRoZSBwZXJmb3JtYW5jZSBhbmFseXN0IGlzIGFibGUgdG8gdXNlCisJCXRoaXMgc2ltdWxhdG9yIHRvIGFuYWx5c2UgdGhlIHBlcmZvcm1hbmNlIG9mCisJCXRoZSBzeXN0ZW0gdW5kZXIgdGVzdC4KKworCQlJZiBQU0lNIGRvZXNuJ3QgbW9uaXRvciBhIGNvbXBvbmVudHMgb2YgaW50ZXJlc3QsCisJCXRoZSBzb3VyY2UgY29kZSBpcyBmcmVlbHkgYXZhaWxhYmxlLCBhbmQgaGVuY2UKKwkJdGhlcmUgaXMgbm8gaGluZGVyYW5jZSB0byBjaGFuZ2luZyB0aGluZ3MKKwkJdG8gbWVldCBhIHNwZWNpZmljIGFuYWx5c3RzIG5lZWRzLgorCisKKwlvCXRoZSBzZXJpb3VzIFNXIGRldmVsb3BlcgorCisJCVBTSU0gbW9kZWxzIGFsbCB0aHJlZSBsZXZlbHMgb2YgdGhlIFBvd2VyUEMKKwkJQXJjaGl0ZWN0dXJlOiBVRUEsIFZFQSBhbmQgT0VBLiAgRnVydGhlciwKKwkJdGhlIGludGVybmFsIGRlc2lnbiBpcyBzdWNoIHRoYXQgUFNJTSBjYW4KKwkJYmUgZXh0ZW5kZWQgdG8gc3VwcG9ydCBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cy4KKworCisgICAgV2hhdCBwZXJmb3JtYW5jZSBhbmFseXNpcyBtZWFzdXJlbWVudHMgY2FuIFBTSU0gcGVyZm9ybT8KKworCUJlbG93IGlzIHRoZSBvdXRwdXQgZnJvbSBhIHJlY2VudCBhbmFseXNpcyBydW4KKwkoY29udHJpYnV0ZWQgYnkgTWljaGFlbCBNZWlzc25lcik6CisKKwlGb3IgdGhlIGZvbGxvd2luZyBwcm9ncmFtOgorCisJbG9uZworCXNpbXBsZV9yYW5kICgpCisJeworCSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgc2VlZCA9IDQ3MTE0NzExOworCSAgdW5zaWduZWQgbG9uZyB0aGlzID0gc2VlZCAqIDExMDM1MTUyNDUgKyAxMjM0NTsKKwkgIHNlZWQgPSB0aGlzOworCS8qIGN1dC1jdXQtY3V0IC0gc2VlIHRoZSBmaWxlIFJVTi5wc2ltICovCisJfQorCisJSGVyZSBpcyB0aGUgY3VycmVudCBvdXRwdXQgZ2VuZXJhdGVkIHdpdGggdGhlIC1JIHN3aXRjaCBvbiBhIFA5MAorCSh0aGUgY29tcGlsZXIgdXNlZCBpcyB0aGUgZGV2ZWxvcG1lbnQgdmVyc2lvbiBvZiBHQ0Mgd2l0aCBhIG5ldworCXNjaGVkdWxlciByZXBsYWNpbmcgdGhlIG9sZCBvbmUpOgorCQorCUNQVSAjMSBleGVjdXRlZCAgICAgNDEsOTk0IEFORCBpbnN0cnVjdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkICAgIDUxOSw3ODUgQU5EIEltbWVkaWF0ZSBpbnN0cnVjdGlvbnMuCisJLgorCS4KKwkuCisJQ1BVICMxIGV4ZWN1dGVkICAgICAgICAgIDEgU3lzdGVtIENhbGwgaW5zdHJ1Y3Rpb24uCisJQ1BVICMxIGV4ZWN1dGVkICAgIDIwNyw3NDYgWE9SIGluc3RydWN0aW9ucy4KKwkKKwlDUFUgIzEgZXhlY3V0ZWQgMjMsNzQwLDg1NiBjeWNsZXMuCisJQ1BVICMxIGV4ZWN1dGVkIDEwLDI0Miw3ODAgc3RhbGxzIHdhaXRpbmcgZm9yIGRhdGEuCisJQ1BVICMxIGV4ZWN1dGVkICAgICAgICAgIDEgc3RhbGwgd2FpdGluZyBmb3IgYSBmdW5jdGlvbiB1bml0LgorCS4KKwkuCisJLgorCUNQVSAjMSBleGVjdXRlZCAgMywxMzYsMjI5IGJyYW5jaCBmdW5jdGlvbmFsIHVuaXQgaW5zdHJ1Y3Rpb25zLgorCUNQVSAjMSBleGVjdXRlZCAxNiw5NDksMzk2IGluc3RydWN0aW9ucyB0aGF0IHdlcmUgYWNjb3VudGVkIGZvciBpbiB0aW1pbmcgaW5mby4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgODcxLDkyMCBkYXRhIHJlYWRzLgorCUNQVSAjMSBleGVjdXRlZCAgICA5NzEsOTI2IGRhdGEgd3JpdGVzLgorCUNQVSAjMSBleGVjdXRlZCAgICAgICAgMjIxIGljYWNoZSBtaXNzZXMuCisJQ1BVICMxIGV4ZWN1dGVkIDE2LDk0OSwzOTYgaW5zdHJ1Y3Rpb25zIGluIHRvdGFsLgorCQorCVNpbXVsYXRvciBzcGVlZCB3YXMgMjUwLDczMSBpbnN0cnVjdGlvbnMvc2Vjb25kCisKKworICAgIFdoYXQgbW90aXZhdGVkIFBTSU0/CisKKwlBcyBhbiBpZGVhLCBwc2ltIHdhcyBmaXJzdCBkaXNjdXNzZWQgc2VyaW91c2x5IGR1cmluZyBtaWQKKwkxOTk0LiAgQXQgdGhhdCB0aW1lIGl0cyBtYWluIG9iamVjdGl2ZXMgd2VyZToKKworCisJCW8JZ29vZCBwZXJmb3JtYW5jZQorCisJCQlNYW55IHNpbXVsYXRvcnMgbG9vc2Ugb3V0IGJ5IG9ubHkgcHJvdmlkaW5nCisJCQlhIGJpbmFyeSBpbnRlcmZhY2UgdG8gdGhlIGludGVybmFscy4gIFRoaXMKKwkJCWludGVyZmFjZSBldmVudHVhbGx5IGJlY29tZXMgYSBib3R0bGUgbmVjaworCQkJaW4gdGhlIHNpbXVsYXRvcnMgcGVyZm9ybWFuY2UuCisKKwkJCUl0IHdhcyBpbnRlbmRlZCB0aGF0IFBTSU0gd291bGQgYXZvaWQgdGhpcworCQkJcHJvYmxlbSBieSBnaXZpbmcgdGhlIHVzZXIgYWNjZXNzIHRvIHRoZQorCQkJZnVsbCBzb3VyY2UgY29kZS4KKworCQkJRnVydGhlciwgYnkgZXhwbG9pdGluZyB0aGUgcG93ZXIgb2YgbW9kZXJuCisJCQljb21waWxlcnMgaXQgd2FzIGhvcGVkIHRoYXQgUFNJTSB3b3VsZCBhY2hpZXZlCisJCQlnb29kIHBlcmZvcm1hbmNlIHdpdGggb3V0IGhhdmluZyB0byBjb21wcm9taXNlCisJCQlpdHMgaW50ZXJuYWwgZGVzaWduLgorCisKKwkJbwlwcmFjdGljYWwgcG9ydGFiaWxpdHkKKworCQkJUmF0aGVyIHRoYW4gdHJ5IHRvIGJlIHBvcnRhYmxlIHRvIGV2ZXJ5CisJCQlDIGNvbXBpbGVyIG9uIGV2ZXJ5IHBsYXRmb3JtLCBpdCB3YXMgZGVjaWRlZAorCQkJdGhhdCBQU0lNIHdvdWxkIHJlc3RyaWN0IGl0cyBzZWxmIHRvIHN1cHBvcnRpbmcKKwkJCUFOU0kgY29tcGlsZXJzIHRoYXQgaW5jbHVkZWQgdGhlIGV4dGVuc2lvbgorCQkJb2YgYSBsb25nIGxvbmcgdHlwZS4KKworCQkJR0NDIGlzIG9uZSBzdWNoIGNvbXBpbGVyLCBjb25zZXF1ZW50bHkgUFNJTQorCQkJc2hvdWxkIGJlIHBvcnRhYmxlIHRvIGFueSBtYWNoaW5lIHJ1bm5pbmcgR0NDLgorCisKKwkJbwlmbGV4aWJpbGl0eSBpbiBpdHMgZGVzaWduCisKKwkJCVBTSU0gc2hvdWxkIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCB0aGUKKwkJCWZlYXR1cmVzIHJlcXVpcmVkIGFuZCBjdXN0b21pc2UgdGhlIGJ1aWxkCisJCQlhY2NvcmRpbmdseS4gIEJ5IGhhdmluZyB0aGUgc291cmNlIGNvZGUsCisJCQl0aGUgY29tcGlsZXIgaXMgYWJsZSB0byBlbGltaW5hdGUgYW55IHVuCisJCQl1c2VkIGZlYXR1cmVzIG9mIHRoZSBzaW11bGF0b3IuCisKKwkJCUFmdGVyIGFsbCwgbGV0IHRoZSBjb21waWxlciBkbyB0aGUgd29yay4KKworCisJCW8JU01QCisKKwkJCUEgbW9kZWwgdGhhdCBhbGxvd2VkIHRoZSBzaW11bGF0aW9uIG9mCisJCQlTTVAgcGxhdGZvcm1zIHdpdGggb3V0IHRoZSBsYXJnZSBvdmVyaGVhZAorCQkJb2Z0ZW4gZW5jb3VudGVyZWQgd2l0aCBzdWNoIG1vZGVscy4KKworCisJUFNJTSBhY2hpZXZlcyBlYWNoIG9mIHRoZXNlIG9iamVjdGl2ZXMuCisKKworICAgIElzIFBTSU0gUG93ZXJQQyBQbGF0Zm9ybSAoUFBDUCkgKG5lZSBDSFJQKSBDb21wbGlhbnQ/CisKKwlOby4KKworCUFtb25nIG90aGVyIHRoaW5ncyBpdCBkb2VzIG5vdCBoYXZlIGFuIEFwcGxlIFJPTSBzb2NrZXQuCisKKworICAgIENvdWxkIFBTSU0gYmUgZXh0ZW5kZWQgc28gdGhhdCBpdCBtb2RlbHMgYSBDSFJQIG1hY2hpbmU/CisKKwlZZXMuCisKKwlQU0lNIGhhcyBiZWVuIGRlc2lnbmVkIHdpdGggdGhlIENIUlAgc3BlYyBpbiBtaW5kLiBUbyBtb2RlbAorCWEgQ0hSUCBkZXNrdG9wIHRoZSBmb2xsb3dpbmcgd291bGQgbmVlZCB0byBiZSBhZGRlZDoKKworCQlvCUFuIGFwcGxlIFJPTSBzb2NrZXQgOi0pCisKKwkJbwlNb2RlbCBvZiBlYWNoIG9mIHRoZSBkZXNrdG9wIElPIGRldmljZXMKKworCQlvCUFuIE9wZW5QSUMgZGV2aWNlLgorCisJCW8JUlRBUyAoUnVuIFRpbWUgQWJzdHJhY3Rpb24gU2VydmljZXMpLgorCisJCW8JQSBmdWxseSBwb3B1bGF0ZWQgZGV2aWNlIHRyZWUuCisKKworICAgIElzIHRoZSBzb3VyY2UgY29kZSBhdmFpbGFibGU/CisKKwlZZXMuCisKKwlUaGUgc291cmNlIGNvZGUgdG8gUFNJTSBpcyBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisJdGhlIEdOVSBQdWJsaWMgTGljZW5jZS4gIFRoaXMgYWxsb3dzIHlvdSB0byBkaXN0cmlidXRlCisJdGhlIHNvdXJjZSBjb2RlIGZvciBmcmVlIGJ1dCB3aXRoIGNlcnRhaW4gY29uZGl0aW9ucy4KKworCVNlZSB0aGUgZmlsZToKKworCQlmdHA6Ly9hcmNoaWUuYXUvZ251L0NPUFlJTkcKKworCUZvciBkZXRhaWxzIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KKworCisgICAgV2hlcmUgZG8gSSBzZW5kIGJ1Z3Mgb3IgcmVwb3J0IHByb2JsZW1zPworCisJVGhlcmUgaXMgYSBtYWlsaW5nIGxpc3QgKHN1YnNjcmliZSB0aHJvdWdoIG1ham9yZG9tb0BjaS5jb20uYXUpIGF0OgorCisJcG93ZXJwYy1wc2ltQGNpLmNvbS5hdQorCisJSWYgSSBnZXQgdGhlIGZ0cCBhcmNoaXZlIHVwZGF0ZWQgSSBwb3N0IGEgbm90ZSB0byB0aGF0IG1haWxpbmcgbGlzdC4KKwlJbiBhZGRpdGlvbiB5b3VyIHdlbGNvbWUgdG8gc2VuZCBidWdzIG9yIHByb2JsZW1zIGVpdGhlciB0byBtZSBvciB0bworCXRoYXQgZS1tYWlsIGxpc3QuCisKKwlUaGlzIGxpc3QgY3VycmVudGx5IGF2ZXJhZ2VzIHplcm8gYXJ0aWNsZXMgYSBkYXkuCisKKworICAgICBEb2VzIFBTSU0gaGF2ZSBhbnkgbGltaXRhdGlvbnMgb3IgcHJvYmxlbXM/CisKKwlQU0lNIGNhbid0IHJ1biByczYwMDAvQUlYIGJpbmFyaWVzIC0gQXQgcHJlc2VudCBQU0lNIGNhbiBvbmx5CisJc2ltdWxhdGUgc3RhdGljIGV4ZWN1dGFibGVzLiAgU2luY2UgYW4gQUlYIGV4ZWN1dGFibGUgaXMKKwluZXZlciBzdGF0aWMsIFBTSU0gaXMgdW5hYmxlIHRvIHNpbXVsYXRlIGl0cyBleGVjdXRpb24uCisKKwlQU0lNIGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IC0gY29uc2VxdWVudGx5IHRoZXJlIGFyZSBnb2luZworCXRvIGJlIGJ1Z3MuCisKKwlTZWUgdGhlIGZpbGUgQlVHUyAoaW5jbHVkZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbikgZm9yIGFueQorCW90aGVyIG91dHN0YW5kaW5nIGlzc3Vlcy4KKwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9SVU4gYi9zaW0vcHBjL1JVTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzNjZmVmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9SVU4KQEAgLTAsMCArMSw5NDkgQEAKKworCQlQU0lNIC0gbW9kZWwgdGhlIFBvd2VyUEMgZW52aXJvbm1lbnQKKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1Pi4KKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQkJUnVubmluZyBQU0lNCisKKwlUaGlzIGZpbGUgZGVzY3JpYmVzIGhvdyB0byBydW4gdGhlIHByb2dyYW0gUFNJTS4KKworCW8JV2FsayB0aHJvdWdoIGEgbnVtYmVyIG9mIGV4YW1wbGVzIGZyb20gdGhlCisJCXByZS1idWlsdCB0YXIgYXJjaGl2ZSBwc2ltLXRlc3QuCisKKwlvCUxvb2tzIGF0IHRoZSBkZXZpY2UgdHJlZSB1c2VkIGJ5IFBTSU0uCisKKwlvCU5vdGVzIG9uIGJ1aWxkaW5nIGEgcHJvZ3JhbW1lciBlbnZpcm9ubWVudCB0bworCQl1c2Ugd2l0aCBQU0lNIChCU0QvVUVBIGFuZCBCVUcvT0VBKQorCisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworUlVOTklORyBQU0lNOgorCisKK1RoZSBjb21wcmVzc2VkIHRhciBhcmNoaXZlIHBzaW0tdGVzdCBhdmFpbGFibGUgZnJvbToKKworCWZ0cDovL2Z0cC5jaS5jb20uYXUvcHViL3BzaW0vcHNpbS10ZXN0LTEuMC4xLnRhci5negorb3IJZnRwOi8vY2FtYnJpZGdlLmN5Z251cy5jb20vcHViL3BzaW0vcHNpbS10ZXN0LTEuMC4xLnRhci5negorCitjb250YWlucyBhIG51bWJlciBvZiBwcmUtYnVpbHQgcHJvZ3JhbXMgZm9yIHJ1bm5pbmcgdW5kZXIgUFNJTS4gIEVhY2gKK3ByZS1idWlsdCBiaW5hcnkgaXMgYnVpbHQgYm90aCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4uICBUaGUgc3VmZml4ZXMKKy5iZS8ubGUgKGV4ZWN1dGFibGVzKSAuYm8vLmxvIChvYmplY3QgZmlsZXMpIGFuZCAuYmEvLmxhIChsaWJyYXJpZXMpCithcmUgdXNlZC4KKworCitUbyBydW4gb25lIG9mIHRoZXNlIHByb2dyYW1zLCB1c2U6CisKKwlwb3dlcnBjLXVua25vd24tZWFiaS1ydW4gPGltYWdlPgorCitmb3IgaW5zdGFuY2U6CisKKwlwb3dlcnBjLXVua25vd24tZWFiaS1ydW4gcHNpbS10ZXN0L3VlYS9lbnZwCisKK1RoZSBwcm9ncmFtIGVudnAgcHJpbnRzIG91dCB5b3VyIHNoZWxscyBlbnZpcm9ubWVudCAtIHZlcnkgdXNlZnVsIQorTW9yZSBnZW5lcmFsbHkgcHNpbSBpcyBydW4gYXMgKHRoaXMgaXMgcGFydCBvZiB0aGUgb3V0cHV0IGZyb20gdGhlIC1oCitvcHRpb24pOgorCisgICAgICAgIHBzaW0gWyA8cHNpbS1vcHRpb24+IC4uLiBdIDxpbWFnZT4gWyA8aW1hZ2UtYXJnPiAuLi4gXQorCitXaGVyZQorCisgICAgICAgIDxpbWFnZT4gICAgICAgTmFtZSBvZiB0aGUgUG93ZXJQQyBwcm9ncmFtIHRvIHJ1bi4KKyAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNhbiBlaXRoZXIgYmUgYSBQb3dlclBDIGJpbmFyeSBvcgorICAgICAgICAgICAgICAgICAgICAgIGEgdGV4dCBmaWxlIGNvbnRhaW5pbmcgYSBkZXZpY2UgdHJlZQorICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgUFNJTSB3aWxsIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIDxpbWFnZT4gdGhlIGludGVuZGVkIGVtdWxhdGlvbgorICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50LgorICAgICAgICAgICAgICAgICAgICAgIElmIFBTSU0gZ2V0cyBpdCB3cm9uZywgdGhlIGVtdWxhdGlvbgorICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50IGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgYC1lJyBvcHRpb24gKGRlc2NyaWJlZCBiZWxvdykuCisKKyAgICAgICAgPGltYWdlLWFyZz4gICBBcmd1bWVudCB0byBiZSBwYXNzZWQgdG8gPGltYWdlPgorICAgICAgICAgICAgICAgICAgICAgIFRoZXNlIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0bworICAgICAgICAgICAgICAgICAgICAgIDxpbWFnZT4gKGFzIHN0YW5kYXJkIEMgYXJndiwgYXJnYykKKyAgICAgICAgICAgICAgICAgICAgICB3aGVuIDxpbWFnZT4gaXMgc3RhcnRlZC4KKworICAgICAgICA8cHNpbS1vcHRpb24+IFNlZSBiZWxvdworCitUaGUgZm9sbG93aW5nIGFyZSB2YWxpZCA8cHNpbS1vcHRpb24+czoKKworICAgICAgICAtbSA8bW9kZWw+ICAgIFNwZWNpZnkgdGhlIHByb2Nlc3NvciB0byBtb2RlbCAoNjA0KQorICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdHMgdGhlIHByb2Nlc3NvciB0byB1c2Ugd2hlbgorICAgICAgICAgICAgICAgICAgICAgIG1vZGVsaW5nIGV4ZWN1dGlvbiB1bml0cy4gIEluY2x1ZGVzOgorICAgICAgICAgICAgICAgICAgICAgIDYwNCwgNjAzIGFuZCA2MDNlCisKKyAgICAgICAgLWUgPG9zLWVtdWw+ICBzcGVjaWZ5IGFuIE9TIG9yIHBsYXRmb3JtIHRvIG1vZGVsCisgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgICAgICAgICAgIGJ1ZyAtIE9FQSArIE1PVE8gQlVHIFJPTSBjYWxscworICAgICAgICAgICAgICAgICAgICAgIG5ldGJzZCAtIFVFQSArIE5ldEJTRCBzeXN0ZW0gY2FsbHMKKyAgICAgICAgICAgICAgICAgICAgICBjaGlycCAtIE9FQSArIGEgZmV3IE9wZW5Cb290IGNhbGxzCisKKyAgICAgICAgLWkgICAgICAgICAgICBQcmludCBpbnN0cnVjdGlvbiBjb3VudGluZyBzdGF0aXN0aWNzCisKKyAgICAgICAgLUkgICAgICAgICAgICBQcmludCBleGVjdXRpb24gdW5pdCBzdGF0aXN0aWNzCisKKyAgICAgICAgLXIgPHNpemU+ICAgICBTZXQgUkFNIHNpemUgaW4gYnl0ZXMgKE9FQSBlbnZpcm9ubWVudHMpCisKKyAgICAgICAgLXQgWyFdPHRyYWNlPiBFbmFibGUgKGRpc2FibGUpIDx0cmFjZT4gb3B0aW9uCisKKyAgICAgICAgLW8gPHNwZWM+ICAgICBhZGQgZGV2aWNlIDxzcGVjPiB0byB0aGUgZGV2aWNlIHRyZWUKKworICAgICAgICAtaCAtPyAtSCAgICAgIGdpdmUgbW9yZSBkZXRhaWxlZCB1c2FnZQorCisKK1RoZSBgLUgnIG9wdGlvbiBnaXZlcyBhIGxvbmcgdXNhZ2Ugb3V0cHV0LiAgVGhpcyBpbmNsdWRlcyBhIGNvbXBsZXRlCitsaXN0IG9mIGFsbCB0aGUgcHJlLWNvbmZpZ3VyZWQgZGV2aWNlcy4KKworCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1JVTk5JTkcgR0RCOgorCisKK0lmIHlvdSBidWlsdCBQU0lNIHdpdGggZ2RiIHRoZW4gdGhlIGZvbGxvd2luZyBpcyBhIHF1aWNrIHN0YXJ0Cit0dXRvcmlhbC4KKworQXQgcHJlc2VudCBHREIsIGlmIGNvbmZpZ3VyZWQgYmlnLWVuZGlhbiAoc2F5KSB1bmxpa2UgUFNJTSwgZG9lcyBub3QKK3N1cHBvcnQgdGhlIGRlYnVnZ2luZyBvZiBsaXR0bGUgZW5kaWFuIGJpbmFyaWVzLiAgSWYgeW91IGZpbmQgdGhhdAoreW91ciBwcm9ncmFtIHdvbid0IHJ1biBhdCBhbGwsIG1ha2UgY2VydGFpbiB0aGF0IEdEQiBhbmQgeW91cgorcHJvZ3JhbSdzIGVuZGlhbm5lc3MgbWF0Y2guCisKKworVGhlIG1vc3QgaW1wb3J0YW50IHRoaW5nIGlzIHRoYXQgYmVmb3JlIHlvdSBjYW4gcnVuIHRoZSBzaW11bGF0b3IgeW91CittdXN0IGVuYWJsZSBpdC4gIEZvciB0aGUgc2ltdWxhdG9yLCBnZGIgaXMgc3RhcnRlZCBsaWtlIGFueSBwcm9ncmFtOgorCisJJCBwb3dlcnBjLXVua25vd24tZWFiaS1nZGIgcHNpbS10ZXN0L3VlYS9lbnZwLmJlCisKK05leHQgdGhlIHNpbXVsYXRvciBpcyBlbmFibGVkLiAgVGhlIGNvbW1hbmQgYHRhcmdldCBzaW0nIGFjY2VwdHMgdGhlCitzYW1lIG9wdGlvbnMgYXMgY2FuIGJlIHNwZWNpZmllZCBvbiB0aGUgUFNJTSBjb21tYW5kIGxpbmUuCisKKwkoZ2RiKSB0YXJnZXQgc2ltCisKK1RvIHRyYWNlIHRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gcHNpbSBhbmQgZ2RiIHNwZWNpZnkgYHRhcmdldCBzaW0gLXQKK2dkYicuICBPbmNlIGVuYWJsZWQsIHRoZSBiaW5hcnkgbmVlZHMgdG8gYmUgbG9hZGVkLCBhbnkgYnJlYWtwb2ludHMgb2YKK2ludGVyZXN0IHNldCwgYW5kIHRoZSBwcm9ncmFtIHJ1bjoKKworCShnZGIpIGxvYWQKKwkoZ2RiKSBicmVhayBtYWluCisJKGdkYikgcnVuCisJLgorCS4KKwkuCisKK0luIGFkZGl0aW9uLCBpZiB5b3UgYXJlIHdhbnRpbmcgdG8gcnVuIGEgcHJvZ3JhbSBkZXNjcmliZWQgYnkgYSBkZXZpY2UKK3RyZWUgeW91IGNhbiBgYXR0YWNoJyB0byB0aGUgc2ltdWxhdGlvbiB1c2luZyAoSSBhc3N1bWUgdGhhdCB5b3UgaGF2ZQorYXBwbGllZCB0aGUgYXR0YWNoIHBhdGNoKToKKworCSQgY2QgcHNpbS10ZXN0L3RyZWUKKwkkIHBvd2VycGMtdW5rbm93bi1lYWJpLWdkYgorCShnZGIpIHRhcmdldCBzaW0KKwkoZ2RiKSBhdHRhY2ggZGV2aWNlLXRyZWUKKwkoZ2RiKSBydW4KKworSGVyZSBHREIgdGFrZXMgdGhlIHByb2dyYW1zIGluaXRpYWwgc3RhdGUgZnJvbSB0aGUgYXR0YWNoZWQKK2RldmljZS10cmVlIGluc3RlYWQgb2YgZm9yY2luZyBpbml0aWFsaXNhdGlvbi4KKworCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1BST0ZJTElORzoKKworCitQU0lNIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgKHByb2ZpbGluZykKK2ZhY2lsaXRpZXM6CisKKwlvCWluc3RydWN0aW9uIGZyZXF1ZW5jeSBjb3VudGluZworCisJbwlleGVjdXRpb24gdW5pdCBtb2RlbGluZyAocmVjb3JkcworCQllZmZlY3RpdmUgdXNhZ2Ugb2YgdW5pdHMpLgorCisJbwlpbnN0cnVjdGlvbiBjYWNoZSBwZXJmb3JtYW5jZQorCitBcyBkaXNjdXNzZWQgaW4gdGhlIGZpbGUgSU5TVEFMTCwgZWFjaCBjYW4gYmUgY29uZmlndXJlZCB0byBpbmRpdmlkdWFsCityZXF1aXJlbWVudHMuCisKKworCS1pCUVuYWJsZSBpbnN0cnVjdGlvbiBjb3VudGluZy4KKworCQlUaGUgZnJlcXVlbmN5IG9mIGFsbCBpbnN0cnVjdGlvbnMgaXMgdGFidWxhdGVkLiAgSW4KKwkJYWRkaXRpb24gKGYgY29uZmlndXJlZCkgdGhlIGhpdC9taXNzIHJhdGUgb2YgdGhlCisJCWluc3RydWN0aW9uIGNhY2hlIGlzIG91dHB1dC4KKworCisJLUkJRW5hYmxlIGV4ZWN1dGlvbiB1bml0IGFuYWx5c2lzLgorCisJCUluIGFkZGl0aW9uIHRvIGNvdW50aW5nIGJhc2ljIGluc3RydWN0aW9ucyBhbHNvIG1vZGVsCisJCXRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgcHJvY2Vzc29ycyBleGVjdXRpb24gdW5pdHMKKworCisJLW0gPHByb2Nlc3Nvcj4KKworCQlTZWxlY3QgdGhlIHByb2Nlc3NvciB0byBiZSBtb2RlbGxlZC4KKworCQlGb3IgZXhlY3V0aW9uIHVuaXQgYW5hbHlzaXMgc3BlY2lmeSB0aGUgcHJvY2Vzc29yIHRoYXQKKwkJaXMgdG8gYmUgYW5hbHlzZWQuICBCeSBkZWZhdWx0IHRoZSA2MDQgaXMgbW9kZWxsZWQKKwkJaG93ZXZlciwgc3VwcG9ydCBmb3Igb3RoZXIgcHJvY2Vzc29ycyBzdWNoIGFzIHRoZQorCQk2MDMgYW5kIDYwM2UgaXMgaW5jbHVkZWQuCisKK1RoZSBvdXRwdXQgZnJvbSBhIHBlcmZvcm1hbmNlIHJ1biAob24gYSBQOTApIGZvciB0aGUgcHJvZ3JhbQorcHNpbS10ZXN0L3Byb2ZpbGUvYmVuY2ggaXMgYmVsb3cuICBJbiB0aGlzIHJ1biBwc2ltIHdhcyBmYWlybHkKK2FncmVzc2l2ZWx5IGNvbmZpZ3VyZWQgKHNlZSB0aGUgZmlsZSBJTlNUQUxMIGZvciBjb21waWxlIHRpbWUKK2NvbmZpZ3VyYXRpb24pLgorCisJQ1BVICMxIGV4ZWN1dGVkICAgICA0MSw5OTQgQU5EIGluc3RydWN0aW9ucy4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgNTE5LDc4NSBBTkQgSW1tZWRpYXRlIGluc3RydWN0aW9ucy4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgNjgwLDA1OCBBZGQgaW5zdHJ1Y3Rpb25zLgorCUNQVSAjMSBleGVjdXRlZCAgICAgNDEsOTk0IEFkZCBFeHRlbmRlZCBpbnN0cnVjdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkICAgIDkyMSw5MTYgQWRkIEltbWVkaWF0ZSBpbnN0cnVjdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkICAgIDIyMSwxOTkgQWRkIEltbWVkaWF0ZSBDYXJyeWluZyBpbnN0cnVjdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkICAgIDk0Myw4MjMgQWRkIEltbWVkaWF0ZSBTaGlmdGVkIGluc3RydWN0aW9ucy4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgNDcxLDkwOSBBZGQgdG8gWmVybyBFeHRlbmRlZCBpbnN0cnVjdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkICAgIDU3MSw5MTUgQnJhbmNoIGluc3RydWN0aW9ucy4KKwlDUFUgIzEgZXhlY3V0ZWQgIDEsOTkyLDQwMyBCcmFuY2ggQ29uZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zLgorCUNQVSAjMSBleGVjdXRlZCAgICA1NzEsOTEwIEJyYW5jaCBDb25kaXRpb25hbCB0byBMaW5rIFJlZ2lzdGVyIGluc3RydWN0aW9ucy4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgMzIwLDQzMSBDb21wYXJlIGluc3RydWN0aW9ucy4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgNDcxLDkxMSBDb21wYXJlIEltbWVkaWF0ZSBpbnN0cnVjdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkICAgIDE0NSw4NjcgQ29tcGFyZSBMb2dpY2FsIGluc3RydWN0aW9ucy4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgNDQyLDQxNCBDb21wYXJlIExvZ2ljYWwgSW1tZWRpYXRlIGluc3RydWN0aW9ucy4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgICAgICAgMSBDb25kaXRpb24gUmVnaXN0ZXIgWE9SIGluc3RydWN0aW9uLgorCUNQVSAjMSBleGVjdXRlZCAgICAxMDMsODczIERpdmlkZSBXb3JkIGluc3RydWN0aW9ucy4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgMTA0LDI3NSBEaXZpZGUgV29yZCBVbnNpZ25lZCBpbnN0cnVjdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkICAgIDEzMiw1MTAgRXh0ZW5kIFNpZ24gQnl0ZSBpbnN0cnVjdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkICAgIDE3OCw4OTUgRXh0ZW5kIFNpZ24gSGFsZiBXb3JkIGluc3RydWN0aW9ucy4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgODcxLDkyMCBMb2FkIFdvcmQgYW5kIFplcm8gaW5zdHJ1Y3Rpb25zLgorCUNQVSAjMSBleGVjdXRlZCAgICAgNDEsOTk0IE1vdmUgRnJvbSBDb25kaXRpb24gUmVnaXN0ZXIgaW5zdHJ1Y3Rpb25zLgorCUNQVSAjMSBleGVjdXRlZCAgICAxMDAsMDA1IE1vdmUgZnJvbSBTcGVjaWFsIFB1cnBvc2UgUmVnaXN0ZXIgaW5zdHJ1Y3Rpb25zLgorCUNQVSAjMSBleGVjdXRlZCAgICAxMDAsMDAyIE1vdmUgdG8gU3BlY2lhbCBQdXJwb3NlIFJlZ2lzdGVyIGluc3RydWN0aW9ucy4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgODA0LDYxOSBNdWx0aXBseSBMb3cgV29yZCBpbnN0cnVjdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkICAgIDQyMSwyMDEgT1IgaW5zdHJ1Y3Rpb25zLgorCUNQVSAjMSBleGVjdXRlZCAgICA0NzEsOTEwIE9SIEltbWVkaWF0ZSBpbnN0cnVjdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkICAxLDI5MiwwMjAgUm90YXRlIExlZnQgV29yZCBJbW1lZGlhdGUgdGhlbiBBTkQgd2l0aCBNYXNrIGluc3RydWN0aW9ucy4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgNjYzLDYxMyBTaGlmdCBMZWZ0IFdvcmQgaW5zdHJ1Y3Rpb25zLgorCUNQVSAjMSBleGVjdXRlZCAgMSwxNTEsNTY0IFNoaWZ0IFJpZ2h0IEFsZ2VicmFpYyBXb3JkIEltbWVkaWF0ZSBpbnN0cnVjdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkICAgIDg3MSw5MjIgU3RvcmUgV29yZCBpbnN0cnVjdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkICAgIDEwMCwwMDQgU3RvcmUgV29yZCB3aXRoIFVwZGF0ZSBpbnN0cnVjdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkICAgIDg4Nyw4MDQgU3VidHJhY3QgRnJvbSBpbnN0cnVjdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkICAgICA4Myw5ODggU3VidHJhY3QgRnJvbSBJbW1lZGlhdGUgQ2FycnlpbmcgaW5zdHJ1Y3Rpb25zLgorCUNQVSAjMSBleGVjdXRlZCAgICAgICAgICAxIFN5c3RlbSBDYWxsIGluc3RydWN0aW9uLgorCUNQVSAjMSBleGVjdXRlZCAgICAyMDcsNzQ2IFhPUiBpbnN0cnVjdGlvbnMuCisJCisJQ1BVICMxIGV4ZWN1dGVkIDIzLDc0MCw4NTYgY3ljbGVzLgorCUNQVSAjMSBleGVjdXRlZCAxMCwyNDIsNzgwIHN0YWxscyB3YWl0aW5nIGZvciBkYXRhLgorCUNQVSAjMSBleGVjdXRlZCAgICAgICAgICAxIHN0YWxsIHdhaXRpbmcgZm9yIGEgZnVuY3Rpb24gdW5pdC4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgICAgICAgMSBzdGFsbCB3YWl0aW5nIGZvciBzZXJpYWxpemF0aW9uLgorCUNQVSAjMSBleGVjdXRlZCAgMSw3NTcsOTAwIHRpbWVzIGEgd3JpdGUtYmFjayBzbG90IHdhcyB1bmF2YWlsYWJsZS4KKwlDUFUgIzEgZXhlY3V0ZWQgIDEsMDg4LDEzNSBicmFuY2hlcy4KKwlDUFUgIzEgZXhlY3V0ZWQgIDIsMDQ4LDA5MyBjb25kaXRpb25hbCBicmFuY2hlcyBmZWxsIHRocm91Z2guCisJQ1BVICMxIGV4ZWN1dGVkICAxLDA4OCwxMzUgc3VjY2Vzc2Z1bCBicmFuY2ggcHJlZGljdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkICAgIDkwNCwyNjggdW5zdWNjZXNzZnVsIGJyYW5jaCBwcmVkaWN0aW9ucy4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgNzQyLDU1NyBicmFuY2ggaWYgdGhlIGNvbmRpdGlvbiBpcyBGQUxTRSBjb25kaXRpb25hbCBicmFuY2hlcy4KKwlDUFUgIzEgZXhlY3V0ZWQgIDEsMjQ5LDg0NiBicmFuY2ggaWYgdGhlIGNvbmRpdGlvbiBpcyBUUlVFIGNvbmRpdGlvbmFsIGJyYW5jaGVzLgorCUNQVSAjMSBleGVjdXRlZCAgICA1NzEsOTEwIGJyYW5jaCBhbHdheXMgY29uZGl0aW9uYWwgYnJhbmNoZXMuCisJQ1BVICMxIGV4ZWN1dGVkICA5LDQ5Myw2NTMgMXN0IHNpbmdsZSBjeWNsZSBpbnRlZ2VyIGZ1bmN0aW9uYWwgdW5pdCBpbnN0cnVjdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkICAxLDIyMCw5MDAgMm5kIHNpbmdsZSBjeWNsZSBpbnRlZ2VyIGZ1bmN0aW9uYWwgdW5pdCBpbnN0cnVjdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkICAxLDI1NCw3NjggbXVsdGlwbGUgY3ljbGUgaW50ZWdlciBmdW5jdGlvbmFsIHVuaXQgaW5zdHJ1Y3Rpb25zLgorCUNQVSAjMSBleGVjdXRlZCAgMSw4NDMsODQ2IGxvYWQvc3RvcmUgZnVuY3Rpb25hbCB1bml0IGluc3RydWN0aW9ucy4KKwlDUFUgIzEgZXhlY3V0ZWQgIDMsMTM2LDIyOSBicmFuY2ggZnVuY3Rpb25hbCB1bml0IGluc3RydWN0aW9ucy4KKwlDUFUgIzEgZXhlY3V0ZWQgMTYsOTQ5LDM5NiBpbnN0cnVjdGlvbnMgdGhhdCB3ZXJlIGFjY291bnRlZCBmb3IgaW4gdGltaW5nIGluZm8uCisJQ1BVICMxIGV4ZWN1dGVkICAgIDg3MSw5MjAgZGF0YSByZWFkcy4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgOTcxLDkyNiBkYXRhIHdyaXRlcy4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgICAgIDIyMSBpY2FjaGUgbWlzc2VzLgorCUNQVSAjMSBleGVjdXRlZCAxNiw5NDksMzk2IGluc3RydWN0aW9ucyBpbiB0b3RhbC4KKwkKKwlTaW11bGF0b3Igc3BlZWQgd2FzIDI1MCw3MzEgaW5zdHJ1Y3Rpb25zL3NlY29uZAorCisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworUFNJTSBDT05GSUdVUkFUSU9OIC0gVEhFIERFVklDRSBUUkVFCisKKworSW50ZXJuYWxseSBQU0lNJ3MgY29uZmlndXJhdGlvbiBpcyBjb250cm9sbGVkIGJ5IGEgdHJlZSBkYXRhCitzdHJ1Y3R1cmUuICBUaGlzIHN0cnVjdHVyZSwgY3JlYXRlZCBhdCBydW4tdGltZSwgaW50ZW50aW9uYWxseQorcmVzZW1ibGVzIHRoZSBkZXZpY2UgdHJlZSB1c2VkIGJ5IE9wZW5Cb290IGZpcm13YXJlIHRvIGRlc2NyaWJlIGEKK21hY2hpbmVzIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24uCisKK1BTSU0gY2FuIGVpdGhlciBjcmVhdGUgaXRzIGRldmljZSB0cmVlIHVzaW5nIGEgYnVpbHRpbiBlbXVsYXRpb24gb3IKK2Zyb20gb25lIHJlYWQgaW4gZnJvbSBhIGZpbGUuCisKK0R1cmluZyBzdGFydHVwLCB0aGUgZGV2aWNlIHRyZWUgaXMgY3JlYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIHN0ZXBzOgorCisJbwlJbml0aWFsIGVtcHR5IHRyZWUgaXMgY3JlYXRlZAorCisJbwlBbnkgdHJlZSBlbnRyeSBvcHRpb25zIHNwZWNpZmllZCBvbiB0aGUKKwkJY29tbWFuZCBsaW5lIGFyZSBtZXJnZWQgaW4gKHRoZSAtbyA8ZW50cnk+CisJCW9wdGlvbiBpcyB1c2VkKS4KKworCQlJdCBzaG91bGQgYmUgcG9pbnRlZCBvdXQgdGhhdCBtb3N0IG9mIHRoZQorCQljb21tYW5kIGxpbmUgb3B0aW9ucyAoZWcgLXIsIC1lLCAtbSwgLXQKKwkJYXJlIGFsbCBqdXN0IHNob3J0IGhhbmQgZm9yIGNvcnJlc3BvbmRpbmcKKwkJLW8gb3B0aW9ucykuCisKKwlvCUlmIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSBpcyBhIGRldmljZSB0cmVlIHNwZWMsIHRoYXQKKwkJaXMgbG9hZGVkLgorCisJCUlmIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSBpcyBhIHRleHQgZmlsZSBpdCBpcyBhc3N1bWVkCisJCXRoYXQgdGhhdCBmaWxlIGNvbnRhaW5zIGEgZnVydGhlciBzcGVjaWZpY2F0aW9uIG9mIHRoZQorCQlzaW11bGF0b3JzIGRldmljZSB0cmVlLiAgVGhhdCB0cmVlIGlzIGxvYWRlZCBhbmQKKwkJbWVyZ2VkIHdpdGggdGhlIGN1cnJlbnQgdHJlZSBvcHRpb25zLgorCisJbwlUaGUgc2VsZWN0ZWQgZW11bGF0aW9uIGZpbGxzIG91dCBhbnkgcmVtYWluaW5nIGRldGFpbHMuCisKKwkJQnkgdGhpcyBzdGFnZSB0aGUgZW11bGF0aW9uIGVudmlyb25tZW50IHRoYXQgdGhlIHByb2dyYW0KKwkJbmVlZHMgd2lsbCBlaXRoZXIgYmUgc3BlY2lmaWVkIGluIHRoZSBkZXZpY2UgdHJlZQorCQkodGhyb3VnaCB0aGUgLWUgb3B0aW9uKSBvciBkZXRlcm1pbmVkIGZyb20gdGhlCisJCWNoYXJhY3RlcmlzdGljcyBvZiB0aGUgYmluYXJ5LgorCisJCVRoZSBzZWxlY3RlZCBlbXVsYXRpb24gd2lsbCB0aGVuIGZpbGwgb3V0IGFueSBtaXNzaW5nCisJCW5vZGVzIGluIHRoZSBkZXZpY2UgdHJlZS4KKworTW9zdCBpbXBvcnRhbnRseSBlYXJsaWVyIGFkZGl0aW9ucyB0byB0aGUgdHJlZSBhcmUgbm90IG92ZXJyaWRkZW4gYnkKK2xhdGVyIGFkZGl0aW9ucy4gIFRodXMsIGNvbW1hbmQgbGluZSBvcHRpb25zIG92ZXJyaWRlIGluZm9ybWF0aW9uCitmb3VuZCBpbiB0aGUgcHJvZ3JhbSBmaWxlIGFuZCBib3RoIG92ZXJyaWRlIGFueSBidWlsdGluIGVtdWxhdGlvbgorZW50cmllcy4KKworVGhlIGZvbGxvd2luZyBpcyBhIHN1bW1hcnkgb2YgdGhlIG1vc3QgdXNlZnVsIHJ1bnRpbWUgY29uZmlndXJhdGlvbgorb3B0aW9uczoKKworCS1lIDxvcy1lbXVsPgorCS1vICcvb3BlbnByb20vb3B0aW9ucy9vcy1lbXVsIDxvcy1lbXVsPicKKworCQlSdW4gcHJvZ3JhbSB1c2luZyB0aGUgPGVtdWxhdGlvbj4gcnVuLXRpbWUKKwkJZW52aXJvbm1lbnQuCisKKwktciA8cmFtLXNpemU+CisJLW8gJy9vcGVucHJvbS9vcHRpb25zL29lYS1tZW1vcnktc2l6ZSA8cmFtLXNpemU+JworCisJCVNldCB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgYmFuayBvZiBtZW1vcnkKKwkJKFJBTSBmcm9tIGFkZHJlc3MgMCB1cCkuCisKKwktdCBwcmludC1kZXZpY2UtdHJlZQorCS1vICcvb3BlbnByb20vdHJhY2UvcHJpbnQtZGV2aWNlLXRyZWUgMScKKworCS10IGR1bXAtZGV2aWNlLXRyZWUKKwktbyAnL29wZW5wcm9tL3RyYWNlL2R1bXAtZGV2aWNlLXRyZWUgMScKKworCQlQcmludCBvdXQgdGhlIGRldmljZSB0cmVlIG9uY2UgaXQgaGFzIGJlZW4gZnVsbHkKKwkJcG9wdWxhdGVkLiBGb3IgZHVtcC1kZXZpY2UtdHJlZSwgZXhpdCBzaW11bGF0b3IgYWZ0ZXIKKwkJZHVtcGluZyB0aGUgdHJlZS4KKworCQlQU0lNIGlzIGFibGUgdG8gcmVsb2FkIHRoZSBkdW1wZWQgZGV2aWNlIHRyZWUuCisKKwkJVGhlIGZvcm1hdCBvZiB0aGUgZHVtcGVkIHRyZWUgaXMgdW5kZXIgZGV2ZWxvcG1lbnQuCisKKwktbyAnL29wZW5wcm9tL29wdGlvbnMvc21wIDxOPicKKworCQlFbmFibGUgPE4+IHByb2Nlc3NvcnMgZm9yIHRoZSBzaW11bGF0aW9uIHJ1bi4KKwkJU2VlIHRoZSBkaXJlY3RvcnkgcHNpbS10ZXN0L29lYSBmb3IgYW4gZXhhbXBsZS4KKworCS1vICcvb3BlbnByb20vb3B0aW9ucy9hbGlnbm1lbnQgPE4+JworCisJCVdoZXJlIDxOPiBpcyAxIC0gbm9uc3RyaWN0IG9yIDIgLSBzdHJpY3QuCisJCVNwZWNpZnkgaWYgdGhlIG1pc3NhbGlnbmVkIGFjY2VzcyBhcmUgYWxsb3dlZAorCQkobm9uLXN0cmljdCkgb3IgcmVzdWx0IGluIGFuIGFsaWdubWVudCBleGNlcHRpb24KKwkJKHN0cmljdCkuCisKK0RldmljZXMgKGlmIGluY2x1ZGVkIGluIHRoZSBmaWxlIGRldmljZV90YWJsZS5jKSBjYW4gYWxzbyBiZSBzcGVjaWZpZWQKK2luIGEgc2ltaWxhciB3YXkuICBGb3IgaW5zdGFuY2UsIHRvIGFkZCBhIHNlY29uZCBzZXJpYWwgcG9ydCwgYQorY29tbWFuZCBsaWtlOgorCisJLW8gJy9pb2J1c0AweDQwMDAwMC9jb25zb2xlQDB4MDAwMDEwJworCit3b3VsZCBjcmVhdGUgYSBgY29uc29sZScgZGV2aWNlIGF0IG9mZnNldCAweDEwIHdpdGhpbiB0aGUgYGlvYnVzJyBhdAorbWVtb3J5IGFkZHJlc3MgMHg0MDAwMDAuCisKK0ZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGRldmljZSBzcGVjaWZpZXJzIHNlZSB0aGUgbm90ZXMgb24KK3RoZSBmdW5jdGlvbiBkdW1wX2RldmljZV90cmVlIGluIHRoZSBmaWxlIGRldmljZS5jIChmb3VuZCBpbiB0aGUKK3NvdXJjZSBjb2RlKS4KKworCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0JVSUxESU5HIEEgQlVHL09FQSBERVZFTE9QTUVOVCBFTlZJUk9OTUVOVAorCisKK0JhY2tncm91bmQ6CisKKworSW5jbHVkZWQgaW4gbWFueSBQb3dlclBDIHN5c3RlbXMgaXMgTW90b3JvbGEncyBCVUcgbW9uaXRvci4gIFRoaXMKK21vbml0b3IgaW5jbHVkZXMsIGZvciBjbGllbnQgcHJvZ3JhbXMsIGEgc2V0IG9mIHNlcnZpY2VzIHRoYXQgYWxsb3cKK3RoYXQgcHJvZ3JhbSB0byBpbnRlcmFjdCB3aXRoIGhhcmR3YXJlIGRldmljZXMgc3VjaCBhcyB0aGUgY29uc29sZSB1c2luZworYSBzaW1wbGUgc3lzdGVtIGNhbGwgaW50ZXJmYWNlLgorCitQU0lNIGlzIGFibGUgdG8gZW11bGF0ZSBhIG51bWJlciBvZiB0aGUgc2VydmljZXMgKGluY2x1ZGluZyB0aGUKK2NvbnNvbGUgSU8gY2FsbHMpLiAgSWYgYWRkaXRpb25hbCBzZXJ2aWNlcyBhcmUgbmVlZGVkIHRoZXkgY2FuIGVhc2lseQorYmUgYWRkZWQuCisKK0N5Z251cyBzdXBwb3J0J3MgbmV3bGliIGxpYnJhcnkgaW5jbHVkZXMgaW5jbHVkZXMgYW4gaW50ZXJmYWNlIHRvIHRoZQorTU9UTyBCVUcgc2VydmljZXMuICBUaGUgbm90ZXMgYmVsb3cgZGlzY3VzcyBob3cgSSBib3RoIGJ1aWx0IGFuZCBydW4KK3Byb2dyYW1zIGNvbXBpbGVkIHVzaW5nIHRoaXMgbGlicmFyeSBvbiBQU0lNLgorCitUaGUgb25seSBjb25mdXNpbmcgcGFydCBhYm91dCBidWlsZGluZyBhIGRldmVsb3BtZW50IGVudmlyb25tZW50IGJhc2VkCithcm91bmQgbmV3bGliL2JpbnV0aWxzL2djYyBpcyBhIGNoaWNrZW4vZWdnIHByb2JsZW0gd2l0aCBpbmNsdWRlCitmaWxlczoKKwkJCisJRm9yIEdDQyB0byBidWlsZCwgYSBmYWlybHkgY29tcGxldGUgc2V0IG9mIGluY2x1ZGUKKwlmaWxlcyBtdXN0IGJlIGluc3RhbGxlZCBidXQgbmV3bGliIHdvbid0IGluc3RhbGwgaXRzCisJaW5jbHVkZSBmaWxlcyB1bnRpbCBpdCBoYXMgYmVlbiBidWlsdCB3aXRoIGdjYyAuLi4KKworSSBnZXQgYXJvdW5kIHRoaXMgYnkgaW5zdGFsbGluZyB0aGUgcHJvYmxlbWF0aWMgaW5jbHVkZSBmaWxlcyBieSBoYW5kLgorCisKK1ByZXBhcmF0aW9uOgorCisKK1RoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIG5lZWRlZDoKKworRnJvbSB5b3VyIGZhdm9yaXRlIEZUUCBzaXRlLCB0aGUgc291cmNlcyB0byBnYXMvbGQgYW5kIGdjYyAtIG1pbmUKK2hhcHBlbnMgdG8gYmUgYXJjaGllLmF1IDoKKworCWZ0cDovL2FyY2hpZS5hdS9nbnUvYmludXRpbHMtMi42LnRhci5negorCWZ0cDovL2FyY2hpZS5hdS9nbnUvZ2NjLTIuNy4yLnRhci5negorCitGcm9tIGZ0cDovL2Z0cC5jeWdudXMuY29tL3B1Yi9uZXdsaWIgdGhlIHNvdXJjZSBjb2RlIHRvIGEgbGlicmFyeToKKworCWZ0cDovL2Z0cC5jeWdudXMuY29tL3B1Yi9uZXdsaWIvbmV3bGliLTEuNy4wLnRhci5negorCitGcm9tIGZ0cDovL2Z0cC5jaS5jb20uYXUvcHViL3BzaW0gc29tZSBtaW5vciBwYXRjaGVzIGFuZCB1cGRhdGVzIHRvCit0aGUgYWJvdmUgbGlicmFyeToKKworCWZ0cDovL2Z0cC5jaS5jb20uYXUvcHViL3BzaW0vbmV3bGliLTEuNy4wK2Zsb2F0K3BwYy1hc20udGFyLmd6CisJZnRwOi8vZnRwLmNpLmNvbS5hdS9wdWIvcHNpbS9uZXdsaWItMS43LjArcHBjLWZpeC5kaWZmLmd6CisJZnRwOi8vZnRwLmNpLmNvbS5hdS9wdWIvcHNpbS9iaW51dGlscy0yLjYrbm90ZS5kaWZmLmd6CisKK0luIGFkZGl0aW9uIHlvdSdsbCBuZWVkIHRvIGRlY2lkZSB3aGVyZSB5b3Ugd2lsbCBiZSBpbnN0YWxsaW5nIHRoZQorZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuICBZb3Ugd2lsbCBub3RpY2UgdGhhdCBpbiB0aGUgYmVsb3cgSSBpbnN0YWxsCit0aGluZ3Mgd2VsbCBhd2F5IC91c3IvbG9jYWwgaW5zdGVhZCBpbnN0YWxsaW5nIGV2ZXJ5dGhpbmcgdW5kZXIgaXRzCitvd24gZGlyZWN0b3J5IGluIC9hcHBsaWNhdGlvbnMuCisKKworTWV0aG9kOgorCisKK1RoZXNlIG5vdGVzIGFyZSBiYXNlZCBvbiBhbiBpbnN0YWxsYXRpb24gcGVyZm9ybWVkIG9uIGEgU3VuLU9TLTQvU1BBUkMKK2hvc3QuICBGb3Igb3RoZXIgaG9zdHMgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb25zLCB0aGUgYmVsb3cgc2hvdWxkIGJlCitjb25zaWRlcmVkIGFzIGEgZ3VpZGVsaW5lIG9ubHkuCisKKworIAlvCVNhbml0eSBjaGVjaworCisJCSQgY2QgLi4uL3NjcmF0Y2gJIyB5b3VyIHNjcmF0Y2ggZGlyZWN0b3J5CisJCSQgbHMgLTEKKwkJYmludXRpbHMtMi42LnRhci5negorCQliaW51dGlscy0yLjYrbm90ZS5kaWZmLmd6CisJCWdjYy0yLjcuMix0YXIuZ3oKKwkJbmV3bGliLTEuNy4wK2Zsb2F0K3BwYy1hc20udGFyLmd6CisJCW5ld2xpYi0xLjcuMCtwcGMtZml4LmRpZmYuZ3oKKwkJbmV3bGliLTEuNy4wLnRhci5negorCisKKwlvCVVucGFjay9idWlsZC9pbnN0YWxsIGJpbnV0aWxzCisKKwkJVGhpcyBpcyBkb25lIGZpcnN0IHNvIHRoYXQgdGhlcmUgaXMgYSBnYXMvbGQgcmVhZHkKKwkJZm9yIHRoZSBidWlsZGluZyBvZiBHQ0MgYW5kIE5FV0xJQi4KKworCQkkIGNkIC4uLi9zY3JhdGNoCisJCSQgZ3VuemlwIDwgYmludXRpbHMtMi42LnRhci5neiB8IHRhciB4ZiAtCisJCSQgY2QgYmludXRpbHMtMi42CisKKwkJT3B0aW9uYWxseSBhcHBseSB0aGUgbm90ZSBwYXRjaAorCisJCSQgZ3VuemlwIC4uL2JpbnV0aWxzLTIuNitub3RlLmRpZmYuZ3ogfCBwYXRjaAorCisJCVRoZW4gY29udGludWUgd2l0aCB0aGUgYnVpbGQKKworCQkkIC4vY29uZmlndXJlIC0tdGFyZ2V0PXBvd2VycGMtdW5rbm93bi1lYWJpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tcHJlZml4PS9hcHBsaWNhdGlvbnMvcHNpbQorCQkkIG1ha2UKKwkJJCBtYWtlIGluc3RhbGwKKwkJJCBjZCAuLgorCQkkIHJtIC1yZiBiaW51dGlscy0yLjYKKworCQlUaGlzIGFsc28gY3JlYXRlcyBtdWNoIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5CisJCXRyZWUuCisKKworCW8JVW5wYWNrIG5ld2xpYiwgaW5zdGFsbCB0aGUgaW5jbHVkZSBmaWxlcyBzbyB0aGF0IHRoZXkKKwkJYXJlIHJlYWR5IGZvciBHQ0MncyBidWlsZC4KKworCQkkIGNkIC4uLi9zY3JhdGNoCisJCSQgZ3VuemlwIDwgbmV3bGliLTEuNy4wLnRhci5neiB8IHRhciB4ZiAtCisKKwkJTmV3IGxpYi0xLjcuMCBoYWQgYSBmZXcgbWlub3IgYnVncyAoZml4ZWQgaW4gY3VycmVudCk6CisJCXRoZSBoZWFkZXIgZmlsZXMgZmxvYXQuaCBhbmQgcHBjLWFzbS5oIHdlcmUgbWlzc2luZzsKKwkJdGhlIGNvbmZpZ3VyZSBhbmQgTWFrZWZpbGUncyBmb3IgdGhlIHJzNjAwMCAocHBjKSBkaXJlY3RvcnkKKwkJY29udGFpbmVkIHR5cG9zOgorCisJCSQgY2QgLi4uL3NjcmF0Y2gKKwkJJCBjZCBuZXdsaWItMS43LjAKKwkJJCBndW56aXAgPCAuLi9uZXdsaWItMS43LjArZmxvYXQrcHBjLWFzbS50YXIuZ3ogfCB0YXIgeHZmIC0KKwkJJCBndW56aXAgPCAuLi9uZXdsaWItMS43LjArcHBjLWZpeC5kaWZmLmd6IHwgcGF0Y2ggLXAxCisJCQorCQlGaW5hbGx5IGNvcHkgdGhlIGluY2x1ZGUgZmlsZXMgdG8gd2hlcmUgR0NDIHdpbGwgc2VlIHRoZW06CisKKwkJJCBjZCAuLi4vc2NyYXRjaAorCQkkIGNkIG5ld2xpYi0xLjcuMC9uZXdsaWIvbGliYworCQkkIHRhciBjZiAtIGluY2x1ZGUgfCBcCisgICAgICAgICAgICAgICAgICAgKCBjZCAvYXBwbGljYXRpb25zL3BzaW0vcG93ZXJwYy11bmtub3duLWVhYmkgJiYgdGFyIHhmIC0gKQorCisKKwlvCVVucGFjay9idWlsZCBnY2MKKworCQkkIGNkIC4uLi9zY3JhdGNoCisJCSQgZ3VuemlwIDwgZ2NjLTIuNy4yLHRhci5neiB8IHRhciB4ZiAtCisJCSQgY2QgZ2NjLTIuNy4yCisJCSQgLi9jb25maWd1cmUgLS10YXJnZXQ9cG93ZXJwYy11bmtub3duLWVhYmkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1wcmVmaXg9L2FwcGxpY2F0aW9ucy9wc2ltCisJCSQgbWFrZQorCQkkIG1ha2UgaW5zdGFsbAorCQkkIGNkIC4uCisJCSQgcm0gLXJmIGdjYy0yLjcuMgorCisJCUdjYyBsaWtlcyB0byBpbnN0YWxsIGl0cyBvd24gZHVtbXkgdmVyc2lvbiBvZiBmbG9hdCB0aGF0CisJCWp1c3QgcmV0dXJucyBhbiBlcnJvci4KKworCQkkIG1vcmUgL2FwcGxpY2F0aW9ucy9wc2ltL2xpYi9nY2MtbGliL3Bvd2VycGMtdW5rbm93bi1lYWJpLzIuNy4yL2luY2x1ZGUvZmxvYXQuaAorCQkkIHJtIC9hcHBsaWNhdGlvbnMvcHNpbS9saWIvZ2NjLWxpYi9wb3dlcnBjLXVua25vd24tZWFiaS8yLjcuMi9pbmNsdWRlL2Zsb2F0LmgKKworCisJbwlGaW5pc2ggYnVpbGRpbmcvaW5zdGFsbGluZyBuZXdsaWIKKworCQkkIGNkIC4uLi9zY3JhdGNoCisJCSQgY2QgbmV3bGliLTEuNy4wCisJCSQgLi9jb25maWd1cmUgLS10YXJnZXQ9cG93ZXJwYy11bmtub3duLWVhYmkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1wcmVmaXg9L2FwcGxpY2F0aW9ucy9wc2ltCisKKwkJWW91ciBwYXRoIHdpbGwgbmVlZCB0byBpbmNsdWRlIHRoZSByZWNlbnRseSBpbnN0YWxsZWQKKwkJZ2FzL2djYyB3aGVuIGJ1aWxkaW5nLiAgRWl0aGVyIGFkZCBpdCB0byB5b3VyIHBhdGggb3IKKwkJdXNlOgorCisJCSQgUEFUSD0vYXBwbGljYXRpb25zL3BzaW0vYmluOiRQQVRIIG1ha2UKKwkJJCBQQVRIPS9hcHBsaWNhdGlvbnMvcHNpbS9iaW46JFBBVEggbWFrZSBpbnN0YWxsCisKKworCW8JRmluYWxseSwgdGVzdCBvdXQgdGhlIGJ1aWxkCisKKwkJJCBjYXQgaGVsbG8uYworCQltYWluKCkKKwkJeworCQkgIHByaW50ZigiaGVsbG8gd29ybGRcbiIpOworCQl9CisKKwkJVGhlIGJpbmFyeSBpcyBsaW5rZWQgd2l0aCBhbiBlbnRyeSBwb2ludCBsZXNzIHRoYW4gMHgxMDAwMDAKKwkJKDFtYikgc28gdGhhdCBwc2ltIHdpbGwgcmVjb2duaXplIHRoZSBiaW5hcnkgYXMgbmVlZGluZworCQl0aGUgQlVHL09FQSBpbnN0ZWFkIG9mIHRoZSBCU0QvVUVBIHJ1bnRpbWUgZW52aXJvbm1lbnQuCisKKwkJJCBwb3dlcnBjLXVua25vd24tZWFiaS1nY2MgLXYgLW8gaGVsbG8gXAorICAgICAgICAgICAgICAgICAgICAtV2wsLVR0ZXh0LDB4NDAwMCwtVGRhdGEsMHgxMDAwMCBcCisgICAgICAgICAgICAgICAgICAgIC9hcHBsaWNhdGlvbnMvcHNpbS9wb3dlcnBjLXVua25vd24tZWFiaS9saWIvbXZtZS1jcnQwLm8gXAorICAgICAgICAgICAgICAgICAgICBoZWxsby5jIFwKKyAgICAgICAgICAgICAgICAgICAgLWxjIC1sbXZtZQorCQkkIHBvd2VycGMtdW5rbm93bi1lYWJpLW9iamR1bXAgLWggaGVsbG8KKwkJJCBwb3dlcnBjLXVua25vd24tZWFiaS1ydW4gaGVsbG8KKworCQlJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGZvcmNlIHBzaW0gdG8gdXNlIGEgc3BlY2lmaWMKKwkJcnVuLXRpbWUgZW52aXJvbm1lbnQgdXNpbmcgdGhlIC1lIG9wdGlvbiB2aXM6CisKKwkJJCBwb3dlcnBjLXVua25vd24tZWFiaS1ydW4gLWUgYnVnIGhlbGxvCisKKworCisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworQlVJTERJTkcgQSBCU0QvVUVBIERFVkVMT1BNRU5UIEVOVklST05NRU5UCisKKworQmFja2dyb3VuZDoKKworCitGb3IgYSBVRUEgdG8gYmUgdXNlZnVsIGl0IG5lZWRzIGEgc3VwcG9ydGluZyBydW4tdGltZSBlbnZpcm9ubWVudC4KK1BTSU0gaW1wbGVtZW50cyBhIHJ1bnRpbWUgZW52aXJvbm1lbnQgYmFzZWQgb24gdGhlIE5ldEJTRCBzeXN0ZW0gY2FsbAoraW50ZXJmYWNlLgorCitNb3JlIHRoYW4gYW55IHRoaW5nLCB0aGlzIHVzZXIgbGV2ZWwgZW11bGF0aW9uIHdhcyB0aGUgZmlyc3QKK2ltcGxlbWVudGVkIGJlY2F1c2UgSSBoYXBwZW5lZCB0byBoYXZlIHRoZSBOZXRCU0Qgc291cmNlIGNvZGUgbHlpbmcKK2Fyb3VuZC4KKworCitQcmVwYXJhdGlvbjoKKworCitUaGlzIHJlcXVpcmVzIHRoZSBOZXRCU0QtMS4xIHNvdXJjZSB0cmVlIG9ubGluZS4gIEl0IGNhbiBlaXRoZXIgYmUKK29idGFpbmVkIHZpIGZ0cDoKKworCXRyeSBodHRwOi8vd3d3Lm5ldGJzZC5vcmcgIG9yICBmdHA6Ly9mdHAubmV0YnNkLm9yZworCitBbHRlcm5hdGl2ZWx5IG9idGFpbiBvbmUgb2YgdGhlIE5ldEJTRCBjZHJvbSdzLiAgUGF0Y2hlcyB0byB0aGlzIHNvdXJjZQordHJlZSB0aGF0IGZpbGwgb3V0IG11Y2ggb2YgdGhlIFBvd2VyUEMgY29kZSBhcmUgYXZhaWxhYmxlIGluOgorCisJZnRwOi8vZnRwLmNpLmNvbS5hdS9wdWIvY2xheXRvbgorCitGZXRjaCBldmVyeXRoaW5nIGluIHRoYXQgZGlyZWN0b3J5IC0gZGlmZnMsIHRhciBhcmNoaXZlcyBhbmQgc2NyaXB0cy4KK0luIGFkZGl0aW9uIHBhdGNoZXMgdG8gdGhlIGJpbnR1aWxzIGFuZCBnY2MgYXJlIGluOgorCisJZnRwOi8vZnRwLmNpLmNvbS5hdS9wdWIvcHNpbS9iaW51dGlscy0yLjYrbm90ZS5kaWZmLmd6CisJZnRwOi8vZnRwLmNpLmNvbS5hdS9wdWIvcHNpbS9nY2MtMi43LjIrc3lzLXR5cGVzLmRpZmYuZ3oKKword2hpbGUgdGhlIGNvbXBpbGVyIChnY2MpIGFuZCBhc3NlbWJlciAoYmludXRpbHMpIGNhbiBiZSBmb3VuZCBhdCB5b3VyCitmYXZvcml0ZSBnbnUgZnRwIHNpdGUuICBJIHVzZWQgdmVyc2lvbnM6CisKKwlnY2MtMi43LjIudGFyLmd6CisJYmludXRpbHMtMi42LnRhci5negorCisKKworCitNZXRob2Q6CisKKworVGhlc2Ugbm90ZXMgYXJlIGJhc2VkIG9uIGFuIGluc3RhbGxhdGlvbiBwZXJmb3JtZWQgb24gYSBTb2xhcmlzMi94ODYKK2hvc3QuICBGb3Igb3RoZXIgaG9zdHMgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb25zLCB0aGUgYmVsb3cgc2hvdWxkIGJlCitjb25zaWRlcmVkIGFzIGEgZ3VpZGVsaW5lIG9ubHkuCisKKworCW8JU2FuaXR5IGNoZWNrCisKKwkJSSBhc3N1bWUgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IG9idGFpbmVkIHRoZSBOZXRCU0QtMS4xIHNvdXJjZQorCQljb2RlIGFuZCB1bnBhY2tlZCBpdCBpbnRvIHRoZSBkaXJlY3RvcnkgYnNkLXNyYy4gIFdoaWxlIHRoZQorCQlmdWxsIE5ldEJTRCBzb3VyY2UgdHJlZSBtYXkgbm90IGJlIG5lZWRlZCwgdGhpbmdzIGFyZSBlYXNpZXIKKwkJaWYgaXQgaXMgYWxsIG9ubGluZS4KKworCQkkIGNkIC4uLi9zY3JhdGNoCisJCSQgbHMgLTEKKwkJYmludXRpbHMtMi42LnRhci5negorCQliaW51dGlscy0yLjYrbm90ZS5kaWZmLmd6CisJCWNsYXl0b24taW5jbHVkZS05NjAyMDMuZGlmZi5negorCQljbGF5dG9uLWxpYi05NjAyMDMuZGlmZi5negorCQljbGF5dG9uLWxpYi05NjAyMDMudGFyLmd6CisJCWNsYXl0b24tc3lzLTk2MDIwMy5kaWZmLmd6CisJCWNsYXl0b24tc3lzLTk2MDIwMy50YXIuZ3oKKwkJY2xheXRvbi5jaG93bi5zaAorCQljbGF5dG9uLmluc3RhbGwuc2gKKwkJY2xheXRvbi5sb3JkZXIuc2gKKwkJY2xheXRvbi5tYWtlLnNoCisJCWdjYy0yLjcuMi50YXIuZ3oKKwkJZ2NjLTIuNy4yK3N5cy10eXBlcy5kaWZmLmd6CisJCW1ha2UudGFyLmd6CisJCW1ha2UuZGlmZi5negorCisKKwlvCVByZXBhcmUgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSByZWFkeSBmb3IgaW5zdGFsbGF0aW9uLgorCisJCUZpcnN0bHkgY3JlYXRlIG1hbnkgb2YgdGhlIG5lZWRlZCBkaXJlY3RvcmllcyAoc29tZSBhcmUKKwkJY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGxhdGVyKToKKworCQkkIGZvciBkIGluIFwKKyAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltIFwKKyAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltL2JzZC1yb290IFwKKyAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltL2JzZC1yb290L3VzciBcCisgICAgICAgICAgICAgICAgICAgIC9hcHBsaWNhdGlvbnMvcHNpbS9ic2Qtcm9vdC91c3Ivc2hhcmUgXAorICAgICAgICAgICAgICAgICAgICAvYXBwbGljYXRpb25zL3BzaW0vYnNkLXJvb3QvdXNyL3NoYXJlL2RvYyBcCisgICAgICAgICAgICAgICAgICAgIC9hcHBsaWNhdGlvbnMvcHNpbS9ic2Qtcm9vdC91c3Ivc2hhcmUvZG9jL3BzZCBcCisgICAgICAgICAgICAgICAgICAgIC9hcHBsaWNhdGlvbnMvcHNpbS9ic2Qtcm9vdC91c3Ivc2hhcmUvZG9jL3BzZC8xOS5jdXJzZXMgXAorICAgICAgICAgICAgICAgICAgICAvYXBwbGljYXRpb25zL3BzaW0vYnNkLXJvb3QvdXNyL2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICAgICAvYXBwbGljYXRpb25zL3BzaW0vYnNkLXJvb3QvdXNyL2xpYiBcCisgICAgICAgICAgICAgICAgICAgIC9hcHBsaWNhdGlvbnMvcHNpbS9wb3dlcnBjLXVua25vd24tZWFiaSBcCisgICAgICAgICAgICAgICAgICAgIC9hcHBsaWNhdGlvbnMvcHNpbS9wb3dlcnBjLXVua25vd24tZWFiaS9iaW4gXAorICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgICAgICAgICAgICAgIGRvIHRlc3QgLWQgJGQgfHwgbWtkaXIgJGQgOyBkb25lCisKKwkJTmV4dCwgbGluayB0aGUgQlNEIGFuZCBHTlUgaW5jbHVkZSBkaXJlY3RvcmllcyB0b2dldGhlci4KKwkJR0NDIGV4cGVjdHMgaW5jbHVkZSBmaWxlcyB0byBiZSBpbiBvbmUgbG9jYXRpb24gd2hpbGUgdGhlCisJCWJzZCBpbnN0YWxsIGV4cGVjdHMgdGhlbSBpbiBhIHNlY29uZC4gIFRoZSBsaW5rIGlzIGluCisJCXRoZSBkaXJlY3Rpb24gYmVsb3cgYmVjYXVzZSBic2QncyBpbnN0YWxsIGFsc28gaW5zaXN0cyBvbgorCQlhIGRpcmVjdG9yeSAobm90IGEgbGluaykgZm9yIGl0cyBpbnN0YWxsIGRlc3RpbmF0aW9uLgorCisJCSQgcm0gLXJmIC9hcHBsaWNhdGlvbnMvcHNpbS9wb3dlcnBjLXVua25vd24tZWFiaS9pbmNsdWRlCisJCSQgbG4gLXMgL2FwcGxpY2F0aW9ucy9wc2ltL2JzZC1yb290L3Vzci9pbmNsdWRlIFwKKyAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltL3Bvd2VycGMtdW5rbm93bi1lYWJpL2luY2x1ZGUKKworCQkkIGxzIC1sIC9hcHBsaWNhdGlvbnMvcHNpbS9wb3dlcnBjLXVua25vd24tZWFiaS9pbmNsdWRlCisJCWxyd3hyLXhyLXggIDEgY2FnbmV5ICB3aGVlbCAgMzkgTWFyIDIxIDE4OjA5CisJCS9hcHBsaWNhdGlvbnMvcHNpbS9wb3dlcnBjLXVua25vd24tZWFiaS9pbmNsdWRlCisJCS0+IC9hcHBsaWNhdGlvbnMvcHNpbS9ic2Qtcm9vdC91c3IvaW5jbHVkZQorCisKKwlvCUJ1aWxkL2luc3RhbGwgQmVya2VsZXkgbWFrZQorCisJCVRoZSB0YXIgYXJjaGl2ZSBtYWtlLnRhci5neiBjb250YWlucyBhIHJlY2VudCBzbmFwc2hvdAorCQlvZiBibWFrZSBmcm9tIHRoZSBOZXRCU0Qgc291cmNlIHRyZWUuICBUaGUgbm90ZXMgYmVsb3cKKwkJZGVzY3JpYmUgaG93IHRvIGJ1aWxkL2luc3RhbGwgaXQuICBJZiB5b3UgaGF2ZSBhY2Nlc3MKKwkJdG8gYW4gZXZlbiBtb3JlIHJlY2VudCB2ZXJzaW9uIG9mIGJtYWtlLCB1c2UgdGhhdC4KKworCQlVbnBhY2sgdGhlIHNvdXJjZSBjb2RlOgorCisJCSQgY2QgLi4uL3NjcmF0Y2gKKwkJJCBndW56aXAgPCBtYWtlLnRhci5neiB8IHRhciB4ZiAtCisJCSQgY2QgbWFrZQorCisJCUFwcGx5IHRoZSBwYXRjaCBpbiBtYWtlLmRpZmYuZ3ogdGhhdCBmaXhlcyBhIG1pbm9yCisJCXByb2JsZW0gd2l0aCBhIGJ1aWxkIHVuZGVyIFNvbGFyaXMgKGJ5IG5vdyBpdCBzaG91bGQKKwkJYmUgZml4ZWQgaW4gdGhlIE5ldEJTRC1jdXJyZW50IHNvdXJjZSB0cmVlKS4KKworCQkkIGd1bnppcCA8IC4uL21ha2UuZGlmZi5neiB8IG1vcmUKKwkJJCBndW56aXAgPCAuLi9tYWtlLmRpZmYuZ3ogfCBwYXRjaAorCisJCUJ1aWxkIGl0CisKKwkJJCBtYWtlIC1mIE1ha2VmaWxlLmJvb3QgJ0NDPWdjYyAtZyAtRFBPU0lYJworCisJCVdpdGggYm1ha2UgYnVpbHQsIGluc3RhbGwgaXQgaW50byB0aGUgdGFyZ2V0IHNwZWNpZmljIGJpbgorCQlkaXJlY3Rvcnk6CisKKwkJJCBjcCBibWFrZSAvYXBwbGljYXRpb25zL3BzaW0vcG93ZXJwYy11bmtub3duLWVhYmkvYmluL21ha2UKKwkJJCBjZCAuLgorCQkkIHJtIC1yZiBtYWtlCisKKworCW8JU2V0IHVwIGEgbnVtYmVyIG9mIHdyYXBwZXIgc2NyaXB0cyBmb3IgYm1ha2Ugc28gdGhhdCBpdCB3b3Jrcy4KKworCQlJbiBhZGRpdGlvbiB0byBuZWVkaW5nIEJTRCBtYWtlIHRoZSBidWlsZCBwcm9jZXNzIGFzc3VtZXMKKwkJYSBudW1iZXIgb2YgQlNEIHNwZWNpZmljIGNvbW1hbmRzLiAgVG8gZ2V0IGFyb3VuZCB0aGlzCisJCXNldmVyYWwgd3JhcHBlciBzY3JpcHRzIGFyZSBhdmFpbGFibGUuCisKKwkJcG93ZXJwYy11bmtub3duLWVhYmktbWFrZSAoY2xheXRvbi5tYWtlLnNoKQorCisJCQlGcm9udCBlbmQgdG8gQmVya2VsZXkgbWFrZSBzZXR0aW5nIGl0IHVwIGZvciBhCisJCQljcm9zcyBjb21waWxhdGlvbgorCisJCQkkIGNwIGNsYXl0b24ubWFrZS5zaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIC9hcHBsaWNhdGlvbnMvcHNpbS9iaW4vcG93ZXJwYy11bmtub3duLWVhYmktbWFrZQorCQkJJCBjaG1vZCBhK3ggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAvYXBwbGljYXRpb25zL3BzaW0vYmluL3Bvd2VycGMtdW5rbm93bi1lYWJpLW1ha2UKKworCQljaG93biAoY2xheXRvbi5jaG93bi5zaCkKKworCQkJV3JhcHBlciB0aGF0IGRvZXMgbm90IGRvIGFueSB0aGluZy4KKwkJCUF2b2lkcyB0aGUgbmVlZCB0byBiZSByb290IHdoZW4gaW5zdGFsbGluZy4KKworCQkJJCBjcCBjbGF5dG9uLmNob3duLnNoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltL3Bvd2VycGMtdW5rbm93bi1lYWJpL2Jpbi9jaG93bgorCQkJJCBjaG1vZCBhK3ggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAvYXBwbGljYXRpb25zL3BzaW0vcG93ZXJwYy11bmtub3duLWVhYmkvYmluL2Nob3duCisKKwkJaW5zdGFsbCAoY2xheXRvbi5pbnN0YWxsLnNoKQorCisJCQlXcmFwcGVyIHRvIHN0cmlwIGF3YXkgYSBudW1iZXIgb2YgYnNkIHNwZWNpZmljIGluc3RhbGwKKwkJCWFyZ3VtZW50cy4KKworCQkJJCBjcCBjbGF5dG9uLmluc3RhbGwuc2ggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAvYXBwbGljYXRpb25zL3BzaW0vcG93ZXJwYy11bmtub3duLWVhYmkvYmluL2luc3RhbGwKKwkJCSQgY2htb2QgYSt4IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltL3Bvd2VycGMtdW5rbm93bi1lYWJpL2Jpbi9pbnN0YWxsCisKKwkJbG9yZGVyIChjbGF5dG9uLmxvcmRlci5zaCkKKworCQkJVHdlYWtlZCBsb3JkZXIgc2NyaXB0IHRoYXQgd2lsbCB1c2Ugbm0gZXRjIGZyb20KKwkJCWJpbnV0aWxzLgorCisJCQkkIGNwIGNsYXl0b24ubG9yZGVyLnNoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltL3Bvd2VycGMtdW5rbm93bi1lYWJpL2Jpbi9sb3JkZXIKKwkJCSQgY2htb2QgYSt4IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltL3Bvd2VycGMtdW5rbm93bi1lYWJpL2Jpbi9sb3JkZXIKKworCisJCXByaW50ZiAoPykKKworCQkJU29tZSBvcGVyYXRpbmcgc3lzdGVtcyBkb24ndCBpbmNsdWRlIHRoZSBwcm9ncmFtCisJCQlwcmludGYuICBJZiB5b3UgaG9zdCBkb2Vzbid0IGhhdmUgb25lLCB0aGVuIGEKKwkJCWdvb2Qgc291cmNlIGlzIHRoZSBnbnUgc2gtdXRpbHMgdmVyc2lvbi4KKworCQkJQWdhaW4sIGlmIHRoYXQgcHJvZ3JhbSBpcyBtaXNzaW5nLCB0aGVuIEkgc3VnZ2VzdAorCQkJaW5zdGFsbGluZyBpdCBvbnRvIHRoZSBwb3dlcnBjIHNwZWNpZmljIHByb2dyYW0KKwkJCWRpcmVjdG9yeToKKworCQkJL2FwcGxpY2F0aW9ucy9wc2ltL3Bvd2VycGMtdW5rbm93bi1lYWJpL2JpbgorCisKKwlvCVVucGFjayB0aGUgYnNkIHNvdXJjZSBjb2RlIChpZiB5b3UgaGF2ZW4ndCBhbHJlYWR5KQorCisJCUlmIHlvdSdyZSBzaG9ydCBvbiBkaXNrIHNwYWNlIChsaWtlIG1lKSBqdXN0IHVucGFjazoKKworCQkJc3lzLCBsaWIsIHNoYXJlL21rLCBpbmNsdWRlLCB1c3Iuc2Jpbi9jb25maWcsCisJCQl1c3Iuc2Jpbi9kYnN5bSwgZ251L2xpYi9saWJnKysvZysrLWluY2x1ZGUsCisJCQl1c3IuYmluL2xleAorCisJCU90aGVyd2l6ZSwgYXNzdW1pbmcgeW91IGhhdmUgYSBDRC1EUklWRToKKworCQkkIGNkIC4uLi9zY3JhdGNoCisJCSQgbWtkaXIgYnNkLXNyYworCQkkIGNkIGJzZC1zcmMKKwkJJCBmb3IgZCBpbiAvY2Ryb20vYnNkaXNjXzEyXzk1X2Rpc2MyL05ldEJTRC0xLjEvc291cmNlLyoxMQorICAgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgZWNobyAkZAorICAgICAgICAgICAgICAgICAgICBjYXQgJGQvKi4/PyB8IGd1bnppcCB8IHRhciB4ZiAtCisgICAgICAgICAgICAgICAgICBkb25lCisKKwkJRmxhdHRlbiB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBhIGxpdHRsZS4KKworCQkkIG12IHVzci9zcmMvKiAuCisJCSQgcm1kaXIgdXNyL3NyYyB1c3IKKwkJJCBjZCAuLgorCisKKwlvCUFwcGx5IHRoZSBjbGF5dG9uIChQb3dlclBDKSBwYXRjaGVzIHRvIHlvdXIgY29uc3RydWN0ZWQKKwkJdHJlZS4KKworCQkkIGNkIC4uLi9zY3JhdGNoCisJCSQgY2QgYnNkLXNyYworCQkKKwkJRGlmZnMgYXJlIGFwcGxpZWQgdXNpbmcgc29tZXRoaW5nIGxpa2U6CisKKwkJJCBndW56aXAgPCAuLi9jbGF5dG9uLWluY2x1ZGUtOTYwMzEyLmRpZmYuZ3ogfCBwYXRjaCAtcDEKKwkJJCBndW56aXAgPCAuLi9jbGF5dG9uLWxpYi05NjAyMDMuZGlmZi5neiB8IHBhdGNoIC1wMQorCQkkIGd1bnppcCA8IC4uL2NsYXl0b24tc3lzLTk2MDIwMy5kaWZmLmd6IHwgcGF0Y2ggLXAxCisKKwkJVGhlIHBhdGNoIHRvIHN5cy9kZXYvcGNpL25jci5jLnJlaiBtaWdodCBmYWlsLgorCisJCVRoZSB0YXIgYXJjaGl2ZXMgaGF2ZSBhIGRpZmZlcmVudCBwcm9ibGVtLCB5b3UgbmVlZAorCQl0byByZW1vdmUgdGhlIGBzcmMnIHByZWZpeC4gIEkgdXNlZAorCisJCSQgbG4gLXMgLiBzcmMKKwkJJCBndW56aXAgPCAuLi9jbGF5dG9uLWxpYi05NjAyMDMudGFyLmd6IHwgdGFyIHh2ZiAtCisJCSQgZ3VuemlwIDwgLi4vY2xheXRvbi1zeXMtOTYwMjAzLnRhci5neiB8IHRhciB4dmYgLQorCisJCVNvIHRoYXQgc3JjL3h4eCB1bnBhY2tlZCBpbnRvIC4veHh4CisKKwkJJCBjZCAuLgorCisKKwlvCWluc3RhbGwgQmVya2VsZXkgbWFrZSdzIGluY2x1ZGUgKG1rKSBmaWxlcy4KKworCQkkIGNkIC4uLi9zY3JhdGgKKwkJJCBjZCBic2Qtc3JjL3NoYXJlCisJCSQgdGFyIGNmIC0gbWsgfCAoIGNkIC9hcHBsaWNhdGlvbnMvcHNpbS9ic2Qtcm9vdC91c3Ivc2hhcmUgXAorICAgICAgICAgICAgICAgICAgICAgJiYgdGFyIHh2ZiAtICkKKwkJJCBjZCAuLi8uLgorCisKKwlvCUluc3RhbGwgdGhlIGluY2x1ZGUgZmlsZXMKKworCQkkIGNkIC4uLi9zY3JhdGNoCisJCSQgY2QgYnNkLXNyYy9pbmNsdWRlCisJCSQgcG93ZXJwYy11bmtub3duLWVhYmktbWFrZSBpbnN0YWxsCisJCSQgY2QgLi4vLi4KKwkJCisKKwlvCUluc3RhbGwgYSBmZXcgb3RoZXIgaW5jbHVkZSBmaWxlcy4KKworCQlBcyBkaXNjdXNzZWQgYWJvdmUgaW4gdGhlIHNlY3Rpb24gb24gYnVpbGRpbmcgbGlibmV3LAorCQl0aGUgYnVpbGQgcHJvY2VzcyBjYW4gaGF2ZSBjaGlja2VuL2VnZyBwcm9ibGVtcy4gIEluIHRoZQorCQljYXNlIG9mIEJTRCdzIGxpYmMsIGl0IHdhbnRzIHRvIHVzZSBzZXZlcmFsIGluY2x1ZGUgZmlsZXMKKwkJKGZyb20gdGhlIGluc3RhbGxlZCBpbmNsdWRlIGRpcmVjdG9yeSkgYmVmb3JlIHRoZXkgYXJlCisJCWluc3RhbGxlZC4gIEp1c3QgY29weSB0aGVtIGluIGFzIHNlZW4gYmVsb3c6CisKKwkJJCBjZCAuLi4vc2NyYXRjaAorCQkkIGNkIGJzZC1zcmMKKwkJJCBjcCBnbnUvbGliL2xpYmcrKy9nKystaW5jbHVkZS92YWx1ZXMuaCBcCisgICAgICAgICAgICAgICAgICAgIC9hcHBsaWNhdGlvbnMvcHNpbS9wb3dlcnBjLXVua25vd24tZWFiaS9pbmNsdWRlCisJCSQgY3AgbGliL2xpYmN1cnNlcy9jdXJzZXMuaCBcCisgICAgICAgICAgICAgICAgICAgIC9hcHBsaWNhdGlvbnMvcHNpbS9wb3dlcnBjLXVua25vd24tZWFiaS9pbmNsdWRlCisJCSQgY2QgLi4KKworCisJbwlVbnBhY2svcGF0Y2gvYnVpbGQvaW5zdGFsbCBCSU5VVElMUworCisJCSQgY2QgLi4uL3NjcmF0Y2gKKwkJJCBndW56aXAgPCBiaW51dGlscy0yLjYudGFyLmd6IHwgdGFyIHhmIC0KKworCQlnYXMgKGJmZCkgMi42IGRpZG4ndCBzdXBwb3J0IHRoZSByZWFkaW5nIGFuZCB3cml0aW5nIG9mCisJCW5vdGUgc2VjdGlvbnMuICBUaGUgcGF0Y2ggYmludXRpbHMtMi42K25vdGUuZGlmZi5negorCQlhZGRzIHN1cHBvcnQgZm9yIHRoaXMuICBQb3dlclBDL0VMRiBib290IGZpbGVzIGJlaW5nIGxvYWRlZAorCQlieSBPcGVuQm9vdCBST00ncyBzaG91bGQgY29udGFpbiBhIFBvd2VyUEMgbm90ZSBzZWN0aW9uLgorCisJCSQgY2QgLi4uL3NjcmF0Y2gKKwkJJCBjZCBiaW51dGlscy0yLjYvYmZkCisJCSQgZ3VuemlwIDwgLi4vLi4vYmludXRpbHMtMi42K25vdGUuZGlmZi5neiB8IG1vcmUKKwkJJCBndW56aXAgPCAuLi8uLi9iaW51dGlscy0yLjYrbm90ZS5kaWZmLmd6IHwgcGF0Y2gKKwkJJCBjZCAuLi8uLgorCisJCVRoZW4gY29udGludWUgd2l0aCB0aGUgYnVpbGQKKworCQkkIGNkIC4uLi9zY3JhdGNoCisJCSQgY2QgYmludXRpbHMtMi42CisJCSQgLi9jb25maWd1cmUgLS10YXJnZXQ9cG93ZXJwYy11bmtub3duLWVhYmkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1wcmVmaXg9L2FwcGxpY2F0aW9ucy9wc2ltCisJCSQgbWFrZQorCQkkIG1ha2UgaW5zdGFsbAorCQkkIGNkIC4uCisJCSQgcm0gLXJmIGJpbnV0aWxzLTIuNgorCisJCVRoaXMgaGFzIHRoZSBpbnRlbmRlZCBzaWRlIGVmZmVjdCBvZiBwYXJ0aWFsbHkgcG9wdWxhdGluZworCQl0aGUgcHNpbSBkaXJlY3RvcnkgdHJlZSB3aGljaCBtYWtlcyBmb2xsb3cgb24gc3RlcHMgZWFzaWVyLgorCisKKwlvCVVucGFjay9wYXRjaC9idWlsZC9pbnN0YWxsIEdDQworCisJCSQgY2QgLi4uL3NjcmF0Y2gKKwkJJCBndW56aXAgPCBnY2MtMi43LjIudGFyLmd6IHwgdGFyIHhmIC0KKwkJJCBjZCBnY2MtMi43LjIKKworCQlHQ0MtMi43LjIgYW5kIHRoZSBCU0QgaW5jbHVkZSBmaWxlcyBoYXZlIGEgY29uZmxpY3RpbmcgdHlwZQorCQlkZWNsYXJhdGlvbi4gIFRoZSBwYXRjaCBiZWxvdyBnZXRzIGFyb3VuZCB0aGlzIHByb2JsZW0KKwkJKGl0IG1heSBzdGlsbCBiZSBhcHBsaWNhYmxlIHRvIG1vcmUgcmVjZW50IHZlcnNpb25zIG9mCisJCUdDQyk6CisKKwkJJCBndW56aXAgPCAuLi9nY2MtMi43LjIrc3lzLXR5cGVzLmRpZmYuZ3ogfCBtb3JlCisJCSQgZ3VuemlwIDwgLi4vZ2NjLTIuNy4yK3N5cy10eXBlcy5kaWZmLmd6IHwgcGF0Y2gKKworCQlJZiB5b3VyIHZlcnNpb24gb2YgR0NDIGluY2x1ZGVzIHRoZSBmaWxlIGdpbmNsdWRlL3BwYy1hc20uaAorCQl0aGVuIHlvdSBzaG91bGQgaW5zdGFsbCB0aGF0IGhlYWRlciBmaWxlIGludG8gdGhlIGRpcmVjdG9yeToKKwkJL2FwcGxpY2F0aW9ucy9wc2ltL3Bvd2VycGMtdW5rbm93bi1lYWJpL2luY2x1ZGUuICBNb3JlCisJCXJlY2VudCB2ZXJzaW9ucyBvZiBHQ0MgZXhwZWN0IHRoaXMgZmlsZSB0byBiZSBpbnN0YWxsZWQ6CisKKwkJJCB0ZXN0IC1yIGdpbmNsdWRlL3BwYy1hc20uaCBcCisgICAgICAgICAgICAgICAgICAmJiBjcCBnaW5jbHVkZS9wcGMtYXNtLmggXAorICAgICAgICAgICAgICAgICAgICAgL2FwcGxpY2F0aW9ucy9wc2ltL3Bvd2VycGMtdW5rbm93bi1lYWJpL2luY2x1ZGUKKworCQlPdGhlciB0aGFuIHRoYXQsIGFzc3VtaW5nIHRoZSBpbmNsdWRlIGZpbGVzIGluc3RhbGxlZAorCQlva2F5LCB0aGUgcmVzdCBzaG91bGQgYmUgZmluZSAuLi4uCisKKwkJJCAuL2NvbmZpZ3VyZSAtLXRhcmdldD1wb3dlcnBjLXVua25vd24tZWFiaSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXByZWZpeD0vYXBwbGljYXRpb25zL3BzaW0KKwkJJCBtYWtlIENDPWdjYworCQkkIG1ha2UgQ0M9Z2NjIGluc3RhbGwKKwkJJCBjZCAuLgorCQkkIHJtIC1yZiBnY2MtMi43LjIKKworCisJbwlCdWlsZC9pbnN0YWxsIHRoZSBCZXJrZWxleSBsaWJyYXJ5OgorCisJCSQgY2QgLi4uL3NjcmF0Y2gKKwkJJCBjZCBic2Qtc3JjL2xpYgorCQkkIHBvd2VycGMtdW5rbm93bi1lYWJpLW1ha2UKKwkJJCBwb3dlcnBjLXVua25vd24tZWFiaS1tYWtlIGluc3RhbGwKKwkJJCBjZCAuLi8uLgorCisJCUlmIHlvdSBlbmNvdW50ZXIgcHJvYmxlbXMgY2hlY2sgdGhlIGZvbGxvd2luZyAoZWFjaAorCQlkaXNjdXNzZWQgYWJvdmUpOgorCisJCQlvCUdDQyBhbmQgQlNEIGhhdmUgYSBjb21tb24gaW5jbHVkZQorCQkJCWRpcmVjdG9yeQorCisJCQlvCWFsbCB0aGUgbWlzc2luZyBpbmNsdWRlIGZpbGVzIGluc3RhbGxlZAorCisJCQlvCWFsbCB0aGUgd3JhcHBlciBwcm9ncmFtcyBpbnN0YWxsZWQKKworCisJbwlCdWlsZC9ydW4gYSBzaW1wbGUgQlNEIHByb2dyYW0KKworCQkkIGNkIC4uLi9zY3JhdGNoCisJCSQgY2QgYnNkLXNyYy91c3IuYmluL3ByaW50ZW52CisJCSQgcG93ZXJwYy11bmtub3duLWVhYmktbWFrZQorCQkkIHBvd2VycGMtdW5rbm93bi1lYWJpLXJ1biBwcmludGVudgorCQkuCisJCS4KKwkJLgorCisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zaW0vcHBjL2FjY29uZmlnLmggYi9zaW0vcHBjL2FjY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliODdhMQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvYWNjb25maWcuaApAQCAtMCwwICsxLDE1IEBACisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgY2F0Z2V0cyBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfQ0FUR0VUUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCisjdW5kZWYgSEFWRV9HRVRURVhUCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLworI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKZGlmZiAtLWdpdCBhL3NpbS9wcGMvYWNsb2NhbC5tNCBiL3NpbS9wcGMvYWNsb2NhbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9hY2xvY2FsLm00CmRpZmYgLS1naXQgYS9zaW0vcHBjL2Jhc2ljcy5oIGIvc2ltL3BwYy9iYXNpY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTIwMDIzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9iYXNpY3MuaApAQCAtMCwwICsxLDEzOSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfQkFTSUNTX0hfCisjZGVmaW5lIF9CQVNJQ1NfSF8KKworCisvKiBmcm9tIE1pY2hhZWwgTWVpc3NuZXIsIG1hY3JvJ3MgdG8gaGFuZGxlIGNvbmNhdGluZyBzeW1ib2xzIGJldHRlciAqLworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKKyNkZWZpbmUgQ09OQ0FUMihhLGIpCSBhIyNiCisjZGVmaW5lIENPTkNBVDMoYSxiLGMpCSBhIyNiIyNjCisjZGVmaW5lIENPTkNBVDQoYSxiLGMsZCkgYSMjYiMjYyMjZAorI2Vsc2UKKyNkZWZpbmUgQ09OQ0FUMihhLGIpCSBhLyoqL2IKKyNkZWZpbmUgQ09OQ0FUMyhhLGIsYykJIGEvKiovYi8qKi9jCisjZGVmaW5lIENPTkNBVDQoYSxiLGMsZCkgYS8qKi9iLyoqL2MvKiovZAorI2VuZGlmCisKKyNkZWZpbmUgWENPTkNBVDIoYSxiKSAgICAgQ09OQ0FUMihhLGIpCisjZGVmaW5lIFhDT05DQVQzKGEsYixjKSAgIENPTkNBVDMoYSxiLGMpCisjZGVmaW5lIFhDT05DQVQ0KGEsYixjLGQpIENPTkNBVDQoYSxiLGMsZCkKKworCisvKiBtYW55IHRoaW5ncyBwYXNzIGFyb3VuZCB0aGUgY3B1IGFuZCBwc2ltIG9iamVjdCB3aXRoIG91dCBrbm93aW5nCisgICB3aGF0IGl0IGlzICovCisKK3R5cGVkZWYgc3RydWN0IF9jcHUgY3B1OwordHlwZWRlZiBzdHJ1Y3QgX3BzaW0gcHNpbTsKK3R5cGVkZWYgc3RydWN0IF9kZXZpY2UgZGV2aWNlOwordHlwZWRlZiBzdHJ1Y3QgX2RldmljZV9pbnN0YW5jZSBkZXZpY2VfaW5zdGFuY2U7Cit0eXBlZGVmIHN0cnVjdCBfZXZlbnRfcXVldWUgZXZlbnRfcXVldWU7Cit0eXBlZGVmIHN0cnVjdCBfZXZlbnRfZW50cnlfdGFnICpldmVudF9lbnRyeV90YWc7CisKKworLyogbWFueSB0aGluZ3MgYXJlIG1vdmluZyBkYXRhIGJldHdlZW4gdGhlIGhvc3QgYW5kIHRhcmdldCAqLworCit0eXBlZGVmIGVudW0geworICBjb29rZWRfdHJhbnNmZXIsCisgIHJhd190cmFuc2ZlciwKK30gdHJhbnNmZXJfbW9kZTsKKworCisvKiBwb3NzaWJsZSBleGl0IHN0YXR1c2VzICovCisKK3R5cGVkZWYgZW51bSB7CisgIHdhc19jb250aW51aW5nLCB3YXNfdHJhcCwgd2FzX2V4aXRlZCwgd2FzX3NpZ25hbGxlZAorfSBzdG9wX3JlYXNvbjsKKworCisvKiBkaXNwb3NpdGlvbiBvZiBhbiBvYmplY3Qgd2hlbiB0aGluZ3MgYXJlIG5leHQgcmVzdGFydGVkICovCisKK3R5cGVkZWYgZW51bSB7CisgIHBlcm1lbmFudF9vYmplY3QsCisgIHRlbXBvYXJ5X29iamVjdCwKK30gb2JqZWN0X2Rpc3Bvc2l0aW9uOworCisKKy8qIGRpcmVjdGlvbnMgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgYmlkaXJlY3RfcG9ydCwKKyAgaW5wdXRfcG9ydCwKKyAgb3V0cHV0X3BvcnQsCit9IHBvcnRfZGlyZWN0aW9uOworCisKKworLyogQmFzaWMgY29uZmlndXJhdGlvbiAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAicHBjLWNvbmZpZy5oIgorI2luY2x1ZGUgImlubGluZS5oIgorCisKKy8qIEJhc2ljIGhvc3QgZGVwZW5kYW50IG1lc3MgLSBob3BlZnVsbHkgPHN0ZGlvLmg+ICsgPHN0ZGFyZy5oPiB3aWxsCisgICBicmluZyBwb3RlbnRpYWwgY29uZmxpY3RzIG91dCBpbiB0aGUgb3BlbiAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworCisjaWZuZGVmIE5PUkVUVVJOCisjZGVmaW5lIE5PUkVUVVJOCisjZW5kaWYKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgMAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX19hdHRyaWJ1dGVfXykKKyNpZiAoIWRlZmluZWQoX19HTlVDX18pIFwKKyAgICAgfHwgKF9fR05VQ19fIDwgMikgXAorICAgICB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDYpKQorI2RlZmluZSBfX2F0dHJpYnV0ZV9fKGFyZykKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoVU5VU0VEKQorI2lmICghZGVmaW5lZChfX0dOVUNfXykgXAorICAgICB8fCAoX19HTlVDX18gPCAyKSBcCisgICAgIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgNykpCisjZGVmaW5lIFVOVVNFRAorI2Vsc2UKKyNkZWZpbmUgVU5VU0VEIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQorI2VuZGlmCisjZW5kaWYKKworCisvKiBCYXNpYyBkZWZpbml0aW9ucyAtIG9yZGVyZWQgc28gdGhhdCBub3RoaW5nIGNhbGxzIHdoYXQgY29tZXMgYWZ0ZXIKKyAgIGl0ICovCisKKyNpbmNsdWRlICJzaW1fY2FsbGJhY2tzLmgiCisKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisjaW5jbHVkZSAid29yZHMuaCIKKyNpbmNsdWRlICJiaXRzLmgiCisjaW5jbHVkZSAic2ltLWVuZGlhbi5oIgorCisjZW5kaWYgLyogX0JBU0lDU19IXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9iaXRzLmMgYi9zaW0vcHBjL2JpdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGJiYTUxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9iaXRzLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgX0JJVFNfQ18KKyNkZWZpbmUgX0JJVFNfQ18KKworI2luY2x1ZGUgImJhc2ljcy5oIgorCisKK0lOTElORV9CSVRTXAorKHVuc2lnbmVkMzIpCitNQVNLRUQzMih1bnNpZ25lZDMyIHdvcmQsCisJIHVuc2lnbmVkIHN0YXJ0LAorCSB1bnNpZ25lZCBzdG9wKQoreworICByZXR1cm4gKHdvcmQgJiBNQVNLMzIoc3RhcnQsIHN0b3ApKTsKK30KKworSU5MSU5FX0JJVFNcCisodW5zaWduZWQ2NCkKK01BU0tFRDY0KHVuc2lnbmVkNjQgd29yZCwKKwkgdW5zaWduZWQgc3RhcnQsCisJIHVuc2lnbmVkIHN0b3ApCit7CisgIHJldHVybiAod29yZCAmIE1BU0s2NChzdGFydCwgc3RvcCkpOworfQorCitJTkxJTkVfQklUU1wKKyh1bnNpZ25lZF93b3JkKQorTUFTS0VEKHVuc2lnbmVkX3dvcmQgd29yZCwKKyAgICAgICB1bnNpZ25lZCBzdGFydCwKKyAgICAgICB1bnNpZ25lZCBzdG9wKQoreworICByZXR1cm4gKCh3b3JkKSAmIE1BU0soc3RhcnQsIHN0b3ApKTsKK30KKworCisKK0lOTElORV9CSVRTXAorKHVuc2lnbmVkX3dvcmQpCitFWFRSQUNURUQodW5zaWduZWRfd29yZCB3b3JkLAorCSAgdW5zaWduZWQgc3RhcnQsCisJICB1bnNpZ25lZCBzdG9wKQoreworICBBU1NFUlQoc3RhcnQgPD0gc3RvcCk7CisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyAgcmV0dXJuIF9FWFRSQUNURURuKDY0LCB3b3JkLCBzdGFydCwgc3RvcCk7CisjZWxzZQorICBpZiAoc3RvcCA8IDMyKQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgcmV0dXJuICgod29yZCA+PiAoNjMgLSBzdG9wKSkKKwkgICAgJiBNQVNLKHN0YXJ0Kyg2My1zdG9wKSwgNjMpKTsKKyNlbmRpZgorfQorCisKK0lOTElORV9CSVRTXAorKHVuc2lnbmVkX3dvcmQpCitJTlNFUlRFRCh1bnNpZ25lZF93b3JkIHdvcmQsCisJIHVuc2lnbmVkIHN0YXJ0LAorCSB1bnNpZ25lZCBzdG9wKQoreworICBBU1NFUlQoc3RhcnQgPD0gc3RvcCk7CisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyAgcmV0dXJuIF9JTlNFUlRFRG4oNjQsIHdvcmQsIHN0YXJ0LCBzdG9wKTsKKyNlbHNlCisgIGlmIChzdG9wIDwgMzIpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICByZXR1cm4gKCh3b3JkICYgTUFTSyhzdGFydCsoNjMtc3RvcCksIDYzKSkKKwkgICAgPDwgKDYzIC0gc3RvcCkpOworI2VuZGlmCit9CisKKworSU5MSU5FX0JJVFNcCisodW5zaWduZWQzMikKK1JPVEwzMih1bnNpZ25lZDMyIHZhbCwKKyAgICAgICBsb25nIHNoaWZ0KQoreworICBBU1NFUlQoc2hpZnQgPj0gMCAmJiBzaGlmdCA8PSAzMik7CisgIHJldHVybiBfUk9UTG4oMzIsIHZhbCwgc2hpZnQpOworfQorCisKK0lOTElORV9CSVRTXAorKHVuc2lnbmVkNjQpCitST1RMNjQodW5zaWduZWQ2NCB2YWwsCisgICAgICAgbG9uZyBzaGlmdCkKK3sKKyAgQVNTRVJUKHNoaWZ0ID49IDAgJiYgc2hpZnQgPD0gNjQpOworICByZXR1cm4gX1JPVExuKDY0LCB2YWwsIHNoaWZ0KTsKK30KKworI2VuZGlmIC8qIF9CSVRTX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2JpdHMuaCBiL3NpbS9wcGMvYml0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ODk4ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2JpdHMuaApAQCAtMCwwICsxLDI1NyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfQklUU19IXworI2RlZmluZSBfQklUU19IXworCisKKy8qIGJpdCBtYW5pcHVsYXRpb24gcm91dGluZXM6CisKKyAgIEJpdCBudW1iZXJpbmc6IFRoZSBiaXRzIGFyZSBudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlIFBvd2VyUEMKKyAgIGNvbnZlbnRpb24gLSB0aGUgbGVmdCBtb3N0IChvciBtb3N0IHNpZ25pZmljYW50KSBpcyBiaXQgMCB3aGlsZSB0aGUKKyAgIHJpZ2h0IG1vc3QgKGxlYXN0IHNpZ25pZmljYW50KSBpcyBiaXQgMS4KKworICAgU2l6ZSBjb252ZW50aW9uOiBFYWNoIG1hY3JvIGlzIGluIHRocmVlIGZvcm1zIC0gPE1BQ1JPPjMyIHdoaWNoCisgICBvcGVyYXRlcyBpbiAzMmJpdCBxdWFudGl0eSAoYml0cyBhcmUgbnVtYmVyZWQgMC4uMzEpOyA8TUFDUk8+NjQKKyAgIHdoaWNoIG9wZXJhdGVzIHVzaW5nIDY0Yml0IHF1YW50aXRlcyAoYW5kIGJpdHMgYXJlIG51bWJlcmVkIDAuLjY0KTsKKyAgIGFuZCA8TUFDUk8+IHdoaWNoIG9wZXJhdGVzIHVzaW5nIHRoZSBiaXQgc2l6ZSBvZiB0aGUgdGFyZ2V0CisgICBhcmNoaXRlY3R1cmUgKGJpdHMgYXJlIHN0aWxsIG51bWJlcmVkIDAuLjYzKSwgd2l0aCAzMmJpdAorICAgYXJjaGl0ZWN0dXJlcyBpZ25vcmluZyB0aGUgZmlyc3QgMzJiaXRzIGhhdmluZyBiaXQgMzIgYXMgdGhlIG1vc3QKKyAgIHNpZ25pZmljYW50LgorCisgICBCSVQqKFBPUyk6IFF1YW50aXR5IHdpdGgganVzdCAxIGJpdCBzZXQuCisKKyAgIE1BU0sqKEZJUlNULCBMQVNUKTogQ3JlYXRlIGEgY29uc3RhbnQgYml0IG1hc2sgb2YgdGhlIHNwZWNpZmllZAorICAgc2l6ZSB3aXRoIGJpdHMgW0ZJUlNUIC4uIExBU1RdIHNldC4KKworICAgTUFTS0VEKihWQUxVRSwgRklSU1QsIExBU1QpOiBNYXNrcyBvdXQgYWxsIGJ1dCBiaXRzIFtGSVJTVAorICAgLi4gTEFTVF0uCisKKyAgIEVYVFJBQ1RFRCooVkFMVUUsIEZJUlNULCBMQVNUKTogTWFza3Mgb3V0IGJpdHMgW0ZJUlNUIC4uIExBU1RdIGJ1dAorICAgYWxzbyByaWdodCBzaGlmdHMgdGhlIG1hc2tlZCB2YWx1ZSBzbyB0aGF0IGJpdCBMQVNUIGJlY29tZXMgdGhlCisgICBsZWFzdCBzaWduaWZpY2FudCAocmlnaHQgbW9zdCkuCisKKyAgIFNIVUZGTEVEKiooVkFMVUUsIE9MRCwgTkVXKTogTWFzayB0aGVuIG1vdmUgYSBzaW5nbGUgYml0IGZyb20gT0xECisgICBuZXcgTkVXLgorCisgICBNT1ZFRCoqKFZBTFVFLCBPTERfRklSU1QsIE9MRF9MQVNULCBORVdfRklSU1QsIE5FV19MQVNUKTogTW92ZXMKKyAgIHRoaW5ncyBhcm91bmQgc28gdGhhdCBiaXRzIE9MRF9GSVJTVC4uT0xEX0xBU1QgYXJlIG1hc2tlZCB0aGVuCisgICBtb3ZlZCB0byBORVdfRklSU1QuLk5FV19MQVNULgorCisgICBJTlNFUlRFRCooVkFMVUUsIEZJUlNULCBMQVNUKTogVGFrZXMgVkFMVUUgYW5kIGBpbnNlcnRzJyB0aGUgKExBU1QKKyAgIC0gRklSU1QgKyAxKSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGludG8gYml0IHBvc2l0aW9ucyBbIEZJUlNUCisgICAuLiBMQVNUIF0uICBUaGlzIGlzIGFsbW9zdCB0aGUgY29tcGxlbWVudCB0byBFWFRSQUNURUQuCisKKyAgIElFQV9NQVNLRUQoU0hPVUxEX01BU0ssIEFERFIpOiBDb252ZXJ0IHRoZSBhZGRyZXNzIHRvIHRoZSB0YXJnZXRzCisgICBuYXR1cmFsIHNpemUuICBJZiBpbiAzMmJpdCBtb2RlLCBkaXNjYXJkIHRoZSBoaWdoIDMyYml0cy4KKworICAgRVhURU5ERUQoVkFMVUUpOiBDb252ZXJ0IFZBTFVFICgzMmJpdHMgb2YgaXQpIHRvIHRoZSB0YXJnZXRzCisgICBuYXR1cmFsIHNpemUuICBJZiBpbiA2NGJpdCBtb2RlLCBzaWduIGV4dGVuZCB0aGUgdmFsdWUuCisKKyAgIEFMSUdOXyooVkFMVUUpOiBSb3VuZCB1cHdhcmRzIHRoZSB2YWx1ZSBzbyB0aGF0IGl0IGlzIGFsaWduZWQuCisKKyAgIEZMT09SXyooVkFMVUUpOiBUcnVuY2F0ZSB0aGUgdmFsdWUgc28gdGhhdCBpdCBpcyBhbGlnbmVkLgorCisgICBST1RMKihWQUxVRSwgTlJfQklUUyk6IFJldHVybiB0aGUgdmFsdWUgcm90YXRlZCBieSBOUl9CSVRTCisKKyAgICovCisKKyNkZWZpbmUgX01BS0VfU0hJRlQoV0lEVEgsIHBvcykgKChXSURUSCkgLSAxIC0gKHBvcykpCisKKworLyogTWFrZUJpdCAqLworI2RlZmluZSBfQklUbihXSURUSCwgcG9zKSAoKChuYXR1cmFsIyNXSURUSCkoMSkpIFwKKwkJCSAgIDw8IF9NQUtFX1NISUZUKFdJRFRILCBwb3MpKQorCisjZGVmaW5lIEJJVDQoUE9TKSAgKDEgPDwgX01BS0VfU0hJRlQoNCwgUE9TKSkKKyNkZWZpbmUgQklUNShQT1MpICAoMSA8PCBfTUFLRV9TSElGVCg1LCBQT1MpKQorI2RlZmluZSBCSVQ4KFBPUykgICgxIDw8IF9NQUtFX1NISUZUKDgsIFBPUykpCisjZGVmaW5lIEJJVDEwKFBPUykgICgxIDw8IF9NQUtFX1NISUZUKDEwLCBQT1MpKQorI2RlZmluZSBCSVQzMihQT1MpIF9CSVRuKDMyLCBQT1MpCisjZGVmaW5lIEJJVDY0KFBPUykgX0JJVG4oNjQsIFBPUykKKworI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCisjZGVmaW5lIEJJVChQT1MpICAgQklUNjQoUE9TKQorI2Vsc2UKKyNkZWZpbmUgQklUKFBPUykgICAoKChQT1MpIDwgMzIpID8gMCA6IF9CSVRuKDMyLCAoUE9TKS0zMikpCisjZW5kaWYKKworCisvKiBtdWx0aSBiaXQgbWFzayAqLworI2RlZmluZSBfTUFTS24oV0lEVEgsIFNUQVJULCBTVE9QKSBcCisoKCgoKHVuc2lnbmVkIyNXSURUSCkwKSAtIDEpIFwKKyAgPj4gKFdJRFRIIC0gKChTVE9QKSAtIChTVEFSVCkgKyAxKSkpIFwKKyA8PCAoV0lEVEggLSAxIC0gKFNUT1ApKSkKKworI2RlZmluZSBNQVNLMzIoU1RBUlQsIFNUT1ApICAgX01BU0tuKDMyLCBTVEFSVCwgU1RPUCkKKyNkZWZpbmUgTUFTSzY0KFNUQVJULCBTVE9QKSAgIF9NQVNLbig2NCwgU1RBUlQsIFNUT1ApCisKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQorI2RlZmluZSBNQVNLKFNUQVJULCBTVE9QKSBcCisoKChTVEFSVCkgPD0gKFNUT1ApKSBcCisgPyBfTUFTS24oNjQsIFNUQVJULCBTVE9QKSBcCisgOiAoX01BU0tuKDY0LCAwLCBTVE9QKSBcCisgICAgfCBfTUFTS24oNjQsIFNUQVJULCA2MykpKQorI2Vsc2UKKyNkZWZpbmUgTUFTSyhTVEFSVCwgU1RPUCkgXAorKCgoU1RBUlQpIDw9IChTVE9QKSkgXAorID8gKCgoU1RPUCkgPCAzMikgXAorICAgID8gMCBcCisgICAgOiBfTUFTS24oMzIsIFwKKwkgICAgIChTVEFSVCkgPCAzMiA/IDAgOiAoU1RBUlQpIC0gMzIsIFwKKwkgICAgIChTVE9QKS0zMikpIFwKKyA6IChfTUFTS24oMzIsIFwKKwkgICAoU1RBUlQpIDwgMzIgPyAwIDogKFNUQVJUKSAtIDMyLCBcCisJICAgMzEpIFwKKyAgICB8ICgoKFNUT1ApIDwgMzIpIFwKKyAgICAgICA/IDAgXAorICAgICAgIDogX01BU0tuKDMyLCBcCisJCTAsIFwKKwkJKFNUT1ApIC0gMzIpKSkpCisjZW5kaWYKKworCisvKiBtYXNrIHRoZSByZXF1aXJlZCBiaXRzLCBsZWF2aW5nIHRoZW0gaW4gcGxhY2UgKi8KKworSU5MSU5FX0JJVFNcCisodW5zaWduZWQzMikgTUFTS0VEMzIKKyh1bnNpZ25lZDMyIHdvcmQsCisgdW5zaWduZWQgc3RhcnQsCisgdW5zaWduZWQgc3RvcCk7CisKK0lOTElORV9CSVRTXAorKHVuc2lnbmVkNjQpIE1BU0tFRDY0CisodW5zaWduZWQ2NCB3b3JkLAorIHVuc2lnbmVkIHN0YXJ0LAorIHVuc2lnbmVkIHN0b3ApOworCitJTkxJTkVfQklUU1wKKyh1bnNpZ25lZF93b3JkKSBNQVNLRUQKKyh1bnNpZ25lZF93b3JkIHdvcmQsCisgdW5zaWduZWQgc3RhcnQsCisgdW5zaWduZWQgc3RvcCk7CisKKworLyogZXh0cmFjdCB0aGUgcmVxdWlyZWQgYml0cyBhbGlnbmluZyB0aGVtIHdpdGggdGhlIGxzYiAqLworI2RlZmluZSBfRVhUUkFDVEVEbihXSURUSCwgV09SRCwgU1RBUlQsIFNUT1ApIFwKKygoKChuYXR1cmFsIyNXSURUSCkoV09SRCkpID4+IChXSURUSCAtIChTVE9QKSAtIDEpKSBcCisgJiBfTUFTS24oV0lEVEgsIFdJRFRILTErKFNUQVJUKS0oU1RPUCksIFdJRFRILTEpKQorCisvKiAjZGVmaW5lIEVYVFJBQ1RFRDEwKFdPUkQsIFNUQVJULCBTVE9QKSBfRVhUUkFDVEVEbigxMCwgV09SRCwgU1RBUlQsIFNUT1ApICovCisjZGVmaW5lIEVYVFJBQ1RFRDMyKFdPUkQsIFNUQVJULCBTVE9QKSBfRVhUUkFDVEVEbigzMiwgV09SRCwgU1RBUlQsIFNUT1ApCisjZGVmaW5lIEVYVFJBQ1RFRDY0KFdPUkQsIFNUQVJULCBTVE9QKSBfRVhUUkFDVEVEbig2NCwgV09SRCwgU1RBUlQsIFNUT1ApCisKK0lOTElORV9CSVRTXAorKHVuc2lnbmVkX3dvcmQpIEVYVFJBQ1RFRAorKHVuc2lnbmVkX3dvcmQgdmFsLAorIHVuc2lnbmVkIHN0YXJ0LAorIHVuc2lnbmVkIHN0b3ApOworCisKKy8qIG1vdmUgYSBzaW5nbGUgYml0IGFyb3VuZCAqLworLyogTkI6IHRoZSB3aWVyZG5lc3MgKE4+Tz9OLU86MCkgaXMgdG8gc3RvcCBhIHdhcm5pbmcgZnJvbSBHQ0MgKi8KKyNkZWZpbmUgX1NIVUZGTEVEbihOLCBXT1JELCBPTEQsIE5FVykgXAorKChPTEQpIDwgKE5FVykgXAorID8gKCgodW5zaWduZWQjI04pKFdPUkQpIFwKKyAgICAgPj4gKCgoTkVXKSA+IChPTEQpKSA/ICgoTkVXKSAtIChPTEQpKSA6IDApKSBcCisgICAgJiBNQVNLMzIoKE5FVyksIChORVcpKSkgXAorIDogKCgodW5zaWduZWQjI04pKFdPUkQpIFwKKyAgICAgPDwgKCgoT0xEKSA+IChORVcpKSA/ICgoT0xEKSAtIChORVcpKSA6IDApKSBcCisgICAgJiBNQVNLMzIoKE5FVyksIChORVcpKSkpCisKKyNkZWZpbmUgU0hVRkZMRUQzMihXT1JELCBPTEQsIE5FVykgX1NIVUZGTEVEbigzMiwgV09SRCwgT0xELCBORVcpCisjZGVmaW5lIFNIVUZGTEVENjQoV09SRCwgT0xELCBORVcpIF9TSFVGRkxFRG4oNjQsIFdPUkQsIE9MRCwgTkVXKQorCisjZGVmaW5lIFNIVUZGTEVEKFdPUkQsIE9MRCwgTkVXKSBfU0hVRkZMRURuKF93b3JkLCBXT1JELCBPTEQsIE5FVykKKworCisvKiBtb3ZlIGEgZ3JvdXAgb2YgYml0cyBhcm91bmQgKi8KKyNkZWZpbmUgX0lOU0VSVEVEbihOLCBXT1JELCBTVEFSVCwgU1RPUCkgXAorKCgobmF0dXJhbCMjTikoV09SRCkgPDwgX01BS0VfU0hJRlQoTiwgU1RPUCkpICYgX01BU0tuKE4sIFNUQVJULCBTVE9QKSkKKworI2RlZmluZSBJTlNFUlRFRDMyKFdPUkQsIFNUQVJULCBTVE9QKSBfSU5TRVJURURuKDMyLCBXT1JELCBTVEFSVCwgU1RPUCkKKyNkZWZpbmUgSU5TRVJURUQ2NChXT1JELCBTVEFSVCwgU1RPUCkgX0lOU0VSVEVEbig2NCwgV09SRCwgU1RBUlQsIFNUT1ApCisKK0lOTElORV9CSVRTXAorKHVuc2lnbmVkX3dvcmQpIElOU0VSVEVECisodW5zaWduZWRfd29yZCB2YWwsCisgdW5zaWduZWQgc3RhcnQsCisgdW5zaWduZWQgc3RvcCk7CisKKworLyogZGVwZW5kaW5nIG9uIE1PREUgcmV0dXJuIGEgNjRiaXQgb3IgMzJiaXQgKHNpZ24gZXh0ZW5kZWQpIHZhbHVlICovCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyNkZWZpbmUgRVhURU5ERUQoWCkgICAgICgoc2lnbmVkNjQpKHNpZ25lZDMyKShYKSkKKyNlbHNlCisjZGVmaW5lIEVYVEVOREVEKFgpICAgICAoWCkKKyNlbmRpZgorCisKKy8qIG1lbW9yeSBhbGlnbm1lbnQgbWFjcm8ncyAqLworI2RlZmluZSBfQUxJR05hKEEsWCkgICgoKFgpICsgKChBKSAtIDEpKSAmIH4oKEEpIC0gMSkpCisjZGVmaW5lIF9GTE9PUmEoQSxYKSAgKChYKSAmIH4oKEEpIC0gMSkpCisKKyNkZWZpbmUgQUxJR05fOChYKQlfQUxJR05hKDgsIFgpCisjZGVmaW5lIEFMSUdOXzE2KFgpCV9BTElHTmEoMTYsIFgpCisKKyNkZWZpbmUgQUxJR05fUEFHRShYKQlfQUxJR05hKDB4MTAwMCwgWCkKKyNkZWZpbmUgRkxPT1JfUEFHRShYKSAgICgoWCkgJiB+KDB4MTAwMCAtIDEpKQorCisKKy8qIGJpdCBibGl0aW5nIG1hY3JvJ3MgKi8KKyNkZWZpbmUgQkxJVDMyKFYsIFBPUywgQklUKSBcCitkbyB7IFwKKyAgaWYgKEJJVCkgXAorICAgIFYgfD0gQklUMzIoUE9TKTsgXAorICBlbHNlIFwKKyAgICBWICY9IH5CSVQzMihQT1MpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBNQkxJVDMyKFYsIExPLCBISSwgVkFMKSBcCitkbyB7IFwKKyAgKFYpID0gKCgoVikgJiB+TUFTSzMyKChMTyksIChISSkpKSBcCisJIHwgSU5TRVJURUQzMihWQUwsIExPLCBISSkpOyBcCit9IHdoaWxlICgwKQorCisKKy8qIHNvbWUgcm90YXRlIGZ1bmN0aW9ucyB0byBtYWtlIHRoaW5ncyBlYXNpZXIKKworICAgTk9URTogVGhlc2UgYXJlIGZ1bmN0aW9ucyBub3QgbWFjcm8ncyBhcyB0aGUgbGF0dGVyIHRpY2tsZXMgYnVncyBpbgorICAgZ2NjLTIuNi4zICovCisKKyNkZWZpbmUgX1JPVExuKE4sIFZBTCwgU0hJRlQpIFwKKygoKFZBTCkgPDwgKFNISUZUKSkgfCAoKFZBTCkgPj4gKChOKS0oU0hJRlQpKSkpCisKK0lOTElORV9CSVRTXAorKHVuc2lnbmVkMzIpIFJPVEwzMgorKHVuc2lnbmVkMzIgdmFsLAorIGxvbmcgc2hpZnQpOworCitJTkxJTkVfQklUU1wKKyh1bnNpZ25lZDY0KSBST1RMNjQKKyh1bnNpZ25lZDY0IHZhbCwKKyBsb25nIHNoaWZ0KTsKKworCisjaWYgKEJJVFNfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCisjaW5jbHVkZSAiYml0cy5jIgorI2VuZGlmCisKKyNlbmRpZiAvKiBfQklUU19IXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9jYXAuYyBiL3NpbS9wcGMvY2FwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiZTMwNAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvY2FwLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfQ0FQX0NfCisjZGVmaW5lIF9DQVBfQ18KKworI2luY2x1ZGUgImNhcC5oIgorCit0eXBlZGVmIHN0cnVjdCBfY2FwX21hcHBpbmcgY2FwX21hcHBpbmc7CitzdHJ1Y3QgX2NhcF9tYXBwaW5nIHsKKyAgdW5zaWduZWRfY2VsbCBleHRlcm5hbDsKKyAgdm9pZCAqaW50ZXJuYWw7CisgIGNhcF9tYXBwaW5nICpuZXh0OworfTsKKworc3RydWN0IF9jYXAgeworICBpbnQgbnJfbWFwcGluZ3M7CisgIGNhcF9tYXBwaW5nICptYXBwaW5nczsKK307CisKK0lOTElORV9DQVBcCisoY2FwICopCitjYXBfY3JlYXRlKGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgcmV0dXJuIFpBTExPQyhjYXApOworfQorCitJTkxJTkVfQ0FQXAorKHZvaWQpCitjYXBfaW5pdChjYXAgKmRiKQoreworICBjYXBfbWFwcGluZyAqY3VycmVudF9tYXAgPSBkYi0+bWFwcGluZ3M7CisgIGlmIChjdXJyZW50X21hcCAhPSBOVUxMKSB7CisgICAgZGItPm5yX21hcHBpbmdzID0gZGItPm1hcHBpbmdzLT5leHRlcm5hbDsKKyAgICAvKiB2ZXJpZnkgdGhhdCB0aGUgbWFwcGluZ3MgdGhhdCB3ZXJlIG5vdCByZW1vdmVkIGFyZSBpbiBzZXF1ZW5jZQorICAgICAgIGRvd24gdG8gbnIgMSAqLworICAgIHdoaWxlIChjdXJyZW50X21hcC0+bmV4dCAhPSBOVUxMKSB7CisgICAgICBpZiAoY3VycmVudF9tYXAtPmV4dGVybmFsICE9IGN1cnJlbnRfbWFwLT5uZXh0LT5leHRlcm5hbCArIDEpCisJZXJyb3IoImNhcDogY2FwIGRhdGFiYXNlIHBvc3NpYmx5IGNvcnJ1cHQiKTsKKyAgICAgIGN1cnJlbnRfbWFwID0gY3VycmVudF9tYXAtPm5leHQ7CisgICAgfQorICAgIEFTU0VSVChjdXJyZW50X21hcC0+bmV4dCA9PSBOVUxMKTsKKyAgICBpZiAoY3VycmVudF9tYXAtPmV4dGVybmFsICE9IDEpCisgICAgICBlcnJvcigiY2FwOiBjYXAgZGF0YWJhc2UgcG9zc2libHkgY3VycnVwdCIpOworICB9CisgIGVsc2UgeworICAgIGRiLT5ucl9tYXBwaW5ncyA9IDA7CisgIH0KK30KKworSU5MSU5FX0NBUFwKKyh2b2lkICopCitjYXBfaW50ZXJuYWwoY2FwICpkYiwKKwkgICAgIHNpZ25lZF9jZWxsIGV4dGVybmFsKQoreworICBjYXBfbWFwcGluZyAqY3VycmVudF9tYXAgPSBkYi0+bWFwcGluZ3M7CisgIHdoaWxlIChjdXJyZW50X21hcCAhPSBOVUxMKSB7CisgICAgaWYgKGN1cnJlbnRfbWFwLT5leHRlcm5hbCA9PSBleHRlcm5hbCkKKyAgICAgIHJldHVybiBjdXJyZW50X21hcC0+aW50ZXJuYWw7CisgICAgY3VycmVudF9tYXAgPSBjdXJyZW50X21hcC0+bmV4dDsKKyAgfQorICByZXR1cm4gKHZvaWQqKTA7Cit9CisKK0lOTElORV9DQVBcCisoc2lnbmVkX2NlbGwpCitjYXBfZXh0ZXJuYWwoY2FwICpkYiwKKwkgICAgIHZvaWQgKmludGVybmFsKQoreworICBjYXBfbWFwcGluZyAqY3VycmVudF9tYXAgPSBkYi0+bWFwcGluZ3M7CisgIHdoaWxlIChjdXJyZW50X21hcCAhPSBOVUxMKSB7CisgICAgaWYgKGN1cnJlbnRfbWFwLT5pbnRlcm5hbCA9PSBpbnRlcm5hbCkKKyAgICAgIHJldHVybiBjdXJyZW50X21hcC0+ZXh0ZXJuYWw7CisgICAgY3VycmVudF9tYXAgPSBjdXJyZW50X21hcC0+bmV4dDsKKyAgfQorICByZXR1cm4gMDsKK30KKworSU5MSU5FX0NBUFwKKyh2b2lkKQorY2FwX2FkZChjYXAgKmRiLAorCXZvaWQgKmludGVybmFsKQoreworICBpZiAoY2FwX2V4dGVybmFsKGRiLCBpbnRlcm5hbCkgIT0gMCkgeworICAgIGVycm9yKCJjYXA6IGF0dGVtcHRpbmcgdG8gYWRkIGFuIG9iamVjdCBhbHJlYWR5IGluIHRoZSBkYXRhIGJhc2UiKTsKKyAgfQorICBlbHNlIHsKKyAgICAvKiBpbnNlcnQgYXQgdGhlIGZyb250IG1ha2luZyB0aGluZ3MgaW4gZGVjZW5kaW5nIG9yZGVyICovCisgICAgY2FwX21hcHBpbmcgKm5ld19tYXAgPSBaQUxMT0MoY2FwX21hcHBpbmcpOworICAgIG5ld19tYXAtPm5leHQgPSBkYi0+bWFwcGluZ3M7CisgICAgbmV3X21hcC0+aW50ZXJuYWwgPSBpbnRlcm5hbDsKKyAgICBkYi0+bnJfbWFwcGluZ3MgKz0gMTsKKyAgICBuZXdfbWFwLT5leHRlcm5hbCA9IGRiLT5ucl9tYXBwaW5nczsKKyAgICBkYi0+bWFwcGluZ3MgPSBuZXdfbWFwOworICB9Cit9CisKK0lOTElORV9DQVBcCisodm9pZCkKK2NhcF9yZW1vdmUoY2FwICpkYiwKKwkgICB2b2lkICppbnRlcm5hbCkKK3sKKyAgY2FwX21hcHBpbmcgKipjdXJyZW50X21hcCA9ICZkYi0+bWFwcGluZ3M7CisgIHdoaWxlICgqY3VycmVudF9tYXAgIT0gTlVMTCkgeworICAgIGlmICgoKmN1cnJlbnRfbWFwKS0+aW50ZXJuYWwgPT0gaW50ZXJuYWwpIHsKKyAgICAgIGNhcF9tYXBwaW5nICpkZWxldGUgPSAqY3VycmVudF9tYXA7CisgICAgICAqY3VycmVudF9tYXAgPSBkZWxldGUtPm5leHQ7CisgICAgICB6ZnJlZShkZWxldGUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjdXJyZW50X21hcCA9ICYoKmN1cnJlbnRfbWFwKS0+bmV4dDsKKyAgfQorICBlcnJvcigiY2FwOiBhdHRlbXB0IHRvIHJlbW92ZSBub25leGlzdGFudCBpbnRlcm5hbCBvYmplY3QiKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vcHBjL2NhcC5oIGIvc2ltL3BwYy9jYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzkxNzUyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9jYXAuaApAQCAtMCwwICsxLDYwIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LDE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKy8qIEV4cG9ydCBhIGNhcGFiaWxpdHkgZGF0YSBiYXNlIHRoYXQgbWFwcyBiZXR3ZWVuIGludGVybmFsIGRhdGEKKyAgIHZhbHVlcyBhbmQgdGhvc2UgZ2l2ZW4gdG8gYSBzaW11bGF0aW9uICovCisKKyNpZm5kZWYgX0NBUF9IXworI2RlZmluZSBfQ0FQX0hfCisKKyNpbmNsdWRlICJiYXNpY3MuaCIKKwordHlwZWRlZiBzdHJ1Y3QgX2NhcCBjYXA7CisKK0lOTElORV9DQVBcCisoY2FwICopIGNhcF9jcmVhdGUKKyhjb25zdCBjaGFyICpuYW1lKTsKKworSU5MSU5FX0NBUFwKKyh2b2lkKSBjYXBfaW5pdAorKGNhcCAqZGIpOworCitJTkxJTkVfQ0FQXAorKHNpZ25lZF9jZWxsKSBjYXBfZXh0ZXJuYWwKKyhjYXAgKmRiLAorIHZvaWQgKmludGVybmFsKTsKKworSU5MSU5FX0NBUFwKKyh2b2lkICopIGNhcF9pbnRlcm5hbAorKGNhcCAqZGIsCisgc2lnbmVkX2NlbGwgZXh0ZXJuYWwpOworCitJTkxJTkVfQ0FQXAorKHZvaWQpIGNhcF9hZGQKKyhjYXAgKmRiLAorIHZvaWQgKmludGVybmFsKTsKKworSU5MSU5FX0NBUFwKKyh2b2lkKSBjYXBfcmVtb3ZlCisoY2FwICpkYiwKKyB2b2lkICppbnRlcm5hbCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9jb25maWcuaW4gYi9zaW0vcHBjL2NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTNhODMzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9jb25maWcuaW4KQEAgLTAsMCArMSwzNjIgQEAKKy8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLworCisvKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLworI3VuZGVmIENfQUxMT0NBCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KKyN1bmRlZiBjb25zdAorCisvKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCisgICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLworI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkgc2V0IGJ5IGBnZXRncm91cHMnLgorICAgVXN1YWxseSB0aGlzIGlzIGVpdGhlciBgaW50JyBvciBgZ2lkX3QnLiAgKi8KKyN1bmRlZiBHRVRHUk9VUFNfVAorCisvKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgZ2lkX3QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCisjdW5kZWYgSEFWRV9BTExPQ0EKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSBpZiB5b3VyIHN0cnVjdCBzdGF0IGhhcyBzdF9ibGtzaXplLiAgKi8KKyN1bmRlZiBIQVZFX1NUX0JMS1NJWkUKKworLyogRGVmaW5lIGlmIHlvdXIgc3RydWN0IHN0YXQgaGFzIHN0X2Jsb2Nrcy4gICovCisjdW5kZWYgSEFWRV9TVF9CTE9DS1MKKworLyogRGVmaW5lIGlmIHlvdXIgc3RydWN0IHN0YXQgaGFzIHN0X3JkZXYuICAqLworI3VuZGVmIEhBVkVfU1RfUkRFVgorCisvKiBEZWZpbmUgaWYgeW91ciBzdHJ1Y3QgdG0gaGFzIHRtX3pvbmUuICAqLworI3VuZGVmIEhBVkVfVE1fWk9ORQorCisvKiBEZWZpbmUgaWYgeW91IGRvbid0IGhhdmUgdG1fem9uZSBidXQgZG8gaGF2ZSB0aGUgZXh0ZXJuYWwgYXJyYXkKKyAgIHR6bmFtZS4gICovCisjdW5kZWYgSEFWRV9UWk5BTUUKKworLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KKyN1bmRlZiBpbmxpbmUKKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIG1vZGVfdAorCisvKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIG9mZl90CisKKy8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBwaWRfdAorCisvKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KKyN1bmRlZiBfUE9TSVhfU09VUkNFCisKKy8qIERlZmluZSBhcyB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIChpbnQgb3Igdm9pZCkuICAqLworI3VuZGVmIFJFVFNJR1RZUEUKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgc2l6ZV90CisKKy8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQorICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCisgICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCisgU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcworIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcworIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCisgKi8KKyN1bmRlZiBTVEFDS19ESVJFQ1RJT04KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KKyN1bmRlZiBTVERDX0hFQURFUlMKKworLyogRGVmaW5lIGlmIHlvdXIgPHN5cy90aW1lLmg+IGRlY2xhcmVzIHN0cnVjdCB0bS4gICovCisjdW5kZWYgVE1fSU5fU1lTX1RJTUUKKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIHVpZF90CisKKy8qIERlZmluZSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAorICAgYnl0ZSBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCBhbmQgVkFYKS4gICovCisjdW5kZWYgV09SRFNfQklHRU5ESUFOCisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYWNjZXNzIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0FDQ0VTUworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGNmZ2V0aXNwZWVkIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0NGR0VUSVNQRUVECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgY2ZnZXRvc3BlZWQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfQ0ZHRVRPU1BFRUQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBjZnNldGlzcGVlZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9DRlNFVElTUEVFRAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGNmc2V0b3NwZWVkIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0NGU0VUT1NQRUVECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgY2hkaXIgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfQ0hESVIKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBjaG1vZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9DSE1PRAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGNob3duIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0NIT1dOCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0RDR0VUVEVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGR1cCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9EVVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkdXAyIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0RVUDIKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmY2htb2QgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfRkNITU9ECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZmNob3duIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0ZDSE9XTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZjbnRsIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0ZDTlRMCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZnN0YXQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfRlNUQVQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmc3RhdGZzIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0ZTVEFURlMKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUQ1dECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0ZGlyZW50cmllcyBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRESVJFTlRSSUVTCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0ZWdpZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRFR0lECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0ZXVpZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRFVUlECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Z2lkIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0dFVEdJRAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGlkIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0dFVFBJRAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBwaWQgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUFBJRAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHJ1c2FnZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRSVVNBR0UKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXR0aW1lb2ZkYXkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUVElNRU9GREFZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0dWlkIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0dFVFVJRAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGlvY3RsIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0lPQ1RMCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUga2lsbCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9LSUxMCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbGluayBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9MSU5LCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbHNlZWsgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfTFNFRUsKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBsc3RhdCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9MU1RBVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1rZGlyIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX01LRElSCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX01VTk1BUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHBpcGUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfUElQRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9QVVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByZWFkbGluayBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9SRUFETElOSworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJtZGlyIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1JNRElSCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NFVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRMT0NBTEUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRyZWdpZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRSRUdJRAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldHJldWlkIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NFVFJFVUlECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lncHJvY21hc2sgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0lHUFJPQ01BU0sKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdGF0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUQVQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDQVNFQ01QCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUkNIUgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5bWxpbmsgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1lNTElOSworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRjZHJhaW4gZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfVENEUkFJTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRjZmxvdyBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9UQ0ZMT1cKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0Y2ZsdXNoIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1RDRkxVU0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0Y2dldGF0dHIgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfVENHRVRBVFRSCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGNnZXRwZ3JwIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1RDR0VUUEdSUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRjc2VuZGJyZWFrIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1RDU0VOREJSRUFLCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGNzZXRhdHRyIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1RDU0VUQVRUUgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRjc2V0cGdycCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9UQ1NFVFBHUlAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0aW1lIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1RJTUUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB1bWFzayBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9VTUFTSworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHVubGluayBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9VTkxJTksKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9BUkdaX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZW50Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0RJUkVOVF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xJTUlUU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9MT0NBTEVfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTUFMTE9DX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmRpci5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9ORElSX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RETElCX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NUUklOR19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9kaXIuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX0RJUl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pb2N0bC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfSU9DVExfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvbW91bnQuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX01PVU5UX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL25kaXIuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX05ESVJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Jlc291cmNlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19TVEFUX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Rlcm1pby5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVEVSTUlPX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Rlcm1pb3MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1RFUk1JT1NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVElNRVNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9USU1FX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9WQUxVRVNfSApkaWZmIC0tZ2l0IGEvc2ltL3BwYy9jb25maWd1cmUgYi9zaW0vcHBjL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NDA2NjJhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9jb25maWd1cmUKQEAgLTAsMCArMSw1MTk3IEBACisjISAvYmluL3NoCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3NpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisjIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKKyMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KKworIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMworCisKKworCisKKyMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKKworCisjIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKKworCisjIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIEN5Z3dpbjMyLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgQ1lHV0lOMzIgdG8gInllcyIuCisjIE90aGVyd2lzZSBzZXQgaXQgdG8gIm5vIi4KKworCisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgV2luMzIsIHdpdGhvdXQgdXNpbmcKKyMgQUNfQ0FOT05JQ0FMXyouICBJZiBzbywgc2V0IG91dHB1dCB2YXJpYWJsZSBFWEVFWFQgdG8gIi5leGUiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICIiLgorCisKKworCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWFsaWdubWVudD1hbGlnbgkJU3BlY2lmeSBzdHJpY3Qgb3Igbm9uc3RyaWN0IGFsaWdubWVudC4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tYXNzZXJ0CQkJU3BlY2lmeSB3aGV0aGVyIHRvIHBlcmZvcm0gcmFuZG9tIGFzc2VydGlvbnMuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWJpdHNpemU9bgkJU3BlY2lmeSB0YXJnZXQgYml0c2l6ZSAoMzIgb3IgNjQpLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1ic3dhcAkJCVVzZSB0aGUgQlNXQVAgaW5zdHJ1Y3Rpb24gb24gSW50ZWwgNDg2cyBhbmQgUGVudGl1bXMuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tY29uZmlnPWZpbGUJCU92ZXJyaWRlIGRlZmF1bHQgY29uZmlnIGZpbGUiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZGVjb2RlLW1lY2hhbmlzbT13aGljaAkJU3BlY2lmeSB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2RlIG1lY2hhbmlzbS4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZGVmYXVsdC1tb2RlbD13aGljaAlTcGVjaWZ5IGRlZmF1bHQgUG93ZXJQQyB0byBtb2RlbC4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZHVwbGljYXRlCQlFeHBhbmQgKGR1cGxpY2F0ZSkgc2VtYW50aWMgZnVuY3Rpb25zLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1lbmRpYW49ZW5kaWFuCQlTcGVjaWZ5IHRhcmdldCBieXRlIGVuZGlhbiBvcmllbnRhdGlvbi4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZW52PWVudgkJCVNwZWNpZnkgdGFyZ2V0IGVudmlyb25tZW50IChvcGVyYXRpbmcsIHZpcnR1YWwsIHVzZXIpLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1maWx0ZXI9cnVsZQkJU3BlY2lmeSBmaWx0ZXIgcnVsZXMuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWZsb2F0CQkJU3BlY2lmeSB3aGV0aGVyIHRvIHVzZSBob3N0IGZsb2F0aW5nIHBvaW50IG9yIHNpbXVsYXRlLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1oYXJkd2FyZT1saXN0CQlTcGVjaWZ5IHRoZSBoYXJkd2FyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWhvc3RiaXRzaXplPTMyfDY0CVNwZWNpZnkgaG9zdCBiaXRzaXplICgzMiBvciA2NCkuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW49ZW5kCQlTcGVjaWZ5IGhvc3QgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWljYWNoZT1zaXplCQlTcGVjaWZ5IGluc3RydWN0aW9uLWRlY29kZSBjYWNoZSBzaXplIGFuZCB0eXBlLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1pbmxpbmU9aW5saW5lcwkJU3BlY2lmeSB3aGljaCBmdW5jdGlvbnMgc2hvdWxkIGJlIGlubGluZWQuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWp1bXAJCUp1bXAgYmV0d2VlbiBzZW1hbnRpYyBjb2RlIChpbnN0ZWFkIG9mIGNhbGwvcmV0dXJuKS4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tbGluZS1ucj1vcHRzCQlHZW5lcmF0ZSBleHRyYSBDUFAgY29kZSB0aGF0IHJlZmVyZW5jZXMgc291cmNlIHJhdGhlciB0aGFuIGdlbmVyYXRlZCBjb2RlIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLW1vZGVsPXdoaWNoCQlTcGVjaWZ5IFBvd2VyUEMgdG8gbW9kZWwuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLW1vZGVsLWlzc3VlCQlTcGVjaWZ5IHdoZXRoZXIgdG8gc2ltdWxhdGUgbW9kZWwgc3BlY2lmaWMgYWN0aW9ucyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1tb25pdG9yPW1vbgkJU3BlY2lmeSB3aGV0aGVyIHRvIGVuYWJsZSBtb25pdG9yaW5nIGV2ZW50cy4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tb3Bjb2RlPXdoaWNoCQlPdmVycmlkZSBkZWZhdWx0IG9wY29kZSBsb29rdXAuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLXBhY2thZ2VzPWxpc3QJCVNwZWNpZnkgdGhlIHBhY2thZ2VzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBidWlsZC4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tcmVncGFybT1uci1wYXJtCQlQYXNzIHBhcmFtZXRlcnMgaW4gcmVnaXN0ZXJzIGluc3RlYWQgb2Ygb24gdGhlIHN0YWNrIC0geDg2L0dDQyBzcGVjaWZpYy4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cwkJU3BlY2lmeSB3aGV0aGVyIHRvIGNoZWNrIHJlc2VydmVkIGJpdHMgaW4gaW5zdHJ1Y3Rpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLXNtcD1uCQkJU3BlY2lmeSBudW1iZXIgb2YgcHJvY2Vzc29ycyB0byBjb25maWd1cmUgZm9yLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1zdGRjYWxsPXR5cGUJCVVzZSBhbiBhbHRlcm5hdGl2ZSBmdW5jdGlvbiBjYWxsL3JldHVybiBtZWNoYW5pc20gLSB4ODYvR0NDIHNwZWNpZmljLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1zd2l0Y2gJCQlVc2UgYSBzd2l0Y2ggaW5zdGVhZCBvZiBhIHRhYmxlIGZvciBpbnN0cnVjdGlvbiBjYWxsLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS10aW1lYmFzZQkJCVNwZWNpZnkgd2hldGhlciB0aGUgUFBDIHRpbWViYXNlIGlzIHN1cHBvcnRlZC4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tdHJhY2UJCQlTcGVjaWZ5IHdoZXRoZXIgdHJhY2luZyBpcyBzdXBwb3J0ZWQuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLXdhcm5pbmdzPW9wdHMJCUV4dHJhIENGTEFHUyBmb3IgdHVybmluZyBvbiBjb21waWxlciB3YXJuaW5ncyBleGNlcHQgZm9yIGlkZWNvZGUubywgc2VtYW50aWNzLm8gYW5kIHBzaW0ubyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS14b3ItZW5kaWFuPW4JCVNwZWNpZnkgbnVtYmVyIGJ5dGVzIGludm9sdmVkIGluIFBvd2VyUEMgWE9SIGJpLWVuZGlhbiBtb2RlIChkZWZhdWx0IDgpLiIKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2J1aWxkPU5PTkUKK2NhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2V4ZWNfcHJlZml4PU5PTkUKK2hvc3Q9Tk9ORQorbm9fY3JlYXRlPQorbm9ub3B0PU5PTkUKK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3RhcmdldD1OT05FCit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorc3ViZGlycz0KK01GTEFHUz0gTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT1NYWtlZmlsZS5pbgorCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2FjX2V4ZWV4dD0KK2FjX29iamV4dD1vCitpZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KKyAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKyAgICBhY19uPSBhY19jPScKKycgYWNfdD0nCScKKyAgZWxzZQorICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKyAgZmkKK2Vsc2UKKyAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CitmaQorCisKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3NjM6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjgxNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODQ1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisgICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisJY29udGludWUKKyAgICAgIGZpCisgICAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2lmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgc2hpZnQKKyAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJEAiCisgIGZpCitmaQorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgorICAgICp3aW4zMiogfCAqV0lOMzIqKQorICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODk1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorIDs7CisgICAgZXNhYworICBmaQorICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5MjY6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDkzNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCittYWluKCl7cmV0dXJuKDApO30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5NDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcworICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCisgIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KKyAgZWxzZQorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCisgIGZpCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5NjA6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgorY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5NjU6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKKyNpZmRlZiBfX0dOVUNfXworICB5ZXM7CisjZW5kaWYKK0VPRgoraWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjk3NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2N2X3Byb2dfZ2NjPXllcworZWxzZQorICBhY19jdl9wcm9nX2djYz1ubworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKKworaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorCithY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKK2FjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo5OTM6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCitpZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBhY19jdl9wcm9nX2NjX2c9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCitlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLWcgLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPSItZyIKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0KKyAgZmkKK2ZpCisKKworIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgoraWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KKyAgQ0NfRk9SX0JVSUxEPSckKENDKScKK2Vsc2UKKyAgQ0NfRk9SX0JVSUxEPWdjYworZmkKKworQUxMX0xJTkdVQVM9CitlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTAzNDogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQorIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KK2lmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgIENQUD0KK2ZpCitpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAorICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgorICBDUFA9IiR7Q0MtY2N9IC1FIgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDQ5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDU1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDY2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDcyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDgzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDg5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPS9saWIvY3BwCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorcm0gLWYgY29uZnRlc3QqCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKKyAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCitlbHNlCisgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorZmkKK2VjaG8gIiRhY190IiIkQ1BQIiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExMTQ6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQorc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKK2FsbDoKKwlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJworRU9GCisjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KK2V2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAoraWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKK2Vsc2UKKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KK2ZpCitybSAtZiBjb25mdGVzdG1ha2UKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIFNFVF9NQUtFPQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgorZmkKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTQzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgorZmkKK2ZpCitSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExNzA6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKK2lmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgorICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQorRU9GCisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDQz0iJENDIC1wb3NpeCIKKyAgZWxzZQorICAgIENDPSIkQ0MgLVhwIgorICBmaQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgSVNDPQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExOTE6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExOTYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjEyMDQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTIyMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjM5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICA6CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyNjAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKK2ludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKK2lmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7CitleGl0ICgwKTsgfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI3MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICA6CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBTVERDX0hFQURFUlMgMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjk1OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzMDAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKworLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3R5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKKy8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCitjaGFyIGNvbnN0ICpjb25zdCAqY2NwOworY2hhciAqKnA7CisvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Oworc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07CisvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KKyAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCitjb25zdCBjaGFyICpnID0gInN0cmluZyI7CitjY3AgPSAmZyArIChnID8gZy1nIDogMCk7CisvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLworKytjY3A7CitwID0gKGNoYXIqKikgY2NwOworY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Cit7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLworICBjaGFyICp0OworICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOworCisgICp0KysgPSAwOworfQoreyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KKyAgaW50IHhbXSA9IHsyNSwgMTd9OworICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOworICArK2ZvbzsKK30KK3sgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLworICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKKyAgaXB0ciBwID0gMDsKKyAgKytwOworfQoreyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCisgICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KKyAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKKyAgc3RydWN0IHMgKmI7IGItPmogPSA1OworfQoreyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KKyAgY29uc3QgaW50IGZvbyA9IDEwOworfQorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM0OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfY29uc3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBjb25zdCAKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzcwOiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX2N2X2NfaW5saW5lPW5vCitmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzNzcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK30gJGFjX2t3IGZvbygpIHsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzg0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhaworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2RvbmUKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgorY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgorICBpbmxpbmUgfCB5ZXMpIDs7CisgIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgaW5saW5lIAorRU9GCisgOzsKKyAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKK0VPRgorIDs7Citlc2FjCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTQxMDogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTQxNSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAib2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBvZmZfdCBsb25nCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTQ0MzogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNDQ4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCitFT0YKKworZmkKKworIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKKyMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTQ3ODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE0ODMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFsbG9jYS5oPgoraW50IG1haW4oKSB7CitjaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ5MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE1MTE6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTUxNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBIQVZFX0FMTE9DQV9ICisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLworY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKK2ludCBtYWluKCkgeworY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQSAxCitFT0YKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgorICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucworICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKKyAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCisgICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgorICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgQ19BTExPQ0EgMQorRU9GCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTU3NjogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE1ODEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQord2ViZWNyYXkKKyNlbHNlCit3ZW5vdGJlY3JheQorI2VuZGlmCisKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KK2ZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjA2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNjExICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKK0VPRgorCisgIGJyZWFrCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZG9uZQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY2MTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE2NjkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorZmluZF9zdGFja19kaXJlY3Rpb24gKCkKK3sKKyAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOworICBhdXRvIGNoYXIgZHVtbXk7CisgIGlmIChhZGRyID09IDApCisgICAgeworICAgICAgYWRkciA9ICZkdW1teTsKKyAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOworfQorbWFpbiAoKQoreworICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY4ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgorRU9GCisKK2ZpCisKK2ZvciBhY19oZHIgaW4gdW5pc3RkLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzEzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTcxOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTcyMzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzUyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNzU3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3ODA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4MDU6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE4MTMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisvKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KKyAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgorCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKwltbWFwIHNoYXJlZCBub3QgZml4ZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisgICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQorICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAorICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5CisgICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCisgICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKKyAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCisgICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAorICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCisKKyAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KKyAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6CisgICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKKyAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKy8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KKyNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQorIyBpZmRlZiBIQVZFX1VOSVNURF9ICisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgZW5kaWYKKworLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KKyMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKKyMgZW5kaWYKKworIyBpZmRlZiBfU0NfUEFHRVNJWkUKKyMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQorIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLworIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKKyMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQorIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgICBpZmRlZiBOQlBHCisjICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCisjICAgICBpZm5kZWYgQ0xTSVpFCisjICAgICAgZGVmaW5lIENMU0laRSAxCisjICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KKyMgICAgZWxzZSAvKiBubyBOQlBHICovCisjICAgICBpZmRlZiBOQlBDCisjICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQworIyAgICAgZWxzZSAvKiBubyBOQlBDICovCisjICAgICAgaWZkZWYgUEFHRVNJWkUKKyMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKKyMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLworIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLworIyAgICBlbmRpZiAvKiBubyBOQlBHICovCisjICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLworIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KKyMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCisKKyNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KKyNlbHNlCitjaGFyICptYWxsb2MoKTsKKyNlbmRpZgorCitpbnQKK21haW4oKQoreworCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOworCWludCBpLCBwYWdlc2l6ZTsKKwlpbnQgZmQ7CisKKwlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisKKwkvKgorCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KKwkgKi8KKwlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YSArIGkpID0gcmFuZCgpOworCXVtYXNrKDApOworCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCisJLyoKKwkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKKwkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCisJICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KKwkgKi8KKwlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgxKTsKKwlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOworCWlmICghZGF0YTIpCisJCWV4aXQoMSk7CisJZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOworCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCisJCQlleGl0KDEpOworCisJLyoKKwkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQorCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KKwkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKKwlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhMykKKwkJZXhpdCgxKTsKKwlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKKwkJCWV4aXQoMSk7CisJY2xvc2UoZmQpOworCXVubGluaygiY29uZnRlc3RtbWFwIik7CisJZXhpdCgwKTsKK30KKworRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5NTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9NTUFQIDEKK0VPRgorCitmaQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAordW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTgxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTk4NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTk5MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAorX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwMjE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIwMjYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA0OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCisgICAgIGZvciBhY19mdW5jIGluIHN0cGNweQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjA3ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjA4MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmaQorICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KKyAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1RQQ1BZIDEKK0VPRgorCisgICBmaQorCisgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIxNDA6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjE0NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bG9jYWxlLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiBMQ19NRVNTQUdFUworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxNTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgorICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQorRU9GCisKKyAgICBmaQorICBmaQorICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMTczOiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCisgIFVTRV9OTFM9JGVuYWJsZXZhbAorZWxzZQorICBVU0VfTkxTPXllcworZmkKKworICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgorICAgIAorCisgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KKworICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEVOQUJMRV9OTFMgMQorRU9GCisKKyAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIxOTM6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKK2Vsc2UKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubworZmkKKworICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2CisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KKwlubHNfY3ZfaGVhZGVyX2xpYmd0PQorCUNBVE9CSkVYVD1OT05FCisKKwlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjIxMjogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjIxNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjIyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjIzOTogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMjQ0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjUxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKwkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyNjc6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQorYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1saW50bCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMjc1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgYmluZHRleHRkb21haW4oKTsKKworaW50IG1haW4oKSB7CitiaW5kdGV4dGRvbWFpbigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI4NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjMwMjogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzA3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMxNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0dFVFRFWFQgMQorRU9GCisKKwkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzNDI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisJICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgorCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzNzY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzODEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQwNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQzMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQ2NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNDk4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CitleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CisJCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9LmdtbworCQkgICBEQVRBRElSTkFNRT1zaGFyZQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9Lm1vCisJCSAgIERBVEFESVJOQU1FPWxpYgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCQlJTlNUT0JKRVhUPS5tbworCSAgICAgIGZpCisJICAgIGZpCisJCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisJICAgICAgICAKKyAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KKwkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCisgICAgICAgIGZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjUzODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KKwlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI1NzI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2MDc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KKwkgIDogOworCWVsc2UKKwkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCisgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKKyAgICBkb25lCisKKyAgICAgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgIAorCisgICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCisgICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCisgICAgICAgTElOR1VBUz0KKyAgICAgZWxzZQorICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2OTc6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQorICAgICAgIE5FV19MSU5HVUFTPQorICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbworICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgorICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7CisgICAgICAgICBlc2FjCisgICAgICAgZG9uZQorICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCisgICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2CisgICAgIGZpCisKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCisgICAgIGZpCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKKyAgIGVsc2UKKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAorLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgorICAgZmkKKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgorICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KKwkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3MjU6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI3MzAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjczNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIG1zZ2Zvcm1hdD1saW51eAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK21zZ2Zvcm1hdD14b3BlbgorZmkKKworCisJICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCisgICAgICBmaQorICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCisJICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICAKKyAgIAorCisgICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCisgICAKKworICAgICAgbD0KKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1hbGlnbm1lbnQgb3IgLS1kaXNhYmxlLXNpbS1hbGlnbm1lbnQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2FsaWdubWVudCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2FsaWdubWVudCIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMgfCBzdHJpY3QgfCBTVFJJQ1QpCXNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9U1RSSUNUX0FMSUdOTUVOVCI7OworICBubyB8IG5vbnN0cmljdCB8IE5PTlNUUklDVCkJc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD1OT05TVFJJQ1RfQUxJR05NRU5UIjs7CisgIDAgfCBkZWZhdWx0IHwgREVGQVVMVCkJc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0wIjs7CisgICopCQkJCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWFsaWdubWVudCIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2FsaWdubWVudD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2FsaWdubWVudCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgYWxpZ25tZW50IGZsYWdzID0gJHNpbV9hbGlnbm1lbnQiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9hbGlnbm1lbnQ9IiIKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1hc3NlcnQgb3IgLS1kaXNhYmxlLXNpbS1hc3NlcnQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2Fzc2VydCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Fzc2VydCIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9hc3NlcnQ9Ii1EV0lUSF9BU1NFUlQ9MSI7OworICBubykJc2ltX2Fzc2VydD0iLURXSVRIX0FTU0VSVD0wIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1hc3NlcnQgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYXNzZXJ0PSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYXNzZXJ0IiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBhc3NlcnQgZmxhZ3MgPSAkc2ltX2Fzc2VydCIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2Fzc2VydD0iIgorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWJpdHNpemUgb3IgLS1kaXNhYmxlLXNpbS1iaXRzaXplIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9iaXRzaXplK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fYml0c2l6ZSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICAzMnw2NCkgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPSRlbmFibGV2YWwiOzsKKyAgKikJIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1iaXRzaXplIHdhcyBnaXZlbiAkZW5hYmxldmFsLiAgRXhwZWN0ZWQgMzIgb3IgNjQiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9iaXRzaXplPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYml0c2l6ZSIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgYml0c2l6ZSBmbGFncyA9ICRzaW1fYml0c2l6ZSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2JpdHNpemU9IiIKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSI7OworICBubykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MCI7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYnN3YXAgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYnN3YXA9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ic3dhcCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgYnN3YXAgZmxhZ3MgPSAkc2ltX2Jzd2FwIiA2PiYxCitmaQorZWxzZQorICBzaW1fYnN3YXA9IiIKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1jZmxhZ3Mgb3IgLS1kaXNhYmxlLXNpbS1jZmxhZ3Mgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2NmbGFncytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2NmbGFncyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9jZmxhZ3M9Ii1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciI7OworICBubykJc2ltX2NmbGFncz0iIjs7CisgICopCXNpbV9jZmxhZ3M9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2NmbGFncyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIGNmbGFncyA9ICRzaW1fY2ZsYWdzIiA2PiYxCitmaQorZWxzZQorICBzaW1fY2ZsYWdzPSIiCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY29uZmlnIG9yIC0tZGlzYWJsZS1zaW0tY29uZmlnIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jb25maWcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jb25maWciCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzfG5vKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJObyB2YWx1ZSBzdXBwbGllZCBmb3IgLS1lbmFibGUtc2ltLWNvbmZpZz1maWxlIiIgMT4mMjsgZXhpdCAxOyB9OzsKKyAgKikJCWlmIHRlc3QgLWYgIiR7c3JjZGlyfS8ke2VuYWJsZXZhbH0iOyB0aGVuCisJCSAgc2ltX2NvbmZpZz0iJHtlbmFibGV2YWx9IjsKKwkJZWxpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJHtlbmFibGV2YWx9LWNvbmZpZy5oIjsgdGhlbgorCQkgIHNpbV9jb25maWc9IiR7ZW5hYmxldmFsfS1jb25maWcuaCIKKwkJZWxzZQorCQkgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIkNvbmZpZyBmaWxlICRlbmFibGV2YWwgd2FzIG5vdCBmb3VuZCIiIDE+JjI7IGV4aXQgMTsgfTsKKwkJICBzaW1fY29uZmlnPXN0ZC1jb25maWcuaAorCQlmaTs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2NvbmZpZyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgY29uZmlnIGZsYWdzID0gJHNpbV9jb25maWciIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9jb25maWc9InN0ZC1jb25maWcuaCIKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBjb25maWcgZmxhZ3MgPSAkc2ltX2NvbmZpZyIgNj4mMQorZmkKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1kZWNvZGUtbWVjaGFuaXNtIG9yIC0tZGlzYWJsZS1zaW0tZGVjb2RlLW1lY2hhbmlzbSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVjb2RlX21lY2hhbmlzbStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2RlY29kZV9tZWNoYW5pc20iCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzfG5vKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJObyB2YWx1ZSBzdXBwbGllZCBmb3IgLS1lbmFibGUtc2ltLWRlY29kZS1tZWNoYW5pc209ZmlsZSIiIDE+JjI7IGV4aXQgMTsgfTs7CisgIGFycmF5fHN3aXRjaHxwYWRkZWQtc3dpdGNofGdvdG8tc3dpdGNoKQlzaW1fZGVjb2RlX21lY2hhbmlzbT0iLVQgJHtlbmFibGV2YWx9Ijs7CisgICopCQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJGaWxlICRlbmFibGV2YWwgaXMgbm90IGFuIG9wY29kZSBydWxlcyBmaWxlIiIgMT4mMjsgZXhpdCAxOyB9OworCQlzaW1fZGVjb2RlX21lY2hhbmlzbT0ic3dpdGNoIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2RlY29kZV9tZWNoYW5pc20iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGRlY29kZSBtZWNoYW5pc20gZmxhZ3MgPSAkc2ltX2RlY29kZV9tZWNoYW5pc20iIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9kZWNvZGVfbWVjaGFuaXNtPSIiCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgZGVjb2RlIG1lY2hhbmlzbSBmbGFncyA9ICRzaW1fZGVjb2RlX21lY2hhbmlzbSIKK2ZpCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVmYXVsdC1tb2RlbCBvciAtLWRpc2FibGUtc2ltLWRlZmF1bHQtbW9kZWwgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2RlZmF1bHRfbW9kZWwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWZhdWx0X21vZGVsIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllc3xubykJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiTm8gdmFsdWUgc3VwcGxpZWQgZm9yIC0tZW5hYmxlLXNpbS1kZWZhdWx0LW1vZGVsPW1vZGVsIiIgMT4mMjsgZXhpdCAxOyB9OzsKKyAgKikJCXNpbV9kZWZhdWx0X21vZGVsPSItRFdJVEhfREVGQVVMVF9NT0RFTD0ke2VuYWJsZXZhbH0iOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVmYXVsdF9tb2RlbCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgZGVmYXVsdC1tb2RlbCBmbGFncyA9ICRzaW1fZGVmYXVsdF9tb2RlbCIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2RlZmF1bHRfbW9kZWw9IiIKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1kdXBsaWNhdGUgb3IgLS1kaXNhYmxlLXNpbS1kdXBsaWNhdGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2R1cGxpY2F0ZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2R1cGxpY2F0ZSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9kdXA9Ii1FIjs7CisgIG5vKQlzaW1fZHVwPSIiOzsKKyAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLWR1cGxpY2F0ZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9kdXA9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kdXAiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGR1cGxpY2F0ZSBmbGFncyA9ICRzaW1fZHVwIiA2PiYxCitmaQorZWxzZQorICBzaW1fZHVwPSItRSIKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBkdXBsaWNhdGUgZmxhZ3MgPSAkc2ltX2R1cCIgNj4mMQorZmkKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1lbmRpYW4gb3IgLS1kaXNhYmxlLXNpbS1lbmRpYW4gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2VuZGlhbitzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2VuZGlhbiIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCWNhc2UgIiR0YXJnZXQiIGluCisJICAqcG93ZXJwYy0qKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9QklHX0VORElBTiI7OworCSAgKnBvd2VycGNsZS0qKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9TElUVExFX0VORElBTiI7OworCSAgKikgZWNobyAiVW5rbm93biB0YXJnZXQgJHRhcmdldCIgMT4mNjsgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPTAiOzsKKwllc2FjOzsKKyAgbm8pCSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9MCI7OworICBiKnxCKikgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPUJJR19FTkRJQU4iOzsKKyAgbCp8TCopIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIjs7CisgICopCSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1lbmRpYW4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9lbmRpYW49IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9lbmRpYW4iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGVuZGlhbiBmbGFncyA9ICRzaW1fZW5kaWFuIiA2PiYxCitmaQorZWxzZQorICBzaW1fZW5kaWFuPSIiCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZW52IG9yIC0tZGlzYWJsZS1zaW0tZW52IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9lbnYrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9lbnYiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgb3BlcmF0aW5nIHwgb3MgfCBvZWEpCXNpbV9lbnY9Ii1EV0lUSF9FTlZJUk9OTUVOVD1PUEVSQVRJTkdfRU5WSVJPTk1FTlQiOzsKKyAgdmlydHVhbCB8IHZlYSkJc2ltX2Vudj0iLURXSVRIX0VOVklST05NRU5UPVZJUlRVQUxfRU5WSVJPTk1FTlQiOzsKKyAgdXNlciB8IHVlYSkJCXNpbV9lbnY9Ii1EV0lUSF9FTlZJUk9OTUVOVD1VU0VSX0VOVklST05NRU5UIjs7CisgIG5vKQkJCXNpbV9lbnY9Ii1EV0lUSF9FTlZJUk9OTUVOVD0wIjs7CisgICopCQkJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tZW52IiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fZW52PSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZW52IiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBlbnYgZmxhZ3MgPSAkc2ltX2VudiIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2Vudj0iIgorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWZpbHRlciBvciAtLWRpc2FibGUtc2ltLWZpbHRlciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fZmlsdGVyK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZmlsdGVyIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLWZpbHRlciBtdXN0IGJlIHNwZWNpZmllZCB3aXRoIGEgcnVsZSB0byBmaWx0ZXIgb3Igbm8iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9maWx0ZXI9IiI7OworICBubykJc2ltX2ZpbHRlcj0iIjs7CisgICopCXNpbV9maWx0ZXI9Ii1GICRlbmFibGV2YWwiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZmlsdGVyIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBmaWx0ZXIgZmxhZ3MgPSAkc2ltX2ZpbHRlciIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2ZpbHRlcj0iLUYgMzIsZixvIgoraWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGZpbHRlciBmbGFncyA9ICRzaW1fZmlsdGVyIiA2PiYxCitmaQorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWZsb2F0IG9yIC0tZGlzYWJsZS1zaW0tZmxvYXQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2Zsb2F0K3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZmxvYXQiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzIHwgaGFyZCkJc2ltX2Zsb2F0PSItRFdJVEhfRkxPQVRJTkdfUE9JTlQ9SEFSRF9GTE9BVElOR19QT0lOVCI7OworICBubyB8IHNvZnQpCXNpbV9mbG9hdD0iLURXSVRIX0ZMT0FUSU5HX1BPSU5UPVNPRlRfRkxPQVRJTkdfUE9JTlQiOzsKKyAgKikJCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWZsb2F0IiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fZmxvYXQ9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9mbG9hdCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgZmxvYXQgZmxhZ3MgPSAkc2ltX2Zsb2F0IiA2PiYxCitmaQorZWxzZQorICBzaW1fZmxvYXQ9IiIKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1oYXJkd2FyZSBvciAtLWRpc2FibGUtc2ltLWhhcmR3YXJlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9oYXJkd2FyZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2hhcmR3YXJlIgorICBoYXJkd2FyZT0iY3B1LG1lbW9yeSxudnJhbSxpb2J1cyxodGFiLGRpc2ssdHJhY2UscmVnaXN0ZXIsdm0saW5pdCxjb3JlLHBhbCxjb20sZWVwcm9tLG9waWMsZ2x1ZSxwaGIsaWRlIgorY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCTs7CisgIG5vKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJMaXN0IG9mIGhhcmR3YXJlIG11c3QgYmUgc3BlY2lmaWVkIGZvciAtLWVuYWJsZS1zaW0taGFyZHdhcmUiIiAxPiYyOyBleGl0IDE7IH07IGhhcmR3YXJlPSIiOzsKKyAgLCopICAgaGFyZHdhcmU9IiR7aGFyZHdhcmV9JHtlbmFibGV2YWx9Ijs7CisgICosKSAgIGhhcmR3YXJlPSIke2VuYWJsZXZhbH0ke2hhcmR3YXJlfSI7OworICAqKQloYXJkd2FyZT0iJHtlbmFibGV2YWx9IicnOzsKK2VzYWMKK3NpbV9od19zcmM9YGVjaG8gJGhhcmR3YXJlIHwgc2VkIC1lICdzLywvLmMgaHdfL2cnIC1lICdzL14vaHdfLycgLWUgcycvJC8uYy8nYAorc2ltX2h3X29iaj1gZWNobyAkc2ltX2h3X3NyYyB8IHNlZCAtZSAncy9cLmMvLm8vZydgCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkaGFyZHdhcmUiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGhhcmR3YXJlIHRvICRzaW1faHdfc3JjLCAkc2ltX2h3X29iaiIKK2ZpCitlbHNlCisgIGhhcmR3YXJlPSJjcHUsbWVtb3J5LG52cmFtLGlvYnVzLGh0YWIsZGlzayx0cmFjZSxyZWdpc3Rlcix2bSxpbml0LGNvcmUscGFsLGNvbSxlZXByb20sb3BpYyxnbHVlLHBoYixpZGUiCitzaW1faHdfc3JjPWBlY2hvICRoYXJkd2FyZSB8IHNlZCAtZSAncy8sLy5jIGh3Xy9nJyAtZSAncy9eL2h3Xy8nIC1lIHMnLyQvLmMvJ2AKK3NpbV9od19vYmo9YGVjaG8gJHNpbV9od19zcmMgfCBzZWQgLWUgJ3MvXC5jLy5vL2cnYAoraWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGhhcmR3YXJlIHRvICRzaW1faHdfc3JjLCAkc2ltX2h3X29iaiIKK2ZpCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0taG9zdGJpdHNpemUgb3IgLS1kaXNhYmxlLXNpbS1ob3N0Yml0c2l6ZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1faG9zdGJpdHNpemUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ob3N0Yml0c2l6ZSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICAzMnw2NCkgc2ltX2hvc3RiaXRzaXplPSItRFdJVEhfSE9TVF9XT1JEX0JJVFNJWkU9JGVuYWJsZXZhbCI7OworICAqKQkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLWhvc3RiaXRzaXplIHdhcyBnaXZlbiAkZW5hYmxldmFsLiAgRXhwZWN0ZWQgMzIgb3IgNjQiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ob3N0Yml0c2l6ZT0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2hvc3RiaXRzaXplIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBob3N0Yml0c2l6ZSBmbGFncyA9ICRzaW1faG9zdGJpdHNpemUiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9ob3N0Yml0c2l6ZT0iIgorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW4gb3IgLS1kaXNhYmxlLXNpbS1ob3N0ZW5kaWFuIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ob3N0ZW5kaWFuK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1faG9zdGVuZGlhbiIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICBubykJIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPTAiOzsKKyAgYip8QiopIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUJJR19FTkRJQU4iOzsKKyAgbCp8TCopIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iOzsKKyAgKikJIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBmb3IgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ob3N0ZW5kaWFuPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1faG9zdGVuZGlhbiIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgaG9zdGVuZGlhbiBmbGFncyA9ICRzaW1faG9zdGVuZGlhbiIgNj4mMQorZmkKK2Vsc2UKKyAgCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMDg5OiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2JpZ2VuZGlhbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KKyMgU2VlIGlmIHN5cy9wYXJhbS5oIGRlZmluZXMgdGhlIEJZVEVfT1JERVIgbWFjcm8uCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDk2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KK2ludCBtYWluKCkgeworCisjaWYgIUJZVEVfT1JERVIgfHwgIUJJR19FTkRJQU4gfHwgIUxJVFRMRV9FTkRJQU4KKyBib2d1cyBlbmRpYW4gbWFjcm9zCisjZW5kaWYKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTA3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBCSUdfRU5ESUFOIG9yIG5vdC4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMxMTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgoraW50IG1haW4oKSB7CisKKyNpZiBCWVRFX09SREVSICE9IEJJR19FTkRJQU4KKyBub3QgYmlnIGVuZGlhbgorI2VuZGlmCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzEyMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2lmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmciIDE+JjI7IGV4aXQgMTsgfQorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMTQyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK21haW4gKCkgeworICAvKiBBcmUgd2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4/ICBGcm9tIEhhcmJpc29uJlN0ZWVsZS4gICovCisgIHVuaW9uCisgIHsKKyAgICBsb25nIGw7CisgICAgY2hhciBjW3NpemVvZiAobG9uZyldOworICB9IHU7CisgIHUubCA9IDE7CisgIGV4aXQgKHUuY1tzaXplb2YgKGxvbmcpIC0gMV0gPT0gMSk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE1NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2JpZ2VuZGlhbiIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCitFT0YKKworZmkKKworICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHllczsgdGhlbgorICAgIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUJJR19FTkRJQU4iCisgIGVsc2UKKyAgICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIgorICBmaQorZWxzZQorICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj0wIgorZmkKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1pY2FjaGUgb3IgLS1kaXNhYmxlLXNpbS1pY2FjaGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2ljYWNoZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2ljYWNoZSIKKyAgaWNhY2hlPSItUiIKKyBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJCWljYWNoZT0iMTAyNCI7IHNpbV9pY2FjaGU9Ii1JICRpY2FjaGUiOzsKKyAgbm8pCQlzaW1faWNhY2hlPSItUiI7OworICAqKSBpY2FjaGU9MTAyNAorICAgICBzaW1faWNhY2hlPSItIgorICAgICBmb3IgeCBpbiBgZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbworICAgICAgIGNhc2UgIiR4IiBpbgorICAgICAgICAgZGVmaW5lKQlzaW1faWNhY2hlPSIke3NpbV9pY2FjaGV9UiI7OworICAgICAgICAgc2VtYW50aWMpCXNpbV9pY2FjaGU9IiR7c2ltX2ljYWNoZX1DIjs7CisJIGluc24pCQlzaW1faWNhY2hlPSIke3NpbV9pY2FjaGV9UyI7OworCSAwKnwxKnwyKnwzKnw0Knw1Knw2Knw3Knw4Knw5KikJaWNhY2hlPSR4OzsKKyAgICAgICAgICopCQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICR4IGZvciAtLWVuYWJsZS1zaW0taWNhY2hlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1faWNhY2hlPSIiOzsKKyAgICAgICBlc2FjCisgICAgIGRvbmUKKyAgICAgc2ltX2ljYWNoZT0iJHtzaW1faWNhY2hlfUkgJGljYWNoZSI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJGljYWNoZSIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgaW5zdHJ1Y3Rpb24gY2FjaGUgc2l6ZSB0byAkaWNhY2hlICgkc2ltX2ljYWNoZSkiCitmaQorZWxzZQorICBzaW1faWNhY2hlPSItQ1NSSSAxMDI0IgoraWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGluc3RydWN0aW9uIGNhY2hlIHNpemUgdG8gMTAyNCAoJHNpbV9pY2FjaGUpIgorZmkKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1pbmxpbmUgb3IgLS1kaXNhYmxlLXNpbS1pbmxpbmUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2lubGluZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2lubGluZSIKKyAgc2ltX2lubGluZT0iIgorY2FzZSAiJGVuYWJsZXZhbCIgaW4KKyAgbm8pCQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiOzsKKyAgMCkJCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCI7OworICB5ZXMgfCAyKQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPUFMTF9JTkxJTkUiOzsKKyAgMSkJCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9SU5MSU5FX0xPQ0FMUyI7OworICAqKSBmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKyAgICAgICBuZXdfZmxhZz0iIgorICAgICAgIGNhc2UgIiR4IiBpbgorCSAqX0lOTElORT0qKQluZXdfZmxhZz0iLUQkeCI7OworCSAqPSopCQluZXdfZmxhZz1gZWNobyAiJHgiIHwgc2VkIC1lICJzLz0vX0lOTElORT0vIiAtZSAicy9eLy1ELyJgOzsKKwkgKl9JTkxJTkUpCW5ld19mbGFnPSItRCR4PUFMTF9JTkxJTkUiOzsKKwkgKikJCW5ld19mbGFnPSItRCR4IiJfSU5MSU5FPUFMTF9JTkxJTkUiOzsKKyAgICAgICBlc2FjCisgICAgICAgaWYgdGVzdCB4IiRzaW1faW5saW5lIiA9IHgiIjsgdGhlbgorCSBzaW1faW5saW5lPSIkbmV3X2ZsYWciCisgICAgICAgZWxzZQorCSBzaW1faW5saW5lPSIkc2ltX2lubGluZSAkbmV3X2ZsYWciCisgICAgICAgZmkKKyAgICAgZG9uZTs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2lubGluZSIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgaW5saW5lIGZsYWdzID0gJHNpbV9pbmxpbmUiIDY+JjEKK2ZpCitlbHNlCisgIGlmIHRlc3QgeCIkR0NDIiAhPSAiIjsgdGhlbgorICBzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPUlOTElORV9MT0NBTFMiCisgIGlmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KKyAgICBlY2hvICJTZXR0aW5nIGlubGluZSBmbGFncyA9ICRzaW1faW5saW5lIiA2PiYxCisgIGZpCitlbHNlCisgIHNpbV9pbmxpbmU9IiIKK2ZpCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tanVtcCBvciAtLWRpc2FibGUtc2ltLWp1bXAgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2p1bXArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9qdW1wIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX2p1bXA9Ii1KIjs7CisgIG5vKQlzaW1fanVtcD0iIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1qdW1wIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2p1bXA9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9qdW1wIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBqdW1wIGZsYWcgPSAkc2ltX2p1bXAiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9qdW1wPSIiCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcganVtcCBmbGFnID0gJHNpbV9qdW1wIiA2PiYxCitmaQorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWxpbmUtbnIgb3IgLS1kaXNhYmxlLXNpbS1saW5lLW5yIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9saW5lX25yK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fbGluZV9uciIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9saW5lX25yPSIiOzsKKyAgbm8pCXNpbV9saW5lX25yPSItTCI7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tbGluZS1uciBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9saW5lX25yPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fbGluZV9uciIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgd2FybmluZyBmbGFncyA9ICRzaW1fbGluZV9uciIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2xpbmVfbnI9IiIKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1tb2RlbCBvciAtLWRpc2FibGUtc2ltLW1vZGVsIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9tb2RlbCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX21vZGVsIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllc3xubykJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiTm8gdmFsdWUgc3VwcGxpZWQgZm9yIC0tZW5hYmxlLXNpbS1tb2RlbD1tb2RlbCIiIDE+JjI7IGV4aXQgMTsgfTs7CisgICopCQlzaW1fbW9kZWw9Ii1EV0lUSF9NT0RFTD0ke2VuYWJsZXZhbH0iOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fbW9kZWwiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIG1vZGVsIGZsYWdzID0gJHNpbV9tb2RlbCIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX21vZGVsPSIiCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tbW9kZWwtaXNzdWUgb3IgLS1kaXNhYmxlLXNpbS1tb2RlbC1pc3N1ZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fbW9kZWxfaXNzdWUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9tb2RlbF9pc3N1ZSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9tb2RlbF9pc3N1ZT0iLURXSVRIX01PREVMX0lTU1VFPU1PREVMX0lTU1VFX1BST0NFU1MiOzsKKyAgbm8pCXNpbV9tb2RlbF9pc3N1ZT0iLURXSVRIX01PREVMX0lTU1VFPU1PREVMX0lTU1VFX0lHTk9SRSI7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tbW9kZWwtaXNzdWUgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fbW9kZWxfaXNzdWU9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIG1vZGVsLWlzc3VlIGZsYWdzID0gJHNpbV9tb2RlbF9pc3N1ZSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX21vZGVsX2lzc3VlPSIiCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tbW9uaXRvciBvciAtLWRpc2FibGUtc2ltLW1vbml0b3Igd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX21vbml0b3Irc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9tb25pdG9yIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJCXNpbV9tb25pdG9yPSItRFdJVEhfTU9OPSdNT05JVE9SX0lOU1RSVUNUSU9OX0lTU1VFIHwgTU9OSVRPUl9MT0FEX1NUT1JFX1VOSVQnIjs7CisgIG5vKQkJc2ltX21vbml0b3I9Ii1EV0lUSF9NT049MCI7OworICBpbnN0cnVjdGlvbikJc2ltX21vbml0b3I9Ii1EV0lUSF9NT049TU9OSVRPUl9JTlNUUlVDVElPTl9JU1NVRSI7OworICBtZW1vcnkpCXNpbV9tb25pdG9yPSItRFdJVEhfTU9OPU1PTklUT1JfTE9BRF9TVE9SRV9VTklUIjs7CisgICopCQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1tb24iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9lbnY9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9tb25pdG9yIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBtb25pdG9yIGZsYWdzID0gJHNpbV9tb25pdG9yIiA2PiYxCitmaQorZWxzZQorICBzaW1fbW9uaXRvcj0iIgorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLW9wY29kZSBvciAtLWRpc2FibGUtc2ltLW9wY29kZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fb3Bjb2RlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fb3Bjb2RlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllc3xubykJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiTm8gdmFsdWUgc3VwcGxpZWQgZm9yIC0tZW5hYmxlLXNpbS1vcGNvZGU9ZmlsZSIiIDE+JjI7IGV4aXQgMTsgfTs7CisgICopCQlpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJHtlbmFibGV2YWx9IjsgdGhlbgorCQkgIHNpbV9vcGNvZGU9IiR7ZW5hYmxldmFsfSIKKwkJZWxpZiB0ZXN0IC1mICIke3NyY2Rpcn0vZGMtJHtlbmFibGV2YWx9IjsgdGhlbgorCQkgIHNpbV9vcGNvZGU9ImRjLSR7ZW5hYmxldmFsfSIKKwkJZWxzZQorCQkgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIkZpbGUgJGVuYWJsZXZhbCBpcyBub3QgYW4gb3Bjb2RlIHJ1bGVzIGZpbGUiIiAxPiYyOyBleGl0IDE7IH07CisJCSAgc2ltX29wY29kZT0iZGMtY29tcGxleCIKKwkJZmk7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9vcGNvZGUiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIG9wY29kZSBmbGFncyA9ICRzaW1fb3Bjb2RlIiA2PiYxCitmaQorZWxzZQorICBzaW1fb3Bjb2RlPSJkYy1jb21wbGV4IgoraWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIG9wY29kZSBmbGFncyA9ICRzaW1fb3Bjb2RlIgorZmkKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1wYWNrYWdlcyBvciAtLWRpc2FibGUtc2ltLXBhY2thZ2VzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9wYWNrYWdlcytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3BhY2thZ2VzIgorICBwYWNrYWdlcz1kaXNrbGFiZWwKK2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQk7OworICBubykJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiTGlzdCBvZiBwYWNrYWdlcyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgLS1lbmFibGUtc2ltLXBhY2thZ2VzIiIgMT4mMjsgZXhpdCAxOyB9OyBwYWNrYWdlcz0iIjs7CisgICwqKSAgIHBhY2thZ2VzPSIke3BhY2thZ2VzfSR7ZW5hYmxldmFsfSI7OworICAqLCkgICBwYWNrYWdlcz0iJHtlbmFibGV2YWx9JHtwYWNrYWdlc30iOzsKKyAgKikJcGFja2FnZXM9IiR7ZW5hYmxldmFsfSInJzs7Citlc2FjCitzaW1fcGtfc3JjPWBlY2hvICRwYWNrYWdlcyB8IHNlZCAtZSAncy8sLy5jIHBrXy9nJyAtZSAncy9eL3BrXy8nIC1lICdzLyQvLmMvJ2AKK3NpbV9wa19vYmo9YGVjaG8gJHNpbV9wa19zcmMgfCBzZWQgLWUgJ3MvXC5jLy5vL2cnYAoraWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHBhY2thZ2VzIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBwYWNrYWdlcyB0byAkc2ltX3BrX3NyYywgJHNpbV9wa19vYmoiCitmaQorZWxzZQorICBwYWNrYWdlcz1kaXNrbGFiZWwKK3NpbV9wa19zcmM9YGVjaG8gJHBhY2thZ2VzIHwgc2VkIC1lICdzLywvLmMgcGtfL2cnIC1lICdzL14vcGtfLycgLWUgJ3MvJC8uYy8nYAorc2ltX3BrX29iaj1gZWNobyAkc2ltX3BrX3NyYyB8IHNlZCAtZSAncy9cLmMvLm8vZydgCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgcGFja2FnZXMgdG8gJHNpbV9wa19zcmMsICRzaW1fcGtfb2JqIgorZmkKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1yZWdwYXJtIG9yIC0tZGlzYWJsZS1zaW0tcmVncGFybSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fcmVncGFybStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3JlZ3Bhcm0iCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgMCp8MSp8Mip8Myp8NCp8NSp8Nip8Nyp8OCp8OSopIHNpbV9yZWdwYXJtPSItRFdJVEhfUkVHUEFSTT0ke2VuYWJsZXZhbH0iOzsKKyAgbm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbV9yZWdwYXJtPSIiIDs7CisgIHllcykgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1fcmVncGFybT0iLURXSVRIX1JFR1BBUk09MyI7OworICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBmb3IgLS1lbmFibGUtc2ltLXJlZ3Bhcm0iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9yZWdwYXJtPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcmVncGFybSIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgcmVncGFybSBmbGFncyA9ICRzaW1fcmVncGFybSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3JlZ3Bhcm09IiIKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1yZXNlcnZlZC1iaXRzIG9yIC0tZGlzYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fcmVzZXJ2ZWRfYml0cytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3Jlc2VydmVkX2JpdHMiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fcmVzZXJ2ZWQ9Ii1EV0lUSF9SRVNFUlZFRF9CSVRTPTEiOzsKKyAgbm8pCXNpbV9yZXNlcnZlZD0iLURXSVRIX1JFU0VSVkVEX0JJVFM9MCI7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cyBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9yZXNlcnZlZD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3Jlc2VydmVkIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyByZXNlcnZlZCBmbGFncyA9ICRzaW1fcmVzZXJ2ZWQiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9yZXNlcnZlZD0iIgorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXNtcCBvciAtLWRpc2FibGUtc2ltLXNtcCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fc21wK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fc21wIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3NtcD0iLURXSVRIX1NNUD01IiA7IHNpbV9pZ2VuX3NtcD0iLU4gNSI7OworICBubykJc2ltX3NtcD0iLURXSVRIX1NNUD0wIiA7IHNpbV9pZ2VuX3NtcD0iLU4gMCI7OworICAqKQlzaW1fc21wPSItRFdJVEhfU01QPSRlbmFibGV2YWwiIDsgc2ltX2lnZW5fc21wPSItTiAkZW5hYmxldmFsIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3NtcCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc21wIGZsYWdzID0gJHNpbV9zbXAiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9zbXA9Ii1EV0lUSF9TTVA9NSIgOyBzaW1faWdlbl9zbXA9Ii1OIDUiCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc21wIGZsYWdzID0gJHNpbV9zbXAiIDY+JjEKK2ZpCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tc3RkY2FsbCBvciAtLWRpc2FibGUtc2ltLXN0ZGNhbGwgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3N0ZGNhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9zdGRjYWxsIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIG5vKQkJc2ltX3N0ZGNhbGw9IiIgOzsKKyAgc3RkKikJCXNpbV9zdGRjYWxsPSItRFdJVEhfU1REQ0FMTD0xIjs7CisgIHllcykJCXNpbV9zdGRjYWxsPSItRFdJVEhfU1REQ0FMTD0xIjs7CisgICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0tc3RkY2FsbCIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGNhbGw9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zdGRjYWxsIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBmdW5jdGlvbiBjYWxsIGZsYWdzID0gJHNpbV9zdGRjYWxsIiA2PiYxCitmaQorZWxzZQorICBzaW1fc3RkY2FsbD0iIgorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXN0ZGlvIG9yIC0tZGlzYWJsZS1zaW0tc3RkaW8gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3N0ZGlvK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fc3RkaW8iCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET19VU0VfU1RESU8iOzsKKyAgbm8pCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPTlRfVVNFX1NURElPIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLXN0ZGlvIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fc3RkaW89IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zdGRpbyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc3RkaW8gZmxhZ3MgPSAkc2ltX3N0ZGlvIiA2PiYxCitmaQorZWxzZQorICBzaW1fc3RkaW89IiIKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zd2l0Y2ggb3IgLS1kaXNhYmxlLXNpbS1zd2l0Y2ggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3N3aXRjaCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N3aXRjaCIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9zd2l0Y2g9Ii1zIjs7CisgIG5vKQlzaW1fc3dpdGNoPSIiOzsKKyAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLXN3aXRjaCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9zd2l0Y2g9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zd2l0Y2giICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHN3aXRjaCBmbGFncyA9ICRzaW1fc3dpdGNoIiA2PiYxCitmaQorZWxzZQorICBzaW1fc3dpdGNoPSIiOworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHN3aXRjaCBmbGFncyA9ICRzaW1fc3dpdGNoIiA2PiYxCitmaQorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXRpbWViYXNlIG9yIC0tZGlzYWJsZS1zaW0tdGltZWJhc2Ugd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3RpbWViYXNlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fdGltZWJhc2UiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fdGltZWJhc2U9Ii1EV0lUSF9USU1FX0JBU0U9MSI7OworICBubykJc2ltX3RpbWViYXNlPSItRFdJVEhfVElNRV9CQVNFPTAiOzsKKyAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLXRpbWViYXNlIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3RpbWViYXNlPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdGltZWJhc2UiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHRpbWViYXNlIGZsYWdzID0gJHNpbV90aW1lYmFzZSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3RpbWViYXNlPSIiCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tdHJhY2Ugb3IgLS1kaXNhYmxlLXNpbS10cmFjZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fdHJhY2Urc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV90cmFjZSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV90cmFjZT0iLURXSVRIX1RSQUNFPTEiOzsKKyAgbm8pCXNpbV90cmFjZT0iLURXSVRIX1RSQUNFPTAiOzsKKyAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLXRyYWNlIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3RyYWNlPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHRyYWNlIGZsYWdzID0gJHNpbV90cmFjZSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3RyYWNlPSIiCitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0td2FybmluZ3Mgb3IgLS1kaXNhYmxlLXNpbS13YXJuaW5ncyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fd2FybmluZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV93YXJuaW5ncyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV93YXJuaW5ncz0iLVdlcnJvciAtV2FsbCAtV3BvaW50ZXItYXJpdGggLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAiOzsKKyAgbm8pCXNpbV93YXJuaW5ncz0iLXciOzsKKyAgKikJc2ltX3dhcm5pbmdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV93YXJuaW5ncyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgd2FybmluZyBmbGFncyA9ICRzaW1fd2FybmluZ3MiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV93YXJuaW5ncz0iIgorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXhvci1lbmRpYW4gb3IgLS1kaXNhYmxlLXNpbS14b3ItZW5kaWFuIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV94b3JfZW5kaWFuK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1feG9yX2VuZGlhbiIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV94b3JfZW5kaWFuPSItRFdJVEhfWE9SX0VORElBTj04Ijs7CisgIG5vKQlzaW1feG9yX2VuZGlhbj0iLURXSVRIX1hPUl9FTkRJQU49MCI7OworICAqKQlzaW1feG9yX2VuZGlhbj0iLURXSVRIX1hPUl9FTkRJQU49JGVuYWJsZXZhbCI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV94b3JfZW5kaWFuIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyB4b3ItZW5kaWFuIGZsYWcgPSAkc2ltX3hvcl9lbmRpYW4iIDY+JjEKK2ZpCitlbHNlCisgIHNpbV94b3JfZW5kaWFuPSIiCitmaQorCisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzYwOTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisKK2hvc3RfYWxpYXM9JGhvc3QKK2Nhc2UgIiRob3N0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpCisgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpIDs7CisgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2hvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAoraG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNjMwOiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorCit0YXJnZXRfYWxpYXM9JHRhcmdldAorY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCit0YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCit0YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNjQ4OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9CitlbHNlCisgICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KKyAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAorcyxcXCxcXFxcLGc7IHMsXCQsJCQsZworRU9GX1NFRAorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgorICBybSAtZiBjb25mdGVzdHNlZAorZmkKK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorCisjIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCit0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCisKKworLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0CisKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc3RfYmxrc2l6ZSBpbiBzdHJ1Y3Qgc3RhdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzY5NTogY2hlY2tpbmcgZm9yIHN0X2Jsa3NpemUgaW4gc3RydWN0IHN0YXQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N0cnVjdF9zdF9ibGtzaXplJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzcwMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KK2ludCBtYWluKCkgeworc3RydWN0IHN0YXQgczsgcy5zdF9ibGtzaXplOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3MDg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9zdHJ1Y3Rfc3RfYmxrc2l6ZT15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfc3RydWN0X3N0X2Jsa3NpemU9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3Zfc3RydWN0X3N0X2Jsa3NpemUiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3N0cnVjdF9zdF9ibGtzaXplID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NUX0JMS1NJWkUgMQorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzdF9ibG9ja3MgaW4gc3RydWN0IHN0YXQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM3Mjk6IGNoZWNraW5nIGZvciBzdF9ibG9ja3MgaW4gc3RydWN0IHN0YXQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N0cnVjdF9zdF9ibG9ja3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNzM0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgoraW50IG1haW4oKSB7CitzdHJ1Y3Qgc3RhdCBzOyBzLnN0X2Jsb2NrczsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzQyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfc3RydWN0X3N0X2Jsb2Nrcz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfc3RydWN0X3N0X2Jsb2Nrcz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9zdHJ1Y3Rfc3RfYmxvY2tzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9zdHJ1Y3Rfc3RfYmxvY2tzID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NUX0JMT0NLUyAxCitFT0YKKworZWxzZQorICBMSUJPQkpTPSIkTElCT0JKUyBmaWxlYmxvY2tzLiR7YWNfb2JqZXh0fSIKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzdF9yZGV2IGluIHN0cnVjdCBzdGF0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNzY1OiBjaGVja2luZyBmb3Igc3RfcmRldiBpbiBzdHJ1Y3Qgc3RhdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3RydWN0X3N0X3JkZXYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNzcwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgoraW50IG1haW4oKSB7CitzdHJ1Y3Qgc3RhdCBzOyBzLnN0X3JkZXY7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc3ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3N0cnVjdF9zdF9yZGV2PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9zdHJ1Y3Rfc3RfcmRldj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9zdHJ1Y3Rfc3RfcmRldiIgMT4mNgoraWYgdGVzdCAkYWNfY3Zfc3RydWN0X3N0X3JkZXYgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1RfUkRFViAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdHJ1Y3QgdG0gaXMgaW4gc3lzL3RpbWUuaCBvciB0aW1lLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM3OTk6IGNoZWNraW5nIHdoZXRoZXIgc3RydWN0IHRtIGlzIGluIHN5cy90aW1lLmggb3IgdGltZS5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zdHJ1Y3RfdG0nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzODA0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CitpbnQgbWFpbigpIHsKK3N0cnVjdCB0bSAqdHA7IHRwLT50bV9zZWM7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzgxMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3N0cnVjdF90bT10aW1lLmgKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfc3RydWN0X3RtPXN5cy90aW1lLmgKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3Zfc3RydWN0X3RtIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9zdHJ1Y3RfdG0gPSBzeXMvdGltZS5oOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBUTV9JTl9TWVNfVElNRSAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRtX3pvbmUgaW4gc3RydWN0IHRtIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozODMzOiBjaGVja2luZyBmb3IgdG1fem9uZSBpbiBzdHJ1Y3QgdG0iID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N0cnVjdF90bV96b25lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzgzOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8JGFjX2N2X3N0cnVjdF90bT4KK2ludCBtYWluKCkgeworc3RydWN0IHRtIHRtOyB0bS50bV96b25lOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4NDY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9zdHJ1Y3RfdG1fem9uZT15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfc3RydWN0X3RtX3pvbmU9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3Zfc3RydWN0X3RtX3pvbmUiIDE+JjYKK2lmIHRlc3QgIiRhY19jdl9zdHJ1Y3RfdG1fem9uZSIgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfVE1fWk9ORSAxCitFT0YKKworZWxzZQorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdHpuYW1lIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozODY2OiBjaGVja2luZyBmb3IgdHpuYW1lIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl92YXJfdHpuYW1lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzg3MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8dGltZS5oPgorI2lmbmRlZiB0em5hbWUgLyogRm9yIFNHSS4gICovCitleHRlcm4gY2hhciAqdHpuYW1lW107IC8qIFJTNjAwMCBhbmQgb3RoZXJzIHJlamVjdCBjaGFyICoqdHpuYW1lLiAgKi8KKyNlbmRpZgoraW50IG1haW4oKSB7CithdG9pKCp0em5hbWUpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4ODE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3Zhcl90em5hbWU9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3Zhcl90em5hbWU9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfdmFyX3R6bmFtZSIgMT4mNgorICBpZiB0ZXN0ICRhY19jdl92YXJfdHpuYW1lID0geWVzOyB0aGVuCisgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfVFpOQU1FIDEKK0VPRgorCisgIGZpCitmaQorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB1aWRfdCBpbiBzeXMvdHlwZXMuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzkwNDogY2hlY2tpbmcgZm9yIHVpZF90IGluIHN5cy90eXBlcy5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3VpZF90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzkwOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgInVpZF90IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3VpZF90PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfdWlkX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3VpZF90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX3VpZF90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIHVpZF90IGludAorRU9GCisKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGdpZF90IGludAorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHR5cGUgb2YgYXJyYXkgYXJndW1lbnQgdG8gZ2V0Z3JvdXBzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozOTM4OiBjaGVja2luZyB0eXBlIG9mIGFycmF5IGFyZ3VtZW50IHRvIGdldGdyb3VwcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9nZXRncm91cHMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl90eXBlX2dldGdyb3Vwcz1jcm9zcworZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzOTQ2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworLyogVGhhbmtzIHRvIE1pa2UgUmVuZGVsbCBmb3IgdGhpcyB0ZXN0LiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNkZWZpbmUgTkdJRCAyNTYKKyN1bmRlZiBNQVgKKyNkZWZpbmUgTUFYKHgsIHkpICgoeCkgPiAoeSkgPyAoeCkgOiAoeSkpCittYWluKCkKK3sKKyAgZ2lkX3QgZ2lkc2V0W05HSURdOworICBpbnQgaSwgbjsKKyAgdW5pb24geyBnaWRfdCBndmFsOyBsb25nIGx2YWw7IH0gIHZhbDsKKworICB2YWwubHZhbCA9IC0xOworICBmb3IgKGkgPSAwOyBpIDwgTkdJRDsgaSsrKQorICAgIGdpZHNldFtpXSA9IHZhbC5ndmFsOworICBuID0gZ2V0Z3JvdXBzIChzaXplb2YgKGdpZHNldCkgLyBNQVggKHNpemVvZiAoaW50KSwgc2l6ZW9mIChnaWRfdCkpIC0gMSwKKyAgICAgICAgICAgICAgICAgZ2lkc2V0KTsKKyAgLyogRXhpdCBub24temVybyBpZiBnZXRncm91cHMgc2VlbXMgdG8gcmVxdWlyZSBhbiBhcnJheSBvZiBpbnRzLiAgVGhpcworICAgICBoYXBwZW5zIHdoZW4gZ2lkX3QgaXMgc2hvcnQgYnV0IGdldGdyb3VwcyBtb2RpZmllcyBhbiBhcnJheSBvZiBpbnRzLiAgKi8KKyAgZXhpdCAoKG4gPiAwICYmIGdpZHNldFtuXSAhPSB2YWwuZ3ZhbCkgPyAxIDogMCk7Cit9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTcxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgICAgYWNfY3ZfdHlwZV9nZXRncm91cHM9Z2lkX3QKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9nZXRncm91cHM9aW50CitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworaWYgdGVzdCAkYWNfY3ZfdHlwZV9nZXRncm91cHMgPSBjcm9zczsgdGhlbgorICAgICAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzOTg1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDx1bmlzdGQuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiZ2V0Z3JvdXBzLippbnQuKmdpZF90IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX2dldGdyb3Vwcz1naWRfdAorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfZ2V0Z3JvdXBzPWludAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX2dldGdyb3VwcyIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgR0VUR1JPVVBTX1QgJGFjX2N2X3R5cGVfZ2V0Z3JvdXBzCitFT0YKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgbW9kZV90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MDA5OiBjaGVja2luZyBmb3IgbW9kZV90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX21vZGVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQwMTQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm1vZGVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfbW9kZV90PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfbW9kZV90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfbW9kZV90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX21vZGVfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBtb2RlX3QgaW50CitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MDQyOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0MDQ3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIG9mZl90IGxvbmcKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgcGlkX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQwNzU6IGNoZWNraW5nIGZvciBwaWRfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9waWRfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQwODAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgInBpZF90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9waWRfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3BpZF90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfcGlkX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfcGlkX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgcGlkX3QgaW50CitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MTA4OiBjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2lnbmFsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDExMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaWZkZWYgc2lnbmFsCisjdW5kZWYgc2lnbmFsCisjZW5kaWYKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB2b2lkICgqc2lnbmFsIChpbnQsIHZvaWQgKCopKGludCkpKShpbnQpOworI2Vsc2UKK3ZvaWQgKCpzaWduYWwgKCkpICgpOworI2VuZGlmCisKK2ludCBtYWluKCkgeworaW50IGk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDEzMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2lnbmFsPXZvaWQKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9aW50CitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2lnbmFsIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBSRVRTSUdUWVBFICRhY19jdl90eXBlX3NpZ25hbAorRU9GCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDE0OTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0MTU0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpemVfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHVpZF90IGluIHN5cy90eXBlcy5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0MTgyOiBjaGVja2luZyBmb3IgdWlkX3QgaW4gc3lzL3R5cGVzLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfdWlkX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0MTg3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAidWlkX3QiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfdWlkX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV91aWRfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfdWlkX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfdWlkX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgdWlkX3QgaW50CitFT0YKKworICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgZ2lkX3QgaW50CitFT0YKKworZmkKKworCitmb3IgYWNfZnVuYyBpbiBhY2Nlc3MgY2ZnZXRpc3BlZWQgY2ZnZXRvc3BlZWQgY2ZzZXRpc3BlZWQgY2ZzZXRvc3BlZWQgY2hkaXIgY2htb2QgY2hvd24gZHVwIGR1cDIgZmNobW9kIGZjaG93biBmY250bCBmc3RhdCBmc3RhdGZzIGdldGRpcmVudHJpZXMgZ2V0ZWdpZCBnZXRldWlkIGdldGdpZCBnZXRwaWQgZ2V0cHBpZCBnZXRydXNhZ2UgZ2V0dGltZW9mZGF5IGdldHVpZCBpb2N0bCBraWxsIGxpbmsgbHNlZWsgbHN0YXQgbWtkaXIgcGlwZSByZWFkbGluayBybWRpciBzZXRyZXVpZCBzZXRyZWdpZCBzdGF0IHNpZ3Byb2NtYXNrIHN0YXQgc3ltbGluayB0Y2dldGF0dHIgdGNzZXRhdHRyIHRjc2VuZGJyZWFrIHRjZHJhaW4gdGNmbHVzaCB0Y2Zsb3cgdGNnZXRwZ3JwIHRjc2V0cGdycCB0aW1lIHVtYXNrIHVubGluaworZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDIxOTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDIyNCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MjQ3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisKK2ZvciBhY19oZHIgaW4gZmNudGwuaCBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggc3lzL2lvY3RsLmggc3lzL3BhcmFtLmggc3lzL3Jlc291cmNlLmggc3lzL3N0YXQuaCBzeXMvdGVybWlvLmggc3lzL3Rlcm1pb3MuaCBzeXMvdGltZS5oIHN5cy90aW1lcy5oIHN5cy90eXBlcy5oIHRpbWUuaCB1bmlzdGQuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQyNzY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0MjgxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Mjg2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworYWNfaGVhZGVyX2RpcmVudD1ubworZm9yIGFjX2hkciBpbiBkaXJlbnQuaCBzeXMvbmRpci5oIHN5cy9kaXIuaCBuZGlyLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQzMTc6IGNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0MzIyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDwkYWNfaGRyPgoraW50IG1haW4oKSB7CitESVIgKmRpcnAgPSAwOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzMzA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfZGlyZW50XyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyBhY19oZWFkZXJfZGlyZW50PSRhY19oZHI7IGJyZWFrCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKyMgVHdvIHZlcnNpb25zIG9mIG9wZW5kaXIgZXQgYWwuIGFyZSBpbiAtbGRpciBhbmQgLWx4IG9uIFNDTyBYZW5peC4KK2lmIHRlc3QgJGFjX2hlYWRlcl9kaXJlbnQgPSBkaXJlbnQuaDsgdGhlbgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWxkaXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQzNTU6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1sZGlyIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gZGlyJ18nb3BlbmRpciB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxkaXIgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDM2MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIG9wZW5kaXIoKTsKKworaW50IG1haW4oKSB7CitvcGVuZGlyKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Mzc0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBMSUJTPSIkTElCUyAtbGRpciIKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlbHNlCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbHgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQzOTY6IGNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1seCIgPiY1CithY19saWJfdmFyPWBlY2hvIHgnXydvcGVuZGlyIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbHggICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDQwNCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIG9wZW5kaXIoKTsKKworaW50IG1haW4oKSB7CitvcGVuZGlyKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDE1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBMSUJTPSIkTElCUyAtbHgiCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZmkKKworCitzaW1fdGVybWlvPSIiCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc3RydWN0IHRlcm1pb3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ0NDA6IGNoZWNraW5nIGZvciBzdHJ1Y3QgdGVybWlvcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdGVybWlvc19zdHJ1Y3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA0NDQ1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGVybWlvcy5oPgoraW50IG1haW4oKSB7CitzdGF0aWMgc3RydWN0IHRlcm1pb3MgeDsKKyB4LmNfaWZsYWcgPSAwOworIHguY19vZmxhZyA9IDA7CisgeC5jX2NmbGFnID0gMDsKKyB4LmNfbGZsYWcgPSAwOworIHguY19jY1tOQ0NTXSA9IDA7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQ1ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3Rlcm1pb3Nfc3RydWN0PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90ZXJtaW9zX3N0cnVjdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl90ZXJtaW9zX3N0cnVjdCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfdGVybWlvc19zdHJ1Y3QgPSB5ZXM7IHRoZW4KKyAgc2ltX3Rlcm1pbz0iJHNpbV90ZXJtaW8gLURIQVZFX1RFUk1JT1NfU1RSVUNUVVJFIgorZmkKKworaWYgdGVzdCAiJGFjX2N2X3Rlcm1pb3Nfc3RydWN0IiA9ICJ5ZXMiOyB0aGVuCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjX2xpbmUgZmllbGQgaW4gc3RydWN0IHRlcm1pb3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ0Nzc6IGNoZWNraW5nIGZvciBjX2xpbmUgZmllbGQgaW4gc3RydWN0IHRlcm1pb3MiID4mNQorICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdGVybWlvc19jbGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ0ODIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90ZXJtaW9zLmg+CitpbnQgbWFpbigpIHsKK3N0YXRpYyBzdHJ1Y3QgdGVybWlvcyB4OyB4LmNfbGluZSA9IDA7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQ5MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3Rlcm1pb3NfY2xpbmU9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3Rlcm1pb3NfY2xpbmU9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKKworICBlY2hvICIkYWNfdCIiJGFjX2N2X3Rlcm1pb3NfY2xpbmUiIDE+JjYKKyAgaWYgdGVzdCAkYWNfY3ZfdGVybWlvc19jbGluZSA9IHllczsgdGhlbgorICAgIHNpbV90ZXJtaW89IiRzaW1fdGVybWlvIC1ESEFWRV9URVJNSU9TX0NMSU5FIgorICBmaQorZWxzZQorICBhY19jdl90ZXJtaW9zX2NsaW5lPW5vCitmaQorCitpZiB0ZXN0ICIkYWNfY3ZfdGVybWlvc19zdHJ1Y3QiICE9ICJ5ZXMiOyB0aGVuCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzdHJ1Y3QgdGVybWlvIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NTEzOiBjaGVja2luZyBmb3Igc3RydWN0IHRlcm1pbyIgPiY1CisgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90ZXJtaW9fc3RydWN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNDUxOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3Rlcm1pby5oPgoraW50IG1haW4oKSB7CitzdGF0aWMgc3RydWN0IHRlcm1pbyB4OworIHguY19pZmxhZyA9IDA7CisgeC5jX29mbGFnID0gMDsKKyB4LmNfY2ZsYWcgPSAwOworIHguY19sZmxhZyA9IDA7CisgeC5jX2NjW05DQ10gPSAwOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1MzE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90ZXJtaW9fc3RydWN0PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90ZXJtaW9fc3RydWN0PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCisgIGVjaG8gIiRhY190IiIkYWNfY3ZfdGVybWlvX3N0cnVjdCIgMT4mNgorICBpZiB0ZXN0ICRhY19jdl90ZXJtaW9fc3RydWN0ID0geWVzOyB0aGVuCisgICAgc2ltX3Rlcm1pbz0iJHNpbV90ZXJtaW8gLURIQVZFX1RFUk1JT19TVFJVQ1RVUkUiCisgIGZpCitlbHNlCisgIGFjX2N2X3Rlcm1pb19zdHJ1Y3Q9bm8KK2ZpCisKK2lmIHRlc3QgIiRhY19jdl90ZXJtaW9fc3RydWN0IiA9ICJ5ZXMiOyB0aGVuCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjX2xpbmUgZmllbGQgaW4gc3RydWN0IHRlcm1pbyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NDU1MzogY2hlY2tpbmcgZm9yIGNfbGluZSBmaWVsZCBpbiBzdHJ1Y3QgdGVybWlvIiA+JjUKKyAgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Rlcm1pb19jbGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ1NTggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90ZXJtaW8uaD4KK2ludCBtYWluKCkgeworc3RhdGljIHN0cnVjdCB0ZXJtaW8geDsgeC5jX2xpbmUgPSAwOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1NjY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90ZXJtaW9fY2xpbmU9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3Rlcm1pb19jbGluZT1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworCisgIGVjaG8gIiRhY190IiIkYWNfY3ZfdGVybWlvX2NsaW5lIiAxPiY2CisgIGlmIHRlc3QgJGFjX2N2X3Rlcm1pb19jbGluZSA9IHllczsgdGhlbgorICAgIHNpbV90ZXJtaW89IiRzaW1fdGVybWlvIC1ESEFWRV9URVJNSU9fQ0xJTkUiCisgIGZpCitlbHNlCisgIGFjX2N2X3Rlcm1pb19jbGluZT1ubworZmkKKworc2ltX2Rldnplcm89IiIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAvZGV2L3plcm8iIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ1ODk6IGNoZWNraW5nIGZvciAvZGV2L3plcm8iID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Rldnplcm8nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9kZXZ6ZXJvPW5vCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDQ1OTcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGZjbnRsLmg+CittYWluICgpIHsKKyAgY2hhciBidWZbMjA0OF07CisgIGludCBpOworICBpbnQgZmQgPSBvcGVuICgiL2Rldi96ZXJvIiwgT19SRE9OTFkpOworICBpZiAoZmQgPCAwKQorICAgIHJldHVybiAxOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChidWYpOyBpKyspCisgICAgYnVmW2ldID0gMTsKKyAgaWYgKHJlYWQgKGZkLCBidWYsIHNpemVvZiAoYnVmKSkgIT0gc2l6ZW9mIChidWYpKQorICAgIHJldHVybiAxOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChidWYpOyBpKyspCisgICAgaWYgKGJ1ZltpXSkKKyAgICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjE2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Rldnplcm89eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Rldnplcm89bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Rldnplcm8iIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Rldnplcm8gPSB5ZXM7IHRoZW4KKyAgc2ltX2Rldnplcm89Ii1ESEFWRV9ERVZaRVJPIgorZWxzZQorICBzaW1fZGV2emVybz0iIgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNvbW1vbiBzaW11bGF0b3IgZGlyZWN0b3J5IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NjM4OiBjaGVja2luZyBmb3IgY29tbW9uIHNpbXVsYXRvciBkaXJlY3RvcnkiID4mNQoraWYgdGVzdCAtZiAiJHtzcmNkaXJ9Ly4uL2NvbW1vbi9jYWxsYmFjay5jIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIHNpbV9jYWxsYmFjaz0iY2FsbGJhY2subyB0YXJnLW1hcC5vIgorICBzaW1fdGFyZ192YWxzPSJ0YXJnLXZhbHMuaCB0YXJnLW1hcC5jIHRhcmctdmFscy5kZWYiCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBzaW1fY2FsbGJhY2s9IiIKKyAgc2ltX3RhcmdfdmFscz0iIgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo0NjUwOiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRDWUdXSU4zMiIgPSB5ZXM7IHRoZW4KK2FtX2N2X2V4ZWV4dD0uZXhlCitlbHNlCitjYXQgPiBhbV9jX3Rlc3QuYyA8PCAnRU9GJworaW50IG1haW4oKSB7CisvKiBOb3RoaW5nIG5lZWRlZCBoZXJlICovCit9CitFT0YKKyR7Q0MtY2N9IC1vIGFtX2NfdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBhbV9jX3Rlc3QuYyAkTElCUyAxPiY1CithbV9jdl9leGVleHQ9YGxzIGFtX2NfdGVzdC4qIHwgZ3JlcCAtdiBhbV9jX3Rlc3QuYyB8IHNlZCAtZSBzL2FtX2NfdGVzdC8vYAorcm0gLWYgYW1fY190ZXN0KgorZmkKKwordGVzdCB4IiR7YW1fY3ZfZXhlZXh0fSIgPSB4ICYmIGFtX2N2X2V4ZWV4dD1ubworZmkKK0VYRUVYVD0iIgordGVzdCB4IiR7YW1fY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FtX2N2X2V4ZWV4dH0KK2VjaG8gIiRhY190IiIke2FtX2N2X2V4ZWV4dH0iIDE+JjYKKworCisKKworCitBUj0ke0FSLWFyfQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjQ2ODI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3RyYXAgJycgMSAyIDE1CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxIHwgZ3JlcCBhY19zcGFjZWAgaW4KKyAgKmFjX3NwYWNlPVwgKikKKyAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgc2VkIC1uIFwKKyAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCisgICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCisgICAgOzsKKyAgKikKKyAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKyAgICA7OworICBlc2FjID4+IGNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCisjIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KKyMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJworZmkKKwordHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorCitERUZTPS1ESEFWRV9DT05GSUdfSAorCisjIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKworZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUworcm0gLWYgJENPTkZJR19TVEFUVVMKK2NhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisjISAvYmluL3NoCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAorIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMKKyMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCisjCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKK2ZvciBhY19vcHRpb24KK2RvCisgIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCisgICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQorICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiIKKyAgICBleGl0IDAgOzsKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCisgICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7CisgIGVzYWMKK2RvbmUKKworYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKK2FjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgorCit0cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KK3NlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Cisgcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKKyRhY192cHN1YgorJGV4dHJhc3ViCitzJUBzaW1fZW52aXJvbm1lbnRAJSRzaW1fZW52aXJvbm1lbnQlZworcyVAc2ltX2FsaWdubWVudEAlJHNpbV9hbGlnbm1lbnQlZworcyVAc2ltX2Fzc2VydEAlJHNpbV9hc3NlcnQlZworcyVAc2ltX2JpdHNpemVAJSRzaW1fYml0c2l6ZSVnCitzJUBzaW1fZW5kaWFuQCUkc2ltX2VuZGlhbiVnCitzJUBzaW1faG9zdGVuZGlhbkAlJHNpbV9ob3N0ZW5kaWFuJWcKK3MlQHNpbV9mbG9hdEAlJHNpbV9mbG9hdCVnCitzJUBzaW1fc2NhY2hlQCUkc2ltX3NjYWNoZSVnCitzJUBzaW1fZGVmYXVsdF9tb2RlbEAlJHNpbV9kZWZhdWx0X21vZGVsJWcKK3MlQHNpbV9od19jZmxhZ3NAJSRzaW1faHdfY2ZsYWdzJWcKK3MlQHNpbV9od19vYmpzQCUkc2ltX2h3X29ianMlZworcyVAc2ltX2h3QCUkc2ltX2h3JWcKK3MlQHNpbV9pbmxpbmVAJSRzaW1faW5saW5lJWcKK3MlQHNpbV9wYWNrYWdlc0AlJHNpbV9wYWNrYWdlcyVnCitzJUBzaW1fcmVncGFybUAlJHNpbV9yZWdwYXJtJWcKK3MlQHNpbV9yZXNlcnZlZF9iaXRzQCUkc2ltX3Jlc2VydmVkX2JpdHMlZworcyVAc2ltX3NtcEAlJHNpbV9zbXAlZworcyVAc2ltX3N0ZGNhbGxAJSRzaW1fc3RkY2FsbCVnCitzJUBzaW1feG9yX2VuZGlhbkAlJHNpbV94b3JfZW5kaWFuJWcKK3MlQGJ1aWxkX3dhcm5pbmdzQCUkYnVpbGRfd2FybmluZ3MlZworcyVAU0hFTExAJSRTSEVMTCVnCitzJUBDRkxBR1NAJSRDRkxBR1MlZworcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCitzJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKK3MlQERFRlNAJSRERUZTJWcKK3MlQExERkxBR1NAJSRMREZMQUdTJWcKK3MlQExJQlNAJSRMSUJTJWcKK3MlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworcyVAcHJlZml4QCUkcHJlZml4JWcKK3MlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKK3MlQGJpbmRpckAlJGJpbmRpciVnCitzJUBzYmluZGlyQCUkc2JpbmRpciVnCitzJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCitzJUBkYXRhZGlyQCUkZGF0YWRpciVnCitzJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCitzJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKK3MlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKK3MlQGxpYmRpckAlJGxpYmRpciVnCitzJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCitzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCitzJUBpbmZvZGlyQCUkaW5mb2RpciVnCitzJUBtYW5kaXJAJSRtYW5kaXIlZworcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKK3MlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCitzJUBDQ0AlJENDJWcKK3MlQFNFVF9NQUtFQCUkU0VUX01BS0UlZworcyVAUkFOTElCQCUkUkFOTElCJWcKK3MlQENQUEAlJENQUCVnCitzJUBBTExPQ0FAJSRBTExPQ0ElZworcyVAVVNFX05MU0AlJFVTRV9OTFMlZworcyVATVNHRk1UQCUkTVNHRk1UJWcKK3MlQEdNU0dGTVRAJSRHTVNHRk1UJWcKK3MlQFhHRVRURVhUQCUkWEdFVFRFWFQlZworcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCitzJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKK3MlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCitzJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKK3MlQEdNT0ZJTEVTQCUkR01PRklMRVMlZworcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZworcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCitzJUBJTlRMTElCU0AlJElOVExMSUJTJWcKK3MlQElOVExPQkpTQCUkSU5UTE9CSlMlZworcyVAUE9GSUxFU0AlJFBPRklMRVMlZworcyVAUE9TVUJAJSRQT1NVQiVnCitzJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCitzJUBHVF9OT0AlJEdUX05PJWcKK3MlQEdUX1lFU0AlJEdUX1lFUyVnCitzJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCitzJUBsQCUkbCVnCitzJUBob3N0QCUkaG9zdCVnCitzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCitzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKK3MlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZworcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKK3MlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCitzJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCitzJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCitzJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZworcyVAYnVpbGRAJSRidWlsZCVnCitzJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKK3MlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCitzJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZworcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCitzJUBMSUJPQkpTQCUkTElCT0JKUyVnCitzJUBFWEVFWFRAJSRFWEVFWFQlZworcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKK3MlQEhERUZJTkVTQCUkSERFRklORVMlZworcyVAQVJAJSRBUiVnCitzJUBzaW1fY2ZsYWdzQCUkc2ltX2NmbGFncyVnCitzJUBzaW1fd2FybmluZ3NAJSRzaW1fd2FybmluZ3MlZworcyVAc2ltX2xpbmVfbnJAJSRzaW1fbGluZV9uciVnCitzJUBzaW1fY29uZmlnQCUkc2ltX2NvbmZpZyVnCitzJUBzaW1fb3Bjb2RlQCUkc2ltX29wY29kZSVnCitzJUBzaW1fc3dpdGNoQCUkc2ltX3N3aXRjaCVnCitzJUBzaW1fZHVwQCUkc2ltX2R1cCVnCitzJUBzaW1fZGVjb2RlX21lY2hhbmlzbUAlJHNpbV9kZWNvZGVfbWVjaGFuaXNtJWcKK3MlQHNpbV9qdW1wQCUkc2ltX2p1bXAlZworcyVAc2ltX2ZpbHRlckAlJHNpbV9maWx0ZXIlZworcyVAc2ltX2ljYWNoZUAlJHNpbV9pY2FjaGUlZworcyVAc2ltX2h3X3NyY0AlJHNpbV9od19zcmMlZworcyVAc2ltX2h3X29iakAlJHNpbV9od19vYmolZworcyVAc2ltX3BrX3NyY0AlJHNpbV9wa19zcmMlZworcyVAc2ltX3BrX29iakAlJHNpbV9wa19vYmolZworcyVAc2ltX2Jzd2FwQCUkc2ltX2Jzd2FwJWcKK3MlQHNpbV9pZ2VuX3NtcEAlJHNpbV9pZ2VuX3NtcCVnCitzJUBzaW1faG9zdGJpdHNpemVAJSRzaW1faG9zdGJpdHNpemUlZworcyVAc2ltX2VudkAlJHNpbV9lbnYlZworcyVAc2ltX3RpbWViYXNlQCUkc2ltX3RpbWViYXNlJWcKK3MlQHNpbV90cmFjZUAlJHNpbV90cmFjZSVnCitzJUBzaW1fcmVzZXJ2ZWRAJSRzaW1fcmVzZXJ2ZWQlZworcyVAc2ltX21vbml0b3JAJSRzaW1fbW9uaXRvciVnCitzJUBzaW1fbW9kZWxAJSRzaW1fbW9kZWwlZworcyVAc2ltX21vZGVsX2lzc3VlQCUkc2ltX21vZGVsX2lzc3VlJWcKK3MlQHNpbV9zdGRpb0AlJHNpbV9zdGRpbyVnCitzJUBzaW1fdGVybWlvQCUkc2ltX3Rlcm1pbyVnCitzJUBzaW1fZGV2emVyb0AlJHNpbV9kZXZ6ZXJvJWcKK3MlQHNpbV9jYWxsYmFja0AlJHNpbV9jYWxsYmFjayVnCitzJUBzaW1fdGFyZ192YWxzQCUkc2ltX3RhcmdfdmFscyVnCisKK0NFT0YKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KK2FjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCithY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19tb3JlX2xpbmVzPToKK2FjX3NlZF9jbWRzPSIiCit3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBmaQorICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCisgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZWxzZQorICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZmkKKyAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKyAgICBhY19iZWc9JGFjX2VuZAorICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgYWNfc2VkX2NtZHM9Y2F0CitmaQorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitDT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKyAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCisgIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCitzJUBJTlNUQUxMQCUkSU5TVEFMTCVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKKyMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyMKKyMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KK2FjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJworYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCithY19kQz0nXDMnCithY19kRD0nJWcnCisjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKK2FjX3VDPScgJworYWNfdUQ9J1w0JWcnCisjIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY19lQj0nJCVcMSNcMmRlZmluZVwzJworYWNfZUM9JyAnCithY19lRD0nJWcnCisKK2lmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmaQorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQorCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0CisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgorCitFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKKyMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKK2NhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKK3MvW1xcJiVdL1xcJi9nCitzJVtcXCRgXSVcXCYlZworcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKK3MlYWNfZCVhY191JWdwCitzJWFjX3UlYWNfZSVncAorRU9GCitzZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCitybSAtZiBjb25mdGVzdC5oZHIKKworIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgorIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCitjYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKK3MlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCitFT0YKKworIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCisjIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgorCitybSAtZiBjb25mdGVzdC50YWlsCit3aGlsZSA6CitkbworICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCisgICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KKyAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQorICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KKyAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCisnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAorICBybSAtZiBjb25mdGVzdC52YWxzCisgIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscworZG9uZQorcm0gLWYgY29uZnRlc3QudmFscworCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAorICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKKyAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCisgICAgcm0gLWYgY29uZnRlc3QuaAorICBlbHNlCisgICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBmaQorICAgIHJtIC1mICRhY19maWxlCisgICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQorICBmaQorZmk7IGRvbmUKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitjYXNlIHgkQ09ORklHX0hFQURFUlMgaW4geGNvbmZpZy5oOmNvbmZpZy5pbikgZWNobyA+IHN0YW1wLWggOzsgZXNhYworZXhpdCAwCitFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCitybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwordGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisKZGlmZiAtLWdpdCBhL3NpbS9wcGMvY29uZmlndXJlLmluIGIvc2ltL3BwYy9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU1MzBiNgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsNzQ1IEBACitkbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK3NpbmNsdWRlKC4uL2NvbW1vbi9hY2xvY2FsLm00KQorQUNfUFJFUkVRKDIuNSlkbmwKK0FDX0lOSVQoTWFrZWZpbGUuaW4pCisKK0FDX1BST0dfSU5TVEFMTAorQUNfUFJPR19DQworCisjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJworZWxzZQorICBDQ19GT1JfQlVJTEQ9Z2NjCitmaQorCitkbmwgV2UgZG9uJ3QgdXNlIGdldHRleHQsIGJ1dCBiZmQgZG9lcy4gIFNvIHdlIGRvIHRoZSBhcHByb3ByaWF0ZSBjaGVja3MKK2RubCB0byBzZWUgaWYgdGhlcmUgYXJlIGludGwgbGlicmFyaWVzIHdlIHNob3VsZCBsaW5rIGFnYWluc3QuCitBTExfTElOR1VBUz0KK0NZX0dOVV9HRVRURVhUCisKKworQUNfQVJHX0VOQUJMRShzaW0tYWxpZ25tZW50LAorWyAgLS1lbmFibGUtc2ltLWFsaWdubWVudD1hbGlnbgkJU3BlY2lmeSBzdHJpY3Qgb3Igbm9uc3RyaWN0IGFsaWdubWVudC5dLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzIHwgc3RyaWN0IHwgU1RSSUNUKQlzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPVNUUklDVF9BTElHTk1FTlQiOzsKKyAgbm8gfCBub25zdHJpY3QgfCBOT05TVFJJQ1QpCXNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9Tk9OU1RSSUNUX0FMSUdOTUVOVCI7OworICAwIHwgZGVmYXVsdCB8IERFRkFVTFQpCXNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9MCI7OworICAqKQkJCQlBQ19NU0dfRVJST1IoIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWFsaWdubWVudCIpOyBzaW1fYWxpZ25tZW50PSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYWxpZ25tZW50IiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBhbGlnbm1lbnQgZmxhZ3MgPSAkc2ltX2FsaWdubWVudCIgNj4mMQorZmldLFtzaW1fYWxpZ25tZW50PSIiXSlkbmwKKworCitBQ19BUkdfRU5BQkxFKHNpbS1hc3NlcnQsCitbICAtLWVuYWJsZS1zaW0tYXNzZXJ0CQkJU3BlY2lmeSB3aGV0aGVyIHRvIHBlcmZvcm0gcmFuZG9tIGFzc2VydGlvbnMuXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX2Fzc2VydD0iLURXSVRIX0FTU0VSVD0xIjs7CisgIG5vKQlzaW1fYXNzZXJ0PSItRFdJVEhfQVNTRVJUPTAiOzsKKyAgKikJQUNfTVNHX0VSUk9SKCItLWVuYWJsZS1zaW0tYXNzZXJ0IGRvZXMgbm90IHRha2UgYSB2YWx1ZSIpOyBzaW1fYXNzZXJ0PSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fYXNzZXJ0IiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBhc3NlcnQgZmxhZ3MgPSAkc2ltX2Fzc2VydCIgNj4mMQorZmldLFtzaW1fYXNzZXJ0PSIiXSlkbmwKKworCitBQ19BUkdfRU5BQkxFKHNpbS1iaXRzaXplLAorWyAgLS1lbmFibGUtc2ltLWJpdHNpemU9bgkJU3BlY2lmeSB0YXJnZXQgYml0c2l6ZSAoMzIgb3IgNjQpLl0sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICAzMnw2NCkgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPSRlbmFibGV2YWwiOzsKKyAgKikJIEFDX01TR19FUlJPUigiLS1lbmFibGUtc2ltLWJpdHNpemUgd2FzIGdpdmVuICRlbmFibGV2YWwuICBFeHBlY3RlZCAzMiBvciA2NCIpOyBzaW1fYml0c2l6ZT0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2JpdHNpemUiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGJpdHNpemUgZmxhZ3MgPSAkc2ltX2JpdHNpemUiIDY+JjEKK2ZpXSxbc2ltX2JpdHNpemU9IiJdKWRubAorCisKK0FDX0FSR19FTkFCTEUoc2ltLWJzd2FwLAorWyAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIHRoZSBCU1dBUCBpbnN0cnVjdGlvbiBvbiBJbnRlbCA0ODZzIGFuZCBQZW50aXVtcy5dLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0xIjs7CisgIG5vKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0wIjs7CisgICopCUFDX01TR19FUlJPUigiLS1lbmFibGUtc2ltLWJzd2FwIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIpOyBzaW1fYnN3YXA9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ic3dhcCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgYnN3YXAgZmxhZ3MgPSAkc2ltX2Jzd2FwIiA2PiYxCitmaV0sW3NpbV9ic3dhcD0iIl0pZG5sCisKKworQUNfQVJHX0VOQUJMRShzaW0tY2ZsYWdzLAorWyAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3JdLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fY2ZsYWdzPSItTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIiOzsKKyAgbm8pCXNpbV9jZmxhZ3M9IiI7OworICAqKQlzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQorZmldLFtzaW1fY2ZsYWdzPSIiXSlkbmwKKworCitBQ19BUkdfRU5BQkxFKHNpbS1jb25maWcsCitbICAtLWVuYWJsZS1zaW0tY29uZmlnPWZpbGUJCU92ZXJyaWRlIGRlZmF1bHQgY29uZmlnIGZpbGVdLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzfG5vKQlBQ19NU0dfRVJST1IoIk5vIHZhbHVlIHN1cHBsaWVkIGZvciAtLWVuYWJsZS1zaW0tY29uZmlnPWZpbGUiKTs7CisgICopCQlpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJHtlbmFibGV2YWx9IjsgdGhlbgorCQkgIHNpbV9jb25maWc9IiR7ZW5hYmxldmFsfSI7CisJCWVsaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyR7ZW5hYmxldmFsfS1jb25maWcuaCI7IHRoZW4KKwkJICBzaW1fY29uZmlnPSIke2VuYWJsZXZhbH0tY29uZmlnLmgiCisJCWVsc2UKKwkJICBBQ19NU0dfRVJST1IoIkNvbmZpZyBmaWxlICRlbmFibGV2YWwgd2FzIG5vdCBmb3VuZCIpOworCQkgIHNpbV9jb25maWc9c3RkLWNvbmZpZy5oCisJCWZpOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fY29uZmlnIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBjb25maWcgZmxhZ3MgPSAkc2ltX2NvbmZpZyIgNj4mMQorZmldLFtzaW1fY29uZmlnPSJzdGQtY29uZmlnLmgiCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgY29uZmlnIGZsYWdzID0gJHNpbV9jb25maWciIDY+JjEKK2ZpXSlkbmwKKworCitBQ19BUkdfRU5BQkxFKHNpbS1kZWNvZGUtbWVjaGFuaXNtLAorWyAgLS1lbmFibGUtc2ltLWRlY29kZS1tZWNoYW5pc209d2hpY2gJCVNwZWNpZnkgdGhlIGluc3RydWN0aW9uIGRlY29kZSBtZWNoYW5pc20uXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllc3xubykJQUNfTVNHX0VSUk9SKCJObyB2YWx1ZSBzdXBwbGllZCBmb3IgLS1lbmFibGUtc2ltLWRlY29kZS1tZWNoYW5pc209ZmlsZSIpOzsKKyAgYXJyYXl8c3dpdGNofHBhZGRlZC1zd2l0Y2h8Z290by1zd2l0Y2gpCXNpbV9kZWNvZGVfbWVjaGFuaXNtPSItVCAke2VuYWJsZXZhbH0iOzsKKyAgKikJCUFDX01TR19FUlJPUigiRmlsZSAkZW5hYmxldmFsIGlzIG5vdCBhbiBvcGNvZGUgcnVsZXMgZmlsZSIpOworCQlzaW1fZGVjb2RlX21lY2hhbmlzbT0ic3dpdGNoIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2RlY29kZV9tZWNoYW5pc20iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGRlY29kZSBtZWNoYW5pc20gZmxhZ3MgPSAkc2ltX2RlY29kZV9tZWNoYW5pc20iIDY+JjEKK2ZpXSxbc2ltX2RlY29kZV9tZWNoYW5pc209IiIKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBkZWNvZGUgbWVjaGFuaXNtIGZsYWdzID0gJHNpbV9kZWNvZGVfbWVjaGFuaXNtIgorZmldKWRubAorCisKK0FDX0FSR19FTkFCTEUoc2ltLWRlZmF1bHQtbW9kZWwsCitbICAtLWVuYWJsZS1zaW0tZGVmYXVsdC1tb2RlbD13aGljaAlTcGVjaWZ5IGRlZmF1bHQgUG93ZXJQQyB0byBtb2RlbC5dLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzfG5vKQlBQ19NU0dfRVJST1IoIk5vIHZhbHVlIHN1cHBsaWVkIGZvciAtLWVuYWJsZS1zaW0tZGVmYXVsdC1tb2RlbD1tb2RlbCIpOzsKKyAgKikJCXNpbV9kZWZhdWx0X21vZGVsPSItRFdJVEhfREVGQVVMVF9NT0RFTD0ke2VuYWJsZXZhbH0iOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVmYXVsdF9tb2RlbCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgZGVmYXVsdC1tb2RlbCBmbGFncyA9ICRzaW1fZGVmYXVsdF9tb2RlbCIgNj4mMQorZmldLFtzaW1fZGVmYXVsdF9tb2RlbD0iIl0pZG5sCisKKworQUNfQVJHX0VOQUJMRShzaW0tZHVwbGljYXRlLAorWyAgLS1lbmFibGUtc2ltLWR1cGxpY2F0ZQkJRXhwYW5kIChkdXBsaWNhdGUpIHNlbWFudGljIGZ1bmN0aW9ucy5dLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fZHVwPSItRSI7OworICBubykJc2ltX2R1cD0iIjs7CisgICopCUFDX01TR19FUlJPUigiLS1lbmFibGUtc2ltLWR1cGxpY2F0ZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiKTsgc2ltX2R1cD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2R1cCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgZHVwbGljYXRlIGZsYWdzID0gJHNpbV9kdXAiIDY+JjEKK2ZpXSxbc2ltX2R1cD0iLUUiCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgZHVwbGljYXRlIGZsYWdzID0gJHNpbV9kdXAiIDY+JjEKK2ZpXSlkbmwKKworCitBQ19BUkdfRU5BQkxFKHNpbS1lbmRpYW4sCitbICAtLWVuYWJsZS1zaW0tZW5kaWFuPWVuZGlhbgkJU3BlY2lmeSB0YXJnZXQgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJY2FzZSAiJHRhcmdldCIgaW4KKwkgICpwb3dlcnBjLSopIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj1CSUdfRU5ESUFOIjs7CisJICAqcG93ZXJwY2xlLSopIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIjs7CisJICAqKSBlY2hvICJVbmtub3duIHRhcmdldCAkdGFyZ2V0IiAxPiY2OyBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9MCI7OworCWVzYWM7OworICBubykJIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj0wIjs7CisgIGIqfEIqKSBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9QklHX0VORElBTiI7OworICBsKnxMKikgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iOzsKKyAgKikJIEFDX01TR19FUlJPUigiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0tZW5kaWFuIik7IHNpbV9lbmRpYW49IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9lbmRpYW4iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGVuZGlhbiBmbGFncyA9ICRzaW1fZW5kaWFuIiA2PiYxCitmaV0sW3NpbV9lbmRpYW49IiJdKWRubAorCisKK0FDX0FSR19FTkFCTEUoc2ltLWVudiwKK1sgIC0tZW5hYmxlLXNpbS1lbnY9ZW52CQkJU3BlY2lmeSB0YXJnZXQgZW52aXJvbm1lbnQgKG9wZXJhdGluZywgdmlydHVhbCwgdXNlcikuXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIG9wZXJhdGluZyB8IG9zIHwgb2VhKQlzaW1fZW52PSItRFdJVEhfRU5WSVJPTk1FTlQ9T1BFUkFUSU5HX0VOVklST05NRU5UIjs7CisgIHZpcnR1YWwgfCB2ZWEpCXNpbV9lbnY9Ii1EV0lUSF9FTlZJUk9OTUVOVD1WSVJUVUFMX0VOVklST05NRU5UIjs7CisgIHVzZXIgfCB1ZWEpCQlzaW1fZW52PSItRFdJVEhfRU5WSVJPTk1FTlQ9VVNFUl9FTlZJUk9OTUVOVCI7OworICBubykJCQlzaW1fZW52PSItRFdJVEhfRU5WSVJPTk1FTlQ9MCI7OworICAqKQkJCUFDX01TR19FUlJPUigiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tZW52Iik7IHNpbV9lbnY9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9lbnYiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGVudiBmbGFncyA9ICRzaW1fZW52IiA2PiYxCitmaV0sW3NpbV9lbnY9IiJdKWRubAorCisKK0FDX0FSR19FTkFCTEUoc2ltLWZpbHRlciwKK1sgIC0tZW5hYmxlLXNpbS1maWx0ZXI9cnVsZQkJU3BlY2lmeSBmaWx0ZXIgcnVsZXMuXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJQUNfTVNHX0VSUk9SKCItLWVuYWJsZS1zaW0tZmlsdGVyIG11c3QgYmUgc3BlY2lmaWVkIHdpdGggYSBydWxlIHRvIGZpbHRlciBvciBubyIpOyBzaW1fZmlsdGVyPSIiOzsKKyAgbm8pCXNpbV9maWx0ZXI9IiI7OworICAqKQlzaW1fZmlsdGVyPSItRiAkZW5hYmxldmFsIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2ZpbHRlciIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgZmlsdGVyIGZsYWdzID0gJHNpbV9maWx0ZXIiIDY+JjEKK2ZpXSxbc2ltX2ZpbHRlcj0iLUYgMzIsZixvIgoraWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGZpbHRlciBmbGFncyA9ICRzaW1fZmlsdGVyIiA2PiYxCitmaV0pZG5sCisKKworQUNfQVJHX0VOQUJMRShzaW0tZmxvYXQsCitbICAtLWVuYWJsZS1zaW0tZmxvYXQJCQlTcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIGhvc3QgZmxvYXRpbmcgcG9pbnQgb3Igc2ltdWxhdGUuXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcyB8IGhhcmQpCXNpbV9mbG9hdD0iLURXSVRIX0ZMT0FUSU5HX1BPSU5UPUhBUkRfRkxPQVRJTkdfUE9JTlQiOzsKKyAgbm8gfCBzb2Z0KQlzaW1fZmxvYXQ9Ii1EV0lUSF9GTE9BVElOR19QT0lOVD1TT0ZUX0ZMT0FUSU5HX1BPSU5UIjs7CisgICopCQlBQ19NU0dfRVJST1IoIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWZsb2F0Iik7IHNpbV9mbG9hdD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Zsb2F0IiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBmbG9hdCBmbGFncyA9ICRzaW1fZmxvYXQiIDY+JjEKK2ZpXSxbc2ltX2Zsb2F0PSIiXSlkbmwKKworCitBQ19BUkdfRU5BQkxFKHNpbS1oYXJkd2FyZSwKK1sgIC0tZW5hYmxlLXNpbS1oYXJkd2FyZT1saXN0CQlTcGVjaWZ5IHRoZSBoYXJkd2FyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuXSwKK1toYXJkd2FyZT0iY3B1LG1lbW9yeSxudnJhbSxpb2J1cyxodGFiLGRpc2ssdHJhY2UscmVnaXN0ZXIsdm0saW5pdCxjb3JlLHBhbCxjb20sZWVwcm9tLG9waWMsZ2x1ZSxwaGIsaWRlIgorY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCTs7CisgIG5vKQlBQ19NU0dfRVJST1IoIkxpc3Qgb2YgaGFyZHdhcmUgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIC0tZW5hYmxlLXNpbS1oYXJkd2FyZSIpOyBoYXJkd2FyZT0iIjs7CisgICwqKSAgIGhhcmR3YXJlPSIke2hhcmR3YXJlfSR7ZW5hYmxldmFsfSI7OworICAqLCkgICBoYXJkd2FyZT0iJHtlbmFibGV2YWx9JHtoYXJkd2FyZX0iOzsKKyAgKikJaGFyZHdhcmU9IiR7ZW5hYmxldmFsfSInJzs7Citlc2FjCitzaW1faHdfc3JjPWBlY2hvICRoYXJkd2FyZSB8IHNlZCAtZSAncy8sLy5jIGh3Xy9nJyAtZSAncy9eL2h3Xy8nIC1lIHMnLyQvLmMvJ2AKK3NpbV9od19vYmo9YGVjaG8gJHNpbV9od19zcmMgfCBzZWQgLWUgJ3MvXC5jLy5vL2cnYAoraWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJGhhcmR3YXJlIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBoYXJkd2FyZSB0byAkc2ltX2h3X3NyYywgJHNpbV9od19vYmoiCitmaV0sW2hhcmR3YXJlPSJjcHUsbWVtb3J5LG52cmFtLGlvYnVzLGh0YWIsZGlzayx0cmFjZSxyZWdpc3Rlcix2bSxpbml0LGNvcmUscGFsLGNvbSxlZXByb20sb3BpYyxnbHVlLHBoYixpZGUiCitzaW1faHdfc3JjPWBlY2hvICRoYXJkd2FyZSB8IHNlZCAtZSAncy8sLy5jIGh3Xy9nJyAtZSAncy9eL2h3Xy8nIC1lIHMnLyQvLmMvJ2AKK3NpbV9od19vYmo9YGVjaG8gJHNpbV9od19zcmMgfCBzZWQgLWUgJ3MvXC5jLy5vL2cnYAoraWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGhhcmR3YXJlIHRvICRzaW1faHdfc3JjLCAkc2ltX2h3X29iaiIKK2ZpXSlkbmwKKworCitBQ19BUkdfRU5BQkxFKHNpbS1ob3N0Yml0c2l6ZSwKK1sgIC0tZW5hYmxlLXNpbS1ob3N0Yml0c2l6ZT0zMnw2NAlTcGVjaWZ5IGhvc3QgYml0c2l6ZSAoMzIgb3IgNjQpLl0sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICAzMnw2NCkgc2ltX2hvc3RiaXRzaXplPSItRFdJVEhfSE9TVF9XT1JEX0JJVFNJWkU9JGVuYWJsZXZhbCI7OworICAqKQkgQUNfTVNHX0VSUk9SKCItLWVuYWJsZS1zaW0taG9zdGJpdHNpemUgd2FzIGdpdmVuICRlbmFibGV2YWwuICBFeHBlY3RlZCAzMiBvciA2NCIpOyBzaW1faG9zdGJpdHNpemU9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ob3N0Yml0c2l6ZSIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgaG9zdGJpdHNpemUgZmxhZ3MgPSAkc2ltX2hvc3RiaXRzaXplIiA2PiYxCitmaV0sW3NpbV9ob3N0Yml0c2l6ZT0iIl0pZG5sCisKKworQUNfQVJHX0VOQUJMRShzaW0taG9zdGVuZGlhbiwKK1sgIC0tZW5hYmxlLXNpbS1ob3N0ZW5kaWFuPWVuZAkJU3BlY2lmeSBob3N0IGJ5dGUgZW5kaWFuIG9yaWVudGF0aW9uLl0sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICBubykJIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPTAiOzsKKyAgYip8QiopIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUJJR19FTkRJQU4iOzsKKyAgbCp8TCopIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iOzsKKyAgKikJIEFDX01TR19FUlJPUigiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIGZvciAtLWVuYWJsZS1zaW0taG9zdGVuZGlhbiIpOyBzaW1faG9zdGVuZGlhbj0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2hvc3RlbmRpYW4iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGhvc3RlbmRpYW4gZmxhZ3MgPSAkc2ltX2hvc3RlbmRpYW4iIDY+JjEKK2ZpXSxbCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICBBQ19DX0JJR0VORElBTgorICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHllczsgdGhlbgorICAgIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUJJR19FTkRJQU4iCisgIGVsc2UKKyAgICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIgorICBmaQorZWxzZQorICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj0wIgorZmldKWRubAorCisKK0FDX0FSR19FTkFCTEUoc2ltLWljYWNoZSwKK1sgIC0tZW5hYmxlLXNpbS1pY2FjaGU9c2l6ZQkJU3BlY2lmeSBpbnN0cnVjdGlvbi1kZWNvZGUgY2FjaGUgc2l6ZSBhbmQgdHlwZS5dLAorW2ljYWNoZT0iLVIiCisgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCQlpY2FjaGU9IjEwMjQiOyBzaW1faWNhY2hlPSItSSAkaWNhY2hlIjs7CisgIG5vKQkJc2ltX2ljYWNoZT0iLVIiOzsKKyAgKikgaWNhY2hlPTEwMjQKKyAgICAgc2ltX2ljYWNoZT0iLSIKKyAgICAgZm9yIHggaW4gYGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKyAgICAgICBjYXNlICIkeCIgaW4KKyAgICAgICAgIGRlZmluZSkJc2ltX2ljYWNoZT0iJHtzaW1faWNhY2hlfVIiOzsKKyAgICAgICAgIHNlbWFudGljKQlzaW1faWNhY2hlPSIke3NpbV9pY2FjaGV9QyI7OworCSBpbnNuKQkJc2ltX2ljYWNoZT0iJHtzaW1faWNhY2hlfVMiOzsKKwkgMCp8MSp8Mip8Myp8NCp8NSp8Nip8Nyp8OCp8OSopCWljYWNoZT0keDs7CisgICAgICAgICAqKQkJQUNfTVNHX0VSUk9SKCJVbmtub3duIHZhbHVlICR4IGZvciAtLWVuYWJsZS1zaW0taWNhY2hlIik7IHNpbV9pY2FjaGU9IiI7OworICAgICAgIGVzYWMKKyAgICAgZG9uZQorICAgICBzaW1faWNhY2hlPSIke3NpbV9pY2FjaGV9SSAkaWNhY2hlIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkaWNhY2hlIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBpbnN0cnVjdGlvbiBjYWNoZSBzaXplIHRvICRpY2FjaGUgKCRzaW1faWNhY2hlKSIKK2ZpXSxbc2ltX2ljYWNoZT0iLUNTUkkgMTAyNCIKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBpbnN0cnVjdGlvbiBjYWNoZSBzaXplIHRvIDEwMjQgKCRzaW1faWNhY2hlKSIKK2ZpXSlkbmwKKworCitBQ19BUkdfRU5BQkxFKHNpbS1pbmxpbmUsCitbICAtLWVuYWJsZS1zaW0taW5saW5lPWlubGluZXMJCVNwZWNpZnkgd2hpY2ggZnVuY3Rpb25zIHNob3VsZCBiZSBpbmxpbmVkLl0sCitbc2ltX2lubGluZT0iIgorY2FzZSAiJGVuYWJsZXZhbCIgaW4KKyAgbm8pCQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiOzsKKyAgMCkJCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCI7OworICB5ZXMgfCAyKQlzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPUFMTF9JTkxJTkUiOzsKKyAgMSkJCXNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9SU5MSU5FX0xPQ0FMUyI7OworICAqKSBmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKyAgICAgICBuZXdfZmxhZz0iIgorICAgICAgIGNhc2UgIiR4IiBpbgorCSAqX0lOTElORT0qKQluZXdfZmxhZz0iLUQkeCI7OworCSAqPSopCQluZXdfZmxhZz1gZWNobyAiJHgiIHwgc2VkIC1lICJzLz0vX0lOTElORT0vIiAtZSAicy9eLy1ELyJgOzsKKwkgKl9JTkxJTkUpCW5ld19mbGFnPSItRCR4PUFMTF9JTkxJTkUiOzsKKwkgKikJCW5ld19mbGFnPSItRCR4IiJfSU5MSU5FPUFMTF9JTkxJTkUiOzsKKyAgICAgICBlc2FjCisgICAgICAgaWYgdGVzdCB4IiRzaW1faW5saW5lIiA9IHgiIjsgdGhlbgorCSBzaW1faW5saW5lPSIkbmV3X2ZsYWciCisgICAgICAgZWxzZQorCSBzaW1faW5saW5lPSIkc2ltX2lubGluZSAkbmV3X2ZsYWciCisgICAgICAgZmkKKyAgICAgZG9uZTs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2lubGluZSIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgaW5saW5lIGZsYWdzID0gJHNpbV9pbmxpbmUiIDY+JjEKK2ZpXSxbaWYgdGVzdCB4IiRHQ0MiICE9ICIiOyB0aGVuCisgIHNpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9SU5MSU5FX0xPQ0FMUyIKKyAgaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgorICAgIGVjaG8gIlNldHRpbmcgaW5saW5lIGZsYWdzID0gJHNpbV9pbmxpbmUiIDY+JjEKKyAgZmkKK2Vsc2UKKyAgc2ltX2lubGluZT0iIgorZmldKWRubAorCisKK0FDX0FSR19FTkFCTEUoc2ltLWp1bXAsCitbICAtLWVuYWJsZS1zaW0tanVtcAkJSnVtcCBiZXR3ZWVuIHNlbWFudGljIGNvZGUgKGluc3RlYWQgb2YgY2FsbC9yZXR1cm4pLl0sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9qdW1wPSItSiI7OworICBubykJc2ltX2p1bXA9IiI7OworICAqKQlBQ19NU0dfRVJST1IoIi0tZW5hYmxlLXNpbS1qdW1wIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIpOyBzaW1fanVtcD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2p1bXAiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGp1bXAgZmxhZyA9ICRzaW1fanVtcCIgNj4mMQorZmldLFtzaW1fanVtcD0iIgoraWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGp1bXAgZmxhZyA9ICRzaW1fanVtcCIgNj4mMQorZmldKWRubAorCisKK0FDX0FSR19FTkFCTEUoc2ltLWxpbmUtbnIsCitbICAtLWVuYWJsZS1zaW0tbGluZS1ucj1vcHRzCQlHZW5lcmF0ZSBleHRyYSBDUFAgY29kZSB0aGF0IHJlZmVyZW5jZXMgc291cmNlIHJhdGhlciB0aGFuIGdlbmVyYXRlZCBjb2RlXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX2xpbmVfbnI9IiI7OworICBubykJc2ltX2xpbmVfbnI9Ii1MIjs7CisgICopCUFDX01TR19FUlJPUigiLS1lbmFibGUtc2ltLWxpbmUtbnIgZG9lcyBub3QgdGFrZSBhIHZhbHVlIik7IHNpbV9saW5lX25yPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fbGluZV9uciIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgd2FybmluZyBmbGFncyA9ICRzaW1fbGluZV9uciIgNj4mMQorZmldLFtzaW1fbGluZV9ucj0iIl0pZG5sCisKKworQUNfQVJHX0VOQUJMRShzaW0tbW9kZWwsCitbICAtLWVuYWJsZS1zaW0tbW9kZWw9d2hpY2gJCVNwZWNpZnkgUG93ZXJQQyB0byBtb2RlbC5dLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzfG5vKQlBQ19NU0dfRVJST1IoIk5vIHZhbHVlIHN1cHBsaWVkIGZvciAtLWVuYWJsZS1zaW0tbW9kZWw9bW9kZWwiKTs7CisgICopCQlzaW1fbW9kZWw9Ii1EV0lUSF9NT0RFTD0ke2VuYWJsZXZhbH0iOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fbW9kZWwiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIG1vZGVsIGZsYWdzID0gJHNpbV9tb2RlbCIgNj4mMQorZmldLFtzaW1fbW9kZWw9IiJdKWRubAorCisKK0FDX0FSR19FTkFCTEUoc2ltLW1vZGVsLWlzc3VlLAorWyAgLS1lbmFibGUtc2ltLW1vZGVsLWlzc3VlCQlTcGVjaWZ5IHdoZXRoZXIgdG8gc2ltdWxhdGUgbW9kZWwgc3BlY2lmaWMgYWN0aW9uc10sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9tb2RlbF9pc3N1ZT0iLURXSVRIX01PREVMX0lTU1VFPU1PREVMX0lTU1VFX1BST0NFU1MiOzsKKyAgbm8pCXNpbV9tb2RlbF9pc3N1ZT0iLURXSVRIX01PREVMX0lTU1VFPU1PREVMX0lTU1VFX0lHTk9SRSI7OworICAqKQlBQ19NU0dfRVJST1IoIi0tZW5hYmxlLXNpbS1tb2RlbC1pc3N1ZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiKTsgc2ltX21vZGVsX2lzc3VlPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBtb2RlbC1pc3N1ZSBmbGFncyA9ICRzaW1fbW9kZWxfaXNzdWUiIDY+JjEKK2ZpXSxbc2ltX21vZGVsX2lzc3VlPSIiXSlkbmwKKworCitBQ19BUkdfRU5BQkxFKHNpbS1tb25pdG9yLAorWyAgLS1lbmFibGUtc2ltLW1vbml0b3I9bW9uCQlTcGVjaWZ5IHdoZXRoZXIgdG8gZW5hYmxlIG1vbml0b3JpbmcgZXZlbnRzLl0sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCQlzaW1fbW9uaXRvcj0iLURXSVRIX01PTj0nTU9OSVRPUl9JTlNUUlVDVElPTl9JU1NVRSB8IE1PTklUT1JfTE9BRF9TVE9SRV9VTklUJyI7OworICBubykJCXNpbV9tb25pdG9yPSItRFdJVEhfTU9OPTAiOzsKKyAgaW5zdHJ1Y3Rpb24pCXNpbV9tb25pdG9yPSItRFdJVEhfTU9OPU1PTklUT1JfSU5TVFJVQ1RJT05fSVNTVUUiOzsKKyAgbWVtb3J5KQlzaW1fbW9uaXRvcj0iLURXSVRIX01PTj1NT05JVE9SX0xPQURfU1RPUkVfVU5JVCI7OworICAqKQkJQUNfTVNHX0VSUk9SKCJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1tb24iKTsgc2ltX2Vudj0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX21vbml0b3IiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIG1vbml0b3IgZmxhZ3MgPSAkc2ltX21vbml0b3IiIDY+JjEKK2ZpXSxbc2ltX21vbml0b3I9IiJdKWRubAorCisKK0FDX0FSR19FTkFCTEUoc2ltLW9wY29kZSwKK1sgIC0tZW5hYmxlLXNpbS1vcGNvZGU9d2hpY2gJCU92ZXJyaWRlIGRlZmF1bHQgb3Bjb2RlIGxvb2t1cC5dLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzfG5vKQlBQ19NU0dfRVJST1IoIk5vIHZhbHVlIHN1cHBsaWVkIGZvciAtLWVuYWJsZS1zaW0tb3Bjb2RlPWZpbGUiKTs7CisgICopCQlpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJHtlbmFibGV2YWx9IjsgdGhlbgorCQkgIHNpbV9vcGNvZGU9IiR7ZW5hYmxldmFsfSIKKwkJZWxpZiB0ZXN0IC1mICIke3NyY2Rpcn0vZGMtJHtlbmFibGV2YWx9IjsgdGhlbgorCQkgIHNpbV9vcGNvZGU9ImRjLSR7ZW5hYmxldmFsfSIKKwkJZWxzZQorCQkgIEFDX01TR19FUlJPUigiRmlsZSAkZW5hYmxldmFsIGlzIG5vdCBhbiBvcGNvZGUgcnVsZXMgZmlsZSIpOworCQkgIHNpbV9vcGNvZGU9ImRjLWNvbXBsZXgiCisJCWZpOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fb3Bjb2RlIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBvcGNvZGUgZmxhZ3MgPSAkc2ltX29wY29kZSIgNj4mMQorZmldLFtzaW1fb3Bjb2RlPSJkYy1jb21wbGV4IgoraWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIG9wY29kZSBmbGFncyA9ICRzaW1fb3Bjb2RlIgorZmldKWRubAorCisKK0FDX0FSR19FTkFCTEUoc2ltLXBhY2thZ2VzLAorWyAgLS1lbmFibGUtc2ltLXBhY2thZ2VzPWxpc3QJCVNwZWNpZnkgdGhlIHBhY2thZ2VzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBidWlsZC5dLAorW3BhY2thZ2VzPWRpc2tsYWJlbAorY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCTs7CisgIG5vKQlBQ19NU0dfRVJST1IoIkxpc3Qgb2YgcGFja2FnZXMgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIC0tZW5hYmxlLXNpbS1wYWNrYWdlcyIpOyBwYWNrYWdlcz0iIjs7CisgICwqKSAgIHBhY2thZ2VzPSIke3BhY2thZ2VzfSR7ZW5hYmxldmFsfSI7OworICAqLCkgICBwYWNrYWdlcz0iJHtlbmFibGV2YWx9JHtwYWNrYWdlc30iOzsKKyAgKikJcGFja2FnZXM9IiR7ZW5hYmxldmFsfSInJzs7Citlc2FjCitzaW1fcGtfc3JjPWBlY2hvICRwYWNrYWdlcyB8IHNlZCAtZSAncy8sLy5jIHBrXy9nJyAtZSAncy9eL3BrXy8nIC1lICdzLyQvLmMvJ2AKK3NpbV9wa19vYmo9YGVjaG8gJHNpbV9wa19zcmMgfCBzZWQgLWUgJ3MvXC5jLy5vL2cnYAoraWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHBhY2thZ2VzIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBwYWNrYWdlcyB0byAkc2ltX3BrX3NyYywgJHNpbV9wa19vYmoiCitmaV0sW3BhY2thZ2VzPWRpc2tsYWJlbAorc2ltX3BrX3NyYz1gZWNobyAkcGFja2FnZXMgfCBzZWQgLWUgJ3MvLC8uYyBwa18vZycgLWUgJ3MvXi9wa18vJyAtZSAncy8kLy5jLydgCitzaW1fcGtfb2JqPWBlY2hvICRzaW1fcGtfc3JjIHwgc2VkIC1lICdzL1wuYy8uby9nJ2AKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBwYWNrYWdlcyB0byAkc2ltX3BrX3NyYywgJHNpbV9wa19vYmoiCitmaV0pZG5sCisKKworQUNfQVJHX0VOQUJMRShzaW0tcmVncGFybSwKK1sgIC0tZW5hYmxlLXNpbS1yZWdwYXJtPW5yLXBhcm0JCVBhc3MgcGFyYW1ldGVycyBpbiByZWdpc3RlcnMgaW5zdGVhZCBvZiBvbiB0aGUgc3RhY2sgLSB4ODYvR0NDIHNwZWNpZmljLl0sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICAwKnwxKnwyKnwzKnw0Knw1Knw2Knw3Knw4Knw5Kikgc2ltX3JlZ3Bhcm09Ii1EV0lUSF9SRUdQQVJNPSR7ZW5hYmxldmFsfSI7OworICBubykgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltX3JlZ3Bhcm09IiIgOzsKKyAgeWVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbV9yZWdwYXJtPSItRFdJVEhfUkVHUEFSTT0zIjs7CisgICopICAgQUNfTVNHX0VSUk9SKCJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1yZWdwYXJtIik7IHNpbV9yZWdwYXJtPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcmVncGFybSIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgcmVncGFybSBmbGFncyA9ICRzaW1fcmVncGFybSIgNj4mMQorZmldLFtzaW1fcmVncGFybT0iIl0pZG5sCisKKworQUNfQVJHX0VOQUJMRShzaW0tcmVzZXJ2ZWQtYml0cywKK1sgIC0tZW5hYmxlLXNpbS1yZXNlcnZlZC1iaXRzCQlTcGVjaWZ5IHdoZXRoZXIgdG8gY2hlY2sgcmVzZXJ2ZWQgYml0cyBpbiBpbnN0cnVjdGlvbi5dLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fcmVzZXJ2ZWQ9Ii1EV0lUSF9SRVNFUlZFRF9CSVRTPTEiOzsKKyAgbm8pCXNpbV9yZXNlcnZlZD0iLURXSVRIX1JFU0VSVkVEX0JJVFM9MCI7OworICAqKQlBQ19NU0dfRVJST1IoIi0tZW5hYmxlLXNpbS1yZXNlcnZlZC1iaXRzIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIpOyBzaW1fcmVzZXJ2ZWQ9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9yZXNlcnZlZCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgcmVzZXJ2ZWQgZmxhZ3MgPSAkc2ltX3Jlc2VydmVkIiA2PiYxCitmaV0sW3NpbV9yZXNlcnZlZD0iIl0pZG5sCisKKworQUNfQVJHX0VOQUJMRShzaW0tc21wLAorWyAgLS1lbmFibGUtc2ltLXNtcD1uCQkJU3BlY2lmeSBudW1iZXIgb2YgcHJvY2Vzc29ycyB0byBjb25maWd1cmUgZm9yLl0sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9zbXA9Ii1EV0lUSF9TTVA9NSIgOyBzaW1faWdlbl9zbXA9Ii1OIDUiOzsKKyAgbm8pCXNpbV9zbXA9Ii1EV0lUSF9TTVA9MCIgOyBzaW1faWdlbl9zbXA9Ii1OIDAiOzsKKyAgKikJc2ltX3NtcD0iLURXSVRIX1NNUD0kZW5hYmxldmFsIiA7IHNpbV9pZ2VuX3NtcD0iLU4gJGVuYWJsZXZhbCI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9zbXAiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNtcCBmbGFncyA9ICRzaW1fc21wIiA2PiYxCitmaV0sW3NpbV9zbXA9Ii1EV0lUSF9TTVA9NSIgOyBzaW1faWdlbl9zbXA9Ii1OIDUiCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc21wIGZsYWdzID0gJHNpbV9zbXAiIDY+JjEKK2ZpXSlkbmwKKworCitBQ19BUkdfRU5BQkxFKHNpbS1zdGRjYWxsLAorWyAgLS1lbmFibGUtc2ltLXN0ZGNhbGw9dHlwZQkJVXNlIGFuIGFsdGVybmF0aXZlIGZ1bmN0aW9uIGNhbGwvcmV0dXJuIG1lY2hhbmlzbSAtIHg4Ni9HQ0Mgc3BlY2lmaWMuXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIG5vKQkJc2ltX3N0ZGNhbGw9IiIgOzsKKyAgc3RkKikJCXNpbV9zdGRjYWxsPSItRFdJVEhfU1REQ0FMTD0xIjs7CisgIHllcykJCXNpbV9zdGRjYWxsPSItRFdJVEhfU1REQ0FMTD0xIjs7CisgICopICAgQUNfTVNHX0VSUk9SKCJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1zdGRjYWxsIik7IHNpbV9zdGRjYWxsPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkY2FsbCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgZnVuY3Rpb24gY2FsbCBmbGFncyA9ICRzaW1fc3RkY2FsbCIgNj4mMQorZmldLFtzaW1fc3RkY2FsbD0iIl0pZG5sCisKKworQUNfQVJHX0VOQUJMRShzaW0tc3RkaW8sCitbICAtLWVuYWJsZS1zaW0tc3RkaW8JCQlTcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIHN0ZGlvIGZvciBjb25zb2xlIGlucHV0L291dHB1dC5dLAorW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET19VU0VfU1RESU8iOzsKKyAgbm8pCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPTlRfVVNFX1NURElPIjs7CisgICopCUFDX01TR19FUlJPUigiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tc3RkaW8iKTsgc2ltX3N0ZGlvPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkaW8iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHN0ZGlvIGZsYWdzID0gJHNpbV9zdGRpbyIgNj4mMQorZmldLFtzaW1fc3RkaW89IiJdKWRubAorCisKK0FDX0FSR19FTkFCTEUoc2ltLXN3aXRjaCwKK1sgIC0tZW5hYmxlLXNpbS1zd2l0Y2gJCQlVc2UgYSBzd2l0Y2ggaW5zdGVhZCBvZiBhIHRhYmxlIGZvciBpbnN0cnVjdGlvbiBjYWxsLl0sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9zd2l0Y2g9Ii1zIjs7CisgIG5vKQlzaW1fc3dpdGNoPSIiOzsKKyAgKikJQUNfTVNHX0VSUk9SKCItLWVuYWJsZS1zaW0tc3dpdGNoIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIpOyBzaW1fc3dpdGNoPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3dpdGNoIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzd2l0Y2ggZmxhZ3MgPSAkc2ltX3N3aXRjaCIgNj4mMQorZmldLFtzaW1fc3dpdGNoPSIiOworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHN3aXRjaCBmbGFncyA9ICRzaW1fc3dpdGNoIiA2PiYxCitmaV0pZG5sCisKKworQUNfQVJHX0VOQUJMRShzaW0tdGltZWJhc2UsCitbICAtLWVuYWJsZS1zaW0tdGltZWJhc2UJCQlTcGVjaWZ5IHdoZXRoZXIgdGhlIFBQQyB0aW1lYmFzZSBpcyBzdXBwb3J0ZWQuXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3RpbWViYXNlPSItRFdJVEhfVElNRV9CQVNFPTEiOzsKKyAgbm8pCXNpbV90aW1lYmFzZT0iLURXSVRIX1RJTUVfQkFTRT0wIjs7CisgICopCUFDX01TR19FUlJPUigiLS1lbmFibGUtc2ltLXRpbWViYXNlIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIpOyBzaW1fdGltZWJhc2U9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV90aW1lYmFzZSIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgdGltZWJhc2UgZmxhZ3MgPSAkc2ltX3RpbWViYXNlIiA2PiYxCitmaV0sW3NpbV90aW1lYmFzZT0iIl0pZG5sCisKKworQUNfQVJHX0VOQUJMRShzaW0tdHJhY2UsCitbICAtLWVuYWJsZS1zaW0tdHJhY2UJCQlTcGVjaWZ5IHdoZXRoZXIgdHJhY2luZyBpcyBzdXBwb3J0ZWQuXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9MSI7OworICBubykJc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9MCI7OworICAqKQlBQ19NU0dfRVJST1IoIi0tZW5hYmxlLXNpbS10cmFjZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiKTsgc2ltX3RyYWNlPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHRyYWNlIGZsYWdzID0gJHNpbV90cmFjZSIgNj4mMQorZmldLFtzaW1fdHJhY2U9IiJdKWRubAorCisKK0FDX0FSR19FTkFCTEUoc2ltLXdhcm5pbmdzLAorWyAgLS1lbmFibGUtc2ltLXdhcm5pbmdzPW9wdHMJCUV4dHJhIENGTEFHUyBmb3IgdHVybmluZyBvbiBjb21waWxlciB3YXJuaW5ncyBleGNlcHQgZm9yIGlkZWNvZGUubywgc2VtYW50aWNzLm8gYW5kIHBzaW0ub10sCitbY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV93YXJuaW5ncz0iLVdlcnJvciAtV2FsbCAtV3BvaW50ZXItYXJpdGggLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAiOzsKKyAgbm8pCXNpbV93YXJuaW5ncz0iLXciOzsKKyAgKikJc2ltX3dhcm5pbmdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV93YXJuaW5ncyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgd2FybmluZyBmbGFncyA9ICRzaW1fd2FybmluZ3MiIDY+JjEKK2ZpXSxbc2ltX3dhcm5pbmdzPSIiXSlkbmwKKworCitBQ19BUkdfRU5BQkxFKHNpbS14b3ItZW5kaWFuLAorWyAgLS1lbmFibGUtc2ltLXhvci1lbmRpYW49bgkJU3BlY2lmeSBudW1iZXIgYnl0ZXMgaW52b2x2ZWQgaW4gUG93ZXJQQyBYT1IgYmktZW5kaWFuIG1vZGUgKGRlZmF1bHQgOCkuXSwKK1tjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3hvcl9lbmRpYW49Ii1EV0lUSF9YT1JfRU5ESUFOPTgiOzsKKyAgbm8pCXNpbV94b3JfZW5kaWFuPSItRFdJVEhfWE9SX0VORElBTj0wIjs7CisgICopCXNpbV94b3JfZW5kaWFuPSItRFdJVEhfWE9SX0VORElBTj0kZW5hYmxldmFsIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3hvcl9lbmRpYW4iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHhvci1lbmRpYW4gZmxhZyA9ICRzaW1feG9yX2VuZGlhbiIgNj4mMQorZmldLFtzaW1feG9yX2VuZGlhbj0iIl0pZG5sCisKKworQUNfQ09ORklHX0FVWF9ESVIoYGNkICRzcmNkaXI7cHdkYC8uLi8uLikKK0FDX0NBTk9OSUNBTF9TWVNURU0KK0FDX0FSR19QUk9HUkFNCisKKy4gJHtzcmNkaXJ9Ly4uLy4uL2JmZC9jb25maWd1cmUuaG9zdAorCitBQ19DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKKworQUNfU1RSVUNUX1NUX0JMS1NJWkUKK0FDX1NUUlVDVF9TVF9CTE9DS1MKK0FDX1NUUlVDVF9TVF9SREVWCitBQ19TVFJVQ1RfVElNRVpPTkUKKworQUNfVFlQRV9HRVRHUk9VUFMKK0FDX1RZUEVfTU9ERV9UCitBQ19UWVBFX09GRl9UCitBQ19UWVBFX1BJRF9UCitBQ19UWVBFX1NJR05BTAorQUNfVFlQRV9TSVpFX1QKK0FDX1RZUEVfVUlEX1QKKworQUNfQ0hFQ0tfRlVOQ1MoYWNjZXNzIGNmZ2V0aXNwZWVkIGNmZ2V0b3NwZWVkIGNmc2V0aXNwZWVkIGNmc2V0b3NwZWVkIGNoZGlyIGNobW9kIGNob3duIGR1cCBkdXAyIGZjaG1vZCBmY2hvd24gZmNudGwgZnN0YXQgZnN0YXRmcyBnZXRkaXJlbnRyaWVzIGdldGVnaWQgZ2V0ZXVpZCBnZXRnaWQgZ2V0cGlkIGdldHBwaWQgZ2V0cnVzYWdlIGdldHRpbWVvZmRheSBnZXR1aWQgaW9jdGwga2lsbCBsaW5rIGxzZWVrIGxzdGF0IG1rZGlyIHBpcGUgcmVhZGxpbmsgcm1kaXIgc2V0cmV1aWQgc2V0cmVnaWQgc3RhdCBzaWdwcm9jbWFzayBzdGF0IHN5bWxpbmsgdGNnZXRhdHRyIHRjc2V0YXR0ciB0Y3NlbmRicmVhayB0Y2RyYWluIHRjZmx1c2ggdGNmbG93IHRjZ2V0cGdycCB0Y3NldHBncnAgdGltZSB1bWFzayB1bmxpbmspCisKK0FDX0NIRUNLX0hFQURFUlMoZmNudGwuaCBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggc3lzL2lvY3RsLmggc3lzL3BhcmFtLmggc3lzL3Jlc291cmNlLmggc3lzL3N0YXQuaCBzeXMvdGVybWlvLmggc3lzL3Rlcm1pb3MuaCBzeXMvdGltZS5oIHN5cy90aW1lcy5oIHN5cy90eXBlcy5oIHRpbWUuaCB1bmlzdGQuaCkKK0FDX0hFQURFUl9ESVJFTlQKKworZG5sIEZpZ3VyZSBvdXQgd2hhdCB0eXBlIG9mIHRlcm1pby90ZXJtaW9zIHN1cHBvcnQgdGhlcmUgaXMKK3NpbV90ZXJtaW89IiIKK0FDX01TR19DSEVDS0lORyhmb3Igc3RydWN0IHRlcm1pb3MpCitBQ19DQUNIRV9WQUwoYWNfY3ZfdGVybWlvc19zdHJ1Y3QsCitbQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGVybWlvcy5oPl0sCitbc3RhdGljIHN0cnVjdCB0ZXJtaW9zIHg7CisgeC5jX2lmbGFnID0gMDsKKyB4LmNfb2ZsYWcgPSAwOworIHguY19jZmxhZyA9IDA7CisgeC5jX2xmbGFnID0gMDsKKyB4LmNfY2NbTkNDU10gPSAwO10sCithY19jdl90ZXJtaW9zX3N0cnVjdD15ZXMsIGFjX2N2X3Rlcm1pb3Nfc3RydWN0PW5vKV0pCitBQ19NU0dfUkVTVUxUKCRhY19jdl90ZXJtaW9zX3N0cnVjdCkKK2lmIHRlc3QgJGFjX2N2X3Rlcm1pb3Nfc3RydWN0ID0geWVzOyB0aGVuCisgIHNpbV90ZXJtaW89IiRzaW1fdGVybWlvIC1ESEFWRV9URVJNSU9TX1NUUlVDVFVSRSIKK2ZpCisKK2lmIHRlc3QgIiRhY19jdl90ZXJtaW9zX3N0cnVjdCIgPSAieWVzIjsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNfbGluZSBmaWVsZCBpbiBzdHJ1Y3QgdGVybWlvcykKKyAgQUNfQ0FDSEVfVkFMKGFjX2N2X3Rlcm1pb3NfY2xpbmUsCisgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90ZXJtaW9zLmg+XSwKK1tzdGF0aWMgc3RydWN0IHRlcm1pb3MgeDsgeC5jX2xpbmUgPSAwO10sCisgIGFjX2N2X3Rlcm1pb3NfY2xpbmU9eWVzLCBhY19jdl90ZXJtaW9zX2NsaW5lPW5vKV0pCisKKyAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfdGVybWlvc19jbGluZSkKKyAgaWYgdGVzdCAkYWNfY3ZfdGVybWlvc19jbGluZSA9IHllczsgdGhlbgorICAgIHNpbV90ZXJtaW89IiRzaW1fdGVybWlvIC1ESEFWRV9URVJNSU9TX0NMSU5FIgorICBmaQorZWxzZQorICBhY19jdl90ZXJtaW9zX2NsaW5lPW5vCitmaQorCitpZiB0ZXN0ICIkYWNfY3ZfdGVybWlvc19zdHJ1Y3QiICE9ICJ5ZXMiOyB0aGVuCisgIEFDX01TR19DSEVDS0lORyhmb3Igc3RydWN0IHRlcm1pbykKKyAgQUNfQ0FDSEVfVkFMKGFjX2N2X3Rlcm1pb19zdHJ1Y3QsCisgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90ZXJtaW8uaD5dLAorW3N0YXRpYyBzdHJ1Y3QgdGVybWlvIHg7CisgeC5jX2lmbGFnID0gMDsKKyB4LmNfb2ZsYWcgPSAwOworIHguY19jZmxhZyA9IDA7CisgeC5jX2xmbGFnID0gMDsKKyB4LmNfY2NbTkNDXSA9IDA7XSwKK2FjX2N2X3Rlcm1pb19zdHJ1Y3Q9eWVzLCBhY19jdl90ZXJtaW9fc3RydWN0PW5vKV0pCisgIEFDX01TR19SRVNVTFQoJGFjX2N2X3Rlcm1pb19zdHJ1Y3QpCisgIGlmIHRlc3QgJGFjX2N2X3Rlcm1pb19zdHJ1Y3QgPSB5ZXM7IHRoZW4KKyAgICBzaW1fdGVybWlvPSIkc2ltX3Rlcm1pbyAtREhBVkVfVEVSTUlPX1NUUlVDVFVSRSIKKyAgZmkKK2Vsc2UKKyAgYWNfY3ZfdGVybWlvX3N0cnVjdD1ubworZmkKKworaWYgdGVzdCAiJGFjX2N2X3Rlcm1pb19zdHJ1Y3QiID0gInllcyI7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKGZvciBjX2xpbmUgZmllbGQgaW4gc3RydWN0IHRlcm1pbykKKyAgQUNfQ0FDSEVfVkFMKGFjX2N2X3Rlcm1pb19jbGluZSwKKyAgW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3Rlcm1pby5oPl0sCitbc3RhdGljIHN0cnVjdCB0ZXJtaW8geDsgeC5jX2xpbmUgPSAwO10sCisgIGFjX2N2X3Rlcm1pb19jbGluZT15ZXMsIGFjX2N2X3Rlcm1pb19jbGluZT1ubyldKQorCisgIEFDX01TR19SRVNVTFQoJGFjX2N2X3Rlcm1pb19jbGluZSkKKyAgaWYgdGVzdCAkYWNfY3ZfdGVybWlvX2NsaW5lID0geWVzOyB0aGVuCisgICAgc2ltX3Rlcm1pbz0iJHNpbV90ZXJtaW8gLURIQVZFX1RFUk1JT19DTElORSIKKyAgZmkKK2Vsc2UKKyAgYWNfY3ZfdGVybWlvX2NsaW5lPW5vCitmaQorCitkbmwgRmlndXJlIG91dCBpZiAvZGV2L3plcm8gZXhpc3RzIG9yIG5vdAorc2ltX2Rldnplcm89IiIKK0FDX01TR19DSEVDS0lORyhmb3IgL2Rldi96ZXJvKQorQUNfQ0FDSEVfVkFMKGFjX2N2X2Rldnplcm8sCitbQUNfVFJZX1JVTihbI2luY2x1ZGUgPGZjbnRsLmg+CittYWluICgpIHsKKyAgY2hhciBidWZbMjA0OF07CisgIGludCBpOworICBpbnQgZmQgPSBvcGVuICgiL2Rldi96ZXJvIiwgT19SRE9OTFkpOworICBpZiAoZmQgPCAwKQorICAgIHJldHVybiAxOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChidWYpOyBpKyspCisgICAgYnVmW2ldID0gMTsKKyAgaWYgKHJlYWQgKGZkLCBidWYsIHNpemVvZiAoYnVmKSkgIT0gc2l6ZW9mIChidWYpKQorICAgIHJldHVybiAxOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChidWYpOyBpKyspCisgICAgaWYgKGJ1ZltpXSkKKyAgICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK31dLFthY19jdl9kZXZ6ZXJvPXllc10sW2FjX2N2X2Rldnplcm89bm9dLFthY19jdl9kZXZ6ZXJvPW5vXSldKQorQUNfTVNHX1JFU1VMVCgkYWNfY3ZfZGV2emVybykKK2lmIHRlc3QgJGFjX2N2X2Rldnplcm8gPSB5ZXM7IHRoZW4KKyAgc2ltX2Rldnplcm89Ii1ESEFWRV9ERVZaRVJPIgorZWxzZQorICBzaW1fZGV2emVybz0iIgorZmkKKworZG5sIEZpZ3VyZSBvdXQgaWYgd2UgYXJlIGluIHRoZSBuZXcgQ3lnbnVzIHRyZWUgd2l0aCBhIGNvbW1vbiBkaXJlY3Rvcnkgb3Igbm90CitBQ19NU0dfQ0hFQ0tJTkcoZm9yIGNvbW1vbiBzaW11bGF0b3IgZGlyZWN0b3J5KQoraWYgdGVzdCAtZiAiJHtzcmNkaXJ9Ly4uL2NvbW1vbi9jYWxsYmFjay5jIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKHllcykKKyAgc2ltX2NhbGxiYWNrPSJjYWxsYmFjay5vIHRhcmctbWFwLm8iCisgIHNpbV90YXJnX3ZhbHM9InRhcmctdmFscy5oIHRhcmctbWFwLmMgdGFyZy12YWxzLmRlZiIKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKKyAgc2ltX2NhbGxiYWNrPSIiCisgIHNpbV90YXJnX3ZhbHM9IiIKK2ZpCisKK2RubCBDaGVjayBmb3IgZXhlIGV4dGVuc2lvbgorQU1fRVhFRVhUCisKK0FDX1NVQlNUKENDX0ZPUl9CVUlMRCkKK0FDX1NVQlNUKENGTEFHUykKK0FDX1NVQlNUKEhERUZJTkVTKQorQVI9JHtBUi1hcn0KK0FDX1NVQlNUKEFSKQorQUNfUFJPR19SQU5MSUIKK0FDX1NVQlNUKHNpbV9jZmxhZ3MpCitBQ19TVUJTVChzaW1fd2FybmluZ3MpCitBQ19TVUJTVChzaW1fbGluZV9ucikKK0FDX1NVQlNUKHNpbV9jb25maWcpCitBQ19TVUJTVChzaW1fb3Bjb2RlKQorQUNfU1VCU1Qoc2ltX3N3aXRjaCkKK0FDX1NVQlNUKHNpbV9kdXApCitBQ19TVUJTVChzaW1fZGVjb2RlX21lY2hhbmlzbSkKK0FDX1NVQlNUKHNpbV9qdW1wKQorQUNfU1VCU1Qoc2ltX2ZpbHRlcikKK0FDX1NVQlNUKHNpbV9pY2FjaGUpCitBQ19TVUJTVChzaW1faHdfc3JjKQorQUNfU1VCU1Qoc2ltX2h3X29iaikKK0FDX1NVQlNUKHNpbV9wa19zcmMpCitBQ19TVUJTVChzaW1fcGtfb2JqKQorQUNfU1VCU1Qoc2ltX2lubGluZSkKK0FDX1NVQlNUKHNpbV9ic3dhcCkKK0FDX1NVQlNUKHNpbV9lbmRpYW4pCitBQ19TVUJTVChzaW1fcmVncGFybSkKK0FDX1NVQlNUKHNpbV9zdGRjYWxsKQorQUNfU1VCU1Qoc2ltX3hvcl9lbmRpYW4pCitBQ19TVUJTVChzaW1faG9zdGVuZGlhbikKK0FDX1NVQlNUKHNpbV9zbXApCitBQ19TVUJTVChzaW1faWdlbl9zbXApCitBQ19TVUJTVChzaW1fYml0c2l6ZSkKK0FDX1NVQlNUKHNpbV9ob3N0Yml0c2l6ZSkKK0FDX1NVQlNUKHNpbV9lbnYpCitBQ19TVUJTVChzaW1fdGltZWJhc2UpCitBQ19TVUJTVChzaW1fYWxpZ25tZW50KQorQUNfU1VCU1Qoc2ltX2Zsb2F0KQorQUNfU1VCU1Qoc2ltX3RyYWNlKQorQUNfU1VCU1Qoc2ltX2Fzc2VydCkKK0FDX1NVQlNUKHNpbV9yZXNlcnZlZCkKK0FDX1NVQlNUKHNpbV9tb25pdG9yKQorQUNfU1VCU1Qoc2ltX21vZGVsKQorQUNfU1VCU1Qoc2ltX2RlZmF1bHRfbW9kZWwpCitBQ19TVUJTVChzaW1fbW9kZWxfaXNzdWUpCitBQ19TVUJTVChzaW1fc3RkaW8pCitBQ19TVUJTVChzaW1fdGVybWlvKQorQUNfU1VCU1Qoc2ltX2Rldnplcm8pCitBQ19TVUJTVChzaW1fY2FsbGJhY2spCitBQ19TVUJTVChzaW1fdGFyZ192YWxzKQorCitBQ19PVVRQVVQoTWFrZWZpbGUsCitbY2FzZSB4JENPTkZJR19IRUFERVJTIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWNdKQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9jb3JlZmlsZS1uLmggYi9zaW0vcHBjL2NvcmVmaWxlLW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTRjYWU4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9jb3JlZmlsZS1uLmgKQEAgLTAsMCArMSw5NyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBOCisjZXJyb3IgIk4gbXVzdCBiZSAjZGVmaW5lZCIKKyNlbmRpZgorCisvKiBOT1RFOiBzZWUgZW5kIG9mIGZpbGUgZm9yICN1bmRlZiBvZiB0aGVzZSBtYWNyb3MgKi8KKyNkZWZpbmUgdW5zaWduZWRfTiBYQ09OQ0FUMih1bnNpZ25lZF8sTikKKyNkZWZpbmUgVDJIX04gWENPTkNBVDIoVDJIXyxOKQorI2RlZmluZSBIMlRfTiBYQ09OQ0FUMihIMlRfLE4pCisKKyNkZWZpbmUgY29yZV9tYXBfcmVhZF9OIFhDT05DQVQyKGNvcmVfbWFwX3JlYWRfLE4pCisjZGVmaW5lIGNvcmVfbWFwX3dyaXRlX04gWENPTkNBVDIoY29yZV9tYXBfd3JpdGVfLE4pCisKK0lOTElORV9DT1JFKHVuc2lnbmVkX04pCitjb3JlX21hcF9yZWFkX04oY29yZV9tYXAgKm1hcCwKKwkJdW5zaWduZWRfd29yZCBhZGRyLAorCQljcHUgKnByb2Nlc3NvciwKKwkJdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGNvcmVfbWFwcGluZyAqbWFwcGluZyA9IGNvcmVfbWFwX2ZpbmRfbWFwcGluZyhtYXAsCisJCQkJCQlhZGRyLAorCQkJCQkJc2l6ZW9mKHVuc2lnbmVkX04pLAorCQkJCQkJcHJvY2Vzc29yLAorCQkJCQkJY2lhLAorCQkJCQkJMSk7IC8qYWJvcnQqLworICBpZiAoV0lUSF9DQUxMQkFDS19NRU1PUlkgJiYgbWFwcGluZy0+ZGV2aWNlICE9IE5VTEwpIHsKKyAgICB1bnNpZ25lZF9OIGRhdGE7CisgICAgaWYgKGRldmljZV9pb19yZWFkX2J1ZmZlcihtYXBwaW5nLT5kZXZpY2UsCisJCQkgICAgICAmZGF0YSwKKwkJCSAgICAgIG1hcHBpbmctPnNwYWNlLAorCQkJICAgICAgYWRkciwKKwkJCSAgICAgIHNpemVvZih1bnNpZ25lZF9OKSwgLyogbnJfYnl0ZXMgKi8KKwkJCSAgICAgIHByb2Nlc3NvciwKKwkJCSAgICAgIGNpYSkgIT0gc2l6ZW9mKHVuc2lnbmVkX04pKQorICAgICAgZGV2aWNlX2Vycm9yKG1hcHBpbmctPmRldmljZSwgImludGVybmFsIGVycm9yIC0gY29yZV9yZWFkX04oKSAtIGlvX3JlYWRfYnVmZmVyIHNob3VsZCBub3QgZmFpbCIpOworICAgIHJldHVybiBUMkhfTihkYXRhKTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIFQySF9OKCoodW5zaWduZWRfTiopY29yZV90cmFuc2xhdGUobWFwcGluZywgYWRkcikpOworfQorCisKKworSU5MSU5FX0NPUkUodm9pZCkKK2NvcmVfbWFwX3dyaXRlX04oY29yZV9tYXAgKm1hcCwKKwkJIHVuc2lnbmVkX3dvcmQgYWRkciwKKwkJIHVuc2lnbmVkX04gdmFsLAorCQkgY3B1ICpwcm9jZXNzb3IsCisJCSB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgY29yZV9tYXBwaW5nICptYXBwaW5nID0gY29yZV9tYXBfZmluZF9tYXBwaW5nKG1hcCwKKwkJCQkJCWFkZHIsCisJCQkJCQlzaXplb2YodW5zaWduZWRfTiksCisJCQkJCQlwcm9jZXNzb3IsCisJCQkJCQljaWEsCisJCQkJCQkxKTsgLyphYm9ydCovCisgIGlmIChXSVRIX0NBTExCQUNLX01FTU9SWSAmJiBtYXBwaW5nLT5kZXZpY2UgIT0gTlVMTCkgeworICAgIHVuc2lnbmVkX04gZGF0YSA9IEgyVF9OKHZhbCk7CisgICAgaWYgKGRldmljZV9pb193cml0ZV9idWZmZXIobWFwcGluZy0+ZGV2aWNlLAorCQkJICAgICAgICZkYXRhLAorCQkJICAgICAgIG1hcHBpbmctPnNwYWNlLAorCQkJICAgICAgIGFkZHIsCisJCQkgICAgICAgc2l6ZW9mKHVuc2lnbmVkX04pLCAvKiBucl9ieXRlcyAqLworCQkJICAgICAgIHByb2Nlc3NvciwKKwkJCSAgICAgICBjaWEpICE9IHNpemVvZih1bnNpZ25lZF9OKSkKKyAgICAgIGRldmljZV9lcnJvcihtYXBwaW5nLT5kZXZpY2UsICJpbnRlcm5hbCBlcnJvciAtIGNvcmVfd3JpdGVfTigpIC0gaW9fd3JpdGVfYnVmZmVyIHNob3VsZCBub3QgZmFpbCIpOworICB9CisgIGVsc2UKKyAgICAqKHVuc2lnbmVkX04qKWNvcmVfdHJhbnNsYXRlKG1hcHBpbmcsIGFkZHIpID0gSDJUX04odmFsKTsKK30KKworLyogTk9URTogc2VlIHN0YXJ0IG9mIGZpbGUgZm9yICNkZWZpbmUgb2YgdGhlc2UgbWFjcm9zICovCisjdW5kZWYgdW5zaWduZWRfTgorI3VuZGVmIFQySF9OCisjdW5kZWYgSDJUX04KKyN1bmRlZiBjb3JlX21hcF9yZWFkX04KKyN1bmRlZiBjb3JlX21hcF93cml0ZV9OCmRpZmYgLS1naXQgYS9zaW0vcHBjL2NvcmVmaWxlLmMgYi9zaW0vcHBjL2NvcmVmaWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyOTViYgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvY29yZWZpbGUuYwpAQCAtMCwwICsxLDQxNSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfQ09SRV9DXworI2RlZmluZSBfQ09SRV9DXworCisjaW5jbHVkZSAiYmFzaWNzLmgiCisjaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCisjaW5jbHVkZSAiY29yZWZpbGUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgX2NvcmVfbWFwcGluZyBjb3JlX21hcHBpbmc7CitzdHJ1Y3QgX2NvcmVfbWFwcGluZyB7CisgIC8qIGNvbW1vbiAqLworICBpbnQgbGV2ZWw7CisgIGludCBzcGFjZTsKKyAgdW5zaWduZWRfd29yZCBiYXNlOworICB1bnNpZ25lZF93b3JkIGJvdW5kOworICB1bnNpZ25lZCBucl9ieXRlczsKKyAgLyogbWVtb3J5IG1hcCAqLworICB2b2lkICpmcmVlX2J1ZmZlcjsKKyAgdm9pZCAqYnVmZmVyOworICAvKiBjYWxsYmFjayBtYXAgKi8KKyAgZGV2aWNlICpkZXZpY2U7CisgIC8qIGdyb3d0aCAqLworICBjb3JlX21hcHBpbmcgKm5leHQ7Cit9OworCitzdHJ1Y3QgX2NvcmVfbWFwIHsKKyAgY29yZV9tYXBwaW5nICpmaXJzdDsKK307CisKK3R5cGVkZWYgZW51bSB7CisgIGNvcmVfcmVhZF9tYXAsCisgIGNvcmVfd3JpdGVfbWFwLAorICBjb3JlX2V4ZWN1dGVfbWFwLAorICBucl9jb3JlX21hcF90eXBlcywKK30gY29yZV9tYXBfdHlwZXM7CisKK3N0cnVjdCBfY29yZSB7CisgIGNvcmVfbWFwIG1hcFtucl9jb3JlX21hcF90eXBlc107Cit9OworCisKK0lOTElORV9DT1JFXAorKGNvcmUgKikKK2NvcmVfY3JlYXRlKHZvaWQpCit7CisgIHJldHVybiBaQUxMT0MoY29yZSk7Cit9CisKKworSU5MSU5FX0NPUkVcCisoY29yZSAqKQorY29yZV9mcm9tX2RldmljZShkZXZpY2UgKnJvb3QpCit7CisgIHJvb3QgPSBkZXZpY2Vfcm9vdChyb290KTsKKyAgQVNTRVJUKHN0cmNtcChkZXZpY2VfbmFtZShyb290KSwgImNvcmUiKSA9PSAwKTsKKyAgcmV0dXJuIGRldmljZV9kYXRhKHJvb3QpOworfQorCisKK0lOTElORV9DT1JFXAorKHZvaWQpCitjb3JlX2luaXQoY29yZSAqbWVtb3J5KQoreworICBjb3JlX21hcF90eXBlcyBhY2Nlc3NfdHlwZTsKKyAgZm9yIChhY2Nlc3NfdHlwZSA9IDA7CisgICAgICAgYWNjZXNzX3R5cGUgPCBucl9jb3JlX21hcF90eXBlczsKKyAgICAgICBhY2Nlc3NfdHlwZSsrKSB7CisgICAgY29yZV9tYXAgKm1hcCA9IG1lbW9yeS0+bWFwICsgYWNjZXNzX3R5cGU7CisgICAgLyogYmxvdyBhd2F5IG9sZCBtYXBwaW5ncyAqLworICAgIGNvcmVfbWFwcGluZyAqY3VyciA9IG1hcC0+Zmlyc3Q7CisgICAgd2hpbGUgKGN1cnIgIT0gTlVMTCkgeworICAgICAgY29yZV9tYXBwaW5nICp0YmQgPSBjdXJyOworICAgICAgY3VyciA9IGN1cnItPm5leHQ7CisgICAgICBpZiAodGJkLT5mcmVlX2J1ZmZlciAhPSBOVUxMKSB7CisJQVNTRVJUKHRiZC0+YnVmZmVyICE9IE5VTEwpOworCXpmcmVlKHRiZC0+ZnJlZV9idWZmZXIpOworICAgICAgfQorICAgICAgemZyZWUodGJkKTsKKyAgICB9CisgICAgbWFwLT5maXJzdCA9IE5VTEw7CisgIH0KK30KKworCisKKy8qIHRoZSBjb3JlIGhhcyB0aHJlZSBzdWIgbWFwcGluZ3MgdGhhdCB0aGUgbW9yZSBlZmZpY2llbnQKKyAgIHJlYWQvd3JpdGUgZml4ZWQgcXVhbnRpdHkgZnVuY3Rpb25zIHVzZSAqLworCitJTkxJTkVfQ09SRVwKKyhjb3JlX21hcCAqKQorY29yZV9yZWFkYWJsZShjb3JlICptZW1vcnkpCit7CisgIHJldHVybiBtZW1vcnktPm1hcCArIGNvcmVfcmVhZF9tYXA7Cit9CisKK0lOTElORV9DT1JFXAorKGNvcmVfbWFwICopCitjb3JlX3dyaXRlYWJsZShjb3JlICptZW1vcnkpCit7CisgIHJldHVybiBtZW1vcnktPm1hcCArIGNvcmVfd3JpdGVfbWFwOworfQorCitJTkxJTkVfQ09SRVwKKyhjb3JlX21hcCAqKQorY29yZV9leGVjdXRhYmxlKGNvcmUgKm1lbW9yeSkKK3sKKyAgcmV0dXJuIG1lbW9yeS0+bWFwICsgY29yZV9leGVjdXRlX21hcDsKK30KKworCisKK1NUQVRJQ19JTkxJTkVfQ09SRVwKKyhjb3JlX21hcHBpbmcgKikKK25ld19jb3JlX21hcHBpbmcoYXR0YWNoX3R5cGUgYXR0YWNoLAorCQkgaW50IHNwYWNlLAorCQkgdW5zaWduZWRfd29yZCBhZGRyLAorCQkgdW5zaWduZWQgbnJfYnl0ZXMsCisJCSBkZXZpY2UgKmRldmljZSwKKwkJIHZvaWQgKmJ1ZmZlciwKKwkJIHZvaWQgKmZyZWVfYnVmZmVyKQoreworICBjb3JlX21hcHBpbmcgKm5ld19tYXBwaW5nID0gWkFMTE9DKGNvcmVfbWFwcGluZyk7CisgIC8qIGNvbW1vbiAqLworICBuZXdfbWFwcGluZy0+bGV2ZWwgPSBhdHRhY2g7CisgIG5ld19tYXBwaW5nLT5zcGFjZSA9IHNwYWNlOworICBuZXdfbWFwcGluZy0+YmFzZSA9IGFkZHI7CisgIG5ld19tYXBwaW5nLT5ucl9ieXRlcyA9IG5yX2J5dGVzOworICBuZXdfbWFwcGluZy0+Ym91bmQgPSBhZGRyICsgKG5yX2J5dGVzIC0gMSk7CisgIGlmIChhdHRhY2ggPT0gYXR0YWNoX3Jhd19tZW1vcnkpIHsKKyAgICBuZXdfbWFwcGluZy0+YnVmZmVyID0gYnVmZmVyOworICAgIG5ld19tYXBwaW5nLT5mcmVlX2J1ZmZlciA9IGZyZWVfYnVmZmVyOworICB9CisgIGVsc2UgaWYgKGF0dGFjaCA+PSBhdHRhY2hfY2FsbGJhY2spIHsKKyAgICBuZXdfbWFwcGluZy0+ZGV2aWNlID0gZGV2aWNlOworICB9CisgIGVsc2UgeworICAgIGVycm9yKCJuZXdfY29yZV9tYXBwaW5nKCkgLSBpbnRlcm5hbCBlcnJvciAtIHVua25vd24gYXR0YWNoIHR5cGUgJWRcbiIsCisJICBhdHRhY2gpOworICB9CisgIHJldHVybiBuZXdfbWFwcGluZzsKK30KKworCitTVEFUSUNfSU5MSU5FX0NPUkVcCisodm9pZCkKK2NvcmVfbWFwX2F0dGFjaChjb3JlX21hcCAqYWNjZXNzX21hcCwKKwkJYXR0YWNoX3R5cGUgYXR0YWNoLAorCQlpbnQgc3BhY2UsCisJCXVuc2lnbmVkX3dvcmQgYWRkciwKKwkJdW5zaWduZWQgbnJfYnl0ZXMsIC8qIGhvc3QgbGltaXRlZCAqLworCQlkZXZpY2UgKmNsaWVudCwgLypjYWxsYmFjay9kZWZhdWx0Ki8KKwkJdm9pZCAqYnVmZmVyLCAvKnJhd19tZW1vcnkqLworCQl2b2lkICpmcmVlX2J1ZmZlcikgLypyYXdfbWVtb3J5Ki8KK3sKKyAgLyogZmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50IGZvciB0aGlzIGFkZGl0aW9uYWwgbWFwcGluZyBhbmQgaW5zZXJ0ICovCisgIGNvcmVfbWFwcGluZyAqbmV4dF9tYXBwaW5nOworICBjb3JlX21hcHBpbmcgKipsYXN0X21hcHBpbmc7CisKKyAgLyogYWN0dWFsbHkgZG8gb2NjYXNpb25hbGx5IGdldCBhIHplcm8gc2l6ZSBtYXAgKi8KKyAgaWYgKG5yX2J5dGVzID09IDApIHsKKyAgICBkZXZpY2VfZXJyb3IoY2xpZW50LCAiY2FsbGVkIG9uIGNvcmVfbWFwX2F0dGFjaCgpIHdpdGggc2l6ZSB6ZXJvIik7CisgIH0KKworICAvKiBmaW5kIHRoZSBpbnNlcnRpb24gcG9pbnQgKGJldHdlZW4gbGFzdC9uZXh0KSAqLworICBuZXh0X21hcHBpbmcgPSBhY2Nlc3NfbWFwLT5maXJzdDsKKyAgbGFzdF9tYXBwaW5nID0gJmFjY2Vzc19tYXAtPmZpcnN0OworICB3aGlsZShuZXh0X21hcHBpbmcgIT0gTlVMTAorCSYmIChuZXh0X21hcHBpbmctPmxldmVsIDwgYXR0YWNoCisJICAgIHx8IChuZXh0X21hcHBpbmctPmxldmVsID09IGF0dGFjaAorCQkmJiBuZXh0X21hcHBpbmctPmJvdW5kIDwgYWRkcikpKSB7CisgICAgLyogcHJvdmlkZWQgbGV2ZWxzIGFyZSB0aGUgc2FtZSAqLworICAgIC8qIGFzc2VydDogbmV4dF9tYXBwaW5nLT5iYXNlID4gYWxsIGJhc2VzIGJlZm9yZSBuZXh0X21hcHBpbmcgKi8KKyAgICAvKiBhc3NlcnQ6IG5leHRfbWFwcGluZy0+Ym91bmQgPj0gYWxsIGJvdW5kcyBiZWZvcmUgbmV4dF9tYXBwaW5nICovCisgICAgbGFzdF9tYXBwaW5nID0gJm5leHRfbWFwcGluZy0+bmV4dDsKKyAgICBuZXh0X21hcHBpbmcgPSBuZXh0X21hcHBpbmctPm5leHQ7CisgIH0KKworICAvKiBjaGVjayBpbnNlcnRpb24gcG9pbnQgY29ycmVjdCAqLworICBBU1NFUlQobmV4dF9tYXBwaW5nID09IE5VTEwgfHwgbmV4dF9tYXBwaW5nLT5sZXZlbCA+PSBhdHRhY2gpOworICBpZiAobmV4dF9tYXBwaW5nICE9IE5VTEwgJiYgbmV4dF9tYXBwaW5nLT5sZXZlbCA9PSBhdHRhY2gKKyAgICAgICYmIG5leHRfbWFwcGluZy0+YmFzZSA8IChhZGRyICsgKG5yX2J5dGVzIC0gMSkpKSB7CisgICAgZGV2aWNlX2Vycm9yKGNsaWVudCwgIm1hcCBvdmVybGFwIHdoZW4gYXR0YWNoaW5nICVkOjB4JWx4ICglbGQpIiwKKwkJIHNwYWNlLCAobG9uZylhZGRyLCAobG9uZylucl9ieXRlcyk7CisgIH0KKworICAvKiBjcmVhdGUvaW5zZXJ0IHRoZSBuZXcgbWFwcGluZyAqLworICAqbGFzdF9tYXBwaW5nID0gbmV3X2NvcmVfbWFwcGluZyhhdHRhY2gsCisJCQkJICAgc3BhY2UsIGFkZHIsIG5yX2J5dGVzLAorCQkJCSAgIGNsaWVudCwgYnVmZmVyLCBmcmVlX2J1ZmZlcik7CisgICgqbGFzdF9tYXBwaW5nKS0+bmV4dCA9IG5leHRfbWFwcGluZzsKK30KKworCitJTkxJTkVfQ09SRVwKKyh2b2lkKQorY29yZV9hdHRhY2goY29yZSAqbWVtb3J5LAorCSAgICBhdHRhY2hfdHlwZSBhdHRhY2gsCisJICAgIGludCBzcGFjZSwKKwkgICAgYWNjZXNzX3R5cGUgYWNjZXNzLAorCSAgICB1bnNpZ25lZF93b3JkIGFkZHIsCisJICAgIHVuc2lnbmVkIG5yX2J5dGVzLCAvKiBob3N0IGxpbWl0ZWQgKi8KKwkgICAgZGV2aWNlICpjbGllbnQpIC8qY2FsbGJhY2svZGVmYXVsdCovCit7CisgIGNvcmVfbWFwX3R5cGVzIGFjY2Vzc19tYXA7CisgIHZvaWQgKmJ1ZmZlcjsKKyAgdm9pZCAqZnJlZV9idWZmZXI7CisgIGlmIChhdHRhY2ggPT0gYXR0YWNoX3Jhd19tZW1vcnkpIHsKKyAgICAvKiBQYWRkIG91dCB0aGUgcmF3IGJ1ZmZlciB0byBlbnN1cmUgdGhhdCBBRERSIHN0YXJ0cyBvbiBhCisgICAgICAgY29ycmVjdGx5IGFsaWduZWQgYm91bmRhcnkgKi8KKyAgICBpbnQgcGFkZGluZyA9IChhZGRyICUgc2l6ZW9mICh1bnNpZ25lZDY0KSk7CisgICAgZnJlZV9idWZmZXIgPSB6YWxsb2MobnJfYnl0ZXMgKyBwYWRkaW5nKTsKKyAgICBidWZmZXIgPSAoY2hhciopZnJlZV9idWZmZXIgKyBwYWRkaW5nOworICB9CisgIGVsc2UgeworICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgZnJlZV9idWZmZXIgPSAmYnVmZmVyOyAvKiBtYXJrZXIgZm9yIGFzc2VydGlvbiAqLworICB9CisgIGZvciAoYWNjZXNzX21hcCA9IDA7IAorICAgICAgIGFjY2Vzc19tYXAgPCBucl9jb3JlX21hcF90eXBlczsKKyAgICAgICBhY2Nlc3NfbWFwKyspIHsKKyAgICBzd2l0Y2ggKGFjY2Vzc19tYXApIHsKKyAgICBjYXNlIGNvcmVfcmVhZF9tYXA6CisgICAgICBpZiAoYWNjZXNzICYgYWNjZXNzX3JlYWQpCisJY29yZV9tYXBfYXR0YWNoKG1lbW9yeS0+bWFwICsgYWNjZXNzX21hcCwKKwkJCWF0dGFjaCwKKwkJCXNwYWNlLCBhZGRyLCBucl9ieXRlcywKKwkJCWNsaWVudCwgYnVmZmVyLCBmcmVlX2J1ZmZlcik7CisgICAgICBmcmVlX2J1ZmZlciA9IE5VTEw7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvcmVfd3JpdGVfbWFwOgorICAgICAgaWYgKGFjY2VzcyAmIGFjY2Vzc193cml0ZSkKKwljb3JlX21hcF9hdHRhY2gobWVtb3J5LT5tYXAgKyBhY2Nlc3NfbWFwLAorCQkJYXR0YWNoLAorCQkJc3BhY2UsIGFkZHIsIG5yX2J5dGVzLAorCQkJY2xpZW50LCBidWZmZXIsIGZyZWVfYnVmZmVyKTsKKyAgICAgIGZyZWVfYnVmZmVyID0gTlVMTDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgY29yZV9leGVjdXRlX21hcDoKKyAgICAgIGlmIChhY2Nlc3MgJiBhY2Nlc3NfZXhlYykKKwljb3JlX21hcF9hdHRhY2gobWVtb3J5LT5tYXAgKyBhY2Nlc3NfbWFwLAorCQkJYXR0YWNoLAorCQkJc3BhY2UsIGFkZHIsIG5yX2J5dGVzLAorCQkJY2xpZW50LCBidWZmZXIsIGZyZWVfYnVmZmVyKTsKKyAgICAgIGZyZWVfYnVmZmVyID0gTlVMTDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvcigiY29yZV9hdHRhY2goKSBpbnRlcm5hbCBlcnJvclxuIik7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgLyogYWxsb2NhdGVkIGJ1ZmZlciBtdXN0IGF0dGFjaCB0byBhdCBsZWFzdCBvbmUgdGhpbmcgKi8KKyAgQVNTRVJUKGZyZWVfYnVmZmVyID09IE5VTEwpOworfQorCisKK1NUQVRJQ19JTkxJTkVfQ09SRVwKKyhjb3JlX21hcHBpbmcgKikKK2NvcmVfbWFwX2ZpbmRfbWFwcGluZyhjb3JlX21hcCAqbWFwLAorCQkgICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCisJCSAgICAgIHVuc2lnbmVkIG5yX2J5dGVzLAorCQkgICAgICBjcHUgKnByb2Nlc3NvciwKKwkJICAgICAgdW5zaWduZWRfd29yZCBjaWEsCisJCSAgICAgIGludCBhYm9ydCkgLyplaXRoZXIgMCBvciAxIC0gaGVscHMgaW5saW5lICovCit7CisgIGNvcmVfbWFwcGluZyAqbWFwcGluZyA9IG1hcC0+Zmlyc3Q7CisgIEFTU0VSVCgoYWRkciAmIChucl9ieXRlcyAtIDEpKSA9PSAwKTsgLyogbXVzdCBiZSBhbGlnbmVkICovCisgIEFTU0VSVCgoYWRkciArIChucl9ieXRlcyAtIDEpKSA+PSBhZGRyKTsgLyogbXVzdCBub3Qgd3JhcCAqLworICB3aGlsZSAobWFwcGluZyAhPSBOVUxMKSB7CisgICAgaWYgKGFkZHIgPj0gbWFwcGluZy0+YmFzZQorCSYmIChhZGRyICsgKG5yX2J5dGVzIC0gMSkpIDw9IG1hcHBpbmctPmJvdW5kKQorICAgICAgcmV0dXJuIG1hcHBpbmc7CisgICAgbWFwcGluZyA9IG1hcHBpbmctPm5leHQ7CisgIH0KKyAgaWYgKGFib3J0KQorICAgIGVycm9yKCJjb3JlX2ZpbmRfbWFwcGluZygpIC0gYWNjZXNzIHRvIHVubWFwZWQgYWRkcmVzcywgYXR0YWNoIGEgZGVmYXVsdCBtYXAgdG8gaGFuZGxlIHRoaXMgLSBhZGRyPTB4JXggbnJfYnl0ZXM9MHgleCBwcm9jZXNzb3I9MHgleCBjaWE9MHgleFxuIiwKKwkgIGFkZHIsIG5yX2J5dGVzLCBwcm9jZXNzb3IsIGNpYSk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NUQVRJQ19JTkxJTkVfQ09SRVwKKyh2b2lkICopCitjb3JlX3RyYW5zbGF0ZShjb3JlX21hcHBpbmcgKm1hcHBpbmcsCisJICAgICAgIHVuc2lnbmVkX3dvcmQgYWRkcikKK3sKKyAgcmV0dXJuICh2b2lkICopKCgoY2hhciAqKW1hcHBpbmctPmJ1ZmZlcikgKyBhZGRyIC0gbWFwcGluZy0+YmFzZSk7Cit9CisKKworSU5MSU5FX0NPUkVcCisodW5zaWduZWQpCitjb3JlX21hcF9yZWFkX2J1ZmZlcihjb3JlX21hcCAqbWFwLAorCQkgICAgIHZvaWQgKmJ1ZmZlciwKKwkJICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCisJCSAgICAgdW5zaWduZWQgbGVuKQoreworICB1bnNpZ25lZCBjb3VudCA9IDA7CisgIHdoaWxlIChjb3VudCA8IGxlbikgeworICAgIHVuc2lnbmVkX3dvcmQgcmFkZHIgPSBhZGRyICsgY291bnQ7CisgICAgY29yZV9tYXBwaW5nICptYXBwaW5nID0KKyAgICAgIGNvcmVfbWFwX2ZpbmRfbWFwcGluZyhtYXAsCisJCQkgICAgcmFkZHIsIDEsCisJCQkgICAgTlVMTCwgLypwcm9jZXNzb3IqLworCQkJICAgIDAsIC8qY2lhKi8KKwkJCSAgICAwKTsgLypkb250LWFib3J0Ki8KKyAgICBpZiAobWFwcGluZyA9PSBOVUxMKQorICAgICAgYnJlYWs7CisgICAgaWYgKG1hcHBpbmctPmRldmljZSAhPSBOVUxMKSB7CisgICAgICBpbnQgbnJfYnl0ZXMgPSBsZW4gLSBjb3VudDsKKyAgICAgIGlmIChyYWRkciArIG5yX2J5dGVzIC0gMT4gbWFwcGluZy0+Ym91bmQpCisJbnJfYnl0ZXMgPSBtYXBwaW5nLT5ib3VuZCAtIHJhZGRyICsgMTsKKyAgICAgIGlmIChkZXZpY2VfaW9fcmVhZF9idWZmZXIobWFwcGluZy0+ZGV2aWNlLAorCQkJCSh1bnNpZ25lZF8xKilidWZmZXIgKyBjb3VudCwKKwkJCQltYXBwaW5nLT5zcGFjZSwKKwkJCQlyYWRkciwKKwkJCQlucl9ieXRlcywKKwkJCQkwLCAvKnByb2Nlc3NvciovCisJCQkJMCAvKmNwdSovKSAhPSBucl9ieXRlcykKKwlicmVhazsKKyAgICAgIGNvdW50ICs9IG5yX2J5dGVzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICgodW5zaWduZWRfMSopYnVmZmVyKVtjb3VudF0gPQorCSoodW5zaWduZWRfMSopY29yZV90cmFuc2xhdGUobWFwcGluZywgcmFkZHIpOworICAgICAgY291bnQgKz0gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGNvdW50OworfQorCisKK0lOTElORV9DT1JFXAorKHVuc2lnbmVkKQorY29yZV9tYXBfd3JpdGVfYnVmZmVyKGNvcmVfbWFwICptYXAsCisJCSAgICAgIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKwkJICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAorCQkgICAgICB1bnNpZ25lZCBsZW4pCit7CisgIHVuc2lnbmVkIGNvdW50ID0gMDsKKyAgd2hpbGUgKGNvdW50IDwgbGVuKSB7CisgICAgdW5zaWduZWRfd29yZCByYWRkciA9IGFkZHIgKyBjb3VudDsKKyAgICBjb3JlX21hcHBpbmcgKm1hcHBpbmcgPSBjb3JlX21hcF9maW5kX21hcHBpbmcobWFwLAorCQkJCQkJICByYWRkciwgMSwKKwkJCQkJCSAgTlVMTCwgLypwcm9jZXNzb3IqLworCQkJCQkJICAwLCAvKmNpYSovCisJCQkJCQkgIDApOyAvKmRvbnQtYWJvcnQqLworICAgIGlmIChtYXBwaW5nID09IE5VTEwpCisgICAgICBicmVhazsKKyAgICBpZiAobWFwcGluZy0+ZGV2aWNlICE9IE5VTEwpIHsKKyAgICAgIGludCBucl9ieXRlcyA9IGxlbiAtIGNvdW50OworICAgICAgaWYgKHJhZGRyICsgbnJfYnl0ZXMgLSAxID4gbWFwcGluZy0+Ym91bmQpCisJbnJfYnl0ZXMgPSBtYXBwaW5nLT5ib3VuZCAtIHJhZGRyICsgMTsKKyAgICAgIGlmIChkZXZpY2VfaW9fd3JpdGVfYnVmZmVyKG1hcHBpbmctPmRldmljZSwKKwkJCQkgKHVuc2lnbmVkXzEqKWJ1ZmZlciArIGNvdW50LAorCQkJCSBtYXBwaW5nLT5zcGFjZSwKKwkJCQkgcmFkZHIsCisJCQkJIG5yX2J5dGVzLAorCQkJCSAwLCAvKnByb2Nlc3NvciovCisJCQkJIDAgLypjcHUqLykgIT0gbnJfYnl0ZXMpCisJYnJlYWs7CisgICAgICBjb3VudCArPSBucl9ieXRlczsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAqKHVuc2lnbmVkXzEqKWNvcmVfdHJhbnNsYXRlKG1hcHBpbmcsIHJhZGRyKSA9CisJKCh1bnNpZ25lZF8xKilidWZmZXIpW2NvdW50XTsKKyAgICAgIGNvdW50ICs9IDE7CisgICAgfQorICB9CisgIHJldHVybiBjb3VudDsKK30KKworCisvKiBkZWZpbmUgdGhlIHJlYWQvd3JpdGUgMS8yLzQvOC93b3JkIGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIE4gMQorI2luY2x1ZGUgImNvcmVmaWxlLW4uaCIKKyN1bmRlZiBOCisKKyNkZWZpbmUgTiAyCisjaW5jbHVkZSAiY29yZWZpbGUtbi5oIgorI3VuZGVmIE4KKworI2RlZmluZSBOIDQKKyNpbmNsdWRlICJjb3JlZmlsZS1uLmgiCisjdW5kZWYgTgorCisjZGVmaW5lIE4gOAorI2luY2x1ZGUgImNvcmVmaWxlLW4uaCIKKyN1bmRlZiBOCisKKyNkZWZpbmUgTiB3b3JkCisjaW5jbHVkZSAiY29yZWZpbGUtbi5oIgorI3VuZGVmIE4KKworI2VuZGlmIC8qIF9DT1JFX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2NvcmVmaWxlLmggYi9zaW0vcHBjL2NvcmVmaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI2NDcwYwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvY29yZWZpbGUuaApAQCAtMCwwICsxLDIyNyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfQ09SRV9IXworI2RlZmluZSBfQ09SRV9IXworCisvKiBJbnRyb2R1Y3Rpb246CisKKyAgIFRoZSBjb3JlIGRldmljZSwgcG9zaXRpb25lZCBhdCB0aGUgdG9wIG9mIHRoZSBkZXZpY2UgdHJlZSB0aGF0CisgICBtb2RlbHMgdGhlIGFyY2hpdGVjdXJlIGJlaW5nIHNpbXVsYXRlZCwgYWN0cyBhcyBhbiBpbnRlcmZhY2UKKyAgIGJldHdlZW4gdGhlIHByb2Nlc3NvciBlbmdpbmVzIGFuZCB0aGUgbW9kZWxlZCBkZXZpY2VzLgorCisgICBPbiB0aGUgb25lIHNpZGUgdGhlIHByb2Nlc3NvciBlbmdpbmVzIGlzc3VlIHJlYWQgYW5kIHdyaXRlIHJlcXVlc3RzCisgICB0byB0aGUgY29yZSAoZWFjaCByZXF1ZXN0IGZ1cnRoZXIgY2F0YWdvcmlzZWQgYXMgYmVpbmcgZm9yIGFuCisgICBpbnN0cnVjdGlvbiBvciBkYXRhIHN1YnVuaXQpIHdoaWxlIG9uIHRoZSBvdGhlciBzaWRlLCB0aGUgY29yZSBpcworICAgcmVjZWl2aW5nIGFkZHJlc3MgY29uZmlndXJhdGlvbiBhbmQgRE1BIHJlcXVlc3RzIGZyb20gY2hpbGQKKyAgIGRldmljZXMuCisKKyAgIEluIHRoZSBiZWxvdyBhIHN5bm9wc2lzIG9mIHRoZSBjb3JlIG9iamVjdCBhbmQgZGV2aWNlIGluIFBTSU0gaXMKKyAgIGdpdmVuLCBkZXRhaWxzIG9mIHRoZSBvYmplY3QgY2FuIGJlIGZvdW5kIGluIHRoZSBmaWxlcworICAgPDxjb3JlZmlsZS5oPj4gYW5kIDw8Y29yZWZpbGUuYz4+LgorCisgICAqLworCisvKiBDb3JlOjoKKworICAgQXQgdGhlIGhlYXJ0IG9mIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBkZXZpY2VzIGFuZCBwcm9jZXNzb3IgZW5naW5lcworICAgaXMgYSBzaW5nbGUgY29yZSBvYmplY3QuICBUaGlzIG9iamVjdCwgaW4gdHVybiwgaGFzIHR3byBjaGlsZHJlbjoKKworICAgbwlhIGNvcmUgZGV2aWNlIHdoaWNoIGV4aXN0cyBpbiB0aGUgZGV2aWNlIHRyZWUgYW5kIHByb3ZpZGVzCisgICAJYW4gaW50ZXJmYWNlIHRvIHRoZSBjb3JlIG9iamVjdCB0byBjaGlsZCBkZXZpY2VzLgorCisgICBvCWEgc2V0IG9mIGFjY2VzcyBtYXBzIHdoaWNoIHByb3ZpZGUgYW4gZWZmaWNpZW50CisgICAJaW50ZXJmYWNlIHRvIHRoZSBjb3JlIG9iamVjdCBmb3IgdGhlIHByb2Nlc3NvciBlbmdpbmVzLgorCisgICAqLworCisvKiBiYXNpYyB0eXBlcyAqLworCit0eXBlZGVmIHN0cnVjdCBfY29yZSBjb3JlOwordHlwZWRlZiBzdHJ1Y3QgX2NvcmVfbWFwIGNvcmVfbWFwOworCisvKiBjb25zdHJ1Y3RvciAqLworCitJTkxJTkVfQ09SRVwKKyhjb3JlICopIGNvcmVfY3JlYXRlCisodm9pZCk7CisKK0lOTElORV9DT1JFXAorKGNvcmUgKikgY29yZV9mcm9tX2RldmljZQorKGRldmljZSAqcm9vdCk7CisKK0lOTElORV9DT1JFXAorKHZvaWQpIGNvcmVfaW5pdAorKGNvcmUgKm1lbW9yeSk7CisKKy8qIENvcmUgbWFwIG1hbmFnZW1lbnQ6OjoKKworICAgVGhlIGNvcmUgb2piZWN0IG1hbmFnZXMgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiBhZGRyZXNzIG1hcHM6CisKKyAgIG8gICAgcmF3LW1lbW9yeSAtIHRoZSBhZGRyZXNzIHJhbmdlIGNhbiBiZSBpbXBsZW1lbnRlZCB1c2luZworCWEgc2ltcGxlIGJ5dGUgYXJyYXkuICBObyBkZXZpY2UgbmVlZHMgdG8gYmUgbm90aWZlZCBvZgorCWFueSBhY2Nlc3NlcyB0byB0aGUgc3BlY2lmaWVkIG1lbW9yeSByYW5nZS4KKyAgICAgICAgCisgICBvCWNhbGxiYWNrIC0gQW55IGFjY2VzcyB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgcmFuZ2UKKwlzaG91bGQgYmUgcGFzc2VkIG9uIHRvIHRoZSBhc3NvY2lhdGVkIGRldmljZS4gIFRoYXQgZGV2aWNlCisgICAgICAgIGNhbiBpbiB0dXJuIHJlc29sdmUgdGhlIGFjY2VzcyAtIGhhbmRsaW5nIG9yIGFib3J0aW5nIG9yCisJcmVzdGFydGluZyBpdC4KKworICAgRm9yIGNhbGxiYWNrIG1hcHMgaXQgaXMgcG9zc2libGUgdG8gZnVydGhlciBvcmRlciB0aGVtIGJ5CisgICBzcGVjaWZpeWluZyBzcGVjaWZ5aW5nIGEgY2FsbGJhY2sgbGV2ZWwgKGVnIGNhbGxiYWNrICsgMSkuCisKKyAgIFdoZW4gdGhlIGNvcmUgaXMgcmVzb2x2aW5nIGFuIGFjY2VzcyBpdCBzZWFyY2hlcyBlYWNoIG9mIHRoZSBtYXBzCisgICBpbiBvcmRlci4gIEZpcnN0IHJhdy1tZW1vcnkgYW5kIHRoZW4gY2FsbGJhY2sgbWFwcyAoaW4gYXNzZW5kaW5nCisgICBvcmRlciBvZiBsZXZlbCkuICBUaGlzIHNlYXJjaCBvcmRlciBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgbGF0dGVyCisgICBtYXBzIHRvIG92ZXJsYXAgZWFybGllciBvbmVzLiAgRm9yIGluc3RhbmNlLCBhIGRldmljZSB0aGF0IHdhbnRzIHRvCisgICBiZSBub3RpZmllZCBvZiBhbGwgYWNjZXNzZXMgdGhhdCBhcmUgbm90IGNvdmVyZWQgYnkgcmF3LW1lbW9yeSBtYXBzCisgICBjb3VsZCBhdHRhY2ggaXRzIHNlbGYgd2l0aCBhbiBhZGRyZXNzIHJhbmdlIG9mIHRoZSBlbnRpcmUgYWRkcmVzcworICAgc3BhY2UuCisKKyAgIEluIGFkZGl0aW9uLCBlYWNoIGF0dGFjaGVkIGFkZHJlc3MgbWFwIGFzIGFuIGFzc29jaWF0ZWQgc2V0IG9mCisgICBhY2Nlc3MgYXR0cmlidXRlcyAocmVhZGFibGUsIHdyaXRlYWJsZSwgZXhlY3V0YWJsZSkgd2hpY2ggYXJlCisgICB2ZXJpZmllZCBhcyBwYXJ0IG9mIHJlc29sdmluZyBlYWNoIGFjY2Vzcy4KKworICAgKi8KKworSU5MSU5FX0NPUkVcCisodm9pZCkgY29yZV9hdHRhY2gKKyhjb3JlICptYXAsCisgYXR0YWNoX3R5cGUgYXR0YWNoLAorIGludCBhZGRyZXNzX3NwYWNlLAorIGFjY2Vzc190eXBlIGFjY2VzcywKKyB1bnNpZ25lZF93b3JkIGFkZHIsCisgdW5zaWduZWQgbnJfYnl0ZXMsIC8qIGhvc3QgbGltaXRlZCAqLworIGRldmljZSAqZGV2aWNlKTsgLypjYWxsYmFjay9kZWZhdWx0Ki8KKworLyogQnVnczo6OgorCisgICBBdCBwcmVzZW50IHRoZXJlIGlzIG5vIG1ldGhvZCBmb3IgcmVtb3ZpbmcgYWRkcmVzcyBtYXBzLiAgVGhhdCB3aWxsCisgICBiZSBpbXBsZW1lbnRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgorCisgICBUaGUgb3BlcmF0aW9uIG9mIG1hcHBpbmcgYmV0d2VlbiBhbiBhZGRyZXNzIGFuZCBpdHMgZGVzdGluYXRpb24KKyAgIGRldmljZSBvciBtZW1vcnkgYXJyYXkgaXMgY3VycmVudGx5IGltcGxlbWVudGVkIHVzaW5nIGEgc2ltcGxlCisgICBsaW5rZWQgbGlzdC4gIFRoZSBwb3NpYmlsaXR5IG9mIHJlcGxhY2luZyB0aGlzIGxpc3Qgd2l0aCBhIG1vcmUKKyAgIHBvd2VyZnVsbCBkYXRhIHN0cnVjdHVyZSBleGlzdHMuCisKKyAgICovCisKKworLyogRGV2aWNlOjoKKworICAgVGhlIGRldmljZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjb3JlIG9iamVjdCBpcyBkZXNjcmliZWQKKyAgIHNlcGFyYXRseSBpbiB0aGUgZGV2aWNlcyBzZWN0aW9uLgorCisgICAqLworCisvKiBBY2Nlc3MgbWFwczo6CisKKyAgIFByb3ZpZGluZyBhbiBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgcHJvY2Vzc29yIGVuZ2luZXMgYW5kIHRoZSBjb3JlCisgICBvYmplY3QgYXJlIHRoZSBhY2Nlc3MgbWFwcyAoY29yZV9tYXApLiAgVGhyZWUgYWNjZXNzIG1hcHMgYXJlCisgICBwcm92aWRlZCwgb25lIGZvciBlYWNoIG9mIHRoZSBwb3NzaWJsZSBhY2Nlc3MgcmVxdWVzdHMgdGhhdCBjYW4gYmUKKyAgIGdlbmVyYXRlZCBieSBhIHByb2Nlc3Nvci4KKworICAgbwlyZWFkCisKKyAgIG8gICAgd3JpdGUKKworICAgbyAgICBleGVjdXRlCisKKyAgIEEgcHJvY2Vzc29yIGJlaW5nIGFibGUgdG8gcmVxdWVzdCBhIHJlYWQgKG9yIHdyaXRlKSBvciB3cml0ZQorICAgb3BlcmF0aW9uIHRvIGFueSBvZiB0aGUgbWFwcy4gIFRob3NlIG9wZXJhdGlvbnMgY2FuIGVpdGhlciBiZQorICAgaGlnaGx5IGVmZmljaWVudCAoYnkgc3BlY2lmeWluZyBhIHNwZWNpZmljIHRyYW5zZmVyIHNpemUpIG9yCisgICBnZW5lcmljIChzcGVjaWZ5aW5nIGEgcGFyYW1ldGVyaXplZCBudW1iZXIgb2YgYnl0ZXMpLgorCisgICBJbnRlcm5hbGx5IHRoZSBjb3JlIG9iamVjdCB0YWtlcyB0aGUgcmVxdWVzdCwgZGV0ZXJtaW5lcyB0aGUKKyAgIGFwcHJvcGVyaWF0ZSBhdHRhY2hlZCBhZGRyZXNzIHNwYWNlIHRoYXQgaXQgc2hvdWxkIGhhbmRsZSBpdCBwYXNzZXMKKyAgIGl0IG9uLgorCisgICAqLworCitJTkxJTkVfQ09SRVwKKyhjb3JlX21hcCAqKSBjb3JlX3JlYWRhYmxlCisoY29yZSAqbWVtb3J5KTsKKworSU5MSU5FX0NPUkVcCisoY29yZV9tYXAgKikgY29yZV93cml0ZWFibGUKKyhjb3JlICptZW1vcnkpOworCitJTkxJTkVfQ09SRVwKKyhjb3JlX21hcCAqKSBjb3JlX2V4ZWN1dGFibGUKKyhjb3JlICptZW1vcnkpOworCisvKiBWYXJpYWJsZSBzaXplZCByZWFkL3dyaXRlCisKKyAgIFRyYW5zZmVyICh6ZXJvKSBhIHZhcmlhYmxlIHNpemUgYmxvY2sgb2YgZGF0YSBiZXR3ZWVuIHRoZSBob3N0IGFuZAorICAgdGFyZ2V0IChwb3NzaWJseSBieXRlIHN3YXBwaW5nIGl0KS4gIFNob3VsZCBhbnkgcHJvYmxlbXMgb2NjdXJlLAorICAgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB0cmFuc2ZlcmVkIGlzIHJldHVybmVkLiAqLworCitJTkxJTkVfQ09SRVwKKyh1bnNpZ25lZCkgY29yZV9tYXBfcmVhZF9idWZmZXIKKyhjb3JlX21hcCAqbWFwLAorIHZvaWQgKmJ1ZmZlciwKKyB1bnNpZ25lZF93b3JkIGFkZHIsCisgdW5zaWduZWQgbnJfYnl0ZXMpOworCitJTkxJTkVfQ09SRVwKKyh1bnNpZ25lZCkgY29yZV9tYXBfd3JpdGVfYnVmZmVyCisoY29yZV9tYXAgKm1hcCwKKyBjb25zdCB2b2lkICpidWZmZXIsCisgdW5zaWduZWRfd29yZCBhZGRyLAorIHVuc2lnbmVkIG5yX2J5dGVzKTsKKworCisvKiBGaXhlZCBzaXplZCByZWFkL3dyaXRlCisKKyAgIFRyYW5zZmVyIGEgZml4ZWQgYW1vdXQgb2YgbWVtb3J5IGJldHdlZW4gdGhlIGhvc3QgYW5kIHRhcmdldC4gIFRoZQorICAgbWVtb3J5IGFsd2F5cyBiZWluZyB0cmFuc2xhdGVkIGFuZCB0aGUgb3BlcmF0aW9uIGFsd2F5cyBhYm9ydGluZworICAgc2hvdWxkIGEgcHJvYmxlbSBvY2N1cmUgKi8KKworI2RlZmluZSBERUNMQVJFX0NPUkVfV1JJVEVfTihOKSBcCitJTkxJTkVfQ09SRVwKKyh2b2lkKSBjb3JlX21hcF93cml0ZV8jI04gXAorKGNvcmVfbWFwICptYXAsIFwKKyB1bnNpZ25lZF93b3JkIGFkZHIsIFwKKyB1bnNpZ25lZF8jI04gdmFsLCBcCisgY3B1ICpwcm9jZXNzb3IsIFwKKyB1bnNpZ25lZF93b3JkIGNpYSk7CisKK0RFQ0xBUkVfQ09SRV9XUklURV9OKDEpCitERUNMQVJFX0NPUkVfV1JJVEVfTigyKQorREVDTEFSRV9DT1JFX1dSSVRFX04oNCkKK0RFQ0xBUkVfQ09SRV9XUklURV9OKDgpCitERUNMQVJFX0NPUkVfV1JJVEVfTih3b3JkKQorCisjZGVmaW5lIERFQ0xBUkVfQ09SRV9SRUFEX04oTikgXAorSU5MSU5FX0NPUkVcCisodW5zaWduZWRfIyNOKSBjb3JlX21hcF9yZWFkXyMjTiBcCisoY29yZV9tYXAgKm1hcCwgXAorIHVuc2lnbmVkX3dvcmQgYWRkciwgXAorIGNwdSAqcHJvY2Vzc29yLCBcCisgdW5zaWduZWRfd29yZCBjaWEpOworCitERUNMQVJFX0NPUkVfUkVBRF9OKDEpCitERUNMQVJFX0NPUkVfUkVBRF9OKDIpCitERUNMQVJFX0NPUkVfUkVBRF9OKDQpCitERUNMQVJFX0NPUkVfUkVBRF9OKDgpCitERUNMQVJFX0NPUkVfUkVBRF9OKHdvcmQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9jcHUuYyBiL3NpbS9wcGMvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlODJmMQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvY3B1LmMKQEAgLTAsMCArMSw0MDQgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgX0NQVV9DXworI2RlZmluZSBfQ1BVX0NfCisKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgImlkZWNvZGUuaCIKKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorCitzdHJ1Y3QgX2NwdSB7CisKKyAgLyogdGhlIHJlZ2lzdGVycyAqLworICByZWdpc3RlcnMgcmVnczsKKworICAvKiBjdXJyZW50IGluc3RydWN0aW9uIGFkZHJlc3MgKi8KKyAgdW5zaWduZWRfd29yZCBwcm9ncmFtX2NvdW50ZXI7CisKKyAgLyogdGhlIG1lbW9yeSBtYXBzICovCisgIGNvcmUgKnBoeXNpY2FsOyAvKiBhbGwgb2YgbWVtb3J5ICovCisgIHZtICp2aXJ0dWFsOworICB2bV9pbnN0cnVjdGlvbl9tYXAgKmluc3RydWN0aW9uX21hcDsgLyogaW5zdHJ1Y3Rpb25zICovCisgIHZtX2RhdGFfbWFwICpkYXRhX21hcDsgLyogZGF0YSAqLworCisgIC8qIHRoZSBzeXN0ZW0gdGhpcyBwcm9jZXNzb3IgaXMgY29udGFpbmVkIHdpdGhpbiAqLworICBjcHVfbW9uICptb25pdG9yOworICBvc19lbXVsICpvc19lbXVsYXRpb247CisgIHBzaW0gKnN5c3RlbTsKKyAgZXZlbnRfcXVldWUgKmV2ZW50czsKKyAgaW50IGNwdV9ucjsKKworICAvKiBDdXJyZW50IENQVSBtb2RlbCBpbmZvcm1hdGlvbiAqLworICBtb2RlbF9kYXRhICptb2RlbF9wdHI7CisKKyNpZiBXSVRIX0lERUNPREVfQ0FDSEVfU0laRQorICAvKiBhIGNhY2hlIHRvIHN0b3JlIGNyYWNrZWQgaW5zdHJ1Y3Rpb25zICovCisgIGlkZWNvZGVfY2FjaGUgaWNhY2hlW1dJVEhfSURFQ09ERV9DQUNIRV9TSVpFXTsKKyNlbmRpZgorCisgIC8qIGFueSBpbnRlcnJ1cHQgc3RhdGUgKi8KKyAgaW50ZXJydXB0cyBpbnRzOworCisgIC8qIGFkZHJlc3MgcmVzZXJ2YXRpb246IGtlZXAgdGhlIHBoeXNpY2FsIGFkZHJlc3MgYW5kIHRoZSBjb250ZW50cworICAgICBvZiBtZW1vcnkgYXQgdGhhdCBhZGRyZXNzICovCisgIG1lbW9yeV9yZXNlcnZhdGlvbiByZXNlcnZhdGlvbjsKKworICAvKiBvZmZzZXQgZnJvbSBldmVudCB0aW1lIHRvIHRoaXMgY3B1J3MgaWRlYSBvZiB0aGUgbG9jYWwgdGltZSAqLworICBzaWduZWQ2NCB0aW1lX2Jhc2VfbG9jYWxfdGltZTsKKyAgc2lnbmVkNjQgZGVjcmVtZW50ZXJfbG9jYWxfdGltZTsKKyAgZXZlbnRfZW50cnlfdGFnIGRlY3JlbWVudGVyX2V2ZW50OworCit9OworCitJTkxJTkVfQ1BVXAorKGNwdSAqKQorY3B1X2NyZWF0ZShwc2ltICpzeXN0ZW0sCisJICAgY29yZSAqbWVtb3J5LAorCSAgIGNwdV9tb24gKm1vbml0b3IsCisJICAgb3NfZW11bCAqb3NfZW11bGF0aW9uLAorCSAgIGludCBjcHVfbnIpCit7CisgIGNwdSAqcHJvY2Vzc29yID0gWkFMTE9DKGNwdSk7CisKKyAgLyogY3JlYXRlIHRoZSB2aXJ0dWFsIG1lbW9yeSBtYXAgZnJvbSB0aGUgY29yZSAqLworICBwcm9jZXNzb3ItPnBoeXNpY2FsID0gbWVtb3J5OworICBwcm9jZXNzb3ItPnZpcnR1YWwgPSB2bV9jcmVhdGUobWVtb3J5KTsKKyAgcHJvY2Vzc29yLT5pbnN0cnVjdGlvbl9tYXAgPSB2bV9jcmVhdGVfaW5zdHJ1Y3Rpb25fbWFwKHByb2Nlc3Nvci0+dmlydHVhbCk7CisgIHByb2Nlc3Nvci0+ZGF0YV9tYXAgPSB2bV9jcmVhdGVfZGF0YV9tYXAocHJvY2Vzc29yLT52aXJ0dWFsKTsKKworICBpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDApCisgICAgcHJvY2Vzc29yLT5tb2RlbF9wdHIgPSBtb2RlbF9jcmVhdGUgKHByb2Nlc3Nvcik7CisKKyAgLyogbGluayBiYWNrIHRvIGNvcmUgc3lzdGVtICovCisgIHByb2Nlc3Nvci0+c3lzdGVtID0gc3lzdGVtOworICBwcm9jZXNzb3ItPmV2ZW50cyA9IHBzaW1fZXZlbnRfcXVldWUoc3lzdGVtKTsKKyAgcHJvY2Vzc29yLT5jcHVfbnIgPSBjcHVfbnI7CisgIHByb2Nlc3Nvci0+bW9uaXRvciA9IG1vbml0b3I7CisgIHByb2Nlc3Nvci0+b3NfZW11bGF0aW9uID0gb3NfZW11bGF0aW9uOworCisgIHJldHVybiBwcm9jZXNzb3I7Cit9CisKKworSU5MSU5FX0NQVVwKKyh2b2lkKQorY3B1X2luaXQoY3B1ICpwcm9jZXNzb3IpCit7CisgIG1lbXNldCgmcHJvY2Vzc29yLT5yZWdzLCAwLCBzaXplb2YocHJvY2Vzc29yLT5yZWdzKSk7CisgIC8qIHZtIGluaXQgaXMgZGVsYXllZCB1bnRpbCBhZnRlciB0aGUgZGV2aWNlIHRyZWUgaGFzIGJlZW4gaW5pdCBhcworICAgICB0aGUgZGV2aWNlcyBtYXkgZnVydGhlciBpbml0IHRoZSBjcHUgKi8KKyAgaWYgKENVUlJFTlRfTU9ERUxfSVNTVUUgPiAwKQorICAgIG1vZGVsX2luaXQgKHByb2Nlc3Nvci0+bW9kZWxfcHRyKTsKK30KKworCisvKiBmaW5kIG9uZXMgd2F5IGhvbWUgKi8KKworSU5MSU5FX0NQVVwKKyhwc2ltICopCitjcHVfc3lzdGVtKGNwdSAqcHJvY2Vzc29yKQoreworICByZXR1cm4gcHJvY2Vzc29yLT5zeXN0ZW07Cit9CisKK0lOTElORV9DUFVcCisoaW50KQorY3B1X25yKGNwdSAqcHJvY2Vzc29yKQoreworICByZXR1cm4gcHJvY2Vzc29yLT5jcHVfbnI7Cit9CisKK0lOTElORV9DUFVcCisoY3B1X21vbiAqKQorY3B1X21vbml0b3IoY3B1ICpwcm9jZXNzb3IpCit7CisgIHJldHVybiBwcm9jZXNzb3ItPm1vbml0b3I7Cit9CisKK0lOTElORV9DUFVcCisob3NfZW11bCAqKQorY3B1X29zX2VtdWxhdGlvbihjcHUgKnByb2Nlc3NvcikKK3sKKyAgcmV0dXJuIHByb2Nlc3Nvci0+b3NfZW11bGF0aW9uOworfQorCitJTkxJTkVfQ1BVXAorKG1vZGVsX2RhdGEgKikKK2NwdV9tb2RlbChjcHUgKnByb2Nlc3NvcikKK3sKKyAgcmV0dXJuIHByb2Nlc3Nvci0+bW9kZWxfcHRyOworfQorCisKKy8qIHByb2dyYW0gY291bnRlciBtYW5pcHVsYXRpb24gKi8KKworSU5MSU5FX0NQVVwKKyh2b2lkKQorY3B1X3NldF9wcm9ncmFtX2NvdW50ZXIoY3B1ICpwcm9jZXNzb3IsCisJCQl1bnNpZ25lZF93b3JkIG5ld19wcm9ncmFtX2NvdW50ZXIpCit7CisgIHByb2Nlc3Nvci0+cHJvZ3JhbV9jb3VudGVyID0gbmV3X3Byb2dyYW1fY291bnRlcjsKK30KKworSU5MSU5FX0NQVVwKKyh1bnNpZ25lZF93b3JkKQorY3B1X2dldF9wcm9ncmFtX2NvdW50ZXIoY3B1ICpwcm9jZXNzb3IpCit7CisgIHJldHVybiBwcm9jZXNzb3ItPnByb2dyYW1fY291bnRlcjsKK30KKworCitJTkxJTkVfQ1BVXAorKHZvaWQpCitjcHVfcmVzdGFydChjcHUgKnByb2Nlc3NvciwKKwkgICAgdW5zaWduZWRfd29yZCBuaWEpCit7CisgIEFTU0VSVChwcm9jZXNzb3IgIT0gTlVMTCk7CisgIGNwdV9zZXRfcHJvZ3JhbV9jb3VudGVyKHByb2Nlc3NvciwgbmlhKTsKKyAgcHNpbV9yZXN0YXJ0KHByb2Nlc3Nvci0+c3lzdGVtLCBwcm9jZXNzb3ItPmNwdV9ucik7Cit9CisKK0lOTElORV9DUFVcCisodm9pZCkKK2NwdV9oYWx0KGNwdSAqcHJvY2Vzc29yLAorCSB1bnNpZ25lZF93b3JkIG5pYSwKKwkgc3RvcF9yZWFzb24gcmVhc29uLAorCSBpbnQgc2lnbmFsKQoreworICBBU1NFUlQocHJvY2Vzc29yICE9IE5VTEwpOworICBpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDApCisgICAgbW9kZWxfaGFsdChwcm9jZXNzb3ItPm1vZGVsX3B0cik7CisgIGNwdV9zZXRfcHJvZ3JhbV9jb3VudGVyKHByb2Nlc3NvciwgbmlhKTsKKyAgcHNpbV9oYWx0KHByb2Nlc3Nvci0+c3lzdGVtLCBwcm9jZXNzb3ItPmNwdV9uciwgcmVhc29uLCBzaWduYWwpOworfQorCitFWFRFUk5fQ1BVXAorKHZvaWQpCitjcHVfZXJyb3IoY3B1ICpwcm9jZXNzb3IsCisJICB1bnNpZ25lZF93b3JkIGNpYSwKKwkgIGNvbnN0IGNoYXIgKmZtdCwKKwkgIC4uLikKK3sKKyAgY2hhciBtZXNzYWdlWzEwMjRdOworICB2YV9saXN0IGFwOworCisgIC8qIGZvcm1hdCB0aGUgbWVzc2FnZSAqLworICB2YV9zdGFydChhcCwgZm10KTsKKyAgdnNwcmludGYobWVzc2FnZSwgZm10LCBhcCk7CisgIHZhX2VuZChhcCk7CisKKyAgLyogc2FuaXR5IGNoZWNrICovCisgIGlmIChzdHJsZW4obWVzc2FnZSkgPj0gc2l6ZW9mKG1lc3NhZ2UpKQorICAgIGVycm9yKCJjcHVfZXJyb3I6IGJ1ZmZlciBvdmVyZmxvdyIpOworCisgIGlmIChwcm9jZXNzb3IgIT0gTlVMTCkgeworICAgIHByaW50Zl9maWx0ZXJlZCgiY3B1ICVkLCBjaWEgMHglbHg6ICVzXG4iLAorCQkgICAgcHJvY2Vzc29yLT5jcHVfbnIgKyAxLCAodW5zaWduZWQgbG9uZyljaWEsIG1lc3NhZ2UpOworICAgIGNwdV9oYWx0KHByb2Nlc3NvciwgY2lhLCB3YXNfc2lnbmFsbGVkLCAtMSk7CisgIH0KKyAgZWxzZSB7CisgICAgZXJyb3IoImNwdTogJXMiLCBtZXNzYWdlKTsKKyAgfQorfQorCisKKy8qIFRoZSBwcm9jZXNzb3JzIGxvY2FsIGNvbmNlcHQgb2YgdGltZSAqLworCitJTkxJTkVfQ1BVXAorKHNpZ25lZDY0KQorY3B1X2dldF90aW1lX2Jhc2UoY3B1ICpwcm9jZXNzb3IpCit7CisgIHJldHVybiAoZXZlbnRfcXVldWVfdGltZShwcm9jZXNzb3ItPmV2ZW50cykKKwkgIC0gcHJvY2Vzc29yLT50aW1lX2Jhc2VfbG9jYWxfdGltZSk7Cit9CisKK0lOTElORV9DUFVcCisodm9pZCkKK2NwdV9zZXRfdGltZV9iYXNlKGNwdSAqcHJvY2Vzc29yLAorCQkgIHNpZ25lZDY0IHRpbWVfYmFzZSkKK3sKKyAgcHJvY2Vzc29yLT50aW1lX2Jhc2VfbG9jYWxfdGltZSA9IChldmVudF9xdWV1ZV90aW1lKHByb2Nlc3Nvci0+ZXZlbnRzKQorCQkJCSAgICAgLSB0aW1lX2Jhc2UpOworfQorCitJTkxJTkVfQ1BVXAorKHNpZ25lZDMyKQorY3B1X2dldF9kZWNyZW1lbnRlcihjcHUgKnByb2Nlc3NvcikKK3sKKyAgcmV0dXJuIChwcm9jZXNzb3ItPmRlY3JlbWVudGVyX2xvY2FsX3RpbWUKKwkgIC0gZXZlbnRfcXVldWVfdGltZShwcm9jZXNzb3ItPmV2ZW50cykpOworfQorCitTVEFUSUNfSU5MSU5FX0NQVVwKKyh2b2lkKQorY3B1X2RlY3JlbWVudF9ldmVudCh2b2lkICpkYXRhKQoreworICBjcHUgKnByb2Nlc3NvciA9IChjcHUqKWRhdGE7CisgIHByb2Nlc3Nvci0+ZGVjcmVtZW50ZXJfZXZlbnQgPSBOVUxMOworICBkZWNyZW1lbnRlcl9pbnRlcnJ1cHQocHJvY2Vzc29yKTsKK30KKworSU5MSU5FX0NQVVwKKyh2b2lkKQorY3B1X3NldF9kZWNyZW1lbnRlcihjcHUgKnByb2Nlc3NvciwKKwkJICAgIHNpZ25lZDMyIGRlY3JlbWVudGVyKQoreworICBzaWduZWQ2NCBvbGRfZGVjcmVtZW50ZXIgPSBjcHVfZ2V0X2RlY3JlbWVudGVyKHByb2Nlc3Nvcik7CisgIGV2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUocHJvY2Vzc29yLT5ldmVudHMsIHByb2Nlc3Nvci0+ZGVjcmVtZW50ZXJfZXZlbnQpOworICBwcm9jZXNzb3ItPmRlY3JlbWVudGVyX2V2ZW50ID0gTlVMTDsKKyAgcHJvY2Vzc29yLT5kZWNyZW1lbnRlcl9sb2NhbF90aW1lID0gKGV2ZW50X3F1ZXVlX3RpbWUocHJvY2Vzc29yLT5ldmVudHMpCisJCQkJICAgICAgICsgZGVjcmVtZW50ZXIpOworICBpZiAoZGVjcmVtZW50ZXIgPCAwICYmIG9sZF9kZWNyZW1lbnRlciA+PSAwKQorICAgIC8qIEEgZGVjcmVtZW50ZXIgaW50ZXJydXB0IG9jY3VyZXMgaWYgdGhlIHNpZ24gb2YgdGhlIGRlY3JlbWVudAorICAgICAgIHJlZ2lzdGVyIGlzIGNoYW5nZWQgZnJvbSBwb3NpdGl2ZSB0byBuZWdhdGl2ZSBieSB0aGUgbG9hZAorICAgICAgIGluc3RydWN0aW9uICovCisgICAgZGVjcmVtZW50ZXJfaW50ZXJydXB0KHByb2Nlc3Nvcik7CisgIGVsc2UgaWYgKGRlY3JlbWVudGVyID49IDApCisgICAgcHJvY2Vzc29yLT5kZWNyZW1lbnRlcl9ldmVudCA9IGV2ZW50X3F1ZXVlX3NjaGVkdWxlKHByb2Nlc3Nvci0+ZXZlbnRzLAorCQkJCQkJCWRlY3JlbWVudGVyLAorCQkJCQkJCWNwdV9kZWNyZW1lbnRfZXZlbnQsCisJCQkJCQkJcHJvY2Vzc29yKTsKK30KKworCisjaWYgV0lUSF9JREVDT0RFX0NBQ0hFX1NJWkUKKy8qIGFsbG93IGFjY2VzcyB0byB0aGUgY3B1J3MgaW5zdHJ1Y3Rpb24gY2FjaGUgKi8KK0lOTElORV9DUFVcCisoaWRlY29kZV9jYWNoZSAqKQorY3B1X2ljYWNoZV9lbnRyeShjcHUgKnByb2Nlc3NvciwKKwkJIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICByZXR1cm4gJnByb2Nlc3Nvci0+aWNhY2hlW2NpYSAvIDQgJSBXSVRIX0lERUNPREVfQ0FDSEVfU0laRV07Cit9CisKKworSU5MSU5FX0NQVVwKKyh2b2lkKQorY3B1X2ZsdXNoX2ljYWNoZShjcHUgKnByb2Nlc3NvcikKK3sKKyAgaW50IGk7CisgIC8qIGZvcmNlIGFsbCBhZGRyZXNzZXMgdG8gMHhmZi4uLiBzbyB0aGF0IHRoZXkgbmV2ZXIgaGl0ICovCisgIGZvciAoaSA9IDA7IGkgPCBXSVRIX0lERUNPREVfQ0FDSEVfU0laRTsgaSsrKQorICAgIHByb2Nlc3Nvci0+aWNhY2hlW2ldLmFkZHJlc3MgPSBNQVNLKDAsIDYzKTsKK30KKyNlbmRpZgorCisKKy8qIGFkZHJlc3MgbWFwIHJldmVsYXRpb24gKi8KKworSU5MSU5FX0NQVVwKKyh2bV9pbnN0cnVjdGlvbl9tYXAgKikKK2NwdV9pbnN0cnVjdGlvbl9tYXAoY3B1ICpwcm9jZXNzb3IpCit7CisgIHJldHVybiBwcm9jZXNzb3ItPmluc3RydWN0aW9uX21hcDsKK30KKworSU5MSU5FX0NQVVwKKyh2bV9kYXRhX21hcCAqKQorY3B1X2RhdGFfbWFwKGNwdSAqcHJvY2Vzc29yKQoreworICByZXR1cm4gcHJvY2Vzc29yLT5kYXRhX21hcDsKK30KKworSU5MSU5FX0NQVVwKKyh2b2lkKQorY3B1X3BhZ2VfdGxiX2ludmFsaWRhdGVfZW50cnkoY3B1ICpwcm9jZXNzb3IsCisJCQkgICAgICB1bnNpZ25lZF93b3JkIGVhKQoreworICB2bV9wYWdlX3RsYl9pbnZhbGlkYXRlX2VudHJ5KHByb2Nlc3Nvci0+dmlydHVhbCwgZWEpOworfQorCitJTkxJTkVfQ1BVXAorKHZvaWQpCitjcHVfcGFnZV90bGJfaW52YWxpZGF0ZV9hbGwoY3B1ICpwcm9jZXNzb3IpCit7CisgIHZtX3BhZ2VfdGxiX2ludmFsaWRhdGVfYWxsKHByb2Nlc3Nvci0+dmlydHVhbCk7Cit9CisKKworLyogaW50ZXJydXB0IGFjY2VzcyAqLworCitJTkxJTkVfQ1BVXAorKGludGVycnVwdHMgKikKK2NwdV9pbnRlcnJ1cHRzKGNwdSAqcHJvY2Vzc29yKQoreworICByZXR1cm4gJnByb2Nlc3Nvci0+aW50czsKK30KKworCisKKy8qIHJlc2VydmF0aW9uIGFjY2VzcyAqLworCitJTkxJTkVfQ1BVXAorKG1lbW9yeV9yZXNlcnZhdGlvbiAqKQorY3B1X3Jlc2VydmF0aW9uKGNwdSAqcHJvY2Vzc29yKQoreworICByZXR1cm4gJnByb2Nlc3Nvci0+cmVzZXJ2YXRpb247Cit9CisKKworLyogcmVnaXN0ZXIgYWNjZXNzICovCisKK0lOTElORV9DUFVcCisocmVnaXN0ZXJzICopCitjcHVfcmVnaXN0ZXJzKGNwdSAqcHJvY2Vzc29yKQoreworICByZXR1cm4gJnByb2Nlc3Nvci0+cmVnczsKK30KKworSU5MSU5FX0NQVVwKKyh2b2lkKQorY3B1X3N5bmNocm9uaXplX2NvbnRleHQoY3B1ICpwcm9jZXNzb3IsCisJCQl1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyNpZiAoV0lUSF9JREVDT0RFX0NBQ0hFX1NJWkUpCisgIC8qIGtpbGwgb2YgdGhlIGNhY2hlICovCisgIGNwdV9mbHVzaF9pY2FjaGUocHJvY2Vzc29yKTsKKyNlbmRpZgorCisgIC8qIHVwZGF0ZSB2aXJ0dWFsIG1lbW9yeSAqLworICB2bV9zeW5jaHJvbml6ZV9jb250ZXh0KHByb2Nlc3Nvci0+dmlydHVhbCwKKwkJCSBwcm9jZXNzb3ItPnJlZ3Muc3ByLAorCQkJIHByb2Nlc3Nvci0+cmVncy5zciwKKwkJCSBwcm9jZXNzb3ItPnJlZ3MubXNyLAorCQkJIHByb2Nlc3NvciwgY2lhKTsKK30KKworCisvKiBtaWdodCBhZ2FpbiBiZSB1c2VmdWwgb25lIGRheSAqLworCitJTkxJTkVfQ1BVXAorKHZvaWQpCitjcHVfcHJpbnRfaW5mbyhjcHUgKnByb2Nlc3NvciwgaW50IHZlcmJvc2UpCit7Cit9CisKKyNlbmRpZiAvKiBfQ1BVX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2NwdS5oIGIvc2ltL3BwYy9jcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDBmNTgxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9jcHUuaApAQCAtMCwwICsxLDI1NCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfQ1BVX0hfCisjZGVmaW5lIF9DUFVfSF8KKworI2luY2x1ZGUgImJhc2ljcy5oIgorI2luY2x1ZGUgInJlZ2lzdGVycy5oIgorI2luY2x1ZGUgImRldmljZS5oIgorI2luY2x1ZGUgImNvcmVmaWxlLmgiCisjaW5jbHVkZSAidm0uaCIKKyNpbmNsdWRlICJldmVudHMuaCIKKyNpbmNsdWRlICJpbnRlcnJ1cHRzLmgiCisjaW5jbHVkZSAicHNpbS5oIgorI2luY2x1ZGUgImlkZWNvZGUuaCIKKyNpbmNsdWRlICJpdGFibGUuaCIKKyNpbmNsdWRlICJvc19lbXVsLmgiCisjaW5jbHVkZSAibW9uLmgiCisjaW5jbHVkZSAibW9kZWwuaCIKKworI2lmbmRlZiBDT05TVF9BVFRSSUJVVEUKKyNkZWZpbmUgQ09OU1RfQVRUUklCVVRFIF9fYXR0cmlidXRlX18oKF9fY29uc3RfXykpCisjZW5kaWYKKworLyogdHlwZWRlZiBzdHJ1Y3QgX2NwdSBjcHU7CisKKyAgIERlY2xhcmVkIGluIGJhc2ljcy5oIGJlY2F1c2UgaXQgaXMgdXNlZCBvcGFxdWVseSB0aHJvdWdob3V0IHRoZQorICAgY29kZSAqLworCisKKy8qIENyZWF0ZSBhIGNwdSBvYmplY3QgKi8KKworSU5MSU5FX0NQVVwKKyhjcHUgKikgY3B1X2NyZWF0ZQorKHBzaW0gKnN5c3RlbSwKKyBjb3JlICptZW1vcnksCisgY3B1X21vbiAqbW9uaXRvciwKKyBvc19lbXVsICpjcHVfZW11bGF0aW9uLAorIGludCBjcHVfbnIpOworCitJTkxJTkVfQ1BVXAorKHZvaWQpIGNwdV9pbml0CisoY3B1ICpwcm9jZXNzb3IpOworCisvKiBGaW5kIG91ciB3YXkgaG9tZSAqLworCitJTkxJTkVfQ1BVXAorKHBzaW0gKikgY3B1X3N5c3RlbQorKGNwdSAqcHJvY2Vzc29yKSBDT05TVF9BVFRSSUJVVEU7CisKK0lOTElORV9DUFVcCisoY3B1X21vbiAqKSBjcHVfbW9uaXRvcgorKGNwdSAqcHJvY2Vzc29yKSBDT05TVF9BVFRSSUJVVEU7CisKK0lOTElORV9DUFVcCisob3NfZW11bCAqKSBjcHVfb3NfZW11bGF0aW9uCisoY3B1ICpwcm9jZXNzb3IpOworCitJTkxJTkVfQ1BVXAorKGludCkgY3B1X25yCisoY3B1ICpwcm9jZXNzb3IpIENPTlNUX0FUVFJJQlVURTsKKworCisvKiBtYW5pcHVsYXRlIHRoZSBwcm9jZXNzb3JzIHByb2dyYW0gY291bnRlciBhbmQgZXhlY3V0aW9uIHN0YXRlLgorCisgICBUaGUgcHJvZ3JhbSBjb3VudGVyIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVnaXN0ZXIgZmlsZS4gIEluc3RlYWQKKyAgIGl0IGlzIGV4dHJhY3RlZCBhbmQgdGhlbiBsYXRlciByZXN0b3JlZCAoc2V0LCByZXNldCwgaGFsdCkuICBUaGlzCisgICBpcyB0byBnaXZlIHRoZSB1c2VyIG9mIHRoZSBjcHUgKGFuZCB0aGUgY29tcGlsZXIpIHRoZSBjaGFuY2UgdG8KKyAgIG1pbmltaXplIHRoZSBuZWVkIHRvIGxvYWQvc3RvcmUgdGhlIGNwdSdzIFBDIHZhbHVlLiAgKEVzcGVjaWFsbHkgaW4KKyAgIHRoZSBjYXNlIG9mIGEgc2luZ2xlIHByb2Nlc3NvcikgKi8KKworSU5MSU5FX0NQVVwKKyh2b2lkKSBjcHVfc2V0X3Byb2dyYW1fY291bnRlcgorKGNwdSAqcHJvY2Vzc29yLAorIHVuc2lnbmVkX3dvcmQgbmV3X3Byb2dyYW1fY291bnRlcik7CisKK0lOTElORV9DUFVcCisodW5zaWduZWRfd29yZCkgY3B1X2dldF9wcm9ncmFtX2NvdW50ZXIKKyhjcHUgKnByb2Nlc3Nvcik7CisKK0lOTElORV9DUFVcCisodm9pZCkgY3B1X3Jlc3RhcnQKKyhjcHUgKnByb2Nlc3NvciwKKyB1bnNpZ25lZF93b3JkIG5pYSk7CisKK0lOTElORV9DUFVcCisodm9pZCkgY3B1X2hhbHQKKyhjcHUgKnByb2Nlc3NvciwKKyB1bnNpZ25lZF93b3JkIG5pYSwKKyBzdG9wX3JlYXNvbiByZWFzb24sCisgaW50IHNpZ25hbCk7CisKK0VYVEVSTl9DUFVcCisodm9pZCkgY3B1X2Vycm9yCisoY3B1ICpwcm9jZXNzb3IsCisgdW5zaWduZWRfd29yZCBjaWEsCisgY29uc3QgY2hhciAqZm10LAorIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworCisKKy8qIFRoZSBwcm9jZXNzb3JzIGxvY2FsIGNvbmNlcHQgb2YgdGltZSAqLworCitJTkxJTkVfQ1BVXAorKHNpZ25lZDY0KSBjcHVfZ2V0X3RpbWVfYmFzZQorKGNwdSAqcHJvY2Vzc29yKTsKKworSU5MSU5FX0NQVVwKKyh2b2lkKSBjcHVfc2V0X3RpbWVfYmFzZQorKGNwdSAqcHJvY2Vzc29yLAorIHNpZ25lZDY0IHRpbWVfYmFzZSk7CisKK0lOTElORV9DUFVcCisoc2lnbmVkMzIpIGNwdV9nZXRfZGVjcmVtZW50ZXIKKyhjcHUgKnByb2Nlc3Nvcik7CisKK0lOTElORV9DUFVcCisodm9pZCkgY3B1X3NldF9kZWNyZW1lbnRlcgorKGNwdSAqcHJvY2Vzc29yLAorIHNpZ25lZDMyIGRlY3JlbWVudGVyKTsKKworCisjaWYgV0lUSF9JREVDT0RFX0NBQ0hFX1NJWkUKKy8qIFJldHVybiB0aGUgY2FjaGUgZW50cnkgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBDSUEuICBObyBndWFyZW50ZWUKKyAgIHRoYXQgdGhlIGNhY2hlIGVudHJ5IGFjdHVhbGx5IGNvbnRhaW5zIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhhdAorICAgYWRkcmVzcyAqLworCitJTkxJTkVfQ1BVXAorKGlkZWNvZGVfY2FjaGUpICpjcHVfaWNhY2hlX2VudHJ5CisoY3B1ICpwcm9jZXNzb3IsCisgdW5zaWduZWRfd29yZCBjaWEpOworCitJTkxJTkVfQ1BVXAorKHZvaWQpIGNwdV9mbHVzaF9pY2FjaGUKKyhjcHUgKnByb2Nlc3Nvcik7CisjZW5kaWYKKworCisvKiByZXZlYWwgdGhlIHByb2Nlc3NvcnMgVk06CisKKyAgIEF0IGZpcnN0IHNpZ2h0IGl0IG1heSBzZWVtIGJldHRlciB0bywgaW5zdGVhZCBvZiBleHBvc2luZyB0aGUgY3B1J3MKKyAgIGlubmVyIHZtIG1hcHMsIHRvIGhhdmUgdGhlIGNwdSBpdHMgc2VsZiBwcm92aWRlIG1lbW9yeSBtYW5pcHVsYXRpb24KKyAgIGZ1bmN0aW9ucy4gKGVnIGNwdV9pbnN0cnVjdGlvbl9mZXRjaCgpIGNwdV9kYXRhX3JlYWRfNCgpKQorCisgICBVbmZvcnR1bmF0bHkgaW4gYWRkaXRpb24gdG8gdGhlc2UgZnVuY3Rpb25zIGlzIHRoZSBuZWVkIChmb3IgdGhlCisgICBkZWJ1Z2dlcikgdG8gYmUgYWJsZSB0byByZWFkL3dyaXRlIHRvIG1lbW9yeSBpbiB3YXlzIHRoYXQgdmlvbGF0ZQorICAgdGhlIHZtIHByb3RlY3Rpb24gKGVnIHN0b3JlIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gaW4gdGhlCisgICBpbnN0cnVjdGlvbiBtYXApLiAqLworCitJTkxJTkVfQ1BVXAorKHZtX2RhdGFfbWFwICopIGNwdV9kYXRhX21hcAorKGNwdSAqcHJvY2Vzc29yKTsKKworSU5MSU5FX0NQVVwKKyh2bV9pbnN0cnVjdGlvbl9tYXAgKikgY3B1X2luc3RydWN0aW9uX21hcAorKGNwdSAqcHJvY2Vzc29yKTsKKworSU5MSU5FX0NQVVwKKyh2b2lkKSBjcHVfcGFnZV90bGJfaW52YWxpZGF0ZV9lbnRyeQorKGNwdSAqcHJvY2Vzc29yLAorIHVuc2lnbmVkX3dvcmQgZWEpOworCitJTkxJTkVfQ1BVXAorKHZvaWQpIGNwdV9wYWdlX3RsYl9pbnZhbGlkYXRlX2FsbAorKGNwdSAqcHJvY2Vzc29yKTsKKworCisvKiByZXZlYWwgdGhlIHByb2Nlc3NvcnMgaW50ZXJydXB0IHN0YXRlICovCisKK0lOTElORV9DUFVcCisoaW50ZXJydXB0cyAqKSBjcHVfaW50ZXJydXB0cworKGNwdSAqcHJvY2Vzc29yKTsKKworCisvKiBncmFudCBhY2Nlc3MgdG8gdGhlIHJlc2VydmF0aW9uIGluZm9ybWF0aW9uICovCisKK3R5cGVkZWYgc3RydWN0IF9tZW1vcnlfcmVzZXJ2YXRpb24geworICBpbnQgdmFsaWQ7CisgIHVuc2lnbmVkX3dvcmQgYWRkcjsKKyAgdW5zaWduZWRfd29yZCBkYXRhOworfSBtZW1vcnlfcmVzZXJ2YXRpb247CisKK0lOTElORV9DUFVcCisobWVtb3J5X3Jlc2VydmF0aW9uICopIGNwdV9yZXNlcnZhdGlvbgorKGNwdSAqcHJvY2Vzc29yKTsKKworCisvKiBSZWdpc3RlcnM6CisKKyAgIFRoaXMgbW9kZWwgZXhwbG9pdHMgdGhlIFBvd2VyUEMncyByZXF1aXJlbWVudCBmb3IgYSBzeW5jaHJvbml6YXRpb24KKyAgIHRvIG9jY3VyZSBhZnRlciAob3IgYmVmb3JlKSB0aGUgdXBkYXRlIG9mIGFueSBjb250ZXh0IGNvbnRyb2xsaW5nCisgICByZWdpc3Rlci4gIEFsbCBjb250ZXh0IHN5bmMgcG9pbnRzIG11c3QgY2FsbCB0aGUgc3luYyBmdW5jdGlvbgorICAgYmVsb3cgdG8gd2hlbiBldmVyIGEgc3luY2hyb25pemF0aW9uIHBvaW50IGlzIHJlYWNoZWQgKi8KKworSU5MSU5FX0NQVVwKKyhyZWdpc3RlcnMgKikgY3B1X3JlZ2lzdGVycworKGNwdSAqcHJvY2Vzc29yKSBDT05TVF9BVFRSSUJVVEU7CisKK0lOTElORV9DUFVcCisodm9pZCkgY3B1X3N5bmNocm9uaXplX2NvbnRleHQKKyhjcHUgKnByb2Nlc3NvciwKKyB1bnNpZ25lZF93b3JkIGNpYSk7CisKKyNkZWZpbmUgSVNfUFJPQkxFTV9TVEFURShQUk9DRVNTT1IpIFwKKyhDVVJSRU5UX0VOVklST05NRU5UID09IE9QRVJBVElOR19FTlZJUk9OTUVOVCBcCisgPyAoY3B1X3JlZ2lzdGVycyhQUk9DRVNTT1IpLT5tc3IgJiBtc3JfcHJvYmxlbV9zdGF0ZSkgXAorIDogMSkKKworI2RlZmluZSBJU182NEJJVF9NT0RFKFBST0NFU1NPUikgXAorKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCBcCisgPyAoQ1VSUkVOVF9FTlZJUk9OTUVOVCA9PSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQgXAorICAgID8gKGNwdV9yZWdpc3RlcnMoUFJPQ0VTU09SKS0+bXNyICYgbXNyXzY0Yml0X21vZGUpIFwKKyAgICA6IDEpIFwKKyA6IDApCisKKyNkZWZpbmUgSVNfRlBfQVZBSUxBQkxFKFBST0NFU1NPUikgXAorKENVUlJFTlRfRU5WSVJPTk1FTlQgPT0gT1BFUkFUSU5HX0VOVklST05NRU5UIFwKKyA/IChjcHVfcmVnaXN0ZXJzKFBST0NFU1NPUiktPm1zciAmIG1zcl9mbG9hdGluZ19wb2ludF9hdmFpbGFibGUpIFwKKyA6IDEpCisKKworCitJTkxJTkVfQ1BVXAorKHZvaWQpIGNwdV9wcmludF9pbmZvCisoY3B1ICpwcm9jZXNzb3IsCisgaW50IHZlcmJvc2UpOworCitJTkxJTkVfQ1BVXAorKG1vZGVsX2RhdGEgKikgY3B1X21vZGVsCisoY3B1ICpwcm9jZXNzb3IpIENPTlNUX0FUVFJJQlVURTsKKworCisjaWYgKENQVV9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKKyMgaW5jbHVkZSAiY3B1LmMiCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vcHBjL2RjLWNvbXBsZXggYi9zaW0vcHBjL2RjLWNvbXBsZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzNjFlYwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZGMtY29tcGxleApAQCAtMCwwICsxLDU4IEBACisjCisjICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCithcnJheSxub3JtYWw6ICAgICAgICAwOiA1OiAwOiA1OgorYXJyYXksbm9ybWFsOiAgICAgICAyMTozMTozMjotMTpPRSxMUixBQSxSYyxMSzoKKyMjCisjIyBCcmFuY2ggQ29uZGl0aW9uYWwgaW5zdHJ1Y3Rpb24gLSBFeHBhbmQgQk97MDo0fSBvbmx5LCBpZ25vcmUgQk97NX0KKyMjCithcnJheSxleHBhbmQtZm9yY2VkOiA2OiA5OiA2OiA5OkJPOiAgICAgICAgICAgIDB4ZmMwMDAwMDA6MHg0MDAwMDAwMAorIyMKKyMjIEV4cGFuZCBSQSBvbiBlcXVhbGl0eSB3aXRoIDAgaW4gQWRkIGluc3RydWN0aW9ucyB3ZXJlIGlmKFJBPT0wKSBhcHBlYXJzLgorIyMKKyMgQWRkIEltbWVkaWF0ZQorYXJyYXksYm9vbGVhbjogICAgICAxMToxNToxMToxNTpSQTogICAgICAgICAgICAweGZjMDAwMDAwOjB4MzgwMDAwMDA6MAorIyBBZGQgSW1tZWRpYXRlIFNoaWZ0ZWQKK2FycmF5LGJvb2xlYW46ICAgICAgMTE6MTU6MTE6MTU6UkE6ICAgICAgICAgICAgMHhmYzAwMDAwMDoweDNjMDAwMDAwOjAKKyMjCisjIyBEaXR0byBmb3IgaGlnaCBmcmVxdWVuY3kgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMuCisjIworIyBTdG9yZSBCeXRlCisjYXJyYXksYm9vbGVhbjogICAgICAxMToxNToxMToxNTpSQTogICAgICAgICAgICAweGZjMDAwMDAwOjB4OTgwMDAwMDA6MAorIyBTdG9yZSBXb3JkCisjYXJyYXksYm9vbGVhbjogICAgICAxMToxNToxMToxNTpSQTogICAgICAgICAgICAweGZjMDAwMDAwOjB4OTAwMDAwMDA6MAorIyBMb2FkIFdvcmQgYW5kIFplcm8KKyNhcnJheSxib29sZWFuOiAgICAgIDExOjE1OjExOjE1OlJBOiAgICAgICAgICAgIDB4ZmMwMDAwMDA6MHg4MDAwMDAwMDowCisjIworIyMgTW92ZSB0by9mcm9tIFNQUiBpbnN0cnVjdGlvbnMgLSBMUj04IGlzIG11bmdlZCBpbnRvIDB4MTAwID09IDI1NgorIyMKKyNhcnJheSxib29sZWFuOiAgICAgIDExOjIwOjExOjIwOlNQUjogICAgICAgICAgIDB4ZmMwMDA3ZmY6MHg3YzAwMDNhNjoyNTYKKyNhcnJheSxib29sZWFuOiAgICAgIDExOjIwOjExOjIwOlNQUjogICAgICAgICAgIDB4ZmMwMDA3ZmY6MHg3YzAwMDJhNjoyNTYKKyMjCisjIyBDb21wYXJlIEltbWVkaWF0ZSBpbnN0cnVjdGlvbiAtIHNlcGFyYXRlIG91dCBMID09IDAgYW5kIEwgPT0gMQorIyMKKyMgQ29tcGFyZSBJbW1lZGlhdGUKKyNhcnJheSxub3JtYWw6ICAgICAgMTA6MTE6MTA6MTE6TDogICAgICAgICAgICAgMHhmYzAwMDAwMDoweDJjMDAwMDAwOjAKKyMjCisjIyBNb3ZlIHRvL2Zyb20gU1BSIGluc3RydWN0aW9ucyAtIHNlcGFyYXRlIG91dCBMUiBjYXNlCisjIworIyBNb3ZlIHRvIFNQUgorYXJyYXksYm9vbGVhbjogICAgICAxMToyMDoxMToyMDpTUFI6ICAgICAgICAgICAweGZjMDAwN2ZmOjB4N2MwMDAzYTY6MjU2CisjIE1vdmUgZnJvbSBTUFIKK2FycmF5LGJvb2xlYW46ICAgICAgMTE6MjA6MTE6MjA6U1BSOiAgICAgICAgICAgMHhmYzAwMDdmZjoweDdjMDAwMmE2OjI1NgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9kYy1zaW1wbGUgYi9zaW0vcHBjL2RjLXNpbXBsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWE4MjNlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9kYy1zaW1wbGUKQEAgLTAsMCArMSwyNSBAQAorIworIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisjCisjICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIworIyBDcmVhdGUgYSB0d28gbGV2ZWwgc3dpdGNoIHN0YXRlbWVudC4gIFRoZSBmaXJzdCBsZXZlbCBicmFuY2hlcyBvbiBiaXRzCisjIDAuLjUgd2hpbGUgdGhlIHNlY29uZCBsZXZlbCBicmFuY2hlcyBvbiBiaXRzIDIxLi4zMQorIworc3dpdGNoOiAwOiA1OiAwOiA1Citzd2l0Y2g6MjE6MzEKZGlmZiAtLWdpdCBhL3NpbS9wcGMvZGMtc3R1cGlkIGIvc2ltL3BwYy9kYy1zdHVwaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzOGJkYgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZGMtc3R1cGlkCkBAIC0wLDAgKzEsNTggQEAKKyMKKyMgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorIworIyAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKK2FycmF5LG5vcm1hbDogMDogNTogMDogNToKK2FycmF5LG5vcm1hbDoyMTozMTozMjotMTpPRSxMUixBQSxSYyxMSzoKKyMjCisjIyBCcmFuY2ggQ29uZGl0aW9uYWwgaW5zdHJ1Y3Rpb24gLSBFeHBhbmQgQk97MDo0fSBvbmx5LCBpZ25vcmUgQk97NX0KKyMjCithcnJheSxleHBhbmQtZm9yY2VkOiA2OiA5OiA2OiA5OkJPOiAgICAgICAgICAgIDB4ZmMwMDAwMDA6MHg0MDAwMDAwMAorIyMKKyMjIEV4cGFuZCBSQSBvbiBlcXVhbGl0eSB3aXRoIDAgaW4gQWRkIGluc3RydWN0aW9ucyB3ZXJlIGlmKFJBPT0wKSBhcHBlYXJzLgorIyMKKyMgQWRkIEltbWVkaWF0ZQorI2FycmF5LGJvb2xlYW46ICAgICAgMTE6MTU6MTE6MTU6UkE6ICAgICAgICAgICAgMHhmYzAwMDAwMDoweDM4MDAwMDAwOjAKKyMgQWRkIEltbWVkaWF0ZSBTaGlmdGVkCisjYXJyYXksYm9vbGVhbjogICAgICAxMToxNToxMToxNTpSQTogICAgICAgICAgICAweGZjMDAwMDAwOjB4M2MwMDAwMDA6MAorIyMKKyMjIERpdHRvIGZvciBoaWdoIGZyZXF1ZW5jeSBsb2FkL3N0b3JlIGluc3RydWN0aW9ucy4KKyMjCisjIFN0b3JlIEJ5dGUKKyNhcnJheSxib29sZWFuOiAgICAgIDExOjE1OjExOjE1OlJBOiAgICAgICAgICAgIDB4ZmMwMDAwMDA6MHg5ODAwMDAwMDowCisjIFN0b3JlIFdvcmQKKyNhcnJheSxib29sZWFuOiAgICAgIDExOjE1OjExOjE1OlJBOiAgICAgICAgICAgIDB4ZmMwMDAwMDA6MHg5MDAwMDAwMDowCisjIExvYWQgV29yZCBhbmQgWmVybworI2FycmF5LGJvb2xlYW46ICAgICAgMTE6MTU6MTE6MTU6UkE6ICAgICAgICAgICAgMHhmYzAwMDAwMDoweDgwMDAwMDAwOjAKKyMjCisjIyBNb3ZlIHRvL2Zyb20gU1BSIGluc3RydWN0aW9ucyAtIExSPTggaXMgbXVuZ2VkIGludG8gMHgxMDAgPT0gMjU2CisjIworI2FycmF5LGJvb2xlYW46ICAgICAgMTE6MjA6MTE6MjA6U1BSOiAgICAgICAgICAgMHhmYzAwMDdmZjoweDdjMDAwM2E2OjI1NgorI2FycmF5LGJvb2xlYW46ICAgICAgMTE6MjA6MTE6MjA6U1BSOiAgICAgICAgICAgMHhmYzAwMDdmZjoweDdjMDAwMmE2OjI1NgorIyMKKyMjIENvbXBhcmUgSW1tZWRpYXRlIGluc3RydWN0aW9uIC0gc2VwYXJhdGUgb3V0IEwgPT0gMCBhbmQgTCA9PSAxCisjIworIyBDb21wYXJlIEltbWVkaWF0ZQorI2FycmF5LGJvb2xlYW46ICAgICAgMTA6MTE6MTA6MTE6TDogICAgICAgICAgICAgMHhmYzAwMDAwMDoweDJjMDAwMDAwOjAKKyMjCisjIyBNb3ZlIHRvL2Zyb20gU1BSIGluc3RydWN0aW9ucyAtIHNlcGFyYXRlIG91dCBMUiBjYXNlCisjIworIyBNb3ZlIHRvIFNQUgorI2FycmF5LGJvb2xlYW46ICAgICAgMTE6MjA6MTE6MjA6U1BSOiAgICAgICAgICAgMHhmYzAwMDdmZjoweDdjMDAwM2E2OjI1NgorIyBNb3ZlIGZyb20gU1BSCisjYXJyYXksYm9vbGVhbjogICAgICAxMToyMDoxMToyMDpTUFI6ICAgICAgICAgICAweGZjMDAwN2ZmOjB4N2MwMDAyYTY6MjU2CmRpZmYgLS1naXQgYS9zaW0vcHBjL2RjLXRlc3QuMDEgYi9zaW0vcHBjL2RjLXRlc3QuMDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY4YzE3NQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZGMtdGVzdC4wMQpAQCAtMCwwICsxLDI0IEBACisjCisjICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisgMDogNTogMDogNTowOjogICAgICAgICAgICAgIDI6MHgwMDAwMDAwMDoweDAwMDAwMDAwOjAKKzIxOjMxOjMyOi0xOjA6T0UsTFIsQUEsUmMsTEs6MDoweDAwMDAwMDAwOjB4MDAwMDAwMDA6MAorIDY6IDk6IDY6IDk6MDpCTzogICAgICAgICAgICAwOjB4ZmMwMDAwMDA6MHg0MDAwMDAwMDoxCisxMToxNToxMToxNTowOlJBOiAgICAgICAgICAgIDE6MHhmYzAwMDAwMDoweDM4MDAwMDAwOjIKKzExOjE1OjExOjE1OjA6UkE6ICAgICAgICAgICAgMToweGZjMDAwMDAwOjB4M2MwMDAwMDA6MgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9kYy10ZXN0LjAyIGIvc2ltL3BwYy9kYy10ZXN0LjAyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OGQwYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2RjLXRlc3QuMDIKQEAgLTAsMCArMSwyNCBAQAorIworIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisjCisjICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIDA6IDU6IDA6IDU6MDo6ICAgICAgICAgICAgICAwOjB4MDAwMDAwMDA6MHgwMDAwMDAwMDowCisyMTozMTozMjotMTowOk9FLExSLEFBLFJjLExLOjA6MHgwMDAwMDAwMDoweDAwMDAwMDAwOjAKKyA2OiA5OiA2OiA5OjA6Qk86ICAgICAgICAgICAgMDoweGZjMDAwMDAwOjB4NDAwMDAwMDA6MQorMTE6MTU6MTE6MTU6MDpSQTogICAgICAgICAgICAxOjB4ZmMwMDAwMDA6MHgzODAwMDAwMDoyCisxMToxNToxMToxNTowOlJBOiAgICAgICAgICAgIDE6MHhmYzAwMDAwMDoweDNjMDAwMDAwOjIKZGlmZiAtLWdpdCBhL3NpbS9wcGMvZGVidWcuYyBiL3NpbS9wcGMvZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTMxZDFlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9kZWJ1Zy5jCkBAIC0wLDAgKzEsMTUzIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIF9ERUJVR19DXworI2RlZmluZSBfREVCVUdfQ18KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImJhc2ljcy5oIgorCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKK2ludCBwcGNfdHJhY2VbbnJfdHJhY2Vfb3B0aW9uc107CisKK3R5cGVkZWYgc3RydWN0IF90cmFjZV9vcHRpb25fZGVzY3JpcHRvciB7CisgIHRyYWNlX29wdGlvbnMgb3B0aW9uOworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKK30gdHJhY2Vfb3B0aW9uX2Rlc2NyaXB0b3I7CisKK3N0YXRpYyB0cmFjZV9vcHRpb25fZGVzY3JpcHRvciB0cmFjZV9kZXNjcmlwdGlvbltdID0geworICB7IHRyYWNlX2dkYiwgImdkYiIsICJjYWxscyBtYWRlIGJ5IGdkYiB0byB0aGUgc2ltX2NhbGxzLmMgZmlsZSIgfSwKKyAgeyB0cmFjZV9vc19lbXVsLCAib3MtZW11bCIsICJWRUEgbW9kZSBzeXRlbSBjYWxscyAtIGxpa2Ugc3RyYWNlIiB9LAorICB7IHRyYWNlX2V2ZW50cywgImV2ZW50cyIsICJldmVudCBxdWV1ZSBoYW5kbGluZyIgfSwKKyAgLyogZGVjb2RlL2lzc3VlICovCisgIHsgdHJhY2Vfc2VtYW50aWNzLCAic2VtYW50aWNzIiwgIkluc3RydWN0aW9uIGV4ZWN1dGlvbiAoaXNzdWUpIiB9LAorICB7IHRyYWNlX2lkZWNvZGUsICJpZGVjb2RlIiwgImluc3RydWN0aW9uIGRlY29kZSAod2hlbiBtaXNzIGluIGljYWNoZSkiIH0sCisgIHsgdHJhY2VfYWx1LCAiYWx1IiwgInJlc3VsdHMgb2YgaW50ZWdlciBBTFUiIH0sCisgIHsgdHJhY2Vfdm0sICJ2bSIsICJPRUEgYWRkcmVzcyB0cmFuc2xhdGlvbiIgfSwKKyAgeyB0cmFjZV9sb2FkX3N0b3JlLCAibG9hZC1zdG9yZSIsICJ0cmFuc2ZlcnMgYmV0d2VlbiByZWdpc3RlcnMgYW5kIG1lbW9yeSIgfSwKKyAgeyB0cmFjZV9tb2RlbCwgIm1vZGVsIiwgIm1vZGVsIHNwZWNpZmljIGluZm9ybWF0aW9uIiB9LAorICB7IHRyYWNlX2ludGVycnVwdHMsICJpbnRlcnJ1cHRzIiwgImludGVycnVwdCBoYW5kbGluZyIgfSwKKyAgLyogZGV2aWNlcyAqLworICB7IHRyYWNlX2RldmljZV90cmVlLCAiZGV2aWNlLXRyZWUiLCAgfSwKKyAgeyB0cmFjZV9kZXZpY2VzLCAiZGV2aWNlcyIgfSwKKyAgeyB0cmFjZV9iaW5hcnlfZGV2aWNlLCAiYmluYXJ5LWRldmljZSIgfSwKKyAgeyB0cmFjZV9jb21fZGV2aWNlLCAiY29tLWRldmljZSIgfSwKKyAgeyB0cmFjZV9jb25zb2xlX2RldmljZSwgImNvbnNvbGUtZGV2aWNlIiB9LAorICB7IHRyYWNlX2NvcmVfZGV2aWNlLCAiY29yZS1kZXZpY2UiIH0sCisgIHsgdHJhY2VfZGlza19kZXZpY2UsICJkaXNrLWRldmljZSIgfSwKKyAgeyB0cmFjZV9lZXByb21fZGV2aWNlLCAiZWVwcm9tLWRldmljZSIgfSwKKyAgeyB0cmFjZV9maWxlX2RldmljZSwgImZpbGUtZGV2aWNlIiB9LAorICB7IHRyYWNlX2dsdWVfZGV2aWNlLCAiZ2x1ZS1kZXZpY2UiIH0sCisgIHsgdHJhY2VfaGFsdF9kZXZpY2UsICJoYWx0LWRldmljZSIgfSwKKyAgeyB0cmFjZV9odGFiX2RldmljZSwgImh0YWItZGV2aWNlIiB9LAorICB7IHRyYWNlX2ljdV9kZXZpY2UsICJpY3UtZGV2aWNlIiB9LAorICB7IHRyYWNlX2lkZV9kZXZpY2UsICJpZGUtZGV2aWNlIiB9LAorICB7IHRyYWNlX21lbW9yeV9kZXZpY2UsICJtZW1vcnktZGV2aWNlIiB9LAorICB7IHRyYWNlX29waWNfZGV2aWNlLCAib3BpYy1kZXZpY2UiIH0sCisgIHsgdHJhY2VfcGFsX2RldmljZSwgInBhbC1kZXZpY2UiIH0sCisgIHsgdHJhY2VfcGFzc19kZXZpY2UsICJwYXNzLWRldmljZSIgfSwKKyAgeyB0cmFjZV9waGJfZGV2aWNlLCAicGhiLWRldmljZSIgfSwKKyAgeyB0cmFjZV9yZWdpc3Rlcl9kZXZpY2UsICJyZWdpc3Rlci1kZXZpY2UiLCAiRGV2aWNlIGluaXRpYWxpemluZyByZWdpc3RlcnMiIH0sCisgIHsgdHJhY2Vfc3RhY2tfZGV2aWNlLCAic3RhY2stZGV2aWNlIiB9LAorICB7IHRyYWNlX3ZtX2RldmljZSwgInZtLWRldmljZSIgfSwKKyAgLyogcGFja2FnZXMgKi8KKyAgeyB0cmFjZV9kaXNrbGFiZWxfcGFja2FnZSwgImRpc2tsYWJlbC1wYWNrYWdlIiB9LAorICAvKiBtaXNjICovCisgIHsgdHJhY2VfcHJpbnRfaW5mbywgInByaW50LWluZm8iLCAiUHJpbnQgcGVyZm9ybWFuY2UgYW5hbHlzaXMgaW5mb3JtYXRpb24iIH0sCisgIHsgdHJhY2Vfb3B0cywgIm9wdGlvbnMiLCAiUHJpbnQgb3B0aW9ucyBzaW11bGF0b3Igd2FzIGNvbXBpbGVkIHdpdGgiIH0sCisgIC8qeyB0cmFjZV90YmQsICJ0YmQiLCAiVHJhY2UgYW55IG1pc3NpbmcgZmVhdHVyZXMiIH0sKi8KKyAgeyB0cmFjZV9wcmludF9kZXZpY2VfdHJlZSwgInByaW50LWRldmljZS10cmVlIiwgIk91dHB1dCB0aGUgY29udGVudHMgb2YgdGhlIGRldmljZSB0cmVlIiB9LAorICB7IHRyYWNlX2R1bXBfZGV2aWNlX3RyZWUsICJkdW1wLWRldmljZS10cmVlIiwgIk91dHB1dCB0aGUgY29udGVudHMgb2YgdGhlIGRldmljZSB0cmVlIHRoZW4gZXhpdCIgfSwKKyAgLyogc2VudGluYWwgKi8KKyAgeyBucl90cmFjZV9vcHRpb25zLCBOVUxMIH0sCit9OworCitleHRlcm4gdm9pZAordHJhY2Vfb3B0aW9uKGNvbnN0IGNoYXIgKm9wdGlvbiwKKwkgICAgIGludCBzZXR0aW5nKQoreworICBpZiAoc3RyY21wKG9wdGlvbiwgImFsbCIpID09IDApIHsKKyAgICB0cmFjZV9vcHRpb25zIGk7CisgICAgZm9yIChpID0gMDsgaSA8IG5yX3RyYWNlX29wdGlvbnM7IGkrKykKKyAgICAgIGlmIChpICE9IHRyYWNlX2R1bXBfZGV2aWNlX3RyZWUpIHsKKwlwcGNfdHJhY2VbaV0gPSBzZXR0aW5nOworICAgICAgfQorICB9CisgIGVsc2UgeworICAgIGludCBpID0gMDsKKyAgICB3aGlsZSAodHJhY2VfZGVzY3JpcHRpb25baV0ub3B0aW9uIDwgbnJfdHJhY2Vfb3B0aW9ucworCSAgICYmIHN0cmNtcChvcHRpb24sIHRyYWNlX2Rlc2NyaXB0aW9uW2ldLm5hbWUpICE9IDApCisgICAgICBpKys7CisgICAgaWYgKHRyYWNlX2Rlc2NyaXB0aW9uW2ldLm9wdGlvbiA8IG5yX3RyYWNlX29wdGlvbnMpCisgICAgICBwcGNfdHJhY2VbdHJhY2VfZGVzY3JpcHRpb25baV0ub3B0aW9uXSA9IHNldHRpbmc7CisgICAgZWxzZSB7CisgICAgICBpID0gc3RydG91bChvcHRpb24sIDAsIDApOworICAgICAgaWYgKGkgPiAwICYmIGkgPCBucl90cmFjZV9vcHRpb25zKQorCXBwY190cmFjZVtpXSA9IHNldHRpbmc7CisgICAgICBlbHNlCisJZXJyb3IoIlVua25vd24gdHJhY2Ugb3B0aW9uOiAlc1xuIiwgb3B0aW9uKTsKKyAgICB9CisgICAgICAKKyAgfQorfQorCisKK2V4dGVybiB2b2lkCit0cmFjZV91c2FnZShpbnQgdmVyYm9zZSkKK3sKKyAgaWYgKHZlcmJvc2UpIHsKKyAgICBwcmludGZfZmlsdGVyZWQoIlxuIik7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCJUaGUgZm9sbG93aW5nIGFyZSBwb3NzaWJsZSA8dHJhY2U+IG9wdGlvbnM6XG4iKTsKKyAgICBwcmludGZfZmlsdGVyZWQoIlxuIik7CisgIH0KKyAgaWYgKHZlcmJvc2UgPT0gMSkgeworICAgIGludCBwb3M7CisgICAgaW50IGk7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCIgIGFsbCIpOworICAgIHBvcyA9IHN0cmxlbigiYWxsIikgKyAyOworICAgIGZvciAoaSA9IDA7IHRyYWNlX2Rlc2NyaXB0aW9uW2ldLm9wdGlvbiA8IG5yX3RyYWNlX29wdGlvbnM7IGkrKykgeworICAgICAgcG9zICs9IHN0cmxlbih0cmFjZV9kZXNjcmlwdGlvbltpXS5uYW1lKSArIDI7CisgICAgICBpZiAocG9zID4gNzUpIHsKKwlwb3MgPSBzdHJsZW4odHJhY2VfZGVzY3JpcHRpb25baV0ubmFtZSkgKyAyOworCXByaW50Zl9maWx0ZXJlZCgiXG4iKTsKKyAgICAgIH0KKyAgICAgIHByaW50Zl9maWx0ZXJlZCgiICAlcyIsIHRyYWNlX2Rlc2NyaXB0aW9uW2ldLm5hbWUpOworICAgIH0KKyAgICBwcmludGZfZmlsdGVyZWQoIlxuIik7CisgIH0KKyAgaWYgKHZlcmJvc2UgPiAxKSB7CisgICAgY29uc3QgY2hhciAqZm9ybWF0ID0gIlx0JS0xOHMlc1xuIjsKKyAgICBpbnQgaTsKKyAgICBwcmludGZfZmlsdGVyZWQoZm9ybWF0LCAiYWxsIiwgImVuYWJsZSBhbGwgdGhlIHRyYWNlIG9wdGlvbnMiKTsKKyAgICBmb3IgKGkgPSAwOyB0cmFjZV9kZXNjcmlwdGlvbltpXS5vcHRpb24gPCBucl90cmFjZV9vcHRpb25zOyBpKyspCisgICAgICBwcmludGZfZmlsdGVyZWQoZm9ybWF0LAorCQkgICAgICB0cmFjZV9kZXNjcmlwdGlvbltpXS5uYW1lLAorCQkgICAgICAodHJhY2VfZGVzY3JpcHRpb25baV0uZGVzY3JpcHRpb24KKwkJICAgICAgID8gdHJhY2VfZGVzY3JpcHRpb25baV0uZGVzY3JpcHRpb24KKwkJICAgICAgIDogIiIpKTsKKyAgfQorfQorCisjZW5kaWYgLyogX0RFQlVHX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2RlYnVnLmggYi9zaW0vcHBjL2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkYjM2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZGVidWcuaApAQCAtMCwwICsxLDE3MiBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfREVCVUdfSF8KKyNkZWZpbmUgX0RFQlVHX0hfCisKKyNpbmNsdWRlICJmaWx0ZXJfZmlsZW5hbWUuaCIKKwordHlwZWRlZiBlbnVtIHsKKyAgdHJhY2VfaW52YWxpZCwKKyAgdHJhY2VfdGJkLAorICAvKiovCisgIHRyYWNlX2dkYiwKKyAgdHJhY2Vfb3NfZW11bCwKKyAgLyoqLworICB0cmFjZV9ldmVudHMsCisgIHRyYWNlX2RldmljZV90cmVlLAorICB0cmFjZV9kZXZpY2VzLAorICB0cmFjZV9iaW5hcnlfZGV2aWNlLAorICB0cmFjZV9jb21fZGV2aWNlLAorICB0cmFjZV9jb25zb2xlX2RldmljZSwKKyAgdHJhY2VfY29yZV9kZXZpY2UsCisgIHRyYWNlX2Rpc2tfZGV2aWNlLAorICB0cmFjZV9lZXByb21fZGV2aWNlLAorICB0cmFjZV9maWxlX2RldmljZSwKKyAgdHJhY2VfZ2x1ZV9kZXZpY2UsCisgIHRyYWNlX2hhbHRfZGV2aWNlLAorICB0cmFjZV9odGFiX2RldmljZSwKKyAgdHJhY2VfaWN1X2RldmljZSwKKyAgdHJhY2VfaWRlX2RldmljZSwKKyAgdHJhY2VfbWVtb3J5X2RldmljZSwKKyAgdHJhY2Vfb3BpY19kZXZpY2UsCisgIHRyYWNlX3BhbF9kZXZpY2UsCisgIHRyYWNlX3Bhc3NfZGV2aWNlLAorICB0cmFjZV9waGJfZGV2aWNlLAorICB0cmFjZV9zdGFja19kZXZpY2UsCisgIHRyYWNlX3JlZ2lzdGVyX2RldmljZSwKKyAgdHJhY2Vfdm1fZGV2aWNlLAorICAvKiovCisgIHRyYWNlX2Rpc2tsYWJlbF9wYWNrYWdlLAorICAvKiovCisgIHRyYWNlX3NlbWFudGljcywKKyAgdHJhY2VfaWRlY29kZSwKKyAgdHJhY2VfYWx1LAorICB0cmFjZV9sb2FkX3N0b3JlLAorICB0cmFjZV9tb2RlbCwKKyAgLyoqLworICB0cmFjZV92bSwKKyAgdHJhY2VfY29yZSwKKyAgdHJhY2VfaW50ZXJydXB0cywKKyAgdHJhY2VfcHNpbSwKKyAgdHJhY2VfZGV2aWNlX2luaXQsCisgIHRyYWNlX2NwdSwKKyAgdHJhY2VfYnJlYWtwb2ludCwKKyAgdHJhY2Vfb3B0cywKKyAgdHJhY2VfcHJpbnRfaW5mbywKKyAgdHJhY2VfcHJpbnRfZGV2aWNlX3RyZWUsCisgIHRyYWNlX2R1bXBfZGV2aWNlX3RyZWUsCisgIG5yX3RyYWNlX29wdGlvbnMKK30gdHJhY2Vfb3B0aW9uczsKKworCisKK2V4dGVybiBpbnQgcHBjX3RyYWNlW25yX3RyYWNlX29wdGlvbnNdOworCisvKiBzaW1wbGUgKi8KKyNkZWZpbmUgVFJBQ0UoT0JKRUNULCBBUkdTKSBcCitkbyB7IFwKKyAgaWYgKFdJVEhfVFJBQ0UpIHsgXAorICAgIGlmIChwcGNfdHJhY2VbT0JKRUNUXSkgeyBcCisgICAgICBwcmludGZfZmlsdGVyZWQoIiVzOiVkOiAiLCBmaWx0ZXJfZmlsZW5hbWUoX19GSUxFX18pLCBfX0xJTkVfXyk7IFwKKyAgICAgIHByaW50Zl9maWx0ZXJlZCBBUkdTOyBcCisgICAgfSBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworLyogaXNzdWUgKi8KKyNkZWZpbmUgSVRSQUNFKE9CSkVDVCwgQVJHUykgXAorZG8geyBcCisgIGlmIChXSVRIX1RSQUNFKSB7IFwKKyAgICBpZiAocHBjX3RyYWNlW09CSkVDVF0pIHsgXAorICAgICAgcHJpbnRmX2ZpbHRlcmVkKCIlczolZDoweCUwOGx4OiVzICIsIGl0YWJsZVtNWV9JTkRFWF0uZmlsZSwgaXRhYmxlW01ZX0lOREVYXS5saW5lX25yLCAobG9uZyljaWEsIGl0YWJsZVtNWV9JTkRFWF0ubmFtZSk7IFwKKyAgICAgIHByaW50Zl9maWx0ZXJlZCBBUkdTOyBcCisgICAgfSBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworLyogZGV2aWNlICovCisjZGVmaW5lIERUUkFDRShPQkpFQ1QsIEFSR1MpIFwKK2RvIHsgXAorICBpZiAoV0lUSF9UUkFDRSkgeyBcCisgICAgaW50IHRyYWNlX2RldmljZSA9IGRldmljZV90cmFjZShtZSk7IFwKKyAgICBpZiAocHBjX3RyYWNlW3RyYWNlX2RldmljZXNdIFwKKwl8fCBwcGNfdHJhY2VbdHJhY2VfIyNPQkpFQ1QjI19kZXZpY2VdIFwKKwl8fCB0cmFjZV9kZXZpY2UpIHsgXAorICAgICAgcHJpbnRmX2ZpbHRlcmVkKCIlczolZDolczolcyVzICIsIFwKKwkJICAgICAgZmlsdGVyX2ZpbGVuYW1lKF9fRklMRV9fKSwgX19MSU5FX18sICNPQkpFQ1QsIFwKKwkJICAgICAgdHJhY2VfZGV2aWNlID8gZGV2aWNlX3BhdGgobWUpIDogIiIsIFwKKwkJICAgICAgdHJhY2VfZGV2aWNlID8gIjoiIDogIiIpOyBcCisgICAgICBwcmludGZfZmlsdGVyZWQgQVJHUzsgXAorICAgIH0gXAorICB9IFwKK30gd2hpbGUgKDApCisKKy8qIGRldmljZSBpbnN0YW5jZSAqLworI2RlZmluZSBESVRSQUNFKE9CSkVDVCwgQVJHUykgXAorZG8geyBcCisgIGlmIChXSVRIX1RSQUNFKSB7IFwKKyAgICBkZXZpY2UgKm1lID0gZGV2aWNlX2luc3RhbmNlX2RldmljZShpbnN0YW5jZSk7IFwKKyAgICBpbnQgdHJhY2VfZGV2aWNlID0gZGV2aWNlX3RyYWNlKG1lKTsgXAorICAgIGlmIChwcGNfdHJhY2VbdHJhY2VfZGV2aWNlc10gXAorCXx8IHBwY190cmFjZVt0cmFjZV8jI09CSkVDVCMjX2RldmljZV0gXAorCXx8IHRyYWNlX2RldmljZSkgeyBcCisgICAgICBwcmludGZfZmlsdGVyZWQoIiVzOiVkOiVzOiVzJXMgIiwgXAorCQkgICAgICBmaWx0ZXJfZmlsZW5hbWUoX19GSUxFX18pLCBfX0xJTkVfXywgI09CSkVDVCwgXAorCQkgICAgICB0cmFjZV9kZXZpY2UgPyBkZXZpY2VfcGF0aChtZSkgOiAiIiwgXAorCQkgICAgICB0cmFjZV9kZXZpY2UgPyAiOiIgOiAiIik7IFwKKyAgICAgIHByaW50Zl9maWx0ZXJlZCBBUkdTOyBcCisgICAgfSBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworLyogcGFja2FnZSAqLworI2RlZmluZSBQVFJBQ0UoT0JKRUNULCBBUkdTKSBcCitkbyB7IFwKKyAgaWYgKFdJVEhfVFJBQ0UpIHsgXAorICAgIGlmIChwcGNfdHJhY2VbdHJhY2VfIyNPQkpFQ1QjI19wYWNrYWdlXSkgeyBcCisgICAgICBwcmludGZfZmlsdGVyZWQoIiVzOiVkOiVzOiAiLCBmaWx0ZXJfZmlsZW5hbWUoX19GSUxFX18pLCBfX0xJTkVfXywgI09CSkVDVCk7IFwKKyAgICAgIHByaW50Zl9maWx0ZXJlZCBBUkdTOyBcCisgICAgfSBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIEFTU0VSVChFWFBSRVNTSU9OKSBcCitkbyB7IFwKKyAgaWYgKFdJVEhfQVNTRVJUKSB7IFwKKyAgICBpZiAoIShFWFBSRVNTSU9OKSkgeyBcCisgICAgICBlcnJvcigiJXM6JWQ6IGFzc2VydGlvbiBmYWlsZWQgLSAlc1xuIiwgXAorCSAgICBmaWx0ZXJfZmlsZW5hbWUoX19GSUxFX18pLCBfX0xJTkVfXywgI0VYUFJFU1NJT04pOyBcCisgICAgfSBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworLyogUGFyc2UgT1BUSU9OIHVwZGF0aW5nIHRoZSB0cmFjZSBhcnJheSAqLworZXh0ZXJuIHZvaWQKK3RyYWNlX29wdGlvbihjb25zdCBjaGFyICpvcHRpb24sIGludCBzZXR0aW5nKTsKKworLyogT3V0cHV0IHRoZSBsaXN0IG9mIHRyYWNlIG9wdGlvbnMgKi8KK2V4dGVybiB2b2lkIHRyYWNlX3VzYWdlCisoaW50IHZlcmJvc2UpOworCisKKyNlbmRpZiAvKiBfREVCVUdfSF8gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvZGV2aWNlLmMgYi9zaW0vcHBjL2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYjA5NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2RldmljZS5jCkBAIC0wLDAgKzEsMTk5OCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfREVWSUNFX0NfCisjZGVmaW5lIF9ERVZJQ0VfQ18KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJkZXZpY2VfdGFibGUuaCIKKyNpbmNsdWRlICJjYXAuaCIKKworI2luY2x1ZGUgImV2ZW50cy5oIgorI2luY2x1ZGUgInBzaW0uaCIKKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCitTVEFUSUNfSU5MSU5FX0RFVklDRSAodm9pZCkgY2xlYW5fZGV2aWNlX3Byb3BlcnRpZXMoZGV2aWNlICopOworCisvKiBwcm9wZXJ0eSBlbnRyaWVzICovCisKK3R5cGVkZWYgc3RydWN0IF9kZXZpY2VfcHJvcGVydHlfZW50cnkgZGV2aWNlX3Byb3BlcnR5X2VudHJ5Oworc3RydWN0IF9kZXZpY2VfcHJvcGVydHlfZW50cnkgeworICBkZXZpY2VfcHJvcGVydHlfZW50cnkgKm5leHQ7CisgIGRldmljZV9wcm9wZXJ0eSAqdmFsdWU7CisgIGNvbnN0IHZvaWQgKmluaXRfYXJyYXk7CisgIHVuc2lnbmVkIHNpemVvZl9pbml0X2FycmF5OworfTsKKworCisvKiBJbnRlcnJ1cHQgZWRnZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2RldmljZV9pbnRlcnJ1cHRfZWRnZSBkZXZpY2VfaW50ZXJydXB0X2VkZ2U7CitzdHJ1Y3QgX2RldmljZV9pbnRlcnJ1cHRfZWRnZSB7CisgIGludCBteV9wb3J0OworICBkZXZpY2UgKmRlc3Q7CisgIGludCBkZXN0X3BvcnQ7CisgIGRldmljZV9pbnRlcnJ1cHRfZWRnZSAqbmV4dDsKKyAgb2JqZWN0X2Rpc3Bvc2l0aW9uIGRpc3Bvc2l0aW9uOworfTsKKworU1RBVElDX0lOTElORV9ERVZJQ0VcCisodm9pZCkKK2F0dGFjaF9kZXZpY2VfaW50ZXJydXB0X2VkZ2UoZGV2aWNlX2ludGVycnVwdF9lZGdlICoqbGlzdCwKKwkJCSAgICAgaW50IG15X3BvcnQsCisJCQkgICAgIGRldmljZSAqZGVzdCwKKwkJCSAgICAgaW50IGRlc3RfcG9ydCwKKwkJCSAgICAgb2JqZWN0X2Rpc3Bvc2l0aW9uIGRpc3Bvc2l0aW9uKQoreworICBkZXZpY2VfaW50ZXJydXB0X2VkZ2UgKm5ld19lZGdlID0gWkFMTE9DKGRldmljZV9pbnRlcnJ1cHRfZWRnZSk7CisgIG5ld19lZGdlLT5teV9wb3J0ID0gbXlfcG9ydDsKKyAgbmV3X2VkZ2UtPmRlc3QgPSBkZXN0OworICBuZXdfZWRnZS0+ZGVzdF9wb3J0ID0gZGVzdF9wb3J0OworICBuZXdfZWRnZS0+bmV4dCA9ICpsaXN0OworICBuZXdfZWRnZS0+ZGlzcG9zaXRpb24gPSBkaXNwb3NpdGlvbjsKKyAgKmxpc3QgPSBuZXdfZWRnZTsKK30KKworU1RBVElDX0lOTElORV9ERVZJQ0VcCisodm9pZCkKK2RldGFjaF9kZXZpY2VfaW50ZXJydXB0X2VkZ2UoZGV2aWNlICptZSwKKwkJCSAgICAgZGV2aWNlX2ludGVycnVwdF9lZGdlICoqbGlzdCwKKwkJCSAgICAgaW50IG15X3BvcnQsCisJCQkgICAgIGRldmljZSAqZGVzdCwKKwkJCSAgICAgaW50IGRlc3RfcG9ydCkKK3sKKyAgd2hpbGUgKCpsaXN0ICE9IE5VTEwpIHsKKyAgICBkZXZpY2VfaW50ZXJydXB0X2VkZ2UgKm9sZF9lZGdlID0gKmxpc3Q7CisgICAgaWYgKG9sZF9lZGdlLT5kZXN0ID09IGRlc3QKKwkmJiBvbGRfZWRnZS0+ZGVzdF9wb3J0ID09IGRlc3RfcG9ydAorCSYmIG9sZF9lZGdlLT5teV9wb3J0ID09IG15X3BvcnQpIHsKKyAgICAgIGlmIChvbGRfZWRnZS0+ZGlzcG9zaXRpb24gPT0gcGVybWVuYW50X29iamVjdCkKKwlkZXZpY2VfZXJyb3IobWUsICJhdHRlbXB0IHRvIGRlbGV0ZSBwZXJtZW5hbnQgaW50ZXJydXB0Iik7CisgICAgICAqbGlzdCA9IG9sZF9lZGdlLT5uZXh0OworICAgICAgemZyZWUob2xkX2VkZ2UpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBkZXZpY2VfZXJyb3IobWUsICJhdHRlbXB0IHRvIGRlbGV0ZSB1bmF0dGFjaGVkIGludGVycnVwdCIpOworfQorCitTVEFUSUNfSU5MSU5FX0RFVklDRVwKKyh2b2lkKQorY2xlYW5fZGV2aWNlX2ludGVycnVwdF9lZGdlcyhkZXZpY2VfaW50ZXJydXB0X2VkZ2UgKipsaXN0KQoreworICB3aGlsZSAoKmxpc3QgIT0gTlVMTCkgeworICAgIGRldmljZV9pbnRlcnJ1cHRfZWRnZSAqb2xkX2VkZ2UgPSAqbGlzdDsKKyAgICBzd2l0Y2ggKG9sZF9lZGdlLT5kaXNwb3NpdGlvbikgeworICAgIGNhc2UgcGVybWVuYW50X29iamVjdDoKKyAgICAgIGxpc3QgPSAmb2xkX2VkZ2UtPm5leHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRlbXBvYXJ5X29iamVjdDoKKyAgICAgICpsaXN0ID0gb2xkX2VkZ2UtPm5leHQ7CisgICAgICB6ZnJlZShvbGRfZWRnZSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworCisvKiBBIGRldmljZSAqLworCitzdHJ1Y3QgX2RldmljZSB7CisKKyAgLyogbXkgbmFtZSBpcyAuLi4gKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgZGV2aWNlX3VuaXQgdW5pdF9hZGRyZXNzOworICBjb25zdCBjaGFyICpwYXRoOworICBpbnQgbnJfYWRkcmVzc19jZWxsczsKKyAgaW50IG5yX3NpemVfY2VsbHM7CisKKyAgLyogZGV2aWNlIHRyZWUgKi8KKyAgZGV2aWNlICpwYXJlbnQ7CisgIGRldmljZSAqY2hpbGRyZW47CisgIGRldmljZSAqc2libGluZzsKKworICAvKiBpdHMgdGVtcGxhdGUgbWV0aG9kcyAqLworICB2b2lkICpkYXRhOyAvKiBkZXZpY2Ugc3BlY2lmaWMgZGF0YSAqLworICBjb25zdCBkZXZpY2VfY2FsbGJhY2tzICpjYWxsYmFjazsKKworICAvKiBkZXZpY2UgcHJvcGVydGllcyAqLworICBkZXZpY2VfcHJvcGVydHlfZW50cnkgKnByb3BlcnRpZXM7CisKKyAgLyogaW50ZXJydXB0cyAqLworICBkZXZpY2VfaW50ZXJydXB0X2VkZ2UgKmludGVycnVwdF9kZXN0aW5hdGlvbnM7CisKKyAgLyogYW55IG9wZW4gaW5zdGFuY2VzIG9mIHRoaXMgZGV2aWNlICovCisgIGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2VzOworCisgIC8qIHRoZSBpbnRlcm5hbC9leHRlcm5hbCBtYXBwaW5ncyBhbmQgb3RoZXIgZ2xvYmFsIHJlcXVpcmVtZW50cyAqLworICBjYXAgKmloYW5kbGVzOworICBjYXAgKnBoYW5kbGVzOworICBwc2ltICpzeXN0ZW07CisKKyAgLyogZGVidWdnaW5nICovCisgIGludCB0cmFjZTsKK307CisKKworLyogYW4gaW5zdGFuY2Ugb2YgYSBkZXZpY2UgKi8KK3N0cnVjdCBfZGV2aWNlX2luc3RhbmNlIHsKKyAgdm9pZCAqZGF0YTsKKyAgY2hhciAqYXJnczsKKyAgY2hhciAqcGF0aDsKKyAgY29uc3QgZGV2aWNlX2luc3RhbmNlX2NhbGxiYWNrcyAqY2FsbGJhY2s7CisgIC8qIHRoZSByb290IGluc3RhbmNlICovCisgIGRldmljZSAqb3duZXI7CisgIGRldmljZV9pbnN0YW5jZSAqbmV4dDsKKyAgLyogaW50ZXJwb3NlZCBpbnN0YW5jZSAqLworICBkZXZpY2VfaW5zdGFuY2UgKnBhcmVudDsKKyAgZGV2aWNlX2luc3RhbmNlICpjaGlsZDsKK307CisKKworDAorLyogY3JlYXRpb24gKi8KKworU1RBVElDX0lOTElORV9ERVZJQ0VcCisoY29uc3QgY2hhciAqKQorZGV2aWNlX2Z1bGxfbmFtZShkZXZpY2UgKmxlYWYsCisgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2l6ZW9mX2J1ZikKK3sKKyAgLyogZ2V0IGEgYnVmZmVyICovCisgIGNoYXIgZnVsbF9uYW1lWzEwMjRdOworICBpZiAoYnVmID09IChjaGFyKikwKSB7CisgICAgYnVmID0gZnVsbF9uYW1lOworICAgIHNpemVvZl9idWYgPSBzaXplb2YoZnVsbF9uYW1lKTsKKyAgfQorCisgIC8qIGNvbnN0cnVjdCBhIG5hbWUgKi8KKyAgaWYgKGxlYWYtPnBhcmVudCA9PSBOVUxMKSB7CisgICAgaWYgKHNpemVvZl9idWYgPCAxKQorICAgICAgZXJyb3IoImRldmljZV9mdWxsX25hbWU6IGJ1ZmZlciBvdmVyZmxvdyIpOworICAgICpidWYgPSAnXDAnOworICB9CisgIGVsc2UgeworICAgIGNoYXIgdW5pdFsxMDI0XTsKKyAgICBkZXZpY2VfZnVsbF9uYW1lKGxlYWYtPnBhcmVudCwgYnVmLCBzaXplb2ZfYnVmKTsKKyAgICBpZiAobGVhZi0+cGFyZW50ICE9IE5VTEwKKyAgICAgICAgJiYgZGV2aWNlX2VuY29kZV91bml0KGxlYWYtPnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWFmLT51bml0X2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0KzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodW5pdCktMSkgPiAwKQorICAgICAgdW5pdFswXSA9ICdAJzsKKyAgICBlbHNlCisgICAgICB1bml0WzBdID0gJ1wwJzsKKyAgICBpZiAoc3RybGVuKGJ1ZikgKyBzdHJsZW4oIi8iKSArIHN0cmxlbihsZWFmLT5uYW1lKSArIHN0cmxlbih1bml0KQorICAgICAgICA+PSBzaXplb2ZfYnVmKQorICAgICAgZXJyb3IoImRldmljZV9mdWxsX25hbWU6IGJ1ZmZlciBvdmVyZmxvdyIpOworICAgIHN0cmNhdChidWYsICIvIik7CisgICAgc3RyY2F0KGJ1ZiwgbGVhZi0+bmFtZSk7CisgICAgc3RyY2F0IChidWYsIHVuaXQpOworICB9CisgIAorICAvKiByZXR1cm4gaXQgdXNlZnVsbHkgKi8KKyAgaWYgKGJ1ZiA9PSBmdWxsX25hbWUpCisgICAgYnVmID0gKGNoYXIgKikgc3RyZHVwKGZ1bGxfbmFtZSk7CisgIHJldHVybiBidWY7Cit9CisKK1NUQVRJQ19JTkxJTkVfREVWSUNFXAorKGRldmljZSAqKQorZGV2aWNlX2NyZWF0ZV9mcm9tKGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgIGNvbnN0IGRldmljZV91bml0ICp1bml0X2FkZHJlc3MsCisJCSAgIHZvaWQgKmRhdGEsCisJCSAgIGNvbnN0IGRldmljZV9jYWxsYmFja3MgKmNhbGxiYWNrcywKKwkJICAgZGV2aWNlICpwYXJlbnQpCit7CisgIGRldmljZSAqbmV3X2RldmljZSA9IFpBTExPQyhkZXZpY2UpOworCisgIC8qIGluc2VydCBpdCBpbnRvIHRoZSBkZXZpY2UgdHJlZSAqLworICBuZXdfZGV2aWNlLT5wYXJlbnQgPSBwYXJlbnQ7CisgIG5ld19kZXZpY2UtPmNoaWxkcmVuID0gTlVMTDsKKyAgaWYgKHBhcmVudCAhPSBOVUxMKSB7CisgICAgZGV2aWNlICoqc2libGluZyA9ICZwYXJlbnQtPmNoaWxkcmVuOworICAgIHdoaWxlICgoKnNpYmxpbmcpICE9IE5VTEwpCisgICAgICBzaWJsaW5nID0gJigqc2libGluZyktPnNpYmxpbmc7CisgICAgKnNpYmxpbmcgPSBuZXdfZGV2aWNlOworICB9CisKKyAgLyogZ2l2ZSBpdCBhIG5hbWUgKi8KKyAgbmV3X2RldmljZS0+bmFtZSA9IChjaGFyICopIHN0cmR1cChuYW1lKTsKKyAgbmV3X2RldmljZS0+dW5pdF9hZGRyZXNzID0gKnVuaXRfYWRkcmVzczsKKyAgbmV3X2RldmljZS0+cGF0aCA9IGRldmljZV9mdWxsX25hbWUobmV3X2RldmljZSwgTlVMTCwgMCk7CisKKyAgLyogaXRzIHRlbXBsYXRlICovCisgIG5ld19kZXZpY2UtPmRhdGEgPSBkYXRhOworICBuZXdfZGV2aWNlLT5jYWxsYmFjayA9IGNhbGxiYWNrczsKKworICAvKiBpdHMgcHJvcGVydGllcyAtIGFscmVhZHkgbnVsbCAqLworICAvKiBpbnRlcnJ1cHRzIC0gYWxyZWFkeSBudWxsICovCisKKyAgLyogbWFwcGluZ3MgLSBpZiBuZWVkZWQgKi8KKyAgaWYgKHBhcmVudCA9PSBOVUxMKSB7CisgICAgbmV3X2RldmljZS0+aWhhbmRsZXMgPSBjYXBfY3JlYXRlKG5hbWUpOworICAgIG5ld19kZXZpY2UtPnBoYW5kbGVzID0gY2FwX2NyZWF0ZShuYW1lKTsKKyAgfQorICBlbHNlIHsKKyAgICBuZXdfZGV2aWNlLT5paGFuZGxlcyA9IGRldmljZV9yb290KHBhcmVudCktPmloYW5kbGVzOworICAgIG5ld19kZXZpY2UtPnBoYW5kbGVzID0gZGV2aWNlX3Jvb3QocGFyZW50KS0+cGhhbmRsZXM7CisgIH0KKworICBjYXBfYWRkKG5ld19kZXZpY2UtPnBoYW5kbGVzLCBuZXdfZGV2aWNlKTsKKyAgcmV0dXJuIG5ld19kZXZpY2U7Cit9CisKKworCitJTkxJTkVfREVWSUNFXAorKGRldmljZSAqKQorZGV2aWNlX2NyZWF0ZShkZXZpY2UgKnBhcmVudCwKKwkgICAgICBjb25zdCBjaGFyICpiYXNlLAorCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJICAgICAgY29uc3QgY2hhciAqdW5pdF9hZGRyZXNzLAorCSAgICAgIGNvbnN0IGNoYXIgKmFyZ3MpCit7CisgIGNvbnN0IGRldmljZV9kZXNjcmlwdG9yICpjb25zdCAqdGFibGU7CisgIGZvciAodGFibGUgPSBkZXZpY2VfdGFibGU7ICp0YWJsZSAhPSBOVUxMOyB0YWJsZSsrKSB7CisgICAgY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgKmRlc2NyOworICAgIGZvciAoZGVzY3IgPSAqdGFibGU7IGRlc2NyLT5uYW1lICE9IE5VTEw7IGRlc2NyKyspIHsKKyAgICAgIGlmIChzdHJjbXAoYmFzZSwgZGVzY3ItPm5hbWUpID09IDApIHsKKwlkZXZpY2VfdW5pdCBhZGRyZXNzID0geyAwIH07CisJdm9pZCAqZGF0YSA9IE5VTEw7CisJaWYgKHBhcmVudCAhPSBOVUxMKQorCSAgaWYgKGRldmljZV9kZWNvZGVfdW5pdChwYXJlbnQsIHVuaXRfYWRkcmVzcywgJmFkZHJlc3MpIDwgMCkKKwkgICAgZGV2aWNlX2Vycm9yKHBhcmVudCwgImludmFsaWQgYWRkcmVzcyAlcyBmb3IgZGV2aWNlICVzIiwKKwkJCSB1bml0X2FkZHJlc3MsIG5hbWUpOworCWlmIChkZXNjci0+Y3JlYXRvciAhPSBOVUxMKQorCSAgZGF0YSA9IGRlc2NyLT5jcmVhdG9yKG5hbWUsICZhZGRyZXNzLCBhcmdzKTsKKwlyZXR1cm4gZGV2aWNlX2NyZWF0ZV9mcm9tKG5hbWUsICZhZGRyZXNzLCBkYXRhLAorCQkJCSAgZGVzY3ItPmNhbGxiYWNrcywgcGFyZW50KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZGV2aWNlX2Vycm9yKHBhcmVudCwgImF0dGVtcHQgdG8gYXR0YWNoIHVua25vd24gZGV2aWNlICVzIiwgbmFtZSk7CisgIHJldHVybiBOVUxMOworfQorCisKKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKQorZGV2aWNlX3VzYWdlKGludCB2ZXJib3NlKQoreworICBjb25zdCBkZXZpY2VfZGVzY3JpcHRvciAqY29uc3QgKnRhYmxlOworICBpZiAodmVyYm9zZSA9PSAxKSB7CisgICAgaW50IHBvcyA9IDA7CisgICAgZm9yICh0YWJsZSA9IGRldmljZV90YWJsZTsgKnRhYmxlICE9IE5VTEw7IHRhYmxlKyspIHsKKyAgICAgIGNvbnN0IGRldmljZV9kZXNjcmlwdG9yICpkZXNjcjsKKyAgICAgIGZvciAoZGVzY3IgPSAqdGFibGU7IGRlc2NyLT5uYW1lICE9IE5VTEw7IGRlc2NyKyspIHsKKwlwb3MgKz0gc3RybGVuKGRlc2NyLT5uYW1lKSArIDI7CisJaWYgKHBvcyA+IDc1KSB7CisJICBwb3MgPSBzdHJsZW4oZGVzY3ItPm5hbWUpICsgMjsKKwkgIHByaW50Zl9maWx0ZXJlZCgiXG4iKTsKKwl9CisJcHJpbnRmX2ZpbHRlcmVkKCIgICVzIiwgZGVzY3ItPm5hbWUpOworICAgICAgfQorICAgICAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOworICAgIH0KKyAgfQorICBpZiAodmVyYm9zZSA+IDEpIHsKKyAgICBmb3IgKHRhYmxlID0gZGV2aWNlX3RhYmxlOyAqdGFibGUgIT0gTlVMTDsgdGFibGUrKykgeworICAgICAgY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgKmRlc2NyOworICAgICAgZm9yIChkZXNjciA9ICp0YWJsZTsgZGVzY3ItPm5hbWUgIT0gTlVMTDsgZGVzY3IrKykgeworCXByaW50Zl9maWx0ZXJlZCgiICAlczpcbiIsIGRlc2NyLT5uYW1lKTsKKwkvKiBpbnRlcnJ1cHQgcG9ydHMgKi8KKwlpZiAoZGVzY3ItPmNhbGxiYWNrcy0+aW50ZXJydXB0LnBvcnRzICE9IE5VTEwpIHsKKwkgIGNvbnN0IGRldmljZV9pbnRlcnJ1cHRfcG9ydF9kZXNjcmlwdG9yICpwb3J0cyA9CisJICAgIGRlc2NyLT5jYWxsYmFja3MtPmludGVycnVwdC5wb3J0czsKKwkgIHByaW50Zl9maWx0ZXJlZCgiICAgIGludGVycnVwdCBwb3J0czoiKTsKKwkgIHdoaWxlIChwb3J0cy0+bmFtZSAhPSBOVUxMKSB7CisJICAgIHByaW50Zl9maWx0ZXJlZCgiICVzIiwgcG9ydHMtPm5hbWUpOworCSAgICBwb3J0cysrOworCSAgfQorCSAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOworCX0KKwkvKiBnZW5lcmFsIGluZm8gKi8KKwlpZiAoZGVzY3ItPmNhbGxiYWNrcy0+dXNhZ2UgIT0gTlVMTCkKKwkgIGRlc2NyLT5jYWxsYmFja3MtPnVzYWdlKHZlcmJvc2UpOworICAgICAgfQorICAgIH0KKyAgfQorfQorIAorCisKKworDAorLyogRGV2aWNlIG5vZGU6ICovCisKK0lOTElORV9ERVZJQ0VcCisoZGV2aWNlICopCitkZXZpY2VfcGFyZW50KGRldmljZSAqbWUpCit7CisgIHJldHVybiBtZS0+cGFyZW50OworfQorCitJTkxJTkVfREVWSUNFXAorKGRldmljZSAqKQorZGV2aWNlX3Jvb3QoZGV2aWNlICptZSkKK3sKKyAgQVNTRVJUKG1lICE9IE5VTEwpOworICB3aGlsZSAobWUtPnBhcmVudCAhPSBOVUxMKQorICAgIG1lID0gbWUtPnBhcmVudDsKKyAgcmV0dXJuIG1lOworfQorCitJTkxJTkVfREVWSUNFXAorKGRldmljZSAqKQorZGV2aWNlX3NpYmxpbmcoZGV2aWNlICptZSkKK3sKKyAgcmV0dXJuIG1lLT5zaWJsaW5nOworfQorCitJTkxJTkVfREVWSUNFXAorKGRldmljZSAqKQorZGV2aWNlX2NoaWxkKGRldmljZSAqbWUpCit7CisgIHJldHVybiBtZS0+Y2hpbGRyZW47Cit9CisKK0lOTElORV9ERVZJQ0VcCisoY29uc3QgY2hhciAqKQorZGV2aWNlX25hbWUoZGV2aWNlICptZSkKK3sKKyAgcmV0dXJuIG1lLT5uYW1lOworfQorCitJTkxJTkVfREVWSUNFXAorKGNvbnN0IGNoYXIgKikKK2RldmljZV9wYXRoKGRldmljZSAqbWUpCit7CisgIHJldHVybiBtZS0+cGF0aDsKK30KKworSU5MSU5FX0RFVklDRVwKKyh2b2lkICopCitkZXZpY2VfZGF0YShkZXZpY2UgKm1lKQoreworICByZXR1cm4gbWUtPmRhdGE7Cit9CisKK0lOTElORV9ERVZJQ0VcCisocHNpbSAqKQorZGV2aWNlX3N5c3RlbShkZXZpY2UgKm1lKQoreworICByZXR1cm4gbWUtPnN5c3RlbTsKK30KKworSU5MSU5FX0RFVklDRVwKKyhjb25zdCBkZXZpY2VfdW5pdCAqKQorZGV2aWNlX3VuaXRfYWRkcmVzcyhkZXZpY2UgKm1lKQoreworICByZXR1cm4gJm1lLT51bml0X2FkZHJlc3M7Cit9CisKKworSU5MSU5FX0RFVklDRVwKKyhpbnQpCitkZXZpY2VfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyhkZXZpY2UgKm1lLAorCQkJCSBjb25zdCBkZXZpY2VfdW5pdCAqYWRkcmVzcywKKwkJCQkgaW50ICphdHRhY2hfc3BhY2UsCisJCQkJIHVuc2lnbmVkX3dvcmQgKmF0dGFjaF9hZGRyZXNzLAorCQkJCSBkZXZpY2UgKmNsaWVudCkKK3sKKyAgaWYgKG1lLT5jYWxsYmFjay0+Y29udmVydC5hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzID09IE5VTEwpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAibm8gY29udmVydC5hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzIG1ldGhvZCIpOworICByZXR1cm4gbWUtPmNhbGxiYWNrLT5jb252ZXJ0LmFkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MobWUsIGFkZHJlc3MsIGF0dGFjaF9zcGFjZSwgYXR0YWNoX2FkZHJlc3MsIGNsaWVudCk7Cit9CisKKworSU5MSU5FX0RFVklDRVwKKyhpbnQpCitkZXZpY2Vfc2l6ZV90b19hdHRhY2hfc2l6ZShkZXZpY2UgKm1lLAorCQkJICAgY29uc3QgZGV2aWNlX3VuaXQgKnNpemUsCisJCQkgICB1bnNpZ25lZCAqbnJfYnl0ZXMsCisJCQkgICBkZXZpY2UgKmNsaWVudCkKK3sKKyAgaWYgKG1lLT5jYWxsYmFjay0+Y29udmVydC5zaXplX3RvX2F0dGFjaF9zaXplID09IE5VTEwpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAibm8gY29udmVydC5zaXplX3RvX2F0dGFjaF9zaXplIG1ldGhvZCIpOworICByZXR1cm4gbWUtPmNhbGxiYWNrLT5jb252ZXJ0LnNpemVfdG9fYXR0YWNoX3NpemUobWUsIHNpemUsIG5yX2J5dGVzLCBjbGllbnQpOworfQorCisKK0lOTElORV9ERVZJQ0VcCisoaW50KQorZGV2aWNlX2RlY29kZV91bml0KGRldmljZSAqYnVzLAorCQkgICBjb25zdCBjaGFyICp1bml0LAorCQkgICBkZXZpY2VfdW5pdCAqYWRkcmVzcykKK3sKKyAgaWYgKGJ1cy0+Y2FsbGJhY2stPmNvbnZlcnQuZGVjb2RlX3VuaXQgPT0gTlVMTCkKKyAgICBkZXZpY2VfZXJyb3IoYnVzLCAibm8gY29udmVydC5kZWNvZGVfdW5pdCBtZXRob2QiKTsKKyAgcmV0dXJuIGJ1cy0+Y2FsbGJhY2stPmNvbnZlcnQuZGVjb2RlX3VuaXQoYnVzLCB1bml0LCBhZGRyZXNzKTsKK30KKworCitJTkxJTkVfREVWSUNFXAorKGludCkKK2RldmljZV9lbmNvZGVfdW5pdChkZXZpY2UgKmJ1cywKKwkJICAgY29uc3QgZGV2aWNlX3VuaXQgKnVuaXRfYWRkcmVzcywKKwkJICAgY2hhciAqYnVmLAorCQkgICBpbnQgc2l6ZW9mX2J1ZikKK3sKKyAgaWYgKGJ1cy0+Y2FsbGJhY2stPmNvbnZlcnQuZW5jb2RlX3VuaXQgPT0gTlVMTCkKKyAgICBkZXZpY2VfZXJyb3IoYnVzLCAibm8gY29udmVydC5lbmNvZGVfdW5pdCBtZXRob2QiKTsKKyAgcmV0dXJuIGJ1cy0+Y2FsbGJhY2stPmNvbnZlcnQuZW5jb2RlX3VuaXQoYnVzLCB1bml0X2FkZHJlc3MsIGJ1Ziwgc2l6ZW9mX2J1Zik7Cit9CisKK0lOTElORV9ERVZJQ0VcCisodW5zaWduZWQpCitkZXZpY2VfbnJfYWRkcmVzc19jZWxscyhkZXZpY2UgKm1lKQoreworICBpZiAobWUtPm5yX2FkZHJlc3NfY2VsbHMgPT0gMCkgeworICAgIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgIiNhZGRyZXNzLWNlbGxzIikgIT0gTlVMTCkKKyAgICAgIG1lLT5ucl9hZGRyZXNzX2NlbGxzID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgIiNhZGRyZXNzLWNlbGxzIik7CisgICAgZWxzZQorICAgICAgbWUtPm5yX2FkZHJlc3NfY2VsbHMgPSAyOworICB9CisgIHJldHVybiBtZS0+bnJfYWRkcmVzc19jZWxsczsKK30KKworSU5MSU5FX0RFVklDRVwKKyh1bnNpZ25lZCkKK2RldmljZV9ucl9zaXplX2NlbGxzKGRldmljZSAqbWUpCit7CisgIGlmIChtZS0+bnJfc2l6ZV9jZWxscyA9PSAwKSB7CisgICAgaWYgKGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAiI3NpemUtY2VsbHMiKSAhPSBOVUxMKQorICAgICAgbWUtPm5yX3NpemVfY2VsbHMgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAiI3NpemUtY2VsbHMiKTsKKyAgICBlbHNlCisgICAgICBtZS0+bnJfc2l6ZV9jZWxscyA9IDE7CisgIH0KKyAgcmV0dXJuIG1lLT5ucl9zaXplX2NlbGxzOworfQorCisKKwwKKy8qIGRldmljZS1pbnN0YW5jZTogKi8KKworSU5MSU5FX0RFVklDRVwKKyhkZXZpY2VfaW5zdGFuY2UgKikKK2RldmljZV9jcmVhdGVfaW5zdGFuY2VfZnJvbShkZXZpY2UgKm1lLAorCQkJICAgIGRldmljZV9pbnN0YW5jZSAqcGFyZW50LAorCQkJICAgIHZvaWQgKmRhdGEsCisJCQkgICAgY29uc3QgY2hhciAqcGF0aCwKKwkJCSAgICBjb25zdCBjaGFyICphcmdzLAorCQkJICAgIGNvbnN0IGRldmljZV9pbnN0YW5jZV9jYWxsYmFja3MgKmNhbGxiYWNrcykKK3sKKyAgZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSA9IFpBTExPQyhkZXZpY2VfaW5zdGFuY2UpOworICBpZiAoKG1lID09IE5VTEwpID09IChwYXJlbnQgPT0gTlVMTCkpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAiY2FuJ3QgaGF2ZSBib3RoIHBhcmVudCBpbnN0YW5jZSBhbmQgcGFyZW50IGRldmljZSIpOworICAvKmluc3RhbmNlLT51bml0Ki8KKyAgLyogbGluayB0aGlzIGluc3RhbmNlIGludG8gdGhlIGRldmljZXMgbGlzdCAqLworICBpZiAobWUgIT0gTlVMTCkgeworICAgIEFTU0VSVChwYXJlbnQgPT0gTlVMTCk7CisgICAgaW5zdGFuY2UtPm93bmVyID0gbWU7CisgICAgaW5zdGFuY2UtPnBhcmVudCA9IE5VTEw7CisgICAgLyogbGluayB0aGlzIGluc3RhbmNlIGludG8gdGhlIGZyb250IG9mIHRoZSBkZXZpY2VzIGluc3RhbmNlIGxpc3QgKi8KKyAgICBpbnN0YW5jZS0+bmV4dCA9IG1lLT5pbnN0YW5jZXM7CisgICAgbWUtPmluc3RhbmNlcyA9IGluc3RhbmNlOworICB9CisgIGlmIChwYXJlbnQgIT0gTlVMTCkgeworICAgIGRldmljZV9pbnN0YW5jZSAqKnByZXZpb3VzOworICAgIEFTU0VSVChwYXJlbnQtPmNoaWxkID09IE5VTEwpOworICAgIHBhcmVudC0+Y2hpbGQgPSBpbnN0YW5jZTsKKyAgICBBU1NFUlQobWUgPT0gTlVMTCk7CisgICAgaW5zdGFuY2UtPm93bmVyID0gcGFyZW50LT5vd25lcjsKKyAgICBpbnN0YW5jZS0+cGFyZW50ID0gcGFyZW50OworICAgIC8qIGluIHRoZSBkZXZpY2VzIGluc3RhbmNlIGxpc3QgcmVwbGFjZSB0aGUgcGFyZW50IGluc3RhbmNlIHdpdGgKKyAgICAgICB0aGlzIG9uZSAqLworICAgIGluc3RhbmNlLT5uZXh0ID0gcGFyZW50LT5uZXh0OworICAgIC8qIHJlcGxhY2UgcGFyZW50IHdpdGggdGhpcyBuZXcgbm9kZSAqLworICAgIHByZXZpb3VzID0gJmluc3RhbmNlLT5vd25lci0+aW5zdGFuY2VzOworICAgIHdoaWxlICgqcHJldmlvdXMgIT0gcGFyZW50KSB7CisgICAgICBBU1NFUlQoKnByZXZpb3VzICE9IE5VTEwpOworICAgICAgcHJldmlvdXMgPSAmKCpwcmV2aW91cyktPm5leHQ7CisgICAgfQorICAgICpwcmV2aW91cyA9IGluc3RhbmNlOworICB9CisgIGluc3RhbmNlLT5kYXRhID0gZGF0YTsKKyAgaW5zdGFuY2UtPmFyZ3MgPSAoYXJncyA9PSBOVUxMID8gTlVMTCA6IChjaGFyICopIHN0cmR1cChhcmdzKSk7CisgIGluc3RhbmNlLT5wYXRoID0gKHBhdGggPT0gTlVMTCA/IE5VTEwgOiAoY2hhciAqKSBzdHJkdXAocGF0aCkpOworICBpbnN0YW5jZS0+Y2FsbGJhY2sgPSBjYWxsYmFja3M7CisgIGNhcF9hZGQoaW5zdGFuY2UtPm93bmVyLT5paGFuZGxlcywgaW5zdGFuY2UpOworICByZXR1cm4gaW5zdGFuY2U7Cit9CisKKworSU5MSU5FX0RFVklDRVwKKyhkZXZpY2VfaW5zdGFuY2UgKikKK2RldmljZV9jcmVhdGVfaW5zdGFuY2UoZGV2aWNlICptZSwKKwkJICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCisJCSAgICAgICBjb25zdCBjaGFyICphcmdzKQoreworICAvKiBjcmVhdGUgdGhlIGluc3RhbmNlICovCisgIGlmIChtZS0+Y2FsbGJhY2stPmluc3RhbmNlX2NyZWF0ZSA9PSBOVUxMKQorICAgIGRldmljZV9lcnJvcihtZSwgIm5vIGluc3RhbmNlX2NyZWF0ZSBtZXRob2QiKTsKKyAgcmV0dXJuIG1lLT5jYWxsYmFjay0+aW5zdGFuY2VfY3JlYXRlKG1lLCBwYXRoLCBhcmdzKTsKK30KKworCitTVEFUSUNfSU5MSU5FX0RFVklDRVwKKyh2b2lkKQorY2xlYW5fZGV2aWNlX2luc3RhbmNlcyhkZXZpY2UgKm1lKQoreworICBkZXZpY2VfaW5zdGFuY2UgKippbnN0YW5jZSA9ICZtZS0+aW5zdGFuY2VzOworICB3aGlsZSAoKmluc3RhbmNlICE9IE5VTEwpIHsKKyAgICBkZXZpY2VfaW5zdGFuY2UgKm9sZF9pbnN0YW5jZSA9ICppbnN0YW5jZTsKKyAgICBkZXZpY2VfaW5zdGFuY2VfZGVsZXRlKG9sZF9pbnN0YW5jZSk7CisgICAgaW5zdGFuY2UgPSAmbWUtPmluc3RhbmNlczsKKyAgfQorfQorCisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkKK2RldmljZV9pbnN0YW5jZV9kZWxldGUoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSkKK3sKKyAgZGV2aWNlICptZSA9IGluc3RhbmNlLT5vd25lcjsKKyAgaWYgKGluc3RhbmNlLT5jYWxsYmFjay0+ZGVsZXRlID09IE5VTEwpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAibm8gZGVsZXRlIG1ldGhvZCIpOworICBpbnN0YW5jZS0+Y2FsbGJhY2stPmRlbGV0ZShpbnN0YW5jZSk7CisgIGlmIChpbnN0YW5jZS0+YXJncyAhPSBOVUxMKQorICAgIHpmcmVlKGluc3RhbmNlLT5hcmdzKTsKKyAgaWYgKGluc3RhbmNlLT5wYXRoICE9IE5VTEwpCisgICAgemZyZWUoaW5zdGFuY2UtPnBhdGgpOworICBpZiAoaW5zdGFuY2UtPmNoaWxkID09IE5VTEwpIHsKKyAgICAvKiBvbmx5IHJlbW92ZSBsZWFmIG5vZGVzICovCisgICAgZGV2aWNlX2luc3RhbmNlICoqY3VyciA9ICZtZS0+aW5zdGFuY2VzOworICAgIHdoaWxlICgqY3VyciAhPSBpbnN0YW5jZSkgeworICAgICAgQVNTRVJUKCpjdXJyICE9IE5VTEwpOworICAgICAgY3VyciA9ICYoKmN1cnIpLT5uZXh0OworICAgIH0KKyAgICAqY3VyciA9IGluc3RhbmNlLT5uZXh0OworICB9CisgIGVsc2UgeworICAgIC8qIGNoZWNrIGl0IGlzbid0IGluIHRoZSBpbnN0YW5jZSBsaXN0ICovCisgICAgZGV2aWNlX2luc3RhbmNlICpjdXJyID0gbWUtPmluc3RhbmNlczsKKyAgICB3aGlsZSAoY3VyciAhPSBOVUxMKSB7CisgICAgICBBU1NFUlQoY3VyciAhPSBpbnN0YW5jZSk7CisgICAgICBjdXJyID0gY3Vyci0+bmV4dDsKKyAgICB9CisgICAgLyogdW5saW5rIHRoZSBjaGlsZCAqLworICAgIEFTU0VSVChpbnN0YW5jZS0+Y2hpbGQtPnBhcmVudCA9PSBpbnN0YW5jZSk7CisgICAgaW5zdGFuY2UtPmNoaWxkLT5wYXJlbnQgPSBOVUxMOworICB9CisgIGNhcF9yZW1vdmUobWUtPmloYW5kbGVzLCBpbnN0YW5jZSk7CisgIHpmcmVlKGluc3RhbmNlKTsKK30KKworSU5MSU5FX0RFVklDRVwKKyhpbnQpCitkZXZpY2VfaW5zdGFuY2VfcmVhZChkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAorCQkgICAgIHZvaWQgKmFkZHIsCisJCSAgICAgdW5zaWduZWRfd29yZCBsZW4pCit7CisgIGRldmljZSAqbWUgPSBpbnN0YW5jZS0+b3duZXI7CisgIGlmIChpbnN0YW5jZS0+Y2FsbGJhY2stPnJlYWQgPT0gTlVMTCkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJubyByZWFkIG1ldGhvZCIpOworICByZXR1cm4gaW5zdGFuY2UtPmNhbGxiYWNrLT5yZWFkKGluc3RhbmNlLCBhZGRyLCBsZW4pOworfQorCitJTkxJTkVfREVWSUNFXAorKGludCkKK2RldmljZV9pbnN0YW5jZV93cml0ZShkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAorCQkgICAgICBjb25zdCB2b2lkICphZGRyLAorCQkgICAgICB1bnNpZ25lZF93b3JkIGxlbikKK3sKKyAgZGV2aWNlICptZSA9IGluc3RhbmNlLT5vd25lcjsKKyAgaWYgKGluc3RhbmNlLT5jYWxsYmFjay0+d3JpdGUgPT0gTlVMTCkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJubyB3cml0ZSBtZXRob2QiKTsKKyAgcmV0dXJuIGluc3RhbmNlLT5jYWxsYmFjay0+d3JpdGUoaW5zdGFuY2UsIGFkZHIsIGxlbik7Cit9CisKK0lOTElORV9ERVZJQ0VcCisoaW50KQorZGV2aWNlX2luc3RhbmNlX3NlZWsoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKKwkJICAgICB1bnNpZ25lZF93b3JkIHBvc19oaSwKKwkJICAgICB1bnNpZ25lZF93b3JkIHBvc19sbykKK3sKKyAgZGV2aWNlICptZSA9IGluc3RhbmNlLT5vd25lcjsKKyAgaWYgKGluc3RhbmNlLT5jYWxsYmFjay0+c2VlayA9PSBOVUxMKQorICAgIGRldmljZV9lcnJvcihtZSwgIm5vIHNlZWsgbWV0aG9kIik7CisgIHJldHVybiBpbnN0YW5jZS0+Y2FsbGJhY2stPnNlZWsoaW5zdGFuY2UsIHBvc19oaSwgcG9zX2xvKTsKK30KKworSU5MSU5FX0RFVklDRVwKKyhpbnQpCitkZXZpY2VfaW5zdGFuY2VfY2FsbF9tZXRob2QoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKKwkJCSAgICBjb25zdCBjaGFyICptZXRob2RfbmFtZSwKKwkJCSAgICBpbnQgbl9zdGFja19hcmdzLAorCQkJICAgIHVuc2lnbmVkX2NlbGwgc3RhY2tfYXJnc1svKm5fc3RhY2tfYXJncyovXSwJCisJCQkgICAgaW50IG5fc3RhY2tfcmV0dXJucywKKwkJCSAgICB1bnNpZ25lZF9jZWxsIHN0YWNrX3JldHVybnNbLypuX3N0YWNrX2FyZ3MqL10pCit7CisgIGRldmljZSAqbWUgPSBpbnN0YW5jZS0+b3duZXI7CisgIGNvbnN0IGRldmljZV9pbnN0YW5jZV9tZXRob2RzICptZXRob2QgPSBpbnN0YW5jZS0+Y2FsbGJhY2stPm1ldGhvZHM7CisgIGlmIChtZXRob2QgPT0gTlVMTCkgeworICAgIGRldmljZV9lcnJvcihtZSwgIm5vIG1ldGhvZHMgKHdhbnQgJXMpIiwgbWV0aG9kX25hbWUpOworICB9CisgIHdoaWxlIChtZXRob2QtPm5hbWUgIT0gTlVMTCkgeworICAgIGlmIChzdHJjbXAobWV0aG9kLT5uYW1lLCBtZXRob2RfbmFtZSkgPT0gMCkgeworICAgICAgcmV0dXJuIG1ldGhvZC0+bWV0aG9kKGluc3RhbmNlLAorCQkJICAgIG5fc3RhY2tfYXJncywgc3RhY2tfYXJncywKKwkJCSAgICBuX3N0YWNrX3JldHVybnMsIHN0YWNrX3JldHVybnMpOworICAgIH0KKyAgICBtZXRob2QrKzsKKyAgfQorICBkZXZpY2VfZXJyb3IobWUsICJubyAlcyBtZXRob2QiLCBtZXRob2RfbmFtZSk7CisgIHJldHVybiAwOworfQorCisKK0lOTElORV9ERVZJQ0VcCisoZGV2aWNlICopCitkZXZpY2VfaW5zdGFuY2VfZGV2aWNlKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UpCit7CisgIHJldHVybiBpbnN0YW5jZS0+b3duZXI7Cit9CisKK0lOTElORV9ERVZJQ0VcCisoY29uc3QgY2hhciAqKQorZGV2aWNlX2luc3RhbmNlX3BhdGgoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSkKK3sKKyAgcmV0dXJuIGluc3RhbmNlLT5wYXRoOworfQorCitJTkxJTkVfREVWSUNFXAorKHZvaWQgKikKK2RldmljZV9pbnN0YW5jZV9kYXRhKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UpCit7CisgIHJldHVybiBpbnN0YW5jZS0+ZGF0YTsKK30KKworCisMCisvKiBEZXZpY2UgUHJvcGVydGllczogKi8KKworU1RBVElDX0lOTElORV9ERVZJQ0VcCisoZGV2aWNlX3Byb3BlcnR5X2VudHJ5ICopCitmaW5kX3Byb3BlcnR5X2VudHJ5KGRldmljZSAqbWUsCisJCSAgICAgY29uc3QgY2hhciAqcHJvcGVydHkpCit7CisgIGRldmljZV9wcm9wZXJ0eV9lbnRyeSAqZW50cnk7CisgIEFTU0VSVChwcm9wZXJ0eSAhPSBOVUxMKTsKKyAgZW50cnkgPSBtZS0+cHJvcGVydGllczsKKyAgd2hpbGUgKGVudHJ5ICE9IE5VTEwpIHsKKyAgICBpZiAoc3RyY21wKGVudHJ5LT52YWx1ZS0+bmFtZSwgcHJvcGVydHkpID09IDApCisgICAgICByZXR1cm4gZW50cnk7CisgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworU1RBVElDX0lOTElORV9ERVZJQ0VcCisodm9pZCkKK2RldmljZV9hZGRfcHJvcGVydHkoZGV2aWNlICptZSwKKwkJICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorCQkgICAgZGV2aWNlX3Byb3BlcnR5X3R5cGUgdHlwZSwKKwkJICAgIGNvbnN0IHZvaWQgKmluaXRfYXJyYXksCisJCSAgICB1bnNpZ25lZCBzaXplb2ZfaW5pdF9hcnJheSwKKwkJICAgIGNvbnN0IHZvaWQgKmFycmF5LAorCQkgICAgdW5zaWduZWQgc2l6ZW9mX2FycmF5LAorCQkgICAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpvcmlnaW5hbCwKKwkJICAgIG9iamVjdF9kaXNwb3NpdGlvbiBkaXNwb3NpdGlvbikKK3sKKyAgZGV2aWNlX3Byb3BlcnR5X2VudHJ5ICpuZXdfZW50cnkgPSBOVUxMOworICBkZXZpY2VfcHJvcGVydHkgKm5ld192YWx1ZSA9IE5VTEw7CisKKyAgLyogZmluZCB0aGUgbGlzdCBlbmQgKi8KKyAgZGV2aWNlX3Byb3BlcnR5X2VudHJ5ICoqaW5zZXJ0aW9uX3BvaW50ID0gJm1lLT5wcm9wZXJ0aWVzOworICB3aGlsZSAoKmluc2VydGlvbl9wb2ludCAhPSBOVUxMKSB7CisgICAgaWYgKHN0cmNtcCgoKmluc2VydGlvbl9wb2ludCktPnZhbHVlLT5uYW1lLCBwcm9wZXJ0eSkgPT0gMCkKKyAgICAgIHJldHVybjsKKyAgICBpbnNlcnRpb25fcG9pbnQgPSAmKCppbnNlcnRpb25fcG9pbnQpLT5uZXh0OworICB9CisKKyAgLyogY3JlYXRlIGEgbmV3IHZhbHVlICovCisgIG5ld192YWx1ZSA9IFpBTExPQyhkZXZpY2VfcHJvcGVydHkpOworICBuZXdfdmFsdWUtPm5hbWUgPSAoY2hhciAqKSBzdHJkdXAocHJvcGVydHkpOworICBuZXdfdmFsdWUtPnR5cGUgPSB0eXBlOworICBpZiAoc2l6ZW9mX2FycmF5ID4gMCkgeworICAgIHZvaWQgKm5ld19hcnJheSA9IHphbGxvYyhzaXplb2ZfYXJyYXkpOworICAgIG1lbWNweShuZXdfYXJyYXksIGFycmF5LCBzaXplb2ZfYXJyYXkpOworICAgIG5ld192YWx1ZS0+YXJyYXkgPSBuZXdfYXJyYXk7CisgICAgbmV3X3ZhbHVlLT5zaXplb2ZfYXJyYXkgPSBzaXplb2ZfYXJyYXk7CisgIH0KKyAgbmV3X3ZhbHVlLT5vd25lciA9IG1lOworICBuZXdfdmFsdWUtPm9yaWdpbmFsID0gb3JpZ2luYWw7CisgIG5ld192YWx1ZS0+ZGlzcG9zaXRpb24gPSBkaXNwb3NpdGlvbjsKKworICAvKiBpbnNlcnQgdGhlIHZhbHVlIGludG8gdGhlIGxpc3QgKi8KKyAgbmV3X2VudHJ5ID0gWkFMTE9DKGRldmljZV9wcm9wZXJ0eV9lbnRyeSk7CisgICppbnNlcnRpb25fcG9pbnQgPSBuZXdfZW50cnk7CisgIGlmIChzaXplb2ZfaW5pdF9hcnJheSA+IDApIHsKKyAgICB2b2lkICpuZXdfaW5pdF9hcnJheSA9IHphbGxvYyhzaXplb2ZfaW5pdF9hcnJheSk7CisgICAgbWVtY3B5KG5ld19pbml0X2FycmF5LCBpbml0X2FycmF5LCBzaXplb2ZfaW5pdF9hcnJheSk7CisgICAgbmV3X2VudHJ5LT5pbml0X2FycmF5ID0gbmV3X2luaXRfYXJyYXk7CisgICAgbmV3X2VudHJ5LT5zaXplb2ZfaW5pdF9hcnJheSA9IHNpemVvZl9pbml0X2FycmF5OworICB9CisgIG5ld19lbnRyeS0+dmFsdWUgPSBuZXdfdmFsdWU7Cit9CisKKworLyogbG9jYWwgLSBub3QgYXZhaWxhYmxlIGV4dGVybmFsbHkgKi8KK1NUQVRJQ19JTkxJTkVfREVWSUNFXAorKHZvaWQpCitkZXZpY2Vfc2V0X3Byb3BlcnR5KGRldmljZSAqbWUsCisJCSAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKwkJICAgIGRldmljZV9wcm9wZXJ0eV90eXBlIHR5cGUsCisJCSAgICBjb25zdCB2b2lkICphcnJheSwKKwkJICAgIGludCBzaXplb2ZfYXJyYXkpCit7CisgIC8qIGZpbmQgdGhlIHByb3BlcnR5ICovCisgIGRldmljZV9wcm9wZXJ0eV9lbnRyeSAqZW50cnkgPSBmaW5kX3Byb3BlcnR5X2VudHJ5KG1lLCBwcm9wZXJ0eSk7CisgIGlmIChlbnRyeSAhPSBOVUxMKSB7CisgICAgLyogZXhpc3RpbmcgcHJvcGVydHkgLSB1cGRhdGUgaXQgKi8KKyAgICB2b2lkICpuZXdfYXJyYXkgPSAwOworICAgIGRldmljZV9wcm9wZXJ0eSAqdmFsdWUgPSBlbnRyeS0+dmFsdWU7CisgICAgLyogY2hlY2sgdGhlIHR5cGUgbWF0Y2hlcyAqLworICAgIGlmICh2YWx1ZS0+dHlwZSAhPSB0eXBlKQorICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiY29uZmxpY3QgYmV0d2VlbiB0eXBlIG9mIG5ldyBhbmQgb2xkIHZhbHVlIGZvciBwcm9wZXJ0eSAlcyIsIHByb3BlcnR5KTsKKyAgICAvKiByZXBsYWNlIGl0cyB2YWx1ZSAqLworICAgIGlmICh2YWx1ZS0+YXJyYXkgIT0gTlVMTCkKKyAgICAgIHpmcmVlKCh2b2lkKil2YWx1ZS0+YXJyYXkpOworICAgIG5ld19hcnJheSA9IChzaXplb2ZfYXJyYXkgPiAwCisJCSA/IHphbGxvYyhzaXplb2ZfYXJyYXkpCisJCSA6ICh2b2lkKikwKTsKKyAgICB2YWx1ZS0+YXJyYXkgPSBuZXdfYXJyYXk7CisgICAgdmFsdWUtPnNpemVvZl9hcnJheSA9IHNpemVvZl9hcnJheTsKKyAgICBpZiAoc2l6ZW9mX2FycmF5ID4gMCkKKyAgICAgIG1lbWNweShuZXdfYXJyYXksIGFycmF5LCBzaXplb2ZfYXJyYXkpOworICAgIHJldHVybjsKKyAgfQorICBlbHNlIHsKKyAgICAvKiBuZXcgcHJvcGVydHkgLSBjcmVhdGUgaXQgKi8KKyAgICBkZXZpY2VfYWRkX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eSwgdHlwZSwKKwkJCU5VTEwsIDAsIGFycmF5LCBzaXplb2ZfYXJyYXksCisJCQlOVUxMLCB0ZW1wb2FyeV9vYmplY3QpOworICB9Cit9CisKKworU1RBVElDX0lOTElORV9ERVZJQ0VcCisodm9pZCkKK2NsZWFuX2RldmljZV9wcm9wZXJ0aWVzKGRldmljZSAqbWUpCit7CisgIGRldmljZV9wcm9wZXJ0eV9lbnRyeSAqKmRlbGV0ZV9wb2ludCA9ICZtZS0+cHJvcGVydGllczsKKyAgd2hpbGUgKCpkZWxldGVfcG9pbnQgIT0gTlVMTCkgeworICAgIGRldmljZV9wcm9wZXJ0eV9lbnRyeSAqY3VycmVudCA9ICpkZWxldGVfcG9pbnQ7CisgICAgc3dpdGNoIChjdXJyZW50LT52YWx1ZS0+ZGlzcG9zaXRpb24pIHsKKyAgICBjYXNlIHBlcm1lbmFudF9vYmplY3Q6CisgICAgICAvKiB6YXAgdGhlIGN1cnJlbnQgdmFsdWUsIHdpbGwgYmUgaW5pdGlhbGl6ZWQgbGF0ZXIgKi8KKyAgICAgIEFTU0VSVChjdXJyZW50LT5pbml0X2FycmF5ICE9IE5VTEwpOworICAgICAgaWYgKGN1cnJlbnQtPnZhbHVlLT5hcnJheSAhPSBOVUxMKSB7CisJemZyZWUoKHZvaWQqKWN1cnJlbnQtPnZhbHVlLT5hcnJheSk7CisJY3VycmVudC0+dmFsdWUtPmFycmF5ID0gTlVMTDsKKyAgICAgIH0KKyAgICAgIGRlbGV0ZV9wb2ludCA9ICYoKmRlbGV0ZV9wb2ludCktPm5leHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRlbXBvYXJ5X29iamVjdDoKKyAgICAgIC8qIHphcCB0aGUgYWN0dWFsIHByb3BlcnR5LCB3YXMgY3JlYXRlZCBkdXJpbmcgc2ltdWxhdGlvbiBydW4gKi8KKyAgICAgIEFTU0VSVChjdXJyZW50LT5pbml0X2FycmF5ID09IE5VTEwpOworICAgICAgKmRlbGV0ZV9wb2ludCA9IGN1cnJlbnQtPm5leHQ7CisgICAgICBpZiAoY3VycmVudC0+dmFsdWUtPmFycmF5ICE9IE5VTEwpCisJemZyZWUoKHZvaWQqKWN1cnJlbnQtPnZhbHVlLT5hcnJheSk7CisgICAgICB6ZnJlZShjdXJyZW50LT52YWx1ZSk7CisgICAgICB6ZnJlZShjdXJyZW50KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkKK2RldmljZV9pbml0X3N0YXRpY19wcm9wZXJ0aWVzKGRldmljZSAqbWUsCisJCQkgICAgICB2b2lkICpkYXRhKQoreworICBkZXZpY2VfcHJvcGVydHlfZW50cnkgKnByb3BlcnR5OworICBmb3IgKHByb3BlcnR5ID0gbWUtPnByb3BlcnRpZXM7CisgICAgICAgcHJvcGVydHkgIT0gTlVMTDsKKyAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnR5LT5uZXh0KSB7CisgICAgQVNTRVJUKHByb3BlcnR5LT5pbml0X2FycmF5ICE9IE5VTEwpOworICAgIEFTU0VSVChwcm9wZXJ0eS0+dmFsdWUtPmFycmF5ID09IE5VTEwpOworICAgIEFTU0VSVChwcm9wZXJ0eS0+dmFsdWUtPmRpc3Bvc2l0aW9uID09IHBlcm1lbmFudF9vYmplY3QpOworICAgIHN3aXRjaCAocHJvcGVydHktPnZhbHVlLT50eXBlKSB7CisgICAgY2FzZSBhcnJheV9wcm9wZXJ0eToKKyAgICBjYXNlIGJvb2xlYW5fcHJvcGVydHk6CisgICAgY2FzZSByYW5nZV9hcnJheV9wcm9wZXJ0eToKKyAgICBjYXNlIHJlZ19hcnJheV9wcm9wZXJ0eToKKyAgICBjYXNlIHN0cmluZ19wcm9wZXJ0eToKKyAgICBjYXNlIHN0cmluZ19hcnJheV9wcm9wZXJ0eToKKyAgICBjYXNlIGludGVnZXJfcHJvcGVydHk6CisgICAgICAvKiBkZWxldGUgdGhlIHByb3BlcnR5LCBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBvcmlnaW5hbCAqLworICAgICAgZGV2aWNlX3NldF9wcm9wZXJ0eShtZSwgcHJvcGVydHktPnZhbHVlLT5uYW1lLAorCQkJICBwcm9wZXJ0eS0+dmFsdWUtPnR5cGUsCisJCQkgIHByb3BlcnR5LT5pbml0X2FycmF5LAorCQkJICBwcm9wZXJ0eS0+c2l6ZW9mX2luaXRfYXJyYXkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBpaGFuZGxlX3Byb3BlcnR5OgorICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKQorZGV2aWNlX2luaXRfcnVudGltZV9wcm9wZXJ0aWVzKGRldmljZSAqbWUsCisJCQkgICAgICAgdm9pZCAqZGF0YSkKK3sKKyAgZGV2aWNlX3Byb3BlcnR5X2VudHJ5ICpwcm9wZXJ0eTsKKyAgZm9yIChwcm9wZXJ0eSA9IG1lLT5wcm9wZXJ0aWVzOworICAgICAgIHByb3BlcnR5ICE9IE5VTEw7CisgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS0+bmV4dCkgeworICAgIHN3aXRjaCAocHJvcGVydHktPnZhbHVlLT5kaXNwb3NpdGlvbikgeworICAgIGNhc2UgcGVybWVuYW50X29iamVjdDoKKyAgICAgIHN3aXRjaCAocHJvcGVydHktPnZhbHVlLT50eXBlKSB7CisgICAgICBjYXNlIGloYW5kbGVfcHJvcGVydHk6CisJeworCSAgZGV2aWNlX2luc3RhbmNlICppaGFuZGxlOworCSAgaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5X3NwZWMgc3BlYzsKKwkgIEFTU0VSVChwcm9wZXJ0eS0+aW5pdF9hcnJheSAhPSBOVUxMKTsKKwkgIEFTU0VSVChwcm9wZXJ0eS0+dmFsdWUtPmFycmF5ID09IE5VTEwpOworCSAgZGV2aWNlX2ZpbmRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eS0+dmFsdWUtPm5hbWUsICZzcGVjKTsKKwkgIGloYW5kbGUgPSB0cmVlX2luc3RhbmNlKG1lLCBzcGVjLmZ1bGxfcGF0aCk7CisJICBkZXZpY2Vfc2V0X2loYW5kbGVfcHJvcGVydHkobWUsIHByb3BlcnR5LT52YWx1ZS0+bmFtZSwgaWhhbmRsZSk7CisJICBicmVhazsKKwl9CisgICAgICBjYXNlIGFycmF5X3Byb3BlcnR5OgorICAgICAgY2FzZSBib29sZWFuX3Byb3BlcnR5OgorICAgICAgY2FzZSByYW5nZV9hcnJheV9wcm9wZXJ0eToKKyAgICAgIGNhc2UgaW50ZWdlcl9wcm9wZXJ0eToKKyAgICAgIGNhc2UgcmVnX2FycmF5X3Byb3BlcnR5OgorICAgICAgY2FzZSBzdHJpbmdfcHJvcGVydHk6CisgICAgICBjYXNlIHN0cmluZ19hcnJheV9wcm9wZXJ0eToKKwlBU1NFUlQocHJvcGVydHktPmluaXRfYXJyYXkgIT0gTlVMTCk7CisJQVNTRVJUKHByb3BlcnR5LT52YWx1ZS0+YXJyYXkgIT0gTlVMTCk7CisJYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRlbXBvYXJ5X29iamVjdDoKKyAgICAgIEFTU0VSVChwcm9wZXJ0eS0+aW5pdF9hcnJheSA9PSBOVUxMKTsKKyAgICAgIEFTU0VSVChwcm9wZXJ0eS0+dmFsdWUtPmFycmF5ICE9IE5VTEwpOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKworSU5MSU5FX0RFVklDRVwKKyhjb25zdCBkZXZpY2VfcHJvcGVydHkgKikKK2RldmljZV9uZXh0X3Byb3BlcnR5KGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqcHJvcGVydHkpCit7CisgIC8qIGZpbmQgdGhlIHByb3BlcnR5IGluIHRoZSBsaXN0ICovCisgIGRldmljZSAqb3duZXIgPSBwcm9wZXJ0eS0+b3duZXI7CisgIGRldmljZV9wcm9wZXJ0eV9lbnRyeSAqZW50cnkgPSBvd25lci0+cHJvcGVydGllczsKKyAgd2hpbGUgKGVudHJ5ICE9IE5VTEwgJiYgZW50cnktPnZhbHVlICE9IHByb3BlcnR5KQorICAgIGVudHJ5ID0gZW50cnktPm5leHQ7CisgIC8qIG5vdyByZXR1cm4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0eSAqLworICBBU1NFUlQoZW50cnkgIT0gTlVMTCk7IC8qIG11c3QgYmUgYSBtZW1iZXIhICovCisgIGlmIChlbnRyeS0+bmV4dCAhPSBOVUxMKQorICAgIHJldHVybiBlbnRyeS0+bmV4dC0+dmFsdWU7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworCitJTkxJTkVfREVWSUNFXAorKGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqKQorZGV2aWNlX2ZpbmRfcHJvcGVydHkoZGV2aWNlICptZSwKKwkJICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSkKK3sKKyAgaWYgKG1lID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlbHNlIGlmIChwcm9wZXJ0eSA9PSBOVUxMIHx8IHN0cmNtcChwcm9wZXJ0eSwgIiIpID09IDApIHsKKyAgICBpZiAobWUtPnByb3BlcnRpZXMgPT0gTlVMTCkKKyAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgIHJldHVybiBtZS0+cHJvcGVydGllcy0+dmFsdWU7CisgIH0KKyAgZWxzZSB7CisgICAgZGV2aWNlX3Byb3BlcnR5X2VudHJ5ICplbnRyeSA9IGZpbmRfcHJvcGVydHlfZW50cnkobWUsIHByb3BlcnR5KTsKKyAgICBpZiAoZW50cnkgIT0gTlVMTCkKKyAgICAgIHJldHVybiBlbnRyeS0+dmFsdWU7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKQorZGV2aWNlX2FkZF9hcnJheV9wcm9wZXJ0eShkZXZpY2UgKm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplb2ZfYXJyYXkpCit7CisgIGRldmljZV9hZGRfcHJvcGVydHkobWUsIHByb3BlcnR5LCBhcnJheV9wcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICBhcnJheSwgc2l6ZW9mX2FycmF5LCBhcnJheSwgc2l6ZW9mX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHBlcm1lbmFudF9vYmplY3QpOworfQorCitJTkxJTkVfREVWSUNFXAorKHZvaWQpCitkZXZpY2Vfc2V0X2FycmF5X3Byb3BlcnR5KGRldmljZSAqbWUsCisJCQkgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorCQkJICBjb25zdCB2b2lkICphcnJheSwKKwkJCSAgaW50IHNpemVvZl9hcnJheSkKK3sKKyAgZGV2aWNlX3NldF9wcm9wZXJ0eShtZSwgcHJvcGVydHksIGFycmF5X3Byb3BlcnR5LCBhcnJheSwgc2l6ZW9mX2FycmF5KTsKK30KKworSU5MSU5FX0RFVklDRVwKKyhjb25zdCBkZXZpY2VfcHJvcGVydHkgKikKK2RldmljZV9maW5kX2FycmF5X3Byb3BlcnR5KGRldmljZSAqbWUsCisJCQkgICBjb25zdCBjaGFyICpwcm9wZXJ0eSkKK3sKKyAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpub2RlOworICBub2RlID0gZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsIHByb3BlcnR5KTsKKyAgaWYgKG5vZGUgPT0gKGRldmljZV9wcm9wZXJ0eSopMAorICAgICAgfHwgbm9kZS0+dHlwZSAhPSBhcnJheV9wcm9wZXJ0eSkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJwcm9wZXJ0eSAlcyBub3QgZm91bmQgb3Igb2Ygd3JvbmcgdHlwZSIsIHByb3BlcnR5KTsKKyAgcmV0dXJuIG5vZGU7Cit9CisKKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKQorZGV2aWNlX2FkZF9ib29sZWFuX3Byb3BlcnR5KGRldmljZSAqbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvb2xlYW4pCit7CisgIHNpZ25lZDMyIG5ld19ib29sZWFuID0gKGJvb2xlYW4gPyAtMSA6IDApOworICBkZXZpY2VfYWRkX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eSwgYm9vbGVhbl9wcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAmbmV3X2Jvb2xlYW4sIHNpemVvZihuZXdfYm9vbGVhbiksCisgICAgICAgICAgICAgICAgICAgICAgJm5ld19ib29sZWFuLCBzaXplb2YobmV3X2Jvb2xlYW4pLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHBlcm1lbmFudF9vYmplY3QpOworfQorCitJTkxJTkVfREVWSUNFXAorKGludCkKK2RldmljZV9maW5kX2Jvb2xlYW5fcHJvcGVydHkoZGV2aWNlICptZSwKKwkJCSAgICAgY29uc3QgY2hhciAqcHJvcGVydHkpCit7CisgIGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqbm9kZTsKKyAgdW5zaWduZWRfY2VsbCBib29sZWFuOworICBub2RlID0gZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsIHByb3BlcnR5KTsKKyAgaWYgKG5vZGUgPT0gKGRldmljZV9wcm9wZXJ0eSopMAorICAgICAgfHwgbm9kZS0+dHlwZSAhPSBib29sZWFuX3Byb3BlcnR5KQorICAgIGRldmljZV9lcnJvcihtZSwgInByb3BlcnR5ICVzIG5vdCBmb3VuZCBvciBvZiB3cm9uZyB0eXBlIiwgcHJvcGVydHkpOworICBBU1NFUlQoc2l6ZW9mKGJvb2xlYW4pID09IG5vZGUtPnNpemVvZl9hcnJheSk7CisgIG1lbWNweSgmYm9vbGVhbiwgbm9kZS0+YXJyYXksIHNpemVvZihib29sZWFuKSk7CisgIHJldHVybiBib29sZWFuOworfQorCisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkKK2RldmljZV9hZGRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5KGRldmljZSAqbWUsCisJCQkJICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorCQkJCSAgICBjb25zdCBpaGFuZGxlX3J1bnRpbWVfcHJvcGVydHlfc3BlYyAqaWhhbmRsZSkKK3sKKyAgLyogZW50ZXIgdGhlIGZ1bGwgcGF0aCBhcyB0aGUgaW5pdCBhcnJheSAqLworICBkZXZpY2VfYWRkX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eSwgaWhhbmRsZV9wcm9wZXJ0eSwKKwkJICAgICAgaWhhbmRsZS0+ZnVsbF9wYXRoLCBzdHJsZW4oaWhhbmRsZS0+ZnVsbF9wYXRoKSArIDEsCisJCSAgICAgIE5VTEwsIDAsCisJCSAgICAgIE5VTEwsIHBlcm1lbmFudF9vYmplY3QpOworfQorCitJTkxJTkVfREVWSUNFXAorKHZvaWQpCitkZXZpY2VfZmluZF9paGFuZGxlX3J1bnRpbWVfcHJvcGVydHkoZGV2aWNlICptZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorCQkJCSAgICAgaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5X3NwZWMgKmloYW5kbGUpCit7CisgIGRldmljZV9wcm9wZXJ0eV9lbnRyeSAqZW50cnkgPSBmaW5kX3Byb3BlcnR5X2VudHJ5KG1lLCBwcm9wZXJ0eSk7CisgIFRSQUNFKHRyYWNlX2RldmljZXMsCisJKCJkZXZpY2VfZmluZF9paGFuZGxlX3J1bnRpbWVfcHJvcGVydHkobWU9MHglbHgsIHByb3BlcnR5PSVzKVxuIiwKKwkgKGxvbmcpbWUsIHByb3BlcnR5KSk7CisgIGlmIChlbnRyeSA9PSBOVUxMCisgICAgICB8fCBlbnRyeS0+dmFsdWUtPnR5cGUgIT0gaWhhbmRsZV9wcm9wZXJ0eQorICAgICAgfHwgZW50cnktPnZhbHVlLT5kaXNwb3NpdGlvbiAhPSBwZXJtZW5hbnRfb2JqZWN0KQorICAgIGRldmljZV9lcnJvcihtZSwgInByb3BlcnR5ICVzIG5vdCBmb3VuZCBvciBvZiB3cm9uZyB0eXBlIiwgcHJvcGVydHkpOworICBBU1NFUlQoZW50cnktPmluaXRfYXJyYXkgIT0gTlVMTCk7CisgIC8qIHRoZSBmdWxsIHBhdGggKi8KKyAgaWhhbmRsZS0+ZnVsbF9wYXRoID0gZW50cnktPmluaXRfYXJyYXk7Cit9CisKKworCitJTkxJTkVfREVWSUNFXAorKHZvaWQpCitkZXZpY2Vfc2V0X2loYW5kbGVfcHJvcGVydHkoZGV2aWNlICptZSwKKwkJCSAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKwkJCSAgICBkZXZpY2VfaW5zdGFuY2UgKmloYW5kbGUpCit7CisgIHVuc2lnbmVkX2NlbGwgY2VsbHM7CisgIGNlbGxzID0gSDJCRV9jZWxsKGRldmljZV9pbnN0YW5jZV90b19leHRlcm5hbChpaGFuZGxlKSk7CisgIGRldmljZV9zZXRfcHJvcGVydHkobWUsIHByb3BlcnR5LCBpaGFuZGxlX3Byb3BlcnR5LAorCQkgICAgICAmY2VsbHMsIHNpemVvZihjZWxscykpOworCQkgICAgICAKK30KKworSU5MSU5FX0RFVklDRVwKKyhkZXZpY2VfaW5zdGFuY2UgKikKK2RldmljZV9maW5kX2loYW5kbGVfcHJvcGVydHkoZGV2aWNlICptZSwKKwkJCSAgICAgY29uc3QgY2hhciAqcHJvcGVydHkpCit7CisgIGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqbm9kZTsKKyAgdW5zaWduZWRfY2VsbCBpaGFuZGxlOworICBkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlOworCisgIG5vZGUgPSBkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgcHJvcGVydHkpOworICBpZiAobm9kZSA9PSBOVUxMIHx8IG5vZGUtPnR5cGUgIT0gaWhhbmRsZV9wcm9wZXJ0eSkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJwcm9wZXJ0eSAlcyBub3QgZm91bmQgb3Igb2Ygd3JvbmcgdHlwZSIsIHByb3BlcnR5KTsKKyAgaWYgKG5vZGUtPmFycmF5ID09IE5VTEwpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAicnVudGltZSBwcm9wZXJ0eSAlcyBub3QgeWV0IGluaXRpYWxpemVkIiwgcHJvcGVydHkpOworCisgIEFTU0VSVChzaXplb2YoaWhhbmRsZSkgPT0gbm9kZS0+c2l6ZW9mX2FycmF5KTsKKyAgbWVtY3B5KCZpaGFuZGxlLCBub2RlLT5hcnJheSwgc2l6ZW9mKGloYW5kbGUpKTsKKyAgaW5zdGFuY2UgPSBleHRlcm5hbF90b19kZXZpY2VfaW5zdGFuY2UobWUsIEJFMkhfY2VsbChpaGFuZGxlKSk7CisgIEFTU0VSVChpbnN0YW5jZSAhPSBOVUxMKTsKKyAgcmV0dXJuIGluc3RhbmNlOworfQorCisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkKK2RldmljZV9hZGRfaW50ZWdlcl9wcm9wZXJ0eShkZXZpY2UgKm1lLAorCQkJICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorCQkJICAgIHNpZ25lZF9jZWxsIGludGVnZXIpCit7CisgIEgyQkUoaW50ZWdlcik7CisgIGRldmljZV9hZGRfcHJvcGVydHkobWUsIHByb3BlcnR5LCBpbnRlZ2VyX3Byb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICZpbnRlZ2VyLCBzaXplb2YoaW50ZWdlciksCisgICAgICAgICAgICAgICAgICAgICAgJmludGVnZXIsIHNpemVvZihpbnRlZ2VyKSwKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBwZXJtZW5hbnRfb2JqZWN0KTsKK30KKworSU5MSU5FX0RFVklDRVwKKyhzaWduZWRfY2VsbCkKK2RldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkoZGV2aWNlICptZSwKKwkJCSAgICAgY29uc3QgY2hhciAqcHJvcGVydHkpCit7CisgIGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqbm9kZTsKKyAgc2lnbmVkX2NlbGwgaW50ZWdlcjsKKyAgVFJBQ0UodHJhY2VfZGV2aWNlcywKKwkoImRldmljZV9maW5kX2ludGVnZXIobWU9MHglbHgsIHByb3BlcnR5PSVzKVxuIiwKKwkgKGxvbmcpbWUsIHByb3BlcnR5KSk7CisgIG5vZGUgPSBkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgcHJvcGVydHkpOworICBpZiAobm9kZSA9PSAoZGV2aWNlX3Byb3BlcnR5KikwCisgICAgICB8fCBub2RlLT50eXBlICE9IGludGVnZXJfcHJvcGVydHkpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAicHJvcGVydHkgJXMgbm90IGZvdW5kIG9yIG9mIHdyb25nIHR5cGUiLCBwcm9wZXJ0eSk7CisgIEFTU0VSVChzaXplb2YoaW50ZWdlcikgPT0gbm9kZS0+c2l6ZW9mX2FycmF5KTsKKyAgbWVtY3B5KCZpbnRlZ2VyLCBub2RlLT5hcnJheSwgc2l6ZW9mKGludGVnZXIpKTsKKyAgcmV0dXJuIEJFMkhfY2VsbChpbnRlZ2VyKTsKK30KKworSU5MSU5FX0RFVklDRVwKKyhpbnQpCitkZXZpY2VfZmluZF9pbnRlZ2VyX2FycmF5X3Byb3BlcnR5KGRldmljZSAqbWUsCisJCQkJICAgY29uc3QgY2hhciAqcHJvcGVydHksCisJCQkJICAgdW5zaWduZWQgaW5kZXgsCisJCQkJICAgc2lnbmVkX2NlbGwgKmludGVnZXIpCit7CisgIGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqbm9kZTsKKyAgaW50IHNpemVvZl9pbnRlZ2VyID0gc2l6ZW9mKCppbnRlZ2VyKTsKKyAgc2lnbmVkX2NlbGwgKmNlbGw7CisgIFRSQUNFKHRyYWNlX2RldmljZXMsCisJKCJkZXZpY2VfZmluZF9pbnRlZ2VyKG1lPTB4JWx4LCBwcm9wZXJ0eT0lcylcbiIsCisJIChsb25nKW1lLCBwcm9wZXJ0eSkpOworCisgIC8qIGNoZWNrIHRoaW5ncyBzYW5lICovCisgIG5vZGUgPSBkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgcHJvcGVydHkpOworICBpZiAobm9kZSA9PSAoZGV2aWNlX3Byb3BlcnR5KikwCisgICAgICB8fCAobm9kZS0+dHlwZSAhPSBpbnRlZ2VyX3Byb3BlcnR5CisJICAmJiBub2RlLT50eXBlICE9IGFycmF5X3Byb3BlcnR5KSkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJwcm9wZXJ0eSAlcyBub3QgZm91bmQgb3Igb2Ygd3JvbmcgdHlwZSIsIHByb3BlcnR5KTsKKyAgaWYgKChub2RlLT5zaXplb2ZfYXJyYXkgJSBzaXplb2ZfaW50ZWdlcikgIT0gMCkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJwcm9wZXJ0eSAlcyBjb250YWlucyBhbiBpbmNvbXBsZXRlIG51bWJlciBvZiBjZWxscyIsIHByb3BlcnR5KTsKKyAgaWYgKG5vZGUtPnNpemVvZl9hcnJheSA8PSBzaXplb2ZfaW50ZWdlciAqIGluZGV4KQorICAgIHJldHVybiAwOworCisgIC8qIEZpbmQgYW5kIGNvbnZlcnQgdGhlIHZhbHVlICovCisgIGNlbGwgPSAoKHNpZ25lZF9jZWxsKilub2RlLT5hcnJheSkgKyBpbmRleDsKKyAgKmludGVnZXIgPSBCRTJIX2NlbGwoKmNlbGwpOworCisgIHJldHVybiBub2RlLT5zaXplb2ZfYXJyYXkgLyBzaXplb2ZfaW50ZWdlcjsKK30KKworCitTVEFUSUNfSU5MSU5FX0RFVklDRVwKKyh1bnNpZ25lZF9jZWxsICopCit1bml0X2FkZHJlc3NfdG9fY2VsbHMoY29uc3QgZGV2aWNlX3VuaXQgKnVuaXQsCisJCSAgICAgIHVuc2lnbmVkX2NlbGwgKmNlbGwsCisJCSAgICAgIGludCBucl9jZWxscykKK3sKKyAgaW50IGk7CisgIEFTU0VSVChucl9jZWxscyA9PSB1bml0LT5ucl9jZWxscyk7CisgIGZvciAoaSA9IDA7IGkgPCB1bml0LT5ucl9jZWxsczsgaSsrKSB7CisgICAgKmNlbGwgPSBIMkJFX2NlbGwodW5pdC0+Y2VsbHNbaV0pOworICAgIGNlbGwgKz0gMTsKKyAgfQorICByZXR1cm4gY2VsbDsKK30KKworCitTVEFUSUNfSU5MSU5FX0RFVklDRVwKKyhjb25zdCB1bnNpZ25lZF9jZWxsICopCitjZWxsc190b191bml0X2FkZHJlc3MoY29uc3QgdW5zaWduZWRfY2VsbCAqY2VsbCwKKwkJICAgICAgZGV2aWNlX3VuaXQgKnVuaXQsCisJCSAgICAgIGludCBucl9jZWxscykKK3sKKyAgaW50IGk7CisgIG1lbXNldCh1bml0LCAwLCBzaXplb2YoKnVuaXQpKTsKKyAgdW5pdC0+bnJfY2VsbHMgPSBucl9jZWxsczsKKyAgZm9yIChpID0gMDsgaSA8IHVuaXQtPm5yX2NlbGxzOyBpKyspIHsKKyAgICB1bml0LT5jZWxsc1tpXSA9IEJFMkhfY2VsbCgqY2VsbCk7CisgICAgY2VsbCArPSAxOworICB9CisgIHJldHVybiBjZWxsOworfQorCisKK1NUQVRJQ19JTkxJTkVfREVWSUNFXAorKHVuc2lnbmVkKQorbnJfcmFuZ2VfcHJvcGVydHlfY2VsbHMoZGV2aWNlICptZSwKKwkJCWludCBucl9yYW5nZXMpCit7CisgIHJldHVybiAoKGRldmljZV9ucl9hZGRyZXNzX2NlbGxzKG1lKQorCSAgICsgZGV2aWNlX25yX2FkZHJlc3NfY2VsbHMoZGV2aWNlX3BhcmVudChtZSkpCisJICAgKyBkZXZpY2VfbnJfc2l6ZV9jZWxscyhtZSkpCisJICApICogbnJfcmFuZ2VzOworfQorCitJTkxJTkVfREVWSUNFXAorKHZvaWQpCitkZXZpY2VfYWRkX3JhbmdlX2FycmF5X3Byb3BlcnR5KGRldmljZSAqbWUsCisJCQkJY29uc3QgY2hhciAqcHJvcGVydHksCisJCQkJY29uc3QgcmFuZ2VfcHJvcGVydHlfc3BlYyAqcmFuZ2VzLAorCQkJCXVuc2lnbmVkIG5yX3JhbmdlcykKK3sKKyAgdW5zaWduZWQgc2l6ZW9mX2NlbGxzID0gKG5yX3JhbmdlX3Byb3BlcnR5X2NlbGxzKG1lLCBucl9yYW5nZXMpCisJCQkgICAqIHNpemVvZih1bnNpZ25lZF9jZWxsKSk7CisgIHVuc2lnbmVkX2NlbGwgKmNlbGxzID0gemFsbG9jKHNpemVvZl9jZWxscyk7CisgIHVuc2lnbmVkX2NlbGwgKmNlbGw7CisgIGludCBpOworCisgIC8qIGNvcHkgdGhlIHByb3BlcnR5IGVsZW1lbnRzIG92ZXIgKi8KKyAgY2VsbCA9IGNlbGxzOworICBmb3IgKGkgPSAwOyBpIDwgbnJfcmFuZ2VzOyBpKyspIHsKKyAgICBjb25zdCByYW5nZV9wcm9wZXJ0eV9zcGVjICpyYW5nZSA9ICZyYW5nZXNbaV07CisgICAgLyogY29weSB0aGUgY2hpbGQgYWRkcmVzcyAqLworICAgIGNlbGwgPSB1bml0X2FkZHJlc3NfdG9fY2VsbHMoJnJhbmdlLT5jaGlsZF9hZGRyZXNzLCBjZWxsLAorCQkJCSBkZXZpY2VfbnJfYWRkcmVzc19jZWxscyhtZSkpOworICAgIC8qIGNvcHkgdGhlIHBhcmVudCBhZGRyZXNzICovCisgICAgY2VsbCA9IHVuaXRfYWRkcmVzc190b19jZWxscygmcmFuZ2UtPnBhcmVudF9hZGRyZXNzLCBjZWxsLCAKKwkJCQkgZGV2aWNlX25yX2FkZHJlc3NfY2VsbHMoZGV2aWNlX3BhcmVudChtZSkpKTsKKyAgICAvKiBjb3B5IHRoZSBzaXplICovCisgICAgY2VsbCA9IHVuaXRfYWRkcmVzc190b19jZWxscygmcmFuZ2UtPnNpemUsIGNlbGwsIAorCQkJCSBkZXZpY2VfbnJfc2l6ZV9jZWxscyhtZSkpOworICB9CisgIEFTU0VSVChjZWxsID09ICZjZWxsc1tucl9yYW5nZV9wcm9wZXJ0eV9jZWxscyhtZSwgbnJfcmFuZ2VzKV0pOworCisgIC8qIGFkZCBpdCAqLworICBkZXZpY2VfYWRkX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eSwgcmFuZ2VfYXJyYXlfcHJvcGVydHksCisJCSAgICAgIGNlbGxzLCBzaXplb2ZfY2VsbHMsCisJCSAgICAgIGNlbGxzLCBzaXplb2ZfY2VsbHMsCisJCSAgICAgIE5VTEwsIHBlcm1lbmFudF9vYmplY3QpOworCisgIHpmcmVlKGNlbGxzKTsKK30KKworSU5MSU5FX0RFVklDRVwKKyhpbnQpCitkZXZpY2VfZmluZF9yYW5nZV9hcnJheV9wcm9wZXJ0eShkZXZpY2UgKm1lLAorCQkJCSBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKwkJCQkgdW5zaWduZWQgaW5kZXgsCisJCQkJIHJhbmdlX3Byb3BlcnR5X3NwZWMgKnJhbmdlKQoreworICBjb25zdCBkZXZpY2VfcHJvcGVydHkgKm5vZGU7CisgIHVuc2lnbmVkIHNpemVvZl9lbnRyeSA9IChucl9yYW5nZV9wcm9wZXJ0eV9jZWxscyhtZSwgMSkKKwkJCSAgICogc2l6ZW9mKHVuc2lnbmVkX2NlbGwpKTsKKyAgY29uc3QgdW5zaWduZWRfY2VsbCAqY2VsbHM7CisKKyAgLyogbG9jYXRlIHRoZSBwcm9wZXJ0eSAqLworICBub2RlID0gZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsIHByb3BlcnR5KTsKKyAgaWYgKG5vZGUgPT0gKGRldmljZV9wcm9wZXJ0eSopMAorICAgICAgfHwgbm9kZS0+dHlwZSAhPSByYW5nZV9hcnJheV9wcm9wZXJ0eSkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJwcm9wZXJ0eSAlcyBub3QgZm91bmQgb3Igb2Ygd3JvbmcgdHlwZSIsIHByb3BlcnR5KTsKKworICAvKiBhbGlnbmVkID8gKi8KKyAgaWYgKChub2RlLT5zaXplb2ZfYXJyYXkgJSBzaXplb2ZfZW50cnkpICE9IDApCisgICAgZGV2aWNlX2Vycm9yKG1lLCAicHJvcGVydHkgJXMgY29udGFpbnMgYW4gaW5jb21wbGV0ZSBudW1iZXIgb2YgZW50cmllcyIsCisJCSBwcm9wZXJ0eSk7CisKKyAgLyogd2l0aGluIGJvdW5kcz8gKi8KKyAgaWYgKG5vZGUtPnNpemVvZl9hcnJheSA8IHNpemVvZl9lbnRyeSAqIChpbmRleCArIDEpKQorICAgIHJldHVybiAwOworCisgIC8qIGZpbmQgdGhlIHJhbmdlIG9mIGludGVyZXN0ICovCisgIGNlbGxzID0gKHVuc2lnbmVkX2NlbGwqKSgoY2hhciopbm9kZS0+YXJyYXkgKyBzaXplb2ZfZW50cnkgKiBpbmRleCk7CisKKyAgLyogY29weSB0aGUgY2hpbGQgYWRkcmVzcyBvdXQgLSBjb252ZXJ0aW5nIGFzIHdlIGdvICovCisgIGNlbGxzID0gY2VsbHNfdG9fdW5pdF9hZGRyZXNzKGNlbGxzLCAmcmFuZ2UtPmNoaWxkX2FkZHJlc3MsCisJCQkJZGV2aWNlX25yX2FkZHJlc3NfY2VsbHMobWUpKTsKKworICAvKiBjb3B5IHRoZSBwYXJlbnQgYWRkcmVzcyBvdXQgLSBjb252ZXJ0aW5nIGFzIHdlIGdvICovCisgIGNlbGxzID0gY2VsbHNfdG9fdW5pdF9hZGRyZXNzKGNlbGxzLCAmcmFuZ2UtPnBhcmVudF9hZGRyZXNzLAorCQkJCWRldmljZV9ucl9hZGRyZXNzX2NlbGxzKGRldmljZV9wYXJlbnQobWUpKSk7CisKKyAgLyogY29weSB0aGUgc2l6ZSAtIGNvbnZlcnRpbmcgYXMgd2UgZ28gKi8KKyAgY2VsbHMgPSBjZWxsc190b191bml0X2FkZHJlc3MoY2VsbHMsICZyYW5nZS0+c2l6ZSwKKwkJCQlkZXZpY2VfbnJfc2l6ZV9jZWxscyhtZSkpOworCisgIHJldHVybiBub2RlLT5zaXplb2ZfYXJyYXkgLyBzaXplb2ZfZW50cnk7Cit9CisKKworU1RBVElDX0lOTElORV9ERVZJQ0VcCisodW5zaWduZWQpCitucl9yZWdfcHJvcGVydHlfY2VsbHMoZGV2aWNlICptZSwKKwkJICAgICAgaW50IG5yX3JlZ3MpCit7CisgIHJldHVybiAoZGV2aWNlX25yX2FkZHJlc3NfY2VsbHMoZGV2aWNlX3BhcmVudChtZSkpCisJICArIGRldmljZV9ucl9zaXplX2NlbGxzKGRldmljZV9wYXJlbnQobWUpKQorCSAgKSAqIG5yX3JlZ3M7Cit9CisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkKK2RldmljZV9hZGRfcmVnX2FycmF5X3Byb3BlcnR5KGRldmljZSAqbWUsCisJCQkgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKwkJCSAgICAgIGNvbnN0IHJlZ19wcm9wZXJ0eV9zcGVjICpyZWdzLAorCQkJICAgICAgdW5zaWduZWQgbnJfcmVncykKK3sKKyAgdW5zaWduZWQgc2l6ZW9mX2NlbGxzID0gKG5yX3JlZ19wcm9wZXJ0eV9jZWxscyhtZSwgbnJfcmVncykKKwkJCSAgICogc2l6ZW9mKHVuc2lnbmVkX2NlbGwpKTsKKyAgdW5zaWduZWRfY2VsbCAqY2VsbHMgPSB6YWxsb2Moc2l6ZW9mX2NlbGxzKTsKKyAgdW5zaWduZWRfY2VsbCAqY2VsbDsKKyAgaW50IGk7CisKKyAgLyogY29weSB0aGUgcHJvcGVydHkgZWxlbWVudHMgb3ZlciAqLworICBjZWxsID0gY2VsbHM7CisgIGZvciAoaSA9IDA7IGkgPCBucl9yZWdzOyBpKyspIHsKKyAgICBjb25zdCByZWdfcHJvcGVydHlfc3BlYyAqcmVnID0gJnJlZ3NbaV07CisgICAgLyogY29weSB0aGUgYWRkcmVzcyAqLworICAgIGNlbGwgPSB1bml0X2FkZHJlc3NfdG9fY2VsbHMoJnJlZy0+YWRkcmVzcywgY2VsbCwKKwkJCQkgZGV2aWNlX25yX2FkZHJlc3NfY2VsbHMoZGV2aWNlX3BhcmVudChtZSkpKTsKKyAgICAvKiBjb3B5IHRoZSBzaXplICovCisgICAgY2VsbCA9IHVuaXRfYWRkcmVzc190b19jZWxscygmcmVnLT5zaXplLCBjZWxsLAorCQkJCSBkZXZpY2VfbnJfc2l6ZV9jZWxscyhkZXZpY2VfcGFyZW50KG1lKSkpOworICB9CisgIEFTU0VSVChjZWxsID09ICZjZWxsc1tucl9yZWdfcHJvcGVydHlfY2VsbHMobWUsIG5yX3JlZ3MpXSk7CisKKyAgLyogYWRkIGl0ICovCisgIGRldmljZV9hZGRfcHJvcGVydHkobWUsIHByb3BlcnR5LCByZWdfYXJyYXlfcHJvcGVydHksCisJCSAgICAgIGNlbGxzLCBzaXplb2ZfY2VsbHMsCisJCSAgICAgIGNlbGxzLCBzaXplb2ZfY2VsbHMsCisJCSAgICAgIE5VTEwsIHBlcm1lbmFudF9vYmplY3QpOworCisgIHpmcmVlKGNlbGxzKTsKK30KKworSU5MSU5FX0RFVklDRVwKKyhpbnQpCitkZXZpY2VfZmluZF9yZWdfYXJyYXlfcHJvcGVydHkoZGV2aWNlICptZSwKKwkJCSAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbmRleCwKKwkJCSAgICAgICByZWdfcHJvcGVydHlfc3BlYyAqcmVnKQoreworICBjb25zdCBkZXZpY2VfcHJvcGVydHkgKm5vZGU7CisgIHVuc2lnbmVkIHNpemVvZl9lbnRyeSA9IChucl9yZWdfcHJvcGVydHlfY2VsbHMobWUsIDEpCisJCQkgICAqIHNpemVvZih1bnNpZ25lZF9jZWxsKSk7CisgIGNvbnN0IHVuc2lnbmVkX2NlbGwgKmNlbGxzOworCisgIC8qIGxvY2F0ZSB0aGUgcHJvcGVydHkgKi8KKyAgbm9kZSA9IGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eSk7CisgIGlmIChub2RlID09IChkZXZpY2VfcHJvcGVydHkqKTAKKyAgICAgIHx8IG5vZGUtPnR5cGUgIT0gcmVnX2FycmF5X3Byb3BlcnR5KQorICAgIGRldmljZV9lcnJvcihtZSwgInByb3BlcnR5ICVzIG5vdCBmb3VuZCBvciBvZiB3cm9uZyB0eXBlIiwgcHJvcGVydHkpOworCisgIC8qIGFsaWduZWQgPyAqLworICBpZiAoKG5vZGUtPnNpemVvZl9hcnJheSAlIHNpemVvZl9lbnRyeSkgIT0gMCkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJwcm9wZXJ0eSAlcyBjb250YWlucyBhbiBpbmNvbXBsZXRlIG51bWJlciBvZiBlbnRyaWVzIiwKKwkJIHByb3BlcnR5KTsKKworICAvKiB3aXRoaW4gYm91bmRzPyAqLworICBpZiAobm9kZS0+c2l6ZW9mX2FycmF5IDwgc2l6ZW9mX2VudHJ5ICogKGluZGV4ICsgMSkpCisgICAgcmV0dXJuIDA7CisKKyAgLyogZmluZCB0aGUgcmFuZ2Ugb2YgaW50ZXJlc3QgKi8KKyAgY2VsbHMgPSAodW5zaWduZWRfY2VsbCopKChjaGFyKilub2RlLT5hcnJheSArIHNpemVvZl9lbnRyeSAqIGluZGV4KTsKKworICAvKiBjb3B5IHRoZSBhZGRyZXNzIG91dCAtIGNvbnZlcnRpbmcgYXMgd2UgZ28gKi8KKyAgY2VsbHMgPSBjZWxsc190b191bml0X2FkZHJlc3MoY2VsbHMsICZyZWctPmFkZHJlc3MsCisJCQkJZGV2aWNlX25yX2FkZHJlc3NfY2VsbHMoZGV2aWNlX3BhcmVudChtZSkpKTsKKworICAvKiBjb3B5IHRoZSBzaXplIG91dCAtIGNvbnZlcnRpbmcgYXMgd2UgZ28gKi8KKyAgY2VsbHMgPSBjZWxsc190b191bml0X2FkZHJlc3MoY2VsbHMsICZyZWctPnNpemUsCisJCQkJZGV2aWNlX25yX3NpemVfY2VsbHMoZGV2aWNlX3BhcmVudChtZSkpKTsKKworICByZXR1cm4gbm9kZS0+c2l6ZW9mX2FycmF5IC8gc2l6ZW9mX2VudHJ5OworfQorCisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkKK2RldmljZV9hZGRfc3RyaW5nX3Byb3BlcnR5KGRldmljZSAqbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKyAgZGV2aWNlX2FkZF9wcm9wZXJ0eShtZSwgcHJvcGVydHksIHN0cmluZ19wcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcsIHN0cmxlbihzdHJpbmcpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcsIHN0cmxlbihzdHJpbmcpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBwZXJtZW5hbnRfb2JqZWN0KTsKK30KKworSU5MSU5FX0RFVklDRVwKKyhjb25zdCBjaGFyICopCitkZXZpY2VfZmluZF9zdHJpbmdfcHJvcGVydHkoZGV2aWNlICptZSwKKwkJCSAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSkKK3sKKyAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpub2RlOworICBjb25zdCBjaGFyICpzdHJpbmc7CisgIG5vZGUgPSBkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgcHJvcGVydHkpOworICBpZiAobm9kZSA9PSAoZGV2aWNlX3Byb3BlcnR5KikwCisgICAgICB8fCBub2RlLT50eXBlICE9IHN0cmluZ19wcm9wZXJ0eSkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJwcm9wZXJ0eSAlcyBub3QgZm91bmQgb3Igb2Ygd3JvbmcgdHlwZSIsIHByb3BlcnR5KTsKKyAgc3RyaW5nID0gbm9kZS0+YXJyYXk7CisgIEFTU0VSVChzdHJsZW4oc3RyaW5nKSArIDEgPT0gbm9kZS0+c2l6ZW9mX2FycmF5KTsKKyAgcmV0dXJuIHN0cmluZzsKK30KKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKQorZGV2aWNlX2FkZF9zdHJpbmdfYXJyYXlfcHJvcGVydHkoZGV2aWNlICptZSwKKwkJCQkgY29uc3QgY2hhciAqcHJvcGVydHksCisJCQkJIGNvbnN0IHN0cmluZ19wcm9wZXJ0eV9zcGVjICpzdHJpbmdzLAorCQkJCSB1bnNpZ25lZCBucl9zdHJpbmdzKQoreworICBpbnQgc2l6ZW9mX2FycmF5OworICBpbnQgc3RyaW5nX25yOworICBjaGFyICphcnJheTsKKyAgY2hhciAqY2hwOworICBpZiAobnJfc3RyaW5ncyA9PSAwKQorICAgIGRldmljZV9lcnJvcihtZSwgInByb3BlcnR5ICVzIG11c3QgYmUgbm9uLW51bGwiLCBwcm9wZXJ0eSk7CisgIC8qIHRvdGFsIHVwIHRoZSBzaXplIG9mIHRoZSBuZWVkZWQgYXJyYXkgKi8KKyAgZm9yIChzaXplb2ZfYXJyYXkgPSAwLCBzdHJpbmdfbnIgPSAwOworICAgICAgIHN0cmluZ19uciA8IG5yX3N0cmluZ3M7CisgICAgICAgc3RyaW5nX25yICsrKSB7CisgICAgc2l6ZW9mX2FycmF5ICs9IHN0cmxlbihzdHJpbmdzW3N0cmluZ19ucl0pICsgMTsKKyAgfQorICAvKiBjcmVhdGUgdGhlIGFycmF5ICovCisgIGFycmF5ID0gKGNoYXIqKXphbGxvYyhzaXplb2ZfYXJyYXkpOworICBjaHAgPSBhcnJheTsKKyAgZm9yIChzdHJpbmdfbnIgPSAwOworICAgICAgIHN0cmluZ19uciA8IG5yX3N0cmluZ3M7CisgICAgICAgc3RyaW5nX25yKyspIHsKKyAgICBzdHJjcHkoY2hwLCBzdHJpbmdzW3N0cmluZ19ucl0pOworICAgIGNocCArPSBzdHJsZW4oY2hwKSArIDE7CisgIH0KKyAgQVNTRVJUKGNocCA9PSBhcnJheSArIHNpemVvZl9hcnJheSk7CisgIC8qIG5vdyBlbnRlciBpdCAqLworICBkZXZpY2VfYWRkX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eSwgc3RyaW5nX2FycmF5X3Byb3BlcnR5LAorCQkgICAgICBhcnJheSwgc2l6ZW9mX2FycmF5LAorCQkgICAgICBhcnJheSwgc2l6ZW9mX2FycmF5LAorCQkgICAgICBOVUxMLCBwZXJtZW5hbnRfb2JqZWN0KTsKK30KKworSU5MSU5FX0RFVklDRVwKKyhpbnQpCitkZXZpY2VfZmluZF9zdHJpbmdfYXJyYXlfcHJvcGVydHkoZGV2aWNlICptZSwKKwkJCQkgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorCQkJCSAgdW5zaWduZWQgaW5kZXgsCisJCQkJICBzdHJpbmdfcHJvcGVydHlfc3BlYyAqc3RyaW5nKQoreworICBjb25zdCBkZXZpY2VfcHJvcGVydHkgKm5vZGU7CisgIG5vZGUgPSBkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgcHJvcGVydHkpOworICBpZiAobm9kZSA9PSAoZGV2aWNlX3Byb3BlcnR5KikwKQorICAgIGRldmljZV9lcnJvcihtZSwgInByb3BlcnR5ICVzIG5vdCBmb3VuZCIsIHByb3BlcnR5KTsKKyAgc3dpdGNoIChub2RlLT50eXBlKSB7CisgIGRlZmF1bHQ6CisgICAgZGV2aWNlX2Vycm9yKG1lLCAicHJvcGVydHkgJXMgb2Ygd3JvbmcgdHlwZSIsIHByb3BlcnR5KTsKKyAgICBicmVhazsKKyAgY2FzZSBzdHJpbmdfcHJvcGVydHk6CisgICAgaWYgKGluZGV4ID09IDApIHsKKyAgICAgICpzdHJpbmcgPSBub2RlLT5hcnJheTsKKyAgICAgIEFTU0VSVChzdHJsZW4oKnN0cmluZykgKyAxID09IG5vZGUtPnNpemVvZl9hcnJheSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgYXJyYXlfcHJvcGVydHk6CisgICAgaWYgKG5vZGUtPnNpemVvZl9hcnJheSA9PSAwCisJfHwgKChjaGFyKilub2RlLT5hcnJheSlbbm9kZS0+c2l6ZW9mX2FycmF5IC0gMV0gIT0gJ1wwJykKKyAgICAgIGRldmljZV9lcnJvcihtZSwgInByb3BlcnR5ICVzIGludmFsaWQgZm9yIHN0cmluZyBhcnJheSIsIHByb3BlcnR5KTsKKyAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKyAgY2FzZSBzdHJpbmdfYXJyYXlfcHJvcGVydHk6CisgICAgQVNTRVJUKG5vZGUtPnNpemVvZl9hcnJheSA+IDApOworICAgIEFTU0VSVCgoKGNoYXIqKW5vZGUtPmFycmF5KVtub2RlLT5zaXplb2ZfYXJyYXkgLSAxXSA9PSAnXDAnKTsKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpjaHAgPSBub2RlLT5hcnJheTsKKyAgICAgIGludCBucl9lbnRyaWVzID0gMDsKKyAgICAgIC8qIGNvdW50IHRoZSBudW1iZXIgb2Ygc3RyaW5ncywga2VlcGluZyBhbiBleWUgb3V0IGZvciB0aGUgb25lCisgICAgICAgICB3ZSdyZSBsb29raW5nIGZvciAqLworICAgICAgKnN0cmluZyA9IGNocDsKKyAgICAgIGRvIHsKKwlpZiAoKmNocCA9PSAnXDAnKSB7CisJICAvKiBuZXh0IHN0cmluZyAqLworCSAgbnJfZW50cmllcysrOworCSAgY2hwKys7CisJICBpZiAobnJfZW50cmllcyA9PSBpbmRleCkKKwkgICAgKnN0cmluZyA9IGNocDsKKwl9CisJZWxzZSB7CisJICBjaHArKzsKKwl9CisgICAgICB9IHdoaWxlIChjaHAgPCAoY2hhciopbm9kZS0+YXJyYXkgKyBub2RlLT5zaXplb2ZfYXJyYXkpOworICAgICAgaWYgKGluZGV4IDwgbnJfZW50cmllcykKKwlyZXR1cm4gbnJfZW50cmllczsKKyAgICAgIGVsc2UgeworCSpzdHJpbmcgPSBOVUxMOworCXJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKK30KKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKQorZGV2aWNlX2FkZF9kdXBsaWNhdGVfcHJvcGVydHkoZGV2aWNlICptZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorCQkJICAgICAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpvcmlnaW5hbCkKK3sKKyAgZGV2aWNlX3Byb3BlcnR5X2VudHJ5ICptYXN0ZXI7CisgIFRSQUNFKHRyYWNlX2RldmljZXMsCisJKCJkZXZpY2VfYWRkX2R1cGxpY2F0ZV9wcm9wZXJ0eShtZT0weCVseCwgcHJvcGVydHk9JXMsIC4uLilcbiIsCisJIChsb25nKW1lLCBwcm9wZXJ0eSkpOworICBpZiAob3JpZ2luYWwtPmRpc3Bvc2l0aW9uICE9IHBlcm1lbmFudF9vYmplY3QpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAiQ2FuIG9ubHkgZHVwbGljYXRlIHBlcm1lbmFudCBvYmplY3RzIik7CisgIC8qIGZpbmQgdGhlIG9yaWdpbmFsJ3MgbWFzdGVyICovCisgIG1hc3RlciA9IG9yaWdpbmFsLT5vd25lci0+cHJvcGVydGllczsKKyAgd2hpbGUgKG1hc3Rlci0+dmFsdWUgIT0gb3JpZ2luYWwpIHsKKyAgICBtYXN0ZXIgPSBtYXN0ZXItPm5leHQ7CisgICAgQVNTRVJUKG1hc3RlciAhPSBOVUxMKTsKKyAgfQorICAvKiBub3cgZHVwbGljYXRlIGl0ICovCisgIGRldmljZV9hZGRfcHJvcGVydHkobWUsIHByb3BlcnR5LAorCQkgICAgICBvcmlnaW5hbC0+dHlwZSwKKwkJICAgICAgbWFzdGVyLT5pbml0X2FycmF5LCBtYXN0ZXItPnNpemVvZl9pbml0X2FycmF5LAorCQkgICAgICBvcmlnaW5hbC0+YXJyYXksIG9yaWdpbmFsLT5zaXplb2ZfYXJyYXksCisJCSAgICAgIG9yaWdpbmFsLCBwZXJtZW5hbnRfb2JqZWN0KTsKK30KKworCisMCisvKiBEZXZpY2UgSGFyZHdhcmU6ICovCisKK0lOTElORV9ERVZJQ0VcCisodW5zaWduZWQpCitkZXZpY2VfaW9fcmVhZF9idWZmZXIoZGV2aWNlICptZSwKKwkJICAgICAgdm9pZCAqZGVzdCwKKwkJICAgICAgaW50IHNwYWNlLAorCQkgICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCisJCSAgICAgIHVuc2lnbmVkIG5yX2J5dGVzLAorCQkgICAgICBjcHUgKnByb2Nlc3NvciwKKwkJICAgICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGlmIChtZS0+Y2FsbGJhY2stPmlvLnJlYWRfYnVmZmVyID09IE5VTEwpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAibm8gaW8ucmVhZF9idWZmZXIgbWV0aG9kIik7CisgIHJldHVybiBtZS0+Y2FsbGJhY2stPmlvLnJlYWRfYnVmZmVyKG1lLCBkZXN0LCBzcGFjZSwKKwkJCQkgICAgICBhZGRyLCBucl9ieXRlcywKKwkJCQkgICAgICBwcm9jZXNzb3IsIGNpYSk7Cit9CisKK0lOTElORV9ERVZJQ0VcCisodW5zaWduZWQpCitkZXZpY2VfaW9fd3JpdGVfYnVmZmVyKGRldmljZSAqbWUsCisJCSAgICAgICBjb25zdCB2b2lkICpzb3VyY2UsCisJCSAgICAgICBpbnQgc3BhY2UsCisJCSAgICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCisJCSAgICAgICB1bnNpZ25lZCBucl9ieXRlcywKKwkJICAgICAgIGNwdSAqcHJvY2Vzc29yLAorCQkgICAgICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGlmIChtZS0+Y2FsbGJhY2stPmlvLndyaXRlX2J1ZmZlciA9PSBOVUxMKQorICAgIGRldmljZV9lcnJvcihtZSwgIm5vIGlvLndyaXRlX2J1ZmZlciBtZXRob2QiKTsKKyAgcmV0dXJuIG1lLT5jYWxsYmFjay0+aW8ud3JpdGVfYnVmZmVyKG1lLCBzb3VyY2UsIHNwYWNlLAorCQkJCSAgICAgICBhZGRyLCBucl9ieXRlcywKKwkJCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOworfQorCitJTkxJTkVfREVWSUNFXAorKHVuc2lnbmVkKQorZGV2aWNlX2RtYV9yZWFkX2J1ZmZlcihkZXZpY2UgKm1lLAorCQkgICAgICAgdm9pZCAqZGVzdCwKKwkJICAgICAgIGludCBzcGFjZSwKKwkJICAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKKwkJICAgICAgIHVuc2lnbmVkIG5yX2J5dGVzKQoreworICBpZiAobWUtPmNhbGxiYWNrLT5kbWEucmVhZF9idWZmZXIgPT0gTlVMTCkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJubyBkbWEucmVhZF9idWZmZXIgbWV0aG9kIik7CisgIHJldHVybiBtZS0+Y2FsbGJhY2stPmRtYS5yZWFkX2J1ZmZlcihtZSwgZGVzdCwgc3BhY2UsCisJCQkJICAgICAgIGFkZHIsIG5yX2J5dGVzKTsKK30KKworSU5MSU5FX0RFVklDRVwKKyh1bnNpZ25lZCkKK2RldmljZV9kbWFfd3JpdGVfYnVmZmVyKGRldmljZSAqbWUsCisJCQljb25zdCB2b2lkICpzb3VyY2UsCisJCQlpbnQgc3BhY2UsCisJCQl1bnNpZ25lZF93b3JkIGFkZHIsCisJCQl1bnNpZ25lZCBucl9ieXRlcywKKwkJCWludCB2aW9sYXRlX3JlYWRfb25seV9zZWN0aW9uKQoreworICBpZiAobWUtPmNhbGxiYWNrLT5kbWEud3JpdGVfYnVmZmVyID09IE5VTEwpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAibm8gZG1hLndyaXRlX2J1ZmZlciBtZXRob2QiKTsKKyAgcmV0dXJuIG1lLT5jYWxsYmFjay0+ZG1hLndyaXRlX2J1ZmZlcihtZSwgc291cmNlLCBzcGFjZSwKKwkJCQkJYWRkciwgbnJfYnl0ZXMsCisJCQkJCXZpb2xhdGVfcmVhZF9vbmx5X3NlY3Rpb24pOworfQorCitJTkxJTkVfREVWSUNFXAorKHZvaWQpCitkZXZpY2VfYXR0YWNoX2FkZHJlc3MoZGV2aWNlICptZSwKKwkJICAgICAgYXR0YWNoX3R5cGUgYXR0YWNoLAorCQkgICAgICBpbnQgc3BhY2UsCisJCSAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKKwkJICAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCisJCSAgICAgIGFjY2Vzc190eXBlIGFjY2VzcywKKwkJICAgICAgZGV2aWNlICpjbGllbnQpIC8qY2FsbGJhY2svZGVmYXVsdCovCit7CisgIGlmIChtZS0+Y2FsbGJhY2stPmFkZHJlc3MuYXR0YWNoID09IE5VTEwpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAibm8gYWRkcmVzcy5hdHRhY2ggbWV0aG9kIik7CisgIG1lLT5jYWxsYmFjay0+YWRkcmVzcy5hdHRhY2gobWUsIGF0dGFjaCwgc3BhY2UsCisJCQkgICAgICAgYWRkciwgbnJfYnl0ZXMsIGFjY2VzcywgY2xpZW50KTsKK30KKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKQorZGV2aWNlX2RldGFjaF9hZGRyZXNzKGRldmljZSAqbWUsCisJCSAgICAgIGF0dGFjaF90eXBlIGF0dGFjaCwKKwkJICAgICAgaW50IHNwYWNlLAorCQkgICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCisJCSAgICAgIHVuc2lnbmVkIG5yX2J5dGVzLAorCQkgICAgICBhY2Nlc3NfdHlwZSBhY2Nlc3MsCisJCSAgICAgIGRldmljZSAqY2xpZW50KSAvKmNhbGxiYWNrL2RlZmF1bHQqLworeworICBpZiAobWUtPmNhbGxiYWNrLT5hZGRyZXNzLmRldGFjaCA9PSBOVUxMKQorICAgIGRldmljZV9lcnJvcihtZSwgIm5vIGFkZHJlc3MuZGV0YWNoIG1ldGhvZCIpOworICBtZS0+Y2FsbGJhY2stPmFkZHJlc3MuZGV0YWNoKG1lLCBhdHRhY2gsIHNwYWNlLAorCQkJICAgICAgIGFkZHIsIG5yX2J5dGVzLCBhY2Nlc3MsIGNsaWVudCk7Cit9CisKKworDAorLyogSW50ZXJydXB0czogKi8KKworSU5MSU5FX0RFVklDRSh2b2lkKQorZGV2aWNlX2ludGVycnVwdF9ldmVudChkZXZpY2UgKm1lLAorCQkgICAgICAgaW50IG15X3BvcnQsCisJCSAgICAgICBpbnQgbGV2ZWwsCisJCSAgICAgICBjcHUgKnByb2Nlc3NvciwKKwkJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBpbnQgZm91bmRfYW5fZWRnZSA9IDA7CisgIGRldmljZV9pbnRlcnJ1cHRfZWRnZSAqZWRnZTsKKyAgLyogZGV2aWNlJ3MgaW50ZXJydXB0IGxpbmVzIGRpcmVjdGx5IGNvbm5lY3RlZCAqLworICBmb3IgKGVkZ2UgPSBtZS0+aW50ZXJydXB0X2Rlc3RpbmF0aW9uczsKKyAgICAgICBlZGdlICE9IE5VTEw7CisgICAgICAgZWRnZSA9IGVkZ2UtPm5leHQpIHsKKyAgICBpZiAoZWRnZS0+bXlfcG9ydCA9PSBteV9wb3J0KSB7CisgICAgICBpZiAoZWRnZS0+ZGVzdC0+Y2FsbGJhY2stPmludGVycnVwdC5ldmVudCA9PSBOVUxMKQorCWRldmljZV9lcnJvcihtZSwgIm5vIGludGVycnVwdCBtZXRob2QiKTsKKyAgICAgIGVkZ2UtPmRlc3QtPmNhbGxiYWNrLT5pbnRlcnJ1cHQuZXZlbnQoZWRnZS0+ZGVzdCwKKwkJCQkJICAgIGVkZ2UtPmRlc3RfcG9ydCwKKwkJCQkJICAgIG1lLAorCQkJCQkgICAgbXlfcG9ydCwKKwkJCQkJICAgIGxldmVsLAorCQkJCQkgICAgcHJvY2Vzc29yLCBjaWEpOworICAgICAgZm91bmRfYW5fZWRnZSA9IDE7CisgICAgfQorICB9CisgIGlmICghZm91bmRfYW5fZWRnZSkgeworICAgIGRldmljZV9lcnJvcihtZSwgIk5vIGludGVycnVwdCBlZGdlIGZvciBwb3J0ICVkIiwgbXlfcG9ydCk7CisgIH0KK30KKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKQorZGV2aWNlX2ludGVycnVwdF9hdHRhY2goZGV2aWNlICptZSwKKwkJCWludCBteV9wb3J0LAorCQkJZGV2aWNlICpkZXN0LAorCQkJaW50IGRlc3RfcG9ydCwKKwkJCW9iamVjdF9kaXNwb3NpdGlvbiBkaXNwb3NpdGlvbikKK3sKKyAgYXR0YWNoX2RldmljZV9pbnRlcnJ1cHRfZWRnZSgmbWUtPmludGVycnVwdF9kZXN0aW5hdGlvbnMsCisJCQkgICAgICAgbXlfcG9ydCwKKwkJCSAgICAgICBkZXN0LAorCQkJICAgICAgIGRlc3RfcG9ydCwKKwkJCSAgICAgICBkaXNwb3NpdGlvbik7Cit9CisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkKK2RldmljZV9pbnRlcnJ1cHRfZGV0YWNoKGRldmljZSAqbWUsCisJCQlpbnQgbXlfcG9ydCwKKwkJCWRldmljZSAqZGVzdCwKKwkJCWludCBkZXN0X3BvcnQpCit7CisgIGRldGFjaF9kZXZpY2VfaW50ZXJydXB0X2VkZ2UobWUsCisJCQkgICAgICAgJm1lLT5pbnRlcnJ1cHRfZGVzdGluYXRpb25zLAorCQkJICAgICAgIG15X3BvcnQsCisJCQkgICAgICAgZGVzdCwKKwkJCSAgICAgICBkZXN0X3BvcnQpOworfQorCitJTkxJTkVfREVWSUNFXAorKHZvaWQpCitkZXZpY2VfaW50ZXJydXB0X3RyYXZlcnNlKGRldmljZSAqbWUsCisJCQkgIGRldmljZV9pbnRlcnJ1cHRfdHJhdmVyc2VfZnVuY3Rpb24gKmhhbmRsZXIsCisJCQkgIHZvaWQgKmRhdGEpCit7CisgIGRldmljZV9pbnRlcnJ1cHRfZWRnZSAqaW50ZXJydXB0X2VkZ2U7CisgIGZvciAoaW50ZXJydXB0X2VkZ2UgPSBtZS0+aW50ZXJydXB0X2Rlc3RpbmF0aW9uczsKKyAgICAgICBpbnRlcnJ1cHRfZWRnZSAhPSBOVUxMOworICAgICAgIGludGVycnVwdF9lZGdlID0gaW50ZXJydXB0X2VkZ2UtPm5leHQpIHsKKyAgICBoYW5kbGVyKG1lLCBpbnRlcnJ1cHRfZWRnZS0+bXlfcG9ydCwKKwkgICAgaW50ZXJydXB0X2VkZ2UtPmRlc3QsIGludGVycnVwdF9lZGdlLT5kZXN0X3BvcnQsCisJICAgIGRhdGEpOworICB9Cit9CisKK0lOTElORV9ERVZJQ0VcCisoaW50KQorZGV2aWNlX2ludGVycnVwdF9kZWNvZGUoZGV2aWNlICptZSwKKwkJCWNvbnN0IGNoYXIgKnBvcnRfbmFtZSwKKwkJCXBvcnRfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgaWYgKHBvcnRfbmFtZSA9PSBOVUxMIHx8IHBvcnRfbmFtZVswXSA9PSAnXDAnKQorICAgIHJldHVybiAwOworICBpZiAoaXNkaWdpdChwb3J0X25hbWVbMF0pKSB7CisgICAgcmV0dXJuIHN0cnRvdWwocG9ydF9uYW1lLCBOVUxMLCAwKTsKKyAgfQorICBlbHNlIHsKKyAgICBjb25zdCBkZXZpY2VfaW50ZXJydXB0X3BvcnRfZGVzY3JpcHRvciAqcG9ydHMgPQorICAgICAgbWUtPmNhbGxiYWNrLT5pbnRlcnJ1cHQucG9ydHM7CisgICAgaWYgKHBvcnRzICE9IE5VTEwpIHsKKyAgICAgIHdoaWxlIChwb3J0cy0+bmFtZSAhPSBOVUxMKSB7CisJaWYgKHBvcnRzLT5kaXJlY3Rpb24gPT0gYmlkaXJlY3RfcG9ydAorCSAgICB8fCBwb3J0cy0+ZGlyZWN0aW9uID09IGRpcmVjdGlvbikgeworCSAgaWYgKHBvcnRzLT5ucl9wb3J0cyA+IDApIHsKKwkgICAgaW50IGxlbiA9IHN0cmxlbihwb3J0cy0+bmFtZSk7CisJICAgIGlmIChzdHJuY21wKHBvcnRfbmFtZSwgcG9ydHMtPm5hbWUsIGxlbikgPT0gMCkgeworCSAgICAgIGlmIChwb3J0X25hbWVbbGVuXSA9PSAnXDAnKQorCQlyZXR1cm4gcG9ydHMtPm51bWJlcjsKKwkgICAgICBlbHNlIGlmKGlzZGlnaXQocG9ydF9uYW1lW2xlbl0pKSB7CisJCWludCBwb3J0ID0gcG9ydHMtPm51bWJlciArIHN0cnRvdWwoJnBvcnRfbmFtZVtsZW5dLCBOVUxMLCAwKTsKKwkJaWYgKHBvcnQgPj0gcG9ydHMtPm51bWJlciArIHBvcnRzLT5ucl9wb3J0cykKKwkJICBkZXZpY2VfZXJyb3IobWUsICJJbnRlcnJ1cHQgcG9ydCAlcyBvdXQgb2YgcmFuZ2UiLAorCQkJICAgICAgIHBvcnRfbmFtZSk7CisJCXJldHVybiBwb3J0OworCSAgICAgIH0KKwkgICAgfQorCSAgfQorCSAgZWxzZSBpZiAoc3RyY21wKHBvcnRfbmFtZSwgcG9ydHMtPm5hbWUpID09IDApCisJICAgIHJldHVybiBwb3J0cy0+bnVtYmVyOworCX0KKwlwb3J0cysrOworICAgICAgfQorICAgIH0KKyAgfQorICBkZXZpY2VfZXJyb3IobWUsICJVbnJlY29uaXplZCBpbnRlcnJ1cHQgcG9ydCAlcyIsIHBvcnRfbmFtZSk7CisgIHJldHVybiAwOworfQorCitJTkxJTkVfREVWSUNFXAorKGludCkKK2RldmljZV9pbnRlcnJ1cHRfZW5jb2RlKGRldmljZSAqbWUsCisJCQlpbnQgcG9ydF9udW1iZXIsCisJCQljaGFyICpidWYsCisJCQlpbnQgc2l6ZW9mX2J1ZiwKKwkJCXBvcnRfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgY29uc3QgZGV2aWNlX2ludGVycnVwdF9wb3J0X2Rlc2NyaXB0b3IgKnBvcnRzID0gTlVMTDsKKyAgcG9ydHMgPSBtZS0+Y2FsbGJhY2stPmludGVycnVwdC5wb3J0czsKKyAgaWYgKHBvcnRzICE9IE5VTEwpIHsKKyAgICB3aGlsZSAocG9ydHMtPm5hbWUgIT0gTlVMTCkgeworICAgICAgaWYgKHBvcnRzLT5kaXJlY3Rpb24gPT0gYmlkaXJlY3RfcG9ydAorCSAgfHwgcG9ydHMtPmRpcmVjdGlvbiA9PSBkaXJlY3Rpb24pIHsKKwlpZiAocG9ydHMtPm5yX3BvcnRzID4gMCkgeworCSAgaWYgKHBvcnRfbnVtYmVyID49IHBvcnRzLT5udW1iZXIKKwkgICAgICAmJiBwb3J0X251bWJlciA8IHBvcnRzLT5udW1iZXIgKyBwb3J0cy0+bnJfcG9ydHMpIHsKKwkgICAgc3RyY3B5KGJ1ZiwgcG9ydHMtPm5hbWUpOworCSAgICBzcHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCAiJWQiLCBwb3J0X251bWJlciAtIHBvcnRzLT5udW1iZXIpOworCSAgICBpZiAoc3RybGVuKGJ1ZikgPj0gc2l6ZW9mX2J1ZikKKwkgICAgICBlcnJvcigiZGV2aWNlX2ludGVycnVwdF9lbmNvZGU6IGJ1ZmZlciBvdmVyZmxvdyIpOworCSAgICByZXR1cm4gc3RybGVuKGJ1Zik7CisJICB9CisJfQorCWVsc2UgeworCSAgaWYgKHBvcnRzLT5udW1iZXIgPT0gcG9ydF9udW1iZXIpIHsKKwkgICAgaWYgKHN0cmxlbihwb3J0cy0+bmFtZSkgPj0gc2l6ZW9mX2J1ZikKKwkgICAgICBlcnJvcigiZGV2aWNlX2ludGVycnVwdF9lbmNvZGU6IGJ1ZmZlciBvdmVyZmxvdyIpOworCSAgICBzdHJjcHkoYnVmLCBwb3J0cy0+bmFtZSk7CisJICAgIHJldHVybiBzdHJsZW4oYnVmKTsKKwkgIH0KKwl9CisgICAgICB9CisgICAgICBwb3J0cysrOworICAgIH0KKyAgfQorICBzcHJpbnRmKGJ1ZiwgIiVkIiwgcG9ydF9udW1iZXIpOworICBpZiAoc3RybGVuKGJ1ZikgPj0gc2l6ZW9mX2J1ZikKKyAgICBlcnJvcigiZGV2aWNlX2ludGVycnVwdF9lbmNvZGU6IGJ1ZmZlciBvdmVyZmxvdyIpOworICByZXR1cm4gc3RybGVuKGJ1Zik7Cit9CisKKworDAorLyogSU9DVEw6ICovCisKK0VYVEVSTl9ERVZJQ0VcCisoaW50KQorZGV2aWNlX2lvY3RsKGRldmljZSAqbWUsCisJICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgIHVuc2lnbmVkX3dvcmQgY2lhLAorCSAgICAgZGV2aWNlX2lvY3RsX3JlcXVlc3QgcmVxdWVzdCwKKwkgICAgIC4uLikKK3sKKyAgaW50IHN0YXR1czsKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQoYXAsIHJlcXVlc3QpOworICBpZiAobWUtPmNhbGxiYWNrLT5pb2N0bCA9PSBOVUxMKQorICAgIGRldmljZV9lcnJvcihtZSwgIm5vIGlvY3RsIG1ldGhvZCIpOworICBzdGF0dXMgPSBtZS0+Y2FsbGJhY2stPmlvY3RsKG1lLCBwcm9jZXNzb3IsIGNpYSwgcmVxdWVzdCwgYXApOworICB2YV9lbmQoYXApOworICByZXR1cm4gc3RhdHVzOworfQorICAgICAgCisKKwwKKy8qIEkvTyAqLworCitFWFRFUk5fREVWSUNFXAorKHZvaWQgdm9sYXRpbGUpCitkZXZpY2VfZXJyb3IoZGV2aWNlICptZSwKKwkgICAgIGNvbnN0IGNoYXIgKmZtdCwKKwkgICAgIC4uLikKK3sKKyAgY2hhciBtZXNzYWdlWzEwMjRdOworICB2YV9saXN0IGFwOworICAvKiBmb3JtYXQgdGhlIG1lc3NhZ2UgKi8KKyAgdmFfc3RhcnQoYXAsIGZtdCk7CisgIHZzcHJpbnRmKG1lc3NhZ2UsIGZtdCwgYXApOworICB2YV9lbmQoYXApOworICAvKiBzYW5pdHkgY2hlY2sgKi8KKyAgaWYgKHN0cmxlbihtZXNzYWdlKSA+PSBzaXplb2YobWVzc2FnZSkpCisgICAgZXJyb3IoImRldmljZV9lcnJvcjogYnVmZmVyIG92ZXJmbG93Iik7CisgIGlmIChtZSA9PSBOVUxMKQorICAgIGVycm9yKCJkZXZpY2U6ICVzIiwgbWVzc2FnZSk7CisgIGVsc2UgaWYgKG1lLT5wYXRoICE9IE5VTEwgJiYgbWUtPnBhdGhbMF0gIT0gJ1wwJykKKyAgICBlcnJvcigiJXM6ICVzIiwgbWUtPnBhdGgsIG1lc3NhZ2UpOworICBlbHNlIGlmIChtZS0+bmFtZSAhPSBOVUxMICYmIG1lLT5uYW1lWzBdICE9ICdcMCcpCisgICAgZXJyb3IoIiVzOiAlcyIsIG1lLT5uYW1lLCBtZXNzYWdlKTsKKyAgZWxzZQorICAgIGVycm9yKCJkZXZpY2U6ICVzIiwgbWVzc2FnZSk7CisgIHdoaWxlKDEpOworfQorCitJTkxJTkVfREVWSUNFXAorKGludCkKK2RldmljZV90cmFjZShkZXZpY2UgKm1lKQoreworICByZXR1cm4gbWUtPnRyYWNlOworfQorCisMCisvKiBFeHRlcm5hbCByZXByZXNlbnRhdGlvbiAqLworCitJTkxJTkVfREVWSUNFXAorKGRldmljZSAqKQorZXh0ZXJuYWxfdG9fZGV2aWNlKGRldmljZSAqdHJlZV9tZW1iZXIsCisJCSAgIHVuc2lnbmVkX2NlbGwgcGhhbmRsZSkKK3sKKyAgZGV2aWNlICptZSA9IGNhcF9pbnRlcm5hbCh0cmVlX21lbWJlci0+cGhhbmRsZXMsIHBoYW5kbGUpOworICByZXR1cm4gbWU7Cit9CisKK0lOTElORV9ERVZJQ0VcCisodW5zaWduZWRfY2VsbCkKK2RldmljZV90b19leHRlcm5hbChkZXZpY2UgKm1lKQoreworICB1bnNpZ25lZF9jZWxsIHBoYW5kbGUgPSBjYXBfZXh0ZXJuYWwobWUtPnBoYW5kbGVzLCBtZSk7CisgIHJldHVybiBwaGFuZGxlOworfQorCitJTkxJTkVfREVWSUNFXAorKGRldmljZV9pbnN0YW5jZSAqKQorZXh0ZXJuYWxfdG9fZGV2aWNlX2luc3RhbmNlKGRldmljZSAqdHJlZV9tZW1iZXIsCisJCQkgICAgdW5zaWduZWRfY2VsbCBpaGFuZGxlKQoreworICBkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlID0gY2FwX2ludGVybmFsKHRyZWVfbWVtYmVyLT5paGFuZGxlcywgaWhhbmRsZSk7CisgIHJldHVybiBpbnN0YW5jZTsKK30KKworSU5MSU5FX0RFVklDRVwKKyh1bnNpZ25lZF9jZWxsKQorZGV2aWNlX2luc3RhbmNlX3RvX2V4dGVybmFsKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UpCit7CisgIHVuc2lnbmVkX2NlbGwgaWhhbmRsZSA9IGNhcF9leHRlcm5hbChpbnN0YW5jZS0+b3duZXItPmloYW5kbGVzLCBpbnN0YW5jZSk7CisgIHJldHVybiBpaGFuZGxlOworfQorCisKKy8qIE1hcCBvbnRvIHRoZSBldmVudCBmdW5jdGlvbnMgKi8KKworSU5MSU5FX0RFVklDRVwKKyhldmVudF9lbnRyeV90YWcpCitkZXZpY2VfZXZlbnRfcXVldWVfc2NoZWR1bGUoZGV2aWNlICptZSwKKwkJCSAgICBzaWduZWQ2NCBkZWx0YV90aW1lLAorCQkJICAgIGRldmljZV9ldmVudF9oYW5kbGVyICpoYW5kbGVyLAorCQkJICAgIHZvaWQgKmRhdGEpCit7CisgIHJldHVybiBldmVudF9xdWV1ZV9zY2hlZHVsZShwc2ltX2V2ZW50X3F1ZXVlKG1lLT5zeXN0ZW0pLAorCQkJICAgICAgZGVsdGFfdGltZSwKKwkJCSAgICAgIGhhbmRsZXIsCisJCQkgICAgICBkYXRhKTsKK30KKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKQorZGV2aWNlX2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUoZGV2aWNlICptZSwKKwkJCSAgICAgIGV2ZW50X2VudHJ5X3RhZyBldmVudF90b19yZW1vdmUpCit7CisgIGV2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUocHNpbV9ldmVudF9xdWV1ZShtZS0+c3lzdGVtKSwKKwkJCSBldmVudF90b19yZW1vdmUpOworfQorCitJTkxJTkVfREVWSUNFXAorKHNpZ25lZDY0KQorZGV2aWNlX2V2ZW50X3F1ZXVlX3RpbWUoZGV2aWNlICptZSkKK3sKKyAgcmV0dXJuIGV2ZW50X3F1ZXVlX3RpbWUocHNpbV9ldmVudF9xdWV1ZShtZS0+c3lzdGVtKSk7Cit9CisKKworLyogSW5pdGlhbGl6YXRpb246ICovCisKKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKQorZGV2aWNlX2NsZWFuKGRldmljZSAqbWUsCisJICAgICB2b2lkICpkYXRhKQoreworICBwc2ltICpzeXN0ZW07CisgIHN5c3RlbSA9IChwc2ltKilkYXRhOworICBUUkFDRSh0cmFjZV9kZXZpY2VfaW5pdCwgKCJkZXZpY2VfY2xlYW4gLSBpbml0aWFsaXppbmcgJXMiLCBtZS0+cGF0aCkpOworICBjbGVhbl9kZXZpY2VfaW50ZXJydXB0X2VkZ2VzKCZtZS0+aW50ZXJydXB0X2Rlc3RpbmF0aW9ucyk7CisgIGNsZWFuX2RldmljZV9pbnN0YW5jZXMobWUpOworICBjbGVhbl9kZXZpY2VfcHJvcGVydGllcyhtZSk7Cit9CisKKy8qIERldmljZSBpbml0aWFsaXphdGlvbjogKi8KKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKQorZGV2aWNlX2luaXRfYWRkcmVzcyhkZXZpY2UgKm1lLAorCQkgICAgdm9pZCAqZGF0YSkKK3sKKyAgcHNpbSAqc3lzdGVtID0gKHBzaW0qKWRhdGE7CisgIGludCBucl9hZGRyZXNzX2NlbGxzOworICBpbnQgbnJfc2l6ZV9jZWxsczsKKyAgVFJBQ0UodHJhY2VfZGV2aWNlX2luaXQsICgiZGV2aWNlX2luaXRfYWRkcmVzcyAtIGluaXRpYWxpemluZyAlcyIsIG1lLT5wYXRoKSk7CisKKyAgLyogZW5zdXJlIHRoZSBjYXAgZGF0YWJhc2UgaXMgdmFsaWQgKi8KKyAgaWYgKG1lLT5wYXJlbnQgPT0gTlVMTCkgeworICAgIGNhcF9pbml0KG1lLT5paGFuZGxlcyk7CisgICAgY2FwX2luaXQobWUtPnBoYW5kbGVzKTsKKyAgfQorCisgIC8qIHNvbWUgYmFzaWNzICovCisgIG1lLT5zeXN0ZW0gPSBzeXN0ZW07IC8qIG1pc2MgdGhpbmdzIG5vdCBrbm93biB1bnRpbCBub3cgKi8KKyAgbWUtPnRyYWNlID0gKGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAidHJhY2UiKQorCSAgICAgICA/IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJ0cmFjZSIpCisJICAgICAgIDogMCk7CisKKyAgLyogRW5zdXJlIHRoYXQgdGhlIGZpcnN0IGFkZHJlc3MgZm91bmQgaW4gdGhlIHJlZyBwcm9wZXJ0eSBtYXRjaGVzCisgICAgIGFueXRoaW5nIHRoYXQgd2FzIHNwZWNpZmllZCBhcyBwYXJ0IG9mIHRoZSBkZXZpY2VzIG5hbWUgKi8KKyAgaWYgKGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAicmVnIikgIT0gTlVMTCkgeworICAgIHJlZ19wcm9wZXJ0eV9zcGVjIHVuaXQ7CisgICAgZGV2aWNlX2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5KG1lLCAicmVnIiwgMCwgJnVuaXQpOworICAgIGlmIChtZW1jbXAoZGV2aWNlX3VuaXRfYWRkcmVzcyhtZSksICZ1bml0LmFkZHJlc3MsIHNpemVvZih1bml0LmFkZHJlc3MpKQorCSE9IDApCisgICAgICBkZXZpY2VfZXJyb3IobWUsICJVbml0IGFkZHJlc3MgYXMgc3BlY2lmaWVkIGJ5IHRoZSByZWcgcHJvcGVydHkgaW4gY29uZmxpY3Qgd2l0aCB0aGUgdmFsdWUgcHJldmlvdXNseSBzcGVjaWZpZWQgaW4gdGhlIGRldmljZXMgcGF0aCIpOworICB9CisKKyAgLyogZW5zdXJlIHRoYXQgdGhlIGRldmljZXMgI2FkZHJlc3Mvc2l6ZS1jZWxscyBpcyBjb25zaXN0ZW50ICovCisgIG5yX2FkZHJlc3NfY2VsbHMgPSBkZXZpY2VfbnJfYWRkcmVzc19jZWxscyhtZSk7CisgIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgIiNhZGRyZXNzLWNlbGxzIikgIT0gTlVMTAorICAgICAgJiYgKG5yX2FkZHJlc3NfY2VsbHMKKwkgICE9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICIjYWRkcmVzcy1jZWxscyIpKSkKKyAgICBkZXZpY2VfZXJyb3IobWUsICIjYWRkcmVzcy1jZWxscyBwcm9wZXJ0eSB1c2VkIGJlZm9yZSBkZWZpbmVkIik7CisgIG5yX3NpemVfY2VsbHMgPSBkZXZpY2VfbnJfc2l6ZV9jZWxscyhtZSk7CisgIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgIiNzaXplLWNlbGxzIikgIT0gTlVMTAorICAgICAgJiYgKG5yX3NpemVfY2VsbHMKKwkgICE9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICIjc2l6ZS1jZWxscyIpKSkKKyAgICBkZXZpY2VfZXJyb3IobWUsICIjc2l6ZS1jZWxscyBwcm9wZXJ0eSB1c2VkIGJlZm9yZSBkZWZpbmVkIik7CisKKyAgLyogbm93IGluaXQgaXQgKi8KKyAgaWYgKG1lLT5jYWxsYmFjay0+aW5pdC5hZGRyZXNzICE9IE5VTEwpCisgICAgbWUtPmNhbGxiYWNrLT5pbml0LmFkZHJlc3MobWUpOworfQorCitJTkxJTkVfREVWSUNFXAorKHZvaWQpCitkZXZpY2VfaW5pdF9kYXRhKGRldmljZSAqbWUsCisJCSAgICB2b2lkICpkYXRhKQoreworICBUUkFDRSh0cmFjZV9kZXZpY2VfaW5pdCwgKCJkZXZpY2VfaW5pdF9kYXRhIC0gaW5pdGlhbGl6aW5nICVzIiwgbWUtPnBhdGgpKTsKKyAgaWYgKG1lLT5jYWxsYmFjay0+aW5pdC5kYXRhICE9IE5VTEwpCisgICAgbWUtPmNhbGxiYWNrLT5pbml0LmRhdGEobWUpOworfQorCisjZW5kaWYgLyogX0RFVklDRV9DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9kZXZpY2UuaCBiL3NpbS9wcGMvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjOGNlNQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZGV2aWNlLmgKQEAgLTAsMCArMSw3OTcgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgX0RFVklDRV9IXworI2RlZmluZSBfREVWSUNFX0hfCisKKyNpZm5kZWYgSU5MSU5FX0RFVklDRQorI2RlZmluZSBJTkxJTkVfREVWSUNFCisjZW5kaWYKKworLyogZGVjbGFyZWQgaW4gYmFzaWNzLmgsIHRoaXMgb2JqZWN0IGlzIHVzZWQgZXZlcnl3aGVyZSAqLworLyogdHlwZWRlZiBzdHJ1Y3QgX2RldmljZSBkZXZpY2U7ICovCisKKworLyogSW50cm9kdWN0aW9uOgorCisgICBBcyBleHBsYWluZWQgaW4gZWFybGllciBzZWN0aW9ucywgdGhlIGRldmljZSwgZGV2aWNlIGluc3RhbmNlLAorICAgcHJvcGVydHkgYW5kIGludGVycnVwdHMgbGllIGF0IHRoZSBoZWFydCBvZiBQU0lNJ3MgZGV2aWNlIG1vZGVsLgorCisgICBJbiB0aGUgYmVsb3cgYSBzeW5vcHNpcyBvZiB0aGUgZGV2aWNlIG9iamVjdCBhbmQgdGhlIG9wZXJhdGlvbnMgaXQKKyAgIHN1cHBvcnRzIGFyZSBnaXZlbi4gIERldGFpbHMgb2YgdGhpcyBvYmplY3QgY2FuIGJlIGZvdW5kIGluIHRoZQorICAgZmlsZXMgPDxkZXZpY2UuaD4+IGFuZCA8PGRldmljZS5jPj4uCisKKyAgICovCisKKworLyogRGV2aWNlIGNyZWF0aW9uOiAqLworCitJTkxJTkVfREVWSUNFXAorKGRldmljZSAqKSBkZXZpY2VfY3JlYXRlCisoZGV2aWNlICpwYXJlbnQsCisgY29uc3QgY2hhciAqYmFzZSwKKyBjb25zdCBjaGFyICpuYW1lLAorIGNvbnN0IGNoYXIgKnVuaXRfYWRkcmVzcywKKyBjb25zdCBjaGFyICphcmdzKTsKKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKSBkZXZpY2VfdXNhZ2UKKyhpbnQgdmVyYm9zZSk7CisKKworLyogRGV2aWNlIGluaXRpYWxpemF0aW9uOiAqLworCitJTkxJTkVfREVWSUNFXAorKHZvaWQpIGRldmljZV9jbGVhbgorKGRldmljZSAqcm9vdCwKKyB2b2lkICpkYXRhKTsKKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKSBkZXZpY2VfaW5pdF9zdGF0aWNfcHJvcGVydGllcworKGRldmljZSAqbWUsCisgdm9pZCAqZGF0YSk7CisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkgZGV2aWNlX2luaXRfYWRkcmVzcworKGRldmljZSAqbWUsCisgdm9pZCAqZGF0YSk7CisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkgZGV2aWNlX2luaXRfcnVudGltZV9wcm9wZXJ0aWVzCisoZGV2aWNlICptZSwKKyB2b2lkICpkYXRhKTsKKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKSBkZXZpY2VfaW5pdF9kYXRhCisoZGV2aWNlICptZSwKKyB2b2lkICpkYXRhKTsKKworCisvKiBSZWxhdGlvbnNoaXBzOgorCisgICBBIGRldmljZSBpcyBhYmxlIHRvIGRldGVybWluZSBpdHMgcmVsYXRpb25zaGlwIHRvIG90aGVyIGRldmljZXMKKyAgIHdpdGhpbiB0aGUgdHJlZS4gIE9wZXJhdGlvbnMgaW5jbHVkZSBxdWVyeWluZyBmb3IgYSBkZXZpY2VzIHBhcmVudCwKKyAgIHNpYmxpbmcsIGNoaWxkLCBuYW1lLCBhbmQgcGF0aCAoZnJvbSB0aGUgcm9vdCkuCisKKyAgICovCisKK0lOTElORV9ERVZJQ0VcCisoZGV2aWNlICopIGRldmljZV9wYXJlbnQKKyhkZXZpY2UgKm1lKTsKKworSU5MSU5FX0RFVklDRVwKKyhkZXZpY2UgKikgZGV2aWNlX3Jvb3QKKyhkZXZpY2UgKm1lKTsKKworSU5MSU5FX0RFVklDRVwKKyhkZXZpY2UgKikgZGV2aWNlX3NpYmxpbmcKKyhkZXZpY2UgKm1lKTsKKworSU5MSU5FX0RFVklDRVwKKyhkZXZpY2UgKikgZGV2aWNlX2NoaWxkCisoZGV2aWNlICptZSk7CisKK0lOTElORV9ERVZJQ0VcCisoY29uc3QgY2hhciAqKSBkZXZpY2VfbmFtZQorKGRldmljZSAqbWUpOworCitJTkxJTkVfREVWSUNFXAorKGNvbnN0IGNoYXIgKikgZGV2aWNlX2Jhc2UKKyhkZXZpY2UgKm1lKTsKKworSU5MSU5FX0RFVklDRVwKKyhjb25zdCBjaGFyICopIGRldmljZV9wYXRoCisoZGV2aWNlICptZSk7CisKK0lOTElORV9ERVZJQ0VcCisodm9pZCAqKSBkZXZpY2VfZGF0YQorKGRldmljZSAqbWUpOworCitJTkxJTkVfREVWSUNFXAorKHBzaW0gKikgZGV2aWNlX3N5c3RlbQorKGRldmljZSAqbWUpOworCit0eXBlZGVmIHN0cnVjdCBfZGV2aWNlX3VuaXQgeworICBpbnQgbnJfY2VsbHM7CisgIHVuc2lnbmVkX2NlbGwgY2VsbHNbNF07IC8qIHVudXNlZCBjZWxscyBhcmUgemVybyAqLworfSBkZXZpY2VfdW5pdDsKKworSU5MSU5FX0RFVklDRVwKKyhjb25zdCBkZXZpY2VfdW5pdCAqKSBkZXZpY2VfdW5pdF9hZGRyZXNzCisoZGV2aWNlICptZSk7CisKK0lOTElORV9ERVZJQ0VcCisoaW50KSBkZXZpY2VfZGVjb2RlX3VuaXQKKyhkZXZpY2UgKmJ1cywKKyBjb25zdCBjaGFyICp1bml0LAorIGRldmljZV91bml0ICphZGRyZXNzKTsKKworSU5MSU5FX0RFVklDRVwKKyhpbnQpIGRldmljZV9lbmNvZGVfdW5pdAorKGRldmljZSAqYnVzLAorIGNvbnN0IGRldmljZV91bml0ICp1bml0X2FkZHJlc3MsCisgY2hhciAqYnVmLAorIGludCBzaXplb2ZfYnVmKTsKKworCisvKiBDb252ZXJ0IGFuIE9wZW4gRmlybXdhcmUgc2l6ZSBpbnRvIGEgZm9ybSBzdWl0YWJsZSBmb3IgYXR0YWNoCisgICBhZGRyZXNzIGNhbGxzLgorCisgICBSZXR1cm4gYSB6ZXJvIHJlc3VsdCBpZiB0aGUgYWRkcmVzcyBzaG91bGQgYmUgaWdub3JlZCB3aGVuIGxvb2tpbmcKKyAgIGZvciBhdHRhY2ggYWRkcmVzc2VzICovCisKK0lOTElORV9ERVZJQ0VcCisoaW50KSBkZXZpY2VfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcworKGRldmljZSAqbWUsCisgY29uc3QgZGV2aWNlX3VuaXQgKmFkZHJlc3MsCisgaW50ICphdHRhY2hfc3BhY2UsCisgdW5zaWduZWRfd29yZCAqYXR0YWNoX2FkZHJlc3MsCisgZGV2aWNlICpjbGllbnQpOworCisKKy8qIENvbnZlcnQgYW4gT3BlbiBGaXJtd2FyZSBzaXplIGludG8gYSBmb3JtIHN1aXRhYmxlIGZvciBhdHRhY2gKKyAgIGFkZHJlc3MgY2FsbHMKKworICAgUmV0dXJuIGEgemVybyByZXN1bHQgaWYgdGhlIGFkZHJlc3Mgc2hvdWxkIGJlIGlnbm9yZWQgKi8KKworSU5MSU5FX0RFVklDRVwKKyhpbnQpIGRldmljZV9zaXplX3RvX2F0dGFjaF9zaXplCisoZGV2aWNlICptZSwKKyBjb25zdCBkZXZpY2VfdW5pdCAqc2l6ZSwKKyB1bnNpZ25lZCAqbnJfYnl0ZXMsCisgZGV2aWNlICpjbGllbnQpOworCisKK0lOTElORV9ERVZJQ0VcCisodW5zaWduZWQpIGRldmljZV9ucl9hZGRyZXNzX2NlbGxzCisoZGV2aWNlICptZSk7CisKK0lOTElORV9ERVZJQ0VcCisodW5zaWduZWQpIGRldmljZV9ucl9zaXplX2NlbGxzCisoZGV2aWNlICptZSk7CisKKworLyogUHJvcGVydGllczoKKworICAgQXR0YWNoZWQgdG8gYSBkZXZpY2UgYXJlIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMuICBFYWNoIHByb3BlcnR5IGhhcworICAgYSBzaXplIGFuZCB0eXBlIChib3RoIG9mIHdoaWNoIGNhbiBiZSBxdWVyaWVkKS4gIEEgZGV2aWNlIGlzIGFibGUKKyAgIHRvIGl0ZXJhdGUgb3ZlciBvciBxdWVyeSBhbmQgc2V0IGEgcHJvcGVydGllcyB2YWx1ZS4KKworICAgKi8KKworLyogVGhlIGZvbGxvd2luZyBhcmUgdmFsaWQgcHJvcGVydHkgdHlwZXMuICBUaGUgcHJvcGVydHkgYGFycmF5JyBpcworICAgZm9yIGdlbmVyaWMgdW50eXBlZCBkYXRhLiAqLworCit0eXBlZGVmIGVudW0geworICBhcnJheV9wcm9wZXJ0eSwKKyAgYm9vbGVhbl9wcm9wZXJ0eSwKKyAgaWhhbmRsZV9wcm9wZXJ0eSwgLypydW50aW1lKi8KKyAgaW50ZWdlcl9wcm9wZXJ0eSwKKyAgcmFuZ2VfYXJyYXlfcHJvcGVydHksCisgIHJlZ19hcnJheV9wcm9wZXJ0eSwKKyAgc3RyaW5nX3Byb3BlcnR5LAorICBzdHJpbmdfYXJyYXlfcHJvcGVydHksCit9IGRldmljZV9wcm9wZXJ0eV90eXBlOworCit0eXBlZGVmIHN0cnVjdCBfZGV2aWNlX3Byb3BlcnR5IGRldmljZV9wcm9wZXJ0eTsKK3N0cnVjdCBfZGV2aWNlX3Byb3BlcnR5IHsKKyAgZGV2aWNlICpvd25lcjsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgZGV2aWNlX3Byb3BlcnR5X3R5cGUgdHlwZTsKKyAgdW5zaWduZWQgc2l6ZW9mX2FycmF5OworICBjb25zdCB2b2lkICphcnJheTsKKyAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpvcmlnaW5hbDsKKyAgb2JqZWN0X2Rpc3Bvc2l0aW9uIGRpc3Bvc2l0aW9uOworfTsKKworCisvKiBpdGVyYXRlIHRocm91Z2ggdGhlIHByb3BlcnRpZXMgYXR0YWNoZWQgdG8gYSBkZXZpY2UgKi8KKworSU5MSU5FX0RFVklDRVwKKyhjb25zdCBkZXZpY2VfcHJvcGVydHkgKikgZGV2aWNlX25leHRfcHJvcGVydHkKKyhjb25zdCBkZXZpY2VfcHJvcGVydHkgKnByZXZpb3VzKTsKKworSU5MSU5FX0RFVklDRVwKKyhjb25zdCBkZXZpY2VfcHJvcGVydHkgKikgZGV2aWNlX2ZpbmRfcHJvcGVydHkKKyhkZXZpY2UgKm1lLAorIGNvbnN0IGNoYXIgKnByb3BlcnR5KTsgLyogTlVMTCBmb3IgZmlyc3QgcHJvcGVydHkgKi8KKworCisvKiBNYW5pcHVsYXRlIHRoZSBwcm9wZXJ0aWVzIGJlbG9uZ2luZyB0byBhIGdpdmVuIGRldmljZS4KKworICAgU0VUIG9uIHRoZSBvdGhlciBoYW5kIHdpbGwgZm9yY2UgdGhlIHByb3BlcnRpZXMgdmFsdWUuICBUaGUKKyAgIHNpbXVsYXRpb24gaXMgYWJvcnRlZCBpZiB0aGUgcHJvcGVydHkgd2FzIHByZXNlbnQgYnV0IG9mIGEKKyAgIGNvbmZsaWN0aW5nIHR5cGUuCisKKyAgIEZJTkQgcmV0dXJucyB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMgdmFsdWUsIGFib3J0aW5nIHRoZQorICAgc2ltdWxhdGlvbiBpZiB0aGUgcHJvcGVydHkgaXMgbWlzc2luZy4gIENvZGUgbG9jYXRpbmcgYSBwcm9wZXJ0eQorICAgc2hvdWxkIGZpcnN0IGNoZWNrIGl0cyB0eXBlICh1c2luZyBkZXZpY2VfZmluZF9wcm9wZXJ0eSBhYm92ZSkgYW5kCisgICB0aGVuIG9idGFpbiBpdHMgdmFsdWUgdXNpbmcgdGhlIGJlbG93LgorCisgICB2b2lkIGRldmljZV9hZGRfPHR5cGU+X3Byb3BlcnR5KGRldmljZSAqLCBjb25zdCBjaGFyICosIDx0eXBlPikKKyAgIHZvaWQgZGV2aWNlX2FkZF8qX2FycmF5X3Byb3BlcnR5KGRldmljZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IDx0eXBlPiosIGludCkKKyAgIHZvaWQgZGV2aWNlX3NldF8qX3Byb3BlcnR5KGRldmljZSAqLCBjb25zdCBjaGFyICosIDx0eXBlPikKKyAgIHZvaWQgZGV2aWNlX3NldF8qX2FycmF5X3Byb3BlcnR5KGRldmljZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IDx0eXBlPiosIGludCkKKyAgIDx0eXBlPiBkZXZpY2VfZmluZF8qX3Byb3BlcnR5KGRldmljZSAqLCBjb25zdCBjaGFyICopCisgICBpbnQgZGV2aWNlX2ZpbmRfKl9hcnJheV9wcm9wZXJ0eShkZXZpY2UgKiwgY29uc3QgY2hhciAqLCBpbnQsIDx0eXBlPiopCisKKyAgICovCisKKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKSBkZXZpY2VfYWRkX2FycmF5X3Byb3BlcnR5CisoZGV2aWNlICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyBjb25zdCB2b2lkICphcnJheSwKKyBpbnQgc2l6ZW9mX2FycmF5KTsKKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKSBkZXZpY2Vfc2V0X2FycmF5X3Byb3BlcnR5CisoZGV2aWNlICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyBjb25zdCB2b2lkICphcnJheSwKKyBpbnQgc2l6ZW9mX2FycmF5KTsKKworSU5MSU5FX0RFVklDRVwKKyhjb25zdCBkZXZpY2VfcHJvcGVydHkgKikgZGV2aWNlX2ZpbmRfYXJyYXlfcHJvcGVydHkKKyhkZXZpY2UgKm1lLAorIGNvbnN0IGNoYXIgKnByb3BlcnR5KTsKKworCisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkgZGV2aWNlX2FkZF9ib29sZWFuX3Byb3BlcnR5CisoZGV2aWNlICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyBpbnQgYm9vbCk7CisKK0lOTElORV9ERVZJQ0VcCisoaW50KSBkZXZpY2VfZmluZF9ib29sZWFuX3Byb3BlcnR5CisoZGV2aWNlICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSk7CisKKworCit0eXBlZGVmIHN0cnVjdCBfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5X3NwZWMgeworICBjb25zdCBjaGFyICpmdWxsX3BhdGg7Cit9IGloYW5kbGVfcnVudGltZV9wcm9wZXJ0eV9zcGVjOworCitJTkxJTkVfREVWSUNFXAorKHZvaWQpIGRldmljZV9hZGRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5CisoZGV2aWNlICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyBjb25zdCBpaGFuZGxlX3J1bnRpbWVfcHJvcGVydHlfc3BlYyAqaWhhbmRsZSk7CisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkgZGV2aWNlX2ZpbmRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5CisoZGV2aWNlICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyBpaGFuZGxlX3J1bnRpbWVfcHJvcGVydHlfc3BlYyAqaWhhbmRsZSk7CisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkgZGV2aWNlX3NldF9paGFuZGxlX3Byb3BlcnR5CisoZGV2aWNlICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyBkZXZpY2VfaW5zdGFuY2UgKmloYW5kbGUpOworCitJTkxJTkVfREVWSUNFXAorKGRldmljZV9pbnN0YW5jZSAqKSBkZXZpY2VfZmluZF9paGFuZGxlX3Byb3BlcnR5CisoZGV2aWNlICptZSwKKyBjb25zdCBjaGFyICpwcm9wZXJ0eSk7CisKKworCitJTkxJTkVfREVWSUNFXAorKHZvaWQpIGRldmljZV9hZGRfaW50ZWdlcl9wcm9wZXJ0eQorKGRldmljZSAqbWUsCisgY29uc3QgY2hhciAqcHJvcGVydHksCisgc2lnbmVkX2NlbGwgaW50ZWdlcik7CisKK0lOTElORV9ERVZJQ0VcCisoc2lnbmVkX2NlbGwpIGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkKKyhkZXZpY2UgKm1lLAorIGNvbnN0IGNoYXIgKnByb3BlcnR5KTsKKworSU5MSU5FX0RFVklDRVwKKyhpbnQpIGRldmljZV9maW5kX2ludGVnZXJfYXJyYXlfcHJvcGVydHkKKyhkZXZpY2UgKm1lLAorIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorIHVuc2lnbmVkIGluZGV4LAorIHNpZ25lZF93b3JkICppbnRlZ2VyKTsKKworCisKK3R5cGVkZWYgc3RydWN0IF9yYW5nZV9wcm9wZXJ0eV9zcGVjIHsKKyAgZGV2aWNlX3VuaXQgY2hpbGRfYWRkcmVzczsKKyAgZGV2aWNlX3VuaXQgcGFyZW50X2FkZHJlc3M7CisgIGRldmljZV91bml0IHNpemU7Cit9IHJhbmdlX3Byb3BlcnR5X3NwZWM7CisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkgZGV2aWNlX2FkZF9yYW5nZV9hcnJheV9wcm9wZXJ0eQorKGRldmljZSAqbWUsCisgY29uc3QgY2hhciAqcHJvcGVydHksCisgY29uc3QgcmFuZ2VfcHJvcGVydHlfc3BlYyAqcmFuZ2VzLAorIHVuc2lnbmVkIG5yX3Jhbmdlcyk7CisKK0lOTElORV9ERVZJQ0VcCisoaW50KSBkZXZpY2VfZmluZF9yYW5nZV9hcnJheV9wcm9wZXJ0eQorKGRldmljZSAqbWUsCisgY29uc3QgY2hhciAqcHJvcGVydHksCisgdW5zaWduZWQgaW5kZXgsCisgcmFuZ2VfcHJvcGVydHlfc3BlYyAqcmFuZ2UpOworCisKKwordHlwZWRlZiBzdHJ1Y3QgX3JlZ19wcm9wZXJ0eV9zcGVjIHsKKyAgZGV2aWNlX3VuaXQgYWRkcmVzczsKKyAgZGV2aWNlX3VuaXQgc2l6ZTsKK30gcmVnX3Byb3BlcnR5X3NwZWM7CisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkgZGV2aWNlX2FkZF9yZWdfYXJyYXlfcHJvcGVydHkKKyhkZXZpY2UgKm1lLAorIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorIGNvbnN0IHJlZ19wcm9wZXJ0eV9zcGVjICpyZWcsCisgdW5zaWduZWQgbnJfcmVncyk7CisKK0lOTElORV9ERVZJQ0VcCisoaW50KSBkZXZpY2VfZmluZF9yZWdfYXJyYXlfcHJvcGVydHkKKyhkZXZpY2UgKm1lLAorIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorIHVuc2lnbmVkIGluZGV4LAorIHJlZ19wcm9wZXJ0eV9zcGVjICpyZWcpOworCisKKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKSBkZXZpY2VfYWRkX3N0cmluZ19wcm9wZXJ0eQorKGRldmljZSAqbWUsCisgY29uc3QgY2hhciAqcHJvcGVydHksCisgY29uc3QgY2hhciAqc3RyaW5nKTsKKworSU5MSU5FX0RFVklDRVwKKyhjb25zdCBjaGFyICopIGRldmljZV9maW5kX3N0cmluZ19wcm9wZXJ0eQorKGRldmljZSAqbWUsCisgY29uc3QgY2hhciAqcHJvcGVydHkpOworCisKKwordHlwZWRlZiBjb25zdCBjaGFyICpzdHJpbmdfcHJvcGVydHlfc3BlYzsKKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKSBkZXZpY2VfYWRkX3N0cmluZ19hcnJheV9wcm9wZXJ0eQorKGRldmljZSAqbWUsCisgY29uc3QgY2hhciAqcHJvcGVydHksCisgY29uc3Qgc3RyaW5nX3Byb3BlcnR5X3NwZWMgKnN0cmluZ3MsCisgdW5zaWduZWQgbnJfc3RyaW5ncyk7CisKK0lOTElORV9ERVZJQ0VcCisoaW50KSBkZXZpY2VfZmluZF9zdHJpbmdfYXJyYXlfcHJvcGVydHkKKyhkZXZpY2UgKm1lLAorIGNvbnN0IGNoYXIgKnByb3BlcnR5LAorIHVuc2lnbmVkIGluZGV4LAorIHN0cmluZ19wcm9wZXJ0eV9zcGVjICpzdHJpbmcpOworCisKKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKSBkZXZpY2VfYWRkX2R1cGxpY2F0ZV9wcm9wZXJ0eQorKGRldmljZSAqbWUsCisgY29uc3QgY2hhciAqcHJvcGVydHksCisgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpvcmlnaW5hbCk7CisKKworCisvKiBJbnN0YW5jZXM6CisKKyAgIEFzIHdpdGggSUVFRTEyNzUsIGEgZGV2aWNlIGNhbiBiZSBvcGVuZWQsIGNyZWF0aW5nIGFuIGluc3RhbmNlLgorICAgSW5zdGFuY2VzIHByb3ZpZGUgbW9yZSBhYnN0cmFjdCBpbnRlcmZhY2VzIHRvIHRoZSB1bmRlcmx5aW5nCisgICBoYXJkd2FyZS4gIEZvciBleGFtcGxlLCB0aGUgaW5zdGFuY2UgbWV0aG9kcyBmb3IgYSBkaXNrIG1heSBpbmNsdWRlCisgICBjb2RlIHRoYXQgaXMgYWJsZSB0byBpbnRlcnByZXQgZmlsZSBzeXN0ZW1zIGZvdW5kIG9uIGRpc2tzLiAgU3VjaAorICAgbWV0aG9kcyB3b3VsZCB0aGVyZSBmb3IgYWxsb3cgdGhlIG1hbmlwdWxhdGlvbiBvZiBmaWxlcyBvbiB0aGUKKyAgIGRpc2tzIGZpbGUgc3lzdGVtLiAgVGhlIG9wZXJhdGlvbnMgd291bGQgYmUgaW1wbGVtZW50ZWQgdXNpbmcgdGhlCisgICBiYXNpYyBibG9jayBJL08gbW9kZWwgcHJvdmlkZWQgYnkgdGhlIGRpc2suCisKKyAgIFRoaXMgbW9kZWwgaW5jbHVkZXMgbWV0aG9kcyB0aGF0IGZhY2lsaWF0ZSB0aGUgY3JlYXRpb24gb2YgZGV2aWNlCisgICBpbnN0YW5jZSBhbmQgKHNob3VsZCBhIGdpdmVuIGRldmljZSBzdXBwb3J0IGl0KSBzdGFuZGFyZCBvcGVyYXRpb25zCisgICBvbiB0aG9zZSBpbnN0YW5jZXMuCisKKyAgICovCisKK3R5cGVkZWYgc3RydWN0IF9kZXZpY2VfaW5zdGFuY2VfY2FsbGJhY2tzIGRldmljZV9pbnN0YW5jZV9jYWxsYmFja3M7CisKK0lOTElORV9ERVZJQ0VcCisoZGV2aWNlX2luc3RhbmNlICopIGRldmljZV9jcmVhdGVfaW5zdGFuY2VfZnJvbQorKGRldmljZSAqbWUsIC8qT1IqLyBkZXZpY2VfaW5zdGFuY2UgKnBhcmVudCwKKyB2b2lkICpkYXRhLAorIGNvbnN0IGNoYXIgKnBhdGgsCisgY29uc3QgY2hhciAqYXJncywKKyBjb25zdCBkZXZpY2VfaW5zdGFuY2VfY2FsbGJhY2tzICpjYWxsYmFja3MpOworCitJTkxJTkVfREVWSUNFXAorKGRldmljZV9pbnN0YW5jZSAqKSBkZXZpY2VfY3JlYXRlX2luc3RhbmNlCisoZGV2aWNlICptZSwKKyBjb25zdCBjaGFyICpmdWxsX3BhdGgsCisgY29uc3QgY2hhciAqYXJncyk7CisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkgZGV2aWNlX2luc3RhbmNlX2RlbGV0ZQorKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UpOworCitJTkxJTkVfREVWSUNFXAorKGludCkgZGV2aWNlX2luc3RhbmNlX3JlYWQKKyhkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAorIHZvaWQgKmFkZHIsCisgdW5zaWduZWRfd29yZCBsZW4pOworCitJTkxJTkVfREVWSUNFXAorKGludCkgZGV2aWNlX2luc3RhbmNlX3dyaXRlCisoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKKyBjb25zdCB2b2lkICphZGRyLAorIHVuc2lnbmVkX3dvcmQgbGVuKTsKKworSU5MSU5FX0RFVklDRVwKKyhpbnQpIGRldmljZV9pbnN0YW5jZV9zZWVrCisoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKKyB1bnNpZ25lZF93b3JkIHBvc19oaSwKKyB1bnNpZ25lZF93b3JkIHBvc19sbyk7CisKK0lOTElORV9ERVZJQ0VcCisoaW50KSBkZXZpY2VfaW5zdGFuY2VfY2FsbF9tZXRob2QKKyhkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAorIGNvbnN0IGNoYXIgKm1ldGhvZCwKKyBpbnQgbl9zdGFja19hcmdzLAorIHVuc2lnbmVkX2NlbGwgc3RhY2tfYXJnc1svKm5fc3RhY2tfYXJncyovXSwKKyBpbnQgbl9zdGFja19yZXR1cm5zLAorIHVuc2lnbmVkX2NlbGwgc3RhY2tfcmV0dXJuc1svKm5fc3RhY2tfcmV0dXJucyovXSk7CisKK0lOTElORV9ERVZJQ0VcCisoZGV2aWNlICopIGRldmljZV9pbnN0YW5jZV9kZXZpY2UKKyhkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlKTsKKworSU5MSU5FX0RFVklDRVwKKyhjb25zdCBjaGFyICopIGRldmljZV9pbnN0YW5jZV9wYXRoCisoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSk7CisKK0lOTElORV9ERVZJQ0VcCisodm9pZCAqKSBkZXZpY2VfaW5zdGFuY2VfZGF0YQorKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UpOworCisKKy8qIEludGVycnVwdHM6CisKKyAgICovCisKKy8qIEludGVycnVwdCBTb3VyY2UKKworICAgQSBkZXZpY2UgZHJpdmVzIGl0cyBpbnRlcnJ1cHQgbGluZSB1c2luZyB0aGUgY2FsbAorCisgICAqLworCitJTkxJTkVfREVWSUNFXAorKHZvaWQpIGRldmljZV9pbnRlcnJ1cHRfZXZlbnQKKyhkZXZpY2UgKm1lLAorIGludCBteV9wb3J0LAorIGludCB2YWx1ZSwKKyBjcHUgKnByb2Nlc3NvciwKKyB1bnNpZ25lZF93b3JkIGNpYSk7CisKKy8qIFRoaXMgaW50ZXJydXB0IGV2ZW50IHdpbGwgdGhlbiBiZSBwcm9wb2dhdGVkIHRvIGFueSBhdHRhY2hlZAorICAgaW50ZXJydXB0IGRlc3RpbmF0aW9ucy4KKworICAgQW55IGludGVycHJldGF0aW9uIG9mIFBPUlQgYW5kIFZBTFVFIGlzIG1vZGVsIGRlcGVuZGFudC4gIEhvd2V2ZXIKKyAgIGFzIGd1aWRlbGluZXMgdGhlIGZvbGxvd2luZyBhcmUgcmVjb21tZW5kZWQ6IFBDSSBpbnRlcnJ1cHRzIGEtZAorICAgY29ycmVzcG9uZCB0byBsaW5lcyAwLTM7IGxldmVsIHNlbnNhdGl2ZSBpbnRlcnJ1cHRzIGJlIHJlcXVlc3RlZAorICAgd2l0aCBhIHZhbHVlIG9mIG9uZSBhbmQgd2l0aGRyYXduIHdpdGggYSB2YWx1ZSBvZiAwOyBlZGdlIHNlbnNhdGl2ZQorICAgaW50ZXJydXB0cyBhbHdheXMgaGF2ZSBhIHZhbHVlIG9mIDEsIHRoZSBldmVudCBpdHMgc2VsZiBpcyB0cmVhdGVkCisgICBhcyB0aGUgaW50ZXJydXB0LgorCisKKyAgIEludGVycnVwdCBEZXN0aW5hdGlvbnMKKworICAgQXR0YWNoZWQgdG8gZWFjaCBpbnRlcnJ1cHQgbGluZSBvZiBhIGRldmljZSBjYW4gYmUgemVybyBvciBtb3JlCisgICBkZXNpdGluYXRpb25zLiAgVGhlc2UgZGVzdGluYXRpb25zIGNvbnNpc3Qgb2YgYSBkZXZpY2UvcG9ydCBwYWlyLgorICAgQSBkZXN0aW5hdGlvbiBpcyBhdHRhY2hlZC9kZXRhY2hlZCB0byBhIGRldmljZSBsaW5lIHVzaW5nIHRoZQorICAgYXR0YWNoIGFuZCBkZXRhY2ggY2FsbHMuICovCisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkgZGV2aWNlX2ludGVycnVwdF9hdHRhY2gKKyhkZXZpY2UgKm1lLAorIGludCBteV9wb3J0LAorIGRldmljZSAqZGVzdCwKKyBpbnQgZGVzdF9wb3J0LAorIG9iamVjdF9kaXNwb3NpdGlvbiBkaXNwb3NpdGlvbik7CisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkgZGV2aWNlX2ludGVycnVwdF9kZXRhY2gKKyhkZXZpY2UgKm1lLAorIGludCBteV9wb3J0LAorIGRldmljZSAqZGVzdCwKKyBpbnQgZGVzdF9wb3J0KTsKKwordHlwZWRlZiB2b2lkIChkZXZpY2VfaW50ZXJydXB0X3RyYXZlcnNlX2Z1bmN0aW9uKQorICAgICAoZGV2aWNlICptZSwKKyAgICAgIGludCBteV9wb3J0LAorICAgICAgZGV2aWNlICpkZXN0LAorICAgICAgaW50IG15X2Rlc3QsCisgICAgICB2b2lkICpkYXRhKTsKKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKSBkZXZpY2VfaW50ZXJydXB0X3RyYXZlcnNlCisoZGV2aWNlICptZSwKKyBkZXZpY2VfaW50ZXJydXB0X3RyYXZlcnNlX2Z1bmN0aW9uICpoYW5kbGVyLAorIHZvaWQgKmRhdGEpOworIAorCisvKiBERVNUSU5BVElPTiBpcyBhdHRhY2hlZCAoZGV0YWNoZWQpIHRvIExJTkUgb2YgdGhlIGRldmljZSBNRQorCisKKyAgIEludGVycnVwdCBjb252ZXJzaW9uCisKKyAgIFVzZXJzIHJlZmVyIHRvIGludGVycnVwdCBwb3J0IG51bWJlcnMgc3ltYm9saWNhbGx5LiAgRm9yIGluc3RhbmNlIGEKKyAgIGRldmljZSBtYXkgcmVmZXIgdG8gaXRzIGBJTlQnIHNpZ25hbCB3aGljaCBpcyBpbnRlcm5hbGx5CisgICByZXByZXNlbnRlZCBieSBwb3J0IDMuCisKKyAgIFRvIGNvbnZlcnQgdG8vZnJvbSB0aGUgc3ltYm9saWMgYW5kIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEKKyAgIHBvcnQgbmFtZS9udW1iZXIuICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlLiAqLworCitJTkxJTkVfREVWSUNFXAorKGludCkgZGV2aWNlX2ludGVycnVwdF9kZWNvZGUKKyhkZXZpY2UgKm1lLAorIGNvbnN0IGNoYXIgKnN5bWJvbGljX25hbWUsCisgcG9ydF9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworSU5MSU5FX0RFVklDRVwKKyhpbnQpIGRldmljZV9pbnRlcnJ1cHRfZW5jb2RlCisoZGV2aWNlICptZSwKKyBpbnQgcG9ydF9udW1iZXIsCisgY2hhciAqYnVmLAorIGludCBzaXplb2ZfYnVmLAorIHBvcnRfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisgCisKKy8qIEhhcmR3YXJlIG9wZXJhdGlvbnM6CisKKyAgICovCisKK0lOTElORV9ERVZJQ0VcCisodW5zaWduZWQpIGRldmljZV9pb19yZWFkX2J1ZmZlcgorKGRldmljZSAqbWUsCisgdm9pZCAqZGVzdCwKKyBpbnQgc3BhY2UsCisgdW5zaWduZWRfd29yZCBhZGRyLAorIHVuc2lnbmVkIG5yX2J5dGVzLAorIGNwdSAqcHJvY2Vzc29yLAorIHVuc2lnbmVkX3dvcmQgY2lhKTsKKworSU5MSU5FX0RFVklDRVwKKyh1bnNpZ25lZCkgZGV2aWNlX2lvX3dyaXRlX2J1ZmZlcgorKGRldmljZSAqbWUsCisgY29uc3Qgdm9pZCAqc291cmNlLAorIGludCBzcGFjZSwKKyB1bnNpZ25lZF93b3JkIGFkZHIsCisgdW5zaWduZWQgbnJfYnl0ZXMsCisgY3B1ICpwcm9jZXNzb3IsCisgdW5zaWduZWRfd29yZCBjaWEpOworCisKKy8qIENvbnZlcnNseSwgdGhlIGRldmljZSBwY2kxMDAwLDFAMSBteSBuZWVkIHRvIHBlcmZvcm0gYSBkbWEgdHJhbnNmZXIKKyAgIGludG8gdGhlIGNwdS9tZW1vcnkgY29yZS4gIEp1c3QgYXMgSS9PIG1vdmVzIHRvd2FyZHMgdGhlIGxlYXZlcywKKyAgIGRtYSB0cmFuc2ZlcnMgbW92ZSB0b3dhcmRzIHRoZSBjb3JlIHZpYSB0aGUgaW5pdGlhdGluZyBkZXZpY2VzCisgICBwYXJlbnQgbm9kZXMuICBUaGUgcm9vdCBkZXZpY2UgKHNwZWNpYWwpIGNvbnZlcnRzIHRoZSBETUEgdHJhbnNmZXIKKyAgIGludG8gcmVhZHMvd3JpdGVzIHRvIG1lbW9yeSAqLworCitJTkxJTkVfREVWSUNFXAorKHVuc2lnbmVkKSBkZXZpY2VfZG1hX3JlYWRfYnVmZmVyCisoZGV2aWNlICptZSwKKyB2b2lkICpkZXN0LAorIGludCBzcGFjZSwKKyB1bnNpZ25lZF93b3JkIGFkZHIsCisgdW5zaWduZWQgbnJfYnl0ZXMpOworCitJTkxJTkVfREVWSUNFXAorKHVuc2lnbmVkKSBkZXZpY2VfZG1hX3dyaXRlX2J1ZmZlcgorKGRldmljZSAqbWUsCisgY29uc3Qgdm9pZCAqc291cmNlLAorIGludCBzcGFjZSwKKyB1bnNpZ25lZF93b3JkIGFkZHIsCisgdW5zaWduZWQgbnJfYnl0ZXMsCisgaW50IHZpb2xhdGVfcmVhZF9vbmx5X3NlY3Rpb24pOworCisvKiBUbyBhdm9pZCB0aGUgbmVlZCBmb3IgYW4gaW50ZXJtZWRpYXRlIChicmlkZ2luZykgbm9kZSB0byBhc2sgZWFjaAorICAgb2YgaXRzIGNoaWxkIGRldmljZXMgaW4gdHVybiBpZiBhbiBJTyBhY2Nlc3MgaXMgaW50ZW5kZWQgZm9yIHRoZW0sCisgICBwYXJlbnQgbm9kZXMgbWFpbnRhaW4gYSB0YWJsZSBtYXBwaW5nIGFkZHJlc3NlcyBkaXJlY3RseSB0bworICAgc3BlY2lmaWMgZGV2aWNlcy4gIFdoZW4gYSBkZXZpY2UgaXMgYGNvbm5lY3RlZCcgdG8gaXRzIGJ1cyBpdAorICAgYXR0YWNoZXMgaXRzIHNlbGYgdG8gaXRzIHBhcmVudC4gKi8KKworLyogQWRkcmVzcyBhY2Nlc3MgYXR0cmlidXRlcyAqLwordHlwZWRlZiBlbnVtIF9hY2Nlc3NfdHlwZSB7CisgIGFjY2Vzc19pbnZhbGlkID0gMCwKKyAgYWNjZXNzX3JlYWQgPSAxLAorICBhY2Nlc3Nfd3JpdGUgPSAyLAorICBhY2Nlc3NfcmVhZF93cml0ZSA9IDMsCisgIGFjY2Vzc19leGVjID0gNCwKKyAgYWNjZXNzX3JlYWRfZXhlYyA9IDUsCisgIGFjY2Vzc193cml0ZV9leGVjID0gNiwKKyAgYWNjZXNzX3JlYWRfd3JpdGVfZXhlYyA9IDcsCit9IGFjY2Vzc190eXBlOworCisvKiBBZGRyZXNzIGF0dGFjaGVtZW50IHR5cGVzICovCit0eXBlZGVmIGVudW0gX2F0dGFjaF90eXBlIHsKKyAgYXR0YWNoX2ludmFsaWQsCisgIGF0dGFjaF9yYXdfbWVtb3J5LAorICBhdHRhY2hfY2FsbGJhY2ssCisgIC8qIC4uLiAqLworfSBhdHRhY2hfdHlwZTsKKworSU5MSU5FX0RFVklDRVwKKyh2b2lkKSBkZXZpY2VfYXR0YWNoX2FkZHJlc3MKKyhkZXZpY2UgKm1lLAorIGF0dGFjaF90eXBlIGF0dGFjaCwKKyBpbnQgc3BhY2UsCisgdW5zaWduZWRfd29yZCBhZGRyLAorIHVuc2lnbmVkIG5yX2J5dGVzLAorIGFjY2Vzc190eXBlIGFjY2VzcywKKyBkZXZpY2UgKmNsaWVudCk7IC8qY2FsbGJhY2svZGVmYXVsdCovCisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkgZGV2aWNlX2RldGFjaF9hZGRyZXNzCisoZGV2aWNlICptZSwKKyBhdHRhY2hfdHlwZSBhdHRhY2gsCisgaW50IHNwYWNlLAorIHVuc2lnbmVkX3dvcmQgYWRkciwKKyB1bnNpZ25lZCBucl9ieXRlcywKKyBhY2Nlc3NfdHlwZSBhY2Nlc3MsCisgZGV2aWNlICpjbGllbnQpOyAvKmNhbGxiYWNrL2RlZmF1bHQqLworCisvKiBVdGlsaXRpZXM6CisKKyAgICovCisKKy8qIElPQ1RMOjoKKworICAgT2Z0ZW4gZGV2aWNlcyByZXF1aXJlIGBvdXQgb2YgYmFuZCcgb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQuCisgICBGb3IgaW5zdGFuY2UgYSBwYWwgZGV2aWNlIG1heSBuZWVkIHRvIG5vdGlmeSBhIFBDSSBicmlkZ2UgZGV2aWNlCisgICB0aGF0IGFuIGludGVycnVwdCBhY2sgY3ljbGUgbmVlZHMgdG8gYmUgcGVyZm9ybWVkIG9uIHRoZSBQQ0kgYnVzLgorICAgV2l0aGluIFBTSU0gc3VjaCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgYnkgdXNpbmcgdGhlIGdlbmVyaWMKKyAgIGlvY3RsIGNhbGwgPDxkZXZpY2VfaW9jdGwoKT4+LgorCisgICAqLworCit0eXBlZGVmIGVudW0geworICBkZXZpY2VfaW9jdGxfYnJlYWssIC8qIHVuc2lnbmVkX3dvcmQgcmVxdWVzdGVkX2JyZWFrICovCisgIGRldmljZV9pb2N0bF9zZXRfdHJhY2UsIC8qIHZvaWQgKi8KKyAgZGV2aWNlX2lvY3RsX2NyZWF0ZV9zdGFjaywgLyogdW5zaWduZWRfd29yZCAqc3AsIGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCAqLworICBkZXZpY2VfaW9jdGxfY2hhbmdlX21lZGlhLCAvKiBjb25zdCBjaGFyICpuZXdfaW1hZ2UgKHBvc3NpYmx5IE5VTEwpICovCisgIG5yX2RldmljZV9pb2N0bF9yZXF1ZXN0cywKK30gZGV2aWNlX2lvY3RsX3JlcXVlc3Q7CisKK0VYVEVSTl9ERVZJQ0VcCisoaW50KSBkZXZpY2VfaW9jdGwKKyhkZXZpY2UgKm1lLAorIGNwdSAqcHJvY2Vzc29yLAorIHVuc2lnbmVkX3dvcmQgY2lhLAorIGRldmljZV9pb2N0bF9yZXF1ZXN0IHJlcXVlc3QsCisgLi4uKTsKKworCisvKiBFcnJvciByZXBvcnRpbmc6OgorCisgICBTbyB0aGF0IGVycm9ycyBvcmlnaW5hdGluZyBmcm9tIGRldmljZXMgYXBwZWFyIGluIGEgY29uc2lzdGVudAorICAgZm9ybWF0LCB0aGUgPDxkZXZpY2VfZXJyb3IoKT4+IGZ1bmN0aW9uIGNhbiBiZSB1c2VkLiAgRm9ybWF0cyBhbmQKKyAgIG91dHB1dHMgdGhlIGVycm9yIG1lc3NhZ2UgYmVmb3JlIGFib3J0aW5nIHRoZSBzaW11bGF0aW9uCisKKyAgIERldmljZXMgc2hvdWxkIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGFib3J0IHRoZSBzaW11bGF0aW9uIGV4Y2VwdAorICAgd2hlbiB0aGUgYWJvcnQgcmVhc29uIGxlYXZlcyB0aGUgc2ltdWxhdGlvbiBpbiBhIGhhemFyZG91cworICAgY29uZGl0aW9uIChmb3IgaW5zdGFuY2UgYSBmYWlsZWQgbWFsbG9jKS4KKworICAgKi8KKworRVhURVJOX0RFVklDRVwKKyh2b2lkIHZvbGF0aWxlKSBkZXZpY2VfZXJyb3IKKyhkZXZpY2UgKm1lLAorIGNvbnN0IGNoYXIgKmZtdCwKKyAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKKworSU5MSU5FX0RFVklDRVwKKyhpbnQpIGRldmljZV90cmFjZQorKGRldmljZSAqbWUpOworCisKKworLyogRXh0ZXJuYWwgcmVwcmVzZW50YXRpb246CisKKyAgIEJvdGggZGV2aWNlIG5vZGVzIGFuZCBkZXZpY2UgaW5zdGFuY2VzLCBpbiBPcGVuQm9vdCBmaXJtd2FyZSBoYXZlCisgICBhbiBleHRlcm5hbCByZXByZXNlbnRhdGlvbiAocGhhbmRsZXMgYW5kIGloYW5kbGVzKSBhbmQgdGhlc2UgdmFsdWVzCisgICBhcmUgYm90aCBzdG9yZWQgaW4gdGhlIGRldmljZSB0cmVlIGluIHByb3BlcnR5IG5vZGVzIGFuZCBwYXNzZWQKKyAgIGJldHdlZW4gdGhlIGNsaWVudCBwcm9ncmFtIGFuZCB0aGUgc2ltdWxhdG9yIGR1cmluZyBlbXVsYXRpb24KKyAgIGNhbGxzLgorCisgICBUbyBsaW1pdCB0aGUgcG90ZW50aWFsIHJpc2sgYXNzb2NpYXRlZCB3aXRoIHRydXNpbmcgYGRhdGEnIGZyb20gdGhlCisgICBjbGllbnQgcHJvZ3JhbSwgdGhlIGZvbGxvd2luZyBtYXBwaW5nIG9wZXJhdG9ycyBgc2FmZWx5JyBjb252ZXJ0CisgICBiZXR3ZWVuIHRoZSB0d28gcmVwcmVzZW50YXRpb25zCisKKyAgICovCisKK0lOTElORV9ERVZJQ0VcCisoZGV2aWNlICopIGV4dGVybmFsX3RvX2RldmljZQorKGRldmljZSAqdHJlZV9tZW1iZXIsCisgdW5zaWduZWRfY2VsbCBwaGFuZGxlKTsKKworSU5MSU5FX0RFVklDRVwKKyh1bnNpZ25lZF9jZWxsKSBkZXZpY2VfdG9fZXh0ZXJuYWwKKyhkZXZpY2UgKm1lKTsKKworSU5MSU5FX0RFVklDRVwKKyhkZXZpY2VfaW5zdGFuY2UgKikgZXh0ZXJuYWxfdG9fZGV2aWNlX2luc3RhbmNlCisoZGV2aWNlICp0cmVlX21lbWJlciwKKyB1bnNpZ25lZF9jZWxsIGloYW5kbGUpOworCitJTkxJTkVfREVWSUNFXAorKHVuc2lnbmVkX2NlbGwpIGRldmljZV9pbnN0YW5jZV90b19leHRlcm5hbAorKGRldmljZV9pbnN0YW5jZSAqbWUpOworCisKKy8qIEV2ZW50IHF1ZXVlOgorCisgICBUaGUgZGV2aWNlIGluaGVyZXRzIGNlcnRhaW4gZXZlbnQgcXVldWUgb3BlcmF0aW9ucyBmcm9tIHRoZSBtYWluCisgICBzaW11bGF0aW9uLiAqLworCit0eXBlZGVmIHZvaWQgZGV2aWNlX2V2ZW50X2hhbmRsZXIodm9pZCAqZGF0YSk7CisKK0lOTElORV9ERVZJQ0VcCisoZXZlbnRfZW50cnlfdGFnKSBkZXZpY2VfZXZlbnRfcXVldWVfc2NoZWR1bGUKKyhkZXZpY2UgKm1lLAorIHNpZ25lZDY0IGRlbHRhX3RpbWUsCisgZGV2aWNlX2V2ZW50X2hhbmRsZXIgKmhhbmRsZXIsCisgdm9pZCAqZGF0YSk7CisKK0lOTElORV9FVkVOVFNcCisodm9pZCkgZGV2aWNlX2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUKKyhkZXZpY2UgKm1lLAorIGV2ZW50X2VudHJ5X3RhZyBldmVudF90b19yZW1vdmUpOworCitJTkxJTkVfRVZFTlRTXAorKHNpZ25lZDY0KSBkZXZpY2VfZXZlbnRfcXVldWVfdGltZQorKGRldmljZSAqbWUpOworCisjZW5kaWYgLyogX0RFVklDRV9IXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9kZXZpY2VfdGFibGUuYyBiL3NpbS9wcGMvZGV2aWNlX3RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3NzJhYgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZGV2aWNlX3RhYmxlLmMKQEAgLTAsMCArMSwzMTAgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgX0RFVklDRV9UQUJMRV9DXworI2RlZmluZSBfREVWSUNFX1RBQkxFX0NfCisKKyNpbmNsdWRlICJkZXZpY2VfdGFibGUuaCIKKworI2lmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworCisvKiBIZWxwZXIgZnVuY3Rpb25zICovCisKKworLyogR28gdGhyb3VnaCB0aGUgZGV2aWNlcyB2YXJpb3VzIHJlZyBwcm9wZXJ0aWVzIGZvciB0aG9zZSB0aGF0CisgICBzcGVjaWZ5IGF0dGFjaCBhZGRyZXNzZXMgKi8KKworCit2b2lkCitnZW5lcmljX2RldmljZV9pbml0X2FkZHJlc3MoZGV2aWNlICptZSkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgKihyZWdfcHJvcGVydHlfbmFtZXNbXSkgPSB7CisgICAgImF0dGFjaC1hZGRyZXNzZXMiLAorICAgICJhc3NpZ25lZC1hZGRyZXNzZXMiLAorICAgICJyZWciLAorICAgICJhbHRlcm5hdGUtcmVnIiAsCisgICAgTlVMTAorICB9OworICBjb25zdCBjaGFyICoqcmVnX3Byb3BlcnR5X25hbWU7CisgIGludCBucl92YWxpZF9yZWdfcHJvcGVydGllcyA9IDA7CisgIGZvciAocmVnX3Byb3BlcnR5X25hbWUgPSByZWdfcHJvcGVydHlfbmFtZXM7CisgICAgICAgKnJlZ19wcm9wZXJ0eV9uYW1lICE9IE5VTEw7CisgICAgICAgcmVnX3Byb3BlcnR5X25hbWUrKykgeworICAgIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgKnJlZ19wcm9wZXJ0eV9uYW1lKSAhPSBOVUxMKSB7CisgICAgICByZWdfcHJvcGVydHlfc3BlYyByZWc7CisgICAgICBpbnQgcmVnX2VudHJ5OworICAgICAgZm9yIChyZWdfZW50cnkgPSAwOworCSAgIGRldmljZV9maW5kX3JlZ19hcnJheV9wcm9wZXJ0eShtZSwgKnJlZ19wcm9wZXJ0eV9uYW1lLCByZWdfZW50cnksCisJCQkJCSAgJnJlZyk7CisJICAgcmVnX2VudHJ5KyspIHsKKwl1bnNpZ25lZF93b3JkIGF0dGFjaF9hZGRyZXNzOworCWludCBhdHRhY2hfc3BhY2U7CisJdW5zaWduZWQgYXR0YWNoX3NpemU7CisJaWYgKCFkZXZpY2VfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyhkZXZpY2VfcGFyZW50KG1lKSwKKwkJCQkJICAgICAgJnJlZy5hZGRyZXNzLAorCQkJCQkgICAgICAmYXR0YWNoX3NwYWNlLCAmYXR0YWNoX2FkZHJlc3MsCisJCQkJCSAgICAgIG1lKSkKKwkgIGNvbnRpbnVlOworCWlmICghZGV2aWNlX3NpemVfdG9fYXR0YWNoX3NpemUoZGV2aWNlX3BhcmVudChtZSksCisJCQkJCSZyZWcuc2l6ZSwKKwkJCQkJJmF0dGFjaF9zaXplLCBtZSkpCisJICBjb250aW51ZTsKKwlkZXZpY2VfYXR0YWNoX2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksCisJCQkgICAgICBhdHRhY2hfY2FsbGJhY2ssCisJCQkgICAgICBhdHRhY2hfc3BhY2UsIGF0dGFjaF9hZGRyZXNzLCBhdHRhY2hfc2l6ZSwKKwkJCSAgICAgIGFjY2Vzc19yZWFkX3dyaXRlX2V4ZWMsCisJCQkgICAgICBtZSk7CisJbnJfdmFsaWRfcmVnX3Byb3BlcnRpZXMrKzsKKyAgICAgIH0KKyAgICAgIC8qIGlmIGZpcnN0IG9wdGlvbiBtYXRjaGVzIGRvbid0IHRyeSBmb3IgYW55IG90aGVycyAqLworICAgICAgaWYgKHJlZ19wcm9wZXJ0eV9uYW1lID09IHJlZ19wcm9wZXJ0eV9uYW1lcykKKwlicmVhazsKKyAgICB9CisgIH0KK30KKworaW50CitnZW5lcmljX2RldmljZV91bml0X2RlY29kZShkZXZpY2UgKmJ1cywKKwkJCSAgIGNvbnN0IGNoYXIgKnVuaXQsCisJCQkgICBkZXZpY2VfdW5pdCAqcGh5cykKK3sKKyAgbWVtc2V0KHBoeXMsIDAsIHNpemVvZihkZXZpY2VfdW5pdCkpOworICBpZiAodW5pdCA9PSBOVUxMKQorICAgIHJldHVybiAwOworICBlbHNlIHsKKyAgICBpbnQgbnJfY2VsbHMgPSAwOworICAgIGNvbnN0IGludCBtYXhfbnJfY2VsbHMgPSBkZXZpY2VfbnJfYWRkcmVzc19jZWxscyhidXMpOworICAgIHdoaWxlICgxKSB7CisgICAgICBjaGFyICplbmQgPSBOVUxMOworICAgICAgdW5zaWduZWQgbG9uZyB2YWw7CisgICAgICB2YWwgPSBzdHJ0b3VsKHVuaXQsICZlbmQsIDApOworICAgICAgLyogcGFyc2UgZXJyb3I/ICovCisgICAgICBpZiAodW5pdCA9PSBlbmQpCisJcmV0dXJuIC0xOworICAgICAgLyogdHdvIG1hbnkgY2VsbHM/ICovCisgICAgICBpZiAobnJfY2VsbHMgPj0gbWF4X25yX2NlbGxzKQorCXJldHVybiAtMTsKKyAgICAgIC8qIHNhdmUgaXQgKi8KKyAgICAgIHBoeXMtPmNlbGxzW25yX2NlbGxzXSA9IHZhbDsKKyAgICAgIG5yX2NlbGxzKys7CisgICAgICB1bml0ID0gZW5kOworICAgICAgLyogbW9yZSB0byBmb2xsb3c/ICovCisgICAgICBpZiAoaXNzcGFjZSgqdW5pdCkgfHwgKnVuaXQgPT0gJ1wwJykKKwlicmVhazsKKyAgICAgIGlmICgqdW5pdCAhPSAnLCcpCisJcmV0dXJuIC0xOworICAgICAgdW5pdCsrOworICAgIH0KKyAgICBpZiAobnJfY2VsbHMgPCBtYXhfbnJfY2VsbHMpIHsKKyAgICAgIC8qIHNoaWZ0IGV2ZXJ5dGhpbmcgdG8gY29ycmVjdCBwb3NpdGlvbiAqLworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAxOyBpIDw9IG5yX2NlbGxzOyBpKyspCisJcGh5cy0+Y2VsbHNbbWF4X25yX2NlbGxzIC0gaV0gPSBwaHlzLT5jZWxsc1tucl9jZWxscyAtIGldOworICAgICAgZm9yIChpID0gMDsgaSA8IChtYXhfbnJfY2VsbHMgLSBucl9jZWxscyk7IGkrKykKKwlwaHlzLT5jZWxsc1tpXSA9IDA7CisgICAgfQorICAgIHBoeXMtPm5yX2NlbGxzID0gbWF4X25yX2NlbGxzOworICAgIHJldHVybiBtYXhfbnJfY2VsbHM7CisgIH0KK30KKworaW50CitnZW5lcmljX2RldmljZV91bml0X2VuY29kZShkZXZpY2UgKmJ1cywKKwkJCSAgIGNvbnN0IGRldmljZV91bml0ICpwaHlzLAorCQkJICAgY2hhciAqYnVmLAorCQkJICAgaW50IHNpemVvZl9idWYpCit7CisgIGludCBpOworICBpbnQgbGVuOworICBjaGFyICpwb3MgPSBidWY7CisgIC8qIHNraXAgbGVhZGluZyB6ZXJvJ3MgKi8KKyAgZm9yIChpID0gMDsgaSA8IHBoeXMtPm5yX2NlbGxzOyBpKyspIHsKKyAgICBpZiAocGh5cy0+Y2VsbHNbaV0gIT0gMCkKKyAgICAgIGJyZWFrOworICB9CisgIC8qIGRvbid0IG91dHB1dCBhbnl0aGluZyBpZiBlbXB0eSAqLworICBpZiAocGh5cy0+bnJfY2VsbHMgPT0gMCkgeworICAgIHN0cmNweShwb3MsICIiKTsKKyAgICBsZW4gPSAwOworICB9CisgIGVsc2UgaWYgKGkgPT0gcGh5cy0+bnJfY2VsbHMpIHsKKyAgICAvKiBhbGwgemVybyAqLworICAgIHN0cmNweShwb3MsICIwIik7CisgICAgbGVuID0gMTsKKyAgfQorICBlbHNlIHsKKyAgICBmb3IgKDsgaSA8IHBoeXMtPm5yX2NlbGxzOyBpKyspIHsKKyAgICAgIGlmIChwb3MgIT0gYnVmKSB7CisJc3RyY2F0KHBvcywgIiwiKTsKKwlwb3MgPSBzdHJjaHIocG9zLCAnXDAnKTsKKyAgICAgIH0KKyAgICAgIGlmIChwaHlzLT5jZWxsc1tpXSA8IDEwKQorCXNwcmludGYocG9zLCAiJWxkIiwgKHVuc2lnbmVkIGxvbmcpcGh5cy0+Y2VsbHNbaV0pOworICAgICAgZWxzZQorCXNwcmludGYocG9zLCAiMHglbHgiLCAodW5zaWduZWQgbG9uZylwaHlzLT5jZWxsc1tpXSk7CisgICAgICBwb3MgPSBzdHJjaHIocG9zLCAnXDAnKTsKKyAgICB9CisgICAgbGVuID0gcG9zIC0gYnVmOworICB9CisgIGlmIChsZW4gPj0gc2l6ZW9mX2J1ZikKKyAgICBlcnJvcigiZ2VuZXJpY191bml0X2VuY29kZSAtIGJ1ZmZlciBvdmVyZmxvd1xuIik7CisgIHJldHVybiBsZW47Cit9CisKK2ludAorZ2VuZXJpY19kZXZpY2VfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyhkZXZpY2UgKm1lLAorCQkJCQkgY29uc3QgZGV2aWNlX3VuaXQgKmFkZHJlc3MsCisJCQkJCSBpbnQgKmF0dGFjaF9zcGFjZSwKKwkJCQkJIHVuc2lnbmVkX3dvcmQgKmF0dGFjaF9hZGRyZXNzLAorCQkJCQkgZGV2aWNlICpjbGllbnQpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgYWRkcmVzcy0+bnJfY2VsbHMgLSAyOyBpKyspIHsKKyAgICBpZiAoYWRkcmVzcy0+Y2VsbHNbaV0gIT0gMCkKKyAgICAgIGRldmljZV9lcnJvcihtZSwgIk9ubHkgMzJiaXQgYWRkcmVzc2VzIHN1cHBvcnRlZCIpOworICB9CisgIGlmIChhZGRyZXNzLT5ucl9jZWxscyA+PSAyKQorICAgICphdHRhY2hfc3BhY2UgPSBhZGRyZXNzLT5jZWxsc1thZGRyZXNzLT5ucl9jZWxscyAtIDJdOworICBlbHNlCisgICAgKmF0dGFjaF9zcGFjZSA9IDA7CisgICphdHRhY2hfYWRkcmVzcyA9IGFkZHJlc3MtPmNlbGxzW2FkZHJlc3MtPm5yX2NlbGxzIC0gMV07CisgIHJldHVybiAxOworfQorCitpbnQKK2dlbmVyaWNfZGV2aWNlX3NpemVfdG9fYXR0YWNoX3NpemUoZGV2aWNlICptZSwKKwkJCQkgICBjb25zdCBkZXZpY2VfdW5pdCAqc2l6ZSwKKwkJCQkgICB1bnNpZ25lZCAqbnJfYnl0ZXMsCisJCQkJICAgZGV2aWNlICpjbGllbnQpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZS0+bnJfY2VsbHMgLSAxOyBpKyspIHsKKyAgICBpZiAoc2l6ZS0+Y2VsbHNbaV0gIT0gMCkKKyAgICAgIGRldmljZV9lcnJvcihtZSwgIk9ubHkgMzJiaXQgc2l6ZXMgc3VwcG9ydGVkIik7CisgIH0KKyAgKm5yX2J5dGVzID0gc2l6ZS0+Y2VsbHNbMF07CisgIHJldHVybiAqbnJfYnl0ZXM7Cit9CisKKworLyogaWdub3JlL3Bhc3N0aHJvdWdoIHZlcnNpb25zIG9mIGVhY2ggZnVuY3Rpb24gKi8KKwordm9pZAorcGFzc3Rocm91Z2hfZGV2aWNlX2FkZHJlc3NfYXR0YWNoKGRldmljZSAqbWUsCisJCQkJICBhdHRhY2hfdHlwZSBhdHRhY2gsCisJCQkJICBpbnQgc3BhY2UsCisJCQkJICB1bnNpZ25lZF93b3JkIGFkZHIsCisJCQkJICB1bnNpZ25lZCBucl9ieXRlcywKKwkJCQkgIGFjY2Vzc190eXBlIGFjY2VzcywKKwkJCQkgIGRldmljZSAqY2xpZW50KSAvKmNhbGxiYWNrL2RlZmF1bHQqLworeworICBkZXZpY2VfYXR0YWNoX2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksIGF0dGFjaCwKKwkJCXNwYWNlLCBhZGRyLCBucl9ieXRlcywKKwkJCWFjY2VzcywKKwkJCWNsaWVudCk7Cit9CisKK3ZvaWQKK3Bhc3N0aHJvdWdoX2RldmljZV9hZGRyZXNzX2RldGFjaChkZXZpY2UgKm1lLAorCQkJCSAgYXR0YWNoX3R5cGUgYXR0YWNoLAorCQkJCSAgaW50IHNwYWNlLAorCQkJCSAgdW5zaWduZWRfd29yZCBhZGRyLAorCQkJCSAgdW5zaWduZWQgbnJfYnl0ZXMsCisJCQkJICBhY2Nlc3NfdHlwZSBhY2Nlc3MsCisJCQkJICBkZXZpY2UgKmNsaWVudCkgLypjYWxsYmFjay9kZWZhdWx0Ki8KK3sKKyAgZGV2aWNlX2RldGFjaF9hZGRyZXNzKGRldmljZV9wYXJlbnQobWUpLCBhdHRhY2gsCisJCQlzcGFjZSwgYWRkciwgbnJfYnl0ZXMsIGFjY2VzcywKKwkJCWNsaWVudCk7Cit9CisKK3Vuc2lnbmVkCitwYXNzdGhyb3VnaF9kZXZpY2VfZG1hX3JlYWRfYnVmZmVyKGRldmljZSAqbWUsCisJCQkJICAgdm9pZCAqZGVzdCwKKwkJCQkgICBpbnQgc3BhY2UsCisJCQkJICAgdW5zaWduZWRfd29yZCBhZGRyLAorCQkJCSAgIHVuc2lnbmVkIG5yX2J5dGVzKQoreworICByZXR1cm4gZGV2aWNlX2RtYV9yZWFkX2J1ZmZlcihkZXZpY2VfcGFyZW50KG1lKSwgZGVzdCwKKwkJCQlzcGFjZSwgYWRkciwgbnJfYnl0ZXMpOworfQorCit1bnNpZ25lZAorcGFzc3Rocm91Z2hfZGV2aWNlX2RtYV93cml0ZV9idWZmZXIoZGV2aWNlICptZSwKKwkJCSAgICAgY29uc3Qgdm9pZCAqc291cmNlLAorCQkJICAgICBpbnQgc3BhY2UsCisJCQkgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKKwkJCSAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCisJCQkgICAgIGludCB2aW9sYXRlX3JlYWRfb25seV9zZWN0aW9uKQoreworICByZXR1cm4gZGV2aWNlX2RtYV93cml0ZV9idWZmZXIoZGV2aWNlX3BhcmVudChtZSksIHNvdXJjZSwKKwkJCQkgc3BhY2UsIGFkZHIsCisJCQkJIG5yX2J5dGVzLAorCQkJCSB2aW9sYXRlX3JlYWRfb25seV9zZWN0aW9uKTsKK30KKworaW50CitpZ25vcmVfZGV2aWNlX3VuaXRfZGVjb2RlKGRldmljZSAqbWUsCisJCQkgIGNvbnN0IGNoYXIgKnVuaXQsCisJCQkgIGRldmljZV91bml0ICpwaHlzKQoreworICBtZW1zZXQocGh5cywgMCwgc2l6ZW9mKGRldmljZV91bml0KSk7CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBjb25zdCBkZXZpY2VfY2FsbGJhY2tzIHBhc3N0aHJvdWdoX2NhbGxiYWNrcyA9IHsKKyAgeyBOVUxMLCB9LCAvKiBpbml0ICovCisgIHsgcGFzc3Rocm91Z2hfZGV2aWNlX2FkZHJlc3NfYXR0YWNoLAorICAgIHBhc3N0aHJvdWdoX2RldmljZV9hZGRyZXNzX2RldGFjaCwgfSwKKyAgeyBOVUxMLCB9LCAvKiBJTyAqLworICB7IHBhc3N0aHJvdWdoX2RldmljZV9kbWFfcmVhZF9idWZmZXIsIHBhc3N0aHJvdWdoX2RldmljZV9kbWFfd3JpdGVfYnVmZmVyLCB9LAorICB7IE5VTEwsIH0sIC8qIGludGVycnVwdCAqLworICB7IGdlbmVyaWNfZGV2aWNlX3VuaXRfZGVjb2RlLAorICAgIGdlbmVyaWNfZGV2aWNlX3VuaXRfZW5jb2RlLCB9LAorfTsKKworCitzdGF0aWMgY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3Igb2JfZGV2aWNlX3RhYmxlW10gPSB7CisgIC8qIHN0YW5kYXJkIE9wZW5Cb290IGRldmljZXMgKi8KKyAgeyAiYWxpYXNlcyIsIE5VTEwsICZwYXNzdGhyb3VnaF9jYWxsYmFja3MgfSwKKyAgeyAib3B0aW9ucyIsIE5VTEwsICZwYXNzdGhyb3VnaF9jYWxsYmFja3MgfSwKKyAgeyAiY2hvc2VuIiwgTlVMTCwgJnBhc3N0aHJvdWdoX2NhbGxiYWNrcyB9LAorICB7ICJwYWNrYWdlcyIsIE5VTEwsICZwYXNzdGhyb3VnaF9jYWxsYmFja3MgfSwKKyAgeyAiY3B1cyIsIE5VTEwsICZwYXNzdGhyb3VnaF9jYWxsYmFja3MgfSwKKyAgeyAib3BlbnByb20iLCBOVUxMLCAmcGFzc3Rocm91Z2hfY2FsbGJhY2tzIH0sCisgIHsgImluaXQiLCBOVUxMLCAmcGFzc3Rocm91Z2hfY2FsbGJhY2tzIH0sCisgIHsgTlVMTCB9LAorfTsKKworY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgKmNvbnN0IGRldmljZV90YWJsZVtdID0geworICBvYl9kZXZpY2VfdGFibGUsCisjaW5jbHVkZSAiaHcuYyIKKyAgTlVMTCwKK307CisKKworI2VuZGlmIC8qIF9ERVZJQ0VfVEFCTEVfQ18gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvZGV2aWNlX3RhYmxlLmggYi9zaW0vcHBjL2RldmljZV90YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNmMyOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2RldmljZV90YWJsZS5oCkBAIC0wLDAgKzEsMzIzIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIF9ERVZJQ0VfVEFCTEVfSF8KKyNkZWZpbmUgX0RFVklDRV9UQUJMRV9IXworCisjaW5jbHVkZSAiYmFzaWNzLmgiCisjaW5jbHVkZSAiZGV2aWNlLmgiCisjaW5jbHVkZSAidHJlZS5oIgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgX2RldmljZV9jYWxsYmFja3MgZGV2aWNlX2NhbGxiYWNrczsKKworCisvKiBUaGUgY3JlYXRvciwgcmV0dXJucyBhIHBvaW50ZXIgdG8gYW55IGRhdGEgdGhhdCBzaG91bGQgYmUgYWxsb2NhdGVkCisgICBvbmNlIGR1cmluZyAobXVsdGlwbGUpIHNpbXVsYXRpb24gcnVucyAqLworCit0eXBlZGVmIHZvaWQgKihkZXZpY2VfY3JlYXRvcikKKyAgICAgKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICBjb25zdCBkZXZpY2VfdW5pdCAqdW5pdF9hZGRyZXNzLAorICAgICAgY29uc3QgY2hhciAqYXJncyk7CisKKworLyogdHdvIHN0YWdlcyBvZiBpbml0aWFsaXphdGlvbiAqLworCit0eXBlZGVmIHZvaWQgKGRldmljZV9pbml0X2NhbGxiYWNrKQorICAgICAoZGV2aWNlICptZSk7CisgICAgIAordHlwZWRlZiBzdHJ1Y3QgX2RldmljZV9pbml0X2NhbGxiYWNrcyB7CisgIGRldmljZV9pbml0X2NhbGxiYWNrICphZGRyZXNzOyAvKiBOVUxMIC0gaWdub3JlICovCisgIGRldmljZV9pbml0X2NhbGxiYWNrICpkYXRhOyAvKiBOVUxMIC0gaWdub3JlICovCit9IGRldmljZV9pbml0X2NhbGxiYWNrczsKKworCisvKiBhdHRhY2hpbmcvZGV0YWNoaW5nIGEgZGV2aWNlcyBhZGRyZXNzIHNwYWNlIHRvIGl0cyBwYXJlbnQgKi8KKwordHlwZWRlZiB2b2lkIChkZXZpY2VfYWRkcmVzc19jYWxsYmFjaykKKyAgICAgKGRldmljZSAqbWUsCisgICAgICBhdHRhY2hfdHlwZSBhdHRhY2gsCisgICAgICBpbnQgc3BhY2UsCisgICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCisgICAgICB1bnNpZ25lZCBucl9ieXRlcywKKyAgICAgIGFjY2Vzc190eXBlIGFjY2VzcywKKyAgICAgIGRldmljZSAqY2xpZW50KTsgLypjYWxsYmFjay9kZWZhdWx0Ki8KKwordHlwZWRlZiBzdHJ1Y3QgX2RldmljZV9hZGRyZXNzX2NhbGxiYWNrcyB7CisgIGRldmljZV9hZGRyZXNzX2NhbGxiYWNrICphdHRhY2g7CisgIGRldmljZV9hZGRyZXNzX2NhbGxiYWNrICpkZXRhY2g7Cit9IGRldmljZV9hZGRyZXNzX2NhbGxiYWNrczsKKworCisvKiBJL08gb3BlcmF0aW9ucyAtIGZyb20gcGFyZW50ICovCisKK3R5cGVkZWYgdW5zaWduZWQgKGRldmljZV9pb19yZWFkX2J1ZmZlcl9jYWxsYmFjaykKKyAgICAgKGRldmljZSAqbWUsCisgICAgICB2b2lkICpkZXN0LAorICAgICAgaW50IHNwYWNlLAorICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAorICAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCisgICAgICBjcHUgKnByb2Nlc3NvciwKKyAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKTsKKwordHlwZWRlZiB1bnNpZ25lZCAoZGV2aWNlX2lvX3dyaXRlX2J1ZmZlcl9jYWxsYmFjaykKKyAgICAgKGRldmljZSAqbWUsCisgICAgICBjb25zdCB2b2lkICpzb3VyY2UsCisgICAgICBpbnQgc3BhY2UsCisgICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCisgICAgICB1bnNpZ25lZCBucl9ieXRlcywKKyAgICAgIGNwdSAqcHJvY2Vzc29yLAorICAgICAgdW5zaWduZWRfd29yZCBjaWEpOworCit0eXBlZGVmIHN0cnVjdCBfZGV2aWNlX2lvX2NhbGxiYWNrcyB7IC8qIE5VTEwgLSBlcnJvciAqLworICBkZXZpY2VfaW9fcmVhZF9idWZmZXJfY2FsbGJhY2sgKnJlYWRfYnVmZmVyOworICBkZXZpY2VfaW9fd3JpdGVfYnVmZmVyX2NhbGxiYWNrICp3cml0ZV9idWZmZXI7Cit9IGRldmljZV9pb19jYWxsYmFja3M7CisKKworLyogRE1BIHRyYW5zZmVycyBieSBhIGRldmljZSB2aWEgaXRzIHBhcmVudCAqLworCit0eXBlZGVmIHVuc2lnbmVkIChkZXZpY2VfZG1hX3JlYWRfYnVmZmVyX2NhbGxiYWNrKQorICAgICAoZGV2aWNlICptZSwKKyAgICAgIHZvaWQgKmRlc3QsCisgICAgICBpbnQgc3BhY2UsCisgICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCisgICAgICB1bnNpZ25lZCBucl9ieXRlcyk7CisKK3R5cGVkZWYgdW5zaWduZWQgKGRldmljZV9kbWFfd3JpdGVfYnVmZmVyX2NhbGxiYWNrKQorICAgICAoZGV2aWNlICptZSwKKyAgICAgIGNvbnN0IHZvaWQgKnNvdXJjZSwKKyAgICAgIGludCBzcGFjZSwKKyAgICAgIHVuc2lnbmVkX3dvcmQgYWRkciwKKyAgICAgIHVuc2lnbmVkIG5yX2J5dGVzLAorICAgICAgaW50IHZpb2xhdGVfcmVhZF9vbmx5X3NlY3Rpb24pOworCit0eXBlZGVmIHN0cnVjdCBfZGV2aWNlX2RtYV9jYWxsYmFja3MgeyAvKiBOVUxMIC0gZXJyb3IgKi8KKyAgZGV2aWNlX2RtYV9yZWFkX2J1ZmZlcl9jYWxsYmFjayAqcmVhZF9idWZmZXI7CisgIGRldmljZV9kbWFfd3JpdGVfYnVmZmVyX2NhbGxiYWNrICp3cml0ZV9idWZmZXI7Cit9IGRldmljZV9kbWFfY2FsbGJhY2tzOworCisKKy8qIEludGVycnVwdHMgKi8KKwordHlwZWRlZiB2b2lkIChkZXZpY2VfaW50ZXJydXB0X2V2ZW50X2NhbGxiYWNrKQorICAgICAoZGV2aWNlICptZSwKKyAgICAgIGludCBteV9wb3J0LAorICAgICAgZGV2aWNlICpzb3VyY2UsCisgICAgICBpbnQgc291cmNlX3BvcnQsCisgICAgICBpbnQgbGV2ZWwsCisgICAgICBjcHUgKnByb2Nlc3NvciwKKyAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKTsKKwordHlwZWRlZiB2b2lkIChkZXZpY2VfY2hpbGRfaW50ZXJydXB0X2V2ZW50X2NhbGxiYWNrKQorICAgICAoZGV2aWNlICptZSwKKyAgICAgIGRldmljZSAqcGFyZW50LAorICAgICAgZGV2aWNlICpzb3VyY2UsCisgICAgICBpbnQgc291cmNlX3BvcnQsCisgICAgICBpbnQgbGV2ZWwsCisgICAgICBjcHUgKnByb2Nlc3NvciwKKyAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKTsKKyAgICAgIAordHlwZWRlZiBzdHJ1Y3QgX2RldmljZV9pbnRlcnJ1cHRfcG9ydF9kZXNjcmlwdG9yIHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgaW50IG51bWJlcjsgCisgIGludCBucl9wb3J0czsKKyAgcG9ydF9kaXJlY3Rpb24gZGlyZWN0aW9uOworfSBkZXZpY2VfaW50ZXJydXB0X3BvcnRfZGVzY3JpcHRvcjsKKwordHlwZWRlZiBzdHJ1Y3QgX2RldmljZV9pbnRlcnJ1cHRfY2FsbGJhY2tzIHsKKyAgZGV2aWNlX2ludGVycnVwdF9ldmVudF9jYWxsYmFjayAqZXZlbnQ7CisgIGRldmljZV9jaGlsZF9pbnRlcnJ1cHRfZXZlbnRfY2FsbGJhY2sgKmNoaWxkX2V2ZW50OworICBjb25zdCBkZXZpY2VfaW50ZXJydXB0X3BvcnRfZGVzY3JpcHRvciAqcG9ydHM7Cit9IGRldmljZV9pbnRlcnJ1cHRfY2FsbGJhY2tzOworCisKKy8qIHN5bWJvbGljIHZhbHVlIGRlY29kaW5nICovCisKK3R5cGVkZWYgaW50IChkZXZpY2VfdW5pdF9kZWNvZGVfY2FsbGJhY2spCisgICAgIChkZXZpY2UgKmJ1cywKKyAgICAgIGNvbnN0IGNoYXIgKnVuaXQsCisgICAgICBkZXZpY2VfdW5pdCAqYWRkcmVzcyk7CisKK3R5cGVkZWYgaW50IChkZXZpY2VfdW5pdF9lbmNvZGVfY2FsbGJhY2spCisgICAgIChkZXZpY2UgKmJ1cywKKyAgICAgIGNvbnN0IGRldmljZV91bml0ICp1bml0X2FkZHJlc3MsCisgICAgICBjaGFyICpidWYsCisgICAgICBpbnQgc2l6ZW9mX2J1Zik7CisKK3R5cGVkZWYgaW50IChkZXZpY2VfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzc19jYWxsYmFjaykKKyAgICAgKGRldmljZSAqYnVzLAorICAgICAgY29uc3QgZGV2aWNlX3VuaXQgKmFkZHJlc3MsCisgICAgICBpbnQgKmF0dGFjaF9zcGFjZSwKKyAgICAgIHVuc2lnbmVkX3dvcmQgKmF0dGFjaF9hZGRyZXNzLAorICAgICAgZGV2aWNlICpjbGllbnQpOworCit0eXBlZGVmIGludCAoZGV2aWNlX3NpemVfdG9fYXR0YWNoX3NpemVfY2FsbGJhY2spCisgICAgIChkZXZpY2UgKmJ1cywKKyAgICAgIGNvbnN0IGRldmljZV91bml0ICpzaXplLAorICAgICAgdW5zaWduZWQgKm5yX2J5dGVzLAorICAgICAgZGV2aWNlICpjbGllbnQpOworCit0eXBlZGVmIHN0cnVjdCBfZGV2aWNlX2NvbnZlcnRfY2FsbGJhY2tzIHsKKyAgZGV2aWNlX3VuaXRfZGVjb2RlX2NhbGxiYWNrICpkZWNvZGVfdW5pdDsKKyAgZGV2aWNlX3VuaXRfZW5jb2RlX2NhbGxiYWNrICplbmNvZGVfdW5pdDsKKyAgZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3NfY2FsbGJhY2sgKmFkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3M7CisgIGRldmljZV9zaXplX3RvX2F0dGFjaF9zaXplX2NhbGxiYWNrICpzaXplX3RvX2F0dGFjaF9zaXplOworfSBkZXZpY2VfY29udmVydF9jYWxsYmFja3M7CisKKworLyogaW5zdGFuY2VzICovCisKK3R5cGVkZWYgdm9pZCAoZGV2aWNlX2luc3RhbmNlX2RlbGV0ZV9jYWxsYmFjaykKKyAgICAgKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UpOworCit0eXBlZGVmIGludCAoZGV2aWNlX2luc3RhbmNlX3JlYWRfY2FsbGJhY2spCisgICAgIChkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAorICAgICAgdm9pZCAqYnVmLAorICAgICAgdW5zaWduZWRfd29yZCBsZW4pOworCit0eXBlZGVmIGludCAoZGV2aWNlX2luc3RhbmNlX3dyaXRlX2NhbGxiYWNrKQorICAgICAoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKKyAgICAgIGNvbnN0IHZvaWQgKmJ1ZiwKKyAgICAgIHVuc2lnbmVkX3dvcmQgbGVuKTsKKwordHlwZWRlZiBpbnQgKGRldmljZV9pbnN0YW5jZV9zZWVrX2NhbGxiYWNrKQorICAgICAoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKKyAgICAgIHVuc2lnbmVkX3dvcmQgcG9zX2hpLAorICAgICAgdW5zaWduZWRfd29yZCBwb3NfbG8pOworCit0eXBlZGVmIGludCAoZGV2aWNlX2luc3RhbmNlX21ldGhvZCkKKyAgICAgKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCisgICAgICBpbnQgbl9zdGFja19hcmdzLAorICAgICAgdW5zaWduZWRfY2VsbCBzdGFja19hcmdzWy8qbl9zdGFja19hcmdzKi9dLAorICAgICAgaW50IG5fc3RhY2tfcmV0dXJucywKKyAgICAgIHVuc2lnbmVkX2NlbGwgc3RhY2tfcmV0dXJuc1svKm5fc3RhY2tfcmV0dXJucyovXSk7CisKK3R5cGVkZWYgc3RydWN0IF9kZXZpY2VfaW5zdGFuY2VfbWV0aG9kcyB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIGRldmljZV9pbnN0YW5jZV9tZXRob2QgKm1ldGhvZDsKK30gZGV2aWNlX2luc3RhbmNlX21ldGhvZHM7CisKK3N0cnVjdCBfZGV2aWNlX2luc3RhbmNlX2NhbGxiYWNrcyB7IC8qIE5VTEwgLSBlcnJvciAqLworICBkZXZpY2VfaW5zdGFuY2VfZGVsZXRlX2NhbGxiYWNrICpkZWxldGU7CisgIGRldmljZV9pbnN0YW5jZV9yZWFkX2NhbGxiYWNrICpyZWFkOworICBkZXZpY2VfaW5zdGFuY2Vfd3JpdGVfY2FsbGJhY2sgKndyaXRlOworICBkZXZpY2VfaW5zdGFuY2Vfc2Vla19jYWxsYmFjayAqc2VlazsKKyAgY29uc3QgZGV2aWNlX2luc3RhbmNlX21ldGhvZHMgKm1ldGhvZHM7Cit9OworCit0eXBlZGVmIGRldmljZV9pbnN0YW5jZSAqKGRldmljZV9jcmVhdGVfaW5zdGFuY2VfY2FsbGJhY2spCisgICAgIChkZXZpY2UgKm1lLAorICAgICAgY29uc3QgY2hhciAqZnVsbF9wYXRoLAorICAgICAgY29uc3QgY2hhciAqYXJncyk7CisKK3R5cGVkZWYgZGV2aWNlX2luc3RhbmNlICoocGFja2FnZV9jcmVhdGVfaW5zdGFuY2VfY2FsbGJhY2spCisgICAgIChkZXZpY2VfaW5zdGFuY2UgKnBhcmVudCwKKyAgICAgIGNvbnN0IGNoYXIgKmFyZ3MpOworCisKKy8qIGFsbCBlbHNlIGZhaWxzICovCisKK3R5cGVkZWYgaW50IChkZXZpY2VfaW9jdGxfY2FsbGJhY2spCisgICAgIChkZXZpY2UgKm1lLAorICAgICAgY3B1ICpwcm9jZXNzb3IsCisgICAgICB1bnNpZ25lZF93b3JkIGNpYSwKKyAgICAgIGRldmljZV9pb2N0bF9yZXF1ZXN0IHJlcXVlc3QsCisgICAgICB2YV9saXN0IGFwKTsKKwordHlwZWRlZiB2b2lkIChkZXZpY2VfdXNhZ2VfY2FsbGJhY2spCisgICAgIChpbnQgdmVyYm9zZSk7CisKKworLyogdGhlIGNhbGxiYWNrcyAqLworCitzdHJ1Y3QgX2RldmljZV9jYWxsYmFja3MgeworCisgIC8qIGluaXRpYWxpemF0aW9uICovCisgIGRldmljZV9pbml0X2NhbGxiYWNrcyBpbml0OworCisgIC8qIGFkZHJlc3MvZGF0YSBjb25maWcgLSBmcm9tIGNoaWxkICovCisgIGRldmljZV9hZGRyZXNzX2NhbGxiYWNrcyBhZGRyZXNzOworCisgIC8qIGFkZHJlc3MvZGF0YSB0cmFuc2ZlciAtIGZyb20gcGFyZW50ICovCisgIGRldmljZV9pb19jYWxsYmFja3MgaW87CisKKyAgLyogYWRkcmVzcy9kYXRhIHRyYW5zZmVyIC0gZnJvbSBjaGlsZCAqLworICBkZXZpY2VfZG1hX2NhbGxiYWNrcyBkbWE7CisKKyAgLyogaW50ZXJydXB0IHNpZ25hbGxpbmcgKi8KKyAgZGV2aWNlX2ludGVycnVwdF9jYWxsYmFja3MgaW50ZXJydXB0OworCisgIC8qIGJ1cyBhZGRyZXNzIGRlY29kaW5nICovCisgIGRldmljZV9jb252ZXJ0X2NhbGxiYWNrcyBjb252ZXJ0OworCisgIC8qIGluc3RhbmNlcyAqLworICBkZXZpY2VfY3JlYXRlX2luc3RhbmNlX2NhbGxiYWNrICppbnN0YW5jZV9jcmVhdGU7CisKKyAgLyogYmFjayBkb29yIHRvIGFueXRoaW5nIHdlJ3ZlIGZvcmdvdCAqLworICBkZXZpY2VfaW9jdGxfY2FsbGJhY2sgKmlvY3RsOworICBkZXZpY2VfdXNhZ2VfY2FsbGJhY2sgKnVzYWdlOworfTsKKworCisvKiBUYWJsZSBvZiBhbGwgdGhlIGRldmljZXMgYW5kIGEgZnVuY3Rpb24gdG8gbG9va3VwL2NyZWF0ZSBhIGRldmljZQorICAgZnJvbSBpdHMgbmFtZSAqLworCit0eXBlZGVmIHN0cnVjdCBfZGV2aWNlX2Rlc2NyaXB0b3IgZGV2aWNlX2Rlc2NyaXB0b3I7CitzdHJ1Y3QgX2RldmljZV9kZXNjcmlwdG9yIHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgZGV2aWNlX2NyZWF0b3IgKmNyZWF0b3I7CisgIGNvbnN0IGRldmljZV9jYWxsYmFja3MgKmNhbGxiYWNrczsKK307CisKK2V4dGVybiBjb25zdCBkZXZpY2VfZGVzY3JpcHRvciAqY29uc3QgZGV2aWNlX3RhYmxlW107CisjaW5jbHVkZSAiaHcuaCIKKworCisvKiBQYXNzIHRocm91Z2gsIGlnbm9yZSBhbmQgZ2VuZXJpYyBjYWxsYmFjayBmdW5jdGlvbnMuICBBIGNhbGwgZ29pbmcKKyAgIHRvd2FyZHMgdGhlIHJvb3QgZGV2aWNlIGFyZSBwYXNzZWQgb24gdXAsIGxvY2FsIGNhbGxzIGFyZSBpZ25vcmVkCisgICBhbmQgY2FsbCBkb3ducyBhYm9ydCAqLworCitleHRlcm4gZGV2aWNlX2FkZHJlc3NfY2FsbGJhY2sgcGFzc3Rocm91Z2hfZGV2aWNlX2FkZHJlc3NfYXR0YWNoOworZXh0ZXJuIGRldmljZV9hZGRyZXNzX2NhbGxiYWNrIHBhc3N0aHJvdWdoX2RldmljZV9hZGRyZXNzX2RldGFjaDsKK2V4dGVybiBkZXZpY2VfZG1hX3JlYWRfYnVmZmVyX2NhbGxiYWNrIHBhc3N0aHJvdWdoX2RldmljZV9kbWFfcmVhZF9idWZmZXI7CitleHRlcm4gZGV2aWNlX2RtYV93cml0ZV9idWZmZXJfY2FsbGJhY2sgcGFzc3Rocm91Z2hfZGV2aWNlX2RtYV93cml0ZV9idWZmZXI7CisKK2V4dGVybiBkZXZpY2VfdW5pdF9kZWNvZGVfY2FsbGJhY2sgaWdub3JlX2RldmljZV91bml0X2RlY29kZTsKKworZXh0ZXJuIGRldmljZV9pbml0X2NhbGxiYWNrIGdlbmVyaWNfZGV2aWNlX2luaXRfYWRkcmVzczsKK2V4dGVybiBkZXZpY2VfdW5pdF9kZWNvZGVfY2FsbGJhY2sgZ2VuZXJpY19kZXZpY2VfdW5pdF9kZWNvZGU7CitleHRlcm4gZGV2aWNlX3VuaXRfZW5jb2RlX2NhbGxiYWNrIGdlbmVyaWNfZGV2aWNlX3VuaXRfZW5jb2RlOworZXh0ZXJuIGRldmljZV9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzX2NhbGxiYWNrIGdlbmVyaWNfZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3M7CitleHRlcm4gZGV2aWNlX3NpemVfdG9fYXR0YWNoX3NpemVfY2FsbGJhY2sgZ2VuZXJpY19kZXZpY2Vfc2l6ZV90b19hdHRhY2hfc2l6ZTsKKworCitleHRlcm4gY29uc3QgZGV2aWNlX2NhbGxiYWNrcyBwYXNzdGhyb3VnaF9kZXZpY2VfY2FsbGJhY2tzOworCisjZW5kaWYgLyogX0RFVklDRV9UQUJMRV9IXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9kZ2VuLmMgYi9zaW0vcHBjL2RnZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGUwZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9kZ2VuLmMKQEAgLTAsMCArMSwzMzYgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgImxmLmgiCisjaW5jbHVkZSAidGFibGUuaCIKKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBzcHJlZ19sb29rdXBfdGFibGUgPSAxOworZW51bSB7CisgIG5yX29mX3NwcnMgPSAxMDI0LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwordHlwZWRlZiBlbnVtIHsKKyAgc3ByZWdfbmFtZSwKKyAgc3ByZWdfcmVnX25yLAorICBzcHJlZ19yZWFkb25seSwKKyAgc3ByZWdfbGVuZ3RoLAorICBucl9zcHJlZ19maWVsZHMsCit9IHNwcmVnX2ZpZWxkczsKKwordHlwZWRlZiBzdHJ1Y3QgX3NwcmVnX3RhYmxlX2VudHJ5IHNwcmVnX3RhYmxlX2VudHJ5Oworc3RydWN0IF9zcHJlZ190YWJsZV9lbnRyeSB7CisgIGNoYXIgKm5hbWU7CisgIGludCBzcHJlZ19ucjsKKyAgaW50IGlzX3JlYWRvbmx5OworICBpbnQgbGVuZ3RoOworICB0YWJsZV9lbnRyeSAqZW50cnk7CisgIHNwcmVnX3RhYmxlX2VudHJ5ICpuZXh0OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX3NwcmVnX3RhYmxlIHNwcmVnX3RhYmxlOworc3RydWN0IF9zcHJlZ190YWJsZSB7CisgIHNwcmVnX3RhYmxlX2VudHJ5ICpzcHJzOworfTsKKworc3RhdGljIHZvaWQKK3NwcmVnX3RhYmxlX2luc2VydChzcHJlZ190YWJsZSAqdGFibGUsIHRhYmxlX2VudHJ5ICplbnRyeSkKK3sKKyAgLyogY3JlYXRlIGEgbmV3IHNwciBlbnRyeSAqLworICBzcHJlZ190YWJsZV9lbnRyeSAqbmV3X3NwciA9IFpBTExPQyhzcHJlZ190YWJsZV9lbnRyeSk7CisgIG5ld19zcHItPm5leHQgPSBOVUxMOworICBuZXdfc3ByLT5lbnRyeSA9IGVudHJ5OworICBuZXdfc3ByLT5zcHJlZ19uciA9IGF0b2koZW50cnktPmZpZWxkc1tzcHJlZ19yZWdfbnJdKTsKKyAgbmV3X3Nwci0+aXNfcmVhZG9ubHkgPSAoZW50cnktPmZpZWxkc1tzcHJlZ19yZWFkb25seV0KKwkJCSAgPyBhdG9pKGVudHJ5LT5maWVsZHNbc3ByZWdfcmVhZG9ubHldKQorCQkJICA6IDApOworICBuZXdfc3ByLT5sZW5ndGggPSBhdG9pKGVudHJ5LT5maWVsZHNbc3ByZWdfbGVuZ3RoXSk7CisgIG5ld19zcHItPm5hbWUgPSAoY2hhciopemFsbG9jKHN0cmxlbihlbnRyeS0+ZmllbGRzW3NwcmVnX25hbWVdKSArIDEpOworICBBU1NFUlQobmV3X3Nwci0+bmFtZSAhPSBOVUxMKTsKKyAgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGVudHJ5LT5maWVsZHNbc3ByZWdfbmFtZV1baV0gIT0gJ1wwJzsgaSsrKSB7CisgICAgICBpZiAoaXN1cHBlcihlbnRyeS0+ZmllbGRzW3NwcmVnX25hbWVdW2ldKSkKKwluZXdfc3ByLT5uYW1lW2ldID0gdG9sb3dlcihlbnRyeS0+ZmllbGRzW3NwcmVnX25hbWVdW2ldKTsKKyAgICAgIGVsc2UKKwluZXdfc3ByLT5uYW1lW2ldID0gZW50cnktPmZpZWxkc1tzcHJlZ19uYW1lXVtpXTsKKyAgICB9CisgIH0KKworICAvKiBpbnNlcnQsIGJ5IHNwcmVnX25yIG9yZGVyICovCisgIHsKKyAgICBzcHJlZ190YWJsZV9lbnRyeSAqKnB0cl90b19zcHJlZ19lbnRyeSA9ICZ0YWJsZS0+c3ByczsKKyAgICBzcHJlZ190YWJsZV9lbnRyeSAqc3ByZWdfZW50cnkgPSAqcHRyX3RvX3NwcmVnX2VudHJ5OworICAgIHdoaWxlIChzcHJlZ19lbnRyeSAhPSBOVUxMICYmIHNwcmVnX2VudHJ5LT5zcHJlZ19uciA8IG5ld19zcHItPnNwcmVnX25yKSB7CisgICAgICBwdHJfdG9fc3ByZWdfZW50cnkgPSAmc3ByZWdfZW50cnktPm5leHQ7CisgICAgICBzcHJlZ19lbnRyeSA9ICpwdHJfdG9fc3ByZWdfZW50cnk7CisgICAgfQorICAgIEFTU0VSVChzcHJlZ19lbnRyeSA9PSBOVUxMIHx8IHNwcmVnX2VudHJ5LT5zcHJlZ19uciAhPSBuZXdfc3ByLT5zcHJlZ19ucik7CisgICAgKnB0cl90b19zcHJlZ19lbnRyeSA9IG5ld19zcHI7CisgICAgbmV3X3Nwci0+bmV4dCA9IHNwcmVnX2VudHJ5OworICB9CisKK30KKworCitzdGF0aWMgc3ByZWdfdGFibGUgKgorc3ByZWdfdGFibGVfbG9hZChjaGFyICpmaWxlX25hbWUpCit7CisgIHRhYmxlICpmaWxlID0gdGFibGVfb3BlbihmaWxlX25hbWUsIG5yX3NwcmVnX2ZpZWxkcywgMCk7CisgIHNwcmVnX3RhYmxlICp0YWJsZSA9IFpBTExPQyhzcHJlZ190YWJsZSk7CisKKyAgeworICAgIHRhYmxlX2VudHJ5ICplbnRyeTsKKyAgICB3aGlsZSAoKGVudHJ5ID0gdGFibGVfZW50cnlfcmVhZChmaWxlKSkgIT0gTlVMTCkgeworICAgICAgc3ByZWdfdGFibGVfaW5zZXJ0KHRhYmxlLCBlbnRyeSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRhYmxlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjaGFyICpzcHJlZ19hdHRyaWJ1dGVzW10gPSB7CisgICJpc192YWxpZCIsCisgICJpc19yZWFkb25seSIsCisgICJuYW1lIiwKKyAgImluZGV4IiwKKyAgImxlbmd0aCIsCisgIDAKK307CisKK3N0YXRpYyB2b2lkCitnZW5fc3ByZWdfaChzcHJlZ190YWJsZSAqdGFibGUsIGxmICpmaWxlKQoreworICBzcHJlZ190YWJsZV9lbnRyeSAqZW50cnk7CisgIGNoYXIgKiphdHRyaWJ1dGU7CisKKyAgbGZfcHJpbnRfX2dudV9jb3B5bGVmdChmaWxlKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNpZm5kZWYgX1NQUkVHX0hfXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lIF9TUFJFR19IX1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJ0eXBlZGVmIHVuc2lnbmVkX3dvcmQgc3ByZWc7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9wcmludGYoZmlsZSwgInR5cGVkZWYgZW51bSB7XG4iKTsKKworICBmb3IgKGVudHJ5ID0gdGFibGUtPnNwcnM7CisgICAgICAgZW50cnkgIT0gTlVMTCA7CisgICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dCkgeworICAgIGxmX3ByaW50ZihmaWxlLCAiICBzcHJfJXMgPSAlZCxcbiIsIGVudHJ5LT5uYW1lLCBlbnRyeS0+c3ByZWdfbnIpOworICB9CisKKyAgbGZfcHJpbnRmKGZpbGUsICIgIG5yX29mX3NwcnMgPSAlZFxuIiwgbnJfb2Zfc3Bycyk7CisgIGxmX3ByaW50ZihmaWxlLCAifSBzcHJzO1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgZm9yIChhdHRyaWJ1dGUgPSBzcHJlZ19hdHRyaWJ1dGVzOworICAgICAgICphdHRyaWJ1dGUgIT0gTlVMTDsKKyAgICAgICBhdHRyaWJ1dGUrKykgeworICAgIGlmIChzdHJjbXAoKmF0dHJpYnV0ZSwgIm5hbWUiKSA9PSAwKSB7CisgICAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJjb25zdCBjaGFyICoiLCAiSU5MSU5FX1NQUkVHIiwgIiAiKTsKKyAgICAgIGxmX3ByaW50ZihmaWxlLCAic3ByXyVzKHNwcnMgc3ByKTtcbiIsICphdHRyaWJ1dGUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgImludCIsICJJTkxJTkVfU1BSRUciLCAiICIpOworICAgICAgbGZfcHJpbnRmKGZpbGUsICJzcHJfJXMoc3BycyBzcHIpO1xuIiwgKmF0dHJpYnV0ZSk7CisgICAgfQorICB9CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIjZW5kaWYgLyogX1NQUkVHX0hfICovXG4iKTsKK30KKworCitzdGF0aWMgdm9pZAorZ2VuX3NwcmVnX2Moc3ByZWdfdGFibGUgKnRhYmxlLCBsZiAqZmlsZSkKK3sKKyAgc3ByZWdfdGFibGVfZW50cnkgKmVudHJ5OworICBjaGFyICoqYXR0cmlidXRlOworICBpbnQgc3ByZWdfbnI7CisKKyAgbGZfcHJpbnRfX2dudV9jb3B5bGVmdChmaWxlKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNpZm5kZWYgX1NQUkVHX0NfXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lIF9TUFJFR19DX1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcImJhc2ljcy5oXCJcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwic3ByZWcuaFwiXG4iKTsKKworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAidHlwZWRlZiBzdHJ1Y3QgX3NwcmVnX2luZm8ge1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiICBjaGFyICpuYW1lO1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiICBpbnQgaXNfdmFsaWQ7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgIGludCBsZW5ndGg7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgIGludCBpc19yZWFkb25seTtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiAgaW50IGluZGV4O1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAifSBzcHJlZ19pbmZvO1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJzdGF0aWMgc3ByZWdfaW5mbyBzcHJfaW5mb1tucl9vZl9zcHJzKzFdID0ge1xuIik7CisgIGVudHJ5ID0gdGFibGUtPnNwcnM7CisgIGZvciAoc3ByZWdfbnIgPSAwOyBzcHJlZ19uciA8IG5yX29mX3NwcnMrMTsgc3ByZWdfbnIrKykgeworICAgIGlmIChlbnRyeSA9PSBOVUxMIHx8IHNwcmVnX25yIDwgZW50cnktPnNwcmVnX25yKQorICAgICAgbGZfcHJpbnRmKGZpbGUsICIgIHsgMCwgMCwgMCwgMCwgJWR9LFxuIiwgc3ByZWdfbnIpOworICAgIGVsc2UgeworICAgICAgbGZfcHJpbnRmKGZpbGUsICIgIHsgXCIlc1wiLCAlZCwgJWQsICVkLCBzcHJfJXMgLyolZCovIH0sXG4iLAorCQllbnRyeS0+bmFtZSwgMSwgZW50cnktPmxlbmd0aCwgZW50cnktPmlzX3JlYWRvbmx5LAorCQllbnRyeS0+bmFtZSwgZW50cnktPnNwcmVnX25yKTsKKyAgICAgIGVudHJ5ID0gZW50cnktPm5leHQ7CisgICAgfQorICB9CisgIGxmX3ByaW50ZihmaWxlLCAifTtcbiIpOworCisgIGZvciAoYXR0cmlidXRlID0gc3ByZWdfYXR0cmlidXRlczsKKyAgICAgICAqYXR0cmlidXRlICE9IE5VTEw7CisgICAgICAgYXR0cmlidXRlKyspIHsKKyAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgICAgaWYgKHN0cmNtcCgqYXR0cmlidXRlLCAibmFtZSIpID09IDApIHsKKyAgICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgImNvbnN0IGNoYXIgKiIsICJJTkxJTkVfU1BSRUciLCAiXG4iKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJpbnQiLCAiSU5MSU5FX1NQUkVHIiwgIlxuIik7CisgICAgfQorICAgIGxmX3ByaW50ZihmaWxlLCAic3ByXyVzKHNwcnMgc3ByKVxuIiwgKmF0dHJpYnV0ZSk7CisgICAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKKyAgICBpZiAoc3ByZWdfbG9va3VwX3RhYmxlCisJfHwgc3RyY21wKCphdHRyaWJ1dGUsICJuYW1lIikgPT0gMAorCXx8IHN0cmNtcCgqYXR0cmlidXRlLCAiaW5kZXgiKSA9PSAwKQorICAgICAgbGZfcHJpbnRmKGZpbGUsICIgIHJldHVybiBzcHJfaW5mb1tzcHJdLiVzO1xuIiwKKwkJKmF0dHJpYnV0ZSk7CisgICAgZWxzZSB7CisgICAgICBzcHJlZ190YWJsZV9lbnRyeSAqZW50cnk7CisgICAgICBsZl9wcmludGYoZmlsZSwgIiAgc3dpdGNoIChzcHIpIHtcbiIpOworICAgICAgZm9yIChlbnRyeSA9IHRhYmxlLT5zcHJzOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KSB7CisJbGZfcHJpbnRmKGZpbGUsICIgIGNhc2UgJWQ6XG4iLCBlbnRyeS0+c3ByZWdfbnIpOworCWlmIChzdHJjbXAoKmF0dHJpYnV0ZSwgImlzX3ZhbGlkIikgPT0gMCkKKwkgIGxmX3ByaW50ZihmaWxlLCAiICAgIHJldHVybiAxO1xuIik7CisJZWxzZSBpZiAoc3RyY21wKCphdHRyaWJ1dGUsICJpc19yZWFkb25seSIpID09IDApCisJICBsZl9wcmludGYoZmlsZSwgIiAgICByZXR1cm4gJWQ7XG4iLCBlbnRyeS0+aXNfcmVhZG9ubHkpOworCWVsc2UgaWYgKHN0cmNtcCgqYXR0cmlidXRlLCAibGVuZ3RoIikgPT0gMCkKKwkgIGxmX3ByaW50ZihmaWxlLCAiICAgIHJldHVybiAlZDtcbiIsIGVudHJ5LT5sZW5ndGgpOworCWVsc2UKKwkgIEFTU0VSVCgwKTsKKyAgICAgIH0KKyAgICAgIGxmX3ByaW50ZihmaWxlLCAiICBkZWZhdWx0OlxuIik7CisgICAgICBsZl9wcmludGYoZmlsZSwgIiAgICByZXR1cm4gMDtcbiIpOworICAgICAgbGZfcHJpbnRmKGZpbGUsICIgIH1cbiIpOworICAgIH0KKyAgICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworICB9CisKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNlbmRpZiAvKiBfU1BSRUdfQ18gKi9cbiIpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW50CittYWluKGludCBhcmdjLAorICAgICBjaGFyICoqYXJndiwKKyAgICAgY2hhciAqKmVudnApCit7CisgIGxmX2ZpbGVfcmVmZXJlbmNlcyBmaWxlX3JlZmVyZW5jZXMgPSBsZl9pbmNsdWRlX3JlZmVyZW5jZXM7CisgIHNwcmVnX3RhYmxlICpzcHJzID0gTlVMTDsKKyAgY2hhciAqcmVhbF9maWxlX25hbWUgPSBOVUxMOworICBpbnQgaXNfaGVhZGVyID0gMDsKKyAgaW50IGNoOworCisgIGlmIChhcmdjIDw9IDEpIHsKKyAgICBwcmludGYoIlVzYWdlOiBkZ2VuIC4uLlxuIik7CisgICAgcHJpbnRmKCItcyAgVXNlIHN3aXRjaCBpbnN0ZWFkIG9mIHRhYmxlXG4iKTsKKyAgICBwcmludGYoIi1uIDxmaWxlLW5hbWU+ICBVc2UgdGhpcyBhcyBjcHAgbGluZSBudW1iZXJpbmcgbmFtZVxuIik7CisgICAgcHJpbnRmKCItaCAgT3V0cHV0IGhlYWRlciBmaWxlXG4iKTsKKyAgICBwcmludGYoIi1wIDxzcHJlZy1maWxlPiAgT3V0cHV0IHNwcmVnLmgoUCkgb3Igc3ByZWcuYyhwKVxuIik7CisgICAgcHJpbnRmKCItTCAgU3VwcHJlc3MgY3BwIGxpbmUgbnVtYmVyaW5nIGluIG91dHB1dCBmaWxlc1xuIik7CisgIH0KKworCisgIHdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgImhMc246cjpwOiIpKSAhPSAtMSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiXHQtJWMgJXNcbiIsIGNoLCAoIG9wdGFyZyA/IG9wdGFyZyA6ICIiKSk7CisgICAgc3dpdGNoKGNoKSB7CisgICAgY2FzZSAncyc6CisgICAgICBzcHJlZ19sb29rdXBfdGFibGUgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncic6CisgICAgICBzcHJzID0gc3ByZWdfdGFibGVfbG9hZChvcHRhcmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbic6CisgICAgICByZWFsX2ZpbGVfbmFtZSA9IHN0cmR1cChvcHRhcmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnTCc6CisgICAgICBmaWxlX3JlZmVyZW5jZXMgPSBsZl9vbWl0X3JlZmVyZW5jZXM7CisgICAgICBicmVhazsKKyAgICBjYXNlICdoJzoKKyAgICAgIGlzX2hlYWRlciA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlICdwJzoKKyAgICAgIHsKKwlsZiAqZmlsZSA9IGxmX29wZW4ob3B0YXJnLCByZWFsX2ZpbGVfbmFtZSwgZmlsZV9yZWZlcmVuY2VzLAorCQkJICAgKGlzX2hlYWRlciA/IGxmX2lzX2ggOiBsZl9pc19jKSwKKwkJCSAgIGFyZ3ZbMF0pOworCWlmIChpc19oZWFkZXIpCisJICBnZW5fc3ByZWdfaChzcHJzLCBmaWxlKTsKKwllbHNlCisJICBnZW5fc3ByZWdfYyhzcHJzLCBmaWxlKTsKKwlsZl9jbG9zZShmaWxlKTsKKwlpc19oZWFkZXIgPSAwOworICAgICAgfQorICAgICAgcmVhbF9maWxlX25hbWUgPSBOVUxMOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yKCJ1bmtub3duIG9wdGlvblxuIik7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9kb3VibGUuYyBiL3NpbS9wcGMvZG91YmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5NDMwMQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZG91YmxlLmMKQEAgLTAsMCArMSw0MiBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfRE9VQkxFX0NfCisjZGVmaW5lIF9ET1VCTEVfQ18KKworI2luY2x1ZGUgImJhc2ljcy5oIgorCisjZGVmaW5lIFNGdHlwZSB1bnNpZ25lZDMyCisjZGVmaW5lIERGdHlwZSB1bnNpZ25lZDY0CisKKyNkZWZpbmUgSEl0eXBlIHNpZ25lZDE2CisjZGVmaW5lIFNJdHlwZSBzaWduZWQzMgorI2RlZmluZSBESXR5cGUgc2lnbmVkNjQKKworI2RlZmluZSBVSEl0eXBlIHVuc2lnbmVkMTYKKyNkZWZpbmUgVVNJdHlwZSB1bnNpZ25lZDMyCisjZGVmaW5lIFVESXR5cGUgdW5zaWduZWQ2NAorCisKKyNkZWZpbmUgVVNfU09GVFdBUkVfR09GQVNUCisjaW5jbHVkZSAiZHAtYml0LmMiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9kcC1iaXQuYyBiL3NpbS9wcGMvZHAtYml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxMzEzMgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZHAtYml0LmMKQEAgLTAsMCArMSwxMzA3IEBACisvKiBUaGlzIGlzIGEgc29mdHdhcmUgZmxvYXRpbmcgcG9pbnQgbGlicmFyeSB3aGljaCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mCisgICB0aGUgZmxvYXRpbmcgcG9pbnQgcm91dGluZXMgaW4gbGliZ2NjMS5jIGZvciB0YXJnZXRzIHdpdGhvdXQgaGFyZHdhcmUKKyAgIGZsb2F0aW5nIHBvaW50LiAgKi8KKworLyogQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitsYXRlciB2ZXJzaW9uLgorCitJbiBhZGRpdGlvbiB0byB0aGUgcGVybWlzc2lvbnMgaW4gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcyB5b3UgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gbGluayB0aGUKK2NvbXBpbGVkIHZlcnNpb24gb2YgdGhpcyBmaWxlIHdpdGggb3RoZXIgcHJvZ3JhbXMsIGFuZCB0byBkaXN0cmlidXRlCit0aG9zZSBwcm9ncmFtcyB3aXRob3V0IGFueSByZXN0cmljdGlvbiBjb21pbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMKK2ZpbGUuICAoVGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmVzdHJpY3Rpb25zIGRvIGFwcGx5IGluIG90aGVyCityZXNwZWN0czsgZm9yIGV4YW1wbGUsIHRoZXkgY292ZXIgbW9kaWZpY2F0aW9uIG9mIHRoZSBmaWxlLCBhbmQKK2Rpc3RyaWJ1dGlvbiB3aGVuIG5vdCBsaW5rZWQgaW50byBhbm90aGVyIHByb2dyYW0uKQorCitUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLworCisvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiB5b3UgbGluayB0aGlzIGxpYnJhcnkgd2l0aCBvdGhlciBmaWxlcywKKyAgIHNvbWUgb2Ygd2hpY2ggYXJlIGNvbXBpbGVkIHdpdGggR0NDLCB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsCisgICB0aGlzIGxpYnJhcnkgZG9lcyBub3QgYnkgaXRzZWxmIGNhdXNlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZQorICAgdG8gYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgICBUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBob3dldmVyIGludmFsaWRhdGUgYW55IG90aGVyIHJlYXNvbnMgd2h5CisgICB0aGUgZXhlY3V0YWJsZSBmaWxlIG1pZ2h0IGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgKi8KKworLyogVGhpcyBpbXBsZW1lbnRzIElFRUUgNzU0IGZvcm1hdCBhcml0aG1ldGljLCBidXQgZG9lcyBub3QgcHJvdmlkZSBhCisgICBtZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlIHJvdW5kaW5nIG1vZGUsIG9yIGZvciBnZW5lcmF0aW5nIG9yIGhhbmRsaW5nCisgICBleGNlcHRpb25zLgorCisgICBUaGUgb3JpZ2luYWwgY29kZSBieSBTdGV2ZSBDaGFtYmVybGFpbiwgaGFja2VkIGJ5IE1hcmsgRWljaGluIGFuZCBKaW0KKyAgIFdpbHNvbiwgYWxsIG9mIEN5Z251cyBTdXBwb3J0LiAgKi8KKworLyogVGhlIGludGVuZGVkIHdheSB0byB1c2UgdGhpcyBmaWxlIGlzIHRvIG1ha2UgdHdvIGNvcGllcywgYWRkIGAjZGVmaW5lIEZMT0FUJworICAgdG8gb25lIGNvcHksIHRoZW4gY29tcGlsZSBib3RoIGNvcGllcyBhbmQgYWRkIHRoZW0gdG8gbGliZ2NjLmEuICAqLworCisvKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBjYW4gYmUgZGVmaW5lZCB0byBjaGFuZ2UgdGhlIGJlaGF2aW91ciBvZiB0aGlzIGZpbGU6CisgICBGTE9BVDogSW1wbGVtZW50IGEgYGZsb2F0JywgYWthIFNGbW9kZSwgZnAgbGlicmFyeS4gIElmIHRoaXMgaXMgbm90CisgICAgIGRlZmluZWQsIHRoZW4gdGhpcyBmaWxlIGltcGxlbWVudHMgYSBgZG91YmxlJywgYWthIERGbW9kZSwgZnAgbGlicmFyeS4KKyAgIEZMT0FUX09OTFk6IFVzZWQgd2l0aCBGTE9BVCwgdG8gaW1wbGVtZW50IGEgYGZsb2F0JyBvbmx5IGxpYnJhcnksIGkuZS4KKyAgICAgZG9uJ3QgaW5jbHVkZSBmbG9hdC0+ZG91YmxlIGNvbnZlcnNpb24gd2hpY2ggcmVxdWlyZXMgdGhlIGRvdWJsZSBsaWJyYXJ5LgorICAgICBUaGlzIGlzIHVzZWZ1bCBvbmx5IGZvciBtYWNoaW5lcyB3aGljaCBjYW4ndCBzdXBwb3J0IGRvdWJsZXMsIGUuZy4gc29tZQorICAgICA4LWJpdCBwcm9jZXNzb3JzLgorICAgQ01QdHlwZTogU3BlY2lmeSB0aGUgdHlwZSB0aGF0IGZsb2F0aW5nIHBvaW50IGNvbXBhcmVzIHNob3VsZCByZXR1cm4uCisgICAgIFRoaXMgZGVmYXVsdHMgdG8gU0l0eXBlLCBha2EgaW50LgorICAgVVNfU09GVFdBUkVfR09GQVNUOiBUaGlzIG1ha2VzIGFsbCBlbnRyeSBwb2ludHMgdXNlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZQorICAgICBVUyBTb2Z0d2FyZSBnb0Zhc3QgbGlicmFyeS4gIElmIHRoaXMgaXMgbm90IGRlZmluZWQsIHRoZSBlbnRyeSBwb2ludHMgdXNlCisgICAgIHRoZSBzYW1lIG5hbWVzIGFzIGxpYmdjYzEuYy4KKyAgIF9ERUJVR19CSVRGTE9BVDogVGhpcyBtYWtlcyBkZWJ1Z2dpbmcgdGhlIGNvZGUgYSBsaXR0bGUgZWFzaWVyLCBieSBhZGRpbmcKKyAgICAgdHdvIGludGVnZXJzIHRvIHRoZSBGTE9fdW5pb25fdHlwZS4gIAorICAgTk9fTkFOUzogRGlzYWJsZSBuYW4gYW5kIGluZmluaXR5IGhhbmRsaW5nCisgICBTTUFMTF9NQUNISU5FOiBVc2VmdWwgd2hlbiBvcGVyYXRpb25zIG9uIFFJcyBhbmQgSElzIGFyZSBmYXN0ZXIKKyAgICAgdGhhbiBvbiBhbiBTSSAqLworCisjaWZuZGVmIFNGdHlwZQordHlwZWRlZiBTRnR5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFNGKSkpOworI2VuZGlmCisjaWZuZGVmIERGdHlwZQordHlwZWRlZiBERnR5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKERGKSkpOworI2VuZGlmCisKKyNpZm5kZWYgSEl0eXBlCit0eXBlZGVmIGludCBISXR5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKEhJKSkpOworI2VuZGlmCisjaWZuZGVmIFNJdHlwZQordHlwZWRlZiBpbnQgU0l0eXBlIF9fYXR0cmlidXRlX18gKChtb2RlIChTSSkpKTsKKyNlbmRpZgorI2lmbmRlZiBESXR5cGUKK3R5cGVkZWYgaW50IERJdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZSAoREkpKSk7CisjZW5kaWYKKworLyogVGhlIHR5cGUgb2YgdGhlIHJlc3VsdCBvZiBhIGZwIGNvbXBhcmUgKi8KKyNpZm5kZWYgQ01QdHlwZQorI2RlZmluZSBDTVB0eXBlIFNJdHlwZQorI2VuZGlmCisKKyNpZm5kZWYgVUhJdHlwZQordHlwZWRlZiB1bnNpZ25lZCBpbnQgVUhJdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZSAoSEkpKSk7CisjZW5kaWYKKyNpZm5kZWYgVVNJdHlwZQordHlwZWRlZiB1bnNpZ25lZCBpbnQgVVNJdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZSAoU0kpKSk7CisjZW5kaWYKKyNpZm5kZWYgVURJdHlwZQordHlwZWRlZiB1bnNpZ25lZCBpbnQgVURJdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZSAoREkpKSk7CisjZW5kaWYKKworI2RlZmluZSBNQVhfU0lfSU5UICAgKChTSXR5cGUpICgodW5zaWduZWQpICh+MCk+PjEpKQorI2RlZmluZSBNQVhfVVNJX0lOVCAgKChVU0l0eXBlKSB+MCkKKworCisjaWZkZWYgRkxPQVRfT05MWQorI2RlZmluZSBOT19ESV9NT0RFCisjZW5kaWYKKworI2lmZGVmIEZMT0FUCisjCWRlZmluZSBOR0FSRFMgICAgN0wKKyMJZGVmaW5lIEdBUkRST1VORCAweDNmCisjCWRlZmluZSBHQVJETUFTSyAgMHg3ZgorIwlkZWZpbmUgR0FSRE1TQiAgIDB4NDAKKyMJZGVmaW5lIEVYUEJJVFMgOAorIwlkZWZpbmUgRVhQQklBUyAxMjcKKyMJZGVmaW5lIEZSQUNCSVRTIDIzCisjCWRlZmluZSBFWFBNQVggKDB4ZmYpCisjCWRlZmluZSBRVUlFVF9OQU4gMHgxMDAwMDBMCisjCWRlZmluZSBGUkFDX05CSVRTIDMyCisjCWRlZmluZSBGUkFDSElHSCAgMHg4MDAwMDAwMEwKKyMJZGVmaW5lIEZSQUNISUdIMiAweGMwMDAwMDAwTAorCXR5cGVkZWYgVVNJdHlwZSBmcmFjdHlwZTsKKwl0eXBlZGVmIFVISXR5cGUgaGFsZmZyYWN0eXBlOworCXR5cGVkZWYgU0Z0eXBlIEZMT190eXBlOworCXR5cGVkZWYgU0l0eXBlIGludGZyYWM7CisKKyNlbHNlCisjCWRlZmluZSBQUkVGSVhGUERQIGRwCisjCWRlZmluZSBQUkVGSVhTRkRGIGRmCisjCWRlZmluZSBOR0FSRFMgOEwKKyMJZGVmaW5lIEdBUkRST1VORCAweDdmCisjCWRlZmluZSBHQVJETUFTSyAgMHhmZgorIwlkZWZpbmUgR0FSRE1TQiAgIDB4ODAKKyMJZGVmaW5lIEVYUEJJVFMgMTEKKyMJZGVmaW5lIEVYUEJJQVMgMTAyMworIwlkZWZpbmUgRlJBQ0JJVFMgNTIKKyMJZGVmaW5lIEVYUE1BWCAoMHg3ZmYpCisjCWRlZmluZSBRVUlFVF9OQU4gMHg4MDAwMDAwMDAwMDAwTEwKKyMJZGVmaW5lIEZSQUNfTkJJVFMgNjQKKyMJZGVmaW5lIEZSQUNISUdIICAweDgwMDAwMDAwMDAwMDAwMDBMTAorIwlkZWZpbmUgRlJBQ0hJR0gyIDB4YzAwMDAwMDAwMDAwMDAwMExMCisJdHlwZWRlZiBVREl0eXBlIGZyYWN0eXBlOworCXR5cGVkZWYgVVNJdHlwZSBoYWxmZnJhY3R5cGU7CisJdHlwZWRlZiBERnR5cGUgRkxPX3R5cGU7CisJdHlwZWRlZiBESXR5cGUgaW50ZnJhYzsKKyNlbmRpZgorCisjaWZkZWYgVVNfU09GVFdBUkVfR09GQVNUCisjCWlmZGVmIEZMT0FUCisjCQlkZWZpbmUgYWRkIAkJZnBhZGQKKyMJCWRlZmluZSBzdWIgCQlmcHN1YgorIwkJZGVmaW5lIG11bHRpcGx5IAlmcG11bAorIwkJZGVmaW5lIGRpdmlkZSAJCWZwZGl2CisjCQlkZWZpbmUgY29tcGFyZSAJCWZwY21wCisjCQlkZWZpbmUgc2lfdG9fZmxvYXQgCXNpdG9mcAorIwkJZGVmaW5lIGZsb2F0X3RvX3NpIAlmcHRvc2kKKyMJCWRlZmluZSBmbG9hdF90b191c2kgCWZwdG91aQorIwkJZGVmaW5lIG5lZ2F0ZSAJCV9fbmVnc2YyCisjCQlkZWZpbmUgc2ZfdG9fZGYJCWZwdG9kcAorIwkJZGVmaW5lIGRwdG9mcCAJCWRwdG9mcAorI2Vsc2UKKyMJCWRlZmluZSBhZGQgCQlkcGFkZAorIwkJZGVmaW5lIHN1YiAJCWRwc3ViCisjCQlkZWZpbmUgbXVsdGlwbHkgCWRwbXVsCisjCQlkZWZpbmUgZGl2aWRlIAkJZHBkaXYKKyMJCWRlZmluZSBjb21wYXJlIAkJZHBjbXAKKyMJCWRlZmluZSBzaV90b19mbG9hdCAJbGl0b2RwCisjCQlkZWZpbmUgZmxvYXRfdG9fc2kgCWRwdG9saQorIwkJZGVmaW5lIGZsb2F0X3RvX3VzaSAJZHB0b3VsCisjCQlkZWZpbmUgbmVnYXRlIAkJX19uZWdkZjIKKyMJCWRlZmluZSBkZl90b19zZiAJZHB0b2ZwCisjZW5kaWYKKyNlbHNlCisjCWlmZGVmIEZMT0FUCisjCQlkZWZpbmUgYWRkIAkJX19hZGRzZjMKKyMJCWRlZmluZSBzdWIgCQlfX3N1YnNmMworIwkJZGVmaW5lIG11bHRpcGx5IAlfX211bHNmMworIwkJZGVmaW5lIGRpdmlkZSAJCV9fZGl2c2YzCisjCQlkZWZpbmUgY29tcGFyZSAJCV9fY21wc2YyCisjCQlkZWZpbmUgX2VxX2YyIAkJX19lcXNmMgorIwkJZGVmaW5lIF9uZV9mMiAJCV9fbmVzZjIKKyMJCWRlZmluZSBfZ3RfZjIgCQlfX2d0c2YyCisjCQlkZWZpbmUgX2dlX2YyIAkJX19nZXNmMgorIwkJZGVmaW5lIF9sdF9mMiAJCV9fbHRzZjIKKyMJCWRlZmluZSBfbGVfZjIgCQlfX2xlc2YyCisjCQlkZWZpbmUgc2lfdG9fZmxvYXQgCV9fZmxvYXRzaXNmCisjCQlkZWZpbmUgZmxvYXRfdG9fc2kgCV9fZml4c2ZzaQorIwkJZGVmaW5lIGZsb2F0X3RvX3VzaSAJX19maXh1bnNzZnNpCisjCQlkZWZpbmUgbmVnYXRlIAkJX19uZWdzZjIKKyMJCWRlZmluZSBzZl90b19kZgkJX19leHRlbmRzZmRmMgorI2Vsc2UKKyMJCWRlZmluZSBhZGQgCQlfX2FkZGRmMworIwkJZGVmaW5lIHN1YiAJCV9fc3ViZGYzCisjCQlkZWZpbmUgbXVsdGlwbHkgCV9fbXVsZGYzCisjCQlkZWZpbmUgZGl2aWRlIAkJX19kaXZkZjMKKyMJCWRlZmluZSBjb21wYXJlIAkJX19jbXBkZjIKKyMJCWRlZmluZSBfZXFfZjIgCQlfX2VxZGYyCisjCQlkZWZpbmUgX25lX2YyIAkJX19uZWRmMgorIwkJZGVmaW5lIF9ndF9mMiAJCV9fZ3RkZjIKKyMJCWRlZmluZSBfZ2VfZjIgCQlfX2dlZGYyCisjCQlkZWZpbmUgX2x0X2YyIAkJX19sdGRmMgorIwkJZGVmaW5lIF9sZV9mMiAJCV9fbGVkZjIKKyMJCWRlZmluZSBzaV90b19mbG9hdCAJX19mbG9hdHNpZGYKKyMJCWRlZmluZSBmbG9hdF90b19zaSAJX19maXhkZnNpCisjCQlkZWZpbmUgZmxvYXRfdG9fdXNpIAlfX2ZpeHVuc2Rmc2kKKyMJCWRlZmluZSBuZWdhdGUgCQlfX25lZ2RmMgorIwkJZGVmaW5lIGRmX3RvX3NmCQlfX3RydW5jZGZzZjIKKyMJZW5kaWYKKyNlbmRpZgorCisKKyNpZm5kZWYgSU5MSU5FCisjZGVmaW5lIElOTElORSBfX2lubGluZV9fCisjZW5kaWYKKworLyogUHJlc2VydmUgdGhlIHN0aWNreS1iaXQgd2hlbiBzaGlmdGluZyBmcmFjdGlvbnMgdG8gdGhlIHJpZ2h0LiAgKi8KKyNkZWZpbmUgTFNISUZUKGEpIHsgYSA9IChhICYgMSkgfCAoYSA+PiAxKTsgfQorCisvKiBudW1lcmljIHBhcmFtZXRlcnMgKi8KKy8qIEZfRF9CSVRPRkYgaXMgdGhlIG51bWJlciBvZiBiaXRzIG9mZnNldCBiZXR3ZWVuIHRoZSBNU0Igb2YgdGhlIG1hbnRpc3NhCisgICBvZiBhIGZsb2F0IGFuZCBvZiBhIGRvdWJsZS4gQXNzdW1lcyB0aGVyZSBhcmUgb25seSB0d28gZmxvYXQgdHlwZXMuCisgICAoZG91YmxlOjpGUkFDX0JJVFMrZG91YmxlOjpOR0FSR1MtKGZsb2F0OjpGUkFDX0JJVFMtZmxvYXQ6Ok5HQVJEUykpCisgKi8KKyNkZWZpbmUgRl9EX0JJVE9GRiAoNTIrOC0oMjMrNykpCisKKworI2RlZmluZSBOT1JNQUxfRVhQTUlOICgtKEVYUEJJQVMpKzEpCisjZGVmaW5lIElNUExJQ0lUXzEgKDFMTDw8KEZSQUNCSVRTK05HQVJEUykpCisjZGVmaW5lIElNUExJQ0lUXzIgKDFMTDw8KEZSQUNCSVRTKzErTkdBUkRTKSkKKworLyogY29tbW9uIHR5cGVzICovCisKK3R5cGVkZWYgZW51bQoreworICBDTEFTU19TTkFOLAorICBDTEFTU19RTkFOLAorICBDTEFTU19aRVJPLAorICBDTEFTU19OVU1CRVIsCisgIENMQVNTX0lORklOSVRZCit9IGZwX2NsYXNzX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisjaWZkZWYgU01BTExfTUFDSElORQorICBjaGFyIGNsYXNzOworICB1bnNpZ25lZCBjaGFyIHNpZ247CisgIHNob3J0IG5vcm1hbF9leHA7CisjZWxzZQorICBmcF9jbGFzc190eXBlIGNsYXNzOworICB1bnNpZ25lZCBpbnQgc2lnbjsKKyAgaW50IG5vcm1hbF9leHA7CisjZW5kaWYKKworICB1bmlvbgorICAgIHsKKyAgICAgIGZyYWN0eXBlIGxsOworICAgICAgaGFsZmZyYWN0eXBlIGxbMl07CisgICAgfSBmcmFjdGlvbjsKK30gZnBfbnVtYmVyX3R5cGU7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgRkxPX3R5cGUgdmFsdWU7CisjaWZkZWYgX0RFQlVHX0JJVEZMT0FUCisgIGludCBsWzJdOworI2VuZGlmCisgIHN0cnVjdAorICAgIHsKKyNpZm5kZWYgRkxPQVRfQklUX09SREVSX01JU01BVENICisgICAgICB1bnNpZ25lZCBpbnQgc2lnbjoxIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyAgICAgIHVuc2lnbmVkIGludCBleHA6RVhQQklUUyBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisgICAgICBmcmFjdHlwZSBmcmFjdGlvbjpGUkFDQklUUyBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisjZWxzZQorICAgICAgZnJhY3R5cGUgZnJhY3Rpb246RlJBQ0JJVFMgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworICAgICAgdW5zaWduZWQgaW50IGV4cDpFWFBCSVRTIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyAgICAgIHVuc2lnbmVkIGludCBzaWduOjEgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworI2VuZGlmCisgICAgfQorICBiaXRzOworfQorRkxPX3VuaW9uX3R5cGU7CisKKworLyogZW5kIG9mIGhlYWRlciAqLworCisvKiBJRUVFICJzcGVjaWFsIiBudW1iZXIgcHJlZGljYXRlcyAqLworCisjaWZkZWYgTk9fTkFOUworCisjZGVmaW5lIG5hbigpIDAKKyNkZWZpbmUgaXNuYW4oeCkgMAorI2RlZmluZSBpc2luZih4KSAwCisjZWxzZQorCitJTkxJTkUKK3N0YXRpYyBmcF9udW1iZXJfdHlwZSAqCituYW4gKCkKK3sKKyAgc3RhdGljIGZwX251bWJlcl90eXBlIHRoZW5hbjsKKworICByZXR1cm4gJnRoZW5hbjsKK30KKworSU5MSU5FCitzdGF0aWMgaW50Citpc25hbiAoIGZwX251bWJlcl90eXBlICogIHgpCit7CisgIHJldHVybiB4LT5jbGFzcyA9PSBDTEFTU19TTkFOIHx8IHgtPmNsYXNzID09IENMQVNTX1FOQU47Cit9CisKK0lOTElORQorc3RhdGljIGludAoraXNpbmYgKCBmcF9udW1iZXJfdHlwZSAqICB4KQoreworICByZXR1cm4geC0+Y2xhc3MgPT0gQ0xBU1NfSU5GSU5JVFk7Cit9CisKKyNlbmRpZgorCitJTkxJTkUKK3N0YXRpYyBpbnQKK2lzemVybyAoIGZwX251bWJlcl90eXBlICogIHgpCit7CisgIHJldHVybiB4LT5jbGFzcyA9PSBDTEFTU19aRVJPOworfQorCitJTkxJTkUgCitzdGF0aWMgdm9pZAorZmxpcF9zaWduICggZnBfbnVtYmVyX3R5cGUgKiAgeCkKK3sKKyAgeC0+c2lnbiA9ICF4LT5zaWduOworfQorCitzdGF0aWMgRkxPX3R5cGUKK3BhY2tfZCAoIGZwX251bWJlcl90eXBlICogIHNyYykKK3sKKyAgRkxPX3VuaW9uX3R5cGUgZHN0OworICBmcmFjdHlwZSBmcmFjdGlvbiA9IHNyYy0+ZnJhY3Rpb24ubGw7CS8qIHdhc24ndCB1bnNpZ25lZCBiZWZvcmU/ICovCisKKyAgZHN0LmJpdHMuc2lnbiA9IHNyYy0+c2lnbjsKKworICBpZiAoaXNuYW4gKHNyYykpCisgICAgeworICAgICAgZHN0LmJpdHMuZXhwID0gRVhQTUFYOworICAgICAgZHN0LmJpdHMuZnJhY3Rpb24gPSBzcmMtPmZyYWN0aW9uLmxsOworICAgICAgaWYgKHNyYy0+Y2xhc3MgPT0gQ0xBU1NfUU5BTiB8fCAxKQorCXsKKwkgIGRzdC5iaXRzLmZyYWN0aW9uIHw9IFFVSUVUX05BTjsKKwl9CisgICAgfQorICBlbHNlIGlmIChpc2luZiAoc3JjKSkKKyAgICB7CisgICAgICBkc3QuYml0cy5leHAgPSBFWFBNQVg7CisgICAgICBkc3QuYml0cy5mcmFjdGlvbiA9IDA7CisgICAgfQorICBlbHNlIGlmIChpc3plcm8gKHNyYykpCisgICAgeworICAgICAgZHN0LmJpdHMuZXhwID0gMDsKKyAgICAgIGRzdC5iaXRzLmZyYWN0aW9uID0gMDsKKyAgICB9CisgIGVsc2UgaWYgKGZyYWN0aW9uID09IDApCisgICAgeworICAgICAgZHN0LnZhbHVlID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoc3JjLT5ub3JtYWxfZXhwIDwgTk9STUFMX0VYUE1JTikKKwl7CisJICAvKiBUaGlzIG51bWJlcidzIGV4cG9uZW50IGlzIHRvbyBsb3cgdG8gZml0IGludG8gdGhlIGJpdHMKKwkgICAgIGF2YWlsYWJsZSBpbiB0aGUgbnVtYmVyLCBzbyB3ZSdsbCBzdG9yZSAwIGluIHRoZSBleHBvbmVudCBhbmQKKwkgICAgIHNoaWZ0IHRoZSBmcmFjdGlvbiB0byB0aGUgcmlnaHQgdG8gbWFrZSB1cCBmb3IgaXQuICAqLworCisJICBpbnQgc2hpZnQgPSBOT1JNQUxfRVhQTUlOIC0gc3JjLT5ub3JtYWxfZXhwOworCisJICBkc3QuYml0cy5leHAgPSAwOworCisJICBpZiAoc2hpZnQgPiBGUkFDX05CSVRTIC0gTkdBUkRTKQorCSAgICB7CisJICAgICAgLyogTm8gcG9pbnQgc2hpZnRpbmcsIHNpbmNlIGl0J3MgbW9yZSB0aGF0IDY0IG91dC4gICovCisJICAgICAgZnJhY3Rpb24gPSAwOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBTaGlmdCBieSB0aGUgdmFsdWUgKi8KKwkgICAgICBmcmFjdGlvbiA+Pj0gc2hpZnQ7CisJICAgIH0KKwkgIGZyYWN0aW9uID4+PSBOR0FSRFM7CisJICBkc3QuYml0cy5mcmFjdGlvbiA9IGZyYWN0aW9uOworCX0KKyAgICAgIGVsc2UgaWYgKHNyYy0+bm9ybWFsX2V4cCA+IEVYUEJJQVMpCisJeworCSAgZHN0LmJpdHMuZXhwID0gRVhQTUFYOworCSAgZHN0LmJpdHMuZnJhY3Rpb24gPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBkc3QuYml0cy5leHAgPSBzcmMtPm5vcm1hbF9leHAgKyBFWFBCSUFTOworCSAgLyogSUYgdGhlIGdhcmQgYml0cyBhcmUgdGhlIGFsbCB6ZXJvLCBidXQgdGhlIGZpcnN0LCB0aGVuIHdlJ3JlCisJICAgICBoYWxmIHdheSBiZXR3ZWVuIHR3byBudW1iZXJzLCBjaG9vc2UgdGhlIG9uZSB3aGljaCBtYWtlcyB0aGUKKwkgICAgIGxzYiBvZiB0aGUgYW5zd2VyIDAuICAqLworCSAgaWYgKChmcmFjdGlvbiAmIEdBUkRNQVNLKSA9PSBHQVJETVNCKQorCSAgICB7CisJICAgICAgaWYgKGZyYWN0aW9uICYgKDEgPDwgTkdBUkRTKSkKKwkJZnJhY3Rpb24gKz0gR0FSRFJPVU5EICsgMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogQWRkIGEgb25lIHRvIHRoZSBndWFyZHMgdG8gcm91bmQgdXAgKi8KKwkgICAgICBmcmFjdGlvbiArPSBHQVJEUk9VTkQ7CisJICAgIH0KKwkgIGlmIChmcmFjdGlvbiA+PSBJTVBMSUNJVF8yKQorCSAgICB7CisJICAgICAgZnJhY3Rpb24gPj49IDE7CisJICAgICAgZHN0LmJpdHMuZXhwICs9IDE7CisJICAgIH0KKwkgIGZyYWN0aW9uID4+PSBOR0FSRFM7CisJICBkc3QuYml0cy5mcmFjdGlvbiA9IGZyYWN0aW9uOworCX0KKyAgICB9CisgIHJldHVybiBkc3QudmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkCit1bnBhY2tfZCAoRkxPX3VuaW9uX3R5cGUgKiBzcmMsIGZwX251bWJlcl90eXBlICogZHN0KQoreworICBmcmFjdHlwZSBmcmFjdGlvbiA9IHNyYy0+Yml0cy5mcmFjdGlvbjsKKworICBkc3QtPnNpZ24gPSBzcmMtPmJpdHMuc2lnbjsKKyAgaWYgKHNyYy0+Yml0cy5leHAgPT0gMCkKKyAgICB7CisgICAgICAvKiBIbW0uICBMb29rcyBsaWtlIDAgKi8KKyAgICAgIGlmIChmcmFjdGlvbiA9PSAwKQorCXsKKwkgIC8qIHRhc3RlcyBsaWtlIHplcm8gKi8KKwkgIGRzdC0+Y2xhc3MgPSBDTEFTU19aRVJPOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBaZXJvIGV4cG9uZW50IHdpdGggbm9uIHplcm8gZnJhY3Rpb24gLSBpdCdzIGRlbm9ybWFsaXplZCwKKwkgICAgIHNvIHRoZXJlIGlzbid0IGEgbGVhZGluZyBpbXBsaWNpdCBvbmUgLSB3ZSdsbCBzaGlmdCBpdCBzbworCSAgICAgaXQgZ2V0cyBvbmUuICAqLworCSAgZHN0LT5ub3JtYWxfZXhwID0gc3JjLT5iaXRzLmV4cCAtIEVYUEJJQVMgKyAxOworCSAgZnJhY3Rpb24gPDw9IE5HQVJEUzsKKworCSAgZHN0LT5jbGFzcyA9IENMQVNTX05VTUJFUjsKKyNpZiAxCisJICB3aGlsZSAoZnJhY3Rpb24gPCBJTVBMSUNJVF8xKQorCSAgICB7CisJICAgICAgZnJhY3Rpb24gPDw9IDE7CisJICAgICAgZHN0LT5ub3JtYWxfZXhwLS07CisJICAgIH0KKyNlbmRpZgorCSAgZHN0LT5mcmFjdGlvbi5sbCA9IGZyYWN0aW9uOworCX0KKyAgICB9CisgIGVsc2UgaWYgKHNyYy0+Yml0cy5leHAgPT0gRVhQTUFYKQorICAgIHsKKyAgICAgIC8qIEh1Z2UgZXhwb25lbnQqLworICAgICAgaWYgKGZyYWN0aW9uID09IDApCisJeworCSAgLyogQXR0YWNoZWQgdG8gYSB6ZXJvIGZyYWN0aW9uIC0gbWVhbnMgaW5maW5pdHkgKi8KKwkgIGRzdC0+Y2xhc3MgPSBDTEFTU19JTkZJTklUWTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogTm9uIHplcm8gZnJhY3Rpb24sIG1lYW5zIG5hbiAqLworCSAgaWYgKGRzdC0+c2lnbikKKwkgICAgeworCSAgICAgIGRzdC0+Y2xhc3MgPSBDTEFTU19TTkFOOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBkc3QtPmNsYXNzID0gQ0xBU1NfUU5BTjsKKwkgICAgfQorCSAgLyogS2VlcCB0aGUgZnJhY3Rpb24gcGFydCBhcyB0aGUgbmFuIG51bWJlciAqLworCSAgZHN0LT5mcmFjdGlvbi5sbCA9IGZyYWN0aW9uOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHN0cmFuZ2UgYWJvdXQgdGhpcyBudW1iZXIgKi8KKyAgICAgIGRzdC0+bm9ybWFsX2V4cCA9IHNyYy0+Yml0cy5leHAgLSBFWFBCSUFTOworICAgICAgZHN0LT5jbGFzcyA9IENMQVNTX05VTUJFUjsKKyAgICAgIGRzdC0+ZnJhY3Rpb24ubGwgPSAoZnJhY3Rpb24gPDwgTkdBUkRTKSB8IElNUExJQ0lUXzE7CisgICAgfQorfQorCitzdGF0aWMgZnBfbnVtYmVyX3R5cGUgKgorX2ZwYWRkX3BhcnRzIChmcF9udW1iZXJfdHlwZSAqIGEsCisJICAgICAgZnBfbnVtYmVyX3R5cGUgKiBiLAorCSAgICAgIGZwX251bWJlcl90eXBlICogdG1wKQoreworICBpbnRmcmFjIHRmcmFjdGlvbjsKKworICAvKiBQdXQgY29tbW9ubHkgdXNlZCBmaWVsZHMgaW4gbG9jYWwgdmFyaWFibGVzLiAgKi8KKyAgaW50IGFfbm9ybWFsX2V4cDsKKyAgaW50IGJfbm9ybWFsX2V4cDsKKyAgZnJhY3R5cGUgYV9mcmFjdGlvbjsKKyAgZnJhY3R5cGUgYl9mcmFjdGlvbjsKKworICBpZiAoaXNuYW4gKGEpKQorICAgIHsKKyAgICAgIHJldHVybiBhOworICAgIH0KKyAgaWYgKGlzbmFuIChiKSkKKyAgICB7CisgICAgICByZXR1cm4gYjsKKyAgICB9CisgIGlmIChpc2luZiAoYSkpCisgICAgeworICAgICAgLyogQWRkaW5nIGluZmluaXRpZXMgd2l0aCBvcHBvc2l0ZSBzaWducyB5aWVsZHMgYSBOYU4uICAqLworICAgICAgaWYgKGlzaW5mIChiKSAmJiBhLT5zaWduICE9IGItPnNpZ24pCisJcmV0dXJuIG5hbiAoKTsKKyAgICAgIHJldHVybiBhOworICAgIH0KKyAgaWYgKGlzaW5mIChiKSkKKyAgICB7CisgICAgICByZXR1cm4gYjsKKyAgICB9CisgIGlmIChpc3plcm8gKGIpKQorICAgIHsKKyAgICAgIHJldHVybiBhOworICAgIH0KKyAgaWYgKGlzemVybyAoYSkpCisgICAgeworICAgICAgcmV0dXJuIGI7CisgICAgfQorCisgIC8qIEdvdCB0d28gbnVtYmVycy4gc2hpZnQgdGhlIHNtYWxsZXIgYW5kIGluY3JlbWVudCB0aGUgZXhwb25lbnQgdGlsbAorICAgICB0aGV5J3JlIHRoZSBzYW1lICovCisgIHsKKyAgICBpbnQgZGlmZjsKKworICAgIGFfbm9ybWFsX2V4cCA9IGEtPm5vcm1hbF9leHA7CisgICAgYl9ub3JtYWxfZXhwID0gYi0+bm9ybWFsX2V4cDsKKyAgICBhX2ZyYWN0aW9uID0gYS0+ZnJhY3Rpb24ubGw7CisgICAgYl9mcmFjdGlvbiA9IGItPmZyYWN0aW9uLmxsOworCisgICAgZGlmZiA9IGFfbm9ybWFsX2V4cCAtIGJfbm9ybWFsX2V4cDsKKworICAgIGlmIChkaWZmIDwgMCkKKyAgICAgIGRpZmYgPSAtZGlmZjsKKyAgICBpZiAoZGlmZiA8IEZSQUNfTkJJVFMpCisgICAgICB7CisJLyogPz8/IFRoaXMgZG9lcyBzaGlmdHMgb25lIGJpdCBhdCBhIHRpbWUuICBPcHRpbWl6ZS4gICovCisJd2hpbGUgKGFfbm9ybWFsX2V4cCA+IGJfbm9ybWFsX2V4cCkKKwkgIHsKKwkgICAgYl9ub3JtYWxfZXhwKys7CisJICAgIExTSElGVCAoYl9mcmFjdGlvbik7CisJICB9CisJd2hpbGUgKGJfbm9ybWFsX2V4cCA+IGFfbm9ybWFsX2V4cCkKKwkgIHsKKwkgICAgYV9ub3JtYWxfZXhwKys7CisJICAgIExTSElGVCAoYV9mcmFjdGlvbik7CisJICB9CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCS8qIFNvbWV0aGluZ3MncyB1cC4uIGNob29zZSB0aGUgYmlnZ2VzdCAqLworCWlmIChhX25vcm1hbF9leHAgPiBiX25vcm1hbF9leHApCisJICB7CisJICAgIGJfbm9ybWFsX2V4cCA9IGFfbm9ybWFsX2V4cDsKKwkgICAgYl9mcmFjdGlvbiA9IDA7CisJICB9CisJZWxzZQorCSAgeworCSAgICBhX25vcm1hbF9leHAgPSBiX25vcm1hbF9leHA7CisJICAgIGFfZnJhY3Rpb24gPSAwOworCSAgfQorICAgICAgfQorICB9CisKKyAgaWYgKGEtPnNpZ24gIT0gYi0+c2lnbikKKyAgICB7CisgICAgICBpZiAoYS0+c2lnbikKKwl7CisJICB0ZnJhY3Rpb24gPSAtYV9mcmFjdGlvbiArIGJfZnJhY3Rpb247CisJfQorICAgICAgZWxzZQorCXsKKwkgIHRmcmFjdGlvbiA9IGFfZnJhY3Rpb24gLSBiX2ZyYWN0aW9uOworCX0KKyAgICAgIGlmICh0ZnJhY3Rpb24gPiAwKQorCXsKKwkgIHRtcC0+c2lnbiA9IDA7CisJICB0bXAtPm5vcm1hbF9leHAgPSBhX25vcm1hbF9leHA7CisJICB0bXAtPmZyYWN0aW9uLmxsID0gdGZyYWN0aW9uOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB0bXAtPnNpZ24gPSAxOworCSAgdG1wLT5ub3JtYWxfZXhwID0gYV9ub3JtYWxfZXhwOworCSAgdG1wLT5mcmFjdGlvbi5sbCA9IC10ZnJhY3Rpb247CisJfQorICAgICAgLyogYW5kIHJlbm9ybWFsaXplIGl0ICovCisKKyAgICAgIHdoaWxlICh0bXAtPmZyYWN0aW9uLmxsIDwgSU1QTElDSVRfMSAmJiB0bXAtPmZyYWN0aW9uLmxsKQorCXsKKwkgIHRtcC0+ZnJhY3Rpb24ubGwgPDw9IDE7CisJICB0bXAtPm5vcm1hbF9leHAtLTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdG1wLT5zaWduID0gYS0+c2lnbjsKKyAgICAgIHRtcC0+bm9ybWFsX2V4cCA9IGFfbm9ybWFsX2V4cDsKKyAgICAgIHRtcC0+ZnJhY3Rpb24ubGwgPSBhX2ZyYWN0aW9uICsgYl9mcmFjdGlvbjsKKyAgICB9CisgIHRtcC0+Y2xhc3MgPSBDTEFTU19OVU1CRVI7CisgIC8qIE5vdyB0aGUgZnJhY3Rpb24gaXMgYWRkZWQsIHdlIGhhdmUgdG8gc2hpZnQgZG93biB0byByZW5vcm1hbGl6ZSB0aGUKKyAgICAgbnVtYmVyICovCisKKyAgaWYgKHRtcC0+ZnJhY3Rpb24ubGwgPj0gSU1QTElDSVRfMikKKyAgICB7CisgICAgICBMU0hJRlQgKHRtcC0+ZnJhY3Rpb24ubGwpOworICAgICAgdG1wLT5ub3JtYWxfZXhwKys7CisgICAgfQorICByZXR1cm4gdG1wOworCit9CisKK0ZMT190eXBlCithZGQgKEZMT190eXBlIGFyZ19hLCBGTE9fdHlwZSBhcmdfYikKK3sKKyAgZnBfbnVtYmVyX3R5cGUgYTsKKyAgZnBfbnVtYmVyX3R5cGUgYjsKKyAgZnBfbnVtYmVyX3R5cGUgdG1wOworICBmcF9udW1iZXJfdHlwZSAqcmVzOworCisgIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYSwgJmEpOworICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2IsICZiKTsKKworICByZXMgPSBfZnBhZGRfcGFydHMgKCZhLCAmYiwgJnRtcCk7CisKKyAgcmV0dXJuIHBhY2tfZCAocmVzKTsKK30KKworRkxPX3R5cGUKK3N1YiAoRkxPX3R5cGUgYXJnX2EsIEZMT190eXBlIGFyZ19iKQoreworICBmcF9udW1iZXJfdHlwZSBhOworICBmcF9udW1iZXJfdHlwZSBiOworICBmcF9udW1iZXJfdHlwZSB0bXA7CisgIGZwX251bWJlcl90eXBlICpyZXM7CisKKyAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19hLCAmYSk7CisgIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYiwgJmIpOworCisgIGIuc2lnbiBePSAxOworCisgIHJlcyA9IF9mcGFkZF9wYXJ0cyAoJmEsICZiLCAmdG1wKTsKKworICByZXR1cm4gcGFja19kIChyZXMpOworfQorCitzdGF0aWMgZnBfbnVtYmVyX3R5cGUgKgorX2ZwbXVsX3BhcnRzICggZnBfbnVtYmVyX3R5cGUgKiAgYSwKKwkgICAgICAgZnBfbnVtYmVyX3R5cGUgKiAgYiwKKwkgICAgICAgZnBfbnVtYmVyX3R5cGUgKiB0bXApCit7CisgIGZyYWN0eXBlIGxvdyA9IDA7CisgIGZyYWN0eXBlIGhpZ2ggPSAwOworCisgIGlmIChpc25hbiAoYSkpCisgICAgeworICAgICAgYS0+c2lnbiA9IGEtPnNpZ24gIT0gYi0+c2lnbjsKKyAgICAgIHJldHVybiBhOworICAgIH0KKyAgaWYgKGlzbmFuIChiKSkKKyAgICB7CisgICAgICBiLT5zaWduID0gYS0+c2lnbiAhPSBiLT5zaWduOworICAgICAgcmV0dXJuIGI7CisgICAgfQorICBpZiAoaXNpbmYgKGEpKQorICAgIHsKKyAgICAgIGlmIChpc3plcm8gKGIpKQorCXJldHVybiBuYW4gKCk7CisgICAgICBhLT5zaWduID0gYS0+c2lnbiAhPSBiLT5zaWduOworICAgICAgcmV0dXJuIGE7CisgICAgfQorICBpZiAoaXNpbmYgKGIpKQorICAgIHsKKyAgICAgIGlmIChpc3plcm8gKGEpKQorCXsKKwkgIHJldHVybiBuYW4gKCk7CisJfQorICAgICAgYi0+c2lnbiA9IGEtPnNpZ24gIT0gYi0+c2lnbjsKKyAgICAgIHJldHVybiBiOworICAgIH0KKyAgaWYgKGlzemVybyAoYSkpCisgICAgeworICAgICAgYS0+c2lnbiA9IGEtPnNpZ24gIT0gYi0+c2lnbjsKKyAgICAgIHJldHVybiBhOworICAgIH0KKyAgaWYgKGlzemVybyAoYikpCisgICAgeworICAgICAgYi0+c2lnbiA9IGEtPnNpZ24gIT0gYi0+c2lnbjsKKyAgICAgIHJldHVybiBiOworICAgIH0KKworICAvKiBDYWxjdWxhdGUgdGhlIG1hbnRpc3NhIGJ5IG11bHRpcGx5aW5nIGJvdGggNjRiaXQgbnVtYmVycyB0byBnZXQgYQorICAgICAxMjggYml0IG51bWJlciAqLworICB7CisgICAgZnJhY3R5cGUgeCA9IGEtPmZyYWN0aW9uLmxsOworICAgIGZyYWN0eXBlIHlsb3cgPSBiLT5mcmFjdGlvbi5sbDsKKyAgICBmcmFjdHlwZSB5aGlnaCA9IDA7CisgICAgaW50IGJpdDsKKworI2lmIGRlZmluZWQoTk9fRElfTU9ERSkKKyAgICB7CisgICAgICAvKiA/Pz8gVGhpcyBkb2VzIG11bHRpcGxpZXMgb25lIGJpdCBhdCBhIHRpbWUuICBPcHRpbWl6ZS4gICovCisgICAgICBmb3IgKGJpdCA9IDA7IGJpdCA8IEZSQUNfTkJJVFM7IGJpdCsrKQorCXsKKwkgIGludCBjYXJyeTsKKworCSAgaWYgKHggJiAxKQorCSAgICB7CisJICAgICAgY2FycnkgPSAobG93ICs9IHlsb3cpIDwgeWxvdzsKKwkgICAgICBoaWdoICs9IHloaWdoICsgY2Fycnk7CisJICAgIH0KKwkgIHloaWdoIDw8PSAxOworCSAgaWYgKHlsb3cgJiBGUkFDSElHSCkKKwkgICAgeworCSAgICAgIHloaWdoIHw9IDE7CisJICAgIH0KKwkgIHlsb3cgPDw9IDE7CisJICB4ID4+PSAxOworCX0KKyAgICB9CisjZWxpZiBkZWZpbmVkKEZMT0FUKSAKKyAgICB7CisgICAgICAvKiBNdWx0aXBseWluZyB0d28gMzIgYml0IG51bWJlcnMgdG8gZ2V0IGEgNjQgYml0IG51bWJlciAgb24gCisgICAgICAgIGEgbWFjaGluZSB3aXRoIERJLCBzbyB3ZSdyZSBzYWZlICovCisKKyAgICAgIERJdHlwZSBhbnN3ZXIgPSAoREl0eXBlKShhLT5mcmFjdGlvbi5sbCkgKiAoREl0eXBlKShiLT5mcmFjdGlvbi5sbCk7CisgICAgICAKKyAgICAgIGhpZ2ggPSBhbnN3ZXIgPj4gMzI7CisgICAgICBsb3cgPSBhbnN3ZXI7CisgICAgfQorI2Vsc2UKKyAgICAvKiBEb2luZyBhIDY0KjY0IHRvIDEyOCAqLworICAgIHsKKyAgICAgIFVESXR5cGUgbmwgPSBhLT5mcmFjdGlvbi5sbCAmIDB4ZmZmZmZmZmY7CisgICAgICBVREl0eXBlIG5oID0gYS0+ZnJhY3Rpb24ubGwgPj4gMzI7CisgICAgICBVREl0eXBlIG1sID0gYi0+ZnJhY3Rpb24ubGwgJiAweGZmZmZmZmZmOworICAgICAgVURJdHlwZSBtaCA9IGItPmZyYWN0aW9uLmxsID4+MzI7CisgICAgICBVREl0eXBlIHBwX2xsID0gbWwgKiBubDsKKyAgICAgIFVESXR5cGUgcHBfaGwgPSBtaCAqIG5sOworICAgICAgVURJdHlwZSBwcF9saCA9IG1sICogbmg7CisgICAgICBVREl0eXBlIHBwX2hoID0gbWggKiBuaDsKKyAgICAgIFVESXR5cGUgcmVzMiA9IDA7CisgICAgICBVREl0eXBlIHJlczAgPSAwOworICAgICAgVURJdHlwZSBwc19oaF9fID0gcHBfaGwgKyBwcF9saDsKKyAgICAgIGlmIChwc19oaF9fIDwgcHBfaGwpCisJcmVzMiArPSAweDEwMDAwMDAwMExMOworICAgICAgcHBfaGwgPSAocHNfaGhfXyA8PCAzMikgJiAweGZmZmZmZmZmMDAwMDAwMDBMTDsKKyAgICAgIHJlczAgPSBwcF9sbCArIHBwX2hsOworICAgICAgaWYgKHJlczAgPCBwcF9sbCkKKwlyZXMyKys7CisgICAgICByZXMyICs9ICgocHNfaGhfXyA+PiAzMikgJiAweGZmZmZmZmZmTCkgKyBwcF9oaDsKKyAgICAgIGhpZ2ggPSByZXMyOworICAgICAgbG93ID0gcmVzMDsKKyAgICB9CisjZW5kaWYKKyAgfQorCisgIHRtcC0+bm9ybWFsX2V4cCA9IGEtPm5vcm1hbF9leHAgKyBiLT5ub3JtYWxfZXhwOworICB0bXAtPnNpZ24gPSBhLT5zaWduICE9IGItPnNpZ247CisjaWZkZWYgRkxPQVQKKyAgdG1wLT5ub3JtYWxfZXhwICs9IDI7CQkvKiA/Pz8/Pz8/Pz8/Pz8/Pz8gKi8KKyNlbHNlCisgIHRtcC0+bm9ybWFsX2V4cCArPSA0OwkJLyogPz8/Pz8/Pz8/Pz8/Pz8/ICovCisjZW5kaWYKKyAgd2hpbGUgKGhpZ2ggPj0gSU1QTElDSVRfMikKKyAgICB7CisgICAgICB0bXAtPm5vcm1hbF9leHArKzsKKyAgICAgIGlmIChoaWdoICYgMSkKKwl7CisJICBsb3cgPj49IDE7CisJICBsb3cgfD0gRlJBQ0hJR0g7CisJfQorICAgICAgaGlnaCA+Pj0gMTsKKyAgICB9CisgIHdoaWxlIChoaWdoIDwgSU1QTElDSVRfMSkKKyAgICB7CisgICAgICB0bXAtPm5vcm1hbF9leHAtLTsKKworICAgICAgaGlnaCA8PD0gMTsKKyAgICAgIGlmIChsb3cgJiBGUkFDSElHSCkKKwloaWdoIHw9IDE7CisgICAgICBsb3cgPDw9IDE7CisgICAgfQorICAvKiByb3VuZGluZyBpcyB0cmlja3kuIGlmIHdlIG9ubHkgcm91bmQgaWYgaXQgd29uJ3QgbWFrZSB1cyByb3VuZCBsYXRlci4gKi8KKyNpZiAwCisgIGlmIChsb3cgJiBGUkFDSElHSDIpCisgICAgeworICAgICAgaWYgKCgoaGlnaCAmIEdBUkRNQVNLKSAhPSBHQVJETVNCKQorCSAgJiYgKCgoaGlnaCArIDEpICYgR0FSRE1BU0spID09IEdBUkRNU0IpKQorCXsKKwkgIC8qIGRvbid0IHJvdW5kLCBpdCBnZXRzIGRvbmUgYWdhaW4gbGF0ZXIuICovCisJfQorICAgICAgZWxzZQorCXsKKwkgIGhpZ2grKzsKKwl9CisgICAgfQorI2VuZGlmCisgIGlmICgoaGlnaCAmIEdBUkRNQVNLKSA9PSBHQVJETVNCKQorICAgIHsKKyAgICAgIGlmIChoaWdoICYgKDEgPDwgTkdBUkRTKSkKKwl7CisJICAvKiBoYWxmIHdheSwgc28gcm91bmQgdG8gZXZlbiAqLworCSAgaGlnaCArPSBHQVJEUk9VTkQgKyAxOworCX0KKyAgICAgIGVsc2UgaWYgKGxvdykKKwl7CisJICAvKiBidXQgd2UgcmVhbGx5IHdlcmVuJ3QgaGFsZiB3YXkgKi8KKwkgIGhpZ2ggKz0gR0FSRFJPVU5EICsgMTsKKwl9CisgICAgfQorICB0bXAtPmZyYWN0aW9uLmxsID0gaGlnaDsKKyAgdG1wLT5jbGFzcyA9IENMQVNTX05VTUJFUjsKKyAgcmV0dXJuIHRtcDsKK30KKworRkxPX3R5cGUKK211bHRpcGx5IChGTE9fdHlwZSBhcmdfYSwgRkxPX3R5cGUgYXJnX2IpCit7CisgIGZwX251bWJlcl90eXBlIGE7CisgIGZwX251bWJlcl90eXBlIGI7CisgIGZwX251bWJlcl90eXBlIHRtcDsKKyAgZnBfbnVtYmVyX3R5cGUgKnJlczsKKworICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2EsICZhKTsKKyAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19iLCAmYik7CisKKyAgcmVzID0gX2ZwbXVsX3BhcnRzICgmYSwgJmIsICZ0bXApOworCisgIHJldHVybiBwYWNrX2QgKHJlcyk7Cit9CisKK3N0YXRpYyBmcF9udW1iZXJfdHlwZSAqCitfZnBkaXZfcGFydHMgKGZwX251bWJlcl90eXBlICogYSwKKwkgICAgICBmcF9udW1iZXJfdHlwZSAqIGIsCisJICAgICAgZnBfbnVtYmVyX3R5cGUgKiB0bXApCit7CisgIGZyYWN0eXBlIGxvdyA9IDA7CisgIGZyYWN0eXBlIGhpZ2ggPSAwOworICBmcmFjdHlwZSByMCwgcjEsIHkwLCB5MSwgYml0OworICBmcmFjdHlwZSBxOworICBmcmFjdHlwZSBudW1lcmF0b3I7CisgIGZyYWN0eXBlIGRlbm9taW5hdG9yOworICBmcmFjdHlwZSBxdW90aWVudDsKKyAgZnJhY3R5cGUgcmVtYWluZGVyOworCisgIGlmIChpc25hbiAoYSkpCisgICAgeworICAgICAgcmV0dXJuIGE7CisgICAgfQorICBpZiAoaXNuYW4gKGIpKQorICAgIHsKKyAgICAgIHJldHVybiBiOworICAgIH0KKyAgaWYgKGlzaW5mIChhKSB8fCBpc3plcm8gKGEpKQorICAgIHsKKyAgICAgIGlmIChhLT5jbGFzcyA9PSBiLT5jbGFzcykKKwlyZXR1cm4gbmFuICgpOworICAgICAgcmV0dXJuIGE7CisgICAgfQorICBhLT5zaWduID0gYS0+c2lnbiBeIGItPnNpZ247CisKKyAgaWYgKGlzaW5mIChiKSkKKyAgICB7CisgICAgICBhLT5mcmFjdGlvbi5sbCA9IDA7CisgICAgICBhLT5ub3JtYWxfZXhwID0gMDsKKyAgICAgIHJldHVybiBhOworICAgIH0KKyAgaWYgKGlzemVybyAoYikpCisgICAgeworICAgICAgYS0+Y2xhc3MgPSBDTEFTU19JTkZJTklUWTsKKyAgICAgIHJldHVybiBiOworICAgIH0KKworICAvKiBDYWxjdWxhdGUgdGhlIG1hbnRpc3NhIGJ5IG11bHRpcGx5aW5nIGJvdGggNjRiaXQgbnVtYmVycyB0byBnZXQgYQorICAgICAxMjggYml0IG51bWJlciAqLworICB7CisgICAgaW50IGNhcnJ5OworICAgIGludGZyYWMgZDAsIGQxOwkJLyogd2VyZW4ndCB1bnNpZ25lZCBiZWZvcmUgPz8/ICovCisKKyAgICAvKiBxdW90aWVudCA9CisgICAgICAgKCBudW1lcmF0b3IgLyBkZW5vbWluYXRvcikgKiAyXihudW1lcmF0b3IgZXhwb25lbnQgLSAgZGVub21pbmF0b3IgZXhwb25lbnQpCisgICAgICovCisKKyAgICBhLT5ub3JtYWxfZXhwID0gYS0+bm9ybWFsX2V4cCAtIGItPm5vcm1hbF9leHA7CisgICAgbnVtZXJhdG9yID0gYS0+ZnJhY3Rpb24ubGw7CisgICAgZGVub21pbmF0b3IgPSBiLT5mcmFjdGlvbi5sbDsKKworICAgIGlmIChudW1lcmF0b3IgPCBkZW5vbWluYXRvcikKKyAgICAgIHsKKwkvKiBGcmFjdGlvbiB3aWxsIGJlIGxlc3MgdGhhbiAxLjAgKi8KKwludW1lcmF0b3IgKj0gMjsKKwlhLT5ub3JtYWxfZXhwLS07CisgICAgICB9CisgICAgYml0ID0gSU1QTElDSVRfMTsKKyAgICBxdW90aWVudCA9IDA7CisgICAgLyogPz8/IERvZXMgZGl2aWRlIG9uZSBiaXQgYXQgYSB0aW1lLiAgT3B0aW1pemUuICAqLworICAgIHdoaWxlIChiaXQpCisgICAgICB7CisJaWYgKG51bWVyYXRvciA+PSBkZW5vbWluYXRvcikKKwkgIHsKKwkgICAgcXVvdGllbnQgfD0gYml0OworCSAgICBudW1lcmF0b3IgLT0gZGVub21pbmF0b3I7CisJICB9CisJYml0ID4+PSAxOworCW51bWVyYXRvciAqPSAyOworICAgICAgfQorCisgICAgaWYgKChxdW90aWVudCAmIEdBUkRNQVNLKSA9PSBHQVJETVNCKQorICAgICAgeworCWlmIChxdW90aWVudCAmICgxIDw8IE5HQVJEUykpCisJICB7CisJICAgIC8qIGhhbGYgd2F5LCBzbyByb3VuZCB0byBldmVuICovCisJICAgIHF1b3RpZW50ICs9IEdBUkRST1VORCArIDE7CisJICB9CisJZWxzZSBpZiAobnVtZXJhdG9yKQorCSAgeworCSAgICAvKiBidXQgd2UgcmVhbGx5IHdlcmVuJ3QgaGFsZiB3YXksIG1vcmUgYml0cyBleGlzdCAqLworCSAgICBxdW90aWVudCArPSBHQVJEUk9VTkQgKyAxOworCSAgfQorICAgICAgfQorCisgICAgYS0+ZnJhY3Rpb24ubGwgPSBxdW90aWVudDsKKyAgICByZXR1cm4gKGEpOworICB9Cit9CisKK0ZMT190eXBlCitkaXZpZGUgKEZMT190eXBlIGFyZ19hLCBGTE9fdHlwZSBhcmdfYikKK3sKKyAgZnBfbnVtYmVyX3R5cGUgYTsKKyAgZnBfbnVtYmVyX3R5cGUgYjsKKyAgZnBfbnVtYmVyX3R5cGUgdG1wOworICBmcF9udW1iZXJfdHlwZSAqcmVzOworCisgIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYSwgJmEpOworICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2IsICZiKTsKKworICByZXMgPSBfZnBkaXZfcGFydHMgKCZhLCAmYiwgJnRtcCk7CisKKyAgcmV0dXJuIHBhY2tfZCAocmVzKTsKK30KKworLyogYWNjb3JkaW5nIHRvIHRoZSBkZW1vLCBmcGNtcCByZXR1cm5zIGEgY29tcGFyaXNvbiB3aXRoIDAuLi4gdGh1cworICAgYTxiIC0+IC0xCisgICBhPT1iIC0+IDAKKyAgIGE+YiAtPiArMQorICovCisKK3N0YXRpYyBpbnQKK19mcGNtcF9wYXJ0cyAoZnBfbnVtYmVyX3R5cGUgKiBhLCBmcF9udW1iZXJfdHlwZSAqIGIpCit7CisjaWYgMAorICAvKiBlaXRoZXIgbmFuIC0+IHVub3JkZXJlZC4gTXVzdCBiZSBjaGVja2VkIG91dHNpZGUgb2YgdGhpcyByb3V0aW5lLiAqLworICBpZiAoaXNuYW4gKGEpICYmIGlzbmFuIChiKSkKKyAgICB7CisgICAgICByZXR1cm4gMTsJCQkvKiBzdGlsbCB1bm9yZGVyZWQhICovCisgICAgfQorI2VuZGlmCisKKyAgaWYgKGlzbmFuIChhKSB8fCBpc25hbiAoYikpCisgICAgeworICAgICAgcmV0dXJuIDE7CQkJLyogaG93IHRvIGluZGljYXRlIHVub3JkZXJlZCBjb21wYXJlPyAqLworICAgIH0KKyAgaWYgKGlzaW5mIChhKSAmJiBpc2luZiAoYikpCisgICAgeworICAgICAgLyogK2luZiA+IC1pbmYsIGJ1dCAraW5mICE9ICtpbmYgKi8KKyAgICAgIC8qIGIgICAgXGF8ICtpbmYoMCl8IC1pbmYoMSkKKyAgICAgICBfX19fX19cKy0tLS0tLS0tKy0tLS0tLS0tCisgICAgICAgK2luZigwKXwgYT09YigwKXwgYTxiKC0xKQorICAgICAgIC0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAgICAtaW5mKDEpfCBhPmIoMSkgfCBhPT1iKDApCisgICAgICAgLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLQorICAgICAgIFNvIHNpbmNlIHVub3JkZXJlZCBtdXN0IGJlIG5vbiB6ZXJvLCBqdXN0IGxpbmUgdXAgdGhlIGNvbHVtbnMuLi4KKyAgICAgICAqLworICAgICAgcmV0dXJuIGItPnNpZ24gLSBhLT5zaWduOworICAgIH0KKyAgLyogYnV0IG5vdCBib3RoLi4uICovCisgIGlmIChpc2luZiAoYSkpCisgICAgeworICAgICAgcmV0dXJuIGEtPnNpZ24gPyAtMSA6IDE7CisgICAgfQorICBpZiAoaXNpbmYgKGIpKQorICAgIHsKKyAgICAgIHJldHVybiBiLT5zaWduID8gMSA6IC0xOworICAgIH0KKyAgaWYgKGlzemVybyAoYSkgJiYgaXN6ZXJvIChiKSkKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGlmIChpc3plcm8gKGEpKQorICAgIHsKKyAgICAgIHJldHVybiBiLT5zaWduID8gMSA6IC0xOworICAgIH0KKyAgaWYgKGlzemVybyAoYikpCisgICAgeworICAgICAgcmV0dXJuIGEtPnNpZ24gPyAtMSA6IDE7CisgICAgfQorICAvKiBub3cgYm90aCBhcmUgIm5vcm1hbCIuICovCisgIGlmIChhLT5zaWduICE9IGItPnNpZ24pCisgICAgeworICAgICAgLyogb3Bwb3NpdGUgc2lnbnMgKi8KKyAgICAgIHJldHVybiBhLT5zaWduID8gLTEgOiAxOworICAgIH0KKyAgLyogc2FtZSBzaWduOyBleHBvbmVudHM/ICovCisgIGlmIChhLT5ub3JtYWxfZXhwID4gYi0+bm9ybWFsX2V4cCkKKyAgICB7CisgICAgICByZXR1cm4gYS0+c2lnbiA/IC0xIDogMTsKKyAgICB9CisgIGlmIChhLT5ub3JtYWxfZXhwIDwgYi0+bm9ybWFsX2V4cCkKKyAgICB7CisgICAgICByZXR1cm4gYS0+c2lnbiA/IDEgOiAtMTsKKyAgICB9CisgIC8qIHNhbWUgZXhwb25lbnRzOyBjaGVjayBzaXplLiAqLworICBpZiAoYS0+ZnJhY3Rpb24ubGwgPiBiLT5mcmFjdGlvbi5sbCkKKyAgICB7CisgICAgICByZXR1cm4gYS0+c2lnbiA/IC0xIDogMTsKKyAgICB9CisgIGlmIChhLT5mcmFjdGlvbi5sbCA8IGItPmZyYWN0aW9uLmxsKQorICAgIHsKKyAgICAgIHJldHVybiBhLT5zaWduID8gMSA6IC0xOworICAgIH0KKyAgLyogYWZ0ZXIgYWxsIHRoYXQsIHRoZXkncmUgZXF1YWwuICovCisgIHJldHVybiAwOworfQorCitDTVB0eXBlCitjb21wYXJlIChGTE9fdHlwZSBhcmdfYSwgRkxPX3R5cGUgYXJnX2IpCit7CisgIGZwX251bWJlcl90eXBlIGE7CisgIGZwX251bWJlcl90eXBlIGI7CisKKyAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19hLCAmYSk7CisgIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYiwgJmIpOworCisgIHJldHVybiBfZnBjbXBfcGFydHMgKCZhLCAmYik7Cit9CisKKyNpZm5kZWYgVVNfU09GVFdBUkVfR09GQVNUCisKKy8qIFRoZXNlIHNob3VsZCBiZSBvcHRpbWl6ZWQgZm9yIHRoZWlyIHNwZWNpZmljIHRhc2tzIHNvbWVkYXkuICAqLworCitDTVB0eXBlCitfZXFfZjIgKEZMT190eXBlIGFyZ19hLCBGTE9fdHlwZSBhcmdfYikKK3sKKyAgZnBfbnVtYmVyX3R5cGUgYTsKKyAgZnBfbnVtYmVyX3R5cGUgYjsKKworICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2EsICZhKTsKKyAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19iLCAmYik7CisKKyAgaWYgKGlzbmFuICgmYSkgfHwgaXNuYW4gKCZiKSkKKyAgICByZXR1cm4gMTsJCQkvKiBmYWxzZSwgdHJ1dGggPT0gMCAqLworCisgIHJldHVybiBfZnBjbXBfcGFydHMgKCZhLCAmYikgOworfQorCitDTVB0eXBlCitfbmVfZjIgKEZMT190eXBlIGFyZ19hLCBGTE9fdHlwZSBhcmdfYikKK3sKKyAgZnBfbnVtYmVyX3R5cGUgYTsKKyAgZnBfbnVtYmVyX3R5cGUgYjsKKworICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2EsICZhKTsKKyAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19iLCAmYik7CisKKyAgaWYgKGlzbmFuICgmYSkgfHwgaXNuYW4gKCZiKSkKKyAgICByZXR1cm4gMTsJCQkvKiB0cnVlLCB0cnV0aCAhPSAwICovCisKKyAgcmV0dXJuICBfZnBjbXBfcGFydHMgKCZhLCAmYikgOworfQorCitDTVB0eXBlCitfZ3RfZjIgKEZMT190eXBlIGFyZ19hLCBGTE9fdHlwZSBhcmdfYikKK3sKKyAgZnBfbnVtYmVyX3R5cGUgYTsKKyAgZnBfbnVtYmVyX3R5cGUgYjsKKworICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2EsICZhKTsKKyAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19iLCAmYik7CisKKyAgaWYgKGlzbmFuICgmYSkgfHwgaXNuYW4gKCZiKSkKKyAgICByZXR1cm4gLTE7CQkJLyogZmFsc2UsIHRydXRoID4gMCAqLworCisgIHJldHVybiBfZnBjbXBfcGFydHMgKCZhLCAmYik7Cit9CisKK0NNUHR5cGUKK19nZV9mMiAoRkxPX3R5cGUgYXJnX2EsIEZMT190eXBlIGFyZ19iKQoreworICBmcF9udW1iZXJfdHlwZSBhOworICBmcF9udW1iZXJfdHlwZSBiOworCisgIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYSwgJmEpOworICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2IsICZiKTsKKworICBpZiAoaXNuYW4gKCZhKSB8fCBpc25hbiAoJmIpKQorICAgIHJldHVybiAtMTsJCQkvKiBmYWxzZSwgdHJ1dGggPj0gMCAqLworICByZXR1cm4gX2ZwY21wX3BhcnRzICgmYSwgJmIpIDsKK30KKworQ01QdHlwZQorX2x0X2YyIChGTE9fdHlwZSBhcmdfYSwgRkxPX3R5cGUgYXJnX2IpCit7CisgIGZwX251bWJlcl90eXBlIGE7CisgIGZwX251bWJlcl90eXBlIGI7CisKKyAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19hLCAmYSk7CisgIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYiwgJmIpOworCisgIGlmIChpc25hbiAoJmEpIHx8IGlzbmFuICgmYikpCisgICAgcmV0dXJuIDE7CQkJLyogZmFsc2UsIHRydXRoIDwgMCAqLworCisgIHJldHVybiBfZnBjbXBfcGFydHMgKCZhLCAmYik7Cit9CisKK0NNUHR5cGUKK19sZV9mMiAoRkxPX3R5cGUgYXJnX2EsIEZMT190eXBlIGFyZ19iKQoreworICBmcF9udW1iZXJfdHlwZSBhOworICBmcF9udW1iZXJfdHlwZSBiOworCisgIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYSwgJmEpOworICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2IsICZiKTsKKworICBpZiAoaXNuYW4gKCZhKSB8fCBpc25hbiAoJmIpKQorICAgIHJldHVybiAxOwkJCS8qIGZhbHNlLCB0cnV0aCA8PSAwICovCisKKyAgcmV0dXJuIF9mcGNtcF9wYXJ0cyAoJmEsICZiKSA7Cit9CisKKyNlbmRpZiAvKiAhIFVTX1NPRlRXQVJFX0dPRkFTVCAqLworCitGTE9fdHlwZQorc2lfdG9fZmxvYXQgKFNJdHlwZSBhcmdfYSkKK3sKKyAgZnBfbnVtYmVyX3R5cGUgaW47CisKKyAgaW4uY2xhc3MgPSBDTEFTU19OVU1CRVI7CisgIGluLnNpZ24gPSBhcmdfYSA8IDA7CisgIGlmICghYXJnX2EpCisgICAgeworICAgICAgaW4uY2xhc3MgPSBDTEFTU19aRVJPOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGluLm5vcm1hbF9leHAgPSBGUkFDQklUUyArIE5HQVJEUzsKKyAgICAgIGlmIChpbi5zaWduKSAKKwl7CisJICAvKiBTcGVjaWFsIGNhc2UgZm9yIG1pbmludCwgc2luY2UgdGhlcmUgaXMgbm8gK3ZlIGludGVnZXIKKwkgICAgIHJlcHJlc2VudGF0aW9uIGZvciBpdCAqLworCSAgaWYgKGFyZ19hID09IDB4ODAwMDAwMDApCisJICAgIHsKKwkgICAgICByZXR1cm4gLTIxNDc0ODM2NDguMDsKKwkgICAgfQorCSAgaW4uZnJhY3Rpb24ubGwgPSAoLWFyZ19hKTsKKwl9CisgICAgICBlbHNlCisJaW4uZnJhY3Rpb24ubGwgPSBhcmdfYTsKKworICAgICAgd2hpbGUgKGluLmZyYWN0aW9uLmxsIDwgKDFMTCA8PCAoRlJBQ0JJVFMgKyBOR0FSRFMpKSkKKwl7CisJICBpbi5mcmFjdGlvbi5sbCA8PD0gMTsKKwkgIGluLm5vcm1hbF9leHAgLT0gMTsKKwl9CisgICAgfQorICByZXR1cm4gcGFja19kICgmaW4pOworfQorCitTSXR5cGUKK2Zsb2F0X3RvX3NpIChGTE9fdHlwZSBhcmdfYSkKK3sKKyAgZnBfbnVtYmVyX3R5cGUgYTsKKyAgU0l0eXBlIHRtcDsKKworICB1bnBhY2tfZCAoKEZMT191bmlvbl90eXBlICopICYgYXJnX2EsICZhKTsKKyAgaWYgKGlzemVybyAoJmEpKQorICAgIHJldHVybiAwOworICBpZiAoaXNuYW4gKCZhKSkKKyAgICByZXR1cm4gMDsKKyAgLyogZ2V0IHJlYXNvbmFibGUgTUFYX1NJX0lOVC4uLiAqLworICBpZiAoaXNpbmYgKCZhKSkKKyAgICByZXR1cm4gYS5zaWduID8gTUFYX1NJX0lOVCA6ICgtTUFYX1NJX0lOVCktMTsKKyAgLyogaXQgaXMgYSBudW1iZXIsIGJ1dCBhIHNtYWxsIG9uZSAqLworICBpZiAoYS5ub3JtYWxfZXhwIDwgMCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGEubm9ybWFsX2V4cCA+IDMwKQorICAgIHJldHVybiBhLnNpZ24gPyAoLU1BWF9TSV9JTlQpLTEgOiBNQVhfU0lfSU5UOworICB0bXAgPSBhLmZyYWN0aW9uLmxsID4+ICgoRlJBQ0JJVFMgKyBOR0FSRFMpIC0gYS5ub3JtYWxfZXhwKTsKKyAgcmV0dXJuIGEuc2lnbiA/ICgtdG1wKSA6ICh0bXApOworfQorCisjaWZkZWYgVVNfU09GVFdBUkVfR09GQVNUCisvKiBXaGlsZSBsaWJnY2MyLmMgZGVmaW5lcyBpdHMgb3duIF9fZml4dW5zc2ZzaSBhbmQgX19maXh1bnNkZnNpIHJvdXRpbmVzLAorICAgd2UgYWxzbyBkZWZpbmUgdGhlbSBmb3IgR09GQVNUIGJlY2F1c2UgdGhlIG9uZXMgaW4gbGliZ2NjMi5jIGhhdmUgdGhlCisgICB3cm9uZyBuYW1lcyBhbmQgSSdkIHJhdGhlciBkZWZpbmUgdGhlc2UgaGVyZSBhbmQga2VlcCBHT0ZBU1QgQ1lHLUxPQydzCisgICBvdXQgb2YgbGliZ2NjMi5jLiAgV2UgY2FuJ3QgZGVmaW5lIHRoZXNlIGhlcmUgaWYgbm90IEdPRkFTVCBiZWNhdXNlIHRoZW4KKyAgIHRoZXJlJ2QgYmUgZHVwbGljYXRlIGNvcGllcy4gICovCisKK1VTSXR5cGUKK2Zsb2F0X3RvX3VzaSAoRkxPX3R5cGUgYXJnX2EpCit7CisgIGZwX251bWJlcl90eXBlIGE7CisKKyAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19hLCAmYSk7CisgIGlmIChpc3plcm8gKCZhKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGlzbmFuICgmYSkpCisgICAgcmV0dXJuIDA7CisgIC8qIGdldCByZWFzb25hYmxlIE1BWF9VU0lfSU5ULi4uICovCisgIGlmIChpc2luZiAoJmEpKQorICAgIHJldHVybiBhLnNpZ24gPyBNQVhfVVNJX0lOVCA6IDA7CisgIC8qIGl0IGlzIGEgbmVnYXRpdmUgbnVtYmVyICovCisgIGlmIChhLnNpZ24pCisgICAgcmV0dXJuIDA7CisgIC8qIGl0IGlzIGEgbnVtYmVyLCBidXQgYSBzbWFsbCBvbmUgKi8KKyAgaWYgKGEubm9ybWFsX2V4cCA8IDApCisgICAgcmV0dXJuIDA7CisgIGlmIChhLm5vcm1hbF9leHAgPiAzMSkKKyAgICByZXR1cm4gTUFYX1VTSV9JTlQ7CisgIGVsc2UgaWYgKGEubm9ybWFsX2V4cCA+IChGUkFDQklUUyArIE5HQVJEUykpCisgICAgcmV0dXJuIGEuZnJhY3Rpb24ubGwgPDwgKChGUkFDQklUUyArIE5HQVJEUykgLSBhLm5vcm1hbF9leHApOworICBlbHNlCisgICAgcmV0dXJuIGEuZnJhY3Rpb24ubGwgPj4gKChGUkFDQklUUyArIE5HQVJEUykgLSBhLm5vcm1hbF9leHApOworfQorI2VuZGlmCisKK0ZMT190eXBlCituZWdhdGUgKEZMT190eXBlIGFyZ19hKQoreworICBmcF9udW1iZXJfdHlwZSBhOworCisgIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYSwgJmEpOworICBmbGlwX3NpZ24gKCZhKTsKKyAgcmV0dXJuIHBhY2tfZCAoJmEpOworfQorCisjaWZkZWYgRkxPQVQKKworU0Z0eXBlCitfX21ha2VfZnAoZnBfY2xhc3NfdHlwZSBjbGFzcywKKwkgICAgIHVuc2lnbmVkIGludCBzaWduLAorCSAgICAgaW50IGV4cCwgCisJICAgICBVU0l0eXBlIGZyYWMpCit7CisgIGZwX251bWJlcl90eXBlIGluOworCisgIGluLmNsYXNzID0gY2xhc3M7CisgIGluLnNpZ24gPSBzaWduOworICBpbi5ub3JtYWxfZXhwID0gZXhwOworICBpbi5mcmFjdGlvbi5sbCA9IGZyYWM7CisgIHJldHVybiBwYWNrX2QgKCZpbik7Cit9CisKKyNpZm5kZWYgRkxPQVRfT05MWQorCisvKiBUaGlzIGVuYWJsZXMgb25lIHRvIGJ1aWxkIGFuIGZwIGxpYnJhcnkgdGhhdCBzdXBwb3J0cyBmbG9hdCBidXQgbm90IGRvdWJsZS4KKyAgIE90aGVyd2lzZSwgd2Ugd291bGQgZ2V0IGFuIHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gX19tYWtlX2RwLgorICAgVGhpcyBpcyBuZWVkZWQgZm9yIHNvbWUgOC1iaXQgcG9ydHMgdGhhdCBjYW4ndCBoYW5kbGUgd2VsbCB2YWx1ZXMgdGhhdAorICAgYXJlIDgtYnl0ZXMgaW4gc2l6ZSwgc28gd2UganVzdCBkb24ndCBzdXBwb3J0IGRvdWJsZSBmb3IgdGhlbSBhdCBhbGwuICAqLworCitleHRlcm4gREZ0eXBlIF9fbWFrZV9kcCAoZnBfY2xhc3NfdHlwZSwgdW5zaWduZWQgaW50LCBpbnQsIFVESXR5cGUgZnJhYyk7CisKK0RGdHlwZQorc2ZfdG9fZGYgKFNGdHlwZSBhcmdfYSkKK3sKKyAgZnBfbnVtYmVyX3R5cGUgaW47CisKKyAgdW5wYWNrX2QgKChGTE9fdW5pb25fdHlwZSAqKSAmIGFyZ19hLCAmaW4pOworICByZXR1cm4gX19tYWtlX2RwIChpbi5jbGFzcywgaW4uc2lnbiwgaW4ubm9ybWFsX2V4cCwKKwkJICAgICgoVURJdHlwZSkgaW4uZnJhY3Rpb24ubGwpIDw8IEZfRF9CSVRPRkYpOworfQorCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEZMT0FUCisKK2V4dGVybiBTRnR5cGUgX19tYWtlX2ZwIChmcF9jbGFzc190eXBlLCB1bnNpZ25lZCBpbnQsIGludCwgVVNJdHlwZSk7CisKK0RGdHlwZQorX19tYWtlX2RwIChmcF9jbGFzc190eXBlIGNsYXNzLCB1bnNpZ25lZCBpbnQgc2lnbiwgaW50IGV4cCwgVURJdHlwZSBmcmFjKQoreworICBmcF9udW1iZXJfdHlwZSBpbjsKKworICBpbi5jbGFzcyA9IGNsYXNzOworICBpbi5zaWduID0gc2lnbjsKKyAgaW4ubm9ybWFsX2V4cCA9IGV4cDsKKyAgaW4uZnJhY3Rpb24ubGwgPSBmcmFjOworICByZXR1cm4gcGFja19kICgmaW4pOworfQorCitTRnR5cGUKK2RmX3RvX3NmIChERnR5cGUgYXJnX2EpCit7CisgIGZwX251bWJlcl90eXBlIGluOworCisgIHVucGFja19kICgoRkxPX3VuaW9uX3R5cGUgKikgJiBhcmdfYSwgJmluKTsKKyAgcmV0dXJuIF9fbWFrZV9mcCAoaW4uY2xhc3MsIGluLnNpZ24sIGluLm5vcm1hbF9leHAsCisJCSAgICBpbi5mcmFjdGlvbi5sbCA+PiBGX0RfQklUT0ZGKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vcHBjL2VtdWxfYnVnYXBpLmMgYi9zaW0vcHBjL2VtdWxfYnVnYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcwMjhiZgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZW11bF9idWdhcGkuYwpAQCAtMCwwICsxLDU4MSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyAgICAqLworCisKKyNpZm5kZWYgX0VNVUxfQlVHQVBJX0NfCisjZGVmaW5lIF9FTVVMX0JVR0FQSV9DXworCisvKiBOb3RlOiB0aGlzIG1vZHVsZSBpcyBjYWxsZWQgdmlhIGEgdGFibGUuICBUaGVyZSBpcyBubyBiZW5lZml0IGluCisgICBtYWtpbmcgaXQgaW5saW5lICovCisKKyNpbmNsdWRlICJlbXVsX2dlbmVyaWMuaCIKKyNpbmNsdWRlICJlbXVsX2J1Z2FwaS5oIgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorCisKKy8qIEVNVUxBVElPTgorCisgICBCVUcgLSBNb3Rvcm9sYSdzIGVtYmVkZWQgZmlybXdhcmUgQlVHIGludGVyZmFjZQorCisgICBERVNDUklQVElPTgorCisgICAKKworICAgKi8KKworCisvKiBmcm9tIFBvd2VyUENCdWcgRGVidWdnaW5nIFBhY2thZ2UgVXNlcidzIE1hbnVhbCwgcGFydCAyIG9mIDIgYW5kIGFsc28gYnVnLlMgLSBEYWxlIFJhaG4gKi8KKyNkZWZpbmUgX0lOQ0hSCQkweDAwMAkJLyogSW5wdXQgY2hhcmFjdGVyICovCisjZGVmaW5lIF9JTlNUQVQJCTB4MDAxCQkvKiBJbnB1dCBzZXJpYWwgcG9ydCBzdGF0dXMgKi8KKyNkZWZpbmUgX0lOTE4JCTB4MDAyCQkvKiBJbnB1dCBsaW5lIChwb2ludGVyIC8gcG9pbnRlciBmb3JtYXQpICovCisjZGVmaW5lIF9SRUFEU1RSCTB4MDAzCQkvKiBJbnB1dCBzdHJpbmcgKHBvaW50ZXIgLyBjb3VudCBmb3JtYXQpICovCisjZGVmaW5lIF9SRUFETE4JCTB4MDA0CQkvKiBJbnB1dCBsaW5lIChwb2ludGVyIC8gY291bnQgZm9ybWF0KSAqLworI2RlZmluZSBfQ0hLQlJLCQkweDAwNQkJLyogQ2hlY2sgZm9yIGJyZWFrICovCisjZGVmaW5lIF9EU0tSRAkJMHgwMTAJCS8qIERpc2sgcmVhZCAqLworI2RlZmluZSBfRFNLV1IJCTB4MDExCQkvKiBEaXNrIHdyaXRlICovCisjZGVmaW5lIF9EU0tDRklHCTB4MDEyCQkvKiBEaXNrIGNvbmZpZ3VyZSAqLworI2RlZmluZSBfRFNLRk1UCQkweDAxNAkJLyogRGlzayBmb3JtYXQgKi8KKyNkZWZpbmUgX0RTS0NUUkwJMHgwMTUJCS8qIERpc2sgY29udHJvbCAqLworI2RlZmluZSBfTkVUUkQJCTB4MDE4CQkvKiBSZWFkIGZyb20gaG9zdCAqLworI2RlZmluZSBfTkVUV1IJCTB4MDE5CQkvKiBXcml0ZSB0byBob3N0ICovCisjZGVmaW5lIF9ORVRDRklHCTB4MDFhCQkvKiBDb25maWd1cmUgbmV0d29yayBwYXJhbWV0ZXJzICovCisjZGVmaW5lIF9ORVRPUE4JCTB4MDFiCQkvKiBPcGVuIGZpbGUgZm9yIHJlYWRpbmcgKi8KKyNkZWZpbmUgX05FVEZSRAkJMHgwMWMJCS8qIFJldHJlaXZlIHNwZWNpZmllZCBmaWxlIGJsb2NrcyAqLworI2RlZmluZSBfTkVUQ1RSTAkweDAxZAkJLyogSW1wbGVtZW50IHNwZWNpYWwgY29udHJvbCBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgX09VVENIUgkJMHgwMjAJCS8qIE91dHB1dCBjaGFyYWN0ZXIgKHBvaW50ZXIgLyBwb2ludGVyIGZvcm1hdCkgKi8KKyNkZWZpbmUgX09VVFNUUgkJMHgwMjEJCS8qIE91dHB1dCBzdHJpbmcgKHBvaW50ZXIgLyBwb2ludGVyIGZvcm1hdCkgKi8KKyNkZWZpbmUgX09VVExOCQkweDAyMgkJLyogT3V0cHV0IGxpbmUgKHBvaW50ZXIgLyBwb2ludGVyIGZvcm1hdCkgKi8KKyNkZWZpbmUgX1dSSVRFCQkweDAyMwkJLyogT3V0cHV0IHN0cmluZyAocG9pbnRlciAvIGNvdW50IGZvcm1hdCkgKi8KKyNkZWZpbmUgX1dSSVRFTE4JMHgwMjQJCS8qIE91dHB1dCBsaW5lIChwb2ludGVyIC8gY291bnQgZm9ybWF0KSAqLworI2RlZmluZSBfV1JJVERMTgkweDAyNQkJLyogT3V0cHV0IGxpbmUgd2l0aCBkYXRhIChwb2ludGVyIC8gY291bnQgZm9ybWF0KSAqLworI2RlZmluZSBfUENSTEYJCTB4MDI2CQkvKiBPdXRwdXQgY2FycmlhZ2UgcmV0dXJuIGFuZCBsaW5lIGZlZWQgKi8KKyNkZWZpbmUgX0VSQVNMTgkJMHgwMjcJCS8qIEVyYXNlIGxpbmUgKi8KKyNkZWZpbmUgX1dSSVRECQkweDAyOAkJLyogT3V0cHV0IHN0cmluZyB3aXRoIGRhdGEgKHBvaW50ZXIgLyBjb3VudCBmb3JtYXQpICovCisjZGVmaW5lIF9TTkRCUksJCTB4MDI5CQkvKiBTZW5kIGJyZWFrICovCisjZGVmaW5lIF9ERUxBWQkJMHgwNDMJCS8qIFRpbWVyIGRlbGF5ICovCisjZGVmaW5lIF9SVENfVE0JCTB4MDUwCQkvKiBUaW1lIGluaXRpYWxpemF0aW9uIGZvciBSVEMgKi8KKyNkZWZpbmUgX1JUQ19EVAkJMHgwNTEJCS8qIERhdGUgaW5pdGlhbGl6YXRpb24gZm9yIFJUQyAqLworI2RlZmluZSBfUlRDX0RTUAkweDA1MgkJLyogRGlzcGxheSBSVEMgdGltZSBhbmQgZGF0ZSAqLworI2RlZmluZSBfUlRDX1JECQkweDA1MwkJLyogUmVhZCB0aGUgUlRDIHJlZ2lzdGVycyAqLworI2RlZmluZSBfUkVESVIJCTB4MDYwCQkvKiBSZWRpcmVjdCBJL08gb2YgYSBzeXN0ZW0gY2FsbCBmdW5jdGlvbiAqLworI2RlZmluZSBfUkVESVJfSQkweDA2MQkJLyogUmVkaXJlY3QgaW5wdXQgKi8KKyNkZWZpbmUgX1JFRElSX08JMHgwNjIJCS8qIFJlZGlyZWN0IG91dHB1dCAqLworI2RlZmluZSBfUkVUVVJOCQkweDA2MwkJLyogUmV0dXJuIHRvIFBQQ2J1ZyAqLworI2RlZmluZSBfQklOREVDCQkweDA2NAkJLyogQ29udmVydCBiaW5hcnkgdG8gYmluYXJ5IGNvZGVkIGRlY2ltYWwgKEJDRCkgKi8KKyNkZWZpbmUgX0NIQU5HRVYJMHgwNjcJCS8qIFBhcnNlIHZhbHVlICovCisjZGVmaW5lIF9TVFJDTVAJCTB4MDY4CQkvKiBDb21wYXJlIHR3byBzdHJpbmdzIChwb2ludGVyIC8gY291bnQgZm9ybWF0KSAqLworI2RlZmluZSBfTVVMVTMyCQkweDA2OQkJLyogTXVsdGlwbHkgdHdvIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VycyAqLworI2RlZmluZSBfRElWVTMyCQkweDA2YQkJLyogRGl2aWRlIHR3byAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcnMgKi8KKyNkZWZpbmUgX0NIS19TVU0JMHgwNmIJCS8qIEdlbmVyYXRlIGNoZWNrc3VtICovCisjZGVmaW5lIF9CUkRfSUQJCTB4MDcwCQkvKiBSZXR1cm4gcG9pbnRlciB0byBib2FyZCBJRCBwYWNrZXQgKi8KKyNkZWZpbmUgX0VOVklST04JMHgwNzEJCS8qIEFjY2VzcyBib290IGVudmlyb25tZW50IHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgX0RJQUdGQ04JMHgwNzQJCS8qIERpYWdub3N0aWMgZnVuY3Rpb24ocykgKi8KKyNkZWZpbmUgX1NJT1BFUFMJMHgwOTAJCS8qIFJldHJpZXZlIFNDU0kgcG9pbnRlcnMgKi8KKyNkZWZpbmUgX0lPSU5RCQkweDEyMAkJLyogUG9ydCBpbnF1aXJlICovCisjZGVmaW5lIF9JT0lORk9STQkweDEyNAkJLyogUG9ydCBpbmZvcm0gKi8KKyNkZWZpbmUgX0lPQ09ORklHCTB4MTI4CQkvKiBQb3J0IGNvbmZpZ3VyZSAqLworI2RlZmluZSBfSU9ERUxFVEUJMHgxMmMJCS8qIFBvcnQgZGVsZXRlICovCisjZGVmaW5lIF9TWU1CT0xUQQkweDEzMAkJLyogQXR0YWNoIHN5bWJvbCB0YWJsZSAqLworI2RlZmluZSBfU1lNQk9MREEJMHgxMzEJCS8qIERldGFjaCBzeW1ib2wgdGFibGUgKi8KKworc3RydWN0IGJ1Z19tYXAgeworICBpbnQgdmFsdWU7CisgIGNvbnN0IGNoYXIgKmluZm87Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJ1Z19tYXAgYnVnX21hcHBpbmdbXSA9IHsKKyAgeyBfSU5DSFIsCSIuSU5DSFIgLS0gSW5wdXQgY2hhcmFjdGVyIiB9LAorICB7IF9JTlNUQVQsCSIuSU5TVEFUIC0tIElucHV0IHNlcmlhbCBwb3J0IHN0YXR1cyIgfSwKKyAgeyBfSU5MTiwJIi5JTkxOIC0tIElucHV0IGxpbmUgKHBvaW50ZXIgLyBwb2ludGVyIGZvcm1hdCkiIH0sCisgIHsgX1JFQURTVFIsCSIuUkVBRFNUUiAtLSBJbnB1dCBzdHJpbmcgKHBvaW50ZXIgLyBjb3VudCBmb3JtYXQpIiB9LAorICB7IF9SRUFETE4sCSIuUkVBRExOIC0tIElucHV0IGxpbmUgKHBvaW50ZXIgLyBjb3VudCBmb3JtYXQpIiB9LAorICB7IF9DSEtCUkssCSIuQ0hLQlJLIC0tIENoZWNrIGZvciBicmVhayIgfSwKKyAgeyBfRFNLUkQsCSIuRFNLUkQgLS0gRGlzayByZWFkIiB9LAorICB7IF9EU0tXUiwJIi5EU0tXUiAtLSBEaXNrIHdyaXRlIiB9LAorICB7IF9EU0tDRklHLAkiLkRTS0NGSUcgLS0gRGlzayBjb25maWd1cmUiIH0sCisgIHsgX0RTS0ZNVCwJIi5EU0tGTVQgLS0gRGlzayBmb3JtYXQiIH0sCisgIHsgX0RTS0NUUkwsCSIuRFNLQ1RSTCAtLSBEaXNrIGNvbnRyb2wiIH0sCisgIHsgX05FVFJELAkiLk5FVFJEIC0tIFJlYWQgZnJvbSBob3N0IiB9LAorICB7IF9ORVRXUiwJIi5ORVRXUiAtLSBXcml0ZSB0byBob3N0IiB9LAorICB7IF9ORVRDRklHLAkiLk5FVENGSUcgLS0gQ29uZmlndXJlIG5ldHdvcmsgcGFyYW1ldGVycyIgfSwKKyAgeyBfTkVUT1BOLAkiLk5FVE9QTiAtLSBPcGVuIGZpbGUgZm9yIHJlYWRpbmciIH0sCisgIHsgX05FVEZSRCwJIi5ORVRGUkQgLS0gUmV0cmVpdmUgc3BlY2lmaWVkIGZpbGUgYmxvY2tzIiB9LAorICB7IF9ORVRDVFJMLAkiLk5FVENUUkwgLS0gSW1wbGVtZW50IHNwZWNpYWwgY29udHJvbCBmdW5jdGlvbnMiIH0sCisgIHsgX09VVENIUiwJIi5PVVRDSFIgLS0gT3V0cHV0IGNoYXJhY3RlciIgfSwKKyAgeyBfT1VUU1RSLAkiLk9VVFNUUiAtLSBPdXRwdXQgc3RyaW5nIChwb2ludGVyIC8gcG9pbnRlciBmb3JtYXQpIiB9LAorICB7IF9PVVRMTiwJIi5PVVRMTiAtLSBPdXRwdXQgbGluZSAocG9pbnRlciAvIHBvaW50ZXIgZm9ybWF0KSIgfSwKKyAgeyBfV1JJVEUsCSIuV1JJVEUgLS0gT3V0cHV0IHN0cmluZyAocG9pbnRlciAvIGNvdW50IGZvcm1hdCkiIH0sCisgIHsgX1dSSVRFTE4sCSIuV1JJVEVMTiAtLSBPdXRwdXQgbGluZSAocG9pbnRlciAvIGNvdW50IGZvcm1hdCkiIH0sCisgIHsgX1dSSVRETE4sCSIuV1JJVERMTiAtLSBPdXRwdXQgbGluZSB3aXRoIGRhdGEgKHBvaW50ZXIgLyBjb3VudCBmb3JtYXQpIiB9LAorICB7IF9QQ1JMRiwJIi5QQ1JMRiAtLSBPdXRwdXQgY2FycmlhZ2UgcmV0dXJuIGFuZCBsaW5lIGZlZWQiIH0sCisgIHsgX0VSQVNMTiwJIi5FUkFTTE4gLS0gRXJhc2UgbGluZSIgfSwKKyAgeyBfV1JJVEQsCSIuV1JJVEQgLS0gT3V0cHV0IHN0cmluZyB3aXRoIGRhdGEgKHBvaW50ZXIgLyBjb3VudCBmb3JtYXQpIiB9LAorICB7IF9TTkRCUkssCSIuU05EQlJLIC0tIFNlbmQgYnJlYWsiIH0sCisgIHsgX0RFTEFZLAkiLkRFTEFZIC0tIFRpbWVyIGRlbGF5IiB9LAorICB7IF9SVENfVE0sCSIuUlRDX1RNIC0tIFRpbWUgaW5pdGlhbGl6YXRpb24gZm9yIFJUQyIgfSwKKyAgeyBfUlRDX0RULAkiLlJUQ19EVCAtLSBEYXRlIGluaXRpYWxpemF0aW9uIGZvciBSVEMiIH0sCisgIHsgX1JUQ19EU1AsCSIuUlRDX0RTUCAtLSBEaXNwbGF5IFJUQyB0aW1lIGFuZCBkYXRlIiB9LAorICB7IF9SVENfUkQsCSIuUlRDX1JEIC0tIFJlYWQgdGhlIFJUQyByZWdpc3RlcnMiIH0sCisgIHsgX1JFRElSLAkiLlJFRElSIC0tIFJlZGlyZWN0IEkvTyBvZiBhIHN5c3RlbSBjYWxsIGZ1bmN0aW9uIiB9LAorICB7IF9SRURJUiwJIi5SRURJUiAtLSBSZWRpcmVjdCBpbnB1dCIgfSwKKyAgeyBfUkVESVIsCSIuUkVESVIgLS0gUmVkaXJlY3Qgb3V0cHV0IiB9LAorICB7IF9SRVRVUk4sCSIuUkVUVVJOIC0tIFJldHVybiB0byBQUENidWciIH0sCisgIHsgX0JJTkRFQywJIi5CSU5ERUMgLS0gQ29udmVydCBiaW5hcnkgdG8gYmluYXJ5IGNvZGVkIGRlY2ltYWwgKEJDRCkiIH0sCisgIHsgX0NIQU5HRVYsCSIuQ0hBTkdFViAtLSBQYXJzZSB2YWx1ZSIgfSwKKyAgeyBfU1RSQ01QLAkiLlNUUkNNUCAtLSBDb21wYXJlIHR3byBzdHJpbmdzIChwb2ludGVyIC8gY291bnQgZm9ybWF0KSIgfSwKKyAgeyBfTVVMVTMyLAkiLk1VTFUzMiAtLSBNdWx0aXBseSB0d28gMzItYml0IHVuc2lnbmVkIGludGVnZXJzIiB9LAorICB7IF9ESVZVMzIsCSIuRElWVTMyIC0tIERpdmlkZSB0d28gMzItYml0IHVuc2lnbmVkIGludGVnZXJzIiB9LAorICB7IF9DSEtfU1VNLAkiLkNIS19TVU0gLS0gR2VuZXJhdGUgY2hlY2tzdW0iIH0sCisgIHsgX0JSRF9JRCwJIi5CUkRfSUQgLS0gUmV0dXJuIHBvaW50ZXIgdG8gYm9hcmQgSUQgcGFja2V0IiB9LAorICB7IF9FTlZJUk9OLAkiLkVOVklST04gLS0gQWNjZXNzIGJvb3QgZW52aXJvbm1lbnQgcGFyYW1ldGVycyIgfSwKKyAgeyBfRElBR0ZDTiwJIi5ESUFHRkNOIC0tIERpYWdub3N0aWMgZnVuY3Rpb24ocykiIH0sCisgIHsgX1NJT1BFUFMsCSIuU0lPUEVQUyAtLSBSZXRyaWV2ZSBTQ1NJIHBvaW50ZXJzIiB9LAorICB7IF9JT0lOUSwJIi5JT0lOUSAtLSBQb3J0IGlucXVpcmUiIH0sCisgIHsgX0lPSU5GT1JNLAkiLklPSU5GT1JNIC0tIFBvcnQgaW5mb3JtIiB9LAorICB7IF9JT0NPTkZJRywJIi5JT0NPTkZJRyAtLSBQb3J0IGNvbmZpZ3VyZSIgfSwKKyAgeyBfSU9ERUxFVEUsCSIuSU9ERUxFVEUgLS0gUG9ydCBkZWxldGUiIH0sCisgIHsgX1NZTUJPTFRBLAkiLlNZTUJPTFRBIC0tIEF0dGFjaCBzeW1ib2wgdGFibGUiIH0sCisgIHsgX1NZTUJPTERBLAkiLlNZTUJPTERBIC0tIERldGFjaCBzeW1ib2wgdGFibGUiIH0sCit9OworCisjaWZuZGVmIEJVR0FQSV9FTkRfQUREUkVTUworI2RlZmluZSBCVUdBUElfRU5EX0FERFJFU1MgMHgxMDAwMDAKKyNlbmRpZgorCitlbnVtIHsKKyAgbnJfYnVnYXBpX2Rpc2tzID0gMiwKK307CisKKworc3RydWN0IF9vc19lbXVsX2RhdGEgeworICBkZXZpY2UgKnJvb3Q7CisgIHVuc2lnbmVkX3dvcmQgbWVtb3J5X3NpemU7CisgIHVuc2lnbmVkX3dvcmQgdG9wX29mX3N0YWNrOworICBpbnQgaW50ZXJydXB0X3ByZWZpeDsKKyAgdW5zaWduZWRfd29yZCBpbnRlcnJ1cHRfdmVjdG9yX2FkZHJlc3M7CisgIHVuc2lnbmVkX3dvcmQgc3lzdGVtX2NhbGxfYWRkcmVzczsKKyAgdW5zaWduZWRfd29yZCBzdGFsbF9jcHVfbG9vcF9hZGRyZXNzOworICBpbnQgbGl0dGxlX2VuZGlhbjsKKyAgaW50IGZsb2F0aW5nX3BvaW50X2F2YWlsYWJsZTsKKyAgLyogSS9PIGRldmljZXMgKi8KKyAgZGV2aWNlX2luc3RhbmNlICpvdXRwdXQ7CisgIGRldmljZV9pbnN0YW5jZSAqaW5wdXQ7CisgIGRldmljZV9pbnN0YW5jZSAqKGRpc2tbbnJfYnVnYXBpX2Rpc2tzXSk7Cit9OworCisKK3N0YXRpYyBvc19lbXVsX2RhdGEgKgorZW11bF9idWdhcGlfY3JlYXRlKGRldmljZSAqcm9vdCwKKwkJICAgYmZkICppbWFnZSwKKwkJICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgZGV2aWNlICpub2RlOworICBvc19lbXVsX2RhdGEgKmJ1Z2FwaTsKKworICAvKiBjaGVjayBpdCByZWFsbHkgaXMgZm9yIHVzICovCisgIGlmIChuYW1lICE9IE5VTEwKKyAgICAgICYmIHN0cmNtcChuYW1lLCAiYnVnYXBpIikgIT0gMAorICAgICAgJiYgc3RyY21wKG5hbWUsICJidWciKSAhPSAwKQorICAgIHJldHVybiBOVUxMOworICBpZiAoaW1hZ2UgIT0gTlVMTAorICAgICAgJiYgbmFtZSA9PSBOVUxMCisgICAgICAmJiBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MoaW1hZ2UpID49IEJVR0FQSV9FTkRfQUREUkVTUykKKyAgICByZXR1cm4gTlVMTDsKKworICBidWdhcGkgPSBaQUxMT0Mob3NfZW11bF9kYXRhKTsKKworICAvKiBvcHRpb25zICovCisgIGVtdWxfYWRkX3RyZWVfb3B0aW9ucyhyb290LCBpbWFnZSwgImJ1ZyIsICJvZWEiLAorCQkJMSAvKm9lYS1pbnRlcnJ1cHQtcHJlZml4Ki8pOworCisgIC8qIGFkZCBzb21lIHJlYWwgaGFyZHdhcmUsIGluY2x1ZGUgZWVwcm9tIG1lbW9yeSBmb3IgdGhlIGVlcHJvbSB0cmFwCisgICAgIGFkZHJlc3NlcyAqLworICBlbXVsX2FkZF90cmVlX2hhcmR3YXJlKHJvb3QpOworICBub2RlID0gdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL21lbW9yeUAweGZmZjAwMDAwIik7CisgIHRyZWVfcGFyc2Uobm9kZSwgIi4vcHNpbSxkZXNjcmlwdGlvbiBcImVlcHJvbSB0cmFwIGFkZHJlc3NlcyIpOworICB0cmVlX3BhcnNlKG5vZGUsICIuL3JlZyAweGZmZjAwMDAwIDB4MzAwMCIpOworCisgIGJ1Z2FwaS0+cm9vdCA9IHJvb3Q7CisKKyAgYnVnYXBpLT5tZW1vcnlfc2l6ZQorICAgID0gdHJlZV9maW5kX2ludGVnZXJfcHJvcGVydHkocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL29lYS1tZW1vcnktc2l6ZSIpOworICBidWdhcGktPmludGVycnVwdF9wcmVmaXggPQorICAgIHRyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy9vZWEtaW50ZXJydXB0LXByZWZpeCIpOworICBidWdhcGktPmludGVycnVwdF92ZWN0b3JfYWRkcmVzcyA9IChidWdhcGktPmludGVycnVwdF9wcmVmaXgKKwkJCQkgICAgICA/IE1BU0soMCwgNDMpCisJCQkJICAgICAgOiAwKTsKKyAgYnVnYXBpLT5zeXN0ZW1fY2FsbF9hZGRyZXNzID0gKGJ1Z2FwaS0+aW50ZXJydXB0X3ZlY3Rvcl9hZGRyZXNzICsgMHgwMGMwMCk7CisgIGJ1Z2FwaS0+c3RhbGxfY3B1X2xvb3BfYWRkcmVzcyA9IChidWdhcGktPnN5c3RlbV9jYWxsX2FkZHJlc3MgKyAweDAwMGYwKTsKKyAgYnVnYXBpLT50b3Bfb2Zfc3RhY2sgPSBidWdhcGktPm1lbW9yeV9zaXplIC0gMHgxMDAwOworICBidWdhcGktPmxpdHRsZV9lbmRpYW4KKyAgICA9IHRyZWVfZmluZF9ib29sZWFuX3Byb3BlcnR5KHJvb3QsICIvb3B0aW9ucy9saXR0bGUtZW5kaWFuPyIpOworICBidWdhcGktPmZsb2F0aW5nX3BvaW50X2F2YWlsYWJsZQorICAgID0gdHJlZV9maW5kX2Jvb2xlYW5fcHJvcGVydHkocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL2Zsb2F0aW5nLXBvaW50PyIpOworICBidWdhcGktPmlucHV0ID0gTlVMTDsKKyAgYnVnYXBpLT5vdXRwdXQgPSBOVUxMOworCisgIC8qIGluaXRpYWxpemF0aW9uICovCisgIGlmIChpbWFnZSAhPSBOVUxMKQorICAgIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L3JlZ2lzdGVyLzAucGMgMHglbHgiLAorCSAgICAgICAodW5zaWduZWQgbG9uZyliZmRfZ2V0X3N0YXJ0X2FkZHJlc3MoaW1hZ2UpKTsKKyAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvcGMgMHglbHgiLAorCSAgICAgKHVuc2lnbmVkIGxvbmcpYnVnYXBpLT5zdGFsbF9jcHVfbG9vcF9hZGRyZXNzKTsKKyAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvc3AgMHglbHgiLAorCSAgICAgKHVuc2lnbmVkIGxvbmcpKGJ1Z2FwaS0+dG9wX29mX3N0YWNrIC0gMTYpKTsKKyAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvbXNyIDB4JXgiLAorCSAgICAgKG1zcl9yZWNvdmVyYWJsZV9pbnRlcnJ1cHQKKwkgICAgICB8IChidWdhcGktPmxpdHRsZV9lbmRpYW4KKwkJID8gKG1zcl9saXR0bGVfZW5kaWFuX21vZGUKKwkJICAgIHwgbXNyX2ludGVycnVwdF9saXR0bGVfZW5kaWFuX21vZGUpCisJCSA6IDApCisJICAgICAgfCAoYnVnYXBpLT5mbG9hdGluZ19wb2ludF9hdmFpbGFibGUKKwkJID8gbXNyX2Zsb2F0aW5nX3BvaW50X2F2YWlsYWJsZQorCQkgOiAwKQorCSAgICAgIHwgKGJ1Z2FwaS0+aW50ZXJydXB0X3ByZWZpeAorCQkgPyBtc3JfaW50ZXJydXB0X3ByZWZpeAorCQkgOiAwKQorCSAgICAgICkpOworCisgIC8qIHBhdGNoIHRoZSBzeXN0ZW0gY2FsbCBpbnN0cnVjdGlvbiB0byBjYWxsIHRoaXMgZW11bGF0aW9uIGFuZCB0aGVuCisgICAgIGRvIGFuIHJmaSAqLworICBub2RlID0gdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvZGF0YUAweCVseCIsCisJCSAgICAodW5zaWduZWQgbG9uZylidWdhcGktPnN5c3RlbV9jYWxsX2FkZHJlc3MpOworICB0cmVlX3BhcnNlKG5vZGUsICIuL3BzaW0sZGVzY3JpcHRpb24gXCJzeXN0ZW0tY2FsbCB0cmFwIGluc3RydWN0aW9uIik7CisgIHRyZWVfcGFyc2Uobm9kZSwgIi4vcmVhbC1hZGRyZXNzIDB4JWx4IiwKKwkgICAgICh1bnNpZ25lZCBsb25nKWJ1Z2FwaS0+c3lzdGVtX2NhbGxfYWRkcmVzcyk7CisgIHRyZWVfcGFyc2Uobm9kZSwgIi4vZGF0YSAweCV4IiwgZW11bF9jYWxsX2luc3RydWN0aW9uKTsKKyAgbm9kZSA9IHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L2RhdGFAMHglbHgiLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpYnVnYXBpLT5zeXN0ZW1fY2FsbF9hZGRyZXNzICsgNCk7CisgIHRyZWVfcGFyc2Uobm9kZSwgIi4vcHNpbSxkZXNjcmlwdGlvbiBcInJldHVybiBmcm9tIGludGVycnVwdCBpbnN0cnVjdGlvbiIpOworICB0cmVlX3BhcnNlKG5vZGUsICIuL3JlYWwtYWRkcmVzcyAweCVseCIsCisJICAgICAodW5zaWduZWQgbG9uZylidWdhcGktPnN5c3RlbV9jYWxsX2FkZHJlc3MgKyA0KTsKKyAgdHJlZV9wYXJzZShub2RlLCAiLi9kYXRhIDB4JXgiLAorCSAgICAgZW11bF9yZmlfaW5zdHJ1Y3Rpb24pOworCisgIC8qIHBhdGNoIHRoZSBlbmQgb2YgdGhlIHN5c3RlbSBjYWxsIGluc3RydWN0aW9uIHNvIHRoYXQgaXQgY29udGFpbnMKKyAgICAgYSBsb29wIHRvIHNlbGYgaW5zdHJ1Y3Rpb24gYW5kIHBvaW50IGFsbCB0aGUgY3B1J3MgYXQgdGhpcyAqLworICBub2RlID0gdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvZGF0YUAweCVseCIsCisJCSAgICAodW5zaWduZWQgbG9uZylidWdhcGktPnN0YWxsX2NwdV9sb29wX2FkZHJlc3MpOworICB0cmVlX3BhcnNlKG5vZGUsICIuL3BzaW0sZGVzY3JpcHRpb24gXCJjcHUtbG9vcCBpbnN0cnVjdGlvbiIpOworICB0cmVlX3BhcnNlKG5vZGUsICIuL3JlYWwtYWRkcmVzcyAweCVseCIsCisJICAgICAodW5zaWduZWQgbG9uZylidWdhcGktPnN0YWxsX2NwdV9sb29wX2FkZHJlc3MpOworICB0cmVlX3BhcnNlKG5vZGUsICIuL2RhdGEgMHglbHgiLAorCSAgICAgKHVuc2lnbmVkIGxvbmcpZW11bF9sb29wX2luc3RydWN0aW9uKTsKKworICBpZiAoaW1hZ2UgIT0gTlVMTCkKKyAgICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9zdGFjay9zdGFjay10eXBlICVzIiwKKwkgICAgICAgKGltYWdlLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKKwkJPyAicHBjLWVsZiIKKwkJOiAicHBjLXhjb2ZmIikpOworCisgIGlmIChpbWFnZSAhPSBOVUxMKQorICAgIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L2xvYWQtYmluYXJ5L2ZpbGUtbmFtZSBcIiVzIiwKKwkgICAgICAgYmZkX2dldF9maWxlbmFtZShpbWFnZSkpOworCisgIHJldHVybiBidWdhcGk7Cit9CisKK3N0YXRpYyB2b2lkCitlbXVsX2J1Z2FwaV9pbml0KG9zX2VtdWxfZGF0YSAqYnVnYXBpLAorCQkgaW50IG5yX2NwdXMpCit7CisgIGludCBpOworICAvKiBnZXQgdGhlIGN1cnJlbnQgaW5wdXQvb3V0cHV0IGRldmljZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgZHVyaW5nCisgICAgIGRldmljZSB0cmVlIGluaXRpYWxpemF0aW9uICovCisgIGJ1Z2FwaS0+aW5wdXQgPSB0cmVlX2ZpbmRfaWhhbmRsZV9wcm9wZXJ0eShidWdhcGktPnJvb3QsICIvY2hvc2VuL3N0ZGluIik7CisgIGJ1Z2FwaS0+b3V0cHV0ID0gdHJlZV9maW5kX2loYW5kbGVfcHJvcGVydHkoYnVnYXBpLT5yb290LCAiL2Nob3Nlbi9zdGRvdXQiKTsKKyAgLyogaWYgcHJlc2VudCwgZXh0cmFjdCB0aGUgc2VsZWN0ZWQgZGlzayBkZXZpY2VzICovCisgIGZvciAoaSA9IDA7IGkgPCBucl9idWdhcGlfZGlza3M7IGkrKykgeworICAgIGNoYXIgZGlza1szMl07CisgICAgY2hhciAqY2hwOworICAgIHN0cmNweShkaXNrLCAiL2Nob3Nlbi9kaXNrMCIpOworICAgIEFTU0VSVChzaXplb2YoZGlzaykgPiBzdHJsZW4oZGlzaykpOworICAgIGNocCA9IHN0cmNocihkaXNrLCAnMCcpOworICAgICpjaHAgPSAqY2hwICsgaTsKKyAgICBpZiAodHJlZV9maW5kX3Byb3BlcnR5KGJ1Z2FwaS0+cm9vdCwgZGlzaykgIT0gTlVMTCkKKyAgICAgIGJ1Z2FwaS0+ZGlza1tpXSA9IHRyZWVfZmluZF9paGFuZGxlX3Byb3BlcnR5KGJ1Z2FwaS0+cm9vdCwgZGlzayk7CisgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorZW11bF9idWdhcGlfaW5zdHJ1Y3Rpb25fbmFtZShpbnQgY2FsbF9pZCkKK3sKKyAgc3RhdGljIGNoYXIgYnVmZmVyWzQwXTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoYnVnX21hcHBpbmcpIC8gc2l6ZW9mIChidWdfbWFwcGluZ1swXSk7IGkrKykKKyAgICB7CisgICAgICBpZiAoYnVnX21hcHBpbmdbaV0udmFsdWUgPT0gY2FsbF9pZCkKKwlyZXR1cm4gYnVnX21hcHBpbmdbaV0uaW5mbzsKKyAgICB9CisKKyAgKHZvaWQpIHNwcmludGYgKGJ1ZmZlciwgIlVua25vd24gYnVnIGNhbGwgMHgleCIsIGNhbGxfaWQpOworICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgaW50CitlbXVsX2J1Z2FwaV9kb19yZWFkKG9zX2VtdWxfZGF0YSAqYnVnYXBpLAorCQkgICAgY3B1ICpwcm9jZXNzb3IsCisJCSAgICB1bnNpZ25lZF93b3JkIGNpYSwKKwkJICAgIHVuc2lnbmVkX3dvcmQgYnVmLAorCQkgICAgaW50IG5ieXRlcykKK3sKKyAgdW5zaWduZWQgY2hhciAqc2NyYXRjaF9idWZmZXI7CisgIGludCBzdGF0dXM7CisKKyAgLyogZ2V0IGEgdGVtcG9hcnkgYnVmZXIgKi8KKyAgc2NyYXRjaF9idWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSB6YWxsb2MobmJ5dGVzKTsKKworICAvKiBjaGVjayBpZiBidWZmZXIgZXhpc3RzIGJ5IHJlYWRpbmcgaXQgKi8KKyAgZW11bF9yZWFkX2J1ZmZlcigodm9pZCAqKXNjcmF0Y2hfYnVmZmVyLCBidWYsIG5ieXRlcywgcHJvY2Vzc29yLCBjaWEpOworCisgIC8qIHJlYWQgKi8KKyAgc3RhdHVzID0gZGV2aWNlX2luc3RhbmNlX3JlYWQoYnVnYXBpLT5pbnB1dCwKKwkJCQkodm9pZCAqKXNjcmF0Y2hfYnVmZmVyLCBuYnl0ZXMpOworCisgIC8qIC0xID0gZXJyb3IsIC0yID0gbm90aGluZyBhdmFpbGFibGUgLSBzZWUgInNlcmlhbCIgW0lFRUUxMjc1XSAqLworICBpZiAoc3RhdHVzIDwgMCkgeworICAgIHN0YXR1cyA9IDA7CisgIH0KKworICBpZiAoc3RhdHVzID4gMCkgeworICAgIGVtdWxfd3JpdGVfYnVmZmVyKCh2b2lkICopc2NyYXRjaF9idWZmZXIsIGJ1Ziwgc3RhdHVzLCBwcm9jZXNzb3IsIGNpYSk7CisKKyAgICAvKiBCdWdhcGkgY2hvcHMgb2ZmIHRoZSB0cmFpbGluZyBuLCBidXQgbGVhdmVzIGl0IGluIHRoZSBidWZmZXIgKi8KKyAgICBpZiAoc2NyYXRjaF9idWZmZXJbc3RhdHVzLTFdID09ICdcbicgfHwgc2NyYXRjaF9idWZmZXJbc3RhdHVzLTFdID09ICdccicpCisgICAgICBzdGF0dXMtLTsKKyAgfQorCisgIHpmcmVlKHNjcmF0Y2hfYnVmZmVyKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQKK2VtdWxfYnVnYXBpX2RvX2Rpc2tpbyhvc19lbXVsX2RhdGEgKmJ1Z2FwaSwKKwkJICAgICAgY3B1ICpwcm9jZXNzb3IsCisJCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhLAorCQkgICAgICB1bnNpZ25lZF93b3JkIGRlc2NyaXB0b3JfYWRkciwKKwkJICAgICAgaW50IGNhbGxfaWQpCit7CisgIHN0cnVjdCBkc2tpb19kZXNjcmlwdG9yIHsKKyAgICB1bnNpZ25lZF8xIGN0cmxfbHVuOworICAgIHVuc2lnbmVkXzEgZGV2X2x1bjsKKyAgICB1bnNpZ25lZF8yIHN0YXR1czsKKyAgICB1bnNpZ25lZF93b3JkIHBidWZmZXI7CisgICAgdW5zaWduZWRfNCBibGtfbnVtOworICAgIHVuc2lnbmVkXzIgYmxrX2NudDsKKyAgICB1bnNpZ25lZF8xIGZsYWc7CisjZGVmaW5lIEJVR19GSUxFX01BUksJIDB4ODAKKyNkZWZpbmUgSUdOT1JFX0ZJTEVOVU0JIDB4MDIKKyNkZWZpbmUgRU5EX09GX0ZJTEUJIDB4MDEKKyAgICB1bnNpZ25lZF8xIGFkZHJfbW9kOworICB9IGRlc2NyaXB0b3I7CisgIGludCBibG9jazsKKyAgZW11bF9yZWFkX2J1ZmZlcigmZGVzY3JpcHRvciwgZGVzY3JpcHRvcl9hZGRyLCBzaXplb2YoZGVzY3JpcHRvciksCisJCSAgIHByb2Nlc3NvciwgY2lhKTsKKyAgVDJIKGRlc2NyaXB0b3IuY3RybF9sdW4pOworICBUMkgoZGVzY3JpcHRvci5kZXZfbHVuKTsKKyAgVDJIKGRlc2NyaXB0b3Iuc3RhdHVzKTsKKyAgVDJIKGRlc2NyaXB0b3IucGJ1ZmZlcik7CisgIFQySChkZXNjcmlwdG9yLmJsa19udW0pOworICBUMkgoZGVzY3JpcHRvci5ibGtfY250KTsKKyAgVDJIKGRlc2NyaXB0b3IuZmxhZyk7CisgIFQySChkZXNjcmlwdG9yLmFkZHJfbW9kKTsKKyAgaWYgKGRlc2NyaXB0b3IuZGV2X2x1biA+PSBucl9idWdhcGlfZGlza3MKKyAgICAgIHx8IGJ1Z2FwaS0+ZGlza1tkZXNjcmlwdG9yLmRldl9sdW5dID09IE5VTEwpIHsKKyAgICBlcnJvcigiZW11bF9idWdhcGlfZG9fZGlza2lvOiBhdHRlbXB0IHRvIGFjY2VzcyB1bmNvbmZpZ3VyZWQgZGlzayAvY2hvc2VuL2Rpc2slZCIsCisJICBkZXNjcmlwdG9yLmRldl9sdW4pOworICB9CisgIGVsc2UgeworICAgIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IGRlc2NyaXB0b3IuYmxrX2NudDsgYmxvY2srKykgeworICAgICAgZGV2aWNlX2luc3RhbmNlICpkaXNrID0gYnVnYXBpLT5kaXNrW2Rlc2NyaXB0b3IuZGV2X2x1bl07CisgICAgICB1bnNpZ25lZF8xIGJ1Zls1MTJdOyAvKj8/Pz8qLworICAgICAgdW5zaWduZWRfd29yZCBibG9ja19uciA9IGRlc2NyaXB0b3IuYmxrX251bSArIGJsb2NrOworICAgICAgdW5zaWduZWRfd29yZCBieXRlX25yID0gYmxvY2tfbnIgKiBzaXplb2YoYnVmKTsKKyAgICAgIHVuc2lnbmVkX3dvcmQgYmxvY2tfYWRkciA9IGRlc2NyaXB0b3IucGJ1ZmZlciArIGJsb2NrKnNpemVvZihidWYpOworICAgICAgaWYgKGRldmljZV9pbnN0YW5jZV9zZWVrKGRpc2ssIDAsIGJ5dGVfbnIpIDwgMCkKKwllcnJvcigiZW11bF9idWdhcGlfZG9fZGlza2lvOiBiYWQgc2Vla1xuIik7CisgICAgICBzd2l0Y2ggKGNhbGxfaWQpIHsKKyAgICAgIGNhc2UgX0RTS1JEOgorCWlmIChkZXZpY2VfaW5zdGFuY2VfcmVhZChkaXNrLCBidWYsIHNpemVvZihidWYpKSAhPSBzaXplb2YoYnVmKSkKKwkgIGVycm9yKCJlbXVsX2BidWdhcGlfZG9fZGlza2lvOiBiYWQgcmVhZFxuIik7CisJZW11bF93cml0ZV9idWZmZXIoYnVmLCBibG9ja19hZGRyLCBzaXplb2YoYnVmKSwgcHJvY2Vzc29yLCBjaWEpOworCWJyZWFrOworICAgICAgY2FzZSBfRFNLV1I6CisJZW11bF9yZWFkX2J1ZmZlcihidWYsIGJsb2NrX2FkZHIsIHNpemVvZihidWYpLCBwcm9jZXNzb3IsIGNpYSk7CisJaWYgKGRldmljZV9pbnN0YW5jZV93cml0ZShkaXNrLCBidWYsIHNpemVvZihidWYpKSAhPSBzaXplb2YoYnVmKSkKKwkgIGVycm9yKCJlbXVsX2J1Z2FwaV9kb19kaXNraW86IGJhZCB3cml0ZVxuIik7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCWVycm9yKCJlbXVsX2J1Z2FwaV9kb19kaXNraW86IGJhZCBzd2l0Y2hcbiIpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZAorZW11bF9idWdhcGlfZG9fd3JpdGUob3NfZW11bF9kYXRhICpidWdhcGksCisJCSAgICAgY3B1ICpwcm9jZXNzb3IsCisJCSAgICAgdW5zaWduZWRfd29yZCBjaWEsCisJCSAgICAgdW5zaWduZWRfd29yZCBidWYsCisJCSAgICAgaW50IG5ieXRlcywKKwkJICAgICBjb25zdCBjaGFyICpzdWZmaXgpCit7CisgIHZvaWQgKnNjcmF0Y2hfYnVmZmVyID0gTlVMTDsKKworICAvKiBnZXQgYSB0ZW1wb2FyeSBidWZlciAqLworICBpZiAobmJ5dGVzID4gMCkKKyAgICB7CisgICAgICBzY3JhdGNoX2J1ZmZlciA9IHphbGxvYyhuYnl0ZXMpOworCisgICAgICAvKiBjb3B5IGluICovCisgICAgICBlbXVsX3JlYWRfYnVmZmVyKHNjcmF0Y2hfYnVmZmVyLCBidWYsIG5ieXRlcywKKwkJICAgICAgIHByb2Nlc3NvciwgY2lhKTsKKworICAgICAgLyogd3JpdGUgKi8KKyAgICAgIGRldmljZV9pbnN0YW5jZV93cml0ZShidWdhcGktPm91dHB1dCwgc2NyYXRjaF9idWZmZXIsIG5ieXRlcyk7CisKKyAgICAgIHpmcmVlKHNjcmF0Y2hfYnVmZmVyKTsKKyAgICB9CisKKyAgaWYgKHN1ZmZpeCkKKyAgICBkZXZpY2VfaW5zdGFuY2Vfd3JpdGUoYnVnYXBpLT5vdXRwdXQsIHN1ZmZpeCwgc3RybGVuKHN1ZmZpeCkpOworCisgIGZsdXNoX3N0ZG91dHB1dCAoKTsKK30KKworc3RhdGljIGludAorZW11bF9idWdhcGlfaW5zdHJ1Y3Rpb25fY2FsbChjcHUgKnByb2Nlc3NvciwKKwkJCSAgICAgdW5zaWduZWRfd29yZCBjaWEsCisJCQkgICAgIHVuc2lnbmVkX3dvcmQgcmEsCisJCQkgICAgIG9zX2VtdWxfZGF0YSAqYnVnYXBpKQoreworICBjb25zdCBpbnQgY2FsbF9pZCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzEwXTsKKyAgdW5zaWduZWQgY2hhciB1YzsKKworI2RlZmluZSBNWV9JTkRFWCBpdGFibGVfaW5zdHJ1Y3Rpb25fY2FsbAorICBJVFJBQ0UgKHRyYWNlX29zX2VtdWwsCisJICAoIiAweCV4ICVzLCByMyA9IDB4JWx4LCByNCA9IDB4JWx4XG4iLAorCSAgIGNhbGxfaWQsIGVtdWxfYnVnYXBpX2luc3RydWN0aW9uX25hbWUgKGNhbGxfaWQpLAorCSAgIChsb25nKWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzNdLAorCSAgIChsb25nKWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzRdKSk7OworCisgIC8qIGNoZWNrIHRoYXQgdGhpcyBpc24ndCBhbiBpbnZhbGlkIGluc3RydWN0aW9uICovCisgIGlmIChjaWEgIT0gYnVnYXBpLT5zeXN0ZW1fY2FsbF9hZGRyZXNzKQorICAgIHJldHVybiAwOworCisgIHN3aXRjaCAoY2FsbF9pZCkgeworICBkZWZhdWx0OgorICAgIGVycm9yKCJlbXVsLWJ1Z2FwaTogdW5pbXBsZW1lbnRlZCBidWdhcGkgJXMgZnJvbSBhZGRyZXNzIDB4JWx4XG4iLAorCSAgZW11bF9idWdhcGlfaW5zdHJ1Y3Rpb25fbmFtZSAoY2FsbF9pZCksIFNSUjApOworICAgIGJyZWFrOworCisgIC8qIHJlYWQgYSBzaW5nbGUgY2hhcmFjdGVyLCBvdXRwdXQgcjMgPSBieXRlICovCisgIC8qIEZJWE1FOiBBZGQgc3VwcG9ydCB0byB1bmJ1ZmZlciBpbnB1dCAqLworICBjYXNlIF9JTkNIUjoKKyAgICBpZiAoZGV2aWNlX2luc3RhbmNlX3JlYWQoYnVnYXBpLT5pbnB1dCwgKHZvaWQgKikmdWMsIDEpIDw9IDApCisgICAgICB1YyA9IDA7CisgICAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbM10gPSB1YzsKKyAgICBicmVhazsKKworICAvKiByZWFkIGEgbGluZSBvZiBhdCBtb3N0IDI1NiBieXRlcywgcjMgPSBwdHIgdG8gMXN0IGJ5dGUsIG91dHB1dCByMyA9IHB0ciB0byBsYXN0IGJ5dGUrMSAgKi8KKyAgY2FzZSBfSU5MTjoKKyAgICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclszXSArPSBlbXVsX2J1Z2FwaV9kb19yZWFkKGJ1Z2FwaSwKKwkJCQkJCQkgICAgcHJvY2Vzc29yLCBjaWEsCisJCQkJCQkJICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzNdLAorCQkJCQkJCSAgICAyNTYpOworICAgIGJyZWFrOworCisgIC8qIG91dHB1dCBhIGNoYXJhY3RlciwgcjMgPSBjaGFyYWN0ZXIgKi8KKyAgY2FzZSBfT1VUQ0hSOgorICAgIHsKKyAgICAgIGNoYXIgb3V0ID0gKGNoYXIpY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbM107CisgICAgICBkZXZpY2VfaW5zdGFuY2Vfd3JpdGUoYnVnYXBpLT5vdXRwdXQsICZvdXQsIDEpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIG91dHB1dCBhIHN0cmluZywgcjMgPSBwdHIgdG8gMXN0IGJ5dGUsIHI0ID0gcHRyIHRvIGxhc3QgYnl0ZSsxICovCisgIGNhc2UgX09VVFNUUjoKKyAgICBlbXVsX2J1Z2FwaV9kb193cml0ZShidWdhcGksCisJCQkgcHJvY2Vzc29yLCBjaWEsCisJCQkgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbM10sCisJCQkgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbNF0gLSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclszXSwKKwkJCSAoY29uc3QgY2hhciAqKTApOworICAgIGJyZWFrOworCisgIC8qIG91dHB1dCBhIHN0cmluZyBmb2xsb3dlZCBieSBcclxuLCByMyA9IHB0ciB0byAxc3QgYnl0ZSwgcjQgPSBwdHIgdG8gbGFzdCBieXRlKzEgKi8KKyAgY2FzZSBfT1VUTE46CisKKyAgICBlbXVsX2J1Z2FwaV9kb193cml0ZShidWdhcGksCisJCQkgcHJvY2Vzc29yLCBjaWEsCisJCQkgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbM10sCisJCQkgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbNF0gLSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclszXSwKKwkJCSAiXG4iKTsKKyAgICBicmVhazsKKworICAvKiBvdXRwdXQgYSBcclxuICovCisgIGNhc2UgX1BDUkxGOgorICAgIGRldmljZV9pbnN0YW5jZV93cml0ZShidWdhcGktPm91dHB1dCwgIlxuIiwgMSk7CisgICAgYnJlYWs7CisKKyAgLyogcmVhZC93cml0ZSBibG9ja3Mgb2YgZGF0YSB0by9mcm9tIHRoZSBkaXNrICovCisgIGNhc2UgX0RTS1dSOgorICBjYXNlIF9EU0tSRDoKKyAgICBlbXVsX2J1Z2FwaV9kb19kaXNraW8oYnVnYXBpLCBwcm9jZXNzb3IsIGNpYSwKKwkJCSAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbM10sCisJCQkgIGNhbGxfaWQpOworICAgIGJyZWFrOworCisgIC8qIHJldHVybiB0byBwcGNidWcgbW9uaXRvciAoZXhpdGluZyB3aXRoIGdwclszXSBhcyBzdGF0dXMgaXMgbm90CisgICAgIHBhcnQgb2YgdGhlIGJ1ZyBtb25pdG9yKSAqLworICBjYXNlIF9SRVRVUk46CisgICAgY3B1X2hhbHQocHJvY2Vzc29yLCBjaWEsIHdhc19leGl0ZWQsIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzNdKTsKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMTsKKyAgLyogdGhlIGluc3RydWN0aW9uIGZvbGxvd2luZyB0aGlzIG9uZSBpcyBhIFJGSS4gIFRodXMgYnkganVzdAorICAgICBjb250aW51aW5nIHRoZSByZXR1cm4gZnJvbSBzeXN0ZW0gY2FsbCBpcyBwZXJmb3JtZWQgKi8KK30KKworY29uc3Qgb3NfZW11bCBlbXVsX2J1Z2FwaSA9IHsKKyAgImJ1Z2FwaSIsCisgIGVtdWxfYnVnYXBpX2NyZWF0ZSwKKyAgZW11bF9idWdhcGlfaW5pdCwKKyAgMCwgLypzeXN0ZW1fY2FsbCovCisgIGVtdWxfYnVnYXBpX2luc3RydWN0aW9uX2NhbGwsCisgIDAgLypkYXRhKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9lbXVsX2J1Z2FwaS5oIGIvc2ltL3BwYy9lbXVsX2J1Z2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkM2UzODMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2VtdWxfYnVnYXBpLmgKQEAgLTAsMCArMSwyNyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfRU1VTF9CVUdBUElfSF8KKyNkZWZpbmUgX0VNVUxfQlVHQVBJX0hfCisKK2V4dGVybiBjb25zdCBvc19lbXVsIGVtdWxfYnVnYXBpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9wcGMvZW11bF9jaGlycC5jIGIvc2ltL3BwYy9lbXVsX2NoaXJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliYjg5YwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZW11bF9jaGlycC5jCkBAIC0wLDAgKzEsMjAxMCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyAgICAqLworCisKKyNpZm5kZWYgX0VNVUxfQ0hJUlBfQ18KKyNkZWZpbmUgX0VNVUxfQ0hJUlBfQ18KKworLyogTm90ZTogdGhpcyBtb2R1bGUgaXMgY2FsbGVkIHZpYSBhIHRhYmxlLiAgVGhlcmUgaXMgbm8gYmVuZWZpdCBpbgorICAgbWFraW5nIGl0IGlubGluZSAqLworCisjaW5jbHVkZSAiZW11bF9nZW5lcmljLmgiCisjaW5jbHVkZSAiZW11bF9jaGlycC5oIgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmbmRlZiBTVEFUSUNfSU5MSU5FX0VNVUxfQ0hJUlAKKyNkZWZpbmUgU1RBVElDX0lOTElORV9FTVVMX0NISVJQIFNUQVRJQ19JTkxJTkUKKyNlbmRpZgorCisKKy8qIEVNVUxBVElPTgorCisKKyAgIE9wZW5GaXJtd2FyZSAtIElFRUUgU3RhbmRhcmQgZm9yIEJvb3QgKEluaXRpYWxpemF0aW9uCisgICBDb25maWd1cmF0aW9uKSBGaXJtd2FyZS4KKworCisgICBERVNDUklQVElPTgorCisKKyAgIEJVR1MKKworICAgCisgICBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSBtZW1vcnkgbm9kZSBoYXMgI2FkZHJlc3MtY2VsbHMgYW5kCisgICAjc2l6ZS1jZWxscyBzZXQgdG8gb25lLiAgRm9yIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMsIHRoaXMgbWF5IG5vdAorICAgYmUgdGhlIGNhc2UuCisKKyAgICovCisKKworCisKKy8qIERlc2NyaXB0b3Igb2YgdGhlIG9wZW4gYm9vdCBzZXJ2aWNlcyBiZWluZyBlbXVsYXRlZCAqLworCit0eXBlZGVmIGludCAoY2hpcnBfaGFuZGxlcikKKyAgICAgKG9zX2VtdWxfZGF0YSAqZGF0YSwKKyAgICAgIGNwdSAqcHJvY2Vzc29yLAorICAgICAgdW5zaWduZWRfd29yZCBjaWEpOworCit0eXBlZGVmIHN0cnVjdCBfY2hpcnBfc2VydmljZXMgeworICBjb25zdCBjaGFyICpuYW1lOworICBjaGlycF9oYW5kbGVyICpoYW5kbGVyOworfSBjaGlycF9zZXJ2aWNlczsKKworCisvKiBUaGUgT3BlbkJvb3QgZW11bGF0aW9uIGlzLCBhdCBhbnkgdGltZSBlaXRoZXIgd2FpdGluZyBmb3IgYSBjbGllbnQKKyAgIHJlcXVlc3Qgb3Igd2FpdGluZyBvbiBhIGNsaWVudCBjYWxsYmFjayAqLwordHlwZWRlZiBlbnVtIHsKKyAgc2VydmluZywKKyAgZW11bGF0aW5nLAorICBmYXVsdGluZywKK30gY2hpcnBfZW11bF9zdGF0ZTsKKworc3RydWN0IF9vc19lbXVsX2RhdGEgeworICBjaGlycF9lbXVsX3N0YXRlIHN0YXRlOworICB1bnNpZ25lZF93b3JkIHJldHVybl9hZGRyZXNzOworICB1bnNpZ25lZF93b3JkIGFyZ3VtZW50czsKKyAgdW5zaWduZWRfd29yZCBuX2FyZ3M7CisgIHVuc2lnbmVkX3dvcmQgbl9yZXR1cm5zOworICBjaGlycF9zZXJ2aWNlcyAqc2VydmljZTsKKyAgZGV2aWNlICpyb290OworICBjaGlycF9zZXJ2aWNlcyAqc2VydmljZXM7CisgIC8qIGNvbmZpZ3VyYXRpb24gKi8KKyAgdW5zaWduZWRfd29yZCBtZW1vcnlfc2l6ZTsKKyAgdW5zaWduZWRfd29yZCByZWFsX2Jhc2U7CisgIHVuc2lnbmVkX3dvcmQgcmVhbF9zaXplOworICB1bnNpZ25lZF93b3JkIHZpcnRfYmFzZTsKKyAgdW5zaWduZWRfd29yZCB2aXJ0X3NpemU7CisgIGludCByZWFsX21vZGU7CisgIGludCBsaXR0bGVfZW5kaWFuOworICBpbnQgZmxvYXRpbmdfcG9pbnRfYXZhaWxhYmxlOworICBpbnQgaW50ZXJydXB0X3ByZWZpeDsKKyAgdW5zaWduZWRfd29yZCBsb2FkX2Jhc2U7CisgIC8qIGhhc2ggdGFibGUgKi8KKyAgdW5zaWduZWRfd29yZCBucl9wYWdlX3RhYmxlX2VudHJ5X2dyb3VwczsKKyAgdW5zaWduZWRfd29yZCBodGFiX29mZnNldDsKKyAgdW5zaWduZWRfd29yZCBodGFiX3JhOworICB1bnNpZ25lZF93b3JkIGh0YWJfdmE7CisgIHVuc2lnbmVkX3dvcmQgc2l6ZW9mX2h0YWI7CisgIC8qIHZpcnR1YWwgYWRkcmVzcyBvZiBodGFiICovCisgIHVuc2lnbmVkX3dvcmQgc3RhY2tfb2Zmc2V0OworICB1bnNpZ25lZF93b3JkIHN0YWNrX3JhOworICB1bnNpZ25lZF93b3JkIHN0YWNrX3ZhOworICB1bnNpZ25lZF93b3JkIHNpemVvZl9zdGFjazsKKyAgLyogYWRkcmVzc2VzIG9mIGVtdWxhdGlvbiBpbnN0cnVjdGlvbnMgdmlydHVhbC9yZWFsICovCisgIHVuc2lnbmVkX3dvcmQgY29kZV9vZmZzZXQ7CisgIHVuc2lnbmVkX3dvcmQgY29kZV92YTsKKyAgdW5zaWduZWRfd29yZCBjb2RlX3JhOworICB1bnNpZ25lZF93b3JkIHNpemVvZl9jb2RlOworICB1bnNpZ25lZF93b3JkIGNvZGVfY2xpZW50X3ZhOworICB1bnNpZ25lZF93b3JkIGNvZGVfY2xpZW50X3JhOworICB1bnNpZ25lZF93b3JkIGNvZGVfY2FsbGJhY2tfdmE7CisgIHVuc2lnbmVkX3dvcmQgY29kZV9jYWxsYmFja19yYTsKKyAgdW5zaWduZWRfd29yZCBjb2RlX2xvb3BfdmE7CisgIHVuc2lnbmVkX3dvcmQgY29kZV9sb29wX3JhOworfTsKKworCisvKiByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIEloYW5kbGUgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2loYW5kbGVfbmFtZShkZXZpY2VfaW5zdGFuY2UgKmloYW5kbGUpCit7CisgIGlmIChpaGFuZGxlID09IE5VTEwpCisgICAgcmV0dXJuICIiOworICBlbHNlCisgICAgcmV0dXJuIGRldmljZV9uYW1lKGRldmljZV9pbnN0YW5jZV9kZXZpY2UoaWhhbmRsZSkpOworfQorCisKKworLyogUmVhZC93cml0ZSB0aGUgYXJndW1lbnQgbGlzdCBtYWtpbmcgY2VydGFpbiB0aGF0IGFsbCB2YWx1ZXMgYXJlCisgICBjb252ZXJ0ZWQgdG8vZnJvbSBob3N0IGJ5dGUgb3JkZXIuCisKKyAgIEluIHRoZSBiZWxvdyBvbmx5IG5fYXJncytuX3JldHVybnMgaXMgcmVhZC93cml0dGVuICovCisKK3N0YXRpYyBpbnQKK2NoaXJwX3JlYWRfdDJoX2FyZ3Modm9pZCAqYXJncywKKwkJICAgIGludCBzaXplb2ZfYXJncywKKwkJICAgIGludCBuX2FyZ3MsCisJCSAgICBpbnQgbl9yZXR1cm5zLAorCQkgICAgb3NfZW11bF9kYXRhICpkYXRhLAorCQkgICAgY3B1ICpwcm9jZXNzb3IsCisJCSAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgdW5zaWduZWRfY2VsbCAqd29yZHM7CisgIGludCBpOworICAvKiBjaGVjayBhZ2FpbnN0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHNwZWNpZmllZCBieSB0aGUgY2xpZW50CisgICAgIHByb2dyYW0gKi8KKyAgaWYgKChuX2FyZ3MgPj0gMCAmJiBkYXRhLT5uX2FyZ3MgIT0gbl9hcmdzKQorICAgICAgfHwgKG5fcmV0dXJucyA+PSAwICYmIGRhdGEtPm5fcmV0dXJucyAhPSBuX3JldHVybnMpKSB7CisgICAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCIlcyAtIGludmFsaWQgbnIgb2YgYXJncyAtIG5fYXJncz0lbGQsIG5fcmV0dXJucz0lbGRcbiIsCisJCQkgIGRhdGEtPnNlcnZpY2UtPm5hbWUsCisJCQkgIChsb25nKWRhdGEtPm5fYXJncywKKwkJCSAgKGxvbmcpZGF0YS0+bl9yZXR1cm5zKSk7CisgICAgcmV0dXJuIC0xOworICB9CisgIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlICovCisgIGlmIChzaXplb2YodW5zaWduZWRfY2VsbCkgKiAoZGF0YS0+bl9hcmdzICsgZGF0YS0+bl9yZXR1cm5zKSA+IHNpemVvZl9hcmdzKQorICAgIHJldHVybiAtMTsKKyAgLyogYnJpbmcgaW4gdGhlIGRhdGEgKi8KKyAgbWVtc2V0KGFyZ3MsIDAsIHNpemVvZl9hcmdzKTsKKyAgZW11bF9yZWFkX2J1ZmZlcihhcmdzLCBkYXRhLT5hcmd1bWVudHMgKyAzICogc2l6ZW9mKHVuc2lnbmVkX2NlbGwpLAorCQkgICBzaXplb2YodW5zaWduZWRfY2VsbCkgKiAoZGF0YS0+bl9hcmdzICsgZGF0YS0+bl9yZXR1cm5zKSwKKwkJICAgcHJvY2Vzc29yLCBjaWEpOworICAvKiBjb252ZXJ0IGFsbCB3b3JkcyB0byBob3N0IGZvcm1hdCAqLworICB3b3JkcyA9IGFyZ3M7CisgIGZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mX2FyZ3MgLyBzaXplb2YodW5zaWduZWRfY2VsbCkpOyBpKyspCisgICAgd29yZHNbaV0gPSBUMkhfY2VsbCh3b3Jkc1tpXSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorY2hpcnBfd3JpdGVfaDJ0X2FyZ3Modm9pZCAqYXJncywKKwkJICAgICBpbnQgc2l6ZW9mX2FyZ3MsCisJCSAgICAgb3NfZW11bF9kYXRhICpkYXRhLAorCQkgICAgIGNwdSAqcHJvY2Vzc29yLAorCQkgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBpbnQgaTsKKyAgdW5zaWduZWRfY2VsbCAqd29yZHM7CisgIC8qIGNvbnZlcnQgdG8gdGFyZ2V0IGV2ZXJ5dGhpbmcgKi8KKyAgd29yZHMgPSBhcmdzOworICBmb3IgKGkgPSAwOyBpIDwgKHNpemVvZl9hcmdzIC8gc2l6ZW9mKHVuc2lnbmVkX2NlbGwpKTsgaSsrKQorICAgIHdvcmRzW2ldID0gSDJUX2NlbGwod29yZHNbaV0pOworICAvKiBicmluZyBpbiB0aGUgZGF0YSAqLworICBlbXVsX3dyaXRlX2J1ZmZlcihhcmdzLCBkYXRhLT5hcmd1bWVudHMgKyAzICogc2l6ZW9mKHVuc2lnbmVkX2NlbGwpLAorCQkgICAgc2l6ZW9mKHVuc2lnbmVkX2NlbGwpICogKGRhdGEtPm5fYXJncyArIGRhdGEtPm5fcmV0dXJucyksCisJCSAgICBwcm9jZXNzb3IsIGNpYSk7Cit9CisKKworLyogT3BlbkJvb3QgZW11bGF0aW9uIGZ1bmN0aW9ucyAqLworCisvKiBjbGllbnQgaW50ZXJmYWNlICovCisKK3N0YXRpYyBpbnQKK2NoaXJwX2VtdWxfdGVzdChvc19lbXVsX2RhdGEgKmRhdGEsCisJCWNwdSAqcHJvY2Vzc29yLAorCQl1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgc3RydWN0IHRlc3RfYXJncyB7CisgICAgLyppbiovCisgICAgdW5zaWduZWRfY2VsbCBuYW1lOyAvKnN0cmluZyovCisgICAgLypvdXQqLworICAgIHVuc2lnbmVkX2NlbGwgbWlzc2luZzsKKyAgfSBhcmdzOworICBjaGFyIG5hbWVbMzJdOworICBjaGlycF9zZXJ2aWNlcyAqc2VydmljZSA9IE5VTEw7CisgIC8qIHJlYWQgaW4gdGhlIGFyZ3VtZW50cyAqLworICBpZiAoY2hpcnBfcmVhZF90MmhfYXJncygmYXJncywgc2l6ZW9mKGFyZ3MpLCAxLCAxLCBkYXRhLCBwcm9jZXNzb3IsIGNpYSkpCisgICAgcmV0dXJuIC0xOworICBlbXVsX3JlYWRfc3RyaW5nKG5hbWUsIGFyZ3MubmFtZSwgc2l6ZW9mKG5hbWUpLAorCQkgICBwcm9jZXNzb3IsIGNpYSk7CisgIFRSQUNFKHRyYWNlX29zX2VtdWwsICgidGVzdCAtIGluIC0gbmFtZT1gJXMnXG4iLCBuYW1lKSk7CisgIC8qIHNlZSBpZiB3ZSBrbm93IGFib3V0IHRoZSBzZXJ2aWNlICovCisgIHNlcnZpY2UgPSBkYXRhLT5zZXJ2aWNlczsKKyAgd2hpbGUgKHNlcnZpY2UtPm5hbWUgIT0gTlVMTCAmJiBzdHJjbXAoc2VydmljZS0+bmFtZSwgbmFtZSkgIT0gMCkgeworICAgIHNlcnZpY2UrKzsKKyAgfQorICBpZiAoc2VydmljZS0+bmFtZSA9PSBOVUxMKQorICAgIGFyZ3MubWlzc2luZyA9IC0xOworICBlbHNlCisgICAgYXJncy5taXNzaW5nID0gMDsKKyAgLyogd3JpdGUgdGhlIGFyZ3VtZW50cyBiYWNrIG91dCAqLworICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoInRlc3QgLSBvdXQgLSBtaXNzaW5nPSVsZFxuIiwKKwkJCShsb25nKWFyZ3MubWlzc2luZykpOworICBjaGlycF93cml0ZV9oMnRfYXJncygmYXJncywKKwkJICAgICAgIHNpemVvZihhcmdzKSwKKwkJICAgICAgIGRhdGEsCisJCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7CisgIHJldHVybiAwOworfQorCisKKy8qIERldmljZSB0cmVlICovCisKK3N0YXRpYyBpbnQKK2NoaXJwX2VtdWxfcGVlcihvc19lbXVsX2RhdGEgKmRhdGEsCisJCWNwdSAqcHJvY2Vzc29yLAorCQl1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgc3RydWN0IHBlZXJfYXJncyB7CisgICAgLyppbiovCisgICAgdW5zaWduZWRfY2VsbCBwaGFuZGxlOworICAgIC8qb3V0Ki8KKyAgICB1bnNpZ25lZF9jZWxsIHNpYmxpbmdfcGhhbmRsZTsKKyAgfSBhcmdzOworICBkZXZpY2UgKnBoYW5kbGU7CisgIGRldmljZSAqc2libGluZ19waGFuZGxlID0gTlVMTDsKKyAgLyogcmVhZCBpbiB0aGUgYXJndW1lbnRzICovCisgIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksIDEsIDEsIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKKyAgICByZXR1cm4gLTE7CisgIHBoYW5kbGUgPSBleHRlcm5hbF90b19kZXZpY2UoZGF0YS0+cm9vdCwgYXJncy5waGFuZGxlKTsKKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJwZWVyIC0gaW4gLSBwaGFuZGxlPTB4JWx4KDB4JWx4YCVzJylcbiIsCisJCQkodW5zaWduZWQgbG9uZylhcmdzLnBoYW5kbGUsCisJCQkodW5zaWduZWQgbG9uZylwaGFuZGxlLAorCQkJKHBoYW5kbGUgPT0gTlVMTCA/ICIiIDogZGV2aWNlX25hbWUocGhhbmRsZSkpKSk7CisgIC8qIGZpbmQgdGhlIHBlZXIgKi8KKyAgaWYgKGFyZ3MucGhhbmRsZSA9PSAwKSB7CisgICAgc2libGluZ19waGFuZGxlID0gZGF0YS0+cm9vdDsKKyAgICBhcmdzLnNpYmxpbmdfcGhhbmRsZSA9IGRldmljZV90b19leHRlcm5hbChzaWJsaW5nX3BoYW5kbGUpOworICB9CisgIGVsc2UgaWYgKHBoYW5kbGUgPT0gTlVMTCkgeworICAgIHNpYmxpbmdfcGhhbmRsZSA9IE5VTEw7CisgICAgYXJncy5zaWJsaW5nX3BoYW5kbGUgPSAtMTsKKyAgfQorICBlbHNlIHsKKyAgICBzaWJsaW5nX3BoYW5kbGUgPSBkZXZpY2Vfc2libGluZyhwaGFuZGxlKTsKKyAgICBpZiAoc2libGluZ19waGFuZGxlID09IE5VTEwpCisgICAgICBhcmdzLnNpYmxpbmdfcGhhbmRsZSA9IDA7CisgICAgZWxzZQorICAgICAgYXJncy5zaWJsaW5nX3BoYW5kbGUgPSBkZXZpY2VfdG9fZXh0ZXJuYWwoc2libGluZ19waGFuZGxlKTsKKyAgfQorICAvKiB3cml0ZSB0aGUgYXJndW1lbnRzIGJhY2sgb3V0ICovCisgIFRSQUNFKHRyYWNlX29zX2VtdWwsICgicGVlciAtIG91dCAtIHNpYmxpbmdfcGhhbmRsZT0weCVseCgweCVseGAlcycpXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5zaWJsaW5nX3BoYW5kbGUsCisJCQkodW5zaWduZWQgbG9uZylzaWJsaW5nX3BoYW5kbGUsCisJCQkoc2libGluZ19waGFuZGxlID09IE5VTEwgPyAiIiA6IGRldmljZV9uYW1lKHNpYmxpbmdfcGhhbmRsZSkpKSk7CisgIGNoaXJwX3dyaXRlX2gydF9hcmdzKCZhcmdzLAorCQkgICAgICAgc2l6ZW9mKGFyZ3MpLAorCQkgICAgICAgZGF0YSwKKwkJICAgICAgIHByb2Nlc3NvciwgY2lhKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NoaXJwX2VtdWxfY2hpbGQob3NfZW11bF9kYXRhICpkYXRhLAorCQkgY3B1ICpwcm9jZXNzb3IsCisJCSB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgc3RydWN0IGNoaWxkX2FyZ3MgeworICAgIC8qaW4qLworICAgIHVuc2lnbmVkX2NlbGwgcGhhbmRsZTsKKyAgICAvKm91dCovCisgICAgdW5zaWduZWRfY2VsbCBjaGlsZF9waGFuZGxlOworICB9IGFyZ3M7CisgIGRldmljZSAqcGhhbmRsZTsKKyAgZGV2aWNlICpjaGlsZF9waGFuZGxlOworICAvKiByZWFkIHRoZSBhcmd1bWVudHMgaW4gKi8KKyAgaWYgKGNoaXJwX3JlYWRfdDJoX2FyZ3MoJmFyZ3MsIHNpemVvZihhcmdzKSwgMSwgMSwgZGF0YSwgcHJvY2Vzc29yLCBjaWEpKQorICAgIHJldHVybiAtMTsKKyAgcGhhbmRsZSA9IGV4dGVybmFsX3RvX2RldmljZShkYXRhLT5yb290LCBhcmdzLnBoYW5kbGUpOworICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoImNoaWxkIC0gaW4gLSBwaGFuZGxlPTB4JWx4KDB4JWx4YCVzJylcbiIsCisJCQkodW5zaWduZWQgbG9uZylhcmdzLnBoYW5kbGUsCisJCQkodW5zaWduZWQgbG9uZylwaGFuZGxlLAorCQkJKHBoYW5kbGUgPT0gTlVMTCA/ICIiIDogZGV2aWNlX25hbWUocGhhbmRsZSkpKSk7CisgIC8qIGZpbmQgYSBjaGlsZCAqLworICBpZiAoYXJncy5waGFuZGxlID09IDAKKyAgICAgIHx8IHBoYW5kbGUgPT0gTlVMTCkgeworICAgIGNoaWxkX3BoYW5kbGUgPSBOVUxMOworICAgIGFyZ3MuY2hpbGRfcGhhbmRsZSA9IC0xOworICB9CisgIGVsc2UgeworICAgIGNoaWxkX3BoYW5kbGUgPSBkZXZpY2VfY2hpbGQocGhhbmRsZSk7CisgICAgaWYgKGNoaWxkX3BoYW5kbGUgPT0gTlVMTCkKKyAgICAgIGFyZ3MuY2hpbGRfcGhhbmRsZSA9IDA7CisgICAgZWxzZQorICAgICAgYXJncy5jaGlsZF9waGFuZGxlID0gZGV2aWNlX3RvX2V4dGVybmFsKGNoaWxkX3BoYW5kbGUpOworICB9CisgIC8qIHdyaXRlIHRoZSByZXN1bHQgb3V0ICovCisgIFRSQUNFKHRyYWNlX29zX2VtdWwsICgiY2hpbGQgLSBvdXQgLSBjaGlsZF9waGFuZGxlPTB4JWx4KDB4JWx4YCVzJylcbiIsCisJCQkodW5zaWduZWQgbG9uZylhcmdzLmNoaWxkX3BoYW5kbGUsCisJCQkodW5zaWduZWQgbG9uZyljaGlsZF9waGFuZGxlLAorCQkJKGNoaWxkX3BoYW5kbGUgPT0gTlVMTCA/ICIiIDogZGV2aWNlX25hbWUoY2hpbGRfcGhhbmRsZSkpKSk7CisgIGNoaXJwX3dyaXRlX2gydF9hcmdzKCZhcmdzLAorCQkgICAgICAgc2l6ZW9mKGFyZ3MpLAorCQkgICAgICAgZGF0YSwKKwkJICAgICAgIHByb2Nlc3NvciwgY2lhKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NoaXJwX2VtdWxfcGFyZW50KG9zX2VtdWxfZGF0YSAqZGF0YSwKKwkJICBjcHUgKnByb2Nlc3NvciwKKwkJICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgc3RydWN0IHBhcmVudF9hcmdzIHsKKyAgICAvKmluKi8KKyAgICB1bnNpZ25lZF9jZWxsIHBoYW5kbGU7CisgICAgLypvdXQqLworICAgIHVuc2lnbmVkX2NlbGwgcGFyZW50X3BoYW5kbGU7CisgIH0gYXJnczsKKyAgZGV2aWNlICpwaGFuZGxlOworICBkZXZpY2UgKnBhcmVudF9waGFuZGxlOworICAvKiByZWFkIHRoZSBhcmdzIGluICovCisgIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksIDEsIDEsIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKKyAgICByZXR1cm4gLTE7CisgIHBoYW5kbGUgPSBleHRlcm5hbF90b19kZXZpY2UoZGF0YS0+cm9vdCwgYXJncy5waGFuZGxlKTsKKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJwYXJlbnQgLSBpbiAtIHBoYW5kbGU9MHglbHgoMHglbHhgJXMnKVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKWFyZ3MucGhhbmRsZSwKKwkJCSh1bnNpZ25lZCBsb25nKXBoYW5kbGUsCisJCQkocGhhbmRsZSA9PSBOVUxMID8gIiIgOiBkZXZpY2VfbmFtZShwaGFuZGxlKSkpKTsKKyAgLyogZmluZCBhIHBhcmVudCAqLworICBpZiAoYXJncy5waGFuZGxlID09IDAKKyAgICAgIHx8IHBoYW5kbGUgPT0gTlVMTCkgeworICAgIHBhcmVudF9waGFuZGxlID0gTlVMTDsKKyAgICBhcmdzLnBhcmVudF9waGFuZGxlID0gLTE7CisgIH0KKyAgZWxzZSB7CisgICAgcGFyZW50X3BoYW5kbGUgPSBkZXZpY2VfcGFyZW50KHBoYW5kbGUpOworICAgIGlmIChwYXJlbnRfcGhhbmRsZSA9PSBOVUxMKQorICAgICAgYXJncy5wYXJlbnRfcGhhbmRsZSA9IDA7CisgICAgZWxzZQorICAgICAgYXJncy5wYXJlbnRfcGhhbmRsZSA9IGRldmljZV90b19leHRlcm5hbChwYXJlbnRfcGhhbmRsZSk7CisgIH0KKyAgLyogcmV0dXJuIHRoZSByZXN1bHQgKi8KKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJwYXJlbnQgLSBvdXQgLSBwYXJlbnRfcGhhbmRsZT0weCVseCgweCVseGAlcycpXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5wYXJlbnRfcGhhbmRsZSwKKwkJCSh1bnNpZ25lZCBsb25nKXBhcmVudF9waGFuZGxlLAorCQkJKHBhcmVudF9waGFuZGxlID09IE5VTEwgPyAiIiA6IGRldmljZV9uYW1lKHBhcmVudF9waGFuZGxlKSkpKTsKKyAgY2hpcnBfd3JpdGVfaDJ0X2FyZ3MoJmFyZ3MsCisJCSAgICAgICBzaXplb2YoYXJncyksCisJCSAgICAgICBkYXRhLAorCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY2hpcnBfZW11bF9pbnN0YW5jZV90b19wYWNrYWdlKG9zX2VtdWxfZGF0YSAqZGF0YSwKKwkJCSAgICAgICBjcHUgKnByb2Nlc3NvciwKKwkJCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgc3RydWN0IGluc3RhbmNlX3RvX3BhY2thZ2VfYXJncyB7CisgICAgLyppbiovCisgICAgdW5zaWduZWRfY2VsbCBpaGFuZGxlOworICAgIC8qb3V0Ki8KKyAgICB1bnNpZ25lZF9jZWxsIHBoYW5kbGU7CisgIH0gYXJnczsKKyAgZGV2aWNlX2luc3RhbmNlICppaGFuZGxlOworICBkZXZpY2UgKnBoYW5kbGUgPSBOVUxMOworICAvKiByZWFkIHRoZSBhcmdzIGluICovCisgIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksIDEsIDEsIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKKyAgICByZXR1cm4gLTE7CisgIGloYW5kbGUgPSBleHRlcm5hbF90b19kZXZpY2VfaW5zdGFuY2UoZGF0YS0+cm9vdCwgYXJncy5paGFuZGxlKTsKKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJpbnN0YW5jZS10by1wYWNrYWdlIC0gaW4gLSBpaGFuZGxlPTB4JWx4KDB4JWx4YCVzJylcbiIsCisJCQkodW5zaWduZWQgbG9uZylhcmdzLmloYW5kbGUsCisJCQkodW5zaWduZWQgbG9uZylpaGFuZGxlLAorCQkJaWhhbmRsZV9uYW1lKGloYW5kbGUpKSk7CisgIC8qIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgcGhhbmRsZSAqLworICBpZiAoaWhhbmRsZSA9PSBOVUxMKSB7CisgICAgcGhhbmRsZSA9IE5VTEw7CisgICAgYXJncy5waGFuZGxlID0gLTE7CisgIH0KKyAgZWxzZSB7CisgICAgcGhhbmRsZSA9IGRldmljZV9pbnN0YW5jZV9kZXZpY2UoaWhhbmRsZSk7CisgICAgYXJncy5waGFuZGxlID0gZGV2aWNlX3RvX2V4dGVybmFsKHBoYW5kbGUpOworICB9CisgIC8qIHJldHVybiB0aGUgcmVzdWx0ICovCisgIFRSQUNFKHRyYWNlX29zX2VtdWwsICgiaW5zdGFuY2UtdG8tcGFja2FnZSAtIG91dCAtIHBoYW5kbGU9MHglbHgoMHglbHhgJXMnKVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKWFyZ3MucGhhbmRsZSwKKwkJCSh1bnNpZ25lZCBsb25nKXBoYW5kbGUsCisJCQkocGhhbmRsZSA9PSBOVUxMID8gIiIgOiBkZXZpY2VfbmFtZShwaGFuZGxlKSkpKTsKKyAgY2hpcnBfd3JpdGVfaDJ0X2FyZ3MoJmFyZ3MsCisJCSAgICAgICBzaXplb2YoYXJncyksCisJCSAgICAgICBkYXRhLAorCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY2hpcnBfZW11bF9nZXRwcm9wbGVuKG9zX2VtdWxfZGF0YSAqZGF0YSwKKwkJICAgICAgY3B1ICpwcm9jZXNzb3IsCisJCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBzdHJ1Y3QgZ2V0cHJvcGxlbl9hcmdzIHsKKyAgICAvKmluKi8KKyAgICB1bnNpZ25lZF9jZWxsIHBoYW5kbGU7CisgICAgdW5zaWduZWRfY2VsbCBuYW1lOworICAgIC8qb3V0Ki8KKyAgICB1bnNpZ25lZF9jZWxsIHByb3BsZW47CisgIH0gYXJnczsKKyAgY2hhciBuYW1lWzMyXTsKKyAgZGV2aWNlICpwaGFuZGxlOworICAvKiByZWFkIHRoZSBhcmdzIGluICovCisgIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksIDIsIDEsIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKKyAgICByZXR1cm4gLTE7CisgIHBoYW5kbGUgPSBleHRlcm5hbF90b19kZXZpY2UoZGF0YS0+cm9vdCwgYXJncy5waGFuZGxlKTsKKyAgZW11bF9yZWFkX3N0cmluZyhuYW1lLAorCQkgICBhcmdzLm5hbWUsCisJCSAgIHNpemVvZihuYW1lKSwKKwkJICAgcHJvY2Vzc29yLCBjaWEpOworICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoImdldHByb3BsZW4gLSBpbiAtIHBoYW5kbGU9MHglbHgoMHglbHhgJXMnKSBuYW1lPWAlcydcbiIsCisJCQkodW5zaWduZWQgbG9uZylhcmdzLnBoYW5kbGUsCisJCQkodW5zaWduZWQgbG9uZylwaGFuZGxlLAorCQkJKHBoYW5kbGUgPT0gTlVMTCA/ICIiIDogZGV2aWNlX25hbWUocGhhbmRsZSkpLAorCQkJbmFtZSkpOworICAvKiBmaW5kIG91ciBwcm9wIGFuZCBnZXQgaXRzIGxlbmd0aCAqLworICBpZiAoYXJncy5waGFuZGxlID09IDAKKyAgICAgIHx8IHBoYW5kbGUgPT0gTlVMTCkgeworICAgIGFyZ3MucHJvcGxlbiA9IC0xOworICB9CisgIGVsc2UgeworICAgIGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqcHJvcCA9IGRldmljZV9maW5kX3Byb3BlcnR5KHBoYW5kbGUsIG5hbWUpOworICAgIGlmIChwcm9wID09IChkZXZpY2VfcHJvcGVydHkqKTApIHsKKyAgICAgIGFyZ3MucHJvcGxlbiA9IC0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGFyZ3MucHJvcGxlbiA9IHByb3AtPnNpemVvZl9hcnJheTsKKyAgICB9CisgIH0KKyAgLyogcmV0dXJuIHRoZSByZXN1bHQgKi8KKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJnZXRwcm9wbGVuIC0gb3V0IC0gcHJvcGxlbj0lbGRcbiIsCisJCQkodW5zaWduZWQgbG9uZylhcmdzLnByb3BsZW4pKTsKKyAgY2hpcnBfd3JpdGVfaDJ0X2FyZ3MoJmFyZ3MsCisJCSAgICAgICBzaXplb2YoYXJncyksCisJCSAgICAgICBkYXRhLAorCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY2hpcnBfZW11bF9nZXRwcm9wKG9zX2VtdWxfZGF0YSAqZGF0YSwKKwkJICAgY3B1ICpwcm9jZXNzb3IsCisJCSAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBzdHJ1Y3QgZ2V0cHJvcF9hcmdzIHsKKyAgICAvKmluKi8KKyAgICB1bnNpZ25lZF9jZWxsIHBoYW5kbGU7CisgICAgdW5zaWduZWRfY2VsbCBuYW1lOworICAgIHVuc2lnbmVkX2NlbGwgYnVmOworICAgIHVuc2lnbmVkX2NlbGwgYnVmbGVuOworICAgIC8qb3V0Ki8KKyAgICB1bnNpZ25lZF9jZWxsIHNpemU7CisgIH0gYXJnczsKKyAgY2hhciBuYW1lWzMyXTsKKyAgZGV2aWNlICpwaGFuZGxlOworICAvKiByZWFkIGluIHRoZSBhcmdzLCB0aGUgcmV0dXJuIGlzIG9wdGlvbmFsICovCisgIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksIDQsIC0xLCBkYXRhLCBwcm9jZXNzb3IsIGNpYSkpCisgICAgcmV0dXJuIC0xOworICBwaGFuZGxlID0gZXh0ZXJuYWxfdG9fZGV2aWNlKGRhdGEtPnJvb3QsIGFyZ3MucGhhbmRsZSk7CisgIGVtdWxfcmVhZF9zdHJpbmcobmFtZSwKKwkJICAgYXJncy5uYW1lLAorCQkgICBzaXplb2YobmFtZSksCisJCSAgIHByb2Nlc3NvciwgY2lhKTsKKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJnZXRwcm9wIC0gaW4gLSBwaGFuZGxlPTB4JWx4KDB4JWx4YCVzJykgbmFtZT1gJXMnIGJ1Zj0weCVseCBidWZsZW49JWxkXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5waGFuZGxlLAorCQkJKHVuc2lnbmVkIGxvbmcpcGhhbmRsZSwKKwkJCShwaGFuZGxlID09IE5VTEwgPyAiIiA6IGRldmljZV9uYW1lKHBoYW5kbGUpKSwKKwkJCW5hbWUsCisJCQkodW5zaWduZWQgbG9uZylhcmdzLmJ1ZiwKKwkJCSh1bnNpZ25lZCBsb25nKWFyZ3MuYnVmbGVuKSk7CisgIC8qIGdldCB0aGUgcHJvcGVydHkgKi8KKyAgaWYgKGFyZ3MucGhhbmRsZSA9PSAwCisgICAgICB8fCBwaGFuZGxlID09IE5VTEwpIHsKKyAgICBhcmdzLnNpemUgPSAtMTsKKyAgfQorICBlbHNlIHsKKyAgICBjb25zdCBkZXZpY2VfcHJvcGVydHkgKnByb3AgPSBkZXZpY2VfZmluZF9wcm9wZXJ0eShwaGFuZGxlLCBuYW1lKTsKKyAgICBpZiAocHJvcCA9PSBOVUxMKSB7CisgICAgICBhcmdzLnNpemUgPSAtMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpbnQgc2l6ZSA9IGFyZ3MuYnVmbGVuOworICAgICAgaWYgKHNpemUgPiBwcm9wLT5zaXplb2ZfYXJyYXkpCisJc2l6ZSA9IHByb3AtPnNpemVvZl9hcnJheTsKKyAgICAgIGVtdWxfd3JpdGVfYnVmZmVyKHByb3AtPmFycmF5LCBhcmdzLmJ1ZiwKKwkJCXNpemUsCisJCQlwcm9jZXNzb3IsIGNpYSk7CisgICAgICBhcmdzLnNpemUgPSBzaXplOworICAgICAgc3dpdGNoIChwcm9wLT50eXBlKSB7CisgICAgICBjYXNlIHN0cmluZ19wcm9wZXJ0eToKKwlUUkFDRSh0cmFjZV9vc19lbXVsLCAoImdldHByb3AgLSBzdHJpbmcgYCVzJ1xuIiwKKwkJCSAgICAgIGRldmljZV9maW5kX3N0cmluZ19wcm9wZXJ0eShwaGFuZGxlLCBuYW1lKSkpOworCWJyZWFrOworICAgICAgY2FzZSBpaGFuZGxlX3Byb3BlcnR5OgorCVRSQUNFKHRyYWNlX29zX2VtdWwsICgiZ2V0cHJvcCAtIGloYW5kbGU9MHglbHgoMHglbHhgJXMnKVxuIiwKKwkJCSAgICAgIEJFMkhfY2VsbCgqKHVuc2lnbmVkX2NlbGwqKXByb3AtPmFycmF5KSwKKwkJCSAgICAgICh1bnNpZ25lZCBsb25nKWRldmljZV9maW5kX2loYW5kbGVfcHJvcGVydHkocGhhbmRsZSwgbmFtZSksCisJCQkgICAgICBpaGFuZGxlX25hbWUoZGV2aWNlX2ZpbmRfaWhhbmRsZV9wcm9wZXJ0eShwaGFuZGxlLCBuYW1lKSkpKTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIHdyaXRlIGJhY2sgdGhlIHJlc3VsdCAqLworICBpZiAoZGF0YS0+bl9yZXR1cm5zID09IDApCisgICAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJnZXRwcm9wIC0gb3V0IC0gc2l6ZT0lbGQgKG5vdCByZXR1cm5lZClcbiIsCisJCQkgICh1bnNpZ25lZCBsb25nKWFyZ3Muc2l6ZSkpOworICBlbHNlIHsKKyAgICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoImdldHByb3AgLSBvdXQgLSBzaXplPSVsZFxuIiwKKwkJCSAgKHVuc2lnbmVkIGxvbmcpYXJncy5zaXplKSk7CisgICAgY2hpcnBfd3JpdGVfaDJ0X2FyZ3MoJmFyZ3MsCisJCQkgc2l6ZW9mKGFyZ3MpLAorCQkJIGRhdGEsCisJCQkgcHJvY2Vzc29yLCBjaWEpOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitjaGlycF9lbXVsX25leHRwcm9wKG9zX2VtdWxfZGF0YSAqZGF0YSwKKwkJICAgIGNwdSAqcHJvY2Vzc29yLAorCQkgICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHN0cnVjdCBuZXh0cHJvcF9hcmdzIHsKKyAgICAvKmluKi8KKyAgICB1bnNpZ25lZF9jZWxsIHBoYW5kbGU7CisgICAgdW5zaWduZWRfY2VsbCBwcmV2aW91czsKKyAgICB1bnNpZ25lZF9jZWxsIGJ1ZjsKKyAgICAvKm91dCovCisgICAgdW5zaWduZWRfY2VsbCBmbGFnOworICB9IGFyZ3M7CisgIGNoYXIgcHJldmlvdXNbMzJdOworICBkZXZpY2UgKnBoYW5kbGU7CisgIC8qIHJlYWQgaW4gdGhlIGFyZ3MgKi8KKyAgaWYgKGNoaXJwX3JlYWRfdDJoX2FyZ3MoJmFyZ3MsIHNpemVvZihhcmdzKSwgMywgMSwgZGF0YSwgcHJvY2Vzc29yLCBjaWEpKQorICAgIHJldHVybiAtMTsKKyAgcGhhbmRsZSA9IGV4dGVybmFsX3RvX2RldmljZShkYXRhLT5yb290LCBhcmdzLnBoYW5kbGUpOworICBlbXVsX3JlYWRfc3RyaW5nKHByZXZpb3VzLAorCQkgICBhcmdzLnByZXZpb3VzLAorCQkgICBzaXplb2YocHJldmlvdXMpLAorCQkgICBwcm9jZXNzb3IsIGNpYSk7CisgIFRSQUNFKHRyYWNlX29zX2VtdWwsICgibmV4dHByb3AgLSBpbiAtIHBoYW5kbGU9MHglbHgoMHglbHhgJXMnKSBwcmV2aW91cz1gJXMnIGJ1Zj0weCVseFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKWFyZ3MucGhhbmRsZSwKKwkJCSh1bnNpZ25lZCBsb25nKXBoYW5kbGUsCisJCQkocGhhbmRsZSA9PSBOVUxMID8gIiIgOiBkZXZpY2VfbmFtZShwaGFuZGxlKSksCisJCQlwcmV2aW91cywKKwkJCSh1bnNpZ25lZCBsb25nKWFyZ3MuYnVmKSk7CisgIC8qIGZpbmQgdGhlIG5leHQgcHJvcGVydHkgKi8KKyAgaWYgKGFyZ3MucGhhbmRsZSA9PSAwCisgICAgICB8fCBwaGFuZGxlID09IE5VTEwpIHsKKyAgICBhcmdzLmZsYWcgPSAtMTsKKyAgfQorICBlbHNlIHsKKyAgICBjb25zdCBkZXZpY2VfcHJvcGVydHkgKnByZXZfcHJvcCA9IGRldmljZV9maW5kX3Byb3BlcnR5KHBoYW5kbGUsIHByZXZpb3VzKTsKKyAgICBpZiAocHJldl9wcm9wID09IE5VTEwpIHsKKyAgICAgIGFyZ3MuZmxhZyA9IC0xOyAvKiBuYW1lIGludmFsaWQgKi8KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBjb25zdCBkZXZpY2VfcHJvcGVydHkgKm5leHRfcHJvcDsKKyAgICAgIG5leHRfcHJvcCA9IGRldmljZV9uZXh0X3Byb3BlcnR5KHByZXZfcHJvcCk7CisgICAgICBpZiAobmV4dF9wcm9wID09IE5VTEwpIHsKKwlhcmdzLmZsYWcgPSAwOyAvKiBsYXN0IHByb3BlcnR5ICovCisgICAgICB9CisgICAgICBlbHNlIHsKKwllbXVsX3dyaXRlX2J1ZmZlcihuZXh0X3Byb3AtPm5hbWUsIGFyZ3MuYnVmLCBzdHJsZW4obmV4dF9wcm9wLT5uYW1lKSwKKwkJCSAgcHJvY2Vzc29yLCBjaWEpOworCVRSQUNFKHRyYWNlX29zX2VtdWwsICgibmV4dHByb3AgLSBuYW1lPWAlcydcbiIsIG5leHRfcHJvcC0+bmFtZSkpOworCWFyZ3MuZmxhZyA9IDE7IC8qIHdvcmtlZCBvayAqLworICAgICAgfQorICAgIH0KKyAgfQorICAvKiB3cml0ZSBiYWNrIHRoZSByZXN1bHQgKi8KKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJuZXh0cHJvcCAtIG91dCAtIGZsYWc9JWxkXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5mbGFnKSk7CisgIGNoaXJwX3dyaXRlX2gydF9hcmdzKCZhcmdzLAorCQkgICAgICAgc2l6ZW9mKGFyZ3MpLAorCQkgICAgICAgZGF0YSwKKwkJICAgICAgIHByb2Nlc3NvciwgY2lhKTsKKyAgcmV0dXJuIDA7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50CitjaGlycF9lbXVsX3NldHByb3Aob3NfZW11bF9kYXRhICpkYXRhLAorCQkgICBjcHUgKnByb2Nlc3NvciwKKwkJICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGVycm9yKCJjaGlycDogc2V0cHJvcCBtZXRob2Qgbm90IGltcGxlbWVudGVkXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorY2hpcnBfZW11bF9jYW5vbihvc19lbXVsX2RhdGEgKmRhdGEsCisJCSBjcHUgKnByb2Nlc3NvciwKKwkJIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBzdHJ1Y3QgY2Fub25fYXJncyB7CisgICAgLyppbiovCisgICAgdW5zaWduZWRfY2VsbCBkZXZpY2Vfc3BlY2lmaWVyOworICAgIHVuc2lnbmVkX2NlbGwgYnVmOworICAgIHVuc2lnbmVkX2NlbGwgYnVmbGVuOworICAgIC8qb3V0Ki8KKyAgICB1bnNpZ25lZF9jZWxsIGxlbmd0aDsKKyAgfSBhcmdzOworICBjaGFyIGRldmljZV9zcGVjaWZpZXJbMTAyNF07CisgIGRldmljZSAqcGhhbmRsZTsKKyAgY29uc3QgY2hhciAqcGF0aDsKKyAgaW50IGxlbmd0aDsKKyAgLyogcmVhZCBpbiB0aGUgYXJncyAqLworICBpZiAoY2hpcnBfcmVhZF90MmhfYXJncygmYXJncywgc2l6ZW9mKGFyZ3MpLCAzLCAxLCBkYXRhLCBwcm9jZXNzb3IsIGNpYSkpCisgICAgcmV0dXJuIC0xOworICBlbXVsX3JlYWRfc3RyaW5nKGRldmljZV9zcGVjaWZpZXIsCisJCSAgIGFyZ3MuZGV2aWNlX3NwZWNpZmllciwKKwkJICAgc2l6ZW9mKGRldmljZV9zcGVjaWZpZXIpLAorCQkgICBwcm9jZXNzb3IsIGNpYSk7CisgIFRSQUNFKHRyYWNlX29zX2VtdWwsICgiY2Fub24gLSBpbiAtIGRldmljZV9zcGVjaWZpZXI9YCVzJyBidWY9MHglbHggYnVmbGVuPSVseFxuIiwKKwkJCWRldmljZV9zcGVjaWZpZXIsCisJCQkodW5zaWduZWQgbG9uZylhcmdzLmJ1ZiwKKwkJCSh1bnNpZ25lZCBsb25nKWFyZ3MuYnVmbGVuKSk7CisgIC8qIGNhbm9uIHRoZSBuYW1lICovCisgIHBoYW5kbGUgPSB0cmVlX2ZpbmRfZGV2aWNlKGRhdGEtPnJvb3QsIGRldmljZV9zcGVjaWZpZXIpOworICBpZiAocGhhbmRsZSA9PSBOVUxMKSB7CisgICAgbGVuZ3RoID0gLTE7CisgICAgcGF0aCA9ICIiOworICAgIGFyZ3MubGVuZ3RoID0gLTE7CisgIH0KKyAgZWxzZSB7CisgICAgcGF0aCA9IGRldmljZV9wYXRoKHBoYW5kbGUpOworICAgIGxlbmd0aCA9IHN0cmxlbihwYXRoKTsKKyAgICBpZiAobGVuZ3RoID49IGFyZ3MuYnVmbGVuKQorICAgICAgbGVuZ3RoID0gYXJncy5idWZsZW4gLSAxOworICAgIGVtdWxfd3JpdGVfYnVmZmVyKHBhdGgsIGFyZ3MuYnVmLCBsZW5ndGgsCisJCSAgICAgIHByb2Nlc3NvciwgY2lhKTsKKyAgICBhcmdzLmxlbmd0aCA9IGxlbmd0aDsKKyAgfQorICAvKiB3cml0ZSBiYWNrIHRoZSByZXN1bHQgKi8KKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJjYW5vbiAtIG91dCAtIGxlbmd0aD0lbGQgYnVmPWAlcydcbiIsCisJCQkodW5zaWduZWQgbG9uZylhcmdzLmxlbmd0aCwKKwkJCXBhdGgpKTsKKyAgY2hpcnBfd3JpdGVfaDJ0X2FyZ3MoJmFyZ3MsCisJCSAgICAgICBzaXplb2YoYXJncyksCisJCSAgICAgICBkYXRhLAorCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY2hpcnBfZW11bF9maW5kZGV2aWNlKG9zX2VtdWxfZGF0YSAqZGF0YSwKKwkJICAgICAgY3B1ICpwcm9jZXNzb3IsCisJCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBzdHJ1Y3QgZmluZGRldmljZV9hcmdzIHsKKyAgICAvKmluKi8KKyAgICB1bnNpZ25lZF9jZWxsIGRldmljZV9zcGVjaWZpZXI7CisgICAgLypvdXQqLworICAgIHVuc2lnbmVkX2NlbGwgcGhhbmRsZTsKKyAgfSBhcmdzOworICBjaGFyIGRldmljZV9zcGVjaWZpZXJbMTAyNF07CisgIGRldmljZSAqcGhhbmRsZTsKKyAgLyogZ2V0IHRoZSBhcmdzICovCisgIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksIDEsIDEsIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKKyAgICByZXR1cm4gLTE7CisgIGVtdWxfcmVhZF9zdHJpbmcoZGV2aWNlX3NwZWNpZmllciwKKwkJICAgYXJncy5kZXZpY2Vfc3BlY2lmaWVyLAorCQkgICBzaXplb2YoZGV2aWNlX3NwZWNpZmllciksCisJCSAgIHByb2Nlc3NvciwgY2lhKTsKKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJmaW5kZGV2aWNlIC0gaW4gLSBkZXZpY2Vfc3BlY2lmaWVyPWAlcydcbiIsCisJCQlkZXZpY2Vfc3BlY2lmaWVyKSk7CisgIC8qIGZpbmQgdGhlIGRldmljZSAqLworICBwaGFuZGxlID0gdHJlZV9maW5kX2RldmljZShkYXRhLT5yb290LCBkZXZpY2Vfc3BlY2lmaWVyKTsKKyAgaWYgKHBoYW5kbGUgPT0gTlVMTCkKKyAgICBhcmdzLnBoYW5kbGUgPSAtMTsKKyAgZWxzZQorICAgIGFyZ3MucGhhbmRsZSA9IGRldmljZV90b19leHRlcm5hbChwaGFuZGxlKTsKKyAgLyogcmV0dXJuIGl0cyBwaGFuZGxlICovCisgIFRSQUNFKHRyYWNlX29zX2VtdWwsICgiZmluZGRldmljZSAtIG91dCAtIHBoYW5kbGU9MHglbHgoMHglbHhgJXMnKVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKWFyZ3MucGhhbmRsZSwKKwkJCSh1bnNpZ25lZCBsb25nKXBoYW5kbGUsCisJCQkocGhhbmRsZSA9PSBOVUxMID8gIiIgOiBkZXZpY2VfbmFtZShwaGFuZGxlKSkpKTsKKyAgY2hpcnBfd3JpdGVfaDJ0X2FyZ3MoJmFyZ3MsCisJCSAgICAgICBzaXplb2YoYXJncyksCisJCSAgICAgICBkYXRhLAorCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY2hpcnBfZW11bF9pbnN0YW5jZV90b19wYXRoKG9zX2VtdWxfZGF0YSAqZGF0YSwKKwkJCSAgICBjcHUgKnByb2Nlc3NvciwKKwkJCSAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgc3RydWN0IGluc3RhbmNlX3RvX3BhdGhfYXJncyB7CisgICAgLyppbiovCisgICAgdW5zaWduZWRfY2VsbCBpaGFuZGxlOworICAgIHVuc2lnbmVkX2NlbGwgYnVmOworICAgIHVuc2lnbmVkX2NlbGwgYnVmbGVuOworICAgIC8qb3V0Ki8KKyAgICB1bnNpZ25lZF9jZWxsIGxlbmd0aDsKKyAgfSBhcmdzOworICBkZXZpY2VfaW5zdGFuY2UgKmloYW5kbGU7CisgIGNvbnN0IGNoYXIgKnBhdGg7CisgIGludCBsZW5ndGg7CisgIC8qIGdldCB0aGUgYXJncyAqLworICBpZiAoY2hpcnBfcmVhZF90MmhfYXJncygmYXJncywgc2l6ZW9mKGFyZ3MpLCAzLCAxLCBkYXRhLCBwcm9jZXNzb3IsIGNpYSkpCisgICAgcmV0dXJuIC0xOworICBpaGFuZGxlID0gZXh0ZXJuYWxfdG9fZGV2aWNlX2luc3RhbmNlKGRhdGEtPnJvb3QsIGFyZ3MuaWhhbmRsZSk7CisgIFRSQUNFKHRyYWNlX29zX2VtdWwsICgiaW5zdGFuY2UtdG8tcGF0aCAtIGluIC0gaWhhbmRsZT0weCVseCgweCVseGAlcycpIGJ1Zj0weCVseCBidWZsZW49JWxkXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5paGFuZGxlLAorCQkJKHVuc2lnbmVkIGxvbmcpaWhhbmRsZSwKKwkJCWloYW5kbGVfbmFtZShpaGFuZGxlKSwKKwkJCSh1bnNpZ25lZCBsb25nKWFyZ3MuYnVmLAorCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5idWZsZW4pKTsKKyAgLyogZ2V0IHRoZSBkZXZpY2VzIG5hbWUgKi8KKyAgaWYgKGloYW5kbGUgPT0gTlVMTCkgeworICAgIGFyZ3MubGVuZ3RoID0gLTE7CisgICAgcGF0aCA9ICIobnVsbCkiOworICB9CisgIGVsc2UgeworICAgIHBhdGggPSBkZXZpY2VfaW5zdGFuY2VfcGF0aChpaGFuZGxlKTsKKyAgICBsZW5ndGggPSBzdHJsZW4ocGF0aCk7CisgICAgaWYgKGxlbmd0aCA+PSBhcmdzLmJ1ZmxlbikKKyAgICAgIGxlbmd0aCA9IGFyZ3MuYnVmbGVuIC0gMTsKKyAgICBlbXVsX3dyaXRlX2J1ZmZlcihwYXRoLCBhcmdzLmJ1ZiwgbGVuZ3RoLAorCQkgICAgICBwcm9jZXNzb3IsIGNpYSk7CisgICAgYXJncy5sZW5ndGggPSBsZW5ndGg7CisgIH0KKyAgLyogcmV0dXJuIGl0cyBwaGFuZGxlICovCisgIFRSQUNFKHRyYWNlX29zX2VtdWwsICgiaW5zdGFuY2UtdG8tcGF0aCAtIG91dCAtIGxlbmd0aD0lbGQgYnVmPWAlcycpXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5sZW5ndGgsCisJCQlwYXRoKSk7CisgIGNoaXJwX3dyaXRlX2gydF9hcmdzKCZhcmdzLAorCQkgICAgICAgc2l6ZW9mKGFyZ3MpLAorCQkgICAgICAgZGF0YSwKKwkJICAgICAgIHByb2Nlc3NvciwgY2lhKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NoaXJwX2VtdWxfcGFja2FnZV90b19wYXRoKG9zX2VtdWxfZGF0YSAqZGF0YSwKKwkJCSAgIGNwdSAqcHJvY2Vzc29yLAorCQkJICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHN0cnVjdCBwYWNrYWdlX3RvX3BhdGhfYXJncyB7CisgICAgLyppbiovCisgICAgdW5zaWduZWRfY2VsbCBwaGFuZGxlOworICAgIHVuc2lnbmVkX2NlbGwgYnVmOworICAgIHVuc2lnbmVkX2NlbGwgYnVmbGVuOworICAgIC8qb3V0Ki8KKyAgICB1bnNpZ25lZF9jZWxsIGxlbmd0aDsKKyAgfSBhcmdzOworICBkZXZpY2UgKnBoYW5kbGU7CisgIGNvbnN0IGNoYXIgKnBhdGg7CisgIC8qIGdldCB0aGUgYXJncyAqLworICBpZiAoY2hpcnBfcmVhZF90MmhfYXJncygmYXJncywgc2l6ZW9mKGFyZ3MpLCAzLCAxLCBkYXRhLCBwcm9jZXNzb3IsIGNpYSkpCisgICAgcmV0dXJuIC0xOworICBwaGFuZGxlID0gZXh0ZXJuYWxfdG9fZGV2aWNlKGRhdGEtPnJvb3QsIGFyZ3MucGhhbmRsZSk7CisgIFRSQUNFKHRyYWNlX29zX2VtdWwsICgicGFja2FnZS10by1wYXRoIC0gaW4gLSBwaGFuZGxlPTB4JWx4KDB4JWx4YCVzJykgYnVmPTB4JWx4IGJ1Zmxlbj0lbGRcbiIsCisJCQkodW5zaWduZWQgbG9uZylhcmdzLnBoYW5kbGUsCisJCQkodW5zaWduZWQgbG9uZylwaGFuZGxlLAorCQkJKHBoYW5kbGUgPT0gTlVMTCA/ICIiIDogZGV2aWNlX25hbWUocGhhbmRsZSkpLAorCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5idWYsCisJCQkodW5zaWduZWQgbG9uZylhcmdzLmJ1ZmxlbikpOworICAvKiBnZXQgdGhlIGRldmljZXMgbmFtZSAqLworICBpZiAocGhhbmRsZSA9PSBOVUxMKSB7CisgICAgYXJncy5sZW5ndGggPSAtMTsKKyAgICBwYXRoID0gIihudWxsKSI7CisgIH0KKyAgZWxzZSB7CisgICAgaW50IGxlbmd0aDsKKyAgICBwYXRoID0gZGV2aWNlX3BhdGgocGhhbmRsZSk7CisgICAgbGVuZ3RoID0gc3RybGVuKHBhdGgpOworICAgIGlmIChsZW5ndGggPj0gYXJncy5idWZsZW4pCisgICAgICBsZW5ndGggPSBhcmdzLmJ1ZmxlbiAtIDE7CisgICAgZW11bF93cml0ZV9idWZmZXIocGF0aCwgYXJncy5idWYsIGxlbmd0aCwKKwkJICAgICAgcHJvY2Vzc29yLCBjaWEpOworICAgIGFyZ3MubGVuZ3RoID0gbGVuZ3RoOworICB9CisgIC8qIHJldHVybiBpdHMgcGhhbmRsZSAqLworICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoInBhY2thZ2UtdG8tcGF0aCAtIG91dCAtIGxlbmd0aD0lbGQgYnVmPWAlcycpXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5sZW5ndGgsCisJCQlwYXRoKSk7CisgIGNoaXJwX3dyaXRlX2gydF9hcmdzKCZhcmdzLAorCQkgICAgICAgc2l6ZW9mKGFyZ3MpLAorCQkgICAgICAgZGF0YSwKKwkJICAgICAgIHByb2Nlc3NvciwgY2lhKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NoaXJwX2VtdWxfY2FsbF9tZXRob2Qob3NfZW11bF9kYXRhICpkYXRhLAorCQkgICAgICAgY3B1ICpwcm9jZXNzb3IsCisJCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgc3RydWN0IGNhbGxfbWV0aG9kX2FyZ3MgeworICAgIC8qaW4qLworICAgIHVuc2lnbmVkX2NlbGwgbWV0aG9kOworICAgIHVuc2lnbmVkX2NlbGwgaWhhbmRsZTsKKyAgICAvKmluL291dCovCisgICAgdW5zaWduZWRfY2VsbCBzdGFja1sxM107IC8qNmluICsgNm91dCArIGNhdGNoICovCisgIH0gYXJnczsKKyAgY2hhciBtZXRob2RbMzJdOworICBkZXZpY2VfaW5zdGFuY2UgKmloYW5kbGU7CisgIC8qIHNvbWUgdXNlZnVsIGluZm8gYWJvdXQgb3VyIG1pbmkgc3RhY2sgKi8KKyAgaW50IG5fc3RhY2tfYXJnczsKKyAgaW50IG5fc3RhY2tfcmV0dXJuczsKKyAgaW50IHN0YWNrX2NhdGNoX3Jlc3VsdDsKKyAgaW50IHN0YWNrX3JldHVybnM7CisgIC8qIHJlYWQgdGhlIGFyZ3MgKi8KKyAgaWYgKGNoaXJwX3JlYWRfdDJoX2FyZ3MoJmFyZ3MsIHNpemVvZihhcmdzKSwgLTEsIC0xLCBkYXRhLCBwcm9jZXNzb3IsIGNpYSkpCisgICAgcmV0dXJuIC0xOworICBlbXVsX3JlYWRfc3RyaW5nKG1ldGhvZCwKKwkJICAgYXJncy5tZXRob2QsCisJCSAgIHNpemVvZihtZXRob2QpLAorCQkgICBwcm9jZXNzb3IsIGNpYSk7CisgIGloYW5kbGUgPSBleHRlcm5hbF90b19kZXZpY2VfaW5zdGFuY2UoZGF0YS0+cm9vdCwgYXJncy5paGFuZGxlKTsKKyAgbl9zdGFja19hcmdzID0gZGF0YS0+bl9hcmdzIC0gMjsKKyAgbl9zdGFja19yZXR1cm5zID0gZGF0YS0+bl9yZXR1cm5zIC0gMTsKKyAgc3RhY2tfY2F0Y2hfcmVzdWx0ID0gbl9zdGFja19hcmdzOworICBzdGFja19yZXR1cm5zID0gc3RhY2tfY2F0Y2hfcmVzdWx0ICsgMTsKKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJjYWxsLW1ldGhvZCAtIGluIC0gbl9hcmdzPSVsZCBuX3JldHVybnM9JWxkIG1ldGhvZD1gJXMnIGloYW5kbGU9MHglbHgoMHglbHhgJXMnKVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKWRhdGEtPm5fYXJncywKKwkJCSh1bnNpZ25lZCBsb25nKWRhdGEtPm5fcmV0dXJucywKKwkJCW1ldGhvZCwKKwkJCSh1bnNpZ25lZCBsb25nKWFyZ3MuaWhhbmRsZSwKKwkJCSh1bnNpZ25lZCBsb25nKWloYW5kbGUsCisJCQlpaGFuZGxlX25hbWUoaWhhbmRsZSkpKTsKKyAgLyogc2VlIGlmIHdlIGNhbiBlbXVsYXRlIHRoaXMgbWV0aG9kICovCisgIGlmIChpaGFuZGxlID09IE5VTEwpIHsKKyAgICAvKiBPcGVuRmlybXdhcmUgZG9lc24ndCBkZWZpbmUgdGhpcyBlcnJvciAqLworICAgIGVycm9yKCJjaGlycDogaW52YWxpZCBpaGFuZGxlIHBhc3NlZCB0byBjYWxsLW1ldGhvZCBtZXRob2QiKTsKKyAgfQorICBlbHNlIHsKKyAgICBhcmdzLnN0YWNrW3N0YWNrX2NhdGNoX3Jlc3VsdF0gPQorICAgICAgZGV2aWNlX2luc3RhbmNlX2NhbGxfbWV0aG9kKGloYW5kbGUsCisJCQkJICBtZXRob2QsCisJCQkJICBuX3N0YWNrX2FyZ3MsCisJCQkJICAmYXJncy5zdGFja1swXSwKKwkJCQkgIG5fc3RhY2tfcmV0dXJucywKKwkJCQkgICZhcmdzLnN0YWNrW3N0YWNrX3JldHVybnNdKTsKKyAgfQorICAvKiBmaW5pc2hlZCAqLworICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoImNhbGwtbWV0aG9kIC0gb3V0IC0gY2F0Y2gtcmVzdWx0PSVsZFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKWFyZ3Muc3RhY2tbc3RhY2tfY2F0Y2hfcmVzdWx0XSkpOworICBjaGlycF93cml0ZV9oMnRfYXJncygmYXJncywKKwkJICAgICAgIHNpemVvZihhcmdzKSwKKwkJICAgICAgIGRhdGEsCisJCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7CisgIHJldHVybiAwOworfQorCisKKy8qIERldmljZSBJL08gKi8KKworc3RhdGljIGludAorY2hpcnBfZW11bF9vcGVuKG9zX2VtdWxfZGF0YSAqZGF0YSwKKwkJY3B1ICpwcm9jZXNzb3IsCisJCXVuc2lnbmVkX3dvcmQgY2lhKQoreworICBzdHJ1Y3Qgb3Blbl9hcmdzIHsKKyAgICAvKmluKi8KKyAgICB1bnNpZ25lZF9jZWxsIGRldmljZV9zcGVjaWZpZXI7CisgICAgLypvdXQqLworICAgIHVuc2lnbmVkX2NlbGwgaWhhbmRsZTsKKyAgfSBhcmdzOworICBjaGFyIGRldmljZV9zcGVjaWZpZXJbMTAyNF07CisgIGRldmljZV9pbnN0YW5jZSAqaWhhbmRsZTsKKyAgLyogcmVhZCB0aGUgYXJncyAqLworICBpZiAoY2hpcnBfcmVhZF90MmhfYXJncygmYXJncywgc2l6ZW9mKGFyZ3MpLCAxLCAxLCBkYXRhLCBwcm9jZXNzb3IsIGNpYSkpCisgICAgcmV0dXJuIC0xOworICBlbXVsX3JlYWRfc3RyaW5nKGRldmljZV9zcGVjaWZpZXIsCisJCSAgIGFyZ3MuZGV2aWNlX3NwZWNpZmllciwKKwkJICAgc2l6ZW9mKGRldmljZV9zcGVjaWZpZXIpLAorCQkgICBwcm9jZXNzb3IsIGNpYSk7CisgIFRSQUNFKHRyYWNlX29zX2VtdWwsICgib3BlbiAtIGluIC0gZGV2aWNlX3NwZWNpZmllcj1gJXMnXG4iLAorCQkJZGV2aWNlX3NwZWNpZmllcikpOworICAvKiBvcGVuIHRoZSBkZXZpY2UgKi8KKyAgaWhhbmRsZSA9IHRyZWVfaW5zdGFuY2UoZGF0YS0+cm9vdCwgZGV2aWNlX3NwZWNpZmllcik7CisgIGlmIChpaGFuZGxlID09IE5VTEwpCisgICAgYXJncy5paGFuZGxlID0gLTE7CisgIGVsc2UKKyAgICBhcmdzLmloYW5kbGUgPSBkZXZpY2VfaW5zdGFuY2VfdG9fZXh0ZXJuYWwoaWhhbmRsZSk7CisgIC8qIHJldHVybiB0aGUgaWhhbmRsZSByZXN1bHQgKi8KKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJvcGVuIC0gb3V0IC0gaWhhbmRsZT0weCVseCgweCVseGAlcycpXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5paGFuZGxlLAorCQkJKHVuc2lnbmVkIGxvbmcpaWhhbmRsZSwKKwkJCWloYW5kbGVfbmFtZShpaGFuZGxlKSkpOworICBjaGlycF93cml0ZV9oMnRfYXJncygmYXJncywKKwkJICAgICAgIHNpemVvZihhcmdzKSwKKwkJICAgICAgIGRhdGEsCisJCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitjaGlycF9lbXVsX2Nsb3NlKG9zX2VtdWxfZGF0YSAqZGF0YSwKKwkJIGNwdSAqcHJvY2Vzc29yLAorCQkgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHN0cnVjdCBjbG9zZV9hcmdzIHsKKyAgICAvKmluKi8KKyAgICB1bnNpZ25lZF9jZWxsIGloYW5kbGU7CisgICAgLypvdXQqLworICB9IGFyZ3M7CisgIGRldmljZV9pbnN0YW5jZSAqaWhhbmRsZTsKKyAgLyogcmVhZCB0aGUgYXJncyAqLworICBpZiAoY2hpcnBfcmVhZF90MmhfYXJncygmYXJncywgc2l6ZW9mKGFyZ3MpLCAxLCAwLCBkYXRhLCBwcm9jZXNzb3IsIGNpYSkpCisgICAgcmV0dXJuIC0xOworICBpaGFuZGxlID0gZXh0ZXJuYWxfdG9fZGV2aWNlX2luc3RhbmNlKGRhdGEtPnJvb3QsIGFyZ3MuaWhhbmRsZSk7CisgIFRSQUNFKHRyYWNlX29zX2VtdWwsICgiY2xvc2UgLSBpbiAtIGloYW5kbGU9MHglbHgoMHglbHhgJXMnKVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKWFyZ3MuaWhhbmRsZSwKKwkJCSh1bnNpZ25lZCBsb25nKWloYW5kbGUsCisJCQlpaGFuZGxlX25hbWUoaWhhbmRsZSkpKTsKKyAgLyogY2xvc2UgdGhlIGRldmljZSAqLworICBpZiAoaWhhbmRsZSA9PSBOVUxMKSB7CisgICAgLyogT3BlbkZpcm13YXJlIGRvZXNuJ3QgZGVmaW5lIHRoaXMgZXJyb3IgKi8KKyAgICBlcnJvcigiY2hpcnA6IGludmFsaWQgaWhhbmRsZSBwYXNzZWQgdG8gY2xvc2UgbWV0aG9kIik7CisgIH0KKyAgZWxzZSB7CisgICAgZGV2aWNlX2luc3RhbmNlX2RlbGV0ZShpaGFuZGxlKTsKKyAgfQorICAvKiByZXR1cm4gdGhlIGloYW5kbGUgcmVzdWx0ICovCisgIFRSQUNFKHRyYWNlX29zX2VtdWwsICgiY2xvc2UgLSBvdXRcbiIpKTsKKyAgY2hpcnBfd3JpdGVfaDJ0X2FyZ3MoJmFyZ3MsCisJCSAgICAgICBzaXplb2YoYXJncyksCisJCSAgICAgICBkYXRhLAorCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY2hpcnBfZW11bF9yZWFkKG9zX2VtdWxfZGF0YSAqZGF0YSwKKwkJY3B1ICpwcm9jZXNzb3IsCisJCXVuc2lnbmVkX3dvcmQgY2lhKQoreworICBzdHJ1Y3QgcmVhZF9hcmdzIHsKKyAgICAvKmluKi8KKyAgICB1bnNpZ25lZF9jZWxsIGloYW5kbGU7CisgICAgdW5zaWduZWRfY2VsbCBhZGRyOworICAgIHVuc2lnbmVkX2NlbGwgbGVuOworICAgIC8qb3V0Ki8KKyAgICB1bnNpZ25lZF9jZWxsIGFjdHVhbDsKKyAgfSBhcmdzOworICBjaGFyIGJ1ZlsxMDI0XTsKKyAgZGV2aWNlX2luc3RhbmNlICppaGFuZGxlOworICAvKiByZWFkIHRoZSBhcmdzICovCisgIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksIDMsIDEsIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKKyAgICByZXR1cm4gLTE7CisgIGloYW5kbGUgPSBleHRlcm5hbF90b19kZXZpY2VfaW5zdGFuY2UoZGF0YS0+cm9vdCwgYXJncy5paGFuZGxlKTsKKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJyZWFkIC0gaW4gLSBpaGFuZGxlPTB4JWx4KDB4JWx4YCVzJykgYWRkcj0weCVseCBsZW49JWxkXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5paGFuZGxlLAorCQkJKHVuc2lnbmVkIGxvbmcpaWhhbmRsZSwKKwkJCWloYW5kbGVfbmFtZShpaGFuZGxlKSwKKwkJCSh1bnNpZ25lZCBsb25nKWFyZ3MuYWRkciwKKwkJCSh1bnNpZ25lZCBsb25nKWFyZ3MubGVuKSk7CisgIGlmIChpaGFuZGxlID09IE5VTEwpIHsKKyAgICAvKiBPcGVuRmlybXdhcmUgZG9lc24ndCBkZWZpbmUgdGhpcyBlcnJvciAqLworICAgIGVycm9yKCJjaGlycDogaW52YWxpZCBpaGFuZGxlIHBhc3NlZCB0byByZWFkIG1ldGhvZCIpOworICB9CisgIGVsc2UgeworICAgIC8qIGRvIHRoZSByZWFkcyAqLworICAgIGludCBhY3R1YWwgPSAwOworICAgIHdoaWxlIChhY3R1YWwgPCBhcmdzLmxlbikgeworICAgICAgaW50IHJlbWFpbmluZyA9IGFyZ3MubGVuIC0gYWN0dWFsOworICAgICAgaW50IHRvX3JlYWQgPSAocmVtYWluaW5nIDw9IHNpemVvZihidWYpID8gcmVtYWluaW5nIDogc2l6ZW9mKGJ1ZikpOworICAgICAgaW50IG5yX3JlYWQgPSBkZXZpY2VfaW5zdGFuY2VfcmVhZChpaGFuZGxlLCBidWYsIHRvX3JlYWQpOworICAgICAgaWYgKG5yX3JlYWQgPCAwKSB7CisJYWN0dWFsID0gbnJfcmVhZDsgLyogdGhlIGVycm9yICovCisJYnJlYWs7CisgICAgICB9CisgICAgICBlbHNlIGlmIChucl9yZWFkID09IDApIHsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIGVtdWxfd3JpdGVfYnVmZmVyKGJ1ZiwKKwkJCWFyZ3MuYWRkciArIGFjdHVhbCwKKwkJCW5yX3JlYWQsCisJCQlwcm9jZXNzb3IsIGNpYSk7CisgICAgICBhY3R1YWwgKz0gbnJfcmVhZDsKKyAgICB9CisgICAgaWYgKGFjdHVhbCA+PSAwKSB7CisgICAgICBhcmdzLmFjdHVhbCA9IGFjdHVhbDsKKyAgICAgIGlmIChhY3R1YWwgPCBzaXplb2YoYnVmKSkKKwlidWZbYWN0dWFsXSA9ICdcMCc7CisgICAgICBlbHNlCisJYnVmW3NpemVvZihidWYpIC0gMV0gPSAnXDAnOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHN3aXRjaCAoYWN0dWFsKSB7CisgICAgICBjYXNlIHNpbV9pb19lb2Y6CisJYXJncy5hY3R1YWwgPSAwOworCWJyZWFrOworICAgICAgY2FzZSBzaW1faW9fbm90X3JlYWR5OgorCUFTU0VSVChzaW1faW9fbm90X3JlYWR5ID09IC0yKTsKKwlhcmdzLmFjdHVhbCA9IHNpbV9pb19ub3RfcmVhZHk7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCWVycm9yKCJCYWQgZXJyb3IgdmFsdWUgJWxkIiwgKGxvbmcpYWN0dWFsKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogcmV0dXJuIHRoZSByZXN1bHQgKi8KKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJyZWFkIC0gb3V0IC0gYWN0dWFsPSVsZCBgJXMnXG4iLAorCQkJKGxvbmcpYXJncy5hY3R1YWwsCisJCQkoKGFyZ3MuYWN0dWFsID4gMCAmJiBhcmdzLmFjdHVhbCA8IHNpemVvZihidWYpKSA/IGJ1ZiA6ICIiKQorCQkJKSk7CisgIGNoaXJwX3dyaXRlX2gydF9hcmdzKCZhcmdzLAorCQkgICAgICAgc2l6ZW9mKGFyZ3MpLAorCQkgICAgICAgZGF0YSwKKwkJICAgICAgIHByb2Nlc3NvciwgY2lhKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NoaXJwX2VtdWxfd3JpdGUob3NfZW11bF9kYXRhICpkYXRhLAorCQkgY3B1ICpwcm9jZXNzb3IsCisJCSB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgc3RydWN0IHdyaXRlX2FyZ3MgeworICAgIC8qaW4qLworICAgIHVuc2lnbmVkX2NlbGwgaWhhbmRsZTsKKyAgICB1bnNpZ25lZF9jZWxsIGFkZHI7CisgICAgdW5zaWduZWRfY2VsbCBsZW47CisgICAgLypvdXQqLworICAgIHVuc2lnbmVkX2NlbGwgYWN0dWFsOworICB9IGFyZ3M7CisgIGNoYXIgYnVmWzEwMjRdOworICBkZXZpY2VfaW5zdGFuY2UgKmloYW5kbGU7CisgIGludCBhY3R1YWw7CisgIC8qIGdldCB0aGUgYXJncyAqLworICBpZiAoY2hpcnBfcmVhZF90MmhfYXJncygmYXJncywgc2l6ZW9mKGFyZ3MpLCAzLCAxLCBkYXRhLCBwcm9jZXNzb3IsIGNpYSkpCisgICAgcmV0dXJuIC0xOworICBhY3R1YWwgPSBhcmdzLmxlbjsKKyAgaWYgKGFjdHVhbCA+PSBzaXplb2YoYnVmKSkKKyAgICBhY3R1YWwgPSBzaXplb2YoYnVmKSAtIDE7CisgIGVtdWxfcmVhZF9idWZmZXIoYnVmLAorCQkgICBhcmdzLmFkZHIsCisJCSAgIGFjdHVhbCwKKwkJICAgcHJvY2Vzc29yLCBjaWEpOworICBidWZbYWN0dWFsXSA9ICdcMCc7CisgIGloYW5kbGUgPSBleHRlcm5hbF90b19kZXZpY2VfaW5zdGFuY2UoZGF0YS0+cm9vdCwgYXJncy5paGFuZGxlKTsKKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJ3cml0ZSAtIGluIC0gaWhhbmRsZT0weCVseCgweCVseGAlcycpIGAlcycgKCVsZClcbiIsCisJCQkodW5zaWduZWQgbG9uZylhcmdzLmloYW5kbGUsCisJCQkodW5zaWduZWQgbG9uZylpaGFuZGxlLAorCQkJaWhhbmRsZV9uYW1lKGloYW5kbGUpLAorCQkJYnVmLCAobG9uZylhY3R1YWwpKTsKKyAgaWYgKGloYW5kbGUgPT0gTlVMTCkgeworICAgIC8qIE9wZW5GaXJtd2FyZSBkb2Vzbid0IGRlZmluZSB0aGlzIGVycm9yICovCisgICAgZXJyb3IoImNoaXJwOiBpbnZhbGlkIGloYW5kbGUgcGFzc2VkIHRvIHdyaXRlIG1ldGhvZCIpOworICB9CisgIGVsc2UgeworICAgIC8qIHdyaXRlIGl0IG91dCAqLworICAgIGFjdHVhbCA9IGRldmljZV9pbnN0YW5jZV93cml0ZShpaGFuZGxlLCBidWYsIGFjdHVhbCk7CisgICAgaWYgKGFjdHVhbCA8IDApCisgICAgICBhcmdzLmFjdHVhbCA9IDA7CisgICAgZWxzZQorICAgICAgYXJncy5hY3R1YWwgPSBhY3R1YWw7CisgIH0KKyAgLyogcmV0dXJuIHRoZSByZXN1bHQgKi8KKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJ3cml0ZSAtIG91dCAtIGFjdHVhbD0lbGRcbiIsCisJCQkobG9uZylhcmdzLmFjdHVhbCkpOworICBjaGlycF93cml0ZV9oMnRfYXJncygmYXJncywKKwkJICAgICAgIHNpemVvZihhcmdzKSwKKwkJICAgICAgIGRhdGEsCisJCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitjaGlycF9lbXVsX3NlZWsob3NfZW11bF9kYXRhICpkYXRhLAorCQljcHUgKnByb2Nlc3NvciwKKwkJdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHN0cnVjdCBzZWVrX2FyZ3MgeworICAgIC8qaW4qLworICAgIHVuc2lnbmVkX2NlbGwgaWhhbmRsZTsKKyAgICB1bnNpZ25lZF9jZWxsIHBvc19oaTsKKyAgICB1bnNpZ25lZF9jZWxsIHBvc19sbzsKKyAgICAvKm91dCovCisgICAgdW5zaWduZWRfY2VsbCBzdGF0dXM7CisgIH0gYXJnczsKKyAgaW50IHN0YXR1czsKKyAgZGV2aWNlX2luc3RhbmNlICppaGFuZGxlOworICAvKiBnZXQgdGhlIGFyZ3MgKi8KKyAgaWYgKGNoaXJwX3JlYWRfdDJoX2FyZ3MoJmFyZ3MsIHNpemVvZihhcmdzKSwgMywgMSwgZGF0YSwgcHJvY2Vzc29yLCBjaWEpKQorICAgIHJldHVybiAtMTsKKyAgaWhhbmRsZSA9IGV4dGVybmFsX3RvX2RldmljZV9pbnN0YW5jZShkYXRhLT5yb290LCBhcmdzLmloYW5kbGUpOworICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoInNlZWsgLSBpbiAtIGloYW5kbGU9MHglbHgoMHglbHhgJXMnKSBwb3MuaGk9MHglbHggcG9zLmxvPTB4JWx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5paGFuZGxlLAorCQkJKHVuc2lnbmVkIGxvbmcpaWhhbmRsZSwKKwkJCWloYW5kbGVfbmFtZShpaGFuZGxlKSwKKwkJCWFyZ3MucG9zX2hpLCBhcmdzLnBvc19sbykpOworICBpZiAoaWhhbmRsZSA9PSBOVUxMKSB7CisgICAgLyogT3BlbkZpcm13YXJlIGRvZXNuJ3QgZGVmaW5lIHRoaXMgZXJyb3IgKi8KKyAgICBlcnJvcigiY2hpcnA6IGludmFsaWQgaWhhbmRsZSBwYXNzZWQgdG8gc2VlayBtZXRob2QiKTsKKyAgfQorICBlbHNlIHsKKyAgICAvKiBzZWVrIGl0IG91dCAqLworICAgIHN0YXR1cyA9IGRldmljZV9pbnN0YW5jZV9zZWVrKGloYW5kbGUsIGFyZ3MucG9zX2hpLCBhcmdzLnBvc19sbyk7CisgICAgYXJncy5zdGF0dXMgPSBzdGF0dXM7CisgIH0KKyAgLyogcmV0dXJuIHRoZSByZXN1bHQgKi8KKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJzZWVrIC0gb3V0IC0gc3RhdHVzPSVsZFxuIiwKKwkJCShsb25nKWFyZ3Muc3RhdHVzKSk7CisgIGNoaXJwX3dyaXRlX2gydF9hcmdzKCZhcmdzLAorCQkgICAgICAgc2l6ZW9mKGFyZ3MpLAorCQkgICAgICAgZGF0YSwKKwkJICAgICAgIHByb2Nlc3NvciwgY2lhKTsKKyAgcmV0dXJuIDA7Cit9CisKKworLyogbWVtb3J5ICovCisKK3N0YXRpYyBpbnQKK2NoaXJwX2VtdWxfY2xhaW0ob3NfZW11bF9kYXRhICpkYXRhLAorCQkgY3B1ICpwcm9jZXNzb3IsCisJCSB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgLyogTk9URTogdGhlIGNsaWVudCBpbnRlcmZhY2UgY2xhaW0gcm91dGluZSBpcyAqdmVyeSogZGlmZmVyZW50IHRvCisgICAgIHRoZSAiY2xhaW0iIG1ldGhvZCBkZXNjcmliZWQgaW4gSUVFRS0xMjc1IGFwcGVuZGl4IEEuICBUaGUgbGF0dGVyCisgICAgIHVzZXMgcmVhbCBhZGRyZXNzZXMgd2hpbGUgdGhpcyB1c2VzIHZpcnR1YWwgKGVmZmVjdGl2ZSkKKyAgICAgYWRkcmVzc2VzLiAqLworICBzdHJ1Y3QgY2xhaW1fYXJncyB7CisgICAgLyogaW4gKi8KKyAgICB1bnNpZ25lZF9jZWxsIHZpcnQ7CisgICAgdW5zaWduZWRfY2VsbCBzaXplOworICAgIHVuc2lnbmVkX2NlbGwgYWxpZ247CisgICAgLyogb3V0ICovCisgICAgdW5zaWduZWRfY2VsbCBiYXNlYWRkcjsKKyAgfSBhcmdzOworICAvKiByZWFkIHRoZSBhcmdzICovCisgIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksCisJCQkgIDMgLypuX2FyZ3MqLywgMSAvKm5fcmV0dXJucyovLAorCQkJICBkYXRhLCBwcm9jZXNzb3IsIGNpYSkpCisgICAgcmV0dXJuIC0xOworICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoImNsYWltIC0gaW4gLSB2aXJ0PTB4JWx4IHNpemU9JWxkIGFsaWduPSVkXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpYXJncy52aXJ0LAorCQkJKGxvbmcgaW50KWFyZ3Muc2l6ZSwKKwkJCShpbnQpYXJncy5hbGlnbikpOworICAvKiB1c2UgdGhlIG1lbW9yeSBkZXZpY2UgdG8gYWxsb2NhdGUgKHJlYWwpIG1lbW9yeSBhdCB0aGUgcmVxdWVzdGVkCisgICAgIGFkZHJlc3MgKi8KKyAgeworICAgIGRldmljZV9pbnN0YW5jZSAqbWVtb3J5ID0gdHJlZV9maW5kX2loYW5kbGVfcHJvcGVydHkoZGF0YS0+cm9vdCwgIi9jaG9zZW4vbWVtb3J5Iik7CisgICAgdW5zaWduZWRfY2VsbCBtZW1faW5bM107CisgICAgdW5zaWduZWRfY2VsbCBtZW1fb3V0WzFdOworICAgIG1lbV9pblswXSA9IGFyZ3MuYWxpZ247IC8qdG9wLW9mLXN0YWNrKi8KKyAgICBtZW1faW5bMV0gPSBhcmdzLnNpemU7CisgICAgbWVtX2luWzJdID0gYXJncy52aXJ0OworICAgIGlmIChkZXZpY2VfaW5zdGFuY2VfY2FsbF9tZXRob2QobWVtb3J5LCAiY2xhaW0iLAorCQkJCSAgICAzLCBtZW1faW4sIDEsIG1lbV9vdXQpIDwgMCkKKyAgICAgIGVycm9yKCJjaGlycDogY2xhaW0gZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSB2aXJ0PTB4JWx4IHNpemU9JWxkIGFsaWduPSVkIiwKKwkgICAgKHVuc2lnbmVkIGxvbmcpYXJncy52aXJ0LAorCSAgICAobG9uZyBpbnQpYXJncy5zaXplLAorCSAgICAoaW50KWFyZ3MuYWxpZ24pOworICAgIGFyZ3MuYmFzZWFkZHIgPSBtZW1fb3V0WzBdOworICB9CisgIC8qIGlmIHVzaW5nIHZpcnR1YWwgYWRkcmVzc2VzLCBjcmVhdGUgYSAxLTEgbWFwIG9mIHRoaXMgYWRkcmVzcyBzcGFjZSAqLworICBpZiAoIWRhdGEtPnJlYWxfbW9kZSkgeworICAgIGVycm9yKCJjaGlycDogY2xhaW0gbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgdmlydHVhbCBtb2RlIik7CisgIH0KKyAgLyogcmV0dXJuIHRoZSBiYXNlIGFkZHJlc3MgKi8KKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJjbGFpbSAtIG91dCAtIGJhc2VhZGRyPTB4JWx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpYXJncy5iYXNlYWRkcikpOworICBjaGlycF93cml0ZV9oMnRfYXJncygmYXJncywKKwkJICAgICAgIHNpemVvZihhcmdzKSwKKwkJICAgICAgIGRhdGEsCisJCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitjaGlycF9lbXVsX3JlbGVhc2Uob3NfZW11bF9kYXRhICpkYXRhLAorCQkgICBjcHUgKnByb2Nlc3NvciwKKwkJICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIC8qIE5PVEU6IHRoZSBjbGllbnQgaW50ZXJmYWNlIHJlbGVhc2Ugcm91dGluZSBpcyAqdmVyeSogZGlmZmVyZW50IHRvCisgICAgIHRoZSAiY2xhaW0iIG1ldGhvZCBkZXNjcmliZWQgaW4gSUVFRS0xMjc1IGFwcGVuZGl4IEEuICBUaGUgbGF0dGVyCisgICAgIHVzZXMgcmVhbCBhZGRyZXNzZXMgd2hpbGUgdGhpcyB1c2VzIHZpcnR1YWwgKGVmZmVjdGl2ZSkKKyAgICAgYWRkcmVzc2VzLiAqLworICBzdHJ1Y3QgY2xhaW1fYXJncyB7CisgICAgLyogaW4gKi8KKyAgICB1bnNpZ25lZF9jZWxsIHZpcnQ7CisgICAgdW5zaWduZWRfY2VsbCBzaXplOworICAgIC8qIG91dCAqLworICB9IGFyZ3M7CisgIC8qIHJlYWQgdGhlIGFyZ3MgKi8KKyAgaWYgKGNoaXJwX3JlYWRfdDJoX2FyZ3MoJmFyZ3MsIHNpemVvZihhcmdzKSwKKwkJCSAgMiAvKm5fYXJncyovLCAwIC8qbl9yZXR1cm5zKi8sCisJCQkgIGRhdGEsIHByb2Nlc3NvciwgY2lhKSkKKyAgICByZXR1cm4gLTE7CisgIFRSQUNFKHRyYWNlX29zX2VtdWwsICgicmVsZWFzZSAtIGluIC0gdmlydD0weCVseCBzaXplPSVsZFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKWFyZ3MudmlydCwKKwkJCShsb25nIGludClhcmdzLnNpemUpKTsKKyAgLyogdXNlIHRoZSBtZW1vcnkgZGV2aWNlIHRvIHJlbGVhc2UgKHJlYWwpIG1lbW9yeSBhdCB0aGUgcmVxdWVzdGVkCisgICAgIGFkZHJlc3MgKi8KKyAgeworICAgIGRldmljZV9pbnN0YW5jZSAqbWVtb3J5ID0gdHJlZV9maW5kX2loYW5kbGVfcHJvcGVydHkoZGF0YS0+cm9vdCwgIi9jaG9zZW4vbWVtb3J5Iik7CisgICAgdW5zaWduZWRfY2VsbCBtZW1faW5bMl07CisgICAgbWVtX2luWzBdID0gYXJncy5zaXplOworICAgIG1lbV9pblsxXSA9IGFyZ3MudmlydDsKKyAgICBpZiAoZGV2aWNlX2luc3RhbmNlX2NhbGxfbWV0aG9kKG1lbW9yeSwgInJlbGVhc2UiLAorCQkJCSAgICAyLCBtZW1faW4sIDAsIE5VTEwpIDwgMCkKKyAgICAgIGVycm9yKCJjaGlycDogY2xhaW0gZmFpbGVkIHRvIHJlbGVhc2UgbWVtb3J5IHZpcnQ9MHglbHggc2l6ZT0lbGQiLAorCSAgICAodW5zaWduZWQgbG9uZylhcmdzLnZpcnQsCisJICAgIChsb25nIGludClhcmdzLnNpemUpOworICB9CisgIC8qIGlmIHVzaW5nIHZpcnR1YWwgYWRkcmVzc2VzLCByZW1vdmUgdGhlIDEtMSBtYXAgb2YgdGhpcyBhZGRyZXNzIHNwYWNlICovCisgIGlmICghZGF0YS0+cmVhbF9tb2RlKSB7CisgICAgZXJyb3IoImNoaXJwOiByZWxlYXNlIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IHZpcnR1YWwgbW9kZSIpOworICB9CisgIC8qIHJldHVybiB0aGUgYmFzZSBhZGRyZXNzICovCisgIFRSQUNFKHRyYWNlX29zX2VtdWwsICgicmVsZWFzZSAtIG91dFxuIikpOworICBjaGlycF93cml0ZV9oMnRfYXJncygmYXJncywKKwkJICAgICAgIHNpemVvZihhcmdzKSwKKwkJICAgICAgIGRhdGEsCisJCSAgICAgICBwcm9jZXNzb3IsIGNpYSk7CisgIHJldHVybiAwOworfQorCisKKy8qIENvbnRyb2wgdHJhbnNmZXIgKi8KKworc3RhdGljIGludAorY2hpcnBfZW11bF9ib290KG9zX2VtdWxfZGF0YSAqZGF0YSwKKwkJY3B1ICpwcm9jZXNzb3IsCisJCXVuc2lnbmVkX3dvcmQgY2lhKQoreworICAvKiB1bmxpa2UgT3BlbkZpcm13YXJlIHRoaXMgb25lIGNhbiB0YWtlIGFuIGFyZ3VtZW50ICovCisgIHN0cnVjdCBib290X2FyZ3MgeworICAgIC8qaW4qLworICAgIHVuc2lnbmVkX2NlbGwgYm9vdHNwZWM7CisgICAgLypvdXQqLworICB9IGFyZ3M7CisgIGNoYXIgYm9vdHNwZWNbMTAyNF07CisgIC8qIHJlYWQgaW4gdGhlIGFyZ3VtZW50cyAqLworICBpZiAoY2hpcnBfcmVhZF90MmhfYXJncygmYXJncywgc2l6ZW9mKGFyZ3MpLCAtMSwgMCwgZGF0YSwgcHJvY2Vzc29yLCBjaWEpKQorICAgIGNwdV9oYWx0KHByb2Nlc3NvciwgY2lhLCB3YXNfZXhpdGVkLCAtMSk7CisgIGlmIChhcmdzLmJvb3RzcGVjICE9IDApCisgICAgZW11bF9yZWFkX3N0cmluZyhib290c3BlYywgYXJncy5ib290c3BlYywgc2l6ZW9mKGJvb3RzcGVjKSwKKwkJICAgICBwcm9jZXNzb3IsIGNpYSk7CisgIGVsc2UKKyAgICBzdHJjcHkoYm9vdHNwZWMsICIobnVsbCkiKTsKKyAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCJib290IC0gaW4gYm9vdHNwZWM9YCVzJ1xuIiwgYm9vdHNwZWMpKTsKKyAgLyoganVzdCByZXBvcnQgdGhpcyBhbmQgZXhpdCAqLworICBwcmludGZfZmlsdGVyZWQoImNocnA6IGJvb3QgJXMgY2FsbGVkLCBleGl0aW5nLlxuIiwgYm9vdHNwZWMpOworICBjcHVfaGFsdChwcm9jZXNzb3IsIGNpYSwgd2FzX2V4aXRlZCwgMCk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitjaGlycF9lbXVsX2VudGVyKG9zX2VtdWxfZGF0YSAqZGF0YSwKKwkJIGNwdSAqcHJvY2Vzc29yLAorCQkgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGVycm9yKCJjaGlycDogZW50ZXIgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZFxuIik7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitjaGlycF9lbXVsX2V4aXQob3NfZW11bF9kYXRhICpkYXRhLAorCQljcHUgKnByb2Nlc3NvciwKKwkJdW5zaWduZWRfd29yZCBjaWEpCit7CisgIC8qIHVubGlrZSBPcGVuQm9vdCB0aGlzIG9uZSBjYW4gdGFrZSBhbiBhcmd1bWVudCAqLworICBzdHJ1Y3QgZXhpdF9hcmdzIHsKKyAgICAvKmluKi8KKyAgICBzaWduZWRfY2VsbCBzdGF0dXM7CisgICAgLypvdXQqLworICB9IGFyZ3M7CisgIGlmIChjaGlycF9yZWFkX3QyaF9hcmdzKCZhcmdzLCBzaXplb2YoYXJncyksIC0xLCAwLCBkYXRhLCBwcm9jZXNzb3IsIGNpYSkpCisgICAgY3B1X2hhbHQocHJvY2Vzc29yLCBjaWEsIHdhc19leGl0ZWQsIC0xKTsKKyAgY3B1X2hhbHQocHJvY2Vzc29yLCBjaWEsIHdhc19leGl0ZWQsIGFyZ3Muc3RhdHVzKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NoaXJwX2VtdWxfY2hhaW4ob3NfZW11bF9kYXRhICpkYXRhLAorCQkgY3B1ICpwcm9jZXNzb3IsCisJCSB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgZXJyb3IoImNoaXJwOiBjaGFpbiBtZXRob2Qgbm90IGltcGxlbWVudGVkXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKKworLyogdXNlciBpbnRlcmZhY2UgKi8KKworc3RhdGljIGludAorY2hpcnBfZW11bF9pbnRlcnByZXQob3NfZW11bF9kYXRhICpkYXRhLAorCQkgICAgIGNwdSAqcHJvY2Vzc29yLAorCQkgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBlcnJvcigiY2hpcnA6IGludGVycHJldCBtZXRob2Qgbm90IGltcGxlbWVudGVkXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NoaXJwX2VtdWxfc2V0X2NhbGxiYWNrKG9zX2VtdWxfZGF0YSAqZGF0YSwKKwkJCWNwdSAqcHJvY2Vzc29yLAorCQkJdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGVycm9yKCJjaGlycDogc2V0X2NhbGxiYWNrIG1ldGhvZCBub3QgaW1wbGVtZW50ZWRcbiIpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY2hpcnBfZW11bF9zZXRfc3ltYm9sX2xvb2t1cChvc19lbXVsX2RhdGEgKmRhdGEsCisJCQkgICAgIGNwdSAqcHJvY2Vzc29yLAorCQkJICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgZXJyb3IoImNoaXJwOiBzZXRfc3ltYm9sX2xvb2t1cCBtZXRob2Qgbm90IGltcGxlbWVudGVkXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKKworLyogVGltZSAqLworCitzdGF0aWMgaW50CitjaGlycF9lbXVsX21pbGxpc2Vjb25kcyhvc19lbXVsX2RhdGEgKmRhdGEsCisJCQljcHUgKnByb2Nlc3NvciwKKwkJCXVuc2lnbmVkX3dvcmQgY2lhKQoreworICBzdHJ1Y3QgdGVzdF9hcmdzIHsKKyAgICAvKmluKi8KKyAgICAvKm91dCovCisgICAgdW5zaWduZWRfY2VsbCBtczsKKyAgfSBhcmdzOworICB1bnNpZ25lZDY0IHRpbWU7CisgIC8qIHJlYWQgaW4gdGhlIGFyZ3VtZW50cyAqLworICBpZiAoY2hpcnBfcmVhZF90MmhfYXJncygmYXJncywgc2l6ZW9mKGFyZ3MpLCAxLCAxLCBkYXRhLCBwcm9jZXNzb3IsIGNpYSkpCisgICAgcmV0dXJuIC0xOworICAvKiBtYWtlIHVwIGEgbnVtYmVyICovCisgIHRpbWUgPSBldmVudF9xdWV1ZV90aW1lKHBzaW1fZXZlbnRfcXVldWUoY3B1X3N5c3RlbShwcm9jZXNzb3IpKSkgLyAxMDAwMDAwOworICBhcmdzLm1zID0gdGltZTsKKyAgLyogd3JpdGUgdGhlIGFyZ3VtZW50cyBiYWNrIG91dCAqLworICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoIm1pbGxpc2Vjb25kcyAtIG91dCAtIG1zPSVsZFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKWFyZ3MubXMpKTsKKyAgY2hpcnBfd3JpdGVfaDJ0X2FyZ3MoJmFyZ3MsCisJCSAgICAgICBzaXplb2YoYXJncyksCisJCSAgICAgICBkYXRhLAorCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOworICByZXR1cm4gMDsKK30KKworCisKKworc3RhdGljIGNoaXJwX3NlcnZpY2VzIHNlcnZpY2VzW10gPSB7CisKKyAgLyogY2xpZW50IGludGVyZmFjZSAqLworICB7ICJ0ZXN0IiwgY2hpcnBfZW11bF90ZXN0IH0sCisKKyAgLyogZGV2aWNlIHRyZWUgKi8KKyAgeyAicGVlciIsIGNoaXJwX2VtdWxfcGVlciB9LAorICB7ICJjaGlsZCIsIGNoaXJwX2VtdWxfY2hpbGQgfSwKKyAgeyAicGFyZW50IiwgY2hpcnBfZW11bF9wYXJlbnQgfSwKKyAgeyAiaW5zdGFuY2UtdG8tcGFja2FnZSIsIGNoaXJwX2VtdWxfaW5zdGFuY2VfdG9fcGFja2FnZSB9LAorICB7ICJnZXRwcm9wbGVuIiwgY2hpcnBfZW11bF9nZXRwcm9wbGVuIH0sCisgIHsgImdldHByb3AiLCBjaGlycF9lbXVsX2dldHByb3AgfSwKKyAgeyAibmV4dHByb3AiLCBjaGlycF9lbXVsX25leHRwcm9wIH0sCisgIC8qIHsgInNldHByb3AiLCBjaGlycF9lbXVsX3NldHByb3AgfSwgKi8KKyAgeyAiY2Fub24iLCBjaGlycF9lbXVsX2Nhbm9uIH0sCisgIHsgImZpbmRkZXZpY2UiLCBjaGlycF9lbXVsX2ZpbmRkZXZpY2UgfSwKKyAgeyAiaW5zdGFuY2UtdG8tcGF0aCIsIGNoaXJwX2VtdWxfaW5zdGFuY2VfdG9fcGF0aCB9LAorICB7ICJwYWNrYWdlLXRvLXBhdGgiLCBjaGlycF9lbXVsX3BhY2thZ2VfdG9fcGF0aCB9LAorICB7ICJjYWxsLW1ldGhvZCIsIGNoaXJwX2VtdWxfY2FsbF9tZXRob2QgfSwKKworICAvKiBkZXZpY2UgSS9PICovCisgIHsgIm9wZW4iLCBjaGlycF9lbXVsX29wZW4gfSwKKyAgeyAiY2xvc2UiLCBjaGlycF9lbXVsX2Nsb3NlIH0sCisgIHsgInJlYWQiLCBjaGlycF9lbXVsX3JlYWQgfSwKKyAgeyAid3JpdGUiLCBjaGlycF9lbXVsX3dyaXRlIH0sCisgIHsgInNlZWsiLCBjaGlycF9lbXVsX3NlZWsgfSwKKyAgeyAid3JpdGUiLCBjaGlycF9lbXVsX3dyaXRlIH0sCisKKyAgLyogbWVtb3J5ICovCisgIHsgImNsYWltIiwgY2hpcnBfZW11bF9jbGFpbSB9LAorICB7ICJyZWxlYXNlIiwgY2hpcnBfZW11bF9yZWxlYXNlIH0sCisKKyAgLyogY29udHJvbCB0cmFuc2ZlciAqLworICB7ICJib290IiwgY2hpcnBfZW11bF9ib290IH0sCisgIHsgImVudGVyIiwgY2hpcnBfZW11bF9lbnRlciB9LAorICB7ICJleGl0IiwgY2hpcnBfZW11bF9leGl0IH0sCisgIHsgImNoYWluIiwgY2hpcnBfZW11bF9jaGFpbiB9LAorCisgIC8qIHVzZXIgaW50ZXJmYWNlICovCisgIHsgImludGVycHJldCIsIGNoaXJwX2VtdWxfaW50ZXJwcmV0IH0sCisgIHsgInNldF9jYWxsYmFjayIsIGNoaXJwX2VtdWxfc2V0X2NhbGxiYWNrIH0sCisgIHsgInNldF9zeW1ib2xfbG9va3VwIiwgY2hpcnBfZW11bF9zZXRfc3ltYm9sX2xvb2t1cCB9LAorCisgIC8qIHRpbWUgKi8KKyAgeyAibWlsbGlzZWNvbmRzIiwgY2hpcnBfZW11bF9taWxsaXNlY29uZHMgfSwKKworICB7IDAsIC8qIHNlbnRpbmFsICovIH0sCit9OworCisKKy8qIG1haW4gaGFuZGxlcnMgKi8KKworLyogQW55IHN0YXJ0aW5nIGFkZHJlc3MgZ3JlYXRlciB0aGFuIHRoaXMgaXMgYXNzdW1lZCB0byBiZSBhbiBDaGlycAorICAgcmF0aGVyIHRoYW4gVkVBICovCisKKyNpZm5kZWYgQ0hJUlBfU1RBUlRfQUREUkVTUworI2RlZmluZSBDSElSUF9TVEFSVF9BRERSRVNTIDB4ODAwMDAwMDAKKyNlbmRpZgorI2lmbmRlZiBDSElSUF9MT0FEX0JBU0UKKyNkZWZpbmUgQ0hJUlBfTE9BRF9CQVNFIC0xCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCBfY2hpcnBfbm90ZV9kZXNjIHsKKyAgc2lnbmVkMzIgcmVhbF9tb2RlOworICBzaWduZWQzMiByZWFsX2Jhc2U7CisgIHNpZ25lZDMyIHJlYWxfc2l6ZTsKKyAgc2lnbmVkMzIgdmlydF9iYXNlOworICBzaWduZWQzMiB2aXJ0X3NpemU7CisgIHNpZ25lZDMyIGxvYWRfYmFzZTsKK30gY2hpcnBfbm90ZV9kZXNjOworCit0eXBlZGVmIGVudW0geworICBub3RlX21pc3NpbmcsCisgIG5vdGVfZm91bmQsCisgIG5vdGVfY29ycmVjdCwKK30gbm90ZV9mb3VuZF9zdGF0dXM7Cit0eXBlZGVmIHN0cnVjdCBfY2hpcnBfbm90ZSB7CisgIGNoaXJwX25vdGVfZGVzYyBkZXNjOworICBub3RlX2ZvdW5kX3N0YXR1cyBmb3VuZDsKK30gY2hpcnBfbm90ZTsKKwordHlwZWRlZiBzdHJ1Y3QgX2NoaXJwX25vdGVfaGVhZCB7CisgIHVuc2lnbmVkMzIgbmFtZXN6OworICB1bnNpZ25lZDMyIGRlc2NzejsKKyAgdW5zaWduZWQzMiB0eXBlOworfSBjaGlycF9ub3RlX2hlYWQ7CisKK3N0YXRpYyB2b2lkCittYXBfb3Zlcl9jaGlycF9ub3RlKGJmZCAqaW1hZ2UsCisJCSAgICBhc2VjdGlvbiAqc2VjdCwKKwkJICAgIFBUUiBvYmopCit7CisgIGNoaXJwX25vdGUgKm5vdGUgPSAoY2hpcnBfbm90ZSopb2JqOworICBpZiAoc3RyY21wKHNlY3QtPm5hbWUsICIubm90ZSIpID09IDApIHsKKyAgICBjaGlycF9ub3RlX2hlYWQgaGVhZDsKKyAgICBjaGFyIG5hbWVbMTZdOworICAgIC8qIGNoZWNrIHRoZSBoZWFkICovCisgICAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMoaW1hZ2UsIHNlY3QsCisJCQkJICAmaGVhZCwgMCwgc2l6ZW9mKGhlYWQpKSkKKyAgICAgIHJldHVybjsKKyAgICBoZWFkLm5hbWVzeiA9IGJmZF9nZXRfMzIoaW1hZ2UsICh2b2lkKikmaGVhZC5uYW1lc3opOworICAgIGhlYWQuZGVzY3N6ID0gYmZkX2dldF8zMihpbWFnZSwgKHZvaWQqKSZoZWFkLmRlc2Nzeik7CisgICAgaGVhZC50eXBlID0gYmZkX2dldF8zMihpbWFnZSwgKHZvaWQqKSZoZWFkLnR5cGUpOworICAgIGlmIChoZWFkLnR5cGUgIT0gMHgxMjc1KQorICAgICAgcmV0dXJuOworICAgIC8qIGNoZWNrIHRoZSBuYW1lIGZpZWxkICovCisgICAgaWYgKGhlYWQubmFtZXN6ID4gc2l6ZW9mKG5hbWUpKSB7CisgICAgICBlcnJvcigiY2hpcnA6IG5vdGUgbmFtZSB0b28gbG9uZyAoJWQgPiAlZClcbiIsIChpbnQpaGVhZC5uYW1lc3osIHNpemVvZihuYW1lKSk7CisgICAgfQorICAgIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKGltYWdlLCBzZWN0LAorCQkJCSAgbmFtZSwgc2l6ZW9mKGhlYWQpLCBoZWFkLm5hbWVzeikpIHsKKyAgICAgIGVycm9yKCJjaGlycDogbm90ZSBuYW1lIHVucmVhZGFibGVcbiIpOworICAgIH0KKyAgICBpZiAoc3RyY21wKG5hbWUsICJQb3dlclBDIikgIT0gMCkgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkKCJjaGlycDogbm90ZSBuYW1lICglcykgbm90IGBQb3dlclBDJ1xuIiwgbmFtZSk7CisgICAgfQorICAgIC8qIGNoZWNrIHRoZSBzaXplICovCisgICAgaWYgKGhlYWQuZGVzY3N6ID09IHNpemVvZihub3RlLT5kZXNjKSAtIHNpemVvZihzaWduZWQzMikpIHsKKyAgICAgIHNpbV9pb19wcmludGZfZmlsdGVyZWQoImNoaXJwOiBub3RlIGRlc2NyaXB0b3IgbWlzc2luZyBsb2FkLWJhc2VcbiIpOworICAgIH0KKyAgICBlbHNlIGlmIChoZWFkLmRlc2NzeiAhPSBzaXplb2Yobm90ZS0+ZGVzYykpIHsKKyAgICAgIHNpbV9pb19wcmludGZfZmlsdGVyZWQoImNoaXJwOiBub3RlIGRlc2NyaXB0b3Igb2Ygd3Jvbmcgc2l6ZVxuIik7CisgICAgICBub3RlLT5mb3VuZCA9IG5vdGVfZm91bmQ7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG5vdGUtPmZvdW5kID0gbm90ZV9jb3JyZWN0OworICAgIC8qIGdldCB0aGUgY29udGVudHMgKi8KKyAgICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyhpbWFnZSwgc2VjdCwKKwkJCQkgICZub3RlLT5kZXNjLCAvKiBwYWdlIGFsaWduIHN0YXJ0ICovCisJCQkJICAoKHNpemVvZihoZWFkKSArIGhlYWQubmFtZXN6KSArIDMpICYgfjMsCisJCQkJICBoZWFkLmRlc2NzeikpIHsKKyAgICAgIGVycm9yKCJjaGlycDogbm90ZSBkZXNjcmlwdG9yIHVucmVhZGFibGVcbiIpOworICAgIH0KKyAgICBub3RlLT5kZXNjLnJlYWxfbW9kZSA9IGJmZF9nZXRfMzIoaW1hZ2UsICh2b2lkKikmbm90ZS0+ZGVzYy5yZWFsX21vZGUpOworICAgIG5vdGUtPmRlc2MucmVhbF9iYXNlID0gYmZkX2dldF8zMihpbWFnZSwgKHZvaWQqKSZub3RlLT5kZXNjLnJlYWxfYmFzZSk7CisgICAgbm90ZS0+ZGVzYy5yZWFsX3NpemUgPSBiZmRfZ2V0XzMyKGltYWdlLCAodm9pZCopJm5vdGUtPmRlc2MucmVhbF9zaXplKTsKKyAgICBub3RlLT5kZXNjLnZpcnRfYmFzZSA9IGJmZF9nZXRfMzIoaW1hZ2UsICh2b2lkKikmbm90ZS0+ZGVzYy52aXJ0X2Jhc2UpOworICAgIG5vdGUtPmRlc2MudmlydF9zaXplID0gYmZkX2dldF8zMihpbWFnZSwgKHZvaWQqKSZub3RlLT5kZXNjLnZpcnRfc2l6ZSk7CisgICAgaWYgKGhlYWQuZGVzY3N6ID09IHNpemVvZihub3RlLT5kZXNjKSkKKyAgICAgIG5vdGUtPmRlc2MubG9hZF9iYXNlID0gYmZkX2dldF8zMihpbWFnZSwgKHZvaWQqKSZub3RlLT5kZXNjLmxvYWRfYmFzZSk7CisgICAgZWxzZQorICAgICAgbm90ZS0+ZGVzYy5sb2FkX2Jhc2UgPSBDSElSUF9MT0FEX0JBU0U7CisgIH0KK30KKworCitzdGF0aWMgb3NfZW11bF9kYXRhICoKK2VtdWxfY2hpcnBfY3JlYXRlKGRldmljZSAqcm9vdCwKKwkJICBiZmQgKmltYWdlLAorCQkgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIG9zX2VtdWxfZGF0YSAqY2hpcnA7CisgIGRldmljZSAqbm9kZTsKKyAgY2hpcnBfbm90ZSBub3RlOworICBpbnQgaTsKKworICAvKiBTYW5pdHkgY2hlY2sgdGhhdCB0aGlzIHJlYWxseSBpcyB0aGUgY2hvc2VuIGVtdWxhdGlvbiAqLworICBpZiAobmFtZSA9PSBOVUxMICYmIGltYWdlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmIChuYW1lICE9IE5VTEwKKyAgICAgICYmIHN0cmNtcChuYW1lLCAib2IiKSAhPSAwCisgICAgICAmJiBzdHJjbXAobmFtZSwgImllZWUxMjc0IikgIT0gMAorICAgICAgJiYgc3RyY21wKG5hbWUsICJjaHJwIikgIT0gMAorICAgICAgJiYgc3RyY21wKG5hbWUsICJjaGlycCIpICE9IDAKKyAgICAgICYmIHN0cmNtcChuYW1lLCAib3BlbmJvb3QiKSAhPSAwKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIGxvb2sgZm9yIGFuIGVsZiBub3RlIHNlY3Rpb24sIGVudGVyIGl0cyB2YWx1ZXMgaW50byB0aGUgZGV2aWNlIHRyZWUgKi8KKyAgbWVtc2V0KCZub3RlLCAwLCBzaXplb2Yobm90ZSkpOworICBpZiAoaW1hZ2UgIT0gTlVMTCkKKyAgICBiZmRfbWFwX292ZXJfc2VjdGlvbnMoaW1hZ2UsIG1hcF9vdmVyX2NoaXJwX25vdGUsICZub3RlKTsKKyAgaWYgKG5hbWUgPT0gTlVMTCAmJiBpbWFnZSAhPSBOVUxMICYmIG5vdGUuZm91bmQgPT0gbm90ZV9taXNzaW5nKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIEFzc3VtZSB0aGF0IGl0IGlzIGEgY2hpcnAgZW11bGF0aW9uICovCisKKyAgY2hpcnAgPSBaQUxMT0Mob3NfZW11bF9kYXRhKTsKKyAgY2hpcnAtPnJvb3QgPSByb290OworICBjaGlycC0+c2VydmljZXMgPSBzZXJ2aWNlczsKKworICAvKiB0aGUgcm9vdCBub2RlICovCisgIHRyZWVfcGFyc2Uocm9vdCwgIi9uYW1lIFwiZ3BsLGNsYXl0b24iKTsKKworICAvKiBkZWZhdWx0IG9wdGlvbnMgKi8KKyAgZW11bF9hZGRfdHJlZV9vcHRpb25zKHJvb3QsIGltYWdlLCAiY2hpcnAiLCAib2VhIiwKKwkJCTAgLypvZWEtaW50ZXJydXB0LXByZWZpeCovKTsKKworICAvKiBoYXJkd2FyZSAqLworICBlbXVsX2FkZF90cmVlX2hhcmR3YXJlKHJvb3QpOworCisgIC8qIGJhc2ljIGluZm9ybWF0aW9uICovCisgIGNoaXJwLT5tZW1vcnlfc2l6ZQorICAgID0gdHJlZV9maW5kX2ludGVnZXJfcHJvcGVydHkocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL29lYS1tZW1vcnktc2l6ZSIpOworICBjaGlycC0+bGl0dGxlX2VuZGlhbgorICAgID0gdHJlZV9maW5kX2Jvb2xlYW5fcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL2xpdHRsZS1lbmRpYW4/Iik7CisgIGNoaXJwLT5mbG9hdGluZ19wb2ludF9hdmFpbGFibGUKKyAgICA9IHRyZWVfZmluZF9ib29sZWFuX3Byb3BlcnR5KHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy9mbG9hdGluZy1wb2ludD8iKTsKKyAgY2hpcnAtPmludGVycnVwdF9wcmVmaXggPQorICAgIHRyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy9vZWEtaW50ZXJydXB0LXByZWZpeCIpOworCisKKyAgLyogUGVyZm9ybSBhbiBpbnRlcnVtIGxheW91dCBvZiB0aGUgb3BlbmJvb3QgZmlybXdhcmUgaW4gbWVtb3J5ICovCisKKworICAvKiBhIHBhZ2UgZm9yIGZpcm13YXJlIGNhbGxzICovCisgIGNoaXJwLT5zaXplb2ZfY29kZSA9IDQwOTY7CisgIGNoaXJwLT5jb2RlX29mZnNldCA9IDB4NDAwMDsgLyogcG9zc2libGUgc3BhY2UgZm9yIGludGVycnVwdCB0YWJsZSAqLworCisgIC8qIHRoZSBzdGFjayAqLworICBjaGlycC0+c2l6ZW9mX3N0YWNrID0gMzIgKiAxMDI0OworICBjaGlycC0+c3RhY2tfb2Zmc2V0ID0gY2hpcnAtPmNvZGVfb2Zmc2V0ICsgY2hpcnAtPnNpemVvZl9jb2RlOworCisgIC8qIHRoZSBoYXNoIHRhYmxlICovCisgIGlmICghbm90ZS5kZXNjLnJlYWxfbW9kZSkgeworICAgIGNoaXJwLT5ucl9wYWdlX3RhYmxlX2VudHJ5X2dyb3VwcyA9IChjaGlycC0+bWVtb3J5X3NpemUgPCAweDgwMDAwMAorCQkJCQkgPyAxMDI0IC8qIG1pbiBhbGxvd2VkICovCisJCQkJCSA6IChjaGlycC0+bWVtb3J5X3NpemUgLyA0MDk2IC8gMikpOworICAgIGNoaXJwLT5zaXplb2ZfaHRhYiA9IGNoaXJwLT5ucl9wYWdlX3RhYmxlX2VudHJ5X2dyb3VwcyAqIDY0OworICB9CisgIGNoaXJwLT5odGFiX29mZnNldCA9IGNoaXJwLT5zdGFja19vZmZzZXQgKyBjaGlycC0+c2l6ZW9mX3N0YWNrOworCisgIC8qIHRoZSBhY3R1YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCAqLworICBjaGlycC0+cmVhbF9zaXplID0gY2hpcnAtPmh0YWJfb2Zmc2V0ICsgY2hpcnAtPnNpemVvZl9odGFiOworCisKKyAgLyogbm93IGdvIHRocm91Z2ggYW5kIHNlZSBpZiBpdCBmaXRzIGluIHdoYXQgaXMgYXZhaWxhYmxlICovCisKKworICAvKiByZXNvbHZlIHJlYWwtbW9kZT8gKi8KKyAgaWYgKG5vdGUuZm91bmQgPT0gbm90ZV9jb3JyZWN0KQorICAgIGNoaXJwLT5yZWFsX21vZGUgPSBub3RlLmRlc2MucmVhbF9tb2RlOworICBlbHNlIGlmICh0cmVlX2ZpbmRfcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL3JlYWwtbW9kZT8iKSAhPSBOVUxMKQorICAgIGNoaXJwLT5yZWFsX21vZGUgPSB0cmVlX2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eShyb290LCAiL29wdGlvbnMvcmVhbC1tb2RlPyIpOworICBlbHNlCisgICAgY2hpcnAtPnJlYWxfbW9kZSA9IDA7CisgIGlmICh0cmVlX2ZpbmRfcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL3JlYWwtbW9kZT8iKSAhPSBOVUxMKSB7CisgICAgaWYgKCFjaGlycC0+cmVhbF9tb2RlCisJIT0gIXRyZWVfZmluZF9ib29sZWFuX3Byb3BlcnR5KHJvb3QsICIvb3B0aW9ucy9yZWFsLW1vZGU/IikpCisgICAgICBlcnJvcigiY2hpcnA6IC9vcHRpb25zL3JlYWwtbW9kZT8gY29uZmxpY3RzIHdpdGggbm90ZSBzZWN0aW9uXG4iKTsKKyAgfQorICBlbHNlCisgICAgdHJlZV9wYXJzZShyb290LCAiL29wdGlvbnMvcmVhbC1tb2RlPyAlcyIsCisJICAgICAgIGNoaXJwLT5yZWFsX21vZGUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKworICAvKiByZXNvbHZlIHJlYWwtYmFzZSAqLworICBpZiAobm90ZS5mb3VuZCA9PSBub3RlX2NvcnJlY3QKKyAgICAgICYmIG5vdGUuZGVzYy5yZWFsX2Jhc2UgIT0gKHNpZ25lZDMyKS0xKQorICAgIGNoaXJwLT5yZWFsX2Jhc2UgPSBub3RlLmRlc2MucmVhbF9iYXNlOworICBlbHNlIGlmICh0cmVlX2ZpbmRfcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL3JlYWwtYmFzZSIpICE9IE5VTEwpCisgICAgY2hpcnAtPnJlYWxfYmFzZSA9IHRyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KHJvb3QsICIvb3B0aW9ucy9yZWFsLWJhc2UiKTsKKyAgZWxzZQorICAgIGNoaXJwLT5yZWFsX2Jhc2UgPSBjaGlycC0+bWVtb3J5X3NpemUgLSBjaGlycC0+cmVhbF9zaXplOworICBpZiAodHJlZV9maW5kX3Byb3BlcnR5KHJvb3QsICIvb3B0aW9ucy9yZWFsLWJhc2UiKSAhPSBOVUxMKSB7CisgICAgaWYgKGNoaXJwLT5yZWFsX2Jhc2UgIT0gdHJlZV9maW5kX2ludGVnZXJfcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL3JlYWwtYmFzZSIpKQorICAgICAgZXJyb3IoImNoaXJwOiAvb3B0aW9ucy9yZWFsLWJhc2UgY29uZmxpY3RzIHdpdGggbm90ZSBzZWN0aW9uXG4iKTsKKyAgfQorICBlbHNlCisgICAgdHJlZV9wYXJzZShyb290LCAiL29wdGlvbnMvcmVhbC1iYXNlIDB4JWx4IiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpY2hpcnAtPnJlYWxfYmFzZSk7CisKKyAgLyogcmVzb2x2ZSByZWFsLXNpemUgKi8KKyAgaWYgKG5vdGUuZm91bmQgPT0gbm90ZV9jb3JyZWN0CisgICAgICAmJiBub3RlLmRlc2MucmVhbF9zaXplICE9IChzaWduZWQzMiktMQorICAgICAgJiYgbm90ZS5kZXNjLnJlYWxfc2l6ZSAhPSAwCisgICAgICAmJiBjaGlycC0+cmVhbF9zaXplID4gbm90ZS5kZXNjLnJlYWxfc2l6ZSkKKyAgICBlcnJvcigiY2hpcnA6IGluc3VmZmljaWVudCBwaHlzaWNhbCBtZW1vcnkgZm9yIGZpcm13YXJlXG4iKTsKKyAgaWYgKHRyZWVfZmluZF9wcm9wZXJ0eShyb290LCAiL29wdGlvbnMvcmVhbC1zaXplIikgIT0gTlVMTCkgeworICAgIGlmIChjaGlycC0+cmVhbF9zaXplID4gdHJlZV9maW5kX2ludGVnZXJfcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL3JlYWwtc2l6ZSIpKQorICAgICAgZXJyb3IoImNoaXJwOiAvb3B0aW9ucy9yZWFsLXNpemUgY29uZmxpY3RzIHdpdGggbm90ZSBzZWN0aW9uXG4iKTsKKyAgfQorICBlbHNlCisgICAgdHJlZV9wYXJzZShyb290LCAiL29wdGlvbnMvcmVhbC1zaXplIDB4JWx4IiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpY2hpcnAtPnJlYWxfc2l6ZSk7CisKKyAgLyogcmVzb2x2ZSB2aXJ0LWJhc2UgKi8KKyAgaWYgKGNoaXJwLT5yZWFsX21vZGUpCisgICAgY2hpcnAtPnZpcnRfYmFzZSA9IGNoaXJwLT5yZWFsX2Jhc2U7CisgIGVsc2UgaWYgKG5vdGUuZm91bmQgPT0gbm90ZV9jb3JyZWN0ICYmIG5vdGUuZGVzYy52aXJ0X2Jhc2UgIT0gLTEpCisgICAgY2hpcnAtPnZpcnRfYmFzZSA9IG5vdGUuZGVzYy52aXJ0X2Jhc2U7CisgIGVsc2UgaWYgKHRyZWVfZmluZF9wcm9wZXJ0eShyb290LCAiL29wdGlvbnMvdmlydC1iYXNlIikgIT0gTlVMTCkKKyAgICBjaGlycC0+dmlydF9iYXNlID0gdHJlZV9maW5kX2ludGVnZXJfcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL3ZpcnQtYmFzZSIpOworICBlbHNlCisgICAgY2hpcnAtPnZpcnRfYmFzZSA9IENISVJQX1NUQVJUX0FERFJFU1M7CisgIGlmICh0cmVlX2ZpbmRfcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL3ZpcnQtYmFzZSIpICE9IE5VTEwpIHsKKyAgICB1bnNpZ25lZF93b3JkIHZpcnRfYmFzZSA9IHRyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KHJvb3QsICIvb3B0aW9ucy92aXJ0LWJhc2UiKTsKKyAgICBpZiAodmlydF9iYXNlICE9IC0xICYmIGNoaXJwLT52aXJ0X2Jhc2UgIT0gdmlydF9iYXNlKQorICAgICAgZXJyb3IoImNoaXJwOiAvb3B0aW9ucy92aXJ0LWJhc2UgY29uZmxpY3RzIHdpdGggbm90ZSBzZWN0aW9uXG4iKTsKKyAgfQorICBlbHNlCisgICAgdHJlZV9wYXJzZShyb290LCAiL29wdGlvbnMvdmlydC1iYXNlIDB4JWx4IiwKKwkgICAgICAgY2hpcnAtPnJlYWxfbW9kZSA/IC0xIDogKHVuc2lnbmVkIGxvbmcpY2hpcnAtPnZpcnRfYmFzZSk7CisKKyAgLyogcmVzb2x2ZSB2aXJ0LXNpemUgKi8KKyAgY2hpcnAtPnZpcnRfc2l6ZSA9IGNoaXJwLT5yZWFsX3NpemU7CisgIGlmIChub3RlLmZvdW5kID09IG5vdGVfY29ycmVjdAorICAgICAmJiBub3RlLmRlc2MudmlydF9zaXplICE9IChzaWduZWQzMiktMQorICAgICAgJiYgbm90ZS5kZXNjLnZpcnRfc2l6ZSAhPSAwCisgICAgICAmJiAhY2hpcnAtPnJlYWxfbW9kZQorICAgICAgJiYgY2hpcnAtPnZpcnRfc2l6ZSA+IG5vdGUuZGVzYy52aXJ0X3NpemUpCisgICAgZXJyb3IoImNoaXJwOiBpbnN1ZmZpY2VudCB2aXJ0dWFsIG1lbW9yeSBmb3IgZmlybXdhcmVcbiIpOworICBpZiAodHJlZV9maW5kX3Byb3BlcnR5KHJvb3QsICIvb3B0aW9ucy92aXJ0LXNpemUiKSAhPSBOVUxMKSB7CisgICAgaWYgKGNoaXJwLT52aXJ0X3NpemUgPiB0cmVlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShyb290LCAiL29wdGlvbnMvdmlydC1zaXplIikpCisgICAgICBlcnJvcigiY2hpcnA6IC9vcHRpb25zL3ZpcnQtc2l6ZSBjb25mbGljdHMgd2l0aCBub3RlIHNlY3Rpb25cbiIpOworICB9CisgIGVsc2UKKyAgICB0cmVlX3BhcnNlKHJvb3QsICIvb3B0aW9ucy92aXJ0LXNpemUgMHglbHgiLAorCSAgICAgICBjaGlycC0+cmVhbF9tb2RlID8gLTEgOiAodW5zaWduZWQgbG9uZyljaGlycC0+dmlydF9zaXplKTsKKworICAvKiByZXNvbHZlIGxvYWQtYmFzZSAqLworICBpZiAobm90ZS5mb3VuZCA9PSBub3RlX2NvcnJlY3QKKyAgICAgICYmIG5vdGUuZGVzYy5sb2FkX2Jhc2UgIT0gKHNpZ25lZDMyKS0xKQorICAgIGNoaXJwLT5sb2FkX2Jhc2UgPSBub3RlLmRlc2MubG9hZF9iYXNlOworICBlbHNlIGlmICh0cmVlX2ZpbmRfcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL2xvYWQtYmFzZSIpICE9IE5VTEwpCisgICAgY2hpcnAtPmxvYWRfYmFzZSA9IHRyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KHJvb3QsICIvb3B0aW9ucy9sb2FkLWJhc2UiKTsKKyAgZWxzZQorICAgIGNoaXJwLT5sb2FkX2Jhc2UgPSBDSElSUF9MT0FEX0JBU0U7CisgIGlmICh0cmVlX2ZpbmRfcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL2xvYWQtYmFzZSIpICE9IE5VTEwpIHsKKyAgICBpZiAoY2hpcnAtPmxvYWRfYmFzZSAhPSB0cmVlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShyb290LCAiL29wdGlvbnMvbG9hZC1iYXNlIikpCisgICAgICBlcnJvcigiY2hpcnA6IC9vcHRpb25zL2xvYWQtYmFzZSBjb25mbGljdHMgd2l0aCBub3RlIHNlY3Rpb25cbiIpOworICB9CisgIGVsc2UKKyAgICB0cmVlX3BhcnNlKHJvb3QsICIvb3B0aW9ucy9sb2FkLWJhc2UgMHglbHgiLAorCSAgICAgICAodW5zaWduZWQgbG9uZyljaGlycC0+bG9hZF9iYXNlKTsKKworICAvKiBub3cgYWRqdXN0IHRoZSBwcmVsaW1pbmFyeSBmaXJtd2FyZSBhZGRyZXNzZXMgdG8gZmluYWwgdmFsdWVzICovCisgIGNoaXJwLT5jb2RlX3JhID0gY2hpcnAtPmNvZGVfb2Zmc2V0ICsgY2hpcnAtPnJlYWxfYmFzZTsKKyAgY2hpcnAtPnN0YWNrX3JhID0gY2hpcnAtPnN0YWNrX29mZnNldCArIGNoaXJwLT5yZWFsX2Jhc2U7CisgIGNoaXJwLT5odGFiX3JhID0gY2hpcnAtPmh0YWJfb2Zmc2V0ICsgY2hpcnAtPnJlYWxfYmFzZTsKKworICAvKiB0aGUgdmlydHVhbCBhZGRyZXNzZXMuICBJbiByZWFsIG1vZGUgdGhlc2UgYXJlIHJlYWwgYWRkcmVzc2VzLiAqLworCisgIGNoaXJwLT5jb2RlX3ZhID0gY2hpcnAtPmNvZGVfb2Zmc2V0ICsgY2hpcnAtPnZpcnRfYmFzZTsKKyAgY2hpcnAtPnN0YWNrX3ZhID0gY2hpcnAtPnN0YWNrX29mZnNldCArIGNoaXJwLT52aXJ0X2Jhc2U7CisgIGNoaXJwLT5odGFiX3ZhID0gY2hpcnAtPmh0YWJfb2Zmc2V0ICsgY2hpcnAtPnZpcnRfYmFzZTsKKworICBjaGlycC0+Y29kZV9jbGllbnRfdmEgPSBjaGlycC0+Y29kZV92YTsKKyAgY2hpcnAtPmNvZGVfY2xpZW50X3JhID0gY2hpcnAtPmNvZGVfcmE7CisKKyAgY2hpcnAtPmNvZGVfY2FsbGJhY2tfdmEgPSBjaGlycC0+Y29kZV9jbGllbnRfdmEgKyAxNjsKKyAgY2hpcnAtPmNvZGVfY2FsbGJhY2tfcmEgPSBjaGlycC0+Y29kZV9jbGllbnRfcmEgKyAxNjsKKworICBjaGlycC0+Y29kZV9sb29wX3ZhID0gY2hpcnAtPmNvZGVfY2FsbGJhY2tfdmEgKyAxNjsKKyAgY2hpcnAtPmNvZGVfbG9vcF9yYSA9IGNoaXJwLT5jb2RlX2NhbGxiYWNrX3JhICsgMTY7CisKKyAgLyogaW5pdGlhbGl6YXRpb24gKi8KKworICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdCIpOworICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9yZWdpc3RlciIpOworICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9yZWdpc3Rlci8wLnBjIDB4JWx4IiwKKwkgICAgICh1bnNpZ25lZCBsb25nKWJmZF9nZXRfc3RhcnRfYWRkcmVzcyhpbWFnZSkpOworICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9yZWdpc3Rlci9wYyAweCVseCIsCisJICAgICAodW5zaWduZWQgbG9uZyljaGlycC0+Y29kZV9sb29wX3ZhKTsKKyAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvbXNyIDB4JXgiLAorCSAgICAgKG1zcl9tYWNoaW5lX2NoZWNrX2VuYWJsZQorCSAgICAgIHwgKGNoaXJwLT5yZWFsX21vZGUKKwkJID8gMAorCQkgOiAobXNyX2luc3RydWN0aW9uX3JlbG9jYXRlCisJCSAgICB8IG1zcl9kYXRhX3JlbG9jYXRlKSkKKwkgICAgICB8IChjaGlycC0+bGl0dGxlX2VuZGlhbgorCQkgPyAobXNyX2xpdHRsZV9lbmRpYW5fbW9kZQorCQkgICAgfCBtc3JfaW50ZXJydXB0X2xpdHRsZV9lbmRpYW5fbW9kZSkKKwkJIDogMCkKKwkgICAgICB8IChjaGlycC0+ZmxvYXRpbmdfcG9pbnRfYXZhaWxhYmxlCisJCSA/IG1zcl9mbG9hdGluZ19wb2ludF9hdmFpbGFibGUKKwkJIDogMCkKKwkgICAgICB8IChjaGlycC0+aW50ZXJydXB0X3ByZWZpeAorCQkgPyBtc3JfaW50ZXJydXB0X3ByZWZpeAorCQkgOiAwKQorCSAgICAgICkpOworICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9yZWdpc3Rlci9zZHIxIDB4JWx4IiwKKwkgICAgICh1bnNpZ25lZCBsb25nKShjaGlycC0+aHRhYl9yYQorCQkJICAgICB8IE1BU0szMigxNiwgMjIpCisJCQkgICAgIHwgKChjaGlycC0+c2l6ZW9mX2h0YWIgLSAxKSA+PiAxNikpKTsKKyAgLyogbWFrZSBjZXJ0YWluIHRoYXQgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzIG1hcCBzdHJhaWdodCB0aHJvdWdoICovCisgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvc3IlZCAweCVseCIsCisJICAgICAgIGksICh1bnNpZ25lZCBsb25nKWkpOworICB9CisKKyAgLyogZXN0YWJsaXNoIGFuIGluaXRpYWwgc3RhdGUgZm9yIGFsbCBwcm9jZXNzb3JzICovCisKKworICAvKiB0aGUgY2xpZW50IGludGVyZmFjZSBhZGRyZXNzICovCisgIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L3JlZ2lzdGVyL3I1IDB4JWx4IiwKKwkgICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5jb2RlX2NsaWVudF92YSk7CisgIC8qIGEgc3RhY2sgKi8KKyAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvc3AgMHglbHgiLAorCSAgICAgKHVuc2lnbmVkIGxvbmcpKGNoaXJwLT5zdGFja192YSArIGNoaXJwLT5zaXplb2Zfc3RhY2sgLSAxNikpOworICAvKiBpbiBjaHJwIG1vZGUgYW55IGFyZ3VtZW50cyBlbmQgdXAgYmVpbmcgY29uY2F0aW5hdGVkICovCisgIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L3N0YWNrL3N0YWNrLXR5cGUgY2hpcnAiKTsKKworCisgIC8qIGNsaWVudCBpbnRlcmZhY2UgLSBlbXVsLWNhbGwgZm9sbG93ZWQgYnkgcmV0dXJuIGluc3RydWN0aW9uICovCisKKworICBub2RlID0gdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvZGF0YUAweCVseCIsCisJCSAgICAodW5zaWduZWQgbG9uZyljaGlycC0+Y29kZV9jbGllbnRfcmEpOworICB0cmVlX3BhcnNlKG5vZGUsICIuL3BzaW0sZGVzY3JpcHRpb24gXCJjbGllbnQtaW50ZXJmYWNlIGluc3RydWN0aW9uIik7CisgIHRyZWVfcGFyc2Uobm9kZSwgIi4vcmVhbC1hZGRyZXNzIDB4JWx4IiwKKwkgICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5jb2RlX2NsaWVudF9yYSk7CisgIHRyZWVfcGFyc2Uobm9kZSwgIi4vZGF0YSAweCVseCIsCisJICAgICAodW5zaWduZWQgbG9uZyllbXVsX2NhbGxfaW5zdHJ1Y3Rpb24pOworCisgIG5vZGUgPSB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9kYXRhQDB4JWx4IiwKKwkJICAgICh1bnNpZ25lZCBsb25nKShjaGlycC0+Y29kZV9jbGllbnRfcmEgKyA0KSk7CisgIHRyZWVfcGFyc2Uobm9kZSwgIi4vcHNpbSxkZXNjcmlwdGlvbiBcImNsaWVudC1pbnRlcmZhY2UgcmV0dXJuIGluc3RydWN0aW9uIik7CisgIHRyZWVfcGFyc2Uobm9kZSwgIi4vcmVhbC1hZGRyZXNzIDB4JWx4IiwKKwkgICAgICh1bnNpZ25lZCBsb25nKShjaGlycC0+Y29kZV9jbGllbnRfcmEgKyA0KSk7CisgIHRyZWVfcGFyc2Uobm9kZSwgIi4vZGF0YSAweCVseCIsCisJICAgICAodW5zaWduZWQgbG9uZyllbXVsX2Jscl9pbnN0cnVjdGlvbik7CisKKworICAvKiByZXR1cm4gYWRkcmVzcyBmb3IgY2xpZW50IGNhbGxiYWNrcyAtIGFuIGVtdWwtY2FsbCBpbnN0cnVjdGlvbgorICAgICB0aGF0IGlzIGFnYWluIGZvbGxvd2VkIGJ5IGEgcmV0dXJuIGluc3RydWN0aW9uICovCisKKworICBub2RlID0gdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvZGF0YUAweCVseCIsCisJCSAgICAodW5zaWduZWQgbG9uZyljaGlycC0+Y29kZV9jYWxsYmFja19yYSk7CisgIHRyZWVfcGFyc2Uobm9kZSwgIi4vcHNpbSxkZXNjcmlwdGlvbiBcImNsaWVudC1jYWxsYmFjayBpbnN0cnVjdGlvbiIpOworICB0cmVlX3BhcnNlKG5vZGUsICIuL3JlYWwtYWRkcmVzcyAweCVseCIsCisJICAgICAodW5zaWduZWQgbG9uZyljaGlycC0+Y29kZV9jYWxsYmFja19yYSk7CisgIHRyZWVfcGFyc2Uobm9kZSwgIi4vZGF0YSAweCVseCIsCisJICAgICAodW5zaWduZWQgbG9uZyllbXVsX2NhbGxfaW5zdHJ1Y3Rpb24pOworCisgIG5vZGUgPSB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9kYXRhQDB4JWx4IiwKKwkJICAgICh1bnNpZ25lZCBsb25nKShjaGlycC0+Y29kZV9jYWxsYmFja19yYSArIDQpKTsKKyAgdHJlZV9wYXJzZShub2RlLCAiLi9wc2ltLGRlc2NyaXB0aW9uIFwiY2xpZW50LWNhbGxiYWNrIHJldHVybiBpbnN0cnVjdGlvbiIpOworICB0cmVlX3BhcnNlKG5vZGUsICIuL3JlYWwtYWRkcmVzcyAweCVseCIsCisJICAgICAodW5zaWduZWQgbG9uZykoY2hpcnAtPmNvZGVfY2FsbGJhY2tfcmEgKyA0KSk7CisgIHRyZWVfcGFyc2Uobm9kZSwgIi4vZGF0YSAweCVseCIsCisJICAgICAodW5zaWduZWQgbG9uZyllbXVsX2Jscl9pbnN0cnVjdGlvbik7CisKKyAgLyogbG9vcCB0byBrZWVwIG90aGVyIHByb2Nlc3NvcnMgYnVzeSAqLworCisgIG5vZGUgPSB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9kYXRhQDB4JWx4IiwKKwkJICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5jb2RlX2xvb3BfcmEpOworICB0cmVlX3BhcnNlKG5vZGUsICIuL3BzaW0sZGVzY3JpcHRpb24gXCJwcm9jZXNzb3IgYnVzeSBsb29wIik7CisgIHRyZWVfcGFyc2Uobm9kZSwgIi4vcmVhbC1hZGRyZXNzIDB4JWx4IiwKKwkgICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5jb2RlX2xvb3BfcmEpOworICB0cmVlX3BhcnNlKG5vZGUsICIuL2RhdGEgMHglbHgiLAorCSAgICAgKHVuc2lnbmVkIGxvbmcpZW11bF9sb29wX2luc3RydWN0aW9uKTsKKworICAvKiBoYXNoIHRhYmxlICovCisKKyAgLyogY3JlYXRlIGEgaGFzaCB0YWJsZSAqLworCisgIGlmICghY2hpcnAtPnJlYWxfbW9kZSkgeworICAgIG5vZGUgPSB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9odGFiQDB4JWx4IiwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpY2hpcnAtPmh0YWJfcmEpOworICAgIHRyZWVfcGFyc2Uobm9kZSwgIi4vY2xhaW0gMCIpOworICAgIHRyZWVfcGFyc2Uobm9kZSwgIi4vcmVhbC1hZGRyZXNzIDB4JWx4IiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpY2hpcnAtPmh0YWJfcmEpOworICAgIHRyZWVfcGFyc2Uobm9kZSwgIi4vbnItYnl0ZXMgMHglbHgiLAorCSAgICAgICAodW5zaWduZWQgbG9uZyljaGlycC0+c2l6ZW9mX2h0YWIpOworICB9CisKKyAgLyogbWFwIGluIHRoZSBzdGFjayAqLworCisgIGlmICghY2hpcnAtPnJlYWxfbW9kZSkgeworICAgIG5vZGUgPSB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9odGFiL3B0ZUAweCVseCIsCisJCSAgICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5zdGFja19yYSk7CisgICAgdHJlZV9wYXJzZShub2RlLCAiLi9wc2ltLGRlc2NyaXB0aW9uIFwibWFwIGluIHRoZSBzdGFjayIpOworICAgIHRyZWVfcGFyc2Uobm9kZSwgIi4vY2xhaW0gMSIpOworICAgIHRyZWVfcGFyc2Uobm9kZSwgIi4vdmlydHVhbC1hZGRyZXNzIDB4JWx4IiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpY2hpcnAtPnN0YWNrX3ZhKTsKKyAgICB0cmVlX3BhcnNlKG5vZGUsICIuL3JlYWwtYWRkcmVzcyAweCVseCIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5zdGFja19yYSk7CisgICAgdHJlZV9wYXJzZShub2RlLCAiLi9uci1ieXRlcyAweCVseCIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5zaXplb2Zfc3RhY2spOworICAgIHRyZWVfcGFyc2Uobm9kZSwgIi4vd2ltZyAlZCIsIDB4Nyk7CisgICAgdHJlZV9wYXJzZShub2RlLCAiLi9wcCAlZCIsIDB4Mik7CisgIH0KKworICAvKiBtYXAgaW4gdGhlIGNocnAgb3BlbmJvb3QgY2FsbGJhY2sgY29kZSAqLworCisgIGlmICghY2hpcnAtPnJlYWxfbW9kZSkgeworICAgIG5vZGUgPSB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9odGFiL3B0ZUAweCVseCIsCisJCSAgICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5jb2RlX3JhKTsKKyAgICB0cmVlX3BhcnNlKG5vZGUsICIuL3BzaW0sZGVzY3JpcHRpb24gXCJtYXAgaW4gY2hycCBvcGVuYm9vdCBjYWxsYmFjayBjb2RlIik7CisgICAgdHJlZV9wYXJzZShub2RlLCAiLi9jbGFpbSAxIik7CisgICAgdHJlZV9wYXJzZShub2RlLCAiLi92aXJ0dWFsLWFkZHJlc3MgMHglbHgiLAorCSAgICAgICAodW5zaWduZWQgbG9uZyljaGlycC0+Y29kZV92YSk7CisgICAgdHJlZV9wYXJzZShub2RlLCAiLi9yZWFsLWFkZHJlc3MgMHglbHgiLAorCSAgICAgICAodW5zaWduZWQgbG9uZyljaGlycC0+Y29kZV9yYSk7CisgICAgdHJlZV9wYXJzZShub2RlLCAiLi9uci1ieXRlcyAweCVseCIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5zaXplb2ZfY29kZSk7CisgICAgdHJlZV9wYXJzZShub2RlLCAiLi93aW1nICVkIiwgMHg3KTsKKyAgICB0cmVlX3BhcnNlKG5vZGUsICIuL3BwICVkIiwgMHgyKTsKKyAgfQorCisgIC8qIG1hcCBpbiB0aGUgcHJvZ3JhbSB0byBydW4gKi8KKworICBpZiAoY2hpcnAtPnJlYWxfbW9kZSkgeworICAgIG5vZGUgPSB0cmVlX3BhcnNlKG5vZGUsICIvb3BlbnByb20vaW5pdC9sb2FkLWJpbmFyeSIpOworICAgIHRyZWVfcGFyc2Uobm9kZSwgIi4vcHNpbSxkZXNjcmlwdGlvbiBcImxvYWQgdGhlIGJpbmFyeSIpOworICAgIHRyZWVfcGFyc2Uobm9kZSwgIi4vZmlsZS1uYW1lICVzIiwgYmZkX2dldF9maWxlbmFtZShpbWFnZSkpOworICAgIHRyZWVfcGFyc2Uobm9kZSwgIi4vY2xhaW0gMSIpOworICB9CisgIGVsc2UgeworICAgIG5vZGUgPSB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9odGFiL3B0ZUAweCVseCIsCisJCSAgICAgICh1bnNpZ25lZCBsb25nKWNoaXJwLT5sb2FkX2Jhc2UpOworICAgIHRyZWVfcGFyc2Uobm9kZSwgIi4vcHNpbSxkZXNjcmlwdGlvbiBcImxvYWQgJiBtYXAgdGhlIGJpbmFyeSIpOworICAgIHRyZWVfcGFyc2Uobm9kZSwgIi4vY2xhaW0gMSIpOworICAgIHRyZWVfcGFyc2Uobm9kZSwgIi4vZmlsZS1uYW1lIFwiJXMiLCBiZmRfZ2V0X2ZpbGVuYW1lKGltYWdlKSk7CisgICAgdHJlZV9wYXJzZShub2RlLCAiLi93aW1nICVkIiwgMHg3KTsKKyAgICB0cmVlX3BhcnNlKG5vZGUsICIuL3BwICVkIiwgMHgyKTsKKyAgfQorCisgIHJldHVybiBjaGlycDsKK30KKworc3RhdGljIHZvaWQKK2VtdWxfY2hpcnBfaW5pdChvc19lbXVsX2RhdGEgKmVtdWxfZGF0YSwKKwkJaW50IG5yX2NwdXMpCit7CisgIGVtdWxfZGF0YS0+c3RhdGUgPSBzZXJ2aW5nOworfQorCitzdGF0aWMgaW50CitlbXVsX2NoaXJwX2luc3RydWN0aW9uX2NhbGwoY3B1ICpwcm9jZXNzb3IsCisJCQkgICAgdW5zaWduZWRfd29yZCBjaWEsCisJCQkgICAgdW5zaWduZWRfd29yZCByYSwKKwkJCSAgICBvc19lbXVsX2RhdGEgKmVtdWxfZGF0YSkKK3sKKyAgdW5zaWduZWRfd29yZCBzZXJ2aWNlX25hbWVfYWRkcjsKKyAgdW5zaWduZWRfd29yZCByZXN1bHQ7CisgIGNoYXIgc2VydmljZV9idWZbMzJdOworICBjaGFyICpzZXJ2aWNlX25hbWU7CisgIGNoaXJwX3NlcnZpY2VzICpzZXJ2aWNlOworCisgIHN3aXRjaCAoZW11bF9kYXRhLT5zdGF0ZSkgeworCisgIGNhc2Ugc2VydmluZzoKKyAgICAvKiB3ZSBhcmUgd2FpdGluZyBvbiBhbiBPcGVuQm9vdCByZXF1ZXN0IGZyb20gdGhlIGNsaWVudCBwcm9ncmFtCisgICAgICAgdmlhIHRoZSBjbGllbnQgaW50ZXJmYWNlICovCisgICAgaWYgKGNpYSAhPSBlbXVsX2RhdGEtPmNvZGVfY2xpZW50X3ZhKQorICAgICAgcmV0dXJuIDA7CisgICAgZW11bF9kYXRhLT5yZXR1cm5fYWRkcmVzcyA9IExSOworICAgIGVtdWxfZGF0YS0+YXJndW1lbnRzID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbM107CisgICAgLyogdHJ5IHRvIGRldGVybWluZSB3aGF0IHRvIGRvICovCisgICAgc2VydmljZV9uYW1lX2FkZHIgPSBlbXVsX3JlYWRfd29yZChjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclszXSwKKwkJCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOworICAgIHNlcnZpY2VfbmFtZSA9IGVtdWxfcmVhZF9zdHJpbmcoc2VydmljZV9idWYsIHNlcnZpY2VfbmFtZV9hZGRyLAorCQkJCSAgICBzaXplb2Yoc2VydmljZV9idWYpLCBwcm9jZXNzb3IsIGNpYSk7CisgICAgZW11bF9kYXRhLT5uX2FyZ3MgPSBlbXVsX3JlYWRfd29yZChlbXVsX2RhdGEtPmFyZ3VtZW50cyArIHNpemVvZih1bnNpZ25lZF9jZWxsKSwKKwkJCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOworICAgIGVtdWxfZGF0YS0+bl9yZXR1cm5zID0gZW11bF9yZWFkX3dvcmQoZW11bF9kYXRhLT5hcmd1bWVudHMgKyAyICogc2l6ZW9mKHVuc2lnbmVkX2NlbGwpLAorCQkJCQkgIHByb2Nlc3NvciwgY2lhKTsKKyAgICAvKiB2ZXJpZnkgd2hhdCB3YXMgcGFzc2VkICovCisgICAgaWYgKHNlcnZpY2VfbmFtZV9hZGRyID09IDAKKwl8fCBzZXJ2aWNlX25hbWUgPT0gTlVMTCkgeworICAgICAgZXJyb3IoIk9wZW5GaXJtd2FyZSBjYWxsZWQgd2l0aCBpbnZhbGlkIChOVUxMKSBzZXJ2aWNlIG5hbWUgZnJvbSAweCVseCB3aXRoIGFyZ3MgMHglbHhcbiIsCisJICAgICh1bnNpZ25lZCBsb25nKWVtdWxfZGF0YS0+cmV0dXJuX2FkZHJlc3MsCisJICAgICh1bnNpZ25lZCBsb25nKWVtdWxfZGF0YS0+YXJndW1lbnRzKTsKKyAgICB9CisgICAgaWYgKGVtdWxfZGF0YS0+bl9hcmdzID4gNikgeyAvKiBTZWUgaWVlMTI3NSByZXF1aXJlbWVudHMgb24gbnIgcmV0dXJucyAqLworICAgICAgZXJyb3IoIk9wZW5GaXJtd2FyZSBzZXJ2aWNlICVzIGNhbGxlZCBmcm9tIDB4JWx4IHdpdGggYXJncyAweCVseCwgdG9vIG1hbnkgYXJncyAoJWQpXG4iLAorCSAgICAodW5zaWduZWQgbG9uZyllbXVsX2RhdGEtPnJldHVybl9hZGRyZXNzLAorCSAgICAodW5zaWduZWQgbG9uZyllbXVsX2RhdGEtPmFyZ3VtZW50cywKKwkgICAgZW11bF9kYXRhLT5uX3JldHVybnMpOworICAgIH0KKyAgICBpZiAoZW11bF9kYXRhLT5uX3JldHVybnMgPiA2KSB7CisgICAgICBlcnJvcigiT3BlbkZpcm13YXJlIHNlcnZpY2UgJXMgY2FsbGVkIGZyb20gMHglbHggd2l0aCBhcmdzIDB4JWx4LCAgd2l0aCB0b28gbWFueSByZXR1cm5zICglZClcbiIsCisJICAgICh1bnNpZ25lZCBsb25nKWVtdWxfZGF0YS0+cmV0dXJuX2FkZHJlc3MsCisJICAgICh1bnNpZ25lZCBsb25nKWVtdWxfZGF0YS0+YXJndW1lbnRzLAorCSAgICBlbXVsX2RhdGEtPm5fYXJncyk7CisgICAgfQorICAgIC8qIGxvb2sgaXQgdXAgKi8KKyAgICBUUkFDRSh0cmFjZV9vc19lbXVsLCAoIiVzIGNhbGxlZCBmcm9tIDB4JWx4IHdpdGggYXJncyAweCVseFxuIiwKKwkJCSAgc2VydmljZV9uYW1lLAorCQkJICAodW5zaWduZWQgbG9uZyllbXVsX2RhdGEtPnJldHVybl9hZGRyZXNzLAorCQkJICAodW5zaWduZWQgbG9uZyllbXVsX2RhdGEtPmFyZ3VtZW50cykpOworICAgIHNlcnZpY2UgPSBzZXJ2aWNlczsKKyAgICB3aGlsZSAoc2VydmljZS0+bmFtZSAhPSBOVUxMICYmIHN0cmNtcChzZXJ2aWNlLT5uYW1lLCBzZXJ2aWNlX25hbWUpICE9IDApCisgICAgICBzZXJ2aWNlKys7CisgICAgLyogZm91bmQgb3Igbm90PyAqLworICAgIGlmIChzZXJ2aWNlLT5uYW1lID09IE5VTEwpIHsKKyAgICAgIGVycm9yKCJPcGVuQm9vdCBzZXJ2aWNlIGAlcycgbm90IGZvdW5kXG4iLCBzZXJ2aWNlX25hbWUpOworICAgICAgVFJBQ0UodHJhY2Vfb3NfZW11bCwgKCIlcyBub3QgZm91bmRcbiIsIHNlcnZpY2VfbmFtZSkpOworICAgICAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbM10gPSAtMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBlbXVsX2RhdGEtPnNlcnZpY2UgPSBzZXJ2aWNlOworICAgICAgLyogY2FsbCB1cG9uIGl0ICovCisgICAgICByZXN1bHQgPSBzZXJ2aWNlLT5oYW5kbGVyKGVtdWxfZGF0YSwgcHJvY2Vzc29yLCBjaWEpOworICAgICAgaWYgKHJlc3VsdCAhPSAwKQorCVRSQUNFKHRyYWNlX29zX2VtdWwsICgiJXMgYWJvcnRlZCB3aXRoICVsZFxuIiwgc2VydmljZV9uYW1lLCAobG9uZylyZXN1bHQpKTsKKyAgICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzNdID0gcmVzdWx0OworICAgIH0KKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIGVycm9yKCJlbXVsX2NoaXJwX2luc3RydWN0aW9uX2NhbGwoKSB1bmtub3duIGludGVybmFsIHN0YXRlXG4iKTsKKyAgICByZXN1bHQgPSAtMTsKKyAgICBicmVhazsKKworICB9CisKKyAgLyogcmV0dXJuIHRvIGNhbGxlciAtIGluc3RydWN0aW9uIGZvbGxvd2luZyB0aGlzIGlzIGEgZnVuY3Rpb24gcmV0dXJuICovCisgIHJldHVybiAxOworfQorCitjb25zdCBvc19lbXVsIGVtdWxfY2hpcnAgPSB7CisgICJjaGlycCIsCisgIGVtdWxfY2hpcnBfY3JlYXRlLAorICBlbXVsX2NoaXJwX2luaXQsCisgIE5VTEwsIC8qc3lzdGVtX2NhbGwqLworICBlbXVsX2NoaXJwX2luc3RydWN0aW9uX2NhbGwsCisgIDAgLypkYXRhKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9lbXVsX2NoaXJwLmggYi9zaW0vcHBjL2VtdWxfY2hpcnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjY1ZjVjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9lbXVsX2NoaXJwLmgKQEAgLTAsMCArMSw3NSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfRU1VTF9DSElSUF9IXworI2RlZmluZSBfRU1VTF9DSElSUF9IXworCisvKiBFTVVMX0NISVJQOgorCisgICBUaGUgZW11bGF0aW9uIG9mIHRoZSBPcGVuQm9vdCBjbGllbnQgaW50ZXJmYWNlIChhcyBkZWZpbmVkIGluIDEyNzUpCisgICBpbGx1c3RyYXRlcyBob3cgaXQgaXMgcG9zc2libGUgZm9yIFBTSU0gdG8gaW1wbGVtZW50IGFuIGludGVyZmFjZQorICAgdGhhdCBpcyBib3RoIHJ1bm5pbmcgaW4gdmlydHVhbCBtZW1vcnkgYW5kIGlzIGNhbGxlZCB1c2luZyBhCisgICBzdGFuZGFyZCBmdW5jdGlvbiBjYWxsIGludGVyZmFjZS4KKworICAgVGhlIE9wZW5Cb290IGNsaWVudCBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgdXNpbmcgdHdvCisgICBpbnN0cnVjdGlvbnM6CisKKyAgIAljbGllbnRfaW50ZXJmYWNlOgorCQk8ZW11bF9jYWxsPgorCQlibHIKKworICAgQSBjbGllbnQgcHJvZ3JhbSBtYWtlcyBhIGZ1bmN0aW9uIGNhbGwgdG8gYGNsaWVudF9pbnRlcmZhY2UnIHVzaW5nCisgICB0aGUgYGJsJyBpbnN0cnVjdGlvbi4gIFRoZSBzaW11bGF0b3Igd2lsbCB0aGVuIGV4ZWN1dGUgdGhlCisgICA8ZW11bF9jYWxsPiBpbnN0cnVjdGlvbiAod2hpY2ggY2FsbHMgZW11bF9jaGlycCkgYW5kIHRoZW4gdGhlIGBibHInCisgICB3aGljaCB3aWxsIHJldHVybiB0byB0aGUgY2FsbGVyLgorCisgICBJbiBhZGRpdGlvbiB0byBwcm92aWRpbmcgdGhlIGBjbGllbnRfaW50ZXJmYWNlJyBlbnRyeSBwb2ludCwgd2hpbGUKKyAgIGEgY2xpZW50IHJlcXVlc3QgaXMgYmVpbmcgaGFuZGxlZCwgZW11bF9jaGlycCBwYXRjaGVzICh3ZWxsIGl0IHdpbGwKKyAgIG9uZSBkYXkpIHRoZSBkYXRhIGFjY2VzcyBleGNlcHRpb24gdmVjdG9yIHdpdGggYSA8ZW11bF9jYWxsPgorICAgaW5zdHJ1Y3Rpb24uICBCeSBkb2luZyB0aGlzLCBlbXVsX2NoaXJwIGlzIGFibGUgdG8gY2F0Y2ggYW5kIGhhbmRsZQorICAgYW55IGludmFsaWQgZGF0YSBhY2Nlc3NlcyBpdCBtYWtlcyB3aGlsZSBlbXVsYXRpbmcgYSBjbGllbnQgY2FsbC4KKworICAgV2hlbiBzdWNoIGFuIGV4Y2VwdGlvbiBvY2N1cmVzLCBlbXVsX2NoaXJwIGlzIGFibGUgdG8gcmVjb3ZlciBieQorICAgcmVzdG9yaW5nIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gY2FsbGluZyB0aGUgY2xpZW50cyBjYWxsYmFjaworICAgaW50ZXJmYWNlIHNvIHRoYXQgdGhlIGNsaWVudCBjYW4gcmVjb3ZlciBmcm9tIHRoZSBkYXRhIGV4Y2VwdGlvbi4KKworICAgSGFuZGxpbmcgdGhpcyBhcmUgdGhlIGVtdWxfY2hpcnAgc3RhdGVzOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aW5nLS0tLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgIHwKKyAgIEVtdWxhdGlvbiBjb21wbGVhdGVkICAgICBeICAgICAgICAgICB2IENsaWVudCBtYWtlcyBjYWxsIHRvCisgICAgIC0gcmVzdG9yZSBpbnQgdmVjdG9ycyAgfCAgICAgICAgICAgfCBlbXVsYXRlZCBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICB2ICAgLSBwYXRjaCBleGNlcHRpb24gdmVjdG9ycworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAtZW11bGF0aW5nLS4gZW11bGF0aW5nIHRoZSByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHYgRW11bGF0aW9uIGVuY291bnRlcnMKKyAgIENsaWVudCBjYWxsYmFjayByZWNvdmVycyBeICAgICAgICAgICB8IGRhdGEgYWNjZXNzIGV4Y2VwdGlvbgorICAgZnJvbSBkYXRhIGV4Y2VwdGlvbiBhbmQgIHwgICAgICAgICAgIHYgICAtIHJlLWVuYWJsZSB2bQorICAgcmV0dXJucy4gICAgICAgICAgICAgICAgIF4gICAgICAgICAgIHwgICAtIGNhbGwgY2xpZW50IGNhbGxiYWNrCisgICAgIC0gcmVzdGFydCByZXF1ZXN0ICAgICAgfCAgICAgICAgICAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYC0tZmF1bHRpbmcKKyAgICovCisKKworZXh0ZXJuIGNvbnN0IG9zX2VtdWwgZW11bF9jaGlycDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vcHBjL2VtdWxfZ2VuZXJpYy5jIGIvc2ltL3BwYy9lbXVsX2dlbmVyaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDQzMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9lbXVsX2dlbmVyaWMuYwpAQCAtMCwwICsxLDM0MyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyAgICAqLworCisKKyNpZm5kZWYgX0VNVUxfR0VORVJJQ19DXworI2RlZmluZSBfRU1VTF9HRU5FUklDX0NfCisKKyNpbmNsdWRlICJlbXVsX2dlbmVyaWMuaCIKKworI2lmbmRlZiBTVEFUSUNfSU5MSU5FX0VNVUxfR0VORVJJQworI2RlZmluZSBTVEFUSUNfSU5MSU5FX0VNVUxfR0VORVJJQyBTVEFUSUNfSU5MSU5FCisjZW5kaWYKKworCitTVEFUSUNfSU5MSU5FX0VNVUxfR0VORVJJQyB2b2lkCitlbXVsX3N5c2NhbGxfZW50ZXIoZW11bF9zeXNjYWxsICplbXVsLAorCQkgICBpbnQgY2FsbCwKKwkJICAgaW50IGFyZzAsCisJCSAgIGNwdSAqcHJvY2Vzc29yLAorCQkgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgcHJpbnRmX2ZpbHRlcmVkKCIlZDoweCVseDolcygiLAorCQkgIGNwdV9ucihwcm9jZXNzb3IpICsgMSwKKwkJICAobG9uZyljaWEsCisJCSAgZW11bC0+c3lzY2FsbF9kZXNjcmlwdG9yW2NhbGxdLm5hbWUpOworfQorCisKK1NUQVRJQ19JTkxJTkVfRU1VTF9HRU5FUklDIHZvaWQKK2VtdWxfc3lzY2FsbF9leGl0KGVtdWxfc3lzY2FsbCAqZW11bCwKKwkJICBpbnQgY2FsbCwKKwkJICBpbnQgYXJnMCwKKwkJICBjcHUgKnByb2Nlc3NvciwKKwkJICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgaW50IHN0YXR1cyA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzNdOworICBpbnQgZXJyb3IgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclswXTsKKyAgcHJpbnRmX2ZpbHRlcmVkKCIpPSVkIiwgc3RhdHVzKTsKKyAgaWYgKGVycm9yID4gMCAmJiBlcnJvciA8IGVtdWwtPm5yX2Vycm9yX25hbWVzKQorICAgIHByaW50Zl9maWx0ZXJlZCgiWyVzXSIsIGVtdWwtPmVycm9yX25hbWVzW2Vycm9yXSk7CisgIHByaW50Zl9maWx0ZXJlZCgiXG4iKTsKK30KKworCitJTkxJTkVfRU1VTF9HRU5FUklDIHVuc2lnbmVkNjQKK2VtdWxfcmVhZF9ncHI2NChjcHUgKnByb2Nlc3NvciwKKwkJaW50IGcpCit7CisgIHVuc2lnbmVkMzIgaGk7CisgIHVuc2lnbmVkMzIgbG87CisgIGlmIChDVVJSRU5UX1RBUkdFVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pIHsKKyAgICBoaSA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2ddOworICAgIGxvID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbZysxXTsKKyAgfQorICBlbHNlIHsKKyAgICBsbyA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2ddOworICAgIGhpID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbZysxXTsKKyAgfQorICByZXR1cm4gKElOU0VSVEVENjQoaGksIDAsIDMxKSB8IElOU0VSVEVENjQobG8sIDMyLCA2MykpOworfQorCisKK0lOTElORV9FTVVMX0dFTkVSSUMgdm9pZAorZW11bF93cml0ZV9ncHI2NChjcHUgKnByb2Nlc3NvciwKKwkJIGludCBnLAorCQkgdW5zaWduZWQ2NCB2YWwpCit7CisgIHVuc2lnbmVkMzIgaGkgPSBFWFRSQUNURUQ2NCh2YWwsIDAsIDMxKTsKKyAgdW5zaWduZWQzMiBsbyA9IEVYVFJBQ1RFRDY0KHZhbCwgMzIsIDYzKTsKKyAgaWYgKENVUlJFTlRfVEFSR0VUX0JZVEVfT1JERVIgPT0gQklHX0VORElBTikgeworICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2ddID0gaGk7CisgICAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbZysxXSA9IGxvOworICB9CisgIGVsc2UgeworICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2ddID0gbG87CisgICAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbZysxXSA9IGhpOworICB9Cit9CisKKworSU5MSU5FX0VNVUxfR0VORVJJQyBjaGFyICoKK2VtdWxfcmVhZF9zdHJpbmcoY2hhciAqZGVzdCwKKwkJIHVuc2lnbmVkX3dvcmQgYWRkciwKKwkJIHVuc2lnbmVkIG5yX2J5dGVzLAorCQkgY3B1ICpwcm9jZXNzb3IsCisJCSB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgdW5zaWduZWQgbnJfbW92ZWQgPSAwOworICBpZiAoYWRkciA9PSAwKQorICAgIHJldHVybiBOVUxMOworICB3aGlsZSAoMSkgeworICAgIGRlc3RbbnJfbW92ZWRdID0gdm1fZGF0YV9tYXBfcmVhZF8xKGNwdV9kYXRhX21hcChwcm9jZXNzb3IpLAorCQkJCQlhZGRyICsgbnJfbW92ZWQsCisJCQkJCXByb2Nlc3NvciwgY2lhKTsKKyAgICBpZiAoZGVzdFtucl9tb3ZlZF0gPT0gJ1wwJyB8fCBucl9tb3ZlZCA+PSBucl9ieXRlcykKKyAgICAgIGJyZWFrOworICAgIG5yX21vdmVkKys7CisgIH0KKyAgZGVzdFtucl9tb3ZlZF0gPSAnXDAnOworICByZXR1cm4gZGVzdDsKK30KKworCitJTkxJTkVfRU1VTF9HRU5FUklDIHZvaWQKK2VtdWxfd3JpdGVfc3RhdHVzKGNwdSAqcHJvY2Vzc29yLAorCQkgIGludCBzdGF0dXMsCisJCSAgaW50IGVycm5vKQoreworICBpZiAoc3RhdHVzID09IC0xICYmIGVycm5vICE9IDApIHsKKyAgICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclszXSA9IGVycm5vOworICAgIENSX1NFVCgwLCBjcl9pX3N1bW1hcnlfb3ZlcmZsb3cpOworICB9CisgIGVsc2UgeworICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzNdID0gc3RhdHVzOworICAgIENSX1NFVCgwLCAwKTsKKyAgfQorfQorCisKK0lOTElORV9FTVVMX0dFTkVSSUMgdm9pZAorZW11bF93cml0ZTJfc3RhdHVzKGNwdSAqcHJvY2Vzc29yLAorCQkgICBpbnQgc3RhdHVzMSwKKwkJICAgaW50IHN0YXR1czIsCisJCSAgIGludCBlcnJubykKK3sKKyAgaWYgKHN0YXR1czEgPT0gLTEgJiYgZXJybm8gIT0gMCkgeworICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzNdID0gZXJybm87CisgICAgQ1JfU0VUKDAsIGNyX2lfc3VtbWFyeV9vdmVyZmxvdyk7CisgIH0KKyAgZWxzZSB7CisgICAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbM10gPSBzdGF0dXMxOworICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzRdID0gc3RhdHVzMjsKKyAgICBDUl9TRVQoMCwgMCk7CisgIH0KK30KKworCitJTkxJTkVfRU1VTF9HRU5FUklDIHVuc2lnbmVkX3dvcmQKK2VtdWxfcmVhZF93b3JkKHVuc2lnbmVkX3dvcmQgYWRkciwKKwkgICAgICAgY3B1ICpwcm9jZXNzb3IsCisJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICByZXR1cm4gdm1fZGF0YV9tYXBfcmVhZF93b3JkKGNwdV9kYXRhX21hcChwcm9jZXNzb3IpLAorCQkJICAgICAgIGFkZHIsCisJCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOworfQorCisKK0lOTElORV9FTVVMX0dFTkVSSUMgdm9pZAorZW11bF93cml0ZV93b3JkKHVuc2lnbmVkX3dvcmQgYWRkciwKKwkJdW5zaWduZWRfd29yZCBidWYsCisJCWNwdSAqcHJvY2Vzc29yLAorCQl1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgdm1fZGF0YV9tYXBfd3JpdGVfd29yZChjcHVfZGF0YV9tYXAocHJvY2Vzc29yKSwKKwkJCSBhZGRyLAorCQkJIGJ1ZiwKKwkJCSBwcm9jZXNzb3IsIGNpYSk7Cit9CisKKworSU5MSU5FX0VNVUxfR0VORVJJQyB2b2lkCitlbXVsX3dyaXRlX2J1ZmZlcihjb25zdCB2b2lkICpzb3VyY2UsCisJCSAgdW5zaWduZWRfd29yZCBhZGRyLAorCQkgIHVuc2lnbmVkIG5yX2J5dGVzLAorCQkgIGNwdSAqcHJvY2Vzc29yLAorCQkgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBpbnQgbnJfbW92ZWQ7CisgIGZvciAobnJfbW92ZWQgPSAwOyBucl9tb3ZlZCA8IG5yX2J5dGVzOyBucl9tb3ZlZCsrKSB7CisgICAgdm1fZGF0YV9tYXBfd3JpdGVfMShjcHVfZGF0YV9tYXAocHJvY2Vzc29yKSwKKwkJCWFkZHIgKyBucl9tb3ZlZCwKKwkJCSgoY29uc3QgY2hhciopc291cmNlKVtucl9tb3ZlZF0sCisJCQlwcm9jZXNzb3IsIGNpYSk7CisgIH0KK30KKworCitJTkxJTkVfRU1VTF9HRU5FUklDIHZvaWQKK2VtdWxfcmVhZF9idWZmZXIodm9pZCAqZGVzdCwKKwkJIHVuc2lnbmVkX3dvcmQgYWRkciwKKwkJIHVuc2lnbmVkIG5yX2J5dGVzLAorCQkgY3B1ICpwcm9jZXNzb3IsCisJCSB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgaW50IG5yX21vdmVkOworICBmb3IgKG5yX21vdmVkID0gMDsgbnJfbW92ZWQgPCBucl9ieXRlczsgbnJfbW92ZWQrKykgeworICAgICgoY2hhciopZGVzdClbbnJfbW92ZWRdID0gdm1fZGF0YV9tYXBfcmVhZF8xKGNwdV9kYXRhX21hcChwcm9jZXNzb3IpLAorCQkJCQkJIGFkZHIgKyBucl9tb3ZlZCwKKwkJCQkJCSBwcm9jZXNzb3IsIGNpYSk7CisgIH0KK30KKworCitJTkxJTkVfRU1VTF9HRU5FUklDIHZvaWQKK2VtdWxfZG9fc3lzdGVtX2NhbGwob3NfZW11bF9kYXRhICplbXVsX2RhdGEsCisJCSAgICBlbXVsX3N5c2NhbGwgKmVtdWwsCisJCSAgICB1bnNpZ25lZCBjYWxsLAorCQkgICAgY29uc3QgaW50IGFyZzAsCisJCSAgICBjcHUgKnByb2Nlc3NvciwKKwkJICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBlbXVsX3N5c2NhbGxfaGFuZGxlciAqaGFuZGxlciA9IE5VTEw7CisgIGlmIChjYWxsID49IGVtdWwtPm5yX3N5c3RlbV9jYWxscykKKyAgICBlcnJvcigiZG9fY2FsbCgpIG9zX2VtdWwgY2FsbCAlZCBvdXQtb2YtcmFuZ2VcbiIsIGNhbGwpOworCisgIGhhbmRsZXIgPSBlbXVsLT5zeXNjYWxsX2Rlc2NyaXB0b3JbY2FsbF0uaGFuZGxlcjsKKyAgaWYgKGhhbmRsZXIgPT0gTlVMTCkgeworICAgIGlmIChlbXVsLT5zeXNjYWxsX2Rlc2NyaXB0b3JbY2FsbF0ubmFtZSkgeworICAgICAgZXJyb3IoImRvX2NhbGwoKSB1bmltcGxlbWVudGVkIGNhbGwgJXNcbiIsIGVtdWwtPnN5c2NhbGxfZGVzY3JpcHRvcltjYWxsXS5uYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgZXJyb3IoImRvX2NhbGwoKSB1bmltcGxlbWVudGVkIGNhbGwgJWRcbiIsIGNhbGwpOworICAgIH0KKyAgfQorCisgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKKyAgICBlbXVsX3N5c2NhbGxfZW50ZXIoZW11bCwgY2FsbCwgYXJnMCwgcHJvY2Vzc29yLCBjaWEpOworCisgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzBdID0gMDsgLyogZGVmYXVsdCBzdWNjZXNzICovCisgIGhhbmRsZXIoZW11bF9kYXRhLCBjYWxsLCBhcmcwLCBwcm9jZXNzb3IsIGNpYSk7CisKKyAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQorICAgIGVtdWxfc3lzY2FsbF9leGl0KGVtdWwsIGNhbGwsIGFyZzAsIHByb2Nlc3NvciwgY2lhKTsKK30KKworCisvKiBkZWZhdWx0IHNpemUgZm9yIHRoZSBmaXJzdCBiYW5rIG9mIG1lbW9yeSAqLworCisjaWZuZGVmIE9FQV9NRU1PUllfU0laRQorI2RlZmluZSBPRUFfTUVNT1JZX1NJWkUgMHgxMDAwMDAKKyNlbmRpZgorCisKKy8qIEFkZCBvcHRpb25zIHRvIHRoZSBkZXZpY2UgdHJlZSAqLworCitJTkxJTkVfRU1VTF9HRU5FUklDIHZvaWQKK2VtdWxfYWRkX3RyZWVfb3B0aW9ucyhkZXZpY2UgKnRyZWUsCisJCSAgICAgIGJmZCAqaW1hZ2UsCisJCSAgICAgIGNvbnN0IGNoYXIgKmVtdWwsCisJCSAgICAgIGNvbnN0IGNoYXIgKmVudiwKKwkJICAgICAgaW50IG9lYV9pbnRlcnJ1cHRfcHJlZml4KQoreworICBpbnQgbGl0dGxlX2VuZGlhbiA9IDA7CisKKyAgLyogc29ydCBvdXQgbGl0dGxlIGVuZGlhbiAqLworICBpZiAodHJlZV9maW5kX3Byb3BlcnR5KHRyZWUsICIvb3B0aW9ucy9saXR0bGUtZW5kaWFuPyIpKQorICAgIGxpdHRsZV9lbmRpYW4gPSB0cmVlX2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eSh0cmVlLCAiL29wdGlvbnMvbGl0dGxlLWVuZGlhbj8iKTsKKyAgZWxzZSB7CisjaWZkZWYgYmZkX2xpdHRsZV9lbmRpYW4JLyogbmV3IGJmZCAqLworICAgIGxpdHRsZV9lbmRpYW4gPSAoaW1hZ2UgIT0gTlVMTCAmJiBiZmRfbGl0dGxlX2VuZGlhbihpbWFnZSkpOworI2Vsc2UKKyAgICBsaXR0bGVfZW5kaWFuID0gKGltYWdlICE9IE5VTEwgJiYKKwkJICAgICAhaW1hZ2UtPnh2ZWMtPmJ5dGVvcmRlcl9iaWdfcCk7CisjZW5kaWYKKyAgICB0cmVlX3BhcnNlKHRyZWUsICIvb3B0aW9ucy9saXR0bGUtZW5kaWFuPyAlcyIsCisJICAgICAgIGxpdHRsZV9lbmRpYW4gPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgfQorCisgIC8qIG1pc2Mgb3RoZXIgc3R1ZmYgKi8KKyAgdHJlZV9wYXJzZSh0cmVlLCAiL29wZW5wcm9tL29wdGlvbnMvb2VhLW1lbW9yeS1zaXplIDB4JXgiLAorCSAgICAgT0VBX01FTU9SWV9TSVpFKTsKKyAgdHJlZV9wYXJzZSh0cmVlLCAiL29wZW5wcm9tL29wdGlvbnMvb2VhLWludGVycnVwdC1wcmVmaXggJWQiLAorCSAgICAgb2VhX2ludGVycnVwdF9wcmVmaXgpOworICB0cmVlX3BhcnNlKHRyZWUsICIvb3BlbnByb20vb3B0aW9ucy9zbXAgMSIpOworICB0cmVlX3BhcnNlKHRyZWUsICIvb3BlbnByb20vb3B0aW9ucy9lbnYgJXMiLCBlbnYpOworICB0cmVlX3BhcnNlKHRyZWUsICIvb3BlbnByb20vb3B0aW9ucy9vcy1lbXVsICVzIiwgZW11bCk7CisgIHRyZWVfcGFyc2UodHJlZSwgIi9vcGVucHJvbS9vcHRpb25zL3N0cmljdC1hbGlnbm1lbnQ/ICVzIiwKKwkgICAgIChXSVRIX0FMSUdOTUVOVCA9PSBTVFJJQ1RfQUxJR05NRU5UKQorCSAgICAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgdHJlZV9wYXJzZSh0cmVlLCAiL29wZW5wcm9tL29wdGlvbnMvZmxvYXRpbmctcG9pbnQ/ICVzIiwKKwkgICAgIFdJVEhfRkxPQVRJTkdfUE9JTlQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgdHJlZV9wYXJzZSh0cmVlLCAiL29wZW5wcm9tL29wdGlvbnMvdXNlLXN0ZGlvPyAlcyIsCisJICAgICAoKFdJVEhfU1RESU8gPT0gRE9fVVNFX1NURElPCisJICAgICAgIHx8IFdJVEhfU1RESU8gPT0gMCkKKwkgICAgICA/ICJ0cnVlIiA6ICJmYWxzZSIpKTsKKyAgdHJlZV9wYXJzZSh0cmVlLCAiL29wZW5wcm9tL29wdGlvbnMvbW9kZWwgXCIlcyIsCisJICAgICBtb2RlbF9uYW1lW1dJVEhfREVGQVVMVF9NT0RFTF0pOworICB0cmVlX3BhcnNlKHRyZWUsICIvb3BlbnByb20vb3B0aW9ucy9tb2RlbC1pc3N1ZSAlZCIsCisJICAgICBNT0RFTF9JU1NVRV9JR05PUkUpOworCisgIC8qIHVzZWZ1bCBvcHRpb25zICovCit9CisKK0lOTElORV9FTVVMX0dFTkVSSUMgdm9pZAorZW11bF9hZGRfdHJlZV9oYXJkd2FyZShkZXZpY2UgKnJvb3QpCit7CisgIGludCBpOworICBpbnQgbnJfY3B1cyA9IHRyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy9zbXAiKTsKKworICAvKiBzYW5pdHkgY2hlY2sgdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzICovCisgIGlmIChucl9jcHVzID4gTUFYX05SX1BST0NFU1NPUlMpCisgICAgZXJyb3IoIlNwZWNpZmllZCBudW1iZXIgb2YgcHJvY2Vzc29ycyAoJWQpIGV4Y2VlZHMgdGhlIG51bWJlciBjb25maWd1cmVkICglZCkuXG4iLAorCSAgbnJfY3B1cywgTUFYX05SX1BST0NFU1NPUlMpOworCisgIC8qIHNldCB0aGUgbnVtYmVyIG9mIGFkZHJlc3MgY2VsbHMgKDEgb3IgMikgKi8KKyAgdHJlZV9wYXJzZShyb290LCAiI2FkZHJlc3MtY2VsbHMgJWQiLCBXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgLyAzMik7CisKKyAgLyogYWRkIHNvbWUgbWVtb3J5ICovCisgIGlmICh0cmVlX2ZpbmRfZGV2aWNlKHJvb3QsICIvbWVtb3J5IikgPT0gTlVMTCkgeworICAgIHVuc2lnbmVkX3dvcmQgbWVtb3J5X3NpemUgPQorICAgICAgdHJlZV9maW5kX2ludGVnZXJfcHJvcGVydHkocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL29lYS1tZW1vcnktc2l6ZSIpOworICAgIGNvbnN0IHVuc2lnbmVkX3dvcmQgYXZhaWxfc3RhcnQgPSAweDMwMDA7CisgICAgdHJlZV9wYXJzZShyb290LCAiL21lbW9yeUAwL3JlZyAweDAgMHglbHgiLAorCSAgICAgICAodW5zaWduZWQgbG9uZyltZW1vcnlfc2l6ZSk7CisgICAgLyogcmVzZXJ2ZSB0aGUgZmlyc3QgMHgzMDAwIGZvciB0aGUgUG93ZXJQQyBpbnRlcnJ1cHQgdGFibGUgKi8KKyAgICB0cmVlX3BhcnNlKHJvb3QsICIvbWVtb3J5QDAvYXZhaWxhYmxlIDB4JWx4ICAweCVseCIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKWF2YWlsX3N0YXJ0LAorCSAgICAgICAodW5zaWduZWQgbG9uZyltZW1vcnlfc2l6ZSAtIGF2YWlsX3N0YXJ0KTsKKyAgfQorCisgIC8qIG91ciBwcm9jZXNzb3JzICovCisgIGZvciAoaSA9IDA7IGkgPCBucl9jcHVzOyBpKyspIHsKKyAgICB0cmVlX3BhcnNlKHJvb3QsICIvY3B1cy9jcHVAJWQvY3B1LW5yICVkIiwgaSwgaSk7CisgIH0KKworICAvKiB0aGUgZGVidWdnaW5nIHBhbCAtIGhpZGUgaXQgaW4gdGhlIG9wZW5wcm9tIGFuZCBkb24ndCBhdHRhY2ggaXQKKyAgICAgdG8gYW55IGJ1cyAqLworICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vcGFsIik7CisKKyAgLyogY2hvc2VuIGV0YyAqLworICB0cmVlX3BhcnNlKHJvb3QsICIvY2hvc2VuL3N0ZGluICovb3BlbnByb20vcGFsIik7CisgIHRyZWVfcGFyc2Uocm9vdCwgIi9jaG9zZW4vc3Rkb3V0ICEvY2hvc2VuL3N0ZGluIik7CisgIHRyZWVfcGFyc2Uocm9vdCwgIi9jaG9zZW4vbWVtb3J5ICovbWVtb3J5Iik7Cit9CisKKyNlbmRpZiAvKiBfRU1VTF9HRU5FUklDX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2VtdWxfZ2VuZXJpYy5oIGIvc2ltL3BwYy9lbXVsX2dlbmVyaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODYwMjZlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9lbXVsX2dlbmVyaWMuaApAQCAtMCwwICsxLDE3OCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfRU1VTF9HRU5FUklDX0hfCisjZGVmaW5lIF9FTVVMX0dFTkVSSUNfSF8KKworI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgImlkZWNvZGUuaCIKKyNpbmNsdWRlICJvc19lbXVsLmgiCisKKyNpbmNsdWRlICJ0cmVlLmgiCisKKyNpbmNsdWRlICJiZmQuaCIKKworI2lmbmRlZiBJTkxJTkVfRU1VTF9HRU5FUklDCisjZGVmaW5lIElOTElORV9FTVVMX0dFTkVSSUMKKyNlbmRpZgorCisvKiB2YXJpb3VzIFBvd2VyUEMgaW5zdHJ1Y3Rpb25zIGZvciB3cml0aW5nIGludG8gbWVtb3J5ICovCitlbnVtIHsKKyAgZW11bF9jYWxsX2luc3RydWN0aW9uID0gMHgxLAorICBlbXVsX2xvb3BfaW5zdHJ1Y3Rpb24gPSAweDQ4MDAwMDAwLCAvKiBicmFuY2ggdG8gLiAqLworICBlbXVsX3JmaV9pbnN0cnVjdGlvbiA9IDB4NGMwMDAwNjQsCisgIGVtdWxfYmxyX2luc3RydWN0aW9uID0gMHg0ZTgwMDAyMCwKK307CisKKworLyogZW11bGF0aW9uIHNwZWNpZmljIGRhdGEgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX29zX2VtdWxfZGF0YSBvc19lbXVsX2RhdGE7CisKK3R5cGVkZWYgb3NfZW11bF9kYXRhICoob3NfZW11bF9jcmVhdGVfaGFuZGxlcikKKyAgICAgKGRldmljZSAqdHJlZSwKKyAgICAgIGJmZCAqaW1hZ2UsCisgICAgICBjb25zdCBjaGFyICplbXVsX25hbWUpOwordHlwZWRlZiB2b2lkIChvc19lbXVsX2luaXRfaGFuZGxlcikKKyAgICAgKG9zX2VtdWxfZGF0YSAqZW11bF9kYXRhLAorICAgICAgaW50IG5yX2NwdXMpOwordHlwZWRlZiB2b2lkIChvc19lbXVsX3N5c3RlbV9jYWxsX2hhbmRsZXIpCisgICAgIChjcHUgKnByb2Nlc3NvciwKKyAgICAgIHVuc2lnbmVkX3dvcmQgY2lhLAorICAgICAgb3NfZW11bF9kYXRhICplbXVsX2RhdGEpOwordHlwZWRlZiBpbnQgKG9zX2VtdWxfaW5zdHJ1Y3Rpb25fY2FsbF9oYW5kbGVyKQorICAgICAoY3B1ICpwcm9jZXNzb3IsCisgICAgICB1bnNpZ25lZF93b3JkIGNpYSwKKyAgICAgIHVuc2lnbmVkX3dvcmQgcmEsCisgICAgICBvc19lbXVsX2RhdGEgKmVtdWxfZGF0YSk7CisKK3N0cnVjdCBfb3NfZW11bCB7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIG9zX2VtdWxfY3JlYXRlX2hhbmRsZXIgKmNyZWF0ZTsKKyAgb3NfZW11bF9pbml0X2hhbmRsZXIgKmluaXQ7CisgIG9zX2VtdWxfc3lzdGVtX2NhbGxfaGFuZGxlciAqc3lzdGVtX2NhbGw7CisgIG9zX2VtdWxfaW5zdHJ1Y3Rpb25fY2FsbF9oYW5kbGVyICppbnN0cnVjdGlvbl9jYWxsOworICBvc19lbXVsX2RhdGEgKmRhdGE7Cit9OworCisKKy8qIE9uZSBjbGFzcyBvZiBlbXVsYXRpb24gLSBzeXN0ZW0gY2FsbCBpcyBwcmV0dHkgZ2VuZXJhbCwgcHJvdmlkZSBhCisgICBjb21tb24gdGVtcGxhdGUgZm9yIGltcGxlbWVudGluZyB0aGlzICovCisKK3R5cGVkZWYgc3RydWN0IF9lbXVsX3N5c2NhbGwgZW11bF9zeXNjYWxsOwordHlwZWRlZiBzdHJ1Y3QgX2VtdWxfc3lzY2FsbF9kZXNjcmlwdG9yIGVtdWxfc3lzY2FsbF9kZXNjcmlwdG9yOworCit0eXBlZGVmIHZvaWQgKGVtdWxfc3lzY2FsbF9oYW5kbGVyKQorICAgICAob3NfZW11bF9kYXRhICplbXVsX2RhdGEsCisgICAgICB1bnNpZ25lZCBjYWxsLAorICAgICAgY29uc3QgaW50IGFyZzAsCisgICAgICBjcHUgKnByb2Nlc3NvciwKKyAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKTsKKworc3RydWN0IF9lbXVsX3N5c2NhbGxfZGVzY3JpcHRvciB7CisgIGVtdWxfc3lzY2FsbF9oYW5kbGVyICpoYW5kbGVyOworICBjb25zdCBjaGFyICpuYW1lOworfTsKKworc3RydWN0IF9lbXVsX3N5c2NhbGwgeworICBlbXVsX3N5c2NhbGxfZGVzY3JpcHRvciAqc3lzY2FsbF9kZXNjcmlwdG9yOworICBpbnQgbnJfc3lzdGVtX2NhbGxzOworICBjaGFyICoqZXJyb3JfbmFtZXM7CisgIGludCBucl9lcnJvcl9uYW1lczsKKyAgY2hhciAqKnNpZ25hbF9uYW1lczsKKyAgaW50IG5yX3NpZ25hbF9uYW1lczsKK307CisKKworSU5MSU5FX0VNVUxfR0VORVJJQyB2b2lkIGVtdWxfZG9fc3lzdGVtX2NhbGwKKyhvc19lbXVsX2RhdGEgKmVtdWxfZGF0YSwKKyBlbXVsX3N5c2NhbGwgKnN5c2NhbGwsCisgdW5zaWduZWQgY2FsbCwKKyBjb25zdCBpbnQgYXJnMCwKKyBjcHUgKnByb2Nlc3NvciwKKyB1bnNpZ25lZF93b3JkIGNpYSk7CisKKworSU5MSU5FX0VNVUxfR0VORVJJQyB1bnNpZ25lZDY0IGVtdWxfcmVhZF9ncHI2NAorKGNwdSAqcHJvY2Vzc29yLAorIGludCBnKTsKKworSU5MSU5FX0VNVUxfR0VORVJJQyB2b2lkIGVtdWxfd3JpdGVfZ3ByNjQKKyhjcHUgKnByb2Nlc3NvciwKKyBpbnQgZywKKyB1bnNpZ25lZDY0IHZhbCk7CisKK0lOTElORV9FTVVMX0dFTkVSSUMgdm9pZCBlbXVsX3dyaXRlX3N0YXR1cworKGNwdSAqcHJvY2Vzc29yLAorIGludCBzdGF0dXMsCisgaW50IGVycm5vKTsKKworSU5MSU5FX0VNVUxfR0VORVJJQyB2b2lkIGVtdWxfd3JpdGUyX3N0YXR1cworKGNwdSAqcHJvY2Vzc29yLAorIGludCBzdGF0dXMxLAorIGludCBzdGF0dXMyLAorIGludCBlcnJubyk7CisKK0lOTElORV9FTVVMX0dFTkVSSUMgY2hhciAqZW11bF9yZWFkX3N0cmluZworKGNoYXIgKmRlc3QsCisgdW5zaWduZWRfd29yZCBhZGRyLAorIHVuc2lnbmVkIG5yX2J5dGVzLAorIGNwdSAqcHJvY2Vzc29yLAorIHVuc2lnbmVkX3dvcmQgY2lhKTsKKworSU5MSU5FX0VNVUxfR0VORVJJQyB1bnNpZ25lZF93b3JkIGVtdWxfcmVhZF93b3JkCisodW5zaWduZWRfd29yZCBhZGRyLAorIGNwdSAqcHJvY2Vzc29yLAorIHVuc2lnbmVkX3dvcmQgY2lhKTsKKyAKK0lOTElORV9FTVVMX0dFTkVSSUMgdm9pZCBlbXVsX3dyaXRlX3dvcmQKKyh1bnNpZ25lZF93b3JkIGFkZHIsCisgdW5zaWduZWRfd29yZCBidWYsCisgY3B1ICpwcm9jZXNzb3IsCisgdW5zaWduZWRfd29yZCBjaWEpOworIAorSU5MSU5FX0VNVUxfR0VORVJJQyB2b2lkIGVtdWxfcmVhZF9idWZmZXIKKyh2b2lkICpkZXN0LAorIHVuc2lnbmVkX3dvcmQgYWRkciwKKyB1bnNpZ25lZCBucl9ieXRlcywKKyBjcHUgKnByb2Nlc3NvciwKKyB1bnNpZ25lZF93b3JkIGNpYSk7CisKK0lOTElORV9FTVVMX0dFTkVSSUMgdm9pZCBlbXVsX3dyaXRlX2J1ZmZlcgorKGNvbnN0IHZvaWQgKnNvdXJjZSwKKyB1bnNpZ25lZF93b3JkIGFkZHIsCisgdW5zaWduZWQgbnJfYnl0ZXMsCisgY3B1ICpwcm9jZXNzb3IsCisgdW5zaWduZWRfd29yZCBjaWEpOworCisvKiBTaW1wbGlmeSB0aGUgY29uc3RydWN0aW9uIG9mIGRldmljZSB0cmVlcyAqLworCitJTkxJTkVfRU1VTF9HRU5FUklDIHZvaWQgZW11bF9hZGRfdHJlZV9vcHRpb25zCisoZGV2aWNlICp0cmVlLAorIGJmZCAqaW1hZ2UsCisgY29uc3QgY2hhciAqZW11bCwKKyBjb25zdCBjaGFyICplbnYsCisgaW50IG9lYV9pbnRlcnJ1cHRfcHJlZml4KTsKKworSU5MSU5FX0VNVUxfR0VORVJJQyB2b2lkIGVtdWxfYWRkX3RyZWVfaGFyZHdhcmUKKyhkZXZpY2UgKnRyZWUpOworCisjZW5kaWYgLyogX0VNVUxfR0VORVJJQ19IXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9lbXVsX25ldGJzZC5jIGIvc2ltL3BwYy9lbXVsX25ldGJzZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMDY0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2VtdWxfbmV0YnNkLmMKQEAgLTAsMCArMSwxNDM5IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworICAgICovCisKKworI2lmbmRlZiBfRU1VTF9ORVRCU0RfQ18KKyNkZWZpbmUgX0VNVUxfTkVUQlNEX0NfCisKKworLyogTm90ZTogdGhpcyBtb2R1bGUgaXMgY2FsbGVkIHZpYSBhIHRhYmxlLiAgVGhlcmUgaXMgbm8gYmVuZWZpdCBpbgorICAgbWFraW5nIGl0IGlubGluZSAqLworCisjaW5jbHVkZSAiZW11bF9nZW5lcmljLmgiCisjaW5jbHVkZSAiZW11bF9uZXRic2QuaCIKKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2Vycm5vLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2lmZGVmIEhBVkVfR0VUUlVTQUdFCisjaWZuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKKyN1bmRlZiBIQVZFX0dFVFJVU0FHRQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfR0VUUlVTQUdFCisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CitpbnQgZ2V0cnVzYWdlKCk7CisjZW5kaWYKKworI2lmIEhBVkVfU1lTX0lPQ1RMX0gKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZgorCisjaWYgSEFWRV9ESVJFTlRfSAorIyBpbmNsdWRlIDxkaXJlbnQuaD4KKyMgZGVmaW5lIE5BTUxFTihkaXJlbnQpIHN0cmxlbigoZGlyZW50KS0+ZF9uYW1lKQorI2Vsc2UKKyMgZGVmaW5lIGRpcmVudCBkaXJlY3QKKyMgZGVmaW5lIE5BTUxFTihkaXJlbnQpIChkaXJlbnQpLT5kX25hbWxlbgorIyBpZiBIQVZFX1NZU19ORElSX0gKKyMgIGluY2x1ZGUgPHN5cy9uZGlyLmg+CisjIGVuZGlmCisjIGlmIEhBVkVfU1lTX0RJUl9ICisjICBpbmNsdWRlIDxzeXMvZGlyLmg+CisjIGVuZGlmCisjIGlmIEhBVkVfTkRJUl9ICisjICBpbmNsdWRlIDxuZGlyLmg+CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyN1bmRlZiBNQVhQQVRITEVOCQkvKiBzeXMvcGFyYW0uaCBtaWdodCBkZWZpbmUgdGhpcyBhbHNvICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjZGVmaW5lIFdJVEhfTmV0QlNEX0hPU1QgKE5ldEJTRCA+PSAxOTkzMDYpCisjaWYgV0lUSF9OZXRCU0RfSE9TVCAvKiBoZXJlIE5ldEJTRCBhcyB0aGF0IGlzIHdoYXQgd2UncmUgZW11bGF0aW5nICovCisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4gLyogRklYTUUgLSBzaG91bGQgbm90IGJlIGluY2x1ZGluZyB0aGlzIG9uZSAqLworI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KK2V4dGVybiBpbnQgZ2V0ZGlyZW50cmllcyhpbnQgZmQsIGNoYXIgKmJ1ZiwgaW50IG5ieXRlcywgbG9uZyAqYmFzZXApOworI2Vsc2UKKworLyogSWYgdGhpcyBpcyBub3QgbmV0YnNkLCBkb24ndCBhbGxvdyBmc3RhdGZzIG9yIGdldGRpcmVudHJpZXMgYXQgdGhpcyB0aW1lICovCisjdW5kZWYgSEFWRV9GU1RBVEZTCisjdW5kZWYgSEFWRV9HRVRESVJFTlRSSUVTCisjZW5kaWYKKworI2lmIChCU0QgPCAxOTkzMDYpIC8qIGhlcmUgQlNEIGFzIGp1c3QgYSBidWcgKi8KK2V4dGVybiBpbnQgZXJybm87CisjZW5kaWYKKworI2lmbmRlZiBTVEFUSUNfSU5MSU5FX0VNVUxfTkVUQlNECisjZGVmaW5lIFNUQVRJQ19JTkxJTkVfRU1VTF9ORVRCU0QgU1RBVElDX0lOTElORQorI2VuZGlmCisKKworI2lmIFdJVEhfTmV0QlNEX0hPU1QKKyNkZWZpbmUgU1lTKFgpIEFTU0VSVChjYWxsID09IChTWVNfIyNYKSkKKyNlbHNlCisjZGVmaW5lIFNZUyhYKQorI2VuZGlmCisKKyNpZiBXSVRIX05ldEJTRF9IT1NUICYmIChQQVRIX01BWCAhPSAxMDI0KQorI2Vycm9yICJQQVRIX01BWCBub3QgMTAyNCIKKyNlbGlmICFkZWZpbmVkKFBBVEhfTUFYKQorI2RlZmluZSBQQVRIX01BWCAxMDI0CisjZW5kaWYKKworCisvKiBFTVVMQVRJT04KKworICAgTmV0QlNEIC0gRW11bGF0aW9uIG9mIHVzZXIgcHJvZ3JhbXMgZm9yIE5ldEJTRC9QUEMKKworICAgREVTQ1JJUFRJT04KKworICAgKi8KKworCisvKiBOZXRCU0QncyBpZGVhIG9mIHdoYXQgaXMgbmVlZGVkIHRvIGltcGxlbWVudCBlbXVsYXRpb25zICovCisKK3N0cnVjdCBfb3NfZW11bF9kYXRhIHsKKyAgZGV2aWNlICp2bTsKKyAgZW11bF9zeXNjYWxsICpzeXNjYWxsczsKK307CisKKworCitTVEFUSUNfSU5MSU5FX0VNVUxfTkVUQlNEIHZvaWQKK3dyaXRlX3N0YXQodW5zaWduZWRfd29yZCBhZGRyLAorCSAgIHN0cnVjdCBzdGF0IGJ1ZiwKKwkgICBjcHUgKnByb2Nlc3NvciwKKwkgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgSDJUKGJ1Zi5zdF9kZXYpOworICBIMlQoYnVmLnN0X2lubyk7CisgIEgyVChidWYuc3RfbW9kZSk7CisgIEgyVChidWYuc3RfbmxpbmspOworICBIMlQoYnVmLnN0X3VpZCk7CisgIEgyVChidWYuc3RfZ2lkKTsKKyAgSDJUKGJ1Zi5zdF9zaXplKTsKKyAgSDJUKGJ1Zi5zdF9hdGltZSk7CisgIC8qIEgyVChidWYuc3Rfc3BhcmUxKTsgKi8KKyAgSDJUKGJ1Zi5zdF9tdGltZSk7CisgIC8qIEgyVChidWYuc3Rfc3BhcmUyKTsgKi8KKyAgSDJUKGJ1Zi5zdF9jdGltZSk7CisgIC8qIEgyVChidWYuc3Rfc3BhcmUzKTsgKi8KKyNpZmRlZiBBQ19TVFJVQ1RfU1RfUkRFVgorICBIMlQoYnVmLnN0X3JkZXYpOworI2VuZGlmCisjaWZkZWYgQUNfU1RSVUNUX1NUX0JMS1NJWkUKKyAgSDJUKGJ1Zi5zdF9ibGtzaXplKTsKKyNlbmRpZgorI2lmZGVmIEFDX1NUUlVDVF9TVF9CTE9DS1MKKyAgSDJUKGJ1Zi5zdF9ibG9ja3MpOworI2VuZGlmCisjaWYgV0lUSF9OZXRCU0RfSE9TVAorICBIMlQoYnVmLnN0X2ZsYWdzKTsKKyAgSDJUKGJ1Zi5zdF9nZW4pOworI2VuZGlmCisgIGVtdWxfd3JpdGVfYnVmZmVyKCZidWYsIGFkZHIsIHNpemVvZihidWYpLCBwcm9jZXNzb3IsIGNpYSk7Cit9CisKKworI2lmZGVmIEhBVkVfRlNUQVRGUworU1RBVElDX0lOTElORV9FTVVMX05FVEJTRCB2b2lkCit3cml0ZV9zdGF0ZnModW5zaWduZWRfd29yZCBhZGRyLAorCSAgICAgc3RydWN0IHN0YXRmcyBidWYsCisJICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBIMlQoYnVmLmZfdHlwZSk7CisgIEgyVChidWYuZl9mbGFncyk7CisgIEgyVChidWYuZl9ic2l6ZSk7CisgIEgyVChidWYuZl9pb3NpemUpOworICBIMlQoYnVmLmZfYmxvY2tzKTsKKyAgSDJUKGJ1Zi5mX2JmcmVlKTsKKyAgSDJUKGJ1Zi5mX2JhdmFpbCk7CisgIEgyVChidWYuZl9maWxlcyk7CisgIEgyVChidWYuZl9mZnJlZSk7CisgIEgyVChidWYuZl9mc2lkLnZhbFswXSk7CisgIEgyVChidWYuZl9mc2lkLnZhbFsxXSk7CisgIEgyVChidWYuZl9vd25lcik7CisgIC8qIGZfc3BhcmVbNF07ICovCisgIC8qIGZfZnN0eXBlbmFtZVtNRlNOQU1FTEVOXTsgKi8KKyAgLyogZl9tbnRvbm5hbWVbTU5BTUVMRU5dOyAqLworICAvKiBmX21udGZyb21uYW1lW01OQU1FTEVOXTsgKi8KKyAgZW11bF93cml0ZV9idWZmZXIoJmJ1ZiwgYWRkciwgc2l6ZW9mKGJ1ZiksIHByb2Nlc3NvciwgY2lhKTsKK30KKyNlbmRpZgorCisKK1NUQVRJQ19JTkxJTkVfRU1VTF9ORVRCU0Qgdm9pZAord3JpdGVfdGltZXZhbCh1bnNpZ25lZF93b3JkIGFkZHIsCisJICAgICAgc3RydWN0IHRpbWV2YWwgdCwKKwkgICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgSDJUKHQudHZfc2VjKTsKKyAgSDJUKHQudHZfdXNlYyk7CisgIGVtdWxfd3JpdGVfYnVmZmVyKCZ0LCBhZGRyLCBzaXplb2YodCksIHByb2Nlc3NvciwgY2lhKTsKK30KKworCitTVEFUSUNfSU5MSU5FX0VNVUxfTkVUQlNEIHZvaWQKK3dyaXRlX3RpbWV6b25lKHVuc2lnbmVkX3dvcmQgYWRkciwKKwkgICAgICAgc3RydWN0IHRpbWV6b25lIHR6LAorCSAgICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIEgyVCh0ei50el9taW51dGVzd2VzdCk7CisgIEgyVCh0ei50el9kc3R0aW1lKTsKKyAgZW11bF93cml0ZV9idWZmZXIoJnR6LCBhZGRyLCBzaXplb2YodHopLCBwcm9jZXNzb3IsIGNpYSk7Cit9CisKKworI2lmZGVmIEhBVkVfR0VURElSRU5UUklFUworU1RBVElDX0lOTElORV9FTVVMX05FVEJTRCB2b2lkCit3cml0ZV9kaXJlbnRyaWVzKHVuc2lnbmVkX3dvcmQgYWRkciwKKwkJIGNoYXIgKmJ1ZiwKKwkJIGludCBuYnl0ZXMsCisJCSBjcHUgKnByb2Nlc3NvciwKKwkJIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICB3aGlsZSAobmJ5dGVzID4gMCkgeworICAgIHN0cnVjdCBkaXJlbnQgKm91dDsKKyAgICBzdHJ1Y3QgZGlyZW50ICppbiA9IChzdHJ1Y3QgZGlyZW50KilidWY7CisgICAgQVNTRVJUKGluLT5kX3JlY2xlbiA8PSBuYnl0ZXMpOworICAgIG91dCA9IChzdHJ1Y3QgZGlyZW50Kil6YWxsb2MoaW4tPmRfcmVjbGVuKTsKKyAgICBtZW1jcHkob3V0LypkZXN0Ki8sIGluLypzcmMqLywgaW4tPmRfcmVjbGVuKTsKKyAgICBIMlQob3V0LT5kX2ZpbGVubyk7CisgICAgSDJUKG91dC0+ZF9yZWNsZW4pOworICAgIEgyVChvdXQtPmRfdHlwZSk7CisgICAgSDJUKG91dC0+ZF9uYW1sZW4pOworICAgIGVtdWxfd3JpdGVfYnVmZmVyKG91dCwgYWRkciwgaW4tPmRfcmVjbGVuLCBwcm9jZXNzb3IsIGNpYSk7CisgICAgbmJ5dGVzIC09IGluLT5kX3JlY2xlbjsKKyAgICBhZGRyICs9IGluLT5kX3JlY2xlbjsKKyAgICBidWYgKz0gaW4tPmRfcmVjbGVuOworICAgIHpmcmVlKG91dCk7CisgIH0KK30KKyNlbmRpZgorCisKKyNpZmRlZiBIQVZFX0dFVFJVU0FHRQorU1RBVElDX0lOTElORV9FTVVMX05FVEJTRCB2b2lkCit3cml0ZV9ydXNhZ2UodW5zaWduZWRfd29yZCBhZGRyLAorCSAgICAgc3RydWN0IHJ1c2FnZSBydXNhZ2UsCisJICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBIMlQocnVzYWdlLnJ1X3V0aW1lLnR2X3NlYyk7IC8qIHVzZXIgdGltZSB1c2VkICovCisgIEgyVChydXNhZ2UucnVfdXRpbWUudHZfdXNlYyk7CisgIEgyVChydXNhZ2UucnVfc3RpbWUudHZfc2VjKTsgLyogc3lzdGVtIHRpbWUgdXNlZCAqLworICBIMlQocnVzYWdlLnJ1X3N0aW1lLnR2X3VzZWMpOworICBIMlQocnVzYWdlLnJ1X21heHJzcyk7ICAgICAgICAgIC8qIGludGVncmFsIG1heCByZXNpZGVudCBzZXQgc2l6ZSAqLworICBIMlQocnVzYWdlLnJ1X2l4cnNzKTsgICAgICAgICAgIC8qIGludGVncmFsIHNoYXJlZCB0ZXh0IG1lbW9yeSBzaXplICovCisgIEgyVChydXNhZ2UucnVfaWRyc3MpOyAgICAgICAgICAgLyogaW50ZWdyYWwgdW5zaGFyZWQgZGF0YSBzaXplICovCisgIEgyVChydXNhZ2UucnVfaXNyc3MpOyAgICAgICAgICAgLyogaW50ZWdyYWwgdW5zaGFyZWQgc3RhY2sgc2l6ZSAqLworICBIMlQocnVzYWdlLnJ1X21pbmZsdCk7ICAgICAgICAgIC8qIHBhZ2UgcmVjbGFpbXMgKi8KKyAgSDJUKHJ1c2FnZS5ydV9tYWpmbHQpOyAgICAgICAgICAvKiBwYWdlIGZhdWx0cyAqLworICBIMlQocnVzYWdlLnJ1X25zd2FwKTsgICAgICAgICAgIC8qIHN3YXBzICovCisgIEgyVChydXNhZ2UucnVfaW5ibG9jayk7ICAgICAgICAgLyogYmxvY2sgaW5wdXQgb3BlcmF0aW9ucyAqLworICBIMlQocnVzYWdlLnJ1X291YmxvY2spOyAgICAgICAgIC8qIGJsb2NrIG91dHB1dCBvcGVyYXRpb25zICovCisgIEgyVChydXNhZ2UucnVfbXNnc25kKTsgICAgICAgICAgLyogbWVzc2FnZXMgc2VudCAqLworICBIMlQocnVzYWdlLnJ1X21zZ3Jjdik7ICAgICAgICAgIC8qIG1lc3NhZ2VzIHJlY2VpdmVkICovCisgIEgyVChydXNhZ2UucnVfbnNpZ25hbHMpOyAgICAgICAgLyogc2lnbmFscyByZWNlaXZlZCAqLworICBIMlQocnVzYWdlLnJ1X252Y3N3KTsgICAgICAgICAgIC8qIHZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzICovCisgIEgyVChydXNhZ2UucnVfbml2Y3N3KTsgICAgICAgICAgLyogaW52b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlcyAqLworICBlbXVsX3dyaXRlX2J1ZmZlcigmcnVzYWdlLCBhZGRyLCBzaXplb2YocnVzYWdlKSwgcHJvY2Vzc29yLCBjaWEpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitkb19leGl0KG9zX2VtdWxfZGF0YSAqZW11bCwKKwl1bnNpZ25lZCBjYWxsLAorCWNvbnN0IGludCBhcmcwLAorCWNwdSAqcHJvY2Vzc29yLAorCXVuc2lnbmVkX3dvcmQgY2lhKQoreworICBpbnQgc3RhdHVzID0gKGludCljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgU1lTKGV4aXQpOworICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiJWQpXG4iLCBzdGF0dXMpOworCisgIGNwdV9oYWx0KHByb2Nlc3NvciwgY2lhLCB3YXNfZXhpdGVkLCBzdGF0dXMpOworfQorCisKK3N0YXRpYyB2b2lkCitkb19yZWFkKG9zX2VtdWxfZGF0YSAqZW11bCwKKwl1bnNpZ25lZCBjYWxsLAorCWNvbnN0IGludCBhcmcwLAorCWNwdSAqcHJvY2Vzc29yLAorCXVuc2lnbmVkX3dvcmQgY2lhKQoreworICB2b2lkICpzY3JhdGNoX2J1ZmZlcjsKKyAgaW50IGQgPSAoaW50KWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICB1bnNpZ25lZF93b3JkIGJ1ZiA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisgIGludCBuYnl0ZXMgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzJdOworICBpbnQgc3RhdHVzOworICBTWVMocmVhZCk7CisKKyAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkLCAweCVseCwgJWQiLCBkLCAobG9uZylidWYsIG5ieXRlcyk7CisKKyAgLyogZ2V0IGEgdGVtcG9hcnkgYnVmZXIgKi8KKyAgc2NyYXRjaF9idWZmZXIgPSB6YWxsb2MobmJ5dGVzKTsKKworICAvKiBjaGVjayBpZiBidWZmZXIgZXhpc3RzIGJ5IHJlYWRpbmcgaXQgKi8KKyAgZW11bF9yZWFkX2J1ZmZlcihzY3JhdGNoX2J1ZmZlciwgYnVmLCBuYnl0ZXMsIHByb2Nlc3NvciwgY2lhKTsKKworICAvKiByZWFkICovCisjaWYgMAorICBpZiAoZCA9PSAwKSB7CisgICAgc3RhdHVzID0gZnJlYWQgKHNjcmF0Y2hfYnVmZmVyLCAxLCBuYnl0ZXMsIHN0ZGluKTsKKyAgICBpZiAoc3RhdHVzID09IDAgJiYgZmVycm9yIChzdGRpbikpCisgICAgICBzdGF0dXMgPSAtMTsKKyAgfQorI2VuZGlmCisgIHN0YXR1cyA9IHJlYWQgKGQsIHNjcmF0Y2hfYnVmZmVyLCBuYnl0ZXMpOworCisgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7CisgIGlmIChzdGF0dXMgPiAwKQorICAgIGVtdWxfd3JpdGVfYnVmZmVyKHNjcmF0Y2hfYnVmZmVyLCBidWYsIHN0YXR1cywgcHJvY2Vzc29yLCBjaWEpOworCisgIHpmcmVlKHNjcmF0Y2hfYnVmZmVyKTsKK30KKworCitzdGF0aWMgdm9pZAorZG9fd3JpdGUob3NfZW11bF9kYXRhICplbXVsLAorCSB1bnNpZ25lZCBjYWxsLAorCSBjb25zdCBpbnQgYXJnMCwKKwkgY3B1ICpwcm9jZXNzb3IsCisJIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICB2b2lkICpzY3JhdGNoX2J1ZmZlciA9IE5VTEw7CisgIGludCBkID0gKGludCljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgdW5zaWduZWRfd29yZCBidWYgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOworICBpbnQgbmJ5dGVzID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsyXTsKKyAgaW50IHN0YXR1czsKKyAgU1lTKHdyaXRlKTsKKworICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiJWQsIDB4JWx4LCAlZCIsIGQsIChsb25nKWJ1ZiwgbmJ5dGVzKTsKKworICAvKiBnZXQgYSB0ZW1wb2FyeSBidWZlciAqLworICBzY3JhdGNoX2J1ZmZlciA9IHphbGxvYyhuYnl0ZXMpOyAvKiBGSVhNRSAtIG5ieXRlcyA9PSAwICovCisKKyAgLyogY29weSBpbiAqLworICBlbXVsX3JlYWRfYnVmZmVyKHNjcmF0Y2hfYnVmZmVyLCBidWYsIG5ieXRlcywKKwkJICAgcHJvY2Vzc29yLCBjaWEpOworCisgIC8qIHdyaXRlICovCisgIHN0YXR1cyA9IHdyaXRlKGQsIHNjcmF0Y2hfYnVmZmVyLCBuYnl0ZXMpOworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOworICB6ZnJlZShzY3JhdGNoX2J1ZmZlcik7CisKKyAgZmx1c2hfc3Rkb3V0cHV0KCk7Cit9CisKKworc3RhdGljIHZvaWQKK2RvX29wZW4ob3NfZW11bF9kYXRhICplbXVsLAorCXVuc2lnbmVkIGNhbGwsCisJY29uc3QgaW50IGFyZzAsCisJY3B1ICpwcm9jZXNzb3IsCisJdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHVuc2lnbmVkX3dvcmQgcGF0aF9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07CisgIGNoYXIgcGF0aF9idWZbUEFUSF9NQVhdOworICBjaGFyICpwYXRoID0gZW11bF9yZWFkX3N0cmluZyhwYXRoX2J1ZiwgcGF0aF9hZGRyLCBQQVRIX01BWCwgcHJvY2Vzc29yLCBjaWEpOworICBpbnQgZmxhZ3MgPSAoaW50KWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisgIGludCBtb2RlID0gKGludCljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzJdOworICBpbnQgc3RhdHVzOworCisgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIweCVseCBbJXNdLCAweCV4LCAweCV4IiwgKGxvbmcpcGF0aF9hZGRyLCBwYXRoLCBmbGFncywgbW9kZSk7CisKKyAgU1lTKG9wZW4pOworCisgIC8qIENhbid0IGNvbWJpbmUgdGhlc2Ugc3RhdGVtZW50cywgY3V6IG9wZW4gc2V0cyBlcnJuby4gKi8KKyAgc3RhdHVzID0gb3BlbihwYXRoLCBmbGFncywgbW9kZSk7CisgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Cit9CisKKworc3RhdGljIHZvaWQKK2RvX2Nsb3NlKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgdW5zaWduZWQgY2FsbCwKKwkgY29uc3QgaW50IGFyZzAsCisJIGNwdSAqcHJvY2Vzc29yLAorCSB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgaW50IGQgPSAoaW50KWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICBpbnQgc3RhdHVzOworCisgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIlZCIsIGQpOworCisgIFNZUyhjbG9zZSk7CisKKyAgLyogQ2FuJ3QgY29tYmluZSB0aGVzZSBzdGF0ZW1lbnRzLCBjdXogY2xvc2Ugc2V0cyBlcnJuby4gKi8KKyAgc3RhdHVzID0gY2xvc2UoZCk7CisgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Cit9CisKKworc3RhdGljIHZvaWQKK2RvX2JyZWFrKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgdW5zaWduZWQgY2FsbCwKKwkgY29uc3QgaW50IGFyZzAsCisJIGNwdSAqcHJvY2Vzc29yLAorCSB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgLyoganVzdCBwYXNzIHRoaXMgb250byB0aGUgYHZtJyBkZXZpY2UgKi8KKyAgdW5zaWduZWRfd29yZCBuZXdfYnJlYWsgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgaW50IHN0YXR1czsKKworICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiMHglbHgiLCAobG9uZyljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXSk7CisKKyAgU1lTKGJyZWFrKTsKKyAgc3RhdHVzID0gZGV2aWNlX2lvY3RsKGVtdWwtPnZtLAorCQkJcHJvY2Vzc29yLAorCQkJY2lhLAorCQkJZGV2aWNlX2lvY3RsX2JyZWFrLAorCQkJbmV3X2JyZWFrKTsgLyppb2N0bC1kYXRhKi8KKyAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCAwLCBzdGF0dXMpOworfQorCisKKyNpZm5kZWYgSEFWRV9HRVRQSUQKKyNkZWZpbmUgZG9fZ2V0cGlkIDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fZ2V0cGlkKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgIHVuc2lnbmVkIGNhbGwsCisJICBjb25zdCBpbnQgYXJnMCwKKwkgIGNwdSAqcHJvY2Vzc29yLAorCSAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIFNZUyhnZXRwaWQpOworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIChpbnQpZ2V0cGlkKCksIDApOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9HRVRVSUQKKyNkZWZpbmUgZG9fZ2V0dWlkIDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fZ2V0dWlkKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgIHVuc2lnbmVkIGNhbGwsCisJICBjb25zdCBpbnQgYXJnMCwKKwkgIGNwdSAqcHJvY2Vzc29yLAorCSAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIFNZUyhnZXR1aWQpOworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIChpbnQpZ2V0dWlkKCksIDApOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9HRVRFVUlECisjZGVmaW5lIGRvX2dldGV1aWQgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb19nZXRldWlkKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgICB1bnNpZ25lZCBjYWxsLAorCSAgIGNvbnN0IGludCBhcmcwLAorCSAgIGNwdSAqcHJvY2Vzc29yLAorCSAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBTWVMoZ2V0ZXVpZCk7CisgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3NvciwgKGludClnZXRldWlkKCksIDApOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9LSUxMCisjZGVmaW5lIGRvX2tpbGwgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb19raWxsKG9zX2VtdWxfZGF0YSAqZW11bCwKKwl1bnNpZ25lZCBjYWxsLAorCWNvbnN0IGludCBhcmcwLAorCWNwdSAqcHJvY2Vzc29yLAorCXVuc2lnbmVkX3dvcmQgY2lhKQoreworICBwaWRfdCBwaWQgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgaW50IHNpZyA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisKKyAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkLCAlZCIsIChpbnQpcGlkLCBzaWcpOworCisgIFNZUyhraWxsKTsKKyAgcHJpbnRmX2ZpbHRlcmVkKCJTWVNfa2lsbCBhdCAweCVseCAtIG1vcmUgdG8gdGhpcyB0aGFuIGp1c3QgYmVpbmcga2lsbGVkXG4iLAorCQkgIChsb25nKWNpYSk7CisgIGNwdV9oYWx0KHByb2Nlc3NvciwgY2lhLCB3YXNfc2lnbmFsbGVkLCBzaWcpOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9EVVAKKyNkZWZpbmUgZG9fZHVwIDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fZHVwKG9zX2VtdWxfZGF0YSAqZW11bCwKKyAgICAgICB1bnNpZ25lZCBjYWxsLAorICAgICAgIGNvbnN0IGludCBhcmcwLAorICAgICAgIGNwdSAqcHJvY2Vzc29yLAorICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBpbnQgb2xkZCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICBpbnQgc3RhdHVzID0gZHVwKG9sZGQpOworICBpbnQgZXJyID0gZXJybm87CisKKyAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkIiwgb2xkZCk7CisKKyAgU1lTKGR1cCk7CisgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnIpOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9HRVRFR0lECisjZGVmaW5lIGRvX2dldGVnaWQgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb19nZXRlZ2lkKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgICB1bnNpZ25lZCBjYWxsLAorCSAgIGNvbnN0IGludCBhcmcwLAorCSAgIGNwdSAqcHJvY2Vzc29yLAorCSAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBTWVMoZ2V0ZWdpZCk7CisgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3NvciwgKGludClnZXRlZ2lkKCksIDApOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9HRVRHSUQKKyNkZWZpbmUgZG9fZ2V0Z2lkIDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fZ2V0Z2lkKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgIHVuc2lnbmVkIGNhbGwsCisJICBjb25zdCBpbnQgYXJnMCwKKwkgIGNwdSAqcHJvY2Vzc29yLAorCSAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIFNZUyhnZXRnaWQpOworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIChpbnQpZ2V0Z2lkKCksIDApOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TSUdQUk9DTUFTSworI2RlZmluZSBkb19zaWdwcm9jbWFzayAwCisjZWxzZQorc3RhdGljIHZvaWQKK2RvX3NpZ3Byb2NtYXNrKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgICAgICAgdW5zaWduZWQgY2FsbCwKKwkgICAgICAgY29uc3QgaW50IGFyZzAsCisJICAgICAgIGNwdSAqcHJvY2Vzc29yLAorCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgbmF0dXJhbF93b3JkIGhvdyA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICB1bnNpZ25lZF93b3JkIHNldCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisgIHVuc2lnbmVkX3dvcmQgb3NldCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMl07CisgIFNZUyhzaWdwcm9jbWFzayk7CisKKyAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIiVsZCwgMHglbGQsIDB4JWxkIiwgKGxvbmcpaG93LCAobG9uZylzZXQsIChsb25nKW9zZXQpOworCisgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3NvciwgMCwgMCk7CisgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzRdID0gc2V0OworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9JT0NUTAorI2RlZmluZSBkb19pb2N0bCAwCisjZWxzZQorc3RhdGljIHZvaWQKK2RvX2lvY3RsKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgdW5zaWduZWQgY2FsbCwKKwkgY29uc3QgaW50IGFyZzAsCisJIGNwdSAqcHJvY2Vzc29yLAorCSB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgaW50IGQgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgdW5zaWduZWQgcmVxdWVzdCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisgIHVuc2lnbmVkX3dvcmQgYXJncF9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsyXTsKKworI2lmICFXSVRIX05ldEJTRF9IT1NUCisgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdID0gMDsgLyoganVzdCBzdWNjZWVkICovCisjZWxzZQorICB1bnNpZ25lZCBkaXIgPSByZXF1ZXN0ICYgSU9DX0RJUk1BU0s7CisgIGludCBzdGF0dXM7CisgIFNZUyhpb2N0bCk7CisgIC8qIHdoYXQgd2UgaGF2ZW4ndCBkb25lICovCisgIGlmIChkaXIgJiBJT0NfSU4gLyogd3JpdGUgaW50byB0aGUgaW8gZGV2aWNlICovCisgICAgICB8fCBkaXIgJiBJT0NfT1VUCisgICAgICB8fCAhKGRpciAmIElPQ19WT0lEKSkKKyAgICBlcnJvcigiZG9faW9jdGwoKSByZWFkIG9yIHdyaXRlIG9mIHBhcmFtZXRlciBub3QgaW1wbGVtZW50ZWRcbiIpOworICBzdGF0dXMgPSBpb2N0bChkLCByZXF1ZXN0LCBOVUxMKTsKKyAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycm5vKTsKKyNlbmRpZgorCisgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIlZCwgMHgleCwgMHglbHgiLCBkLCByZXF1ZXN0LCAobG9uZylhcmdwX2FkZHIpOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9VTUFTSworI2RlZmluZSBkb191bWFzayAwCisjZWxzZQorc3RhdGljIHZvaWQKK2RvX3VtYXNrKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgdW5zaWduZWQgY2FsbCwKKwkgY29uc3QgaW50IGFyZzAsCisJIGNwdSAqcHJvY2Vzc29yLAorCSB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgaW50IG1hc2sgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKworICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiMCVvIiwgbWFzayk7CisKKyAgU1lTKHVtYXNrKTsKKyAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCB1bWFzayhtYXNrKSwgMCk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0RVUDIKKyNkZWZpbmUgZG9fZHVwMiAwCisjZWxzZQorc3RhdGljIHZvaWQKK2RvX2R1cDIob3NfZW11bF9kYXRhICplbXVsLAorCXVuc2lnbmVkIGNhbGwsCisJY29uc3QgaW50IGFyZzAsCisJY3B1ICpwcm9jZXNzb3IsCisJdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGludCBvbGRkID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07CisgIGludCBuZXdkID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKKyAgaW50IHN0YXR1cyA9IGR1cDIob2xkZCwgbmV3ZCk7CisgIGludCBlcnIgPSBlcnJubzsKKworICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiJWQsICVkIiwgb2xkZCwgbmV3ZCk7CisKKyAgU1lTKGR1cDIpOworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJyKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfRkNOVEwKKyNkZWZpbmUgZG9fZmNudGwgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb19mY250bChvc19lbXVsX2RhdGEgKmVtdWwsCisJIHVuc2lnbmVkIGNhbGwsCisJIGNvbnN0IGludCBhcmcwLAorCSBjcHUgKnByb2Nlc3NvciwKKwkgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGludCBmZCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICBpbnQgY21kID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKKyAgaW50IGFyZyA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMl07CisgIGludCBzdGF0dXM7CisKKyAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkLCAlZCwgJWQiLCBmZCwgY21kLCBhcmcpOworCisgIFNZUyhmY250bCk7CisgIHN0YXR1cyA9IGZjbnRsKGZkLCBjbWQsIGFyZyk7CisgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0dFVFRJTUVPRkRBWQorI2RlZmluZSBkb19nZXR0aW1lb2ZkYXkgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb19nZXR0aW1lb2ZkYXkob3NfZW11bF9kYXRhICplbXVsLAorCQl1bnNpZ25lZCBjYWxsLAorCQljb25zdCBpbnQgYXJnMCwKKwkJY3B1ICpwcm9jZXNzb3IsCisJCXVuc2lnbmVkX3dvcmQgY2lhKQoreworICB1bnNpZ25lZF93b3JkIHRfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICB1bnNpZ25lZF93b3JkIHR6X2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOworICBzdHJ1Y3QgdGltZXZhbCB0OworICBzdHJ1Y3QgdGltZXpvbmUgdHo7CisgIGludCBzdGF0dXMgPSBnZXR0aW1lb2ZkYXkoKHRfYWRkciAhPSAwID8gJnQgOiBOVUxMKSwKKwkJCSAgICAodHpfYWRkciAhPSAwID8gJnR6IDogTlVMTCkpOworICBpbnQgZXJyID0gZXJybm87CisKKyAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIjB4JWx4LCAweCVseCIsIChsb25nKXRfYWRkciwgKGxvbmcpdHpfYWRkcik7CisKKyAgU1lTKGdldHRpbWVvZmRheSk7CisgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnIpOworICBpZiAoc3RhdHVzID09IDApIHsKKyAgICBpZiAodF9hZGRyICE9IDApCisgICAgICB3cml0ZV90aW1ldmFsKHRfYWRkciwgdCwgcHJvY2Vzc29yLCBjaWEpOworICAgIGlmICh0el9hZGRyICE9IDApCisgICAgICB3cml0ZV90aW1lem9uZSh0el9hZGRyLCB0eiwgcHJvY2Vzc29yLCBjaWEpOworICB9Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0dFVFJVU0FHRQorI2RlZmluZSBkb19nZXRydXNhZ2UgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb19nZXRydXNhZ2Uob3NfZW11bF9kYXRhICplbXVsLAorCSAgICAgdW5zaWduZWQgY2FsbCwKKwkgICAgIGNvbnN0IGludCBhcmcwLAorCSAgICAgY3B1ICpwcm9jZXNzb3IsCisJICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgaW50IHdobyA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICB1bnNpZ25lZF93b3JkIHJ1c2FnZV9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKKyAgc3RydWN0IHJ1c2FnZSBydXNhZ2U7CisgIGludCBzdGF0dXMgPSBnZXRydXNhZ2Uod2hvLCAocnVzYWdlX2FkZHIgIT0gMCA/ICZydXNhZ2UgOiBOVUxMKSk7CisgIGludCBlcnIgPSBlcnJubzsKKworICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiJWQsIDB4JWx4Iiwgd2hvLCAobG9uZylydXNhZ2VfYWRkcik7CisKKyAgU1lTKGdldHJ1c2FnZSk7CisgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnIpOworICBpZiAoc3RhdHVzID09IDApIHsKKyAgICBpZiAocnVzYWdlX2FkZHIgIT0gMCkKKyAgICAgIHdyaXRlX3J1c2FnZShydXNhZ2VfYWRkciwgcnVzYWdlLCBwcm9jZXNzb3IsIGNpYSk7CisgIH0KK30KKyNlbmRpZgorCisKKyNpZm5kZWYgSEFWRV9GU1RBVEZTCisjZGVmaW5lIGRvX2ZzdGF0ZnMgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb19mc3RhdGZzKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgICB1bnNpZ25lZCBjYWxsLAorCSAgIGNvbnN0IGludCBhcmcwLAorCSAgIGNwdSAqcHJvY2Vzc29yLAorCSAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBpbnQgZmQgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgdW5zaWduZWRfd29yZCBidWZfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisgIHN0cnVjdCBzdGF0ZnMgYnVmOworICBpbnQgc3RhdHVzOworCisgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIlZCwgMHglbHgiLCBmZCwgKGxvbmcpYnVmX2FkZHIpOworCisgIFNZUyhmc3RhdGZzKTsKKyAgc3RhdHVzID0gZnN0YXRmcyhmZCwgKGJ1Zl9hZGRyID09IDAgPyBOVUxMIDogJmJ1ZikpOworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOworICBpZiAoc3RhdHVzID09IDApIHsKKyAgICBpZiAoYnVmX2FkZHIgIT0gMCkKKyAgICAgIHdyaXRlX3N0YXRmcyhidWZfYWRkciwgYnVmLCBwcm9jZXNzb3IsIGNpYSk7CisgIH0KK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RBVAorI2RlZmluZSBkb19zdGF0IDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fc3RhdChvc19lbXVsX2RhdGEgKmVtdWwsCisJdW5zaWduZWQgY2FsbCwKKwljb25zdCBpbnQgYXJnMCwKKwljcHUgKnByb2Nlc3NvciwKKwl1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgY2hhciBwYXRoX2J1ZltQQVRIX01BWF07CisgIHVuc2lnbmVkX3dvcmQgcGF0aF9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07CisgIHVuc2lnbmVkX3dvcmQgc3RhdF9idWZfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisgIGNoYXIgKnBhdGggPSBlbXVsX3JlYWRfc3RyaW5nKHBhdGhfYnVmLCBwYXRoX2FkZHIsIFBBVEhfTUFYLCBwcm9jZXNzb3IsIGNpYSk7CisgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgaW50IHN0YXR1czsKKyAgU1lTKHN0YXQpOworICBzdGF0dXMgPSBzdGF0KHBhdGgsICZidWYpOworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOworICBpZiAoc3RhdHVzID09IDApCisgICAgd3JpdGVfc3RhdChzdGF0X2J1Zl9hZGRyLCBidWYsIHByb2Nlc3NvciwgY2lhKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfRlNUQVQKKyNkZWZpbmUgZG9fZnN0YXQgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb19mc3RhdChvc19lbXVsX2RhdGEgKmVtdWwsCisJIHVuc2lnbmVkIGNhbGwsCisJIGNvbnN0IGludCBhcmcwLAorCSBjcHUgKnByb2Nlc3NvciwKKwkgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGludCBmZCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICB1bnNpZ25lZF93b3JkIHN0YXRfYnVmX2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOworICBzdHJ1Y3Qgc3RhdCBidWY7CisgIGludCBzdGF0dXM7CisgIFNZUyhmc3RhdCk7CisgIC8qIENhbid0IGNvbWJpbmUgdGhlc2Ugc3RhdGVtZW50cywgY3V6IGZzdGF0IHNldHMgZXJybm8uICovCisgIHN0YXR1cyA9IGZzdGF0KGZkLCAmYnVmKTsKKyAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycm5vKTsKKyAgd3JpdGVfc3RhdChzdGF0X2J1Zl9hZGRyLCBidWYsIHByb2Nlc3NvciwgY2lhKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfTFNUQVQKKyNkZWZpbmUgZG9fbHN0YXQgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb19sc3RhdChvc19lbXVsX2RhdGEgKmVtdWwsCisJIHVuc2lnbmVkIGNhbGwsCisJIGNvbnN0IGludCBhcmcwLAorCSBjcHUgKnByb2Nlc3NvciwKKwkgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGNoYXIgcGF0aF9idWZbUEFUSF9NQVhdOworICB1bnNpZ25lZF93b3JkIHBhdGhfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICBjaGFyICpwYXRoID0gZW11bF9yZWFkX3N0cmluZyhwYXRoX2J1ZiwgcGF0aF9hZGRyLCBQQVRIX01BWCwgcHJvY2Vzc29yLCBjaWEpOworICB1bnNpZ25lZF93b3JkIHN0YXRfYnVmX2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOworICBzdHJ1Y3Qgc3RhdCBidWY7CisgIGludCBzdGF0dXM7CisgIFNZUyhsc3RhdCk7CisgIC8qIENhbid0IGNvbWJpbmUgdGhlc2Ugc3RhdGVtZW50cywgY3V6IGxzdGF0IHNldHMgZXJybm8uICovCisgIHN0YXR1cyA9IGxzdGF0KHBhdGgsICZidWYpOworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOworICB3cml0ZV9zdGF0KHN0YXRfYnVmX2FkZHIsIGJ1ZiwgcHJvY2Vzc29yLCBjaWEpOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9HRVRESVJFTlRSSUVTCisjZGVmaW5lIGRvX2dldGRpcmVudHJpZXMgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb19nZXRkaXJlbnRyaWVzKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkJIHVuc2lnbmVkIGNhbGwsCisJCSBjb25zdCBpbnQgYXJnMCwKKwkJIGNwdSAqcHJvY2Vzc29yLAorCQkgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGludCBmZCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICB1bnNpZ25lZF93b3JkIGJ1Zl9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKKyAgY2hhciAqYnVmOworICBpbnQgbmJ5dGVzID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsyXTsKKyAgdW5zaWduZWRfd29yZCBiYXNlcF9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCszXTsKKyAgbG9uZyBiYXNlcDsKKyAgaW50IHN0YXR1czsKKyAgU1lTKGdldGRpcmVudHJpZXMpOworICBpZiAoYnVmX2FkZHIgIT0gMCAmJiBuYnl0ZXMgPj0gMCkKKyAgICBidWYgPSB6YWxsb2MobmJ5dGVzKTsKKyAgZWxzZQorICAgIGJ1ZiA9IE5VTEw7CisgIHN0YXR1cyA9IGdldGRpcmVudHJpZXMoZmQsCisJCQkgKGJ1Zl9hZGRyID09IDAgPyBOVUxMIDogYnVmKSwKKwkJCSBuYnl0ZXMsCisJCQkgKGJhc2VwX2FkZHIgPT0gMCA/IE5VTEwgOiAmYmFzZXApKTsKKyAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycm5vKTsKKyAgaWYgKGJhc2VwX2FkZHIgIT0gMCkKKyAgICBlbXVsX3dyaXRlX3dvcmQoYmFzZXBfYWRkciwgYmFzZXAsIHByb2Nlc3NvciwgY2lhKTsKKyAgaWYgKHN0YXR1cyA+IDApCisgICAgd3JpdGVfZGlyZW50cmllcyhidWZfYWRkciwgYnVmLCBzdGF0dXMsIHByb2Nlc3NvciwgY2lhKTsKKyAgaWYgKGJ1ZiAhPSBOVUxMKQorICAgIHpmcmVlKGJ1Zik7Cit9CisjZW5kaWYKKworCitzdGF0aWMgdm9pZAorZG9fX19zeXNjYWxsKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgICAgIHVuc2lnbmVkIGNhbGwsCisJICAgICBjb25zdCBpbnQgYXJnMCwKKwkgICAgIGNwdSAqcHJvY2Vzc29yLAorCSAgICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIFNZUyhfX3N5c2NhbGwpOworICBlbXVsX2RvX3N5c3RlbV9jYWxsKGVtdWwsCisJCSAgICAgIGVtdWwtPnN5c2NhbGxzLAorCQkgICAgICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXSwKKwkJICAgICAgYXJnMCArIDEsCisJCSAgICAgIHByb2Nlc3NvciwKKwkJICAgICAgY2lhKTsKK30KKworI2lmbmRlZiBIQVZFX0xTRUVLCisjZGVmaW5lIGRvX2xzZWVrIDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fbHNlZWsob3NfZW11bF9kYXRhICplbXVsLAorCSB1bnNpZ25lZCBjYWxsLAorCSBjb25zdCBpbnQgYXJnMCwKKwkgY3B1ICpwcm9jZXNzb3IsCisJIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBpbnQgZmlsZGVzID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07CisgIG9mZl90IG9mZnNldCA9IGVtdWxfcmVhZF9ncHI2NChwcm9jZXNzb3IsIGFyZzArMik7CisgIGludCB3aGVuY2UgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzRdOworICBvZmZfdCBzdGF0dXM7CisgIFNZUyhsc2Vlayk7CisgIHN0YXR1cyA9IGxzZWVrKGZpbGRlcywgb2Zmc2V0LCB3aGVuY2UpOworICBpZiAoc3RhdHVzID09IC0xKQorICAgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3NvciwgLTEsIGVycm5vKTsKKyAgZWxzZSB7CisgICAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCAwLCAwKTsgLyogc3VjY2VzcyAqLworICAgIGVtdWxfd3JpdGVfZ3ByNjQocHJvY2Vzc29yLCAzLCBzdGF0dXMpOworICB9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2RvX19fc3lzY3RsKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgICAgdW5zaWduZWQgY2FsbCwKKwkgICAgY29uc3QgaW50IGFyZzAsCisJICAgIGNwdSAqcHJvY2Vzc29yLAorCSAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgLyogY2FsbCB0aGUgYXJndW1lbnRzIGJ5IHRoZWlyIHJlYWwgbmFtZSAqLworICB1bnNpZ25lZF93b3JkIG5hbWUgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgbmF0dXJhbF93b3JkIG5hbWVsZW4gPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOworICB1bnNpZ25lZF93b3JkIG9sZHAgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzJdOworICB1bnNpZ25lZF93b3JkIG9sZGxlbnAgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzNdOworICBuYXR1cmFsX3dvcmQgb2xkbGVuOworICBuYXR1cmFsX3dvcmQgbWliOworICBuYXR1cmFsX3dvcmQgaW50X3ZhbDsKKyAgU1lTKF9fc3lzY3RsKTsKKworICAvKiBwbHVjayBvdXQgdGhlIG1hbmFnZW1lbnQgaW5mb3JtYXRpb24gYmFzZSBpZCAqLworICBpZiAobmFtZWxlbiA8IDEpCisgICAgZXJyb3IoInN5c3RlbV9jYWxsKClTWVNfX19zeXNjdGwgYmFkIG5hbWVbMF1cbiIpOworICBtaWIgPSB2bV9kYXRhX21hcF9yZWFkX3dvcmQoY3B1X2RhdGFfbWFwKHByb2Nlc3NvciksCisJCQkgICAgICBuYW1lLAorCQkJICAgICAgcHJvY2Vzc29yLAorCQkJICAgICAgY2lhKTsKKyAgbmFtZSArPSBzaXplb2YobWliKTsKKworICAvKiBzZWUgd2hhdCB0byBkbyB3aXRoIGl0IC4uLiAqLworICBzd2l0Y2ggKChpbnQpbWliKSB7CisgIGNhc2UgNi8qQ1RMX0hXKi86CisjaWYgV0lUSF9OZXRCU0RfSE9TVCAmJiAoQ1RMX0hXICE9IDYpCisjICBlcnJvciAiQ1RMX0hXIgorI2VuZGlmCisgICAgaWYgKG5hbWVsZW4gPCAyKQorICAgICAgZXJyb3IoInN5c3RlbV9jYWxsKClTWVNfX19zeXNjdGwgLSBDVExfSFcgLSBiYWQgbmFtZVsxXVxuIik7CisgICAgbWliID0gdm1fZGF0YV9tYXBfcmVhZF93b3JkKGNwdV9kYXRhX21hcChwcm9jZXNzb3IpLAorCQkJCW5hbWUsCisJCQkJcHJvY2Vzc29yLAorCQkJCWNpYSk7CisgICAgbmFtZSArPSBzaXplb2YobWliKTsKKyAgICBzd2l0Y2ggKChpbnQpbWliKSB7CisgICAgY2FzZSA3LypIV19QQUdFU0laRSovOgorI2lmIFdJVEhfTmV0QlNEX0hPU1QgJiYgKEhXX1BBR0VTSVpFICE9IDcpCisjICBlcnJvciAiSFdfUEFHRVNJWkUiCisjZW5kaWYKKyAgICAgIG9sZGxlbiA9IHZtX2RhdGFfbWFwX3JlYWRfd29yZChjcHVfZGF0YV9tYXAocHJvY2Vzc29yKSwKKwkJCQkgICAgIG9sZGxlbnAsCisJCQkJICAgICBwcm9jZXNzb3IsCisJCQkJICAgICBjaWEpOworICAgICAgaWYgKHNpemVvZihuYXR1cmFsX3dvcmQpID4gb2xkbGVuKQorCWVycm9yKCJzeXN0ZW1fY2FsbCgpc3lzY3RsIC0gQ1RMX0hXLkhXX1BBR0VTSVpFIC0gdG8gc21hbGxcbiIpOworICAgICAgaW50X3ZhbCA9IDgxOTI7CisgICAgICBvbGRsZW4gPSBzaXplb2YoaW50X3ZhbCk7CisgICAgICBlbXVsX3dyaXRlX3dvcmQob2xkcCwgaW50X3ZhbCwgcHJvY2Vzc29yLCBjaWEpOworICAgICAgZW11bF93cml0ZV93b3JkKG9sZGxlbnAsIG9sZGxlbiwgcHJvY2Vzc29yLCBjaWEpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yKCJzeXNjdGwoKSBDVExfSFcuJWQgdW5rbm93blxuIiwgbWliKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBlcnJvcigic3lzY3RsKCkgbmFtZVswXT0lZCB1bmtub3duXG4iLCAoaW50KW1pYik7CisgICAgYnJlYWs7CisgIH0KKyAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCAwLCAwKTsgLyogYWx3YXlzIHN1Y2NlZWQgKi8KK30KKworCisKK3N0YXRpYyBlbXVsX3N5c2NhbGxfZGVzY3JpcHRvciBuZXRic2RfZGVzY3JpcHRvcnNbXSA9IHsKKyAgLyogMCAqLyB7IDAsICJzeXNjYWxsIiB9LAorICAvKiAxICovIHsgZG9fZXhpdCwgImV4aXQiIH0sCisgIC8qIDIgKi8geyAwLCAiZm9yayIgfSwKKyAgLyogMyAqLyB7IGRvX3JlYWQsICJyZWFkIiB9LAorICAvKiA0ICovIHsgZG9fd3JpdGUsICJ3cml0ZSIgfSwKKyAgLyogNSAqLyB7IGRvX29wZW4sICJvcGVuIiB9LAorICAvKiA2ICovIHsgZG9fY2xvc2UsICJjbG9zZSIgfSwKKyAgLyogNyAqLyB7IDAsICJ3YWl0NCIgfSwKKyAgeyAwLCB9LCAvKiA4IGlzIG9sZCBjcmVhdCAqLworICAvKiA5ICovIHsgMCwgImxpbmsiIH0sCisgIC8qIDEwICovIHsgMCwgInVubGluayIgfSwKKyAgeyAwLCB9LCAvKiAxMSBpcyBvYnNvbGV0ZSBleGVjdiAqLworICAvKiAxMiAqLyB7IDAsICJjaGRpciIgfSwKKyAgLyogMTMgKi8geyAwLCAiZmNoZGlyIiB9LAorICAvKiAxNCAqLyB7IDAsICJta25vZCIgfSwKKyAgLyogMTUgKi8geyAwLCAiY2htb2QiIH0sCisgIC8qIDE2ICovIHsgMCwgImNob3duIiB9LAorICAvKiAxNyAqLyB7IGRvX2JyZWFrLCAiYnJlYWsiIH0sCisgIC8qIDE4ICovIHsgMCwgImdldGZzc3RhdCIgfSwKKyAgeyAwLCB9LCAvKiAxOSBpcyBvbGQgbHNlZWsgKi8KKyAgLyogMjAgKi8geyBkb19nZXRwaWQsICJnZXRwaWQiIH0sCisgIC8qIDIxICovIHsgMCwgIm1vdW50IiB9LAorICAvKiAyMiAqLyB7IDAsICJ1bm1vdW50IiB9LAorICAvKiAyMyAqLyB7IDAsICJzZXR1aWQiIH0sCisgIC8qIDI0ICovIHsgZG9fZ2V0dWlkLCAiZ2V0dWlkIiB9LAorICAvKiAyNSAqLyB7IGRvX2dldGV1aWQsICJnZXRldWlkIiB9LAorICAvKiAyNiAqLyB7IDAsICJwdHJhY2UiIH0sCisgIC8qIDI3ICovIHsgMCwgInJlY3Ztc2ciIH0sCisgIC8qIDI4ICovIHsgMCwgInNlbmRtc2ciIH0sCisgIC8qIDI5ICovIHsgMCwgInJlY3Zmcm9tIiB9LAorICAvKiAzMCAqLyB7IDAsICJhY2NlcHQiIH0sCisgIC8qIDMxICovIHsgMCwgImdldHBlZXJuYW1lIiB9LAorICAvKiAzMiAqLyB7IDAsICJnZXRzb2NrbmFtZSIgfSwKKyAgLyogMzMgKi8geyAwLCAiYWNjZXNzIiB9LAorICAvKiAzNCAqLyB7IDAsICJjaGZsYWdzIiB9LAorICAvKiAzNSAqLyB7IDAsICJmY2hmbGFncyIgfSwKKyAgLyogMzYgKi8geyAwLCAic3luYyIgfSwKKyAgLyogMzcgKi8geyBkb19raWxsLCAia2lsbCIgfSwKKyAgeyAwLCB9LCAvKiAzOCBpcyBvbGQgc3RhdCAqLworICAvKiAzOSAqLyB7IDAsICJnZXRwcGlkIiB9LAorICB7IDAsIH0sIC8qIDQwIGlzIG9sZCBsc3RhdCAqLworICAvKiA0MSAqLyB7IGRvX2R1cCwgImR1cCIgfSwKKyAgLyogNDIgKi8geyAwLCAicGlwZSIgfSwKKyAgLyogNDMgKi8geyBkb19nZXRlZ2lkLCAiZ2V0ZWdpZCIgfSwKKyAgLyogNDQgKi8geyAwLCAicHJvZmlsIiB9LAorICAvKiA0NSAqLyB7IDAsICJrdHJhY2UiIH0sCisgIC8qIDQ2ICovIHsgMCwgInNpZ2FjdGlvbiIgfSwKKyAgLyogNDcgKi8geyBkb19nZXRnaWQsICJnZXRnaWQiIH0sCisgIC8qIDQ4ICovIHsgZG9fc2lncHJvY21hc2ssICJzaWdwcm9jbWFzayIgfSwKKyAgLyogNDkgKi8geyAwLCAiZ2V0bG9naW4iIH0sCisgIC8qIDUwICovIHsgMCwgInNldGxvZ2luIiB9LAorICAvKiA1MSAqLyB7IDAsICJhY2N0IiB9LAorICAvKiA1MiAqLyB7IDAsICJzaWdwZW5kaW5nIiB9LAorICAvKiA1MyAqLyB7IDAsICJzaWdhbHRzdGFjayIgfSwKKyAgLyogNTQgKi8geyBkb19pb2N0bCwgImlvY3RsIiB9LAorICAvKiA1NSAqLyB7IDAsICJyZWJvb3QiIH0sCisgIC8qIDU2ICovIHsgMCwgInJldm9rZSIgfSwKKyAgLyogNTcgKi8geyAwLCAic3ltbGluayIgfSwKKyAgLyogNTggKi8geyAwLCAicmVhZGxpbmsiIH0sCisgIC8qIDU5ICovIHsgMCwgImV4ZWN2ZSIgfSwKKyAgLyogNjAgKi8geyBkb191bWFzaywgInVtYXNrIiB9LAorICAvKiA2MSAqLyB7IDAsICJjaHJvb3QiIH0sCisgIHsgMCwgfSwgLyogNjIgaXMgb2xkIGZzdGF0ICovCisgIHsgMCwgfSwgLyogNjMgaXMgb2xkIGdldGtlcm5pbmZvICovCisgIHsgMCwgfSwgLyogNjQgaXMgb2xkIGdldHBhZ2VzaXplICovCisgIC8qIDY1ICovIHsgMCwgIm1zeW5jIiB9LAorICAvKiA2NiAqLyB7IDAsICJ2Zm9yayIgfSwKKyAgeyAwLCB9LCAvKiA2NyBpcyBvYnNvbGV0ZSB2cmVhZCAqLworICB7IDAsIH0sIC8qIDY4IGlzIG9ic29sZXRlIHZ3cml0ZSAqLworICAvKiA2OSAqLyB7IDAsICJzYnJrIiB9LAorICAvKiA3MCAqLyB7IDAsICJzc3RrIiB9LAorICB7IDAsIH0sIC8qIDcxIGlzIG9sZCBtbWFwICovCisgIC8qIDcyICovIHsgMCwgInZhZHZpc2UiIH0sCisgIC8qIDczICovIHsgMCwgIm11bm1hcCIgfSwKKyAgLyogNzQgKi8geyAwLCAibXByb3RlY3QiIH0sCisgIC8qIDc1ICovIHsgMCwgIm1hZHZpc2UiIH0sCisgIHsgMCwgfSwgLyogNzYgaXMgb2Jzb2xldGUgdmhhbmd1cCAqLworICB7IDAsIH0sIC8qIDc3IGlzIG9ic29sZXRlIHZsaW1pdCAqLworICAvKiA3OCAqLyB7IDAsICJtaW5jb3JlIiB9LAorICAvKiA3OSAqLyB7IDAsICJnZXRncm91cHMiIH0sCisgIC8qIDgwICovIHsgMCwgInNldGdyb3VwcyIgfSwKKyAgLyogODEgKi8geyAwLCAiZ2V0cGdycCIgfSwKKyAgLyogODIgKi8geyAwLCAic2V0cGdpZCIgfSwKKyAgLyogODMgKi8geyAwLCAic2V0aXRpbWVyIiB9LAorICB7IDAsIH0sIC8qIDg0IGlzIG9sZCB3YWl0ICovCisgIC8qIDg1ICovIHsgMCwgInN3YXBvbiIgfSwKKyAgLyogODYgKi8geyAwLCAiZ2V0aXRpbWVyIiB9LAorICB7IDAsIH0sIC8qIDg3IGlzIG9sZCBnZXRob3N0bmFtZSAqLworICB7IDAsIH0sIC8qIDg4IGlzIG9sZCBzZXRob3N0bmFtZSAqLworICB7IDAsIH0sIC8qIDg5IGlzIG9sZCBnZXRkdGFibGVzaXplICovCisgIHsgZG9fZHVwMiwgImR1cDIiIH0sCisgIHsgMCwgfSwgLyogOTEgKi8KKyAgLyogOTIgKi8geyBkb19mY250bCwgImZjbnRsIiB9LAorICAvKiA5MyAqLyB7IDAsICJzZWxlY3QiIH0sCisgIHsgMCwgfSwgLyogOTQgKi8KKyAgLyogOTUgKi8geyAwLCAiZnN5bmMiIH0sCisgIC8qIDk2ICovIHsgMCwgInNldHByaW9yaXR5IiB9LAorICAvKiA5NyAqLyB7IDAsICJzb2NrZXQiIH0sCisgIC8qIDk4ICovIHsgMCwgImNvbm5lY3QiIH0sCisgIHsgMCwgfSwgLyogOTkgaXMgb2xkIGFjY2VwdCAqLworICAvKiAxMDAgKi8geyAwLCAiZ2V0cHJpb3JpdHkiIH0sCisgIHsgMCwgfSwgLyogMTAxIGlzIG9sZCBzZW5kICovCisgIHsgMCwgfSwgLyogMTAyIGlzIG9sZCByZWN2ICovCisgIC8qIDEwMyAqLyB7IDAsICJzaWdyZXR1cm4iIH0sCisgIC8qIDEwNCAqLyB7IDAsICJiaW5kIiB9LAorICAvKiAxMDUgKi8geyAwLCAic2V0c29ja29wdCIgfSwKKyAgLyogMTA2ICovIHsgMCwgImxpc3RlbiIgfSwKKyAgeyAwLCB9LCAvKiAxMDcgaXMgb2Jzb2xldGUgdnRpbWVzICovCisgIHsgMCwgfSwgLyogMTA4IGlzIG9sZCBzaWd2ZWMgKi8KKyAgeyAwLCB9LCAvKiAxMDkgaXMgb2xkIHNpZ2Jsb2NrICovCisgIHsgMCwgfSwgLyogMTEwIGlzIG9sZCBzaWdzZXRtYXNrICovCisgIC8qIDExMSAqLyB7IDAsICJzaWdzdXNwZW5kIiB9LAorICB7IDAsIH0sIC8qIDExMiBpcyBvbGQgc2lnc3RhY2sgKi8KKyAgeyAwLCB9LCAvKiAxMTMgaXMgb2xkIHJlY3Ztc2cgKi8KKyAgeyAwLCB9LCAvKiAxMTQgaXMgb2xkIHNlbmRtc2cgKi8KKyAgLyogLSBpcyBvYnNvbGV0ZSB2dHJhY2UgKi8geyAwLCAidnRyYWNlCTExNSIgfSwKKyAgLyogMTE2ICovIHsgZG9fZ2V0dGltZW9mZGF5LCAiZ2V0dGltZW9mZGF5IiB9LAorICAvKiAxMTcgKi8geyBkb19nZXRydXNhZ2UsICJnZXRydXNhZ2UiIH0sCisgIC8qIDExOCAqLyB7IDAsICJnZXRzb2Nrb3B0IiB9LAorICAvKiAxMTkgKi8geyAwLCAicmVzdWJhIiB9LAorICAvKiAxMjAgKi8geyAwLCAicmVhZHYiIH0sCisgIC8qIDEyMSAqLyB7IDAsICJ3cml0ZXYiIH0sCisgIC8qIDEyMiAqLyB7IDAsICJzZXR0aW1lb2ZkYXkiIH0sCisgIC8qIDEyMyAqLyB7IDAsICJmY2hvd24iIH0sCisgIC8qIDEyNCAqLyB7IDAsICJmY2htb2QiIH0sCisgIHsgMCwgfSwgLyogMTI1IGlzIG9sZCByZWN2ZnJvbSAqLworICB7IDAsIH0sIC8qIDEyNiBpcyBvbGQgc2V0cmV1aWQgKi8KKyAgeyAwLCB9LCAvKiAxMjcgaXMgb2xkIHNldHJlZ2lkICovCisgIC8qIDEyOCAqLyB7IDAsICJyZW5hbWUiIH0sCisgIHsgMCwgfSwgLyogMTI5IGlzIG9sZCB0cnVuY2F0ZSAqLworICB7IDAsIH0sIC8qIDEzMCBpcyBvbGQgZnRydW5jYXRlICovCisgIC8qIDEzMSAqLyB7IDAsICJmbG9jayIgfSwKKyAgLyogMTMyICovIHsgMCwgIm1rZmlmbyIgfSwKKyAgLyogMTMzICovIHsgMCwgInNlbmR0byIgfSwKKyAgLyogMTM0ICovIHsgMCwgInNodXRkb3duIiB9LAorICAvKiAxMzUgKi8geyAwLCAic29ja2V0cGFpciIgfSwKKyAgLyogMTM2ICovIHsgMCwgIm1rZGlyIiB9LAorICAvKiAxMzcgKi8geyAwLCAicm1kaXIiIH0sCisgIC8qIDEzOCAqLyB7IDAsICJ1dGltZXMiIH0sCisgIHsgMCwgfSwgLyogMTM5IGlzIG9ic29sZXRlIDQuMiBzaWdyZXR1cm4gKi8KKyAgLyogMTQwICovIHsgMCwgImFkanRpbWUiIH0sCisgIHsgMCwgfSwgLyogMTQxIGlzIG9sZCBnZXRwZWVybmFtZSAqLworICB7IDAsIH0sIC8qIDE0MiBpcyBvbGQgZ2V0aG9zdGlkICovCisgIHsgMCwgfSwgLyogMTQzIGlzIG9sZCBzZXRob3N0aWQgKi8KKyAgeyAwLCB9LCAvKiAxNDQgaXMgb2xkIGdldHJsaW1pdCAqLworICB7IDAsIH0sIC8qIDE0NSBpcyBvbGQgc2V0cmxpbWl0ICovCisgIHsgMCwgfSwgLyogMTQ2IGlzIG9sZCBraWxscGcgKi8KKyAgLyogMTQ3ICovIHsgMCwgInNldHNpZCIgfSwKKyAgLyogMTQ4ICovIHsgMCwgInF1b3RhY3RsIiB9LAorICB7IDAsIH0sIC8qIDE0OSBpcyBvbGQgcXVvdGEgKi8KKyAgeyAwLCB9LCAvKiAxNTAgaXMgb2xkIGdldHNvY2tuYW1lICovCisgIHsgMCwgfSwgLyogMTUxICovCisgIHsgMCwgfSwgLyogMTUyICovCisgIHsgMCwgfSwgLyogMTUzICovCisgIHsgMCwgfSwgLyogMTU0ICovCisgIC8qIDE1NSAqLyB7IDAsICJuZnNzdmMiIH0sCisgIHsgMCwgfSwgLyogMTU2IGlzIG9sZCBnZXRkaXJlbnRyaWVzICovCisgIC8qIDE1NyAqLyB7IDAsICJzdGF0ZnMiIH0sCisgIC8qIDE1OCAqLyB7IGRvX2ZzdGF0ZnMsICJmc3RhdGZzIiB9LAorICB7IDAsIH0sIC8qIDE1OSAqLworICB7IDAsIH0sIC8qIDE2MCAqLworICAvKiAxNjEgKi8geyAwLCAiZ2V0ZmgiIH0sCisgIHsgMCwgfSwgLyogMTYyIGlzIG9sZCBnZXRkb21haW5uYW1lICovCisgIHsgMCwgfSwgLyogMTYzIGlzIG9sZCBzZXRkb21haW5uYW1lICovCisgIHsgMCwgfSwgLyogMTY0IGlzIG9sZCB1bmFtZSAqLworICAvKiAxNjUgKi8geyAwLCAic3lzYXJjaCIgfSwKKyAgeyAwLCB9LCAvKiAxNjYgKi8KKyAgeyAwLCB9LCAvKiAxNjcgKi8KKyAgeyAwLCB9LCAvKiAxNjggKi8KKyAgLyogMTY5ICovIHsgMCwgInNlbXN5cyIgfSwKKyAgLyogMTcwICovIHsgMCwgIm1zZ3N5cyIgfSwKKyAgLyogMTcxICovIHsgMCwgInNobXN5cyIgfSwKKyAgeyAwLCB9LCAvKiAxNzIgKi8KKyAgeyAwLCB9LCAvKiAxNzMgKi8KKyAgeyAwLCB9LCAvKiAxNzQgKi8KKyAgeyAwLCB9LCAvKiAxNzUgKi8KKyAgeyAwLCB9LCAvKiAxNzYgKi8KKyAgeyAwLCB9LCAvKiAxNzcgKi8KKyAgeyAwLCB9LCAvKiAxNzggKi8KKyAgeyAwLCB9LCAvKiAxNzkgKi8KKyAgeyAwLCB9LCAvKiAxODAgKi8KKyAgLyogMTgxICovIHsgMCwgInNldGdpZCIgfSwKKyAgLyogMTgyICovIHsgMCwgInNldGVnaWQiIH0sCisgIC8qIDE4MyAqLyB7IDAsICJzZXRldWlkIiB9LAorICAvKiAxODQgKi8geyAwLCAibGZzX2JtYXB2IiB9LAorICAvKiAxODUgKi8geyAwLCAibGZzX21hcmt2IiB9LAorICAvKiAxODYgKi8geyAwLCAibGZzX3NlZ2NsZWFuIiB9LAorICAvKiAxODcgKi8geyAwLCAibGZzX3NlZ3dhaXQiIH0sCisgIC8qIDE4OCAqLyB7IGRvX3N0YXQsICJzdGF0IiB9LAorICAvKiAxODkgKi8geyBkb19mc3RhdCwgImZzdGF0IiB9LAorICAvKiAxOTAgKi8geyBkb19sc3RhdCwgImxzdGF0IiB9LAorICAvKiAxOTEgKi8geyAwLCAicGF0aGNvbmYiIH0sCisgIC8qIDE5MiAqLyB7IDAsICJmcGF0aGNvbmYiIH0sCisgIHsgMCwgfSwgLyogMTkzICovCisgIC8qIDE5NCAqLyB7IDAsICJnZXRybGltaXQiIH0sCisgIC8qIDE5NSAqLyB7IDAsICJzZXRybGltaXQiIH0sCisgIC8qIDE5NiAqLyB7IGRvX2dldGRpcmVudHJpZXMsICJnZXRkaXJlbnRyaWVzIiB9LAorICAvKiAxOTcgKi8geyAwLCAibW1hcCIgfSwKKyAgLyogMTk4ICovIHsgZG9fX19zeXNjYWxsLCAiX19zeXNjYWxsIiB9LAorICAvKiAxOTkgKi8geyBkb19sc2VlaywgImxzZWVrIiB9LAorICAvKiAyMDAgKi8geyAwLCAidHJ1bmNhdGUiIH0sCisgIC8qIDIwMSAqLyB7IDAsICJmdHJ1bmNhdGUiIH0sCisgIC8qIDIwMiAqLyB7IGRvX19fc3lzY3RsLCAiX19zeXNjdGwiIH0sCisgIC8qIDIwMyAqLyB7IDAsICJtbG9jayIgfSwKKyAgLyogMjA0ICovIHsgMCwgIm11bmxvY2siIH0sCit9OworCitzdGF0aWMgY2hhciAqKG5ldGJzZF9lcnJvcl9uYW1lc1tdKSA9IHsKKyAgLyogMCAqLyAiRVNVQ0NFU1MiLAorICAvKiAxICovICJFUEVSTSIsCisgIC8qIDIgKi8gIkVOT0VOVCIsCisgIC8qIDMgKi8gIkVTUkNIIiwKKyAgLyogNCAqLyAiRUlOVFIiLAorICAvKiA1ICovICJFSU8iLAorICAvKiA2ICovICJFTlhJTyIsCisgIC8qIDcgKi8gIkUyQklHIiwKKyAgLyogOCAqLyAiRU5PRVhFQyIsCisgIC8qIDkgKi8gIkVCQURGIiwKKyAgLyogMTAgKi8gIkVDSElMRCIsCisgIC8qIDExICovICJFREVBRExLIiwKKyAgLyogMTIgKi8gIkVOT01FTSIsCisgIC8qIDEzICovICJFQUNDRVMiLAorICAvKiAxNCAqLyAiRUZBVUxUIiwKKyAgLyogMTUgKi8gIkVOT1RCTEsiLAorICAvKiAxNiAqLyAiRUJVU1kiLAorICAvKiAxNyAqLyAiRUVYSVNUIiwKKyAgLyogMTggKi8gIkVYREVWIiwKKyAgLyogMTkgKi8gIkVOT0RFViIsCisgIC8qIDIwICovICJFTk9URElSIiwKKyAgLyogMjEgKi8gIkVJU0RJUiIsCisgIC8qIDIyICovICJFSU5WQUwiLAorICAvKiAyMyAqLyAiRU5GSUxFIiwKKyAgLyogMjQgKi8gIkVNRklMRSIsCisgIC8qIDI1ICovICJFTk9UVFkiLAorICAvKiAyNiAqLyAiRVRYVEJTWSIsCisgIC8qIDI3ICovICJFRkJJRyIsCisgIC8qIDI4ICovICJFTk9TUEMiLAorICAvKiAyOSAqLyAiRVNQSVBFIiwKKyAgLyogMzAgKi8gIkVST0ZTIiwKKyAgLyogMzEgKi8gIkVNTElOSyIsCisgIC8qIDMyICovICJFUElQRSIsCisgIC8qIDMzICovICJFRE9NIiwKKyAgLyogMzQgKi8gIkVSQU5HRSIsCisgIC8qIDM1ICovICJFQUdBSU4iLAorICAvKiAzNiAqLyAiRUlOUFJPR1JFU1MiLAorICAvKiAzNyAqLyAiRUFMUkVBRFkiLAorICAvKiAzOCAqLyAiRU5PVFNPQ0siLAorICAvKiAzOSAqLyAiRURFU1RBRERSUkVRIiwKKyAgLyogNDAgKi8gIkVNU0dTSVpFIiwKKyAgLyogNDEgKi8gIkVQUk9UT1RZUEUiLAorICAvKiA0MiAqLyAiRU5PUFJPVE9PUFQiLAorICAvKiA0MyAqLyAiRVBST1RPTk9TVVBQT1JUIiwKKyAgLyogNDQgKi8gIkVTT0NLVE5PU1VQUE9SVCIsCisgIC8qIDQ1ICovICJFT1BOT1RTVVBQIiwKKyAgLyogNDYgKi8gIkVQRk5PU1VQUE9SVCIsCisgIC8qIDQ3ICovICJFQUZOT1NVUFBPUlQiLAorICAvKiA0OCAqLyAiRUFERFJJTlVTRSIsCisgIC8qIDQ5ICovICJFQUREUk5PVEFWQUlMIiwKKyAgLyogNTAgKi8gIkVORVRET1dOIiwKKyAgLyogNTEgKi8gIkVORVRVTlJFQUNIIiwKKyAgLyogNTIgKi8gIkVORVRSRVNFVCIsCisgIC8qIDUzICovICJFQ09OTkFCT1JURUQiLAorICAvKiA1NCAqLyAiRUNPTk5SRVNFVCIsCisgIC8qIDU1ICovICJFTk9CVUZTIiwKKyAgLyogNTYgKi8gIkVJU0NPTk4iLAorICAvKiA1NyAqLyAiRU5PVENPTk4iLAorICAvKiA1OCAqLyAiRVNIVVRET1dOIiwKKyAgLyogNTkgKi8gIkVUT09NQU5ZUkVGUyIsCisgIC8qIDYwICovICJFVElNRURPVVQiLAorICAvKiA2MSAqLyAiRUNPTk5SRUZVU0VEIiwKKyAgLyogNjIgKi8gIkVMT09QIiwKKyAgLyogNjMgKi8gIkVOQU1FVE9PTE9ORyIsCisgIC8qIDY0ICovICJFSE9TVERPV04iLAorICAvKiA2NSAqLyAiRUhPU1RVTlJFQUNIIiwKKyAgLyogNjYgKi8gIkVOT1RFTVBUWSIsCisgIC8qIDY3ICovICJFUFJPQ0xJTSIsCisgIC8qIDY4ICovICJFVVNFUlMiLAorICAvKiA2OSAqLyAiRURRVU9UIiwKKyAgLyogNzAgKi8gIkVTVEFMRSIsCisgIC8qIDcxICovICJFUkVNT1RFIiwKKyAgLyogNzIgKi8gIkVCQURSUEMiLAorICAvKiA3MyAqLyAiRVJQQ01JU01BVENIIiwKKyAgLyogNzQgKi8gIkVQUk9HVU5BVkFJTCIsCisgIC8qIDc1ICovICJFUFJPR01JU01BVENIIiwKKyAgLyogNzYgKi8gIkVQUk9DVU5BVkFJTCIsCisgIC8qIDc3ICovICJFTk9MQ0siLAorICAvKiA3OCAqLyAiRU5PU1lTIiwKKyAgLyogNzkgKi8gIkVGVFlQRSIsCisgIC8qIDgwICovICJFQVVUSCIsCisgIC8qIDgxICovICJFTkVFREFVVEgiLAorICAvKiA4MSAqLyAiRUxBU1QiLAorfTsKKworc3RhdGljIGNoYXIgKihuZXRic2Rfc2lnbmFsX25hbWVzW10pID0geworICAvKiAwICovIDAsCisgIC8qIDEgKi8gIlNJR0hVUCIsCisgIC8qIDIgKi8gIlNJR0lOVCIsCisgIC8qIDMgKi8gIlNJR1FVSVQiLAorICAvKiA0ICovICJTSUdJTEwiLAorICAvKiA1ICovICJTSUdUUkFQIiwKKyAgLyogNiAqLyAiU0lHQUJSVCIsCisgIC8qIDcgKi8gIlNJR0VNVCIsCisgIC8qIDggKi8gIlNJR0ZQRSIsCisgIC8qIDkgKi8gIlNJR0tJTEwiLAorICAvKiAxMCAqLyAiU0lHQlVTIiwKKyAgLyogMTEgKi8gIlNJR1NFR1YiLAorICAvKiAxMiAqLyAiU0lHU1lTIiwKKyAgLyogMTMgKi8gIlNJR1BJUEUiLAorICAvKiAxNCAqLyAiU0lHQUxSTSIsCisgIC8qIDE1ICovICJTSUdURVJNIiwKKyAgLyogMTYgKi8gIlNJR1VSRyIsCisgIC8qIDE3ICovICJTSUdTVE9QIiwKKyAgLyogMTggKi8gIlNJR1RTVFAiLAorICAvKiAxOSAqLyAiU0lHQ09OVCIsCisgIC8qIDIwICovICJTSUdDSExEIiwKKyAgLyogMjEgKi8gIlNJR1RUSU4iLAorICAvKiAyMiAqLyAiU0lHVFRPVSIsCisgIC8qIDIzICovICJTSUdJTyIsCisgIC8qIDI0ICovICJTSUdYQ1BVIiwKKyAgLyogMjUgKi8gIlNJR1hGU1oiLAorICAvKiAyNiAqLyAiU0lHVlRBTFJNIiwKKyAgLyogMjcgKi8gIlNJR1BST0YiLAorICAvKiAyOCAqLyAiU0lHV0lOQ0giLAorICAvKiAyOSAqLyAiU0lHSU5GTyIsCisgIC8qIDMwICovICJTSUdVU1IxIiwKKyAgLyogMzEgKi8gIlNJR1VTUjIiLAorfTsKKworc3RhdGljIGVtdWxfc3lzY2FsbCBlbXVsX25ldGJzZF9zeXNjYWxscyA9IHsKKyAgbmV0YnNkX2Rlc2NyaXB0b3JzLAorICBzaXplb2YobmV0YnNkX2Rlc2NyaXB0b3JzKSAvIHNpemVvZihuZXRic2RfZGVzY3JpcHRvcnNbMF0pLAorICBuZXRic2RfZXJyb3JfbmFtZXMsCisgIHNpemVvZihuZXRic2RfZXJyb3JfbmFtZXMpIC8gc2l6ZW9mKG5ldGJzZF9lcnJvcl9uYW1lc1swXSksCisgIG5ldGJzZF9zaWduYWxfbmFtZXMsCisgIHNpemVvZihuZXRic2Rfc2lnbmFsX25hbWVzKSAvIHNpemVvZihuZXRic2Rfc2lnbmFsX25hbWVzWzBdKSwKK307CisKKworLyogTmV0QlNEJ3Mgb3NfZW11bCBpbnRlcmZhY2UsIG1vc3QgYXJlIGp1c3QgcGFzc2VkIG9uIHRvIHRoZSBnZW5lcmljCisgICBzeXNjYWxsIHN0dWZmICovCisKK3N0YXRpYyBvc19lbXVsX2RhdGEgKgorZW11bF9uZXRic2RfY3JlYXRlKGRldmljZSAqcm9vdCwKKwkJICAgYmZkICppbWFnZSwKKwkJICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgdW5zaWduZWRfd29yZCB0b3Bfb2Zfc3RhY2s7CisgIHVuc2lnbmVkIHN0YWNrX3NpemU7CisgIGludCBlbGZfYmluYXJ5OworICBvc19lbXVsX2RhdGEgKmJzZF9kYXRhOworICBkZXZpY2UgKnZtOworCisgIC8qIGNoZWNrIHRoYXQgdGhpcyBlbXVsYXRpb24gaXMgcmVhbGx5IGZvciB1cyAqLworICBpZiAobmFtZSAhPSBOVUxMICYmIHN0cmNtcChuYW1lLCAibmV0YnNkIikgIT0gMCkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKGltYWdlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKworICAvKiBtZXJnZSBhbnkgZW11bGF0aW9uIHNwZWNpZmljIGVudHJpZXMgaW50byB0aGUgZGV2aWNlIHRyZWUgKi8KKworICAvKiBlc3RhYmxpc2ggYSBmZXcgZGVmYXVsdHMgKi8KKyAgaWYgKGltYWdlLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpIHsKKyAgICBlbGZfYmluYXJ5ID0gMTsKKyAgICB0b3Bfb2Zfc3RhY2sgPSAweGUwMDAwMDAwOworICAgIHN0YWNrX3NpemUgPSAgIDB4MDAxMDAwMDA7CisgIH0KKyAgZWxzZSB7CisgICAgZWxmX2JpbmFyeSA9IDA7CisgICAgdG9wX29mX3N0YWNrID0gMHgyMDAwMDAwMDsKKyAgICBzdGFja19zaXplID0gICAweDAwMTAwMDAwOworICB9CisKKyAgLyogb3B0aW9ucyAqLworICBlbXVsX2FkZF90cmVlX29wdGlvbnMocm9vdCwgaW1hZ2UsICJuZXRic2QiLAorCQkJKFdJVEhfRU5WSVJPTk1FTlQgPT0gVVNFUl9FTlZJUk9OTUVOVAorCQkJID8gInVzZXIiIDogInZpcnR1YWwiKSwKKwkJCTAgLypvZWEtaW50ZXJydXB0LXByZWZpeCovKTsKKworICAvKiB2aXJ0dWFsIG1lbW9yeSAtIGhhbmRsZXMgZ3Jvd3RoIG9mIHN0YWNrL2hlYXAgKi8KKyAgdm0gPSB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vdm0iKTsKKyAgdHJlZV9wYXJzZSh2bSwgIi4vc3RhY2stYmFzZSAweCVseCIsCisJICAgICAodW5zaWduZWQgbG9uZykodG9wX29mX3N0YWNrIC0gc3RhY2tfc2l6ZSkpOworICB0cmVlX3BhcnNlKHZtLCAiLi9uci1ieXRlcyAweCV4Iiwgc3RhY2tfc2l6ZSk7CisKKyAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL3ZtL21hcC1iaW5hcnkvZmlsZS1uYW1lICVzIiwKKwkgICAgIGJmZF9nZXRfZmlsZW5hbWUoaW1hZ2UpKTsKKworICAvKiBmaW5pc2ggdGhlIGluaXQgKi8KKyAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvcGMgMHglbHgiLAorCSAgICAgKHVuc2lnbmVkIGxvbmcpYmZkX2dldF9zdGFydF9hZGRyZXNzKGltYWdlKSk7CisgIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L3JlZ2lzdGVyL3NwIDB4JWx4IiwKKwkgICAgICh1bnNpZ25lZCBsb25nKXRvcF9vZl9zdGFjayk7CisgIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L3JlZ2lzdGVyL21zciAweCV4IiwKKwkgICAgICgodHJlZV9maW5kX2Jvb2xlYW5fcHJvcGVydHkocm9vdCwgIi9vcHRpb25zL2xpdHRsZS1lbmRpYW4/IikKKwkgICAgICAgPyBtc3JfbGl0dGxlX2VuZGlhbl9tb2RlCisJICAgICAgIDogMCkKKwkgICAgICB8ICh0cmVlX2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eShyb290LCAiL29wZW5wcm9tL29wdGlvbnMvZmxvYXRpbmctcG9pbnQ/IikKKwkJID8gKG1zcl9mbG9hdGluZ19wb2ludF9hdmFpbGFibGUKKwkJICAgIHwgbXNyX2Zsb2F0aW5nX3BvaW50X2V4Y2VwdGlvbl9tb2RlXzAKKwkJICAgIHwgbXNyX2Zsb2F0aW5nX3BvaW50X2V4Y2VwdGlvbl9tb2RlXzEpCisJCSA6IDApKSk7CisgIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0L3N0YWNrL3N0YWNrLXR5cGUgJXMiLAorCSAgICAgKGVsZl9iaW5hcnkgPyAicHBjLWVsZiIgOiAicHBjLXhjb2ZmIikpOworCisgIC8qIGZpbmFsbHkgb3VyIGVtdWxhdGlvbiBkYXRhICovCisgIGJzZF9kYXRhID0gWkFMTE9DKG9zX2VtdWxfZGF0YSk7CisgIGJzZF9kYXRhLT52bSA9IHZtOworICBic2RfZGF0YS0+c3lzY2FsbHMgPSAmZW11bF9uZXRic2Rfc3lzY2FsbHM7CisgIHJldHVybiBic2RfZGF0YTsKK30KKworc3RhdGljIHZvaWQKK2VtdWxfbmV0YnNkX2luaXQob3NfZW11bF9kYXRhICplbXVsX2RhdGEsCisJCSBpbnQgbnJfY3B1cykKK3sKKyAgLyogbm90aGluZyB5ZXQgKi8KK30KKworc3RhdGljIHZvaWQKK2VtdWxfbmV0YnNkX3N5c3RlbV9jYWxsKGNwdSAqcHJvY2Vzc29yLAorCQkJdW5zaWduZWRfd29yZCBjaWEsCisJCQlvc19lbXVsX2RhdGEgKmVtdWxfZGF0YSkKK3sKKyAgZW11bF9kb19zeXN0ZW1fY2FsbChlbXVsX2RhdGEsCisJCSAgICAgIGVtdWxfZGF0YS0+c3lzY2FsbHMsCisJCSAgICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByWzBdLAorCQkgICAgICAzLCAvKnIzIGNvbnRhaW5zIGFyZzAqLworCQkgICAgICBwcm9jZXNzb3IsCisJCSAgICAgIGNpYSk7Cit9CisKK2NvbnN0IG9zX2VtdWwgZW11bF9uZXRic2QgPSB7CisgICJuZXRic2QiLAorICBlbXVsX25ldGJzZF9jcmVhdGUsCisgIGVtdWxfbmV0YnNkX2luaXQsCisgIGVtdWxfbmV0YnNkX3N5c3RlbV9jYWxsLAorICAwLCAvKmluc3RydWN0aW9uX2NhbGwqLworICAwIC8qZGF0YSovCit9OworCisjZW5kaWYgX0VNVUxfTkVUQlNEX0NfCmRpZmYgLS1naXQgYS9zaW0vcHBjL2VtdWxfbmV0YnNkLmggYi9zaW0vcHBjL2VtdWxfbmV0YnNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhM2U4NQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZW11bF9uZXRic2QuaApAQCAtMCwwICsxLDI3IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIF9FTVVMX05FVEJTRF9IXworI2RlZmluZSBfRU1VTF9ORVRCU0RfSF8KKworZXh0ZXJuIGNvbnN0IG9zX2VtdWwgZW11bF9uZXRic2Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9lbXVsX3VuaXguYyBiL3NpbS9wcGMvZW11bF91bml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVlNTYyOQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZW11bF91bml4LmMKQEAgLTAsMCArMSwyODEyIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworICAgICovCisKKworI2lmbmRlZiBfRU1VTF9VTklYX0NfCisjZGVmaW5lIF9FTVVMX1VOSVhfQ18KKworCisvKiBOb3RlOiB0aGlzIG1vZHVsZSBpcyBjYWxsZWQgdmlhIGEgdGFibGUuICBUaGVyZSBpcyBubyBiZW5lZml0IGluCisgICBtYWtpbmcgaXQgaW5saW5lICovCisKKyNpbmNsdWRlICJlbXVsX2dlbmVyaWMuaCIKKyNpbmNsdWRlICJlbXVsX3VuaXguaCIKKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbHNlCisjdW5kZWYgSEFWRV9TVEFUCisjdW5kZWYgSEFWRV9MU1RBVAorI3VuZGVmIEhBVkVfRlNUQVQKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaWZkZWYgSEFWRV9GQ05UTF9ICisjaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NZU19USU1FX0gKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9URVJNSU9TX1NUUlVDVFVSRQorI3VuZGVmIEhBVkVfU1lTX1RFUk1JT1NfSAorI3VuZGVmIEhBVkVfVENHRVRBVFRSCisjZWxzZQorI2lmbmRlZiBIQVZFX1NZU19URVJNSU9TX0gKKyN1bmRlZiBIQVZFX1RFUk1JT1NfU1RSVUNUVVJFCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9URVJNSU9TX1NUUlVDVFVSRQorI2luY2x1ZGUgPHN5cy90ZXJtaW9zLmg+CisKKy8qIElmIHdlIGhhdmUgVEVSTUlPUywgdXNlIHRoYXQgZm9yIHRoZSB0ZXJtaW8gc3RydWN0dXJlLCBzaW5jZSBzb21lIHN5c3RlbXMKKyAgIGRvbid0IGxpa2UgaW5jbHVkaW5nIGJvdGggc3lzL3Rlcm1pb3MuaCBhbmQgc3lzL3Rlcm1pby5oIGF0IHRoZSBzYW1lCisgICB0aW1lLiAgKi8KKyN1bmRlZglIQVZFX1RFUk1JT19TVFJVQ1RVUkUKKyN1bmRlZglUQ0dFVEEKKyN1bmRlZgl0ZXJtaW8KKyNkZWZpbmUgdGVybWlvIHRlcm1pb3MKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVEVSTUlPX1NUUlVDVFVSRQorI3VuZGVmIEhBVkVfU1lTX1RFUk1JT19ICisjZWxzZQorI2lmbmRlZiBIQVZFX1NZU19URVJNSU9fSAorI3VuZGVmIEhBVkVfVEVSTUlPX1NUUlVDVFVSRQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfVEVSTUlPX1NUUlVDVFVSRQorI2luY2x1ZGUgPHN5cy90ZXJtaW8uaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9HRVRSVVNBR0UKKyNpZm5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorI3VuZGVmIEhBVkVfR0VUUlVTQUdFCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9HRVRSVVNBR0UKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KK2ludCBnZXRydXNhZ2UoKTsKKyNlbmRpZgorCisjaWYgSEFWRV9ESVJFTlRfSAorIyBpbmNsdWRlIDxkaXJlbnQuaD4KKyMgZGVmaW5lIE5BTUxFTihkaXJlbnQpIHN0cmxlbigoZGlyZW50KS0+ZF9uYW1lKQorI2Vsc2UKKyMgZGVmaW5lIGRpcmVudCBkaXJlY3QKKyMgZGVmaW5lIE5BTUxFTihkaXJlbnQpIChkaXJlbnQpLT5kX25hbWxlbgorIyBpZiBIQVZFX1NZU19ORElSX0gKKyMgIGluY2x1ZGUgPHN5cy9uZGlyLmg+CisjIGVuZGlmCisjIGlmIEhBVkVfU1lTX0RJUl9ICisjICBpbmNsdWRlIDxzeXMvZGlyLmg+CisjIGVuZGlmCisjIGlmIEhBVkVfTkRJUl9ICisjICBpbmNsdWRlIDxuZGlyLmg+CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyN1bmRlZiBNQVhQQVRITEVOCQkvKiBzeXMvcGFyYW0uaCBtaWdodCBkZWZpbmUgdGhpcyBhbHNvICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChCU0QpICYmICFkZWZpbmVkKGVycm5vKSAmJiAoQlNEIDwgMTk5MzA2KQkvKiBoZXJlIEJTRCBhcyBqdXN0IGEgYnVnICovCitleHRlcm4gaW50IGVycm5vOworI2VuZGlmCisKKyNpZm5kZWYgU1RBVElDX0lOTElORV9FTVVMX1VOSVgKKyNkZWZpbmUgU1RBVElDX0lOTElORV9FTVVMX1VOSVggU1RBVElDX0lOTElORQorI2VuZGlmCisKKyNpZm5kZWYgUEFUSF9NQVgKKyNkZWZpbmUgUEFUSF9NQVggMTAyNAorI2VuZGlmCisKKyNpZm5kZWYgRUlOVkFMCisjZGVmaW5lIEVJTlZBTCAtMQorI2VuZGlmCisKKy8qIFVOSVgncyBpZGVhIG9mIHdoYXQgaXMgbmVlZGVkIHRvIGltcGxlbWVudCBlbXVsYXRpb25zICovCisKK3N0cnVjdCBfb3NfZW11bF9kYXRhIHsKKyAgZGV2aWNlICp2bTsKKyAgZW11bF9zeXNjYWxsICpzeXNjYWxsczsKK307CisKKwwKKy8qIEVtdWxhdGlvbiBvZiBzaW1wbGUgVU5JWCBzeXN0ZW0gY2FsbHMgdGhhdCBhcmUgY29tbW9uIG9uIGFsbCBzeXN0ZW1zLiAgKi8KKworLyogU3RydWN0dXJlcyB0aGF0IGFyZSBjb21tb24gYWdtb25zdCB0aGUgVU5JWCB2YXJpZW50cyAqLworc3RydWN0IHVuaXhfdGltZXZhbCB7CisgIHNpZ25lZDMyIHR2X3NlYzsJCS8qIHNlY29uZHMgKi8KKyAgc2lnbmVkMzIgdHZfdXNlYzsJCS8qIG1pY3Jvc2Vjb25kcyAqLworfTsKKworc3RydWN0IHVuaXhfdGltZXpvbmUgeworICBzaWduZWQzMiB0el9taW51dGVzd2VzdDsJLyogbWludXRlcyB3ZXN0IG9mIEdyZWVud2ljaCAqLworICBzaWduZWQzMiB0el9kc3R0aW1lOwkJLyogdHlwZSBvZiBkc3QgY29ycmVjdGlvbiAqLworfTsKKworI2RlZmluZQlVTklYX1JVU0FHRV9TRUxGCTAKKyNkZWZpbmUJVU5JWF9SVVNBR0VfQ0hJTERSRU4JKC0xKQorI2RlZmluZSBVTklYX1JVU0FHRV9CT1RICSgtMikJLyogc3lzX3dhaXQ0KCkgdXNlcyB0aGlzICovCisKK3N0cnVjdAl1bml4X3J1c2FnZSB7CisJc3RydWN0IHVuaXhfdGltZXZhbCBydV91dGltZTsJLyogdXNlciB0aW1lIHVzZWQgKi8KKwlzdHJ1Y3QgdW5peF90aW1ldmFsIHJ1X3N0aW1lOwkvKiBzeXN0ZW0gdGltZSB1c2VkICovCisJc2lnbmVkMzIgcnVfbWF4cnNzOwkJLyogbWF4aW11bSByZXNpZGVudCBzZXQgc2l6ZSAqLworCXNpZ25lZDMyIHJ1X2l4cnNzOwkJLyogaW50ZWdyYWwgc2hhcmVkIG1lbW9yeSBzaXplICovCisJc2lnbmVkMzIgcnVfaWRyc3M7CQkvKiBpbnRlZ3JhbCB1bnNoYXJlZCBkYXRhIHNpemUgKi8KKwlzaWduZWQzMiBydV9pc3JzczsJCS8qIGludGVncmFsIHVuc2hhcmVkIHN0YWNrIHNpemUgKi8KKwlzaWduZWQzMiBydV9taW5mbHQ7CQkvKiBhbnkgcGFnZSBmYXVsdHMgbm90IHJlcXVpcmluZyBJL08gKi8KKwlzaWduZWQzMiBydV9tYWpmbHQ7CQkvKiBhbnkgcGFnZSBmYXVsdHMgcmVxdWlyaW5nIEkvTyAqLworCXNpZ25lZDMyIHJ1X25zd2FwOwkJLyogc3dhcHMgKi8KKwlzaWduZWQzMiBydV9pbmJsb2NrOwkJLyogYmxvY2sgaW5wdXQgb3BlcmF0aW9ucyAqLworCXNpZ25lZDMyIHJ1X291YmxvY2s7CQkvKiBibG9jayBvdXRwdXQgb3BlcmF0aW9ucyAqLworCXNpZ25lZDMyIHJ1X21zZ3NuZDsJCS8qIG1lc3NhZ2VzIHNlbnQgKi8KKwlzaWduZWQzMiBydV9tc2dyY3Y7CQkvKiBtZXNzYWdlcyByZWNlaXZlZCAqLworCXNpZ25lZDMyIHJ1X25zaWduYWxzOwkJLyogc2lnbmFscyByZWNlaXZlZCAqLworCXNpZ25lZDMyIHJ1X252Y3N3OwkJLyogdm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXMgKi8KKwlzaWduZWQzMiBydV9uaXZjc3c7CQkvKiBpbnZvbHVudGFyeSAiICovCit9OworCisKK3N0YXRpYyB2b2lkCitkb191bml4X2V4aXQob3NfZW11bF9kYXRhICplbXVsLAorCSAgICAgdW5zaWduZWQgY2FsbCwKKwkgICAgIGNvbnN0IGludCBhcmcwLAorCSAgICAgY3B1ICpwcm9jZXNzb3IsCisJICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgaW50IHN0YXR1cyA9IChpbnQpY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07CisgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIlZClcbiIsIHN0YXR1cyk7CisKKyAgY3B1X2hhbHQocHJvY2Vzc29yLCBjaWEsIHdhc19leGl0ZWQsIHN0YXR1cyk7Cit9CisKKworc3RhdGljIHZvaWQKK2RvX3VuaXhfcmVhZChvc19lbXVsX2RhdGEgKmVtdWwsCisJICAgICB1bnNpZ25lZCBjYWxsLAorCSAgICAgY29uc3QgaW50IGFyZzAsCisJICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICB2b2lkICpzY3JhdGNoX2J1ZmZlcjsKKyAgaW50IGQgPSAoaW50KWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICB1bnNpZ25lZF93b3JkIGJ1ZiA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisgIGludCBuYnl0ZXMgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzJdOworICBpbnQgc3RhdHVzOworCisgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIlZCwgMHglbHgsICVkIiwgZCwgKGxvbmcpYnVmLCBuYnl0ZXMpOworCisgIC8qIGdldCBhIHRlbXBvYXJ5IGJ1ZmVyICovCisgIHNjcmF0Y2hfYnVmZmVyID0gemFsbG9jKG5ieXRlcyk7CisKKyAgLyogY2hlY2sgaWYgYnVmZmVyIGV4aXN0cyBieSByZWFkaW5nIGl0ICovCisgIGVtdWxfcmVhZF9idWZmZXIoc2NyYXRjaF9idWZmZXIsIGJ1ZiwgbmJ5dGVzLCBwcm9jZXNzb3IsIGNpYSk7CisKKyAgLyogcmVhZCAqLworICBzdGF0dXMgPSByZWFkIChkLCBzY3JhdGNoX2J1ZmZlciwgbmJ5dGVzKTsKKworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOworICBpZiAoc3RhdHVzID4gMCkKKyAgICBlbXVsX3dyaXRlX2J1ZmZlcihzY3JhdGNoX2J1ZmZlciwgYnVmLCBzdGF0dXMsIHByb2Nlc3NvciwgY2lhKTsKKworICB6ZnJlZShzY3JhdGNoX2J1ZmZlcik7Cit9CisKKworc3RhdGljIHZvaWQKK2RvX3VuaXhfd3JpdGUob3NfZW11bF9kYXRhICplbXVsLAorCSAgICAgIHVuc2lnbmVkIGNhbGwsCisJICAgICAgY29uc3QgaW50IGFyZzAsCisJICAgICAgY3B1ICpwcm9jZXNzb3IsCisJICAgICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHZvaWQgKnNjcmF0Y2hfYnVmZmVyID0gTlVMTDsKKyAgaW50IGQgPSAoaW50KWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICB1bnNpZ25lZF93b3JkIGJ1ZiA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisgIGludCBuYnl0ZXMgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzJdOworICBpbnQgc3RhdHVzOworCisgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIlZCwgMHglbHgsICVkIiwgZCwgKGxvbmcpYnVmLCBuYnl0ZXMpOworCisgIC8qIGdldCBhIHRlbXBvYXJ5IGJ1ZmVyICovCisgIHNjcmF0Y2hfYnVmZmVyID0gemFsbG9jKG5ieXRlcyk7IC8qIEZJWE1FIC0gbmJ5dGVzID09IDAgKi8KKworICAvKiBjb3B5IGluICovCisgIGVtdWxfcmVhZF9idWZmZXIoc2NyYXRjaF9idWZmZXIsIGJ1ZiwgbmJ5dGVzLAorCQkgICBwcm9jZXNzb3IsIGNpYSk7CisKKyAgLyogd3JpdGUgKi8KKyAgc3RhdHVzID0gd3JpdGUoZCwgc2NyYXRjaF9idWZmZXIsIG5ieXRlcyk7CisgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7CisgIHpmcmVlKHNjcmF0Y2hfYnVmZmVyKTsKKworICBmbHVzaF9zdGRvdXRwdXQoKTsKK30KKworCitzdGF0aWMgdm9pZAorZG9fdW5peF9vcGVuKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgICAgIHVuc2lnbmVkIGNhbGwsCisJICAgICBjb25zdCBpbnQgYXJnMCwKKwkgICAgIGNwdSAqcHJvY2Vzc29yLAorCSAgICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHVuc2lnbmVkX3dvcmQgcGF0aF9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07CisgIGNoYXIgcGF0aF9idWZbUEFUSF9NQVhdOworICBjaGFyICpwYXRoID0gZW11bF9yZWFkX3N0cmluZyhwYXRoX2J1ZiwgcGF0aF9hZGRyLCBQQVRIX01BWCwgcHJvY2Vzc29yLCBjaWEpOworICBpbnQgZmxhZ3MgPSAoaW50KWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisgIGludCBtb2RlID0gKGludCljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzJdOworICBpbnQgc3RhdHVzOworCisgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIweCVseCBbJXNdLCAweCV4LCAweCV4IiwgKGxvbmcpcGF0aF9hZGRyLCBwYXRoLCBmbGFncywgbW9kZSk7CisKKyAgc3RhdHVzID0gb3BlbihwYXRoLCBmbGFncywgbW9kZSk7CisgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Cit9CisKKworc3RhdGljIHZvaWQKK2RvX3VuaXhfY2xvc2Uob3NfZW11bF9kYXRhICplbXVsLAorCSAgICAgIHVuc2lnbmVkIGNhbGwsCisJICAgICAgY29uc3QgaW50IGFyZzAsCisJICAgICAgY3B1ICpwcm9jZXNzb3IsCisJICAgICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGludCBkID0gKGludCljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgaW50IHN0YXR1czsKKworICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiJWQiLCBkKTsKKworICBzdGF0dXMgPSBjbG9zZShkKTsKKyAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycm5vKTsKK30KKworCitzdGF0aWMgdm9pZAorZG9fdW5peF9icmVhayhvc19lbXVsX2RhdGEgKmVtdWwsCisJICAgICAgdW5zaWduZWQgY2FsbCwKKwkgICAgICBjb25zdCBpbnQgYXJnMCwKKwkgICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgLyoganVzdCBwYXNzIHRoaXMgb250byB0aGUgYHZtJyBkZXZpY2UgKi8KKyAgdW5zaWduZWRfd29yZCBuZXdfYnJlYWsgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgaW50IHN0YXR1czsKKworICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiMHglbHgiLCAobG9uZyljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXSk7CisKKyAgc3RhdHVzID0gZGV2aWNlX2lvY3RsKGVtdWwtPnZtLAorCQkJcHJvY2Vzc29yLAorCQkJY2lhLAorCQkJZGV2aWNlX2lvY3RsX2JyZWFrLAorCQkJbmV3X2JyZWFrKTsgLyppb2N0bC1kYXRhKi8KKworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIDAsIHN0YXR1cyk7Cit9CisKKyNpZm5kZWYgSEFWRV9BQ0NFU1MKKyNkZWZpbmUgZG9fdW5peF9hY2Nlc3MgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb191bml4X2FjY2Vzcyhvc19lbXVsX2RhdGEgKmVtdWwsCisJICAgICAgIHVuc2lnbmVkIGNhbGwsCisJICAgICAgIGNvbnN0IGludCBhcmcwLAorCSAgICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHVuc2lnbmVkX3dvcmQgcGF0aF9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07CisgIGNoYXIgcGF0aF9idWZbUEFUSF9NQVhdOworICBjaGFyICpwYXRoID0gZW11bF9yZWFkX3N0cmluZyhwYXRoX2J1ZiwgcGF0aF9hZGRyLCBQQVRIX01BWCwgcHJvY2Vzc29yLCBjaWEpOworICBpbnQgbW9kZSA9IChpbnQpY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKKyAgaW50IHN0YXR1czsKKworICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiMHglbHggWyVzXSwgMHgleCBbMCVvXSIsIChsb25nKXBhdGhfYWRkciwgcGF0aCwgbW9kZSwgbW9kZSk7CisKKyAgc3RhdHVzID0gYWNjZXNzKHBhdGgsIG1vZGUpOworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9HRVRQSUQKKyNkZWZpbmUgZG9fdW5peF9nZXRwaWQgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb191bml4X2dldHBpZChvc19lbXVsX2RhdGEgKmVtdWwsCisJICAgICAgIHVuc2lnbmVkIGNhbGwsCisJICAgICAgIGNvbnN0IGludCBhcmcwLAorCSAgICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHBpZF90IHN0YXR1cyA9IGdldHBpZCgpOworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIChpbnQpc3RhdHVzLCBlcnJubyk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0dFVFBQSUQKKyNkZWZpbmUgZG9fdW5peF9nZXRwcGlkIDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fdW5peF9nZXRwcGlkKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkJdW5zaWduZWQgY2FsbCwKKwkJY29uc3QgaW50IGFyZzAsCisJCWNwdSAqcHJvY2Vzc29yLAorCQl1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgcGlkX3Qgc3RhdHVzID0gZ2V0cHBpZCgpOworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIChpbnQpc3RhdHVzLCBlcnJubyk7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEhBVkVfR0VUUElEKSB8fCAhZGVmaW5lZChIQVZFX0dFVFBQSUQpCisjZGVmaW5lIGRvX3VuaXhfZ2V0cGlkMiAwCisjZWxzZQorc3RhdGljIHZvaWQKK2RvX3VuaXhfZ2V0cGlkMihvc19lbXVsX2RhdGEgKmVtdWwsCisJCXVuc2lnbmVkIGNhbGwsCisJCWNvbnN0IGludCBhcmcwLAorCQljcHUgKnByb2Nlc3NvciwKKwkJdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGludCBwaWQgID0gKGludClnZXRwaWQoKTsKKyAgaW50IHBwaWQgPSAoaW50KWdldHBwaWQoKTsKKyAgZW11bF93cml0ZTJfc3RhdHVzKHByb2Nlc3NvciwgcGlkLCBwcGlkLCBlcnJubyk7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEhBVkVfR0VUVUlEKSB8fCAhZGVmaW5lZChIQVZFX0dFVEVVSUQpCisjZGVmaW5lIGRvX3VuaXhfZ2V0dWlkMiAwCisjZWxzZQorc3RhdGljIHZvaWQKK2RvX3VuaXhfZ2V0dWlkMihvc19lbXVsX2RhdGEgKmVtdWwsCisJCXVuc2lnbmVkIGNhbGwsCisJCWNvbnN0IGludCBhcmcwLAorCQljcHUgKnByb2Nlc3NvciwKKwkJdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHVpZF90IHVpZCAgPSBnZXR1aWQoKTsKKyAgdWlkX3QgZXVpZCA9IGdldGV1aWQoKTsKKyAgZW11bF93cml0ZTJfc3RhdHVzKHByb2Nlc3NvciwgKGludCl1aWQsIChpbnQpZXVpZCwgZXJybm8pOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9HRVRVSUQKKyNkZWZpbmUgZG9fdW5peF9nZXR1aWQgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb191bml4X2dldHVpZChvc19lbXVsX2RhdGEgKmVtdWwsCisJICAgICAgIHVuc2lnbmVkIGNhbGwsCisJICAgICAgIGNvbnN0IGludCBhcmcwLAorCSAgICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHVpZF90IHN0YXR1cyA9IGdldHVpZCgpOworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIChpbnQpc3RhdHVzLCBlcnJubyk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0dFVEVVSUQKKyNkZWZpbmUgZG9fdW5peF9nZXRldWlkIDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fdW5peF9nZXRldWlkKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkJdW5zaWduZWQgY2FsbCwKKwkJY29uc3QgaW50IGFyZzAsCisJCWNwdSAqcHJvY2Vzc29yLAorCQl1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgdWlkX3Qgc3RhdHVzID0gZ2V0ZXVpZCgpOworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIChpbnQpc3RhdHVzLCBlcnJubyk7Cit9CisjZW5kaWYKKworI2lmIDAKKyNpZm5kZWYgSEFWRV9LSUxMCisjZGVmaW5lIGRvX3VuaXhfa2lsbCAwCisjZWxzZQorc3RhdGljIHZvaWQKK2RvX3VuaXhfa2lsbChvc19lbXVsX2RhdGEgKmVtdWwsCisJICAgICB1bnNpZ25lZCBjYWxsLAorCSAgICAgY29uc3QgaW50IGFyZzAsCisJICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBwaWRfdCBwaWQgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgaW50IHNpZyA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisKKyAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkLCAlZCIsIChpbnQpcGlkLCBzaWcpOworCisgIHByaW50Zl9maWx0ZXJlZCgiU1lTX2tpbGwgYXQgMHglbHggLSBtb3JlIHRvIHRoaXMgdGhhbiBqdXN0IGJlaW5nIGtpbGxlZFxuIiwKKwkJICAobG9uZyljaWEpOworCisgIGNwdV9oYWx0KHByb2Nlc3NvciwgY2lhLCB3YXNfc2lnbmFsbGVkLCBzaWcpOworfQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0RVUAorI2RlZmluZSBkb191bml4X2R1cCAwCisjZWxzZQorc3RhdGljIHZvaWQKK2RvX3VuaXhfZHVwKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgICAgdW5zaWduZWQgY2FsbCwKKwkgICAgY29uc3QgaW50IGFyZzAsCisJICAgIGNwdSAqcHJvY2Vzc29yLAorCSAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgaW50IG9sZGQgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgaW50IHN0YXR1cyA9IGR1cChvbGRkKTsKKyAgaW50IGVyciA9IGVycm5vOworCisgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIlZCIsIG9sZGQpOworCisgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnIpOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9EVVAyCisjZGVmaW5lIGRvX3VuaXhfZHVwMiAwCisjZWxzZQorc3RhdGljIHZvaWQKK2RvX3VuaXhfZHVwMihvc19lbXVsX2RhdGEgKmVtdWwsCisJICAgICB1bnNpZ25lZCBjYWxsLAorCSAgICAgY29uc3QgaW50IGFyZzAsCisJICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBpbnQgb2xkZCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICBpbnQgbmV3ZCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisgIGludCBzdGF0dXMgPSBkdXAyKG9sZGQsIG5ld2QpOworICBpbnQgZXJyID0gZXJybm87CisKKyAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIiVkLCAlZCIsIG9sZGQsIG5ld2QpOworCisgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnIpOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9MU0VFSworI2RlZmluZSBkb191bml4X2xzZWVrIDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fdW5peF9sc2Vlayhvc19lbXVsX2RhdGEgKmVtdWwsCisJICAgICAgdW5zaWduZWQgY2FsbCwKKwkgICAgICBjb25zdCBpbnQgYXJnMCwKKwkgICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgaW50IGZpbGRlcyAgID0gKGludCljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgb2ZmX3Qgb2Zmc2V0ID0gKG9mZl90KWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisgIGludCB3aGVuY2UgICA9IChpbnQpY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsyXTsKKyAgb2ZmX3Qgc3RhdHVzOworCisgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIlZCAlbGQgJWQiLCBmaWxkZXMsIChsb25nKW9mZnNldCwgd2hlbmNlKTsKKworICBzdGF0dXMgPSBsc2VlayhmaWxkZXMsIG9mZnNldCwgd2hlbmNlKTsKKyAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCAoaW50KXN0YXR1cywgZXJybm8pOworfQorI2VuZGlmCisKKworI2lmICFkZWZpbmVkKEhBVkVfR0VUR0lEKSB8fCAhZGVmaW5lZChIQVZFX0dFVEVHSUQpCisjZGVmaW5lIGRvX3VuaXhfZ2V0Z2lkMiAwCisjZWxzZQorc3RhdGljIHZvaWQKK2RvX3VuaXhfZ2V0Z2lkMihvc19lbXVsX2RhdGEgKmVtdWwsCisJCXVuc2lnbmVkIGNhbGwsCisJCWNvbnN0IGludCBhcmcwLAorCQljcHUgKnByb2Nlc3NvciwKKwkJdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGdpZF90IGdpZCAgPSBnZXRnaWQoKTsKKyAgZ2lkX3QgZWdpZCA9IGdldGVnaWQoKTsKKyAgZW11bF93cml0ZTJfc3RhdHVzKHByb2Nlc3NvciwgKGludClnaWQsIChpbnQpZWdpZCwgZXJybm8pOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9HRVRHSUQKKyNkZWZpbmUgZG9fdW5peF9nZXRnaWQgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb191bml4X2dldGdpZChvc19lbXVsX2RhdGEgKmVtdWwsCisJICAgICAgIHVuc2lnbmVkIGNhbGwsCisJICAgICAgIGNvbnN0IGludCBhcmcwLAorCSAgICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGdpZF90IHN0YXR1cyA9IGdldGdpZCgpOworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIChpbnQpc3RhdHVzLCBlcnJubyk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0dFVEVHSUQKKyNkZWZpbmUgZG9fdW5peF9nZXRlZ2lkIDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fdW5peF9nZXRlZ2lkKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkJdW5zaWduZWQgY2FsbCwKKwkJY29uc3QgaW50IGFyZzAsCisJCWNwdSAqcHJvY2Vzc29yLAorCQl1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgZ2lkX3Qgc3RhdHVzID0gZ2V0ZWdpZCgpOworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIChpbnQpc3RhdHVzLCBlcnJubyk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1VNQVNLCisjZGVmaW5lIGRvX3VuaXhfdW1hc2sgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb191bml4X3VtYXNrKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgICAgICB1bnNpZ25lZCBjYWxsLAorCSAgICAgIGNvbnN0IGludCBhcmcwLAorCSAgICAgIGNwdSAqcHJvY2Vzc29yLAorCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBtb2RlX3QgbWFzayA9IChtb2RlX3QpY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07CisgIGludCBzdGF0dXMgPSB1bWFzayhtYXNrKTsKKworICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiMCVvIiwgKHVuc2lnbmVkIGludCltYXNrKTsKKworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9DSERJUgorI2RlZmluZSBkb191bml4X2NoZGlyIDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fdW5peF9jaGRpcihvc19lbXVsX2RhdGEgKmVtdWwsCisJICAgICAgdW5zaWduZWQgY2FsbCwKKwkgICAgICBjb25zdCBpbnQgYXJnMCwKKwkgICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgdW5zaWduZWRfd29yZCBwYXRoX2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgY2hhciBwYXRoX2J1ZltQQVRIX01BWF07CisgIGNoYXIgKnBhdGggPSBlbXVsX3JlYWRfc3RyaW5nKHBhdGhfYnVmLCBwYXRoX2FkZHIsIFBBVEhfTUFYLCBwcm9jZXNzb3IsIGNpYSk7CisgIGludCBzdGF0dXM7CisKKyAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIjB4JWx4IFslc10iLCAobG9uZylwYXRoX2FkZHIsIHBhdGgpOworCisgIHN0YXR1cyA9IGNoZGlyKHBhdGgpOworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9MSU5LCisjZGVmaW5lIGRvX3VuaXhfbGluayAwCisjZWxzZQorc3RhdGljIHZvaWQKK2RvX3VuaXhfbGluayhvc19lbXVsX2RhdGEgKmVtdWwsCisJICAgICB1bnNpZ25lZCBjYWxsLAorCSAgICAgY29uc3QgaW50IGFyZzAsCisJICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICB1bnNpZ25lZF93b3JkIHBhdGgxX2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgY2hhciBwYXRoMV9idWZbUEFUSF9NQVhdOworICBjaGFyICpwYXRoMSA9IGVtdWxfcmVhZF9zdHJpbmcocGF0aDFfYnVmLCBwYXRoMV9hZGRyLCBQQVRIX01BWCwgcHJvY2Vzc29yLCBjaWEpOworICB1bnNpZ25lZF93b3JkIHBhdGgyX2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOworICBjaGFyIHBhdGgyX2J1ZltQQVRIX01BWF07CisgIGNoYXIgKnBhdGgyID0gZW11bF9yZWFkX3N0cmluZyhwYXRoMl9idWYsIHBhdGgyX2FkZHIsIFBBVEhfTUFYLCBwcm9jZXNzb3IsIGNpYSk7CisgIGludCBzdGF0dXM7CisKKyAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIjB4JWx4IFslc10sIDB4JWx4IFslc10iLCAobG9uZylwYXRoMV9hZGRyLCBwYXRoMSwgKGxvbmcpcGF0aDJfYWRkciwgcGF0aDIpOworCisgIHN0YXR1cyA9IGxpbmsocGF0aDEsIHBhdGgyKTsKKyAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycm5vKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1lNTElOSworI2RlZmluZSBkb191bml4X3N5bWxpbmsgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb191bml4X3N5bWxpbmsob3NfZW11bF9kYXRhICplbXVsLAorCQl1bnNpZ25lZCBjYWxsLAorCQljb25zdCBpbnQgYXJnMCwKKwkJY3B1ICpwcm9jZXNzb3IsCisJCXVuc2lnbmVkX3dvcmQgY2lhKQoreworICB1bnNpZ25lZF93b3JkIHBhdGgxX2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgY2hhciBwYXRoMV9idWZbUEFUSF9NQVhdOworICBjaGFyICpwYXRoMSA9IGVtdWxfcmVhZF9zdHJpbmcocGF0aDFfYnVmLCBwYXRoMV9hZGRyLCBQQVRIX01BWCwgcHJvY2Vzc29yLCBjaWEpOworICB1bnNpZ25lZF93b3JkIHBhdGgyX2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOworICBjaGFyIHBhdGgyX2J1ZltQQVRIX01BWF07CisgIGNoYXIgKnBhdGgyID0gZW11bF9yZWFkX3N0cmluZyhwYXRoMl9idWYsIHBhdGgyX2FkZHIsIFBBVEhfTUFYLCBwcm9jZXNzb3IsIGNpYSk7CisgIGludCBzdGF0dXM7CisKKyAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIjB4JWx4IFslc10sIDB4JWx4IFslc10iLCAobG9uZylwYXRoMV9hZGRyLCBwYXRoMSwgKGxvbmcpcGF0aDJfYWRkciwgcGF0aDIpOworCisgIHN0YXR1cyA9IHN5bWxpbmsocGF0aDEsIHBhdGgyKTsKKyAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycm5vKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVU5MSU5LCisjZGVmaW5lIGRvX3VuaXhfdW5saW5rIDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fdW5peF91bmxpbmsob3NfZW11bF9kYXRhICplbXVsLAorCSAgICAgICB1bnNpZ25lZCBjYWxsLAorCSAgICAgICBjb25zdCBpbnQgYXJnMCwKKwkgICAgICAgY3B1ICpwcm9jZXNzb3IsCisJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICB1bnNpZ25lZF93b3JkIHBhdGhfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICBjaGFyIHBhdGhfYnVmW1BBVEhfTUFYXTsKKyAgY2hhciAqcGF0aCA9IGVtdWxfcmVhZF9zdHJpbmcocGF0aF9idWYsIHBhdGhfYWRkciwgUEFUSF9NQVgsIHByb2Nlc3NvciwgY2lhKTsKKyAgaW50IHN0YXR1czsKKworICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiMHglbHggWyVzXSIsIChsb25nKXBhdGhfYWRkciwgcGF0aCk7CisKKyAgc3RhdHVzID0gdW5saW5rKHBhdGgpOworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9NS0RJUgorI2RlZmluZSBkb191bml4X21rZGlyIDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fdW5peF9ta2Rpcihvc19lbXVsX2RhdGEgKmVtdWwsCisJICAgICAgdW5zaWduZWQgY2FsbCwKKwkgICAgICBjb25zdCBpbnQgYXJnMCwKKwkgICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgdW5zaWduZWRfd29yZCBwYXRoX2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgY2hhciBwYXRoX2J1ZltQQVRIX01BWF07CisgIGNoYXIgKnBhdGggPSBlbXVsX3JlYWRfc3RyaW5nKHBhdGhfYnVmLCBwYXRoX2FkZHIsIFBBVEhfTUFYLCBwcm9jZXNzb3IsIGNpYSk7CisgIGludCBtb2RlID0gKGludCljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOworICBpbnQgc3RhdHVzOworCisgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIweCVseCBbJXNdLCAwJTNvIiwgKGxvbmcpcGF0aF9hZGRyLCBwYXRoLCBtb2RlKTsKKworICBzdGF0dXMgPSBta2RpcihwYXRoLCBtb2RlKTsKKyAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycm5vKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfUk1ESVIKKyNkZWZpbmUgZG9fdW5peF9ybWRpciAwCisjZWxzZQorc3RhdGljIHZvaWQKK2RvX3VuaXhfcm1kaXIob3NfZW11bF9kYXRhICplbXVsLAorCSAgICAgIHVuc2lnbmVkIGNhbGwsCisJICAgICAgY29uc3QgaW50IGFyZzAsCisJICAgICAgY3B1ICpwcm9jZXNzb3IsCisJICAgICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHVuc2lnbmVkX3dvcmQgcGF0aF9hZGRyID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07CisgIGNoYXIgcGF0aF9idWZbUEFUSF9NQVhdOworICBjaGFyICpwYXRoID0gZW11bF9yZWFkX3N0cmluZyhwYXRoX2J1ZiwgcGF0aF9hZGRyLCBQQVRIX01BWCwgcHJvY2Vzc29yLCBjaWEpOworICBpbnQgc3RhdHVzOworCisgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIweCVseCBbJXNdIiwgKGxvbmcpcGF0aF9hZGRyLCBwYXRoKTsKKworICBzdGF0dXMgPSBybWRpcihwYXRoKTsKKyAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycm5vKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVElNRQorI2RlZmluZSBkb191bml4X3RpbWUgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb191bml4X3RpbWUob3NfZW11bF9kYXRhICplbXVsLAorCSAgICAgdW5zaWduZWQgY2FsbCwKKwkgICAgIGNvbnN0IGludCBhcmcwLAorCSAgICAgY3B1ICpwcm9jZXNzb3IsCisJICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgdW5zaWduZWRfd29yZCB0cCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICB0aW1lX3Qgbm93ID0gdGltZSAoKHRpbWVfdCAqKTApOworICB1bnNpZ25lZF93b3JkIHN0YXR1cyA9IEgyVF80KG5vdyk7CisKKyAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIjB4JWx4IiwgKGxvbmcpdHApOworCisgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3NvciwgKGludClzdGF0dXMsIGVycm5vKTsKKworICBpZiAodHApCisgICAgZW11bF93cml0ZV9idWZmZXIoJnN0YXR1cywgdHAsIHNpemVvZihzdGF0dXMpLCBwcm9jZXNzb3IsIGNpYSk7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKSB8fCAhZGVmaW5lZChIQVZFX1NZU19USU1FX0gpCisjZGVmaW5lIGRvX3VuaXhfZ2V0dGltZW9mZGF5IDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fdW5peF9nZXR0aW1lb2ZkYXkob3NfZW11bF9kYXRhICplbXVsLAorCQkgICAgIHVuc2lnbmVkIGNhbGwsCisJCSAgICAgY29uc3QgaW50IGFyZzAsCisJCSAgICAgY3B1ICpwcm9jZXNzb3IsCisJCSAgICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHVuc2lnbmVkX3dvcmQgdHYgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgdW5zaWduZWRfd29yZCB0eiA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisgIHN0cnVjdCB1bml4X3RpbWV2YWwgdGFyZ2V0X3RpbWV2YWw7CisgIHN0cnVjdCB0aW1ldmFsIGhvc3RfdGltZXZhbDsKKyAgc3RydWN0IHVuaXhfdGltZXpvbmUgdGFyZ2V0X3RpbWV6b25lOworICBzdHJ1Y3QgdGltZXpvbmUgaG9zdF90aW1lem9uZTsKKyAgaW50IHN0YXR1czsKKworICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiMHglbHgsIDB4JWx4IiwgKGxvbmcpdHYsIChsb25nKXR6KTsKKworICAvKiBKdXN0IGluIGNhc2UgdGhlIHN5c3RlbSBkb2Vzbid0IHNldCB0aGUgdGltZXpvbmUgc3RydWN0dXJlICovCisgIGhvc3RfdGltZXpvbmUudHpfbWludXRlc3dlc3QgPSAwOworICBob3N0X3RpbWV6b25lLnR6X2RzdHRpbWUgPSAwOworCisgIHN0YXR1cyA9IGdldHRpbWVvZmRheSgmaG9zdF90aW1ldmFsLCAmaG9zdF90aW1lem9uZSk7CisgIGlmIChzdGF0dXMgPj0gMCkgeworICAgIGlmICh0dikgeworICAgICAgdGFyZ2V0X3RpbWV2YWwudHZfc2VjID0gSDJUXzQoaG9zdF90aW1ldmFsLnR2X3NlYyk7CisgICAgICB0YXJnZXRfdGltZXZhbC50dl91c2VjID0gSDJUXzQoaG9zdF90aW1ldmFsLnR2X3VzZWMpOworICAgICAgZW11bF93cml0ZV9idWZmZXIoKHZvaWQgKikgJnRhcmdldF90aW1ldmFsLCB0diwgc2l6ZW9mKHRhcmdldF90aW1ldmFsKSwgcHJvY2Vzc29yLCBjaWEpOworICAgIH0KKworICAgIGlmICh0eikgeworICAgICAgdGFyZ2V0X3RpbWV6b25lLnR6X21pbnV0ZXN3ZXN0ID0gSDJUXzQoaG9zdF90aW1lem9uZS50el9taW51dGVzd2VzdCk7CisgICAgICB0YXJnZXRfdGltZXpvbmUudHpfZHN0dGltZSA9IEgyVF80KGhvc3RfdGltZXpvbmUudHpfZHN0dGltZSk7CisgICAgICBlbXVsX3dyaXRlX2J1ZmZlcigodm9pZCAqKSAmdGFyZ2V0X3RpbWV6b25lLCB0diwgc2l6ZW9mKHRhcmdldF90aW1lem9uZSksIHByb2Nlc3NvciwgY2lhKTsKKyAgICB9CisgIH0KKyAgICAKKyAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCAoaW50KXN0YXR1cywgZXJybm8pOworfQorI2VuZGlmCisKKworI2lmbmRlZiBIQVZFX0dFVFJVU0FHRQorI2RlZmluZSBkb191bml4X2dldHJ1c2FnZSAwCisjZWxzZQorc3RhdGljIHZvaWQKK2RvX3VuaXhfZ2V0cnVzYWdlKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkJICB1bnNpZ25lZCBjYWxsLAorCQkgIGNvbnN0IGludCBhcmcwLAorCQkgIGNwdSAqcHJvY2Vzc29yLAorCQkgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBzaWduZWRfd29yZCB3aG8gPSAoc2lnbmVkX3dvcmQpY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMF07CisgIHVuc2lnbmVkX3dvcmQgdXNhZ2UgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdOworICBzdHJ1Y3QgcnVzYWdlIGhvc3RfcnVzYWdlLCBob3N0X3J1c2FnZTI7CisgIHN0cnVjdCB1bml4X3J1c2FnZSB0YXJnZXRfcnVzYWdlOworICBpbnQgc3RhdHVzOworCisgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIlbGQsIDB4JWx4IiwgKGxvbmcpd2hvLCAobG9uZyl1c2FnZSk7CisKKyAgc3dpdGNoICh3aG8pIHsKKyAgZGVmYXVsdDoKKyAgICBzdGF0dXMgPSAtMTsKKyAgICBlcnJubyA9IEVJTlZBTDsKKyAgICBicmVhazsKKworICBjYXNlIFVOSVhfUlVTQUdFX1NFTEY6CisgICAgc3RhdHVzID0gZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmaG9zdF9ydXNhZ2UpOworICAgIGJyZWFrOworCisgIGNhc2UgVU5JWF9SVVNBR0VfQ0hJTERSRU46CisgICAgc3RhdHVzID0gZ2V0cnVzYWdlKFJVU0FHRV9DSElMRFJFTiwgJmhvc3RfcnVzYWdlKTsKKyAgICBicmVhazsKKworICBjYXNlIFVOSVhfUlVTQUdFX0JPVEg6CisgICAgc3RhdHVzID0gZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmaG9zdF9ydXNhZ2UpOworICAgIGlmIChzdGF0dXMgPj0gMCkgeworICAgICAgc3RhdHVzID0gZ2V0cnVzYWdlKFJVU0FHRV9DSElMRFJFTiwgJmhvc3RfcnVzYWdlMik7CisgICAgICBpZiAoc3RhdHVzID49IDApIHsKKwlob3N0X3J1c2FnZS5ydV91dGltZS50dl9zZWMgKz0gaG9zdF9ydXNhZ2UyLnJ1X3V0aW1lLnR2X3NlYzsKKwlob3N0X3J1c2FnZS5ydV91dGltZS50dl91c2VjICs9IGhvc3RfcnVzYWdlMi5ydV91dGltZS50dl91c2VjOworCWhvc3RfcnVzYWdlLnJ1X3N0aW1lLnR2X3NlYyArPSBob3N0X3J1c2FnZTIucnVfc3RpbWUudHZfc2VjOworCWhvc3RfcnVzYWdlLnJ1X3N0aW1lLnR2X3VzZWMgKz0gaG9zdF9ydXNhZ2UyLnJ1X3N0aW1lLnR2X3VzZWM7CisJaG9zdF9ydXNhZ2UucnVfbWF4cnNzICs9IGhvc3RfcnVzYWdlMi5ydV9tYXhyc3M7CisJaG9zdF9ydXNhZ2UucnVfaXhyc3MgKz0gaG9zdF9ydXNhZ2UyLnJ1X2l4cnNzOworCWhvc3RfcnVzYWdlLnJ1X2lkcnNzICs9IGhvc3RfcnVzYWdlMi5ydV9pZHJzczsKKwlob3N0X3J1c2FnZS5ydV9pc3JzcyArPSBob3N0X3J1c2FnZTIucnVfaXNyc3M7CisJaG9zdF9ydXNhZ2UucnVfbWluZmx0ICs9IGhvc3RfcnVzYWdlMi5ydV9taW5mbHQ7CisJaG9zdF9ydXNhZ2UucnVfbWFqZmx0ICs9IGhvc3RfcnVzYWdlMi5ydV9tYWpmbHQ7CisJaG9zdF9ydXNhZ2UucnVfbnN3YXAgKz0gaG9zdF9ydXNhZ2UyLnJ1X25zd2FwOworCWhvc3RfcnVzYWdlLnJ1X2luYmxvY2sgKz0gaG9zdF9ydXNhZ2UyLnJ1X2luYmxvY2s7CisJaG9zdF9ydXNhZ2UucnVfb3VibG9jayArPSBob3N0X3J1c2FnZTIucnVfb3VibG9jazsKKwlob3N0X3J1c2FnZS5ydV9tc2dzbmQgKz0gaG9zdF9ydXNhZ2UyLnJ1X21zZ3NuZDsKKwlob3N0X3J1c2FnZS5ydV9tc2dyY3YgKz0gaG9zdF9ydXNhZ2UyLnJ1X21zZ3JjdjsKKwlob3N0X3J1c2FnZS5ydV9uc2lnbmFscyArPSBob3N0X3J1c2FnZTIucnVfbnNpZ25hbHM7CisJaG9zdF9ydXNhZ2UucnVfbnZjc3cgKz0gaG9zdF9ydXNhZ2UyLnJ1X252Y3N3OworCWhvc3RfcnVzYWdlLnJ1X25pdmNzdyArPSBob3N0X3J1c2FnZTIucnVfbml2Y3N3OworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChzdGF0dXMgPj0gMCkgeworICAgIHRhcmdldF9ydXNhZ2UucnVfdXRpbWUudHZfc2VjID0gSDJUXzQoaG9zdF9ydXNhZ2UyLnJ1X3V0aW1lLnR2X3NlYyk7CisgICAgdGFyZ2V0X3J1c2FnZS5ydV91dGltZS50dl91c2VjID0gSDJUXzQoaG9zdF9ydXNhZ2UyLnJ1X3V0aW1lLnR2X3VzZWMpOworICAgIHRhcmdldF9ydXNhZ2UucnVfc3RpbWUudHZfc2VjID0gSDJUXzQoaG9zdF9ydXNhZ2UyLnJ1X3N0aW1lLnR2X3NlYyk7CisgICAgdGFyZ2V0X3J1c2FnZS5ydV9zdGltZS50dl91c2VjID0gSDJUXzQoaG9zdF9ydXNhZ2UyLnJ1X3N0aW1lLnR2X3VzZWMpOworICAgIHRhcmdldF9ydXNhZ2UucnVfbWF4cnNzID0gSDJUXzQoaG9zdF9ydXNhZ2UyLnJ1X21heHJzcyk7CisgICAgdGFyZ2V0X3J1c2FnZS5ydV9peHJzcyA9IEgyVF80KGhvc3RfcnVzYWdlMi5ydV9peHJzcyk7CisgICAgdGFyZ2V0X3J1c2FnZS5ydV9pZHJzcyA9IEgyVF80KGhvc3RfcnVzYWdlMi5ydV9pZHJzcyk7CisgICAgdGFyZ2V0X3J1c2FnZS5ydV9pc3JzcyA9IEgyVF80KGhvc3RfcnVzYWdlMi5ydV9pc3Jzcyk7CisgICAgdGFyZ2V0X3J1c2FnZS5ydV9taW5mbHQgPSBIMlRfNChob3N0X3J1c2FnZTIucnVfbWluZmx0KTsKKyAgICB0YXJnZXRfcnVzYWdlLnJ1X21hamZsdCA9IEgyVF80KGhvc3RfcnVzYWdlMi5ydV9tYWpmbHQpOworICAgIHRhcmdldF9ydXNhZ2UucnVfbnN3YXAgPSBIMlRfNChob3N0X3J1c2FnZTIucnVfbnN3YXApOworICAgIHRhcmdldF9ydXNhZ2UucnVfaW5ibG9jayA9IEgyVF80KGhvc3RfcnVzYWdlMi5ydV9pbmJsb2NrKTsKKyAgICB0YXJnZXRfcnVzYWdlLnJ1X291YmxvY2sgPSBIMlRfNChob3N0X3J1c2FnZTIucnVfb3VibG9jayk7CisgICAgdGFyZ2V0X3J1c2FnZS5ydV9tc2dzbmQgPSBIMlRfNChob3N0X3J1c2FnZTIucnVfbXNnc25kKTsKKyAgICB0YXJnZXRfcnVzYWdlLnJ1X21zZ3JjdiA9IEgyVF80KGhvc3RfcnVzYWdlMi5ydV9tc2dyY3YpOworICAgIHRhcmdldF9ydXNhZ2UucnVfbnNpZ25hbHMgPSBIMlRfNChob3N0X3J1c2FnZTIucnVfbnNpZ25hbHMpOworICAgIHRhcmdldF9ydXNhZ2UucnVfbnZjc3cgPSBIMlRfNChob3N0X3J1c2FnZTIucnVfbnZjc3cpOworICAgIHRhcmdldF9ydXNhZ2UucnVfbml2Y3N3ID0gSDJUXzQoaG9zdF9ydXNhZ2UyLnJ1X25pdmNzdyk7CisgICAgZW11bF93cml0ZV9idWZmZXIoKHZvaWQgKikgJnRhcmdldF9ydXNhZ2UsIHVzYWdlLCBzaXplb2YodGFyZ2V0X3J1c2FnZSksIHByb2Nlc3NvciwgY2lhKTsKKyAgfQorICAgIAorICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOworfQorI2VuZGlmCisKKworc3RhdGljIHZvaWQKK2RvX3VuaXhfbm9wKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgICAgdW5zaWduZWQgY2FsbCwKKwkgICAgY29uc3QgaW50IGFyZzAsCisJICAgIGNwdSAqcHJvY2Vzc29yLAorCSAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIjB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4IiwKKwkJICAgICAobG9uZyljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXSwKKwkJICAgICAobG9uZyljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzFdLAorCQkgICAgIChsb25nKWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMl0sCisJCSAgICAgKGxvbmcpY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCszXSwKKwkJICAgICAobG9uZyljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzRdLAorCQkgICAgIChsb25nKWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArNV0pOworCisgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3NvciwgMCwgZXJybm8pOworfQorCisMCisvKiBDb21tb24gY29kZSBmb3IgaW5pdGlhbGl6aW5nIHRoZSBzeXN0ZW0gY2FsbCBzdHVmZiAqLworCitzdGF0aWMgb3NfZW11bF9kYXRhICoKK2VtdWxfdW5peF9jcmVhdGUoZGV2aWNlICpyb290LAorCQkgYmZkICppbWFnZSwKKwkJIGNvbnN0IGNoYXIgKm5hbWUsCisJCSBlbXVsX3N5c2NhbGwgKnN5c2NhbGwpCit7CisgIHVuc2lnbmVkX3dvcmQgdG9wX29mX3N0YWNrOworICB1bnNpZ25lZCBzdGFja19zaXplOworICBpbnQgZWxmX2JpbmFyeTsKKyAgb3NfZW11bF9kYXRhICpkYXRhOworICBkZXZpY2UgKnZtOworCisgIC8qIG1lcmdlIGFueSBlbXVsYXRpb24gc3BlY2lmaWMgZW50cmllcyBpbnRvIHRoZSBkZXZpY2UgdHJlZSAqLworCisgIC8qIGVzdGFibGlzaCBhIGZldyBkZWZhdWx0cyAqLworICBpZiAoaW1hZ2UtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikgeworICAgIGVsZl9iaW5hcnkgPSAxOworICAgIHRvcF9vZl9zdGFjayA9IDB4ZTAwMDAwMDA7CisgICAgc3RhY2tfc2l6ZSA9ICAgMHgwMDEwMDAwMDsKKyAgfQorICBlbHNlIHsKKyAgICBlbGZfYmluYXJ5ID0gMDsKKyAgICB0b3Bfb2Zfc3RhY2sgPSAweDIwMDAwMDAwOworICAgIHN0YWNrX3NpemUgPSAgIDB4MDAxMDAwMDA7CisgIH0KKworICAvKiBvcHRpb25zICovCisgIGVtdWxfYWRkX3RyZWVfb3B0aW9ucyhyb290LCBpbWFnZSwgbmFtZSwKKwkJCShXSVRIX0VOVklST05NRU5UID09IFVTRVJfRU5WSVJPTk1FTlQKKwkJCSA/ICJ1c2VyIiA6ICJ2aXJ0dWFsIiksCisJCQkwIC8qb2VhLWludGVycnVwdC1wcmVmaXgqLyk7CisKKyAgLyogdmlydHVhbCBtZW1vcnkgLSBoYW5kbGVzIGdyb3d0aCBvZiBzdGFjay9oZWFwICovCisgIHZtID0gdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL3ZtQDB4JWx4IiwKKwkJICAodW5zaWduZWQgbG9uZykodG9wX29mX3N0YWNrIC0gc3RhY2tfc2l6ZSkpOworICB0cmVlX3BhcnNlKHZtLCAiLi9zdGFjay1iYXNlIDB4JWx4IiwKKwkgICAgICh1bnNpZ25lZCBsb25nKSh0b3Bfb2Zfc3RhY2sgLSBzdGFja19zaXplKSk7CisgIHRyZWVfcGFyc2Uodm0sICIuL25yLWJ5dGVzIDB4JXgiLCBzdGFja19zaXplKTsKKworICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vdm0vbWFwLWJpbmFyeS9maWxlLW5hbWUgJXMiLAorCSAgICAgYmZkX2dldF9maWxlbmFtZShpbWFnZSkpOworCisgIC8qIGZpbmlzaCB0aGUgaW5pdCAqLworICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vaW5pdC9yZWdpc3Rlci9wYyAweCVseCIsCisJICAgICAodW5zaWduZWQgbG9uZyliZmRfZ2V0X3N0YXJ0X2FkZHJlc3MoaW1hZ2UpKTsKKyAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvc3AgMHglbHgiLAorCSAgICAgKHVuc2lnbmVkIGxvbmcpdG9wX29mX3N0YWNrKTsKKyAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvbXNyIDB4JXgiLAorCSAgICAgKCh0cmVlX2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eShyb290LCAiL29wdGlvbnMvbGl0dGxlLWVuZGlhbj8iKQorCSAgICAgICA/IG1zcl9saXR0bGVfZW5kaWFuX21vZGUKKwkgICAgICAgOiAwKQorCSAgICAgIHwgKHRyZWVfZmluZF9ib29sZWFuX3Byb3BlcnR5KHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy9mbG9hdGluZy1wb2ludD8iKQorCQkgPyAobXNyX2Zsb2F0aW5nX3BvaW50X2F2YWlsYWJsZQorCQkgICAgfCBtc3JfZmxvYXRpbmdfcG9pbnRfZXhjZXB0aW9uX21vZGVfMAorCQkgICAgfCBtc3JfZmxvYXRpbmdfcG9pbnRfZXhjZXB0aW9uX21vZGVfMSkKKwkJIDogMCkpKTsKKyAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL2luaXQvc3RhY2svc3RhY2stdHlwZSAlcyIsCisJICAgICAoZWxmX2JpbmFyeSA/ICJwcGMtZWxmIiA6ICJwcGMteGNvZmYiKSk7CisKKyAgLyogZmluYWxseSBvdXIgZW11bGF0aW9uIGRhdGEgKi8KKyAgZGF0YSA9IFpBTExPQyhvc19lbXVsX2RhdGEpOworICBkYXRhLT52bSA9IHZtOworICBkYXRhLT5zeXNjYWxscyA9IHN5c2NhbGw7CisgIHJldHVybiBkYXRhOworfQorCisMCisvKiBFTVVMQVRJT04KKworICAgU29sYXJpcyAtIEVtdWxhdGlvbiBvZiB1c2VyIHByb2dyYW1zIGZvciBTb2xhcmlzL1BQQworCisgICBERVNDUklQVElPTgorCisgICAqLworCisKKy8qIFNvbGFyaXMgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gKi8KKwordHlwZWRlZglzaWduZWQzMglzb2xhcmlzX3VpZF90OwordHlwZWRlZglzaWduZWQzMglzb2xhcmlzX2dpZF90OwordHlwZWRlZiBzaWduZWQzMglzb2xhcmlzX29mZl90OwordHlwZWRlZiBzaWduZWQzMglzb2xhcmlzX3BpZF90OwordHlwZWRlZiBzaWduZWQzMglzb2xhcmlzX3RpbWVfdDsKK3R5cGVkZWYgdW5zaWduZWQzMglzb2xhcmlzX2Rldl90OwordHlwZWRlZiB1bnNpZ25lZDMyCXNvbGFyaXNfaW5vX3Q7Cit0eXBlZGVmIHVuc2lnbmVkMzIJc29sYXJpc19tb2RlX3Q7Cit0eXBlZGVmCXVuc2lnbmVkMzIJc29sYXJpc19ubGlua190OworCisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICisjZGVmaW5lCVNPTEFSSVNfU1RfRlNUWVBTWiAxNgkJLyogYXJyYXkgc2l6ZSBmb3IgZmlsZSBzeXN0ZW0gdHlwZSBuYW1lICovCisKK3N0cnVjdCBzb2xhcmlzX3N0YXQgeworICBzb2xhcmlzX2Rldl90CQlzdF9kZXY7CisgIHNpZ25lZDMyCQlzdF9wYWQxWzNdOwkvKiByZXNlcnZlZCBmb3IgbmV0d29yayBpZCAqLworICBzb2xhcmlzX2lub190CQlzdF9pbm87CisgIHNvbGFyaXNfbW9kZV90CXN0X21vZGU7CisgIHNvbGFyaXNfbmxpbmtfdCAJc3Rfbmxpbms7CisgIHNvbGFyaXNfdWlkX3QgCXN0X3VpZDsKKyAgc29sYXJpc19naWRfdCAJc3RfZ2lkOworICBzb2xhcmlzX2Rldl90CQlzdF9yZGV2OworICBzaWduZWQzMgkJc3RfcGFkMlsyXTsKKyAgc29sYXJpc19vZmZfdAkJc3Rfc2l6ZTsKKyAgc2lnbmVkMzIJCXN0X3BhZDM7CS8qIGZ1dHVyZSBvZmZfdCBleHBhbnNpb24gKi8KKyAgc3RydWN0IHVuaXhfdGltZXZhbAlzdF9hdGltOworICBzdHJ1Y3QgdW5peF90aW1ldmFsCXN0X210aW07CisgIHN0cnVjdCB1bml4X3RpbWV2YWwJc3RfY3RpbTsKKyAgc2lnbmVkMzIJCXN0X2Jsa3NpemU7CisgIHNpZ25lZDMyCQlzdF9ibG9ja3M7CisgIGNoYXIJCQlzdF9mc3R5cGVbU09MQVJJU19TVF9GU1RZUFNaXTsKKyAgc2lnbmVkMzIJCXN0X3BhZDRbOF07CS8qIGV4cGFuc2lvbiBhcmVhICovCit9OworCisvKiBDb252ZXJ0IGZyb20gaG9zdCBzdGF0IHN0cnVjdHVyZSB0byBzb2xhcmlzIHN0YXQgc3RydWN0dXJlICovCitTVEFUSUNfSU5MSU5FX0VNVUxfVU5JWCB2b2lkCitjb252ZXJ0X3RvX3NvbGFyaXNfc3RhdCh1bnNpZ25lZF93b3JkIGFkZHIsCisJCQlzdHJ1Y3Qgc3RhdCAqaG9zdCwKKwkJCWNwdSAqcHJvY2Vzc29yLAorCQkJdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHN0cnVjdCBzb2xhcmlzX3N0YXQgdGFyZ2V0OworICBpbnQgaTsKKworICB0YXJnZXQuc3RfZGV2ICAgPSBIMlRfNChob3N0LT5zdF9kZXYpOworICB0YXJnZXQuc3RfaW5vICAgPSBIMlRfNChob3N0LT5zdF9pbm8pOworICB0YXJnZXQuc3RfbW9kZSAgPSBIMlRfNChob3N0LT5zdF9tb2RlKTsKKyAgdGFyZ2V0LnN0X25saW5rID0gSDJUXzQoaG9zdC0+c3RfbmxpbmspOworICB0YXJnZXQuc3RfdWlkICAgPSBIMlRfNChob3N0LT5zdF91aWQpOworICB0YXJnZXQuc3RfZ2lkICAgPSBIMlRfNChob3N0LT5zdF9naWQpOworICB0YXJnZXQuc3Rfc2l6ZSAgPSBIMlRfNChob3N0LT5zdF9zaXplKTsKKworI2lmZGVmIEhBVkVfU1RfUkRFVgorICB0YXJnZXQuc3RfcmRldiAgPSBIMlRfNChob3N0LT5zdF9yZGV2KTsKKyNlbHNlCisgIHRhcmdldC5zdF9yZGV2ICA9IDA7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RfQkxLU0laRQorICB0YXJnZXQuc3RfYmxrc2l6ZSA9IEgyVF80KGhvc3QtPnN0X2Jsa3NpemUpOworI2Vsc2UKKyAgdGFyZ2V0LnN0X2Jsa3NpemUgPSAwOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUX0JMT0NLUworICB0YXJnZXQuc3RfYmxvY2tzICA9IEgyVF80KGhvc3QtPnN0X2Jsb2Nrcyk7CisjZWxzZQorICB0YXJnZXQuc3RfYmxvY2tzICA9IDA7CisjZW5kaWYKKworICB0YXJnZXQuc3RfYXRpbS50dl9zZWMgID0gSDJUXzQoaG9zdC0+c3RfYXRpbWUpOworICB0YXJnZXQuc3RfYXRpbS50dl91c2VjID0gMDsKKworICB0YXJnZXQuc3RfY3RpbS50dl9zZWMgID0gSDJUXzQoaG9zdC0+c3RfY3RpbWUpOworICB0YXJnZXQuc3RfY3RpbS50dl91c2VjID0gMDsKKworICB0YXJnZXQuc3RfbXRpbS50dl9zZWMgID0gSDJUXzQoaG9zdC0+c3RfbXRpbWUpOworICB0YXJnZXQuc3RfbXRpbS50dl91c2VjID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mICh0YXJnZXQuc3RfcGFkMSkgLyBzaXplb2YgKHRhcmdldC5zdF9wYWQxWzBdKTsgaSsrKQorICAgIHRhcmdldC5zdF9wYWQxW2ldID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mICh0YXJnZXQuc3RfcGFkMikgLyBzaXplb2YgKHRhcmdldC5zdF9wYWQyWzBdKTsgaSsrKQorICAgIHRhcmdldC5zdF9wYWQyW2ldID0gMDsKKworICB0YXJnZXQuc3RfcGFkMyA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAodGFyZ2V0LnN0X3BhZDQpIC8gc2l6ZW9mICh0YXJnZXQuc3RfcGFkNFswXSk7IGkrKykKKyAgICB0YXJnZXQuc3RfcGFkNFtpXSA9IDA7CisKKyAgLyogRm9yIG5vdywganVzdCBwdW50IGFuZCBhbHdheXMgc2F5IGl0IGlzIGEgdWZzIGZpbGUgKi8KKyAgc3RyY3B5ICh0YXJnZXQuc3RfZnN0eXBlLCAidWZzIik7CisKKyAgZW11bF93cml0ZV9idWZmZXIoJnRhcmdldCwgYWRkciwgc2l6ZW9mKHRhcmdldCksIHByb2Nlc3NvciwgY2lhKTsKK30KKyNlbmRpZiAvKiBIQVZFX1NZU19TVEFUX0ggKi8KKworI2lmbmRlZiBIQVZFX1NUQVQKKyNkZWZpbmUgZG9fc29sYXJpc19zdGF0IDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fc29sYXJpc19zdGF0KG9zX2VtdWxfZGF0YSAqZW11bCwKKwkJdW5zaWduZWQgY2FsbCwKKwkJY29uc3QgaW50IGFyZzAsCisJCWNwdSAqcHJvY2Vzc29yLAorCQl1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgdW5zaWduZWRfd29yZCBwYXRoX2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgdW5zaWduZWRfd29yZCBzdGF0X3BrdCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisgIGNoYXIgcGF0aF9idWZbUEFUSF9NQVhdOworICBzdHJ1Y3Qgc3RhdCBidWY7CisgIGNoYXIgKnBhdGggPSBlbXVsX3JlYWRfc3RyaW5nKHBhdGhfYnVmLCBwYXRoX2FkZHIsIFBBVEhfTUFYLCBwcm9jZXNzb3IsIGNpYSk7CisgIGludCBzdGF0dXM7CisKKyAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIjB4JWx4IFslc10sIDB4JWx4IiwgKGxvbmcpcGF0aF9hZGRyLCBwYXRoLCAobG9uZylzdGF0X3BrdCk7CisKKyAgc3RhdHVzID0gc3RhdCAocGF0aCwgJmJ1Zik7CisgIGlmIChzdGF0dXMgPT0gMCkKKyAgICBjb252ZXJ0X3RvX3NvbGFyaXNfc3RhdCAoc3RhdF9wa3QsICZidWYsIHByb2Nlc3NvciwgY2lhKTsKKworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9MU1RBVAorI2RlZmluZSBkb19zb2xhcmlzX2xzdGF0IDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fc29sYXJpc19sc3RhdChvc19lbXVsX2RhdGEgKmVtdWwsCisJCSB1bnNpZ25lZCBjYWxsLAorCQkgY29uc3QgaW50IGFyZzAsCisJCSBjcHUgKnByb2Nlc3NvciwKKwkJIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICB1bnNpZ25lZF93b3JkIHBhdGhfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICB1bnNpZ25lZF93b3JkIHN0YXRfcGt0ID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKKyAgY2hhciBwYXRoX2J1ZltQQVRIX01BWF07CisgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgY2hhciAqcGF0aCA9IGVtdWxfcmVhZF9zdHJpbmcocGF0aF9idWYsIHBhdGhfYWRkciwgUEFUSF9NQVgsIHByb2Nlc3NvciwgY2lhKTsKKyAgaW50IHN0YXR1czsKKworICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiMHglbHggWyVzXSwgMHglbHgiLCAobG9uZylwYXRoX2FkZHIsIHBhdGgsIChsb25nKXN0YXRfcGt0KTsKKworICBzdGF0dXMgPSBsc3RhdCAocGF0aCwgJmJ1Zik7CisgIGlmIChzdGF0dXMgPT0gMCkKKyAgICBjb252ZXJ0X3RvX3NvbGFyaXNfc3RhdCAoc3RhdF9wa3QsICZidWYsIHByb2Nlc3NvciwgY2lhKTsKKworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9GU1RBVAorI2RlZmluZSBkb19zb2xhcmlzX2ZzdGF0IDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fc29sYXJpc19mc3RhdChvc19lbXVsX2RhdGEgKmVtdWwsCisJCSB1bnNpZ25lZCBjYWxsLAorCQkgY29uc3QgaW50IGFyZzAsCisJCSBjcHUgKnByb2Nlc3NvciwKKwkJIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBpbnQgZmlsZGVzID0gKGludCljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgdW5zaWduZWRfd29yZCBzdGF0X3BrdCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgaW50IHN0YXR1czsKKworICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiJWQsIDB4JWx4IiwgZmlsZGVzLCAobG9uZylzdGF0X3BrdCk7CisKKyAgc3RhdHVzID0gZnN0YXQgKGZpbGRlcywgJmJ1Zik7CisgIGlmIChzdGF0dXMgPT0gMCkKKyAgICBjb252ZXJ0X3RvX3NvbGFyaXNfc3RhdCAoc3RhdF9wa3QsICZidWYsIHByb2Nlc3NvciwgY2lhKTsKKworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhBVkVfVEVSTUlPX1NUUlVDVFVSRSkgfHwgZGVmaW5lZChIQVZFX1RFUk1JT1NfU1RSVUNUVVJFKQorI2RlZmluZQlTT0xBUklTX1RJT0MJICAoJ1QnPDw4KQorI2RlZmluZSBTT0xBUklTX05DQwkgIDgKKyNkZWZpbmUgU09MQVJJU19OQ0NTCSAgMTkKKworI2RlZmluZQlTT0xBUklTX1ZJTlRSCSAgMAorI2RlZmluZQlTT0xBUklTX1ZRVUlUCSAgMQorI2RlZmluZQlTT0xBUklTX1ZFUkFTRQkgIDIKKyNkZWZpbmUJU09MQVJJU19WS0lMTAkgIDMKKyNkZWZpbmUJU09MQVJJU19WRU9GCSAgNAorI2RlZmluZQlTT0xBUklTX1ZFT0wJICA1CisjZGVmaW5lCVNPTEFSSVNfVkVPTDIJICA2CisjZGVmaW5lCVNPTEFSSVNfVlNXVENICSAgNworI2RlZmluZQlTT0xBUklTX1ZTVEFSVAkgIDgKKyNkZWZpbmUJU09MQVJJU19WU1RPUAkgIDkKKyNkZWZpbmUJU09MQVJJU19WU1VTUAkgMTAKKyNkZWZpbmUJU09MQVJJU19WRFNVU1AJIDExCisjZGVmaW5lCVNPTEFSSVNfVlJFUFJJTlQgMTIKKyNkZWZpbmUJU09MQVJJU19WRElTQ0FSRCAxMworI2RlZmluZQlTT0xBUklTX1ZXRVJBU0UJIDE0CisjZGVmaW5lCVNPTEFSSVNfVkxORVhUCSAxNQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhBVkVfVEVSTUlPX1NUUlVDVFVSRSkgfHwgZGVmaW5lZChIQVZFX1RFUk1JT1NfU1RSVUNUVVJFKQorLyogQ29udmVydCB0by9mcm9tIGhvc3QgdGVybWlvIHN0cnVjdHVyZSAqLworCitzdHJ1Y3Qgc29sYXJpc190ZXJtaW8geworCXVuc2lnbmVkMTYJY19pZmxhZzsJCS8qIGlucHV0IG1vZGVzICovCisJdW5zaWduZWQxNgljX29mbGFnOwkJLyogb3V0cHV0IG1vZGVzICovCisJdW5zaWduZWQxNgljX2NmbGFnOwkJLyogY29udHJvbCBtb2RlcyAqLworCXVuc2lnbmVkMTYJY19sZmxhZzsJCS8qIGxpbmUgZGlzY2lwbGluZSBtb2RlcyAqLworCXVuc2lnbmVkOAljX2xpbmU7CQkJLyogbGluZSBkaXNjaXBsaW5lICovCisJdW5zaWduZWQ4CWNfY2NbU09MQVJJU19OQ0NdOwkvKiBjb250cm9sIGNoYXJzICovCit9OworCitTVEFUSUNfSU5MSU5FX0VNVUxfVU5JWCB2b2lkCitjb252ZXJ0X3RvX3NvbGFyaXNfdGVybWlvKHVuc2lnbmVkX3dvcmQgYWRkciwKKwkJCSAgc3RydWN0IHRlcm1pbyAqaG9zdCwKKwkJCSAgY3B1ICpwcm9jZXNzb3IsCisJCQkgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBzdHJ1Y3Qgc29sYXJpc190ZXJtaW8gdGFyZ2V0OworICBpbnQgaTsKKworICB0YXJnZXQuY19pZmxhZyA9IEgyVF8yIChob3N0LT5jX2lmbGFnKTsKKyAgdGFyZ2V0LmNfb2ZsYWcgPSBIMlRfMiAoaG9zdC0+Y19vZmxhZyk7CisgIHRhcmdldC5jX2NmbGFnID0gSDJUXzIgKGhvc3QtPmNfY2ZsYWcpOworICB0YXJnZXQuY19sZmxhZyA9IEgyVF8yIChob3N0LT5jX2xmbGFnKTsKKworI2lmIGRlZmluZWQoSEFWRV9URVJNSU9fQ0xJTkUpIHx8IGRlZmluZWQoSEFWRV9URVJNSU9TX0NMSU5FKQorICB0YXJnZXQuY19saW5lICA9IGhvc3QtPmNfbGluZTsKKyNlbHNlCisgIHRhcmdldC5jX2xpbmUgID0gMDsKKyNlbmRpZgorCisgIGZvciAoaSA9IDA7IGkgPCBTT0xBUklTX05DQzsgaSsrKQorICAgIHRhcmdldC5jX2NjW2ldID0gMDsKKworI2lmZGVmIFZJTlRSCisgIHRhcmdldC5jX2NjW1NPTEFSSVNfVklOVFJdID0gaG9zdC0+Y19jY1tWSU5UUl07CisjZW5kaWYKKworI2lmZGVmIFZRVUlUCisgIHRhcmdldC5jX2NjW1NPTEFSSVNfVlFVSVRdID0gaG9zdC0+Y19jY1tWUVVJVF07CisjZW5kaWYKKworI2lmZGVmIFZFUkFTRQorICB0YXJnZXQuY19jY1tTT0xBUklTX1ZFUkFTRV0gPSBob3N0LT5jX2NjW1ZFUkFTRV07CisjZW5kaWYKKworI2lmZGVmIFZLSUxMCisgIHRhcmdldC5jX2NjW1NPTEFSSVNfVktJTExdID0gaG9zdC0+Y19jY1tWS0lMTF07CisjZW5kaWYKKworI2lmZGVmIFZFT0YKKyAgdGFyZ2V0LmNfY2NbU09MQVJJU19WRU9GXSA9IGhvc3QtPmNfY2NbVkVPRl07CisjZW5kaWYKKworI2lmZGVmIFZFT0wKKyAgdGFyZ2V0LmNfY2NbU09MQVJJU19WRU9MXSA9IGhvc3QtPmNfY2NbVkVPTF07CisjZW5kaWYKKworI2lmZGVmIFZFT0wyCisgIHRhcmdldC5jX2NjW1NPTEFSSVNfVkVPTDJdID0gaG9zdC0+Y19jY1tWRU9MMl07CisjZW5kaWYKKworI2lmZGVmIFZTV1RDSAorICB0YXJnZXQuY19jY1tTT0xBUklTX1ZTV1RDSF0gPSBob3N0LT5jX2NjW1ZTV1RDSF07CisKKyNlbHNlCisjaWZkZWYgVlNXVEMKKyAgdGFyZ2V0LmNfY2NbU09MQVJJU19WU1dUQ0hdID0gaG9zdC0+Y19jY1tWU1dUQ107CisjZW5kaWYKKyNlbmRpZgorCisgIGVtdWxfd3JpdGVfYnVmZmVyKCZ0YXJnZXQsIGFkZHIsIHNpemVvZih0YXJnZXQpLCBwcm9jZXNzb3IsIGNpYSk7Cit9CisjZW5kaWYgLyogSEFWRV9URVJNSU9fU1RSVUNUVVJFIHx8IEhBVkVfVEVSTUlPU19TVFJVQ1RVUkUgKi8KKworI2lmZGVmIEhBVkVfVEVSTUlPU19TVFJVQ1RVUkUKKy8qIENvbnZlcnQgdG8vZnJvbSBob3N0IHRlcm1pb3Mgc3RydWN0dXJlICovCisKK3R5cGVkZWYgdW5zaWduZWQzMiBzb2xhcmlzX3RjZmxhZ190OwordHlwZWRlZiB1bnNpZ25lZDggIHNvbGFyaXNfY2NfdDsKK3R5cGVkZWYgdW5zaWduZWQzMiBzb2xhcmlzX3NwZWVkX3Q7CisKK3N0cnVjdCBzb2xhcmlzX3Rlcm1pb3MgeworICBzb2xhcmlzX3RjZmxhZ190CWNfaWZsYWc7CisgIHNvbGFyaXNfdGNmbGFnX3QJY19vZmxhZzsKKyAgc29sYXJpc190Y2ZsYWdfdAljX2NmbGFnOworICBzb2xhcmlzX3RjZmxhZ190CWNfbGZsYWc7CisgIHNvbGFyaXNfY2NfdAkJY19jY1tTT0xBUklTX05DQ1NdOworfTsKKworU1RBVElDX0lOTElORV9FTVVMX1VOSVggdm9pZAorY29udmVydF90b19zb2xhcmlzX3Rlcm1pb3ModW5zaWduZWRfd29yZCBhZGRyLAorCQkJICAgc3RydWN0IHRlcm1pb3MgKmhvc3QsCisJCQkgICBjcHUgKnByb2Nlc3NvciwKKwkJCSAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBzdHJ1Y3Qgc29sYXJpc190ZXJtaW9zIHRhcmdldDsKKyAgaW50IGk7CisKKyAgdGFyZ2V0LmNfaWZsYWcgPSBIMlRfNCAoaG9zdC0+Y19pZmxhZyk7CisgIHRhcmdldC5jX29mbGFnID0gSDJUXzQgKGhvc3QtPmNfb2ZsYWcpOworICB0YXJnZXQuY19jZmxhZyA9IEgyVF80IChob3N0LT5jX2NmbGFnKTsKKyAgdGFyZ2V0LmNfbGZsYWcgPSBIMlRfNCAoaG9zdC0+Y19sZmxhZyk7CisKKyAgZm9yIChpID0gMDsgaSA8IFNPTEFSSVNfTkNDUzsgaSsrKQorICAgIHRhcmdldC5jX2NjW2ldID0gMDsKKworI2lmZGVmIFZJTlRSCisgIHRhcmdldC5jX2NjW1NPTEFSSVNfVklOVFJdID0gaG9zdC0+Y19jY1tWSU5UUl07CisjZW5kaWYKKworI2lmZGVmIFZRVUlUCisgIHRhcmdldC5jX2NjW1NPTEFSSVNfVlFVSVRdID0gaG9zdC0+Y19jY1tWUVVJVF07CisjZW5kaWYKKworI2lmZGVmIFZFUkFTRQorICB0YXJnZXQuY19jY1tTT0xBUklTX1ZFUkFTRV0gPSBob3N0LT5jX2NjW1ZFUkFTRV07CisjZW5kaWYKKworI2lmZGVmIFZLSUxMCisgIHRhcmdldC5jX2NjW1NPTEFSSVNfVktJTExdID0gaG9zdC0+Y19jY1tWS0lMTF07CisjZW5kaWYKKworI2lmZGVmIFZFT0YKKyAgdGFyZ2V0LmNfY2NbU09MQVJJU19WRU9GXSA9IGhvc3QtPmNfY2NbVkVPRl07CisjZW5kaWYKKworI2lmZGVmIFZFT0wKKyAgdGFyZ2V0LmNfY2NbU09MQVJJU19WRU9MXSA9IGhvc3QtPmNfY2NbVkVPTF07CisjZW5kaWYKKworI2lmZGVmIFZFT0wyCisgIHRhcmdldC5jX2NjW1NPTEFSSVNfVkVPTDJdID0gaG9zdC0+Y19jY1tWRU9MMl07CisjZW5kaWYKKworI2lmZGVmIFZTV1RDSAorICB0YXJnZXQuY19jY1tTT0xBUklTX1ZTV1RDSF0gPSBob3N0LT5jX2NjW1ZTV1RDSF07CisKKyNlbHNlCisjaWZkZWYgVlNXVEMKKyAgdGFyZ2V0LmNfY2NbU09MQVJJU19WU1dUQ0hdID0gaG9zdC0+Y19jY1tWU1dUQ107CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgVlNUQVJUCisgIHRhcmdldC5jX2NjW1NPTEFSSVNfVlNUQVJUXSA9IGhvc3QtPmNfY2NbVlNUQVJUXTsKKyNlbmRpZgorCisjaWZkZWYgVlNUT1AKKyAgdGFyZ2V0LmNfY2NbU09MQVJJU19WU1RPUF0gPSBob3N0LT5jX2NjW1ZTVE9QXTsKKyNlbmRpZgorCisjaWZkZWYgVlNVU1AKKyAgdGFyZ2V0LmNfY2NbU09MQVJJU19WU1VTUF0gPSBob3N0LT5jX2NjW1ZTVVNQXTsKKyNlbmRpZgorCisjaWZkZWYgVkRTVVNQCisgIHRhcmdldC5jX2NjW1NPTEFSSVNfVkRTVVNQXSA9IGhvc3QtPmNfY2NbVkRTVVNQXTsKKyNlbmRpZgorCisjaWZkZWYgVlJFUFJJTlQKKyAgdGFyZ2V0LmNfY2NbU09MQVJJU19WUkVQUklOVF0gPSBob3N0LT5jX2NjW1ZSRVBSSU5UXTsKKyNlbmRpZgorCisjaWZkZWYgVkRJU0NBUkQKKyAgdGFyZ2V0LmNfY2NbU09MQVJJU19WRElTQ0FSRF0gPSBob3N0LT5jX2NjW1ZESVNDQVJEXTsKKyNlbmRpZgorCisjaWZkZWYgVldFUkFTRQorICB0YXJnZXQuY19jY1tTT0xBUklTX1ZXRVJBU0VdID0gaG9zdC0+Y19jY1tWV0VSQVNFXTsKKyNlbmRpZgorCisjaWZkZWYgVkxORVhUCisgIHRhcmdldC5jX2NjW1NPTEFSSVNfVkxORVhUXSA9IGhvc3QtPmNfY2NbVkxORVhUXTsKKyNlbmRpZgorCisgIGVtdWxfd3JpdGVfYnVmZmVyKCZ0YXJnZXQsIGFkZHIsIHNpemVvZih0YXJnZXQpLCBwcm9jZXNzb3IsIGNpYSk7Cit9CisjZW5kaWYgLyogSEFWRV9URVJNSU9TX1NUUlVDVFVSRSAqLworCisjaWZuZGVmIEhBVkVfSU9DVEwKKyNkZWZpbmUgZG9fc29sYXJpc19pb2N0bCAwCisjZWxzZQorc3RhdGljIHZvaWQKK2RvX3NvbGFyaXNfaW9jdGwob3NfZW11bF9kYXRhICplbXVsLAorCQkgdW5zaWduZWQgY2FsbCwKKwkJIGNvbnN0IGludCBhcmcwLAorCQkgY3B1ICpwcm9jZXNzb3IsCisJCSB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgaW50IGZpbGRlcyA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICB1bnNpZ25lZCByZXF1ZXN0ID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKKyAgdW5zaWduZWRfd29yZCBhcmdwX2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzJdOworICBpbnQgc3RhdHVzID0gMDsKKyAgY29uc3QgY2hhciAqbmFtZSA9ICI8dW5rbm93bj4iOworCisjaWZkZWYgSEFWRV9URVJNSU9TX1NUUlVDVFVSRQorICBzdHJ1Y3QgdGVybWlvcyBob3N0X3Rlcm1pbzsKKworI2Vsc2UKKyNpZmRlZiBIQVZFX1RFUk1JT19TVFJVQ1RVUkUKKyAgc3RydWN0IHRlcm1pbyBob3N0X3Rlcm1pbzsKKyNlbmRpZgorI2VuZGlmCisKKyAgc3dpdGNoIChyZXF1ZXN0KQorICAgIHsKKyAgICBjYXNlIDA6CQkJCQkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgY2FzZSAqLworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSAtMTsKKyAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgYnJlYWs7CisKKyNpZiBkZWZpbmVkKEhBVkVfVEVSTUlPX1NUUlVDVFVSRSkgfHwgZGVmaW5lZChIQVZFX1RFUk1JT1NfU1RSVUNUVVJFKQorI2lmIGRlZmluZWQoVENHRVRBKSB8fCBkZWZpbmVkKFRDR0VUUykgfHwgZGVmaW5lZChIQVZFX1RDR0VUQVRUUikKKyAgICBjYXNlIFNPTEFSSVNfVElPQyB8IDE6CQkJLyogVENHRVRBICovCisgICAgICBuYW1lID0gIlRDR0VUQSI7CisjaWZkZWYgSEFWRV9UQ0dFVEFUVFIKKyAgICAgIHN0YXR1cyA9IHRjZ2V0YXR0cihmaWxkZXMsICZob3N0X3Rlcm1pbyk7CisjZWxpZiBkZWZpbmVkKFRDR0VUUykKKyAgICAgIHN0YXR1cyA9IGlvY3RsIChmaWxkZXMsIFRDR0VUUywgJmhvc3RfdGVybWlvKTsKKyNlbHNlCisgICAgICBzdGF0dXMgPSBpb2N0bCAoZmlsZGVzLCBUQ0dFVEEsICZob3N0X3Rlcm1pbyk7CisjZW5kaWYKKyAgICAgIGlmIChzdGF0dXMgPT0gMCkKKwljb252ZXJ0X3RvX3NvbGFyaXNfdGVybWlvIChhcmdwX2FkZHIsICZob3N0X3Rlcm1pbywgcHJvY2Vzc29yLCBjaWEpOworICAgICAgYnJlYWs7CisjZW5kaWYgLyogVENHRVRBICovCisjZW5kaWYgLyogSEFWRV9URVJNSU9fU1RSVUNUVVJFICovCisKKyNpZmRlZiBIQVZFX1RFUk1JT1NfU1RSVUNUVVJFCisjaWYgZGVmaW5lZChUQ0dFVFMpIHx8IGRlZmluZWQoSEFWRV9UQ0dFVEFUVFIpCisgICAgY2FzZSBTT0xBUklTX1RJT0MgfCAxMzoJCQkvKiBUQ0dFVFMgKi8KKyAgICAgIG5hbWUgPSAiVENHRVRTIjsKKyNpZmRlZiBIQVZFX1RDR0VUQVRUUgorICAgICAgc3RhdHVzID0gdGNnZXRhdHRyKGZpbGRlcywgJmhvc3RfdGVybWlvKTsKKyNlbHNlCisgICAgICBzdGF0dXMgPSBpb2N0bCAoZmlsZGVzLCBUQ0dFVFMsICZob3N0X3Rlcm1pbyk7CisjZW5kaWYKKyAgICAgIGlmIChzdGF0dXMgPT0gMCkKKwljb252ZXJ0X3RvX3NvbGFyaXNfdGVybWlvcyAoYXJncF9hZGRyLCAmaG9zdF90ZXJtaW8sIHByb2Nlc3NvciwgY2lhKTsKKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIFRDR0VUUyAqLworI2VuZGlmIC8qIEhBVkVfVEVSTUlPU19TVFJVQ1RVUkUgKi8KKyAgICB9CisKKyAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycm5vKTsKKworICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiJWQsIDB4JXggWyVzXSwgMHglbHgiLCBmaWxkZXMsIHJlcXVlc3QsIG5hbWUsIChsb25nKWFyZ3BfYWRkcik7Cit9CisjZW5kaWYgLyogSEFWRV9JT0NUTCAqLworCitzdGF0aWMgZW11bF9zeXNjYWxsX2Rlc2NyaXB0b3Igc29sYXJpc19kZXNjcmlwdG9yc1tdID0geworICAvKiAgIDAgKi8geyAwLCAic3lzY2FsbCIgfSwKKyAgLyogICAxICovIHsgZG9fdW5peF9leGl0LCAiZXhpdCIgfSwKKyAgLyogICAyICovIHsgMCwgImZvcmsiIH0sCisgIC8qICAgMyAqLyB7IGRvX3VuaXhfcmVhZCwgInJlYWQiIH0sCisgIC8qICAgNCAqLyB7IGRvX3VuaXhfd3JpdGUsICJ3cml0ZSIgfSwKKyAgLyogICA1ICovIHsgZG9fdW5peF9vcGVuLCAib3BlbiIgfSwKKyAgLyogICA2ICovIHsgZG9fdW5peF9jbG9zZSwgImNsb3NlIiB9LAorICAvKiAgIDcgKi8geyAwLCAid2FpdCIgfSwKKyAgLyogICA4ICovIHsgMCwgImNyZWF0IiB9LAorICAvKiAgIDkgKi8geyBkb191bml4X2xpbmssICJsaW5rIiB9LAorICAvKiAgMTAgKi8geyBkb191bml4X3VubGluaywgInVubGluayIgfSwKKyAgLyogIDExICovIHsgMCwgImV4ZWMiIH0sCisgIC8qICAxMiAqLyB7IGRvX3VuaXhfY2hkaXIsICJjaGRpciIgfSwKKyAgLyogIDEzICovIHsgZG9fdW5peF90aW1lLCAidGltZSIgfSwKKyAgLyogIDE0ICovIHsgMCwgIm1rbm9kIiB9LAorICAvKiAgMTUgKi8geyAwLCAiY2htb2QiIH0sCisgIC8qICAxNiAqLyB7IDAsICJjaG93biIgfSwKKyAgLyogIDE3ICovIHsgZG9fdW5peF9icmVhaywgImJyayIgfSwKKyAgLyogIDE4ICovIHsgZG9fc29sYXJpc19zdGF0LCAic3RhdCIgfSwKKyAgLyogIDE5ICovIHsgZG9fdW5peF9sc2VlaywgImxzZWVrIiB9LAorICAvKiAgMjAgKi8geyBkb191bml4X2dldHBpZDIsICJnZXRwaWQiIH0sCisgIC8qICAyMSAqLyB7IDAsICJtb3VudCIgfSwKKyAgLyogIDIyICovIHsgMCwgInVtb3VudCIgfSwKKyAgLyogIDIzICovIHsgMCwgInNldHVpZCIgfSwKKyAgLyogIDI0ICovIHsgZG9fdW5peF9nZXR1aWQyLCAiZ2V0dWlkIiB9LAorICAvKiAgMjUgKi8geyAwLCAic3RpbWUiIH0sCisgIC8qICAyNiAqLyB7IDAsICJwdHJhY2UiIH0sCisgIC8qICAyNyAqLyB7IDAsICJhbGFybSIgfSwKKyAgLyogIDI4ICovIHsgZG9fc29sYXJpc19mc3RhdCwgImZzdGF0IiB9LAorICAvKiAgMjkgKi8geyAwLCAicGF1c2UiIH0sCisgIC8qICAzMCAqLyB7IDAsICJ1dGltZSIgfSwKKyAgLyogIDMxICovIHsgMCwgInN0dHkiIH0sCisgIC8qICAzMiAqLyB7IDAsICJndHR5IiB9LAorICAvKiAgMzMgKi8geyBkb191bml4X2FjY2VzcywgImFjY2VzcyIgfSwKKyAgLyogIDM0ICovIHsgMCwgIm5pY2UiIH0sCisgIC8qICAzNSAqLyB7IDAsICJzdGF0ZnMiIH0sCisgIC8qICAzNiAqLyB7IDAsICJzeW5jIiB9LAorICAvKiAgMzcgKi8geyAwLCAia2lsbCIgfSwKKyAgLyogIDM4ICovIHsgMCwgImZzdGF0ZnMiIH0sCisgIC8qICAzOSAqLyB7IDAsICJwZ3Jwc3lzIiB9LAorICAvKiAgNDAgKi8geyAwLCAieGVuaXgiIH0sCisgIC8qICA0MSAqLyB7IGRvX3VuaXhfZHVwLCAiZHVwIiB9LAorICAvKiAgNDIgKi8geyAwLCAicGlwZSIgfSwKKyAgLyogIDQzICovIHsgMCwgInRpbWVzIiB9LAorICAvKiAgNDQgKi8geyAwLCAicHJvZmlsIiB9LAorICAvKiAgNDUgKi8geyAwLCAicGxvY2siIH0sCisgIC8qICA0NiAqLyB7IDAsICJzZXRnaWQiIH0sCisgIC8qICA0NyAqLyB7IGRvX3VuaXhfZ2V0Z2lkMiwgImdldGdpZCIgfSwKKyAgLyogIDQ4ICovIHsgMCwgInNpZ25hbCIgfSwKKyAgLyogIDQ5ICovIHsgMCwgIm1zZ3N5cyIgfSwKKyAgLyogIDUwICovIHsgMCwgInN5c3N1biIgfSwKKyAgLyogIDUxICovIHsgMCwgImFjY3QiIH0sCisgIC8qICA1MiAqLyB7IDAsICJzaG1zeXMiIH0sCisgIC8qICA1MyAqLyB7IDAsICJzZW1zeXMiIH0sCisgIC8qICA1NCAqLyB7IGRvX3NvbGFyaXNfaW9jdGwsICJpb2N0bCIgfSwKKyAgLyogIDU1ICovIHsgMCwgInVhZG1pbiIgfSwKKyAgLyogIDU2ICovIHsgMCwgMCAvKiByZXNlcnZlZCBmb3IgZXhjaCAqLyB9LAorICAvKiAgNTcgKi8geyAwLCAidXRzc3lzIiB9LAorICAvKiAgNTggKi8geyAwLCAiZmRzeW5jIiB9LAorICAvKiAgNTkgKi8geyAwLCAiZXhlY3ZlIiB9LAorICAvKiAgNjAgKi8geyBkb191bml4X3VtYXNrLCAidW1hc2siIH0sCisgIC8qICA2MSAqLyB7IDAsICJjaHJvb3QiIH0sCisgIC8qICA2MiAqLyB7IDAsICJmY250bCIgfSwKKyAgLyogIDYzICovIHsgMCwgInVsaW1pdCIgfSwKKyAgLyogIDY0ICovIHsgMCwgMCAvKiByZXNlcnZlZCBmb3IgVU5JWCBQQyAqLyB9LAorICAvKiAgNjQgKi8geyAwLCAwIC8qIHJlc2VydmVkIGZvciBVTklYIFBDICovIH0sCisgIC8qICA2NSAqLyB7IDAsIDAgLyogcmVzZXJ2ZWQgZm9yIFVOSVggUEMgKi8gfSwKKyAgLyogIDY2ICovIHsgMCwgMCAvKiByZXNlcnZlZCBmb3IgVU5JWCBQQyAqLyB9LAorICAvKiAgNjcgKi8geyAwLCAwIC8qIHJlc2VydmVkIGZvciBVTklYIFBDICovIH0sCisgIC8qICA2OCAqLyB7IDAsIDAgLyogcmVzZXJ2ZWQgZm9yIFVOSVggUEMgKi8gfSwKKyAgLyogIDY5ICovIHsgMCwgMCAvKiByZXNlcnZlZCBmb3IgVU5JWCBQQyAqLyB9LAorICAvKiAgNzAgKi8geyAwLCAwIC8qIHdhcyBhZHZmcyAqLyB9LAorICAvKiAgNzEgKi8geyAwLCAwIC8qIHdhcyB1bmFkdmZzICovIH0sCisgIC8qICA3MiAqLyB7IDAsIDAgLyogd2FzIHJtb3VudCAqLyB9LAorICAvKiAgNzMgKi8geyAwLCAwIC8qIHdhcyBydW1vdW50ICovIH0sCisgIC8qICA3NCAqLyB7IDAsIDAgLyogd2FzIHJmc3RhcnQgKi8gfSwKKyAgLyogIDc1ICovIHsgMCwgMCAvKiB3YXMgc2lncmV0ICovIH0sCisgIC8qICA3NiAqLyB7IDAsIDAgLyogd2FzIHJkZWJ1ZyAqLyB9LAorICAvKiAgNzcgKi8geyAwLCAwIC8qIHdhcyByZnN0b3AgKi8gfSwKKyAgLyogIDc4ICovIHsgMCwgMCAvKiB3YXMgcmZzeXMgKi8gfSwKKyAgLyogIDc5ICovIHsgZG9fdW5peF9ybWRpciwgInJtZGlyIiB9LAorICAvKiAgODAgKi8geyBkb191bml4X21rZGlyLCAibWtkaXIiIH0sCisgIC8qICA4MSAqLyB7IDAsICJnZXRkZW50cyIgfSwKKyAgLyogIDgyICovIHsgMCwgMCAvKiB3YXMgbGliYXR0YWNoICovIH0sCisgIC8qICA4MyAqLyB7IDAsIDAgLyogd2FzIGxpYmRldGFjaCAqLyB9LAorICAvKiAgODQgKi8geyAwLCAic3lzZnMiIH0sCisgIC8qICA4NSAqLyB7IDAsICJnZXRtc2ciIH0sCisgIC8qICA4NiAqLyB7IDAsICJwdXRtc2ciIH0sCisgIC8qICA4NyAqLyB7IDAsICJwb2xsIiB9LAorICAvKiAgODggKi8geyBkb19zb2xhcmlzX2xzdGF0LCAibHN0YXQiIH0sCisgIC8qICA4OSAqLyB7IGRvX3VuaXhfc3ltbGluaywgInN5bWxpbmsiIH0sCisgIC8qICA5MCAqLyB7IDAsICJyZWFkbGluayIgfSwKKyAgLyogIDkxICovIHsgMCwgInNldGdyb3VwcyIgfSwKKyAgLyogIDkyICovIHsgMCwgImdldGdyb3VwcyIgfSwKKyAgLyogIDkzICovIHsgMCwgImZjaG1vZCIgfSwKKyAgLyogIDk0ICovIHsgMCwgImZjaG93biIgfSwKKyAgLyogIDk1ICovIHsgMCwgInNpZ3Byb2NtYXNrIiB9LAorICAvKiAgOTYgKi8geyAwLCAic2lnc3VzcGVuZCIgfSwKKyAgLyogIDk3ICovIHsgZG9fdW5peF9ub3AsICJzaWdhbHRzdGFjayIgfSwKKyAgLyogIDk4ICovIHsgZG9fdW5peF9ub3AsICJzaWdhY3Rpb24iIH0sCisgIC8qICA5OSAqLyB7IDAsICJzaWdwZW5kaW5nIiB9LAorICAvKiAxMDAgKi8geyAwLCAiY29udGV4dCIgfSwKKyAgLyogMTAxICovIHsgMCwgImV2c3lzIiB9LAorICAvKiAxMDIgKi8geyAwLCAiZXZ0cmFwcmV0IiB9LAorICAvKiAxMDMgKi8geyAwLCAic3RhdHZmcyIgfSwKKyAgLyogMTA0ICovIHsgMCwgImZzdGF0dmZzIiB9LAorICAvKiAxMDUgKi8geyAwLCAwIC8qIHJlc2VydmVkICovIH0sCisgIC8qIDEwNiAqLyB7IDAsICJuZnNzeXMiIH0sCisgIC8qIDEwNyAqLyB7IDAsICJ3YWl0c3lzIiB9LAorICAvKiAxMDggKi8geyAwLCAic2lnc2VuZHN5cyIgfSwKKyAgLyogMTA5ICovIHsgMCwgImhydHN5cyIgfSwKKyAgLyogMTEwICovIHsgMCwgImFjYW5jZWwiIH0sCisgIC8qIDExMSAqLyB7IDAsICJhc3luYyIgfSwKKyAgLyogMTEyICovIHsgMCwgInByaW9jbnRsc3lzIiB9LAorICAvKiAxMTMgKi8geyAwLCAicGF0aGNvbmYiIH0sCisgIC8qIDExNCAqLyB7IDAsICJtaW5jb3JlIiB9LAorICAvKiAxMTUgKi8geyAwLCAibW1hcCIgfSwKKyAgLyogMTE2ICovIHsgMCwgIm1wcm90ZWN0IiB9LAorICAvKiAxMTcgKi8geyAwLCAibXVubWFwIiB9LAorICAvKiAxMTggKi8geyAwLCAiZnBhdGhjb25mIiB9LAorICAvKiAxMTkgKi8geyAwLCAidmZvcmsiIH0sCisgIC8qIDEyMCAqLyB7IDAsICJmY2hkaXIiIH0sCisgIC8qIDEyMSAqLyB7IDAsICJyZWFkdiIgfSwKKyAgLyogMTIyICovIHsgMCwgIndyaXRldiIgfSwKKyAgLyogMTIzICovIHsgMCwgInhzdGF0IiB9LAorICAvKiAxMjQgKi8geyAwLCAibHhzdGF0IiB9LAorICAvKiAxMjUgKi8geyAwLCAiZnhzdGF0IiB9LAorICAvKiAxMjYgKi8geyAwLCAieG1rbm9kIiB9LAorICAvKiAxMjcgKi8geyAwLCAiY2xvY2FsIiB9LAorICAvKiAxMjggKi8geyAwLCAic2V0cmxpbWl0IiB9LAorICAvKiAxMjkgKi8geyAwLCAiZ2V0cmxpbWl0IiB9LAorICAvKiAxMzAgKi8geyAwLCAibGNob3duIiB9LAorICAvKiAxMzEgKi8geyAwLCAibWVtY250bCIgfSwKKyAgLyogMTMyICovIHsgMCwgImdldHBtc2ciIH0sCisgIC8qIDEzMyAqLyB7IDAsICJwdXRwbXNnIiB9LAorICAvKiAxMzQgKi8geyAwLCAicmVuYW1lIiB9LAorICAvKiAxMzUgKi8geyAwLCAidW5hbWUiIH0sCisgIC8qIDEzNiAqLyB7IDAsICJzZXRlZ2lkIiB9LAorICAvKiAxMzcgKi8geyAwLCAic3lzY29uZmlnIiB9LAorICAvKiAxMzggKi8geyAwLCAiYWRqdGltZSIgfSwKKyAgLyogMTM5ICovIHsgMCwgInN5c3RlbWluZm8iIH0sCisgIC8qIDE0MCAqLyB7IDAsIDAgLyogcmVzZXJ2ZWQgKi8gfSwKKyAgLyogMTQxICovIHsgMCwgInNldGV1aWQiIH0sCisgIC8qIDE0MiAqLyB7IDAsICJ2dHJhY2UiIH0sCisgIC8qIDE0MyAqLyB7IDAsICJmb3JrMSIgfSwKKyAgLyogMTQ0ICovIHsgMCwgInNpZ3RpbWVkd2FpdCIgfSwKKyAgLyogMTQ1ICovIHsgMCwgImx3cF9pbmZvIiB9LAorICAvKiAxNDYgKi8geyAwLCAieWllbGQiIH0sCisgIC8qIDE0NyAqLyB7IDAsICJsd3Bfc2VtYV93YWl0IiB9LAorICAvKiAxNDggKi8geyAwLCAibHdwX3NlbWFfcG9zdCIgfSwKKyAgLyogMTQ5ICovIHsgMCwgMCAvKiByZXNlcnZlZCAqLyB9LAorICAvKiAxNTAgKi8geyAwLCAwIC8qIHJlc2VydmVkICovIH0sCisgIC8qIDE1MSAqLyB7IDAsIDAgLyogcmVzZXJ2ZWQgKi8gfSwKKyAgLyogMTUyICovIHsgMCwgIm1vZGN0bCIgfSwKKyAgLyogMTUzICovIHsgMCwgImZjaHJvb3QiIH0sCisgIC8qIDE1NCAqLyB7IDAsICJ1dGltZXMiIH0sCisgIC8qIDE1NSAqLyB7IDAsICJ2aGFuZ3VwIiB9LAorICAvKiAxNTYgKi8geyBkb191bml4X2dldHRpbWVvZmRheSwgImdldHRpbWVvZmRheSIgfSwKKyAgLyogMTU3ICovIHsgMCwgImdldGl0aW1lciIgfSwKKyAgLyogMTU4ICovIHsgMCwgInNldGl0aW1lciIgfSwKKyAgLyogMTU5ICovIHsgMCwgImx3cF9jcmVhdGUiIH0sCisgIC8qIDE2MCAqLyB7IDAsICJsd3BfZXhpdCIgfSwKKyAgLyogMTYxICovIHsgMCwgImx3cF9zdXNwZW5kIiB9LAorICAvKiAxNjIgKi8geyAwLCAibHdwX2NvbnRpbnVlIiB9LAorICAvKiAxNjMgKi8geyAwLCAibHdwX2tpbGwiIH0sCisgIC8qIDE2NCAqLyB7IDAsICJsd3Bfc2VsZiIgfSwKKyAgLyogMTY1ICovIHsgMCwgImx3cF9zZXRwcml2YXRlIiB9LAorICAvKiAxNjYgKi8geyAwLCAibHdwX2dldHByaXZhdGUiIH0sCisgIC8qIDE2NyAqLyB7IDAsICJsd3Bfd2FpdCIgfSwKKyAgLyogMTY4ICovIHsgMCwgImx3cF9tdXRleF91bmxvY2siIH0sCisgIC8qIDE2OSAqLyB7IDAsICJsd3BfbXV0ZXhfbG9jayIgfSwKKyAgLyogMTcwICovIHsgMCwgImx3cF9jb25kX3dhaXQiIH0sCisgIC8qIDE3MSAqLyB7IDAsICJsd3BfY29uZF9zaWduYWwiIH0sCisgIC8qIDE3MiAqLyB7IDAsICJsd3BfY29uZF9icm9hZGNhc3QiIH0sCisgIC8qIDE3MyAqLyB7IDAsICJwcmVhZCIgfSwKKyAgLyogMTc0ICovIHsgMCwgInB3cml0ZSIgfSwKKyAgLyogMTc1ICovIHsgMCwgImxsc2VlayIgfSwKKyAgLyogMTc2ICovIHsgMCwgImluc3Rfc3luYyIgfSwKKyAgLyogMTc3ICovIHsgMCwgMCAvKiByZXNlcnZlZCAqLyB9LAorICAvKiAxNzggKi8geyAwLCAia2FpbyIgfSwKKyAgLyogMTc5ICovIHsgMCwgMCAvKiByZXNlcnZlZCAqLyB9LAorICAvKiAxODAgKi8geyAwLCAwIC8qIHJlc2VydmVkICovIH0sCisgIC8qIDE4MSAqLyB7IDAsIDAgLyogcmVzZXJ2ZWQgKi8gfSwKKyAgLyogMTgyICovIHsgMCwgMCAvKiByZXNlcnZlZCAqLyB9LAorICAvKiAxODMgKi8geyAwLCAwIC8qIHJlc2VydmVkICovIH0sCisgIC8qIDE4NCAqLyB7IDAsICJ0c29sc3lzIiB9LAorICAvKiAxODUgKi8geyAwLCAiYWNsIiB9LAorICAvKiAxODYgKi8geyAwLCAiYXVkaXRzeXMiIH0sCisgIC8qIDE4NyAqLyB7IDAsICJwcm9jZXNzb3JfYmluZCIgfSwKKyAgLyogMTg4ICovIHsgMCwgInByb2Nlc3Nvcl9pbmZvIiB9LAorICAvKiAxODkgKi8geyAwLCAicF9vbmxpbmUiIH0sCisgIC8qIDE5MCAqLyB7IDAsICJzaWdxdWV1ZSIgfSwKKyAgLyogMTkxICovIHsgMCwgImNsb2NrX2dldHRpbWUiIH0sCisgIC8qIDE5MiAqLyB7IDAsICJjbG9ja19zZXR0aW1lIiB9LAorICAvKiAxOTMgKi8geyAwLCAiY2xvY2tfZ2V0cmVzIiB9LAorICAvKiAxOTQgKi8geyAwLCAidGltZXJfY3JlYXRlIiB9LAorICAvKiAxOTUgKi8geyAwLCAidGltZXJfZGVsZXRlIiB9LAorICAvKiAxOTYgKi8geyAwLCAidGltZXJfc2V0dGltZSIgfSwKKyAgLyogMTk3ICovIHsgMCwgInRpbWVyX2dldHRpbWUiIH0sCisgIC8qIDE5OCAqLyB7IDAsICJ0aW1lcl9nZXRvdmVycnVuIiB9LAorICAvKiAxOTkgKi8geyAwLCAibmFub3NsZWVwIiB9LAorICAvKiAyMDAgKi8geyAwLCAiZmFjbCIgfSwKKyAgLyogMjAxICovIHsgMCwgImRvb3IiIH0sCisgIC8qIDIwMiAqLyB7IDAsICJzZXRyZXVpZCIgfSwKKyAgLyogMjAzICovIHsgMCwgInNldHJlZ2lkIiB9LAorICAvKiAyMDQgKi8geyAwLCAiaW5zdGFsbF91dHJhcCIgfSwKKyAgLyogMjA1ICovIHsgMCwgMCAvKiByZXNlcnZlZCAqLyB9LAorICAvKiAyMDYgKi8geyAwLCAwIC8qIHJlc2VydmVkICovIH0sCisgIC8qIDIwNyAqLyB7IDAsIDAgLyogcmVzZXJ2ZWQgKi8gfSwKKyAgLyogMjA4ICovIHsgMCwgMCAvKiByZXNlcnZlZCAqLyB9LAorICAvKiAyMDkgKi8geyAwLCAwIC8qIHJlc2VydmVkICovIH0sCisgIC8qIDIxMCAqLyB7IDAsICJzaWdub3RpZnl3YWl0IiB9LAorICAvKiAyMTEgKi8geyAwLCAibHdwX3NpZ3JlZGlyZWN0IiB9LAorICAvKiAyMTIgKi8geyAwLCAibHdwX2FsYXJtIiB9LAorfTsKKworc3RhdGljIGNoYXIgKihzb2xhcmlzX2Vycm9yX25hbWVzW10pID0geworICAvKiAgIDAgKi8gIkVTVUNDRVNTIiwKKyAgLyogICAxICovICJFUEVSTSIsCisgIC8qICAgMiAqLyAiRU5PRU5UIiwKKyAgLyogICAzICovICJFU1JDSCIsCisgIC8qICAgNCAqLyAiRUlOVFIiLAorICAvKiAgIDUgKi8gIkVJTyIsCisgIC8qICAgNiAqLyAiRU5YSU8iLAorICAvKiAgIDcgKi8gIkUyQklHIiwKKyAgLyogICA4ICovICJFTk9FWEVDIiwKKyAgLyogICA5ICovICJFQkFERiIsCisgIC8qICAxMCAqLyAiRUNISUxEIiwKKyAgLyogIDExICovICJFQUdBSU4iLAorICAvKiAgMTIgKi8gIkVOT01FTSIsCisgIC8qICAxMyAqLyAiRUFDQ0VTIiwKKyAgLyogIDE0ICovICJFRkFVTFQiLAorICAvKiAgMTUgKi8gIkVOT1RCTEsiLAorICAvKiAgMTYgKi8gIkVCVVNZIiwKKyAgLyogIDE3ICovICJFRVhJU1QiLAorICAvKiAgMTggKi8gIkVYREVWIiwKKyAgLyogIDE5ICovICJFTk9ERVYiLAorICAvKiAgMjAgKi8gIkVOT1RESVIiLAorICAvKiAgMjEgKi8gIkVJU0RJUiIsCisgIC8qICAyMiAqLyAiRUlOVkFMIiwKKyAgLyogIDIzICovICJFTkZJTEUiLAorICAvKiAgMjQgKi8gIkVNRklMRSIsCisgIC8qICAyNSAqLyAiRU5PVFRZIiwKKyAgLyogIDI2ICovICJFVFhUQlNZIiwKKyAgLyogIDI3ICovICJFRkJJRyIsCisgIC8qICAyOCAqLyAiRU5PU1BDIiwKKyAgLyogIDI5ICovICJFU1BJUEUiLAorICAvKiAgMzAgKi8gIkVST0ZTIiwKKyAgLyogIDMxICovICJFTUxJTksiLAorICAvKiAgMzIgKi8gIkVQSVBFIiwKKyAgLyogIDMzICovICJFRE9NIiwKKyAgLyogIDM0ICovICJFUkFOR0UiLAorICAvKiAgMzUgKi8gIkVOT01TRyIsCisgIC8qICAzNiAqLyAiRUlEUk0iLAorICAvKiAgMzcgKi8gIkVDSFJORyIsCisgIC8qICAzOCAqLyAiRUwyTlNZTkMiLAorICAvKiAgMzkgKi8gIkVMM0hMVCIsCisgIC8qICA0MCAqLyAiRUwzUlNUIiwKKyAgLyogIDQxICovICJFTE5STkciLAorICAvKiAgNDIgKi8gIkVVTkFUQ0giLAorICAvKiAgNDMgKi8gIkVOT0NTSSIsCisgIC8qICA0NCAqLyAiRUwySExUIiwKKyAgLyogIDQ1ICovICJFREVBRExLIiwKKyAgLyogIDQ2ICovICJFTk9MQ0siLAorICAvKiAgNDcgKi8gIkVDQU5DRUxFRCIsCisgIC8qICA0OCAqLyAiRU5PVFNVUCIsCisgIC8qICA0OSAqLyAiRURRVU9UIiwKKyAgLyogIDUwICovICJFQkFERSIsCisgIC8qICA1MSAqLyAiRUJBRFIiLAorICAvKiAgNTIgKi8gIkVYRlVMTCIsCisgIC8qICA1MyAqLyAiRU5PQU5PIiwKKyAgLyogIDU0ICovICJFQkFEUlFDIiwKKyAgLyogIDU1ICovICJFQkFEU0xUIiwKKyAgLyogIDU2ICovICJFREVBRExPQ0siLAorICAvKiAgNTcgKi8gIkVCRk9OVCIsCisgIC8qICA1OCAqLyAiRXJyb3IgY29kZSA1OCIsCisgIC8qICA1OSAqLyAiRXJyb3IgY29kZSA1OSIsCisgIC8qICA2MCAqLyAiRU5PU1RSIiwKKyAgLyogIDYxICovICJFTk9EQVRBIiwKKyAgLyogIDYyICovICJFVElNRSIsCisgIC8qICA2MyAqLyAiRU5PU1IiLAorICAvKiAgNjQgKi8gIkVOT05FVCIsCisgIC8qICA2NSAqLyAiRU5PUEtHIiwKKyAgLyogIDY2ICovICJFUkVNT1RFIiwKKyAgLyogIDY3ICovICJFTk9MSU5LIiwKKyAgLyogIDY4ICovICJFQURWIiwKKyAgLyogIDY5ICovICJFU1JNTlQiLAorICAvKiAgNzAgKi8gIkVDT01NIiwKKyAgLyogIDcxICovICJFUFJPVE8iLAorICAvKiAgNzIgKi8gIkVycm9yIGNvZGUgNzIiLAorICAvKiAgNzMgKi8gIkVycm9yIGNvZGUgNzMiLAorICAvKiAgNzQgKi8gIkVNVUxUSUhPUCIsCisgIC8qICA3NSAqLyAiRXJyb3IgY29kZSA3NSIsCisgIC8qICA3NiAqLyAiRXJyb3IgY29kZSA3NiIsCisgIC8qICA3NyAqLyAiRUJBRE1TRyIsCisgIC8qICA3OCAqLyAiRU5BTUVUT09MT05HIiwKKyAgLyogIDc5ICovICJFT1ZFUkZMT1ciLAorICAvKiAgODAgKi8gIkVOT1RVTklRIiwKKyAgLyogIDgxICovICJFQkFERkQiLAorICAvKiAgODIgKi8gIkVSRU1DSEciLAorICAvKiAgODMgKi8gIkVMSUJBQ0MiLAorICAvKiAgODQgKi8gIkVMSUJCQUQiLAorICAvKiAgODUgKi8gIkVMSUJTQ04iLAorICAvKiAgODYgKi8gIkVMSUJNQVgiLAorICAvKiAgODcgKi8gIkVMSUJFWEVDIiwKKyAgLyogIDg4ICovICJFSUxTRVEiLAorICAvKiAgODkgKi8gIkVOT1NZUyIsCisgIC8qICA5MCAqLyAiRUxPT1AiLAorICAvKiAgOTEgKi8gIkVSRVNUQVJUIiwKKyAgLyogIDkyICovICJFU1RSUElQRSIsCisgIC8qICA5MyAqLyAiRU5PVEVNUFRZIiwKKyAgLyogIDk0ICovICJFVVNFUlMiLAorICAvKiAgOTUgKi8gIkVOT1RTT0NLIiwKKyAgLyogIDk2ICovICJFREVTVEFERFJSRVEiLAorICAvKiAgOTcgKi8gIkVNU0dTSVpFIiwKKyAgLyogIDk4ICovICJFUFJPVE9UWVBFIiwKKyAgLyogIDk5ICovICJFTk9QUk9UT09QVCIsCisgIC8qIDEwMCAqLyAiRXJyb3IgY29kZSAxMDAiLAorICAvKiAxMDEgKi8gIkVycm9yIGNvZGUgMTAxIiwKKyAgLyogMTAyICovICJFcnJvciBjb2RlIDEwMiIsCisgIC8qIDEwMyAqLyAiRXJyb3IgY29kZSAxMDMiLAorICAvKiAxMDQgKi8gIkVycm9yIGNvZGUgMTA0IiwKKyAgLyogMTA1ICovICJFcnJvciBjb2RlIDEwNSIsCisgIC8qIDEwNiAqLyAiRXJyb3IgY29kZSAxMDYiLAorICAvKiAxMDcgKi8gIkVycm9yIGNvZGUgMTA3IiwKKyAgLyogMTA4ICovICJFcnJvciBjb2RlIDEwOCIsCisgIC8qIDEwOSAqLyAiRXJyb3IgY29kZSAxMDkiLAorICAvKiAxMTAgKi8gIkVycm9yIGNvZGUgMTEwIiwKKyAgLyogMTExICovICJFcnJvciBjb2RlIDExMSIsCisgIC8qIDExMiAqLyAiRXJyb3IgY29kZSAxMTIiLAorICAvKiAxMTMgKi8gIkVycm9yIGNvZGUgMTEzIiwKKyAgLyogMTE0ICovICJFcnJvciBjb2RlIDExNCIsCisgIC8qIDExNSAqLyAiRXJyb3IgY29kZSAxMTUiLAorICAvKiAxMTYgKi8gIkVycm9yIGNvZGUgMTE2IiwKKyAgLyogMTE3ICovICJFcnJvciBjb2RlIDExNyIsCisgIC8qIDExOCAqLyAiRXJyb3IgY29kZSAxMTgiLAorICAvKiAxMTkgKi8gIkVycm9yIGNvZGUgMTE5IiwKKyAgLyogMTIwICovICJFUFJPVE9OT1NVUFBPUlQiLAorICAvKiAxMjEgKi8gIkVTT0NLVE5PU1VQUE9SVCIsCisgIC8qIDEyMiAqLyAiRU9QTk9UU1VQUCIsCisgIC8qIDEyMyAqLyAiRVBGTk9TVVBQT1JUIiwKKyAgLyogMTI0ICovICJFQUZOT1NVUFBPUlQiLAorICAvKiAxMjUgKi8gIkVBRERSSU5VU0UiLAorICAvKiAxMjYgKi8gIkVBRERSTk9UQVZBSUwiLAorICAvKiAxMjcgKi8gIkVORVRET1dOIiwKKyAgLyogMTI4ICovICJFTkVUVU5SRUFDSCIsCisgIC8qIDEyOSAqLyAiRU5FVFJFU0VUIiwKKyAgLyogMTMwICovICJFQ09OTkFCT1JURUQiLAorICAvKiAxMzEgKi8gIkVDT05OUkVTRVQiLAorICAvKiAxMzIgKi8gIkVOT0JVRlMiLAorICAvKiAxMzMgKi8gIkVJU0NPTk4iLAorICAvKiAxMzQgKi8gIkVOT1RDT05OIiwKKyAgLyogMTM1ICovICJFcnJvciBjb2RlIDEzNSIsCS8qIFhFTklYIGhhcyAxMzUgLSAxNDIgKi8KKyAgLyogMTM2ICovICJFcnJvciBjb2RlIDEzNiIsCisgIC8qIDEzNyAqLyAiRXJyb3IgY29kZSAxMzciLAorICAvKiAxMzggKi8gIkVycm9yIGNvZGUgMTM4IiwKKyAgLyogMTM5ICovICJFcnJvciBjb2RlIDEzOSIsCisgIC8qIDE0MCAqLyAiRXJyb3IgY29kZSAxNDAiLAorICAvKiAxNDEgKi8gIkVycm9yIGNvZGUgMTQxIiwKKyAgLyogMTQyICovICJFcnJvciBjb2RlIDE0MiIsCisgIC8qIDE0MyAqLyAiRVNIVVRET1dOIiwKKyAgLyogMTQ0ICovICJFVE9PTUFOWVJFRlMiLAorICAvKiAxNDUgKi8gIkVUSU1FRE9VVCIsCisgIC8qIDE0NiAqLyAiRUNPTk5SRUZVU0VEIiwKKyAgLyogMTQ3ICovICJFSE9TVERPV04iLAorICAvKiAxNDggKi8gIkVIT1NUVU5SRUFDSCIsCisgIC8qIDE0OSAqLyAiRUFMUkVBRFkiLAorICAvKiAxNTAgKi8gIkVJTlBST0dSRVNTIiwKKyAgLyogMTUxICovICJFU1RBTEUiLAorfTsKKworc3RhdGljIGNoYXIgKihzb2xhcmlzX3NpZ25hbF9uYW1lc1tdKSA9IHsKKyAgLyogIDAgKi8gMCwKKyAgLyogIDEgKi8gIlNJR0hVUCIsCisgIC8qICAyICovICJTSUdJTlQiLAorICAvKiAgMyAqLyAiU0lHUVVJVCIsCisgIC8qICA0ICovICJTSUdJTEwiLAorICAvKiAgNSAqLyAiU0lHVFJBUCIsCisgIC8qICA2ICovICJTSUdBQlJUIiwKKyAgLyogIDcgKi8gIlNJR0VNVCIsCisgIC8qICA4ICovICJTSUdGUEUiLAorICAvKiAgOSAqLyAiU0lHS0lMTCIsCisgIC8qIDEwICovICJTSUdCVVMiLAorICAvKiAxMSAqLyAiU0lHU0VHViIsCisgIC8qIDEyICovICJTSUdTWVMiLAorICAvKiAxMyAqLyAiU0lHUElQRSIsCisgIC8qIDE0ICovICJTSUdBTFJNIiwKKyAgLyogMTUgKi8gIlNJR1RFUk0iLAorICAvKiAxNiAqLyAiU0lHVVNSMSIsCisgIC8qIDE3ICovICJTSUdVU1IyIiwKKyAgLyogMTggKi8gIlNJR0NITEQiLAorICAvKiAxOSAqLyAiU0lHUFdSIiwKKyAgLyogMjAgKi8gIlNJR1dJTkNIIiwKKyAgLyogMjEgKi8gIlNJR1VSRyIsCisgIC8qIDIyICovICJTSUdQT0xMIiwKKyAgLyogMjMgKi8gIlNJR1NUT1AiLAorICAvKiAyNCAqLyAiU0lHVFNUUCIsCisgIC8qIDI1ICovICJTSUdDT05UIiwKKyAgLyogMjYgKi8gIlNJR1RUSU4iLAorICAvKiAyNyAqLyAiU0lHVFRPVSIsCisgIC8qIDI4ICovICJTSUdWVEFMUk0iLAorICAvKiAyOSAqLyAiU0lHUFJPRiIsCisgIC8qIDMwICovICJTSUdYQ1BVIiwKKyAgLyogMzEgKi8gIlNJR1hGU1oiLAorICAvKiAzMiAqLyAiU0lHV0FJVElORyIsCisgIC8qIDMzICovICJTSUdMV1AiLAorICAvKiAzNCAqLyAiU0lHRlJFRVpFIiwKKyAgLyogMzUgKi8gIlNJR1RIQVciLAorICAvKiAzNiAqLyAiU0lHQ0FOQ0VMIiwKK307CisKK3N0YXRpYyBlbXVsX3N5c2NhbGwgZW11bF9zb2xhcmlzX3N5c2NhbGxzID0geworICBzb2xhcmlzX2Rlc2NyaXB0b3JzLAorICBzaXplb2Yoc29sYXJpc19kZXNjcmlwdG9ycykgLyBzaXplb2Yoc29sYXJpc19kZXNjcmlwdG9yc1swXSksCisgIHNvbGFyaXNfZXJyb3JfbmFtZXMsCisgIHNpemVvZihzb2xhcmlzX2Vycm9yX25hbWVzKSAvIHNpemVvZihzb2xhcmlzX2Vycm9yX25hbWVzWzBdKSwKKyAgc29sYXJpc19zaWduYWxfbmFtZXMsCisgIHNpemVvZihzb2xhcmlzX3NpZ25hbF9uYW1lcykgLyBzaXplb2Yoc29sYXJpc19zaWduYWxfbmFtZXNbMF0pLAorfTsKKworCisvKiBTb2xhcmlzJ3Mgb3NfZW11bCBpbnRlcmZhY2UsIG1vc3QgYXJlIGp1c3QgcGFzc2VkIG9uIHRvIHRoZSBnZW5lcmljCisgICBzeXNjYWxsIHN0dWZmICovCisKK3N0YXRpYyBvc19lbXVsX2RhdGEgKgorZW11bF9zb2xhcmlzX2NyZWF0ZShkZXZpY2UgKnJvb3QsCisJCSAgICBiZmQgKmltYWdlLAorCQkgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgLyogY2hlY2sgdGhhdCB0aGlzIGVtdWxhdGlvbiBpcyByZWFsbHkgZm9yIHVzICovCisgIGlmIChuYW1lICE9IE5VTEwgJiYgc3RyY21wKG5hbWUsICJzb2xhcmlzIikgIT0gMCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoaW1hZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gZW11bF91bml4X2NyZWF0ZShyb290LCBpbWFnZSwgInNvbGFyaXMiLCAmZW11bF9zb2xhcmlzX3N5c2NhbGxzKTsKK30KKyAgCitzdGF0aWMgdm9pZAorZW11bF9zb2xhcmlzX2luaXQob3NfZW11bF9kYXRhICplbXVsX2RhdGEsCisJCSAgaW50IG5yX2NwdXMpCit7CisgIC8qIG5vdGhpbmcgeWV0ICovCit9CisKK3N0YXRpYyB2b2lkCitlbXVsX3NvbGFyaXNfc3lzdGVtX2NhbGwoY3B1ICpwcm9jZXNzb3IsCisJCQkgdW5zaWduZWRfd29yZCBjaWEsCisJCQkgb3NfZW11bF9kYXRhICplbXVsX2RhdGEpCit7CisgIGVtdWxfZG9fc3lzdGVtX2NhbGwoZW11bF9kYXRhLAorCQkgICAgICBlbXVsX2RhdGEtPnN5c2NhbGxzLAorCQkgICAgICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclswXSwKKwkJICAgICAgMywgLypyMyBjb250YWlucyBhcmcwKi8KKwkJICAgICAgcHJvY2Vzc29yLAorCQkgICAgICBjaWEpOworfQorCitjb25zdCBvc19lbXVsIGVtdWxfc29sYXJpcyA9IHsKKyAgInNvbGFyaXMiLAorICBlbXVsX3NvbGFyaXNfY3JlYXRlLAorICBlbXVsX3NvbGFyaXNfaW5pdCwKKyAgZW11bF9zb2xhcmlzX3N5c3RlbV9jYWxsLAorICAwLCAvKmluc3RydWN0aW9uX2NhbGwqLworICAwICAvKmRhdGEqLworfTsKKworDAorLyogRU1VTEFUSU9OCisKKyAgIExpbnV4IC0gRW11bGF0aW9uIG9mIHVzZXIgcHJvZ3JhbXMgZm9yIExpbnV4L1BQQworCisgICBERVNDUklQVElPTgorCisgICAqLworCisKKy8qIExpbnV4IHNwZWNpZmljIGltcGxlbWVudGF0aW9uICovCisKK3R5cGVkZWYgdW5zaWduZWQzMglsaW51eF9kZXZfdDsKK3R5cGVkZWYgdW5zaWduZWQzMglsaW51eF9pbm9fdDsKK3R5cGVkZWYgdW5zaWduZWQzMglsaW51eF9tb2RlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkMTYJbGludXhfbmxpbmtfdDsKK3R5cGVkZWYgc2lnbmVkMzIJbGludXhfb2ZmX3Q7Cit0eXBlZGVmIHNpZ25lZDMyCWxpbnV4X3BpZF90OwordHlwZWRlZiB1bnNpZ25lZDMyCWxpbnV4X3VpZF90OwordHlwZWRlZiB1bnNpZ25lZDMyCWxpbnV4X2dpZF90OwordHlwZWRlZiB1bnNpZ25lZDMyCWxpbnV4X3NpemVfdDsKK3R5cGVkZWYgc2lnbmVkMzIJbGludXhfc3NpemVfdDsKK3R5cGVkZWYgc2lnbmVkMzIJbGludXhfcHRyZGlmZl90OwordHlwZWRlZiBzaWduZWQzMglsaW51eF90aW1lX3Q7Cit0eXBlZGVmIHNpZ25lZDMyCWxpbnV4X2Nsb2NrX3Q7Cit0eXBlZGVmIHNpZ25lZDMyCWxpbnV4X2RhZGRyX3Q7CisKKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKy8qIEZvciB0aGUgUG93ZXJQQywgZG9uJ3QgYm90aCB3aXRoIHRoZSAnb2xkJyBzdGF0IHN0cnVjdHVyZSwgc2luY2UgdGhlcmUKKyAgIHNob3VsZCBiZSBubyBleHRhbnQgYmluYXJpZXMgd2l0aCB0aGF0IHN0cnVjdHVyZS4gICovCisKK3N0cnVjdCBsaW51eF9zdGF0IHsKKwlsaW51eF9kZXZfdAlzdF9kZXY7CisJbGludXhfaW5vX3QJc3RfaW5vOworCWxpbnV4X21vZGVfdAlzdF9tb2RlOworCWxpbnV4X25saW5rX3QJc3Rfbmxpbms7CisJbGludXhfdWlkX3QgCXN0X3VpZDsKKwlsaW51eF9naWRfdCAJc3RfZ2lkOworCWxpbnV4X2Rldl90CXN0X3JkZXY7CisJbGludXhfb2ZmX3QJc3Rfc2l6ZTsKKwl1bnNpZ25lZDMyICAJc3RfYmxrc2l6ZTsKKwl1bnNpZ25lZDMyICAJc3RfYmxvY2tzOworCXVuc2lnbmVkMzIgIAlzdF9hdGlteDsJLyogZG9uJ3QgdXNlIHN0X3thLGMsbX10aW1lLCB0aGF0IG1pZ2h0IGEgbWFjcm8gKi8KKwl1bnNpZ25lZDMyICAJX191bnVzZWQxOwkvKiBkZWZpbmVkIGJ5IHRoZSBob3N0J3Mgc3RhdC5oICovCisJdW5zaWduZWQzMiAgCXN0X210aW14OworCXVuc2lnbmVkMzIgIAlfX3VudXNlZDI7CisJdW5zaWduZWQzMiAgCXN0X2N0aW14OworCXVuc2lnbmVkMzIgIAlfX3VudXNlZDM7CisJdW5zaWduZWQzMiAgCV9fdW51c2VkNDsKKwl1bnNpZ25lZDMyICAJX191bnVzZWQ1OworfTsKKworLyogQ29udmVydCBmcm9tIGhvc3Qgc3RhdCBzdHJ1Y3R1cmUgdG8gc29sYXJpcyBzdGF0IHN0cnVjdHVyZSAqLworU1RBVElDX0lOTElORV9FTVVMX1VOSVggdm9pZAorY29udmVydF90b19saW51eF9zdGF0KHVuc2lnbmVkX3dvcmQgYWRkciwKKwkJICAgICAgc3RydWN0IHN0YXQgKmhvc3QsCisJCSAgICAgIGNwdSAqcHJvY2Vzc29yLAorCQkgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgc3RydWN0IGxpbnV4X3N0YXQgdGFyZ2V0OworCisgIHRhcmdldC5zdF9kZXYgICA9IEgyVF80KGhvc3QtPnN0X2Rldik7CisgIHRhcmdldC5zdF9pbm8gICA9IEgyVF80KGhvc3QtPnN0X2lubyk7CisgIHRhcmdldC5zdF9tb2RlICA9IEgyVF80KGhvc3QtPnN0X21vZGUpOworICB0YXJnZXQuc3RfbmxpbmsgPSBIMlRfMihob3N0LT5zdF9ubGluayk7CisgIHRhcmdldC5zdF91aWQgICA9IEgyVF80KGhvc3QtPnN0X3VpZCk7CisgIHRhcmdldC5zdF9naWQgICA9IEgyVF80KGhvc3QtPnN0X2dpZCk7CisgIHRhcmdldC5zdF9zaXplICA9IEgyVF80KGhvc3QtPnN0X3NpemUpOworCisjaWZkZWYgSEFWRV9TVF9SREVWCisgIHRhcmdldC5zdF9yZGV2ICA9IEgyVF80KGhvc3QtPnN0X3JkZXYpOworI2Vsc2UKKyAgdGFyZ2V0LnN0X3JkZXYgID0gMDsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVF9CTEtTSVpFCisgIHRhcmdldC5zdF9ibGtzaXplID0gSDJUXzQoaG9zdC0+c3RfYmxrc2l6ZSk7CisjZWxzZQorICB0YXJnZXQuc3RfYmxrc2l6ZSA9IDA7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RfQkxPQ0tTCisgIHRhcmdldC5zdF9ibG9ja3MgID0gSDJUXzQoaG9zdC0+c3RfYmxvY2tzKTsKKyNlbHNlCisgIHRhcmdldC5zdF9ibG9ja3MgID0gMDsKKyNlbmRpZgorCisgIHRhcmdldC5zdF9hdGlteCAgID0gSDJUXzQoaG9zdC0+c3RfYXRpbWUpOworICB0YXJnZXQuc3RfY3RpbXggICA9IEgyVF80KGhvc3QtPnN0X2N0aW1lKTsKKyAgdGFyZ2V0LnN0X210aW14ICAgPSBIMlRfNChob3N0LT5zdF9tdGltZSk7CisgIHRhcmdldC5fX3VudXNlZDEgID0gMDsKKyAgdGFyZ2V0Ll9fdW51c2VkMiAgPSAwOworICB0YXJnZXQuX191bnVzZWQzICA9IDA7CisgIHRhcmdldC5fX3VudXNlZDQgID0gMDsKKyAgdGFyZ2V0Ll9fdW51c2VkNSAgPSAwOworCisgIGVtdWxfd3JpdGVfYnVmZmVyKCZ0YXJnZXQsIGFkZHIsIHNpemVvZih0YXJnZXQpLCBwcm9jZXNzb3IsIGNpYSk7Cit9CisjZW5kaWYgLyogSEFWRV9TWVNfU1RBVF9IICovCisKKyNpZm5kZWYgSEFWRV9TVEFUCisjZGVmaW5lIGRvX2xpbnV4X3N0YXQgMAorI2Vsc2UKK3N0YXRpYyB2b2lkCitkb19saW51eF9zdGF0KG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgICAgICB1bnNpZ25lZCBjYWxsLAorCSAgICAgIGNvbnN0IGludCBhcmcwLAorCSAgICAgIGNwdSAqcHJvY2Vzc29yLAorCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICB1bnNpZ25lZF93b3JkIHBhdGhfYWRkciA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICB1bnNpZ25lZF93b3JkIHN0YXRfcGt0ID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKKyAgY2hhciBwYXRoX2J1ZltQQVRIX01BWF07CisgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgY2hhciAqcGF0aCA9IGVtdWxfcmVhZF9zdHJpbmcocGF0aF9idWYsIHBhdGhfYWRkciwgUEFUSF9NQVgsIHByb2Nlc3NvciwgY2lhKTsKKyAgaW50IHN0YXR1czsKKworICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiMHglbHggWyVzXSwgMHglbHgiLCAobG9uZylwYXRoX2FkZHIsIHBhdGgsIChsb25nKXN0YXRfcGt0KTsKKworICBzdGF0dXMgPSBzdGF0IChwYXRoLCAmYnVmKTsKKyAgaWYgKHN0YXR1cyA9PSAwKQorICAgIGNvbnZlcnRfdG9fbGludXhfc3RhdCAoc3RhdF9wa3QsICZidWYsIHByb2Nlc3NvciwgY2lhKTsKKworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9MU1RBVAorI2RlZmluZSBkb19saW51eF9sc3RhdCAwCisjZWxzZQorc3RhdGljIHZvaWQKK2RvX2xpbnV4X2xzdGF0KG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgICAgICAgdW5zaWduZWQgY2FsbCwKKwkgICAgICAgY29uc3QgaW50IGFyZzAsCisJICAgICAgIGNwdSAqcHJvY2Vzc29yLAorCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgdW5zaWduZWRfd29yZCBwYXRoX2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgdW5zaWduZWRfd29yZCBzdGF0X3BrdCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisgIGNoYXIgcGF0aF9idWZbUEFUSF9NQVhdOworICBzdHJ1Y3Qgc3RhdCBidWY7CisgIGNoYXIgKnBhdGggPSBlbXVsX3JlYWRfc3RyaW5nKHBhdGhfYnVmLCBwYXRoX2FkZHIsIFBBVEhfTUFYLCBwcm9jZXNzb3IsIGNpYSk7CisgIGludCBzdGF0dXM7CisKKyAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX29zX2VtdWxdKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIjB4JWx4IFslc10sIDB4JWx4IiwgKGxvbmcpcGF0aF9hZGRyLCBwYXRoLCAobG9uZylzdGF0X3BrdCk7CisKKyAgc3RhdHVzID0gbHN0YXQgKHBhdGgsICZidWYpOworICBpZiAoc3RhdHVzID09IDApCisgICAgY29udmVydF90b19saW51eF9zdGF0IChzdGF0X3BrdCwgJmJ1ZiwgcHJvY2Vzc29yLCBjaWEpOworCisgIGVtdWxfd3JpdGVfc3RhdHVzKHByb2Nlc3Nvciwgc3RhdHVzLCBlcnJubyk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0ZTVEFUCisjZGVmaW5lIGRvX2xpbnV4X2ZzdGF0IDAKKyNlbHNlCitzdGF0aWMgdm9pZAorZG9fbGludXhfZnN0YXQob3NfZW11bF9kYXRhICplbXVsLAorCSAgICAgICB1bnNpZ25lZCBjYWxsLAorCSAgICAgICBjb25zdCBpbnQgYXJnMCwKKwkgICAgICAgY3B1ICpwcm9jZXNzb3IsCisJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBpbnQgZmlsZGVzID0gKGludCljcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwXTsKKyAgdW5zaWduZWRfd29yZCBzdGF0X3BrdCA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzArMV07CisgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgaW50IHN0YXR1czsKKworICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2Vfb3NfZW11bF0pCisgICAgcHJpbnRmX2ZpbHRlcmVkICgiJWQsIDB4JWx4IiwgZmlsZGVzLCAobG9uZylzdGF0X3BrdCk7CisKKyAgc3RhdHVzID0gZnN0YXQgKGZpbGRlcywgJmJ1Zik7CisgIGlmIChzdGF0dXMgPT0gMCkKKyAgICBjb252ZXJ0X3RvX2xpbnV4X3N0YXQgKHN0YXRfcGt0LCAmYnVmLCBwcm9jZXNzb3IsIGNpYSk7CisKKyAgZW11bF93cml0ZV9zdGF0dXMocHJvY2Vzc29yLCBzdGF0dXMsIGVycm5vKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX1RFUk1JT19TVFJVQ1RVUkUpIHx8IGRlZmluZWQoSEFWRV9URVJNSU9TX1NUUlVDVFVSRSkKKyNkZWZpbmUgTElOVVhfTkNDCQkxMAorI2RlZmluZSBMSU5VWF9OQ0NTCQkxOQorCQorI2RlZmluZQlMSU5VWF9WSU5UUgkJIDAKKyNkZWZpbmUJTElOVVhfVlFVSVQJCSAxCisjZGVmaW5lCUxJTlVYX1ZFUkFTRQkJIDIKKyNkZWZpbmUJTElOVVhfVktJTEwJCSAzCisjZGVmaW5lCUxJTlVYX1ZFT0YJCSA0CisjZGVmaW5lIExJTlVYX1ZNSU4JCSA1CisjZGVmaW5lCUxJTlVYX1ZFT0wJCSA2CisjZGVmaW5lCUxJTlVYX1ZUSU1FCQkgNworI2RlZmluZSBMSU5VWF9WRU9MMgkJIDgKKyNkZWZpbmUgTElOVVhfVlNXVEMJCSA5CisjZGVmaW5lIExJTlVYX1ZXRVJBU0UgCQkxMAorI2RlZmluZSBMSU5VWF9WUkVQUklOVAkJMTEKKyNkZWZpbmUgTElOVVhfVlNVU1AgCQkxMgorI2RlZmluZSBMSU5VWF9WU1RBUlQJCTEzCisjZGVmaW5lIExJTlVYX1ZTVE9QCQkxNAorI2RlZmluZSBMSU5VWF9WTE5FWFQJCTE1CisjZGVmaW5lIExJTlVYX1ZESVNDQVJECQkxNgorCQorI2RlZmluZSBMSU5VWF9JT0NfTlJCSVRTCSA4CisjZGVmaW5lIExJTlVYX0lPQ19UWVBFQklUUwkgOAorI2RlZmluZSBMSU5VWF9JT0NfU0laRUJJVFMJMTMKKyNkZWZpbmUgTElOVVhfSU9DX0RJUkJJVFMJIDMKKworI2RlZmluZSBMSU5VWF9JT0NfTlJNQVNLCSgoMSA8PCBMSU5VWF9JT0NfTlJCSVRTKS0xKQorI2RlZmluZSBMSU5VWF9JT0NfVFlQRU1BU0sJKCgxIDw8IExJTlVYX0lPQ19UWVBFQklUUyktMSkKKyNkZWZpbmUgTElOVVhfSU9DX1NJWkVNQVNLCSgoMSA8PCBMSU5VWF9JT0NfU0laRUJJVFMpLTEpCisjZGVmaW5lIExJTlVYX0lPQ19ESVJNQVNLCSgoMSA8PCBMSU5VWF9JT0NfRElSQklUUyktMSkKKworI2RlZmluZSBMSU5VWF9JT0NfTlJTSElGVAkwCisjZGVmaW5lIExJTlVYX0lPQ19UWVBFU0hJRlQJKExJTlVYX0lPQ19OUlNISUZUK0xJTlVYX0lPQ19OUkJJVFMpCisjZGVmaW5lIExJTlVYX0lPQ19TSVpFU0hJRlQJKExJTlVYX0lPQ19UWVBFU0hJRlQrTElOVVhfSU9DX1RZUEVCSVRTKQorI2RlZmluZSBMSU5VWF9JT0NfRElSU0hJRlQJKExJTlVYX0lPQ19TSVpFU0hJRlQrTElOVVhfSU9DX1NJWkVCSVRTKQorCisvKgorICogRGlyZWN0aW9uIGJpdHMgX0lPQ19OT05FIGNvdWxkIGJlIDAsIGJ1dCBPU0YvMSBnaXZlcyBpdCBhIGJpdC4KKyAqIEFuZCB0aGlzIHR1cm5zIG91dCB1c2VmdWwgdG8gY2F0Y2ggb2xkIGlvY3RsIG51bWJlcnMgaW4gaGVhZGVyCisgKiBmaWxlcyBmb3IgdXMuCisgKi8KKyNkZWZpbmUgTElOVVhfSU9DX05PTkUJCTFVCisjZGVmaW5lIExJTlVYX0lPQ19SRUFECQkyVQorI2RlZmluZSBMSU5VWF9JT0NfV1JJVEUJCTRVCisKKyNkZWZpbmUgTElOVVhfSU9DKGRpcix0eXBlLG5yLHNpemUpIFwKKwkoKChkaXIpICA8PCBMSU5VWF9JT0NfRElSU0hJRlQpIHwgXAorCSAoKHR5cGUpIDw8IExJTlVYX0lPQ19UWVBFU0hJRlQpIHwgXAorCSAoKG5yKSAgIDw8IExJTlVYX0lPQ19OUlNISUZUKSB8IFwKKwkgKChzaXplKSA8PCBMSU5VWF9JT0NfU0laRVNISUZUKSkKKworLyogdXNlZCB0byBjcmVhdGUgbnVtYmVycyAqLworI2RlZmluZSBMSU5VWF9JTyh0eXBlLG5yKQkgTElOVVhfSU9DKExJTlVYX0lPQ19OT05FLCh0eXBlKSwobnIpLDApCisjZGVmaW5lIExJTlVYX0lPUih0eXBlLG5yLHNpemUpCSBMSU5VWF9JT0MoTElOVVhfSU9DX1JFQUQsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQorI2RlZmluZSBMSU5VWF9JT1codHlwZSxucixzaXplKQkgTElOVVhfSU9DKExJTlVYX0lPQ19XUklURSwodHlwZSksKG5yKSxzaXplb2Yoc2l6ZSkpCisjZGVmaW5lIExJTlVYX0lPV1IodHlwZSxucixzaXplKSBMSU5VWF9JT0MoTElOVVhfSU9DX1JFQUR8TElOVVhfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX1RFUk1JT19TVFJVQ1RVUkUpIHx8IGRlZmluZWQoSEFWRV9URVJNSU9TX1NUUlVDVFVSRSkKKy8qIENvbnZlcnQgdG8vZnJvbSBob3N0IHRlcm1pbyBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IGxpbnV4X3Rlcm1pbyB7CisJdW5zaWduZWQxNgljX2lmbGFnOwkJLyogaW5wdXQgbW9kZXMgKi8KKwl1bnNpZ25lZDE2CWNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZXMgKi8KKwl1bnNpZ25lZDE2CWNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGVzICovCisJdW5zaWduZWQxNgljX2xmbGFnOwkJLyogbGluZSBkaXNjaXBsaW5lIG1vZGVzICovCisJdW5zaWduZWQ4CWNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKwl1bnNpZ25lZDgJY19jY1tMSU5VWF9OQ0NdOwkvKiBjb250cm9sIGNoYXJzICovCit9OworCitTVEFUSUNfSU5MSU5FX0VNVUxfVU5JWCB2b2lkCitjb252ZXJ0X3RvX2xpbnV4X3Rlcm1pbyh1bnNpZ25lZF93b3JkIGFkZHIsCisJCQlzdHJ1Y3QgdGVybWlvICpob3N0LAorCQkJY3B1ICpwcm9jZXNzb3IsCisJCQl1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgc3RydWN0IGxpbnV4X3Rlcm1pbyB0YXJnZXQ7CisgIGludCBpOworCisgIHRhcmdldC5jX2lmbGFnID0gSDJUXzIgKGhvc3QtPmNfaWZsYWcpOworICB0YXJnZXQuY19vZmxhZyA9IEgyVF8yIChob3N0LT5jX29mbGFnKTsKKyAgdGFyZ2V0LmNfY2ZsYWcgPSBIMlRfMiAoaG9zdC0+Y19jZmxhZyk7CisgIHRhcmdldC5jX2xmbGFnID0gSDJUXzIgKGhvc3QtPmNfbGZsYWcpOworCisjaWYgZGVmaW5lZChIQVZFX1RFUk1JT19DTElORSkgfHwgZGVmaW5lZChIQVZFX1RFUk1JT1NfQ0xJTkUpCisgIHRhcmdldC5jX2xpbmUgID0gaG9zdC0+Y19saW5lOworI2Vsc2UKKyAgdGFyZ2V0LmNfbGluZSAgPSAwOworI2VuZGlmCisKKyAgZm9yIChpID0gMDsgaSA8IExJTlVYX05DQzsgaSsrKQorICAgIHRhcmdldC5jX2NjW2ldID0gMDsKKworI2lmZGVmIFZJTlRSCisgIHRhcmdldC5jX2NjW0xJTlVYX1ZJTlRSXSA9IGhvc3QtPmNfY2NbVklOVFJdOworI2VuZGlmCisKKyNpZmRlZiBWUVVJVAorICB0YXJnZXQuY19jY1tMSU5VWF9WUVVJVF0gPSBob3N0LT5jX2NjW1ZRVUlUXTsKKyNlbmRpZgorCisjaWZkZWYgVkVSQVNFCisgIHRhcmdldC5jX2NjW0xJTlVYX1ZFUkFTRV0gPSBob3N0LT5jX2NjW1ZFUkFTRV07CisjZW5kaWYKKworI2lmZGVmIFZLSUxMCisgIHRhcmdldC5jX2NjW0xJTlVYX1ZLSUxMXSA9IGhvc3QtPmNfY2NbVktJTExdOworI2VuZGlmCisKKyNpZmRlZiBWRU9GCisgIHRhcmdldC5jX2NjW0xJTlVYX1ZFT0ZdID0gaG9zdC0+Y19jY1tWRU9GXTsKKyNlbmRpZgorCisjaWZkZWYgVk1JTgorICB0YXJnZXQuY19jY1tMSU5VWF9WTUlOXSA9IGhvc3QtPmNfY2NbVk1JTl07CisjZW5kaWYKKworI2lmZGVmIFZFT0wKKyAgdGFyZ2V0LmNfY2NbTElOVVhfVkVPTF0gPSBob3N0LT5jX2NjW1ZFT0xdOworI2VuZGlmCisKKyNpZmRlZiBWVElNRQorICB0YXJnZXQuY19jY1tMSU5VWF9WVElNRV0gPSBob3N0LT5jX2NjW1ZUSU1FXTsKKyNlbmRpZgorCisjaWZkZWYgVkVPTDIKKyAgdGFyZ2V0LmNfY2NbTElOVVhfVkVPTDJdID0gaG9zdC0+Y19jY1tWRU9MMl07CisjZW5kaWYKKworI2lmZGVmIFZTV1RDCisgIHRhcmdldC5jX2NjW0xJTlVYX1ZTV1RDXSA9IGhvc3QtPmNfY2NbVlNXVENdOworI2VuZGlmCisKKyNpZmRlZiBWU1dUQ0gKKyAgdGFyZ2V0LmNfY2NbTElOVVhfVlNXVENdID0gaG9zdC0+Y19jY1tWU1dUQ0hdOworI2VuZGlmCisKKyAgZW11bF93cml0ZV9idWZmZXIoJnRhcmdldCwgYWRkciwgc2l6ZW9mKHRhcmdldCksIHByb2Nlc3NvciwgY2lhKTsKK30KKyNlbmRpZiAvKiBIQVZFX1RFUk1JT19TVFJVQ1RVUkUgKi8KKworI2lmZGVmIEhBVkVfVEVSTUlPU19TVFJVQ1RVUkUKKy8qIENvbnZlcnQgdG8vZnJvbSBob3N0IHRlcm1pb3Mgc3RydWN0dXJlICovCisKK3R5cGVkZWYgdW5zaWduZWQzMiBsaW51eF90Y2ZsYWdfdDsKK3R5cGVkZWYgdW5zaWduZWQ4ICBsaW51eF9jY190OwordHlwZWRlZiB1bnNpZ25lZDMyIGxpbnV4X3NwZWVkX3Q7CisKK3N0cnVjdCBsaW51eF90ZXJtaW9zIHsKKyAgbGludXhfdGNmbGFnX3QJY19pZmxhZzsKKyAgbGludXhfdGNmbGFnX3QJY19vZmxhZzsKKyAgbGludXhfdGNmbGFnX3QJY19jZmxhZzsKKyAgbGludXhfdGNmbGFnX3QJY19sZmxhZzsKKyAgbGludXhfY2NfdAkJY19jY1tMSU5VWF9OQ0NTXTsKKyAgbGludXhfY2NfdAkJY19saW5lOworICBzaWduZWQzMgkJY19pc3BlZWQ7CisgIHNpZ25lZDMyCQljX29zcGVlZDsKK307CisKK1NUQVRJQ19JTkxJTkVfRU1VTF9VTklYIHZvaWQKK2NvbnZlcnRfdG9fbGludXhfdGVybWlvcyh1bnNpZ25lZF93b3JkIGFkZHIsCisJCQkgc3RydWN0IHRlcm1pb3MgKmhvc3QsCisJCQkgY3B1ICpwcm9jZXNzb3IsCisJCQkgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHN0cnVjdCBsaW51eF90ZXJtaW9zIHRhcmdldDsKKyAgaW50IGk7CisKKyAgdGFyZ2V0LmNfaWZsYWcgPSBIMlRfNCAoaG9zdC0+Y19pZmxhZyk7CisgIHRhcmdldC5jX29mbGFnID0gSDJUXzQgKGhvc3QtPmNfb2ZsYWcpOworICB0YXJnZXQuY19jZmxhZyA9IEgyVF80IChob3N0LT5jX2NmbGFnKTsKKyAgdGFyZ2V0LmNfbGZsYWcgPSBIMlRfNCAoaG9zdC0+Y19sZmxhZyk7CisKKyAgZm9yIChpID0gMDsgaSA8IExJTlVYX05DQ1M7IGkrKykKKyAgICB0YXJnZXQuY19jY1tpXSA9IDA7CisKKyNpZmRlZiBWSU5UUgorICB0YXJnZXQuY19jY1tMSU5VWF9WSU5UUl0gPSBob3N0LT5jX2NjW1ZJTlRSXTsKKyNlbmRpZgorCisjaWZkZWYgVlFVSVQKKyAgdGFyZ2V0LmNfY2NbTElOVVhfVlFVSVRdID0gaG9zdC0+Y19jY1tWUVVJVF07CisjZW5kaWYKKworI2lmZGVmIFZFUkFTRQorICB0YXJnZXQuY19jY1tMSU5VWF9WRVJBU0VdID0gaG9zdC0+Y19jY1tWRVJBU0VdOworI2VuZGlmCisKKyNpZmRlZiBWS0lMTAorICB0YXJnZXQuY19jY1tMSU5VWF9WS0lMTF0gPSBob3N0LT5jX2NjW1ZLSUxMXTsKKyNlbmRpZgorCisjaWZkZWYgVkVPRgorICB0YXJnZXQuY19jY1tMSU5VWF9WRU9GXSA9IGhvc3QtPmNfY2NbVkVPRl07CisjZW5kaWYKKworI2lmZGVmIFZFT0wKKyAgdGFyZ2V0LmNfY2NbTElOVVhfVkVPTF0gPSBob3N0LT5jX2NjW1ZFT0xdOworI2VuZGlmCisKKyNpZmRlZiBWRU9MMgorICB0YXJnZXQuY19jY1tMSU5VWF9WRU9MMl0gPSBob3N0LT5jX2NjW1ZFT0wyXTsKKyNlbmRpZgorCisjaWZkZWYgVlNXVENICisgIHRhcmdldC5jX2NjW0xJTlVYX1ZTV1RDXSA9IGhvc3QtPmNfY2NbVlNXVENIXTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9URVJNSU9TX0NMSU5FCisgIHRhcmdldC5jX2xpbmUgICA9IGhvc3QtPmNfbGluZTsKKyNlbHNlCisgIHRhcmdldC5jX2xpbmUgICA9IDA7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ0ZHRVRJU1BFRUQKKyAgdGFyZ2V0LmNfaXNwZWVkID0gY2ZnZXRpc3BlZWQgKGhvc3QpOworI2Vsc2UKKyAgdGFyZ2V0LmNfaXNwZWVkID0gMDsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DRkdFVE9TUEVFRAorICB0YXJnZXQuY19vc3BlZWQgPSBjZmdldG9zcGVlZCAoaG9zdCk7CisjZWxzZQorICB0YXJnZXQuY19vc3BlZWQgPSAwOworI2VuZGlmCisKKyAgZW11bF93cml0ZV9idWZmZXIoJnRhcmdldCwgYWRkciwgc2l6ZW9mKHRhcmdldCksIHByb2Nlc3NvciwgY2lhKTsKK30KKyNlbmRpZiAvKiBIQVZFX1RFUk1JT1NfU1RSVUNUVVJFICovCisKKyNpZm5kZWYgSEFWRV9JT0NUTAorI2RlZmluZSBkb19saW51eF9pb2N0bCAwCisjZWxzZQorc3RhdGljIHZvaWQKK2RvX2xpbnV4X2lvY3RsKG9zX2VtdWxfZGF0YSAqZW11bCwKKwkgICAgICAgdW5zaWduZWQgY2FsbCwKKwkgICAgICAgY29uc3QgaW50IGFyZzAsCisJICAgICAgIGNwdSAqcHJvY2Vzc29yLAorCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgaW50IGZpbGRlcyA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2FyZzBdOworICB1bnNpZ25lZCByZXF1ZXN0ID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbYXJnMCsxXTsKKyAgdW5zaWduZWRfd29yZCBhcmdwX2FkZHIgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwclthcmcwKzJdOworICBpbnQgc3RhdHVzID0gMDsKKyAgY29uc3QgY2hhciAqbmFtZSA9ICI8dW5rbm93bj4iOworCisjaWZkZWYgSEFWRV9URVJNSU9TX1NUUlVDVFVSRQorICBzdHJ1Y3QgdGVybWlvcyBob3N0X3Rlcm1pbzsKKworI2Vsc2UKKyNpZmRlZiBIQVZFX1RFUk1JT19TVFJVQ1RVUkUKKyAgc3RydWN0IHRlcm1pbyBob3N0X3Rlcm1pbzsKKyNlbmRpZgorI2VuZGlmCisKKyAgc3dpdGNoIChyZXF1ZXN0KQorICAgIHsKKyAgICBjYXNlIDA6CQkJCQkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgY2FzZSAqLworICAgIGRlZmF1bHQ6CisgICAgICBzdGF0dXMgPSAtMTsKKyAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgYnJlYWs7CisKKyNpZiBkZWZpbmVkKEhBVkVfVEVSTUlPX1NUUlVDVFVSRSkgfHwgZGVmaW5lZChIQVZFX1RFUk1JT1NfU1RSVUNUVVJFKQorI2lmIGRlZmluZWQoVENHRVRBKSB8fCBkZWZpbmVkKFRDR0VUUykgfHwgZGVmaW5lZChIQVZFX1RDR0VUQVRUUikKKyAgICBjYXNlIExJTlVYX0lPUigndCcsIDIzLCBzdHJ1Y3QgbGludXhfdGVybWlvKToJLyogVENHRVRBICovCisgICAgICBuYW1lID0gIlRDR0VUQSI7CisjaWZkZWYgSEFWRV9UQ0dFVEFUVFIKKyAgICAgIHN0YXR1cyA9IHRjZ2V0YXR0cihmaWxkZXMsICZob3N0X3Rlcm1pbyk7CisjZWxpZiBkZWZpbmVkKFRDR0VUUykKKyAgICAgIHN0YXR1cyA9IGlvY3RsIChmaWxkZXMsIFRDR0VUUywgJmhvc3RfdGVybWlvKTsKKyNlbHNlCisgICAgICBzdGF0dXMgPSBpb2N0bCAoZmlsZGVzLCBUQ0dFVEEsICZob3N0X3Rlcm1pbyk7CisjZW5kaWYKKyAgICAgIGlmIChzdGF0dXMgPT0gMCkKKwljb252ZXJ0X3RvX2xpbnV4X3Rlcm1pbyAoYXJncF9hZGRyLCAmaG9zdF90ZXJtaW8sIHByb2Nlc3NvciwgY2lhKTsKKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIFRDR0VUQSAqLworI2VuZGlmIC8qIEhBVkVfVEVSTUlPX1NUUlVDVFVSRSAqLworCisjaWZkZWYgSEFWRV9URVJNSU9TX1NUUlVDVFVSRQorI2lmIGRlZmluZWQoVENHRVRTKSB8fCBkZWZpbmVkKEhBVkVfVENHRVRBVFRSKQorICAgIGNhc2UgTElOVVhfSU9SKCd0JywgMTksIHN0cnVjdCBsaW51eF90ZXJtaW9zKToJLyogVENHRVRTICovCisgICAgICBuYW1lID0gIlRDR0VUUyI7CisjaWZkZWYgSEFWRV9UQ0dFVEFUVFIKKyAgICAgIHN0YXR1cyA9IHRjZ2V0YXR0cihmaWxkZXMsICZob3N0X3Rlcm1pbyk7CisjZWxzZQorICAgICAgc3RhdHVzID0gaW9jdGwgKGZpbGRlcywgVENHRVRTLCAmaG9zdF90ZXJtaW8pOworI2VuZGlmCisgICAgICBpZiAoc3RhdHVzID09IDApCisJY29udmVydF90b19saW51eF90ZXJtaW9zIChhcmdwX2FkZHIsICZob3N0X3Rlcm1pbywgcHJvY2Vzc29yLCBjaWEpOworICAgICAgYnJlYWs7CisjZW5kaWYgLyogVENHRVRTICovCisjZW5kaWYgLyogSEFWRV9URVJNSU9TX1NUUlVDVFVSRSAqLworICAgIH0KKworICBlbXVsX3dyaXRlX3N0YXR1cyhwcm9jZXNzb3IsIHN0YXR1cywgZXJybm8pOworCisgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9vc19lbXVsXSkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIlZCwgMHgleCBbJXNdLCAweCVseCIsIGZpbGRlcywgcmVxdWVzdCwgbmFtZSwgKGxvbmcpYXJncF9hZGRyKTsKK30KKyNlbmRpZiAvKiBIQVZFX0lPQ1RMICovCisKK3N0YXRpYyBlbXVsX3N5c2NhbGxfZGVzY3JpcHRvciBsaW51eF9kZXNjcmlwdG9yc1tdID0geworICAvKiAgIDAgKi8geyAwLCAic2V0dXAiIH0sCisgIC8qICAgMSAqLyB7IGRvX3VuaXhfZXhpdCwgImV4aXQiIH0sCisgIC8qICAgMiAqLyB7IDAsICJmb3JrIiB9LAorICAvKiAgIDMgKi8geyBkb191bml4X3JlYWQsICJyZWFkIiB9LAorICAvKiAgIDQgKi8geyBkb191bml4X3dyaXRlLCAid3JpdGUiIH0sCisgIC8qICAgNSAqLyB7IGRvX3VuaXhfb3BlbiwgIm9wZW4iIH0sCisgIC8qICAgNiAqLyB7IGRvX3VuaXhfY2xvc2UsICJjbG9zZSIgfSwKKyAgLyogICA3ICovIHsgMCwgIndhaXRwaWQiIH0sCisgIC8qICAgOCAqLyB7IDAsICJjcmVhdCIgfSwKKyAgLyogICA5ICovIHsgZG9fdW5peF9saW5rLCAibGluayIgfSwKKyAgLyogIDEwICovIHsgZG9fdW5peF91bmxpbmssICJ1bmxpbmsiIH0sCisgIC8qICAxMSAqLyB7IDAsICJleGVjdmUiIH0sCisgIC8qICAxMiAqLyB7IGRvX3VuaXhfY2hkaXIsICJjaGRpciIgfSwKKyAgLyogIDEzICovIHsgZG9fdW5peF90aW1lLCAidGltZSIgfSwKKyAgLyogIDE0ICovIHsgMCwgIm1rbm9kIiB9LAorICAvKiAgMTUgKi8geyAwLCAiY2htb2QiIH0sCisgIC8qICAxNiAqLyB7IDAsICJjaG93biIgfSwKKyAgLyogIDE3ICovIHsgMCwgImJyZWFrIiB9LAorICAvKiAgMTggKi8geyAwLCAic3RhdCIgfSwKKyAgLyogIDE5ICovIHsgZG9fdW5peF9sc2VlaywgImxzZWVrIiB9LAorICAvKiAgMjAgKi8geyBkb191bml4X2dldHBpZCwgImdldHBpZCIgfSwKKyAgLyogIDIxICovIHsgMCwgIm1vdW50IiB9LAorICAvKiAgMjIgKi8geyAwLCAidW1vdW50IiB9LAorICAvKiAgMjMgKi8geyAwLCAic2V0dWlkIiB9LAorICAvKiAgMjQgKi8geyBkb191bml4X2dldHVpZCwgImdldHVpZCIgfSwKKyAgLyogIDI1ICovIHsgMCwgInN0aW1lIiB9LAorICAvKiAgMjYgKi8geyAwLCAicHRyYWNlIiB9LAorICAvKiAgMjcgKi8geyAwLCAiYWxhcm0iIH0sCisgIC8qICAyOCAqLyB7IDAsICJmc3RhdCIgfSwKKyAgLyogIDI5ICovIHsgMCwgInBhdXNlIiB9LAorICAvKiAgMzAgKi8geyAwLCAidXRpbWUiIH0sCisgIC8qICAzMSAqLyB7IDAsICJzdHR5IiB9LAorICAvKiAgMzIgKi8geyAwLCAiZ3R0eSIgfSwKKyAgLyogIDMzICovIHsgZG9fdW5peF9hY2Nlc3MsICJhY2Nlc3MiIH0sCisgIC8qICAzNCAqLyB7IDAsICJuaWNlIiB9LAorICAvKiAgMzUgKi8geyAwLCAiZnRpbWUiIH0sCisgIC8qICAzNiAqLyB7IDAsICJzeW5jIiB9LAorICAvKiAgMzcgKi8geyAwLCAia2lsbCIgfSwKKyAgLyogIDM4ICovIHsgMCwgInJlbmFtZSIgfSwKKyAgLyogIDM5ICovIHsgZG9fdW5peF9ta2RpciwgIm1rZGlyIiB9LAorICAvKiAgNDAgKi8geyBkb191bml4X3JtZGlyLCAicm1kaXIiIH0sCisgIC8qICA0MSAqLyB7IGRvX3VuaXhfZHVwLCAiZHVwIiB9LAorICAvKiAgNDIgKi8geyAwLCAicGlwZSIgfSwKKyAgLyogIDQzICovIHsgMCwgInRpbWVzIiB9LAorICAvKiAgNDQgKi8geyAwLCAicHJvZiIgfSwKKyAgLyogIDQ1ICovIHsgZG9fdW5peF9icmVhaywgImJyayIgfSwKKyAgLyogIDQ2ICovIHsgMCwgInNldGdpZCIgfSwKKyAgLyogIDQ3ICovIHsgZG9fdW5peF9nZXRnaWQsICJnZXRnaWQiIH0sCisgIC8qICA0OCAqLyB7IDAsICJzaWduYWwiIH0sCisgIC8qICA0OSAqLyB7IGRvX3VuaXhfZ2V0ZXVpZCwgImdldGV1aWQiIH0sCisgIC8qICA1MCAqLyB7IGRvX3VuaXhfZ2V0ZWdpZCwgImdldGVnaWQiIH0sCisgIC8qICA1MSAqLyB7IDAsICJhY2N0IiB9LAorICAvKiAgNTIgKi8geyAwLCAicGh5cyIgfSwKKyAgLyogIDUzICovIHsgMCwgImxvY2siIH0sCisgIC8qICA1NCAqLyB7IGRvX2xpbnV4X2lvY3RsLCAiaW9jdGwiIH0sCisgIC8qICA1NSAqLyB7IDAsICJmY250bCIgfSwKKyAgLyogIDU2ICovIHsgMCwgIm1weCIgfSwKKyAgLyogIDU3ICovIHsgMCwgInNldHBnaWQiIH0sCisgIC8qICA1OCAqLyB7IDAsICJ1bGltaXQiIH0sCisgIC8qICA1OSAqLyB7IDAsICJvbGR1bmFtZSIgfSwKKyAgLyogIDYwICovIHsgZG9fdW5peF91bWFzaywgInVtYXNrIiB9LAorICAvKiAgNjEgKi8geyAwLCAiY2hyb290IiB9LAorICAvKiAgNjIgKi8geyAwLCAidXN0YXQiIH0sCisgIC8qICA2MyAqLyB7IGRvX3VuaXhfZHVwMiwgImR1cDIiIH0sCisgIC8qICA2NCAqLyB7IGRvX3VuaXhfZ2V0cHBpZCwgImdldHBwaWQiIH0sCisgIC8qICA2NSAqLyB7IDAsICJnZXRwZ3JwIiB9LAorICAvKiAgNjYgKi8geyAwLCAic2V0c2lkIiB9LAorICAvKiAgNjcgKi8geyAwLCAic2lnYWN0aW9uIiB9LAorICAvKiAgNjggKi8geyAwLCAic2dldG1hc2siIH0sCisgIC8qICA2OSAqLyB7IDAsICJzc2V0bWFzayIgfSwKKyAgLyogIDcwICovIHsgMCwgInNldHJldWlkIiB9LAorICAvKiAgNzEgKi8geyAwLCAic2V0cmVnaWQiIH0sCisgIC8qICA3MiAqLyB7IDAsICJzaWdzdXNwZW5kIiB9LAorICAvKiAgNzMgKi8geyAwLCAic2lncGVuZGluZyIgfSwKKyAgLyogIDc0ICovIHsgMCwgInNldGhvc3RuYW1lIiB9LAorICAvKiAgNzUgKi8geyAwLCAic2V0cmxpbWl0IiB9LAorICAvKiAgNzYgKi8geyAwLCAiZ2V0cmxpbWl0IiB9LAorICAvKiAgNzcgKi8geyBkb191bml4X2dldHJ1c2FnZSwgImdldHJ1c2FnZSIgfSwKKyAgLyogIDc4ICovIHsgZG9fdW5peF9nZXR0aW1lb2ZkYXksICJnZXR0aW1lb2ZkYXkiIH0sCisgIC8qICA3OSAqLyB7IDAsICJzZXR0aW1lb2ZkYXkiIH0sCisgIC8qICA4MCAqLyB7IDAsICJnZXRncm91cHMiIH0sCisgIC8qICA4MSAqLyB7IDAsICJzZXRncm91cHMiIH0sCisgIC8qICA4MiAqLyB7IDAsICJzZWxlY3QiIH0sCisgIC8qICA4MyAqLyB7IGRvX3VuaXhfc3ltbGluaywgInN5bWxpbmsiIH0sCisgIC8qICA4NCAqLyB7IDAsICJsc3RhdCIgfSwKKyAgLyogIDg1ICovIHsgMCwgInJlYWRsaW5rIiB9LAorICAvKiAgODYgKi8geyAwLCAidXNlbGliIiB9LAorICAvKiAgODcgKi8geyAwLCAic3dhcG9uIiB9LAorICAvKiAgODggKi8geyAwLCAicmVib290IiB9LAorICAvKiAgODkgKi8geyAwLCAicmVhZGRpciIgfSwKKyAgLyogIDkwICovIHsgMCwgIm1tYXAiIH0sCisgIC8qICA5MSAqLyB7IDAsICJtdW5tYXAiIH0sCisgIC8qICA5MiAqLyB7IDAsICJ0cnVuY2F0ZSIgfSwKKyAgLyogIDkzICovIHsgMCwgImZ0cnVuY2F0ZSIgfSwKKyAgLyogIDk0ICovIHsgMCwgImZjaG1vZCIgfSwKKyAgLyogIDk1ICovIHsgMCwgImZjaG93biIgfSwKKyAgLyogIDk2ICovIHsgMCwgImdldHByaW9yaXR5IiB9LAorICAvKiAgOTcgKi8geyAwLCAic2V0cHJpb3JpdHkiIH0sCisgIC8qICA5OCAqLyB7IDAsICJwcm9maWwiIH0sCisgIC8qICA5OSAqLyB7IDAsICJzdGF0ZnMiIH0sCisgIC8qIDEwMCAqLyB7IDAsICJmc3RhdGZzIiB9LAorICAvKiAxMDEgKi8geyAwLCAiaW9wZXJtIiB9LAorICAvKiAxMDIgKi8geyAwLCAic29ja2V0Y2FsbCIgfSwKKyAgLyogMTAzICovIHsgMCwgInN5c2xvZyIgfSwKKyAgLyogMTA0ICovIHsgMCwgInNldGl0aW1lciIgfSwKKyAgLyogMTA1ICovIHsgMCwgImdldGl0aW1lciIgfSwKKyAgLyogMTA2ICovIHsgZG9fbGludXhfc3RhdCwgIm5ld3N0YXQiIH0sCisgIC8qIDEwNyAqLyB7IGRvX2xpbnV4X2xzdGF0LCAibmV3bHN0YXQiIH0sCisgIC8qIDEwOCAqLyB7IGRvX2xpbnV4X2ZzdGF0LCAibmV3ZnN0YXQiIH0sCisgIC8qIDEwOSAqLyB7IDAsICJ1bmFtZSIgfSwKKyAgLyogMTEwICovIHsgMCwgImlvcGwiIH0sCisgIC8qIDExMSAqLyB7IDAsICJ2aGFuZ3VwIiB9LAorICAvKiAxMTIgKi8geyAwLCAiaWRsZSIgfSwKKyAgLyogMTEzICovIHsgMCwgInZtODYiIH0sCisgIC8qIDExNCAqLyB7IDAsICJ3YWl0NCIgfSwKKyAgLyogMTE1ICovIHsgMCwgInN3YXBvZmYiIH0sCisgIC8qIDExNiAqLyB7IDAsICJzeXNpbmZvIiB9LAorICAvKiAxMTcgKi8geyAwLCAiaXBjIiB9LAorICAvKiAxMTggKi8geyAwLCAiZnN5bmMiIH0sCisgIC8qIDExOSAqLyB7IDAsICJzaWdyZXR1cm4iIH0sCisgIC8qIDEyMCAqLyB7IDAsICJjbG9uZSIgfSwKKyAgLyogMTIxICovIHsgMCwgInNldGRvbWFpbm5hbWUiIH0sCisgIC8qIDEyMiAqLyB7IDAsICJuZXd1bmFtZSIgfSwKKyAgLyogMTIzICovIHsgMCwgIm1vZGlmeV9sZHQiIH0sCisgIC8qIDEyNCAqLyB7IDAsICJhZGp0aW1leCIgfSwKKyAgLyogMTI1ICovIHsgMCwgIm1wcm90ZWN0IiB9LAorICAvKiAxMjYgKi8geyAwLCAic2lncHJvY21hc2siIH0sCisgIC8qIDEyNyAqLyB7IDAsICJjcmVhdGVfbW9kdWxlIiB9LAorICAvKiAxMjggKi8geyAwLCAiaW5pdF9tb2R1bGUiIH0sCisgIC8qIDEyOSAqLyB7IDAsICJkZWxldGVfbW9kdWxlIiB9LAorICAvKiAxMzAgKi8geyAwLCAiZ2V0X2tlcm5lbF9zeW1zIiB9LAorICAvKiAxMzEgKi8geyAwLCAicXVvdGFjdGwiIH0sCisgIC8qIDEzMiAqLyB7IDAsICJnZXRwZ2lkIiB9LAorICAvKiAxMzMgKi8geyAwLCAiZmNoZGlyIiB9LAorICAvKiAxMzQgKi8geyAwLCAiYmRmbHVzaCIgfSwKKyAgLyogMTM1ICovIHsgMCwgInN5c2ZzIiB9LAorICAvKiAxMzYgKi8geyAwLCAicGVyc29uYWxpdHkiIH0sCisgIC8qIDEzNyAqLyB7IDAsICJhZnNfc3lzY2FsbCIgfSwKKyAgLyogMTM4ICovIHsgMCwgInNldGZzdWlkIiB9LAorICAvKiAxMzkgKi8geyAwLCAic2V0ZnNnaWQiIH0sCisgIC8qIDE0MCAqLyB7IDAsICJsbHNlZWsiIH0sCisgIC8qIDE0MSAqLyB7IDAsICJnZXRkZW50cyIgfSwKKyAgLyogMTQyICovIHsgMCwgIm5ld3NlbGVjdCIgfSwKKyAgLyogMTQzICovIHsgMCwgImZsb2NrIiB9LAorICAvKiAxNDQgKi8geyAwLCAibXN5bmMiIH0sCisgIC8qIDE0NSAqLyB7IDAsICJyZWFkdiIgfSwKKyAgLyogMTQ2ICovIHsgMCwgIndyaXRldiIgfSwKKyAgLyogMTQ3ICovIHsgMCwgImdldHNpZCIgfSwKKyAgLyogMTQ4ICovIHsgMCwgImZkYXRhc3luYyIgfSwKKyAgLyogMTQ5ICovIHsgMCwgInN5c2N0bCIgfSwKKyAgLyogMTUwICovIHsgMCwgIm1sb2NrIiB9LAorICAvKiAxNTEgKi8geyAwLCAibXVubG9jayIgfSwKKyAgLyogMTUyICovIHsgMCwgIm1sb2NrYWxsIiB9LAorICAvKiAxNTMgKi8geyAwLCAibXVubG9ja2FsbCIgfSwKKyAgLyogMTU0ICovIHsgMCwgInNjaGVkX3NldHBhcmFtIiB9LAorICAvKiAxNTUgKi8geyAwLCAic2NoZWRfZ2V0cGFyYW0iIH0sCisgIC8qIDE1NiAqLyB7IDAsICJzY2hlZF9zZXRzY2hlZHVsZXIiIH0sCisgIC8qIDE1NyAqLyB7IDAsICJzY2hlZF9nZXRzY2hlZHVsZXIiIH0sCisgIC8qIDE1OCAqLyB7IDAsICJzY2hlZF95aWVsZCIgfSwKKyAgLyogMTU5ICovIHsgMCwgInNjaGVkX2dldF9wcmlvcml0eV9tYXgiIH0sCisgIC8qIDE2MCAqLyB7IDAsICJzY2hlZF9nZXRfcHJpb3JpdHlfbWluIiB9LAorICAvKiAxNjEgKi8geyAwLCAic2NoZWRfcnJfZ2V0X2ludGVydmFsIiB9LAorfTsKKworc3RhdGljIGNoYXIgKihsaW51eF9lcnJvcl9uYW1lc1tdKSA9IHsKKyAgLyogICAwICovICJFU1VDQ0VTUyIsCisgIC8qICAgMSAqLyAiRVBFUk0iLAorICAvKiAgIDIgKi8gIkVOT0VOVCIsCisgIC8qICAgMyAqLyAiRVNSQ0giLAorICAvKiAgIDQgKi8gIkVJTlRSIiwKKyAgLyogICA1ICovICJFSU8iLAorICAvKiAgIDYgKi8gIkVOWElPIiwKKyAgLyogICA3ICovICJFMkJJRyIsCisgIC8qICAgOCAqLyAiRU5PRVhFQyIsCisgIC8qICAgOSAqLyAiRUJBREYiLAorICAvKiAgMTAgKi8gIkVDSElMRCIsCisgIC8qICAxMSAqLyAiRUFHQUlOIiwKKyAgLyogIDEyICovICJFTk9NRU0iLAorICAvKiAgMTMgKi8gIkVBQ0NFUyIsCisgIC8qICAxNCAqLyAiRUZBVUxUIiwKKyAgLyogIDE1ICovICJFTk9UQkxLIiwKKyAgLyogIDE2ICovICJFQlVTWSIsCisgIC8qICAxNyAqLyAiRUVYSVNUIiwKKyAgLyogIDE4ICovICJFWERFViIsCisgIC8qICAxOSAqLyAiRU5PREVWIiwKKyAgLyogIDIwICovICJFTk9URElSIiwKKyAgLyogIDIxICovICJFSVNESVIiLAorICAvKiAgMjIgKi8gIkVJTlZBTCIsCisgIC8qICAyMyAqLyAiRU5GSUxFIiwKKyAgLyogIDI0ICovICJFTUZJTEUiLAorICAvKiAgMjUgKi8gIkVOT1RUWSIsCisgIC8qICAyNiAqLyAiRVRYVEJTWSIsCisgIC8qICAyNyAqLyAiRUZCSUciLAorICAvKiAgMjggKi8gIkVOT1NQQyIsCisgIC8qICAyOSAqLyAiRVNQSVBFIiwKKyAgLyogIDMwICovICJFUk9GUyIsCisgIC8qICAzMSAqLyAiRU1MSU5LIiwKKyAgLyogIDMyICovICJFUElQRSIsCisgIC8qICAzMyAqLyAiRURPTSIsCisgIC8qICAzNCAqLyAiRVJBTkdFIiwKKyAgLyogIDM1ICovICJFREVBRExLIiwKKyAgLyogIDM2ICovICJFTkFNRVRPT0xPTkciLAorICAvKiAgMzcgKi8gIkVOT0xDSyIsCisgIC8qICAzOCAqLyAiRU5PU1lTIiwKKyAgLyogIDM5ICovICJFTk9URU1QVFkiLAorICAvKiAgNDAgKi8gIkVMT09QIiwKKyAgLyogIDQxICovIDAsCisgIC8qICA0MiAqLyAiRU5PTVNHIiwKKyAgLyogIDQzICovICJFSURSTSIsCisgIC8qICA0NCAqLyAiRUNIUk5HIiwKKyAgLyogIDQ1ICovICJFTDJOU1lOQyIsCisgIC8qICA0NiAqLyAiRUwzSExUIiwKKyAgLyogIDQ3ICovICJFTDNSU1QiLAorICAvKiAgNDggKi8gIkVMTlJORyIsCisgIC8qICA0OSAqLyAiRVVOQVRDSCIsCisgIC8qICA1MCAqLyAiRU5PQ1NJIiwKKyAgLyogIDUxICovICJFTDJITFQiLAorICAvKiAgNTIgKi8gIkVCQURFIiwKKyAgLyogIDUzICovICJFQkFEUiIsCisgIC8qICA1NCAqLyAiRVhGVUxMIiwKKyAgLyogIDU1ICovICJFTk9BTk8iLAorICAvKiAgNTYgKi8gIkVCQURSUUMiLAorICAvKiAgNTcgKi8gIkVCQURTTFQiLAorICAvKiAgNTggKi8gIkVERUFETE9DSyIsCisgIC8qICA1OSAqLyAiRUJGT05UIiwKKyAgLyogIDYwICovICJFTk9TVFIiLAorICAvKiAgNjEgKi8gIkVOT0RBVEEiLAorICAvKiAgNjIgKi8gIkVUSU1FIiwKKyAgLyogIDYzICovICJFTk9TUiIsCisgIC8qICA2NCAqLyAiRU5PTkVUIiwKKyAgLyogIDY1ICovICJFTk9QS0ciLAorICAvKiAgNjYgKi8gIkVSRU1PVEUiLAorICAvKiAgNjcgKi8gIkVOT0xJTksiLAorICAvKiAgNjggKi8gIkVBRFYiLAorICAvKiAgNjkgKi8gIkVTUk1OVCIsCisgIC8qICA3MCAqLyAiRUNPTU0iLAorICAvKiAgNzEgKi8gIkVQUk9UTyIsCisgIC8qICA3MiAqLyAiRU1VTFRJSE9QIiwKKyAgLyogIDczICovICJFRE9URE9UIiwKKyAgLyogIDc0ICovICJFQkFETVNHIiwKKyAgLyogIDc1ICovICJFT1ZFUkZMT1ciLAorICAvKiAgNzYgKi8gIkVOT1RVTklRIiwKKyAgLyogIDc3ICovICJFQkFERkQiLAorICAvKiAgNzggKi8gIkVSRU1DSEciLAorICAvKiAgNzkgKi8gIkVMSUJBQ0MiLAorICAvKiAgODAgKi8gIkVMSUJCQUQiLAorICAvKiAgODEgKi8gIkVMSUJTQ04iLAorICAvKiAgODIgKi8gIkVMSUJNQVgiLAorICAvKiAgODMgKi8gIkVMSUJFWEVDIiwKKyAgLyogIDg0ICovICJFSUxTRVEiLAorICAvKiAgODUgKi8gIkVSRVNUQVJUIiwKKyAgLyogIDg2ICovICJFU1RSUElQRSIsCisgIC8qICA4NyAqLyAiRVVTRVJTIiwKKyAgLyogIDg4ICovICJFTk9UU09DSyIsCisgIC8qICA4OSAqLyAiRURFU1RBRERSUkVRIiwKKyAgLyogIDkwICovICJFTVNHU0laRSIsCisgIC8qICA5MSAqLyAiRVBST1RPVFlQRSIsCisgIC8qICA5MiAqLyAiRU5PUFJPVE9PUFQiLAorICAvKiAgOTMgKi8gIkVQUk9UT05PU1VQUE9SVCIsCisgIC8qICA5NCAqLyAiRVNPQ0tUTk9TVVBQT1JUIiwKKyAgLyogIDk1ICovICJFT1BOT1RTVVBQIiwKKyAgLyogIDk2ICovICJFUEZOT1NVUFBPUlQiLAorICAvKiAgOTcgKi8gIkVBRk5PU1VQUE9SVCIsCisgIC8qICA5OCAqLyAiRUFERFJJTlVTRSIsCisgIC8qICA5OSAqLyAiRUFERFJOT1RBVkFJTCIsCisgIC8qIDEwMCAqLyAiRU5FVERPV04iLAorICAvKiAxMDEgKi8gIkVORVRVTlJFQUNIIiwKKyAgLyogMTAyICovICJFTkVUUkVTRVQiLAorICAvKiAxMDMgKi8gIkVDT05OQUJPUlRFRCIsCisgIC8qIDEwNCAqLyAiRUNPTk5SRVNFVCIsCisgIC8qIDEwNSAqLyAiRU5PQlVGUyIsCisgIC8qIDEwNiAqLyAiRUlTQ09OTiIsCisgIC8qIDEwNyAqLyAiRU5PVENPTk4iLAorICAvKiAxMDggKi8gIkVTSFVURE9XTiIsCisgIC8qIDEwOSAqLyAiRVRPT01BTllSRUZTIiwKKyAgLyogMTEwICovICJFVElNRURPVVQiLAorICAvKiAxMTEgKi8gIkVDT05OUkVGVVNFRCIsCisgIC8qIDExMiAqLyAiRUhPU1RET1dOIiwKKyAgLyogMTEzICovICJFSE9TVFVOUkVBQ0giLAorICAvKiAxMTQgKi8gIkVBTFJFQURZIiwKKyAgLyogMTE1ICovICJFSU5QUk9HUkVTUyIsCisgIC8qIDExNiAqLyAiRVNUQUxFIiwKKyAgLyogMTE3ICovICJFVUNMRUFOIiwKKyAgLyogMTE4ICovICJFTk9UTkFNIiwKKyAgLyogMTE5ICovICJFTkFWQUlMIiwKKyAgLyogMTIwICovICJFSVNOQU0iLAorICAvKiAxMjEgKi8gIkVSRU1PVEVJTyIsCisgIC8qIDEyMiAqLyAiRURRVU9UIiwKK307CisKK3N0YXRpYyBjaGFyICoobGludXhfc2lnbmFsX25hbWVzW10pID0geworICAvKiAgMCAqLyAwLAorICAvKiAgMSAqLyAiU0lHSFVQIiwKKyAgLyogIDIgKi8gIlNJR0lOVCIsCisgIC8qICAzICovICJTSUdRVUlUIiwKKyAgLyogIDQgKi8gIlNJR0lMTCIsCisgIC8qICA1ICovICJTSUdUUkFQIiwKKyAgLyogIDYgKi8gIlNJR0FCUlQiLAorICAvKiAgNiAqLyAiU0lHSU9UIiwKKyAgLyogIDcgKi8gIlNJR0JVUyIsCisgIC8qICA4ICovICJTSUdGUEUiLAorICAvKiAgOSAqLyAiU0lHS0lMTCIsCisgIC8qIDEwICovICJTSUdVU1IxIiwKKyAgLyogMTEgKi8gIlNJR1NFR1YiLAorICAvKiAxMiAqLyAiU0lHVVNSMiIsCisgIC8qIDEzICovICJTSUdQSVBFIiwKKyAgLyogMTQgKi8gIlNJR0FMUk0iLAorICAvKiAxNSAqLyAiU0lHVEVSTSIsCisgIC8qIDE2ICovICJTSUdTVEtGTFQiLAorICAvKiAxNyAqLyAiU0lHQ0hMRCIsCisgIC8qIDE4ICovICJTSUdDT05UIiwKKyAgLyogMTkgKi8gIlNJR1NUT1AiLAorICAvKiAyMCAqLyAiU0lHVFNUUCIsCisgIC8qIDIxICovICJTSUdUVElOIiwKKyAgLyogMjIgKi8gIlNJR1RUT1UiLAorICAvKiAyMyAqLyAiU0lHVVJHIiwKKyAgLyogMjQgKi8gIlNJR1hDUFUiLAorICAvKiAyNSAqLyAiU0lHWEZTWiIsCisgIC8qIDI2ICovICJTSUdWVEFMUk0iLAorICAvKiAyNyAqLyAiU0lHUFJPRiIsCisgIC8qIDI4ICovICJTSUdXSU5DSCIsCisgIC8qIDI5ICovICJTSUdJTyIsCisgIC8qIDMwICovICJTSUdQV1IiLAorICAvKiAzMSAqLyAiU0lHVU5VU0VEIiwKK307CisKK3N0YXRpYyBlbXVsX3N5c2NhbGwgZW11bF9saW51eF9zeXNjYWxscyA9IHsKKyAgbGludXhfZGVzY3JpcHRvcnMsCisgIHNpemVvZihsaW51eF9kZXNjcmlwdG9ycykgLyBzaXplb2YobGludXhfZGVzY3JpcHRvcnNbMF0pLAorICBsaW51eF9lcnJvcl9uYW1lcywKKyAgc2l6ZW9mKGxpbnV4X2Vycm9yX25hbWVzKSAvIHNpemVvZihsaW51eF9lcnJvcl9uYW1lc1swXSksCisgIGxpbnV4X3NpZ25hbF9uYW1lcywKKyAgc2l6ZW9mKGxpbnV4X3NpZ25hbF9uYW1lcykgLyBzaXplb2YobGludXhfc2lnbmFsX25hbWVzWzBdKSwKK307CisKKworLyogTGludXgncyBvc19lbXVsIGludGVyZmFjZSwgbW9zdCBhcmUganVzdCBwYXNzZWQgb24gdG8gdGhlIGdlbmVyaWMKKyAgIHN5c2NhbGwgc3R1ZmYgKi8KKworc3RhdGljIG9zX2VtdWxfZGF0YSAqCitlbXVsX2xpbnV4X2NyZWF0ZShkZXZpY2UgKnJvb3QsCisJCSAgYmZkICppbWFnZSwKKwkJICBjb25zdCBjaGFyICpuYW1lKQoreworICAvKiBjaGVjayB0aGF0IHRoaXMgZW11bGF0aW9uIGlzIHJlYWxseSBmb3IgdXMgKi8KKyAgaWYgKG5hbWUgIT0gTlVMTCAmJiBzdHJjbXAobmFtZSwgImxpbnV4IikgIT0gMCkKKyAgICByZXR1cm4gTlVMTDsKKworICBpZiAoaW1hZ2UgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gZW11bF91bml4X2NyZWF0ZShyb290LCBpbWFnZSwgImxpbnV4IiwgJmVtdWxfbGludXhfc3lzY2FsbHMpOworfQorCitzdGF0aWMgdm9pZAorZW11bF9saW51eF9pbml0KG9zX2VtdWxfZGF0YSAqZW11bF9kYXRhLAorCQlpbnQgbnJfY3B1cykKK3sKKyAgLyogbm90aGluZyB5ZXQgKi8KK30KKworc3RhdGljIHZvaWQKK2VtdWxfbGludXhfc3lzdGVtX2NhbGwoY3B1ICpwcm9jZXNzb3IsCisJCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSwKKwkJICAgICAgIG9zX2VtdWxfZGF0YSAqZW11bF9kYXRhKQoreworICBlbXVsX2RvX3N5c3RlbV9jYWxsKGVtdWxfZGF0YSwKKwkJICAgICAgZW11bF9kYXRhLT5zeXNjYWxscywKKwkJICAgICAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbMF0sCisJCSAgICAgIDMsIC8qcjMgY29udGFpbnMgYXJnMCovCisJCSAgICAgIHByb2Nlc3NvciwKKwkJICAgICAgY2lhKTsKK30KKworY29uc3Qgb3NfZW11bCBlbXVsX2xpbnV4ID0geworICAibGludXgiLAorICBlbXVsX2xpbnV4X2NyZWF0ZSwKKyAgZW11bF9saW51eF9pbml0LAorICBlbXVsX2xpbnV4X3N5c3RlbV9jYWxsLAorICAwLCAvKmluc3RydWN0aW9uX2NhbGwqLworICAwICAvKmRhdGEqLworfTsKKworI2VuZGlmIC8qIF9FTVVMX1VOSVhfQ18gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvZW11bF91bml4LmggYi9zaW0vcHBjL2VtdWxfdW5peC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTVjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2VtdWxfdW5peC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIF9FTVVMX1VOSVhfSF8KKyNkZWZpbmUgX0VNVUxfVU5JWF9IXworCitleHRlcm4gY29uc3Qgb3NfZW11bCBlbXVsX3NvbGFyaXM7CitleHRlcm4gY29uc3Qgb3NfZW11bCBlbXVsX2xpbnV4OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9wcGMvZXZlbnRzLmMgYi9zaW0vcHBjL2V2ZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzODQ2MjIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2V2ZW50cy5jCkBAIC0wLDAgKzEsMzg3IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIF9FVkVOVFNfQ18KKyNkZWZpbmUgX0VWRU5UU19DXworCisjaW5jbHVkZSAiYmFzaWNzLmgiCisjaW5jbHVkZSAiZXZlbnRzLmgiCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2lmICFkZWZpbmVkIChTSU1fRVZFTlRTX1BPTExfUkFURSkKKyNkZWZpbmUgU0lNX0VWRU5UU19QT0xMX1JBVEUgMHgxMDAwCisjZW5kaWYKKworCisKKy8qIFRoZSBldmVudCBxdWV1ZSBtYWludGFpbnMgYSBzaW5nbGUgYWJzb2x1dGUgdGltZSB1c2luZyB0d28KKyAgIHZhcmlhYmxlcy4KKyAgIAorICAgVElNRV9PRl9FVkVOVDogdGhpcyBob2xkcyB0aGUgdGltZSBhdCB3aGljaCB0aGUgbmV4dCBldmVudCBpcyBtZW50CisgICB0byBvY2N1cmUuICBJZiBubyBuZXh0IGV2ZW50IGl0IHdpbGwgaG9sZCB0aGUgdGltZSBvZiB0aGUgbGFzdAorICAgZXZlbnQuCisKKyAgIFRJTUVfRlJPTV9FVkVOVDogVGhlIGN1cnJlbnQgZGlzdGFuY2UgZnJvbSBUSU1FX09GX0VWRU5ULiAgSWYgYW4KKyAgIGV2ZW50IGlzIHBlbmRpbmcsIHRoaXMgd2lsbCBiZSBwb3NpdGl2ZS4gIElmIG5vIGZ1dHVyZSBldmVudCBpcworICAgcGVuZGluZyB0aGlzIHdpbGwgYmUgbmVnYXRpdmUuICBUaGlzIHZhcmlhYmxlIGlzIGRlY3JlbWVudGVkIG9uY2UKKyAgIGZvciBlYWNoIGl0ZXJhdGlvbiBvZiBhIGNsb2NrIGN5Y2xlLgorCisgICBJbml0aWFsbHksIHRoZSBjbG9jayBpcyBzdGFydGVkIGF0IHRpbWUgb25lICgxKSB3aXRoIFRJTUVfT0ZfRVZFTlQKKyAgID09IDAgYW5kIFRJTUVfRlJPTV9FVkVOVCA9PSAtMS4KKworICAgQ2xlYXJseSB0aGVyZSBpcyBhIGJ1ZyBpbiB0aGF0IHRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIGFic29sdXRlCisgICB0aW1lIGNvdW50ZXIgd2lsbCBuZXZlciBiZWNvbWUgZ3JlYXRlciB0aGFuIDJeNjIuICovCisKK3R5cGVkZWYgc3RydWN0IF9ldmVudF9lbnRyeSBldmVudF9lbnRyeTsKK3N0cnVjdCBfZXZlbnRfZW50cnkgeworICB2b2lkICpkYXRhOworICBldmVudF9oYW5kbGVyICpoYW5kbGVyOworICBzaWduZWQ2NCB0aW1lX29mX2V2ZW50OyAgCisgIGV2ZW50X2VudHJ5ICpuZXh0OworfTsKKworc3RydWN0IF9ldmVudF9xdWV1ZSB7CisgIGludCBwcm9jZXNzaW5nOworICBldmVudF9lbnRyeSAqcXVldWU7CisgIGV2ZW50X2VudHJ5ICp2b2xhdGlsZSBoZWxkOworICBldmVudF9lbnRyeSAqdm9sYXRpbGUgKnZvbGF0aWxlIGhlbGRfZW5kOworICBzaWduZWQ2NCB0aW1lX29mX2V2ZW50OworICBzaWduZWQ2NCB0aW1lX2Zyb21fZXZlbnQ7Cit9OworCisKK1NUQVRJQ19JTkxJTkVfRVZFTlRTXAorKHZvaWQpCitzaW1fZXZlbnRzX3BvbGwgKHZvaWQgKmRhdGEpCit7CisgIGV2ZW50X3F1ZXVlICpxdWV1ZSA9IGRhdGE7CisgIC8qIGp1c3QgcmUtc2NoZWR1bGUgaW4gMTAwMCBtaWxsaW9uIHRpY2tzIHRpbWUgKi8KKyAgZXZlbnRfcXVldWVfc2NoZWR1bGUgKHF1ZXVlLCBTSU1fRVZFTlRTX1BPTExfUkFURSwgc2ltX2V2ZW50c19wb2xsLCBxdWV1ZSk7CisgIHNpbV9pb19wb2xsX3F1aXQgKCk7Cit9CisKKworSU5MSU5FX0VWRU5UU1wKKyhldmVudF9xdWV1ZSAqKQorZXZlbnRfcXVldWVfY3JlYXRlKHZvaWQpCit7CisgIGV2ZW50X3F1ZXVlICpuZXdfZXZlbnRfcXVldWUgPSBaQUxMT0MoZXZlbnRfcXVldWUpOworCisgIG5ld19ldmVudF9xdWV1ZS0+cHJvY2Vzc2luZyA9IDA7CisgIG5ld19ldmVudF9xdWV1ZS0+cXVldWUgPSBOVUxMOworICBuZXdfZXZlbnRfcXVldWUtPmhlbGQgPSBOVUxMOworICBuZXdfZXZlbnRfcXVldWUtPmhlbGRfZW5kID0gJm5ld19ldmVudF9xdWV1ZS0+aGVsZDsKKworICAvKiBib3RoIHRpbWVzIGFyZSBhbHJlYWR5IHplcm8gKi8KKyAgcmV0dXJuIG5ld19ldmVudF9xdWV1ZTsKK30KKworCitJTkxJTkVfRVZFTlRTXAorKHZvaWQpCitldmVudF9xdWV1ZV9pbml0KGV2ZW50X3F1ZXVlICpxdWV1ZSkKK3sKKyAgZXZlbnRfZW50cnkgKmV2ZW50OworCisgIC8qIGRyYWluIHRoZSBpbnRlcnJ1cHQgcXVldWUgKi8KKyAgeworI2lmIGRlZmluZWQoSEFWRV9TSUdQUk9DTUFTSykgJiYgZGVmaW5lZChTSUdfU0VUTUFTSykKKyAgICBzaWdzZXRfdCBvbGRfbWFzazsKKyAgICBzaWdzZXRfdCBuZXdfbWFzazsKKyAgICBzaWdmaWxsc2V0KCZuZXdfbWFzayk7CisgICAgLyotTE9DSy0qLyBzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm5ld19tYXNrLCAmb2xkX21hc2spOworI2VuZGlmCisgICAgZXZlbnQgPSBxdWV1ZS0+aGVsZDsKKyAgICB3aGlsZSAoZXZlbnQgIT0gTlVMTCkgeworICAgICAgZXZlbnRfZW50cnkgKmRlYWQgPSBldmVudDsKKyAgICAgIGV2ZW50ID0gZXZlbnQtPm5leHQ7CisgICAgICB6ZnJlZShkZWFkKTsKKyAgICB9CisgICAgcXVldWUtPmhlbGQgPSBOVUxMOworICAgIHF1ZXVlLT5oZWxkX2VuZCA9ICZxdWV1ZS0+aGVsZDsKKyNpZiBkZWZpbmVkKEhBVkVfU0lHUFJPQ01BU0spICYmIGRlZmluZWQoU0lHX1NFVE1BU0spCisgICAgLyotVU5MT0NLLSovIHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb2xkX21hc2ssIE5VTEwpOworI2VuZGlmCisgIH0KKworICAvKiBkcmFpbiB0aGUgbm9ybWFsIHF1ZXVlICovCisgIGV2ZW50ID0gcXVldWUtPnF1ZXVlOworICB3aGlsZSAoZXZlbnQgIT0gTlVMTCkgeworICAgIGV2ZW50X2VudHJ5ICpkZWFkID0gZXZlbnQ7CisgICAgZXZlbnQgPSBldmVudC0+bmV4dDsKKyAgICB6ZnJlZShkZWFkKTsKKyAgfQorICBxdWV1ZS0+cXVldWUgPSBOVUxMOworICAgIAorICAvKiB3aW5kIHRpbWUgYmFjayB0byBvbmUgKi8KKyAgcXVldWUtPnByb2Nlc3NpbmcgPSAwOworICBxdWV1ZS0+dGltZV9vZl9ldmVudCA9IDA7CisgIHF1ZXVlLT50aW1lX2Zyb21fZXZlbnQgPSAtMTsKKworICAvKiBzY2hlZHVsZSBvdXIgaW5pdGlhbCBjb3VudGVyIGV2ZW50ICovCisgIGV2ZW50X3F1ZXVlX3NjaGVkdWxlIChxdWV1ZSwgMCwgc2ltX2V2ZW50c19wb2xsLCBxdWV1ZSk7Cit9CisKK0lOTElORV9FVkVOVFNcCisoc2lnbmVkNjQpCitldmVudF9xdWV1ZV90aW1lKGV2ZW50X3F1ZXVlICpxdWV1ZSkKK3sKKyAgcmV0dXJuIHF1ZXVlLT50aW1lX29mX2V2ZW50IC0gcXVldWUtPnRpbWVfZnJvbV9ldmVudDsKK30KKworU1RBVElDX0lOTElORV9FVkVOVFNcCisodm9pZCkKK3VwZGF0ZV90aW1lX2Zyb21fZXZlbnQoZXZlbnRfcXVldWUgKmV2ZW50cykKK3sKKyAgc2lnbmVkNjQgY3VycmVudF90aW1lID0gZXZlbnRfcXVldWVfdGltZShldmVudHMpOworICBpZiAoZXZlbnRzLT5xdWV1ZSAhPSBOVUxMKSB7CisgICAgZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQgPSAoZXZlbnRzLT5xdWV1ZS0+dGltZV9vZl9ldmVudCAtIGN1cnJlbnRfdGltZSk7CisgICAgZXZlbnRzLT50aW1lX29mX2V2ZW50ID0gZXZlbnRzLT5xdWV1ZS0+dGltZV9vZl9ldmVudDsKKyAgfQorICBlbHNlIHsKKyAgICBldmVudHMtPnRpbWVfb2ZfZXZlbnQgPSBjdXJyZW50X3RpbWUgLSAxOworICAgIGV2ZW50cy0+dGltZV9mcm9tX2V2ZW50ID0gLTE7CisgIH0KKyAgQVNTRVJUKGN1cnJlbnRfdGltZSA9PSBldmVudF9xdWV1ZV90aW1lKGV2ZW50cykpOworICBBU1NFUlQoKGV2ZW50cy0+dGltZV9mcm9tX2V2ZW50ID49IDApID09IChldmVudHMtPnF1ZXVlICE9IE5VTEwpKTsKK30KKworU1RBVElDX0lOTElORV9FVkVOVFNcCisodm9pZCkKK2luc2VydF9ldmVudF9lbnRyeShldmVudF9xdWV1ZSAqZXZlbnRzLAorCQkgICBldmVudF9lbnRyeSAqbmV3X2V2ZW50LAorCQkgICBzaWduZWQ2NCBkZWx0YSkKK3sKKyAgZXZlbnRfZW50cnkgKmN1cnI7CisgIGV2ZW50X2VudHJ5ICoqcHJldjsKKyAgc2lnbmVkNjQgdGltZV9vZl9ldmVudDsKKworICBpZiAoZGVsdGEgPCAwKQorICAgIGVycm9yKCJ3aGF0IGlzIHBhc3QgaXMgcGFzdCFcbiIpOworCisgIC8qIGNvbXB1dGUgd2hlbiB0aGUgZXZlbnQgc2hvdWxkIG9jY3VyZSAqLworICB0aW1lX29mX2V2ZW50ID0gZXZlbnRfcXVldWVfdGltZShldmVudHMpICsgZGVsdGE7CisKKyAgLyogZmluZCB0aGUgcXVldWUgaW5zZXJ0aW9uIHBvaW50IC0gdGhpbmdzIGFyZSB0aW1lIG9yZGVyZWQgKi8KKyAgcHJldiA9ICZldmVudHMtPnF1ZXVlOworICBjdXJyID0gZXZlbnRzLT5xdWV1ZTsKKyAgd2hpbGUgKGN1cnIgIT0gTlVMTCAmJiB0aW1lX29mX2V2ZW50ID49IGN1cnItPnRpbWVfb2ZfZXZlbnQpIHsKKyAgICBBU1NFUlQoY3Vyci0+bmV4dCA9PSBOVUxMCisJICAgfHwgY3Vyci0+dGltZV9vZl9ldmVudCA8PSBjdXJyLT5uZXh0LT50aW1lX29mX2V2ZW50KTsKKyAgICBwcmV2ID0gJmN1cnItPm5leHQ7CisgICAgY3VyciA9IGN1cnItPm5leHQ7CisgIH0KKyAgQVNTRVJUKGN1cnIgPT0gTlVMTCB8fCB0aW1lX29mX2V2ZW50IDwgY3Vyci0+dGltZV9vZl9ldmVudCk7CisKKyAgLyogaW5zZXJ0IGl0ICovCisgIG5ld19ldmVudC0+bmV4dCA9IGN1cnI7CisgICpwcmV2ID0gbmV3X2V2ZW50OworICBuZXdfZXZlbnQtPnRpbWVfb2ZfZXZlbnQgPSB0aW1lX29mX2V2ZW50OworCisgIC8qIGFkanVzdCB0aGUgdGltZSB1bnRpbCB0aGUgZmlyc3QgZXZlbnQgKi8KKyAgdXBkYXRlX3RpbWVfZnJvbV9ldmVudChldmVudHMpOworfQorCitJTkxJTkVfRVZFTlRTXAorKGV2ZW50X2VudHJ5X3RhZykKK2V2ZW50X3F1ZXVlX3NjaGVkdWxlKGV2ZW50X3F1ZXVlICpldmVudHMsCisJCSAgICAgc2lnbmVkNjQgZGVsdGFfdGltZSwKKwkJICAgICBldmVudF9oYW5kbGVyICpoYW5kbGVyLAorCQkgICAgIHZvaWQgKmRhdGEpCit7CisgIGV2ZW50X2VudHJ5ICpuZXdfZXZlbnQgPSBaQUxMT0MoZXZlbnRfZW50cnkpOworICBuZXdfZXZlbnQtPmRhdGEgPSBkYXRhOworICBuZXdfZXZlbnQtPmhhbmRsZXIgPSBoYW5kbGVyOworICBpbnNlcnRfZXZlbnRfZW50cnkoZXZlbnRzLCBuZXdfZXZlbnQsIGRlbHRhX3RpbWUpOworICBUUkFDRSh0cmFjZV9ldmVudHMsICgiZXZlbnQgc2NoZWR1bGVkIGF0ICVsZCAtIHRhZyAweCVseCAtIHRpbWUgJWxkLCBoYW5kbGVyIDB4JWx4LCBkYXRhIDB4JWx4XG4iLAorCQkgICAgICAgKGxvbmcpZXZlbnRfcXVldWVfdGltZShldmVudHMpLAorCQkgICAgICAgKGxvbmcpbmV3X2V2ZW50LAorCQkgICAgICAgKGxvbmcpbmV3X2V2ZW50LT50aW1lX29mX2V2ZW50LAorCQkgICAgICAgKGxvbmcpbmV3X2V2ZW50LT5oYW5kbGVyLAorCQkgICAgICAgKGxvbmcpbmV3X2V2ZW50LT5kYXRhKSk7CisgIHJldHVybiAoZXZlbnRfZW50cnlfdGFnKW5ld19ldmVudDsKK30KKworCitJTkxJTkVfRVZFTlRTXAorKGV2ZW50X2VudHJ5X3RhZykKK2V2ZW50X3F1ZXVlX3NjaGVkdWxlX2FmdGVyX3NpZ25hbChldmVudF9xdWV1ZSAqZXZlbnRzLAorCQkJCSAgc2lnbmVkNjQgZGVsdGFfdGltZSwKKwkJCQkgIGV2ZW50X2hhbmRsZXIgKmhhbmRsZXIsCisJCQkJICB2b2lkICpkYXRhKQoreworICBldmVudF9lbnRyeSAqbmV3X2V2ZW50ID0gWkFMTE9DKGV2ZW50X2VudHJ5KTsKKworICBuZXdfZXZlbnQtPmRhdGEgPSBkYXRhOworICBuZXdfZXZlbnQtPmhhbmRsZXIgPSBoYW5kbGVyOworICBuZXdfZXZlbnQtPnRpbWVfb2ZfZXZlbnQgPSBkZWx0YV90aW1lOyAvKiB3b3JrIGl0IG91dCBsYXRlciAqLworICBuZXdfZXZlbnQtPm5leHQgPSBOVUxMOworCisgIHsKKyNpZiBkZWZpbmVkKEhBVkVfU0lHUFJPQ01BU0spICYmIGRlZmluZWQoU0lHX1NFVE1BU0spCisgICAgc2lnc2V0X3Qgb2xkX21hc2s7CisgICAgc2lnc2V0X3QgbmV3X21hc2s7CisgICAgc2lnZmlsbHNldCgmbmV3X21hc2spOworICAgIC8qLUxPQ0stKi8gc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZuZXdfbWFzaywgJm9sZF9tYXNrKTsKKyNlbmRpZgorICAgIGlmIChldmVudHMtPmhlbGQgPT0gTlVMTCkgeworICAgICAgZXZlbnRzLT5oZWxkID0gbmV3X2V2ZW50OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICpldmVudHMtPmhlbGRfZW5kID0gbmV3X2V2ZW50OworICAgIH0KKyAgICBldmVudHMtPmhlbGRfZW5kID0gJm5ld19ldmVudC0+bmV4dDsKKyNpZiBkZWZpbmVkKEhBVkVfU0lHUFJPQ01BU0spICYmIGRlZmluZWQoU0lHX1NFVE1BU0spCisgICAgLyotVU5MT0NLLSovIHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb2xkX21hc2ssIE5VTEwpOworI2VuZGlmCisgIH0KKworICBUUkFDRSh0cmFjZV9ldmVudHMsICgiZXZlbnQgc2NoZWR1bGVkIGF0ICVsZCAtIHRhZyAweCVseCAtIHRpbWUgJWxkLCBoYW5kbGVyIDB4JWx4LCBkYXRhIDB4JWx4XG4iLAorCQkgICAgICAgKGxvbmcpZXZlbnRfcXVldWVfdGltZShldmVudHMpLAorCQkgICAgICAgKGxvbmcpbmV3X2V2ZW50LAorCQkgICAgICAgKGxvbmcpbmV3X2V2ZW50LT50aW1lX29mX2V2ZW50LAorCQkgICAgICAgKGxvbmcpbmV3X2V2ZW50LT5oYW5kbGVyLAorCQkgICAgICAgKGxvbmcpbmV3X2V2ZW50LT5kYXRhKSk7CisKKyAgcmV0dXJuIChldmVudF9lbnRyeV90YWcpbmV3X2V2ZW50OworfQorCisKK0lOTElORV9FVkVOVFNcCisodm9pZCkKK2V2ZW50X3F1ZXVlX2Rlc2NoZWR1bGUoZXZlbnRfcXVldWUgKmV2ZW50cywKKwkJICAgICAgIGV2ZW50X2VudHJ5X3RhZyBldmVudF90b19yZW1vdmUpCit7CisgIGV2ZW50X2VudHJ5ICp0b19yZW1vdmUgPSAoZXZlbnRfZW50cnkqKWV2ZW50X3RvX3JlbW92ZTsKKyAgQVNTRVJUKChldmVudHMtPnRpbWVfZnJvbV9ldmVudCA+PSAwKSA9PSAoZXZlbnRzLT5xdWV1ZSAhPSBOVUxMKSk7CisgIGlmIChldmVudF90b19yZW1vdmUgIT0gTlVMTCkgeworICAgIGV2ZW50X2VudHJ5ICpjdXJyZW50OworICAgIGV2ZW50X2VudHJ5ICoqcHRyX3RvX2N1cnJlbnQ7CisgICAgZm9yIChwdHJfdG9fY3VycmVudCA9ICZldmVudHMtPnF1ZXVlLCBjdXJyZW50ID0gKnB0cl90b19jdXJyZW50OworCSBjdXJyZW50ICE9IE5VTEwgJiYgY3VycmVudCAhPSB0b19yZW1vdmU7CisJIHB0cl90b19jdXJyZW50ID0gJmN1cnJlbnQtPm5leHQsIGN1cnJlbnQgPSAqcHRyX3RvX2N1cnJlbnQpOworICAgIGlmIChjdXJyZW50ID09IHRvX3JlbW92ZSkgeworICAgICAgKnB0cl90b19jdXJyZW50ID0gY3VycmVudC0+bmV4dDsKKyAgICAgIFRSQUNFKHRyYWNlX2V2ZW50cywgKCJldmVudCBkZXNjaGVkdWxlZCBhdCAlbGQgLSB0YWcgMHglbHggLSB0aW1lICVsZCwgaGFuZGxlciAweCVseCwgZGF0YSAweCVseFxuIiwKKwkJCSAgIChsb25nKWV2ZW50X3F1ZXVlX3RpbWUoZXZlbnRzKSwKKwkJCSAgIChsb25nKWV2ZW50X3RvX3JlbW92ZSwKKwkJCSAgIChsb25nKWN1cnJlbnQtPnRpbWVfb2ZfZXZlbnQsCisJCQkgICAobG9uZyljdXJyZW50LT5oYW5kbGVyLAorCQkJICAgKGxvbmcpY3VycmVudC0+ZGF0YSkpOworICAgICAgemZyZWUoY3VycmVudCk7CisgICAgICB1cGRhdGVfdGltZV9mcm9tX2V2ZW50KGV2ZW50cyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgVFJBQ0UodHJhY2VfZXZlbnRzLCAoImV2ZW50IGRlc2NoZWR1bGVkIGF0ICVsZCAtIHRhZyAweCVseCAtIG5vdCBmb3VuZFxuIiwKKwkJCSAgIChsb25nKWV2ZW50X3F1ZXVlX3RpbWUoZXZlbnRzKSwKKwkJCSAgIChsb25nKWV2ZW50X3RvX3JlbW92ZSkpOworICAgIH0KKyAgfQorICBBU1NFUlQoKGV2ZW50cy0+dGltZV9mcm9tX2V2ZW50ID49IDApID09IChldmVudHMtPnF1ZXVlICE9IE5VTEwpKTsKK30KKworCisKKworSU5MSU5FX0VWRU5UU1wKKyhpbnQpCitldmVudF9xdWV1ZV90aWNrKGV2ZW50X3F1ZXVlICpldmVudHMpCit7CisgIHNpZ25lZDY0IHRpbWVfZnJvbV9ldmVudDsKKworICAvKiB3ZSBzaG91bGQgb25seSBiZSBoZXJlIHdoZW4gdGhlIHByZXZpb3VzIHRpY2sgaGFzIGJlZW4gZnVsbHkgcHJvY2Vzc2VkICovCisgIEFTU0VSVCghZXZlbnRzLT5wcm9jZXNzaW5nKTsKKworICAvKiBtb3ZlIGFueSBldmVudHMgdGhhdCB3ZXJlIHF1ZXVlZCBieSBhbnkgc2lnbmFsIGhhbmRsZXJzIG9udG8gdGhlCisgICAgIHJlYWwgZXZlbnQgcXVldWUuICBCVFc6IFdoZW4gaW5saW5pbmcsIGhhdmluZyB0aGlzIGNvZGUgaGVyZSwKKyAgICAgaW5zdGVhZCBvZiBpbiBldmVudF9xdWV1ZV9wcm9jZXNzKCkgY2F1c2VzIEdDQyB0byBwdXQgZ3JlYXRlcgorICAgICB3ZWlnaHQgb24ga2VlcGluZyB0aGUgcG9pbnRlciBFVkVOVFMgaW4gYSByZWdpc3Rlci4gIFRoaXMsIGluCisgICAgIHR1cm4gcmVzdWx0cyBpbiBiZXR0ZXIgY29kZSBiZWluZyBvdXRwdXQuICovCisgIGlmIChldmVudHMtPmhlbGQgIT0gTlVMTCkgeworICAgIGV2ZW50X2VudHJ5ICpoZWxkX2V2ZW50czsKKyAgICBldmVudF9lbnRyeSAqY3Vycl9ldmVudDsKKworICAgIHsKKyNpZiBkZWZpbmVkKEhBVkVfU0lHUFJPQ01BU0spICYmIGRlZmluZWQoU0lHX1NFVE1BU0spCisgICAgICBzaWdzZXRfdCBvbGRfbWFzazsKKyAgICAgIHNpZ3NldF90IG5ld19tYXNrOworICAgICAgc2lnZmlsbHNldCgmbmV3X21hc2spOworICAgICAgLyotTE9DSy0qLyBzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm5ld19tYXNrLCAmb2xkX21hc2spOworI2VuZGlmCisgICAgICBoZWxkX2V2ZW50cyA9IGV2ZW50cy0+aGVsZDsKKyAgICAgIGV2ZW50cy0+aGVsZCA9IE5VTEw7CisgICAgICBldmVudHMtPmhlbGRfZW5kID0gJmV2ZW50cy0+aGVsZDsKKyNpZiBkZWZpbmVkKEhBVkVfU0lHUFJPQ01BU0spICYmIGRlZmluZWQoU0lHX1NFVE1BU0spCisgICAgICAvKi1VTkxPQ0stKi8gc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbGRfbWFzaywgTlVMTCk7CisjZW5kaWYKKyAgICB9CisKKyAgICBkbyB7CisgICAgICBjdXJyX2V2ZW50ID0gaGVsZF9ldmVudHM7CisgICAgICBoZWxkX2V2ZW50cyA9IGN1cnJfZXZlbnQtPm5leHQ7CisgICAgICBpbnNlcnRfZXZlbnRfZW50cnkoZXZlbnRzLCBjdXJyX2V2ZW50LCBjdXJyX2V2ZW50LT50aW1lX29mX2V2ZW50KTsKKyAgICB9IHdoaWxlIChoZWxkX2V2ZW50cyAhPSBOVUxMKTsKKyAgfQorCisgIC8qIGFkdmFuY2UgdGltZSwgY2hlY2tpbmcgdG8gc2VlIGlmIHdlJ3ZlIHJlYWNoZWQgdGltZSB6ZXJvIHdoaWNoCisgICAgIHdvdWxkIGluZGljYXRlIHRoZSB0aW1lIGZvciB0aGUgbmV4dCBldmVudCBoYXMgYXJyaXZlZCAqLworICB0aW1lX2Zyb21fZXZlbnQgPSBldmVudHMtPnRpbWVfZnJvbV9ldmVudDsKKyAgZXZlbnRzLT50aW1lX2Zyb21fZXZlbnQgPSB0aW1lX2Zyb21fZXZlbnQgLSAxOworICByZXR1cm4gdGltZV9mcm9tX2V2ZW50ID09IDA7Cit9CisKKworCitJTkxJTkVfRVZFTlRTXAorKHZvaWQpCitldmVudF9xdWV1ZV9wcm9jZXNzKGV2ZW50X3F1ZXVlICpldmVudHMpCit7CisgIHNpZ25lZDY0IGV2ZW50X3RpbWUgPSBldmVudF9xdWV1ZV90aW1lKGV2ZW50cyk7CisKKyAgQVNTRVJUKChldmVudHMtPnRpbWVfZnJvbV9ldmVudCA9PSAtMSAmJiBldmVudHMtPnF1ZXVlICE9IE5VTEwpCisJIHx8IGV2ZW50cy0+cHJvY2Vzc2luZyk7IC8qIHNvbWV0aGluZyB0byBkbyAqLworCisgIC8qIGNvbnN1bWUgYWxsIGV2ZW50cyBmb3IgdGhpcyBvciBlYXJsaWVyIHRpbWVzLiAgQmUgY2FyZWZ1bCB0bworICAgICBhbGxvdyBhIG5ldyBldmVudCB0byBhcHBlYXIgdW5kZXIgb3VyIGZlZXQgKi8KKyAgZXZlbnRzLT5wcm9jZXNzaW5nID0gMTsKKyAgd2hpbGUgKGV2ZW50cy0+cXVldWUgIT0gTlVMTAorCSAmJiBldmVudHMtPnF1ZXVlLT50aW1lX29mX2V2ZW50IDw9IGV2ZW50X3RpbWUpIHsKKyAgICBldmVudF9lbnRyeSAqdG9fZG8gPSBldmVudHMtPnF1ZXVlOworICAgIGV2ZW50X2hhbmRsZXIgKmhhbmRsZXIgPSB0b19kby0+aGFuZGxlcjsKKyAgICB2b2lkICpkYXRhID0gdG9fZG8tPmRhdGE7CisgICAgZXZlbnRzLT5xdWV1ZSA9IHRvX2RvLT5uZXh0OworICAgIFRSQUNFKHRyYWNlX2V2ZW50cywgKCJldmVudCBpc3N1ZWQgYXQgJWxkIC0gdGFnIDB4JWx4IC0gaGFuZGxlciAweCVseCwgZGF0YSAweCVseFxuIiwKKwkJCSAobG9uZylldmVudF90aW1lLAorCQkJIChsb25nKXRvX2RvLAorCQkJIChsb25nKWhhbmRsZXIsCisJCQkgKGxvbmcpZGF0YSkpOworICAgIHpmcmVlKHRvX2RvKTsKKyAgICBoYW5kbGVyKGRhdGEpOworICB9CisgIGV2ZW50cy0+cHJvY2Vzc2luZyA9IDA7CisKKyAgLyogcmUtY2FjdWxhdGUgdGltZSBmb3IgbmV3IGV2ZW50cyAqLworICB1cGRhdGVfdGltZV9mcm9tX2V2ZW50KGV2ZW50cyk7Cit9CisKKworI2VuZGlmIC8qIF9FVkVOVFNfQ18gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvZXZlbnRzLmggYi9zaW0vcHBjL2V2ZW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlN2JlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2V2ZW50cy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgX0VWRU5UU19IXworI2RlZmluZSBfRVZFTlRTX0hfCisKKy8qIHR5cGVkZWYgc3RydWN0IF9ldmVudF9xdWV1ZSBldmVudF9xdWV1ZTsgKi8KKy8qIHR5cGVkZWYgc3RydWN0IF9ldmVudF9lbnRyeV90YWcgKmV2ZW50X2VudHJ5X3RhZzsgKi8KKwordHlwZWRlZiB2b2lkIGV2ZW50X2hhbmRsZXIodm9pZCAqZGF0YSk7CisKK0lOTElORV9FVkVOVFNcCisoZXZlbnRfcXVldWUgKikgZXZlbnRfcXVldWVfY3JlYXRlCisodm9pZCk7CisKK0lOTElORV9FVkVOVFNcCisodm9pZCkgZXZlbnRfcXVldWVfaW5pdAorKGV2ZW50X3F1ZXVlICpxdWV1ZSk7CisKKworLyogKGRlKVNjaGVkdWxlIHRoaW5ncyB0byBoYXBwZW4gaW4gdGhlIGZ1dHVyZS4gKi8KKworSU5MSU5FX0VWRU5UU1wKKyhldmVudF9lbnRyeV90YWcpIGV2ZW50X3F1ZXVlX3NjaGVkdWxlCisoZXZlbnRfcXVldWUgKnF1ZXVlLAorIHNpZ25lZDY0IGRlbHRhX3RpbWUsCisgZXZlbnRfaGFuZGxlciAqaGFuZGxlciwKKyB2b2lkICpkYXRhKTsKKworSU5MSU5FX0VWRU5UU1wKKyhldmVudF9lbnRyeV90YWcpIGV2ZW50X3F1ZXVlX3NjaGVkdWxlX2FmdGVyX3NpZ25hbAorKGV2ZW50X3F1ZXVlICpxdWV1ZSwKKyBzaWduZWQ2NCBkZWx0YV90aW1lLAorIGV2ZW50X2hhbmRsZXIgKmhhbmRsZXIsCisgdm9pZCAqZGF0YSk7CisKK0lOTElORV9FVkVOVFNcCisodm9pZCkgZXZlbnRfcXVldWVfZGVzY2hlZHVsZQorKGV2ZW50X3F1ZXVlICpxdWV1ZSwKKyBldmVudF9lbnRyeV90YWcgZXZlbnRfdG9fcmVtb3ZlKTsKKworCisvKiBwcm9ncmVzcyB0aW1lLiAgSW4gdG8gcGFydHMgc28gdGhhdCBpZiBzb21ldGhpbmcgaXMgcGVuZGluZywgdGhlCisgICBjYWxsZXIgaGFzIGEgY2hhbmNlIHRvIHNhdmUgYW55IGNhY2hlZCBzdGF0ZSAqLworCitJTkxJTkVfRVZFTlRTXAorKGludCkgZXZlbnRfcXVldWVfdGljaworKGV2ZW50X3F1ZXVlICpxdWV1ZSk7CisKK0lOTElORV9FVkVOVFNcCisodm9pZCkgZXZlbnRfcXVldWVfcHJvY2VzcworKGV2ZW50X3F1ZXVlICpldmVudHMpOworCisKKy8qIGxvY2FsIGNvbmNlcHQgb2YgdGltZSAqLworCitJTkxJTkVfRVZFTlRTXAorKHNpZ25lZDY0KSBldmVudF9xdWV1ZV90aW1lCisoZXZlbnRfcXVldWUgKnF1ZXVlKTsKKworI2VuZGlmIC8qIF9FVkVOVFNfSF8gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvZmlsdGVyLmMgYi9zaW0vcHBjL2ZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MDFhMTcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2ZpbHRlci5jCkBAIC0wLDAgKzEsMTUwIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAiZmlsdGVyLmgiCisKK3N0cnVjdCBfZmlsdGVyIHsKKyAgY2hhciAqZmxhZzsKKyAgZmlsdGVyICpuZXh0OworfTsKKworCitmaWx0ZXIgKgorbmV3X2ZpbHRlcihjb25zdCBjaGFyICpmaWx0LAorCSAgIGZpbHRlciAqZmlsdGVycykKK3sKKyAgd2hpbGUgKHN0cmxlbihmaWx0KSA+IDApIHsKKyAgICBmaWx0ZXIgKm5ld19maWx0ZXI7CisgICAgLyogYnJlYWsgdXAgdGhlIGZpbHQgbGlzdCAqLworICAgIGNoYXIgKmVuZCA9IHN0cmNocihmaWx0LCAnLCcpOworICAgIGNoYXIgKm5leHQ7CisgICAgaW50IGxlbjsKKyAgICBpZiAoZW5kID09IE5VTEwpIHsKKyAgICAgIGVuZCA9IHN0cmNocihmaWx0LCAnXDAnKTsKKyAgICAgIG5leHQgPSBlbmQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgbmV4dCA9IGVuZCArIDE7CisgICAgfQorICAgIGxlbiA9IGVuZCAtIGZpbHQ7CisgICAgLyogYWRkIHRvIGZpbHRlciBsaXN0ICovCisgICAgbmV3X2ZpbHRlciA9IFpBTExPQyhmaWx0ZXIpOworICAgIG5ld19maWx0ZXItPmZsYWcgPSAoY2hhciopemFsbG9jKGxlbiArIDEpOworICAgIHN0cm5jcHkobmV3X2ZpbHRlci0+ZmxhZywgZmlsdCwgbGVuKTsKKyAgICBuZXdfZmlsdGVyLT5uZXh0ID0gZmlsdGVyczsKKyAgICBmaWx0ZXJzID0gbmV3X2ZpbHRlcjsKKyAgICBmaWx0ID0gbmV4dDsKKyAgfQorICByZXR1cm4gZmlsdGVyczsKK30KKworCitpbnQKK2lzX2ZpbHRlcmVkX291dChjb25zdCBjaGFyICpmbGFncywKKwkJZmlsdGVyICpmaWx0ZXJzKQoreworICB3aGlsZSAoc3RybGVuKGZsYWdzKSA+IDApIHsKKyAgICBpbnQgcHJlc2VudDsKKyAgICBmaWx0ZXIgKmZpbHQgPSBmaWx0ZXJzOworICAgIC8qIGJyZWFrIHRoZSBzdHJpbmcgdXAgKi8KKyAgICBjaGFyICplbmQgPSBzdHJjaHIoZmxhZ3MsICcsJyk7CisgICAgY2hhciAqbmV4dDsKKyAgICBpbnQgbGVuOworICAgIGlmIChlbmQgPT0gTlVMTCkgeworICAgICAgZW5kID0gc3RyY2hyKGZsYWdzLCAnXDAnKTsKKyAgICAgIG5leHQgPSBlbmQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgbmV4dCA9IGVuZCArIDE7CisgICAgfQorICAgIGxlbiA9IGVuZCAtIGZsYWdzOworICAgIC8qIGNoZWNrIHRoYXQgaXQgaXMgcHJlc2VudCAqLworICAgIHByZXNlbnQgPSAwOworICAgIGZpbHQgPSBmaWx0ZXJzOworICAgIHdoaWxlIChmaWx0ICE9IE5VTEwpIHsKKyAgICAgIGlmIChzdHJuY21wKGZsYWdzLCBmaWx0LT5mbGFnLCBsZW4pID09IDAKKwkgICYmIHN0cmxlbihmaWx0LT5mbGFnKSA9PSBsZW4pIHsKKwlwcmVzZW50ID0gMTsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIGZpbHQgPSBmaWx0LT5uZXh0OworICAgIH0KKyAgICBpZiAoIXByZXNlbnQpCisgICAgICByZXR1cm4gMTsKKyAgICBmbGFncyA9IG5leHQ7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworaW50CitpdF9pcyhjb25zdCBjaGFyICpmbGFnLAorICAgICAgY29uc3QgY2hhciAqZmxhZ3MpCit7CisgIGludCBmbGFnX2xlbiA9IHN0cmxlbihmbGFnKTsKKyAgd2hpbGUgKCpmbGFncyAhPSAnXDAnKSB7CisgICAgaWYgKCFzdHJuY21wKGZsYWdzLCBmbGFnLCBmbGFnX2xlbikKKwkmJiAoZmxhZ3NbZmxhZ19sZW5dID09ICcsJyB8fCBmbGFnc1tmbGFnX2xlbl0gPT0gJ1wwJykpCisgICAgICByZXR1cm4gMTsKKyAgICB3aGlsZSAoKmZsYWdzICE9ICcsJykgeworICAgICAgaWYgKCpmbGFncyA9PSAnXDAnKQorCXJldHVybiAwOworICAgICAgZmxhZ3MrKzsKKyAgICB9CisgICAgZmxhZ3MrKzsKKyAgfQorICByZXR1cm4gMDsKK30KKworCisjaWZkZWYgTUFJTgoraW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgZmlsdGVyICpmaWx0ZXJzID0gTlVMTDsKKyAgaW50IGk7CisgIGlmIChhcmdjIDwgMikgeworICAgIHByaW50ZigiVXNhZ2U6IGZpbHRlciA8ZmxhZ3M+IDxmaWx0ZXI+IC4uLlxuIik7CisgICAgZXhpdCAoMSk7CisgIH0KKyAgLyogbG9hZCB0aGUgZmlsdGVyIHVwICovCisgIGZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspIAorICAgIGZpbHRlcnMgPSBuZXdfZmlsdGVyKGFyZ3ZbaV0sIGZpbHRlcnMpOworICBpZiAoaXNfZmlsdGVyZWRfb3V0KGFyZ3ZbMV0sIGZpbHRlcnMpKQorICAgIHByaW50ZigiZmFpbFxuIik7CisgIGVsc2UKKyAgICBwcmludGYoInBhc3NcbiIpOworICByZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9maWx0ZXIuaCBiL3NpbS9wcGMvZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE0ZjcwNAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZmlsdGVyLmgKQEAgLTAsMCArMSw0MyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKwordHlwZWRlZiBzdHJ1Y3QgX2ZpbHRlciBmaWx0ZXI7CisKKworLyogYXBwZW5kIHRoZSBmaWx0ZXIgb250byB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCisKK2V4dGVybiBmaWx0ZXIgKm5ld19maWx0ZXIKKyhjb25zdCBjaGFyICpmaWx0LAorIGZpbHRlciAqZmlsdGVycyk7CisKKworLyogcmV0dXJucyB0cnVlIGlmIHRoZSBmbGFncyBhcmUgbm9uIGVtcHR5IGFuZCBzb21lIGFyZSBtaXNzaW5nIGZyb20gdGhlIGZpbHRlciBsaXN0ICovCisKK2V4dGVybiBpbnQgaXNfZmlsdGVyZWRfb3V0CisoY29uc3QgY2hhciAqZmxhZ3MsCisgZmlsdGVyICpmaWx0ZXJzKTsKKworLyogdHJ1ZSBpZiB0aGUgZmxhZyBpcyBpbiB0aGUgbGlzdCAqLworCitleHRlcm4gaW50IGl0X2lzCisoY29uc3QgY2hhciAqZmxhZywKKyBjb25zdCBjaGFyICpmbGFncyk7CisKZGlmZiAtLWdpdCBhL3NpbS9wcGMvZmlsdGVyX2ZpbGVuYW1lLmMgYi9zaW0vcHBjL2ZpbHRlcl9maWxlbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNjJkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2ZpbHRlcl9maWxlbmFtZS5jCkBAIC0wLDAgKzEsMzggQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAicHBjLWNvbmZpZy5oIgorI2luY2x1ZGUgImZpbHRlcl9maWxlbmFtZS5oIgorCisvKiBTaG9ydGVuIHRyYWNlcyBieSBlbGltaW5hdGluZyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCB0byBmaWxlbmFtZXMuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKgorZmlsdGVyX2ZpbGVuYW1lIChjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgY29uc3QgY2hhciAqcCA9IGZpbGVuYW1lOworICBjb25zdCBjaGFyICpsYXN0ID0gZmlsZW5hbWU7CisgIGludCBjaDsKKworICB3aGlsZSAoKGNoID0gKnArKykgIT0gJ1wwJyAmJiBjaCAhPSAnOicpCisgICAgaWYgKGNoID09ICcvJykKKyAgICAgIGxhc3QgPSBwOworCisgIHJldHVybiBsYXN0OworfQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9maWx0ZXJfZmlsZW5hbWUuaCBiL3NpbS9wcGMvZmlsdGVyX2ZpbGVuYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwYjRmMgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZmlsdGVyX2ZpbGVuYW1lLmgKQEAgLTAsMCArMSwyNyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKyNpZm5kZWYgX0ZJTFRFUl9GSUxFTkFNRV9ICisjZGVmaW5lIF9GSUxURVJfRklMRU5BTUVfSAorCisvKiBSZW1vdmUgZGlyZWN0b3J5IHBhcnQgZnJvbSBmaWxlbmFtZSAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKgorZmlsdGVyX2ZpbGVuYW1lKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9nZW4taWNhY2hlLmMgYi9zaW0vcHBjL2dlbi1pY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDU4YWIxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9nZW4taWNhY2hlLmMKQEAgLTAsMCArMSw2NzUgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAibGYuaCIKKyNpbmNsdWRlICJ0YWJsZS5oIgorCisjaW5jbHVkZSAiZmlsdGVyLmgiCisKKyNpbmNsdWRlICJsZC1kZWNvZGUuaCIKKyNpbmNsdWRlICJsZC1jYWNoZS5oIgorI2luY2x1ZGUgImxkLWluc24uaCIKKworI2luY2x1ZGUgImlnZW4uaCIKKworI2luY2x1ZGUgImdlbi1zZW1hbnRpY3MuaCIKKyNpbmNsdWRlICJnZW4taWRlY29kZS5oIgorI2luY2x1ZGUgImdlbi1pY2FjaGUuaCIKKworCisKK3N0YXRpYyB2b2lkCitwcmludF9pY2FjaGVfZnVuY3Rpb25faGVhZGVyKGxmICpmaWxlLAorCQkJICAgICBjb25zdCBjaGFyICpiYXNlbmFtZSwKKwkJCSAgICAgaW5zbl9iaXRzICpleHBhbmRlZF9iaXRzLAorCQkJICAgICBpbnQgaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKK3sKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsIElDQUNIRV9GVU5DVElPTl9UWVBFLCAiRVhURVJOX0lDQUNIRSIsICIgIik7CisgIHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKKwkJICAgICAgYmFzZW5hbWUsCisJCSAgICAgIGV4cGFuZGVkX2JpdHMsCisJCSAgICAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X2ljYWNoZSk7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4oJXMpIiwgSUNBQ0hFX0ZVTkNUSU9OX0ZPUk1BTCk7IAorICBpZiAoIWlzX2Z1bmN0aW9uX2RlZmluaXRpb24pCisgICAgbGZfcHJpbnRmKGZpbGUsICI7Iik7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKK30KKworCit2b2lkCitwcmludF9pY2FjaGVfZGVjbGFyYXRpb24oaW5zbl90YWJsZSAqZW50cnksCisJCQkgbGYgKmZpbGUsCisJCQkgdm9pZCAqZGF0YSwKKwkJCSBpbnNuICppbnN0cnVjdGlvbiwKKwkJCSBpbnQgZGVwdGgpCit7CisgIGlmIChnZW5lcmF0ZV9leHBhbmRlZF9pbnN0cnVjdGlvbnMpIHsKKyAgICBBU1NFUlQoZW50cnktPm5yX2luc24gPT0gMSk7CisgICAgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uX2hlYWRlcihmaWxlLAorCQkJCSBlbnRyeS0+aW5zbnMtPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAorCQkJCSBlbnRyeS0+ZXhwYW5kZWRfYml0cywKKwkJCQkgMC8qIGlzIG5vdCBmdW5jdGlvbiBkZWZpbml0aW9uICovKTsKKyAgfQorICBlbHNlIHsKKyAgICBwcmludF9pY2FjaGVfZnVuY3Rpb25faGVhZGVyKGZpbGUsCisJCQkJIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSwKKwkJCQkgTlVMTCwKKwkJCQkgMC8qIGlzIG5vdCBmdW5jdGlvbiBkZWZpbml0aW9uICovKTsKKyAgfQorfQorCisKKworc3RhdGljIHZvaWQKK3ByaW50X2ljYWNoZV9leHRyYWN0aW9uKGxmICpmaWxlLAorCQkJaW5zbiAqaW5zdHJ1Y3Rpb24sCisJCQljb25zdCBjaGFyICplbnRyeV9uYW1lLAorCQkJY29uc3QgY2hhciAqZW50cnlfdHlwZSwKKwkJCWNvbnN0IGNoYXIgKmVudHJ5X2V4cHJlc3Npb24sCisJCQljb25zdCBjaGFyICpvcmlnaW5hbF9uYW1lLAorCQkJY29uc3QgY2hhciAqZmlsZV9uYW1lLAorCQkJaW50IGxpbmVfbnIsCisJCQlpbnNuX2ZpZWxkICpjdXJfZmllbGQsCisJCQlpbnNuX2JpdHMgKmJpdHMsCisJCQlpY2FjaGVfZGVjbF90eXBlIHdoYXRfdG9fZGVjbGFyZSwKKwkJCWljYWNoZV9ib2R5X3R5cGUgd2hhdF90b19kbywKKwkJCWNvbnN0IGNoYXIgKnJlYXNvbikKK3sKKyAgY29uc3QgY2hhciAqZXhwcmVzc2lvbjsKKyAgQVNTRVJUKGVudHJ5X25hbWUgIT0gTlVMTCk7CisKKyAgLyogRGVmaW5lIGEgc3RvcmFnZSBhcmVhIGZvciB0aGUgY2FjaGUgZWxlbWVudCAqLworICBpZiAod2hhdF90b19kZWNsYXJlID09IHVuZGVmX3ZhcmlhYmxlcykgeworICAgIC8qIFdlJ3ZlIGZpbmlzaGVkIHdpdGggdGhlIHZhbHVlIC0gZGVzdG9yeSBpdCAqLworICAgIGxmX2luZGVudF9zdXBwcmVzcyhmaWxlKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiN1bmRlZiAlc1xuIiwgZW50cnlfbmFtZSk7CisgICAgcmV0dXJuOworICB9CisgIGVsc2UgaWYgKHdoYXRfdG9fZGVjbGFyZSA9PSBkZWZpbmVfdmFyaWFibGVzKSB7CisgICAgbGZfaW5kZW50X3N1cHByZXNzKGZpbGUpOworICAgIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSAlcyAiLCBlbnRyeV9uYW1lKTsKKyAgfQorICBlbHNlIHsKKyAgICBpZiAoZmlsZV9uYW1lICE9IE5VTEwpCisgICAgICBsZl9wcmludF9fZXh0ZXJuYWxfcmVmZXJlbmNlKGZpbGUsIGxpbmVfbnIsIGZpbGVfbmFtZSk7CisgICAgbGZfcHJpbnRmKGZpbGUsICIlcyBjb25zdCAlcyBVTlVTRUQgPSAiLAorCSAgICAgIGVudHJ5X3R5cGUgPT0gTlVMTCA/ICJ1bnNpZ25lZCIgOiBlbnRyeV90eXBlLAorCSAgICAgIGVudHJ5X25hbWUpOworICB9CisKKyAgLyogZGVmaW5lIGEgdmFsdWUgZm9yIHRoYXQgc3RvcmFnZSBhcmVhIGFzIGRldGVybWluZWQgYnkgd2hhdCBpcyBpbgorICAgICB0aGUgY2FjaGUgKi8KKyAgaWYgKGJpdHMgIT0gTlVMTAorICAgICAgJiYgc3RyY21wKGVudHJ5X25hbWUsIGN1cl9maWVsZC0+dmFsX3N0cmluZykgPT0gMAorICAgICAgJiYgKChiaXRzLT5vcGNvZGUtPmlzX2Jvb2xlYW4gJiYgYml0cy0+dmFsdWUgPT0gMCkKKwkgIHx8ICghYml0cy0+b3Bjb2RlLT5pc19ib29sZWFuKSkpIHsKKyAgICAvKiBUaGUgc2ltcGxlIGZpZWxkIGhhcyBiZWVuIG1hZGUgY29uc3RhbnQgKGFzIGEgcmVzdWx0IG9mCisgICAgICAgZXhwYW5kaW5nIGluc3RydWN0aW9ucyBvciBzaW1pbGFyKS4gIFJlbWVtYmVyIHRoYXQgZm9yIGEKKyAgICAgICBib29sZWFuIGZpZWxkLCB2YWx1ZSBpcyBlaXRoZXIgMCAoaW1wbHlpbmcgdGhlIHJlcXVpcmVkCisgICAgICAgYm9vbGVhbl9jb25zdGFudCkgb3Igbm9uemVybyAoaW1wbHlpbmcgc29tZSBvdGhlciB2YWx1ZSBhbmQKKyAgICAgICBoYW5kbGVkIGxhdGVyIGJlbG93KSAtIERlZmluZSB0aGUgdmFyaWFibGUgYWNjb3JkaW5nbHkgKi8KKyAgICBleHByZXNzaW9uID0gImNvbnN0YW50IGZpZWxkIjsKKyAgICBBU1NFUlQoYml0cy0+ZmllbGQgPT0gY3VyX2ZpZWxkKTsKKyAgICBBU1NFUlQoZW50cnlfdHlwZSA9PSBOVUxMKTsKKyAgICBpZiAoYml0cy0+b3Bjb2RlLT5pc19ib29sZWFuKQorICAgICAgbGZfcHJpbnRmKGZpbGUsICIlZCIsIGJpdHMtPm9wY29kZS0+Ym9vbGVhbl9jb25zdGFudCk7CisgICAgZWxzZSBpZiAoYml0cy0+b3Bjb2RlLT5sYXN0IDwgYml0cy0+ZmllbGQtPmxhc3QpCisgICAgICBsZl9wcmludGYoZmlsZSwgIiVkIiwKKwkJYml0cy0+dmFsdWUgPDwgKGJpdHMtPmZpZWxkLT5sYXN0IC0gYml0cy0+b3Bjb2RlLT5sYXN0KSk7CisgICAgZWxzZQorICAgICAgbGZfcHJpbnRmKGZpbGUsICIlZCIsIGJpdHMtPnZhbHVlKTsKKyAgfQorICBlbHNlIGlmIChiaXRzICE9IE5VTEwKKwkgICAmJiBvcmlnaW5hbF9uYW1lICE9IE5VTEwKKwkgICAmJiBzdHJuY21wKGVudHJ5X25hbWUsCisJCSAgICAgIG9yaWdpbmFsX25hbWUsIHN0cmxlbihvcmlnaW5hbF9uYW1lKSkgPT0gMAorCSAgICYmIHN0cm5jbXAoZW50cnlfbmFtZSArIHN0cmxlbihvcmlnaW5hbF9uYW1lKSwKKwkJICAgICAgIl9pc18iLCBzdHJsZW4oIl9pc18iKSkgPT0gMAorCSAgICYmICgoYml0cy0+b3Bjb2RlLT5pc19ib29sZWFuCisJCSYmIChhdG9sKGVudHJ5X25hbWUgKyBzdHJsZW4ob3JpZ2luYWxfbmFtZSkgKyBzdHJsZW4oIl9pc18iKSkKKwkJICAgID09IGJpdHMtPm9wY29kZS0+Ym9vbGVhbl9jb25zdGFudCkpCisJICAgICAgIHx8ICghYml0cy0+b3Bjb2RlLT5pc19ib29sZWFuKSkpIHsKKyAgICBleHByZXNzaW9uID0gImNvbnN0YW50IGNvbXBhcmUiOworICAgIC8qIEFuIGVudHJ5LCBkZXJpdmVkIGZyb20gT1JJR0lOQUxfTkFNRSwgaXMgdGVzdGluZyB0byBzZWUgb2YgdGhlCisgICAgICAgT1JJR0lOQUxfTkFNRSBoYXMgYSBzcGVjaWZpYyBjb25zdGFudCB2YWx1ZS4gIFRoYXQgdmFsdWUKKyAgICAgICBtYXRjaGluZyBhIGJvb2xlYW4gb3IgY29uc3RhbnQgZmllbGQgKi8KKyAgICBpZiAoYml0cy0+b3Bjb2RlLT5pc19ib29sZWFuKQorICAgICAgbGZfcHJpbnRmKGZpbGUsICIlZCAvKiAlcyA9PSAlZCAqLyIsCisJCWJpdHMtPnZhbHVlID09IDAsCisJCW9yaWdpbmFsX25hbWUsCisJCWJpdHMtPm9wY29kZS0+Ym9vbGVhbl9jb25zdGFudCk7CisgICAgZWxzZSBpZiAoYml0cy0+b3Bjb2RlLT5sYXN0IDwgYml0cy0+ZmllbGQtPmxhc3QpCisgICAgICBsZl9wcmludGYoZmlsZSwgIiVkIC8qICVzID09ICVkICovIiwKKwkJKGF0b2woZW50cnlfbmFtZSArIHN0cmxlbihvcmlnaW5hbF9uYW1lKSArIHN0cmxlbigiX2lzXyIpKQorCQkgPT0gKGJpdHMtPnZhbHVlIDw8IChiaXRzLT5maWVsZC0+bGFzdCAtIGJpdHMtPm9wY29kZS0+bGFzdCkpKSwKKwkJb3JpZ2luYWxfbmFtZSwKKwkJKGJpdHMtPnZhbHVlIDw8IChiaXRzLT5maWVsZC0+bGFzdCAtIGJpdHMtPm9wY29kZS0+bGFzdCkpKTsKKyAgICBlbHNlCisgICAgICBsZl9wcmludGYoZmlsZSwgIiVkIC8qICVzID09ICVkICovIiwKKwkJKGF0b2woZW50cnlfbmFtZSArIHN0cmxlbihvcmlnaW5hbF9uYW1lKSArIHN0cmxlbigiX2lzXyIpKQorCQkgPT0gYml0cy0+dmFsdWUpLAorCQlvcmlnaW5hbF9uYW1lLAorCQliaXRzLT52YWx1ZSk7CisgIH0KKyAgZWxzZSB7CisgICAgLyogcHV0IHRoZSBmaWVsZCBpbiB0aGUgbG9jYWwgdmFyaWFibGUsIHBvc3NpYmx5IGFsc28gZW50ZXIgaXQKKyAgICAgICBpbnRvIHRoZSBjYWNoZSAqLworICAgIGV4cHJlc3Npb24gPSAiZXh0cmFjdGlvbiI7CisgICAgLyogaGFuZGxlIHRoZSBjYWNoZSAqLworICAgIGlmICgod2hhdF90b19kbyAmIGdldF92YWx1ZXNfZnJvbV9pY2FjaGUpCisJfHwgKHdoYXRfdG9fZG8gJiBwdXRfdmFsdWVzX2luX2ljYWNoZSkpIHsKKyAgICAgIGxmX3ByaW50ZihmaWxlLCAiY2FjaGVfZW50cnktPmNyYWNrLiVzLiVzIiwKKwkJaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX2Zvcm1dLAorCQllbnRyeV9uYW1lKTsKKyAgICAgIGlmICh3aGF0X3RvX2RvICYgcHV0X3ZhbHVlc19pbl9pY2FjaGUpIC8qIGFsc28gcHV0IGl0IGluIHRoZSBjYWNoZT8gKi8KKwlsZl9wcmludGYoZmlsZSwgIiA9ICIpOworICAgIH0KKyAgICBpZiAoKHdoYXRfdG9fZG8gJiBwdXRfdmFsdWVzX2luX2ljYWNoZSkKKwl8fCB3aGF0X3RvX2RvID09IGRvX25vdF91c2VfaWNhY2hlKSB7CisgICAgICBpZiAoY3VyX2ZpZWxkICE9IE5VTEwgJiYgc3RyY21wKGVudHJ5X25hbWUsIGN1cl9maWVsZC0+dmFsX3N0cmluZykgPT0gMCkKKwlsZl9wcmludGYoZmlsZSwgIkVYVFJBQ1RFRDMyKGluc3RydWN0aW9uLCAlZCwgJWQpIiwKKwkJICBpMnRhcmdldChoaV9iaXRfbnIsIGN1cl9maWVsZC0+Zmlyc3QpLAorCQkgIGkydGFyZ2V0KGhpX2JpdF9uciwgY3VyX2ZpZWxkLT5sYXN0KSk7CisgICAgICBlbHNlIGlmIChlbnRyeV9leHByZXNzaW9uICE9IE5VTEwpCisJbGZfcHJpbnRmKGZpbGUsICIlcyIsIGVudHJ5X2V4cHJlc3Npb24pOworICAgICAgZWxzZQorCWxmX3ByaW50ZihmaWxlLCAiZXZhbF8lcyIsIGVudHJ5X25hbWUpOworICAgIH0KKyAgfQorCisgIGlmICghKCh3aGF0X3RvX2RlY2xhcmUgPT0gZGVmaW5lX3ZhcmlhYmxlcykKKwl8fCAod2hhdF90b19kZWNsYXJlID09IHVuZGVmX3ZhcmlhYmxlcykpKQorICAgIGxmX3ByaW50ZihmaWxlLCAiOyIpOworICBpZiAocmVhc29uICE9IE5VTEwpCisgICAgbGZfcHJpbnRmKGZpbGUsICIgLyogJXMgLSAlcyAqLyIsIHJlYXNvbiwgZXhwcmVzc2lvbik7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKK30KKworCit2b2lkCitwcmludF9pY2FjaGVfYm9keShsZiAqZmlsZSwKKwkJICBpbnNuICppbnN0cnVjdGlvbiwKKwkJICBpbnNuX2JpdHMgKmV4cGFuZGVkX2JpdHMsCisJCSAgY2FjaGVfdGFibGUgKmNhY2hlX3J1bGVzLAorCQkgIGljYWNoZV9kZWNsX3R5cGUgd2hhdF90b19kZWNsYXJlLAorCQkgIGljYWNoZV9ib2R5X3R5cGUgd2hhdF90b19kbykKK3sKKyAgaW5zbl9maWVsZCAqY3VyX2ZpZWxkOworICAKKyAgLyogZXh0cmFjdCBpbnN0cnVjdGlvbiBmaWVsZHMgKi8KKyAgbGZfcHJpbnRmKGZpbGUsICIvKiBleHRyYWN0aW9uOiAlcyAiLAorCSAgICBpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fZm9ybWF0XSk7CisgIHN3aXRjaCAod2hhdF90b19kZWNsYXJlKSB7CisgIGNhc2UgZGVmaW5lX3ZhcmlhYmxlczoKKyAgICBsZl9wcmludGYoZmlsZSwgIiNkZWZpbmUiKTsKKyAgICBicmVhazsKKyAgY2FzZSBkZWNsYXJlX3ZhcmlhYmxlczoKKyAgICBsZl9wcmludGYoZmlsZSwgImRlY2xhcmUiKTsKKyAgICBicmVhazsKKyAgY2FzZSB1bmRlZl92YXJpYWJsZXM6CisgICAgbGZfcHJpbnRmKGZpbGUsICIjdW5kZWYiKTsKKyAgICBicmVhazsKKyAgfQorICBsZl9wcmludGYoZmlsZSwgIiAiKTsKKyAgc3dpdGNoICh3aGF0X3RvX2RvKSB7CisgIGNhc2UgZ2V0X3ZhbHVlc19mcm9tX2ljYWNoZToKKyAgICBsZl9wcmludGYoZmlsZSwgImdldC12YWx1ZXMtZnJvbS1pY2FjaGUiKTsKKyAgICBicmVhazsKKyAgY2FzZSBwdXRfdmFsdWVzX2luX2ljYWNoZToKKyAgICBsZl9wcmludGYoZmlsZSwgInB1dC12YWx1ZXMtaW4taWNhY2hlIik7CisgICAgYnJlYWs7CisgIGNhc2UgYm90aF92YWx1ZXNfYW5kX2ljYWNoZToKKyAgICBsZl9wcmludGYoZmlsZSwgImdldC12YWx1ZXMtZnJvbS1pY2FjaGV8cHV0LXZhbHVlcy1pbi1pY2FjaGUiKTsKKyAgICBicmVhazsKKyAgY2FzZSBkb19ub3RfdXNlX2ljYWNoZToKKyAgICBsZl9wcmludGYoZmlsZSwgImRvLW5vdC11c2UtaWNhY2hlIik7CisgICAgYnJlYWs7CisgIH0KKyAgbGZfcHJpbnRmKGZpbGUsICIgKi9cbiIpOworICAKKyAgZm9yIChjdXJfZmllbGQgPSBpbnN0cnVjdGlvbi0+ZmllbGRzLT5maXJzdDsKKyAgICAgICBjdXJfZmllbGQtPmZpcnN0IDwgaW5zbl9iaXRfc2l6ZTsKKyAgICAgICBjdXJfZmllbGQgPSBjdXJfZmllbGQtPm5leHQpIHsKKyAgICBpZiAoY3VyX2ZpZWxkLT5pc19zdHJpbmcpIHsKKyAgICAgIGluc25fYml0cyAqYml0czsKKyAgICAgIGludCBmb3VuZF9ydWxlID0gMDsKKyAgICAgIC8qIGZpbmQgYW55IGNvcnJlc3BvbmRpbmcgdmFsdWUgKi8KKyAgICAgIGZvciAoYml0cyA9IGV4cGFuZGVkX2JpdHM7CisJICAgYml0cyAhPSBOVUxMOworCSAgIGJpdHMgPSBiaXRzLT5sYXN0KSB7CisJaWYgKGJpdHMtPmZpZWxkID09IGN1cl9maWVsZCkKKwkgIGJyZWFrOworICAgICAgfQorICAgICAgLyogdHJ5IHRoZSBjYWNoZSBydWxlIHRhYmxlIGZvciB3aGF0IHRvIGRvICovCisgICAgICB7CisJY2FjaGVfdGFibGUgKmNhY2hlX3J1bGU7CisJZm9yIChjYWNoZV9ydWxlID0gY2FjaGVfcnVsZXM7CisJICAgICBjYWNoZV9ydWxlICE9IE5VTEw7CisJICAgICBjYWNoZV9ydWxlID0gY2FjaGVfcnVsZS0+bmV4dCkgeworCSAgaWYgKHN0cmNtcChjdXJfZmllbGQtPnZhbF9zdHJpbmcsIGNhY2hlX3J1bGUtPmZpZWxkX25hbWUpID09IDApIHsKKwkgICAgZm91bmRfcnVsZSA9IDE7CisJICAgIGlmIChjYWNoZV9ydWxlLT50eXBlID09IHNjcmF0Y2hfdmFsdWUKKwkJJiYgKCh3aGF0X3RvX2RvICYgcHV0X3ZhbHVlc19pbl9pY2FjaGUpCisJCSAgICB8fCB3aGF0X3RvX2RvID09IGRvX25vdF91c2VfaWNhY2hlKSkKKwkgICAgICBwcmludF9pY2FjaGVfZXh0cmFjdGlvbihmaWxlLAorCQkJCSAgICAgIGluc3RydWN0aW9uLAorCQkJCSAgICAgIGNhY2hlX3J1bGUtPmRlcml2ZWRfbmFtZSwKKwkJCQkgICAgICBjYWNoZV9ydWxlLT50eXBlX2RlZiwKKwkJCQkgICAgICBjYWNoZV9ydWxlLT5leHByZXNzaW9uLAorCQkJCSAgICAgIGNhY2hlX3J1bGUtPmZpZWxkX25hbWUsCisJCQkJICAgICAgY2FjaGVfcnVsZS0+ZmlsZV9lbnRyeS0+ZmlsZV9uYW1lLAorCQkJCSAgICAgIGNhY2hlX3J1bGUtPmZpbGVfZW50cnktPmxpbmVfbnIsCisJCQkJICAgICAgY3VyX2ZpZWxkLAorCQkJCSAgICAgIGJpdHMsCisJCQkJICAgICAgd2hhdF90b19kZWNsYXJlLAorCQkJCSAgICAgIGRvX25vdF91c2VfaWNhY2hlLAorCQkJCSAgICAgICJpY2FjaGUgc2NyYXRjaCIpOworCSAgICBlbHNlIGlmIChjYWNoZV9ydWxlLT50eXBlID09IGNvbXB1dGVfdmFsdWUKKwkJICAgICAmJiAoKHdoYXRfdG9fZG8gJiBnZXRfdmFsdWVzX2Zyb21faWNhY2hlKQorCQkJIHx8IHdoYXRfdG9fZG8gPT0gZG9fbm90X3VzZV9pY2FjaGUpKQorCSAgICAgIHByaW50X2ljYWNoZV9leHRyYWN0aW9uKGZpbGUsCisJCQkJICAgICAgaW5zdHJ1Y3Rpb24sCisJCQkJICAgICAgY2FjaGVfcnVsZS0+ZGVyaXZlZF9uYW1lLAorCQkJCSAgICAgIGNhY2hlX3J1bGUtPnR5cGVfZGVmLAorCQkJCSAgICAgIGNhY2hlX3J1bGUtPmV4cHJlc3Npb24sCisJCQkJICAgICAgY2FjaGVfcnVsZS0+ZmllbGRfbmFtZSwKKwkJCQkgICAgICBjYWNoZV9ydWxlLT5maWxlX2VudHJ5LT5maWxlX25hbWUsCisJCQkJICAgICAgY2FjaGVfcnVsZS0+ZmlsZV9lbnRyeS0+bGluZV9uciwKKwkJCQkgICAgICBjdXJfZmllbGQsCisJCQkJICAgICAgYml0cywKKwkJCQkgICAgICB3aGF0X3RvX2RlY2xhcmUsCisJCQkJICAgICAgZG9fbm90X3VzZV9pY2FjaGUsCisJCQkJICAgICAgInNlbWFudGljIGNvbXB1dGUiKTsKKwkgICAgZWxzZSBpZiAoY2FjaGVfcnVsZS0+dHlwZSA9PSBjYWNoZV92YWx1ZQorCQkgICAgICYmICgod2hhdF90b19kZWNsYXJlICE9IHVuZGVmX3ZhcmlhYmxlcykKKwkJCSB8fCAhKHdoYXRfdG9fZG8gJiBwdXRfdmFsdWVzX2luX2ljYWNoZSkpKQorCSAgICAgIHByaW50X2ljYWNoZV9leHRyYWN0aW9uKGZpbGUsCisJCQkJICAgICAgaW5zdHJ1Y3Rpb24sCisJCQkJICAgICAgY2FjaGVfcnVsZS0+ZGVyaXZlZF9uYW1lLAorCQkJCSAgICAgIGNhY2hlX3J1bGUtPnR5cGVfZGVmLAorCQkJCSAgICAgIGNhY2hlX3J1bGUtPmV4cHJlc3Npb24sCisJCQkJICAgICAgY2FjaGVfcnVsZS0+ZmllbGRfbmFtZSwKKwkJCQkgICAgICBjYWNoZV9ydWxlLT5maWxlX2VudHJ5LT5maWxlX25hbWUsCisJCQkJICAgICAgY2FjaGVfcnVsZS0+ZmlsZV9lbnRyeS0+bGluZV9uciwKKwkJCQkgICAgICBjdXJfZmllbGQsCisJCQkJICAgICAgYml0cywKKwkJCQkgICAgICAoKHdoYXRfdG9fZG8gJiBwdXRfdmFsdWVzX2luX2ljYWNoZSkKKwkJCQkgICAgICAgPyBkZWNsYXJlX3ZhcmlhYmxlcworCQkJCSAgICAgICA6IHdoYXRfdG9fZGVjbGFyZSksCisJCQkJICAgICAgd2hhdF90b19kbywKKwkJCQkgICAgICAiaW4gaWNhY2hlIik7CisJICB9CisJfQorICAgICAgfQorICAgICAgLyogTm8gcnVsZSBhdCBhbGwsIGFzc3VtZSB0aGF0IHRoaXMgaXMgbmVlZGVkIGluIHRoZSBzZW1hbnRpYworICAgICAgICAgZnVuY3Rpb24gKHdoZW4gdmFsdWVzIGFyZSBleHRyYWN0ZWQgZnJvbSB0aGUgaWNhY2hlKSBhbmQKKyAgICAgICAgIGhlbmNlIG11c3QgYmUgcHV0IGludG8gdGhlIGNhY2hlICovCisgICAgICBpZiAoZm91bmRfcnVsZSA9PSAwCisJICAmJiAoKHdoYXRfdG9fZGVjbGFyZSAhPSB1bmRlZl92YXJpYWJsZXMpCisJICAgICAgfHwgISh3aGF0X3RvX2RvICYgcHV0X3ZhbHVlc19pbl9pY2FjaGUpKSkKKwlwcmludF9pY2FjaGVfZXh0cmFjdGlvbihmaWxlLAorCQkJCWluc3RydWN0aW9uLAorCQkJCWN1cl9maWVsZC0+dmFsX3N0cmluZywKKwkJCQlOVUxMLCBOVUxMLCBOVUxMLCAvKiB0eXBlLCBleHAsIG9yaWcgKi8KKwkJCQlpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeS0+ZmlsZV9uYW1lLAorCQkJCWluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5saW5lX25yLAorCQkJCWN1cl9maWVsZCwKKwkJCQliaXRzLAorCQkJCSgod2hhdF90b19kbyAmIHB1dF92YWx1ZXNfaW5faWNhY2hlKQorCQkJCSA/IGRlY2xhcmVfdmFyaWFibGVzCisJCQkJIDogd2hhdF90b19kZWNsYXJlKSwKKwkJCQl3aGF0X3RvX2RvLAorCQkJCSJkZWZhdWx0IGluIGljYWNoZSIpOworICAgICAgLyogYW55IHRoaW5nIGVsc2UgLi4uICovCisgICAgfQorICB9CisKKyAgbGZfcHJpbnRfX2ludGVybmFsX3JlZmVyZW5jZShmaWxlKTsKKworICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2luc25faW5faWNhY2hlKSkgeworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgICBwcmludF9pY2FjaGVfZXh0cmFjdGlvbihmaWxlLAorCQkJICAgIGluc3RydWN0aW9uLAorCQkJICAgICJpbnNuIiwKKwkJCSAgICAiaW5zdHJ1Y3Rpb25fd29yZCIsCisJCQkgICAgImluc3RydWN0aW9uIiwKKwkJCSAgICBOVUxMLCAvKiBvcmlnaW4gKi8KKwkJCSAgICBOVUxMLCAwLCAvKiBmaWxlX25hbWUgJiBsaW5lX25yICovCisJCQkgICAgTlVMTCwgTlVMTCwKKwkJCSAgICB3aGF0X3RvX2RlY2xhcmUsCisJCQkgICAgd2hhdF90b19kbywKKwkJCSAgICBOVUxMKTsKKyAgfQorfQorCisKKwordHlwZWRlZiBzdHJ1Y3QgX2ljYWNoZV90cmVlIGljYWNoZV90cmVlOworc3RydWN0IF9pY2FjaGVfdHJlZSB7CisgIGNoYXIgKm5hbWU7CisgIGljYWNoZV90cmVlICpuZXh0OworICBpY2FjaGVfdHJlZSAqY2hpbGRyZW47Cit9OworCitzdGF0aWMgaWNhY2hlX3RyZWUgKgoraWNhY2hlX3RyZWVfaW5zZXJ0KGljYWNoZV90cmVlICp0cmVlLAorCQkgICBjaGFyICpuYW1lKQoreworICBpY2FjaGVfdHJlZSAqbmV3X3RyZWU7CisgIC8qIGZpbmQgaXQgKi8KKyAgaWNhY2hlX3RyZWUgKipwdHJfdG9fY3VyX3RyZWUgPSAmdHJlZS0+Y2hpbGRyZW47CisgIGljYWNoZV90cmVlICpjdXJfdHJlZSA9ICpwdHJfdG9fY3VyX3RyZWU7CisgIHdoaWxlIChjdXJfdHJlZSAhPSBOVUxMCisJICYmIHN0cmNtcChjdXJfdHJlZS0+bmFtZSwgbmFtZSkgPCAwKSB7CisgICAgcHRyX3RvX2N1cl90cmVlID0gJmN1cl90cmVlLT5uZXh0OworICAgIGN1cl90cmVlID0gKnB0cl90b19jdXJfdHJlZTsKKyAgfQorICBBU1NFUlQoY3VyX3RyZWUgPT0gTlVMTAorCSB8fCBzdHJjbXAoY3VyX3RyZWUtPm5hbWUsIG5hbWUpID49IDApOworICAvKiBhbHJlYWR5IGluIHRoZSB0cmVlICovCisgIGlmIChjdXJfdHJlZSAhPSBOVUxMCisgICAgICAmJiBzdHJjbXAoY3VyX3RyZWUtPm5hbWUsIG5hbWUpID09IDApCisgICAgcmV0dXJuIGN1cl90cmVlOworICAvKiBtaXNzaW5nLCBpbnNlcnQgaXQgKi8KKyAgQVNTRVJUKGN1cl90cmVlID09IE5VTEwKKwkgfHwgc3RyY21wKGN1cl90cmVlLT5uYW1lLCBuYW1lKSA+IDApOworICBuZXdfdHJlZSA9IFpBTExPQyhpY2FjaGVfdHJlZSk7CisgIG5ld190cmVlLT5uYW1lID0gbmFtZTsKKyAgbmV3X3RyZWUtPm5leHQgPSBjdXJfdHJlZTsKKyAgKnB0cl90b19jdXJfdHJlZSA9IG5ld190cmVlOworICByZXR1cm4gbmV3X3RyZWU7Cit9CisKKworc3RhdGljIGljYWNoZV90cmVlICoKK2luc25fdGFibGVfY2FjaGVfZmllbGRzKGluc25fdGFibGUgKnRhYmxlKQoreworICBpY2FjaGVfdHJlZSAqdHJlZSA9IFpBTExPQyhpY2FjaGVfdHJlZSk7CisgIGluc24gKmluc3RydWN0aW9uOworICBmb3IgKGluc3RydWN0aW9uID0gdGFibGUtPmluc25zOworICAgICAgIGluc3RydWN0aW9uICE9IE5VTEw7CisgICAgICAgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbi0+bmV4dCkgeworICAgIGluc25fZmllbGQgKmZpZWxkOworICAgIGljYWNoZV90cmVlICpmb3JtID0KKyAgICAgIGljYWNoZV90cmVlX2luc2VydCh0cmVlLAorCQkJIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9mb3JtXSk7CisgICAgZm9yIChmaWVsZCA9IGluc3RydWN0aW9uLT5maWVsZHMtPmZpcnN0OworCSBmaWVsZCAhPSBOVUxMOworCSBmaWVsZCA9IGZpZWxkLT5uZXh0KSB7CisgICAgICBpZiAoZmllbGQtPmlzX3N0cmluZykKKwlpY2FjaGVfdHJlZV9pbnNlcnQoZm9ybSwgZmllbGQtPnZhbF9zdHJpbmcpOworICAgIH0KKyAgfQorICByZXR1cm4gdHJlZTsKK30KKworCisKK2V4dGVybiB2b2lkCitwcmludF9pY2FjaGVfc3RydWN0KGluc25fdGFibGUgKmluc3RydWN0aW9ucywKKwkJICAgIGNhY2hlX3RhYmxlICpjYWNoZV9ydWxlcywKKwkJICAgIGxmICpmaWxlKQoreworICBpY2FjaGVfdHJlZSAqdHJlZSA9IGluc25fdGFibGVfY2FjaGVfZmllbGRzKGluc3RydWN0aW9ucyk7CisgIAorICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSBXSVRIX0lERUNPREVfQ0FDSEVfU0laRSAlZFxuIiwKKwkgICAgKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkgPyBpY2FjaGVfc2l6ZSA6IDApOworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIAorICAvKiBjcmVhdGUgYW4gaW5zdHJ1Y3Rpb24gY2FjaGUgaWYgYmVpbmcgdXNlZCAqLworICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkpIHsKKyAgICBpY2FjaGVfdHJlZSAqZm9ybTsKKyAgICBsZl9wcmludGYoZmlsZSwgInR5cGVkZWYgc3RydWN0IF9pZGVjb2RlX2NhY2hlIHtcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiICB1bnNpZ25lZF93b3JkIGFkZHJlc3M7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiAgdm9pZCAqc2VtYW50aWM7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiAgdW5pb24ge1xuIik7CisgICAgZm9yIChmb3JtID0gdHJlZS0+Y2hpbGRyZW47CisJIGZvcm0gIT0gTlVMTDsKKwkgZm9ybSA9IGZvcm0tPm5leHQpIHsKKyAgICAgIGljYWNoZV90cmVlICpmaWVsZDsKKyAgICAgIGxmX3ByaW50ZihmaWxlLCAiICAgIHN0cnVjdCB7XG4iKTsKKyAgICAgIGlmIChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pbnNuX2luX2ljYWNoZSkKKwlsZl9wcmludGYoZmlsZSwgIiAgICAgIGluc3RydWN0aW9uX3dvcmQgaW5zbjtcbiIpOworICAgICAgZm9yIChmaWVsZCA9IGZvcm0tPmNoaWxkcmVuOworCSAgIGZpZWxkICE9IE5VTEw7CisJICAgZmllbGQgPSBmaWVsZC0+bmV4dCkgeworCWNhY2hlX3RhYmxlICpjYWNoZV9ydWxlOworCWludCBmb3VuZF9ydWxlID0gMDsKKwlmb3IgKGNhY2hlX3J1bGUgPSBjYWNoZV9ydWxlczsKKwkgICAgIGNhY2hlX3J1bGUgIT0gTlVMTDsKKwkgICAgIGNhY2hlX3J1bGUgPSBjYWNoZV9ydWxlLT5uZXh0KSB7CisJICBpZiAoc3RyY21wKGZpZWxkLT5uYW1lLCBjYWNoZV9ydWxlLT5maWVsZF9uYW1lKSA9PSAwKSB7CisJICAgIGZvdW5kX3J1bGUgPSAxOworCSAgICBpZiAoY2FjaGVfcnVsZS0+ZGVyaXZlZF9uYW1lICE9IE5VTEwpCisJICAgICAgbGZfcHJpbnRmKGZpbGUsICIgICAgICAlcyAlczsgLyogJXMgKi9cbiIsCisJCQkoY2FjaGVfcnVsZS0+dHlwZV9kZWYgPT0gTlVMTAorCQkJID8gInVuc2lnbmVkIiAKKwkJCSA6IGNhY2hlX3J1bGUtPnR5cGVfZGVmKSwKKwkJCWNhY2hlX3J1bGUtPmRlcml2ZWRfbmFtZSwKKwkJCWNhY2hlX3J1bGUtPmZpZWxkX25hbWUpOworCSAgfQorCX0KKwlpZiAoIWZvdW5kX3J1bGUpCisJICBsZl9wcmludGYoZmlsZSwgIiAgICAgIHVuc2lnbmVkICVzO1xuIiwgZmllbGQtPm5hbWUpOworICAgICAgfQorICAgICAgbGZfcHJpbnRmKGZpbGUsICIgICAgfSAlcztcbiIsIGZvcm0tPm5hbWUpOworICAgIH0KKyAgICBsZl9wcmludGYoZmlsZSwgIiAgfSBjcmFjaztcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAifSBpZGVjb2RlX2NhY2hlO1xuIik7CisgIH0KKyAgZWxzZSB7CisgICAgLyogYWxlcm5hdGl2bHksIHNpbmNlIG5vIGNhY2hlLCBlbWl0IGEgZHVtbXkgZGVmaW5pdGlvbiBmb3IKKyAgICAgICBpZGVjb2RlX2NhY2hlIHNvIHRoYXQgY29kZSByZWZlcmluZyB0byB0aGUgdHlwZSBjYW4gc3RpbGwgY29tcGlsZSAqLworICAgIGxmX3ByaW50ZihmaWxlLCAidHlwZWRlZiB2b2lkIGlkZWNvZGVfY2FjaGU7XG4iKTsKKyAgfQorICBsZl9wcmludGYoZmlsZSwgIlxuIik7Cit9CisKKworCitzdGF0aWMgdm9pZAorcHJpbnRfaWNhY2hlX2Z1bmN0aW9uKGxmICpmaWxlLAorCQkgICAgICBpbnNuICppbnN0cnVjdGlvbiwKKwkJICAgICAgaW5zbl9iaXRzICpleHBhbmRlZF9iaXRzLAorCQkgICAgICBvcGNvZGVfZmllbGQgKm9wY29kZXMsCisJCSAgICAgIGNhY2hlX3RhYmxlICpjYWNoZV9ydWxlcykKK3sKKyAgaW50IGluZGVudDsKKworICAvKiBnZW5lcmF0ZSBjb2RlIHRvIGVudGVyIGRlY29kZWQgaW5zdHJ1Y3Rpb24gaW50byB0aGUgaWNhY2hlICovCisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCBJQ0FDSEVfRlVOQ1RJT05fVFlQRSwgIkVYVEVSTl9JQ0FDSEUiLCAiXG4iKTsKKyAgaW5kZW50ID0gcHJpbnRfZnVuY3Rpb25fbmFtZShmaWxlLAorCQkJICAgICAgIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSwKKwkJCSAgICAgICBleHBhbmRlZF9iaXRzLAorCQkJICAgICAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X2ljYWNoZSk7CisgIGxmX2luZGVudChmaWxlLCAraW5kZW50KTsKKyAgbGZfcHJpbnRmKGZpbGUsICIoJXMpXG4iLCBJQ0FDSEVfRlVOQ1RJT05fRk9STUFMKTsKKyAgbGZfaW5kZW50KGZpbGUsIC1pbmRlbnQpOworICAKKyAgLyogZnVuY3Rpb24gaGVhZGVyICovCisgIGxmX3ByaW50ZihmaWxlLCAie1xuIik7CisgIGxmX2luZGVudChmaWxlLCArMik7CisgIAorICBwcmludF9teV9kZWZpbmVzKGZpbGUsIGV4cGFuZGVkX2JpdHMsIGluc3RydWN0aW9uLT5maWxlX2VudHJ5KTsKKyAgcHJpbnRfaXRyYWNlKGZpbGUsIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LCAxLypwdXR0aW5nLXZhbHVlLWluLWNhY2hlKi8pOworICAKKyAgcHJpbnRfaWRlY29kZV92YWxpZGF0ZShmaWxlLCBpbnN0cnVjdGlvbiwgb3Bjb2Rlcyk7CisgIAorICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAie1xuIik7CisgIGxmX2luZGVudChmaWxlLCArMik7CisgIGlmICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfc2VtYW50aWNfaWNhY2hlKSkKKyAgICBsZl9wcmludGYoZmlsZSwgInVuc2lnbmVkX3dvcmQgbmlhO1xuIik7CisgIHByaW50X2ljYWNoZV9ib2R5KGZpbGUsCisJCSAgICBpbnN0cnVjdGlvbiwKKwkJICAgIGV4cGFuZGVkX2JpdHMsCisJCSAgICBjYWNoZV9ydWxlcywKKwkJICAgICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfZGlyZWN0X2FjY2VzcykKKwkJICAgICA/IGRlZmluZV92YXJpYWJsZXMKKwkJICAgICA6IGRlY2xhcmVfdmFyaWFibGVzKSwKKwkJICAgICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfc2VtYW50aWNfaWNhY2hlKQorCQkgICAgID8gYm90aF92YWx1ZXNfYW5kX2ljYWNoZQorCQkgICAgIDogcHV0X3ZhbHVlc19pbl9pY2FjaGUpKTsKKyAgCisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJjYWNoZV9lbnRyeS0+YWRkcmVzcyA9IGNpYTtcbiIpOworICBsZl9wcmludGYoZmlsZSwgImNhY2hlX2VudHJ5LT5zZW1hbnRpYyA9ICIpOworICBwcmludF9mdW5jdGlvbl9uYW1lKGZpbGUsCisJCSAgICAgIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSwKKwkJICAgICAgZXhwYW5kZWRfYml0cywKKwkJICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKTsKKyAgbGZfcHJpbnRmKGZpbGUsICI7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworCisgIGlmICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfc2VtYW50aWNfaWNhY2hlKSkgeworICAgIGxmX3ByaW50ZihmaWxlLCAiLyogc2VtYW50aWMgcm91dGluZSAqL1xuIik7CisgICAgcHJpbnRfc2VtYW50aWNfYm9keShmaWxlLAorCQkJaW5zdHJ1Y3Rpb24sCisJCQlleHBhbmRlZF9iaXRzLAorCQkJb3Bjb2Rlcyk7CisgICAgbGZfcHJpbnRmKGZpbGUsICJyZXR1cm4gbmlhO1xuIik7CisgIH0KKyAgCisgIGlmICghKGNvZGUgJiBnZW5lcmF0ZV93aXRoX3NlbWFudGljX2ljYWNoZSkpIHsKKyAgICBsZl9wcmludGYoZmlsZSwgIi8qIHJldHVybiB0aGUgZnVuY3Rpb24gcHJvcGVyICovXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgInJldHVybiAiKTsKKyAgICBwcmludF9mdW5jdGlvbl9uYW1lKGZpbGUsCisJCQlpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fbmFtZV0sCisJCQlleHBhbmRlZF9iaXRzLAorCQkJZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIjtcbiIpOworICB9CisgIAorICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2RpcmVjdF9hY2Nlc3MpKQorICAgIHByaW50X2ljYWNoZV9ib2R5KGZpbGUsCisJCSAgICAgIGluc3RydWN0aW9uLAorCQkgICAgICBleHBhbmRlZF9iaXRzLAorCQkgICAgICBjYWNoZV9ydWxlcywKKwkJICAgICAgdW5kZWZfdmFyaWFibGVzLAorCQkgICAgICAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX3NlbWFudGljX2ljYWNoZSkKKwkJICAgICAgID8gYm90aF92YWx1ZXNfYW5kX2ljYWNoZQorCQkgICAgICAgOiBwdXRfdmFsdWVzX2luX2ljYWNoZSkpOworCisgIGxmX2luZGVudChmaWxlLCAtMik7CisgIGxmX3ByaW50ZihmaWxlLCAifVxuIik7CisgIGxmX2luZGVudChmaWxlLCAtMik7CisgIGxmX3ByaW50ZihmaWxlLCAifVxuIik7Cit9CisKKwordm9pZAorcHJpbnRfaWNhY2hlX2RlZmluaXRpb24oaW5zbl90YWJsZSAqZW50cnksCisJCQlsZiAqZmlsZSwKKwkJCXZvaWQgKmRhdGEsCisJCQlpbnNuICppbnN0cnVjdGlvbiwKKwkJCWludCBkZXB0aCkKK3sKKyAgY2FjaGVfdGFibGUgKmNhY2hlX3J1bGVzID0gKGNhY2hlX3RhYmxlKilkYXRhOworICBpZiAoZ2VuZXJhdGVfZXhwYW5kZWRfaW5zdHJ1Y3Rpb25zKSB7CisgICAgQVNTRVJUKGVudHJ5LT5ucl9pbnNuID09IDEKKwkgICAmJiBlbnRyeS0+b3Bjb2RlID09IE5VTEwKKwkgICAmJiBlbnRyeS0+cGFyZW50ICE9IE5VTEwKKwkgICAmJiBlbnRyeS0+cGFyZW50LT5vcGNvZGUgIT0gTlVMTCk7CisgICAgQVNTRVJUKGVudHJ5LT5ucl9pbnNuID09IDEKKwkgICAmJiBlbnRyeS0+b3Bjb2RlID09IE5VTEwKKwkgICAmJiBlbnRyeS0+cGFyZW50ICE9IE5VTEwKKwkgICAmJiBlbnRyeS0+cGFyZW50LT5vcGNvZGUgIT0gTlVMTAorCSAgICYmIGVudHJ5LT5wYXJlbnQtPm9wY29kZV9ydWxlICE9IE5VTEwpOworICAgIHByaW50X2ljYWNoZV9mdW5jdGlvbihmaWxlLAorCQkJICBlbnRyeS0+aW5zbnMsCisJCQkgIGVudHJ5LT5leHBhbmRlZF9iaXRzLAorCQkJICBlbnRyeS0+b3Bjb2RlLAorCQkJICBjYWNoZV9ydWxlcyk7CisgIH0KKyAgZWxzZSB7CisgICAgcHJpbnRfaWNhY2hlX2Z1bmN0aW9uKGZpbGUsCisJCQkgIGluc3RydWN0aW9uLAorCQkJICBOVUxMLAorCQkJICBOVUxMLAorCQkJICBjYWNoZV9ydWxlcyk7CisgIH0KK30KKworCisKK3ZvaWQKK3ByaW50X2ljYWNoZV9pbnRlcm5hbF9mdW5jdGlvbl9kZWNsYXJhdGlvbihpbnNuX3RhYmxlICp0YWJsZSwKKwkJCQkJICAgbGYgKmZpbGUsCisJCQkJCSAgIHZvaWQgKmRhdGEsCisJCQkJCSAgIHRhYmxlX2VudHJ5ICpmdW5jdGlvbikKK3sKKyAgQVNTRVJUKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpICE9IDApOworICBpZiAoaXRfaXMoImludGVybmFsIiwgZnVuY3Rpb24tPmZpZWxkc1tpbnNuX2ZsYWdzXSkpIHsKKyAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCBJQ0FDSEVfRlVOQ1RJT05fVFlQRSwgIklOTElORV9JQ0FDSEUiLAorCQkJICAgIlxuIik7CisgICAgcHJpbnRfZnVuY3Rpb25fbmFtZShmaWxlLAorCQkJZnVuY3Rpb24tPmZpZWxkc1tpbnNuX25hbWVdLAorCQkJTlVMTCwKKwkJCWZ1bmN0aW9uX25hbWVfcHJlZml4X2ljYWNoZSk7CisgICAgbGZfcHJpbnRmKGZpbGUsICJcbiglcyk7XG4iLCBJQ0FDSEVfRlVOQ1RJT05fRk9STUFMKTsKKyAgfQorfQorCisKK3ZvaWQKK3ByaW50X2ljYWNoZV9pbnRlcm5hbF9mdW5jdGlvbl9kZWZpbml0aW9uKGluc25fdGFibGUgKnRhYmxlLAorCQkJCQkgIGxmICpmaWxlLAorCQkJCQkgIHZvaWQgKmRhdGEsCisJCQkJCSAgdGFibGVfZW50cnkgKmZ1bmN0aW9uKQoreworICBBU1NFUlQoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkgIT0gMCk7CisgIGlmIChpdF9pcygiaW50ZXJuYWwiLCBmdW5jdGlvbi0+ZmllbGRzW2luc25fZmxhZ3NdKSkgeworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsIElDQUNIRV9GVU5DVElPTl9UWVBFLCAiSU5MSU5FX0lDQUNIRSIsCisJCQkgICAiXG4iKTsKKyAgICBwcmludF9mdW5jdGlvbl9uYW1lKGZpbGUsCisJCQlmdW5jdGlvbi0+ZmllbGRzW2luc25fbmFtZV0sCisJCQlOVUxMLAorCQkJZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWNhY2hlKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIlxuKCVzKVxuIiwgSUNBQ0hFX0ZVTkNUSU9OX0ZPUk1BTCk7CisgICAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKKyAgICBsZl9pbmRlbnQoZmlsZSwgKzIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiLyogc2VtYW50aWMgcm91dGluZSAqL1xuIik7CisgICAgdGFibGVfZW50cnlfcHJpbnRfY3BwX2xpbmVfbnIoZmlsZSwgZnVuY3Rpb24pOworICAgIGlmICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfc2VtYW50aWNfaWNhY2hlKSkgeworICAgICAgbGZfcHJpbnRfX2NfY29kZShmaWxlLCBmdW5jdGlvbi0+YW5uZXgpOworICAgICAgbGZfcHJpbnRmKGZpbGUsICJlcnJvcihcIkludGVybmFsIGZ1bmN0aW9uIG11c3QgbG9uZ2p1bXBcXG5cIik7XG4iKTsKKyAgICAgIGxmX3ByaW50ZihmaWxlLCAicmV0dXJuIDA7XG4iKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBsZl9wcmludGYoZmlsZSwgInJldHVybiAiKTsKKyAgICAgIHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKKwkJCSAgZnVuY3Rpb24tPmZpZWxkc1tpbnNuX25hbWVdLAorCQkJICBOVUxMLAorCQkJICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpOworICAgICAgbGZfcHJpbnRmKGZpbGUsICI7XG4iKTsKKyAgICB9CisgICAgCisgICAgbGZfcHJpbnRfX2ludGVybmFsX3JlZmVyZW5jZShmaWxlKTsKKyAgICBsZl9pbmRlbnQoZmlsZSwgLTIpOworICAgIGxmX3ByaW50ZihmaWxlLCAifVxuIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NpbS9wcGMvZ2VuLWljYWNoZS5oIGIvc2ltL3BwYy9nZW4taWNhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5ZTBlMQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZ2VuLWljYWNoZS5oCkBAIC0wLDAgKzEsNjggQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworCisvKiBPdXRwdXQgY29kZSB0byBtYW5pcHVsYXRlIHRoZSBpbnN0cnVjdGlvbiBjYWNoZTogZWl0aGVyIGNyZWF0ZSBpdAorICAgb3IgcmVmZXJlbmNlIGl0ICovCisKK3R5cGVkZWYgZW51bSB7CisgIGRlY2xhcmVfdmFyaWFibGVzLAorICBkZWZpbmVfdmFyaWFibGVzLAorICB1bmRlZl92YXJpYWJsZXMsCit9IGljYWNoZV9kZWNsX3R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgIGRvX25vdF91c2VfaWNhY2hlID0gMCwKKyAgZ2V0X3ZhbHVlc19mcm9tX2ljYWNoZSA9IDB4MSwKKyAgcHV0X3ZhbHVlc19pbl9pY2FjaGUgPSAweDIsCisgIGJvdGhfdmFsdWVzX2FuZF9pY2FjaGUgPSAweDMsCit9IGljYWNoZV9ib2R5X3R5cGU7CisKK2V4dGVybiB2b2lkIHByaW50X2ljYWNoZV9ib2R5CisobGYgKmZpbGUsCisgaW5zbiAqaW5zdHJ1Y3Rpb24sCisgaW5zbl9iaXRzICpleHBhbmRlZF9iaXRzLAorIGNhY2hlX3RhYmxlICpjYWNoZV9ydWxlcywKKyBpY2FjaGVfZGVjbF90eXBlIHdoYXRfdG9fZGVjbGFyZSwKKyBpY2FjaGVfYm9keV90eXBlIHdoYXRfdG9fZG8pOworCisKKy8qIE91dHB1dCBhbiBpbnN0cnVjdGlvbiBjYWNoZSBkZWNvZGUgZnVuY3Rpb24gKi8KKworZXh0ZXJuIGluc25faGFuZGxlciBwcmludF9pY2FjaGVfZGVjbGFyYXRpb247CitleHRlcm4gaW5zbl9oYW5kbGVyIHByaW50X2ljYWNoZV9kZWZpbml0aW9uOworCisKKy8qIE91dHB1dCBhbiBpbnN0cnVjdGlvbiBjYWNoZSBzdXBwb3J0IGZ1bmN0aW9uICovCisKK2V4dGVybiBmdW5jdGlvbl9oYW5kbGVyIHByaW50X2ljYWNoZV9pbnRlcm5hbF9mdW5jdGlvbl9kZWNsYXJhdGlvbjsKK2V4dGVybiBmdW5jdGlvbl9oYW5kbGVyIHByaW50X2ljYWNoZV9pbnRlcm5hbF9mdW5jdGlvbl9kZWZpbml0aW9uOworCisKKy8qIE91dHB1dCB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUgdGFibGUgZGF0YSBzdHJ1Y3R1cmUgKi8KKworZXh0ZXJuIHZvaWQgcHJpbnRfaWNhY2hlX3N0cnVjdAorKGluc25fdGFibGUgKmluc3RydWN0aW9ucywKKyBjYWNoZV90YWJsZSAqY2FjaGVfcnVsZXMsCisgbGYgKmZpbGUpOworCisKKy8qIE91dHB1dCBhIHNpbmdsZSBpbnN0cnVjdGlvbnMgZGVjb2RlciAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9nZW4taWRlY29kZS5jIGIvc2ltL3BwYy9nZW4taWRlY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5N2RjZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2dlbi1pZGVjb2RlLmMKQEAgLTAsMCArMSwxNTQ1IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJsZi5oIgorI2luY2x1ZGUgInRhYmxlLmgiCisKKyNpbmNsdWRlICJmaWx0ZXIuaCIKKworI2luY2x1ZGUgImxkLWRlY29kZS5oIgorI2luY2x1ZGUgImxkLWNhY2hlLmgiCisjaW5jbHVkZSAibGQtaW5zbi5oIgorCisjaW5jbHVkZSAiaWdlbi5oIgorCisjaW5jbHVkZSAiZ2VuLWlkZWNvZGUuaCIKKyNpbmNsdWRlICJnZW4taWNhY2hlLmgiCisjaW5jbHVkZSAiZ2VuLXNlbWFudGljcy5oIgorCisKKworc3RhdGljIHZvaWQKK2xmX3ByaW50X29wY29kZXMobGYgKmZpbGUsCisJCSBpbnNuX3RhYmxlICp0YWJsZSkKK3sKKyAgaWYgKHRhYmxlICE9IE5VTEwpIHsKKyAgICB3aGlsZSAoMSkgeworICAgICAgQVNTRVJUKHRhYmxlLT5vcGNvZGUgIT0gTlVMTCk7CisgICAgICBsZl9wcmludGYoZmlsZSwgIl8lZF8lZCIsCisJCXRhYmxlLT5vcGNvZGUtPmZpcnN0LAorCQl0YWJsZS0+b3Bjb2RlLT5sYXN0KTsKKyAgICAgIGlmICh0YWJsZS0+cGFyZW50ID09IE5VTEwpIGJyZWFrOworICAgICAgbGZfcHJpbnRmKGZpbGUsICJfXyVkIiwgdGFibGUtPm9wY29kZV9ucik7CisgICAgICB0YWJsZSA9IHRhYmxlLT5wYXJlbnQ7CisgICAgfQorICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyB2b2lkCitsZl9wcmludF90YWJsZV9uYW1lKGxmICpmaWxlLAorCQkgICAgaW5zbl90YWJsZSAqdGFibGUpCit7CisgIGxmX3ByaW50ZihmaWxlLCAiaWRlY29kZV90YWJsZSIpOworICBsZl9wcmludF9vcGNvZGVzKGZpbGUsIHRhYmxlKTsKK30KKworCisKK3N0YXRpYyB2b2lkCitwcmludF9pZGVjb2RlX3RhYmxlKGxmICpmaWxlLAorCQkgICAgaW5zbl90YWJsZSAqZW50cnksCisJCSAgICBjb25zdCBjaGFyICpyZXN1bHQpCit7CisgIGxmX3ByaW50ZihmaWxlLCAiLyogcHJpbWUgdGhlIHNlYXJjaCAqL1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiaWRlY29kZV90YWJsZV9lbnRyeSAqdGFibGUgPSAiKTsKKyAgbGZfcHJpbnRfdGFibGVfbmFtZShmaWxlLCBlbnRyeSk7CisgIGxmX3ByaW50ZihmaWxlLCAiO1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiaW50IG9wY29kZSA9IEVYVFJBQ1RFRDMyKGluc3RydWN0aW9uLCAlZCwgJWQpO1xuIiwKKwkgICAgaTJ0YXJnZXQoaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5maXJzdCksCisJICAgIGkydGFyZ2V0KGhpX2JpdF9uciwgZW50cnktPm9wY29kZS0+bGFzdCkpOworICBsZl9wcmludGYoZmlsZSwgImlkZWNvZGVfdGFibGVfZW50cnkgKnRhYmxlX2VudHJ5ID0gdGFibGUgKyBvcGNvZGU7XG4iKTsKKworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiLyogaXRlcmF0ZSB1bnRpbCBhIGxlYWYgKi9cbiIpOworICBsZl9wcmludGYoZmlsZSwgIndoaWxlICgxKSB7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgIHNpZ25lZCBzaGlmdCA9IHRhYmxlX2VudHJ5LT5zaGlmdDtcbiIpOworICBsZl9wcmludGYoZmlsZSwgImlmIChzaGlmdCA9PSBmdW5jdGlvbl9lbnRyeSkgYnJlYWs7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgIGlmIChzaGlmdCA+PSAwKSB7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgICAgdGFibGUgPSAoKGlkZWNvZGVfdGFibGVfZW50cnkqKVxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiICAgICAgICAgICAgIHRhYmxlX2VudHJ5LT5mdW5jdGlvbl9vcl90YWJsZSk7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgICAgb3Bjb2RlID0gKChpbnN0cnVjdGlvbiAmIHRhYmxlX2VudHJ5LT5tYXNrKVxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiICAgICAgICAgICAgICA+PiBzaGlmdCk7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgICAgdGFibGVfZW50cnkgPSB0YWJsZSArIG9wY29kZTtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiAgfVxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiICBlbHNlIHtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiAgICAvKiBtdXN0IGJlIGEgYm9vbGVhbiAqL1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiICAgIEFTU0VSVCh0YWJsZV9lbnRyeS0+c2hpZnQgPT0gYm9vbGVhbl9lbnRyeSk7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgICAgb3Bjb2RlID0gKChpbnN0cnVjdGlvbiAmIHRhYmxlX2VudHJ5LT5tYXNrKVxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiICAgICAgICAgICAgICAhPSB0YWJsZV9lbnRyeS0+dmFsdWUpO1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiICAgIHRhYmxlID0gKChpZGVjb2RlX3RhYmxlX2VudHJ5KilcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiAgICAgICAgICAgICB0YWJsZV9lbnRyeS0+ZnVuY3Rpb25fb3JfdGFibGUpO1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiICAgIHRhYmxlX2VudHJ5ID0gdGFibGUgKyBvcGNvZGU7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgIH1cbiIpOworICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworCisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIvKiBjYWxsIHRoZSBsZWFmIGNvZGUgKi9cbiIpOworICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV9qdW1wcykpIHsKKyAgICBsZl9wcmludGYoZmlsZSwgImdvdG8gKnRhYmxlX2VudHJ5LT5mdW5jdGlvbl9vcl90YWJsZTtcbiIpOworICB9CisgIGVsc2UgeworICAgIGxmX3ByaW50ZihmaWxlLCAiJXMgIiwgcmVzdWx0KTsKKyAgICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkpIHsKKyAgICAgIGxmX3ByaW50ZihmaWxlLCAiKCgoaWRlY29kZV9pY2FjaGUqKXRhYmxlX2VudHJ5LT5mdW5jdGlvbl9vcl90YWJsZSlcbiIpOworICAgICAgbGZfcHJpbnRmKGZpbGUsICIgICglcykpO1xuIiwgSUNBQ0hFX0ZVTkNUSU9OX0FDVFVBTCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgbGZfcHJpbnRmKGZpbGUsICIoKGlkZWNvZGVfc2VtYW50aWMqKXRhYmxlX2VudHJ5LT5mdW5jdGlvbl9vcl90YWJsZSlcbiIpOworICAgICAgbGZfcHJpbnRmKGZpbGUsICIgICglcyk7XG4iLCBTRU1BTlRJQ19GVU5DVElPTl9BQ1RVQUwpOworICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9pZGVjb2RlX3RhYmxlX3N0YXJ0KGluc25fdGFibGUgKnRhYmxlLAorCQkJICBsZiAqZmlsZSwKKwkJCSAgdm9pZCAqZGF0YSwKKwkJCSAgaW50IGRlcHRoKQoreworICBBU1NFUlQoZGVwdGggPT0gMCk7CisgIC8qIHN0YXJ0IG9mIHRoZSB0YWJsZSAqLworICBpZiAodGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gYXJyYXlfZ2VuKSB7CisgICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAic3RhdGljIGlkZWNvZGVfdGFibGVfZW50cnkgIik7CisgICAgbGZfcHJpbnRfdGFibGVfbmFtZShmaWxlLCB0YWJsZSk7CisgICAgbGZfcHJpbnRmKGZpbGUsICJbXSA9IHtcbiIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9pZGVjb2RlX3RhYmxlX2xlYWYoaW5zbl90YWJsZSAqZW50cnksCisJCQkgbGYgKmZpbGUsCisJCQkgdm9pZCAqZGF0YSwKKwkJCSBpbnNuICppbnN0cnVjdGlvbiwKKwkJCSBpbnQgZGVwdGgpCit7CisgIEFTU0VSVChlbnRyeS0+cGFyZW50ICE9IE5VTEwpOworICBBU1NFUlQoZGVwdGggPT0gMCk7CisKKyAgLyogYWRkIGFuIGVudHJ5IHRvIHRoZSB0YWJsZSAqLworICBpZiAoZW50cnktPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBhcnJheV9nZW4pIHsKKyAgICBsZl9wcmludGYoZmlsZSwgIiAgLyolZCovIHsgIiwgZW50cnktPm9wY29kZV9ucik7CisgICAgaWYgKGVudHJ5LT5vcGNvZGUgPT0gTlVMTCkgeworICAgICAgLyogdGFibGUgbGVhZiBlbnRyeSAqLworICAgICAgbGZfcHJpbnRmKGZpbGUsICJmdW5jdGlvbl9lbnRyeSwgMCwgMCwgIik7CisgICAgICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV9qdW1wcykpCisJbGZfcHJpbnRmKGZpbGUsICImJiIpOworICAgICAgcHJpbnRfZnVuY3Rpb25fbmFtZShmaWxlLAorCQkJICBlbnRyeS0+aW5zbnMtPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAorCQkJICBlbnRyeS0+ZXhwYW5kZWRfYml0cywKKwkJCSAgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpCisJCQkgICA/IGZ1bmN0aW9uX25hbWVfcHJlZml4X2ljYWNoZQorCQkJICAgOiBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZW50cnktPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgorCSAgICAgfHwgZW50cnktPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCisJICAgICB8fCBlbnRyeS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbikgeworICAgICAgLyogdGFibGUgY2FsbGluZyBzd2l0Y2ggc3RhdGVtZW50ICovCisgICAgICBsZl9wcmludGYoZmlsZSwgImZ1bmN0aW9uX2VudHJ5LCAwLCAwLCAiKTsKKyAgICAgIGlmICgoY29kZSAmIGdlbmVyYXRlX2p1bXBzKSkKKwlsZl9wcmludGYoZmlsZSwgIiYmIik7CisgICAgICBsZl9wcmludF90YWJsZV9uYW1lKGZpbGUsIGVudHJ5KTsKKyAgICB9CisgICAgZWxzZSBpZiAoZW50cnktPm9wY29kZS0+aXNfYm9vbGVhbikgeworICAgICAgLyogdGFibGUgYGNhbGxpbmcnIGJvb2xlYW4gdGFibGUgKi8KKyAgICAgIGxmX3ByaW50ZihmaWxlLCAiYm9vbGVhbl9lbnRyeSwgIik7CisgICAgICBsZl9wcmludGYoZmlsZSwgIk1BU0szMiglZCwgJWQpLCAiLAorCQlpMnRhcmdldChoaV9iaXRfbnIsIGVudHJ5LT5vcGNvZGUtPmZpcnN0KSwKKwkJaTJ0YXJnZXQoaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5sYXN0KSk7CisgICAgICBsZl9wcmludGYoZmlsZSwgIklOU0VSVEVEMzIoJWQsICVkLCAlZCksICIsCisJCWVudHJ5LT5vcGNvZGUtPmJvb2xlYW5fY29uc3RhbnQsCisJCWkydGFyZ2V0KGhpX2JpdF9uciwgZW50cnktPm9wY29kZS0+Zmlyc3QpLAorCQlpMnRhcmdldChoaV9iaXRfbnIsIGVudHJ5LT5vcGNvZGUtPmxhc3QpKTsKKyAgICAgIGxmX3ByaW50X3RhYmxlX25hbWUoZmlsZSwgZW50cnkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIHRhYmxlIGBjYWxsaW5nJyBhbm90aGVyIHRhYmxlICovCisgICAgICBsZl9wcmludGYoZmlsZSwgIiVkLCAiLCBpbnNuX2JpdF9zaXplIC0gZW50cnktPm9wY29kZS0+bGFzdCAtIDEpOworICAgICAgbGZfcHJpbnRmKGZpbGUsICJNQVNLMzIoJWQsJWQpLCAiLAorCQlpMnRhcmdldChoaV9iaXRfbnIsIGVudHJ5LT5vcGNvZGUtPmZpcnN0KSwKKwkJaTJ0YXJnZXQoaGlfYml0X25yLCBlbnRyeS0+b3Bjb2RlLT5sYXN0KSk7CisgICAgICBsZl9wcmludGYoZmlsZSwgIjAsICIpOworICAgICAgbGZfcHJpbnRfdGFibGVfbmFtZShmaWxlLCBlbnRyeSk7CisgICAgfQorICAgIGxmX3ByaW50ZihmaWxlLCAiIH0sXG4iKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfaWRlY29kZV90YWJsZV9lbmQoaW5zbl90YWJsZSAqdGFibGUsCisJCQlsZiAqZmlsZSwKKwkJCXZvaWQgKmRhdGEsCisJCQlpbnQgZGVwdGgpCit7CisgIEFTU0VSVChkZXB0aCA9PSAwKTsKKyAgaWYgKHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IGFycmF5X2dlbikgeworICAgIGxmX3ByaW50ZihmaWxlLCAifTtcbiIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9pZGVjb2RlX3RhYmxlX3BhZGRpbmcoaW5zbl90YWJsZSAqdGFibGUsCisJCQkgICAgbGYgKmZpbGUsCisJCQkgICAgdm9pZCAqZGF0YSwKKwkJCSAgICBpbnQgZGVwdGgsCisJCQkgICAgaW50IG9wY29kZV9ucikKK3sKKyAgQVNTRVJUKGRlcHRoID09IDApOworICBpZiAodGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gYXJyYXlfZ2VuKSB7CisgICAgbGZfcHJpbnRmKGZpbGUsICIgIC8qJWQqLyB7IGZ1bmN0aW9uX2VudHJ5LCAwLCAwLCAiLCBvcGNvZGVfbnIpOworICAgIGlmICgoY29kZSAmIGdlbmVyYXRlX2p1bXBzKSkKKyAgICAgIGxmX3ByaW50ZihmaWxlLCAiJiYiKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiVzX2lsbGVnYWwgfSxcbiIsCisJICAgICAgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpID8gImljYWNoZSIgOiAic2VtYW50aWMiKSk7CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgdm9pZAorcHJpbnRfZ290b19zd2l0Y2hfbmFtZShsZiAqZmlsZSwKKwkJICAgICAgIGluc25fdGFibGUgKmVudHJ5KQoreworICBsZl9wcmludGYoZmlsZSwgImNhc2VfIik7CisgIGlmIChlbnRyeS0+b3Bjb2RlID09IE5VTEwpCisgICAgcHJpbnRfZnVuY3Rpb25fbmFtZShmaWxlLAorCQkJZW50cnktPmluc25zLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSwKKwkJCWVudHJ5LT5leHBhbmRlZF9iaXRzLAorCQkJKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpCisJCQkgPyBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGUKKwkJCSA6IGZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljcykpOworICBlbHNlCisgICAgbGZfcHJpbnRfdGFibGVfbmFtZShmaWxlLCBlbnRyeSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9nb3RvX3N3aXRjaF90YWJsZV9sZWFmKGluc25fdGFibGUgKmVudHJ5LAorCQkJICAgICBsZiAqZmlsZSwKKwkJCSAgICAgdm9pZCAqZGF0YSwKKwkJCSAgICAgaW5zbiAqaW5zdHJ1Y3Rpb24sCisJCQkgICAgIGludCBkZXB0aCkKK3sKKyAgQVNTRVJUKGVudHJ5LT5wYXJlbnQgIT0gTlVMTCk7CisgIEFTU0VSVChkZXB0aCA9PSAwKTsKKyAgQVNTRVJUKGVudHJ5LT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuKTsKKyAgQVNTRVJUKGVudHJ5LT5wYXJlbnQtPm9wY29kZSk7CisKKyAgbGZfcHJpbnRmKGZpbGUsICImJiIpOworICBwcmludF9nb3RvX3N3aXRjaF9uYW1lKGZpbGUsIGVudHJ5KTsKKyAgbGZfcHJpbnRmKGZpbGUsICIsXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2dvdG9fc3dpdGNoX3RhYmxlX3BhZGRpbmcoaW5zbl90YWJsZSAqdGFibGUsCisJCQkJbGYgKmZpbGUsCisJCQkJdm9pZCAqZGF0YSwKKwkJCQlpbnQgZGVwdGgsCisJCQkJaW50IG9wY29kZV9ucikKK3sKKyAgQVNTRVJUKGRlcHRoID09IDApOworICBBU1NFUlQodGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuKTsKKworICBsZl9wcmludGYoZmlsZSwgIiYmaWxsZWdhbF8iKTsKKyAgbGZfcHJpbnRfdGFibGVfbmFtZShmaWxlLCB0YWJsZSk7CisgIGxmX3ByaW50ZihmaWxlLCAiLFxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9nb3RvX3N3aXRjaF9icmVhayhsZiAqZmlsZSwKKwkJCWluc25fdGFibGUgKmVudHJ5KQoreworICBsZl9wcmludGYoZmlsZSwgImdvdG8gYnJlYWtfIik7CisgIGxmX3ByaW50X3RhYmxlX25hbWUoZmlsZSwgZW50cnktPnBhcmVudCk7CisgIGxmX3ByaW50ZihmaWxlLCAiO1xuIik7Cit9CisKKworc3RhdGljIHZvaWQKK3ByaW50X2dvdG9fc3dpdGNoX3RhYmxlKGxmICpmaWxlLAorCQkJaW5zbl90YWJsZSAqdGFibGUpCit7CisgIGxmX3ByaW50ZihmaWxlLCAiY29uc3Qgc3RhdGljIHZvaWQgKiIpOworICBsZl9wcmludF90YWJsZV9uYW1lKGZpbGUsIHRhYmxlKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJbXSA9IHtcbiIpOworICBsZl9pbmRlbnQoZmlsZSwgKzIpOworICBpbnNuX3RhYmxlX3RyYXZlcnNlX3RyZWUodGFibGUsCisJCQkgICBmaWxlLCBOVUxMLypkYXRhKi8sCisJCQkgICAwLAorCQkJICAgTlVMTC8qc3RhcnQqLywKKwkJCSAgIHByaW50X2dvdG9fc3dpdGNoX3RhYmxlX2xlYWYsCisJCQkgICBOVUxMLyplbmQqLywKKwkJCSAgIHByaW50X2dvdG9fc3dpdGNoX3RhYmxlX3BhZGRpbmcpOworICBsZl9pbmRlbnQoZmlsZSwgLTIpOworICBsZl9wcmludGYoZmlsZSwgIn07XG4iKTsKK30KKworCit2b2lkIHByaW50X2lkZWNvZGVfc3dpdGNoCisobGYgKmZpbGUsIAorIGluc25fdGFibGUgKnRhYmxlLAorIGNvbnN0IGNoYXIgKnJlc3VsdCk7CisKK3N0YXRpYyB2b2lkCitpZGVjb2RlX3N3aXRjaF9zdGFydChpbnNuX3RhYmxlICp0YWJsZSwKKwkJICAgICBsZiAqZmlsZSwKKwkJICAgICB2b2lkICpkYXRhLAorCQkgICAgIGludCBkZXB0aCkKK3sKKyAgLyogY29uc3QgY2hhciAqcmVzdWx0ID0gZGF0YTsgKi8KKyAgQVNTRVJUKGRlcHRoID09IDApOworICBBU1NFUlQodGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgorCSB8fCB0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBnb3RvX3N3aXRjaF9nZW4KKwkgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pOworCisgIGlmICh0YWJsZS0+b3Bjb2RlLT5pc19ib29sZWFuCisgICAgICB8fCB0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBzd2l0Y2hfZ2VuCisJIHx8IHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKSB7CisgICAgbGZfcHJpbnRmKGZpbGUsICJzd2l0Y2ggKEVYVFJBQ1RFRDMyKGluc3RydWN0aW9uLCAlZCwgJWQpKSB7XG4iLAorCSAgICAgIGkydGFyZ2V0KGhpX2JpdF9uciwgdGFibGUtPm9wY29kZS0+Zmlyc3QpLAorCSAgICAgIGkydGFyZ2V0KGhpX2JpdF9uciwgdGFibGUtPm9wY29kZS0+bGFzdCkpOworICB9CisgIGVsc2UgaWYgKHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbikgeworICAgIGlmICh0YWJsZS0+cGFyZW50ICE9IE5VTEwKKwkmJiAodGFibGUtPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBzd2l0Y2hfZ2VuCisJICAgIHx8IHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCisJICAgIHx8IHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pKSB7CisgICAgICBsZl9wcmludGYoZmlsZSwgIntcbiIpOworICAgICAgbGZfaW5kZW50KGZpbGUsICsyKTsKKyAgICB9CisgICAgcHJpbnRfZ290b19zd2l0Y2hfdGFibGUoZmlsZSwgdGFibGUpOworICAgIGxmX3ByaW50ZihmaWxlLCAiQVNTRVJUKEVYVFJBQ1RFRDMyKGluc3RydWN0aW9uLCAlZCwgJWQpXG4iLAorCSAgICAgIGkydGFyZ2V0KGhpX2JpdF9uciwgdGFibGUtPm9wY29kZS0+Zmlyc3QpLAorCSAgICAgIGkydGFyZ2V0KGhpX2JpdF9uciwgdGFibGUtPm9wY29kZS0+bGFzdCkpOworICAgIGxmX3ByaW50ZihmaWxlLCAiICAgICAgIDwgKHNpemVvZigiKTsKKyAgICBsZl9wcmludF90YWJsZV9uYW1lKGZpbGUsIHRhYmxlKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIikgLyBzaXplb2Yodm9pZCopKSk7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgImdvdG8gKiIpOworICAgIGxmX3ByaW50X3RhYmxlX25hbWUoZmlsZSwgdGFibGUpOworICAgIGxmX3ByaW50ZihmaWxlLCAiW0VYVFJBQ1RFRDMyKGluc3RydWN0aW9uLCAlZCwgJWQpXTtcbiIsCisJICAgICAgaTJ0YXJnZXQoaGlfYml0X25yLCB0YWJsZS0+b3Bjb2RlLT5maXJzdCksCisJICAgICAgaTJ0YXJnZXQoaGlfYml0X25yLCB0YWJsZS0+b3Bjb2RlLT5sYXN0KSk7CisgIH0KKyAgZWxzZSB7CisgICAgQVNTRVJUKCJiYWQgc3dpdGNoIiA9PSBOVUxMKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitpZGVjb2RlX3N3aXRjaF9sZWFmKGluc25fdGFibGUgKmVudHJ5LAorCQkgICAgbGYgKmZpbGUsCisJCSAgICB2b2lkICpkYXRhLAorCQkgICAgaW5zbiAqaW5zdHJ1Y3Rpb24sCisJCSAgICBpbnQgZGVwdGgpCit7CisgIGNvbnN0IGNoYXIgKnJlc3VsdCA9IGRhdGE7CisgIEFTU0VSVChlbnRyeS0+cGFyZW50ICE9IE5VTEwpOworICBBU1NFUlQoZGVwdGggPT0gMCk7CisgIEFTU0VSVChlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IHN3aXRjaF9nZW4KKwkgfHwgZW50cnktPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBnb3RvX3N3aXRjaF9nZW4KKwkgfHwgZW50cnktPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbik7CisgIEFTU0VSVChlbnRyeS0+cGFyZW50LT5vcGNvZGUpOworCisgIGlmIChlbnRyeS0+cGFyZW50LT5vcGNvZGUtPmlzX2Jvb2xlYW4KKyAgICAgICYmIGVudHJ5LT5vcGNvZGVfbnIgPT0gMCkgeworICAgIC8qIGJvb2xlYW4gZmFsc2UgdGFyZ2V0ICovCisgICAgbGZfcHJpbnRmKGZpbGUsICJjYXNlICVkOlxuIiwgZW50cnktPnBhcmVudC0+b3Bjb2RlLT5ib29sZWFuX2NvbnN0YW50KTsKKyAgfQorICBlbHNlIGlmIChlbnRyeS0+cGFyZW50LT5vcGNvZGUtPmlzX2Jvb2xlYW4KKwkgICAmJiBlbnRyeS0+b3Bjb2RlX25yICE9IDApIHsKKyAgICAvKiBib29sZWFuIHRydWUgY2FzZSAqLworICAgIGxmX3ByaW50ZihmaWxlLCAiZGVmYXVsdDpcbiIpOworICB9CisgIGVsc2UgaWYgKGVudHJ5LT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgorCSAgIHx8IGVudHJ5LT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pIHsKKyAgICAvKiBub3JtYWwgZ290byAqLworICAgIGxmX3ByaW50ZihmaWxlLCAiY2FzZSAlZDpcbiIsIGVudHJ5LT5vcGNvZGVfbnIpOworICB9CisgIGVsc2UgaWYgKGVudHJ5LT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuKSB7CisgICAgLyogbGZfaW5kZW50KGZpbGUsIC0xKTsgKi8KKyAgICBwcmludF9nb3RvX3N3aXRjaF9uYW1lKGZpbGUsIGVudHJ5KTsKKyAgICBsZl9wcmludGYoZmlsZSwgIjpcbiIpOworICAgIC8qIGxmX2luZGVudChmaWxlLCArMSk7ICovCisgIH0KKyAgZWxzZSB7CisgICAgQVNTRVJUKCJiYWQgc3dpdGNoIiA9PSBOVUxMKTsKKyAgfQorICBsZl9pbmRlbnQoZmlsZSwgKzIpOworICB7CisgICAgaWYgKGVudHJ5LT5vcGNvZGUgPT0gTlVMTCkgeworICAgICAgLyogc3dpdGNoIGNhbGxpbmcgbGVhZiAqLworICAgICAgaWYgKChjb2RlICYgZ2VuZXJhdGVfanVtcHMpKQorCWxmX3ByaW50ZihmaWxlLCAiZ290byAiKTsKKyAgICAgIGlmICgoY29kZSAmIGdlbmVyYXRlX2NhbGxzKSkKKwlsZl9wcmludGYoZmlsZSwgIiVzICIsIHJlc3VsdCk7CisgICAgICBwcmludF9mdW5jdGlvbl9uYW1lKGZpbGUsCisJCQkgIGVudHJ5LT5pbnNucy0+ZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fbmFtZV0sCisJCQkgIGVudHJ5LT5leHBhbmRlZF9iaXRzLAorCQkJICAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkKKwkJCSAgID8gZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWNhY2hlCisJCQkgICA6IGZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljcykpOworICAgICAgaWYgKChjb2RlICYgZ2VuZXJhdGVfY2FsbHMpKQorCWxmX3ByaW50ZihmaWxlLCAiKCVzKSIsIFNFTUFOVElDX0ZVTkNUSU9OX0FDVFVBTCk7CisgICAgICBsZl9wcmludGYoZmlsZSwgIjtcbiIpOworICAgIH0KKyAgICBlbHNlIGlmIChlbnRyeS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBzd2l0Y2hfZ2VuCisJICAgICB8fCBlbnRyeS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBnb3RvX3N3aXRjaF9nZW4KKwkgICAgIHx8IGVudHJ5LT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKSB7CisgICAgICAvKiBzd2l0Y2ggY2FsbGluZyBzd2l0Y2ggKi8KKyAgICAgIHByaW50X2lkZWNvZGVfc3dpdGNoKGZpbGUsIGVudHJ5LCByZXN1bHQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIHN3aXRjaCBsb29raW5nIHVwIGEgdGFibGUgKi8KKyAgICAgIGxmX3ByaW50ZihmaWxlLCAie1xuIik7CisgICAgICBsZl9pbmRlbnQoZmlsZSwgLTIpOworICAgICAgcHJpbnRfaWRlY29kZV90YWJsZShmaWxlLCBlbnRyeSwgcmVzdWx0KTsKKyAgICAgIGxmX2luZGVudChmaWxlLCAtMik7CisgICAgICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworICAgIH0KKyAgICBpZiAoZW50cnktPnBhcmVudC0+b3Bjb2RlLT5pc19ib29sZWFuCisJfHwgZW50cnktPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBzd2l0Y2hfZ2VuCisJfHwgZW50cnktPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbikgeworICAgICAgbGZfcHJpbnRmKGZpbGUsICJicmVhaztcbiIpOworICAgIH0KKyAgICBlbHNlIGlmIChlbnRyeS0+cGFyZW50LT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbikgeworICAgICAgcHJpbnRfZ290b19zd2l0Y2hfYnJlYWsoZmlsZSwgZW50cnkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIEFTU0VSVCgiYmFkIHN3aXRjaCIgPT0gTlVMTCk7CisgICAgfQorICB9CisgIGxmX2luZGVudChmaWxlLCAtMik7Cit9CisKKworc3RhdGljIHZvaWQKK3ByaW50X2lkZWNvZGVfc3dpdGNoX2lsbGVnYWwobGYgKmZpbGUsCisJCQkgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCkKK3sKKyAgbGZfaW5kZW50KGZpbGUsICsyKTsKKyAgcHJpbnRfaWRlY29kZV9pbGxlZ2FsKGZpbGUsIHJlc3VsdCk7CisgIGxmX3ByaW50ZihmaWxlLCAiYnJlYWs7XG4iKTsKKyAgbGZfaW5kZW50KGZpbGUsIC0yKTsKK30KKworc3RhdGljIHZvaWQKK2lkZWNvZGVfc3dpdGNoX2VuZChpbnNuX3RhYmxlICp0YWJsZSwKKwkJICAgbGYgKmZpbGUsCisJCSAgIHZvaWQgKmRhdGEsCisJCSAgIGludCBkZXB0aCkKK3sKKyAgY29uc3QgY2hhciAqcmVzdWx0ID0gZGF0YTsKKyAgQVNTRVJUKGRlcHRoID09IDApOworICBBU1NFUlQodGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgorCSB8fCB0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBnb3RvX3N3aXRjaF9nZW4KKwkgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pOworICBBU1NFUlQodGFibGUtPm9wY29kZSk7CisKKyAgaWYgKHRhYmxlLT5vcGNvZGUtPmlzX2Jvb2xlYW4pIHsKKyAgICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworICB9CisgIGVsc2UgaWYgKHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IHN3aXRjaF9nZW4KKwkgICB8fCB0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbikgeworICAgIGxmX3ByaW50ZihmaWxlLCAiZGVmYXVsdDpcbiIpOworICAgIHN3aXRjaCAodGFibGUtPm9wY29kZV9ydWxlLT5nZW4pIHsKKyAgICBjYXNlIHN3aXRjaF9nZW46CisgICAgICBwcmludF9pZGVjb2RlX3N3aXRjaF9pbGxlZ2FsKGZpbGUsIHJlc3VsdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHBhZGRlZF9zd2l0Y2hfZ2VuOgorICAgICAgbGZfcHJpbnRmKGZpbGUsICIgIGVycm9yKFwiSW50ZXJuYWwgZXJyb3IgLSBiYWQgc3dpdGNoIGdlbmVyYXRlZFxcblwiKTtcbiIpOworICAgICAgbGZfcHJpbnRmKGZpbGUsICIgIGJyZWFrO1xuIik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgQVNTRVJUKCJiYWQgc3dpdGNoIiA9PSBOVUxMKTsKKyAgICB9CisgICAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKKyAgfQorICBlbHNlIGlmICh0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBnb3RvX3N3aXRjaF9nZW4pIHsKKyAgICBsZl9wcmludGYoZmlsZSwgImlsbGVnYWxfIik7CisgICAgbGZfcHJpbnRfdGFibGVfbmFtZShmaWxlLCB0YWJsZSk7CisgICAgbGZfcHJpbnRmKGZpbGUsICI6XG4iKTsKKyAgICBwcmludF9pZGVjb2RlX2lsbGVnYWwoZmlsZSwgcmVzdWx0KTsKKyAgICBsZl9wcmludGYoZmlsZSwgImJyZWFrXyIpOworICAgIGxmX3ByaW50X3RhYmxlX25hbWUoZmlsZSwgdGFibGUpOworICAgIGxmX3ByaW50ZihmaWxlLCAiOjtcbiIpOworICAgIGlmICh0YWJsZS0+cGFyZW50ICE9IE5VTEwKKwkmJiAodGFibGUtPnBhcmVudC0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBzd2l0Y2hfZ2VuCisJICAgIHx8IHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCisJICAgIHx8IHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pKSB7CisgICAgICBsZl9pbmRlbnQoZmlsZSwgLTIpOworICAgICAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgQVNTRVJUKCJiYWQgc3dpdGNoIiA9PSBOVUxMKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAoraWRlY29kZV9zd2l0Y2hfcGFkZGluZyhpbnNuX3RhYmxlICp0YWJsZSwKKwkJICAgICAgIGxmICpmaWxlLAorCQkgICAgICAgdm9pZCAqZGF0YSwKKwkJICAgICAgIGludCBkZXB0aCwKKwkJICAgICAgIGludCBvcGNvZGVfbnIpCit7CisgIGNvbnN0IGNoYXIgKnJlc3VsdCA9IGRhdGE7CisgIEFTU0VSVChkZXB0aCA9PSAwKTsKKyAgQVNTRVJUKHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IHN3aXRjaF9nZW4KKwkgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCisJIHx8IHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKTsKKworICBzd2l0Y2ggKHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuKSB7CisgIGNhc2Ugc3dpdGNoX2dlbjoKKyAgICBicmVhazsKKyAgY2FzZSBwYWRkZWRfc3dpdGNoX2dlbjoKKyAgICBsZl9wcmludGYoZmlsZSwgImNhc2UgJWQ6XG4iLCBvcGNvZGVfbnIpOworICAgIHByaW50X2lkZWNvZGVfc3dpdGNoX2lsbGVnYWwoZmlsZSwgcmVzdWx0KTsKKyAgICBicmVhazsKKyAgY2FzZSBnb3RvX3N3aXRjaF9nZW46CisgICAgLyogbm8gcGFkZGluZyBuZWVkZWQgKi8KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBBU1NFUlQoImJhZCBzd2l0Y2giICE9IE5VTEwpOworICB9Cit9CisKKwordm9pZAorcHJpbnRfaWRlY29kZV9zd2l0Y2gobGYgKmZpbGUsIAorCQkgICAgIGluc25fdGFibGUgKnRhYmxlLAorCQkgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCkKK3sKKyAgaW5zbl90YWJsZV90cmF2ZXJzZV90cmVlKHRhYmxlLAorCQkJICAgZmlsZSwgKHZvaWQqKXJlc3VsdCwKKwkJCSAgIDAsCisJCQkgICBpZGVjb2RlX3N3aXRjaF9zdGFydCwKKwkJCSAgIGlkZWNvZGVfc3dpdGNoX2xlYWYsCisJCQkgICBpZGVjb2RlX3N3aXRjaF9lbmQsCisJCQkgICBpZGVjb2RlX3N3aXRjaF9wYWRkaW5nKTsKK30KKworCitzdGF0aWMgdm9pZAorcHJpbnRfaWRlY29kZV9zd2l0Y2hfZnVuY3Rpb25faGVhZGVyKGxmICpmaWxlLAorCQkJCSAgICAgaW5zbl90YWJsZSAqdGFibGUsCisJCQkJICAgICBpbnQgaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKK3sKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV9jYWxscykpIHsKKyAgICBsZl9wcmludGYoZmlsZSwgInN0YXRpYyAiKTsKKyAgICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkpCisgICAgICBsZl9wcmludGYoZmlsZSwgImlkZWNvZGVfc2VtYW50aWMgKiIpOworICAgIGVsc2UKKyAgICAgIGxmX3ByaW50ZihmaWxlLCAidW5zaWduZWRfd29yZCIpOworICAgIGlmIChpc19mdW5jdGlvbl9kZWZpbml0aW9uKQorICAgICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICAgIGVsc2UKKyAgICAgIGxmX3ByaW50ZihmaWxlLCAiICIpOworICAgIGxmX3ByaW50X3RhYmxlX25hbWUoZmlsZSwgdGFibGUpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4oJXMpIiwgSUNBQ0hFX0ZVTkNUSU9OX0ZPUk1BTCk7CisgICAgaWYgKCFpc19mdW5jdGlvbl9kZWZpbml0aW9uKQorICAgICAgbGZfcHJpbnRmKGZpbGUsICI7Iik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICB9CisgIGlmICgoY29kZSAmIGdlbmVyYXRlX2p1bXBzKSAmJiBpc19mdW5jdGlvbl9kZWZpbml0aW9uKSB7CisgICAgbGZfaW5kZW50KGZpbGUsIC0xKTsKKyAgICBsZl9wcmludF90YWJsZV9uYW1lKGZpbGUsIHRhYmxlKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIjpcbiIpOworICAgIGxmX2luZGVudChmaWxlLCArMSk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAoraWRlY29kZV9kZWNsYXJlX2lmX3N3aXRjaChpbnNuX3RhYmxlICp0YWJsZSwKKwkJCSAgbGYgKmZpbGUsCisJCQkgIHZvaWQgKmRhdGEsCisJCQkgIGludCBkZXB0aCkKK3sKKyAgaWYgKCh0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBzd2l0Y2hfZ2VuCisgICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCisgICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gcGFkZGVkX3N3aXRjaF9nZW4pCisgICAgICAmJiB0YWJsZS0+cGFyZW50ICE9IE5VTEwgLyogZG9uJ3QgZGVjbGFyZSB0aGUgdG9wIG9uZSB5ZXQgKi8KKyAgICAgICYmIHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gYXJyYXlfZ2VuKSB7CisgICAgcHJpbnRfaWRlY29kZV9zd2l0Y2hfZnVuY3Rpb25faGVhZGVyKGZpbGUsCisJCQkJCSB0YWJsZSwKKwkJCQkJIDAvKmlzbnQgZnVuY3Rpb24gZGVmaW5pdGlvbiovKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitpZGVjb2RlX2V4cGFuZF9pZl9zd2l0Y2goaW5zbl90YWJsZSAqdGFibGUsCisJCQkgbGYgKmZpbGUsCisJCQkgdm9pZCAqZGF0YSwKKwkJCSBpbnQgZGVwdGgpCit7CisgIGlmICgodGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgorICAgICAgIHx8IHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IGdvdG9fc3dpdGNoX2dlbgorICAgICAgIHx8IHRhYmxlLT5vcGNvZGVfcnVsZS0+Z2VuID09IHBhZGRlZF9zd2l0Y2hfZ2VuKQorICAgICAgJiYgdGFibGUtPnBhcmVudCAhPSBOVUxMIC8qIGRvbid0IGV4cGFuZCB0aGUgdG9wIG9uZSB5ZXQgKi8KKyAgICAgICYmIHRhYmxlLT5wYXJlbnQtPm9wY29kZV9ydWxlLT5nZW4gPT0gYXJyYXlfZ2VuKSB7CisgICAgcHJpbnRfaWRlY29kZV9zd2l0Y2hfZnVuY3Rpb25faGVhZGVyKGZpbGUsCisJCQkJCSAgICB0YWJsZSwKKwkJCQkJICAgIDEvKmlzIGZ1bmN0aW9uIGRlZmluaXRpb24qLyk7CisgICAgaWYgKChjb2RlICYgZ2VuZXJhdGVfY2FsbHMpKSB7CisgICAgICBsZl9wcmludGYoZmlsZSwgIntcbiIpOworICAgICAgbGZfaW5kZW50KGZpbGUsICsyKTsKKyAgICB9CisgICAgcHJpbnRfaWRlY29kZV9zd2l0Y2goZmlsZSwgdGFibGUsICJyZXR1cm4iKTsKKyAgICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV9jYWxscykpIHsKKyAgICAgIGxmX2luZGVudChmaWxlLCAtMik7CisgICAgICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworICAgIH0KKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyB2b2lkCitwcmludF9pZGVjb2RlX2xvb2t1cHMobGYgKmZpbGUsCisJCSAgICAgIGluc25fdGFibGUgKnRhYmxlLAorCQkgICAgICBjYWNoZV90YWJsZSAqY2FjaGVfcnVsZXMpCit7CisgIGludCBkZXB0aDsKKworICAvKiBvdXRwdXQgc3dpdGNoIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyB3aGVyZSBuZWVkZWQgYnkgdGFibGVzICovCisgIGluc25fdGFibGVfdHJhdmVyc2VfdHJlZSh0YWJsZSwKKwkJCSAgIGZpbGUsIE5VTEwsCisJCQkgICAxLAorCQkJICAgaWRlY29kZV9kZWNsYXJlX2lmX3N3aXRjaCwgLyogU1RBUlQgKi8KKwkJCSAgIE5VTEwsIE5VTEwsIE5VTEwpOworICAKKyAgLyogb3V0cHV0IHRhYmxlcyB3aGVyZSBuZWVkZWQgKi8KKyAgZm9yIChkZXB0aCA9IGluc25fdGFibGVfZGVwdGgodGFibGUpOworICAgICAgIGRlcHRoID4gMDsKKyAgICAgICBkZXB0aC0tKSB7CisgICAgaW5zbl90YWJsZV90cmF2ZXJzZV90cmVlKHRhYmxlLAorCQkJICAgICBmaWxlLCBOVUxMLAorCQkJICAgICAxLWRlcHRoLAorCQkJICAgICBwcmludF9pZGVjb2RlX3RhYmxlX3N0YXJ0LAorCQkJICAgICBwcmludF9pZGVjb2RlX3RhYmxlX2xlYWYsCisJCQkgICAgIHByaW50X2lkZWNvZGVfdGFibGVfZW5kLAorCQkJICAgICBwcmludF9pZGVjb2RlX3RhYmxlX3BhZGRpbmcpOworICB9CisgIAorICAvKiBvdXRwdXQgc3dpdGNoIGZ1bmN0aW9ucyB3aGVyZSBuZWVkZWQgKi8KKyAgaW5zbl90YWJsZV90cmF2ZXJzZV90cmVlKHRhYmxlLAorCQkJICAgZmlsZSwgTlVMTCwKKwkJCSAgIDEsCisJCQkgICBpZGVjb2RlX2V4cGFuZF9pZl9zd2l0Y2gsIC8qIFNUQVJUICovCisJCQkgICBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworCitzdGF0aWMgdm9pZAorcHJpbnRfaWRlY29kZV9ib2R5KGxmICpmaWxlLAorCQkgICBpbnNuX3RhYmxlICp0YWJsZSwKKwkJICAgY29uc3QgY2hhciAqcmVzdWx0KQoreworICBpZiAodGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gc3dpdGNoX2dlbgorICAgICAgfHwgdGFibGUtPm9wY29kZV9ydWxlLT5nZW4gPT0gZ290b19zd2l0Y2hfZ2VuCisgICAgICB8fCB0YWJsZS0+b3Bjb2RlX3J1bGUtPmdlbiA9PSBwYWRkZWRfc3dpdGNoX2dlbikKKyAgICBwcmludF9pZGVjb2RlX3N3aXRjaChmaWxlLCB0YWJsZSwgcmVzdWx0KTsKKyAgZWxzZQorICAgIHByaW50X2lkZWNvZGVfdGFibGUoZmlsZSwgdGFibGUsIHJlc3VsdCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHZvaWQKK3ByaW50X3J1bl91bnRpbF9zdG9wX2JvZHkobGYgKmZpbGUsCisJCQkgIGluc25fdGFibGUgKnRhYmxlLAorCQkJICBpbnQgY2FuX3N0b3ApCit7CisgIC8qIE91dHB1dCB0aGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSByZWFsIGNvZGU6CisKKyAgICAgVW5mb3J0dW5hdGx5LCB0aGVyZSBhcmUgbXVsdGlwbGUgY2FzZXMgdG8gY29uc2lkZXIgdmlzOgorCisgICAgIDxpY2FjaGU+IFggPHNtcD4gWCA8ZXZlbnRzPiBYIDxrZWVwLXJ1bm5pbmctZmxhZz4gWCAuLi4KKworICAgICBDb25zZXF1ZW50bHkgdGhpcyBmdW5jdGlvbiBpcyB3cml0dGVuIGluIG11bHRpcGxlIGRpZmZlcmVudCB3YXlzICovCisKKyAgbGZfcHV0c3RyKGZpbGUsICJ7XG4iKTsKKyAgbGZfaW5kZW50KGZpbGUsICsyKTsKKyAgbGZfcHV0c3RyKGZpbGUsICJqbXBfYnVmIGhhbHQ7XG4iKTsKKyAgbGZfcHV0c3RyKGZpbGUsICJqbXBfYnVmIHJlc3RhcnQ7XG4iKTsKKyAgaWYgKCFnZW5lcmF0ZV9zbXApIHsKKyAgICBsZl9wdXRzdHIoZmlsZSwgImNwdSAqcHJvY2Vzc29yID0gTlVMTDtcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAidW5zaWduZWRfd29yZCBjaWEgPSAtMTtcbiIpOworICB9CisgIGxmX3B1dHN0cihmaWxlLCAiaW50IGxhc3RfY3B1O1xuIik7CisgIGlmIChnZW5lcmF0ZV9zbXApIHsKKyAgICBsZl9wdXRzdHIoZmlsZSwgImludCBjdXJyZW50X2NwdTtcbiIpOworICB9CisKKyAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKSB7CisgICAgbGZfcHV0c3RyKGZpbGUsICJpbnQgY3B1X25yO1xuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiLyogZmx1c2ggdGhlIGljYWNoZSBvZiBhIHBvc3NpYmxlIGJyZWFrIGluc24gKi9cbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiZm9yIChjcHVfbnIgPSAwOyBjcHVfbnIgPCBucl9jcHVzOyBjcHVfbnIrKylcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICBjcHVfZmx1c2hfaWNhY2hlKHByb2Nlc3NvcnNbY3B1X25yXSk7XG4iKTsKKyAgfQorCisgIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKKyAgbGZfcHV0c3RyKGZpbGUsICIvKiBzZXQgdGhlIGhhbHQgdGFyZ2V0IGluaXRpYWxseSAqL1xuIik7CisgIGxmX3B1dHN0cihmaWxlLCAicHNpbV9zZXRfaGFsdF9hbmRfcmVzdGFydChzeXN0ZW0sICZoYWx0LCBOVUxMKTtcbiIpOworICBsZl9wdXRzdHIoZmlsZSwgImlmIChzZXRqbXAoaGFsdCkpXG4iKTsKKyAgbGZfcHV0c3RyKGZpbGUsICIgIHJldHVybjtcbiIpOworCisgIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKKyAgbGZfcHV0c3RyKGZpbGUsICIvKiB3aGVyZSB3ZXJlIHdlIGJlZm9yZSB0aGUgaGFsdD8gKi9cbiIpOworICBsZl9wdXRzdHIoZmlsZSwgImxhc3RfY3B1ID0gcHNpbV9sYXN0X2NwdShzeXN0ZW0pO1xuIik7CisKKyAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOworICBsZl9wdXRzdHIoZmlsZSwgIi8qIGNoZWNrIGZvciBuZWVkIHRvIGZvcmNlIGV2ZW50IHByb2Nlc3NpbmcgZmlyc3QgKi9cbiIpOworICBsZl9wdXRzdHIoZmlsZSwgImlmIChXSVRIX0VWRU5UUykge1xuIik7CisgIGxmX3B1dHN0cihmaWxlLCAiICBpZiAobGFzdF9jcHUgPT0gbnJfY3B1cykge1xuIik7CisgIGxmX3B1dHN0cihmaWxlLCAiICAgIC8qIGhhbHRlZCBkdXJpbmcgZXZlbnQgcHJvY2Vzc2luZyAqL1xuIik7CisgIGxmX3B1dHN0cihmaWxlLCAiICAgIGV2ZW50X3F1ZXVlX3Byb2Nlc3MoZXZlbnRzKTtcbiIpOworICBsZl9wdXRzdHIoZmlsZSwgIiAgICBsYXN0X2NwdSA9IC0xO1xuIik7CisgIGxmX3B1dHN0cihmaWxlLCAiICB9XG4iKTsKKyAgbGZfcHV0c3RyKGZpbGUsICIgIGVsc2UgaWYgKGxhc3RfY3B1ID09IG5yX2NwdXMgLSAxKSB7XG4iKTsKKyAgbGZfcHV0c3RyKGZpbGUsICIgICAgLyogbGFzdCBjcHUgZGlkIGhhbHQgKi9cbiIpOworICBsZl9wdXRzdHIoZmlsZSwgIiAgICBpZiAoZXZlbnRfcXVldWVfdGljayhldmVudHMpKSB7XG4iKTsKKyAgbGZfcHV0c3RyKGZpbGUsICIgICAgICBldmVudF9xdWV1ZV9wcm9jZXNzKGV2ZW50cyk7XG4iKTsKKyAgbGZfcHV0c3RyKGZpbGUsICIgICAgfVxuIik7CisgIGxmX3B1dHN0cihmaWxlLCAiICAgIGxhc3RfY3B1ID0gLTE7XG4iKTsKKyAgbGZfcHV0c3RyKGZpbGUsICIgIH1cbiIpOworICBsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOworICBsZl9wdXRzdHIoZmlsZSwgImVsc2Uge1xuIik7CisgIGxmX3B1dHN0cihmaWxlLCAiIGlmIChsYXN0X2NwdSA9PSBucl9jcHVzIC0gMSlcbiIpOworICBsZl9wdXRzdHIoZmlsZSwgIiAgIC8qIGNwdSB6ZXJvIGlzIG5leHQgKi9cbiIpOworICBsZl9wdXRzdHIoZmlsZSwgIiAgIGxhc3RfY3B1ID0gLTE7XG4iKTsKKyAgbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKKworICBsZl9wdXRzdHIoZmlsZSwgIlxuIik7CisgIGxmX3B1dHN0cihmaWxlLCAiLyogaGF2ZSBlbnN1cmVkIHRoYXQgdGhlIGV2ZW50IHF1ZXVlIGNhbiBub3QgYmUgZmlyc3QgKi9cbiIpOworICBsZl9wdXRzdHIoZmlsZSwgIkFTU0VSVChsYXN0X2NwdSA+PSAtMSAmJiBsYXN0X2NwdSA8IG5yX2NwdXMgLSAxKTtcbiIpOworCisgIGlmICghZ2VuZXJhdGVfc21wKSB7CisKKyAgICBsZl9wdXRzdHIoZmlsZSwgIgorLyogQ0FTRSAxOiBOTyBTTVAgKHdpdGggb3Igd2l0aCBvdXQgaW5zdHJ1Y3Rpb24gY2FjaGUpLgorCisgICBJbiB0aGlzIGNhc2UsIHdlIGNhbiB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IHRoZSBjdXJyZW50CisgICBpbnN0cnVjdGlvbiBhZGRyZXNzIGRvZXMgbm90IG5lZWQgdG8gYmUgcmV0dXJuZWQgdG8gdGhlIGNwdSBvYmplY3QKKyAgIGFmdGVyIGV2ZXJ5IGV4ZWN1dGlvbiBvZiBhbiBpbnN0cnVjdGlvbi4gIEluc3RlYWQgaXQgb25seSBuZWVkcyB0bworICAgYmUgc2F2ZWQgd2hlbiBlaXRoZXIgQS4gdGhlIG1haW4gbG9vcCBleGl0cyBvciBCLiBBIGNwdS1oYWx0IG9yCisgICBjcHUtcmVzdGFydCBjYWxsIGZvcmNlcyB0aGUgbG9vcCB0byBiZSByZS1lbmVyZWQuICBUaGUgbGF0ZXIKKyAgIGZ1bmN0aW9ucyBhbHdheXMgc2F2ZSB0aGUgY3VycmVudCBjcHUgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4KKworICAgVHdvIHN1YmNhc2VzIGFsc28gZXhpc3QgdGhhdCB3aXRoIGFuZCB0aGF0IHdpdGhvdXQgYW4gaW5zdHJ1Y3Rpb24KKyAgIGNhY2hlLgorCisgICBBbiBhZGRpdGlvbmFsIGNvbXBsZXhpdHkgaXMgdGhlIG5lZWQgdG8gZW5zdXJlIHRoYXQgYSAxOjEgcmF0aW8KKyAgIGlzIG1haW50YWluZWQgYmV0d2VlbiB0aGUgZXhlY3V0aW9uIG9mIGFuIGluc3RydWN0aW9uIGFuZCB0aGUKKyAgIGluY3JlbWVudGluZyBvZiB0aGUgc2ltdWxhdGlvbiBjbG9jayAqLyIpOworCisgICAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOworCisgICAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiLyogbm93IGFkZCByZXN0YXJ0IHRhcmdldCBhcyByZWFkeSB0byBydW4gKi9cbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAicHNpbV9zZXRfaGFsdF9hbmRfcmVzdGFydChzeXN0ZW0sICZoYWx0LCAmcmVzdGFydCk7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgImlmIChzZXRqbXAocmVzdGFydCkpIHtcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICBpZiAoV0lUSF9FVkVOVFMpIHtcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICAgIC8qIHdoZW4gcmVzdGFydCwgY3B1IG11c3QgaGF2ZSBiZWVuIGxhc3QsIGNsb2NrIG5leHQgKi9cbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICAgIGlmIChldmVudF9xdWV1ZV90aWNrKGV2ZW50cykpIHtcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICAgICAgZXZlbnRfcXVldWVfcHJvY2VzcyhldmVudHMpO1xuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICIgICAgfVxuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICIgIH1cbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAifVxuIik7CisKKyAgICBsZl9wdXRzdHIoZmlsZSwgIlxuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICIvKiBwcmltZSB0aGUgbWFpbiBsb29wICovXG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgInByb2Nlc3NvciA9IHByb2Nlc3NvcnNbMF07XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgImNpYSA9IGNwdV9nZXRfcHJvZ3JhbV9jb3VudGVyKHByb2Nlc3Nvcik7XG4iKTsKKworICAgIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIndoaWxlICgxKSB7XG4iKTsKKyAgICBsZl9pbmRlbnQoZmlsZSwgKzIpOworCisgICAgaWYgKCEoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKSkgeworICAgICAgbGZfcHV0c3RyKGZpbGUsICJpbnN0cnVjdGlvbl93b3JkIGluc3RydWN0aW9uID1cbiIpOworICAgICAgbGZfcHV0c3RyKGZpbGUsICIgIHZtX2luc3RydWN0aW9uX21hcF9yZWFkKGNwdV9pbnN0cnVjdGlvbl9tYXAocHJvY2Vzc29yKSwgcHJvY2Vzc29yLCBjaWEpO1xuIik7CisgICAgICBsZl9wdXRzdHIoZmlsZSwgIlxuIik7CisgICAgICBwcmludF9pZGVjb2RlX2JvZHkoZmlsZSwgdGFibGUsICJjaWEgPSIpOzsKKyAgICB9CisKKyAgICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkpIHsKKyAgICAgIGxmX3B1dHN0cihmaWxlLCAiaWRlY29kZV9jYWNoZSAqY2FjaGVfZW50cnkgPVxuIik7CisgICAgICBsZl9wdXRzdHIoZmlsZSwgIiAgY3B1X2ljYWNoZV9lbnRyeShwcm9jZXNzb3IsIGNpYSk7XG4iKTsKKyAgICAgIGxmX3B1dHN0cihmaWxlLCAiaWYgKGNhY2hlX2VudHJ5LT5hZGRyZXNzID09IGNpYSkge1xuIik7CisgICAgICBsZl9wdXRzdHIoZmlsZSwgIiAgLyogY2FjaGUgaGl0ICovXG4iKTsKKyAgICAgIGxmX3B1dHN0cihmaWxlLCAiICBpZGVjb2RlX3NlbWFudGljICpjb25zdCBzZW1hbnRpYyA9IGNhY2hlX2VudHJ5LT5zZW1hbnRpYztcbiIpOworICAgICAgbGZfcHV0c3RyKGZpbGUsICIgIGNpYSA9IHNlbWFudGljKHByb2Nlc3NvciwgY2FjaGVfZW50cnksIGNpYSk7XG4iKTsKKyAgICAgIC8qIHRhaWwgKi8KKyAgICAgIGlmIChjYW5fc3RvcCkgeworCWxmX3B1dHN0cihmaWxlLCAiaWYgKGtlZXBfcnVubmluZyAhPSBOVUxMICYmICEqa2VlcF9ydW5uaW5nKVxuIik7CisJbGZfcHV0c3RyKGZpbGUsICIgIGNwdV9oYWx0KHByb2Nlc3NvciwgY2lhLCB3YXNfY29udGludWluZywgMC8qaWdub3JlKi8pO1xuIik7CisgICAgICB9CisgICAgICBsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOworICAgICAgbGZfcHV0c3RyKGZpbGUsICJlbHNlIHtcbiIpOworICAgICAgbGZfcHV0c3RyKGZpbGUsICIgIC8qIGNhY2hlIG1pc3MgKi9cbiIpOworICAgICAgaWYgKCEoY29kZSAmIGdlbmVyYXRlX3dpdGhfc2VtYW50aWNfaWNhY2hlKSkgeworCWxmX2luZGVudChmaWxlLCArMik7CisJbGZfcHV0c3RyKGZpbGUsICJpZGVjb2RlX3NlbWFudGljICpzZW1hbnRpYztcbiIpOworCWxmX2luZGVudChmaWxlLCAtMik7CisgICAgICB9CisgICAgICBsZl9wdXRzdHIoZmlsZSwgIiAgaW5zdHJ1Y3Rpb25fd29yZCBpbnN0cnVjdGlvbiA9XG4iKTsKKyAgICAgIGxmX3B1dHN0cihmaWxlLCAiICAgIHZtX2luc3RydWN0aW9uX21hcF9yZWFkKGNwdV9pbnN0cnVjdGlvbl9tYXAocHJvY2Vzc29yKSwgcHJvY2Vzc29yLCBjaWEpO1xuIik7CisgICAgICBsZl9wdXRzdHIoZmlsZSwgIiAgaWYgKFdJVEhfTU9OICE9IDApXG4iKTsKKyAgICAgIGxmX3B1dHN0cihmaWxlLCAiICAgIG1vbl9ldmVudChtb25fZXZlbnRfaWNhY2hlX21pc3MsIHByb2Nlc3NvciwgY2lhKTtcbiIpOworICAgICAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9zZW1hbnRpY19pY2FjaGUpKSB7CisJbGZfcHV0c3RyKGZpbGUsICJ7XG4iKTsKKwlsZl9pbmRlbnQoZmlsZSwgKzIpOworCXByaW50X2lkZWNvZGVfYm9keShmaWxlLCB0YWJsZSwgImNpYSA9Iik7CisJbGZfaW5kZW50KGZpbGUsIC0yKTsKKwlsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOworICAgICAgfQorICAgICAgZWxzZSB7CisJcHJpbnRfaWRlY29kZV9ib2R5KGZpbGUsIHRhYmxlLCAic2VtYW50aWMgPSIpOworCWxmX3B1dHN0cihmaWxlLCAiICBjaWEgPSBzZW1hbnRpYyhwcm9jZXNzb3IsIGNhY2hlX2VudHJ5LCBjaWEpO1xuIik7CisgICAgICB9CisgICAgICBsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOworICAgIH0KKworICAgIC8qIGV2ZW50cyAqLworICAgIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIi8qIHByb2Nlc3MgYW55IGV2ZW50cyAqL1xuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICJpZiAoV0lUSF9FVkVOVFMpIHtcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICBpZiAoZXZlbnRfcXVldWVfdGljayhldmVudHMpKSB7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICBjcHVfc2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IsIGNpYSk7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICBldmVudF9xdWV1ZV9wcm9jZXNzKGV2ZW50cyk7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICBjaWEgPSBjcHVfZ2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IpO1xuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICIgIH1cbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAifVxuIik7CisKKyAgICAvKiB0YWlsICovCisgICAgaWYgKGNhbl9zdG9wKSB7CisgICAgICBsZl9wdXRzdHIoZmlsZSwgIlxuIik7CisgICAgICBsZl9wdXRzdHIoZmlsZSwgIi8qIGFib3J0IGlmIG5lY2Vzc2FyeSAqL1xuIik7CisgICAgICBsZl9wdXRzdHIoZmlsZSwgImlmIChrZWVwX3J1bm5pbmcgIT0gTlVMTCAmJiAhKmtlZXBfcnVubmluZylcbiIpOworICAgICAgbGZfcHV0c3RyKGZpbGUsICIgIGNwdV9oYWx0KHByb2Nlc3NvciwgY2lhLCB3YXNfY29udGludWluZywgMC8qbm90IGltcG9ydGFudCovKTtcbiIpOworICAgIH0KKworICAgIGxmX2luZGVudChmaWxlLCAtMik7CisgICAgbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKKyAgfQorICAgIAorICBpZiAoZ2VuZXJhdGVfc21wKSB7CisKKyAgICBsZl9wdXRzdHIoZmlsZSwgIgorLyogQ0FTRSAyOiBTTVAgKFdpdGggb3Igd2l0aG91dCBJQ0FDSEUpCisKKyAgIFRoZSBjb21wbGV4aXR5IGhlcmUgY29tZXMgZnJvbSBuZWVkaW5nIHRvIGNvcnJlY3RseSByZXN0YXJ0IHRoZQorICAgc3lzdGVtIHdoZW4gaXQgaXMgYWJvcnRlZC4gIEluIHBhcnRpY3VsYXIgaWYgY3B1MCByZXF1ZXN0cyBhCisgICByZXN0YXJ0LCB0aGUgbmV4dCBjcHUgaXMgc3RpbGwgY3B1MS4gIENwdTAgYmVpbmcgcmVzdGFydGVkIGFmdGVyCisgICBhbGwgdGhlIG90aGVyIENQVSdzIGFuZCB0aGUgZXZlbnQgcXVldWUgaGF2ZSBiZWVuIHByb2Nlc3NlZCAqLyIpOworCisgICAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOworCisgICAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiLyogbm93IGVzdGFibGlzaCB0aGUgcmVzdGFydCB0YXJnZXQgKi9cbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAicHNpbV9zZXRfaGFsdF9hbmRfcmVzdGFydChzeXN0ZW0sICZoYWx0LCAmcmVzdGFydCk7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgImlmIChzZXRqbXAocmVzdGFydCkpIHtcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICBjdXJyZW50X2NwdSA9IHBzaW1fbGFzdF9jcHUoc3lzdGVtKTtcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICBBU1NFUlQoY3VycmVudF9jcHUgPj0gMCAmJiBjdXJyZW50X2NwdSA8IG5yX2NwdXMpO1xuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgImVsc2Uge1xuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICIgIGN1cnJlbnRfY3B1ID0gbGFzdF9jcHU7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIiAgQVNTRVJUKGN1cnJlbnRfY3B1ID49IC0xICYmIGN1cnJlbnRfY3B1IDwgbnJfY3B1cyk7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOworICAgIAorCisgICAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAid2hpbGUgKDEpIHtcbiIpOworICAgIGxmX2luZGVudChmaWxlLCArMik7CisKKyAgICBsZl9wdXRzdHIoZmlsZSwgIlxuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICJpZiAoV0lUSF9FVkVOVFMpIHtcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICBjdXJyZW50X2NwdSArPSAxO1xuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICIgIGlmIChjdXJyZW50X2NwdSA9PSBucl9jcHVzKSB7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICBpZiAoZXZlbnRfcXVldWVfdGljayhldmVudHMpKSB7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICAgIGV2ZW50X3F1ZXVlX3Byb2Nlc3MoZXZlbnRzKTtcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICAgIH1cbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICAgIGN1cnJlbnRfY3B1ID0gMDtcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICB9XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiZWxzZSB7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIiAgY3VycmVudF9jcHUgPSAoY3VycmVudF9jcHUgKyAxKSAlIG5yX2NwdXM7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOworCisgICAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAie1xuIik7CisgICAgbGZfaW5kZW50KGZpbGUsICsyKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgImNwdSAqcHJvY2Vzc29yID0gcHJvY2Vzc29yc1tjdXJyZW50X2NwdV07XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgInVuc2lnbmVkX3dvcmQgY2lhID1cbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICBjcHVfZ2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IpO1xuIik7CisKKyAgICBpZiAoIShjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKSB7CisgICAgICBsZl9wdXRzdHIoZmlsZSwgImluc3RydWN0aW9uX3dvcmQgaW5zdHJ1Y3Rpb24gPVxuIik7CisgICAgICBsZl9wdXRzdHIoZmlsZSwgIiAgdm1faW5zdHJ1Y3Rpb25fbWFwX3JlYWQoY3B1X2luc3RydWN0aW9uX21hcChwcm9jZXNzb3IpLCBwcm9jZXNzb3IsIGNpYSk7XG4iKTsKKyAgICAgIHByaW50X2lkZWNvZGVfYm9keShmaWxlLCB0YWJsZSwgImNpYSA9Iik7CisgICAgICBpZiAoY2FuX3N0b3ApIHsKKwlsZl9wdXRzdHIoZmlsZSwgImlmIChrZWVwX3J1bm5pbmcgIT0gTlVMTCAmJiAhKmtlZXBfcnVubmluZylcbiIpOworCWxmX3B1dHN0cihmaWxlLCAiICBjcHVfaGFsdChwcm9jZXNzb3IsIGNpYSwgd2FzX2NvbnRpbnVpbmcsIDAvKmlnbm9yZSovKTtcbiIpOworICAgICAgfQorICAgICAgbGZfcHV0c3RyKGZpbGUsICJjcHVfc2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IsIGNpYSk7XG4iKTsKKyAgICB9CisKKyAgICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkpIHsKKyAgICAgIGxmX3B1dHN0cihmaWxlLCAiaWRlY29kZV9jYWNoZSAqY2FjaGVfZW50cnkgPVxuIik7CisgICAgICBsZl9wdXRzdHIoZmlsZSwgIiAgY3B1X2ljYWNoZV9lbnRyeShwcm9jZXNzb3IsIGNpYSk7XG4iKTsKKyAgICAgIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKKyAgICAgIGxmX3B1dHN0cihmaWxlLCAiaWYgKGNhY2hlX2VudHJ5LT5hZGRyZXNzID09IGNpYSkge1xuIik7CisgICAgICB7CisJbGZfaW5kZW50KGZpbGUsICsyKTsKKwlsZl9wdXRzdHIoZmlsZSwgIlxuIik7CisJbGZfcHV0c3RyKGZpbGUsICIvKiBjYWNoZSBoaXQgKi9cbiIpOworCWxmX3B1dHN0cihmaWxlLCAiaWRlY29kZV9zZW1hbnRpYyAqc2VtYW50aWMgPSBjYWNoZV9lbnRyeS0+c2VtYW50aWM7XG4iKTsKKwlsZl9wdXRzdHIoZmlsZSwgImNpYSA9IHNlbWFudGljKHByb2Nlc3NvciwgY2FjaGVfZW50cnksIGNpYSk7XG4iKTsKKwkvKiB0YWlsICovCisJaWYgKGNhbl9zdG9wKSB7CisJICBsZl9wdXRzdHIoZmlsZSwgImlmIChrZWVwX3J1bm5pbmcgIT0gTlVMTCAmJiAhKmtlZXBfcnVubmluZylcbiIpOworCSAgbGZfcHV0c3RyKGZpbGUsICIgIGNwdV9oYWx0KHByb2Nlc3NvciwgY2lhLCB3YXNfY29udGludWluZywgMC8qaWdub3JlLXNpZ25hbCovKTtcbiIpOworCX0KKwlsZl9wdXRzdHIoZmlsZSwgImNwdV9zZXRfcHJvZ3JhbV9jb3VudGVyKHByb2Nlc3NvciwgY2lhKTtcbiIpOworCWxmX3B1dHN0cihmaWxlLCAiXG4iKTsKKwlsZl9pbmRlbnQoZmlsZSwgLTIpOworICAgICAgfQorICAgICAgbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKKyAgICAgIGxmX3B1dHN0cihmaWxlLCAiZWxzZSB7XG4iKTsKKyAgICAgIHsKKwlsZl9pbmRlbnQoZmlsZSwgKzIpOworCWxmX3B1dHN0cihmaWxlLCAiXG4iKTsKKwlsZl9wdXRzdHIoZmlsZSwgIi8qIGNhY2hlIG1pc3MgKi9cbiIpOworCWlmICghKGNvZGUgJiBnZW5lcmF0ZV93aXRoX3NlbWFudGljX2ljYWNoZSkpIHsKKwkgIGxmX3B1dHN0cihmaWxlLCAiaWRlY29kZV9zZW1hbnRpYyAqc2VtYW50aWM7XG4iKTsKKwl9CisJbGZfcHV0c3RyKGZpbGUsICJpbnN0cnVjdGlvbl93b3JkIGluc3RydWN0aW9uID1cbiIpOworCWxmX3B1dHN0cihmaWxlLCAiICB2bV9pbnN0cnVjdGlvbl9tYXBfcmVhZChjcHVfaW5zdHJ1Y3Rpb25fbWFwKHByb2Nlc3NvciksIHByb2Nlc3NvciwgY2lhKTtcbiIpOworCWxmX3B1dHN0cihmaWxlLCAiaWYgKFdJVEhfTU9OICE9IDApXG4iKTsKKwlsZl9wdXRzdHIoZmlsZSwgIiAgbW9uX2V2ZW50KG1vbl9ldmVudF9pY2FjaGVfbWlzcywgcHJvY2Vzc29yc1tjdXJyZW50X2NwdV0sIGNpYSk7XG4iKTsKKwlpZiAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX3NlbWFudGljX2ljYWNoZSkpIHsKKwkgIGxmX3B1dHN0cihmaWxlLCAie1xuIik7CisJICBsZl9pbmRlbnQoZmlsZSwgKzIpOworCSAgcHJpbnRfaWRlY29kZV9ib2R5KGZpbGUsIHRhYmxlLCAiY2lhID0iKTsKKwkgIGxmX2luZGVudChmaWxlLCAtMik7CisJICBsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOworCX0KKwllbHNlIHsKKwkgIHByaW50X2lkZWNvZGVfYm9keShmaWxlLCB0YWJsZSwgInNlbWFudGljID0gIik7CisJICBsZl9wdXRzdHIoZmlsZSwgImNpYSA9IHNlbWFudGljKHByb2Nlc3NvciwgY2FjaGVfZW50cnksIGNpYSk7XG4iKTsKKwl9CisJLyogdGFpbCAqLworCWlmIChjYW5fc3RvcCkgeworCSAgbGZfcHV0c3RyKGZpbGUsICJpZiAoa2VlcF9ydW5uaW5nICE9IE5VTEwgJiYgISprZWVwX3J1bm5pbmcpXG4iKTsKKwkgIGxmX3B1dHN0cihmaWxlLCAiICBjcHVfaGFsdChwcm9jZXNzb3IsIGNpYSwgd2FzX2NvbnRpbnVpbmcsIDAvKmlnbm9yZS1zaWduYWwqLyk7XG4iKTsKKwl9CisJbGZfcHV0c3RyKGZpbGUsICJjcHVfc2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IsIGNpYSk7XG4iKTsKKwlsZl9wdXRzdHIoZmlsZSwgIlxuIik7CisJbGZfaW5kZW50KGZpbGUsIC0yKTsKKyAgICAgIH0KKyAgICAgIGxmX3B1dHN0cihmaWxlLCAifVxuIik7CisgICAgfQorCisgICAgLyogY2xvc2UgKi8KKyAgICBsZl9pbmRlbnQoZmlsZSwgLTIpOworICAgIGxmX3B1dHN0cihmaWxlLCAifVxuIik7CisKKyAgICAvKiB0YWlsICovCisgICAgbGZfaW5kZW50KGZpbGUsIC0yKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOworICB9CisKKworICBsZl9pbmRlbnQoZmlsZSwgLTIpOworICBsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorcHJpbnRfanVtcChsZiAqZmlsZSwKKwkgICBpbnQgaXNfdGFpbCkKK3sKKyAgaWYgKGlzX3RhaWwpIHsKKyAgICBsZl9wdXRzdHIoZmlsZSwgImlmIChrZWVwX3J1bm5pbmcgIT0gTlVMTCAmJiAhKmtlZXBfcnVubmluZylcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICBjcHVfaGFsdChwcm9jZXNzb3IsIG5pYSwgd2FzX2NvbnRpbnVpbmcsIDAvKm5hKi8pO1xuIik7CisgIH0KKyAgCisgIGlmICghZ2VuZXJhdGVfc21wKSB7CisgICAgbGZfcHV0c3RyKGZpbGUsICJpZiAoV0lUSF9FVkVOVFMpIHtcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICBpZiAoZXZlbnRfcXVldWVfdGljayhldmVudHMpKSB7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICBjcHVfc2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IsIG5pYSk7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICBldmVudF9xdWV1ZV9wcm9jZXNzKGV2ZW50cyk7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICBuaWEgPSBjcHVfZ2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IpO1xuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICIgIH1cbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAifVxuIik7CisgIH0KKworICBpZiAoZ2VuZXJhdGVfc21wKSB7CisgICAgaWYgKGlzX3RhaWwpCisgICAgICBsZl9wdXRzdHIoZmlsZSwgImNwdV9zZXRfcHJvZ3JhbV9jb3VudGVyKHByb2Nlc3NvciwgbmlhKTtcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiaWYgKFdJVEhfRVZFTlRTKSB7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIiAgY3VycmVudF9jcHUgKz0gMTtcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICBpZiAoY3VycmVudF9jcHUgPj0gbnJfY3B1cykge1xuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICIgICAgaWYgKGV2ZW50X3F1ZXVlX3RpY2soZXZlbnRzKSkge1xuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICIgICAgICBldmVudF9xdWV1ZV9wcm9jZXNzKGV2ZW50cyk7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICB9XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIiAgICBjdXJyZW50X2NwdSA9IDA7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIiAgfVxuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgImVsc2Uge1xuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICIgIGN1cnJlbnRfY3B1ID0gKGN1cnJlbnRfY3B1ICsgMSkgJSBucl9jcHVzO1xuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICJ9XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgInByb2Nlc3NvciA9IHByb2Nlc3NvcnNbY3VycmVudF9jcHVdO1xuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICJuaWEgPSBjcHVfZ2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IpO1xuIik7CisgIH0KKworICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkpIHsKKyAgICBsZl9wdXRzdHIoZmlsZSwgImNhY2hlX2VudHJ5ID0gY3B1X2ljYWNoZV9lbnRyeShwcm9jZXNzb3IsIG5pYSk7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgImlmIChjYWNoZV9lbnRyeS0+YWRkcmVzcyA9PSBuaWEpIHtcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICAvKiBjYWNoZSBoaXQgKi9cbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICBnb3RvICpjYWNoZV9lbnRyeS0+c2VtYW50aWM7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOworICAgIGlmIChpc190YWlsKSB7CisgICAgICBsZl9wdXRzdHIoZmlsZSwgImdvdG8gY2FjaGVfbWlzcztcbiIpOworICAgIH0KKyAgfQorCisgIGlmICghKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkgJiYgaXNfdGFpbCkgeworICAgIGxmX3ByaW50ZihmaWxlLCAiZ290byBpZGVjb2RlO1xuIik7CisgIH0KKworfQorCisKKworCisKK3N0YXRpYyB2b2lkCitwcmludF9qdW1wX2luc24obGYgKmZpbGUsCisJCWluc24gKmluc3RydWN0aW9uLAorCQlpbnNuX2JpdHMgKmV4cGFuZGVkX2JpdHMsCisJCW9wY29kZV9maWVsZCAqb3Bjb2RlcywKKwkJY2FjaGVfdGFibGUgKmNhY2hlX3J1bGVzKQoreworCisgIC8qIHdoYXQgd2UgYXJlIGZvciB0aGUgbW9tZW50ICovCisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgcHJpbnRfbXlfZGVmaW5lcyhmaWxlLCBleHBhbmRlZF9iaXRzLCBpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeSk7CisKKyAgLyogb3V0cHV0IHRoZSBpY2FjaGUgZW50cnkgKi8KKyAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKSB7CisgICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICAgIGxmX2luZGVudChmaWxlLCAtMSk7CisgICAgcHJpbnRfZnVuY3Rpb25fbmFtZShmaWxlLAorCQkJaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAorCQkJZXhwYW5kZWRfYml0cywKKwkJCWZ1bmN0aW9uX25hbWVfcHJlZml4X2ljYWNoZSk7CisgICAgbGZfcHJpbnRmKGZpbGUsICI6XG4iKTsKKyAgICBsZl9pbmRlbnQoZmlsZSwgKzEpOworICAgIGxmX3ByaW50ZihmaWxlLCAie1xuIik7CisgICAgbGZfaW5kZW50KGZpbGUsICsyKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgImNvbnN0IHVuc2lnbmVkX3dvcmQgY2lhID0gbmlhO1xuIik7CisgICAgcHJpbnRfaXRyYWNlKGZpbGUsIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LCAxLypwdXR0aW5nLXZhbHVlLWluLWNhY2hlKi8pOworICAgIHByaW50X2lkZWNvZGVfdmFsaWRhdGUoZmlsZSwgaW5zdHJ1Y3Rpb24sIG9wY29kZXMpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIntcbiIpOworICAgIGxmX2luZGVudChmaWxlLCArMik7CisgICAgcHJpbnRfaWNhY2hlX2JvZHkoZmlsZSwKKwkJICAgICAgaW5zdHJ1Y3Rpb24sCisJCSAgICAgIGV4cGFuZGVkX2JpdHMsCisJCSAgICAgIGNhY2hlX3J1bGVzLAorCQkgICAgICAwLCAvKnVzZV9kZWZpbmVzKi8KKwkJICAgICAgcHV0X3ZhbHVlc19pbl9pY2FjaGUpOworICAgIGxmX3ByaW50ZihmaWxlLCAiY2FjaGVfZW50cnktPmFkZHJlc3MgPSBuaWE7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgImNhY2hlX2VudHJ5LT5zZW1hbnRpYyA9ICYmIik7CisgICAgcHJpbnRfZnVuY3Rpb25fbmFtZShmaWxlLAorCQkJaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAorCQkJZXhwYW5kZWRfYml0cywKKwkJCWZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljcyk7CisgICAgbGZfcHJpbnRmKGZpbGUsICI7XG4iKTsKKyAgICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX3NlbWFudGljX2ljYWNoZSkpIHsKKyAgICAgIHByaW50X3NlbWFudGljX2JvZHkoZmlsZSwKKwkJCSAgaW5zdHJ1Y3Rpb24sCisJCQkgIGV4cGFuZGVkX2JpdHMsCisJCQkgIG9wY29kZXMpOworICAgICAgcHJpbnRfanVtcChmaWxlLCAxLyppcy10YWlsKi8pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGxmX3ByaW50ZihmaWxlLCAiLyogZ290byAiKTsKKyAgICAgIHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKKwkJCSAgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAorCQkJICBleHBhbmRlZF9iaXRzLAorCQkJICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpOworICAgICAgbGZfcHJpbnRmKGZpbGUsICI7ICovXG4iKTsKKyAgICB9CisgICAgbGZfaW5kZW50KGZpbGUsIC0yKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIn1cbiIpOworICAgIGxmX2luZGVudChmaWxlLCAtMik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKKyAgfQorCisgIC8qIHByaW50IHRoZSBzZW1hbnRpY3MgKi8KKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9pbmRlbnQoZmlsZSwgLTEpOworICBwcmludF9mdW5jdGlvbl9uYW1lKGZpbGUsCisJCSAgICAgIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSwKKwkJICAgICAgZXhwYW5kZWRfYml0cywKKwkJICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKTsKKyAgbGZfcHJpbnRmKGZpbGUsICI6XG4iKTsKKyAgbGZfaW5kZW50KGZpbGUsICsxKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKKyAgbGZfaW5kZW50KGZpbGUsICsyKTsKKyAgbGZfcHV0c3RyKGZpbGUsICJjb25zdCB1bnNpZ25lZF93b3JkIGNpYSA9IG5pYTtcbiIpOworICBwcmludF9pY2FjaGVfYm9keShmaWxlLAorCQkgICAgaW5zdHJ1Y3Rpb24sCisJCSAgICBleHBhbmRlZF9iaXRzLAorCQkgICAgY2FjaGVfcnVsZXMsCisJCSAgICAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2RpcmVjdF9hY2Nlc3MpCisJCSAgICAgPyBkZWZpbmVfdmFyaWFibGVzCisJCSAgICAgOiBkZWNsYXJlX3ZhcmlhYmxlcyksCisJCSAgICAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkKKwkJICAgICA/IGdldF92YWx1ZXNfZnJvbV9pY2FjaGUKKwkJICAgICA6IGRvX25vdF91c2VfaWNhY2hlKSk7CisgIHByaW50X3NlbWFudGljX2JvZHkoZmlsZSwKKwkJICAgICAgaW5zdHJ1Y3Rpb24sCisJCSAgICAgIGV4cGFuZGVkX2JpdHMsCisJCSAgICAgIG9wY29kZXMpOworICBpZiAoY29kZSAmIGdlbmVyYXRlX3dpdGhfZGlyZWN0X2FjY2VzcykKKyAgICBwcmludF9pY2FjaGVfYm9keShmaWxlLAorCQkgICAgICBpbnN0cnVjdGlvbiwKKwkJICAgICAgZXhwYW5kZWRfYml0cywKKwkJICAgICAgY2FjaGVfcnVsZXMsCisJCSAgICAgIHVuZGVmX3ZhcmlhYmxlcywKKwkJICAgICAgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpCisJCSAgICAgICA/IGdldF92YWx1ZXNfZnJvbV9pY2FjaGUKKwkJICAgICAgIDogZG9fbm90X3VzZV9pY2FjaGUpKTsKKyAgcHJpbnRfanVtcChmaWxlLCAxLyppcyB0YWlsKi8pOworICBsZl9pbmRlbnQoZmlsZSwgLTIpOworICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfanVtcF9kZWZpbml0aW9uKGluc25fdGFibGUgKmVudHJ5LAorCQkgICAgICBsZiAqZmlsZSwKKwkJICAgICAgdm9pZCAqZGF0YSwKKwkJICAgICAgaW5zbiAqaW5zdHJ1Y3Rpb24sCisJCSAgICAgIGludCBkZXB0aCkKK3sKKyAgY2FjaGVfdGFibGUgKmNhY2hlX3J1bGVzID0gKGNhY2hlX3RhYmxlKilkYXRhOworICBpZiAoZ2VuZXJhdGVfZXhwYW5kZWRfaW5zdHJ1Y3Rpb25zKSB7CisgICAgQVNTRVJUKGVudHJ5LT5ucl9pbnNuID09IDEKKwkgICAmJiBlbnRyeS0+b3Bjb2RlID09IE5VTEwKKwkgICAmJiBlbnRyeS0+cGFyZW50ICE9IE5VTEwKKwkgICAmJiBlbnRyeS0+cGFyZW50LT5vcGNvZGUgIT0gTlVMTCk7CisgICAgQVNTRVJUKGVudHJ5LT5ucl9pbnNuID09IDEKKwkgICAmJiBlbnRyeS0+b3Bjb2RlID09IE5VTEwKKwkgICAmJiBlbnRyeS0+cGFyZW50ICE9IE5VTEwKKwkgICAmJiBlbnRyeS0+cGFyZW50LT5vcGNvZGUgIT0gTlVMTAorCSAgICYmIGVudHJ5LT5wYXJlbnQtPm9wY29kZV9ydWxlICE9IE5VTEwpOworICAgIHByaW50X2p1bXBfaW5zbihmaWxlLAorCQkgICAgZW50cnktPmluc25zLAorCQkgICAgZW50cnktPmV4cGFuZGVkX2JpdHMsCisJCSAgICBlbnRyeS0+b3Bjb2RlLAorCQkgICAgY2FjaGVfcnVsZXMpOworICB9CisgIGVsc2UgeworICAgIHByaW50X2p1bXBfaW5zbihmaWxlLAorCQkgICAgaW5zdHJ1Y3Rpb24sCisJCSAgICBOVUxMLAorCQkgICAgTlVMTCwKKwkJICAgIGNhY2hlX3J1bGVzKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9qdW1wX2ludGVybmFsX2Z1bmN0aW9uKGluc25fdGFibGUgKnRhYmxlLAorCQkJICAgICBsZiAqZmlsZSwKKwkJCSAgICAgdm9pZCAqZGF0YSwKKwkJCSAgICAgdGFibGVfZW50cnkgKmZ1bmN0aW9uKQoreworICBpZiAoaXRfaXMoImludGVybmFsIiwgZnVuY3Rpb24tPmZpZWxkc1tpbnNuX2ZsYWdzXSkpIHsKKyAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgICAgdGFibGVfZW50cnlfcHJpbnRfY3BwX2xpbmVfbnIoZmlsZSwgZnVuY3Rpb24pOworICAgIGxmX2luZGVudChmaWxlLCAtMSk7CisgICAgcHJpbnRfZnVuY3Rpb25fbmFtZShmaWxlLAorCQkJZnVuY3Rpb24tPmZpZWxkc1tpbnNuX25hbWVdLAorCQkJTlVMTCwKKwkJCSgoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKQorCQkJID8gZnVuY3Rpb25fbmFtZV9wcmVmaXhfaWNhY2hlCisJCQkgOiBmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIjpcbiIpOworICAgIGxmX2luZGVudChmaWxlLCArMSk7CisgICAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKKyAgICBsZl9pbmRlbnQoZmlsZSwgKzIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiY29uc3QgdW5zaWduZWRfd29yZCBjaWEgPSBuaWE7XG4iKTsKKyAgICBsZl9wcmludF9fY19jb2RlKGZpbGUsIGZ1bmN0aW9uLT5hbm5leCk7CisgICAgbGZfcHJpbnRfX2ludGVybmFsX3JlZmVyZW5jZShmaWxlKTsKKyAgICBsZl9wcmludGYoZmlsZSwgImVycm9yKFwiSW50ZXJuYWwgZnVuY3Rpb24gbXVzdCBsb25nanVtcFxcblwiKTtcbiIpOworICAgIGxmX2luZGVudChmaWxlLCAtMik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfanVtcF91bnRpbF9zdG9wX2JvZHkobGYgKmZpbGUsCisJCQkgICBpbnNuX3RhYmxlICp0YWJsZSwKKwkJCSAgIGNhY2hlX3RhYmxlICpjYWNoZV9ydWxlcywKKwkJCSAgIGludCBjYW5fc3RvcCkKK3sKKyAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKKyAgbGZfaW5kZW50KGZpbGUsICsyKTsKKyAgaWYgKCFjYW5fc3RvcCkKKyAgICBsZl9wcmludGYoZmlsZSwgImludCAqa2VlcF9ydW5uaW5nID0gTlVMTDtcbiIpOworICBsZl9wdXRzdHIoZmlsZSwgImptcF9idWYgaGFsdDtcbiIpOworICBsZl9wdXRzdHIoZmlsZSwgImptcF9idWYgcmVzdGFydDtcbiIpOworICBsZl9wdXRzdHIoZmlsZSwgImNwdSAqcHJvY2Vzc29yID0gTlVMTDtcbiIpOworICBsZl9wdXRzdHIoZmlsZSwgInVuc2lnbmVkX3dvcmQgbmlhID0gLTE7XG4iKTsKKyAgbGZfcHV0c3RyKGZpbGUsICJpbnN0cnVjdGlvbl93b3JkIGluc3RydWN0aW9uID0gMDtcbiIpOworICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkpIHsKKyAgICBsZl9wdXRzdHIoZmlsZSwgImlkZWNvZGVfY2FjaGUgKmNhY2hlX2VudHJ5ID0gTlVMTDtcbiIpOworICB9CisgIGlmIChnZW5lcmF0ZV9zbXApIHsKKyAgICBsZl9wdXRzdHIoZmlsZSwgImludCBjdXJyZW50X2NwdSA9IC0xO1xuIik7CisgIH0KKworICAvKiBhbGwgdGhlIHN3aXRjaGVzIGFuZCB0YWJsZXMgLSB0aGV5IGtub3cgYWJvdXQganVtcGluZyAqLworICBwcmludF9pZGVjb2RlX2xvb2t1cHMoZmlsZSwgdGFibGUsIGNhY2hlX3J1bGVzKTsKKyAKKyAgLyogc3RhcnQgdGhlIHNpbXVsYXRpb24gdXAgKi8KKyAgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKSB7CisgICAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAie1xuIik7CisgICAgbGZfcHV0c3RyKGZpbGUsICIgIGludCBjcHVfbnI7XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIiAgZm9yIChjcHVfbnIgPSAwOyBjcHVfbnIgPCBucl9jcHVzOyBjcHVfbnIrKylcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAiICAgIGNwdV9mbHVzaF9pY2FjaGUocHJvY2Vzc29yc1tjcHVfbnJdKTtcbiIpOworICAgIGxmX3B1dHN0cihmaWxlLCAifVxuIik7CisgIH0KKworICBsZl9wdXRzdHIoZmlsZSwgIlxuIik7CisgIGxmX3B1dHN0cihmaWxlLCAicHNpbV9zZXRfaGFsdF9hbmRfcmVzdGFydChzeXN0ZW0sICZoYWx0LCAmcmVzdGFydCk7XG4iKTsKKworICBsZl9wdXRzdHIoZmlsZSwgIlxuIik7CisgIGxmX3B1dHN0cihmaWxlLCAiaWYgKHNldGptcChoYWx0KSlcbiIpOworICBsZl9wdXRzdHIoZmlsZSwgIiAgcmV0dXJuO1xuIik7CisKKyAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOworICBsZl9wdXRzdHIoZmlsZSwgInNldGptcChyZXN0YXJ0KTtcbiIpOworCisgIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKKyAgaWYgKCFnZW5lcmF0ZV9zbXApIHsKKyAgICBsZl9wdXRzdHIoZmlsZSwgInByb2Nlc3NvciA9IHByb2Nlc3NvcnNbMF07XG4iKTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgIm5pYSA9IGNwdV9nZXRfcHJvZ3JhbV9jb3VudGVyKHByb2Nlc3Nvcik7XG4iKTsKKyAgfQorICBlbHNlIHsKKyAgICBsZl9wdXRzdHIoZmlsZSwgImN1cnJlbnRfY3B1ID0gcHNpbV9sYXN0X2NwdShzeXN0ZW0pO1xuIik7CisgIH0KKworICBpZiAoIShjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKSB7CisgICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICAgIGxmX2luZGVudChmaWxlLCAtMSk7CisgICAgbGZfcHJpbnRmKGZpbGUsICJpZGVjb2RlOlxuIik7CisgICAgbGZfaW5kZW50KGZpbGUsICsxKTsKKyAgfQorCisgIHByaW50X2p1bXAoZmlsZSwgMC8qaXNfdGFpbCovKTsKKworICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkpIHsKKyAgICBsZl9pbmRlbnQoZmlsZSwgLTEpOworICAgIGxmX3ByaW50ZihmaWxlLCAiY2FjaGVfbWlzczpcbiIpOworICAgIGxmX2luZGVudChmaWxlLCArMSk7CisgIH0KKworICBsZl9wdXRzdHIoZmlsZSwgImluc3RydWN0aW9uXG4iKTsKKyAgbGZfcHV0c3RyKGZpbGUsICIgID0gdm1faW5zdHJ1Y3Rpb25fbWFwX3JlYWQoY3B1X2luc3RydWN0aW9uX21hcChwcm9jZXNzb3IpLFxuIik7CisgIGxmX3B1dHN0cihmaWxlLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciwgbmlhKTtcbiIpOworICBwcmludF9pZGVjb2RlX2JvZHkoZmlsZSwgdGFibGUsICIvKklHT1JFKi8iKTsKKworICAvKiBwcmludCBvdXQgYSB0YWJsZSBvZiBhbGwgdGhlIGludGVybmFscyBmdW5jdGlvbnMgKi8KKyAgaW5zbl90YWJsZV90cmF2ZXJzZV9mdW5jdGlvbih0YWJsZSwKKwkJCSAgICAgICBmaWxlLCBOVUxMLAorCQkJICAgICAgIHByaW50X2p1bXBfaW50ZXJuYWxfZnVuY3Rpb24pOworCisgLyogcHJpbnQgb3V0IGEgdGFibGUgb2YgYWxsIHRoZSBpbnN0cnVjdGlvbnMgKi8KKyAgaWYgKGdlbmVyYXRlX2V4cGFuZGVkX2luc3RydWN0aW9ucykKKyAgICBpbnNuX3RhYmxlX3RyYXZlcnNlX3RyZWUodGFibGUsCisJCQkgICAgIGZpbGUsIGNhY2hlX3J1bGVzLAorCQkJICAgICAxLAorCQkJICAgICBOVUxMLCAvKiBzdGFydCAqLworCQkJICAgICBwcmludF9qdW1wX2RlZmluaXRpb24sIC8qIGxlYWYgKi8KKwkJCSAgICAgTlVMTCwgLyogZW5kICovCisJCQkgICAgIE5VTEwpOyAvKiBwYWRkaW5nICovCisgIGVsc2UKKyAgICBpbnNuX3RhYmxlX3RyYXZlcnNlX2luc24odGFibGUsCisJCQkgICAgIGZpbGUsIGNhY2hlX3J1bGVzLAorCQkJICAgICBwcmludF9qdW1wX2RlZmluaXRpb24pOworICBsZl9pbmRlbnQoZmlsZSwgLTIpOworICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworc3RhdGljIHZvaWQKK3ByaW50X2lkZWNvZGVfZmxvYXRpbmdfcG9pbnRfdW5hdmFpbGFibGUobGYgKmZpbGUpCit7CisgIGlmICgoY29kZSAmIGdlbmVyYXRlX2p1bXBzKSkKKyAgICBsZl9wcmludGYoZmlsZSwgImdvdG8gJXNfZmxvYXRpbmdfcG9pbnRfdW5hdmFpbGFibGU7XG4iLCAoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKSA/ICJpY2FjaGUiIDogInNlbWFudGljIik7CisgIGVsc2UgaWYgKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKQorICAgIGxmX3ByaW50ZihmaWxlLCAicmV0dXJuIGljYWNoZV9mbG9hdGluZ19wb2ludF91bmF2YWlsYWJsZSglcyk7XG4iLAorCSAgICAgIElDQUNIRV9GVU5DVElPTl9BQ1RVQUwpOworICBlbHNlCisgICAgbGZfcHJpbnRmKGZpbGUsICJyZXR1cm4gc2VtYW50aWNfZmxvYXRpbmdfcG9pbnRfdW5hdmFpbGFibGUoJXMpO1xuIiwKKwkgICAgICBTRU1BTlRJQ19GVU5DVElPTl9BQ1RVQUwpOworfQorCisKKy8qIE91dHB1dCBjb2RlIHRvIGRvIGFueSBmaW5hbCBjaGVja3Mgb24gdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24uCisgICBUaGlzIGluY2x1ZGVzIHRoaW5ncyBsaWtlIHZlcmlmeWluZyBhbnkgb24gZGVjb2RlZCBmaWVsZHMgaGF2ZSB0aGUKKyAgIGNvcnJlY3QgdmFsdWUgYW5kIGNoZWNraW5nIHRoYXQgKGZvciBmbG9hdGluZyBwb2ludCkgZmxvYXRpbmcgcG9pbnQKKyAgIGhhcmR3YXJlIGlzbid0IGRpc2FibGVkICovCisKK3ZvaWQKK3ByaW50X2lkZWNvZGVfdmFsaWRhdGUobGYgKmZpbGUsCisJCSAgICAgICBpbnNuICppbnN0cnVjdGlvbiwKKwkJICAgICAgIG9wY29kZV9maWVsZCAqb3Bjb2RlcykKK3sKKyAgLyogVmFsaWRhdGU6IHVuY2hlY2tlZCBpbnN0cnVjdGlvbiBmaWVsZHMKKworICAgICBJZiBhbnkgY29uc3RhbnQgZmllbGRzIGluIHRoZSBpbnN0cnVjdGlvbiB3ZXJlIG5vdCBjaGVja2VkIGJ5IHRoZQorICAgICBpZGVjb2RlIHRhYmxlcywgb3V0cHV0IGNvZGUgdG8gY2hlY2sgdGhhdCB0aGV5IGhhdmUgdGhlIGNvcnJlY3QKKyAgICAgdmFsdWUgaGVyZSAqLworICB7IAorICAgIHVuc2lnbmVkIGNoZWNrX21hc2sgPSAwOworICAgIHVuc2lnbmVkIGNoZWNrX3ZhbCA9IDA7CisgICAgaW5zbl9maWVsZCAqZmllbGQ7CisgICAgb3Bjb2RlX2ZpZWxkICpvcGNvZGU7CisKKyAgICAvKiBmb3JtIGNoZWNrX21hc2svY2hlY2tfdmFsIGNvbnRhaW5pbmcgd2hhdCBuZWVkcyB0byBiZSBjaGVja2VkCisgICAgICAgaW4gdGhlIGluc3RydWN0aW9uICovCisgICAgZm9yIChmaWVsZCA9IGluc3RydWN0aW9uLT5maWVsZHMtPmZpcnN0OworCSBmaWVsZC0+Zmlyc3QgPCBpbnNuX2JpdF9zaXplOworCSBmaWVsZCA9IGZpZWxkLT5uZXh0KSB7CisKKyAgICAgIGNoZWNrX21hc2sgPDw9IGZpZWxkLT53aWR0aDsKKyAgICAgIGNoZWNrX3ZhbCA8PD0gZmllbGQtPndpZHRoOworCisgICAgICAvKiBpcyBpdCBhIGNvbnN0YW50IHRoYXQgY291bGQgbmVlZCB2YWxpZGF0aW5nPyAqLworICAgICAgaWYgKCFmaWVsZC0+aXNfaW50ICYmICFmaWVsZC0+aXNfc2xhc2gpCisJY29udGludWU7CisKKyAgICAgIC8qIGhhcyBpdCBiZWVuIGNoZWNrZWQgYnkgYSB0YWJsZT8gKi8KKyAgICAgIGZvciAob3Bjb2RlID0gb3Bjb2Rlczsgb3Bjb2RlICE9IE5VTEw7IG9wY29kZSA9IG9wY29kZS0+cGFyZW50KSB7CisJaWYgKGZpZWxkLT5maXJzdCA+PSBvcGNvZGUtPmZpcnN0CisJICAgICYmIGZpZWxkLT5sYXN0IDw9IG9wY29kZS0+bGFzdCkKKwkgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKG9wY29kZSAhPSBOVUxMKQorCWNvbnRpbnVlOworCisgICAgICBjaGVja19tYXNrIHw9ICgxIDw8IGZpZWxkLT53aWR0aCktMTsKKyAgICAgIGNoZWNrX3ZhbCB8PSBmaWVsZC0+dmFsX2ludDsKKyAgICB9CisKKyAgICAvKiBpZiBhbnkgYml0cyBub3QgY2hlY2tlZCBieSBvcGNvZGUgdGFibGVzLCBvdXRwdXQgY29kZSB0byBjaGVjayB0aGVtICovCisgICAgaWYgKGNoZWNrX21hc2spIHsKKyAgICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgICAgIGxmX3ByaW50ZihmaWxlLCAiLyogdmFsaWRhdGU6ICVzICovXG4iLAorCQlpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fZm9ybWF0XSk7CisgICAgICBsZl9wcmludGYoZmlsZSwgImlmIChXSVRIX1JFU0VSVkVEX0JJVFMgJiYgKGluc3RydWN0aW9uICYgMHgleCkgIT0gMHgleClcbiIsCisJCWNoZWNrX21hc2ssIGNoZWNrX3ZhbCk7CisgICAgICBsZl9pbmRlbnQoZmlsZSwgKzIpOworICAgICAgcHJpbnRfaWRlY29kZV9pbGxlZ2FsKGZpbGUsICJyZXR1cm4iKTsKKyAgICAgIGxmX2luZGVudChmaWxlLCAtMik7CisgICAgfQorICB9CisKKyAgLyogVmFsaWRhdGUgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUKKworICAgICBJZiB0aGUgc2ltdWxhdG9yIGlzIGJlaW5nIGJ1aWx0IHdpdGggb3V0IGZsb2F0aW5nIHBvaW50IGhhcmR3YXJlCisgICAgIChkaWZmZXJlbnQgdG8gaXQgYmVpbmcgZGlzYWJsZWQgaW4gdGhlIE1TUikgdGhlbiBmbG9hdGluZyBwb2ludAorICAgICBpbnN0cnVjdGlvbnMgYXJlIGludmFsaWQgKi8KKyAgeworICAgIGlmIChpdF9pcygiZiIsIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9mbGFnc10pKSB7CisgICAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgICAgICBsZl9wcmludGYoZmlsZSwgIi8qIFZhbGlkYXRlOiBGUCBoYXJkd2FyZSBleGlzdHMgKi9cbiIpOworICAgICAgbGZfcHJpbnRmKGZpbGUsICJpZiAoQ1VSUkVOVF9GTE9BVElOR19QT0lOVCAhPSBIQVJEX0ZMT0FUSU5HX1BPSU5UKVxuIik7CisgICAgICBsZl9pbmRlbnQoZmlsZSwgKzIpOworICAgICAgcHJpbnRfaWRlY29kZV9pbGxlZ2FsKGZpbGUsICJyZXR1cm4iKTsKKyAgICAgIGxmX2luZGVudChmaWxlLCAtMik7CisgICAgfQorICB9CisKKyAgLyogVmFsaWRhdGU6IEZsb2F0aW5nIFBvaW50IGF2YWlsYWJsZQorCisgICAgIElmIGZsb2F0aW5nIHBvaW50IGlzIG5vdCBhdmFpbGFibGUsIHdlIGVudGVyIGEgZmxvYXRpbmcgcG9pbnQKKyAgICAgdW5hdmFpbGFibGUgaW50ZXJydXB0IGludG8gdGhlIGNhY2hlIGluc3RlYWQgb2YgdGhlIGluc3RydWN0aW9uCisgICAgIHByb3Blci4KKworICAgICBUaGUgUG93ZXJQQyBzcGVjIHJlcXVpcmVzIGEgQ1NJIGFmdGVyIE1TUltGUF0gaXMgY2hhbmdlZCBhbmQgd2hlbgorICAgICBldmVyIGEgQ1NJIG9jY3VyZXMgd2UgZmx1c2ggdGhlIGluc3RydWN0aW9uIGNhY2hlLiAqLworCisgIHsKKyAgICBpZiAoaXRfaXMoImYiLCBpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fZmxhZ3NdKSkgeworICAgICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICAgICAgbGZfcHJpbnRmKGZpbGUsICIvKiBWYWxpZGF0ZTogRlAgYXZhaWxhYmxlIGFjY29yZGluZyB0byBNU1JbRlBdICovXG4iKTsKKyAgICAgIGxmX3ByaW50ZihmaWxlLCAiaWYgKCFJU19GUF9BVkFJTEFCTEUocHJvY2Vzc29yKSlcbiIpOworICAgICAgbGZfaW5kZW50KGZpbGUsICsyKTsKKyAgICAgIHByaW50X2lkZWNvZGVfZmxvYXRpbmdfcG9pbnRfdW5hdmFpbGFibGUoZmlsZSk7CisgICAgICBsZl9pbmRlbnQoZmlsZSwgLTIpOworICAgIH0KKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyB2b2lkCitwcmludF9pZGVjb2RlX3J1bl9mdW5jdGlvbl9oZWFkZXIobGYgKmZpbGUsCisJCQkJICBpbnQgY2FuX3N0b3AsCisJCQkJICBpbnQgaXNfZGVmaW5pdGlvbikKK3sKKyAgaW50IGluZGVudDsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJ2b2lkIiwgIklOTElORV9JREVDT0RFIiwgKGlzX2RlZmluaXRpb24gPyAiICIgOiAiXG4iKSk7CisgIGluZGVudCA9IGxmX3B1dHN0cihmaWxlLCAoY2FuX3N0b3AgPyAiaWRlY29kZV9ydW5fdW50aWxfc3RvcCIgOiAiaWRlY29kZV9ydW4iKSk7CisgIGlmIChpc19kZWZpbml0aW9uKQorICAgIGxmX3B1dHN0cihmaWxlLCAiXG4iKTsKKyAgZWxzZQorICAgIGxmX2luZGVudChmaWxlLCAraW5kZW50KTsKKyAgbGZfcHV0c3RyKGZpbGUsICIocHNpbSAqc3lzdGVtLFxuIik7CisgIGlmIChjYW5fc3RvcCkKKyAgICBsZl9wdXRzdHIoZmlsZSwgIiB2b2xhdGlsZSBpbnQgKmtlZXBfcnVubmluZyxcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiBldmVudF9xdWV1ZSAqZXZlbnRzLFxuIik7CisgIGxmX3B1dHN0cihmaWxlLCAiIGNwdSAqY29uc3QgcHJvY2Vzc29yc1tdLFxuIik7CisgIGxmX3B1dHN0cihmaWxlLCAiIGNvbnN0IGludCBucl9jcHVzKSIpOworICBpZiAoaXNfZGVmaW5pdGlvbikKKyAgICBsZl9wdXRzdHIoZmlsZSwgIjsiKTsKKyAgZWxzZQorICAgIGxmX2luZGVudChmaWxlLCAtaW5kZW50KTsKKyAgbGZfcHV0c3RyKGZpbGUsICJcbiIpOworfQorCisKK3ZvaWQKK2dlbl9pZGVjb2RlX2gobGYgKmZpbGUsCisJICAgICAgaW5zbl90YWJsZSAqdGFibGUsCisJICAgICAgY2FjaGVfdGFibGUgKmNhY2hlX3J1bGVzKQoreworICBsZl9wcmludGYoZmlsZSwgIi8qIFRoZSBpZGVjb2RlXyouaCBmdW5jdGlvbnMgc2hhbGwgbW92ZSB0byBzdXBwb3J0ICovXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcImlkZWNvZGVfZXhwcmVzc2lvbi5oXCJcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwiaWRlY29kZV9maWVsZHMuaFwiXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcImlkZWNvZGVfYnJhbmNoLmhcIlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgcHJpbnRfaWNhY2hlX3N0cnVjdCh0YWJsZSwgY2FjaGVfcnVsZXMsIGZpbGUpOworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSBXSVRIX0lERUNPREVfU01QICVkXG4iLCBnZW5lcmF0ZV9zbXApOworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIHByaW50X2lkZWNvZGVfcnVuX2Z1bmN0aW9uX2hlYWRlcihmaWxlLCAwLypjYW4gc3RvcCovLCAxLyppcyBkZWZpbml0aW9uKi8pOworICBwcmludF9pZGVjb2RlX3J1bl9mdW5jdGlvbl9oZWFkZXIoZmlsZSwgMS8qY2FuIHN0b3AqLywgMS8qaXMgZGVmaW5pdGlvbiovKTsKK30KKworCit2b2lkCitnZW5faWRlY29kZV9jKGxmICpmaWxlLAorCSAgICAgIGluc25fdGFibGUgKnRhYmxlLAorCSAgICAgIGNhY2hlX3RhYmxlICpjYWNoZV9ydWxlcykKK3sKKyAgLyogdGhlIGludHJvICovCisgIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJpbmxpbmUuY1wiXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwiY3B1LmhcIlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJpZGVjb2RlLmhcIlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJzZW1hbnRpY3MuaFwiXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcImljYWNoZS5oXCJcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwic3VwcG9ydC5oXCJcbiIpOworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgPHNldGptcC5oPlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJlbnVtIHtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiAgLyogZ3JlYXRlciBvciBlcXVhbCB0byB6ZXJvID0+IHRhYmxlICovXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgIGZ1bmN0aW9uX2VudHJ5ID0gLTEsXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgIGJvb2xlYW5fZW50cnkgPSAtMixcbiIpOworICBsZl9wcmludGYoZmlsZSwgIn07XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9wcmludGYoZmlsZSwgInR5cGVkZWYgc3RydWN0IF9pZGVjb2RlX3RhYmxlX2VudHJ5IHtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiAgaW50IHNoaWZ0O1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiICBpbnN0cnVjdGlvbl93b3JkIG1hc2s7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgIGluc3RydWN0aW9uX3dvcmQgdmFsdWU7Iik7CisgIGxmX3ByaW50ZihmaWxlLCAiICB2b2lkICpmdW5jdGlvbl9vcl90YWJsZTtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIn0gaWRlY29kZV90YWJsZV9lbnRyeTtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKworICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV9jYWxscykpIHsKKworICAgIHByaW50X2lkZWNvZGVfbG9va3VwcyhmaWxlLCB0YWJsZSwgY2FjaGVfcnVsZXMpOworCisgICAgLyogb3V0cHV0IHRoZSBtYWluIGlkZWNvZGUgcm91dGluZSAqLworICAgIHByaW50X2lkZWNvZGVfcnVuX2Z1bmN0aW9uX2hlYWRlcihmaWxlLCAwLypjYW4gc3RvcCovLCAwLyppcyBkZWZpbml0aW9uKi8pOworICAgIHByaW50X3J1bl91bnRpbF9zdG9wX2JvZHkoZmlsZSwgdGFibGUsIDAvKiBoYXZlIHN0b3AgYXJndW1lbnQgKi8pOworCisgICAgcHJpbnRfaWRlY29kZV9ydW5fZnVuY3Rpb25faGVhZGVyKGZpbGUsIDEvKmNhbiBzdG9wKi8sIDAvKmlzIGRlZmluaXRpb24qLyk7CisgICAgcHJpbnRfcnVuX3VudGlsX3N0b3BfYm9keShmaWxlLCB0YWJsZSwgMS8qIG5vIHN0b3AgYXJndW1lbnQgKi8pOworCisgIH0KKyAgZWxzZSBpZiAoKGNvZGUgJiBnZW5lcmF0ZV9qdW1wcykpIHsKKworICAgIHByaW50X2lkZWNvZGVfcnVuX2Z1bmN0aW9uX2hlYWRlcihmaWxlLCAwLypjYW4gc3RvcCovLCAwLyppcyBkZWZpbml0aW9uKi8pOworICAgIHByaW50X2p1bXBfdW50aWxfc3RvcF9ib2R5KGZpbGUsIHRhYmxlLCBjYWNoZV9ydWxlcywgMCAvKiBoYXZlIHN0b3AgYXJndW1lbnQgKi8pOworCisgICAgcHJpbnRfaWRlY29kZV9ydW5fZnVuY3Rpb25faGVhZGVyKGZpbGUsIDEvKmNhbiBzdG9wKi8sIDAvKmlzIGRlZmluaXRpb24qLyk7CisgICAgcHJpbnRfanVtcF91bnRpbF9zdG9wX2JvZHkoZmlsZSwgdGFibGUsIGNhY2hlX3J1bGVzLCAxLyogaGF2ZSBzdG9wIGFyZ3VtZW50ICovKTsKKworICB9CisgIGVsc2UgeworICAgIGVycm9yKCJTb21ldGhpbmcgaXMgd3JvbmchXG4iKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9nZW4taWRlY29kZS5oIGIvc2ltL3BwYy9nZW4taWRlY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NjM3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2dlbi1pZGVjb2RlLmgKQEAgLTAsMCArMSw0MCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKK2V4dGVybiB2b2lkIGdlbl9pZGVjb2RlX2gKKyhsZiAqZmlsZSwKKyBpbnNuX3RhYmxlICp0YWJsZSwKKyBjYWNoZV90YWJsZSAqY2FjaGVfcnVsZXMpOworCitleHRlcm4gdm9pZCBnZW5faWRlY29kZV9jCisobGYgKmZpbGUsCisgaW5zbl90YWJsZSAqdGFibGUsCisgY2FjaGVfdGFibGUgKmNhY2hlX3J1bGVzKTsKKworCisvKiBPdXRwdXQgY29kZSB0byBkbyBhbnkgZmluYWwgY2hlY2tzIG9uIHRoZSBkZWNvZGVkIGluc3RydWN0aW9uLgorICAgVGhpcyBpbmNsdWRlcyB0aGluZ3MgbGlrZSB2ZXJpZnlpbmcgYW55IG9uIGRlY29kZWQgZmllbGRzIGhhdmUgdGhlCisgICBjb3JyZWN0IHZhbHVlIGFuZCBjaGVja2luZyB0aGF0IChmb3IgZmxvYXRpbmcgcG9pbnQpIGZsb2F0aW5nIHBvaW50CisgICBoYXJkd2FyZSBpc24ndCBkaXNhYmxlZCAqLworCitleHRlcm4gdm9pZCBwcmludF9pZGVjb2RlX3ZhbGlkYXRlCisobGYgKmZpbGUsCisgaW5zbiAqaW5zdHJ1Y3Rpb24sCisgb3Bjb2RlX2ZpZWxkICpvcGNvZGVzKTsKZGlmZiAtLWdpdCBhL3NpbS9wcGMvZ2VuLWl0YWJsZS5jIGIvc2ltL3BwYy9nZW4taXRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMyYWEyOQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZ2VuLWl0YWJsZS5jCkBAIC0wLDAgKzEsMTIyIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAibGYuaCIKKyNpbmNsdWRlICJ0YWJsZS5oIgorCisjaW5jbHVkZSAiZmlsdGVyLmgiCisKKyNpbmNsdWRlICJsZC1kZWNvZGUuaCIKKyNpbmNsdWRlICJsZC1pbnNuLmgiCisKKyNpbmNsdWRlICJpZ2VuLmgiCisjaW5jbHVkZSAiZ2VuLWl0YWJsZS5oIgorCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAwCisjZW5kaWYKKworCisKK3N0YXRpYyB2b2lkCitpdGFibGVfaF9pbnNuKGluc25fdGFibGUgKmVudHJ5LAorCSAgICAgIGxmICpmaWxlLAorCSAgICAgIHZvaWQgKmRhdGEsCisJICAgICAgaW5zbiAqaW5zdHJ1Y3Rpb24sCisJICAgICAgaW50IGRlcHRoKQoreworICBsZl9wcmludGYoZmlsZSwgIiAgIik7CisgIHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKKwkJICAgICAgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAorCQkgICAgICBOVUxMLAorCQkgICAgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pdGFibGUpOworICBsZl9wcmludGYoZmlsZSwgIixcbiIpOworfQorCisKK2V4dGVybiB2b2lkIAorZ2VuX2l0YWJsZV9oKGluc25fdGFibGUgKnRhYmxlLCBsZiAqZmlsZSkKK3sKKyAgLyogb3V0cHV0IGFuIGVudW1lcmF0ZWQgdHlwZSBmb3IgZWFjaCBpbnN0cnVjdGlvbiAqLworICBsZl9wcmludGYoZmlsZSwgInR5cGVkZWYgZW51bSB7XG4iKTsKKyAgaW5zbl90YWJsZV90cmF2ZXJzZV9pbnNuKHRhYmxlLAorCQkJICAgZmlsZSwgTlVMTCwKKwkJCSAgIGl0YWJsZV9oX2luc24pOworICBsZl9wcmludGYoZmlsZSwgIiAgbnJfaXRhYmxlX2VudHJpZXMsXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJ9IGl0YWJsZV9pbmRleDtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisKKyAgLyogb3V0cHV0IHRoZSB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBhY3R1YWwgaW5zdHJ1Y3Rpb24gaW5mbyAqLworICBsZl9wcmludGYoZmlsZSwgInR5cGVkZWYgc3RydWN0IF9pdGFibGVfaW5zdHJ1Y3Rpb25faW5mbyB7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgIGl0YWJsZV9pbmRleCBucjtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiAgY2hhciAqZm9ybWF0O1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiICBjaGFyICpmb3JtO1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiICBjaGFyICpmbGFncztcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiAgY2hhciAqbW5lbW9uaWM7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgIGNoYXIgKm5hbWU7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgIGNoYXIgKmZpbGU7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgIGludCBsaW5lX25yO1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAifSBpdGFibGVfaW5mbztcbiIpOworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiZXh0ZXJuIGl0YWJsZV9pbmZvIGl0YWJsZVtucl9pdGFibGVfZW50cmllc107XG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitpdGFibGVfY19pbnNuKGluc25fdGFibGUgKmVudHJ5LAorCSAgICAgIGxmICpmaWxlLAorCSAgICAgIHZvaWQgKmRhdGEsCisJICAgICAgaW5zbiAqaW5zdHJ1Y3Rpb24sCisJICAgICAgaW50IGRlcHRoKQoreworICBjaGFyICoqZmllbGRzID0gaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkczsKKyAgbGZfcHJpbnRmKGZpbGUsICIgIHsgIik7CisgIHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKKwkJICAgICAgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAorCQkgICAgICBOVUxMLAorCQkgICAgICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pdGFibGUpOworICBsZl9wcmludGYoZmlsZSwgIixcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiAgICBcIiVzXCIsXG4iLCBmaWVsZHNbaW5zbl9mb3JtYXRdKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgICAgXCIlc1wiLFxuIiwgZmllbGRzW2luc25fZm9ybV0pOworICBsZl9wcmludGYoZmlsZSwgIiAgICBcIiVzXCIsXG4iLCBmaWVsZHNbaW5zbl9mbGFnc10pOworICBsZl9wcmludGYoZmlsZSwgIiAgICBcIiVzXCIsXG4iLCBmaWVsZHNbaW5zbl9tbmVtb25pY10pOworICBsZl9wcmludGYoZmlsZSwgIiAgICBcIiVzXCIsXG4iLCBmaWVsZHNbaW5zbl9uYW1lXSk7CisgIGxmX3ByaW50ZihmaWxlLCAiICAgIFwiJXNcIixcbiIsIGZpbHRlcl9maWxlbmFtZSAoaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpbGVfbmFtZSkpOworICBsZl9wcmludGYoZmlsZSwgIiAgICAlZCxcbiIsIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5saW5lX25yKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgICAgfSxcbiIpOworfQorCisKK2V4dGVybiB2b2lkIAorZ2VuX2l0YWJsZV9jKGluc25fdGFibGUgKnRhYmxlLCBsZiAqZmlsZSkKK3sKKyAgLyogb3V0cHV0IHRoZSB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBhY3R1YWwgaW5zdHJ1Y3Rpb24gaW5mbyAqLworICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwiaXRhYmxlLmhcIlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJpdGFibGVfaW5mbyBpdGFibGVbbnJfaXRhYmxlX2VudHJpZXNdID0ge1xuIik7CisgIGluc25fdGFibGVfdHJhdmVyc2VfaW5zbih0YWJsZSwKKwkJCSAgIGZpbGUsIE5VTEwsCisJCQkgICBpdGFibGVfY19pbnNuKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJ9O1xuIik7Cit9CmRpZmYgLS1naXQgYS9zaW0vcHBjL2dlbi1pdGFibGUuaCBiL3NpbS9wcGMvZ2VuLWl0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MWRjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2dlbi1pdGFibGUuaApAQCAtMCwwICsxLDI4IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCitleHRlcm4gdm9pZCBnZW5faXRhYmxlX2gKKyhpbnNuX3RhYmxlICp0YWJsZSwKKyBsZiAqZmlsZSk7CisKK2V4dGVybiB2b2lkIGdlbl9pdGFibGVfYworKGluc25fdGFibGUgKnRhYmxlLAorIGxmICpmaWxlKTsKZGlmZiAtLWdpdCBhL3NpbS9wcGMvZ2VuLW1vZGVsLmMgYi9zaW0vcHBjL2dlbi1tb2RlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYzE2NzcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2dlbi1tb2RlbC5jCkBAIC0wLDAgKzEsMzkzIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgImxmLmgiCisjaW5jbHVkZSAidGFibGUuaCIKKworI2luY2x1ZGUgImZpbHRlci5oIgorCisjaW5jbHVkZSAibGQtZGVjb2RlLmgiCisjaW5jbHVkZSAibGQtaW5zbi5oIgorCisjaW5jbHVkZSAiZ2VuLW1vZGVsLmgiCisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMIDAKKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkCittb2RlbF9jX29yX2hfZGF0YShpbnNuX3RhYmxlICp0YWJsZSwKKwkJICBsZiAqZmlsZSwKKwkJICB0YWJsZV9lbnRyeSAqZGF0YSkKK3sKKyAgaWYgKGRhdGEtPmFubmV4KSB7CisgICAgdGFibGVfZW50cnlfcHJpbnRfY3BwX2xpbmVfbnIoZmlsZSwgZGF0YSk7CisgICAgbGZfcHJpbnRfX2NfY29kZShmaWxlLCBkYXRhLT5hbm5leCk7CisgICAgbGZfcHJpbnRfX2ludGVybmFsX3JlZmVyZW5jZShmaWxlKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIH0KK30KKworc3RhdGljIHZvaWQKK21vZGVsX2Nfb3JfaF9mdW5jdGlvbihpbnNuX3RhYmxlICplbnRyeSwKKwkJICAgICAgbGYgKmZpbGUsCisJCSAgICAgIHRhYmxlX2VudHJ5ICpmdW5jdGlvbiwKKwkJICAgICAgY2hhciAqcHJlZml4KQoreworICBpZiAoZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl90eXBlXSA9PSBOVUxMCisgICAgICB8fCBmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX3R5cGVdWzBdID09ICdcMCcpIHsKKyAgICBlcnJvcigiTW9kZWwgZnVuY3Rpb24gdHlwZSBub3Qgc3BlY2lmaWVkIGZvciAlcyIsIGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fbmFtZV0pOworICB9CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCBmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX3R5cGVdLCBwcmVmaXgsICIgIik7CisgIGxmX3ByaW50ZihmaWxlLCAiJXNcbiglcyk7XG4iLAorCSAgICBmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX25hbWVdLAorCSAgICBmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX3BhcmFtXSk7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKK30KKwordm9pZCAKK2dlbl9tb2RlbF9oKGluc25fdGFibGUgKnRhYmxlLCBsZiAqZmlsZSkKK3sKKyAgaW5zbiAqaW5zbl9wdHI7CisgIG1vZGVsICptb2RlbF9wdHI7CisgIGluc24gKm1hY3JvOworICBjaGFyICpuYW1lOworICBpbnQgbW9kZWxfY3JlYXRlX3AgPSAwOworICBpbnQgbW9kZWxfaW5pdF9wID0gMDsKKyAgaW50IG1vZGVsX2hhbHRfcCA9IDA7CisgIGludCBtb2RlbF9tb25faW5mb19wID0gMDsKKyAgaW50IG1vZGVsX21vbl9pbmZvX2ZyZWVfcCA9IDA7CisKKyAgZm9yKG1hY3JvID0gbW9kZWxfbWFjcm9zOyBtYWNybzsgbWFjcm8gPSBtYWNyby0+bmV4dCkgeworICAgIG1vZGVsX2Nfb3JfaF9kYXRhKHRhYmxlLCBmaWxlLCBtYWNyby0+ZmlsZV9lbnRyeSk7CisgIH0KKworICBsZl9wcmludGYoZmlsZSwgInR5cGVkZWYgZW51bSBfbW9kZWxfZW51bSB7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIgIE1PREVMX05PTkUsXG4iKTsKKyAgZm9yIChtb2RlbF9wdHIgPSBtb2RlbHM7IG1vZGVsX3B0cjsgbW9kZWxfcHRyID0gbW9kZWxfcHRyLT5uZXh0KSB7CisgICAgbGZfcHJpbnRmKGZpbGUsICIgIE1PREVMXyVzLFxuIiwgbW9kZWxfcHRyLT5uYW1lKTsKKyAgfQorICBsZl9wcmludGYoZmlsZSwgIiAgbnJfbW9kZWxzXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJ9IG1vZGVsX2VudW07XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworCisgIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSBERUZBVUxUX01PREVMIE1PREVMXyVzXG4iLCAobW9kZWxzKSA/IG1vZGVscy0+bmFtZSA6ICJOT05FIik7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKworICBsZl9wcmludGYoZmlsZSwgInR5cGVkZWYgc3RydWN0IF9tb2RlbF9kYXRhIG1vZGVsX2RhdGE7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJ0eXBlZGVmIHN0cnVjdCBfbW9kZWxfdGltZSBtb2RlbF90aW1lO1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKworICBsZl9wcmludGYoZmlsZSwgImV4dGVybiBtb2RlbF9lbnVtIGN1cnJlbnRfbW9kZWw7XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJleHRlcm4gY29uc3QgY2hhciAqbW9kZWxfbmFtZVsgKGludClucl9tb2RlbHMgXTtcbiIpOworICBsZl9wcmludGYoZmlsZSwgImV4dGVybiBjb25zdCBjaGFyICpjb25zdCAqY29uc3QgbW9kZWxfZnVuY191bml0X25hbWVbIChpbnQpbnJfbW9kZWxzIF07XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJleHRlcm4gY29uc3QgbW9kZWxfdGltZSAqY29uc3QgbW9kZWxfdGltZV9tYXBwaW5nWyAoaW50KW5yX21vZGVscyBdO1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKworICBmb3IoaW5zbl9wdHIgPSBtb2RlbF9mdW5jdGlvbnM7IGluc25fcHRyOyBpbnNuX3B0ciA9IGluc25fcHRyLT5uZXh0KSB7CisgICAgbW9kZWxfY19vcl9oX2Z1bmN0aW9uKHRhYmxlLCBmaWxlLCBpbnNuX3B0ci0+ZmlsZV9lbnRyeSwgIklOTElORV9NT0RFTCIpOworICAgIG5hbWUgPSBpbnNuX3B0ci0+ZmlsZV9lbnRyeS0+ZmllbGRzW2Z1bmN0aW9uX25hbWVdOworICAgIGlmIChzdHJjbXAgKG5hbWUsICJtb2RlbF9jcmVhdGUiKSA9PSAwKQorICAgICAgbW9kZWxfY3JlYXRlX3AgPSAxOworICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1vZGVsX2luaXQiKSA9PSAwKQorICAgICAgbW9kZWxfaW5pdF9wID0gMTsKKyAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtb2RlbF9oYWx0IikgPT0gMCkKKyAgICAgIG1vZGVsX2hhbHRfcCA9IDE7CisgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibW9kZWxfbW9uX2luZm8iKSA9PSAwKQorICAgICAgbW9kZWxfbW9uX2luZm9fcCA9IDE7CisgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibW9kZWxfbW9uX2luZm9fZnJlZSIpID09IDApCisgICAgICBtb2RlbF9tb25faW5mb19mcmVlX3AgPSAxOworICB9CisKKyAgaWYgKCFtb2RlbF9jcmVhdGVfcCkgeworICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgIm1vZGVsX2RhdGEgKiIsICJJTkxJTkVfTU9ERUwiLCAiICIpOworICAgIGxmX3ByaW50ZihmaWxlLCAibW9kZWxfY3JlYXRlXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIihjcHUgKnByb2Nlc3Nvcik7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIH0KKworICBpZiAoIW1vZGVsX2luaXRfcCkgeworICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgInZvaWQiLCAiSU5MSU5FX01PREVMIiwgIiAiKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIm1vZGVsX2luaXRcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiKG1vZGVsX2RhdGEgKm1vZGVsX3B0cik7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIH0KKworICBpZiAoIW1vZGVsX2hhbHRfcCkgeworICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgInZvaWQiLCAiSU5MSU5FX01PREVMIiwgIiAiKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIm1vZGVsX2hhbHRcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiKG1vZGVsX2RhdGEgKm1vZGVsX3B0cik7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIH0KKworICBpZiAoIW1vZGVsX21vbl9pbmZvX3ApIHsKKyAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJtb2RlbF9wcmludCAqIiwgIklOTElORV9NT0RFTCIsICIgIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJtb2RlbF9tb25faW5mb1xuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIobW9kZWxfZGF0YSAqbW9kZWxfcHRyKTtcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgfQorCisgIGlmICghbW9kZWxfbW9uX2luZm9fZnJlZV9wKSB7CisgICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAidm9pZCIsICJJTkxJTkVfTU9ERUwiLCAiICIpOworICAgIGxmX3ByaW50ZihmaWxlLCAibW9kZWxfbW9uX2luZm9fZnJlZVxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIobW9kZWxfZGF0YSAqbW9kZWxfcHRyLFxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIgbW9kZWxfcHJpbnQgKmluZm9fcHRyKTtcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgfQorCisgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgInZvaWQiLCAiSU5MSU5FX01PREVMIiwgIiAiKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJtb2RlbF9zZXRcbiIpOworICBsZl9wcmludGYoZmlsZSwgIihjb25zdCBjaGFyICpuYW1lKTtcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX21vZGVsX2NfcGFzc2VkX2RhdGEgbW9kZWxfY19wYXNzZWRfZGF0YTsKK3N0cnVjdCBfbW9kZWxfY19wYXNzZWRfZGF0YSB7CisgIGxmICpmaWxlOworICBtb2RlbCAqbW9kZWxfcHRyOworfTsKKworc3RhdGljIHZvaWQKK21vZGVsX2NfaW5zbihpbnNuX3RhYmxlICplbnRyeSwKKwkgICAgIGxmICpwaG9ueV9maWxlLAorCSAgICAgdm9pZCAqZGF0YSwKKwkgICAgIGluc24gKmluc3RydWN0aW9uLAorCSAgICAgaW50IGRlcHRoKQoreworICBtb2RlbF9jX3Bhc3NlZF9kYXRhICpkYXRhX3B0ciA9IChtb2RlbF9jX3Bhc3NlZF9kYXRhICopZGF0YTsKKyAgbGYgKmZpbGUgPSBkYXRhX3B0ci0+ZmlsZTsKKyAgY2hhciAqY3VycmVudF9uYW1lID0gZGF0YV9wdHItPm1vZGVsX3B0ci0+cHJpbnRhYmxlX25hbWU7CisgIHRhYmxlX21vZGVsX2VudHJ5ICptb2RlbF9wdHIgPSBpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeS0+bW9kZWxfZmlyc3Q7CisKKyAgd2hpbGUgKG1vZGVsX3B0cikgeworICAgIGlmIChtb2RlbF9wdHItPmZpZWxkc1tpbnNuX21vZGVsX25hbWVdID09IGN1cnJlbnRfbmFtZSkgeworICAgICAgbGZfcHJpbnRmKGZpbGUsICIgIHsgJS0qcyB9LCAgLyogJXMgKi9cbiIsCisJCW1heF9tb2RlbF9maWVsZHNfbGVuLAorCQltb2RlbF9wdHItPmZpZWxkc1tpbnNuX21vZGVsX2ZpZWxkc10sCisJCWluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbW9kZWxfcHRyID0gbW9kZWxfcHRyLT5uZXh0OworICB9CisKKyAgbGZfcHJpbnRmKGZpbGUsICIgIHsgJS0qcyB9LCAgLyogJXMgKi9cbiIsCisJICAgIG1heF9tb2RlbF9maWVsZHNfbGVuLAorCSAgICBkYXRhX3B0ci0+bW9kZWxfcHRyLT5pbnNuX2RlZmF1bHQsCisJICAgIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSk7Cit9CisKK3N0YXRpYyB2b2lkCittb2RlbF9jX2Z1bmN0aW9uKGluc25fdGFibGUgKnRhYmxlLAorCQkgbGYgKmZpbGUsCisJCSB0YWJsZV9lbnRyeSAqZnVuY3Rpb24sCisJCSBjb25zdCBjaGFyICpwcmVmaXgpCit7CisgIGlmIChmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX3R5cGVdID09IE5VTEwKKyAgICAgIHx8IGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fdHlwZV1bMF0gPT0gJ1wwJykgeworICAgIGVycm9yKCJNb2RlbCBmdW5jdGlvbiByZXR1cm4gdHlwZSBub3Qgc3BlY2lmaWVkIGZvciAlcyIsIGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fbmFtZV0pOworICB9CisgIGVsc2UgeworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsIGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fdHlwZV0sIHByZWZpeCwgIlxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIlcyglcylcbiIsCisJICAgICAgZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl9uYW1lXSwKKwkgICAgICBmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX3BhcmFtXSk7CisgIH0KKyAgdGFibGVfZW50cnlfcHJpbnRfY3BwX2xpbmVfbnIoZmlsZSwgZnVuY3Rpb24pOworICBsZl9wcmludGYoZmlsZSwgIntcbiIpOworICBpZiAoZnVuY3Rpb24tPmFubmV4KSB7CisgICAgbGZfaW5kZW50KGZpbGUsICsyKTsKKyAgICBsZl9wcmludF9fY19jb2RlKGZpbGUsIGZ1bmN0aW9uLT5hbm5leCk7CisgICAgbGZfaW5kZW50KGZpbGUsIC0yKTsKKyAgfQorICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworICBsZl9wcmludF9faW50ZXJuYWxfcmVmZXJlbmNlKGZpbGUpOworICBsZl9wcmludGYoZmlsZSwgIlxuIik7Cit9CisKK3ZvaWQgCitnZW5fbW9kZWxfYyhpbnNuX3RhYmxlICp0YWJsZSwgbGYgKmZpbGUpCit7CisgIGluc24gKmluc25fcHRyOworICBtb2RlbCAqbW9kZWxfcHRyOworICBjaGFyICpuYW1lOworICBpbnQgbW9kZWxfY3JlYXRlX3AgPSAwOworICBpbnQgbW9kZWxfaW5pdF9wID0gMDsKKyAgaW50IG1vZGVsX2hhbHRfcCA9IDA7CisgIGludCBtb2RlbF9tb25faW5mb19wID0gMDsKKyAgaW50IG1vZGVsX21vbl9pbmZvX2ZyZWVfcCA9IDA7CisKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwiY3B1LmhcIlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJtb24uaFwiXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNpZmRlZiBIQVZFX1NURExJQl9IXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSA8c3RkbGliLmg+XG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIjZW5kaWZcbiIpOworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisKKyAgZm9yKGluc25fcHRyID0gbW9kZWxfZGF0YTsgaW5zbl9wdHI7IGluc25fcHRyID0gaW5zbl9wdHItPm5leHQpIHsKKyAgICBtb2RlbF9jX29yX2hfZGF0YSh0YWJsZSwgZmlsZSwgaW5zbl9wdHItPmZpbGVfZW50cnkpOworICB9CisKKyAgZm9yKGluc25fcHRyID0gbW9kZWxfc3RhdGljOyBpbnNuX3B0cjsgaW5zbl9wdHIgPSBpbnNuX3B0ci0+bmV4dCkgeworICAgIG1vZGVsX2Nfb3JfaF9mdW5jdGlvbih0YWJsZSwgZmlsZSwgaW5zbl9wdHItPmZpbGVfZW50cnksICIvKmgqL1NUQVRJQyIpOworICB9CisKKyAgZm9yKGluc25fcHRyID0gbW9kZWxfaW50ZXJuYWw7IGluc25fcHRyOyBpbnNuX3B0ciA9IGluc25fcHRyLT5uZXh0KSB7CisgICAgbW9kZWxfY19vcl9oX2Z1bmN0aW9uKHRhYmxlLCBmaWxlLCBpbnNuX3B0ci0+ZmlsZV9lbnRyeSwgIlNUQVRJQ19JTkxJTkVfTU9ERUwiKTsKKyAgfQorCisgIGZvcihpbnNuX3B0ciA9IG1vZGVsX3N0YXRpYzsgaW5zbl9wdHI7IGluc25fcHRyID0gaW5zbl9wdHItPm5leHQpIHsKKyAgICBtb2RlbF9jX2Z1bmN0aW9uKHRhYmxlLCBmaWxlLCBpbnNuX3B0ci0+ZmlsZV9lbnRyeSwgIi8qYyovU1RBVElDIik7CisgIH0KKworICBmb3IoaW5zbl9wdHIgPSBtb2RlbF9pbnRlcm5hbDsgaW5zbl9wdHI7IGluc25fcHRyID0gaW5zbl9wdHItPm5leHQpIHsKKyAgICBtb2RlbF9jX2Z1bmN0aW9uKHRhYmxlLCBmaWxlLCBpbnNuX3B0ci0+ZmlsZV9lbnRyeSwgIlNUQVRJQ19JTkxJTkVfTU9ERUwiKTsKKyAgfQorCisgIGZvcihpbnNuX3B0ciA9IG1vZGVsX2Z1bmN0aW9uczsgaW5zbl9wdHI7IGluc25fcHRyID0gaW5zbl9wdHItPm5leHQpIHsKKyAgICBtb2RlbF9jX2Z1bmN0aW9uKHRhYmxlLCBmaWxlLCBpbnNuX3B0ci0+ZmlsZV9lbnRyeSwgIklOTElORV9NT0RFTCIpOworICAgIG5hbWUgPSBpbnNuX3B0ci0+ZmlsZV9lbnRyeS0+ZmllbGRzW2Z1bmN0aW9uX25hbWVdOworICAgIGlmIChzdHJjbXAgKG5hbWUsICJtb2RlbF9jcmVhdGUiKSA9PSAwKQorICAgICAgbW9kZWxfY3JlYXRlX3AgPSAxOworICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1vZGVsX2luaXQiKSA9PSAwKQorICAgICAgbW9kZWxfaW5pdF9wID0gMTsKKyAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJtb2RlbF9oYWx0IikgPT0gMCkKKyAgICAgIG1vZGVsX2hhbHRfcCA9IDE7CisgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibW9kZWxfbW9uX2luZm8iKSA9PSAwKQorICAgICAgbW9kZWxfbW9uX2luZm9fcCA9IDE7CisgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibW9kZWxfbW9uX2luZm9fZnJlZSIpID09IDApCisgICAgICBtb2RlbF9tb25faW5mb19mcmVlX3AgPSAxOworICB9CisKKyAgaWYgKCFtb2RlbF9jcmVhdGVfcCkgeworICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgIm1vZGVsX2RhdGEgKiIsICJJTkxJTkVfTU9ERUwiLCAiXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIm1vZGVsX2NyZWF0ZShjcHUgKnByb2Nlc3NvcilcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAie1xuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIgIHJldHVybiAobW9kZWxfZGF0YSAqKTA7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgfQorCisgIGlmICghbW9kZWxfaW5pdF9wKSB7CisgICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAidm9pZCIsICJJTkxJTkVfTU9ERUwiLCAiXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIm1vZGVsX2luaXQobW9kZWxfZGF0YSAqbW9kZWxfcHRyKVxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgfQorCisgIGlmICghbW9kZWxfaGFsdF9wKSB7CisgICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCAidm9pZCIsICJJTkxJTkVfTU9ERUwiLCAiXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIm1vZGVsX2hhbHQobW9kZWxfZGF0YSAqbW9kZWxfcHRyKVxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgfQorCisgIGlmICghbW9kZWxfbW9uX2luZm9fcCkgeworICAgIGxmX3ByaW50X2Z1bmN0aW9uX3R5cGUoZmlsZSwgIm1vZGVsX3ByaW50ICoiLCAiSU5MSU5FX01PREVMIiwgIlxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJtb2RlbF9tb25faW5mbyhtb2RlbF9kYXRhICptb2RlbF9wdHIpXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIntcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiICByZXR1cm4gKG1vZGVsX3ByaW50ICopMDtcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAifVxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICB9CisKKyAgaWYgKCFtb2RlbF9tb25faW5mb19mcmVlX3ApIHsKKyAgICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJ2b2lkIiwgIklOTElORV9NT0RFTCIsICJcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAibW9kZWxfbW9uX2luZm9fZnJlZShtb2RlbF9kYXRhICptb2RlbF9wdHIsXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiAgICAgICAgICAgICAgICAgICAgbW9kZWxfcHJpbnQgKmluZm9fcHRyKVxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgfQorCisgIGxmX3ByaW50ZihmaWxlLCAiLyogSW5zbiBmdW5jdGlvbmFsIHVuaXQgaW5mbyAqL1xuIik7CisgIGZvcihtb2RlbF9wdHIgPSBtb2RlbHM7IG1vZGVsX3B0cjsgbW9kZWxfcHRyID0gbW9kZWxfcHRyLT5uZXh0KSB7CisgICAgbW9kZWxfY19wYXNzZWRfZGF0YSBkYXRhOworCisgICAgbGZfcHJpbnRmKGZpbGUsICJzdGF0aWMgY29uc3QgbW9kZWxfdGltZSBtb2RlbF90aW1lXyVzW10gPSB7XG4iLCBtb2RlbF9wdHItPm5hbWUpOworICAgIGRhdGEuZmlsZSA9IGZpbGU7CisgICAgZGF0YS5tb2RlbF9wdHIgPSBtb2RlbF9wdHI7CisgICAgaW5zbl90YWJsZV90cmF2ZXJzZV9pbnNuKHRhYmxlLAorCQkJICAgICBOVUxMLCAodm9pZCAqKSZkYXRhLAorCQkJICAgICBtb2RlbF9jX2luc24pOworCisgICAgbGZfcHJpbnRmKGZpbGUsICJ9O1xuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXGZcbiIpOworICB9CisKKyAgbGZfcHJpbnRmKGZpbGUsICIjaWZuZGVmIF9JTkxJTkVfQ19cbiIpOworICBsZl9wcmludGYoZmlsZSwgImNvbnN0IG1vZGVsX3RpbWUgKmNvbnN0IG1vZGVsX3RpbWVfbWFwcGluZ1sgKGludClucl9tb2RlbHMgXSA9IHtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiAgKGNvbnN0IG1vZGVsX3RpbWUgKmNvbnN0KTAsXG4iKTsKKyAgZm9yKG1vZGVsX3B0ciA9IG1vZGVsczsgbW9kZWxfcHRyOyBtb2RlbF9wdHIgPSBtb2RlbF9wdHItPm5leHQpIHsKKyAgICBsZl9wcmludGYoZmlsZSwgIiAgbW9kZWxfdGltZV8lcyxcbiIsIG1vZGVsX3B0ci0+bmFtZSk7CisgIH0KKyAgbGZfcHJpbnRmKGZpbGUsICJ9O1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiI2VuZGlmXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworCisgIGxmX3ByaW50ZihmaWxlLCAiXGZcbiIpOworICBsZl9wcmludGYoZmlsZSwgIi8qIG1hcCBtb2RlbCBlbnVtZXJhdGlvbiBpbnRvIHByaW50YWJsZSBzdHJpbmcgKi9cbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNpZm5kZWYgX0lOTElORV9DX1xuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiY29uc3QgY2hhciAqbW9kZWxfbmFtZVsgKGludClucl9tb2RlbHMgXSA9IHtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiAgXCJOT05FXCIsXG4iKTsKKyAgZm9yIChtb2RlbF9wdHIgPSBtb2RlbHM7IG1vZGVsX3B0cjsgbW9kZWxfcHRyID0gbW9kZWxfcHRyLT5uZXh0KSB7CisgICAgbGZfcHJpbnRmKGZpbGUsICIgIFwiJXNcIixcbiIsIG1vZGVsX3B0ci0+cHJpbnRhYmxlX25hbWUpOworICB9CisgIGxmX3ByaW50ZihmaWxlLCAifTtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNlbmRpZlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKworICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsICJ2b2lkIiwgIklOTElORV9NT0RFTCIsICJcbiIpOworICBsZl9wcmludGYoZmlsZSwgIm1vZGVsX3NldChjb25zdCBjaGFyICpuYW1lKVxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAie1xuIik7CisgIGlmIChtb2RlbHMpIHsKKyAgICBsZl9wcmludGYoZmlsZSwgIiAgbW9kZWxfZW51bSBtb2RlbDtcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiICBmb3IobW9kZWwgPSBNT0RFTF8lczsgbW9kZWwgPCBucl9tb2RlbHM7IG1vZGVsKyspIHtcbiIsIG1vZGVscy0+bmFtZSk7CisgICAgbGZfcHJpbnRmKGZpbGUsICIgICAgaWYoc3RyY21wKG5hbWUsIG1vZGVsX25hbWVbbW9kZWxdKSA9PSAwKSB7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiAgICAgIGN1cnJlbnRfbW9kZWwgPSBtb2RlbDtcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiICAgICAgcmV0dXJuO1xuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIgICAgfVxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIgIH1cbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiAgZXJyb3IoXCJVbmtub3duIG1vZGVsICclJXMnLCBNb2RlbHMgd2hpY2ggYXJlIGtub3duIGFyZTolJXNcblwiLFxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIgICAgICAgIG5hbWUsXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiAgICAgICAgXCIiKTsKKyAgICBmb3IobW9kZWxfcHRyID0gbW9kZWxzOyBtb2RlbF9wdHI7IG1vZGVsX3B0ciA9IG1vZGVsX3B0ci0+bmV4dCkgeworICAgICAgbGZfcHJpbnRmKGZpbGUsICJcXG5cXHQlcyIsIG1vZGVsX3B0ci0+cHJpbnRhYmxlX25hbWUpOworICAgIH0KKyAgICBsZl9wcmludGYoZmlsZSwgIlwiKTtcbiIpOworICB9IGVsc2UgeworICAgIGxmX3ByaW50ZihmaWxlLCAiICBlcnJvcihcIk5vIG1vZGVscyBhcmUgY3VycmVudGx5IGtub3duIGFib3V0XCIpO1xuIik7CisgIH0KKworICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworfQorCmRpZmYgLS1naXQgYS9zaW0vcHBjL2dlbi1tb2RlbC5oIGIvc2ltL3BwYy9nZW4tbW9kZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDY1YTc1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9nZW4tbW9kZWwuaApAQCAtMCwwICsxLDMwIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisKK2V4dGVybiB2b2lkIGdlbl9tb2RlbF9oCisoaW5zbl90YWJsZSAqdGFibGUsCisgbGYgKmZpbGUpOworCisKK2V4dGVybiB2b2lkIGdlbl9tb2RlbF9jCisoaW5zbl90YWJsZSAqdGFibGUsCisgbGYgKmZpbGUpOwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9nZW4tc2VtYW50aWNzLmMgYi9zaW0vcHBjL2dlbi1zZW1hbnRpY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGMwNjEzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9nZW4tc2VtYW50aWNzLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKworI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJsZi5oIgorI2luY2x1ZGUgInRhYmxlLmgiCisjaW5jbHVkZSAiZmlsdGVyLmgiCisKKyNpbmNsdWRlICJsZC1kZWNvZGUuaCIKKyNpbmNsdWRlICJsZC1jYWNoZS5oIgorI2luY2x1ZGUgImxkLWluc24uaCIKKworI2luY2x1ZGUgImlnZW4uaCIKKworI2luY2x1ZGUgImdlbi1zZW1hbnRpY3MuaCIKKyNpbmNsdWRlICJnZW4taWNhY2hlLmgiCisjaW5jbHVkZSAiZ2VuLWlkZWNvZGUuaCIKKworCitzdGF0aWMgdm9pZAorcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25faGVhZGVyKGxmICpmaWxlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmJhc2VuYW1lLAorCQkJICAgICAgIGluc25fYml0cyAqZXhwYW5kZWRfYml0cywKKwkJCSAgICAgICBpbnQgaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKK3sKKyAgaW50IGluZGVudDsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9wcmludF9mdW5jdGlvbl90eXBlKGZpbGUsIFNFTUFOVElDX0ZVTkNUSU9OX1RZUEUsICJFWFRFUk5fU0VNQU5USUNTIiwKKwkJCSAoaXNfZnVuY3Rpb25fZGVmaW5pdGlvbiA/ICJcbiIgOiAiICIpKTsKKyAgaW5kZW50ID0gcHJpbnRfZnVuY3Rpb25fbmFtZShmaWxlLAorCQkJICAgICAgIGJhc2VuYW1lLAorCQkJICAgICAgIGV4cGFuZGVkX2JpdHMsCisJCQkgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzKTsKKyAgaWYgKGlzX2Z1bmN0aW9uX2RlZmluaXRpb24pCisgICAgbGZfaW5kZW50KGZpbGUsICtpbmRlbnQpOworICBlbHNlCisgICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiglcykiLCBTRU1BTlRJQ19GVU5DVElPTl9GT1JNQUwpOworICBpZiAoaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKKyAgICBsZl9pbmRlbnQoZmlsZSwgLWluZGVudCk7CisgIGVsc2UKKyAgICBsZl9wcmludGYoZmlsZSwgIjsiKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworfQorCit2b2lkCitwcmludF9zZW1hbnRpY19kZWNsYXJhdGlvbihpbnNuX3RhYmxlICplbnRyeSwKKwkJCSAgIGxmICpmaWxlLAorCQkJICAgdm9pZCAqZGF0YSwKKwkJCSAgIGluc24gKmluc3RydWN0aW9uLAorCQkJICAgaW50IGRlcHRoKQoreworICBpZiAoZ2VuZXJhdGVfZXhwYW5kZWRfaW5zdHJ1Y3Rpb25zKSB7CisgICAgQVNTRVJUKGVudHJ5LT5ucl9pbnNuID09IDEpOworICAgIHByaW50X3NlbWFudGljX2Z1bmN0aW9uX2hlYWRlcihmaWxlLAorCQkJCSAgIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSwKKwkJCQkgICBlbnRyeS0+ZXhwYW5kZWRfYml0cywKKwkJCQkgICAwLyogaXMgbm90IGZ1bmN0aW9uIGRlZmluaXRpb24qLyk7CisgIH0KKyAgZWxzZSB7CisgICAgcHJpbnRfc2VtYW50aWNfZnVuY3Rpb25faGVhZGVyKGZpbGUsCisJCQkJICAgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAorCQkJCSAgIE5VTEwsCisJCQkJICAgMC8qIGlzIG5vdCBmdW5jdGlvbiBkZWZpbml0aW9uKi8pOworICB9Cit9CisKKworDAorLyogZ2VuZXJhdGUgdGhlIHNlbWFudGljcy5jIGZpbGUgKi8KKworCit2b2lkCitwcmludF9pZGVjb2RlX2lsbGVnYWwobGYgKmZpbGUsCisJCSAgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCkKK3sKKyAgaWYgKChjb2RlICYgZ2VuZXJhdGVfanVtcHMpKQorICAgIGxmX3ByaW50ZihmaWxlLCAiZ290byAlc19pbGxlZ2FsO1xuIiwgKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkgPyAiaWNhY2hlIiA6ICJzZW1hbnRpYyIpOworICBlbHNlIGlmICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKSkKKyAgICBsZl9wcmludGYoZmlsZSwgIiVzIGljYWNoZV9pbGxlZ2FsKCVzKTtcbiIsIHJlc3VsdCwgSUNBQ0hFX0ZVTkNUSU9OX0FDVFVBTCk7CisgIGVsc2UKKyAgICBsZl9wcmludGYoZmlsZSwgIiVzIHNlbWFudGljX2lsbGVnYWwoJXMpO1xuIiwgcmVzdWx0LCBTRU1BTlRJQ19GVU5DVElPTl9BQ1RVQUwpOworfQorCisKK3ZvaWQKK3ByaW50X3NlbWFudGljX2JvZHkobGYgKmZpbGUsCisJCSAgICBpbnNuICppbnN0cnVjdGlvbiwKKwkJICAgIGluc25fYml0cyAqZXhwYW5kZWRfYml0cywKKwkJICAgIG9wY29kZV9maWVsZCAqb3Bjb2RlcykKK3sKKyAgcHJpbnRfaXRyYWNlKGZpbGUsIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LCAwLypwdXRfdmFsdWVfaW5fY2FjaGUqLyk7CisKKyAgLyogdmFsaWRhdGUgdGhlIGluc3RydWN0aW9uLCBpZiBhIGNhY2hlIHRoaXMgaGFzIGFscmVhZHkgYmVlbiBkb25lICovCisgIGlmICghKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkpCisgICAgcHJpbnRfaWRlY29kZV92YWxpZGF0ZShmaWxlLCBpbnN0cnVjdGlvbiwgb3Bjb2Rlcyk7CisKKyAgLyogZ2VuZXJhdGUgdGhlIHByb2ZpbGluZyBjYWxsIC0gdGhpcyBpcyBkZWxheWVkIHVudGlsIGFmdGVyIHRoZQorICAgICBpbnN0cnVjdGlvbiBoYXMgYmVlbiB2ZXJpZmllZCAqLworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIGxmX3ByaW50ZihmaWxlLCAiLyogbW9uaXRvcmluZzogKi9cbiIpOworICBsZl9wcmludGYoZmlsZSwgImlmIChXSVRIX01PTiAmIE1PTklUT1JfSU5TVFJVQ1RJT05fSVNTVUUpIHtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiAgbW9uX2lzc3VlKCIpOworICBwcmludF9mdW5jdGlvbl9uYW1lKGZpbGUsCisJCSAgICAgIGluc3RydWN0aW9uLT5maWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSwKKwkJICAgICAgTlVMTCwKKwkJICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfaXRhYmxlKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIsIHByb2Nlc3NvciwgY2lhKTtcbiIpOworICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworCisgIC8qIGdlbmVyYXRlIHRoZSBjb2RlIChvciBhdCBsZWFzdCBzb21ldGhpbmcgKi8KKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9wcmludGYoZmlsZSwgIi8qIHNlbWFudGljczogKi9cbiIpOworICBsZl9wcmludGYoZmlsZSwgIm5pYSA9IGNpYSArICVkO1xuIiwgaW5zbl9iaXRfc2l6ZSAvIDgpOworICBpZiAoaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmFubmV4ICE9IE5VTEwpIHsKKyAgICAvKiB0cnVlIGNvZGUgKi8KKyAgICB0YWJsZV9lbnRyeV9wcmludF9jcHBfbGluZV9ucihmaWxlLCBpbnN0cnVjdGlvbi0+ZmlsZV9lbnRyeSk7CisgICAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKKyAgICBsZl9pbmRlbnQoZmlsZSwgKzIpOworICAgIGxmX3ByaW50X19jX2NvZGUoZmlsZSwgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmFubmV4KTsKKyAgICBsZl9pbmRlbnQoZmlsZSwgLTIpOworICAgIGxmX3ByaW50ZihmaWxlLCAifVxuIik7CisgICAgbGZfcHJpbnRfX2ludGVybmFsX3JlZmVyZW5jZShmaWxlKTsKKyAgfQorICBlbHNlIGlmIChpdF9pcygibm9wIiwgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX2ZsYWdzXSkpIHsKKyAgICBsZl9wcmludF9faW50ZXJuYWxfcmVmZXJlbmNlKGZpbGUpOworICB9CisgIGVsc2UgeworICAgIC8qIGFib3J0IHNvIGl0IGlzIGltcGxlbWVudGVkIG5vdyAqLworICAgIHRhYmxlX2VudHJ5X3ByaW50X2NwcF9saW5lX25yKGZpbGUsIGluc3RydWN0aW9uLT5maWxlX2VudHJ5KTsKKyAgICBsZl9wdXRzdHIoZmlsZSwgImVycm9yKFwiJXM6JWQ6MHglMDhseDolcyB1bmltcGxlbWVudGVkXFxuXCIsXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiAgICAgIGl0YWJsZVtNWV9JTkRFWF0uZmlsZSwgaXRhYmxlW01ZX0lOREVYXS5saW5lX25yLCAobG9uZyljaWEsIGl0YWJsZVtNWV9JTkRFWF0ubmFtZSk7XG4iKTsKKyAgICBsZl9wcmludF9faW50ZXJuYWxfcmVmZXJlbmNlKGZpbGUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9jX3NlbWFudGljKGxmICpmaWxlLAorCQkgaW5zbiAqaW5zdHJ1Y3Rpb24sCisJCSBpbnNuX2JpdHMgKmV4cGFuZGVkX2JpdHMsCisJCSBvcGNvZGVfZmllbGQgKm9wY29kZXMsCisJCSBjYWNoZV90YWJsZSAqY2FjaGVfcnVsZXMpCit7CisKKyAgbGZfcHJpbnRmKGZpbGUsICJ7XG4iKTsKKyAgbGZfaW5kZW50KGZpbGUsICsyKTsKKworICBwcmludF9teV9kZWZpbmVzKGZpbGUsIGV4cGFuZGVkX2JpdHMsIGluc3RydWN0aW9uLT5maWxlX2VudHJ5KTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBwcmludF9pY2FjaGVfYm9keShmaWxlLAorCQkgICAgaW5zdHJ1Y3Rpb24sCisJCSAgICBleHBhbmRlZF9iaXRzLAorCQkgICAgY2FjaGVfcnVsZXMsCisJCSAgICAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2RpcmVjdF9hY2Nlc3MpCisJCSAgICAgPyBkZWZpbmVfdmFyaWFibGVzCisJCSAgICAgOiBkZWNsYXJlX3ZhcmlhYmxlcyksCisJCSAgICAoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkKKwkJICAgICA/IGdldF92YWx1ZXNfZnJvbV9pY2FjaGUKKwkJICAgICA6IGRvX25vdF91c2VfaWNhY2hlKSk7CisKKyAgbGZfcHJpbnRmKGZpbGUsICJ1bnNpZ25lZF93b3JkIG5pYTtcbiIpOworICBwcmludF9zZW1hbnRpY19ib2R5KGZpbGUsCisJCSAgICAgIGluc3RydWN0aW9uLAorCQkgICAgICBleHBhbmRlZF9iaXRzLAorCQkgICAgICBvcGNvZGVzKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJyZXR1cm4gbmlhO1xuIik7CisKKyAgLyogZ2VuZXJhdGUgc29tZXRoaW5nIHRvIGNsZWFuIHVwIGFueSAjZGVmaW5lcyBjcmVhdGVkIGZvciB0aGUgY2FjaGUgKi8KKyAgaWYgKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2RpcmVjdF9hY2Nlc3MpCisgICAgcHJpbnRfaWNhY2hlX2JvZHkoZmlsZSwKKwkJICAgICAgaW5zdHJ1Y3Rpb24sCisJCSAgICAgIGV4cGFuZGVkX2JpdHMsCisJCSAgICAgIGNhY2hlX3J1bGVzLAorCQkgICAgICB1bmRlZl92YXJpYWJsZXMsCisJCSAgICAgICgoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKQorCQkgICAgICAgPyBnZXRfdmFsdWVzX2Zyb21faWNhY2hlCisJCSAgICAgICA6IGRvX25vdF91c2VfaWNhY2hlKSk7CisKKyAgbGZfaW5kZW50KGZpbGUsIC0yKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2Nfc2VtYW50aWNfZnVuY3Rpb24obGYgKmZpbGUsCisJCQkgIGluc24gKmluc3RydWN0aW9uLAorCQkJICBpbnNuX2JpdHMgKmV4cGFuZGVkX2JpdHMsCisJCQkgIG9wY29kZV9maWVsZCAqb3Bjb2RlcywKKwkJCSAgY2FjaGVfdGFibGUgKmNhY2hlX3J1bGVzKQoreworICAvKiBidWlsZCB0aGUgc2VtYW50aWMgcm91dGluZSB0byBleGVjdXRlIHRoZSBpbnN0cnVjdGlvbiAqLworICBwcmludF9zZW1hbnRpY19mdW5jdGlvbl9oZWFkZXIoZmlsZSwKKwkJCQkgaW5zdHJ1Y3Rpb24tPmZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAorCQkJCSBleHBhbmRlZF9iaXRzLAorCQkJCSAxLyppcy1mdW5jdGlvbi1kZWZpbml0aW9uKi8pOworICBwcmludF9jX3NlbWFudGljKGZpbGUsCisJCSAgIGluc3RydWN0aW9uLAorCQkgICBleHBhbmRlZF9iaXRzLAorCQkgICBvcGNvZGVzLAorCQkgICBjYWNoZV9ydWxlcyk7Cit9CisKK3ZvaWQKK3ByaW50X3NlbWFudGljX2RlZmluaXRpb24oaW5zbl90YWJsZSAqZW50cnksCisJCQkgIGxmICpmaWxlLAorCQkJICB2b2lkICpkYXRhLAorCQkJICBpbnNuICppbnN0cnVjdGlvbiwKKwkJCSAgaW50IGRlcHRoKQoreworICBjYWNoZV90YWJsZSAqY2FjaGVfcnVsZXMgPSAoY2FjaGVfdGFibGUqKWRhdGE7CisgIGlmIChnZW5lcmF0ZV9leHBhbmRlZF9pbnN0cnVjdGlvbnMpIHsKKyAgICBBU1NFUlQoZW50cnktPm5yX2luc24gPT0gMQorCSAgICYmIGVudHJ5LT5vcGNvZGUgPT0gTlVMTAorCSAgICYmIGVudHJ5LT5wYXJlbnQgIT0gTlVMTAorCSAgICYmIGVudHJ5LT5wYXJlbnQtPm9wY29kZSAhPSBOVUxMKTsKKyAgICBBU1NFUlQoZW50cnktPm5yX2luc24gPT0gMQorCSAgICYmIGVudHJ5LT5vcGNvZGUgPT0gTlVMTAorCSAgICYmIGVudHJ5LT5wYXJlbnQgIT0gTlVMTAorCSAgICYmIGVudHJ5LT5wYXJlbnQtPm9wY29kZSAhPSBOVUxMCisJICAgJiYgZW50cnktPnBhcmVudC0+b3Bjb2RlX3J1bGUgIT0gTlVMTCk7CisgICAgcHJpbnRfY19zZW1hbnRpY19mdW5jdGlvbihmaWxlLAorCQkJICAgICAgZW50cnktPmluc25zLAorCQkJICAgICAgZW50cnktPmV4cGFuZGVkX2JpdHMsCisJCQkgICAgICBlbnRyeS0+cGFyZW50LT5vcGNvZGUsCisJCQkgICAgICBjYWNoZV9ydWxlcyk7CisgIH0KKyAgZWxzZSB7CisgICAgcHJpbnRfY19zZW1hbnRpY19mdW5jdGlvbihmaWxlLCBpbnN0cnVjdGlvbiwKKwkJCSAgICAgIE5VTEwsIE5VTEwsCisJCQkgICAgICBjYWNoZV9ydWxlcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NpbS9wcGMvZ2VuLXNlbWFudGljcy5oIGIvc2ltL3BwYy9nZW4tc2VtYW50aWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyNTcxNQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZ2VuLXNlbWFudGljcy5oCkBAIC0wLDAgKzEsODEgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKy8qIENyZWF0ZXMgdGhlIGZpbGVzIHNlbWFudGljcy5baGNdLgorCisgICBUaGUgZ2VuZXJhdGVkIGZpbGUgc2VtYW50aWNzIGNvbnRhaW5zIGZ1bmN0aW9ucyB0aGF0IGltcGxlbWVudCB0aGUKKyAgIG9wZXJhdGlvbnMgcmVxdWlyZWQgdG8gbW9kZWwgYSBzaW5nbGUgdGFyZ2V0IHByb2Nlc3NvciBpbnN0cnVjdGlvbi4KKworICAgU2V2ZXJhbCBkaWZmZXJlbnQgdmFyaWF0aW9ucyBvbiB0aGUgc2VtYW50aWNzIGZpbGUgY2FuIGJlIGNyZWF0ZWQ6CisKKwlvCXVuY2FjaGVkCisKKyAgICAgICAgCU5vIGluc3RydWN0aW9uIGNhY2hlIGV4aXN0cy4gIFRoZSBzZW1hbnRpYyBmdW5jdGlvbgorCQluZWVkcyB0byBnZW5lcmF0ZSBhbnkgcmVxdWlyZWQgdmFsdWVzIGxvY2FsbHkuCisKKwlvCWNhY2hlZCAtIHNlcGFyYXRlIGNyYWNrZXIgYW5kIHNlbWFudGljCisKKwkJVHdvIGluZGVwZW5kYW50IGZ1bmN0aW9ucyBhcmUgY3JlYXRlZC4gIEZpcnN0bHkgdGhlCisJCWZ1bmN0aW9uIHRoYXQgY3JhY2tzIGFuIGluc3RydWN0aW9uIGVudGVyaW5nIGl0IGludG8gYQorCQljYWNoZSBhbmQgc2Vjb25kbHkgdGhlIHNlbWFudGljIGZ1bmN0aW9uIHByb3BwZXIgdGhhdAorCQl1c2VzIHRoZSBjYWNoZS4KKworCW8JY2FjaGVkIC0gc2VtYW50aWMgKyBjcmFja2luZyBzZW1hbnRpYworCisJCVRoZSBmdW5jdGlvbiB0aGF0IGNyYWNrcyB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGVudGVycworCQlhbGwgdmFsdWVzIGludG8gdGhlIGNhY2hlIGFsc28gY29udGFpbnMgYSBjb3B5IG9mIHRoZQorCQlzZW1hbnRpYyBjb2RlIChhdm9pZGluZyB0aGUgbmVlZCB0byBjYWxsIGJvdGggdGhlCisJCWNyYWNrZXIgYW5kIHRoZSBzZW1hbnRpYyBmdW5jdGlvbiB3aGVuIHRoZXJlIGlzIGEKKwkJY2FjaGUgbWlzcykuCisKKyAgIEZvciBlYWNoIG9mIHRoZXNlIGdlbmVyYWwgZm9ybXMsIHNldmVyYWwgcmVmaW5lbWVudHMgY2FuIG9jY3VyZToKKworCW8JZG8vZG9uJ3QgZHVwbGljYXRlL2V4cGFuZCBzZW1hbnRpYyBmdW5jdGlvbnMKKworCQlBcyBhIGNvbnNlcXVlbmNlIG9mIGRlY29kaW5nIGFuIGluc3RydWN0aW9uLCB0aGUKKwkJZGVjb2RlciwgYXMgcGFydCBvZiBpdHMgdGFibGUgbWF5IGhhdmUgZWZmZWN0aXZseSBtYWRlCisJCWNlcnRhaW4gb2YgdGhlIHZhcmlhYmxlIGZpZWxkcyBpbiBhbiBpbnN0cnVjdGlvbgorCQljb25zdGFudC4gU2VwYXJhdGUgZnVuY3Rpb25zIGZvciBlYWNoIG9mIHRoZQorCQlhbHRlcm5hdGl2ZSB2YWx1ZXMgZm9yIHdoYXQgd291bGQgaGF2ZSBiZWVuIHRyZWF0ZWQgYXMKKwkJYSB2YXJpYWJsZSBwYXJ0IGNhbiBiZSBjcmVhdGVkLgorCisJbwl1c2UgY2FjaGUgc3RydWN0IGRpcmVjdGx5LgorCisJCVdoZW4gYSBjcmFja2luZyBjYWNoZSBpcyBwcmVzZW50LCB0aGUgc2VtYW50aWMKKwkJZnVuY3Rpb25zIGNhbiBiZSBnZW5lcmF0ZWQgdG8gZWl0aGVyIGhvbGQgaW50ZXJtZWRpYXRlCisJCWNhY2hlIHZhbHVlcyBpbiBsb2NhbCB2YXJpYWJsZXMgb3IgYWx3YXlzIHJlZmVyIHRvIHRoZQorCQljb250ZW50cyBvZiB0aGUgY2FjaGUgZGlyZWN0bHkuICovCisKKworCitleHRlcm4gaW5zbl9oYW5kbGVyIHByaW50X3NlbWFudGljX2RlY2xhcmF0aW9uOworZXh0ZXJuIGluc25faGFuZGxlciBwcmludF9zZW1hbnRpY19kZWZpbml0aW9uOworCitleHRlcm4gdm9pZCBwcmludF9pZGVjb2RlX2lsbGVnYWwKKyhsZiAqZmlsZSwKKyBjb25zdCBjaGFyICpyZXN1bHQpOworCitleHRlcm4gdm9pZCBwcmludF9zZW1hbnRpY19ib2R5CisobGYgKmZpbGUsCisgaW5zbiAqaW5zdHJ1Y3Rpb24sCisgaW5zbl9iaXRzICpleHBhbmRlZF9iaXRzLAorIG9wY29kZV9maWVsZCAqb3Bjb2Rlcyk7CisKZGlmZiAtLWdpdCBhL3NpbS9wcGMvZ2VuLXN1cHBvcnQuYyBiL3NpbS9wcGMvZ2VuLXN1cHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmVkZWMzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9nZW4tc3VwcG9ydC5jCkBAIC0wLDAgKzEsMTMyIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJsZi5oIgorI2luY2x1ZGUgInRhYmxlLmgiCisjaW5jbHVkZSAiZmlsdGVyLmgiCisKKyNpbmNsdWRlICJsZC1kZWNvZGUuaCIKKyNpbmNsdWRlICJsZC1jYWNoZS5oIgorI2luY2x1ZGUgImxkLWluc24uaCIKKworI2luY2x1ZGUgImlnZW4uaCIKKworI2luY2x1ZGUgImdlbi1zZW1hbnRpY3MuaCIKKyNpbmNsdWRlICJnZW4tc3VwcG9ydC5oIgorCitzdGF0aWMgdm9pZAorcHJpbnRfc3VwcG9ydF9mdW5jdGlvbl9uYW1lKGxmICpmaWxlLAorCQkJICAgIHRhYmxlX2VudHJ5ICpmdW5jdGlvbiwKKwkJCSAgICBpbnQgaXNfZnVuY3Rpb25fZGVmaW5pdGlvbikKK3sKKyAgaWYgKGl0X2lzKCJpbnRlcm5hbCIsIGZ1bmN0aW9uLT5maWVsZHNbaW5zbl9mbGFnc10pKSB7CisgICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLCBTRU1BTlRJQ19GVU5DVElPTl9UWVBFLCAiSU5MSU5FX1NVUFBPUlQiLAorCQkJICAgKGlzX2Z1bmN0aW9uX2RlZmluaXRpb24gPyAiXG4iIDogIiAiKSk7CisgICAgcHJpbnRfZnVuY3Rpb25fbmFtZShmaWxlLAorCQkJZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl9uYW1lXSwKKwkJCU5VTEwsCisJCQlmdW5jdGlvbl9uYW1lX3ByZWZpeF9zZW1hbnRpY3MpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4oJXMpIiwgU0VNQU5USUNfRlVOQ1RJT05fRk9STUFMKTsKKyAgICBpZiAoIWlzX2Z1bmN0aW9uX2RlZmluaXRpb24pCisgICAgICBsZl9wcmludGYoZmlsZSwgIjsiKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIH0KKyAgZWxzZSB7CisgICAgbGZfcHJpbnRfZnVuY3Rpb25fdHlwZShmaWxlLAorCQkJICAgZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl90eXBlXSwKKwkJCSAgICJJTkxJTkVfU1VQUE9SVCIsCisJCQkgICAoaXNfZnVuY3Rpb25fZGVmaW5pdGlvbiA/ICJcbiIgOiAiICIpKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiVzXG4oJXMpJXMiLAorCSAgICAgIGZ1bmN0aW9uLT5maWVsZHNbZnVuY3Rpb25fbmFtZV0sCisJICAgICAgZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl9wYXJhbV0sCisJICAgICAgKGlzX2Z1bmN0aW9uX2RlZmluaXRpb24gPyAiXG4iIDogIjtcbiIpKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitzdXBwb3J0X2hfZnVuY3Rpb24oaW5zbl90YWJsZSAqZW50cnksCisJCSAgIGxmICpmaWxlLAorCQkgICB2b2lkICpkYXRhLAorCQkgICB0YWJsZV9lbnRyeSAqZnVuY3Rpb24pCit7CisgIEFTU0VSVChmdW5jdGlvbi0+ZmllbGRzW2Z1bmN0aW9uX3R5cGVdICE9IE5VTEwpOworICBBU1NFUlQoZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl9wYXJhbV0gIT0gTlVMTCk7CisgIHByaW50X3N1cHBvcnRfZnVuY3Rpb25fbmFtZShmaWxlLAorCQkJICAgICAgZnVuY3Rpb24sCisJCQkgICAgICAwLyohaXNfZGVmaW5pdGlvbiovKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworfQorCisKK2V4dGVybiB2b2lkCitnZW5fc3VwcG9ydF9oKGluc25fdGFibGUgKnRhYmxlLAorCSAgICAgIGxmICpmaWxlKQoreworICAvKiBvdXRwdXQgYSBkZWNsYXJhdGlvbiBmb3IgYWxsIGZ1bmN0aW9ucyAqLworICBpbnNuX3RhYmxlX3RyYXZlcnNlX2Z1bmN0aW9uKHRhYmxlLAorCQkJICAgICAgIGZpbGUsIE5VTEwsCisJCQkgICAgICAgc3VwcG9ydF9oX2Z1bmN0aW9uKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiNpZiAoU1VQUE9SVF9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSlcbiIpOworICBsZl9wcmludGYoZmlsZSwgIiMgaW5jbHVkZSBcInN1cHBvcnQuY1wiXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIjZW5kaWZcbiIpOworfQorCitzdGF0aWMgdm9pZAorc3VwcG9ydF9jX2Z1bmN0aW9uKGluc25fdGFibGUgKnRhYmxlLAorCQkgICBsZiAqZmlsZSwKKwkJICAgdm9pZCAqZGF0YSwKKwkJICAgdGFibGVfZW50cnkgKmZ1bmN0aW9uKQoreworICBBU1NFUlQoZnVuY3Rpb24tPmZpZWxkc1tmdW5jdGlvbl90eXBlXSAhPSBOVUxMKTsKKyAgcHJpbnRfc3VwcG9ydF9mdW5jdGlvbl9uYW1lKGZpbGUsCisJCQkgICAgICBmdW5jdGlvbiwKKwkJCSAgICAgIDEvKiFpc19kZWZpbml0aW9uKi8pOworICB0YWJsZV9lbnRyeV9wcmludF9jcHBfbGluZV9ucihmaWxlLCBmdW5jdGlvbik7CisgIGxmX3ByaW50ZihmaWxlLCAie1xuIik7CisgIGxmX2luZGVudChmaWxlLCArMik7CisgIGxmX3ByaW50X19jX2NvZGUoZmlsZSwgZnVuY3Rpb24tPmFubmV4KTsKKyAgaWYgKGl0X2lzKCJpbnRlcm5hbCIsIGZ1bmN0aW9uLT5maWVsZHNbaW5zbl9mbGFnc10pKSB7CisgICAgbGZfcHJpbnRmKGZpbGUsICJlcnJvcihcIkludGVybmFsIGZ1bmN0aW9uIG11c3QgbG9uZ2p1bXBcXG5cIik7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgInJldHVybiAwO1xuIik7CisgIH0KKyAgbGZfaW5kZW50KGZpbGUsIC0yKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJ9XG4iKTsKKyAgbGZfcHJpbnRfX2ludGVybmFsX3JlZmVyZW5jZShmaWxlKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworfQorCisKK3ZvaWQKK2dlbl9zdXBwb3J0X2MoaW5zbl90YWJsZSAqdGFibGUsCisJICAgICAgbGYgKmZpbGUpCit7CisgIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJjcHUuaFwiXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcImlkZWNvZGUuaFwiXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcInN1cHBvcnQuaFwiXG4iKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworCisgIC8qIG91dHB1dCBhIGRlZmluaXRpb24gKGMtY29kZSkgZm9yIGFsbCBmdW5jdGlvbnMgKi8KKyAgaW5zbl90YWJsZV90cmF2ZXJzZV9mdW5jdGlvbih0YWJsZSwKKwkJCSAgICAgICBmaWxlLCBOVUxMLAorCQkJICAgICAgIHN1cHBvcnRfY19mdW5jdGlvbik7Cit9CmRpZmYgLS1naXQgYS9zaW0vcHBjL2dlbi1zdXBwb3J0LmggYi9zaW0vcHBjL2dlbi1zdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4NjJkNwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvZ2VuLXN1cHBvcnQuaApAQCAtMCwwICsxLDI5IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCitleHRlcm4gdm9pZCBnZW5fc3VwcG9ydF9oCisoaW5zbl90YWJsZSAqdGFibGUsCisgbGYgKmZpbGUpOworCitleHRlcm4gdm9pZCBnZW5fc3VwcG9ydF9jCisoaW5zbl90YWJsZSAqdGFibGUsCisgbGYgKmZpbGUpOworCmRpZmYgLS1naXQgYS9zaW0vcHBjL2h3X2NvbS5jIGIvc2ltL3BwYy9od19jb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzYyMzIyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9od19jb20uYwpAQCAtMCwwICsxLDU1OSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisgICAgCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICAgIAorICAgICovCisKKworI2lmbmRlZiBfSFdfQ09NX0NfCisjZGVmaW5lIF9IV19DT01fQ18KKworI2lmbmRlZiBTVEFUSUNfSU5MSU5FX0hXX0NPTQorI2RlZmluZSBTVEFUSUNfSU5MSU5FX0hXX0NPTSBTVEFUSUNfSU5MSU5FCisjZW5kaWYKKworI2luY2x1ZGUgImRldmljZV90YWJsZS5oIgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworLyogREVWSUNFCisgICAKKworICAgY29tIC0gJzU1MCBjb21wYXRpYmxlIHNlcmlhbCBkZXZpY2UKKyAgIAorCisgICBERVNDUklQVElPTgorICAgCisKKyAgIE1vZGVscyB0aGUgYmFzaWNzIG9mIHRoZSA4IHJlZ2lzdGVyICc1NTAgc2VyaWFsIGRldmljZS4gIFRoZSBtb2RlbCAKKyAgIGluY2x1ZGVzIGFuIGludGVycnVwdCBsaW5lLCBpbnB1dCBhbmQgb3V0cHV0IGZpZm9zLCBhbmQgc3RhdHVzIAorICAgaW5mb3JtYXRpb24uCisKKyAgIEluZGVwZW5kZW50IGNvbmZpZ3VyYXRpb24gb2YgdGhlIGRldmljZXMgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zIGlzIAorICAgYWxsb3dlZDogdXNlIGVpdGhlciB0aGUgY29uc29sZSBvciBhIGZpbGUgKGJ1ZmZlcmVkIG9yIHVuYnVmZmVyZWQpIGFzIAorICAgdGhlIGRhdGEgc291cmNlL3Npbms7IHNwZWNpZnkgdGhlIHJlYWwtdGltZSBkZWxheSBiZXR3ZWVuIGVhY2ggY2hhcmFjdGVyIAorICAgdHJhbnNmZXIuCisKKyAgIFdoZW4gdGhlIGRldmljZXMgaW5wdXQgc3RyZWFtIGlzIGJlaW5nIHRha2VuIGZyb20gYSBmaWxlLCB0aGUgZW5kIG9mIAorICAgZmlsZSBpcyBzaWduYWxlZCBieSBhIGxvc3Mgb2YgY2FycmllciAodGhlIGxvc3Mgb2YgY2FycmllciBtYXkgYmUgCisgICBpbmNvcnJlY3RseSBwcm9jZWVkZWQgYnkgYSBzaW5nbGUgbnVsbCBjaGFyYWN0ZXIpLgorICAgCisKKyAgIFBST1BFUlRJRVMKKyAgIAorCisgICByZWcgPSA8YWRkcmVzcz4gPHNpemU+IC4uLiAob3B0aW9uYWwgLSBub3RlIDEpCisKKyAgIExpc3Qgb2YgPGFkZHJlc3M+IDxzaXplPiBwYWlycy4gIEVhY2ggcGFpciBzcGVjaWZpZXMgYW4gYWRkcmVzcyBmb3IKKyAgIHRoZSBkZXZpY2VzIDggcmVnaXN0ZXJzLiAgVGhlIGFkZHJlc3Mgc2hvdWxkIGJlIDggYnl0ZSBhbGlnbmVkLgorCisKKyAgIGFsdGVybmF0ZS1yZWcgPSA8YWRkcmVzcz4gPHNpemU+IC4uLiAob3B0aW9uYWwgLSBub3RlIDEpCisKKyAgIEFsdGVybmF0aXZlIGFkZHJlc2VzIGZvciB0aGUgcmVnaXN0ZXJzLgorCisKKyAgIGFzc2lnbmVkLWFkZHJlc3NlcyA9IDxhZGRyZXNzPiA8c2l6ZT4gLi4uIChvcHRpb25hbCAtIG5vdGUgMSkKKyAgIAorICAgT24gYSBQQ0kgYnVzLCB0aGlzIHByb3BlcnR5IHNwZWNpZmllcyB0aGUgYWRkcmVzc2VzIGFzc2lnbmVkIHRvIHRoZSAKKyAgIGRldmljZS4gIFRoZSB2YWx1ZXMgcmVmbGVjdCB0aGUgZGV2aWNlcyBjb25maWd1cmF0aW9uIGJhc2UgcmVnaXN0ZXJzLgorICAgCisgICBOb3RlIDE6IEF0IGxlYXN0IG9uZSBvZiAiYXNzaWduZWQtYWRkcmVzc2VzIiwgInJlZyIgb3IgImFsdGVybmF0aXZlLXJlZyIgCisgICBtdXN0IGJlIHNwZWNpZmllZC4gIElmICJhc3NpZ25lZC1hZGRyZXNzZXMiIGlzIHNwZWNpZmllZCB0aGUgb3RoZXIgCisgICBhZGRyZXNzIHNwZWNpZmljYXRpb25zIGFyZSBpZ25vcmVkLgorICAgCisgICAKKyAgIGlucHV0LWZpbGUgPSA8ZmlsZS1uYW1lPiAob3B0aW9uYWwpCisKKyAgIEZpbGUgdG8gdGFrZSBhbGwgc2VyaWFsIHBvcnQgaW5wdXQgZnJvbSAoaW5zdGVhZCBvZiB0aGUgc2ltdWxhdGlvbgorICAgY29uc29sZSkuCisKKworICAgb3V0cHV0LWZpbGUgPSA8ZmlsZS1uYW1lPiAob3B0aW9uYWwpCisKKyAgIEZpbGUgdG8gc2VuZCBhbGwgb3V0cHV0IHRvIChpbnN0ZWFkIG9mIHRoZSBzaW11bGF0aW9uIGNvbnNvbGUpLgorCisKKyAgIGlucHV0LWJ1ZmZlcmluZyA9ICJ1bmJ1ZmZlcmVkIiAob3B0aW9uYWwpCisKKyAgIFNwZWNpZnlpbmcgInVuYnVmZmVyZWQiIGJ1ZmZlcmluZyBkaXNhYmxlcyBidWZmZXJpbmcgb24gdGhlIHNlcmlhbAorICAgZGV2aWNlcyBpbnB1dCBzdHJlYW0gKGFsbCBkYXRhIGlzIGltbWVkaWF0bHkgcmVhZCkuICBJbiB0aGUgZnV0dXJlLAorICAgdGhpcyBvcHRpb24gbWF5IGJlIHVzZWQgdG8gcHJvdmlkZSBpbnB1dCBidWZmZXJpbmcgYWx0ZXJuYXRpdmVzLgorCisKKyAgIG91dHB1dC1idWZmZXJpbmcgPSAidW5idWZmZXJlZCIgKG9wdGlvbmFsKQorCisgICBTcGVjaWZ5aW5nICJ1bmJ1ZmZlcmVkIiBidWZmZXJpbmcgZGlzYWJsZXMgYnVmZmVyaW5nIG9uIHRoZSBzZXJpYWwgCisgICBkZXZpY2VzIG91dHB1dCBzdHJlYW0gKGFsbCBkYXRhIGlzIGltbWVkaWF0bHkgd3JpdHRlbikuICBJbiB0aGUgZnV0dXJlLCAKKyAgIHRoaXMgb3B0aW9uIG1heSBiZSBleHRlbmRlZCB0byBpbmNsdWRlIG90aGVyIGJ1ZmZlcmluZyBhbHRlcm5hdGl2ZXMuCisKKworICAgaW5wdXQtZGVsYXkgPSA8aW50ZWdlci1kZWxheT4gKG9wdGlvbmFsKQorCisgICBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgdGlja3MgYWZ0ZXIgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGhhcyBiZWVuCisgICByZWFkIGZyb20gdGhlIHNlcmlhbCBwb3J0IHRoYXQgdGhlIG5leHQgY2hhcmFjdGVyIGJlY29tZXMKKyAgIGF2YWlsYWJsZS4KKworCisgICBvdXRwdXQtZGVsYXkgPSA8aW50ZWdlci1kZWxheT4gKG9wdGlvbmFsKQorCisgICBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgdGlja3MgYWZ0ZXIgYSBjaGFyYWN0ZXIgaGFzIGJlZW4gd3JpdHRlbiB0bworICAgdGhlIGVtcHR5IG91dHB1dCBmaWZvIHRoYXQgdGhlIGZpZm8gZmluaXNoZXMgZHJhaW5pbmcuICBBbnkKKyAgIGNoYXJhY3RlcnMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGZpZm8gYmVmb3JlIGl0IGhhcyBkcmFpbmVkIHdpbGwKKyAgIG5vdCBiZSBsb3N0IGFuZCB3aWxsIHN0aWxsIGJlIGRpc3BsYXllZC4KKworCisgICBFWEFNUExFUworCisKKyAgIHwgIC9pb2J1c0AweGYwMDAwMDAwL2NvbUAweDMwMDAvcmVnIDB4MzAwMCA4CisKKyAgIENyZWF0ZSBhIHNpbXBsZSBjb25zb2xlIGRldmljZSBhdCBhZGRyZXNzIDw8MHgzMDAwPj4gd2l0aGluCisgICA8PGlvYnVzPj4uICBTaW5jZSBpb2J1cyBzdGFydHMgYXQgYWRkcmVzcyA8PDB4ZjAwMDAwMDA+PiB0aGUKKyAgIGFic29sdXRlIGFkZHJlc3Mgb2YgdGhlIHNlcmlhbCBwb3J0IHdpbGwgYmUgPDwweGYwMDAzMDAwPj4uCisKKyAgIFRoZSBkZXZpY2Ugd2lsbCBhbHdheXMgYmUgcmVhZHkgZm9yIEkvTyAobm8gZGVsYXkgcHJvcGVydGllcyBzcGVjaWZpZWQpIAorICAgYW5kIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcyB3aWxsIHVzZSB0aGUgc2ltdWxhdGlvbiBjb25zb2xlIAorICAgKG5vIGZpbGUgcHJvcGVydGllcykuCisKKworICAgfCAgJCBwc2ltIFwKKyAgIHwgICAgLW8gJy9jcHVzL2NwdUAwJyBcCisgICB8ICAgIC1vICcvaW9idXNAMHhmMDAwMDAwMC9jb21AMHg0MDAwL3JlZyAweDQwMDAgOCcgXAorICAgfCAgICAtbyAnL2lvYnVzQDB4ZjAwMDAwMDAvY29tQDB4NDAwMC9pbnB1dC1maWxlIC9ldGMvcGFzc3dkJyBcCisgICB8ICAgIC1vICcvaW9idXNAMHhmMDAwMDAwMC9jb21AMHg0MDAwL2lucHV0LWRlbGF5IDEwMDAnIFwKKyAgIHwgICAgLW8gJy9pb2J1c0AweGYwMDAwMDAwL2NvbUAweDQwMDAgPiAwIGludCAvY3B1cy9jcHVAMHgwJyBcCisgICB8ICAgIHBzaW0tdGVzdC9ody1jb20vY2F0LmJlIDB4ZjAwMDQwMDAKKworICAgVGhlIHNlcmlhbCBwb3J0IChhdCBhZGRyZXNzIDw8MHhmMDAwNDAwMD4+IGlzIGNvbmZpZ3VyZWQgc28gdGhhdCBpdAorICAgdGFrZXMgaXRzIGlucHV0IGZyb20gdGhlIGZpbGUgPDwvZXRjL3Bhc3N3ZD4+IHdoaWxlIGl0cyBvdXRwdXQgaXMKKyAgIGFsbG93ZWQgdG8gYXBwZWFyIG9uIHRoZSBzaW11bGF0aW9uIGNvbnNvbGUuCisgICAKKyAgIFRoZSBub2RlIDw8L2NwdXMvY3B1QDA+PiB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQgdG8gZW5zdXJlIHRoYXQgaXQgaGFkIAorICAgYmVlbiBjcmVhdGVkIGJlZm9yZSBhbnkgaW50ZXJydXB0cyB3ZXJlIGF0dGFjaGVkIHRvIGl0LgorCisgICBUaGUgcHJvZ3JhbSA8PHBzaW0tdGVzdC9ody1jb20vY2F0Pj4gY29waWVzIGFueSBjaGFyYWN0ZXJzIG9uIHRoZSBzZXJpYWwgCisgICBwb3J0J3MgaW5wdXQgKDw8L2V0Yy9wYXNzd2Q+PikgdG8gaXRzIG91dHB1dCAodGhlIGNvbnNvbGUpLiAgCisgICBDb25zZXF1ZW50bHksIHRoZSBhb3ZlIHByb2dyYW0gd2lsbCBkaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSAKKyAgIDw8L2V0Yy9wYXNzd2Q+PiBvbiB0aGUgc2NyZWVuLgorCisKKyAgIEJVR1MKKworCisgICBJRUVFIDEyNzUgcmVxdWlyZXMgdGhhdCBhIGRldmljZSBvbiBhIFBDSSBidXMgaGF2ZSwgYXMgaXRzIGZpcnN0IHJlZyAKKyAgIGVudHJ5LCB0aGUgYWRkcmVzcyBvZiBpdHMgY29uZmlndXJhdGlvbiBzcGFjZSByZWdpc3RlcnMuICBDdXJyZW50bHksIAorICAgdGhpcyBkZXZpY2UgZG9lcyBub3QgZXZlbiBpbXBsZW1lbnQgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisgICAKKyAgIFRoaXMgbW9kZWwgZG9lcyBub3QgYXR0ZW1wdCB0byBtb2RlbCB0aGUgJzU1MCdzIGlucHV0IGFuZCBvdXRwdXQgZmlmb3MuICAKKyAgIEluc3RlYWQsIHRoZSBpbnB1dCBmaWZvIGlzIGxpbWl0ZWQgdG8gYSBzaW5nbGUgY2hhcmFjdGVyIGF0IGEgdGltZSwgCisgICB3aGlsZSB0aGUgb3V0cHV0IGZpZm8gaXMgZWZmZWN0aXZseSBpbmZpbml0ZS4gIENvbnNlcXVlbnRseSwgdW5saWtlIHRoZSAKKyAgICc1NTAsIHRoaXMgZGV2aWNlIHdpbGwgbm90IGRpc2NhcmQgb3V0cHV0IGNoYXJhY3RlcnMgb25jZSBhIHN0cmVhbSBvZiAxNiAKKyAgIGhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSBkYXRhIG91dHB1dCByZWdpc3Rlci4KKworICAgVGhlIGlucHV0IGFuZCBvdXRwdXQgY2FuIG9ubHkgYmUgdGFrZW4gZnJvbSBhIGZpbGUgKG9yIHRoZSBjdXJyZW50IAorICAgdGVybWluYWwgZGV2aWNlKS4gIEluIHRoZSBmdXR1cmUsIHRoZSA8PGNvbT4+IGRldmljZSBzaG91bGQgYWxsb3cgdGhlIAorICAgc3BlY2lmaWNhdGlvbiBvZiBvdGhlciBkYXRhIHN0cmVhbXMgKHN1Y2ggYXMgYW4geHRlcm0gb3IgVEsgd2luZG93KS4KKworICAgVGhlIGlucHV0IGJsb2NrcyBpZiBubyBkYXRhIGlzIGF2YWlsYWJsZS4KKworICAgSW50ZXJydXB0cyBoYXZlIG5vdCBiZWVuIHRlc3RlZC4KKworICAgKi8KKworZW51bSB7CisgIG1heF9od19jb21fcmVnaXN0ZXJzID0gOCwKK307CisKK3R5cGVkZWYgc3RydWN0IF9jb21fcG9ydCB7CisgIGludCByZWFkeTsKKyAgaW50IGRlbGF5OworICBpbnQgaW50ZXJydXB0aW5nOworICBGSUxFICpmaWxlOworfSBjb21fcG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgX2NvbV9tb2RlbSB7CisgIGludCBjYXJyaWVyOworICBpbnQgY2Fycmllcl9jaGFuZ2VkOworICBpbnQgaW50ZXJydXB0aW5nOworfSBjb21fbW9kZW07CisKK3R5cGVkZWYgc3RydWN0IF9od19jb21fZGV2aWNlIHsKKyAgY29tX3BvcnQgaW5wdXQ7CisgIGNvbV9wb3J0IG91dHB1dDsKKyAgY29tX21vZGVtIG1vZGVtOworICBjaGFyIGRsYWJbMl07CisgIGNoYXIgcmVnW21heF9od19jb21fcmVnaXN0ZXJzXTsKKyAgaW50IGludGVycnVwdGluZzsKK30gaHdfY29tX2RldmljZTsKKworCitzdGF0aWMgdm9pZAoraHdfY29tX2RldmljZV9pbml0X2RhdGEoZGV2aWNlICptZSkKK3sKKyAgaHdfY29tX2RldmljZSAqY29tID0gKGh3X2NvbV9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKKyAgLyogY2xlYW4gdXAgKi8KKyAgaWYgKGNvbS0+b3V0cHV0LmZpbGUgIT0gTlVMTCkKKyAgICBmY2xvc2UoY29tLT5vdXRwdXQuZmlsZSk7CisgIGlmIChjb20tPmlucHV0LmZpbGUgIT0gTlVMTCkKKyAgICBmY2xvc2UoY29tLT5pbnB1dC5maWxlKTsKKyAgbWVtc2V0KGNvbSwgMCwgc2l6ZW9mKGh3X2NvbV9kZXZpY2UpKTsKKworICAvKiB0aGUgZmlmbyBzcGVlZCAqLworICBjb20tPm91dHB1dC5kZWxheSA9IChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgIm91dHB1dC1kZWxheSIpICE9IE5VTEwKKwkJICAgICAgID8gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgIm91dHB1dC1kZWxheSIpCisJCSAgICAgICA6IDApOworICBjb20tPmlucHV0LmRlbGF5ID0gKGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAiaW5wdXQtZGVsYXkiKSAhPSBOVUxMCisJCSAgICAgID8gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgImlucHV0LWRlbGF5IikKKwkJICAgICAgOiAwKTsKKworICAvKiB0aGUgZGF0YSBzb3VyY2Uvc2luayAqLworICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJpbnB1dC1maWxlIikgIT0gTlVMTCkgeworICAgIGNvbnN0IGNoYXIgKmlucHV0X2ZpbGUgPSBkZXZpY2VfZmluZF9zdHJpbmdfcHJvcGVydHkobWUsICJpbnB1dC1maWxlIik7CisgICAgY29tLT5pbnB1dC5maWxlID0gZm9wZW4oaW5wdXRfZmlsZSwgInIiKTsKKyAgICBpZiAoY29tLT5pbnB1dC5maWxlID09IE5VTEwpCisgICAgICBkZXZpY2VfZXJyb3IobWUsICJQcm9ibGVtIG9wZW5pbmcgaW5wdXQgZmlsZSAlc1xuIiwgaW5wdXRfZmlsZSk7CisgICAgaWYgKGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAiaW5wdXQtYnVmZmVyaW5nIikgIT0gTlVMTCkgeworICAgICAgY29uc3QgY2hhciAqYnVmZmVyaW5nID0gZGV2aWNlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5KG1lLCAiaW5wdXQtYnVmZmVyaW5nIik7CisgICAgICBpZiAoc3RyY21wKGJ1ZmZlcmluZywgInVuYnVmZmVyZWQiKSA9PSAwKQorCXNldGJ1Zihjb20tPmlucHV0LmZpbGUsIE5VTEwpOworICAgIH0KKyAgfQorICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJvdXRwdXQtZmlsZSIpICE9IE5VTEwpIHsKKyAgICBjb25zdCBjaGFyICpvdXRwdXRfZmlsZSA9IGRldmljZV9maW5kX3N0cmluZ19wcm9wZXJ0eShtZSwgIm91dHB1dC1maWxlIik7CisgICAgY29tLT5vdXRwdXQuZmlsZSA9IGZvcGVuKG91dHB1dF9maWxlLCAidyIpOworICAgIGlmIChjb20tPmlucHV0LmZpbGUgPT0gTlVMTCkKKyAgICAgIGRldmljZV9lcnJvcihtZSwgIlByb2JsZW0gb3BlbmluZyBvdXRwdXQgZmlsZSAlc1xuIiwgb3V0cHV0X2ZpbGUpOworICAgIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgIm91dHB1dC1idWZmZXJpbmciKSAhPSBOVUxMKSB7CisgICAgICBjb25zdCBjaGFyICpidWZmZXJpbmcgPSBkZXZpY2VfZmluZF9zdHJpbmdfcHJvcGVydHkobWUsICJvdXRwdXQtYnVmZmVyaW5nIik7CisgICAgICBpZiAoc3RyY21wKGJ1ZmZlcmluZywgInVuYnVmZmVyZWQiKSA9PSAwKQorCXNldGJ1Zihjb20tPm91dHB1dC5maWxlLCBOVUxMKTsKKyAgICB9CisgIH0KKworICAvKiByZWFkeSBmcm9tIHRoZSBzdGFydCAqLworICBjb20tPmlucHV0LnJlYWR5ID0gMTsKKyAgY29tLT5tb2RlbS5jYXJyaWVyID0gMTsKKyAgY29tLT5vdXRwdXQucmVhZHkgPSAxOworfQorCisKK3N0YXRpYyB2b2lkCit1cGRhdGVfY29tX2ludGVycnVwdHMoZGV2aWNlICptZSwKKwkJICAgICAgaHdfY29tX2RldmljZSAqY29tKQoreworICBpbnQgaW50ZXJydXB0aW5nOworICBjb20tPm1vZGVtLmludGVycnVwdGluZyA9IChjb20tPm1vZGVtLmNhcnJpZXJfY2hhbmdlZCAmJiAoY29tLT5yZWdbMV0gJiAweDgwKSk7CisgIGNvbS0+aW5wdXQuaW50ZXJydXB0aW5nID0gKGNvbS0+aW5wdXQucmVhZHkgJiYgKGNvbS0+cmVnWzFdICYgMHgxKSk7CisgIGNvbS0+b3V0cHV0LmludGVycnVwdGluZyA9IChjb20tPm91dHB1dC5yZWFkeSAmJiAoY29tLT5yZWdbMV0gJiAweDIpKTsKKyAgaW50ZXJydXB0aW5nID0gKGNvbS0+aW5wdXQuaW50ZXJydXB0aW5nCisJCSAgfHwgY29tLT5vdXRwdXQuaW50ZXJydXB0aW5nCisJCSAgfHwgY29tLT5tb2RlbS5pbnRlcnJ1cHRpbmcpOworCisgIGlmIChpbnRlcnJ1cHRpbmcpIHsKKyAgICBpZiAoIWNvbS0+aW50ZXJydXB0aW5nKSB7CisgICAgICBkZXZpY2VfaW50ZXJydXB0X2V2ZW50KG1lLCAwIC8qcG9ydCovLCAxIC8qdmFsdWUqLywgTlVMTCwgMCk7CisgICAgfQorICB9CisgIGVsc2UgLyohaW50ZXJydXB0aW5nKi8geworICAgIGlmIChjb20tPmludGVycnVwdGluZykKKyAgICAgIGRldmljZV9pbnRlcnJ1cHRfZXZlbnQobWUsIDAgLypwb3J0Ki8sIDAgLyp2YWx1ZSovLCBOVUxMLCAwKTsKKyAgfQorICBjb20tPmludGVycnVwdGluZyA9IGludGVycnVwdGluZzsKK30KKworCitzdGF0aWMgdm9pZAorbWFrZV9yZWFkX3JlYWR5KHZvaWQgKmRhdGEpCit7CisgIGRldmljZSAqbWUgPSAoZGV2aWNlKilkYXRhOworICBod19jb21fZGV2aWNlICpjb20gPSAoaHdfY29tX2RldmljZSopZGV2aWNlX2RhdGEobWUpOworICBjb20tPmlucHV0LnJlYWR5ID0gMTsKKyAgdXBkYXRlX2NvbV9pbnRlcnJ1cHRzKG1lLCBjb20pOworfQorCitzdGF0aWMgdm9pZAorcmVhZF9jb20oZGV2aWNlICptZSwKKwkgaHdfY29tX2RldmljZSAqY29tLAorCSB1bnNpZ25lZF93b3JkIGEsCisJIGNoYXIgdmFsWzFdKQoreworICB1bnNpZ25lZF93b3JkIGFkZHIgPSBhICUgODsKKworICAvKiB0aGUgZGl2aXNvciBsYXRjaCBpcyBzcGVjaWFsICovCisgIGlmIChjb20tPnJlZ1szXSAmIDB4OCAmJiBhZGRyIDwgMikgeworICAgICp2YWwgPSBjb20tPmRsYWJbYWRkcl07CisgICAgcmV0dXJuOworICB9CisKKyAgc3dpdGNoIChhZGRyKSB7CisgIAorICBjYXNlIDA6CisgICAgLyogZmlmbyAqLworICAgIGlmICghY29tLT5tb2RlbS5jYXJyaWVyKQorICAgICAgKnZhbCA9ICdcMCc7CisgICAgaWYgKGNvbS0+aW5wdXQucmVhZHkpIHsKKyAgICAgIC8qIHJlYWQgdGhlIGNoYXIgaW4gKi8KKyAgICAgIGlmIChjb20tPmlucHV0LmZpbGUgPT0gTlVMTCkgeworCWlmIChzaW1faW9fcmVhZF9zdGRpbih2YWwsIDEpIDwgMCkKKwkgIGNvbS0+bW9kZW0uY2Fycmllcl9jaGFuZ2VkID0gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworCWlmIChmcmVhZCh2YWwsIDEsIDEsIGNvbS0+aW5wdXQuZmlsZSkgPT0gMCkKKwkgIGNvbS0+bW9kZW0uY2Fycmllcl9jaGFuZ2VkID0gMTsKKyAgICAgIH0KKyAgICAgIC8qIHNldHVwIGZvciBuZXh0IHJlYWQgKi8KKyAgICAgIGlmIChjb20tPm1vZGVtLmNhcnJpZXJfY2hhbmdlZCkgeworCS8qIG9uY2UgbG9zdCBjYXJyaWVyLCBuZXZlciByZWFkeSAqLworCWNvbS0+bW9kZW0uY2FycmllciA9IDA7CisJY29tLT5pbnB1dC5yZWFkeSA9IDA7CisJKnZhbCA9ICdcMCc7CisgICAgICB9CisgICAgICBlbHNlIGlmIChjb20tPmlucHV0LmRlbGF5ID4gMCkgeworCWNvbS0+aW5wdXQucmVhZHkgPSAwOworCWRldmljZV9ldmVudF9xdWV1ZV9zY2hlZHVsZShtZSwgY29tLT5pbnB1dC5kZWxheSwgbWFrZV9yZWFkX3JlYWR5LCBtZSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgLyogZGlzY2FyZCBpdD8gKi8KKyAgICAgIC8qIG92ZXJmbG93IGlucHV0IGZpZm8/ICovCisgICAgICAqdmFsID0gJ1wwJzsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyOgorICAgIC8qIGludGVycnVwdCBpZGVudCAqLworICAgIGlmIChjb20tPmludGVycnVwdGluZykgeworICAgICAgaWYgKGNvbS0+aW5wdXQuaW50ZXJydXB0aW5nKQorCSp2YWwgPSAweDQ7CisgICAgICBlbHNlIGlmIChjb20tPm91dHB1dC5pbnRlcnJ1cHRpbmcpCisJKnZhbCA9IDB4MjsKKyAgICAgIGVsc2UgaWYgKGNvbS0+bW9kZW0uaW50ZXJydXB0aW5nID09IDApCisJKnZhbCA9IDA7CisgICAgICBlbHNlCisJZGV2aWNlX2Vycm9yKG1lLCAiYmFkIGVsaWYgZm9yIGludGVycnVwdHNcbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgICAqdmFsID0gMHgxOworICAgIGJyZWFrOworCisgIGNhc2UgNToKKyAgICAvKiBsaW5lIHN0YXR1cyAqLworICAgICp2YWwgPSAoKGNvbS0+aW5wdXQucmVhZHkgPyAweDEgOiAwKQorCSAgICB8IChjb20tPm91dHB1dC5yZWFkeSA/IDB4NjAgOiAwKQorCSAgICApOworICAgIGJyZWFrOworCisgIGNhc2UgNjoKKyAgICAvKiBtb2RlbSBzdGF0dXMgKi8KKyAgICAqdmFsID0gKChjb20tPm1vZGVtLmNhcnJpZXJfY2hhbmdlZCA/IDB4MDggOiAwKQorCSAgICB8IChjb20tPm1vZGVtLmNhcnJpZXIgPyAweDgwIDogMCkKKwkgICAgKTsKKyAgICBjb20tPm1vZGVtLmNhcnJpZXJfY2hhbmdlZCA9IDA7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAqdmFsID0gY29tLT5yZWdbYWRkcl07CisgICAgYnJlYWs7CisKKyAgfQorICB1cGRhdGVfY29tX2ludGVycnVwdHMobWUsIGNvbSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAoraHdfY29tX2lvX3JlYWRfYnVmZmVyX2NhbGxiYWNrKGRldmljZSAqbWUsCisJCQkgICAgICAgdm9pZCAqZGVzdCwKKwkJCSAgICAgICBpbnQgc3BhY2UsCisJCQkgICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAorCQkJICAgICAgIHVuc2lnbmVkIG5yX2J5dGVzLAorCQkJICAgICAgIGNwdSAqcHJvY2Vzc29yLAorCQkJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBod19jb21fZGV2aWNlICpjb20gPSBkZXZpY2VfZGF0YShtZSk7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnJfYnl0ZXM7IGkrKykgeworICAgIHJlYWRfY29tKG1lLCBjb20sIGFkZHIgKyBpLCAmKChjaGFyKilkZXN0KVtpXSk7CisgIH0KKyAgcmV0dXJuIG5yX2J5dGVzOworfQorCisKK3N0YXRpYyB2b2lkCittYWtlX3dyaXRlX3JlYWR5KHZvaWQgKmRhdGEpCit7CisgIGRldmljZSAqbWUgPSAoZGV2aWNlKilkYXRhOworICBod19jb21fZGV2aWNlICpjb20gPSAoaHdfY29tX2RldmljZSopZGV2aWNlX2RhdGEobWUpOworICBjb20tPm91dHB1dC5yZWFkeSA9IDE7CisgIHVwZGF0ZV9jb21faW50ZXJydXB0cyhtZSwgY29tKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX2NvbShkZXZpY2UgKm1lLAorCSAgaHdfY29tX2RldmljZSAqY29tLAorCSAgdW5zaWduZWRfd29yZCBhLAorCSAgY2hhciB2YWwpCit7CisgIHVuc2lnbmVkX3dvcmQgYWRkciA9IGEgJSA4OworCisgIC8qIHRoZSBkaXZpc29yIGxhdGNoIGlzIHNwZWNpYWwgKi8KKyAgaWYgKGNvbS0+cmVnWzNdICYgMHg4ICYmIGFkZHIgPCAyKSB7CisgICAgY29tLT5kbGFiW2FkZHJdID0gdmFsOworICAgIHJldHVybjsKKyAgfQorCisgIHN3aXRjaCAoYWRkcikgeworICAKKyAgY2FzZSAwOgorICAgIC8qIGZpZm8gKi8KKyAgICBpZiAoY29tLT5vdXRwdXQuZmlsZSA9PSBOVUxMKSB7CisgICAgICBzaW1faW9fd3JpdGVfc3Rkb3V0KCZ2YWwsIDEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGZ3cml0ZSgmdmFsLCAxLCAxLCBjb20tPm91dHB1dC5maWxlKTsKKyAgICB9CisgICAgLyogc2V0dXAgZm9yIG5leHQgd3JpdGUgKi8KKyAgICBpZiAoY29tLT5vdXRwdXQucmVhZHkgJiYgY29tLT5vdXRwdXQuZGVsYXkgPiAwKSB7CisgICAgICBjb20tPm91dHB1dC5yZWFkeSA9IDA7CisgICAgICBkZXZpY2VfZXZlbnRfcXVldWVfc2NoZWR1bGUobWUsIGNvbS0+b3V0cHV0LmRlbGF5LCBtYWtlX3dyaXRlX3JlYWR5LCBtZSk7CisgICAgfQorICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgY29tLT5yZWdbYWRkcl0gPSB2YWw7CisgICAgYnJlYWs7CisKKyAgfQorICB1cGRhdGVfY29tX2ludGVycnVwdHMobWUsIGNvbSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAoraHdfY29tX2lvX3dyaXRlX2J1ZmZlcl9jYWxsYmFjayhkZXZpY2UgKm1lLAorCQkJCWNvbnN0IHZvaWQgKnNvdXJjZSwKKwkJCQlpbnQgc3BhY2UsCisJCQkJdW5zaWduZWRfd29yZCBhZGRyLAorCQkJCXVuc2lnbmVkIG5yX2J5dGVzLAorCQkJCWNwdSAqcHJvY2Vzc29yLAorCQkJCXVuc2lnbmVkX3dvcmQgY2lhKQoreworICBod19jb21fZGV2aWNlICpjb20gPSBkZXZpY2VfZGF0YShtZSk7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnJfYnl0ZXM7IGkrKykgeworICAgIHdyaXRlX2NvbShtZSwgY29tLCBhZGRyICsgaSwgKChjaGFyKilzb3VyY2UpW2ldKTsKKyAgfQorICByZXR1cm4gbnJfYnl0ZXM7Cit9CisKKworLyogaW5zdGFuY2VzIG9mIHRoZSBod19jb20gZGV2aWNlICovCisKK3N0YXRpYyB2b2lkCitod19jb21faW5zdGFuY2VfZGVsZXRlKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UpCit7CisgIC8qIG5vdGhpbmcgdG8gZGVsZXRlLCB0aGUgaHdfY29tIGlzIGF0dGFjaGVkIHRvIHRoZSBkZXZpY2UgKi8KKyAgcmV0dXJuOworfQorCitzdGF0aWMgaW50Citod19jb21faW5zdGFuY2VfcmVhZChkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAorCQkgICAgIHZvaWQgKmJ1ZiwKKwkJICAgICB1bnNpZ25lZF93b3JkIGxlbikKK3sKKyAgZGV2aWNlICptZSA9IGRldmljZV9pbnN0YW5jZV9kZXZpY2UoaW5zdGFuY2UpOworICBod19jb21fZGV2aWNlICpjb20gPSBkZXZpY2VfZGF0YShtZSk7CisgIGlmIChjb20tPmlucHV0LmZpbGUgPT0gTlVMTCkKKyAgICByZXR1cm4gc2ltX2lvX3JlYWRfc3RkaW4oYnVmLCBsZW4pOworICBlbHNlIHsKKyAgICByZXR1cm4gZnJlYWQoYnVmLCAxLCBsZW4sIGNvbS0+aW5wdXQuZmlsZSk7CisgIH0KK30KKworc3RhdGljIGludAoraHdfY29tX2luc3RhbmNlX3dyaXRlKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCisJCSAgICAgIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJICAgICAgdW5zaWduZWRfd29yZCBsZW4pCit7CisgIGRldmljZSAqbWUgPSBkZXZpY2VfaW5zdGFuY2VfZGV2aWNlKGluc3RhbmNlKTsKKyAgaHdfY29tX2RldmljZSAqY29tID0gZGV2aWNlX2RhdGEobWUpOworICBpZiAoY29tLT5vdXRwdXQuZmlsZSA9PSBOVUxMKQorICAgIHJldHVybiBzaW1faW9fd3JpdGVfc3Rkb3V0KGJ1ZiwgbGVuKTsKKyAgZWxzZSB7CisgICAgcmV0dXJuIGZ3cml0ZShidWYsIDEsIGxlbiwgY29tLT5vdXRwdXQuZmlsZSk7CisgIH0KK30KKworc3RhdGljIGNvbnN0IGRldmljZV9pbnN0YW5jZV9jYWxsYmFja3MgaHdfY29tX2luc3RhbmNlX2NhbGxiYWNrcyA9IHsKKyAgaHdfY29tX2luc3RhbmNlX2RlbGV0ZSwKKyAgaHdfY29tX2luc3RhbmNlX3JlYWQsCisgIGh3X2NvbV9pbnN0YW5jZV93cml0ZSwKK307CisKK3N0YXRpYyBkZXZpY2VfaW5zdGFuY2UgKgoraHdfY29tX2NyZWF0ZV9pbnN0YW5jZShkZXZpY2UgKm1lLAorCQkgICAgICAgY29uc3QgY2hhciAqcGF0aCwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmFyZ3MpCit7CisgIC8qIHBvaW50IGFuIGluc3RhbmNlIGRpcmVjdGx5IGF0IHRoZSBkZXZpY2UgKi8KKyAgcmV0dXJuIGRldmljZV9jcmVhdGVfaW5zdGFuY2VfZnJvbShtZSwgTlVMTCwKKwkJCQkgICAgIGRldmljZV9kYXRhKG1lKSwKKwkJCQkgICAgIHBhdGgsIGFyZ3MsCisJCQkJICAgICAmaHdfY29tX2luc3RhbmNlX2NhbGxiYWNrcyk7Cit9CisKKworc3RhdGljIGRldmljZV9jYWxsYmFja3MgY29uc3QgaHdfY29tX2NhbGxiYWNrcyA9IHsKKyAgeyBnZW5lcmljX2RldmljZV9pbml0X2FkZHJlc3MsCisgICAgaHdfY29tX2RldmljZV9pbml0X2RhdGEgfSwKKyAgeyBOVUxMLCB9LCAvKiBhZGRyZXNzICovCisgIHsgaHdfY29tX2lvX3JlYWRfYnVmZmVyX2NhbGxiYWNrLAorICAgICAgaHdfY29tX2lvX3dyaXRlX2J1ZmZlcl9jYWxsYmFjaywgfSwKKyAgeyBOVUxMLCB9LCAvKiBETUEgKi8KKyAgeyBOVUxMLCB9LCAvKiBpbnRlcnJ1cHQgKi8KKyAgeyBOVUxMLCB9LCAvKiB1bml0ICovCisgIGh3X2NvbV9jcmVhdGVfaW5zdGFuY2UsCit9OworCisKK3N0YXRpYyB2b2lkICoKK2h3X2NvbV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKKwkgICAgICBjb25zdCBkZXZpY2VfdW5pdCAqdW5pdF9hZGRyZXNzLAorCSAgICAgIGNvbnN0IGNoYXIgKmFyZ3MpCit7CisgIC8qIGNyZWF0ZSB0aGUgZGVzY3JpcHRvciAqLworICBod19jb21fZGV2aWNlICpod19jb20gPSBaQUxMT0MoaHdfY29tX2RldmljZSk7CisgIHJldHVybiBod19jb207Cit9CisKKworY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgaHdfY29tX2RldmljZV9kZXNjcmlwdG9yW10gPSB7CisgIHsgImNvbSIsIGh3X2NvbV9jcmVhdGUsICZod19jb21fY2FsbGJhY2tzIH0sCisgIHsgTlVMTCB9LAorfTsKKworI2VuZGlmIC8qIF9IV19DT01fQ18gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvaHdfY29yZS5jIGIvc2ltL3BwYy9od19jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0Mzk1NwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvaHdfY29yZS5jCkBAIC0wLDAgKzEsMTQzIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKyAgICAKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgICAgCisgICAgKi8KKworCisjaWZuZGVmIF9IV19DT1JFX0NfCisjZGVmaW5lIF9IV19DT1JFX0NfCisKKyNpbmNsdWRlICJkZXZpY2VfdGFibGUuaCIKKworI2luY2x1ZGUgImNvcmVmaWxlLmgiCisKKworLyogREVWSUNFCisgICAKKyAgIGNvcmUgLSByb290IG9mIHRoZSBkZXZpY2UgdHJlZQorICAgCisgICBERVNDUklQVElPTgorICAgCisgICBUaGUgY29yZSBkZXZpY2UgcG9zaXRpb25lZCBhdCB0aGUgcm9vdCBvZiB0aGUgZGV2aWNlIHRyZWUgYXBwZWFycworICAgdG8gaXRzIGNoaWxkIGRldmljZXMgYXMgYSBub3JtYWwgZGV2aWNlIGp1c3QgbGlrZSBldmVyeSBvdGhlcgorICAgZGV2aWNlIGluIHRoZSB0cmVlLgorCisgICBJbnRlcm5hbGx5IGl0IGlzIGltcGxlbWVudGVkIHVzaW5nIGEgY29yZSBvYmplY3QuICBSZXF1ZXN0cyB0bworICAgYXR0YWNoIChvciBkZXRhY2gpIGFkZHJlc3Mgc3BhY2VzIGFyZSBwYXNzZWQgdG8gdGhhdCBjb3JlIG9iamVjdC4KKyAgIFJlcXVlc3RzIHRvIHRyYW5zZmVyIChETUEpIGRhdGEgYXJlIHJlZmxlY3RlZCBiYWNrIGRvd24gdGhlIGRldmljZQorICAgdHJlZSB1c2luZyB0aGUgY29yZV9tYXAgZGF0YSB0cmFuc2ZlciBtZXRob2RzLgorCisgICBQUk9QRVJUSUVTCisKKyAgIE5vbmUuCisKKyAgICovCisKKworc3RhdGljIHZvaWQKK2h3X2NvcmVfaW5pdF9hZGRyZXNzX2NhbGxiYWNrKGRldmljZSAqbWUpCit7CisgIGNvcmUgKm1lbW9yeSA9IChjb3JlKilkZXZpY2VfZGF0YShtZSk7CisgIGNvcmVfaW5pdChtZW1vcnkpOworfQorCisKK3N0YXRpYyB2b2lkCitod19jb3JlX2F0dGFjaF9hZGRyZXNzX2NhbGxiYWNrKGRldmljZSAqbWUsCisJCQkJYXR0YWNoX3R5cGUgYXR0YWNoLAorCQkJCWludCBzcGFjZSwKKwkJCQl1bnNpZ25lZF93b3JkIGFkZHIsCisJCQkJdW5zaWduZWQgbnJfYnl0ZXMsCisJCQkJYWNjZXNzX3R5cGUgYWNjZXNzLAorCQkJCWRldmljZSAqY2xpZW50KSAvKmNhbGxiYWNrL2RlZmF1bHQqLworeworICBjb3JlICptZW1vcnkgPSAoY29yZSopZGV2aWNlX2RhdGEobWUpOworICBpZiAoc3BhY2UgIT0gMCkKKyAgICBlcnJvcigiY29yZV9hdHRhY2hfYWRkcmVzc19jYWxsYmFjaygpIGludmFsaWQgYWRkcmVzcyBzcGFjZVxuIik7CisgIGNvcmVfYXR0YWNoKG1lbW9yeSwKKwkgICAgICBhdHRhY2gsCisJICAgICAgc3BhY2UsCisJICAgICAgYWNjZXNzLAorCSAgICAgIGFkZHIsCisJICAgICAgbnJfYnl0ZXMsCisJICAgICAgY2xpZW50KTsKK30KKworCitzdGF0aWMgdW5zaWduZWQKK2h3X2NvcmVfZG1hX3JlYWRfYnVmZmVyX2NhbGxiYWNrKGRldmljZSAqbWUsCisJCQkJIHZvaWQgKmRlc3QsCisJCQkJIGludCBzcGFjZSwKKwkJCQkgdW5zaWduZWRfd29yZCBhZGRyLAorCQkJCSB1bnNpZ25lZCBucl9ieXRlcykKK3sKKyAgY29yZSAqbWVtb3J5ID0gKGNvcmUqKWRldmljZV9kYXRhKG1lKTsKKyAgcmV0dXJuIGNvcmVfbWFwX3JlYWRfYnVmZmVyKGNvcmVfcmVhZGFibGUobWVtb3J5KSwKKwkJCSAgICAgIGRlc3QsCisJCQkgICAgICBhZGRyLAorCQkJICAgICAgbnJfYnl0ZXMpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZAoraHdfY29yZV9kbWFfd3JpdGVfYnVmZmVyX2NhbGxiYWNrKGRldmljZSAqbWUsCisJCQkJICBjb25zdCB2b2lkICpzb3VyY2UsCisJCQkJICBpbnQgc3BhY2UsCisJCQkJICB1bnNpZ25lZF93b3JkIGFkZHIsCisJCQkJICB1bnNpZ25lZCBucl9ieXRlcywKKwkJCQkgIGludCB2aW9sYXRlX3JlYWRfb25seV9zZWN0aW9uKQoreworICBjb3JlICptZW1vcnkgPSAoY29yZSopZGV2aWNlX2RhdGEobWUpOworICBjb3JlX21hcCAqbWFwID0gKHZpb2xhdGVfcmVhZF9vbmx5X3NlY3Rpb24KKwkJICAgPyBjb3JlX3JlYWRhYmxlKG1lbW9yeSkKKwkJICAgOiBjb3JlX3dyaXRlYWJsZShtZW1vcnkpKTsKKyAgcmV0dXJuIGNvcmVfbWFwX3dyaXRlX2J1ZmZlcihtYXAsCisJCQkgICAgICAgc291cmNlLAorCQkJICAgICAgIGFkZHIsCisJCQkgICAgICAgbnJfYnl0ZXMpOworfQorCitzdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod19jb3JlX2NhbGxiYWNrcyA9IHsKKyAgeyBod19jb3JlX2luaXRfYWRkcmVzc19jYWxsYmFjaywgfSwKKyAgeyBod19jb3JlX2F0dGFjaF9hZGRyZXNzX2NhbGxiYWNrLCB9LAorICB7IE5VTEwsIH0sIC8qIElPICovCisgIHsgaHdfY29yZV9kbWFfcmVhZF9idWZmZXJfY2FsbGJhY2ssCisgICAgaHdfY29yZV9kbWFfd3JpdGVfYnVmZmVyX2NhbGxiYWNrLCB9LAorICB7IE5VTEwsIH0sIC8qIGludGVycnVwdCAqLworICB7IGdlbmVyaWNfZGV2aWNlX3VuaXRfZGVjb2RlLAorICAgIGdlbmVyaWNfZGV2aWNlX3VuaXRfZW5jb2RlLAorICAgIGdlbmVyaWNfZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MsCisgICAgZ2VuZXJpY19kZXZpY2Vfc2l6ZV90b19hdHRhY2hfc2l6ZSwgfSwKK307CisKKworc3RhdGljIHZvaWQgKgoraHdfY29yZV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKKwkgICAgICAgY29uc3QgZGV2aWNlX3VuaXQgKnVuaXRfYWRkcmVzcywKKwkgICAgICAgY29uc3QgY2hhciAqYXJncykKK3sKKyAgY29yZSAqbWVtb3J5ID0gY29yZV9jcmVhdGUoKTsKKyAgcmV0dXJuIG1lbW9yeTsKK30KKworY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgaHdfY29yZV9kZXZpY2VfZGVzY3JpcHRvcltdID0geworICB7ICJjb3JlIiwgaHdfY29yZV9jcmVhdGUsICZod19jb3JlX2NhbGxiYWNrcyB9LAorICB7IE5VTEwgfSwKK307CisKKyNlbmRpZiAvKiBfSFdfQ09SRV9DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9od19jcHUuYyBiL3NpbS9wcGMvaHdfY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3YTRjMgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvaHdfY3B1LmMKQEAgLTAsMCArMSwxNjcgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgX0hXX0NQVV9DXworI2RlZmluZSBfSFdfQ1BVX0NfCisKKyNpZm5kZWYgU1RBVElDX0lOTElORV9IV19DUFUKKyNkZWZpbmUgU1RBVElDX0lOTElORV9IV19DUFUgU1RBVElDX0lOTElORQorI2VuZGlmCisKKyNpbmNsdWRlICJkZXZpY2VfdGFibGUuaCIKKyNpbmNsdWRlICJod19jcHUuaCIKKworI2luY2x1ZGUgImludGVycnVwdHMuaCIKKyNpbmNsdWRlICJjcHUuaCIKKworCisvKiBERVZJQ0UKKworCisgICBjcHUgLSBJbnRlcmZhY2UgdG8gYSBQcm9jZXNzb3IKKworCisgICBERVNDUklQVElPTgorCisKKyAgIFRoZSBDUFUgZGV2aWNlIHByb3ZpZGVzIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIGludGVycnVwdCBuZXQKKyAgIChsaW5raW5nIHRoZSBkZXZpY2VzIGFuZCB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIpIGFuZCB0aGUKKyAgIHNpbXVsYXRlZCBtb2RlbCBvZiBlYWNoIHByb2Nlc3Nvci4gIFRoaXMgZGV2aWNlIGNvbnRhaW5zIGludGVycnVwdAorICAgcG9ydHMgdGhhdCBjb3JyZXNwb25kIGRpcmVjdGx5IHRvIHRoZSBleHRlcm5hbCBpbnRlcnJ1cHQgc3RpbXVsdXMKKyAgIHRoYXQgY2FuIGJlIHNlbnQgdG8gYSBnaXZlbiBwcm9jZXNzb3IuICBTZW5kaW5nIGFuIGludGVycnVwdCB0byBvbmUKKyAgIG9mIHRoZSBwb3J0cyByZXN1bHRzIGluIGFuIGludGVycnVwdCBiZWluZyBkZWxpdmVyZWQgdG8gdGhlCisgICBjb3JyZXNwb25kaW5nIHByb2Nlc3Nvci4KKworICAgVHlwaWNhbGx5LCBhbiBpbnRlcnJ1cHQgY29udHJvbGxlciB3b3VsZCBoYXZlIGl0cyBpbnB1dHMgY29ubmVjdGVkCisgICB0byBkZXZpY2UgaW50ZXJydXB0IHNvdXJjZXMgYW5kIGl0cyBvdXRwdXRzIChzcmVzZXQsIGludCwgZXQuYWwuKQorICAgY29ubmVjdGVkIHRvIHRoaXMgZGV2aWNlLgorCisKKyAgIFBST1BFUlRJRVMKKworCisgICBjcHUtbnIgPSA8aW50ZWdlcj4gKHJlcXVpcmVkKQorCisKKyAgIFNwZWNpZnkgdGhlIHByb2Nlc3NvciAoMS4uTikgdGhhdCB0aGlzIGNwdSBkZXZpY2Ugbm9kZSBzaG91bGQKKyAgIGNvbnRyb2wuCisKKworICAgRVhBTVBMRVMKKworICAgCisgICBDb25uZWN0IGFuIE9wZW5QSUMgaW50ZXJydXB0IGNvbnRyb2xsZXIgaW50ZXJydXB0IHBvcnRzIHRvCisgICBwcm9jZXNzb3IgemVyby4KKworICAgfCAtbyAnL3BoYi9vcGljQDAgPiBpcnEwIGludCAvY3B1cy9jcHVAMCcgXAorICAgfCAtbyAnL3BoYi9vcGljQDAgPiBpbml0IGhyZXNldCAvY3B1cy9jcHVAMCcgXAorCisKKyAgICovCisKK3R5cGVkZWYgc3RydWN0IF9od19jcHVfZGV2aWNlIHsKKyAgaW50IGNwdV9ucjsKKyAgY3B1ICpwcm9jZXNzb3I7Cit9IGh3X2NwdV9kZXZpY2U7CisKK3N0YXRpYyBjb25zdCBkZXZpY2VfaW50ZXJydXB0X3BvcnRfZGVzY3JpcHRvciBod19jcHVfaW50ZXJydXB0X3BvcnRzW10gPSB7CisgIHsgImhyZXNldCIsIGh3X2NwdV9oYXJkX3Jlc2V0IH0sCisgIHsgInNyZXNldCIsIGh3X2NwdV9zb2Z0X3Jlc2V0IH0sCisgIHsgImludCIsIGh3X2NwdV9leHRlcm5hbF9pbnRlcnJ1cHQgfSwKKyAgeyAibWNpIiwgaHdfY3B1X21hY2hpbmVfY2hlY2tfaW50ZXJydXB0IH0sCisgIHsgInNtaSIsIGh3X2NwdV9zeXN0ZW1fbWFuYWdlbWVudF9pbnRlcnJ1cHQgfSwKKyAgeyBOVUxMIH0KK307CisKKworc3RhdGljIHZvaWQgKgoraHdfY3B1X2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLAorCSAgICAgIGNvbnN0IGRldmljZV91bml0ICp1bml0X2FkZHJlc3MsCisJICAgICAgY29uc3QgY2hhciAqYXJncykKK3sKKyAgaHdfY3B1X2RldmljZSAqaHdfY3B1ID0gWkFMTE9DKGh3X2NwdV9kZXZpY2UpOworICByZXR1cm4gaHdfY3B1OworfQorCisKKy8qIGR1cmluZyBhZGRyZXNzIGluaXRpYWxpemF0aW9uIGVuc3VyZSB0aGF0IGFueSBtaXNzaW5nIGNwdQorICAgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gdGhpcyBkZXZpY2VzIG5vZGUgKi8KKworc3RhdGljIHZvaWQKK2h3X2NwdV9pbml0X2FkZHJlc3MoZGV2aWNlICptZSkKK3sKKyAgaHdfY3B1X2RldmljZSAqaHdfY3B1ID0gKGh3X2NwdV9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKKyAgLyogcG9wdWxhdGUgdGhlIG5vZGUgd2l0aCBwcm9wZXJ0aWVzICovCisgIC8qIGNsZWFyIG91ciBkYXRhICovCisgIG1lbXNldChod19jcHUsIDB4MCwgc2l6ZW9mKGh3X2NwdV9kZXZpY2UpKTsKKyAgaHdfY3B1LT5jcHVfbnIgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAiY3B1LW5yIik7CisgIGh3X2NwdS0+cHJvY2Vzc29yID0gcHNpbV9jcHUoZGV2aWNlX3N5c3RlbShtZSksIGh3X2NwdS0+Y3B1X25yKTsKK30KKworCisvKiBUYWtlIHRoZSBpbnRlcnJ1cHQgYW5kIHN5bmNocm9uaXplIGl0cyBkZWxpdmVyeSB3aXRoIHRoZSBjbG9jay4gIElmCisgICB3ZSd2ZSBub3QgeWV0IHNjaGVkdWxlZCBhbiBpbnRlcnJ1cHQgZm9yIHRoZSBuZXh0IGNsb2NrIHRpY2ssIHRha2UKKyAgIHRoZSBvcG9ydHVuaXR5IHRvIGRvIGl0IG5vdyAqLworCitzdGF0aWMgdm9pZAoraHdfY3B1X2ludGVycnVwdF9ldmVudChkZXZpY2UgKm1lLAorCQkgICAgICAgaW50IG15X3BvcnQsCisJCSAgICAgICBkZXZpY2UgKnNvdXJjZSwKKwkJICAgICAgIGludCBzb3VyY2VfcG9ydCwKKwkJICAgICAgIGludCBsZXZlbCwKKwkJICAgICAgIGNwdSAqcHJvY2Vzc29yLAorCQkgICAgICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGh3X2NwdV9kZXZpY2UgKmh3X2NwdSA9IChod19jcHVfZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7CisgIGlmIChteV9wb3J0IDwgMCB8fCBteV9wb3J0ID49IGh3X2NwdV9ucl9pbnRlcnJ1cHRfcG9ydHMpCisgICAgZXJyb3IoImh3X2NwdV9pbnRlcnJ1cHRfZXZlbnRfY2FsbGJhY2s6IGludGVycnVwdCBwb3J0IG91dCBvZiByYW5nZSAlZFxuIiwKKwkgIG15X3BvcnQpOworICBzd2l0Y2ggKG15X3BvcnQpIHsKKyAgICAvKmNhc2UgaHdfY3B1X2hhcmRfcmVzZXQ6Ki8KKyAgICAvKmNhc2UgaHdfY3B1X3NvZnRfcmVzZXQ6Ki8KKyAgY2FzZSBod19jcHVfZXh0ZXJuYWxfaW50ZXJydXB0OgorICAgIGV4dGVybmFsX2ludGVycnVwdChod19jcHUtPnByb2Nlc3NvciwgbGV2ZWwpOworICAgIGJyZWFrOworICAgIC8qY2FzZSBod19jcHVfbWFjaGluZV9jaGVja19pbnRlcnJ1cHQ6Ki8KKyAgZGVmYXVsdDoKKyAgICBlcnJvcigiaHdfY3B1X2RlbGl2ZXJfaW50ZXJydXB0OiB1bmltcGxlbWVudGVkIGludGVycnVwdCBwb3J0ICVkXG4iLAorCSAgbXlfcG9ydCk7CisgICAgYnJlYWs7CisgIH0KK30KKworCitzdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod19jcHVfY2FsbGJhY2tzID0geworICB7IGh3X2NwdV9pbml0X2FkZHJlc3MsIH0sIC8qIGluaXQgKi8KKyAgeyBOVUxMLCB9LCAvKiBhZGRyZXNzICovCisgIHsgTlVMTCwgfSwgLyogaW8gKi8KKyAgeyBOVUxMLCB9LCAvKiBETUEgKi8KKyAgeyBod19jcHVfaW50ZXJydXB0X2V2ZW50LCBOVUxMLCBod19jcHVfaW50ZXJydXB0X3BvcnRzIH0sIC8qIGludGVycnVwdHMgKi8KKyAgeyBOVUxMLCBOVUxMLCB9LAorfTsKKworY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgaHdfY3B1X2RldmljZV9kZXNjcmlwdG9yW10gPSB7CisgIHsgImh3LWNwdSIsIGh3X2NwdV9jcmVhdGUsICZod19jcHVfY2FsbGJhY2tzIH0sCisgIHsgImNwdSIsIGh3X2NwdV9jcmVhdGUsICZod19jcHVfY2FsbGJhY2tzIH0sCisgIHsgTlVMTCwgfSwKK307CisKKyNlbmRpZiAvKiBfSFdfQ1BVX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2h3X2NwdS5oIGIvc2ltL3BwYy9od19jcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWQwMjk4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9od19jcHUuaApAQCAtMCwwICsxLDM0IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIF9IV19DUFVfSF8KKyNkZWZpbmUgX0hXX0NQVV9IXworCitlbnVtIHsKKyAgaHdfY3B1X2hhcmRfcmVzZXQsCisgIGh3X2NwdV9zb2Z0X3Jlc2V0LAorICBod19jcHVfZXh0ZXJuYWxfaW50ZXJydXB0LAorICBod19jcHVfbWFjaGluZV9jaGVja19pbnRlcnJ1cHQsCisgIGh3X2NwdV9zeXN0ZW1fbWFuYWdlbWVudF9pbnRlcnJ1cHQsCisgIGh3X2NwdV9ucl9pbnRlcnJ1cHRfcG9ydHMKK307CisKKyNlbmRpZiAvKiBfSFdfQ1BVX0hfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2h3X2Rpc2suYyBiL3NpbS9wcGMvaHdfZGlzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzRmZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2h3X2Rpc2suYwpAQCAtMCwwICsxLDU1NyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisgICAgCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICAgIAorICAgICovCisKKworI2lmbmRlZiBfSFdfRElTS19DXworI2RlZmluZSBfSFdfRElTS19DXworCisjaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCisKKyNpbmNsdWRlICJway5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaWZuZGVmCVNFRUtfU0VUCisjZGVmaW5lCVNFRUtfU0VUIDAKKyNlbmRpZgorCisvKiBERVZJQ0UKKyAgIAorCisgICBjZHJvbSAtIHJlYWQtb25seSByZW1vdmFibGUgbWFzcyBzdG9yYWdlIGRldmljZQorCisgICBkaXNrIC0gbWFzcyBzdG9yYWdlIGRldmljZQorICAgCisgICBmbG9wcHkgLSByZW1vdmFibGUgbWFzcyBzdG9yYWdlIGRldmljZQorCisgICAKKyAgIERFU0NSSVBUSU9OCisgICAKKyAgIAorICAgTWFzcyBzdG9yYWdlIGRldmljZXMgc3VjaCBhcyBhIGhhcmQtZGlzayBvciBjZHJvbS1kcml2ZSBhcmUgbm90CisgICBub3JtYWxseSBkaXJlY3RseSBjb25uZWN0ZWQgdG8gdGhlIHByb2Nlc3Nvci4gIEluc3RlYWQsIHRoZXNlCisgICBkZXZpY2VzIGFyZSBhdHRhY2hlZCB0byBhIGxvZ2ljYWwgYnVzLCBzdWNoIGFzIFNDU0kgb3IgSURFLCBhbmQKKyAgIHRoZW4gYSBjb250cm9sbGVyIG9mIHRoYXQgYnVzIGlzIG1hZGUgYWNjZXNzaWJsZSB0byB0aGUgcHJvY2Vzc29yLgorICAgCisgICBSZWZsZWN0aW5nIHRoaXMsIHdpdGhpbiBhIGRldmljZSB0cmVlLCBtYXNzIHN0b3JhZ2UgZGV2aWNlcyBzdWNoIGFzCisgICBhIDw8Y2Ryb20+PiwgPDxkaXNrPj4gb3IgPDxmbG9wcHk+PiBhcmUgY3JlYXRlZCBhcyBjaGlsZHJlbiBvZiBvZiBhCisgICBsb2dpY2FsIGJ1cyBjb250cm9sbGVyIG5vZGUgKHN1Y2ggYXMgYSBTQ1NJIG9yIElERSBpbnRlcmZhY2UpLgorICAgVGhhdCBjb250cm9sbGVyLCBpbiB0dXJuLCB3b3VsZCBiZSBtYWRlIHRoZSBjaGlsZCBvZiBhIHBoeXNpY2FsIGJ1cworICAgbm9kZSB0aGF0IGlzIGRpcmVjdGx5IGFjY2Vzc2libGUgdG8gdGhlIHByb2Nlc3Nvci4KKyAgIAorICAgVGhlIGFib3ZlIG1hc3Mgc3RvcmFnZSBkZXZpY2VzIHByb3ZpZGUgdHdvIGludGVyZmFjZXMgLSBhIGxvZ2ljYWwKKyAgIGFuZCBhIHBoeXNpY2FsLgorICAgCisgICBBdCB0aGUgcGh5c2ljYWwgbGV2ZWwgdGhlIDw8ZGV2aWNlX2lvXy4uLj4+IGZ1bmN0aW9ucyBjYW4gYmUgdXNlZAorICAgcGVyZm9ybSByZWFkcyBhbmQgd3JpdGVzIG9mIHRoZSByYXcgbWVkaWEuICBUaGUgYWRkcmVzcyBiZWluZworICAgaW50ZXJwcmV0ZWQgYXMgYW4gb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBkaXNrLgorICAgCisgICBBdCB0aGUgbG9naWNhbCBsZXZlbCwgaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZQorICAgZGlzayB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBhbnkgb2YgdGhlIHBoeXNpY2FsIG1lZGlhLCBhIGRpc2sKKyAgIHBhcnRpdGlvbiwgb3IgZXZlbiBhIGZpbGUgd2l0aGluIGEgcGFydGl0aW9uLiAgVGhlIDw8ZGlzay1sYWJlbD4+CisgICBwYWNrYWdlLCB3aGljaCBpbXBsZW1lbnRzIHRoaXMgZnVuY3Rpb25hbGl0eSwgaXMgZGVzY3JpYmVkCisgICBlbHNld2hlcmUuICBCb3RoIHRoZSBPcGVuIEZpcm13YXJlIGFuZCBNb3RvIEJVRyByb20gZW11bGF0aW9ucworICAgc3VwcG9ydCB0aGlzIGludGVyZmFjZS4KKyAgIAorICAgQmxvY2sgZGV2aWNlcyBzdWNoIGFzIHRoZSA8PGZsb3BweT4+IGFuZCA8PGNkcm9tPj4gaGF2ZSByZW1vdmFibGUKKyAgIG1lZGlhLiAgQXQgdGhlIHByb2dyYW1tZXIgbGV2ZWwsIHRoZSBtZWRpYSBjYW4gYmUgY2hhbmdlZCB1c2luZyB0aGUKKyAgIDw8Y2hhbmdlX21lZGlhPj4gaW9jdGwuICBGcm9tIHdpdGhpbiBHREIsIGEgPDxjaGFuZ2UtbWVkaWE+PgorICAgb3BlcmF0aW9uIGNhbiBiZSBpbml0YXRlZCBieSB1c2luZyB0aGUgY29tbWFuZC4KKworICAgfAkoZ2RiKSAgc2ltIAorCisKKyAgIFBST1BFUlRJRVMKKyAgIAorICAgCisgICBmaWxlID0gPGZpbGUtbmFtZT4gIChyZXF1aXJlZCkKKworICAgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyBhbiBpbWFnZSBvZiB0aGUgZGlzay4gIEZvcgorICAgPDxkaXNrPj4gYW5kIDw8ZmxvcHB5Pj4gZGV2aWNlcywgdGhlIGltYWdlIHdpbGwgYmUgb3BlbmVkIGZvciBib3RoCisgICByZWFkaW5nIGFuZCB3cml0aW5nLiAgTXVsdGlwbGUgaW1hZ2UgZmlsZXMgbWF5IGJlIHNwZWNpZmllZCwgdGhlCisgICBzZWNvbmQgYW5kIGxhdGVyIGZpbGVzIGJlaW5nIG9wZW5lZCB3aGVuIDw8Y2hhbmdlLW1lZGlhPj4gKHdpdGggYQorICAgTlVMTCBmaWxlIG5hbWUpIGJlaW5nIHNwZWNpZmllZC4KKworICAgCisgICBibG9jay1zaXplID0gPG5yLWJ5dGVzPiAgKG9wdGlvbmFsKQorCisgICBUaGUgdmFsdWUgaXMgcmV0dXJuZWQgYnkgdGhlIGJsb2NrLXNpemUgbWV0aG9kLiAgVGhlIGRlZmF1bHQgdmFsdWUKKyAgIGlzIDUxMiBieXRlcy4KKworCisgICBtYXgtdHJhbnNmZXIgPSA8bnItYnl0ZXM+ICAob3B0aW9uYWwpCisKKyAgIFRoZSB2YWx1ZSBpcyByZXR1cm5lZCBieSB0aGUgbWF4LXRyYW5zZmVyIG1ldGhvZC4gVGhlIGRlZmF1bHQgdmFsdWUKKyAgIGlzIDUxMiBieXRlcy4KKworCisgICAjYmxvY2tzID0gPG5yLWJsb2Nrcz4gIChvcHRpb25hbCkKKworICAgVGhlIHZhbHVlIGlzIHJldHVybmVkIGJ5IHRoZSAjYmxvY2tzIG1ldGhvZC4gIElmIG5vIHZhbHVlIGlzCisgICBwcmVzZW50IHRoZW4gLTEgaXMgcmV0dXJuZWQuCisKKworICAgcmVhZC1vbmx5ID0gPGFueXRoaW5nPiAgKG9wdGlvbmFsKQorCisgICBJZiB0aGlzIHByb3BlcnR5IGlzIHByZXNlbnQsIHRoZSBkaXNrIGZpbGUgaW1hZ2UgaXMgYWx3YXlzIG9wZW5lZAorICAgcmVhZC1vbmx5LgorCisgICBFWEFNUExFUworICAgCisgICAKKyAgIEVuYWJsZSB0cmFjaW5nCisgICAKKyAgIHwgJCAgcHNpbSAtdCAnZGlzay1kZXZpY2UnIFwKKworICAgCisgICBBZGQgYSBDRFJPTSBhbmQgZGlzayB0byBhbiBJREUgYnVzLiAgU3BlY2lmeSB0aGUgaG9zdCBvcGVyYXRpbmcKKyAgIHN5c3RlbSdzIGNkIGRyaXZlIGFzIHRoZSBDRC1ST00gaW1hZ2UuCisgICAKKyAgIHwgICAgLW8gJy9wY2kvaWRlL2Rpc2tAMC9maWxlICJkaXNrLWltYWdlJyBcCisgICB8ICAgIC1vICcvcGNpL2lkZS9jZHJvbUAxL2ZpbGUgIi9kZXYvY2QwYScgXAorCisgICAKKyAgIEFzIHBhcnQgb2YgdGhlIGNvZGUgaW1wbGVtZW50aW5nIGEgbG9naWNhbCBidXMgZGV2aWNlIChmb3IgaW5zdGFuY2UKKyAgIHRoZSBJREUgY29udHJvbGxlciksIGxvY2F0ZSB0aGUgQ0RST00gZGV2aWNlIGFuZCB0aGVuIHJlYWQgYmxvY2sKKyAgIDQ3LgorICAgCisgICB8ICBkZXZpY2UgKmNkcm9tID0gZGV2aWNlX3RyZWVfZmluZF9kZXZpY2UobWUsICJjZHJvbSIpOworICAgfCAgY2hhciBibG9ja1s1MTJdOworICAgfCAgZGV2aWNlX2lvX3JlYWRfYnVmZmVyKGNkcm9tLCBidWYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgNDcgKiBzaXplb2YoYmxvY2spLCAvLyBzcGFjZSwgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihibG9jayksIE5VTEwsIDApOworICAgCisgICAKKyAgIFVzZSB0aGUgZGV2aWNlIGluc3RhbmNlIGludGVyZmFjZSB0byByZWFkIGJsb2NrIDQ3IG9mIHRoZSBmaWxlCisgICBjYWxsZWQgPDxuZXRic2QuZWxmPj4gb24gdGhlIGRpc2tzIGRlZmF1bHQgcGFydGl0aW9uLiAgU2ltaWxhciBjb2RlCisgICB3b3VsZCBiZSB1c2VkIGluIGFuIG9wZXJhdGluZyBzeXN0ZW1zIHByZS1ib290IGxvYWRlci4KKyAgIAorICAgfCAgZGV2aWNlX2luc3RhbmNlICpuZXRic2QgPQorICAgfCAgICBkZXZpY2VfY3JlYXRlX2luc3RhbmNlKHJvb3QsICIvcGNpL2lkZS9kaXNrOixcbmV0YnNkLmVsZiIpOworICAgfCAgY2hhciBibG9ja1s1MTJdOworICAgfCAgZGV2aWNlX2luc3RhbmNlX3NlZWsobmV0YnNkLCAgMCwgNDcgKiBzaXplb2YoYmxvY2spKTsKKyAgIHwgIGRldmljZV9pbnN0YW5jZV9yZWFkKG5ldGJzZCwgYmxvY2ssIHNpemVvZihibG9jaykpOworICAgCisgICAKKyAgIEJVR1MKKyAgIAorICAgCisgICBUaGUgYmxvY2sgZGV2aWNlIHNwZWNpZmljYXRpb24gaW5jbHVkZXMgbWVjaGFuaXNtcyBmb3IgZGV0ZXJtaW5pbmcKKyAgIHRoZSBwaHlzaWNhbCBkZXZpY2UgY2hhcmFjdGVyaXN0aWNzIC0gc3VjaCBhcyB0aGUgZGlza3Mgc2l6ZS4KKyAgIEN1cnJlbnRseSB0aGlzIG1lY2hhbmlzbSBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAKKyAgIFRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgZGV2aWNlIChpbiBwYXJ0aWN1bGFyIHRoZSBkZXZpY2UgaW5zdGFuY2UKKyAgIGludGVyZmFjZSkgZGVwZW5kcyBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgPDxkaXNrLWxhYmVsPj4gcGFja2FnZS4KKyAgIFRoYXQgcGFja2FnZSBtYXkgbm90IGJlIGZ1bGx5IGltcGxlbWVudGVkLgorCisgICBUaGUgZGlzayBkb2VzIG5vdCBrbm93IGl0cyBzaXplLiAgSGVuY2UgaXQgcmVsaWVzIG9uIHRoZSBmYWlsdXJlIG9mCisgICBmcmVhZCgpLCBmd3JpdGUoKSBhbmQgZnNlZWsoKSBjYWxscyB0byBkZXRlY3QgZXJyb3JzLgorCisgICBUaGUgZGlzayBzaXplIGlzIGxpbWl0ZWQgYnkgdGhlIGFkZHJlc3NhYmxlIHJhbmdlIGNvdmVyZWQgYnkKKyAgIHVuc2lnbmVkX3dvcmQgKGFkZHIpLiAgQW4gZXh0ZW5zaW9uIHdvdWxkIGJlIHRvIGluc3RlYWQgdXNlIHRoZQorICAgY29uY2F0ZW5hdGVkIHZhbHVlIHNwYWNlOmFkZHIuCisKKyAgIFRoZSBtZXRob2QgI2Jsb2NrcyBzaG91bGQgYHN0YXQnIHRoZSBkaXNrIHRvIGRldGVybWluZSB0aGUgbnVtYmVyCisgICBvZiBibG9ja3MgaWYgdGhlcmUgaXMgbm8gI2Jsb2NrcyBwcm9wZXJ0eS4KKworICAgSXQgd291bGQgYXBwZWFyIHRoYXQgT3BlbkZpcm13YXJlIGRvZXMgbm90IGRlZmluZSBhIGNsaWVudCBjYWxsIGZvcgorICAgY2hhbmdpbmcgKGVqZWN0aW5nKSB0aGUgbWVkaWEgb2YgYSBkZXZpY2UuCisKKyAgICovCisKK3R5cGVkZWYgc3RydWN0IF9od19kaXNrX2RldmljZSB7CisgIGludCBuYW1lX2luZGV4OworICBpbnQgbnJfbmFtZXM7CisgIGNoYXIgKm5hbWU7CisgIGludCByZWFkX29ubHk7CisgIC8qICB1bnNpZ25lZF93b3JkIHNpemU7ICovCisgIEZJTEUgKmltYWdlOworfSBod19kaXNrX2RldmljZTsKKwordHlwZWRlZiBzdHJ1Y3QgX2h3X2Rpc2tfaW5zdGFuY2UgeworICB1bnNpZ25lZF93b3JkIHBvczsKKyAgaHdfZGlza19kZXZpY2UgKmRpc2s7Cit9IGh3X2Rpc2tfaW5zdGFuY2U7CisKKworc3RhdGljIHZvaWQKK29wZW5fZGlza19pbWFnZShkZXZpY2UgKm1lLAorCQlod19kaXNrX2RldmljZSAqZGlzaywKKwkJY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgaWYgKGRpc2stPmltYWdlICE9IE5VTEwpCisgICAgZmNsb3NlKGRpc2stPmltYWdlKTsKKyAgaWYgKGRpc2stPm5hbWUgIT0gTlVMTCkKKyAgICB6ZnJlZShkaXNrLT5uYW1lKTsKKyAgZGlzay0+bmFtZSA9IHN0cmR1cChuYW1lKTsKKyAgZGlzay0+aW1hZ2UgPSBmb3BlbihkaXNrLT5uYW1lLCBkaXNrLT5yZWFkX29ubHkgPyAiciIgOiAicisiKTsKKyAgaWYgKGRpc2stPmltYWdlID09IE5VTEwpIHsKKyAgICBwZXJyb3IoZGV2aWNlX25hbWUobWUpKTsKKyAgICBkZXZpY2VfZXJyb3IobWUsICJvcGVuICVzIGZhaWxlZFxuIiwgZGlzay0+bmFtZSk7CisgIH0KKworICBEVFJBQ0UoZGlzaywgKCJpbWFnZSAlcyAoJXMpXG4iLAorICAgICAgICAgICAgICAgIGRpc2stPm5hbWUsCisgICAgICAgICAgICAgICAgKGRpc2stPnJlYWRfb25seSA/ICJyZWFkLW9ubHkiIDogInJlYWQtd3JpdGUiKSkpOworfQorCitzdGF0aWMgdm9pZAoraHdfZGlza19pbml0X2FkZHJlc3MoZGV2aWNlICptZSkKK3sKKyAgaHdfZGlza19kZXZpY2UgKmRpc2sgPSBkZXZpY2VfZGF0YShtZSk7CisgIHVuc2lnbmVkX3dvcmQgYWRkcmVzczsKKyAgaW50IHNwYWNlOworICBjb25zdCBjaGFyICpuYW1lOworCisgIC8qIGF0dGFjaCB0byB0aGUgcGFyZW50LiBTaW5jZSB0aGUgYnVzIGlzIGxvZ2ljYWwsIGF0dGFjaCB1c2luZyBqdXN0CisgICAgIHRoZSB1bml0LWFkZHJlc3MgKHNpemUgbXVzdCBiZSB6ZXJvKSAqLworICBkZXZpY2VfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyhkZXZpY2VfcGFyZW50KG1lKSwgZGV2aWNlX3VuaXRfYWRkcmVzcyhtZSksCisJCQkJICAgJnNwYWNlLCAmYWRkcmVzcywgbWUpOworICBkZXZpY2VfYXR0YWNoX2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksIGF0dGFjaF9jYWxsYmFjaywKKwkJCXNwYWNlLCBhZGRyZXNzLCAwLypzaXplKi8sIGFjY2Vzc19yZWFkX3dyaXRlX2V4ZWMsCisJCQltZSk7CisKKyAgLyogZ2V0IHRoZSBuYW1lIG9mIHRoZSBmaWxlIHNwZWNpZnlpbmcgdGhlIGRpc2sgaW1hZ2UgKi8KKyAgZGlzay0+bmFtZV9pbmRleCA9IDA7CisgIGRpc2stPm5yX25hbWVzID0gZGV2aWNlX2ZpbmRfc3RyaW5nX2FycmF5X3Byb3BlcnR5KG1lLCAiZmlsZSIsCisJCQkJCQkgICAgIGRpc2stPm5hbWVfaW5kZXgsICZuYW1lKTsKKyAgaWYgKCFkaXNrLT5ucl9uYW1lcykKKyAgICBkZXZpY2VfZXJyb3IobWUsICJpbnZhbGlkIGZpbGUgcHJvcGVydHkiKTsKKworICAvKiBpcyBpdCBhIFJPIGRldmljZT8gKi8KKyAgZGlzay0+cmVhZF9vbmx5ID0KKyAgICAoc3RyY21wKGRldmljZV9uYW1lKG1lKSwgImRpc2siKSAhPSAwCisgICAgICYmIHN0cmNtcChkZXZpY2VfbmFtZShtZSksICJmbG9wcHkiKSAhPSAwCisgICAgICYmIGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAicmVhZC1vbmx5IikgPT0gTlVMTCk7CisKKyAgLyogbm93IG9wZW4gaXQgKi8KKyAgb3Blbl9kaXNrX2ltYWdlKG1lLCBkaXNrLCBuYW1lKTsKK30KKworc3RhdGljIGludAoraHdfZGlza19pb2N0bChkZXZpY2UgKm1lLAorCSAgICAgIGNwdSAqcHJvY2Vzc29yLAorCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhLAorCSAgICAgIGRldmljZV9pb2N0bF9yZXF1ZXN0IHJlcXVlc3QsCisJICAgICAgdmFfbGlzdCBhcCkKK3sKKyAgc3dpdGNoIChyZXF1ZXN0KSB7CisgIGNhc2UgZGV2aWNlX2lvY3RsX2NoYW5nZV9tZWRpYToKKyAgICB7CisgICAgICBod19kaXNrX2RldmljZSAqZGlzayA9IGRldmljZV9kYXRhKG1lKTsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSB2YV9hcmcoYXAsIGNvbnN0IGNoYXIgKik7CisgICAgICBpZiAobmFtZSAhPSBOVUxMKSB7CisJZGlzay0+bmFtZV9pbmRleCA9IC0xOworICAgICAgfQorICAgICAgZWxzZSB7CisJZGlzay0+bmFtZV9pbmRleCA9IChkaXNrLT5uYW1lX2luZGV4ICsgMSkgJSBkaXNrLT5ucl9uYW1lczsKKwlpZiAoIWRldmljZV9maW5kX3N0cmluZ19hcnJheV9wcm9wZXJ0eShtZSwgImZpbGUiLAorCQkJCQkgICAgICAgZGlzay0+bmFtZV9pbmRleCwgJm5hbWUpKQorCSAgZGV2aWNlX2Vycm9yKG1lLCAiaW52YWxpZCBmaWxlIHByb3BlcnR5Iik7CisgICAgICB9CisgICAgICBvcGVuX2Rpc2tfaW1hZ2UobWUsIGRpc2ssIG5hbWUpOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBkZXZpY2VfZXJyb3IobWUsICJpbnN1cHBvcnRlZCBpb2N0bCByZXF1ZXN0Iik7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworCisKKworc3RhdGljIHVuc2lnbmVkCitod19kaXNrX2lvX3JlYWRfYnVmZmVyKGRldmljZSAqbWUsCisJCSAgICAgICB2b2lkICpkZXN0LAorCQkgICAgICAgaW50IHNwYWNlLAorCQkgICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAorCQkgICAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCisJCSAgICAgICBjcHUgKnByb2Nlc3NvciwKKwkJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBod19kaXNrX2RldmljZSAqZGlzayA9IGRldmljZV9kYXRhKG1lKTsKKyAgdW5zaWduZWQgbnJfYnl0ZXNfcmVhZDsKKyAgaWYgKHNwYWNlICE9IDApCisgICAgZGV2aWNlX2Vycm9yKG1lLCAicmVhZCAtIGV4dGVuZGVkIGRpc2sgYWRkcmVzc2luZyB1bmltcGxlbWVudGVkIik7CisgIGlmIChucl9ieXRlcyA9PSAwKQorICAgIG5yX2J5dGVzX3JlYWQgPSAwOworICBlbHNlIGlmIChmc2VlayhkaXNrLT5pbWFnZSwgYWRkciwgU0VFS19TRVQpIDwgMCkKKyAgICBucl9ieXRlc19yZWFkID0gMDsKKyAgZWxzZSBpZiAoZnJlYWQoZGVzdCwgbnJfYnl0ZXMsIDEsIGRpc2stPmltYWdlKSAhPSAxKQorICAgIG5yX2J5dGVzX3JlYWQgPSAwOworICBlbHNlCisgICAgbnJfYnl0ZXNfcmVhZCA9IG5yX2J5dGVzOworICBEVFJBQ0UoZGlzaywgKCJpby1yZWFkIC0gYWRkcmVzcyAweCVseCwgbnItYnl0ZXMtcmVhZCAlZCwgcmVxdWVzdGVkICVkXG4iLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBhZGRyLCAoaW50KW5yX2J5dGVzX3JlYWQsIChpbnQpbnJfYnl0ZXMpKTsKKyAgcmV0dXJuIG5yX2J5dGVzX3JlYWQ7Cit9CisKKworc3RhdGljIHVuc2lnbmVkCitod19kaXNrX2lvX3dyaXRlX2J1ZmZlcihkZXZpY2UgKm1lLAorCQkJY29uc3Qgdm9pZCAqc291cmNlLAorCQkJaW50IHNwYWNlLAorCQkJdW5zaWduZWRfd29yZCBhZGRyLAorCQkJdW5zaWduZWQgbnJfYnl0ZXMsCisJCQljcHUgKnByb2Nlc3NvciwKKwkJCXVuc2lnbmVkX3dvcmQgY2lhKQoreworICBod19kaXNrX2RldmljZSAqZGlzayA9IGRldmljZV9kYXRhKG1lKTsKKyAgdW5zaWduZWQgbnJfYnl0ZXNfd3JpdHRlbjsKKyAgaWYgKHNwYWNlICE9IDApCisgICAgZGV2aWNlX2Vycm9yKG1lLCAid3JpdGUgLSBleHRlbmRlZCBkaXNrIGFkZHJlc3NpbmcgdW5pbXBsZW1lbnRlZCIpOworICBpZiAoZGlzay0+cmVhZF9vbmx5KQorICAgIG5yX2J5dGVzX3dyaXR0ZW4gPSAwOworICBlbHNlIGlmIChucl9ieXRlcyA9PSAwKQorICAgIG5yX2J5dGVzX3dyaXR0ZW4gPSAwOworICBlbHNlIGlmIChmc2VlayhkaXNrLT5pbWFnZSwgYWRkciwgU0VFS19TRVQpIDwgMCkKKyAgICBucl9ieXRlc193cml0dGVuID0gMDsKKyAgZWxzZSBpZiAoZndyaXRlKHNvdXJjZSwgbnJfYnl0ZXMsIDEsIGRpc2stPmltYWdlKSAhPSAxKQorICAgIG5yX2J5dGVzX3dyaXR0ZW4gPSAwOworICBlbHNlCisgICAgbnJfYnl0ZXNfd3JpdHRlbiA9IG5yX2J5dGVzOworICBEVFJBQ0UoZGlzaywgKCJpby13cml0ZSAtIGFkZHJlc3MgMHglbHgsIG5yLWJ5dGVzLXdyaXR0ZW4gJWQsIHJlcXVlc3RlZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgYWRkciwgKGludClucl9ieXRlc193cml0dGVuLCAoaW50KW5yX2J5dGVzKSk7CisgIHJldHVybiBucl9ieXRlc193cml0dGVuOworfQorCisKKy8qIGluc3RhbmNlcyBvZiB0aGUgaHdfZGlzayBkZXZpY2UgKi8KKworc3RhdGljIHZvaWQKK2h3X2Rpc2tfaW5zdGFuY2VfZGVsZXRlKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UpCit7CisgIGh3X2Rpc2tfaW5zdGFuY2UgKmRhdGEgPSBkZXZpY2VfaW5zdGFuY2VfZGF0YShpbnN0YW5jZSk7CisgIERJVFJBQ0UoZGlzaywgKCJkZWxldGUgLSBpbnN0YW5jZT0lbGRcbiIsCisJCSAodW5zaWduZWQgbG9uZylkZXZpY2VfaW5zdGFuY2VfdG9fZXh0ZXJuYWwoaW5zdGFuY2UpKSk7CisgIHpmcmVlKGRhdGEpOworfQorCitzdGF0aWMgaW50Citod19kaXNrX2luc3RhbmNlX3JlYWQoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKKwkJICAgICAgdm9pZCAqYnVmLAorCQkgICAgICB1bnNpZ25lZF93b3JkIGxlbikKK3sKKyAgaHdfZGlza19pbnN0YW5jZSAqZGF0YSA9IGRldmljZV9pbnN0YW5jZV9kYXRhKGluc3RhbmNlKTsKKyAgRElUUkFDRShkaXNrLCAoInJlYWQgLSBpbnN0YW5jZT0lbGQgbGVuPSVsZFxuIiwKKwkJICh1bnNpZ25lZCBsb25nKWRldmljZV9pbnN0YW5jZV90b19leHRlcm5hbChpbnN0YW5jZSksCisJCSAobG9uZylsZW4pKTsKKyAgaWYgKChkYXRhLT5wb3MgKyBsZW4pIDwgZGF0YS0+cG9zKQorICAgIHJldHVybiAtMTsgLyogb3ZlcmZsb3cgKi8KKyAgaWYgKGZzZWVrKGRhdGEtPmRpc2stPmltYWdlLCBkYXRhLT5wb3MsIFNFRUtfU0VUKSA8IDApCisgICAgcmV0dXJuIC0xOworICBpZiAoZnJlYWQoYnVmLCBsZW4sIDEsIGRhdGEtPmRpc2stPmltYWdlKSAhPSAxKQorICAgIHJldHVybiAtMTsKKyAgZGF0YS0+cG9zID0gZnRlbGwoZGF0YS0+ZGlzay0+aW1hZ2UpOworICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50Citod19kaXNrX2luc3RhbmNlX3dyaXRlKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCisJCSAgICAgICBjb25zdCB2b2lkICpidWYsCisJCSAgICAgICB1bnNpZ25lZF93b3JkIGxlbikKK3sKKyAgaHdfZGlza19pbnN0YW5jZSAqZGF0YSA9IGRldmljZV9pbnN0YW5jZV9kYXRhKGluc3RhbmNlKTsKKyAgRElUUkFDRShkaXNrLCAoIndyaXRlIC0gaW5zdGFuY2U9JWxkIGxlbj0lbGRcbiIsCisJCSAodW5zaWduZWQgbG9uZylkZXZpY2VfaW5zdGFuY2VfdG9fZXh0ZXJuYWwoaW5zdGFuY2UpLAorCQkgKGxvbmcpbGVuKSk7CisgIGlmICgoZGF0YS0+cG9zICsgbGVuKSA8IGRhdGEtPnBvcykKKyAgICByZXR1cm4gLTE7IC8qIG92ZXJmbG93ICovCisgIGlmIChkYXRhLT5kaXNrLT5yZWFkX29ubHkpCisgICAgcmV0dXJuIC0xOworICBpZiAoZnNlZWsoZGF0YS0+ZGlzay0+aW1hZ2UsIGRhdGEtPnBvcywgU0VFS19TRVQpIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIGlmIChmd3JpdGUoYnVmLCBsZW4sIDEsIGRhdGEtPmRpc2stPmltYWdlKSAhPSAxKQorICAgIHJldHVybiAtMTsKKyAgZGF0YS0+cG9zID0gZnRlbGwoZGF0YS0+ZGlzay0+aW1hZ2UpOworICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50Citod19kaXNrX2luc3RhbmNlX3NlZWsoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKKwkJICAgICAgdW5zaWduZWRfd29yZCBwb3NfaGksCisJCSAgICAgIHVuc2lnbmVkX3dvcmQgcG9zX2xvKQoreworICBod19kaXNrX2luc3RhbmNlICpkYXRhID0gZGV2aWNlX2luc3RhbmNlX2RhdGEoaW5zdGFuY2UpOworICBpZiAocG9zX2hpICE9IDApCisgICAgZGV2aWNlX2Vycm9yKGRldmljZV9pbnN0YW5jZV9kZXZpY2UoaW5zdGFuY2UpLAorCQkgInNlZWsgLSBleHRlbmRlZCBhZGRyZXNzaW5nIHVuaW1wbGVtZW50ZWQiKTsKKyAgRElUUkFDRShkaXNrLCAoInNlZWsgLSBpbnN0YW5jZT0lbGQgcG9zX2hpPSVsZCBwb3NfbG89JWxkXG4iLAorCQkgKHVuc2lnbmVkIGxvbmcpZGV2aWNlX2luc3RhbmNlX3RvX2V4dGVybmFsKGluc3RhbmNlKSwKKwkJIChsb25nKXBvc19oaSwgKGxvbmcpcG9zX2xvKSk7CisgIGRhdGEtPnBvcyA9IHBvc19sbzsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2h3X2Rpc2tfbWF4X3RyYW5zZmVyKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCisJCSAgICAgaW50IG5fc3RhY2tfYXJncywKKwkJICAgICB1bnNpZ25lZDMyIHN0YWNrX2FyZ3NbLypuX3N0YWNrX2FyZ3MqL10sCisJCSAgICAgaW50IG5fc3RhY2tfcmV0dXJucywKKwkJICAgICB1bnNpZ25lZDMyIHN0YWNrX3JldHVybnNbLypuX3N0YWNrX3JldHVybnMqL10pCit7CisgIGRldmljZSAqbWUgPSBkZXZpY2VfaW5zdGFuY2VfZGV2aWNlKGluc3RhbmNlKTsKKyAgaWYgKChuX3N0YWNrX2FyZ3MgIT0gMCkKKyAgICAgIHx8IChuX3N0YWNrX3JldHVybnMgIT0gMSkpIHsKKyAgICBkZXZpY2VfZXJyb3IobWUsICJJbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgbWF4LXRyYW5zZmVyIG1ldGhvZFxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGVsc2UgeworICAgIHVuc2lnbmVkX2NlbGwgbWF4X3RyYW5zZmVyOworICAgIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgIm1heC10cmFuc2ZlciIpKQorICAgICAgbWF4X3RyYW5zZmVyID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgIm1heC10cmFuc2ZlciIpOworICAgIGVsc2UKKyAgICAgIG1heF90cmFuc2ZlciA9IDUxMjsKKyAgICBESVRSQUNFKGRpc2ssICgibWF4LXRyYW5zZmVyIC0gaW5zdGFuY2U9JWxkIG1heC10cmFuc2Zlcj0lbGRcbiIsCisJCSAgICh1bnNpZ25lZCBsb25nKWRldmljZV9pbnN0YW5jZV90b19leHRlcm5hbChpbnN0YW5jZSksCisJCSAgIChsb25nIGludCltYXhfdHJhbnNmZXIpKTsKKyAgICBzdGFja19yZXR1cm5zWzBdID0gbWF4X3RyYW5zZmVyOworICAgIHJldHVybiAwOworICB9Cit9CisKK3N0YXRpYyBpbnQKK2h3X2Rpc2tfYmxvY2tfc2l6ZShkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAorCQkgICBpbnQgbl9zdGFja19hcmdzLAorCQkgICB1bnNpZ25lZDMyIHN0YWNrX2FyZ3NbLypuX3N0YWNrX2FyZ3MqL10sCisJCSAgIGludCBuX3N0YWNrX3JldHVybnMsCisJCSAgIHVuc2lnbmVkMzIgc3RhY2tfcmV0dXJuc1svKm5fc3RhY2tfcmV0dXJucyovXSkKK3sKKyAgZGV2aWNlICptZSA9IGRldmljZV9pbnN0YW5jZV9kZXZpY2UoaW5zdGFuY2UpOworICBpZiAoKG5fc3RhY2tfYXJncyAhPSAwKQorICAgICAgfHwgKG5fc3RhY2tfcmV0dXJucyAhPSAxKSkgeworICAgIGRldmljZV9lcnJvcihtZSwgIkluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBibG9jay1zaXplIG1ldGhvZFxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGVsc2UgeworICAgIHVuc2lnbmVkX2NlbGwgYmxvY2tfc2l6ZTsKKyAgICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJibG9jay1zaXplIikpCisgICAgICBibG9ja19zaXplID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgImJsb2NrLXNpemUiKTsKKyAgICBlbHNlCisgICAgICBibG9ja19zaXplID0gNTEyOworICAgIERJVFJBQ0UoZGlzaywgKCJibG9jay1zaXplIC0gaW5zdGFuY2U9JWxkIGJsb2NrLXNpemU9JWxkXG4iLAorCQkgICAodW5zaWduZWQgbG9uZylkZXZpY2VfaW5zdGFuY2VfdG9fZXh0ZXJuYWwoaW5zdGFuY2UpLAorCQkgICAobG9uZyBpbnQpYmxvY2tfc2l6ZSkpOworICAgIHN0YWNrX3JldHVybnNbMF0gPSBibG9ja19zaXplOworICAgIHJldHVybiAwOworICB9Cit9CisKK3N0YXRpYyBpbnQKK2h3X2Rpc2tfbnJfYmxvY2tzKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCisJCSAgaW50IG5fc3RhY2tfYXJncywKKwkJICB1bnNpZ25lZDMyIHN0YWNrX2FyZ3NbLypuX3N0YWNrX2FyZ3MqL10sCisJCSAgaW50IG5fc3RhY2tfcmV0dXJucywKKwkJICB1bnNpZ25lZDMyIHN0YWNrX3JldHVybnNbLypuX3N0YWNrX3JldHVybnMqL10pCit7CisgIGRldmljZSAqbWUgPSBkZXZpY2VfaW5zdGFuY2VfZGV2aWNlKGluc3RhbmNlKTsKKyAgaWYgKChuX3N0YWNrX2FyZ3MgIT0gMCkKKyAgICAgIHx8IChuX3N0YWNrX3JldHVybnMgIT0gMSkpIHsKKyAgICBkZXZpY2VfZXJyb3IobWUsICJJbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgYmxvY2stc2l6ZSBtZXRob2RcbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBlbHNlIHsKKyAgICB1bnNpZ25lZF93b3JkIG5yX2Jsb2NrczsKKyAgICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICIjYmxvY2tzIikpCisgICAgICBucl9ibG9ja3MgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAiI2Jsb2NrcyIpOworICAgIGVsc2UKKyAgICAgIG5yX2Jsb2NrcyA9IC0xOworICAgIERJVFJBQ0UoZGlzaywgKCIjYmxvY2tzIC0gaW5zdGFuY2U9JWxkICNibG9ja3M9JWxkXG4iLAorCQkgICAodW5zaWduZWQgbG9uZylkZXZpY2VfaW5zdGFuY2VfdG9fZXh0ZXJuYWwoaW5zdGFuY2UpLAorCQkgICAobG9uZyBpbnQpbnJfYmxvY2tzKSk7CisgICAgc3RhY2tfcmV0dXJuc1swXSA9IG5yX2Jsb2NrczsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCitzdGF0aWMgZGV2aWNlX2luc3RhbmNlX21ldGhvZHMgaHdfZGlza19pbnN0YW5jZV9tZXRob2RzW10gPSB7CisgIHsgIm1heC10cmFuc2ZlciIsIGh3X2Rpc2tfbWF4X3RyYW5zZmVyIH0sCisgIHsgImJsb2NrLXNpemUiLCBod19kaXNrX2Jsb2NrX3NpemUgfSwKKyAgeyAiI2Jsb2NrcyIsIGh3X2Rpc2tfbnJfYmxvY2tzIH0sCisgIHsgTlVMTCwgfSwKK307CisKK3N0YXRpYyBjb25zdCBkZXZpY2VfaW5zdGFuY2VfY2FsbGJhY2tzIGh3X2Rpc2tfaW5zdGFuY2VfY2FsbGJhY2tzID0geworICBod19kaXNrX2luc3RhbmNlX2RlbGV0ZSwKKyAgaHdfZGlza19pbnN0YW5jZV9yZWFkLAorICBod19kaXNrX2luc3RhbmNlX3dyaXRlLAorICBod19kaXNrX2luc3RhbmNlX3NlZWssCisgIGh3X2Rpc2tfaW5zdGFuY2VfbWV0aG9kcywKK307CisKK3N0YXRpYyBkZXZpY2VfaW5zdGFuY2UgKgoraHdfZGlza19jcmVhdGVfaW5zdGFuY2UoZGV2aWNlICptZSwKKwkJCWNvbnN0IGNoYXIgKnBhdGgsCisJCQljb25zdCBjaGFyICphcmdzKQoreworICBkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlOworICBod19kaXNrX2RldmljZSAqZGlzayA9IGRldmljZV9kYXRhKG1lKTsKKyAgaHdfZGlza19pbnN0YW5jZSAqZGF0YSA9IFpBTExPQyhod19kaXNrX2luc3RhbmNlKTsKKyAgZGF0YS0+ZGlzayA9IGRpc2s7CisgIGRhdGEtPnBvcyA9IDA7CisgIGluc3RhbmNlID0gZGV2aWNlX2NyZWF0ZV9pbnN0YW5jZV9mcm9tKG1lLCBOVUxMLAorCQkJCQkgZGF0YSwKKwkJCQkJIHBhdGgsIGFyZ3MsCisJCQkJCSAmaHdfZGlza19pbnN0YW5jZV9jYWxsYmFja3MpOworICBESVRSQUNFKGRpc2ssICgiY3JlYXRlIC0gcGF0aD0lcyglcykgaW5zdGFuY2U9JWxkXG4iLAorCQkgcGF0aCwgYXJncywKKwkJICh1bnNpZ25lZCBsb25nKWRldmljZV9pbnN0YW5jZV90b19leHRlcm5hbChpbnN0YW5jZSkpKTsKKyAgcmV0dXJuIHBrX2Rpc2tsYWJlbF9jcmVhdGVfaW5zdGFuY2UoaW5zdGFuY2UsIGFyZ3MpOworfQorCitzdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod19kaXNrX2NhbGxiYWNrcyA9IHsKKyAgeyBod19kaXNrX2luaXRfYWRkcmVzcywgTlVMTCB9LAorICB7IE5VTEwsIH0sIC8qIGFkZHJlc3MgKi8KKyAgeyBod19kaXNrX2lvX3JlYWRfYnVmZmVyLAorICAgICAgaHdfZGlza19pb193cml0ZV9idWZmZXIsIH0sCisgIHsgTlVMTCwgfSwgLyogRE1BICovCisgIHsgTlVMTCwgfSwgLyogaW50ZXJydXB0ICovCisgIHsgTlVMTCwgfSwgLyogdW5pdCAqLworICBod19kaXNrX2NyZWF0ZV9pbnN0YW5jZSwKKyAgaHdfZGlza19pb2N0bCwKK307CisKKworc3RhdGljIHZvaWQgKgoraHdfZGlza19jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKKwkgICAgICAgY29uc3QgZGV2aWNlX3VuaXQgKnVuaXRfYWRkcmVzcywKKwkgICAgICAgY29uc3QgY2hhciAqYXJncykKK3sKKyAgLyogY3JlYXRlIHRoZSBkZXNjcmlwdG9yICovCisgIGh3X2Rpc2tfZGV2aWNlICpod19kaXNrID0gWkFMTE9DKGh3X2Rpc2tfZGV2aWNlKTsKKyAgcmV0dXJuIGh3X2Rpc2s7Cit9CisKKworY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgaHdfZGlza19kZXZpY2VfZGVzY3JpcHRvcltdID0geworICB7ICJkaXNrIiwgaHdfZGlza19jcmVhdGUsICZod19kaXNrX2NhbGxiYWNrcyB9LAorICB7ICJjZHJvbSIsIGh3X2Rpc2tfY3JlYXRlLCAmaHdfZGlza19jYWxsYmFja3MgfSwKKyAgeyAiZmxvcHB5IiwgaHdfZGlza19jcmVhdGUsICZod19kaXNrX2NhbGxiYWNrcyB9LAorICB7IE5VTEwgfSwKK307CisKKyNlbmRpZiAvKiBfSFdfRElTS19DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9od19lZXByb20uYyBiL3NpbS9wcGMvaHdfZWVwcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5Mjk4NAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvaHdfZWVwcm9tLmMKQEAgLTAsMCArMSw4MzkgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgX0hXX0VFUFJPTV9DXworI2RlZmluZSBfSFdfRUVQUk9NX0NfCisKKyNpbmNsdWRlICJkZXZpY2VfdGFibGUuaCIKKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorCisKKy8qIERFVklDRQorCisKKyAgIGVlcHJvbSAtIEpFREVDPyBjb21wYXRpYmxlIGVsZWN0cmljYWx5IGVyYXNhYmxlIHByb2dyYW1hYmxlIGRldmljZQorCisKKyAgIERFU0NSSVBUSU9OCisKKworICAgVGhpcyBkZXZpY2UgaW1wbGVtZW50cyBhIHNtYWxsIGJ5dGUgYWRkcmVzc2FibGUgRUVQUk9NLgorICAgUHJvZ3JhbW1pbmcgaXMgcGVyZm9ybWVkIHVzaW5nIHRoZSBzYW1lIHdyaXRlIHNlcXVlbmNlcyBhcyB1c2VkIGJ5CisgICBzdGFuZGFyZCBtb2Rlcm4gRUVQUk9NIGNvbXBvbmVudHMuICBXcml0ZXMgb2NjdXJlIGluIHJlYWwgdGltZSwgdGhlCisgICBkZXZpY2UgcmV0dXJuaW5nIGEgcHJvZ3Jlc3MgdmFsdWUgdW50aWwgdGhlIHByb2dyYW1pbmcgaGFzIGJlZW4KKyAgIGNvbXBsZXRlZC4KKworICAgSXQgaXMgYmFzZWQgb24gdGhlIEFNRCAyOUYwNDAgY29tcG9uZW50LgorCisKKyAgIFBST1BFUlRJRVMKKworCisgICByZWcgPSA8YWRkcmVzcz4gPHNpemU+IChyZXF1aXJlZCkKKworICAgRGV0ZXJtaW5lIHdoZXJlIHRoZSBkZXZpY2UgbGl2ZXMgaW4gdGhlIHBhcmVudHMgYWRkcmVzcyBzcGFjZS4KKworCisgICBuci1zZWN0b3JzID0gPGludGVnZXI+IChyZXF1aXJlZCkKKworICAgV2hlbiBlcmFzaW5nIGFuIGVudGlyZSBzZWN0b3IgaXMgY2xlYXJlZCBhdCBhIHRpbWUuICBUaGlzIHNwZWNpZmllcworICAgdGhlIG51bWJlciBvZiBzZWN0b3JzIGluIHRoZSBFRVBST00gY29tcG9uZW50LgorCisKKyAgIHNlY3Rvci1zaXplID0gPGludGVnZXI+IChyZXF1aXJlZCkKKworICAgVGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHNlY3Rvci4gIFdoZW4gZXJhc2luZywgbWVtb3J5IGNodW5rcyBvZgorICAgdGhpcyBzaXplIGFyZSBjbGVhcmVkLgorCisgICBOT1RFOiBUaGUgcHJvZHVjdCBuci1zZWN0b3JzICogc2VjdG9yLXNpemUgZG9lcyBub3QgbmVlZCB0byBtYXAgdGhlCisgICBzaXplIHNwZWNpZmllZCBpbiB0aGUgcmVnIHByb3BlcnR5LiAgSWYgdGhlIHNwZWNpZmllZCBzaXplIGlzCisgICBzbWFsbGVyIHBhcnQgb2YgdGhlIGVlcHJvbSB3aWxsIG5vdCBiZSBhY2Nlc3NpYmxlIHdoaWxlIGlmIGl0IGlzCisgICBsYXJnZXIgdGhlIGFkZHJlc3NlcyB3aWxsIHdyYXAuCisKKworICAgYnl0ZS13cml0ZS1kZWxheSA9IDxpbnRlZ2VyPiAocmVxdWlyZWQpCisKKyAgIE51bWJlciBvZiBjbG9jayB0aWNrcyBiZWZvcmUgdGhlIHByb2dyYW1taW5nIG9mIGEgc2luZ2xlIGJ5dGUKKyAgIGNvbXBsZXRlcy4KKworCisgICBzZWN0b3Itc3RhcnQtZGVsYXkgPSA8aW50ZWdlcj4gKHJlcXVpcmVkKQorCisgICBXaGVuIGVyYXNpbmcgc2VjdG9ycywgdGhlIG51bWJlciBvZiBjbG9jayB0aWNrcyBhZnRlciB0aGUgc2VjdG9yCisgICBoYXMgYmVlbiBzcGVjaWZpZWQgdGhhdCB0aGUgYWN0dWFsIGVyYXNlIHByb2Nlc3MgY29tbWVuY2VzLgorCisKKyAgIGVyYXNlLWRlbGF5ID0gPGludGdlcj4gKHJlcXVpcmVkKQorCisgICBOdW1iZXIgb2YgY2xvY2sgdGlja3MgYmVmb3JlIGFuIGVyYXNlIHByb2dyYW0gY29tcGxldGVzCisKKworICAgbWFudWZhY3R1cmUtY29kZSA9IDxpbnRlZ2VyPiAocmVxdWlyZWQpCisKKyAgIFRoZSBvbmUgYnl0ZSB2YWx1ZSByZXR1cm5lZCB3aGVuIHRoZSBhdXRvLXNlbGVjdCBtYW51ZmFjdHVyZXIgY29kZQorICAgaXMgcmVhZC4KKworCisgICBkZXZpY2UtY29kZSA9IDxpbnRlZ2VyPiAocmVxdWlyZWQpCisKKyAgIFRoZSBvbmUgYnl0ZSB2YWx1ZSByZXR1cm5lZCB3aGVuIHRoZSBhdXRvLXNlbGVjdCBkZXZpY2UgY29kZSBpcworICAgcmVhZC4KKworCisgICBpbnB1dC1maWxlID0gPGZpbGUtbmFtZT4gKG9wdGlvbmFsKQorCisgICBJbml0aWFsaXplIHRoZSBlZXByb20gdXNpbmcgdGhlIHNwZWNpZmllZCBiaW5hcnkgZmlsZS4KKworCisgICBvdXRwdXQtZmlsZSA9IDxmaWxlLW5hbWU+IChvcHRpb25hbCkKKworICAgV2hlbiBldmVyIHRoZSBlZXByb20gaXMgdXBkYXRlZCwgc2F2ZSB0aGUgbW9kaWZpZWQgaW1hZ2UgaW50byB0aGUKKyAgIHNwZWNpZmllZCBmaWxlLgorCisKKyAgIEVYQU1QTEVTCisKKworICAgRW5hYmxlIHRyYWNpbmcgb2YgdGhlIGVlcHJvbToKKworICAgfCAgYmFzaCQgcHNpbSAtdCBlZXByb20tZGV2aWNlIFwKKworCisgICBDb25maWd1cmUgc29tZXRoaW5nIHZlcnkgbGlrZSB0aGUgQW1kIEFtMjlGMDQwIC0gNTEyYnl0ZSBFRVBST00KKyAgIChidXQgYSBiaXQgZmFzdGVyKToKKworICAgfCAgLW8gJy9lZXByb21AMHhmZmYwMDAwMC9yZWcgMHhmZmYwMDAwMCAweDgwMDAwJyBcCisgICB8ICAtbyAnL2VlcHJvbUAweGZmZjAwMDAwL25yLXNlY3RvcnMgOCcgXAorICAgfCAgLW8gJy9lZXByb21AMHhmZmYwMDAwMC9zZWN0b3Itc2l6ZSAweDEwMDAwJyBcCisgICB8ICAtbyAnL2VlcHJvbUAweGZmZjAwMDAwL2J5dGUtd3JpdGUtZGVsYXkgMTAwMCcgXAorICAgfCAgLW8gJy9lZXByb21AMHhmZmYwMDAwMC9zZWN0b3Itc3RhcnQtZGVsYXkgMTAwJyBcCisgICB8ICAtbyAnL2VlcHJvbUAweGZmZjAwMDAwL2VyYXNlLWRlbGF5IDEwMDAnIFwKKyAgIHwgIC1vICcvZWVwcm9tQDB4ZmZmMDAwMDAvbWFudWZhY3R1cmUtY29kZSAweDAxJyBcCisgICB8ICAtbyAnL2VlcHJvbUAweGZmZjAwMDAwL2RldmljZS1jb2RlIDB4YTQnIFwKKworCisgICBJbml0aWFsaXplIHRoZSBlZXByb20gZnJvbSB0aGUgZmlsZSA8PC9kZXYvemVybz4+OgorCisgICB8ICAtbyAnL2VlcHJvbUAweGZmZjAwMDAwL2lucHV0LWZpbGUgL2Rldi96ZXJvJworCisKKyAgIEJVR1MKKworCisgICAqLworCit0eXBlZGVmIGVudW0geworICByZWFkX3Jlc2V0LAorICB3cml0ZV9ucl8yLAorICB3cml0ZV9ucl8zLAorICB3cml0ZV9ucl80LAorICB3cml0ZV9ucl81LAorICB3cml0ZV9ucl82LAorICBieXRlX3Byb2dyYW0sCisgIGJ5dGVfcHJvZ3JhbW1pbmcsCisgIGNoaXBfZXJhc2UsCisgIHNlY3Rvcl9lcmFzZSwKKyAgc2VjdG9yX2VyYXNlX3N1c3BlbmQsCisgIGF1dG9zZWxlY3QsCit9IGh3X2VlcHJvbV9zdGF0ZXM7CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK3N0YXRlMmEoaHdfZWVwcm9tX3N0YXRlcyBzdGF0ZSkKK3sKKyAgc3dpdGNoIChzdGF0ZSkgeworICBjYXNlIHJlYWRfcmVzZXQ6IHJldHVybiAicmVhZF9yZXNldCI7CisgIGNhc2Ugd3JpdGVfbnJfMjogcmV0dXJuICJ3cml0ZV9ucl8yIjsKKyAgY2FzZSB3cml0ZV9ucl8zOiByZXR1cm4gIndyaXRlX25yXzMiOworICBjYXNlIHdyaXRlX25yXzQ6IHJldHVybiAid3JpdGVfbnJfNCI7CisgIGNhc2Ugd3JpdGVfbnJfNTogcmV0dXJuICJ3cml0ZV9ucl81IjsKKyAgY2FzZSB3cml0ZV9ucl82OiByZXR1cm4gIndyaXRlX25yXzYiOworICBjYXNlIGJ5dGVfcHJvZ3JhbTogcmV0dXJuICJieXRlX3Byb2dyYW0iOworICBjYXNlIGJ5dGVfcHJvZ3JhbW1pbmc6IHJldHVybiAiYnl0ZV9wcm9ncmFtbWluZyI7CisgIGNhc2UgY2hpcF9lcmFzZTogcmV0dXJuICJjaGlwX2VyYXNlIjsKKyAgY2FzZSBzZWN0b3JfZXJhc2U6IHJldHVybiAic2VjdG9yX2VyYXNlIjsKKyAgY2FzZSBzZWN0b3JfZXJhc2Vfc3VzcGVuZDogcmV0dXJuICJzZWN0b3JfZXJhc2Vfc3VzcGVuZCI7CisgIGNhc2UgYXV0b3NlbGVjdDogcmV0dXJuICJhdXRvc2VsZWN0IjsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgX2h3X2VlcHJvbV9kZXZpY2UgeworICAvKiBnZW5lcmFsICovCisgIGh3X2VlcHJvbV9zdGF0ZXMgc3RhdGU7CisgIHVuc2lnbmVkOCAqbWVtb3J5OworICB1bnNpZ25lZCBzaXplb2ZfbWVtb3J5OworICB1bnNpZ25lZCBlcmFzZV9kZWxheTsKKyAgc2lnbmVkNjQgcHJvZ3JhbV9zdGFydF90aW1lOworICBzaWduZWQ2NCBwcm9ncmFtX2ZpbmlzaF90aW1lOworICB1bnNpZ25lZDggbWFudWZhY3R1cmVfY29kZTsKKyAgdW5zaWduZWQ4IGRldmljZV9jb2RlOworICB1bnNpZ25lZDggdG9nZ2xlX2JpdDsKKyAgLyogaW5pdGlhbGl6YXRpb24gKi8KKyAgY29uc3QgY2hhciAqaW5wdXRfZmlsZV9uYW1lOworICBjb25zdCBjaGFyICpvdXRwdXRfZmlsZV9uYW1lOworICAvKiBmb3Igc2VjdG9yIGFuZCBzZWN0b3IgcHJvZ3JhbW1pbmcgKi8KKyAgaHdfZWVwcm9tX3N0YXRlcyBzZWN0b3Jfc3RhdGU7CisgIHVuc2lnbmVkOCAqc2VjdG9yczsKKyAgdW5zaWduZWQgbnJfc2VjdG9yczsKKyAgdW5zaWduZWQgc2l6ZW9mX3NlY3RvcjsKKyAgdW5zaWduZWQgc2VjdG9yX3N0YXJ0X2RlbGF5OworICB1bnNpZ25lZCBzZWN0b3Jfc3RhcnRfdGltZTsKKyAgLyogYnl0ZSBhbmQgYnl0ZSBwcm9ncmFtbWluZyAqLworICB1bnNpZ25lZCBieXRlX3dyaXRlX2RlbGF5OworICB1bnNpZ25lZF93b3JkIGJ5dGVfcHJvZ3JhbV9hZGRyZXNzOworICB1bnNpZ25lZDggYnl0ZV9wcm9ncmFtX2J5dGU7Cit9IGh3X2VlcHJvbV9kZXZpY2U7CisKK3R5cGVkZWYgc3RydWN0IF9od19lZXByb21fcmVnX3NwZWMgeworICB1bnNpZ25lZDMyIGJhc2U7CisgIHVuc2lnbmVkMzIgc2l6ZTsKK30gaHdfZWVwcm9tX3JlZ19zcGVjOworCitzdGF0aWMgdm9pZAoraHdfZWVwcm9tX2luaXRfZGF0YShkZXZpY2UgKm1lKQoreworICBod19lZXByb21fZGV2aWNlICplZXByb20gPSAoaHdfZWVwcm9tX2RldmljZSopZGV2aWNlX2RhdGEobWUpOworCisgIC8qIGhhdmUgd2UgYW55IGlucHV0IG9yIG91dHB1dCBmaWxlcyAqLworICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJpbnB1dC1maWxlIikgIT0gTlVMTCkKKyAgICBlZXByb20tPmlucHV0X2ZpbGVfbmFtZSA9IGRldmljZV9maW5kX3N0cmluZ19wcm9wZXJ0eShtZSwgImlucHV0LWZpbGUiKTsKKyAgaWYgKGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAib3V0cHV0LWZpbGUiKSAhPSBOVUxMKQorICAgIGVlcHJvbS0+aW5wdXRfZmlsZV9uYW1lID0gZGV2aWNlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5KG1lLCAib3V0cHV0LWZpbGUiKTsKKworICAvKiBmaWd1cmUgb3V0IHRoZSBzZWN0b3JzIGluIHRoZSBlZXByb20gKi8KKyAgaWYgKGVlcHJvbS0+c2VjdG9ycyA9PSBOVUxMKSB7CisgICAgZWVwcm9tLT5ucl9zZWN0b3JzID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgIm5yLXNlY3RvcnMiKTsKKyAgICBlZXByb20tPnNpemVvZl9zZWN0b3IgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAic2VjdG9yLXNpemUiKTsKKyAgICBlZXByb20tPnNlY3RvcnMgPSB6YWxsb2MoZWVwcm9tLT5ucl9zZWN0b3JzKTsKKyAgfQorICBlbHNlCisgICAgbWVtc2V0KGVlcHJvbS0+c2VjdG9ycywgMCwgZWVwcm9tLT5ucl9zZWN0b3JzKTsKKworICAvKiBpbml0aWFsaXplIHRoZSBlZXByb20gKi8KKyAgaWYgKGVlcHJvbS0+bWVtb3J5ID09IE5VTEwpIHsKKyAgICBlZXByb20tPnNpemVvZl9tZW1vcnkgPSBlZXByb20tPnNpemVvZl9zZWN0b3IgKiBlZXByb20tPm5yX3NlY3RvcnM7CisgICAgZWVwcm9tLT5tZW1vcnkgPSB6YWxsb2MoZWVwcm9tLT5zaXplb2ZfbWVtb3J5KTsKKyAgfQorICBlbHNlCisgICAgbWVtc2V0KGVlcHJvbS0+bWVtb3J5LCAwLCBlZXByb20tPnNpemVvZl9tZW1vcnkpOworICBpZiAoZWVwcm9tLT5pbnB1dF9maWxlX25hbWUgIT0gTlVMTCkgeworICAgIGludCBpOworICAgIEZJTEUgKmlucHV0X2ZpbGUgPSBmb3BlbihlZXByb20tPmlucHV0X2ZpbGVfbmFtZSwgInIiKTsKKyAgICBpZiAoaW5wdXRfZmlsZSA9PSBOVUxMKSB7CisgICAgICBwZXJyb3IoImVlcHJvbSIpOworICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiRmFpbGVkIHRvIG9wZW4gaW5wdXQgZmlsZSAlc1xuIiwgZWVwcm9tLT5pbnB1dF9maWxlX25hbWUpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgZWVwcm9tLT5zaXplb2ZfbWVtb3J5OyBpKyspIHsKKyAgICAgIGlmIChmcmVhZCgmZWVwcm9tLT5tZW1vcnlbaV0sIDEsIDEsIGlucHV0X2ZpbGUpICE9IDEpCisJYnJlYWs7CisgICAgfQorICAgIGZjbG9zZShpbnB1dF9maWxlKTsKKyAgfQorCisgIC8qIHRpbWluZyAqLworICBlZXByb20tPmJ5dGVfd3JpdGVfZGVsYXkgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAiYnl0ZS13cml0ZS1kZWxheSIpOworICBlZXByb20tPnNlY3Rvcl9zdGFydF9kZWxheSA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJzZWN0b3Itc3RhcnQtZGVsYXkiKTsKKyAgZWVwcm9tLT5lcmFzZV9kZWxheSA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJlcmFzZS1kZWxheSIpOworCisgIC8qIG1pc2MgKi8KKyAgZWVwcm9tLT5tYW51ZmFjdHVyZV9jb2RlID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgIm1hbnVmYWN0dXJlLWNvZGUiKTsKKyAgZWVwcm9tLT5kZXZpY2VfY29kZSA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJkZXZpY2UtY29kZSIpOworfQorCisKK3N0YXRpYyB2b2lkCitpbnZhbGlkX3JlYWQoZGV2aWNlICptZSwKKwkgICAgIGh3X2VlcHJvbV9zdGF0ZXMgc3RhdGUsCisJICAgICB1bnNpZ25lZF93b3JkIGFkZHJlc3MsCisJICAgICBjb25zdCBjaGFyICpyZWFzb24pCit7CisgIERUUkFDRShlZXByb20sICgiSW52YWxpZCByZWFkIHRvIDB4JWx4IHdoaWxlIGluIHN0YXRlICVzICglcylcbiIsCisJCSAgKHVuc2lnbmVkIGxvbmcpYWRkcmVzcywKKwkJICBzdGF0ZTJhKHN0YXRlKSwKKwkJICByZWFzb24pKTsKK30KKworc3RhdGljIHZvaWQKK2ludmFsaWRfd3JpdGUoZGV2aWNlICptZSwKKwkgICAgICBod19lZXByb21fc3RhdGVzIHN0YXRlLAorCSAgICAgIHVuc2lnbmVkX3dvcmQgYWRkcmVzcywKKwkgICAgICB1bnNpZ25lZDggZGF0YSwKKwkgICAgICBjb25zdCBjaGFyICpyZWFzb24pCit7CisgIERUUkFDRShlZXByb20sICgiSW52YWxpZCB3cml0ZSBvZiAweCVseCB0byAweCVseCB3aGlsZSBpbiBzdGF0ZSAlcyAoJXMpXG4iLAorCQkgICh1bnNpZ25lZCBsb25nKWRhdGEsCisJCSAgKHVuc2lnbmVkIGxvbmcpYWRkcmVzcywKKwkJICBzdGF0ZTJhKHN0YXRlKSwKKwkJICByZWFzb24pKTsKK30KKworc3RhdGljIHZvaWQKK2R1bXBfZWVwcm9tKGRldmljZSAqbWUsCisJICAgIGh3X2VlcHJvbV9kZXZpY2UgKmVlcHJvbSkKK3sKKyAgaWYgKGVlcHJvbS0+b3V0cHV0X2ZpbGVfbmFtZSAhPSBOVUxMKSB7CisgICAgaW50IGk7CisgICAgRklMRSAqb3V0cHV0X2ZpbGUgPSBmb3BlbihlZXByb20tPm91dHB1dF9maWxlX25hbWUsICJ3Iik7CisgICAgaWYgKG91dHB1dF9maWxlID09IE5VTEwpIHsKKyAgICAgIHBlcnJvcigiZWVwcm9tIik7CisgICAgICBkZXZpY2VfZXJyb3IobWUsICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiwKKwkJICAgZWVwcm9tLT5vdXRwdXRfZmlsZV9uYW1lKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGVlcHJvbS0+c2l6ZW9mX21lbW9yeTsgaSsrKSB7CisgICAgICBpZiAoZndyaXRlKCZlZXByb20tPm1lbW9yeVtpXSwgMSwgMSwgb3V0cHV0X2ZpbGUpICE9IDEpCisJYnJlYWs7CisgICAgfQorICAgIGZjbG9zZShvdXRwdXRfZmlsZSk7CisgIH0KK30KKworCisvKiBwcm9ncmFtIGEgc2luZ2xlIGJ5dGUgb2YgZWVwcm9tICovCisKK3N0YXRpYyB2b2lkCitzdGFydF9wcm9ncmFtbWluZ19ieXRlKGRldmljZSAqbWUsCisJCSAgICAgICBod19lZXByb21fZGV2aWNlICplZXByb20sCisJCSAgICAgICB1bnNpZ25lZF93b3JkIGFkZHJlc3MsCisJCSAgICAgICB1bnNpZ25lZDggbmV3X2J5dGUpCit7CisgIHVuc2lnbmVkOCBvbGRfYnl0ZSA9IGVlcHJvbS0+bWVtb3J5W2FkZHJlc3NdOworICBEVFJBQ0UoZWVwcm9tLCAoInN0YXJ0LXByb2dyYW1pbmctYnl0ZSAtIGFkZHJlc3MgMHglbHgsIG5ldyAweCVseCwgb2xkIDB4JWx4XG4iLAorCQkgICh1bnNpZ25lZCBsb25nKWFkZHJlc3MsCisJCSAgKHVuc2lnbmVkIGxvbmcpbmV3X2J5dGUsCisJCSAgKHVuc2lnbmVkIGxvbmcpb2xkX2J5dGUpKTsKKyAgZWVwcm9tLT5ieXRlX3Byb2dyYW1fYWRkcmVzcyA9IGFkZHJlc3M7CisgIC8qIDogb2xkIG5ldyA6IH5vbGQgOiBuZXcmfm9sZAorICAgICA6ICAwICAgMCAgOiAgIDEgIDogICAgMAorICAgICA6ICAwICAgMSAgOiAgIDEgIDogICAgMSAgICAgLS0gY2FuIG5vdCBzZXQgYSBiaXQKKyAgICAgOiAgMSAgIDAgIDogICAwICA6ICAgIDAKKyAgICAgOiAgMSAgIDEgIDogICAwICA6ICAgIDAgKi8KKyAgaWYgKH5vbGRfYnl0ZSAmIG5ld19ieXRlKQorICAgIGludmFsaWRfd3JpdGUobWUsIGVlcHJvbS0+c3RhdGUsIGFkZHJlc3MsIG5ld19ieXRlLCAic2V0dGluZyBjbGVhcmVkIGJpdCIpOworICAvKiA6IG9sZCBuZXcgOiBvbGQmbmV3CisgICAgIDogIDAgICAwICA6ICAgIDAKKyAgICAgOiAgMCAgIDEgIDogICAgMAorICAgICA6ICAxICAgMCAgOiAgICAwCisgICAgIDogIDEgICAxICA6ICAgIDEgKi8KKyAgZWVwcm9tLT5ieXRlX3Byb2dyYW1fYnl0ZSA9IG5ld19ieXRlICYgb2xkX2J5dGU7CisgIGVlcHJvbS0+bWVtb3J5W2FkZHJlc3NdID0gfm5ld19ieXRlICYgfjB4MjQ7IC8qIExFLWJpdHMgNTozIHplcm8gKi8KKyAgZWVwcm9tLT5wcm9ncmFtX3N0YXJ0X3RpbWUgPSBkZXZpY2VfZXZlbnRfcXVldWVfdGltZShtZSk7CisgIGVlcHJvbS0+cHJvZ3JhbV9maW5pc2hfdGltZSA9IChlZXByb20tPnByb2dyYW1fc3RhcnRfdGltZQorCQkJCSArIGVlcHJvbS0+Ynl0ZV93cml0ZV9kZWxheSk7Cit9CisKK3N0YXRpYyB2b2lkCitmaW5pc2hfcHJvZ3JhbW1pbmdfYnl0ZShkZXZpY2UgKm1lLAorCQkJaHdfZWVwcm9tX2RldmljZSAqZWVwcm9tKQoreworICBEVFJBQ0UoZWVwcm9tLCAoImZpbmlzaC1wcm9ncmFtbWluZy1ieXRlIC0gYWRkcmVzcyAweCVseCwgYnl0ZSAweCVseFxuIiwKKwkJICAodW5zaWduZWQgbG9uZyllZXByb20tPmJ5dGVfcHJvZ3JhbV9hZGRyZXNzLAorCQkgICh1bnNpZ25lZCBsb25nKWVlcHJvbS0+Ynl0ZV9wcm9ncmFtX2J5dGUpKTsKKyAgZWVwcm9tLT5tZW1vcnlbZWVwcm9tLT5ieXRlX3Byb2dyYW1fYWRkcmVzc10gPSBlZXByb20tPmJ5dGVfcHJvZ3JhbV9ieXRlOworICBkdW1wX2VlcHJvbShtZSwgZWVwcm9tKTsKK30KKworCisvKiBlcmFzZSB0aGUgZWVwcm9tIGNvbXBsZXRseSAqLworCitzdGF0aWMgdm9pZAorc3RhcnRfZXJhc2luZ19jaGlwKGRldmljZSAqbWUsCisJCSAgIGh3X2VlcHJvbV9kZXZpY2UgKmVlcHJvbSkKK3sKKyAgRFRSQUNFKGVlcHJvbSwgKCJzdGFydC1lcmFzaW5nLWNoaXBcbiIpKTsKKyAgbWVtc2V0KGVlcHJvbS0+bWVtb3J5LCAwLCBlZXByb20tPnNpemVvZl9tZW1vcnkpOworICBlZXByb20tPnByb2dyYW1fc3RhcnRfdGltZSA9IGRldmljZV9ldmVudF9xdWV1ZV90aW1lKG1lKTsKKyAgZWVwcm9tLT5wcm9ncmFtX2ZpbmlzaF90aW1lID0gKGVlcHJvbS0+cHJvZ3JhbV9zdGFydF90aW1lCisJCQkJICsgZWVwcm9tLT5lcmFzZV9kZWxheSk7Cit9CisKK3N0YXRpYyB2b2lkCitmaW5pc2hfZXJhc2luZ19jaGlwKGRldmljZSAqbWUsCisJCSAgICBod19lZXByb21fZGV2aWNlICplZXByb20pCit7CisgIERUUkFDRShlZXByb20sICgiZmluaXNoLWVyYXNpbmctY2hpcFxuIikpOworICBtZW1zZXQoZWVwcm9tLT5tZW1vcnksIDB4ZmYsIGVlcHJvbS0+c2l6ZW9mX21lbW9yeSk7CisgIGR1bXBfZWVwcm9tKG1lLCBlZXByb20pOworfQorCisKKy8qIGVyYXNlIGEgc2luZ2xlIHNlY3RvciBvZiB0aGUgZWVwcm9tICovCisKK3N0YXRpYyB2b2lkCitzdGFydF9lcmFzaW5nX3NlY3RvcihkZXZpY2UgKm1lLAorCQkgICAgIGh3X2VlcHJvbV9kZXZpY2UgKmVlcHJvbSwKKwkJICAgICB1bnNpZ25lZF93b3JkIGFkZHJlc3MpCit7CisgIGludCBzZWN0b3IgPSBhZGRyZXNzIC8gZWVwcm9tLT5zaXplb2Zfc2VjdG9yOworICBEVFJBQ0UoZWVwcm9tLCAoInN0YXJ0LWVyYXNpbmctc2VjdG9yIC0gYWRkcmVzcyAweCVseCwgc2VjdG9yICVkXG4iLAorCQkgICh1bnNpZ25lZCBsb25nKWFkZHJlc3MsIHNlY3RvcikpOworICBBU1NFUlQoc2VjdG9yIDwgZWVwcm9tLT5ucl9zZWN0b3JzKTsKKyAgZWVwcm9tLT5zZWN0b3JzW3NlY3Rvcl0gPSAxOworICBtZW1zZXQoZWVwcm9tLT5tZW1vcnkgKyBzZWN0b3IgKiBlZXByb20tPnNpemVvZl9zZWN0b3IsCisJIDB4NCwgZWVwcm9tLT5zaXplb2Zfc2VjdG9yKTsKKyAgZWVwcm9tLT5wcm9ncmFtX3N0YXJ0X3RpbWUgPSBkZXZpY2VfZXZlbnRfcXVldWVfdGltZShtZSk7CisgIGVlcHJvbS0+c2VjdG9yX3N0YXJ0X3RpbWUgPSAoZWVwcm9tLT5wcm9ncmFtX3N0YXJ0X3RpbWUKKwkJCSAgICAgICArIGVlcHJvbS0+c2VjdG9yX3N0YXJ0X2RlbGF5KTsKKyAgZWVwcm9tLT5wcm9ncmFtX2ZpbmlzaF90aW1lID0gKGVlcHJvbS0+c2VjdG9yX3N0YXJ0X3RpbWUKKwkJCQkgKyBlZXByb20tPmVyYXNlX2RlbGF5KTsKKworfQorCitzdGF0aWMgdm9pZAorZmluaXNoX2VyYXNpbmdfc2VjdG9yKGRldmljZSAqbWUsCisJCSAgICAgIGh3X2VlcHJvbV9kZXZpY2UgKmVlcHJvbSkKK3sKKyAgaW50IHNlY3RvcjsKKyAgRFRSQUNFKGVlcHJvbSwgKCJmaW5pc2gtZXJhc2luZy1zZWN0b3JcbiIpKTsKKyAgZm9yIChzZWN0b3IgPSAwOyBzZWN0b3IgPCBlZXByb20tPm5yX3NlY3RvcnM7IHNlY3RvcisrKSB7CisgICAgaWYgKGVlcHJvbS0+c2VjdG9yc1tzZWN0b3JdKSB7CisgICAgICBlZXByb20tPnNlY3RvcnNbc2VjdG9yXSA9IDA7CisgICAgICBtZW1zZXQoZWVwcm9tLT5tZW1vcnkgKyBzZWN0b3IgKiBlZXByb20tPnNpemVvZl9zZWN0b3IsCisJICAgICAweGZmLCBlZXByb20tPnNpemVvZl9zZWN0b3IpOworICAgIH0KKyAgfQorICBkdW1wX2VlcHJvbShtZSwgZWVwcm9tKTsKK30KKworCisvKiBlZXByb20gcmVhZHMgKi8KKworc3RhdGljIHVuc2lnbmVkOAordG9nZ2xlKGh3X2VlcHJvbV9kZXZpY2UgKmVlcHJvbSwKKyAgICAgICB1bnNpZ25lZDggYnl0ZSkKK3sKKyAgZWVwcm9tLT50b2dnbGVfYml0ID0gZWVwcm9tLT50b2dnbGVfYml0IF4gMHg0MDsgLyogbGUtYml0IDYgKi8KKyAgcmV0dXJuIGVlcHJvbS0+dG9nZ2xlX2JpdCBeIGJ5dGU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZDgKK3JlYWRfYnl0ZShkZXZpY2UgKm1lLAorCSAgaHdfZWVwcm9tX2RldmljZSAqZWVwcm9tLAorCSAgdW5zaWduZWRfd29yZCBhZGRyZXNzKQoreworICAvKiBtYXkgbmVlZCBtdWx0aXBsZSBpdGVyYXRpb25zIG9mIHRoaXMgKi8KKyAgd2hpbGUgKDEpIHsKKyAgICBzd2l0Y2ggKGVlcHJvbS0+c3RhdGUpIHsKKworICAgIGNhc2UgcmVhZF9yZXNldDoKKyAgICAgIHJldHVybiBlZXByb20tPm1lbW9yeVthZGRyZXNzXTsKKworICAgIGNhc2UgYXV0b3NlbGVjdDoKKyAgICAgIGlmICgoYWRkcmVzcyAmIDB4ZmYpID09IDB4MDApCisJcmV0dXJuIGVlcHJvbS0+bWFudWZhY3R1cmVfY29kZTsKKyAgICAgIGVsc2UgaWYgKChhZGRyZXNzICYgMHhmZikgPT0gMHgwMSkKKwlyZXR1cm4gZWVwcm9tLT5kZXZpY2VfY29kZTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gMDsgLyogbm90IGNlcnRhaW4gYWJvdXQgdGhpcyAqLworCisgICAgY2FzZSBieXRlX3Byb2dyYW1taW5nOgorICAgICAgaWYgKGRldmljZV9ldmVudF9xdWV1ZV90aW1lKG1lKSA+IGVlcHJvbS0+cHJvZ3JhbV9maW5pc2hfdGltZSkgeworCWZpbmlzaF9wcm9ncmFtbWluZ19ieXRlKG1lLCBlZXByb20pOworCWVlcHJvbS0+c3RhdGUgPSByZWFkX3Jlc2V0OworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgZWxzZSBpZiAoYWRkcmVzcyA9PSBlZXByb20tPmJ5dGVfcHJvZ3JhbV9hZGRyZXNzKSB7CisJcmV0dXJuIHRvZ2dsZShlZXByb20sIGVlcHJvbS0+bWVtb3J5W2FkZHJlc3NdKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworCS8qIHRyYXNoIHRoYXQgbWVtb3J5IGxvY2F0aW9uICovCisJaW52YWxpZF9yZWFkKG1lLCBlZXByb20tPnN0YXRlLCBhZGRyZXNzLCAibm90IGJ5dGUgcHJvZ3JhbSBhZGRyZXNzIik7CisJZWVwcm9tLT5tZW1vcnlbYWRkcmVzc10gPSAoZWVwcm9tLT5tZW1vcnlbYWRkcmVzc10KKwkJCQkgICAmIGVlcHJvbS0+Ynl0ZV9wcm9ncmFtX2J5dGUpOworCXJldHVybiB0b2dnbGUoZWVwcm9tLCBlZXByb20tPm1lbW9yeVtlZXByb20tPmJ5dGVfcHJvZ3JhbV9hZGRyZXNzXSk7CisgICAgICB9CisKKyAgICBjYXNlIGNoaXBfZXJhc2U6CisgICAgICBpZiAoZGV2aWNlX2V2ZW50X3F1ZXVlX3RpbWUobWUpID4gZWVwcm9tLT5wcm9ncmFtX2ZpbmlzaF90aW1lKSB7CisJZmluaXNoX2VyYXNpbmdfY2hpcChtZSwgZWVwcm9tKTsKKwllZXByb20tPnN0YXRlID0gcmVhZF9yZXNldDsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworCXJldHVybiB0b2dnbGUoZWVwcm9tLCBlZXByb20tPm1lbW9yeVthZGRyZXNzXSk7CisgICAgICB9CisKKyAgICBjYXNlIHNlY3Rvcl9lcmFzZToKKyAgICAgIGlmIChkZXZpY2VfZXZlbnRfcXVldWVfdGltZShtZSkgPiBlZXByb20tPnByb2dyYW1fZmluaXNoX3RpbWUpIHsKKwlmaW5pc2hfZXJhc2luZ19zZWN0b3IobWUsIGVlcHJvbSk7CisJZWVwcm9tLT5zdGF0ZSA9IHJlYWRfcmVzZXQ7CisJY29udGludWU7CisgICAgICB9CisgICAgICBlbHNlIGlmICghZWVwcm9tLT5zZWN0b3JzW2FkZHJlc3MgLyBlZXByb20tPnNpemVvZl9zZWN0b3JdKSB7CisJLyogcmVhZCB0byB3cm9uZyBzZWN0b3IgKi8KKwlpbnZhbGlkX3JlYWQobWUsIGVlcHJvbS0+c3RhdGUsIGFkZHJlc3MsICJzZWN0b3Igbm90IGJlaW5nIGVyYXNlZCIpOworCXJldHVybiB0b2dnbGUoZWVwcm9tLCBlZXByb20tPm1lbW9yeVthZGRyZXNzXSkgJiB+MHg4OworICAgICAgfQorICAgICAgZWxzZSBpZiAoZGV2aWNlX2V2ZW50X3F1ZXVlX3RpbWUobWUpID4gZWVwcm9tLT5zZWN0b3Jfc3RhcnRfdGltZSkgeworCXJldHVybiB0b2dnbGUoZWVwcm9tLCBlZXByb20tPm1lbW9yeVthZGRyZXNzXSkgfCAweDg7CisgICAgICB9CisgICAgICBlbHNlIHsKKwlyZXR1cm4gdG9nZ2xlKGVlcHJvbSwgZWVwcm9tLT5tZW1vcnlbYWRkcmVzc10pICYgfjB4ODsKKyAgICAgIH0KKworICAgIGNhc2Ugc2VjdG9yX2VyYXNlX3N1c3BlbmQ6CisgICAgICBpZiAoIWVlcHJvbS0+c2VjdG9yc1thZGRyZXNzIC8gZWVwcm9tLT5zaXplb2Zfc2VjdG9yXSkgeworCXJldHVybiBlZXByb20tPm1lbW9yeVthZGRyZXNzXTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworCWludmFsaWRfcmVhZChtZSwgZWVwcm9tLT5zdGF0ZSwgYWRkcmVzcywgInNlY3RvciBiZWluZyBlcmFzZWQiKTsKKwlyZXR1cm4gZWVwcm9tLT5tZW1vcnlbYWRkcmVzc107CisgICAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgaW52YWxpZF9yZWFkKG1lLCBlZXByb20tPnN0YXRlLCBhZGRyZXNzLCAiaW52YWxpZCBzdGF0ZSIpOworICAgICAgcmV0dXJuIGVlcHJvbS0+bWVtb3J5W2FkZHJlc3NdOworCisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCQkgICAgICAgCitzdGF0aWMgdW5zaWduZWQKK2h3X2VlcHJvbV9pb19yZWFkX2J1ZmZlcihkZXZpY2UgKm1lLAorCQkJIHZvaWQgKmRlc3QsCisJCQkgaW50IHNwYWNlLAorCQkJIHVuc2lnbmVkX3dvcmQgYWRkciwKKwkJCSB1bnNpZ25lZCBucl9ieXRlcywKKwkJCSBjcHUgKnByb2Nlc3NvciwKKwkJCSB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgaHdfZWVwcm9tX2RldmljZSAqZWVwcm9tID0gKGh3X2VlcHJvbV9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBucl9ieXRlczsgaSsrKSB7CisgICAgdW5zaWduZWRfd29yZCBhZGRyZXNzID0gKGFkZHIgKyBpKSAlIGVlcHJvbS0+c2l6ZW9mX21lbW9yeTsKKyAgICB1bnNpZ25lZDggYnl0ZSA9IHJlYWRfYnl0ZShtZSwgZWVwcm9tLCBhZGRyZXNzKTsKKyAgICAoKHVuc2lnbmVkOCopZGVzdClbaV0gPSBieXRlOworICB9CisgIHJldHVybiBucl9ieXRlczsKK30KKworCisvKiBlZXByb20gd3JpdGVzICovCisKK3N0YXRpYyB2b2lkCit3cml0ZV9ieXRlKGRldmljZSAqbWUsCisJICAgaHdfZWVwcm9tX2RldmljZSAqZWVwcm9tLAorCSAgIHVuc2lnbmVkX3dvcmQgYWRkcmVzcywKKwkgICB1bnNpZ25lZDggZGF0YSkKK3sKKyAgLyogbWF5IG5lZWQgbXVsdGlwbGUgdHJhbnNpdGlvbnMgdG8gcHJvY2VzcyBhIHdyaXRlICovCisgIHdoaWxlICgxKSB7CisgICAgc3dpdGNoIChlZXByb20tPnN0YXRlKSB7CisKKyAgICBjYXNlIHJlYWRfcmVzZXQ6CisgICAgICBpZiAoYWRkcmVzcyA9PSAweDU1NTUgJiYgZGF0YSA9PSAweGFhKQorCWVlcHJvbS0+c3RhdGUgPSB3cml0ZV9ucl8yOworICAgICAgZWxzZSBpZiAoZGF0YSA9PSAweGYwKQorCWVlcHJvbS0+c3RhdGUgPSByZWFkX3Jlc2V0OworICAgICAgZWxzZSB7CisJaW52YWxpZF93cml0ZShtZSwgZWVwcm9tLT5zdGF0ZSwgYWRkcmVzcywgZGF0YSwgInVuZXhwZWN0ZWQiKTsKKwllZXByb20tPnN0YXRlID0gcmVhZF9yZXNldDsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKworICAgIGNhc2Ugd3JpdGVfbnJfMjoKKyAgICAgIGlmIChhZGRyZXNzID09IDB4MmFhYSAmJiBkYXRhID09IDB4NTUpCisJZWVwcm9tLT5zdGF0ZSA9IHdyaXRlX25yXzM7CisgICAgICBlbHNlIHsKKwlpbnZhbGlkX3dyaXRlKG1lLCBlZXByb20tPnN0YXRlLCBhZGRyZXNzLCBkYXRhLCAidW5leHBlY3RlZCIpOworCWVlcHJvbS0+c3RhdGUgPSByZWFkX3Jlc2V0OworICAgICAgfQorICAgICAgcmV0dXJuOworCisgICAgY2FzZSB3cml0ZV9ucl8zOgorICAgICAgaWYgKGFkZHJlc3MgPT0gMHg1NTU1ICYmIGRhdGEgPT0gMHhmMCkKKwllZXByb20tPnN0YXRlID0gcmVhZF9yZXNldDsKKyAgICAgIGVsc2UgaWYgKGFkZHJlc3MgPT0gMHg1NTU1ICYmIGRhdGEgPT0gMHg5MCkKKwllZXByb20tPnN0YXRlID0gYXV0b3NlbGVjdDsKKyAgICAgIGVsc2UgaWYgKGFkZHJlc3MgPT0gMHg1NTU1ICYmIGRhdGEgPT0gMHhhMCkgeworCWVlcHJvbS0+c3RhdGUgPSBieXRlX3Byb2dyYW07CisgICAgICB9CisgICAgICBlbHNlIGlmIChhZGRyZXNzID09IDB4NTU1NSAmJiBkYXRhID09IDB4ODApCisJZWVwcm9tLT5zdGF0ZSA9IHdyaXRlX25yXzQ7CisgICAgICBlbHNlIHsKKwlpbnZhbGlkX3dyaXRlKG1lLCBlZXByb20tPnN0YXRlLCBhZGRyZXNzLCBkYXRhLCAidW5leHBlY3RlZCIpOworCWVlcHJvbS0+c3RhdGUgPSByZWFkX3Jlc2V0OworICAgICAgfQorICAgICAgcmV0dXJuOworCisgICAgY2FzZSB3cml0ZV9ucl80OgorICAgICAgaWYgKGFkZHJlc3MgPT0gMHg1NTU1ICYmIGRhdGEgPT0gMHhhYSkKKwllZXByb20tPnN0YXRlID0gd3JpdGVfbnJfNTsKKyAgICAgIGVsc2UgeworCWludmFsaWRfd3JpdGUobWUsIGVlcHJvbS0+c3RhdGUsIGFkZHJlc3MsIGRhdGEsICJ1bmV4cGVjdGVkIik7CisJZWVwcm9tLT5zdGF0ZSA9IHJlYWRfcmVzZXQ7CisgICAgICB9CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIHdyaXRlX25yXzU6CisgICAgICBpZiAoYWRkcmVzcyA9PSAweDJhYWEgJiYgZGF0YSA9PSAweDU1KQorCWVlcHJvbS0+c3RhdGUgPSB3cml0ZV9ucl82OworICAgICAgZWxzZSB7CisJaW52YWxpZF93cml0ZShtZSwgZWVwcm9tLT5zdGF0ZSwgYWRkcmVzcywgZGF0YSwgInVuZXhwZWN0ZWQiKTsKKwllZXByb20tPnN0YXRlID0gcmVhZF9yZXNldDsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKworICAgIGNhc2Ugd3JpdGVfbnJfNjoKKyAgICAgIGlmIChhZGRyZXNzID09IDB4NTU1NSAmJiBkYXRhID09IDB4MTApIHsKKwlzdGFydF9lcmFzaW5nX2NoaXAobWUsIGVlcHJvbSk7CisJZWVwcm9tLT5zdGF0ZSA9IGNoaXBfZXJhc2U7CisgICAgICB9CisgICAgICBlbHNlIHsKKwlzdGFydF9lcmFzaW5nX3NlY3RvcihtZSwgZWVwcm9tLCBhZGRyZXNzKTsKKwllZXByb20tPnNlY3Rvcl9zdGF0ZSA9IHJlYWRfcmVzZXQ7CisJZWVwcm9tLT5zdGF0ZSA9IHNlY3Rvcl9lcmFzZTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgYXV0b3NlbGVjdDoKKyAgICAgIGlmIChkYXRhID09IDB4ZjApCisJZWVwcm9tLT5zdGF0ZSA9IHJlYWRfcmVzZXQ7CisgICAgICBlbHNlIGlmIChhZGRyZXNzID09IDB4NTU1NSAmJiBkYXRhID09IDB4YWEpCisJZWVwcm9tLT5zdGF0ZSA9IHdyaXRlX25yXzI7CisgICAgICBlbHNlIHsKKwlpbnZhbGlkX3dyaXRlKG1lLCBlZXByb20tPnN0YXRlLCBhZGRyZXNzLCBkYXRhLCAidW5zdXBwb3J0ZWQgYWRkcmVzcyIpOworCWVlcHJvbS0+c3RhdGUgPSByZWFkX3Jlc2V0OworICAgICAgfQorICAgICAgcmV0dXJuOworCisgICAgY2FzZSBieXRlX3Byb2dyYW06CisgICAgICBzdGFydF9wcm9ncmFtbWluZ19ieXRlKG1lLCBlZXByb20sIGFkZHJlc3MsIGRhdGEpOworICAgICAgZWVwcm9tLT5zdGF0ZSA9IGJ5dGVfcHJvZ3JhbW1pbmc7CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIGJ5dGVfcHJvZ3JhbW1pbmc6CisgICAgICBpZiAoZGV2aWNlX2V2ZW50X3F1ZXVlX3RpbWUobWUpID4gZWVwcm9tLT5wcm9ncmFtX2ZpbmlzaF90aW1lKSB7CisJZmluaXNoX3Byb2dyYW1taW5nX2J5dGUobWUsIGVlcHJvbSk7CisJZWVwcm9tLT5zdGF0ZSA9IHJlYWRfcmVzZXQ7CisJY29udGludWU7CisgICAgICB9CisgICAgICAvKiBpZ25vcmUgaXQgKi8KKyAgICAgIHJldHVybjsKKworICAgIGNhc2UgY2hpcF9lcmFzZToKKyAgICAgIGlmIChkZXZpY2VfZXZlbnRfcXVldWVfdGltZShtZSkgPiBlZXByb20tPnByb2dyYW1fZmluaXNoX3RpbWUpIHsKKwlmaW5pc2hfZXJhc2luZ19jaGlwKG1lLCBlZXByb20pOworCWVlcHJvbS0+c3RhdGUgPSByZWFkX3Jlc2V0OworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgLyogaWdub3JlIGl0ICovCisgICAgICByZXR1cm47CisKKyAgICBjYXNlIHNlY3Rvcl9lcmFzZToKKyAgICAgIGlmIChkZXZpY2VfZXZlbnRfcXVldWVfdGltZShtZSkgPiBlZXByb20tPnByb2dyYW1fZmluaXNoX3RpbWUpIHsKKwlmaW5pc2hfZXJhc2luZ19zZWN0b3IobWUsIGVlcHJvbSk7CisJZWVwcm9tLT5zdGF0ZSA9IGVlcHJvbS0+c2VjdG9yX3N0YXRlOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgZWxzZSBpZiAoZGV2aWNlX2V2ZW50X3F1ZXVlX3RpbWUobWUpID4gZWVwcm9tLT5zZWN0b3Jfc3RhcnRfdGltZQorCSAgICAgICAmJiBkYXRhID09IDB4YjApIHsKKwllZXByb20tPnNlY3Rvcl9zdGF0ZSA9IHJlYWRfcmVzZXQ7CisJZWVwcm9tLT5zdGF0ZSA9IHNlY3Rvcl9lcmFzZV9zdXNwZW5kOworICAgICAgfQorICAgICAgZWxzZSB7CisJaWYgKGVlcHJvbS0+c2VjdG9yX3N0YXRlID09IHJlYWRfcmVzZXQKKwkgICAgJiYgYWRkcmVzcyA9PSAweDU1NTUgJiYgZGF0YSA9PSAweGFhKQorCSAgZWVwcm9tLT5zZWN0b3Jfc3RhdGUgPSB3cml0ZV9ucl8yOworCWVsc2UgaWYgKGVlcHJvbS0+c2VjdG9yX3N0YXRlID09IHdyaXRlX25yXzIKKwkJICYmIGFkZHJlc3MgPT0gMHgyYWFhICYmIGRhdGEgPT0gMHg1NSkKKwkgIGVlcHJvbS0+c2VjdG9yX3N0YXRlID0gd3JpdGVfbnJfMzsKKwllbHNlIGlmIChlZXByb20tPnNlY3Rvcl9zdGF0ZSA9PSB3cml0ZV9ucl8zCisJCSAmJiBhZGRyZXNzID09IDB4NTU1NSAmJiBkYXRhID09IDB4ODApCisJICBlZXByb20tPnNlY3Rvcl9zdGF0ZSA9IHdyaXRlX25yXzQ7CisJZWxzZSBpZiAoZWVwcm9tLT5zZWN0b3Jfc3RhdGUgPT0gd3JpdGVfbnJfNAorCQkgJiYgYWRkcmVzcyA9PSAweDU1NTUgJiYgZGF0YSA9PSAweGFhKQorCSAgZWVwcm9tLT5zZWN0b3Jfc3RhdGUgPSB3cml0ZV9ucl81OworCWVsc2UgaWYgKGVlcHJvbS0+c2VjdG9yX3N0YXRlID09IHdyaXRlX25yXzUKKwkJICYmIGFkZHJlc3MgPT0gMHgyYWFhICYmIGRhdGEgPT0gMHg1NSkKKwkgIGVlcHJvbS0+c2VjdG9yX3N0YXRlID0gd3JpdGVfbnJfNjsKKwllbHNlIGlmIChlZXByb20tPnNlY3Rvcl9zdGF0ZSA9PSB3cml0ZV9ucl82CisJCSAmJiBhZGRyZXNzICE9IDB4NTU1NSAmJiBkYXRhID09IDB4MzApIHsKKwkgIGlmIChkZXZpY2VfZXZlbnRfcXVldWVfdGltZShtZSkgPiBlZXByb20tPnNlY3Rvcl9zdGFydF90aW1lKSB7CisJICAgIERUUkFDRShlZXByb20sICgic2VjdG9yIGVyYXNlIGNvbW1hbmQgYWZ0ZXIgd2luZG93IGNsb3NlZFxuIikpOworCSAgICBlZXByb20tPnNlY3Rvcl9zdGF0ZSA9IHJlYWRfcmVzZXQ7CisJICB9CisJICBlbHNlIHsKKwkgICAgc3RhcnRfZXJhc2luZ19zZWN0b3IobWUsIGVlcHJvbSwgYWRkcmVzcyk7CisJICAgIGVlcHJvbS0+c2VjdG9yX3N0YXRlID0gcmVhZF9yZXNldDsKKwkgIH0KKwl9CisJZWxzZSB7CisJICBpbnZhbGlkX3dyaXRlKG1lLCBlZXByb20tPnN0YXRlLCBhZGRyZXNzLCBkYXRhLCBzdGF0ZTJhKGVlcHJvbS0+c2VjdG9yX3N0YXRlKSk7CisJICBlZXByb20tPnN0YXRlID0gcmVhZF9yZXNldDsKKwl9CisgICAgICB9CisgICAgICByZXR1cm47CisKKyAgICBjYXNlIHNlY3Rvcl9lcmFzZV9zdXNwZW5kOgorICAgICAgaWYgKGRhdGEgPT0gMHgzMCkKKwllZXByb20tPnN0YXRlID0gc2VjdG9yX2VyYXNlOworICAgICAgZWxzZSB7CisJaW52YWxpZF93cml0ZShtZSwgZWVwcm9tLT5zdGF0ZSwgYWRkcmVzcywgZGF0YSwgIm5vdCByZXN1bWUgY29tbWFuZCIpOworCWVlcHJvbS0+c3RhdGUgPSByZWFkX3Jlc2V0OworICAgICAgfQorICAgICAgcmV0dXJuOworCisgICAgfQorICB9Cit9CisKK3N0YXRpYyB1bnNpZ25lZAoraHdfZWVwcm9tX2lvX3dyaXRlX2J1ZmZlcihkZXZpY2UgKm1lLAorCQkJICBjb25zdCB2b2lkICpzb3VyY2UsCisJCQkgIGludCBzcGFjZSwKKwkJCSAgdW5zaWduZWRfd29yZCBhZGRyLAorCQkJICB1bnNpZ25lZCBucl9ieXRlcywKKwkJCSAgY3B1ICpwcm9jZXNzb3IsCisJCQkgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBod19lZXByb21fZGV2aWNlICplZXByb20gPSAoaHdfZWVwcm9tX2RldmljZSopZGV2aWNlX2RhdGEobWUpOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG5yX2J5dGVzOyBpKyspIHsKKyAgICB1bnNpZ25lZF93b3JkIGFkZHJlc3MgPSAoYWRkciArIGkpICUgZWVwcm9tLT5zaXplb2ZfbWVtb3J5OworICAgIHVuc2lnbmVkOCBieXRlID0gKCh1bnNpZ25lZDgqKXNvdXJjZSlbaV07CisgICAgd3JpdGVfYnl0ZShtZSwgZWVwcm9tLCBhZGRyZXNzLCBieXRlKTsKKyAgfQorICByZXR1cm4gbnJfYnl0ZXM7Cit9CisKKworLyogQW4gaW5zdGFuY2Ugb2YgdGhlIGVlcHJvbSAqLworCit0eXBlZGVmIHN0cnVjdCBfaHdfZWVwcm9tX2luc3RhbmNlIHsKKyAgdW5zaWduZWRfd29yZCBwb3M7CisgIGh3X2VlcHJvbV9kZXZpY2UgKmVlcHJvbTsKKyAgZGV2aWNlICptZTsKK30gaHdfZWVwcm9tX2luc3RhbmNlOworCitzdGF0aWMgdm9pZAoraHdfZWVwcm9tX2luc3RhbmNlX2RlbGV0ZShkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlKQoreworICBod19lZXByb21faW5zdGFuY2UgKmRhdGEgPSBkZXZpY2VfaW5zdGFuY2VfZGF0YShpbnN0YW5jZSk7CisgIHpmcmVlKGRhdGEpOworfQorCitzdGF0aWMgaW50Citod19lZXByb21faW5zdGFuY2VfcmVhZChkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAorCQkJdm9pZCAqYnVmLAorCQkJdW5zaWduZWRfd29yZCBsZW4pCit7CisgIGh3X2VlcHJvbV9pbnN0YW5jZSAqZGF0YSA9IGRldmljZV9pbnN0YW5jZV9kYXRhKGluc3RhbmNlKTsKKyAgaW50IGk7CisgIGlmIChkYXRhLT5lZXByb20tPnN0YXRlICE9IHJlYWRfcmVzZXQpCisgICAgRElUUkFDRShlZXByb20sICgiZWVwcm9tIG5vdCBpZGxlIGR1cmluZyBpbnN0YW5jZSByZWFkXG4iKSk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICgodW5zaWduZWQ4KilidWYpW2ldID0gZGF0YS0+ZWVwcm9tLT5tZW1vcnlbZGF0YS0+cG9zXTsKKyAgICBkYXRhLT5wb3MgPSAoZGF0YS0+cG9zICsgMSkgJSBkYXRhLT5lZXByb20tPnNpemVvZl9tZW1vcnk7CisgIH0KKyAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludAoraHdfZWVwcm9tX2luc3RhbmNlX3dyaXRlKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQkgY29uc3Qgdm9pZCAqYnVmLAorCQkJIHVuc2lnbmVkX3dvcmQgbGVuKQoreworICBod19lZXByb21faW5zdGFuY2UgKmRhdGEgPSBkZXZpY2VfaW5zdGFuY2VfZGF0YShpbnN0YW5jZSk7CisgIGludCBpOworICBpZiAoZGF0YS0+ZWVwcm9tLT5zdGF0ZSAhPSByZWFkX3Jlc2V0KQorICAgIERJVFJBQ0UoZWVwcm9tLCAoImVlcHJvbSBub3QgaWRsZSBkdXJpbmcgaW5zdGFuY2Ugd3JpdGVcbiIpKTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgZGF0YS0+ZWVwcm9tLT5tZW1vcnlbZGF0YS0+cG9zXSA9ICgodW5zaWduZWQ4KilidWYpW2ldOworICAgIGRhdGEtPnBvcyA9IChkYXRhLT5wb3MgKyAxKSAlIGRhdGEtPmVlcHJvbS0+c2l6ZW9mX21lbW9yeTsKKyAgfQorICBkdW1wX2VlcHJvbShkYXRhLT5tZSwgZGF0YS0+ZWVwcm9tKTsKKyAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludAoraHdfZWVwcm9tX2luc3RhbmNlX3NlZWsoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKKwkJICAgICAgdW5zaWduZWRfd29yZCBwb3NfaGksCisJCSAgICAgIHVuc2lnbmVkX3dvcmQgcG9zX2xvKQoreworICBod19lZXByb21faW5zdGFuY2UgKmRhdGEgPSBkZXZpY2VfaW5zdGFuY2VfZGF0YShpbnN0YW5jZSk7CisgIGlmIChwb3NfbG8gPj0gZGF0YS0+ZWVwcm9tLT5zaXplb2ZfbWVtb3J5KQorICAgIGRldmljZV9lcnJvcihkYXRhLT5tZSwgInNlZWsgdmFsdWUgMHglbHggb3V0IG9mIHJhbmdlXG4iLAorCQkgKHVuc2lnbmVkIGxvbmcpcG9zX2xvKTsKKyAgZGF0YS0+cG9zID0gcG9zX2xvOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGRldmljZV9pbnN0YW5jZV9jYWxsYmFja3MgaHdfZWVwcm9tX2luc3RhbmNlX2NhbGxiYWNrcyA9IHsKKyAgaHdfZWVwcm9tX2luc3RhbmNlX2RlbGV0ZSwKKyAgaHdfZWVwcm9tX2luc3RhbmNlX3JlYWQsCisgIGh3X2VlcHJvbV9pbnN0YW5jZV93cml0ZSwKKyAgaHdfZWVwcm9tX2luc3RhbmNlX3NlZWssCit9OworCitzdGF0aWMgZGV2aWNlX2luc3RhbmNlICoKK2h3X2VlcHJvbV9jcmVhdGVfaW5zdGFuY2UoZGV2aWNlICptZSwKKwkJCSAgY29uc3QgY2hhciAqcGF0aCwKKwkJCSAgY29uc3QgY2hhciAqYXJncykKK3sKKyAgaHdfZWVwcm9tX2RldmljZSAqZWVwcm9tID0gZGV2aWNlX2RhdGEobWUpOworICBod19lZXByb21faW5zdGFuY2UgKmRhdGEgPSBaQUxMT0MoaHdfZWVwcm9tX2luc3RhbmNlKTsKKyAgZGF0YS0+ZWVwcm9tID0gZWVwcm9tOworICBkYXRhLT5tZSA9IG1lOworICByZXR1cm4gZGV2aWNlX2NyZWF0ZV9pbnN0YW5jZV9mcm9tKG1lLCBOVUxMLAorCQkJCSAgICAgZGF0YSwKKwkJCQkgICAgIHBhdGgsIGFyZ3MsCisJCQkJICAgICAmaHdfZWVwcm9tX2luc3RhbmNlX2NhbGxiYWNrcyk7Cit9CisKKworCitzdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod19lZXByb21fY2FsbGJhY2tzID0geworICB7IGdlbmVyaWNfZGV2aWNlX2luaXRfYWRkcmVzcywKKyAgICBod19lZXByb21faW5pdF9kYXRhIH0sCisgIHsgTlVMTCwgfSwgLyogYWRkcmVzcyAqLworICB7IGh3X2VlcHJvbV9pb19yZWFkX2J1ZmZlciwKKyAgICBod19lZXByb21faW9fd3JpdGVfYnVmZmVyIH0sIC8qIElPICovCisgIHsgTlVMTCwgfSwgLyogRE1BICovCisgIHsgTlVMTCwgfSwgLyogaW50ZXJydXB0ICovCisgIHsgTlVMTCwgfSwgLyogdW5pdCAqLworICBod19lZXByb21fY3JlYXRlX2luc3RhbmNlLAorfTsKKworc3RhdGljIHZvaWQgKgoraHdfZWVwcm9tX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLAorCQkgY29uc3QgZGV2aWNlX3VuaXQgKnVuaXRfYWRkcmVzcywKKwkJIGNvbnN0IGNoYXIgKmFyZ3MpCit7CisgIGh3X2VlcHJvbV9kZXZpY2UgKmVlcHJvbSA9IFpBTExPQyhod19lZXByb21fZGV2aWNlKTsKKyAgcmV0dXJuIGVlcHJvbTsKK30KKworCisKK2NvbnN0IGRldmljZV9kZXNjcmlwdG9yIGh3X2VlcHJvbV9kZXZpY2VfZGVzY3JpcHRvcltdID0geworICB7ICJlZXByb20iLCBod19lZXByb21fY3JlYXRlLCAmaHdfZWVwcm9tX2NhbGxiYWNrcyB9LAorICB7IE5VTEwgfSwKK307CisKKyNlbmRpZiAvKiBfSFdfRUVQUk9NX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2h3X2dsdWUuYyBiL3NpbS9wcGMvaHdfZ2x1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YWQ5MjkKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2h3X2dsdWUuYwpAQCAtMCwwICsxLDM3MSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisgICAgCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICAgIAorICAgICovCisKKworI2lmbmRlZiBfSFdfR0xVRV9DXworI2RlZmluZSBfSFdfR0xVRV9DXworCisjaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCisKKworLyogREVWSUNFCisgICAKKworICAgZ2x1ZSAtIGdsdWUgdG8gaW50ZXJjb25uZWN0IGFuZCB0ZXN0IGludGVycnVwdHMKKyAgIAorCisgICBERVNDUklQVElPTgorICAgCisKKyAgIFRoZSBnbHVlIGRldmljZSBwcm92aWRlcyB0d28gZnVuY3Rpb25zLiAgRmlyc3RseSwgaXQgcHJvdmlkZXMgYQorICAgbWVjaGFuaXNtIGZvciBpbnNwZWN0aW5nIGFuZCBkcml2aW5nIHRoZSBpbnRlcnJ1cHQgbmV0LiAgU2Vjb25kbHksCisgICBpdCBwcm92aWRlcyBhIHNldCBvZiBib29sZWFuIHByaW1pdGl2ZXMgdGhhdCBjYW4gYmUgdXNlZCBhZGQKKyAgIGNvbWJpbmF0b3JpYWwgb3BlcmF0aW9ucyB0byB0aGUgaW50ZXJydXB0IG5ldHdvcmsuCisKKyAgIEdsdWUgZGV2aWNlcyBoYXZlIGEgdmFyaWFibGUgbnVtYmVyIG9mIGJpZyBlbmRpYW4gPDxvdXRwdXQ+PgorICAgcmVnaXN0ZXJzLiAgRWFjaCBob3N0LXdvcmQgc2l6ZS4gIFRoZSByZWdpc3RlcnMgY2FuIGJlIGJvdGggcmVhZAorICAgYW5kIHdyaXR0ZW4uCisKKyAgIFdyaXRpbmcgYSB2YWx1ZSB0byBhbiBvdXRwdXQgcmVnaXN0ZXIgY2F1c2VzIGFuIGludGVycnVwdCAob2YgdGhlCisgICBzcGVjaWZpZWQgbGV2ZWwpIHRvIGJlIGRyaXZlbiBvbiB0aGUgZGV2aWNlcyBjb3JyZXNwb25kaW5nIG91dHB1dAorICAgaW50ZXJydXB0IHBvcnQuCisKKyAgIFJlYWRpbmcgYW4gPDxvdXRwdXQ+PiByZWdpc3RlciByZXR1cm5zIGVpdGhlciB0aGUgbGFzdCB2YWx1ZQorICAgd3JpdHRlbiBvciB0aGUgbW9zdCByZWNlbnRseSBjb21wdXRlZCB2YWx1ZSAoZm9yIHRoYXQgcmVnaXN0ZXIpIGFzCisgICBhIHJlc3VsdCBvZiBhbiBpbnRlcnJ1cHQgYXJpdmluZyAod2hpY2ggZXZlciB3YXMgY29tcHV0ZWQgbGFzdCkuCisKKyAgIEF0IHByZXNlbnQgdGhlIGZvbGxvd2luZyBzdWIgZGV2aWNlIHR5cGVzIGFyZSBhdmFpbGFibGU6CisKKyAgIDw8Z2x1ZT4+OiBJbiBhZGRpdGlvbiB0byBkcml2aW5nIGl0cyBvdXRwdXQgaW50ZXJydXB0IHBvcnQgd2l0aCBhbnkKKyAgIHZhbHVlIHdyaXR0ZW4gdG8gYW4gaW50ZXJydXB0IGlucHV0IHBvcnQgaXMgc3RvcmVkIGluIHRoZQorICAgY29ycmVzcG9uZGluZyA8PG91dHB1dD4+IHJlZ2lzdGVyLiAgU3VjaCBpbnB1dCBpbnRlcnJ1cHRzLCBob3dldmVyLAorICAgYXJlIG5vdCBwcm9wb2dhdGVkIHRvIGFuIG91dHB1dCBpbnRlcnJ1cHQgcG9ydC4KKworICAgPDxnbHVlLWFuZD4+OiBUaGUgYml0LXdpc2UgQU5EIG9mIHRoZSBpbnRlcnJ1cHQgaW5wdXRzIGlzIGNvbXB1dGVkCisgICBhbmQgdGhlbiBib3RoIHN0b3JlZCBpbiA8PG91dHB1dD4+IHJlZ2lzdGVyIHplcm8gYW5kIHByb3BvZ2F0ZWQgdG8KKyAgIG91dHB1dCBpbnRlcnJ1cHQgb3V0cHV0IHBvcnQgemVyby4KKworCisgICBQUk9QRVJUSUVTCisgICAKKworICAgcmVnID0gPGFkZHJlc3M+IDxzaXplPiAocmVxdWlyZWQpCisKKyAgIFNwZWNpZnkgdGhlIGFkZHJlc3MgKHdpdGhpbiB0aGUgcGFyZW50IGJ1cykgdGhhdCB0aGlzIGRldmljZSBpcyB0bworICAgbGl2ZS4gIFRoZSBhZGRyZXNzIG11c3QgYmUgMjA0OCAqIHNpemVvZih3b3JkKSAoOGsgaW4gYSAzMmJpdAorICAgc2ltdWxhdGlvbikgYWxpZ25lZC4KKworCisgICBpbnRlcnJ1cHQtcmFuZ2VzID0gPGludC1udW1iZXI+IDxyYW5nZT4gKG9wdGlvbmFsKQorCisgICBJZiBwcmVzZW50LCB0aGlzIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHZhbGlkIGludGVycnVwdCBpbnB1dHMgKHVwCisgICB0byB0aGUgbWF4aW11bSBvZiAyMDQ4KS4gIEJ5IGRlZmF1bHQsIDw8aW50LW51bWJlcj4+IGlzIHplcm8gYW5kCisgICByYW5nZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSA8PHJlZz4+IHNpemUuCisKKworICAgRVhBTVBMRVMKKworCisgICBFbmFibGUgdHJhY2luZyBvZiB0aGUgZGV2aWNlOgorCisgICB8IC10IGdsdWUtZGV2aWNlIFwKKworCisgICBDcmVhdGUgc291cmNlLCBiaXR3aXplLWFuZCwgYW5kIHNpbmsgZ2x1ZSBkZXZpY2VzLiAgU2luY2UgdGhlCisgICBkZXZpY2UgYXQgYWRkcmVzcyA8PDB4MTAwMDA+PiBpcyBvZiBzaXplIDw8OD4+IGl0IHdpbGwgaGF2ZSB0d28KKyAgIG91dHB1dCBpbnRlcnJ1cHQgcG9ydHMuCisKKyAgIHwgLW8gJy9pb2J1c0AweGYwMDAwMDAwL2dsdWVAMHgxMDAwMC9yZWcgMHgxMDAwMCA4JyBcCisgICB8IC1vICcvaW9idXNAMHhmMDAwMDAwMC9nbHVlLWFuZEAweDIwMDAwL3JlZyAweDIwMDAwIDQnIFwKKyAgIHwgLW8gJy9pb2J1c0AweGYwMDAwMDAwL2dsdWUtYW5kL2ludGVycnVwdC1yYW5nZXMgMCAyJyBcCisgICB8IC1vICcvaW9idXNAMHhmMDAwMDAwMC9nbHVlQDB4MzAwMDAvcmVnIDB4MzAwMDAgNCcgXAorCisKKyAgIFdpcmUgdGhlIHR3byBzb3VyY2UgaW50ZXJydXB0cyB0byB0aGUgQU5EIGRldmljZToKKworICAgfCAtbyAnL2lvYnVzQDB4ZjAwMDAwMDAvZ2x1ZUAweDEwMDAwID4gMCAwIC9pb2J1cy9nbHVlLWFuZCcgXAorICAgfCAtbyAnL2lvYnVzQDB4ZjAwMDAwMDAvZ2x1ZUAweDEwMDAwID4gMSAxIC9pb2J1cy9nbHVlLWFuZCcgXAorCisKKyAgIFdpcmUgdGhlIEFORCBkZXZpY2UgdXAgdG8gdGhlIHNpbmsgc28gdGhhdCB0aGUgYW5kJ3Mgb3V0cHV0IGlzIG5vdAorICAgbGVmdCBvcGVuLgorCisgICB8IC1vICcvaW9idXNAMHhmMDAwMDAwMC9nbHVlLWFuZCA+IDAgMCAvaW9idXMvZ2x1ZUAweDMwMDAwJyBcCisKKworICAgV2l0aCB0aGUgYWJvdmUgY29uZmlndXJhdGlvbi4gIFRoZSBjbGllbnQgcHJvZ3JhbSBpcyBhYmxlIHRvCisgICBjb21wdXRlIGEgdHdvIGJpdCBBTkQuICBGb3IgaW5zdGFuY2UgdGhlIDw8Qz4+IHN0dWIgYmVsb3cgcHJpbnRzIDEKKyAgIEFORCAwLgorCisgICB8ICB1bnNpZ25lZCAqaW5wdXQgPSAodm9pZCopMHhmMDAxMDAwMDsKKyAgIHwgIHVuc2lnbmVkICpvdXRwdXQgPSAodm9pZCopMHhmMDAzMDAwMDsKKyAgIHwgIHVuc2lnbmVkIGFuczsKKyAgIHwgIGlucHV0WzBdID0gaHRvbmwoMSk7CisgICB8ICBpbnB1dFsxXSA9IGh0b25sKDApOworICAgfCAgYW5zID0gbnRvaGwoKm91dHB1dCk7CisgICB8ICB3cml0ZV9zdHJpbmcoIkFORCBpcyAiKTsKKyAgIHwgIHdyaXRlX2ludChhbnMpOworICAgfCAgd3JpdGVfbGluZSgpOworICAgCisKKyAgIEJVR1MKKworICAgCisgICBBIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGRldmljZSBtYXkgc3VwcG9ydCBtdWx0aXBsZQorICAgaW50ZXJydXB0IHJhbmdlcy4KKworICAgU29tZSBvZiB0aGUgZGV2aWNlcyBsaXN0ZWQgbWF5IG5vdCB5ZXQgYmUgZnVsbHkgaW1wbGVtZW50ZWQuCisKKyAgIEFkZGl0aW9uYWwgZGV2aWNlcyBzdWNoIGFzIGEgZGZmLCBhbiBpbnZlcnRlciBvciBhIGxhdGNoIG1heSBiZQorICAgdXNlZnVsLgorCisgICAqLworCisKK2VudW0geworICBtYXhfbnJfaW50ZXJydXB0cyA9IDIwNDgsCit9OworCit0eXBlZGVmIGVudW0gX2h3X2dsdWVfdHlwZSB7CisgIGdsdWVfdW5kZWZpbmVkID0gMCwKKyAgZ2x1ZV9pbywKKyAgZ2x1ZV9hbmQsCisgIGdsdWVfbmFuZCwKKyAgZ2x1ZV9vciwKKyAgZ2x1ZV94b3IsCisgIGdsdWVfbm9yLAorICBnbHVlX25vdCwKK30gaHdfZ2x1ZV90eXBlOworCit0eXBlZGVmIHN0cnVjdCBfaHdfZ2x1ZV9kZXZpY2UgeworICBod19nbHVlX3R5cGUgdHlwZTsKKyAgaW50IGludF9udW1iZXI7CisgIGludCAqaW5wdXQ7CisgIGludCBucl9pbnB1dHM7CisgIHVuc2lnbmVkIHNpemVvZl9pbnB1dDsKKyAgLyogb3VyIG91dHB1dCByZWdpc3RlcnMgKi8KKyAgaW50IHNwYWNlOworICB1bnNpZ25lZF93b3JkIGFkZHJlc3M7CisgIHVuc2lnbmVkIHNpemVvZl9vdXRwdXQ7CisgIGludCAqb3V0cHV0OworICBpbnQgbnJfb3V0cHV0czsKK30gaHdfZ2x1ZV9kZXZpY2U7CisKKworc3RhdGljIHZvaWQKK2h3X2dsdWVfaW5pdF9hZGRyZXNzKGRldmljZSAqbWUpCit7CisgIGh3X2dsdWVfZGV2aWNlICpnbHVlID0gKGh3X2dsdWVfZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7CisKKyAgLyogYXR0YWNoIHRvIG15IHBhcmVudCAqLworICBnZW5lcmljX2RldmljZV9pbml0X2FkZHJlc3MobWUpOworCisgIC8qIGVzdGFibGlzaCB0aGUgb3V0cHV0IHJlZ2lzdGVycyAqLworICBpZiAoZ2x1ZS0+b3V0cHV0ICE9IE5VTEwpIHsKKyAgICBtZW1zZXQoZ2x1ZS0+b3V0cHV0LCAwLCBnbHVlLT5zaXplb2Zfb3V0cHV0KTsKKyAgfQorICBlbHNlIHsKKyAgICByZWdfcHJvcGVydHlfc3BlYyB1bml0OworICAgIGludCByZWdfbnI7CisgICAgLyogZmluZCBhIHJlbGV2YW50IHJlZyBlbnRyeSAqLworICAgIHJlZ19uciA9IDA7CisgICAgd2hpbGUgKGRldmljZV9maW5kX3JlZ19hcnJheV9wcm9wZXJ0eShtZSwgInJlZyIsIHJlZ19uciwgJnVuaXQpCisJICAgJiYgIWRldmljZV9zaXplX3RvX2F0dGFjaF9zaXplKGRldmljZV9wYXJlbnQobWUpLCAmdW5pdC5zaXplLAorCQkJCQkgICZnbHVlLT5zaXplb2Zfb3V0cHV0LCBtZSkpCisgICAgICByZWdfbnIrKzsKKyAgICAvKiBjaGVjayBvdXQgdGhlIHNpemUgKi8KKyAgICBpZiAoZ2x1ZS0+c2l6ZW9mX291dHB1dCA9PSAwKQorICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiYXQgbGVhc3Qgb25lIHJlZyBwcm9wZXJ0eSBzaXplIG11c3QgYmUgbm9uemVybyIpOworICAgIGlmIChnbHVlLT5zaXplb2Zfb3V0cHV0ICUgc2l6ZW9mKHVuc2lnbmVkX3dvcmQpICE9IDApCisgICAgICBkZXZpY2VfZXJyb3IobWUsICJyZWcgcHJvcGVydHkgc2l6ZSBtdXN0IGJlICVkIGFsaWduZWQiLCBzaXplb2YodW5zaWduZWRfd29yZCkpOworICAgIC8qIGFuZCB0aGUgYWRkcmVzcyAqLworICAgIGRldmljZV9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzKGRldmljZV9wYXJlbnQobWUpLAorCQkJCSAgICAgJnVuaXQuYWRkcmVzcywgJmdsdWUtPnNwYWNlLCAmZ2x1ZS0+YWRkcmVzcywKKwkJCQkgICAgIG1lKTsKKyAgICBpZiAoZ2x1ZS0+YWRkcmVzcyAlIChzaXplb2YodW5zaWduZWRfd29yZCkgKiBtYXhfbnJfaW50ZXJydXB0cykgIT0gMCkKKyAgICAgIGRldmljZV9lcnJvcihtZSwgInJlZyBwcm9wZXJ0eSBhZGRyZXNzIG11c3QgYmUgJWQgYWxpZ25lZCIsCisJCSAgIHNpemVvZih1bnNpZ25lZF93b3JkKSAqIG1heF9ucl9pbnRlcnJ1cHRzKTsKKyAgICBnbHVlLT5ucl9vdXRwdXRzID0gZ2x1ZS0+c2l6ZW9mX291dHB1dCAvIHNpemVvZih1bnNpZ25lZF93b3JkKTsKKyAgICBnbHVlLT5vdXRwdXQgPSB6YWxsb2MoZ2x1ZS0+c2l6ZW9mX291dHB1dCk7CisgIH0KKworICAvKiBlc3RhYmxpc2ggdGhlIGlucHV0IGludGVycnVwdCBwb3J0cyAqLworICBpZiAoZ2x1ZS0+aW5wdXQgIT0gTlVMTCkgeworICAgIG1lbXNldChnbHVlLT5pbnB1dCwgMCwgZ2x1ZS0+c2l6ZW9mX2lucHV0KTsKKyAgfQorICBlbHNlIHsKKyAgICBjb25zdCBkZXZpY2VfcHJvcGVydHkgKnJhbmdlcyA9IGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAiaW50ZXJydXB0LXJhbmdlcyIpOworICAgIGlmIChyYW5nZXMgPT0gTlVMTCkgeworICAgICAgZ2x1ZS0+aW50X251bWJlciA9IDA7CisgICAgICBnbHVlLT5ucl9pbnB1dHMgPSBnbHVlLT5ucl9vdXRwdXRzOworICAgIH0KKyAgICBlbHNlIGlmIChyYW5nZXMtPnNpemVvZl9hcnJheSAhPSBzaXplb2YodW5zaWduZWRfY2VsbCkgKiAyKSB7CisgICAgICBkZXZpY2VfZXJyb3IobWUsICJpbnZhbGlkIGludGVycnVwdC1yYW5nZXMgcHJvcGVydHkgKGluY29ycmVjdCBzaXplKSIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGNvbnN0IHVuc2lnbmVkX2NlbGwgKmludF9yYW5nZSA9IHJhbmdlcy0+YXJyYXk7CisgICAgICBnbHVlLT5pbnRfbnVtYmVyID0gQkUySF9jZWxsKGludF9yYW5nZVswXSk7CisgICAgICBnbHVlLT5ucl9pbnB1dHMgPSBCRTJIX2NlbGwoaW50X3JhbmdlWzFdKTsKKyAgICB9CisgICAgZ2x1ZS0+c2l6ZW9mX2lucHV0ID0gZ2x1ZS0+bnJfaW5wdXRzICogc2l6ZW9mKHVuc2lnbmVkKTsKKyAgICBnbHVlLT5pbnB1dCA9IHphbGxvYyhnbHVlLT5zaXplb2ZfaW5wdXQpOworICB9CisKKyAgLyogZGV0ZXJtaW5lIG91ciB0eXBlICovCisgIGlmIChnbHVlLT50eXBlID09IGdsdWVfdW5kZWZpbmVkKSB7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IGRldmljZV9uYW1lKG1lKTsKKyAgICBpZiAoc3RyY21wKG5hbWUsICJnbHVlIikgPT0gMCkKKyAgICAgIGdsdWUtPnR5cGUgPSBnbHVlX2lvOworICAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiZ2x1ZS1hbmQiKSA9PSAwKQorICAgICAgZ2x1ZS0+dHlwZSA9IGdsdWVfYW5kOworICAgIGVsc2UKKyAgICAgIGRldmljZV9lcnJvcihtZSwgInVuaW1wbGVtZW50ZWQgZ2x1ZSB0eXBlIik7CisgIH0KKworICBEVFJBQ0UoZ2x1ZSwgKCJpbnQtbnVtYmVyICVkLCBucl9pbnB1dHMgJWQsIG5yX291dHB1dHMgJWRcbiIsCisJCWdsdWUtPmludF9udW1iZXIsIGdsdWUtPm5yX2lucHV0cywgZ2x1ZS0+bnJfb3V0cHV0cykpOworfQorCitzdGF0aWMgdW5zaWduZWQKK2h3X2dsdWVfaW9fcmVhZF9idWZmZXJfY2FsbGJhY2soZGV2aWNlICptZSwKKwkJCQl2b2lkICpkZXN0LAorCQkJCWludCBzcGFjZSwKKwkJCQl1bnNpZ25lZF93b3JkIGFkZHIsCisJCQkJdW5zaWduZWQgbnJfYnl0ZXMsCisJCQkJY3B1ICpwcm9jZXNzb3IsCisJCQkJdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGh3X2dsdWVfZGV2aWNlICpnbHVlID0gKGh3X2dsdWVfZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7CisgIGludCByZWcgPSAoKGFkZHIgLSBnbHVlLT5hZGRyZXNzKSAvIHNpemVvZih1bnNpZ25lZF93b3JkKSkgJSBnbHVlLT5ucl9vdXRwdXRzOworICBpZiAobnJfYnl0ZXMgIT0gc2l6ZW9mKHVuc2lnbmVkX3dvcmQpCisgICAgICB8fCAoYWRkciAlIHNpemVvZih1bnNpZ25lZF93b3JkKSkgIT0gMCkKKyAgICAgZGV2aWNlX2Vycm9yKG1lLCAibWlzc2FsaWduZWQgcmVhZCBhY2Nlc3MgKCVkOjB4JWx4OiVkKSBub3Qgc3VwcG9ydGVkIiwKKwkJICBzcGFjZSwgKHVuc2lnbmVkIGxvbmcpYWRkciwgbnJfYnl0ZXMpOworICAqKHVuc2lnbmVkX3dvcmQqKWRlc3QgPSBIMkJFXzQoZ2x1ZS0+b3V0cHV0W3JlZ10pOworICBEVFJBQ0UoZ2x1ZSwgKCJyZWFkIC0gaW50ZXJydXB0ICVkICgweCVseCksIGxldmVsICVkXG4iLAorCQlyZWcsICh1bnNpZ25lZCBsb25nKSBhZGRyLCBnbHVlLT5vdXRwdXRbcmVnXSkpOworICByZXR1cm4gbnJfYnl0ZXM7Cit9CisKKworc3RhdGljIHVuc2lnbmVkCitod19nbHVlX2lvX3dyaXRlX2J1ZmZlcl9jYWxsYmFjayhkZXZpY2UgKm1lLAorCQkJCSBjb25zdCB2b2lkICpzb3VyY2UsCisJCQkJIGludCBzcGFjZSwKKwkJCQkgdW5zaWduZWRfd29yZCBhZGRyLAorCQkJCSB1bnNpZ25lZCBucl9ieXRlcywKKwkJCQkgY3B1ICpwcm9jZXNzb3IsCisJCQkJIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBod19nbHVlX2RldmljZSAqZ2x1ZSA9IChod19nbHVlX2RldmljZSopZGV2aWNlX2RhdGEobWUpOworICBpbnQgcmVnID0gKChhZGRyIC0gZ2x1ZS0+YWRkcmVzcykgLyBzaXplb2YodW5zaWduZWRfd29yZCkpICUgbWF4X25yX2ludGVycnVwdHM7CisgIGlmIChucl9ieXRlcyAhPSBzaXplb2YodW5zaWduZWRfd29yZCkKKyAgICAgIHx8IChhZGRyICUgc2l6ZW9mKHVuc2lnbmVkX3dvcmQpKSAhPSAwKQorICAgIGRldmljZV9lcnJvcihtZSwgIm1pc3NhbGlnbmVkIHdyaXRlIGFjY2VzcyAoJWQ6MHglbHg6JWQpIG5vdCBzdXBwb3J0ZWQiLAorCQkgc3BhY2UsICh1bnNpZ25lZCBsb25nKWFkZHIsIG5yX2J5dGVzKTsKKyAgZ2x1ZS0+b3V0cHV0W3JlZ10gPSBIMkJFXzQoKih1bnNpZ25lZF93b3JkKilzb3VyY2UpOworICBEVFJBQ0UoZ2x1ZSwgKCJ3cml0ZSAtIGludGVycnVwdCAlZCAoMHglbHgpLCBsZXZlbCAlZFxuIiwKKwkJcmVnLCAodW5zaWduZWQgbG9uZykgYWRkciwgZ2x1ZS0+b3V0cHV0W3JlZ10pKTsKKyAgZGV2aWNlX2ludGVycnVwdF9ldmVudChtZSwgcmVnLCBnbHVlLT5vdXRwdXRbcmVnXSwgcHJvY2Vzc29yLCBjaWEpOworICByZXR1cm4gbnJfYnl0ZXM7Cit9CisKK3N0YXRpYyB2b2lkCitod19nbHVlX2ludGVycnVwdF9ldmVudChkZXZpY2UgKm1lLAorCQkJaW50IG15X3BvcnQsCisJCQlkZXZpY2UgKnNvdXJjZSwKKwkJCWludCBzb3VyY2VfcG9ydCwKKwkJCWludCBsZXZlbCwKKwkJCWNwdSAqcHJvY2Vzc29yLAorCQkJdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGh3X2dsdWVfZGV2aWNlICpnbHVlID0gKGh3X2dsdWVfZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7CisgIGludCBpOworICBpZiAobXlfcG9ydCA8IGdsdWUtPmludF9udW1iZXIKKyAgICAgIHx8IG15X3BvcnQgPj0gZ2x1ZS0+aW50X251bWJlciArIGdsdWUtPm5yX2lucHV0cykKKyAgICBkZXZpY2VfZXJyb3IobWUsICJpbnRlcnJ1cHQgJWQgb3V0c2lkZSBvZiB2YWxpZCByYW5nZSIsIG15X3BvcnQpOworICBnbHVlLT5pbnB1dFtteV9wb3J0IC0gZ2x1ZS0+aW50X251bWJlcl0gPSBsZXZlbDsKKyAgc3dpdGNoIChnbHVlLT50eXBlKSB7CisgIGNhc2UgZ2x1ZV9pbzoKKyAgICB7CisgICAgICBpbnQgcG9ydCA9IG15X3BvcnQgJSBnbHVlLT5ucl9vdXRwdXRzOworICAgICAgZ2x1ZS0+b3V0cHV0W3BvcnRdID0gbGV2ZWw7CisgICAgICBEVFJBQ0UoZ2x1ZSwgKCJpbnB1dCAtIGludGVycnVwdCAlZCAoMHglbHgpLCBsZXZlbCAlZFxuIiwKKwkJICAgIG15X3BvcnQsCisJCSAgICAodW5zaWduZWQgbG9uZylnbHVlLT5hZGRyZXNzICsgcG9ydCAqIHNpemVvZih1bnNpZ25lZF93b3JkKSwKKwkJICAgIGxldmVsKSk7CisgICAgICBicmVhazsKKyAgICB9CisgIGNhc2UgZ2x1ZV9hbmQ6CisgICAgZ2x1ZS0+b3V0cHV0WzBdID0gZ2x1ZS0+aW5wdXRbMF07CisgICAgZm9yIChpID0gMTsgaSA8IGdsdWUtPm5yX2lucHV0czsgaSsrKQorICAgICAgZ2x1ZS0+b3V0cHV0WzBdICY9IGdsdWUtPmlucHV0W2ldOworICAgIERUUkFDRShnbHVlLCAoImFuZCAtIGludGVycnVwdCAlZCwgbGV2ZWwgJWQgYXJyaXZlZCAtIG91dHB1dCAlZFxuIiwKKwkJICBteV9wb3J0LCBsZXZlbCwgZ2x1ZS0+b3V0cHV0WzBdKSk7CisgICAgZGV2aWNlX2ludGVycnVwdF9ldmVudChtZSwgMCwgZ2x1ZS0+b3V0cHV0WzBdLCBwcm9jZXNzb3IsIGNpYSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgZGV2aWNlX2Vycm9yKG1lLCAib3BlcmF0b3Igbm90IGltcGxlbWVudGVkIik7CisgICAgYnJlYWs7CisgIH0KK30KKworCitzdGF0aWMgY29uc3QgZGV2aWNlX2ludGVycnVwdF9wb3J0X2Rlc2NyaXB0b3IgaHdfZ2x1ZV9pbnRlcnJ1cHRfcG9ydHNbXSA9IHsKKyAgeyAiaW50IiwgMCwgbWF4X25yX2ludGVycnVwdHMgfSwKKyAgeyBOVUxMIH0KK307CisKKworc3RhdGljIGRldmljZV9jYWxsYmFja3MgY29uc3QgaHdfZ2x1ZV9jYWxsYmFja3MgPSB7CisgIHsgaHdfZ2x1ZV9pbml0X2FkZHJlc3MsIE5VTEwgfSwKKyAgeyBOVUxMLCB9LCAvKiBhZGRyZXNzICovCisgIHsgaHdfZ2x1ZV9pb19yZWFkX2J1ZmZlcl9jYWxsYmFjaywKKyAgICAgIGh3X2dsdWVfaW9fd3JpdGVfYnVmZmVyX2NhbGxiYWNrLCB9LAorICB7IE5VTEwsIH0sIC8qIERNQSAqLworICB7IGh3X2dsdWVfaW50ZXJydXB0X2V2ZW50LCBOVUxMLCBod19nbHVlX2ludGVycnVwdF9wb3J0cyB9LCAvKiBpbnRlcnJ1cHQgKi8KKyAgeyBOVUxMLCB9LCAvKiB1bml0ICovCisgIE5VTEwsIC8qIGluc3RhbmNlICovCit9OworCisKK3N0YXRpYyB2b2lkICoKK2h3X2dsdWVfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsCisJICAgICAgY29uc3QgZGV2aWNlX3VuaXQgKnVuaXRfYWRkcmVzcywKKwkgICAgICBjb25zdCBjaGFyICphcmdzKQoreworICAvKiBjcmVhdGUgdGhlIGRlc2NyaXB0b3IgKi8KKyAgaHdfZ2x1ZV9kZXZpY2UgKmdsdWUgPSBaQUxMT0MoaHdfZ2x1ZV9kZXZpY2UpOworICByZXR1cm4gZ2x1ZTsKK30KKworCitjb25zdCBkZXZpY2VfZGVzY3JpcHRvciBod19nbHVlX2RldmljZV9kZXNjcmlwdG9yW10gPSB7CisgIHsgImdsdWUiLCBod19nbHVlX2NyZWF0ZSwgJmh3X2dsdWVfY2FsbGJhY2tzIH0sCisgIHsgImdsdWUtYW5kIiwgaHdfZ2x1ZV9jcmVhdGUsICZod19nbHVlX2NhbGxiYWNrcyB9LAorICB7ICJnbHVlLW5hbmQiLCBod19nbHVlX2NyZWF0ZSwgJmh3X2dsdWVfY2FsbGJhY2tzIH0sCisgIHsgImdsdWUtb3IiLCBod19nbHVlX2NyZWF0ZSwgJmh3X2dsdWVfY2FsbGJhY2tzIH0sCisgIHsgImdsdWUteG9yIiwgaHdfZ2x1ZV9jcmVhdGUsICZod19nbHVlX2NhbGxiYWNrcyB9LAorICB7ICJnbHVlLW5vciIsIGh3X2dsdWVfY3JlYXRlLCAmaHdfZ2x1ZV9jYWxsYmFja3MgfSwKKyAgeyAiZ2x1ZS1ub3QiLCBod19nbHVlX2NyZWF0ZSwgJmh3X2dsdWVfY2FsbGJhY2tzIH0sCisgIHsgTlVMTCB9LAorfTsKKworI2VuZGlmIC8qIF9IV19HTFVFX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2h3X2h0YWIuYyBiL3NpbS9wcGMvaHdfaHRhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YWE1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2h3X2h0YWIuYwpAQCAtMCwwICsxLDY4MyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfSFdfSFRBQl9DXworI2RlZmluZSBfSFdfSFRBQl9DXworCisjaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCisKKyNpbmNsdWRlICJiZmQuaCIKKworCisvKiBERVZJQ0UKKworCisgICBodGFiIC0gcHNldWRvLWRldmljZSBkZXNjcmliaW5nIGEgUG93ZXJQQyBoYXNoIHRhYmxlCisKKyAgIAorICAgREVTQ1JJUFRJT04KKyAgIAorICAgCisgICBEdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBkZXZpY2UgdHJlZSwgdGhlIHBzZXVkby1kZXZpY2UKKyAgIDw8aHRhYj4+LCBpbiBjb25qdW5jdGlvbiB3aXRoIGFueSBjaGlsZCA8PHB0ZT4+IHBzZXVkby1kZXZpY2VzLAorICAgd2lsbCBjcmVhdGUgYSBQb3dlclBDIGhhc2ggdGFibGUgaW4gbWVtb3J5LiAgVGhlIGhhc2ggdGFibGUgdmFsdWVzCisgICBhcmUgd3JpdHRlbiB1c2luZyBkbWEgdHJhbnNmZXJzLgorICAgCisgICBUaGUgc2l6ZSBhbmQgYWRkcmVzcyBvZiB0aGUgaGFzaCB0YWJsZSBhcmUgZGV0ZXJtaW5lZCBieSBwcm9wZXJ0aWVzCisgICBvZiB0aGUgaHRhYiBub2RlLgorICAgIAorICAgQnkgY29udmVudGlvbiwgdGhlIGh0YWIgZGV2aWNlIGlzIG1hZGUgYSBjaGlsZCBvZiB0aGUKKyAgIDw8L29wZW5wcm9tL2luaXQ+PiBub2RlLgorICAgCisgICBCeSBjb252ZW50aW9uLCB0aGUgcmVhbCBhZGRyZXNzIG9mIHRoZSBodGFiIGlzIHVzZWQgYXMgdGhlIGh0YWIKKyAgIG5vZGVzIHVuaXQgYWRkcmVzcy4KKyAgIAorICAgCisgICBQUk9QRVJUSUVTCisgICAKKworICAgcmVhbC1hZGRyZXNzID0gPGFkZHJlc3M+IChyZXF1aXJlZCkKKworICAgVGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGhhc2ggdGFibGUuICBUaGUgUG93ZXJQQyBhcmNoaXRlY3R1cmUKKyAgIHBsYWNlcyBsaW1pdGF0aW9ucyBvbiB3aGF0IGlzIGEgdmFsaWQgaGFzaCB0YWJsZSByZWFsLWFkZHJlc3MuCisKKyAgIAorICAgbnItYnl0ZXMgPSA8c2l6ZT4gKHJlcXVpcmVkKQorCisgICBUaGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSAoaW4gYnl0ZXMpIHRoYXQgaXMgdG8gYmUgY3JlYXRlZCBhdAorICAgPDxyZWFsLWFkZHJlc3M+Pi4gIFRoZSBQb3dlclBDIGFyY2hpdGVjdHVyZSBwbGFjZXMgbGltaXRhdGlvbnMgb24KKyAgIHdoYXQgaXMgYSB2YWxpZCBoYXNoIHRhYmxlIHNpemUuCisKKyAgIAorICAgY2xhaW0gPSA8YW55dGhpbmc+IChvcHRpb25hbCkKKworICAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBwcmVzZW50LCB0aGUgbWVtb3J5IHVzZWQgdG8gY29uc3RydWN0IHRoZSBoYXNoCisgICB0YWJsZSB3aWxsIGJlIGNsYWltZWQgZnJvbSB0aGUgbWVtb3J5IGRldmljZS4gIFRoZSBtZW1vcnkgZGV2aWNlCisgICBiZWluZyBzcGVjaWZpZWQgYnkgdGhlIDw8L2Nob3Nlbi9tZW1vcnk+PiBpaGFuZGxlIHByb3BlcnR5LgorCisgICAKKyAgIEVYQU1QTEVTCisgICAKKyAgIEVuYWJsZSB0cmFjaW5nLgorICAgCisgICB8ICAkICBwc2ltIC10IGh0YWItZGV2aWNlIFwKKyAgIAorICAgCisgICBDcmVhdGUgYSBodGFiIHNwZWNpZnlpbmcgdGhlIGJhc2UgYWRkcmVzcyBhbmQgbWluaW11bSBzaXplLgorICAgCisgICB8ICAgIC1vICcvb3BlbnByb20vaW5pdC9odGFiQDB4MTAwMDAvcmVhbC1hZGRyZXNzIDB4MTAwMDAnIFwKKyAgIHwgICAgLW8gJy9vcGVucHJvbS9pbml0L2h0YWJAMHgxMDAwMC9jbGFpbSAwJyBcCisgICB8ICAgIC1vICcvb3BlbnByb20vaW5pdC9odGFiQDB4MTAwMDAvbnItYnl0ZXMgNjU1MzYnIFwKKyAgIAorICAgCisgICBCVUdTCisgICAKKyAgIAorICAgU2VlIHRoZSA8PHB0ZT4+IGRldmljZS4KKyAgIAorICAgCisgICAqLworCisgICAKKy8qIERFVklDRQorCisKKyAgIHB0ZSAtIHBzZXVkby1kZXZpY2UgZGVzY3JpYmluZyBhIGh0YWIgZW50cnkKKworCisgICBERVNDUklQVElPTgorCisgICAKKyAgIFRoZSA8PHB0ZT4+IHBzZXVkby1kZXZpY2UsIHdoaWNoIG11c3QgYmUgYSBjaGlsZCBvZiBhIDw8aHRhYmw+PgorICAgbm9kZSwgZGVzY3JpYmVzIGEgdmlydHVhbCB0byBwaHlzaWNhbCBtYXBwaW5nIHRoYXQgaXMgdG8gYmUgZW50ZXJlZAorICAgaW50byB0aGUgcGFyZW50cyBoYXNoIHRhYmxlLgorICAgCisgICBUd28gYWx0ZXJuYXRpdmUgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIG1hcHBpbmcgYXJlIGFsbG93ZWQuICBFaXRoZXIKKyAgIGEgc2VjdGlvbiBvZiBwaHlzaWNhbCBtZW1vcnkgY2FuIGJlIG1hcHBlZCB0byBhIHZpcnR1YWwgYWRkcmVzcywgb3IKKyAgIHRoZSBoZWFkZXIgb2YgYW4gZXhlY3V0aWJsZSBpbWFnZSBjYW4gYmUgdXNlZCB0byBkZWZpbmUgdGhlCisgICBtYXBwaW5nLgorICAgCisgICBCeSBjb252ZW50aW9uLCB0aGUgcmVhbCBhZGRyZXNzIG9mIHRoZSBtYXAgaXMgc3BlY2lmaWVkIGFzIHRoZSBwdGUKKyAgIGRldmljZXMgdW5pdCBhZGRyZXNzLgorICAgCisgICAKKyAgIFBST1BFUlRJRVMKKworICAgCisgICByZWFsLWFkZHJlc3MgPSA8YWRkcmVzcz4gKHJlcXVpcmVkKQorCisgICBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYWRkcmVzcyB0aGF0IGlzIHRvIGJlIG1hcHBlZCBieSB0aGUgaGFzaAorICAgdGFibGUuCisKKyAgIAorICAgd2ltZyA9IDxpbnQ+IChyZXF1aXJlZCkKKyAgIHBwID0gPGludD4gKHJlcXVpcmVkKQorCisgICBUaGUgdmFsdWUgb2YgaGFzaCB0YWJsZSBwcm90ZWN0aW9uIGJpdHMgdGhhdCBhcmUgdG8gYmUgdXNlZCB3aGVuCisgICBjcmVhdGluZyB0aGUgdmlydHVhbCB0byBwaHlzaWNhbCBhZGRyZXNzIG1hcC4KKworICAgCisgICBjbGFpbSA9IDxhbnl0aGluZz4gKG9wdGlvbmFsKQorCisgICBJZiB0aGlzIHByb3BlcnR5IGlzIHByZXNlbnQsIHRoZSByZWFsIG1lbW9yeSB0aGF0IGlzIGJlaW5nIG1hcHBlZCBieSB0aGUgCisgICBoYXNoIHRhYmxlIHdpbGwgYmUgY2xhaW1lZCBmcm9tIHRoZSBtZW1vcnkgbm9kZSAoc3BlY2lmaWVkIGJ5IHRoZSAKKyAgIGloYW5kbGUgPDwvY2hvc2VuL21lbW9yeT4+KS4KKyAgIAorCisgICB2aXJ0dWFsLWFkZHJlc3MgPSA8aW50ZWdlcj4gWyA8aW50ZWdlcj4gXSAgKG9wdGlvbiBBKQorICAgbnItYnl0ZXMgPSA8c2l6ZT4gIChvcHRpb24gQSkKKworICAgT3B0aW9uIEEgLSBWaXJ0dWFsIHZpcnR1YWwgYWRkcmVzcyAoYW5kIHNpemUpIGF0IHdoaWNoIHRoZSBwaHlzaWNhbAorICAgYWRkcmVzcyBpcyB0byBiZSBtYXBwZWQuICBJZiBtdWx0aXBsZSB2YWx1ZXMgYXJlIHNwZWNpZmllZCBmb3IgdGhlCisgICB2aXJ0dWFsIGFkZHJlc3MgdGhlbiB0aGV5IGFyZSBjb25jYXRlbmF0ZWQgdG8gZ2V0aGVyIHRvIGZvcm0gYQorICAgbG9uZ2VyIHZpcnR1YWwgYWRkcmVzcy4KKworICAgCisgICBmaWxlLW5hbWUgPSA8c3RyaW5nPiAgKG9wdGlvbiBCKQorCisgICBPcHRpb24gQiAtIEFuIGV4ZWN1dGFibGUgaW1hZ2UgdGhhdCBpcyB0byBiZSBsb2FkZWQgKHN0YXJ0aW5nIGF0CisgICB0aGUgcGh5c2ljYWwgYWRkcmVzcyBzcGVjaWZpZWQgYWJvdmUpIGFuZCB0aGVuIG1hcHBlZCBpbiB1c2luZworICAgaW5mb3JtYXRpb2luIHRha2VuIGZyb20gdGhlIGV4ZWN1dGFibGVzIGhlYWRlci4gIGluZm9ybWF0aW9uIGZvdW5kCisgICBpbiB0aGUgZmlsZXMgaGVhZGVyLgorCisgICAKKyAgIEVYQU1QTEVTCisgICAKKyAgIAorICAgRW5hYmxlIHRyYWNpbmcgKG5vdGUgdGhhdCBib3RoIHRoZSA8PGh0YWI+PiBhbmQgPDxwdGU+PiBkZXZpY2UgdXNlIHRoZSAKKyAgIHNhbWUgdHJhY2Ugb3B0aW9uKS4KKyAgIAorICAgfCAgIC10IGh0YWItZGV2aWNlIFwKKyAgIAorICAgCisgICBNYXAgYSBibG9jayBvZiBwaHlzaWNhbCBtZW1vcnkgaW50byBhIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3M6CisgCQorICAgfCAgLW8gJy9vcGVucHJvbS9pbml0L2h0YWIvcHRlQDB4MC9yZWFsLWFkZHJlc3MgMCcgXAorICAgfCAgLW8gJy9vcGVucHJvbS9pbml0L2h0YWIvcHRlQDB4MC9uci1ieXRlcyA0MDk2JyBcCisgICB8ICAtbyAnL29wZW5wcm9tL2luaXQvaHRhYi9wdGVAMHgwL3ZpcnR1YWwtYWRkcmVzcyAweDEwMDAwMDAnIFwKKyAgIHwgIC1vICcvb3BlbnByb20vaW5pdC9odGFiL3B0ZUAweDAvY2xhaW0gMCcgXAorICAgfCAgLW8gJy9vcGVucHJvbS9pbml0L2h0YWIvcHRlQDB4MC93aW1nIDB4NycgXAorICAgfCAgLW8gJy9vcGVucHJvbS9pbml0L2h0YWIvcHRlQDB4MC9wcCAweDInIFwKKyAgIAorICAgCisgICBNYXAgYSBmaWxlIGludG8gbWVtb3J5LgorICAgCisgICB8ICAtbyAnL29wZW5wcm9tL2luaXQvaHRhYi9wdGVAMHgxMDAwMC9yZWFsLWFkZHJlc3MgMHgxMDAwMCcgXAorICAgfCAgLW8gJy9vcGVucHJvbS9pbml0L2h0YWIvcHRlQDB4MTAwMDAvZmlsZS1uYW1lICJuZXRic2QuZWxmJyBcCisgICB8ICAtbyAnL29wZW5wcm9tL2luaXQvaHRhYi9wdGVAMHgxMDAwMC93aW1nIDB4NycgXAorICAgfCAgLW8gJy9vcGVucHJvbS9pbml0L2h0YWIvcHRlQDB4MTAwMDAvcHAgMHgyJyBcCisgICAKKyAgIAorICAgQlVHUworICAgCisgICAKKyAgIEZvciBhbiBFTEYgZXhlY3V0YWJsZSwgdGhlIGhlYWRlciBkZWZpbmVzIGJvdGggdGhlIHZpcnR1YWwgYW5kIHJlYWwgCisgICBhZGRyZXNzIGF0IHdoaWNoIGVhY2ggZmlsZSBzZWN0aW9uIHNob3VsZCBiZSBsb2FkZWQuICBBdCBwcmVzZW50LCB0aGUgCisgICByZWFsIGFkZHJlc3NlcyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIGhlYWRlciBhcmUgaWdub3JlZCwgdGhlIGZpbGUgCisgICBpbnN0ZWFkIGJlaW5nIGxvYWRlZCBpbiB0byBwaHlzaWNhbCBtZW1vcnkgaW4gYSBsaW5lYXIgZmFzaGlvbi4KKyAgIAorICAgV2hlbiBjbGFpbWluZyBtZW1vcnksIHRoaXMgZGV2aWNlIGFzc3VtZXMgdGhhdCB0aGUgI2FkZHJlc3MtY2VsbHMKKyAgIGFuZCAjc2l6ZS1jZWxscyBpcyBvbmUuICBGb3IgZnV0dXJlIGltcGxlbWVudGF0aW9ucywgdGhpcyBtYXkgbm90CisgICBiZSB0aGUgY2FzZS4KKyAgIAorICAgKi8KKworCisKK3N0YXRpYyB2b2lkCitodGFiX2RlY29kZV9oYXNoX3RhYmxlKGRldmljZSAqbWUsCisJCSAgICAgICB1bnNpZ25lZDMyICpodGFib3JnLAorCQkgICAgICAgdW5zaWduZWQzMiAqaHRhYm1hc2spCit7CisgIHVuc2lnbmVkX3dvcmQgaHRhYl9yYTsKKyAgdW5zaWduZWQgaHRhYl9ucl9ieXRlczsKKyAgdW5zaWduZWQgbjsKKyAgZGV2aWNlICpwYXJlbnQgPSBkZXZpY2VfcGFyZW50KG1lKTsKKyAgLyogZGV0ZXJtaW5lIHRoZSBsb2NhdGlvbi9zaXplIG9mIHRoZSBoYXNoIHRhYmxlICovCisgIGlmIChwYXJlbnQgPT0gTlVMTAorICAgICAgfHwgc3RyY21wKGRldmljZV9uYW1lKHBhcmVudCksICJodGFiIikgIT0gMCkKKyAgICBkZXZpY2VfZXJyb3IocGFyZW50LCAibXVzdCBiZSBhIGh0YWIgZGV2aWNlIik7CisgIGh0YWJfcmEgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KHBhcmVudCwgInJlYWwtYWRkcmVzcyIpOworICBodGFiX25yX2J5dGVzID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShwYXJlbnQsICJuci1ieXRlcyIpOworICBmb3IgKG4gPSBodGFiX25yX2J5dGVzOyBuID4gMTsgbiA9IG4gLyAyKSB7CisgICAgaWYgKG4gJSAyICE9IDApCisgICAgICBkZXZpY2VfZXJyb3IocGFyZW50LCAiaHRhYiBzaXplIDB4JXggbm90IGEgcG93ZXIgb2YgdHdvIiwKKwkJICAgaHRhYl9ucl9ieXRlcyk7CisgIH0KKyAgKmh0YWJvcmcgPSBodGFiX3JhOworICAqaHRhYm1hc2sgPSBNQVNLRUQzMihodGFiX25yX2J5dGVzIC0gMSwgNywgMzEtNik7CisgIGlmICgoaHRhYl9yYSAmIElOU0VSVEVEMzIoKmh0YWJtYXNrLCA3LCAxNSkpICE9IDApIHsKKyAgICBkZXZpY2VfZXJyb3IocGFyZW50LCAiaHRhYm9yZyAweCVseCBub3QgYWxpZ25lZCB0byBodGFibWFzayAweCVseCIsCisJCSAodW5zaWduZWQgbG9uZykqaHRhYm9yZywgKHVuc2lnbmVkIGxvbmcpKmh0YWJtYXNrKTsKKyAgfQorICBEVFJBQ0UoaHRhYiwgKCJodGFiIC0gaHRhYm9yZz0weCVseCBodGFibWFzaz0weCVseFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpKmh0YWJvcmcsICh1bnNpZ25lZCBsb25nKSpodGFibWFzaykpOworfQorCitzdGF0aWMgdm9pZAoraHRhYl9tYXBfcGFnZShkZXZpY2UgKm1lLAorCSAgICAgIHVuc2lnbmVkX3dvcmQgcmEsCisJICAgICAgdW5zaWduZWQ2NCB2YSwKKwkgICAgICB1bnNpZ25lZCB3aW1nLAorCSAgICAgIHVuc2lnbmVkIHBwLAorCSAgICAgIHVuc2lnbmVkMzIgaHRhYm9yZywKKwkgICAgICB1bnNpZ25lZDMyIGh0YWJtYXNrKQoreworICAvKiBrZWVwIGV2ZXJ5dGhpbmcgbGVmdCBzaGlmdGVkIHNvIHRoYXQgdGhlIG51bWJlcmluZyBpcyBlYXNpZXIgKi8KKyAgdW5zaWduZWQ2NCB2cG4gPSB2YSA8PCAxMjsKKyAgdW5zaWduZWQzMiB2c2lkID0gSU5TRVJURUQzMihFWFRSQUNURUQ2NCh2cG4sIDAsIDIzKSwgMCwgMjMpOworICB1bnNpZ25lZDMyIHZwYWdlID0gSU5TRVJURUQzMihFWFRSQUNURUQ2NCh2cG4sIDI0LCAzOSksIDAsIDE1KTsKKyAgdW5zaWduZWQzMiBoYXNoID0gSU5TRVJURUQzMihFWFRSQUNURUQzMih2c2lkLCA1LCAyMykKKwkJCSAgICAgICBeIEVYVFJBQ1RFRDMyKHZwYWdlLCAwLCAxNSksCisJCQkgICAgICAgNywgMzEtNik7CisgIGludCBoOworICBmb3IgKGggPSAwOyBoIDwgMjsgaCsrKSB7CisgICAgdW5zaWduZWQzMiBwdGVnID0gKGh0YWJvcmcgfCAoaGFzaCAmIGh0YWJtYXNrKSk7CisgICAgaW50IHB0aTsKKyAgICBmb3IgKHB0aSA9IDA7IHB0aSA8IDg7IHB0aSsrKSB7CisgICAgICB1bnNpZ25lZDMyIHB0ZSA9IHB0ZWcgKyA4ICogcHRpOworICAgICAgdW5zaWduZWQzMiBjdXJyZW50X3RhcmdldF9wdGUwOworICAgICAgdW5zaWduZWQzMiBjdXJyZW50X3B0ZTA7CisgICAgICBpZiAoZGV2aWNlX2RtYV9yZWFkX2J1ZmZlcihkZXZpY2VfcGFyZW50KG1lKSwKKwkJCQkgJmN1cnJlbnRfdGFyZ2V0X3B0ZTAsCisJCQkJIDAsIC8qc3BhY2UqLworCQkJCSBwdGUsCisJCQkJIHNpemVvZihjdXJyZW50X3RhcmdldF9wdGUwKSkgIT0gNCkKKwlkZXZpY2VfZXJyb3IobWUsICJmYWlsZWQgdG8gcmVhZCBhIHB0ZSBhdCAweCVseCIsICh1bnNpZ25lZCBsb25nKXB0ZSk7CisgICAgICBjdXJyZW50X3B0ZTAgPSBUMkhfNChjdXJyZW50X3RhcmdldF9wdGUwKTsKKyAgICAgIGlmIChNQVNLRUQzMihjdXJyZW50X3B0ZTAsIDAsIDApKSB7CisJLyogZnVsbCBwdGUsIGNoZWNrIGl0IGlzbid0IGFscmVhZHkgbWFwcGluZyB0aGUgc2FtZSB2aXJ0dWFsCisgICAgICAgICAgIGFkZHJlc3MgKi8KKwl1bnNpZ25lZDMyIGN1cnJfdnNpZCA9IElOU0VSVEVEMzIoRVhUUkFDVEVEMzIoY3VycmVudF9wdGUwLCAxLCAyNCksIDAsIDIzKTsKKwl1bnNpZ25lZDMyIGN1cnJfYXBpID0gSU5TRVJURUQzMihFWFRSQUNURUQzMihjdXJyZW50X3B0ZTAsIDI2LCAzMSksIDAsIDUpOworCXVuc2lnbmVkMzIgY3Vycl9oID0gRVhUUkFDVEVEMzIoY3VycmVudF9wdGUwLCAyNSwgMjUpOworCWlmIChjdXJyX2ggPT0gaAorCSAgICAmJiBjdXJyX3ZzaWQgPT0gdnNpZAorCSAgICAmJiBjdXJyX2FwaSA9PSBNQVNLRUQzMih2cGFnZSwgMCwgNSkpCisJICBkZXZpY2VfZXJyb3IobWUsICJkdXBsaWNhdGUgbWFwIC0gdmE9MHglMDhseCByYT0weCVseCB2c2lkPTB4JWx4IGg9JWQgdnBhZ2U9MHglbHggaGFzaD0weCVseCBwdGVnPTB4JWx4KyUyZCBwdGUwPTB4JWx4IiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKXZhLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmEsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyl2c2lkLAorCQkgICAgICAgaCwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKXZwYWdlLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpaGFzaCwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKXB0ZWcsCisJCSAgICAgICBwdGkgKiA4LAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpY3VycmVudF9wdGUwKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworCS8qIGVtcHR5IHB0ZSBmaWxsIGl0ICovCisJdW5zaWduZWQzMiBwdGUwID0gKE1BU0szMigwLCAwKQorCQkJICAgfCBJTlNFUlRFRDMyKEVYVFJBQ1RFRDMyKHZzaWQsIDAsIDIzKSwgMSwgMjQpCisJCQkgICB8IElOU0VSVEVEMzIoaCwgMjUsIDI1KQorCQkJICAgfCBJTlNFUlRFRDMyKEVYVFJBQ1RFRDMyKHZwYWdlLCAwLCA1KSwgMjYsIDMxKSk7CisJdW5zaWduZWQzMiB0YXJnZXRfcHRlMCA9IEgyVF80KHB0ZTApOworCXVuc2lnbmVkMzIgcHRlMSA9IChJTlNFUlRFRDMyKEVYVFJBQ1RFRDMyKHJhLCAwLCAxOSksIDAsIDE5KQorCQkJICAgfCBJTlNFUlRFRDMyKHdpbWcsIDI1LCAyOCkKKwkJCSAgIHwgSU5TRVJURUQzMihwcCwgMzAsIDMxKSk7CisJdW5zaWduZWQzMiB0YXJnZXRfcHRlMSA9IEgyVF80KHB0ZTEpOworCWlmIChkZXZpY2VfZG1hX3dyaXRlX2J1ZmZlcihkZXZpY2VfcGFyZW50KG1lKSwKKwkJCQkgICAgJnRhcmdldF9wdGUwLAorCQkJCSAgICAwLCAvKnNwYWNlKi8KKwkJCQkgICAgcHRlLAorCQkJCSAgICBzaXplb2YodGFyZ2V0X3B0ZTApLAorCQkJCSAgICAxLypybz8qLykgIT0gNAorCSAgICB8fCBkZXZpY2VfZG1hX3dyaXRlX2J1ZmZlcihkZXZpY2VfcGFyZW50KG1lKSwKKwkJCQkgICAgICAgJnRhcmdldF9wdGUxLAorCQkJCSAgICAgICAwLCAvKnNwYWNlKi8KKwkJCQkgICAgICAgcHRlICsgNCwKKwkJCQkgICAgICAgc2l6ZW9mKHRhcmdldF9wdGUxKSwKKwkJCQkgICAgICAgMS8qcm8/Ki8pICE9IDQpCisJICBkZXZpY2VfZXJyb3IobWUsICJmYWlsZWQgdG8gd3JpdGUgYSBwdGUgYSAweCVseCIsICh1bnNpZ25lZCBsb25nKXB0ZSk7CisJRFRSQUNFKGh0YWIsICgibWFwIC0gdmE9MHglMDhseCByYT0weCVseCB2c2lkPTB4JWx4IGg9JWQgdnBhZ2U9MHglbHggaGFzaD0weCVseCBwdGVnPTB4JWx4KyUyZCBwdGUwPTB4JWx4IHB0ZTE9MHglbHhcbiIsCisJCSAgICAgICh1bnNpZ25lZCBsb25nKXZhLAorCQkgICAgICAodW5zaWduZWQgbG9uZylyYSwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpdnNpZCwKKwkJICAgICAgaCwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpdnBhZ2UsCisJCSAgICAgICh1bnNpZ25lZCBsb25nKWhhc2gsCisJCSAgICAgICh1bnNpZ25lZCBsb25nKXB0ZWcsCisJCSAgICAgIHB0aSAqIDgsCisJCSAgICAgICh1bnNpZ25lZCBsb25nKXB0ZTAsCisJCSAgICAgICh1bnNpZ25lZCBsb25nKXB0ZTEpKTsKKwlyZXR1cm47CisgICAgICB9CisgICAgfQorICAgIC8qIHJlLWhhc2ggKi8KKyAgICBoYXNoID0gTUFTS0VEMzIofmhhc2gsIDAsIDE4KTsKKyAgfQorfQorCitzdGF0aWMgdW5zaWduZWRfd29yZAorY2xhaW1fbWVtb3J5KGRldmljZSAqbWUsCisJICAgICBkZXZpY2VfaW5zdGFuY2UgKm1lbW9yeSwKKwkgICAgIHVuc2lnbmVkX3dvcmQgcmEsCisJICAgICB1bnNpZ25lZF93b3JkIHNpemUpCit7CisgIHVuc2lnbmVkMzIgYXJnc1szXTsKKyAgdW5zaWduZWQzMiByZXN1bHRzWzFdOworICBpbnQgc3RhdHVzOworICBhcmdzWzBdID0gMDsgLyogYWxpZ25tZW50ICovCisgIGFyZ3NbMV0gPSBzaXplOworICBhcmdzWzJdID0gcmE7CisgIHN0YXR1cyA9IGRldmljZV9pbnN0YW5jZV9jYWxsX21ldGhvZChtZW1vcnksICJjbGFpbSIsIDMsIGFyZ3MsIDEsIHJlc3VsdHMpOworICBpZiAoc3RhdHVzICE9IDApCisgICAgZGV2aWNlX2Vycm9yKG1lLCAiZmFpbGVkIHRvIGNsYWltIG1lbW9yeSIpOworICByZXR1cm4gcmVzdWx0c1swXTsKK30KKworc3RhdGljIHZvaWQKK2h0YWJfbWFwX3JlZ2lvbihkZXZpY2UgKm1lLAorCQlkZXZpY2VfaW5zdGFuY2UgKm1lbW9yeSwKKwkJdW5zaWduZWRfd29yZCBwdGVfcmEsCisJCXVuc2lnbmVkNjQgcHRlX3ZhLAorCQl1bnNpZ25lZCBucl9ieXRlcywKKwkJdW5zaWduZWQgd2ltZywKKwkJdW5zaWduZWQgcHAsCisJCXVuc2lnbmVkMzIgaHRhYm9yZywKKwkJdW5zaWduZWQzMiBodGFibWFzaykKK3sKKyAgdW5zaWduZWRfd29yZCByYTsKKyAgdW5zaWduZWQ2NCB2YTsKKyAgLyogY2xhaW0gdGhlIG1lbW9yeSAqLworICBpZiAobWVtb3J5ICE9IE5VTEwpCisgICAgY2xhaW1fbWVtb3J5KG1lLCBtZW1vcnksIHB0ZV9yYSwgbnJfYnl0ZXMpOworICAvKiBnbyB0aHJvdWdoIGFsbCBwYWdlcyBhbmQgY3JlYXRlIGEgcHRlIGZvciBlYWNoICovCisgIGZvciAocmEgPSBwdGVfcmEsIHZhID0gcHRlX3ZhOworICAgICAgIHJhIDwgcHRlX3JhICsgbnJfYnl0ZXM7CisgICAgICAgcmEgKz0gMHgxMDAwLCB2YSArPSAweDEwMDApIHsKKyAgICBodGFiX21hcF9wYWdlKG1lLCByYSwgdmEsIHdpbWcsIHBwLCBodGFib3JnLCBodGFibWFzayk7CisgIH0KK30KKyAgCit0eXBlZGVmIHN0cnVjdCBfaHRhYl9iaW5hcnlfc2l6ZXMgeworICB1bnNpZ25lZF93b3JkIHRleHRfcmE7CisgIHVuc2lnbmVkX3dvcmQgdGV4dF9iYXNlOworICB1bnNpZ25lZF93b3JkIHRleHRfYm91bmQ7CisgIHVuc2lnbmVkX3dvcmQgZGF0YV9yYTsKKyAgdW5zaWduZWRfd29yZCBkYXRhX2Jhc2U7CisgIHVuc2lnbmVkIGRhdGFfYm91bmQ7CisgIGRldmljZSAqbWU7Cit9IGh0YWJfYmluYXJ5X3NpemVzOworCitzdGF0aWMgdm9pZAoraHRhYl9zdW1fYmluYXJ5KGJmZCAqYWJmZCwKKwkJc2VjX3B0ciBzZWMsCisJCVBUUiBkYXRhKQoreworICBodGFiX2JpbmFyeV9zaXplcyAqc2l6ZXMgPSAoaHRhYl9iaW5hcnlfc2l6ZXMqKWRhdGE7CisgIHVuc2lnbmVkX3dvcmQgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKTsKKyAgdW5zaWduZWRfd29yZCB2bWEgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpOworI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fbG1hKGFiZmQsIHNlYykgKChzZWMpLT5sbWEgKyAwKQorICB1bnNpZ25lZF93b3JkIHJhID0gYmZkX2dldF9zZWN0aW9uX2xtYSAoYWJmZCwgc2VjKTsKKworICAvKiBza2lwIHRoZSBzZWN0aW9uIGlmIG5vIG1lbW9yeSB0byBhbGxvY2F0ZSAqLworICBpZiAoISAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGFiZmQsIHNlYykgJiBTRUNfQUxMT0MpKQorICAgIHJldHVybjsKKworICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19DT0RFKQorICAgICAgfHwgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19SRUFET05MWSkpIHsKKyAgICBpZiAoc2l6ZXMtPnRleHRfYm91bmQgPCB2bWEgKyBzaXplKQorICAgICAgc2l6ZXMtPnRleHRfYm91bmQgPSBBTElHTl9QQUdFKHZtYSArIHNpemUpOworICAgIGlmIChzaXplcy0+dGV4dF9iYXNlID4gdm1hKQorICAgICAgc2l6ZXMtPnRleHRfYmFzZSA9IEZMT09SX1BBR0Uodm1hKTsKKyAgICBpZiAoc2l6ZXMtPnRleHRfcmEgPiByYSkKKyAgICAgIHNpemVzLT50ZXh0X3JhID0gRkxPT1JfUEFHRShyYSk7CisgIH0KKyAgZWxzZSBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19EQVRBKQorCSAgIHx8IChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQUxMT0MpKSB7CisgICAgaWYgKHNpemVzLT5kYXRhX2JvdW5kIDwgdm1hICsgc2l6ZSkKKyAgICAgIHNpemVzLT5kYXRhX2JvdW5kID0gQUxJR05fUEFHRSh2bWEgKyBzaXplKTsKKyAgICBpZiAoc2l6ZXMtPmRhdGFfYmFzZSA+IHZtYSkKKyAgICAgIHNpemVzLT5kYXRhX2Jhc2UgPSBGTE9PUl9QQUdFKHZtYSk7CisgICAgaWYgKHNpemVzLT5kYXRhX3JhID4gcmEpCisgICAgICBzaXplcy0+ZGF0YV9yYSA9IEZMT09SX1BBR0UocmEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitodGFiX2RtYV9iaW5hcnkoYmZkICphYmZkLAorCQlzZWNfcHRyIHNlYywKKwkJUFRSIGRhdGEpCit7CisgIGh0YWJfYmluYXJ5X3NpemVzICpzaXplcyA9IChodGFiX2JpbmFyeV9zaXplcyopZGF0YTsKKyAgdm9pZCAqc2VjdGlvbl9pbml0OworICB1bnNpZ25lZF93b3JkIHNlY3Rpb25fdm1hOworICB1bnNpZ25lZF93b3JkIHNlY3Rpb25fc2l6ZTsKKyAgdW5zaWduZWRfd29yZCBzZWN0aW9uX3JhOworICBkZXZpY2UgKm1lID0gc2l6ZXMtPm1lOworCisgIC8qIHNraXAgdGhlIHNlY3Rpb24gaWYgbm8gbWVtb3J5IHRvIGFsbG9jYXRlICovCisgIGlmICghIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MoYWJmZCwgc2VjKSAmIFNFQ19BTExPQykpCisgICAgcmV0dXJuOworCisgIC8qIGNoZWNrL2lnbm9yZSBhbnkgc2VjdGlvbnMgb2Ygc2l6ZSB6ZXJvICovCisgIHNlY3Rpb25fc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyhzZWMpOworICBpZiAoc2VjdGlvbl9zaXplID09IDApCisgICAgcmV0dXJuOworCisgIC8qIGlmIG5vdGhpbmcgdG8gbG9hZCwgaWdub3JlIHRoaXMgb25lICovCisgIGlmICghIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MoYWJmZCwgc2VjKSAmIFNFQ19MT0FEKSkKKyAgICByZXR1cm47CisKKyAgLyogZmluZCB3aGVyZSBpdCBpcyB0byBnbyAqLworICBzZWN0aW9uX3ZtYSA9IGJmZF9nZXRfc2VjdGlvbl92bWEoYWJmZCwgc2VjKTsKKyAgc2VjdGlvbl9yYSA9IDA7CisgIGlmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0NPREUpCisgICAgICB8fCAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX1JFQURPTkxZKSkKKyAgICBzZWN0aW9uX3JhID0gKHNlY3Rpb25fdm1hIC0gc2l6ZXMtPnRleHRfYmFzZSArIHNpemVzLT50ZXh0X3JhKTsKKyAgZWxzZSBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19EQVRBKSkKKyAgICBzZWN0aW9uX3JhID0gKHNlY3Rpb25fdm1hIC0gc2l6ZXMtPmRhdGFfYmFzZSArIHNpemVzLT5kYXRhX3JhKTsKKyAgZWxzZSAKKyAgICByZXR1cm47IC8qIGp1c3QgaWdub3JlIGl0ICovCisKKyAgRFRSQUNFKGh0YWIsCisJICgibG9hZCAtIG5hbWU9JS03cyB2bWE9MHglLjhseCBzaXplPSU2bGQgcmE9MHglLjhseCBmbGFncz0lM2x4KCVzJXMlcyVzJXMgKVxuIiwKKwkgIGJmZF9nZXRfc2VjdGlvbl9uYW1lKGFiZmQsIHNlYyksCisJICAobG9uZylzZWN0aW9uX3ZtYSwKKwkgIChsb25nKXNlY3Rpb25fc2l6ZSwKKwkgIChsb25nKXNlY3Rpb25fcmEsCisJICAobG9uZyliZmRfZ2V0X3NlY3Rpb25fZmxhZ3MoYWJmZCwgc2VjKSwKKwkgIGJmZF9nZXRfc2VjdGlvbl9mbGFncyhhYmZkLCBzZWMpICYgU0VDX0xPQUQgPyAiIExPQUQiIDogIiIsCisJICBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MoYWJmZCwgc2VjKSAmIFNFQ19DT0RFID8gIiBDT0RFIiA6ICIiLAorCSAgYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGFiZmQsIHNlYykgJiBTRUNfREFUQSA/ICIgREFUQSIgOiAiIiwKKwkgIGJmZF9nZXRfc2VjdGlvbl9mbGFncyhhYmZkLCBzZWMpICYgU0VDX0FMTE9DID8gIiBBTExPQyIgOiAiIiwKKwkgIGJmZF9nZXRfc2VjdGlvbl9mbGFncyhhYmZkLCBzZWMpICYgU0VDX1JFQURPTkxZID8gIiBSRUFET05MWSIgOiAiIgorCSAgKSk7CisKKyAgLyogZG1hIGluIHRoZSBzZWN0aW9ucyBkYXRhICovCisgIHNlY3Rpb25faW5pdCA9IHphbGxvYyhzZWN0aW9uX3NpemUpOworICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyhhYmZkLAorCQkJCXNlYywKKwkJCQlzZWN0aW9uX2luaXQsIDAsCisJCQkJc2VjdGlvbl9zaXplKSkgeworICAgIGJmZF9wZXJyb3IoImRldmljZXMvcHRlIik7CisgICAgZGV2aWNlX2Vycm9yKG1lLCAibm8gZGF0YSBsb2FkZWQiKTsKKyAgfQorICBpZiAoZGV2aWNlX2RtYV93cml0ZV9idWZmZXIoZGV2aWNlX3BhcmVudChtZSksCisJCQkgICAgICBzZWN0aW9uX2luaXQsCisJCQkgICAgICAwIC8qc3BhY2UqLywKKwkJCSAgICAgIHNlY3Rpb25fcmEsCisJCQkgICAgICBzZWN0aW9uX3NpemUsCisJCQkgICAgICAxIC8qdmlvbGF0ZV9yZWFkX29ubHkqLykKKyAgICAgICE9IHNlY3Rpb25fc2l6ZSkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJicm9rZW4gZG1hIHRyYW5zZmVyIik7CisgIHpmcmVlKHNlY3Rpb25faW5pdCk7IC8qIG9ubHkgZnJlZSBpZiBsb2FkICovCit9CisKKy8qIGNyZWF0ZSBhIG1lbW9yeSBtYXAgZnJvbSBhIGJpbmFyaWVzIHZpcnR1YWwgYWRkcmVzc2VzIHRvIGEgY29weSBvZgorICAgdGhlIGJpbmFyeSBsYWlkIG91dCBsaW5lYXJseSBpbiBtZW1vcnkgKi8KKworc3RhdGljIHZvaWQKK2h0YWJfbWFwX2JpbmFyeShkZXZpY2UgKm1lLAorCQlkZXZpY2VfaW5zdGFuY2UgKm1lbW9yeSwKKwkJdW5zaWduZWRfd29yZCByYSwKKwkJdW5zaWduZWQgd2ltZywKKwkJdW5zaWduZWQgcHAsCisJCWNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKKwkJdW5zaWduZWQzMiBodGFib3JnLAorCQl1bnNpZ25lZDMyIGh0YWJtYXNrKQoreworICBodGFiX2JpbmFyeV9zaXplcyBzaXplczsKKyAgYmZkICppbWFnZTsKKyAgc2l6ZXMudGV4dF9yYSA9IC0xOworICBzaXplcy5kYXRhX3JhID0gLTE7CisgIHNpemVzLnRleHRfYmFzZSA9IC0xOworICBzaXplcy5kYXRhX2Jhc2UgPSAtMTsKKyAgc2l6ZXMudGV4dF9ib3VuZCA9IDA7CisgIHNpemVzLmRhdGFfYm91bmQgPSAwOworICBzaXplcy5tZSA9IG1lOworCisgIC8qIG9wZW4gdGhlIGZpbGUgKi8KKyAgaW1hZ2UgPSBiZmRfb3BlbnIoZmlsZV9uYW1lLCBOVUxMKTsKKyAgaWYgKGltYWdlID09IE5VTEwpIHsKKyAgICBiZmRfcGVycm9yKCJkZXZpY2VzL3B0ZSIpOworICAgIGRldmljZV9lcnJvcihtZSwgInRoZSBmaWxlICVzIG5vdCBsb2FkZWQiLCBmaWxlX25hbWUpOworICB9CisKKyAgLyogY2hlY2sgaXQgaXMgdmFsaWQgKi8KKyAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0KGltYWdlLCBiZmRfb2JqZWN0KSkgeworICAgIGJmZF9jbG9zZShpbWFnZSk7CisgICAgZGV2aWNlX2Vycm9yKG1lLCAidGhlIGZpbGUgJXMgaGFzIGFuIGludmFsaWQgYmluYXJ5IGZvcm1hdCIsIGZpbGVfbmFtZSk7CisgIH0KKworICAvKiBkZXRlcm1pbmUgdGhlIHNpemUgb2YgZWFjaCBvZiB0aGUgZmlsZXMgcmVnaW9ucyAqLworICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGltYWdlLCBodGFiX3N1bV9iaW5hcnksIChQVFIpICZzaXplcyk7CisKKyAgLyogaWYgbmVlZGVkLCBkZXRlcm1pbmUgdGhlIHJlYWwgYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucyAqLworICBpZiAocmEgIT0gLTEpIHsKKyAgICBzaXplcy50ZXh0X3JhID0gcmE7CisgICAgc2l6ZXMuZGF0YV9yYSA9IEFMSUdOX1BBR0Uoc2l6ZXMudGV4dF9yYSArIAorCQkJICAgICAgIChzaXplcy50ZXh0X2JvdW5kIC0gc2l6ZXMudGV4dF9iYXNlKSk7CisgIH0KKworICBEVFJBQ0UoaHRhYiwgKCJ0ZXh0IG1hcCAtIGJhc2U9MHglbHggYm91bmQ9MHglbHgtMSByYT0weCVseFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpc2l6ZXMudGV4dF9iYXNlLAorCQkodW5zaWduZWQgbG9uZylzaXplcy50ZXh0X2JvdW5kLAorCQkodW5zaWduZWQgbG9uZylzaXplcy50ZXh0X3JhKSk7CisgIERUUkFDRShodGFiLCAoImRhdGEgbWFwIC0gYmFzZT0weCVseCBib3VuZD0weCVseC0xIHJhPTB4JWx4XG4iLAorCQkodW5zaWduZWQgbG9uZylzaXplcy5kYXRhX2Jhc2UsCisJCSh1bnNpZ25lZCBsb25nKXNpemVzLmRhdGFfYm91bmQsCisJCSh1bnNpZ25lZCBsb25nKXNpemVzLmRhdGFfcmEpKTsKKworICAvKiBjaGVjayBmb3IgYW5kIGZpeCBhIGJvdGNoZWQgaW1hZ2UgKHRleHQgYW5kIGRhdGEgc2VnbWVudHMKKyAgICAgb3ZlcmxhcCkgKi8KKyAgaWYgKChzaXplcy50ZXh0X2Jhc2UgPD0gc2l6ZXMuZGF0YV9iYXNlCisgICAgICAgJiYgc2l6ZXMudGV4dF9ib3VuZCA+PSBzaXplcy5kYXRhX2JvdW5kKQorICAgICAgfHwgKHNpemVzLmRhdGFfYmFzZSA8PSBzaXplcy50ZXh0X2Jhc2UKKwkgICYmIHNpemVzLmRhdGFfYm91bmQgPj0gc2l6ZXMuZGF0YV9ib3VuZCkKKyAgICAgIHx8IChzaXplcy50ZXh0X2JvdW5kID4gc2l6ZXMuZGF0YV9iYXNlCisJICAmJiBzaXplcy50ZXh0X2JvdW5kIDw9IHNpemVzLmRhdGFfYm91bmQpCisgICAgICB8fCAoc2l6ZXMudGV4dF9iYXNlID49IHNpemVzLmRhdGFfYmFzZQorCSAgJiYgc2l6ZXMudGV4dF9iYXNlIDwgc2l6ZXMuZGF0YV9ib3VuZCkpIHsKKyAgICBEVFJBQ0UoaHRhYiwgKCJ0ZXh0IGFuZCBkYXRhIHNlZ21lbnQgb3ZlcmxhcGVkIC0gdXNpbmcganVzdCBkYXRhIHNlZ21lbnRcbiIpKTsKKyAgICAvKiBjaGVjayB2YS0+cmEgbGluZWFyICovCisgICAgaWYgKChzaXplcy50ZXh0X2Jhc2UgLSBzaXplcy50ZXh0X3JhKQorCSE9IChzaXplcy5kYXRhX2Jhc2UgLSBzaXplcy5kYXRhX3JhKSkKKyAgICAgIGRldmljZV9lcnJvcihtZSwgIm92ZXJsYXBwaW5nIGJ1dCBtaXNzYWxpZ25lZCB0ZXh0IGFuZCBkYXRhIHNlZ21lbnRzIik7CisgICAgLyogZW5sYXJnZSB0aGUgZGF0YSBzZWdtZW50ICovCisgICAgaWYgKHNpemVzLnRleHRfYmFzZSA8IHNpemVzLmRhdGFfYmFzZSkKKyAgICAgIHNpemVzLmRhdGFfYmFzZSA9IHNpemVzLnRleHRfYmFzZTsKKyAgICBpZiAoc2l6ZXMudGV4dF9ib3VuZCA+IHNpemVzLmRhdGFfYm91bmQpCisgICAgICBzaXplcy5kYXRhX2JvdW5kID0gc2l6ZXMudGV4dF9ib3VuZDsKKyAgICBpZiAoc2l6ZXMudGV4dF9yYSA8IHNpemVzLmRhdGFfcmEpCisgICAgICBzaXplcy5kYXRhX3JhID0gc2l6ZXMudGV4dF9yYTsKKyAgICAvKiB6YXAgdGhlIHRleHQgc2VnbWVudCAqLworICAgIHNpemVzLnRleHRfYmFzZSA9IDA7CisgICAgc2l6ZXMudGV4dF9ib3VuZCA9IDA7CisgICAgc2l6ZXMudGV4dF9yYSA9IDA7CisgICAgRFRSQUNFKGh0YWIsICgiY29tbW9uIG1hcCAtIGJhc2U9MHglbHggYm91bmQ9MHglbHgtMSByYT0weCVseFxuIiwKKwkJICAodW5zaWduZWQgbG9uZylzaXplcy5kYXRhX2Jhc2UsCisJCSAgKHVuc2lnbmVkIGxvbmcpc2l6ZXMuZGF0YV9ib3VuZCwKKwkJICAodW5zaWduZWQgbG9uZylzaXplcy5kYXRhX3JhKSk7CisgIH0KKworICAvKiBzZXQgdXAgdmlydHVhbCBtZW1vcnkgbWFwcyBmb3IgZWFjaCBvZiB0aGUgcmVnaW9ucyAqLworICBodGFiX21hcF9yZWdpb24obWUsIG1lbW9yeSwgc2l6ZXMudGV4dF9yYSwgc2l6ZXMudGV4dF9iYXNlLAorCQkgIHNpemVzLnRleHRfYm91bmQgLSBzaXplcy50ZXh0X2Jhc2UsCisJCSAgd2ltZywgcHAsCisJCSAgaHRhYm9yZywgaHRhYm1hc2spOworCisgIGh0YWJfbWFwX3JlZ2lvbihtZSwgbWVtb3J5LCBzaXplcy5kYXRhX3JhLCBzaXplcy5kYXRhX2Jhc2UsCisJCSAgc2l6ZXMuZGF0YV9ib3VuZCAtIHNpemVzLmRhdGFfYmFzZSwKKwkJICB3aW1nLCBwcCwKKwkJICBodGFib3JnLCBodGFibWFzayk7CisKKyAgLyogZG1hIHRoZSBzZWN0aW9ucyBpbnRvIHBoeXNpY2FsIG1lbW9yeSAqLworICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGltYWdlLCBodGFiX2RtYV9iaW5hcnksIChQVFIpICZzaXplcyk7Cit9CisKK3N0YXRpYyB2b2lkCitodGFiX2luaXRfZGF0YV9jYWxsYmFjayhkZXZpY2UgKm1lKQoreworICBkZXZpY2VfaW5zdGFuY2UgKm1lbW9yeSA9IE5VTEw7CisgIGlmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgIT0gMzIpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAib25seSAzMmJpdCB0YXJnZXRzIGN1cnJlbnRseSBzdXBvcnRlZCIpOworCisgIC8qIGZpbmQgbWVtb3J5IGRldmljZSAqLworICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJjbGFpbSIpICE9IE5VTEwpCisgICAgbWVtb3J5ID0gdHJlZV9maW5kX2loYW5kbGVfcHJvcGVydHkobWUsICIvY2hvc2VuL21lbW9yeSIpOworCisgIC8qIGZvciB0aGUgaHRhYiwganVzdCBhbGxvY2F0ZSBzcGFjZSBmb3IgaXQgKi8KKyAgaWYgKHN0cmNtcChkZXZpY2VfbmFtZShtZSksICJodGFiIikgPT0gMCkgeworICAgIHVuc2lnbmVkX3dvcmQgYWRkcmVzcyA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJyZWFsLWFkZHJlc3MiKTsKKyAgICB1bnNpZ25lZF93b3JkIGxlbmd0aCA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJuci1ieXRlcyIpOworICAgIHVuc2lnbmVkX3dvcmQgYmFzZSA9IGNsYWltX21lbW9yeShtZSwgbWVtb3J5LCBhZGRyZXNzLCBsZW5ndGgpOworICAgIGlmIChiYXNlID09IC0xIHx8IGJhc2UgIT0gYWRkcmVzcykKKyAgICAgIGRldmljZV9lcnJvcihtZSwgImNhbm5vdCBhbGxvY2F0ZSBoYXNoIHRhYmxlIik7CisgIH0KKworICAvKiBmb3IgdGhlIHB0ZSwgZG8gYWxsIHRoZSByZWFsIHdvcmsgKi8KKyAgaWYgKHN0cmNtcChkZXZpY2VfbmFtZShtZSksICJwdGUiKSA9PSAwKSB7CisgICAgdW5zaWduZWQzMiBodGFib3JnOworICAgIHVuc2lnbmVkMzIgaHRhYm1hc2s7CisKKyAgICBodGFiX2RlY29kZV9oYXNoX3RhYmxlKG1lLCAmaHRhYm9yZywgJmh0YWJtYXNrKTsKKworICAgIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgImZpbGUtbmFtZSIpICE9IE5VTEwpIHsKKyAgICAgIC8qIG1hcCBpbiBhIGJpbmFyeSAqLworICAgICAgdW5zaWduZWQgcHRlX3dpbWcgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAid2ltZyIpOworICAgICAgdW5zaWduZWQgcHRlX3BwID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgInBwIik7CisgICAgICBjb25zdCBjaGFyICpmaWxlX25hbWUgPSBkZXZpY2VfZmluZF9zdHJpbmdfcHJvcGVydHkobWUsICJmaWxlLW5hbWUiKTsKKyAgICAgIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgInJlYWwtYWRkcmVzcyIpICE9IE5VTEwpIHsKKwl1bnNpZ25lZDMyIHB0ZV9yYSA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJyZWFsLWFkZHJlc3MiKTsKKwlEVFJBQ0UoaHRhYiwgKCJwdGUgLSByYT0weCVseCwgd2ltZz0lbGQsIHBwPSVsZCwgZmlsZS1uYW1lPSVzXG4iLAorCQkgICAgICAodW5zaWduZWQgbG9uZylwdGVfcmEsCisJCSAgICAgICh1bnNpZ25lZCBsb25nKXB0ZV93aW1nLAorCQkgICAgICAobG9uZylwdGVfcHAsCisJCSAgICAgIGZpbGVfbmFtZSkpOworCWh0YWJfbWFwX2JpbmFyeShtZSwgbWVtb3J5LCBwdGVfcmEsIHB0ZV93aW1nLCBwdGVfcHAsIGZpbGVfbmFtZSwKKwkJCWh0YWJvcmcsIGh0YWJtYXNrKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworCURUUkFDRShodGFiLCAoInB0ZSAtIHdpbWc9JWxkLCBwcD0lbGQsIGZpbGUtbmFtZT0lc1xuIiwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpcHRlX3dpbWcsCisJCSAgICAgIChsb25nKXB0ZV9wcCwKKwkJICAgICAgZmlsZV9uYW1lKSk7CisJaHRhYl9tYXBfYmluYXJ5KG1lLCBtZW1vcnksIC0xLCBwdGVfd2ltZywgcHRlX3BwLCBmaWxlX25hbWUsCisJCQlodGFib3JnLCBodGFibWFzayk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgLyogaGFuZGxlIGEgbm9ybWFsIG1hcHBpbmcgZGVmaW5pdGlvbiAqLworICAgICAgdW5zaWduZWQ2NCBwdGVfdmEgPSAwOworICAgICAgdW5zaWduZWQzMiBwdGVfcmEgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAicmVhbC1hZGRyZXNzIik7CisgICAgICB1bnNpZ25lZCBwdGVfbnJfYnl0ZXMgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAibnItYnl0ZXMiKTsKKyAgICAgIHVuc2lnbmVkIHB0ZV93aW1nID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgIndpbWciKTsKKyAgICAgIHVuc2lnbmVkIHB0ZV9wcCA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJwcCIpOworICAgICAgc2lnbmVkX2NlbGwgcGFydGlhbF92YTsKKyAgICAgIGludCBpOworICAgICAgZm9yIChpID0gMDsKKwkgICBkZXZpY2VfZmluZF9pbnRlZ2VyX2FycmF5X3Byb3BlcnR5KG1lLCAidmlydHVhbC1hZGRyZXNzIiwgaSwgJnBhcnRpYWxfdmEpOworCSAgIGkrKykgeworCXB0ZV92YSA9IChwdGVfdmEgPDwgV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFKSB8ICh1bnNpZ25lZF9jZWxsKXBhcnRpYWxfdmE7CisgICAgICB9CisgICAgICBEVFJBQ0UoaHRhYiwgKCJwdGUgLSByYT0weCVseCwgd2ltZz0lbGQsIHBwPSVsZCwgdmE9MHglbHgsIG5yX2J5dGVzPSVsZFxuIiwKKwkJICAgICh1bnNpZ25lZCBsb25nKXB0ZV9yYSwKKwkJICAgIChsb25nKXB0ZV93aW1nLAorCQkgICAgKGxvbmcpcHRlX3BwLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpcHRlX3ZhLAorCQkgICAgKGxvbmcpcHRlX25yX2J5dGVzKSk7CisgICAgICBodGFiX21hcF9yZWdpb24obWUsIG1lbW9yeSwgcHRlX3JhLCBwdGVfdmEsIHB0ZV9ucl9ieXRlcywgcHRlX3dpbWcsIHB0ZV9wcCwKKwkJICAgICAgaHRhYm9yZywgaHRhYm1hc2spOworICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyBkZXZpY2VfY2FsbGJhY2tzIGNvbnN0IGh0YWJfY2FsbGJhY2tzID0geworICB7IE5VTEwsIGh0YWJfaW5pdF9kYXRhX2NhbGxiYWNrLCB9LAorICB7IE5VTEwsIH0sIC8qIGFkZHJlc3MgKi8KKyAgeyBOVUxMLCB9LCAvKiBJTyAqLworICB7IHBhc3N0aHJvdWdoX2RldmljZV9kbWFfcmVhZF9idWZmZXIsCisgICAgcGFzc3Rocm91Z2hfZGV2aWNlX2RtYV93cml0ZV9idWZmZXIsIH0sCisgIHsgTlVMTCwgfSwgLyogaW50ZXJydXB0ICovCisgIHsgZ2VuZXJpY19kZXZpY2VfdW5pdF9kZWNvZGUsCisgICAgZ2VuZXJpY19kZXZpY2VfdW5pdF9lbmNvZGUsIH0sCit9OworCitjb25zdCBkZXZpY2VfZGVzY3JpcHRvciBod19odGFiX2RldmljZV9kZXNjcmlwdG9yW10gPSB7CisgIHsgImh0YWIiLCBOVUxMLCAmaHRhYl9jYWxsYmFja3MgfSwKKyAgeyAicHRlIiwgTlVMTCwgJmh0YWJfY2FsbGJhY2tzIH0sIC8qIHllcCAtIHVzZXMgaHRhYidzIHRhYmxlICovCisgIHsgTlVMTCB9LAorfTsKKworI2VuZGlmIC8qIF9IV19IVEFCX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2h3X2lkZS5jIGIvc2ltL3BwYy9od19pZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGQ1NGIzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9od19pZGUuYwpAQCAtMCwwICsxLDg2OSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgX0hXX0lERV9DXworI2RlZmluZSBfSFdfSURFX0NfCisKKyNpbmNsdWRlICJkZXZpY2VfdGFibGUuaCIKKworCisKKy8qIERFVklDRQorCisKKyAgIGlkZSAtIEludGVncmF0ZWQgRGlzayBFbGVjdHJvbmljcworCisKKyAgIERFU0NSSVBUSU9OCisKKworICAgVGhpcyBkZXZpY2UgbW9kZWxzIHRoZSBwcmltYXJ5L3NlY29uZGFyeSA8PGlkZT4+IGNvbnRyb2xsZXIKKyAgIGRlc2NyaWJlZCBpbiB0aGUgW0NIUlBJT10gZG9jdW1lbnQuCisKKyAgIFRoZSBjb250cm9sbGVyIGhhcyBzZXBhcmF0ZSBpbmRlcGVuZGFudCBpbnRlcnJ1cHQgb3V0cHV0cyBmb3IgZWFjaAorICAgPDxpZGU+PiBidXMuCisKKworICAgUFJPUEVSVElFUworCisKKyAgIHJlZyA9IC4uLiAgKHJlcXVpcmVkKQorCisgICBUaGUgPDxyZWc+PiBwcm9wZXJ0eSBpcyBkZXNjcmliZWQgaW4gdGhlIGRvY3VtZW50IFtDSFJQSU9dLgorCisKKyAgIHJlYWR5LWRlbGF5ID0gPGludGVnZXI+ICAob3B0aW9uYWwpCisKKyAgIElmIHByZXNlbnQsIHRoaXMgc3BlY2lmaWVzIHRoZSB0aW1lIHRoYXQgdGhlIDw8aWRlPj4gZGV2aWNlIHRha2VzCisgICB0byBjb21wbGV0ZSBhbiBJL08gb3BlcmF0aW9uLgorCisKKyAgIGRpc2tAPy9pZGUtYnl0ZS1jb3VudCA9IDxpbnRlZ2VyPiAgKG9wdGlvbmFsKQorCisgICBkaXNrQD8vaWRlLXNlY3Rvci1jb3VudCA9IDxpbnRlZ2VyPiAgKG9wdGlvbmFsKQorCisgICBkaXNrQD8vaWRlLWhlYWQtY291bnQgPSA8aW50ZWdlcj4gIChvcHRpb25hbCkKKworICAgVGhlIDw8aWRlPj4gZGV2aWNlIGNoZWNrcyBlYWNoIGNoaWxkIChkaXNrIGRldmljZSkgbm9kZSB0byBzZWUgaWYKKyAgIGl0IGhhcyB0aGUgYWJvdmUgcHJvcGVydGllcy4gIElmIHByZXNlbnQsIHRoZXNlIHZhbHVlcyB3aWxsIGJlIHVzZWQKKyAgIHRvIGNvbXB1dGUgdGhlIDw8TEJBPj4gYWRkcmVzcyBpbiA8PENIUz4+IGFkZHJlc3NpbmcgbW9kZS4KKworCisgICBFWEFNUExFUworCisKKyAgIEVuYWJsZSB0cmFjaW5nOgorCisgICB8ICAtdCBpZGUtZGV2aWNlIFwKKworCisgICBBdHRhY2ggdGhlIDw8aWRlPj4gZGV2aWNlIHRvIHRoZSA8PHBjaT4+IGJ1cyBhdCBzbG90IG9uZS4gIFNwZWNpZnkKKyAgIGxlZ2FjeSBJL08gYWRkcmVzc2VzOgorCisgICB8ICAtbyAnL3BoYi9pZGVAMS9hc3NpZ25lZC1hZGRyZXNzZXMgXAorICAgfCAgICAgICAgbmkwLDAsMTAsMWYwIDggXAorICAgfCAgICAgICAgbmkwLDAsMTQsM2Y4IDggXAorICAgfCAgICAgICAgbmkwLDAsMTgsMTcwIDggXAorICAgfCAgICAgICAgbmkwLDAsMWMsMzc4IDggXAorICAgfCAgICAgICAgbmkwLDAsMjAsMjAwIDgnIFwKKyAgIHwgIC1vICcvcGhiQDB4ODAwMDAwMDAvaWRlQDEvcmVnIFwKKyAgIHwgICAgICAgIDEgMCBcCisgICB8ICAgICAgICBpMCwwLDEwLDAgOCBcCisgICB8ICAgICAgICBpMCwwLDE4LDAgOCBcCisgICB8ICAgICAgICBpMCwwLDE0LDYgMSBcCisgICB8ICAgICAgICBpMCwwLDFjLDYgMSBcCisgICB8ICAgICAgICBpMCwwLDIwLDAgOCcgXAorCisgICBOb3RlOiB0aGUgZm91dGggYW5kIGZpZnRoIHJlZyBlbnRyaWVzIHNwZWNpZnkgdGhhdCB0aGUgcmVnaXN0ZXIgaXMKKyAgIGF0IGFuIG9mZnNldCBpbnRvIHRoZSBhZGRyZXNzIHNwZWNpZmllZCBieSB0aGUgYmFzZSByZWdpc3RlcgorICAgKDw8YXNzaWduZWQtYWRkcmVzc2VzPj4pOyBBcGFydCBmcm9tIHJlc3RyaWN0aW9ucyBwbGFjZWQgYnkgdGhlCisgICA8PHBjaT4+IHNwZWNpZmljYXRpb24sIG5vIHJlc3RyaWN0aW9ucyBhcmUgcGxhY2VkIG9uIHRoZSBudW1iZXIgb2YKKyAgIGJhc2UgcmVnaXN0ZXJzIHNwZWNpZmllZCBieSB0aGUgPDxhc3NpZ25lZC1hZGRyZXNzZXM+PiBwcm9wZXJ0eS4KKyAgIAorICAgQXR0YWNoIGEgPDxkaXNrPj4gdG8gdGhlIHByaW1hcnkgYW5kIGEgPDxjZHJvbT4+IHRvIHRoZSBzZWNvbmRhcnkKKyAgIDw8aWRlPj4gY29udHJvbGxlci4KKworICAgfCAgLW8gJy9waGJAMHg4MDAwMDAwMC9pZGVAMS9kaXNrQDAvZmlsZSAiemVybycgXAorICAgfCAgLW8gJy9waGJAMHg4MDAwMDAwMC9pZGVAMS9jZHJvbUAyL2ZpbGUgIi9kZXYvY2Ryb20iJyBcCisKKyAgIENvbm5lY3QgdGhlIHR3byBpbnRlcnJ1cHQgb3V0cHV0cyAoYSBhbmQgYikgdG8gYSA8PGdsdWU+PiBkZXZpY2UgdG8KKyAgIGFsbG93IHRlc3Rpbmcgb2YgdGhlIGludGVycnVwdCBwb3J0LiBJbiBhIHJlYWwgc2ltdWxhdGlvbiB0aGV5CisgICB3b3VsZCBiZSB3aXJlZCB0byB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIuCisKKyAgIHwgIC1vICcvcGhiQDB4ODAwMDAwMDAvZ2x1ZUAyL3JlZyAyIDAgbmkwLDAsMCwwIDgnIFwKKyAgIHwgIC1vICcvcGhiQDB4ODAwMDAwMDAvaWRlQDEgPiBhIDAgL3BoYkAweDgwMDAwMDAwL2dsdWVAMicgXAorICAgfCAgLW8gJy9waGJAMHg4MDAwMDAwMC9pZGVAMSA+IGIgMSAvcGhiQDB4ODAwMDAwMDAvZ2x1ZUAyJyAKKworICAgCisgICBCVUdTCisgICAKKworICAgV2hpbGUgdGhlIERNQSByZWdpc3RlcnMgYXJlIHByZXNlbnQsIERNQSBzdXBwb3J0IGhhcyBub3QgeWV0IGJlZW4KKyAgIGltcGxlbWVudGVkLgorCisgICBUaGUgbnVtYmVyIG9mIHN1cHBvcnRlZCBjb21tYW5kcyBpcyB2ZXJ5IGxpbWl0ZWQuCisKKyAgIFRoZSBzdGFuZGFyZHMgZG9jdW1lbnRzIGFwcGVhciB0byBiZSB2YWd1ZSBvbiBob3cgdG8gc3BlY2lmeSB0aGUKKyAgIDw8dW5pdC1hZGRyZXNzPj4gb2YgZGlzayBkZXZpY2VzIGRldmljZXMgYmVpbmcgYXR0YWNoZWQgdG8gdGhlCisgICA8PGlkZT4+IGNvbnRyb2xsZXIuICBJJ3ZlIGNob3NlbiB0byB1c2UgaW50ZWdlcnMgd2l0aCBkZXZpY2VzIHplcm8KKyAgIGFuZCBvbmUgZ29pbmcgdG8gdGhlIHByaW1hcnkgY29udHJvbGxlciB3aGlsZSB0d28gYW5kIHRocmVlIGFyZQorICAgY29ubmVjdGVkIHRvIHRoZSBzZWNvbmRhcnkgY29udHJvbGxlci4KKworCisgICBSRUZFUkVOQ0VTCisKKworICAgW0NIUlBJT10gUG93ZXJQQyh0bSkgTWljcm9wcm9jZXNzb3IgQ29tbW9uIEhhcmR3YXJlIFJlZmVyZW5jZQorICAgUGxhdGZvcm06IEkvTyBEZXZpY2UgUmVmZXJlbmNlLiAgaHR0cDovL2NocnAuYXBwbGUuY29tLz8/Py4KKworICAgW1NDSE1JRFRdIFRoZSBTQ1NJIEJ1cyBhbmQgSURFIEludGVyZmFjZSAtIFByb3RvY29scywgQXBwbGljYXRpb25zCisgICBhbmQgUHJvZ3JhbW1pbmcuICBGcmllZGhlbG0gU2NobWlkdCAodHJhbnNsYXRlZCBieSBNaWNoYWVsCisgICBTY2h1bHR6KS4gIElTQk4gMC0yMDEtNDIyODQtMC4gIEFkZGlzb24tV2VzbGV5IFB1Ymxpc2hpbmcgQ29tcGFueS4KKworCisgICAqLworCisgICAKKwordHlwZWRlZiBlbnVtIF9pb19kaXJlY3Rpb24geworICBpc19yZWFkLAorICBpc193cml0ZSwKK30gaW9fZGlyZWN0aW9uOworCisKK2VudW0geworICBucl9pZGVfY29udHJvbGxlcnMgPSAyLAorICBucl9pZGVfZHJpdmVzX3Blcl9jb250cm9sbGVyID0gMiwKKyAgbnJfZmlmb19lbnRyaWVzID0gODE5MiwKK307CisKK2VudW0geworICAvKiBjb21tYW5kIHJlZ2lzdGVyIGJsb2NrIC0gcmVhZCAqLworICBpZGVfZGF0YV9yZWcsCisgIGlkZV9lcnJvcl9yZWcsIC8qaWRlX2ZlYXR1cmVfcmVnKi8KKyAgaWRlX3NlY3Rvcl9jb3VudF9yZWcsCisgIGlkZV9zZWN0b3JfbnVtYmVyX3JlZywKKyAgaWRlX2N5bGluZGVyX3JlZzAsCisgIGlkZV9jeWxpbmRlcl9yZWcxLAorICBpZGVfZHJpdmVfaGVhZF9yZWcsCisgIGlkZV9zdGF0dXNfcmVnLCAvKmlkZV9jb21tYW5kX3JlZyovCisgIC8qIGNvbW1hbmQgcmVnaXN0ZXIgYmxvY2sgLSB3cml0ZSAqLworICBpZGVfZmVhdHVyZV9yZWcsIC8qaWRlX2Vycm9yX3JlZyovCisgIGlkZV9jb21tYW5kX3JlZywgLyppZGVfc3RhdHVzX3JlZyovCisgIC8qIGNvbnRyb2wgcmVnaXN0ZXIgYmxvY2sgLSByZWFkICovCisgIGlkZV9hbHRlcm5hdGVfc3RhdHVzX3JlZywgLyppZGVfY29udHJvbF9yZWcqLworICBpZGVfY29udHJvbF9yZWcsIC8qaWRlX2FsdGVybmF0ZV9zdGF0dXNfcmVnKi8KKyAgLyogZG1hIHJlZ2lzdGVyIGJsb2NrICovCisgIGlkZV9kbWFfY29tbWFuZF9yZWcsCisgIGlkZV9kbWFfdW51c2VkXzFfcmVnLAorICBpZGVfZG1hX3N0YXR1c19yZWcsCisgIGlkZV9kbWFfdW51c2VkXzNfcmVnLAorICBpZGVfZG1hX3ByZF90YWJsZV9hZGRyZXNzX3JlZzAsCisgIGlkZV9kbWFfcHJkX3RhYmxlX2FkZHJlc3NfcmVnMSwKKyAgaWRlX2RtYV9wcmRfdGFibGVfYWRkcmVzc19yZWcyLAorICBpZGVfZG1hX3ByZF90YWJsZV9hZGRyZXNzX3JlZzMsCisgIG5yX2lkZV9yZWdpc3RlcnMsCit9OworCisKK3R5cGVkZWYgZW51bSBfaWRlX3N0YXRlcyB7CisgIGlkbGVfc3RhdGUsCisgIGJ1c3lfbG9hZGVkX3N0YXRlLAorICBidXN5X2RyYWluZWRfc3RhdGUsCisgIGJ1c3lfZG1hX3N0YXRlLAorICBidXN5X2NvbW1hbmRfc3RhdGUsCisgIGxvYWRpbmdfc3RhdGUsCisgIGRyYWluaW5nX3N0YXRlLAorfSBpZGVfc3RhdGVzOworCitzdGF0aWMgY29uc3QgY2hhciAqCitpZGVfc3RhdGVfbmFtZShpZGVfc3RhdGVzIHN0YXRlKQoreworICBzd2l0Y2ggKHN0YXRlKSB7CisgIGNhc2UgaWRsZV9zdGF0ZTogcmV0dXJuICJpZGxlIjsKKyAgY2FzZSBidXN5X2xvYWRlZF9zdGF0ZTogcmV0dXJuICJidXN5X2xvYWRlZF9zdGF0ZSI7CisgIGNhc2UgYnVzeV9kcmFpbmVkX3N0YXRlOiByZXR1cm4gImJ1c3lfZHJhaW5lZF9zdGF0ZSI7CisgIGNhc2UgYnVzeV9kbWFfc3RhdGU6IHJldHVybiAiYnVzeV9kbWFfc3RhdGUiOworICBjYXNlIGJ1c3lfY29tbWFuZF9zdGF0ZTogcmV0dXJuICJidXN5X2NvbW1hbmRfc3RhdGUiOworICBjYXNlIGxvYWRpbmdfc3RhdGU6IHJldHVybiAibG9hZGluZ19zdGF0ZSI7CisgIGNhc2UgZHJhaW5pbmdfc3RhdGU6IHJldHVybiAiZHJhaW5pbmdfc3RhdGUiOworICBkZWZhdWx0OiByZXR1cm4gImlsbGVnYWwtc3RhdGUiOworICB9Cit9CisKK3R5cGVkZWYgc3RydWN0IF9pZGVfZ2VvbWV0cnkgeworICBpbnQgaGVhZDsKKyAgaW50IHNlY3RvcjsKKyAgaW50IGJ5dGU7Cit9IGlkZV9nZW9tZXRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgX2lkZV9kcml2ZSB7CisgIGludCBucjsKKyAgZGV2aWNlICpkZXZpY2U7CisgIGlkZV9nZW9tZXRyeSBnZW9tZXRyeTsKKyAgaWRlX2dlb21ldHJ5IGRlZmF1bHRfZ2VvbWV0cnk7Cit9IGlkZV9kcml2ZTsKKwordHlwZWRlZiBzdHJ1Y3QgX2lkZV9jb250cm9sbGVyIHsKKyAgaW50IG5yOworICBpZGVfc3RhdGVzIHN0YXRlOworICB1bnNpZ25lZDggcmVnW25yX2lkZV9yZWdpc3RlcnNdOworICB1bnNpZ25lZDggZmlmb1tucl9maWZvX2VudHJpZXNdOworICBpbnQgZmlmb19wb3M7CisgIGludCBmaWZvX3NpemU7CisgIGlkZV9kcml2ZSAqY3VycmVudF9kcml2ZTsKKyAgaW50IGN1cnJlbnRfYnl0ZTsKKyAgaW50IGN1cnJlbnRfdHJhbnNmZXI7CisgIGlkZV9kcml2ZSBkcml2ZVtucl9pZGVfZHJpdmVzX3Blcl9jb250cm9sbGVyXTsKKyAgZGV2aWNlICptZTsKKyAgZXZlbnRfZW50cnlfdGFnIGV2ZW50X3RhZzsKKyAgaW50IGlzX2ludGVycnVwdGluZzsKKyAgc2lnbmVkNjQgcmVhZHlfZGVsYXk7Cit9IGlkZV9jb250cm9sbGVyOworCisKKworc3RhdGljIHZvaWQKK3NldF9pbnRlcnJ1cHQoZGV2aWNlICptZSwKKwkgICAgICBpZGVfY29udHJvbGxlciAqY29udHJvbGxlcikKK3sKKyAgaWYgKChjb250cm9sbGVyLT5yZWdbaWRlX2NvbnRyb2xfcmVnXSAmIDB4MikgPT0gMCkgeworICAgIERUUkFDRShpZGUsICgiY29udHJvbGxlciAlZCAtIGludGVycnVwdCBzZXRcbiIsIGNvbnRyb2xsZXItPm5yKSk7CisgICAgZGV2aWNlX2ludGVycnVwdF9ldmVudChtZSwgY29udHJvbGxlci0+bnIsIDEsIE5VTEwsIDApOworICAgIGNvbnRyb2xsZXItPmlzX2ludGVycnVwdGluZyA9IDE7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAorY2xlYXJfaW50ZXJydXB0KGRldmljZSAqbWUsCisJCWlkZV9jb250cm9sbGVyICpjb250cm9sbGVyKQoreworICBpZiAoY29udHJvbGxlci0+aXNfaW50ZXJydXB0aW5nKSB7CisgICAgRFRSQUNFKGlkZSwgKCJjb250cm9sbGVyICVkIC0gaW50ZXJydXB0IGNsZWFyXG4iLCBjb250cm9sbGVyLT5ucikpOworICAgIGRldmljZV9pbnRlcnJ1cHRfZXZlbnQobWUsIGNvbnRyb2xsZXItPm5yLCAwLCBOVUxMLCAwKTsKKyAgICBjb250cm9sbGVyLT5pc19pbnRlcnJ1cHRpbmcgPSAwOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK2RvX2V2ZW50KHZvaWQgKmRhdGEpCit7CisgIGlkZV9jb250cm9sbGVyICpjb250cm9sbGVyID0gZGF0YTsKKyAgZGV2aWNlICptZSA9IGNvbnRyb2xsZXItPm1lOworICBjb250cm9sbGVyLT5ldmVudF90YWcgPSAwOworICBzd2l0Y2ggKGNvbnRyb2xsZXItPnN0YXRlKSB7CisgIGNhc2UgYnVzeV9sb2FkZWRfc3RhdGU6CisgIGNhc2UgYnVzeV9kcmFpbmVkX3N0YXRlOgorICAgIGlmIChjb250cm9sbGVyLT5jdXJyZW50X3RyYW5zZmVyID4gMCkgeworICAgICAgY29udHJvbGxlci0+c3RhdGUgPSAoY29udHJvbGxlci0+c3RhdGUgPT0gYnVzeV9sb2FkZWRfc3RhdGUKKwkJCSAgID8gbG9hZGluZ19zdGF0ZSA6IGRyYWluaW5nX3N0YXRlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBjb250cm9sbGVyLT5zdGF0ZSA9IGlkbGVfc3RhdGU7CisgICAgfQorICAgIHNldF9pbnRlcnJ1cHQobWUsIGNvbnRyb2xsZXIpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGRldmljZV9lcnJvcihtZSwgImNvbnRyb2xsZXIgJWQgLSB1bmV4cGVjdGVkIGV2ZW50IiwgY29udHJvbGxlci0+bnIpOworICAgIGJyZWFrOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK3NjaGVkdWxlX3JlYWR5X2V2ZW50KGRldmljZSAqbWUsCisJCSAgICAgaWRlX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXIpCit7CisgIGlmIChjb250cm9sbGVyLT5ldmVudF90YWcgIT0gMCkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJjb250cm9sbGVyICVkIC0gYXR0ZW1wdGluZyB0byBzY2hlZHVsZSBtdWx0aXBsZSBldmVudHMiLAorCQkgY29udHJvbGxlci0+bnIpOworICBjb250cm9sbGVyLT5ldmVudF90YWcgPSAKKyAgICBkZXZpY2VfZXZlbnRfcXVldWVfc2NoZWR1bGUobWUsIGNvbnRyb2xsZXItPnJlYWR5X2RlbGF5LAorCQkJCWRvX2V2ZW50LCBjb250cm9sbGVyKTsKK30KKworCitzdGF0aWMgdm9pZAorZG9fZmlmb19yZWFkKGRldmljZSAqbWUsCisJICAgICBpZGVfY29udHJvbGxlciAqY29udHJvbGxlciwKKwkgICAgIHZvaWQgKmRlc3QsCisJICAgICBpbnQgbnJfYnl0ZXMpCit7CisgIGlmIChjb250cm9sbGVyLT5zdGF0ZSAhPSBkcmFpbmluZ19zdGF0ZSkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJjb250cm9sbGVyICVkIC0gcmVhZGluZyBmaWZvIHdoZW4gbm90IHJlYWR5ICglcykiLAorCQkgY29udHJvbGxlci0+bnIsCisJCSBpZGVfc3RhdGVfbmFtZShjb250cm9sbGVyLT5zdGF0ZSkpOworICBpZiAoY29udHJvbGxlci0+Zmlmb19wb3MgKyBucl9ieXRlcyA+IGNvbnRyb2xsZXItPmZpZm9fc2l6ZSkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJjb250cm9sbGVyICVkIC0gZmlmbyB1bmRlcmZsb3ciLCBjb250cm9sbGVyLT5ucik7CisgIGlmIChucl9ieXRlcyA+IDApIHsKKyAgICBtZW1jcHkoZGVzdCwgJmNvbnRyb2xsZXItPmZpZm9bY29udHJvbGxlci0+Zmlmb19wb3NdLCBucl9ieXRlcyk7CisgICAgY29udHJvbGxlci0+Zmlmb19wb3MgKz0gbnJfYnl0ZXM7CisgIH0KKyAgaWYgKGNvbnRyb2xsZXItPmZpZm9fcG9zID09IGNvbnRyb2xsZXItPmZpZm9fc2l6ZSkgeworICAgIGNvbnRyb2xsZXItPmN1cnJlbnRfdHJhbnNmZXIgLT0gMTsKKyAgICBpZiAoY29udHJvbGxlci0+Y3VycmVudF90cmFuc2ZlciA+IDAKKwkmJiBjb250cm9sbGVyLT5jdXJyZW50X2RyaXZlICE9IE5VTEwpIHsKKyAgICAgIERUUkFDRShpZGUsICgiY29udHJvbGxlciAlZDolZCAtIHJlYWRpbmcgJWQgYnl0ZSBibG9jayBhdCAweCV4XG4iLAorCQkgICBjb250cm9sbGVyLT5uciwKKwkJICAgY29udHJvbGxlci0+Y3VycmVudF9kcml2ZS0+bnIsCisJCSAgIGNvbnRyb2xsZXItPmZpZm9fc2l6ZSwKKwkJICAgY29udHJvbGxlci0+Y3VycmVudF9ieXRlKSk7CisgICAgICBpZiAoZGV2aWNlX2lvX3JlYWRfYnVmZmVyKGNvbnRyb2xsZXItPmN1cnJlbnRfZHJpdmUtPmRldmljZSwKKwkJCQljb250cm9sbGVyLT5maWZvLAorCQkJCTAsIGNvbnRyb2xsZXItPmN1cnJlbnRfYnl0ZSwKKwkJCQljb250cm9sbGVyLT5maWZvX3NpemUsCisJCQkJTlVMTCwgMCkKKwkgICE9IGNvbnRyb2xsZXItPmZpZm9fc2l6ZSkKKwlkZXZpY2VfZXJyb3IobWUsICJjb250cm9sbGVyICVkIC0gZGlzayAlcyBpbyByZWFkIGVycm9yIiwKKwkJICAgICBjb250cm9sbGVyLT5uciwKKwkJICAgICBkZXZpY2VfcGF0aChjb250cm9sbGVyLT5jdXJyZW50X2RyaXZlLT5kZXZpY2UpKTsKKyAgICB9CisgICAgY29udHJvbGxlci0+c3RhdGUgPSBidXN5X2RyYWluZWRfc3RhdGU7CisgICAgY29udHJvbGxlci0+Zmlmb19wb3MgPSAwOworICAgIGNvbnRyb2xsZXItPmN1cnJlbnRfYnl0ZSArPSBjb250cm9sbGVyLT5maWZvX3NpemU7CisgICAgc2NoZWR1bGVfcmVhZHlfZXZlbnQobWUsIGNvbnRyb2xsZXIpOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK2RvX2ZpZm9fd3JpdGUoZGV2aWNlICptZSwKKwkgICAgICBpZGVfY29udHJvbGxlciAqY29udHJvbGxlciwKKwkgICAgICBjb25zdCB2b2lkICpzb3VyY2UsCisJICAgICAgaW50IG5yX2J5dGVzKQoreworICBpZiAoY29udHJvbGxlci0+c3RhdGUgIT0gbG9hZGluZ19zdGF0ZSkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJjb250cm9sbGVyICVkIC0gd3JpdGluZyBmaWZvIHdoZW4gbm90IHJlYWR5ICglcykiLAorCQkgY29udHJvbGxlci0+bnIsCisJCSBpZGVfc3RhdGVfbmFtZShjb250cm9sbGVyLT5zdGF0ZSkpOworICBpZiAoY29udHJvbGxlci0+Zmlmb19wb3MgKyBucl9ieXRlcyA+IGNvbnRyb2xsZXItPmZpZm9fc2l6ZSkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJjb250cm9sbGVyICVkIC0gZmlmbyBvdmVyZmxvdyIsIGNvbnRyb2xsZXItPm5yKTsKKyAgaWYgKG5yX2J5dGVzID4gMCkgeworICAgIG1lbWNweSgmY29udHJvbGxlci0+Zmlmb1tjb250cm9sbGVyLT5maWZvX3Bvc10sIHNvdXJjZSwgbnJfYnl0ZXMpOworICAgIGNvbnRyb2xsZXItPmZpZm9fcG9zICs9IG5yX2J5dGVzOworICB9CisgIGlmIChjb250cm9sbGVyLT5maWZvX3BvcyA9PSBjb250cm9sbGVyLT5maWZvX3NpemUpIHsKKyAgICBpZiAoY29udHJvbGxlci0+Y3VycmVudF90cmFuc2ZlciA+IDAKKwkmJiBjb250cm9sbGVyLT5jdXJyZW50X2RyaXZlICE9IE5VTEwpIHsKKyAgICAgIERUUkFDRShpZGUsICgiY29udHJvbGxlciAlZDolZCAtIHdyaXRpbmcgJWQgYnl0ZSBibG9jayBhdCAweCV4XG4iLAorCQkgICBjb250cm9sbGVyLT5uciwKKwkJICAgY29udHJvbGxlci0+Y3VycmVudF9kcml2ZS0+bnIsCisJCSAgIGNvbnRyb2xsZXItPmZpZm9fc2l6ZSwKKwkJICAgY29udHJvbGxlci0+Y3VycmVudF9ieXRlKSk7CisgICAgICBpZiAoZGV2aWNlX2lvX3dyaXRlX2J1ZmZlcihjb250cm9sbGVyLT5jdXJyZW50X2RyaXZlLT5kZXZpY2UsCisJCQkJIGNvbnRyb2xsZXItPmZpZm8sCisJCQkJIDAsIGNvbnRyb2xsZXItPmN1cnJlbnRfYnl0ZSwKKwkJCQkgY29udHJvbGxlci0+Zmlmb19zaXplLAorCQkJCSBOVUxMLCAwKQorCSAgIT0gY29udHJvbGxlci0+Zmlmb19zaXplKQorCWRldmljZV9lcnJvcihtZSwgImNvbnRyb2xsZXIgJWQgLSBkaXNrICVzIGlvIHdyaXRlIGVycm9yIiwKKwkJICAgICBjb250cm9sbGVyLT5uciwKKwkJICAgICBkZXZpY2VfcGF0aChjb250cm9sbGVyLT5jdXJyZW50X2RyaXZlLT5kZXZpY2UpKTsKKyAgICB9CisgICAgY29udHJvbGxlci0+Y3VycmVudF90cmFuc2ZlciAtPSAxOworICAgIGNvbnRyb2xsZXItPmZpZm9fcG9zID0gMDsKKyAgICBjb250cm9sbGVyLT5jdXJyZW50X2J5dGUgKz0gY29udHJvbGxlci0+Zmlmb19zaXplOworICAgIGNvbnRyb2xsZXItPnN0YXRlID0gYnVzeV9sb2FkZWRfc3RhdGU7CisgICAgc2NoZWR1bGVfcmVhZHlfZXZlbnQobWUsIGNvbnRyb2xsZXIpOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK3NldHVwX2ZpZm8oZGV2aWNlICptZSwKKwkgICBpZGVfY29udHJvbGxlciAqY29udHJvbGxlciwKKwkgICBpbnQgaXNfc2ltcGxlLAorCSAgIGludCBpc193aXRoX2Rpc2ssCisJICAgaW9fZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgLyogZmluZCB0aGUgZGlzayAqLworICBpZiAoaXNfd2l0aF9kaXNrKSB7CisgICAgaW50IGRyaXZlX25yID0gKGNvbnRyb2xsZXItPnJlZ1tpZGVfZHJpdmVfaGVhZF9yZWddICYgMHgxMCkgIT0gMDsKKyAgICBjb250cm9sbGVyLT5jdXJyZW50X2RyaXZlID0gJmNvbnRyb2xsZXItPmRyaXZlW2RyaXZlX25yXTsKKyAgfQorICBlbHNlIHsKKyAgICBjb250cm9sbGVyLT5jdXJyZW50X2RyaXZlID0gTlVMTDsKKyAgfQorCisgIC8qIG51bWJlciBvZiB0cmFuc2ZlcnMgKi8KKyAgaWYgKGlzX3NpbXBsZSkKKyAgICBjb250cm9sbGVyLT5jdXJyZW50X3RyYW5zZmVyID0gMTsKKyAgZWxzZSB7CisgICAgaW50IHNlY3Rvcl9jb3VudCA9IGNvbnRyb2xsZXItPnJlZ1tpZGVfc2VjdG9yX2NvdW50X3JlZ107CisgICAgaWYgKHNlY3Rvcl9jb3VudCA9PSAwKQorICAgICAgY29udHJvbGxlci0+Y3VycmVudF90cmFuc2ZlciA9IDI1NjsKKyAgICBlbHNlCisgICAgICBjb250cm9sbGVyLT5jdXJyZW50X3RyYW5zZmVyID0gc2VjdG9yX2NvdW50OworICB9CisKKyAgLyogdGhlIHRyYW5zZmVyIHNpemUgKi8KKyAgaWYgKGNvbnRyb2xsZXItPmN1cnJlbnRfZHJpdmUgPT0gTlVMTCkKKyAgICBjb250cm9sbGVyLT5maWZvX3NpemUgPSA1MTI7CisgIGVsc2UKKyAgICBjb250cm9sbGVyLT5maWZvX3NpemUgPSBjb250cm9sbGVyLT5jdXJyZW50X2RyaXZlLT5nZW9tZXRyeS5ieXRlOworCisgIC8qIGVtcHR5IHRoZSBmaWZvICovCisgIGNvbnRyb2xsZXItPmZpZm9fcG9zID0gMDsKKworICAvKiB0aGUgc3RhcnRpbmcgYWRkcmVzcyAqLworICBpZiAoY29udHJvbGxlci0+Y3VycmVudF9kcml2ZSA9PSBOVUxMKQorICAgIGNvbnRyb2xsZXItPmN1cnJlbnRfYnl0ZSA9IDA7CisgIGVsc2UgaWYgKGNvbnRyb2xsZXItPnJlZ1tpZGVfZHJpdmVfaGVhZF9yZWddICYgMHg0MCkgeworICAgIC8qIExCQSBhZGRyZXNzaW5nIG1vZGUgKi8KKyAgICBjb250cm9sbGVyLT5jdXJyZW50X2J5dGUgPSBjb250cm9sbGVyLT5maWZvX3NpemUKKyAgICAgICogKCgoY29udHJvbGxlci0+cmVnW2lkZV9kcml2ZV9oZWFkX3JlZ10gJiAweGYpIDw8IDI0KQorCSB8IChjb250cm9sbGVyLT5yZWdbaWRlX2N5bGluZGVyX3JlZzFdIDw8IDE2KQorCSB8IChjb250cm9sbGVyLT5yZWdbaWRlX2N5bGluZGVyX3JlZzBdIDw8IDgpCisJIHwgKGNvbnRyb2xsZXItPnJlZ1tpZGVfc2VjdG9yX251bWJlcl9yZWddKSk7CisgIH0KKyAgZWxzZSBpZiAoY29udHJvbGxlci0+Y3VycmVudF9kcml2ZS0+Z2VvbWV0cnkuaGVhZCAhPSAwCisJICAgJiYgY29udHJvbGxlci0+Y3VycmVudF9kcml2ZS0+Z2VvbWV0cnkuc2VjdG9yICE9IDApIHsKKyAgICAvKiBDSFMgYWRkcmVzc2luZyBtb2RlICovCisgICAgaW50IGhlYWRfbnIgPSBjb250cm9sbGVyLT5yZWdbaWRlX2RyaXZlX2hlYWRfcmVnXSAmIDB4ZjsKKyAgICBpbnQgY3lsaW5kZXJfbnIgPSAoKGNvbnRyb2xsZXItPnJlZ1tpZGVfY3lsaW5kZXJfcmVnMV0gPDwgOCkKKwkJICAgIHwgY29udHJvbGxlci0+cmVnW2lkZV9jeWxpbmRlcl9yZWcwXSk7CisgICAgaW50IHNlY3Rvcl9uciA9IGNvbnRyb2xsZXItPnJlZ1tpZGVfc2VjdG9yX251bWJlcl9yZWddOworICAgIGNvbnRyb2xsZXItPmN1cnJlbnRfYnl0ZSA9IGNvbnRyb2xsZXItPmZpZm9fc2l6ZQorICAgICAgKiAoKGN5bGluZGVyX25yICogY29udHJvbGxlci0+Y3VycmVudF9kcml2ZS0+Z2VvbWV0cnkuaGVhZCArIGhlYWRfbnIpCisJICogY29udHJvbGxlci0+Y3VycmVudF9kcml2ZS0+Z2VvbWV0cnkuc2VjdG9yICsgc2VjdG9yX25yIC0gMSk7CisgIH0KKyAgZWxzZQorICAgIGRldmljZV9lcnJvcihtZSwgImNvbnRyb2xsZXIgJWQ6JWQgLSBDSFMgYWRkcmVzc2luZyBkaXNhYmxlZCIsCisJCSBjb250cm9sbGVyLT5uciwgY29udHJvbGxlci0+Y3VycmVudF9kcml2ZS0+bnIpOworICBEVFJBQ0UoaWRlLCAoImNvbnRyb2xsZXIgJWxkOiVsZCAtIHRyYW5zZmVyICglcykgJWxkIGJsb2NrcyBvZiAlbGQgYnl0ZXMgZnJvbSAweCVseFxuIiwKKwkgICAgICAgKGxvbmcpY29udHJvbGxlci0+bnIsCisJICAgICAgIGNvbnRyb2xsZXItPmN1cnJlbnRfZHJpdmUgPT0gTlVMTCA/IC0xTCA6IChsb25nKWNvbnRyb2xsZXItPmN1cnJlbnRfZHJpdmUtPm5yLAorCSAgICAgICBkaXJlY3Rpb24gPT0gaXNfcmVhZCA/ICJyZWFkIiA6ICJ3cml0ZSIsCisJICAgICAgIChsb25nKWNvbnRyb2xsZXItPmN1cnJlbnRfdHJhbnNmZXIsCisJICAgICAgIChsb25nKWNvbnRyb2xsZXItPmZpZm9fc2l6ZSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpY29udHJvbGxlci0+Y3VycmVudF9ieXRlKSk7CisgIHN3aXRjaCAoZGlyZWN0aW9uKSB7CisgIGNhc2UgaXNfcmVhZDoKKyAgICAvKiBmb3JjZSBhIHByaW1laW5nIHJlYWQgKi8KKyAgICBjb250cm9sbGVyLT5jdXJyZW50X3RyYW5zZmVyICs9IDE7CisgICAgY29udHJvbGxlci0+c3RhdGUgPSBkcmFpbmluZ19zdGF0ZTsgCisgICAgY29udHJvbGxlci0+Zmlmb19wb3MgPSBjb250cm9sbGVyLT5maWZvX3NpemU7CisgICAgZG9fZmlmb19yZWFkKG1lLCBjb250cm9sbGVyLCBOVUxMLCAwKTsKKyAgICBicmVhazsKKyAgY2FzZSBpc193cml0ZToKKyAgICBjb250cm9sbGVyLT5zdGF0ZSA9IGxvYWRpbmdfc3RhdGU7CisgICAgYnJlYWs7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAorZG9fY29tbWFuZChkZXZpY2UgKm1lLAorCSAgIGlkZV9jb250cm9sbGVyICpjb250cm9sbGVyLAorCSAgIGludCBjb21tYW5kKQoreworICBpZiAoY29udHJvbGxlci0+c3RhdGUgIT0gaWRsZV9zdGF0ZSkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJjb250cm9sbGVyICVkIC0gY29tbWFuZCB3aGVuIG5vdCBpZGxlIiwgY29udHJvbGxlci0+bnIpOworICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgY2FzZSAweDIwOiBjYXNlIDB4MjE6IC8qIHJlYWQtc2VjdG9ycyAqLworICAgIHNldHVwX2ZpZm8obWUsIGNvbnRyb2xsZXIsIDAvKmlzX3NpbXBsZSovLCAxLyppc193aXRoX2Rpc2sqLywgaXNfcmVhZCk7CisgICAgYnJlYWs7CisgIGNhc2UgMHgzMDogY2FzZSAweDMxOiAvKiB3cml0ZSAqLworICAgIHNldHVwX2ZpZm8obWUsIGNvbnRyb2xsZXIsIDAvKmlzX3NpbXBsZSovLCAxLyppc193aXRoX2Rpc2sqLywgaXNfd3JpdGUpOworICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB1bnNpZ25lZDgKK2dldF9zdGF0dXMoZGV2aWNlICptZSwKKwkgICBpZGVfY29udHJvbGxlciAqY29udHJvbGxlcikKK3sKKyAgc3dpdGNoIChjb250cm9sbGVyLT5zdGF0ZSkgeworICBjYXNlIGxvYWRpbmdfc3RhdGU6CisgIGNhc2UgZHJhaW5pbmdfc3RhdGU6CisgICAgcmV0dXJuIDB4MDg7IC8qIGRhdGEgcmVxICovCisgIGNhc2UgYnVzeV9sb2FkZWRfc3RhdGU6CisgIGNhc2UgYnVzeV9kcmFpbmVkX3N0YXRlOgorICAgIHJldHVybiAweDgwOyAvKiBidXN5ICovCisgIGNhc2UgaWRsZV9zdGF0ZToKKyAgICByZXR1cm4gMHg0MDsgLyogZHJpdmUgcmVhZHkgKi8KKyAgZGVmYXVsdDoKKyAgICBkZXZpY2VfZXJyb3IobWUsICJpbnRlcm5hbCBlcnJvciIpOworICAgIHJldHVybiAwOworICB9Cit9CisJICAKKworLyogVGhlIGFkZHJlc3MgcHJlc2VudGVkIHRvIHRoZSBJREUgY29udHJvbGVyIGlzIGRlY29kZWQgYW5kIHRoZW4KKyAgIG1hcHBlZCBvbnRvIGEgY29udHJvbGxlcjpyZWcgcGFpciAqLworCitlbnVtIHsKKyAgbnJfYWRkcmVzc19ibG9ja3MgPSA2LAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgX2FkZHJlc3NfYmxvY2sgeworICBpbnQgc3BhY2U7CisgIHVuc2lnbmVkX3dvcmQgYmFzZV9hZGRyOworICB1bnNpZ25lZF93b3JkIGJvdW5kX2FkZHI7CisgIGludCBjb250cm9sbGVyOworICBpbnQgYmFzZV9yZWc7Cit9IGFkZHJlc3NfYmxvY2s7CisKK3R5cGVkZWYgc3RydWN0IF9hZGRyZXNzX2RlY29kZXIgeworICBhZGRyZXNzX2Jsb2NrIGJsb2NrW25yX2FkZHJlc3NfYmxvY2tzXTsKK30gYWRkcmVzc19kZWNvZGVyOworCitzdGF0aWMgdm9pZAorZGVjb2RlX2FkZHJlc3MoZGV2aWNlICptZSwKKwkgICAgICAgYWRkcmVzc19kZWNvZGVyICpkZWNvZGVyLAorCSAgICAgICBpbnQgc3BhY2UsCisJICAgICAgIHVuc2lnbmVkX3dvcmQgYWRkcmVzcywKKwkgICAgICAgaW50ICpjb250cm9sbGVyLAorCSAgICAgICBpbnQgKnJlZywKKwkgICAgICAgaW9fZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBucl9hZGRyZXNzX2Jsb2NrczsgaSsrKSB7CisgICAgaWYgKHNwYWNlID09IGRlY29kZXItPmJsb2NrW2ldLnNwYWNlCisJJiYgYWRkcmVzcyA+PSBkZWNvZGVyLT5ibG9ja1tpXS5iYXNlX2FkZHIKKwkmJiBhZGRyZXNzIDw9IGRlY29kZXItPmJsb2NrW2ldLmJvdW5kX2FkZHIpIHsKKyAgICAgICpjb250cm9sbGVyID0gZGVjb2Rlci0+YmxvY2tbaV0uY29udHJvbGxlcjsKKyAgICAgICpyZWcgPSAoYWRkcmVzcworCSAgICAgIC0gZGVjb2Rlci0+YmxvY2tbaV0uYmFzZV9hZGRyCisJICAgICAgKyBkZWNvZGVyLT5ibG9ja1tpXS5iYXNlX3JlZyk7CisgICAgICBpZiAoZGlyZWN0aW9uID09IGlzX3dyaXRlKSB7CisJc3dpdGNoICgqcmVnKSB7CisJY2FzZSBpZGVfZXJyb3JfcmVnOiAqcmVnID0gaWRlX2ZlYXR1cmVfcmVnOyBicmVhazsKKwljYXNlIGlkZV9zdGF0dXNfcmVnOiAqcmVnID0gaWRlX2NvbW1hbmRfcmVnOyBicmVhazsKKwljYXNlIGlkZV9hbHRlcm5hdGVfc3RhdHVzX3JlZzogKnJlZyA9IGlkZV9jb250cm9sX3JlZzsgYnJlYWs7CisJZGVmYXVsdDogYnJlYWs7CisJfQorICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBkZXZpY2VfZXJyb3IobWUsICJhZGRyZXNzICVkOjB4JWx4IGludmFsaWQiLAorCSAgICAgICBzcGFjZSwgKHVuc2lnbmVkIGxvbmcpYWRkcmVzcyk7Cit9CisKKworc3RhdGljIHZvaWQKK2J1aWxkX2FkZHJlc3NfZGVjb2RlcihkZXZpY2UgKm1lLAorCQkgICAgICBhZGRyZXNzX2RlY29kZXIgKmRlY29kZXIpCit7CisgIGludCByZWc7CisgIGZvciAocmVnID0gMTsgcmVnIDwgNjsgcmVnKyspIHsKKyAgICByZWdfcHJvcGVydHlfc3BlYyB1bml0OworICAgIGludCBzcGFjZTsKKyAgICB1bnNpZ25lZF93b3JkIGFkZHJlc3M7CisgICAgdW5zaWduZWQgc2l6ZTsKKyAgICAvKiBmaW5kIGFuZCBkZWNvZGUgdGhlIHJlZyBwcm9wZXJ0eSAqLworICAgIGlmICghZGV2aWNlX2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5KG1lLCAicmVnIiwgcmVnLCAmdW5pdCkpCisgICAgICBkZXZpY2VfZXJyb3IobWUsICJtaXNzaW5nIG9yIGludmFsaWQgcmVnIGVudHJ5ICVkIiwgcmVnKTsKKyAgICBkZXZpY2VfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyhkZXZpY2VfcGFyZW50KG1lKSwgJnVuaXQuYWRkcmVzcywKKwkJCQkgICAgICZzcGFjZSwgJmFkZHJlc3MsIG1lKTsKKyAgICBkZXZpY2Vfc2l6ZV90b19hdHRhY2hfc2l6ZShkZXZpY2VfcGFyZW50KG1lKSwgJnVuaXQuc2l6ZSwgJnNpemUsIG1lKTsKKyAgICAvKiBpbnNlcnQgaXQgaW50byB0aGUgYWRkcmVzcyBkZWNvZGVyICovCisgICAgc3dpdGNoIChyZWcpIHsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgICAgLyogY29tbWFuZCByZWdpc3RlciBibG9jayAqLworICAgICAgaWYgKHNpemUgIT0gOCkKKwlkZXZpY2VfZXJyb3IobWUsICJyZWcgZW50cnkgJWQgbXVzdCBoYXZlIGEgc2l6ZSBvZiA4IiwgcmVnKTsKKyAgICAgIGRlY29kZXItPmJsb2NrW3JlZy0xXS5zcGFjZSA9IHNwYWNlOworICAgICAgZGVjb2Rlci0+YmxvY2tbcmVnLTFdLmJhc2VfYWRkciA9IGFkZHJlc3M7CisgICAgICBkZWNvZGVyLT5ibG9ja1tyZWctMV0uYm91bmRfYWRkciA9IGFkZHJlc3MgKyBzaXplIC0gMTsKKyAgICAgIGRlY29kZXItPmJsb2NrW3JlZy0xXS5jb250cm9sbGVyID0gKHJlZyArIDEpICUgbnJfaWRlX2NvbnRyb2xsZXJzOworICAgICAgZGVjb2Rlci0+YmxvY2tbcmVnLTFdLmJhc2VfcmVnID0gaWRlX2RhdGFfcmVnOworICAgICAgRFRSQUNFKGlkZSwgKCJjb250cm9sbGVyICVkIGNvbW1hbmQgcmVnaXN0ZXIgYmxvY2sgYXQgJWQ6MHglbHguLjB4JWx4XG4iLAorCQkgICBkZWNvZGVyLT5ibG9ja1tyZWctMV0uY29udHJvbGxlciwKKwkJICAgZGVjb2Rlci0+YmxvY2tbcmVnLTFdLnNwYWNlLAorCQkgICAodW5zaWduZWQgbG9uZylkZWNvZGVyLT5ibG9ja1tyZWctMV0uYmFzZV9hZGRyLAorCQkgICAodW5zaWduZWQgbG9uZylkZWNvZGVyLT5ibG9ja1tyZWctMV0uYm91bmRfYWRkcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgIGNhc2UgNDoKKyAgICAgIC8qIGNvbnRyb2wgcmVnaXN0ZXIgYmxvY2sgKi8KKyAgICAgIGlmIChzaXplICE9IDEpCisJZGV2aWNlX2Vycm9yKG1lLCAicmVnIGVudHJ5ICVkIG11c3QgaGF2ZSBhIHNpemUgb2YgMSIsIHJlZyk7CisgICAgICBkZWNvZGVyLT5ibG9ja1tyZWctMV0uc3BhY2UgPSBzcGFjZTsKKyAgICAgIGRlY29kZXItPmJsb2NrW3JlZy0xXS5iYXNlX2FkZHIgPSBhZGRyZXNzOworICAgICAgZGVjb2Rlci0+YmxvY2tbcmVnLTFdLmJvdW5kX2FkZHIgPSBhZGRyZXNzICsgc2l6ZSAtIDE7CisgICAgICBkZWNvZGVyLT5ibG9ja1tyZWctMV0uY29udHJvbGxlciA9IChyZWcgKyAxKSAlIG5yX2lkZV9jb250cm9sbGVyczsKKyAgICAgIGRlY29kZXItPmJsb2NrW3JlZy0xXS5iYXNlX3JlZyA9IGlkZV9hbHRlcm5hdGVfc3RhdHVzX3JlZzsKKyAgICAgIERUUkFDRShpZGUsICgiY29udHJvbGxlciAlZCBjb250cm9sIHJlZ2lzdGVyIGJsb2NrIGF0ICVkOjB4JWx4Li4weCVseFxuIiwKKwkJICAgZGVjb2Rlci0+YmxvY2tbcmVnLTFdLmNvbnRyb2xsZXIsCisJCSAgIGRlY29kZXItPmJsb2NrW3JlZy0xXS5zcGFjZSwKKwkJICAgKHVuc2lnbmVkIGxvbmcpZGVjb2Rlci0+YmxvY2tbcmVnLTFdLmJhc2VfYWRkciwKKwkJICAgKHVuc2lnbmVkIGxvbmcpZGVjb2Rlci0+YmxvY2tbcmVnLTFdLmJvdW5kX2FkZHIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgIC8qIGRtYSByZWdpc3RlciBibG9jayAqLworICAgICAgaWYgKHNpemUgIT0gOCkKKwlkZXZpY2VfZXJyb3IobWUsICJyZWcgZW50cnkgJWQgbXVzdCBoYXZlIGEgc2l6ZSBvZiA4IiwgcmVnKTsKKyAgICAgIGRlY29kZXItPmJsb2NrW3JlZy0xXS5zcGFjZSA9IHNwYWNlOworICAgICAgZGVjb2Rlci0+YmxvY2tbcmVnLTFdLmJhc2VfYWRkciA9IGFkZHJlc3M7CisgICAgICBkZWNvZGVyLT5ibG9ja1tyZWctMV0uYm91bmRfYWRkciA9IGFkZHJlc3MgKyA0IC0gMTsKKyAgICAgIGRlY29kZXItPmJsb2NrW3JlZy0xXS5iYXNlX3JlZyA9IGlkZV9kbWFfY29tbWFuZF9yZWc7CisgICAgICBkZWNvZGVyLT5ibG9ja1tyZWctMV0uY29udHJvbGxlciA9IDA7CisgICAgICBEVFJBQ0UoaWRlLCAoImNvbnRyb2xsZXIgJWQgZG1hIHJlZ2lzdGVyIGJsb2NrIGF0ICVkOjB4JWx4Li4weCVseFxuIiwKKwkJICAgZGVjb2Rlci0+YmxvY2tbcmVnLTFdLmNvbnRyb2xsZXIsCisJCSAgIGRlY29kZXItPmJsb2NrW3JlZy0xXS5zcGFjZSwKKwkJICAgKHVuc2lnbmVkIGxvbmcpZGVjb2Rlci0+YmxvY2tbcmVnLTFdLmJhc2VfYWRkciwKKwkJICAgKHVuc2lnbmVkIGxvbmcpZGVjb2Rlci0+YmxvY2tbcmVnLTFdLmJvdW5kX2FkZHIpKTsKKyAgICAgIGRlY29kZXItPmJsb2NrW3JlZ10uc3BhY2UgPSBzcGFjZTsKKyAgICAgIGRlY29kZXItPmJsb2NrW3JlZ10uYmFzZV9hZGRyID0gYWRkcmVzcyArIDQ7CisgICAgICBkZWNvZGVyLT5ibG9ja1tyZWddLmJvdW5kX2FkZHIgPSBhZGRyZXNzICsgOCAtIDE7CisgICAgICBkZWNvZGVyLT5ibG9ja1tyZWddLmNvbnRyb2xsZXIgPSAxOworICAgICAgZGVjb2Rlci0+YmxvY2tbcmVnXS5iYXNlX3JlZyA9IGlkZV9kbWFfY29tbWFuZF9yZWc7CisgICAgICBEVFJBQ0UoaWRlLCAoImNvbnRyb2xsZXIgJWQgZG1hIHJlZ2lzdGVyIGJsb2NrIGF0ICVkOjB4JWx4Li4weCVseFxuIiwKKwkJICAgZGVjb2Rlci0+YmxvY2tbcmVnXS5jb250cm9sbGVyLAorCQkgICBkZWNvZGVyLT5ibG9ja1tyZWctMV0uc3BhY2UsCisJCSAgICh1bnNpZ25lZCBsb25nKWRlY29kZXItPmJsb2NrW3JlZ10uYmFzZV9hZGRyLAorCQkgICAodW5zaWduZWQgbG9uZylkZWNvZGVyLT5ibG9ja1tyZWddLmJvdW5kX2FkZHIpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBkZXZpY2VfZXJyb3IobWUsICJpbnRlcm5hbCBlcnJvciAtIGJhZCBzd2l0Y2giKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCQkgICAgICAKKworCit0eXBlZGVmIHN0cnVjdCBfaHdfaWRlX2RldmljZSB7CisgIGlkZV9jb250cm9sbGVyIGNvbnRyb2xsZXJbbnJfaWRlX2NvbnRyb2xsZXJzXTsKKyAgYWRkcmVzc19kZWNvZGVyIGRlY29kZXI7Cit9IGh3X2lkZV9kZXZpY2U7CisKKworc3RhdGljIHZvaWQKK2h3X2lkZV9pbml0X2FkZHJlc3MoZGV2aWNlICptZSkKK3sKKyAgaHdfaWRlX2RldmljZSAqaWRlID0gZGV2aWNlX2RhdGEobWUpOworICBpbnQgY29udHJvbGxlcjsKKyAgaW50IGRyaXZlOworIAorICAvKiB6ZXJvIHNvbWUgdGhpbmdzICovCisgIGZvciAoY29udHJvbGxlciA9IDA7IGNvbnRyb2xsZXIgPCBucl9pZGVfY29udHJvbGxlcnM7IGNvbnRyb2xsZXIrKykgeworICAgIG1lbXNldCgmaWRlLT5jb250cm9sbGVyW2NvbnRyb2xsZXJdLCAwLCBzaXplb2YoaWRlX2NvbnRyb2xsZXIpKTsKKyAgICBmb3IgKGRyaXZlID0gMDsgZHJpdmUgPCBucl9pZGVfZHJpdmVzX3Blcl9jb250cm9sbGVyOyBkcml2ZSsrKSB7CisgICAgICBpZGUtPmNvbnRyb2xsZXJbY29udHJvbGxlcl0uZHJpdmVbZHJpdmVdLm5yID0gZHJpdmU7CisgICAgfQorICAgIGlkZS0+Y29udHJvbGxlcltjb250cm9sbGVyXS5tZSA9IG1lOworICAgIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgInJlYWR5LWRlbGF5IikgIT0gTlVMTCkKKyAgICAgIGlkZS0+Y29udHJvbGxlcltjb250cm9sbGVyXS5yZWFkeV9kZWxheSA9CisJZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgInJlYWR5LWRlbGF5Iik7CisgIH0KKworICAvKiBhdHRhY2ggdGhpcyBkZXZpY2UgdG8gaXRzIHBhcmVudCAqLworICBnZW5lcmljX2RldmljZV9pbml0X2FkZHJlc3MobWUpOworCisgIC8qIGRldGVybWluZSBvdXIgb3duIGFkZHJlc3MgbWFwICovCisgIGJ1aWxkX2FkZHJlc3NfZGVjb2RlcihtZSwgJmlkZS0+ZGVjb2Rlcik7CisKK30KKworCitzdGF0aWMgdm9pZAoraHdfaWRlX2F0dGFjaF9hZGRyZXNzKGRldmljZSAqbWUsCisJCSAgICAgIGF0dGFjaF90eXBlIHR5cGUsCisJCSAgICAgIGludCBzcGFjZSwKKwkJICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAorCQkgICAgICB1bnNpZ25lZCBucl9ieXRlcywKKwkJICAgICAgYWNjZXNzX3R5cGUgYWNjZXNzLAorCQkgICAgICBkZXZpY2UgKmNsaWVudCkgLypjYWxsYmFjay9kZWZhdWx0Ki8KK3sKKyAgaHdfaWRlX2RldmljZSAqaWRlID0gKGh3X2lkZV9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKKyAgaW50IGNvbnRyb2xsZXJfbnIgPSBhZGRyIC8gbnJfaWRlX2RyaXZlc19wZXJfY29udHJvbGxlcjsKKyAgaW50IGRyaXZlX25yID0gYWRkciAlIG5yX2lkZV9kcml2ZXNfcGVyX2NvbnRyb2xsZXI7CisgIGlkZV9jb250cm9sbGVyICpjb250cm9sbGVyOworICBpZGVfZHJpdmUgKmRyaXZlOworICBpZiAoY29udHJvbGxlcl9uciA+PSBucl9pZGVfY29udHJvbGxlcnMpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAibm8gY29udHJvbGxlciBmb3IgZGlzayAlcyIsCisJCSBkZXZpY2VfcGF0aChjbGllbnQpKTsKKworICBjb250cm9sbGVyID0gJmlkZS0+Y29udHJvbGxlcltjb250cm9sbGVyX25yXTsKKyAgZHJpdmUgPSAmY29udHJvbGxlci0+ZHJpdmVbZHJpdmVfbnJdOworICBkcml2ZS0+ZGV2aWNlID0gY2xpZW50OworICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkoY2xpZW50LCAiaWRlLWJ5dGUtY291bnQiKSAhPSBOVUxMKQorICAgIGRyaXZlLT5nZW9tZXRyeS5ieXRlID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShjbGllbnQsICJpZGUtYnl0ZS1jb3VudCIpOworICBlbHNlCisgICAgZHJpdmUtPmdlb21ldHJ5LmJ5dGUgPSA1MTI7CisgIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShjbGllbnQsICJpZGUtc2VjdG9yLWNvdW50IikgIT0gTlVMTCkKKyAgICBkcml2ZS0+Z2VvbWV0cnkuc2VjdG9yID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShjbGllbnQsICJpZGUtc2VjdG9yLWNvdW50Iik7CisgIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShjbGllbnQsICJpZGUtaGVhZC1jb3VudCIpICE9IE5VTEwpCisgICAgZHJpdmUtPmdlb21ldHJ5LmhlYWQgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KGNsaWVudCwgImlkZS1oZWFkLWNvdW50Iik7CisgIGRyaXZlLT5kZWZhdWx0X2dlb21ldHJ5ID0gZHJpdmUtPmdlb21ldHJ5OworICBEVFJBQ0UoaWRlLCAoImNvbnRyb2xsZXIgJWQ6JWQgJXMgYnl0ZS1jb3VudCAlZCwgc2VjdG9yLWNvdW50ICVkLCBoZWFkLWNvdW50ICVkXG4iLAorCSAgICAgICBjb250cm9sbGVyX25yLAorCSAgICAgICBkcml2ZS0+bnIsCisJICAgICAgIGRldmljZV9wYXRoKGNsaWVudCksCisJICAgICAgIGRyaXZlLT5nZW9tZXRyeS5ieXRlLAorCSAgICAgICBkcml2ZS0+Z2VvbWV0cnkuc2VjdG9yLAorCSAgICAgICBkcml2ZS0+Z2VvbWV0cnkuaGVhZCkpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZAoraHdfaWRlX2lvX3JlYWRfYnVmZmVyKGRldmljZSAqbWUsCisJCSAgICAgIHZvaWQgKmRlc3QsCisJCSAgICAgIGludCBzcGFjZSwKKwkJICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAorCQkgICAgICB1bnNpZ25lZCBucl9ieXRlcywKKwkJICAgICAgY3B1ICpwcm9jZXNzb3IsCisJCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBod19pZGVfZGV2aWNlICppZGUgPSAoaHdfaWRlX2RldmljZSAqKWRldmljZV9kYXRhKG1lKTsKKyAgaW50IGNvbnRyb2xfbnI7CisgIGludCByZWc7CisgIGlkZV9jb250cm9sbGVyICpjb250cm9sbGVyOworCisgIC8qIGZpbmQgdGhlIGludGVyZmFjZSAqLworICBkZWNvZGVfYWRkcmVzcyhtZSwgJmlkZS0+ZGVjb2Rlciwgc3BhY2UsIGFkZHIsICZjb250cm9sX25yLCAmcmVnLCBpc19yZWFkKTsKKyAgY29udHJvbGxlciA9ICYgaWRlLT5jb250cm9sbGVyW2NvbnRyb2xfbnJdOworCisgIC8qIHByb2Nlc3MgdGhlIHRyYW5zZmVyICovCisgIG1lbXNldChkZXN0LCAwLCBucl9ieXRlcyk7CisgIHN3aXRjaCAocmVnKSB7CisgIGNhc2UgaWRlX2RhdGFfcmVnOgorICAgIGRvX2ZpZm9fcmVhZChtZSwgY29udHJvbGxlciwgZGVzdCwgbnJfYnl0ZXMpOworICAgIGJyZWFrOworICBjYXNlIGlkZV9zdGF0dXNfcmVnOgorICAgICoodW5zaWduZWQ4KilkZXN0ID0gZ2V0X3N0YXR1cyhtZSwgY29udHJvbGxlcik7CisgICAgY2xlYXJfaW50ZXJydXB0KG1lLCBjb250cm9sbGVyKTsKKyAgICBicmVhazsKKyAgY2FzZSBpZGVfYWx0ZXJuYXRlX3N0YXR1c19yZWc6CisgICAgKih1bnNpZ25lZDgqKWRlc3QgPSBnZXRfc3RhdHVzKG1lLCBjb250cm9sbGVyKTsKKyAgICBicmVhazsKKyAgY2FzZSBpZGVfZXJyb3JfcmVnOgorICBjYXNlIGlkZV9zZWN0b3JfY291bnRfcmVnOgorICBjYXNlIGlkZV9zZWN0b3JfbnVtYmVyX3JlZzoKKyAgY2FzZSBpZGVfY3lsaW5kZXJfcmVnMDoKKyAgY2FzZSBpZGVfY3lsaW5kZXJfcmVnMToKKyAgY2FzZSBpZGVfZHJpdmVfaGVhZF9yZWc6CisgIGNhc2UgaWRlX2NvbnRyb2xfcmVnOgorICBjYXNlIGlkZV9kbWFfY29tbWFuZF9yZWc6CisgIGNhc2UgaWRlX2RtYV9zdGF0dXNfcmVnOgorICBjYXNlIGlkZV9kbWFfcHJkX3RhYmxlX2FkZHJlc3NfcmVnMDoKKyAgY2FzZSBpZGVfZG1hX3ByZF90YWJsZV9hZGRyZXNzX3JlZzE6CisgIGNhc2UgaWRlX2RtYV9wcmRfdGFibGVfYWRkcmVzc19yZWcyOgorICBjYXNlIGlkZV9kbWFfcHJkX3RhYmxlX2FkZHJlc3NfcmVnMzoKKyAgICAqKHVuc2lnbmVkOCopZGVzdCA9IGNvbnRyb2xsZXItPnJlZ1tyZWddOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGRldmljZV9lcnJvcihtZSwgImJ1cy1lcnJvciBhdCBhZGRyZXNzIDB4JWx4IiwgYWRkcik7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIG5yX2J5dGVzOworfQorCisKK3N0YXRpYyB1bnNpZ25lZAoraHdfaWRlX2lvX3dyaXRlX2J1ZmZlcihkZXZpY2UgKm1lLAorCQkgICAgICAgY29uc3Qgdm9pZCAqc291cmNlLAorCQkgICAgICAgaW50IHNwYWNlLAorCQkgICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAorCQkgICAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCisJCSAgICAgICBjcHUgKnByb2Nlc3NvciwKKwkJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBod19pZGVfZGV2aWNlICppZGUgPSAoaHdfaWRlX2RldmljZSAqKWRldmljZV9kYXRhKG1lKTsKKyAgaW50IGNvbnRyb2xfbnI7CisgIGludCByZWc7CisgIGlkZV9jb250cm9sbGVyICpjb250cm9sbGVyOworCisgIC8qIGZpbmQgdGhlIGludGVyZmFjZSAqLworICBkZWNvZGVfYWRkcmVzcyhtZSwgJmlkZS0+ZGVjb2Rlciwgc3BhY2UsIGFkZHIsICZjb250cm9sX25yLCAmcmVnLCBpc193cml0ZSk7CisgIGNvbnRyb2xsZXIgPSAmaWRlLT5jb250cm9sbGVyW2NvbnRyb2xfbnJdOworCisgIC8qIHByb2Nlc3MgdGhlIGFjY2VzcyAqLworICBzd2l0Y2ggKHJlZykgeworICBjYXNlIGlkZV9kYXRhX3JlZzoKKyAgICBkb19maWZvX3dyaXRlKG1lLCBjb250cm9sbGVyLCBzb3VyY2UsIG5yX2J5dGVzKTsKKyAgICBicmVhazsKKyAgY2FzZSBpZGVfY29tbWFuZF9yZWc6CisgICAgZG9fY29tbWFuZChtZSwgY29udHJvbGxlciwgKih1bnNpZ25lZDgqKXNvdXJjZSk7CisgICAgYnJlYWs7CisgIGNhc2UgaWRlX2NvbnRyb2xfcmVnOgorICAgIGNvbnRyb2xsZXItPnJlZ1tyZWddID0gKih1bnNpZ25lZDgqKXNvdXJjZTsKKyAgICAvKiBwb3NzaWJseSBjYW5jZWwgaW50ZXJydXB0cyAqLworICAgIGlmICgoY29udHJvbGxlci0+cmVnW3JlZ10gJiAweDAyKSA9PSAweDAyKQorICAgICAgY2xlYXJfaW50ZXJydXB0KG1lLCBjb250cm9sbGVyKTsKKyAgICBicmVhazsKKyAgY2FzZSBpZGVfZmVhdHVyZV9yZWc6CisgIGNhc2UgaWRlX3NlY3Rvcl9jb3VudF9yZWc6CisgIGNhc2UgaWRlX3NlY3Rvcl9udW1iZXJfcmVnOgorICBjYXNlIGlkZV9jeWxpbmRlcl9yZWcwOgorICBjYXNlIGlkZV9jeWxpbmRlcl9yZWcxOgorICBjYXNlIGlkZV9kcml2ZV9oZWFkX3JlZzoKKyAgY2FzZSBpZGVfZG1hX2NvbW1hbmRfcmVnOgorICBjYXNlIGlkZV9kbWFfc3RhdHVzX3JlZzoKKyAgY2FzZSBpZGVfZG1hX3ByZF90YWJsZV9hZGRyZXNzX3JlZzA6CisgIGNhc2UgaWRlX2RtYV9wcmRfdGFibGVfYWRkcmVzc19yZWcxOgorICBjYXNlIGlkZV9kbWFfcHJkX3RhYmxlX2FkZHJlc3NfcmVnMjoKKyAgY2FzZSBpZGVfZG1hX3ByZF90YWJsZV9hZGRyZXNzX3JlZzM6CisgICAgY29udHJvbGxlci0+cmVnW3JlZ10gPSAqKHVuc2lnbmVkOCopc291cmNlOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGRldmljZV9lcnJvcihtZSwgImJ1cy1lcnJvciBhdCAweCVseCIsIGFkZHIpOworICAgIGJyZWFrOworICB9CisgIHJldHVybiBucl9ieXRlczsKK30KKworCitzdGF0aWMgY29uc3QgZGV2aWNlX2ludGVycnVwdF9wb3J0X2Rlc2NyaXB0b3IgaHdfaWRlX2ludGVycnVwdF9wb3J0c1tdID0geworICB7ICJhIiwgMCwgMCB9LAorICB7ICJiIiwgMSwgMCB9LAorICB7ICJjIiwgMiwgMCB9LAorICB7ICJkIiwgMywgMCB9LAorICB7IE5VTEwgfQorfTsKKworCisKK3N0YXRpYyBkZXZpY2VfY2FsbGJhY2tzIGNvbnN0IGh3X2lkZV9jYWxsYmFja3MgPSB7CisgIHsgaHdfaWRlX2luaXRfYWRkcmVzcywgfSwKKyAgeyBod19pZGVfYXR0YWNoX2FkZHJlc3MsIH0sIC8qIGF0dGFjaCAqLworICB7IGh3X2lkZV9pb19yZWFkX2J1ZmZlciwgaHdfaWRlX2lvX3dyaXRlX2J1ZmZlciwgfSwKKyAgeyBOVUxMLCB9LCAvKiBETUEgKi8KKyAgeyBOVUxMLCBOVUxMLCBod19pZGVfaW50ZXJydXB0X3BvcnRzIH0sIC8qIGludGVycnVwdCAqLworICB7IGdlbmVyaWNfZGV2aWNlX3VuaXRfZGVjb2RlLAorICAgIGdlbmVyaWNfZGV2aWNlX3VuaXRfZW5jb2RlLAorICAgIGdlbmVyaWNfZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MsCisgICAgZ2VuZXJpY19kZXZpY2Vfc2l6ZV90b19hdHRhY2hfc2l6ZSB9LAorfTsKKworCitzdGF0aWMgdm9pZCAqCitod19pZGVfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsCisJICAgICAgY29uc3QgZGV2aWNlX3VuaXQgKnVuaXRfYWRkcmVzcywKKwkgICAgICBjb25zdCBjaGFyICphcmdzKQoreworICBod19pZGVfZGV2aWNlICppZGUgPSBaQUxMT0MoaHdfaWRlX2RldmljZSk7CisgIHJldHVybiBpZGU7Cit9CisKKworY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgaHdfaWRlX2RldmljZV9kZXNjcmlwdG9yW10gPSB7CisgIHsgImlkZSIsIGh3X2lkZV9jcmVhdGUsICZod19pZGVfY2FsbGJhY2tzIH0sCisgIHsgTlVMTCwgfSwKK307CisKKyNlbmRpZiAvKiBfSFdfSURFXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9od19pbml0LmMgYi9zaW0vcHBjL2h3X2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDg2ZjZmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9od19pbml0LmMKQEAgLTAsMCArMSw3MjEgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorICAgIAorICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorICAgIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgICAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAgICAKKyAgICAqLworCisKKyNpZm5kZWYgX0hXX0lOSVRfQ18KKyNkZWZpbmUgX0hXX0lOSVRfQ18KKworI2luY2x1ZGUgImRldmljZV90YWJsZS5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgInBzaW0uaCIKKworCisvKiBETUEgYSBmaWxlIGludG8gbWVtb3J5ICovCitzdGF0aWMgaW50CitkbWFfZmlsZShkZXZpY2UgKm1lLAorCSBjb25zdCBjaGFyICpmaWxlX25hbWUsCisJIHVuc2lnbmVkX3dvcmQgYWRkcikKK3sKKyAgaW50IGNvdW50OworICBpbnQgaW5jOworICBGSUxFICppbWFnZTsKKyAgY2hhciBidWZbMTAyNF07CisKKyAgLyogZ2V0IGl0IG9wZW4gKi8KKyAgaW1hZ2UgPSBmb3BlbihmaWxlX25hbWUsICJyIik7CisgIGlmIChpbWFnZSA9PSBOVUxMKQorICAgIHJldHVybiAtMTsKKworICAvKiByZWFkIGl0IGluIHNsb3dseSAqLworICBjb3VudCA9IDA7CisgIHdoaWxlICgxKSB7CisgICAgaW5jID0gZnJlYWQoYnVmLCAxLCBzaXplb2YoYnVmKSwgaW1hZ2UpOworICAgIGlmIChmZW9mKGltYWdlKSB8fCBmZXJyb3IoaW1hZ2UpKQorICAgICAgYnJlYWs7CisgICAgaWYgKGRldmljZV9kbWFfd3JpdGVfYnVmZmVyKGRldmljZV9wYXJlbnQobWUpLAorCQkJCWJ1ZiwKKwkJCQkwIC8qYWRkcmVzcy1zcGFjZSovLAorCQkJCWFkZHIrY291bnQsCisJCQkJaW5jIC8qbnItYnl0ZXMqLywKKwkJCQkxIC8qdmlvbGF0ZSBybyovKSAhPSBpbmMpIHsKKyAgICAgIGZjbG9zZShpbWFnZSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGNvdW50ICs9IGluYzsKKyAgfQorCisgIC8qIGNsb3NlIGRvd24gYWdhaW4gKi8KKyAgZmNsb3NlKGltYWdlKTsKKworICByZXR1cm4gY291bnQ7Cit9CisKKworLyogREVWSUNFCisKKyAgIGZpbGUgLSBsb2FkIGEgZmlsZSBpbnRvIG1lbW9yeQorCisgICBERVNDUklQVElPTgorCisgICBMb2FkcyB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIDxmaWxlLW5hbWU+IGludG8gbWVtb3J5IGF0IHN0YXJ0aW5nIGF0CisgICA8PHJlYWwtYWRkcmVzcz4+LiAgQXNzdW1lcyB0aGF0IG1lbW9yeSBleGlzdHMgZm9yIHRoZSBsb2FkLgorCisgICBQUk9QRVJUSUVTCisKKyAgIGZpbGUtbmFtZSA9IDxzdHJpbmc+CisKKyAgIE5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkIGludG8gbWVtb3J5CisKKyAgIHJlYWwtYWRkcmVzcyA9IDxpbnRlZ2VyPgorCisgICBSZWFsIGFkZHJlc3MgYXQgd2hpY2ggdGhlIGZpbGUgaXMgdG8gYmUgbG9hZGVkICovCisKK3N0YXRpYyB2b2lkCitod19maWxlX2luaXRfZGF0YV9jYWxsYmFjayhkZXZpY2UgKm1lKQoreworICBpbnQgY291bnQ7CisgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSA9IGRldmljZV9maW5kX3N0cmluZ19wcm9wZXJ0eShtZSwgImZpbGUtbmFtZSIpOworICB1bnNpZ25lZF93b3JkIGFkZHIgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAicmVhbC1hZGRyZXNzIik7CisgIC8qIGxvYWQgdGhlIGZpbGUgKi8KKyAgY291bnQgPSBkbWFfZmlsZShtZSwgZmlsZV9uYW1lLCBhZGRyKTsKKyAgaWYgKGNvdW50IDwgMCkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJQcm9ibGVtIGxvYWRpbmcgZmlsZSAlc1xuIiwgZmlsZV9uYW1lKTsKK30KKworCitzdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod19maWxlX2NhbGxiYWNrcyA9IHsKKyAgeyBOVUxMLCBod19maWxlX2luaXRfZGF0YV9jYWxsYmFjaywgfSwKKyAgeyBOVUxMLCB9LCAvKiBhZGRyZXNzICovCisgIHsgTlVMTCwgfSwgLyogSU8gKi8KKyAgeyBOVUxMLCB9LCAvKiBETUEgKi8KKyAgeyBOVUxMLCB9LCAvKiBpbnRlcnJ1cHQgKi8KKyAgeyBOVUxMLCB9LCAvKiB1bml0ICovCit9OworCisKKy8qIERFVklDRQorCisKKyAgIGRhdGEgLSBpbml0aWFsaXplIGEgbWVtb3J5IGxvY2F0aW9uIHdpdGggc3BlY2lmaWVkIGRhdGEKKworCisgICBERVNDUklQVElPTgorCisKKyAgIFRoZSBwc2V1ZG8gZGV2aWNlIDw8ZGF0YT4+IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHNwZWNpZnlpbmcgdGhlCisgICBpbml0aWFsaXphdGlvbiBvZiBhIHNtYWxsIHNlY3Rpb24gb2YgbWVtb3J5LgorCisgICBOb3JtYWxseSwgdGhlIGRhdGEgd291bGQgYmUgd3JpdHRlbiB1c2luZyBhIGRtYSBvcGVyYXRpb24uCisgICBIb3dldmVyLCBmb3Igc29tZSBhZGRyZXNzZXMgdGhpcyB3aWxsIG5vdCByZXN1bHQgaW4gdGhlIGRlc2lyZWQKKyAgIHJlc3VsdC4gIEZvciBpbnN0YW5jZSwgdG8gaW5pdGlhbGl6ZSBhbiBhZGRyZXNzIGluIGFuIGVlcHJvbSwKKyAgIGluc3RlYWQgb2YgYSBzaW1wbGUgZG1hIG9mIHRoZSBkYXRhLCBhIHNlcXVlbmNlIG9mIHdyaXRlcyAoYW5kIHRoZW4KKyAgIHJlYWwgZGVsYXlzKSB0aGF0IHByb2dyYW0gdGhlIGVlcHJvbSB3b3VsZCBiZSByZXF1aXJlZC4KKworICAgRm9yIGRtYSB3cml0ZSBpbml0aWFsaXphdGlvbiwgdGhlIGRhdGEgZGV2aWNlIHdpbGwgd3JpdGUgdGhlCisgICBzcGVjaWZpZWQgPDxkYXRhPj4gdG8gPDxyZWFsLWFkZHJlc3M+PiB1c2luZyBhIG5vcm1hbCBkbWEuCisKKyAgIEZvciBpbnN0YW5jZSB3cml0ZSBpbml0aWFsaXphdGlvbiwgdGhlIHNwZWNpZmllZCA8PGluc3RhbmNlPj4gaXMKKyAgIG9wZW5lZC4gIFRoZW4gYSBzZWVrIHRvIHRoZSA8PHJlYWwtYWRkcmVzcz4+IGlzIHBlcmZvcm1lZCBmb2xsb3dlZAorICAgYnkgYSB3cml0ZSBvZiB0aGUgZGF0YS4KKworCisgICBJbnRlZ2VyIHByb3BlcnRpZXMgYXJlIHN0b3JlZCB1c2luZyB0aGUgdGFyZ2V0J3MgZW5kaWFuIG1vZGUuCisKKworICAgUFJPUEVSVElFUworCisKKyAgIGRhdGEgPSA8YW55LXZhbGlkLXByb3BlcnR5PiAocmVxdWlyZWQpCisKKyAgIERhdGEgdG8gYmUgbG9hZGVkIGludG8gbWVtb3J5LiAgVGhlIHByb3BlcnR5IHR5cGUgZGV0ZXJtaW5lcyBob3cgaXQKKyAgIGlzIGxvYWRlZC4KKworCisgICByZWFsLWFkZHJlc3MgPSA8aW50ZWdlcj4gKHJlcXVpcmVkKQorCisgICBTdGFydCBhZGRyZXNzIGF0IHdoaWNoIHRoZSBkYXRhIGlzIHRvIGJlIHN0b3JlZC4KKworCisgICBpbnN0YW5jZSA9IDxzdHJpbmc+IChvcHRpb25hbCkKKworICAgSW5zdGFuY2Ugc3BlY2lmaWNhdGlvbiBvZiB0aGUgZGV2aWNlIHRoYXQgaXMgdG8gYmUgb3BlbmVkIHNvIHRoYXQKKyAgIHRoZSBzcGVjaWZpZWQgZGF0YSBjYW4gYmUgd3JpdHRlbiB0byBpdC4KKworCisgICBFWEFNUExFUworCisKKyAgIFRoZSBleGFtcGxlcyBiZWxvdyBpbGx1c3RyYXRlIHRoZSB0d28gYWx0ZXJuYXRpdmUgbWVjaGFuaXNtcyB0aGF0CisgICBjYW4gYmUgdXNlZCB0byBzdG9yZSB0aGUgdmFsdWUgMHgxMjM0NTY3OCBhdCBhZGRyZXNzIDB4ZmZmMDBjMDAsCisgICB3aGljaCBpcyBub3JtYWxseSBwYXJ0IG9mIHRoZSA1MTJrIHN5c3RlbSBlZXByb20uCisKKworICAgSWYgdGhlIGVlcHJvbSBpcyBiZWluZyBtb2RlbGVkIGJ5IHJhbSAoPDxtZW1vcnk+PiBkZXZpY2UpIHRoZW4gdGhlCisgICBzdGFuZGFyZCBkbWEgaW5pdGlhbGl6YXRpb24gY2FuIGJlIHVzZWQuICBCeSBjb252ZW50aW9uOiB0aGUgZGF0YQorICAgZGV2aWNlcyBhcmUgdW5pcXVlbHkgaWRlbnRpZmllZCBieSBhcmd1bWVudGluZyB0aGVtIHdpdGggdGhlCisgICBkZXN0aW5hdGlvbnMgcmVhbCBhZGRyZXNzOyBhbmQgYWxsIGRhdGEgZGV2aWNlcyBhcmUgcHV0IHVuZGVyIHRoZQorICAgbm9kZSA8PC9vcGVucHJvbS9pbml0Pj4uCisKKyAgIHwgL29wZW5wcm9tL21lbW9yeUAweGZmZjAwMDAwL3JlZyAweGZmZjAwMDAwIDB4ODAwMDAKKyAgIHwgL29wZW5wcm9tL2luaXQvZGF0YUAweDEwMDAvZGF0YSAweDEyMzQ1Njc4CisgICB8IC9vcGVucHJvbS9pbml0L2RhdGFAMHgxMDAwL3JlYWwtYWRkcmVzcyAweDEwMDAKKworCisgICBJZiBpbnN0ZWFkIGEgcmVhbCBlZXByb20gd2FzIGJlaW5nIHVzZWQgdGhlIGluc3RhbmNlIHdyaXRlIG1ldGhvZAorICAgd291bGQgaW5zdGVhZCBuZWVkIHRvIGJlIHVzZWQgKHN0b3JpbmcganVzdCBhIHNpbmdsZSBieXRlIGluIGFuCisgICBlZXByb20gcmVxdWlyZXMgYSBjb21wbGV4IHNlcXVlbmNlIG9mIGFjY2Vzc2VzKS4gIFRoZQorICAgPDxyZWFsLWFkZHJlc3M+PiBpcyBzcGVjaWZpZWQgYXMgPDwweDBjMDA+PiB3aGljaCBpcyB0aGUgb2Zmc2V0CisgICBpbnRvIHRoZSBlZXByb20uICBGb3IgYnJldml0eSwgbW9zdCBvZiB0aGUgZWVwcm9tIHByb3BlcnRpZXMgaGF2ZQorICAgYmVlbiBvbWl0ZWQuCisKKyAgIHwgL2lvYnVzL2VlcHJvbUAweGZmZjAwMDAwL3JlZyAweGZmZjAwMDAwIDB4ODAwMDAKKyAgIHwgL29wZW5wcm9tL2luaXQvZGF0YUAweGZmZjAwYzAwL3JlYWwtYWRkcmVzcyAweDBjMDAKKyAgIHwgL29wZW5wcm9tL2luaXQvZGF0YUAweGZmZjAwYzAwL2RhdGEgMHgxMjM0NTY2NworICAgfCAvb3BlbnByb20vaW5pdC9kYXRhQDB4ZmZmMDBjMDAvaW5zdGFuY2UgL2lvYnVzL2VlcHJvbUAweGZmZjAwMDAwL3JlZworCisKKyAgIEJVR1MKKworCisgICBBdCBwcmVzZW50LCBvbmx5IDw8aW50ZWdlcj4+IHByb3BlcnRpZXMgY2FuIGJlIHNwZWNpZmllZCBmb3IgYW4KKyAgIGluaXRpYWwgZGF0YSB2YWx1ZS4KKworICAgKi8KKworCitzdGF0aWMgdm9pZAoraHdfZGF0YV9pbml0X2RhdGFfY2FsbGJhY2soZGV2aWNlICptZSkKK3sKKyAgdW5zaWduZWRfd29yZCBhZGRyID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgInJlYWwtYWRkcmVzcyIpOworICBjb25zdCBkZXZpY2VfcHJvcGVydHkgKmRhdGEgPSBkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgImRhdGEiKTsKKyAgY29uc3QgY2hhciAqaW5zdGFuY2Vfc3BlYyA9IChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgImluc3RhbmNlIikgIT0gTlVMTAorCQkJICAgICAgID8gZGV2aWNlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5KG1lLCAiaW5zdGFuY2UiKQorCQkJICAgICAgIDogTlVMTCk7CisgIGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UgPSBOVUxMOworICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIGRldmljZV9lcnJvcihtZSwgIm1pc3NpbmcgcHJvcGVydHkgPGRhdGE+XG4iKTsKKyAgaWYgKGluc3RhbmNlX3NwZWMgIT0gTlVMTCkKKyAgICBpbnN0YW5jZSA9IHRyZWVfaW5zdGFuY2UobWUsIGluc3RhbmNlX3NwZWMpOworICBzd2l0Y2ggKGRhdGEtPnR5cGUpIHsKKyAgY2FzZSBpbnRlZ2VyX3Byb3BlcnR5OgorICAgIHsKKyAgICAgIHVuc2lnbmVkX2NlbGwgYnVmID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgImRhdGEiKTsKKyAgICAgIEgyVChidWYpOworICAgICAgaWYgKGluc3RhbmNlID09IE5VTEwpIHsKKwlpZiAoZGV2aWNlX2RtYV93cml0ZV9idWZmZXIoZGV2aWNlX3BhcmVudChtZSksCisJCQkJICAgICZidWYsCisJCQkJICAgIDAgLyphZGRyZXNzLXNwYWNlKi8sCisJCQkJICAgIGFkZHIsCisJCQkJICAgIHNpemVvZihidWYpLCAvKm5yLWJ5dGVzKi8KKwkJCQkgICAgMSAvKnZpb2xhdGUgcm8qLykgIT0gc2l6ZW9mKGJ1ZikpCisJICBkZXZpY2VfZXJyb3IobWUsICJQcm9ibGVtIHN0b3JpbmcgaW50ZWdlciAweCV4IGF0IDB4JWx4XG4iLAorCQkgICAgICAgKHVuc2lnbmVkKWJ1ZiwgKHVuc2lnbmVkIGxvbmcpYWRkcik7CisgICAgICB9CisgICAgICBlbHNlIHsKKwlpZiAoZGV2aWNlX2luc3RhbmNlX3NlZWsoaW5zdGFuY2UsIDAsIGFkZHIpIDwgMAorCSAgICB8fCBkZXZpY2VfaW5zdGFuY2Vfd3JpdGUoaW5zdGFuY2UsICZidWYsIHNpemVvZihidWYpKSAhPSBzaXplb2YoYnVmKSkKKwkgIGRldmljZV9lcnJvcihtZSwgIlByb2JsZW0gc3RvcmluZyBpbnRlZ2VyIDB4JXggYXQgMHglbHggb2YgaW5zdGFuY2UgJXNcbiIsCisJCSAgICAgICAodW5zaWduZWQpYnVmLCAodW5zaWduZWQgbG9uZylhZGRyLCBpbnN0YW5jZV9zcGVjKTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgZGV2aWNlX2Vycm9yKG1lLCAiV3JpdGUgb2YgdGhpcyBkYXRhIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcbiIpOworICAgIGJyZWFrOworICB9CisgIGlmIChpbnN0YW5jZSAhPSBOVUxMKQorICAgIGRldmljZV9pbnN0YW5jZV9kZWxldGUoaW5zdGFuY2UpOworfQorCisKK3N0YXRpYyBkZXZpY2VfY2FsbGJhY2tzIGNvbnN0IGh3X2RhdGFfY2FsbGJhY2tzID0geworICB7IE5VTEwsIGh3X2RhdGFfaW5pdF9kYXRhX2NhbGxiYWNrLCB9LAorICB7IE5VTEwsIH0sIC8qIGFkZHJlc3MgKi8KKyAgeyBOVUxMLCB9LCAvKiBJTyAqLworICB7IE5VTEwsIH0sIC8qIERNQSAqLworICB7IE5VTEwsIH0sIC8qIGludGVycnVwdCAqLworICB7IE5VTEwsIH0sIC8qIHVuaXQgKi8KK307CisKKworLyogREVWSUNFCisKKworICAgbG9hZC1iaW5hcnkgLSBsb2FkIGJpbmFyeSBzZWdtZW50cyBpbnRvIG1lbW9yeQorCisKKyAgIERFU0NSSVBUSU9OCisKKyAgIEVhY2ggbG9hZGFibGUgc2VnbWVudCBvZiB0aGUgc3BlY2lmaWVkIGJpbmFyeSBpcyBsb2FkZWQgaW50byBtZW1vcnkKKyAgIGF0IGl0cyByZXF1aXJlZCBhZGRyZXNzLiAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBtZW1vcnkgYXQgdGhvc2UKKyAgIGFkZHJlc3NlcyBhbHJlYWR5IGV4aXN0cy4KKworICAgVGhpcyBkZXZpY2UgaXMgbm9ybWFsbHkgdXNlZCB0byBsb2FkIGFuIGV4ZWN1dGFibGUgaW50byBtZW1vcnkgYXMKKyAgIHBhcnQgb2YgcmVhbCBtb2RlIHNpbXVsYXRpb24uCisKKworICAgUFJPUEVSVElFUworCisKKyAgIGZpbGUtbmFtZSA9IDxzdHJpbmc+CisKKyAgIE5hbWUgb2YgdGhlIGJpbmFyeSB0byBiZSBsb2FkZWQuCisKKworICAgY2xhaW0gPSA8YW55dGhpbmc+IChvcHRpb25hbCkKKworICAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBwcmVzZW50LCB0aGUgcmVhbCBtZW1vcnkgdGhhdCBpcyB0byBiZSB1c2VkIGJ5CisgICB0aGUgaW1hZ2UgYmVpbmcgbG9hZGVkIHdpbGwgYmUgY2xhaW1lZCBmcm9tIHRoZSBtZW1vcnkgbm9kZQorICAgKHNwZWNpZmllZCBieSB0aGUgaWhhbmRsZSA8PC9jaG9zZW4vbWVtb3J5Pj4pLgorCisKKyAgIEJVR1MKKworICAgCisgICBXaGVuIGxvYWRpbmcgdGhlIGJpbmFyeSB0aGUgYmZkIHZpcnR1YWwtYWRkcmVzcyBpcyB1c2VkLiAgSXQgc2hvdWxkCisgICBiZSB1c2luZyB0aGUgYmZkIGxvYWQtYWRkcmVzcy4KKworICAgKi8KKworLyogREVWSUNFCisKKyAgIG1hcC1iaW5hcnkgLSBtYXAgdGhlIGJpbmFyeSBpbnRvIHRoZSB1c2VycyBhZGRyZXNzIHNwYWNlCisKKyAgIERFU0NSSVBUSU9OCisgICAKKyAgIFNpbWlsYXIgdG8gbG9hZC1iaW5hcnkgZXhjZXB0IHRoYXQgbWVtb3J5IGZvciBlYWNoIHNlZ21lbnQgaXMKKyAgIGNyZWF0ZWQgYmVmb3JlIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgZm9yIHRoZSBzZWdtZW50IGlzIGxvYWRlZC4KKworICAgVGhpcyBkZXZpY2UgaXMgbm9ybWFsbHkgdXNlZCB0byBsb2FkIGFuIGV4ZWN1dGFibGUgaW50byBhIHVzZXIgbW9kZQorICAgc2ltdWxhdGlvbi4KKworICAgUFJPUEVSVElFUworCisgICBmaWxlLW5hbWUgPSA8c3RyaW5nPgorCisgICBOYW1lIG9mIHRoZSBiaW5hcnkgdG8gYmUgbG9hZGVkLgorCisgICAqLworCitzdGF0aWMgdm9pZAordXBkYXRlX2Zvcl9iaW5hcnlfc2VjdGlvbihiZmQgKmFiZmQsCisJCQkgIGFzZWN0aW9uICp0aGVfc2VjdGlvbiwKKwkJCSAgUFRSIG9iaikKK3sKKyAgdW5zaWduZWRfd29yZCBzZWN0aW9uX3ZtYTsKKyAgdW5zaWduZWRfd29yZCBzZWN0aW9uX3NpemU7CisgIGFjY2Vzc190eXBlIGFjY2VzczsKKyAgZGV2aWNlICptZSA9IChkZXZpY2UqKW9iajsKKworICAvKiBza2lwIHRoZSBzZWN0aW9uIGlmIG5vIG1lbW9yeSB0byBhbGxvY2F0ZSAqLworICBpZiAoISAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGFiZmQsIHRoZV9zZWN0aW9uKSAmIFNFQ19BTExPQykpCisgICAgcmV0dXJuOworCisgIC8qIGNoZWNrL2lnbm9yZSBhbnkgc2VjdGlvbnMgb2Ygc2l6ZSB6ZXJvICovCisgIHNlY3Rpb25fc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyh0aGVfc2VjdGlvbik7CisgIGlmIChzZWN0aW9uX3NpemUgPT0gMCkKKyAgICByZXR1cm47CisKKyAgLyogZmluZCB3aGVyZSBpdCBpcyB0byBnbyAqLworICBzZWN0aW9uX3ZtYSA9IGJmZF9nZXRfc2VjdGlvbl92bWEoYWJmZCwgdGhlX3NlY3Rpb24pOworCisgIERUUkFDRShiaW5hcnksCisJICgibmFtZT0lLTdzLCB2bWE9MHglLjhseCwgc2l6ZT0lNmxkLCBmbGFncz0lM2x4KCVzJXMlcyVzJXMgKVxuIiwKKwkgIGJmZF9nZXRfc2VjdGlvbl9uYW1lKGFiZmQsIHRoZV9zZWN0aW9uKSwKKwkgIChsb25nKXNlY3Rpb25fdm1hLAorCSAgKGxvbmcpc2VjdGlvbl9zaXplLAorCSAgKGxvbmcpYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGFiZmQsIHRoZV9zZWN0aW9uKSwKKwkgIGJmZF9nZXRfc2VjdGlvbl9mbGFncyhhYmZkLCB0aGVfc2VjdGlvbikgJiBTRUNfTE9BRCA/ICIgTE9BRCIgOiAiIiwKKwkgIGJmZF9nZXRfc2VjdGlvbl9mbGFncyhhYmZkLCB0aGVfc2VjdGlvbikgJiBTRUNfQ09ERSA/ICIgQ09ERSIgOiAiIiwKKwkgIGJmZF9nZXRfc2VjdGlvbl9mbGFncyhhYmZkLCB0aGVfc2VjdGlvbikgJiBTRUNfREFUQSA/ICIgREFUQSIgOiAiIiwKKwkgIGJmZF9nZXRfc2VjdGlvbl9mbGFncyhhYmZkLCB0aGVfc2VjdGlvbikgJiBTRUNfQUxMT0MgPyAiIEFMTE9DIiA6ICIiLAorCSAgYmZkX2dldF9zZWN0aW9uX2ZsYWdzKGFiZmQsIHRoZV9zZWN0aW9uKSAmIFNFQ19SRUFET05MWSA/ICIgUkVBRE9OTFkiIDogIiIKKwkgICkpOworCisgIC8qIElmIHRoZXJlIGlzIGFuIC5pbnRlcnAgc2VjdGlvbiwgaXQgbWVhbnMgaXQgbmVlZHMgYSBzaGFyZWQgbGlicmFyeSBpbnRlcnByZXRlci4gICovCisgIGlmIChzdHJjbXAoIi5pbnRlcnAiLCBiZmRfZ2V0X3NlY3Rpb25fbmFtZShhYmZkLCB0aGVfc2VjdGlvbikpID09IDApCisgICAgZXJyb3IoIlNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLlxuIik7CisKKyAgLyogZGV0ZXJtaW5lIHRoZSBkZXZpY2VzIGFjY2VzcyAqLworICBhY2Nlc3MgPSBhY2Nlc3NfcmVhZDsKKyAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyhhYmZkLCB0aGVfc2VjdGlvbikgJiBTRUNfQ09ERSkKKyAgICBhY2Nlc3MgfD0gYWNjZXNzX2V4ZWM7CisgIGlmICghKGJmZF9nZXRfc2VjdGlvbl9mbGFncyhhYmZkLCB0aGVfc2VjdGlvbikgJiBTRUNfUkVBRE9OTFkpKQorICAgIGFjY2VzcyB8PSBhY2Nlc3Nfd3JpdGU7CisKKyAgLyogaWYgY2xhaW0gc3BlY2lmaWVkLCBhbGxvY2F0ZSByZWdpb24gZnJvbSB0aGUgbWVtb3J5IGRldmljZSAqLworICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJjbGFpbSIpICE9IE5VTEwpIHsKKyAgICBkZXZpY2VfaW5zdGFuY2UgKm1lbW9yeSA9IHRyZWVfZmluZF9paGFuZGxlX3Byb3BlcnR5KG1lLCAiL2Nob3Nlbi9tZW1vcnkiKTsKKyAgICB1bnNpZ25lZF9jZWxsIG1lbV9pblszXTsKKyAgICB1bnNpZ25lZF9jZWxsIG1lbV9vdXRbMV07CisgICAgbWVtX2luWzBdID0gMDsgLyphbGlnbm1lbnQgLSB0b3Atb2Ytc3RhY2sqLworICAgIG1lbV9pblsxXSA9IHNlY3Rpb25fc2l6ZTsKKyAgICBtZW1faW5bMl0gPSBzZWN0aW9uX3ZtYTsKKyAgICBpZiAoZGV2aWNlX2luc3RhbmNlX2NhbGxfbWV0aG9kKG1lbW9yeSwgImNsYWltIiwgMywgbWVtX2luLCAxLCBtZW1fb3V0KSA8IDApCisgICAgICBkZXZpY2VfZXJyb3IobWUsICJmYWlsZWQgdG8gY2xhaW0gbWVtb3J5IGZvciBzZWN0aW9uIGF0IDB4JWx4ICgweCVseCIsCisJCSAgIHNlY3Rpb25fdm1hLAorCQkgICBzZWN0aW9uX3NpemUpOworICAgIGlmIChtZW1fb3V0WzBdICE9IHNlY3Rpb25fdm1hKQorICAgICAgZGV2aWNlX2Vycm9yKG1lLCAic2VjdGlvbiBhZGRyZXNzIG5vdCBhcyByZXF1ZXN0ZWQiKTsKKyAgfQorCisgIC8qIGlmIGEgbWFwLCBwYXNzIHVwIGEgcmVxdWVzdCB0byBjcmVhdGUgdGhlIG1lbW9yeSBpbiBjb3JlICovCisgIGlmIChzdHJuY21wKGRldmljZV9uYW1lKG1lKSwgIm1hcC1iaW5hcnkiLCBzdHJsZW4oIm1hcC1iaW5hcnkiKSkgPT0gMCkKKyAgICBkZXZpY2VfYXR0YWNoX2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksCisJCQkgIGF0dGFjaF9yYXdfbWVtb3J5LAorCQkJICAwIC8qYWRkcmVzcyBzcGFjZSovLAorCQkJICBzZWN0aW9uX3ZtYSwKKwkJCSAgc2VjdGlvbl9zaXplLAorCQkJICBhY2Nlc3MsCisJCQkgIG1lKTsKKworICAvKiBpZiBhIGxvYWQgZG1hIGluIHRoZSByZXF1aXJlZCBkYXRhICovCisgIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MoYWJmZCwgdGhlX3NlY3Rpb24pICYgU0VDX0xPQUQpIHsKKyAgICB2b2lkICpzZWN0aW9uX2luaXQgPSB6YWxsb2Moc2VjdGlvbl9zaXplKTsKKyAgICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyhhYmZkLAorCQkJCSAgdGhlX3NlY3Rpb24sCisJCQkJICBzZWN0aW9uX2luaXQsIDAsCisJCQkJICBzZWN0aW9uX3NpemUpKSB7CisgICAgICBiZmRfcGVycm9yKCJiaW5hcnkiKTsKKyAgICAgIGRldmljZV9lcnJvcihtZSwgImxvYWQgb2YgZGF0YSBmYWlsZWQiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGRldmljZV9kbWFfd3JpdGVfYnVmZmVyKGRldmljZV9wYXJlbnQobWUpLAorCQkJCXNlY3Rpb25faW5pdCwKKwkJCQkwIC8qc3BhY2UqLywKKwkJCQlzZWN0aW9uX3ZtYSwKKwkJCQlzZWN0aW9uX3NpemUsCisJCQkJMSAvKnZpb2xhdGVfcmVhZF9vbmx5Ki8pCisJIT0gc2VjdGlvbl9zaXplKQorICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiYnJva2VuIHRyYW5zZmVyXG4iKTsKKyAgICB6ZnJlZShzZWN0aW9uX2luaXQpOyAvKiBvbmx5IGZyZWUgaWYgbG9hZCAqLworICB9Cit9CisKK3N0YXRpYyB2b2lkCitod19iaW5hcnlfaW5pdF9kYXRhX2NhbGxiYWNrKGRldmljZSAqbWUpCit7CisgIC8qIGdldCB0aGUgZmlsZSBuYW1lICovCisgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSA9IGRldmljZV9maW5kX3N0cmluZ19wcm9wZXJ0eShtZSwgImZpbGUtbmFtZSIpOworICBiZmQgKmltYWdlOworCisgIC8qIG9wZW4gdGhlIGZpbGUgKi8KKyAgaW1hZ2UgPSBiZmRfb3BlbnIoZmlsZV9uYW1lLCBOVUxMKTsKKyAgaWYgKGltYWdlID09IE5VTEwpIHsKKyAgICBiZmRfcGVycm9yKCJiaW5hcnkiKTsKKyAgICBkZXZpY2VfZXJyb3IobWUsICJGYWlsZWQgdG8gb3BlbiBmaWxlICVzXG4iLCBmaWxlX25hbWUpOworICB9CisKKyAgLyogY2hlY2sgaXQgaXMgdmFsaWQgKi8KKyAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0KGltYWdlLCBiZmRfb2JqZWN0KSkgeworICAgIGJmZF9jbG9zZShpbWFnZSk7CisgICAgZGV2aWNlX2Vycm9yKG1lLCAiVGhlIGZpbGUgJXMgaGFzIGFuIGludmFsaWQgYmluYXJ5IGZvcm1hdFxuIiwgZmlsZV9uYW1lKTsKKyAgfQorCisgIC8qIGFuZCB0aGUgZGF0YSBzZWN0aW9ucyAqLworICBiZmRfbWFwX292ZXJfc2VjdGlvbnMoaW1hZ2UsCisJCQl1cGRhdGVfZm9yX2JpbmFyeV9zZWN0aW9uLAorCQkJKFBUUiltZSk7CisKKyAgYmZkX2Nsb3NlKGltYWdlKTsKK30KKworCitzdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod19iaW5hcnlfY2FsbGJhY2tzID0geworICB7IE5VTEwsIGh3X2JpbmFyeV9pbml0X2RhdGFfY2FsbGJhY2ssIH0sCisgIHsgTlVMTCwgfSwgLyogYWRkcmVzcyAqLworICB7IE5VTEwsIH0sIC8qIElPICovCisgIHsgTlVMTCwgfSwgLyogRE1BICovCisgIHsgTlVMTCwgfSwgLyogaW50ZXJydXB0ICovCisgIHsgTlVMTCwgfSwgLyogdW5pdCAqLworfTsKKworCisvKiBERVZJQ0UKKworICAgc3RhY2sgLSBjcmVhdGUgYW4gaW5pdGlhbCBzdGFjayBmcmFtZSBpbiBtZW1vcnkKKworICAgREVTQ1JJUFRJT04KKworICAgQ3JlYXRlcyBhIHN0YWNrIGZyYW1lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBpbiBtZW1vcnkuCisKKyAgIER1ZSB0byB0aGUgc3RhcnR1cCBzZXF1ZW5jZSBnZGIgdXNlcyB3aGVuIGNvbW1lbmNpbmcgYSBzaW11bGF0aW9uLAorICAgaXQgaXMgbm90IHBvc3NpYmxlIGZvciB0aGUgZGF0YSB0byBiZSBwbGFjZWQgb24gdGhlIHN0YWNrIHRvIGJlCisgICBzcGVjaWZpZWQgYXMgcGFydCBvZiB0aGUgZGV2aWNlIHRyZWUuICBJbnN0ZWFkIHRoZSBhcmd1bWVudHMgdG8gYmUKKyAgIHB1c2hlZCBvbnRvIHRoZSBzdGFjayBhcmUgc3BlY2lmaWVkIHVzaW5nIGFuIElPQ1RMIGNhbGwuCisKKyAgIFRoZSBJT0NUTCB0YWtlcyB0aGUgYWRkaXRpb25hbCBhcmd1bWVudHM6CisKKyAgIHwgdW5zaWduZWRfd29yZCBzdGFja19lbmQgLS0gd2hlcmUgdGhlIHN0YWNrIHNob3VsZCBjb21lIGRvd24gZnJvbQorICAgfCBjaGFyICoqYXJndiAtLSAuLi4KKyAgIHwgY2hhciAqKmVudnAgLS0gLi4uCisKKyAgIFBST1BFUlRJRVMKKworICAgc3RhY2stdHlwZSA9IDxzdHJpbmc+CisKKyAgIFRoZSBmb3JtIG9mIHRoZSBzdGFjayBmcmFtZSB0aGF0IGlzIHRvIGJlIGNyZWF0ZWQuCisKKyAgICovCisKK3N0YXRpYyBpbnQKK3NpemVvZl9hcmd1bWVudF9zdHJpbmdzKGNoYXIgKiphcmcpCit7CisgIGludCBzaXplb2Zfc3RyaW5ncyA9IDA7CisKKyAgLyogcm9idXN0ICovCisgIGlmIChhcmcgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICAvKiBhZGQgdXAgYWxsIHRoZSBzdHJpbmcgc2l6ZXMgKHBhZGRpbmcgYXMgd2UgZ28pICovCisgIGZvciAoOyAqYXJnICE9IE5VTEw7IGFyZysrKSB7CisgICAgaW50IGxlbiA9IHN0cmxlbigqYXJnKSArIDE7CisgICAgc2l6ZW9mX3N0cmluZ3MgKz0gQUxJR05fOChsZW4pOworICB9CisKKyAgcmV0dXJuIHNpemVvZl9zdHJpbmdzOworfQorCitzdGF0aWMgaW50CitudW1iZXJfb2ZfYXJndW1lbnRzKGNoYXIgKiphcmcpCit7CisgIGludCBucjsKKyAgaWYgKGFyZyA9PSBOVUxMKQorICAgIHJldHVybiAwOworICBmb3IgKG5yID0gMDsgKmFyZyAhPSBOVUxMOyBhcmcrKywgbnIrKyk7CisgIHJldHVybiBucjsKK30KKworc3RhdGljIGludAorc2l6ZW9mX2FyZ3VtZW50cyhjaGFyICoqYXJnKQoreworICByZXR1cm4gQUxJR05fOCgobnVtYmVyX29mX2FyZ3VtZW50cyhhcmcpICsgMSkgKiBzaXplb2YodW5zaWduZWRfd29yZCkpOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfc3RhY2tfYXJndW1lbnRzKGRldmljZSAqbWUsCisJCSAgICAgIGNoYXIgKiphcmcsCisJCSAgICAgIHVuc2lnbmVkX3dvcmQgc3RhcnRfYmxvY2ssCisJCSAgICAgIHVuc2lnbmVkX3dvcmQgZW5kX2Jsb2NrLAorCQkgICAgICB1bnNpZ25lZF93b3JkIHN0YXJ0X2FyZywKKwkJICAgICAgdW5zaWduZWRfd29yZCBlbmRfYXJnKQoreworICBEVFJBQ0Uoc3RhY2ssCisJKCJ3cml0ZV9zdGFja19hcmd1bWVudHMoZGV2aWNlPSVzLCBhcmc9MHglbHgsIHN0YXJ0X2Jsb2NrPTB4JWx4LCBlbmRfYmxvY2s9MHglbHgsIHN0YXJ0X2FyZz0weCVseCwgZW5kX2FyZz0weCVseClcbiIsCisJIGRldmljZV9uYW1lKG1lKSwgKGxvbmcpYXJnLCAobG9uZylzdGFydF9ibG9jaywgKGxvbmcpZW5kX2Jsb2NrLCAobG9uZylzdGFydF9hcmcsIChsb25nKWVuZF9hcmcpKTsKKyAgaWYgKGFyZyA9PSBOVUxMKQorICAgIGRldmljZV9lcnJvcihtZSwgIkF0dGVtcHQgdG8gd3JpdGUgYSBudWxsIGFycmF5IG9udG8gdGhlIHN0YWNrXG4iKTsKKyAgLyogb25seSBjb3B5IGluIGFyZ3VtZW50cywgbWVtb3J5IGlzIGFscmVhZHkgemVybyAqLworICBmb3IgKDsgKmFyZyAhPSBOVUxMOyBhcmcrKykgeworICAgIGludCBsZW4gPSBzdHJsZW4oKmFyZykrMTsKKyAgICB1bnNpZ25lZF93b3JkIHRhcmdldF9zdGFydF9ibG9jazsKKyAgICBEVFJBQ0Uoc3RhY2ssCisJICAoIndyaXRlX3N0YWNrX2FyZ3VtZW50cygpIHdyaXRlICVzPSVzIGF0ICVzPTB4JWx4ICVzPTB4JWx4ICVzPTB4JWx4XG4iLAorCSAgICIqKmFyZyIsICphcmcsICJzdGFydF9ibG9jayIsIChsb25nKXN0YXJ0X2Jsb2NrLAorCSAgICJsZW4iLCAobG9uZylsZW4sICJzdGFydF9hcmciLCAobG9uZylzdGFydF9hcmcpKTsKKyAgICBpZiAocHNpbV93cml0ZV9tZW1vcnkoZGV2aWNlX3N5c3RlbShtZSksIDAsICphcmcsCisJCQkgIHN0YXJ0X2Jsb2NrLCBsZW4sCisJCQkgIDAvKnZpb2xhdGVfcmVhZG9ubHkqLykgIT0gbGVuKQorICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiV3JpdGUgb2YgKiphcmcgKCVzKSBhdCAweCVseCBvZiBzdGFjayBmYWlsZWRcbiIsCisJCSAgICphcmcsICh1bnNpZ25lZCBsb25nKXN0YXJ0X2Jsb2NrKTsKKyAgICB0YXJnZXRfc3RhcnRfYmxvY2sgPSBIMlRfd29yZChzdGFydF9ibG9jayk7CisgICAgaWYgKHBzaW1fd3JpdGVfbWVtb3J5KGRldmljZV9zeXN0ZW0obWUpLCAwLCAmdGFyZ2V0X3N0YXJ0X2Jsb2NrLAorCQkJICBzdGFydF9hcmcsIHNpemVvZih0YXJnZXRfc3RhcnRfYmxvY2spLAorCQkJICAwKSAhPSBzaXplb2YodGFyZ2V0X3N0YXJ0X2Jsb2NrKSkKKyAgICAgIGRldmljZV9lcnJvcihtZSwgIldyaXRlIG9mICphcmcgb250byBzdGFjayBmYWlsZWRcbiIpOworICAgIHN0YXJ0X2Jsb2NrICs9IEFMSUdOXzgobGVuKTsKKyAgICBzdGFydF9hcmcgKz0gc2l6ZW9mKHN0YXJ0X2Jsb2NrKTsKKyAgfQorICBzdGFydF9hcmcgKz0gc2l6ZW9mKHN0YXJ0X2Jsb2NrKTsgLyp0aGUgbnVsbCBhdCB0aGUgZW5kKi8KKyAgaWYgKHN0YXJ0X2Jsb2NrICE9IGVuZF9ibG9jaworICAgICAgfHwgQUxJR05fOChzdGFydF9hcmcpICE9IGVuZF9hcmcpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAiUHJvYmFibGUgY29ycnB1dGlvbiBvZiBzdGFjayBhcmd1bWVudHNcbiIpOworICBEVFJBQ0Uoc3RhY2ssICgid3JpdGVfc3RhY2tfYXJndW1lbnRzKCkgPSB2b2lkXG4iKSk7Cit9CisKK3N0YXRpYyB2b2lkCitjcmVhdGVfcHBjX2VsZl9zdGFja19mcmFtZShkZXZpY2UgKm1lLAorCQkJICAgdW5zaWduZWRfd29yZCBib3R0b21fb2Zfc3RhY2ssCisJCQkgICBjaGFyICoqYXJndiwKKwkJCSAgIGNoYXIgKiplbnZwKQoreworICAvKiBmaXhtZSAtIHRoaXMgaXMgb3ZlciBhbGlnbmVkICovCisKKyAgLyogaW5mb3JtYXRpb24gYmxvY2sgKi8KKyAgY29uc3QgdW5zaWduZWQgc2l6ZW9mX2VudnBfYmxvY2sgPSBzaXplb2ZfYXJndW1lbnRfc3RyaW5ncyhlbnZwKTsKKyAgY29uc3QgdW5zaWduZWRfd29yZCBzdGFydF9lbnZwX2Jsb2NrID0gYm90dG9tX29mX3N0YWNrIC0gc2l6ZW9mX2VudnBfYmxvY2s7CisgIGNvbnN0IHVuc2lnbmVkIHNpemVvZl9hcmd2X2Jsb2NrID0gc2l6ZW9mX2FyZ3VtZW50X3N0cmluZ3MoYXJndik7CisgIGNvbnN0IHVuc2lnbmVkX3dvcmQgc3RhcnRfYXJndl9ibG9jayA9IHN0YXJ0X2VudnBfYmxvY2sgLSBzaXplb2ZfYXJndl9ibG9jazsKKworICAvKiBhdXhpbGlhcnkgdmVjdG9yIC0gY29udGFpbnMgb25seSBvbmUgZW50cnkgKi8KKyAgY29uc3QgdW5zaWduZWQgc2l6ZW9mX2F1eF9lbnRyeSA9IDIqc2l6ZW9mKHVuc2lnbmVkX3dvcmQpOyAvKiBtYWdpYyAqLworICBjb25zdCB1bnNpZ25lZF93b3JkIHN0YXJ0X2F1eCA9IHN0YXJ0X2FyZ3ZfYmxvY2sgLSBBTElHTl84KHNpemVvZl9hdXhfZW50cnkpOworCisgIC8qIGVudmlyb25tZW50IHBvaW50cyAoaW5jbHVkaW5nIG51bGwgc2VudGluYWwpICovCisgIGNvbnN0IHVuc2lnbmVkIHNpemVvZl9lbnZwID0gc2l6ZW9mX2FyZ3VtZW50cyhlbnZwKTsKKyAgY29uc3QgdW5zaWduZWRfd29yZCBzdGFydF9lbnZwID0gc3RhcnRfYXV4IC0gc2l6ZW9mX2VudnA7CisKKyAgLyogYXJndW1lbnQgcG9pbnRlcnMgKGluY2x1ZGluZyBudWxsIHNlbnRpbmFsKSAqLworICBjb25zdCBpbnQgYXJnYyA9IG51bWJlcl9vZl9hcmd1bWVudHMoYXJndik7CisgIGNvbnN0IHVuc2lnbmVkIHNpemVvZl9hcmd2ID0gc2l6ZW9mX2FyZ3VtZW50cyhhcmd2KTsKKyAgY29uc3QgdW5zaWduZWRfd29yZCBzdGFydF9hcmd2ID0gc3RhcnRfZW52cCAtIHNpemVvZl9hcmd2OworCisgIC8qIGxpbmsgcmVnaXN0ZXIgc2F2ZSBhZGRyZXNzIC0gYWxsaWduZWQgdG8gYSAxNmJ5dGUgYm91bmRhcnkgKi8KKyAgY29uc3QgdW5zaWduZWRfd29yZCB0b3Bfb2Zfc3RhY2sgPSAoKHN0YXJ0X2FyZ3YKKwkJCQkgICAgICAgLSAyICogc2l6ZW9mKHVuc2lnbmVkX3dvcmQpKQorCQkJCSAgICAgICYgfjB4Zik7CisKKyAgLyogaW5zdGFsbCBhcmd1bWVudHMgb24gc3RhY2sgKi8KKyAgd3JpdGVfc3RhY2tfYXJndW1lbnRzKG1lLCBlbnZwLAorCQkJc3RhcnRfZW52cF9ibG9jaywgYm90dG9tX29mX3N0YWNrLAorCQkJc3RhcnRfZW52cCwgc3RhcnRfYXV4KTsKKyAgd3JpdGVfc3RhY2tfYXJndW1lbnRzKG1lLCBhcmd2LAorCQkJc3RhcnRfYXJndl9ibG9jaywgc3RhcnRfZW52cF9ibG9jaywKKwkJCXN0YXJ0X2FyZ3YsIHN0YXJ0X2VudnApOworCisgIC8qIHNldCB1cCB0aGUgcmVnaXN0ZXJzICovCisgIHBzaW1fd3JpdGVfcmVnaXN0ZXIoZGV2aWNlX3N5c3RlbShtZSksIC0xLAorCQkgICAgICAmdG9wX29mX3N0YWNrLCAic3AiLCBjb29rZWRfdHJhbnNmZXIpOworICBwc2ltX3dyaXRlX3JlZ2lzdGVyKGRldmljZV9zeXN0ZW0obWUpLCAtMSwKKwkJICAgICAgJmFyZ2MsICJyMyIsIGNvb2tlZF90cmFuc2Zlcik7CisgIHBzaW1fd3JpdGVfcmVnaXN0ZXIoZGV2aWNlX3N5c3RlbShtZSksIC0xLAorCQkgICAgICAmc3RhcnRfYXJndiwgInI0IiwgY29va2VkX3RyYW5zZmVyKTsKKyAgcHNpbV93cml0ZV9yZWdpc3RlcihkZXZpY2Vfc3lzdGVtKG1lKSwgLTEsCisJCSAgICAgICZzdGFydF9lbnZwLCAicjUiLCBjb29rZWRfdHJhbnNmZXIpOworICBwc2ltX3dyaXRlX3JlZ2lzdGVyKGRldmljZV9zeXN0ZW0obWUpLCAtMSwKKwkJICAgICAgJnN0YXJ0X2F1eCwgInI2IiwgY29va2VkX3RyYW5zZmVyKTsKK30KKworc3RhdGljIHZvaWQKK2NyZWF0ZV9wcGNfYWl4X3N0YWNrX2ZyYW1lKGRldmljZSAqbWUsCisJCQkgICB1bnNpZ25lZF93b3JkIGJvdHRvbV9vZl9zdGFjaywKKwkJCSAgIGNoYXIgKiphcmd2LAorCQkJICAgY2hhciAqKmVudnApCit7CisgIHVuc2lnbmVkX3dvcmQgY29yZV9lbnZwOworICB1bnNpZ25lZF93b3JkIGNvcmVfYXJndjsKKyAgdW5zaWduZWRfd29yZCBjb3JlX2FyZ2M7CisgIHVuc2lnbmVkX3dvcmQgY29yZV9hdXg7CisgIHVuc2lnbmVkX3dvcmQgdG9wX29mX3N0YWNrOworCisgIC8qIGNoZWF0IC0gY3JlYXRlIGFuIGVsZiBzdGFjayBmcmFtZSAqLworICBjcmVhdGVfcHBjX2VsZl9zdGFja19mcmFtZShtZSwgYm90dG9tX29mX3N0YWNrLCBhcmd2LCBlbnZwKTsKKyAgCisgIC8qIGV4dHJhY3QgYXJndW1lbnQgYWRkcmVzc2VzIGZyb20gcmVnaXN0ZXJzICovCisgIHBzaW1fcmVhZF9yZWdpc3RlcihkZXZpY2Vfc3lzdGVtKG1lKSwgMCwKKwkJICAgICAmdG9wX29mX3N0YWNrLCAicjEiLCBjb29rZWRfdHJhbnNmZXIpOworICBwc2ltX3JlYWRfcmVnaXN0ZXIoZGV2aWNlX3N5c3RlbShtZSksIDAsCisJCSAgICAgJmNvcmVfYXJnYywgInIzIiwgY29va2VkX3RyYW5zZmVyKTsKKyAgcHNpbV9yZWFkX3JlZ2lzdGVyKGRldmljZV9zeXN0ZW0obWUpLCAwLAorCQkgICAgICZjb3JlX2FyZ3YsICJyNCIsIGNvb2tlZF90cmFuc2Zlcik7CisgIHBzaW1fcmVhZF9yZWdpc3RlcihkZXZpY2Vfc3lzdGVtKG1lKSwgMCwKKwkJICAgICAmY29yZV9lbnZwLCAicjUiLCBjb29rZWRfdHJhbnNmZXIpOworICBwc2ltX3JlYWRfcmVnaXN0ZXIoZGV2aWNlX3N5c3RlbShtZSksIDAsCisJCSAgICAgJmNvcmVfYXV4LCAicjYiLCBjb29rZWRfdHJhbnNmZXIpOworCisgIC8qIGV4dHJhY3QgYXJndW1lbnRzIGZyb20gcmVnaXN0ZXJzICovCisgIGRldmljZV9lcnJvcihtZSwgIlVuZmluaXNoZWQgcHJvY2VkdXJlIGNyZWF0ZV9wcGNfYWl4X3N0YWNrX2ZyYW1lXG4iKTsKK30KKworCitzdGF0aWMgdm9pZAorY3JlYXRlX3BwY19jaGlycF9ib290YXJncyhkZXZpY2UgKm1lLAorCQkJICBjaGFyICoqYXJndikKK3sKKyAgLyogY29uY2F0IHRoZSBhcmd1bWVudHMgKi8KKyAgY2hhciBhcmdzWzEwMjRdOworICBjaGFyICoqY2hwID0gYXJndiArIDE7CisgIGFyZ3NbMF0gPSAnXDAnOworICB3aGlsZSAoKmNocCAhPSBOVUxMKSB7CisgICAgaWYgKHN0cmxlbihhcmdzKSA+IDApCisgICAgICBzdHJjYXQoYXJncywgIiAiKTsKKyAgICBpZiAoc3RybGVuKGFyZ3MpICsgc3RybGVuKCpjaHApID49IHNpemVvZihhcmdzKSkKKyAgICAgIGRldmljZV9lcnJvcihtZSwgImJ1ZmZlciBvdmVyZmxvdyIpOworICAgIHN0cmNhdChhcmdzLCAqY2hwKTsKKyAgICBjaHArKzsKKyAgfQorCisgIC8qIHNldCB0aGUgYXJndW1lbnRzIHByb3BlcnR5ICovCisgIHRyZWVfcGFyc2UobWUsICIvY2hvc2VuL2Jvb3RhcmdzIFwiJXMiLCBhcmdzKTsKK30KKworCitzdGF0aWMgaW50Citod19zdGFja19pb2N0bChkZXZpY2UgKm1lLAorCSAgICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgICAgdW5zaWduZWRfd29yZCBjaWEsCisJICAgICAgIGRldmljZV9pb2N0bF9yZXF1ZXN0IHJlcXVlc3QsCisJICAgICAgIHZhX2xpc3QgYXApCit7CisgIHN3aXRjaCAocmVxdWVzdCkgeworICBjYXNlIGRldmljZV9pb2N0bF9jcmVhdGVfc3RhY2s6CisgICAgeworICAgICAgdW5zaWduZWRfd29yZCBzdGFja19wb2ludGVyID0gdmFfYXJnKGFwLCB1bnNpZ25lZF93b3JkKTsKKyAgICAgIGNoYXIgKiphcmd2ID0gdmFfYXJnKGFwLCBjaGFyICoqKTsKKyAgICAgIGNoYXIgKiplbnZwID0gdmFfYXJnKGFwLCBjaGFyICoqKTsKKyAgICAgIGNvbnN0IGNoYXIgKnN0YWNrX3R5cGU7CisgICAgICBEVFJBQ0Uoc3RhY2ssCisJICAgICAoInN0YWNrX2lvY3RsX2NhbGxiYWNrKG1lPTB4JWx4OiVzIHByb2Nlc3Nvcj0weCVseCBjaWE9MHglbHggYXJndj0weCVseCBlbnZwPTB4JWx4KVxuIiwKKwkgICAgICAobG9uZyltZSwgZGV2aWNlX25hbWUobWUpLAorCSAgICAgIChsb25nKXByb2Nlc3NvciwKKwkgICAgICAobG9uZyljaWEsCisJICAgICAgKGxvbmcpYXJndiwKKwkgICAgICAobG9uZyllbnZwKSk7CisgICAgICBzdGFja190eXBlID0gZGV2aWNlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5KG1lLCAic3RhY2stdHlwZSIpOworICAgICAgaWYgKHN0cmNtcChzdGFja190eXBlLCAicHBjLWVsZiIpID09IDApCisJY3JlYXRlX3BwY19lbGZfc3RhY2tfZnJhbWUobWUsIHN0YWNrX3BvaW50ZXIsIGFyZ3YsIGVudnApOworICAgICAgZWxzZSBpZiAoc3RyY21wKHN0YWNrX3R5cGUsICJwcGMteGNvZmYiKSA9PSAwKQorCWNyZWF0ZV9wcGNfYWl4X3N0YWNrX2ZyYW1lKG1lLCBzdGFja19wb2ludGVyLCBhcmd2LCBlbnZwKTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcChzdGFja190eXBlLCAiY2hpcnAiKSA9PSAwKQorCWNyZWF0ZV9wcGNfY2hpcnBfYm9vdGFyZ3MobWUsIGFyZ3YpOworICAgICAgZWxzZSBpZiAoc3RyY21wKHN0YWNrX3R5cGUsICJub25lIikgIT0gMCkKKwlkZXZpY2VfZXJyb3IobWUsICJVbmtub3duIGluaXRpYWwgc3RhY2sgZnJhbWUgdHlwZSAlcyIsIHN0YWNrX3R5cGUpOworICAgICAgRFRSQUNFKHN0YWNrLCAKKwkgICAgICgic3RhY2tfaW9jdGxfY2FsbGJhY2soKSA9IHZvaWRcbiIpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgZGVmYXVsdDoKKyAgICBkZXZpY2VfZXJyb3IobWUsICJVbnN1cHBvcnRlZCBpb2N0bCByZXF1ZXN0ZWQiKTsKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGRldmljZV9jYWxsYmFja3MgY29uc3QgaHdfc3RhY2tfY2FsbGJhY2tzID0geworICB7IE5VTEwsIH0sCisgIHsgTlVMTCwgfSwgLyogYWRkcmVzcyAqLworICB7IE5VTEwsIH0sIC8qIElPICovCisgIHsgTlVMTCwgfSwgLyogRE1BICovCisgIHsgTlVMTCwgfSwgLyogaW50ZXJydXB0ICovCisgIHsgTlVMTCwgfSwgLyogdW5pdCAqLworICBOVUxMLCAvKiBpbnN0YW5jZSAqLworICBod19zdGFja19pb2N0bCwKK307CisKK2NvbnN0IGRldmljZV9kZXNjcmlwdG9yIGh3X2luaXRfZGV2aWNlX2Rlc2NyaXB0b3JbXSA9IHsKKyAgeyAiZmlsZSIsIE5VTEwsICZod19maWxlX2NhbGxiYWNrcyB9LAorICB7ICJkYXRhIiwgTlVMTCwgJmh3X2RhdGFfY2FsbGJhY2tzIH0sCisgIHsgImxvYWQtYmluYXJ5IiwgTlVMTCwgJmh3X2JpbmFyeV9jYWxsYmFja3MgfSwKKyAgeyAibWFwLWJpbmFyeSIsIE5VTEwsICZod19iaW5hcnlfY2FsbGJhY2tzIH0sCisgIHsgInN0YWNrIiwgTlVMTCwgJmh3X3N0YWNrX2NhbGxiYWNrcyB9LAorICB7IE5VTEwgfSwKK307CisKKyNlbmRpZiBfSFdfSU5JVF9DXwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9od19pb2J1cy5jIGIvc2ltL3BwYy9od19pb2J1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZDEzOGMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2h3X2lvYnVzLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgX0hXX0lPQlVTX0NfCisjZGVmaW5lIF9IV19JT0JVU19DXworCisjaWZuZGVmIFNUQVRJQ19JTkxJTkVfSFdfSU9CVVMKKyNkZWZpbmUgU1RBVElDX0lOTElORV9IV19JT0JVUyBTVEFUSUNfSU5MSU5FCisjZW5kaWYKKworI2luY2x1ZGUgImRldmljZV90YWJsZS5oIgorCisKKy8qIERFVklDRQorCisgICBpb2J1cyAtIHNpbXBsZSBidXMgZm9yIGF0dGFjaGluZyBkZXZpY2VzCisKKyAgIERFU0NSSVBUSU9OCisKKyAgIElPQlVTIHByb3ZpZGVzIGEgc2ltcGxlIGBsb2NhbCcgYnVzIGZvciBhdHRhY2hpbmcgKGhhbmdpbmcpCisgICBwcm9ncmFtbWVkIElPIGRldmljZXMgZnJvbS4gIEFsbCBjaGlsZCBkZXZpY2VzIGFyZSBkaXJlY3RseSBtYXBwZWQKKyAgIGludG8gdGhpcyBkZXZpY2VzIHBhcmVudCBhZGRyZXNzIHNwYWNlIChhZnRlciBjaGVja2luZyB0aGF0IHRoZQorICAgYXR0YWNoIGFkZHJlc3MgbGllcyB3aXRoaW4gdGhlIDw8aW9idXM+PiBhZGRyZXNzIHJhbmdlLiAgYWRkcmVzcykuCisKKyAgIFBST1BFUlRJRVMKKworICAgTm9uZS4KKworICAgKi8KKworc3RhdGljIHZvaWQKK2h3X2lvYnVzX2F0dGFjaF9hZGRyZXNzX2NhbGxiYWNrKGRldmljZSAqbWUsCisJCQkJIGF0dGFjaF90eXBlIHR5cGUsCisJCQkJIGludCBzcGFjZSwKKwkJCQkgdW5zaWduZWRfd29yZCBhZGRyLAorCQkJCSB1bnNpZ25lZCBucl9ieXRlcywKKwkJCQkgYWNjZXNzX3R5cGUgYWNjZXNzLAorCQkJCSBkZXZpY2UgKmNsaWVudCkgLypjYWxsYmFjay9kZWZhdWx0Ki8KK3sKKyAgaW50IGF0dGFjaF9zcGFjZTsKKyAgdW5zaWduZWRfd29yZCBhdHRhY2hfYWRkcmVzczsKKyAgLyogc2FuaXR5IGNoZWNrICovCisgIGlmIChzcGFjZSAhPSAwKQorICAgIGRldmljZV9lcnJvcihtZSwgImludmFsaWQgc3BhY2UgKCVkKSBzcGVjaWZpZWQgYnkgJXMiLAorCQkgc3BhY2UsIGRldmljZV9wYXRoKGNsaWVudCkpOworICAvKiBnZXQgdGhlIGJ1cyBhZGRyZXNzICovCisgIGRldmljZV9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzKGRldmljZV9wYXJlbnQobWUpLAorCQkJCSAgIGRldmljZV91bml0X2FkZHJlc3MobWUpLAorCQkJCSAgICZhdHRhY2hfc3BhY2UsCisJCQkJICAgJmF0dGFjaF9hZGRyZXNzLAorCQkJCSAgIG1lKTsKKyAgaWYgKGFkZHIgPCBhdHRhY2hfYWRkcmVzcykKKyAgICBkZXZpY2VfZXJyb3IobWUsICJJbnZhbGlkIGF0dGFjaCBhZGRyZXNzIDB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpYWRkcik7CisgIGRldmljZV9hdHRhY2hfYWRkcmVzcyhkZXZpY2VfcGFyZW50KG1lKSwKKwkJCXR5cGUsCisJCQlhdHRhY2hfc3BhY2UsCisJCQlhZGRyLAorCQkJbnJfYnl0ZXMsCisJCQlhY2Nlc3MsCisJCQljbGllbnQpOworfQorCisKK3N0YXRpYyBkZXZpY2VfY2FsbGJhY2tzIGNvbnN0IGh3X2lvYnVzX2NhbGxiYWNrcyA9IHsKKyAgeyBOVUxMLCB9LAorICB7IGh3X2lvYnVzX2F0dGFjaF9hZGRyZXNzX2NhbGxiYWNrLCB9LAorICB7IE5VTEwsIH0sIC8qIElPICovCisgIHsgTlVMTCwgfSwgLyogRE1BICovCisgIHsgTlVMTCwgfSwgLyogaW50ZXJydXB0ICovCisgIHsgZ2VuZXJpY19kZXZpY2VfdW5pdF9kZWNvZGUsCisgICAgZ2VuZXJpY19kZXZpY2VfdW5pdF9lbmNvZGUsCisgICAgZ2VuZXJpY19kZXZpY2VfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcywKKyAgICBnZW5lcmljX2RldmljZV9zaXplX3RvX2F0dGFjaF9zaXplIH0KK307CisKKworY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgaHdfaW9idXNfZGV2aWNlX2Rlc2NyaXB0b3JbXSA9IHsKKyAgeyAiaW9idXMiLCBOVUxMLCAmaHdfaW9idXNfY2FsbGJhY2tzIH0sCisgIHsgTlVMTCwgfSwKK307CisKKyNlbmRpZiAvKiBfSFdfSU9CVVNfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2h3X21lbW9yeS5jIGIvc2ltL3BwYy9od19tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTczMjRiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9od19tZW1vcnkuYwpAQCAtMCwwICsxLDUzOCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfSFdfTUVNT1JZX0NfCisjZGVmaW5lIF9IV19NRU1PUllfQ18KKworI2lmbmRlZiBTVEFUSUNfSU5MSU5FX0hXX01FTU9SWQorI2RlZmluZSBTVEFUSUNfSU5MSU5FX0hXX01FTU9SWSBTVEFUSUNfSU5MSU5FCisjZW5kaWYKKworI2luY2x1ZGUgImRldmljZV90YWJsZS5oIgorCisvKiBERVZJQ0UKKworCisgICBtZW1vcnkgLSBkZXNjcmlwdGlvbiBvZiBzeXN0ZW0gbWVtb3J5CisKKworICAgREVTQ1JJUFRJT04KKworCisgICBUaGlzIGRldmljZSBkZXNjcmliZXMgdGhlIHNpemUgYW5kIGxvY2F0aW9uIG9mIHRoZSBiYW5rcyBvZgorICAgcGh5c2ljYWwgbWVtb3J5IHdpdGhpbiB0aGUgc2ltdWxhdGlvbi4KKworICAgSW4gYWRkaXRpb24sIHRoaXMgZGV2aWNlIHN1cHBvcnRzIHRoZSAiY2xhaW0iIGFuZCAicmVsZWFzZSIgbWV0aG9kcworICAgdGhhdCBjYW4gYmUgdXNlZCBieSBPcGVuQm9vdCBjbGllbnQgcHJvZ3JhbXMgdG8gbWFuYWdlIHRoZQorICAgYWxsb2NhdGlvbiBvZiBwaHlzaWNhbCBtZW1vcnkuCisKKworICAgUFJPUEVSVElFUworCisKKyAgIHJlZyA9IHsgPGFkZHJlc3M+IDxzaXplPiB9IChyZXF1aXJlZCkKKworICAgRWFjaCBwYWlyIHNwZWNpZnkgb25lIGJhbmsgb2YgbWVtb3J5LgorCisgICBhdmFpbGFibGUgPSB7IDxhZGRyZXNzPiA8c2l6ZT4gfSAoYXV0b21hdGljKQorCisgICBFYWNoIHBhaXIgc3BlY2lmaWVzIGEgYmxvY2sgb2YgbWVtb3J5IHRoYXQgaXMgY3VycmVudGx5IHVuYWxsb2NhdGVkLiAgCisKKworICAgQlVHUworCisKKyAgIE9wZW5GaXJtd2FyZSBkb2Vzbid0IG1ha2UgaXQgY2xlYXIgaWYsIHdoZW4gcmVsZWFzaW5nIG1lbW9yeSB0aGUKKyAgIHNhbWUgYWRkcmVzcyArIHNpemUgcGFpciBhcyB3YXMgdXNlZCBkdXJpbmcgdGhlIGNsYWltIHNob3VsZCBiZQorICAgc3BlY2lmaWVkLgorCisgICBJdCBpcyBhc3N1bWVkIHRoYXQgI3NpemUtY2VsbHMgYW5kICNhZGRyZXNzLWNlbGxzIGZvciB0aGUgcGFyZW50CisgICBub2RlIG9mIHRoaXMgZGV2aWNlIGFyZSBib3RoIG9uZSBpLmUuIGFuIGFkZHJlc3Mgb3Igc2l6ZSBjYW4gYmUKKyAgIHNwZWNpZmllZCB1c2luZyBhIHNpbmdsZSBtZW1vcnkgY2VsbCAod29yZCkuCisKKyAgIFNpZ25pZmljYW50IHdvcmsgd2lsbCBiZSByZXF1aXJlZCBiZWZvcmUgdGhlIDw8bWVtb3J5Pj4gZGV2aWNlIGNhbgorICAgc3VwcG9ydCA2NGJpdCBhZGRyZXNzZXMgKCNhZGRyZXNzLWNlbGxzIGVxdWFsIHR3bykuCisKKyAgICovCisKK3R5cGVkZWYgc3RydWN0IF9tZW1vcnlfcmVnX3NwZWMgeworICB1bnNpZ25lZF9jZWxsIGJhc2U7CisgIHVuc2lnbmVkX2NlbGwgc2l6ZTsKK30gbWVtb3J5X3JlZ19zcGVjOworCit0eXBlZGVmIHN0cnVjdCBfaHdfbWVtb3J5X2NodW5rIGh3X21lbW9yeV9jaHVuazsKK3N0cnVjdCBfaHdfbWVtb3J5X2NodW5rIHsKKyAgdW5zaWduZWRfd29yZCBhZGRyZXNzOworICB1bnNpZ25lZF93b3JkIHNpemU7CisgIGludCBhdmFpbGFibGU7CisgIGh3X21lbW9yeV9jaHVuayAqbmV4dDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9od19tZW1vcnlfZGV2aWNlIHsKKyAgaHdfbWVtb3J5X2NodW5rICpoZWFwOworfSBod19tZW1vcnlfZGV2aWNlOworCisKK3N0YXRpYyB2b2lkICoKK2h3X21lbW9yeV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKKwkJIGNvbnN0IGRldmljZV91bml0ICp1bml0X2FkZHJlc3MsCisJCSBjb25zdCBjaGFyICphcmdzKQoreworICBod19tZW1vcnlfZGV2aWNlICpod19tZW1vcnkgPSBaQUxMT0MoaHdfbWVtb3J5X2RldmljZSk7CisgIHJldHVybiBod19tZW1vcnk7Cit9CisKKworc3RhdGljIHZvaWQKK2h3X21lbW9yeV9zZXRfYXZhaWxhYmxlKGRldmljZSAqbWUsCisJCQlod19tZW1vcnlfZGV2aWNlICpod19tZW1vcnkpCit7CisgIGh3X21lbW9yeV9jaHVuayAqY2h1bmsgPSBOVUxMOworICBtZW1vcnlfcmVnX3NwZWMgKmF2YWlsYWJsZSA9IE5VTEw7CisgIGludCBucl9hdmFpbGFibGUgPSAwOworICBpbnQgY3VyciA9IDA7CisgIGludCBzaXplb2ZfYXZhaWxhYmxlID0gMDsKKyAgLyogZGV0ZXJtaW5lIHRoZSBuciBvZiBhdmFpbGFibGUgY2h1bmtzICovCisgIGNodW5rID0gaHdfbWVtb3J5LT5oZWFwOworICBucl9hdmFpbGFibGUgPSAwOworICB3aGlsZSAoY2h1bmsgIT0gTlVMTCkgeworICAgIGlmIChjaHVuay0+YXZhaWxhYmxlKQorICAgICAgbnJfYXZhaWxhYmxlICs9IDE7CisgICAgQVNTRVJUKGNodW5rLT5uZXh0ID09IE5VTEwKKwkgICB8fCBjaHVuay0+YWRkcmVzcyA8IGNodW5rLT5uZXh0LT5hZGRyZXNzKTsKKyAgICBBU1NFUlQoY2h1bmstPm5leHQgPT0gTlVMTAorCSAgIHx8IGNodW5rLT5hZGRyZXNzICsgY2h1bmstPnNpemUgPT0gY2h1bmstPm5leHQtPmFkZHJlc3MpOworICAgIGNodW5rID0gY2h1bmstPm5leHQ7CisgIH0KKyAgLyogbm93IGNyZWF0ZSB0aGUgYXZhaWxhYmxlIHN0cnVjdCAqLworICBBU1NFUlQobnJfYXZhaWxhYmxlID4gMCk7CisgIHNpemVvZl9hdmFpbGFibGUgPSBzaXplb2YobWVtb3J5X3JlZ19zcGVjKSAqIG5yX2F2YWlsYWJsZTsKKyAgYXZhaWxhYmxlID0gemFsbG9jKHNpemVvZl9hdmFpbGFibGUpOworICBjaHVuayA9IGh3X21lbW9yeS0+aGVhcDsKKyAgY3VyciA9IDA7CisgIHdoaWxlIChjaHVuayAhPSBOVUxMKSB7CisgICAgaWYgKGNodW5rLT5hdmFpbGFibGUpIHsKKyAgICAgIGF2YWlsYWJsZVtjdXJyXS5iYXNlID0gSDJCRV9jZWxsKGNodW5rLT5hZGRyZXNzKTsKKyAgICAgIGF2YWlsYWJsZVtjdXJyXS5zaXplID0gSDJCRV9jZWxsKGNodW5rLT5zaXplKTsKKyAgICAgIGN1cnIgKz0gMTsKKyAgICB9CisgICAgY2h1bmsgPSBjaHVuay0+bmV4dDsKKyAgfQorICAvKiB1cGRhdGUgKi8KKyAgZGV2aWNlX3NldF9hcnJheV9wcm9wZXJ0eShtZSwgImF2YWlsYWJsZSIsIGF2YWlsYWJsZSwgc2l6ZW9mX2F2YWlsYWJsZSk7CisgIHpmcmVlKGF2YWlsYWJsZSk7Cit9CisKKworc3RhdGljIHZvaWQKK2h3X21lbW9yeV9pbml0X2FkZHJlc3MoZGV2aWNlICptZSkKK3sKKyAgaHdfbWVtb3J5X2RldmljZSAqaHdfbWVtb3J5ID0gKGh3X21lbW9yeV9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKKworICAvKiBmcmVlIHVwIGFueSBwcmV2aW91cyBzdHJ1Y3R1cmVzICovCisgIHsKKyAgICBod19tZW1vcnlfY2h1bmsgKmN1cnJfY2h1bmsgPSBod19tZW1vcnktPmhlYXA7CisgICAgaHdfbWVtb3J5LT5oZWFwID0gTlVMTDsKKyAgICB3aGlsZSAoY3Vycl9jaHVuayAhPSBOVUxMKSB7CisgICAgICBod19tZW1vcnlfY2h1bmsgKmRlYWRfY2h1bmsgPSBjdXJyX2NodW5rOworICAgICAgY3Vycl9jaHVuayA9IGRlYWRfY2h1bmstPm5leHQ7CisgICAgICBkZWFkX2NodW5rLT5uZXh0ID0gTlVMTDsKKyAgICAgIHpmcmVlKGRlYWRfY2h1bmspOworICAgIH0KKyAgfQorCisgIC8qIGF0dGFjaCBtZW1vcnkgcmVnaW9ucyBhY2NvcmRpbmcgdG8gdGhlICJyZWciIHByb3BlcnR5ICovCisgIHsKKyAgICBpbnQgcmVnX25yOworICAgIHJlZ19wcm9wZXJ0eV9zcGVjIHJlZzsKKyAgICBmb3IgKHJlZ19uciA9IDA7CisJIGRldmljZV9maW5kX3JlZ19hcnJheV9wcm9wZXJ0eShtZSwgInJlZyIsIHJlZ19uciwgJnJlZyk7CisJIHJlZ19ucisrKSB7CisgICAgICBpbnQgaTsKKyAgICAgIC8qIGNoZWNrIHRoYXQgdGhlIGVudHJ5IG1lZXRzIHJlc3RyaWN0aW9ucyAqLworICAgICAgZm9yIChpID0gMDsgaSA8IHJlZy5hZGRyZXNzLm5yX2NlbGxzIC0gMTsgaSsrKQorCWlmIChyZWcuYWRkcmVzcy5jZWxsc1tpXSAhPSAwKQorCSAgZGV2aWNlX2Vycm9yKG1lLCAiT25seSBzaW5nbGUgY2VsbGVkIGFkZHJlc3NlcyBzdXBwb3J0ZWQiKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCByZWcuc2l6ZS5ucl9jZWxscyAtIDE7IGkrKykKKwlpZiAocmVnLnNpemUuY2VsbHNbaV0gIT0gMCkKKwkgIGRldmljZV9lcnJvcihtZSwgIk9ubHkgc2luZ2xlIGNlbGxlZCBzaXplcyBzdXBwb3J0ZWQiKTsKKyAgICAgIC8qIGF0dGFjaCB0aGUgcmFuZ2UgKi8KKyAgICAgIGRldmljZV9hdHRhY2hfYWRkcmVzcyhkZXZpY2VfcGFyZW50KG1lKSwKKwkJCSAgICBhdHRhY2hfcmF3X21lbW9yeSwKKwkJCSAgICAwIC8qYWRkcmVzcyBzcGFjZSovLAorCQkJICAgIHJlZy5hZGRyZXNzLmNlbGxzW3JlZy5hZGRyZXNzLm5yX2NlbGxzIC0gMV0sCisJCQkgICAgcmVnLnNpemUuY2VsbHNbcmVnLnNpemUubnJfY2VsbHMgLSAxXSwKKwkJCSAgICBhY2Nlc3NfcmVhZF93cml0ZV9leGVjLAorCQkJICAgIG1lKTsKKyAgICB9CisgIH0KKworICAvKiBjcmVhdGUgdGhlIGluaXRpYWwgYGF2YWlsYWJsZSBtZW1vcnknIGRhdGEgc3RydWN0dXJlICovCisgIGlmIChkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgImF2YWlsYWJsZSIpICE9IE5VTEwpIHsKKyAgICBod19tZW1vcnlfY2h1bmsgKipjdXJyX2NodW5rID0gJmh3X21lbW9yeS0+aGVhcDsKKyAgICBpbnQgY2VsbF9ucjsKKyAgICB1bnNpZ25lZF9jZWxsIGR1bW15OworICAgIGludCBucl9jZWxscyA9IGRldmljZV9maW5kX2ludGVnZXJfYXJyYXlfcHJvcGVydHkobWUsICJhdmFpbGFibGUiLCAwLCAmZHVtbXkpOworICAgIGlmICgobnJfY2VsbHMgJSAyKSAhPSAwKQorICAgICAgZGV2aWNlX2Vycm9yKG1lLCAicHJvcGVydHkgXCJhdmFpbGFibGVcIiBpbnZhbGlkIC0gY29udGFpbnMgYW4gb2RkIG51bWJlciBvZiBjZWxscyIpOworICAgIGZvciAoY2VsbF9uciA9IDA7CisJIGNlbGxfbnIgPCBucl9jZWxsczsKKwkgY2VsbF9uciArPSAyKSB7CisgICAgICBod19tZW1vcnlfY2h1bmsgKm5ld19jaHVuayA9IFpBTExPQyhod19tZW1vcnlfY2h1bmspOworICAgICAgZGV2aWNlX2ZpbmRfaW50ZWdlcl9hcnJheV9wcm9wZXJ0eShtZSwgImF2YWlsYWJsZSIsIGNlbGxfbnIsCisJCQkJCSAmbmV3X2NodW5rLT5hZGRyZXNzKTsKKyAgICAgIGRldmljZV9maW5kX2ludGVnZXJfYXJyYXlfcHJvcGVydHkobWUsICJhdmFpbGFibGUiLCBjZWxsX25yICsgMSwKKwkJCQkJICZuZXdfY2h1bmstPnNpemUpOworICAgICAgbmV3X2NodW5rLT5hdmFpbGFibGUgPSAxOworICAgICAgKmN1cnJfY2h1bmsgPSBuZXdfY2h1bms7CisgICAgICBjdXJyX2NodW5rID0gJm5ld19jaHVuay0+bmV4dDsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgaHdfbWVtb3J5X2NodW5rICoqY3Vycl9jaHVuayA9ICZod19tZW1vcnktPmhlYXA7CisgICAgaW50IHJlZ19ucjsKKyAgICByZWdfcHJvcGVydHlfc3BlYyByZWc7CisgICAgZm9yIChyZWdfbnIgPSAwOworCSBkZXZpY2VfZmluZF9yZWdfYXJyYXlfcHJvcGVydHkobWUsICJyZWciLCByZWdfbnIsICZyZWcpOworCSByZWdfbnIrKykgeworICAgICAgaHdfbWVtb3J5X2NodW5rICpuZXdfY2h1bms7CisgICAgICBuZXdfY2h1bmsgPSBaQUxMT0MoaHdfbWVtb3J5X2NodW5rKTsKKyAgICAgIG5ld19jaHVuay0+YWRkcmVzcyA9IHJlZy5hZGRyZXNzLmNlbGxzW3JlZy5hZGRyZXNzLm5yX2NlbGxzIC0gMV07CisgICAgICBuZXdfY2h1bmstPnNpemUgPSByZWcuc2l6ZS5jZWxsc1tyZWcuc2l6ZS5ucl9jZWxscyAtIDFdOworICAgICAgbmV3X2NodW5rLT5hdmFpbGFibGUgPSAxOworICAgICAgKmN1cnJfY2h1bmsgPSBuZXdfY2h1bms7CisgICAgICBjdXJyX2NodW5rID0gJm5ld19jaHVuay0+bmV4dDsKKyAgICB9CisgIH0KKworICAvKiBpbml0aWFsaXplIHRoZSBhbGxvYyBwcm9wZXJ0eSBmb3IgdGhpcyBkZXZpY2UgKi8KKyAgaHdfbWVtb3J5X3NldF9hdmFpbGFibGUobWUsIGh3X21lbW9yeSk7Cit9CisKK3N0YXRpYyB2b2lkCitod19tZW1vcnlfaW5zdGFuY2VfZGVsZXRlKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UpCit7CisgIHJldHVybjsKK30KKworc3RhdGljIGludAoraHdfbWVtb3J5X2luc3RhbmNlX2NsYWltKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQkgaW50IG5fc3RhY2tfYXJncywKKwkJCSB1bnNpZ25lZF9jZWxsIHN0YWNrX2FyZ3NbLypuX3N0YWNrX2FyZ3MqL10sCisJCQkgaW50IG5fc3RhY2tfcmV0dXJucywKKwkJCSB1bnNpZ25lZF9jZWxsIHN0YWNrX3JldHVybnNbLypuX3N0YWNrX3JldHVybnMqL10pCit7CisgIGh3X21lbW9yeV9kZXZpY2UgKmh3X21lbW9yeSA9IGRldmljZV9pbnN0YW5jZV9kYXRhKGluc3RhbmNlKTsKKyAgZGV2aWNlICptZSA9IGRldmljZV9pbnN0YW5jZV9kZXZpY2UoaW5zdGFuY2UpOworICBpbnQgc3RhY2twID0gMDsKKyAgdW5zaWduZWRfd29yZCBhbGlnbm1lbnQ7CisgIHVuc2lnbmVkX2NlbGwgc2l6ZTsKKyAgdW5zaWduZWRfY2VsbCBhZGRyZXNzOworICBod19tZW1vcnlfY2h1bmsgKmNodW5rID0gTlVMTDsKKworICAvKiBnZXQgdGhlIGFsaWdubWVudCBmcm9tIHRoZSBzdGFjayAqLworICBpZiAobl9zdGFja19hcmdzIDwgc3RhY2twICsgMSkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJjbGFpbSAtIGluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIChhbGlnbm1lbnQgbWlzc2luZykiKTsKKyAgYWxpZ25tZW50ID0gc3RhY2tfYXJnc1tzdGFja3BdOworICBzdGFja3ArKzsKKworICAvKiBnZXQgdGhlIHNpemUgZnJvbSB0aGUgc3RhY2sgKi8KKyAgeworICAgIGludCBpOworICAgIGludCBucl9jZWxscyA9IGRldmljZV9ucl9zaXplX2NlbGxzKGRldmljZV9wYXJlbnQobWUpKTsKKyAgICBpZiAobl9zdGFja19hcmdzIDwgc3RhY2twICsgbnJfY2VsbHMpCisgICAgICBkZXZpY2VfZXJyb3IobWUsICJjbGFpbSAtIGluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIChzaXplIG1pc3NpbmcpIik7CisgICAgZm9yIChpID0gMDsgaSA8IG5yX2NlbGxzIC0gMTsgaSsrKSB7CisgICAgICBpZiAoc3RhY2tfYXJnc1tzdGFja3BdICE9IDApCisJZGV2aWNlX2Vycm9yKG1lLCAiY2xhaW0gLSBtdWx0aS1jZWxsIHNpemVzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgIHN0YWNrcCsrOworICAgIH0KKyAgICBzaXplID0gc3RhY2tfYXJnc1tzdGFja3BdOworICAgIHN0YWNrcCsrOworICB9CisKKyAgLyogZ2V0IHRoZSBhZGRyZXNzIGZyb20gdGhlIHN0YWNrICovCisgIHsKKyAgICBpbnQgbnJfY2VsbHMgPSBkZXZpY2VfbnJfYWRkcmVzc19jZWxscyhkZXZpY2VfcGFyZW50KG1lKSk7CisgICAgaWYgKGFsaWdubWVudCAhPSAwKSB7CisgICAgICBpZiAobl9zdGFja19hcmdzICE9IHN0YWNrcCkgeworCWlmIChuX3N0YWNrX2FyZ3MgPT0gc3RhY2twICsgbnJfY2VsbHMpCisJICBEVFJBQ0UobWVtb3J5LCAoImNsYWltIC0gZXh0cmEgYWRkcmVzcyBhcmd1bWVudCBpZ25vcmVkXG4iKSk7CisJZWxzZQorCSAgZGV2aWNlX2Vycm9yKG1lLCAiY2xhaW0gLSBpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyAob3B0aW9uYWwgYWRkcikiKTsKKyAgICAgIH0KKyAgICAgIGFkZHJlc3MgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGludCBpOworICAgICAgaWYgKG5fc3RhY2tfYXJncyAhPSBzdGFja3AgKyBucl9jZWxscykKKwlkZXZpY2VfZXJyb3IobWUsICJjbGFpbSAtIGluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIChhZGRyIG1pc3NpbmcpIik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnJfY2VsbHMgLSAxOyBpKyspIHsKKwlpZiAoc3RhY2tfYXJnc1tzdGFja3BdICE9IDApCisJICBkZXZpY2VfZXJyb3IobWUsICJjbGFpbSAtIG11bHRpLWNlbGwgYWRkcmVzc2VzIG5vdCBzdXBwb3J0ZWQiKTsKKwlzdGFja3ArKzsKKyAgICAgIH0KKyAgICAgIGFkZHJlc3MgPSBzdGFja19hcmdzW3N0YWNrcF07CisgICAgfQorICB9CisKKyAgLyogY2hlY2sgdGhhdCB0aGVyZSBpcyBzcGFjZSBmb3IgdGhlIHJlc3VsdCAqLworICBpZiAobl9zdGFja19yZXR1cm5zICE9IDAKKyAgICAgICYmIG5fc3RhY2tfcmV0dXJucyAhPSBkZXZpY2VfbnJfYWRkcmVzc19jZWxscyhkZXZpY2VfcGFyZW50KG1lKSkpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAiY2xhaW0gLSBpbnZhbGlkIG51bWJlciBvZiByZXR1cm4gYXJndW1lbnRzIik7CisKKyAgLyogZmluZCBhIGNodW5rIGNhbmRpZGF0ZSwgZWl0aGVyIGFjY29yZGluZyB0byBhZGRyZXNzIG9yIGFsaWdubWVudCAqLworICBpZiAoYWxpZ25tZW50ID09IDApIHsKKyAgICBjaHVuayA9IGh3X21lbW9yeS0+aGVhcDsKKyAgICB3aGlsZSAoY2h1bmsgIT0gTlVMTCkgeworICAgICAgaWYgKChhZGRyZXNzICsgc2l6ZSkgPD0gKGNodW5rLT5hZGRyZXNzICsgY2h1bmstPnNpemUpKQorCWJyZWFrOworICAgICAgY2h1bmsgPSBjaHVuay0+bmV4dDsKKyAgICB9CisgICAgaWYgKGNodW5rID09IE5VTEwgfHwgYWRkcmVzcyA8IGNodW5rLT5hZGRyZXNzIHx8ICFjaHVuay0+YXZhaWxhYmxlKQorICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiZmFpbGVkIHRvIGFsbG9jYXRlICVsZCBieXRlcyBhdCAweCVseCIsCisJCSAgICh1bnNpZ25lZCBsb25nKXNpemUsICh1bnNpZ25lZCBsb25nKWFkZHJlc3MpOworICAgIERUUkFDRShtZW1vcnksICgiY2xhaW0gLSBhZGRyZXNzPTB4JWx4IHNpemU9MHglbHhcbiIsCisJCSAgICAodW5zaWduZWQgbG9uZylhZGRyZXNzLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpc2l6ZSkpOworICB9CisgIGVsc2UgeworICAgIC8qIGFkanVzdCB0aGUgYWxpZ25tZW50IHNvIHRoYXQgaXQgaXMgYSBwb3dlciBvZiB0d28gKi8KKyAgICB1bnNpZ25lZF93b3JkIGFsaWduX21hc2sgPSAxOworICAgIHdoaWxlIChhbGlnbl9tYXNrIDwgYWxpZ25tZW50ICYmIGFsaWduX21hc2sgIT0gMCkKKyAgICAgIGFsaWduX21hc2sgPDw9IDE7CisgICAgaWYgKGFsaWduX21hc2sgPT0gMCkKKyAgICAgIGRldmljZV9lcnJvcihtZSwgImFsaWdubWVudCAweCVseCBpcyB0byBsYXJnZSIsICh1bnNpZ25lZCBsb25nKWFsaWdubWVudCk7CisgICAgYWxpZ25fbWFzayAtPSAxOworICAgIC8qIG5vdyBmaW5kIGFuIGFsaWduZWQgY2h1bmsgdGhhdCBmaXRzICovCisgICAgY2h1bmsgPSBod19tZW1vcnktPmhlYXA7CisgICAgd2hpbGUgKGNodW5rICE9IE5VTEwpIHsKKyAgICAgIGFkZHJlc3MgPSAoKGNodW5rLT5hZGRyZXNzICsgYWxpZ25fbWFzaykgJiB+YWxpZ25fbWFzayk7CisgICAgICBpZiAoKGNodW5rLT5hdmFpbGFibGUpCisJICAmJiAoY2h1bmstPmFkZHJlc3MgKyBjaHVuay0+c2l6ZSA+PSBhZGRyZXNzICsgc2l6ZSkpCisJYnJlYWs7CisgICAgICBjaHVuayA9IGNodW5rLT5uZXh0OworICAgIH0KKyAgICBpZiAoY2h1bmsgPT0gTlVMTCkKKyAgICAgIGRldmljZV9lcnJvcihtZSwgImZhaWxlZCB0byBhbGxvY2F0ZSAlbGQgYnl0ZXMgd2l0aCBhbGlnbm1lbnQgJWxkIiwKKwkJICAgKHVuc2lnbmVkIGxvbmcpc2l6ZSwgKHVuc2lnbmVkIGxvbmcpYWxpZ25tZW50KTsKKyAgICBEVFJBQ0UobWVtb3J5LCAoImNsYWltIC0gc2l6ZT0weCVseCBhbGlnbm1lbnQ9JWxkICgweCVseCksIGFkZHJlc3M9MHglbHhcbiIsCisJCSAgICAodW5zaWduZWQgbG9uZylzaXplLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpYWxpZ25tZW50LAorCQkgICAgKHVuc2lnbmVkIGxvbmcpYWxpZ25tZW50LAorCQkgICAgKHVuc2lnbmVkIGxvbmcpYWRkcmVzcykpOworICB9CisKKyAgLyogYnJlYWsgb2ZmIGEgYml0IGJlZm9yZSB0aGlzIGNodW5rIGlmIG5lZWRlZCAqLworICBBU1NFUlQoYWRkcmVzcyA+PSBjaHVuay0+YWRkcmVzcyk7CisgIGlmIChhZGRyZXNzID4gY2h1bmstPmFkZHJlc3MpIHsKKyAgICBod19tZW1vcnlfY2h1bmsgKm5leHRfY2h1bmsgPSBaQUxMT0MoaHdfbWVtb3J5X2NodW5rKTsKKyAgICAvKiBpbnNlcnQgYSBuZXcgY2h1bmsgKi8KKyAgICBuZXh0X2NodW5rLT5uZXh0ID0gY2h1bmstPm5leHQ7CisgICAgY2h1bmstPm5leHQgPSBuZXh0X2NodW5rOworICAgIC8qIGFkanVzdCB0aGUgYWRkcmVzcy9zaXplICovCisgICAgbmV4dF9jaHVuay0+YWRkcmVzcyA9IGFkZHJlc3M7CisgICAgbmV4dF9jaHVuay0+c2l6ZSA9IGNodW5rLT5hZGRyZXNzICsgY2h1bmstPnNpemUgLSBuZXh0X2NodW5rLT5hZGRyZXNzOworICAgIG5leHRfY2h1bmstPmF2YWlsYWJsZSA9IDE7CisgICAgY2h1bmstPnNpemUgPSBuZXh0X2NodW5rLT5hZGRyZXNzIC0gY2h1bmstPmFkZHJlc3M7CisgICAgLyogbWFrZSB0aGlzIG5ldyBjaHVuayB0aGUgb25lIHRvIGFsbG9jYXRlICovCisgICAgY2h1bmsgPSBuZXh0X2NodW5rOworICB9CisgIEFTU0VSVChhZGRyZXNzID09IGNodW5rLT5hZGRyZXNzKTsKKworICAvKiBicmVhayBvZmYgYSBiaXQgYWZ0ZXIgdGhpcyBjaHVuayBpZiBuZWVkZWQgKi8KKyAgQVNTRVJUKGFkZHJlc3MgKyBzaXplIDw9IGNodW5rLT5hZGRyZXNzICsgY2h1bmstPnNpemUpOworICBpZiAoYWRkcmVzcyArIHNpemUgPCBjaHVuay0+YWRkcmVzcyArIGNodW5rLT5zaXplKSB7CisgICAgaHdfbWVtb3J5X2NodW5rICpuZXh0X2NodW5rID0gWkFMTE9DKGh3X21lbW9yeV9jaHVuayk7CisgICAgLyogaW5zZXJ0IGl0IGluIHRvIHRoZSBsaXN0ICovCisgICAgbmV4dF9jaHVuay0+bmV4dCA9IGNodW5rLT5uZXh0OworICAgIGNodW5rLT5uZXh0ID0gbmV4dF9jaHVuazsKKyAgICAvKiBhZGp1c3QgdGhlIGFkZHJlc3Mvc2l6ZSAqLworICAgIG5leHRfY2h1bmstPmFkZHJlc3MgPSBhZGRyZXNzICsgc2l6ZTsKKyAgICBuZXh0X2NodW5rLT5zaXplID0gY2h1bmstPmFkZHJlc3MgKyBjaHVuay0+c2l6ZSAtIG5leHRfY2h1bmstPmFkZHJlc3M7CisgICAgbmV4dF9jaHVuay0+YXZhaWxhYmxlID0gMTsKKyAgICBjaHVuay0+c2l6ZSA9IG5leHRfY2h1bmstPmFkZHJlc3MgLSBjaHVuay0+YWRkcmVzczsKKyAgfQorICBBU1NFUlQoYWRkcmVzcyArIHNpemUgPT0gY2h1bmstPmFkZHJlc3MgKyBjaHVuay0+c2l6ZSk7CisKKyAgLyogbm93IGFsbG9jYXRlL3JldHVybiBpdCAqLworICBjaHVuay0+YXZhaWxhYmxlID0gMDsKKyAgaHdfbWVtb3J5X3NldF9hdmFpbGFibGUoZGV2aWNlX2luc3RhbmNlX2RldmljZShpbnN0YW5jZSksIGh3X21lbW9yeSk7CisgIGlmIChuX3N0YWNrX3JldHVybnMgPiAwKSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG5fc3RhY2tfcmV0dXJucyAtIDE7IGkrKykKKyAgICAgIHN0YWNrX3JldHVybnNbaV0gPSAwOworICAgIHN0YWNrX3JldHVybnNbbl9zdGFja19yZXR1cm5zIC0gMV0gPSBhZGRyZXNzOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAoraHdfbWVtb3J5X2luc3RhbmNlX3JlbGVhc2UoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKKwkJCSAgIGludCBuX3N0YWNrX2FyZ3MsCisJCQkgICB1bnNpZ25lZF9jZWxsIHN0YWNrX2FyZ3NbLypuX3N0YWNrX2FyZ3MqL10sCisJCQkgICBpbnQgbl9zdGFja19yZXR1cm5zLAorCQkJICAgdW5zaWduZWRfY2VsbCBzdGFja19yZXR1cm5zWy8qbl9zdGFja19yZXR1cm5zKi9dKQoreworICBod19tZW1vcnlfZGV2aWNlICpod19tZW1vcnkgPSBkZXZpY2VfaW5zdGFuY2VfZGF0YShpbnN0YW5jZSk7CisgIGRldmljZSAqbWUgPSBkZXZpY2VfaW5zdGFuY2VfZGV2aWNlKGluc3RhbmNlKTsKKyAgdW5zaWduZWRfd29yZCBsZW5ndGg7CisgIHVuc2lnbmVkX3dvcmQgYWRkcmVzczsKKyAgaW50IHN0YWNrcCA9IDA7CisgIGh3X21lbW9yeV9jaHVuayAqY2h1bms7CisgIAorICAvKiBnZXQgdGhlIGxlbmd0aCBmcm9tIHRoZSBzdGFjayAqLworICB7CisgICAgaW50IGk7CisgICAgaW50IG5yX2NlbGxzID0gZGV2aWNlX25yX3NpemVfY2VsbHMoZGV2aWNlX3BhcmVudChtZSkpOworICAgIGlmIChuX3N0YWNrX2FyZ3MgPCBzdGFja3AgKyBucl9jZWxscykKKyAgICAgIGRldmljZV9lcnJvcihtZSwgInJlbGVhc2UgLSBpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyAobGVuZ3RoIG1pc3NpbmcpIik7CisgICAgZm9yIChpID0gMDsgaSA8IG5yX2NlbGxzIC0gMTsgaSsrKSB7CisgICAgICBpZiAoc3RhY2tfYXJnc1tzdGFja3BdICE9IDApCisJZGV2aWNlX2Vycm9yKG1lLCAicmVsZWFzZSAtIG11bHRpLWNlbGwgbGVuZ3RoIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgIHN0YWNrcCsrOworICAgIH0KKyAgICBsZW5ndGggPSBzdGFja19hcmdzW3N0YWNrcF07CisgICAgc3RhY2twKys7CisgIH0KKworICAvKiBnZXQgdGhlIGFkZHJlc3MgZnJvbSB0aGUgc3RhY2sgKi8KKyAgeworICAgIGludCBpOworICAgIGludCBucl9jZWxscyA9IGRldmljZV9ucl9hZGRyZXNzX2NlbGxzKGRldmljZV9wYXJlbnQobWUpKTsKKyAgICBpZiAobl9zdGFja19hcmdzICE9IHN0YWNrcCArIG5yX2NlbGxzKQorICAgICAgZGV2aWNlX2Vycm9yKG1lLCAicmVsZWFzZSAtIGluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIChhZGRyIG1pc3NpbmcpIik7CisgICAgZm9yIChpID0gMDsgaSA8IG5yX2NlbGxzIC0gMTsgaSsrKSB7CisgICAgICBpZiAoc3RhY2tfYXJnc1tzdGFja3BdICE9IDApCisJZGV2aWNlX2Vycm9yKG1lLCAicmVsZWFzZSAtIG11bHRpLWNlbGwgYWRkcmVzc2VzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgIHN0YWNrcCsrOworICAgIH0KKyAgICBhZGRyZXNzID0gc3RhY2tfYXJnc1tzdGFja3BdOworICB9CisKKyAgLyogcmV0dXJucyBvayAqLworICBpZiAobl9zdGFja19yZXR1cm5zICE9IDApCisgICAgZGV2aWNlX2Vycm9yKG1lLCAicmVsZWFzZSAtIG5vbnplcm8gbnVtYmVyIG9mIHJlc3VsdHMiKTsKKworICAvKiB0cnkgdG8gZnJlZSB0aGUgY29ycmVzcG9uZGluZyBtZW1vcnkgY2h1bmsgKi8KKyAgY2h1bmsgPSBod19tZW1vcnktPmhlYXA7CisgIHdoaWxlIChjaHVuayAhPSBOVUxMKSB7CisgICAgaWYgKGNodW5rLT5hZGRyZXNzID09IGFkZHJlc3MKKwkmJiBjaHVuay0+c2l6ZSA9PSBsZW5ndGgpIHsKKyAgICAgIC8qIGFuIGV4YWN0IG1hdGNoICovCisgICAgICBpZiAoY2h1bmstPmF2YWlsYWJsZSkKKwlkZXZpY2VfZXJyb3IobWUsICJtZW1vcnkgY2h1bmsgMHglbHggKHNpemUgMHglbHgpIGFscmVhZHkgYXZhaWxhYmxlIiwKKwkJICAgICAodW5zaWduZWQgbG9uZylhZGRyZXNzLAorCQkgICAgICh1bnNpZ25lZCBsb25nKWxlbmd0aCk7CisgICAgICBlbHNlIHsKKwkvKiBmcmVlIHRoaXMgY2h1bmsgKi8KKwlEVFJBQ0UobWVtb3J5LCAoInJlbGVhc2UgLSBhZGRyZXNzPTB4JWx4LCBsZW5ndGg9MHglbHhcbiIsCisJCQkodW5zaWduZWQgbG9uZykgYWRkcmVzcywKKwkJCSh1bnNpZ25lZCBsb25nKSBsZW5ndGgpKTsKKwljaHVuay0+YXZhaWxhYmxlID0gMTsKKwlicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoY2h1bmstPmFkZHJlc3MgPj0gYWRkcmVzcworCSAgICAgJiYgY2h1bmstPmFkZHJlc3MgKyBjaHVuay0+c2l6ZSA8PSBhZGRyZXNzICsgbGVuZ3RoKSB7CisgICAgICAvKiBhIHN1YiByZWdpb24gKi8KKyAgICAgIGlmICghY2h1bmstPmF2YWlsYWJsZSkgeworCURUUkFDRShtZW1vcnksICgicmVsZWFzZSAtIGFkZHJlc3M9MHglbHgsIHNpemU9MHglbHggd2l0aGluIHJlZ2lvbiAweCVseCBsZW5ndGggMHglbHhcbiIsCisJCQkodW5zaWduZWQgbG9uZykgY2h1bmstPmFkZHJlc3MsCisJCQkodW5zaWduZWQgbG9uZykgY2h1bmstPnNpemUsCisJCQkodW5zaWduZWQgbG9uZykgYWRkcmVzcywKKwkJCSh1bnNpZ25lZCBsb25nKSBsZW5ndGgpKTsKKwljaHVuay0+YXZhaWxhYmxlID0gMTsKKyAgICAgIH0KKyAgICB9CisgICAgY2h1bmsgPSBjaHVuay0+bmV4dDsKKyAgfQorICBpZiAoY2h1bmsgPT0gTlVMTCkgeworICAgIHByaW50Zl9maWx0ZXJlZCgid2FybmluZzogcmVsZWFzZWQgY2h1bmtzIHdpdGhpbiByZWdpb24gMHglbHguLjB4JWx4XG4iLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpYWRkcmVzcywKKwkJICAgICh1bnNpZ25lZCBsb25nKShhZGRyZXNzICsgbGVuZ3RoIC0gMSkpOworICB9CisKKyAgLyogY2hlY2sgZm9yIHRoZSBjaGFuY2UgdG8gbWVyZ2UgdHdvIGFkamFjZW50IGF2YWlsYWJsZSBtZW1vcnkgY2h1bmtzICovCisgIGNodW5rID0gaHdfbWVtb3J5LT5oZWFwOworICB3aGlsZSAoY2h1bmsgIT0gTlVMTCkgeworICAgIGlmIChjaHVuay0+YXZhaWxhYmxlCisJJiYgY2h1bmstPm5leHQgIT0gTlVMTCAmJiBjaHVuay0+bmV4dC0+YXZhaWxhYmxlKSB7CisgICAgICAvKiBhZGphY2VudCAqLworICAgICAgaHdfbWVtb3J5X2NodW5rICpkZWxldGUgPSBjaHVuay0+bmV4dDsKKyAgICAgIEFTU0VSVChjaHVuay0+YWRkcmVzcyArIGNodW5rLT5zaXplID09IGRlbGV0ZS0+YWRkcmVzcyk7CisgICAgICBjaHVuay0+c2l6ZSArPSBkZWxldGUtPnNpemU7CisgICAgICBjaHVuay0+bmV4dCA9IGRlbGV0ZS0+bmV4dDsKKyAgICAgIHpmcmVlKGRlbGV0ZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgY2h1bmsgPSBjaHVuay0+bmV4dDsKKyAgICB9CisgIH0KKworICAvKiB1cGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgKi8KKyAgaHdfbWVtb3J5X3NldF9hdmFpbGFibGUoZGV2aWNlX2luc3RhbmNlX2RldmljZShpbnN0YW5jZSksIGh3X21lbW9yeSk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGRldmljZV9pbnN0YW5jZV9tZXRob2RzIGh3X21lbW9yeV9pbnN0YW5jZV9tZXRob2RzW10gPSB7CisgIHsgImNsYWltIiwgaHdfbWVtb3J5X2luc3RhbmNlX2NsYWltIH0sCisgIHsgInJlbGVhc2UiLCBod19tZW1vcnlfaW5zdGFuY2VfcmVsZWFzZSB9LAorICB7IE5VTEwsIH0sCit9OworCitzdGF0aWMgZGV2aWNlX2luc3RhbmNlX2NhbGxiYWNrcyBjb25zdCBod19tZW1vcnlfaW5zdGFuY2VfY2FsbGJhY2tzID0geworICBod19tZW1vcnlfaW5zdGFuY2VfZGVsZXRlLAorICBOVUxMIC8qcmVhZCovLCBOVUxMIC8qd3JpdGUqLywgTlVMTCAvKnNlZWsqLywKKyAgaHdfbWVtb3J5X2luc3RhbmNlX21ldGhvZHMKK307CisKK3N0YXRpYyBkZXZpY2VfaW5zdGFuY2UgKgoraHdfbWVtb3J5X2NyZWF0ZV9pbnN0YW5jZShkZXZpY2UgKm1lLAorCQkJICBjb25zdCBjaGFyICpwYXRoLAorCQkJICBjb25zdCBjaGFyICphcmdzKQoreworICByZXR1cm4gZGV2aWNlX2NyZWF0ZV9pbnN0YW5jZV9mcm9tKG1lLCBOVUxMLAorCQkJCSAgICAgZGV2aWNlX2RhdGEobWUpLCAvKiBub3RoaW5nIGJldHRlciAqLworCQkJCSAgICAgcGF0aCwgYXJncywKKwkJCQkgICAgICZod19tZW1vcnlfaW5zdGFuY2VfY2FsbGJhY2tzKTsKK30KKworc3RhdGljIGRldmljZV9jYWxsYmFja3MgY29uc3QgaHdfbWVtb3J5X2NhbGxiYWNrcyA9IHsKKyAgeyBod19tZW1vcnlfaW5pdF9hZGRyZXNzLCB9LAorICB7IE5VTEwsIH0sIC8qIGFkZHJlc3MgKi8KKyAgeyBOVUxMLCB9LCAvKiBJTyAqLworICB7IE5VTEwsIH0sIC8qIERNQSAqLworICB7IE5VTEwsIH0sIC8qIGludGVycnVwdCAqLworICB7IE5VTEwsIH0sIC8qIHVuaXQgKi8KKyAgaHdfbWVtb3J5X2NyZWF0ZV9pbnN0YW5jZSwKK307CisKK2NvbnN0IGRldmljZV9kZXNjcmlwdG9yIGh3X21lbW9yeV9kZXZpY2VfZGVzY3JpcHRvcltdID0geworICB7ICJtZW1vcnkiLCBod19tZW1vcnlfY3JlYXRlLCAmaHdfbWVtb3J5X2NhbGxiYWNrcyB9LAorICB7IE5VTEwgfSwKK307CisKKyNlbmRpZiAvKiBfSFdfTUVNT1JZX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL2h3X252cmFtLmMgYi9zaW0vcHBjL2h3X252cmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4N2QwNQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvaHdfbnZyYW0uYwpAQCAtMCwwICsxLDI2NCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfSFdfTlZSQU1fQ18KKyNkZWZpbmUgX0hXX05WUkFNX0NfCisKKyNpZm5kZWYgU1RBVElDX0lOTElORV9IV19OVlJBTQorI2RlZmluZSBTVEFUSUNfSU5MSU5FX0hXX05WUkFNIFNUQVRJQ19JTkxJTkUKKyNlbmRpZgorCisjaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCisKKyNpZmRlZiBIQVZFX1RJTUVfSAorI2luY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKy8qIERFVklDRQorCisKKyAgIG52cmFtIC0gbm9uLXZvbGF0aWxlIG1lbW9yeSB3aXRoIGNsb2NrCisKKworICAgREVTQ1JJUFRJT04KKworCisgICBUaGlzIGRldmljZSBpbXBsZW1lbnRzIGEgc21hbGwgYnl0ZSBhZGRyZXNzYWJsZSBub24tdm9sYXRpbGUKKyAgIG1lbW9yeS4gIFRoZSB0b3AgOCBieXRlcyBvZiB0aGlzIG1lbW9yeSBpbmNsdWRlIGEgcmVhbC10aW1lIGNsb2NrLgorCisKKyAgIFBST1BFUlRJRVMKKworCisgICByZWcgPSA8YWRkcmVzcz4gPHNpemU+IChyZXF1aXJlZCkKKworICAgU3BlY2lmeSB0aGUgYWRkcmVzcy9zaXplIG9mIHRoaXMgZGV2aWNlIHdpdGhpbiBpdHMgcGFyZW50cyBhZGRyZXNzCisgICBzcGFjZS4KKworCisgICB0aW1lem9uZSA9IDxpbnRlZ2VyPiAob3B0aW9uYWwpCisKKyAgIEFkanVzdG1lbnQgdG8gdGhlIGhvc3RzIGN1cnJlbnQgR01UIChpbiBzZWNvbmRzKSB0aGF0IHNob3VsZCBiZQorICAgYXBwbGllZCB3aGVuIHVwZGF0aW5nIHRoZSBOVlJBTSdzIGNsb2NrLiAgSWYgbm8gdGltZXpvbmUgaXMKKyAgIHNwZWNpZmllZCwgemVybyAoR01UIG9yIFVDVCkgaXMgYXNzdW1lZC4KKworCisgICAqLworCit0eXBlZGVmIHN0cnVjdCBfaHdfbnZyYW1fZGV2aWNlIHsKKyAgdW5zaWduZWQ4ICptZW1vcnk7CisgIHVuc2lnbmVkIHNpemVvZl9tZW1vcnk7CisjaWZkZWYgSEFWRV9USU1FX0gKKyAgdGltZV90IGhvc3RfdGltZTsKKyNlbHNlCisgIGxvbmcgaG9zdF90aW1lOworI2VuZGlmCisgIHVuc2lnbmVkIHRpbWV6b25lOworICAvKiB1c2VmdWwgKi8KKyAgdW5zaWduZWQgYWRkcl95ZWFyOworICB1bnNpZ25lZCBhZGRyX21vbnRoOworICB1bnNpZ25lZCBhZGRyX2RhdGU7CisgIHVuc2lnbmVkIGFkZHJfZGF5OworICB1bnNpZ25lZCBhZGRyX2hvdXI7CisgIHVuc2lnbmVkIGFkZHJfbWludXRlczsKKyAgdW5zaWduZWQgYWRkcl9zZWNvbmRzOworICB1bnNpZ25lZCBhZGRyX2NvbnRyb2w7Cit9IGh3X252cmFtX2RldmljZTsKKworc3RhdGljIHZvaWQgKgoraHdfbnZyYW1fY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsCisJCWNvbnN0IGRldmljZV91bml0ICp1bml0X2FkZHJlc3MsCisJCWNvbnN0IGNoYXIgKmFyZ3MpCit7CisgIGh3X252cmFtX2RldmljZSAqbnZyYW0gPSBaQUxMT0MoaHdfbnZyYW1fZGV2aWNlKTsKKyAgcmV0dXJuIG52cmFtOworfQorCit0eXBlZGVmIHN0cnVjdCBfaHdfbnZyYW1fcmVnX3NwZWMgeworICB1bnNpZ25lZDMyIGJhc2U7CisgIHVuc2lnbmVkMzIgc2l6ZTsKK30gaHdfbnZyYW1fcmVnX3NwZWM7CisKK3N0YXRpYyB2b2lkCitod19udnJhbV9pbml0X2FkZHJlc3MoZGV2aWNlICptZSkKK3sKKyAgaHdfbnZyYW1fZGV2aWNlICpudnJhbSA9IChod19udnJhbV9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKKyAgCisgIC8qIHVzZSB0aGUgZ2VuZXJpYyBpbml0IGNvZGUgdG8gYXR0YWNoIHRoaXMgZGV2aWNlIHRvIGl0cyBwYXJlbnQgYnVzICovCisgIGdlbmVyaWNfZGV2aWNlX2luaXRfYWRkcmVzcyhtZSk7CisKKyAgLyogZmluZCB0aGUgZmlyc3Qgbm9uIHplcm8gcmVnIHByb3BlcnR5IGFuZCB1c2UgdGhhdCBhcyB0aGUgZGV2aWNlCisgICAgIHNpemUgKi8KKyAgaWYgKG52cmFtLT5zaXplb2ZfbWVtb3J5ID09IDApIHsKKyAgICByZWdfcHJvcGVydHlfc3BlYyByZWc7CisgICAgaW50IHJlZ19ucjsKKyAgICBmb3IgKHJlZ19uciA9IDA7CisJIGRldmljZV9maW5kX3JlZ19hcnJheV9wcm9wZXJ0eShtZSwgInJlZyIsIHJlZ19uciwgJnJlZyk7CisJIHJlZ19ucisrKSB7CisgICAgICB1bnNpZ25lZCBhdHRhY2hfc2l6ZTsKKyAgICAgIGlmIChkZXZpY2Vfc2l6ZV90b19hdHRhY2hfc2l6ZShkZXZpY2VfcGFyZW50KG1lKSwKKwkJCQkgICAgICZyZWcuc2l6ZSwgJmF0dGFjaF9zaXplLAorCQkJCSAgICAgbWUpKSB7CisJbnZyYW0tPnNpemVvZl9tZW1vcnkgPSBhdHRhY2hfc2l6ZTsKKwlicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG52cmFtLT5zaXplb2ZfbWVtb3J5ID09IDApCisgICAgICBkZXZpY2VfZXJyb3IobWUsICJyZWcgcHJvcGVydHkgbXVzdCBjb250YWluIGEgbm9uLXplcm8gcGh5cy1hZGRyOnNpemUgdHVwcGxlIik7CisgICAgaWYgKG52cmFtLT5zaXplb2ZfbWVtb3J5IDwgOCkKKyAgICAgIGRldmljZV9lcnJvcihtZSwgIk5WUkFNIG11c3QgYmUgYXQgbGVhc3QgOCBieXRlcyBpbiBzaXplIik7CisgIH0KKworICAvKiBpbml0aWFsaXplIHRoZSBod19udnJhbSAqLworICBpZiAobnZyYW0tPm1lbW9yeSA9PSBOVUxMKSB7CisgICAgbnZyYW0tPm1lbW9yeSA9IHphbGxvYyhudnJhbS0+c2l6ZW9mX21lbW9yeSk7CisgIH0KKyAgZWxzZQorICAgIG1lbXNldChudnJhbS0+bWVtb3J5LCBudnJhbS0+c2l6ZW9mX21lbW9yeSwgMCk7CisgIAorICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJ0aW1lem9uZSIpID09IE5VTEwpCisgICAgbnZyYW0tPnRpbWV6b25lID0gMDsKKyAgZWxzZQorICAgIG52cmFtLT50aW1lem9uZSA9IGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJ0aW1lem9uZSIpOworICAKKyAgbnZyYW0tPmFkZHJfeWVhciA9IG52cmFtLT5zaXplb2ZfbWVtb3J5IC0gMTsKKyAgbnZyYW0tPmFkZHJfbW9udGggPSBudnJhbS0+c2l6ZW9mX21lbW9yeSAtIDI7CisgIG52cmFtLT5hZGRyX2RhdGUgPSBudnJhbS0+c2l6ZW9mX21lbW9yeSAtIDM7CisgIG52cmFtLT5hZGRyX2RheSA9IG52cmFtLT5zaXplb2ZfbWVtb3J5IC0gNDsKKyAgbnZyYW0tPmFkZHJfaG91ciA9IG52cmFtLT5zaXplb2ZfbWVtb3J5IC0gNTsKKyAgbnZyYW0tPmFkZHJfbWludXRlcyA9IG52cmFtLT5zaXplb2ZfbWVtb3J5IC0gNjsKKyAgbnZyYW0tPmFkZHJfc2Vjb25kcyA9IG52cmFtLT5zaXplb2ZfbWVtb3J5IC0gNzsKKyAgbnZyYW0tPmFkZHJfY29udHJvbCA9IG52cmFtLT5zaXplb2ZfbWVtb3J5IC0gODsKKyAgCit9CisKK3N0YXRpYyBpbnQKK2h3X252cmFtX2JjZChpbnQgdmFsKQoreworICB2YWwgPSB2YWwgJSAxMDA7CisgIGlmICh2YWwgPCAwKQorICAgIHZhbCArPSAxMDA7CisgIHJldHVybiAoKHZhbCAvIDEwKSA8PCA0KSArICh2YWwgJSAxMCk7Cit9CisKKworLyogSWYgcmVhY2hlZCBhbiB1cGRhdGUgaW50ZXJ2YWwgYW5kIGFsbG93ZWQsIHVwZGF0ZSB0aGUgY2xvY2sgd2l0aGluCisgICB0aGUgaHdfbnZyYW0uICBXaGlsZSB0aGlzIGZ1bmN0aW9uIGNvdWxkIGJlIGltcGxlbWVudGVkIHVzaW5nIGV2ZW50cworICAgaXQgaXNuJ3Qgb24gdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgSFdfTlZSQU0gd2lsbCBoYXJkbHkgZXZlciBiZQorICAgcmVmZXJlbmNlZCBhbmQgaGVuY2UgdGhlcmUgaXMgbGl0dGxlIG5lZWQgaW4ga2VlcGluZyB0aGUgY2xvY2sKKyAgIGNvbnRpbnVhbGx5IHVwLXRvLWRhdGUgKi8KKworc3RhdGljIHZvaWQKK2h3X252cmFtX3VwZGF0ZV9jbG9jayhod19udnJhbV9kZXZpY2UgKm52cmFtLAorCQkgICAgICBjcHUgKnByb2Nlc3NvcikKK3sKKyNpZmRlZiBIQVZFX1RJTUVfSAorICBpZiAoIShudnJhbS0+bWVtb3J5W252cmFtLT5hZGRyX2NvbnRyb2xdICYgMHhjMCkpIHsKKyAgICB0aW1lX3QgaG9zdF90aW1lID0gdGltZShOVUxMKTsKKyAgICBpZiAobnZyYW0tPmhvc3RfdGltZSAhPSBob3N0X3RpbWUpIHsKKyAgICAgIHRpbWVfdCBudnRpbWUgPSBob3N0X3RpbWUgKyBudnJhbS0+dGltZXpvbmU7CisgICAgICBzdHJ1Y3QgdG0gKmNsb2NrID0gZ210aW1lKCZudnRpbWUpOworICAgICAgbnZyYW0tPmhvc3RfdGltZSA9IGhvc3RfdGltZTsKKyAgICAgIG52cmFtLT5tZW1vcnlbbnZyYW0tPmFkZHJfeWVhcl0gPSBod19udnJhbV9iY2QoY2xvY2stPnRtX3llYXIpOworICAgICAgbnZyYW0tPm1lbW9yeVtudnJhbS0+YWRkcl9tb250aF0gPSBod19udnJhbV9iY2QoY2xvY2stPnRtX21vbiArIDEpOworICAgICAgbnZyYW0tPm1lbW9yeVtudnJhbS0+YWRkcl9kYXRlXSA9IGh3X252cmFtX2JjZChjbG9jay0+dG1fbWRheSk7CisgICAgICBudnJhbS0+bWVtb3J5W252cmFtLT5hZGRyX2RheV0gPSBod19udnJhbV9iY2QoY2xvY2stPnRtX3dkYXkgKyAxKTsKKyAgICAgIG52cmFtLT5tZW1vcnlbbnZyYW0tPmFkZHJfaG91cl0gPSBod19udnJhbV9iY2QoY2xvY2stPnRtX2hvdXIpOworICAgICAgbnZyYW0tPm1lbW9yeVtudnJhbS0+YWRkcl9taW51dGVzXSA9IGh3X252cmFtX2JjZChjbG9jay0+dG1fbWluKTsKKyAgICAgIG52cmFtLT5tZW1vcnlbbnZyYW0tPmFkZHJfc2Vjb25kc10gPSBod19udnJhbV9iY2QoY2xvY2stPnRtX3NlYyk7CisgICAgfQorICB9CisjZWxzZQorICBlcnJvcigiZml4bWUgLSB3aGVyZSBkbyBJIGZpbmQgb3V0IEdNVFxuIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2h3X252cmFtX3NldF9jbG9jayhod19udnJhbV9kZXZpY2UgKm52cmFtLCBjcHUgKnByb2Nlc3NvcikKK3sKKyAgZXJyb3IgKCJmaXhtZSAtIGhvdyBkbyBJIHNldCB0aGUgbG9jYWx0aW1lXG4iKTsKK30KKworc3RhdGljIHVuc2lnbmVkCitod19udnJhbV9pb19yZWFkX2J1ZmZlcihkZXZpY2UgKm1lLAorCQkJdm9pZCAqZGVzdCwKKwkJCWludCBzcGFjZSwKKwkJCXVuc2lnbmVkX3dvcmQgYWRkciwKKwkJCXVuc2lnbmVkIG5yX2J5dGVzLAorCQkJY3B1ICpwcm9jZXNzb3IsCisJCQl1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgaW50IGk7CisgIGh3X252cmFtX2RldmljZSAqbnZyYW0gPSAoaHdfbnZyYW1fZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7CisgIGZvciAoaSA9IDA7IGkgPCBucl9ieXRlczsgaSsrKSB7CisgICAgdW5zaWduZWQgYWRkcmVzcyA9IChhZGRyICsgaSkgJSBudnJhbS0+c2l6ZW9mX21lbW9yeTsKKyAgICB1bnNpZ25lZDggZGF0YSA9IG52cmFtLT5tZW1vcnlbYWRkcmVzc107CisgICAgaHdfbnZyYW1fdXBkYXRlX2Nsb2NrKG52cmFtLCBwcm9jZXNzb3IpOworICAgICgodW5zaWduZWQ4KilkZXN0KVtpXSA9IGRhdGE7CisgIH0KKyAgcmV0dXJuIG5yX2J5dGVzOworfQorCitzdGF0aWMgdW5zaWduZWQKK2h3X252cmFtX2lvX3dyaXRlX2J1ZmZlcihkZXZpY2UgKm1lLAorCQkJIGNvbnN0IHZvaWQgKnNvdXJjZSwKKwkJCSBpbnQgc3BhY2UsCisJCQkgdW5zaWduZWRfd29yZCBhZGRyLAorCQkJIHVuc2lnbmVkIG5yX2J5dGVzLAorCQkJIGNwdSAqcHJvY2Vzc29yLAorCQkJIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBpbnQgaTsKKyAgaHdfbnZyYW1fZGV2aWNlICpudnJhbSA9IChod19udnJhbV9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKKyAgZm9yIChpID0gMDsgaSA8IG5yX2J5dGVzOyBpKyspIHsKKyAgICB1bnNpZ25lZCBhZGRyZXNzID0gKGFkZHIgKyBpKSAlIG52cmFtLT5zaXplb2ZfbWVtb3J5OworICAgIHVuc2lnbmVkOCBkYXRhID0gKCh1bnNpZ25lZDgqKXNvdXJjZSlbaV07CisgICAgaWYgKGFkZHJlc3MgPT0gbnZyYW0tPmFkZHJfY29udHJvbAorCSYmIChkYXRhICYgMHg4MCkgPT0gMAorCSYmIChudnJhbS0+bWVtb3J5W2FkZHJlc3NdICYgMHg4MCkgPT0gMHg4MCkKKyAgICAgIGh3X252cmFtX3NldF9jbG9jayhudnJhbSwgcHJvY2Vzc29yKTsKKyAgICBlbHNlCisgICAgICBod19udnJhbV91cGRhdGVfY2xvY2sobnZyYW0sIHByb2Nlc3Nvcik7CisgICAgbnZyYW0tPm1lbW9yeVthZGRyZXNzXSA9IGRhdGE7CisgIH0KKyAgcmV0dXJuIG5yX2J5dGVzOworfQorCitzdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod19udnJhbV9jYWxsYmFja3MgPSB7CisgIHsgaHdfbnZyYW1faW5pdF9hZGRyZXNzLCB9LAorICB7IE5VTEwsIH0sIC8qIGFkZHJlc3MgKi8KKyAgeyBod19udnJhbV9pb19yZWFkX2J1ZmZlciwgaHdfbnZyYW1faW9fd3JpdGVfYnVmZmVyIH0sIC8qIElPICovCit9OworCitjb25zdCBkZXZpY2VfZGVzY3JpcHRvciBod19udnJhbV9kZXZpY2VfZGVzY3JpcHRvcltdID0geworICB7ICJudnJhbSIsIGh3X252cmFtX2NyZWF0ZSwgJmh3X252cmFtX2NhbGxiYWNrcyB9LAorICB7IE5VTEwgfSwKK307CisKKyNlbmRpZiAvKiBfSFdfTlZSQU1fQ18gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvaHdfb3BpYy5jIGIvc2ltL3BwYy9od19vcGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMxNDM0NwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvaHdfb3BpYy5jCkBAIC0wLDAgKzEsMTgyNyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfSFdfT1BJQ19DXworI2RlZmluZSBfSFdfT1BJQ19DXworCisjaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCisKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKworCisvKiBERVZJQ0UKKworCisgICBvcGljIC0gT3BlbiBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKE9wZW5QSUMpCisKKworICAgREVTQ1JJUFRJT04KKworCisgICBUaGlzIGRldmljZSBpbXBsZW1lbnRzIHRoZSBjb3JlIG9mIHRoZSBPcGVuUElDIGludGVycnVwdCBjb250cm9sbGVyCisgICBhcyBkZXNjcmliZWQgaW4gdGhlIE9wZW5QSUMgc3BlY2lmaWNhdGlvbiAxLjIgYW5kIG90aGVyIHJlbGF0ZWQKKyAgIGRvY3VtZW50cy4KKworICAgVGhlIG1vZGVsIGluY2x1ZGVzOgorCisgICBvCVVwIHRvIDIwNDggZXh0ZXJuYWwgaW50ZXJydXB0IHNvdXJjZXMKKworICAgbwlUaGUgZm91ciBjb3VudCBkb3duIHRpbWVycworCisgICBvCVRoZSBmb3VyIGludGVycHJvY2Vzc29yIG11bHRpY2FzdCBpbnRlcnJ1cHRzCisKKyAgIG8JbXVsdGlwcm9jZXNzb3Igc3VwcG9ydAorCisgICBvCUZ1bGwgdHJhY2luZyB0byBhc3Npc3QgaGVscCBkZWJ1Z2dpbmcKKworICAgbwlTdXBwb3J0IGZvciBhbGwgdmFyaWF0aW9ucyBvZiBlZGdlL2xldmVsIHggaGlnaC9sb3cgcG9sYXJpdHkuCisKKworCisgICBQUk9QRVJUSUVTCisKKworICAgcmVnID0gPGFkZHJlc3M+IDxzaXplPiAuLi4gKHJlcXVpcmVkKQorCisgICBEZXRlcm1pbmUgd2hlcmUgdGhlIGRldmljZSBsaXZlcyBpbiB0aGUgcGFyZW50cyBhZGRyZXNzIHNwYWNlLiAgVGhlCisgICBmaXJzdCA8PGFkZHJlc3M+PiA8PHNpemU+PiBwYWlyIHNwZWNpZmllcyB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgIGludGVycnVwdCBkZXN0aW5hdGlvbiB1bml0ICh3aGljaCBtaWdodCBjb250YWluIGFuIGludGVycnVwdCBzb3VyY2UKKyAgIHVuaXQpIHdoaWxlIHN1Y2Nlc3NpdmUgcmVnIGVudHJpZXMgc3BlY2lmeSBhZGRpdGlvbmFsIGludGVycnVwdAorICAgc291cmNlIHVuaXRzLgorCisgICBOb3RlIHRoYXQgZm9yIGFuIDw8b3BpYz4+IGRldmljZSBhdHRhY2hlZCB0byBhIDw8cGNpPj4gYnVzLCB0aGUKKyAgIGZpcnN0IDw8cmVnPj4gZW50cnkgbWF5IG5lZWQgdG8gYmUgaWdub3JlZCBpdCB3aWxsIGJlIHRoZSBhZGRyZXNzCisgICBvZiB0aGUgZGV2aWNlcyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKworCisgICBpbnRlcnJ1cHQtcmFuZ2VzID0gPGludC1udW1iZXI+IDxyYW5nZT4gLi4uIChyZXF1aXJlZCkKKworICAgQSBsaXN0IG9mIHBhaXJzLiAgRWFjaCBwYWlyIGNvcnJlc3BvbmRzIHRvIGEgYmxvY2sgb2YgaW50ZXJydXB0CisgICBzb3VyY2UgdW5pdHMgKHRoZSBhZGRyZXNzIG9mIHdoaWNoIGJlaW5nIHNwZWNpZmllZCBieSB0aGUKKyAgIGNvcnJlc3BvbmRpbmcgcmVnIHR1cHBsZSkuICA8PGludC1udW1iZXI+PiBpcyB0aGUgbnVtYmVyIG9mIHRoZQorICAgZmlyc3QgaW50ZXJydXB0IGluIHRoZSBibG9jayB3aGlsZSA8PHJhbmdlPj4gaXMgdGhlIG51bWJlciBvZgorICAgaW50ZXJydXB0cyBpbiB0aGUgYmxvY2suCisKKworICAgdGltZXItZnJlcXVlbmN5ID0gPGludGVnZXI+ICAob3B0aW9uYWwpCisKKyAgIElmIHByZXNlbnQsIHNwZWNpZmllcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgdGltZXIgZnJlcXVlbmN5CisgICByZXBvcnRpbmcgcmVnaXN0ZXIuICBCeSBkZWZhdWx0IGEgdmFsdWUgb2YgMSBIWiBpcyB1c2VkLiAgVGhlIHZhbHVlCisgICBpcyBhcmJpdHJhcnksIHRoZSB0aW1lcnMgYXJlIGFsd2F5cyB1cGRhdGVkIG9uY2UgcGVyIG1hY2hpbmUgY3ljbGUuCisKKworICAgdmVuZG9yLWlkZW50aWZpY2F0aW9uID0gPGludGVnZXI+ICAob3B0aW9uYWwpCisKKyAgIElmIHByZXNlbnQsIHNwZWNpZmllcyB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgd2hlbiB0aGUgdmVuZG9yCisgICBpZGVudGlmaWNhdGlvbiByZWdpc3RlciBpcyByZWFkLgorCisKKyAgIEVYQU1QTEVTCisKKworICAgU2VlIHRoZSB0ZXN0IHN1aXRlIGRpcmVjdG9yeToKKworICAgfCAgcHNpbS10ZXN0L2h3LW9waWMKKworCisgICBCVUdTCisKKyAgIEZvciBhbiBPUElDIGNvbnRyb2xsZXIgYXR0YWNoZWQgdG8gYSBQQ0kgYnVzLCBpdCBpcyBub3QgY2xlYXIgd2hhdAorICAgdGhlIHZhbHVlIG9mIHRoZSA8PHJlZz4+IGFuZCA8PGludGVycnVwdC1yYW5nZXM+PiBwcm9wZXJ0aWVzIHNob3VsZAorICAgYmUuICBJbiBwYXJ0aWN1bGFyLCB0aGUgUENJIGZpcm13YXJlIGJpbmRpbmdzIHJlcXVpcmUgdGhlIGZpcnN0CisgICB2YWx1ZSBvZiB0aGUgPDxyZWc+PiBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBkZXZpY2VzIGNvbmZpZ3VyYXRpb24KKyAgIGFkZHJlc3Mgd2hpbGUgdGhlIE9wZW5QSUMgYmluZGluZ3MgcmVxdWlyZSB0aGF0IHNhbWUgZW50cnkgdG8KKyAgIHNwZWNpZnkgdGhlIGFkZHJlc3Mgb2YgdGhlIEludGVycnVwdCBEZWxpdmVyeSBVbml0LiAgVGhpcworICAgaW1wbGVtZW50YXRpb24gY2hlY2tzIGZvciBhbmQsIGlmIHByZXNlbnQsIGlnbm9yZXMgYW55CisgICBjb25maWd1cmF0aW9uIGFkZHJlc3MgKGFuZCBpdHMgY29ycmVzcG9uZGluZyA8PGludGVycnVwdC1yYW5nZXM+PgorICAgZW50cnkpLgorCisgICBUaGUgT3BlblBJQyBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIHRoZSBjb250cm9sbGVyIHRvIGJlIGZhaXIgd2hlbgorICAgZGlzdHJpYnV0aW5nIGludGVycnVwdHMgYmV0d2VlbiBwcm9jZXNzb3JzLiAgQXQgcHJlc2VudCB0aGUKKyAgIGFsZ29yaXRobSB1c2VkIGlzbid0IGZhaXIuICBJdCBpcyBiaWFzZWQgdG93YXJkcyBwcm9jZXNzb3IgemVyby4KKworICAgVGhlIE9wZW5QSUMgc3BlY2lmaWNhdGlvbiBpbmNsdWRlcyBhIDgyNTkgcGFzcyB0aHJvdWdoIG1vZGUuICBUaGlzCisgICBpcyBub3Qgc3VwcG9ydGVkLgorCisKKyAgIFJFRkVSRU5DRVMKKworICAgCisgICBQb3dlclBDIE11bHRpcHJvY2Vzc29yIEludGVycnVwdCBDb250cm9sbGVyIChNUElDKSwgSmFudWFyeSAxOSwKKyAgIDE5OTYuIEF2YWlsYWJsZSBmcm9tIElCTS4KKworCisgICBUaGUgT3BlbiBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKFBJQykgUmVnaXN0ZXIgSW50ZXJmYWNlCisgICBTcGVjaWZpY2F0aW9uIFJldmlzaW9uIDEuMi4gIElzc3VlIERhdGU6IE9wY3RvYmVyIDE5OTUuICBBdmFpbGFibGUKKyAgIHNvbWV3aGVyZSBvbiBBTUQncyB3ZWIgcGFnZSAoaHR0cDovL3d3dy5hbWQuY29tLykKKworCisgICBQb3dlclBDIE1pY3JvcHJvY2Vzc29yIENvbW1vbiBIYXJkd2FyZSBSZWZlcmVuY2UgUGxhdGZvcm0gKENIUlApCisgICBTeXN0ZW0gYmluZGluZ3MgdG86IElFRUUgU3RkIDEyNzUtMTk5NCBTdGFuZGFyZCBmb3IgQm9vdAorICAgKEluaXRpYWxpemF0aW9uLCBDb25maWd1cmF0aW9uKSBGaXJtd2FyZS4gIFJldmlzaW9uIDEuMmIgKElOVEVSSU0KKyAgIERSQUZUKS4gIEFwcmlsIDIyLCAxOTk2LiAgQXZhaWxhYmxlIG9uIHRoZSBPcGVuIEZpcm13YXJlIHdlYiBzaXRlCisgICBodHRwOi8vcGxheWdyb3VuZC5zdW4uY29tL3AxMjc1Ly4KKworCisgICAqLworCisKKy8qIGZvcndhcmQgdHlwZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2h3X29waWNfZGV2aWNlIGh3X29waWNfZGV2aWNlOworCisKKy8qIGJvdW5kcyAqLworCitlbnVtIHsKKyAgbWF4X25yX2ludGVycnVwdF9zb3VyY2VzID0gMjA0OCwKKyAgbWF4X25yX2ludGVycnVwdF9kZXN0aW5hdGlvbnMgPSAzMiwKKyAgbWF4X25yX3Rhc2tfcHJpb3JpdGllcyA9IDE2LAorfTsKKworCitlbnVtIHsKKyAgb3BpY19hbGlnbm1lbnQgPSAxNiwKK307CisKKworLyogZ2xvYmFsIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKworZW51bSB7CisgIGdjcjBfODI1OV9iaXQgPSAweDIwMDAwMDAwLAorICBnY3IwX3Jlc2V0X2JpdCA9IDB4ODAwMDAwMDAsCit9OworCisKKy8qIG9mZnNldHMgYW5kIHNpemVzICovCisKK2VudW0geworICBpZHVfaXN1X2Jhc2UgPSAweDEwMDAwLAorICBzaXplb2ZfaXN1X3JlZ2lzdGVyX2Jsb2NrID0gMzIsCisgIGlkdV9wZXJfcHJvY2Vzc29yX3JlZ2lzdGVyX2Jhc2UgPSAweDIwMDAwLAorICBzaXplb2ZfaWR1X3Blcl9wcm9jZXNzb3JfcmVnaXN0ZXJfYmxvY2sgPSAweDEwMDAsCisgIGlkdV90aW1lcl9iYXNlID0gMHgwMTEwMCwKKyAgc2l6ZW9mX3RpbWVyX3JlZ2lzdGVyX2Jsb2NrID0gMHgwMDA0MCwKK307CisKKworLyogSW50ZXJydXB0IHNvdXJjZXMgKi8KKworZW51bSB7CisgIGlzdV9tYXNrX2JpdCA9IDB4ODAwMDAwMDAsCisgIGlzdV9hY3RpdmVfYml0ID0gMHg0MDAwMDAwMCwKKyAgaXN1X211bHRpY2FzdF9iaXQgPSAweDIwMDAwMDAwLAorICBpc3VfcG9zaXRpdmVfcG9sYXJpdHlfYml0ID0gMHgwMDgwMDAwMCwKKyAgaXN1X2xldmVsX3RyaWdnZXJlZF9iaXQgPSAweDAwNDAwMDAwLAorICBpc3VfcHJpb3JpdHlfc2hpZnQgPSAxNiwKKyAgaXN1X3ZlY3Rvcl9iaXRzID0gMHgwMDAwMDBmZiwKK307CisKKwordHlwZWRlZiBzdHJ1Y3QgX29waWNfaW50ZXJydXB0X3NvdXJjZSB7CisgIHVuc2lnbmVkIGlzX21hc2tlZDsgLyogbGVmdCBpbiBwbGFjZSAqLworICB1bnNpZ25lZCBpc19tdWx0aWNhc3Q7IC8qIGxlZnQgaW4gcGxhY2UgKi8KKyAgdW5zaWduZWQgaXNfcG9zaXRpdmVfcG9sYXJpdHk7IC8qIGxlZnQgaW4gcGxhY2UgKi8KKyAgdW5zaWduZWQgaXNfbGV2ZWxfdHJpZ2dlcmVkOyAvKiBsZWZ0IGluIHBsYWNlICovCisgIHVuc2lnbmVkIHByaW9yaXR5OworICB1bnNpZ25lZCB2ZWN0b3I7CisgIC8qIG1pc2MgKi8KKyAgaW50IG5yOworICB1bnNpZ25lZCBkZXN0aW5hdGlvbjsKKyAgdW5zaWduZWQgcGVuZGluZzsKKyAgdW5zaWduZWQgaW5fc2VydmljZTsKK30gb3BpY19pbnRlcnJ1cHRfc291cmNlOworCisKKy8qIGludGVycnVwdCBkZXN0aW5hdGlvbnMgKG5vcm1hbGx5IHByb2Nlc3NvcnMpICovCisKK3R5cGVkZWYgc3RydWN0IF9vcGljX2ludGVycnVwdF9kZXN0aW5hdGlvbiB7CisgIGludCBucjsKKyAgdW5zaWduZWQgYmFzZV9wcmlvcml0eTsKKyAgb3BpY19pbnRlcnJ1cHRfc291cmNlICpjdXJyZW50X3BlbmRpbmc7CisgIG9waWNfaW50ZXJydXB0X3NvdXJjZSAqY3VycmVudF9pbl9zZXJ2aWNlOworICB1bnNpZ25lZCBiaXQ7CisgIGludCBpbml0X3BvcnQ7CisgIGludCBpbnRyX3BvcnQ7Cit9IG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uOworCisKKy8qIGFkZHJlc3MgbWFwIGRlc2NyaXB0b3JzICovCisKK3R5cGVkZWYgc3RydWN0IF9vcGljX2lzdV9ibG9jayB7IC8qIGludGVycnVwdCBzb3VyY2UgdW5pdCBibG9jayAqLworICBpbnQgc3BhY2U7CisgIHVuc2lnbmVkX3dvcmQgYWRkcmVzczsKKyAgdW5zaWduZWQgc2l6ZTsKKyAgdW5zaWduZWRfY2VsbCBpbnRfbnVtYmVyOworICB1bnNpZ25lZF9jZWxsIHJhbmdlOworICBpbnQgcmVnOworfSBvcGljX2lzdV9ibG9jazsKKworCit0eXBlZGVmIHN0cnVjdCBfb3BpY19pZHUgeyAvKiBpbnRlcnJ1cHQgZGVsaXZlcnkgdW5pdCAqLworICBpbnQgcmVnOworICBpbnQgc3BhY2U7CisgIHVuc2lnbmVkX3dvcmQgYWRkcmVzczsKKyAgdW5zaWduZWQgc2l6ZTsKK30gb3BpY19pZHU7CisKK3R5cGVkZWYgZW51bSB7CisgIC8qIGJhZCAqLworICBpbnZhbGlkX29waWNfcmVnaXN0ZXIsCisgIC8qIGludGVycnVwdCBzb3VyY2UgKi8KKyAgaW50ZXJydXB0X3NvdXJjZV9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyLAorICBpbnRlcnJ1cHRfc291cmNlX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyLAorICAvKiB0aW1lcnMgKi8KKyAgdGltZXJfTl9kZXN0aW5hdGlvbl9yZWdpc3RlciwKKyAgdGltZXJfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXIsCisgIHRpbWVyX05fYmFzZV9jb3VudF9yZWdpc3RlciwKKyAgdGltZXJfTl9jdXJyZW50X2NvdW50X3JlZ2lzdGVyLAorICB0aW1lcl9mcmVxdWVuY3lfcmVwb3J0aW5nX3JlZ2lzdGVyLAorICAvKiBpbnRlci1wcm9jZXNzb3IgaW50ZXJydXB0cyAqLworICBpcGlfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXIsCisgIGlwaV9OX2Rpc3BhdGNoX3JlZ2lzdGVyLAorICAvKiBnbG9iYWwgY29uZmlndXJhdGlvbiAqLworICBzcHVyaW91c192ZWN0b3JfcmVnaXN0ZXIsCisgIHByb2Nlc3Nvcl9pbml0X3JlZ2lzdGVyLAorICB2ZW5kb3JfaWRlbnRpZmljYXRpb25fcmVnaXN0ZXIsCisgIGdsb2JhbF9jb25maWd1cmF0aW9uX3JlZ2lzdGVyX04sCisgIGZlYXR1cmVfcmVwb3J0aW5nX3JlZ2lzdGVyX04sCisgIC8qIHBlciBwcm9jZXNzb3IgKi8KKyAgZW5kX29mX2ludGVycnVwdF9yZWdpc3Rlcl9OLAorICBpbnRlcnJ1cHRfYWNrbm93bGVkZ2VfcmVnaXN0ZXJfTiwKKyAgY3VycmVudF90YXNrX3ByaW9yaXR5X3JlZ2lzdGVyX04sCit9IG9waWNfcmVnaXN0ZXI7CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK29waWNfcmVnaXN0ZXJfbmFtZShvcGljX3JlZ2lzdGVyIHR5cGUpCit7CisgIHN3aXRjaCAodHlwZSkgeworICBjYXNlIGludmFsaWRfb3BpY19yZWdpc3RlcjogcmV0dXJuICJpbnZhbGlkX29waWNfcmVnaXN0ZXIiOworICBjYXNlIGludGVycnVwdF9zb3VyY2VfTl9kZXN0aW5hdGlvbl9yZWdpc3RlcjogcmV0dXJuICJpbnRlcnJ1cHRfc291cmNlX05fZGVzdGluYXRpb25fcmVnaXN0ZXIiOworICBjYXNlIGludGVycnVwdF9zb3VyY2VfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXI6IHJldHVybiAiaW50ZXJydXB0X3NvdXJjZV9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3RlciI7CisgIGNhc2UgdGltZXJfTl9kZXN0aW5hdGlvbl9yZWdpc3RlcjogcmV0dXJuICJ0aW1lcl9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyIjsKKyAgY2FzZSB0aW1lcl9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3RlcjogcmV0dXJuICJ0aW1lcl9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3RlciI7CisgIGNhc2UgdGltZXJfTl9iYXNlX2NvdW50X3JlZ2lzdGVyOiByZXR1cm4gInRpbWVyX05fYmFzZV9jb3VudF9yZWdpc3RlciI7CisgIGNhc2UgdGltZXJfTl9jdXJyZW50X2NvdW50X3JlZ2lzdGVyOiByZXR1cm4gInRpbWVyX05fY3VycmVudF9jb3VudF9yZWdpc3RlciI7CisgIGNhc2UgdGltZXJfZnJlcXVlbmN5X3JlcG9ydGluZ19yZWdpc3RlcjogcmV0dXJuICJ0aW1lcl9mcmVxdWVuY3lfcmVwb3J0aW5nX3JlZ2lzdGVyIjsKKyAgY2FzZSBpcGlfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXI6IHJldHVybiAiaXBpX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyIjsKKyAgY2FzZSBpcGlfTl9kaXNwYXRjaF9yZWdpc3RlcjogcmV0dXJuICJpcGlfTl9kaXNwYXRjaF9yZWdpc3RlciI7CisgIGNhc2Ugc3B1cmlvdXNfdmVjdG9yX3JlZ2lzdGVyOiByZXR1cm4gInNwdXJpb3VzX3ZlY3Rvcl9yZWdpc3RlciI7CisgIGNhc2UgcHJvY2Vzc29yX2luaXRfcmVnaXN0ZXI6IHJldHVybiAicHJvY2Vzc29yX2luaXRfcmVnaXN0ZXIiOworICBjYXNlIHZlbmRvcl9pZGVudGlmaWNhdGlvbl9yZWdpc3RlcjogcmV0dXJuICJ2ZW5kb3JfaWRlbnRpZmljYXRpb25fcmVnaXN0ZXIiOworICBjYXNlIGdsb2JhbF9jb25maWd1cmF0aW9uX3JlZ2lzdGVyX046IHJldHVybiAiZ2xvYmFsX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXJfTiI7CisgIGNhc2UgZmVhdHVyZV9yZXBvcnRpbmdfcmVnaXN0ZXJfTjogcmV0dXJuICJmZWF0dXJlX3JlcG9ydGluZ19yZWdpc3Rlcl9OIjsKKyAgY2FzZSBlbmRfb2ZfaW50ZXJydXB0X3JlZ2lzdGVyX046IHJldHVybiAiZW5kX29mX2ludGVycnVwdF9yZWdpc3Rlcl9OIjsKKyAgY2FzZSBpbnRlcnJ1cHRfYWNrbm93bGVkZ2VfcmVnaXN0ZXJfTjogcmV0dXJuICJpbnRlcnJ1cHRfYWNrbm93bGVkZ2VfcmVnaXN0ZXJfTiI7CisgIGNhc2UgY3VycmVudF90YXNrX3ByaW9yaXR5X3JlZ2lzdGVyX046IHJldHVybiAiY3VycmVudF90YXNrX3ByaW9yaXR5X3JlZ2lzdGVyX04iOworICB9CisgIHJldHVybiBOVUxMOworfQorCisKKworLyogdGltZXJzICovCisKK3R5cGVkZWYgc3RydWN0IF9vcGljX3RpbWVyIHsKKyAgaW50IG5yOworICBkZXZpY2UgKm1lOyAvKiBmaW5kIG15IHdheSBob21lICovCisgIGh3X29waWNfZGV2aWNlICpvcGljOyAvKiBkaXR0byAqLworICB1bnNpZ25lZCBiYXNlX2NvdW50OworICBpbnQgaW5oaWJpdGVkOworICBzaWduZWQ2NCBjb3VudDsgLyogKk9OTFkqIGlmIGluaGliaXRlZCAqLworICBldmVudF9lbnRyeV90YWcgdGltZW91dF9ldmVudDsKKyAgb3BpY19pbnRlcnJ1cHRfc291cmNlICppbnRlcnJ1cHRfc291cmNlOworfSBvcGljX3RpbWVyOworCisKKy8qIHRoZSBPUElDICovCisKK3N0cnVjdCBfaHdfb3BpY19kZXZpY2UgeworCisgIC8qIHZlbmRvciBpZCAqLworICB1bnNpZ25lZCB2ZW5kb3JfaWRlbnRpZmljYXRpb247CisKKyAgLyogaW50ZXJydXB0IGRlc3RpbmF0aW9ucyAtIHByb2Nlc3NvcnMgKi8KKyAgaW50IG5yX2ludGVycnVwdF9kZXN0aW5hdGlvbnM7CisgIG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICppbnRlcnJ1cHRfZGVzdGluYXRpb247CisgIHVuc2lnbmVkIHNpemVvZl9pbnRlcnJ1cHRfZGVzdGluYXRpb247CisKKyAgLyogYm9ndXMgaW50ZXJydXB0cyAqLworICBpbnQgc3B1cmlvdXNfdmVjdG9yOworCisgIC8qIGludGVycnVwdCBzb3VyY2VzIC0gZXh0ZXJuYWwgaW50ZXJydXB0IHNvdXJjZSB1bml0cyArIGV4dHJhIGludGVybmFsIG9uZXMgKi8KKyAgaW50IG5yX2ludGVycnVwdF9zb3VyY2VzOworICBvcGljX2ludGVycnVwdF9zb3VyY2UgKmludGVycnVwdF9zb3VyY2U7CisgIHVuc2lnbmVkIHNpemVvZl9pbnRlcnJ1cHRfc291cmNlOworCisgIC8qIGV4dGVybmFsIGludGVycnVwdHMgKi8KKyAgaW50IG5yX2V4dGVybmFsX2ludGVycnVwdHM7CisgIG9waWNfaW50ZXJydXB0X3NvdXJjZSAqZXh0ZXJuYWxfaW50ZXJydXB0X3NvdXJjZTsKKworICAvKiBpbnRlci1wcm9jZXNzb3ItaW50ZXJydXB0cyAqLworICBpbnQgbnJfaW50ZXJwcm9jZXNzb3JfaW50ZXJydXB0czsKKyAgb3BpY19pbnRlcnJ1cHRfc291cmNlICppbnRlcnByb2Nlc3Nvcl9pbnRlcnJ1cHRfc291cmNlOworCisgIC8qIHRpbWVycyAqLworICBpbnQgbnJfdGltZXJfaW50ZXJydXB0czsKKyAgb3BpY190aW1lciAqdGltZXI7CisgIHVuc2lnbmVkIHNpemVvZl90aW1lcjsKKyAgb3BpY19pbnRlcnJ1cHRfc291cmNlICp0aW1lcl9pbnRlcnJ1cHRfc291cmNlOworICB1bnNpZ25lZCB0aW1lcl9mcmVxdWVuY3k7CisKKyAgLyogaW5pdCByZWdpc3RlciAqLworICB1bnNpZ25lZDMyIGluaXQ7CisKKyAgLyogYWRkcmVzcyBtYXBzICovCisgIG9waWNfaWR1IGlkdTsKKyAgaW50IG5yX2lzdV9ibG9ja3M7CisgIG9waWNfaXN1X2Jsb2NrICppc3VfYmxvY2s7Cit9OworCisKK3N0YXRpYyB2b2lkCitod19vcGljX2luaXRfZGF0YShkZXZpY2UgKm1lKQoreworICBod19vcGljX2RldmljZSAqb3BpYyA9IChod19vcGljX2RldmljZSopZGV2aWNlX2RhdGEobWUpOworICBpbnQgaXNiOworICBpbnQgaWR1X3JlZzsKKyAgaW50IG5yX2lzdV9ibG9ja3M7CisgIGludCBpOworCisgIC8qIGRldGVybWluZSB0aGUgZmlyc3QgdmFsaWQgcmVnIHByb3BlcnR5IGVudHJ5ICh0aGVyZSBjb3VsZCBiZQorICAgICBsZWFkaW5nIHJlZyBlbnRyaWVzIHdpdGggaW52YWxpZCAoemVybykgc2l6ZSBmaWVsZHMpIGFuZCB0aGUKKyAgICAgbnVtYmVyIG9mIGlzdSBlbnRyaWVzIGZvdW5kIGluIHRoZSByZWcgcHJvcGVydHkuICovCisgIGlkdV9yZWcgPSAwOworICBucl9pc3VfYmxvY2tzID0gMDsKKyAgd2hpbGUgKDEpIHsKKyAgICByZWdfcHJvcGVydHlfc3BlYyB1bml0OworICAgIGludCBhdHRhY2hfc3BhY2U7CisgICAgdW5zaWduZWRfd29yZCBhdHRhY2hfYWRkcmVzczsKKyAgICB1bnNpZ25lZCBhdHRhY2hfc2l6ZTsKKyAgICBpZiAoIWRldmljZV9maW5kX3JlZ19hcnJheV9wcm9wZXJ0eShtZSwgInJlZyIsIGlkdV9yZWcgKyBucl9pc3VfYmxvY2tzLAorCQkJCQkmdW5pdCkpCisgICAgICBicmVhazsKKyAgICBpZiAobnJfaXN1X2Jsb2NrcyA+IDAKKwl8fCAoZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksICZ1bml0LmFkZHJlc3MsCisJCQkJCSAgICAgJmF0dGFjaF9zcGFjZSwgJmF0dGFjaF9hZGRyZXNzLAorCQkJCQkgICAgIG1lKQorCSAgICAmJiBkZXZpY2Vfc2l6ZV90b19hdHRhY2hfc2l6ZShkZXZpY2VfcGFyZW50KG1lKSwgJnVuaXQuc2l6ZSwKKwkJCQkJICAmYXR0YWNoX3NpemUsCisJCQkJCSAgbWUpKSkgeworICAgICAgLyogd2UgY291bnQgYW55IHRoaW5nIG9uY2Ugd2UndmUgZm91bmQgb25lIHZhbGlkIGFkZHJlc3Mvc2l6ZSBwYWlyICovCisgICAgICBucl9pc3VfYmxvY2tzICs9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWR1X3JlZyArPSAxOworICAgIH0KKyAgfQorCisgIC8qIGRldGVybWluZSB0aGUgbnVtYmVyIGFuZCBsb2NhdGlvbiBvZiB0aGUgbXVsdGlwbGUgaW50ZXJydXB0CisgICAgIHNvdXJjZSB1bml0cyBhbmQgdGhlIHNpbmdsZSBpbnRlcnJ1cHQgZGVsaXZlcnkgdW5pdCAqLworICBpZiAob3BpYy0+aXN1X2Jsb2NrID09IE5VTEwpIHsKKyAgICBpbnQgcmVnX25yOworICAgIG9waWMtPm5yX2lzdV9ibG9ja3MgPSBucl9pc3VfYmxvY2tzOworICAgIG9waWMtPmlzdV9ibG9jayA9IHphbGxvYyhzaXplb2Yob3BpY19pc3VfYmxvY2spICogb3BpYy0+bnJfaXN1X2Jsb2Nrcyk7CisgICAgaXNiID0gMDsKKyAgICByZWdfbnIgPSBpZHVfcmVnOworICAgIHdoaWxlIChpc2IgPCBvcGljLT5ucl9pc3VfYmxvY2tzKSB7CisgICAgICByZWdfcHJvcGVydHlfc3BlYyByZWc7CisgICAgICBpZiAoIWRldmljZV9maW5kX3JlZ19hcnJheV9wcm9wZXJ0eShtZSwgInJlZyIsIHJlZ19uciwgJnJlZykpCisJZGV2aWNlX2Vycm9yKG1lLCAicmVnIHByb3BlcnR5IG1pc3NpbmcgZW50cnkgbnVtYmVyICVkIiwgcmVnX25yKTsKKyAgICAgIG9waWMtPmlzdV9ibG9ja1tpc2JdLnJlZyA9IHJlZ19ucjsKKyAgICAgIGlmICghZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksICZyZWcuYWRkcmVzcywKKwkJCQkJICAgICZvcGljLT5pc3VfYmxvY2tbaXNiXS5zcGFjZSwKKwkJCQkJICAgICZvcGljLT5pc3VfYmxvY2tbaXNiXS5hZGRyZXNzLAorCQkJCQkgICAgbWUpCisJICB8fCAhZGV2aWNlX3NpemVfdG9fYXR0YWNoX3NpemUoZGV2aWNlX3BhcmVudChtZSksICZyZWcuc2l6ZSwKKwkJCQkJICZvcGljLT5pc3VfYmxvY2tbaXNiXS5zaXplLAorCQkJCQkgbWUpKSB7CisJZGV2aWNlX2Vycm9yKG1lLCAicmVnIHByb3BlcnR5IGVudHJ5ICVkIGludmFsaWQiLCByZWdfbnIpOworICAgICAgfQorICAgICAgaWYgKCFkZXZpY2VfZmluZF9pbnRlZ2VyX2FycmF5X3Byb3BlcnR5KG1lLCAiaW50ZXJydXB0LXJhbmdlcyIsCisJCQkJCSAgICAgIHJlZ19uciAqIDIsCisJCQkJCSAgICAgICZvcGljLT5pc3VfYmxvY2tbaXNiXS5pbnRfbnVtYmVyKQorCSAgfHwgIWRldmljZV9maW5kX2ludGVnZXJfYXJyYXlfcHJvcGVydHkobWUsICJpbnRlcnJ1cHQtcmFuZ2VzIiwKKwkJCQkJCSByZWdfbnIgKiAyICsgMSwKKwkJCQkJCSAmb3BpYy0+aXN1X2Jsb2NrW2lzYl0ucmFuZ2UpKQorCWRldmljZV9lcnJvcihtZSwgIm1pc3Npbmcgb3IgaW52YWxpZCBpbnRlcnJ1cHQtcmFuZ2VzIHByb3BlcnR5IGVudHJ5ICVkIiwgcmVnX25yKTsKKyAgICAgIC8qIGZpcnN0IHJlZyBlbnRyeSBzcGVjaWZpZXMgdGhlIGFkZHJlc3Mgb2YgYm90aCB0aGUgSURVIGFuZCB0aGUKKyAgICAgICAgIGZpcnN0IHNldCBvZiBJU1UgcmVnaXN0ZXJzLCBhZGp1c3QgdGhpbmdzIGFjY29yZGluZ2x5ICovCisgICAgICBpZiAocmVnX25yID09IGlkdV9yZWcpIHsKKwlvcGljLT5pZHUucmVnID0gb3BpYy0+aXN1X2Jsb2NrW2lzYl0ucmVnOworCW9waWMtPmlkdS5zcGFjZSA9IG9waWMtPmlzdV9ibG9ja1tpc2JdLnNwYWNlOworCW9waWMtPmlkdS5hZGRyZXNzID0gb3BpYy0+aXN1X2Jsb2NrW2lzYl0uYWRkcmVzczsKKwlvcGljLT5pZHUuc2l6ZSA9IG9waWMtPmlzdV9ibG9ja1tpc2JdLnNpemU7CisJb3BpYy0+aXN1X2Jsb2NrW2lzYl0uYWRkcmVzcyArPSBpZHVfaXN1X2Jhc2U7CisJb3BpYy0+aXN1X2Jsb2NrW2lzYl0uc2l6ZSA9IG9waWMtPmlzdV9ibG9ja1tpc2JdLnJhbmdlICogKDE2ICsgMTYpOworICAgICAgfQorICAgICAgLyogd2FzIHRoaXMgYSB2YWxpZCByZWcgZW50cnk/ICovCisgICAgICBpZiAob3BpYy0+aXN1X2Jsb2NrW2lzYl0ucmFuZ2UgPT0gMCkgeworCW9waWMtPm5yX2lzdV9ibG9ja3MgLT0gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworCW9waWMtPm5yX2V4dGVybmFsX2ludGVycnVwdHMgKz0gb3BpYy0+aXN1X2Jsb2NrW2lzYl0ucmFuZ2U7CisJaXNiKys7CisgICAgICB9CisgICAgICByZWdfbnIrKzsKKyAgICB9CisgIH0KKyAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0IHNvdXJjZSB1bml0IGJsb2NrIC0gZWZmZWN0aXZlIG51bWJlciBvZiBibG9ja3MgJWRcbiIsCisJCShpbnQpb3BpYy0+bnJfaXN1X2Jsb2NrcykpOworCisKKyAgLyogdGhlIG51bWJlciBvZiBvdGhlciBpbnRlcnJ1cHRzICovCisgIG9waWMtPm5yX2ludGVycHJvY2Vzc29yX2ludGVycnVwdHMgPSA0OworICBvcGljLT5ucl90aW1lcl9pbnRlcnJ1cHRzID0gNDsKKworCisgIC8qIGNyZWF0ZSBzcGFjZSBmb3IgdGhlIGludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXJzICovCisgIGlmIChvcGljLT5pbnRlcnJ1cHRfc291cmNlICE9IE5VTEwpIHsKKyAgICBtZW1zZXQob3BpYy0+aW50ZXJydXB0X3NvdXJjZSwgMCwgb3BpYy0+c2l6ZW9mX2ludGVycnVwdF9zb3VyY2UpOworICB9CisgIGVsc2UgeworICAgIG9waWMtPm5yX2ludGVycnVwdF9zb3VyY2VzID0gKG9waWMtPm5yX2V4dGVybmFsX2ludGVycnVwdHMKKwkJCQkgICsgb3BpYy0+bnJfaW50ZXJwcm9jZXNzb3JfaW50ZXJydXB0cworCQkJCSAgKyBvcGljLT5ucl90aW1lcl9pbnRlcnJ1cHRzKTsKKyAgICBpZiAob3BpYy0+bnJfaW50ZXJydXB0X3NvdXJjZXMgPiBtYXhfbnJfaW50ZXJydXB0X3NvdXJjZXMpCisgICAgICBkZXZpY2VfZXJyb3IobWUsICJudW1iZXIgb2YgaW50ZXJydXB0IHNvdXJjZXMgZXhjZWVkZWQiKTsKKyAgICBvcGljLT5zaXplb2ZfaW50ZXJydXB0X3NvdXJjZSA9IChzaXplb2Yob3BpY19pbnRlcnJ1cHRfc291cmNlKQorCQkJCSAgICAgKiBvcGljLT5ucl9pbnRlcnJ1cHRfc291cmNlcyk7CisgICAgb3BpYy0+aW50ZXJydXB0X3NvdXJjZSA9IHphbGxvYyhvcGljLT5zaXplb2ZfaW50ZXJydXB0X3NvdXJjZSk7CisgICAgb3BpYy0+ZXh0ZXJuYWxfaW50ZXJydXB0X3NvdXJjZSA9IG9waWMtPmludGVycnVwdF9zb3VyY2U7CisgICAgb3BpYy0+aW50ZXJwcm9jZXNzb3JfaW50ZXJydXB0X3NvdXJjZSA9IChvcGljLT5leHRlcm5hbF9pbnRlcnJ1cHRfc291cmNlCisJCQkJCSAgICAgKyBvcGljLT5ucl9leHRlcm5hbF9pbnRlcnJ1cHRzKTsKKyAgICBvcGljLT50aW1lcl9pbnRlcnJ1cHRfc291cmNlID0gKG9waWMtPmludGVycHJvY2Vzc29yX2ludGVycnVwdF9zb3VyY2UKKwkJCQkgICAgKyBvcGljLT5ucl9pbnRlcnByb2Nlc3Nvcl9pbnRlcnJ1cHRzKTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgb3BpYy0+bnJfaW50ZXJydXB0X3NvdXJjZXM7IGkrKykgeworICAgIG9waWNfaW50ZXJydXB0X3NvdXJjZSAqc291cmNlID0gJm9waWMtPmludGVycnVwdF9zb3VyY2VbaV07CisgICAgc291cmNlLT5uciA9IGk7CisgICAgc291cmNlLT5pc19tYXNrZWQgPSBpc3VfbWFza19iaXQ7CisgIH0KKyAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0IHNvdXJjZXMgLSBleHRlcm5hbCAlZCwgdGltZXIgJWQsIGlwaSAlZCwgdG90YWwgJWRcbiIsCisJCW9waWMtPm5yX2V4dGVybmFsX2ludGVycnVwdHMsCisJCW9waWMtPm5yX3RpbWVyX2ludGVycnVwdHMsCisJCW9waWMtPm5yX2ludGVycHJvY2Vzc29yX2ludGVycnVwdHMsCisJCW9waWMtPm5yX2ludGVycnVwdF9zb3VyY2VzKSk7CisKKworICAvKiB0aW1lcnMgb3IgaW50ZXJwcm9jZXNzb3IgaW50ZXJydXB0cyAqLworICBpZiAob3BpYy0+dGltZXIgIT0gTlVMTCkKKyAgICBtZW1zZXQob3BpYy0+dGltZXIsIDAsIG9waWMtPnNpemVvZl90aW1lcik7CisgIGVsc2UgeworICAgIG9waWMtPm5yX3RpbWVyX2ludGVycnVwdHMgPSA0OworICAgIG9waWMtPnNpemVvZl90aW1lciA9IHNpemVvZihvcGljX3RpbWVyKSAqIG9waWMtPm5yX3RpbWVyX2ludGVycnVwdHM7CisgICAgb3BpYy0+dGltZXIgPSB6YWxsb2Mob3BpYy0+c2l6ZW9mX3RpbWVyKTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgb3BpYy0+bnJfdGltZXJfaW50ZXJydXB0czsgaSsrKSB7CisgICAgb3BpY190aW1lciAqdGltZXIgPSAmb3BpYy0+dGltZXJbaV07CisgICAgdGltZXItPm5yID0gaTsKKyAgICB0aW1lci0+bWUgPSBtZTsKKyAgICB0aW1lci0+b3BpYyA9IG9waWM7CisgICAgdGltZXItPmluaGliaXRlZCA9IDE7CisgICAgdGltZXItPmludGVycnVwdF9zb3VyY2UgPSAmb3BpYy0+dGltZXJfaW50ZXJydXB0X3NvdXJjZVtpXTsKKyAgfQorICBpZiAoZGV2aWNlX2ZpbmRfcHJvcGVydHkobWUsICJ0aW1lci1mcmVxdWVuY3kiKSkKKyAgICBvcGljLT50aW1lcl9mcmVxdWVuY3kgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAidGltZXItZnJlcXVlbmN5Iik7CisgIGVsc2UKKyAgICBvcGljLT50aW1lcl9mcmVxdWVuY3kgPSAxOworCisKKyAgLyogY3JlYXRlIHNwYWNlIGZvciB0aGUgaW50ZXJydXB0IGRlc3RpbmF0aW9uIHJlZ2lzdGVycyAqLworICBpZiAob3BpYy0+aW50ZXJydXB0X2Rlc3RpbmF0aW9uICE9IE5VTEwpIHsKKyAgICBtZW1zZXQob3BpYy0+aW50ZXJydXB0X2Rlc3RpbmF0aW9uLCAwLCBvcGljLT5zaXplb2ZfaW50ZXJydXB0X2Rlc3RpbmF0aW9uKTsKKyAgfQorICBlbHNlIHsKKyAgICBvcGljLT5ucl9pbnRlcnJ1cHRfZGVzdGluYXRpb25zID0gdHJlZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICIvb3BlbnByb20vb3B0aW9ucy9zbXAiKTsKKyAgICBvcGljLT5zaXplb2ZfaW50ZXJydXB0X2Rlc3RpbmF0aW9uID0gKHNpemVvZihvcGljX2ludGVycnVwdF9kZXN0aW5hdGlvbikKKwkJCQkJICAqIG9waWMtPm5yX2ludGVycnVwdF9kZXN0aW5hdGlvbnMpOworICAgIG9waWMtPmludGVycnVwdF9kZXN0aW5hdGlvbiA9IHphbGxvYyhvcGljLT5zaXplb2ZfaW50ZXJydXB0X2Rlc3RpbmF0aW9uKTsKKyAgICBpZiAob3BpYy0+bnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9ucyA+IG1heF9ucl9pbnRlcnJ1cHRfZGVzdGluYXRpb25zKQorICAgICAgZGV2aWNlX2Vycm9yKG1lLCAibnVtYmVyIG9mIGludGVycnVwdCBkZXN0aW5hdGlvbnMgZXhjZWVkZWQiKTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgb3BpYy0+bnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9uczsgaSsrKSB7CisgICAgb3BpY19pbnRlcnJ1cHRfZGVzdGluYXRpb24gKmRlc3QgPSAmb3BpYy0+aW50ZXJydXB0X2Rlc3RpbmF0aW9uW2ldOworICAgIGRlc3QtPmJpdCA9ICgxIDw8IGkpOworICAgIGRlc3QtPm5yID0gaTsKKyAgICBkZXN0LT5pbml0X3BvcnQgPSAoZGV2aWNlX2ludGVycnVwdF9kZWNvZGUobWUsICJpbml0MCIsIG91dHB1dF9wb3J0KQorCQkgICAgICAgKyBpKTsKKyAgICBkZXN0LT5pbnRyX3BvcnQgPSAoZGV2aWNlX2ludGVycnVwdF9kZWNvZGUobWUsICJpbnRyMCIsIG91dHB1dF9wb3J0KQorCQkgICAgICAgKyBpKTsKKyAgICBkZXN0LT5iYXNlX3ByaW9yaXR5ID0gbWF4X25yX3Rhc2tfcHJpb3JpdGllcyAtIDE7CisgIH0KKyAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0IGRlc3RpbmF0aW9ucyAtIHRvdGFsICVkXG4iLAorCQkoaW50KW9waWMtPm5yX2ludGVycnVwdF9kZXN0aW5hdGlvbnMpKTsKKyAgCisKKyAgLyogdmVyaWZ5IGFuZCBwcmludCBvdXQgdGhlIElTVSdzICovCisgIGZvciAoaXNiID0gMDsgaXNiIDwgb3BpYy0+bnJfaXN1X2Jsb2NrczsgaXNiKyspIHsKKyAgICB1bnNpZ25lZCBjb3JyZWN0X3NpemU7CisgICAgaWYgKChvcGljLT5pc3VfYmxvY2tbaXNiXS5hZGRyZXNzICUgb3BpY19hbGlnbm1lbnQpICE9IDApCisgICAgICBkZXZpY2VfZXJyb3IobWUsICJpbnRlcnJ1cHQgc291cmNlIHVuaXQgJWQgYWRkcmVzcyBub3QgYWxpZ25lZCB0byAlZCBieXRlIGJvdW5kYXJ5IiwKKwkJICAgaXNiLCBvcGljX2FsaWdubWVudCk7CisgICAgY29ycmVjdF9zaXplID0gb3BpYy0+aXN1X2Jsb2NrW2lzYl0ucmFuZ2UgKiBzaXplb2ZfaXN1X3JlZ2lzdGVyX2Jsb2NrOworICAgIGlmIChvcGljLT5pc3VfYmxvY2tbaXNiXS5zaXplICE9IGNvcnJlY3Rfc2l6ZSkKKyAgICAgIGRldmljZV9lcnJvcihtZSwgImludGVycnVwdCBzb3VyY2UgdW5pdCAlZCAocmVnICVkKSBoYXMgYW4gaW5jb3JyZWN0IHNpemUsIHNob3VsZCBiZSAweCV4IiwKKwkJICAgaXNiLCBvcGljLT5pc3VfYmxvY2tbaXNiXS5yZWcsIGNvcnJlY3Rfc2l6ZSk7CisgICAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0IHNvdXJjZSB1bml0IGJsb2NrICVsZCAtIGFkZHJlc3MgJWQ6MHglbHgsIHNpemUgMHglbHgsIGludC1udW1iZXIgJWxkLCByYW5nZSAlbGRcbiIsCisJCSAgKGxvbmcpaXNiLAorCQkgIChpbnQpb3BpYy0+aXN1X2Jsb2NrW2lzYl0uc3BhY2UsCisJCSAgKHVuc2lnbmVkIGxvbmcpb3BpYy0+aXN1X2Jsb2NrW2lzYl0uYWRkcmVzcywKKwkJICAodW5zaWduZWQgbG9uZylvcGljLT5pc3VfYmxvY2tbaXNiXS5zaXplLAorCQkgIChsb25nKW9waWMtPmlzdV9ibG9ja1tpc2JdLmludF9udW1iZXIsCisJCSAgKGxvbmcpb3BpYy0+aXN1X2Jsb2NrW2lzYl0ucmFuZ2UpKTsKKyAgfQorCisKKyAgLyogdmVyaWZ5IGFuZCBwcmludCBvdXQgdGhlIElEVSAqLworICB7CisgICAgdW5zaWduZWQgY29ycmVjdF9zaXplOworICAgIHVuc2lnbmVkIGFsdGVybmF0ZV9zaXplOworICAgIGlmICgob3BpYy0+aWR1LmFkZHJlc3MgJSBvcGljX2FsaWdubWVudCkgIT0gMCkKKyAgICAgIGRldmljZV9lcnJvcihtZSwgImludGVycnVwdCBkZWxpdmVyeSB1bml0IG5vdCBhbGlnbmVkIHRvICVkIGJ5dGUgYm91bmRhcnkiLAorCQkgICBvcGljX2FsaWdubWVudCk7CisgICAgY29ycmVjdF9zaXplID0gKGlkdV9wZXJfcHJvY2Vzc29yX3JlZ2lzdGVyX2Jhc2UKKwkJICAgICsgKHNpemVvZl9pZHVfcGVyX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9ibG9jaworCQkgICAgICAgKiBvcGljLT5ucl9pbnRlcnJ1cHRfZGVzdGluYXRpb25zKSk7CisgICAgYWx0ZXJuYXRlX3NpemUgPSAoaWR1X3Blcl9wcm9jZXNzb3JfcmVnaXN0ZXJfYmFzZQorCQkgICAgICArIChzaXplb2ZfaWR1X3Blcl9wcm9jZXNzb3JfcmVnaXN0ZXJfYmxvY2sKKwkJCSAqIG1heF9ucl9pbnRlcnJ1cHRfZGVzdGluYXRpb25zKSk7CisgICAgaWYgKG9waWMtPmlkdS5zaXplICE9IGNvcnJlY3Rfc2l6ZQorCSYmIG9waWMtPmlkdS5zaXplICE9IGFsdGVybmF0ZV9zaXplKQorICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiaW50ZXJydXB0IGRlbGl2ZXJ5IHVuaXQgaGFzIGluY29ycmVjdCBzaXplLCBzaG91bGQgYmUgMHgleCBvciAweCV4IiwKKwkJICAgY29ycmVjdF9zaXplLCBhbHRlcm5hdGVfc2l6ZSk7CisgICAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0IGRlbGl2ZXJ5IHVuaXQgLSBhZGRyZXNzICVkOjB4JWx4LCBzaXplIDB4JWx4XG4iLAorCQkgIChpbnQpb3BpYy0+aWR1LnNwYWNlLAorCQkgICh1bnNpZ25lZCBsb25nKW9waWMtPmlkdS5hZGRyZXNzLAorCQkgICh1bnNpZ25lZCBsb25nKW9waWMtPmlkdS5zaXplKSk7CisgIH0KKworICAvKiBpbml0aWFsaXplIHRoZSBpbml0IGludGVycnVwdHMgKi8KKyAgb3BpYy0+aW5pdCA9IDA7CisKKworICAvKiB2ZW5kb3IgaWRlbnQgKi8KKyAgaWYgKGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCAidmVuZG9yLWlkZW50aWZpY2F0aW9uIikgIT0gTlVMTCkKKyAgICBvcGljLT52ZW5kb3JfaWRlbnRpZmljYXRpb24gPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAidmVuZG9yLWlkZW50aWZpY2F0aW9uIik7CisgIGVsc2UKKyAgICBvcGljLT52ZW5kb3JfaWRlbnRpZmljYXRpb24gPSAwOworCisgIC8qIG1pc2MgcmVnaXN0ZXJzICovCisgIG9waWMtPnNwdXJpb3VzX3ZlY3RvciA9IDB4ZmY7CisKK30KKworCisvKiBpbnRlcnJ1cHQgcmVsYXRlZCBhY3Rpb25zICovCisKK3N0YXRpYyB2b2lkCithc3NlcnRfaW50ZXJydXB0KGRldmljZSAqbWUsCisJCSBod19vcGljX2RldmljZSAqb3BpYywKKwkJIG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICpkZXN0KQoreworICBBU1NFUlQoZGVzdCA+PSBvcGljLT5pbnRlcnJ1cHRfZGVzdGluYXRpb24pOworICBBU1NFUlQoZGVzdCA8IG9waWMtPmludGVycnVwdF9kZXN0aW5hdGlvbiArIG9waWMtPm5yX2ludGVycnVwdF9kZXN0aW5hdGlvbnMpOworICBEVFJBQ0Uob3BpYywgKCJhc3NlcnQgaW50ZXJydXB0IC0gaW50ciBwb3J0ICVkXG4iLCBkZXN0LT5pbnRyX3BvcnQpKTsKKyAgZGV2aWNlX2ludGVycnVwdF9ldmVudChtZSwgZGVzdC0+aW50cl9wb3J0LCAxLCBOVUxMLCAwKTsKK30KKworCitzdGF0aWMgdm9pZAorbmVnYXRlX2ludGVycnVwdChkZXZpY2UgKm1lLAorCQkgaHdfb3BpY19kZXZpY2UgKm9waWMsCisJCSBvcGljX2ludGVycnVwdF9kZXN0aW5hdGlvbiAqZGVzdCkKK3sKKyAgQVNTRVJUKGRlc3QgPj0gb3BpYy0+aW50ZXJydXB0X2Rlc3RpbmF0aW9uKTsKKyAgQVNTRVJUKGRlc3QgPCBvcGljLT5pbnRlcnJ1cHRfZGVzdGluYXRpb24gKyBvcGljLT5ucl9pbnRlcnJ1cHRfZGVzdGluYXRpb25zKTsKKyAgRFRSQUNFKG9waWMsICgibmVnYXRlIGludGVycnVwdCAtIGludHIgcG9ydCAlZFxuIiwgZGVzdC0+aW50cl9wb3J0KSk7CisgIGRldmljZV9pbnRlcnJ1cHRfZXZlbnQobWUsIGRlc3QtPmludHJfcG9ydCwgMCwgTlVMTCwgMCk7Cit9CisKKworc3RhdGljIGludAorY2FuX2RlbGl2ZXIoZGV2aWNlICptZSwKKwkgICAgb3BpY19pbnRlcnJ1cHRfc291cmNlICpzb3VyY2UsCisJICAgIG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICpkZXN0KQoreworICByZXR1cm4gKHNvdXJjZSAhPSBOVUxMICYmIGRlc3QgIT0gTlVMTAorCSAgJiYgc291cmNlLT5wcmlvcml0eSA+IGRlc3QtPmJhc2VfcHJpb3JpdHkKKwkgICYmIChkZXN0LT5jdXJyZW50X2luX3NlcnZpY2UgPT0gTlVMTAorCSAgICAgIHx8IHNvdXJjZS0+cHJpb3JpdHkgPiBkZXN0LT5jdXJyZW50X2luX3NlcnZpY2UtPnByaW9yaXR5KSk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkCitkZWxpdmVyX3BlbmRpbmcoZGV2aWNlICptZSwKKwkJaHdfb3BpY19kZXZpY2UgKm9waWMsCisJCW9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICpkZXN0KQoreworICBBU1NFUlQoY2FuX2RlbGl2ZXIobWUsIGRlc3QtPmN1cnJlbnRfcGVuZGluZywgZGVzdCkpOworICBkZXN0LT5jdXJyZW50X2luX3NlcnZpY2UgPSBkZXN0LT5jdXJyZW50X3BlbmRpbmc7CisgIGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZS0+aW5fc2VydmljZSB8PSBkZXN0LT5iaXQ7CisgIGlmICghZGVzdC0+Y3VycmVudF9wZW5kaW5nLT5pc19sZXZlbF90cmlnZ2VyZWQpIHsKKyAgICBpZiAoZGVzdC0+Y3VycmVudF9wZW5kaW5nLT5pc19tdWx0aWNhc3QpCisgICAgICBkZXN0LT5jdXJyZW50X3BlbmRpbmctPnBlbmRpbmcgJj0gfmRlc3QtPmJpdDsKKyAgICBlbHNlCisgICAgICBkZXN0LT5jdXJyZW50X3BlbmRpbmctPnBlbmRpbmcgPSAwOworICB9CisgIGRlc3QtPmN1cnJlbnRfcGVuZGluZyA9IE5VTEw7CisgIG5lZ2F0ZV9pbnRlcnJ1cHQobWUsIG9waWMsIGRlc3QpOworICByZXR1cm4gZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlLT52ZWN0b3I7Cit9CisKKwordHlwZWRlZiBlbnVtIHsKKyAgcGVuZGluZ19pbnRlcnJ1cHQsCisgIGluX3NlcnZpY2VfaW50ZXJydXB0LAorfSBpbnRlcnJ1cHRfY2xhc3M7CisKK3N0YXRpYyBvcGljX2ludGVycnVwdF9zb3VyY2UgKgorZmluZF9pbnRlcnJ1cHRfZm9yX2Rlc3QoZGV2aWNlICptZSwKKwkJCWh3X29waWNfZGV2aWNlICpvcGljLAorCQkJb3BpY19pbnRlcnJ1cHRfZGVzdGluYXRpb24gKmRlc3QsCisJCQlpbnRlcnJ1cHRfY2xhc3MgY2xhc3MpCit7CisgIGludCBpOworICBvcGljX2ludGVycnVwdF9zb3VyY2UgKnBlbmRpbmcgPSBOVUxMOworICBmb3IgKGkgPSAwOyBpIDwgb3BpYy0+bnJfaW50ZXJydXB0X3NvdXJjZXM7IGkrKykgeworICAgIG9waWNfaW50ZXJydXB0X3NvdXJjZSAqc3JjID0gJm9waWMtPmludGVycnVwdF9zb3VyY2VbaV07CisgICAgLyogaXMgdGhpcyBhIHBvdGVudGlhbCBoaXQ/ICovCisgICAgc3dpdGNoIChjbGFzcykgeworICAgIGNhc2UgaW5fc2VydmljZV9pbnRlcnJ1cHQ6CisgICAgICBpZiAoKHNyYy0+aW5fc2VydmljZSAmIGRlc3QtPmJpdCkgPT0gMCkKKwljb250aW51ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcGVuZGluZ19pbnRlcnJ1cHQ6CisgICAgICBpZiAoKHNyYy0+cGVuZGluZyAmIGRlc3QtPmJpdCkgPT0gMCkKKwljb250aW51ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvKiBzZWUgaWYgaXQgaXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgKi8KKyAgICBpZiAocGVuZGluZyA9PSBOVUxMKQorICAgICAgcGVuZGluZyA9IHNyYzsKKyAgICBlbHNlIGlmIChzcmMtPnByaW9yaXR5ID4gcGVuZGluZy0+cHJpb3JpdHkpCisgICAgICBwZW5kaW5nID0gc3JjOworICB9CisgIHJldHVybiBwZW5kaW5nOworfQorCisKK3N0YXRpYyBvcGljX2ludGVycnVwdF9kZXN0aW5hdGlvbiAqCitmaW5kX2xvd2VzdF9kZXN0KGRldmljZSAqbWUsIAorCQkgaHdfb3BpY19kZXZpY2UgKm9waWMsCisJCSBvcGljX2ludGVycnVwdF9zb3VyY2UgKnNyYykKK3sKKyAgaW50IGk7CisgIG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICpsb3dlc3QgPSBOVUxMOworICBmb3IgKGkgPSAwOyBpIDwgb3BpYy0+bnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9uczsgaSsrKSB7CisgICAgb3BpY19pbnRlcnJ1cHRfZGVzdGluYXRpb24gKmRlc3QgPSAmb3BpYy0+aW50ZXJydXB0X2Rlc3RpbmF0aW9uW2ldOworICAgIGlmIChzcmMtPmRlc3RpbmF0aW9uICYgZGVzdC0+Yml0KSB7CisgICAgICBpZiAoZGVzdC0+YmFzZV9wcmlvcml0eSA8IHNyYy0+cHJpb3JpdHkpIHsKKwlpZiAobG93ZXN0ID09IE5VTEwpCisJICBsb3dlc3QgPSBkZXN0OworCWVsc2UgaWYgKGxvd2VzdC0+YmFzZV9wcmlvcml0eSA+IGRlc3QtPmJhc2VfcHJpb3JpdHkpCisJICBsb3dlc3QgPSBkZXN0OworCWVsc2UgaWYgKGxvd2VzdC0+Y3VycmVudF9pbl9zZXJ2aWNlICE9IE5VTEwKKwkJICYmIGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZSA9PSBOVUxMKQorCSAgbG93ZXN0ID0gZGVzdDsgLyogbm90IGRvaW5nIGFueXRoaW5nICovCisJZWxzZSBpZiAobG93ZXN0LT5jdXJyZW50X2luX3NlcnZpY2UgIT0gTlVMTAorCQkgJiYgZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlICE9IE5VTEwKKwkJICYmIChsb3dlc3QtPmN1cnJlbnRfaW5fc2VydmljZS0+cHJpb3JpdHkKKwkJICAgICA+IGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZS0+cHJpb3JpdHkpKQorCSAgbG93ZXN0ID0gZGVzdDsgLyogbGVzcyB1cmdlbnQgKi8KKwkvKiBGSVhNRSAtIG5lZWQgdG8gYmUgbW9yZSBmYWlyICovCQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gbG93ZXN0OworfQorCisKK3N0YXRpYyB2b2lkCitoYW5kbGVfaW50ZXJydXB0KGRldmljZSAqbWUsCisJCSBod19vcGljX2RldmljZSAqb3BpYywKKwkJIG9waWNfaW50ZXJydXB0X3NvdXJjZSAqc3JjLAorCQkgaW50IGFzc2VydGVkKQoreworICBpZiAoc3JjLT5pc19tYXNrZWQpIHsKKyAgICBEVFJBQ0Uob3BpYywgKCJpbnRlcnJ1cHQgJWQgLSBpZ25vcmUgbWFza2VkXG4iLCBzcmMtPm5yKSk7CisgIH0KKyAgZWxzZSBpZiAoc3JjLT5pc19tdWx0aWNhc3QpIHsKKyAgICAvKiBhbHdheXMgdHJ5IHRvIGRlbGl2ZXIgbXVsdGljYXN0IGludGVycnVwdHMgLSBqdXN0IGVhc2llciAqLworICAgIGludCBpOworICAgIEFTU0VSVCghc3JjLT5pc19sZXZlbF90cmlnZ2VyZWQpOworICAgIEFTU0VSVChzcmMtPmlzX3Bvc2l0aXZlX3BvbGFyaXR5KTsKKyAgICBBU1NFUlQoYXNzZXJ0ZWQpOworICAgIGZvciAoaSA9IDA7IGkgPCBvcGljLT5ucl9pbnRlcnJ1cHRfZGVzdGluYXRpb25zOyBpKyspIHsKKyAgICAgIG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICpkZXN0ID0gJm9waWMtPmludGVycnVwdF9kZXN0aW5hdGlvbltpXTsKKyAgICAgIGlmIChzcmMtPmRlc3RpbmF0aW9uICYgZGVzdC0+Yml0KSB7CisJaWYgKHNyYy0+cGVuZGluZyAmIGRlc3QtPmJpdCkgeworCSAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0ICVkIC0gbXVsdGljYXN0IHN0aWxsIHBlbmRpbmcgdG8gJWRcbiIsCisJCQlzcmMtPm5yLCBkZXN0LT5ucikpOworCX0KKwllbHNlIGlmIChjYW5fZGVsaXZlcihtZSwgc3JjLCBkZXN0KSkgeworCSAgZGVzdC0+Y3VycmVudF9wZW5kaW5nID0gc3JjOworCSAgc3JjLT5wZW5kaW5nIHw9IGRlc3QtPmJpdDsKKwkgIGFzc2VydF9pbnRlcnJ1cHQobWUsIG9waWMsIGRlc3QpOworCSAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0ICVkIC0gbXVsdGljYXN0IHRvICVkXG4iLAorCQkJc3JjLT5uciwgZGVzdC0+bnIpKTsKKwl9CisJZWxzZSB7CisJICBzcmMtPnBlbmRpbmcgfD0gZGVzdC0+Yml0OworCSAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0ICVkIC0gbXVsdGljYXN0IHBlbmRpbmcgdG8gJWRcbiIsCisJCQlzcmMtPm5yLCBkZXN0LT5ucikpOworCX0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoc3JjLT5pc19sZXZlbF90cmlnZ2VyZWQKKwkgICAmJiBzcmMtPmlzX3Bvc2l0aXZlX3BvbGFyaXR5CisJICAgJiYgIWFzc2VydGVkKSB7CisgICAgaWYgKHNyYy0+cGVuZGluZykKKyAgICAgIERUUkFDRShvcGljLCAoImludGVycnVwdCAlZCAtIGlnbm9yZSB3aXRoZHJhd24gKGFjdGl2ZSBoaWdoKVxuIiwKKwkJICAgIHNyYy0+bnIpKTsKKyAgICBlbHNlCisgICAgICBEVFJBQ0Uob3BpYywgKCJpbnRlcnJ1cHQgJWQgLSBpZ25vcmUgbG93IGxldmVsIChhY3RpdmUgaGlnaClcbiIsCisJCSAgICBzcmMtPm5yKSk7CisgICAgQVNTRVJUKCFzcmMtPmlzX211bHRpY2FzdCk7CisgICAgc3JjLT5wZW5kaW5nID0gMDsKKyAgfQorICBlbHNlIGlmIChzcmMtPmlzX2xldmVsX3RyaWdnZXJlZAorCSAgICYmICFzcmMtPmlzX3Bvc2l0aXZlX3BvbGFyaXR5CisJICAgJiYgYXNzZXJ0ZWQpIHsKKyAgICBpZiAoc3JjLT5wZW5kaW5nKQorICAgICAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0ICVkIC0gaWdub3JlIHdpdGhkcmF3biAoYWN0aXZlIGxvdylcbiIsCisJCSAgICBzcmMtPm5yKSk7CisgICAgZWxzZQorICAgICAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0ICVkIC0gaWdub3JlIGhpZ2ggbGV2ZWwgKGFjdGl2ZSBsb3cpXG4iLAorCQkgICAgc3JjLT5ucikpOworCisgICAgQVNTRVJUKCFzcmMtPmlzX211bHRpY2FzdCk7CisgICAgc3JjLT5wZW5kaW5nID0gMDsKKyAgfQorICBlbHNlIGlmICghc3JjLT5pc19sZXZlbF90cmlnZ2VyZWQKKwkgICAmJiBzcmMtPmlzX3Bvc2l0aXZlX3BvbGFyaXR5CisJICAgJiYgIWFzc2VydGVkKSB7CisgICAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0ICVkIC0gaWdub3JlIGZhbGxpbmcgZWRnZSAocG9zaXRpdmUgZWRnZSB0cmlnZXJlZClcbiIsCisJCSAgc3JjLT5ucikpOworICB9CisgIGVsc2UgaWYgKCFzcmMtPmlzX2xldmVsX3RyaWdnZXJlZAorCSAgICYmICFzcmMtPmlzX3Bvc2l0aXZlX3BvbGFyaXR5CisJICAgJiYgYXNzZXJ0ZWQpIHsKKyAgICBEVFJBQ0Uob3BpYywgKCJpbnRlcnJ1cHQgJWQgLSBpZ25vcmUgcmlzaW5nIGVkZ2UgKG5lZ2F0aXZlIGVkZ2UgdHJpZ2VyZWQpXG4iLAorCQkgIHNyYy0+bnIpKTsKKyAgfQorICBlbHNlIGlmIChzcmMtPmluX3NlcnZpY2UgIT0gMCkgeworICAgIC8qIGxlYXZlIHRoZSBpbnRlcnJ1cHQgd2hlcmUgaXQgaXMgKi8KKyAgICBBU1NFUlQoIXNyYy0+aXNfbXVsdGljYXN0KTsKKyAgICBBU1NFUlQoc3JjLT5wZW5kaW5nID09IDAgfHwgc3JjLT5wZW5kaW5nID09IHNyYy0+aW5fc2VydmljZSk7CisgICAgc3JjLT5wZW5kaW5nID0gc3JjLT5pbl9zZXJ2aWNlOworICAgIERUUkFDRShvcGljLCAoImludGVycnVwdCAlbGQgLSBpZ25vcmUgYWxyZWFkeSBpbiBzZXJ2aWNlIHRvIDB4JWx4XG4iLAorCQkgIChsb25nKXNyYy0+bnIsIChsb25nKXNyYy0+aW5fc2VydmljZSkpOworICB9CisgIGVsc2UgaWYgKHNyYy0+cGVuZGluZyAhPSAwKSB7CisgICAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0ICVsZCAtIGlnbm9yZSBzdGlsbCBwZW5kaW5nIHRvIDB4JWx4XG4iLAorCQkgIChsb25nKXNyYy0+bnIsIChsb25nKXNyYy0+cGVuZGluZykpOworICB9CisgIGVsc2UgeworICAgIC8qIGRlbGl2ZXJ5IGlzIG5lZWRlZCAqLworICAgIG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICpkZXN0ID0gZmluZF9sb3dlc3RfZGVzdChtZSwgb3BpYywgc3JjKTsKKyAgICBpZiAoY2FuX2RlbGl2ZXIobWUsIHNyYywgZGVzdCkpIHsKKyAgICAgIGRlc3QtPmN1cnJlbnRfcGVuZGluZyA9IHNyYzsKKyAgICAgIHNyYy0+cGVuZGluZyA9IGRlc3QtPmJpdDsKKyAgICAgIERUUkFDRShvcGljLCAoImludGVycnVwdCAlZCAtIGRlbGl2ZXJlZCB0byAlZFxuIiwgc3JjLT5uciwgZGVzdC0+bnIpKTsKKyAgICAgIGFzc2VydF9pbnRlcnJ1cHQobWUsIG9waWMsIGRlc3QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHNyYy0+cGVuZGluZyA9IHNyYy0+ZGVzdGluYXRpb247IC8qIGFueSBjYW4gdGFrZSB0aGlzICovCisgICAgICBEVFJBQ0Uob3BpYywgKCJpbnRlcnJ1cHQgJWxkIC0gcGVuZGluZyB0byAweCVseFxuIiwKKwkJICAgIChsb25nKXNyYy0+bnIsIChsb25nKXNyYy0+cGVuZGluZykpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdW5zaWduZWQKK2RvX2ludGVycnVwdF9hY2tub3dsZWRnZV9yZWdpc3Rlcl9OX3JlYWQoZGV2aWNlICptZSwKKwkJCQkJIGh3X29waWNfZGV2aWNlICpvcGljLAorCQkJCQkgaW50IGRlc3RfbnIpCit7CisgIG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICpkZXN0ID0gJm9waWMtPmludGVycnVwdF9kZXN0aW5hdGlvbltkZXN0X25yXTsKKyAgdW5zaWduZWQgdmVjdG9yOworCisgIEFTU0VSVChkZXN0X25yID49IDAgJiYgZGVzdF9uciA8IG9waWMtPm5yX2ludGVycnVwdF9kZXN0aW5hdGlvbnMpOworICBBU1NFUlQoZGVzdF9uciA9PSBkZXN0LT5ucik7CisKKyAgLyogdHJ5IHRoZSBjdXJyZW50IHBlbmRpbmcgKi8KKyAgaWYgKGNhbl9kZWxpdmVyKG1lLCBkZXN0LT5jdXJyZW50X3BlbmRpbmcsIGRlc3QpKSB7CisgICAgQVNTRVJUKGRlc3QtPmN1cnJlbnRfcGVuZGluZy0+cGVuZGluZyAmIGRlc3QtPmJpdCk7CisgICAgdmVjdG9yID0gZGVsaXZlcl9wZW5kaW5nKG1lLCBvcGljLCBkZXN0KTsKKyAgICBEVFJBQ0Uob3BpYywgKCJpbnRlcnJ1cHQgYWNrICVkIC0gZW50ZXJpbmcgJWQgKHBlbmRpbmcpIC0gdmVjdG9yICVkICglZCksIHByaW9yaXR5ICVkXG4iLAorCQkgIGRlc3QtPm5yLAorCQkgIGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZS0+bnIsCisJCSAgZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlLT52ZWN0b3IsIHZlY3RvciwKKwkJICBkZXN0LT5jdXJyZW50X2luX3NlcnZpY2UtPnByaW9yaXR5KSk7CisgIH0KKyAgZWxzZSB7CisgICAgLyogdHJ5IGZvciBzb21ldGhpbmcgZWxzZSAqLworICAgIGRlc3QtPmN1cnJlbnRfcGVuZGluZyA9IGZpbmRfaW50ZXJydXB0X2Zvcl9kZXN0KG1lLCBvcGljLCBkZXN0LCBwZW5kaW5nX2ludGVycnVwdCk7CisgICAgaWYgKGNhbl9kZWxpdmVyKG1lLCBkZXN0LT5jdXJyZW50X3BlbmRpbmcsIGRlc3QpKSB7CisgICAgICB2ZWN0b3IgPSBkZWxpdmVyX3BlbmRpbmcobWUsIG9waWMsIGRlc3QpOyAgICAKKyAgICAgIERUUkFDRShvcGljLCAoImludGVycnVwdCBhY2sgJWQgLSBlbnRlcmluZyAlZCAobm90IHBlbmRpbmcpIC0gdmVjdG9yICVkICglZCksIHByaW9yaXR5ICVkXG4iLAorCQkgICAgZGVzdC0+bnIsCisJCSAgICBkZXN0LT5jdXJyZW50X2luX3NlcnZpY2UtPm5yLAorCQkgICAgZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlLT52ZWN0b3IsIHZlY3RvciwKKwkJICAgIGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZS0+cHJpb3JpdHkpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBkZXN0LT5jdXJyZW50X3BlbmRpbmcgPSBOVUxMOworICAgICAgdmVjdG9yID0gb3BpYy0+c3B1cmlvdXNfdmVjdG9yOworICAgICAgRFRSQUNFKG9waWMsICgiaW50ZXJydXB0IGFjayAlZCAtIHNwdXJpb3VzIGludGVycnVwdCAlZFxuIiwKKwkJICAgIGRlc3QtPm5yLCB2ZWN0b3IpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHZlY3RvcjsKK30KKworCitzdGF0aWMgdm9pZAorZG9fZW5kX29mX2ludGVycnVwdF9yZWdpc3Rlcl9OX3dyaXRlKGRldmljZSAqbWUsCisJCQkJICAgICBod19vcGljX2RldmljZSAqb3BpYywKKwkJCQkgICAgIGludCBkZXN0X25yLAorCQkJCSAgICAgdW5zaWduZWQgcmVnKQoreworICBvcGljX2ludGVycnVwdF9kZXN0aW5hdGlvbiAqZGVzdCA9ICZvcGljLT5pbnRlcnJ1cHRfZGVzdGluYXRpb25bZGVzdF9ucl07CisKKyAgQVNTRVJUKGRlc3RfbnIgPj0gMCAmJiBkZXN0X25yIDwgb3BpYy0+bnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9ucyk7CisgIEFTU0VSVChkZXN0X25yID09IGRlc3QtPm5yKTsKKworICAvKiBjaGVjayB0aGUgdmFsdWUgd3JpdHRlbiBpcyB6ZXJvICovCisgIGlmIChyZWcgIT0gMCkgeworICAgIERUUkFDRShvcGljLCAoImVvaSAlZCAtIGlnbm9yaW5nIG5vbnplcm8gdmFsdWVcbiIsIGRlc3QtPm5yKSk7CisgIH0KKworICAvKiB1c2VyIGRvaW5nIHdpZXJkIHRoaW5ncz8gKi8KKyAgaWYgKGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZSA9PSBOVUxMKSB7CisgICAgRFRSQUNFKG9waWMsICgiZW9pICVkIC0gc3RyYW5nZSwgbm8gY3VycmVudCBpbnRlcnJ1cHRcbiIsIGRlc3QtPm5yKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogYW4gaW50ZXJuYWwgc3R1ZmYgdXA/ICovCisgIGlmICghKGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZS0+aW5fc2VydmljZSAmIGRlc3QtPmJpdCkpIHsKKyAgICBkZXZpY2VfZXJyb3IobWUsICJlb2kgJWQgLSBjdXJyZW50IGludGVycnVwdCBub3QgaW4gc2VydmljZSIsIGRlc3QtPm5yKTsKKyAgfQorCisgIC8qIGZpbmQgd2hhdCB3YXMgcHJvYmFibHkgdGhlIHByZXZpb3VzIGluIHNlcnZpY2UgaW50ZXJydXB0ICovCisgIGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZS0+aW5fc2VydmljZSAmPSB+ZGVzdC0+Yml0OworICBEVFJBQ0Uob3BpYywgKCJlb2kgJWQgLSBlbmRpbmcgJWQgLSBwcmlvcml0eSAlZCwgdmVjdG9yICVkXG4iLAorCQlkZXN0LT5uciwKKwkJZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlLT5uciwKKwkJZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlLT5wcmlvcml0eSwKKwkJZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlLT52ZWN0b3IpKTsKKyAgZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlID0gZmluZF9pbnRlcnJ1cHRfZm9yX2Rlc3QobWUsIG9waWMsIGRlc3QsIGluX3NlcnZpY2VfaW50ZXJydXB0KTsKKyAgaWYgKGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZSAhPSBOVUxMKQorICAgIERUUkFDRShvcGljLCAoImVvaSAlZCAtIHJlc3VtaW5nICVkIC0gcHJpb3JpdHkgJWQsIHZlY3RvciAlZFxuIiwKKwkJICBkZXN0LT5uciwKKwkJICBkZXN0LT5jdXJyZW50X2luX3NlcnZpY2UtPm5yLAorCQkgIGRlc3QtPmN1cnJlbnRfaW5fc2VydmljZS0+cHJpb3JpdHksCisJCSAgZGVzdC0+Y3VycmVudF9pbl9zZXJ2aWNlLT52ZWN0b3IpKTsKKyAgZWxzZQorICAgIERUUkFDRShvcGljLCAoImVvaSAlZCAtIHJlc3VtaW5nIG5vbmVcbiIsIGRlc3QtPm5yKSk7CisKKyAgLyogY2hlY2sgdG8gc2VlIGlmIHRoYXQgc2hvdWxkbid0IGJlIGludGVycnVwdGVkICovCisgIGRlc3QtPmN1cnJlbnRfcGVuZGluZyA9IGZpbmRfaW50ZXJydXB0X2Zvcl9kZXN0KG1lLCBvcGljLCBkZXN0LCBwZW5kaW5nX2ludGVycnVwdCk7CisgIGlmIChjYW5fZGVsaXZlcihtZSwgZGVzdC0+Y3VycmVudF9wZW5kaW5nLCBkZXN0KSkgeworICAgIEFTU0VSVChkZXN0LT5jdXJyZW50X3BlbmRpbmctPnBlbmRpbmcgJiBkZXN0LT5iaXQpOworICAgIGFzc2VydF9pbnRlcnJ1cHQobWUsIG9waWMsIGRlc3QpOworICB9CisgIGVsc2UgeworICAgIGRlc3QtPmN1cnJlbnRfcGVuZGluZyA9IE5VTEw7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAorZGVjb2RlX29waWNfYWRkcmVzcyhkZXZpY2UgKm1lLAorCQkgICAgaHdfb3BpY19kZXZpY2UgKm9waWMsCisJCSAgICBpbnQgc3BhY2UsCisJCSAgICB1bnNpZ25lZF93b3JkIGFkZHJlc3MsCisJCSAgICB1bnNpZ25lZCBucl9ieXRlcywKKwkJICAgIG9waWNfcmVnaXN0ZXIgKnR5cGUsCisJCSAgICBpbnQgKmluZGV4KQoreworICBpbnQgaXNiID0gMDsKKworICAvKiBpcyB0aGUgc2l6ZSB2YWxpZD8gKi8KKyAgaWYgKG5yX2J5dGVzICE9IDQpIHsKKyAgICAqdHlwZSA9IGludmFsaWRfb3BpY19yZWdpc3RlcjsKKyAgICAqaW5kZXggPSAtMTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiB0cnkgZm9yIGEgcGVyLXByb2Nlc3NvciByZWdpc3RlciB3aXRoaW4gdGhlIGludGVycnVwdCBkZWxpdmVyeQorICAgICB1bml0ICovCisgIGlmIChzcGFjZSA9PSBvcGljLT5pZHUuc3BhY2UKKyAgICAgICYmIGFkZHJlc3MgPj0gKG9waWMtPmlkdS5hZGRyZXNzICsgaWR1X3Blcl9wcm9jZXNzb3JfcmVnaXN0ZXJfYmFzZSkKKyAgICAgICYmIGFkZHJlc3MgPCAob3BpYy0+aWR1LmFkZHJlc3MgKyBpZHVfcGVyX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9iYXNlCisJCSAgICArIChzaXplb2ZfaWR1X3Blcl9wcm9jZXNzb3JfcmVnaXN0ZXJfYmxvY2sKKwkJICAgICAgICogb3BpYy0+bnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9ucykpKSB7CisgICAgdW5zaWduZWRfd29yZCBibG9ja19vZmZzZXQgPSAoYWRkcmVzcworCQkJCSAgLSBvcGljLT5pZHUuYWRkcmVzcworCQkJCSAgLSBpZHVfcGVyX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9iYXNlKTsKKyAgICB1bnNpZ25lZF93b3JkIG9mZnNldCA9IGJsb2NrX29mZnNldCAlIHNpemVvZl9pZHVfcGVyX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9ibG9jazsKKyAgICAqaW5kZXggPSBibG9ja19vZmZzZXQgLyBzaXplb2ZfaWR1X3Blcl9wcm9jZXNzb3JfcmVnaXN0ZXJfYmxvY2s7CisgICAgc3dpdGNoIChvZmZzZXQpIHsKKyAgICBjYXNlIDB4MDQwOgorICAgICAgKnR5cGUgPSBpcGlfTl9kaXNwYXRjaF9yZWdpc3RlcjsKKyAgICAgICppbmRleCA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDUwOgorICAgICAgKnR5cGUgPSBpcGlfTl9kaXNwYXRjaF9yZWdpc3RlcjsKKyAgICAgICppbmRleCA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDYwOgorICAgICAgKnR5cGUgPSBpcGlfTl9kaXNwYXRjaF9yZWdpc3RlcjsKKyAgICAgICppbmRleCA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDcwOgorICAgICAgKnR5cGUgPSBpcGlfTl9kaXNwYXRjaF9yZWdpc3RlcjsKKyAgICAgICppbmRleCA9IDM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDgwOgorICAgICAgKnR5cGUgPSBjdXJyZW50X3Rhc2tfcHJpb3JpdHlfcmVnaXN0ZXJfTjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwYTA6CisgICAgICAqdHlwZSA9IGludGVycnVwdF9hY2tub3dsZWRnZV9yZWdpc3Rlcl9OOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDBiMDoKKyAgICAgICp0eXBlID0gZW5kX29mX2ludGVycnVwdF9yZWdpc3Rlcl9OOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICp0eXBlID0gaW52YWxpZF9vcGljX3JlZ2lzdGVyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIERUUkFDRShvcGljLCAoInBlci1wcm9jZXNzb3IgcmVnaXN0ZXIgJWQ6MHglbHggLSAlc1slZF1cbiIsCisJCSAgc3BhY2UsICh1bnNpZ25lZCBsb25nKWFkZHJlc3MsCisJCSAgb3BpY19yZWdpc3Rlcl9uYW1lKCp0eXBlKSwKKwkJICAqaW5kZXgpKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiB0cnkgZm9yIGFuIGludGVycnVwdCBzb3VyY2UgdW5pdCAqLworICBmb3IgKGlzYiA9IDA7IGlzYiA8IG9waWMtPm5yX2lzdV9ibG9ja3M7IGlzYisrKSB7CisgICAgaWYgKG9waWMtPmlzdV9ibG9ja1tpc2JdLnNwYWNlID09IHNwYWNlCisJJiYgYWRkcmVzcyA+PSBvcGljLT5pc3VfYmxvY2tbaXNiXS5hZGRyZXNzCisJJiYgYWRkcmVzcyA8IChvcGljLT5pc3VfYmxvY2tbaXNiXS5hZGRyZXNzICsgb3BpYy0+aXN1X2Jsb2NrW2lzYl0uc2l6ZSkpIHsKKyAgICAgIHVuc2lnbmVkX3dvcmQgYmxvY2tfb2Zmc2V0ID0gYWRkcmVzcyAtIG9waWMtPmlzdV9ibG9ja1tpc2JdLmFkZHJlc3M7CisgICAgICB1bnNpZ25lZF93b3JkIG9mZnNldCA9IGJsb2NrX29mZnNldCAlIHNpemVvZl9pc3VfcmVnaXN0ZXJfYmxvY2s7CisgICAgICAqaW5kZXggPSAob3BpYy0+aXN1X2Jsb2NrW2lzYl0uaW50X251bWJlcgorCQkrIChibG9ja19vZmZzZXQgLyBzaXplb2ZfaXN1X3JlZ2lzdGVyX2Jsb2NrKSk7CisgICAgICBzd2l0Y2ggKG9mZnNldCkgeworICAgICAgY2FzZSAweDAwOgorCSp0eXBlID0gaW50ZXJydXB0X3NvdXJjZV9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3RlcjsKKwlicmVhazsKKyAgICAgIGNhc2UgMHgxMDoKKwkqdHlwZSA9IGludGVycnVwdF9zb3VyY2VfTl9kZXN0aW5hdGlvbl9yZWdpc3RlcjsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJKnR5cGUgPSBpbnZhbGlkX29waWNfcmVnaXN0ZXI7CisJYnJlYWs7CisgICAgICB9CisgICAgICBEVFJBQ0Uob3BpYywgKCJpc3UgcmVnaXN0ZXIgJWQ6MHglbHggLSAlc1slZF1cbiIsCisJCSAgICBzcGFjZSwgKHVuc2lnbmVkIGxvbmcpYWRkcmVzcywKKwkJICAgIG9waWNfcmVnaXN0ZXJfbmFtZSgqdHlwZSksCisJCSAgICAqaW5kZXgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvKiB0cnkgZm9yIGEgdGltZXIgKi8KKyAgaWYgKHNwYWNlID09IG9waWMtPmlkdS5zcGFjZQorICAgICAgJiYgYWRkcmVzcyA+PSAob3BpYy0+aWR1LmFkZHJlc3MgKyBpZHVfdGltZXJfYmFzZSkKKyAgICAgICYmIGFkZHJlc3MgPCAob3BpYy0+aWR1LmFkZHJlc3MgKyBpZHVfdGltZXJfYmFzZQorCQkgICAgKyBvcGljLT5ucl90aW1lcl9pbnRlcnJ1cHRzICogc2l6ZW9mX3RpbWVyX3JlZ2lzdGVyX2Jsb2NrKSkgeworICAgIHVuc2lnbmVkX3dvcmQgb2Zmc2V0ID0gYWRkcmVzcyAlIHNpemVvZl90aW1lcl9yZWdpc3Rlcl9ibG9jazsKKyAgICAqaW5kZXggPSAoKGFkZHJlc3MgLSBvcGljLT5pZHUuYWRkcmVzcyAtIGlkdV90aW1lcl9iYXNlKQorCSAgICAgIC8gc2l6ZW9mX3RpbWVyX3JlZ2lzdGVyX2Jsb2NrKTsKKyAgICBzd2l0Y2ggKG9mZnNldCkgeworICAgIGNhc2UgMHgwMDoKKyAgICAgICp0eXBlID0gdGltZXJfTl9jdXJyZW50X2NvdW50X3JlZ2lzdGVyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDEwOgorICAgICAgKnR5cGUgPSB0aW1lcl9OX2Jhc2VfY291bnRfcmVnaXN0ZXI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MjA6CisgICAgICAqdHlwZSA9IHRpbWVyX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDMwOgorICAgICAgKnR5cGUgPSB0aW1lcl9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICp0eXBlID0gaW52YWxpZF9vcGljX3JlZ2lzdGVyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIERUUkFDRShvcGljLCAoInRpbWVyIHJlZ2lzdGVyICVkOjB4JWx4IC0gJXNbJWRdXG4iLAorCQkgIHNwYWNlLCAodW5zaWduZWQgbG9uZylhZGRyZXNzLAorCQkgIG9waWNfcmVnaXN0ZXJfbmFtZSgqdHlwZSksCisJCSAgKmluZGV4KSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogZmluYWxseSBzb21lIG90aGVyIG1pc2MgZ2xvYmFsIHJlZ2lzdGVyICovCisgIGlmIChzcGFjZSA9PSBvcGljLT5pZHUuc3BhY2UKKyAgICAgICYmIGFkZHJlc3MgPj0gb3BpYy0+aWR1LmFkZHJlc3MKKyAgICAgICYmIGFkZHJlc3MgPCBvcGljLT5pZHUuYWRkcmVzcyArIG9waWMtPmlkdS5zaXplKSB7CisgICAgdW5zaWduZWRfd29yZCBibG9ja19vZmZzZXQgPSBhZGRyZXNzIC0gb3BpYy0+aWR1LmFkZHJlc3M7CisgICAgc3dpdGNoIChibG9ja19vZmZzZXQpIHsKKyAgICBjYXNlIDB4MDEwZjA6CisgICAgICAqdHlwZSA9IHRpbWVyX2ZyZXF1ZW5jeV9yZXBvcnRpbmdfcmVnaXN0ZXI7CisgICAgICAqaW5kZXggPSAtMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwMTBlMDoKKyAgICAgICp0eXBlID0gc3B1cmlvdXNfdmVjdG9yX3JlZ2lzdGVyOworICAgICAgKmluZGV4ID0gLTE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDEwZDA6CisgICAgY2FzZSAweDAxMGMwOgorICAgIGNhc2UgMHgwMTBiMDoKKyAgICBjYXNlIDB4MDEwYTA6CisgICAgICAqdHlwZSA9IGlwaV9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3RlcjsKKyAgICAgICppbmRleCA9IChibG9ja19vZmZzZXQgLSAweDAxMGEwKSAvIDE2OworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDAxMDkwOgorICAgICAgKnR5cGUgPSBwcm9jZXNzb3JfaW5pdF9yZWdpc3RlcjsKKyAgICAgICppbmRleCA9IC0xOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDAxMDgwOgorICAgICAgKnR5cGUgPSB2ZW5kb3JfaWRlbnRpZmljYXRpb25fcmVnaXN0ZXI7CisgICAgICAqaW5kZXggPSAtMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwMTAyMDoKKyAgICAgICp0eXBlID0gZ2xvYmFsX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXJfTjsKKyAgICAgICppbmRleCA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDEwMDA6CisgICAgICAqdHlwZSA9IGZlYXR1cmVfcmVwb3J0aW5nX3JlZ2lzdGVyX047CisgICAgICAqaW5kZXggPSAwOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICp0eXBlID0gaW52YWxpZF9vcGljX3JlZ2lzdGVyOworICAgICAgKmluZGV4ID0gLTE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgRFRSQUNFKG9waWMsICgiZ2xvYmFsIHJlZ2lzdGVyICVkOjB4JWx4IC0gJXNbJWRdXG4iLAorCQkgIHNwYWNlLCAodW5zaWduZWQgbG9uZylhZGRyZXNzLAorCQkgIG9waWNfcmVnaXN0ZXJfbmFtZSgqdHlwZSksCisJCSAgKmluZGV4KSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogbm90aGluZyBtYXRjaGVkICovCisgICp0eXBlID0gaW52YWxpZF9vcGljX3JlZ2lzdGVyOworICBEVFJBQ0Uob3BpYywgKCJpbnZhbGlkIHJlZ2lzdGVyICVkOjB4JWx4XG4iLAorCQlzcGFjZSwgKHVuc2lnbmVkIGxvbmcpYWRkcmVzcykpOworICByZXR1cm47Cit9CisKKworLyogUHJvY2Vzc29yIGluaXQgcmVnaXN0ZXI6CisKKyAgIFRoZSBiaXRzIGluIHRoaXMgcmVnaXN0ZXIgKG9uZSBwZXIgcHJvY2Vzc29yKSBhcmUgZGlyZWN0bHkgd2lyZWQgdG8KKyAgIG91dHB1dCAiaW5pdCIgaW50ZXJydXB0IHBvcnRzLiAqLworCitzdGF0aWMgdW5zaWduZWQKK2RvX3Byb2Nlc3Nvcl9pbml0X3JlZ2lzdGVyX3JlYWQoZGV2aWNlICptZSwKKwkJCQlod19vcGljX2RldmljZSAqb3BpYykKK3sKKyAgdW5zaWduZWQgcmVnID0gb3BpYy0+aW5pdDsKKyAgRFRSQUNFKG9waWMsICgicHJvY2Vzc29yIGluaXQgcmVnaXN0ZXIgLSByZWFkIDB4JWx4XG4iLAorCQkobG9uZylyZWcpKTsKKyAgcmV0dXJuIHJlZzsKK30KKworc3RhdGljIHZvaWQKK2RvX3Byb2Nlc3Nvcl9pbml0X3JlZ2lzdGVyX3dyaXRlKGRldmljZSAqbWUsCisJCQkJIGh3X29waWNfZGV2aWNlICpvcGljLAorCQkJCSB1bnNpZ25lZCByZWcpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgb3BpYy0+bnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9uczsgaSsrKSB7CisgICAgb3BpY19pbnRlcnJ1cHRfZGVzdGluYXRpb24gKmRlc3QgPSAmb3BpYy0+aW50ZXJydXB0X2Rlc3RpbmF0aW9uW2ldOworICAgIGlmICgocmVnICYgZGVzdC0+Yml0KSAhPSAob3BpYy0+aW5pdCAmIGRlc3QtPmJpdCkpIHsKKyAgICAgIGlmIChyZWcgJiBkZXN0LT5iaXQpIHsKKwlEVFJBQ0Uob3BpYywgKCJwcm9jZXNzb3IgaW5pdCByZWdpc3RlciAtIHdyaXRlIDB4JWx4IC0gYXNzZXJ0aW5nIGluaXQlZFxuIiwKKwkJICAgICAgKGxvbmcpcmVnLCBpKSk7CisJb3BpYy0+aW5pdCB8PSBkZXN0LT5iaXQ7CisJZGV2aWNlX2ludGVycnVwdF9ldmVudChtZSwgZGVzdC0+aW5pdF9wb3J0LCAxLCBOVUxMLCAwKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworCURUUkFDRShvcGljLCAoInByb2Nlc3NvciBpbml0IHJlZ2lzdGVyIC0gd3JpdGUgMHglbHggLSBuZWdhdGluZyBpbml0JWRcbiIsCisJCSAgICAgIChsb25nKXJlZywgaSkpOworCW9waWMtPmluaXQgJj0gfmRlc3QtPmJpdDsKKwlkZXZpY2VfaW50ZXJydXB0X2V2ZW50KG1lLCBkZXN0LT5pbml0X3BvcnQsIDAsIE5VTEwsIDApOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKworLyogSW50ZXJydXB0IFNvdXJjZSBWZWN0b3IvUHJpb3JpdHkgUmVnaXN0ZXI6ICovCisKK3N0YXRpYyB1bnNpZ25lZAorcmVhZF92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXIoZGV2aWNlICptZSwKKwkJCSAgICAgIGh3X29waWNfZGV2aWNlICpvcGljLAorCQkJICAgICAgb3BpY19pbnRlcnJ1cHRfc291cmNlICppbnRlcnJ1cHQsCisJCQkgICAgICBjb25zdCBjaGFyICpyZWdfbmFtZSwKKwkJCSAgICAgIGludCByZWdfaW5kZXgpCit7CisgIHVuc2lnbmVkIHJlZzsKKyAgcmVnID0gMDsKKyAgcmVnIHw9IGludGVycnVwdC0+aXNfbWFza2VkOworICByZWcgfD0gKGludGVycnVwdC0+aW5fc2VydmljZSB8fCBpbnRlcnJ1cHQtPnBlbmRpbmcKKwkgID8gaXN1X2FjdGl2ZV9iaXQgOiAwKTsgLyogYWN0aXZlICovCisgIHJlZyB8PSBpbnRlcnJ1cHQtPmlzX211bHRpY2FzdDsKKyAgcmVnIHw9IGludGVycnVwdC0+aXNfcG9zaXRpdmVfcG9sYXJpdHk7CisgIHJlZyB8PSBpbnRlcnJ1cHQtPmlzX2xldmVsX3RyaWdnZXJlZDsgLyogc2Vuc2U/ICovCisgIHJlZyB8PSBpbnRlcnJ1cHQtPnByaW9yaXR5IDw8IGlzdV9wcmlvcml0eV9zaGlmdDsKKyAgcmVnIHw9IGludGVycnVwdC0+dmVjdG9yOworICBEVFJBQ0Uob3BpYywgKCIlcyAlZCB2ZWN0b3IvcHJpb3JpdHkgcmVnaXN0ZXIgLSByZWFkIDB4JWx4XG4iLAorCQlyZWdfbmFtZSwgcmVnX2luZGV4LCAodW5zaWduZWQgbG9uZylyZWcpKTsKKyAgcmV0dXJuIHJlZzsKK30KKworc3RhdGljIHVuc2lnbmVkCitkb19pbnRlcnJ1cHRfc291cmNlX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyX3JlYWQoZGV2aWNlICptZSwKKwkJCQkJCSAgICBod19vcGljX2RldmljZSAqb3BpYywKKwkJCQkJCSAgICBpbnQgaW5kZXgpCit7CisgIHVuc2lnbmVkIHJlZzsKKyAgQVNTRVJUKGluZGV4IDwgb3BpYy0+bnJfZXh0ZXJuYWxfaW50ZXJydXB0cyk7CisgIHJlZyA9IHJlYWRfdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyKG1lLCBvcGljLAorCQkJCSAgICAgICZvcGljLT5pbnRlcnJ1cHRfc291cmNlW2luZGV4XSwKKwkJCQkgICAgICAiaW50ZXJydXB0IHNvdXJjZSIsIGluZGV4KTsKKyAgcmV0dXJuIHJlZzsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3RlcihkZXZpY2UgKm1lLAorCQkJICAgICAgIGh3X29waWNfZGV2aWNlICpvcGljLAorCQkJICAgICAgIG9waWNfaW50ZXJydXB0X3NvdXJjZSAqaW50ZXJydXB0LAorCQkJICAgICAgIHVuc2lnbmVkIHJlZywKKwkJCSAgICAgICBjb25zdCBjaGFyICpyZWdfbmFtZSwKKwkJCSAgICAgICBpbnQgcmVnX2luZGV4KQoreworICBpbnRlcnJ1cHQtPmlzX21hc2tlZCA9IChyZWcgJiBpc3VfbWFza19iaXQpOworICBpbnRlcnJ1cHQtPmlzX211bHRpY2FzdCA9IChyZWcgJiBpc3VfbXVsdGljYXN0X2JpdCk7CisgIGludGVycnVwdC0+aXNfcG9zaXRpdmVfcG9sYXJpdHkgPSAocmVnICYgaXN1X3Bvc2l0aXZlX3BvbGFyaXR5X2JpdCk7CisgIGludGVycnVwdC0+aXNfbGV2ZWxfdHJpZ2dlcmVkID0gKHJlZyAmIGlzdV9sZXZlbF90cmlnZ2VyZWRfYml0KTsKKyAgaW50ZXJydXB0LT5wcmlvcml0eSA9ICgocmVnID4+IGlzdV9wcmlvcml0eV9zaGlmdCkKKwkJCSAlIG1heF9ucl90YXNrX3ByaW9yaXRpZXMpOworICBpbnRlcnJ1cHQtPnZlY3RvciA9IChyZWcgJiBpc3VfdmVjdG9yX2JpdHMpOworICBEVFJBQ0Uob3BpYywgKCIlcyAlZCB2ZWN0b3IvcHJpb3JpdHkgcmVnaXN0ZXIgLSB3cml0ZSAweCVseCAtICVzJXMlcy1wb2xhcml0eSwgJXMtdHJpZ2dlcmVkLCBwcmlvcml0eSAlbGQgdmVjdG9yICVsZFxuIiwKKwkJcmVnX25hbWUsCisJCXJlZ19pbmRleCwKKwkJKHVuc2lnbmVkIGxvbmcpcmVnLAorCQlpbnRlcnJ1cHQtPmlzX21hc2tlZCA/ICJtYXNrZWQsICIgOiAiIiwKKwkJaW50ZXJydXB0LT5pc19tdWx0aWNhc3QgPyAibXVsdGljYXN0LCAiIDogIiIsCisJCWludGVycnVwdC0+aXNfcG9zaXRpdmVfcG9sYXJpdHkgPyAicG9zaXRpdmUiIDogIm5lZ2F0aXZlIiwKKwkJaW50ZXJydXB0LT5pc19sZXZlbF90cmlnZ2VyZWQgPyAibGV2ZWwiIDogImVkZ2UiLAorCQkobG9uZylpbnRlcnJ1cHQtPnByaW9yaXR5LAorCQkobG9uZylpbnRlcnJ1cHQtPnZlY3RvcikpOworfQorCitzdGF0aWMgdm9pZAorZG9faW50ZXJydXB0X3NvdXJjZV9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3Rlcl93cml0ZShkZXZpY2UgKm1lLAorCQkJCQkJICAgICBod19vcGljX2RldmljZSAqb3BpYywKKwkJCQkJCSAgICAgaW50IGluZGV4LAorCQkJCQkJICAgICB1bnNpZ25lZCByZWcpCit7CisgIEFTU0VSVChpbmRleCA8IG9waWMtPm5yX2V4dGVybmFsX2ludGVycnVwdHMpOworICByZWcgJj0gfmlzdV9tdWx0aWNhc3RfYml0OyAvKiBkaXNhYmxlIG11bHRpY2FzdCAqLworICB3cml0ZV92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXIobWUsIG9waWMsCisJCQkJICZvcGljLT5pbnRlcnJ1cHRfc291cmNlW2luZGV4XSwKKwkJCQkgcmVnLCAiaW50ZXJydXB0IHNvdXJjZSIsIGluZGV4KTsKK30KKworCisKKy8qIEludGVycnVwdCBTb3VyY2UgRGVzdGluYXRpb24gUmVnaXN0ZXI6ICovCisKK3N0YXRpYyB1bnNpZ25lZAorcmVhZF9kZXN0aW5hdGlvbl9yZWdpc3RlcihkZXZpY2UgKm1lLAorCQkJICBod19vcGljX2RldmljZSAqb3BpYywKKwkJCSAgb3BpY19pbnRlcnJ1cHRfc291cmNlICppbnRlcnJ1cHQsCisJCQkgIGNvbnN0IGNoYXIgKnJlZ19uYW1lLAorCQkJICBpbnQgcmVnX2luZGV4KQoreworICB1bnNpZ25lZCBsb25nIHJlZzsKKyAgcmVnID0gaW50ZXJydXB0LT5kZXN0aW5hdGlvbjsKKyAgRFRSQUNFKG9waWMsICgiJXMgJWQgZGVzdGluYXRpb24gcmVnaXN0ZXIgLSByZWFkIDB4JWx4XG4iLAorCQlyZWdfbmFtZSwgcmVnX2luZGV4LCByZWcpKTsKKyAgcmV0dXJuIHJlZzsKK30KKwkJCSAgICAgCitzdGF0aWMgdW5zaWduZWQKK2RvX2ludGVycnVwdF9zb3VyY2VfTl9kZXN0aW5hdGlvbl9yZWdpc3Rlcl9yZWFkKGRldmljZSAqbWUsCisJCQkJCQlod19vcGljX2RldmljZSAqb3BpYywKKwkJCQkJCWludCBpbmRleCkKK3sKKyAgdW5zaWduZWQgcmVnOworICBBU1NFUlQoaW5kZXggPCBvcGljLT5ucl9leHRlcm5hbF9pbnRlcnJ1cHRzKTsKKyAgcmVnID0gcmVhZF9kZXN0aW5hdGlvbl9yZWdpc3RlcihtZSwgb3BpYywgJm9waWMtPmV4dGVybmFsX2ludGVycnVwdF9zb3VyY2VbaW5kZXhdLAorCQkJCSAgImludGVycnVwdCBzb3VyY2UiLCBpbmRleCk7CisgIHJldHVybiByZWc7Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZV9kZXN0aW5hdGlvbl9yZWdpc3RlcihkZXZpY2UgKm1lLAorCQkJICAgaHdfb3BpY19kZXZpY2UgKm9waWMsCisJCQkgICBvcGljX2ludGVycnVwdF9zb3VyY2UgKmludGVycnVwdCwKKwkJCSAgIHVuc2lnbmVkIHJlZywKKwkJCSAgIGNvbnN0IGNoYXIgKnJlZ19uYW1lLAorCQkJICAgaW50IHJlZ19pbmRleCkKK3sKKyAgcmVnICY9ICgxIDw8IG9waWMtPm5yX2ludGVycnVwdF9kZXN0aW5hdGlvbnMpIC0gMTsgLyogbWFzayBvdXQgaW52YWxpZCAqLworICBEVFJBQ0Uob3BpYywgKCIlcyAlZCBkZXN0aW5hdGlvbiByZWdpc3RlciAtIHdyaXRlIDB4JXhcbiIsCisJCXJlZ19uYW1lLCByZWdfaW5kZXgsIHJlZykpOworICBpbnRlcnJ1cHQtPmRlc3RpbmF0aW9uID0gcmVnOworfQorCitzdGF0aWMgdm9pZAorZG9faW50ZXJydXB0X3NvdXJjZV9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyX3dyaXRlKGRldmljZSAqbWUsCisJCQkJCQkgaHdfb3BpY19kZXZpY2UgKm9waWMsCisJCQkJCQkgaW50IGluZGV4LAorCQkJCQkJIHVuc2lnbmVkIHJlZykKK3sKKyAgQVNTRVJUKGluZGV4IDwgb3BpYy0+bnJfZXh0ZXJuYWxfaW50ZXJydXB0cyk7CisgIHdyaXRlX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyKG1lLCBvcGljLCAmb3BpYy0+ZXh0ZXJuYWxfaW50ZXJydXB0X3NvdXJjZVtpbmRleF0sCisJCQkgICAgIHJlZywgImludGVycnVwdCBzb3VyY2UiLCBpbmRleCk7Cit9CisKKworCisvKiBTcHVyaW91cyB2ZWN0b3IgcmVnaXN0ZXI6ICovCisKK3N0YXRpYyB1bnNpZ25lZAorZG9fc3B1cmlvdXNfdmVjdG9yX3JlZ2lzdGVyX3JlYWQoZGV2aWNlICptZSwKKwkJCQkgaHdfb3BpY19kZXZpY2UgKm9waWMpCit7CisgIHVuc2lnbmVkIGxvbmcgcmVnID0gb3BpYy0+c3B1cmlvdXNfdmVjdG9yOworICBEVFJBQ0Uob3BpYywgKCJzcHVyaW91cyB2ZWN0b3IgcmVnaXN0ZXIgLSByZWFkIDB4JWx4XG4iLCByZWcpKTsKKyAgcmV0dXJuIHJlZzsKK30KKworc3RhdGljIHZvaWQKK2RvX3NwdXJpb3VzX3ZlY3Rvcl9yZWdpc3Rlcl93cml0ZShkZXZpY2UgKm1lLAorCQkJCSAgaHdfb3BpY19kZXZpY2UgKm9waWMsCisJCQkJICB1bnNpZ25lZCByZWcpCit7CisgIHJlZyAmPSAweGZmOyAvKiBtYXNrIG9mZiBpbnZhbGlkICovCisgIERUUkFDRShvcGljLCAoInNwdXJpb3VzIHZlY3RvciByZWdpc3RlciAtIHdyaXRlIDB4JXhcbiIsIHJlZykpOworICBvcGljLT5zcHVyaW91c192ZWN0b3IgPSByZWc7Cit9CisKKworCisvKiBjdXJyZW50IHRhc2sgcHJpb3JpdHkgcmVnaXN0ZXI6ICovCisKK3N0YXRpYyB1bnNpZ25lZAorZG9fY3VycmVudF90YXNrX3ByaW9yaXR5X3JlZ2lzdGVyX05fcmVhZChkZXZpY2UgKm1lLAorCQkJCQkgaHdfb3BpY19kZXZpY2UgKm9waWMsCisJCQkJCSBpbnQgaW5kZXgpCit7CisgIG9waWNfaW50ZXJydXB0X2Rlc3RpbmF0aW9uICppbnRlcnJ1cHRfZGVzdGluYXRpb24gPSAmb3BpYy0+aW50ZXJydXB0X2Rlc3RpbmF0aW9uW2luZGV4XTsKKyAgdW5zaWduZWQgcmVnOworICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG9waWMtPm5yX2ludGVycnVwdF9kZXN0aW5hdGlvbnMpOworICByZWcgPSBpbnRlcnJ1cHRfZGVzdGluYXRpb24tPmJhc2VfcHJpb3JpdHk7CisgIERUUkFDRShvcGljLCAoImN1cnJlbnQgdGFzayBwcmlvcml0eSByZWdpc3RlciAlZCAtIHJlYWQgMHgleFxuIiwgaW5kZXgsIHJlZykpOworICByZXR1cm4gcmVnOworfQorCitzdGF0aWMgdm9pZAorZG9fY3VycmVudF90YXNrX3ByaW9yaXR5X3JlZ2lzdGVyX05fd3JpdGUoZGV2aWNlICptZSwKKwkJCQkJICBod19vcGljX2RldmljZSAqb3BpYywKKwkJCQkJICBpbnQgaW5kZXgsCisJCQkJCSAgdW5zaWduZWQgcmVnKQoreworICBvcGljX2ludGVycnVwdF9kZXN0aW5hdGlvbiAqaW50ZXJydXB0X2Rlc3RpbmF0aW9uID0gJm9waWMtPmludGVycnVwdF9kZXN0aW5hdGlvbltpbmRleF07CisgIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwgb3BpYy0+bnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9ucyk7CisgIHJlZyAlPSBtYXhfbnJfdGFza19wcmlvcml0aWVzOworICBEVFJBQ0Uob3BpYywgKCJjdXJyZW50IHRhc2sgcHJpb3JpdHkgcmVnaXN0ZXIgJWQgLSB3cml0ZSAweCV4XG4iLCBpbmRleCwgcmVnKSk7CisgIGludGVycnVwdF9kZXN0aW5hdGlvbi0+YmFzZV9wcmlvcml0eSA9IHJlZzsKK30KKworCisKKy8qIFRpbWVyIEZyZXF1ZW5jeSBSZXBvcnRpbmcgUmVnaXN0ZXI6ICovCisKK3N0YXRpYyB1bnNpZ25lZAorZG9fdGltZXJfZnJlcXVlbmN5X3JlcG9ydGluZ19yZWdpc3Rlcl9yZWFkKGRldmljZSAqbWUsCisJCQkJCSAgIGh3X29waWNfZGV2aWNlICpvcGljKQoreworICB1bnNpZ25lZCByZWc7CisgIHJlZyA9IG9waWMtPnRpbWVyX2ZyZXF1ZW5jeTsKKyAgRFRSQUNFKG9waWMsICgidGltZXIgZnJlcXVlbmN5IHJlcG9ydGluZyByZWdpc3RlciAtIHJlYWQgMHgleFxuIiwgcmVnKSk7CisgIHJldHVybiByZWc7Cit9CisKK3N0YXRpYyB2b2lkCitkb190aW1lcl9mcmVxdWVuY3lfcmVwb3J0aW5nX3JlZ2lzdGVyX3dyaXRlKGRldmljZSAqbWUsCisJCQkJCSAgICBod19vcGljX2RldmljZSAqb3BpYywKKwkJCQkJICAgIHVuc2lnbmVkIHJlZykKK3sKKyAgRFRSQUNFKG9waWMsICgidGltZXIgZnJlcXVlbmN5IHJlcG9ydGluZyByZWdpc3RlciAtIHdyaXRlIDB4JXhcbiIsIHJlZykpOworICBvcGljLT50aW1lcl9mcmVxdWVuY3kgPSByZWc7Cit9CisKKworLyogdGltZXIgcmVnaXN0ZXJzOiAqLworCitzdGF0aWMgdW5zaWduZWQKK2RvX3RpbWVyX05fY3VycmVudF9jb3VudF9yZWdpc3Rlcl9yZWFkKGRldmljZSAqbWUsCisJCQkJICAgICAgIGh3X29waWNfZGV2aWNlICpvcGljLAorCQkJCSAgICAgICBpbnQgaW5kZXgpCit7CisgIG9waWNfdGltZXIgKnRpbWVyID0gJm9waWMtPnRpbWVyW2luZGV4XTsKKyAgdW5zaWduZWQgcmVnOworICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG9waWMtPm5yX3RpbWVyX2ludGVycnVwdHMpOworICBpZiAodGltZXItPmluaGliaXRlZCkKKyAgICByZWcgPSB0aW1lci0+Y291bnQ7IC8qIHN0YWxsZWQgdmFsdWUgKi8KKyAgZWxzZQorICAgIHJlZyA9IHRpbWVyLT5jb3VudCAtIGRldmljZV9ldmVudF9xdWV1ZV90aW1lKG1lKTsgLyogdGltZSByZW1haW5pbmcgKi8KKyAgRFRSQUNFKG9waWMsICgidGltZXIgJWQgY3VycmVudCBjb3VudCByZWdpc3RlciAtIHJlYWQgMHgleFxuIiwgaW5kZXgsIHJlZykpOworICByZXR1cm4gcmVnOworfQorCisKK3N0YXRpYyB1bnNpZ25lZAorZG9fdGltZXJfTl9iYXNlX2NvdW50X3JlZ2lzdGVyX3JlYWQoZGV2aWNlICptZSwKKwkJCQkgICAgaHdfb3BpY19kZXZpY2UgKm9waWMsCisJCQkJICAgIGludCBpbmRleCkKK3sKKyAgb3BpY190aW1lciAqdGltZXIgPSAmb3BpYy0+dGltZXJbaW5kZXhdOworICB1bnNpZ25lZCByZWc7CisgIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwgb3BpYy0+bnJfdGltZXJfaW50ZXJydXB0cyk7CisgIHJlZyA9IHRpbWVyLT5iYXNlX2NvdW50OworICBEVFJBQ0Uob3BpYywgKCJ0aW1lciAlZCBiYXNlIGNvdW50IHJlZ2lzdGVyIC0gcmVhZCAweCV4XG4iLCBpbmRleCwgcmVnKSk7CisgIHJldHVybiByZWc7Cit9CisKKworc3RhdGljIHZvaWQKK3RpbWVyX2V2ZW50KHZvaWQgKmRhdGEpCit7CisgIG9waWNfdGltZXIgKnRpbWVyID0gZGF0YTsKKyAgZGV2aWNlICptZSA9IHRpbWVyLT5tZTsKKyAgaWYgKHRpbWVyLT5pbmhpYml0ZWQpCisgICAgZGV2aWNlX2Vycm9yKHRpbWVyLT5tZSwgImludGVybmFsLWVycm9yIC0gdGltZXIgZXZlbnQgb2NjdXJlZCB3aGVuIHRpbWVyICVkIGluaGliaXRlZCIsCisJCSB0aW1lci0+bnIpOworICBoYW5kbGVfaW50ZXJydXB0KHRpbWVyLT5tZSwgdGltZXItPm9waWMsIHRpbWVyLT5pbnRlcnJ1cHRfc291cmNlLCAxKTsKKyAgdGltZXItPnRpbWVvdXRfZXZlbnQgPSBkZXZpY2VfZXZlbnRfcXVldWVfc2NoZWR1bGUobWUsIHRpbWVyLT5iYXNlX2NvdW50LAorCQkJCQkJICAgICB0aW1lcl9ldmVudCwgdGltZXIpOworICBEVFJBQ0Uob3BpYywgKCJ0aW1lciAlZCAtIGludGVycnVwdCBhdCAlbGQsIG5leHQgYXQgJWRcbiIsCisJCXRpbWVyLT5uciwgKGxvbmcpZGV2aWNlX2V2ZW50X3F1ZXVlX3RpbWUobWUpLCB0aW1lci0+YmFzZV9jb3VudCkpOworfQorCisKK3N0YXRpYyB2b2lkCitkb190aW1lcl9OX2Jhc2VfY291bnRfcmVnaXN0ZXJfd3JpdGUoZGV2aWNlICptZSwKKwkJCQkgICAgIGh3X29waWNfZGV2aWNlICpvcGljLAorCQkJCSAgICAgaW50IGluZGV4LAorCQkJCSAgICAgdW5zaWduZWQgcmVnKQoreworICBvcGljX3RpbWVyICp0aW1lciA9ICZvcGljLT50aW1lcltpbmRleF07CisgIGludCBpbmhpYml0OworICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG9waWMtPm5yX3RpbWVyX2ludGVycnVwdHMpOworICBpbmhpYml0ID0gcmVnICYgMHg4MDAwMDAwMDsKKyAgaWYgKHRpbWVyLT5pbmhpYml0ZWQgJiYgIWluaGliaXQpIHsKKyAgICB0aW1lci0+aW5oaWJpdGVkID0gMDsKKyAgICBpZiAodGltZXItPnRpbWVvdXRfZXZlbnQgIT0gTlVMTCkKKyAgICAgIGRldmljZV9ldmVudF9xdWV1ZV9kZXNjaGVkdWxlKG1lLCB0aW1lci0+dGltZW91dF9ldmVudCk7CisgICAgdGltZXItPmNvdW50ID0gZGV2aWNlX2V2ZW50X3F1ZXVlX3RpbWUobWUpICsgcmVnOworICAgIHRpbWVyLT5iYXNlX2NvdW50ID0gcmVnOworICAgIHRpbWVyLT50aW1lb3V0X2V2ZW50ID0gZGV2aWNlX2V2ZW50X3F1ZXVlX3NjaGVkdWxlKG1lLCB0aW1lci0+YmFzZV9jb3VudCwKKwkJCQkJCSAgICAgICB0aW1lcl9ldmVudCwgKHZvaWQqKXRpbWVyKTsKKyAgICBEVFJBQ0Uob3BpYywgKCJ0aW1lciAlZCBiYXNlIGNvdW50IHJlZ2lzdGVyIC0gd3JpdGUgMHgleCAtIHRpbWVyIHN0YXJ0ZWRcbiIsCisJCSAgaW5kZXgsIHJlZykpOworICB9CisgIGVsc2UgaWYgKCF0aW1lci0+aW5oaWJpdGVkICYmIGluaGliaXQpIHsKKyAgICBpZiAodGltZXItPnRpbWVvdXRfZXZlbnQgIT0gTlVMTCkKKyAgICAgIGRldmljZV9ldmVudF9xdWV1ZV9kZXNjaGVkdWxlKG1lLCB0aW1lci0+dGltZW91dF9ldmVudCk7CisgICAgdGltZXItPmNvdW50ID0gdGltZXItPmNvdW50IC0gZGV2aWNlX2V2ZW50X3F1ZXVlX3RpbWUobWUpOworICAgIHRpbWVyLT5pbmhpYml0ZWQgPSAxOworICAgIHRpbWVyLT5iYXNlX2NvdW50ID0gcmVnOworICAgIERUUkFDRShvcGljLCAoInRpbWVyICVkIGJhc2UgY291bnQgcmVnaXN0ZXIgLSB3cml0ZSAweCV4IC0gdGltZXIgc3RvcHBlZFxuIiwKKwkJICBpbmRleCwgcmVnKSk7CisgIH0KKyAgZWxzZSB7CisgICAgQVNTRVJUKCh0aW1lci0+aW5oaWJpdGVkICYmIGluaGliaXQpIHx8ICghdGltZXItPmluaGliaXRlZCAmJiAhaW5oaWJpdCkpOworICAgIERUUkFDRShvcGljLCAoInRpbWVyICVkIGJhc2UgY291bnQgcmVnaXN0ZXIgLSB3cml0ZSAweCV4XG4iLCBpbmRleCwgcmVnKSk7CisgICAgdGltZXItPmJhc2VfY291bnQgPSByZWc7CisgIH0KK30KKworCitzdGF0aWMgdW5zaWduZWQKK2RvX3RpbWVyX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyX3JlYWQoZGV2aWNlICptZSwKKwkJCQkJIGh3X29waWNfZGV2aWNlICpvcGljLAorCQkJCQkgaW50IGluZGV4KQoreworICB1bnNpZ25lZCByZWc7CisgIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwgb3BpYy0+bnJfdGltZXJfaW50ZXJydXB0cyk7CisgIHJlZyA9IHJlYWRfdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyKG1lLCBvcGljLAorCQkJCSAgICAgICZvcGljLT50aW1lcl9pbnRlcnJ1cHRfc291cmNlW2luZGV4XSwKKwkJCQkgICAgICAidGltZXIiLCBpbmRleCk7CisgIHJldHVybiByZWc7Cit9CisKK3N0YXRpYyB2b2lkCitkb190aW1lcl9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3Rlcl93cml0ZShkZXZpY2UgKm1lLAorCQkJCQkgIGh3X29waWNfZGV2aWNlICpvcGljLAorCQkJCQkgIGludCBpbmRleCwKKwkJCQkJICB1bnNpZ25lZCByZWcpCit7CisgIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwgb3BpYy0+bnJfdGltZXJfaW50ZXJydXB0cyk7CisgIHJlZyAmPSB+aXN1X2xldmVsX3RyaWdnZXJlZF9iaXQ7IC8qIGZvcmNlIGVkZ2UgdHJpZ2dlciAqLworICByZWcgfD0gaXN1X3Bvc2l0aXZlX3BvbGFyaXR5X2JpdDsgLyogZm9yY2UgcmlzaW5nIChwb3NpdGl2ZSkgZWRnZSAqLworICByZWcgfD0gaXN1X211bHRpY2FzdF9iaXQ7IC8qIGZvcmNlIG11bHRpY2FzdCAqLworICB3cml0ZV92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXIobWUsIG9waWMsCisJCQkJICZvcGljLT50aW1lcl9pbnRlcnJ1cHRfc291cmNlW2luZGV4XSwKKwkJCQkgcmVnLCAidGltZXIiLCBpbmRleCk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkCitkb190aW1lcl9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyX3JlYWQoZGV2aWNlICptZSwKKwkJCQkgICAgIGh3X29waWNfZGV2aWNlICpvcGljLAorCQkJCSAgICAgaW50IGluZGV4KQoreworICB1bnNpZ25lZCByZWc7CisgIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwgb3BpYy0+bnJfdGltZXJfaW50ZXJydXB0cyk7CisgIHJlZyA9IHJlYWRfZGVzdGluYXRpb25fcmVnaXN0ZXIobWUsIG9waWMsICZvcGljLT50aW1lcl9pbnRlcnJ1cHRfc291cmNlW2luZGV4XSwKKwkJCQkgICJ0aW1lciIsIGluZGV4KTsKKyAgcmV0dXJuIHJlZzsKK30KKworc3RhdGljIHZvaWQKK2RvX3RpbWVyX05fZGVzdGluYXRpb25fcmVnaXN0ZXJfd3JpdGUoZGV2aWNlICptZSwKKwkJCQkgICAgICBod19vcGljX2RldmljZSAqb3BpYywKKwkJCQkgICAgICBpbnQgaW5kZXgsCisJCQkJICAgICAgdW5zaWduZWQgcmVnKQoreworICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG9waWMtPm5yX3RpbWVyX2ludGVycnVwdHMpOworICB3cml0ZV9kZXN0aW5hdGlvbl9yZWdpc3RlcihtZSwgb3BpYywgJm9waWMtPnRpbWVyX2ludGVycnVwdF9zb3VyY2VbaW5kZXhdLAorCQkJICAgICByZWcsICJ0aW1lciIsIGluZGV4KTsKK30KKworCisvKiBJUEkgcmVnaXN0ZXJzICovCisKK3N0YXRpYyB1bnNpZ25lZAorZG9faXBpX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyX3JlYWQoZGV2aWNlICptZSwKKwkJCQkgICAgICAgaHdfb3BpY19kZXZpY2UgKm9waWMsCisJCQkJICAgICAgIGludCBpbmRleCkKK3sKKyAgdW5zaWduZWQgcmVnOworICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG9waWMtPm5yX2ludGVycHJvY2Vzc29yX2ludGVycnVwdHMpOworICByZWcgPSByZWFkX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3RlcihtZSwgb3BpYywKKwkJCQkgICAgICAmb3BpYy0+aW50ZXJwcm9jZXNzb3JfaW50ZXJydXB0X3NvdXJjZVtpbmRleF0sCisJCQkJICAgICAgImlwaSIsIGluZGV4KTsKKyAgcmV0dXJuIHJlZzsKK30KKworc3RhdGljIHZvaWQKK2RvX2lwaV9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3Rlcl93cml0ZShkZXZpY2UgKm1lLAorCQkJCQlod19vcGljX2RldmljZSAqb3BpYywKKwkJCQkJaW50IGluZGV4LAorCQkJCQl1bnNpZ25lZCByZWcpCit7CisgIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwgb3BpYy0+bnJfaW50ZXJwcm9jZXNzb3JfaW50ZXJydXB0cyk7CisgIHJlZyAmPSB+aXN1X2xldmVsX3RyaWdnZXJlZF9iaXQ7IC8qIGZvcmNlIGVkZ2UgdHJpZ2dlciAqLworICByZWcgfD0gaXN1X3Bvc2l0aXZlX3BvbGFyaXR5X2JpdDsgLyogZm9yY2UgcmlzaW5nIChwb3NpdGl2ZSkgZWRnZSAqLworICByZWcgfD0gaXN1X211bHRpY2FzdF9iaXQ7IC8qIGZvcmNlIGEgbXVsdGljYXN0IHNvdXJjZSAqLworICB3cml0ZV92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXIobWUsIG9waWMsCisJCQkJICZvcGljLT5pbnRlcnByb2Nlc3Nvcl9pbnRlcnJ1cHRfc291cmNlW2luZGV4XSwKKwkJCQkgcmVnLCAiaXBpIiwgaW5kZXgpOworfQorCitzdGF0aWMgdm9pZAorZG9faXBpX05fZGlzcGF0Y2hfcmVnaXN0ZXJfd3JpdGUoZGV2aWNlICptZSwKKwkJCQkgaHdfb3BpY19kZXZpY2UgKm9waWMsCisJCQkJIGludCBpbmRleCwKKwkJCQkgdW5zaWduZWQgcmVnKQoreworICBvcGljX2ludGVycnVwdF9zb3VyY2UgKnNvdXJjZSA9ICZvcGljLT5pbnRlcnByb2Nlc3Nvcl9pbnRlcnJ1cHRfc291cmNlW2luZGV4XTsKKyAgQVNTRVJUKGluZGV4ID49IDAgJiYgaW5kZXggPCBvcGljLT5ucl9pbnRlcnByb2Nlc3Nvcl9pbnRlcnJ1cHRzKTsKKyAgRFRSQUNFKG9waWMsICgiaXBpICVkIGludGVycnVwdCBkaXNwYXRjaCByZWdpc3RlciAtIHdyaXRlIDB4JXhcbiIsIGluZGV4LCByZWcpKTsKKyAgc291cmNlLT5kZXN0aW5hdGlvbiA9IHJlZzsKKyAgaGFuZGxlX2ludGVycnVwdChtZSwgb3BpYywgc291cmNlLCAxKTsKK30KKworCisvKiB2ZW5kb3IgYW5kIG90aGVyIGdsb2JhbCByZWdpc3RlcnMgKi8KKworc3RhdGljIHVuc2lnbmVkCitkb192ZW5kb3JfaWRlbnRpZmljYXRpb25fcmVnaXN0ZXJfcmVhZChkZXZpY2UgKm1lLAorCQkJCSAgICAgICBod19vcGljX2RldmljZSAqb3BpYykKK3sKKyAgdW5zaWduZWQgcmVnOworICByZWcgPSBvcGljLT52ZW5kb3JfaWRlbnRpZmljYXRpb247CisgIERUUkFDRShvcGljLCAoInZlbmRvciBpZGVudGlmaWNhdGlvbiByZWdpc3RlciAtIHJlYWQgMHgleFxuIiwgcmVnKSk7CisgIHJldHVybiByZWc7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorZG9fZmVhdHVyZV9yZXBvcnRpbmdfcmVnaXN0ZXJfTl9yZWFkKGRldmljZSAqbWUsCisJCQkJICAgICBod19vcGljX2RldmljZSAqb3BpYywKKwkJCQkgICAgIGludCBpbmRleCkKK3sKKyAgdW5zaWduZWQgcmVnID0gMDsKKyAgQVNTRVJUKGluZGV4ID09IDApOworICBzd2l0Y2ggKGluZGV4KSB7CisgIGNhc2UgMDoKKyAgICByZWcgfD0gKG9waWMtPm5yX2V4dGVybmFsX2ludGVycnVwdHMgPDwgMTYpOworICAgIHJlZyB8PSAob3BpYy0+bnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9ucyA8PCA4KTsKKyAgICByZWcgfD0gKDIvKnZlcnNpb24gMS4yKi8pOworICAgIGJyZWFrOworICB9CisgIERUUkFDRShvcGljLCAoImZlYXR1cmUgcmVwb3J0aW5nIHJlZ2lzdGVyICVkIC0gcmVhZCAweCV4XG4iLCBpbmRleCwgcmVnKSk7CisgIHJldHVybiByZWc7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorZG9fZ2xvYmFsX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXJfTl9yZWFkKGRldmljZSAqbWUsCisJCQkJCWh3X29waWNfZGV2aWNlICpvcGljLAorCQkJCQlpbnQgaW5kZXgpCit7CisgIHVuc2lnbmVkIHJlZyA9IDA7CisgIEFTU0VSVChpbmRleCA9PSAwKTsKKyAgc3dpdGNoIChpbmRleCkgeworICBjYXNlIDA6CisgICAgcmVnIHw9IGdjcjBfODI1OV9iaXQ7IC8qIGhhcmR3aXJlIDgyNTkgZGlzYWJsZWQgKi8KKyAgICBicmVhazsKKyAgfQorICBEVFJBQ0Uob3BpYywgKCJnbG9iYWwgY29uZmlndXJhdGlvbiByZWdpc3RlciAlZCAtIHJlYWQgMHgleFxuIiwgaW5kZXgsIHJlZykpOworICByZXR1cm4gcmVnOworfQorCitzdGF0aWMgdm9pZAorZG9fZ2xvYmFsX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXJfTl93cml0ZShkZXZpY2UgKm1lLAorCQkJCQkgaHdfb3BpY19kZXZpY2UgKm9waWMsCisJCQkJCSBpbnQgaW5kZXgsCisJCQkJCSB1bnNpZ25lZCByZWcpCit7CisgIEFTU0VSVChpbmRleCA9PSAwKTsKKyAgaWYgKHJlZyAmIGdjcjBfcmVzZXRfYml0KSB7CisgICAgRFRSQUNFKG9waWMsICgiZ2xvYmFsIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgJWQgLSB3cml0ZSAweCV4IC0gcmVzZXRpbmcgb3BpY1xuIiwgaW5kZXgsIHJlZykpOworICAgIGh3X29waWNfaW5pdF9kYXRhKG1lKTsKKyAgfQorICBpZiAoIShyZWcgJiBnY3IwXzgyNTlfYml0KSkgeworICAgIERUUkFDRShvcGljLCAoImdsb2JhbCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICVkIC0gd3JpdGUgMHgleCAtIGlnbm9yaW5nIDgyNTkgZW5hYmxlXG4iLCBpbmRleCwgcmVnKSk7CisgIH0KK30KKworCisKKy8qIHJlZ2lzdGVyIHJlYWQtd3JpdGUgKi8KKworc3RhdGljIHVuc2lnbmVkCitod19vcGljX2lvX3JlYWRfYnVmZmVyKGRldmljZSAqbWUsCisJCSAgICAgICB2b2lkICpkZXN0LAorCQkgICAgICAgaW50IHNwYWNlLAorCQkgICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAorCQkgICAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCisJCSAgICAgICBjcHUgKnByb2Nlc3NvciwKKwkJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBod19vcGljX2RldmljZSAqb3BpYyA9IChod19vcGljX2RldmljZSopZGV2aWNlX2RhdGEobWUpOworICBvcGljX3JlZ2lzdGVyIHR5cGU7CisgIGludCBpbmRleDsKKyAgZGVjb2RlX29waWNfYWRkcmVzcyhtZSwgb3BpYywgc3BhY2UsIGFkZHIsIG5yX2J5dGVzLCAmdHlwZSwgJmluZGV4KTsKKyAgaWYgKHR5cGUgPT0gaW52YWxpZF9vcGljX3JlZ2lzdGVyKSB7CisgICAgZGV2aWNlX2Vycm9yKG1lLCAiaW52YWxpZCBvcGljIHJlYWQgYWNjZXNzIHRvICVkOjB4JWx4ICglZCBieXRlcykiLAorCQkgc3BhY2UsICh1bnNpZ25lZCBsb25nKWFkZHIsIG5yX2J5dGVzKTsKKyAgfQorICBlbHNlIHsKKyAgICB1bnNpZ25lZCByZWc7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBwcm9jZXNzb3JfaW5pdF9yZWdpc3RlcjoKKyAgICAgIHJlZyA9IGRvX3Byb2Nlc3Nvcl9pbml0X3JlZ2lzdGVyX3JlYWQobWUsIG9waWMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBpbnRlcnJ1cHRfc291cmNlX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyOgorICAgICAgcmVnID0gZG9faW50ZXJydXB0X3NvdXJjZV9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3Rlcl9yZWFkKG1lLCBvcGljLCBpbmRleCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGludGVycnVwdF9zb3VyY2VfTl9kZXN0aW5hdGlvbl9yZWdpc3RlcjoKKyAgICAgIHJlZyA9IGRvX2ludGVycnVwdF9zb3VyY2VfTl9kZXN0aW5hdGlvbl9yZWdpc3Rlcl9yZWFkKG1lLCBvcGljLCBpbmRleCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGludGVycnVwdF9hY2tub3dsZWRnZV9yZWdpc3Rlcl9OOgorICAgICAgcmVnID0gZG9faW50ZXJydXB0X2Fja25vd2xlZGdlX3JlZ2lzdGVyX05fcmVhZChtZSwgb3BpYywgaW5kZXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzcHVyaW91c192ZWN0b3JfcmVnaXN0ZXI6CisgICAgICByZWcgPSBkb19zcHVyaW91c192ZWN0b3JfcmVnaXN0ZXJfcmVhZChtZSwgb3BpYyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGN1cnJlbnRfdGFza19wcmlvcml0eV9yZWdpc3Rlcl9OOgorICAgICAgcmVnID0gZG9fY3VycmVudF90YXNrX3ByaW9yaXR5X3JlZ2lzdGVyX05fcmVhZChtZSwgb3BpYywgaW5kZXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0aW1lcl9mcmVxdWVuY3lfcmVwb3J0aW5nX3JlZ2lzdGVyOgorICAgICAgcmVnID0gZG9fdGltZXJfZnJlcXVlbmN5X3JlcG9ydGluZ19yZWdpc3Rlcl9yZWFkKG1lLCBvcGljKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdGltZXJfTl9jdXJyZW50X2NvdW50X3JlZ2lzdGVyOgorICAgICAgcmVnID0gZG9fdGltZXJfTl9jdXJyZW50X2NvdW50X3JlZ2lzdGVyX3JlYWQobWUsIG9waWMsIGluZGV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdGltZXJfTl9iYXNlX2NvdW50X3JlZ2lzdGVyOgorICAgICAgcmVnID0gZG9fdGltZXJfTl9iYXNlX2NvdW50X3JlZ2lzdGVyX3JlYWQobWUsIG9waWMsIGluZGV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdGltZXJfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXI6CisgICAgICByZWcgPSBkb190aW1lcl9OX3ZlY3Rvcl9wcmlvcml0eV9yZWdpc3Rlcl9yZWFkKG1lLCBvcGljLCBpbmRleCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRpbWVyX05fZGVzdGluYXRpb25fcmVnaXN0ZXI6CisgICAgICByZWcgPSBkb190aW1lcl9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyX3JlYWQobWUsIG9waWMsIGluZGV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgaXBpX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyOgorICAgICAgcmVnID0gZG9faXBpX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyX3JlYWQobWUsIG9waWMsIGluZGV4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgZmVhdHVyZV9yZXBvcnRpbmdfcmVnaXN0ZXJfTjoKKyAgICAgIHJlZyA9IGRvX2ZlYXR1cmVfcmVwb3J0aW5nX3JlZ2lzdGVyX05fcmVhZChtZSwgb3BpYywgaW5kZXgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBnbG9iYWxfY29uZmlndXJhdGlvbl9yZWdpc3Rlcl9OOgorICAgICAgcmVnID0gZG9fZ2xvYmFsX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXJfTl9yZWFkKG1lLCBvcGljLCBpbmRleCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHZlbmRvcl9pZGVudGlmaWNhdGlvbl9yZWdpc3RlcjoKKyAgICAgIHJlZyA9IGRvX3ZlbmRvcl9pZGVudGlmaWNhdGlvbl9yZWdpc3Rlcl9yZWFkKG1lLCBvcGljKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZWcgPSAwOworICAgICAgZGV2aWNlX2Vycm9yKG1lLCAidW5pbXBsZW1lbnRlZCByZWFkIG9mIHJlZ2lzdGVyICVzWyVkXSIsCisJCSAgIG9waWNfcmVnaXN0ZXJfbmFtZSh0eXBlKSwgaW5kZXgpOworICAgIH0KKyAgICAqKHVuc2lnbmVkXzQqKWRlc3QgPSBIMkxFXzQocmVnKTsKKyAgfQorICByZXR1cm4gbnJfYnl0ZXM7Cit9CisKKworc3RhdGljIHVuc2lnbmVkCitod19vcGljX2lvX3dyaXRlX2J1ZmZlcihkZXZpY2UgKm1lLAorCQkJY29uc3Qgdm9pZCAqc291cmNlLAorCQkJaW50IHNwYWNlLAorCQkJdW5zaWduZWRfd29yZCBhZGRyLAorCQkJdW5zaWduZWQgbnJfYnl0ZXMsCisJCQljcHUgKnByb2Nlc3NvciwKKwkJCXVuc2lnbmVkX3dvcmQgY2lhKQoreworICBod19vcGljX2RldmljZSAqb3BpYyA9IChod19vcGljX2RldmljZSopZGV2aWNlX2RhdGEobWUpOworICBvcGljX3JlZ2lzdGVyIHR5cGU7CisgIGludCBpbmRleDsKKyAgZGVjb2RlX29waWNfYWRkcmVzcyhtZSwgb3BpYywgc3BhY2UsIGFkZHIsIG5yX2J5dGVzLCAmdHlwZSwgJmluZGV4KTsKKyAgaWYgKHR5cGUgPT0gaW52YWxpZF9vcGljX3JlZ2lzdGVyKSB7CisgICAgZGV2aWNlX2Vycm9yKG1lLCAiaW52YWxpZCBvcGljIHdyaXRlIGFjY2VzcyB0byAlZDoweCVseCAoJWQgYnl0ZXMpIiwKKwkJIHNwYWNlLCAodW5zaWduZWQgbG9uZylhZGRyLCBucl9ieXRlcyk7CisgIH0KKyAgZWxzZSB7CisgICAgdW5zaWduZWQgcmVnID0gTEUySF80KCoodW5zaWduZWRfNCopc291cmNlKTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIHByb2Nlc3Nvcl9pbml0X3JlZ2lzdGVyOgorICAgICAgZG9fcHJvY2Vzc29yX2luaXRfcmVnaXN0ZXJfd3JpdGUobWUsIG9waWMsIHJlZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGludGVycnVwdF9zb3VyY2VfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXI6CisgICAgICBkb19pbnRlcnJ1cHRfc291cmNlX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyX3dyaXRlKG1lLCBvcGljLCBpbmRleCwgcmVnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgaW50ZXJydXB0X3NvdXJjZV9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyOgorICAgICAgZG9faW50ZXJydXB0X3NvdXJjZV9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyX3dyaXRlKG1lLCBvcGljLCBpbmRleCwgcmVnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgZW5kX29mX2ludGVycnVwdF9yZWdpc3Rlcl9OOgorICAgICAgZG9fZW5kX29mX2ludGVycnVwdF9yZWdpc3Rlcl9OX3dyaXRlKG1lLCBvcGljLCBpbmRleCwgcmVnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugc3B1cmlvdXNfdmVjdG9yX3JlZ2lzdGVyOgorICAgICAgZG9fc3B1cmlvdXNfdmVjdG9yX3JlZ2lzdGVyX3dyaXRlKG1lLCBvcGljLCByZWcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjdXJyZW50X3Rhc2tfcHJpb3JpdHlfcmVnaXN0ZXJfTjoKKyAgICAgIGRvX2N1cnJlbnRfdGFza19wcmlvcml0eV9yZWdpc3Rlcl9OX3dyaXRlKG1lLCBvcGljLCBpbmRleCwgcmVnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdGltZXJfZnJlcXVlbmN5X3JlcG9ydGluZ19yZWdpc3RlcjoKKyAgICAgIGRvX3RpbWVyX2ZyZXF1ZW5jeV9yZXBvcnRpbmdfcmVnaXN0ZXJfd3JpdGUobWUsIG9waWMsIHJlZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRpbWVyX05fYmFzZV9jb3VudF9yZWdpc3RlcjoKKyAgICAgIGRvX3RpbWVyX05fYmFzZV9jb3VudF9yZWdpc3Rlcl93cml0ZShtZSwgb3BpYywgaW5kZXgsIHJlZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRpbWVyX05fdmVjdG9yX3ByaW9yaXR5X3JlZ2lzdGVyOgorICAgICAgZG9fdGltZXJfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXJfd3JpdGUobWUsIG9waWMsIGluZGV4LCByZWcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0aW1lcl9OX2Rlc3RpbmF0aW9uX3JlZ2lzdGVyOgorICAgICAgZG9fdGltZXJfTl9kZXN0aW5hdGlvbl9yZWdpc3Rlcl93cml0ZShtZSwgb3BpYywgaW5kZXgsIHJlZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGlwaV9OX2Rpc3BhdGNoX3JlZ2lzdGVyOgorICAgICAgZG9faXBpX05fZGlzcGF0Y2hfcmVnaXN0ZXJfd3JpdGUobWUsIG9waWMsIGluZGV4LCByZWcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBpcGlfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXI6CisgICAgICBkb19pcGlfTl92ZWN0b3JfcHJpb3JpdHlfcmVnaXN0ZXJfd3JpdGUobWUsIG9waWMsIGluZGV4LCByZWcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBnbG9iYWxfY29uZmlndXJhdGlvbl9yZWdpc3Rlcl9OOgorICAgICAgZG9fZ2xvYmFsX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXJfTl93cml0ZShtZSwgb3BpYywgaW5kZXgsIHJlZyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZGV2aWNlX2Vycm9yKG1lLCAidW5pbXBsZW1lbnRlZCB3cml0ZSB0byByZWdpc3RlciAlc1slZF0iLAorCQkgICBvcGljX3JlZ2lzdGVyX25hbWUodHlwZSksIGluZGV4KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG5yX2J5dGVzOworfQorICAKKyAgCitzdGF0aWMgdm9pZAoraHdfb3BpY19pbnRlcnJ1cHRfZXZlbnQoZGV2aWNlICptZSwKKwkJCWludCBteV9wb3J0LAorCQkJZGV2aWNlICpzb3VyY2UsCisJCQlpbnQgc291cmNlX3BvcnQsCisJCQlpbnQgbGV2ZWwsCisJCQljcHUgKnByb2Nlc3NvciwKKwkJCXVuc2lnbmVkX3dvcmQgY2lhKQoreworICBod19vcGljX2RldmljZSAqb3BpYyA9IChod19vcGljX2RldmljZSopZGV2aWNlX2RhdGEobWUpOworCisgIGludCBpc2I7CisgIGludCBzcmNfbnIgPSAwOworCisgIC8qIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJuYWwgaW5wdXQgcG9ydCAqLworICBmb3IgKGlzYiA9IDA7IGlzYiA8IG9waWMtPm5yX2lzdV9ibG9ja3M7IGlzYisrKSB7CisgICAgaWYgKG15X3BvcnQgPj0gb3BpYy0+aXN1X2Jsb2NrW2lzYl0uaW50X251bWJlcgorCSYmIG15X3BvcnQgPCBvcGljLT5pc3VfYmxvY2tbaXNiXS5pbnRfbnVtYmVyICsgb3BpYy0+aXN1X2Jsb2NrW2lzYl0ucmFuZ2UpIHsKKyAgICAgIHNyY19uciArPSBteV9wb3J0IC0gb3BpYy0+aXN1X2Jsb2NrW2lzYl0uaW50X251bWJlcjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBlbHNlCisgICAgICBzcmNfbnIgKz0gb3BpYy0+aXN1X2Jsb2NrW2lzYl0ucmFuZ2U7CisgIH0KKyAgaWYgKGlzYiA9PSBvcGljLT5ucl9pc3VfYmxvY2tzKQorICAgIGRldmljZV9lcnJvcihtZSwgImludGVycnVwdCAlZCBvdXQgb2YgcmFuZ2UiLCBteV9wb3J0KTsKKyAgRFRSQUNFKG9waWMsICgiZXh0ZXJuYWwtaW50ZXJydXB0ICVkLCBpbnRlcm5hbCAlZCwgbGV2ZWwgJWRcbiIsCisJCW15X3BvcnQsIHNyY19uciwgbGV2ZWwpKTsKKworICAvKiBwYXNzIGl0IG9uICovCisgIEFTU0VSVChzcmNfbnIgPj0gMCAmJiBzcmNfbnIgPCBvcGljLT5ucl9leHRlcm5hbF9pbnRlcnJ1cHRzKTsKKyAgaGFuZGxlX2ludGVycnVwdChtZSwgb3BpYywgJm9waWMtPmV4dGVybmFsX2ludGVycnVwdF9zb3VyY2Vbc3JjX25yXSwgbGV2ZWwpOworfQorCisKK3N0YXRpYyBjb25zdCBkZXZpY2VfaW50ZXJydXB0X3BvcnRfZGVzY3JpcHRvciBod19vcGljX2ludGVycnVwdF9wb3J0c1tdID0geworICB7ICJpcnEiLCAwLCBtYXhfbnJfaW50ZXJydXB0X3NvdXJjZXMsIGlucHV0X3BvcnQsIH0sCisgIHsgImludHIiLCAwLCBtYXhfbnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9ucywgb3V0cHV0X3BvcnQsIH0sCisgIHsgImluaXQiLCBtYXhfbnJfaW50ZXJydXB0X2Rlc3RpbmF0aW9ucywgbWF4X25yX2ludGVycnVwdF9kZXN0aW5hdGlvbnMsIG91dHB1dF9wb3J0LCB9LAorICB7IE5VTEwgfQorfTsKKworCitzdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod19vcGljX2NhbGxiYWNrcyA9IHsKKyAgeyBnZW5lcmljX2RldmljZV9pbml0X2FkZHJlc3MsCisgICAgaHdfb3BpY19pbml0X2RhdGEgfSwKKyAgeyBOVUxMLCB9LCAvKiBhZGRyZXNzICovCisgIHsgaHdfb3BpY19pb19yZWFkX2J1ZmZlciwKKyAgICBod19vcGljX2lvX3dyaXRlX2J1ZmZlciB9LCAvKiBJTyAqLworICB7IE5VTEwsIH0sIC8qIERNQSAqLworICB7IGh3X29waWNfaW50ZXJydXB0X2V2ZW50LCBOVUxMLCBod19vcGljX2ludGVycnVwdF9wb3J0cyB9LCAvKiBpbnRlcnJ1cHQgKi8KKyAgeyBOVUxMLCB9LCAvKiB1bml0ICovCisgIE5VTEwsIC8qIGluc3RhbmNlICovCit9OworCitzdGF0aWMgdm9pZCAqCitod19vcGljX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLAorCSAgICAgICBjb25zdCBkZXZpY2VfdW5pdCAqdW5pdF9hZGRyZXNzLAorCSAgICAgICBjb25zdCBjaGFyICphcmdzKQoreworICBod19vcGljX2RldmljZSAqb3BpYyA9IFpBTExPQyhod19vcGljX2RldmljZSk7CisgIHJldHVybiBvcGljOworfQorCisKKworY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgaHdfb3BpY19kZXZpY2VfZGVzY3JpcHRvcltdID0geworICB7ICJvcGljIiwgaHdfb3BpY19jcmVhdGUsICZod19vcGljX2NhbGxiYWNrcyB9LAorICB7IE5VTEwgfSwKK307CisKKyNlbmRpZiAvKiBfSFdfT1BJQ19DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9od19wYWwuYyBiL3NpbS9wcGMvaHdfcGFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQyNTZiOQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvaHdfcGFsLmMKQEAgLTAsMCArMSwzNjYgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorICAgIAorICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorICAgIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgICAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAgICAKKyAgICAqLworCisKKyNpZm5kZWYgX0hXX1BBTF9DXworI2RlZmluZSBfSFdfUEFMX0NfCisKKyNpZm5kZWYgU1RBVElDX0lOTElORV9IV19QQUwKKyNkZWZpbmUgU1RBVElDX0lOTElORV9IV19QQUwgU1RBVElDX0lOTElORQorI2VuZGlmCisKKyNpbmNsdWRlICJkZXZpY2VfdGFibGUuaCIKKworI2luY2x1ZGUgImNwdS5oIgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworCisvKiBERVZJQ0UKKworICAgCisgICBwYWwgLSBnbHVlIGxvZ2ljIGRldmljZSBjb250YWluaW5nIGFzc29ydGVkIGp1bmsKKworICAgCisgICBERVNDUklQVElPTgorCisgICAKKyAgIFR5cGljYWwgaGFyZHdhcmUgZGVwZW5kYW50IGhhY2suICBUaGlzIGRldmljZSBhbGxvd3MgdGhlIGZpcm13YXJlCisgICB0byBnYWluIGFjY2VzcyB0byBhbGwgdGhlIHRoaW5ncyB0aGUgZmlybXdhcmUgbmVlZHMgKGJ1dCB0aGUgT1MKKyAgIGRvZXNuJ3QpLgorCisgICBUaGUgcGFsIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzLiAgRXhjZXB0IGZvciB0aGUgaW50ZXJydXB0CisgICBsZXZlbCByZWdpc3RlciwgZWFjaCBvZiB0aGUgYmVsb3cgaXMgOCBieXRlcyBpbiBzaXplIGFuZCBtdXN0IGJlCisgICBhY2Nlc3NlZCB1c2luZyBjb3JyZWN0IGFsaWdubWVudC4gIEZvciAxNiBhbmQgMzIgYml0IGFjY2Vzc2VzIHRoZQorICAgYnl0ZXMgbm90IGRpcmVjdGVkIHRvIHRoZSByZWdpc3RlciBhcmUgaWdub3JlZDoKKyAgIAorICAgfDAJcmVzZXQgcmVnaXN0ZXIgKHdyaXRlKQorICAgfDQJcHJvY2Vzc29yIGlkIHJlZ2lzdGVyIChyZWFkKQorICAgfDgJaW50ZXJydXB0IHBvcnQgKHdyaXRlKQorICAgfDkJaW50ZXJydXB0IGxldmVsICh3cml0ZSkKKyAgIHwxMglwcm9jZXNzb3IgY291bnQgcmVnaXN0ZXIgKHJlYWQpCisgICB8MTYJdHR5IGlucHV0IGZpZm8gcmVnaXN0ZXIgKHJlYWQpCisgICB8MjAJdHR5IGlucHV0IHN0YXR1cyByZWdpc3RlciAocmVhZCkKKyAgIHwyNAl0dHkgb3V0cHV0IGZpZm8gcmVnaXN0ZXIgKHdyaXRlKQorICAgfDI4CXR0eSBvdXRwdXQgc3RhdHVzIHJlZ2lzdGVyIChyZWFkKQorCisgICBSZXNldCByZWdpc3RlciAod3JpdGUpIGhhbHRzIHRoZSBzaW11bGF0b3IgZXhpdGluZyB3aXRoIHRoZQorICAgdmFsdWUgd3JpdHRlbi4KKyAgIAorICAgUHJvY2Vzc29yIGlkIHJlZ2lzdGVyIChyZWFkKSByZXR1cm5zIHRoZSBwcm9jZXNzb3IgbnVtYmVyICgwCisgICAuLiBOLTEpIG9mIHRoZSBwcm9jZXNzb3IgcGVyZm9ybWluZyB0aGUgcmVhZC4KKyAgIAorICAgVGhlIGludGVycnVwdCByZWdpc3RlcnMgc2hvdWxkIGJlIGFjY2Vzc2VkIGFzIGEgcGFpciAodXNpbmcgYSAxNiBvcgorICAgMzIgYml0IHN0b3JlKS4gIFRoZSBsb3cgYnl0ZSBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwb3J0IHdoaWxlIHRoZQorICAgaGlnaCBieXRlIHNwZWNpZmllcyB0aGUgbGV2ZWwgdG8gZHJpdmUgdGhhdCBwb3J0IGF0LiAgQnkKKyAgIGNvbnZlbnRpb24sIHRoZSBwYWwncyBpbnRlcnJ1cHQgcG9ydHMgKGludDAsIGludDEsIC4uLikgYXJlIHdpcmVkCisgICB1cCB0byB0aGUgY29ycmVzcG9uZGluZyBwcm9jZXNzb3IncyBsZXZlbCBzZW5zYXRpdmUgZXh0ZXJuYWwKKyAgIGludGVycnVwdCBwaW4uICBFZzogQSB0d28gYnl0ZSB3cml0ZSB0byBhZGRyZXNzIDggb2YgMHgwMTAyCisgICAoYmlnLWVuZGlhbikgd2lsbCByZXN1bHQgaW4gcHJvY2Vzc29yIDIncyBleHRlcm5hbCBpbnRlcnJ1cHQgcGluIHRvCisgICBiZSBhc3NlcnRlZC4KKworICAgUHJvY2Vzc29yIGNvdW50IHJlZ2lzdGVyIChyZWFkKSByZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YKKyAgIHByb2Nlc3NvcnMgYWN0aXZlIGluIHRoZSBjdXJyZW50IHNpbXVsYXRpb24uCisKKyAgIFRUWSBpbnB1dCBmaWZvIHJlZ2lzdGVyIChyZWFkKSwgaWYgdGhlIFRUWSBpbnB1dCBzdGF0dXMgcmVnaXN0ZXIKKyAgIGluZGljYXRlcyBhIGNoYXJhY3RlciBpcyBhdmFpbGFibGUgYnkgYmVpbmcgbm9uemVybywgcmV0dXJucyB0aGUKKyAgIG5leHQgYXZhaWxhYmxlIGNoYXJhY3RlciBmcm9tIHRoZSBwYWwncyB0dHkgaW5wdXQgcG9ydC4KKworICAgU2ltaWxhcmx5LCB0aGUgVFRZIG91dHB1dCBmaWZvIHJlZ2lzdGVyICh3cml0ZSksIGlmIHRoZSBUVFkgb3V0cHV0CisgICBzdGF0dXMgcmVnaXN0ZXIgaW5kaWNhdGVzIHRoZSBvdXRwdXQgZmlmbyBpcyBub3QgZnVsbCBieSBiZWluZworICAgbm9uemVybywgb3V0cHV0cyB0aGUgY2hhcmFjdGVyIHdyaXR0ZW4gdG8gdGhlIHR0eSdzIG91dHB1dCBwb3J0LgorCisKKyAgIFBST1BFUlRJRVMKKyAgIAorCisgICByZWcgPSA8YWRkcmVzcz4gPHNpemU+IChyZXF1aXJlZCkKKworICAgU3BlY2lmeSB0aGUgYWRkcmVzcyAod2l0aGluIHRoZSBwYXJlbnQgYnVzKSB0aGF0IHRoaXMgZGV2aWNlIGlzIHRvCisgICBsaXZlLgorCisKKyAgICovCisKKworZW51bSB7CisgIGh3X3BhbF9yZXNldF9yZWdpc3RlciA9IDB4MCwKKyAgaHdfcGFsX2NwdV9ucl9yZWdpc3RlciA9IDB4NCwKKyAgaHdfcGFsX2ludF9yZWdpc3RlciA9IDB4OCwKKyAgaHdfcGFsX25yX2NwdV9yZWdpc3RlciA9IDB4YSwKKyAgaHdfcGFsX3JlYWRfZmlmbyA9IDB4MTAsCisgIGh3X3BhbF9yZWFkX3N0YXR1cyA9IDB4MTQsCisgIGh3X3BhbF93cml0ZV9maWZvID0gMHgxOCwKKyAgaHdfcGFsX3dyaXRlX3N0YXR1cyA9IDB4MWEsCisgIGh3X3BhbF9hZGRyZXNzX21hc2sgPSAweDFmLAorfTsKKworCit0eXBlZGVmIHN0cnVjdCBfaHdfcGFsX2NvbnNvbGVfYnVmZmVyIHsKKyAgY2hhciBidWZmZXI7CisgIGludCBzdGF0dXM7Cit9IGh3X3BhbF9jb25zb2xlX2J1ZmZlcjsKKwordHlwZWRlZiBzdHJ1Y3QgX2h3X3BhbF9kZXZpY2UgeworICBod19wYWxfY29uc29sZV9idWZmZXIgaW5wdXQ7CisgIGh3X3BhbF9jb25zb2xlX2J1ZmZlciBvdXRwdXQ7CisgIGRldmljZSAqZGlzazsKK30gaHdfcGFsX2RldmljZTsKKworCisvKiBjaGVjayB0aGUgY29uc29sZSBmb3IgYW4gYXZhaWxhYmxlIGNoYXJhY3RlciAqLworc3RhdGljIHZvaWQKK3NjYW5faHdfcGFsKGh3X3BhbF9kZXZpY2UgKmh3X3BhbCkKK3sKKyAgY2hhciBjOworICBpbnQgY291bnQ7CisgIGNvdW50ID0gc2ltX2lvX3JlYWRfc3RkaW4oJmMsIHNpemVvZihjKSk7CisgIHN3aXRjaCAoY291bnQpIHsKKyAgY2FzZSBzaW1faW9fbm90X3JlYWR5OgorICBjYXNlIHNpbV9pb19lb2Y6CisgICAgaHdfcGFsLT5pbnB1dC5idWZmZXIgPSAwOworICAgIGh3X3BhbC0+aW5wdXQuc3RhdHVzID0gMDsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBod19wYWwtPmlucHV0LmJ1ZmZlciA9IGM7CisgICAgaHdfcGFsLT5pbnB1dC5zdGF0dXMgPSAxOworICB9Cit9CisKKy8qIHdyaXRlIHRoZSBjaGFyYWN0ZXIgdG8gdGhlIGh3X3BhbCAqLworc3RhdGljIHZvaWQKK3dyaXRlX2h3X3BhbChod19wYWxfZGV2aWNlICpod19wYWwsCisJICAgICBjaGFyIHZhbCkKK3sKKyAgc2ltX2lvX3dyaXRlX3N0ZG91dCgmdmFsLCAxKTsKKyAgaHdfcGFsLT5vdXRwdXQuYnVmZmVyID0gdmFsOworICBod19wYWwtPm91dHB1dC5zdGF0dXMgPSAxOworfQorCisKK3N0YXRpYyB1bnNpZ25lZAoraHdfcGFsX2lvX3JlYWRfYnVmZmVyX2NhbGxiYWNrKGRldmljZSAqbWUsCisJCQkgICAgICAgdm9pZCAqZGVzdCwKKwkJCSAgICAgICBpbnQgc3BhY2UsCisJCQkgICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAorCQkJICAgICAgIHVuc2lnbmVkIG5yX2J5dGVzLAorCQkJICAgICAgIGNwdSAqcHJvY2Vzc29yLAorCQkJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBod19wYWxfZGV2aWNlICpod19wYWwgPSAoaHdfcGFsX2RldmljZSopZGV2aWNlX2RhdGEobWUpOworICB1bnNpZ25lZF8xIHZhbDsKKyAgc3dpdGNoIChhZGRyICYgaHdfcGFsX2FkZHJlc3NfbWFzaykgeworICBjYXNlIGh3X3BhbF9jcHVfbnJfcmVnaXN0ZXI6CisgICAgdmFsID0gY3B1X25yKHByb2Nlc3Nvcik7CisgICAgRFRSQUNFKHBhbCwgKCJyZWFkIC0gY3B1LW5yICVkXG4iLCB2YWwpKTsKKyAgICBicmVhazsKKyAgY2FzZSBod19wYWxfbnJfY3B1X3JlZ2lzdGVyOgorICAgIHZhbCA9IHRyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAiL29wZW5wcm9tL29wdGlvbnMvc21wIik7CisgICAgRFRSQUNFKHBhbCwgKCJyZWFkIC0gbnItY3B1ICVkXG4iLCB2YWwpKTsKKyAgICBicmVhazsKKyAgY2FzZSBod19wYWxfcmVhZF9maWZvOgorICAgIHZhbCA9IGh3X3BhbC0+aW5wdXQuYnVmZmVyOworICAgIERUUkFDRShwYWwsICgicmVhZCAtIGlucHV0LWZpZm8gJWRcbiIsIHZhbCkpOworICAgIGJyZWFrOworICBjYXNlIGh3X3BhbF9yZWFkX3N0YXR1czoKKyAgICBzY2FuX2h3X3BhbChod19wYWwpOworICAgIHZhbCA9IGh3X3BhbC0+aW5wdXQuc3RhdHVzOworICAgIERUUkFDRShwYWwsICgicmVhZCAtIGlucHV0LXN0YXR1cyAlZFxuIiwgdmFsKSk7CisgICAgYnJlYWs7CisgIGNhc2UgaHdfcGFsX3dyaXRlX2ZpZm86CisgICAgdmFsID0gaHdfcGFsLT5vdXRwdXQuYnVmZmVyOworICAgIERUUkFDRShwYWwsICgicmVhZCAtIG91dHB1dC1maWZvICVkXG4iLCB2YWwpKTsKKyAgICBicmVhazsKKyAgY2FzZSBod19wYWxfd3JpdGVfc3RhdHVzOgorICAgIHZhbCA9IGh3X3BhbC0+b3V0cHV0LnN0YXR1czsKKyAgICBEVFJBQ0UocGFsLCAoInJlYWQgLSBvdXRwdXQtc3RhdHVzICVkXG4iLCB2YWwpKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICB2YWwgPSAwOworICAgIERUUkFDRShwYWwsICgicmVhZCAtID8/P1xuIikpOworICB9CisgIG1lbXNldChkZXN0LCAwLCBucl9ieXRlcyk7CisgICoodW5zaWduZWRfMSopZGVzdCA9IHZhbDsKKyAgcmV0dXJuIG5yX2J5dGVzOworfQorCisKK3N0YXRpYyB1bnNpZ25lZAoraHdfcGFsX2lvX3dyaXRlX2J1ZmZlcl9jYWxsYmFjayhkZXZpY2UgKm1lLAorCQkJCWNvbnN0IHZvaWQgKnNvdXJjZSwKKwkJCQlpbnQgc3BhY2UsCisJCQkJdW5zaWduZWRfd29yZCBhZGRyLAorCQkJCXVuc2lnbmVkIG5yX2J5dGVzLAorCQkJCWNwdSAqcHJvY2Vzc29yLAorCQkJCXVuc2lnbmVkX3dvcmQgY2lhKQoreworICBod19wYWxfZGV2aWNlICpod19wYWwgPSAoaHdfcGFsX2RldmljZSopZGV2aWNlX2RhdGEobWUpOworICB1bnNpZ25lZF8xICpieXRlID0gKHVuc2lnbmVkXzEqKXNvdXJjZTsKKyAgCisgIHN3aXRjaCAoYWRkciAmIGh3X3BhbF9hZGRyZXNzX21hc2spIHsKKyAgY2FzZSBod19wYWxfcmVzZXRfcmVnaXN0ZXI6CisgICAgY3B1X2hhbHQocHJvY2Vzc29yLCBjaWEsIHdhc19leGl0ZWQsIGJ5dGVbMF0pOworICAgIGJyZWFrOworICBjYXNlIGh3X3BhbF9pbnRfcmVnaXN0ZXI6CisgICAgZGV2aWNlX2ludGVycnVwdF9ldmVudChtZSwKKwkJCSAgIGJ5dGVbMF0sIC8qcG9ydCovCisJCQkgICAobnJfYnl0ZXMgPiAxID8gYnl0ZVsxXSA6IDApLCAvKiB2YWwgKi8KKwkJCSAgIHByb2Nlc3NvciwgY2lhKTsKKyAgICBicmVhazsKKyAgY2FzZSBod19wYWxfcmVhZF9maWZvOgorICAgIGh3X3BhbC0+aW5wdXQuYnVmZmVyID0gYnl0ZVswXTsKKyAgICBEVFJBQ0UocGFsLCAoIndyaXRlIC0gaW5wdXQtZmlmbyAlZFxuIiwgYnl0ZVswXSkpOworICAgIGJyZWFrOworICBjYXNlIGh3X3BhbF9yZWFkX3N0YXR1czoKKyAgICBod19wYWwtPmlucHV0LnN0YXR1cyA9IGJ5dGVbMF07CisgICAgRFRSQUNFKHBhbCwgKCJ3cml0ZSAtIGlucHV0LXN0YXR1cyAlZFxuIiwgYnl0ZVswXSkpOworICAgIGJyZWFrOworICBjYXNlIGh3X3BhbF93cml0ZV9maWZvOgorICAgIHdyaXRlX2h3X3BhbChod19wYWwsIGJ5dGVbMF0pOworICAgIERUUkFDRShwYWwsICgid3JpdGUgLSBvdXRwdXQtZmlmbyAlZFxuIiwgYnl0ZVswXSkpOworICAgIGJyZWFrOworICBjYXNlIGh3X3BhbF93cml0ZV9zdGF0dXM6CisgICAgaHdfcGFsLT5vdXRwdXQuc3RhdHVzID0gYnl0ZVswXTsKKyAgICBEVFJBQ0UocGFsLCAoIndyaXRlIC0gb3V0cHV0LXN0YXR1cyAlZFxuIiwgYnl0ZVswXSkpOworICAgIGJyZWFrOworICB9CisgIHJldHVybiBucl9ieXRlczsKK30KKworCisvKiBpbnN0YW5jZXMgb2YgdGhlIGh3X3BhbCBkZXZpY2UgKi8KKworc3RhdGljIHZvaWQKK2h3X3BhbF9pbnN0YW5jZV9kZWxldGVfY2FsbGJhY2soZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSkKK3sKKyAgLyogbm90aGluZyB0byBkZWxldGUsIHRoZSBod19wYWwgaXMgYXR0YWNoZWQgdG8gdGhlIGRldmljZSAqLworICByZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK2h3X3BhbF9pbnN0YW5jZV9yZWFkX2NhbGxiYWNrKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQkgICAgICB2b2lkICpidWYsCisJCQkgICAgICB1bnNpZ25lZF93b3JkIGxlbikKK3sKKyAgRElUUkFDRShwYWwsICgicmVhZCAtICVzICglbGQpIiwgKGNvbnN0IGNoYXIqKWJ1ZiwgKGxvbmcgaW50KWxlbikpOworICByZXR1cm4gc2ltX2lvX3JlYWRfc3RkaW4oYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW50Citod19wYWxfaW5zdGFuY2Vfd3JpdGVfY2FsbGJhY2soZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKKwkJCSAgICAgICBjb25zdCB2b2lkICpidWYsCisJCQkgICAgICAgdW5zaWduZWRfd29yZCBsZW4pCit7CisgIGludCBpOworICBjb25zdCBjaGFyICpjaHAgPSBidWY7CisgIGh3X3BhbF9kZXZpY2UgKmh3X3BhbCA9IGRldmljZV9pbnN0YW5jZV9kYXRhKGluc3RhbmNlKTsKKyAgRElUUkFDRShwYWwsICgid3JpdGUgLSAlcyAoJWxkKSIsIChjb25zdCBjaGFyKilidWYsIChsb25nIGludClsZW4pKTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHdyaXRlX2h3X3BhbChod19wYWwsIGNocFtpXSk7CisgIHNpbV9pb19mbHVzaF9zdGRvdXRwdXQoKTsKKyAgcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBjb25zdCBkZXZpY2VfaW5zdGFuY2VfY2FsbGJhY2tzIGh3X3BhbF9pbnN0YW5jZV9jYWxsYmFja3MgPSB7CisgIGh3X3BhbF9pbnN0YW5jZV9kZWxldGVfY2FsbGJhY2ssCisgIGh3X3BhbF9pbnN0YW5jZV9yZWFkX2NhbGxiYWNrLAorICBod19wYWxfaW5zdGFuY2Vfd3JpdGVfY2FsbGJhY2ssCit9OworCitzdGF0aWMgZGV2aWNlX2luc3RhbmNlICoKK2h3X3BhbF9jcmVhdGVfaW5zdGFuY2UoZGV2aWNlICptZSwKKwkJICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCisJCSAgICAgICBjb25zdCBjaGFyICphcmdzKQoreworICByZXR1cm4gZGV2aWNlX2NyZWF0ZV9pbnN0YW5jZV9mcm9tKG1lLCBOVUxMLAorCQkJCSAgICAgZGV2aWNlX2RhdGEobWUpLAorCQkJCSAgICAgcGF0aCwgYXJncywKKwkJCQkgICAgICZod19wYWxfaW5zdGFuY2VfY2FsbGJhY2tzKTsKK30KKworc3RhdGljIGNvbnN0IGRldmljZV9pbnRlcnJ1cHRfcG9ydF9kZXNjcmlwdG9yIGh3X3BhbF9pbnRlcnJ1cHRfcG9ydHNbXSA9IHsKKyAgeyAiaW50IiwgMCwgTUFYX05SX1BST0NFU1NPUlMgfSwKKyAgeyBOVUxMIH0KK307CisKKworc3RhdGljIHZvaWQKK2h3X3BhbF9hdHRhY2hfYWRkcmVzcyhkZXZpY2UgKm1lLAorCQkgICAgICBhdHRhY2hfdHlwZSBhdHRhY2gsCisJCSAgICAgIGludCBzcGFjZSwKKwkJICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAorCQkgICAgICB1bnNpZ25lZCBucl9ieXRlcywKKwkJICAgICAgYWNjZXNzX3R5cGUgYWNjZXNzLAorCQkgICAgICBkZXZpY2UgKmNsaWVudCkKK3sKKyAgaHdfcGFsX2RldmljZSAqcGFsID0gKGh3X3BhbF9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKKyAgcGFsLT5kaXNrID0gY2xpZW50OworfQorCisKK3N0YXRpYyBkZXZpY2VfY2FsbGJhY2tzIGNvbnN0IGh3X3BhbF9jYWxsYmFja3MgPSB7CisgIHsgZ2VuZXJpY19kZXZpY2VfaW5pdF9hZGRyZXNzLCB9LAorICB7IGh3X3BhbF9hdHRhY2hfYWRkcmVzcywgfSwgLyogYWRkcmVzcyAqLworICB7IGh3X3BhbF9pb19yZWFkX2J1ZmZlcl9jYWxsYmFjaywKKyAgICAgIGh3X3BhbF9pb193cml0ZV9idWZmZXJfY2FsbGJhY2ssIH0sCisgIHsgTlVMTCwgfSwgLyogRE1BICovCisgIHsgTlVMTCwgTlVMTCwgaHdfcGFsX2ludGVycnVwdF9wb3J0cyB9LCAvKiBpbnRlcnJ1cHQgKi8KKyAgeyBnZW5lcmljX2RldmljZV91bml0X2RlY29kZSwKKyAgICBnZW5lcmljX2RldmljZV91bml0X2VuY29kZSwKKyAgICBnZW5lcmljX2RldmljZV9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzLAorICAgIGdlbmVyaWNfZGV2aWNlX3NpemVfdG9fYXR0YWNoX3NpemUgfSwKKyAgaHdfcGFsX2NyZWF0ZV9pbnN0YW5jZSwKK307CisKKworc3RhdGljIHZvaWQgKgoraHdfcGFsX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLAorCSAgICAgIGNvbnN0IGRldmljZV91bml0ICp1bml0X2FkZHJlc3MsCisJICAgICAgY29uc3QgY2hhciAqYXJncykKK3sKKyAgLyogY3JlYXRlIHRoZSBkZXNjcmlwdG9yICovCisgIGh3X3BhbF9kZXZpY2UgKmh3X3BhbCA9IFpBTExPQyhod19wYWxfZGV2aWNlKTsKKyAgaHdfcGFsLT5vdXRwdXQuc3RhdHVzID0gMTsKKyAgaHdfcGFsLT5vdXRwdXQuYnVmZmVyID0gJ1wwJzsKKyAgaHdfcGFsLT5pbnB1dC5zdGF0dXMgPSAwOworICBod19wYWwtPmlucHV0LmJ1ZmZlciA9ICdcMCc7CisgIHJldHVybiBod19wYWw7Cit9CisKKworY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgaHdfcGFsX2RldmljZV9kZXNjcmlwdG9yW10gPSB7CisgIHsgInBhbCIsIGh3X3BhbF9jcmVhdGUsICZod19wYWxfY2FsbGJhY2tzIH0sCisgIHsgTlVMTCB9LAorfTsKKworI2VuZGlmIC8qIF9IV19QQUxfQ18gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvaHdfcGhiLmMgYi9zaW0vcHBjL2h3X3BoYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNzFmNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2h3X3BoYi5jCkBAIC0wLDAgKzEsMTA2OCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfSFdfUEhCX0NfCisjZGVmaW5lIF9IV19QSEJfQ18KKworI2luY2x1ZGUgImRldmljZV90YWJsZS5oIgorCisjaW5jbHVkZSAiaHdfcGhiLmgiCisKKyNpbmNsdWRlICJjb3JlZmlsZS5oIgorCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisKKy8qIERFVklDRQorCisKKyAgIHBoYiAtIFBDSSBIb3N0IEJyaWRnZQorCisKKyAgIERFU0NSSVBUSU9OCisKKworICAgUEhCIGltcGxlbWVudHMgYSBtb2RlbCBvZiB0aGUgUENJLWhvc3QgYnJpZGdlIGRlc2NyaWJlZCBpbiB0aGUgUFBDUAorICAgZG9jdW1lbnQuCisKKyAgIEZvciBicmlkZ2UgZGV2aWNlcywgT3BlbiBGaXJtd2FyZSBzcGVjaWZpZXMgdGhhdCB0aGUgPDxyYW5nZXM+PgorICAgcHJvcGVydHkgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBtYXBwaW5nIG9mIGFkZHJlc3Mgc3BhY2VzIGJldHdlZW4gYQorICAgYnJpZGdlcyBwYXJlbnQgYW5kIGNoaWxkIGJ1c3Nlcy4gIFRoaXMgUEhCIG1vZGVsIGNvbmZpZ3VyZXMgaXRzc2VsZgorICAgYWNjb3JkaW5nIHRvIHRoZSBpbmZvcm1hdGlvbiBzcGVjaWZpZWQgaW4gaXRzIHJhbmdlcyBwcm9wZXJ0eS4gIFRoZQorICAgPDxyYW5nZXM+PiBwcm9wZXJ0eSBpcyBkZXNjcmliZWQgaW4gZGV0YWlsIGluIHRoZSBPcGVuIEZpcm13YXJlCisgICBkb2N1bWVudGF0aW9uLgorCisgICBGb3IgRE1BIHRyYW5zZmVycywgYW55IGFjY2VzcyB0byBhIFBDSSBhZGRyZXNzIHNwYWNlIHdoaWNoIGZhbGxzCisgICBvdXRzaWRlIG9mIHRoZSBtYXBwZWQgbWVtb3J5IHNwYWNlIGlzIGFzc3VtZWQgdG8gYmUgYSB0cmFuc2ZlcgorICAgaW50ZW5kZWQgZm9yIHRoZSBwYXJlbnQgYnVzLgorCisKKyAgIFBST1BFUlRJRVMKKworCisgICByYW5nZXMgPSA8bXktcGh5cy1hZGRyPiA8cGFyZW50LXBoeXMtYWRkcj4gPG15LXNpemU+IC4uLiAgKHJlcXVpcmVkKQorICAgCisgICBEZWZpbmUgYSBudW1iZXIgb2YgbWFwcGluZ3MgZnJvbSB0aGUgcGFyZW50IGJ1cyB0byBvbmUgb2YgdGhpcworICAgZGV2aWNlcyBQQ0kgYnVzc2VzLiAgVGhlIGV4YWN0IGZvcm1hdCBvZiB0aGUgPDxwYXJlbnQtcGh5cy1hZGRyPj4KKyAgIGlzIHBhcmVudCBidXMgZGVwZW5kYW50LiAgVGhlIGZvcm1hdCBvZiA8PG15LXBoeXMtYWRkcj4+IGlzCisgICBkZXNjcmliZWQgaW4gdGhlIE9wZW4gRmlybXdhcmUgUENJIGJpbmRpbmdzIGRvY3VtZW50IChub3RlIHRoYXQgdGhlCisgICBhZGRyZXNzIG11c3QgYmUgbm9uLXJlbG9jYXRhYmxlKS4KKworCisgICAjYWRkcmVzcy1jZWxscyA9IDMgIChyZXF1aXJlZCkKKworICAgTnVtYmVyIG9mIGNlbGxzIHVzZWQgYnkgYW4gT3BlbiBGaXJtd2FyZSBQQ0kgYWRkcmVzcy4gIFRoaXMKKyAgIHByb3BlcnR5IG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgc3BlY2lmeWluZyB0aGUgPDxyYW5nZXM+PiBwcm9wZXJ0eS4KKworCisgICAjc2l6ZS1jZWxscyA9IDIgIChyZXF1aXJlZCkKKworICAgTnVtYmVyIG9mIGNlbGxzIHVzZWQgYnkgYW4gT3BlbiBGaXJtd2FyZSBQQ0kgc2l6ZS4gIFRoaXMgcHJvcGVydHkKKyAgIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgc3BlY2lmeWluZyB0aGUgPDxyYW5nZXM+PiBwcm9wZXJ0eS4KKworCisgICBFWEFNUExFUworICAgCisKKyAgIEVuYWJsZSB0cmFjaW5nOgorCisgICB8ICAkIHBzaW0gXAorICAgfCAgICAtdCBwaGItZGV2aWNlIFwKKworCisgICBTaW5jZSBkZXZpY2UgdHJlZSBlbnRyaWVzIHRoYXQgYXJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lCisgICBhcmUgYWRkZWQgYmVmb3JlIG1vc3Qgb2YgdGhlIGRldmljZSB0cmVlIGhhcyBiZWVuIGJ1aWx0IGl0IGlzIG9mdGVuCisgICBuZWNlc3NhcnkgdG8gZXhwbGljdGx5IGFkZCBjZXJ0YWluIGRldmljZSBwcm9wZXJ0aWVzIGFuZCB0aHVzCisgICBlbnN1cmUgdGhleSBhcmUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBkZXZpY2UgdHJlZS4gIEZvciB0aGUKKyAgIDw8cGhiPj4gb25lIHN1Y2ggcHJvcGVydHkgaXMgcGFyZW50IGJ1c3NlcyA8PCNhZGRyZXNzLWNlbGxzPj4uCisKKyAgIHwgICAgLW8gJy8jYWRkcmVzcy1jZWxscyAxJyBcCisKKworICAgQ3JlYXRlIHRoZSBQSEIgcmVtZW1iZXJpbmcgdG8gaW5jbHVkZSB0aGUgY2VsbCBzaXplIHByb3BlcnRpZXM6CisgICAKKyAgIHwgICAgLW8gJy9waGJAMHg4MDAwMDAwMC8jYWRkcmVzcy1jZWxscyAzJyBcCisgICB8ICAgIC1vICcvcGhiQDB4ODAwMDAwMDAvI3NpemUtY2VsbHMgMicgXAorCisKKyAgIFNwZWNpZnkgdGhhdCB0aGUgbWVtb3J5IGFkZHJlc3MgcmFuZ2UgPDwweDgwMDAwMDAwPj4gdG8KKyAgIDw8MHg4ZmZmZmZmZj4+IHNob3VsZCBtYXAgZGlyZWN0bHkgb250byB0aGUgUENJIG1lbW9yeSBhZGRyZXNzCisgICBzcGFjZSB3aGlsZSB0aGUgcHJvY2Vzc29yIGFkZHJlc3MgcmFuZ2UgPDwweGMwMDAwMDAwPj4gdG8KKyAgIDw8MHhjMDAwZmZmZj4+IHNob3VsZCBtYXAgb250byB0aGUgUENJIEkvTyBhZGRyZXNzIHJhbmdlIHN0YXJ0aW5nCisgICBhdCBsb2NhdGlvbiB6ZXJvOgorCisgICB8ICAgIC1vICcvcGhiQDB4ODAwMDAwMDAvcmFuZ2VzIFwKKyAgIHwgICAgICAgICAgICAgICAgbm0wLDAsMCw4MDAwMDAwMCAweDgwMDAwMDAwIDB4MTAwMDAwMDAgXAorICAgfCAgICAgICAgICAgICAgICBuaTAsMCwwLDAgMHhjMDAwMDAwMCAweDEwMDAwJyBcCisKKworICAgSW5zZXJ0IGEgNGsgPDxudnJhbT4+IGludG8gc2xvdCB6ZXJvIG9mIHRoZSBQQ0kgYnVzLiAgSGF2ZSBpdAorICAgZGlyZWN0bHkgYWNjZXNzaWJsZSBpbiBib3RoIHRoZSBJL08gKGFkZHJlc3MgPDwweDEwMD4+KSBhbmQgbWVtb3J5CisgICAoYWRkcmVzcyAweDgwMDAxMDAwKSBzcGFjZXM6CisKKyAgIHwgICAgLW8gJy9waGJAMHg4MDAwMDAwMC9udnJhbUAwL2Fzc2lnbmVkLWFkZHJlc3NlcyBcCisgICB8ICAgICAgICAgICAgICAgIG5tMCwwLDEwLDgwMDAxMDAwIDQwOTYgXAorICAgfCAgICAgICAgICAgICAgICBuaTAsMCwxNCwxMDAgNDA5NicKKyAgIHwgICAgLW8gJy9waGJAMHg4MDAwMDAwMC9udnJhbUAwL3JlZyBcCisgICB8ICAgICAgICAgICAgICAgIDAgMCBcCisgICB8ICAgICAgICAgICAgICAgIGkwLDAsMTQsMCA0MDk2JworICAgfCAgICAtbyAnL3BoYkAweDgwMDAwMDAwL252cmFtQDAvYWx0ZXJuYXRlLXJlZyBcCisgICB8ICAgICAgICAgICAgICAgIDAgMCBcCisgICB8ICAgICAgICAgICAgICAgIG0wLDAsMTAsMCA0MDk2JworCisgICBUaGUgPDxhc3NpZ25lZC1hZGRyZXNzPj4gcHJvcGVydHkgY29ycmVzcG9uZGluZyB0byB3aGF0IChpZiBpdCB3ZXJlCisgICBpbXBsZW1lbnRlZCkgYmUgZm91bmQgaW4gdGhlIGNvbmZpZyBiYXNlIHJlZ2lzdGVycyB3aGlsZSB0aGUKKyAgIDw8cmVnPj4gYW5kIDw8YWx0ZXJuYXRpdmUtcmVnPj4gcHJvcGVydGllcyBpbmRpY2F0aW5nIHRoZSBsb2NhdGlvbgorICAgb2YgcmVnaXN0ZXJzIHdpdGhpbiBlYWNoIGFkZHJlc3Mgc3BhY2UuCisKKyAgIE9mIHRoZSBwb3NzaWJsZSBhZGRyZXNzZXMsIG9ubHkgdGhlIG5vbi1yZWxvY2F0YWJsZSB2ZXJzaW9ucyBhcmUKKyAgIHVzZWQgd2hlbiBhdHRhY2hpbmcgdGhlIGRldmljZSB0byB0aGUgYnVzLgorCisKKyAgIEJVR1MKKyAgIAorCisgICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGlzIGxlZnQgYXMgYW4KKyAgIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyLiAgU3VjaCBhIHJlc3RyaWN0aW9uIHNob3VsZCBvbmx5IGltcGFjdCBvbgorICAgc3lzdGVtcyB3YW50aW5nIHRvIGR5bmFtaWNhbGx5IGNvbmZpZ3VyZSBkZXZpY2VzIG9uIHRoZSBQQ0kgYnVzLgorCisgICBUaGUgPDxDSFJQPj4gZG9jdW1lbnQgc3BlY2ZpZXMgYWRkaXRpb25hbCAob3B0aW9uYWwpIGZ1bmN0aW9uYWxpdHkKKyAgIG9mIHRoZSBwcmltYXJ5IFBIQi4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHN1Y2ggZnVuY3Rpb25hbGl0eSBpcworICAgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlci4KKworICAgVGhlIE9wZW4gRmlybXdhcmUgUENJIGJ1cyBiaW5kaW5ncyBkb2N1bWVudCAocmV2IDEuNiBhbmQgMi4wKSBpcworICAgdW5jbGVhciBvbiB0aGUgdmFsdWUgb2YgdGhlICJzcyIgYml0cyBmb3IgYSA2NGJpdCBtZW1vcnkgYWRkcmVzcy4KKyAgIFRoZSBjb3JyZWN0IHZhbHVlLCBhcyB1c2VkIGJ5IHRoaXMgbW9kdWxlLCBpcyAwYjExLgorICAgCisgICBUaGUgT3BlbiBGaXJtd2FyZSBQQ0kgYnVzIGJpbmRpbmdzIGRvY3VtZW50IChyZXYgMS42KSBzdWdnZXN0cyB0aGF0CisgICB0aGUgcmVnaXN0ZXIgZmllbGQgb2Ygbm9uLXJlbG9jYXRhYmxlIFBDSSBhZGRyZXNzIHNob3VsZCBiZSB6ZXJvLgorICAgVW5mb3J0dW5hdGx5LCBQQ0kgYWRkcmVzc2VzIHNwZWNpZmllZCBpbiB0aGUgPDxhc3NpZ25lZC1hZGRyZXNzZXM+PgorICAgcHJvcGVydHkgbXVzdCBiZSBib3RoIG5vbi1yZWxvY2F0YWJsZSBhbmQgaGF2ZSBub24temVybyByZWdpc3RlcgorICAgZmllbGRzLgorCisgICBUaGUgdW5pdC1kZWNvZGUgbWV0aG9kIGlzIG5vdCBpbnNlcnRpbmcgYSBidXMgbnVtYmVyIGludG8gYW55CisgICBhZGRyZXNzIHRoYXQgaXQgZGVjb2Rlcy4gIEluc3RlYWQgdGhlIGJ1cy1udW1iZXIgaXMgbGVmdCBhcyB6ZXJvLgorCisgICBTdXBwb3J0IGZvciBhbGlhc2VkIG1lbW9yeSBhbmQgSS9PIGFkZHJlc3NlcyBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlCisgICBmb3IgdGhlIHJlYWRlci4KKworICAgU3VwcG9ydCBmb3IgaW50ZXJydXB0LWFjayBhbmQgc3BlY2lhbCBjeWNsZXMgYXJlIGxlZnQgYXMgYW4KKyAgIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyLiAgT25lIGlzc3VlIHRvIGNvbnNpZGVyIHdoZW4gYXR0ZW1wdGluZworICAgdGhpcyBleGVyY2lzZSBpcyBob3cgdG8gc3BlY2lmeSB0aGUgYWRkcmVzcyBvZiB0aGUgaW50LWFjayBhbmQKKyAgIHNwZWNpYWwgY3ljbGUgcmVnaXN0ZXIuICBIaW50OiA8PC84MjU5LWludGVycnVwdC1hY2tvd2xlZGdlPj4gaXMKKyAgIHRoZSB3cm9uZyBhbnN3ZXIuCisKKyAgIENoaWxkcmVuIG9mIHRoaXMgbm9kZSBjYW4gb25seSB1c2UgdGhlIGNsaWVudCBjYWxsYmFjayBpbnRlcmZhY2UKKyAgIHdoZW4gYXR0YWNoaW5nIHRoZW1zZWx2ZXMgdG8gdGhlIDw8cGhiPj4uCisKKyAgIAorICAgUkVGRVJFTkNFUworCisKKyAgIGh0dHA6Ly9wbGF5Z3JvdW5kLnN1bi5jb20vMTI3NS9ob21lLmh0bWwjT0ZEYnVzUENJCisKKworICAgKi8KKworICAgCit0eXBlZGVmIHN0cnVjdCBfcGhiX3NwYWNlIHsKKyAgY29yZSAqbWFwOworICBjb3JlX21hcCAqcmVhZGFibGU7CisgIGNvcmVfbWFwICp3cml0ZWFibGU7CisgIHVuc2lnbmVkX3dvcmQgcGFyZW50X2Jhc2U7CisgIGludCBwYXJlbnRfc3BhY2U7CisgIHVuc2lnbmVkX3dvcmQgbXlfYmFzZTsKKyAgaW50IG15X3NwYWNlOworICB1bnNpZ25lZCBzaXplOwkKKyAgY29uc3QgY2hhciAqbmFtZTsKK30gcGhiX3NwYWNlOworCit0eXBlZGVmIHN0cnVjdCBfaHdfcGhiX2RldmljZSAgeworICBwaGJfc3BhY2Ugc3BhY2VbbnJfaHdfcGhiX3NwYWNlc107Cit9IGh3X3BoYl9kZXZpY2U7CisKKworc3RhdGljIGNvbnN0IGNoYXIgKgoraHdfcGhiX2RlY29kZV9uYW1lKGh3X3BoYl9kZWNvZGUgbGV2ZWwpCit7CisgIHN3aXRjaCAobGV2ZWwpIHsKKyAgY2FzZSBod19waGJfbm9ybWFsX2RlY29kZTogcmV0dXJuICJub3JtYWwiOworICBjYXNlIGh3X3BoYl9zdWJ0cmFjdGl2ZV9kZWNvZGU6IHJldHVybiAic3VidHJhY3RpdmUiOworICBjYXNlIGh3X3BoYl9tYXN0ZXJfYWJvcnRfZGVjb2RlOiByZXR1cm4gIm1hc3Rlci1hYm9ydCI7CisgIGRlZmF1bHQ6IHJldHVybiAiaW52YWxpZCBkZWNvZGUiOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK2h3X3BoYl9pbml0X2FkZHJlc3MoZGV2aWNlICptZSkKK3sKKyAgaHdfcGhiX2RldmljZSAqcGhiID0gZGV2aWNlX2RhdGEobWUpOworIAorICAvKiBjaGVjayBzb21lIGJhc2ljIHByb3BlcnRpZXMgKi8KKyAgaWYgKGRldmljZV9ucl9hZGRyZXNzX2NlbGxzKG1lKSAhPSAzKQorICAgIGRldmljZV9lcnJvcihtZSwgImluY29ycmVjdCAjYWRkcmVzcy1jZWxscyIpOworICBpZiAoZGV2aWNlX25yX3NpemVfY2VsbHMobWUpICE9IDIpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAiaW5jb3JyZWN0ICNzaXplLWNlbGxzIik7CisKKyAgLyogKHJlKSBpbml0aWFsaXplIGVhY2ggUENJIHNwYWNlICovCisgIHsKKyAgICBod19waGJfc3BhY2VzIHNwYWNlX25yOworICAgIGZvciAoc3BhY2VfbnIgPSAwOyBzcGFjZV9uciA8IG5yX2h3X3BoYl9zcGFjZXM7IHNwYWNlX25yKyspIHsKKyAgICAgIHBoYl9zcGFjZSAqcGNpX3NwYWNlID0gJnBoYi0+c3BhY2Vbc3BhY2VfbnJdOworICAgICAgY29yZV9pbml0KHBjaV9zcGFjZS0+bWFwKTsKKyAgICAgIHBjaV9zcGFjZS0+c2l6ZSA9IDA7CisgICAgfQorICB9CisKKyAgLyogZGVjb2RlIGVhY2ggb2YgdGhlIHJhbmdlcyBwcm9wZXJ0aWVzIGVudGVyaW5nIHRoZSBpbmZvcm1hdGlvbgorICAgICBpbnRvIHRoZSBzcGFjZSB0YWJsZSAqLworICB7CisgICAgcmFuZ2VfcHJvcGVydHlfc3BlYyByYW5nZTsKKyAgICBpbnQgcmFuZ2VzX2VudHJ5OworICAgIAorICAgIGZvciAocmFuZ2VzX2VudHJ5ID0gMDsKKwkgZGV2aWNlX2ZpbmRfcmFuZ2VfYXJyYXlfcHJvcGVydHkobWUsICJyYW5nZXMiLCByYW5nZXNfZW50cnksCisJCQkJCSAgJnJhbmdlKTsKKwkgcmFuZ2VzX2VudHJ5KyspIHsKKyAgICAgIGludCBteV9hdHRhY2hfc3BhY2U7CisgICAgICB1bnNpZ25lZF93b3JkIG15X2F0dGFjaF9hZGRyZXNzOworICAgICAgaW50IHBhcmVudF9hdHRhY2hfc3BhY2U7CisgICAgICB1bnNpZ25lZF93b3JkIHBhcmVudF9hdHRhY2hfYWRkcmVzczsKKyAgICAgIHVuc2lnbmVkIHNpemU7CisgICAgICBwaGJfc3BhY2UgKnBjaV9zcGFjZTsKKyAgICAgIC8qIGNvbnZlcnQgdGhlIGFkZHJlc3NlcyBpbnRvIHNvbWV0aGluZyBtZWFuaW5nZnVsICovCisgICAgICBkZXZpY2VfYWRkcmVzc190b19hdHRhY2hfYWRkcmVzcyhtZSwgJnJhbmdlLmNoaWxkX2FkZHJlc3MsCisJCQkJICAgICAgICZteV9hdHRhY2hfc3BhY2UsCisJCQkJICAgICAgICZteV9hdHRhY2hfYWRkcmVzcywKKwkJCQkgICAgICAgbWUpOworICAgICAgZGV2aWNlX2FkZHJlc3NfdG9fYXR0YWNoX2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksCisJCQkJICAgICAgICZyYW5nZS5wYXJlbnRfYWRkcmVzcywKKwkJCQkgICAgICAgJnBhcmVudF9hdHRhY2hfc3BhY2UsCisJCQkJICAgICAgICZwYXJlbnRfYXR0YWNoX2FkZHJlc3MsCisJCQkJICAgICAgIG1lKTsKKyAgICAgIGRldmljZV9zaXplX3RvX2F0dGFjaF9zaXplKG1lLCAmcmFuZ2Uuc2l6ZSwgJnNpemUsIG1lKTsKKyAgICAgIGlmIChteV9hdHRhY2hfc3BhY2UgPCAwIHx8IG15X2F0dGFjaF9zcGFjZSA+PSBucl9od19waGJfc3BhY2VzKQorCWRldmljZV9lcnJvcihtZSwgInJhbmdlcyBwcm9wZXJ0eSBjb250YWlucyBhbiBpbnZhbGlkIGFkZHJlc3Mgc3BhY2UiKTsKKyAgICAgIHBjaV9zcGFjZSA9ICZwaGItPnNwYWNlW215X2F0dGFjaF9zcGFjZV07CisgICAgICBpZiAocGNpX3NwYWNlLT5zaXplICE9IDApCisJZGV2aWNlX2Vycm9yKG1lLCAicmFuZ2VzIHByb3BlcnR5IGNvbnRhaW5zIGR1cGxpY2F0ZSBtYXBwaW5ncyBmb3IgJXMgYWRkcmVzcyBzcGFjZSIsCisJCSAgICAgcGNpX3NwYWNlLT5uYW1lKTsKKyAgICAgIHBjaV9zcGFjZS0+cGFyZW50X2Jhc2UgPSBwYXJlbnRfYXR0YWNoX2FkZHJlc3M7CisgICAgICBwY2lfc3BhY2UtPnBhcmVudF9zcGFjZSA9IHBhcmVudF9hdHRhY2hfc3BhY2U7CisgICAgICBwY2lfc3BhY2UtPm15X2Jhc2UgPSBteV9hdHRhY2hfYWRkcmVzczsKKyAgICAgIHBjaV9zcGFjZS0+bXlfc3BhY2UgPSBteV9hdHRhY2hfc3BhY2U7CisgICAgICBwY2lfc3BhY2UtPnNpemUgPSBzaXplOworICAgICAgZGV2aWNlX2F0dGFjaF9hZGRyZXNzKGRldmljZV9wYXJlbnQobWUpLAorCQkJICAgIGF0dGFjaF9jYWxsYmFjaywKKwkJCSAgICBwYXJlbnRfYXR0YWNoX3NwYWNlLCBwYXJlbnRfYXR0YWNoX2FkZHJlc3MsIHNpemUsCisJCQkgICAgYWNjZXNzX3JlYWRfd3JpdGVfZXhlYywKKwkJCSAgICBtZSk7CisgICAgICBEVFJBQ0UocGhiLCAoIm1hcCAlZDoweCVseCB0byAlczoweCVseCAoMHglbHggYnl0ZXMpXG4iLAorCQkgICAoaW50KXBhcmVudF9hdHRhY2hfc3BhY2UsCisJCSAgICh1bnNpZ25lZCBsb25nKXBhcmVudF9hdHRhY2hfYWRkcmVzcywKKwkJICAgcGNpX3NwYWNlLT5uYW1lLAorCQkgICAodW5zaWduZWQgbG9uZylteV9hdHRhY2hfYWRkcmVzcywKKwkJICAgKHVuc2lnbmVkIGxvbmcpc2l6ZSkpOworICAgIH0KKyAgICAKKyAgICBpZiAocmFuZ2VzX2VudHJ5ID09IDApIHsKKyAgICAgIGRldmljZV9lcnJvcihtZSwgIk1pc3Npbmcgb3IgZW1wdHkgcmFuZ2VzIHByb3BlcnR5Iik7CisgICAgfQorCisgIH0KKyAgCit9CisKK3N0YXRpYyB2b2lkCitod19waGJfYXR0YWNoX2FkZHJlc3MoZGV2aWNlICptZSwKKwkJICAgICAgYXR0YWNoX3R5cGUgdHlwZSwKKwkJICAgICAgaW50IHNwYWNlLAorCQkgICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCisJCSAgICAgIHVuc2lnbmVkIG5yX2J5dGVzLAorCQkgICAgICBhY2Nlc3NfdHlwZSBhY2Nlc3MsCisJCSAgICAgIGRldmljZSAqY2xpZW50KSAvKmNhbGxiYWNrL2RlZmF1bHQqLworeworICBod19waGJfZGV2aWNlICpwaGIgPSBkZXZpY2VfZGF0YShtZSk7CisgIHBoYl9zcGFjZSAqcGNpX3NwYWNlOworICAvKiBzYW5pdHkgY2hlY2tzICovCisgIGlmIChzcGFjZSA8IDAgfHwgc3BhY2UgPj0gbnJfaHdfcGhiX3NwYWNlcykKKyAgICBkZXZpY2VfZXJyb3IobWUsICJhdHRhY2ggc3BhY2UgKCVkKSBzcGVjaWZpZWQgYnkgJXMgaW52YWxpZCIsCisJCSBzcGFjZSwgZGV2aWNlX3BhdGgoY2xpZW50KSk7CisgIHBjaV9zcGFjZSA9ICZwaGItPnNwYWNlW3NwYWNlXTsKKyAgaWYgKGFkZHIgKyBucl9ieXRlcyA+IHBjaV9zcGFjZS0+bXlfYmFzZSArIHBjaV9zcGFjZS0+c2l6ZQorICAgICAgfHwgYWRkciA8IHBjaV9zcGFjZS0+bXlfYmFzZSkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJhdHRhY2ggYWRkciAoMHglbHgpIHNwZWNpZmllZCBieSAlcyBvdXRzaWRlIG9mIGJ1cyBhZGRyZXNzIHJhbmdlIiwKKwkJICh1bnNpZ25lZCBsb25nKWFkZHIsIGRldmljZV9wYXRoKGNsaWVudCkpOworICBpZiAodHlwZSAhPSBod19waGJfbm9ybWFsX2RlY29kZQorICAgICAgJiYgdHlwZSAhPSBod19waGJfc3VidHJhY3RpdmVfZGVjb2RlKQorICAgIGRldmljZV9lcnJvcihtZSwgImF0dGFjaCB0eXBlICglZCkgc3BlY2lmaWVkIGJ5ICVzIGludmFsaWQiLAorCQkgdHlwZSwgZGV2aWNlX3BhdGgoY2xpZW50KSk7CisgIC8qIGF0dGFjaCBpdCB0byB0aGUgcmVsZXZlbnQgYnVzICovCisgIERUUkFDRShwaGIsICgiYXR0YWNoICVzIC0gJXMgJXM6MHglbHggKDB4JWx4IGJ5dGVzKVxuIiwKKwkgICAgICAgZGV2aWNlX3BhdGgoY2xpZW50KSwKKwkgICAgICAgaHdfcGhiX2RlY29kZV9uYW1lKHR5cGUpLAorCSAgICAgICBwY2lfc3BhY2UtPm5hbWUsCisJICAgICAgICh1bnNpZ25lZCBsb25nKWFkZHIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKW5yX2J5dGVzKSk7CisgIGNvcmVfYXR0YWNoKHBjaV9zcGFjZS0+bWFwLAorCSAgICAgIHR5cGUsCisJICAgICAgc3BhY2UsCisJICAgICAgYWNjZXNzLAorCSAgICAgIGFkZHIsCisJICAgICAgbnJfYnl0ZXMsCisJICAgICAgY2xpZW50KTsKK30KKworCisvKiBFeHRyYWN0L3NldCB2YXJpb3VzIGZpZWxkcyBmcm9tIGEgUENJIHVuaXQgYWRkcmVzcy4KKworICAgTm90ZTogb25seSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBlYWNoIGNlbGwgaXMgdXNlZC4KKworICAgTm90ZTogZm9yIFBQQyBNU0IgaXMgMCB3aGlsZSBmb3IgUENJIGl0IGlzIDMxLiAqLworCisKKy8qIHJlbG9jYXRhYmxlIGJpdCBuICovCisKK3N0YXRpYyB1bnNpZ25lZAorZXh0cmFjdF9uKGNvbnN0IGRldmljZV91bml0ICphZGRyZXNzKQoreworICByZXR1cm4gRVhUUkFDVEVEMzIoYWRkcmVzcy0+Y2VsbHNbMF0sIDAsIDApOworfQorCitzdGF0aWMgdm9pZAorc2V0X24oZGV2aWNlX3VuaXQgKmFkZHJlc3MpCit7CisgIEJMSVQzMihhZGRyZXNzLT5jZWxsc1swXSwgMCwgMSk7Cit9CisKKworLyogcHJlZmV0Y2hhYmxlIGJpdCBwICovCisKK3N0YXRpYyB1bnNpZ25lZAorZXh0cmFjdF9wKGNvbnN0IGRldmljZV91bml0ICphZGRyZXNzKQoreworICBBU1NFUlQoYWRkcmVzcy0+bnJfY2VsbHMgPT0gMyk7CisgIHJldHVybiBFWFRSQUNURUQzMihhZGRyZXNzLT5jZWxsc1swXSwgMSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfcChkZXZpY2VfdW5pdCAqYWRkcmVzcykKK3sKKyAgQkxJVDMyKGFkZHJlc3MtPmNlbGxzWzBdLCAxLCAxKTsKK30KKworCisvKiBhbGlhc2VkIGJpdCB0ICovCisKK3N0YXRpYyB1bnNpZ25lZAorZXh0cmFjdF90KGNvbnN0IGRldmljZV91bml0ICphZGRyZXNzKQoreworICBBU1NFUlQoYWRkcmVzcy0+bnJfY2VsbHMgPT0gMyk7CisgIHJldHVybiBFWFRSQUNURUQzMihhZGRyZXNzLT5jZWxsc1swXSwgMiwgMik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfdChkZXZpY2VfdW5pdCAqYWRkcmVzcykKK3sKKyAgQkxJVDMyKGFkZHJlc3MtPmNlbGxzWzBdLCAyLCAxKTsKK30KKworCisvKiBzcGFjZSBjb2RlIHNzICovCisKK3R5cGVkZWYgZW51bSB7CisgIHNzX2NvbmZpZ19jb2RlID0gMCwKKyAgc3NfaW9fY29kZSA9IDEsCisgIHNzXzMyYml0X21lbW9yeV9jb2RlID0gMiwKKyAgc3NfNjRiaXRfbWVtb3J5X2NvZGUgPSAzLAorfSBzc190eXBlOworCitzdGF0aWMgc3NfdHlwZQorZXh0cmFjdF9zcyhjb25zdCBkZXZpY2VfdW5pdCAqYWRkcmVzcykKK3sKKyAgQVNTRVJUKGFkZHJlc3MtPm5yX2NlbGxzID09IDMpOworICByZXR1cm4gRVhUUkFDVEVEMzIoYWRkcmVzcy0+Y2VsbHNbMF0sIDYsIDcpOworfQorCitzdGF0aWMgdm9pZAorc2V0X3NzKGRldmljZV91bml0ICphZGRyZXNzLCBzc190eXBlIHZhbCkKK3sKKyAgTUJMSVQzMihhZGRyZXNzLT5jZWxsc1swXSwgNiwgNywgdmFsKTsKK30KKworCisvKiBidXMgbnVtYmVyIGJiYmJiYmJiICovCisKKyNpZiAwCitzdGF0aWMgdW5zaWduZWQKK2V4dHJhY3RfYmJiYmJiYmIoY29uc3QgZGV2aWNlX3VuaXQgKmFkZHJlc3MpCit7CisgIEFTU0VSVChhZGRyZXNzLT5ucl9jZWxscyA9PSAzKTsKKyAgcmV0dXJuIEVYVFJBQ1RFRDMyKGFkZHJlc3MtPmNlbGxzWzBdLCA4LCAxNSk7Cit9CisjZW5kaWYKKworI2lmIDAKK3N0YXRpYyB2b2lkCitzZXRfYmJiYmJiYmIoZGV2aWNlX3VuaXQgKmFkZHJlc3MsIHVuc2lnbmVkIHZhbCkKK3sKKyAgTUJMSVQzMihhZGRyZXNzLT5jZWxsc1swXSwgOCwgMTUsIHZhbCk7Cit9CisjZW5kaWYKKworCisvKiBkZXZpY2UgbnVtYmVyIGRkZGRkICovCisKK3N0YXRpYyB1bnNpZ25lZAorZXh0cmFjdF9kZGRkZChjb25zdCBkZXZpY2VfdW5pdCAqYWRkcmVzcykKK3sKKyAgQVNTRVJUKGFkZHJlc3MtPm5yX2NlbGxzID09IDMpOworICByZXR1cm4gRVhUUkFDVEVEMzIoYWRkcmVzcy0+Y2VsbHNbMF0sIDE2LCAyMCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfZGRkZGQoZGV2aWNlX3VuaXQgKmFkZHJlc3MsIHVuc2lnbmVkIHZhbCkKK3sKKyAgTUJMSVQzMihhZGRyZXNzLT5jZWxsc1swXSwgMTYsIDIwLCB2YWwpOworfQorCisKKy8qIGZ1bmN0aW9uIG51bWJlciBmZmYgKi8KKworc3RhdGljIHVuc2lnbmVkCitleHRyYWN0X2ZmZihjb25zdCBkZXZpY2VfdW5pdCAqYWRkcmVzcykKK3sKKyAgQVNTRVJUKGFkZHJlc3MtPm5yX2NlbGxzID09IDMpOworICByZXR1cm4gRVhUUkFDVEVEMzIoYWRkcmVzcy0+Y2VsbHNbMF0sIDIxLCAyMyk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfZmZmKGRldmljZV91bml0ICphZGRyZXNzLCB1bnNpZ25lZCB2YWwpCit7CisgIE1CTElUMzIoYWRkcmVzcy0+Y2VsbHNbMF0sIDIxLCAyMywgdmFsKTsKK30KKworCisvKiByZWdpc3RlciBudW1iZXIgcnJycnJycnIgKi8KKworc3RhdGljIHVuc2lnbmVkCitleHRyYWN0X3JycnJycnJyKGNvbnN0IGRldmljZV91bml0ICphZGRyZXNzKQoreworICBBU1NFUlQoYWRkcmVzcy0+bnJfY2VsbHMgPT0gMyk7CisgIHJldHVybiBFWFRSQUNURUQzMihhZGRyZXNzLT5jZWxsc1swXSwgMjQsIDMxKTsKK30KKworc3RhdGljIHZvaWQKK3NldF9ycnJycnJycihkZXZpY2VfdW5pdCAqYWRkcmVzcywgdW5zaWduZWQgdmFsKQoreworICBNQkxJVDMyKGFkZHJlc3MtPmNlbGxzWzBdLCAyNCwgMzEsIHZhbCk7Cit9CisKKworLyogTVNXIG9mIDY0Yml0IGFkZHJlc3MgaGguLmhoICovCisKK3N0YXRpYyB1bnNpZ25lZAorZXh0cmFjdF9oaF9oaChjb25zdCBkZXZpY2VfdW5pdCAqYWRkcmVzcykKK3sKKyAgQVNTRVJUKGFkZHJlc3MtPm5yX2NlbGxzID09IDMpOworICByZXR1cm4gYWRkcmVzcy0+Y2VsbHNbMV07Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfaGhfaGgoZGV2aWNlX3VuaXQgKmFkZHJlc3MsIHVuc2lnbmVkIHZhbCkKK3sKKyAgYWRkcmVzcy0+Y2VsbHNbMl0gPSB2YWw7Cit9CisKKworLyogTFNXIG9mIDY0Yml0IGFkZHJlc3MgbGwuLmxsICovCisKK3N0YXRpYyB1bnNpZ25lZAorZXh0cmFjdF9sbF9sbChjb25zdCBkZXZpY2VfdW5pdCAqYWRkcmVzcykKK3sKKyAgQVNTRVJUKGFkZHJlc3MtPm5yX2NlbGxzID09IDMpOworICByZXR1cm4gYWRkcmVzcy0+Y2VsbHNbMl07Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfbGxfbGwoZGV2aWNlX3VuaXQgKmFkZHJlc3MsIHVuc2lnbmVkIHZhbCkKK3sKKyAgYWRkcmVzcy0+Y2VsbHNbMl0gPSB2YWw7Cit9CisKKworLyogQ29udmVydCBQQ0kgdGV4dHVhbCBidXMgYWRkcmVzcyBpbnRvIGEgZGV2aWNlIHVuaXQgKi8KKworc3RhdGljIGludAoraHdfcGhiX3VuaXRfZGVjb2RlKGRldmljZSAqbWUsCisJCSAgIGNvbnN0IGNoYXIgKnVuaXQsCisJCSAgIGRldmljZV91bml0ICphZGRyZXNzKQoreworICBjaGFyICplbmQgPSBOVUxMOworICBjb25zdCBjaGFyICpjaHAgPSB1bml0OworICB1bnNpZ25lZCBsb25nIHZhbDsKKworICBpZiAoZGV2aWNlX25yX2FkZHJlc3NfY2VsbHMobWUpICE9IDMpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAiUENJIGJ1cyBzaG91bGQgaGF2ZSAjYWRkcmVzcy1jZWxscyA9PSAzIik7CisgIG1lbXNldChhZGRyZXNzLCAwLCBzaXplb2YoKmFkZHJlc3MpKTsKKworICBpZiAodW5pdCA9PSBOVUxMKQorICAgIHJldHVybiAwOworCisgIGFkZHJlc3MtPm5yX2NlbGxzID0gMzsKKworICBpZiAoaXN4ZGlnaXQoKmNocCkpIHsKKyAgICBzZXRfc3MoYWRkcmVzcywgc3NfY29uZmlnX2NvZGUpOworICB9CisgIGVsc2UgeworCisgICAgLyogbm9uLXJlbG9jYXRhYmxlPyAqLworICAgIGlmICgqY2hwID09ICduJykgeworICAgICAgc2V0X24oYWRkcmVzcyk7CisgICAgICBjaHArKzsKKyAgICB9CisKKyAgICAvKiBhZGRyZXNzLXNwYWNlPyAqLworICAgIGlmICgqY2hwID09ICdpJykgeworICAgICAgc2V0X3NzKGFkZHJlc3MsIHNzX2lvX2NvZGUpOworICAgICAgY2hwKys7CisgICAgfQorICAgIGVsc2UgaWYgKCpjaHAgPT0gJ20nKSB7CisgICAgICBzZXRfc3MoYWRkcmVzcywgc3NfMzJiaXRfbWVtb3J5X2NvZGUpOworICAgICAgY2hwKys7CisgICAgfQorICAgIGVsc2UgaWYgKCpjaHAgPT0gJ3gnKSB7CisgICAgICBzZXRfc3MoYWRkcmVzcywgc3NfNjRiaXRfbWVtb3J5X2NvZGUpOworICAgICAgY2hwKys7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGRldmljZV9lcnJvcihtZSwgIlByb2JsZW0gcGFyc2luZyBQQ0kgYWRkcmVzcyAlcyIsIHVuaXQpOworCisgICAgLyogcG9zc2libGUgYWxpYXMgKi8KKyAgICBpZiAoKmNocCA9PSAndCcpIHsKKyAgICAgIGlmIChleHRyYWN0X3NzKGFkZHJlc3MpID09IHNzXzY0Yml0X21lbW9yeV9jb2RlKQorCWRldmljZV9lcnJvcihtZSwgIkludmFsaWQgYWxpYXMgYml0IGluIFBDSSBhZGRyZXNzICVzIiwgdW5pdCk7CisgICAgICBzZXRfdChhZGRyZXNzKTsKKyAgICAgIGNocCsrOworICAgIH0KKworICAgIC8qIHBvc3NpYmxlIHAgKi8KKyAgICBpZiAoKmNocCA9PSAncCcpIHsKKyAgICAgIGlmIChleHRyYWN0X3NzKGFkZHJlc3MpICE9IHNzXzMyYml0X21lbW9yeV9jb2RlKQorCWRldmljZV9lcnJvcihtZSwgIkludmFsaWQgcHJlZmV0Y2hhYmxlIGJpdCAocCkgaW4gUENJIGFkZHJlc3MgJXMiLAorCQkgICAgIHVuaXQpOworICAgICAgc2V0X3AoYWRkcmVzcyk7CisgICAgICBjaHArKzsKKyAgICB9CisKKyAgfQorCisgIC8qIHJlcXVpcmVkIEREICovCisgIGlmICghaXN4ZGlnaXQoKmNocCkpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAiTWlzc2luZyBkZXZpY2UgbnVtYmVyIGluIFBDSSBhZGRyZXNzICVzIiwgdW5pdCk7CisgIHZhbCA9IHN0cnRvdWwoY2hwLCAmZW5kLCAxNik7CisgIGlmIChjaHAgPT0gZW5kKQorICAgIGRldmljZV9lcnJvcihtZSwgIlByb2JsZW0gcGFyc2luZyBkZXZpY2UgbnVtYmVyIGluIFBDSSBhZGRyZXNzICVzIiwgdW5pdCk7CisgIGlmICgodmFsICYgMHgxZikgIT0gdmFsKQorICAgIGRldmljZV9lcnJvcihtZSwgIkRldmljZSBudW1iZXIgKDB4JWx4KSBvdXQgb2YgcmFuZ2UgKDAuLjB4MWYpIGluIFBDSSBhZGRyZXNzICVzIiwKKwkJIHZhbCwgdW5pdCk7CisgIHNldF9kZGRkZChhZGRyZXNzLCB2YWwpOworICBjaHAgPSBlbmQ7CisKKyAgLyogRm9yIGNvbmZpZyBzcGFjZSwgdGhlIEYgaXMgb3B0aW9uYWwgKi8KKyAgaWYgKGV4dHJhY3Rfc3MoYWRkcmVzcykgPT0gc3NfY29uZmlnX2NvZGUKKyAgICAgICYmIChpc3NwYWNlKCpjaHApIHx8ICpjaHAgPT0gJ1wwJykpCisgICAgcmV0dXJuIGNocCAtIHVuaXQ7CisKKyAgLyogZnVuY3Rpb24gbnVtYmVyIEYgKi8KKyAgaWYgKCpjaHAgIT0gJywnKQorICAgIGRldmljZV9lcnJvcihtZSwgIk1pc3NpbmcgZnVuY3Rpb24gbnVtYmVyIGluIFBDSSBhZGRyZXNzICVzIiwgdW5pdCk7CisgIGNocCsrOworICB2YWwgPSBzdHJ0b3VsKGNocCwgJmVuZCwgMTApOworICBpZiAoY2hwID09IGVuZCkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJQcm9ibGVtIHBhcnNpbmcgZnVuY3Rpb24gbnVtYmVyIGluIFBDSSBhZGRyZXNzICVzIiwKKwkJIHVuaXQpOworICBpZiAoKHZhbCAmIDcpICE9IHZhbCkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJGdW5jdGlvbiBudW1iZXIgKCVsZCkgb3V0IG9mIHJhbmdlICgwLi43KSBpbiBQQ0kgYWRkcmVzcyAlcyIsCisJCSAobG9uZyl2YWwsIHVuaXQpOworICBzZXRfZmZmKGFkZHJlc3MsIHZhbCk7CisgIGNocCA9IGVuZDsKKworICAvKiBmb3IgY29uZmlnIHNwYWNlLCBtdXN0IGJlIGVuZCAqLworICBpZiAoZXh0cmFjdF9zcyhhZGRyZXNzKSA9PSBzc19jb25maWdfY29kZSkgeworICAgIGlmICghaXNzcGFjZSgqY2hwKSAmJiAqY2hwICE9ICdcMCcpCisgICAgICBkZXZpY2VfZXJyb3IobWUsICJQcm9ibGVtIHBhcnNpbmcgUENJIGNvbmZpZyBhZGRyZXNzICVzIiwKKwkJICAgdW5pdCk7CisgICAgcmV0dXJuIGNocCAtIHVuaXQ7CisgIH0KKworICAvKiByZWdpc3RlciBudW1iZXIgUlIgKi8KKyAgaWYgKCpjaHAgIT0gJywnKQorICAgIGRldmljZV9lcnJvcihtZSwgIk1pc3NpbmcgcmVnaXN0ZXIgbnVtYmVyIGluIFBDSSBhZGRyZXNzICVzIiwgdW5pdCk7CisgIGNocCsrOworICB2YWwgPSBzdHJ0b3VsKGNocCwgJmVuZCwgMTYpOworICBpZiAoY2hwID09IGVuZCkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJQcm9ibGVtIHBhcnNpbmcgcmVnaXN0ZXIgbnVtYmVyIGluIFBDSSBhZGRyZXNzICVzIiwKKwkJIHVuaXQpOworICBzd2l0Y2ggKGV4dHJhY3Rfc3MoYWRkcmVzcykpIHsKKyAgY2FzZSBzc19pb19jb2RlOgorI2lmIDAKKyAgICBpZiAoZXh0cmFjdF9uKGFkZHJlc3MpICYmIHZhbCAhPSAwKQorICAgICAgZGV2aWNlX2Vycm9yKG1lLCAibm9uLXJlbG9jYXRhYmxlIEkvTyByZWdpc3RlciBtdXN0IGJlIHplcm8gaW4gUENJIGFkZHJlc3MgJXMiLCB1bml0KTsKKyAgICBlbHNlIGlmICghZXh0cmFjdF9uKGFkZHJlc3MpCisJICAgICAmJiB2YWwgIT0gMHgxMCAmJiB2YWwgIT0gMHgxNCAmJiB2YWwgIT0gMHgxOAorCSAgICAgJiYgdmFsICE9IDB4MWMgJiYgdmFsICE9IDB4MjAgJiYgdmFsICE9IDB4MjQpCisgICAgICBkZXZpY2VfZXJyb3IobWUsICJJL08gcmVnaXN0ZXIgaW52YWxpZCBpbiBQQ0kgYWRkcmVzcyAlcyIsIHVuaXQpOworI2VuZGlmCisgICAgYnJlYWs7CisgIGNhc2Ugc3NfMzJiaXRfbWVtb3J5X2NvZGU6CisjaWYgMAorICAgIGlmIChleHRyYWN0X24oYWRkcmVzcykgJiYgdmFsICE9IDApCisgICAgICBkZXZpY2VfZXJyb3IobWUsICJub24tcmVsb2NhdGFibGUgbWVtb3J5IHJlZ2lzdGVyIG11c3QgYmUgemVybyBpbiBQQ0kgYWRkcmVzcyAlcyIsIHVuaXQpOworICAgIGVsc2UgaWYgKCFleHRyYWN0X24oYWRkcmVzcykKKwkgICAgICYmIHZhbCAhPSAweDEwICYmIHZhbCAhPSAweDE0ICYmIHZhbCAhPSAweDE4CisJICAgICAmJiB2YWwgIT0gMHgxYyAmJiB2YWwgIT0gMHgyMCAmJiB2YWwgIT0gMHgyNCAmJiB2YWwgIT0gMHgzMCkKKyAgICAgIGRldmljZV9lcnJvcihtZSwgIkkvTyByZWdpc3RlciAoMHglbHgpIGludmFsaWQgaW4gUENJIGFkZHJlc3MgJXMiLAorCQkgICB2YWwsIHVuaXQpOworI2VuZGlmCisgICAgYnJlYWs7CisgIGNhc2Ugc3NfNjRiaXRfbWVtb3J5X2NvZGU6CisgICAgaWYgKGV4dHJhY3RfbihhZGRyZXNzKSAmJiB2YWwgIT0gMCkKKyAgICAgIGRldmljZV9lcnJvcihtZSwgIm5vbi1yZWxvY2F0YWJsZSAzMmJpdCBtZW1vcnkgcmVnaXN0ZXIgbXVzdCBiZSB6ZXJvIGluIFBDSSBhZGRyZXNzICVzIiwgdW5pdCk7CisgICAgZWxzZSBpZiAoIWV4dHJhY3RfbihhZGRyZXNzKQorCSAgICAgJiYgdmFsICE9IDB4MTAgJiYgdmFsICE9IDB4MTggJiYgdmFsICE9IDB4MjApCisgICAgICBkZXZpY2VfZXJyb3IobWUsICJSZWdpc3RlciBudW1iZXIgKDB4JWx4KSBpbnZhbGlkIGluIDY0Yml0IFBDSSBhZGRyZXNzICVzIiwKKwkJICAgdmFsLCB1bml0KTsKKyAgY2FzZSBzc19jb25maWdfY29kZToKKyAgICBkZXZpY2VfZXJyb3IobWUsICJpbnRlcm5hbCBlcnJvciIpOworICB9CisgIGlmICgodmFsICYgMHhmZikgIT0gdmFsKQorICAgIGRldmljZV9lcnJvcihtZSwgIlJlZ2lzdGVyIG51bWJlciAoMHglbHgpIG91dCBvZiByYW5nZSAoMC4uMHhmZikgaW4gUENJIGFkZHJlc3MgJXMiLAorCQkgdmFsLCB1bml0KTsKKyAgc2V0X3JycnJycnJyKGFkZHJlc3MsIHZhbCk7CisgIGNocCA9IGVuZDsKKworICAvKiBhZGRyZXNzICovCisgIGlmICgqY2hwICE9ICcsJykKKyAgICBkZXZpY2VfZXJyb3IobWUsICJNaXNzaW5nIGFkZHJlc3MgaW4gUENJIGFkZHJlc3MgJXMiLCB1bml0KTsKKyAgY2hwKys7CisgIHN3aXRjaCAoZXh0cmFjdF9zcyhhZGRyZXNzKSkgeworICBjYXNlIHNzX2lvX2NvZGU6CisgIGNhc2Ugc3NfMzJiaXRfbWVtb3J5X2NvZGU6CisgICAgdmFsID0gc3RydG91bChjaHAsICZlbmQsIDE2KTsKKyAgICBpZiAoY2hwID09IGVuZCkKKyAgICAgIGRldmljZV9lcnJvcihtZSwgIlByb2JsZW0gcGFyc2luZyBhZGRyZXNzIGluIFBDSSBhZGRyZXNzICVzIiwgdW5pdCk7CisgICAgc3dpdGNoIChleHRyYWN0X3NzKGFkZHJlc3MpKSB7CisgICAgY2FzZSBzc19pb19jb2RlOgorICAgICAgaWYgKGV4dHJhY3RfbihhZGRyZXNzKSAmJiBleHRyYWN0X3QoYWRkcmVzcykKKwkgICYmICh2YWwgJiAxMDI0KSAhPSB2YWwpCisJZGV2aWNlX2Vycm9yKG1lLCAiMTBiaXQgYWxpYXNlZCBub24tcmVsb2NhdGFibGUgYWRkcmVzcyAoMHglbHgpIG91dCBvZiByYW5nZSBpbiBQQ0kgYWRkcmVzcyAlcyIsCisJCSAgICAgdmFsLCB1bml0KTsKKyAgICAgIGlmICghZXh0cmFjdF9uKGFkZHJlc3MpICYmIGV4dHJhY3RfdChhZGRyZXNzKQorCSAgJiYgKHZhbCAmIDB4ZmZmZikgIT0gdmFsKQorCWRldmljZV9lcnJvcihtZSwgIjY0ayByZWxvY2F0YWJsZSBhZGRyZXNzICgweCVseCkgb3V0IG9mIHJhbmdlIGluIFBDSSBhZGRyZXNzICVzIiwKKwkJICAgICB2YWwsIHVuaXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzc18zMmJpdF9tZW1vcnlfY29kZToKKyAgICAgIGlmIChleHRyYWN0X3QoYWRkcmVzcykgJiYgKHZhbCAmIDB4ZmZmZmYpICE9IHZhbCkKKwlkZXZpY2VfZXJyb3IobWUsICIxbWIgbWVtb3J5IGFkZHJlc3MgKDB4JWx4KSBvdXQgb2YgcmFuZ2UgaW4gUENJIGFkZHJlc3MgJXMiLAorCQkgICAgIHZhbCwgdW5pdCk7CisgICAgICBpZiAoIWV4dHJhY3RfdChhZGRyZXNzKSAmJiAodmFsICYgMHhmZmZmZmZmZikgIT0gdmFsKQorCWRldmljZV9lcnJvcihtZSwgIjMyYml0IG1lbW9yeSBhZGRyZXNzICgweCVseCkgb3V0IG9mIHJhbmdlIGluIFBDSSBhZGRyZXNzICVzIiwKKwkJICAgICB2YWwsIHVuaXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzc182NGJpdF9tZW1vcnlfY29kZToKKyAgICBjYXNlIHNzX2NvbmZpZ19jb2RlOgorICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiaW50ZXJuYWwgZXJyb3IiKTsKKyAgICB9CisgICAgc2V0X2xsX2xsKGFkZHJlc3MsIHZhbCk7CisgICAgY2hwID0gZW5kOworICAgIGJyZWFrOworICBjYXNlIHNzXzY0Yml0X21lbW9yeV9jb2RlOgorICAgIGRldmljZV9lcnJvcihtZSwgIjY0Yml0IGFkZHJlc3NlcyB1bmltcGxlbWVudGVkIik7CisgICAgc2V0X2hoX2hoKGFkZHJlc3MsIHZhbCk7CisgICAgc2V0X2xsX2xsKGFkZHJlc3MsIHZhbCk7CisgICAgYnJlYWs7CisgIGNhc2Ugc3NfY29uZmlnX2NvZGU6CisgICAgZGV2aWNlX2Vycm9yKG1lLCAiaW50ZXJuYWwgZXJyb3IiKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIGZpbmlzaGVkPyAqLworICBpZiAoIWlzc3BhY2UoKmNocCkgJiYgKmNocCAhPSAnXDAnKQorICAgIGRldmljZV9lcnJvcihtZSwgIlByb2JsZW0gcGFyc2luZyBQQ0kgYWRkcmVzcyAlcyIsIHVuaXQpOworCisgIHJldHVybiBjaHAgLSB1bml0OworfQorCisKKy8qIENvbnZlcnQgUENJIGRldmljZSB1bml0IGludG8gaXRzIGNvcnJlc3BvbmRpbmcgdGV4dHVhbAorICAgcmVwcmVzZW50YXRpb24gKi8KKworc3RhdGljIGludAoraHdfcGhiX3VuaXRfZW5jb2RlKGRldmljZSAqbWUsCisJCSAgIGNvbnN0IGRldmljZV91bml0ICp1bml0X2FkZHJlc3MsCisJCSAgIGNoYXIgKmJ1ZiwKKwkJICAgaW50IHNpemVvZl9idWYpCit7CisgIGlmICh1bml0X2FkZHJlc3MtPm5yX2NlbGxzICE9IDMpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAiSW5jb3JyZWN0IG51bWJlciBvZiBjZWxscyBpbiBQQ0kgdW5pdCBhZGRyZXNzIik7CisgIGlmIChkZXZpY2VfbnJfYWRkcmVzc19jZWxscyhtZSkgIT0gMykKKyAgICBkZXZpY2VfZXJyb3IobWUsICJQQ0kgYnVzIHNob3VsZCBoYXZlICNhZGRyZXNzLWNlbGxzID09IDMiKTsKKyAgaWYgKGV4dHJhY3Rfc3ModW5pdF9hZGRyZXNzKSA9PSBzc19jb25maWdfY29kZQorICAgICAgJiYgZXh0cmFjdF9mZmYodW5pdF9hZGRyZXNzKSA9PSAwCisgICAgICAmJiBleHRyYWN0X3JycnJycnJyKHVuaXRfYWRkcmVzcykgPT0gMAorICAgICAgJiYgZXh0cmFjdF9oaF9oaCh1bml0X2FkZHJlc3MpID09IDAKKyAgICAgICYmIGV4dHJhY3RfbGxfbGwodW5pdF9hZGRyZXNzKSA9PSAwKSB7CisgICAgLyogREQgLSBDb25maWd1cmF0aW9uIFNwYWNlIGFkZHJlc3MgKi8KKyAgICBzcHJpbnRmKGJ1ZiwgIiV4IiwKKwkgICAgZXh0cmFjdF9kZGRkZCh1bml0X2FkZHJlc3MpKTsKKyAgfQorICBlbHNlIGlmIChleHRyYWN0X3NzKHVuaXRfYWRkcmVzcykgPT0gc3NfY29uZmlnX2NvZGUKKwkgICAmJiBleHRyYWN0X2ZmZih1bml0X2FkZHJlc3MpICE9IDAKKwkgICAmJiBleHRyYWN0X3JycnJycnJyKHVuaXRfYWRkcmVzcykgPT0gMAorCSAgICYmIGV4dHJhY3RfaGhfaGgodW5pdF9hZGRyZXNzKSA9PSAwCisJICAgJiYgZXh0cmFjdF9sbF9sbCh1bml0X2FkZHJlc3MpID09IDApIHsKKyAgICAvKiBERCxGIC0gQ29uZmlndXJhdGlvbiBTcGFjZSAqLworICAgIHNwcmludGYoYnVmLCAiJXgsJWQiLAorCSAgICBleHRyYWN0X2RkZGRkKHVuaXRfYWRkcmVzcyksCisJICAgIGV4dHJhY3RfZmZmKHVuaXRfYWRkcmVzcykpOworICB9CisgIGVsc2UgaWYgKGV4dHJhY3Rfc3ModW5pdF9hZGRyZXNzKSA9PSBzc19pb19jb2RlCisJICAgJiYgZXh0cmFjdF9oaF9oaCh1bml0X2FkZHJlc3MpID09IDApIHsKKyAgICAvKiBbbl1pW3RdREQsRixSUixOTk5OTk5OTiAtIDMyYml0IEkvTyBzcGFjZSAqLworICAgIHNwcmludGYoYnVmLCAiJXNpJXMleCwlZCwleCwleCIsCisJICAgIGV4dHJhY3Rfbih1bml0X2FkZHJlc3MpID8gIm4iIDogIiIsCisJICAgIGV4dHJhY3RfdCh1bml0X2FkZHJlc3MpID8gInQiIDogIiIsCisJICAgIGV4dHJhY3RfZGRkZGQodW5pdF9hZGRyZXNzKSwKKwkgICAgZXh0cmFjdF9mZmYodW5pdF9hZGRyZXNzKSwKKwkgICAgZXh0cmFjdF9ycnJycnJycih1bml0X2FkZHJlc3MpLAorCSAgICBleHRyYWN0X2xsX2xsKHVuaXRfYWRkcmVzcykpOworICB9CisgIGVsc2UgaWYgKGV4dHJhY3Rfc3ModW5pdF9hZGRyZXNzKSA9PSBzc18zMmJpdF9tZW1vcnlfY29kZQorCSAgICYmIGV4dHJhY3RfaGhfaGgodW5pdF9hZGRyZXNzKSA9PSAwKSB7CisgICAgLyogW25dbVt0XVtwXURELEYsUlIsTk5OTk5OTk4gLSAzMmJpdCBtZW1vcnkgc3BhY2UgKi8KKyAgICBzcHJpbnRmKGJ1ZiwgIiVzbSVzJXMleCwlZCwleCwleCIsCisJICAgIGV4dHJhY3Rfbih1bml0X2FkZHJlc3MpID8gIm4iIDogIiIsCisJICAgIGV4dHJhY3RfdCh1bml0X2FkZHJlc3MpID8gInQiIDogIiIsCisJICAgIGV4dHJhY3RfcCh1bml0X2FkZHJlc3MpID8gInAiIDogIiIsCisJICAgIGV4dHJhY3RfZGRkZGQodW5pdF9hZGRyZXNzKSwKKwkgICAgZXh0cmFjdF9mZmYodW5pdF9hZGRyZXNzKSwKKwkgICAgZXh0cmFjdF9ycnJycnJycih1bml0X2FkZHJlc3MpLAorCSAgICBleHRyYWN0X2xsX2xsKHVuaXRfYWRkcmVzcykpOworICB9CisgIGVsc2UgaWYgKGV4dHJhY3Rfc3ModW5pdF9hZGRyZXNzKSA9PSBzc18zMmJpdF9tZW1vcnlfY29kZSkgeworICAgIC8qIFtuXXhbcF1ERCxGLFJSLE5OTk5OTk5OTk5OTk5OTk4gLSA2NGJpdCBtZW1vcnkgc3BhY2UgKi8KKyAgICBzcHJpbnRmKGJ1ZiwgIiVzeCVzJXgsJWQsJXgsJXglMDh4IiwKKwkgICAgZXh0cmFjdF9uKHVuaXRfYWRkcmVzcykgPyAibiIgOiAiIiwKKwkgICAgZXh0cmFjdF9wKHVuaXRfYWRkcmVzcykgPyAicCIgOiAiIiwKKwkgICAgZXh0cmFjdF9kZGRkZCh1bml0X2FkZHJlc3MpLAorCSAgICBleHRyYWN0X2ZmZih1bml0X2FkZHJlc3MpLAorCSAgICBleHRyYWN0X3JycnJycnJyKHVuaXRfYWRkcmVzcyksCisJICAgIGV4dHJhY3RfaGhfaGgodW5pdF9hZGRyZXNzKSwKKwkgICAgZXh0cmFjdF9sbF9sbCh1bml0X2FkZHJlc3MpKTsKKyAgfQorICBlbHNlIHsKKyAgICBkZXZpY2VfZXJyb3IobWUsICJJbnZhbGlkIFBDSSB1bml0IGFkZHJlc3MgMHglMDhseCAweCUwOGx4IDB4JTA4bHgiLAorCQkgKHVuc2lnbmVkIGxvbmcpdW5pdF9hZGRyZXNzLT5jZWxsc1swXSwKKwkJICh1bnNpZ25lZCBsb25nKXVuaXRfYWRkcmVzcy0+Y2VsbHNbMV0sCisJCSAodW5zaWduZWQgbG9uZyl1bml0X2FkZHJlc3MtPmNlbGxzWzJdKTsKKyAgfQorICBpZiAoc3RybGVuKGJ1ZikgPiBzaXplb2ZfYnVmKQorICAgIGVycm9yKCJidWZmZXIgb3ZlcmZsb3ciKTsKKyAgcmV0dXJuIHN0cmxlbihidWYpOworfQorCisKK3N0YXRpYyBpbnQKK2h3X3BoYl9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzKGRldmljZSAqbWUsCisJCQkJIGNvbnN0IGRldmljZV91bml0ICphZGRyZXNzLAorCQkJCSBpbnQgKmF0dGFjaF9zcGFjZSwKKwkJCQkgdW5zaWduZWRfd29yZCAqYXR0YWNoX2FkZHJlc3MsCisJCQkJIGRldmljZSAqY2xpZW50KQoreworICBpZiAoYWRkcmVzcy0+bnJfY2VsbHMgIT0gMykKKyAgICBkZXZpY2VfZXJyb3IobWUsICJhdHRhY2ggYWRkcmVzcyBoYXMgaW5jb3JyZWN0IG51bWJlciBvZiBjZWxscyIpOworICBpZiAoYWRkcmVzcy0+Y2VsbHNbMV0gIT0gMCkKKyAgICBkZXZpY2VfZXJyb3IobWUsICI2NGJpdCBhdHRhY2ggYWRkcmVzcyB1bnN1cHBvcnRlZCIpOworCisgIC8qIGRpcmVjdGx5IGRlY29kZSB0aGUgYWRkcmVzcy9zcGFjZSAqLworICAqYXR0YWNoX2FkZHJlc3MgPSBhZGRyZXNzLT5jZWxsc1syXTsKKyAgc3dpdGNoIChleHRyYWN0X3NzKGFkZHJlc3MpKSB7CisgIGNhc2Ugc3NfY29uZmlnX2NvZGU6CisgICAgKmF0dGFjaF9zcGFjZSA9IGh3X3BoYl9jb25maWdfc3BhY2U7CisgICAgYnJlYWs7CisgIGNhc2Ugc3NfaW9fY29kZToKKyAgICAqYXR0YWNoX3NwYWNlID0gaHdfcGhiX2lvX3NwYWNlOworICAgIGJyZWFrOworICBjYXNlIHNzXzMyYml0X21lbW9yeV9jb2RlOgorICBjYXNlIHNzXzY0Yml0X21lbW9yeV9jb2RlOgorICAgICphdHRhY2hfc3BhY2UgPSBod19waGJfbWVtb3J5X3NwYWNlOworICAgIGJyZWFrOworICB9CisKKyAgLyogaWYgbm9uLXJlbG9jYXRhYmxlIGZpbmlzaGVkICovCisgIGlmIChleHRyYWN0X24oYWRkcmVzcykpCisgICAgcmV0dXJuIDE7CisKKyAgLyogbWFrZSBtZW1vcnkgYW5kIEkvTyBhZGRyZXNzZXMgYWJzb2x1dGUgKi8KKyAgaWYgKCphdHRhY2hfc3BhY2UgPT0gaHdfcGhiX2lvX3NwYWNlCisgICAgICB8fCAqYXR0YWNoX3NwYWNlID09IGh3X3BoYl9tZW1vcnlfc3BhY2UpIHsKKyAgICBpbnQgcmVnX25yOworICAgIHJlZ19wcm9wZXJ0eV9zcGVjIGFzc2lnbmVkOworICAgIGlmIChleHRyYWN0X3NzKGFkZHJlc3MpID09IHNzXzY0Yml0X21lbW9yeV9jb2RlKQorICAgICAgZGV2aWNlX2Vycm9yKG1lLCAiNjRiaXQgbWVtb3J5IGFkZHJlc3Mgbm90IHVuc3Vwb3J0ZWQiKTsKKyAgICBmb3IgKHJlZ19uciA9IDA7CisJIGRldmljZV9maW5kX3JlZ19hcnJheV9wcm9wZXJ0eShjbGllbnQsICJhc3NpZ25lZC1hZGRyZXNzZXMiLCByZWdfbnIsCisJCQkJCSZhc3NpZ25lZCk7CisJIHJlZ19ucisrKSB7CisgICAgICBpZiAoIWV4dHJhY3RfbigmYXNzaWduZWQuYWRkcmVzcykKKwkgIHx8IGV4dHJhY3RfcnJycnJycnIoJmFzc2lnbmVkLmFkZHJlc3MpID09IDApCisJZGV2aWNlX2Vycm9yKG1lLCAiY2xpZW50ICVzIGhhcyBpbnZhbGlkIGFzc2lnbmVkLWFkZHJlc3MgcHJvcGVydHkiLAorCQkgICAgIGRldmljZV9wYXRoKGNsaWVudCkpOworICAgICAgaWYgKGV4dHJhY3RfcnJycnJycnIoYWRkcmVzcykgPT0gZXh0cmFjdF9ycnJycnJycigmYXNzaWduZWQuYWRkcmVzcykpIHsKKwkvKiBjb3JyZXNwb25kaW5nIGJhc2UgcmVnaXN0ZXIgKi8KKwlpZiAoZXh0cmFjdF9zcyhhZGRyZXNzKSAhPSBleHRyYWN0X3NzKCZhc3NpZ25lZC5hZGRyZXNzKSkKKwkgIGRldmljZV9lcnJvcihtZSwgImNsaWVudCAlcyBoYXMgY29uZmxpY3RpbmcgdHlwZXMgZm9yIGJhc2UgcmVnaXN0ZXIgMHglbHgiLAorCQkgICAgICAgZGV2aWNlX3BhdGgoY2xpZW50KSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKWV4dHJhY3RfcnJycnJycnIoYWRkcmVzcykpOworCSphdHRhY2hfYWRkcmVzcyArPSBhc3NpZ25lZC5hZGRyZXNzLmNlbGxzWzJdOworCXJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgICBkZXZpY2VfZXJyb3IobWUsICJjbGllbnQgJXMgbWlzc2luZyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgMHglbHggaW4gYXNzaWduZWQtYWRkcmVzc2VzIHByb3BlcnR5IiwKKwkJIGRldmljZV9wYXRoKGNsaWVudCksCisJCSAodW5zaWduZWQgbG9uZylleHRyYWN0X3JycnJycnJyKGFkZHJlc3MpKTsKKyAgfQorICAKKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAoraHdfcGhiX3NpemVfdG9fYXR0YWNoX3NpemUoZGV2aWNlICptZSwKKwkJCSAgIGNvbnN0IGRldmljZV91bml0ICpzaXplLAorCQkJICAgdW5zaWduZWQgKm5yX2J5dGVzLAorCQkJICAgZGV2aWNlICpjbGllbnQpCit7CisgIGlmIChzaXplLT5ucl9jZWxscyAhPSAyKQorICAgIGRldmljZV9lcnJvcihtZSwgInNpemUgaGFzIGluY29ycmVjdCBudW1iZXIgb2YgY2VsbHMiKTsKKyAgaWYgKHNpemUtPmNlbGxzWzBdICE9IDApCisgICAgZGV2aWNlX2Vycm9yKG1lLCAiNjRiaXQgc2l6ZSB1bnN1cHBvcnRlZCIpOworICAqbnJfYnl0ZXMgPSBzaXplLT5jZWxsc1sxXTsKKyAgcmV0dXJuIHNpemUtPmNlbGxzWzFdOworfQorCisKK3N0YXRpYyBjb25zdCBwaGJfc3BhY2UgKgorZmluZF9waGJfc3BhY2UoaHdfcGhiX2RldmljZSAqcGhiLAorCSAgICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCisJICAgICAgIHVuc2lnbmVkIG5yX2J5dGVzKQoreworICBod19waGJfc3BhY2VzIHNwYWNlOworICAvKiBmaW5kIHRoZSBzcGFjZSB0aGF0IG1hdGNoZXMgdGhlIGFkZHJlc3MgKi8KKyAgZm9yIChzcGFjZSA9IDA7IHNwYWNlIDwgbnJfaHdfcGhiX3NwYWNlczsgc3BhY2UrKykgeworICAgIHBoYl9zcGFjZSAqcGNpX3NwYWNlID0gJnBoYi0+c3BhY2Vbc3BhY2VdOworICAgIGlmIChhZGRyID49IHBjaV9zcGFjZS0+cGFyZW50X2Jhc2UKKwkmJiAoYWRkciArIG5yX2J5dGVzKSA8PSAocGNpX3NwYWNlLT5wYXJlbnRfYmFzZSArIHBjaV9zcGFjZS0+c2l6ZSkpIHsKKyAgICAgIHJldHVybiBwY2lfc3BhY2U7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB1bnNpZ25lZF93b3JkCittYXBfcGhiX2FkZHIoY29uc3QgcGhiX3NwYWNlICpzcGFjZSwKKwkgICAgIHVuc2lnbmVkX3dvcmQgYWRkcikKK3sKKyAgcmV0dXJuIGFkZHIgLSBzcGFjZS0+cGFyZW50X2Jhc2UgKyBzcGFjZS0+bXlfYmFzZTsKK30KKworCisKK3N0YXRpYyB1bnNpZ25lZAoraHdfcGhiX2lvX3JlYWRfYnVmZmVyKGRldmljZSAqbWUsCisJCSAgICAgIHZvaWQgKmRlc3QsCisJCSAgICAgIGludCBzcGFjZSwKKwkJICAgICAgdW5zaWduZWRfd29yZCBhZGRyLAorCQkgICAgICB1bnNpZ25lZCBucl9ieXRlcywKKwkJICAgICAgY3B1ICpwcm9jZXNzb3IsCisJCSAgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBod19waGJfZGV2aWNlICpwaGIgPSAoaHdfcGhiX2RldmljZSopZGV2aWNlX2RhdGEobWUpOworICBjb25zdCBwaGJfc3BhY2UgKnBjaV9zcGFjZSA9IGZpbmRfcGhiX3NwYWNlKHBoYiwgYWRkciwgbnJfYnl0ZXMpOworICB1bnNpZ25lZF93b3JkIGJ1c19hZGRyOworICBpZiAocGNpX3NwYWNlID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisgIGJ1c19hZGRyID0gbWFwX3BoYl9hZGRyKHBjaV9zcGFjZSwgYWRkcik7CisgIERUUkFDRShwaGIsICgiaW8gcmVhZCAtICVkOjB4JWx4IC0+ICVzOjB4JWx4ICgldSBieXRlcylcbiIsCisJICAgICAgIHNwYWNlLCAodW5zaWduZWQgbG9uZylhZGRyLCBwY2lfc3BhY2UtPm5hbWUsICh1bnNpZ25lZCBsb25nKWJ1c19hZGRyLAorCSAgICAgICBucl9ieXRlcykpOworICByZXR1cm4gY29yZV9tYXBfcmVhZF9idWZmZXIocGNpX3NwYWNlLT5yZWFkYWJsZSwKKwkJCSAgICAgIGRlc3QsIGJ1c19hZGRyLCBucl9ieXRlcyk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkCitod19waGJfaW9fd3JpdGVfYnVmZmVyKGRldmljZSAqbWUsCisJCSAgICAgICBjb25zdCB2b2lkICpzb3VyY2UsCisJCSAgICAgICBpbnQgc3BhY2UsCisJCSAgICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCisJCSAgICAgICB1bnNpZ25lZCBucl9ieXRlcywKKwkJICAgICAgIGNwdSAqcHJvY2Vzc29yLAorCQkgICAgICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGh3X3BoYl9kZXZpY2UgKnBoYiA9IChod19waGJfZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7CisgIGNvbnN0IHBoYl9zcGFjZSAqcGNpX3NwYWNlID0gZmluZF9waGJfc3BhY2UocGhiLCBhZGRyLCBucl9ieXRlcyk7CisgIHVuc2lnbmVkX3dvcmQgYnVzX2FkZHI7CisgIGlmIChwY2lfc3BhY2UgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKyAgYnVzX2FkZHIgPSBtYXBfcGhiX2FkZHIocGNpX3NwYWNlLCBhZGRyKTsKKyAgRFRSQUNFKHBoYiwgKCJpbyB3cml0ZSAtICVkOjB4JWx4IC0+ICVzOjB4JWx4ICgldSBieXRlcylcbiIsCisJICAgICAgIHNwYWNlLCAodW5zaWduZWQgbG9uZylhZGRyLCBwY2lfc3BhY2UtPm5hbWUsICh1bnNpZ25lZCBsb25nKWJ1c19hZGRyLAorCSAgICAgICBucl9ieXRlcykpOworICByZXR1cm4gY29yZV9tYXBfd3JpdGVfYnVmZmVyKHBjaV9zcGFjZS0+d3JpdGVhYmxlLCBzb3VyY2UsCisJCQkgICAgICAgYnVzX2FkZHIsIG5yX2J5dGVzKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQKK2h3X3BoYl9kbWFfcmVhZF9idWZmZXIoZGV2aWNlICptZSwKKwkJICAgICAgIHZvaWQgKmRlc3QsCisJCSAgICAgICBpbnQgc3BhY2UsCisJCSAgICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCisJCSAgICAgICB1bnNpZ25lZCBucl9ieXRlcykKK3sKKyAgaHdfcGhiX2RldmljZSAqcGhiID0gKGh3X3BoYl9kZXZpY2UqKWRldmljZV9kYXRhKG1lKTsKKyAgY29uc3QgcGhiX3NwYWNlICpwY2lfc3BhY2U7CisgIC8qIGZpbmQgdGhlIHNwYWNlICovCisgIGlmIChzcGFjZSAhPSBod19waGJfbWVtb3J5X3NwYWNlKQorICAgIGRldmljZV9lcnJvcihtZSwgImludmFsaWQgZG1hIGFkZHJlc3Mgc3BhY2UgJWQiLCBzcGFjZSk7CisgIHBjaV9zcGFjZSA9ICZwaGItPnNwYWNlW3NwYWNlXTsKKyAgLyogY2hlY2sgb3V0IHRoZSBhZGRyZXNzICovCisgIGlmICgoYWRkciA+PSBwY2lfc3BhY2UtPm15X2Jhc2UKKyAgICAgICAmJiBhZGRyIDw9IHBjaV9zcGFjZS0+bXlfYmFzZSArIHBjaV9zcGFjZS0+c2l6ZSkKKyAgICAgIHx8IChhZGRyICsgbnJfYnl0ZXMgPj0gcGNpX3NwYWNlLT5teV9iYXNlCisJICAmJiBhZGRyICsgbnJfYnl0ZXMgPD0gcGNpX3NwYWNlLT5teV9iYXNlICsgcGNpX3NwYWNlLT5zaXplKSkKKyAgICBkZXZpY2VfZXJyb3IobWUsICJEbyBub3Qgc3VwcG9ydCBETUEgaW50byBvd24gYnVzIik7CisgIC8qIGRvIGl0ICovCisgIERUUkFDRShwaGIsICgiZG1hIHJlYWQgLSAlczoweCVseCAoJWQgYnl0ZXMpXG4iLAorCSAgICAgICBwY2lfc3BhY2UtPm5hbWUsIGFkZHIsIG5yX2J5dGVzKSk7CisgIHJldHVybiBkZXZpY2VfZG1hX3JlYWRfYnVmZmVyKGRldmljZV9wYXJlbnQobWUpLAorCQkJCWRlc3QsIHBjaV9zcGFjZS0+cGFyZW50X3NwYWNlLAorCQkJCWFkZHIsIG5yX2J5dGVzKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQKK2h3X3BoYl9kbWFfd3JpdGVfYnVmZmVyKGRldmljZSAqbWUsCisJCQljb25zdCB2b2lkICpzb3VyY2UsCisJCQlpbnQgc3BhY2UsCisJCQl1bnNpZ25lZF93b3JkIGFkZHIsCisJCQl1bnNpZ25lZCBucl9ieXRlcywKKwkJCWludCB2aW9sYXRlX3JlYWRfb25seV9zZWN0aW9uKQoreworICBod19waGJfZGV2aWNlICpwaGIgPSAoaHdfcGhiX2RldmljZSopZGV2aWNlX2RhdGEobWUpOworICBjb25zdCBwaGJfc3BhY2UgKnBjaV9zcGFjZTsKKyAgLyogZmluZCB0aGUgc3BhY2UgKi8KKyAgaWYgKHNwYWNlICE9IGh3X3BoYl9tZW1vcnlfc3BhY2UpCisgICAgZGV2aWNlX2Vycm9yKG1lLCAiaW52YWxpZCBkbWEgYWRkcmVzcyBzcGFjZSAlZCIsIHNwYWNlKTsKKyAgcGNpX3NwYWNlID0gJnBoYi0+c3BhY2Vbc3BhY2VdOworICAvKiBjaGVjayBvdXQgdGhlIGFkZHJlc3MgKi8KKyAgaWYgKChhZGRyID49IHBjaV9zcGFjZS0+bXlfYmFzZQorICAgICAgICYmIGFkZHIgPD0gcGNpX3NwYWNlLT5teV9iYXNlICsgcGNpX3NwYWNlLT5zaXplKQorICAgICAgfHwgKGFkZHIgKyBucl9ieXRlcyA+PSBwY2lfc3BhY2UtPm15X2Jhc2UKKwkgICYmIGFkZHIgKyBucl9ieXRlcyA8PSBwY2lfc3BhY2UtPm15X2Jhc2UgKyBwY2lfc3BhY2UtPnNpemUpKQorICAgIGRldmljZV9lcnJvcihtZSwgIkRvIG5vdCBzdXBwb3J0IERNQSBpbnRvIG93biBidXMiKTsKKyAgLyogZG8gaXQgKi8KKyAgRFRSQUNFKHBoYiwgKCJkbWEgd3JpdGUgLSAlczoweCVseCAoJWQgYnl0ZXMpXG4iLAorCSAgICAgICBwY2lfc3BhY2UtPm5hbWUsIGFkZHIsIG5yX2J5dGVzKSk7CisgIHJldHVybiBkZXZpY2VfZG1hX3dyaXRlX2J1ZmZlcihkZXZpY2VfcGFyZW50KG1lKSwKKwkJCQkgc291cmNlLCBwY2lfc3BhY2UtPnBhcmVudF9zcGFjZSwKKwkJCQkgYWRkciwgbnJfYnl0ZXMsCisJCQkJIHZpb2xhdGVfcmVhZF9vbmx5X3NlY3Rpb24pOworfQorCisKK3N0YXRpYyBkZXZpY2VfY2FsbGJhY2tzIGNvbnN0IGh3X3BoYl9jYWxsYmFja3MgPSB7CisgIHsgaHdfcGhiX2luaXRfYWRkcmVzcywgfSwKKyAgeyBod19waGJfYXR0YWNoX2FkZHJlc3MsIH0sCisgIHsgaHdfcGhiX2lvX3JlYWRfYnVmZmVyLCBod19waGJfaW9fd3JpdGVfYnVmZmVyIH0sCisgIHsgaHdfcGhiX2RtYV9yZWFkX2J1ZmZlciwgaHdfcGhiX2RtYV93cml0ZV9idWZmZXIgfSwKKyAgeyBOVUxMLCB9LCAvKiBpbnRlcnJ1cHQgKi8KKyAgeyBod19waGJfdW5pdF9kZWNvZGUsCisgICAgaHdfcGhiX3VuaXRfZW5jb2RlLAorICAgIGh3X3BoYl9hZGRyZXNzX3RvX2F0dGFjaF9hZGRyZXNzLAorICAgIGh3X3BoYl9zaXplX3RvX2F0dGFjaF9zaXplIH0KK307CisKKworc3RhdGljIHZvaWQgKgoraHdfcGhiX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLAorCSAgICAgIGNvbnN0IGRldmljZV91bml0ICp1bml0X2FkZHJlc3MsCisJICAgICAgY29uc3QgY2hhciAqYXJncykKK3sKKyAgLyogY3JlYXRlIHRoZSBkZXNjcmlwdG9yICovCisgIGh3X3BoYl9kZXZpY2UgKnBoYiA9IFpBTExPQyhod19waGJfZGV2aWNlKTsKKworICAvKiBjcmVhdGUgdGhlIGNvcmUgbWFwcyBub3cgKi8KKyAgaHdfcGhiX3NwYWNlcyBzcGFjZV9ucjsKKyAgZm9yIChzcGFjZV9uciA9IDA7IHNwYWNlX25yIDwgbnJfaHdfcGhiX3NwYWNlczsgc3BhY2VfbnIrKykgeworICAgIHBoYl9zcGFjZSAqcGNpX3NwYWNlID0gJnBoYi0+c3BhY2Vbc3BhY2VfbnJdOworICAgIHBjaV9zcGFjZS0+bWFwID0gY29yZV9jcmVhdGUoKTsKKyAgICBwY2lfc3BhY2UtPnJlYWRhYmxlID0gY29yZV9yZWFkYWJsZShwY2lfc3BhY2UtPm1hcCk7CisgICAgcGNpX3NwYWNlLT53cml0ZWFibGUgPSBjb3JlX3dyaXRlYWJsZShwY2lfc3BhY2UtPm1hcCk7CisgICAgc3dpdGNoIChzcGFjZV9ucikgeworICAgIGNhc2UgaHdfcGhiX21lbW9yeV9zcGFjZToKKyAgICAgIHBjaV9zcGFjZS0+bmFtZSA9ICJtZW1vcnkiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBod19waGJfaW9fc3BhY2U6CisgICAgICBwY2lfc3BhY2UtPm5hbWUgPSAiSS9PIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgaHdfcGhiX2NvbmZpZ19zcGFjZToKKyAgICAgIHBjaV9zcGFjZS0+bmFtZSA9ICJjb25maWciOworICAgICAgYnJlYWs7CisgICAgY2FzZSBod19waGJfc3BlY2lhbF9zcGFjZToKKyAgICAgIHBjaV9zcGFjZS0+bmFtZSA9ICJzcGVjaWFsIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvciAoImludGVybmFsIGVycm9yIik7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gcGhiOworfQorCisKK2NvbnN0IGRldmljZV9kZXNjcmlwdG9yIGh3X3BoYl9kZXZpY2VfZGVzY3JpcHRvcltdID0geworICB7ICJwaGIiLCBod19waGJfY3JlYXRlLCAmaHdfcGhiX2NhbGxiYWNrcyB9LAorICB7ICJwY2kiLCBOVUxMLCAmaHdfcGhiX2NhbGxiYWNrcyB9LAorICB7IE5VTEwsIH0sCit9OworCisjZW5kaWYgLyogX0hXX1BIQl8gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvaHdfcGhiLmggYi9zaW0vcHBjL2h3X3BoYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMGZlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2h3X3BoYi5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgX0hXX1BIQl9IXworI2RlZmluZSBfSFdfUEhCX0hfCisKK3R5cGVkZWYgZW51bSB7CisgIGh3X3BoYl9tZW1vcnlfc3BhY2UsCisgIGh3X3BoYl9pb19zcGFjZSwKKyAgaHdfcGhiX2NvbmZpZ19zcGFjZSwKKyAgaHdfcGhiX3NwZWNpYWxfc3BhY2UsCisgIG5yX2h3X3BoYl9zcGFjZXMsCit9IGh3X3BoYl9zcGFjZXM7CisKK3R5cGVkZWYgZW51bSAgeworICBod19waGJfbm9ybWFsX2RlY29kZSA9IGF0dGFjaF9jYWxsYmFjaywKKyAgaHdfcGhiX3N1YnRyYWN0aXZlX2RlY29kZSwKKyAgaHdfcGhiX21hc3Rlcl9hYm9ydF9kZWNvZGUsCit9IGh3X3BoYl9kZWNvZGU7CisKKworI2VuZGlmIC8qIF9IV19QSEJfSF8gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvaHdfcmVnaXN0ZXIuYyBiL3NpbS9wcGMvaHdfcmVnaXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzYxZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9od19yZWdpc3Rlci5jCkBAIC0wLDAgKzEsMTMxIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKyAgICAKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKyAgICAKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgICAgCisgICAgKi8KKworCisjaWZuZGVmIF9IV19SRUdJU1RFUl9DXworI2RlZmluZSBfSFdfUkVHSVNURVJfQ18KKworI2luY2x1ZGUgImRldmljZV90YWJsZS5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInBzaW0uaCIKKworLyogREVWSUNFCisKKworICAgcmVnaXN0ZXIgLSBkdW1teSBkZXZpY2UgdG8gaW5pdGlhbGl6ZSBwcm9jZXNzb3IgcmVnaXN0ZXJzCisKKworICAgREVTQ1JJUFRJT04KKworICAgVGhlIHByb3BlcnRpZXMgb2YgdGhpcyBkZXZpY2UgYXJlIHVzZWQsIGR1cmluZyBpbml0aWFsaXphdGlvbiwgdG8KKyAgIHNwZWNpZnkgdGhlIGluaXRpYWwgdmFsdWUgb2YgdmFyaW91cyBwcm9jZXNzb3IgcmVnaXN0ZXJzLiAgVGhlCisgICBwcm9wZXJ0eSBuYW1lIHNwZWNpZnlpbmcgdGhlIHJlZ2lzdGVyIHRvIGJlIGluaXRpYWxpemVkIHdpdGggdGhlCisgICBzcGVjaWFsIGZvcm0gPGNwdS1ucj4uPHJlZ2lzdGVyPiBiZWluZyB1c2VkIHRvIGluaXRpYWxpemUgYQorICAgc3BlY2lmaWMgcHJvY2Vzc29yJ3MgcmVnaXN0ZXIgKGVnIDAucGMpLgorCisgICBCZWNhdXNlLCB3aGVuIHRoZSBkZXZpY2UgdHJlZSBpcyBjcmVhdGVkLCBvdmVycmlkaW5nIHByb3BlcnRpZXMgYXJlCisgICBlbnRlcmVkIGludG8gdGhlIHRyZWUgYmVmb3JlIGFueSBkZWZhdWx0IHZhbHVlcywgdGhpcyBkZXZpY2UgbXVzdAorICAgaW5pdGlhbGl6ZSByZWdpc3RlcnMgaW4gbmV3ZXN0IChkZWZhdWx0KSB0byBvbGRlc3QgKG92ZXJyaWRpbmcpCisgICBwcm9wZXJ0eSBvcmRlci4KKworICAgVGhlIGFjdHVhbCByZWdpc3RlcnMgKGZvciBhIGdpdmVuIHRhcmdldCkgYXJlIGRlZmluZWQgaW4gdGhlIGZpbGUKKyAgIHJlZ2lzdGVycy5jLgorCisgICBUaGlzIGRldmljZSBpcyBub3JtYWxseSBhIGNoaWxkIG9mIHRoZSAvb3BlbnByb20vaW5pdCBub2RlLgorCisKKyAgIEVYQU1QTEVTCisKKworICAgR2l2ZW4gYSBkZXZpY2UgdHJlZSBjb250YWluaW5nIHRoZSBlbnRyeToKKworICAgfAkvb3BlbnByb20vaW5pdC9yZWdpc3Rlci9wYyAweGZmZjAwY2YwCisKKyAgIHRoZW4gc3BlY2lmeWluZyB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbjoKKworICAgfAktbyAnL29wZW5wcm9tL2luaXQvcmVnaXN0ZXIvcGMgMHgwJworCisgICB3b3VsZCBvdmVycmlkZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBwcm9jZXNzb3IgemVybydzIHByb2dyYW0KKyAgIGNvdW50ZXIuICBUaGUgcmVzdWx0YW50IGRldmljZSB0cmVlIHRyZWUgY29udGFpbmluZzoKKworICAgfAkvb3BlbnByb20vaW5pdC9yZWdpc3Rlci8wLnBjIDB4MAorICAgfAkvb3BlbnByb20vaW5pdC9yZWdpc3Rlci9wYyAweGZmZjAwY2YwCisKKyAgIGFuZCB3b3VsZCBiZSBwcm9jZXNzZWQgbGFzdCB0byBmaXJzdCByZXN1bHRpbmcgaW4gdGhlIHNlcXVlbmNlOiBzZXQKKyAgIGFsbCBwcm9ncmFtIGNvdW50ZXJzIHRvIDB4ZmZmMDBjZjA7IHNldCBwcm9jZXNzb3IgemVybydzIHByb2dyYW0KKyAgIGNvdW50ZXIgdG8gemVyby4KKworICAgKi8KKworc3RhdGljIHZvaWQKK2RvX3JlZ2lzdGVyX2luaXQoZGV2aWNlICptZSwKKwkJIGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqcHJvcCkKK3sKKyAgcHNpbSAqc3lzdGVtID0gZGV2aWNlX3N5c3RlbShtZSk7CisgIGlmIChwcm9wICE9IE5VTEwpIHsKKyAgICBjb25zdCBjaGFyICpuYW1lID0gcHJvcC0+bmFtZTsKKyAgICB1bnNpZ25lZDMyIHZhbHVlID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgbmFtZSk7CisgICAgaW50IHByb2Nlc3NvcjsKKworICAgIGRvX3JlZ2lzdGVyX2luaXQobWUsIGRldmljZV9uZXh0X3Byb3BlcnR5KHByb3ApKTsKKworICAgIGlmIChzdHJjaHIobmFtZSwgJy4nKSA9PSBOVUxMKSB7CisgICAgICBwcm9jZXNzb3IgPSAtMTsKKyAgICAgIERUUkFDRShyZWdpc3RlciwgKCIlcz0weCVseFxuIiwgbmFtZSwgKHVuc2lnbmVkIGxvbmcpdmFsdWUpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBjaGFyICplbmQ7CisgICAgICBwcm9jZXNzb3IgPSBzdHJ0b3VsKG5hbWUsICZlbmQsIDApOworICAgICAgQVNTRVJUKGVuZFswXSA9PSAnLicpOworICAgICAgbmFtZSA9IGVuZCsxOworICAgICAgRFRSQUNFKHJlZ2lzdGVyLCAoIiVkLiVzPTB4JWx4XG4iLCBwcm9jZXNzb3IsIG5hbWUsCisJCQkodW5zaWduZWQgbG9uZyl2YWx1ZSkpOworICAgIH0gICAgCisgICAgcHNpbV93cml0ZV9yZWdpc3RlcihzeXN0ZW0sIHByb2Nlc3NvciwgLyogYWxsIHByb2Nlc3NvcnMgKi8KKwkJCSZ2YWx1ZSwKKwkJCW5hbWUsCisJCQljb29rZWRfdHJhbnNmZXIpOworICB9Cit9CisJCSAKKworc3RhdGljIHZvaWQKK3JlZ2lzdGVyX2luaXRfZGF0YV9jYWxsYmFjayhkZXZpY2UgKm1lKQoreworICBjb25zdCBkZXZpY2VfcHJvcGVydHkgKnByb3AgPSBkZXZpY2VfZmluZF9wcm9wZXJ0eShtZSwgTlVMTCk7CisgIGRvX3JlZ2lzdGVyX2luaXQobWUsIHByb3ApOworfQorCisKK3N0YXRpYyBkZXZpY2VfY2FsbGJhY2tzIGNvbnN0IHJlZ2lzdGVyX2NhbGxiYWNrcyA9IHsKKyAgeyBOVUxMLCByZWdpc3Rlcl9pbml0X2RhdGFfY2FsbGJhY2ssIH0sCisgIHsgTlVMTCwgfSwgLyogYWRkcmVzcyAqLworICB7IE5VTEwsIH0sIC8qIElPICovCisgIHsgTlVMTCwgfSwgLyogRE1BICovCisgIHsgTlVMTCwgfSwgLyogaW50ZXJydXB0ICovCisgIHsgTlVMTCwgfSwgLyogdW5pdCAqLworfTsKKworY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgaHdfcmVnaXN0ZXJfZGV2aWNlX2Rlc2NyaXB0b3JbXSA9IHsKKyAgeyAicmVnaXN0ZXIiLCBOVUxMLCAmcmVnaXN0ZXJfY2FsbGJhY2tzIH0sCisgIHsgTlVMTCB9LAorfTsKKworI2VuZGlmIF9IV19SRUdJU1RFUl9DXwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9od190cmFjZS5jIGIvc2ltL3BwYy9od190cmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NjQ4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2h3X3RyYWNlLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorICAgIAorICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorICAgIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgICAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAgICAKKyAgICAqLworCisKKyNpZm5kZWYgX0hXX1RSQUNFX0NfCisjZGVmaW5lIF9IV19UUkFDRV9DXworCisjaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qIERFVklDRQorCisgICB0cmFjZSAtIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgZHVtbXkgZGV2aWNlIHNwZWNpZnkgdHJhY2Ugb3B0aW9ucworCisgICBERVNDUklQVElPTgorCisgICBUaGUgcHJvcGVydGllcyBvZiB0aGlzIGRldmljZSBhcmUgdXNlZCwgZHVyaW5nIGluaXRpYWxpemF0aW9uLCB0bworICAgc3BlY2lmeSB0aGUgdmFsdWUgdmFyaW91cyBzaW11bGF0aW9uIHRyYWNlIG9wdGlvbnMuICBUaGUKKyAgIGluaXRpYWxpemF0aW9uIGNhbiBvY2N1cmUgaW1wbGljaXRseSAoZHVyaW5nIGRldmljZSB0cmVlIGluaXQpIG9yCisgICBleHBsaWNpdGx5IHVzaW5nIHRoaXMgZGV2aWNlcyBpb2N0bCBtZXRob2QuCisKKyAgIFRoZSBhY3R1YWwgb3B0aW9ucyBhbmQgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGZvciBhIGdpdmVuIHRhcmdldCkKKyAgIGFyZSBkZWZpbmVkIGluIHRoZSBmaWxlIGRlYnVnLgorCisgICBUaGlzIGRldmljZSBpcyBub3JtYWxseSBhIGNoaWxkIG9mIHRoZSAvb3BlbnByb20gbm9kZS4KKworICAgRVhBTVBMRQorCisgICBUaGUgdHJhY2Ugb3B0aW9uIGR1bXAtZGV2aWNlLXRyZWUgY2FuIGJlIGVuYWJsZWQgYnkgc3BlY2lmeWluZyB0aGUKKyAgIG9wdGlvbjoKKworICAgfAktbyAnL29wZW5wcm9tL3RyYWNlL2R1bXAtZGV2aWNlLXRyZWUgMHgxJworCisgICBBbHRlcm5hdGl2bHkgdGhlIHNob3J0aGFuZCB2ZXJzaW9uOgorCisgICB8CS10IGR1bXAtZGV2aWNlLXRyZWUKKworICAgY2FuIGJlIHVzZWQuICovCisKKworLyogSG9vayB0byBhbGxvdyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHRyYWNlIG9wdGlvbnMgYXQgYW55IHRpbWUgKi8KKworc3RhdGljIGludAoraHdfdHJhY2VfaW9jdGwoZGV2aWNlICptZSwKKwkgICAgICAgY3B1ICpwcm9jZXNzb3IsCisJICAgICAgIHVuc2lnbmVkX3dvcmQgY2lhLAorCSAgICAgICBkZXZpY2VfaW9jdGxfcmVxdWVzdCByZXF1ZXN0LAorCSAgICAgICB2YV9saXN0IGFwKQoreworICBzd2l0Y2ggKHJlcXVlc3QpIHsKKyAgY2FzZSBkZXZpY2VfaW9jdGxfc2V0X3RyYWNlOgorICAgIHsKKyAgICAgIGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqcHJvcCA9IGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCBOVUxMKTsKKyAgICAgIHdoaWxlIChwcm9wICE9IE5VTEwpIHsKKwljb25zdCBjaGFyICpuYW1lID0gcHJvcC0+bmFtZTsKKwl1bnNpZ25lZDMyIHZhbHVlID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgbmFtZSk7CisJdHJhY2Vfb3B0aW9uKG5hbWUsIHZhbHVlKTsKKwlwcm9wID0gZGV2aWNlX25leHRfcHJvcGVydHkocHJvcCk7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGRldmljZV9lcnJvcihtZSwgImluc3VwcG9ydGVkIGlvY3RsIHJlcXVlc3QiKTsKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod190cmFjZV9jYWxsYmFja3MgPSB7CisgIHsgTlVMTCwgfSwgLyogaW5pdCAqLworICB7IE5VTEwsIH0sIC8qIGFkZHJlc3MgKi8KKyAgeyBOVUxMLCB9LCAvKiBJTyAqLworICB7IE5VTEwsIH0sIC8qIERNQSAqLworICB7IE5VTEwsIH0sIC8qIGludGVycnVwdCAqLworICB7IE5VTEwsIH0sIC8qIHVuaXQgKi8KKyAgTlVMTCwgLyogaW5zdGFuY2UtY3JlYXRlICovCisgIGh3X3RyYWNlX2lvY3RsLAorfTsKKworY29uc3QgZGV2aWNlX2Rlc2NyaXB0b3IgaHdfdHJhY2VfZGV2aWNlX2Rlc2NyaXB0b3JbXSA9IHsKKyAgeyAidHJhY2UiLCBOVUxMLCAmaHdfdHJhY2VfY2FsbGJhY2tzIH0sCisgIHsgTlVMTCB9LAorfTsKKworI2VuZGlmIF9IV19UUkFDRV9DXwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9od192bS5jIGIvc2ltL3BwYy9od192bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MmI4MDAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2h3X3ZtLmMKQEAgLTAsMCArMSwyNzUgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorICAgIAorICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorICAgIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgICAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAgICAKKyAgICAqLworCisKKyNpZm5kZWYgX0hXX1ZNX0NfCisjZGVmaW5lIF9IV19WTV9DXworCisjaW5jbHVkZSAiZGV2aWNlX3RhYmxlLmgiCisjaW5jbHVkZSAiY3B1LmgiCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworLyogREVWSUNFCisKKyAgIHZtIC0gdmlydHVhbCBtZW1vcnkgZGV2aWNlIGZvciB1c2VyIHNpbXVsYXRpb24gbW9kZXMKKworICAgREVTQ1JJUFRJT04KKworICAgSW4gdXNlciBtb2RlLCBtYXBwZWQgdGV4dCwgZGF0YSBhbmQgc3RhY2sgYWRkcmVzc2VzIGFyZSBtYW5hZ2VkIGJ5CisgICB0aGUgY29yZS4gIFVubWFwcGVkIGFkZHJlc3NlcyBhcmUgcGFzc2VkIG9udG8gdGhpcyBkZXZpY2UgKGJlY2F1c2UKKyAgIGl0IGVzdGFibGlzaGVzIGl0cyBzZWxmIGFzIHRoZSBmYWxsYmFjayBkZXZpY2UpIGZvciBwcm9jZXNzaW5nLgorCisgICBEdXJpbmcgaW5pdGlhbGl6YXRpb24sIGNoaWxkcmVuIG9mIHRoaXMgZGV2aWNlIHdpbGwgcmVxdWVzdCB0aGUKKyAgIG1hcHBpbmcgb2YgdGhlIGluaXRpYWwgdGV4dCBhbmQgZGF0YSBzZWdtZW50cy4gIFRob3NlIHJlcXVlc3RzIGFyZQorICAgcGFzc2VkIG9udG8gdGhlIGNvcmUgZGV2aWNlIHNvIHRoYXQgdGhhdCBtYXkgZXN0YWJsaXNoIHRoZSBpbml0aWFsCisgICBtZW1vcnkgcmVnaW9ucy4KKworICAgT25jZSB0aGUgc2ltdWxhdGlvbiBoYXMgc3RhcnRlZCAoYXMgbm90ZWQgYWJvdmUpIGFueSBhY2Nlc3MgdG8gYW4KKyAgIHVubWFwcGVkIGFkZHJlc3MgcmFuZ2Ugd2lsbCBiZSBwYXNzZWQgZG93biB0byB0aGlzIGRldmljZSBhcyBhbiBJTworICAgYWNjZXNzLiAgVGhpcyBkZXZpY2Ugd2lsbCB0aGVuIGVpdGhlciBhdHRhY2ggYWRkaXRpb25hbCBtZW1vcnkgdG8KKyAgIHRoZSBjb3JlIGRldmljZSBvciBzaWduYWwgdGhlIGFjY2VzcyBhcyBiZWluZyBpbnZhbGlkLgorCisgICBUaGUgSU9DVEwgZnVuY3Rpb24gaXMgdXNlZCB0byBub3RpZnkgdGhpcyBkZXZpY2Ugb2YgYW55IGNoYW5nZXMgdG8KKyAgIHRoZSB1c2VycyBgYnJrJyBwb2ludC4KKworICAgUFJPUEVSVElFUworCisgICBzdGFjay1iYXNlID0gPG51bWJlcj4KKworICAgU3BlY2lmaWVzIHRoZSBsb3dlciBhZGRyZXNzIG9mIHRoZSBzdGFjayBzZWdtZW50IGluIHRoZSB1c2VycworICAgdmlydHVhbCBhZGRyZXNzIHNwYWNlLiAgVGhlIGluaXRpYWwgc3RhY2sgcGFnZSBpcyBkZWZpbmVkIGJ5CisgICBzdGFjay1iYXNlICsgbnItYnl0ZXMuCisKKyAgIG5yLWJ5dGVzID0gPG51bWJlcj4KKworICAgU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHN0YWNrIHNlZ21lbnQgaW4gdGhlIHVzZXJzCisgICBhZGRyZXNzIHNwYWNlLgorCisgICAqLworCit0eXBlZGVmIHN0cnVjdCBfaHdfdm1fZGV2aWNlIHsKKyAgLyogYXJlYSBvZiBtZW1vcnkgdmFsaWQgZm9yIHN0YWNrIGFkZHJlc3NlcyAqLworICB1bnNpZ25lZF93b3JkIHN0YWNrX2Jhc2U7IC8qIG1pbiBwb3NzaWJsZSBzdGFjayB2YWx1ZSAqLworICB1bnNpZ25lZF93b3JkIHN0YWNrX2JvdW5kOworICB1bnNpZ25lZF93b3JkIHN0YWNrX2xvd2VyX2xpbWl0OworICAvKiBhcmVhIG9mIG1lbW9yeSB2YWxpZCBmb3IgaGVhcCBhZGRyZXNzZXMgKi8KKyAgdW5zaWduZWRfd29yZCBoZWFwX2Jhc2U7CisgIHVuc2lnbmVkX3dvcmQgaGVhcF9ib3VuZDsKKyAgdW5zaWduZWRfd29yZCBoZWFwX3VwcGVyX2xpbWl0OworfSBod192bV9kZXZpY2U7CisKKworc3RhdGljIHZvaWQKK2h3X3ZtX2luaXRfYWRkcmVzc19jYWxsYmFjayhkZXZpY2UgKm1lKQoreworICBod192bV9kZXZpY2UgKnZtID0gKGh3X3ZtX2RldmljZSopZGV2aWNlX2RhdGEobWUpOworCisgIC8qIHJldmVydCB0aGUgc3RhY2svaGVhcCB2YXJpYWJsZXMgdG8gdGhlaXIgZGVmYXVsdHMgKi8KKyAgdm0tPnN0YWNrX2Jhc2UgPSBkZXZpY2VfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KG1lLCAic3RhY2stYmFzZSIpOworICB2bS0+c3RhY2tfYm91bmQgPSAodm0tPnN0YWNrX2Jhc2UKKwkJICAgICArIGRldmljZV9maW5kX2ludGVnZXJfcHJvcGVydHkobWUsICJuci1ieXRlcyIpKTsKKyAgdm0tPnN0YWNrX2xvd2VyX2xpbWl0ID0gdm0tPnN0YWNrX2JvdW5kOworICB2bS0+aGVhcF9iYXNlID0gMDsKKyAgdm0tPmhlYXBfYm91bmQgPSAwOworICB2bS0+aGVhcF91cHBlcl9saW1pdCA9IDA7CisKKyAgLyogZXN0YWJsaXNoIHRoaXMgZGV2aWNlIGFzIHRoZSBkZWZhdWx0IG1lbW9yeSBoYW5kbGVyICovCisgIGRldmljZV9hdHRhY2hfYWRkcmVzcyhkZXZpY2VfcGFyZW50KG1lKSwKKwkJCWF0dGFjaF9jYWxsYmFjayArIDEsCisJCQkwIC8qYWRkcmVzcyBzcGFjZSAtIGlnbm9yZSovLAorCQkJMCAvKmFkZHIgLSBpZ25vcmUqLywKKwkJCSgoKHVuc2lnbmVkKTApLTEpIC8qbnJfYnl0ZXMgLSBpZ25vcmUqLywKKwkJCWFjY2Vzc19yZWFkX3dyaXRlIC8qYWNjZXNzKi8sCisJCQltZSk7Cit9CisKKworc3RhdGljIHZvaWQKK2h3X3ZtX2F0dGFjaF9hZGRyZXNzKGRldmljZSAqbWUsCisJCSAgICAgYXR0YWNoX3R5cGUgYXR0YWNoLAorCQkgICAgIGludCBzcGFjZSwKKwkJICAgICB1bnNpZ25lZF93b3JkIGFkZHIsCisJCSAgICAgdW5zaWduZWQgbnJfYnl0ZXMsCisJCSAgICAgYWNjZXNzX3R5cGUgYWNjZXNzLAorCQkgICAgIGRldmljZSAqY2xpZW50KSAvKmNhbGxiYWNrL2RlZmF1bHQqLworeworICBod192bV9kZXZpY2UgKnZtID0gKGh3X3ZtX2RldmljZSopZGV2aWNlX2RhdGEobWUpOworICAvKiB1cGRhdGUgZW5kIG9mIGJzcyBpZiBuZWNlc3NhcnkgKi8KKyAgaWYgKHZtLT5oZWFwX2Jhc2UgPCBhZGRyICsgbnJfYnl0ZXMpIHsKKyAgICB2bS0+aGVhcF9iYXNlID0gYWRkciArIG5yX2J5dGVzOworICAgIHZtLT5oZWFwX2JvdW5kID0gYWRkciArIG5yX2J5dGVzOworICAgIHZtLT5oZWFwX3VwcGVyX2xpbWl0ID0gYWRkciArIG5yX2J5dGVzOworICB9CisgIGRldmljZV9hdHRhY2hfYWRkcmVzcyhkZXZpY2VfcGFyZW50KG1lKSwKKwkJCWF0dGFjaF9yYXdfbWVtb3J5LAorCQkJMCAvKmFkZHJlc3Mgc3BhY2UqLywKKwkJCWFkZHIsCisJCQlucl9ieXRlcywKKwkJCWFjY2VzcywKKwkJCW1lKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQKK2h3X3ZtX2FkZF9zcGFjZShkZXZpY2UgKm1lLAorCQl1bnNpZ25lZF93b3JkIGFkZHIsCisJCXVuc2lnbmVkIG5yX2J5dGVzLAorCQljcHUgKnByb2Nlc3NvciwKKwkJdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGh3X3ZtX2RldmljZSAqdm0gPSAoaHdfdm1fZGV2aWNlKilkZXZpY2VfZGF0YShtZSk7CisgIHVuc2lnbmVkX3dvcmQgYmxvY2tfYWRkcjsKKyAgdW5zaWduZWQgYmxvY2tfbnJfYnl0ZXM7CisKKyAgLyogYW4gYWRkcmVzcyBpbiB0aGUgc3RhY2sgYXJlYSwgYWxsb2NhdGUganVzdCBkb3duIHRvIHRoZSBhZGRyZXNzZWQKKyAgICAgcGFnZSAqLworICBpZiAoYWRkciA+PSB2bS0+c3RhY2tfYmFzZSAmJiBhZGRyIDwgdm0tPnN0YWNrX2xvd2VyX2xpbWl0KSB7CisgICAgYmxvY2tfYWRkciA9IEZMT09SX1BBR0UoYWRkcik7CisgICAgYmxvY2tfbnJfYnl0ZXMgPSB2bS0+c3RhY2tfbG93ZXJfbGltaXQgLSBibG9ja19hZGRyOworICAgIHZtLT5zdGFja19sb3dlcl9saW1pdCA9IGJsb2NrX2FkZHI7CisgIH0KKyAgLyogYW4gYWRkcmVzcyBpbiB0aGUgaGVhcCBhcmVhLCBhbGxvY2F0ZSBhbGwgb2YgdGhlIHJlcXVpcmVkIGhlYXAgKi8KKyAgZWxzZSBpZiAoYWRkciA+PSB2bS0+aGVhcF91cHBlcl9saW1pdCAmJiBhZGRyIDwgdm0tPmhlYXBfYm91bmQpIHsKKyAgICBibG9ja19hZGRyID0gdm0tPmhlYXBfdXBwZXJfbGltaXQ7CisgICAgYmxvY2tfbnJfYnl0ZXMgPSB2bS0+aGVhcF9ib3VuZCAtIHZtLT5oZWFwX3VwcGVyX2xpbWl0OworICAgIHZtLT5oZWFwX3VwcGVyX2xpbWl0ID0gdm0tPmhlYXBfYm91bmQ7CisgIH0KKyAgLyogb29wcyAtIGFuIGludmFsaWQgYWRkcmVzcyAtIGFib3J0IHRoZSBjcHUgKi8KKyAgZWxzZSBpZiAocHJvY2Vzc29yICE9IE5VTEwpIHsKKyAgICBjcHVfaGFsdChwcm9jZXNzb3IsIGNpYSwgd2FzX3NpZ25hbGxlZCwgU0lHU0VHVik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgLyogMipvb3BzIC0gYW4gaW52YWxpZCBhZGRyZXNzIGFuZCBubyBwcm9jZXNzb3IgKi8KKyAgZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBnb3QgdGhlIHBhcmFtZXRlcnMsIGFsbG9jYXRlIHRoZSBzcGFjZSAqLworICBkZXZpY2VfYXR0YWNoX2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksCisJCQlhdHRhY2hfcmF3X21lbW9yeSwKKwkJCTAgLyphZGRyZXNzIHNwYWNlKi8sCisJCQlibG9ja19hZGRyLAorCQkJYmxvY2tfbnJfYnl0ZXMsCisJCQlhY2Nlc3NfcmVhZF93cml0ZSwKKwkJCW1lKTsKKyAgcmV0dXJuIGJsb2NrX25yX2J5dGVzOworfQorCisKK3N0YXRpYyB1bnNpZ25lZAoraHdfdm1faW9fcmVhZF9idWZmZXJfY2FsbGJhY2soZGV2aWNlICptZSwKKwkJCSAgIHZvaWQgKmRlc3QsCisJCQkgICBpbnQgc3BhY2UsCisJCQkgICB1bnNpZ25lZF93b3JkIGFkZHIsCisJCQkgICB1bnNpZ25lZCBucl9ieXRlcywKKwkJCSAgIGNwdSAqcHJvY2Vzc29yLAorCQkJICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGlmIChod192bV9hZGRfc3BhY2UobWUsIGFkZHIsIG5yX2J5dGVzLCBwcm9jZXNzb3IsIGNpYSkgPj0gbnJfYnl0ZXMpIHsKKyAgICBtZW1zZXQoZGVzdCwgMCwgbnJfYnl0ZXMpOyAvKiBhbHdheXMgaW5pdGlhbGl6ZWQgdG8gemVybyAqLworICAgIHJldHVybiBucl9ieXRlczsKKyAgfQorICBlbHNlIAorICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyB1bnNpZ25lZAoraHdfdm1faW9fd3JpdGVfYnVmZmVyX2NhbGxiYWNrKGRldmljZSAqbWUsCisJCQkgICAgY29uc3Qgdm9pZCAqc291cmNlLAorCQkJICAgIGludCBzcGFjZSwKKwkJCSAgICB1bnNpZ25lZF93b3JkIGFkZHIsCisJCQkgICAgdW5zaWduZWQgbnJfYnl0ZXMsCisJCQkgICAgY3B1ICpwcm9jZXNzb3IsCisJCQkgICAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGlmIChod192bV9hZGRfc3BhY2UobWUsIGFkZHIsIG5yX2J5dGVzLCBwcm9jZXNzb3IsIGNpYSkgPj0gbnJfYnl0ZXMpIHsKKyAgICByZXR1cm4gZGV2aWNlX2RtYV93cml0ZV9idWZmZXIoZGV2aWNlX3BhcmVudChtZSksIHNvdXJjZSwKKwkJCQkgICBzcGFjZSwgYWRkciwKKwkJCQkgICBucl9ieXRlcywKKwkJCQkgICAwLyp2aW9sYXRlX3JlYWRfb25seSovKTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAoraHdfdm1faW9jdGwoZGV2aWNlICptZSwKKwkgICAgY3B1ICpwcm9jZXNzb3IsCisJICAgIHVuc2lnbmVkX3dvcmQgY2lhLAorCSAgICBkZXZpY2VfaW9jdGxfcmVxdWVzdCByZXF1ZXN0LAorCSAgICB2YV9saXN0IGFwKQoreworICAvKiBXaGlsZSB0aGUgY2FsbGVyIGlzIG5vdGlmaWVkIHRoYXQgdGhlIGhlYXAgaGFzIGdyb3duIGJ5IHRoZQorICAgICByZXF1ZXN0ZWQgYW1vdW50LCB0aGUgaGVhcCBpcyBhY3R1YWxseSBleHRlbmRlZCBvdXQgdG8gYSBwYWdlCisgICAgIGJvdW5kYXJ5LiAqLworICBod192bV9kZXZpY2UgKnZtID0gKGh3X3ZtX2RldmljZSopZGV2aWNlX2RhdGEobWUpOworICBzd2l0Y2ggKHJlcXVlc3QpIHsKKyAgY2FzZSBkZXZpY2VfaW9jdGxfYnJlYWs6CisgICAgeworICAgICAgdW5zaWduZWRfd29yZCByZXF1ZXN0ZWRfYnJlYWsgPSB2YV9hcmcoYXAsIHVuc2lnbmVkX3dvcmQpOworICAgICAgdW5zaWduZWRfd29yZCBuZXdfYnJlYWsgPSBBTElHTl84KHJlcXVlc3RlZF9icmVhayk7CisgICAgICB1bnNpZ25lZF93b3JkIG9sZF9icmVhayA9IHZtLT5oZWFwX2JvdW5kOworICAgICAgc2lnbmVkX3dvcmQgZGVsdGEgPSBuZXdfYnJlYWsgLSBvbGRfYnJlYWs7CisgICAgICBpZiAoZGVsdGEgPiAwKQorCXZtLT5oZWFwX2JvdW5kID0gQUxJR05fUEFHRShuZXdfYnJlYWspOworICAgICAgYnJlYWs7CisgICAgfQorICBkZWZhdWx0OgorICAgIGRldmljZV9lcnJvcihtZSwgIlVuc3VwcG9ydGVkIGlvY3RsIHJlcXVlc3QiKTsKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKKyAgICAKK30KKworCitzdGF0aWMgZGV2aWNlX2NhbGxiYWNrcyBjb25zdCBod192bV9jYWxsYmFja3MgPSB7CisgIHsgaHdfdm1faW5pdF9hZGRyZXNzX2NhbGxiYWNrLCB9LAorICB7IGh3X3ZtX2F0dGFjaF9hZGRyZXNzLAorICAgIHBhc3N0aHJvdWdoX2RldmljZV9hZGRyZXNzX2RldGFjaCwgfSwKKyAgeyBod192bV9pb19yZWFkX2J1ZmZlcl9jYWxsYmFjaywKKyAgICBod192bV9pb193cml0ZV9idWZmZXJfY2FsbGJhY2ssIH0sCisgIHsgTlVMTCwgcGFzc3Rocm91Z2hfZGV2aWNlX2RtYV93cml0ZV9idWZmZXIsIH0sCisgIHsgTlVMTCwgfSwgLyogaW50ZXJydXB0ICovCisgIHsgZ2VuZXJpY19kZXZpY2VfdW5pdF9kZWNvZGUsCisgICAgZ2VuZXJpY19kZXZpY2VfdW5pdF9lbmNvZGUsIH0sCisgIE5VTEwsIC8qIGluc3RhbmNlICovCisgIGh3X3ZtX2lvY3RsLAorfTsKKworCitzdGF0aWMgdm9pZCAqCitod192bV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKKwkgICAgIGNvbnN0IGRldmljZV91bml0ICphZGRyZXNzLAorCSAgICAgY29uc3QgY2hhciAqYXJncykKK3sKKyAgaHdfdm1fZGV2aWNlICp2bSA9IFpBTExPQyhod192bV9kZXZpY2UpOworICByZXR1cm4gdm07Cit9CisKK2NvbnN0IGRldmljZV9kZXNjcmlwdG9yIGh3X3ZtX2RldmljZV9kZXNjcmlwdG9yW10gPSB7CisgIHsgInZtIiwgaHdfdm1fY3JlYXRlLCAmaHdfdm1fY2FsbGJhY2tzIH0sCisgIHsgTlVMTCB9LAorfTsKKworI2VuZGlmIF9IV19WTV9DXwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9pZGVjb2RlX2JyYW5jaC5oIGIvc2ltL3BwYy9pZGVjb2RlX2JyYW5jaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYWU5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2lkZWNvZGVfYnJhbmNoLmgKQEAgLTAsMCArMSw2MiBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworLyogYnJhbmNoIG1hY3JvJ3M6CisKKyAgIFRoZSBtYWNybydzIGJlbG93IGltcGxlbWVudCB0aGUgc2VtYW50aWNzIG9mIHRoZSBQb3dlclBDIGp1bXAKKyAgIGluc3RydWN0aW9ucy4gKi8KKworCisvKiBJZiBzbyByZXF1aXJlZCwgdXBkYXRlIHRoZSBMaW5rIFJlZ2lzdGVyIHdpdGggdGhlIG5leHQgc2VxdWVudGlhbAorICAgaW5zdHJ1Y3Rpb24gYWRkcmVzcyAqLworCisjZGVmaW5lIFVQREFURV9MSyBcCitkbyB7IFwKKyAgaWYgKHVwZGF0ZV9MSykgeyBcCisgICAgcHBjX2lhIHRhcmdldCA9IGNpYSArIDQ7IFwKKyAgICBwcGNfc3ByIG5ld19hZGRyZXNzID0gKHBwY19zcHIpSUVBX01BU0tFRChwcGNfaXNfNjRiaXQocHJvY2Vzc29yKSwgXAorCQkJICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7IFwKKyAgICBMUiA9IG5ld19hZGRyZXNzOyBcCisgIH0gXAorICBJVFJBQ0UodHJhY2VfYnJhbmNoLCBcCisJICgiVVBEQVRFX0xLIC0gdXBkYXRlX0xLPSVkIGxyPTB4JXggY2lhPTB4JXhcbiIsIFwKKwkgIHVwZGF0ZV9MSywgTFIsIGNpYSk7IFwKK30gd2hpbGUgKDApCisKKworLyogdGFrZSB0aGUgYnJhbmNoIC0gYWJzb2x1dGUgb3IgcmVsYXRpdmUgLSBwb3NzaWJseSB1cGRhdGluZyB0aGUgbGluaworICAgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBCUkFOQ0goQUREUkVTUykgXAorZG8geyBcCisgIFVQREFURV9MSzsgXAorICBpZiAodXBkYXRlX0FBKSB7IFwKKyAgICBwcGNfaWEgdGFyZ2V0ID0gKHBwY19pYSkoQUREUkVTUyk7IFwKKyAgICBuaWEgPSAocHBjX2lhKUlFQV9NQVNLRUQocHBjX2lzXzY0Yml0KHByb2Nlc3NvciksIHRhcmdldCk7IFwKKyAgfSBcCisgIGVsc2UgeyBcCisgICAgcHBjX2lhIHRhcmdldCA9IGNpYSArIEFERFJFU1M7IFwKKyAgICBuaWEgPSAocHBjX2lhKUlFQV9NQVNLRUQocHBjX2lzXzY0Yml0KHByb2Nlc3NvciksIHRhcmdldCk7IFwKKyAgfSBcCisgIFBUUkFDRSh0cmFjZV9icmFuY2gsIFwKKwkgKCJCUkFOQ0ggLSB1cGRhdGVfQUE9JWQgdXBkYXRlX0xLPSVkIG5pYT0weCV4IGNpYT0weCV4XG4iLCBcCisJICB1cGRhdGVfQUEsIHVwZGF0ZV9MSywgbmlhLCBjaWEpOyBcCit9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9pZGVjb2RlX2V4cHJlc3Npb24uaCBiL3NpbS9wcGMvaWRlY29kZV9leHByZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY5YjcyNQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvaWRlY29kZV9leHByZXNzaW9uLmgKQEAgLTAsMCArMSw0MTAgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKy8qIDMyYml0IHRhcmdldCBleHByZXNzaW9uczoKKworICAgRWFjaCBjYWxjdWxhdGlvbiBpcyBwZXJmb3JtZWQgdGhyZWUgdGltZXMgdXNpbmcgZWFjaCBvZiB0aGUKKyAgIHNpZ25lZDY0LCB1bnNpZ25lZDY0IGFuZCBsb25nIGludGVnZXIgdHlwZXMuICBUaGUgbWFjcm8gQUxVX0VORAorICAgKGluIF9BTFVfUkVTVUxUX1ZBTCkgdGhlbiBzZWxlY3RzIHdoaWNoIG9mIHRoZSB0aHJlZSBhbHRlcm5hdGl2ZQorICAgcmVzdWx0cyB3aWxsIGJlIHVzZWQgaW4gdGhlIGZpbmFsIGFzc2lnbm1lbnQgb2YgdGhlIHRhcmdldAorICAgcmVnaXN0ZXIuICBBcyB0aGlzIHNlbGVjdGlvbiBpcyBkZXRlcm1pbmVkIGF0IGNvbXBpbGUgdGltZSBieQorICAgZmllbGRzIGluIHRoZSBpbnN0cnVjdGlvbiAoT0UsIEVBLCBSYykgdGhlIGNvbXBpbGVyIGhhcyBzdWZmaWNpZW50CisgICBpbmZvcm1hdGlvbiB0byBmaXJzdGx5IHNpbXBsaWZ5IHRoZSBzZWxlY3Rpb24gY29kZSBpbnRvIGEgc2luZ2xlCisgICBjYXNlIGFuZCB0aGVuIGJhY2sgYW5vdGF0ZSB0aGUgZXF1YXRpb25zIGFuZCBoZW5jZSBlbGltaW5hdGUgYW55CisgICByZXN1bHRpbmcgZGVhZCBjb2RlLiAgVGhhdCBkZWFkIGNvZGUgYmVpbmcgdGhlIGNhbGN1bGF0aW9ucyB0aGF0LAorICAgYXMgaXQgdHVybmVkIG91dCB3ZXJlIG5vdCBpbiB0aGUgZW5kIG5lZWRlZC4KKworICAgNjRiaXQgYXJyaXRoZW1ldGljIGlzIHVzZWQgZmlyc3RseSBiZWNhdXNlIGl0IGFsbG93cyB0aGUgdXNlIG9mCisgICBnY2MncyBlZmZpY2llbnQgbG9uZyBsb25nIG9wZXJhdG9ycyAodHlwaWNhbGx5IGVmZmljaWVudGx5IG91dHB1dAorICAgaW5saW5lKSBhbmQgc2Vjb25kbHkgYmVjYXVzZSB0aGUgcmVzdWx0YW50IGFuc3dlciB3aWxsIGNvbnRhaW4gaW4KKyAgIHRoZSBsb3cgMzJiaXRzIHRoZSBhbnN3ZXIgd2hpbGUgaW4gdGhlIGhpZ2ggMzJiaXRzIGlzIGVpdGhlciBjYXJyeQorICAgb3Igc3RhdHVzIGluZm9ybWF0aW9uLiAqLworCisvKiA2NGJpdCB0YXJnZXQgZXhwcmVzc2lvbnM6CisKKyAgIFVuZm9ydHVuYXRseSAxMjhiaXQgYXJyaXRoZW1ldGljIGlzbid0IHRoYXQgY29tbW9uLiAgQ29uc2VxdWVudGx5CisgICB0aGUgMzIvNjQgYml0IHRyaWNrIGNhbiBub3QgYmUgdXNlZC4gIEluc3RlYWQgYWxsIGNhbGN1bGF0aW9ucyBhcmUKKyAgIHJlcXVpcmVkIHRvIHJldGFpbiBjYXJyeS9vdmVyZmxvdyBpbmZvcm1hdGlvbiBpbiBzZXBhcmF0ZQorICAgdmFyaWFibGVzLiAgRXZlbiB3aXRoIHRoaXMgcmVzdHJpY3Rpb24gaXQgaXMgc3RpbGwgcG9zc2libGUgZm9yIHRoZQorICAgdHJpY2sgb2YgbGV0dGluZyB0aGUgY29tcGlsZXIgZGlzY2FyZCB0aGUgY2FsY3VsYXRpb24gb2YgdW5uZWVkZWQKKyAgIHZhbHVlcyAqLworCisKKy8qIE1hY3JvJ3MgdG8gdHlwZSBjYXN0IDMyYml0IGNvbnN0YW50cyB0byA2NGJpdHMgKi8KKyNkZWZpbmUgU0lHTkVENjQodmFsKSAgICgoc2lnbmVkNjQpKHNpZ25lZDMyKSh2YWwpKQorI2RlZmluZSBVTlNJR05FRDY0KHZhbCkgKCh1bnNpZ25lZDY0KSh1bnNpZ25lZDMyKSh2YWwpKQorCisKKy8qIFN0YXJ0IGEgc2VjdGlvbiBvZiBBTFUgY29kZSAqLworCisjZGVmaW5lIEFMVV9CRUdJTih2YWwpIFwKK3sgXAorICBuYXR1cmFsX3dvcmQgYWx1X3ZhbDsgXAorICB1bnNpZ25lZDY0IGFsdV9jYXJyeV92YWw7IFwKKyAgc2lnbmVkNjQgYWx1X292ZXJmbG93X3ZhbDsgXAorICBBTFVfU0VUKHZhbCkKKworCisvKiBhc3NpZ24gdGhlIHJlc3VsdCB0byB0aGUgdGFyZ2V0IHJlZ2lzdGVyICovCisKKyNkZWZpbmUgQUxVX0VORChUQVJHLENBLE9FLFJjKSBcCit7IC8qIHNlbGVjdCB0aGUgcmVzdWx0IHRvIHVzZSAqLyBcCisgIHNpZ25lZF93b3JkIGNvbnN0IGFsdV9yZXN1bHQgPSBfQUxVX1JFU1VMVF9WQUwoQ0EsT0UsUmMpOyBcCisgIC8qIGRldGVybWluZSB0aGUgb3ZlcmZsb3cgYml0IGlmIG5lZWRlZCAqLyBcCisgIGlmIChPRSkgeyBcCisgICAgaWYgKCgoKHVuc2lnbmVkNjQpKGFsdV9vdmVyZmxvd192YWwgJiBCSVQ2NCgwKSkpIFwKKwkgPj4gMzIpIFwKKyAgICAgICAgPT0gKGFsdV9vdmVyZmxvd192YWwgJiBCSVQ2NCgzMikpKSBcCisgICAgICBYRVIgJj0gKH54ZXJfb3ZlcmZsb3cpOyBcCisgICAgZWxzZSBcCisgICAgICBYRVIgfD0gKHhlcl9zdW1tYXJ5X292ZXJmbG93IHwgeGVyX292ZXJmbG93KTsgXAorICB9IFwKKyAgLyogVXBkYXRlIHRoZSBjYXJyeSBiaXQgaWYgbmVlZGVkICovIFwKKyAgaWYgKENBKSB7IFwKKyAgICBYRVIgPSAoKFhFUiAmIH54ZXJfY2FycnkpIFwKKyAgICAgICAgICAgfCBTSFVGRkxFRDMyKChhbHVfY2FycnlfdmFsID4+IDMyKSwgMzEsIHhlcl9jYXJyeV9iaXQpKTsgXAorICAgIC8qIGlmIChhbHVfY2FycnlfdmFsICYgQklUNjQoMzEpKSBcCisgICAgICAgICBYRVIgfD0gKHhlcl9jYXJyeSk7IFwKKyAgICAgICBlbHNlIFwKKyAgICAgICAgIFhFUiAmPSAofnhlcl9jYXJyeSk7ICovIFwKKyAgfSBcCisgIFRSQUNFKHRyYWNlX2FsdSwgKCIgUmVzdWx0ID0gJWxkICgweCVseCksIFhFUiA9ICVsZFxuIiwgXAorICAgICAgICAgICAgICAgICAgICAobG9uZylhbHVfcmVzdWx0LCAobG9uZylhbHVfcmVzdWx0LCAobG9uZylYRVIpKTsgXAorICAvKiBVcGRhdGUgdGhlIFJlc3VsdCBDb25kaXRpb25zIGlmIG5lZWRlZCAqLyBcCisgIENSMF9DT01QQVJFKGFsdV9yZXN1bHQsIDAsIFJjKTsgXAorICAvKiBhc3NpZ24gdGFyZyBzYW1lICovIFwKKyAgVEFSRyA9IGFsdV9yZXN1bHQ7IFwKK319CisKKy8qIHNlbGVjdCB0aGUgcmVzdWx0IGZyb20gdGhlIGRpZmZlcmVudCBvcHRpb25zICovCisKKyNkZWZpbmUgX0FMVV9SRVNVTFRfVkFMKENBLE9FLFJjKSAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0IFwKKwkJCQkgICA/IGFsdV92YWwgXAorCQkJCSAgIDogKE9FIFwKKwkJCQkgICAgICA/IGFsdV9vdmVyZmxvd192YWwgXAorCQkJCSAgICAgIDogKENBIFwKKwkJCQkJID8gYWx1X2NhcnJ5X3ZhbCBcCisJCQkJCSA6IGFsdV92YWwpKSkKKworCisvKiBNb3JlIGJhc2ljIGFsdSBvcGVyYXRpb25zICovCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyNkZWZpbmUgQUxVX1NFVCh2YWwpIFwKK2RvIHsgXAorICBhbHVfdmFsID0gdmFsOyBcCisgIGFsdV9jYXJyeV92YWwgPSAoKHVuc2lnbmVkNjQpYWx1X3ZhbCkgPj4gMzI7IFwKKyAgYWx1X292ZXJmbG93X3ZhbCA9ICgoc2lnbmVkNjQpYWx1X3ZhbCkgPj4gMzI7IFwKK30gd2hpbGUgKDApCisjZW5kaWYKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQorI2RlZmluZSBBTFVfU0VUKHZhbCkgXAorZG8geyBcCisgIGFsdV92YWwgPSB2YWw7IFwKKyAgYWx1X2NhcnJ5X3ZhbCA9ICh1bnNpZ25lZDMyKShhbHVfdmFsKTsgXAorICBhbHVfb3ZlcmZsb3dfdmFsID0gKHNpZ25lZDMyKShhbHVfdmFsKTsgXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyNkZWZpbmUgQUxVX0FERCh2YWwpIFwKK2RvIHsgXAorICB1bnNpZ25lZDY0IGFsdV9sbyA9IChVTlNJR05FRDY0KGFsdV92YWwpIFwKKwkJICAgICAgICsgVU5TSUdORUQ2NCh2YWwpKTsgXAorICBzaWduZWQgYWx1X2NhcnJ5ID0gKChhbHVfbG8gJiBCSVQoMzEpKSAhPSAwKTsgXAorICBhbHVfY2FycnlfdmFsID0gKGFsdV9jYXJyeV92YWwgXAorCQkgICArIFVOU0lHTkVENjQoRVhUUkFDVEVEKHZhbCwgMCwgMzEpKSBcCisJCSAgICsgYWx1X2NhcnJ5KTsgXAorICBhbHVfb3ZlcmZsb3dfdmFsID0gKGFsdV9vdmVyZmxvd192YWwgXAorCQkgICAgICArIFNJR05FRDY0KEVYVFJBQ1RFRCh2YWwsIDAsIDMxKSkgXAorCQkgICAgICArIGFsdV9jYXJyeSk7IFwKKyAgYWx1X3ZhbCA9IGFsdV92YWwgKyB2YWw7IFwKK30gd2hpbGUgKDApCisjZW5kaWYKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQorI2RlZmluZSBBTFVfQUREKHZhbCkgXAorZG8geyBcCisgIGFsdV92YWwgKz0gdmFsOyBcCisgIGFsdV9jYXJyeV92YWwgKz0gKHVuc2lnbmVkMzIpKHZhbCk7IFwKKyAgYWx1X292ZXJmbG93X3ZhbCArPSAoc2lnbmVkMzIpKHZhbCk7IFwKK30gd2hpbGUgKDApCisjZW5kaWYKKworCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyNkZWZpbmUgQUxVX0FERF9DQSBcCitkbyB7IFwKKyAgc2lnbmVkIGNhcnJ5ID0gTUFTS0VEMzIoWEVSLCB4ZXJfY2FycnlfYml0LCB4ZXJfY2FycnlfYml0KSAhPSAwOyBcCisgIEFMVV9BREQoY2FycnkpOyBcCit9IHdoaWxlICgwKQorI2VuZGlmCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKKyNkZWZpbmUgQUxVX0FERF9DQSBcCitkbyB7IFwKKyAgc2lnbmVkIGNhcnJ5ID0gTUFTS0VEMzIoWEVSLCB4ZXJfY2FycnlfYml0LCB4ZXJfY2FycnlfYml0KSAhPSAwOyBcCisgIEFMVV9BREQoY2FycnkpOyBcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKworI2lmIDAKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQorI2VuZGlmCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKKyNkZWZpbmUgQUxVX1NVQih2YWwpIFwKK2RvIHsgXAorICBhbHVfdmFsIC09IHZhbDsgXAorICBhbHVfY2FycnlfdmFsIC09ICh1bnNpZ25lZDMyKSh2YWwpOyBcCisgIGFsdV9vdmVyZmxvd192YWwgLT0gKHNpZ25lZDMyKSh2YWwpOyBcCit9IHdoaWxlICgwKQorI2VuZGlmCisjZW5kaWYKKworI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCisjZW5kaWYKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQorI2RlZmluZSBBTFVfT1IodmFsKSBcCitkbyB7IFwKKyAgYWx1X3ZhbCB8PSB2YWw7IFwKKyAgYWx1X2NhcnJ5X3ZhbCA9ICh1bnNpZ25lZDMyKShhbHVfdmFsKTsgXAorICBhbHVfb3ZlcmZsb3dfdmFsID0gKHNpZ25lZDMyKShhbHVfdmFsKTsgXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQorI2VuZGlmCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKKyNkZWZpbmUgQUxVX1hPUih2YWwpIFwKK2RvIHsgXAorICBhbHVfdmFsIF49IHZhbDsgXAorICBhbHVfY2FycnlfdmFsID0gKHVuc2lnbmVkMzIpKGFsdV92YWwpOyBcCisgIGFsdV9vdmVyZmxvd192YWwgPSAoc2lnbmVkMzIpKGFsdV92YWwpOyBcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKworI2lmIDAKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQorI2VuZGlmCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKKyNkZWZpbmUgQUxVX05FR0FURSBcCitkbyB7IFwKKyAgYWx1X3ZhbCA9IC1hbHVfdmFsOyBcCisgIGFsdV9jYXJyeV92YWwgPSAtYWx1X2NhcnJ5X3ZhbDsgXAorICBhbHVfb3ZlcmZsb3dfdmFsID0gLWFsdV9vdmVyZmxvd192YWw7IFwKK30gd2hpbGUoMCkKKyNlbmRpZgorI2VuZGlmCisKKworI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCisjZW5kaWYKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQorI2RlZmluZSBBTFVfQU5EKHZhbCkgXAorZG8geyBcCisgIGFsdV92YWwgJj0gdmFsOyBcCisgIGFsdV9jYXJyeV92YWwgPSAodW5zaWduZWQzMikoYWx1X3ZhbCk7IFwKKyAgYWx1X292ZXJmbG93X3ZhbCA9IChzaWduZWQzMikoYWx1X3ZhbCk7IFwKK30gd2hpbGUgKDApCisjZW5kaWYKKworCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyNkZWZpbmUgQUxVX05PVCBcCitkbyB7IFwKKyAgc2lnbmVkNjQgbmV3X2FsdV92YWwgPSB+YWx1X3ZhbDsgXAorICBBTFVfU0VUKG5ld19hbHVfdmFsKTsgXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCisjZGVmaW5lIEFMVV9OT1QgXAorZG8geyBcCisgIHNpZ25lZCBuZXdfYWx1X3ZhbCA9IH5hbHVfdmFsOyBcCisgIEFMVV9TRVQobmV3X2FsdV92YWwpOyBcCit9IHdoaWxlKDApCisjZW5kaWYKKworCisvKiBNYWNyb3MgZm9yIHVwZGF0aW5nIHRoZSBjb25kaXRpb24gcmVnaXN0ZXIgKi8KKworI2RlZmluZSBDUjFfVVBEQVRFKFJjKSBcCitkbyB7IFwKKyAgaWYgKFJjKSB7IFwKKyAgICBDUl9TRVQoMSwgRVhUUkFDVEVEMzIoRlBTQ1IsIGZwc2NyX2Z4X2JpdCwgZnBzY3Jfb3hfYml0KSk7IFwKKyAgfSBcCit9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgX0RPX0NSX0NPTVBBUkUoTEhTLCBSSFMpIFwKKygoKExIUykgPCAoUkhTKSkgXAorID8gY3JfaV9uZWdhdGl2ZSBcCisgOiAoKChMSFMpID4gKFJIUykpIFwKKyAgICA/IGNyX2lfcG9zaXRpdmUgXAorICAgIDogY3JfaV96ZXJvKSkKKworI2RlZmluZSBDUl9TRVQoUkVHLCBWQUwpIE1CTElUMzIoQ1IsIFJFRyo0LCBSRUcqNCszLCBWQUwpCisjZGVmaW5lIENSX0ZJRUxEKFJFRykgRVhUUkFDVEVEMzIoQ1IsIFJFRyo0LCBSRUcqNCszKQorI2RlZmluZSBDUl9TRVRfWEVSX1NPKFJFRywgVkFMKSBcCitkbyB7IFwKKyAgY3JlZyBuZXdfYml0cyA9ICgoWEVSICYgeGVyX3N1bW1hcnlfb3ZlcmZsb3cpIFwKKyAgICAgICAgICAgICAgICAgICA/IChjcl9pX3N1bW1hcnlfb3ZlcmZsb3cgfCBWQUwpIFwKKyAgICAgICAgICAgICAgICAgICA6IFZBTCk7IFwKKyAgQ1JfU0VUKFJFRywgbmV3X2JpdHMpOyBcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgQ1JfQ09NUEFSRShSRUcsIExIUywgUkhTKSBcCitkbyB7IFwKKyAgY3JlZyBuZXdfYml0cyA9ICgoWEVSICYgeGVyX3N1bW1hcnlfb3ZlcmZsb3cpIFwKKyAgICAgICAgICAgICAgICAgICA/IChjcl9pX3N1bW1hcnlfb3ZlcmZsb3cgfCBfRE9fQ1JfQ09NUEFSRShMSFMsUkhTKSkgXAorICAgICAgICAgICAgICAgICAgIDogX0RPX0NSX0NPTVBBUkUoTEhTLFJIUykpOyBcCisgIENSX1NFVChSRUcsIG5ld19iaXRzKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDUjBfQ09NUEFSRShMSFMsIFJIUywgUmMpIFwKK2RvIHsgXAorICBpZiAoUmMpIHsgXAorICAgIENSX0NPTVBBUkUoMCwgTEhTLCBSSFMpOyBcCisgICAgVFJBQ0UodHJhY2VfYWx1LCBcCisJICAoIkNSPTB4JTA4bHgsIExIUz0lbGQsIFJIUz0lbGRcbiIsIFwKKwkgICAodW5zaWduZWQgbG9uZylDUiwgKGxvbmcpTEhTLCAobG9uZylSSFMpKTsgXAorICB9IFwKK30gd2hpbGUgKDApCisKKworCisvKiBCcmluZyBkYXRhIGluIGZyb20gdGhlIGNvbGQgKi8KKworI2RlZmluZSBNRU0oU0lHTiwgRUEsIE5SX0JZVEVTKSBcCisoKFNJR04jI18jI05SX0JZVEVTKSB2bV9kYXRhX21hcF9yZWFkXyMjTlJfQllURVMoY3B1X2RhdGFfbWFwKHByb2Nlc3NvciksIEVBLCBcCisJCQkJCQkgcHJvY2Vzc29yLCBjaWEpKSBcCisKKyNkZWZpbmUgU1RPUkUoRUEsIE5SX0JZVEVTLCBWQUwpIFwKK2RvIHsgXAorICB2bV9kYXRhX21hcF93cml0ZV8jI05SX0JZVEVTKGNwdV9kYXRhX21hcChwcm9jZXNzb3IpLCBFQSwgVkFMLCBcCisJCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOyBcCit9IHdoaWxlICgwKQorCisKKworLyogc29tZSBGUFNDUiB1cGRhdGUgbWFjcm9zLiAqLworCisjZGVmaW5lIEZQU0NSX0JFR0lOIFwKK3sgXAorICBmcHNjcmVnIG9sZF9mcHNjciBVTlVTRUQgPSBGUFNDUgorCisjZGVmaW5lIEZQU0NSX0VORChSYykgeyBcCisgIC8qIGFsd2F5cyB1cGRhdGUgVlggKi8gXAorICBpZiAoKEZQU0NSICYgZnBzY3JfdnhfYml0cykpIFwKKyAgICBGUFNDUiB8PSBmcHNjcl92eDsgXAorICBlbHNlIFwKKyAgICBGUFNDUiAmPSB+ZnBzY3Jfdng7IFwKKyAgLyogYWx3YXlzIHVwZGF0ZSBGRVggKi8gXAorICBpZiAoKChGUFNDUiAmIGZwc2NyX3Z4KSAmJiAoRlBTQ1IgJiBmcHNjcl92ZSkpIFwKKyAgICAgIHx8ICgoRlBTQ1IgJiBmcHNjcl9veCkgJiYgKEZQU0NSICYgZnBzY3Jfb2UpKSBcCisgICAgICB8fCAoKEZQU0NSICYgZnBzY3JfdXgpICYmIChGUFNDUiAmIGZwc2NyX3VlKSkgXAorICAgICAgfHwgKChGUFNDUiAmIGZwc2NyX3p4KSAmJiAoRlBTQ1IgJiBmcHNjcl96ZSkpIFwKKyAgICAgIHx8ICgoRlBTQ1IgJiBmcHNjcl94eCkgJiYgKEZQU0NSICYgZnBzY3JfeGUpKSkgXAorICAgIEZQU0NSIHw9IGZwc2NyX2ZleDsgXAorICBlbHNlIFwKKyAgICBGUFNDUiAmPSB+ZnBzY3JfZmV4OyBcCisgIENSMV9VUERBVEUoUmMpOyBcCisgIC8qIGludGVycnVwdCBlbmFibGVkPyAqLyBcCisgIGlmICgoTVNSICYgKG1zcl9mbG9hdGluZ19wb2ludF9leGNlcHRpb25fbW9kZV8wIFwKKyAgICAgICAgICAgICAgfCBtc3JfZmxvYXRpbmdfcG9pbnRfZXhjZXB0aW9uX21vZGVfMSkpIFwKKyAgICAgICYmIChGUFNDUiAmIGZwc2NyX2ZleCkpIFwKKyAgICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwgXAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0aW5nX3BvaW50X2VuYWJsZWRfcHJvZ3JhbV9pbnRlcnJ1cHQpOyBcCit9fQorCisjZGVmaW5lIEZQU0NSX1NFVChSRUcsIFZBTCkgTUJMSVQzMihGUFNDUiwgUkVHKjQsIFJFRyo0KzMsIFZBTCkKKyNkZWZpbmUgRlBTQ1JfRklFTEQoUkVHKSBFWFRSQUNURUQzMihGUFNDUiwgUkVHKjQsIFJFRyo0KzMpCisKKyNkZWZpbmUgRlBTQ1JfU0VUX0ZQQ0MoVkFMKSBNQkxJVDMyKEZQU0NSLCBmcHNjcl9mcGNjX2JpdCwgZnBzY3JfZnBjY19iaXQrMywgVkFMKQorCisvKiBIYW5kbGUgdmFyaW91cyBleGNlcHRpb25zICovCisKKyNkZWZpbmUgRlBTQ1JfT1JfVlgoVkFMKSBcCitkbyB7IFwKKyAgLyogTk9URTogVkFMICE9IDAgKi8gXAorICBGUFNDUiB8PSAoVkFMKTsgXAorICBGUFNDUiB8PSBmcHNjcl9meDsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBGUFNDUl9TRVRfT1goQ09ORCkgXAorZG8geyBcCisgIGlmIChDT05EKSB7IFwKKyAgICBGUFNDUiB8PSBmcHNjcl9veDsgXAorICAgIEZQU0NSIHw9IGZwc2NyX2Z4OyBcCisgIH0gXAorICBlbHNlIFwKKyAgICBGUFNDUiAmPSB+ZnBzY3Jfb3g7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRlBTQ1JfU0VUX1VYKENPTkQpIFwKK2RvIHsgXAorICBpZiAoQ09ORCkgeyBcCisgICAgRlBTQ1IgfD0gZnBzY3JfdXg7IFwKKyAgICBGUFNDUiB8PSBmcHNjcl9meDsgXAorICB9IFwKKyAgZWxzZSBcCisgICAgRlBTQ1IgJj0gfmZwc2NyX3V4OyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEZQU0NSX1NFVF9aWChDT05EKSBcCitkbyB7IFwKKyAgaWYgKENPTkQpIHsgXAorICAgIEZQU0NSIHw9IGZwc2NyX3p4OyBcCisgICAgRlBTQ1IgfD0gZnBzY3JfZng7IFwKKyAgfSBcCisgIGVsc2UgXAorICAgIEZQU0NSICY9IH5mcHNjcl96eDsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBGUFNDUl9TRVRfWFgoQ09ORCkgXAorZG8geyBcCisgIGlmIChDT05EKSB7IFwKKyAgICBGUFNDUiB8PSBmcHNjcl94eDsgXAorICAgIEZQU0NSIHw9IGZwc2NyX2Z4OyBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworLyogTm90ZTogY29kZSB1c2luZyBTRVRfRkkgbXVzdCBhbHNvIGV4cGxpY2l0bHkgY2FsbCBTRVRfWFggKi8KKworI2RlZmluZSBGUFNDUl9TRVRfRlIoQ09ORCkgZG8geyBcCisgIGlmIChDT05EKSBcCisgICAgRlBTQ1IgfD0gZnBzY3JfZnI7IFwKKyAgZWxzZSBcCisgICAgRlBTQ1IgJj0gfmZwc2NyX2ZyOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEZQU0NSX1NFVF9GSShDT05EKSBcCitkbyB7IFwKKyAgaWYgKENPTkQpIHsgXAorICAgIEZQU0NSIHw9IGZwc2NyX2ZpOyBcCisgIH0gXAorICBlbHNlIFwKKyAgICBGUFNDUiAmPSB+ZnBzY3JfZmk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRlBTQ1JfU0VUX0ZQUkYoVkFMKSBcCitkbyB7IFwKKyAgRlBTQ1IgPSAoRlBTQ1IgJiB+ZnBzY3JfZnByZikgfCAoVkFMKTsgXAorfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL3NpbS9wcGMvaWRlY29kZV9maWVsZHMuaCBiL3NpbS9wcGMvaWRlY29kZV9maWVsZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzQ0OWJjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9pZGVjb2RlX2ZpZWxkcy5oCkBAIC0wLDAgKzEsMTA1IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisvKiBJbnN0cnVjdGlvbiBmaWVsZCBtYWNyb3M6CisKKyAgIFRoZSBtYWNybydzIGJlbG93IGdyZWF0bHkgc2ltcGxpZnkgdGhlIHByb2Nlc3Mgb2YgdHJhbnNsYXRpbmcgdGhlCisgICBwc2V1ZG8gY29kZSBmb3VuZCBpbiB0aGUgUG93ZXJQQyBtYW51YWwgaW50byBDLgorCisgICBJbiBhZGRpdGlvbiB0byB0aGUgYmVsb3csIG1vcmUgd2lsbCBiZSBmb3VuZCBpbiB0aGUgZ2VuIHByb2dyYW0ncworICAgY2FjaGUgdGFibGUgKi8KKworCisvKiBtYXAgc29tZSBzdGF0ZW1lbnRzIGFuZCB2YXJpYWJsZXMgZGlyZWN0bHkgYWNyb3NzICovCisKKyNkZWZpbmUgaXNfNjRiaXRfaW1wbGVtZW50YXRpb24gKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyNkZWZpbmUgaXNfNjRiaXRfbW9kZSAgICAgICAgICAgSVNfNjRCSVRfTU9ERShwcm9jZXNzb3IpCisKKyNkZWZpbmUgTklBIG5pYQorI2RlZmluZSBDSUEgY2lhCisKKworLyogcmVzZXJ2YXRpb24gKi8KKworI2RlZmluZSBSRVNFUlZFICAgICAgICBjcHVfcmVzZXJ2YXRpb24ocHJvY2Vzc29yKS0+dmFsaWQKKyNkZWZpbmUgUkVTRVJWRV9BRERSICAgY3B1X3Jlc2VydmF0aW9uKHByb2Nlc3NvciktPmFkZHIKKyNkZWZpbmUgUkVTRVJWRV9EQVRBICAgY3B1X3Jlc2VydmF0aW9uKHByb2Nlc3NvciktPmRhdGEKKworI2RlZmluZSByZWFsX2FkZHIoRUEsIElTX1JFQUQpICB2bV9yZWFsX2RhdGFfYWRkcihjcHVfZGF0YV9tYXAocHJvY2Vzc29yKSwgXAorCQkJCQkJICBFQSwgXAorCQkJCQkJICBJU19SRUFELCBcCisJCQkJCQkgIHByb2Nlc3NvciwgXAorCQkJCQkJICBjaWEpCisKKworLyogZGVwZW5kaW5nIG9uIG1vZGUgcmV0dXJuIGEgMzIgb3IgNjRiaXQgbnVtYmVyICovCisKKyNkZWZpbmUgSUVBKFgpICAgICAgIChpc182NGJpdF9tb2RlIFwKKwkJICAgICAgPyAoWCkgXAorCQkgICAgICA6IE1BU0tFRCgoWCksIDMyLCA2MykpCisKKy8qIEV4cGFuZCBhcmd1bWVudCB0byBjdXJyZW50IGFyY2hpdGVjdHVyZSBzaXplICovCisKKyNkZWZpbmUgRVhUUyhYKQkJRVhUU18jI1gKKworCisvKiBHZW4gdHJhbnNsYXRlcyB0ZXh0IG9mIHRoZSBmb3JtIEF7WFg6WVl9IGludG8gQV9YWF9ZWV8gdGhlIG1hY3JvJ3MKKyAgIGJlbG93IGRlZmluZSBzdWNoIHRyYW5zbGF0ZWQgdGV4dCBpbnRvIHJlYWwgZXhwcmVzc2lvbnMgKi8KKworLyogdGhlIHNwciBmaWVsZCBhcyBpdCBub3JtYWxseSBpcyB1c2VkICovCisKKyNkZWZpbmUgU1BSXzVfOV8gKFNQUiAmIDB4MWYpCisjZGVmaW5lIFNQUl8wXzRfIChTUFIgPj4gNSkKKyNkZWZpbmUgU1BSXzBfICgoU1BSICYgQklUMTAoMCkpICE9IDApCisKKyNkZWZpbmUgdGJyXzVfOV8gKHRiciAmIDB4MWYpCisjZGVmaW5lIHRicl8wXzRfICh0YnIgPj4gNSkKKworCisjZGVmaW5lIFRCIGNwdV9nZXRfdGltZV9iYXNlKHByb2Nlc3NvcikKKworCisvKiB2YXJpb3VzIHJlZ2lzdGVycyB3aXRoIGltcG9ydGFudCBtYXNrcyAqLworCisjZGVmaW5lIExSXzBiMDAJCShMUiAmIH4zKQorI2RlZmluZSBDVFJfMGIwMAkoQ1RSICYgfjMpCisKKyNkZWZpbmUgQ1JfQklfICAoKENSICYgQklUMzJfQkkpICE9IDApCisjZGVmaW5lIENSX0JBXwkoKENSICYgQklUMzJfQkEpICE9IDApCisjZGVmaW5lIENSX0JCXwkoKENSICYgQklUMzJfQkIpICE9IDApCisKKworLyogZXh0ZW5kZWQgZXh0cmFjdGVkIGZpZWxkcyAqLworCisjZGVmaW5lIFRPXzBfICgoVE8gJiBCSVQ1KDApKSAhPSAwKQorI2RlZmluZSBUT18xXyAoKFRPICYgQklUNSgxKSkgIT0gMCkKKyNkZWZpbmUgVE9fMl8gKChUTyAmIEJJVDUoMikpICE9IDApCisjZGVmaW5lIFRPXzNfICgoVE8gJiBCSVQ1KDMpKSAhPSAwKQorI2RlZmluZSBUT180XyAoKFRPICYgQklUNSg0KSkgIT0gMCkKKworI2RlZmluZSBCT18wXyAoKEJPICYgQklUNSgwKSkgIT0gMCkKKyNkZWZpbmUgQk9fMV8gKChCTyAmIEJJVDUoMSkpICE9IDApCisjZGVmaW5lIEJPXzJfICgoQk8gJiBCSVQ1KDIpKSAhPSAwKQorI2RlZmluZSBCT18zXyAoKEJPICYgQklUNSgzKSkgIT0gMCkKKyNkZWZpbmUgQk9fNF8gKChCTyAmIEJJVDUoNCkpICE9IDApCisKKyNkZWZpbmUgR09UTyhkZXN0KSAgIGdvdG8gWENPTkNBVDQobGFiZWxfXyxkZXN0LF9fLE1ZX1BSRUZJWCkKKyNkZWZpbmUgTEFCRUwoZGVzdCkgIFhDT05DQVQ0KGxhYmVsX18sZGVzdCxfXyxNWV9QUkVGSVgpCmRpZmYgLS1naXQgYS9zaW0vcHBjL2lnZW4uYyBiL3NpbS9wcGMvaWdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODcwODcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2lnZW4uYwpAQCAtMCwwICsxLDUxNiBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAibGYuaCIKKyNpbmNsdWRlICJ0YWJsZS5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAiZmlsdGVyLmgiCisKKyNpbmNsdWRlICJsZC1kZWNvZGUuaCIKKyNpbmNsdWRlICJsZC1jYWNoZS5oIgorI2luY2x1ZGUgImxkLWluc24uaCIKKworI2luY2x1ZGUgImlnZW4uaCIKKworI2luY2x1ZGUgImdlbi1tb2RlbC5oIgorI2luY2x1ZGUgImdlbi1pY2FjaGUuaCIKKyNpbmNsdWRlICJnZW4taXRhYmxlLmgiCisjaW5jbHVkZSAiZ2VuLWlkZWNvZGUuaCIKKyNpbmNsdWRlICJnZW4tc2VtYW50aWNzLmgiCisjaW5jbHVkZSAiZ2VuLXN1cHBvcnQuaCIKKworaW50IGhpX2JpdF9ucjsKK2ludCBpbnNuX2JpdF9zaXplID0gbWF4X2luc25fYml0X3NpemU7CisKK2lnZW5fY29kZSBjb2RlID0gZ2VuZXJhdGVfY2FsbHM7CisKK2ludCBnZW5lcmF0ZV9leHBhbmRlZF9pbnN0cnVjdGlvbnM7CitpbnQgaWNhY2hlX3NpemUgPSAxMDI0OworaW50IGdlbmVyYXRlX3NtcDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK3ByaW50X2luc25fYml0cyhsZiAqZmlsZSwgaW5zbl9iaXRzICpiaXRzKQoreworICBpbnQgbnIgPSAwOworICBpZiAoYml0cyA9PSBOVUxMKQorICAgIHJldHVybiBucjsKKyAgbnIgKz0gcHJpbnRfaW5zbl9iaXRzKGZpbGUsIGJpdHMtPmxhc3QpOworICBuciArPSBsZl9wdXRjaHIoZmlsZSwgJ18nKTsKKyAgbnIgKz0gbGZfcHV0c3RyKGZpbGUsIGJpdHMtPmZpZWxkLT52YWxfc3RyaW5nKTsKKyAgaWYgKGJpdHMtPm9wY29kZS0+aXNfYm9vbGVhbiAmJiBiaXRzLT52YWx1ZSA9PSAwKQorICAgIG5yICs9IGxmX3B1dGludChmaWxlLCBiaXRzLT5vcGNvZGUtPmJvb2xlYW5fY29uc3RhbnQpOworICBlbHNlIGlmICghYml0cy0+b3Bjb2RlLT5pc19ib29sZWFuKSB7CisgICAgaWYgKGJpdHMtPm9wY29kZS0+bGFzdCA8IGJpdHMtPmZpZWxkLT5sYXN0KQorICAgICAgbnIgKz0gbGZfcHV0aW50KGZpbGUsIGJpdHMtPnZhbHVlIDw8IChiaXRzLT5maWVsZC0+bGFzdCAtIGJpdHMtPm9wY29kZS0+bGFzdCkpOworICAgIGVsc2UKKyAgICAgIG5yICs9IGxmX3B1dGludChmaWxlLCBiaXRzLT52YWx1ZSk7CisgIH0KKyAgcmV0dXJuIG5yOworfQorCitleHRlcm4gaW50CitwcmludF9mdW5jdGlvbl9uYW1lKGxmICpmaWxlLAorCQkgICAgY29uc3QgY2hhciAqYmFzZW5hbWUsCisJCSAgICBpbnNuX2JpdHMgKmV4cGFuZGVkX2JpdHMsCisJCSAgICBsZl9mdW5jdGlvbl9uYW1lX3ByZWZpeGVzIHByZWZpeCkKK3sKKyAgaW50IG5yID0gMDsKKyAgLyogdGhlIHByZWZpeCAqLworICBzd2l0Y2ggKHByZWZpeCkgeworICBjYXNlIGZ1bmN0aW9uX25hbWVfcHJlZml4X3NlbWFudGljczoKKyAgICBuciArPSBsZl9wdXRzdHIoZmlsZSwgInNlbWFudGljXyIpOworICAgIGJyZWFrOworICBjYXNlIGZ1bmN0aW9uX25hbWVfcHJlZml4X2lkZWNvZGU6CisgICAgbnIgKz0gbGZfcHJpbnRmKGZpbGUsICJpZGVjb2RlXyIpOworICAgIGJyZWFrOworICBjYXNlIGZ1bmN0aW9uX25hbWVfcHJlZml4X2l0YWJsZToKKyAgICBuciArPSBsZl9wdXRzdHIoZmlsZSwgIml0YWJsZV8iKTsKKyAgICBicmVhazsKKyAgY2FzZSBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pY2FjaGU6CisgICAgbnIgKz0gbGZfcHV0c3RyKGZpbGUsICJpY2FjaGVfIik7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKworICAvKiB0aGUgZnVuY3Rpb24gbmFtZSAqLworICB7CisgICAgY29uc3QgY2hhciAqcG9zOworICAgIGZvciAocG9zID0gYmFzZW5hbWU7CisJICpwb3MgIT0gJ1wwJzsKKwkgcG9zKyspIHsKKyAgICAgIHN3aXRjaCAoKnBvcykgeworICAgICAgY2FzZSAnLyc6CisgICAgICBjYXNlICctJzoKKwlicmVhazsKKyAgICAgIGNhc2UgJyAnOgorCW5yICs9IGxmX3B1dGNocihmaWxlLCAnXycpOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwluciArPSBsZl9wdXRjaHIoZmlsZSwgKnBvcyk7CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogdGhlIHN1ZmZpeCAqLworICBpZiAoZ2VuZXJhdGVfZXhwYW5kZWRfaW5zdHJ1Y3Rpb25zKQorICAgIG5yICs9IHByaW50X2luc25fYml0cyhmaWxlLCBleHBhbmRlZF9iaXRzKTsKKworICByZXR1cm4gbnI7Cit9CisKKwordm9pZAorcHJpbnRfbXlfZGVmaW5lcyhsZiAqZmlsZSwKKwkJIGluc25fYml0cyAqZXhwYW5kZWRfYml0cywKKwkJIHRhYmxlX2VudHJ5ICpmaWxlX2VudHJ5KQoreworICAvKiAjZGVmaW5lIE1ZX0lOREVYIHh4eHh4ICovCisgIGxmX2luZGVudF9zdXBwcmVzcyhmaWxlKTsKKyAgbGZfcHJpbnRmKGZpbGUsICIjdW5kZWYgTVlfSU5ERVhcbiIpOworICBsZl9pbmRlbnRfc3VwcHJlc3MoZmlsZSk7CisgIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSBNWV9JTkRFWCAiKTsKKyAgcHJpbnRfZnVuY3Rpb25fbmFtZShmaWxlLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfaXRhYmxlKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICAvKiAjZGVmaW5lIE1ZX1BSRUZJWCB4eHh4eHggKi8KKyAgbGZfaW5kZW50X3N1cHByZXNzKGZpbGUpOworICBsZl9wcmludGYoZmlsZSwgIiN1bmRlZiBNWV9QUkVGSVhcbiIpOworICBsZl9pbmRlbnRfc3VwcHJlc3MoZmlsZSk7CisgIGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSBNWV9QUkVGSVggIik7CisgIHByaW50X2Z1bmN0aW9uX25hbWUoZmlsZSwKKwkJICAgICAgZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fbmFtZV0sCisJCSAgICAgIGV4cGFuZGVkX2JpdHMsCisJCSAgICAgIGZ1bmN0aW9uX25hbWVfcHJlZml4X25vbmUpOworICBsZl9wcmludGYoZmlsZSwgIlxuIik7Cit9CisKKwordm9pZAorcHJpbnRfaXRyYWNlKGxmICpmaWxlLAorCSAgICAgdGFibGVfZW50cnkgKmZpbGVfZW50cnksCisJICAgICBpbnQgaWRlY29kZSkKK3sKKyAgbGZfcHJpbnRfX2V4dGVybmFsX3JlZmVyZW5jZShmaWxlLCBmaWxlX2VudHJ5LT5saW5lX25yLCBmaWxlX2VudHJ5LT5maWxlX25hbWUpOworICBsZl9wcmludGYoZmlsZSwgIklUUkFDRSh0cmFjZV8lcywgKFwiJXMgJXNcXG5cIikpO1xuIiwKKwkgICAgKGlkZWNvZGUgPyAiaWRlY29kZSIgOiAic2VtYW50aWNzIiksCisJICAgIChpZGVjb2RlID8gImlkZWNvZGUiIDogInNlbWFudGljcyIpLAorCSAgICBmaWxlX2VudHJ5LT5maWVsZHNbaW5zbl9uYW1lXSk7CisgIGxmX3ByaW50X19pbnRlcm5hbF9yZWZlcmVuY2UoZmlsZSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHZvaWQKK2dlbl9zZW1hbnRpY3NfaChpbnNuX3RhYmxlICp0YWJsZSwKKwkJbGYgKmZpbGUsCisJCWlnZW5fY29kZSBnZW5lcmF0ZSkKK3sKKyAgbGZfcHJpbnRmKGZpbGUsICJ0eXBlZGVmICVzIGlkZWNvZGVfc2VtYW50aWNcbiglcyk7XG4iLAorCSAgICBTRU1BTlRJQ19GVU5DVElPTl9UWVBFLAorCSAgICBTRU1BTlRJQ19GVU5DVElPTl9GT1JNQUwpOworICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgIGlmICgoY29kZSAmIGdlbmVyYXRlX2NhbGxzKSkgeworICAgIGxmX3ByaW50ZihmaWxlLCAiI2lmZGVmIFdJVEhfT1BUSU9OX01QQzg2MEMwXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgImV4dGVybiBpbnQgb3B0aW9uX21wYzg2MGMwO1xuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIjZGVmaW5lIFBBR0VfU0laRSAweDEwMDBcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIkVYVEVSTl9TRU1BTlRJQ1Modm9pZClcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAic2VtYW50aWNfaW5pdChkZXZpY2UqIHJvb3QpO1xuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiI2VuZGlmIC8vIFdJVEhfT1BUSU9OX01QQzg2MEMwXG4iKTsKKyAgICBpZiAoZ2VuZXJhdGVfZXhwYW5kZWRfaW5zdHJ1Y3Rpb25zKQorICAgICAgaW5zbl90YWJsZV90cmF2ZXJzZV90cmVlKHRhYmxlLAorCQkJICAgICAgIGZpbGUsIE5VTEwsCisJCQkgICAgICAgMSwKKwkJCSAgICAgICBOVUxMLCAvKiBzdGFydCAqLworCQkJICAgICAgIHByaW50X3NlbWFudGljX2RlY2xhcmF0aW9uLCAvKiBsZWFmICovCisJCQkgICAgICAgTlVMTCwgLyogZW5kICovCisJCQkgICAgICAgTlVMTCk7IC8qIHBhZGRpbmcgKi8KKyAgICBlbHNlCisgICAgICBpbnNuX3RhYmxlX3RyYXZlcnNlX2luc24odGFibGUsCisJCQkgICAgICAgZmlsZSwgTlVMTCwKKwkJCSAgICAgICBwcmludF9zZW1hbnRpY19kZWNsYXJhdGlvbik7CisgICAgCisgIH0KKyAgZWxzZSB7CisgICAgbGZfcHJpbnRfX3RoaXNfZmlsZV9pc19lbXB0eShmaWxlKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCitnZW5fc2VtYW50aWNzX2MoaW5zbl90YWJsZSAqdGFibGUsCisJCWNhY2hlX3RhYmxlICpjYWNoZV9ydWxlcywKKwkJbGYgKmZpbGUsCisJCWlnZW5fY29kZSBnZW5lcmF0ZSkKK3sKKyAgaWYgKChjb2RlICYgZ2VuZXJhdGVfY2FsbHMpKSB7CisgICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJjcHUuaFwiXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwiaWRlY29kZS5oXCJcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJzZW1hbnRpY3MuaFwiXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwic3VwcG9ydC5oXCJcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiNpZmRlZiBXSVRIX09QVElPTl9NUEM4NjBDMFxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJpbnQgb3B0aW9uX21wYzg2MGMwID0gMDtcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIkVYVEVSTl9TRU1BTlRJQ1Modm9pZClcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAic2VtYW50aWNfaW5pdChkZXZpY2UqIHJvb3QpXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIntcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiICBvcHRpb25fbXBjODYwYzAgPSAwO1xuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIgIGlmICh0cmVlX2ZpbmRfcHJvcGVydHkocm9vdCwgXCIvb3B0aW9ucy9tcGM4NjBjMFwiKSlcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiICAgIG9wdGlvbl9tcGM4NjBjMCA9IHRyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KHJvb3QsIFwiL29wdGlvbnMvbXBjODYwYzBcIik7XG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIn1cbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiNlbmRpZiAvLyBXSVRIX09QVElPTl9NUEM4NjBDMFxuIik7CisgICAgaWYgKGdlbmVyYXRlX2V4cGFuZGVkX2luc3RydWN0aW9ucykKKyAgICAgIGluc25fdGFibGVfdHJhdmVyc2VfdHJlZSh0YWJsZSwKKwkJCSAgICAgICBmaWxlLCBjYWNoZV9ydWxlcywKKwkJCSAgICAgICAxLAorCQkJICAgICAgIE5VTEwsIC8qIHN0YXJ0ICovCisJCQkgICAgICAgcHJpbnRfc2VtYW50aWNfZGVmaW5pdGlvbiwgLyogbGVhZiAqLworCQkJICAgICAgIE5VTEwsIC8qIGVuZCAqLworCQkJICAgICAgIE5VTEwpOyAvKiBwYWRkaW5nICovCisgICAgZWxzZQorICAgICAgaW5zbl90YWJsZV90cmF2ZXJzZV9pbnNuKHRhYmxlLAorCQkJICAgICAgIGZpbGUsIGNhY2hlX3J1bGVzLAorCQkJICAgICAgIHByaW50X3NlbWFudGljX2RlZmluaXRpb24pOworICAgIAorICB9CisgIGVsc2UgeworICAgIGxmX3ByaW50X190aGlzX2ZpbGVfaXNfZW1wdHkoZmlsZSk7CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgdm9pZAorZ2VuX2ljYWNoZV9oKGluc25fdGFibGUgKnRhYmxlLAorCSAgICAgbGYgKmZpbGUsCisJICAgICBpZ2VuX2NvZGUgZ2VuZXJhdGUpCit7CisgIGxmX3ByaW50ZihmaWxlLCAidHlwZWRlZiAlcyBpZGVjb2RlX2ljYWNoZVxuKCVzKTtcbiIsCisJICAgIElDQUNIRV9GVU5DVElPTl9UWVBFLAorCSAgICBJQ0FDSEVfRlVOQ1RJT05fRk9STUFMKTsKKyAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICBpZiAoKGNvZGUgJiBnZW5lcmF0ZV9jYWxscykKKyAgICAgICYmIChjb2RlICYgZ2VuZXJhdGVfd2l0aF9pY2FjaGUpKSB7CisgICAgaW5zbl90YWJsZV90cmF2ZXJzZV9mdW5jdGlvbih0YWJsZSwKKwkJCQkgZmlsZSwgTlVMTCwKKwkJCQkgcHJpbnRfaWNhY2hlX2ludGVybmFsX2Z1bmN0aW9uX2RlY2xhcmF0aW9uKTsKKyAgICBpZiAoZ2VuZXJhdGVfZXhwYW5kZWRfaW5zdHJ1Y3Rpb25zKQorICAgICAgaW5zbl90YWJsZV90cmF2ZXJzZV90cmVlKHRhYmxlLAorCQkJICAgICAgIGZpbGUsIE5VTEwsCisJCQkgICAgICAgMSwKKwkJCSAgICAgICBOVUxMLCAvKiBzdGFydCAqLworCQkJICAgICAgIHByaW50X2ljYWNoZV9kZWNsYXJhdGlvbiwgLyogbGVhZiAqLworCQkJICAgICAgIE5VTEwsIC8qIGVuZCAqLworCQkJICAgICAgIE5VTEwpOyAvKiBwYWRkaW5nICovCisgICAgZWxzZQorICAgICAgaW5zbl90YWJsZV90cmF2ZXJzZV9pbnNuKHRhYmxlLAorCQkJICAgICAgIGZpbGUsIE5VTEwsCisJCQkgICAgICAgcHJpbnRfaWNhY2hlX2RlY2xhcmF0aW9uKTsKKyAgICAKKyAgfQorICBlbHNlIHsKKyAgICBsZl9wcmludF9fdGhpc19maWxlX2lzX2VtcHR5KGZpbGUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitnZW5faWNhY2hlX2MoaW5zbl90YWJsZSAqdGFibGUsCisJICAgICBjYWNoZV90YWJsZSAqY2FjaGVfcnVsZXMsCisJICAgICBsZiAqZmlsZSwKKwkgICAgIGlnZW5fY29kZSBnZW5lcmF0ZSkKK3sKKyAgLyogb3V0cHV0IGBpbnRlcm5hbCcgaW52YWxpZC9mbG9hdGluZy1wb2ludCB1bmF2YWlsYWJsZSBmdW5jdGlvbnMKKyAgICAgd2hlcmUgbmVlZGVkICovCisgIGlmICgoY29kZSAmIGdlbmVyYXRlX2NhbGxzKQorICAgICAgJiYgKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkpIHsKKyAgICBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcImNwdS5oXCJcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJpZGVjb2RlLmhcIlxuIik7CisgICAgbGZfcHJpbnRmKGZpbGUsICIjaW5jbHVkZSBcInNlbWFudGljcy5oXCJcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiI2luY2x1ZGUgXCJpY2FjaGUuaFwiXG4iKTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiNpbmNsdWRlIFwic3VwcG9ydC5oXCJcbiIpOworICAgIGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgICBpbnNuX3RhYmxlX3RyYXZlcnNlX2Z1bmN0aW9uKHRhYmxlLAorCQkJCSBmaWxlLCBOVUxMLAorCQkJCSBwcmludF9pY2FjaGVfaW50ZXJuYWxfZnVuY3Rpb25fZGVmaW5pdGlvbik7CisgICAgbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICAgIGlmIChnZW5lcmF0ZV9leHBhbmRlZF9pbnN0cnVjdGlvbnMpCisgICAgICBpbnNuX3RhYmxlX3RyYXZlcnNlX3RyZWUodGFibGUsCisJCQkgICAgICAgZmlsZSwgY2FjaGVfcnVsZXMsCisJCQkgICAgICAgMSwKKwkJCSAgICAgICBOVUxMLCAvKiBzdGFydCAqLworCQkJICAgICAgIHByaW50X2ljYWNoZV9kZWZpbml0aW9uLCAvKiBsZWFmICovCisJCQkgICAgICAgTlVMTCwgLyogZW5kICovCisJCQkgICAgICAgTlVMTCk7IC8qIHBhZGRpbmcgKi8KKyAgICBlbHNlCisgICAgICBpbnNuX3RhYmxlX3RyYXZlcnNlX2luc24odGFibGUsCisJCQkgICAgICAgZmlsZSwgY2FjaGVfcnVsZXMsCisJCQkgICAgICAgcHJpbnRfaWNhY2hlX2RlZmluaXRpb24pOworICAgIAorICB9CisgIGVsc2UgeworICAgIGxmX3ByaW50X190aGlzX2ZpbGVfaXNfZW1wdHkoZmlsZSk7CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbnQKK21haW4oaW50IGFyZ2MsCisgICAgIGNoYXIgKiphcmd2LAorICAgICBjaGFyICoqZW52cCkKK3sKKyAgY2FjaGVfdGFibGUgKmNhY2hlX3J1bGVzID0gTlVMTDsKKyAgbGZfZmlsZV9yZWZlcmVuY2VzIGZpbGVfcmVmZXJlbmNlcyA9IGxmX2luY2x1ZGVfcmVmZXJlbmNlczsKKyAgZGVjb2RlX3RhYmxlICpkZWNvZGVfcnVsZXMgPSBOVUxMOworICBmaWx0ZXIgKmZpbHRlcnMgPSBOVUxMOworICBpbnNuX3RhYmxlICppbnN0cnVjdGlvbnMgPSBOVUxMOworICBjaGFyICpyZWFsX2ZpbGVfbmFtZSA9IE5VTEw7CisgIGludCBpc19oZWFkZXIgPSAwOworICBpbnQgY2g7CisKKyAgaWYgKGFyZ2MgPT0gMSkgeworICAgIHByaW50ZigiVXNhZ2U6XG4iKTsKKyAgICBwcmludGYoIiAgaWdlbiA8Y29uZmlnLW9wdHM+IC4uLiA8aW5wdXQtb3B0cz4uLi4gPG91dHB1dC1vcHRzPi4uLlxuIik7CisgICAgcHJpbnRmKCJDb25maWcgb3B0aW9uczpcbiIpOworICAgIHByaW50ZigiICAtRiA8ZmlsdGVyLW91dC1mbGFnPiAgZWcgLUYgNjQgdG8gc2tpcCA2NGJpdCBpbnN0cnVjdGlvbnNcbiIpOworICAgIHByaW50ZigiICAtRSAgICAgICAgICAgICAgICAgICAgRXhwYW5kIChkdXBsaWNhdGUpIHNlbWFudGljIGZ1bmN0aW9uc1xuIik7CisgICAgcHJpbnRmKCIgIC1JIDxpY2FjaGUtc2l6ZT4gICAgICBHZW5lcmF0ZSBjcmFja2luZyBjYWNoZSB2ZXJzaW9uXG4iKTsKKyAgICBwcmludGYoIiAgLUMgICAgICAgICAgICAgICAgICAgIEluY2x1ZGUgc2VtYW50aWNzIGluIGNhY2hlIGZ1bmN0aW9uc1xuIik7CisgICAgcHJpbnRmKCIgIC1TICAgICAgICAgICAgICAgICAgICBJbmNsdWRlIGluc24gKGluc3RydWN0aW9uKSBpbiBpY2FjaGVcbiIpOworICAgIHByaW50ZigiICAtUiAgICAgICAgICAgICAgICAgICAgVXNlIGRlZmluZXMgdG8gcmVmZXJlbmNlIGNhY2hlIHZhcnNcbiIpOworICAgIHByaW50ZigiICAtTCAgICAgICAgICAgICAgICAgICAgU3VwcmVzcyBsaW5lIG51bWJlcmluZyBpbiBvdXRwdXQgZmlsZXNcbiIpOworICAgIHByaW50ZigiICAtQiA8Yml0LXNpemU+ICAgICAgICAgU2V0IHRoZSBudW1iZXIgb2YgYml0cyBpbiBhbiBpbnN0cnVjdGlvblxuIik7CisgICAgcHJpbnRmKCIgIC1IIDxoaWdoLWJpdD4gICAgICAgICBTZXQgdGhlIG5yIG9mIHRoZSBoaWdoIChtc2IgYml0KVxuIik7CisgICAgcHJpbnRmKCIgIC1OIDxuci1jcHVzPiAgICAgICAgICBTcGVjaWZ5IHRoZSBtYXggbnVtYmVyIG9mIGNwdXMgdGhlIHNpbXVsYXRpb24gd2lsbCBzdXBwb3J0XG4iKTsKKyAgICBwcmludGYoIiAgLUogICAgICAgICAgICAgICAgICAgIFVzZSBqdW1wcyBpbnN0ZWFkIG9mIGZ1bmN0aW9uIGNhbGxzXG4iKTsKKyAgICBwcmludGYoIiAgLVQgPG1lY2hhbmlzbT4gICAgICAgIE92ZXJyaWRlIHRoZSBtZWNoYW5pc20gdXNlZCB0byBkZWNvZGUgYW4gaW5zdHJ1Y3Rpb25cbiIpOworICAgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgPG1lY2hhbmlzbT4gaW5zdGVhZCBvZiB3aGF0IHdhcyBzcGVjaWZpZWQgaW4gdGhlXG4iKTsKKyAgICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZS1ydWxlcyBpbnB1dCBmaWxlXG4iKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCJJbnB1dCBvcHRpb25zICh1Y2FzZSB2ZXJzaW9uIGFsc28gZHVtcHMgbG9hZGVkIHRhYmxlKTpcbiIpOworICAgIHByaW50ZigiICAtbyA8ZGVjb2RlLXJ1bGVzPlxuIik7CisgICAgcHJpbnRmKCIgIC1rIDxjYWNoZS1ydWxlcz5cbiIpOworICAgIHByaW50ZigiICAtaSA8aW5zdHJ1Y3Rpb24tdGFibGU+XG4iKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCJPdXRwdXQgb3B0aW9uczpcbiIpOworICAgIHByaW50ZigiICAtbiA8cmVhbC1uYW1lPiAgICAgICAgU3BlY2lmeSB0aGUgcmVhbCBuYW1lIG9mIGZvciB0aGUgbmV4dCBvdXRwdXQgZmlsZVxuIik7IAorICAgIHByaW50ZigiICAtaCAJCSAgICBHZW5lcmF0ZSBoZWFkZXIgZmlsZVxuIik7CisgICAgcHJpbnRmKCIgIC1jIDxvdXRwdXQtZmlsZT4gICAgICBvdXRwdXQgaWNhY2hlXG4iKTsKKyAgICBwcmludGYoIiAgLWQgPG91dHB1dC1maWxlPiAgICAgIG91dHB1dCBpZGVjb2RlXG4iKTsKKyAgICBwcmludGYoIiAgLW0gPG91dHB1dC1maWxlPiAgICAgIG91dHB1dCBtb2RlbFxuIik7CisgICAgcHJpbnRmKCIgIC1zIDxvdXRwdXQtZmlsZT4gICAgICBvdXRwdXQgc2NoZW1hdGljXG4iKTsKKyAgICBwcmludGYoIiAgLXQgPG91dHB1dC1maWxlPiAgICAgIG91dHB1dCBpdGFibGVcbiIpOworICAgIHByaW50ZigiICAtZiA8b3V0cHV0LWZpbGU+ICAgICAgb3V0cHV0IHN1cHBvcnQgZnVuY3Rpb25zXG4iKTsKKyAgfQorCisgIHdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwKKwkJICAgICAgIkY6RUk6UlNMSlQ6Q0I6SDpOOm86azppOm46aGM6ZDptOnM6dDpmOiIpKQorCSAhPSAtMSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiXHQtJWMgJXNcbiIsIGNoLCAob3B0YXJnID8gb3B0YXJnIDogIiIpKTsKKyAgICBzd2l0Y2goY2gpIHsKKyAgICBjYXNlICdDJzoKKyAgICAgIGNvZGUgfD0gZ2VuZXJhdGVfd2l0aF9pY2FjaGU7CisgICAgICBjb2RlIHw9IGdlbmVyYXRlX3dpdGhfc2VtYW50aWNfaWNhY2hlOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnUyc6CisgICAgICBjb2RlIHw9IGdlbmVyYXRlX3dpdGhfaWNhY2hlOworICAgICAgY29kZSB8PSBnZW5lcmF0ZV93aXRoX2luc25faW5faWNhY2hlOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnTCc6CisgICAgICBmaWxlX3JlZmVyZW5jZXMgPSBsZl9vbWl0X3JlZmVyZW5jZXM7CisgICAgICBicmVhazsKKyAgICBjYXNlICdFJzoKKyAgICAgIGdlbmVyYXRlX2V4cGFuZGVkX2luc3RydWN0aW9ucyA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlICdJJzoKKyAgICAgIGljYWNoZV9zaXplID0gYTJpKG9wdGFyZyk7CisgICAgICBjb2RlIHw9IGdlbmVyYXRlX3dpdGhfaWNhY2hlOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnTic6CisgICAgICBnZW5lcmF0ZV9zbXAgPSBhMmkob3B0YXJnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1InOgorICAgICAgY29kZSB8PSBnZW5lcmF0ZV93aXRoX2RpcmVjdF9hY2Nlc3M7CisgICAgICBicmVhazsKKyAgICBjYXNlICdCJzoKKyAgICAgIGluc25fYml0X3NpemUgPSBhMmkob3B0YXJnKTsKKyAgICAgIEFTU0VSVChpbnNuX2JpdF9zaXplID4gMCAmJiBpbnNuX2JpdF9zaXplIDw9IG1heF9pbnNuX2JpdF9zaXplCisJICAgICAmJiAoaGlfYml0X25yID09IGluc25fYml0X3NpemUtMSB8fCBoaV9iaXRfbnIgPT0gMCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnSCc6CisgICAgICBoaV9iaXRfbnIgPSBhMmkob3B0YXJnKTsKKyAgICAgIEFTU0VSVChoaV9iaXRfbnIgPT0gaW5zbl9iaXRfc2l6ZS0xIHx8IGhpX2JpdF9uciA9PSAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0YnOgorICAgICAgZmlsdGVycyA9IG5ld19maWx0ZXIob3B0YXJnLCBmaWx0ZXJzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0onOgorICAgICAgY29kZSAmPSB+Z2VuZXJhdGVfY2FsbHM7CisgICAgICBjb2RlIHw9IGdlbmVyYXRlX2p1bXBzOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnVCc6CisgICAgICBmb3JjZV9kZWNvZGVfZ2VuX3R5cGUob3B0YXJnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2knOgorICAgICAgaWYgKGRlY29kZV9ydWxlcyA9PSBOVUxMIHx8IGNhY2hlX3J1bGVzID09IE5VTEwpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIk11c3Qgc3BlY2lmeSBkZWNvZGUgYW5kIGNhY2hlIHRhYmxlc1xuIik7CisJZXhpdCAoMSk7CisgICAgICB9CisgICAgICBpbnN0cnVjdGlvbnMgPSBsb2FkX2luc25fdGFibGUob3B0YXJnLCBkZWNvZGVfcnVsZXMsIGZpbHRlcnMpOworICAgICAgZnByaW50ZihzdGRlcnIsICJcdGV4cGFuZGluZyAuLi5cbiIpOworICAgICAgaW5zbl90YWJsZV9leHBhbmRfaW5zbnMoaW5zdHJ1Y3Rpb25zKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ28nOgorICAgICAgZGVjb2RlX3J1bGVzID0gbG9hZF9kZWNvZGVfdGFibGUob3B0YXJnLCBoaV9iaXRfbnIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnayc6CisgICAgICBjYWNoZV9ydWxlcyA9IGxvYWRfY2FjaGVfdGFibGUob3B0YXJnLCBoaV9iaXRfbnIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnbic6CisgICAgICByZWFsX2ZpbGVfbmFtZSA9IHN0cmR1cChvcHRhcmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnaCc6CisgICAgICBpc19oZWFkZXIgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncyc6CisgICAgY2FzZSAnZCc6CisgICAgY2FzZSAnbSc6CisgICAgY2FzZSAndCc6CisgICAgY2FzZSAnZic6CisgICAgY2FzZSAnYyc6CisgICAgICB7CisJbGYgKmZpbGUgPSBsZl9vcGVuKG9wdGFyZywgcmVhbF9maWxlX25hbWUsIGZpbGVfcmVmZXJlbmNlcywKKwkJCSAgIChpc19oZWFkZXIgPyBsZl9pc19oIDogbGZfaXNfYyksCisJCQkgICBhcmd2WzBdKTsKKwlsZl9wcmludF9fZmlsZV9zdGFydChmaWxlKTsKKwlBU1NFUlQoaW5zdHJ1Y3Rpb25zICE9IE5VTEwpOworCXN3aXRjaCAoY2gpIHsKKwljYXNlICdzJzoKKwkgIGlmKGlzX2hlYWRlcikKKwkgICAgZ2VuX3NlbWFudGljc19oKGluc3RydWN0aW9ucywgZmlsZSwgY29kZSk7CisJICBlbHNlCisJICAgIGdlbl9zZW1hbnRpY3NfYyhpbnN0cnVjdGlvbnMsIGNhY2hlX3J1bGVzLCBmaWxlLCBjb2RlKTsKKwkgIGJyZWFrOworCWNhc2UgJ2QnOgorCSAgaWYgKGlzX2hlYWRlcikKKwkgICAgZ2VuX2lkZWNvZGVfaChmaWxlLCBpbnN0cnVjdGlvbnMsIGNhY2hlX3J1bGVzKTsKKwkgIGVsc2UKKwkgICAgZ2VuX2lkZWNvZGVfYyhmaWxlLCBpbnN0cnVjdGlvbnMsIGNhY2hlX3J1bGVzKTsKKwkgIGJyZWFrOworCWNhc2UgJ20nOgorCSAgaWYgKGlzX2hlYWRlcikKKwkgICAgZ2VuX21vZGVsX2goaW5zdHJ1Y3Rpb25zLCBmaWxlKTsKKwkgIGVsc2UKKwkgICAgZ2VuX21vZGVsX2MoaW5zdHJ1Y3Rpb25zLCBmaWxlKTsKKwkgIGJyZWFrOworCWNhc2UgJ3QnOgorCSAgaWYgKGlzX2hlYWRlcikKKwkgICAgZ2VuX2l0YWJsZV9oKGluc3RydWN0aW9ucywgZmlsZSk7CisJICBlbHNlCisJICAgIGdlbl9pdGFibGVfYyhpbnN0cnVjdGlvbnMsIGZpbGUpOworCSAgYnJlYWs7CisJY2FzZSAnZic6CisJICBpZiAoaXNfaGVhZGVyKQorCSAgICBnZW5fc3VwcG9ydF9oKGluc3RydWN0aW9ucywgZmlsZSk7CisJICBlbHNlCisJICAgIGdlbl9zdXBwb3J0X2MoaW5zdHJ1Y3Rpb25zLCBmaWxlKTsKKwkgIGJyZWFrOworCWNhc2UgJ2MnOgorCSAgaWYgKGlzX2hlYWRlcikKKwkgICAgZ2VuX2ljYWNoZV9oKGluc3RydWN0aW9ucywgZmlsZSwgY29kZSk7CisJICBlbHNlCisJICAgIGdlbl9pY2FjaGVfYyhpbnN0cnVjdGlvbnMsIGNhY2hlX3J1bGVzLCBmaWxlLCBjb2RlKTsKKwkgIGJyZWFrOworCX0KKwlsZl9wcmludF9fZmlsZV9maW5pc2goZmlsZSk7CisJbGZfY2xvc2UoZmlsZSk7CisJaXNfaGVhZGVyID0gMDsKKyAgICAgIH0KKyAgICAgIHJlYWxfZmlsZV9uYW1lID0gTlVMTDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvcigidW5rbm93biBvcHRpb25cbiIpOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NpbS9wcGMvaWdlbi5oIGIvc2ltL3BwYy9pZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM0NjIwOQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvaWdlbi5oCkBAIC0wLDAgKzEsMTk5IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NCwxOTk1LDE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKy8qIFdoYXQgZG9lcyB0aGUgaW5zdHJ1Y3Rpb24gbG9vayBsaWtlIC0gYml0IG9yZGVyaW5nIGFuZCBzaXplICovCitleHRlcm4gaW50IGhpX2JpdF9ucjsKK2V4dGVybiBpbnQgaW5zbl9iaXRfc2l6ZTsKKworCisvKiBnZW5lcmF0aW9uIG9wdGlvbnM6ICovCisKKworZW51bSB7CisgIGdlbmVyYXRlX3dpdGhfZGlyZWN0X2FjY2VzcyA9IDB4MSwKKyAgZ2VuZXJhdGVfd2l0aF9pY2FjaGUgPSAweDIsCisgIGdlbmVyYXRlX3dpdGhfc2VtYW50aWNfaWNhY2hlID0gMHg0LAorICBnZW5lcmF0ZV93aXRoX2luc25faW5faWNhY2hlID0gMHg4LAorfTsKKworCit0eXBlZGVmIGVudW0geworCisgIC8qIFRyYW5zZmVyIGNvbnRyb2wgdG8gYW4gaW5zdHJ1Y3Rpb25zIHNlbWFudGljIGNvZGUgdXNpbmcgdGhlIHRoZQorICAgICBzdGFuZGFyZCBjYWxsL3JldHVybiBtZWNoYW5pc20gKi8KKworICBnZW5lcmF0ZV9jYWxscyA9IDB4MTAwLAorCisgIC8qIEluIGFkZGl0aW9uLCB3aGVuIHJlZmVyaW5nIHRvIGZpZWxkcyBhY2Nlc3MgdGhlbSBkaXJlY3RseSBpbnN0ZWFkCisgICAgIG9mIHZpYSB2YXJpYWJsZXMgKi8KKworICBnZW5lcmF0ZV9jYWxsc193aXRoX2RpcmVjdF9hY2Nlc3MKKyAgICA9IGdlbmVyYXRlX2NhbGxzIHwgZ2VuZXJhdGVfd2l0aF9kaXJlY3RfYWNjZXNzLAorCisgIC8qIEluIGFkZGl0aW9uLCBwcmUtZGVjb2RlIGFuIGluc3RydWN0aW9ucyBvcGNvZGUgZmllbGRzIChlbnRlcmluZworICAgICB0aGVtIGludG8gYW4gaWNhY2hlKSBzbyB0aGF0IHNlbWFudGljIGNvZGUgY2FuIGF2b2lkIHRoZSBuZWVkIHRvCisgICAgIHJlLWRlY29kZSBmaWVsZHMgZWFjaCB0aW1lIGl0IGlzIGV4ZWN1dGVkICovCisKKyAgZ2VuZXJhdGVfY2FsbHNfd2l0aF9pY2FjaGUKKyAgICA9IGdlbmVyYXRlX2NhbGxzIHwgZ2VuZXJhdGVfd2l0aF9pY2FjaGUsCisKKyAgLyogSW4gYWRkaXRpb24sIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGUgY29kZSBpbmNsdWRlcyBhIGR1cGxpY2F0ZWQKKyAgICAgY29weSBvZiB0aGUgaW5zdHJ1Y3Rpb25zIHNlbWFudGljIGNvZGUuICBUaGlzIGF2b2lkcyB0aGUgbmVlZCB0bworICAgICBwZXJmb3JtIHR3byBjYWxscyAob25lIHRvIGRlY29kZSBhbiBpbnN0cnVjdGlvbnMgb3Bjb2RlIGZpZWxkcworICAgICBhbmQgb25lIHRvIGV4ZWN1dGUgdGhlIGluc3RydWN0aW9uKSB3aGVuIHRoZXJlIGlzIGEgbWlzcyBvZiB0aGUKKyAgICAgaWNhY2hlICovCisKKyAgZ2VuZXJhdGVfY2FsbHNfd2l0aF9zZW1hbnRpY19pY2FjaGUKKyAgICA9IGdlbmVyYXRlX2NhbGxzX3dpdGhfaWNhY2hlIHwgZ2VuZXJhdGVfd2l0aF9zZW1hbnRpY19pY2FjaGUsCisKKyAgLyogSW4gYWRkaXRpb24sIHRoZSBzZW1hbnRpYyBmdW5jdGlvbiByZWZlcnMgdG8gaWNhY2hlIGVudHJpZXMKKyAgICAgZGlyZWN0bHkgaW5zdGVhZCBvZiBmaXJzdCBtb3ZpbmcgdGhlbSBpbnRvIGxvY2FsIHZhcmlhYmxlcyAqLworCisgIGdlbmVyYXRlX2NhbGxzX3dpdGhfZGlyZWN0X2FjY2Vzc19pY2FjaGUKKyAgICA9IGdlbmVyYXRlX2NhbGxzX3dpdGhfaWNhY2hlIHwgZ2VuZXJhdGVfd2l0aF9kaXJlY3RfYWNjZXNzLAorCisgIGdlbmVyYXRlX2NhbGxzX3dpdGhfZGlyZWN0X2FjY2Vzc19zZW1hbnRpY19pY2FjaGUKKyAgICA9IGdlbmVyYXRlX2NhbGxzX3dpdGhfZGlyZWN0X2FjY2Vzc19pY2FjaGUgfCBnZW5lcmF0ZV93aXRoX3NlbWFudGljX2ljYWNoZSwKKworCisgIC8qIFRyYW5zZmVyIGNvbnRyb2wgdG8gYW4gaW5zdHJ1Y3Rpb25zIHNlbWFudGljIGNvZGUgdXNpbmcKKyAgICAgKGNvbXB1dGVkKSBnb3RvJ3MgaW5zdGVhZCBvZiB0aGUgbW9yZSBjb252ZW50aW9uYWwgY2FsbC9yZXR1cm4KKyAgICAgbWVjaGFuaXNtICovCisKKyAgZ2VuZXJhdGVfanVtcHMgPSAweDIwMCwKKworICAvKiBBcyBmb3IgZ2VuZXJhdGUganVtcHMgYnV0IHdpdGggaW5zdHJ1Y3Rpb24gZmllbGRzIGFjY2Vzc2VkCisgICAgIGRpcmVjdGx5ICovCisKKyAgZ2VuZXJhdGVfanVtcHNfd2l0aF9kaXJlY3RfYWNjZXNzCisgICAgPSBnZW5lcmF0ZV9qdW1wcyB8IGdlbmVyYXRlX3dpdGhfZGlyZWN0X2FjY2VzcywKKworICAvKiBBcyBmb3IgZ2VuZXJhdGVfY2FsbHNfd2l0aF9pY2FjaGUgYnV0IGFwcGxpZXMgdG8ganVtcGluZyBjb2RlICovCisKKyAgZ2VuZXJhdGVfanVtcHNfd2l0aF9pY2FjaGUKKyAgICA9IGdlbmVyYXRlX2p1bXBzIHwgZ2VuZXJhdGVfd2l0aF9pY2FjaGUsCisKKyAgLyogQXMgZm9yIGdlbmVyYXRlX2NhbGxzX3dpdGhfc2VtYW50aWNfaWNhY2hlIGJ1dCBhcHBsaWVzIHRvIGp1bXBpbmcKKyAgICAgY29kZSAqLworCisgIGdlbmVyYXRlX2p1bXBzX3dpdGhfc2VtYW50aWNfaWNhY2hlCisgICAgPSBnZW5lcmF0ZV9qdW1wc193aXRoX2ljYWNoZSB8IGdlbmVyYXRlX3dpdGhfc2VtYW50aWNfaWNhY2hlLAorCisgIC8qIEFzIGZvciBnZW5lcmF0ZV9jYWxsc193aXRoX2RpcmVjdF9hY2Nlc3MgKi8KKworICBnZW5lcmF0ZV9qdW1wc193aXRoX2RpcmVjdF9hY2Nlc3NfaWNhY2hlCisgICAgPSBnZW5lcmF0ZV9qdW1wc193aXRoX2ljYWNoZSB8IGdlbmVyYXRlX3dpdGhfZGlyZWN0X2FjY2VzcywKKworICBnZW5lcmF0ZV9qdW1wc193aXRoX2RpcmVjdF9hY2Nlc3Nfc2VtYW50aWNfaWNhY2hlCisgICAgPSBnZW5lcmF0ZV9qdW1wc193aXRoX2RpcmVjdF9hY2Nlc3NfaWNhY2hlIHwgZ2VuZXJhdGVfd2l0aF9zZW1hbnRpY19pY2FjaGUsCisKK30gaWdlbl9jb2RlOworCitleHRlcm4gaWdlbl9jb2RlIGNvZGU7CisKKworCisKK2V4dGVybiBpbnQgaWNhY2hlX3NpemU7CisKKworLyogSW5zdHJ1Y3Rpb24gZXhwYW5zaW9uPworCisgICBTaG91bGQgdGhlIHNlbWFudGljIGNvZGUgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24sIHdoZW4gdGhlIG9wb3J0dW5pdHkKKyAgIGFycmlzZXMsIGJlIGV4cGFuZGVkIGFjY29yZGluZyB0byB0aGUgdmFyaWFibGUgb3Bjb2RlIGZpbGVzIHRoYXQKKyAgIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGUgcHJvY2VzcyByZW5kZXJzIGNvbnN0YW50ICovCisKK2V4dGVybiBpbnQgZ2VuZXJhdGVfZXhwYW5kZWRfaW5zdHJ1Y3Rpb25zOworCisKKy8qIFNNUD8KKworICAgU2hvdWxkIHRoZSBnZW5lcmF0ZWQgY29kZSBpbmNsdWRlIFNNUCBzdXBwb3J0ICg+MCkgYW5kIGlmIHNvLCBmb3IKKyAgIGhvdyBtYW55IHByb2Nlc3NvcnM/ICovCisKK2V4dGVybiBpbnQgZ2VuZXJhdGVfc21wOworCisKKworCisvKiBNaXNjIGp1bmsgKi8KKworCisKKy8qIEZ1bmN0aW9uIGhlYWRlciBkZWZpbml0aW9ucyAqLworCisKKy8qIENhY2hlIGZ1bmN0aW9uczogKi8KKworI2RlZmluZSBJQ0FDSEVfRlVOQ1RJT05fRk9STUFMIFwKKyJjcHUgKnByb2Nlc3NvcixcblwKKyBpbnN0cnVjdGlvbl93b3JkIGluc3RydWN0aW9uLFxuXAorIHVuc2lnbmVkX3dvcmQgY2lhLFxuXAorIGlkZWNvZGVfY2FjaGUgKmNhY2hlX2VudHJ5IgorCisjZGVmaW5lIElDQUNIRV9GVU5DVElPTl9BQ1RVQUwgInByb2Nlc3NvciwgaW5zdHJ1Y3Rpb24sIGNpYSwgY2FjaGVfZW50cnkiCisKKyNkZWZpbmUgSUNBQ0hFX0ZVTkNUSU9OX1RZUEUgXAorKChjb2RlICYgZ2VuZXJhdGVfd2l0aF9zZW1hbnRpY19pY2FjaGUpIFwKKyA/IFNFTUFOVElDX0ZVTkNUSU9OX1RZUEUgXAorIDogImlkZWNvZGVfc2VtYW50aWMgKiIpCisKKworLyogU2VtYW50aWMgZnVuY3Rpb25zOiAqLworCisjZGVmaW5lIFNFTUFOVElDX0ZVTkNUSU9OX0ZPUk1BTCBcCisoKGNvZGUgJiBnZW5lcmF0ZV93aXRoX2ljYWNoZSkgXAorID8gImNwdSAqcHJvY2Vzc29yLFxuIGlkZWNvZGVfY2FjaGUgKmNhY2hlX2VudHJ5LFxuIHVuc2lnbmVkX3dvcmQgY2lhIiBcCisgOiAiY3B1ICpwcm9jZXNzb3IsXG4gaW5zdHJ1Y3Rpb25fd29yZCBpbnN0cnVjdGlvbixcbiB1bnNpZ25lZF93b3JkIGNpYSIpCisKKyNkZWZpbmUgU0VNQU5USUNfRlVOQ1RJT05fQUNUVUFMIFwKKygoY29kZSAmIGdlbmVyYXRlX3dpdGhfaWNhY2hlKSBcCisgPyAicHJvY2Vzc29yLCBpbnN0cnVjdGlvbiwgY2lhLCBjYWNoZV9lbnRyeSIgXAorIDogInByb2Nlc3NvciwgaW5zdHJ1Y3Rpb24sIGNpYSIpCisKKyNkZWZpbmUgU0VNQU5USUNfRlVOQ1RJT05fVFlQRSAidW5zaWduZWRfd29yZCIKKworCisKK2V4dGVybiB2b2lkIHByaW50X215X2RlZmluZXMKKyhsZiAqZmlsZSwKKyBpbnNuX2JpdHMgKmV4cGFuZGVkX2JpdHMsCisgdGFibGVfZW50cnkgKmZpbGVfZW50cnkpOworCitleHRlcm4gdm9pZCBwcmludF9pdHJhY2UKKyhsZiAqZmlsZSwKKyB0YWJsZV9lbnRyeSAqZmlsZV9lbnRyeSwKKyBpbnQgaWRlY29kZSk7CisKKwordHlwZWRlZiBlbnVtIHsKKyAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfc2VtYW50aWNzLAorICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pZGVjb2RlLAorICBmdW5jdGlvbl9uYW1lX3ByZWZpeF9pdGFibGUsCisgIGZ1bmN0aW9uX25hbWVfcHJlZml4X2ljYWNoZSwKKyAgZnVuY3Rpb25fbmFtZV9wcmVmaXhfbm9uZQorfSBsZl9mdW5jdGlvbl9uYW1lX3ByZWZpeGVzOworCitleHRlcm4gaW50IHByaW50X2Z1bmN0aW9uX25hbWUKKyhsZiAqZmlsZSwKKyBjb25zdCBjaGFyICpiYXNlbmFtZSwKKyBpbnNuX2JpdHMgKmV4cGFuZGVkX2JpdHMsCisgbGZfZnVuY3Rpb25fbmFtZV9wcmVmaXhlcyBwcmVmaXgpOwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9pbmxpbmUuYyBiL3NpbS9wcGMvaW5saW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1OTVhNQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvaW5saW5lLmMKQEAgLTAsMCArMSw5OCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfSU5MSU5FX0NfCisjZGVmaW5lIF9JTkxJTkVfQ18KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInBwYy1jb25maWcuaCIKKworI2luY2x1ZGUgImlubGluZS5oIgorCisjaWYgKEJJVFNfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCisjaW5jbHVkZSAiYml0cy5jIgorI2VuZGlmCisKKyNpZiAoU0lNX0VORElBTl9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKKyNpbmNsdWRlICJzaW0tZW5kaWFuLmMiCisjZW5kaWYKKworI2lmIChJQ0FDSEVfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCisjaW5jbHVkZSAiaWNhY2hlLmMiCisjZW5kaWYKKworI2lmIChDT1JFX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQorI2luY2x1ZGUgImNvcmVmaWxlLmMiCisjZW5kaWYKKworI2lmIChWTV9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKKyNpbmNsdWRlICJ2bS5jIgorI2VuZGlmCisKKyNpZiAoRVZFTlRTX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQorI2luY2x1ZGUgImV2ZW50cy5jIgorI2VuZGlmCisKKyNpZiAoTU9ERUxfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCisjaW5jbHVkZSAibW9kZWwuYyIKKyNlbmRpZgorCisjaWYgKE9QVElPTlNfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCisjaW5jbHVkZSAib3B0aW9ucy5jIgorI2VuZGlmCisKKyNpZiAoTU9OX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQorI2luY2x1ZGUgIm1vbi5jIgorI2VuZGlmCisKKyNpZiAoUkVHSVNURVJTX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQorI2luY2x1ZGUgInJlZ2lzdGVycy5jIgorI2VuZGlmCisKKyNpZiAoSU5URVJSVVBUU19JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKKyNpbmNsdWRlICJpbnRlcnJ1cHRzLmMiCisjZW5kaWYKKworI2lmIChERVZJQ0VfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCisjaW5jbHVkZSAiZGV2aWNlLmMiCisjZW5kaWYKKworI2lmIChUUkVFX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQorI2luY2x1ZGUgInRyZWUuYyIKKyNlbmRpZgorCisjaWYgKFNQUkVHX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQorI2luY2x1ZGUgInNwcmVnLmMiCisjZW5kaWYKKworI2lmIChTRU1BTlRJQ1NfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCisjaW5jbHVkZSAic2VtYW50aWNzLmMiCisjZW5kaWYKKworI2lmIChJREVDT0RFX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQorI2luY2x1ZGUgImlkZWNvZGUuYyIKKyNlbmRpZgorCisjaWYgKE9TX0VNVUxfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCisjaW5jbHVkZSAib3NfZW11bC5jIgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9pbmxpbmUuaCBiL3NpbS9wcGMvaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4Y2Q5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvaW5saW5lLmgKQEAgLTAsMCArMSw0OTAgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgX0lOTElORV9IXworI2RlZmluZSBfSU5MSU5FX0hfCisKKworI2RlZmluZSBTVEFUSUMoVFlQRSkgc3RhdGljIFRZUEUKKworCisvKiBzaW1fZW5kaWFuIGlzIGFsd2F5cyBpbmxpbmVkICovCisKKyNpZiAhZGVmaW5lZChfU0lNX0VORElBTl9DXykgJiYgKFNJTV9FTkRJQU5fSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCisjIGlmIChTSU1fRU5ESUFOX0lOTElORSAmIElOTElORV9NT0RVTEUpCisjICBkZWZpbmUgSU5MSU5FX1NJTV9FTkRJQU4oVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9TSU1fRU5ESUFOKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorIyBlbHNlCisjICBkZWZpbmUgSU5MSU5FX1NJTV9FTkRJQU4oVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECisjICBkZWZpbmUgRVhURVJOX1NJTV9FTkRJQU4oVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgSU5MSU5FX1NJTV9FTkRJQU4oVFlQRSkgVFlQRQorIyBkZWZpbmUgRVhURVJOX1NJTV9FTkRJQU4oVFlQRSkgVFlQRQorI2VuZGlmCisKKyNpZiAoU0lNX0VORElBTl9JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9TSU1fRU5ESUFOKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQorI2Vsc2UKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU0lNX0VORElBTihUWVBFKSBzdGF0aWMgVFlQRQorI2VuZGlmCisKKworLyogYml0cyBpcyBhbHdheXMgaW5saW5lZCAqLworCisjaWYgIWRlZmluZWQoX0JJVFNfQ18pICYmIChCSVRTX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQorIyBpZiAoQklUU19JTkxJTkUgJiBJTkxJTkVfTU9EVUxFKQorIyAgZGVmaW5lIElOTElORV9CSVRTKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKKyMgIGRlZmluZSBFWFRFUk5fQklUUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyMgZWxzZQorIyAgZGVmaW5lIElOTElORV9CSVRTKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9CSVRTKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIElOTElORV9CSVRTKFRZUEUpIFRZUEUKKyMgZGVmaW5lIEVYVEVSTl9CSVRTKFRZUEUpIFRZUEUKKyNlbmRpZgorCisjaWYgKEJJVFNfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfQklUUyhUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKKyNlbHNlCisjIGRlZmluZSBTVEFUSUNfSU5MSU5FX0JJVFMoVFlQRSkgc3RhdGljIFRZUEUKKyNlbmRpZgorCisKKy8qIGNvcmUgaXMgaW5saW5lZCB3aXRoIGlubGluZS5jICovCisKKyNpZiBkZWZpbmVkKF9JTkxJTkVfQ18pICYmICFkZWZpbmVkKF9DT1JFX0NfKSAmJiAoQ09SRV9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKKyMgaWYgKENPUkVfSU5MSU5FICYgSU5MSU5FX01PRFVMRSkKKyMgIGRlZmluZSBJTkxJTkVfQ09SRShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECisjICBkZWZpbmUgRVhURVJOX0NPUkUoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECisjZWxzZQorIyAgZGVmaW5lIElOTElORV9DT1JFKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9DT1JFKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorI2VuZGlmCisjZWxzZQorIyBkZWZpbmUgSU5MSU5FX0NPUkUoVFlQRSkgVFlQRQorIyBkZWZpbmUgRVhURVJOX0NPUkUoVFlQRSkgVFlQRQorI2VuZGlmCisKKyNpZiAoQ09SRV9JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9DT1JFKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQorI2Vsc2UKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfQ09SRShUWVBFKSBzdGF0aWMgVFlQRQorI2VuZGlmCisKKworLyogdm0gaXMgaW5saW5lZCB3aXRoIGlubGluZS5jICovCisKKyNpZiBkZWZpbmVkKF9JTkxJTkVfQ18pICYmICFkZWZpbmVkKF9WTV9DXykgJiYgKFZNX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQorIyBpZiAoVk1fSU5MSU5FICYgSU5MSU5FX01PRFVMRSkKKyMgIGRlZmluZSBJTkxJTkVfVk0oVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9WTShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyNlbHNlCisjICBkZWZpbmUgSU5MSU5FX1ZNKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9WTShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyNlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIElOTElORV9WTShUWVBFKSBUWVBFCisjIGRlZmluZSBFWFRFUk5fVk0oVFlQRSkgVFlQRQorI2VuZGlmCisKKyNpZiAoVk1fSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfVk0oVFlQRSkgc3RhdGljIElOTElORSBUWVBFCisjZWxzZQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9WTShUWVBFKSBzdGF0aWMgVFlQRQorI2VuZGlmCisKKworLyogY3B1IGlzIGFsd2F5cyBpbmxpbmVkICovCisKKyNpZiAhZGVmaW5lZChfQ1BVX0NfKSAmJiAoQ1BVX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQorIyBpZiAoQ1BVX0lOTElORSAmIElOTElORV9NT0RVTEUpCisjICBkZWZpbmUgSU5MSU5FX0NQVShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECisjICBkZWZpbmUgRVhURVJOX0NQVShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyNlbHNlCisjICBkZWZpbmUgSU5MSU5FX0NQVShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyMgIGRlZmluZSBFWFRFUk5fQ1BVKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorI2VuZGlmCisjZWxzZQorIyBkZWZpbmUgSU5MSU5FX0NQVShUWVBFKSBUWVBFCisjIGRlZmluZSBFWFRFUk5fQ1BVKFRZUEUpIFRZUEUKKyNlbmRpZgorCisjaWYgKENQVV9JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9DUFUoVFlQRSkgc3RhdGljIElOTElORSBUWVBFCisjZWxzZQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9DUFUoVFlQRSkgc3RhdGljIFRZUEUKKyNlbmRpZgorCisKKy8qIG1vZGVsIGlzIGlubGluZWQgd2l0aCBpbmxpbmUuYyAqLworCisjaWYgZGVmaW5lZChfSU5MSU5FX0NfKSAmJiAhZGVmaW5lZChfTU9ERUxfQ18pICYmIChNT0RFTF9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKKyMgaWYgKE1PREVMX0lOTElORSAmIElOTElORV9NT0RVTEUpCisjICBkZWZpbmUgSU5MSU5FX01PREVMKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKKyMgIGRlZmluZSBFWFRFUk5fTU9ERUwoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECisjZWxzZQorIyAgZGVmaW5lIElOTElORV9NT0RFTChUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyMgIGRlZmluZSBFWFRFUk5fTU9ERUwoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECisjZW5kaWYKKyNlbHNlCisjIGRlZmluZSBJTkxJTkVfTU9ERUwoVFlQRSkgVFlQRQorIyBkZWZpbmUgRVhURVJOX01PREVMKFRZUEUpIFRZUEUKKyNlbmRpZgorCisjaWYgKE1PREVMX0lOTElORSAmIElOTElORV9MT0NBTFMpCisjIGRlZmluZSBTVEFUSUNfSU5MSU5FX01PREVMKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQorI2Vsc2UKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfTU9ERUwoVFlQRSkgc3RhdGljIFRZUEUKKyNlbmRpZgorCisKKy8qIGV2ZW50cyBpcyBpbmxpbmVkIHdpdGggaW5saW5lLmMgKi8KKworI2lmIGRlZmluZWQoX0lOTElORV9DXykgJiYgIWRlZmluZWQoX0VWRU5UU19DXykgJiYgKEVWRU5UU19JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKKyMgaWYgKEVWRU5UU19JTkxJTkUgJiBJTkxJTkVfTU9EVUxFKQorIyAgZGVmaW5lIElOTElORV9FVkVOVFMoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9FVkVOVFMoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECisjZWxzZQorIyAgZGVmaW5lIElOTElORV9FVkVOVFMoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECisjICBkZWZpbmUgRVhURVJOX0VWRU5UUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyNlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIElOTElORV9FVkVOVFMoVFlQRSkgVFlQRQorIyBkZWZpbmUgRVhURVJOX0VWRU5UUyhUWVBFKSBUWVBFCisjZW5kaWYKKworI2lmIChFVkVOVFNfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfRVZFTlRTKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQorI2Vsc2UKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfRVZFTlRTKFRZUEUpIHN0YXRpYyBUWVBFCisjZW5kaWYKKworCisvKiBtb24gaXMgaW5saW5lZCB3aXRoIGlubGluZS5jICovCisKKyNpZiBkZWZpbmVkKF9JTkxJTkVfQ18pICYmICFkZWZpbmVkKF9NT05fQ18pICYmIChNT05fSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCisjIGlmIChNT05fSU5MSU5FICYgSU5MSU5FX01PRFVMRSkKKyMgIGRlZmluZSBJTkxJTkVfTU9OKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKKyMgIGRlZmluZSBFWFRFUk5fTU9OKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorI2Vsc2UKKyMgIGRlZmluZSBJTkxJTkVfTU9OKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9NT04oVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECisjZW5kaWYKKyNlbHNlCisjIGRlZmluZSBJTkxJTkVfTU9OKFRZUEUpIFRZUEUKKyMgZGVmaW5lIEVYVEVSTl9NT04oVFlQRSkgVFlQRQorI2VuZGlmCisKKyNpZiAoTU9OX0lOTElORSAmIElOTElORV9MT0NBTFMpCisjIGRlZmluZSBTVEFUSUNfSU5MSU5FX01PTihUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKKyNlbHNlCisjIGRlZmluZSBTVEFUSUNfSU5MSU5FX01PTihUWVBFKSBzdGF0aWMgVFlQRQorI2VuZGlmCisKKworLyogcmVnaXN0ZXJzIGlzIGlubGluZWQgd2l0aCBpbmxpbmUuYyAqLworCisjaWYgZGVmaW5lZChfSU5MSU5FX0NfKSAmJiAhZGVmaW5lZChfUkVHSVNURVJTX0NfKSAmJiAoUkVHSVNURVJTX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQorIyBpZiAoUkVHSVNURVJTX0lOTElORSAmIElOTElORV9NT0RVTEUpCisjICBkZWZpbmUgSU5MSU5FX1JFR0lTVEVSUyhUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECisjICBkZWZpbmUgRVhURVJOX1JFR0lTVEVSUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyNlbHNlCisjICBkZWZpbmUgSU5MSU5FX1JFR0lTVEVSUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyMgIGRlZmluZSBFWFRFUk5fUkVHSVNURVJTKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorI2VuZGlmCisjZWxzZQorIyBkZWZpbmUgSU5MSU5FX1JFR0lTVEVSUyhUWVBFKSBUWVBFCisjIGRlZmluZSBFWFRFUk5fUkVHSVNURVJTKFRZUEUpIFRZUEUKKyNlbmRpZgorCisjaWYgKFJFR0lTVEVSU19JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9SRUdJU1RFUlMoVFlQRSkgc3RhdGljIElOTElORSBUWVBFCisjZWxzZQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9SRUdJU1RFUlMoVFlQRSkgc3RhdGljIFRZUEUKKyNlbmRpZgorCisKKy8qIGludGVycnVwdHMgaXMgaW5saW5lZCB3aXRoIGlubGluZS5jICovCisKKyNpZiBkZWZpbmVkKF9JTkxJTkVfQ18pICYmICFkZWZpbmVkKF9JTlRFUlJVUFRTX0NfKSAmJiAoSU5URVJSVVBUU19JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKKyMgaWYgKElOVEVSUlVQVFNfSU5MSU5FICYgSU5MSU5FX01PRFVMRSkKKyMgIGRlZmluZSBJTkxJTkVfSU5URVJSVVBUUyhUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECisjICBkZWZpbmUgRVhURVJOX0lOVEVSUlVQVFMoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECisjZWxzZQorIyAgZGVmaW5lIElOTElORV9JTlRFUlJVUFRTKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9JTlRFUlJVUFRTKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorI2VuZGlmCisjZWxzZQorIyBkZWZpbmUgSU5MSU5FX0lOVEVSUlVQVFMoVFlQRSkgVFlQRQorIyBkZWZpbmUgRVhURVJOX0lOVEVSUlVQVFMoVFlQRSkgVFlQRQorI2VuZGlmCisKKyNpZiAoSU5URVJSVVBUU19JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9JTlRFUlJVUFRTKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQorI2Vsc2UKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfSU5URVJSVVBUUyhUWVBFKSBzdGF0aWMgVFlQRQorI2VuZGlmCisKKworLyogZGV2aWNlIGlzIGlubGluZWQgd2l0aCBpbmxpbmUuYyAqLworCisjaWYgZGVmaW5lZChfSU5MSU5FX0NfKSAmJiAhZGVmaW5lZChfREVWSUNFX0NfKSAmJiAoREVWSUNFX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQorIyBpZiAoREVWSUNFX0lOTElORSAmIElOTElORV9NT0RVTEUpCisjICBkZWZpbmUgSU5MSU5FX0RFVklDRShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECisjICBkZWZpbmUgRVhURVJOX0RFVklDRShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyNlbHNlCisjICBkZWZpbmUgSU5MSU5FX0RFVklDRShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyMgIGRlZmluZSBFWFRFUk5fREVWSUNFKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorI2VuZGlmCisjZWxzZQorIyBkZWZpbmUgSU5MSU5FX0RFVklDRShUWVBFKSBUWVBFCisjIGRlZmluZSBFWFRFUk5fREVWSUNFKFRZUEUpIFRZUEUKKyNlbmRpZgorCisjaWYgKERFVklDRV9JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9ERVZJQ0UoVFlQRSkgc3RhdGljIElOTElORSBUWVBFCisjZWxzZQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9ERVZJQ0UoVFlQRSkgc3RhdGljIFRZUEUKKyNlbmRpZgorCisKKy8qIHRyZWUgaXMgaW5saW5lZCB3aXRoIGlubGluZS5jICovCisKKyNpZiBkZWZpbmVkKF9JTkxJTkVfQ18pICYmICFkZWZpbmVkKF9UUkVFX0NfKSAmJiAoVFJFRV9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKKyMgaWYgKFRSRUVfSU5MSU5FICYgSU5MSU5FX01PRFVMRSkKKyMgIGRlZmluZSBJTkxJTkVfVFJFRShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECisjICBkZWZpbmUgRVhURVJOX1RSRUUoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECisjZWxzZQorIyAgZGVmaW5lIElOTElORV9UUkVFKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9UUkVFKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorI2VuZGlmCisjZWxzZQorIyBkZWZpbmUgSU5MSU5FX1RSRUUoVFlQRSkgVFlQRQorIyBkZWZpbmUgRVhURVJOX1RSRUUoVFlQRSkgVFlQRQorI2VuZGlmCisKKyNpZiAoVFJFRV9JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9UUkVFKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQorI2Vsc2UKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfVFJFRShUWVBFKSBzdGF0aWMgVFlQRQorI2VuZGlmCisKKworLyogc3ByZWcgaXMgaW5saW5lZCB3aXRoIGlubGluZS5jICovCisKKyNpZiBkZWZpbmVkKF9JTkxJTkVfQ18pICYmICFkZWZpbmVkKF9TUFJFR19DXykgJiYgKFNQUkVHX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQorIyBpZiAoU1BSRUdfSU5MSU5FICYgSU5MSU5FX01PRFVMRSkKKyMgIGRlZmluZSBJTkxJTkVfU1BSRUcoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9TUFJFRyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyNlbHNlCisjICBkZWZpbmUgSU5MSU5FX1NQUkVHKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9TUFJFRyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyNlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIElOTElORV9TUFJFRyhUWVBFKSBUWVBFCisjIGRlZmluZSBFWFRFUk5fU1BSRUcoVFlQRSkgVFlQRQorI2VuZGlmCisKKyNpZiAoU1BSRUdfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU1BSRUcoVFlQRSkgc3RhdGljIElOTElORSBUWVBFCisjZWxzZQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9TUFJFRyhUWVBFKSBzdGF0aWMgVFlQRQorI2VuZGlmCisKKworLyogc2VtYW50aWNzIGlzIGlubGluZWQgd2l0aCBpbmxpbmUuYyAqLworCisjaWYgZGVmaW5lZChfSU5MSU5FX0NfKSAmJiAhZGVmaW5lZChfU0VNQU5USUNTX0NfKSAmJiAoU0VNQU5USUNTX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQorIyBpZiAoU0VNQU5USUNTX0lOTElORSAmIElOTElORV9NT0RVTEUpCisjICBkZWZpbmUgSU5MSU5FX1NFTUFOVElDUyhUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECisjICBkZWZpbmUgRVhURVJOX1NFTUFOVElDUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQgUkVHUEFSTQorI2Vsc2UKKyMgIGRlZmluZSBJTkxJTkVfU0VNQU5USUNTKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRCBSRUdQQVJNCisjICBkZWZpbmUgRVhURVJOX1NFTUFOVElDUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQgUkVHUEFSTQorI2VuZGlmCisjZWxzZQorIyBkZWZpbmUgSU5MSU5FX1NFTUFOVElDUyhUWVBFKSBUWVBFIFJFR1BBUk0KKyMgZGVmaW5lIEVYVEVSTl9TRU1BTlRJQ1MoVFlQRSkgVFlQRSBSRUdQQVJNCisjZW5kaWYKKworI2lmIChTRU1BTlRJQ1NfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU0VNQU5USUNTKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQorI2Vsc2UKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfU0VNQU5USUNTKFRZUEUpIHN0YXRpYyBUWVBFIFJFR1BBUk0KKyNlbmRpZgorCisKKy8qIGlkZWNvZGUgaXMgYWN0dWFsbHkgbm90IGlubGluZWQgKi8KKworI2lmIGRlZmluZWQoX0lOTElORV9DXykgJiYgIWRlZmluZWQoX0lERUNPREVfQ18pICYmIChJREVDT0RFX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQorIyBpZiAoSURFQ09ERV9JTkxJTkUgJiBJTkxJTkVfTU9EVUxFKQorIyAgZGVmaW5lIElOTElORV9JREVDT0RFKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKKyMgIGRlZmluZSBFWFRFUk5fSURFQ09ERShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQgUkVHUEFSTQorI2Vsc2UKKyMgIGRlZmluZSBJTkxJTkVfSURFQ09ERShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQgUkVHUEFSTQorIyAgZGVmaW5lIEVYVEVSTl9JREVDT0RFKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRCBSRUdQQVJNCisjZW5kaWYKKyNlbHNlCisjIGRlZmluZSBJTkxJTkVfSURFQ09ERShUWVBFKSBUWVBFIFJFR1BBUk0KKyMgZGVmaW5lIEVYVEVSTl9JREVDT0RFKFRZUEUpIFRZUEUgUkVHUEFSTQorI2VuZGlmCisKKyNpZiAoSURFQ09ERV9JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9JREVDT0RFKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQorI2Vsc2UKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfSURFQ09ERShUWVBFKSBzdGF0aWMgVFlQRSBSRUdQQVJNCisjZW5kaWYKKworCisvKiBpY2FjaGUgaXMgaW5saW5lZCB3aXRoIGlubGluZS5jICovCisKKyNpZiBkZWZpbmVkKF9JTkxJTkVfQ18pICYmICFkZWZpbmVkKF9JQ0FDSEVfQ18pICYmIChJQ0FDSEVfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCisjIGlmIChJQ0FDSEVfSU5MSU5FICYgSU5MSU5FX01PRFVMRSkKKyMgIGRlZmluZSBJTkxJTkVfSUNBQ0hFKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKKyMgIGRlZmluZSBFWFRFUk5fSUNBQ0hFKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRCBSRUdQQVJNCisjZWxzZQorIyAgZGVmaW5lIElOTElORV9JQ0FDSEUoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VEIFJFR1BBUk0KKyMgIGRlZmluZSBFWFRFUk5fSUNBQ0hFKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRCBSRUdQQVJNCisjZW5kaWYKKyNlbHNlCisjIGRlZmluZSBJTkxJTkVfSUNBQ0hFKFRZUEUpIFRZUEUgUkVHUEFSTQorIyBkZWZpbmUgRVhURVJOX0lDQUNIRShUWVBFKSBUWVBFIFJFR1BBUk0KKyNlbmRpZgorCisjaWYgKElDQUNIRV9JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9JQ0FDSEUoVFlQRSkgc3RhdGljIElOTElORSBUWVBFCisjZWxzZQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9JQ0FDSEUoVFlQRSkgc3RhdGljIFRZUEUgUkVHUEFSTQorI2VuZGlmCisKKworLyogc3VwcG9ydCBpcyBhbHdheXMgaW5saW5lZCAqLworCisjaWYgIWRlZmluZWQoX1NVUFBPUlRfQ18pICYmIChTVVBQT1JUX0lOTElORSAmIElOQ0xVREVfTU9EVUxFKQorIyBpZiAoU1VQUE9SVF9JTkxJTkUgJiBJTkxJTkVfTU9EVUxFKQorIyAgZGVmaW5lIElOTElORV9TVVBQT1JUKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRSBVTlVTRUQKKyMgIGRlZmluZSBFWFRFUk5fU1VQUE9SVChUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyNlbHNlCisjICBkZWZpbmUgSU5MSU5FX1NVUFBPUlQoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECisjICBkZWZpbmUgRVhURVJOX1NVUFBPUlQoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECisjZW5kaWYKKyNlbHNlCisjIGRlZmluZSBJTkxJTkVfU1VQUE9SVChUWVBFKSBUWVBFCisjIGRlZmluZSBFWFRFUk5fU1VQUE9SVChUWVBFKSBUWVBFCisjZW5kaWYKKworI2lmIChTVVBQT1JUX0lOTElORSAmIElOTElORV9MT0NBTFMpCisjIGRlZmluZSBTVEFUSUNfSU5MSU5FX1NVUFBPUlQoVFlQRSkgc3RhdGljIElOTElORSBUWVBFCisjZWxzZQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9TVVBQT1JUKFRZUEUpIHN0YXRpYyBUWVBFCisjZW5kaWYKKworCisvKiBvcHRpb25zIGlzIGlubGluZWQgd2l0aCBpbmxpbmUuYyAqLworCisjaWYgZGVmaW5lZChfSU5MSU5FX0NfKSAmJiAhZGVmaW5lZChfT1BUSU9OU19DXykgJiYgKE9QVElPTlNfSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCisjIGlmIChPUFRJT05TX0lOTElORSAmIElOTElORV9NT0RVTEUpCisjICBkZWZpbmUgSU5MSU5FX09QVElPTlMoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9PUFRJT05TKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorI2Vsc2UKKyMgIGRlZmluZSBJTkxJTkVfT1BUSU9OUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyMgIGRlZmluZSBFWFRFUk5fT1BUSU9OUyhUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyNlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIElOTElORV9PUFRJT05TKFRZUEUpIFRZUEUKKyMgZGVmaW5lIEVYVEVSTl9PUFRJT05TKFRZUEUpIFRZUEUKKyNlbmRpZgorCisjaWYgKE9QVElPTlNfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfT1BUSU9OUyhUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKKyNlbHNlCisjIGRlZmluZSBTVEFUSUNfSU5MSU5FX09QVElPTlMoVFlQRSkgc3RhdGljIFRZUEUKKyNlbmRpZgorCisKKy8qIG9zX2VtdWwgaXMgaW5saW5lZCB3aXRoIGlubGluZS5jICovCisKKyNpZiBkZWZpbmVkKF9JTkxJTkVfQ18pICYmICFkZWZpbmVkKF9PU19FTVVMX0NfKSAmJiAoT1NfRU1VTF9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKKyMgaWYgKE9TX0VNVUxfSU5MSU5FICYgSU5MSU5FX01PRFVMRSkKKyMgIGRlZmluZSBJTkxJTkVfT1NfRU1VTChUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUgVU5VU0VECisjICBkZWZpbmUgRVhURVJOX09TX0VNVUwoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECisjZWxzZQorIyAgZGVmaW5lIElOTElORV9PU19FTVVMKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9PU19FTVVMKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorI2VuZGlmCisjZWxzZQorIyBkZWZpbmUgSU5MSU5FX09TX0VNVUwoVFlQRSkgVFlQRQorIyBkZWZpbmUgRVhURVJOX09TX0VNVUwoVFlQRSkgVFlQRQorI2VuZGlmCisKKyNpZiAoT1NfRU1VTF9JTkxJTkUgJiBJTkxJTkVfTE9DQUxTKQorIyBkZWZpbmUgU1RBVElDX0lOTElORV9PU19FTVVMKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQorI2Vsc2UKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfT1NfRU1VTChUWVBFKSBzdGF0aWMgVFlQRQorI2VuZGlmCisKKworLyogcHNpbSBpcyBhY3R1YWxseSBub3QgaW5saW5lZCAqLworCisjaWYgZGVmaW5lZChfSU5MSU5FX0NfKSAmJiAhZGVmaW5lZChfUFNJTV9DXykgJiYgKFBTSU1fSU5MSU5FICYgSU5DTFVERV9NT0RVTEUpCisjIGlmIChQU0lNX0lOTElORSAmIElOTElORV9NT0RVTEUpCisjICBkZWZpbmUgSU5MSU5FX1BTSU0oVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9QU0lNKFRZUEUpIHN0YXRpYyBUWVBFIFVOVVNFRAorI2Vsc2UKKyMgIGRlZmluZSBJTkxJTkVfUFNJTShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyMgIGRlZmluZSBFWFRFUk5fUFNJTShUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyNlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIElOTElORV9QU0lNKFRZUEUpIFRZUEUKKyMgZGVmaW5lIEVYVEVSTl9QU0lNKFRZUEUpIFRZUEUKKyNlbmRpZgorCisjaWYgKFBTSU1fSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfUFNJTShUWVBFKSBzdGF0aWMgSU5MSU5FIFRZUEUKKyNlbHNlCisjIGRlZmluZSBTVEFUSUNfSU5MSU5FX1BTSU0oVFlQRSkgc3RhdGljIFRZUEUKKyNlbmRpZgorCisKKy8qIGNhcCBpcyBpbmxpbmVkIHdpdGggaW5saW5lLmMgKi8KKworI2lmIGRlZmluZWQoX0lOTElORV9DXykgJiYgIWRlZmluZWQoX0NBUF9DXykgJiYgKENBUF9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKKyMgaWYgKENBUF9JTkxJTkUgJiBJTkxJTkVfTU9EVUxFKQorIyAgZGVmaW5lIElOTElORV9DQVAoVFlQRSkgc3RhdGljIElOTElORSBUWVBFIFVOVVNFRAorIyAgZGVmaW5lIEVYVEVSTl9DQVAoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECisjZWxzZQorIyAgZGVmaW5lIElOTElORV9DQVAoVFlQRSkgc3RhdGljIFRZUEUgVU5VU0VECisjICBkZWZpbmUgRVhURVJOX0NBUChUWVBFKSBzdGF0aWMgVFlQRSBVTlVTRUQKKyNlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIElOTElORV9DQVAoVFlQRSkgVFlQRQorIyBkZWZpbmUgRVhURVJOX0NBUChUWVBFKSBUWVBFCisjZW5kaWYKKworI2lmIChDQVBfSU5MSU5FICYgSU5MSU5FX0xPQ0FMUykKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfQ0FQKFRZUEUpIHN0YXRpYyBJTkxJTkUgVFlQRQorI2Vsc2UKKyMgZGVmaW5lIFNUQVRJQ19JTkxJTkVfQ0FQKFRZUEUpIHN0YXRpYyBUWVBFCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vcHBjL2ludGVycnVwdHMuYyBiL3NpbS9wcGMvaW50ZXJydXB0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMTNmNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2ludGVycnVwdHMuYwpAQCAtMCwwICsxLDU0NSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfSU5URVJSVVBUU19DXworI2RlZmluZSBfSU5URVJSVVBUU19DXworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJpZGVjb2RlLmgiCisjaW5jbHVkZSAib3NfZW11bC5oIgorCisKKy8qIE9wZXJhdGluZyBlbnZpcm9ubWVudCBzdXBwb3J0IGNvZGUKKworICAgVW5saWtlIHRoZSBWRUEsIHRoZSBPRUEgbXVzdCBmdWxseSBtb2RlbCB0aGUgZWZmZWN0IGFuIGludGVycnVwdAorICAgaGFzIG9uIHRoZSBwcm9jZXNzb3JzIHN0YXRlLgorCisgICBFYWNoIGZ1bmN0aW9uIGJlbG93IHJldHVybiB1cGRhdGVkIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIGVmZmVjdGVkIGJ5CisgICBpbnRlcnJ1cHRzICovCisKKworU1RBVElDX0lOTElORV9JTlRFUlJVUFRTXAorKG1zcmVnKQoraW50ZXJydXB0X21zcihtc3JlZyBvbGRfbXNyLAorCSAgICAgIG1zcmVnIG1zcl9jbGVhciwKKwkgICAgICBtc3JlZyBtc3Jfc2V0KQoreworICBtc3JlZyBtc3Jfc2V0X3RvXzAgPSAobXNyX2JyYW5jaF90cmFjZV9lbmFibGUKKwkJCXwgbXNyX2RhdGFfcmVsb2NhdGUKKwkJCXwgbXNyX2V4dGVybmFsX2ludGVycnVwdF9lbmFibGUKKwkJCXwgbXNyX2Zsb2F0aW5nX3BvaW50X2V4Y2VwdGlvbl9tb2RlXzAKKwkJCXwgbXNyX2Zsb2F0aW5nX3BvaW50X2V4Y2VwdGlvbl9tb2RlXzEKKwkJCXwgbXNyX2Zsb2F0aW5nX3BvaW50X2F2YWlsYWJsZQorCQkJfCBtc3JfaW5zdHJ1Y3Rpb25fcmVsb2NhdGUKKwkJCXwgbXNyX3Bvd2VyX21hbmFnZW1lbnRfZW5hYmxlCisJCQl8IG1zcl9wcm9ibGVtX3N0YXRlCisJCQl8IG1zcl9yZWNvdmVyYWJsZV9pbnRlcnJ1cHQKKwkJCXwgbXNyX3NpbmdsZV9zdGVwX3RyYWNlX2VuYWJsZSk7CisgIC8qIHJlbWVtYmVyLCBpbiAzMmJpdCBtb2RlIG1zcl82NGJpdF9tb2RlIGlzIHplcm8gKi8KKyAgbXNyZWcgbmV3X21zciA9ICgoKChvbGRfbXNyICYgfm1zcl9zZXRfdG9fMCkKKwkJICAgICB8IG1zcl82NGJpdF9tb2RlKQorCQkgICAgJiB+bXNyX2NsZWFyKQorCQkgICB8IG1zcl9zZXQpOworICByZXR1cm4gbmV3X21zcjsKK30KKworCitTVEFUSUNfSU5MSU5FX0lOVEVSUlVQVFNcCisobXNyZWcpCitpbnRlcnJ1cHRfc3JyMShtc3JlZyBvbGRfbXNyLAorCSAgICAgICBtc3JlZyBzcnIxX2NsZWFyLAorCSAgICAgICBtc3JlZyBzcnIxX3NldCkKK3sKKyAgc3ByZWcgc3JyMV9tYXNrID0gKE1BU0soMCwzMikKKwkJICAgICB8IE1BU0soMzcsIDQxKQorCQkgICAgIHwgTUFTSyg0OCwgNjMpKTsKKyAgc3ByZWcgc3JyMSA9IChvbGRfbXNyICYgc3JyMV9tYXNrICYgfnNycjFfY2xlYXIpIHwgc3JyMV9zZXQ7CisgIHJldHVybiBzcnIxOworfQorCisKK1NUQVRJQ19JTkxJTkVfSU5URVJSVVBUU1wKKyh1bnNpZ25lZF93b3JkKQoraW50ZXJydXB0X2Jhc2VfZWEobXNyZWcgbXNyKQoreworICBpZiAobXNyICYgbXNyX2ludGVycnVwdF9wcmVmaXgpCisgICAgcmV0dXJuIE1BU0soMCwgNDMpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKworLyogZmluaXNoIG9mZiBhbiBpbnRlcnJ1cHQgZm9yIHRoZSBPRUEgbW9kZWwsIHVwZGF0aW5nIGFsbCByZWdpc3RlcnMKKyAgIGFuZCBmb3JjaW5nIGEgcmVzdGFydCBvZiB0aGUgcHJvY2Vzc29yICovCisKK1NUQVRJQ19JTkxJTkVfSU5URVJSVVBUU1wKKyh1bnNpZ25lZF93b3JkKQorcGVyZm9ybV9vZWFfaW50ZXJydXB0KGNwdSAqcHJvY2Vzc29yLAorCQkgICAgICB1bnNpZ25lZF93b3JkIGNpYSwKKwkJICAgICAgdW5zaWduZWRfd29yZCB2ZWN0b3Jfb2Zmc2V0LAorCQkgICAgICBtc3JlZyBtc3JfY2xlYXIsCisJCSAgICAgIG1zcmVnIG1zcl9zZXQsCisJCSAgICAgIG1zcmVnIHNycjFfY2xlYXIsCisJCSAgICAgIG1zcmVnIHNycjFfc2V0KQoreworICBtc3JlZyBvbGRfbXNyID0gTVNSOworICBtc3JlZyBuZXdfbXNyID0gaW50ZXJydXB0X21zcihvbGRfbXNyLCBtc3JfY2xlYXIsIG1zcl9zZXQpOworICB1bnNpZ25lZF93b3JkIG5pYTsKKyAgaWYgKCEob2xkX21zciAmIG1zcl9yZWNvdmVyYWJsZV9pbnRlcnJ1cHQpKSB7CisgICAgY3B1X2Vycm9yKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICJkb3VibGUgaW50ZXJydXB0IC0gTVNSW1JJXSBiaXQgY2xlYXIgd2hlbiBhdHRlbXB0aW5nIHRvIGRlbGl2ZXIgaW50ZXJydXB0LCBjaWE9MHglbHgsIG1zcj0weCVseDsgc3JyMD0weCVseChjaWEpLCBzcnIxPTB4JWx4KG1zcik7IHRyYXAtdmVjdG9yPTB4JWx4LCB0cmFwLW1zcj0weCVseCIsCisJICAgICAgKHVuc2lnbmVkIGxvbmcpY2lhLAorCSAgICAgICh1bnNpZ25lZCBsb25nKW9sZF9tc3IsCisJICAgICAgKHVuc2lnbmVkIGxvbmcpU1JSMCwKKwkgICAgICAodW5zaWduZWQgbG9uZylTUlIxLAorCSAgICAgICh1bnNpZ25lZCBsb25nKXZlY3Rvcl9vZmZzZXQsCisJICAgICAgKHVuc2lnbmVkIGxvbmcpbmV3X21zcik7CisgIH0KKyAgU1JSMCA9IChzcHJlZykoY2lhKTsKKyAgU1JSMSA9IGludGVycnVwdF9zcnIxKG9sZF9tc3IsIHNycjFfY2xlYXIsIHNycjFfc2V0KTsKKyAgTVNSID0gbmV3X21zcjsKKyAgbmlhID0gaW50ZXJydXB0X2Jhc2VfZWEobmV3X21zcikgKyB2ZWN0b3Jfb2Zmc2V0OworICBjcHVfc3luY2hyb25pemVfY29udGV4dChwcm9jZXNzb3IsIGNpYSk7CisgIHJldHVybiBuaWE7Cit9CisKKworSU5MSU5FX0lOVEVSUlVQVFNcCisodm9pZCkKK21hY2hpbmVfY2hlY2tfaW50ZXJydXB0KGNwdSAqcHJvY2Vzc29yLAorCQkJdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHN3aXRjaCAoQ1VSUkVOVF9FTlZJUk9OTUVOVCkgeworCisgIGNhc2UgVVNFUl9FTlZJUk9OTUVOVDoKKyAgY2FzZSBWSVJUVUFMX0VOVklST05NRU5UOgorICAgIGNwdV9lcnJvcihwcm9jZXNzb3IsIGNpYSwgIm1hY2hpbmUtY2hlY2sgaW50ZXJydXB0Iik7CisKKyAgY2FzZSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQ6CisgICAgVFJBQ0UodHJhY2VfaW50ZXJydXB0cywgKCJtYWNoaW5lLWNoZWNrIGludGVycnVwdCAtIGNpYT0weCVseFxuIiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpY2lhKSk7CisgICAgY2lhID0gcGVyZm9ybV9vZWFfaW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCAweDAwMjAwLCAwLCAwLCAwLCAwKTsKKyAgICBjcHVfcmVzdGFydChwcm9jZXNzb3IsIGNpYSk7CisKKyAgZGVmYXVsdDoKKyAgICBlcnJvcigiaW50ZXJuYWwgZXJyb3IgLSBtYWNoaW5lX2NoZWNrX2ludGVycnVwdCAtIGJhZCBzd2l0Y2giKTsKKworICB9Cit9CisKKworSU5MSU5FX0lOVEVSUlVQVFNcCisodm9pZCkKK2RhdGFfc3RvcmFnZV9pbnRlcnJ1cHQoY3B1ICpwcm9jZXNzb3IsCisJCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSwKKwkJICAgICAgIHVuc2lnbmVkX3dvcmQgZWEsCisJCSAgICAgICBzdG9yYWdlX2ludGVycnVwdF9yZWFzb25zIHJlYXNvbiwKKwkJICAgICAgIGludCBpc19zdG9yZSkKK3sKKyAgc3dpdGNoIChDVVJSRU5UX0VOVklST05NRU5UKSB7CisKKyAgY2FzZSBVU0VSX0VOVklST05NRU5UOgorICBjYXNlIFZJUlRVQUxfRU5WSVJPTk1FTlQ6CisgICAgZXJyb3IoImludGVybmFsIGVycm9yIC0gZGF0YV9zdG9yYWdlX2ludGVycnVwdCAtIHNob3VsZCBub3QgYmUgY2FsbGVkIGluIFZFQSBtb2RlIik7CisgICAgYnJlYWs7CisKKyAgY2FzZSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQ6CisgICAgeworICAgICAgc3ByZWcgZGlyZWN0aW9uID0gKGlzX3N0b3JlID8gZHNpc3Jfc3RvcmVfb3BlcmF0aW9uIDogMCk7CisgICAgICBzd2l0Y2ggKHJlYXNvbikgeworICAgICAgY2FzZSBkaXJlY3Rfc3RvcmVfc3RvcmFnZV9pbnRlcnJ1cHQ6CisJRFNJU1IgPSBkc2lzcl9kaXJlY3Rfc3RvcmVfZXJyb3JfZXhjZXB0aW9uIHwgZGlyZWN0aW9uOworCWJyZWFrOworICAgICAgY2FzZSBoYXNoX3RhYmxlX21pc3Nfc3RvcmFnZV9pbnRlcnJ1cHQ6CisJRFNJU1IgPSBkc2lzcl9oYXNoX3RhYmxlX29yX2RiYXRfbWlzcyB8IGRpcmVjdGlvbjsKKwlicmVhazsKKyAgICAgIGNhc2UgcHJvdGVjdGlvbl92aW9sYXRpb25fc3RvcmFnZV9pbnRlcnJ1cHQ6CisJRFNJU1IgPSBkc2lzcl9wcm90ZWN0aW9uX3Zpb2xhdGlvbiB8IGRpcmVjdGlvbjsKKwlicmVhazsKKyAgICAgIGNhc2UgZWFyd2F4X3Zpb2xhdGlvbl9zdG9yYWdlX2ludGVycnVwdDoKKwlEU0lTUiA9IGRzaXNyX2VhcndheF92aW9sYXRpb24gfCBkaXJlY3Rpb247CisJYnJlYWs7CisgICAgICBjYXNlIHNlZ21lbnRfdGFibGVfbWlzc19zdG9yYWdlX2ludGVycnVwdDoKKwlEU0lTUiA9IGRzaXNyX3NlZ21lbnRfdGFibGVfbWlzcyB8IGRpcmVjdGlvbjsKKwlicmVhazsKKyAgICAgIGNhc2UgZWFyd2F4X2Rpc2FibGVkX3N0b3JhZ2VfaW50ZXJydXB0OgorCURTSVNSID0gZHNpc3JfZWFyd2F4X2Rpc2FibGVkIHwgZGlyZWN0aW9uOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwllcnJvcigiaW50ZXJuYWwgZXJyb3IgLSBkYXRhX3N0b3JhZ2VfaW50ZXJydXB0IC0gcmVhc29uICVkIG5vdCBpbXBsZW1lbnRlZCIsIHJlYXNvbik7CisJYnJlYWs7CisgICAgICB9CisgICAgICBEQVIgPSAoc3ByZWcpZWE7CisgICAgICBUUkFDRSh0cmFjZV9pbnRlcnJ1cHRzLCAoImRhdGEgc3RvcmFnZSBpbnRlcnJ1cHQgLSBjaWE9MHglbHggREFSPTB4JWx4IERTSVNSPTB4JWx4XG4iLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWNpYSwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZylEQVIsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpRFNJU1IpKTsKKyAgICAgIGNpYSA9IHBlcmZvcm1fb2VhX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwgMHgwMDMwMCwgMCwgMCwgMCwgMCk7CisgICAgICBjcHVfcmVzdGFydChwcm9jZXNzb3IsIGNpYSk7CisgICAgfQorCisgIGRlZmF1bHQ6CisgICAgZXJyb3IoImludGVybmFsIGVycm9yIC0gZGF0YV9zdG9yYWdlX2ludGVycnVwdCAtIGJhZCBzd2l0Y2giKTsKKworICB9Cit9CisKKworSU5MSU5FX0lOVEVSUlVQVFNcCisodm9pZCkKK2luc3RydWN0aW9uX3N0b3JhZ2VfaW50ZXJydXB0KGNwdSAqcHJvY2Vzc29yLAorCQkJICAgICAgdW5zaWduZWRfd29yZCBjaWEsCisJCQkgICAgICBzdG9yYWdlX2ludGVycnVwdF9yZWFzb25zIHJlYXNvbikKK3sKKyAgc3dpdGNoIChDVVJSRU5UX0VOVklST05NRU5UKSB7CisKKyAgY2FzZSBVU0VSX0VOVklST05NRU5UOgorICBjYXNlIFZJUlRVQUxfRU5WSVJPTk1FTlQ6CisgICAgZXJyb3IoImludGVybmFsIGVycm9yIC0gaW5zdHJ1Y3Rpb25fc3RvcmFnZV9pbnRlcnJ1cHQgLSBzaG91bGQgbm90IGJlIGNhbGxlZCBpbiBWRUEgbW9kZSIpOworCisgIGNhc2UgT1BFUkFUSU5HX0VOVklST05NRU5UOgorICAgIHsKKyAgICAgIG1zcmVnIHNycjFfc2V0OworICAgICAgc3dpdGNoKHJlYXNvbikgeworICAgICAgY2FzZSBoYXNoX3RhYmxlX21pc3Nfc3RvcmFnZV9pbnRlcnJ1cHQ6CisJc3JyMV9zZXQgPSBzcnIxX2hhc2hfdGFibGVfb3JfaWJhdF9taXNzOworCWJyZWFrOworICAgICAgY2FzZSBkaXJlY3Rfc3RvcmVfc3RvcmFnZV9pbnRlcnJ1cHQ6CisJc3JyMV9zZXQgPSBzcnIxX2RpcmVjdF9zdG9yZV9lcnJvcl9leGNlcHRpb247CisJYnJlYWs7CisgICAgICBjYXNlIHByb3RlY3Rpb25fdmlvbGF0aW9uX3N0b3JhZ2VfaW50ZXJydXB0OgorCXNycjFfc2V0ID0gc3JyMV9wcm90ZWN0aW9uX3Zpb2xhdGlvbjsKKwlicmVhazsKKyAgICAgIGNhc2Ugc2VnbWVudF90YWJsZV9taXNzX3N0b3JhZ2VfaW50ZXJydXB0OgorCXNycjFfc2V0ID0gc3JyMV9zZWdtZW50X3RhYmxlX21pc3M7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCXNycjFfc2V0ID0gMDsKKwllcnJvcigiaW50ZXJuYWwgZXJyb3IgLSBpbnN0cnVjdGlvbl9zdG9yYWdlX2ludGVycnVwdCAtIHJlYXNvbiAlZCBub3QgaW1wbGVtZW50ZWQiKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIFRSQUNFKHRyYWNlX2ludGVycnVwdHMsICgiaW5zdHJ1Y3Rpb24gc3RvcmFnZSBpbnRlcnJ1cHQgLSBjaWE9MHglbHggU1JSMXw9MHglbHhcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpY2lhLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXNycjFfc2V0KSk7CisgICAgICBjaWEgPSBwZXJmb3JtX29lYV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIDB4MDA0MDAsIDAsIDAsIDAsIHNycjFfc2V0KTsKKyAgICAgIGNwdV9yZXN0YXJ0KHByb2Nlc3NvciwgY2lhKTsKKyAgICB9CisKKyAgZGVmYXVsdDoKKyAgICBlcnJvcigiaW50ZXJuYWwgZXJyb3IgLSBpbnN0cnVjdGlvbl9zdG9yYWdlX2ludGVycnVwdCAtIGJhZCBzd2l0Y2giKTsKKworICB9Cit9CisKKworCitJTkxJTkVfSU5URVJSVVBUU1wKKyh2b2lkKQorYWxpZ25tZW50X2ludGVycnVwdChjcHUgKnByb2Nlc3NvciwKKwkJICAgIHVuc2lnbmVkX3dvcmQgY2lhLAorCQkgICAgdW5zaWduZWRfd29yZCByYSkKK3sKKyAgc3dpdGNoIChDVVJSRU5UX0VOVklST05NRU5UKSB7CisKKyAgY2FzZSBVU0VSX0VOVklST05NRU5UOgorICBjYXNlIFZJUlRVQUxfRU5WSVJPTk1FTlQ6CisgICAgY3B1X2Vycm9yKHByb2Nlc3NvciwgY2lhLCAiYWxpZ25tZW50IGludGVycnVwdCAtIHJhPTB4JWx4IiwgcmEpOworICAgIAorICBjYXNlIE9QRVJBVElOR19FTlZJUk9OTUVOVDoKKyAgICBEQVIgPSAoc3ByZWcpcmE7CisgICAgRFNJU1IgPSAwOyAvKiBGSVhNRSAqLworICAgIFRSQUNFKHRyYWNlX2ludGVycnVwdHMsICgiYWxpZ25tZW50IGludGVycnVwdCAtIGNpYT0weCVseCBEQVI9MHglbHggRFNJU1I9MHglbHhcbiIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKWNpYSwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpREFSLAorCQkJICAgICAodW5zaWduZWQgbG9uZylEU0lTUikpOworICAgIGNpYSA9IHBlcmZvcm1fb2VhX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwgMHgwMDYwMCwgMCwgMCwgMCwgMCk7CisgICAgY3B1X3Jlc3RhcnQocHJvY2Vzc29yLCBjaWEpOworCisgIGRlZmF1bHQ6CisgICAgZXJyb3IoImludGVybmFsIGVycm9yIC0gYWxpZ25tZW50X2ludGVycnVwdCAtIGJhZCBzd2l0Y2giKTsKKyAgICAKKyAgfQorfQorCisKKworCitJTkxJTkVfSU5URVJSVVBUU1wKKyh2b2lkKQorcHJvZ3JhbV9pbnRlcnJ1cHQoY3B1ICpwcm9jZXNzb3IsCisJCSAgdW5zaWduZWRfd29yZCBjaWEsCisJCSAgcHJvZ3JhbV9pbnRlcnJ1cHRfcmVhc29ucyByZWFzb24pCit7CisgIHN3aXRjaCAoQ1VSUkVOVF9FTlZJUk9OTUVOVCkgeworCisgIGNhc2UgVVNFUl9FTlZJUk9OTUVOVDoKKyAgY2FzZSBWSVJUVUFMX0VOVklST05NRU5UOgorICAgIHN3aXRjaCAocmVhc29uKSB7CisgICAgY2FzZSBmbG9hdGluZ19wb2ludF9lbmFibGVkX3Byb2dyYW1faW50ZXJydXB0OgorICAgICAgY3B1X2Vycm9yKHByb2Nlc3NvciwgY2lhLCAicHJvZ3JhbSBpbnRlcnJ1cHQgLSAlcyIsCisJCSJmbG9hdGluZyBwb2ludCBlbmFibGVkIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQ6CisgICAgICBjcHVfZXJyb3IocHJvY2Vzc29yLCBjaWEsICJwcm9ncmFtIGludGVycnVwdCAtICVzIiwKKwkJImlsbGVnYWwgaW5zdHJ1Y3Rpb24iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcHJpdmlsZWdlZF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdDoKKyAgICAgIGNwdV9lcnJvcihwcm9jZXNzb3IsIGNpYSwgInByb2dyYW0gaW50ZXJydXB0IC0gJXMiLAorCQkicHJpdmlsZWdlZCBpbnN0cnVjdGlvbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0cmFwX3Byb2dyYW1faW50ZXJydXB0OgorICAgICAgY3B1X2Vycm9yKHByb2Nlc3NvciwgY2lhLCAicHJvZ3JhbSBpbnRlcnJ1cHQgLSAlcyIsCisJCSJ0cmFwIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIG9wdGlvbmFsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0OgorICAgICAgY3B1X2Vycm9yKHByb2Nlc3NvciwgY2lhLCAicHJvZ3JhbSBpbnRlcnJ1cHQgLSAlcyIsCisJCSJpbGxlZ2FsIGluc3RydWN0aW9uIChvcHRpb25hbCBpbnN0cnVjdGlvbiBub3Qgc3VwcG9ydGVkKSIpOworICAgICAgYnJlYWs7CisjaWZkZWYgV0lUSF9PUFRJT05fTVBDODYwQzAKKyAgICBjYXNlIG1wYzg2MGMwX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0OgorICAgICAgY3B1X2Vycm9yKHByb2Nlc3NvciwgY2lhLCAicHJvZ3JhbSBpbnRlcnJ1cHQgLSAlcyIsCisgICAgICAgIAkicHJvYmxlbWF0aWMgYnJhbmNoIGRldGVjdGVkLCBzZWUgTVBDODYwIEMwIGVycmF0YSIpOworICAgICAgYnJlYWs7CisjZW5kaWYgLy8gV0lUSF9PUFRJT05fTVBDODYwQzAKKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IoImludGVybmFsIGVycm9yIC0gcHJvZ3JhbV9pbnRlcnJ1cHQgLSByZWFzb24gJWQgbm90IGltcGxlbWVudGVkIiwgcmVhc29uKTsKKyAgICB9CisKKyAgY2FzZSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQ6CisgICAgeworICAgICAgbXNyZWcgc3JyMV9zZXQ7CisgICAgICBzd2l0Y2ggKHJlYXNvbikgeworICAgICAgY2FzZSBmbG9hdGluZ19wb2ludF9lbmFibGVkX3Byb2dyYW1faW50ZXJydXB0OgorCXNycjFfc2V0ID0gc3JyMV9mbG9hdGluZ19wb2ludF9lbmFibGVkOworCWJyZWFrOworICAgICAgY2FzZSBvcHRpb25hbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdDoKKyAgICAgIGNhc2UgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdDoKKwlzcnIxX3NldCA9IHNycjFfaWxsZWdhbF9pbnN0cnVjdGlvbjsKKwlicmVhazsKKyAgICAgIGNhc2UgcHJpdmlsZWdlZF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdDoKKwlzcnIxX3NldCA9IHNycjFfcHJpdmlsaWdlZF9pbnN0cnVjdGlvbjsKKwlicmVhazsKKyAgICAgIGNhc2UgdHJhcF9wcm9ncmFtX2ludGVycnVwdDoKKwlzcnIxX3NldCA9IHNycjFfdHJhcDsKKwlicmVhazsKKyNpZmRlZiBXSVRIX09QVElPTl9NUEM4NjBDMAorICAgICAgY2FzZSBtcGM4NjBjMF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdDoKKyAgICAgICAgc3JyMV9zZXQgPSAwOworICAgICAgICBlcnJvcihwcm9jZXNzb3IsIGNpYSwgInByb2dyYW0gaW50ZXJydXB0IC0gJXMiLAorICAgICAgICAgICAgICAicHJvYmxlbWF0aWMgYnJhbmNoIGRldGVjdGVkLCBzZWUgTVBDODYwIEMwIGVycmF0YSIpOworICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBXSVRIX09QVElPTl9NUEM4NjBDMAorICAgICAgZGVmYXVsdDoKKwlzcnIxX3NldCA9IDA7CisJZXJyb3IoImludGVybmFsIGVycm9yIC0gcHJvZ3JhbV9pbnRlcnJ1cHQgLSByZWFzb24gJWQgbm90IGltcGxlbWVudGVkIiwgcmVhc29uKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIFRSQUNFKHRyYWNlX2ludGVycnVwdHMsICgicHJvZ3JhbSBpbnRlcnJ1cHQgLSBjaWE9MHglbHggU1JSMXw9MHglbHhcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpY2lhLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXNycjFfc2V0KSk7CisgICAgICBjaWEgPSBwZXJmb3JtX29lYV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIDB4MDA3MDAsIDAsIDAsIDAsIHNycjFfc2V0KTsKKyAgICAgIGNwdV9yZXN0YXJ0KHByb2Nlc3NvciwgY2lhKTsKKyAgICB9CisKKyAgZGVmYXVsdDoKKyAgICBlcnJvcigiaW50ZXJuYWwgZXJyb3IgLSBwcm9ncmFtX2ludGVycnVwdCAtIGJhZCBzd2l0Y2giKTsKKworICB9Cit9CisKKworSU5MSU5FX0lOVEVSUlVQVFNcCisodm9pZCkKK2Zsb2F0aW5nX3BvaW50X3VuYXZhaWxhYmxlX2ludGVycnVwdChjcHUgKnByb2Nlc3NvciwKKwkJCQkgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBzd2l0Y2ggKENVUlJFTlRfRU5WSVJPTk1FTlQpIHsKKyAgICAKKyAgY2FzZSBVU0VSX0VOVklST05NRU5UOgorICBjYXNlIFZJUlRVQUxfRU5WSVJPTk1FTlQ6CisgICAgY3B1X2Vycm9yKHByb2Nlc3NvciwgY2lhLCAiZmxvYXRpbmctcG9pbnQgdW5hdmFpbGFibGUgaW50ZXJydXB0Iik7CisKKyAgY2FzZSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQ6CisgICAgVFJBQ0UodHJhY2VfaW50ZXJydXB0cywgKCJmbG9hdGluZy1wb2ludCB1bmF2YWlsYWJsZSBpbnRlcnJ1cHQgLSBjaWE9MHglbHhcbiIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKWNpYSkpOworICAgIGNpYSA9IHBlcmZvcm1fb2VhX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwgMHgwMDgwMCwgMCwgMCwgMCwgMCk7CisgICAgY3B1X3Jlc3RhcnQocHJvY2Vzc29yLCBjaWEpOworCisgIGRlZmF1bHQ6CisgICAgZXJyb3IoImludGVybmFsIGVycm9yIC0gZmxvYXRpbmdfcG9pbnRfdW5hdmFpbGFibGVfaW50ZXJydXB0IC0gYmFkIHN3aXRjaCIpOworCisgIH0KK30KKworCitJTkxJTkVfSU5URVJSVVBUU1wKKyh2b2lkKQorc3lzdGVtX2NhbGxfaW50ZXJydXB0KGNwdSAqcHJvY2Vzc29yLAorCQkgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgVFJBQ0UodHJhY2VfaW50ZXJydXB0cywgKCJzeXN0ZW0tY2FsbCBpbnRlcnJ1cHQgLSBjaWE9MHglbHhcbiIsICh1bnNpZ25lZCBsb25nKWNpYSkpOworCisgIHN3aXRjaCAoQ1VSUkVOVF9FTlZJUk9OTUVOVCkgeworCisgIGNhc2UgVVNFUl9FTlZJUk9OTUVOVDoKKyAgY2FzZSBWSVJUVUFMX0VOVklST05NRU5UOgorICAgIG9zX2VtdWxfc3lzdGVtX2NhbGwocHJvY2Vzc29yLCBjaWEpOworICAgIGNwdV9yZXN0YXJ0KHByb2Nlc3NvciwgY2lhKzQpOworCisgIGNhc2UgT1BFUkFUSU5HX0VOVklST05NRU5UOgorICAgIGNpYSA9IHBlcmZvcm1fb2VhX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSs0LCAweDAwYzAwLCAwLCAwLCAwLCAwKTsKKyAgICBjcHVfcmVzdGFydChwcm9jZXNzb3IsIGNpYSk7CisKKyAgZGVmYXVsdDoKKyAgICBlcnJvcigiaW50ZXJuYWwgZXJyb3IgLSBzeXN0ZW1fY2FsbF9pbnRlcnJ1cHQgLSBiYWQgc3dpdGNoIik7CisKKyAgfQorfQorCitJTkxJTkVfSU5URVJSVVBUU1wKKyh2b2lkKQorZmxvYXRpbmdfcG9pbnRfYXNzaXN0X2ludGVycnVwdChjcHUgKnByb2Nlc3NvciwKKwkJCQl1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgc3dpdGNoIChDVVJSRU5UX0VOVklST05NRU5UKSB7CisKKyAgY2FzZSBVU0VSX0VOVklST05NRU5UOgorICBjYXNlIFZJUlRVQUxfRU5WSVJPTk1FTlQ6CisgICAgY3B1X2Vycm9yKHByb2Nlc3NvciwgY2lhLCAiZmxvYXRpbmctcG9pbnQgYXNzaXN0IGludGVycnVwdCIpOworCisgIGNhc2UgT1BFUkFUSU5HX0VOVklST05NRU5UOgorICAgIFRSQUNFKHRyYWNlX2ludGVycnVwdHMsICgiZmxvYXRpbmctcG9pbnQgYXNzaXN0IGludGVycnVwdCAtIGNpYT0weCVseFxuIiwgKHVuc2lnbmVkIGxvbmcpY2lhKSk7CisgICAgY2lhID0gcGVyZm9ybV9vZWFfaW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCAweDAwZTAwLCAwLCAwLCAwLCAwKTsKKyAgICBjcHVfcmVzdGFydChwcm9jZXNzb3IsIGNpYSk7CisKKyAgZGVmYXVsdDoKKyAgICBlcnJvcigiaW50ZXJuYWwgZXJyb3IgLSBmbG9hdGluZ19wb2ludF9hc3Npc3RfaW50ZXJydXB0IC0gYmFkIHN3aXRjaCIpOworCisgIH0KK30KKworCisKKy8qIGhhbmRsZSBhbiBleHRlcm5hbGx5IGdlbmVyYXRlZCBldmVudCBvciBhbiBpbnRlcnJ1cHQgdGhhdCBoYXMganVzdAorICAgYmVlbiBlbmFibGVkIHRocm91Z2ggY2hhbmdlcyB0byB0aGUgTVNSLiAqLworCitTVEFUSUNfSU5MSU5FX0lOVEVSUlVQVFNcCisodm9pZCkKK2RlbGl2ZXJfaGFyZHdhcmVfaW50ZXJydXB0KHZvaWQgKmRhdGEpCit7CisgIGNwdSAqcHJvY2Vzc29yID0gKGNwdSopZGF0YTsKKyAgaW50ZXJydXB0cyAqaW50cyA9IGNwdV9pbnRlcnJ1cHRzKHByb2Nlc3Nvcik7CisgIGludHMtPmRlbGl2ZXJ5X3NjaGVkdWxlZCA9IE5VTEw7CisgIGlmICgoY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5tc3IgJiAobXNyX2Zsb2F0aW5nX3BvaW50X2V4Y2VwdGlvbl9tb2RlXzAKKwkJCQkJfCBtc3JfZmxvYXRpbmdfcG9pbnRfZXhjZXB0aW9uX21vZGVfMSkpCisgICAgICAmJiBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmZwc2NyICYgZnBzY3JfZmV4KSB7CisgICAgbXNyZWcgc3JyMV9zZXQgPSBzcnIxX2Zsb2F0aW5nX3BvaW50X2VuYWJsZWQgfCBzcnIxX3N1YnNlcXVlbnRfaW5zdHJ1Y3Rpb247CisgICAgdW5zaWduZWRfd29yZCBjaWEgPSBjcHVfZ2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IpOworICAgIHVuc2lnbmVkX3dvcmQgbmlhID0gcGVyZm9ybV9vZWFfaW50ZXJydXB0KHByb2Nlc3NvciwKKwkJCQkJICAgICAgY2lhLCAweDAwNzAwLCAwLCAwLCAwLCBzcnIxX3NldCk7CisgICAgY3B1X3NldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yLCBuaWEpOworICB9CisgIGVsc2UgaWYgKGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+bXNyICYgbXNyX2V4dGVybmFsX2ludGVycnVwdF9lbmFibGUpIHsKKyAgICAvKiBleHRlcm5hbCBpbnRlcnJ1cHRzIGhhdmUgYSBoaWdoIHByaW9yaXR5IGFuZCByZW1haW4gcGVuZGluZyAqLworICAgIGlmIChpbnRzLT5wZW5kaW5nX2ludGVycnVwdHMgJiBleHRlcm5hbF9pbnRlcnJ1cHRfcGVuZGluZykgeworICAgICAgdW5zaWduZWRfd29yZCBjaWEgPSBjcHVfZ2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IpOworICAgICAgdW5zaWduZWRfd29yZCBuaWEgPSBwZXJmb3JtX29lYV9pbnRlcnJ1cHQocHJvY2Vzc29yLAorCQkJCQkJY2lhLCAweDAwNTAwLCAwLCAwLCAwLCAwKTsKKyAgICAgIFRSQUNFKHRyYWNlX2ludGVycnVwdHMsICgiZXh0ZXJuYWwgaW50ZXJydXB0IC0gY2lhPTB4JWx4XG4iLCAodW5zaWduZWQgbG9uZyljaWEpKTsKKyAgICAgIGNwdV9zZXRfcHJvZ3JhbV9jb3VudGVyKHByb2Nlc3NvciwgbmlhKTsKKyAgICB9CisgICAgLyogZGVjcmVtZW50ZXIgaW50ZXJydXB0cyBoYXZlIGEgbG93ZXIgcHJpb3JpdHkgYW5kIGFyZSBvbmNlIG9ubHkgKi8KKyAgICBlbHNlIGlmIChpbnRzLT5wZW5kaW5nX2ludGVycnVwdHMgJiBkZWNyZW1lbnRlcl9pbnRlcnJ1cHRfcGVuZGluZykgeworICAgICAgdW5zaWduZWRfd29yZCBjaWEgPSBjcHVfZ2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IpOworICAgICAgdW5zaWduZWRfd29yZCBuaWEgPSBwZXJmb3JtX29lYV9pbnRlcnJ1cHQocHJvY2Vzc29yLAorCQkJCQkJY2lhLCAweDAwOTAwLCAwLCAwLCAwLCAwKTsKKyAgICAgIFRSQUNFKHRyYWNlX2ludGVycnVwdHMsICgiZGVjcmVtZW50ZXIgaW50ZXJydXB0IC0gY2lhPTB4JWx4IHRpbWU9MHglbHhcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpY2lhLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWV2ZW50X3F1ZXVlX3RpbWUocHNpbV9ldmVudF9xdWV1ZShjcHVfc3lzdGVtKHByb2Nlc3NvcikpKQorCQkJICAgICAgICkpOworICAgICAgY3B1X3NldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yLCBuaWEpOworICAgICAgaW50cy0+cGVuZGluZ19pbnRlcnJ1cHRzICY9IH5kZWNyZW1lbnRlcl9pbnRlcnJ1cHRfcGVuZGluZzsKKyAgICB9CisgIH0KK30KKworU1RBVElDX0lOTElORV9JTlRFUlJVUFRTXAorKHZvaWQpCitzY2hlZHVsZV9oYXJkd2FyZV9pbnRlcnJ1cHRfZGVsaXZlcnkoY3B1ICpwcm9jZXNzb3IpIAoreworICBpbnRlcnJ1cHRzICppbnRzID0gY3B1X2ludGVycnVwdHMocHJvY2Vzc29yKTsKKyAgaWYgKGludHMtPmRlbGl2ZXJ5X3NjaGVkdWxlZCA9PSBOVUxMKSB7CisgICAgaW50cy0+ZGVsaXZlcnlfc2NoZWR1bGVkID0KKyAgICAgIGV2ZW50X3F1ZXVlX3NjaGVkdWxlKHBzaW1fZXZlbnRfcXVldWUoY3B1X3N5c3RlbShwcm9jZXNzb3IpKSwKKwkJCSAgIDAsIGRlbGl2ZXJfaGFyZHdhcmVfaW50ZXJydXB0LCBwcm9jZXNzb3IpOworICB9Cit9CisKKworSU5MSU5FX0lOVEVSUlVQVFNcCisodm9pZCkKK2NoZWNrX21hc2tlZF9pbnRlcnJ1cHRzKGNwdSAqcHJvY2Vzc29yKQoreworICBpZiAoKChjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPm1zciAmIChtc3JfZmxvYXRpbmdfcG9pbnRfZXhjZXB0aW9uX21vZGVfMAorCQkJCQkgfCBtc3JfZmxvYXRpbmdfcG9pbnRfZXhjZXB0aW9uX21vZGVfMSkpCisgICAgICAgJiYgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5mcHNjciAmIGZwc2NyX2ZleCkKKyAgICAgIHx8ICgoY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5tc3IgJiBtc3JfZXh0ZXJuYWxfaW50ZXJydXB0X2VuYWJsZSkKKwkgICYmIChjcHVfaW50ZXJydXB0cyhwcm9jZXNzb3IpLT5wZW5kaW5nX2ludGVycnVwdHMpKSkKKyAgICBzY2hlZHVsZV9oYXJkd2FyZV9pbnRlcnJ1cHRfZGVsaXZlcnkocHJvY2Vzc29yKTsKK30KKworSU5MSU5FX0lOVEVSUlVQVFNcCisodm9pZCkKK2RlY3JlbWVudGVyX2ludGVycnVwdChjcHUgKnByb2Nlc3NvcikKK3sKKyAgaW50ZXJydXB0cyAqaW50cyA9IGNwdV9pbnRlcnJ1cHRzKHByb2Nlc3Nvcik7CisgIGludHMtPnBlbmRpbmdfaW50ZXJydXB0cyB8PSBkZWNyZW1lbnRlcl9pbnRlcnJ1cHRfcGVuZGluZzsKKyAgaWYgKGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+bXNyICYgbXNyX2V4dGVybmFsX2ludGVycnVwdF9lbmFibGUpIHsKKyAgICBzY2hlZHVsZV9oYXJkd2FyZV9pbnRlcnJ1cHRfZGVsaXZlcnkocHJvY2Vzc29yKTsKKyAgfQorfQorCitJTkxJTkVfSU5URVJSVVBUU1wKKyh2b2lkKQorZXh0ZXJuYWxfaW50ZXJydXB0KGNwdSAqcHJvY2Vzc29yLAorCQkgICBpbnQgaXNfYXNzZXJ0ZWQpCit7CisgIGludGVycnVwdHMgKmludHMgPSBjcHVfaW50ZXJydXB0cyhwcm9jZXNzb3IpOworICBpZiAoaXNfYXNzZXJ0ZWQpIHsKKyAgICBpZiAoIWludHMtPnBlbmRpbmdfaW50ZXJydXB0cyAmIGV4dGVybmFsX2ludGVycnVwdF9wZW5kaW5nKSB7CisgICAgICBpbnRzLT5wZW5kaW5nX2ludGVycnVwdHMgfD0gZXh0ZXJuYWxfaW50ZXJydXB0X3BlbmRpbmc7CisgICAgICBpZiAoY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5tc3IgJiBtc3JfZXh0ZXJuYWxfaW50ZXJydXB0X2VuYWJsZSkKKwlzY2hlZHVsZV9oYXJkd2FyZV9pbnRlcnJ1cHRfZGVsaXZlcnkocHJvY2Vzc29yKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvKiBjaGVjayB0aGF0IHdlIGhhdmVuJ3QgbWlzc2VkIG91dCBvbiBhIGNoYW5jZSB0byBkZWxpdmVyIGFuCisgICAgICAgICBpbnRlcnJ1cHQgKi8KKyAgICAgIEFTU0VSVCghKGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+bXNyICYgbXNyX2V4dGVybmFsX2ludGVycnVwdF9lbmFibGUpKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgaW50cy0+cGVuZGluZ19pbnRlcnJ1cHRzICY9IH5leHRlcm5hbF9pbnRlcnJ1cHRfcGVuZGluZzsKKyAgfQorfQorCisjZW5kaWYgLyogX0lOVEVSUlVQVFNfQ18gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvaW50ZXJydXB0cy5oIGIvc2ltL3BwYy9pbnRlcnJ1cHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU4N2I3NwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvaW50ZXJydXB0cy5oCkBAIC0wLDAgKzEsMTcyIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIF9JTlRFUlJVUFRTX0hfCisjZGVmaW5lIF9JTlRFUlJVUFRTX0hfCisKKy8qIEludGVycnVwdHM6CisKKyAgIFRoZSBjb2RlIGJlbG93IGhhbmRsZXMgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiBpbnRlcnJ1cHRzLgorICAgU3luY2hyb25vdXMgYW5kIEFzeW5jaHJvbm91cy4KKworICAgU3luY2hyb25vdXM6CisKKyAgIEludGVycnVwdHMgdGhhdCBtdXN0IGltbWVkaWF0ZWx5IGZvcmNlIGVpdGhlciBhbiBhYm9ydCBvciByZXN0YXJ0CisgICBvZiBhIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gYXJlIGltcGxlbWVudGVkIGJ5IGZvcmNpbmcgYW4gaW5zdHJ1Y3Rpb24KKyAgIHJlc3RhcnQuIChvciB0byBwdXQgaXQgYW5vdGhlciB3YXksIGxvbmcganVtcCkuICBJbiBsb29raW5nIGF0IHRoZQorICAgY29kZSBpdCBtYXkgb2NjdXJlIHRvIHlvdSB0aGF0LCBmb3Igc29tZSBpbnRlcnJ1cHRzLCB0aGV5IGNvdWxkCisgICByZXR1cm4gaW5zdGVhZCBvZiByZXN0YXJ0aW5nIHRoZSBjcHUgKGVnIHN5c3RlbV9jYWxsKS4gIFdoaWxlIHRydWUKKyAgIChpdCBvbmNlIHdhcyBsaWtlIHRoYXQpIEkndmUgZGVjaWRlZCB0byBtYWtlIHRoZSBiZWhhdm91ciBvZiBhbGwKKyAgIGludGVycnVwdCByb3V0aW5lcyByb3VnaGx5IGlkZW50aWNhbC4KKworICAgQmVjYXVzZSwgYSBjcHUncyByZWNvcmRlZCBzdGF0ZSAoaWUgd2hhdCBpcyBpbiB0aGUgY3B1IHN0cnVjdHVyZSkKKyAgIGlzIGFsbG93ZWQgdG8gbGFnIGJlaGluZCB0aGUgY3B1J3MgdHJ1ZSBjdXJyZW50IHN0YXRlIChlZyBQQyBub3QKKyAgIHVwZGF0ZWQpIHN5Y25yb25vdXMgaW50ZXJydXB0IGhhbmRlcnMgYXJlIHBhcmFtZXRlcml6ZWQgd2l0aCB0aGUKKyAgIHRoZSBjcHUgYmVpbmcgaW50ZXJydXB0ZWQgc28gdGhhdCwgYXMgcGFydCBvZiBtb2RkZWxpbmcgdGhlCisgICBpbnRlcnJ1cHQsIHRoZSBjcHUncyBzdGF0ZSBjYW4gYmUgdXBkYXRlZC4KKworICAgQXN5bmNocm9ub3VzOgorCisgICBJbnRlcnJ1cHRzIHN1Y2ggYXMgcmVzZXQgb3IgZXh0ZXJuYWwgZXhjZXB0aW9uIGFyZSBkZWxpdmVyZWQgdXNpbmcKKyAgIG1vcmUgbm9ybWFsIChyZXR1cm5pbmcpIGZ1bmN0aW9ucy4gIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGVzZQorICAgZnVuY3Rpb25zIGFyZSBjYWxsZWQgb3V0IHNpZGUgb2YgdGhlIG5vcm1hbCBwcm9jZXNzb3IgZXhlY3V0aW9uCisgICBjeWNsZS4gKi8KKworCisvKiBTb2Z0d2FyZSBnZW5lcmF0ZWQgaW50ZXJydXB0cy4KKworICAgVGhlIGJlbG93IGFyZSBnZW5lcmF0ZWQgYnkgc29mdHdhcmUgZHJpdmVuIGV2ZW50cy4gIEZvciBpbnN0YW5jZSwKKyAgIGFuIGludmFsaWQgaW5zdHJ1Y3Rpb24gb3IgYWNjZXNzICh2aXJ0dWFsIG9yIHBoeXNpY2FsKSB0byBhbgorICAgaW52YWxpZCBhZGRyZXNzICovCisKK3R5cGVkZWYgZW51bSB7CisgIGRpcmVjdF9zdG9yZV9zdG9yYWdlX2ludGVycnVwdCwKKyAgaGFzaF90YWJsZV9taXNzX3N0b3JhZ2VfaW50ZXJydXB0LAorICBwcm90ZWN0aW9uX3Zpb2xhdGlvbl9zdG9yYWdlX2ludGVycnVwdCwKKyAgZWFyd2F4X3Zpb2xhdGlvbl9zdG9yYWdlX2ludGVycnVwdCwKKyAgc2VnbWVudF90YWJsZV9taXNzX3N0b3JhZ2VfaW50ZXJydXB0LAorICBlYXJ3YXhfZGlzYWJsZWRfc3RvcmFnZV9pbnRlcnJ1cHQsCisgIHZlYV9zdG9yYWdlX2ludGVycnVwdCwKK30gc3RvcmFnZV9pbnRlcnJ1cHRfcmVhc29uczsKKworCitJTkxJTkVfSU5URVJSVVBUU1wKKyh2b2lkKSBkYXRhX3N0b3JhZ2VfaW50ZXJydXB0CisoY3B1ICpwcm9jZXNzb3IsCisgdW5zaWduZWRfd29yZCBjaWEsCisgdW5zaWduZWRfd29yZCBlYSwKKyBzdG9yYWdlX2ludGVycnVwdF9yZWFzb25zIHJlYXNvbiwKKyBpbnQgaXNfc3RvcmUpOworCitJTkxJTkVfSU5URVJSVVBUU1wKKyh2b2lkKSBpbnN0cnVjdGlvbl9zdG9yYWdlX2ludGVycnVwdAorKGNwdSAqcHJvY2Vzc29yLAorIHVuc2lnbmVkX3dvcmQgY2lhLAorIHN0b3JhZ2VfaW50ZXJydXB0X3JlYXNvbnMgcmVhc29uKTsKKworSU5MSU5FX0lOVEVSUlVQVFNcCisodm9pZCkgYWxpZ25tZW50X2ludGVycnVwdAorKGNwdSAqcHJvY2Vzc29yLAorIHVuc2lnbmVkX3dvcmQgY2lhLAorIHVuc2lnbmVkX3dvcmQgcmEpOworCit0eXBlZGVmIGVudW0geworICBmbG9hdGluZ19wb2ludF9lbmFibGVkX3Byb2dyYW1faW50ZXJydXB0LAorICBpbGxlZ2FsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0LAorICBwcml2aWxlZ2VkX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0LAorICB0cmFwX3Byb2dyYW1faW50ZXJydXB0LAorICBvcHRpb25hbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCwgLyogc3Vic2V0IG9mIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gKi8KKyNpZmRlZiBXSVRIX09QVElPTl9NUEM4NjBDMAorICBtcGM4NjBjMF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCwgLyogZndkIGJyLCB0YWtlbiBidXQgbm90IHByZWRpY3RlZCwgbmVhciBFTyBwYWdlICovCisjZW5kaWYgLy8gV0lUSF9PUFRJT05fTVBDODYwQzAKKyAgbnJfcHJvZ3JhbV9pbnRlcnJ1cHRfcmVhc29ucworfSBwcm9ncmFtX2ludGVycnVwdF9yZWFzb25zOworCitJTkxJTkVfSU5URVJSVVBUU1wKKyh2b2lkKSBwcm9ncmFtX2ludGVycnVwdAorKGNwdSAqcHJvY2Vzc29yLAorIHVuc2lnbmVkX3dvcmQgY2lhLAorIHByb2dyYW1faW50ZXJydXB0X3JlYXNvbnMgcmVhc29uKTsKKworSU5MSU5FX0lOVEVSUlVQVFNcCisodm9pZCkgZmxvYXRpbmdfcG9pbnRfdW5hdmFpbGFibGVfaW50ZXJydXB0CisoY3B1ICpwcm9jZXNzb3IsCisgdW5zaWduZWRfd29yZCBjaWEpOworCitJTkxJTkVfSU5URVJSVVBUU1wKKyh2b2lkKSBzeXN0ZW1fY2FsbF9pbnRlcnJ1cHQKKyhjcHUgKnByb2Nlc3NvciwKKyB1bnNpZ25lZF93b3JkIGNpYSk7CisKK0lOTElORV9JTlRFUlJVUFRTXAorKHZvaWQpIGZsb2F0aW5nX3BvaW50X2Fzc2lzdF9pbnRlcnJ1cHQKKyhjcHUgKnByb2Nlc3NvciwKKyB1bnNpZ25lZF93b3JkIGNpYSk7CisKK0lOTElORV9JTlRFUlJVUFRTXAorKHZvaWQpIG1hY2hpbmVfY2hlY2tfaW50ZXJydXB0CisoY3B1ICpwcm9jZXNzb3IsCisgdW5zaWduZWRfd29yZCBjaWEpOworCisvKiBIYXJkd2FyZSBnZW5lcmF0ZWQgaW50ZXJydXB0czoKKworICAgVGhlc2UgYXN5bmNocm9ub3VzIGhhcmR3YXJlIGdlbmVyYXRlZCBpbnRlcnJ1cHRzIG1heSBiZSBjYWxsZWQgYXQKKyAgIGFueSB0aW1lLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoaXMgKHRoZSBpbnRlcnJ1cHRzKSBtb2R1bGUKKyAgIHRvIGVuc3VyZSB0aGF0IGludGVycnVwdHMgYXJlIGRlbGl2ZXJlZCBjb3JyZWN0bHkgKHdoZW4gcG9zc2libGUpLgorICAgVGhlIGRlbGl2ZXJ5IG9mIHRoZXNlIGludGVycnVwdHMgaXMgY29udHJvbGxlZCBieSB0aGUgTVNSJ3MKKyAgIGV4dGVybmFsIGludGVycnVwdCBlbmFibGUgYml0LiAgV2hlbiBldmVyIHRoZSBNU1IncyB2YWx1ZSBpcworICAgY2hhbmdlZCwgdGhlIHByb2Nlc3NvciBtdXN0IGNhbGwgdGhlIGNoZWNrX21hc2tlZF9pbnRlcnJ1cHRzKCkKKyAgIGZ1bmN0aW9uIGluIGNhc2UgZGVsaXZlcnkgaGFzIGJlZW4gbWFkZSBwb3NzaWJsZS4KKworICAgZGVjcmVtZW50ZXJfaW50ZXJydXB0IGlzIGBlZGdlJyBzZW5zaXRpdmUuICBNdWx0aXBsZSBlZGdlcyBhcnJpdmluZworICAgYmVmb3JlIHRoZSBmaXJzdCBlZGdlIGhhcyBiZWVuIGRlbGl2ZXJlZCByZXN1bHQgaW4gb25seSBvbmUKKyAgIGludGVycnVwdC4KKworICAgZXh0ZXJuYWxfaW50ZXJydXB0IGlzIGBsZXZlbCcgc2Vuc2l0aXZlLiAgQW4gZXh0ZXJuYWwgaW50ZXJydXB0CisgICB3aWxsIG9ubHkgYmUgZGVsaXZlcmVkIHdoZW4gdGhlIGV4dGVybmFsIGludGVycnVwdCBwb3J0IGlzCisgICBgYXNzZXJ0ZWQnLiBXaGlsZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwgdGhlIGV4dGVybmFsIGludGVycnVwdAorICAgY2FuIGJlIGFzc2VydGVkIGFuZCB0aGVuIGRlLWFzc2VydGVkIHdpdGhvdXQgYW4gaW50ZXJydXB0CisgICBldmVudHVhbGx5IGJlaW5nIGRlbGl2ZXJlZC4gKi8KKworZW51bSB7CisgIGV4dGVybmFsX2ludGVycnVwdF9wZW5kaW5nID0gMSwKKyAgZGVjcmVtZW50ZXJfaW50ZXJydXB0X3BlbmRpbmcgPSAyLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgX2ludGVycnVwdHMgeworICBldmVudF9lbnRyeV90YWcgZGVsaXZlcnlfc2NoZWR1bGVkOworICBpbnQgcGVuZGluZ19pbnRlcnJ1cHRzOworfSBpbnRlcnJ1cHRzOworCitJTkxJTkVfSU5URVJSVVBUU1wKKyh2b2lkKSBjaGVja19tYXNrZWRfaW50ZXJydXB0cworKGNwdSAqcHJvY2Vzc29yKTsKKworSU5MSU5FX0lOVEVSUlVQVFNcCisodm9pZCkgZGVjcmVtZW50ZXJfaW50ZXJydXB0CisoY3B1ICpwcm9jZXNzb3IpOworCitJTkxJTkVfSU5URVJSVVBUU1wKKyh2b2lkKSBleHRlcm5hbF9pbnRlcnJ1cHQKKyhjcHUgKnByb2Nlc3NvciwKKyBpbnQgaXNfYXNzZXJ0ZWQpOworCisjZW5kaWYgLyogX0lOVEVSUlVQVFNfSF8gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvbGQtY2FjaGUuYyBiL3NpbS9wcGMvbGQtY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzUwMTNlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9sZC1jYWNoZS5jCkBAIC0wLDAgKzEsMTE1IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgImxmLmgiCisjaW5jbHVkZSAidGFibGUuaCIKKyNpbmNsdWRlICJsZC1jYWNoZS5oIgorCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAwCisjZW5kaWYKKworCitlbnVtIHsKKyAgY2FfdHlwZSwKKyAgY2FfZmllbGRfbmFtZSwKKyAgY2FfZGVyaXZlZF9uYW1lLAorICBjYV90eXBlX2RlZiwKKyAgY2FfZXhwcmVzc2lvbiwKKyAgbnJfY2FjaGVfcnVsZV9maWVsZHMsCit9OworCitzdGF0aWMgY29uc3QgbmFtZV9tYXAgY2FjaGVfdHlwZV9tYXBbXSA9IHsKKyAgeyAiY2FjaGUiLCBjYWNoZV92YWx1ZSB9LAorICB7ICJjb21wdXRlIiwgY29tcHV0ZV92YWx1ZSB9LAorICB7ICJzY3JhdGNoIiwgc2NyYXRjaF92YWx1ZSB9LAorICB7IE5VTEwsIDAgfSwKK307CisKKworY2FjaGVfdGFibGUgKgorbG9hZF9jYWNoZV90YWJsZShjaGFyICpmaWxlX25hbWUsCisJCSBpbnQgaGlfYml0X25yKQoreworICB0YWJsZSAqZmlsZSA9IHRhYmxlX29wZW4oZmlsZV9uYW1lLCBucl9jYWNoZV9ydWxlX2ZpZWxkcywgMCk7CisgIHRhYmxlX2VudHJ5ICplbnRyeTsKKyAgY2FjaGVfdGFibGUgKnRhYmxlID0gTlVMTDsKKyAgY2FjaGVfdGFibGUgKipjdXJyX3J1bGUgPSAmdGFibGU7CisgIHdoaWxlICgoZW50cnkgPSB0YWJsZV9lbnRyeV9yZWFkKGZpbGUpKSAhPSBOVUxMKSB7CisgICAgY2FjaGVfdGFibGUgKm5ld19ydWxlID0gWkFMTE9DKGNhY2hlX3RhYmxlKTsKKyAgICBuZXdfcnVsZS0+dHlwZSA9IG5hbWUyaShlbnRyeS0+ZmllbGRzW2NhX3R5cGVdLCBjYWNoZV90eXBlX21hcCk7CisgICAgbmV3X3J1bGUtPmZpZWxkX25hbWUgPSBlbnRyeS0+ZmllbGRzW2NhX2ZpZWxkX25hbWVdOworICAgIG5ld19ydWxlLT5kZXJpdmVkX25hbWUgPSBlbnRyeS0+ZmllbGRzW2NhX2Rlcml2ZWRfbmFtZV07CisgICAgbmV3X3J1bGUtPnR5cGVfZGVmID0gKHN0cmxlbihlbnRyeS0+ZmllbGRzW2NhX3R5cGVfZGVmXSkKKwkJCSAgPyBlbnRyeS0+ZmllbGRzW2NhX3R5cGVfZGVmXQorCQkJICA6IE5VTEwpOworICAgIG5ld19ydWxlLT5leHByZXNzaW9uID0gKHN0cmxlbihlbnRyeS0+ZmllbGRzW2NhX2V4cHJlc3Npb25dKSA+IDAKKwkJCSAgICA/IGVudHJ5LT5maWVsZHNbY2FfZXhwcmVzc2lvbl0KKwkJCSAgICA6IE5VTEwpOworICAgIG5ld19ydWxlLT5maWxlX2VudHJ5ID0gZW50cnk7CisgICAgKmN1cnJfcnVsZSA9IG5ld19ydWxlOworICAgIGN1cnJfcnVsZSA9ICZuZXdfcnVsZS0+bmV4dDsKKyAgfQorICByZXR1cm4gdGFibGU7Cit9CisKKworCisjaWZkZWYgTUFJTgorCitzdGF0aWMgdm9pZAorZHVtcF9jYWNoZV9ydWxlKGNhY2hlX3RhYmxlKiBydWxlLAorCQlpbnQgaW5kZW50KQoreworICBkdW1wZihpbmRlbnQsICIoKGNhY2hlX3RhYmxlKikweCV4XG4iLCBydWxlKTsKKyAgZHVtcGYoaW5kZW50LCAiICh0eXBlICVzKVxuIiwgaTJuYW1lKHJ1bGUtPnR5cGUsIGNhY2hlX3R5cGVfbWFwKSk7CisgIGR1bXBmKGluZGVudCwgIiAoZmllbGRfbmFtZSBcIiVzXCIpXG4iLCBydWxlLT5maWVsZF9uYW1lKTsKKyAgZHVtcGYoaW5kZW50LCAiIChkZXJpdmVkX25hbWUgXCIlc1wiKVxuIiwgcnVsZS0+ZGVyaXZlZF9uYW1lKTsKKyAgZHVtcGYoaW5kZW50LCAiICh0eXBlLWRlZiBcIiVzXCIpXG4iLCBydWxlLT50eXBlX2RlZik7CisgIGR1bXBmKGluZGVudCwgIiAoZXhwcmVzc2lvbiBcIiVzXCIpXG4iLCBydWxlLT5leHByZXNzaW9uKTsKKyAgZHVtcGYoaW5kZW50LCAiIChuZXh0IDB4JXgpXG4iLCBydWxlLT5uZXh0KTsKKyAgZHVtcGYoaW5kZW50LCAiIClcbiIpOworfQorCisKK3N0YXRpYyB2b2lkCitkdW1wX2NhY2hlX3J1bGVzKGNhY2hlX3RhYmxlKiBydWxlLAorCQkgaW50IGluZGVudCkKK3sKKyAgd2hpbGUgKHJ1bGUpIHsKKyAgICBkdW1wX2NhY2hlX3J1bGUocnVsZSwgaW5kZW50KTsKKyAgICBydWxlID0gcnVsZS0+bmV4dDsKKyAgfQorfQorCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGNhY2hlX3RhYmxlICpydWxlczsKKyAgaWYgKGFyZ2MgIT0gMykKKyAgICBlcnJvcigiVXNhZ2U6IGNhY2hlIDxjYWNoZS1maWxlPiA8aGktYml0LW5yPlxuIik7CisgIHJ1bGVzID0gbG9hZF9jYWNoZV90YWJsZShhcmd2WzFdLCBhMmkoYXJndlsyXSkpOworICBkdW1wX2NhY2hlX3J1bGVzKHJ1bGVzLCAwKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9wcGMvbGQtY2FjaGUuaCBiL3NpbS9wcGMvbGQtY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmUzOTUwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9sZC1jYWNoZS5oCkBAIC0wLDAgKzEsODEgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisvKiBJbnN0cnVjdGlvbiB1bnBhY2tpbmc6CisKKyAgIE9uY2UgdGhlIGluc3RydWN0aW9uIGhhcyBiZWVuIGRlY29kZWQsIHRoZSByZWdpc3RlciAoYW5kIG90aGVyKQorICAgZmllbGRzIHdpdGhpbiB0aGUgaW5zdHJ1Y3Rpb24gbmVlZCB0byBiZSBleHRyYWN0ZWQuCisKKyAgIFRoZSB0YWJsZSB0aGF0IGZvbGxvd3MgZGV0ZXJtaW5lcyBob3cgZWFjaCBmaWVsZCBzaG91bGQgYmUgdHJlYXRlZC4KKyAgIEltcG9ydGFudGx5IGl0IGNvbnNpZGVycyB0aGUgY2FzZSB3aGVyZSB0aGUgZXh0cmFjdGVkIGZpZWxkIGlzIHRvCisgICBiZSB1c2VkIGltbWVkaWF0bHkgb3Igc3RvcmVkIGluIGFuIGluc3RydWN0aW9uIGNhY2hlLgorCisgICA8dHlwZT4KKworICAgSW5kaWNhdGVzIHdoYXQgdG8gZG8gd2l0aCB0aGUgY2FjaGUgZW50cnkuICBJZiBhIGNhY2hlIGlzIHRvIGJlCisgICB1c2VkLiAgU0NSQVRDSCBhbmQgQ0FDSEUgdmFsdWVzIGFyZSBkZWZpbmVkIHdoZW4gYSBjYWNoZSBlbnRyeSBpcworICAgYmVpbmcgZmlsbGVkIHdoaWxlIENBQ0hFIGFuZCBDT01QVVRFIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiB0aGUKKyAgIHNlbWFudGljIGNvZGUuCisKKyAgIFplcm8gbWFya3MgdGhlIGVuZCBvZiB0aGUgdGFibGUuICBNb3JlIGltcG9ydGFudGx5IDEuIGluZGljYXRlcworICAgdGhhdCB0aGUgZW50cnkgaXMgdmFsaWQgYW5kIGNhbiBiZSBjYWNoZWQuIDIuIGluZGljYXRlcyB0aGF0IHRoYXQKKyAgIHRoZSBlbnRyeSBpcyB2YWxpZCBidXQgY2FuIG5vdCBiZSBjYWNoZWQuCisKKyAgIDxmaWVsZF9uYW1lPgorCisgICBUaGUgZmllbGQgbmFtZSBhcyBnaXZlbiBpbiB0aGUgaW5zdHJ1Y3Rpb24gc3BlYy4KKworICAgPGRlcml2ZWRfbmFtZT4KKworICAgQSBuZXcgbmFtZSBmb3IgPGZpZWxkX25hbWU+IG9uY2UgaXQgaGFzIGJlZW4gZXh0cmFjdGVkIGZyb20gdGhlCisgICBpbnN0cnVjdGlvbiAoYW5kIHBvc3NpYmx5IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUpLgorCisgICA8dHlwZT4KKworICAgU3RyaW5nIHNwZWNpZnlpbmcgdGhlIHN0b3JhZ2UgdHlwZSBmb3IgPG5ld19uYW1lPiAodGhlIGV4dHJhY3RlZAorICAgZmllbGQ+LgorCisgICA8ZXhwcmVzc2lvbj4KKworICAgU3BlY2lmaWVzIGhvdyB0byBnZXQgPG5ld19uYW1lPiBmcm9tIDxvbGRfbmFtZT4uICBJZiBudWxsLCBvbGQgYW5kCisgICBuZXcgbmFtZSBoYWQgYmV0dGVyIGJlIHRoZSBzYW1lLiAqLworCisKK3R5cGVkZWYgZW51bSB7CisgIHNjcmF0Y2hfdmFsdWUsCisgIGNhY2hlX3ZhbHVlLAorICBjb21wdXRlX3ZhbHVlLAorfSBjYWNoZV9ydWxlX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IF9jYWNoZV90YWJsZSBjYWNoZV90YWJsZTsKK3N0cnVjdCBfY2FjaGVfdGFibGUgeworICBjYWNoZV9ydWxlX3R5cGUgdHlwZTsKKyAgY2hhciAqZmllbGRfbmFtZTsKKyAgY2hhciAqZGVyaXZlZF9uYW1lOworICBjaGFyICp0eXBlX2RlZjsKKyAgY2hhciAqZXhwcmVzc2lvbjsKKyAgdGFibGVfZW50cnkgKmZpbGVfZW50cnk7CisgIGNhY2hlX3RhYmxlICpuZXh0OworfTsKKworCitleHRlcm4gY2FjaGVfdGFibGUgKmxvYWRfY2FjaGVfdGFibGUKKyhjaGFyICpmaWxlX25hbWUsCisgaW50IGhpX2JpdF9ucik7CmRpZmYgLS1naXQgYS9zaW0vcHBjL2xkLWRlY29kZS5jIGIvc2ltL3BwYy9sZC1kZWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTY0OTYwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9sZC1kZWNvZGUuYwpAQCAtMCwwICsxLDE1NSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKy8qIGxvYWQgdGhlIG9wY29kZSBzdGF0IHN0cnVjdHVyZSAqLworCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgImxmLmgiCisjaW5jbHVkZSAidGFibGUuaCIKKyNpbmNsdWRlICJsZC1kZWNvZGUuaCIKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgMAorI2VuZGlmCisKK2VudW0geworICBvcF9vcHRpb25zLAorICBvcF9maXJzdCwKKyAgb3BfbGFzdCwKKyAgb3BfZm9yY2VfZmlyc3QsCisgIG9wX2ZvcmNlX2xhc3QsCisgIG9wX2ZvcmNlX2V4cGFuc2lvbiwKKyAgb3Bfc3BlY2lhbF9tYXNrLAorICBvcF9zcGVjaWFsX3ZhbHVlLAorICBvcF9zcGVjaWFsX2NvbnN0YW50LAorICBucl9kZWNvZGVfZmllbGRzLAorfTsKKworc3RhdGljIGNvbnN0IG5hbWVfbWFwIGRlY29kZV90eXBlX21hcFtdID0geworICB7ICJub3JtYWwiLCBub3JtYWxfZGVjb2RlX3J1bGUgfSwKKyAgeyAiZXhwYW5kLWZvcmNlZCIsIGV4cGFuZF9mb3JjZWRfcnVsZSB9LAorICB7ICJib29sZWFuIiwgYm9vbGVhbl9ydWxlIH0sCisgIHsgTlVMTCwgbm9ybWFsX2RlY29kZV9ydWxlIH0sCit9OworCitzdGF0aWMgY29uc3QgbmFtZV9tYXAgZGVjb2RlX2dlbl9tYXBbXSA9IHsKKyAgeyAiYXJyYXkiLCBhcnJheV9nZW4gfSwKKyAgeyAic3dpdGNoIiwgc3dpdGNoX2dlbiB9LAorICB7ICJwYWRkZWQtc3dpdGNoIiwgcGFkZGVkX3N3aXRjaF9nZW4gfSwKKyAgeyAiZ290by1zd2l0Y2giLCBnb3RvX3N3aXRjaF9nZW4gfSwKKyAgeyBOVUxMLCAtMSB9LAorfTsKKworc3RhdGljIGNvbnN0IG5hbWVfbWFwIGRlY29kZV9zbGFzaF9tYXBbXSA9IHsKKyAgeyAidmFyaWFibGUtc2xhc2giLCAwIH0sCisgIHsgImNvbnN0YW50LXNsYXNoIiwgMSB9LAorICB7IE5VTEwgfSwKK307CisKKworc3RhdGljIGRlY29kZV9nZW5fdHlwZSBvdmVycmlkaW5nX2dlbl90eXBlID0gaW52YWxpZF9nZW47CisKK3ZvaWQKK2ZvcmNlX2RlY29kZV9nZW5fdHlwZShjb25zdCBjaGFyICp0eXBlKQoreworICBvdmVycmlkaW5nX2dlbl90eXBlID0gbmFtZTJpKHR5cGUsIGRlY29kZV9nZW5fbWFwKTsKK30KKworCitkZWNvZGVfdGFibGUgKgorbG9hZF9kZWNvZGVfdGFibGUoY2hhciAqZmlsZV9uYW1lLAorCQkgIGludCBoaV9iaXRfbnIpCit7CisgIHRhYmxlICpmaWxlID0gdGFibGVfb3BlbihmaWxlX25hbWUsIG5yX2RlY29kZV9maWVsZHMsIDApOworICB0YWJsZV9lbnRyeSAqZW50cnk7CisgIGRlY29kZV90YWJsZSAqdGFibGUgPSBOVUxMOworICBkZWNvZGVfdGFibGUgKipjdXJyX3J1bGUgPSAmdGFibGU7CisgIHdoaWxlICgoZW50cnkgPSB0YWJsZV9lbnRyeV9yZWFkKGZpbGUpKSAhPSBOVUxMKSB7CisgICAgZGVjb2RlX3RhYmxlICpuZXdfcnVsZSA9IFpBTExPQyhkZWNvZGVfdGFibGUpOworICAgIG5ld19ydWxlLT50eXBlID0gbmFtZTJpKGVudHJ5LT5maWVsZHNbb3Bfb3B0aW9uc10sIGRlY29kZV90eXBlX21hcCk7CisgICAgbmV3X3J1bGUtPmdlbiA9IChvdmVycmlkaW5nX2dlbl90eXBlICE9IGludmFsaWRfZ2VuCisJCSAgICAgPyBvdmVycmlkaW5nX2dlbl90eXBlCisJCSAgICAgOiBuYW1lMmkoZW50cnktPmZpZWxkc1tvcF9vcHRpb25zXSwgZGVjb2RlX2dlbl9tYXApKTsKKyAgICBuZXdfcnVsZS0+Zm9yY2Vfc2xhc2ggPSBuYW1lMmkoZW50cnktPmZpZWxkc1tvcF9vcHRpb25zXSwgZGVjb2RlX3NsYXNoX21hcCk7CisgICAgbmV3X3J1bGUtPmZpcnN0ID0gdGFyZ2V0X2EyaShoaV9iaXRfbnIsIGVudHJ5LT5maWVsZHNbb3BfZmlyc3RdKTsKKyAgICBuZXdfcnVsZS0+bGFzdCA9IHRhcmdldF9hMmkoaGlfYml0X25yLCBlbnRyeS0+ZmllbGRzW29wX2xhc3RdKTsKKyAgICBuZXdfcnVsZS0+Zm9yY2VfZmlyc3QgPSAoc3RybGVuKGVudHJ5LT5maWVsZHNbb3BfZm9yY2VfZmlyc3RdKQorCQkJICAgICA/IHRhcmdldF9hMmkoaGlfYml0X25yLCBlbnRyeS0+ZmllbGRzW29wX2ZvcmNlX2ZpcnN0XSkKKwkJCSAgICAgOiBuZXdfcnVsZS0+bGFzdCArIDEpOworICAgIG5ld19ydWxlLT5mb3JjZV9sYXN0ID0gKHN0cmxlbihlbnRyeS0+ZmllbGRzW29wX2ZvcmNlX2xhc3RdKQorCQkJICAgID8gdGFyZ2V0X2EyaShoaV9iaXRfbnIsIGVudHJ5LT5maWVsZHNbb3BfZm9yY2VfbGFzdF0pCisJCQkgICAgOiBuZXdfcnVsZS0+Zmlyc3QgLSAxKTsKKyAgICBuZXdfcnVsZS0+Zm9yY2VfZXhwYW5zaW9uID0gZW50cnktPmZpZWxkc1tvcF9mb3JjZV9leHBhbnNpb25dOworICAgIG5ld19ydWxlLT5zcGVjaWFsX21hc2sgPSBhMmkoZW50cnktPmZpZWxkc1tvcF9zcGVjaWFsX21hc2tdKTsKKyAgICBuZXdfcnVsZS0+c3BlY2lhbF92YWx1ZSA9IGEyaShlbnRyeS0+ZmllbGRzW29wX3NwZWNpYWxfdmFsdWVdKTsKKyAgICBuZXdfcnVsZS0+c3BlY2lhbF9jb25zdGFudCA9IGEyaShlbnRyeS0+ZmllbGRzW29wX3NwZWNpYWxfY29uc3RhbnRdKTsKKyAgICAqY3Vycl9ydWxlID0gbmV3X3J1bGU7CisgICAgY3Vycl9ydWxlID0gJm5ld19ydWxlLT5uZXh0OworICB9CisgIHJldHVybiB0YWJsZTsKK30KKworICAKK3ZvaWQKK2R1bXBfZGVjb2RlX3J1bGUoZGVjb2RlX3RhYmxlICpydWxlLAorCQkgaW50IGluZGVudCkKK3sKKyAgZHVtcGYoaW5kZW50LCAiKChkZWNvZGVfdGFibGUqKSVwXG4iLCBydWxlKTsKKyAgaWYgKHJ1bGUpIHsKKyAgICBkdW1wZihpbmRlbnQsICIgKHR5cGUgJXMpXG4iLCBpMm5hbWUocnVsZS0+dHlwZSwgZGVjb2RlX3R5cGVfbWFwKSk7CisgICAgZHVtcGYoaW5kZW50LCAiIChnZW4gJXMpXG4iLCBpMm5hbWUocnVsZS0+Z2VuLCBkZWNvZGVfZ2VuX21hcCkpOworICAgIGR1bXBmKGluZGVudCwgIiAoZm9yY2Vfc2xhc2ggJWQpXG4iLCBydWxlLT5mb3JjZV9zbGFzaCk7CisgICAgZHVtcGYoaW5kZW50LCAiIChmaXJzdCAlZClcbiIsIHJ1bGUtPmZpcnN0KTsKKyAgICBkdW1wZihpbmRlbnQsICIgKGxhc3QgJWQpXG4iLCBydWxlLT5sYXN0KTsKKyAgICBkdW1wZihpbmRlbnQsICIgKGZvcmNlX2ZpcnN0ICVkKVxuIiwgcnVsZS0+Zm9yY2VfZmlyc3QpOworICAgIGR1bXBmKGluZGVudCwgIiAoZm9yY2VfbGFzdCAlZClcbiIsIHJ1bGUtPmZvcmNlX2xhc3QpOworICAgIGR1bXBmKGluZGVudCwgIiAoZm9yY2VfZXhwYW5zaW9uIFwiJXNcIilcbiIsIHJ1bGUtPmZvcmNlX2V4cGFuc2lvbik7CisgICAgZHVtcGYoaW5kZW50LCAiIChzcGVjaWFsX21hc2sgMHgleClcbiIsIHJ1bGUtPnNwZWNpYWxfbWFzayk7CisgICAgZHVtcGYoaW5kZW50LCAiIChzcGVjaWFsX3ZhbHVlIDB4JXgpXG4iLCBydWxlLT5zcGVjaWFsX3ZhbHVlKTsKKyAgICBkdW1wZihpbmRlbnQsICIgKHNwZWNpYWxfY29uc3RhbnQgMHgleClcbiIsIHJ1bGUtPnNwZWNpYWxfY29uc3RhbnQpOworICAgIGR1bXBmKGluZGVudCwgIiAobmV4dCAweCV4KVxuIiwgcnVsZS0+bmV4dCk7CisgIH0KKyAgZHVtcGYoaW5kZW50LCAiIClcbiIpOworfQorCisKKyNpZmRlZiBNQUlOCisKK3N0YXRpYyB2b2lkCitkdW1wX2RlY29kZV9ydWxlcyhkZWNvZGVfdGFibGUgKnJ1bGUsCisJCSAgaW50IGluZGVudCkKK3sKKyAgd2hpbGUgKHJ1bGUpIHsKKyAgICBkdW1wX2RlY29kZV9ydWxlKHJ1bGUsIGluZGVudCk7CisgICAgcnVsZSA9IHJ1bGUtPm5leHQ7CisgIH0KK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgZGVjb2RlX3RhYmxlICpydWxlczsKKyAgaWYgKGFyZ2MgIT0gMykKKyAgICBlcnJvcigiVXNhZ2U6IGRlY29kZSA8ZGVjb2RlLWZpbGU+IDxoaS1iaXQtbnI+XG4iKTsKKyAgcnVsZXMgPSBsb2FkX2RlY29kZV90YWJsZShhcmd2WzFdLCBhMmkoYXJndlsyXSkpOworICBkdW1wX2RlY29kZV9ydWxlcyhydWxlcywgMCk7CisgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vcHBjL2xkLWRlY29kZS5oIGIvc2ltL3BwYy9sZC1kZWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTIzMTgxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9sZC1kZWNvZGUuaApAQCAtMCwwICsxLDE0MyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQsMTk5NSwxOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworLyogSW5zdHJ1Y3Rpb24gZGVjb2RlIHRhYmxlOgorCisgICA8b3B0aW9ucz46PGZpcnN0Pjo8bGFzdD46PGZvcmNlLWZpcnN0Pjo8Zm9yY2UtbGFzdD46PGZvcmNlLWV4cGFuZD46PHNwZWNpYWw+Li4uCisKKworCisgICBJZ25vcmUgdGhlIGJlbG93OgorCisKKyAgIFRoZSBpbnN0cnVjdGlvbiBkZWNvZGUgdGFibGUgY29udGFpbnMgcnVsZXMgdGhhdCBkaWN0YXRlIGhvdyBpZ2VuCisgICBpcyBnb2luZyB0byBmaXJzdGx5IGJyZWFrIGRvd24gdGhlIG9wY29kZSB0YWJsZSBhbmQgc2Vjb25kbHkKKworICAgVGhlIHRhYmxlIHRoYXQgZm9sbG93cyBpcyB1c2VkIGJ5IGdlbiB0byBjb25zdHJ1Y3QgYSBkZWNpc2lvbiB0cmVlCisgICB0aGF0IGNhbiBpZGVudGlmeSBlYWNoIHBvc3NpYmxlIGluc3RydWN0aW9uLiAgR2VuIHRoZW4gb3V0cHV0cyB0aGlzCisgICBkZWNpc2lvbiB0cmVlIGFzIChhY2NvcmRpbmcgdG8gY29uZmlnKSBhIHRhYmxlIG9yIHN3aXRjaCBzdGF0ZW1lbnQKKyAgIGFzIHRoZSBmdW5jdGlvbiBpZGVjb2RlLgorCisgICBJbiBwYXJhbGxlbCB0byB0aGlzLCBhcyBtZW50aW9uZWQgYWJvdmUsIFdJVEhfRVhQQU5ERURfU0VNQU5USUNTCisgICBkZXRlcm1pbmVzIG9mIHRoZSBzZW1hbnRpYyBmdW5jdGlvbnMgdGhlbXNlbHZlcyBzaG91bGQgYmUgZXhwYW5kZWQKKyAgIGluIGEgc2ltaWxhciB3YXkuCisKKyAgIDxmaXJzdD4KKyAgIDxsYXN0PgorCisgICBSYW5nZSBvZiBiaXRzICh3aXRoaW4gdGhlIGluc3RydWN0aW9uKSB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCBmb3IKKyAgIGFuIGluc3RydWN0aW9uIGZpZWxkLiAgV2l0aGluIHN1Y2ggcmFuZ2VzLCBnZW4gbG9va3MgZm9yIG9wY29kZXMKKyAgIChjb25zdGFudHMpLCByZWdpc3RlcnMgKHN0cmluZ3MpIGFuZCByZXNlcnZlZCBiaXRzIChzbGFzaCkgYW5kCisgICBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIHRoYXQgZm9sbG93cyBpbmNsdWRlcyBvciBleGNsdWRlcyB0aGVtIGZyb20KKyAgIGEgcG9zc2libGUgaW5zdHJ1Y3Rpb24gZmllbGQuCisKKyAgIDxmb3JjZV9maXJzdD4KKyAgIDxmb3JjZV9sYXN0PgorCisgICBJZiBhbiBpbnN0cnVjdGlvbiBmaWVsZCB3YXMgZm91bmQsIGVubGFyZ2UgdGhlIGZpZWxkIHNpemUgc28gdGhhdAorICAgaXQgaXMgZm9yY2VkIHRvIGF0IGxlYXN0IGluY2x1ZGUgYml0cyBzdGFydGluZyBmcm9tIDxmb3JjZV9maXJzdD4KKyAgICg8Zm9yY2VfbGFzdD4pLiAgVG8gc3RvcCB0aGlzIG9jY3VyaW5nLCB1c2UgPGZvcmNlX2ZpcnN0PiA9IDxsYXN0PgorICAgKyAxIGFuZCA8Zm9yY2VfbGFzdD4gPSA8Zmlyc3Q+IC0gMS4KKworICAgPGZvcmNlX3NsYXNoPgorCisgICBUcmVhdCBgLycgZmllbGRzIGFzIGEgY29uc3RhbnQgaW5zdGVhZCBvZiB2YXJpYWJsZSB3aGVuIGxvb2tpbmcgZm9yCisgICBhbiBpbnN0cnVjdGlvbiBmaWVsZC4KKworICAgPGZvcmNlX2V4cGFuc2lvbj4KKworICAgVHJlYXQgYW55IGNvbnRhaW5lZCByZWdpc3RlciAoc3RyaW5nKSBmaWVsZHMgYXMgY29uc3RhbnQgd2hlbgorICAgZGV0ZXJtaW5pbmcgdGhlIGluc3RydWN0aW9uIGZpZWxkLiAgRm9yIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGUgKGFuZAorICAgY29udHJvbGVkIGJ5IElERUNPREVfRVhQQU5EX1NFTUFOVElDUykgdGhpcyBmb3JjZXMgdGhlIGV4cGFuc2lvbiBvZgorICAgd2hhdCB3b3VsZCBvdGhlcndpemUgYmUgbm9uIGNvbnN0YW50IGJpdHMgb2YgYW4gaW5zdHJ1Y3Rpb24uCisKKyAgIDx1c2Vfc3dpdGNoPgorCisgICBTaG91bGQgdGhpcyB0YWJsZSBiZSBleHBhbmRlZCB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgKHZhbCAxKSBhbmQKKyAgIGlmIHNvLCBzaG91bGQgaXQgYmUgcGFkZGVkIHdpdGggZW50cmllcyBzbyBhcyB0byBmb3JjZSB0aGUgY29tcGlsZXIKKyAgIHRvIGdlbmVyYXRlIGEganVtcCB0YWJsZSAodmFsIDIpLiBPciBhIGJyYW5jaCB0YWJsZSAodmFsIDMpLgorCisgICA8c3BlY2lhbF9tYXNrPgorICAgPHNwZWNpYWxfdmFsdWU+CisgICA8c3BlY2lhbF9ydWxlPgorICAgPHNwZWNpYWxfY29uc3RhbnQ+CisKKyAgIFNwZWNpYWwgcnVsZSB0byBmaW5lIHR1bmUgaG93IHNwZWNpZmljIChvciBncm91cHMpIG9mIGluc3RydWN0aW9ucworICAgYXJlIGV4cGFuZGVkLiAgVGhlIGFwcGxpY2FiaWxpdHkgb2YgdGhlIHJ1bGUgaXMgZGV0ZXJtaW5lZCBieQorCisgICAgIDxzcGVjaWFsX21hc2s+ICE9IDAgJiYgKGluc3RydWN0aW9uPiAmIDxzcGVjaWFsX21hc2s+KSA9PSA8c3BlY2lhbF92YWx1ZT4KKworICAgV2hlcmUgPGluc3RydWN0aW9uPiBpcyBvYnRhaW5lZCBieSBsb29raW5nIG9ubHkgYXQgY29uc3RhbnQgZmllbGRzCisgICB3aXRoIGluIGFuIGluc3RydWN0aW9ucyBzcGVjLiAgV2hlbiBkZXRlcm1pbmluZyBhbiBleHBhbnNpb24sIHRoZQorICAgcnVsZSBpcyBvbmx5IGNvbnNpZGVyZWQgd2hlbiBhIG5vZGUgY29udGFpbnMgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCisgICA8c3BlY2lhbF9ydWxlPiBjYW4gYmUgYW55IG9mOgorCisgICAgICAgIDA6IGZvciB0aGlzIGluc3RydWN0aW9uLCBleHBhbmQgYnkgZWFybGllciBydWxlcworICAgCTE6IGV4cGFuZCBiaXRzIDxmb3JjZV9sb3c+IC4uIDxmb3JjZV9oaT4gb25seQorCTI6IGJvb2xlYW4gZXhwYW5zaW9uIG9mIG9ubHkgemVyby9ub24temVybyBjYXNlcworCTM6IGJvb2xlYW4gZXhwYW5zaW9uIG9mIGVxdWFsaXR5IG9mIHNwZWNpYWwgY29uc3RhbnQKKworCSovCisKKwordHlwZWRlZiBlbnVtIHsKKyAgbm9ybWFsX2RlY29kZV9ydWxlLAorICBleHBhbmRfZm9yY2VkX3J1bGUsCisgIGJvb2xlYW5fcnVsZSwKKyAgbnJfZGVjb2RlX3J1bGVzCit9IGRlY29kZV9zcGVjaWFsX3R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgIGludmFsaWRfZ2VuLAorICBhcnJheV9nZW4sCisgIHN3aXRjaF9nZW4sCisgIHBhZGRlZF9zd2l0Y2hfZ2VuLAorICBnb3RvX3N3aXRjaF9nZW4sCisgIG5yX2RlY29kZV9nZW5fdHlwZXMsCit9IGRlY29kZV9nZW5fdHlwZTsKKworCit0eXBlZGVmIHN0cnVjdCBfZGVjb2RlX3RhYmxlIGRlY29kZV90YWJsZTsKK3N0cnVjdCBfZGVjb2RlX3RhYmxlIHsKKyAgZGVjb2RlX3NwZWNpYWxfdHlwZSB0eXBlOworICBkZWNvZGVfZ2VuX3R5cGUgZ2VuOworICBpbnQgZmlyc3Q7CisgIGludCBsYXN0OworICBpbnQgZm9yY2VfZmlyc3Q7CisgIGludCBmb3JjZV9sYXN0OworICBpbnQgZm9yY2Vfc2xhc2g7CisgIGNoYXIgKmZvcmNlX2V4cGFuc2lvbjsKKyAgdW5zaWduZWQgc3BlY2lhbF9tYXNrOworICB1bnNpZ25lZCBzcGVjaWFsX3ZhbHVlOworICB1bnNpZ25lZCBzcGVjaWFsX2NvbnN0YW50OworICBkZWNvZGVfdGFibGUgKm5leHQ7Cit9OworCisKK2V4dGVybiB2b2lkIGZvcmNlX2RlY29kZV9nZW5fdHlwZQorKGNvbnN0IGNoYXIgKnR5cGUpOworCitleHRlcm4gZGVjb2RlX3RhYmxlICpsb2FkX2RlY29kZV90YWJsZQorKGNoYXIgKmZpbGVfbmFtZSwKKyBpbnQgaGlfYml0X25yKTsKKworZXh0ZXJuIHZvaWQgZHVtcF9kZWNvZGVfcnVsZQorKGRlY29kZV90YWJsZSAqcnVsZSwKKyBpbnQgaW5kZW50KTsKZGlmZiAtLWdpdCBhL3NpbS9wcGMvbGQtaW5zbi5jIGIvc2ltL3BwYy9sZC1pbnNuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5MGQ4NQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvbGQtaW5zbi5jCkBAIC0wLDAgKzEsOTI1IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NCwxOTk1LDE5OTYsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAibGYuaCIKKyNpbmNsdWRlICJ0YWJsZS5oIgorI2luY2x1ZGUgImZpbHRlci5oIgorI2luY2x1ZGUgImxkLWRlY29kZS5oIgorI2luY2x1ZGUgImxkLWNhY2hlLmgiCisjaW5jbHVkZSAibGQtaW5zbi5oIgorCisjaW5jbHVkZSAiaWdlbi5oIgorCitzdGF0aWMgdm9pZAordXBkYXRlX2RlcHRoKGluc25fdGFibGUgKmVudHJ5LAorCSAgICAgbGYgKmZpbGUsCisJICAgICB2b2lkICpkYXRhLAorCSAgICAgaW5zbiAqaW5zdHJ1Y3Rpb24sCisJICAgICBpbnQgZGVwdGgpCit7CisgIGludCAqbWF4X2RlcHRoID0gKGludCopZGF0YTsKKyAgaWYgKCptYXhfZGVwdGggPCBkZXB0aCkKKyAgICAqbWF4X2RlcHRoID0gZGVwdGg7Cit9CisKKworaW50CitpbnNuX3RhYmxlX2RlcHRoKGluc25fdGFibGUgKnRhYmxlKQoreworICBpbnQgZGVwdGggPSAwOworICBpbnNuX3RhYmxlX3RyYXZlcnNlX3RyZWUodGFibGUsCisJCQkgICBOVUxMLAorCQkJICAgJmRlcHRoLAorCQkJICAgMSwKKwkJCSAgIE5VTEwsIC8qc3RhcnQqLworCQkJICAgdXBkYXRlX2RlcHRoLAorCQkJICAgTlVMTCwgLyplbmQqLworCQkJICAgTlVMTCk7IC8qcGFkZGluZyovCisgIHJldHVybiBkZXB0aDsKK30KKworCitzdGF0aWMgaW5zbl9maWVsZHMgKgorcGFyc2VfaW5zbl9mb3JtYXQodGFibGVfZW50cnkgKmVudHJ5LAorCQkgIGNoYXIgKmZvcm1hdCkKK3sKKyAgY2hhciAqY2hwOworICBpbnNuX2ZpZWxkcyAqZmllbGRzID0gWkFMTE9DKGluc25fZmllbGRzKTsKKworICAvKiBjcmVhdGUgYSBsZWFkaW5nIHNlbnRpbmFsICovCisgIGZpZWxkcy0+Zmlyc3QgPSBaQUxMT0MoaW5zbl9maWVsZCk7CisgIGZpZWxkcy0+Zmlyc3QtPmZpcnN0ID0gLTE7CisgIGZpZWxkcy0+Zmlyc3QtPmxhc3QgPSAtMTsKKyAgZmllbGRzLT5maXJzdC0+d2lkdGggPSAwOworCisgIC8qIGFuZCBhIHRyYWlsaW5nIHNlbnRpbmFsICovCisgIGZpZWxkcy0+bGFzdCA9IFpBTExPQyhpbnNuX2ZpZWxkKTsKKyAgZmllbGRzLT5sYXN0LT5maXJzdCA9IGluc25fYml0X3NpemU7CisgIGZpZWxkcy0+bGFzdC0+bGFzdCA9IGluc25fYml0X3NpemU7CisgIGZpZWxkcy0+bGFzdC0+d2lkdGggPSAwOworCisgIC8qIGxpbmsgdGhlbSB0b2dldGhlciAqLworICBmaWVsZHMtPmZpcnN0LT5uZXh0ID0gZmllbGRzLT5sYXN0OworICBmaWVsZHMtPmxhc3QtPnByZXYgPSBmaWVsZHMtPmZpcnN0OworCisgIC8qIG5vdyB3b3JrIHRocm91Z2ggdGhlIGZvcm1hdHMgKi8KKyAgY2hwID0gZm9ybWF0OworCisgIHdoaWxlICgqY2hwICE9ICdcMCcpIHsKKyAgICBjaGFyICpzdGFydF9wb3M7CisgICAgY2hhciAqc3RhcnRfdmFsOworICAgIGludCBzdHJsZW5fdmFsOworICAgIGludCBzdHJsZW5fcG9zOworICAgIGluc25fZmllbGQgKm5ld19maWVsZDsKKworICAgIC8qIHNhbml0eSBjaGVjayAqLworICAgIGlmICghaXNkaWdpdCgqY2hwKSkgeworICAgICAgZXJyb3IoIiVzOiVkOiBtaXNzaW5nIHBvc2l0aW9uIGZpZWxkIGF0IGAlcydcbiIsCisJICAgIGVudHJ5LT5maWxlX25hbWUsIGVudHJ5LT5saW5lX25yLCBjaHApOworICAgIH0KKworICAgIC8qIGJyZWFrIG91dCB0aGUgYml0IHBvc2l0aW9uICovCisgICAgc3RhcnRfcG9zID0gY2hwOworICAgIHdoaWxlIChpc2RpZ2l0KCpjaHApKQorICAgICAgY2hwKys7CisgICAgc3RybGVuX3BvcyA9IGNocCAtIHN0YXJ0X3BvczsKKyAgICBpZiAoKmNocCA9PSAnLicgJiYgc3RybGVuX3BvcyA+IDApCisgICAgICBjaHArKzsKKyAgICBlbHNlIHsKKyAgICAgIGVycm9yKCIlczolZDogbWlzc2luZyBmaWVsZCB2YWx1ZSBhdCAlc1xuIiwKKwkgICAgZW50cnktPmZpbGVfbmFtZSwgZW50cnktPmxpbmVfbnIsIGNocCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBicmVhayBvdXQgdGhlIHZhbHVlICovCisgICAgc3RhcnRfdmFsID0gY2hwOworICAgIHdoaWxlICgoKnN0YXJ0X3ZhbCA9PSAnLycgJiYgKmNocCA9PSAnLycpCisJICAgfHwgKGlzZGlnaXQoKnN0YXJ0X3ZhbCkgJiYgaXNkaWdpdCgqY2hwKSkKKwkgICB8fCAoaXNhbHBoYSgqc3RhcnRfdmFsKSAmJiAoaXNhbG51bSgqY2hwKSB8fCAqY2hwID09ICdfJykpKQorICAgICAgY2hwKys7CisgICAgc3RybGVuX3ZhbCA9IGNocCAtIHN0YXJ0X3ZhbDsKKyAgICBpZiAoKmNocCA9PSAnLCcpCisgICAgICBjaHArKzsKKyAgICBlbHNlIGlmICgqY2hwICE9ICdcMCcgfHwgc3RybGVuX3ZhbCA9PSAwKSB7CisgICAgICBlcnJvcigiJXM6JWQ6IG1pc3NpbmcgZmllbGQgdGVybWluYXRvciBhdCAlc1xuIiwKKwkgICAgZW50cnktPmZpbGVfbmFtZSwgZW50cnktPmxpbmVfbnIsIGNocCk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBjcmVhdGUgYSBuZXcgZmllbGQgYW5kIGluc2VydCBpdCAqLworICAgIG5ld19maWVsZCA9IFpBTExPQyhpbnNuX2ZpZWxkKTsKKyAgICBuZXdfZmllbGQtPm5leHQgPSBmaWVsZHMtPmxhc3Q7CisgICAgbmV3X2ZpZWxkLT5wcmV2ID0gZmllbGRzLT5sYXN0LT5wcmV2OworICAgIG5ld19maWVsZC0+bmV4dC0+cHJldiA9IG5ld19maWVsZDsKKyAgICBuZXdfZmllbGQtPnByZXYtPm5leHQgPSBuZXdfZmllbGQ7CisKKyAgICAvKiB0aGUgdmFsdWUgKi8KKyAgICBuZXdfZmllbGQtPnZhbF9zdHJpbmcgPSAoY2hhciopemFsbG9jKHN0cmxlbl92YWwrMSk7CisgICAgc3RybmNweShuZXdfZmllbGQtPnZhbF9zdHJpbmcsIHN0YXJ0X3ZhbCwgc3RybGVuX3ZhbCk7CisgICAgaWYgKGlzZGlnaXQoKm5ld19maWVsZC0+dmFsX3N0cmluZykpIHsKKyAgICAgIG5ld19maWVsZC0+dmFsX2ludCA9IGEyaShuZXdfZmllbGQtPnZhbF9zdHJpbmcpOworICAgICAgbmV3X2ZpZWxkLT5pc19pbnQgPSAxOworICAgIH0KKyAgICBlbHNlIGlmIChuZXdfZmllbGQtPnZhbF9zdHJpbmdbMF0gPT0gJy8nKSB7CisgICAgICBuZXdfZmllbGQtPmlzX3NsYXNoID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBuZXdfZmllbGQtPmlzX3N0cmluZyA9IDE7CisgICAgfQorICAgIAorICAgIC8qIHRoZSBwb3MgKi8KKyAgICBuZXdfZmllbGQtPnBvc19zdHJpbmcgPSAoY2hhciopemFsbG9jKHN0cmxlbl9wb3MrMSk7CisgICAgc3RybmNweShuZXdfZmllbGQtPnBvc19zdHJpbmcsIHN0YXJ0X3Bvcywgc3RybGVuX3Bvcyk7CisgICAgbmV3X2ZpZWxkLT5maXJzdCA9IHRhcmdldF9hMmkoaGlfYml0X25yLCBuZXdfZmllbGQtPnBvc19zdHJpbmcpOworICAgIG5ld19maWVsZC0+bGFzdCA9IG5ld19maWVsZC0+bmV4dC0+Zmlyc3QgLSAxOyAvKiBndWVzcyAqLworICAgIG5ld19maWVsZC0+d2lkdGggPSBuZXdfZmllbGQtPmxhc3QgLSBuZXdfZmllbGQtPmZpcnN0ICsgMTsgLyogZ3Vlc3MgKi8KKyAgICBuZXdfZmllbGQtPnByZXYtPmxhc3QgPSBuZXdfZmllbGQtPmZpcnN0LTE7IC8qZml4Ki8KKyAgICBuZXdfZmllbGQtPnByZXYtPndpZHRoID0gbmV3X2ZpZWxkLT5maXJzdCAtIG5ld19maWVsZC0+cHJldi0+Zmlyc3Q7IC8qZml4Ki8KKyAgfQorCisgIC8qIGZpZGRsZSBmaXJzdC9sYXN0IHNvIHRoYXQgdGhlIHNlbnRpbmFscyBgZGlzYXBlYXInICovCisgIEFTU0VSVChmaWVsZHMtPmZpcnN0LT5sYXN0IDwgMCk7CisgIEFTU0VSVChmaWVsZHMtPmxhc3QtPmZpcnN0ID49IGluc25fYml0X3NpemUpOworICBmaWVsZHMtPmZpcnN0ID0gZmllbGRzLT5maXJzdC0+bmV4dDsKKyAgZmllbGRzLT5sYXN0ID0gZmllbGRzLT5sYXN0LT5wcmV2OworCisgIC8qIG5vdyBnbyBvdmVyIHRoaXMgYWdhaW4sIHBvaW50aW5nIGVhY2ggYml0IHBvc2l0aW9uIGF0IGEgZmllbGQKKyAgICAgcmVjb3JkICovCisgIHsKKyAgICBpbnQgaTsKKyAgICBpbnNuX2ZpZWxkICpmaWVsZDsKKyAgICBmaWVsZCA9IGZpZWxkcy0+Zmlyc3Q7CisgICAgZm9yIChpID0gMDsgaSA8IGluc25fYml0X3NpemU7IGkrKykgeworICAgICAgd2hpbGUgKGZpZWxkLT5sYXN0IDwgaSkKKwlmaWVsZCA9IGZpZWxkLT5uZXh0OworICAgICAgZmllbGRzLT5iaXRzW2ldID0gZmllbGQ7CisgICAgfQorICB9CisKKyAgLyogZ28gb3ZlciBlYWNoIG9mIHRoZSBmaWVsZHMsIGFuZCBjb21wdXRlIGEgYHZhbHVlJyBmb3IgdGhlIGluc24gKi8KKyAgeworICAgIGluc25fZmllbGQgKmZpZWxkOworICAgIGZpZWxkcy0+dmFsdWUgPSAwOworICAgIGZvciAoZmllbGQgPSBmaWVsZHMtPmZpcnN0OworCSBmaWVsZC0+bGFzdCA8IGluc25fYml0X3NpemU7CisJIGZpZWxkID0gZmllbGQtPm5leHQpIHsKKyAgICAgIGZpZWxkcy0+dmFsdWUgPDw9IGZpZWxkLT53aWR0aDsKKyAgICAgIGlmIChmaWVsZC0+aXNfaW50KQorCWZpZWxkcy0+dmFsdWUgfD0gZmllbGQtPnZhbF9pbnQ7CisgICAgfQorICB9CisgIHJldHVybiBmaWVsZHM7Cit9CisKKworc3RhdGljIHZvaWQKK21vZGVsX3RhYmxlX2luc2VydChpbnNuX3RhYmxlICp0YWJsZSwKKwkJICAgdGFibGVfZW50cnkgKmZpbGVfZW50cnkpCit7CisgIGludCBsZW47CisKKyAgLyogY3JlYXRlIGEgbmV3IG1vZGVsICovCisgIG1vZGVsICpuZXdfbW9kZWwgPSBaQUxMT0MobW9kZWwpOworCisgIG5ld19tb2RlbC0+bmFtZSA9IGZpbGVfZW50cnktPmZpZWxkc1ttb2RlbF9pZGVudGlmZXJdOworICBuZXdfbW9kZWwtPnByaW50YWJsZV9uYW1lID0gZmlsZV9lbnRyeS0+ZmllbGRzW21vZGVsX25hbWVdOworICBuZXdfbW9kZWwtPmluc25fZGVmYXVsdCA9IGZpbGVfZW50cnktPmZpZWxkc1ttb2RlbF9kZWZhdWx0XTsKKworICB3aGlsZSAoKm5ld19tb2RlbC0+aW5zbl9kZWZhdWx0ICYmIGlzc3BhY2UoKm5ld19tb2RlbC0+aW5zbl9kZWZhdWx0KSkKKyAgICBuZXdfbW9kZWwtPmluc25fZGVmYXVsdCsrOworCisgIGxlbiA9IHN0cmxlbihuZXdfbW9kZWwtPmluc25fZGVmYXVsdCk7CisgIGlmIChtYXhfbW9kZWxfZmllbGRzX2xlbiA8IGxlbikKKyAgICBtYXhfbW9kZWxfZmllbGRzX2xlbiA9IGxlbjsKKworICAvKiBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgbW9kZWwgbGlzdCAqLworICBpZiAobGFzdF9tb2RlbCkKKyAgICBsYXN0X21vZGVsLT5uZXh0ID0gbmV3X21vZGVsOworICBlbHNlCisgICAgbW9kZWxzID0gbmV3X21vZGVsOworICBsYXN0X21vZGVsID0gbmV3X21vZGVsOworfQorCitzdGF0aWMgdm9pZAorbW9kZWxfdGFibGVfaW5zZXJ0X3NwZWNpZmljKGluc25fdGFibGUgKnRhYmxlLAorCQkJICAgIHRhYmxlX2VudHJ5ICpmaWxlX2VudHJ5LAorCQkJICAgIGluc24gKipzdGFydF9wdHIsCisJCQkgICAgaW5zbiAqKmVuZF9wdHIpCit7CisgIGluc24gKnB0ciA9IFpBTExPQyhpbnNuKTsKKyAgcHRyLT5maWxlX2VudHJ5ID0gZmlsZV9lbnRyeTsKKyAgaWYgKCplbmRfcHRyKQorICAgICgqZW5kX3B0ciktPm5leHQgPSBwdHI7CisgIGVsc2UKKyAgICAoKnN0YXJ0X3B0cikgPSBwdHI7CisgICgqZW5kX3B0cikgPSBwdHI7Cit9CisKKworc3RhdGljIHZvaWQKK2luc25fdGFibGVfaW5zZXJ0X2Z1bmN0aW9uKGluc25fdGFibGUgKnRhYmxlLAorCQkJICAgdGFibGVfZW50cnkgKmZpbGVfZW50cnkpCit7CisgIC8qIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiAqLworICBpbnNuICpuZXdfZnVuY3Rpb24gPSBaQUxMT0MoaW5zbik7CisgIG5ld19mdW5jdGlvbi0+ZmlsZV9lbnRyeSA9IGZpbGVfZW50cnk7CisKKyAgLyogYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIGxpc3QgKi8KKyAgaWYgKHRhYmxlLT5sYXN0X2Z1bmN0aW9uKQorICAgIHRhYmxlLT5sYXN0X2Z1bmN0aW9uLT5uZXh0ID0gbmV3X2Z1bmN0aW9uOworICBlbHNlCisgICAgdGFibGUtPmZ1bmN0aW9ucyA9IG5ld19mdW5jdGlvbjsKKyAgdGFibGUtPmxhc3RfZnVuY3Rpb24gPSBuZXdfZnVuY3Rpb247Cit9CisKK2V4dGVybiB2b2lkCitpbnNuX3RhYmxlX2luc2VydF9pbnNuKGluc25fdGFibGUgKnRhYmxlLAorCQkgICAgICAgdGFibGVfZW50cnkgKmZpbGVfZW50cnksCisJCSAgICAgICBpbnNuX2ZpZWxkcyAqZmllbGRzKQoreworICBpbnNuICoqcHRyX3RvX2N1cl9pbnNuID0gJnRhYmxlLT5pbnNuczsKKyAgaW5zbiAqY3VyX2luc24gPSAqcHRyX3RvX2N1cl9pbnNuOworICB0YWJsZV9tb2RlbF9lbnRyeSAqaW5zbl9tb2RlbF9wdHI7CisgIG1vZGVsICptb2RlbF9wdHI7CisKKyAgLyogY3JlYXRlIGEgbmV3IGluc3RydWN0aW9uICovCisgIGluc24gKm5ld19pbnNuID0gWkFMTE9DKGluc24pOworICBuZXdfaW5zbi0+ZmlsZV9lbnRyeSA9IGZpbGVfZW50cnk7CisgIG5ld19pbnNuLT5maWVsZHMgPSBmaWVsZHM7CisKKyAgLyogQ2hlY2sgb3V0IGFueSBtb2RlbCBpbmZvcm1hdGlvbiByZXR1cm5lZCB0byBtYWtlIHN1cmUgdGhlIG1vZGVsCisgICAgIGlzIGNvcnJlY3QuICAqLworICBmb3IoaW5zbl9tb2RlbF9wdHIgPSBmaWxlX2VudHJ5LT5tb2RlbF9maXJzdDsgaW5zbl9tb2RlbF9wdHI7IGluc25fbW9kZWxfcHRyID0gaW5zbl9tb2RlbF9wdHItPm5leHQpIHsKKyAgICBjaGFyICpuYW1lID0gaW5zbl9tb2RlbF9wdHItPmZpZWxkc1tpbnNuX21vZGVsX25hbWVdOworICAgIGludCBsZW4gPSBzdHJsZW4gKGluc25fbW9kZWxfcHRyLT5maWVsZHNbaW5zbl9tb2RlbF9maWVsZHNdKTsKKworICAgIHdoaWxlIChsZW4gPiAwICYmIGlzc3BhY2UoKmluc25fbW9kZWxfcHRyLT5maWVsZHNbaW5zbl9tb2RlbF9maWVsZHNdKSkgeworICAgICAgbGVuLS07CisgICAgICBpbnNuX21vZGVsX3B0ci0+ZmllbGRzW2luc25fbW9kZWxfZmllbGRzXSsrOworICAgIH0KKworICAgIGlmIChtYXhfbW9kZWxfZmllbGRzX2xlbiA8IGxlbikKKyAgICAgIG1heF9tb2RlbF9maWVsZHNfbGVuID0gbGVuOworCisgICAgZm9yKG1vZGVsX3B0ciA9IG1vZGVsczsgbW9kZWxfcHRyOyBtb2RlbF9wdHIgPSBtb2RlbF9wdHItPm5leHQpIHsKKyAgICAgIGlmIChzdHJjbXAobmFtZSwgbW9kZWxfcHRyLT5wcmludGFibGVfbmFtZSkgPT0gMCkgeworCisJLyogUmVwbGFjZSB0aGUgbmFtZSBmaWVsZCB3aXRoIHRoYXQgb2YgdGhlIGdsb2JhbCBtb2RlbCwgc28gdGhhdCB3aGVuIHdlCisJICAgd2FudCB0byBwcmludCBpdCBvdXQsIHdlIGNhbiBqdXN0IGNvbXBhcmUgcG9pbnRlcnMuICAqLworCWluc25fbW9kZWxfcHRyLT5maWVsZHNbaW5zbl9tb2RlbF9uYW1lXSA9IG1vZGVsX3B0ci0+cHJpbnRhYmxlX25hbWU7CisJYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFtb2RlbF9wdHIpCisgICAgICBlcnJvcigiJXM6JWQ6IG1hY2hpbmUgbW9kZWwgYCVzJyB3YXMgbm90IGtub3duIGFib3V0XG4iLAorCSAgICBmaWxlX2VudHJ5LT5maWxlX25hbWUsIGZpbGVfZW50cnktPmxpbmVfbnIsIG5hbWUpOworICB9CisKKyAgLyogaW5zZXJ0IGl0IGFjY29yZGluZyB0byB0aGUgb3JkZXIgb2YgdGhlIGZpZWxkcyAqLworICB3aGlsZSAoY3VyX2luc24gIT0gTlVMTAorCSAmJiBuZXdfaW5zbi0+ZmllbGRzLT52YWx1ZSA+PSBjdXJfaW5zbi0+ZmllbGRzLT52YWx1ZSkgeworICAgIHB0cl90b19jdXJfaW5zbiA9ICZjdXJfaW5zbi0+bmV4dDsKKyAgICBjdXJfaW5zbiA9ICpwdHJfdG9fY3VyX2luc247CisgIH0KKworICBuZXdfaW5zbi0+bmV4dCA9IGN1cl9pbnNuOworICAqcHRyX3RvX2N1cl9pbnNuID0gbmV3X2luc247CisKKyAgdGFibGUtPm5yX2luc24rKzsKK30KKworCisKK2luc25fdGFibGUgKgorbG9hZF9pbnNuX3RhYmxlKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKKwkJZGVjb2RlX3RhYmxlICpkZWNvZGVfcnVsZXMsCisJCWZpbHRlciAqZmlsdGVycykKK3sKKyAgdGFibGUgKmZpbGUgPSB0YWJsZV9vcGVuKGZpbGVfbmFtZSwgbnJfaW5zbl90YWJsZV9maWVsZHMsIG5yX2luc25fbW9kZWxfdGFibGVfZmllbGRzKTsKKyAgaW5zbl90YWJsZSAqdGFibGUgPSBaQUxMT0MoaW5zbl90YWJsZSk7CisgIHRhYmxlX2VudHJ5ICpmaWxlX2VudHJ5OworICB0YWJsZS0+b3Bjb2RlX3J1bGUgPSBkZWNvZGVfcnVsZXM7CisKKyAgd2hpbGUgKChmaWxlX2VudHJ5ID0gdGFibGVfZW50cnlfcmVhZChmaWxlKSkgIT0gTlVMTCkgeworICAgIGlmIChpdF9pcygiZnVuY3Rpb24iLCBmaWxlX2VudHJ5LT5maWVsZHNbaW5zbl9mbGFnc10pCisJfHwgaXRfaXMoImludGVybmFsIiwgZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fZmxhZ3NdKSkgeworICAgICAgaW5zbl90YWJsZV9pbnNlcnRfZnVuY3Rpb24odGFibGUsIGZpbGVfZW50cnkpOworICAgIH0KKyAgICBlbHNlIGlmIChpdF9pcygibW9kZWwiLCBmaWxlX2VudHJ5LT5maWVsZHNbaW5zbl9mbGFnc10pKSB7CisgICAgICBtb2RlbF90YWJsZV9pbnNlcnQodGFibGUsIGZpbGVfZW50cnkpOworICAgIH0KKyAgICBlbHNlIGlmIChpdF9pcygibW9kZWwtbWFjcm8iLCBmaWxlX2VudHJ5LT5maWVsZHNbaW5zbl9mbGFnc10pKSB7CisgICAgICBtb2RlbF90YWJsZV9pbnNlcnRfc3BlY2lmaWModGFibGUsIGZpbGVfZW50cnksICZtb2RlbF9tYWNyb3MsICZsYXN0X21vZGVsX21hY3JvKTsKKyAgICB9CisgICAgZWxzZSBpZiAoaXRfaXMoIm1vZGVsLWZ1bmN0aW9uIiwgZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fZmxhZ3NdKSkgeworICAgICAgbW9kZWxfdGFibGVfaW5zZXJ0X3NwZWNpZmljKHRhYmxlLCBmaWxlX2VudHJ5LCAmbW9kZWxfZnVuY3Rpb25zLCAmbGFzdF9tb2RlbF9mdW5jdGlvbik7CisgICAgfQorICAgIGVsc2UgaWYgKGl0X2lzKCJtb2RlbC1pbnRlcm5hbCIsIGZpbGVfZW50cnktPmZpZWxkc1tpbnNuX2ZsYWdzXSkpIHsKKyAgICAgIG1vZGVsX3RhYmxlX2luc2VydF9zcGVjaWZpYyh0YWJsZSwgZmlsZV9lbnRyeSwgJm1vZGVsX2ludGVybmFsLCAmbGFzdF9tb2RlbF9pbnRlcm5hbCk7CisgICAgfQorICAgIGVsc2UgaWYgKGl0X2lzKCJtb2RlbC1zdGF0aWMiLCBmaWxlX2VudHJ5LT5maWVsZHNbaW5zbl9mbGFnc10pKSB7CisgICAgICBtb2RlbF90YWJsZV9pbnNlcnRfc3BlY2lmaWModGFibGUsIGZpbGVfZW50cnksICZtb2RlbF9zdGF0aWMsICZsYXN0X21vZGVsX3N0YXRpYyk7CisgICAgfQorICAgIGVsc2UgaWYgKGl0X2lzKCJtb2RlbC1kYXRhIiwgZmlsZV9lbnRyeS0+ZmllbGRzW2luc25fZmxhZ3NdKSkgeworICAgICAgbW9kZWxfdGFibGVfaW5zZXJ0X3NwZWNpZmljKHRhYmxlLCBmaWxlX2VudHJ5LCAmbW9kZWxfZGF0YSwgJmxhc3RfbW9kZWxfZGF0YSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaW5zbl9maWVsZHMgKmZpZWxkczsKKyAgICAgIC8qIHNraXAgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlbid0IHJlbGV2YW50IHRvIHRoZSBtb2RlICovCisgICAgICBpZiAoaXNfZmlsdGVyZWRfb3V0KGZpbGVfZW50cnktPmZpZWxkc1tpbnNuX2ZsYWdzXSwgZmlsdGVycykpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIkRyb3BwaW5nICVzIC0gJXNcbiIsCisJCWZpbGVfZW50cnktPmZpZWxkc1tpbnNuX25hbWVdLAorCQlmaWxlX2VudHJ5LT5maWVsZHNbaW5zbl9mbGFnc10pOworICAgICAgfQorICAgICAgZWxzZSB7CisJLyogY3JlYXRlL2luc2VydCB0aGUgbmV3IGluc3RydWN0aW9uICovCisJZmllbGRzID0gcGFyc2VfaW5zbl9mb3JtYXQoZmlsZV9lbnRyeSwKKwkJCQkgICBmaWxlX2VudHJ5LT5maWVsZHNbaW5zbl9mb3JtYXRdKTsKKwlpbnNuX3RhYmxlX2luc2VydF9pbnNuKHRhYmxlLCBmaWxlX2VudHJ5LCBmaWVsZHMpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdGFibGU7Cit9CisKKworZXh0ZXJuIHZvaWQKK2luc25fdGFibGVfdHJhdmVyc2VfdHJlZShpbnNuX3RhYmxlICp0YWJsZSwKKwkJCSBsZiAqZmlsZSwKKwkJCSB2b2lkICpkYXRhLAorCQkJIGludCBkZXB0aCwKKwkJCSBsZWFmX2hhbmRsZXIgKnN0YXJ0LAorCQkJIGluc25faGFuZGxlciAqbGVhZiwKKwkJCSBsZWFmX2hhbmRsZXIgKmVuZCwKKwkJCSBwYWRkaW5nX2hhbmRsZXIgKnBhZGRpbmcpCit7CisgIGluc25fdGFibGUgKmVudHJ5OworICBpbnQgZW50cnlfbnI7CisgIAorICBBU1NFUlQodGFibGUgIT0gTlVMTAorCSAmJiB0YWJsZS0+b3Bjb2RlICE9IE5VTEwKKwkgJiYgdGFibGUtPm5yX2VudHJpZXMgPiAwCisJICYmIHRhYmxlLT5lbnRyaWVzICE9IDApOworCisgIGlmIChzdGFydCAhPSBOVUxMICYmIGRlcHRoID49IDApCisgICAgc3RhcnQodGFibGUsIGZpbGUsIGRhdGEsIGRlcHRoKTsKKworICBmb3IgKGVudHJ5X25yID0gMCwgZW50cnkgPSB0YWJsZS0+ZW50cmllczsKKyAgICAgICBlbnRyeV9uciA8ICh0YWJsZS0+b3Bjb2RlLT5pc19ib29sZWFuCisJCSAgID8gMgorCQkgICA6ICgxIDw8ICh0YWJsZS0+b3Bjb2RlLT5sYXN0IC0gdGFibGUtPm9wY29kZS0+Zmlyc3QgKyAxKSkpOworICAgICAgIGVudHJ5X25yICsrKSB7CisgICAgaWYgKGVudHJ5ID09IE5VTEwKKwl8fCAoIXRhYmxlLT5vcGNvZGUtPmlzX2Jvb2xlYW4KKwkgICAgJiYgZW50cnlfbnIgPCBlbnRyeS0+b3Bjb2RlX25yKSkgeworICAgICAgaWYgKHBhZGRpbmcgIT0gTlVMTCAmJiBkZXB0aCA+PSAwKQorCXBhZGRpbmcodGFibGUsIGZpbGUsIGRhdGEsIGRlcHRoLCBlbnRyeV9ucik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgQVNTRVJUKGVudHJ5ICE9IE5VTEwgJiYgKGVudHJ5LT5vcGNvZGVfbnIgPT0gZW50cnlfbnIKKwkJCSAgICAgICB8fCB0YWJsZS0+b3Bjb2RlLT5pc19ib29sZWFuKSk7CisgICAgICBpZiAoZW50cnktPm9wY29kZSAhPSBOVUxMICYmIGRlcHRoICE9IDApIHsKKwlpbnNuX3RhYmxlX3RyYXZlcnNlX3RyZWUoZW50cnksIGZpbGUsIGRhdGEsIGRlcHRoKzEsCisJCQkJIHN0YXJ0LCBsZWFmLCBlbmQsIHBhZGRpbmcpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoZGVwdGggPj0gMCkgeworCWlmIChsZWFmICE9IE5VTEwpCisJICBsZWFmKGVudHJ5LCBmaWxlLCBkYXRhLCBlbnRyeS0+aW5zbnMsIGRlcHRoKTsKKyAgICAgIH0KKyAgICAgIGVudHJ5ID0gZW50cnktPnNpYmxpbmc7CisgICAgfQorICB9CisgIGlmIChlbmQgIT0gTlVMTCAmJiBkZXB0aCA+PSAwKQorICAgIGVuZCh0YWJsZSwgZmlsZSwgZGF0YSwgZGVwdGgpOworfQorCisKK2V4dGVybiB2b2lkCitpbnNuX3RhYmxlX3RyYXZlcnNlX2Z1bmN0aW9uKGluc25fdGFibGUgKnRhYmxlLAorCQkJICAgICBsZiAqZmlsZSwKKwkJCSAgICAgdm9pZCAqZGF0YSwKKwkJCSAgICAgZnVuY3Rpb25faGFuZGxlciAqbGVhZikKK3sKKyAgaW5zbiAqZnVuY3Rpb247CisgIGZvciAoZnVuY3Rpb24gPSB0YWJsZS0+ZnVuY3Rpb25zOworICAgICAgIGZ1bmN0aW9uICE9IE5VTEw7CisgICAgICAgZnVuY3Rpb24gPSBmdW5jdGlvbi0+bmV4dCkgeworICAgIGxlYWYodGFibGUsIGZpbGUsIGRhdGEsIGZ1bmN0aW9uLT5maWxlX2VudHJ5KTsKKyAgfQorfQorCitleHRlcm4gdm9pZAoraW5zbl90YWJsZV90cmF2ZXJzZV9pbnNuKGluc25fdGFibGUgKnRhYmxlLAorCQkJIGxmICpmaWxlLAorCQkJIHZvaWQgKmRhdGEsCisJCQkgaW5zbl9oYW5kbGVyICpoYW5kbGVyKQoreworICBpbnNuICppbnN0cnVjdGlvbjsKKyAgZm9yIChpbnN0cnVjdGlvbiA9IHRhYmxlLT5pbnNuczsKKyAgICAgICBpbnN0cnVjdGlvbiAhPSBOVUxMOworICAgICAgIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24tPm5leHQpIHsKKyAgICBoYW5kbGVyKHRhYmxlLCBmaWxlLCBkYXRhLCBpbnN0cnVjdGlvbiwgMCk7CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgZmllbGRfY29uc3RhbnRfaW50ID0gMSwKKyAgZmllbGRfY29uc3RhbnRfc2xhc2ggPSAyLAorICBmaWVsZF9jb25zdGFudF9zdHJpbmcgPSAzCit9IGNvbnN0YW50X2ZpZWxkX3R5cGVzOworCisKK3N0YXRpYyBpbnQKK2luc25fZmllbGRfaXNfY29uc3RhbnQoaW5zbl9maWVsZCAqZmllbGQsCisJCSAgICAgICBkZWNvZGVfdGFibGUgKnJ1bGUpCit7CisgIC8qIGZpZWxkIGlzIGFuIGludGVnZXIgKi8KKyAgaWYgKGZpZWxkLT5pc19pbnQpCisgICAgcmV0dXJuIGZpZWxkX2NvbnN0YW50X2ludDsKKyAgLyogZmllbGQgaXMgYC8nIGFuZCB0cmVhdGluZyB0aGF0IGFzIGEgY29uc3RhbnQgKi8KKyAgaWYgKGZpZWxkLT5pc19zbGFzaCAmJiBydWxlLT5mb3JjZV9zbGFzaCkKKyAgICByZXR1cm4gZmllbGRfY29uc3RhbnRfc2xhc2g7CisgIC8qIGZpZWxkLCB0aG91Z2ggdmFyaWFibGUgaXMgb24gdGhlIGxpc3QgKi8KKyAgaWYgKGZpZWxkLT5pc19zdHJpbmcgJiYgcnVsZS0+Zm9yY2VfZXhwYW5zaW9uICE9IE5VTEwpIHsKKyAgICBjaGFyICpmb3JjZWRfZmllbGRzID0gcnVsZS0+Zm9yY2VfZXhwYW5zaW9uOworICAgIHdoaWxlICgqZm9yY2VkX2ZpZWxkcyAhPSAnXDAnKSB7CisgICAgICBpbnQgZmllbGRfbGVuOworICAgICAgY2hhciAqZW5kID0gc3RyY2hyKGZvcmNlZF9maWVsZHMsICcsJyk7CisgICAgICBpZiAoZW5kID09IE5VTEwpCisJZmllbGRfbGVuID0gc3RybGVuKGZvcmNlZF9maWVsZHMpOworICAgICAgZWxzZQorCWZpZWxkX2xlbiA9IGVuZC1mb3JjZWRfZmllbGRzOworICAgICAgaWYgKHN0cm5jbXAoZm9yY2VkX2ZpZWxkcywgZmllbGQtPnZhbF9zdHJpbmcsIGZpZWxkX2xlbikgPT0gMAorCSAgJiYgZmllbGQtPnZhbF9zdHJpbmdbZmllbGRfbGVuXSA9PSAnXDAnKQorCXJldHVybiBmaWVsZF9jb25zdGFudF9zdHJpbmc7CisgICAgICBmb3JjZWRfZmllbGRzICs9IGZpZWxkX2xlbjsKKyAgICAgIGlmICgqZm9yY2VkX2ZpZWxkcyA9PSAnLCcpCisJZm9yY2VkX2ZpZWxkcysrOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgb3Bjb2RlX2ZpZWxkICoKK2luc25fdGFibGVfZmluZF9vcGNvZGVfZmllbGQoaW5zbiAqaW5zbnMsCisJCQkgICAgIGRlY29kZV90YWJsZSAqcnVsZSwKKwkJCSAgICAgaW50IHN0cmluZ19vbmx5KQoreworICBvcGNvZGVfZmllbGQgKmN1cnJfb3Bjb2RlID0gWkFMTE9DKG9wY29kZV9maWVsZCk7CisgIGluc24gKmVudHJ5OworICBBU1NFUlQocnVsZSk7CisKKyAgY3Vycl9vcGNvZGUtPmZpcnN0ID0gaW5zbl9iaXRfc2l6ZTsKKyAgY3Vycl9vcGNvZGUtPmxhc3QgPSAtMTsKKyAgZm9yIChlbnRyeSA9IGluc25zOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KSB7CisgICAgaW5zbl9maWVsZHMgKmZpZWxkcyA9IGVudHJ5LT5maWVsZHM7CisgICAgb3Bjb2RlX2ZpZWxkIG5ld19vcGNvZGU7CisKKyAgICAvKiBmaW5kIGEgc3RhcnQgcG9pbnQgZm9yIHRoZSBvcGNvZGUgZmllbGQgKi8KKyAgICBuZXdfb3Bjb2RlLmZpcnN0ID0gcnVsZS0+Zmlyc3Q7CisgICAgd2hpbGUgKG5ld19vcGNvZGUuZmlyc3QgPD0gcnVsZS0+bGFzdAorCSAgICYmICghc3RyaW5nX29ubHkKKwkgICAgICAgfHwgaW5zbl9maWVsZF9pc19jb25zdGFudChmaWVsZHMtPmJpdHNbbmV3X29wY29kZS5maXJzdF0sCisJCQkJCSBydWxlKSAhPSBmaWVsZF9jb25zdGFudF9zdHJpbmcpCisJICAgJiYgKHN0cmluZ19vbmx5CisJICAgICAgIHx8ICFpbnNuX2ZpZWxkX2lzX2NvbnN0YW50KGZpZWxkcy0+Yml0c1tuZXdfb3Bjb2RlLmZpcnN0XSwKKwkJCQkJICBydWxlKSkpCisgICAgICBuZXdfb3Bjb2RlLmZpcnN0ID0gZmllbGRzLT5iaXRzW25ld19vcGNvZGUuZmlyc3RdLT5sYXN0ICsgMTsKKyAgICBBU1NFUlQobmV3X29wY29kZS5maXJzdCA+IHJ1bGUtPmxhc3QKKwkgICB8fCAoc3RyaW5nX29ubHkKKwkgICAgICAgJiYgaW5zbl9maWVsZF9pc19jb25zdGFudChmaWVsZHMtPmJpdHNbbmV3X29wY29kZS5maXJzdF0sCisJCQkJCSBydWxlKSA9PSBmaWVsZF9jb25zdGFudF9zdHJpbmcpCisJICAgfHwgKCFzdHJpbmdfb25seQorCSAgICAgICAmJiBpbnNuX2ZpZWxkX2lzX2NvbnN0YW50KGZpZWxkcy0+Yml0c1tuZXdfb3Bjb2RlLmZpcnN0XSwKKwkJCQkJIHJ1bGUpKSk7CisgIAorICAgIC8qIGZpbmQgdGhlIGVuZCBwb2ludCBmb3IgdGhlIG9wY29kZSBmaWVsZCAqLworICAgIG5ld19vcGNvZGUubGFzdCA9IHJ1bGUtPmxhc3Q7CisgICAgd2hpbGUgKG5ld19vcGNvZGUubGFzdCA+PSBydWxlLT5maXJzdAorCSAgICYmICghc3RyaW5nX29ubHkKKwkgICAgICAgfHwgaW5zbl9maWVsZF9pc19jb25zdGFudChmaWVsZHMtPmJpdHNbbmV3X29wY29kZS5sYXN0XSwKKwkJCQkJIHJ1bGUpICE9IGZpZWxkX2NvbnN0YW50X3N0cmluZykKKwkgICAmJiAoc3RyaW5nX29ubHkKKwkgICAgICAgfHwgIWluc25fZmllbGRfaXNfY29uc3RhbnQoZmllbGRzLT5iaXRzW25ld19vcGNvZGUubGFzdF0sCisJCQkJCSAgcnVsZSkpKQorICAgICAgbmV3X29wY29kZS5sYXN0ID0gZmllbGRzLT5iaXRzW25ld19vcGNvZGUubGFzdF0tPmZpcnN0IC0gMTsKKyAgICBBU1NFUlQobmV3X29wY29kZS5sYXN0IDwgcnVsZS0+Zmlyc3QKKwkgICB8fCAoc3RyaW5nX29ubHkKKwkgICAgICAgJiYgaW5zbl9maWVsZF9pc19jb25zdGFudChmaWVsZHMtPmJpdHNbbmV3X29wY29kZS5sYXN0XSwKKwkJCQkJIHJ1bGUpID09IGZpZWxkX2NvbnN0YW50X3N0cmluZykKKwkgICB8fCAoIXN0cmluZ19vbmx5CisJICAgICAgICYmIGluc25fZmllbGRfaXNfY29uc3RhbnQoZmllbGRzLT5iaXRzW25ld19vcGNvZGUubGFzdF0sCisJCQkJCSBydWxlKSkpOworCisgICAgLyogbm93IHNlZSBpZiBvdXIgY3VycmVudCBvcGNvZGUgbmVlZHMgZXhwYW5kaW5nICovCisgICAgaWYgKG5ld19vcGNvZGUuZmlyc3QgPD0gcnVsZS0+bGFzdAorCSYmIGN1cnJfb3Bjb2RlLT5maXJzdCA+IG5ld19vcGNvZGUuZmlyc3QpCisgICAgICBjdXJyX29wY29kZS0+Zmlyc3QgPSBuZXdfb3Bjb2RlLmZpcnN0OworICAgIGlmIChuZXdfb3Bjb2RlLmxhc3QgPj0gcnVsZS0+Zmlyc3QKKwkmJiBjdXJyX29wY29kZS0+bGFzdCA8IG5ld19vcGNvZGUubGFzdCkKKyAgICAgIGN1cnJfb3Bjb2RlLT5sYXN0ID0gbmV3X29wY29kZS5sYXN0OworICAgIAorICB9CisKKyAgLyogd2FzIGFueSB0aGluZyBpbnRlcmVzdGluZyBmb3VuZD8gKi8KKyAgaWYgKGN1cnJfb3Bjb2RlLT5maXJzdCA+IHJ1bGUtPmxhc3QpIHsKKyAgICBBU1NFUlQoY3Vycl9vcGNvZGUtPmxhc3QgPCBydWxlLT5maXJzdCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQVNTRVJUKGN1cnJfb3Bjb2RlLT5sYXN0ID49IHJ1bGUtPmZpcnN0KTsKKyAgQVNTRVJUKGN1cnJfb3Bjb2RlLT5maXJzdCA8PSBydWxlLT5sYXN0KTsKKworICAvKiBpZiBzb21ldGhpbmcgd2FzIGZvdW5kLCBjaGVjayBpdCBpbmNsdWRlcyB0aGUgZm9yY2VkIGZpZWxkIHJhbmdlICovCisgIGlmICghc3RyaW5nX29ubHkKKyAgICAgICYmIGN1cnJfb3Bjb2RlLT5maXJzdCA+IHJ1bGUtPmZvcmNlX2ZpcnN0KSB7CisgICAgY3Vycl9vcGNvZGUtPmZpcnN0ID0gcnVsZS0+Zm9yY2VfZmlyc3Q7CisgIH0KKyAgaWYgKCFzdHJpbmdfb25seQorICAgICAgJiYgY3Vycl9vcGNvZGUtPmxhc3QgPCBydWxlLT5mb3JjZV9sYXN0KSB7CisgICAgY3Vycl9vcGNvZGUtPmxhc3QgPSBydWxlLT5mb3JjZV9sYXN0OworICB9CisgIC8qIGhhbmRsZSBzcGVjaWFsIGNhc2UgZWxtaW5hdGluZyBhbnkgbmVlZCB0byBkbyBzaGlmdCBhZnRlciBtYXNrICovCisgIGlmIChzdHJpbmdfb25seQorICAgICAgJiYgcnVsZS0+Zm9yY2VfbGFzdCA9PSBpbnNuX2JpdF9zaXplLTEpIHsKKyAgICBjdXJyX29wY29kZS0+bGFzdCA9IGluc25fYml0X3NpemUtMTsKKyAgfQorCisgIC8qIGhhbmRsZSBhbnkgc3BlY2lhbCBjYXNlcyAqLworICBzd2l0Y2ggKHJ1bGUtPnR5cGUpIHsKKyAgY2FzZSBub3JtYWxfZGVjb2RlX3J1bGU6CisgICAgLyogbGV0IHRoZSBhYm92ZSBhcHBseSAqLworICAgIGJyZWFrOworICBjYXNlIGV4cGFuZF9mb3JjZWRfcnVsZToKKyAgICAvKiBleHBhbmQgYSBsaW1pdGVkIG5yIG9mIGJpdHMsIGlnbm9yaW5nIHRoZSByZXN0ICovCisgICAgY3Vycl9vcGNvZGUtPmZpcnN0ID0gcnVsZS0+Zm9yY2VfZmlyc3Q7CisgICAgY3Vycl9vcGNvZGUtPmxhc3QgPSBydWxlLT5mb3JjZV9sYXN0OworICAgIGJyZWFrOworICBjYXNlIGJvb2xlYW5fcnVsZToKKyAgICBjdXJyX29wY29kZS0+aXNfYm9vbGVhbiA9IDE7CisgICAgY3Vycl9vcGNvZGUtPmJvb2xlYW5fY29uc3RhbnQgPSBydWxlLT5zcGVjaWFsX2NvbnN0YW50OworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGVycm9yKCJTb21ldGhpbmcgaXMgZ29pbmcgd3JvbmdcbiIpOworICB9CisKKyAgcmV0dXJuIGN1cnJfb3Bjb2RlOworfQorCisKK3N0YXRpYyB2b2lkCitpbnNuX3RhYmxlX2luc2VydF9leHBhbmRlZChpbnNuX3RhYmxlICp0YWJsZSwKKwkJCSAgIGluc24gKm9sZF9pbnNuLAorCQkJICAgaW50IG5ld19vcGNvZGVfbnIsCisJCQkgICBpbnNuX2JpdHMgKm5ld19iaXRzKQoreworICBpbnNuX3RhYmxlICoqcHRyX3RvX2N1cl9lbnRyeSA9ICZ0YWJsZS0+ZW50cmllczsKKyAgaW5zbl90YWJsZSAqY3VyX2VudHJ5ID0gKnB0cl90b19jdXJfZW50cnk7CisKKyAgLyogZmluZCB0aGUgbmV3IHRhYmxlIGZvciB0aGlzIGVudHJ5ICovCisgIHdoaWxlIChjdXJfZW50cnkgIT0gTlVMTAorCSAmJiBjdXJfZW50cnktPm9wY29kZV9uciA8IG5ld19vcGNvZGVfbnIpIHsKKyAgICBwdHJfdG9fY3VyX2VudHJ5ID0gJmN1cl9lbnRyeS0+c2libGluZzsKKyAgICBjdXJfZW50cnkgPSAqcHRyX3RvX2N1cl9lbnRyeTsKKyAgfQorCisgIGlmIChjdXJfZW50cnkgPT0gTlVMTCB8fCBjdXJfZW50cnktPm9wY29kZV9uciAhPSBuZXdfb3Bjb2RlX25yKSB7CisgICAgaW5zbl90YWJsZSAqbmV3X2VudHJ5ID0gWkFMTE9DKGluc25fdGFibGUpOworICAgIG5ld19lbnRyeS0+b3Bjb2RlX25yID0gbmV3X29wY29kZV9ucjsKKyAgICBuZXdfZW50cnktPmV4cGFuZGVkX2JpdHMgPSBuZXdfYml0czsKKyAgICBuZXdfZW50cnktPm9wY29kZV9ydWxlID0gdGFibGUtPm9wY29kZV9ydWxlLT5uZXh0OworICAgIG5ld19lbnRyeS0+c2libGluZyA9IGN1cl9lbnRyeTsKKyAgICBuZXdfZW50cnktPnBhcmVudCA9IHRhYmxlOworICAgICpwdHJfdG9fY3VyX2VudHJ5ID0gbmV3X2VudHJ5OworICAgIGN1cl9lbnRyeSA9IG5ld19lbnRyeTsKKyAgICB0YWJsZS0+bnJfZW50cmllcysrOworICB9CisgIC8qIEFTU0VSVCBuZXdfYml0cyA9PSBjdXJfZW50cnkgYml0cyAqLworICBBU1NFUlQoY3VyX2VudHJ5ICE9IE5VTEwgJiYgY3VyX2VudHJ5LT5vcGNvZGVfbnIgPT0gbmV3X29wY29kZV9ucik7CisgIGluc25fdGFibGVfaW5zZXJ0X2luc24oY3VyX2VudHJ5LAorCQkJIG9sZF9pbnNuLT5maWxlX2VudHJ5LAorCQkJIG9sZF9pbnNuLT5maWVsZHMpOworfQorCitzdGF0aWMgdm9pZAoraW5zbl90YWJsZV9leHBhbmRfb3Bjb2RlKGluc25fdGFibGUgKnRhYmxlLAorCQkJIGluc24gKmluc3RydWN0aW9uLAorCQkJIGludCBmaWVsZF9uciwKKwkJCSBpbnQgb3Bjb2RlX25yLAorCQkJIGluc25fYml0cyAqYml0cykKK3sKKworICBpZiAoZmllbGRfbnIgPiB0YWJsZS0+b3Bjb2RlLT5sYXN0KSB7CisgICAgaW5zbl90YWJsZV9pbnNlcnRfZXhwYW5kZWQodGFibGUsIGluc3RydWN0aW9uLCBvcGNvZGVfbnIsIGJpdHMpOworICB9CisgIGVsc2UgeworICAgIGluc25fZmllbGQgKmZpZWxkID0gaW5zdHJ1Y3Rpb24tPmZpZWxkcy0+Yml0c1tmaWVsZF9ucl07CisgICAgaWYgKGZpZWxkLT5pc19pbnQgfHwgZmllbGQtPmlzX3NsYXNoKSB7CisgICAgICBBU1NFUlQoZmllbGQtPmZpcnN0ID49IHRhYmxlLT5vcGNvZGUtPmZpcnN0CisJICAgICAmJiBmaWVsZC0+bGFzdCA8PSB0YWJsZS0+b3Bjb2RlLT5sYXN0KTsKKyAgICAgIGluc25fdGFibGVfZXhwYW5kX29wY29kZSh0YWJsZSwgaW5zdHJ1Y3Rpb24sIGZpZWxkLT5sYXN0KzEsCisJCQkgICAgICAgKChvcGNvZGVfbnIgPDwgZmllbGQtPndpZHRoKSArIGZpZWxkLT52YWxfaW50KSwKKwkJCSAgICAgICBiaXRzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpbnQgdmFsOworICAgICAgaW50IGxhc3RfcG9zID0gKChmaWVsZC0+bGFzdCA8IHRhYmxlLT5vcGNvZGUtPmxhc3QpCisJCQk/IGZpZWxkLT5sYXN0IDogdGFibGUtPm9wY29kZS0+bGFzdCk7CisgICAgICBpbnQgZmlyc3RfcG9zID0gKChmaWVsZC0+Zmlyc3QgPiB0YWJsZS0+b3Bjb2RlLT5maXJzdCkKKwkJCSA/IGZpZWxkLT5maXJzdCA6IHRhYmxlLT5vcGNvZGUtPmZpcnN0KTsKKyAgICAgIGludCB3aWR0aCA9IGxhc3RfcG9zIC0gZmlyc3RfcG9zICsgMTsKKyAgICAgIGludCBsYXN0X3ZhbCA9ICh0YWJsZS0+b3Bjb2RlLT5pc19ib29sZWFuCisJCSAgICAgID8gMiA6ICgxIDw8IHdpZHRoKSk7CisgICAgICBmb3IgKHZhbCA9IDA7IHZhbCA8IGxhc3RfdmFsOyB2YWwrKykgeworCWluc25fYml0cyAqbmV3X2JpdHMgPSBaQUxMT0MoaW5zbl9iaXRzKTsKKwluZXdfYml0cy0+ZmllbGQgPSBmaWVsZDsKKwluZXdfYml0cy0+dmFsdWUgPSB2YWw7CisJbmV3X2JpdHMtPmxhc3QgPSBiaXRzOworCW5ld19iaXRzLT5vcGNvZGUgPSB0YWJsZS0+b3Bjb2RlOworCWluc25fdGFibGVfZXhwYW5kX29wY29kZSh0YWJsZSwgaW5zdHJ1Y3Rpb24sIGxhc3RfcG9zKzEsCisJCQkJICgob3Bjb2RlX25yIDw8IHdpZHRoKSB8IHZhbCksCisJCQkJIG5ld19iaXRzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2luc25fdGFibGVfaW5zZXJ0X2V4cGFuZGluZyhpbnNuX3RhYmxlICp0YWJsZSwKKwkJCSAgICBpbnNuICplbnRyeSkKK3sKKyAgaW5zbl90YWJsZV9leHBhbmRfb3Bjb2RlKHRhYmxlLAorCQkJICAgZW50cnksCisJCQkgICB0YWJsZS0+b3Bjb2RlLT5maXJzdCwKKwkJCSAgIDAsCisJCQkgICB0YWJsZS0+ZXhwYW5kZWRfYml0cyk7Cit9CisKKworZXh0ZXJuIHZvaWQKK2luc25fdGFibGVfZXhwYW5kX2luc25zKGluc25fdGFibGUgKnRhYmxlKQoreworCisgIEFTU0VSVCh0YWJsZS0+bnJfaW5zbiA+PSAxKTsKKworICAvKiBkZXRlcm1pbmUgYSB2YWxpZCBvcGNvZGUgKi8KKyAgd2hpbGUgKHRhYmxlLT5vcGNvZGVfcnVsZSkgeworICAgIC8qIHNwZWNpYWxzIG9ubHkgZm9yIHNpbmdsZSBpbnN0cnVjdGlvbnMgKi8KKyAgICBpZiAoKHRhYmxlLT5ucl9pbnNuID4gMQorCSAmJiB0YWJsZS0+b3Bjb2RlX3J1bGUtPnNwZWNpYWxfbWFzayA9PSAwCisJICYmIHRhYmxlLT5vcGNvZGVfcnVsZS0+dHlwZSA9PSBub3JtYWxfZGVjb2RlX3J1bGUpCisJfHwgKHRhYmxlLT5ucl9pbnNuID09IDEKKwkgICAgJiYgdGFibGUtPm9wY29kZV9ydWxlLT5zcGVjaWFsX21hc2sgIT0gMAorCSAgICAmJiAoKHRhYmxlLT5pbnNucy0+ZmllbGRzLT52YWx1ZQorCQkgJiB0YWJsZS0+b3Bjb2RlX3J1bGUtPnNwZWNpYWxfbWFzaykKKwkJPT0gdGFibGUtPm9wY29kZV9ydWxlLT5zcGVjaWFsX3ZhbHVlKSkKKwl8fCAoZ2VuZXJhdGVfZXhwYW5kZWRfaW5zdHJ1Y3Rpb25zCisJICAgICYmIHRhYmxlLT5vcGNvZGVfcnVsZS0+c3BlY2lhbF9tYXNrID09IDAKKwkgICAgJiYgdGFibGUtPm9wY29kZV9ydWxlLT50eXBlID09IG5vcm1hbF9kZWNvZGVfcnVsZSkpCisgICAgICB0YWJsZS0+b3Bjb2RlID0KKwlpbnNuX3RhYmxlX2ZpbmRfb3Bjb2RlX2ZpZWxkKHRhYmxlLT5pbnNucywKKwkJCQkgICAgIHRhYmxlLT5vcGNvZGVfcnVsZSwKKwkJCQkgICAgIHRhYmxlLT5ucl9pbnNuID09IDEvKnN0cmluZyovCisJCQkJICAgICApOworICAgIGlmICh0YWJsZS0+b3Bjb2RlICE9IE5VTEwpCisgICAgICBicmVhazsKKyAgICB0YWJsZS0+b3Bjb2RlX3J1bGUgPSB0YWJsZS0+b3Bjb2RlX3J1bGUtPm5leHQ7CisgIH0KKworICAvKiBkaWQgd2UgZmluZCBhbnl0aGluZyAqLworICBpZiAodGFibGUtPm9wY29kZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIEFTU0VSVCh0YWJsZS0+b3Bjb2RlICE9IE5VTEwpOworCisgIC8qIGJhY2sgbGluayB3aGF0IHdlIGZvdW5kIHRvIGl0cyBwYXJlbnQgKi8KKyAgaWYgKHRhYmxlLT5wYXJlbnQgIT0gTlVMTCkgeworICAgIEFTU0VSVCh0YWJsZS0+cGFyZW50LT5vcGNvZGUgIT0gTlVMTCk7CisgICAgdGFibGUtPm9wY29kZS0+cGFyZW50ID0gdGFibGUtPnBhcmVudC0+b3Bjb2RlOworICB9CisKKyAgLyogZXhwYW5kIHRoZSByYXcgaW5zdHJ1Y3Rpb25zIGFjY29yZGluZyB0byB0aGUgb3Bjb2RlICovCisgIHsKKyAgICBpbnNuICplbnRyeTsKKyAgICBmb3IgKGVudHJ5ID0gdGFibGUtPmluc25zOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KSB7CisgICAgICBpbnNuX3RhYmxlX2luc2VydF9leHBhbmRpbmcodGFibGUsIGVudHJ5KTsKKyAgICB9CisgIH0KKworICAvKiBhbmQgZG8gdGhlIHNhbWUgZm9yIHRoZSBzdWIgZW50cmllcyAqLworICB7CisgICAgaW5zbl90YWJsZSAqZW50cnk7CisgICAgZm9yIChlbnRyeSA9IHRhYmxlLT5lbnRyaWVzOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9ICBlbnRyeS0+c2libGluZykgeworICAgICAgaW5zbl90YWJsZV9leHBhbmRfaW5zbnMoZW50cnkpOworICAgIH0KKyAgfQorfQorCisKKworCisjaWZkZWYgTUFJTgorCitzdGF0aWMgdm9pZAorZHVtcF9pbnNuX2ZpZWxkKGluc25fZmllbGQgKmZpZWxkLAorCQlpbnQgaW5kZW50KQoreworCisgIHByaW50ZigiKGluc25fZmllbGQqKTB4JXhcbiIsICh1bnNpZ25lZClmaWVsZCk7CisKKyAgZHVtcGYoaW5kZW50LCAiKGZpcnN0ICVkKVxuIiwgZmllbGQtPmZpcnN0KTsKKworICBkdW1wZihpbmRlbnQsICIobGFzdCAlZClcbiIsIGZpZWxkLT5sYXN0KTsKKworICBkdW1wZihpbmRlbnQsICIod2lkdGggJWQpXG4iLCBmaWVsZC0+d2lkdGgpOworCisgIGlmIChmaWVsZC0+aXNfaW50KQorICAgIGR1bXBmKGluZGVudCwgIihpc19pbnQgJWQpXG4iLCBmaWVsZC0+dmFsX2ludCk7CisKKyAgaWYgKGZpZWxkLT5pc19zbGFzaCkKKyAgICBkdW1wZihpbmRlbnQsICIoaXNfc2xhc2gpXG4iKTsKKworICBpZiAoZmllbGQtPmlzX3N0cmluZykKKyAgICBkdW1wZihpbmRlbnQsICIoaXNfc3RyaW5nIGAlcycpXG4iLCBmaWVsZC0+dmFsX3N0cmluZyk7CisgIAorICBkdW1wZihpbmRlbnQsICIobmV4dCAweCV4KVxuIiwgZmllbGQtPm5leHQpOworICAKKyAgZHVtcGYoaW5kZW50LCAiKHByZXYgMHgleClcbiIsIGZpZWxkLT5wcmV2KTsKKyAgCisKK30KKworc3RhdGljIHZvaWQKK2R1bXBfaW5zbl9maWVsZHMoaW5zbl9maWVsZHMgKmZpZWxkcywKKwkJIGludCBpbmRlbnQpCit7CisgIGludCBpOworCisgIHByaW50ZigiKGluc25fZmllbGRzKiklcFxuIiwgZmllbGRzKTsKKworICBkdW1wZihpbmRlbnQsICIoZmlyc3QgMHgleClcbiIsIGZpZWxkcy0+Zmlyc3QpOworICBkdW1wZihpbmRlbnQsICIobGFzdCAweCV4KVxuIiwgZmllbGRzLT5sYXN0KTsKKworICBkdW1wZihpbmRlbnQsICIodmFsdWUgMHgleClcbiIsIGZpZWxkcy0+dmFsdWUpOworCisgIGZvciAoaSA9IDA7IGkgPCBpbnNuX2JpdF9zaXplOyBpKyspIHsKKyAgICBkdW1wZihpbmRlbnQsICIoYml0c1slZF0gIiwgaSwgZmllbGRzLT5iaXRzW2ldKTsKKyAgICBkdW1wX2luc25fZmllbGQoZmllbGRzLT5iaXRzW2ldLCBpbmRlbnQrMSk7CisgICAgZHVtcGYoaW5kZW50LCAiIClcbiIpOworICB9CisKK30KKworCitzdGF0aWMgdm9pZAorZHVtcF9vcGNvZGVfZmllbGQob3Bjb2RlX2ZpZWxkICpmaWVsZCwgaW50IGluZGVudCwgaW50IGxldmVscykKK3sKKyAgcHJpbnRmKCIob3Bjb2RlX2ZpZWxkKiklcFxuIiwgZmllbGQpOworICBpZiAobGV2ZWxzICYmIGZpZWxkICE9IE5VTEwpIHsKKyAgICBkdW1wZihpbmRlbnQsICIoZmlyc3QgJWQpXG4iLCBmaWVsZC0+Zmlyc3QpOworICAgIGR1bXBmKGluZGVudCwgIihsYXN0ICVkKVxuIiwgZmllbGQtPmxhc3QpOworICAgIGR1bXBmKGluZGVudCwgIihpc19ib29sZWFuICVkKVxuIiwgZmllbGQtPmlzX2Jvb2xlYW4pOworICAgIGR1bXBmKGluZGVudCwgIihwYXJlbnQgIik7CisgICAgZHVtcF9vcGNvZGVfZmllbGQoZmllbGQtPnBhcmVudCwgaW5kZW50LCBsZXZlbHMtMSk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAorZHVtcF9pbnNuX2JpdHMoaW5zbl9iaXRzICpiaXRzLCBpbnQgaW5kZW50LCBpbnQgbGV2ZWxzKQoreworICBwcmludGYoIihpbnNuX2JpdHMqKSVwXG4iLCBiaXRzKTsKKworICBpZiAobGV2ZWxzICYmIGJpdHMgIT0gTlVMTCkgeworICAgIGR1bXBmKGluZGVudCwgIih2YWx1ZSAlZClcbiIsIGJpdHMtPnZhbHVlKTsKKyAgICBkdW1wZihpbmRlbnQsICIob3Bjb2RlICIpOworICAgIGR1bXBfb3Bjb2RlX2ZpZWxkKGJpdHMtPm9wY29kZSwgaW5kZW50KzEsIDApOworICAgIGR1bXBmKGluZGVudCwgIiApXG4iKTsKKyAgICBkdW1wZihpbmRlbnQsICIoZmllbGQgIik7CisgICAgZHVtcF9pbnNuX2ZpZWxkKGJpdHMtPmZpZWxkLCBpbmRlbnQrMSk7CisgICAgZHVtcGYoaW5kZW50LCAiIClcbiIpOworICAgIGR1bXBmKGluZGVudCwgIihsYXN0ICIpOworICAgIGR1bXBfaW5zbl9iaXRzKGJpdHMtPmxhc3QsIGluZGVudCsxLCBsZXZlbHMtMSk7CisgIH0KK30KKworCisKK3N0YXRpYyB2b2lkCitkdW1wX2luc24oaW5zbiAqZW50cnksIGludCBpbmRlbnQsIGludCBsZXZlbHMpCit7CisgIHByaW50ZigiKGluc24qKSVwXG4iLCBlbnRyeSk7CisKKyAgaWYgKGxldmVscyAmJiBlbnRyeSAhPSBOVUxMKSB7CisKKyAgICBkdW1wZihpbmRlbnQsICIoZmlsZV9lbnRyeSAiKTsKKyAgICBkdW1wX3RhYmxlX2VudHJ5KGVudHJ5LT5maWxlX2VudHJ5LCBpbmRlbnQrMSk7CisgICAgZHVtcGYoaW5kZW50LCAiIClcbiIpOworCisgICAgZHVtcGYoaW5kZW50LCAiKGZpZWxkcyAiKTsKKyAgICBkdW1wX2luc25fZmllbGRzKGVudHJ5LT5maWVsZHMsIGluZGVudCsxKTsKKyAgICBkdW1wZihpbmRlbnQsICIgKVxuIik7CisKKyAgICBkdW1wZihpbmRlbnQsICIobmV4dCAiKTsKKyAgICBkdW1wX2luc24oZW50cnktPm5leHQsIGluZGVudCsxLCBsZXZlbHMtMSk7CisgICAgZHVtcGYoaW5kZW50LCAiIClcbiIpOworCisgIH0KKworfQorCisKK3N0YXRpYyB2b2lkCitkdW1wX2luc25fdGFibGUoaW5zbl90YWJsZSAqdGFibGUsCisJCWludCBpbmRlbnQsIGludCBsZXZlbHMpCit7CisKKyAgcHJpbnRmKCIoaW5zbl90YWJsZSopJXBcbiIsIHRhYmxlKTsKKworICBpZiAobGV2ZWxzICYmIHRhYmxlICE9IE5VTEwpIHsKKworICAgIGR1bXBmKGluZGVudCwgIihvcGNvZGVfbnIgJWQpXG4iLCB0YWJsZS0+b3Bjb2RlX25yKTsKKworICAgIGR1bXBmKGluZGVudCwgIihleHBhbmRlZF9iaXRzICIpOworICAgIGR1bXBfaW5zbl9iaXRzKHRhYmxlLT5leHBhbmRlZF9iaXRzLCBpbmRlbnQrMSwgLTEpOworICAgIGR1bXBmKGluZGVudCwgIiApXG4iKTsKKworICAgIGR1bXBmKGluZGVudCwgIihpbnQgbnJfaW5zbiAlZClcbiIsIHRhYmxlLT5ucl9pbnNuKTsKKworICAgIGR1bXBmKGluZGVudCwgIihpbnNucyAiKTsKKyAgICBkdW1wX2luc24odGFibGUtPmluc25zLCBpbmRlbnQrMSwgdGFibGUtPm5yX2luc24pOworICAgIGR1bXBmKGluZGVudCwgIiApXG4iKTsKKworICAgIGR1bXBmKGluZGVudCwgIihvcGNvZGVfcnVsZSAiKTsKKyAgICBkdW1wX2RlY29kZV9ydWxlKHRhYmxlLT5vcGNvZGVfcnVsZSwgaW5kZW50KzEpOworICAgIGR1bXBmKGluZGVudCwgIiApXG4iKTsKKworICAgIGR1bXBmKGluZGVudCwgIihvcGNvZGUgIik7CisgICAgZHVtcF9vcGNvZGVfZmllbGQodGFibGUtPm9wY29kZSwgaW5kZW50KzEsIDEpOworICAgIGR1bXBmKGluZGVudCwgIiApXG4iKTsKKworICAgIGR1bXBmKGluZGVudCwgIihucl9lbnRyaWVzICVkKVxuIiwgdGFibGUtPmVudHJpZXMpOworICAgIGR1bXBmKGluZGVudCwgIihlbnRyaWVzICIpOworICAgIGR1bXBfaW5zbl90YWJsZSh0YWJsZS0+ZW50cmllcywgaW5kZW50KzEsIHRhYmxlLT5ucl9lbnRyaWVzKTsKKyAgICBkdW1wZihpbmRlbnQsICIgKVxuIik7CisKKyAgICBkdW1wZihpbmRlbnQsICIoc2libGluZyAiLCB0YWJsZS0+c2libGluZyk7CisgICAgZHVtcF9pbnNuX3RhYmxlKHRhYmxlLT5zaWJsaW5nLCBpbmRlbnQrMSwgbGV2ZWxzLTEpOworICAgIGR1bXBmKGluZGVudCwgIiApXG4iKTsKKworICAgIGR1bXBmKGluZGVudCwgIihwYXJlbnQgIiwgdGFibGUtPnBhcmVudCk7CisgICAgZHVtcF9pbnNuX3RhYmxlKHRhYmxlLT5wYXJlbnQsIGluZGVudCsxLCAwKTsKKyAgICBkdW1wZihpbmRlbnQsICIgKVxuIik7CisKKyAgfQorfQorCitpbnQgaW5zbl9iaXRfc2l6ZSA9IG1heF9pbnNuX2JpdF9zaXplOworaW50IGhpX2JpdF9ucjsKK2ludCBnZW5lcmF0ZV9leHBhbmRlZF9pbnN0cnVjdGlvbnM7CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGZpbHRlciAqZmlsdGVycyA9IE5VTEw7CisgIGRlY29kZV90YWJsZSAqZGVjb2RlX3J1bGVzID0gTlVMTDsKKyAgaW5zbl90YWJsZSAqaW5zdHJ1Y3Rpb25zID0gTlVMTDsKKworICBpZiAoYXJnYyAhPSA1KQorICAgIGVycm9yKCJVc2FnZTogaW5zbiA8ZmlsdGVyPiA8aGktYml0LW5yPiA8ZGVjb2RlLXRhYmxlPiA8aW5zbi10YWJsZT5cbiIpOworCisgIGZpbHRlcnMgPSBuZXdfZmlsdGVyKGFyZ3ZbMV0sIGZpbHRlcnMpOworICBoaV9iaXRfbnIgPSBhMmkoYXJndlsyXSk7CisgIEFTU0VSVChoaV9iaXRfbnIgPCBpbnNuX2JpdF9zaXplKTsKKyAgZGVjb2RlX3J1bGVzID0gbG9hZF9kZWNvZGVfdGFibGUoYXJndlszXSwgaGlfYml0X25yKTsKKyAgaW5zdHJ1Y3Rpb25zID0gbG9hZF9pbnNuX3RhYmxlKGFyZ3ZbNF0sIGRlY29kZV9ydWxlcywgZmlsdGVycyk7CisgIGluc25fdGFibGVfZXhwYW5kX2luc25zKGluc3RydWN0aW9ucyk7CisKKyAgZHVtcF9pbnNuX3RhYmxlKGluc3RydWN0aW9ucywgMCwgLTEpOworICByZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vcHBjL2xkLWluc24uaCBiL3NpbS9wcGMvbGQtaW5zbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MDBmMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2xkLWluc24uaApAQCAtMCwwICsxLDI4MSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQsMTk5NSwxOTk2LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworLyoKKyMgICAtLQorIworIworIyBGaWVsZHM6CisjCisjCTEJSW5zdHJ1Y3Rpb24gZm9ybWF0IGFzIGEgYHN0YXJ0LWJpdCxjb250ZW50JyBwYWlycy4KKyMJCXRoZSBjb250ZW50IGlzIG9uZSBvZiBhIGRpZ2l0LCBmaWVsZCBuYW1lIG9yIGAvJyAoYWthLjApCisjCisjCTIJRm9ybWF0IHNwZWNpZmllcgorIworIwkzCUZsYWdzOgk2NCAtIDY0Yml0IG9ubHkKKyMJCQlmIC0gZmxvYXRpbmcgcG9pbnQgZW5hYmxlZCByZXF1aXJlZAorIworIwk0IAlzaG9ydCBuYW1lCisjCisjCTUJRGVzY3JpcHRpb24KKyMKKyMKKyMgRm9yIGZsYWdzIG1hcmtlZCAnbW9kZWwnLCB0aGUgZmllbGRzIGFyZSBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgorIworIwkxCU5vdCB1c2VkCisjCisjCTIJTm90IHVzZWQKKyMKKyMJMwkibWFjcm8iCisjCisjCTQJU3RyaW5nIG5hbWUgZm9yIG1vZGVsCisjCisjCTUJU3BlY2lmaWMgQ1BVIG1vZGVsLCBtdXN0IGJlIGFuIGlkZW50aWZpZXIKKyMKKyMJNglDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmdW5jdGlvbmFsIHVuaXRzCisKKyovCisKKworLyogR2xvYmFsIGNvbnN0YW50cyAqLworCitlbnVtIHsKKyAgbWF4X2luc25fYml0X3NpemUgPSAzMiwKK307CisKKwordHlwZWRlZiBzdHJ1Y3QgX2luc25fZmllbGQgaW5zbl9maWVsZDsKK3N0cnVjdCBfaW5zbl9maWVsZCB7CisgIGludCBmaXJzdDsKKyAgaW50IGxhc3Q7CisgIGludCB3aWR0aDsKKyAgaW50IGlzX2ludDsKKyAgaW50IGlzX3NsYXNoOworICBpbnQgaXNfc3RyaW5nOworICBpbnQgdmFsX2ludDsKKyAgY2hhciAqcG9zX3N0cmluZzsKKyAgY2hhciAqdmFsX3N0cmluZzsKKyAgaW5zbl9maWVsZCAqbmV4dDsKKyAgaW5zbl9maWVsZCAqcHJldjsKK307CisKK3R5cGVkZWYgc3RydWN0IF9pbnNuX2ZpZWxkcyBpbnNuX2ZpZWxkczsKK3N0cnVjdCBfaW5zbl9maWVsZHMgeworICBpbnNuX2ZpZWxkICpiaXRzW21heF9pbnNuX2JpdF9zaXplXTsKKyAgaW5zbl9maWVsZCAqZmlyc3Q7CisgIGluc25fZmllbGQgKmxhc3Q7CisgIHVuc2lnbmVkIHZhbHVlOworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX29wY29kZV9maWVsZCBvcGNvZGVfZmllbGQ7CitzdHJ1Y3QgX29wY29kZV9maWVsZCB7CisgIGludCBmaXJzdDsKKyAgaW50IGxhc3Q7CisgIGludCBpc19ib29sZWFuOworICB1bnNpZ25lZCBib29sZWFuX2NvbnN0YW50OworICBvcGNvZGVfZmllbGQgKnBhcmVudDsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9pbnNuX2JpdHMgaW5zbl9iaXRzOworc3RydWN0IF9pbnNuX2JpdHMgeworICBpbnQgaXNfZXhwYW5kZWQ7CisgIGludCB2YWx1ZTsKKyAgaW5zbl9maWVsZCAqZmllbGQ7CisgIG9wY29kZV9maWVsZCAqb3Bjb2RlOworICBpbnNuX2JpdHMgKmxhc3Q7Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3R5cGVkZWYgZW51bSB7CisgIGluc25fZm9ybWF0LAorICBpbnNuX2Zvcm0sCisgIGluc25fZmxhZ3MsCisgIGluc25fbW5lbW9uaWMsCisgIGluc25fbmFtZSwKKyAgaW5zbl9jb21tZW50LAorICBucl9pbnNuX3RhYmxlX2ZpZWxkcworfSBpbnNuX3RhYmxlX2ZpZWxkczsKKwordHlwZWRlZiBlbnVtIHsKKyAgZnVuY3Rpb25fdHlwZSA9IGluc25fZm9ybWF0LAorICBmdW5jdGlvbl9uYW1lID0gaW5zbl9uYW1lLAorICBmdW5jdGlvbl9wYXJhbSA9IGluc25fY29tbWVudAorfSBmdW5jdGlvbl90YWJsZV9maWVsZHM7CisKK3R5cGVkZWYgZW51bSB7CisgIG1vZGVsX25hbWUgPSBpbnNuX21uZW1vbmljLAorICBtb2RlbF9pZGVudGlmZXIgPSBpbnNuX25hbWUsCisgIG1vZGVsX2RlZmF1bHQgPSBpbnNuX2NvbW1lbnQsCit9IG1vZGVsX3RhYmxlX2ZpZWxkczsKKwordHlwZWRlZiBzdHJ1Y3QgX2luc24gaW5zbjsKK3N0cnVjdCBfaW5zbiB7CisgIHRhYmxlX2VudHJ5ICpmaWxlX2VudHJ5OworICBpbnNuX2ZpZWxkcyAqZmllbGRzOworICBpbnNuICpuZXh0OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX2luc25fdW5kZWYgaW5zbl91bmRlZjsKK3N0cnVjdCBfaW5zbl91bmRlZiB7CisgIGluc25fdW5kZWYgKm5leHQ7CisgIGNoYXIgKm5hbWU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfbW9kZWwgbW9kZWw7CitzdHJ1Y3QgX21vZGVsIHsKKyAgbW9kZWwgKm5leHQ7CisgIGNoYXIgKm5hbWU7CisgIGNoYXIgKnByaW50YWJsZV9uYW1lOworICBjaGFyICppbnNuX2RlZmF1bHQ7CisgIHRhYmxlX21vZGVsX2VudHJ5ICpmdW5jX3VuaXRfc3RhcnQ7CisgIHRhYmxlX21vZGVsX2VudHJ5ICpmdW5jX3VuaXRfZW5kOworfTsKKyAgCit0eXBlZGVmIHN0cnVjdCBfaW5zbl90YWJsZSBpbnNuX3RhYmxlOworc3RydWN0IF9pbnNuX3RhYmxlIHsKKyAgaW50IG9wY29kZV9ucjsKKyAgaW5zbl9iaXRzICpleHBhbmRlZF9iaXRzOworICBpbnQgbnJfaW5zbjsKKyAgaW5zbiAqaW5zbnM7CisgIGluc24gKmZ1bmN0aW9uczsKKyAgaW5zbiAqbGFzdF9mdW5jdGlvbjsKKyAgZGVjb2RlX3RhYmxlICpvcGNvZGVfcnVsZTsKKyAgb3Bjb2RlX2ZpZWxkICpvcGNvZGU7CisgIGludCBucl9lbnRyaWVzOworICBpbnNuX3RhYmxlICplbnRyaWVzOworICBpbnNuX3RhYmxlICpzaWJsaW5nOworICBpbnNuX3RhYmxlICpwYXJlbnQ7Cit9OworCit0eXBlZGVmIGVudW0geworICBpbnNuX21vZGVsX25hbWUsCisgIGluc25fbW9kZWxfZmllbGRzLAorICBucl9pbnNuX21vZGVsX3RhYmxlX2ZpZWxkcworfSBpbnNuX21vZGVsX3RhYmxlX2ZpZWxkczsKKworCitleHRlcm4gaW5zbl90YWJsZSAqbG9hZF9pbnNuX3RhYmxlCisoY29uc3QgY2hhciAqZmlsZV9uYW1lLAorIGRlY29kZV90YWJsZSAqZGVjb2RlX3J1bGVzLAorIGZpbHRlciAqZmlsdGVycyk7CisKK21vZGVsICptb2RlbHM7Cittb2RlbCAqbGFzdF9tb2RlbDsKKworaW5zbiAqbW9kZWxfbWFjcm9zOworaW5zbiAqbGFzdF9tb2RlbF9tYWNybzsKKworaW5zbiAqbW9kZWxfZnVuY3Rpb25zOworaW5zbiAqbGFzdF9tb2RlbF9mdW5jdGlvbjsKKworaW5zbiAqbW9kZWxfaW50ZXJuYWw7CitpbnNuICpsYXN0X21vZGVsX2ludGVybmFsOworCitpbnNuICptb2RlbF9zdGF0aWM7CitpbnNuICpsYXN0X21vZGVsX3N0YXRpYzsKKworaW5zbiAqbW9kZWxfZGF0YTsKK2luc24gKmxhc3RfbW9kZWxfZGF0YTsKKworaW50IG1heF9tb2RlbF9maWVsZHNfbGVuOworCitleHRlcm4gdm9pZCBpbnNuX3RhYmxlX2luc2VydF9pbnNuCisoaW5zbl90YWJsZSAqdGFibGUsCisgdGFibGVfZW50cnkgKmZpbGVfZW50cnksCisgaW5zbl9maWVsZHMgKmZpZWxkcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHZvaWQgbGVhZl9oYW5kbGVyCisoaW5zbl90YWJsZSAqZW50cnksCisgbGYgKmZpbGUsCisgdm9pZCAqZGF0YSwKKyBpbnQgZGVwdGgpOworCit0eXBlZGVmIHZvaWQgaW5zbl9oYW5kbGVyCisoaW5zbl90YWJsZSAqdGFibGUsCisgbGYgKmZpbGUsCisgdm9pZCAqZGF0YSwKKyBpbnNuICppbnN0cnVjdGlvbiwKKyBpbnQgZGVwdGgpOworCit0eXBlZGVmIHZvaWQgcGFkZGluZ19oYW5kbGVyCisoaW5zbl90YWJsZSAqdGFibGUsCisgbGYgKmZpbGUsCisgdm9pZCAqZGF0YSwKKyBpbnQgZGVwdGgsCisgaW50IG9wY29kZV9ucik7CisKKworZXh0ZXJuIHZvaWQgaW5zbl90YWJsZV90cmF2ZXJzZV90cmVlCisoaW5zbl90YWJsZSAqdGFibGUsCisgbGYgKmZpbGUsCisgdm9pZCAqZGF0YSwKKyBpbnQgZGVwdGgsCisgbGVhZl9oYW5kbGVyICpzdGFydCwKKyBpbnNuX2hhbmRsZXIgKmhhbmRsZXIsCisgbGVhZl9oYW5kbGVyICplbmQsCisgcGFkZGluZ19oYW5kbGVyICpwYWRkaW5nKTsKKworCitleHRlcm4gdm9pZCBpbnNuX3RhYmxlX3RyYXZlcnNlX2luc24KKyhpbnNuX3RhYmxlICp0YWJsZSwKKyBsZiAqZmlsZSwKKyB2b2lkICpkYXRhLAorIGluc25faGFuZGxlciAqaGFuZGxlcik7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiB2b2lkIGZ1bmN0aW9uX2hhbmRsZXIKKyhpbnNuX3RhYmxlICp0YWJsZSwKKyBsZiAqZmlsZSwKKyB2b2lkICpkYXRhLAorIHRhYmxlX2VudHJ5ICpmdW5jdGlvbik7CisKK2V4dGVybiB2b2lkCitpbnNuX3RhYmxlX3RyYXZlcnNlX2Z1bmN0aW9uCisoaW5zbl90YWJsZSAqdGFibGUsCisgbGYgKmZpbGUsCisgdm9pZCAqZGF0YSwKKyBmdW5jdGlvbl9oYW5kbGVyICpsZWFmKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCitleHRlcm4gdm9pZCBpbnNuX3RhYmxlX2V4cGFuZF9pbnNucworKGluc25fdGFibGUgKnRhYmxlKTsKKworZXh0ZXJuIGludCBpbnNuX3RhYmxlX2RlcHRoCisoaW5zbl90YWJsZSAqdGFibGUpOwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9sZi5jIGIvc2ltL3BwYy9sZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNDIwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL2xmLmMKQEAgLTAsMCArMSw0NDAgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAibGYuaCIKKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKK3N0cnVjdCBfbGYgeworICBGSUxFICpzdHJlYW07CisgIGludCBsaW5lX25yOyAvKiBuciBjb21wbGV0ZSBsaW5lcyB3cml0dGVuLCBjdXJyIGxpbmUgaXMgbGluZV9ucisxICovCisgIGludCBpbmRlbnQ7CisgIGludCBsaW5lX2JsYW5rOworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICpwcm9ncmFtOworICBsZl9maWxlX3JlZmVyZW5jZXMgcmVmZXJlbmNlczsKKyAgbGZfZmlsZV90eXBlIHR5cGU7Cit9OworCisKK2xmICoKK2xmX29wZW4oY2hhciAqbmFtZSwKKwljaGFyICpyZWFsX25hbWUsCisJbGZfZmlsZV9yZWZlcmVuY2VzIHJlZmVyZW5jZXMsCisJbGZfZmlsZV90eXBlIHR5cGUsCisJY29uc3QgY2hhciAqcHJvZ3JhbSkKK3sKKyAgLyogY3JlYXRlIGEgZmlsZSBvYmplY3QgKi8KKyAgbGYgKm5ld19sZiA9IFpBTExPQyhsZik7CisgIEFTU0VSVChuZXdfbGYgIT0gTlVMTCk7CisgIG5ld19sZi0+cmVmZXJlbmNlcyA9IHJlZmVyZW5jZXM7CisgIG5ld19sZi0+dHlwZSA9IHR5cGU7CisgIG5ld19sZi0+bmFtZSA9IChyZWFsX25hbWUgPT0gTlVMTCA/IG5hbWUgOiByZWFsX25hbWUpOworICBuZXdfbGYtPnByb2dyYW0gPSBwcm9ncmFtOworICAvKiBhdHRhY2ggdG8gc3Rkb3V0IGlmIHBpcGUgKi8KKyAgaWYgKCFzdHJjbXAobmFtZSwgIi0iKSkgeworICAgIG5ld19sZi0+c3RyZWFtID0gc3Rkb3V0OworICB9CisgIGVsc2UgeworICAgIC8qIGNyZWF0ZSBhIG5ldyBmaWxlICovCisgICAgbmV3X2xmLT5zdHJlYW0gPSBmb3BlbihuYW1lLCAidyIpOworICAgIGlmIChuZXdfbGYtPnN0cmVhbSA9PSBOVUxMKSB7CisgICAgICBwZXJyb3IobmFtZSk7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgfQorICByZXR1cm4gbmV3X2xmOworfQorCisKK3ZvaWQKK2xmX2Nsb3NlKGxmICpmaWxlKQoreworICBpZiAoZmlsZS0+c3RyZWFtICE9IHN0ZG91dCkgeworICAgIGlmIChmY2xvc2UoZmlsZS0+c3RyZWFtKSkgeworICAgICAgcGVycm9yKCJsZl9jbG9zZS5mY2xvc2UiKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGZyZWUoZmlsZSk7CisgIH0KK30KKworCitpbnQKK2xmX3B1dGNocihsZiAqZmlsZSwKKwkgIGNvbnN0IGNoYXIgY2hyKQoreworICBpbnQgbnIgPSAwOworICBpZiAoY2hyID09ICdcbicpIHsKKyAgICBmaWxlLT5saW5lX25yICs9IDE7CisgICAgZmlsZS0+bGluZV9ibGFuayA9IDE7CisgIH0KKyAgZWxzZSBpZiAoZmlsZS0+bGluZV9ibGFuaykgeworICAgIGludCBwYWQ7CisgICAgZm9yIChwYWQgPSBmaWxlLT5pbmRlbnQ7IHBhZCA+IDA7IHBhZC0tKQorICAgICAgcHV0YygnICcsIGZpbGUtPnN0cmVhbSk7CisgICAgbnIgKz0gZmlsZS0+aW5kZW50OworICAgIGZpbGUtPmxpbmVfYmxhbmsgPSAwOworICB9CisgIHB1dGMoY2hyLCBmaWxlLT5zdHJlYW0pOworICBuciArPSAxOworICByZXR1cm4gbnI7Cit9CisKK3ZvaWQKK2xmX2luZGVudF9zdXBwcmVzcyhsZiAqZmlsZSkKK3sKKyAgZmlsZS0+bGluZV9ibGFuayA9IDA7Cit9CisKKworaW50CitsZl9wdXRzdHIobGYgKmZpbGUsCisJICBjb25zdCBjaGFyICpzdHJpbmcpCit7CisgIGludCBuciA9IDA7CisgIGNvbnN0IGNoYXIgKmNocDsKKyAgaWYgKHN0cmluZyAhPSBOVUxMKSB7CisgICAgZm9yIChjaHAgPSBzdHJpbmc7ICpjaHAgIT0gJ1wwJzsgY2hwKyspIHsKKyAgICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCAqY2hwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG5yOworfQorCitzdGF0aWMgaW50Citkb19sZl9wdXR1bnNpZ25lZChsZiAqZmlsZSwKKwkgICAgICB1bnNpZ25lZCB1KQoreworICBpbnQgbnIgPSAwOworICBpZiAodSA+IDApIHsKKyAgICBuciArPSBkb19sZl9wdXR1bnNpZ25lZChmaWxlLCB1IC8gMTApOworICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCAodSAlIDEwKSArICcwJyk7CisgIH0KKyAgcmV0dXJuIG5yOworfQorCisKK2ludAorbGZfcHV0aW50KGxmICpmaWxlLAorCSAgaW50IGRlY2ltYWwpCit7CisgIGludCBuciA9IDA7CisgIGlmIChkZWNpbWFsID09IDApCisgICAgbnIgKz0gbGZfcHV0Y2hyKGZpbGUsICcwJyk7CisgIGVsc2UgaWYgKGRlY2ltYWwgPCAwKSB7CisgICAgbnIgKz0gbGZfcHV0Y2hyKGZpbGUsICctJyk7CisgICAgbnIgKz0gZG9fbGZfcHV0dW5zaWduZWQoZmlsZSwgLWRlY2ltYWwpOworICB9CisgIGVsc2UgaWYgKGRlY2ltYWwgPiAwKSB7CisgICAgbnIgKz0gZG9fbGZfcHV0dW5zaWduZWQoZmlsZSwgZGVjaW1hbCk7CisgIH0KKyAgZWxzZQorICAgIEFTU0VSVCgwKTsKKyAgcmV0dXJuIG5yOworfQorCisKK2ludAorbGZfcHJpbnRmKGxmICpmaWxlLAorCSAgY29uc3QgY2hhciAqZm10LAorCSAgLi4uKQoreworICBpbnQgbnIgPSAwOworICBjaGFyIGJ1ZlsxMDI0XTsKKyAgdmFfbGlzdCBhcDsKKworICB2YV9zdGFydChhcCwgZm10KTsKKyAgdnNwcmludGYoYnVmLCBmbXQsIGFwKTsKKyAgLyogRklYTUUgLSB0aGlzIGlzIHJlYWxseSBzdHVmZmVkIGJ1dCBzbyBpcyB2c3ByaW50ZigpIG9uIGEgc3VuISAqLworICBBU1NFUlQoc3RybGVuKGJ1ZikgPiAwICYmIHN0cmxlbihidWYpIDwgc2l6ZW9mKGJ1ZikpOworICBuciArPSBsZl9wdXRzdHIoZmlsZSwgYnVmKTsKKyAgdmFfZW5kKGFwKTsKKyAgcmV0dXJuIG5yOworfQorCisKK2ludAorbGZfcHJpbnRfX2NfY29kZShsZiAqZmlsZSwKKwkJIGNvbnN0IGNoYXIgKmNvZGUpCit7CisgIGludCBuciA9IDA7CisgIGNvbnN0IGNoYXIgKmNocCA9IGNvZGU7CisgIGludCBpbl9iaXRfZmllbGQgPSAwOworICB3aGlsZSAoKmNocCAhPSAnXDAnKSB7CisgICAgaWYgKCpjaHAgPT0gJ1x0JykKKyAgICAgIGNocCsrOworICAgIGlmICgqY2hwID09ICcjJykKKyAgICAgIGxmX2luZGVudF9zdXBwcmVzcyhmaWxlKTsKKyAgICB3aGlsZSAoKmNocCAhPSAnXDAnICYmICpjaHAgIT0gJ1xuJykgeworICAgICAgaWYgKGNocFswXSA9PSAneycgJiYgIWlzc3BhY2UoY2hwWzFdKSkgeworCWluX2JpdF9maWVsZCA9IDE7CisJbnIgKz0gbGZfcHV0Y2hyKGZpbGUsICdfJyk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChpbl9iaXRfZmllbGQgJiYgY2hwWzBdID09ICc6JykgeworCW5yICs9IGxmX3B1dGNocihmaWxlLCAnXycpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoaW5fYml0X2ZpZWxkICYmICpjaHAgPT0gJ30nKSB7CisJbnIgKz0gbGZfcHV0Y2hyKGZpbGUsICdfJyk7CisJaW5fYml0X2ZpZWxkID0gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworCW5yICs9IGxmX3B1dGNocihmaWxlLCAqY2hwKTsKKyAgICAgIH0KKyAgICAgIGNocCsrOworICAgIH0KKyAgICBpZiAoaW5fYml0X2ZpZWxkKQorICAgICAgZXJyb3IoImJpdCBmaWVsZCBwYXJlbiBtaXNzIG1hdGNoIHNvbWUgd2hlcmVcbiIpOworICAgIGlmICgqY2hwID09ICdcbicpIHsKKyAgICAgIG5yICs9IGxmX3B1dGNocihmaWxlLCAnXG4nKTsKKyAgICAgIGNocCsrOworICAgIH0KKyAgfQorICBuciArPSBsZl9wdXRjaHIoZmlsZSwgJ1xuJyk7CisgIHJldHVybiBucjsKK30KKworCitpbnQKK2xmX3ByaW50X19leHRlcm5hbF9yZWZlcmVuY2UobGYgKmZpbGUsCisJCQkgICAgIGludCBsaW5lX25yLAorCQkJICAgICBjb25zdCBjaGFyICpmaWxlX25hbWUpCit7CisgIGludCBuciA9IDA7CisgIHN3aXRjaCAoZmlsZS0+cmVmZXJlbmNlcykgeworICBjYXNlIGxmX2luY2x1ZGVfcmVmZXJlbmNlczoKKyAgICBsZl9pbmRlbnRfc3VwcHJlc3MoZmlsZSk7CisgICAgbnIgKz0gbGZfcHV0c3RyKGZpbGUsICIjbGluZSAiKTsKKyAgICBuciArPSBsZl9wdXRpbnQoZmlsZSwgbGluZV9ucik7CisgICAgbnIgKz0gbGZfcHV0c3RyKGZpbGUsICIgXCIiKTsKKyAgICBuciArPSBsZl9wdXRzdHIoZmlsZSwgZmlsZV9uYW1lKTsKKyAgICBuciArPSBsZl9wdXRzdHIoZmlsZSwgIlwiXG4iKTsKKyAgICBicmVhazsKKyAgY2FzZSBsZl9vbWl0X3JlZmVyZW5jZXM6CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIG5yOworfQorCitpbnQKK2xmX3ByaW50X19pbnRlcm5hbF9yZWZlcmVuY2UobGYgKmZpbGUpCit7CisgIGludCBuciA9IDA7CisgIG5yICs9IGxmX3ByaW50X19leHRlcm5hbF9yZWZlcmVuY2UoZmlsZSwgZmlsZS0+bGluZV9ucisyLCBmaWxlLT5uYW1lKTsKKyAgLyogbGluZV9uciA9PSBsYXN0X2xpbmUsIHdhbnQgdG8gbnVtYmVyIGZyb20gbmV4dCAqLworICByZXR1cm4gbnI7Cit9CisKK3ZvaWQKK2xmX2luZGVudChsZiAqZmlsZSwgaW50IGRlbHRhKQoreworICBmaWxlLT5pbmRlbnQgKz0gZGVsdGE7Cit9CisKKworaW50CitsZl9wcmludF9fZ251X2NvcHlsZWZ0KGxmICpmaWxlKQoreworICBpbnQgbnIgPSAwOworICBzd2l0Y2ggKGZpbGUtPnR5cGUpIHsKKyAgY2FzZSBsZl9pc19jOgorICBjYXNlIGxmX2lzX2g6CisgICAgbnIgKz0gbGZfcHJpbnRmKGZpbGUsICJcCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgLS0KKworICAgIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBwcm9ncmFtICVzICovCisiLCBmaWx0ZXJfZmlsZW5hbWUoZmlsZS0+cHJvZ3JhbSkpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEFTU0VSVCgwKTsKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gbnI7Cit9CisKKworaW50CitsZl9wdXRiaW4obGYgKmZpbGUsIGludCBkZWNpbWFsLCBpbnQgd2lkdGgpCit7CisgIGludCBuciA9IDA7CisgIGludCBiaXQ7CisgIEFTU0VSVCh3aWR0aCA+IDApOworICBmb3IgKGJpdCA9IDEgPDwgKHdpZHRoLTEpOyBiaXQgIT0gMDsgYml0ID4+PSAxKSB7CisgICAgaWYgKGRlY2ltYWwgJiBiaXQpCisgICAgICBuciArPSBsZl9wdXRjaHIoZmlsZSwgJzEnKTsKKyAgICBlbHNlCisgICAgICBuciArPSBsZl9wdXRjaHIoZmlsZSwgJzAnKTsKKyAgfQorICByZXR1cm4gbnI7Cit9CisKK2ludAorbGZfcHJpbnRfX3RoaXNfZmlsZV9pc19lbXB0eShsZiAqZmlsZSkKK3sKKyAgaW50IG5yID0gMDsKKyAgc3dpdGNoIChmaWxlLT50eXBlKSB7CisgIGNhc2UgbGZfaXNfYzoKKyAgY2FzZSBsZl9pc19oOgorICAgIG5yICs9IGxmX3ByaW50ZihmaWxlLAorCQkgICAgIi8qIFRoaXMgZ2VuZXJhdGVkIGZpbGUgKCVzKSBpcyBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsgKi9cbiIsCisJCSAgICBmaWxlLT5uYW1lKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBBU1NFUlQoMCk7CisgIH0KKyAgcmV0dXJuIG5yOworfQorCitpbnQKK2xmX3ByaW50X191Y2FzZV9maWxlbmFtZShsZiAqZmlsZSkKK3sKKyAgaW50IG5yID0gMDsKKyAgY29uc3QgY2hhciAqY2hwID0gZmlsZS0+bmFtZTsKKyAgd2hpbGUgKCpjaHAgIT0gJ1wwJykgeworICAgIGNoYXIgY2ggPSAqY2hwOworICAgIGlmIChpc2xvd2VyKGNoKSkgeworICAgICAgbnIgKz0gbGZfcHV0Y2hyKGZpbGUsIHRvdXBwZXIoY2gpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY2ggPT0gJy4nKQorICAgICAgbnIgKz0gbGZfcHV0Y2hyKGZpbGUsICdfJyk7CisgICAgZWxzZQorICAgICAgbnIgKz0gbGZfcHV0Y2hyKGZpbGUsIGNoKTsKKyAgICBjaHArKzsKKyAgfQorICByZXR1cm4gbnI7Cit9CisKK2ludAorbGZfcHJpbnRfX2ZpbGVfc3RhcnQobGYgKmZpbGUpCit7CisgIGludCBuciA9IDA7CisgIHN3aXRjaCAoZmlsZS0+dHlwZSkgeworICBjYXNlIGxmX2lzX2g6CisgIGNhc2UgbGZfaXNfYzoKKyAgICBuciArPSBsZl9wcmludF9fZ251X2NvcHlsZWZ0KGZpbGUpOworICAgIG5yICs9IGxmX3ByaW50ZihmaWxlLCAiXG4iKTsKKyAgICBuciArPSBsZl9wcmludGYoZmlsZSwgIiNpZm5kZWYgXyIpOworICAgIG5yICs9IGxmX3ByaW50X191Y2FzZV9maWxlbmFtZShmaWxlKTsKKyAgICBuciArPSBsZl9wcmludGYoZmlsZSwgIl9cbiIpOworICAgIG5yICs9IGxmX3ByaW50ZihmaWxlLCAiI2RlZmluZSBfIik7CisgICAgbnIgKz0gbGZfcHJpbnRfX3VjYXNlX2ZpbGVuYW1lKGZpbGUpOworICAgIG5yICs9IGxmX3ByaW50ZihmaWxlLCAiX1xuIik7CisgICAgbnIgKz0gbGZfcHJpbnRmKGZpbGUsICJcbiIpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEFTU0VSVCgwKTsKKyAgfQorICByZXR1cm4gbnI7Cit9CisKKworaW50CitsZl9wcmludF9fZmlsZV9maW5pc2gobGYgKmZpbGUpCit7CisgIGludCBuciA9IDA7CisgIHN3aXRjaCAoZmlsZS0+dHlwZSkgeworICBjYXNlIGxmX2lzX2g6CisgIGNhc2UgbGZfaXNfYzoKKyAgICBuciArPSBsZl9wcmludGYoZmlsZSwgIlxuIik7CisgICAgbnIgKz0gbGZfcHJpbnRmKGZpbGUsICIjZW5kaWYgLyogXyIpOworICAgIG5yICs9IGxmX3ByaW50X191Y2FzZV9maWxlbmFtZShmaWxlKTsKKyAgICBuciArPSBsZl9wcmludGYoZmlsZSwgIl8qL1xuIik7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgQVNTRVJUKDApOworICB9CisgIHJldHVybiBucjsKK30KKworCitpbnQKK2xmX3ByaW50X2Z1bmN0aW9uX3R5cGUobGYgKmZpbGUsCisJCSAgICAgICBjb25zdCBjaGFyICp0eXBlLAorCQkgICAgICAgY29uc3QgY2hhciAqcHJlZml4LAorCQkgICAgICAgY29uc3QgY2hhciAqdHJhaWxpbmdfc3BhY2UpCit7CisgIGludCBuciA9IDA7CisgIG5yICs9IGxmX3ByaW50ZihmaWxlLCAiJXNcXFxuKCVzKSIsIHByZWZpeCwgdHlwZSk7CisgIGlmICh0cmFpbGluZ19zcGFjZSAhPSBOVUxMKQorICAgIG5yICs9IGxmX3ByaW50ZihmaWxlLCAiJXMiLCB0cmFpbGluZ19zcGFjZSk7CisjaWYgMAorICBjb25zdCBjaGFyICp0eXBlX3BvaW50ZXIgPSBzdHJyY2hyKHR5cGUsICcqJyk7CisgIGludCB0eXBlX3BvaW50ZXJfb2Zmc2V0ID0gKHR5cGVfcG9pbnRlciAhPSBOVUxMCisJCQkgICAgID8gdHlwZV9wb2ludGVyIC0gdHlwZQorCQkJICAgICA6IDApOworICBpZiAodHlwZV9wb2ludGVyID09IE5VTEwpIHsKKyAgICBsZl9wcmludGYoZmlsZSwgIiVzICVzIiwgdHlwZSwgcHJlZml4KTsKKyAgfQorICBlbHNlIHsKKyAgICBjaGFyICptdW5nZWRfdHlwZSA9IChjaGFyKil6YWxsb2Moc3RybGVuKHR5cGUpCisJCQkJICAgICAgKyBzdHJsZW4ocHJlZml4KQorCQkJCSAgICAgICsgc3RybGVuKCIgKiAiKQorCQkJCSAgICAgICsgMSk7CisgICAgc3RyY3B5KG11bmdlZF90eXBlLCB0eXBlKTsKKyAgICBtdW5nZWRfdHlwZVt0eXBlX3BvaW50ZXJfb2Zmc2V0XSA9ICdcMCc7CisgICAgaWYgKHR5cGVfcG9pbnRlcl9vZmZzZXQgPiAwICYmIHR5cGVbdHlwZV9wb2ludGVyX29mZnNldC0xXSAhPSAnICcpCisgICAgICBzdHJjYXQobXVuZ2VkX3R5cGUsICIgIik7CisgICAgc3RyY2F0KG11bmdlZF90eXBlLCBwcmVmaXgpOworICAgIHN0cmNhdChtdW5nZWRfdHlwZSwgIiAiKTsKKyAgICBzdHJjYXQobXVuZ2VkX3R5cGUsIHR5cGUgKyB0eXBlX3BvaW50ZXJfb2Zmc2V0KTsKKyAgICBsZl9wcmludGYoZmlsZSwgIiVzIiwgbXVuZ2VkX3R5cGUpOworICAgIGZyZWUobXVuZ2VkX3R5cGUpOworICB9CisgIGlmICh0cmFpbGluZ19zcGFjZSAhPSBOVUxMICYmIHR5cGVfcG9pbnRlcl9vZmZzZXQgPCBzdHJsZW4odHlwZSkgLSAxKQorICAgIGxmX3ByaW50ZihmaWxlLCB0cmFpbGluZ19zcGFjZSk7CisjZW5kaWYKKyAgcmV0dXJuIG5yOworfQorCmRpZmYgLS1naXQgYS9zaW0vcHBjL2xmLmggYi9zaW0vcHBjL2xmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JmNmQxYwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvbGYuaApAQCAtMCwwICsxLDEyOSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworLyogTEY6IExpbmUgTnVtYmVyZWQgT3V0cHV0IFN0cmVhbSAqLworCit0eXBlZGVmIHN0cnVjdCBfbGYgbGY7CisKK3R5cGVkZWYgZW51bSB7CisgIGxmX2lzX2gsCisgIGxmX2lzX2MsCisgIGxmX2lzX3RleHQsCit9IGxmX2ZpbGVfdHlwZTsKKworCit0eXBlZGVmIGVudW0geworICBsZl9pbmNsdWRlX3JlZmVyZW5jZXMsCisgIGxmX29taXRfcmVmZXJlbmNlcywKK30gbGZfZmlsZV9yZWZlcmVuY2VzOworCisKKy8qIE9wZW4gdGhlIGZpbGUgTkFNRSBmb3Igd3JpdGluZy4gIFJFQUxfTkFNRSBpcyB0byBiZSBpbmNsdWRlZCBpbiBhbnkKKyAgIGxpbmUgbnVtYmVyIG91dHB1dHMuICBUaGUgb3V0cHV0IG9mIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGNhbiBiZQorICAgc3VwcHJlc3NlZCB3aXRoIExJTkVfTlVNQkVSUyAqLworCitleHRlcm4gbGYgKmxmX29wZW4KKyhjaGFyICpuYW1lLAorIGNoYXIgKnJlYWxfbmFtZSwKKyBsZl9maWxlX3JlZmVyZW5jZXMgZmlsZV9yZWZlcmVuY2VzLAorIGxmX2ZpbGVfdHlwZSB0eXBlLAorIGNvbnN0IGNoYXIgKnByb2dyYW0pOworCitleHRlcm4gdm9pZCBsZl9jbG9zZQorKGxmICpmaWxlKTsKKworCisvKiBCYXNpYyBvdXRwdXQgZnVuY3Rpb25zICovCisKK2V4dGVybiBpbnQgbGZfcHV0Y2hyCisobGYgKmZpbGUsCisgY29uc3QgY2hhciBjaCk7CisKK2V4dGVybiBpbnQgbGZfcHV0c3RyCisobGYgKmZpbGUsCisgY29uc3QgY2hhciAqc3RyaW5nKTsKKworZXh0ZXJuIGludCBsZl9wdXRpbnQKKyhsZiAqZmlsZSwKKyBpbnQgZGVjaW1hbCk7CisKK2V4dGVybiBpbnQgbGZfcHV0YmluCisobGYgKmZpbGUsCisgaW50IGRlY2ltYWwsCisgaW50IHdpZHRoKTsKKworZXh0ZXJuIGludCBsZl9wcmludGYKKyhsZiAqZmlsZSwKKyBjb25zdCBjaGFyICpmbXQsCisgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOworCisKKy8qIEluZGVudGF0aW9uIGNvbnRyb2wuCisKKyAgIGxmX2luZGVudF9zdXBwcmVzcyBzdXBwcmVzc2VzIGluZGVudGF0aW9uIG9uIHRoZSBuZXh0IGxpbmUgKGN1cnJlbnQKKyAgIGxpbmUgaWYgdGhhdCBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQpICovCisKK2V4dGVybiB2b2lkIGxmX2luZGVudF9zdXBwcmVzcworKGxmICpmaWxlKTsKKworZXh0ZXJuIHZvaWQgbGZfaW5kZW50CisobGYgKmZpbGUsCisgaW50IGRlbHRhKTsKKworCisvKiBQcmludCBnZW5lcmljIHRleHQ6ICovCisKKworZXh0ZXJuIGludCBsZl9wcmludF9fZ251X2NvcHlsZWZ0CisobGYgKmZpbGUpOworCitleHRlcm4gaW50IGxmX3ByaW50X19maWxlX3N0YXJ0CisobGYgKmZpbGUpOworCitleHRlcm4gaW50IGxmX3ByaW50X190aGlzX2ZpbGVfaXNfZW1wdHkKKyhsZiAqZmlsZSk7CisKK2V4dGVybiBpbnQgbGZfcHJpbnRfX2ZpbGVfZmluaXNoCisobGYgKmZpbGUpOworCitleHRlcm4gaW50IGxmX3ByaW50X19pbnRlcm5hbF9yZWZlcmVuY2UKKyhsZiAqZmlsZSk7CisKK2V4dGVybiBpbnQgbGZfcHJpbnRfX2V4dGVybmFsX3JlZmVyZW5jZQorKGxmICpmaWxlLAorIGludCBsaW5lX25yLAorIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSk7CisKK2V4dGVybiBpbnQgbGZfcHJpbnRfX3VjYXNlX2ZpbGVuYW1lCisobGYgKmZpbGUpOworCisvKiBUYWIgcHJlZml4IGlzIHN1cHByZXNzZWQgKi8KKworZXh0ZXJuIGludCBsZl9wcmludF9fY19jb2RlCisobGYgKmZpbGUsCisgY29uc3QgY2hhciAqY29kZSk7CisKKworZXh0ZXJuIGludCBsZl9wcmludF9mdW5jdGlvbl90eXBlCisobGYgKmZpbGUsCisgY29uc3QgY2hhciAqdHlwZSwKKyBjb25zdCBjaGFyICpwcmVmaXgsCisgY29uc3QgY2hhciAqdHJhaWxpbmdfc3BhY2UpOwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9tYWluLmMgYi9zaW0vcHBjL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjk0OGUwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9tYWluLmMKQEAgLTAsMCArMSwzMTggQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgInBzaW0uaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAiZGV2aWNlLmgiIC8qIEZJWE1FOiBwc2ltIHNob3VsZCBwcm92aWRlIHRoZSBpbnRlcmZhY2UgKi8KKyNpbmNsdWRlICJldmVudHMuaCIgLyogRklYTUU6IHBzaW0gc2hvdWxkIHByb3ZpZGUgdGhlIGludGVyZmFjZSAqLworCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmICFkZWZpbmVkKE9fTkRFTEFZKSB8fCAhZGVmaW5lZChGX0dFVEZMKSB8fCAhZGVmaW5lZChGX1NFVEZMKQorI3VuZGVmIFdJVEhfU1RESU8KKyNkZWZpbmUgV0lUSF9TVERJTyBET19VU0VfU1RESU8KKyNlbmRpZgorCisKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKworc3RhdGljIHBzaW0gKnNpbXVsYXRpb24gPSBOVUxMOworCisKK3ZvaWQKK3NpbV9pb19wb2xsX3F1aXQgKHZvaWQpCit7CisgIC8qIG5vdGhpbmcgdG8gZG8gKi8KK30KKwordm9pZAorc2ltX2lvX3ByaW50Zl9maWx0ZXJlZChjb25zdCBjaGFyICptc2csIC4uLikKK3sKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQoYXAsIG1zZyk7CisgIHZwcmludGYobXNnLCBhcCk7CisgIHZhX2VuZChhcCk7Cit9CisKK3ZvaWQKK2Vycm9yIChjb25zdCBjaGFyICptc2csIC4uLikKK3sKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQoYXAsIG1zZyk7CisgIHZwcmludGYobXNnLCBhcCk7CisgIHByaW50ZigiXG4iKTsKKyAgdmFfZW5kKGFwKTsKKworICAvKiBhbnkgZmluYWwgY2xlYW4gdXAgKi8KKyAgaWYgKHBwY190cmFjZVt0cmFjZV9wcmludF9pbmZvXSAmJiBzaW11bGF0aW9uICE9IE5VTEwpCisgICAgcHNpbV9wcmludF9pbmZvIChzaW11bGF0aW9uLCBwcGNfdHJhY2VbdHJhY2VfcHJpbnRfaW5mb10pOworCisgIGV4aXQgKDEpOworfQorCitpbnQKK3NpbV9pb193cml0ZV9zdGRvdXQoY29uc3QgY2hhciAqYnVmLAorCQkgICAgaW50IHNpemVvZl9idWYpCit7CisgIHN3aXRjaCAoQ1VSUkVOVF9TVERJTykgeworICBjYXNlIERPX1VTRV9TVERJTzoKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2ZfYnVmOyBpKyspIHsKKwlwdXRjaGFyKGJ1ZltpXSk7CisgICAgICB9CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgRE9OVF9VU0VfU1RESU86CisgICAgcmV0dXJuIHdyaXRlKDEsIGJ1Ziwgc2l6ZW9mX2J1Zik7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgZXJyb3IoInNpbV9pb193cml0ZV9zdGRvdXQ6IGludmFsaWQgc3dpdGNoXG4iKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50CitzaW1faW9fd3JpdGVfc3RkZXJyKGNvbnN0IGNoYXIgKmJ1ZiwKKwkJICAgIGludCBzaXplb2ZfYnVmKQoreworICBzd2l0Y2ggKENVUlJFTlRfU1RESU8pIHsKKyAgY2FzZSBET19VU0VfU1RESU86CisgICAgeworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mX2J1ZjsgaSsrKSB7CisJZnB1dGMoYnVmW2ldLCBzdGRlcnIpOworICAgICAgfQorICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIERPTlRfVVNFX1NURElPOgorICAgIHJldHVybiB3cml0ZSgyLCBidWYsIHNpemVvZl9idWYpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGVycm9yKCJzaW1faW9fd3JpdGVfc3Rkb3V0OiBpbnZhbGlkIHN3aXRjaFxuIik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludAorc2ltX2lvX3JlYWRfc3RkaW4oY2hhciAqYnVmLAorCQkgIGludCBzaXplb2ZfYnVmKQoreworICBzd2l0Y2ggKENVUlJFTlRfU1RESU8pIHsKKyAgY2FzZSBET19VU0VfU1RESU86CisgICAgaWYgKHNpemVvZl9idWYgPiAxKSB7CisgICAgICBpZiAoZmdldHMoYnVmLCBzaXplb2ZfYnVmLCBzdGRpbikgIT0gTlVMTCkKKwlyZXR1cm4gc3RybGVuKGJ1Zik7CisgICAgfQorICAgIGVsc2UgaWYgKHNpemVvZl9idWYgPT0gMSkgeworICAgICAgY2hhciBiWzJdOworICAgICAgaWYgKGZnZXRzKGIsIHNpemVvZihiKSwgc3RkaW4pICE9IE5VTEwpIHsKKwltZW1jcHkoYnVmLCBiLCBzdHJsZW4oYikpOworCXJldHVybiBzdHJsZW4oYik7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHNpemVvZl9idWYgPT0gMCkKKyAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzaW1faW9fZW9mOworICAgIGJyZWFrOworICBjYXNlIERPTlRfVVNFX1NURElPOgorI2lmIGRlZmluZWQoT19OREVMQVkpICYmIGRlZmluZWQoRl9HRVRGTCkgJiYgZGVmaW5lZChGX1NFVEZMKQorICAgIHsKKyAgICAgIC8qIGNoZWNrIGZvciBpbnB1dCAqLworICAgICAgaW50IGZsYWdzOworICAgICAgaW50IHN0YXR1czsKKyAgICAgIGludCBucl9yZWFkOworICAgICAgaW50IHJlc3VsdDsKKyAgICAgIC8qIGdldCB0aGUgb2xkIHN0YXR1cyAqLworICAgICAgZmxhZ3MgPSBmY250bCgwLCBGX0dFVEZMLCAwKTsKKyAgICAgIGlmIChmbGFncyA9PSAtMSkgeworCXBlcnJvcigic2ltX2lvX3JlYWRfc3RkaW4iKTsKKwlyZXR1cm4gc2ltX2lvX2VvZjsKKyAgICAgIH0KKyAgICAgIC8qIHRlbXAsIGRpc2FibGUgYmxvY2tpbmcgSU8gKi8KKyAgICAgIHN0YXR1cyA9IGZjbnRsKDAsIEZfU0VURkwsIGZsYWdzIHwgT19OREVMQVkpOworICAgICAgaWYgKHN0YXR1cyA9PSAtMSkgeworCXBlcnJvcigic2ltX2lvX3JlYWRfc3RkaW4iKTsKKwlyZXR1cm4gc2ltX2lvX2VvZjsKKyAgICAgIH0KKyAgICAgIC8qIHRyeSBmb3IgaW5wdXQgKi8KKyAgICAgIG5yX3JlYWQgPSByZWFkKDAsIGJ1Ziwgc2l6ZW9mX2J1Zik7CisgICAgICBpZiAobnJfcmVhZCA+IDAKKwkgIHx8IChucl9yZWFkID09IDAgJiYgc2l6ZW9mX2J1ZiA9PSAwKSkKKwlyZXN1bHQgPSBucl9yZWFkOworICAgICAgZWxzZSBpZiAobnJfcmVhZCA9PSAwKQorCXJlc3VsdCA9IHNpbV9pb19lb2Y7CisgICAgICBlbHNlIHsgLyogbnJfcmVhZCA8IDAgKi8KKwlpZiAoZXJybm8gPT0gRUFHQUlOKQorCSAgcmVzdWx0ID0gc2ltX2lvX25vdF9yZWFkeTsKKwllbHNlIAorCSAgcmVzdWx0ID0gc2ltX2lvX2VvZjsKKyAgICAgIH0KKyAgICAgIC8qIHJldHVybiB0byByZWd1bGFyIHZld2luZyAqLworICAgICAgc3RhdHVzID0gZmNudGwoMCwgRl9TRVRGTCwgZmxhZ3MpOworICAgICAgaWYgKHN0YXR1cyA9PSAtMSkgeworCXBlcnJvcigic2ltX2lvX3JlYWRfc3RkaW4iKTsKKwlyZXR1cm4gc2ltX2lvX2VvZjsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIGJyZWFrOworI2VuZGlmCisgIGRlZmF1bHQ6CisgICAgZXJyb3IoInNpbV9pb19yZWFkX3N0ZGluOiBpbnZhbGlkIHN3aXRjaFxuIik7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3NpbV9pb19mbHVzaF9zdGRvdXRwdXQodm9pZCkKK3sKKyAgc3dpdGNoIChDVVJSRU5UX1NURElPKSB7CisgIGNhc2UgRE9fVVNFX1NURElPOgorICAgIGZmbHVzaCAoc3Rkb3V0KTsKKyAgICBicmVhazsKKyAgY2FzZSBET05UX1VTRV9TVERJTzoKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBlcnJvcigic2ltX2lvX2ZsdXNoX3N0ZG91dHB1dDogaW52YWxpZCBzd2l0Y2hcbiIpOworICAgIGJyZWFrOworICB9Cit9CisKKwordm9pZCAqCit6YWxsb2MobG9uZyBzaXplKQoreworICB2b2lkICptZW1vcnkgPSBtYWxsb2Moc2l6ZSk7CisgIGlmIChtZW1vcnkgPT0gTlVMTCkKKyAgICBlcnJvcigiem1hbGxvYyBmYWlsZWRcbiIpOworICBtZW1zZXQobWVtb3J5LCAwLCBzaXplKTsKKyAgcmV0dXJuIG1lbW9yeTsKK30KKwordm9pZAoremZyZWUodm9pZCAqY2h1bmspCit7CisgIGZyZWUoY2h1bmspOworfQorCisvKiBXaGVuIGEgQ05UUkwtQyBvY2N1cmVzLCBxdWV1ZSBhbiBldmVudCB0byBzaHV0IGRvd24gdGhlIHNpbXVsYXRpb24gKi8KKworc3RhdGljIFJFVFNJR1RZUEUKK2NudHJsX2MoaW50IHNpZykKK3sKKyAgcHNpbV9zdG9wIChzaW11bGF0aW9uKTsKK30KKworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBjb25zdCBjaGFyICpuYW1lX29mX2ZpbGU7CisgIGNoYXIgKmFyZ187CisgIHBzaW1fc3RhdHVzIHN0YXR1czsKKyAgZGV2aWNlICpyb290ID0gcHNpbV90cmVlKCk7CisKKyAgLyogcGFyc2UgdGhlIGFyZ3VtZW50cyAqLworICBhcmd2ID0gcHNpbV9vcHRpb25zKHJvb3QsIGFyZ3YgKyAxKTsKKyAgaWYgKGFyZ3ZbMF0gPT0gTlVMTCkgeworICAgIGlmIChwcGNfdHJhY2VbdHJhY2Vfb3B0c10pIHsKKyAgICAgIHByaW50X29wdGlvbnMgKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgcHNpbV91c2FnZSgwKTsKKyAgICB9CisgIH0KKyAgbmFtZV9vZl9maWxlID0gYXJndlswXTsKKworICBpZiAocHBjX3RyYWNlW3RyYWNlX29wdHNdKQorICAgIHByaW50X29wdGlvbnMgKCk7CisKKyAgLyogY3JlYXRlIHRoZSBzaW11bGF0b3IgKi8KKyAgc2ltdWxhdGlvbiA9IHBzaW1fY3JlYXRlKG5hbWVfb2ZfZmlsZSwgcm9vdCk7CisKKyAgLyogZnVkZ2UgdGhlIGVudmlyb25tZW50IHNvIHRoYXQgXz1wcm9nLW5hbWUgKi8KKyAgYXJnXyA9IChjaGFyKil6YWxsb2Moc3RybGVuKGFyZ3ZbMF0pICsgc3RybGVuKCJfPSIpICsgMSk7CisgIHN0cmNweShhcmdfLCAiXz0iKTsKKyAgc3RyY2F0KGFyZ18sIGFyZ3ZbMF0pOworICBwdXRlbnYoYXJnXyk7CisKKyAgLyogaW5pdGlhbGl6ZSBpdCAqLworICBwc2ltX2luaXQoc2ltdWxhdGlvbik7CisgIHBzaW1fc3RhY2soc2ltdWxhdGlvbiwgYXJndiwgZW52aXJvbik7CisKKyAgeworICAgIFJFVFNJR1RZUEUgKCpwcmV2KSAoKTsKKyAgICBwcmV2ID0gc2lnbmFsKFNJR0lOVCwgY250cmxfYyk7CisgICAgcHNpbV9ydW4oc2ltdWxhdGlvbik7CisgICAgc2lnbmFsKFNJR0lOVCwgcHJldik7CisgIH0KKworICAvKiBhbnkgZmluYWwgY2xlYW4gdXAgKi8KKyAgaWYgKHBwY190cmFjZVt0cmFjZV9wcmludF9pbmZvXSkKKyAgICBwc2ltX3ByaW50X2luZm8gKHNpbXVsYXRpb24sIHBwY190cmFjZVt0cmFjZV9wcmludF9pbmZvXSk7CisKKyAgLyogd2h5IGRpZCB3ZSBzdG9wICovCisgIHN0YXR1cyA9IHBzaW1fZ2V0X3N0YXR1cyhzaW11bGF0aW9uKTsKKyAgc3dpdGNoIChzdGF0dXMucmVhc29uKSB7CisgIGNhc2Ugd2FzX2NvbnRpbnVpbmc6CisgICAgZXJyb3IoInBzaW06IGNvbnRpbnVpbmcgd2hpbGUgc3RvcGVkIVxuIik7CisgICAgcmV0dXJuIDA7CisgIGNhc2Ugd2FzX3RyYXA6CisgICAgZXJyb3IoInBzaW06IG5vIHRyYXAgaW5zblxuIik7CisgICAgcmV0dXJuIDA7CisgIGNhc2Ugd2FzX2V4aXRlZDoKKyAgICByZXR1cm4gc3RhdHVzLnNpZ25hbDsKKyAgY2FzZSB3YXNfc2lnbmFsbGVkOgorICAgIHByaW50ZiAoIiVzOiBDYXVnaHQgc2lnbmFsICVkIGF0IGFkZHJlc3MgMHglbHhcbiIsCisgCSAgICBuYW1lX29mX2ZpbGUsIChpbnQpc3RhdHVzLnNpZ25hbCwKKyAJICAgIChsb25nKXN0YXR1cy5wcm9ncmFtX2NvdW50ZXIpOworICAgIHJldHVybiBzdGF0dXMuc2lnbmFsOworICBkZWZhdWx0OgorICAgIGVycm9yKCJ1bmtub3duIGhhbHQgY29uZGl0aW9uXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9taXNjLmMgYi9zaW0vcHBjL21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGU1NGVkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9taXNjLmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorCit2b2lkCitlcnJvciAoY2hhciAqbXNnLCAuLi4pCit7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0KGFwLCBtc2cpOworICB2cHJpbnRmKG1zZywgYXApOworICB2YV9lbmQoYXApOworICBleGl0ICgxKTsKK30KKwordm9pZCAqCit6YWxsb2MobG9uZyBzaXplKQoreworICB2b2lkICptZW1vcnkgPSBtYWxsb2Moc2l6ZSk7CisgIGlmIChtZW1vcnkgPT0gTlVMTCkKKyAgICBlcnJvcigiemFsbG9jIGZhaWxlZFxuIik7CisgIG1lbXNldChtZW1vcnksIDAsIHNpemUpOworICByZXR1cm4gbWVtb3J5OworfQorCit2b2lkCitkdW1wZiAoaW50IGluZGVudCwgY2hhciAqbXNnLCAuLi4pCit7CisgIHZhX2xpc3QgYXA7CisgIGZvciAoOyBpbmRlbnQgPiAwOyBpbmRlbnQtLSkKKyAgICBwcmludGYoIiAiKTsKKyAgdmFfc3RhcnQoYXAsIG1zZyk7CisgIHZwcmludGYobXNnLCBhcCk7CisgIHZhX2VuZChhcCk7Cit9CisKKwordW5zaWduZWQKK2EyaShjb25zdCBjaGFyICphKQoreworICBpbnQgbmVnID0gMDsKKyAgaW50IGJhc2UgPSAxMDsKKyAgdW5zaWduZWQgbnVtID0gMDsKKyAgaW50IGxvb3Bpbmc7CisKKyAgd2hpbGUgKGlzc3BhY2UgKCphKSkKKyAgICBhKys7CisKKyAgaWYgKCphID09ICctJykgeworICAgIG5lZyA9IDE7CisgICAgYSsrOworICB9CisKKyAgaWYgKCphID09ICcwJykgeworICAgIGlmIChhWzFdID09ICd4JyB8fCBhWzFdID09ICdYJykgeworICAgICAgYSArPSAyOworICAgICAgYmFzZSA9IDE2OworICAgIH0KKyAgICBlbHNlCisgICAgICBiYXNlID0gODsKKyAgfQorCisgIGxvb3BpbmcgPSAxOworICB3aGlsZSAobG9vcGluZykgeworICAgIGludCBjaCA9ICphKys7CisKKyAgICBzd2l0Y2ggKGJhc2UpIHsKKyAgICBkZWZhdWx0OgorICAgICAgbG9vcGluZyA9IDA7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMTA6CisgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworCW51bSA9IChudW0gKiAxMCkgKyAoY2ggLSAnMCcpOworICAgICAgfSBlbHNlIHsKKwlsb29waW5nID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSA4OgorICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnNycpIHsKKwludW0gPSAobnVtICogOCkgKyAoY2ggLSAnMCcpOworICAgICAgfSBlbHNlIHsKKwlsb29waW5nID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAxNjoKKyAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisJbnVtID0gKG51bSAqIDE2KSArIChjaCAtICcwJyk7CisgICAgICB9IGVsc2UgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpIHsKKwludW0gPSAobnVtICogMTYpICsgKGNoIC0gJ2EnICsgMTApOworICAgICAgfSBlbHNlIGlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSB7CisJbnVtID0gKG51bSAqIDE2KSArIChjaCAtICdBJyArIDEwKTsKKyAgICAgIH0gZWxzZSB7CisJbG9vcGluZyA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAobmVnKQorICAgIG51bSA9IC0gbnVtOworCisgIHJldHVybiBudW07Cit9CisKK3Vuc2lnbmVkCit0YXJnZXRfYTJpKGludCBtc19iaXRfbnIsCisJICAgY29uc3QgY2hhciAqYSkKK3sKKyAgaWYgKG1zX2JpdF9ucikKKyAgICByZXR1cm4gKG1zX2JpdF9uciAtIGEyaShhKSk7CisgIGVsc2UKKyAgICByZXR1cm4gYTJpKGEpOworfQorCit1bnNpZ25lZAoraTJ0YXJnZXQoaW50IG1zX2JpdF9uciwKKwkgdW5zaWduZWQgYml0KQoreworICBpZiAobXNfYml0X25yKQorICAgIHJldHVybiBtc19iaXRfbnIgLSBiaXQ7CisgIGVsc2UKKyAgICByZXR1cm4gYml0OworfQorCisKK2ludAorbmFtZTJpKGNvbnN0IGNoYXIgKm5hbWVzLAorICAgICAgIGNvbnN0IG5hbWVfbWFwICptYXApCit7CisgIGNvbnN0IG5hbWVfbWFwICpjdXJyOworICBjb25zdCBjaGFyICpuYW1lID0gbmFtZXM7CisgIHdoaWxlICgqbmFtZSAhPSAnXDAnKSB7CisgICAgLyogZmluZCBvdXIgbmFtZSAqLworICAgIGNoYXIgKmVuZCA9IHN0cmNocihuYW1lLCAnLCcpOworICAgIGNoYXIgKm5leHQ7CisgICAgaW50IGxlbjsKKyAgICBpZiAoZW5kID09IE5VTEwpIHsKKyAgICAgIGVuZCA9IHN0cmNocihuYW1lLCAnXDAnKTsKKyAgICAgIG5leHQgPSBlbmQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgbmV4dCA9IGVuZCArIDE7CisgICAgfQorICAgIGxlbiA9IGVuZCAtIG5hbWU7CisgICAgLyogbG9vayBpdCB1cCAqLworICAgIGN1cnIgPSBtYXA7CisgICAgd2hpbGUgKGN1cnItPm5hbWUgIT0gTlVMTCkgeworICAgICAgaWYgKHN0cm5jbXAoY3Vyci0+bmFtZSwgbmFtZSwgbGVuKSA9PSAwCisJICAmJiBzdHJsZW4oY3Vyci0+bmFtZSkgPT0gbGVuKQorCXJldHVybiBjdXJyLT5pOworICAgICAgY3VycisrOworICAgIH0KKyAgICBuYW1lID0gbmV4dDsKKyAgfQorICAvKiBub3RoaW5nIGZvdW5kLCBwb3NzaWJseSByZXR1cm4gYSBkZWZhdWx0ICovCisgIGN1cnIgPSBtYXA7CisgIHdoaWxlIChjdXJyLT5uYW1lICE9IE5VTEwpCisgICAgY3VycisrOworICBpZiAoY3Vyci0+aSA+PSAwKQorICAgIHJldHVybiBjdXJyLT5pOworICBlbHNlCisgICAgZXJyb3IoIiVzIGNvbnRhaW5zIG5vIHZhbGlkIG5hbWVzXG4iLCBuYW1lcyk7CisgIHJldHVybiAwOworfQorCitjb25zdCBjaGFyICoKK2kybmFtZShjb25zdCBpbnQgaSwKKyAgICAgICBjb25zdCBuYW1lX21hcCAqbWFwKQoreworICB3aGlsZSAobWFwLT5uYW1lICE9IE5VTEwpIHsKKyAgICBpZiAobWFwLT5pID09IGkpCisgICAgICByZXR1cm4gbWFwLT5uYW1lOworICAgIG1hcCsrOworICB9CisgIGVycm9yKCJtYXAgbG9va3VwIGZhaWxlZCBmb3IgJWRcbiIsIGkpOworICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3NpbS9wcGMvbWlzYy5oIGIvc2ltL3BwYy9taXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxYmQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvbWlzYy5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKy8qIEZydXN0cmF0aW5nIGhlYWRlciBqdW5rICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoX19hdHRyaWJ1dGVfXykgJiYgKCFkZWZpbmVkKF9fR05VQ19fKSB8fCBfX0dOVUNfXyA8IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA3KSkKKyNkZWZpbmUgX19hdHRyaWJ1dGVfXyhhcmcpCisjZW5kaWYKKworCisKKyNpbmNsdWRlICJmaWx0ZXJfZmlsZW5hbWUuaCIKKworZXh0ZXJuIHZvaWQgZXJyb3IKKyhjaGFyICptc2csIC4uLik7CisKKyNkZWZpbmUgQVNTRVJUKEVYUFJFU1NJT04pIFwKK2RvIHsgXAorICBpZiAoIShFWFBSRVNTSU9OKSkgeyBcCisgICAgZXJyb3IoIiVzOiVkOiBhc3NlcnRpb24gZmFpbGVkIC0gJXNcbiIsIFwKKwkgIGZpbHRlcl9maWxlbmFtZSAoX19GSUxFX18pLCBfX0xJTkVfXywgI0VYUFJFU1NJT04pOyBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBaQUxMT0MoVFlQRSkgKFRZUEUqKXphbGxvYyhzaXplb2YoVFlQRSkpCisKK2V4dGVybiB2b2lkICp6YWxsb2MKKyhsb25nIHNpemUpOworCitleHRlcm4gdm9pZCBkdW1wZgorKGludCBpbmRlbnQsIGNoYXIgKm1zZywgLi4uKTsKKworZXh0ZXJuIHVuc2lnbmVkIHRhcmdldF9hMmkKKyhpbnQgbXNfYml0X25yLAorIGNvbnN0IGNoYXIgKmEpOworCitleHRlcm4gdW5zaWduZWQgaTJ0YXJnZXQKKyhpbnQgbXNfYml0X25yLAorIHVuc2lnbmVkIGJpdCk7CisKK2V4dGVybiB1bnNpZ25lZCBhMmkKKyhjb25zdCBjaGFyICphKTsKKworLyogVHJ5IGxvb2tpbmcgZm9yIG5hbWUgaW4gdGhlIG1hcCB0YWJsZSAocmV0dXJuaW5nIHRoZSBjb3JyZXNwb25kaW5nCisgICBpbnRlZ2VyIHZhbHVlKS4gIElmIHRoYXQgZmFpbHMsIHRyeSBjb252ZXJ0aW5nIHRoZSBuYW1lIGludG8gYW4KKyAgIGludGVnZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX25hbWVfbWFwIHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgaW50IGk7Cit9IG5hbWVfbWFwOworCitleHRlcm4gaW50IG5hbWUyaQorKGNvbnN0IGNoYXIgKm5hbWUsCisgY29uc3QgbmFtZV9tYXAgKm1hcCk7CisKK2V4dGVybiBjb25zdCBjaGFyICppMm5hbWUKKyhjb25zdCBpbnQgaSwKKyBjb25zdCBuYW1lX21hcCAqbWFwKTsKZGlmZiAtLWdpdCBhL3NpbS9wcGMvbW9uLmMgYi9zaW0vcHBjL21vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZGFmNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL21vbi5jCkBAIC0wLDAgKzEsNDQ1IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIF9NT05fQ18KKyNkZWZpbmUgX01PTl9DXworCisjaW5jbHVkZSAiYmFzaWNzLmgiCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAibW9uLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9USU1FX0gKKyNpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1lTX1RJTUVTX0gKKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgoraW50IGdldHJ1c2FnZSgpOworI2VuZGlmCisKKyNkZWZpbmUgTUFYX0JZVEVfUkVBRFdSSVRFIDkKKyNkZWZpbmUgTUFYX1NISUZUX1JFQURXUklURSAzCisKK3N0cnVjdCBfY3B1X21vbiB7CisgIGNvdW50X3R5cGUgaXNzdWVfY291bnRbbnJfaXRhYmxlX2VudHJpZXNdOworICBjb3VudF90eXBlIHJlYWRfY291bnQ7CisgIGNvdW50X3R5cGUgcmVhZF9ieXRlX2NvdW50W01BWF9CWVRFX1JFQURXUklURV07CisgIGNvdW50X3R5cGUgd3JpdGVfY291bnQ7CisgIGNvdW50X3R5cGUgd3JpdGVfYnl0ZV9jb3VudFtNQVhfQllURV9SRUFEV1JJVEVdOworICBjb3VudF90eXBlIHVuYWxpZ25lZF9yZWFkX2NvdW50OworICBjb3VudF90eXBlIHVuYWxpZ25lZF93cml0ZV9jb3VudDsKKyAgY291bnRfdHlwZSBldmVudF9jb3VudFtucl9tb25fZXZlbnRzXTsKK307CisKK3N0cnVjdCBfbW9uIHsKKyAgaW50IG5yX2NwdXM7CisgIGNwdV9tb24gY3B1X21vbml0b3JbTUFYX05SX1BST0NFU1NPUlNdOworfTsKKworCitJTkxJTkVfTU9OXAorKG1vbiAqKQorbW9uX2NyZWF0ZSh2b2lkKQoreworICBtb24gKm1vbml0b3IgPSBaQUxMT0MobW9uKTsKKyAgcmV0dXJuIG1vbml0b3I7Cit9CisKKworSU5MSU5FX01PTlwKKyhjcHVfbW9uICopCittb25fY3B1KG1vbiAqbW9uaXRvciwKKwlpbnQgY3B1X25yKQoreworICBpZiAoY3B1X25yIDwgMCB8fCBjcHVfbnIgPj0gTUFYX05SX1BST0NFU1NPUlMpCisgICAgZXJyb3IoIm1vbl9jcHUoKSAtIGludmFsaWQgY3B1IG51bWJlclxuIik7CisgIHJldHVybiAmbW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXTsKK30KKworCitJTkxJTkVfTU9OXAorKHZvaWQpCittb25faW5pdChtb24gKm1vbml0b3IsCisJIGludCBucl9jcHVzKQoreworICBtZW1zZXQobW9uaXRvciwgMCwgc2l6ZW9mKCptb25pdG9yKSk7CisgIG1vbml0b3ItPm5yX2NwdXMgPSBucl9jcHVzOworfQorCisKK0lOTElORV9NT05cCisodm9pZCkKK21vbl9pc3N1ZShpdGFibGVfaW5kZXggaW5kZXgsCisJICBjcHUgKnByb2Nlc3NvciwgCisJICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgY3B1X21vbiAqbW9uaXRvciA9IGNwdV9tb25pdG9yKHByb2Nlc3Nvcik7CisgIEFTU0VSVChpbmRleCA8PSBucl9pdGFibGVfZW50cmllcyk7CisgIG1vbml0b3ItPmlzc3VlX2NvdW50W2luZGV4XSArPSAxOworfQorCisKK0lOTElORV9NT05cCisodm9pZCkKK21vbl9yZWFkKHVuc2lnbmVkX3dvcmQgZWEsCisJIHVuc2lnbmVkX3dvcmQgcmEsCisJIHVuc2lnbmVkIG5yX2J5dGVzLAorCSBjcHUgKnByb2Nlc3NvciwKKwkgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGNwdV9tb24gKm1vbml0b3IgPSBjcHVfbW9uaXRvcihwcm9jZXNzb3IpOworICBtb25pdG9yLT5yZWFkX2NvdW50ICs9IDE7CisgIG1vbml0b3ItPnJlYWRfYnl0ZV9jb3VudFtucl9ieXRlc10gKz0gMTsKKyAgaWYgKChucl9ieXRlcyAtIDEpICYgZWEpCisgICAgbW9uaXRvci0+dW5hbGlnbmVkX3JlYWRfY291bnQgKz0gMTsKK30KKworCitJTkxJTkVfTU9OXAorKHZvaWQpCittb25fd3JpdGUodW5zaWduZWRfd29yZCBlYSwKKwkgIHVuc2lnbmVkX3dvcmQgcmEsCisJICB1bnNpZ25lZCBucl9ieXRlcywKKwkgIGNwdSAqcHJvY2Vzc29yLAorCSAgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIGNwdV9tb24gKm1vbml0b3IgPSBjcHVfbW9uaXRvcihwcm9jZXNzb3IpOworICBtb25pdG9yLT53cml0ZV9jb3VudCArPSAxOworICBtb25pdG9yLT53cml0ZV9ieXRlX2NvdW50W25yX2J5dGVzXSArPSAxOworICBpZiAoKG5yX2J5dGVzIC0gMSkgJiBlYSkKKyAgICBtb25pdG9yLT51bmFsaWduZWRfd3JpdGVfY291bnQgKz0gMTsKK30KKworSU5MSU5FX01PTlwKKyh2b2lkKQorbW9uX2V2ZW50KG1vbl9ldmVudHMgZXZlbnQsCisJICBjcHUgKnByb2Nlc3NvciwKKwkgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBjcHVfbW9uICptb25pdG9yID0gY3B1X21vbml0b3IocHJvY2Vzc29yKTsKKyAgQVNTRVJUKGV2ZW50IDwgbnJfbW9uX2V2ZW50cyk7CisgIG1vbml0b3ItPmV2ZW50X2NvdW50W2V2ZW50XSArPSAxOworfQorCitJTkxJTkVfTU9OXAorKHVuc2lnbmVkKQorbW9uX2dldF9udW1iZXJfb2ZfaW5zbnMobW9uICptb25pdG9yLAorCQkJaW50IGNwdV9ucikKK3sKKyAgaXRhYmxlX2luZGV4IGluZGV4OworICB1bnNpZ25lZCB0b3RhbF9pbnNucyA9IDA7CisgIEFTU0VSVChjcHVfbnIgPj0gMCAmJiBjcHVfbnIgPCBtb25pdG9yLT5ucl9jcHVzKTsgCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5yX2l0YWJsZV9lbnRyaWVzOyBpbmRleCsrKQorICAgIHRvdGFsX2luc25zICs9IG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0uaXNzdWVfY291bnRbaW5kZXhdOworICByZXR1cm4gdG90YWxfaW5zbnM7Cit9CisKK1NUQVRJQ19JTkxJTkVfTU9OXAorKGludCkKK21vbl9zb3J0X2luc3RydWN0aW9uX25hbWVzKGNvbnN0IHZvaWQgKnB0cl9hLCBjb25zdCB2b2lkICpwdHJfYikKK3sKKyAgaXRhYmxlX2luZGV4IGEgPSAqKGNvbnN0IGl0YWJsZV9pbmRleCAqKXB0cl9hOworICBpdGFibGVfaW5kZXggYiA9ICooY29uc3QgaXRhYmxlX2luZGV4ICopcHRyX2I7CisKKyAgcmV0dXJuIHN0cmNtcCAoaXRhYmxlW2FdLm5hbWUsIGl0YWJsZVtiXS5uYW1lKTsKK30KKworU1RBVElDX0lOTElORV9NT05cCisoY2hhciAqKQorbW9uX2FkZF9jb21tYXMoY2hhciAqYnVmLAorCSAgICAgICBpbnQgc2l6ZW9mX2J1ZiwKKwkgICAgICAgY291bnRfdHlwZSB2YWx1ZSkKK3sKKyAgaW50IGNvbW1hID0gMzsKKyAgY2hhciAqZW5kYnVmID0gYnVmICsgc2l6ZW9mX2J1ZiAtIDE7CisKKyAgKi0tZW5kYnVmID0gJ1wwJzsKKyAgZG8geworICAgIGlmIChjb21tYS0tID09IDApCisgICAgICB7CisJKi0tZW5kYnVmID0gJywnOworCWNvbW1hID0gMjsKKyAgICAgIH0KKworICAgICotLWVuZGJ1ZiA9ICh2YWx1ZSAlIDEwKSArICcwJzsKKyAgfSB3aGlsZSAoKHZhbHVlIC89IDEwKSAhPSAwKTsKKworICBBU1NFUlQoZW5kYnVmID49IGJ1Zik7CisgIHJldHVybiBlbmRidWY7Cit9CisKKworSU5MSU5FX01PTlwKKyh2b2lkKQorbW9uX3ByaW50X2luZm8ocHNpbSAqc3lzdGVtLAorCSAgICAgICBtb24gKm1vbml0b3IsCisJICAgICAgIGludCB2ZXJib3NlKQoreworICBjaGFyIGJ1ZmZlclsyMF07CisgIGNoYXIgYnVmZmVyMVsyMF07CisgIGNoYXIgYnVmZmVyMlsyMF07CisgIGNoYXIgYnVmZmVyNFsyMF07CisgIGNoYXIgYnVmZmVyOFsyMF07CisgIGludCBjcHVfbnI7CisgIGludCBsZW5fY3B1OworICBpbnQgbGVuX251bSA9IDA7CisgIGludCBsZW5fc3ViX251bVtNQVhfQllURV9SRUFEV1JJVEVdOworICBpbnQgbGVuOworICBpbnQgaTsKKyAgbG9uZyB0b3RhbF9pbnNucyA9IDA7CisgIGxvbmcgY3B1X2luc25zX3NlY29uZCA9IDA7CisgIGxvbmcgdG90YWxfc2ltX2N5Y2xlcyA9IDA7CisgIGxvbmcgc2ltX2N5Y2xlc19zZWNvbmQgPSAwOworICBkb3VibGUgY3B1X3RpbWUgPSAwLjA7CisKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9CWVRFX1JFQURXUklURTsgaSsrKQorICAgIGxlbl9zdWJfbnVtW2ldID0gMDsKKworICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IG1vbml0b3ItPm5yX2NwdXM7IGNwdV9ucisrKSB7CisgICAgY291bnRfdHlwZSBudW1faW5zbnMgPSBtb25fZ2V0X251bWJlcl9vZl9pbnNucyhtb25pdG9yLCBjcHVfbnIpOworCisgICAgdG90YWxfaW5zbnMgKz0gbnVtX2luc25zOworICAgIGxlbiA9IHN0cmxlbiAobW9uX2FkZF9jb21tYXMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgbnVtX2luc25zKSk7CisgICAgaWYgKGxlbl9udW0gPCBsZW4pCisgICAgICBsZW5fbnVtID0gbGVuOworCisgICAgZm9yIChpID0gMDsgaSA8PSBNQVhfU0hJRlRfUkVBRFdSSVRFOyBpKyspIHsKKyAgICAgIGludCBzaXplID0gMTw8aTsKKyAgICAgIGxlbiA9IHN0cmxlbiAobW9uX2FkZF9jb21tYXMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKwkJCQkgICBtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLnJlYWRfYnl0ZV9jb3VudFtzaXplXSkpOworICAgICAgaWYgKGxlbl9zdWJfbnVtW3NpemVdIDwgbGVuKQorCWxlbl9zdWJfbnVtW3NpemVdID0gbGVuOworCisgICAgICBsZW4gPSBzdHJsZW4gKG1vbl9hZGRfY29tbWFzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisJCQkJICAgbW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS53cml0ZV9ieXRlX2NvdW50W3NpemVdKSk7CisgICAgICBpZiAobGVuX3N1Yl9udW1bc2l6ZV0gPCBsZW4pCisJbGVuX3N1Yl9udW1bc2l6ZV0gPSBsZW47CisgICAgfQorICB9CisKKyAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCAoaW50KW1vbml0b3ItPm5yX2NwdXMgKyAxKTsKKyAgbGVuX2NwdSA9IHN0cmxlbiAoYnVmZmVyKTsKKworI2lmZGVmIEhBVkVfR0VUUlVTQUdFCisgIHsKKyAgICBzdHJ1Y3QgcnVzYWdlIG15dGltZTsKKyAgICBpZiAoZ2V0cnVzYWdlIChSVVNBR0VfU0VMRiwgJm15dGltZSkgPT0gMAorCSYmIChteXRpbWUucnVfdXRpbWUudHZfc2VjID4gMCB8fCBteXRpbWUucnVfdXRpbWUudHZfdXNlYyA+IDApKSB7CisgICAgICAKKyAgICAgIGNwdV90aW1lID0gKGRvdWJsZSlteXRpbWUucnVfdXRpbWUudHZfc2VjICsgKCgoZG91YmxlKW15dGltZS5ydV91dGltZS50dl91c2VjKSAvIDEwMDAwMDAuMCk7CisgICAgfQorICB9CisgIGlmIChXSVRIX0VWRU5UUykKKyAgICB0b3RhbF9zaW1fY3ljbGVzID0gZXZlbnRfcXVldWVfdGltZShwc2ltX2V2ZW50X3F1ZXVlKHN5c3RlbSkpIC0gMTsKKyAgaWYgKGNwdV90aW1lID4gMCkgeworICAgIGlmICh0b3RhbF9pbnNucyA+IDApCisgICAgICBjcHVfaW5zbnNfc2Vjb25kID0gKGxvbmcpKCgoZG91YmxlKXRvdGFsX2luc25zIC8gY3B1X3RpbWUpICsgMC41KTsKKyAgICBpZiAodG90YWxfc2ltX2N5Y2xlcykgeworICAgICAgc2ltX2N5Y2xlc19zZWNvbmQgPSAobG9uZykoKChkb3VibGUpdG90YWxfc2ltX2N5Y2xlcyAvIGNwdV90aW1lKSArIDAuNSk7CisgICAgfQorICB9CisjZW5kaWYKKworICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IG1vbml0b3ItPm5yX2NwdXM7IGNwdV9ucisrKSB7CisKKyAgICBpZiAodmVyYm9zZSA+IDEpIHsKKyAgICAgIGl0YWJsZV9pbmRleCBzb3J0X2luc25zW25yX2l0YWJsZV9lbnRyaWVzXTsKKyAgICAgIGludCBucl9zb3J0X2luc25zID0gMDsKKyAgICAgIGl0YWJsZV9pbmRleCBpbmRleDsKKyAgICAgIGludCBpbmRleDI7CisKKyAgICAgIGlmIChjcHVfbnIpCisJcHJpbnRmX2ZpbHRlcmVkICgiXG4iKTsKKworICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnJfaXRhYmxlX2VudHJpZXM7IGluZGV4KyspIHsKKwlpZiAobW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS5pc3N1ZV9jb3VudFtpbmRleF0pIHsKKwkgIHNvcnRfaW5zbnNbbnJfc29ydF9pbnNucysrXSA9IGluZGV4OworCX0KKyAgICAgIH0KKworICAgICAgcXNvcnQoKHZvaWQgKilzb3J0X2luc25zLCBucl9zb3J0X2luc25zLCBzaXplb2Yoc29ydF9pbnNuc1swXSksIG1vbl9zb3J0X2luc3RydWN0aW9uX25hbWVzKTsKKworICAgICAgZm9yIChpbmRleDIgPSAwOyBpbmRleDIgPCBucl9zb3J0X2luc25zOyBpbmRleDIrKykgeworCWluZGV4ID0gc29ydF9pbnNuc1tpbmRleDJdOworCXByaW50Zl9maWx0ZXJlZCgiQ1BVICMlKmQgZXhlY3V0ZWQgJSpzICVzIGluc3RydWN0aW9uJXMuXG4iLAorCQkJbGVuX2NwdSwgY3B1X25yKzEsCisJCQlsZW5fbnVtLCBtb25fYWRkX2NvbW1hcyhidWZmZXIsCisJCQkJCQlzaXplb2YoYnVmZmVyKSwKKwkJCQkJCW1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0uaXNzdWVfY291bnRbaW5kZXhdKSwKKwkJCSAgaXRhYmxlW2luZGV4XS5uYW1lLAorCQkJICAobW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS5pc3N1ZV9jb3VudFtpbmRleF0gPT0gMSkgPyAiIiA6ICJzIik7CisgICAgICB9CisKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuIik7CisgICAgfQorCisgICAgaWYgKENVUlJFTlRfTU9ERUxfSVNTVUUgPiAwKQorICAgICAgeworCW1vZGVsX2RhdGEgKm1vZGVsX3B0ciA9IGNwdV9tb2RlbChwc2ltX2NwdShzeXN0ZW0sIGNwdV9ucikpOworCW1vZGVsX3ByaW50ICpwdHIgPSBtb2RlbF9tb25faW5mbyhtb2RlbF9wdHIpOworCW1vZGVsX3ByaW50ICpvcmlnX3B0ciA9IHB0cjsKKworCXdoaWxlIChwdHIpIHsKKwkgIGlmIChwdHItPmNvdW50KQorCSAgICBwcmludGZfZmlsdGVyZWQoIkNQVSAjJSpkIGV4ZWN1dGVkICUqcyAlcyVzLlxuIiwKKwkJCSAgICBsZW5fY3B1LCBjcHVfbnIrMSwKKwkJCSAgICBsZW5fbnVtLCBtb25fYWRkX2NvbW1hcyhidWZmZXIsCisJCQkJCQkgICAgc2l6ZW9mKGJ1ZmZlciksCisJCQkJCQkgICAgcHRyLT5jb3VudCksCisJCQkgICAgcHRyLT5uYW1lLAorCQkJICAgICgocHRyLT5jb3VudCA9PSAxKQorCQkJICAgICA/IHB0ci0+c3VmZml4X3Npbmd1bGFyCisJCQkgICAgIDogcHRyLT5zdWZmaXhfcGx1cmFsKSk7CisKKwkgIHB0ciA9IHB0ci0+bmV4dDsKKwl9CisKKwltb2RlbF9tb25faW5mb19mcmVlKG1vZGVsX3B0ciwgb3JpZ19wdHIpOworICAgICAgfQorCisgICAgaWYgKG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0ucmVhZF9jb3VudCkKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkNQVSAjJSpkIGV4ZWN1dGVkICUqcyByZWFkJXMgICglKnMgMS1ieXRlLCAlKnMgMi1ieXRlLCAlKnMgNC1ieXRlLCAlKnMgOC1ieXRlKS5cbiIsCisJCSAgICAgICBsZW5fY3B1LCBjcHVfbnIrMSwKKwkJICAgICAgIGxlbl9udW0sIG1vbl9hZGRfY29tbWFzKGJ1ZmZlciwKKwkJCQkJICAgICAgIHNpemVvZihidWZmZXIpLAorCQkJCQkgICAgICAgbW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS5yZWFkX2NvdW50KSwKKwkJICAgICAgIChtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLnJlYWRfY291bnQgPT0gMSkgPyAiIiA6ICJzIiwKKwkJICAgICAgIGxlbl9zdWJfbnVtWzFdLCBtb25fYWRkX2NvbW1hcyhidWZmZXIxLAorCQkJCQkJICAgICAgc2l6ZW9mKGJ1ZmZlcjEpLAorCQkJCQkJICAgICAgbW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS5yZWFkX2J5dGVfY291bnRbMV0pLAorCQkgICAgICAgbGVuX3N1Yl9udW1bMl0sIG1vbl9hZGRfY29tbWFzKGJ1ZmZlcjIsCisJCQkJCQkgICAgICBzaXplb2YoYnVmZmVyMiksCisJCQkJCQkgICAgICBtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLnJlYWRfYnl0ZV9jb3VudFsyXSksCisJCSAgICAgICBsZW5fc3ViX251bVs0XSwgbW9uX2FkZF9jb21tYXMoYnVmZmVyNCwKKwkJCQkJCSAgICAgIHNpemVvZihidWZmZXI0KSwKKwkJCQkJCSAgICAgIG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0ucmVhZF9ieXRlX2NvdW50WzRdKSwKKwkJICAgICAgIGxlbl9zdWJfbnVtWzhdLCBtb25fYWRkX2NvbW1hcyhidWZmZXI4LAorCQkJCQkJICAgICAgc2l6ZW9mKGJ1ZmZlcjgpLAorCQkJCQkJICAgICAgbW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS5yZWFkX2J5dGVfY291bnRbOF0pKTsKKworICAgIGlmIChtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLndyaXRlX2NvdW50KQorICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiQ1BVICMlKmQgZXhlY3V0ZWQgJSpzIHdyaXRlJXMgKCUqcyAxLWJ5dGUsICUqcyAyLWJ5dGUsICUqcyA0LWJ5dGUsICUqcyA4LWJ5dGUpLlxuIiwKKwkJICAgICAgIGxlbl9jcHUsIGNwdV9ucisxLAorCQkgICAgICAgbGVuX251bSwgbW9uX2FkZF9jb21tYXMoYnVmZmVyLAorCQkJCQkgICAgICAgc2l6ZW9mKGJ1ZmZlciksCisJCQkJCSAgICAgICBtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLndyaXRlX2NvdW50KSwKKwkJICAgICAgIChtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLndyaXRlX2NvdW50ID09IDEpID8gIiIgOiAicyIsCisJCSAgICAgICBsZW5fc3ViX251bVsxXSwgbW9uX2FkZF9jb21tYXMoYnVmZmVyMSwKKwkJCQkJCSAgICAgIHNpemVvZihidWZmZXIxKSwKKwkJCQkJCSAgICAgIG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0ud3JpdGVfYnl0ZV9jb3VudFsxXSksCisJCSAgICAgICBsZW5fc3ViX251bVsyXSwgbW9uX2FkZF9jb21tYXMoYnVmZmVyMiwKKwkJCQkJCSAgICAgIHNpemVvZihidWZmZXIyKSwKKwkJCQkJCSAgICAgIG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0ud3JpdGVfYnl0ZV9jb3VudFsyXSksCisJCSAgICAgICBsZW5fc3ViX251bVs0XSwgbW9uX2FkZF9jb21tYXMoYnVmZmVyNCwKKwkJCQkJCSAgICAgIHNpemVvZihidWZmZXI0KSwKKwkJCQkJCSAgICAgIG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0ud3JpdGVfYnl0ZV9jb3VudFs0XSksCisJCSAgICAgICBsZW5fc3ViX251bVs4XSwgbW9uX2FkZF9jb21tYXMoYnVmZmVyOCwKKwkJCQkJCSAgICAgIHNpemVvZihidWZmZXI4KSwKKwkJCQkJCSAgICAgIG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0ud3JpdGVfYnl0ZV9jb3VudFs4XSkpOworCisgICAgaWYgKG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0udW5hbGlnbmVkX3JlYWRfY291bnQpCisgICAgICBwcmludGZfZmlsdGVyZWQgKCJDUFUgIyUqZCBleGVjdXRlZCAlKnMgdW5hbGlnbmVkIHJlYWQlcy5cbiIsCisJCSAgICAgICBsZW5fY3B1LCBjcHVfbnIrMSwKKwkJICAgICAgIGxlbl9udW0sIG1vbl9hZGRfY29tbWFzKGJ1ZmZlciwKKwkJCQkJICAgICAgIHNpemVvZihidWZmZXIpLAorCQkJCQkgICAgICAgbW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS51bmFsaWduZWRfcmVhZF9jb3VudCksCisJCSAgICAgICAobW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS51bmFsaWduZWRfcmVhZF9jb3VudCA9PSAxKSA/ICIiIDogInMiKTsKKworICAgIGlmIChtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLnVuYWxpZ25lZF93cml0ZV9jb3VudCkKKyAgICAgIHByaW50Zl9maWx0ZXJlZCAoIkNQVSAjJSpkIGV4ZWN1dGVkICUqcyB1bmFsaWduZWQgd3JpdGUlcy5cbiIsCisJCSAgICAgICBsZW5fY3B1LCBjcHVfbnIrMSwKKwkJICAgICAgIGxlbl9udW0sIG1vbl9hZGRfY29tbWFzKGJ1ZmZlciwKKwkJCQkJICAgICAgIHNpemVvZihidWZmZXIpLAorCQkJCQkgICAgICAgbW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS51bmFsaWduZWRfd3JpdGVfY291bnQpLAorCQkgICAgICAgKG1vbml0b3ItPmNwdV9tb25pdG9yW2NwdV9ucl0udW5hbGlnbmVkX3dyaXRlX2NvdW50ID09IDEpID8gIiIgOiAicyIpOworICAgIAorICAgIGlmIChtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLmV2ZW50X2NvdW50W21vbl9ldmVudF9pY2FjaGVfbWlzc10pCisgICAgICBwcmludGZfZmlsdGVyZWQgKCJDUFUgIyUqZCBleGVjdXRlZCAlKnMgaWNhY2hlIG1pc3Mlcy5cbiIsCisJCSAgICAgICBsZW5fY3B1LCBjcHVfbnIrMSwKKwkJICAgICAgIGxlbl9udW0sIG1vbl9hZGRfY29tbWFzKGJ1ZmZlciwKKwkJCQkJICAgICAgIHNpemVvZihidWZmZXIpLAorCQkJCQkgICAgICAgbW9uaXRvci0+Y3B1X21vbml0b3JbY3B1X25yXS5ldmVudF9jb3VudFttb25fZXZlbnRfaWNhY2hlX21pc3NdKSwKKwkJICAgICAgIChtb25pdG9yLT5jcHVfbW9uaXRvcltjcHVfbnJdLmV2ZW50X2NvdW50W21vbl9ldmVudF9pY2FjaGVfbWlzc10gPT0gMSkgPyAiIiA6ICJlcyIpOworCisgICAgeworICAgICAgbG9uZyBucl9pbnNucyA9IG1vbl9nZXRfbnVtYmVyX29mX2luc25zKG1vbml0b3IsIGNwdV9ucik7CisgICAgICBpZiAobnJfaW5zbnMgPiAwKQorCXByaW50Zl9maWx0ZXJlZCgiQ1BVICMlKmQgZXhlY3V0ZWQgJSpzIGluc3RydWN0aW9ucyBpbiB0b3RhbC5cbiIsCisJCQlsZW5fY3B1LCBjcHVfbnIrMSwKKwkJCWxlbl9udW0sIG1vbl9hZGRfY29tbWFzKGJ1ZmZlciwKKwkJCQkJCXNpemVvZihidWZmZXIpLAorCQkJCQkJbnJfaW5zbnMpKTsKKyAgICB9CisgIH0KKworICBpZiAodG90YWxfaW5zbnMgPiAwKSB7CisgICAgaWYgKG1vbml0b3ItPm5yX2NwdXMgPiAxKQorICAgICAgcHJpbnRmX2ZpbHRlcmVkKCJcbkFsbCBDUFVzIGV4ZWN1dGVkICVzIGluc3RydWN0aW9ucyBpbiB0b3RhbC5cbiIsCisJCSAgICAgIG1vbl9hZGRfY29tbWFzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHRvdGFsX2luc25zKSk7CisgIH0KKyAgZWxzZSBpZiAodG90YWxfc2ltX2N5Y2xlcyA+IDApIHsKKyAgICBwcmludGZfZmlsdGVyZWQoIlxuU2ltdWxhdG9yIHBlcmZvcm1lZCAlcyBzaW11bGF0aW9uIGN5Y2xlcy5cbiIsCisJCSAgICBtb25fYWRkX2NvbW1hcyhidWZmZXIsIHNpemVvZihidWZmZXIpLCB0b3RhbF9zaW1fY3ljbGVzKSk7CisgIH0KKworICBpZiAoY3B1X2luc25zX3NlY29uZCkKKyAgICBwcmludGZfZmlsdGVyZWQgKCIlc1NpbXVsYXRvciBzcGVlZCB3YXMgJXMgaW5zdHJ1Y3Rpb25zL3NlY29uZC5cbiIsCisJCSAgICAgKG1vbml0b3ItPm5yX2NwdXMgPiAxKSA/ICIiIDogIlxuIiwKKwkJICAgICBtb25fYWRkX2NvbW1hcyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBjcHVfaW5zbnNfc2Vjb25kKSk7CisgIGVsc2UgaWYgKHNpbV9jeWNsZXNfc2Vjb25kKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIlNpbXVsYXRvciBzcGVlZCB3YXMgJXMgc2ltdWxhdGlvbiBjeWNsZXMvc2Vjb25kXG4iLAorCQkgICAgIG1vbl9hZGRfY29tbWFzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHNpbV9jeWNsZXNfc2Vjb25kKSk7CisgIGVsc2UgaWYgKGNwdV90aW1lID4gMC4wKQorICAgIHByaW50Zl9maWx0ZXJlZCAoIiVzU2ltdWxhdG9yIGV4ZWN1dGVkIGZvciAlLjJmIHNlY29uZHNcbiIsCisJCSAgICAgKG1vbml0b3ItPm5yX2NwdXMgPiAxKSA/ICIiIDogIlxuIiwgY3B1X3RpbWUpOworCit9CisKKyNlbmRpZiAvKiBfTU9OX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL21vbi5oIGIvc2ltL3BwYy9tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjY0YjhlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9tb24uaApAQCAtMCwwICsxLDEwOCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfTU9OX0hfCisjZGVmaW5lIF9NT05fSF8KKworI2luY2x1ZGUgImJhc2ljcy5oIgorI2luY2x1ZGUgIml0YWJsZS5oIgorCisvKiBtb25pdG9yL2xvZ2dlcjogY291bnRzIHdoYXQgdGhlIHNpbXVsYXRpb24gaXMgdXAgdG8gKi8KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGNvdW50X3R5cGU7CisKKy8qIEludGVyZmFjdCB0byBtb2RlbCB0byByZXR1cm4gbW9kZWwgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IF9tb2RlbF9wcmludCBtb2RlbF9wcmludDsKK3N0cnVjdCBfbW9kZWxfcHJpbnQgeworICBtb2RlbF9wcmludCAqbmV4dDsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgY29uc3QgY2hhciAqc3VmZml4X3Npbmd1bGFyOworICBjb25zdCBjaGFyICpzdWZmaXhfcGx1cmFsOworICBjb3VudF90eXBlIGNvdW50OworfTsKKworLyogQWRkaXRpb25hbCBldmVudHMgdG8gbW9uaXRvciAqLwordHlwZWRlZiBlbnVtIF9tb25fZXZlbnRzIHsKKyAgbW9uX2V2ZW50X2ljYWNoZV9taXNzLAorICBucl9tb25fZXZlbnRzCit9IG1vbl9ldmVudHM7CisKK3R5cGVkZWYgc3RydWN0IF9tb24gbW9uOwordHlwZWRlZiBzdHJ1Y3QgX2NwdV9tb24gY3B1X21vbjsKKworSU5MSU5FX01PTlwKKyhtb24gKikgbW9uX2NyZWF0ZQorKHZvaWQpOworCitJTkxJTkVfTU9OXAorKGNwdV9tb24gKikgbW9uX2NwdQorKG1vbiAqbW9uaXRvciwKKyBpbnQgY3B1X25yKTsKKworSU5MSU5FX01PTlwKKyh2b2lkKSBtb25faW5pdAorKG1vbiAqbW9uaXRvciwKKyBpbnQgbnJfY3B1cyk7CisKK0lOTElORV9NT05cCisodm9pZCkgbW9uX2lzc3VlCisoaXRhYmxlX2luZGV4IGluZGV4LAorIGNwdSAqcHJvY2Vzc29yLCAKKyB1bnNpZ25lZF93b3JkIGNpYSk7CisKKy8qIE5PVEUgLSB0aGVyZSBpcyBubyBtb25faWxvYWQgLSBpdCBpcyBtYWRlIHJlZHVudGFudCBieSBtb25faXNzdWUoKQorICAgYW5kIGJlc2lkZXMgd2hlbiB0aGUgY3B1J3MgaGF2ZSB0aGVpciBvd24gY2FjaGUsIHRoZSBpbmZvcm1hdGlvbiBpcworICAgd3JvbmcgKi8KKworSU5MSU5FX01PTlwKKyh2b2lkKSBtb25fcmVhZAorKHVuc2lnbmVkX3dvcmQgZWEsCisgdW5zaWduZWRfd29yZCByYSwKKyB1bnNpZ25lZCBucl9ieXRlcywKKyBjcHUgKnByb2Nlc3NvciwKKyB1bnNpZ25lZF93b3JkIGNpYSk7CisKK0lOTElORV9NT05cCisodm9pZCkgbW9uX3dyaXRlCisodW5zaWduZWRfd29yZCBlYSwKKyB1bnNpZ25lZF93b3JkIHJhLAorIHVuc2lnbmVkIG5yX2J5dGVzLAorIGNwdSAqcHJvY2Vzc29yLAorIHVuc2lnbmVkX3dvcmQgY2lhKTsKKworSU5MSU5FX01PTlwKKyh2b2lkKSBtb25fZXZlbnQKKyhtb25fZXZlbnRzIGV2ZW50LAorIGNwdSAqcHJvY2Vzc29yLAorIHVuc2lnbmVkX3dvcmQgY2lhKTsKKworSU5MSU5FX01PTlwKKyh1bnNpZ25lZCkgbW9uX2dldF9udW1iZXJfb2ZfaW5zbnMKKyhtb24gKm1vbml0b3IsCisgaW50IGNwdV9ucik7CisKK0lOTElORV9NT05cCisodm9pZCkgbW9uX3ByaW50X2luZm8KKyhwc2ltICpzeXN0ZW0sCisgbW9uICptb25pdG9yLAorIGludCB2ZXJib3NlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vcHBjL29wdGlvbnMuYyBiL3NpbS9wcGMvb3B0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMzExMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL29wdGlvbnMuYwpAQCAtMCwwICsxLDI0NyBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyAgICAqLworCisjaWZuZGVmIF9PUFRJT05TX0NfCisjZGVmaW5lIF9PUFRJT05TX0NfCisKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJvcHRpb25zLmgiCisKK1NUQVRJQ19JTkxJTkVfT1BUSU9OU1wKKyhjb25zdCBjaGFyICopCitvcHRpb25zX2J5dGVfb3JkZXIgKGludCBvcmRlcikKK3sKKyAgc3dpdGNoIChvcmRlcikgeworICBjYXNlIDA6CQlyZXR1cm4gIjAiOworICBjYXNlIEJJR19FTkRJQU46CXJldHVybiAiQklHX0VORElBTiI7CisgIGNhc2UgTElUVExFX0VORElBTjoJcmV0dXJuICJMSVRUTEVfRU5ESUFOIjsKKyAgfQorCisgIHJldHVybiAiVU5LTk9XTiI7Cit9CisKK1NUQVRJQ19JTkxJTkVfT1BUSU9OU1wKKyhjb25zdCBjaGFyICopCitvcHRpb25zX2VudiAoaW50IGVudikKK3sKKyAgc3dpdGNoIChlbnYpIHsKKyAgY2FzZSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQ6CXJldHVybiAiT1BFUkFUSU5HIjsKKyAgY2FzZSBWSVJUVUFMX0VOVklST05NRU5UOglyZXR1cm4gIlZJUlRVQUwiOworICBjYXNlIFVTRVJfRU5WSVJPTk1FTlQ6CXJldHVybiAiVVNFUiI7CisgIGNhc2UgMDoJCQlyZXR1cm4gIjAiOworICB9CisKKyAgcmV0dXJuICJVTktOT1dOIjsKK30KKworU1RBVElDX0lOTElORV9PUFRJT05TXAorKGNvbnN0IGNoYXIgKikKK29wdGlvbnNfYWxpZ24gKGludCBhbGlnbikKK3sKKyAgc3dpdGNoIChhbGlnbikgeworICBjYXNlIE5PTlNUUklDVF9BTElHTk1FTlQ6CXJldHVybiAiTk9OU1RSSUNUIjsKKyAgY2FzZSBTVFJJQ1RfQUxJR05NRU5UOglyZXR1cm4gIlNUUklDVCI7CisgIGNhc2UgMDoJCQlyZXR1cm4gIjAiOworICB9CisKKyAgcmV0dXJuICJVTktOT1dOIjsKK30KKworU1RBVElDX0lOTElORV9PUFRJT05TXAorKGNvbnN0IGNoYXIgKikKK29wdGlvbnNfZmxvYXQgKGludCBmbG9hdF90eXBlKQoreworICBzd2l0Y2ggKGZsb2F0X3R5cGUpIHsKKyAgY2FzZSBTT0ZUX0ZMT0FUSU5HX1BPSU5UOglyZXR1cm4gIlNPRlRXQVJFIjsKKyAgY2FzZSBIQVJEX0ZMT0FUSU5HX1BPSU5UOglyZXR1cm4gIkhBUkRXQVJFIjsKKyAgfQorCisgIHJldHVybiAiVU5LTk9XTiI7Cit9CisKK1NUQVRJQ19JTkxJTkVfT1BUSU9OU1wKKyhjb25zdCBjaGFyICopCitvcHRpb25zX21vbiAoaW50IG1vbikKK3sKKyAgc3dpdGNoIChtb24pIHsKKyAgY2FzZSBNT05JVE9SX0lOU1RSVUNUSU9OX0lTU1VFfE1PTklUT1JfTE9BRF9TVE9SRV9VTklUOglyZXR1cm4gIkFMTCI7CisgIGNhc2UgTU9OSVRPUl9JTlNUUlVDVElPTl9JU1NVRToJCQkJcmV0dXJuICJJTlNUUlVDVElPTiI7CisgIGNhc2UgTU9OSVRPUl9MT0FEX1NUT1JFX1VOSVQ6CQkJCQlyZXR1cm4gIk1FTU9SWSI7CisgIGNhc2UgMDoJCQkJCQkJcmV0dXJuICIwIjsKKyAgfQorCisgIHJldHVybiAiVU5LTk9XTiI7Cit9CisKK1NUQVRJQ19JTkxJTkVfT1BUSU9OU1wKKyhjb25zdCBjaGFyICopCitvcHRpb25zX2lubGluZSAoaW50IGluKQoreworICBzd2l0Y2ggKGluKSB7CisgIGNhc2UgLyowKi8gMDoJCQkJCXJldHVybiAiMCI7CisgIGNhc2UgLyoxKi8gUkVWRUFMX01PRFVMRToJCQlyZXR1cm4gIlJFVkVBTF9NT0RVTEUiOworICBjYXNlIC8qMiovIElOTElORV9NT0RVTEU6CQkJcmV0dXJuICJJTkxJTkVfTU9EVUxFIjsKKyAgY2FzZSAvKjMqLyBSRVZFQUxfTU9EVUxFfElOTElORV9NT0RVTEU6CXJldHVybiAiUkVWRUFMX01PRFVMRXxJTkxJTkVfTU9EVUxFIjsKKyAgY2FzZSAvKjQqLyBJTkxJTkVfTE9DQUxTOgkJCXJldHVybiAiTE9DQUxTX0lOTElORSI7CisgIGNhc2UgLyo1Ki8gSU5MSU5FX0xPQ0FMU3xSRVZFQUxfTU9EVUxFOglyZXR1cm4gIklOTElORV9MT0NBTFN8UkVWRUFMX01PRFVMRSI7CisgIGNhc2UgLyo2Ki8gSU5MSU5FX0xPQ0FMU3xJTkxJTkVfTU9EVUxFOglyZXR1cm4gIklOTElORV9MT0NBTFN8SU5MSU5FX01PRFVMRSI7CisgIGNhc2UgLyo3Ki8gQUxMX0lOTElORToJCQlyZXR1cm4gIkFMTF9JTkxJTkUiOworICB9CisgIHJldHVybiAiMCI7Cit9CisKKworSU5MSU5FX09QVElPTlNcCisodm9pZCkKK3ByaW50X29wdGlvbnMgKHZvaWQpCit7CisjaWYgZGVmaW5lZChfR05VQ18pICYmIGRlZmluZWQoX19WRVJTSU9OX18pCisgIHByaW50Zl9maWx0ZXJlZCAoIkNvbXBpbGVkIGJ5IEdDQyAlcyBvbiAlcyAlc1xuIiwgX19WRVJTSU9OX18sIF9fREFURV9fLCBfX1RJTUVfXyk7CisjZWxzZQorICBwcmludGZfZmlsdGVyZWQgKCJDb21waWxlZCBvbiAlcyAlc1xuIiwgX19EQVRFX18sIF9fVElNRV9fKTsKKyNlbmRpZgorCisgIHByaW50Zl9maWx0ZXJlZCAoIldJVEhfSE9TVF9CWVRFX09SREVSICAgICA9ICVzXG4iLCBvcHRpb25zX2J5dGVfb3JkZXIgKFdJVEhfSE9TVF9CWVRFX09SREVSKSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIldJVEhfVEFSR0VUX0JZVEVfT1JERVIgICA9ICVzXG4iLCBvcHRpb25zX2J5dGVfb3JkZXIgKFdJVEhfVEFSR0VUX0JZVEVfT1JERVIpKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9YT1JfRU5ESUFOICAgICAgICAgID0gJWRcbiIsIFdJVEhfWE9SX0VORElBTik7CisgIHByaW50Zl9maWx0ZXJlZCAoIldJVEhfQlNXQVAgICAgICAgICAgICAgICA9ICVkXG4iLCBXSVRIX0JTV0FQKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9TTVAgICAgICAgICAgICAgICAgID0gJWRcbiIsIFdJVEhfU01QKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9IT1NUX1dPUkRfQklUU0laRSAgID0gJWRcbiIsIFdJVEhfSE9TVF9XT1JEX0JJVFNJWkUpOworICBwcmludGZfZmlsdGVyZWQgKCJXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPSAlZFxuIiwgV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9FTlZJUk9OTUVOVCAgICAgICAgID0gJXNcbiIsIG9wdGlvbnNfZW52KFdJVEhfRU5WSVJPTk1FTlQpKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9FVkVOVFMgICAgICAgICAgICAgID0gJWRcbiIsIFdJVEhfRVZFTlRTKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9USU1FX0JBU0UgICAgICAgICAgID0gJWRcbiIsIFdJVEhfVElNRV9CQVNFKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9DQUxMQkFDS19NRU1PUlkgICAgID0gJWRcbiIsIFdJVEhfQ0FMTEJBQ0tfTUVNT1JZKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9BTElHTk1FTlQgICAgICAgICAgID0gJXNcbiIsIG9wdGlvbnNfYWxpZ24gKFdJVEhfQUxJR05NRU5UKSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIldJVEhfRkxPQVRJTkdfUE9JTlQgICAgICA9ICVzXG4iLCBvcHRpb25zX2Zsb2F0IChXSVRIX0ZMT0FUSU5HX1BPSU5UKSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIldJVEhfVFJBQ0UgICAgICAgICAgICAgICA9ICVkXG4iLCBXSVRIX1RSQUNFKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9BU1NFUlQgICAgICAgICAgICAgID0gJWRcbiIsIFdJVEhfQVNTRVJUKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9NT04gICAgICAgICAgICAgICAgID0gJXNcbiIsIG9wdGlvbnNfbW9uIChXSVRIX01PTikpOworICBwcmludGZfZmlsdGVyZWQgKCJXSVRIX0RFRkFVTFRfTU9ERUwgICAgICAgPSAlc1xuIiwgbW9kZWxfbmFtZVtXSVRIX0RFRkFVTFRfTU9ERUxdKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiV0lUSF9NT0RFTCAgICAgICAgICAgICAgID0gJXNcbiIsIG1vZGVsX25hbWVbV0lUSF9NT0RFTF0pOworICBwcmludGZfZmlsdGVyZWQgKCJXSVRIX01PREVMX0lTU1VFICAgICAgICAgPSAlZFxuIiwgV0lUSF9NT0RFTF9JU1NVRSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIldJVEhfUkVTRVJWRURfQklUUyAgICAgICA9ICVkXG4iLCBXSVRIX1JFU0VSVkVEX0JJVFMpOworICBwcmludGZfZmlsdGVyZWQgKCJXSVRIX1NURElPICAgICAgICAgICAgICAgPSAlZFxuIiwgV0lUSF9TVERJTyk7CisgIHByaW50Zl9maWx0ZXJlZCAoIldJVEhfUkVHUEFSTSAgICAgICAgICAgICA9ICVkXG4iLCBXSVRIX1JFR1BBUk0pOworICBwcmludGZfZmlsdGVyZWQgKCJXSVRIX1NURENBTEwgICAgICAgICAgICAgPSAlZFxuIiwgV0lUSF9TVERDQUxMKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiREVGQVVMVF9JTkxJTkUgICAgICAgICAgID0gJXNcbiIsIG9wdGlvbnNfaW5saW5lIChERUZBVUxUX0lOTElORSkpOworICBwcmludGZfZmlsdGVyZWQgKCJTSU1fRU5ESUFOX0lOTElORSAgICAgICAgPSAlc1xuIiwgb3B0aW9uc19pbmxpbmUgKFNJTV9FTkRJQU5fSU5MSU5FKSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIkJJVFNfSU5MSU5FICAgICAgICAgICAgICA9ICVzXG4iLCBvcHRpb25zX2lubGluZSAoQklUU19JTkxJTkUpKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiQ1BVX0lOTElORSAgICAgICAgICAgICAgID0gJXNcbiIsIG9wdGlvbnNfaW5saW5lIChDUFVfSU5MSU5FKSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIlZNX0lOTElORSAgICAgICAgICAgICAgICA9ICVzXG4iLCBvcHRpb25zX2lubGluZSAoVk1fSU5MSU5FKSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIkNPUkVfSU5MSU5FICAgICAgICAgICAgICA9ICVzXG4iLCBvcHRpb25zX2lubGluZSAoQ09SRV9JTkxJTkUpKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiRVZFTlRTX0lOTElORSAgICAgICAgICAgID0gJXNcbiIsIG9wdGlvbnNfaW5saW5lIChFVkVOVFNfSU5MSU5FKSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIk1PTl9JTkxJTkUgICAgICAgICAgICAgICA9ICVzXG4iLCBvcHRpb25zX2lubGluZSAoTU9OX0lOTElORSkpOworICBwcmludGZfZmlsdGVyZWQgKCJJTlRFUlJVUFRTX0lOTElORSAgICAgICAgPSAlc1xuIiwgb3B0aW9uc19pbmxpbmUgKElOVEVSUlVQVFNfSU5MSU5FKSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIlJFR0lTVEVSU19JTkxJTkUgICAgICAgICA9ICVzXG4iLCBvcHRpb25zX2lubGluZSAoUkVHSVNURVJTX0lOTElORSkpOworICBwcmludGZfZmlsdGVyZWQgKCJERVZJQ0VfSU5MSU5FICAgICAgICAgICAgPSAlc1xuIiwgb3B0aW9uc19pbmxpbmUgKERFVklDRV9JTkxJTkUpKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiU1BSRUdfSU5MSU5FICAgICAgICAgICAgID0gJXNcbiIsIG9wdGlvbnNfaW5saW5lIChTUFJFR19JTkxJTkUpKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiU0VNQU5USUNTX0lOTElORSAgICAgICAgID0gJXNcbiIsIG9wdGlvbnNfaW5saW5lIChTRU1BTlRJQ1NfSU5MSU5FKSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIklERUNPREVfSU5MSU5FICAgICAgICAgICA9ICVzXG4iLCBvcHRpb25zX2lubGluZSAoSURFQ09ERV9JTkxJTkUpKTsKKyAgcHJpbnRmX2ZpbHRlcmVkICgiT1BUSU9OU19JTkxJTkUgICAgICAgICAgID0gJXNcbiIsIG9wdGlvbnNfaW5saW5lIChPUFRJT05TX0lOTElORSkpOworICBwcmludGZfZmlsdGVyZWQgKCJPU19FTVVMX0lOTElORSAgICAgICAgICAgPSAlc1xuIiwgb3B0aW9uc19pbmxpbmUgKE9TX0VNVUxfSU5MSU5FKSk7CisgIHByaW50Zl9maWx0ZXJlZCAoIlNVUFBPUlRfSU5MSU5FICAgICAgICAgICA9ICVzXG4iLCBvcHRpb25zX2lubGluZSAoU1VQUE9SVF9JTkxJTkUpKTsKKworI2lmZGVmIE9QQ09ERV9SVUxFUworICBwcmludGZfZmlsdGVyZWQgKCJPUENPREUgcnVsZXMgICAgICAgICAgICAgPSAlc1xuIiwgT1BDT0RFX1JVTEVTKTsKKyNlbmRpZgorCisjaWZkZWYgSUdFTl9GTEFHUworICBwcmludGZfZmlsdGVyZWQgKCJJR0VOX0ZMQUdTICAgICAgICAgICAgICAgPSAlc1xuIiwgSUdFTl9GTEFHUyk7CisjZW5kaWYKKworI2lmZGVmIERHRU5fRkxBR1MKKyAgcHJpbnRmX2ZpbHRlcmVkICgiREdFTl9GTEFHUyAgICAgICAgICAgICAgID0gJXNcbiIsIERHRU5fRkxBR1MpOworI2VuZGlmCisKKyAgeworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBkZWZpbmVzW10gPSB7CisjaWZkZWYgX19HTlVDX18KKyAgICAgICJfX0dOVUNfXyIsCisjZW5kaWYKKworI2lmZGVmIF9fU1RSSUNUX0FOU0lfXworICAgICAgIl9fU1RSSUNUX0FOU0lfXyIsCisjZW5kaWYKKworI2lmZGVmIF9fQ0hBUl9VTlNJR05FRF9fCisgICAgICAiX19DSEFSX1VOU0lHTkVEX18iLAorI2VuZGlmCisKKyNpZmRlZiBfX09QVElNSVpFX18KKyAgICAgICJfX09QVElNSVpFX18iLAorI2VuZGlmCisKKyNpZmRlZiBTVERDX0hFQURFUlMKKyAgICAgICJTVERDX0hFQURFUlMiLAorI2VuZGlmCisKKyNpbmNsdWRlICJkZWZpbmVzLmgiCisKKyNpZmRlZiBIQVZFX1RFUk1JT1NfQ0xJTkUKKyAgICAgICJIQVZFX1RFUk1JT1NfQ0xJTkUiLAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1RFUk1JT1NfU1RSVUNUVVJFCisgICAgICAiSEFWRV9URVJNSU9TX1NUUlVDVFVSRSIsCisjZW5kaWYKKworI2lmZGVmIEhBVkVfVEVSTUlPX0NMSU5FCisgICAgICAiSEFWRV9URVJNSU9fQ0xJTkUiLAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1RFUk1JT19TVFJVQ1RVUkUKKyAgICAgICJIQVZFX1RFUk1JT19TVFJVQ1RVUkUiLAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0RFVlpFUk8KKyAgICAgICJIQVZFX0RFVlpFUk8iLAorI2VuZGlmCisgICAgfTsKKworICAgIGludCBpOworICAgIGludCBtYXhfbGVuID0gMDsKKyAgICBpbnQgY29sczsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGRlZmluZXMpIC8gc2l6ZW9mIChkZWZpbmVzWzBdKTsgaSsrKSB7CisgICAgICBpbnQgbGVuID0gc3RybGVuIChkZWZpbmVzW2ldKTsKKyAgICAgIGlmIChsZW4gPiBtYXhfbGVuKQorCW1heF9sZW4gPSBsZW47CisgICAgfQorCisgICAgY29scyA9IDc4IC8gKG1heF9sZW4gKyAyKTsKKyAgICBpZiAoY29scyA8IDApCisgICAgICBjb2xzID0gMTsKKworICAgIHByaW50Zl9maWx0ZXJlZCAoIlxuI2RlZmluZXM6Iik7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoZGVmaW5lcykgLyBzaXplb2YgKGRlZmluZXNbMF0pOyBpKyspIHsKKyAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IHByZWZpeCA9ICgoaSAlIGNvbHMpID09IDApID8gIlxuIiA6ICIiOworICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiJXMgICVzJSpzIiwgcHJlZml4LCBkZWZpbmVzW2ldLAorCQkgICAgICAgKCgoaSA9PSAoc2l6ZW9mIChkZWZpbmVzKSAvIHNpemVvZiAoZGVmaW5lc1swXSkpIC0gMSkKKwkJCSB8fCAoKChpICsgMSkgJSBjb2xzKSA9PSAwKSkKKwkJCT8gMAorCQkJOiBtYXhfbGVuICsgNCAtIHN0cmxlbiAoZGVmaW5lc1tpXSkpLAorCQkgICAgICAgIiIpOworICAgIH0KKyAgICBwcmludGZfZmlsdGVyZWQgKCJcbiIpOworICB9Cit9CisKKyNlbmRpZiAvKiBfT1BUSU9OU19DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9vcHRpb25zLmggYi9zaW0vcHBjL29wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWRiOWViCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9vcHRpb25zLmgKQEAgLTAsMCArMSwzMCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyAgICAqLworCisjaWZuZGVmIF9PUFRJT05TX0hfCisjZGVmaW5lIF9PUFRJT05TX0hfCisKKyNpZm5kZWYgSU5MSU5FX09QVElPTlMKKyNkZWZpbmUgSU5MSU5FX09QVElPTlMKKyNlbmRpZgorCitJTkxJTkVfT1BUSU9OUyh2b2lkKSBwcmludF9vcHRpb25zICh2b2lkKTsKKworI2VuZGlmIC8qIF9PUFRJT05TX0hfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL29zX2VtdWwuYyBiL3NpbS9wcGMvb3NfZW11bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNjBjOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL29zX2VtdWwuYwpAQCAtMCwwICsxLDE0NiBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfT1NfRU1VTF9DXworI2RlZmluZSBfT1NfRU1VTF9DXworCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAiaWRlY29kZS5oIgorI2luY2x1ZGUgIm9zX2VtdWwuaCIKKworI2luY2x1ZGUgImVtdWxfZ2VuZXJpYy5oIgorI2luY2x1ZGUgImVtdWxfbmV0YnNkLmgiCisjaW5jbHVkZSAiZW11bF91bml4LmgiCisjaW5jbHVkZSAiZW11bF9jaGlycC5oIgorI2luY2x1ZGUgImVtdWxfYnVnYXBpLmgiCisKK3N0YXRpYyBjb25zdCBvc19lbXVsICoob3NfZW11bGF0aW9uc1tdKSA9IHsKKyAgJmVtdWxfY2hpcnAsCisgICZlbXVsX2J1Z2FwaSwKKyAgJmVtdWxfbmV0YnNkLAorICAmZW11bF9zb2xhcmlzLAorICAmZW11bF9saW51eCwKKyAgMAorfTsKKworCitJTkxJTkVfT1NfRU1VTFwKKyhvc19lbXVsICopCitvc19lbXVsX2NyZWF0ZShjb25zdCBjaGFyICpmaWxlX25hbWUsCisJICAgICAgIGRldmljZSAqcm9vdCkKK3sKKyAgY29uc3QgY2hhciAqZW11bGF0aW9uX25hbWUgPSBOVUxMOworICBiZmQgKmltYWdlOworICBvc19lbXVsICpjaG9zZW5fZW11bGF0aW9uID0gTlVMTDsKKworICBiZmRfaW5pdCgpOyAvKiB3b3VsZCBuZXZlciBodXJ0ICovCisKKyAgLyogb3BlbiB0aGUgZmlsZSAqLworICBpbWFnZSA9IGJmZF9vcGVucihmaWxlX25hbWUsIE5VTEwpOworICBpZiAoaW1hZ2UgPT0gTlVMTCkgeworICAgIGJmZF9wZXJyb3IoZmlsZV9uYW1lKTsKKyAgICBlcnJvcigibm90aGluZyBsb2FkZWRcbiIpOworICB9CisKKyAgLyogY2hlY2sgaXQgaXMgYW4gZXhlY3V0YWJsZSAqLworICBpZiAoIWJmZF9jaGVja19mb3JtYXQoaW1hZ2UsIGJmZF9vYmplY3QpKSB7CisgICAgVFJBQ0UodHJhY2VfdGJkLAorCSAgKCJGSVhNRSAtIHNob3VsZCBjaGVjayBtb3JlIHRoYW4ganVzdCBiZmRfY2hlY2tfZm9ybWF0XG4iKSk7CisgICAgVFJBQ0UodHJhY2Vfb3NfZW11bCwKKwkgICgiJXMgbm90IGFuIGV4ZWN1dGFibGUsIGFzc3VtZWluZyBhIGRldmljZSBmaWxlXG4iLCBmaWxlX25hbWUpKTsKKyAgICBiZmRfY2xvc2UoaW1hZ2UpOworICAgIGltYWdlID0gTlVMTDsKKyAgfQorCisgIC8qIGlmIGEgZGV2aWNlIGZpbGUsIGxvYWQgdGhhdCBiZWZvcmUgdHJ5aW5nIHRoZSBlbXVsYXRpb25zIG9uICovCisgIGlmIChpbWFnZSA9PSBOVUxMKSB7CisgICAgcHNpbV9tZXJnZV9kZXZpY2VfZmlsZShyb290LCBmaWxlX25hbWUpOworICB9CisKKyAgLyogc2VlIGlmIHRoZSBkZXZpY2UgdHJlZSBhbHJlYWR5IHNwZWNpZmllcyB0aGUgcmVxdWlyZWQgZW11bGF0aW9uICovCisgIGlmICh0cmVlX2ZpbmRfcHJvcGVydHkocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL29zLWVtdWwiKSAhPSBOVUxMKQorICAgIGVtdWxhdGlvbl9uYW1lID0KKyAgICAgIHRyZWVfZmluZF9zdHJpbmdfcHJvcGVydHkocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL29zLWVtdWwiKTsKKyAgZWxzZQorICAgIGVtdWxhdGlvbl9uYW1lID0gTlVMTDsKKworICAvKiBnbyB0aHJvdWdoIGVhY2ggZW11bGF0aW9uIHRvIHNlZSBpZiB0aGV5IHJlY29uaXplIGl0LiBGSVhNRSAtCisgICAgIHNob3VsZCBoYXZlIHNvbWUgc29ydCBvZiBpbXBvcnRlZCB0YWJsZSBmcm9tIGEgc2VwYXJhdGUgZmlsZSAqLworICB7CisgICAgb3NfZW11bF9kYXRhICplbXVsX2RhdGE7CisgICAgY29uc3Qgb3NfZW11bCAqKnBvc3NpYmxlX2VtdWxhdGlvbjsKKyAgICBjaG9zZW5fZW11bGF0aW9uID0gTlVMTDsKKyAgICBmb3IgKHBvc3NpYmxlX2VtdWxhdGlvbiA9IG9zX2VtdWxhdGlvbnMsIGVtdWxfZGF0YSA9IE5VTEw7CisJICpwb3NzaWJsZV9lbXVsYXRpb24gIT0gTlVMTCAmJiBlbXVsX2RhdGEgPT0gTlVMTDsKKwkgcG9zc2libGVfZW11bGF0aW9uKyspIHsKKyAgICAgIGVtdWxfZGF0YSA9ICgqcG9zc2libGVfZW11bGF0aW9uKS0+Y3JlYXRlKHJvb3QsCisJCQkJCQlpbWFnZSwKKwkJCQkJCWVtdWxhdGlvbl9uYW1lKTsKKyAgICAgIGlmIChlbXVsX2RhdGEgIT0gTlVMTCkgeworCWNob3Nlbl9lbXVsYXRpb24gPSBaQUxMT0Mob3NfZW11bCk7CisJKmNob3Nlbl9lbXVsYXRpb24gPSAqKnBvc3NpYmxlX2VtdWxhdGlvbjsKKwljaG9zZW5fZW11bGF0aW9uLT5kYXRhID0gZW11bF9kYXRhOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGNsZWFuIHVwICovCisgIGlmIChpbWFnZSAhPSBOVUxMKQorICAgIGJmZF9jbG9zZShpbWFnZSk7CisgIHJldHVybiBjaG9zZW5fZW11bGF0aW9uOworfQorCitJTkxJTkVfT1NfRU1VTFwKKyh2b2lkKQorb3NfZW11bF9pbml0KG9zX2VtdWwgKmVtdWxhdGlvbiwKKwkgICAgIGludCBucl9jcHVzKQoreworICBpZiAoZW11bGF0aW9uICE9IChvc19lbXVsKikwKQorICAgIGVtdWxhdGlvbi0+aW5pdChlbXVsYXRpb24tPmRhdGEsIG5yX2NwdXMpOworfQorCitJTkxJTkVfT1NfRU1VTFwKKyh2b2lkKQorb3NfZW11bF9zeXN0ZW1fY2FsbChjcHUgKnByb2Nlc3NvciwKKwkJICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBvc19lbXVsICplbXVsYXRpb24gPSBjcHVfb3NfZW11bGF0aW9uKHByb2Nlc3Nvcik7CisgIGlmIChlbXVsYXRpb24gIT0gKG9zX2VtdWwqKTAgJiYgZW11bGF0aW9uLT5zeXN0ZW1fY2FsbCAhPSAwKQorICAgIGVtdWxhdGlvbi0+c3lzdGVtX2NhbGwocHJvY2Vzc29yLCBjaWEsIGVtdWxhdGlvbi0+ZGF0YSk7CisgIGVsc2UKKyAgICBlcnJvcigiU3lzdGVtIGNhbGwgZW11bGF0aW9uIG5vdCBhdmFpbGFibGVcbiIpOworfQorCitJTkxJTkVfT1NfRU1VTFwKKyhpbnQpCitvc19lbXVsX2luc3RydWN0aW9uX2NhbGwoY3B1ICpwcm9jZXNzb3IsCisJCQkgdW5zaWduZWRfd29yZCBjaWEsCisJCQkgdW5zaWduZWRfd29yZCByYSkKK3sKKyAgb3NfZW11bCAqZW11bGF0aW9uID0gY3B1X29zX2VtdWxhdGlvbihwcm9jZXNzb3IpOworICBpZiAoZW11bGF0aW9uICE9IChvc19lbXVsKikwICYmIGVtdWxhdGlvbi0+aW5zdHJ1Y3Rpb25fY2FsbCAhPSAwKQorICAgIHJldHVybiBlbXVsYXRpb24tPmluc3RydWN0aW9uX2NhbGwocHJvY2Vzc29yLCBjaWEsIHJhLCBlbXVsYXRpb24tPmRhdGEpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKKworI2VuZGlmIC8qIF9PU19FTVVMX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL29zX2VtdWwuaCBiL3NpbS9wcGMvb3NfZW11bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNzRlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL29zX2VtdWwuaApAQCAtMCwwICsxLDYwIEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIF9PU19FTVVMX0hfCisjZGVmaW5lIF9PU19FTVVMX0hfCisKK3R5cGVkZWYgc3RydWN0IF9vc19lbXVsIG9zX2VtdWw7CisKK0lOTElORV9PU19FTVVMXAorKG9zX2VtdWwgKikgb3NfZW11bF9jcmVhdGUKKyhjb25zdCBjaGFyICpmaWxlX25hbWUsCisgZGV2aWNlICpyb290KTsKKworSU5MSU5FX09TX0VNVUxcCisodm9pZCkgb3NfZW11bF9pbml0Cisob3NfZW11bCAqZW11bGF0aW9uLAorIGludCBucl9jcHVzKTsKKworCisvKiBTeXN0ZW0tY2FsbCBlbXVsYXRpb24gLSBmb3IgdXNlciBjb2RlLiAgSW5zdGVhZCBvZiB0cmFwcGluZyBzeXN0ZW0KKyAgIGNhbGxzIHRvIGtlcm5lbCBtb2RlLCB0aGUgc2ltdWxhdG9yIGVtdWxhdGVzIHRoZSBrZXJuZWxzIGJlaGF2b3VyICovCisKK0lOTElORV9PU19FTVVMXAorKHZvaWQpIG9zX2VtdWxfc3lzdGVtX2NhbGwKKyhjcHUgKnByb2Nlc3NvciwKKyB1bnNpZ25lZF93b3JkIGNpYSk7CisKKworLyogSW5zdHJ1Y3Rpb24gZW11bGF0aW9uIC0gZm9yIGtlcm5lbCBjb2RlLiAgRXh0cmEgKG5vcm1hbGx5IGlsbGVnYWwpCisgICBpbnN0cnVjdGlvbnMgYXJlIGFkZGVkIHRvIHRoZSBpbnN0cnVjdGlvbiB0YWJsZSB0aGF0IHdoZW4gZXhlY3V0ZWQKKyAgIGNhbGwgdGhpcyBlbXVsYXRpb24gZnVuY3Rpb24uIFRoZSBpbnN0cnVjdGlvbiBjYWxsIGVtdWxhdG9yIHNob3VsZAorICAgdmVyaWZ5IHRoZSBhZGRyZXNzIHRoYXQgdGhlIGluc3RydWN0aW9uIGFwcGVhcnMgYmVmb3JlIGVtdWxhdGluZworICAgdGhlIHJlcXVpcmVkIGJlaGF2b3VyLiAgSWYgdGhlIHZlcmlmaWNhdGlvbiBmYWlscywgYSB6ZXJvIHZhbHVlCisgICBzaG91bGQgYmUgcmV0dXJuZWQgKGluZGljYXRpbmcgaW5zdHJ1Y3Rpb24gaWxsZWdhbCkuICovCisKK0lOTElORV9PU19FTVVMXAorKGludCkgb3NfZW11bF9pbnN0cnVjdGlvbl9jYWxsCisoY3B1ICpwcm9jZXNzb3IsCisgdW5zaWduZWRfd29yZCBjaWEsCisgdW5zaWduZWRfd29yZCByYSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9wa19kaXNrbGFiZWwuYyBiL3NpbS9wcGMvcGtfZGlza2xhYmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkY2Y3YwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvcGtfZGlza2xhYmVsLmMKQEAgLTAsMCArMSw0MDEgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorICAgIAorICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorICAgIAorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAgCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgICAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAgICAKKyAgICAqLworCisKKyNpZm5kZWYgX1BLX0RJU0tMQUJFTF9DXworI2RlZmluZSBfUEtfRElTS0xBQkVMX0NfCisKKyNpZm5kZWYgU1RBVElDX0lOTElORV9QS19ESVNLTEFCRUwKKyNkZWZpbmUgU1RBVElDX0lOTElORV9QS19ESVNLTEFCRUwgU1RBVElDX0lOTElORQorI2VuZGlmCisKKyNpbmNsdWRlICJkZXZpY2VfdGFibGUuaCIKKworI2luY2x1ZGUgInBrLmgiCisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworCisKKy8qIFBBQ0tBR0UKKworICAgZGlzay1sYWJlbCAtIGFsbCBrbm93aW5nIGRpc2sgSS9PIHBhY2thZ2UKKworICAgREVTQ1JJUFRJT04KKworICAgVGhlIGRpc2stbGFiZWwgcGFja2FnZSBwcm92aWRlcyBhIGdlbmVyaWMgaW50ZXJmYWNlIHRvIGRpc2sKKyAgIGRldmljZXMuICBJdCB1c2VzIHRoZSBhcmd1bWVudHMgc3BlY2lmaWVkIHdoZW4gYW4gaW5zdGFuY2UgaXMgYmVpbmcKKyAgIGNyZWF0ZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSByYXcgZGlzaywgYSBwYXJ0aXRpb24sIG9yIGEgZmlsZSB3aXRoaW4KKyAgIGEgcGFydGl0aW9uIHNob3VsZCBiZSBvcGVuZWQuCisKKyAgIEFuIGluc3RhbmNlIGNyZWF0ZSBjYWxsIHRvIGRpc2stbGFiZWwgY291bGQgcmVzdWx0LCBmb3IgaW5zdGFuY2UsCisgICBpbiB0aGUgb3BlbmluZyBvZiBhIERPUyBmaWxlIHN5c3RlbSBjb250YWluZWQgd2l0aGluIGEgZG9zCisgICBwYXJ0aXRpb24gY29udGFpbmVkIHdpdGhpbiBhIHBoeXNpY2FsIGRpc2suCisKKyAgICovCisKKy8qIHRha2VuIGZyb20gYmZkL3BwY2Jvb3QuYyBieSBNaWNoYWVsIE1laXNzbmVyICovCisKKy8qIFBQQ2J1ZyBsb2NhdGlvbiBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHBwY2Jvb3RfbG9jYXRpb24geworICB1bnNpZ25lZDggaW5kOworICB1bnNpZ25lZDggaGVhZDsKKyAgdW5zaWduZWQ4IHNlY3RvcjsKKyAgdW5zaWduZWQ4IGN5bGluZGVyOworfSBwcGNib290X2xvY2F0aW9uX3Q7CisKKy8qIFBQQ2J1ZyBwYXJ0aXRpb24gdGFibGUgbGF5b3V0ICovCit0eXBlZGVmIHN0cnVjdCBwcGNib290X3BhcnRpdGlvbiB7CisgIHBwY2Jvb3RfbG9jYXRpb25fdCBwYXJ0aXRpb25fYmVnaW47CS8qIHBhcnRpdGlvbiBiZWdpbiAqLworICBwcGNib290X2xvY2F0aW9uX3QgcGFydGl0aW9uX2VuZDsJLyogcGFydGl0aW9uIGVuZCAqLworICB1bnNpZ25lZDggc2VjdG9yX2JlZ2luWzRdOwkJLyogMzItYml0IHN0YXJ0IFJCQSAoemVyby1iYXNlZCksIGxpdHRsZSBlbmRpYW4gKi8KKyAgdW5zaWduZWQ4IHNlY3Rvcl9sZW5ndGhbNF07CQkvKiAzMi1iaXQgUkJBIGNvdW50IChvbmUtYmFzZWQpLCBsaXR0bGUgZW5kaWFuICovCit9IHBwY2Jvb3RfcGFydGl0aW9uX3Q7CisKKyNpZiAwCisvKiBQUENidWcgYm9vdCBsYXlvdXQuICAqLwordHlwZWRlZiBzdHJ1Y3QgcHBjYm9vdF9oZHIgeworICB1bnNpZ25lZDgJCXBjX2NvbXBhdGliaWxpdHlbNDQ2XTsJLyogeDg2IGluc3RydWN0aW9uIGZpZWxkICovCisgIHBwY2Jvb3RfcGFydGl0aW9uX3QJcGFydGl0aW9uWzRdOwkJLyogcGFydGl0aW9uIGluZm9ybWF0aW9uICovCisgIHVuc2lnbmVkOAkJc2lnbmF0dXJlWzJdOwkJLyogMHg1NSBhbmQgMHhhYSAqLworICB1bnNpZ25lZDgJCWVudHJ5X29mZnNldFs0XTsJLyogZW50cnkgcG9pbnQgb2Zmc2V0LCBsaXR0bGUgZW5kaWFuICovCisgIHVuc2lnbmVkOAkJbGVuZ3RoWzRdOwkJLyogbG9hZCBpbWFnZSBsZW5ndGgsIGxpdHRsZSBlbmRpYW4gKi8KKyAgdW5zaWduZWQ4CQlmbGFnczsJCQkvKiBmbGFnIGZpZWxkICovCisgIHVuc2lnbmVkOAkJb3NfaWQ7CQkJLyogT1NfSUQgKi8KKyAgY2hhcgkJCXBhcnRpdGlvbl9uYW1lWzMyXTsJLyogcGFydGl0aW9uIG5hbWUgKi8KKyAgdW5zaWduZWQ4CQlyZXNlcnZlZDFbNDcwXTsJCS8qIHJlc2VydmVkICovCit9IHBwY2Jvb3RfaGRyX3Q7CisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCBfZGlza2xhYmVsIHsKKyAgZGV2aWNlX2luc3RhbmNlICpwYXJlbnQ7CisgIGRldmljZV9pbnN0YW5jZSAqcmF3X2Rpc2s7CisgIHVuc2lnbmVkX3dvcmQgcG9zOworICB1bnNpZ25lZF93b3JkIHNlY3Rvcl9iZWdpbjsKKyAgdW5zaWduZWRfd29yZCBzZWN0b3JfbGVuZ3RoOworfSBkaXNrbGFiZWw7CisKKworc3RhdGljIHVuc2lnbmVkX3dvcmQKK3NlY3RvcjJ1dyh1bnNpZ25lZDggc1s0XSkKK3sKKyAgcmV0dXJuICgoc1szXSA8PCAyNCkKKwkgICsgKHNbMl0gPDwgMTYpCisJICArIChzWzFdIDw8IDgpCisJICArIChzWzBdIDw8IDApKTsKK30KKworCitzdGF0aWMgdm9pZAorZGlza2xhYmVsX2RlbGV0ZShkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlKQoreworICBkaXNrbGFiZWwgKmxhYmVsID0gZGV2aWNlX2luc3RhbmNlX2RhdGEoaW5zdGFuY2UpOworICBkZXZpY2VfaW5zdGFuY2VfZGVsZXRlKGxhYmVsLT5yYXdfZGlzayk7CisgIHpmcmVlKGxhYmVsKTsKK30KKworCitzdGF0aWMgaW50CitkaXNrbGFiZWxfcmVhZChkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlLAorCSAgICAgICB2b2lkICpidWYsCisJICAgICAgIHVuc2lnbmVkX3dvcmQgbGVuKQoreworICBkaXNrbGFiZWwgKmxhYmVsID0gZGV2aWNlX2luc3RhbmNlX2RhdGEoaW5zdGFuY2UpOworICBpbnQgbnJfcmVhZDsKKyAgaWYgKGxhYmVsLT5wb3MgKyBsZW4gPiBsYWJlbC0+c2VjdG9yX2xlbmd0aCkKKyAgICBsZW4gPSBsYWJlbC0+c2VjdG9yX2xlbmd0aCAtIGxhYmVsLT5wb3M7CisgIGlmIChkZXZpY2VfaW5zdGFuY2Vfc2VlayhsYWJlbC0+cmF3X2Rpc2ssIDAsCisJCQkgICBsYWJlbC0+c2VjdG9yX2JlZ2luICsgbGFiZWwtPnBvcykgPCAwKQorICAgIHJldHVybiAtMTsKKyAgbnJfcmVhZCA9IGRldmljZV9pbnN0YW5jZV9yZWFkKGxhYmVsLT5yYXdfZGlzaywgYnVmLCBsZW4pOworICBpZiAobnJfcmVhZCA+IDApCisgICAgbGFiZWwtPnBvcyArPSBucl9yZWFkOworICByZXR1cm4gbnJfcmVhZDsKK30KKworc3RhdGljIGludAorZGlza2xhYmVsX3dyaXRlKGRldmljZV9pbnN0YW5jZSAqaW5zdGFuY2UsCisJCWNvbnN0IHZvaWQgKmJ1ZiwKKwkJdW5zaWduZWRfd29yZCBsZW4pCit7CisgIGRpc2tsYWJlbCAqbGFiZWwgPSBkZXZpY2VfaW5zdGFuY2VfZGF0YShpbnN0YW5jZSk7CisgIGludCBucl93cml0dGVuOworICBpZiAobGFiZWwtPnBvcyArIGxlbiA+IGxhYmVsLT5zZWN0b3JfbGVuZ3RoKQorICAgIGxlbiA9IGxhYmVsLT5zZWN0b3JfbGVuZ3RoIC0gbGFiZWwtPnBvczsKKyAgaWYgKGRldmljZV9pbnN0YW5jZV9zZWVrKGxhYmVsLT5yYXdfZGlzaywgMCwKKwkJCSAgIGxhYmVsLT5zZWN0b3JfYmVnaW4gKyBsYWJlbC0+cG9zKSA8IDApCisgICAgcmV0dXJuIC0xOworICBucl93cml0dGVuID0gZGV2aWNlX2luc3RhbmNlX3dyaXRlKGxhYmVsLT5yYXdfZGlzaywgYnVmLCBsZW4pOworICBpZiAobnJfd3JpdHRlbiA+IDApCisgICAgbGFiZWwtPnBvcyArPSBucl93cml0dGVuOworICByZXR1cm4gbnJfd3JpdHRlbjsKK30KKworc3RhdGljIGludAorZGlza2xhYmVsX3NlZWsoZGV2aWNlX2luc3RhbmNlICppbnN0YW5jZSwKKwkgICAgICAgdW5zaWduZWRfd29yZCBwb3NfaGksCisJICAgICAgIHVuc2lnbmVkX3dvcmQgcG9zX2xvKQoreworICBkaXNrbGFiZWwgKmxhYmVsID0gZGV2aWNlX2luc3RhbmNlX2RhdGEoaW5zdGFuY2UpOworICBpZiAocG9zX2xvID49IGxhYmVsLT5zZWN0b3JfbGVuZ3RoIHx8IHBvc19oaSAhPSAwKQorICAgIHJldHVybiAtMTsKKyAgbGFiZWwtPnBvcyA9IHBvc19sbzsKKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGNvbnN0IGRldmljZV9pbnN0YW5jZV9jYWxsYmFja3MgcGFja2FnZV9kaXNrbGFiZWxfY2FsbGJhY2tzID0geworICBkaXNrbGFiZWxfZGVsZXRlLAorICBkaXNrbGFiZWxfcmVhZCwKKyAgZGlza2xhYmVsX3dyaXRlLAorICBkaXNrbGFiZWxfc2VlaywKK307CisKKy8qIFJlY29uaXplIGRpZmZlcmVudCB0eXBlcyBvZiBib290IGJsb2NrICovCisKK3N0YXRpYyBpbnQKK2Jsb2NrMF9pc19icGIoY29uc3QgdW5zaWduZWQ4IGJsb2NrW10pCit7CisgIGNvbnN0IGNoYXIgZWJkaWNfaWJtYVtdID0geyAweGM5LCAweGMyLCAweGQ0LCAweGMxIH07CisgIC8qIHJlZiBQb3dlclBDIE1pY3JvcHJvY2Vzc29yIENIUlAgYmluZGluZ3MgMS4yYiAtIHBhZ2UgNDcgKi8KKyAgLyogY2FuJ3Qgc3RhcnQgd2l0aCBJQk1BICovCisgIGlmIChtZW1jbXAoYmxvY2ssIGViZGljX2libWEsIHNpemVvZihlYmRpY19pYm1hKSkgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgLyogbXVzdCBoYXZlIExFIDB4QUE1NSBzaWduYXR1cmUgYXQgb2Zmc2V0IDUxMCAqLworICBpZiAoYmxvY2tbNTExXSAhPSAweEFBICYmIGJsb2NrWzUxMF0gIT0gMHg1NSkKKyAgICByZXR1cm4gMDsKKyAgLyogdmFsaWQgMTYgYml0IExFIGJ5dGVzIHBlciBzZWN0b3IgLSAyNTYsIDUxMiwgMTAyNCAqLworICBpZiAoYmxvY2tbMTFdICE9IDAKKyAgICAgIHx8IChibG9ja1sxMl0gIT0gMSAmJiBibG9ja1sxMl0gIT0gMiAmJiBibG9ja1sxMl0gIT0gNCkpCisgICAgcmV0dXJuIDA7CisgIC8qIG5yIGZhdHMgaXMgMSBvciAyICovCisgIGlmIChibG9ja1sxNl0gIT0gMSAmJiBibG9ja1sxNl0gIT0gMikKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKKworLyogVmVyaWZ5IHRoYXQgdGhlIGRldmljZSBjb250YWlucyBhbiBJU08tOTY2MCBGaWxlIHN5c3RlbSAqLworCitzdGF0aWMgaW50Citpc19pc285NjYwKGRldmljZV9pbnN0YW5jZSAqcmF3X2Rpc2spCit7CisgIC8qIHJlZiBQb3dlclBDIE1pY3JvcHJvY2Vzc29yIENIUlAgYmluZGluZ3MgMS4yYiAtIHBhZ2UgNDcgKi8KKyAgdW5zaWduZWQ4IGJsb2NrWzUxMl07CisgIGlmIChkZXZpY2VfaW5zdGFuY2Vfc2VlayhyYXdfZGlzaywgMCwgNTEyICogNjQpIDwgMCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGRldmljZV9pbnN0YW5jZV9yZWFkKHJhd19kaXNrLCBibG9jaywgc2l6ZW9mKGJsb2NrKSkgIT0gc2l6ZW9mKGJsb2NrKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGJsb2NrWzBdID09IDB4MDEKKyAgICAgICYmIGJsb2NrWzFdID09ICdDJworICAgICAgJiYgYmxvY2tbMl0gPT0gJ0QnCisgICAgICAmJiBibG9ja1szXSA9PSAnMCcKKyAgICAgICYmIGJsb2NrWzRdID09ICcwJworICAgICAgJiYgYmxvY2tbNV0gPT0gJzEnKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworCisvKiBWZXJpZnkgdGhhdCB0aGUgZGlzayBibG9jayBjb250YWlucyBhIHZhbGlkIERPUyBwYXJ0aXRpb24gdGFibGUuCisgICBXaGlsZSB3ZSdyZSBhdCBpdCBoYXZlIGEgbG9vayBhcm91bmQgZm9yIGFjdGl2ZSBwYXJ0aXRpb25zIGV0Yy4KKworICAgUmV0dXJuIDA6IGludmFsaWQKKyAgIFJldHVybiAxLi40OiB2YWxpZCwgdmFsdWUgcmV0dXJuZWQgaXMgdGhlIGZpcnN0IGFjdGl2ZSBwYXJ0aXRpb24KKyAgIFJldHVybiAtMTogbm8gYWN0aXZlIHBhcnRpdGlvbiAqLworCitzdGF0aWMgaW50CitibG9jazBfaXNfZmRpc2soY29uc3QgdW5zaWduZWQ4IGJsb2NrW10pCit7CisgIGNvbnN0IGludCBwYXJ0aXRpb25fdHlwZV9maWVsZHNbXSA9IHsgMCwgMHgxYzIsIDB4MWQyLCAweDFlMiwgMHgxZjIgfTsKKyAgY29uc3QgaW50IHBhcnRpdGlvbl9hY3RpdmVfZmllbGRzW10gPSB7IDAsIDB4MWJlLCAweDFjZSwgMHgxZGUsIDB4ZWUgfTsKKyAgaW50IHBhcnRpdGlvbjsKKyAgaW50IGFjdGl2ZSA9IC0xOworICAvKiByZWYgUG93ZXJQQyBNaWNyb3Byb2Nlc3NvciBDSFJQIGJpbmRpbmdzIDEuMmIgLSBwYWdlIDQ3ICovCisgIC8qIG11c3QgaGF2ZSBMRSAweEFBNTUgc2lnbmF0dXJlIGF0IG9mZnNldCA1MTAgKi8KKyAgaWYgKGJsb2NrWzUxMS8qMHgxZmYqL10gIT0gMHhBQSAmJiBibG9ja1s1MTAvKjB4MWZlKi9dICE9IDB4NTUpCisgICAgcmV0dXJuIDA7CisgIC8qIG11c3QgY29udGFpbiB2YWxpZCBwYXJ0aXRpb24gdHlwZXMgKi8KKyAgZm9yIChwYXJ0aXRpb24gPSAxOyBwYXJ0aXRpb24gPD0gNCAmJiBhY3RpdmUgIT0gMDsgcGFydGl0aW9uKyspIHsKKyAgICBpbnQgcGFydGl0aW9uX3R5cGUgPSBibG9ja1twYXJ0aXRpb25fdHlwZV9maWVsZHNbcGFydGl0aW9uXV07CisgICAgaW50IGlzX2FjdGl2ZSA9IGJsb2NrW3BhcnRpdGlvbl9hY3RpdmVfZmllbGRzW3BhcnRpdGlvbl1dID09IDB4ODA7CisgICAgY29uc3QgY2hhciAqdHlwZTsKKyAgICBzd2l0Y2ggKHBhcnRpdGlvbl90eXBlKSB7CisgICAgY2FzZSAweDAwOgorICAgICAgdHlwZSA9ICJVTlVTRUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDAxOgorICAgICAgdHlwZSA9ICJGQVQgMTIgRmlsZSBzeXN0ZW0iOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDA0OgorICAgICAgdHlwZSA9ICJGQVQgMTYgRmlsZSBzeXN0ZW0iOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDA1OgorICAgIGNhc2UgMHgwNjoKKyAgICAgIHR5cGUgPSAicmVqZWN0ZWQgLSBleHRlbmRlZC9jaGFpbmVkIHBhcnRpdGlvbiBub3Qgc3VwcG9ydGVkIjsKKyAgICAgIGFjdGl2ZSA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4NDE6CisgICAgICB0eXBlID0gIlNpbmdsZSBwcm9ncmFtIGltYWdlIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHg4MjoKKyAgICAgIHR5cGUgPSAiU29sYXJpcz8iOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDk2OgorICAgICAgdHlwZSA9ICJJU08gOTY2MCBGaWxlIHN5c3RlbSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdHlwZSA9ICJyZWplY3RlZCAtIHVua25vd24gdHlwZSI7CisgICAgICBhY3RpdmUgPSAwOworICAgICAgYnJlYWs7CisgICAgfQorICAgIFBUUkFDRShkaXNrbGFiZWwsICgicGFydGl0aW9uICVkIG9mIHR5cGUgMHglMDJ4IC0gJXMlc1xuIiwKKwkJICAgICAgIHBhcnRpdGlvbiwKKwkJICAgICAgIHBhcnRpdGlvbl90eXBlLAorCQkgICAgICAgdHlwZSwKKwkJICAgICAgIGlzX2FjdGl2ZSAmJiBhY3RpdmUgIT0gMCA/ICIgKGFjdGl2ZSkiIDogIiIpKTsKKyAgICBpZiAocGFydGl0aW9uX3R5cGUgIT0gMCAmJiBpc19hY3RpdmUgJiYgYWN0aXZlIDwgMCkKKyAgICAgIGFjdGl2ZSA9IHBhcnRpdGlvbjsKKyAgfQorICByZXR1cm4gYWN0aXZlOworfQorCisKKy8qIFZlcmlmeSB0aGF0IGJsb2NrMCBjb3JyZXNwb25kcyB0byBhIE1BQyBkaXNrICovCisKK3N0YXRpYyBpbnQKK2Jsb2NrMF9pc19tYWNfZGlzayhjb25zdCB1bnNpZ25lZDggYmxvY2tbXSkKK3sKKyAgLyogcmVmIFBvd2VyUEMgTWljcm9wcm9jZXNzb3IgQ0hSUCBiaW5kaW5ncyAxLjJiIC0gcGFnZSA0NyAqLworICAvKiBzaWduYXR1cmUgLSBCRXg0NTUyIGF0IG9mZnNldCAwICovCisgIGlmIChibG9ja1swXSAhPSAweDQ1IHx8IGJsb2NrWzFdICE9IDB4NTIpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCisKKy8qIE9wZW4gYSBsb2dpY2FsIGRpc2svZmlsZSAqLworCitkZXZpY2VfaW5zdGFuY2UgKgorcGtfZGlza2xhYmVsX2NyZWF0ZV9pbnN0YW5jZShkZXZpY2VfaW5zdGFuY2UgKnJhd19kaXNrLAorCQkJICAgICBjb25zdCBjaGFyICphcmdzKQoreworICBpbnQgcGFydGl0aW9uOworICBjaGFyICpmaWxlbmFtZTsKKworICAvKiBwYXJzZSB0aGUgYXJndW1lbnRzICovCisgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICBwYXJ0aXRpb24gPSAwOworICAgIGZpbGVuYW1lID0gTlVMTDsKKyAgfQorICBlbHNlIHsKKyAgICBwYXJ0aXRpb24gPSBzdHJ0b3VsKChjaGFyKilhcmdzLCAmZmlsZW5hbWUsIDApOworICAgIGlmIChmaWxlbmFtZSA9PSBhcmdzKQorICAgICAgcGFydGl0aW9uID0gLTE7IC8qIG5vdCBzcGVjaWZpZWQgKi8KKyAgICBpZiAoKmZpbGVuYW1lID09ICcsJykKKyAgICAgIGZpbGVuYW1lKys7CisgICAgaWYgKCpmaWxlbmFtZSA9PSAnXDAnKQorICAgICAgZmlsZW5hbWUgPSBOVUxMOyAvKiBlYXNpZXIgKi8KKyAgfQorCisgIGlmIChwYXJ0aXRpb24gPT0gMCkgeworICAgIC8qIHNlbGVjdCB0aGUgcmF3IGRpc2sgKi8KKyAgICByZXR1cm4gcmF3X2Rpc2s7CisgIH0KKyAgZWxzZSB7CisgICAgdW5zaWduZWQ4IGJvb3RfYmxvY2tbNTEyXTsKKyAgICAvKiBnZXQgdGhlIGJvb3QgYmxvY2sgZm9yIGV4YW1pbmF0aW9uICovCisgICAgaWYgKGRldmljZV9pbnN0YW5jZV9zZWVrKHJhd19kaXNrLCAwLCAwKSA8IDApCisgICAgICBkZXZpY2VfZXJyb3IoZGV2aWNlX2luc3RhbmNlX2RldmljZShyYXdfZGlzayksCisJCSAgICJQcm9ibGVtIHNlZWtpbmcgb24gcmF3IGRpc2siKTsKKyAgICBpZiAoZGV2aWNlX2luc3RhbmNlX3JlYWQocmF3X2Rpc2ssICZib290X2Jsb2NrLCBzaXplb2YoYm9vdF9ibG9jaykpCisJIT0gc2l6ZW9mKGJvb3RfYmxvY2spKQorICAgICAgZGV2aWNlX2Vycm9yKGRldmljZV9pbnN0YW5jZV9kZXZpY2UocmF3X2Rpc2spLCAiUHJvYmxlbSByZWFkaW5nIGJvb3QgYmxvY2siKTsKKworICAgIGlmIChwYXJ0aXRpb24gPCAwKSB7CisgICAgICAvKiBzZWxlY3QgdGhlIGFjdGl2ZSBwYXJ0aXRpb24gKi8KKyAgICAgIGlmIChibG9jazBfaXNfYnBiKGJvb3RfYmxvY2spKSB7CisJZGV2aWNlX2Vycm9yKGRldmljZV9pbnN0YW5jZV9kZXZpY2UocmF3X2Rpc2spLCAiVW5pbXBsZW1lbnRlZCBhY3RpdmUgQlBCIik7CisgICAgICB9CisgICAgICBlbHNlIGlmIChibG9jazBfaXNfZmRpc2soYm9vdF9ibG9jaykpIHsKKwlpbnQgYWN0aXZlID0gYmxvY2swX2lzX2ZkaXNrKGJvb3RfYmxvY2spOworCWRldmljZV9lcnJvcihkZXZpY2VfaW5zdGFuY2VfZGV2aWNlKHJhd19kaXNrKSwgIlVuaW1wbGVtZW50ZWQgYWN0aXZlIEZESVNLICglZCkiLAorCQkgICAgIGFjdGl2ZSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChpc19pc285NjYwKHJhd19kaXNrKSkgeworCWRldmljZV9lcnJvcihkZXZpY2VfaW5zdGFuY2VfZGV2aWNlKHJhd19kaXNrKSwgIlVuaW1wbGVtZW50ZWQgYWN0aXZlIElTTzk2NjAiKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGJsb2NrMF9pc19tYWNfZGlzayhib290X2Jsb2NrKSkgeworCWRldmljZV9lcnJvcihkZXZpY2VfaW5zdGFuY2VfZGV2aWNlKHJhd19kaXNrKSwgIlVuaW1wbGVtZW50ZWQgYWN0aXZlIE1BQyBESVNLIik7CisgICAgICB9CisgICAgICBlbHNlIHsKKwlkZXZpY2VfZXJyb3IoZGV2aWNlX2luc3RhbmNlX2RldmljZShyYXdfZGlzayksICJVbnJlY29uaXplZCBib290YmxvY2siKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvKiBzZWxlY3QgdGhlIHNwZWNpZmllZCBkaXNrIHBhcnRpdGlvbiAqLworICAgICAgaWYgKGJsb2NrMF9pc19icGIoYm9vdF9ibG9jaykpIHsKKwlkZXZpY2VfZXJyb3IoZGV2aWNlX2luc3RhbmNlX2RldmljZShyYXdfZGlzayksICJVbmltcGxlbWVudGVkIEJQQiIpOworICAgICAgfQorICAgICAgZWxzZSBpZiAoYmxvY2swX2lzX2ZkaXNrKGJvb3RfYmxvY2spKSB7CisJLyogcmV0dXJuIGFuIGluc3RhbmNlICovCisJcHBjYm9vdF9wYXJ0aXRpb25fdCAqcGFydGl0aW9uX3RhYmxlID0gKHBwY2Jvb3RfcGFydGl0aW9uX3QqKSAmYm9vdF9ibG9ja1s0NDZdOworCXBwY2Jvb3RfcGFydGl0aW9uX3QgKnBhcnRpdGlvbl9lbnRyeTsKKwlkaXNrbGFiZWwgKmxhYmVsOworCWlmIChwYXJ0aXRpb24gPiA0KQorCSAgZGV2aWNlX2Vycm9yKGRldmljZV9pbnN0YW5jZV9kZXZpY2UocmF3X2Rpc2spLAorCQkgICAgICAgIk9ubHkgRkRJU0sgcGFydGl0aW9ucyAxLi40IHN1cHBvcnRlZCIpOworCXBhcnRpdGlvbl9lbnRyeSA9ICZwYXJ0aXRpb25fdGFibGVbcGFydGl0aW9uIC0gMV07CisJbGFiZWwgPSBaQUxMT0MoZGlza2xhYmVsKTsKKwlsYWJlbC0+cmF3X2Rpc2sgPSByYXdfZGlzazsKKwlsYWJlbC0+cG9zID0gMDsKKwlsYWJlbC0+c2VjdG9yX2JlZ2luID0gNTEyICogc2VjdG9yMnV3KHBhcnRpdGlvbl9lbnRyeS0+c2VjdG9yX2JlZ2luKTsKKwlsYWJlbC0+c2VjdG9yX2xlbmd0aCA9IDUxMiAqIHNlY3RvcjJ1dyhwYXJ0aXRpb25fZW50cnktPnNlY3Rvcl9sZW5ndGgpOworCVBUUkFDRShkaXNrbGFiZWwsICgicGFydGl0aW9uICVsZCwgc2VjdG9yLWJlZ2luICVsZCwgbGVuZ3RoICVsZFxuIiwKKwkJCSAgIChsb25nKXBhcnRpdGlvbiwKKwkJCSAgIChsb25nKWxhYmVsLT5zZWN0b3JfYmVnaW4sCisJCQkgICAobG9uZylsYWJlbC0+c2VjdG9yX2xlbmd0aCkpOworCWlmIChmaWxlbmFtZSAhPSBOVUxMKQorCSAgZGV2aWNlX2Vycm9yKGRldmljZV9pbnN0YW5jZV9kZXZpY2UocmF3X2Rpc2spLAorCQkgICAgICAgIkZESVNLIGZpbGUgbmFtZXMgbm90IHlldCBzdXBwb3J0ZWQiKTsKKwlyZXR1cm4gZGV2aWNlX2NyZWF0ZV9pbnN0YW5jZV9mcm9tKE5VTEwsIHJhd19kaXNrLAorCQkJCQkgICBsYWJlbCwKKwkJCQkJICAgTlVMTCwgYXJncywKKwkJCQkJICAgJnBhY2thZ2VfZGlza2xhYmVsX2NhbGxiYWNrcyk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChibG9jazBfaXNfbWFjX2Rpc2soYm9vdF9ibG9jaykpIHsKKwlkZXZpY2VfZXJyb3IoZGV2aWNlX2luc3RhbmNlX2RldmljZShyYXdfZGlzayksICJVbmltcGxlbWVudGVkIE1BQyBESVNLIik7CisgICAgICB9CisgICAgICBlbHNlIHsKKwlkZXZpY2VfZXJyb3IoZGV2aWNlX2luc3RhbmNlX2RldmljZShyYXdfZGlzayksCisJCSAgICAgIlVucmVjb25pemVkIGJvb3RibG9jayIpOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgcmV0dXJuIE5VTEw7Cit9CisgIAorICAKKyNlbmRpZiAvKiBfUEtfRElTS0xBQkVMX0NfICovCisKZGlmZiAtLWdpdCBhL3NpbS9wcGMvcHBjLWNhY2hlLXJ1bGVzIGIvc2ltL3BwYy9wcGMtY2FjaGUtcnVsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1ZjQ3MgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvcHBjLWNhY2hlLXJ1bGVzCkBAIC0wLDAgKzEsNjUgQEAKKyMKKyMgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorIworIyAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKK2NhY2hlOlJBOlJBOjoKK2NhY2hlOlJBOnJBOnNpZ25lZF93b3JkICo6KGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByICsgUkEpCitjYWNoZTpSQTpSQV9CSVRNQVNLOnVuc2lnbmVkMzI6KDEgPDwgUkEpCitjb21wdXRlOlJBOlJBX2lzXzA6aW50OihSQSA9PSAwKQorY2FjaGU6UlQ6UlQ6OgorY2FjaGU6UlQ6clQ6c2lnbmVkX3dvcmQgKjooY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHIgKyBSVCkKK2NhY2hlOlJUOlJUX0JJVE1BU0s6dW5zaWduZWQzMjooMSA8PCBSVCkKK2NhY2hlOlJTOlJTOjoKK2NhY2hlOlJTOnJTOnNpZ25lZF93b3JkICo6KGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByICsgUlMpCitjYWNoZTpSUzpSU19CSVRNQVNLOnVuc2lnbmVkMzI6KDEgPDwgUlMpCitjYWNoZTpSQjpSQjo6CitjYWNoZTpSQjpyQjpzaWduZWRfd29yZCAqOihjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmdwciArIFJCKQorY2FjaGU6UkI6UkJfQklUTUFTSzp1bnNpZ25lZDMyOigxIDw8IFJCKQorc2NyYXRjaDpGUkE6RlJBOjoKK2NhY2hlOkZSQTpmckE6dW5zaWduZWQ2NCAqOihjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmZwciArIEZSQSkKK2NhY2hlOkZSQTpGUkFfQklUTUFTSzp1bnNpZ25lZDMyOigxIDw8IEZSQSkKK3NjcmF0Y2g6RlJCOkZSQjo6CitjYWNoZTpGUkI6ZnJCOnVuc2lnbmVkNjQgKjooY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5mcHIgKyBGUkIpCitjYWNoZTpGUkI6RlJCX0JJVE1BU0s6dW5zaWduZWQzMjooMSA8PCBGUkIpCitzY3JhdGNoOkZSQzpGUkM6OgorY2FjaGU6RlJDOmZyQzp1bnNpZ25lZDY0ICo6KGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+ZnByICsgRlJDKQorY2FjaGU6RlJDOkZSQ19CSVRNQVNLOnVuc2lnbmVkMzI6KDEgPDwgRlJDKQorc2NyYXRjaDpGUlM6RlJTOjoKK2NhY2hlOkZSUzpmclM6dW5zaWduZWQ2NCAqOihjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmZwciArIEZSUykKK2NhY2hlOkZSUzpGUlNfQklUTUFTSzp1bnNpZ25lZDMyOigxIDw8IEZSUykKK3NjcmF0Y2g6RlJUOkZSVDo6CitjYWNoZTpGUlQ6ZnJUOnVuc2lnbmVkNjQgKjooY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5mcHIgKyBGUlQpCitjYWNoZTpGUlQ6RlJUX0JJVE1BU0s6dW5zaWduZWQzMjooMSA8PCBGUlQpCitjYWNoZTpTSTpFWFRTX1NJOnVuc2lnbmVkX3dvcmQ6KChzaWduZWRfd29yZCkoc2lnbmVkMTYpaW5zdHJ1Y3Rpb24pCitzY3JhdGNoOkJJOkJJOjoKK2NhY2hlOkJJOkJJVDMyX0JJOjpCSVQzMihCSSkKK2NhY2hlOkJGOkJGOjoKK2NhY2hlOkJGOkJGX0JJVE1BU0s6dW5zaWduZWQzMjooMSA8PCBCRikKK3NjcmF0Y2g6QkE6QkE6OgorY2FjaGU6QkE6QklUMzJfQkE6OkJJVDMyKEJBKQorY2FjaGU6QkE6QkFfQklUTUFTSzp1bnNpZ25lZDMyOigxIDw8IEJBKQorc2NyYXRjaDpCQjpCQjo6CitjYWNoZTpCQjpCSVQzMl9CQjo6QklUMzIoQkIpCitjYWNoZTpCQjpCQl9CSVRNQVNLOnVuc2lnbmVkMzI6KDEgPDwgQkIpCitjYWNoZTpCVDpCVDo6CitjYWNoZTpCVDpCVF9CSVRNQVNLOnVuc2lnbmVkMzI6KDEgPDwgQlQpCitjYWNoZTpCRDpFWFRTX0JEXzBiMDA6dW5zaWduZWRfd29yZDooKChzaWduZWRfd29yZCkoc2lnbmVkMTYpaW5zdHJ1Y3Rpb24pICYgfjMpCitjYWNoZTpMSTpFWFRTX0xJXzBiMDA6dW5zaWduZWRfd29yZDooKCgoc2lnbmVkX3dvcmQpKHNpZ25lZDMyKShpbnN0cnVjdGlvbiA8PCA2KSkgPj4gNikgJiB+MHgzKQorY2FjaGU6RDpFWFRTX0Q6dW5zaWduZWRfd29yZDooKHNpZ25lZF93b3JkKShzaWduZWQxNikoaW5zdHJ1Y3Rpb24pKQorY2FjaGU6RFM6RVhUU19EU18wYjAwOnVuc2lnbmVkX3dvcmQ6KCgoc2lnbmVkX3dvcmQpKHNpZ25lZDE2KWluc3RydWN0aW9uKSAmIH4weDMpCisjY29tcHV0ZTpTUFI6U1BSX2lzXzI1NjppbnQ6KFNQUiA9PSAyNTYpCmRpZmYgLS1naXQgYS9zaW0vcHBjL3BwYy1pbnN0cnVjdGlvbnMgYi9zaW0vcHBjL3BwYy1pbnN0cnVjdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmViZTA4MQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvcHBjLWluc3RydWN0aW9ucwpAQCAtMCwwICsxLDQ5MzMgQEAKKyMKKyMgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorIworIyAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorIworIyAgIC0tCisjCisjICAgVGhlIHBzZXVkby1jb2RlIHRoYXQgYXBwZWFycyBiZWxvdywgdHJhbnNsYXRlZCBpbnRvIEMsIHdhcyBjb3BpZWQKKyMgICBieSBBbmRyZXcgQ2FnbmV5IG9mIE1vc3MgVmFsZSwgQXVzdHJhbGlhLgorIworIyAgIFRoaXMgcHNldWRvLWNvZGUgaXMgY29waWVkIGJ5IHBlcm1pc3Npb24gZnJvbSB0aGUgcHVibGljYXRpb24KKyMgICAiVGhlIFBvd2VyUEMgQXJjaGl0ZWN0dXJlOiBBIFNwZWNpZmljYXRpb24gZm9yIEEgTmV3IEZhbWlseSBvZgorIyAgIFJJU0MgUHJvY2Vzc29ycyIgKElTQk4gMS01NTg2MC0zMTYtNikgY29weXJpZ2h0IDE5OTMsIDE5OTQgYnkKKyMgICBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLgorIworIyAgIFRISVMgUEVSTUlTU0lPTiBJUyBQUk9WSURFRCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIKKyMgICBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBJTVBMSUVEIFdBUlJBTlRJRVMKKyMgICBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorIworIyAgIC0tCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworDAorIyBQb3dlclBDIG1vZGVscworOjptb2RlbDo2MDQ6cHBjNjA0OiAgUFBDX1VOSVRfQkFELCAgIFBQQ19VTklUX0JBRCwgICAxLCAgMSwgIDAKKzo6bW9kZWw6NjAzZTpwcGM2MDNlOlBQQ19VTklUX0JBRCwgICBQUENfVU5JVF9CQUQsICAgMSwgIDEsICAwCis6Om1vZGVsOjYwMzpwcGM2MDM6ICBQUENfVU5JVF9CQUQsICAgUFBDX1VOSVRfQkFELCAgIDEsICAxLCAgMAorOjptb2RlbDo2MDE6cHBjNjAxOiAgUFBDX1VOSVRfQkFELCAgIFBQQ19VTklUX0JBRCwgICAxLCAgMSwgIDAKKworIyBGbGFncyBmb3IgbW9kZWwuaAorOjptb2RlbC1tYWNybzo6OgorCSNkZWZpbmUgUFBDX0lOU05fSU5UKE9VVF9NQVNLLCBJTl9NQVNLLCBSQykgXAorCQlkbyB7IFwKKwkJICBpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDApIHsgXAorCQkgICAgaWYgKFJDKSBcCisJCSAgICAgIHBwY19pbnNuX2ludF9jcihNWV9JTkRFWCwgY3B1X21vZGVsKHByb2Nlc3NvciksIE9VVF9NQVNLLCBJTl9NQVNLLCAxIDw8IDApOyBcCisJCSAgICBlbHNlIFwKKwkJICAgICAgcHBjX2luc25faW50KE1ZX0lOREVYLCBjcHVfbW9kZWwocHJvY2Vzc29yKSwgT1VUX01BU0ssIElOX01BU0spOyBcCisJCSAgfSBcCisJCX0gd2hpbGUgKDApCisKKwkjZGVmaW5lIFBQQ19JTlNOX0lOVF9DUihPVVRfTUFTSywgSU5fTUFTSywgQ1JfTUFTSykgXAorCQlkbyB7IFwKKwkJICBpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDApIFwKKwkJICAgIHBwY19pbnNuX2ludF9jcihNWV9JTkRFWCwgY3B1X21vZGVsKHByb2Nlc3NvciksIE9VVF9NQVNLLCBJTl9NQVNLLCBDUl9NQVNLKTsgXAorCQl9IHdoaWxlICgwKQorCisJI2RlZmluZSBQUENfSU5TTl9DUihPVVRfTUFTSywgSU5fTUFTSykgXAorCQlkbyB7IFwKKwkJICBpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDApIFwKKwkJICAgIHBwY19pbnNuX2NyKE1ZX0lOREVYLCBjcHVfbW9kZWwocHJvY2Vzc29yKSwgT1VUX01BU0ssIElOX01BU0spOyBcCisJCX0gd2hpbGUgKDApCisKKwkjZGVmaW5lIFBQQ19JTlNOX0ZMT0FUKE9VVF9NQVNLLCBJTl9NQVNLLCBSQykgXAorCQlkbyB7IFwKKwkJICBpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDApIHsgXAorCQkgICAgaWYgKFJDKSBcCisJCSAgICAgIHBwY19pbnNuX2Zsb2F0KE1ZX0lOREVYLCBjcHVfbW9kZWwocHJvY2Vzc29yKSwgT1VUX01BU0ssIElOX01BU0spOyBcCisJCSAgICBlbHNlIFwKKwkJICAgICAgcHBjX2luc25fZmxvYXRfY3IoTVlfSU5ERVgsIGNwdV9tb2RlbChwcm9jZXNzb3IpLCBPVVRfTUFTSywgSU5fTUFTSywgMSA8PCAwKTsgXAorCQkgIH0gXAorCQl9IHdoaWxlICgwKQorCisJI2RlZmluZSBQUENfSU5TTl9GTE9BVF9DUihPVVRfTUFTSywgSU5fTUFTSywgQ1JfTUFTSykgXAorCQlkbyB7IFwKKwkJICBpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDApIFwKKwkJICAgIHBwY19pbnNuX2Zsb2F0X2NyKE1ZX0lOREVYLCBjcHVfbW9kZWwocHJvY2Vzc29yKSwgT1VUX01BU0ssIElOX01BU0ssIENSX01BU0spOyBcCisJCX0gd2hpbGUgKDApCisKKwkjZGVmaW5lIFBQQ19JTlNOX0lOVF9GTE9BVChPVVRfSU5UX01BU0ssIE9VVF9GUF9NQVNLLCBJTl9JTlRfTUFTSywgSU5fRlBfTUFTSykgXAorCQlkbyB7IFwKKwkJICBpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDApIFwKKwkJICAgIHBwY19pbnNuX2ludF9mbG9hdChNWV9JTkRFWCwgY3B1X21vZGVsKHByb2Nlc3NvciksIE9VVF9JTlRfTUFTSywgT1VUX0ZQX01BU0ssIElOX0lOVF9NQVNLLCBJTl9GUF9NQVNLKTsgXAorCQl9IHdoaWxlICgwKQorCisJI2RlZmluZSBQUENfSU5TTl9GUk9NX1NQUihJTlRfTUFTSywgU1BSKSBcCisJCWRvIHsgXAorCQkgIGlmIChDVVJSRU5UX01PREVMX0lTU1VFID4gMCkgXAorCQkgICAgcHBjX2luc25fZnJvbV9zcHIoTVlfSU5ERVgsIGNwdV9tb2RlbChwcm9jZXNzb3IpLCBJTlRfTUFTSywgU1BSKTsgXAorCQl9IHdoaWxlICgwKQorCisJI2RlZmluZSBQUENfSU5TTl9UT19TUFIoSU5UX01BU0ssIFNQUikgXAorCQlkbyB7IFwKKwkJICBpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDApIFwKKwkJICAgIHBwY19pbnNuX3RvX3NwcihNWV9JTkRFWCwgY3B1X21vZGVsKHByb2Nlc3NvciksIElOVF9NQVNLLCBTUFIpOyBcCisJCX0gd2hpbGUgKDApCisKKwkjZGVmaW5lIFBQQ19JTlNOX01GQ1IoSU5UX01BU0spIFwKKwkJZG8geyBcCisJCSAgaWYgKENVUlJFTlRfTU9ERUxfSVNTVUUgPiAwKSBcCisJCSAgICBwcGNfaW5zbl9tZmNyKE1ZX0lOREVYLCBjcHVfbW9kZWwocHJvY2Vzc29yKSwgSU5UX01BU0spOyBcCisJCX0gd2hpbGUgKDApCisKKwkjZGVmaW5lIFBQQ19JTlNOX01UQ1IoSU5UX01BU0ssIEZYTSkgXAorCQlkbyB7IFwKKwkJICBpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDApIFwKKwkJICAgIHBwY19pbnNuX210Y3IoTVlfSU5ERVgsIGNwdV9tb2RlbChwcm9jZXNzb3IpLCBJTlRfTUFTSywgRlhNKTsgXAorCQl9IHdoaWxlICgwKQorCis6Om1vZGVsLWRhdGE6OjoKKwl0eXBlZGVmIGVudW0gX3BwY19mdW5jdGlvbl91bml0IHsKKwkgIFBQQ19VTklUX0JBRCwJCQkJLyogdW5rbm93biBmdW5jdGlvbiB1bml0ICovCisJICBQUENfVU5JVF9JVSwJCQkJLyogaW50ZWdlciB1bml0ICg2MDEvNjAzIHN0eWxlKSAqLworCSAgUFBDX1VOSVRfU1JVLAkJCQkvKiBzeXN0ZW0gcmVnaXN0ZXIgdW5pdCAoNjAxLzYwMyBzdHlsZSkgKi8KKwkgIFBQQ19VTklUX1NDSVUxLAkJCS8qIDFzdCBzaW5nbGUgY3ljbGUgaW50ZWdlciB1bml0ICg2MDQgc3R5bGUpICovCisJICBQUENfVU5JVF9TQ0lVMiwJCQkvKiAybmQgc2luZ2xlIGN5Y2xlIGludGVnZXIgdW5pdCAoNjA0IHN0eWxlKSAqLworCSAgUFBDX1VOSVRfTUNJVSwJCQkvKiBtdWx0aXBsZSBjeWNsZSBpbnRlZ2VyIHVuaXQgKDYwNCBzdHlsZSkgKi8KKwkgIFBQQ19VTklUX0ZQVSwJCQkJLyogZmxvYXRpbmcgcG9pbnQgdW5pdCAqLworCSAgUFBDX1VOSVRfTFNVLAkJCQkvKiBsb2FkL3N0b3JlIHVuaXQgKi8KKwkgIFBQQ19VTklUX0JQVSwJCQkJLyogYnJhbmNoIHVuaXQgKi8KKwkgIG5yX3BwY19mdW5jdGlvbl91bml0cworCX0gcHBjX2Z1bmN0aW9uX3VuaXQ7CisKKwkvKiBTdHJ1Y3R1cmUgdG8gaG9sZCB0aW1pbmcgaW5mb3JtYXRpb24gb24gYSBwZXIgaW5zdHJ1Y3Rpb24gYmFzaXMgKi8KKwlzdHJ1Y3QgX21vZGVsX3RpbWUgeworCSAgcHBjX2Z1bmN0aW9uX3VuaXQgZmlyc3RfdW5pdDsJCQkvKiBmaXJzdCBmdW5jdGlvbmFsIHVuaXQgdGhpcyBpbnNuIGNvdWxkIHVzZSAqLworCSAgcHBjX2Z1bmN0aW9uX3VuaXQgc2Vjb25kX3VuaXQ7CQkvKiBzZWNvbmQgZnVuY3Rpb25hbCB1bml0IHRoaXMgaW5zbiBjb3VsZCB1c2UgKi8KKwkgIHNpZ25lZDE2CSAgICBpc3N1ZTsJCQkvKiAjIGN5Y2xlcyBiZWZvcmUgZnVuY3Rpb24gdW5pdCBjYW4gcHJvY2VzcyBvdGhlciBpbnNucyAqLworCSAgc2lnbmVkMTYJICAgIGRvbmU7CQkJLyogIyBjeWNsZXMgYmVmb3JlIGluc24gaXMgZG9uZSAqLworCSAgdW5zaWduZWQzMgkgICAgZmxhZ3M7CQkJLyogYW55IGZsYWdzIHRoYXQgYXJlIG5lZWRlZCAqLworCX07CisKKwkvKiBSZWdpc3RlciBtYXBwaW5ncyBpbiBzdGF0dXMgbWFza3MgKi8KKwkjZGVmaW5lIFBQQ19DUl9SRUcJMAkJCS8qIHN0YXJ0IG9mIENSMCAuLiBDUjcgKi8KKwkjZGVmaW5lIFBQQ19GUFNDUl9SRUcJKFBQQ19DUl9SRUcgKyA4KQkvKiBzdGFydCBvZiBmcHNjciByZWdpc3RlciAqLworCisJI2RlZmluZSBQUENfTk9fU1BSCSgtMSkJCQkvKiBmbGFnIGZvciBubyBTUFIgcmVnaXN0ZXIgKi8KKworCS8qIFJldHVybiBpZiAxIGJpdCBzZXQgKi8KKwkjZGVmaW5lIFBQQ19PTkVfQklUX1NFVF9QKHgpICgoKHgpICYgKCh4KS0xKSkgPT0gMCkKKworCS8qIFN0cnVjdHVyZSBmb3IgZWFjaCBmdW5jdGlvbmFsIHVuaXQgdGhhdCBpcyBidXN5ICovCisJdHlwZWRlZiBzdHJ1Y3QgX21vZGVsX2J1c3kgbW9kZWxfYnVzeTsKKwlzdHJ1Y3QgX21vZGVsX2J1c3kgeworCSAgbW9kZWxfYnVzeSAqbmV4dDsJCQkJLyogbmV4dCBmdW5jdGlvbiB1bml0ICovCisJICBwcGNfZnVuY3Rpb25fdW5pdCB1bml0OwkJCS8qIGZ1bmN0aW9uIHVuaXQgbmFtZSAqLworCSAgdW5zaWduZWQzMiBpbnRfYnVzeTsJCQkJLyogaW50IHJlZ2lzdGVycyB0aGF0IGFyZSBidXN5ICovCisJICB1bnNpZ25lZDMyIGZwX2J1c3k7CQkJCS8qIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyB0aGF0IGFyZSBidXN5ICovCisJICB1bnNpZ25lZDMyIGNyX2Zwc2NyX2J1c3k7CQkJLyogQ1IvRlBTQ1IgcmVnaXN0ZXJzIHRoYXQgYXJlIGJ1c3kgKi8KKwkgIHNpZ25lZDE2IHNwcl9idXN5OwkJCQkvKiBTUFIgcmVnaXN0ZXIgdGhhdCBpcyBidXN5IG9yIFBQQ19OT19TUFIgKi8KKwkgIHNpZ25lZDE2IGlzc3VlOwkJCQkvKiAjIG9mIGN5Y2xlcyB1bnRpbCB1bml0IGNhbiBhY2NlcHQgYW5vdGhlciBpbnNuICovCisJICBzaWduZWQxNiBkb25lOwkJCQkvKiAjIG9mIGN5Y2xlcyB1bnRpbCBpbnNuIGlzIGRvbmUgKi8KKwkgIHNpZ25lZDE2IG5yX3dyaXRlYmFja3M7CQkJLyogIyBvZiByZWdpc3RlcnMgdGhpcyB1bml0IHdyaXRlcyBiYWNrICovCisJfTsKKwkKKwkvKiBTdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgY3VycmVudCBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHNpbXVsYXRlZCBDUFUgbW9kZWwgKi8KKwlzdHJ1Y3QgX21vZGVsX2RhdGEgeworCSAgY3B1ICpwcm9jZXNzb3I7CQkJCS8qIHBvaW50IGJhY2sgdG8gcHJvY2Vzc29yICovCisJICBjb25zdCBjaGFyICpuYW1lOwkJCQkvKiBtb2RlbCBuYW1lICovCisJICBjb25zdCBtb2RlbF90aW1lICp0aW1pbmc7CQkJLyogdGltaW5nIGluZm9ybWF0aW9uICovCisJICBtb2RlbF9idXN5IGJ1c3lfaGVhZDsJCQkJLyogZHVtbXkgZW50cnkgdG8gaGVhZCBsaXN0IG9mIGJ1c3kgZnVuY3Rpb24gdW5pdHMgKi8KKwkgIG1vZGVsX2J1c3kgKmJ1c3lfdGFpbDsJCQkvKiB0YWlsIG9mIGxpc3Qgb2YgYnVzeSBmdW5jdGlvbiB1bml0cyAqLworCSAgbW9kZWxfYnVzeSAqZnJlZV9saXN0OwkJCS8qIGxpc3Qgb2YgbW9kZWxfYnVzeSBzdHJ1Y3RzIG5vdCBpbiB1c2UgKi8KKwkgIGNvdW50X3R5cGUgbnJfY3ljbGVzOwkJCQkvKiAjIGN5Y2xlcyAqLworCSAgY291bnRfdHlwZSBucl9icmFuY2hlczsJCQkvKiAjIGJyYW5jaGVzICovCisJICBjb3VudF90eXBlIG5yX2JyYW5jaGVzX2ZhbGx0aHJvdWdoOwkJLyogIyBjb25kaXRpb25hbCBicmFuY2hlcyB0aGF0IGZlbGwgdGhyb3VnaCAqLworCSAgY291bnRfdHlwZSBucl9icmFuY2hfcHJlZGljdF90cnVlczsJCS8qICMgYnJhbmNoZXMgcHJlZGljdGVkIGNvcnJlY3RseSAqLworCSAgY291bnRfdHlwZSBucl9icmFuY2hfcHJlZGljdF9mYWxzZXM7CQkvKiAjIGJyYW5jaGVzIHByZWRpY3RlZCBpbmNvcnJlY3RseSAqLworCSAgY291bnRfdHlwZSBucl9icmFuY2hfY29uZGl0aW9uYWxbMzJdOwkJLyogIyBvZiBlYWNoIHR5cGUgb2YgYmMgKi8KKwkgIGNvdW50X3R5cGUgbnJfbXRjcmZfY3JzWzldOwkJCS8qICMgb2YgQ1IncyBtb3ZlZCBpbiBhIG10Y3JmIGluc3RydWN0aW9uICovCisJICBjb3VudF90eXBlIG5yX3N0YWxsc19kYXRhOwkJCS8qICMgb2Ygc3RhbGxzIGZvciBkYXRhICovCisJICBjb3VudF90eXBlIG5yX3N0YWxsc191bml0OwkJCS8qICMgb2Ygc3RhbGxzIHdhaXRpbmcgZm9yIGEgZnVuY3Rpb24gdW5pdCAqLworCSAgY291bnRfdHlwZSBucl9zdGFsbHNfc2VyaWFsaXplOwkJLyogIyBvZiBzdGFsbHMgd2FpdGluZyBmb3IgdGhpbmdzIHRvIHF1aWV0IGRvd24gKi8KKwkgIGNvdW50X3R5cGUgbnJfc3RhbGxzX3dyaXRlYmFjazsJCS8qICMgb2Ygc3RhbGxzIHdhaXRpbmcgZm9yIGEgd3JpdGViYWNrIHNsb3QgKi8KKwkgIGNvdW50X3R5cGUgbnJfdW5pdHNbbnJfcHBjX2Z1bmN0aW9uX3VuaXRzXTsJLyogZnVuY3Rpb24gdW5pdCBjb3VudHMgKi8KKwkgIGludCBtYXhfbnJfd3JpdGViYWNrczsJCQkvKiBtYXggIyBvZiB3cml0ZWJhY2sgc2xvdHMgYXZhaWxhYmxlICovCisJICB1bnNpZ25lZDMyIGludF9idXN5OwkJCQkvKiBpbnQgcmVnaXN0ZXJzIHRoYXQgYXJlIGJ1c3kgKi8KKwkgIHVuc2lnbmVkMzIgZnBfYnVzeTsJCQkJLyogZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIHRoYXQgYXJlIGJ1c3kgKi8KKwkgIHVuc2lnbmVkMzIgY3JfZnBzY3JfYnVzeTsJCQkvKiBDUi9GUFNDUiByZWdpc3RlcnMgdGhhdCBhcmUgYnVzeSAqLworCSAgdW5zaWduZWQ4IHNwcl9idXN5W25yX29mX3NwcnNdOwkJLyogU1BSIHJlZ2lzdGVycyB0aGF0IGFyZSBidXN5ICovCisJICB1bnNpZ25lZDggYnVzeVtucl9wcGNfZnVuY3Rpb25fdW5pdHNdOwkvKiB3aGV0aGVyIGEgZnVuY3Rpb24gaXMgYnVzeSBvciBub3QgKi8KKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHBwY19mdW5jdGlvbl91bml0X25hbWVbIChpbnQpbnJfcHBjX2Z1bmN0aW9uX3VuaXRzIF0gPSB7CisJICAidW5rbm93biBmdW5jdGlvbmFsIHVuaXQgaW5zdHJ1Y3Rpb24iLAorCSAgImludGVnZXIgZnVuY3Rpb25hbCB1bml0IGluc3RydWN0aW9uIiwKKwkgICJzeXN0ZW0gcmVnaXN0ZXIgZnVuY3Rpb25hbCB1bml0IGluc3RydWN0aW9uIiwKKwkgICIxc3Qgc2luZ2xlIGN5Y2xlIGludGVnZXIgZnVuY3Rpb25hbCB1bml0IGluc3RydWN0aW9uIiwKKwkgICIybmQgc2luZ2xlIGN5Y2xlIGludGVnZXIgZnVuY3Rpb25hbCB1bml0IGluc3RydWN0aW9uIiwKKwkgICJtdWx0aXBsZSBjeWNsZSBpbnRlZ2VyIGZ1bmN0aW9uYWwgdW5pdCBpbnN0cnVjdGlvbiIsCisJICAiZmxvYXRpbmcgcG9pbnQgZnVuY3Rpb25hbCB1bml0IGluc3RydWN0aW9uIiwKKwkgICJsb2FkL3N0b3JlIGZ1bmN0aW9uYWwgdW5pdCBpbnN0cnVjdGlvbiIsCisJICAiYnJhbmNoIGZ1bmN0aW9uYWwgdW5pdCBpbnN0cnVjdGlvbiIsCisJfTsKKworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBwcGNfYnJhbmNoX2NvbmRpdGlvbmFsX25hbWVbMzJdID0geworCSAgImJyYW5jaCBpZiAtLUNUUiAhPSAwIGFuZCBjb25kaXRpb24gaXMgRkFMU0UiLAkJCQkvKiAwMDAweSAqLworCSAgImJyYW5jaCBpZiAtLUNUUiAhPSAwIGFuZCBjb25kaXRpb24gaXMgRkFMU0UsIHJldmVyc2UgYnJhbmNoIGxpa2VseSIsCisJICAiYnJhbmNoIGlmIC0tQ1RSID09IDAgYW5kIGNvbmRpdGlvbiBpcyBGQUxTRSIsCQkJCS8qIDAwMDF5ICovCisJICAiYnJhbmNoIGlmIC0tQ1RSID09IDAgYW5kIGNvbmRpdGlvbiBpcyBGQUxTRSwgcmV2ZXJzZSBicmFuY2ggbGlrZWx5IiwKKwkgICJicmFuY2ggaWYgdGhlIGNvbmRpdGlvbiBpcyBGQUxTRSIsCQkJCQkJLyogMDAxenkgKi8KKwkgICJicmFuY2ggaWYgdGhlIGNvbmRpdGlvbiBpcyBGQUxTRSwgcmV2ZXJzZSBicmFuY2ggbGlrZWx5IiwKKwkgICJicmFuY2ggaWYgdGhlIGNvbmRpdGlvbiBpcyBGQUxTRSAoaWdub3JlZCBiaXQgMSBzZXQgdG8gMSkiLAkJCS8qIDAwMXp5ICovCisJICAiYnJhbmNoIGlmIHRoZSBjb25kaXRpb24gaXMgRkFMU0UsIHJldmVyc2UgYnJhbmNoIGxpa2VseSAoaWdub3JlZCBiaXQgNCBzZXQgdG8gMSkiLAorCSAgImJyYW5jaCBpZiAtLUNUUiAhPSAwIGFuZCBjb25kaXRpb24gaXMgVFJVRSIsCQkJCQkvKiAwMTAweSAqLworCSAgImJyYW5jaCBpZiAtLUNUUiAhPSAwIGFuZCBjb25kaXRpb24gaXMgVFJVRSwgcmV2ZXJzZSBicmFuY2ggbGlrZWx5IiwKKwkgICJicmFuY2ggaWYgLS1DVFIgPT0gMCBhbmQgY29uZGl0aW9uIGlzIFRSVUUiLAkJCQkJLyogMDEwMXkgKi8KKwkgICJicmFuY2ggaWYgLS1DVFIgPT0gMCBhbmQgY29uZGl0aW9uIGlzIFRSVUUsIHJldmVyc2UgYnJhbmNoIGxpa2VseSIsCisJICAiYnJhbmNoIGlmIHRoZSBjb25kaXRpb24gaXMgVFJVRSIsCQkJCQkJLyogMDExenkgKi8KKwkgICJicmFuY2ggaWYgdGhlIGNvbmRpdGlvbiBpcyBUUlVFLCByZXZlcnNlIGJyYW5jaCBsaWtlbHkiLAorCSAgImJyYW5jaCBpZiB0aGUgY29uZGl0aW9uIGlzIFRSVUUgKGlnbm9yZWQgYml0IDEgc2V0IHRvIDEpIiwJCQkvKiAwMTF6eSAqLworCSAgImJyYW5jaCBpZiB0aGUgY29uZGl0aW9uIGlzIFRSVUUsIHJldmVyc2UgYnJhbmNoIGxpa2VseSAoaWdub3JlZCBiaXQgNCBzZXQgdG8gMSkiLAorCSAgImJyYW5jaCBpZiAtLUNUUiAhPSAwIiwJCQkJCQkJLyogMXowMHkgKi8KKwkgICJicmFuY2ggaWYgLS1DVFIgIT0gMCwgcmV2ZXJzZSBicmFuY2ggbGlrZWx5IiwKKwkgICJicmFuY2ggaWYgLS1DVFIgPT0gMCIsCQkJCQkJCS8qIDF6MDF5ICovCisJICAiYnJhbmNoIGlmIC0tQ1RSID09IDAsIHJldmVyc2UgYnJhbmNoIGxpa2VseSIsCisJICAiYnJhbmNoIGFsd2F5cyIsCQkJCQkJCQkvKiAxejF6eiAqLworCSAgImJyYW5jaCBhbHdheXMgKGlnbm9yZWQgYml0IDUgc2V0IHRvIDEpIiwKKwkgICJicmFuY2ggYWx3YXlzIChpZ25vcmVkIGJpdCA0IHNldCB0byAxKSIsCQkJCQkvKiAxejF6eiAqLworCSAgImJyYW5jaCBhbHdheXMgKGlnbm9yZWQgYml0cyA0LDUgc2V0IHRvIDEpIiwKKwkgICJicmFuY2ggaWYgLS1DVFIgIT0gMCAoaWdub3JlZCBiaXQgMSBzZXQgdG8gMSkiLAkJCQkvKiAxejAweSAqLworCSAgImJyYW5jaCBpZiAtLUNUUiAhPSAwLCByZXZlcnNlIGJyYW5jaCBsaWtlbHkgKGlnbm9yZWQgYml0IDEgc2V0IHRvIDEpIiwKKwkgICJicmFuY2ggaWYgLS1DVFIgPT0gMCAoaWdub3JlZCBiaXQgMSBzZXQgdG8gMSkiLAkJCQkvKiAxejAxeSAqLworCSAgImJyYW5jaCBpZiAtLUNUUiA9PSAwLCByZXZlcnNlIGJyYW5jaCBsaWtlbHkgKGlnbm9yZWQgYml0IDEgc2V0IHRvIDEpIiwKKwkgICJicmFuY2ggYWx3YXlzIChpZ25vcmVkIGJpdCAxIHNldCB0byAxKSIsCQkJCQkvKiAxejF6eiAqLworCSAgImJyYW5jaCBhbHdheXMgKGlnbm9yZWQgYml0cyAxLDUgc2V0IHRvIDEpIiwKKwkgICJicmFuY2ggYWx3YXlzIChpZ25vcmVkIGJpdHMgMSw0IHNldCB0byAxKSIsCQkJCQkvKiAxejF6eiAqLworCSAgImJyYW5jaCBhbHdheXMgKGlnbm9yZWQgYml0cyAxLDQsNSBzZXQgdG8gMSkiLAorCX07CisKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcHBjX25yX210Y3JmX2Nyc1s5XSA9IHsKKwkgICJtdGNyZiBtb3ZpbmcgMCBDUnMiLAorCSAgIm10Y3JmIG1vdmluZyAxIENSIiwKKwkgICJtdGNyZiBtb3ZpbmcgMiBDUnMiLAorCSAgIm10Y3JmIG1vdmluZyAzIENScyIsCisJICAibXRjcmYgbW92aW5nIDQgQ1JzIiwKKwkgICJtdGNyZiBtb3ZpbmcgNSBDUnMiLAorCSAgIm10Y3JmIG1vdmluZyA2IENScyIsCisJICAibXRjcmYgbW92aW5nIDcgQ1JzIiwKKwkgICJtdGNyZiBtb3ZpbmcgYWxsIENScyIsCisJfTsKKwwKKyMgVHJhY2UgcmVsZWFzaW5nIHJlc291cmNlcwordm9pZDo6bW9kZWwtc3RhdGljOjptb2RlbF90cmFjZV9yZWxlYXNlOm1vZGVsX2RhdGEgKm1vZGVsX3B0ciwgbW9kZWxfYnVzeSAqYnVzeQorCWludCBpOworCVRSQUNFKHRyYWNlX21vZGVsLCgiZG9uZSwgJXMsICVkIHdyaXRlYmFjayVzXG4iLCBwcGNfZnVuY3Rpb25fdW5pdF9uYW1lW2J1c3ktPnVuaXRdLAorCQkJICAgYnVzeS0+bnJfd3JpdGViYWNrcywgYnVzeS0+bnJfd3JpdGViYWNrcyA9PSAxID8gIiIgOiAicyIpKTsKKwlpZiAoYnVzeS0+aW50X2J1c3kpIHsKKwkgIGZvcihpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkgICAgaWYgKCgoMSA8PCBpKSAmIGJ1c3ktPmludF9idXN5KSAhPSAwKSB7CisJICAgICAgVFJBQ0UodHJhY2VfbW9kZWwsICgiUmVnaXN0ZXIgciVkIGlzIG5vdyBhdmFpbGFibGUuXG4iLCBpKSk7CisJICAgIH0KKwkgIH0KKwl9CisJaWYgKGJ1c3ktPmZwX2J1c3kpIHsKKwkgIGZvcihpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkgICAgaWYgKCgoMSA8PCBpKSAmIGJ1c3ktPmZwX2J1c3kpICE9IDApIHsKKwkgICAgICBUUkFDRSh0cmFjZV9tb2RlbCwgKCJSZWdpc3RlciBmJWQgaXMgbm93IGF2YWlsYWJsZS5cbiIsIGkpKTsKKwkgICAgfQorCSAgfQorCX0KKwlpZiAoYnVzeS0+Y3JfZnBzY3JfYnVzeSkgeworCSAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJICAgIGlmICgoKDEgPDwgaSkgJiBidXN5LT5jcl9mcHNjcl9idXN5KSAhPSAwKSB7CisJICAgICAgVFJBQ0UodHJhY2VfbW9kZWwsICgiUmVnaXN0ZXIgY3IlZCBpcyBub3cgYXZhaWxhYmxlLlxuIiwgaSkpOworCSAgICB9CisJICB9CisJICBpZiAoYnVzeS0+Y3JfZnBzY3JfYnVzeSAmIDB4MTAwKQorCSAgICBUUkFDRSh0cmFjZV9tb2RlbCwgKCJSZWdpc3RlciBmcHNjciBpcyBub3cgYXZhaWxhYmxlLlxuIikpOworCX0KKwlpZiAoYnVzeS0+c3ByX2J1c3kgIT0gUFBDX05PX1NQUikKKwkgIFRSQUNFKHRyYWNlX21vZGVsLCAoIlJlZ2lzdGVyICVzIGlzIG5vdyBhdmFpbGFibGUuXG4iLCBzcHJfbmFtZShidXN5LT5zcHJfYnVzeSkpKTsKKworIyBUcmFjZSBtYWtpbmcgcmVnaXN0ZXJzIGJ1c3kKK3ZvaWQ6Om1vZGVsLXN0YXRpYzo6bW9kZWxfdHJhY2VfbWFrZV9idXN5Om1vZGVsX2RhdGEgKm1vZGVsX3B0ciwgdW5zaWduZWQzMiBpbnRfbWFzaywgdW5zaWduZWQzMiBmcF9tYXNrLCB1bnNpZ25lZDMyIGNyX21hc2sKKwlpbnQgaTsKKwlpZiAoaW50X21hc2spIHsKKwkgIGZvcihpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkgICAgaWYgKCgoMSA8PCBpKSAmIGludF9tYXNrKSAhPSAwKSB7CisJICAgICAgVFJBQ0UodHJhY2VfbW9kZWwsICgiUmVnaXN0ZXIgciVkIGlzIG5vdyBidXN5LlxuIiwgaSkpOworCSAgICB9CisJICB9CisJfQorCWlmIChmcF9tYXNrKSB7CisJICBmb3IoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJICAgIGlmICgoKDEgPDwgaSkgJiBmcF9tYXNrKSAhPSAwKSB7CisJICAgICAgVFJBQ0UodHJhY2VfbW9kZWwsICgiUmVnaXN0ZXIgZiVkIGlzIG5vdyBidXN5LlxuIiwgaSkpOworCSAgICB9CisJICB9CisJfQorCWlmIChjcl9tYXNrKSB7CisJICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkgICAgaWYgKCgoMSA8PCBpKSAmIGNyX21hc2spICE9IDApIHsKKwkgICAgICBUUkFDRSh0cmFjZV9tb2RlbCwgKCJSZWdpc3RlciBjciVkIGlzIG5vdyBidXN5LlxuIiwgaSkpOworCSAgICB9CisJICB9CisJfQorCisjIFRyYWNlIHdhaXRpbmcgZm9yIHJlZ2lzdGVycyB0byBiZWNvbWUgYXZhaWxhYmxlCit2b2lkOjptb2RlbC1zdGF0aWM6Om1vZGVsX3RyYWNlX2J1c3lfcDptb2RlbF9kYXRhICptb2RlbF9wdHIsIHVuc2lnbmVkMzIgaW50X2J1c3ksIHVuc2lnbmVkMzIgZnBfYnVzeSwgdW5zaWduZWQzMiBjcl9vcl9mcHNjcl9idXN5LCBpbnQgc3ByX2J1c3kKKwlpbnQgaTsKKwlpZiAoaW50X2J1c3kpIHsKKwkgIGludF9idXN5ICY9IG1vZGVsX3B0ci0+aW50X2J1c3k7CisJICBmb3IoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJICAgIGlmICgoKDEgPDwgaSkgJiBpbnRfYnVzeSkgIT0gMCkgeworCSAgICAgIFRSQUNFKHRyYWNlX21vZGVsLCAoIldhaXRpbmcgZm9yIHJlZ2lzdGVyIHIlZC5cbiIsIGkpKTsKKwkgICAgfQorCSAgfQorCX0KKwlpZiAoZnBfYnVzeSkgeworCSAgZnBfYnVzeSAmPSBtb2RlbF9wdHItPmZwX2J1c3k7CisJICBmb3IoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJICAgIGlmICgoKDEgPDwgaSkgJiBmcF9idXN5KSAhPSAwKSB7CisJICAgICAgVFJBQ0UodHJhY2VfbW9kZWwsICgiV2FpdGluZyBmb3IgcmVnaXN0ZXIgZiVkLlxuIiwgaSkpOworCSAgICB9CisJICB9CisJfQorCWlmIChjcl9vcl9mcHNjcl9idXN5KSB7CisJICBjcl9vcl9mcHNjcl9idXN5ICY9IG1vZGVsX3B0ci0+Y3JfZnBzY3JfYnVzeTsKKwkgIGZvcihpID0gMDsgaSA8IDg7IGkrKykgeworCSAgICBpZiAoKCgxIDw8IGkpICYgY3Jfb3JfZnBzY3JfYnVzeSkgIT0gMCkgeworCSAgICAgIFRSQUNFKHRyYWNlX21vZGVsLCAoIldhaXRpbmcgZm9yIHJlZ2lzdGVyIGNyJWQuXG4iLCBpKSk7CisJICAgIH0KKwkgIH0KKwkgIGlmIChjcl9vcl9mcHNjcl9idXN5ICYgMHgxMDApCisJICAgIFRSQUNFKHRyYWNlX21vZGVsLCAoIldhaXRpbmcgZm9yIHJlZ2lzdGVyIGZwc2NyLlxuIikpOworCX0KKwlpZiAoc3ByX2J1c3kgIT0gUFBDX05PX1NQUiAmJiBtb2RlbF9wdHItPnNwcl9idXN5W3Nwcl9idXN5XSkKKwkgIFRSQUNFKHRyYWNlX21vZGVsLCAoIldhaXRpbmcgZm9yIHJlZ2lzdGVyICVzLlxuIiwgc3ByX25hbWUoc3ByX2J1c3kpKSk7CisMCisjIEFkdmFuY2Ugc3RhdGUgdG8gbmV4dCBjeWNsZSwgcmVsZWFzaW5nIGFueSByZWdpc3RlcnMgYWxsb2NhdGVkCit2b2lkOjptb2RlbC1pbnRlcm5hbDo6bW9kZWxfbmV3X2N5Y2xlOm1vZGVsX2RhdGEgKm1vZGVsX3B0cgorCW1vZGVsX2J1c3kgKmN1cl9idXN5ICA9IG1vZGVsX3B0ci0+YnVzeV9oZWFkLm5leHQ7CisJbW9kZWxfYnVzeSAqZnJlZV9saXN0ID0gbW9kZWxfcHRyLT5mcmVlX2xpc3Q7CisJbW9kZWxfYnVzeSAqYnVzeV90YWlsID0gJm1vZGVsX3B0ci0+YnVzeV9oZWFkOworCWludCBucl93cml0ZWJhY2tzICAgICA9IG1vZGVsX3B0ci0+bWF4X25yX3dyaXRlYmFja3M7CisJbW9kZWxfYnVzeSAqbmV4dDsKKworCW1vZGVsX3B0ci0+bnJfY3ljbGVzKys7CisJVFJBQ0UodHJhY2VfbW9kZWwsKCJOZXcgY3ljbGUgJWx1XG4iLCAodW5zaWduZWQgbG9uZyltb2RlbF9wdHItPm5yX2N5Y2xlcykpOworCWZvciAoIDsgY3VyX2J1c3k7IGN1cl9idXN5ID0gbmV4dCkgeworCSAgbmV4dCA9IGN1cl9idXN5LT5uZXh0OworCSAgaWYgKC0tY3VyX2J1c3ktPmRvbmUgPD0gMCkgewkJLyogZnVuY3Rpb24gdW5pdCBkb25lLCByZWxlYXNlIHJlZ2lzdGVycyBpZiB3ZSBoYXZlIHdyaXRlYmFjayBzbG90cyAqLworCSAgICBucl93cml0ZWJhY2tzIC09IGN1cl9idXN5LT5ucl93cml0ZWJhY2tzOworCSAgICBpZiAobnJfd3JpdGViYWNrcyA+PSAwKSB7CisJICAgICAgbW9kZWxfcHRyLT5pbnRfYnVzeSAmPSB+Y3VyX2J1c3ktPmludF9idXN5OworCSAgICAgIG1vZGVsX3B0ci0+ZnBfYnVzeSAmPSB+Y3VyX2J1c3ktPmZwX2J1c3k7CisJICAgICAgbW9kZWxfcHRyLT5jcl9mcHNjcl9idXN5ICY9IH5jdXJfYnVzeS0+Y3JfZnBzY3JfYnVzeTsKKwkgICAgICBpZiAoY3VyX2J1c3ktPnNwcl9idXN5ICE9IFBQQ19OT19TUFIpCisJCW1vZGVsX3B0ci0+c3ByX2J1c3lbY3VyX2J1c3ktPnNwcl9idXN5XSA9IDA7CisKKwkgICAgICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2VfbW9kZWxdKQorCQltb2RlbF90cmFjZV9yZWxlYXNlKG1vZGVsX3B0ciwgY3VyX2J1c3kpOworCisJICAgICAgbW9kZWxfcHRyLT5idXN5W2N1cl9idXN5LT51bml0XSA9IDA7CisJICAgICAgY3VyX2J1c3ktPm5leHQgPSBmcmVlX2xpc3Q7CisJICAgICAgZnJlZV9saXN0ID0gY3VyX2J1c3k7CisJICAgIH0KKwkgICAgZWxzZSB7CS8qIHdyaXRlYmFjayBzbG90cyBub3QgYXZhaWxhYmxlICovCisJICAgICAgVFJBQ0UodHJhY2VfbW9kZWwsKCIlZCB3cml0ZWJhY2sgc2xvdCVzIG5vdCBhdmFpbGFibGUgZm9yICVzXG4iLAorCQkJCSBjdXJfYnVzeS0+bnJfd3JpdGViYWNrcywKKwkJCQkgY3VyX2J1c3ktPm5yX3dyaXRlYmFja3MgPT0gMSA/ICIgaXMiIDogInMgYXJlIiwKKwkJCQkgcHBjX2Z1bmN0aW9uX3VuaXRfbmFtZVtjdXJfYnVzeS0+dW5pdF0pKTsKKwkgICAgICBjdXJfYnVzeS0+ZG9uZSsrOwkJCS8qIHVuZG8gLS0gYWJvdmUgKi8KKwkgICAgICBtb2RlbF9wdHItPm5yX3N0YWxsc193cml0ZWJhY2srKzsKKwkgICAgICBidXN5X3RhaWwtPm5leHQgPSBjdXJfYnVzeTsKKwkgICAgICBidXN5X3RhaWwgPSBjdXJfYnVzeTsKKwkgICAgfQorCSAgfQorCSAgZWxzZSBpZiAoLS1jdXJfYnVzeS0+aXNzdWUgPD0gMCkgewkvKiBmdW5jdGlvbiB1bml0IHBpcGVsaW5lZCwgYWxsb3cgbmV3IHVzZSAqLworCSAgICBUUkFDRSh0cmFjZV9tb2RlbCwoInBpcGVsaW5lLCAlcyByZWFkeSBmb3IgbmV4dCBjbGllbnRcbiIsIHBwY19mdW5jdGlvbl91bml0X25hbWVbY3VyX2J1c3ktPnVuaXRdKSk7CisJICAgIG1vZGVsX3B0ci0+YnVzeVtjdXJfYnVzeS0+dW5pdF0gPSAwOworCSAgICBidXN5X3RhaWwtPm5leHQgPSBjdXJfYnVzeTsKKwkgICAgYnVzeV90YWlsID0gY3VyX2J1c3k7CisJICB9CisJICBlbHNlIHsKKwkgICAgVFJBQ0UodHJhY2VfbW9kZWwsKCIlcyBzdGlsbCB3b3JraW5nLCBpc3N1ZSA9ICVkLCBkb25lID0gJWRcbiIsCisJCQkgICAgICAgcHBjX2Z1bmN0aW9uX3VuaXRfbmFtZVtjdXJfYnVzeS0+dW5pdF0sCisJCQkgICAgICAgY3VyX2J1c3ktPmlzc3VlLAorCQkJICAgICAgIGN1cl9idXN5LT5kb25lKSk7CisJICAgIGJ1c3lfdGFpbC0+bmV4dCA9IGN1cl9idXN5OworCSAgICBidXN5X3RhaWwgPSBjdXJfYnVzeTsKKwkgIH0KKwl9CisKKwlidXN5X3RhaWwtPm5leHQgPSAobW9kZWxfYnVzeSAqKTA7CisJbW9kZWxfcHRyLT5idXN5X3RhaWwgPSBidXN5X3RhaWw7CisJbW9kZWxfcHRyLT5mcmVlX2xpc3QgPSBmcmVlX2xpc3Q7CisKKyMgTWFyayBhIGZ1bmN0aW9uIHVuaXQgYXMgYnVzeSwgcmV0dXJuIHRoZSBidXN5IHN0cnVjdHVyZQorbW9kZWxfYnVzeSAqOjptb2RlbC1pbnRlcm5hbDo6bW9kZWxfbWFrZV9idXN5Om1vZGVsX2RhdGEgKm1vZGVsX3B0ciwgcHBjX2Z1bmN0aW9uX3VuaXQgdW5pdCwgaW50IGlzc3VlLCBpbnQgZG9uZQorCW1vZGVsX2J1c3kgKmJ1c3k7CisKKwlUUkFDRSh0cmFjZV9tb2RlbCwoInVuaXQgPSAlcywgaXNzdWUgPSAlZCwgZG9uZSA9ICVkXG4iLCBwcGNfZnVuY3Rpb25fdW5pdF9uYW1lW3VuaXRdLCBpc3N1ZSwgZG9uZSkpOworCisJaWYgKCFtb2RlbF9wdHItPmZyZWVfbGlzdCkgeworCSAgYnVzeSA9IFpBTExPQyhtb2RlbF9idXN5KTsKKwl9CisJZWxzZSB7CisJICBidXN5ID0gbW9kZWxfcHRyLT5mcmVlX2xpc3Q7CisJICBtb2RlbF9wdHItPmZyZWVfbGlzdCA9IGJ1c3ktPm5leHQ7CisJICBidXN5LT5uZXh0ID0gKG1vZGVsX2J1c3kgKikwOworCSAgYnVzeS0+aW50X2J1c3kgPSAwOworCSAgYnVzeS0+ZnBfYnVzeSA9IDA7CisJICBidXN5LT5jcl9mcHNjcl9idXN5ID0gMDsKKwkgIGJ1c3ktPm5yX3dyaXRlYmFja3MgPSAwOworCX0KKworCWJ1c3ktPnVuaXQgPSB1bml0OworCWJ1c3ktPmlzc3VlID0gaXNzdWU7CisJYnVzeS0+ZG9uZSA9IGRvbmU7CisJYnVzeS0+c3ByX2J1c3kgPSBQUENfTk9fU1BSOworCW1vZGVsX3B0ci0+YnVzeV90YWlsLT5uZXh0ID0gYnVzeTsKKwltb2RlbF9wdHItPmJ1c3lfdGFpbCA9IGJ1c3k7CisJbW9kZWxfcHRyLT5idXN5W3VuaXRdID0gMTsKKwltb2RlbF9wdHItPm5yX3VuaXRzW3VuaXRdKys7CisJcmV0dXJuIGJ1c3k7CisMCisjIFdhaXQgdW50aWwgYSBmdW5jdGlvbiB1bml0IGlzIG5vbi1idXN5LCBhbmQgdGhlbiBhbGxvY2F0ZSBhIGJ1c3kgcG9pbnRlciAmIHJldHVybiB0aGUgcG9pbnRlcgorbW9kZWxfYnVzeSAqOjptb2RlbC1pbnRlcm5hbDo6bW9kZWxfd2FpdF9mb3JfdW5pdDppdGFibGVfaW5kZXggaW5kZXgsIG1vZGVsX2RhdGEgKmNvbnN0IG1vZGVsX3B0ciwgY29uc3QgbW9kZWxfdGltZSAqY29uc3QgdGltZV9wdHIKKwlwcGNfZnVuY3Rpb25fdW5pdCBmaXJzdF91bml0ID0gdGltZV9wdHItPmZpcnN0X3VuaXQ7CisJcHBjX2Z1bmN0aW9uX3VuaXQgc2Vjb25kX3VuaXQgPSB0aW1lX3B0ci0+c2Vjb25kX3VuaXQ7CisJaW50IHN0YWxsX2luY3JlbWVudCA9IDA7CisKKwlmb3IgKDs7KSB7CisJICBpZiAoIW1vZGVsX3B0ci0+YnVzeVtmaXJzdF91bml0XSkKKwkgICAgcmV0dXJuIG1vZGVsX21ha2VfYnVzeShtb2RlbF9wdHIsIGZpcnN0X3VuaXQsCisJCQkJICAgbW9kZWxfcHRyLT50aW1pbmdbaW5kZXhdLmlzc3VlLAorCQkJCSAgIG1vZGVsX3B0ci0+dGltaW5nW2luZGV4XS5kb25lKTsKKworCSAgaWYgKCFtb2RlbF9wdHItPmJ1c3lbc2Vjb25kX3VuaXRdKQorCSAgICByZXR1cm4gbW9kZWxfbWFrZV9idXN5KG1vZGVsX3B0ciwgc2Vjb25kX3VuaXQsCisJCQkJICAgbW9kZWxfcHRyLT50aW1pbmdbaW5kZXhdLmlzc3VlLAorCQkJCSAgIG1vZGVsX3B0ci0+dGltaW5nW2luZGV4XS5kb25lKTsKKworCSAgVFJBQ0UodHJhY2VfbW9kZWwsKCJhbGwgZnVuY3Rpb24gdW5pdHMgYXJlIGJ1c3kgZm9yICVzXG4iLCBpdGFibGVbaW5kZXhdLm5hbWUpKTsKKwkgIG1vZGVsX3B0ci0+bnJfc3RhbGxzX3VuaXQgKz0gc3RhbGxfaW5jcmVtZW50OwkJLyogZG9uJ3QgY291bnQgZmlyc3Qgc3RhbGwgKi8KKwkgIHN0YWxsX2luY3JlbWVudCA9IDE7CisJICBtb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsKKwl9CisKKyMgU2VyaWFsaXplIHRoZSBwcm9jZXNzb3IsIHdhaXRpbmcgZm9yIGFsbCBpbnN0cnVjdGlvbnMgdG8gZHJhaW4gb3V0IGJlZm9yZSBhZGRpbmcgYW4gaW5zdHJ1Y3Rpb24uCit2b2lkOjptb2RlbC1mdW5jdGlvbjo6bW9kZWxfc2VyaWFsaXplOml0YWJsZV9pbmRleCBpbmRleCwgbW9kZWxfZGF0YSAqbW9kZWxfcHRyCisJd2hpbGUgKG1vZGVsX3B0ci0+YnVzeV9oZWFkLm5leHQpIHsKKwkgIFRSQUNFKHRyYWNlX21vZGVsLCgid2FpdGluZyBmb3IgcGlwZWxpbmUgdG8gZW1wdHlcbiIpKTsKKwkgIG1vZGVsX3B0ci0+bnJfc3RhbGxzX3NlcmlhbGl6ZSsrOworCSAgbW9kZWxfbmV3X2N5Y2xlKG1vZGVsX3B0cik7CisJfQorCSh2b2lkKSBtb2RlbF9tYWtlX2J1c3kobW9kZWxfcHRyLAorCQkJICAgICAgIG1vZGVsX3B0ci0+dGltaW5nW2luZGV4XS5maXJzdF91bml0LAorCQkJICAgICAgIG1vZGVsX3B0ci0+dGltaW5nW2luZGV4XS5pc3N1ZSwKKwkJCSAgICAgICBtb2RlbF9wdHItPnRpbWluZ1tpbmRleF0uZG9uZSk7CisKKyMgV2FpdCBmb3IgYSBDUiB0byBiZWNvbWUgdW5idXN5Cit2b2lkOjptb2RlbC1mdW5jdGlvbjo6bW9kZWxfd2FpdF9mb3JfY3I6bW9kZWxfZGF0YSAqbW9kZWxfcHRyLCB1bnNpZ25lZCBDUkJJVAorCXVuc2lnbmVkIHU7CisJdW5zaWduZWQzMiBjcl9tYXNrOworCWludCBjcl92YXIgPSAwOworCWZvciAodSA9IDB4YzAwMDAwMDA7ICh1ICE9IDApICYmIChDUkJJVCAmIHUpID09IDA7IHUgPj49IDQgKQorCSAgY3JfdmFyKys7CisKKwljcl9tYXNrID0gKDEgPDwgY3JfdmFyKTsKKwl3aGlsZSAoKG1vZGVsX3B0ci0+Y3JfZnBzY3JfYnVzeSAmIGNyX21hc2spICE9IDApIHsKKwkgIFRSQUNFKHRyYWNlX21vZGVsLCgid2FpdGluZyBmb3IgQ1IgJWRcbiIsIGNyX3ZhcikpOworCSAgbW9kZWxfcHRyLT5ucl9zdGFsbHNfZGF0YSsrOworCSAgbW9kZWxfbmV3X2N5Y2xlKG1vZGVsX3B0cik7CisJfQorCisjIFNjaGVkdWxlIGFuIGluc3RydWN0aW9uIHRoYXQgdGFrZXMgaW50ZWdlciBpbnB1dCByZWdpc3RlcnMgYW5kIHByb2R1Y2VzIG91dHB1dCByZWdpc3RlcnMKK3ZvaWQ6Om1vZGVsLWZ1bmN0aW9uOjpwcGNfaW5zbl9pbnQ6aXRhYmxlX2luZGV4IGluZGV4LCBtb2RlbF9kYXRhICptb2RlbF9wdHIsIGNvbnN0IHVuc2lnbmVkMzIgb3V0X21hc2ssIGNvbnN0IHVuc2lnbmVkMzIgaW5fbWFzaworCWNvbnN0IHVuc2lnbmVkMzIgaW50X21hc2sgPSBvdXRfbWFzayB8IGluX21hc2s7CisJbW9kZWxfYnVzeSAqYnVzeV9wdHI7CisKKwlpZiAoKG1vZGVsX3B0ci0+aW50X2J1c3kgJiBpbnRfbWFzaykgIT0gMCkgeworCSAgbW9kZWxfbmV3X2N5Y2xlKG1vZGVsX3B0cik7CQkJLyogZG9uJ3QgY291bnQgZmlyc3QgZGVwZW5kZW5jeSBhcyBhIHN0YWxsICovCisKKwkgIHdoaWxlICgobW9kZWxfcHRyLT5pbnRfYnVzeSAmIGludF9tYXNrKSAhPSAwKSB7CisJICAgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9tb2RlbF0pCisJICAgICAgbW9kZWxfdHJhY2VfYnVzeV9wKG1vZGVsX3B0ciwgaW50X21hc2ssIDAsIDAsIFBQQ19OT19TUFIpOworCisJICAgIG1vZGVsX3B0ci0+bnJfc3RhbGxzX2RhdGErKzsKKwkgICAgbW9kZWxfbmV3X2N5Y2xlKG1vZGVsX3B0cik7CisJICB9CisJfQorCisJYnVzeV9wdHIgPSBtb2RlbF93YWl0X2Zvcl91bml0KGluZGV4LCBtb2RlbF9wdHIsICZtb2RlbF9wdHItPnRpbWluZ1tpbmRleF0pOworCW1vZGVsX3B0ci0+aW50X2J1c3kgfD0gb3V0X21hc2s7CisJYnVzeV9wdHItPmludF9idXN5IHw9IG91dF9tYXNrOworCWlmIChvdXRfbWFzaykKKwkgIGJ1c3lfcHRyLT5ucl93cml0ZWJhY2tzID0gKFBQQ19PTkVfQklUX1NFVF9QKG91dF9tYXNrKSkgPyAxIDogMjsKKworCWlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9tb2RlbF0pCisJICBtb2RlbF90cmFjZV9tYWtlX2J1c3kobW9kZWxfcHRyLCBvdXRfbWFzaywgMCwgMCk7CisKKyMgU2NoZWR1bGUgYW4gaW5zdHJ1Y3Rpb24gdGhhdCB0YWtlcyBpbnRlZ2VyIGlucHV0IHJlZ2lzdGVycyBhbmQgcHJvZHVjZXMgb3V0cHV0IHJlZ2lzdGVycyAmIHNldHMgYSBDUiByZWdpc3Rlcgordm9pZDo6bW9kZWwtZnVuY3Rpb246OnBwY19pbnNuX2ludF9jcjppdGFibGVfaW5kZXggaW5kZXgsIG1vZGVsX2RhdGEgKm1vZGVsX3B0ciwgY29uc3QgdW5zaWduZWQzMiBvdXRfbWFzaywgY29uc3QgdW5zaWduZWQzMiBpbl9tYXNrLCBjb25zdCB1bnNpZ25lZDMyIGNyX21hc2sKKwljb25zdCB1bnNpZ25lZDMyIGludF9tYXNrID0gb3V0X21hc2sgfCBpbl9tYXNrOworCW1vZGVsX2J1c3kgKmJ1c3lfcHRyOworCisJaWYgKChtb2RlbF9wdHItPmludF9idXN5ICYgaW50X21hc2spIHx8IChtb2RlbF9wdHItPmNyX2Zwc2NyX2J1c3kgJiBjcl9tYXNrKSkgeworCSAgbW9kZWxfbmV3X2N5Y2xlKG1vZGVsX3B0cik7CQkJLyogZG9uJ3QgY291bnQgZmlyc3QgZGVwZW5kZW5jeSBhcyBhIHN0YWxsICovCisKKwkgIHdoaWxlICgobW9kZWxfcHRyLT5pbnRfYnVzeSAmIGludF9tYXNrKSB8fCAobW9kZWxfcHRyLT5jcl9mcHNjcl9idXN5ICYgY3JfbWFzaykpIHsKKwkgICAgaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX21vZGVsXSkKKwkgICAgICBtb2RlbF90cmFjZV9idXN5X3AobW9kZWxfcHRyLCBpbnRfbWFzaywgMCwgY3JfbWFzaywgUFBDX05PX1NQUik7CisKKwkgICAgbW9kZWxfcHRyLT5ucl9zdGFsbHNfZGF0YSsrOworCSAgICBtb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsKKwkgIH0KKwl9CisKKwlidXN5X3B0ciA9IG1vZGVsX3dhaXRfZm9yX3VuaXQoaW5kZXgsIG1vZGVsX3B0ciwgJm1vZGVsX3B0ci0+dGltaW5nW2luZGV4XSk7CisJbW9kZWxfcHRyLT5pbnRfYnVzeSB8PSBvdXRfbWFzazsKKwlidXN5X3B0ci0+aW50X2J1c3kgfD0gb3V0X21hc2s7CisJbW9kZWxfcHRyLT5jcl9mcHNjcl9idXN5IHw9IGNyX21hc2s7CisJYnVzeV9wdHItPmNyX2Zwc2NyX2J1c3kgfD0gY3JfbWFzazsKKwlpZiAob3V0X21hc2spCisJICBidXN5X3B0ci0+bnJfd3JpdGViYWNrcyA9IChQUENfT05FX0JJVF9TRVRfUChvdXRfbWFzaykpID8gMSA6IDI7CisKKwlpZiAoY3JfbWFzaykKKwkgIGJ1c3lfcHRyLT5ucl93cml0ZWJhY2tzKys7CisKKwlpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2VfbW9kZWxdKQorCSAgbW9kZWxfdHJhY2VfbWFrZV9idXN5KG1vZGVsX3B0ciwgb3V0X21hc2ssIDAsIGNyX21hc2spOworCisKKyMgU2NoZWR1bGUgYW4gaW5zdHJ1Y3Rpb24gdGhhdCB0YWtlcyBDUiBpbnB1dCByZWdpc3RlcnMgYW5kIHByb2R1Y2VzIG91dHB1dCBDUiByZWdpc3RlcnMKK3ZvaWQ6Om1vZGVsLWZ1bmN0aW9uOjpwcGNfaW5zbl9jcjppdGFibGVfaW5kZXggaW5kZXgsIG1vZGVsX2RhdGEgKm1vZGVsX3B0ciwgY29uc3QgdW5zaWduZWQzMiBvdXRfbWFzaywgY29uc3QgdW5zaWduZWQzMiBpbl9tYXNrCisJY29uc3QgdW5zaWduZWQzMiBjcl9tYXNrID0gb3V0X21hc2sgfCBpbl9tYXNrOworCW1vZGVsX2J1c3kgKmJ1c3lfcHRyOworCisJaWYgKChtb2RlbF9wdHItPmNyX2Zwc2NyX2J1c3kgJiBjcl9tYXNrKSAhPSAwKSB7CisJICBtb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsJCQkvKiBkb24ndCBjb3VudCBmaXJzdCBkZXBlbmRlbmN5IGFzIGEgc3RhbGwgKi8KKworCSAgd2hpbGUgKChtb2RlbF9wdHItPmNyX2Zwc2NyX2J1c3kgJiBjcl9tYXNrKSAhPSAwKSB7CisJICAgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9tb2RlbF0pCisJICAgICAgbW9kZWxfdHJhY2VfYnVzeV9wKG1vZGVsX3B0ciwgMCwgMCwgY3JfbWFzaywgUFBDX05PX1NQUik7CisKKwkgICAgbW9kZWxfcHRyLT5ucl9zdGFsbHNfZGF0YSsrOworCSAgICBtb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsKKwkgIH0KKwl9CisKKwlidXN5X3B0ciA9IG1vZGVsX3dhaXRfZm9yX3VuaXQoaW5kZXgsIG1vZGVsX3B0ciwgJm1vZGVsX3B0ci0+dGltaW5nW2luZGV4XSk7CisJbW9kZWxfcHRyLT5jcl9mcHNjcl9idXN5IHw9IG91dF9tYXNrOworCWJ1c3lfcHRyLT5jcl9mcHNjcl9idXN5IHw9IG91dF9tYXNrOworCWlmIChvdXRfbWFzaykKKwkgIGJ1c3lfcHRyLT5ucl93cml0ZWJhY2tzID0gMTsKKworCWlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9tb2RlbF0pCisJICBtb2RlbF90cmFjZV9tYWtlX2J1c3kobW9kZWxfcHRyLCAwLCAwLCBvdXRfbWFzayk7CisKKworIyBTY2hlZHVsZSBhbiBpbnN0cnVjdGlvbiB0aGF0IHRha2VzIGZsb2F0aW5nIHBvaW50IGlucHV0IHJlZ2lzdGVycyBhbmQgcHJvZHVjZXMgYW4gb3V0cHV0IGZwIHJlZ2lzdGVyCit2b2lkOjptb2RlbC1mdW5jdGlvbjo6cHBjX2luc25fZmxvYXQ6aXRhYmxlX2luZGV4IGluZGV4LCBtb2RlbF9kYXRhICptb2RlbF9wdHIsIGNvbnN0IHVuc2lnbmVkMzIgb3V0X21hc2ssIGNvbnN0IHVuc2lnbmVkMzIgaW5fbWFzaworCWNvbnN0IHVuc2lnbmVkMzIgZnBfbWFzayA9IG91dF9tYXNrIHwgaW5fbWFzazsKKwltb2RlbF9idXN5ICpidXN5X3B0cjsKKworCWlmICgobW9kZWxfcHRyLT5mcF9idXN5ICYgZnBfbWFzaykgIT0gMCkgeworCSAgbW9kZWxfbmV3X2N5Y2xlKG1vZGVsX3B0cik7CQkJLyogZG9uJ3QgY291bnQgZmlyc3QgZGVwZW5kZW5jeSBhcyBhIHN0YWxsICovCisKKwkgIHdoaWxlICgobW9kZWxfcHRyLT5mcF9idXN5ICYgZnBfbWFzaykgIT0gMCkgeworCSAgICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2VfbW9kZWxdKQorCSAgICAgIG1vZGVsX3RyYWNlX2J1c3lfcChtb2RlbF9wdHIsIDAsIGZwX21hc2ssIDAsIFBQQ19OT19TUFIpOworCisJICAgIG1vZGVsX3B0ci0+bnJfc3RhbGxzX2RhdGErKzsKKwkgICAgbW9kZWxfbmV3X2N5Y2xlKG1vZGVsX3B0cik7CisJICB9CisJfQorCisJYnVzeV9wdHIgPSBtb2RlbF93YWl0X2Zvcl91bml0KGluZGV4LCBtb2RlbF9wdHIsICZtb2RlbF9wdHItPnRpbWluZ1tpbmRleF0pOworCW1vZGVsX3B0ci0+ZnBfYnVzeSB8PSBvdXRfbWFzazsKKwlidXN5X3B0ci0+ZnBfYnVzeSB8PSBvdXRfbWFzazsKKwlidXN5X3B0ci0+bnJfd3JpdGViYWNrcyA9IDE7CisJaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX21vZGVsXSkKKwkgIG1vZGVsX3RyYWNlX21ha2VfYnVzeShtb2RlbF9wdHIsIDAsIG91dF9tYXNrLCAwKTsKKworCisjIFNjaGVkdWxlIGFuIGluc3RydWN0aW9uIHRoYXQgdGFrZXMgZmxvYXRpbmcgcG9pbnQgaW5wdXQgcmVnaXN0ZXJzIGFuZCBwcm9kdWNlcyBhbiBvdXRwdXQgZnAgcmVnaXN0ZXIgJiBzZXRzIGEgQ1IgcmVnCit2b2lkOjptb2RlbC1mdW5jdGlvbjo6cHBjX2luc25fZmxvYXRfY3I6aXRhYmxlX2luZGV4IGluZGV4LCBtb2RlbF9kYXRhICptb2RlbF9wdHIsIGNvbnN0IHVuc2lnbmVkMzIgb3V0X21hc2ssIGNvbnN0IHVuc2lnbmVkMzIgaW5fbWFzaywgY29uc3QgdW5zaWduZWQzMiBjcl9tYXNrCisJY29uc3QgdW5zaWduZWQzMiBmcF9tYXNrID0gb3V0X21hc2sgfCBpbl9tYXNrOworCW1vZGVsX2J1c3kgKmJ1c3lfcHRyOworCisJaWYgKChtb2RlbF9wdHItPmZwX2J1c3kgJiBmcF9tYXNrKSB8fCAobW9kZWxfcHRyLT5jcl9mcHNjcl9idXN5ICYgY3JfbWFzaykpIHsKKwkgIG1vZGVsX25ld19jeWNsZShtb2RlbF9wdHIpOwkJCS8qIGRvbid0IGNvdW50IGZpcnN0IGRlcGVuZGVuY3kgYXMgYSBzdGFsbCAqLworCisJICB3aGlsZSAoKG1vZGVsX3B0ci0+ZnBfYnVzeSAmIGZwX21hc2spIHx8IChtb2RlbF9wdHItPmNyX2Zwc2NyX2J1c3kgJiBjcl9tYXNrKSkgeworCSAgICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2VfbW9kZWxdKQorCSAgICAgIG1vZGVsX3RyYWNlX2J1c3lfcChtb2RlbF9wdHIsIDAsIGZwX21hc2ssIGNyX21hc2ssIFBQQ19OT19TUFIpOworCisJICAgIG1vZGVsX3B0ci0+bnJfc3RhbGxzX2RhdGErKzsKKwkgICAgbW9kZWxfbmV3X2N5Y2xlKG1vZGVsX3B0cik7CisJICB9CisJfQorCisJYnVzeV9wdHIgPSBtb2RlbF93YWl0X2Zvcl91bml0KGluZGV4LCBtb2RlbF9wdHIsICZtb2RlbF9wdHItPnRpbWluZ1tpbmRleF0pOworCW1vZGVsX3B0ci0+ZnBfYnVzeSB8PSBvdXRfbWFzazsKKwlidXN5X3B0ci0+ZnBfYnVzeSB8PSBvdXRfbWFzazsKKwltb2RlbF9wdHItPmNyX2Zwc2NyX2J1c3kgfD0gY3JfbWFzazsKKwlidXN5X3B0ci0+Y3JfZnBzY3JfYnVzeSB8PSBjcl9tYXNrOworCWJ1c3lfcHRyLT5ucl93cml0ZWJhY2tzID0gKGNyX21hc2spID8gMiA6IDE7CisJaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX21vZGVsXSkKKwkgIG1vZGVsX3RyYWNlX21ha2VfYnVzeShtb2RlbF9wdHIsIDAsIG91dF9tYXNrLCBjcl9tYXNrKTsKKworCisjIFNjaGVkdWxlIGFuIGluc3RydWN0aW9uIHRoYXQgdGFrZXMgYm90aCBpbnQvZmxvYXQgaW5wdXQgcmVnaXN0ZXJzIGFuZCBwcm9kdWNlcyBvdXRwdXQgaW50L2Zsb2F0IHJlZ2lzdGVycwordm9pZDo6bW9kZWwtZnVuY3Rpb246OnBwY19pbnNuX2ludF9mbG9hdDppdGFibGVfaW5kZXggaW5kZXgsIG1vZGVsX2RhdGEgKm1vZGVsX3B0ciwgY29uc3QgdW5zaWduZWQzMiBvdXRfaW50X21hc2ssIGNvbnN0IHVuc2lnbmVkMzIgb3V0X2ZwX21hc2ssIGNvbnN0IHVuc2lnbmVkMzIgaW5faW50X21hc2ssIGNvbnN0IHVuc2lnbmVkMzIgaW5fZnBfbWFzaworCWNvbnN0IHVuc2lnbmVkMzIgaW50X21hc2sgPSBvdXRfaW50X21hc2sgfCBpbl9pbnRfbWFzazsKKwljb25zdCB1bnNpZ25lZDMyIGZwX21hc2sgPSBvdXRfZnBfbWFzayB8IGluX2ZwX21hc2s7CisJbW9kZWxfYnVzeSAqYnVzeV9wdHI7CisKKwlpZiAoKG1vZGVsX3B0ci0+aW50X2J1c3kgJiBpbnRfbWFzaykgfHwgKG1vZGVsX3B0ci0+ZnBfYnVzeSAmIGZwX21hc2spKSB7CisJICBtb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsJCQkvKiBkb24ndCBjb3VudCBmaXJzdCBkZXBlbmRlbmN5IGFzIGEgc3RhbGwgKi8KKworCSAgd2hpbGUgKChtb2RlbF9wdHItPmludF9idXN5ICYgaW50X21hc2spIHx8IChtb2RlbF9wdHItPmZwX2J1c3kgJiBmcF9tYXNrKSkgeworCSAgICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2VfbW9kZWxdKQorCSAgICAgIG1vZGVsX3RyYWNlX2J1c3lfcChtb2RlbF9wdHIsIGludF9tYXNrLCBmcF9tYXNrLCAwLCBQUENfTk9fU1BSKTsKKworCSAgICBtb2RlbF9wdHItPm5yX3N0YWxsc19kYXRhKys7CisJICAgIG1vZGVsX25ld19jeWNsZShtb2RlbF9wdHIpOworCSAgfQorCisJICBidXN5X3B0ciA9IG1vZGVsX3dhaXRfZm9yX3VuaXQoaW5kZXgsIG1vZGVsX3B0ciwgJm1vZGVsX3B0ci0+dGltaW5nW2luZGV4XSk7CisJICBtb2RlbF9wdHItPmludF9idXN5IHw9IG91dF9pbnRfbWFzazsKKwkgIGJ1c3lfcHRyLT5pbnRfYnVzeSB8PSBvdXRfaW50X21hc2s7CisJICBtb2RlbF9wdHItPmZwX2J1c3kgfD0gb3V0X2ZwX21hc2s7CisJICBidXN5X3B0ci0+ZnBfYnVzeSB8PSBvdXRfZnBfbWFzazsKKwkgIGJ1c3lfcHRyLT5ucl93cml0ZWJhY2tzID0gKChvdXRfaW50X21hc2spID8gMSA6IDApICsgKChvdXRfZnBfbWFzaykgPyAxIDogMCk7CisJICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2VfbW9kZWxdKQorCSAgICBtb2RlbF90cmFjZV9tYWtlX2J1c3kobW9kZWxfcHRyLCBvdXRfaW50X21hc2ssIG91dF9mcF9tYXNrLCAwKTsKKwkgIHJldHVybjsKKwl9CisKKyMgU2NoZWR1bGUgYW4gTUZTUFIgaW5zdHJ1Y3Rpb24gdGhhdCB0YWtlcyAxIHNwZWNpYWwgcHVycG9zZSByZWdpc3RlciBhbmQgcHJvZHVjZXMgYW4gaW50ZWdlciBvdXRwdXQgcmVnaXN0ZXIKK3ZvaWQ6Om1vZGVsLWZ1bmN0aW9uOjpwcGNfaW5zbl9mcm9tX3NwcjppdGFibGVfaW5kZXggaW5kZXgsIG1vZGVsX2RhdGEgKm1vZGVsX3B0ciwgY29uc3QgdW5zaWduZWQzMiBpbnRfbWFzaywgY29uc3QgdW5zaWduZWQgblNQUgorCW1vZGVsX2J1c3kgKmJ1c3lfcHRyOworCisJd2hpbGUgKChtb2RlbF9wdHItPmludF9idXN5ICYgaW50X21hc2spICE9IDAgfHwgbW9kZWxfcHRyLT5zcHJfYnVzeVtuU1BSXSAhPSAwKSB7CisJICBpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2VfbW9kZWxdKQorCSAgICBtb2RlbF90cmFjZV9idXN5X3AobW9kZWxfcHRyLCBpbnRfbWFzaywgMCwgMCwgblNQUik7CisKKwkgIG1vZGVsX3B0ci0+bnJfc3RhbGxzX2RhdGErKzsKKwkgIG1vZGVsX25ld19jeWNsZShtb2RlbF9wdHIpOworCX0KKworCWJ1c3lfcHRyID0gbW9kZWxfd2FpdF9mb3JfdW5pdChpbmRleCwgbW9kZWxfcHRyLCAmbW9kZWxfcHRyLT50aW1pbmdbaW5kZXhdKTsKKwltb2RlbF9wdHItPmludF9idXN5IHw9IGludF9tYXNrOworCWJ1c3lfcHRyLT5pbnRfYnVzeSB8PSBpbnRfbWFzazsKKwlidXN5X3B0ci0+bnJfd3JpdGViYWNrcyA9IDE7CisJaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX21vZGVsXSkKKwkgIG1vZGVsX3RyYWNlX21ha2VfYnVzeShtb2RlbF9wdHIsIGludF9tYXNrLCAwLCAwKTsKKworIyBTY2hlZHVsZSBhbiBNVFNQUiBpbnN0cnVjdGlvbiB0aGF0IHRha2VzIDEgaW50ZWdlciByZWdpc3RlciBhbmQgcHJvZHVjZXMgYSBzcGVjaWFsIHB1cnBvc2Ugb3V0cHV0IHJlZ2lzdGVyCit2b2lkOjptb2RlbC1mdW5jdGlvbjo6cHBjX2luc25fdG9fc3ByOml0YWJsZV9pbmRleCBpbmRleCwgbW9kZWxfZGF0YSAqbW9kZWxfcHRyLCBjb25zdCB1bnNpZ25lZDMyIGludF9tYXNrLCBjb25zdCB1bnNpZ25lZCBuU1BSCisJbW9kZWxfYnVzeSAqYnVzeV9wdHI7CisKKwl3aGlsZSAoKG1vZGVsX3B0ci0+aW50X2J1c3kgJiBpbnRfbWFzaykgIT0gMCB8fCBtb2RlbF9wdHItPnNwcl9idXN5W25TUFJdICE9IDApIHsKKwkgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9tb2RlbF0pCisJICAgIG1vZGVsX3RyYWNlX2J1c3lfcChtb2RlbF9wdHIsIGludF9tYXNrLCAwLCAwLCBuU1BSKTsKKworCSAgbW9kZWxfcHRyLT5ucl9zdGFsbHNfZGF0YSsrOworCSAgbW9kZWxfbmV3X2N5Y2xlKG1vZGVsX3B0cik7CisJfQorCisJYnVzeV9wdHIgPSBtb2RlbF93YWl0X2Zvcl91bml0KGluZGV4LCBtb2RlbF9wdHIsICZtb2RlbF9wdHItPnRpbWluZ1tpbmRleF0pOworCWJ1c3lfcHRyLT5zcHJfYnVzeSA9IG5TUFI7CisJbW9kZWxfcHRyLT5zcHJfYnVzeVtuU1BSXSA9IDE7CisJYnVzeV9wdHItPm5yX3dyaXRlYmFja3MgPSAxOworCVRSQUNFKHRyYWNlX21vZGVsLCgiTWFraW5nIHJlZ2lzdGVyICVzIGJ1c3kuXG4iLCBzcHJfbmFtZShuU1BSKSkpOworCisjIFNjaGVkdWxlIGEgTUZDUiBpbnN0cnVjdGlvbiB0aGF0IG1vdmVzIHRoZSBDUiBpbnRvIGFuIGludGVnZXIgcmVnc2l0ZXIKK3ZvaWQ6Om1vZGVsLWZ1bmN0aW9uOjpwcGNfaW5zbl9tZmNyOml0YWJsZV9pbmRleCBpbmRleCwgbW9kZWxfZGF0YSAqbW9kZWxfcHRyLCB1bnNpZ25lZDMyIGludF9tYXNrCisJY29uc3QgdW5zaWduZWQzMiBjcl9tYXNrID0gMHhmZjsKKwltb2RlbF9idXN5ICpidXN5X3B0cjsKKworCXdoaWxlICgoKG1vZGVsX3B0ci0+aW50X2J1c3kgJiBpbnRfbWFzaykgfCAobW9kZWxfcHRyLT5jcl9mcHNjcl9idXN5ICYgY3JfbWFzaykpICE9IDApIHsKKwkgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9tb2RlbF0pCisJICAgIG1vZGVsX3RyYWNlX2J1c3lfcChtb2RlbF9wdHIsIGludF9tYXNrLCAwLCBjcl9tYXNrLCBQUENfTk9fU1BSKTsKKworCSAgbW9kZWxfcHRyLT5ucl9zdGFsbHNfZGF0YSsrOworCSAgbW9kZWxfbmV3X2N5Y2xlKG1vZGVsX3B0cik7CisJfQorCisJYnVzeV9wdHIgPSBtb2RlbF93YWl0X2Zvcl91bml0KGluZGV4LCBtb2RlbF9wdHIsICZtb2RlbF9wdHItPnRpbWluZ1tpbmRleF0pOworCW1vZGVsX3B0ci0+aW50X2J1c3kgfD0gaW50X21hc2s7CisJYnVzeV9wdHItPmludF9idXN5IHw9IGludF9tYXNrOworCWJ1c3lfcHRyLT5ucl93cml0ZWJhY2tzID0gMTsKKwlpZiAoV0lUSF9UUkFDRSAmJiBwcGNfdHJhY2VbdHJhY2VfbW9kZWxdKQorCSAgbW9kZWxfdHJhY2VfbWFrZV9idXN5KG1vZGVsX3B0ciwgaW50X21hc2ssIDAsIDApOworCisjIFNjaGVkdWxlIGEgTVRDUiBpbnN0cnVjdGlvbiB0aGF0IG1vdmVzIGFuIGludGVnZXIgcmVnaXN0ZXIgaW50byB0aGUgQ1IKK3ZvaWQ6Om1vZGVsLWZ1bmN0aW9uOjpwcGNfaW5zbl9tdGNyOml0YWJsZV9pbmRleCBpbmRleCwgbW9kZWxfZGF0YSAqbW9kZWxfcHRyLCB1bnNpZ25lZDMyIGludF9tYXNrLCB1bnNpZ25lZCBGWE0KKwlpbnQgZjsKKwlpbnQgbnJfY3JzID0gMDsKKwl1bnNpZ25lZDMyIGNyX21hc2sgPSAwOworCWNvbnN0IG1vZGVsX3RpbWUgKm5vcm1hbF90aW1lID0gJm1vZGVsX3B0ci0+dGltaW5nW2luZGV4XTsKKwlzdGF0aWMgY29uc3QgbW9kZWxfdGltZSBwcGM2MDRfMWJpdF90aW1lID0geyBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMCB9OworCW1vZGVsX2J1c3kgKmJ1c3lfcHRyOworCisJZm9yIChmID0gMDsgZiA8IDg7IGYrKykgeworCSAgaWYgKEZYTSAmICgweDgwID4+IGYpKSB7CisJICAgIGNyX21hc2sgfD0gKDEgPDwgZik7CisJICAgIG5yX2NycysrOworCSAgfQorCX0KKworCXdoaWxlICgoKG1vZGVsX3B0ci0+aW50X2J1c3kgJiBpbnRfbWFzaykgfCAobW9kZWxfcHRyLT5jcl9mcHNjcl9idXN5ICYgY3JfbWFzaykpICE9IDApIHsKKwkgIGlmIChXSVRIX1RSQUNFICYmIHBwY190cmFjZVt0cmFjZV9tb2RlbF0pCisJICAgIG1vZGVsX3RyYWNlX2J1c3lfcChtb2RlbF9wdHIsIGludF9tYXNrLCAwLCBjcl9tYXNrLCBQUENfTk9fU1BSKTsKKworCSAgbW9kZWxfcHRyLT5ucl9zdGFsbHNfZGF0YSsrOworCSAgbW9kZWxfbmV3X2N5Y2xlKG1vZGVsX3B0cik7CisJfQorCisJLyogSWYgb25seSBvbmUgQ1IgaXMgYmVpbmcgbW92ZWQsIHVzZSB0aGUgU0NJVSwgbm90IHRoZSBNQ0lVIG9uIHRoZSA2MDQgKi8KKwlpZiAoQ1VSUkVOVF9NT0RFTCA9PSBNT0RFTF9wcGM2MDQgJiYgbnJfY3JzID09IDEpIHsKKwkgIG5vcm1hbF90aW1lID0gJnBwYzYwNF8xYml0X3RpbWU7CisJfQorCisJYnVzeV9wdHIgPSBtb2RlbF93YWl0X2Zvcl91bml0KGluZGV4LCBtb2RlbF9wdHIsIG5vcm1hbF90aW1lKTsKKwlidXN5X3B0ci0+Y3JfZnBzY3JfYnVzeSB8PSBjcl9tYXNrOworCW1vZGVsX3B0ci0+Y3JfZnBzY3JfYnVzeSB8PSBjcl9tYXNrOworCW1vZGVsX3B0ci0+bnJfbXRjcmZfY3JzW25yX2Nyc10rKzsKKwlidXN5X3B0ci0+bnJfd3JpdGViYWNrcyA9IDE7CisJaWYgKFdJVEhfVFJBQ0UgJiYgcHBjX3RyYWNlW3RyYWNlX21vZGVsXSkKKwkgIG1vZGVsX3RyYWNlX21ha2VfYnVzeShtb2RlbF9wdHIsIDAsIDAsIGNyX21hc2spOworDAorbW9kZWxfZGF0YSAqOjptb2RlbC1mdW5jdGlvbjo6bW9kZWxfY3JlYXRlOmNwdSAqcHJvY2Vzc29yCisJbW9kZWxfZGF0YSAqbW9kZWxfcHRyID0gWkFMTE9DKG1vZGVsX2RhdGEpOworCW1vZGVsX3B0ci0+bmFtZSA9IG1vZGVsX25hbWVbQ1VSUkVOVF9NT0RFTF07CisJbW9kZWxfcHRyLT50aW1pbmcgPSBtb2RlbF90aW1lX21hcHBpbmdbQ1VSUkVOVF9NT0RFTF07CisJbW9kZWxfcHRyLT5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisJbW9kZWxfcHRyLT5ucl9jeWNsZXMgPSAxOworCW1vZGVsX3B0ci0+YnVzeV90YWlsID0gJm1vZGVsX3B0ci0+YnVzeV9oZWFkOworCXN3aXRjaCAoQ1VSUkVOVF9NT0RFTCkgeworCWNhc2UgTU9ERUxfcHBjNjAxOiAgbW9kZWxfcHRyLT5tYXhfbnJfd3JpdGViYWNrcyA9IDE7IGJyZWFrOwkvKiA/Pz8gKi8KKwljYXNlIE1PREVMX3BwYzYwMzogIG1vZGVsX3B0ci0+bWF4X25yX3dyaXRlYmFja3MgPSAyOyBicmVhazsKKwljYXNlIE1PREVMX3BwYzYwM2U6IG1vZGVsX3B0ci0+bWF4X25yX3dyaXRlYmFja3MgPSAyOyBicmVhazsKKwljYXNlIE1PREVMX3BwYzYwNDogIG1vZGVsX3B0ci0+bWF4X25yX3dyaXRlYmFja3MgPSAyOyBicmVhazsKKwlkZWZhdWx0OiBlcnJvciAoIlVua25vd24gbW9kZWwgJWRcbiIsIENVUlJFTlRfTU9ERUwpOworCX0KKwlyZXR1cm4gbW9kZWxfcHRyOworCit2b2lkOjptb2RlbC1mdW5jdGlvbjo6bW9kZWxfaW5pdDptb2RlbF9kYXRhICptb2RlbF9wdHIKKwordm9pZDo6bW9kZWwtZnVuY3Rpb246Om1vZGVsX2hhbHQ6bW9kZWxfZGF0YSAqbW9kZWxfcHRyCisJLyogTGV0IHBpcGVsaW5lIGRyYWluICovCisJd2hpbGUgKG1vZGVsX3B0ci0+YnVzeV9oZWFkLm5leHQpCisJICBtb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsKKwordW5zaWduZWRfd29yZDo6bW9kZWwtZnVuY3Rpb246Om1vZGVsX2dldF9udW1iZXJfb2Zfc3RhbGxzOm1vZGVsX2RhdGEgKm1vZGVsX3B0cgorCXJldHVybiAobW9kZWxfcHRyLT5ucl9zdGFsbHNfZGF0YQorCSAgICAgICAgKyBtb2RlbF9wdHItPm5yX3N0YWxsc191bml0CisJICAgICAgICArIG1vZGVsX3B0ci0+bnJfc3RhbGxzX3NlcmlhbGl6ZQorCSAgICAgICAgKyBtb2RlbF9wdHItPm5yX3N0YWxsc193cml0ZWJhY2spOworCit1bnNpZ25lZF93b3JkOjptb2RlbC1mdW5jdGlvbjo6bW9kZWxfZ2V0X251bWJlcl9vZl9jeWNsZXM6bW9kZWxfZGF0YSAqbW9kZWxfcHRyCisJcmV0dXJuIChtb2RlbF9wdHItPm5yX2N5Y2xlcyk7CisKK21vZGVsX3ByaW50ICo6Om1vZGVsLWZ1bmN0aW9uOjptb2RlbF9tb25faW5mbzptb2RlbF9kYXRhICptb2RlbF9wdHIKKwltb2RlbF9wcmludCAqaGVhZDsKKwltb2RlbF9wcmludCAqdGFpbDsKKwlwcGNfZnVuY3Rpb25fdW5pdCBpOworCWNvdW50X3R5cGUgbnJfaW5zbnM7CisJaW50IGo7CisKKwloZWFkID0gdGFpbCA9IFpBTExPQyhtb2RlbF9wcmludCk7CisJdGFpbC0+Y291bnQgPSBtb2RlbF9wdHItPm5yX2N5Y2xlczsKKwl0YWlsLT5uYW1lID0gImN5Y2xlIjsKKwl0YWlsLT5zdWZmaXhfcGx1cmFsID0gInMiOworCXRhaWwtPnN1ZmZpeF9zaW5ndWxhciA9ICIiOworCisJaWYgKG1vZGVsX3B0ci0+bnJfc3RhbGxzX2RhdGEpIHsKKwkgIHRhaWwtPm5leHQgPSBaQUxMT0MobW9kZWxfcHJpbnQpOworCSAgdGFpbCA9IHRhaWwtPm5leHQ7CisJICB0YWlsLT5jb3VudCA9IG1vZGVsX3B0ci0+bnJfc3RhbGxzX2RhdGE7CisJICB0YWlsLT5uYW1lID0gInN0YWxsIjsKKwkgIHRhaWwtPnN1ZmZpeF9wbHVyYWwgPSAicyB3YWl0aW5nIGZvciBkYXRhIjsKKwkgIHRhaWwtPnN1ZmZpeF9zaW5ndWxhciA9ICIgd2FpdGluZyBmb3IgZGF0YSI7CisJfQorCisJaWYgKG1vZGVsX3B0ci0+bnJfc3RhbGxzX3VuaXQpIHsKKwkgIHRhaWwtPm5leHQgPSBaQUxMT0MobW9kZWxfcHJpbnQpOworCSAgdGFpbCA9IHRhaWwtPm5leHQ7CisJICB0YWlsLT5jb3VudCA9IG1vZGVsX3B0ci0+bnJfc3RhbGxzX3VuaXQ7CisJICB0YWlsLT5uYW1lID0gInN0YWxsIjsKKwkgIHRhaWwtPnN1ZmZpeF9wbHVyYWwgPSAicyB3YWl0aW5nIGZvciBhIGZ1bmN0aW9uIHVuaXQiOworCSAgdGFpbC0+c3VmZml4X3Npbmd1bGFyID0gIiB3YWl0aW5nIGZvciBhIGZ1bmN0aW9uIHVuaXQiOworCX0KKworCWlmIChtb2RlbF9wdHItPm5yX3N0YWxsc19zZXJpYWxpemUpIHsKKwkgIHRhaWwtPm5leHQgPSBaQUxMT0MobW9kZWxfcHJpbnQpOworCSAgdGFpbCA9IHRhaWwtPm5leHQ7CisJICB0YWlsLT5jb3VudCA9IG1vZGVsX3B0ci0+bnJfc3RhbGxzX3NlcmlhbGl6ZTsKKwkgIHRhaWwtPm5hbWUgPSAic3RhbGwiOworCSAgdGFpbC0+c3VmZml4X3BsdXJhbCA9ICJzIHdhaXRpbmcgZm9yIHNlcmlhbGl6YXRpb24iOworCSAgdGFpbC0+c3VmZml4X3Npbmd1bGFyID0gIiB3YWl0aW5nIGZvciBzZXJpYWxpemF0aW9uIjsKKwl9CisKKwlpZiAobW9kZWxfcHRyLT5ucl9zdGFsbHNfd3JpdGViYWNrKSB7CisJICB0YWlsLT5uZXh0ID0gWkFMTE9DKG1vZGVsX3ByaW50KTsKKwkgIHRhaWwgPSB0YWlsLT5uZXh0OworCSAgdGFpbC0+Y291bnQgPSBtb2RlbF9wdHItPm5yX3N0YWxsc193cml0ZWJhY2s7CisJICB0YWlsLT5uYW1lID0gIiI7CisJICB0YWlsLT5zdWZmaXhfcGx1cmFsID0gInRpbWVzIGEgd3JpdGUtYmFjayBzbG90IHdhcyB1bmF2YWlsYWJsZSI7CisJICB0YWlsLT5zdWZmaXhfc2luZ3VsYXIgPSAidGltZSBhIHdyaXRlYmFjayB3YXMgdW5hdmFpbGFibGUiOworCX0KKworCWlmIChtb2RlbF9wdHItPm5yX2JyYW5jaGVzKSB7CisJICB0YWlsLT5uZXh0ID0gWkFMTE9DKG1vZGVsX3ByaW50KTsKKwkgIHRhaWwgPSB0YWlsLT5uZXh0OworCSAgdGFpbC0+Y291bnQgPSBtb2RlbF9wdHItPm5yX2JyYW5jaGVzOworCSAgdGFpbC0+bmFtZSA9ICJicmFuY2giOworCSAgdGFpbC0+c3VmZml4X3BsdXJhbCA9ICJlcyI7CisJICB0YWlsLT5zdWZmaXhfc2luZ3VsYXIgPSAiIjsKKwl9CisKKwlpZiAobW9kZWxfcHRyLT5ucl9icmFuY2hlc19mYWxsdGhyb3VnaCkgeworCSAgdGFpbC0+bmV4dCA9IFpBTExPQyhtb2RlbF9wcmludCk7CisJICB0YWlsID0gdGFpbC0+bmV4dDsKKwkgIHRhaWwtPmNvdW50ID0gbW9kZWxfcHRyLT5ucl9icmFuY2hlc19mYWxsdGhyb3VnaDsKKwkgIHRhaWwtPm5hbWUgPSAiY29uZGl0aW9uYWwgYnJhbmNoIjsKKwkgIHRhaWwtPnN1ZmZpeF9wbHVyYWwgPSAiZXMgZmVsbCB0aHJvdWdoIjsKKwkgIHRhaWwtPnN1ZmZpeF9zaW5ndWxhciA9ICIgZmVsbCB0aHJvdWdoIjsKKwl9CisKKwlpZiAobW9kZWxfcHRyLT5ucl9icmFuY2hfcHJlZGljdF90cnVlcykgeworCSAgdGFpbC0+bmV4dCA9IFpBTExPQyhtb2RlbF9wcmludCk7CisJICB0YWlsID0gdGFpbC0+bmV4dDsKKwkgIHRhaWwtPmNvdW50ID0gbW9kZWxfcHRyLT5ucl9icmFuY2hfcHJlZGljdF90cnVlczsKKwkgIHRhaWwtPm5hbWUgPSAic3VjY2Vzc2Z1bCBicmFuY2ggcHJlZGljdGlvbiI7CisJICB0YWlsLT5zdWZmaXhfcGx1cmFsID0gInMiOworCSAgdGFpbC0+c3VmZml4X3Npbmd1bGFyID0gIiI7CisJfQorCisJaWYgKG1vZGVsX3B0ci0+bnJfYnJhbmNoX3ByZWRpY3RfZmFsc2VzKSB7CisJICB0YWlsLT5uZXh0ID0gWkFMTE9DKG1vZGVsX3ByaW50KTsKKwkgIHRhaWwgPSB0YWlsLT5uZXh0OworCSAgdGFpbC0+Y291bnQgPSBtb2RlbF9wdHItPm5yX2JyYW5jaF9wcmVkaWN0X2ZhbHNlczsKKwkgIHRhaWwtPm5hbWUgPSAidW5zdWNjZXNzZnVsIGJyYW5jaCBwcmVkaWN0aW9uIjsKKwkgIHRhaWwtPnN1ZmZpeF9wbHVyYWwgPSAicyI7CisJICB0YWlsLT5zdWZmaXhfc2luZ3VsYXIgPSAiIjsKKwl9CisKKwlmb3IgKGogPSAwOyBqIDwgKHNpemVvZihwcGNfYnJhbmNoX2NvbmRpdGlvbmFsX25hbWUpIC8gc2l6ZW9mKHBwY19icmFuY2hfY29uZGl0aW9uYWxfbmFtZVswXSkpIDsgaisrKSB7CisJICBpZiAobW9kZWxfcHRyLT5ucl9icmFuY2hfY29uZGl0aW9uYWxbal0pIHsKKwkgICAgdGFpbC0+bmV4dCA9IFpBTExPQyhtb2RlbF9wcmludCk7CisJICAgIHRhaWwgPSB0YWlsLT5uZXh0OworCSAgICB0YWlsLT5jb3VudCA9IG1vZGVsX3B0ci0+bnJfYnJhbmNoX2NvbmRpdGlvbmFsW2pdOworCSAgICB0YWlsLT5uYW1lID0gcHBjX2JyYW5jaF9jb25kaXRpb25hbF9uYW1lW2pdOworCSAgICB0YWlsLT5zdWZmaXhfcGx1cmFsID0gIiBjb25kaXRpb25hbCBicmFuY2hlcyI7CisJICAgIHRhaWwtPnN1ZmZpeF9zaW5ndWxhciA9ICIgY29uZGl0aW9uYWwgYnJhbmNoIjsKKwkgIH0KKwl9CisKKwlmb3IgKGogPSAwOyBqIDwgOTsgaisrKSB7CisJICBpZiAobW9kZWxfcHRyLT5ucl9tdGNyZl9jcnNbal0pIHsKKwkgICAgdGFpbC0+bmV4dCA9IFpBTExPQyhtb2RlbF9wcmludCk7CisJICAgIHRhaWwgPSB0YWlsLT5uZXh0OworCSAgICB0YWlsLT5jb3VudCA9IG1vZGVsX3B0ci0+bnJfbXRjcmZfY3JzW2pdOworCSAgICB0YWlsLT5uYW1lID0gcHBjX25yX210Y3JmX2Nyc1tqXTsKKwkgICAgdGFpbC0+c3VmZml4X3BsdXJhbCA9ICIgaW5zdHJ1Y3Rpb25zIjsKKwkgICAgdGFpbC0+c3VmZml4X3Npbmd1bGFyID0gIiBpbnN0cnVjdGlvbiI7CisJICB9CisJfQorCisJbnJfaW5zbnMgPSAwOworCWZvciAoaSA9IFBQQ19VTklUX0JBRDsgaSA8IG5yX3BwY19mdW5jdGlvbl91bml0czsgaSsrKSB7CisJICBpZiAobW9kZWxfcHRyLT5ucl91bml0c1tpXSkgeworCSAgICBucl9pbnNucyArPSBtb2RlbF9wdHItPm5yX3VuaXRzW2ldOworCSAgICB0YWlsLT5uZXh0ID0gWkFMTE9DKG1vZGVsX3ByaW50KTsKKwkgICAgdGFpbCA9IHRhaWwtPm5leHQ7CisJICAgIHRhaWwtPmNvdW50ID0gbW9kZWxfcHRyLT5ucl91bml0c1tpXTsKKwkgICAgdGFpbC0+bmFtZSA9IHBwY19mdW5jdGlvbl91bml0X25hbWVbaV07CisJICAgIHRhaWwtPnN1ZmZpeF9wbHVyYWwgPSAicyI7CisJICAgIHRhaWwtPnN1ZmZpeF9zaW5ndWxhciA9ICIiOworCSAgfQorCX0KKworCXRhaWwtPm5leHQgPSBaQUxMT0MobW9kZWxfcHJpbnQpOworCXRhaWwgPSB0YWlsLT5uZXh0OworCXRhaWwtPmNvdW50ID0gbnJfaW5zbnM7CisJdGFpbC0+bmFtZSA9ICJpbnN0cnVjdGlvbiI7CisJdGFpbC0+c3VmZml4X3BsdXJhbCA9ICJzIHRoYXQgd2VyZSBhY2NvdW50ZWQgZm9yIGluIHRpbWluZyBpbmZvIjsKKwl0YWlsLT5zdWZmaXhfc2luZ3VsYXIgPSAiIHRoYXQgd2FzIGFjY291bnRlZCBmb3IgaW4gdGltaW5nIGluZm8iOworCisJdGFpbC0+bmV4dCA9IChtb2RlbF9wcmludCAqKTA7CisJcmV0dXJuIGhlYWQ7CisKK3ZvaWQ6Om1vZGVsLWZ1bmN0aW9uOjptb2RlbF9tb25faW5mb19mcmVlOm1vZGVsX2RhdGEgKm1vZGVsX3B0ciwgbW9kZWxfcHJpbnQgKnB0cgorCXdoaWxlIChwdHIpIHsKKwkgIG1vZGVsX3ByaW50ICpuZXh0ID0gcHRyLT5uZXh0OworCSAgZnJlZSgodm9pZCAqKXB0cik7CisJICBwdHIgPSBuZXh0OworCX0KKwordm9pZDo6bW9kZWwtZnVuY3Rpb246Om1vZGVsX2JyYW5jaGVzOm1vZGVsX2RhdGEgKm1vZGVsX3B0ciwgaW50IGZhaWxlZCwgaW50IGNvbmRpdGlvbmFsCisJbW9kZWxfcHRyLT5ucl91bml0c1tQUENfVU5JVF9CUFVdKys7CisJaWYgKGZhaWxlZCkKKwkgIG1vZGVsX3B0ci0+bnJfYnJhbmNoZXNfZmFsbHRocm91Z2grKzsKKwllbHNlCisJICBtb2RlbF9wdHItPm5yX2JyYW5jaGVzKys7CisJaWYgKGNvbmRpdGlvbmFsID49IDApCisJICBtb2RlbF9wdHItPm5yX2JyYW5jaF9jb25kaXRpb25hbFtjb25kaXRpb25hbF0rKzsKKwltb2RlbF9uZXdfY3ljbGUobW9kZWxfcHRyKTsJLyogQSBicmFuY2ggYWx3YXlzIGVuZHMgdGhlIGN1cnJlbnQgY3ljbGUgKi8KKwordm9pZDo6bW9kZWwtZnVuY3Rpb246Om1vZGVsX2JyYW5jaF9wcmVkaWN0Om1vZGVsX2RhdGEgKm1vZGVsX3B0ciwgaW50IHN1Y2Nlc3MKKwlpZiAoc3VjY2VzcykKKwkgIG1vZGVsX3B0ci0+bnJfYnJhbmNoX3ByZWRpY3RfdHJ1ZXMrKzsKKwllbHNlCisJICBtb2RlbF9wdHItPm5yX2JyYW5jaF9wcmVkaWN0X2ZhbHNlcysrOworCisMCisjIFRoZSBmb2xsb3dpbmcgKGlsbGVnYWwpIGluc3RydWN0aW9uIGlzIGBrbm93bicgYnkgZ2VuIGFuZCBpcworIyBjYWxsZWQgd2hlbiBldmVyIGFuIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gaXMgZW5jb3VudGVyZWQKKzo6aW50ZXJuYWw6OmlsbGVnYWwKKwlwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICBpbGxlZ2FsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKKworCisjIFRoZSBmb2xsb3dpbmcgKGZsb2F0aW5nIHBvaW50IHVuYXZhaWxhYmxlKSBpbnN0cnVjdGlvbiBpcyBga25vd24nIGJ5IGdlbgorIyBhbmQgaXMgY2FsbGVkIHdoZW4gZXZlciBhbiBhIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uIGlzIHRvIGJlCisjIGV4ZWN1dGVkIGJ1dCBmbG9hdGluZyBwb2ludCBpcyBtYWtlIHVuYXZhaWxhYmxlIGJ5IHRoZSBNU1IKKzo6aW50ZXJuYWw6OmZsb2F0aW5nX3BvaW50X3VuYXZhaWxhYmxlCisJZmxvYXRpbmdfcG9pbnRfdW5hdmFpbGFibGVfaW50ZXJydXB0KHByb2Nlc3NvciwgY2lhKTsKKworCisjCisjIEZsb2F0aW5nIHBvaW50IHN1cHBvcnQgZnVuY3Rpb25zCisjCisKKyMgQ29udmVydCAzMmJpdCBzaW5nbGUgdG8gNjRiaXQgZG91YmxlCit1bnNpZ25lZDY0OjpmdW5jdGlvbjo6RE9VQkxFOnVuc2lnbmVkMzIgV09SRAorCXVuc2lnbmVkNjQgRlJUOworCWlmIChFWFRSQUNURUQzMihXT1JELCAxLCA4KSA+IDAKKwkgICAgJiYgRVhUUkFDVEVEMzIoV09SRCwgMSwgOCkgPCAyNTUpIHsKKwkgIC8qIG5vcm1hbGl6ZWQgb3BlcmFuZCAqLworCSAgaW50IG5vdF93b3JkXzFfMSA9ICFFWFRSQUNURUQzMihXT1JELCAxLCAxKTsgLyoyLjYuMyBidWcqLworCSAgRlJUID0gKElOU0VSVEVENjQoRVhUUkFDVEVEMzIoV09SRCwgMCwgMSksIDAsIDEpCisJICAgICAgICAgfCBJTlNFUlRFRDY0KG5vdF93b3JkXzFfMSwgMiwgMikKKwkgICAgICAgICB8IElOU0VSVEVENjQobm90X3dvcmRfMV8xLCAzLCAzKQorCSAgICAgICAgIHwgSU5TRVJURUQ2NChub3Rfd29yZF8xXzEsIDQsIDQpCisJICAgICAgICAgfCBJTlNFUlRFRDY0KEVYVFJBQ1RFRDMyKFdPUkQsIDIsIDMxKSwgNSwgKDYzIC0gMjkpKSk7CisJfQorCWVsc2UgaWYgKEVYVFJBQ1RFRDMyKFdPUkQsIDEsIDgpID09IDAKKwkgICAgICAgICAmJiBFWFRSQUNURUQzMihXT1JELCA5LCAzMSkgIT0gMCkgeworCSAgLyogZGVub3JtYWxpemVkIG9wZXJhbmQgKi8KKwkgIGludCBzaWduID0gRVhUUkFDVEVEMzIoV09SRCwgMCwgMCk7CisJICBpbnQgZXhwID0gLTEyNjsKKwkgIHVuc2lnbmVkNjQgZnJhYyA9IElOU0VSVEVENjQoRVhUUkFDVEVEMzIoV09SRCwgOSwgMzEpLCAxLCAoNTIgLSAyOSkpOworCSAgLyogbm9ybWFsaXplIHRoZSBvcGVyYW5kICovCisJICB3aGlsZSAoTUFTS0VENjQoZnJhYywgMCwgMCkgPT0gMCkgeworCSAgICBmcmFjIDw8PSAxOworCSAgICBleHAgLT0gMTsKKwkgIH0KKwkgIEZSVCA9IChJTlNFUlRFRDY0KHNpZ24sIDAsIDApCisJICAgICAgICAgfCBJTlNFUlRFRDY0KGV4cCArIDEwMjMsIDEsIDExKQorCSAgICAgICAgIHwgSU5TRVJURUQ2NChFWFRSQUNURUQ2NChmcmFjLCAxLCA1MiksIDEyLCA2MykpOworCX0KKwllbHNlIGlmIChFWFRSQUNURUQzMihXT1JELCAxLCA4KSA9PSAyNTUKKwkJIHx8IEVYVFJBQ1RFRDMyKFdPUkQsIDEsIDMxKSA9PSAwKSB7CisJICBGUlQgPSAoSU5TRVJURUQ2NChFWFRSQUNURUQzMihXT1JELCAwLCAxKSwgMCwgMSkKKwkgICAgICAgICB8IElOU0VSVEVENjQoRVhUUkFDVEVEMzIoV09SRCwgMSwgMSksIDIsIDIpCisJICAgICAgICAgfCBJTlNFUlRFRDY0KEVYVFJBQ1RFRDMyKFdPUkQsIDEsIDEpLCAzLCAzKQorCSAgICAgICAgIHwgSU5TRVJURUQ2NChFWFRSQUNURUQzMihXT1JELCAxLCAxKSwgNCwgNCkKKwkgICAgICAgICB8IElOU0VSVEVENjQoRVhUUkFDVEVEMzIoV09SRCwgMiwgMzEpLCA1LCAoNjMgLSAyOSkpKTsKKwl9CisJZWxzZSB7CisJICBlcnJvcigiRE9VQkxFIC0gdW5rbm93biBjYXNlXG4iKTsKKwkgIEZSVCA9IDA7CisJfQorCXJldHVybiBGUlQ7CisKKyMgQ29udmVydCA2NGJpdCBzaW5nbGUgdG8gMzJiaXQgZG91YmxlCit1bnNpZ25lZDMyOjpmdW5jdGlvbjo6U0lOR0xFOnVuc2lnbmVkNjQgRlJTCisJdW5zaWduZWQzMiBXT1JEOworCWlmIChFWFRSQUNURUQ2NChGUlMsIDEsIDExKSA+IDg5NgorCSAgICB8fCBFWFRSQUNURUQ2NChGUlMsIDEsIDYzKSA9PSAwKSB7CisJICAvKiBubyBkZW5vcm1hbGl6YXRpb24gcmVxdWlyZWQgKGluY2x1ZGVzIFplcm8vSW5maW5pdHkvTmFOKSAqLworCSAgV09SRCA9IChJTlNFUlRFRDMyKEVYVFJBQ1RFRDY0KEZSUywgMCwgMSksIDAsIDEpCisJICAgICAgICAgIHwgSU5TRVJURUQzMihFWFRSQUNURUQ2NChGUlMsIDUsIDM0KSwgMiwgMzEpKTsKKwl9CisJZWxzZSBpZiAoODc0IDw9IEVYVFJBQ1RFRDY0KEZSUywgMSwgMTEpCisJICAgICAgICAgJiYgRVhUUkFDVEVENjQoRlJTLCAxLCAxMSkgPD0gODk2KSB7CisJICAvKiBkZW5vcm1hbGl6YXRpb24gcmVxdWlyZWQgKi8KKwkgIGludCBzaWduID0gRVhUUkFDVEVENjQoRlJTLCAwLCAwKTsKKwkgIGludCBleHAgPSBFWFRSQUNURUQ2NChGUlMsIDEsIDExKSAtIDEwMjM7CisJICB1bnNpZ25lZDY0IGZyYWMgPSAoQklUNjQoMCkKKwkgICAgICAgICAgICAgICAgICAgICB8IElOU0VSVEVENjQoRVhUUkFDVEVENjQoRlJTLCAxMiwgNjMpLCAxLCA1MikpOworCSAgLyogZGVub3JtYWxpemUgdGhlIG9wZXJhbmQgKi8KKwkgIHdoaWxlIChleHAgPCAtMTI2KSB7CisJICAgIGZyYWMgPSBJTlNFUlRFRDY0KEVYVFJBQ1RFRDY0KGZyYWMsIDAsIDYyKSwgMSwgNjMpOworCSAgICBleHAgKz0gMTsKKwkgIH0KKwkgIFdPUkQgPSAoSU5TRVJURUQzMihzaWduLCAwLCAwKQorCSAgICAgICAgICB8IElOU0VSVEVEMzIoMHgwMCwgMSwgOCkKKwkgICAgICAgICAgfCBJTlNFUlRFRDMyKEVYVFJBQ1RFRDY0KGZyYWMsIDEsIDIzKSwgOSwgMzEpKTsKKwl9CisJZWxzZSB7CisJICBXT1JEID0gMHgwOyAvKiA/Pz8gKi8KKwl9CSAgCisJcmV0dXJuIFdPUkQ7CisKKworIyByb3VuZCA2NGJpdCBkb3VibGUgdG8gNjRiaXQgYnV0IHNpbmdsZQordm9pZDo6ZnVuY3Rpb246OlJvdW5kX1NpbmdsZTpjcHUgKnByb2Nlc3NvciwgaW50IHNpZ24sIGludCAqZXhwLCB1bnNpZ25lZDY0ICpmcmFjX2dyeAorCS8qIGNvbXBhcmlzb25zIGlnbm9yZSB1IGJpdHMgKi8KKwl1bnNpZ25lZDY0IG91dDsKKwlpbnQgaW5jID0gMDsKKwlpbnQgbHNiID0gRVhUUkFDVEVENjQoKmZyYWNfZ3J4LCAyMywgMjMpOworCWludCBnYml0ID0gRVhUUkFDVEVENjQoKmZyYWNfZ3J4LCAyNCwgMjQpOworCWludCByYml0ID0gRVhUUkFDVEVENjQoKmZyYWNfZ3J4LCAyNSwgMjUpOworCWludCB4Yml0ID0gRVhUUkFDVEVENjQoKmZyYWNfZ3J4LCAyNiwgNTUpICE9IDA7CisJaWYgKChGUFNDUiAmIGZwc2NyX3JuKSA9PSBmcHNjcl9ybl9yb3VuZF90b19uZWFyZXN0KSB7CisJICBpZiAobHNiID09IDEgJiYgZ2JpdCA9PSAxKSBpbmMgPSAxOworCSAgaWYgKGxzYiA9PSAwICYmIGdiaXQgPT0gMSAmJiByYml0ID09IDEpIGluYyA9IDE7CisJICBpZiAobHNiID09IDAgJiYgZ2JpdCA9PSAxICYmIHhiaXQgPT0gMSkgaW5jID0gMTsKKwl9CisJaWYgKChGUFNDUiAmIGZwc2NyX3JuKSA9PSBmcHNjcl9ybl9yb3VuZF90b3dhcmRzX3Bvc19pbmZpbml0eSkgeworCSAgaWYgKHNpZ24gPT0gMCAmJiBnYml0ID09IDEpIGluYyA9IDE7CisJICBpZiAoc2lnbiA9PSAwICYmIHJiaXQgPT0gMSkgaW5jID0gMTsKKwkgIGlmIChzaWduID09IDAgJiYgeGJpdCA9PSAxKSBpbmMgPSAxOworCX0KKwlpZiAoKEZQU0NSICYgZnBzY3Jfcm4pID09IGZwc2NyX3JuX3JvdW5kX3Rvd2FyZHNfbmVnX2luZmluaXR5KSB7CisJICBpZiAoc2lnbiA9PSAxICYmIGdiaXQgPT0gMSkgaW5jID0gMTsKKwkgIGlmIChzaWduID09IDEgJiYgcmJpdCA9PSAxKSBpbmMgPSAxOworCSAgaWYgKHNpZ24gPT0gMSAmJiB4Yml0ID09IDEpIGluYyA9IDE7CisJfQorCS8qIHdvcmsgb3V0IGFkZGl0aW9uIGluIGxvdyAyNSBiaXRzIG9mIG91dCAqLworCW91dCA9IEVYVFJBQ1RFRDY0KCpmcmFjX2dyeCwgMCwgMjMpICsgaW5jOworCSpmcmFjX2dyeCA9IElOU0VSVEVENjQob3V0LCAwLCAyMyk7CisJaWYgKG91dCAmIEJJVDY0KDY0IC0gMjMgLSAxIC0gMSkpIHsKKwkgICpmcmFjX2dyeCA9IChCSVQ2NCgwKSB8CisJICAgICAgICAgICAgICAgSU5TRVJURUQ2NChFWFRSQUNURUQ2NCgqZnJhY19ncngsIDAsIDIyKSwgMSwgMjMpKTsKKwkgICpleHAgPSAqZXhwICsgMTsKKwl9CisJLyogZnJhY19ncnhbMjQ6NTJdID0gMCBhbHJlYWR5ICovCisJRlBTQ1JfU0VUX0ZSKGluYyk7CisJRlBTQ1JfU0VUX0ZJKGdiaXQgfHwgcmJpdCB8fCB4Yml0KTsKKworCisjCit2b2lkOjpmdW5jdGlvbjo6Um91bmRfSW50ZWdlcjpjcHUgKnByb2Nlc3NvciwgaW50IHNpZ24sIHVuc2lnbmVkNjQgKmZyYWMsIGludCAqZnJhYzY0LCBpbnQgZ2JpdCwgaW50IHJiaXQsIGludCB4Yml0LCBmcHNjcmVnIHJvdW5kX21vZGUKKwlpbnQgaW5jID0gMDsKKwlpZiAocm91bmRfbW9kZSA9PSBmcHNjcl9ybl9yb3VuZF90b19uZWFyZXN0KSB7CisJICBpZiAoKmZyYWM2NCA9PSAxICYmIGdiaXQgPT0gMSkgaW5jID0gMTsKKwkgIGlmICgqZnJhYzY0ID09IDAgJiYgZ2JpdCA9PSAxICYmIHJiaXQgPT0gMSkgaW5jID0gMTsKKwkgIGlmICgqZnJhYzY0ID09IDAgJiYgZ2JpdCA9PSAxICYmIHhiaXQgPT0gMSkgaW5jID0gMTsKKwl9CisJaWYgKHJvdW5kX21vZGUgPT0gZnBzY3Jfcm5fcm91bmRfdG93YXJkc19wb3NfaW5maW5pdHkpIHsKKwkgIGlmIChzaWduID09IDAgJiYgZ2JpdCA9PSAxKSBpbmMgPSAxOworCSAgaWYgKHNpZ24gPT0gMCAmJiByYml0ID09IDEpIGluYyA9IDE7CisJICBpZiAoc2lnbiA9PSAwICYmIHhiaXQgPT0gMSkgaW5jID0gMTsKKwl9CisJaWYgKHJvdW5kX21vZGUgPT0gZnBzY3Jfcm5fcm91bmRfdG93YXJkc19uZWdfaW5maW5pdHkpIHsKKwkgIGlmIChzaWduID09IDEgJiYgZ2JpdCA9PSAxKSBpbmMgPSAxOworCSAgaWYgKHNpZ24gPT0gMSAmJiByYml0ID09IDEpIGluYyA9IDE7CisJICBpZiAoc2lnbiA9PSAxICYmIHhiaXQgPT0gMSkgaW5jID0gMTsKKwl9CisJLyogZnJhY1swOjY0XSA9IGZyYWNbMDo2NH0gKyBpbmMgKi8KKwkqZnJhYyArPSAoKmZyYWM2NCAmJiBpbmMgPyAxIDogMCk7CisJKmZyYWM2NCA9ICgqZnJhYzY0ICsgaW5jKSAmIDB4MTsKKwlGUFNDUl9TRVRfRlIoaW5jKTsKKwlGUFNDUl9TRVRfRkkoZ2JpdCB8IHJiaXQgfCB4Yml0KTsKKworCit2b2lkOjpmdW5jdGlvbjo6Um91bmRfRmxvYXQ6Y3B1ICpwcm9jZXNzb3IsIGludCBzaWduLCBpbnQgKmV4cCwgdW5zaWduZWQ2NCAqZnJhYywgZnBzY3JlZyByb3VuZF9tb2RlCisJaW50IGNhcnJ5X291dDsKKwlpbnQgaW5jID0gMDsKKwlpbnQgbHNiID0gRVhUUkFDVEVENjQoKmZyYWMsIDUyLCA1Mik7CisJaW50IGdiaXQgPSBFWFRSQUNURUQ2NCgqZnJhYywgNTMsIDUzKTsKKwlpbnQgcmJpdCA9IEVYVFJBQ1RFRDY0KCpmcmFjLCA1NCwgNTQpOworCWludCB4Yml0ID0gRVhUUkFDVEVENjQoKmZyYWMsIDU1LCA1NSk7CisJaWYgKHJvdW5kX21vZGUgPT0gZnBzY3Jfcm5fcm91bmRfdG9fbmVhcmVzdCkgeworCSAgaWYgKGxzYiA9PSAxICYmIGdiaXQgPT0gMSkgaW5jID0gMTsKKwkgIGlmIChsc2IgPT0gMCAmJiBnYml0ID09IDEgJiYgcmJpdCA9PSAxKSBpbmMgPSAxOworCSAgaWYgKGxzYiA9PSAwICYmIGdiaXQgPT0gMSAmJiB4Yml0ID09IDEpIGluYyA9IDE7CisJfQorCWlmIChyb3VuZF9tb2RlID09IGZwc2NyX3JuX3JvdW5kX3Rvd2FyZHNfcG9zX2luZmluaXR5KSB7CisJICBpZiAoc2lnbiA9PSAwICYmIGdiaXQgPT0gMSkgaW5jID0gMTsKKwkgIGlmIChzaWduID09IDAgJiYgcmJpdCA9PSAxKSBpbmMgPSAxOworCSAgaWYgKHNpZ24gPT0gMCAmJiB4Yml0ID09IDEpIGluYyA9IDE7CisJfQorCWlmIChyb3VuZF9tb2RlID09IGZwc2NyX3JuX3JvdW5kX3Rvd2FyZHNfbmVnX2luZmluaXR5KSB7CisJICBpZiAoc2lnbiA9PSAxICYmIGdiaXQgPT0gMSkgaW5jID0gMTsKKwkgIGlmIChzaWduID09IDEgJiYgcmJpdCA9PSAxKSBpbmMgPSAxOworCSAgaWYgKHNpZ24gPT0gMSAmJiB4Yml0ID09IDEpIGluYyA9IDE7CisJfQorCS8qIGZyYWMvL2NhcnJ5X291dCA9IGZyYWMgKyBpbmMgKi8KKwkqZnJhYyA9ICgqZnJhYyA+PiAxKSArIChJTlNFUlRFRDY0KGluYywgNTIsIDUyKSA+PiAxKTsKKwljYXJyeV9vdXQgPSBFWFRSQUNURUQ2NCgqZnJhYywgMCwgMCk7CisJKmZyYWMgPDw9IDE7CisJaWYgKGNhcnJ5X291dCA9PSAxKSAqZXhwID0gKmV4cCArIDE7CisJRlBTQ1JfU0VUX0ZSKGluYyk7CisJRlBTQ1JfU0VUX0ZJKGdiaXQgfCByYml0IHwgeGJpdCk7CisJRlBTQ1JfU0VUX1hYKEZQU0NSICYgZnBzY3JfZmkpOworCisKKyMgY29udmVyc2lvbiBvZiBGUCB0byBpbnRlZ2VyCit2b2lkOjpmdW5jdGlvbjo6Y29udmVydF90b19pbnRlZ2VyOmNwdSAqcHJvY2Vzc29yLCB1bnNpZ25lZF93b3JkIGNpYSwgdW5zaWduZWQ2NCAqZnJ0LCB1bnNpZ25lZDY0IGZyYiwgZnBzY3JlZyByb3VuZF9tb2RlLCBpbnQgdGd0X3ByZWNpc2lvbgorCWludCBpOworCWludCBleHAgPSAwOworCXVuc2lnbmVkNjQgZnJhYyA9IDA7CisJaW50IGZyYWM2NCA9IDA7CisJaW50IGdiaXQgPSAwOworCWludCByYml0ID0gMDsKKwlpbnQgeGJpdCA9IDA7CisJaW50IHNpZ24gPSBFWFRSQUNURUQ2NChmcmIsIDAsIDApOworCS8qKiovCisJICBpZiAoRVhUUkFDVEVENjQoZnJiLCAxLCAxMSkgPT0gMjA0NyAmJiBFWFRSQUNURUQ2NChmcmIsIDEyLCA2MykgPT0gMCkKKwkgICAgR09UTyhJbmZpbml0eV9PcGVyYW5kKTsKKwkgIGlmIChFWFRSQUNURUQ2NChmcmIsIDEsIDExKSA9PSAyMDQ3ICYmIEVYVFJBQ1RFRDY0KGZyYiwgMTIsIDEyKSA9PSAwKQorCSAgICBHT1RPKFNOYU5fT3BlcmFuZCk7CisJICBpZiAoRVhUUkFDVEVENjQoZnJiLCAxLCAxMSkgPT0gMjA0NyAmJiBFWFRSQUNURUQ2NChmcmIsIDEyLCAxMikgPT0gMSkKKwkgICAgR09UTyhRTmFOX09wZXJhbmQpOworCSAgaWYgKEVYVFJBQ1RFRDY0KGZyYiwgMSwgMTEpID4gMTA4NikgR09UTyhMYXJnZV9PcGVyYW5kKTsKKwkgIGlmIChFWFRSQUNURUQ2NChmcmIsIDEsIDExKSA+IDApIGV4cCA9IEVYVFJBQ1RFRDY0KGZyYiwgMSwgMTEpIC0gMTAyMzsKKwkgIGlmIChFWFRSQUNURUQ2NChmcmIsIDEsIDExKSA9PSAwKSBleHAgPSAtMTAyMjsKKwkgIGlmIChFWFRSQUNURUQ2NChmcmIsIDEsIDExKSA+IDApIHsgLyogbm9ybWFsICovCisJICAgIGZyYWMgPSBCSVQ2NCgxKSB8IElOU0VSVEVENjQoRVhUUkFDVEVENjQoZnJiLCAxMiwgNjMpLCAyLCA1Myk7CisJICAgIGZyYWM2NCA9IDA7CisJICB9CisJICBpZiAoRVhUUkFDVEVENjQoZnJiLCAxLCAxMSkgPT0gMCkgeyAvKiBkZW5vcm0gKi8KKwkgICAgZnJhYyA9IElOU0VSVEVENjQoRVhUUkFDVEVENjQoZnJiLCAxMiwgNjMpLCAyLCA1Myk7CisJICAgIGZyYWM2NCA9IDA7CisJICB9CisJICBnYml0ID0gMCwgcmJpdCA9IDAsIHhiaXQgPSAwOworCSAgZm9yIChpID0gMTsgaSA8PSA2MyAtIGV4cDsgaSsrKSB7CisJICAgIHhiaXQgPSByYml0IHwgeGJpdDsKKwkgICAgcmJpdCA9IGdiaXQ7CisJICAgIGdiaXQgPSBmcmFjNjQ7CisJICAgIGZyYWM2NCA9IEVYVFJBQ1RFRDY0KGZyYWMsIDYzLCA2Myk7CisJICAgIGZyYWMgPSBJTlNFUlRFRDY0KEVYVFJBQ1RFRDY0KGZyYWMsIDAsIDYyKSwgMSwgNjMpOworCSAgfQorCSAgUm91bmRfSW50ZWdlcihwcm9jZXNzb3IsIHNpZ24sICZmcmFjLCAmZnJhYzY0LCBnYml0LCByYml0LCB4Yml0LCByb3VuZF9tb2RlKTsKKwkgIGlmIChzaWduID09IDEpIHsgLyogZnJhY1swOjY0XSA9IH5mcmFjWzA6NjRdICsgMSAqLworCSAgICBmcmFjID0gfmZyYWM7CisJICAgIGZyYWM2NCBePSAxOworCSAgICBmcmFjICs9IChmcmFjNjQgPyAxIDogMCk7CisJICAgIGZyYWM2NCA9IChmcmFjNjQgKyAxKSAmIDB4MTsKKwkgIH0KKwkgIGlmICh0Z3RfcHJlY2lzaW9uID09IDMyIC8qIGNhbiBpZ25vcmUgZnJhYzY0IGluIGNvbXBhcmUgKi8KKwkgICAgICAmJiAoc2lnbmVkNjQpZnJhYyA+IChzaWduZWQ2NClNQVNLNjQoMzMrMSwgNjMpLyoyXjMxLTEgPj4xKi8pCisJICAgIEdPVE8oTGFyZ2VfT3BlcmFuZCk7CisJICBpZiAodGd0X3ByZWNpc2lvbiA9PSA2NCAvKiBjYW4gaWdub3JlIGZyYWM2NCBpbiBjb21wYXJlICovCisJICAgICAgJiYgKHNpZ25lZDY0KWZyYWMgPiAoc2lnbmVkNjQpTUFTSzY0KDErMSwgNjMpLyoyXjYzLTEgPj4xKi8pCisJICAgIEdPVE8oTGFyZ2VfT3BlcmFuZCk7CisJICBpZiAodGd0X3ByZWNpc2lvbiA9PSAzMiAvKiBjYW4gaWdub3JlIGZyYWM2NCBpbiBjb21wYXJlICovCisJICAgICAgJiYgKHNpZ25lZDY0KWZyYWMgPCAoc2lnbmVkNjQpTUFTSzY0KDAsIDMyKzEpLyotMl4zMSA+PjEqLykKKwkgICAgR09UTyhMYXJnZV9PcGVyYW5kKTsKKwkgIGlmICh0Z3RfcHJlY2lzaW9uID09IDY0IC8qIGNhbiBpZ25vcmUgZnJhYzY0IGluIGNvbXBhcmUgKi8KKwkgICAgICAmJiAoc2lnbmVkNjQpZnJhYyA8IChzaWduZWQ2NClNQVNLNjQoMCwgMCsxKS8qLTJeNjMgPj4xKi8pCisJICAgIEdPVE8oTGFyZ2VfT3BlcmFuZCk7CisJICBGUFNDUl9TRVRfWFgoRlBTQ1IgJiBmcHNjcl9maSk7CisJICBpZiAodGd0X3ByZWNpc2lvbiA9PSAzMikKKwkgICAgKmZydCA9IE1BU0tFRDY0KCpmcnQsIDAsIDMxKSB8IChFWFRSQUNURUQ2NChmcmFjLCAzMywgNjMpIDw8IDEpIHwgZnJhYzY0OworCSAgaWYgKHRndF9wcmVjaXNpb24gPT0gNjQpCisJICAgICpmcnQgPSAoRVhUUkFDVEVENjQoZnJhYywgMSwgNjMpIDw8IDEpIHwgZnJhYzY0OworCSAgLypGUFNDUltmcHJmXSA9IHVuZGVmaW5lZCAqLworCSAgR09UTyhEb25lKTsKKwkgIC8qKi8KKwlMQUJFTChJbmZpbml0eV9PcGVyYW5kKToKKwkgIEZQU0NSX1NFVF9GUigwKTsKKwkgIEZQU0NSX1NFVF9GSSgwKTsKKwkgIEZQU0NSX09SX1ZYKGZwc2NyX3Z4Y3ZpKTsKKwkgIGlmICgoRlBTQ1IgJiBmcHNjcl92ZSkgPT0gMCkgeworCSAgICBpZiAodGd0X3ByZWNpc2lvbiA9PSAzMikgeworCSAgICAgIGlmIChzaWduID09IDApICpmcnQgPSBNQVNLRUQ2NCgqZnJ0LCAwLCAzMSkgfCAweDdGRkZGRkZGOworCSAgICAgIGlmIChzaWduID09IDEpICpmcnQgPSBNQVNLRUQ2NCgqZnJ0LCAwLCAzMSkgfCAweDgwMDAwMDAwOworCSAgICB9CisJICAgIGVsc2UgeworCSAgICAgIGlmIChzaWduID09IDApICpmcnQgPSBNQVNLNjQoMSwgNjMpOyAvKjB4N0ZGRl9GRkZGX0ZGRkZfRkZGRiovCisJICAgICAgaWYgKHNpZ24gPT0gMSkgKmZydCA9IEJJVDY0KDApOyAvKjB4ODAwMF8wMDAwXzAwMDBfMDAwMCovCisJICAgIH0KKwkgICAgLyogRlBTQ1JbRlBSRl0gPSB1bmRlZmluZWQgKi8KKwkgIH0KKwkgIEdPVE8oRG9uZSk7CisJLyoqLworCUxBQkVMKFNOYU5fT3BlcmFuZCk6CisJICBGUFNDUl9TRVRfRlIoMCk7CisJICBGUFNDUl9TRVRfRkkoMCk7CisJICBGUFNDUl9PUl9WWChmcHNjcl92eHNuYW4gfCBmcHNjcl92eGN2aSk7CisJICBpZiAoKEZQU0NSICYgZnBzY3JfdmUpID09IDApIHsKKwkgICAgaWYgKHRndF9wcmVjaXNpb24gPT0gMzIpICpmcnQgPSBNQVNLRUQ2NCgqZnJ0LCAwLCAzMSkgfCAweDgwMDAwMDAwOworCSAgICBpZiAodGd0X3ByZWNpc2lvbiA9PSA2NCkgKmZydCA9IEJJVDY0KDApOyAvKjB4ODAwMF8wMDAwXzAwMDBfMDAwMCovCisJICAgIC8qIEZQU0NSW2ZwcmZdID0gdW5kZWZpbmVkICovCisJICB9CisJICBHT1RPKERvbmUpOworCS8qKi8KKwlMQUJFTChRTmFOX09wZXJhbmQpOgorCSAgRlBTQ1JfU0VUX0ZSKDApOworCSAgRlBTQ1JfU0VUX0ZJKDApOworCSAgRlBTQ1JfT1JfVlgoZnBzY3JfdnhjdmkpOworCSAgaWYgKChGUFNDUiAmIGZwc2NyX3ZlKSA9PSAwKSB7CisJICAgIGlmICh0Z3RfcHJlY2lzaW9uID09IDMyKSAqZnJ0ID0gTUFTS0VENjQoKmZydCwgMCwgMzEpIHwgMHg4MDAwMDAwMDsKKwkgICAgaWYgKHRndF9wcmVjaXNpb24gPT0gNjQpICpmcnQgPSBCSVQ2NCgwKTsvKjB4ODAwMF8wMDAwXzAwMDBfMDAwMCovCisJICAgIC8qIEZQU0NSW2ZwcmZdID0gdW5kZWZpbmVkICovCisJICB9CisJICBHT1RPKERvbmUpOworCS8qKi8KKwlMQUJFTChMYXJnZV9PcGVyYW5kKToKKwkgIEZQU0NSX1NFVF9GUigwKTsKKwkgIEZQU0NSX1NFVF9GSSgwKTsKKwkgIEZQU0NSX09SX1ZYKGZwc2NyX3Z4Y3ZpKTsKKwkgIGlmICgoRlBTQ1IgJiBmcHNjcl92ZSkgPT0gMCkgeworCSAgICBpZiAodGd0X3ByZWNpc2lvbiA9PSAzMikgeworCSAgICAgIGlmIChzaWduID09IDApICpmcnQgPSBNQVNLRUQ2NCgqZnJ0LCAwLCAzMSkgfCAweDdmZmZmZmZmOworCSAgICAgIGlmIChzaWduID09IDEpICpmcnQgPSBNQVNLRUQ2NCgqZnJ0LCAwLCAzMSkgfCAweDgwMDAwMDAwOworCSAgICB9CisJICAgIGVsc2UgeworCSAgICAgIGlmIChzaWduID09IDApICpmcnQgPSBNQVNLNjQoMSwgNjMpOyAvKjB4N0ZGRl9GRkZGX0ZGRkZfRkZGRiovCisJICAgICAgaWYgKHNpZ24gPT0gMSkgKmZydCA9IEJJVDY0KDApOyAvKjB4ODAwMF8wMDAwXzAwMDBfMDAwMCovCisJICAgIH0KKwkgICAgLyogRlBTQ1JbZnByZl0gPSB1bmRlZmluZWQgKi8KKwkgIH0KKwkvKiovCisJTEFCRUwoRG9uZSk6CisKKworIyBleHRyYWN0IG91dCByYXcgZmllbGRzIG9mIGEgRlAgbnVtYmVyCitpbnQ6OmZ1bmN0aW9uOjpzaWduOnVuc2lnbmVkNjQgRlJTCisJcmV0dXJuIChNQVNLRUQ2NChGUlMsIDAsIDApCisJICAgICAgICA/IC0xCisJICAgICAgICA6IDEpOworaW50OjpmdW5jdGlvbjo6Ymlhc2VkX2V4cDp1bnNpZ25lZDY0IGZycywgaW50IHNpbmdsZQorCWlmIChzaW5nbGUpCisJICByZXR1cm4gRVhUUkFDVEVENjQoZnJzLCAxLCA4KTsKKwllbHNlCisJICByZXR1cm4gRVhUUkFDVEVENjQoZnJzLCAxLCAxMSk7Cit1bnNpZ25lZDY0OjpmdW5jdGlvbjo6ZnJhY3Rpb246dW5zaWduZWQ2NCBmcnMsIGludCBzaW5nbGUKKwlpZiAoc2luZ2xlKQorCSAgcmV0dXJuIEVYVFJBQ1RFRDY0KGZycywgOSwgMzEpOworCWVsc2UKKwkgIHJldHVybiBFWFRSQUNURUQ2NChmcnMsIDEyLCA2Myk7CisKKyMgYSBudW1iZXI/LCBlYWNoIG9mIHRoZSBiZWxvdyByZXR1cm4gKzEgb3IgLTEgKGJhc2VkIG9uIHNpZ24gYml0KQorIyBpZiB0cnVlLgoraW50OjpmdW5jdGlvbjo6aXNfbm9yOnVuc2lnbmVkNjQgZnJzLCBpbnQgc2luZ2xlCisJaW50IGV4cCA9IGJpYXNlZF9leHAoZnJzLCBzaW5nbGUpOworCXJldHVybiAoZXhwID49IDEKKwkgICAgICAgICYmIGV4cCA8PSAoc2luZ2xlID8gMjU0IDogMjA0NikpOworaW50OjpmdW5jdGlvbjo6aXNfemVybzp1bnNpZ25lZDY0IEZSUworCXJldHVybiAoTUFTS0VENjQoRlJTLCAxLCA2MykgPT0gMAorCSAgICAgICAgPyBzaWduKEZSUykKKwkgICAgICAgIDogMCk7CitpbnQ6OmZ1bmN0aW9uOjppc19kZW46dW5zaWduZWQ2NCBmcnMsIGludCBzaW5nbGUKKwlpbnQgZXhwID0gYmlhc2VkX2V4cChmcnMsIHNpbmdsZSk7CisJdW5zaWduZWQ2NCBmcmFjID0gZnJhY3Rpb24oZnJzLCBzaW5nbGUpOworCXJldHVybiAoZXhwID09IDAgJiYgZnJhYyAhPSAwCisJICAgICAgICA/IHNpZ24oZnJzKQorCSAgICAgICAgOiAwKTsKK2ludDo6ZnVuY3Rpb246OmlzX2luZjp1bnNpZ25lZDY0IGZycywgaW50IHNpbmdsZQorCWludCBleHAgPSBiaWFzZWRfZXhwKGZycywgc2luZ2xlKTsKKwl1bnNpZ25lZDY0IGZyYWMgPSBmcmFjdGlvbihmcnMsIHNpbmdsZSk7CisJcmV0dXJuIChleHAgPT0gKHNpbmdsZSA/IDI1NSA6IDIwNDcpICYmIGZyYWMgPT0gMAorCSAgICAgICAgPyBzaWduKGZycykKKwkgICAgICAgIDogMCk7CitpbnQ6OmZ1bmN0aW9uOjppc19OYU46dW5zaWduZWQ2NCBmcnMsIGludCBzaW5nbGUKKwlpbnQgZXhwID0gYmlhc2VkX2V4cChmcnMsIHNpbmdsZSk7CisJdW5zaWduZWQ2NCBmcmFjID0gZnJhY3Rpb24oZnJzLCBzaW5nbGUpOworCXJldHVybiAoZXhwID09IChzaW5nbGUgPyAyNTUgOiAyMDQ3KSAmJiBmcmFjICE9IDAKKwkgICAgICAgID8gc2lnbihmcnMpCisJICAgICAgICA6IDApOworaW50OjpmdW5jdGlvbjo6aXNfU05hTjp1bnNpZ25lZDY0IGZycywgaW50IHNpbmdsZQorCXJldHVybiAoaXNfTmFOKGZycywgc2luZ2xlKQorCSAgICAgICAgJiYgIShmcnMgJiAoc2luZ2xlID8gTUFTSzY0KDksIDkpIDogTUFTSzY0KDEyLCAxMikpKQorCSAgICAgICAgICAgICA/IHNpZ24oZnJzKQorCSAgICAgICAgICAgICA6IDApOworaW50OjpmdW5jdGlvbjo6aXNfUU5hTjp1bnNpZ25lZDY0IGZycywgaW50IHNpbmdsZQorCXJldHVybiAoaXNfTmFOKGZycywgc2luZ2xlKSAmJiAhaXNfU05hTihmcnMsIHNpbmdsZSkpOworaW50OjpmdW5jdGlvbjo6aXNfbGVzc190aGFuOnVuc2lnbmVkNjQgKmZyYSwgdW5zaWduZWQ2NCAqZnJiCisJcmV0dXJuICooZG91YmxlKilmcmEgPCAqKGRvdWJsZSopZnJiOworaW50OjpmdW5jdGlvbjo6aXNfZ3JlYXRlcl90aGFuOnVuc2lnbmVkNjQgKmZyYSwgdW5zaWduZWQ2NCAqZnJiCisJcmV0dXJuICooZG91YmxlKilmcmEgPiAqKGRvdWJsZSopZnJiOworaW50OjpmdW5jdGlvbjo6aXNfZXF1YW5fdG86dW5zaWduZWQ2NCAqZnJhLCB1bnNpZ25lZDY0ICpmcmIKKwlyZXR1cm4gKihkb3VibGUqKWZyYSA9PSAqKGRvdWJsZSopZnJiOworCisKKyMgd2hpY2ggcXVpZXQgbmFuIHNob3VsZCBiZWNvbWUgdGhlIHJlc3VsdAordW5zaWduZWQ2NDo6ZnVuY3Rpb246OnNlbGVjdF9xbmFuOnVuc2lnbmVkNjQgZnJhLCB1bnNpZ25lZDY0IGZyYiwgdW5zaWduZWQ2NCBmcmMsIGludCBpbnN0cnVjdGlvbl9pc19mcnNwLCBpbnQgZ2VuZXJhdGVfcW5hbiwgaW50IHNpbmdsZQorCXVuc2lnbmVkNjQgZnJ0ID0gMDsKKwlpZiAoaXNfTmFOKGZyYSwgc2luZ2xlKSkKKwkgIGZydCA9IGZyYTsKKwllbHNlIGlmIChpc19OYU4oZnJiLCBzaW5nbGUpKQorCSAgaWYgKGluc3RydWN0aW9uX2lzX2Zyc3ApCisJICAgIGZydCA9IE1BU0tFRDY0KGZyYiwgMCwgMzQpOworCSAgZWxzZQorCSAgICBmcnQgPSBmcmI7CisJZWxzZSBpZiAoaXNfTmFOKGZyYywgc2luZ2xlKSkKKwkgIGZydCA9IGZyYzsKKwllbHNlIGlmIChnZW5lcmF0ZV9xbmFuKQorCSAgZnJ0ID0gTUFTSzY0KDEsIDEyKTsgLyogMHg3RkY4XzAwMDBfMDAwMF8wMDAwICovCisJZWxzZQorCSAgZXJyb3IoInNlbGVjdF9xbmFuIC0gZGVmYXVsdCByZWFjaGVkXG4iKTsKKwlyZXR1cm4gZnJ0OworCisKKyMgZGV0ZWN0IGludmFsaWQgb3BlcmF0aW9uCitpbnQ6OmZ1bmN0aW9uOjppc19pbnZhbGlkX29wZXJhdGlvbjpjcHUgKnByb2Nlc3NvciwgdW5zaWduZWRfd29yZCBjaWEsIHVuc2lnbmVkNjQgZnJhLCB1bnNpZ25lZDY0IGZyYiwgZnBzY3JlZyBjaGVjaywgaW50IHNpbmdsZSwgaW50IG5lZ2F0ZQorCWludCBmYWlsID0gMDsKKwlpZiAoKGNoZWNrICYgZnBzY3JfdnhzbmFuKQorCSAgICAmJiAoaXNfU05hTihmcmEsIHNpbmdsZSkgfHwgaXNfU05hTihmcmIsIHNpbmdsZSkpKSB7CisJICBGUFNDUl9PUl9WWChmcHNjcl92eHNuYW4pOworCSAgZmFpbCA9IDE7CisJfQorCWlmICgoY2hlY2sgJiBmcHNjcl92eGlzaSkKKwkgICAgJiYgKGlzX2luZihmcmEsIHNpbmdsZSkgJiYgaXNfaW5mKGZyYiwgc2luZ2xlKSkKKwkgICAgJiYgKChuZWdhdGUgJiYgc2lnbihmcmEpICE9IHNpZ24oZnJiKSkKKwkgICAgICAgIHx8ICghbmVnYXRlICYmIHNpZ24oZnJhKSA9PSBzaWduKGZyYikpKSkgeworCSAgIC8qRklYTUU6IGRvbid0IGhhbmRsZSBpbmYtaW5mIFZTIGluZistaW5mICovCisJICBGUFNDUl9PUl9WWChmcHNjcl92eGlzaSk7CisJICBmYWlsID0gMTsKKwl9CisJaWYgKChjaGVjayAmIGZwc2NyX3Z4aWRpKQorCSAgICAmJiAoaXNfaW5mKGZyYSwgc2luZ2xlKSAmJiBpc19pbmYoZnJiLCBzaW5nbGUpKSkgeworCSAgRlBTQ1JfT1JfVlgoZnBzY3JfdnhpZGkpOworCSAgZmFpbCA9IDE7CisJfQorCWlmICgoY2hlY2sgJiBmcHNjcl92eHpkeikKKwkgICAgJiYgKGlzX3plcm8oZnJhKSAmJiBpc196ZXJvKGZyYikpKSB7CisJICBGUFNDUl9PUl9WWChmcHNjcl92eHpkeik7CisJICBmYWlsID0gMTsKKwl9CisJaWYgKChjaGVjayAmIGZwc2NyX3Z4aW16KQorCSAgICAmJiAoaXNfemVybyhmcmEpICYmIGlzX2luZihmcmIsIHNpbmdsZSkpKSB7CisJICBGUFNDUl9PUl9WWChmcHNjcl92eGlteik7CisJICBmYWlsID0gMTsKKwl9CisJaWYgKChjaGVjayAmIGZwc2NyX3Z4dmMpCisJICAgICYmIChpc19OYU4oZnJhLCBzaW5nbGUpIHx8IGlzX05hTihmcmIsIHNpbmdsZSkpKSB7CisJICBGUFNDUl9PUl9WWChmcHNjcl92eHZjKTsKKwkgIGZhaWwgPSAxOworCX0KKwlpZiAoKGNoZWNrICYgZnBzY3Jfdnhzb2Z0KSkgeworCSAgRlBTQ1JfT1JfVlgoZnBzY3Jfdnhzb2Z0KTsKKwkgIGZhaWwgPSAxOworCX0KKwlpZiAoKGNoZWNrICYgZnBzY3JfdnhzcXJ0KQorCSAgICAmJiBzaWduKGZyYSkgPCAwKSB7CisJICBGUFNDUl9PUl9WWChmcHNjcl92eHNxcnQpOworCSAgZmFpbCA9IDE7CisJfQorCS8qIGlmICgoY2hlY2sgJiYgZnBzY3JfdnhjdmkpIHsKKwkgICAgJiYgKGlzX2luZihmcmEsIHNpbmdsZSkgfHwgaXNfTmFOKGZyYSwgc2luZ2xlKSB8fCBpc19sYXJnZShmcmEsIHNpbmdsZSkpKQorCSAgRlBTQ1JfT1JfVlgoZnBzY3JfdnhjdmkpOworCSAgZmFpbCA9IDE7CisJfQorCSovCisJcmV0dXJuIGZhaWw7CisKKworCisKKworIyBoYW5kbGUgY2FzZSBvZiBpbnZhbGlkIG9wZXJhdGlvbgordm9pZDo6ZnVuY3Rpb246OmludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uOmNwdSAqcHJvY2Vzc29yLCB1bnNpZ25lZF93b3JkIGNpYSwgdW5zaWduZWQ2NCAqZnJ0LCB1bnNpZ25lZDY0IGZyYSwgdW5zaWduZWQ2NCBmcmIsIHVuc2lnbmVkNjQgZnJjLCBpbnQgaW5zdHJ1Y3Rpb25faXNfZnJzcCwgaW50IGluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fNjRiaXQsIGludCBpbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzMyYml0LCBpbnQgc2luZ2xlCisJaWYgKEZQU0NSICYgZnBzY3JfdmUpIHsKKwkgIC8qIGludmFsaWQgb3BlcmF0aW9uIGV4Y2VwdGlvbiBlbmFibGVkICovCisJICAvKiBGUlQgdW5jaGFnZWQgKi8KKwkgIEZQU0NSX1NFVF9GUigwKTsKKwkgIEZQU0NSX1NFVF9GSSgwKTsKKwkgIC8qIGZwc2NyX0ZQUkYgdW5jaGFuZ2VkICovCisJfQorCWVsc2UgeworCSAgLyogaW52YWxpZCBvcGVyYXRpb24gZXhjZXB0aW9uIGRpc2FibGVkICovCisJICBpZiAoaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCkgeworCSAgICBlcnJvcigib29wc2kiKTsKKwkgIH0KKwkgIGVsc2UgaWYgKGluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQpIHsKKwkgICAgZXJyb3IoIm9vcHNpIik7CisJICB9CisJICBlbHNlIHsgLyogYXJyaXRoLCBmcnNwICovCisJICAgICpmcnQgPSBzZWxlY3RfcW5hbihmcmEsIGZyYiwgZnJjLAorCSAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25faXNfZnJzcCwgMS8qZ2VuZXJhdGUqLywgc2luZ2xlKTsKKwkgICAgRlBTQ1JfU0VUX0ZSKDApOworCSAgICBGUFNDUl9TRVRfRkkoMCk7CisJICAgIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX3F1aWV0X25hbik7CisJICB9CisJfQorCisKKworCisjIGRldGVjdCBkaXZpZGUgYnkgemVybworaW50OjpmdW5jdGlvbjo6aXNfaW52YWxpZF96ZXJvX2RpdmlkZTpjcHUgKnByb2Nlc3NvciwgdW5zaWduZWRfd29yZCBjaWEsIHVuc2lnbmVkNjQgZnJhLCB1bnNpZ25lZDY0IGZyYiwgaW50IHNpbmdsZQorCWludCBmYWlsID0gMDsKKwlpZiAoaXNfemVybyAoZnJiKSkgeworCSAgRlBTQ1JfU0VUX1pYICgxKTsKKwkgIGZhaWwgPSAxOworCX0KKwlyZXR1cm4gZmFpbDsKKworCisKKworIyBoYW5kbGUgY2FzZSBvZiBpbnZhbGlkIG9wZXJhdGlvbgordm9pZDo6ZnVuY3Rpb246OmludmFsaWRfemVyb19kaXZpZGVfb3BlcmF0aW9uOmNwdSAqcHJvY2Vzc29yLCB1bnNpZ25lZF93b3JkIGNpYSwgdW5zaWduZWQ2NCAqZnJ0LCB1bnNpZ25lZDY0IGZyYSwgdW5zaWduZWQ2NCBmcmIsIGludCBzaW5nbGUKKwlpZiAoRlBTQ1IgJiBmcHNjcl96ZSkgeworCSAgLyogemVyby1kaXZpZGUgZXhjZXB0aW9uIGVuYWJsZWQgKi8KKwkgIC8qIEZSVCB1bmNoYWdlZCAqLworCSAgRlBTQ1JfU0VUX0ZSKDApOworCSAgRlBTQ1JfU0VUX0ZJKDApOworCSAgLyogZnBzY3JfRlBSRiB1bmNoYW5nZWQgKi8KKwl9CisJZWxzZSB7CisJICAvKiB6ZXJvLWRpdmlkZSBleGNlcHRpb24gZGlzYWJsZWQgKi8KKwkgIEZQU0NSX1NFVF9GUigwKTsKKwkgIEZQU0NSX1NFVF9GSSgwKTsKKwkgIGlmICgoc2lnbiAoZnJhKSA8IDAgJiYgc2lnbiAoZnJiKSA8IDApCisJICAgICAgfHwgKHNpZ24gKGZyYSkgPiAwICYmIHNpZ24gKGZyYikgPiAwKSkgeworCSAgICAqZnJ0ID0gTUFTSzY0ICgxLCAxMSk7IC8qIDAgOiAyMDQ3IDogMC4uMCAqLworCSAgICBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9wb3NfaW5maW5pdHkpOworCSAgfQorCSAgZWxzZSB7CisJICAgICpmcnQgPSBNQVNLNjQgKDAsIDExKTsgLyogMSA6IDIwNDcgOiAwLi4wICovCisJICAgIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX25lZ19pbmZpbml0eSk7CisJICB9CisJfQorCisKKworCisKKyMKKyMgMC4wLjAuMCBJbGxlZ2FsIGluc3RydWN0aW9uIHVzZWQgZm9yIGtlcm5lbCBtb2RlIGVtdWxhdGlvbgorIworMC4wLDYuLywxMS4vLDE2Li8sMjEuLywzMS4xOlg6OjppbnN0cnVjdGlvbl9jYWxsCisJaWYgKCFvc19lbXVsX2luc3RydWN0aW9uX2NhbGwocHJvY2Vzc29yLCBjaWEsIHJlYWxfYWRkcihjaWEsIDEpKSkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisKKyMKKyMgSS4yLjQuMSBCcmFuY2ggSW5zdHJ1Y3Rpb25zCisjCiswLjE4LDYuTEksMzAuQUEsMzEuTEs6STo6OkJyYW5jaAorKjYwMTogUFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0JQVSwgICBQUENfVU5JVF9CUFUsICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKKwkvKiBXSVRIX09QVElPTl9NUEM4NjBDMAorCU5vIHByb2JsZW0gaGVyZSBiZWNhdXNlIHRoaXMgYnJhbmNoIGlzIHByZWRpY3RlZCB0YWtlbiAodW5jb25kaXRpb25hbCkuICovCisJaWYgKEFBKSBOSUEgPSBJRUEoRVhUUyhMSV8wYjAwKSk7CisJZWxzZSAgICBOSUEgPSBJRUEoQ0lBICsgRVhUUyhMSV8wYjAwKSk7CisJaWYgKExLKSBMUiA9IChzcHJlZylDSUErNDsKKwlpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDApCisJICBtb2RlbF9icmFuY2hlcyhjcHVfbW9kZWwocHJvY2Vzc29yKSwgMSwgLTEpOworCiswLjE2LDYuQk8sMTEuQkksMTYuQkQsMzAuQUEsMzEuTEs6Qjo6OkJyYW5jaCBDb25kaXRpb25hbAorKjYwMTogUFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0JQVSwgICBQUENfVU5JVF9CUFUsICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKKwlpbnQgTSwgY3RyX29rLCBjb25kX29rLCBzdWNjZWVkOworCWlmIChDVVJSRU5UX01PREVMX0lTU1VFID4gMCAmJiAhIEJPezB9KQorCSAgbW9kZWxfd2FpdF9mb3JfY3IoY3B1X21vZGVsKHByb2Nlc3NvciksIEJJVDMyX0JJKTsKKwlpZiAoaXNfNjRiaXRfaW1wbGVtZW50YXRpb24gJiYgaXNfNjRiaXRfbW9kZSkgTSA9IDA7CisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0gPSAzMjsKKwlpZiAoIUJPezJ9KSBDVFIgPSBDVFIgLSAxOworCWN0cl9vayA9IEJPezJ9IHx8ICgoTUFTS0VEKENUUiwgTSwgNjMpICE9IDApICE9IChCT3szfSkpOworCWNvbmRfb2sgPSBCT3swfSB8fCAoKENSe0JJfSkgPT0gKEJPezF9KSk7CisJaWYgKGN0cl9vayAmJiBjb25kX29rKSB7CisJICBpZiAoQUEpIE5JQSA9IElFQShFWFRTKEJEXzBiMDApKTsKKwkgIGVsc2UgICAgTklBID0gSUVBKENJQSArIEVYVFMoQkRfMGIwMCkpOworCSAgc3VjY2VlZCA9IDE7CisJfQorCWVsc2UKKwkgIHN1Y2NlZWQgPSAwOworCWlmIChMSykgTFIgPSAoc3ByZWcpSUVBKENJQSArIDQpOworCSNpZmRlZiBXSVRIX09QVElPTl9NUEM4NjBDMAorCWlmIChvcHRpb25fbXBjODYwYzAgJiYgKEJPezB9ICYmIEJPezJ9IHx8ICFCT3s0fSkpIHsKKwkgIC8qIFRoaXMgYnJhbmNoIGlzIHByZWRpY3RlZCBhcyBub3QtdGFrZW4uCisJICBJZiB0aGlzIGlzIGEgZm9yd2FyZCBicmFuY2ggYW5kIGl0IGlzIG5lYXIgdGhlIGVuZCBvZiBhIHBhZ2UsCisJICB3ZSd2ZSBkZXRlY3RlZCBhIHByb2JsZW1hdGljIGJyYW5jaC4gKi8KKwkgIGlmIChzdWNjZWVkICYmIE5JQSA+IENJQSkgeworCSAgICBpZiAoUEFHRV9TSVpFIC0gKENJQSAmIChQQUdFX1NJWkUtMSkpIDw9IG9wdGlvbl9tcGM4NjBjMCkKKwkgICAgICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwgbXBjODYwYzBfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCSAgfQorCX0KKwkjZW5kaWYgLy8gV0lUSF9PUFRJT05fTVBDODYwQzAKKwlpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSA+IDApCisJICBtb2RlbF9icmFuY2hlcyhjcHVfbW9kZWwocHJvY2Vzc29yKSwgc3VjY2VlZCwgQk8pOworCWlmICghIEJPezB9KSB7CisJICBpbnQgcmV2ZXJzZTsKKwkgIGlmIChCT3s0fSkgewkvKiBicmFuY2ggcHJlZGljdGlvbiBiaXQgc2V0LCByZXZlcnNlIHNlbnNlIG9mIHRlc3QgKi8KKwkgICAgcmV2ZXJzZSA9IEVYVFMoQkRfMGIwMCkgPCAwOworCSAgfSBlbHNlIHsJLyogYnJhbmNoIHByZWRpY3Rpb24gYml0IG5vdCBzZXQgKi8KKwkgICAgcmV2ZXJzZSA9IEVYVFMoQkRfMGIwMCkgPj0gMDsKKwkgIH0KKwkgIGlmIChDVVJSRU5UX01PREVMX0lTU1VFID4gMCkKKwkgICAgbW9kZWxfYnJhbmNoX3ByZWRpY3QoY3B1X21vZGVsKHByb2Nlc3NvciksIHJldmVyc2UgPyAhc3VjY2VlZCA6IHN1Y2NlZWQpOworCX0KKworMC4xOSw2LkJPLDExLkJJLDE2Li8sMjEuMTYsMzEuTEs6WEw6OjpCcmFuY2ggQ29uZGl0aW9uYWwgdG8gTGluayBSZWdpc3RlcgorKjYwMTogUFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0JQVSwgICBQUENfVU5JVF9CUFUsICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKKwlpbnQgTSwgY3RyX29rLCBjb25kX29rLCBzdWNjZWVkOworCWlmIChpc182NGJpdF9pbXBsZW1lbnRhdGlvbiAmJiBpc182NGJpdF9tb2RlKSBNID0gMDsKKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTSA9IDMyOworCWlmIChDVVJSRU5UX01PREVMX0lTU1VFID4gMCAmJiAhIEJPezB9KQorCSAgbW9kZWxfd2FpdF9mb3JfY3IoY3B1X21vZGVsKHByb2Nlc3NvciksIEJJVDMyX0JJKTsKKwlpZiAoIUJPezJ9KSBDVFIgPSBDVFIgLSAxOworCWN0cl9vayA9IEJPezJ9IHx8ICgoTUFTS0VEKENUUiwgTSwgNjMpICE9IDApICE9IEJPezN9KTsKKwljb25kX29rID0gQk97MH0gfHwgKENSe0JJfSA9PSBCT3sxfSk7CisJaWYgKGN0cl9vayAmJiBjb25kX29rKSB7CisJICBOSUEgPSBJRUEoTFJfMGIwMCk7CisJICBzdWNjZWVkID0gMTsKKwl9CisJZWxzZQorCSAgc3VjY2VlZCA9IDA7CisJaWYgKExLKSBMUiA9IChzcHJlZylJRUEoQ0lBICsgNCk7CisJI2lmZGVmIFdJVEhfT1BUSU9OX01QQzg2MEMwCisJaWYgKG9wdGlvbl9tcGM4NjBjMCAmJiAoQk97MH0gJiYgQk97Mn0gfHwgIUJPezR9KSkgeworCSAgLyogVGhpcyBicmFuY2ggaXMgcHJlZGljdGVkIGFzIG5vdC10YWtlbi4KKwkgIElmIHRoaXMgaXMgYSBmb3J3YXJkIGJyYW5jaCBhbmQgaXQgaXMgbmVhciB0aGUgZW5kIG9mIGEgcGFnZSwKKwkgIHdlJ3ZlIGRldGVjdGVkIGEgcHJvYmxlbWF0aWMgYnJhbmNoLiAqLworCSAgaWYgKHN1Y2NlZWQgJiYgTklBID4gQ0lBKSB7CisJICAgIGlmIChQQUdFX1NJWkUgLSAoQ0lBICYgKFBBR0VfU0laRS0xKSkgPD0gb3B0aW9uX21wYzg2MGMwKQorCSAgICAgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBtcGM4NjBjMF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJICB9CisJfQorCSNlbmRpZiAvLyBXSVRIX09QVElPTl9NUEM4NjBDMAorCWlmIChDVVJSRU5UX01PREVMX0lTU1VFID4gMCkgeworCSAgbW9kZWxfYnJhbmNoZXMoY3B1X21vZGVsKHByb2Nlc3NvciksIHN1Y2NlZWQsIEJPKTsKKwkgIGlmICghIEJPezB9KQorCSAgICBtb2RlbF9icmFuY2hfcHJlZGljdChjcHVfbW9kZWwocHJvY2Vzc29yKSwgQk97NH0gPyAhc3VjY2VlZCA6IHN1Y2NlZWQpOworCX0KKworMC4xOSw2LkJPLDExLkJJLDE2Li8sMjEuNTI4LDMxLkxLOlhMOjo6QnJhbmNoIENvbmRpdGlvbmFsIHRvIENvdW50IFJlZ2lzdGVyCisqNjAxOiBQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0JQVSwgICBQUENfVU5JVF9CUFUsICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAorCWludCBjb25kX29rLCBzdWNjZWVkOworCWlmIChDVVJSRU5UX01PREVMX0lTU1VFID4gMCAmJiAhIEJPezB9KQorCSAgbW9kZWxfd2FpdF9mb3JfY3IoY3B1X21vZGVsKHByb2Nlc3NvciksIEJJVDMyX0JJKTsKKwljb25kX29rID0gQk97MH0gfHwgKENSe0JJfSA9PSBCT3sxfSk7CisJaWYgKGNvbmRfb2spIHsKKwkgIE5JQSA9IElFQShDVFJfMGIwMCk7CisJICBzdWNjZWVkID0gMTsKKwl9CisJZWxzZQorCSAgc3VjY2VlZCA9IDA7CisJaWYgKExLKSBMUiA9IChzcHJlZylJRUEoQ0lBICsgNCk7CisJI2lmZGVmIFdJVEhfT1BUSU9OX01QQzg2MEMwCisJaWYgKG9wdGlvbl9tcGM4NjBjMCAmJiAoQk97MH0gJiYgQk97Mn0gfHwgIUJPezR9KSkgeworCSAgLyogVGhpcyBicmFuY2ggaXMgcHJlZGljdGVkIGFzIG5vdC10YWtlbi4KKwkgIElmIHRoaXMgaXMgYSBmb3J3YXJkIGJyYW5jaCBhbmQgaXQgaXMgbmVhciB0aGUgZW5kIG9mIGEgcGFnZSwKKwkgIHdlJ3ZlIGRldGVjdGVkIGEgcHJvYmxlbWF0aWMgYnJhbmNoLiAqLworCSAgaWYgKHN1Y2NlZWQgJiYgTklBID4gQ0lBKSB7CisJICAgIGlmIChQQUdFX1NJWkUgLSAoQ0lBICYgKFBBR0VfU0laRS0xKSkgPD0gb3B0aW9uX21wYzg2MGMwKQorCSAgICAgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBtcGM4NjBjMF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJICB9CisJfQorCSNlbmRpZiAvLyBXSVRIX09QVElPTl9NUEM4NjBDMAorCWlmIChDVVJSRU5UX01PREVMX0lTU1VFID4gMCkgeworCSAgbW9kZWxfYnJhbmNoZXMoY3B1X21vZGVsKHByb2Nlc3NvciksIHN1Y2NlZWQsIEJPKTsKKwkgIGlmICghIEJPezB9KQorCSAgICBtb2RlbF9icmFuY2hfcHJlZGljdChjcHVfbW9kZWwocHJvY2Vzc29yKSwgQk97NH0gPyAhc3VjY2VlZCA6IHN1Y2NlZWQpOworCX0KKworIworIyBJLjIuNC4yIFN5c3RlbSBDYWxsIEluc3RydWN0aW9uCisjCiswLjE3LDYuLywxMS4vLDE2Li8sMzAuMSwzMS4vOlNDOjo6U3lzdGVtIENhbGwKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDMsICAzLCAgMAorKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAzLCAgMywgIDAKKyo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCisJaWYgKENVUlJFTlRfTU9ERUxfSVNTVUUgPiAwKQorCSAgbW9kZWxfc2VyaWFsaXplKE1ZX0lOREVYLCBjcHVfbW9kZWwocHJvY2Vzc29yKSk7CisJc3lzdGVtX2NhbGxfaW50ZXJydXB0KHByb2Nlc3NvciwgY2lhKTsKKworIworIyBJLjIuNC4zIENvbmRpdGlvbiBSZWdpc3RlciBMb2dpY2FsIEluc3RydWN0aW9ucworIworMC4xOSw2LkJULDExLkJBLDE2LkJCLDIxLjI1NywzMS4vOlhMOjpjcmFuZDpDb25kaXRpb24gUmVnaXN0ZXIgQU5ECisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAorCUJMSVQzMihDUiwgQlQsIENSe0JBfSAmJiBDUntCQn0pOworCVBQQ19JTlNOX0NSKEJUX0JJVE1BU0ssIEJBX0JJVE1BU0sgfCBCQl9CSVRNQVNLKTsKKworMC4xOSw2LkJULDExLkJBLDE2LkJCLDIxLjQ0OSwzMS4vOlhMOjpjcm9yOkNvbmRpdGlvbiBSZWdpc3RlciBPUgorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKKwlCTElUMzIoQ1IsIEJULCBDUntCQX0gfHwgQ1J7QkJ9KTsKKwlQUENfSU5TTl9DUihCVF9CSVRNQVNLLCBCQV9CSVRNQVNLIHwgQkJfQklUTUFTSyk7CisKKzAuMTksNi5CVCwxMS5CQSwxNi5CQiwyMS4xOTMsMzEuLzpYTDo6Y3J4b3I6Q29uZGl0aW9uIFJlZ2lzdGVyIFhPUgorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKKwlCTElUMzIoQ1IsIEJULCBDUntCQX0gIT0gQ1J7QkJ9KTsKKwlQUENfSU5TTl9DUihCVF9CSVRNQVNLLCBCQV9CSVRNQVNLIHwgQkJfQklUTUFTSyk7CisKKzAuMTksNi5CVCwxMS5CQSwxNi5CQiwyMS4yMjUsMzEuLzpYTDo6Y3JuYW5kOkNvbmRpdGlvbiBSZWdpc3RlciBOQU5ECisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAorCUJMSVQzMihDUiwgQlQsICEoQ1J7QkF9ICYmIENSe0JCfSkpOworCVBQQ19JTlNOX0NSKEJUX0JJVE1BU0ssIEJBX0JJVE1BU0sgfCBCQl9CSVRNQVNLKTsKKworMC4xOSw2LkJULDExLkJBLDE2LkJCLDIxLjMzLDMxLi86WEw6OmNybm9yOkNvbmRpdGlvbiBSZWdpc3RlciBOT1IKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX0JQVSwgICBQUENfVU5JVF9CUFUsICAgMSwgIDEsICAwCisJQkxJVDMyKENSLCBCVCwgIShDUntCQX0gfHwgQ1J7QkJ9KSk7CisJUFBDX0lOU05fQ1IoQlRfQklUTUFTSywgQkFfQklUTUFTSyB8IEJCX0JJVE1BU0spOworCiswLjE5LDYuQlQsMTEuQkEsMTYuQkIsMjEuMjg5LDMxLi86WEw6OmNyZXF2OkNvbmRpdGlvbiBSZWdpc3RlciBFcXVpdmFsZW50CisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAorCUJMSVQzMihDUiwgQlQsIENSe0JBfSA9PSBDUntCQn0pOworCVBQQ19JTlNOX0NSKEJUX0JJVE1BU0ssIEJBX0JJVE1BU0sgfCBCQl9CSVRNQVNLKTsKKworMC4xOSw2LkJULDExLkJBLDE2LkJCLDIxLjEyOSwzMS4vOlhMOjpjcmFuZGM6Q29uZGl0aW9uIFJlZ2lzdGVyIEFORCB3aXRoIENvbXBsZW1lbnQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX0JQVSwgICBQUENfVU5JVF9CUFUsICAgMSwgIDEsICAwCisJQkxJVDMyKENSLCBCVCwgQ1J7QkF9ICYmICFDUntCQn0pOworCVBQQ19JTlNOX0NSKEJUX0JJVE1BU0ssIEJBX0JJVE1BU0sgfCBCQl9CSVRNQVNLKTsKKworMC4xOSw2LkJULDExLkJBLDE2LkJCLDIxLjQxNywzMS4vOlhMOjpjcm9yYzpDb25kaXRpb24gUmVnaXN0ZXIgT1Igd2l0aCBDb21wbGVtZW50CisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAxLCAgMAorCUJMSVQzMihDUiwgQlQsIENSe0JBfSB8fCAhQ1J7QkJ9KTsKKwlQUENfSU5TTl9DUihCVF9CSVRNQVNLLCBCQV9CSVRNQVNLIHwgQkJfQklUTUFTSyk7CisKKyMKKyMgSS4yLjQuNCBDb25kaXRpb24gUmVnaXN0ZXIgRmllbGQgSW5zdHJ1Y3Rpb24KKyMKKzAuMTksNi5CRiw5Li8sMTEuQkZBLDE0Li8sMTYuLywyMS4wLDMxLi86WEw6OjpNb3ZlIENvbmRpdGlvbiBSZWdpc3RlciBGaWVsZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfQlBVLCAgIFBQQ19VTklUX0JQVSwgICAxLCAgMSwgIDAKKwlNQkxJVDMyKENSLCA0KkJGLCA0KkJGKzMsIEVYVFJBQ1RFRDMyKENSLCA0KkJGQSwgNCpCRkErMykpOworCVBQQ19JTlNOX0NSKEJGX0JJVE1BU0ssIDEgPDwgQkZBKTsKKworCisjCisjIEkuMy4zLjIgRml4ZWQtUG9pbnQgTG9hZCBJbnN0cnVjdGlvbnMKKyMKKworMC4zNCw2LlJULDExLlJBLDE2LkQ6RDo6OkxvYWQgQnl0ZSBhbmQgWmVybworKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMiwgIDAKKyo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKwl1bnNpZ25lZF93b3JkIGI7CisJdW5zaWduZWRfd29yZCBFQTsKKwlpZiAoUkFfaXNfMCkgYiA9IDA7CisJZWxzZSAgICAgICAgIGIgPSAqckE7CisJRUEgPSBiICsgRVhUUyhEKTsKKwkqclQgPSBNRU0odW5zaWduZWQsIEVBLCAxKTsKKwlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgKFJBX0JJVE1BU0sgJiB+MSksIDApOworCisKKzAuMzEsNi5SVCwxMS5SQSwxNi5SQiwyMS44NywzMS4vOlg6OjpMb2FkIEJ5dGUgYW5kIFplcm8gSW5kZXhlZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMiwgIDAKKyo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKwl1bnNpZ25lZF93b3JkIGI7CisJdW5zaWduZWRfd29yZCBFQTsKKwlpZiAoUkFfaXNfMCkgYiA9IDA7CisJZWxzZSAgICAgICAgIGIgPSAqckE7CisJRUEgPSBiICsgKnJCOworCSpyVCA9IE1FTSh1bnNpZ25lZCwgRUEsIDEpOworCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIDApOworCiswLjM1LDYuUlQsMTEuUkEsMTYuRDpEOjo6TG9hZCBCeXRlIGFuZCBaZXJvIHdpdGggVXBkYXRlCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAyLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzAgfHwgUkEgPT0gUlQpCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCUVBID0gKnJBICsgRVhUUyhEKTsKKwkqclQgPSBNRU0odW5zaWduZWQsIEVBLCAxKTsKKwkqckEgPSBFQTsKKwlQUENfSU5TTl9JTlQoUlRfQklUTUFTSyB8IFJBX0JJVE1BU0ssIFJBX0JJVE1BU0ssIDApOworCiswLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuMTE5LDMxLi86WDo6OkxvYWQgQnl0ZSBhbmQgWmVybyB3aXRoIFVwZGF0ZSBJbmRleGVkCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAyLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzAgfHwgUkEgPT0gUlQpCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCUVBID0gKnJBICsgKnJCOworCSpyVCA9IE1FTSh1bnNpZ25lZCwgRUEsIDEpOworCSpyQSA9IEVBOworCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLIHwgUkFfQklUTUFTSywgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0ssIDApOworCiswLjQwLDYuUlQsMTEuUkEsMTYuRDpEOjo6TG9hZCBIYWxmd29yZCBhbmQgWmVybworKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMiwgIDAKKyo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKwl1bnNpZ25lZF93b3JkIGI7CisJdW5zaWduZWRfd29yZCBFQTsKKwlpZiAoUkFfaXNfMCkgYiA9IDA7CisJZWxzZSAgICAgICAgIGIgPSAqckE7CisJRUEgPSBiICsgRVhUUyhEKTsKKwkqclQgPSBNRU0odW5zaWduZWQsIEVBLCAyKTsKKwlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgKFJBX0JJVE1BU0sgJiB+MSksIDApOworCiswLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuMjc5LDMxLi86WDo6OkxvYWQgSGFsZndvcmQgYW5kIFplcm8gSW5kZXhlZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMiwgIDAKKyo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKwl1bnNpZ25lZF93b3JkIGI7CisJdW5zaWduZWRfd29yZCBFQTsKKwlpZiAoUkFfaXNfMCkgYiA9IDA7CisJZWxzZSAgICAgICAgIGIgPSAqckE7CisJRUEgPSBiICsgKnJCOworCSpyVCA9IE1FTSh1bnNpZ25lZCwgRUEsIDIpOworCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIDApOworCiswLjQxLDYuUlQsMTEuUkEsMTYuRDpEOjo6TG9hZCBIYWxmd29yZCBhbmQgWmVybyB3aXRoIFVwZGF0ZQorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMiwgIDAKKyo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKwl1bnNpZ25lZF93b3JkIEVBOworCWlmIChSQV9pc18wIHx8IFJBID09IFJUKQorCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICBpbGxlZ2FsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKKwlFQSA9ICpyQSArIEVYVFMoRCk7CisJKnJUID0gTUVNKHVuc2lnbmVkLCBFQSwgMik7CisJKnJBID0gRUE7CisJUFBDX0lOU05fSU5UKFJUX0JJVE1BU0sgfCBSQV9CSVRNQVNLLCBSQV9CSVRNQVNLLCAwKTsKKworMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLjMxMSwzMS4vOlg6OjpMb2FkIEhhbGZ3b3JkIGFuZCBaZXJvIHdpdGggVXBkYXRlIEluZGV4ZWQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDIsICAwCisqNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisJdW5zaWduZWRfd29yZCBFQTsKKwlpZiAoUkFfaXNfMCB8fCBSQSA9PSBSVCkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJRUEgPSAqckEgKyAqckI7CisJKnJUID0gTUVNKHVuc2lnbmVkLCBFQSwgMik7CisJKnJBID0gRUE7CisJUFBDX0lOU05fSU5UKFJUX0JJVE1BU0sgfCBSQV9CSVRNQVNLLCBSQV9CSVRNQVNLIHwgUkJfQklUTUFTSywgMCk7CisKKzAuNDIsNi5SVCwxMS5SQSwxNi5EOkQ6OjpMb2FkIEhhbGZ3b3JkIEFsZ2VicmFpYworKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMiwgIDAKKyo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKwl1bnNpZ25lZF93b3JkIGI7CisJdW5zaWduZWRfd29yZCBFQTsKKwlpZiAoUkFfaXNfMCkgYiA9IDA7CisJZWxzZSAgICAgICAgIGIgPSAqckE7CisJRUEgPSBiICsgRVhUUyhEKTsKKwkqclQgPSBNRU0oc2lnbmVkLCBFQSwgMik7CisJUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIChSQV9CSVRNQVNLICYgfjEpLCAwKTsKKworMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLjM0MywzMS4vOlg6OjpMb2FkIEhhbGZ3b3JkIEFsZ2VicmFpYyBJbmRleGVkCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAyLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorCXVuc2lnbmVkX3dvcmQgYjsKKwl1bnNpZ25lZF93b3JkIEVBOworCWlmIChSQV9pc18wKSBiID0gMDsKKwllbHNlICAgICAgICAgYiA9ICpyQTsKKwlFQSA9IGIgKyAqckI7CisJKnJUID0gTUVNKHNpZ25lZCwgRUEsIDIpOworCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIDApOworCiswLjQzLDYuUlQsMTEuUkEsMTYuRDpEOjo6TG9hZCBIYWxmd29yZCBBbGdlYnJhaWMgd2l0aCBVcGRhdGUKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDIsICAwCisqNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisJdW5zaWduZWRfd29yZCBFQTsKKwlpZiAoUkFfaXNfMCB8fCBSQSA9PSBSVCkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJRUEgPSAqckEgKyBFWFRTKEQpOworCSpyVCA9IE1FTShzaWduZWQsIEVBLCAyKTsKKwkqckEgPSBFQTsKKwlQUENfSU5TTl9JTlQoUlRfQklUTUFTSyB8IFJBX0JJVE1BU0ssIFJBX0JJVE1BU0ssIDApOworCiswLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuMzc1LDMxLi86WDo6OkxvYWQgSGFsZndvcmQgQWxnZWJyYWljIHdpdGggVXBkYXRlIEluZGV4ZWQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDIsICAwCisqNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisJdW5zaWduZWRfd29yZCBFQTsKKwlpZiAoUkFfaXNfMCB8fCBSQSA9PSBSVCkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJRUEgPSAqckEgKyAqckI7CisJKnJUID0gTUVNKHNpZ25lZCwgRUEsIDIpOworCSpyQSA9IEVBOworCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLIHwgUkFfQklUTUFTSywgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0ssIDApOworCiswLjMyLDYuUlQsMTEuUkEsMTYuRDpEOjo6TG9hZCBXb3JkIGFuZCBaZXJvCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAyLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorCXVuc2lnbmVkX3dvcmQgYjsKKwl1bnNpZ25lZF93b3JkIEVBOworCWlmIChSQV9pc18wKSBiID0gMDsKKwllbHNlICAgICAgICAgYiA9ICpyQTsKKwlFQSA9IGIgKyBFWFRTKEQpOworCSpyVCA9IE1FTSh1bnNpZ25lZCwgRUEsIDQpOworCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSwgMCk7CisKKzAuMzEsNi5SVCwxMS5SQSwxNi5SQiwyMS4yMywzMS4vOlg6OjpMb2FkIFdvcmQgYW5kIFplcm8gSW5kZXhlZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMiwgIDAKKyo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKwl1bnNpZ25lZF93b3JkIGI7CisJdW5zaWduZWRfd29yZCBFQTsKKwlpZiAoUkFfaXNfMCkgYiA9IDA7CisJZWxzZSAgICAgICAgIGIgPSAqckE7CisJRUEgPSBiICsgKnJCOworCSpyVCA9IE1FTSh1bnNpZ25lZCwgRUEsIDQpOworCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIDApOworCiswLjMzLDYuUlQsMTEuUkEsMTYuRDpEOjo6TG9hZCBXb3JkIGFuZCBaZXJvIHdpdGggVXBkYXRlCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAyLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzAgfHwgUkEgPT0gUlQpCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCUVBID0gKnJBICsgRVhUUyhEKTsKKwkqclQgPSBNRU0odW5zaWduZWQsIEVBLCA0KTsKKwkqckEgPSBFQTsKKwlQUENfSU5TTl9JTlQoUlRfQklUTUFTSyB8IFJBX0JJVE1BU0ssIFJBX0JJVE1BU0ssIDApOworCiswLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuNTUsMzEuLzpYOjo6TG9hZCBXb3JkIGFuZCBaZXJvIHdpdGggVXBkYXRlIEluZGV4ZWQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDIsICAwCisqNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisJdW5zaWduZWRfd29yZCBFQTsKKwlpZiAoUkFfaXNfMCB8fCBSQSA9PSBSVCkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJRUEgPSAqckEgKyAqckI7CisJKnJUID0gTUVNKHVuc2lnbmVkLCBFQSwgNCk7CisJKnJBID0gRUE7CisJUFBDX0lOU05fSU5UKFJUX0JJVE1BU0sgfCBSQV9CSVRNQVNLLCBSQV9CSVRNQVNLIHwgUkJfQklUTUFTSywgMCk7CisKKzAuNTgsNi5SVCwxMS5SQSwxNi5EUywzMC4yOkRTOjY0OjpMb2FkIFdvcmQgQWxnZWJyYWljCisjCXVuc2lnbmVkX3dvcmQgYjsKKyMJdW5zaWduZWRfd29yZCBFQTsKKyMJaWYgKFJBX2lzXzApIGIgPSAwOworIwllbHNlICAgICAgICAgYiA9ICpyQTsKKyMJRUEgPSBiICsgRVhUUyhEU18wYjAwKTsKKyMJKnJUID0gTUVNKHNpZ25lZCwgRUEsIDQpOworCiswLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuMzQxLDMxLi86WDo2NDo6TG9hZCBXb3JkIEFsZ2VicmFpYyBJbmRleGVkCisjCXVuc2lnbmVkX3dvcmQgYjsKKyMJdW5zaWduZWRfd29yZCBFQTsKKyMJaWYgKFJBX2lzXzApIGIgPSAwOworIwllbHNlICAgICAgICAgYiA9ICpyQTsKKyMJRUEgPSBiICsgKnJCOzsKKyMJKnJUID0gTUVNKHNpZ25lZCwgRUEsIDQpOworCiswLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuMzczLDMxLi86WDo2NDo6TG9hZCBXb3JkIEFsZ2VicmFpYyB3aXRoIFVwZGF0ZSBJbmRleGVkCisjCXVuc2lnbmVkX3dvcmQgRUE7CisjCWlmIChSQV9pc18wIHx8IFJBID09IFJUKQorIwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhCisjCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisjCUVBID0gKnJBICsgKnJCOworIwkqclQgPSBNRU0oc2lnbmVkLCBFQSwgNCk7CisjCSpyQSA9IEVBOworCiswLjU4LDYuUlQsMTEuUkEsMTYuRFMsMzAuMDpEUzo2NDo6TG9hZCBEb3VibGV3b3JkCisjCXVuc2lnbmVkX3dvcmQgYjsKKyMJdW5zaWduZWRfd29yZCBFQTsKKyMJaWYgKFJBX2lzXzApIGIgPSAwOworIwllbHNlICAgICAgICAgYiA9ICpyQTsKKyMJRUEgPSBiICsgRVhUUyhEU18wYjAwKTsKKyMJKnJUID0gTUVNKHVuc2lnbmVkLCBFQSwgOCk7CisKKzAuMzEsNi5SVCwxMS5SQSwxNi5SQiwyMS4yMSwzMS4vOlg6NjQ6OkxvYWQgRG91Ymxld29yZCBJbmRleGVkCisjCXVuc2lnbmVkX3dvcmQgYjsKKyMJdW5zaWduZWRfd29yZCBFQTsKKyMJaWYgKFJBX2lzXzApIGIgPSAwOworIwllbHNlICAgICAgICAgYiA9ICpyQTsKKyMJRUEgPSBiICsgKnJCOworIwkqclQgPSBNRU0odW5zaWduZWQsIEVBLCA4KTsKKworMC41OCw2LlJULDExLlJBLDE2LkRTLDMwLjE6RFM6NjQ6OkxvYWQgRG91Ymxld29yZCB3aXRoIFVwZGF0ZQorIwl1bnNpZ25lZF93b3JkIEVBOworIwlpZiAoUkFfaXNfMCB8fCBSQSA9PSBSVCkKKyMJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYQorIwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworIwlFQSA9ICpyQSArIEVYVFMoRFNfMGIwMCk7CisjCSpyVCA9IE1FTSh1bnNpZ25lZCwgRUEsIDgpOworIwkqckEgPSBFQTsKKworMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLjUzLDMxLi86RFM6NjQ6OkxvYWQgRG91Ymxld29yZCB3aXRoIFVwZGF0ZSBJbmRleGVkCisjCXVuc2lnbmVkX3dvcmQgRUE7CisjCWlmIChSQV9pc18wIHx8IFJBID09IFJUKQorIwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhCisjCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisjCUVBID0gKnJBICsgKnJCOworIwkqclQgPSBNRU0odW5zaWduZWQsIEVBLCA4KTsKKyMJKnJBID0gRUE7CisKKworCisjCisjIEkuMy4zLjMgRml4ZWQtUG9pbnQgU3RvcmUgSW5zdHJ1Y3Rpb25zCisjCisKKzAuMzgsNi5SUywxMS5SQSwxNi5EOkQ6OjpTdG9yZSBCeXRlCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgYjsKKwl1bnNpZ25lZF93b3JkIEVBOworCWlmIChSQV9pc18wKSBiID0gMDsKKwllbHNlICAgICAgICAgYiA9ICpyQTsKKwlFQSA9IGIgKyBFWFRTKEQpOworCVNUT1JFKEVBLCAxLCAqclMpOworCVBQQ19JTlNOX0lOVCgwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJTX0JJVE1BU0ssIDApOworCiswLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuMjE1LDMxLi86WDo6OlN0b3JlIEJ5dGUgSW5kZXhlZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKKwl1bnNpZ25lZF93b3JkIGI7CisJdW5zaWduZWRfd29yZCBFQTsKKwlpZiAoUkFfaXNfMCkgYiA9IDA7CisJZWxzZSAgICAgICAgIGIgPSAqckE7CisJRUEgPSBiICsgKnJCOworCVNUT1JFKEVBLCAxLCAqclMpOworCVBQQ19JTlNOX0lOVCgwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0sgfCBSU19CSVRNQVNLLCAwKTsKKworMC4zOSw2LlJTLDExLlJBLDE2LkQ6RDo6OlN0b3JlIEJ5dGUgd2l0aCBVcGRhdGUKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCisJdW5zaWduZWRfd29yZCBFQTsKKwlpZiAoUkFfaXNfMCkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJRUEgPSAqckEgKyBFWFRTKEQpOworCVNUT1JFKEVBLCAxLCAqclMpOworCSpyQSA9IEVBOworCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSQV9CSVRNQVNLIHwgUlNfQklUTUFTSywgMCk7CisKKzAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS4yNDcsMzEuLzpYOjo6U3RvcmUgQnl0ZSB3aXRoIFVwZGF0ZSBJbmRleGVkCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzApCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCUVBID0gKnJBICsgKnJCOworCVNUT1JFKEVBLCAxLCAqclMpOworCSpyQSA9IEVBOworCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSQV9CSVRNQVNLIHwgUkJfQklUTUFTSyB8IFJTX0JJVE1BU0ssIDApOworCiswLjQ0LDYuUlMsMTEuUkEsMTYuRDpEOjo6U3RvcmUgSGFsZiBXb3JkCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgYjsKKwl1bnNpZ25lZF93b3JkIEVBOworCWlmIChSQV9pc18wKSBiID0gMDsKKwllbHNlICAgICAgICAgYiA9ICpyQTsKKwlFQSA9IGIgKyBFWFRTKEQpOworCVNUT1JFKEVBLCAyLCAqclMpOworCVBQQ19JTlNOX0lOVCgwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJTX0JJVE1BU0ssIDApOworCiswLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuNDA3LDMxLi86WDo6OlN0b3JlIEhhbGYgV29yZCBJbmRleGVkCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgYjsKKwl1bnNpZ25lZF93b3JkIEVBOworCWlmIChSQV9pc18wKSBiID0gMDsKKwllbHNlICAgICAgICAgYiA9ICpyQTsKKwlFQSA9IGIgKyAqckI7CisJU1RPUkUoRUEsIDIsICpyUyk7CisJUFBDX0lOU05fSU5UKDAsIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSyB8IFJTX0JJVE1BU0ssIDApOworCiswLjQ1LDYuUlMsMTEuUkEsMTYuRDpEOjo6U3RvcmUgSGFsZiBXb3JkIHdpdGggVXBkYXRlCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzApCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCUVBID0gKnJBICsgRVhUUyhEKTsKKwlTVE9SRShFQSwgMiwgKnJTKTsKKwkqckEgPSBFQTsKKwlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUkFfQklUTUFTSyB8IFJTX0JJVE1BU0ssIDApOworCiswLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuNDM5LDMxLi86WDo6OlN0b3JlIEhhbGYgV29yZCB3aXRoIFVwZGF0ZSBJbmRleGVkCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzApCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCUVBID0gKnJBICsgKnJCOworCVNUT1JFKEVBLCAyLCAqclMpOworCSpyQSA9IEVBOworCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSQV9CSVRNQVNLIHwgUkJfQklUTUFTSyB8IFJTX0JJVE1BU0ssIDApOworCiswLjM2LDYuUlMsMTEuUkEsMTYuRDpEOjo6U3RvcmUgV29yZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKKwl1bnNpZ25lZF93b3JkIGI7CisJdW5zaWduZWRfd29yZCBFQTsKKwlpZiAoUkFfaXNfMCkgYiA9IDA7CisJZWxzZSAgICAgICAgIGIgPSAqckE7CisJRUEgPSBiICsgRVhUUyhEKTsKKwlTVE9SRShFQSwgNCwgKnJTKTsKKwlQUENfSU5TTl9JTlQoMCwgKFJBX0JJVE1BU0sgJiB+MSkgfCBSU19CSVRNQVNLLCAwKTsKKworMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjE1MSwzMS4vOlg6OjpTdG9yZSBXb3JkIEluZGV4ZWQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCisJdW5zaWduZWRfd29yZCBiOworCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzApIGIgPSAwOworCWVsc2UgICAgICAgICBiID0gKnJBOworCUVBID0gYiArICpyQjsKKwlTVE9SRShFQSwgNCwgKnJTKTsKKwlQUENfSU5TTl9JTlQoMCwgKFJBX0JJVE1BU0sgJiB+MSkgfCBSQl9CSVRNQVNLIHwgUlNfQklUTUFTSywgMCk7CisKKzAuMzcsNi5SUywxMS5SQSwxNi5EOkQ6OjpTdG9yZSBXb3JkIHdpdGggVXBkYXRlCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzApCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCUVBID0gKnJBICsgRVhUUyhEKTsKKwlTVE9SRShFQSwgNCwgKnJTKTsKKwkqckEgPSBFQTsKKwlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUkFfQklUTUFTSyB8IFJTX0JJVE1BU0ssIDApOworCiswLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuMTgzLDMxLi86WDo6OlN0b3JlIFdvcmQgd2l0aCBVcGRhdGUgSW5kZXhlZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKKwl1bnNpZ25lZF93b3JkIEVBOworCWlmIChSQV9pc18wKQorCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICBpbGxlZ2FsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKKwlFQSA9ICpyQSArICpyQjsKKwlTVE9SRShFQSwgNCwgKnJTKTsKKwkqckEgPSBFQTsKKwlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0sgfCBSU19CSVRNQVNLLCAwKTsKKworMC42Miw2LlJTLDExLlJBLDE2LkRTLDMwLjA6RFM6NjQ6OlN0b3JlIERvdWJsZXdvcmQKKyMJdW5zaWduZWRfd29yZCBiOworIwl1bnNpZ25lZF93b3JkIEVBOworIwlpZiAoUkFfaXNfMCkgYiA9IDA7CisjCWVsc2UgICAgICAgICBiID0gKnJBOworIwlFQSA9IGIgKyBFWFRTKERTXzBiMDApOworIwlTVE9SRShFQSwgOCwgKnJTKTsKKzAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS4xNDksMzEuLzpYOjY0OjpTdG9yZSBEb3VibGV3b3JkIEluZGV4ZWQKKyMJdW5zaWduZWRfd29yZCBiOworIwl1bnNpZ25lZF93b3JkIEVBOworIwlpZiAoUkFfaXNfMCkgYiA9IDA7CisjCWVsc2UgICAgICAgICBiID0gKnJBOworIwlFQSA9IGIgKyAqckI7CisjCVNUT1JFKEVBLCA4LCAqclMpOworMC42Miw2LlJTLDExLlJBLDE2LkRTLDMwLjE6RFM6NjQ6OlN0b3JlIERvdWJsZXdvcmQgd2l0aCBVcGRhdGUKKyMJdW5zaWduZWRfd29yZCBFQTsKKyMJaWYgKFJBX2lzXzApCisjCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEKKyMJICAgICAgICAgICAgICAgICAgICBpbGxlZ2FsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKKyMJRUEgPSAqckEgKyBFWFRTKERTXzBiMDApOworIwlTVE9SRShFQSwgOCwgKnJTKTsKKyMJKnJBID0gRUE7CiswLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuMTgxLDMxLi86WDo2NDo6U3RvcmUgRG91Ymxld29yZCB3aXRoIFVwZGF0ZSBJbmRleGVkCisjCXVuc2lnbmVkX3dvcmQgRUE7CisjCWlmIChSQV9pc18wKQorIwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhCisjCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisjCUVBID0gKnJBICsgKnJCOworIwlTVE9SRShFQSwgOCwgKnJTKTsKKyMJKnJBID0gRUE7CisKKworIworIyBJLjMuMy40IEZpeGVkLVBvaW50IExvYWQgYW5kIFN0b3JlIHdpdGggQnl0ZSBSZXZlcnNhbCBJbnN0cnVjdGlvbnMKKyMKKworMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLjc5MCwzMS4vOlg6OjpMb2FkIEhhbGZ3b3JkIEJ5dGUtUmV2ZXJzZSBJbmRleGVkCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgYjsKKwl1bnNpZ25lZF93b3JkIEVBOworCWlmIChSQV9pc18wKSBiID0gMDsKKwllbHNlICAgICAgICAgYiA9ICpyQTsKKwlFQSA9IGIgKyAqckI7CisJKnJUID0gU1dBUF8yKE1FTSh1bnNpZ25lZCwgRUEsIDIpKTsKKwlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgKFJBX0JJVE1BU0sgJiB+MSkgfCBSQl9CSVRNQVNLLCAwKTsKKworMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLjUzNCwzMS4vOlg6OjpMb2FkIFdvcmQgQnl0ZS1SZXZlcnNlIEluZGV4ZWQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCisJdW5zaWduZWRfd29yZCBiOworCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzApIGIgPSAwOworCWVsc2UgICAgICAgICBiID0gKnJBOworCUVBID0gYiArICpyQjsKKwkqclQgPSBTV0FQXzQoTUVNKHVuc2lnbmVkLCBFQSwgNCkpOworCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIDApOworCiswLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuOTE4LDMxLi86WDo6OlN0b3JlIEhhbGYgV29yZCBCeXRlLVJldmVyc2VkIEluZGV4ZWQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCisJdW5zaWduZWRfd29yZCBiOworCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzApIGIgPSAwOworCWVsc2UgICAgICAgICBiID0gKnJBOworCUVBID0gYiArICpyQjsKKwlTVE9SRShFQSwgMiwgU1dBUF8yKCpyUykpOworCVBQQ19JTlNOX0lOVCgwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0sgfCBSU19CSVRNQVNLLCAwKTsKKworMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjY2MiwzMS4vOlg6OjpTdG9yZSBXb3JkIEJ5dGUtUmV2ZXJzZWQgSW5kZXhlZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKKwl1bnNpZ25lZF93b3JkIGI7CisJdW5zaWduZWRfd29yZCBFQTsKKwlpZiAoUkFfaXNfMCkgYiA9IDA7CisJZWxzZSAgICAgICAgIGIgPSAqckE7CisJRUEgPSBiICsgKnJCOworCVNUT1JFKEVBLCA0LCBTV0FQXzQoKnJTKSk7CisJUFBDX0lOU05fSU5UKDAsIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSyB8IFJTX0JJVE1BU0ssIDApOworCisKKyMKKyMgSS4zLjMuNSBGaXhlZC1Qb2ludCBMb2FkIGFuZCBTdG9yZSBNdWx0aXBsZSBJbnN0cmN0aW9ucworIworCiswLjQ2LDYuUlQsMTEuUkEsMTYuRDpEOjo6TG9hZCBNdWx0aXBsZSBXb3JkCisJdW5zaWduZWRfd29yZCBFQTsKKwl1bnNpZ25lZF93b3JkIGI7CisJaW50IHI7CisJaWYgKFJBX2lzXzApIGIgPSAwOworCWVsc2UgICAgICAgICBiID0gKnJBOworCUVBID0gYiArIEVYVFMoRCk7CisJciA9IFJUOworCWlmIChSQSA+PSByKQorCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJaWYgKENVUlJFTlRfQUxJR05NRU5UID09IFNUUklDVF9BTElHTk1FTlQgfHwgKEVBICUgNCAhPSAwKSkKKwkgIGFsaWdubWVudF9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIEVBKTsKKwl3aGlsZSAociA8PSAzMSkgeworCSAgR1BSKHIpID0gTUVNKHVuc2lnbmVkLCBFQSwgNCk7CisJICByID0gciArIDE7CisJICBFQSA9IEVBICsgNDsKKwl9CisKKzAuNDcsNi5SUywxMS5SQSwxNi5EOkQ6OjpTdG9yZSBNdWx0aXBsZSBXb3JkCisJdW5zaWduZWRfd29yZCBFQTsKKwl1bnNpZ25lZF93b3JkIGI7CisJaW50IHI7CisJaWYgKFJBX2lzXzApIGIgPSAwOworCWVsc2UgICAgICAgICBiID0gKnJBOworCUVBID0gYiArIEVYVFMoRCk7CisJaWYgKENVUlJFTlRfQUxJR05NRU5UID09IFNUUklDVF9BTElHTk1FTlQKKwkgICAgfHwgKEVBICUgNCAhPSAwKSkKKwkgIGFsaWdubWVudF9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIEVBKTsKKwlyID0gUlM7CisJd2hpbGUgKHIgPD0gMzEpIHsKKwkgIFNUT1JFKEVBLCA0LCBHUFIocikpOworCSAgciA9IHIgKyAxOworCSAgRUEgPSBFQSArIDQ7CisJfQorCisKKyMKKyMgSS4zLjMuNiBGaXhlZC1Qb2ludCBNb3ZlIEFzc2lzdCBJbnN0cnVjdGlvbnMKKyMKKworMC4zMSw2LlJULDExLlJBLDE2Lk5CLDIxLjU5NywzMS4vOlg6OjpMb2FkIFN0cmluZyBXb3JkIEltbWVkaWF0ZQorCXVuc2lnbmVkX3dvcmQgRUE7CisJaW50IG47CisJaW50IHI7CisJaW50IGk7CisJaW50IG5yOworCWlmIChSQV9pc18wKSBFQSA9IDA7CisJZWxzZSAgICAgICAgIEVBID0gKnJBOworCWlmIChOQiA9PSAwKSBuID0gMzI7CisJZWxzZSAgICAgICAgIG4gPSBOQjsKKwlyID0gUlQgLSAxOworCWkgPSAzMjsKKwluciA9IChuICsgMykgLyA0OworCWlmICgoUlQgKyBuciA+PSAzMikKKwkgICAgPyAoUkEgPj0gUlQgfHwgUkEgPCAoUlQgKyBucikgJSAzMikKKwkgICAgOiAoUkEgPj0gUlQgJiYgUkEgPCBSVCArIG5yKSkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJaWYgKENVUlJFTlRfQUxJR05NRU5UID09IFNUUklDVF9BTElHTk1FTlQpCisJICBhbGlnbm1lbnRfaW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBFQSk7CisJd2hpbGUgKG4gPiAwKSB7CisJICBpZiAoaSA9PSAzMikgeworCSAgICByID0gKHIgKyAxKSAlIDMyOworCSAgICBHUFIocikgPSAwOworCSAgfQorCSAgR1BSKHIpIHw9IElOU0VSVEVEKE1FTSh1bnNpZ25lZCwgRUEsIDEpLCBpLCBpKzcpOworCSAgaWYgKGkgPT0gNjQpIGkgPSAzMjsKKwkgIEVBID0gRUEgKyAxOworCSAgbiA9IG4gLSAxOworCX0KKworMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLjUzMywzMS4vOlg6OjpMb2FkIFN0cmluZyBXb3JkIEluZGV4ZWQKKwl1bnNpZ25lZF93b3JkIEVBOworCXVuc2lnbmVkX3dvcmQgYjsKKwlpbnQgbjsKKwlpbnQgcjsKKwlpbnQgaTsKKwlpbnQgbnI7CisJaWYgKFJBX2lzXzApIGIgPSAwOworCWVsc2UgICAgICAgICBiID0gKnJBOworCUVBID0gYiArICpyQjsKKwluID0gRVhUUkFDVEVEMzIoWEVSLCAyNSwgMzEpOworCXIgPSBSVCAtIDE7CisJaSA9IDMyOworCW5yID0gKG4gKyAzKSAvIDQ7CisJaWYgKCgoUlQgKyBuID49IDMyKQorCSAgICAgPyAoKFJBID49IFJUIHx8IFJBIDwgKFJUICsgbikgJSAzMikKKwkgICAgICAgIHx8IChSQiA+PSBSVCB8fCBSQiA8IChSVCArIG4pICUgMzIpKQorCSAgICAgOiAoKFJBID49IFJUICYmIFJBIDwgUlQgKyBuKQorCSAgICAgICAgfHwgKFJCID49IFJUICYmIFJCIDwgUlQgKyBuKSkpCisJICAgIHx8IChSVCA9PSBSQSB8fCBSVCA9PSBSQikpCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICBpbGxlZ2FsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKKwlpZiAoQ1VSUkVOVF9BTElHTk1FTlQgPT0gU1RSSUNUX0FMSUdOTUVOVCkKKwkgIGFsaWdubWVudF9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIEVBKTsKKwl3aGlsZSAobiA+IDApIHsKKwkgIGlmIChpID09IDMyKSB7CisJICAgIHIgPSAociArIDEpICUgMzI7CisJICAgIEdQUihpKSA9IDA7CisJICB9CisJICBHUFIocikgfD0gSU5TRVJURUQoTUVNKHVuc2lnbmVkLCBFQSwgMSksIGksIGkrNyk7CisJICBpID0gaSArIDg7CisJICBpZiAoaSA9PSA2NCkgaSA9IDMyOworCSAgRUEgPSBFQSArIDE7CisJICBuID0gbiAtIDE7CisJfQorCiswLjMxLDYuUlMsMTEuUkEsMTYuTkIsMjEuNzI1LDMxLi86WDo6OlN0b3JlIFN0cmluZyBXb3JkIEltbWVkYXRlCisJdW5zaWduZWRfd29yZCBFQTsKKwlpbnQgbjsKKwlpbnQgcjsKKwlpbnQgaTsKKwlpZiAoUkFfaXNfMCkgRUEgPSAwOworCWVsc2UgICAgICAgICBFQSA9ICpyQTsKKwlpZiAoTkIgPT0gMCkgbiA9IDMyOworCWVsc2UgICAgICAgICBuID0gTkI7CisJciA9IFJTIC0gMTsKKwlpID0gMzI7CisJaWYgKENVUlJFTlRfQUxJR05NRU5UID09IFNUUklDVF9BTElHTk1FTlQpCisJICBhbGlnbm1lbnRfaW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBFQSk7CisJd2hpbGUgKG4gPiAwKSB7CisJICBpZiAoaSA9PSAzMikgciA9IChyICsgMSkgJSAzMjsKKwkgIFNUT1JFKEVBLCAxLCBFWFRSQUNURUQoR1BSKHIpLCBpLCBpKzcpKTsKKwkgIGkgPSBpICsgODsKKwkgIGlmIChpID09IDY0KSBpID0gMzI7CisJICBFQSA9IEVBICsgMTsKKwkgIG4gPSBuIC0gMTsKKwl9CisKKzAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS42NjEsMzEuLzpYOjo6U3RvcmUgU3RyaW5nIFdvcmQgSW5kZXhlZAorCXVuc2lnbmVkX3dvcmQgRUE7CisJdW5zaWduZWRfd29yZCBiOworCWludCBuOworCWludCByOworCWludCBpOworCWlmIChSQV9pc18wKSBiID0gMDsKKwllbHNlICAgICAgICAgYiA9ICpyQTsKKwlFQSA9IGIgKyAqckI7CisJaWYgKENVUlJFTlRfQUxJR05NRU5UID09IFNUUklDVF9BTElHTk1FTlQpCisJICBhbGlnbm1lbnRfaW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBFQSk7CisJbiA9IEVYVFJBQ1RFRDMyKFhFUiwgMjUsIDMxKTsKKwlyID0gUlMgLSAxOworCWkgPSAzMjsKKwl3aGlsZSAobiA+IDApIHsKKwkgIGlmIChpID09IDMyKSByID0gKHIgKyAxKSAlIDMyOworCSAgU1RPUkUoRUEsIDEsIEVYVFJBQ1RFRChHUFIociksIGksIGkrNykpOworCSAgaSA9IGkgKyA4OworCSAgaWYgKGkgPT0gNjQpIGkgPSAzMjsKKwkgIEVBID0gRUEgKyAxOworCSAgbiA9IG4gLSAxOworCX0KKworCisjCisjIEkuMy4zLjcgU3RvcmFnZSBTeW5jaHJvbml6YXRpb24gSW5zdHJ1Y3Rpb25zCisjCisjIEhBQ0s6IFJhdGhlciB0aGFuIG1vbml0b3IgYWRkcmVzc2VzIGxvb2tpbmcgZm9yIGEgcmVhc29uCisjICAgICAgIHRvIGNhbmNlbCBhIHJlc2VydmF0aW9uLiAgVGhpcyBjb2RlIGluc3RlYWQga2VlcHMKKyMJYSBjb3B5IG9mIHRoZSBkYXRhIHJlYWQgZnJvbSBtZW1vcnkuICBCZWZvcmUgcGVyZm9ybWluZworIwlhIHN0b3JlLCB0aGUgbWVtb3J5IGFyZWEgaXMgY2hlY2tlZCB0byBzZWUgaWYgaXQgaGFzCisjCWJlZW4gY2hhbmdlZC4KKzAuMzEsNi5SVCwxMS5SQSwxNi5SQiwyMS4yMCwzMS4vOlg6OjpMb2FkIFdvcmQgQW5kIFJlc2VydmUgSW5kZXhlZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAyLCAgMiwgIDAKKyo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9JVSwgICAgMSwgIDIsICAwCisqNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfSVUsICAgIDEsICAyLCAgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKKwl1bnNpZ25lZF93b3JkIGI7CisJdW5zaWduZWRfd29yZCBFQTsKKwlpZiAoUkFfaXNfMCkgYiA9IDA7CisJZWxzZSAgICAgICAgIGIgPSAqckE7CisJRUEgPSBiICsgKnJCOworCVJFU0VSVkUgPSAxOworCVJFU0VSVkVfQUREUiA9IHJlYWxfYWRkcihFQSwgMS8qaXMtcmVhZD8qLyk7CisJUkVTRVJWRV9EQVRBID0gTUVNKHVuc2lnbmVkLCBFQSwgNCk7CisJKnJUID0gUkVTRVJWRV9EQVRBOworCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIDApOworCiswLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuODQsMzEuLzpYOjY0OjpMb2FkIERvdWJsZXdvcmQgQW5kIFJlc2VydmUgSW5kZXhlZAorCXVuc2lnbmVkX3dvcmQgYjsKKwl1bnNpZ25lZF93b3JkIEVBOworCWlmIChSQV9pc18wKSBiID0gMDsKKwllbHNlICAgICAgICAgYiA9ICpyQTsKKwlFQSA9IGIgKyAqckI7CisJUkVTRVJWRSA9IDE7CisJUkVTRVJWRV9BRERSID0gcmVhbF9hZGRyKEVBLCAxLyppcy1yZWFkPyovKTsKKwlSRVNFUlZFX0RBVEEgPSBNRU0odW5zaWduZWQsIEVBLCA4KTsKKwkqclQgPSBSRVNFUlZFX0RBVEE7CisJUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSywgMCk7CisKKzAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS4xNTAsMzEuMTpYOjo6U3RvcmUgV29yZCBDb25kaXRpb25hbCBJbmRleGVkCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICA4LCAgOCwgIDAKKyo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgOCwgIDgsICAwCisqNjA0OiBQUENfVU5JVF9CUFUsICAgUFBDX1VOSVRfQlBVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgYjsKKwl1bnNpZ25lZF93b3JkIEVBOworCWlmIChSQV9pc18wKSBiID0gMDsKKwllbHNlICAgICAgICAgYiA9ICpyQTsKKwlFQSA9IGIgKyAqckI7CisJaWYgKFJFU0VSVkUpIHsKKwkgIGlmIChSRVNFUlZFX0FERFIgPT0gcmVhbF9hZGRyKEVBLCAwLyppcy1yZWFkPyovKQorCSAgICAgICYmIC8qSEFDSyovIFJFU0VSVkVfREFUQSA9PSBNRU0odW5zaWduZWQsIEVBLCA0KSkgeworCSAgICBTVE9SRShFQSwgNCwgKnJTKTsKKwkgICAgQ1JfU0VUX1hFUl9TTygwLCBjcl9pX3plcm8pOworCSAgfQorCSAgZWxzZSB7CisJICAgIC8qIG1lbnQgdG8gcmFuZG9tbHkgdG8gc3RvcmUsIHdlIG5ldmVyIGRvISAqLwkKKwkgICAgQ1JfU0VUX1hFUl9TTygwLCAwKTsKKwkgIH0KKwkgIFJFU0VSVkUgPSAwOworCX0KKwllbHNlIHsKKwkgIENSX1NFVF9YRVJfU08oMCwgMCk7CisJfQorCVBQQ19JTlNOX0lOVCgwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0sgfCBSU19CSVRNQVNLLCAxLypSYyovKTsKKworMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjIxNCwzMS4xOlg6NjQ6OlN0b3JlIERvdWJsZXdvcmQgQ29uZGl0aW9uYWwgSW5kZXhlZAorCXVuc2lnbmVkX3dvcmQgYjsKKwl1bnNpZ25lZF93b3JkIEVBOworCWlmIChSQV9pc18wKSBiID0gMDsKKwllbHNlICAgICAgICAgYiA9ICpyQTsKKwlFQSA9IGIgKyAqckI7CisJaWYgKFJFU0VSVkUpIHsKKwkgIGlmIChSRVNFUlZFX0FERFIgPT0gcmVhbF9hZGRyKEVBLCAwLyppcy1yZWFkPyovKQorCSAgICAgICYmIC8qSEFDSyovIFJFU0VSVkVfREFUQSA9PSBNRU0odW5zaWduZWQsIEVBLCA4KSkgeworCSAgICBTVE9SRShFQSwgOCwgKnJTKTsKKwkgICAgQ1JfU0VUX1hFUl9TTygwLCBjcl9pX3plcm8pOworCSAgfQorCSAgZWxzZSB7CisJICAgIC8qIG1lbnQgdG8gcmFuZG9tbHkgdG8gc3RvcmUsIHdlIG5ldmVyIGRvICovCQorCSAgICBDUl9TRVRfWEVSX1NPKDAsIDApOworCSAgfQorCSAgUkVTRVJWRSA9IDA7CisJfQorCWVsc2UgeworCSAgQ1JfU0VUX1hFUl9TTygwLCAwKTsKKwl9CisJUFBDX0lOU05fSU5UKDAsIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSyB8IFJTX0JJVE1BU0ssIDEvKlJjKi8pOworCiswLjMxLDYuLywxMS4vLDE2Li8sMjEuNTk4LDMxLi86WDo6c3luYzpTeW5jaHJvbml6ZQorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMSwgIDAKKwkvKiBkbyBub3RoaW5nICovCisKKworIworIyBJLjMuMy45IEZpeGVkLVBvaW50IEFyaXRobWV0aWMgSW5zdHJ1Y3Rpb25zCisjCisKKzAuMTQsNi5SVCwxMS5SQSwxNi5TSTpEOjo6QWRkIEltbWVkaWF0ZQorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKKwlpZiAoUkFfaXNfMCkJKnJUID0gRVhUUyhTSSk7CisJZWxzZQkJKnJUID0gKnJBICsgRVhUUyhTSSk7CisJSVRSQUNFKHRyYWNlX2FsdSwgKCIgUmVzdWx0ID0gJWxkICgweCVseClcbiIsIChsb25nKSpyVCwgKGxvbmcpKnJUKSk7CisJUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIChSQV9CSVRNQVNLICYgfjEpLCAwKTsKKworMC4xNSw2LlJULDExLlJBLDE2LlNJOkQ6OjpBZGQgSW1tZWRpYXRlIFNoaWZ0ZWQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCisJaWYgKFJBX2lzXzApCSpyVCA9IEVYVFMoU0kpIDw8IDE2OworCWVsc2UJCSpyVCA9ICpyQSArIChFWFRTKFNJKSA8PCAxNik7CisJSVRSQUNFKHRyYWNlX2FsdSwgKCIgUmVzdWx0ID0gJWxkICgweCVseClcbiIsIChsb25nKSpyVCwgKGxvbmcpKnJUKSk7CisJUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIChSQV9CSVRNQVNLICYgfjEpLCAwKTsKKworMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLk9FLDIyLjI2NiwzMS5SYzpYTzo6OkFkZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKKwlBTFVfQkVHSU4oKnJBKTsKKwlBTFVfQUREKCpyQik7CisJQUxVX0VORCgqclQsIDAvKkNBKi8sIE9FLCBSYyk7CisJUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIFJBX0JJVE1BU0sgfCBSQl9CSVRNQVNLLCBSYyk7CisKKzAuMzEsNi5SVCwxMS5SQSwxNi5SQiwyMS5PRSwyMi40MCwzMS5SYzpYTzo6OlN1YnRyYWN0IEZyb20KKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCisJQUxVX0JFR0lOKCpyQSk7CisJQUxVX05PVDsKKwlBTFVfQUREKCpyQik7CisJQUxVX0FERCgxKTsKKwlBTFVfRU5EKCpyVCwgMC8qQ0EqLywgT0UsIFJjKTsKKwlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0ssIFJjKTsKKworMC4xMiw2LlJULDExLlJBLDE2LlNJOkQ6OjpBZGQgSW1tZWRpYXRlIENhcnJ5aW5nCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCUFMVV9CRUdJTigqckEpOworCUFMVV9BREQoRVhUUyhTSSkpOworCUFMVV9FTkQoKnJULCAxLypDQSovLCAwLypPRSovLCAwLypSYyovKTsKKwlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgUkFfQklUTUFTSywgMC8qUmMqLyk7CisKKzAuMTMsNi5SVCwxMS5SQSwxNi5TSTpEOjo6QWRkIEltbWVkaWF0ZSBDYXJyeWluZyBhbmQgUmVjb3JkCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCUFMVV9CRUdJTigqckEpOworCUFMVV9BREQoRVhUUyhTSSkpOworCUFMVV9FTkQoKnJULCAxLypDQSovLCAwLypPRSovLCAxLypSYyovKTsKKwlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgUkFfQklUTUFTSywgMS8qUmMqLyk7CisKKzAuOCw2LlJULDExLlJBLDE2LlNJOkQ6OjpTdWJ0cmFjdCBGcm9tIEltbWVkaWF0ZSBDYXJyeWluZworKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKKwlBTFVfQkVHSU4oKnJBKTsKKwlBTFVfTk9UOworCUFMVV9BREQoRVhUUyhTSSkpOworCUFMVV9BREQoMSk7CisJQUxVX0VORCgqclQsIDEvKkNBKi8sIDAvKk9FKi8sIDAvKlJjKi8pOworCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCBSQV9CSVRNQVNLLCAwLypSYyovKTsKKworMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLk9FLDIyLjEwLDMxLlJjOlhPOjo6QWRkIENhcnJ5aW5nCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCUFMVV9CRUdJTigqckEpOworCUFMVV9BREQoKnJCKTsKKwlBTFVfRU5EKCpyVCwgMS8qQ0EqLywgT0UsIFJjKTsKKwlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0ssIFJjKTsKKworMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLk9FLDIyLjgsMzEuUmM6WE86OjpTdWJ0cmFjdCBGcm9tIENhcnJ5aW5nCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCS8qIFJUIDwtIH5SQSArIFJCICsgMSA9PT0gUlQgPC0gUkIgLSBSQSAqLworCUFMVV9CRUdJTigqckEpOworCUFMVV9OT1Q7CisJQUxVX0FERCgqckIpOworCUFMVV9BREQoMSk7CisJQUxVX0VORCgqclQsIDEvKkNBKi8sIE9FLCBSYyk7CisJUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIFJBX0JJVE1BU0sgfCBSQl9CSVRNQVNLLCBSYyk7CisKKzAuMzEsNi5SVCwxMS5SQSwxNi5SQiwyMS5PRSwyMi4xMzgsMzEuUmM6WE86OjpBZGQgRXh0ZW5kZWQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCisJQUxVX0JFR0lOKCpyQSk7CisJQUxVX0FERCgqckIpOworCUFMVV9BRERfQ0E7CisJQUxVX0VORCgqclQsIDEvKkNBKi8sIE9FLCBSYyk7CisJUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIFJBX0JJVE1BU0sgfCBSQl9CSVRNQVNLLCBSYyk7CisKKzAuMzEsNi5SVCwxMS5SQSwxNi5SQiwyMS5PRSwyMi4xMzYsMzEuUmM6WE86OjpTdWJ0cmFjdCBGcm9tIEV4dGVuZGVkCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCUFMVV9CRUdJTigqckEpOworCUFMVV9OT1Q7CisJQUxVX0FERCgqckIpOworCUFMVV9BRERfQ0E7CisJQUxVX0VORCgqclQsIDEvKkNBKi8sIE9FLCBSYyk7CisJUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIFJBX0JJVE1BU0sgfCBSQl9CSVRNQVNLLCBSYyk7CisKKzAuMzEsNi5SVCwxMS5SQSwxNi4vLDIxLk9FLDIyLjIzNCwzMS5SYzpYTzo6OkFkZCB0byBNaW51cyBPbmUgRXh0ZW5kZWQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCisJQUxVX0JFR0lOKCpyQSk7CisJQUxVX0FERF9DQTsKKwlBTFVfQUREKC0xKTsKKwlBTFVfRU5EKCpyVCwgMS8qQ0EqLywgT0UsIFJjKTsKKwlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgUkFfQklUTUFTSywgUmMpOworCiswLjMxLDYuUlQsMTEuUkEsMTYuLywyMS5PRSwyMi4yMzIsMzEuUmM6WE86OjpTdWJ0cmFjdCBGcm9tIE1pbnVzIE9uZSBFeHRlbmRlZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKKwlBTFVfQkVHSU4oKnJBKTsKKwlBTFVfTk9UOworCUFMVV9BRERfQ0E7CisJQUxVX0FERCgtMSk7CisJQUxVX0VORCgqclQsIDEvKkNBKi8sIE9FLCBSYyk7CisJUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIFJBX0JJVE1BU0ssIFJjKTsKKworMC4zMSw2LlJULDExLlJBLDE2Li8sMjEuT0UsMjIuMjAyLDMxLlJjOlhPOjphZGR6ZTpBZGQgdG8gWmVybyBFeHRlbmRlZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKKwlBTFVfQkVHSU4oKnJBKTsKKwlBTFVfQUREX0NBOworCUFMVV9FTkQoKnJULCAxLypDQSovLCBPRSwgUmMpOworCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCBSQV9CSVRNQVNLLCBSYyk7CisKKzAuMzEsNi5SVCwxMS5SQSwxNi4vLDIxLk9FLDIyLjIwMCwzMS5SYzpYTzo6OlN1YnRyYWN0IGZyb20gWmVybyBFeHRlbmRlZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKKwlBTFVfQkVHSU4oKnJBKTsKKwlBTFVfTk9UOworCUFMVV9BRERfQ0E7CisJQUxVX0VORCgqclQsIDEvKkNBKi8sIE9FLCBSYyk7CisJUFBDX0lOU05fSU5UKFJUX0JJVE1BU0ssIFJBX0JJVE1BU0ssIFJjKTsKKworMC4zMSw2LlJULDExLlJBLDE2Li8sMjEuT0UsMjIuMTA0LDMxLlJjOlhPOjo6TmVnYXRlCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCUFMVV9CRUdJTigqckEpOworCUFMVV9OT1Q7CisJQUxVX0FERCgxKTsKKwlBTFVfRU5EKCpyVCwwLypDQSovLE9FLFJjKTsKKwlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgUkFfQklUTUFTSywgUmMpOworCiswLjcsNi5SVCwxMS5SQSwxNi5TSTpEOjptdWxsaTpNdWx0aXBseSBMb3cgSW1tZWRpYXRlCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDUsICA1LCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAzLCAgMywgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMywgIDMsICAwCisqNjA0OiBQUENfVU5JVF9NQ0lVLCAgUFBDX1VOSVRfTUNJVSwgIDMsICAzLCAgMAorCXNpZ25lZF93b3JkIHByb2QgPSAqckEgKiBFWFRTKFNJKTsKKwkqclQgPSBwcm9kOworCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCBSQV9CSVRNQVNLLCAwLypSYyovKTsKKworMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLk9FLDIyLjIzMywzMS5SYzpEOjY0OjpNdWx0aXBseSBMb3cgRG91Ymxld29yZAorCiswLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuT0UsMjIuMjM1LDMxLlJjOlhPOjptdWxsdzpNdWx0aXBseSBMb3cgV29yZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICA1LCAgNSwgIDAKKyo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgNSwgIDUsICAwCisqNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDUsICA1LCAgMAorKjYwNDogUFBDX1VOSVRfTUNJVSwgIFBQQ19VTklUX01DSVUsICA0LCAgNCwgIDAKKwlzaWduZWQ2NCBhID0gKHNpZ25lZDMyKSgqckEpOworCXNpZ25lZDY0IGIgPSAoc2lnbmVkMzIpKCpyQik7CisJc2lnbmVkNjQgcHJvZCA9IGEgKiBiOworCXNpZ25lZF93b3JkIHQgPSBwcm9kOworCSpyVCA9ICpyQSAqICpyQjsKKwlpZiAodCAhPSBwcm9kICYmIE9FKQorCSAgWEVSIHw9ICh4ZXJfb3ZlcmZsb3cgfCB4ZXJfc3VtbWFyeV9vdmVyZmxvdyk7CisJQ1IwX0NPTVBBUkUodCwgMCwgUmMpOworCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCBSQV9CSVRNQVNLIHwgUkJfQklUTUFTSywgUmMpOworCiswLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuLywyMi43MywzMS5SYzpYTzo2NDo6TXVsdGlwbHkgSGlnaCBEb3VibGV3b3JkCisKKzAuMzEsNi5SVCwxMS5SQSwxNi5SQiwyMS4vLDIyLjc1LDMxLlJjOlhPOjptdWxodzpNdWx0aXBseSBIaWdoIFdvcmQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgNSwgIDUsICAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDUsICA1LCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICA1LCAgNSwgIDAKKyo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgNCwgIDQsICAwCisJc2lnbmVkNjQgYSA9IChzaWduZWQzMikoKnJBKTsKKwlzaWduZWQ2NCBiID0gKHNpZ25lZDMyKSgqckIpOworCXNpZ25lZDY0IHByb2QgPSBhICogYjsKKwlzaWduZWRfd29yZCB0ID0gRVhUUkFDVEVENjQocHJvZCwgMCwgMzEpOworCSpyVCA9IHQ7CisJQ1IwX0NPTVBBUkUodCwgMCwgUmMpOworCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCBSQV9CSVRNQVNLIHwgUkJfQklUTUFTSywgUmMpOworCiswLjMxLDYuUlQsMTEuUkEsMTYuUkIsMjEuLywyMi45LDMxLlJjOlhPOjY0OjpNdWx0aXBseSBIaWdoIERvdWJsZXdvcmQgVW5zaWduZWQKKworMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLi8sMjIuMTEsMzEuUmM6WE86Om11bGh3dTpNdWx0aXBseSBIaWdoIFdvcmQgVW5zaWduZWQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMTAsIDEwLCAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDYsICA2LCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICA2LCAgNiwgIDAKKyo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgNCwgIDQsICAwCisJdW5zaWduZWQ2NCBhID0gKHVuc2lnbmVkMzIpKCpyQSk7CisJdW5zaWduZWQ2NCBiID0gKHVuc2lnbmVkMzIpKCpyQik7CisJdW5zaWduZWQ2NCBwcm9kID0gYSAqIGI7CisJc2lnbmVkX3dvcmQgdCA9IEVYVFJBQ1RFRDY0KHByb2QsIDAsIDMxKTsKKwkqclQgPSB0OworCUNSMF9DT01QQVJFKHQsIDAsIFJjKTsKKwlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0ssIFJjKTsKKworMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLk9FLDIyLjQ4OSwzMS5SYzpYTzo2NDo6RGl2aWRlIERvdWJsZXdvcmQKKworMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLk9FLDIyLjQ5MSwzMS5SYzpYTzo6ZGl2dzpEaXZpZGUgV29yZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAzNiwgMzYsIDAKKyo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMzcsIDM3LCAwCisqNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDM3LCAzNywgMAorKjYwNDogUFBDX1VOSVRfTUNJVSwgIFBQQ19VTklUX01DSVUsICAyMCwgMjAsIDAKKwlzaWduZWQ2NCBkaXZpZGVuZCA9IChzaWduZWQzMikoKnJBKTsKKwlzaWduZWQ2NCBkaXZpc29yID0gKHNpZ25lZDMyKSgqckIpOworCWlmIChkaXZpc29yID09IDAgLyogbmIgMHg4MDAwLi4wIGlzIHNpZ24gZXh0ZW5kZWQgKi8KKwkgICAgfHwgKGRpdmlkZW5kID09IDB4ODAwMDAwMDAgJiYgZGl2aXNvciA9PSAtMSkpIHsKKwkgIGlmIChPRSkKKwkgICAgWEVSIHw9ICh4ZXJfb3ZlcmZsb3cgfCB4ZXJfc3VtbWFyeV9vdmVyZmxvdyk7CisJICBDUjBfQ09NUEFSRSgwLCAwLCBSYyk7CisJfQorCWVsc2UgeworCSAgc2lnbmVkNjQgcXVvdGVudCA9IGRpdmlkZW5kIC8gZGl2aXNvcjsKKwkgICpyVCA9IHF1b3RlbnQ7CisJICBDUjBfQ09NUEFSRSgoc2lnbmVkX3dvcmQpcXVvdGVudCwgMCwgUmMpOworCX0KKwlQUENfSU5TTl9JTlQoUlRfQklUTUFTSywgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0ssIFJjKTsKKworMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLk9FLDIyLjQ1NywzMS5SYzpYTzo2NDo6RGl2aWRlIERvdWJsZXdvcmQgVW5zaWduZWQKKworMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLk9FLDIyLjQ1OSwzMS5SYzpYTzo6ZGl2d3U6RGl2aWRlIFdvcmQgVW5zaWduZWQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMzYsIDM2LCAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDM3LCAzNywgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAzNywgMzcsIDAKKyo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgMjAsIDIwLCAwCisJdW5zaWduZWQ2NCBkaXZpZGVuZCA9ICh1bnNpZ25lZDMyKSgqckEpOworCXVuc2lnbmVkNjQgZGl2aXNvciA9ICh1bnNpZ25lZDMyKSgqckIpOworCWlmIChkaXZpc29yID09IDApIHsKKwkgIGlmIChPRSkKKwkgICAgWEVSIHw9ICh4ZXJfb3ZlcmZsb3cgfCB4ZXJfc3VtbWFyeV9vdmVyZmxvdyk7CisJICBDUjBfQ09NUEFSRSgwLCAwLCBSYyk7CisJfQorCWVsc2UgeworCSAgdW5zaWduZWQ2NCBxdW90ZW50ID0gZGl2aWRlbmQgLyBkaXZpc29yOworCSAgKnJUID0gcXVvdGVudDsKKwkgIENSMF9DT01QQVJFKChzaWduZWRfd29yZClxdW90ZW50LCAwLCBSYyk7CisJfQorCVBQQ19JTlNOX0lOVChSVF9CSVRNQVNLLCBSQV9CSVRNQVNLIHwgUkJfQklUTUFTSywgUmMpOworCisKKyMKKyMgSS4zLjMuMTAgRml4ZWQtUG9pbnQgQ29tcGFyZSBJbnN0cnVjdGlvbnMKKyMKKworMC4xMSw2LkJGLDkuLywxMC5MLDExLlJBLDE2LlNJOkQ6OjpDb21wYXJlIEltbWVkaWF0ZQorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKKwlpZiAoIWlzXzY0Yml0X21vZGUgJiYgTCkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJZWxzZSB7CisJICBzaWduZWRfd29yZCBhOworCSAgc2lnbmVkX3dvcmQgYiA9IEVYVFMoU0kpOworCSAgaWYgKEwgPT0gMCkKKwkgICAgYSA9IEVYVEVOREVEKCpyQSk7CisJICBlbHNlCisJICAgIGEgPSAqckE7CisJICBDUl9DT01QQVJFKEJGLCBhLCBiKTsKKwl9CisJUFBDX0lOU05fSU5UX0NSKDAsIFJBX0JJVE1BU0ssIEJGX0JJVE1BU0spOworCiswLjMxLDYuQkYsOS4vLDEwLkwsMTEuUkEsMTYuUkIsMjEuMCwzMS4vOlg6OjpDb21wYXJlCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCWlmICghaXNfNjRiaXRfbW9kZSAmJiBMKQorCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICBpbGxlZ2FsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKKwllbHNlIHsKKwkgIHNpZ25lZF93b3JkIGE7CisJICBzaWduZWRfd29yZCBiOworCSAgaWYgKEwgPT0gMCkgeworCSAgICBhID0gRVhURU5ERUQoKnJBKTsKKwkgICAgYiA9IEVYVEVOREVEKCpyQik7CisJICB9CisJICBlbHNlIHsKKwkgICAgYSA9ICpyQTsKKwkgICAgYiA9ICpyQjsKKwkgIH0KKwkgIENSX0NPTVBBUkUoQkYsIGEsIGIpOworCX0KKwlQUENfSU5TTl9JTlRfQ1IoMCwgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0ssIEJGX0JJVE1BU0spOworCiswLjEwLDYuQkYsOS4vLDEwLkwsMTEuUkEsMTYuVUk6RDo6OkNvbXBhcmUgTG9naWNhbCBJbW1lZGlhdGUKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCisJaWYgKCFpc182NGJpdF9tb2RlICYmIEwpCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCWVsc2UgeworCSAgdW5zaWduZWRfd29yZCBhOworCSAgdW5zaWduZWRfd29yZCBiID0gVUk7CisJICBpZiAoTCA9PSAwKQorCSAgICBhID0gTUFTS0VEKCpyQSwgMzIsIDYzKTsKKwkgIGVsc2UKKwkgICAgYSA9ICpyQTsKKwkgIENSX0NPTVBBUkUoQkYsIGEsIGIpOworCX0KKwlQUENfSU5TTl9JTlRfQ1IoMCwgUkFfQklUTUFTSywgQkZfQklUTUFTSyk7CisKKzAuMzEsNi5CRiw5Li8sMTAuTCwxMS5SQSwxNi5SQiwyMS4zMiwzMS4vOlg6OjpDb21wYXJlIExvZ2ljYWwKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCisJaWYgKCFpc182NGJpdF9tb2RlICYmIEwpCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCWVsc2UgeworCSAgdW5zaWduZWRfd29yZCBhOworCSAgdW5zaWduZWRfd29yZCBiOworCSAgaWYgKEwgPT0gMCkgeworCSAgICBhID0gTUFTS0VEKCpyQSwgMzIsIDYzKTsKKwkgICAgYiA9IE1BU0tFRCgqckIsIDMyLCA2Myk7CisJICB9CisJICBlbHNlIHsKKwkgICAgYSA9ICpyQTsKKwkgICAgYiA9ICpyQjsKKwkgIH0KKwkgIENSX0NPTVBBUkUoQkYsIGEsIGIpOworCX0KKwlQUENfSU5TTl9JTlRfQ1IoMCwgUkFfQklUTUFTSyB8IFJCX0JJVE1BU0ssIEJGX0JJVE1BU0spOworCisKKyMKKyMgSS4zLjMuMTEgRml4ZWQtUG9pbnQgVHJhcCBJbnN0cnVjdGlvbnMKKyMKKworMC4yLDYuVE8sMTEuUkEsMTYuU0k6RDo2NDo6VHJhcCBEb3VibGV3b3JkIEltbWVkaWF0ZQorCWlmICghaXNfNjRiaXRfbW9kZSkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJZWxzZSB7CisJICBzaWduZWRfd29yZCBhID0gKnJBOworCSAgc2lnbmVkX3dvcmQgYiA9IEVYVFMoU0kpOworCSAgaWYgKChhIDwgYiAmJiBUT3swfSkKKwkgICAgICB8fCAoYSA+IGIgJiYgVE97MX0pCisJICAgICAgfHwgKGEgPT0gYiAmJiBUT3syfSkKKwkgICAgICB8fCAoKHVuc2lnbmVkX3dvcmQpYSA8ICh1bnNpZ25lZF93b3JkKWIgJiYgVE97M30pCisJICAgICAgfHwgKCh1bnNpZ25lZF93b3JkKWEgPiAodW5zaWduZWRfd29yZCliICYmIFRPezR9KQorCSAgICAgICkKKwkgICAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICAgIHRyYXBfcHJvZ3JhbV9pbnRlcnJ1cHQpOworCX0KKworMC4zLDYuVE8sMTEuUkEsMTYuU0k6RDo6OlRyYXAgV29yZCBJbW1lZGlhdGUKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDIsICAyLCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAyLCAgMiwgIDAKKyo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCisJc2lnbmVkX3dvcmQgYSA9IEVYVEVOREVEKCpyQSk7CisJc2lnbmVkX3dvcmQgYiA9IEVYVFMoU0kpOworCWlmICgoYSA8IGIgJiYgVE97MH0pCisJICAgIHx8IChhID4gYiAmJiBUT3sxfSkKKwkgICAgfHwgKGEgPT0gYiAmJiBUT3syfSkKKwkgICAgfHwgKCh1bnNpZ25lZF93b3JkKWEgPCAodW5zaWduZWRfd29yZCliICYmIFRPezN9KQorCSAgICB8fCAoKHVuc2lnbmVkX3dvcmQpYSA+ICh1bnNpZ25lZF93b3JkKWIgJiYgVE97NH0pCisJICAgICkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgdHJhcF9wcm9ncmFtX2ludGVycnVwdCk7CisKKzAuMzEsNi5UTywxMS5SQSwxNi5SQiwyMS42OCwzMS4vOlg6NjQ6OlRyYXAgRG91Ymxld29yZAorCWlmICghaXNfNjRiaXRfbW9kZSkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgaWxsZWdhbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJZWxzZSB7CisJICBzaWduZWRfd29yZCBhID0gKnJBOworCSAgc2lnbmVkX3dvcmQgYiA9ICpyQjsKKwkgIGlmICgoYSA8IGIgJiYgVE97MH0pCisJICAgICAgfHwgKGEgPiBiICYmIFRPezF9KQorCSAgICAgIHx8IChhID09IGIgJiYgVE97Mn0pCisJICAgICAgfHwgKCh1bnNpZ25lZF93b3JkKWEgPCAodW5zaWduZWRfd29yZCliICYmIFRPezN9KQorCSAgICAgIHx8ICgodW5zaWduZWRfd29yZClhID4gKHVuc2lnbmVkX3dvcmQpYiAmJiBUT3s0fSkKKwkgICAgICApCisJICAgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICB0cmFwX3Byb2dyYW1faW50ZXJydXB0KTsKKwl9CisKKzAuMzEsNi5UTywxMS5SQSwxNi5SQiwyMS40LDMxLi86WDo6OlRyYXAgV29yZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMiwgIDIsICAwCisqNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDIsICAyLCAgMAorKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKKwlzaWduZWRfd29yZCBhID0gRVhURU5ERUQoKnJBKTsKKwlzaWduZWRfd29yZCBiID0gRVhURU5ERUQoKnJCKTsKKwlpZiAoVE8gPT0gMTIgJiYgckEgPT0gckIpIHsKKwkgIElUUkFDRSh0cmFjZV9icmVha3BvaW50LCAoImJyZWFrcG9pbnRcbiIpKTsKKwkgIGNwdV9oYWx0KHByb2Nlc3NvciwgY2lhLCB3YXNfdHJhcCwgMCk7CisJfQorCWVsc2UgaWYgKChhIDwgYiAmJiBUT3swfSkKKwkgICAgfHwgKGEgPiBiICYmIFRPezF9KQorCSAgICB8fCAoYSA9PSBiICYmIFRPezJ9KQorCSAgICB8fCAoKHVuc2lnbmVkX3dvcmQpYSA8ICh1bnNpZ25lZF93b3JkKWIgJiYgVE97M30pCisJICAgIHx8ICgodW5zaWduZWRfd29yZClhID4gKHVuc2lnbmVkX3dvcmQpYiAmJiBUT3s0fSkKKwkgICAgKQorCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICB0cmFwX3Byb2dyYW1faW50ZXJydXB0KTsKKworIworIyBJLjMuMy4xMiBGaXhlZC1Qb2ludCBMb2dpY2FsIEluc3RydWN0aW9ucworIworCiswLjI4LDYuUlMsMTEuUkEsMTYuVUk6RDo6OkFORCBJbW1lZGlhdGUKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCisJKnJBID0gKnJTICYgVUk7CisJQ1IwX0NPTVBBUkUoKnJBLCAwLCAxLypSYyovKTsKKwlJVFJBQ0UodHJhY2VfYWx1LCAoIiBSZXN1bHQgPSAlbGQgKDB4JWx4KVxuIiwgKGxvbmcpKnJBLCAobG9uZykqckEpKTsKKwlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSywgMS8qUmMqLyk7CisKKzAuMjksNi5SUywxMS5SQSwxNi5VSTpEOjo6QU5EIEltbWVkaWF0ZSBTaGlmdGVkCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCSpyQSA9ICpyUyAmIChVSSA8PCAxNik7CisJQ1IwX0NPTVBBUkUoKnJBLCAwLCAxLypSYyovKTsKKwlJVFJBQ0UodHJhY2VfYWx1LCAoIiBSZXN1bHQgPSAlbGQgKDB4JWx4KVxuIiwgKGxvbmcpKnJBLCAobG9uZykqckEpKTsKKwlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSywgMS8qUmMqLyk7CisKKzAuMjQsNi5SUywxMS5SQSwxNi5VSTpEOjo6T1IgSW1tZWRpYXRlCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCSpyQSA9ICpyUyB8IFVJOworCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLCAobG9uZykqckEsIChsb25nKSpyQSkpOworCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLLCAwLypSYyovKTsKKworMC4yNSw2LlJTLDExLlJBLDE2LlVJOkQ6OjpPUiBJbW1lZGlhdGUgU2hpZnRlZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKKwkqckEgPSAqclMgfCAoVUkgPDwgMTYpOworCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLCAobG9uZykqckEsIChsb25nKSpyQSkpOworCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLLCAwLypSYyovKTsKKworMC4yNiw2LlJTLDExLlJBLDE2LlVJOkQ6OjpYT1IgSW1tZWRpYXRlCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCSpyQSA9ICpyUyBeIFVJOworCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLCAobG9uZykqckEsIChsb25nKSpyQSkpOworCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLLCAwLypSYyovKTsKKworMC4yNyw2LlJTLDExLlJBLDE2LlVJOkQ6OjpYT1IgSW1tZWRpYXRlIFNoaWZ0ZWQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCisJKnJBID0gKnJTIF4gKFVJIDw8IDE2KTsKKwlJVFJBQ0UodHJhY2VfYWx1LCAoIiBSZXN1bHQgPSAlbGQgKDB4JWx4KVxuIiwgKGxvbmcpKnJBLCAobG9uZykqckEpKTsKKwlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSywgMC8qUmMqLyk7CisKKzAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS4yOCwzMS5SYzpYOjo6QU5ECisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCSpyQSA9ICpyUyAmICpyQjsKKwlDUjBfQ09NUEFSRSgqckEsIDAsIFJjKTsKKwlJVFJBQ0UodHJhY2VfYWx1LCAoIiBSZXN1bHQgPSAlbGQgKDB4JWx4KVxuIiwgKGxvbmcpKnJBLCAobG9uZykqckEpKTsKKwlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSyB8IFJCX0JJVE1BU0ssIFJjKTsKKworMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjQ0NCwzMS5SYzpYOjo6T1IKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCisJKnJBID0gKnJTIHwgKnJCOworCUNSMF9DT01QQVJFKCpyQSwgMCwgUmMpOworCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLCAobG9uZykqckEsIChsb25nKSpyQSkpOworCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLIHwgUkJfQklUTUFTSywgUmMpOworCiswLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuMzE2LDMxLlJjOlg6OjpYT1IKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCisJKnJBID0gKnJTIF4gKnJCOworCUNSMF9DT01QQVJFKCpyQSwgMCwgUmMpOworCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLCAobG9uZykqckEsIChsb25nKSpyQSkpOworCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLIHwgUkJfQklUTUFTSywgUmMpOworCiswLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuNDc2LDMxLlJjOlg6OjpOQU5ECisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCSpyQSA9IH4oKnJTICYgKnJCKTsKKwlDUjBfQ09NUEFSRSgqckEsIDAsIFJjKTsKKwlJVFJBQ0UodHJhY2VfYWx1LCAoIiBSZXN1bHQgPSAlbGQgKDB4JWx4KVxuIiwgKGxvbmcpKnJBLCAobG9uZykqckEpKTsKKwlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSyB8IFJCX0JJVE1BU0ssIFJjKTsKKworMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjEyNCwzMS5SYzpYOjo6Tk9SCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCSpyQSA9IH4oKnJTIHwgKnJCKTsKKwlDUjBfQ09NUEFSRSgqckEsIDAsIFJjKTsKKwlJVFJBQ0UodHJhY2VfYWx1LCAoIiBSZXN1bHQgPSAlbGQgKDB4JWx4KVxuIiwgKGxvbmcpKnJBLCAobG9uZykqckEpKTsKKwlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSyB8IFJCX0JJVE1BU0ssIFJjKTsKKworMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjI4NCwzMS5SYzpYOjo6RXF1aXZhbGVudAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKKwkqckEgPSB+KCpyUyBeICpyQik7IC8qIEEgPT09IEIgKi8KKwlDUjBfQ09NUEFSRSgqckEsIDAsIFJjKTsKKwlJVFJBQ0UodHJhY2VfYWx1LCAoIiBSZXN1bHQgPSAlbGQgKDB4JWx4KVxuIiwgKGxvbmcpKnJBLCAobG9uZykqckEpKTsKKwlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSyB8IFJCX0JJVE1BU0ssIFJjKTsKKworMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjYwLDMxLlJjOlg6OjpBTkQgd2l0aCBDb21wbGVtZW50CisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCSpyQSA9ICpyUyAmIH4qckI7CisJQ1IwX0NPTVBBUkUoKnJBLCAwLCBSYyk7CisJSVRSQUNFKHRyYWNlX2FsdSwgKCIgUmVzdWx0ID0gJWxkICgweCVseClcbiIsIChsb25nKSpyQSwgKGxvbmcpKnJBKSk7CisJUFBDX0lOU05fSU5UKFJBX0JJVE1BU0ssIFJTX0JJVE1BU0sgfCBSQl9CSVRNQVNLLCBSYyk7CisKKzAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS40MTIsMzEuUmM6WDo6Ok9SIHdpdGggQ29tcGxlbWVudAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKKwkqckEgPSAqclMgfCB+KnJCOworCUNSMF9DT01QQVJFKCpyQSwgMCwgUmMpOworCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLCAobG9uZykqckEsIChsb25nKSpyQSkpOworCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLIHwgUkJfQklUTUFTSywgUmMpOworCiswLjMxLDYuUlMsMTEuUkEsMTYuLywyMS45NTQsMzEuUmM6WDo6ZXh0c2I6RXh0ZW5kIFNpZ24gQnl0ZQorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfU0NJVTEsIFBQQ19VTklUX1NDSVUyLCAxLCAgMSwgIDAKKwkqckEgPSAoc2lnbmVkX3dvcmQpKHNpZ25lZDgpKnJTOworCUNSMF9DT01QQVJFKCpyQSwgMCwgUmMpOworCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLCAobG9uZykqckEsIChsb25nKSpyQSkpOworCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLLCBSYyk7CisKKzAuMzEsNi5SUywxMS5SQSwxNi4vLDIxLjkyMiwzMS5SYzpYOjpleHRzaDpFeHRlbmQgU2lnbiBIYWxmIFdvcmQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCisJKnJBID0gKHNpZ25lZF93b3JkKShzaWduZWQxNikqclM7CisJQ1IwX0NPTVBBUkUoKnJBLCAwLCBSYyk7CisJSVRSQUNFKHRyYWNlX2FsdSwgKCIgUmVzdWx0ID0gJWxkICgweCVseClcbiIsIChsb25nKSpyQSwgKGxvbmcpKnJBKSk7CisJUFBDX0lOU05fSU5UKFJBX0JJVE1BU0ssIFJTX0JJVE1BU0ssIFJjKTsKKworMC4zMSw2LlJTLDExLlJBLDE2Li8sMjEuOTg2LDMxLlJjOlg6NjQ6OkV4dGVuZCBTaWduIFdvcmQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCisjCSpyQSA9IChzaWduZWRfd29yZCkoc2lnbmVkMzIpKnJTOworIwlDUjBfQ09NUEFSRSgqckEsIDAsIFJjKTsKKworMC4zMSw2LlJTLDExLlJBLDE2Li8sMjEuNTgsMzEuUmM6WDo2NDo6Q291bnQgTGVhZGluZyBaZXJvcyBEb3VibGV3b3JkCisjCWludCBjb3VudCA9IDA7CisjCXVuc2lnbmVkNjQgbWFzayA9IEJJVDY0KDApOworIwl1bnNpZ25lZDY0IHNvdXJjZSA9ICpyUzsKKyMJd2hpbGUgKCEoc291cmNlICYgbWFzaykgJiYgbWFzayAhPSAwKSB7CisjCSAgbWFzayA+Pj0gMTsKKyMJICBjb3VudCsrOworIwl9CisjCSpyQSA9IGNvdW50OworIwlDUjBfQ09NUEFSRShjb3VudCwgMCwgUmMpOyAvKiBGSVhNRSAtIGlzIHRoaXMgY29ycmVjdCAqLworCiswLjMxLDYuUlMsMTEuUkEsMTYuLywyMS4yNiwzMS5SYzpYOjo6Q291bnQgTGVhZGluZyBaZXJvcyBXb3JkCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCWludCBjb3VudCA9IDA7CisJdW5zaWduZWQzMiBtYXNrID0gQklUMzIoMCk7CisJdW5zaWduZWQzMiBzb3VyY2UgPSAqclM7CisJd2hpbGUgKCEoc291cmNlICYgbWFzaykgJiYgbWFzayAhPSAwKSB7CisJICBtYXNrID4+PSAxOworCSAgY291bnQrKzsKKwl9CisJKnJBID0gY291bnQ7CisJSVRSQUNFKHRyYWNlX2FsdSwgKCIgUmVzdWx0ID0gJWxkICgweCVseClcbiIsIChsb25nKSpyQSwgKGxvbmcpKnJBKSk7CisJQ1IwX0NPTVBBUkUoY291bnQsIDAsIFJjKTsgLyogRklYTUUgLSBpcyB0aGlzIGNvcnJlY3QgKi8KKworCisjCisjIEkuMy4zLjEzIEZpeGVkLVBvaW50IFJvdGF0ZSBhbmQgU2hpZnQgSW5zdHJ1Y3Rpb25zCisjCisKKzAuMzAsNi5SUywxMS5SQSwxNi5zaF8wXzQsMjEubWIsMjcuMCwzMC5zaF81LDMxLlJjOk1EOjY0OjpSb3RhdGUgTGVmdCBEb3VibGV3b3JkIEltbWVkaWF0ZSB0aGVuIENsZWFyIExlZnQKKyMJbG9uZyBuID0gKHNoXzUgPDwgNCkgfCBzaF8wXzQ7CisjCXVuc2lnbmVkX3dvcmQgciA9IFJPVEw2NCgqclMsIG4pOworIwlsb25nIGIgPSAobWJfNSA8PCA0KSB8IG1iXzBfNDsKKyMJdW5zaWduZWRfd29yZCBtID0gTUFTSyhiLCA2Myk7CisjCXNpZ25lZF93b3JkIHJlc3VsdCA9IHIgJiBtOworIwkqckEgPSByZXN1bHQ7CisjCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpXG4iLCAobG9uZykqckEsIChsb25nKSpyQSkpOworIwlDUjBfQ09NUEFSRShyZXN1bHQsIDAsIFJjKTsgLyogRklYTUUgLSBpcyB0aGlzIGNvcnJlY3QgKi8KKworMC4zMCw2LlJTLDExLlJBLDE2LnNoXzBfNCwyMS5tZSwyNy4xLDMwLnNoXzUsMzEuUmM6TUQ6NjQ6OlJvdGF0ZSBMZWZ0IERvdWJsZXdvcmQgSW1tZWRpYXRlIHRoZW4gQ2xlYXIgUmlnaHQKKyMJbG9uZyBuID0gKHNoXzUgPDwgNCkgfCBzaF8wXzQ7CisjCXVuc2lnbmVkX3dvcmQgciA9IFJPVEw2NCgqclMsIG4pOworIwlsb25nIGUgPSAobWVfNSA8PCA0KSB8IG1lXzBfNDsKKyMJdW5zaWduZWRfd29yZCBtID0gTUFTSygwLCBlKTsKKyMJc2lnbmVkX3dvcmQgcmVzdWx0ID0gciAmIG07CisjCSpyQSA9IHJlc3VsdDsKKyMJQ1IwX0NPTVBBUkUocmVzdWx0LCAwLCBSYyk7IC8qIEZJWE1FIC0gaXMgdGhpcyBjb3JyZWN0ICovCisKKzAuMzAsNi5SUywxMS5SQSwxNi5zaF8wXzQsMjEubWIsMjcuMiwzMC5zaF81LDMxLlJjOk1EOjY0OjpSb3RhdGUgTGVmdCBEb3VibGV3b3JkIEltbWVkaWF0ZSB0aGVuIENsZWFyCisjCWxvbmcgbiA9IChzaF81IDw8IDQpIHwgc2hfMF80OworIwl1bnNpZ25lZF93b3JkIHIgPSBST1RMNjQoKnJTLCBuKTsKKyMJbG9uZyBiID0gKG1iXzUgPDwgNCkgfCBtYl8wXzQ7CisjCXVuc2lnbmVkX3dvcmQgbSA9IE1BU0soMCwgKDY0LW4pKTsKKyMJc2lnbmVkX3dvcmQgcmVzdWx0ID0gciAmIG07CisjCSpyQSA9IHJlc3VsdDsKKyMJQ1IwX0NPTVBBUkUocmVzdWx0LCAwLCBSYyk7IC8qIEZJWE1FIC0gaXMgdGhpcyBjb3JyZWN0ICovCisKKzAuMjEsNi5SUywxMS5SQSwxNi5TSCwyMS5NQiwyNi5NRSwzMS5SYzpNOjo6Um90YXRlIExlZnQgV29yZCBJbW1lZGlhdGUgdGhlbiBBTkQgd2l0aCBNYXNrCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCWxvbmcgbiA9IFNIOworCXVuc2lnbmVkMzIgcyA9ICpyUzsKKwl1bnNpZ25lZDMyIHIgPSBST1RMMzIocywgbik7CisJdW5zaWduZWQzMiBtID0gTUFTSyhNQiszMiwgTUUrMzIpOworCXNpZ25lZF93b3JkIHJlc3VsdCA9IHIgJiBtOworCSpyQSA9IHJlc3VsdDsKKwlDUjBfQ09NUEFSRShyZXN1bHQsIDAsIFJjKTsKKwlJVFJBQ0UodHJhY2VfYWx1LAorCSAgICAgICAoIm49JWxkLCBzPTB4JWx4LCByPTB4JWx4LCBtPTB4JWx4LCByZXN1bHQ9MHglbHgsIGNyPTB4JWx4XG4iLAorCSAgICAgICAgbiwgKHVuc2lnbmVkIGxvbmcpcywgKHVuc2lnbmVkIGxvbmcpciwgKHVuc2lnbmVkIGxvbmcpbSwKKwkJKHVuc2lnbmVkIGxvbmcpcmVzdWx0LCAodW5zaWduZWQgbG9uZylDUikpOworCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLLCBSYyk7CisKKzAuMzAsNi5SUywxMS5SQSwxNi5SQiwyMS5tYiwyNy44LDMxLlJjOk1EUzo2NDo6Um90YXRlIExlZnQgRG91Ymxld29yZCB0aGVuIENsZWFyIExlZnQKKyMJbG9uZyBuID0gTUFTS0VEKCpyQiwgNTgsIDYzKTsKKyMJdW5zaWduZWRfd29yZCByID0gUk9UTDY0KCpyUywgbik7CisjCWxvbmcgYiA9IChtYl81IDw8IDQpIHwgbWJfMF80OworIwl1bnNpZ25lZF93b3JkIG0gPSBNQVNLKGIsIDYzKTsKKyMJc2lnbmVkX3dvcmQgcmVzdWx0ID0gciAmIG07CisjCSpyQSA9IHJlc3VsdDsKKyMJQ1IwX0NPTVBBUkUocmVzdWx0LCAwLCBSYyk7CisKKzAuMzAsNi5SUywxMS5SQSwxNi5SQiwyMS5tZSwyNy45LDMxLlJjOk1EUzo2NDo6Um90YXRlIExlZnQgRG91Ymxld29yZCB0aGVuIENsZWFyIFJpZ2h0CisjCWxvbmcgbiA9IE1BU0tFRCgqckIsIDU4LCA2Myk7CisjCXVuc2lnbmVkX3dvcmQgciA9IFJPVEw2NCgqclMsIG4pOworIwlsb25nIGUgPSAobWVfNSA8PCA0KSB8IG1lXzBfNDsKKyMJdW5zaWduZWRfd29yZCBtID0gTUFTSygwLCBlKTsKKyMJc2lnbmVkX3dvcmQgcmVzdWx0ID0gciAmIG07CisjCSpyQSA9IHJlc3VsdDsKKyMJQ1IwX0NPTVBBUkUocmVzdWx0LCAwLCBSYyk7CisKKzAuMjMsNi5SUywxMS5SQSwxNi5SQiwyMS5NQiwyNi5NRSwzMS5SYzpNOjo6Um90YXRlIExlZnQgV29yZCB0aGVuIEFORCB3aXRoIE1hc2sKKwlsb25nIG4gPSBNQVNLRUQoKnJCLCA1OSwgNjMpOworCXVuc2lnbmVkMzIgciA9IFJPVEwzMigqclMsIG4pOworCXVuc2lnbmVkMzIgbSA9IE1BU0soTUIrMzIsIE1FKzMyKTsKKwlzaWduZWRfd29yZCByZXN1bHQgPSByICYgbTsKKwkqckEgPSByZXN1bHQ7CisJQ1IwX0NPTVBBUkUocmVzdWx0LCAwLCBSYyk7CisKKzAuMzAsNi5SUywxMS5SQSwxNi5zaF8wXzQsMjEubWIsMjcuMywzMC5zaF81LDMxLlJjOk1EOjY0OjpSb3RhdGUgTGVmdCBEb3VibGV3b3JkIEltbWVkaWF0ZSB0aGVuIE1hc2sgSW5zZXJ0CisjCWxvbmcgbiA9IChzaF81IDw8IDQpIHwgc2hfMF80OworIwl1bnNpZ25lZF93b3JkIHIgPSBST1RMNjQoKnJTLCBuKTsKKyMJbG9uZyBiID0gKG1iXzUgPDwgNCkgfCBtYl8wXzQ7CisjCXVuc2lnbmVkX3dvcmQgbSA9IE1BU0soYiwgKDY0LW4pKTsKKyMJc2lnbmVkX3dvcmQgcmVzdWx0ID0gKHIgJiBtKSB8ICgqckEgJiB+bSkKKyMJKnJBID0gcmVzdWx0OworIwlDUjBfQ09NUEFSRShyZXN1bHQsIDAsIFJjKTsKKworMC4yMCw2LlJTLDExLlJBLDE2LlNILDIxLk1CLDI2Lk1FLDMxLlJjOk06OnJsd2ltaTpSb3RhdGUgTGVmdCBXb3JkIEltbWVkaWF0ZSB0aGVuIE1hc2sgSW5zZXJ0CisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCWxvbmcgbiA9IFNIOworCXVuc2lnbmVkMzIgciA9IFJPVEwzMigqclMsIG4pOworCXVuc2lnbmVkMzIgbSA9IE1BU0soTUIrMzIsIE1FKzMyKTsKKwlzaWduZWRfd29yZCByZXN1bHQgPSAociAmIG0pIHwgKCpyQSAmIH5tKTsKKwkqckEgPSByZXN1bHQ7CisJSVRSQUNFKHRyYWNlX2FsdSwgKCI6IG49JWxkICpyUz0weCVseCByPTB4JWx4IG09MHglbHggcmVzdWx0PTB4JWx4XG4iLAorCSAgICAgICAgICAgICAgICAgICBuLCAodW5zaWduZWQgbG9uZykqclMsICh1bnNpZ25lZCBsb25nKXIsICh1bnNpZ25lZCBsb25nKW0sCisJCQkgICAodW5zaWduZWQgbG9uZylyZXN1bHQpKTsKKwlDUjBfQ09NUEFSRShyZXN1bHQsIDAsIFJjKTsKKwlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSywgUmMpOworCisKKzAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS4yNywzMS5SYzpYOjY0OjpTaGlmdCBMZWZ0IERvdWJsZXdvcmQKKworMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjI0LDMxLlJjOlg6OjpTaGlmdCBMZWZ0IFdvcmQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCisJaW50IG4gPSBNQVNLRUQoKnJCLCA1OCwgNjMpOworCXVuc2lnbmVkMzIgc291cmNlID0gKnJTOworCXNpZ25lZF93b3JkIHNoaWZ0ZWQ7CisJaWYgKG4gPCAzMikKKwkgIHNoaWZ0ZWQgPSAoc291cmNlIDw8IG4pOworCWVsc2UKKwkgIHNoaWZ0ZWQgPSAwOworCSpyQSA9IHNoaWZ0ZWQ7CisJQ1IwX0NPTVBBUkUoc2hpZnRlZCwgMCwgUmMpOworCUlUUkFDRSh0cmFjZV9hbHUsCisJICAgICAgICgibj0lZCwgc291cmNlPTB4JWx4LCBzaGlmdGVkPTB4JWx4XG4iLAorCSAgICAgICAgbiwgKHVuc2lnbmVkIGxvbmcpc291cmNlLCAodW5zaWduZWQgbG9uZylzaGlmdGVkKSk7CisJUFBDX0lOU05fSU5UKFJBX0JJVE1BU0ssIFJTX0JJVE1BU0ssIFJjKTsKKworMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjUzOSwzMS5SYzpYOjY0OjpTaGlmdCBSaWdodCBEb3VibGV3b3JkCisKKzAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS41MzYsMzEuUmM6WDo6OlNoaWZ0IFJpZ2h0IFdvcmQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCisJaW50IG4gPSBNQVNLRUQoKnJCLCA1OCwgNjMpOworCXVuc2lnbmVkMzIgc291cmNlID0gKnJTOworCXNpZ25lZF93b3JkIHNoaWZ0ZWQ7CisJaWYgKG4gPCAzMikKKwkgIHNoaWZ0ZWQgPSAoc291cmNlID4+IG4pOworCWVsc2UKKwkgIHNoaWZ0ZWQgPSAwOworCSpyQSA9IHNoaWZ0ZWQ7CisJQ1IwX0NPTVBBUkUoc2hpZnRlZCwgMCwgUmMpOworCUlUUkFDRSh0cmFjZV9hbHUsIFwKKwkgICAgICAgKCJuPSVkLCBzb3VyY2U9MHglbHgsIHNoaWZ0ZWQ9MHglbHhcbiIsCisJICAgICAgICBuLCAodW5zaWduZWQgbG9uZylzb3VyY2UsICh1bnNpZ25lZCBsb25nKXNoaWZ0ZWQpKTsKKwlQUENfSU5TTl9JTlQoUkFfQklUTUFTSywgUlNfQklUTUFTSywgUmMpOworCiswLjMxLDYuUlMsMTEuUkEsMTYuc2hfMF80LDIxLjQxMywzMC5zaF81LDMxLlJjOlhTOjY0OjpTaGlmdCBSaWdodCBBbGdlYnJhaWMgRG91Ymxld29yZCBJbW1lZGlhdGUKKworMC4zMSw2LlJTLDExLlJBLDE2LlNILDIxLjgyNCwzMS5SYzpYOjo6U2hpZnQgUmlnaHQgQWxnZWJyYWljIFdvcmQgSW1tZWRpYXRlCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9TQ0lVMSwgUFBDX1VOSVRfU0NJVTIsIDEsICAxLCAgMAorCWludCBuID0gU0g7CisJc2lnbmVkX3dvcmQgciA9IFJPVEwzMigqclMsIC8qNjQqLzMyLW4pOworCXNpZ25lZF93b3JkIG0gPSBNQVNLKG4rMzIsIDYzKTsKKwlpbnQgUyA9IE1BU0tFRCgqclMsIDMyLCAzMik7CisJc2lnbmVkX3dvcmQgc2hpZnRlZCA9IChyICYgbSkgfCAoUyA/IH5tIDogMCk7CisJKnJBID0gc2hpZnRlZDsKKwlpZiAoUyAmJiAoKHIgJiB+bSkgJiBNQVNLKDMyLCA2MykpICE9IDApCisJICBYRVIgfD0geGVyX2NhcnJ5OworCWVsc2UKKwkgIFhFUiAmPSB+eGVyX2NhcnJ5OworCUNSMF9DT01QQVJFKHNoaWZ0ZWQsIDAsIFJjKTsKKwlJVFJBQ0UodHJhY2VfYWx1LCAoIiBSZXN1bHQgPSAlbGQgKDB4JWx4KSwgWEVSID0gJWxkXG4iLAorCQkJICAgKGxvbmcpKnJBLCAobG9uZykqckEsIChsb25nKVhFUikpOworCVBQQ19JTlNOX0lOVChSQV9CSVRNQVNLLCBSU19CSVRNQVNLLCBSYyk7CisKKzAuMzEsNi5SUywxMS5SQSwxNi5SQiwyMS43OTQsMzEuUmM6WDo2NDo6U2hpZnQgUmlnaHQgQWxnZWJyYWljIERvdWJsZXdvcmQKKworMC4zMSw2LlJTLDExLlJBLDE2LlJCLDIxLjc5MiwzMS5SYzpYOjo6U2hpZnQgUmlnaHQgQWxnZWJyYWljIFdvcmQKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX1NDSVUxLCBQUENfVU5JVF9TQ0lVMiwgMSwgIDEsICAwCisJdW5zaWduZWQ2NCBtYXNrOworCWludCBuID0gTUFTS0VEKCpyQiwgNTksIDYzKTsKKwlzaWduZWQzMiBzb3VyY2UgPSAoc2lnbmVkMzIpKnJTOyAvKiBzaWduZWQgdG8ga2VlcCBzaWduIGJpdCAqLworCXNpZ25lZDMyIHNoaWZ0ZWQgPSBzb3VyY2UgPj4gbjsKKwlpbnQgUyA9IChNQVNLRUQoKnJTLDMyLDMyKSAhPSAwKTsKKwlzaWduZWQ2NCByID0gKCh1bnNpZ25lZDY0KSBzb3VyY2UpOworCXIgPSAoKHVuc2lnbmVkNjQpIHNvdXJjZSkgPDwgMzIgfCAodW5zaWduZWQzMikgc291cmNlOworCXIgPSBST1RMNjQociw2NC1uKTsKKwlpZiAoTUFTS0VEKCpyQiw1OCw1OCkgPT0gMCkKKwkJbWFzayA9ICh1bnNpZ25lZDY0KSBNQVNLNjQobiszMiw2Myk7CisJZWxzZQorCQltYXNrID0gKHVuc2lnbmVkNjQpIDA7CisJKnJBID0gKHNpZ25lZF93b3JkKSAociAmIG1hc2sgfCAoKHNpZ25lZDY0KSAtMSpTKSAmIH5tYXNrKTsgLyogaWYgNjRiaXQgd2lsbCBzaWduIGV4dGVuZCAqLworCWlmIChTICYmIChNQVNLRUQociAmIH5tYXNrLDMyLDYzKSE9MCkpCisJICBYRVIgfD0geGVyX2NhcnJ5OworCWVsc2UKKwkgIFhFUiAmPSB+eGVyX2NhcnJ5OworCUNSMF9DT01QQVJFKCpyQSwgMCwgUmMpOworCUlUUkFDRSh0cmFjZV9hbHUsICgiIFJlc3VsdCA9ICVsZCAoMHglbHgpLCBYRVIgPSAlbGRcbiIsCisJCQkgICAobG9uZykqckEsIChsb25nKSpyQSwgKGxvbmcpWEVSKSk7CisJUFBDX0lOU05fSU5UKFJBX0JJVE1BU0ssIFJTX0JJVE1BU0ssIFJjKTsKKworIworIyBJLjMuMy4xNCBNb3ZlIHRvL2Zyb20gU3lzdGVtIFJlZ2lzdGVyIEluc3RydWN0aW9ucworIworCiswLjMxLDYuUlMsMTEuU1BSLDIxLjQ2NywzMS4vOlhGWDo6bXRzcHIgJVNQUiwgJVJTOk1vdmUgdG8gU3BlY2lhbCBQdXJwb3NlIFJlZ2lzdGVyCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAyLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMiwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9NQ0lVLCAgUFBDX1VOSVRfTUNJVSwgIDEsICAxLCAgMAorCWludCBuID0gKFNQUns1Ojl9IDw8IDUpIHwgU1BSezA6NH07CisJaWYgKFNQUnswfSAmJiBJU19QUk9CTEVNX1NUQVRFKHByb2Nlc3NvcikpCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIHByaXZpbGVnZWRfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCWVsc2UgaWYgKCFzcHJfaXNfdmFsaWQobikKKwkgICAgICAgICB8fCBzcHJfaXNfcmVhZG9ubHkobikpCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCWVsc2UgeworCSAgc3ByZWcgbmV3X3ZhbCA9IChzcHJfbGVuZ3RoKG4pID09IDY0CisJCQkgICA/ICpyUworCQkJICAgOiBNQVNLRUQoKnJTLCAzMiwgNjMpKTsKKwkgIC8qIEhBQ0sgLSB0aW1lIGJhc2UgcmVnaXN0ZXJzIG5lZWQgdG8gYmUgdXBkYXRlZCBpbW1lZGlhdGx5ICovCisJICBpZiAoV0lUSF9USU1FX0JBU0UpIHsKKwkgICAgc3dpdGNoIChuKSB7CisJICAgIGNhc2Ugc3ByX3RidToKKwkgICAgICBjcHVfc2V0X3RpbWVfYmFzZShwcm9jZXNzb3IsCisJICAgICAgICAgICAgICAgICAgICAgICAgKE1BU0tFRDY0KGNwdV9nZXRfdGltZV9iYXNlKHByb2Nlc3NvciksIDMyLCA2MykKKwkgICAgICAgICAgICAgICAgICAgICAgICAgfCBJTlNFUlRFRDY0KG5ld192YWwsIDAsIDMxKSkpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIHNwcl90Ymw6CisJICAgICAgY3B1X3NldF90aW1lX2Jhc2UocHJvY2Vzc29yLAorCSAgICAgICAgICAgICAgICAgICAgICAgIChNQVNLRUQ2NChjcHVfZ2V0X3RpbWVfYmFzZShwcm9jZXNzb3IpLCAwLCAzMSkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgfCBJTlNFUlRFRDY0KG5ld192YWwsIDMyLCA2MykpKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBzcHJfZGVjOgorCSAgICAgIGNwdV9zZXRfZGVjcmVtZW50ZXIocHJvY2Vzc29yLCBuZXdfdmFsKTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBTUFJFRyhuKSA9IG5ld192YWw7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIH0KKwkgIGVsc2UgeworCSAgICBTUFJFRyhuKSA9IG5ld192YWw7CisJICB9CisJfQorCVBQQ19JTlNOX1RPX1NQUihSU19CSVRNQVNLLCBuKTsKKworMC4zMSw2LlJULDExLlNQUiwyMS4zMzksMzEuLzpYRlg6Om1mc3ByICVSVCwgJVNQUjpNb3ZlIGZyb20gU3BlY2lhbCBQdXJwb3NlIFJlZ2lzdGVyCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKKyo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCisqNjA0OiBQUENfVU5JVF9NQ0lVLCAgUFBDX1VOSVRfTUNJVSwgIDMsICAzLCAgMAorCWludCBuID0gKFNQUns1Ojl9IDw8IDUpIHwgU1BSezA6NH07CisJaWYgKFNQUnswfSAmJiBJU19QUk9CTEVNX1NUQVRFKHByb2Nlc3NvcikpCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIHByaXZpbGVnZWRfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCWVsc2UgaWYgKCFzcHJfaXNfdmFsaWQobikpCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCWVsc2UgeworCSAgLyogSEFDSyAtIHRpbWUgYmFzZSByZWdpc3RlcnMgbmVlZCB0byBiZSBjYWxjdWxhdGVkICovCisJICBpZiAoV0lUSF9USU1FX0JBU0UpIHsKKwkgICAgc3dpdGNoIChuKSB7CisJICAgIGNhc2Ugc3ByX2RlYzoKKwkgICAgICAqclQgPSBjcHVfZ2V0X2RlY3JlbWVudGVyKHByb2Nlc3Nvcik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2Ugc3ByX3RidToKKwkgICAgY2FzZSBzcHJfdGJsOgorCSAgICAgIC8qIE5PVEUgLSB0aGVzZSBTUFIncyBhcmUgbm90IHJlYWRhYmxlLiBVc2UgbWZ0Ylt1bF0gKi8KKwkgICAgZGVmYXVsdDoKKwkgICAgICAqclQgPSBTUFJFRyhuKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgfQorCSAgZWxzZSB7CisJICAgICpyVCA9IFNQUkVHKG4pOworCSAgfQorCX0KKwlQUENfSU5TTl9GUk9NX1NQUihSVF9CSVRNQVNLLCBuKTsKKworMC4zMSw2LlJTLDExLi8sMTIuRlhNLDIwLi8sMjEuMTQ0LDMxLi86WEZYOjptdGZjcjpNb3ZlIHRvIENvbmRpdGlvbiBSZWdpc3RlciBGaWVsZHMKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMiwgIDIsICAwCisqNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgMSwgIDEsICAwCisJaWYgKEZYTSA9PSAweGZmKSB7CisJICBDUiA9ICpyUzsKKwl9CisJZWxzZSB7CisJICB1bnNpZ25lZF93b3JkIG1hc2sgPSAwOworCSAgdW5zaWduZWRfd29yZCBmOworCSAgZm9yIChmID0gMDsgZiA8IDg7IGYrKykgeworCSAgICBpZiAoRlhNICYgKDB4ODAgPj4gZikpCisJICAgICAgbWFzayB8PSAoMHhmIDw8IDQqKDctZikpOworCSAgfQorCSAgQ1IgPSAoTUFTS0VEKCpyUywgMzIsIDYzKSAmIG1hc2spIHwgKENSICYgfm1hc2spOworCX0KKwlQUENfSU5TTl9NVENSKFJTX0JJVE1BU0ssIEZYTSk7CisKKzAuMzEsNi5CRiw5Li8sMTEuLywxNi4vLDIxLjUxMiwzMS4vOlg6OjpNb3ZlIHRvIENvbmRpdGlvbiBSZWdpc3RlciBmcm9tIFhFUgorIwlDUl9TRVQoQkYsIEVYVFJBQ1RFRDMyKFhFUiwgMCwgMykpOworIwlNQkxJVDMyKFhFUiwgMCwgMywgMCk7CisKKzAuMzEsNi5SVCwxMS4vLDE2Li8sMjEuMTksMzEuLzpYOjo6TW92ZSBGcm9tIENvbmRpdGlvbiBSZWdpc3RlcgorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMSwgIDEsICAwCisqNjAzZTpQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAorKjYwNDogUFBDX1VOSVRfTUNJVSwgIFBQQ19VTklUX01DSVUsICAzLCAgMywgIDAKKwkqclQgPSAodW5zaWduZWQzMilDUjsKKwlQUENfSU5TTl9NRkNSKFJUX0JJVE1BU0spOworCisjCisjIEkuNC42LjIgRmxvYXRpbmctUG9pbnQgTG9hZCBJbnN0cnVjdGlvbnMKKyMKKworMC40OCw2LkZSVCwxMS5SQSwxNi5EOkQ6ZjpsZnM6TG9hZCBGbG9hdGluZy1Qb2ludCBTaW5nbGUKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMywgIDMsICAwCisqNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCisJdW5zaWduZWRfd29yZCBiOworCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzApIGIgPSAwOworCWVsc2UgICAgICAgICBiID0gKnJBOworCUVBID0gYiArIEVYVFMoRCk7CisJKmZyVCA9IERPVUJMRShNRU0odW5zaWduZWQsIEVBLCA0KSk7CisJUFBDX0lOU05fSU5UX0ZMT0FUKDAsIEZSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSwgMCk7CisKKzAuMzEsNi5GUlQsMTEuUkEsMTYuUkIsMjEuNTM1LDMxLi86WDpmOjpMb2FkIEZsb2F0aW5nLVBvaW50IFNpbmdsZSBJbmRleGVkCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDMsICAzLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgYjsKKwl1bnNpZ25lZF93b3JkIEVBOworCWlmIChSQV9pc18wKSBiID0gMDsKKwllbHNlICAgICAgICAgYiA9ICpyQTsKKwlFQSA9IGIgKyAqckI7CisJKmZyVCA9IERPVUJMRShNRU0odW5zaWduZWQsIEVBLCA0KSk7CisJUFBDX0lOU05fSU5UX0ZMT0FUKDAsIEZSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIDApOworCiswLjQ5LDYuRlJULDExLlJBLDE2LkQ6RDpmOjpMb2FkIEZsb2F0aW5nLVBvaW50IFNpbmdsZSB3aXRoIFVwZGF0ZQorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAzLCAgMywgIDAKKyo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKKwl1bnNpZ25lZF93b3JkIEVBOworCWlmIChSQV9pc18wKQorCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICBpbGxlZ2FsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKKwlFQSA9ICpyQSArIEVYVFMoRCk7CisJKmZyVCA9IERPVUJMRShNRU0odW5zaWduZWQsIEVBLCA0KSk7CisJKnJBID0gRUE7CisJUFBDX0lOU05fSU5UX0ZMT0FUKFJBX0JJVE1BU0ssIEZSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSwgMCk7CisKKzAuMzEsNi5GUlQsMTEuUkEsMTYuUkIsMjEuNTc2LDMxLi86WDpmOjpMb2FkIEZsb2F0aW5nLVBvaW50IFNpbmdsZSB3aXRoIFVwZGF0ZSBJbmRleGVkCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDMsICAzLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzApCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCUVBID0gKnJBICsgKnJCOworCSpmclQgPSBET1VCTEUoTUVNKHVuc2lnbmVkLCBFQSwgNCkpOworCSpyQSA9IEVBOworCVBQQ19JTlNOX0lOVF9GTE9BVChSQV9CSVRNQVNLLCBGUlRfQklUTUFTSywgKFJBX0JJVE1BU0sgJiB+MSkgfCBSQl9CSVRNQVNLLCAwKTsKKworMC41MCw2LkZSVCwxMS5SQSwxNi5EOkQ6Zjo6TG9hZCBGbG9hdGluZy1Qb2ludCBEb3VibGUKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMywgIDMsICAwCisqNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCisJdW5zaWduZWRfd29yZCBiOworCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzApIGIgPSAwOworCWVsc2UgICAgICAgICBiID0gKnJBOworCUVBID0gYiArIEVYVFMoRCk7CisJKmZyVCA9IE1FTSh1bnNpZ25lZCwgRUEsIDgpOworCVBQQ19JTlNOX0lOVF9GTE9BVCgwLCBGUlRfQklUTUFTSywgKFJBX0JJVE1BU0sgJiB+MSksIDApOworCiswLjMxLDYuRlJULDExLlJBLDE2LlJCLDIxLjU5OSwzMS4vOlg6Zjo6TG9hZCBGbG9hdGluZy1Qb2ludCBEb3VibGUgSW5kZXhlZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAzLCAgMywgIDAKKyo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKKwl1bnNpZ25lZF93b3JkIGI7CisJdW5zaWduZWRfd29yZCBFQTsKKwlpZiAoUkFfaXNfMCkgYiA9IDA7CisJZWxzZSAgICAgICAgIGIgPSAqckE7CisJRUEgPSBiICsgKnJCOworCSpmclQgPSBNRU0odW5zaWduZWQsIEVBLCA4KTsKKwlQUENfSU5TTl9JTlRfRkxPQVQoMCwgRlJUX0JJVE1BU0ssIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSywgMCk7CisKKzAuNTEsNi5GUlQsMTEuUkEsMTYuRDpEOmY6OkxvYWQgRmxvYXRpbmctUG9pbnQgRG91YmxlIHdpdGggVXBkYXRlCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDMsICAzLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzApCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCUVBID0gKnJBICsgRVhUUyhEKTsKKwkqZnJUID0gTUVNKHVuc2lnbmVkLCBFQSwgOCk7CisJKnJBID0gRUE7CisJUFBDX0lOU05fSU5UX0ZMT0FUKFJBX0JJVE1BU0ssIEZSVF9CSVRNQVNLLCAoUkFfQklUTUFTSyAmIH4xKSwgMCk7CisKKzAuMzEsNi5GUlQsMTEuUkEsMTYuUkIsMjEuNjMxLDMxLi86WDpmOjpMb2FkIEZsb2F0aW5nLVBvaW50IERvdWJsZSB3aXRoIFVwZGF0ZSBJbmRleGVkCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDMsICAzLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzApCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCUVBID0gKnJBICsgKnJCOworCSpmclQgPSBNRU0odW5zaWduZWQsIEVBLCA4KTsKKwkqckEgPSBFQTsKKwlQUENfSU5TTl9JTlRfRkxPQVQoUkFfQklUTUFTSywgRlJUX0JJVE1BU0ssIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSywgMCk7CisKKworIworIyBJLjQuNi4zIEZsb2F0aW5nLVBvaW50IFN0b3JlIEluc3RydWN0aW9ucworIworCiswLjUyLDYuRlJTLDExLlJBLDE2LkQ6RDpmOjpTdG9yZSBGbG9hdGluZy1Qb2ludCBTaW5nbGUKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCisJdW5zaWduZWRfd29yZCBiOworCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzApIGIgPSAwOworCWVsc2UgICAgICAgICBiID0gKnJBOworCUVBID0gYiArIEVYVFMoRCk7CisJU1RPUkUoRUEsIDQsIFNJTkdMRSgqZnJTKSk7CisJUFBDX0lOU05fSU5UX0ZMT0FUKDAsIDAsIChSQV9CSVRNQVNLICYgfjEpLCBGUlNfQklUTUFTSyk7CisKKzAuMzEsNi5GUlMsMTEuUkEsMTYuUkIsMjEuNjYzLDMxLi86WDpmOjpTdG9yZSBGbG9hdGluZy1Qb2ludCBTaW5nbGUgSW5kZXhlZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKKwl1bnNpZ25lZF93b3JkIGI7CisJdW5zaWduZWRfd29yZCBFQTsKKwlpZiAoUkFfaXNfMCkgYiA9IDA7CisJZWxzZSAgICAgICAgIGIgPSAqckE7CisJRUEgPSBiICsgKnJCOworCVNUT1JFKEVBLCA0LCBTSU5HTEUoKmZyUykpOworCVBQQ19JTlNOX0lOVF9GTE9BVCgwLCAwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIEZSU19CSVRNQVNLKTsKKworMC41Myw2LkZSUywxMS5SQSwxNi5EOkQ6Zjo6U3RvcmUgRmxvYXRpbmctUG9pbnQgU2luZ2xlIHdpdGggVXBkYXRlCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzApCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCUVBID0gKnJBICsgRVhUUyhEKTsKKwlTVE9SRShFQSwgNCwgU0lOR0xFKCpmclMpKTsKKwkqckEgPSBFQTsKKwlQUENfSU5TTl9JTlRfRkxPQVQoUkFfQklUTUFTSywgMCwgKFJBX0JJVE1BU0sgJiB+MSksIEZSU19CSVRNQVNLKTsKKworMC4zMSw2LkZSUywxMS5SQSwxNi5SQiwyMS42OTUsMzEuLzpYOmY6OlN0b3JlIEZsb2F0aW5nLVBvaW50IFNpbmdsZSB3aXRoIFVwZGF0ZSBJbmRleGVkCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzApCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCUVBID0gKnJBICsgKnJCOworCVNUT1JFKEVBLCA0LCBTSU5HTEUoKmZyUykpOworCSpyQSA9IEVBOworCVBQQ19JTlNOX0lOVF9GTE9BVChSQV9CSVRNQVNLLCAwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIEZSU19CSVRNQVNLKTsKKworMC41NCw2LkZSUywxMS5SQSwxNi5EOkQ6Zjo6U3RvcmUgRmxvYXRpbmctUG9pbnQgRG91YmxlCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgYjsKKwl1bnNpZ25lZF93b3JkIEVBOworCWlmIChSQV9pc18wKSBiID0gMDsKKwllbHNlICAgICAgICAgYiA9ICpyQTsKKwlFQSA9IGIgKyBFWFRTKEQpOworCVNUT1JFKEVBLCA4LCAqZnJTKTsKKwlQUENfSU5TTl9JTlRfRkxPQVQoMCwgMCwgKFJBX0JJVE1BU0sgJiB+MSksIEZSU19CSVRNQVNLKTsKKworMC4zMSw2LkZSUywxMS5SQSwxNi5SQiwyMS43MjcsMzEuLzpYOmY6OlN0b3JlIEZsb2F0aW5nLVBvaW50IERvdWJsZSBJbmRleGVkCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgYjsKKwl1bnNpZ25lZF93b3JkIEVBOworCWlmIChSQV9pc18wKSBiID0gMDsKKwllbHNlICAgICAgICAgYiA9ICpyQTsKKwlFQSA9IGIgKyAqckI7CisJU1RPUkUoRUEsIDgsICpmclMpOworCVBQQ19JTlNOX0lOVF9GTE9BVCgwLCAwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIEZSU19CSVRNQVNLKTsKKworMC41NSw2LkZSUywxMS5SQSwxNi5EOkQ6Zjo6U3RvcmUgRmxvYXRpbmctUG9pbnQgRG91YmxlIHdpdGggVXBkYXRlCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCXVuc2lnbmVkX3dvcmQgRUE7CisJaWYgKFJBX2lzXzApCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCUVBID0gKnJBICsgRVhUUyhEKTsKKwlTVE9SRShFQSwgOCwgKmZyUyk7CisJKnJBID0gRUE7CisJUFBDX0lOU05fSU5UX0ZMT0FUKFJBX0JJVE1BU0ssIDAsIChSQV9CSVRNQVNLICYgfjEpLCBGUlNfQklUTUFTSyk7CisKKzAuMzEsNi5GUlMsMTEuUkEsMTYuUkIsMjEuNzU5LDMxLi86WDpmOjpTdG9yZSBGbG9hdGluZy1Qb2ludCBEb3VibGUgd2l0aCBVcGRhdGUgSW5kZXhlZAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDIsICAwCisqNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAyLCAgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKKwl1bnNpZ25lZF93b3JkIEVBOworCWlmIChSQV9pc18wKQorCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICBpbGxlZ2FsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKKwlFQSA9ICpyQSArICpyQjsKKwlTVE9SRShFQSwgOCwgKmZyUyk7CisJKnJBID0gRUE7CisJUFBDX0lOU05fSU5UX0ZMT0FUKFJBX0JJVE1BU0ssIDAsIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSywgRlJTX0JJVE1BU0spOworCisKKyMKKyMgSS40LjYuNCBGbG9hdGluZy1Qb2ludCBNb3ZlIEluc3RydWN0aW9ucworIworCiswLjYzLDYuRlJULDExLi8sMTYuRlJCLDIxLjcyLDMxLlJjOlg6Zjo6RmxvYXRpbmcgTW92ZSBSZWdpc3RlcgorKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA0LCAgNCwgIDAKKyo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisqNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKwkqZnJUID0gKmZyQjsKKwlDUjFfVVBEQVRFKFJjKTsKKwlQUENfSU5TTl9GTE9BVChGUlRfQklUTUFTSywgRlJCX0JJVE1BU0ssIFJjKTsKKworMC42Myw2LkZSVCwxMS4vLDE2LkZSQiwyMS40MCwzMS5SYzpYOmY6OkZsb2F0aW5nIE5lZ2F0ZQorKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA0LCAgNCwgIDAKKyo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisqNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKwkqZnJUID0gKmZyQiBeIEJJVDY0KDApOworCUNSMV9VUERBVEUoUmMpOworCVBQQ19JTlNOX0ZMT0FUKEZSVF9CSVRNQVNLLCBGUkJfQklUTUFTSywgUmMpOworCiswLjYzLDYuRlJULDExLi8sMTYuRlJCLDIxLjI2NCwzMS5SYzpYOmY6OkZsb2F0aW5nIEFic29sdXRlIFZhbHVlCisqNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDQsICA0LCAgMAorKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKyo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisqNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorCSpmclQgPSAqZnJCICYgfkJJVDY0KDApOworCUNSMV9VUERBVEUoUmMpOworCVBQQ19JTlNOX0ZMT0FUKEZSVF9CSVRNQVNLLCBGUkJfQklUTUFTSywgUmMpOworCiswLjYzLDYuRlJULDExLi8sMTYuRlJCLDIxLjEzNiwzMS5SYzpYOmY6OkZsb2F0aW5nIE5lZ2F0aXZlIEFic29sdXRlIFZhbHVlCisqNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDQsICA0LCAgMAorKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKyo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisqNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorCSpmclQgPSAqZnJCIHwgQklUNjQoMCk7CisJQ1IxX1VQREFURShSYyk7CisJUFBDX0lOU05fRkxPQVQoRlJUX0JJVE1BU0ssIEZSQl9CSVRNQVNLLCBSYyk7CisKKworIworIyBJLjQuNi41IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMgSW5zdHJ1Y3Rpb25zCisjCisKKzAuNjMsNi5GUlQsMTEuRlJBLDE2LkZSQiwyMS4vLDI2LjIxLDMxLlJjOkE6ZjpmYWRkOkZsb2F0aW5nIEFkZAorKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA0LCAgNCwgIDAKKyo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisqNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKwlGUFNDUl9CRUdJTjsKKwlpZiAoaXNfaW52YWxpZF9vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICpmckEsICpmckIsCisJICAgICAgICAgICAgICAgICAgICAgICAgIGZwc2NyX3Z4c25hbiB8IGZwc2NyX3Z4aXNpLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKnNpbmdsZT8qLworCSAgICAgICAgICAgICAgICAgICAgICAgICAwKSAvKm5lZ2F0ZT8qLykgeworCSAgaW52YWxpZF9hcml0aGVtZXRpY19vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmclQsICpmckEsICpmckIsIDAsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2Zyc3AqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzY0Yml0Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b18zMmJpdCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgLypzaW5nbGUtcHJlY2lzaW9uKi8KKwl9CisJZWxzZSB7CisJICAvKkhBQ0shKi8KKwkgIGRvdWJsZSBzID0gKihkb3VibGUqKWZyQSArICooZG91YmxlKilmckI7CisJICAqKGRvdWJsZSopZnJUID0gczsKKwl9CisJRlBTQ1JfRU5EKFJjKTsKKwlQUENfSU5TTl9GTE9BVChGUlRfQklUTUFTSywgRlJBX0JJVE1BU0sgfCBGUkJfQklUTUFTSywgUmMpOworCiswLjU5LDYuRlJULDExLkZSQSwxNi5GUkIsMjEuLywyNi4yMSwzMS5SYzpBOmY6ZmFkZHM6RmxvYXRpbmcgQWRkIFNpbmdsZQorKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA0LCAgNCwgIDAKKyo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisqNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKwlGUFNDUl9CRUdJTjsKKwlpZiAoaXNfaW52YWxpZF9vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICpmckEsICpmckIsCisJICAgICAgICAgICAgICAgICAgICAgICAgIGZwc2NyX3Z4c25hbiB8IGZwc2NyX3Z4aXNpLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAxLCAvKnNpbmdsZT8qLworCSAgICAgICAgICAgICAgICAgICAgICAgICAwKSAvKm5lZ2F0ZT8qLykgeworCSAgaW52YWxpZF9hcml0aGVtZXRpY19vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmclQsICpmckEsICpmckIsIDAsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2Zyc3AqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzY0Yml0Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b18zMmJpdCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsgLypzaW5nbGUtcHJlY2lzaW9uKi8KKwl9CisJZWxzZSB7CisJICAvKkhBQ0shKi8KKwkgIGZsb2F0IHMgPSAqKGRvdWJsZSopZnJBICsgKihkb3VibGUqKWZyQjsKKwkgICooZG91YmxlKilmclQgPSBzOworCX0KKwlGUFNDUl9FTkQoUmMpOworCVBQQ19JTlNOX0ZMT0FUKEZSVF9CSVRNQVNLLCBGUkFfQklUTUFTSyB8IEZSQl9CSVRNQVNLLCBSYyk7CisKKzAuNjMsNi5GUlQsMTEuRlJBLDE2LkZSQiwyMS4vLDI2LjIwLDMxLlJjOkE6Zjpmc3ViOkZsb2F0aW5nIFN1YnRyYWN0CisqNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDQsICA0LCAgMAorKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKyo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisqNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorCUZQU0NSX0JFR0lOOworCWlmIChpc19pbnZhbGlkX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgKmZyQSwgKmZyQiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgZnBzY3JfdnhzbmFuIHwgZnBzY3Jfdnhpc2ksCisJICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qc2luZ2xlPyovCisJICAgICAgICAgICAgICAgICAgICAgICAgIDEpIC8qbmVnYXRlPyovKSB7CisJICBpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyVCwgKmZyQSwgKmZyQiwgMCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfZnJzcCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fNjRiaXQqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzMyYml0Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvKnNpbmdsZS1wcmVjaXNpb24qLworCX0KKwllbHNlIHsKKwkgIC8qSEFDSyEqLworCSAgZG91YmxlIHMgPSAqKGRvdWJsZSopZnJBIC0gKihkb3VibGUqKWZyQjsKKwkgICooZG91YmxlKilmclQgPSBzOworCX0KKwlGUFNDUl9FTkQoUmMpOworCVBQQ19JTlNOX0ZMT0FUKEZSVF9CSVRNQVNLLCBGUkFfQklUTUFTSyB8IEZSQl9CSVRNQVNLLCBSYyk7CisKKzAuNTksNi5GUlQsMTEuRlJBLDE2LkZSQiwyMS4vLDI2LjIwLDMxLlJjOkE6Zjpmc3ViczpGbG9hdGluZyBTdWJ0cmFjdCBTaW5nbGUKKyo2MDE6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgNCwgIDQsICAwCisqNjAzOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorKjYwM2U6UFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKyo2MDQ6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisJRlBTQ1JfQkVHSU47CisJaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAqZnJBLCAqZnJCLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlzaSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLypzaW5nbGU/Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgMSkgLypuZWdhdGU/Ki8pIHsKKwkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJULCAqZnJBLCAqZnJCLCAwLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7IC8qc2luZ2xlLXByZWNpc2lvbiovCisJfQorCWVsc2UgeworCSAgLypIQUNLISovCisJICBmbG9hdCBzID0gKihkb3VibGUqKWZyQSAtICooZG91YmxlKilmckI7CisJICAqKGRvdWJsZSopZnJUID0gczsKKwl9CisJRlBTQ1JfRU5EKFJjKTsKKwlQUENfSU5TTl9GTE9BVChGUlRfQklUTUFTSywgRlJBX0JJVE1BU0sgfCBGUkJfQklUTUFTSywgUmMpOworCiswLjYzLDYuRlJULDExLkZSQSwxNi4vLDIxLkZSQywyNi4yNSwzMS5SYzpBOmY6Zm11bDpGbG9hdGluZyBNdWx0aXBseQorKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA1LCAgNSwgIDAKKyo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMiwgIDQsICAwCisqNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDIsICA0LCAgMAorKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKwlGUFNDUl9CRUdJTjsKKwlpZiAoaXNfaW52YWxpZF9vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICpmckEsICpmckMsCisJICAgICAgICAgICAgICAgICAgICAgICAgIGZwc2NyX3Z4c25hbiB8IGZwc2NyX3Z4aW16LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKnNpbmdsZT8qLworCSAgICAgICAgICAgICAgICAgICAgICAgICAwKSAvKm5lZ2F0ZT8qLykgeworCSAgaW52YWxpZF9hcml0aGVtZXRpY19vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmclQsICpmckEsIDAsICpmckMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2Zyc3AqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzY0Yml0Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b18zMmJpdCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgLypzaW5nbGUtcHJlY2lzaW9uKi8KKwl9CisJZWxzZSB7CisJICAvKkhBQ0shKi8KKwkgIGRvdWJsZSBzID0gKihkb3VibGUqKWZyQSAqICooZG91YmxlKilmckM7CisJICAqKGRvdWJsZSopZnJUID0gczsKKwl9CisJRlBTQ1JfRU5EKFJjKTsKKwlQUENfSU5TTl9GTE9BVChGUlRfQklUTUFTSywgRlJBX0JJVE1BU0sgfCBGUkNfQklUTUFTSywgUmMpOworCiswLjU5LDYuRlJULDExLkZSQSwxNi4vLDIxLkZSQywyNi4yNSwzMS5SYzpBOmY6Zm11bHM6RmxvYXRpbmcgTXVsdGlwbHkgU2luZ2xlCisqNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDQsICA0LCAgMAorKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKyo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisqNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorCUZQU0NSX0JFR0lOOworCWlmIChpc19pbnZhbGlkX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgKmZyQSwgKmZyQywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgZnBzY3JfdnhzbmFuIHwgZnBzY3JfdnhpbXosCisJICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qc2luZ2xlPyovCisJICAgICAgICAgICAgICAgICAgICAgICAgIDApIC8qbmVnYXRlPyovKSB7CisJICBpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyVCwgKmZyQSwgMCwgKmZyQywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfZnJzcCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fNjRiaXQqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzMyYml0Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAvKnNpbmdsZS1wcmVjaXNpb24qLworCX0KKwllbHNlIHsKKwkgIC8qSEFDSyEqLworCSAgZmxvYXQgcyA9ICooZG91YmxlKilmckEgKiAqKGRvdWJsZSopZnJDOworCSAgKihkb3VibGUqKWZyVCA9IHM7CisJfQorCUZQU0NSX0VORChSYyk7CisJUFBDX0lOU05fRkxPQVQoRlJUX0JJVE1BU0ssIEZSQV9CSVRNQVNLIHwgRlJDX0JJVE1BU0ssIFJjKTsKKworMC42Myw2LkZSVCwxMS5GUkEsMTYuRlJCLDIxLi8sMjYuMTgsMzEuUmM6QTpmOmZkaXY6RmxvYXRpbmcgRGl2aWRlCisqNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDMxLCAzMSwgMAorKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAzMywgMzMsIDAKKyo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMzMsIDMzLCAwCisqNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDMyLCAzMiwgMAorCUZQU0NSX0JFR0lOOworCWlmIChpc19pbnZhbGlkX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgKmZyQSwgKmZyQiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgZnBzY3JfdnhzbmFuIHwgZnBzY3Jfdnh6ZHosCisJICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qc2luZ2xlPyovCisJICAgICAgICAgICAgICAgICAgICAgICAgIDApIC8qbmVnYXRlPyovKSB7CisJICBpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyVCwgKmZyQSwgKmZyQiwgMCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfZnJzcCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fNjRiaXQqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzMyYml0Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvKnNpbmdsZS1wcmVjaXNpb24qLworCX0KKwllbHNlIGlmIChpc19pbnZhbGlkX3plcm9fZGl2aWRlIChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZnJBLCAqZnJCLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLypzaW5nbGU/Ki8pKSB7CisJICBpbnZhbGlkX3plcm9fZGl2aWRlX29wZXJhdGlvbiAocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJULCAqZnJBLCAqZnJCLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLypzaW5nbGU/Ki8pOworCX0KKwllbHNlIHsKKwkgIC8qSEFDSyEqLworCSAgZG91YmxlIHMgPSAqKGRvdWJsZSopZnJBIC8gKihkb3VibGUqKWZyQjsKKwkgICooZG91YmxlKilmclQgPSBzOworCX0KKwlGUFNDUl9FTkQoUmMpOworCVBQQ19JTlNOX0ZMT0FUKEZSVF9CSVRNQVNLLCBGUkFfQklUTUFTSyB8IEZSQl9CSVRNQVNLLCBSYyk7CisKKzAuNTksNi5GUlQsMTEuRlJBLDE2LkZSQiwyMS4vLDI2LjE4LDMxLlJjOkE6ZjpmZGl2czpGbG9hdGluZyBEaXZpZGUgU2luZ2xlCisqNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDE3LCAxNywgMAorKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxOCwgMTgsIDAKKyo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMTgsIDE4LCAwCisqNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDE4LCAxOCwgMAorCUZQU0NSX0JFR0lOOworCWlmIChpc19pbnZhbGlkX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgKmZyQSwgKmZyQiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgZnBzY3JfdnhzbmFuIHwgZnBzY3Jfdnh6ZHosCisJICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qc2luZ2xlPyovCisJICAgICAgICAgICAgICAgICAgICAgICAgIDApIC8qbmVnYXRlPyovKSB7CisJICBpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyVCwgKmZyQSwgKmZyQiwgMCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfZnJzcCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fNjRiaXQqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzMyYml0Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAvKnNpbmdsZS1wcmVjaXNpb24qLworCX0KKwllbHNlIGlmIChpc19pbnZhbGlkX3plcm9fZGl2aWRlIChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZnJBLCAqZnJCLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLypzaW5nbGU/Ki8pKSB7CisJICBpbnZhbGlkX3plcm9fZGl2aWRlX29wZXJhdGlvbiAocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJULCAqZnJBLCAqZnJCLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLypzaW5nbGU/Ki8pOworCX0KKwllbHNlIHsKKwkgIC8qSEFDSyEqLworCSAgZmxvYXQgcyA9ICooZG91YmxlKilmckEgLyAqKGRvdWJsZSopZnJCOworCSAgKihkb3VibGUqKWZyVCA9IHM7CisJfQorCUZQU0NSX0VORChSYyk7CisJUFBDX0lOU05fRkxPQVQoRlJUX0JJVE1BU0ssIEZSQV9CSVRNQVNLIHwgRlJCX0JJVE1BU0ssIFJjKTsKKworMC42Myw2LkZSVCwxMS5GUkEsMTYuRlJCLDIxLkZSQywyNi4yOSwzMS5SYzpBOmY6Zm1hZGQ6RmxvYXRpbmcgTXVsdGlwbHktQWRkCisqNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDUsICA1LCAgMAorKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAyLCAgNCwgIDAKKyo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMiwgIDQsICAwCisqNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorCUZQU0NSX0JFR0lOOworCWRvdWJsZSBwcm9kdWN0OyAvKkhBQ0shIC0gaW5jb3JyZWN0bHkgbG9vc2luZyBwcmVjaXNpb24gLi4uICovCisJLyogY29tcHV0ZSB0aGUgbXVsdGlwbHkgKi8KKwlpZiAoaXNfaW52YWxpZF9vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICpmckEsICpmckMsCisJICAgICAgICAgICAgICAgICAgICAgICAgIGZwc2NyX3Z4c25hbiB8IGZwc2NyX3Z4aW16LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKnNpbmdsZT8qLworCSAgICAgICAgICAgICAgICAgICAgICAgICAwKSAvKm5lZ2F0ZT8qLykgeworCSAgaW52YWxpZF9hcml0aGVtZXRpY19vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQ2NCopJnByb2R1Y3QsICpmckEsIDAsICpmckMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2Zyc3AqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzY0Yml0Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b18zMmJpdCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgLypzaW5nbGUtcHJlY2lzaW9uKi8KKwl9CisJZWxzZSB7CisJICAvKkhBQ0shKi8KKwkgIHByb2R1Y3QgPSAqKGRvdWJsZSopZnJBICogKihkb3VibGUqKWZyQzsKKwl9CisJLyogY29tcHV0ZSB0aGUgYWRkICovCisJaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LCAqZnJCLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlzaSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLypzaW5nbGU/Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgMCkgLypuZWdhdGU/Ki8pIHsKKwkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJULCBwcm9kdWN0LCAqZnJCLCAwLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qc2luZ2xlLXByZWNpc2lvbiovCisJfQorCWVsc2UgeworCSAgLypIQUNLISovCisJICBkb3VibGUgcyA9IHByb2R1Y3QgKyAqKGRvdWJsZSopZnJCOworCSAgKihkb3VibGUqKWZyVCA9IHM7CisJfQorCUZQU0NSX0VORChSYyk7CisJUFBDX0lOU05fRkxPQVQoRlJUX0JJVE1BU0ssIEZSQV9CSVRNQVNLIHwgRlJCX0JJVE1BU0sgfCBGUkNfQklUTUFTSywgUmMpOworCiswLjU5LDYuRlJULDExLkZSQSwxNi5GUkIsMjEuRlJDLDI2LjI5LDMxLlJjOkE6Zjo6RmxvYXRpbmcgTXVsdGlwbHktQWRkIFNpbmdsZQorKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA0LCAgNCwgIDAKKyo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisqNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKwlGUFNDUl9CRUdJTjsKKwlmbG9hdCBwcm9kdWN0OyAvKkhBQ0shIC0gaW5jb3JyZWN0bHkgbG9vc2luZyBwcmVjaXNpb24gLi4uICovCisJLyogY29tcHV0ZSB0aGUgbXVsdGlwbHkgKi8KKwlpZiAoaXNfaW52YWxpZF9vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICpmckEsICpmckMsCisJICAgICAgICAgICAgICAgICAgICAgICAgIGZwc2NyX3Z4c25hbiB8IGZwc2NyX3Z4aW16LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAxLCAvKnNpbmdsZT8qLworCSAgICAgICAgICAgICAgICAgICAgICAgICAwKSAvKm5lZ2F0ZT8qLykgeworCSAgaW52YWxpZF9hcml0aGVtZXRpY19vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQ2NCopJnByb2R1Y3QsICpmckEsIDAsICpmckMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2Zyc3AqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzY0Yml0Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b18zMmJpdCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgLypzaW5nbGUtcHJlY2lzaW9uKi8KKwl9CisJZWxzZSB7CisJICAvKkhBQ0shKi8KKwkgIHByb2R1Y3QgPSAqKGRvdWJsZSopZnJBICogKihkb3VibGUqKWZyQzsKKwl9CisJLyogY29tcHV0ZSB0aGUgYWRkICovCisJaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LCAqZnJCLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlzaSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLypzaW5nbGU/Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgMCkgLypuZWdhdGU/Ki8pIHsKKwkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJULCBwcm9kdWN0LCAqZnJCLCAwLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qc2luZ2xlLXByZWNpc2lvbiovCisJfQorCWVsc2UgeworCSAgLypIQUNLISovCisJICBmbG9hdCBzID0gcHJvZHVjdCArICooZG91YmxlKilmckI7CisJICAqKGRvdWJsZSopZnJUID0gKGRvdWJsZSlzOworCX0KKwlGUFNDUl9FTkQoUmMpOworCVBQQ19JTlNOX0ZMT0FUKEZSVF9CSVRNQVNLLCBGUkFfQklUTUFTSyB8IEZSQl9CSVRNQVNLIHwgRlJDX0JJVE1BU0ssIFJjKTsKKworMC42Myw2LkZSVCwxMS5GUkEsMTYuRlJCLDIxLkZSQywyNi4yOCwzMS5SYzpBOmY6OkZsb2F0aW5nIE11bHRpcGx5LVN1YnRyYWN0CisqNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDUsICA1LCAgMAorKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAyLCAgNCwgIDAKKyo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMiwgIDQsICAwCisqNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorCUZQU0NSX0JFR0lOOworCWRvdWJsZSBwcm9kdWN0OyAvKkhBQ0shIC0gaW5jb3JyZWN0bHkgbG9vc2luZyBwcmVjaXNpb24gLi4uICovCisJLyogY29tcHV0ZSB0aGUgbXVsdGlwbHkgKi8KKwlpZiAoaXNfaW52YWxpZF9vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICpmckEsICpmckMsCisJICAgICAgICAgICAgICAgICAgICAgICAgIGZwc2NyX3Z4c25hbiB8IGZwc2NyX3Z4aW16LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKnNpbmdsZT8qLworCSAgICAgICAgICAgICAgICAgICAgICAgICAwKSAvKm5lZ2F0ZT8qLykgeworCSAgaW52YWxpZF9hcml0aGVtZXRpY19vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQ2NCopJnByb2R1Y3QsICpmckEsIDAsICpmckMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2Zyc3AqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzY0Yml0Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b18zMmJpdCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgLypzaW5nbGUtcHJlY2lzaW9uKi8KKwl9CisJZWxzZSB7CisJICAvKkhBQ0shKi8KKwkgIHByb2R1Y3QgPSAqKGRvdWJsZSopZnJBICogKihkb3VibGUqKWZyQzsKKwl9CisJLyogY29tcHV0ZSB0aGUgc3VidHJhY3QgKi8KKwlpZiAoaXNfaW52YWxpZF9vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QsICpmckIsCisJICAgICAgICAgICAgICAgICAgICAgICAgIGZwc2NyX3Z4c25hbiB8IGZwc2NyX3Z4aXNpLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKnNpbmdsZT8qLworCSAgICAgICAgICAgICAgICAgICAgICAgICAwKSAvKm5lZ2F0ZT8qLykgeworCSAgaW52YWxpZF9hcml0aGVtZXRpY19vcGVyYXRpb24ocHJvY2Vzc29yLCBjaWEsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmclQsIHByb2R1Y3QsICpmckIsIDAsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2Zyc3AqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzY0Yml0Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b18zMmJpdCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgLypzaW5nbGUtcHJlY2lzaW9uKi8KKwl9CisJZWxzZSB7CisJICAvKkhBQ0shKi8KKwkgIGRvdWJsZSBzID0gcHJvZHVjdCAtICooZG91YmxlKilmckI7CisJICAqKGRvdWJsZSopZnJUID0gczsKKwl9CisJRlBTQ1JfRU5EKFJjKTsKKwlQUENfSU5TTl9GTE9BVChGUlRfQklUTUFTSywgRlJBX0JJVE1BU0sgfCBGUkJfQklUTUFTSyB8IEZSQ19CSVRNQVNLLCBSYyk7CisKKzAuNTksNi5GUlQsMTEuRlJBLDE2LkZSQiwyMS5GUkMsMjYuMjgsMzEuUmM6QTpmOjpGbG9hdGluZyBNdWx0aXBseS1TdWJ0cmFjdCBTaW5nbGUKKyo2MDE6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgNCwgIDQsICAwCisqNjAzOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorKjYwM2U6UFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKyo2MDQ6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisJRlBTQ1JfQkVHSU47CisJZmxvYXQgcHJvZHVjdDsgLypIQUNLISAtIGluY29ycmVjdGx5IGxvb3NpbmcgcHJlY2lzaW9uIC4uLiAqLworCS8qIGNvbXB1dGUgdGhlIG11bHRpcGx5ICovCisJaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAqZnJBLCAqZnJDLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlteiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLypzaW5nbGU/Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgMCkgLypuZWdhdGU/Ki8pIHsKKwkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkNjQqKSZwcm9kdWN0LCAqZnJBLCAwLCAqZnJDLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qc2luZ2xlLXByZWNpc2lvbiovCisJfQorCWVsc2UgeworCSAgLypIQUNLISovCisJICBwcm9kdWN0ID0gKihkb3VibGUqKWZyQSAqICooZG91YmxlKilmckM7CisJfQorCS8qIGNvbXB1dGUgdGhlIHN1YnRyYWN0ICovCisJaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LCAqZnJCLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlzaSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLypzaW5nbGU/Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgMCkgLypuZWdhdGU/Ki8pIHsKKwkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJULCBwcm9kdWN0LCAqZnJCLCAwLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qc2luZ2xlLXByZWNpc2lvbiovCisJfQorCWVsc2UgeworCSAgLypIQUNLISovCisJICBmbG9hdCBzID0gcHJvZHVjdCAtICooZG91YmxlKilmckI7CisJICAqKGRvdWJsZSopZnJUID0gKGRvdWJsZSlzOworCX0KKwlGUFNDUl9FTkQoUmMpOworCVBQQ19JTlNOX0ZMT0FUKEZSVF9CSVRNQVNLLCBGUkFfQklUTUFTSyB8IEZSQl9CSVRNQVNLIHwgRlJDX0JJVE1BU0ssIFJjKTsKKworMC42Myw2LkZSVCwxMS5GUkEsMTYuRlJCLDIxLkZSQywyNi4zMSwzMS5SYzpBOmY6OkZsb2F0aW5nIE5lZ2F0aXZlIE11bHRpcGx5LUFkZAorKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA1LCAgNSwgIDAKKyo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMiwgIDQsICAwCisqNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDIsICA0LCAgMAorKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKwlGUFNDUl9CRUdJTjsKKwlkb3VibGUgcHJvZHVjdDsgLypIQUNLISAtIGluY29ycmVjdGx5IGxvb3NpbmcgcHJlY2lzaW9uIC4uLiAqLworCS8qIGNvbXB1dGUgdGhlIG11bHRpcGx5ICovCisJaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAqZnJBLCAqZnJDLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlteiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLypzaW5nbGU/Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgMCkgLypuZWdhdGU/Ki8pIHsKKwkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkNjQqKSZwcm9kdWN0LCAqZnJBLCAwLCAqZnJDLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qc2luZ2xlLXByZWNpc2lvbiovCisJfQorCWVsc2UgeworCSAgLypIQUNLISovCisJICBwcm9kdWN0ID0gKihkb3VibGUqKWZyQSAqICooZG91YmxlKilmckM7CisJfQorCS8qIGNvbXB1dGUgdGhlIGFkZCAqLworCWlmIChpc19pbnZhbGlkX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCwgKmZyQiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgZnBzY3JfdnhzbmFuIHwgZnBzY3Jfdnhpc2ksCisJICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qc2luZ2xlPyovCisJICAgICAgICAgICAgICAgICAgICAgICAgIDApIC8qbmVnYXRlPyovKSB7CisJICBpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyVCwgcHJvZHVjdCwgKmZyQiwgMCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfZnJzcCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fNjRiaXQqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzMyYml0Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvKnNpbmdsZS1wcmVjaXNpb24qLworCX0KKwllbHNlIHsKKwkgIC8qSEFDSyEqLworCSAgZG91YmxlIHMgPSAtKHByb2R1Y3QgKyAqKGRvdWJsZSopZnJCKTsKKwkgICooZG91YmxlKilmclQgPSBzOworCX0KKwlGUFNDUl9FTkQoUmMpOworCVBQQ19JTlNOX0ZMT0FUKEZSVF9CSVRNQVNLLCBGUkFfQklUTUFTSyB8IEZSQl9CSVRNQVNLIHwgRlJDX0JJVE1BU0ssIFJjKTsKKworMC41OSw2LkZSVCwxMS5GUkEsMTYuRlJCLDIxLkZSQywyNi4zMSwzMS5SYzpBOmY6OkZsb2F0aW5nIE5lZ2F0aXZlIE11bHRpcGx5LUFkZCBTaW5nbGUKKyo2MDE6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgNCwgIDQsICAwCisqNjAzOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorKjYwM2U6UFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKyo2MDQ6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisJRlBTQ1JfQkVHSU47CisJZmxvYXQgcHJvZHVjdDsgLypIQUNLISAtIGluY29ycmVjdGx5IGxvb3NpbmcgcHJlY2lzaW9uIC4uLiAqLworCS8qIGNvbXB1dGUgdGhlIG11bHRpcGx5ICovCisJaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAqZnJBLCAqZnJDLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlteiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLypzaW5nbGU/Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgMCkgLypuZWdhdGU/Ki8pIHsKKwkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkNjQqKSZwcm9kdWN0LCAqZnJBLCAwLCAqZnJDLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qc2luZ2xlLXByZWNpc2lvbiovCisJfQorCWVsc2UgeworCSAgLypIQUNLISovCisJICBwcm9kdWN0ID0gKihkb3VibGUqKWZyQSAqICooZG91YmxlKilmckM7CisJfQorCS8qIGNvbXB1dGUgdGhlIGFkZCAqLworCWlmIChpc19pbnZhbGlkX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCwgKmZyQiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgZnBzY3JfdnhzbmFuIHwgZnBzY3Jfdnhpc2ksCisJICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qc2luZ2xlPyovCisJICAgICAgICAgICAgICAgICAgICAgICAgIDApIC8qbmVnYXRlPyovKSB7CisJICBpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyVCwgcHJvZHVjdCwgKmZyQiwgMCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfZnJzcCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fNjRiaXQqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzMyYml0Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvKnNpbmdsZS1wcmVjaXNpb24qLworCX0KKwllbHNlIHsKKwkgIC8qSEFDSyEqLworCSAgZmxvYXQgcyA9IC0ocHJvZHVjdCArICooZG91YmxlKilmckIpOworCSAgKihkb3VibGUqKWZyVCA9IChkb3VibGUpczsKKwl9CisJRlBTQ1JfRU5EKFJjKTsKKwlQUENfSU5TTl9GTE9BVChGUlRfQklUTUFTSywgRlJBX0JJVE1BU0sgfCBGUkJfQklUTUFTSyB8IEZSQ19CSVRNQVNLLCBSYyk7CisKKzAuNjMsNi5GUlQsMTEuRlJBLDE2LkZSQiwyMS5GUkMsMjYuMzAsMzEuUmM6QTpmOjpGbG9hdGluZyBOZWdhdGl2ZSBNdWx0aXBseS1TdWJ0cmFjdAorKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA1LCAgNSwgIDAKKyo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMiwgIDQsICAwCisqNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDIsICA0LCAgMAorKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKwlGUFNDUl9CRUdJTjsKKwlkb3VibGUgcHJvZHVjdDsgLypIQUNLISAtIGluY29ycmVjdGx5IGxvb3NpbmcgcHJlY2lzaW9uIC4uLiAqLworCS8qIGNvbXB1dGUgdGhlIG11bHRpcGx5ICovCisJaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAqZnJBLCAqZnJDLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlteiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLypzaW5nbGU/Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgMCkgLypuZWdhdGU/Ki8pIHsKKwkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkNjQqKSZwcm9kdWN0LCAqZnJBLCAwLCAqZnJDLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qc2luZ2xlLXByZWNpc2lvbiovCisJfQorCWVsc2UgeworCSAgLypIQUNLISovCisJICBwcm9kdWN0ID0gKihkb3VibGUqKWZyQSAqICooZG91YmxlKilmckM7CisJfQorCS8qIGNvbXB1dGUgdGhlIHN1YnRyYWN0ICovCisJaWYgKGlzX2ludmFsaWRfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LCAqZnJCLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBmcHNjcl92eHNuYW4gfCBmcHNjcl92eGlzaSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLypzaW5nbGU/Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgMCkgLypuZWdhdGU/Ki8pIHsKKwkgIGludmFsaWRfYXJpdGhlbWV0aWNfb3BlcmF0aW9uKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJULCBwcm9kdWN0LCAqZnJCLCAwLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19mcnNwKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfY29udmVydF90b182NGJpdCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fMzJiaXQqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8qc2luZ2xlLXByZWNpc2lvbiovCisJfQorCWVsc2UgeworCSAgLypIQUNLISovCisJICBkb3VibGUgcyA9IC0ocHJvZHVjdCAtICooZG91YmxlKilmckIpOworCSAgKihkb3VibGUqKWZyVCA9IHM7CisJfQorCUZQU0NSX0VORChSYyk7CisJUFBDX0lOU05fRkxPQVQoRlJUX0JJVE1BU0ssIEZSQV9CSVRNQVNLIHwgRlJCX0JJVE1BU0sgfCBGUkNfQklUTUFTSywgUmMpOworCiswLjU5LDYuRlJULDExLkZSQSwxNi5GUkIsMjEuRlJDLDI2LjMwLDMxLlJjOkE6Zjo6RmxvYXRpbmcgTmVnYXRpdmUgTXVsdGlwbHktU3VidHJhY3QgU2luZ2xlCisqNjAxOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDQsICA0LCAgMAorKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKyo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisqNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorCUZQU0NSX0JFR0lOOworCWZsb2F0IHByb2R1Y3Q7IC8qSEFDSyEgLSBpbmNvcnJlY3RseSBsb29zaW5nIHByZWNpc2lvbiAuLi4gKi8KKwkvKiBjb21wdXRlIHRoZSBtdWx0aXBseSAqLworCWlmIChpc19pbnZhbGlkX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgKmZyQSwgKmZyQywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgZnBzY3JfdnhzbmFuIHwgZnBzY3JfdnhpbXosCisJICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qc2luZ2xlPyovCisJICAgICAgICAgICAgICAgICAgICAgICAgIDApIC8qbmVnYXRlPyovKSB7CisJICBpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZDY0KikmcHJvZHVjdCwgKmZyQSwgMCwgKmZyQywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfZnJzcCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fNjRiaXQqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzMyYml0Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvKnNpbmdsZS1wcmVjaXNpb24qLworCX0KKwllbHNlIHsKKwkgIC8qSEFDSyEqLworCSAgcHJvZHVjdCA9ICooZG91YmxlKilmckEgKiAqKGRvdWJsZSopZnJDOworCX0KKwkvKiBjb21wdXRlIHRoZSBzdWJ0cmFjdCAqLworCWlmIChpc19pbnZhbGlkX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCwgKmZyQiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgZnBzY3JfdnhzbmFuIHwgZnBzY3Jfdnhpc2ksCisJICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qc2luZ2xlPyovCisJICAgICAgICAgICAgICAgICAgICAgICAgIDApIC8qbmVnYXRlPyovKSB7CisJICBpbnZhbGlkX2FyaXRoZW1ldGljX29wZXJhdGlvbihwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyVCwgcHJvZHVjdCwgKmZyQiwgMCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qaW5zdHJ1Y3Rpb25faXNfZnJzcCovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKmluc3RydWN0aW9uX2lzX2NvbnZlcnRfdG9fNjRiaXQqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyppbnN0cnVjdGlvbl9pc19jb252ZXJ0X3RvXzMyYml0Ki8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvKnNpbmdsZS1wcmVjaXNpb24qLworCX0KKwllbHNlIHsKKwkgIC8qSEFDSyEqLworCSAgZmxvYXQgcyA9IC0ocHJvZHVjdCAtICooZG91YmxlKilmckIpOworCSAgKihkb3VibGUqKWZyVCA9IChkb3VibGUpczsKKwl9CisJRlBTQ1JfRU5EKFJjKTsKKwlQUENfSU5TTl9GTE9BVChGUlRfQklUTUFTSywgRlJBX0JJVE1BU0sgfCBGUkJfQklUTUFTSyB8IEZSQ19CSVRNQVNLLCBSYyk7CisKKworIworIyBJLjQuNi42IEZsb2F0aW5nLVBvaW50IFJvdW5kaW5nIGFuZCBDb252ZXJzaW9uIEluc3RydWN0aW9ucworIworCiswLjYzLDYuRlJULDExLi8sMTYuRlJCLDIxLjEyLDMxLlJjOlg6Zjo6RmxvYXRpbmcgUm91bmQgdG8gU2luZ2xlLVByZWNpc2lvbgorKjYwMTogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICA0LCAgNCwgIDAKKyo2MDM6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisqNjAzZTpQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorKjYwNDogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKwlpbnQgc2lnbjsKKwlpbnQgZXhwOworCXVuc2lnbmVkNjQgZnJhY19ncng7CisJLyoqKi8KKwkgIC8qIHNwbGl0IG9mZiBjYXNlcyBmb3Igd2hhdCB0byBkbyAqLworCSAgaWYgKEVYVFJBQ1RFRDY0KCpmckIsIDEsIDExKSA8IDg5NworCSAgICAgICYmIEVYVFJBQ1RFRDY0KCpmckIsIDEsIDYzKSA+IDApIHsKKwkgICAgICBpZiAoKEZQU0NSICYgZnBzY3JfdWUpID09IDApIEdPVE8oRGlzYWJsZWRfRXhwb25lbnRfVW5kZXJmbG93KTsKKwkgICAgICBpZiAoKEZQU0NSICYgZnBzY3JfdWUpICE9IDApIEdPVE8oRW5hYmxlZF9FeHBvbmVudF9VbmRlcmZsb3cpOworCSAgfQorCSAgaWYgKEVYVFJBQ1RFRDY0KCpmckIsIDEsIDExKSA+IDExNTAKKwkgICAgICAmJiBFWFRSQUNURUQ2NCgqZnJCLCAxLCAxMSkgPCAyMDQ3KSB7CisJICAgICAgaWYgKChGUFNDUiAmIGZwc2NyX29lKSA9PSAwKSBHT1RPKERpc2FibGVkX0V4cG9uZW50X092ZXJmbG93KTsKKwkgICAgICBpZiAoKEZQU0NSICYgZnBzY3Jfb2UpICE9IDApIEdPVE8oRW5hYmxlZF9FeHBvbmVudF9PdmVyZmxvdyk7CisJICB9CisJICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMSwgMTEpID4gODk2CisJICAgICAgJiYgRVhUUkFDVEVENjQoKmZyQiwgMSwgMTEpIDwgMTE1MSkgR09UTyhOb3JtYWxfT3BlcmFuZCk7CisJICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMSwgNjMpID09IDApIEdPVE8oWmVyb19PcGVyYW5kKTsKKwkgIGlmIChFWFRSQUNURUQ2NCgqZnJCLCAxLCAxMSkgPT0gMjA0NykgeworCSAgICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMTIsIDYzKSA9PSAwKSBHT1RPKEluZmluaXR5X09wZXJhbmQpOworCSAgICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMTIsIDEyKSA9PSAxKSBHT1RPKFFOYU5fT3BlcmFuZCk7CisJICAgIGlmIChFWFRSQUNURUQ2NCgqZnJCLCAxMiwgMTIpID09IDAKKwkgICAgICAgICYmIEVYVFJBQ1RFRDY0KCpmckIsIDEzLCA2MykgPiAwKSBHT1RPKFNOYU5fT3BlcmFuZCk7CisJICB9CisJLyoqLworCUxBQkVMKERpc2FibGVkX0V4cG9uZW50X1VuZGVyZmxvdyk6CisJICBzaWduID0gRVhUUkFDVEVENjQoKmZyQiwgMCwgMCk7CisJICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMSwgMTEpID09IDApIHsKKwkgICAgZXhwID0gLTEwMjI7CisJICAgIGZyYWNfZ3J4ID0gSU5TRVJURUQ2NChFWFRSQUNURUQ2NCgqZnJCLCAxMiwgNjMpLCAxLCA1Mik7CisJICB9CisJICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMSwgMTEpID4gMCkgeworCSAgICBleHAgPSBFWFRSQUNURUQ2NCgqZnJCLCAxLCAxMSkgLSAxMDIzOworCSAgICBmcmFjX2dyeCA9IEJJVDY0KDApIHwgSU5TRVJURUQ2NChFWFRSQUNURUQ2NCgqZnJCLCAxMiwgNjMpLCAxLCA1Mik7CisJICB9CisJICAgIC8qIEd8UnxYID09IHplcm8gZnJvbSBhYm92ZSAqLworCSAgICB3aGlsZSAoZXhwIDwgLTEyNikgeworCSAgICAgIGV4cCA9IGV4cCAtIDE7CisJICAgICAgZnJhY19ncnggPSAoSU5TRVJURUQ2NChFWFRSQUNURUQ2NChmcmFjX2dyeCwgMCwgNTQpLCAxLCA1NSkKKwkgICAgICAgICAgICAgICAgICB8IE1BU0tFRDY0KGZyYWNfZ3J4LCA1NSwgNTUpKTsKKwkgICAgfQorCSAgRlBTQ1JfU0VUX1VYKEVYVFJBQ1RFRDY0KGZyYWNfZ3J4LCAyNCwgNTUpID4gMCk7CisJICBSb3VuZF9TaW5nbGUocHJvY2Vzc29yLCBzaWduLCAmZXhwLCAmZnJhY19ncngpOworCSAgRlBTQ1JfU0VUX1hYKEZQU0NSICYgZnBzY3JfZmkpOworCSAgaWYgKEVYVFJBQ1RFRDY0KGZyYWNfZ3J4LCAwLCA1MikgPT0gMCkgeworCSAgICAqZnJUID0gSU5TRVJURUQ2NChzaWduLCAwLCAwKTsKKwkgICAgaWYgKHNpZ24gPT0gMCkgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfcG9zX3plcm8pOworCSAgICBpZiAoc2lnbiA9PSAxKSBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9uZWdfemVybyk7CisJICB9CisJICBpZiAoRVhUUkFDVEVENjQoZnJhY19ncngsIDAsIDUyKSA+IDApIHsKKwkgICAgaWYgKEVYVFJBQ1RFRDY0KGZyYWNfZ3J4LCAwLCAwKSA9PSAxKSB7CisJICAgICAgaWYgKHNpZ24gPT0gMCkgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfcG9zX25vcm1hbF9udW1iZXIpOworCSAgICAgIGlmIChzaWduID09IDEpIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX25lZ19ub3JtYWxfbnVtYmVyKTsKKwkgICAgfQorCSAgICBpZiAoRVhUUkFDVEVENjQoZnJhY19ncngsIDAsIDApID09IDApIHsKKwkgICAgICBpZiAoc2lnbiA9PSAwKSBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9wb3NfZGVub3JtYWxpemVkX251bWJlcik7CisJICAgICAgaWYgKHNpZ24gPT0gMSkgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfbmVnX2Rlbm9ybWFsaXplZF9udW1iZXIpOworCSAgICB9CisJICAgIC8qTm9ybWFsaXplX09wZXJhbmQ6Ki8KKwkgICAgICB3aGlsZSAoRVhUUkFDVEVENjQoZnJhY19ncngsIDAsIDApID09IDApIHsKKwkgICAgICAgIGV4cCA9IGV4cCAtIDE7CisJICAgICAgICBmcmFjX2dyeCA9IElOU0VSVEVENjQoRVhUUkFDVEVENjQoZnJhY19ncngsIDEsICA1MiksIDAsIDUxKTsKKwkgICAgICB9CisJICAgICpmclQgPSAoSU5TRVJURUQ2NChzaWduLCAwLCAwKQorCSAgICAgICAgICAgIHwgSU5TRVJURUQ2NChleHAgKyAxMDIzLCAxLCAxMSkKKwkgICAgICAgICAgICB8IElOU0VSVEVENjQoRVhUUkFDVEVENjQoZnJhY19ncngsIDEsIDUyKSwgMTIsIDYzKSk7CisJICB9CisJICBHT1RPKERvbmUpOworCS8qKi8KKwlMQUJFTChFbmFibGVkX0V4cG9uZW50X1VuZGVyZmxvdyk6CisJICBGUFNDUl9TRVRfVVgoMSk7CisJICBzaWduID0gRVhUUkFDVEVENjQoKmZyQiwgMCwgMCk7CisJICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMSwgMTEpID09IDApIHsKKwkgICAgZXhwID0gLTEwMjI7CisJICAgIGZyYWNfZ3J4ID0gSU5TRVJURUQ2NChFWFRSQUNURUQ2NCgqZnJCLCAxMiwgNjMpLCAxLCA1Mik7CisJICB9CisJICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMSwgMTEpID4gMCkgeworCSAgICBleHAgPSBFWFRSQUNURUQ2NCgqZnJCLCAxLCAxMSkgLSAxMDIzOworCSAgICBmcmFjX2dyeCA9IChCSVQ2NCgwKSB8CisJICAgICAgICAgICAgICAgIElOU0VSVEVENjQoRVhUUkFDVEVENjQoKmZyQiwgMTIsIDYzKSwgMSwgNTIpKTsKKwkgIH0KKwkgIC8qTm9ybWFsaXplX09wZXJhbmQ6Ki8KKwkgICAgd2hpbGUgKEVYVFJBQ1RFRDY0KGZyYWNfZ3J4LCAwLCAwKSA9PSAwKSB7CisJICAgICAgZXhwID0gZXhwIC0gMTsKKwkgICAgICBmcmFjX2dyeCA9IElOU0VSVEVENjQoRVhUUkFDVEVENjQoZnJhY19ncngsIDEsIDUyKSwgMCwgNTEpOworCSAgICB9CisJICBSb3VuZF9TaW5nbGUocHJvY2Vzc29yLCBzaWduLCAmZXhwLCAmZnJhY19ncngpOworCSAgRlBTQ1JfU0VUX1hYKEZQU0NSICYgZnBzY3JfZmkpOworCSAgZXhwID0gZXhwICsgMTkyOworCSAgKmZyVCA9IChJTlNFUlRFRDY0KHNpZ24sIDAsIDApCisJICAgICAgICAgIHwgSU5TRVJURUQ2NChleHAgKyAxMDIzLCAxLCAxMSkKKwkgICAgICAgICAgfCBJTlNFUlRFRDY0KEVYVFJBQ1RFRDY0KGZyYWNfZ3J4LCAxLCA1MiksIDEyLCA2MykpOworCSAgaWYgKHNpZ24gPT0gMCkgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfcG9zX25vcm1hbF9udW1iZXIpOworCSAgaWYgKHNpZ24gPT0gMSkgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfbmVnX25vcm1hbF9udW1iZXIpOworCSAgR09UTyhEb25lKTsKKwkvKiovCisJTEFCRUwoRGlzYWJsZWRfRXhwb25lbnRfT3ZlcmZsb3cpOgorCSAgRlBTQ1JfU0VUX09YKDEpOworCSAgaWYgKChGUFNDUiAmIGZwc2NyX3JuKSA9PSBmcHNjcl9ybl9yb3VuZF90b19uZWFyZXN0KSB7CisJICAgIGlmIChFWFRSQUNURUQ2NCgqZnJCLCAwLCAwKSA9PSAwKSB7CisJICAgICAgKmZyVCA9IElOU0VSVEVENjQoMHg3RkYwMDAwMCwgMCwgMzEpIHwgMHgwMDAwMDAwMDsKKwkgICAgICBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9wb3NfaW5maW5pdHkpOworCSAgICB9CisJICAgIGlmIChFWFRSQUNURUQ2NCgqZnJCLCAwLCAwKSA9PSAxKSB7CisJICAgICAgKmZyVCA9IElOU0VSVEVENjQoMHhGRkYwMDAwMCwgMCwgMzEpIHwgMHgwMDAwMDAwMDsKKwkgICAgICBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9uZWdfaW5maW5pdHkpOworCSAgICB9CisJICB9CisJICBpZiAoKEZQU0NSICYgZnBzY3Jfcm4pID09IGZwc2NyX3JuX3JvdW5kX3Rvd2FyZHNfemVybykgeworCSAgICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMCwgMCkgPT0gMCkgeworCSAgICAgICpmclQgPSBJTlNFUlRFRDY0KDB4NDdFRkZGRkYsIDAsIDMxKSB8IDB4RTAwMDAwMDA7CisJICAgICAgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfcG9zX25vcm1hbF9udW1iZXIpOworCSAgICB9CisJICAgIGlmIChFWFRSQUNURUQ2NCgqZnJCLCAwLCAwKSA9PSAxKSB7CisJICAgICAgKmZyVCA9IElOU0VSVEVENjQoMHhDN0VGRkZGRiwgMCwgMzEpIHwgMHhFMDAwMDAwMDsKKwkgICAgICBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9uZWdfbm9ybWFsX251bWJlcik7CisJICAgIH0KKwkgIH0KKwkgIGlmICgoRlBTQ1IgJiBmcHNjcl9ybikgPT0gZnBzY3Jfcm5fcm91bmRfdG93YXJkc19wb3NfaW5maW5pdHkpIHsKKwkgICAgaWYgKEVYVFJBQ1RFRDY0KCpmckIsIDAsIDApID09IDApIHsKKwkgICAgICAqZnJUID0gSU5TRVJURUQ2NCgweDdGRjAwMDAwLCAwLCAzMSkgfCAweDAwMDAwMDAwOworCSAgICAgIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX3Bvc19pbmZpbml0eSk7CisJICAgIH0KKwkgICAgaWYgKEVYVFJBQ1RFRDY0KCpmckIsIDAsIDApID09IDEpIHsKKwkgICAgICAqZnJUID0gSU5TRVJURUQ2NCgweEM3RUZGRkZGLCAwLCAzMSkgfCAweEUwMDAwMDAwOworCSAgICAgIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX25lZ19ub3JtYWxfbnVtYmVyKTsKKwkgICAgfQorCSAgfQorCSAgaWYgKChGUFNDUiAmIGZwc2NyX3JuKSA9PSBmcHNjcl9ybl9yb3VuZF90b3dhcmRzX25lZ19pbmZpbml0eSkgeworCSAgICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMCwgMCkgPT0gMCkgeworCSAgICAgICpmclQgPSBJTlNFUlRFRDY0KDB4NDdFRkZGRkYsIDAsIDMxKSB8IDB4RTAwMDAwMDA7CisJICAgICAgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfcG9zX25vcm1hbF9udW1iZXIpOworCSAgICB9CisJICAgIGlmIChFWFRSQUNURUQ2NCgqZnJCLCAwLCAwKSA9PSAxKSB7CisJICAgICAgKmZyVCA9IElOU0VSVEVENjQoMHhGRkYwMDAwMCwgMCwgMzEpIHwgMHgwMDAwMDAwMDsKKwkgICAgICBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9uZWdfaW5maW5pdHkpOworCSAgICB9CisJICB9CisJICAvKiBGUFNDUltGUl0gPC0gdW5kZWZpbmVkICovCisJICBGUFNDUl9TRVRfRkkoMSk7CisJICBGUFNDUl9TRVRfWFgoMSk7CisJICBHT1RPKERvbmUpOworCS8qKi8KKwlMQUJFTChFbmFibGVkX0V4cG9uZW50X092ZXJmbG93KToKKwkgIHNpZ24gPSBFWFRSQUNURUQ2NCgqZnJCLCAwLCAwKTsKKwkgIGV4cCA9IEVYVFJBQ1RFRDY0KCpmckIsIDEsIDExKSAtIDEwMjM7CisJICBmcmFjX2dyeCA9IEJJVDY0KDApIHwgSU5TRVJURUQ2NChFWFRSQUNURUQ2NCgqZnJCLCAxMiwgNjMpLCAxLCA1Mik7CisJICBSb3VuZF9TaW5nbGUocHJvY2Vzc29yLCBzaWduLCAmZXhwLCAmZnJhY19ncngpOworCSAgRlBTQ1JfU0VUX1hYKEZQU0NSICYgZnBzY3JfZmkpOworCS8qKi8KKwlMQUJFTChFbmFibGVkX092ZXJmbG93KToKKwkgIEZQU0NSX1NFVF9PWCgxKTsKKwkgIGV4cCA9IGV4cCAtIDE5MjsKKwkgICpmclQgPSAoSU5TRVJURUQ2NChzaWduLCAwLCAwKQorCSAgICAgICAgICB8IElOU0VSVEVENjQoZXhwICsgMTAyMywgMSwgMTEpCisJICAgICAgICAgIHwgSU5TRVJURUQ2NChFWFRSQUNURUQ2NChmcmFjX2dyeCwgMSwgNTIpLCAxMiwgNjMpKTsKKwkgIGlmIChzaWduID09IDApIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX3Bvc19ub3JtYWxfbnVtYmVyKTsKKwkgIGlmIChzaWduID09IDEpIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX25lZ19ub3JtYWxfbnVtYmVyKTsKKwkgIEdPVE8oRG9uZSk7CisJLyoqLworCUxBQkVMKFplcm9fT3BlcmFuZCk6CisJICAqZnJUID0gKmZyQjsKKwkgIGlmIChFWFRSQUNURUQ2NCgqZnJCLCAwLCAwKSA9PSAwKSBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9wb3NfemVybyk7CisJICBpZiAoRVhUUkFDVEVENjQoKmZyQiwgMCwgMCkgPT0gMSkgRlBTQ1JfU0VUX0ZQUkYoZnBzY3JfcmZfbmVnX3plcm8pOworCSAgRlBTQ1JfU0VUX0ZSKDApOworCSAgRlBTQ1JfU0VUX0ZJKDApOworCSAgR09UTyhEb25lKTsKKwkvKiovCisJTEFCRUwoSW5maW5pdHlfT3BlcmFuZCk6CisJICAqZnJUID0gKmZyQjsKKwkgIGlmIChFWFRSQUNURUQ2NCgqZnJCLCAwLCAwKSA9PSAwKSBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9wb3NfaW5maW5pdHkpOworCSAgaWYgKEVYVFJBQ1RFRDY0KCpmckIsIDAsIDApID09IDEpIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX25lZ19pbmZpbml0eSk7CisJICBGUFNDUl9TRVRfRlIoMCk7CisJICBGUFNDUl9TRVRfRkkoMCk7CisJICBHT1RPKERvbmUpOworCS8qKi8KKwlMQUJFTChRTmFOX09wZXJhbmQpOgorCSAgKmZyVCA9IElOU0VSVEVENjQoRVhUUkFDVEVENjQoKmZyQiwgMCwgMzQpLCAwLCAzNCk7CisJICBGUFNDUl9TRVRfRlBSRihmcHNjcl9yZl9xdWlldF9uYW4pOworCSAgRlBTQ1JfU0VUX0ZSKDApOworCSAgRlBTQ1JfU0VUX0ZJKDApOworCSAgR09UTyhEb25lKTsKKwkvKiovCisJTEFCRUwoU05hTl9PcGVyYW5kKToKKwkgIEZQU0NSX09SX1ZYKGZwc2NyX3Z4c25hbik7CisJICBpZiAoKEZQU0NSICYgZnBzY3JfdmUpID09IDApIHsKKwkgICAgKmZyVCA9IChNQVNLRUQ2NCgqZnJCLCAwLCAxMSkKKwkgICAgICAgICAgICB8IEJJVDY0KDEyKQorCSAgICAgICAgICAgIHwgTUFTS0VENjQoKmZyQiwgMTMsIDM0KSk7CisJICAgIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX3F1aWV0X25hbik7CisJICB9CisJICBGUFNDUl9TRVRfRlIoMCk7CisJICBGUFNDUl9TRVRfRkkoMCk7CisJICBHT1RPKERvbmUpOworCS8qKi8KKwlMQUJFTChOb3JtYWxfT3BlcmFuZCk6CisJICBzaWduID0gRVhUUkFDVEVENjQoKmZyQiwgMCwgMCk7CisJICBleHAgPSBFWFRSQUNURUQ2NCgqZnJCLCAxLCAxMSkgLSAxMDIzOworCSAgZnJhY19ncnggPSBCSVQ2NCgwKSB8IElOU0VSVEVENjQoRVhUUkFDVEVENjQoKmZyQiwgMTIsIDYzKSwgMSwgNTIpOworCSAgUm91bmRfU2luZ2xlKHByb2Nlc3Nvciwgc2lnbiwgJmV4cCwgJmZyYWNfZ3J4KTsKKwkgIEZQU0NSX1NFVF9YWChGUFNDUiAmIGZwc2NyX2ZpKTsKKwkgIGlmIChleHAgPiAxMjcgJiYgKEZQU0NSICYgZnBzY3Jfb2UpID09IDApIEdPVE8oRGlzYWJsZWRfRXhwb25lbnRfT3ZlcmZsb3cpOworCSAgaWYgKGV4cCA+IDEyNyAmJiAoRlBTQ1IgJiBmcHNjcl9vZSkgIT0gMCkgR09UTyhFbmFibGVkX092ZXJmbG93KTsKKwkgICpmclQgPSAoSU5TRVJURUQ2NChzaWduLCAwLCAwKQorCSAgICAgICAgICB8IElOU0VSVEVENjQoZXhwICsgMTAyMywgMSwgMTEpCisJICAgICAgICAgIHwgSU5TRVJURUQ2NChFWFRSQUNURUQ2NChmcmFjX2dyeCwgMSwgNTIpLCAxMiwgNjMpKTsKKwkgIGlmIChzaWduID09IDApIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX3Bvc19ub3JtYWxfbnVtYmVyKTsKKwkgIGlmIChzaWduID09IDEpIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX25lZ19ub3JtYWxfbnVtYmVyKTsKKwkgIEdPVE8oRG9uZSk7CisJLyoqLworCUxBQkVMKERvbmUpOgorCSAgUFBDX0lOU05fRkxPQVQoRlJUX0JJVE1BU0ssIEZSQl9CSVRNQVNLLCBSYyk7CisKKworMC42Myw2LkZSVCwxMS4vLDE2LkZSQiwyMS44MTQsMzEuUmM6WDo2NCxmOjpGbG9hdGluZyBDb252ZXJ0IFRvIEludGVnZXIgRG91Ymxld29yZAorCWZsb2F0aW5nX3BvaW50X2Fzc2lzdF9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEpOworCiswLjYzLDYuRlJULDExLi8sMTYuRlJCLDIxLjgxNSwzMS5SYzpYOjY0LGY6OkZsb2F0aW5nIENvbnZlcnQgVG8gSW50ZWdlciBEb3VibGV3b3JkIHdpdGggcm91bmQgdG93YXJkcyBaZXJvCisJZmxvYXRpbmdfcG9pbnRfYXNzaXN0X2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSk7CisKKzAuNjMsNi5GUlQsMTEuLywxNi5GUkIsMjEuMTQsMzEuUmM6WDpmOjpGbG9hdGluZyBDb252ZXJ0IFRvIEludGVnZXIgV29yZAorCWZsb2F0aW5nX3BvaW50X2Fzc2lzdF9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEpOworCiswLjYzLDYuRlJULDExLi8sMTYuRlJCLDIxLjE1LDMxLlJjOlg6ZjpmY3Rpd3o6RmxvYXRpbmcgQ29udmVydCBUbyBJbnRlZ2VyIFdvcmQgd2l0aCByb3VuZCB0b3dhcmRzIFplcm8KKyo2MDE6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgNCwgIDQsICAwCisqNjAzOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorKjYwM2U6UFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKyo2MDQ6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisJRlBTQ1JfQkVHSU47CisJY29udmVydF90b19pbnRlZ2VyKHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICBmclQsICpmckIsCisJICAgICAgICAgICAgICAgICAgIGZwc2NyX3JuX3JvdW5kX3Rvd2FyZHNfemVybywgMzIpOworCUZQU0NSX0VORChSYyk7CisJUFBDX0lOU05fRkxPQVQoRlJUX0JJVE1BU0ssIEZSQl9CSVRNQVNLLCBSYyk7CisKKzAuNjMsNi5GUlQsMTEuLywxNi5GUkIsMjEuODQ2LDMxLlJjOlg6NjQsZjo6RmxvYXRpbmcgQ29udmVydCBmcm9tIEludGVnZXIgRG91Ymxld29yZAorCWludCBzaWduID0gRVhUUkFDVEVENjQoKmZyQiwgMCwgMCk7CisJaW50IGV4cCA9IDYzOworCXVuc2lnbmVkNjQgZnJhYyA9ICpmckI7CisJLyoqKi8KKwkgIGlmIChmcmFjID09IDApIEdPVE8oWmVyb19PcGVyYW5kKTsKKwkgIGlmIChzaWduID09IDEpIGZyYWMgPSB+ZnJhYyArIDE7CisJICB3aGlsZSAoRVhUUkFDVEVENjQoZnJhYywgMCwgMCkgPT0gMCkgeworCSAgICAvKj8/PyBkbyB0aGUgbG9vcCAwIHRpbWVzIGlmIChGUkIpID0gbWF4IG5lZ2F0aXZlIGludGVnZXIgKi8KKwkgICAgZnJhYyA9IElOU0VSVEVENjQoRVhUUkFDVEVENjQoZnJhYywgMSwgNjMpLCAwLCA2Mik7CisJICAgIGV4cCA9IGV4cCAtIDE7CisJICB9CisJICBSb3VuZF9GbG9hdChwcm9jZXNzb3IsIHNpZ24sICZleHAsICZmcmFjLCBGUFNDUiAmIGZwc2NyX3JuKTsKKwkgIGlmIChzaWduID09IDApIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX3Bvc19ub3JtYWxfbnVtYmVyKTsKKwkgIGlmIChzaWduID09IDEpIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX3Bvc19ub3JtYWxfbnVtYmVyKTsKKwkgICpmclQgPSAoSU5TRVJURUQ2NChzaWduLCAwLCAwKQorCSAgICAgICAgICB8IElOU0VSVEVENjQoZXhwICsgMTAyMywgMSwgMTEpCisJICAgICAgICAgIHwgSU5TRVJURUQ2NChFWFRSQUNURUQ2NChmcmFjLCAxLCA1MiksIDEyLCA2MykpOworCSAgR09UTyhEb25lKTsKKwkvKiovCisJTEFCRUwoWmVyb19PcGVyYW5kKToKKwkgIEZQU0NSX1NFVF9GUigwKTsKKwkgIEZQU0NSX1NFVF9GSSgwKTsKKwkgIEZQU0NSX1NFVF9GUFJGKGZwc2NyX3JmX3Bvc196ZXJvKTsKKwkgICpmclQgPSAwOworCSAgR09UTyhEb25lKTsKKwkvKiovCisJTEFCRUwoRG9uZSk6CisJICBQUENfSU5TTl9GTE9BVChGUlRfQklUTUFTSywgRlJCX0JJVE1BU0ssIFJjKTsKKworCisjCisjIEkuNC42LjcgRmxvYXRpbmctUG9pbnQgQ29tcGFyZSBJbnN0cnVjdGlvbnMKKyMKKworMC42Myw2LkJGLDkuLywxMS5GUkEsMTYuRlJCLDIxLjAsMzEuLzpYOmY6ZmNtcHU6RmxvYXRpbmcgQ29tcGFyZSBVbm9yZGVyZWQKKyo2MDE6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgNCwgIDQsICAwCisqNjAzOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorKjYwM2U6UFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKyo2MDQ6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisJRlBTQ1JfQkVHSU47CisJdW5zaWduZWQgYzsKKwlpZiAoaXNfTmFOKCpmckEsIDApIHx8IGlzX05hTigqZnJCLCAwKSkKKwkgIGMgPSBjcl9pX3N1bW1hcnlfb3ZlcmZsb3c7IC8qIDBiMDAwMSAtIChGUkEpID8gKEZSQikgKi8KKwllbHNlIGlmIChpc19sZXNzX3RoYW4oZnJBLCBmckIpKQorCSAgYyA9IGNyX2lfbmVnYXRpdmU7IC8qIDBiMTAwMCAtIChGUkEpIDwgKEZSQikgKi8KKwllbHNlIGlmIChpc19ncmVhdGVyX3RoYW4oZnJBLCBmckIpKQorCSAgYyA9IGNyX2lfcG9zaXRpdmU7IC8qIDBiMDEwMCAtIChGUkEpID4gKEZSQikgKi8KKwllbHNlCisJICBjID0gY3JfaV96ZXJvOyAvKiAwYjAwMTAgLSAoRlJBKSA9IChGUkIpICovCisJRlBTQ1JfU0VUX0ZQQ0MoYyk7CisJQ1JfU0VUKEJGLCBjKTsgLyogQ1JbNCpCRi4uNCpCRiszXSA9IGMgKi8KKwlpZiAoaXNfU05hTigqZnJBLCAwKSB8fCBpc19TTmFOKCpmckIsIDApKQorCSAgRlBTQ1JfT1JfVlgoZnBzY3JfdnhzbmFuKTsKKwlGUFNDUl9FTkQoMCk7CisJUFBDX0lOU05fRkxPQVRfQ1IoMCwgRlJBX0JJVE1BU0sgfCBGUkJfQklUTUFTSywgQkZfQklUTUFTSyk7CisKKzAuNjMsNi5CRiw5Li8sMTEuRlJBLDE2LkZSQiwyMS4zMiwzMS4vOlg6ZjpmY21wbzpGbG9hdGluZyBDb21wYXJlIE9yZGVyZWQKKyo2MDE6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgNCwgIDQsICAwCisqNjAzOiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorKjYwM2U6UFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKyo2MDQ6IFBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisJRlBTQ1JfQkVHSU47CisJdW5zaWduZWQgYzsKKwlpZiAoaXNfTmFOKCpmckEsIDApIHx8IGlzX05hTigqZnJCLCAwKSkKKwkgIGMgPSBjcl9pX3N1bW1hcnlfb3ZlcmZsb3c7IC8qIDBiMDAwMSAtIChGUkEpID8gKEZSQikgKi8KKwllbHNlIGlmIChpc19sZXNzX3RoYW4oZnJBLCBmckIpKQorCSAgYyA9IGNyX2lfbmVnYXRpdmU7IC8qIDBiMTAwMCAtIChGUkEpIDwgKEZSQikgKi8KKwllbHNlIGlmIChpc19ncmVhdGVyX3RoYW4oZnJBLCBmckIpKQorCSAgYyA9IGNyX2lfcG9zaXRpdmU7IC8qIDBiMDEwMCAtIChGUkEpID4gKEZSQikgKi8KKwllbHNlCisJICBjID0gY3JfaV96ZXJvOyAvKiAwYjAwMTAgLSAoRlJBKSA9IChGUkIpICovCisJRlBTQ1JfU0VUX0ZQQ0MoYyk7CisJQ1JfU0VUKEJGLCBjKTsgLyogQ1JbNCpCRi4uNCpCRiszXSA9IGMgKi8KKwlpZiAoaXNfU05hTigqZnJBLCAwKSB8fCBpc19TTmFOKCpmckIsIDApKSB7CisJICBGUFNDUl9PUl9WWChmcHNjcl92eHNuYW4pOworCSAgaWYgKChGUFNDUiAmIGZwc2NyX3ZlKSA9PSAwKQorCSAgICBGUFNDUl9PUl9WWChmcHNjcl92eHZjKTsKKwl9CisJZWxzZSBpZiAoaXNfUU5hTigqZnJBLCAwKSB8fCBpc19RTmFOKCpmckIsIDApKSB7CisJICBGUFNDUl9PUl9WWChmcHNjcl92eHZjKTsKKwl9CisJRlBTQ1JfRU5EKDApOworCVBQQ19JTlNOX0ZMT0FUX0NSKDAsIEZSQV9CSVRNQVNLIHwgRlJCX0JJVE1BU0ssIEJGX0JJVE1BU0spOworCisKKyMKKyMgSS40LjYuOCBGbG9hdGluZy1Qb2ludCBTdGF0dXMgYW5kIENvbnRyb2wgUmVnaXN0ZXIgSW5zdHJ1Y3Rpb25zCisjCisKKzAuNjMsNi5GUlQsMTEuLywxNi4vLDIxLjU4MywzMS5SYzpYOmY6Ok1vdmUgRnJvbSBGUFNDUgorCUZQU0NSX0JFR0lOOworCSpmclQgPSBGUFNDUjsKKwlGUFNDUl9FTkQoUmMpOworCiswLjYzLDYuQkYsOS4vLDExLkJGQSwxNC4vLDE2Li8sMjEuNjQsMzEuLzpYOmY6Ok1vdmUgdG8gQ29uZGl0aW9uIFJlZ2lzdGVyIGZyb20gRlBTQ1IKKwlGUFNDUl9CRUdJTjsKKwl1bnNpZ25lZCBmaWVsZCA9IEZQU0NSX0ZJRUxEKEJGQSk7CisJQ1JfU0VUKEJGLCBmaWVsZCk7CisJRlBTQ1JfU0VUKEJGQSwgMCk7IC8qIEZQU0NSX0VORCBmaXhlcyB1cCBGRVgvVlggKi8KKwlGUFNDUl9FTkQoMCk7CisKKzAuNjQsNi5CRiw5Li8sMTEuLywxNi5VLDIwLi8sMjEuMTM0LDMxLlJjOlg6Zjo6TW92ZSBUbyBGUFNDUiBGaWVsZCBJbW1lZGlhdGUKKwlGUFNDUl9CRUdJTjsKKwlGUFNDUl9TRVQoQkYsIFUpOworCUZQU0NSX0VORChSYyk7CisKKzAuNjMsNi4vLDcuRkxNLDE1Li8sMTYuRlJCLDIxLjcxMSwzMS5SYzpYRkw6Zjo6TW92ZSBUbyBGUFNDUiBGaWVsZHMKKwlGUFNDUl9CRUdJTjsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJICBpZiAoKEZMTSAmIEJJVDgoaSkpKSB7CisJICAgIEZQU0NSICY9IH5NQVNLMzIoaSo0LCBpKjQrMyk7CisJICAgIEZQU0NSIHw9IE1BU0tFRDMyKCpmckIsIGkqNCwgaSo0KzMpOworCSAgfQorCX0KKwlGUFNDUl9FTkQoUmMpOworCiswLjYzLDYuQlQsMTEuLywxNi4vLDIxLjcwLDMxLlJjOlg6Zjo6TW92ZSBUbyBGUFNDUiBCaXQgMAorCUZQU0NSX0JFR0lOOworCXVuc2lnbmVkMzIgYml0ID0gQklUMzIoQlQpOworCUZQU0NSICY9IH5iaXQ7CisJRlBTQ1JfRU5EKFJjKTsKKworMC42Myw2LkJULDExLi8sMTYuLywyMS4zOCwzMS5SYzpYOmY6Ok1vdmUgVG8gRlBTQ1IgQml0IDEKKwlGUFNDUl9CRUdJTjsKKwl1bnNpZ25lZDMyIGJpdCA9IEJJVDMyKEJUKTsKKwlpZiAoYml0ICYgZnBzY3JfZmkpCisJICBiaXQgfD0gZnBzY3JfeHg7CisJaWYgKChiaXQgJiBmcHNjcl92eF9iaXRzKSkKKwkgIGJpdCB8PSBmcHNjcl9meDsKKwkvKiBub3RlIC0gb21pdCB2eCBiaXQgKi8KKwlpZiAoKGJpdCAmIChmcHNjcl9veCB8IGZwc2NyX3V4IHwgZnBzY3JfenggfCBmcHNjcl94eCkpKQorCSAgYml0IHw9IGZwc2NyX2Z4OworCUZQU0NSIHw9IGJpdDsKKwlGUFNDUl9FTkQoUmMpOworCisKKyMKKyMgSS5BLjEuMSBGbG9hdGluZy1Qb2ludCBTdG9yZSBJbnN0cnVjdGlvbgorIworMC4zMSw2LkZSUywxMS5SQSwxNi5SQiwyMS45ODMsMzEuLzpYOmYsbzo6U3RvcmUgRmxvYXRpbmctUG9pbnQgYXMgSW50ZWdlciBXb3JkIEluZGV4ZWQKKwlwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwgb3B0aW9uYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCisjCisjIEkuQS4xLjIgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYyBJbnN0cnVjdGlvbnMKKyMKKworMC42Myw2LkZSVCwxMS4vLDE2LkZSQiwyMS4vLDI2LjIyLDMxLlJjOkE6ZixvOjpGbG9hdGluZyBTcXVhcmUgUm9vdAorCXByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBvcHRpb25hbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisKKzAuNTksNi5GUlQsMTEuLywxNi5GUkIsMjEuLywyNi4yMiwzMS5SYzpBOmYsbzo6RmxvYXRpbmcgU3F1YXJlIFJvb3QgU2luZ2xlCisJcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIG9wdGlvbmFsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKKworMC41OSw2LkZSVCwxMS4vLDE2LkZSQiwyMS4vLDI2LjI0LDMxLlJjOkE6ZixvOjpGbG9hdGluZyBSZWNpcHJvY2FsIEVzdGltYXRlIFNpbmdsZQorCXByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBvcHRpb25hbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisKKzAuNjMsNi5GUlQsMTEuLywxNi5GUkIsMjEuLywyNi4yNiwzMS5SYzpBOmYsbzo6RmxvYXRpbmcgUmVjaXByb2NhbCBTcXVhcmUgUm9vdCBFc3RpbWF0ZQorCXByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBvcHRpb25hbF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisKKyMKKyMgSS5BLjEuMyBGbG9hdGluZy1Qb2ludCBTZWxlY3QgSW5zdHJ1Y3Rpb24KKyMKKworMC42Myw2LkZSVCwxMS5GUkEsMTYuRlJCLDIxLkZSQywyNi4yMywzMS5SYzpBOmYsbzo6RmxvYXRpbmcgU2VsZWN0CisqNjAxOiBQUENfVU5JVF9CQUQsICAgUFBDX1VOSVRfQkFELCAgIDAsICAwLCAgMAorKjYwMzogUFBDX1VOSVRfRlBVLCAgIFBQQ19VTklUX0ZQVSwgICAxLCAgMywgIDAKKyo2MDNlOlBQQ19VTklUX0ZQVSwgICBQUENfVU5JVF9GUFUsICAgMSwgIDMsICAwCisqNjA0OiBQUENfVU5JVF9GUFUsICAgUFBDX1VOSVRfRlBVLCAgIDEsICAzLCAgMAorCWlmIChDVVJSRU5UX01PREVMID09IE1PREVMX3BwYzYwMSkgeworCSAgcHJvZ3JhbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIG9wdGlvbmFsX2luc3RydWN0aW9uX3Byb2dyYW1faW50ZXJydXB0KTsKKwl9IGVsc2UgeworCSAgdW5zaWduZWQ2NCB6ZXJvID0gMDsKKwkgIEZQU0NSX0JFR0lOOworCSAgaWYgKGlzX05hTigqZnJBLCAwKSB8fCBpc19sZXNzX3RoYW4gKGZyQSwgJnplcm8pKSAqZnJUID0gKmZyQjsKKwkgIGVsc2UJCQkJCQkgICAgKmZyVCA9ICpmckM7CisJICBGUFNDUl9FTkQoUmMpOworCSAgUFBDX0lOU05fRkxPQVQoRlJUX0JJVE1BU0ssIEZSQV9CSVRNQVNLIHwgRlJCX0JJVE1BU0sgfCBGUkNfQklUTUFTSywgUmMpOworCX0KKworIworIyBJSS4zLjIgQ2FjaGUgTWFuYWdlbWVudCBJbnN0cnVjdGlvbnMKKyMKKworMC4zMSw2Li8sMTEuUkEsMTYuUkIsMjEuOTgyLDMxLi86WDo6aWNiaTpJbnN0cnVjdGlvbiBDYWNoZSBCbG9jayBJbnZhbGlkYXRlCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAxLCAgMAorCS8qIGJsaW5kbHkgZmx1c2ggYWxsIGluc3RydWN0aW9uIGNhY2hlIGVudHJpZXMgKi8KKwkjaWYgV0lUSF9JREVDT0RFX0NBQ0hFX1NJWkUKKwljcHVfZmx1c2hfaWNhY2hlKHByb2Nlc3Nvcik7CisJI2VuZGlmCisJUFBDX0lOU05fSU5UKDAsIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSywgMCk7CisKKzAuMTksNi4vLDExLi8sMTYuLywyMS4xNTAsMzEuLzpYTDo6aXN5bmM6SW5zdHJ1Y3Rpb24gU3luY2hyb25pemUKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKKyo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDEsICAwCisJY3B1X3N5bmNocm9uaXplX2NvbnRleHQocHJvY2Vzc29yLCBjaWEpOworCVBQQ19JTlNOX0lOVCgwLCAwLCAwKTsKKworCisjCisjIElJLjMuMi4yIERhdGEgQ2FjaGUgSW5zdHJ1Y3Rpb25zCisjCisKKzAuMzEsNi4vLDExLlJBLDE2LlJCLDIxLjI3OCwzMS4vOlg6OjpEYXRhIENhY2hlIEJsb2NrIFRvdWNoCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAyLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMiwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAxLCAgMAorCVRSQUNFKHRyYWNlX3RiZCwoIkRhdGEgQ2FjaGUgQmxvY2sgVG91Y2hcbiIpKTsKKwlQUENfSU5TTl9JTlQoMCwgKFJBX0JJVE1BU0sgJiB+MSkgfCBSQl9CSVRNQVNLLCAwLypSYyovKTsKKworMC4zMSw2Li8sMTEuUkEsMTYuUkIsMjEuMjQ2LDMxLi86WDo6OkRhdGEgQ2FjaGUgQmxvY2sgVG91Y2ggZm9yIFN0b3JlCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAyLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMiwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAzLCAgMAorCVRSQUNFKHRyYWNlX3RiZCwoIkRhdGEgQ2FjaGUgQmxvY2sgVG91Y2ggZm9yIFN0b3JlXG4iKSk7CisJUFBDX0lOU05fSU5UKDAsIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSywgMC8qUmMqLyk7CisKKzAuMzEsNi4vLDExLlJBLDE2LlJCLDIxLjEwMTQsMzEuLzpYOjo6RGF0YSBDYWNoZSBCbG9jayBzZXQgdG8gWmVybworKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMTAsIDEwLCAwCisqNjAzZTpQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEwLCAxMCwgMAorKjYwNDogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAxLCAgMywgIDAKKwlUUkFDRSh0cmFjZV90YmQsKCJEYXRhIENhY2hlIEJsb2NrIHNldCB0byBaZXJvXG4iKSk7CisJUFBDX0lOU05fSU5UKDAsIChSQV9CSVRNQVNLICYgfjEpIHwgUkJfQklUTUFTSywgMC8qUmMqLyk7CisKKzAuMzEsNi4vLDExLlJBLDE2LlJCLDIxLjU0LDMxLi86WDo6OkRhdGEgQ2FjaGUgQmxvY2sgU3RvcmUKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDUsICA1LCAgMAorKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICA1LCAgNSwgIDAKKyo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDEsICAwCisJVFJBQ0UodHJhY2VfdGJkLCgiRGF0YSBDYWNoZSBCbG9jayBTdG9yZVxuIikpOworCVBQQ19JTlNOX0lOVCgwLCAoUkFfQklUTUFTSyAmIH4xKSB8IFJCX0JJVE1BU0ssIDAvKlJjKi8pOworCiswLjMxLDYuLywxMS5SQSwxNi5SQiwyMS44NiwzMS4vOlg6OjpEYXRhIENhY2hlIEJsb2NrIEZsdXNoCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICA1LCAgNSwgIDAKKyo2MDNlOlBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgNSwgIDUsICAwCisqNjA0OiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDEsICAxLCAgMAorCVRSQUNFKHRyYWNlX3RiZCwoIkRhdGEgQ2FjaGUgQmxvY2sgRmx1c2hcbiIpKTsKKwlQUENfSU5TTl9JTlQoMCwgKFJBX0JJVE1BU0sgJiB+MSkgfCBSQl9CSVRNQVNLLCAwLypSYyovKTsKKworIworIyBJSS4zLjMgRW5mb3JjZSBJbi1vcmRlciBFeGVjdXRpb24gb2YgSS9PIEluc3RydWN0aW9uCisjCisKKzAuMzEsNi4vLDExLi8sMTYuLywyMS44NTQsMzEuLzpYOjplaWVpbzpFbmZvcmNlIEluLW9yZGVyIEV4ZWN1dGlvbiBvZiBJL08KKwkvKiBTaW5jZSB0aGlzIG1vZGVsIGhhcyBubyBpbnN0cnVjdGlvbiBvdmVybGFwCisJICAgdGhpcyBpbnN0cnVjdGlvbiBuZWVkIGRvIG5vdGhpbmcgKi8KKworIworIyBJSS40LjEgVGltZSBCYXNlIEluc3RydWN0aW9ucworIworCiswLjMxLDYuUlQsMTEudGJyLDIxLjM3MSwzMS4vOlhGWDo6bWZ0YjpNb3ZlIEZyb20gVGltZSBCYXNlCisqNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgMywgIDMsICAwCisJaW50IG4gPSAodGJyezU6OX0gPDwgNSkgfCB0YnJ7MDo0fTsKKwlpZiAobiA9PSAyNjgpIHsKKwkgIGlmIChpc182NGJpdF9pbXBsZW1lbnRhdGlvbikgKnJUID0gVEI7CisJICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICpyVCA9IEVYVFJBQ1RFRDY0KFRCLCAzMiwgNjMpOworCX0KKwllbHNlIGlmIChuID09IDI2OSkgeworCSAgaWYgKGlzXzY0Yml0X2ltcGxlbWVudGF0aW9uKSAqclQgPSBFWFRSQUNURUQ2NChUQiwgMCwgMzEpOworCSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAqclQgPSBFWFRSQUNURUQ2NChUQiwgMCwgMzEpOworCX0KKwllbHNlCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIGlsbGVnYWxfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCisKKyMKKyMgSUlJLjIuMy4xIFN5c3RlbSBMaW5rYWdlIEluc3RydWN0aW9ucworIworCiswLjE5LDYuLywxMS4vLDE2Li8sMjEuNTAsMzEuLzpYTDo6cmZpOlJldHVybiBGcm9tIEludGVycnVwdAorKjYwMTogUFBDX1VOSVRfSVUsICAgIFBQQ19VTklUX0lVLCAgICAxLCAgMSwgIDAKKyo2MDM6IFBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMywgIDMsICAwCisqNjAzZTpQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDMsICAzLCAgMAorKjYwNDogUFBDX1VOSVRfTUNJVSwgIFBQQ19VTklUX01DSVUsICAzLCAgMywgIDAKKwlpZiAoSVNfUFJPQkxFTV9TVEFURShwcm9jZXNzb3IpKSB7CisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIHByaXZpbGVnZWRfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCX0KKwllbHNlIHsKKwkgIE1TUiA9IChNQVNLRUQoU1JSMSwgMCwgMzIpCisJICAgICAgICAgfCBNQVNLRUQoU1JSMSwgMzcsIDQxKQorCSAgICAgICAgIHwgTUFTS0VEKFNSUjEsIDQ4LCA2MykpOworCSAgTklBID0gTUFTS0VEKFNSUjAsIDAsIDYxKTsKKwkgIGNwdV9zeW5jaHJvbml6ZV9jb250ZXh0KHByb2Nlc3NvciwgY2lhKTsKKwkgIGNoZWNrX21hc2tlZF9pbnRlcnJ1cHRzKHByb2Nlc3Nvcik7CisJfQorCisjCisjIElJSS4zLjQuMSBNb3ZlIHRvL2Zyb20gU3lzdGVtIFJlZ2lzdGVyIEluc3RydWN0aW9ucworIworCisjMC4zMSw2LlJTLDExLlNQUiwyMS40NjcsMzEuLzpYRlg6OjpNb3ZlIFRvIFNwZWNpYWwgUHVycG9zZSBSZWdpc3RlcgorIzAuMzEsNi5SVCwxMS5TUFIsMjEuMzM5LDMxLi86WEZYOjo6TW92ZSBGcm9tIFNwZWNpYWwgUHVycG9zZSBSZWdpc3RlcgorMC4zMSw2LlJTLDExLi8sMTYuLywyMS4xNDYsMzEuLzpYOjo6TW92ZSBUbyBNYWNoaW5lIFN0YXRlIFJlZ2lzdGVyCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDEsICAxLCAgMAorKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAyLCAgMiwgIDAKKyo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMiwgIDIsICAwCisqNjA0OiBQUENfVU5JVF9NQ0lVLCAgUFBDX1VOSVRfTUNJVSwgIDEsICAxLCAgMAorCWlmIChJU19QUk9CTEVNX1NUQVRFKHByb2Nlc3NvcikpCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIHByaXZpbGVnZWRfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCWVsc2UgeworCSAgTVNSID0gKnJTOworCSAgY2hlY2tfbWFza2VkX2ludGVycnVwdHMocHJvY2Vzc29yKTsKKwl9CisKKzAuMzEsNi5SVCwxMS4vLDE2Li8sMjEuODMsMzEuLzpYOjo6TW92ZSBGcm9tIE1hY2hpbmUgU3RhdGUgUmVnaXN0ZXIKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDEsICAxLCAgMAorKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAxLCAgMSwgIDAKKyo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgMywgIDMsICAwCisJaWYgKElTX1BST0JMRU1fU1RBVEUocHJvY2Vzc29yKSkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgcHJpdmlsZWdlZF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJZWxzZSB7CisJICAqclQgPSBNU1I7CisJICBjaGVja19tYXNrZWRfaW50ZXJydXB0cyhwcm9jZXNzb3IpOworCX0KKworCisjCisjIElJSS40LjExLjEgQ2FjaGUgTWFuYWdlbWVudCBJbnN0cnVjdGlvbnMKKyMKKworMC4zMSw2Li8sMTEuUkEsMTYuUkIsMjEuNDcwLDMxLi86WDo6ZGNiaTpEYXRhIENhY2hlIEJsb2NrIEludmFsaWRhdGUKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9MU1UsICAgUFBDX1VOSVRfTFNVLCAgIDIsICAyLCAgMAorKjYwM2U6UFBDX1VOSVRfTFNVLCAgIFBQQ19VTklUX0xTVSwgICAyLCAgMiwgIDAKKyo2MDQ6IFBQQ19VTklUX0xTVSwgICBQUENfVU5JVF9MU1UsICAgMSwgIDMsICAwCisJaWYgKElTX1BST0JMRU1fU1RBVEUocHJvY2Vzc29yKSkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgcHJpdmlsZWdlZF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJZWxzZQorCSAgVFJBQ0UodHJhY2VfdGJkLCgiRGF0YSBDYWNoZSBCbG9jayBJbnZhbGlkYXRlXG4iKSk7CisKKyMKKyMgSUlJLjQuMTEuMiBTZWdtZW50IFJlZ2lzdGVyIE1hbmlwdWxhdGlvbiBJbnN0cnVjdGlvbnMKKyMKKworMC4zMSw2LlJTLDExLi8sMTIuU1IsMTYuLywyMS4yMTAsMzEuLzpYOjMyOm10c3IgJVNSLCVSUzpNb3ZlIFRvIFNlZ21lbnQgUmVnaXN0ZXIKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDIsICAyLCAgMAorKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAyLCAgMiwgIDAKKyo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgMSwgIDEsICAwCisJaWYgKElTX1BST0JMRU1fU1RBVEUocHJvY2Vzc29yKSkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgcHJpdmlsZWdlZF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJZWxzZQorCSAgU0VHUkVHKFNSKSA9ICpyUzsKKworMC4zMSw2LlJTLDExLi8sMTYuUkIsMjEuMjQyLDMxLi86WDozMjptdHNyaW4gJVJTLCVSQjpNb3ZlIFRvIFNlZ21lbnQgUmVnaXN0ZXIgSW5kaXJlY3QKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMSwgIDEsICAwCisqNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDIsICAyLCAgMAorKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAyLCAgMiwgIDAKKyo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgMSwgIDEsICAwCisJaWYgKElTX1BST0JMRU1fU1RBVEUocHJvY2Vzc29yKSkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgcHJpdmlsZWdlZF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJZWxzZQorCSAgU0VHUkVHKEVYVFJBQ1RFRDMyKCpyQiwgMCwgMykpID0gKnJTOworCiswLjMxLDYuUlQsMTEuLywxMi5TUiwxNi4vLDIxLjU5NSwzMS4vOlg6MzI6bWZzciAlUlQsJVJTOk1vdmUgRnJvbSBTZWdtZW50IFJlZ2lzdGVyCisqNjAxOiBQUENfVU5JVF9JVSwgICAgUFBDX1VOSVRfSVUsICAgIDIsICAyLCAgMAorKjYwMzogUFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAzLCAgMywgIDAKKyo2MDNlOlBQQ19VTklUX1NSVSwgICBQUENfVU5JVF9TUlUsICAgMywgIDMsICAwCisqNjA0OiBQUENfVU5JVF9NQ0lVLCAgUFBDX1VOSVRfTUNJVSwgIDEsICAxLCAgMAorCWlmIChJU19QUk9CTEVNX1NUQVRFKHByb2Nlc3NvcikpCisJICBwcm9ncmFtX2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwKKwkgICAgICAgICAgICAgICAgICAgIHByaXZpbGVnZWRfaW5zdHJ1Y3Rpb25fcHJvZ3JhbV9pbnRlcnJ1cHQpOworCWVsc2UKKwkgICpyVCA9IFNFR1JFRyhTUik7CisKKzAuMzEsNi5SVCwxMS4vLDE2LlJCLDIxLjY1OSwzMS4vOlg6MzI6bWZzcmluICVSVCwlUkI6TW92ZSBGcm9tIFNlZ21lbnQgUmVnaXN0ZXIgSW5kaXJlY3QKKyo2MDE6IFBQQ19VTklUX0lVLCAgICBQUENfVU5JVF9JVSwgICAgMiwgIDIsICAwCisqNjAzOiBQUENfVU5JVF9TUlUsICAgUFBDX1VOSVRfU1JVLCAgIDMsICAzLCAgMAorKjYwM2U6UFBDX1VOSVRfU1JVLCAgIFBQQ19VTklUX1NSVSwgICAzLCAgMywgIDAKKyo2MDQ6IFBQQ19VTklUX01DSVUsICBQUENfVU5JVF9NQ0lVLCAgMSwgIDEsICAwCisJaWYgKElTX1BST0JMRU1fU1RBVEUocHJvY2Vzc29yKSkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgcHJpdmlsZWdlZF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJZWxzZQorCSAgKnJUID0gU0VHUkVHKEVYVFJBQ1RFRDMyKCpyQiwgMCwgMykpOworCisKKyMKKyMgSUlJLjQuMTEuMyBMb29rYXNpZGUgQnVmZmVyIE1hbmFnZW1lbnQgSW5zdHJ1Y3Rpb25zIChPcHRpb25hbCkKKyMKKworMC4zMSw2Li8sMTEuLywxNi5SQiwyMS40MzQsMzEuLzpYOjY0OjpTTEIgSW52YWxpZGF0ZSBFbnRyeQorCiswLjMxLDYuLywxMS4vLDE2Li8sMjEuNDk4LDMxLi86WDo2NDo6U0xCIEludmFsaWRhdGUgQWxsCisKKzAuMzEsNi4vLDExLi8sMTYuUkIsMjEuMzA2LDMxLi86WDo6OlRMQiBJbnZhbGlkYXRlIEVudHJ5CisJaWYgKElTX1BST0JMRU1fU1RBVEUocHJvY2Vzc29yKSkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgcHJpdmlsZWdlZF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJZWxzZSB7CisJICBpbnQgbnIgPSAwOworCSAgY3B1ICpwcm9jOworCSAgd2hpbGUgKDEpIHsKKwkgICAgcHJvYyA9IHBzaW1fY3B1KGNwdV9zeXN0ZW0ocHJvY2Vzc29yKSwgbnIpOworCSAgICBpZiAocHJvYyA9PSBOVUxMKSBicmVhazsKKwkgICAgY3B1X3BhZ2VfdGxiX2ludmFsaWRhdGVfZW50cnkocHJvYywgKnJCKTsKKwkgICAgbnIrKzsKKwkgIH0KKwl9CisKKzAuMzEsNi4vLDExLi8sMTYuLywyMS4zNzAsMzEuLzpYOjo6VExCIEludmFsaWRhdGUgQWxsCisJaWYgKElTX1BST0JMRU1fU1RBVEUocHJvY2Vzc29yKSkKKwkgIHByb2dyYW1faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLAorCSAgICAgICAgICAgICAgICAgICAgcHJpdmlsZWdlZF9pbnN0cnVjdGlvbl9wcm9ncmFtX2ludGVycnVwdCk7CisJZWxzZSB7CisJICBpbnQgbnIgPSAwOworCSAgY3B1ICpwcm9jOworCSAgd2hpbGUgKDEpIHsKKwkgICAgcHJvYyA9IHBzaW1fY3B1KGNwdV9zeXN0ZW0ocHJvY2Vzc29yKSwgbnIpOworCSAgICBpZiAocHJvYyA9PSBOVUxMKSBicmVhazsKKwkgICAgY3B1X3BhZ2VfdGxiX2ludmFsaWRhdGVfYWxsKHByb2MpOworCSAgICBucisrOworCSAgfQorCX0KKworMC4zMSw2Li8sMTEuLywxNi4vLDIxLjU2NiwzMS4vOlg6OjpUTEIgU3luY2hyb25pemUKKwkvKiBub3RoaW5nIGhhcHBlbnMgaGVyZSAtIGFsd2F5cyBpbiBzeW5jICovCisKKyMKKyMgSUlJLkEuMS4yIEV4dGVybmFsIEFjY2VzcyBJbnN0cnVjdGlvbnMKKyMKKworMC4zMSw2LlJULDExLlJBLDE2LlJCLDIxLjMxMCwzMS4vOlg6ZWFyd2F4OjpFeHRlcm5hbCBDb250cm9sIEluIFdvcmQgSW5kZXhlZAorCiswLjMxLDYuUlMsMTEuUkEsMTYuUkIsMjEuNDM4LDMxLi86WDplYXJ3YXg6OkV4dGVybmFsIENvbnRyb2wgT3V0IFdvcmQgSW5kZXhlZApkaWZmIC0tZ2l0IGEvc2ltL3BwYy9wcGMtc3ByLXRhYmxlIGIvc2ltL3BwYy9wcGMtc3ByLXRhYmxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZTY1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL3BwYy1zcHItdGFibGUKQEAgLTAsMCArMSw4OCBAQAorIworIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisjCisjICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworCisjIE5hbWU6cmVnLW5yOnJlYWQtb25seTpsZW5ndGgKK01ROjA6MDowCitYRVI6MTowOjAKK1JUQ1U6NDowOjAKK1JUQ0w6NTowOjAKK0xSOjg6MDowCitDVFI6OTowOjAKK0RTSVNSOjE4OjA6MAorREFSOjE5OjA6MAorREVDOjIyOjA6MAorU0RSMToyNTowOjAKK1NSUjA6MjY6MDowCitTUlIxOjI3OjA6MAorU1BSRzA6MjcyOjA6MAorU1BSRzE6MjczOjA6MAorU1BSRzI6Mjc0OjA6MAorU1BSRzM6Mjc1OjA6MAorRUFSOjI4MjowOjAKK1RCTDoyODQ6MDowCitUQlU6Mjg1OjA6MAorUFZSOjI4NzowOjAKK0lCQVQwVTo1Mjg6MDowCitJQkFUMEw6NTI5OjA6MAorSUJBVDFVOjUzMDowOjAKK0lCQVQxTDo1MzE6MDowCitJQkFUMlU6NTMyOjA6MAorSUJBVDJMOjUzMzowOjAKK0lCQVQzVTo1MzQ6MDowCitJQkFUM0w6NTM1OjA6MAorREJBVDBVOjUzNjowOjAKK0RCQVQwTDo1Mzc6MDowCitEQkFUMVU6NTM4OjA6MAorREJBVDFMOjUzOTowOjAKK0RCQVQyVTo1NDA6MDowCitEQkFUMkw6NTQxOjA6MAorREJBVDNVOjU0MjowOjAKK0RCQVQzTDo1NDM6MDowCitVTU1DUjA6OTM2OjA6MAorVU1NQ1IxOjk0MDowOjAKK1VQTUMxOjkzNzowOjAKK1VQTUMyOjkzODowOjAKK1VTSUE6OTM5OjA6MAorVVBNQzM6OTQxOjA6MAorVVBNQzQ6OTQyOjA6MAorTU1DUjA6OTUyOjA6MAorUE1DMTo5NTM6MDowCitQTUMyOjk1NDowOjAKK1NJQTo5NTU6MDowCitNTUNSMTo5NTY6MDowCitQTUMzOjk1NzowOjAKK1BNQzQ6OTU4OjA6MAorRE1JU1M6OTc2OjA6MAorRENNUDo5Nzc6MDowCitIQVNIMTo5Nzg6MDowCitIQVNIMjo5Nzk6MDowCitJTUlTUzo5ODA6MDowCitJQ01QOjk4MTowOjAKK1JQQTo5ODI6MDowCitISUQwOjEwMDg6MDowCitISUQxOjEwMDk6MDowCitJQUJSOjEwMTA6MDowCitEQUJSOjEwMTM6MDowCitMMkNSOjEwMTc6MDowCitJQ1RDOjEwMTk6MDowCitUSFJNMToxMDIwOjA6MAorVEhSTTI6MTAyMTowOjAKK1RIUk0zOjEwMjI6MDowCitISUQxNToxMDIzOjA6MApkaWZmIC0tZ2l0IGEvc2ltL3BwYy9wcGMubXQgYi9zaW0vcHBjL3BwYy5tdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjNlYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9wcGMubXQKQEAgLTAsMCArMSwzIEBACitBTEw9YWxsLXBwYworQ0xFQU49Y2xlYW4tcHBjCitET19JTlNUQUxMPWluc3RhbGwtcHBjCmRpZmYgLS1naXQgYS9zaW0vcHBjL3BzaW0uYyBiL3NpbS9wcGMvcHNpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZTU0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL3BzaW0uYwpAQCAtMCwwICsxLDExMDAgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgX1BTSU1fQ18KKyNkZWZpbmUgX1BTSU1fQ18KKworI2luY2x1ZGUgImNwdS5oIiAvKiBpbmNsdWRlcyBwc2ltLmggKi8KKyNpbmNsdWRlICJpZGVjb2RlLmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorCisjaW5jbHVkZSAidHJlZS5oIgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHNldGptcC5oPgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKworI2luY2x1ZGUgImJmZC5oIgorCisKKy8qIHN5c3RlbSBzdHJ1Y3R1cmUsIGFjdHVhbCBzaXplIG9mIHByb2Nlc3NvciBhcnJheSBkZXRlcm1pbmVkIGF0CisgICBydW50aW1lICovCisKK3N0cnVjdCBfcHNpbSB7CisgIGV2ZW50X3F1ZXVlICpldmVudHM7CisgIGRldmljZSAqZGV2aWNlczsKKyAgbW9uICptb25pdG9yOworICBvc19lbXVsICpvc19lbXVsYXRpb247CisgIGNvcmUgKm1lbW9yeTsKKworICAvKiBlc2NhcGUgcm91dGluZSBmb3IgaW5uZXIgZnVuY3Rpb25zICovCisgIHZvaWQgKnBhdGhfdG9faGFsdDsKKyAgdm9pZCAqcGF0aF90b19yZXN0YXJ0OworCisgIC8qIHN0YXR1cyBmcm9tIGxhc3QgaGFsdCAqLworICBwc2ltX3N0YXR1cyBoYWx0X3N0YXR1czsKKworICAvKiB0aGUgcHJvY2Vzc29ycyBwcm9wZXIgKi8KKyAgaW50IG5yX2NwdXM7CisgIGludCBsYXN0X2NwdTsgLyogQ1BVIHRoYXQgbGFzdCAodHJpZWQgdG8pIGV4ZWN1dGUgYW4gaW5zdHJ1Y3Rpb24gKi8KKyAgY3B1ICpwcm9jZXNzb3JzW01BWF9OUl9QUk9DRVNTT1JTXTsKK307CisKKworaW50IGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXI7CitpbnQgY3VycmVudF9ob3N0X2J5dGVfb3JkZXI7CitpbnQgY3VycmVudF9lbnZpcm9ubWVudDsKK2ludCBjdXJyZW50X2FsaWdubWVudDsKK2ludCBjdXJyZW50X2Zsb2F0aW5nX3BvaW50OworaW50IGN1cnJlbnRfbW9kZWxfaXNzdWUgPSBNT0RFTF9JU1NVRV9JR05PUkU7CitpbnQgY3VycmVudF9zdGRpbyA9IERPX1VTRV9TVERJTzsKK21vZGVsX2VudW0gY3VycmVudF9tb2RlbCA9IFdJVEhfREVGQVVMVF9NT0RFTDsKKworCisvKiBjcmVhdGUgdGhlIGRldmljZSB0cmVlICovCisKK0lOTElORV9QU0lNXAorKGRldmljZSAqKQorcHNpbV90cmVlKHZvaWQpCit7CisgIGRldmljZSAqcm9vdCA9IHRyZWVfcGFyc2UoTlVMTCwgImNvcmUiKTsKKyAgdHJlZV9wYXJzZShyb290LCAiL2FsaWFzZXMiKTsKKyAgdHJlZV9wYXJzZShyb290LCAiL29wdGlvbnMiKTsKKyAgdHJlZV9wYXJzZShyb290LCAiL2Nob3NlbiIpOworICB0cmVlX3BhcnNlKHJvb3QsICIvcGFja2FnZXMiKTsKKyAgdHJlZV9wYXJzZShyb290LCAiL2NwdXMiKTsKKyAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tIik7CisgIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9pbml0Iik7CisgIHRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS90cmFjZSIpOworICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vb3B0aW9ucyIpOworICByZXR1cm4gcm9vdDsKK30KKworU1RBVElDX0lOTElORV9QU0lNXAorKGNoYXIgKikKK2ZpbmRfYXJnKGNoYXIgKmVycl9tc2csCisJIGludCAqcHRyX3RvX2FyZ3AsCisJIGNoYXIgKiphcmd2KQoreworICAqcHRyX3RvX2FyZ3AgKz0gMTsKKyAgaWYgKGFyZ3ZbKnB0cl90b19hcmdwXSA9PSBOVUxMKQorICAgIGVycm9yKGVycl9tc2cpOworICByZXR1cm4gYXJndlsqcHRyX3RvX2FyZ3BdOworfQorCitJTkxJTkVfUFNJTVwKKyh2b2lkKQorcHNpbV91c2FnZShpbnQgdmVyYm9zZSkKK3sKKyAgcHJpbnRmX2ZpbHRlcmVkKCJVc2FnZTpcbiIpOworICBwcmludGZfZmlsdGVyZWQoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXHRwc2ltIFsgPHBzaW0tb3B0aW9uPiAuLi4gXSA8aW1hZ2U+IFsgPGltYWdlLWFyZz4gLi4uIF1cbiIpOworICBwcmludGZfZmlsdGVyZWQoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiV2hlcmVcbiIpOworICBwcmludGZfZmlsdGVyZWQoIlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXHQ8aW1hZ2U+ICAgICAgICAgTmFtZSBvZiB0aGUgUG93ZXJQQyBwcm9ncmFtIHRvIHJ1bi5cbiIpOworICBpZiAodmVyYm9zZSkgeworICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIFRoaXMgY2FuIGVpdGhlciBiZSBhIFBvd2VyUEMgYmluYXJ5IG9yXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkKCJcdCAgICAgICAgICAgICAgICBhIHRleHQgZmlsZSBjb250YWluaW5nIGEgZGV2aWNlIHRyZWVcbiIpOworICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIHNwZWNpZmljYXRpb24uXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkKCJcdCAgICAgICAgICAgICAgICBQU0lNIHdpbGwgYXR0ZW1wdCB0byBkZXRlcm1pbmUgZnJvbSB0aGVcbiIpOworICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIHNwZWNpZmllZCA8aW1hZ2U+IHRoZSBpbnRlbmRlZCBlbXVsYXRpb25cbiIpOworICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIGVudmlyb25tZW50LlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgSWYgUFNJTSBnZXRzIGl0IHdyb25nLCB0aGUgZW11bGF0aW9uXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkKCJcdCAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHRoZVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgYC1lJyBvcHRpb24gKGRlc2NyaWJlZCBiZWxvdykuXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOyB9CisgIHByaW50Zl9maWx0ZXJlZCgiXHQ8aW1hZ2UtYXJnPiAgICAgQXJndW1lbnQgdG8gYmUgcGFzc2VkIHRvIDxpbWFnZT5cbiIpOworICBpZiAodmVyYm9zZSkgeworICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIFRoZXNlIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0b1xuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgPGltYWdlPiAoYXMgc3RhbmRhcmQgQyBhcmd2LCBhcmdjKVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgd2hlbiA8aW1hZ2U+IGlzIHN0YXJ0ZWQuXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOyB9CisgIHByaW50Zl9maWx0ZXJlZCgiXHQ8cHNpbS1vcHRpb24+ICAgU2VlIGJlbG93XG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOworICBwcmludGZfZmlsdGVyZWQoIlRoZSBmb2xsb3dpbmcgYXJlIHZhbGlkIDxwc2ltLW9wdGlvbj5zOlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXG4iKTsKKworICBwcmludGZfZmlsdGVyZWQoIlx0LWMgPGNvdW50PiAgICAgIExpbWl0IHRoZSBzaW11bGF0aW9uIHRvIDxjb3VudD4gaXRlcmF0aW9uc1xuIik7CisgIGlmICh2ZXJib3NlKSB7IAorICBwcmludGZfZmlsdGVyZWQoIlxuIik7CisgIH0KKworICBwcmludGZfZmlsdGVyZWQoIlx0LWkgb3IgLWkyICAgICAgIFByaW50IGluc3RydWN0aW9uIGNvdW50aW5nIHN0YXRpc3RpY3NcbiIpOworICBpZiAodmVyYm9zZSkgeyAKKyAgcHJpbnRmX2ZpbHRlcmVkKCJcdCAgICAgICAgICAgICAgICBTcGVjaWZ5IC1pMiBmb3IgYSBtb3JlIGRldGFpbGVkIGRpc3BsYXlcbiIpOworICBwcmludGZfZmlsdGVyZWQoIlxuIik7CisgIH0KKworICBwcmludGZfZmlsdGVyZWQoIlx0LUkgICAgICAgICAgICAgIFByaW50IGV4ZWN1dGlvbiB1bml0IHN0YXRpc3RpY3NcbiIpOworICBpZiAodmVyYm9zZSkgeyBwcmludGZfZmlsdGVyZWQoIlxuIik7IH0KKworICBwcmludGZfZmlsdGVyZWQoIlx0LWUgPG9zLWVtdWw+ICAgIHNwZWNpZnkgYW4gT1Mgb3IgcGxhdGZvcm0gdG8gbW9kZWxcbiIpOworICBpZiAodmVyYm9zZSkgeworICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIENhbiBiZSBhbnkgb2YgdGhlIGZvbGxvd2luZzpcbiIpOworICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIGJ1ZyAtIE9FQSArIE1PVE8gQlVHIFJPTSBjYWxsc1xuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgbmV0YnNkIC0gVUVBICsgTmV0QlNEIHN5c3RlbSBjYWxsc1xuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgc29sYXJpcyAtIFVFQSArIFNvbGFyaXMgc3lzdGVtIGNhbGxzXG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkKCJcdCAgICAgICAgICAgICAgICBsaW51eCAtIFVFQSArIExpbnV4IHN5c3RlbSBjYWxsc1xuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgY2hpcnAgLSBPRUEgKyBhIGZldyBPcGVuQm9vdCBjYWxsc1xuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXG4iKTsgfQorCisgIHByaW50Zl9maWx0ZXJlZCgiXHQtRSA8ZW5kaWFuPiAgICAgU3BlY2lmeSB0aGUgZW5kaWFubmVzcyBvZiB0aGUgdGFyZ2V0XG4iKTsKKyAgaWYgKHZlcmJvc2UpIHsgCisgIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgQ2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgYmlnIC0gYmlnIGVuZGlhbiB0YXJnZXRcbiIpOworICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIGxpdHRsZSAtIGxpdHRsZSBlbmRpYW4gdGFyZ2V0XG4iKTsKKyAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOyB9CisKKyAgcHJpbnRmX2ZpbHRlcmVkKCJcdC1mIDxmaWxlPiAgICAgICBNZXJnZSA8ZmlsZT4gaW50byB0aGUgZGV2aWNlIHRyZWVcbiIpOworICBpZiAodmVyYm9zZSkgeyBwcmludGZfZmlsdGVyZWQoIlxuIik7IH0KKworICBwcmludGZfZmlsdGVyZWQoIlx0LWggLT8gLUggICAgICAgIGdpdmUgbW9yZSBkZXRhaWxlZCB1c2FnZVxuIik7CisgIGlmICh2ZXJib3NlKSB7IHByaW50Zl9maWx0ZXJlZCgiXG4iKTsgfQorCisgIHByaW50Zl9maWx0ZXJlZCgiXHQtbSA8bW9kZWw+ICAgICAgU3BlY2lmeSB0aGUgcHJvY2Vzc29yIHRvIG1vZGVsICg2MDQpXG4iKTsKKyAgaWYgKHZlcmJvc2UpIHsKKyAgcHJpbnRmX2ZpbHRlcmVkKCJcdCAgICAgICAgICAgICAgICBTZWxlY3RzIHRoZSBwcm9jZXNzb3IgdG8gdXNlIHdoZW5cbiIpOworICBwcmludGZfZmlsdGVyZWQoIlx0ICAgICAgICAgICAgICAgIG1vZGVsaW5nIGV4ZWN1dGlvbiB1bml0cy4gIEluY2x1ZGVzOlxuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgNjA0LCA2MDMgYW5kIDYwM2VcbiIpOworICBwcmludGZfZmlsdGVyZWQoIlxuIik7IH0KKworICBwcmludGZfZmlsdGVyZWQoIlx0LW4gPG5yLXNtcD4gICAgIFNwZWNpZnkgdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIGluIFNNUCBzaW11bGF0aW9uc1xuIik7CisgIGlmICh2ZXJib3NlKSB7CisgIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycyB0aGF0IGFyZVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgdG8gYmUgbW9kZWxlZCBpbiBhIHN5bWV0cmljIG11bHRpLXByb2Nlc3NvciAoU01QKVxuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXHQgICAgICAgICAgICAgICAgc2ltdWxhdGlvblxuIik7CisgIHByaW50Zl9maWx0ZXJlZCgiXG4iKTsgfQorCisgIHByaW50Zl9maWx0ZXJlZCgiXHQtbyA8ZGV2LXNwZWM+ICAgQWRkIGRldmljZSA8ZGV2LXNwZWM+IHRvIHRoZSBkZXZpY2UgdHJlZVxuIik7CisgIGlmICh2ZXJib3NlKSB7IHByaW50Zl9maWx0ZXJlZCgiXG4iKTsgfQorCisgIHByaW50Zl9maWx0ZXJlZCgiXHQtciA8cmFtLXNpemU+ICAgU2V0IFJBTSBzaXplIGluIGJ5dGVzIChPRUEgZW52aXJvbm1lbnRzKVxuIik7CisgIGlmICh2ZXJib3NlKSB7IHByaW50Zl9maWx0ZXJlZCgiXG4iKTsgfQorCisgIHByaW50Zl9maWx0ZXJlZCgiXHQtdCBbIV08dHJhY2U+ICAgRW5hYmxlIChkaXNhYmxlKSA8dHJhY2U+IG9wdGlvblxuIik7CisgIGlmICh2ZXJib3NlKSB7IHByaW50Zl9maWx0ZXJlZCgiXG4iKTsgfQorCisgIHByaW50Zl9maWx0ZXJlZCgiXG4iKTsKKyAgdHJhY2VfdXNhZ2UodmVyYm9zZSk7CisgIGRldmljZV91c2FnZSh2ZXJib3NlKTsKKyAgaWYgKHZlcmJvc2UgPiAxKSB7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOworICAgIHByaW50X29wdGlvbnMoKTsKKyAgfQorICBlcnJvcigiIik7Cit9CisKKy8qIFRlc3QgInN0cmluZyIgZm9yIGNvbnRhaW5pbmcgYSBzdHJpbmcgb2YgZGlnaXRzIHRoYXQgZm9ybSBhIG51bWJlcgorYmV0d2VlbiAibWluIiBhbmQgIm1heCIuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgImVyciIuICovCitzdGF0aWMKK2ludCBpc19udW0oIGNoYXIgKnN0cmluZywgaW50IG1pbiwgaW50IG1heCwgaW50IGVycikKK3sKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgZm9yICggOyAqc3RyaW5nOyArK3N0cmluZykKKyAgeworICAgIGlmICghaXNkaWdpdCgqc3RyaW5nKSkKKyAgICB7CisgICAgICByZXN1bHQgPSBlcnI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcmVzdWx0ID0gcmVzdWx0ICogMTAgKyAoKnN0cmluZyAtICcwJyk7CisgIH0KKyAgaWYgKHJlc3VsdCA8IG1pbiB8fCByZXN1bHQgPiBtYXgpCisgICAgcmVzdWx0ID0gZXJyOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK0lOTElORV9QU0lNXAorKGNoYXIgKiopCitwc2ltX29wdGlvbnMoZGV2aWNlICpyb290LAorCSAgICAgY2hhciAqKmFyZ3YpCit7CisgIGRldmljZSAqY3VycmVudCA9IHJvb3Q7CisgIGludCBhcmdwOworICBpZiAoYXJndiA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICBhcmdwID0gMDsKKyAgd2hpbGUgKGFyZ3ZbYXJncF0gIT0gTlVMTCAmJiBhcmd2W2FyZ3BdWzBdID09ICctJykgeworICAgIGNoYXIgKnAgPSBhcmd2W2FyZ3BdICsgMTsKKyAgICBjaGFyICpwYXJhbTsKKyAgICB3aGlsZSAoKnAgIT0gJ1wwJykgeworICAgICAgc3dpdGNoICgqcCkgeworICAgICAgZGVmYXVsdDoKKwlwc2ltX3VzYWdlKDApOworCWVycm9yICgiIik7CisJYnJlYWs7CisgICAgICBjYXNlICdjJzoKKwlwYXJhbSA9IGZpbmRfYXJnKCJNaXNzaW5nIDxjb3VudD4gb3B0aW9uIGZvciAtYyAobWF4LWl0ZXJhdGlvbnMpXG4iLCAmYXJncCwgYXJndik7CisJdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL29wdGlvbnMvbWF4LWl0ZXJhdGlvbnMgJXMiLCBwYXJhbSk7CisJYnJlYWs7CisgICAgICBjYXNlICdlJzoKKwlwYXJhbSA9IGZpbmRfYXJnKCJNaXNzaW5nIDxlbXVsPiBvcHRpb24gZm9yIC1lIChvcy1lbXVsKVxuIiwgJmFyZ3AsIGFyZ3YpOworCXRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL29zLWVtdWwgJXMiLCBwYXJhbSk7CisJYnJlYWs7CisgICAgICBjYXNlICdFJzoKKwkvKiBlbmRpYW4gc3BlYywgaWdub3JlZCBmb3Igbm93ICovCisJcGFyYW0gPSBmaW5kX2FyZygiTWlzc2luZyA8ZW5kaWFuPiBvcHRpb24gZm9yIC1FICh0YXJnZXQtZW5kaWFuKVxuIiwgJmFyZ3AsIGFyZ3YpOworCWlmIChzdHJjbXAgKHBhcmFtLCAiYmlnIikgPT0gMCkKKwkgIHRyZWVfcGFyc2UgKHJvb3QsICIvb3B0aW9ucy9saXR0bGUtZW5kaWFuPyBmYWxzZSIpOworCWVsc2UgaWYgKHN0cmNtcCAocGFyYW0sICJsaXR0bGUiKSA9PSAwKQorCSAgdHJlZV9wYXJzZSAocm9vdCwgIi9vcHRpb25zL2xpdHRsZS1lbmRpYW4/IHRydWUiKTsKKwllbHNlCisJICB7CisJICAgIHByaW50Zl9maWx0ZXJlZCAoIkludmFsaWQgPGVuZGlhbj4gb3B0aW9uIGZvciAtRSAodGFyZ2V0LWVuZGlhbilcbiIpOworCSAgICBwc2ltX3VzYWdlICgwKTsKKwkgIH0KKwlicmVhazsKKyAgICAgIGNhc2UgJ2YnOgorCXBhcmFtID0gZmluZF9hcmcoIk1pc3NpbmcgPGZpbGU+IG9wdGlvbiBmb3IgLWZcbiIsICZhcmdwLCBhcmd2KTsKKwlwc2ltX21lcmdlX2RldmljZV9maWxlKHJvb3QsIHBhcmFtKTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ2gnOgorICAgICAgY2FzZSAnPyc6CisJcHNpbV91c2FnZSgxKTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ0gnOgorCXBzaW1fdXNhZ2UoMik7CisJYnJlYWs7CisgICAgICBjYXNlICdpJzoKKwlpZiAoaXNkaWdpdChwWzFdKSkgeworCSAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL3RyYWNlL3ByaW50LWluZm8gJWMiLCBwWzFdKTsKKwkgIHArKzsKKwl9CisJZWxzZSB7CisJICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vdHJhY2UvcHJpbnQtaW5mbyAxIik7CisJfQorCWJyZWFrOworICAgICAgY2FzZSAnSSc6CisJdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL3RyYWNlL3ByaW50LWluZm8gMiIpOworCXRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL21vZGVsLWlzc3VlICVkIiwKKwkJICAgTU9ERUxfSVNTVUVfUFJPQ0VTUyk7CisJYnJlYWs7CisgICAgICBjYXNlICdtJzoKKwlwYXJhbSA9IGZpbmRfYXJnKCJNaXNzaW5nIDxtb2RlbD4gb3B0aW9uIGZvciAtbSAobW9kZWwpXG4iLCAmYXJncCwgYXJndik7CisJdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL29wdGlvbnMvbW9kZWwgXCIlcyIsIHBhcmFtKTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ24nOgorCXBhcmFtID0gZmluZF9hcmcoIk1pc3NpbmcgPG5yLXNtcD4gb3B0aW9uIGZvciAtbiAoc21wKVxuIiwgJmFyZ3AsIGFyZ3YpOworCXRyZWVfcGFyc2Uocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL3NtcCAlcyIsIHBhcmFtKTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ28nOgorCXBhcmFtID0gZmluZF9hcmcoIk1pc3NpbmcgPGRldi1zcGVjPiBvcHRpb24gZm9yIC1vXG4iLCAmYXJncCwgYXJndik7CisjaWZkZWYgV0lUSF9PUFRJT05fTVBDODYwQzAKKwlpZiAobWVtY21wKHBhcmFtLCAibXBjODYwYzAiLCA4KSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKHBhcmFtWzhdID09ICdcMCcpCisgICAgICAgICAgICB0cmVlX3BhcnNlKHJvb3QsICIvb3B0aW9ucy9tcGM4NjBjMCA1Iik7CisgICAgICAgICAgZWxzZSBpZiAocGFyYW1bOF0gPT0gJz0nICYmIGlzX251bShwYXJhbSs5LCAxLCAxMCwgMCkpCisgICAgICAgICAgeworICAgICAgICAgICAgdHJlZV9wYXJzZShyb290LCAiL29wdGlvbnMvbXBjODYwYzAgJXMiLCBwYXJhbSs5KTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBlcnJvcigiSW52YWxpZCBtcGM4NjBjMCBvcHRpb24gZm9yIC1vXG4iKTsKKyAgICAgICAgfQorCWVsc2UKKyNlbmRpZiAvLyBXSVRIX09QVElPTl9NUEM4NjBDMAorICAgICAgICAgIGN1cnJlbnQgPSB0cmVlX3BhcnNlKGN1cnJlbnQsICIlcyIsIHBhcmFtKTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ3InOgorCXBhcmFtID0gZmluZF9hcmcoIk1pc3NpbmcgPHJhbS1zaXplPiBvcHRpb24gZm9yIC1yIChvZWEtbWVtb3J5LXNpemUpXG4iLCAmYXJncCwgYXJndik7CisJdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL29wdGlvbnMvb2VhLW1lbW9yeS1zaXplICVzIiwKKwkJCSAgICAgICBwYXJhbSk7CisJYnJlYWs7CisgICAgICBjYXNlICd0JzoKKwlwYXJhbSA9IGZpbmRfYXJnKCJNaXNzaW5nIDx0cmFjZT4gb3B0aW9uIGZvciAtdCAodHJhY2UvKilcbiIsICZhcmdwLCBhcmd2KTsKKwlpZiAocGFyYW1bMF0gPT0gJyEnKQorCSAgdHJlZV9wYXJzZShyb290LCAiL29wZW5wcm9tL3RyYWNlLyVzIDAiLCBwYXJhbSsxKTsKKwllbHNlCisJICB0cmVlX3BhcnNlKHJvb3QsICIvb3BlbnByb20vdHJhY2UvJXMgMSIsIHBhcmFtKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIHAgKz0gMTsKKyAgICB9CisgICAgYXJncCArPSAxOworICB9CisgIC8qIGZvcmNlIHRoZSB0cmFjZSBub2RlIHRvIHByb2Nlc3MgaXRzIG9wdGlvbnMgbm93ICpiZWZvcmUqIHRoZSB0cmVlCisgICAgIGluaXRpYWxpemF0aW9uIG9jY3VyZXMgKi8KKyAgZGV2aWNlX2lvY3RsKHRyZWVfZmluZF9kZXZpY2Uocm9vdCwgIi9vcGVucHJvbS90cmFjZSIpLAorCSAgICAgICBOVUxMLCAwLAorCSAgICAgICBkZXZpY2VfaW9jdGxfc2V0X3RyYWNlKTsKKworI2lmZGVmIFdJVEhfT1BUSU9OX01QQzg2MEMwCisgIHNlbWFudGljX2luaXQocm9vdCk7CisjZW5kaWYgLy8gV0lUSF9PUFRJT05fTVBDODYwQzAKKworICAvKiByZXR1cm4gd2hlcmUgdGhlIG9wdGlvbnMgZW5kICovCisgIHJldHVybiBhcmd2ICsgYXJncDsKK30KKworSU5MSU5FX1BTSU1cCisodm9pZCkKK3BzaW1fY29tbWFuZChkZXZpY2UgKnJvb3QsCisJICAgICBjaGFyICoqYXJndikKK3sKKyAgaW50IGFyZ3AgPSAwOworICBpZiAoYXJndlthcmdwXSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIGVsc2UgaWYgKHN0cmNtcChhcmd2W2FyZ3BdLCAidHJhY2UiKSA9PSAwKSB7CisgICAgY29uc3QgY2hhciAqb3B0ID0gZmluZF9hcmcoIk1pc3NpbmcgPHRyYWNlPiBvcHRpb24iLCAmYXJncCwgYXJndik7CisgICAgaWYgKG9wdFswXSA9PSAnIScpCisgICAgICB0cmFjZV9vcHRpb24ob3B0ICsgMSwgMCk7CisgICAgZWxzZQorICAgICAgdHJhY2Vfb3B0aW9uKG9wdCwgMSk7CisgIH0KKyAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiY2hhbmdlLW1lZGlhIikgPT0gMCkgeworICAgIGNoYXIgKmRldmljZSA9IGZpbmRfYXJnKCJNaXNzaW5nIGRldmljZSBuYW1lIiwgJmFyZ3AsIGFyZ3YpOworICAgIGNoYXIgKm1lZGlhID0gYXJndlsrK2FyZ3BdOworICAgIGRldmljZV9pb2N0bCh0cmVlX2ZpbmRfZGV2aWNlKHJvb3QsIGRldmljZSksIE5VTEwsIDAsCisJCSBkZXZpY2VfaW9jdGxfY2hhbmdlX21lZGlhLCBtZWRpYSk7CisgIH0KKyAgZWxzZSB7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCJVbmtub3duIFBTSU0gY29tbWFuZCAlcywgdHJ5XG4iLCBhcmd2W2FyZ3BdKTsKKyAgICBwcmludGZfZmlsdGVyZWQoIiAgICB0cmFjZSA8dHJhY2Utb3B0aW9uPlxuIik7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCIgICAgY2hhbmdlLW1lZGlhIDxkZXZpY2U+IFsgPG5ldy1pbWFnZT4gXVxuIik7CisgIH0KK30KKworCisvKiBjcmVhdGUgdGhlIHNpbXVsYXRvciBwcm9wZXIgZnJvbSB0aGUgZGV2aWNlIHRyZWUgYW5kIGV4ZWN1dGFibGUgKi8KKworSU5MSU5FX1BTSU1cCisocHNpbSAqKQorcHNpbV9jcmVhdGUoY29uc3QgY2hhciAqZmlsZV9uYW1lLAorCSAgICBkZXZpY2UgKnJvb3QpCit7CisgIGludCBjcHVfbnI7CisgIGNvbnN0IGNoYXIgKmVudjsKKyAgcHNpbSAqc3lzdGVtOworICBvc19lbXVsICpvc19lbXVsYXRpb247CisgIGludCBucl9jcHVzOworCisgIC8qIGdpdmVuIHRoaXMgcGFydGlhbGx5IHBvcHVsYXRlZCBkZXZpY2UgdHJlZSwgb3NfZW11bF9jcmVhdGUoKSB1c2VzCisgICAgIGl0IGFuZCBmaWxlX25hbWUgdG8gZGV0ZXJtaW5lIHRoZSBzZWxlY3RlZCBlbXVsYXRpb24gYW5kIGhlbmNlCisgICAgIGZ1cnRoZXIgcG9wdWxhdGUgdGhlIHRyZWUgd2l0aCBhbnkgb3RoZXIgcmVxdWlyZWQgbm9kZXMuICovCisKKyAgb3NfZW11bGF0aW9uID0gb3NfZW11bF9jcmVhdGUoZmlsZV9uYW1lLCByb290KTsKKyAgaWYgKG9zX2VtdWxhdGlvbiA9PSBOVUxMKQorICAgIGVycm9yKCJwc2ltOiBlaXRoZXIgZmlsZSAlcyB3YXMgbm90IHJlY29uaXplZCBvciB1bnJlY29uaXplZCBvciB1bmtub3duIG9zLWVtdWxhdGlvbiB0eXBlXG4iLCBmaWxlX25hbWUpOworCisgIC8qIGZpbGwgaW4gdGhlIG1pc3NpbmcgcmVhbCBudW1iZXIgb2YgQ1BVJ3MgKi8KKyAgbnJfY3B1cyA9IHRyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy9zbXAiKTsKKyAgaWYgKE1BWF9OUl9QUk9DRVNTT1JTIDwgbnJfY3B1cykKKyAgICBlcnJvcigidGFyZ2V0IGFuZCBjb25maWd1cmVkIG51bWJlciBvZiBjcHVzIGNvbmZsaWN0XG4iKTsKKworICAvKiBmaWxsIGluIHRoZSBtaXNzaW5nIFRBUkdFVCBCWVRFIE9SREVSIGluZm9ybWF0aW9uICovCisgIGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIKKyAgICA9ICh0cmVlX2ZpbmRfYm9vbGVhbl9wcm9wZXJ0eShyb290LCAiL29wdGlvbnMvbGl0dGxlLWVuZGlhbj8iKQorICAgICAgID8gTElUVExFX0VORElBTgorICAgICAgIDogQklHX0VORElBTik7CisgIGlmIChDVVJSRU5UX1RBUkdFVF9CWVRFX09SREVSICE9IGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIpCisgICAgZXJyb3IoInRhcmdldCBhbmQgY29uZmlndXJlZCBieXRlIG9yZGVyIGNvbmZsaWN0XG4iKTsKKworICAvKiBmaWxsIGluIHRoZSBtaXNzaW5nIEhPU1QgQllURSBPUkRFUiBpbmZvcm1hdGlvbiAqLworICBjdXJyZW50X2hvc3RfYnl0ZV9vcmRlciA9IChjdXJyZW50X2hvc3RfYnl0ZV9vcmRlciA9IDEsCisJCQkgICAgICgqKGNoYXIqKSgmY3VycmVudF9ob3N0X2J5dGVfb3JkZXIpCisJCQkgICAgICA/IExJVFRMRV9FTkRJQU4KKwkJCSAgICAgIDogQklHX0VORElBTikpOworICBpZiAoQ1VSUkVOVF9IT1NUX0JZVEVfT1JERVIgIT0gY3VycmVudF9ob3N0X2J5dGVfb3JkZXIpCisgICAgZXJyb3IoImhvc3QgYW5kIGNvbmZpZ3VyZWQgYnl0ZSBvcmRlciBjb25mbGljdFxuIik7CisKKyAgLyogZmlsbCBpbiB0aGUgbWlzc2luZyBPRUEvVkVBIGluZm9ybWF0aW9uICovCisgIGVudiA9IHRyZWVfZmluZF9zdHJpbmdfcHJvcGVydHkocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL2VudiIpOworICBjdXJyZW50X2Vudmlyb25tZW50ID0gKChzdHJjbXAoZW52LCAidXNlciIpID09IDAKKwkJCSAgfHwgc3RyY21wKGVudiwgInVlYSIpID09IDApCisJCQkgPyBVU0VSX0VOVklST05NRU5UCisJCQkgOiAoc3RyY21wKGVudiwgInZpcnR1YWwiKSA9PSAwCisJCQkgICAgfHwgc3RyY21wKGVudiwgInZlYSIpID09IDApCisJCQkgPyBWSVJUVUFMX0VOVklST05NRU5UCisJCQkgOiAoc3RyY21wKGVudiwgIm9wZXJhdGluZyIpID09IDAKKwkJCSAgICB8fCBzdHJjbXAoZW52LCAib2VhIikgPT0gMCkKKwkJCSA/IE9QRVJBVElOR19FTlZJUk9OTUVOVAorCQkJIDogMCk7CisgIGlmIChjdXJyZW50X2Vudmlyb25tZW50ID09IDApCisgICAgZXJyb3IoInVucmVjb25pemVkIC9vcHRpb25zIGVudiBwcm9wZXJ0eVxuIik7CisgIGlmIChDVVJSRU5UX0VOVklST05NRU5UICE9IGN1cnJlbnRfZW52aXJvbm1lbnQpCisgICAgZXJyb3IoInRhcmdldCBhbmQgY29uZmlndXJlZCBlbnZpcm9ubWVudCBjb25mbGljdFxuIik7CisKKyAgLyogZmlsbCBpbiB0aGUgbWlzc2luZyBBTExJR05NRU5UIGluZm9ybWF0aW9uICovCisgIGN1cnJlbnRfYWxpZ25tZW50CisgICAgPSAodHJlZV9maW5kX2Jvb2xlYW5fcHJvcGVydHkocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL3N0cmljdC1hbGlnbm1lbnQ/IikKKyAgICAgICA/IFNUUklDVF9BTElHTk1FTlQKKyAgICAgICA6IE5PTlNUUklDVF9BTElHTk1FTlQpOworICBpZiAoQ1VSUkVOVF9BTElHTk1FTlQgIT0gY3VycmVudF9hbGlnbm1lbnQpCisgICAgZXJyb3IoInRhcmdldCBhbmQgY29uZmlndXJlZCBhbGlnbm1lbnQgY29uZmxpY3RcbiIpOworCisgIC8qIGZpbGwgaW4gdGhlIG1pc3NpbmcgRkxPQVRJTkcgUE9JTlQgaW5mb3JtYXRpb24gKi8KKyAgY3VycmVudF9mbG9hdGluZ19wb2ludAorICAgID0gKHRyZWVfZmluZF9ib29sZWFuX3Byb3BlcnR5KHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy9mbG9hdGluZy1wb2ludD8iKQorICAgICAgID8gSEFSRF9GTE9BVElOR19QT0lOVAorICAgICAgIDogU09GVF9GTE9BVElOR19QT0lOVCk7CisgIGlmIChDVVJSRU5UX0ZMT0FUSU5HX1BPSU5UICE9IGN1cnJlbnRfZmxvYXRpbmdfcG9pbnQpCisgICAgZXJyb3IoInRhcmdldCBhbmQgY29uZmlndXJlZCBmbG9hdGluZy1wb2ludCBjb25mbGljdFxuIik7CisKKyAgLyogZmlsbCBpbiB0aGUgbWlzc2luZyBTVERJTyBpbmZvcm1hdGlvbiAqLworICBjdXJyZW50X3N0ZGlvCisgICAgPSAodHJlZV9maW5kX2Jvb2xlYW5fcHJvcGVydHkocm9vdCwgIi9vcGVucHJvbS9vcHRpb25zL3VzZS1zdGRpbz8iKQorICAgICAgID8gRE9fVVNFX1NURElPCisgICAgICAgOiBET05UX1VTRV9TVERJTyk7CisgIGlmIChDVVJSRU5UX1NURElPICE9IGN1cnJlbnRfc3RkaW8pCisgICAgZXJyb3IoInRhcmdldCBhbmQgY29uZmlndXJlZCBzdGRpbyBpbnRlcmZhY2UgY29uZmxpY3RcbiIpOworCisgIC8qIHNvcnQgb3V0IHRoZSBsZXZlbCBvZiBkZXRhaWwgZm9yIGlzc3VlIG1vZGVsaW5nICovCisgIGN1cnJlbnRfbW9kZWxfaXNzdWUKKyAgICA9IHRyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy9tb2RlbC1pc3N1ZSIpOworICBpZiAoQ1VSUkVOVF9NT0RFTF9JU1NVRSAhPSBjdXJyZW50X21vZGVsX2lzc3VlKQorICAgIGVycm9yKCJ0YXJnZXQgYW5kIGNvbmZpZ3VyZWQgbW9kZWwtaXNzdWUgY29uZmxpY3RcbiIpOworCisgIC8qIHNvcnQgb3V0IG91ciBtb2RlbCBhcmNoaXRlY3R1cmUgLSB3cm9uZy4KKworICAgICBGSVhNRTogdGhpcyBzaG91bGQgYmUgb2J0YWluaW5nIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZQorICAgICBkZXZpY2UgdHJlZSB2aWEgdGhlICIvY2hvc2VuIiBwcm9wZXJ0eSAiY3B1IiB3aGljaCBpcyBhbiBpbnN0YW5jZQorICAgICAoaWhhbmRsZSkgZm9yIHRoZSBvbmx5IGV4ZWN1dGluZyBwcm9jZXNzb3IuIEJ5IGNvbnZlcnRpbmcgdGhhdAorICAgICBpaGFuZGxlIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgY3B1J3MgcGhhbmRsZSBhbmQgdGhlbiBxdWVyeWluZworICAgICB0aGUgIm5hbWUiIHByb3BlcnR5LCB0aGUgY3B1IHR5cGUgY2FuIGJlIGRldGVybWluZWQuIE9rPyAqLworCisgIG1vZGVsX3NldCh0cmVlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5KHJvb3QsICIvb3BlbnByb20vb3B0aW9ucy9tb2RlbCIpKTsKKworICAvKiBjcmVhdGUgdGhpbmdzICovCisgIHN5c3RlbSA9IFpBTExPQyhwc2ltKTsKKyAgc3lzdGVtLT5ldmVudHMgPSBldmVudF9xdWV1ZV9jcmVhdGUoKTsKKyAgc3lzdGVtLT5tZW1vcnkgPSBjb3JlX2Zyb21fZGV2aWNlKHJvb3QpOworICBzeXN0ZW0tPm1vbml0b3IgPSBtb25fY3JlYXRlKCk7CisgIHN5c3RlbS0+bnJfY3B1cyA9IG5yX2NwdXM7CisgIHN5c3RlbS0+b3NfZW11bGF0aW9uID0gb3NfZW11bGF0aW9uOworICBzeXN0ZW0tPmRldmljZXMgPSByb290OworCisgIC8qIG5vdyBhbGwgdGhlIHByb2Nlc3NvcnMgYXR0YWNoaW5nIHRvIGVhY2ggdGhlaXIgcGVyLWNwdSBpbmZvcm1hdGlvbiAqLworICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IE1BWF9OUl9QUk9DRVNTT1JTOyBjcHVfbnIrKykgeworICAgIHN5c3RlbS0+cHJvY2Vzc29yc1tjcHVfbnJdID0gY3B1X2NyZWF0ZShzeXN0ZW0sCisJCQkJCSAgICBzeXN0ZW0tPm1lbW9yeSwKKwkJCQkJICAgIG1vbl9jcHUoc3lzdGVtLT5tb25pdG9yLAorCQkJCQkJICAgIGNwdV9uciksCisJCQkJCSAgICBzeXN0ZW0tPm9zX2VtdWxhdGlvbiwKKwkJCQkJICAgIGNwdV9ucik7CisgIH0KKworICAvKiBkdW1wIG91dCB0aGUgY29udGVudHMgb2YgdGhlIGRldmljZSB0cmVlICovCisgIGlmIChwcGNfdHJhY2VbdHJhY2VfcHJpbnRfZGV2aWNlX3RyZWVdIHx8IHBwY190cmFjZVt0cmFjZV9kdW1wX2RldmljZV90cmVlXSkKKyAgICB0cmVlX3ByaW50KHJvb3QpOworICBpZiAocHBjX3RyYWNlW3RyYWNlX2R1bXBfZGV2aWNlX3RyZWVdKQorICAgIGVycm9yKCIiKTsKKworICByZXR1cm4gc3lzdGVtOworfQorCisKKy8qIGFsbG93IHRoZSBzaW11bGF0aW9uIHRvIHN0b3AvcmVzdGFydCBhYm5vcm1hbHkgKi8KKworSU5MSU5FX1BTSU1cCisodm9pZCkKK3BzaW1fc2V0X2hhbHRfYW5kX3Jlc3RhcnQocHNpbSAqc3lzdGVtLAorCQkJICB2b2lkICpoYWx0X2ptcF9idWYsCisJCQkgIHZvaWQgKnJlc3RhcnRfam1wX2J1ZikKK3sKKyAgc3lzdGVtLT5wYXRoX3RvX2hhbHQgPSBoYWx0X2ptcF9idWY7CisgIHN5c3RlbS0+cGF0aF90b19yZXN0YXJ0ID0gcmVzdGFydF9qbXBfYnVmOworfQorCitJTkxJTkVfUFNJTVwKKyh2b2lkKQorcHNpbV9jbGVhcl9oYWx0X2FuZF9yZXN0YXJ0KHBzaW0gKnN5c3RlbSkKK3sKKyAgc3lzdGVtLT5wYXRoX3RvX2hhbHQgPSBOVUxMOworICBzeXN0ZW0tPnBhdGhfdG9fcmVzdGFydCA9IE5VTEw7Cit9CisKK0lOTElORV9QU0lNXAorKHZvaWQpCitwc2ltX3Jlc3RhcnQocHNpbSAqc3lzdGVtLAorCSAgICAgaW50IGN1cnJlbnRfY3B1KQoreworICBBU1NFUlQoY3VycmVudF9jcHUgPj0gMCAmJiBjdXJyZW50X2NwdSA8IHN5c3RlbS0+bnJfY3B1cyk7CisgIEFTU0VSVChzeXN0ZW0tPnBhdGhfdG9fcmVzdGFydCAhPSBOVUxMKTsKKyAgc3lzdGVtLT5sYXN0X2NwdSA9IGN1cnJlbnRfY3B1OworICBsb25nam1wKCooam1wX2J1ZiopKHN5c3RlbS0+cGF0aF90b19yZXN0YXJ0KSwgY3VycmVudF9jcHUgKyAxKTsKK30KKworCitzdGF0aWMgdm9pZAorY250cmxfY19zaW11bGF0aW9uKHZvaWQgKmRhdGEpCit7CisgIHBzaW0gKnN5c3RlbSA9IGRhdGE7CisgIHBzaW1faGFsdChzeXN0ZW0sCisJICAgIHBzaW1fbnJfY3B1cyhzeXN0ZW0pLAorCSAgICB3YXNfY29udGludWluZywKKwkgICAgU0lHSU5UKTsKK30KKworSU5MSU5FX1BTSU1cCisodm9pZCkKK3BzaW1fc3RvcChwc2ltICpzeXN0ZW0pCit7CisgIGV2ZW50X3F1ZXVlX3NjaGVkdWxlX2FmdGVyX3NpZ25hbChwc2ltX2V2ZW50X3F1ZXVlKHN5c3RlbSksCisJCQkJICAgIDAgLypOT1cqLywKKwkJCQkgICAgY250cmxfY19zaW11bGF0aW9uLAorCQkJCSAgICBzeXN0ZW0pOworfQorCitJTkxJTkVfUFNJTVwKKyh2b2lkKQorcHNpbV9oYWx0KHBzaW0gKnN5c3RlbSwKKwkgIGludCBjdXJyZW50X2NwdSwKKwkgIHN0b3BfcmVhc29uIHJlYXNvbiwKKwkgIGludCBzaWduYWwpCit7CisgIEFTU0VSVChjdXJyZW50X2NwdSA+PSAwICYmIGN1cnJlbnRfY3B1IDw9IHN5c3RlbS0+bnJfY3B1cyk7CisgIEFTU0VSVChzeXN0ZW0tPnBhdGhfdG9faGFsdCAhPSBOVUxMKTsKKyAgc3lzdGVtLT5sYXN0X2NwdSA9IGN1cnJlbnRfY3B1OworICBzeXN0ZW0tPmhhbHRfc3RhdHVzLnJlYXNvbiA9IHJlYXNvbjsKKyAgc3lzdGVtLT5oYWx0X3N0YXR1cy5zaWduYWwgPSBzaWduYWw7CisgIGlmIChjdXJyZW50X2NwdSA9PSBzeXN0ZW0tPm5yX2NwdXMpIHsKKyAgICBzeXN0ZW0tPmhhbHRfc3RhdHVzLmNwdV9uciA9IDA7CisgICAgc3lzdGVtLT5oYWx0X3N0YXR1cy5wcm9ncmFtX2NvdW50ZXIgPQorICAgICAgY3B1X2dldF9wcm9ncmFtX2NvdW50ZXIoc3lzdGVtLT5wcm9jZXNzb3JzWzBdKTsKKyAgfQorICBlbHNlIHsKKyAgICBzeXN0ZW0tPmhhbHRfc3RhdHVzLmNwdV9uciA9IGN1cnJlbnRfY3B1OworICAgIHN5c3RlbS0+aGFsdF9zdGF0dXMucHJvZ3JhbV9jb3VudGVyID0KKyAgICAgIGNwdV9nZXRfcHJvZ3JhbV9jb3VudGVyKHN5c3RlbS0+cHJvY2Vzc29yc1tjdXJyZW50X2NwdV0pOworICB9CisgIGxvbmdqbXAoKihqbXBfYnVmKikoc3lzdGVtLT5wYXRoX3RvX2hhbHQpLCBjdXJyZW50X2NwdSArIDEpOworfQorCisKK0lOTElORV9QU0lNXAorKGludCkKK3BzaW1fbGFzdF9jcHUocHNpbSAqc3lzdGVtKQoreworICByZXR1cm4gc3lzdGVtLT5sYXN0X2NwdTsKK30KKworSU5MSU5FX1BTSU1cCisoaW50KQorcHNpbV9ucl9jcHVzKHBzaW0gKnN5c3RlbSkKK3sKKyAgcmV0dXJuIHN5c3RlbS0+bnJfY3B1czsKK30KKworSU5MSU5FX1BTSU1cCisocHNpbV9zdGF0dXMpCitwc2ltX2dldF9zdGF0dXMocHNpbSAqc3lzdGVtKQoreworICByZXR1cm4gc3lzdGVtLT5oYWx0X3N0YXR1czsKK30KKworCitJTkxJTkVfUFNJTVwKKyhjcHUgKikKK3BzaW1fY3B1KHBzaW0gKnN5c3RlbSwKKwkgaW50IGNwdV9ucikKK3sKKyAgaWYgKGNwdV9uciA8IDAgfHwgY3B1X25yID49IHN5c3RlbS0+bnJfY3B1cykKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZQorICAgIHJldHVybiBzeXN0ZW0tPnByb2Nlc3NvcnNbY3B1X25yXTsKK30KKworCitJTkxJTkVfUFNJTVwKKyhkZXZpY2UgKikKK3BzaW1fZGV2aWNlKHBzaW0gKnN5c3RlbSwKKwkgICAgY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgcmV0dXJuIHRyZWVfZmluZF9kZXZpY2Uoc3lzdGVtLT5kZXZpY2VzLCBwYXRoKTsKK30KKworSU5MSU5FX1BTSU1cCisoZXZlbnRfcXVldWUgKikKK3BzaW1fZXZlbnRfcXVldWUocHNpbSAqc3lzdGVtKQoreworICByZXR1cm4gc3lzdGVtLT5ldmVudHM7Cit9CisKKworCitTVEFUSUNfSU5MSU5FX1BTSU1cCisodm9pZCkKK3BzaW1fbWF4X2l0ZXJhdGlvbnNfZXhjZWVkZWQodm9pZCAqZGF0YSkKK3sKKyAgcHNpbSAqc3lzdGVtID0gZGF0YTsKKyAgcHNpbV9oYWx0KHN5c3RlbSwKKwkgICAgc3lzdGVtLT5ucl9jcHVzLCAvKiBoYWx0ZWQgZHVyaW5nIGFuIGV2ZW50ICovCisJICAgIHdhc19zaWduYWxsZWQsCisJICAgIC0xKTsKK30KKworCitJTkxJTkVfUFNJTVwKKyh2b2lkKQorcHNpbV9pbml0KHBzaW0gKnN5c3RlbSkKK3sKKyAgaW50IGNwdV9ucjsKKworICAvKiBzY3J1YiB0aGUgbW9uaXRvciAqLworICBtb25faW5pdChzeXN0ZW0tPm1vbml0b3IsIHN5c3RlbS0+bnJfY3B1cyk7CisKKyAgLyogdHJhc2ggYW55IHBlbmRpbmcgZXZlbnRzICovCisgIGV2ZW50X3F1ZXVlX2luaXQoc3lzdGVtLT5ldmVudHMpOworCisgIC8qIGlmIG5lZWRlZCwgc2NoZWR1bGUgYSBoYWx0IGV2ZW50LiAgRklYTUUgLSBJbiB0aGUgZnV0dXJlIHRoaXMKKyAgICAgd2lsbCBiZSByZXBsYWNlZCBieSBhIG1vcmUgZ2VuZXJpYyBjaGFuZ2UgdG8gcHNpbV9jb21tYW5kKCkuICBBCisgICAgIG5ldyBjb21tYW5kIGBzY2hlZHVsZSBOTk4gaGFsdCcgYmVpbmcgYWRkZWQuICovCisgIGlmICh0cmVlX2ZpbmRfcHJvcGVydHkoc3lzdGVtLT5kZXZpY2VzLCAiL29wZW5wcm9tL29wdGlvbnMvbWF4LWl0ZXJhdGlvbnMiKSkgeworICAgIGV2ZW50X3F1ZXVlX3NjaGVkdWxlKHN5c3RlbS0+ZXZlbnRzLAorCQkJIHRyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KHN5c3RlbS0+ZGV2aWNlcywKKwkJCQkJCSAgICAiL29wZW5wcm9tL29wdGlvbnMvbWF4LWl0ZXJhdGlvbnMiKSAtIDIsCisJCQkgcHNpbV9tYXhfaXRlcmF0aW9uc19leGNlZWRlZCwKKwkJCSBzeXN0ZW0pOworICB9CisKKyAgLyogc2NydWIgYWxsIHRoZSBjcHVzICovCisgIGZvciAoY3B1X25yID0gMDsgY3B1X25yIDwgc3lzdGVtLT5ucl9jcHVzOyBjcHVfbnIrKykKKyAgICBjcHVfaW5pdChzeXN0ZW0tPnByb2Nlc3NvcnNbY3B1X25yXSk7CisKKyAgLyogaW5pdCBhbGwgdGhlIGRldmljZXMgKHdoaWNoIHVwZGF0ZXMgdGhlIGNwdXMpICovCisgIHRyZWVfaW5pdChzeXN0ZW0tPmRldmljZXMsIHN5c3RlbSk7CisKKyAgLyogYW5kIHRoZSBlbXVsYXRpb24gKHdoaWNoIG5lZWRzIGFuIGluaXRpYWxpemVkIGRldmljZSB0cmVlKSAqLworICBvc19lbXVsX2luaXQoc3lzdGVtLT5vc19lbXVsYXRpb24sIHN5c3RlbS0+bnJfY3B1cyk7CisKKyAgLyogbm93IHN5bmMgZWFjaCBjcHUgYWdhaW5zdCB0aGUgaW5pdGlhbGl6ZWQgc3RhdGUgb2YgaXRzIHJlZ2lzdGVycyAqLworICBmb3IgKGNwdV9uciA9IDA7IGNwdV9uciA8IHN5c3RlbS0+bnJfY3B1czsgY3B1X25yKyspIHsKKyAgICBjcHUgKnByb2Nlc3NvciA9IHN5c3RlbS0+cHJvY2Vzc29yc1tjcHVfbnJdOworICAgIGNwdV9zeW5jaHJvbml6ZV9jb250ZXh0KHByb2Nlc3NvciwgY3B1X2dldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yKSk7CisgICAgY3B1X3BhZ2VfdGxiX2ludmFsaWRhdGVfYWxsKHByb2Nlc3Nvcik7CisgIH0KKworICAvKiBmb3JjZSBsb29wIHRvIHN0YXJ0IHdpdGggZmlyc3QgY3B1ICovCisgIHN5c3RlbS0+bGFzdF9jcHUgPSAtMTsKK30KKworSU5MSU5FX1BTSU1cCisodm9pZCkKK3BzaW1fc3RhY2socHNpbSAqc3lzdGVtLAorCSAgIGNoYXIgKiphcmd2LAorCSAgIGNoYXIgKiplbnZwKQoreworICAvKiBwYXNzIHRoZSBzdGFjayBkZXZpY2UgdGhlIGFyZ3YvZW52cCBhbmQgbGV0IGl0IHdvcmsgb3V0IHdoYXQgdG8KKyAgICAgZG8gd2l0aCBpdCAqLworICBkZXZpY2UgKnN0YWNrX2RldmljZSA9IHRyZWVfZmluZF9kZXZpY2Uoc3lzdGVtLT5kZXZpY2VzLAorCQkJCQkgICIvb3BlbnByb20vaW5pdC9zdGFjayIpOworICBpZiAoc3RhY2tfZGV2aWNlICE9IChkZXZpY2UqKTApIHsKKyAgICB1bnNpZ25lZF93b3JkIHN0YWNrX3BvaW50ZXI7CisgICAgcHNpbV9yZWFkX3JlZ2lzdGVyKHN5c3RlbSwgMCwgJnN0YWNrX3BvaW50ZXIsICJzcCIsIGNvb2tlZF90cmFuc2Zlcik7CisgICAgZGV2aWNlX2lvY3RsKHN0YWNrX2RldmljZSwKKwkJIE5VTEwsIC8qY3B1Ki8KKwkJIDAsIC8qY2lhKi8KKwkJIGRldmljZV9pb2N0bF9jcmVhdGVfc3RhY2ssCisJCSBzdGFja19wb2ludGVyLAorCQkgYXJndiwKKwkJIGVudnApOworICB9Cit9CisKKworCisvKiBTSU1VTEFURSBJTlNUUlVDVElPTlMsIHZhcmlvdXMgZGlmZmVyZW50IHdheXMgb2YgYWNoaWV2aW5nIHRoZSBzYW1lCisgICB0aGluZyAqLworCitJTkxJTkVfUFNJTVwKKyh2b2lkKQorcHNpbV9zdGVwKHBzaW0gKnN5c3RlbSkKK3sKKyAgdm9sYXRpbGUgaW50IGtlZXBfcnVubmluZyA9IDA7CisgIGlkZWNvZGVfcnVuX3VudGlsX3N0b3Aoc3lzdGVtLCAma2VlcF9ydW5uaW5nLAorCQkJIHN5c3RlbS0+ZXZlbnRzLCBzeXN0ZW0tPnByb2Nlc3NvcnMsIHN5c3RlbS0+bnJfY3B1cyk7Cit9CisKK0lOTElORV9QU0lNXAorKHZvaWQpCitwc2ltX3J1bihwc2ltICpzeXN0ZW0pCit7CisgIGlkZWNvZGVfcnVuKHN5c3RlbSwKKwkgICAgICBzeXN0ZW0tPmV2ZW50cywgc3lzdGVtLT5wcm9jZXNzb3JzLCBzeXN0ZW0tPm5yX2NwdXMpOworfQorCisKKy8qIHN0b3JhZ2UgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyAqLworCitJTkxJTkVfUFNJTVwKKyh2b2lkKQorcHNpbV9yZWFkX3JlZ2lzdGVyKHBzaW0gKnN5c3RlbSwKKwkJICAgaW50IHdoaWNoX2NwdSwKKwkJICAgdm9pZCAqYnVmLAorCQkgICBjb25zdCBjaGFyIHJlZ1tdLAorCQkgICB0cmFuc2Zlcl9tb2RlIG1vZGUpCit7CisgIHJlZ2lzdGVyX2Rlc2NyaXB0aW9ucyBkZXNjcmlwdGlvbjsKKyAgY2hhciBjb29rZWRfYnVmW3NpemVvZih1bnNpZ25lZF84KV07CisgIGNwdSAqcHJvY2Vzc29yOworCisgIC8qIGZpbmQgb3VyIHByb2Nlc3NvciAqLworICBpZiAod2hpY2hfY3B1ID09IE1BWF9OUl9QUk9DRVNTT1JTKSB7CisgICAgaWYgKHN5c3RlbS0+bGFzdF9jcHUgPT0gc3lzdGVtLT5ucl9jcHVzCisJfHwgc3lzdGVtLT5sYXN0X2NwdSA9PSAtMSkKKyAgICAgIHdoaWNoX2NwdSA9IDA7CisgICAgZWxzZQorICAgICAgd2hpY2hfY3B1ID0gc3lzdGVtLT5sYXN0X2NwdTsKKyAgfQorICBBU1NFUlQod2hpY2hfY3B1ID49IDAgJiYgd2hpY2hfY3B1IDwgc3lzdGVtLT5ucl9jcHVzKTsKKworICBwcm9jZXNzb3IgPSBzeXN0ZW0tPnByb2Nlc3NvcnNbd2hpY2hfY3B1XTsKKworICAvKiBmaW5kIHRoZSByZWdpc3RlciBkZXNjcmlwdGlvbiAqLworICBkZXNjcmlwdGlvbiA9IHJlZ2lzdGVyX2Rlc2NyaXB0aW9uKHJlZyk7CisgIGlmIChkZXNjcmlwdGlvbi50eXBlID09IHJlZ19pbnZhbGlkKQorICAgIGVycm9yKCJwc2ltX3JlYWRfcmVnaXN0ZXIoKSBpbnZhbGlkIHJlZ2lzdGVyIG5hbWUgYCVzJ1xuIiwgcmVnKTsKKworICAvKiBnZXQgdGhlIGNvb2tlZCB2YWx1ZSAqLworICBzd2l0Y2ggKGRlc2NyaXB0aW9uLnR5cGUpIHsKKworICBjYXNlIHJlZ19ncHI6CisgICAgKihncHJlZyopY29va2VkX2J1ZiA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+Z3ByW2Rlc2NyaXB0aW9uLmluZGV4XTsKKyAgICBicmVhazsKKworICBjYXNlIHJlZ19zcHI6CisgICAgKihzcHJlZyopY29va2VkX2J1ZiA9IGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+c3ByW2Rlc2NyaXB0aW9uLmluZGV4XTsKKyAgICBicmVhazsKKyAgICAKKyAgY2FzZSByZWdfc3I6CisgICAgKihzcmVnKiljb29rZWRfYnVmID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5zcltkZXNjcmlwdGlvbi5pbmRleF07CisgICAgYnJlYWs7CisKKyAgY2FzZSByZWdfZnByOgorICAgICooZnByZWcqKWNvb2tlZF9idWYgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmZwcltkZXNjcmlwdGlvbi5pbmRleF07CisgICAgYnJlYWs7CisKKyAgY2FzZSByZWdfcGM6CisgICAgKih1bnNpZ25lZF93b3JkKiljb29rZWRfYnVmID0gY3B1X2dldF9wcm9ncmFtX2NvdW50ZXIocHJvY2Vzc29yKTsKKyAgICBicmVhazsKKworICBjYXNlIHJlZ19jcjoKKyAgICAqKGNyZWcqKWNvb2tlZF9idWYgPSBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmNyOworICAgIGJyZWFrOworCisgIGNhc2UgcmVnX21zcjoKKyAgICAqKG1zcmVnKiljb29rZWRfYnVmID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5tc3I7CisgICAgYnJlYWs7CisKKyAgY2FzZSByZWdfZnBzY3I6CisgICAgKihmcHNjcmVnKiljb29rZWRfYnVmID0gY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5mcHNjcjsKKyAgICBicmVhazsKKworICBjYXNlIHJlZ19pbnNuczoKKyAgICAqKHVuc2lnbmVkX3dvcmQqKWNvb2tlZF9idWYgPSBtb25fZ2V0X251bWJlcl9vZl9pbnNucyhzeXN0ZW0tPm1vbml0b3IsCisJCQkJCQkJICB3aGljaF9jcHUpOworICAgIGJyZWFrOworCisgIGNhc2UgcmVnX3N0YWxsczoKKyAgICBpZiAoY3B1X21vZGVsKHByb2Nlc3NvcikgPT0gTlVMTCkKKyAgICAgIGVycm9yKCIkc3RhbGxzIG9ubHkgdmFsaWQgaWYgcHJvY2Vzc29yIHVuaXQgbW9kZWwgZW5hYmxlZCAoLUkpXG4iKTsKKyAgICAqKHVuc2lnbmVkX3dvcmQqKWNvb2tlZF9idWYgPSBtb2RlbF9nZXRfbnVtYmVyX29mX3N0YWxscyhjcHVfbW9kZWwocHJvY2Vzc29yKSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSByZWdfY3ljbGVzOgorICAgIGlmIChjcHVfbW9kZWwocHJvY2Vzc29yKSA9PSBOVUxMKQorICAgICAgZXJyb3IoIiRjeWNsZXMgb25seSB2YWxpZCBpZiBwcm9jZXNzb3IgdW5pdCBtb2RlbCBlbmFibGVkICgtSSlcbiIpOworICAgICoodW5zaWduZWRfd29yZCopY29va2VkX2J1ZiA9IG1vZGVsX2dldF9udW1iZXJfb2ZfY3ljbGVzKGNwdV9tb2RlbChwcm9jZXNzb3IpKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIHByaW50Zl9maWx0ZXJlZCgicHNpbV9yZWFkX3JlZ2lzdGVyKHByb2Nlc3Nvcj0weCVseCxidWY9MHglbHgscmVnPSVzKSAlc1xuIiwKKwkJICAgICh1bnNpZ25lZCBsb25nKXByb2Nlc3NvciwgKHVuc2lnbmVkIGxvbmcpYnVmLCByZWcsCisJCSAgICAicmVhZCBvZiB0aGlzIHJlZ2lzdGVyIHVuaW1wbGVtZW50ZWQiKTsKKyAgICBicmVhazsKKworICB9CisKKyAgLyogdGhlIFBTSU0gaW50ZXJuYWwgdmFsdWVzIGFyZSBpbiBob3N0IG9yZGVyLiAgVG8gZmV0Y2ggcmF3IGRhdGEsCisgICAgIHRoZXkgbmVlZCB0byBiZSBjb252ZXJ0ZWQgaW50byB0YXJnZXQgb3JkZXIgYW5kIHRoZW4gcmV0dXJuZWQgKi8KKyAgaWYgKG1vZGUgPT0gcmF3X3RyYW5zZmVyKSB7CisgICAgLyogRklYTUUgLSBhc3N1bWVzIHRoYXQgYWxsIHJlZ2lzdGVycyBhcmUgc2ltcGxlIGludGVnZXJzICovCisgICAgc3dpdGNoIChkZXNjcmlwdGlvbi5zaXplKSB7CisgICAgY2FzZSAxOiAKKyAgICAgICoodW5zaWduZWRfMSopYnVmID0gSDJUXzEoKih1bnNpZ25lZF8xKiljb29rZWRfYnVmKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICoodW5zaWduZWRfMiopYnVmID0gSDJUXzIoKih1bnNpZ25lZF8yKiljb29rZWRfYnVmKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICoodW5zaWduZWRfNCopYnVmID0gSDJUXzQoKih1bnNpZ25lZF80Kiljb29rZWRfYnVmKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgICoodW5zaWduZWRfOCopYnVmID0gSDJUXzgoKih1bnNpZ25lZF84Kiljb29rZWRfYnVmKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBtZW1jcHkoYnVmLypkZXN0Ki8sIGNvb2tlZF9idWYvKnNyYyovLCBkZXNjcmlwdGlvbi5zaXplKTsKKyAgfQorCit9CisKKworCitJTkxJTkVfUFNJTVwKKyh2b2lkKQorcHNpbV93cml0ZV9yZWdpc3Rlcihwc2ltICpzeXN0ZW0sCisJCSAgICBpbnQgd2hpY2hfY3B1LAorCQkgICAgY29uc3Qgdm9pZCAqYnVmLAorCQkgICAgY29uc3QgY2hhciByZWdbXSwKKwkJICAgIHRyYW5zZmVyX21vZGUgbW9kZSkKK3sKKyAgY3B1ICpwcm9jZXNzb3I7CisgIHJlZ2lzdGVyX2Rlc2NyaXB0aW9ucyBkZXNjcmlwdGlvbjsKKyAgY2hhciBjb29rZWRfYnVmW3NpemVvZih1bnNpZ25lZF84KV07CisKKyAgLyogZmluZCBvdXIgcHJvY2Vzc29yICovCisgIGlmICh3aGljaF9jcHUgPT0gTUFYX05SX1BST0NFU1NPUlMpIHsKKyAgICBpZiAoc3lzdGVtLT5sYXN0X2NwdSA9PSBzeXN0ZW0tPm5yX2NwdXMKKwl8fCBzeXN0ZW0tPmxhc3RfY3B1ID09IC0xKQorICAgICAgd2hpY2hfY3B1ID0gMDsKKyAgICBlbHNlCisgICAgICB3aGljaF9jcHUgPSBzeXN0ZW0tPmxhc3RfY3B1OworICB9CisgIGlmICh3aGljaF9jcHUgPT0gLTEpIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3lzdGVtLT5ucl9jcHVzOyBpKyspCisgICAgICBwc2ltX3dyaXRlX3JlZ2lzdGVyKHN5c3RlbSwgaSwgYnVmLCByZWcsIG1vZGUpOworICAgIHJldHVybjsKKyAgfQorICBBU1NFUlQod2hpY2hfY3B1ID49IDAgJiYgd2hpY2hfY3B1IDwgc3lzdGVtLT5ucl9jcHVzKTsKKworICBwcm9jZXNzb3IgPSBzeXN0ZW0tPnByb2Nlc3NvcnNbd2hpY2hfY3B1XTsKKworICAvKiBmaW5kIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVnaXN0ZXIgKi8KKyAgZGVzY3JpcHRpb24gPSByZWdpc3Rlcl9kZXNjcmlwdGlvbihyZWcpOworICBpZiAoZGVzY3JpcHRpb24udHlwZSA9PSByZWdfaW52YWxpZCkKKyAgICBlcnJvcigicHNpbV93cml0ZV9yZWdpc3RlcigpIGludmFsaWQgcmVnaXN0ZXIgbmFtZSAlc1xuIiwgcmVnKTsKKworICAvKiBJZiB0aGUgZGF0YSBpcyBjb21taW5nIGluIHJhdyAodGFyZ2V0IG9yZGVyKSwgbmVlZCB0byBjb29rIGl0CisgICAgIGludG8gaG9zdCBvcmRlciBiZWZvcmUgcHV0dGluZyBpdCBpbnRvIFBTSU0ncyBpbnRlcm5hbCBzdHJ1Y3R1cmVzICovCisgIGlmIChtb2RlID09IHJhd190cmFuc2ZlcikgeworICAgIHN3aXRjaCAoZGVzY3JpcHRpb24uc2l6ZSkgeworICAgIGNhc2UgMTogCisgICAgICAqKHVuc2lnbmVkXzEqKWNvb2tlZF9idWYgPSBUMkhfMSgqKHVuc2lnbmVkXzEqKWJ1Zik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAqKHVuc2lnbmVkXzIqKWNvb2tlZF9idWYgPSBUMkhfMigqKHVuc2lnbmVkXzIqKWJ1Zik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAqKHVuc2lnbmVkXzQqKWNvb2tlZF9idWYgPSBUMkhfNCgqKHVuc2lnbmVkXzQqKWJ1Zik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICAqKHVuc2lnbmVkXzgqKWNvb2tlZF9idWYgPSBUMkhfOCgqKHVuc2lnbmVkXzgqKWJ1Zik7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgbWVtY3B5KGNvb2tlZF9idWYvKmRlc3QqLywgYnVmLypzcmMqLywgZGVzY3JpcHRpb24uc2l6ZSk7CisgIH0KKworICAvKiBwdXQgdGhlIGNvb2tlZCB2YWx1ZSBpbnRvIHRoZSByZWdpc3RlciAqLworICBzd2l0Y2ggKGRlc2NyaXB0aW9uLnR5cGUpIHsKKworICBjYXNlIHJlZ19ncHI6CisgICAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbZGVzY3JpcHRpb24uaW5kZXhdID0gKihncHJlZyopY29va2VkX2J1ZjsKKyAgICBicmVhazsKKworICBjYXNlIHJlZ19mcHI6CisgICAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5mcHJbZGVzY3JpcHRpb24uaW5kZXhdID0gKihmcHJlZyopY29va2VkX2J1ZjsKKyAgICBicmVhazsKKworICBjYXNlIHJlZ19wYzoKKyAgICBjcHVfc2V0X3Byb2dyYW1fY291bnRlcihwcm9jZXNzb3IsICoodW5zaWduZWRfd29yZCopY29va2VkX2J1Zik7CisgICAgYnJlYWs7CisKKyAgY2FzZSByZWdfc3ByOgorICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+c3ByW2Rlc2NyaXB0aW9uLmluZGV4XSA9ICooc3ByZWcqKWNvb2tlZF9idWY7CisgICAgYnJlYWs7CisKKyAgY2FzZSByZWdfc3I6CisgICAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5zcltkZXNjcmlwdGlvbi5pbmRleF0gPSAqKHNyZWcqKWNvb2tlZF9idWY7CisgICAgYnJlYWs7CisKKyAgY2FzZSByZWdfY3I6CisgICAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5jciA9ICooY3JlZyopY29va2VkX2J1ZjsKKyAgICBicmVhazsKKworICBjYXNlIHJlZ19tc3I6CisgICAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5tc3IgPSAqKG1zcmVnKiljb29rZWRfYnVmOworICAgIGJyZWFrOworCisgIGNhc2UgcmVnX2Zwc2NyOgorICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+ZnBzY3IgPSAqKGZwc2NyZWcqKWNvb2tlZF9idWY7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICBwcmludGZfZmlsdGVyZWQoInBzaW1fd3JpdGVfcmVnaXN0ZXIocHJvY2Vzc29yPTB4JWx4LGNvb2tlZF9idWY9MHglbHgscmVnPSVzKSAlc1xuIiwKKwkJICAgICh1bnNpZ25lZCBsb25nKXByb2Nlc3NvciwgKHVuc2lnbmVkIGxvbmcpY29va2VkX2J1ZiwgcmVnLAorCQkgICAgInJlYWQgb2YgdGhpcyByZWdpc3RlciB1bmltcGxlbWVudGVkIik7CisgICAgYnJlYWs7CisKKyAgfQorCit9CisKKworCitJTkxJTkVfUFNJTVwKKyh1bnNpZ25lZCkKK3BzaW1fcmVhZF9tZW1vcnkocHNpbSAqc3lzdGVtLAorCQkgaW50IHdoaWNoX2NwdSwKKwkJIHZvaWQgKmJ1ZmZlciwKKwkJIHVuc2lnbmVkX3dvcmQgdmFkZHIsCisJCSB1bnNpZ25lZCBucl9ieXRlcykKK3sKKyAgY3B1ICpwcm9jZXNzb3I7CisgIGlmICh3aGljaF9jcHUgPT0gTUFYX05SX1BST0NFU1NPUlMpIHsKKyAgICBpZiAoc3lzdGVtLT5sYXN0X2NwdSA9PSBzeXN0ZW0tPm5yX2NwdXMKKwl8fCBzeXN0ZW0tPmxhc3RfY3B1ID09IC0xKQorICAgICAgd2hpY2hfY3B1ID0gMDsKKyAgICBlbHNlCisgICAgICB3aGljaF9jcHUgPSBzeXN0ZW0tPmxhc3RfY3B1OworICB9CisgIHByb2Nlc3NvciA9IHN5c3RlbS0+cHJvY2Vzc29yc1t3aGljaF9jcHVdOworICByZXR1cm4gdm1fZGF0YV9tYXBfcmVhZF9idWZmZXIoY3B1X2RhdGFfbWFwKHByb2Nlc3NvciksCisJCQkJIGJ1ZmZlciwgdmFkZHIsIG5yX2J5dGVzLAorCQkJCSBOVUxMLCAtMSk7Cit9CisKKworSU5MSU5FX1BTSU1cCisodW5zaWduZWQpCitwc2ltX3dyaXRlX21lbW9yeShwc2ltICpzeXN0ZW0sCisJCSAgaW50IHdoaWNoX2NwdSwKKwkJICBjb25zdCB2b2lkICpidWZmZXIsCisJCSAgdW5zaWduZWRfd29yZCB2YWRkciwKKwkJICB1bnNpZ25lZCBucl9ieXRlcywKKwkJICBpbnQgdmlvbGF0ZV9yZWFkX29ubHlfc2VjdGlvbikKK3sKKyAgY3B1ICpwcm9jZXNzb3I7CisgIGlmICh3aGljaF9jcHUgPT0gTUFYX05SX1BST0NFU1NPUlMpIHsKKyAgICBpZiAoc3lzdGVtLT5sYXN0X2NwdSA9PSBzeXN0ZW0tPm5yX2NwdXMKKwl8fCBzeXN0ZW0tPmxhc3RfY3B1ID09IC0xKQorICAgICAgd2hpY2hfY3B1ID0gMDsKKyAgICBlbHNlCisgICAgICB3aGljaF9jcHUgPSBzeXN0ZW0tPmxhc3RfY3B1OworICB9CisgIEFTU0VSVCh3aGljaF9jcHUgPj0gMCAmJiB3aGljaF9jcHUgPCBzeXN0ZW0tPm5yX2NwdXMpOworICBwcm9jZXNzb3IgPSBzeXN0ZW0tPnByb2Nlc3NvcnNbd2hpY2hfY3B1XTsKKyAgcmV0dXJuIHZtX2RhdGFfbWFwX3dyaXRlX2J1ZmZlcihjcHVfZGF0YV9tYXAocHJvY2Vzc29yKSwKKwkJCQkgIGJ1ZmZlciwgdmFkZHIsIG5yX2J5dGVzLCAxLyp2aW9sYXRlLXJlYWQtb25seSovLAorCQkJCSAgTlVMTCwgLTEpOworfQorCisKK0lOTElORV9QU0lNXAorKHZvaWQpCitwc2ltX3ByaW50X2luZm8ocHNpbSAqc3lzdGVtLAorCQlpbnQgdmVyYm9zZSkKK3sKKyAgbW9uX3ByaW50X2luZm8oc3lzdGVtLCBzeXN0ZW0tPm1vbml0b3IsIHZlcmJvc2UpOworfQorCisKKy8qIE1lcmdlIGEgZGV2aWNlIHRyZWUgYW5kIGEgZGV2aWNlIGZpbGUuICovCisKK0lOTElORV9QU0lNXAorKHZvaWQpCitwc2ltX21lcmdlX2RldmljZV9maWxlKGRldmljZSAqcm9vdCwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSkKK3sKKyAgRklMRSAqZGVzY3JpcHRpb247CisgIGludCBsaW5lX25yOworICBjaGFyIGRldmljZV9wYXRoWzEwMDBdOworICBkZXZpY2UgKmN1cnJlbnQ7CisKKyAgLyogdHJ5IG9wZW5pbmcgdGhlIGZpbGUgKi8KKyAgZGVzY3JpcHRpb24gPSBmb3BlbihmaWxlX25hbWUsICJyIik7CisgIGlmIChkZXNjcmlwdGlvbiA9PSBOVUxMKSB7CisgICAgcGVycm9yKGZpbGVfbmFtZSk7CisgICAgZXJyb3IoIkludmFsaWQgZmlsZSAlcyBzcGVjaWZpZWQiLCBmaWxlX25hbWUpOworICB9CisKKyAgbGluZV9uciA9IDA7CisgIGN1cnJlbnQgPSByb290OworICB3aGlsZSAoZmdldHMoZGV2aWNlX3BhdGgsIHNpemVvZihkZXZpY2VfcGF0aCksIGRlc2NyaXB0aW9uKSkgeworICAgIGNoYXIgKmRldmljZTsKKyAgICAvKiBjaGVjayB0aGF0IHRoZSBmdWxsIGxpbmUgd2FzIHJlYWQgKi8KKyAgICBpZiAoc3RyY2hyKGRldmljZV9wYXRoLCAnXG4nKSA9PSBOVUxMKSB7CisgICAgICBmY2xvc2UoZGVzY3JpcHRpb24pOworICAgICAgZXJyb3IoIiVzOiVkOiBsaW5lIHRvIGxvbmcgLSAlcyIsCisJICAgIGZpbGVfbmFtZSwgbGluZV9uciwgZGV2aWNlX3BhdGgpOworICAgIH0KKyAgICBlbHNlCisgICAgICAqc3RyY2hyKGRldmljZV9wYXRoLCAnXG4nKSA9ICdcMCc7CisgICAgbGluZV9ucisrOworICAgIC8qIHNraXAgY29tbWVudHMgKCIjIiBvciAiOyIpIGFuZCBibGFuayBsaW5lcyBsaW5lcyAqLworICAgIGZvciAoZGV2aWNlID0gZGV2aWNlX3BhdGg7CisJICpkZXZpY2UgIT0gJ1wwJyAmJiBpc3NwYWNlKCpkZXZpY2UpOworCSBkZXZpY2UrKyk7CisgICAgaWYgKGRldmljZVswXSA9PSAnIycKKwl8fCBkZXZpY2VbMF0gPT0gJzsnCisJfHwgZGV2aWNlWzBdID09ICdcMCcpCisgICAgICBjb250aW51ZTsKKyAgICAvKiBtZXJnZSBhbnkgYXBwZW5kZWQgbGluZXMgKi8KKyAgICB3aGlsZSAoZGV2aWNlX3BhdGhbc3RybGVuKGRldmljZV9wYXRoKSAtIDFdID09ICdcXCcpIHsKKyAgICAgIGludCBjdXJsZW4gPSBzdHJsZW4oZGV2aWNlX3BhdGgpIC0gMTsKKyAgICAgIC8qIHphcCBcICovCisgICAgICBkZXZpY2VfcGF0aFtjdXJsZW5dID0gJ1wwJzsKKyAgICAgIC8qIGFwcGVuZCB0aGUgbmV4dCBsaW5lICovCisgICAgICBpZiAoIWZnZXRzKGRldmljZV9wYXRoICsgY3VybGVuLCBzaXplb2YoZGV2aWNlX3BhdGgpIC0gY3VybGVuLCBkZXNjcmlwdGlvbikpIHsKKwlmY2xvc2UoZGVzY3JpcHRpb24pOworCWVycm9yKCIlczolczogdW5leHBlY3RlZCBlb2YgaW4gbGluZSBjb250aW51YXRpb24gLSAlcyIsCisJICAgICAgZmlsZV9uYW1lLCBsaW5lX25yLCBkZXZpY2VfcGF0aCk7CisgICAgICB9CisgICAgICBpZiAoc3RyY2hyKGRldmljZV9wYXRoLCAnXG4nKSA9PSBOVUxMKSB7CisJZmNsb3NlKGRlc2NyaXB0aW9uKTsKKwllcnJvcigiJXM6JWQ6IGxpbmUgdG8gbG9uZyAtICVzIiwKKwkgICAgZmlsZV9uYW1lLCBsaW5lX25yLCBkZXZpY2VfcGF0aCk7CisgICAgICB9CisgICAgICBlbHNlCisJKnN0cmNocihkZXZpY2VfcGF0aCwgJ1xuJykgPSAnXDAnOworICAgICAgbGluZV9ucisrOworICAgIH0KKyAgICAvKiBwYXJzZSB0aGlzIGxpbmUgKi8KKyAgICBjdXJyZW50ID0gdHJlZV9wYXJzZShjdXJyZW50LCAiJXMiLCBkZXZpY2UpOworICB9CisgIGZjbG9zZShkZXNjcmlwdGlvbik7Cit9CisKKworI2VuZGlmIC8qIF9QU0lNX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL3BzaW0uaCBiL3NpbS9wcGMvcHNpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwY2YzYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL3BzaW0uaApAQCAtMCwwICsxLDE4MSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfUFNJTV9IXworI2RlZmluZSBfUFNJTV9IXworCisjaW5jbHVkZSAiYmFzaWNzLmgiCisKKworLyogdGhlIHN5c3RlbSBvYmplY3QgKi8KKy8qIHR5cGVkZWYgc3RydWN0IF9wc2ltIHBzaW07ICovCisvKiB0eXBlZGVmIHN0cnVjdCBfZGV2aWNlIGRldmljZTsgKi8KKworLyogd2hlbiB0aGUgYHN5c3RlbScgc3RvcHMsIGZpbmQgb3V0IHdoeS4gIEZJWE1FIC0gYXQgdGhpcyBwb2ludCB0aGlzCisgICBpcyByZWFsbHkgYSBiaXQgcHV6emxpbmcuICBBZnRlciBhbGwsIGhvdyBjYW4gdGhlcmUgYmUgYSBzdGF0dXMKKyAgIHdoZW4gdGhlcmUgc2V2ZXJhbCBwcm9jZXNzb3JzIGludm9sdmVkICovCisKK3R5cGVkZWYgc3RydWN0IF9wc2ltX3N0YXR1cyB7CisgIGludCBjcHVfbnI7CisgIHN0b3BfcmVhc29uIHJlYXNvbjsKKyAgaW50IHNpZ25hbDsKKyAgdW5zaWduZWRfd29yZCBwcm9ncmFtX2NvdW50ZXI7Cit9IHBzaW1fc3RhdHVzOworCisKKy8qIGNyZWF0ZSBhbiBpbml0aWFsIGRldmljZSB0cmVlIGFuZCB0aGVuIHBvcHVsYXRlIGl0IHVzaW5nCisgICBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIGVpdGhlciB0aGUgY29tbWFuZCBsaW5lIG9yIGEgZmlsZSAqLworCitleHRlcm4gZGV2aWNlICpwc2ltX3RyZWUKKyh2b2lkKTsKKworZXh0ZXJuIGNoYXIgKipwc2ltX29wdGlvbnMKKyhkZXZpY2UgKnJvb3QsCisgY2hhciAqKmFyZ3YpOworCitleHRlcm4gdm9pZCBwc2ltX2NvbW1hbmQKKyhkZXZpY2UgKnJvb3QsCisgY2hhciAqKmFyZ3YpOworCisKK2V4dGVybiB2b2lkIHBzaW1fbWVyZ2VfZGV2aWNlX2ZpbGUKKyhkZXZpY2UgKnJvb3QsCisgY29uc3QgY2hhciAqZmlsZV9uYW1lKTsKKworZXh0ZXJuIHZvaWQgcHNpbV91c2FnZQorKGludCB2ZXJib3NlKTsKKworCisvKiBjcmVhdGUgYSBuZXcgc2ltdWxhdG9yIGZyb20gdGhlIGRldmljZSB0cmVlICovCisKK2V4dGVybiBwc2ltICpwc2ltX2NyZWF0ZQorKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKKyBkZXZpY2UgKnJvb3QpOworCisKKy8qIEdpdmVuIHRoZSBjcmVhdGVkIHNpbXVsYXRvciAocmUpIGluaXRpYWxpemUgaXQgKi8KKworZXh0ZXJuIHZvaWQgcHNpbV9pbml0CisocHNpbSAqc3lzdGVtKTsKKworZXh0ZXJuIHZvaWQgcHNpbV9zdGFjaworKHBzaW0gKnN5c3RlbSwKKyBjaGFyICoqYXJndiwKKyBjaGFyICoqZW52cCk7CisKKworLyogUnVuL3N0b3AgdGhlIHN5c3RlbSAqLworCitleHRlcm4gdm9pZCBwc2ltX3N0ZXAKKyhwc2ltICpzeXN0ZW0pOworCitleHRlcm4gdm9pZCBwc2ltX3J1bgorKHBzaW0gKnN5c3RlbSk7CisKK2V4dGVybiB2b2lkIHBzaW1fcmVzdGFydAorKHBzaW0gKnN5c3RlbSwKKyBpbnQgY3B1X25yKTsKKworZXh0ZXJuIHZvaWQgcHNpbV9zZXRfaGFsdF9hbmRfcmVzdGFydAorKHBzaW0gKnN5c3RlbSwKKyB2b2lkICpoYWx0X2ptcF9idWYsCisgdm9pZCAqcmVzdGFydF9qbXBfYnVmKTsKKworZXh0ZXJuIHZvaWQgcHNpbV9jbGVhcl9oYWx0X2FuZF9yZXN0YXJ0CisocHNpbSAqc3lzdGVtKTsKKworZXh0ZXJuIHZvaWQgcHNpbV9zdG9wCisocHNpbSAqc3lzdGVtKTsKKworZXh0ZXJuIHZvaWQgcHNpbV9oYWx0CisocHNpbSAqc3lzdGVtLAorIGludCBjcHVfbnIsCisgc3RvcF9yZWFzb24gcmVhc29uLAorIGludCBzaWduYWwpOworCitleHRlcm4gaW50IHBzaW1fbGFzdF9jcHUKKyhwc2ltICpzeXN0ZW0pOworCitleHRlcm4gaW50IHBzaW1fbnJfY3B1cworKHBzaW0gKnN5c3RlbSk7CisKKworZXh0ZXJuIHBzaW1fc3RhdHVzIHBzaW1fZ2V0X3N0YXR1cworKHBzaW0gKnN5c3RlbSk7CisKKworLyogcmV2ZWFsIHRoZSBpbnRlcm5hbHMgb2YgdGhlIHNpbXVsYXRpb24uICBHcmFudCBhY2Nlc3MgdG8gdGhlCisgICBwcm9jZXNzb3IgKGNwdSkgZGV2aWNlIHRyZWUgKGRldmljZSkgYW5kIGV2ZW50cyAoZXZlbnRfcXVldWUpLiAqLworCitleHRlcm4gY3B1ICpwc2ltX2NwdQorKHBzaW0gKnN5c3RlbSwKKyBpbnQgY3B1X25yKTsKKworZXh0ZXJuIGRldmljZSAqcHNpbV9kZXZpY2UKKyhwc2ltICpzeXN0ZW0sCisgY29uc3QgY2hhciAqcGF0aCk7CisKK2V4dGVybiBldmVudF9xdWV1ZSAqcHNpbV9ldmVudF9xdWV1ZQorKHBzaW0gKnN5c3RlbSk7CisgCisKKworLyogbWFuaXB1bGF0ZSB0aGUgc3RhdGUgKHJlZ2lzdGVycyBvciBtZW1vcnkpIG9mIGEgcHJvY2Vzc29yIHdpdGhpbgorICAgdGhlIHN5c3RlbS4gIEluIHRoZSBjYXNlIG9mIG1lbW9yeSwgdGhlIHJlYWQvd3JpdGUgaXMgcGVyZm9ybWVkCisgICB1c2luZyB0aGUgc3BlY2lmaWVkIHByb2Nlc3NvcnMgYWRkcmVzcyB0cmFuc2xhdGlvbiB0YWJsZXMuCisKKyAgIFdoZXJlIGFwcGxpY2FibGUsIFdISUNIX0NQVSA9PSAtMSBpbmRpY2F0ZXMgYWxsIHByb2Nlc3NvcnMgYW5kCisgICBXSElDSF9DUFUgPT0gPG5yX2NwdXM+IGluZGljYXRlcyB0aGUgYGN1cnJlbnQnIHByb2Nlc3Nvci4gKi8KKworZXh0ZXJuIHZvaWQgcHNpbV9yZWFkX3JlZ2lzdGVyCisocHNpbSAqc3lzdGVtLAorIGludCB3aGljaF9jcHUsCisgdm9pZCAqaG9zdF9vcmRlcmVkX2J1ZiwKKyBjb25zdCBjaGFyIHJlZ1tdLAorIHRyYW5zZmVyX21vZGUgbW9kZSk7CisKK2V4dGVybiB2b2lkIHBzaW1fd3JpdGVfcmVnaXN0ZXIKKyhwc2ltICpzeXN0ZW0sCisgaW50IHdoaWNoX2NwdSwKKyBjb25zdCB2b2lkICpidWYsCisgY29uc3QgY2hhciByZWdbXSwKKyB0cmFuc2Zlcl9tb2RlIG1vZGUpOworCitleHRlcm4gdW5zaWduZWQgcHNpbV9yZWFkX21lbW9yeQorKHBzaW0gKnN5c3RlbSwKKyBpbnQgd2hpY2hfY3B1LAorIHZvaWQgKmJ1ZiwKKyB1bnNpZ25lZF93b3JkIHZhZGRyLAorIHVuc2lnbmVkIGxlbik7CisKK2V4dGVybiB1bnNpZ25lZCBwc2ltX3dyaXRlX21lbW9yeQorKHBzaW0gKnN5c3RlbSwKKyBpbnQgd2hpY2hfY3B1LAorIGNvbnN0IHZvaWQgKmJ1ZiwKKyB1bnNpZ25lZF93b3JkIHZhZGRyLAorIHVuc2lnbmVkIGxlbiwKKyBpbnQgdmlvbGF0ZV9yZWFkX29ubHlfc2VjdGlvbik7CisKK2V4dGVybiB2b2lkIHBzaW1fcHJpbnRfaW5mbworKHBzaW0gKnN5c3RlbSwKKyBpbnQgdmVyYm9zZSk7CisKKyNlbmRpZiAvKiBfUFNJTV9IXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9wc2ltLnRleGluZm8gYi9zaW0vcHBjL3BzaW0udGV4aW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODFlNDYwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9wc2ltLnRleGluZm8KQEAgLTAsMCArMSwxMTA1IEBACitcaW5wdXQgdGV4aW5mby50ZXggICAgQGMgLSotdGV4aW5mby0qLQorQGNvbW1lbnQgJSoqc3RhcnQgb2YgaGVhZGVyCitAc2V0ZmlsZW5hbWUgdGV4aW5mbworQHNldHRpdGxlIFRleGluZm8gQHZhbHVle2VkaXRpb259CitAc3luY29kZWluZGV4IHZyIGZuCitAZm9vdG5vdGVzdHlsZSBzZXBhcmF0ZQorQHBhcmFncmFwaGluZGVudCAyCitAc21hbGxib29rCitAY29tbWVudCAlKiplbmQgb2YgaGVhZGVyCisKK0BjIFNldCBzbWFsbGJvb2sgaWYgcHJpbnRpbmcgaW4gc21hbGxib29rIGZvcm1hdCBzbyB0aGUgZXhhbXBsZSBvZiB0aGUKK0BjIHNtYWxsYm9vayBmb250IGlzIGFjdHVhbGx5IHdyaXR0ZW4gdXNpbmcgc21hbGxib29rOyBpbiBiaWdib29rLCBhIGtsdWRnZQorQGMgaXMgdXNlZCBmb3IgVGVYIG91dHB1dC4KK0BzZXQgc21hbGxib29rCitAYyBAQGNsZWFyIHNtYWxsYm9vaworCitAaWdub3JlCitAaWZpbmZvCitAZm9ybWF0CitTVEFSVC1JTkZPLURJUi1FTlRSWQorKiBUZXhpbmZvOiAodGV4aW5mbykuICAgICAgICAgICBUaGUgZG9jdW1lbnRhdGlvbiBmb3JtYXQgZm9yIHRoZSBHTlUgUHJvamVjdC4KK0VORC1JTkZPLURJUi1FTlRSWQorQGVuZCBmb3JtYXQKK0BlbmQgaWZpbmZvCitAZW5kIGlnbm9yZQorCitAc2V0IGVkaXRpb24gMi4yMQorQHNldCB1cGRhdGUtZGF0ZSA3IEp1bmUgMTk5NQorQHNldCB1cGRhdGUtbW9udGggSnVuZSAxOTk1CisKK0BjIEV4cGVyaW1lbnQgd2l0aCBzbWFsbGVyIGFtb3VudHMgb2Ygd2hpdGVzcGFjZSBiZXR3ZWVuIGNoYXB0ZXJzCitAYyBhbmQgc2VjdGlvbnMuCitAdGV4CitcZ2xvYmFsXGNoYXBoZWFkaW5nc2tpcCA9IDE1cHQgcGx1cyA0cHQgbWludXMgMnB0IAorXGdsb2JhbFxzZWNoZWFkaW5nc2tpcCA9IDEycHQgcGx1cyAzcHQgbWludXMgMnB0CitcZ2xvYmFsXHN1YnNlY2hlYWRpbmdza2lwID0gOXB0IHBsdXMgMnB0IG1pbnVzIDJwdAorQGVuZCB0ZXgKKworQGMgRXhwZXJpbWVudCB3aXRoIHNtYWxsZXIgYW1vdW50cyBvZiB3aGl0ZXNwYWNlIGJldHdlZW4gcGFyYWdyYXBocyBpbgorQGMgdGhlIDguNSBieSAxMSBpbmNoIGZvcm1hdC4KK0BpZmNsZWFyIHNtYWxsYm9vaworQHRleAorXGdsb2JhbFxwYXJza2lwIDZwdCBwbHVzIDFwdAorQGVuZCB0ZXgKK0BlbmQgaWZjbGVhcgorCitAZmluYWxvdXQKKworQGMgQ3VycmVudGx5IHVuZG9jdW1lbnRlZCBjb21tYW5kLCA1IERlY2VtYmVyIDE5OTM6CitAYworQGMgbndub2RlICAgICAgICAgIChTYW1lIGFzIG5vZGUsIGJ1dCBubyB3YXJuaW5nczsgZm9yIGBtYWtlaW5mbycuKQorCitAaWZpbmZvCitUaGlzIGZpbGUgZG9jdW1lbnRzIFRleGluZm8sIGEgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gdGhhdCB1c2VzIGEgc2luZ2xlCitzb3VyY2UgZmlsZSB0byBwcm9kdWNlIGJvdGggb24tbGluZSBpbmZvcm1hdGlvbiBhbmQgYSBwcmludGVkIG1hbnVhbC4KKworQ29weXJpZ2h0IChDKSAxOTg4LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIHRoZSBzZWNvbmQgZWRpdGlvbiBvZiB0aGUgVGV4aW5mbyBkb2N1bWVudGF0aW9uLEAqCithbmQgaXMgY29uc2lzdGVudCB3aXRoIHZlcnNpb24gMiBvZiBAZmlsZXt0ZXhpbmZvLnRleH0uCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgordGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKK2FyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKworQGlnbm9yZQorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGVYIGFuZCBwcmludCB0aGUKK3Jlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCitub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKKyh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KKworQGVuZCBpZ25vcmUKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCityZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KK25vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAoraW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMsCitleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBzdGF0ZWQgaW4gYSB0cmFuc2xhdGlvbiBhcHByb3ZlZAorYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KK0BlbmQgaWZpbmZvCisKK0BzZXRjaGFwdGVybmV3cGFnZSBvZGQKKworQHNob3J0dGl0bGVwYWdlIFRleGluZm8KKworQHRpdGxlcGFnZQorQGMgdXNlIHRoZSBuZXcgZm9ybWF0IGZvciB0aXRsZXMKK0B0aXRsZSBUZXhpbmZvCitAc3VidGl0bGUgVGhlIEdOVSBEb2N1bWVudGF0aW9uIEZvcm1hdAorQHN1YnRpdGxlIEVkaXRpb24gQHZhbHVle2VkaXRpb259LCBmb3IgVGV4aW5mbyBWZXJzaW9uIFRocmVlCitAc3VidGl0bGUgQHZhbHVle3VwZGF0ZS1tb250aH0KKworQGF1dGhvciBieSBSb2JlcnQgSi4gQ2hhc3NlbGwgYW5kIFJpY2hhcmQgTS4gU3RhbGxtYW4KKworQGNvbW1lbnQgICBJbmNsdWRlIHRoZSBEaXN0cmlidXRpb24gaW5zaWRlIHRoZSB0aXRsZXBhZ2Ugc28KK0BjIHRoYXQgaGVhZGluZ3MgYXJlIHR1cm5lZCBvZmYuIAorCitAcGFnZQorQHZza2lwIDBwdCBwbHVzIDFmaWxsbAorQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTg4LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitAc3AgMgorVGhpcyBpcyB0aGUgc2Vjb25kIGVkaXRpb24gb2YgdGhlIFRleGluZm8gZG9jdW1lbnRhdGlvbixAKgorYW5kIGlzIGNvbnNpc3RlbnQgd2l0aCB2ZXJzaW9uIDIgb2YgQGZpbGV7dGV4aW5mby50ZXh9LgorQHNwIDIKKworUHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gQCoKKzU5IFRlbXBsZSBQbGFjZSBTdWl0ZSAzMzAsIEAqCitCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIEAqCitQcmludGVkIGNvcGllcyBhcmUgYXZhaWxhYmxlIGZvciAkMTUgZWFjaC5AKgorSVNCTiAxLTg4MjExNC02My05CitAYyBJU0JOIG51bWJlciAxLTg4MjExNC02My05IGlzIGZvciBlZGl0aW9uIDIuMjAgb2YgMjggRmVicnVhcnkgMTk5NQorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKK21hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCityZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KK25vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAoraW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMsCitleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBzdGF0ZWQgaW4gYSB0cmFuc2xhdGlvbiBhcHByb3ZlZAorYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KK0BzcCAyCitDb3ZlciBhcnQgYnkgRXRpZW5uZSBTdXZhc2EuCitAZW5kIHRpdGxlcGFnZQorCitAaWZpbmZvCitAbm9kZSBUb3AsIENvcHlpbmcsIChkaXIpLCAoZGlyKQorQHRvcCBUZXhpbmZvCisKK1RleGluZm8gaXMgYSBkb2N1bWVudGF0aW9uIHN5c3RlbSB0aGF0IHVzZXMgYSBzaW5nbGUgc291cmNlIGZpbGUgdG8KK3Byb2R1Y2UgYm90aCBvbi1saW5lIGluZm9ybWF0aW9uIGFuZCBwcmludGVkIG91dHB1dC5AcmVmaWxsCisKK1RoZSBmaXJzdCBwYXJ0IG9mIHRoaXMgbWFzdGVyIG1lbnUgbGlzdHMgdGhlIG1ham9yIG5vZGVzIGluIHRoaXMgSW5mbworZG9jdW1lbnQsIGluY2x1ZGluZyB0aGUgQEAtY29tbWFuZCBhbmQgY29uY2VwdCBpbmRpY2VzLiAgVGhlIHJlc3Qgb2YKK3RoZSBtZW51IGxpc3RzIGFsbCB0aGUgbG93ZXIgbGV2ZWwgbm9kZXMgaW4gdGhlIGRvY3VtZW50LkByZWZpbGwKKworVGhpcyBpcyBFZGl0aW9uIEB2YWx1ZXtlZGl0aW9ufSBvZiB0aGUgVGV4aW5mbyBkb2N1bWVudGF0aW9uLCAKK0B3e0B2YWx1ZXt1cGRhdGUtZGF0ZX0sfSBmb3IgVGV4aW5mbyBWZXJzaW9uIFRocmVlLgorQGVuZCBpZmluZm8KKworQGMgSGVyZSBpcyBhIHNwYXJlIGNvcHkgb2YgdGhlIGNoYXB0ZXIgbWVudSBlbnRyeSBkZXNjcmlwdGlvbnMsCitAYyBpbiBjYXNlIHRoZXkgYXJlIGFjY2lkZW50bHkgZGVsZXRlZCAKK0BpZ25vcmUKK1lvdXIgcmlnaHRzLgorVGV4aW5mbyBpbiBicmllZi4KK0hvdyB0byB1c2UgVGV4aW5mbyBtb2RlLgorV2hhdCBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgVGV4aW5mbyBmaWxlPworV2hhdCBpcyBhdCB0aGUgZW5kIG9mIGEgVGV4aW5mbyBmaWxlPworSG93IHRvIGNyZWF0ZSBjaGFwdGVycywgc2VjdGlvbnMsIHN1YnNlY3Rpb25zLAorICBhcHBlbmRpY2VzLCBhbmQgb3RoZXIgcGFydHMuCitIb3cgdG8gcHJvdmlkZSBzdHJ1Y3R1cmUgZm9yIGEgZG9jdW1lbnQuCitIb3cgdG8gd3JpdGUgbm9kZXMuCitIb3cgdG8gd3JpdGUgbWVudXMuCitIb3cgdG8gd3JpdGUgY3Jvc3MgcmVmZXJlbmNlcy4KK0hvdyB0byBtYXJrIHdvcmRzIGFuZCBwaHJhc2VzIGFzIGNvZGUsCisgIGtleWJvYXJkIGlucHV0LCBtZXRhLXN5bnRhY3RpYworICB2YXJpYWJsZXMsIGFuZCB0aGUgbGlrZS4KK0hvdyB0byB3cml0ZSBxdW90YXRpb25zLCBleGFtcGxlcywgZXRjLgorSG93IHRvIHdyaXRlIGxpc3RzIGFuZCB0YWJsZXMuCitIb3cgdG8gY3JlYXRlIGluZGljZXMuCitIb3cgdG8gaW5zZXJ0IEBALXNpZ25zLCBicmFjZXMsIGV0Yy4KK0hvdyB0byBpbmRpY2F0ZSByZXN1bHRzIG9mIGV2YWx1YXRpb24sCisgIGV4cGFuc2lvbiBvZiBtYWNyb3MsIGVycm9ycywgZXRjLgorSG93IHRvIGZvcmNlIGFuZCBwcmV2ZW50IGxpbmUgYW5kIHBhZ2UgYnJlYWtzLgorSG93IHRvIGRlc2NyaWJlIGZ1bmN0aW9ucyBhbmQgdGhlIGxpa2UgaW4gYSB1bmlmb3JtIG1hbm5lci4KK0hvdyB0byB3cml0ZSBmb290bm90ZXMuCitIb3cgdG8gc3BlY2lmeSB0ZXh0IGZvciBlaXRoZXIgQFRlWHt9IG9yIEluZm8uCitIb3cgdG8gcHJpbnQgaGFyZGNvcHkuCitIb3cgdG8gY3JlYXRlIGFuIEluZm8gZmlsZS4KK0hvdyB0byBpbnN0YWxsIGFuIEluZm8gZmlsZQorQSBsaXN0IG9mIGFsbCB0aGUgVGV4aW5mbyBAQC1jb21tYW5kcy4KK0hpbnRzIG9uIGhvdyB0byB3cml0ZSBhIFRleGluZm8gZG9jdW1lbnQuCitBIHNhbXBsZSBUZXhpbmZvIGZpbGUgdG8gbG9vayBhdC4KK1RlbGwgcmVhZGVycyB0aGV5IGhhdmUgdGhlIHJpZ2h0IHRvIGNvcHkKKyAgYW5kIGRpc3RyaWJ1dGUuCitIb3cgdG8gaW5jb3Jwb3JhdGUgb3RoZXIgVGV4aW5mbyBmaWxlcy4KK0hvdyB0byB3cml0ZSBwYWdlIGhlYWRpbmdzIGFuZCBmb290aW5ncy4KK0hvdyB0byBmaW5kIGZvcm1hdHRpbmcgbWlzdGFrZXMuCitBbGwgYWJvdXQgcGFyYWdyYXBoIHJlZmlsbGluZy4KK0EgZGVzY3JpcHRpb24gb2YgQEAtQ29tbWFuZCBzeW50YXguCitUZXhpbmZvIHNlY29uZCBlZGl0aW9uIGZlYXR1cmVzLgorQSBtZW51IGNvbnRhaW5pbmcgY29tbWFuZHMgYW5kIHZhcmlhYmxlcy4KK0EgbWVudSBjb3ZlcmluZyBtYW55IHRvcGljcy4KK0BlbmQgaWdub3JlCisKK0BtZW51CisqIENvcHlpbmc6OiAgICAgICAgICAgICAgICAgICAgIFlvdXIgcmlnaHRzLiAKKyogT3ZlcnZpZXc6OiAgICAgICAgICAgICAgICAgICAgVGV4aW5mbyBpbiBicmllZi4KKyogVGV4aW5mbyBNb2RlOjogICAgICAgICAgICAgICAgSG93IHRvIHVzZSBUZXhpbmZvIG1vZGUuCisqIEJlZ2lubmluZyBhIEZpbGU6OiAgICAgICAgICAgIFdoYXQgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIFRleGluZm8gZmlsZT8KKyogRW5kaW5nIGEgRmlsZTo6ICAgICAgICAgICAgICAgV2hhdCBpcyBhdCB0aGUgZW5kIG9mIGEgVGV4aW5mbyBmaWxlPworKiBTdHJ1Y3R1cmluZzo6ICAgICAgICAgICAgICAgICBIb3cgdG8gY3JlYXRlIGNoYXB0ZXJzLCBzZWN0aW9ucywgc3Vic2VjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kaWNlcywgYW5kIG90aGVyIHBhcnRzLgorKiBOb2Rlczo6ICAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gd3JpdGUgbm9kZXMuCisqIE1lbnVzOjogICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byB3cml0ZSBtZW51cy4KKyogQ3Jvc3MgUmVmZXJlbmNlczo6ICAgICAgICAgICAgSG93IHRvIHdyaXRlIGNyb3NzIHJlZmVyZW5jZXMuCisqIE1hcmtpbmcgVGV4dDo6ICAgICAgICAgICAgICAgIEhvdyB0byBtYXJrIHdvcmRzIGFuZCBwaHJhc2VzIGFzIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Ym9hcmQgaW5wdXQsIG1ldGEtc3ludGFjdGljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzLCBhbmQgdGhlIGxpa2UuCisqIFF1b3RhdGlvbnMgYW5kIEV4YW1wbGVzOjogICAgIEhvdyB0byB3cml0ZSBxdW90YXRpb25zLCBleGFtcGxlcywgZXRjLgorKiBMaXN0cyBhbmQgVGFibGVzOjogICAgICAgICAgICBIb3cgdG8gd3JpdGUgbGlzdHMgYW5kIHRhYmxlcy4KKyogSW5kaWNlczo6ICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGNyZWF0ZSBpbmRpY2VzLgorKiBJbnNlcnRpb25zOjogICAgICAgICAgICAgICAgICBIb3cgdG8gaW5zZXJ0IEBALXNpZ25zLCBicmFjZXMsIGV0Yy4KKyogR2x5cGhzOjogICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGluZGljYXRlIHJlc3VsdHMgb2YgZXZhbHVhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbnNpb24gb2YgbWFjcm9zLCBlcnJvcnMsIGV0Yy4KKyogQnJlYWtzOjogICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGZvcmNlIGFuZCBwcmV2ZW50IGxpbmUgYW5kIHBhZ2UgYnJlYWtzLgorKiBEZWZpbml0aW9uIENvbW1hbmRzOjogICAgICAgICBIb3cgdG8gZGVzY3JpYmUgZnVuY3Rpb25zIGFuZCB0aGUgbGlrZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhIHVuaWZvcm0gbWFubmVyLgorKiBGb290bm90ZXM6OiAgICAgICAgICAgICAgICAgICBIb3cgdG8gd3JpdGUgZm9vdG5vdGVzLgorKiBDb25kaXRpb25hbHM6OiAgICAgICAgICAgICAgICBIb3cgdG8gc3BlY2lmeSB0ZXh0IGZvciBlaXRoZXIgQFRlWHt9IG9yIEluZm8uCisqIEZvcm1hdC9QcmludCBIYXJkY29weTo6ICAgICAgIEhvdyB0byBjb252ZXJ0IGEgVGV4aW5mbyBmaWxlIHRvIGEgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwcmludGluZyBhbmQgaG93IHRvIHByaW50IHRoYXQgZmlsZS4KKyogQ3JlYXRlIGFuIEluZm8gRmlsZTo6ICAgICAgICAgQ29udmVydCBhIFRleGluZm8gZmlsZSBpbnRvIGFuIEluZm8gZmlsZS4KKyogSW5zdGFsbCBhbiBJbmZvIEZpbGU6OiAgICAgICAgTWFrZSBhbiBJbmZvIGZpbGUgYWNjZXNzaWJsZSB0byB1c2Vycy4KKyogQ29tbWFuZCBMaXN0OjogICAgICAgICAgICAgICAgQWxsIHRoZSBUZXhpbmZvIEBALWNvbW1hbmRzLgorKiBUaXBzOjogICAgICAgICAgICAgICAgICAgICAgICBIaW50cyBvbiBob3cgdG8gd3JpdGUgYSBUZXhpbmZvIGRvY3VtZW50LgorKiBTYW1wbGUgVGV4aW5mbyBGaWxlOjogICAgICAgICBBIHNhbXBsZSBUZXhpbmZvIGZpbGUgdG8gbG9vayBhdC4KKyogU2FtcGxlIFBlcm1pc3Npb25zOjogICAgICAgICAgVGVsbCByZWFkZXJzIHRoZXkgaGF2ZSB0aGUgcmlnaHQgdG8gY29weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBkaXN0cmlidXRlLgorKiBJbmNsdWRlIEZpbGVzOjogICAgICAgICAgICAgICBIb3cgdG8gaW5jb3Jwb3JhdGUgb3RoZXIgVGV4aW5mbyBmaWxlcy4KKyogSGVhZGluZ3M6OiAgICAgICAgICAgICAgICAgICAgSG93IHRvIHdyaXRlIHBhZ2UgaGVhZGluZ3MgYW5kIGZvb3RpbmdzLgorKiBDYXRjaGluZyBNaXN0YWtlczo6ICAgICAgICAgICBIb3cgdG8gZmluZCBmb3JtYXR0aW5nIG1pc3Rha2VzLgorKiBSZWZpbGxpbmcgUGFyYWdyYXBoczo6ICAgICAgICBBbGwgYWJvdXQgcGFyYWdyYXBoIHJlZmlsbGluZy4KKyogQ29tbWFuZCBTeW50YXg6OiAgICAgICAgICAgICAgQSBkZXNjcmlwdGlvbiBvZiBAQC1Db21tYW5kIHN5bnRheC4KKyogT2J0YWluaW5nIFRlWDo6ICAgICAgICAgICAgICAgSG93IHRvIE9idGFpbiBAVGVYe30uCisqIE5ldyBGZWF0dXJlczo6ICAgICAgICAgICAgICAgIFRleGluZm8gc2Vjb25kIGVkaXRpb24gZmVhdHVyZXMuCisqIENvbW1hbmQgYW5kIFZhcmlhYmxlIEluZGV4OjogIEEgbWVudSBjb250YWluaW5nIGNvbW1hbmRzIGFuZCB2YXJpYWJsZXMuCisqIENvbmNlcHQgSW5kZXg6OiAgICAgICAgICAgICAgIEEgbWVudSBjb3ZlcmluZyBtYW55IHRvcGljcy4KKworIC0tLSBUaGUgRGV0YWlsZWQgTm9kZSBMaXN0aW5nIC0tLQorCitPdmVydmlldyBvZiBUZXhpbmZvCisKKyogVXNpbmcgVGV4aW5mbzo6ICAgICAgICAgICAgICAgQ3JlYXRlIGEgY29udmVudGlvbmFsIHByaW50ZWQgYm9vayAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhbiBJbmZvIGZpbGUuCisqIEluZm8gRmlsZXM6OiAgICAgICAgICAgICAgICAgIFdoYXQgaXMgYW4gSW5mbyBmaWxlPworKiBQcmludGVkIEJvb2tzOjogICAgICAgICAgICAgICBDaGFyYWN0ZXJpc3RpY3Mgb2YgYSBwcmludGVkIGJvb2sgb3IgbWFudWFsLgorKiBGb3JtYXR0aW5nIENvbW1hbmRzOjogICAgICAgICBAQC1jb21tYW5kcyBhcmUgdXNlZCBmb3IgZm9ybWF0dGluZy4KKyogQ29udmVudGlvbnM6OiAgICAgICAgICAgICAgICAgR2VuZXJhbCBydWxlcyBmb3Igd3JpdGluZyBhIFRleGluZm8gZmlsZS4KKyogQ29tbWVudHM6OiAgICAgICAgICAgICAgICAgICAgSG93IHRvIHdyaXRlIGNvbW1lbnRzIGFuZCBtYXJrIHJlZ2lvbnMgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmb3JtYXR0aW5nIGNvbW1hbmRzIHdpbGwgaWdub3JlLgorKiBNaW5pbXVtOjogICAgICAgICAgICAgICAgICAgICBXaGF0IGEgVGV4aW5mbyBmaWxlIG11c3QgaGF2ZS4KKyogU2l4IFBhcnRzOjogICAgICAgICAgICAgICAgICAgVXN1YWxseSwgYSBUZXhpbmZvIGZpbGUgaGFzIHNpeCBwYXJ0cy4KKyogU2hvcnQgU2FtcGxlOjogICAgICAgICAgICAgICAgQSBzaG9ydCBzYW1wbGUgVGV4aW5mbyBmaWxlLgorKiBBY2tub3dsZWRnZW1lbnRzOjogICAgICAgICAgICAKKworVXNpbmcgVGV4aW5mbyBNb2RlCisKKyogVGV4aW5mbyBNb2RlIE92ZXJ2aWV3OjogICAgICAgSG93IFRleGluZm8gbW9kZSBjYW4gaGVscCB5b3UuCisqIEVtYWNzIEVkaXRpbmc6OiAgICAgICAgICAgICAgIFRleGluZm8gbW9kZSBhZGRzIHRvIEdOVSBFbWFjcycgZ2VuZXJhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cnBvc2UgZWRpdGluZyBmZWF0dXJlcy4KKyogSW5zZXJ0aW5nOjogICAgICAgICAgICAgICAgICAgSG93IHRvIGluc2VydCBmcmVxdWVudGx5IHVzZWQgQEAtY29tbWFuZHMuIAorKiBTaG93aW5nIHRoZSBTdHJ1Y3R1cmU6OiAgICAgICBIb3cgdG8gc2hvdyB0aGUgc3RydWN0dXJlIG9mIGEgZmlsZS4KKyogVXBkYXRpbmcgTm9kZXMgYW5kIE1lbnVzOjogICAgSG93IHRvIHVwZGF0ZSBvciBjcmVhdGUgbmV3IG5vZGVzIGFuZCBtZW51cy4KKyogSW5mbyBGb3JtYXR0aW5nOjogICAgICAgICAgICAgSG93IHRvIGZvcm1hdCBmb3IgSW5mby4KKyogUHJpbnRpbmc6OiAgICAgICAgICAgICAgICAgICAgSG93IHRvIGZvcm1hdCBhbmQgcHJpbnQgcGFydCBvciBhbGwgb2YgYSBmaWxlLgorKiBUZXhpbmZvIE1vZGUgU3VtbWFyeTo6ICAgICAgICBTdW1tYXJ5IG9mIGFsbCB0aGUgVGV4aW5mbyBtb2RlIGNvbW1hbmRzLgorCitVcGRhdGluZyBOb2RlcyBhbmQgTWVudXMKKworKiBVcGRhdGluZyBDb21tYW5kczo6ICAgICAgICAgICBGaXZlIG1ham9yIHVwZGF0aW5nIGNvbW1hbmRzLgorKiBVcGRhdGluZyBSZXF1aXJlbWVudHM6OiAgICAgICBIb3cgdG8gc3RydWN0dXJlIGEgVGV4aW5mbyBmaWxlIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHRoZSB1cGRhdGluZyBjb21tYW5kLgorKiBPdGhlciBVcGRhdGluZyBDb21tYW5kczo6ICAgICBIb3cgdG8gaW5kZW50IGRlc2NyaXB0aW9ucywgaW5zZXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZyBub2RlcyBsaW5lcywgYW5kIHVwZGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzIGluIHNlcXVlbmNlLgorCitCZWdpbm5pbmcgYSBUZXhpbmZvIEZpbGUKKworKiBGb3VyIFBhcnRzOjogICAgICAgICAgICAgICAgICBGb3VyIHBhcnRzIGJlZ2luIGEgVGV4aW5mbyBmaWxlLgorKiBTYW1wbGUgQmVnaW5uaW5nOjogICAgICAgICAgICBIZXJlIGlzIGEgc2FtcGxlIGJlZ2lubmluZyBmb3IgYSBUZXhpbmZvIGZpbGUuCisqIEhlYWRlcjo6ICAgICAgICAgICAgICAgICAgICAgIFRoZSB2ZXJ5IGJlZ2lubmluZyBvZiBhIFRleGluZm8gZmlsZS4KKyogSW5mbyBTdW1tYXJ5IGFuZCBQZXJtaXNzaW9uczo6ICBTdW1tYXJ5IGFuZCBjb3B5aW5nIHBlcm1pc3Npb25zIGZvciBJbmZvLgorKiBUaXRsZXBhZ2UgJiBDb3B5cmlnaHQgUGFnZTo6ICBDcmVhdGluZyB0aGUgdGl0bGUgYW5kIGNvcHlyaWdodCBwYWdlcy4KKyogVGhlIFRvcCBOb2RlOjogICAgICAgICAgICAgICAgQ3JlYXRpbmcgdGhlIGBUb3AnIG5vZGUgYW5kIG1hc3RlciBtZW51LgorKiBTb2Z0d2FyZSBDb3B5aW5nIFBlcm1pc3Npb25zOjogIEVuc3VyZSB0aGF0IHlvdSBhbmQgb3RoZXJzIGNvbnRpbnVlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSB0aGUgcmlnaHQgdG8gdXNlIGFuZCBzaGFyZSBzb2Z0d2FyZS4KKworVGhlIFRleGluZm8gRmlsZSBIZWFkZXIKKworKiBGaXJzdCBMaW5lOjogICAgICAgICAgICAgICAgICBUaGUgZmlyc3QgbGluZSBvZiBhIFRleGluZm8gZmlsZS4gIAorKiBTdGFydCBvZiBIZWFkZXI6OiAgICAgICAgICAgICBGb3JtYXR0aW5nIGEgcmVnaW9uIHJlcXVpcmVzIHRoaXMuCisqIHNldGZpbGVuYW1lOjogICAgICAgICAgICAgICAgIFRlbGwgSW5mbyB0aGUgbmFtZSBvZiB0aGUgSW5mbyBmaWxlLgorKiBzZXR0aXRsZTo6ICAgICAgICAgICAgICAgICAgICBDcmVhdGUgYSB0aXRsZSBmb3IgdGhlIHByaW50ZWQgd29yay4KKyogc2V0Y2hhcHRlcm5ld3BhZ2U6OiAgICAgICAgICAgU3RhcnQgY2hhcHRlcnMgb24gcmlnaHQtaGFuZCBwYWdlcy4KKyogcGFyYWdyYXBoaW5kZW50OjogICAgICAgICAgICAgQW4gb3B0aW9uIHRvIHNwZWNpZnkgcGFyYWdyYXBoIGluZGVudGF0aW9uLgorKiBFbmQgb2YgSGVhZGVyOjogICAgICAgICAgICAgICBGb3JtYXR0aW5nIGEgcmVnaW9uIHJlcXVpcmVzIHRoaXMuCisKK1RoZSBUaXRsZSBhbmQgQ29weXJpZ2h0IFBhZ2VzCisKKyogdGl0bGVwYWdlOjogICAgICAgICAgICAgICAgICAgQ3JlYXRlIGEgdGl0bGUgZm9yIHRoZSBwcmludGVkIGRvY3VtZW50LgorKiB0aXRsZWZvbnQgY2VudGVyIHNwOjogICAgICAgICBUaGUgQGNvZGV7QEB0aXRsZWZvbnR9LCBAY29kZXtAQGNlbnRlcn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIEBjb2Rle0BAc3B9IGNvbW1hbmRzLgorKiB0aXRsZSBzdWJ0aXRsZSBhdXRob3I6OiAgICAgICBUaGUgQGNvZGV7QEB0aXRsZX0sIEBjb2Rle0BAc3VidGl0bGV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBAY29kZXtAQGF1dGhvcn0gY29tbWFuZHMuCisqIENvcHlyaWdodCAmIFBlcm1pc3Npb25zOjogICAgIEhvdyB0byB3cml0ZSB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIGNvcHlpbmcgcGVybWlzc2lvbnMuCisqIGVuZCB0aXRsZXBhZ2U6OiAgICAgICAgICAgICAgIFR1cm4gb24gcGFnZSBoZWFkaW5ncyBhZnRlciB0aGUgdGl0bGUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weXJpZ2h0IHBhZ2VzLgorKiBoZWFkaW5ncyBvbiBvZmY6OiAgICAgICAgICAgICBBbiBvcHRpb24gZm9yIHR1cm5pbmcgaGVhZGluZ3Mgb24gYW5kIG9mZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBkb3VibGUgb3Igc2luZ2xlIHNpZGVkIHByaW50aW5nLgorCitUaGUgYFRvcCcgTm9kZSBhbmQgTWFzdGVyIE1lbnUKKworKiBUaXRsZSBvZiBUb3AgTm9kZTo6ICAgICAgICAgICBTa2V0Y2ggd2hhdCB0aGUgZmlsZSBpcyBhYm91dC4KKyogTWFzdGVyIE1lbnUgUGFydHM6OiAgICAgICAgICAgQSBtYXN0ZXIgbWVudSBoYXMgdGhyZWUgb3IgbW9yZSBwYXJ0cy4KKworRW5kaW5nIGEgVGV4aW5mbyBGaWxlCisKKyogUHJpbnRpbmcgSW5kaWNlcyAmIE1lbnVzOjogICAgSG93IHRvIHByaW50IGFuIGluZGV4IGluIGhhcmRjb3B5IGFuZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBpbmRleCBtZW51cyBpbiBJbmZvLgorKiBDb250ZW50czo6ICAgICAgICAgICAgICAgICAgICBIb3cgdG8gY3JlYXRlIGEgdGFibGUgb2YgY29udGVudHMuCisqIEZpbGUgRW5kOjogICAgICAgICAgICAgICAgICAgIEhvdyB0byBtYXJrIHRoZSBlbmQgb2YgYSBmaWxlLgorCitDaGFwdGVyIFN0cnVjdHVyaW5nCisKKyogVHJlZSBTdHJ1Y3R1cmluZzo6ICAgICAgICAgICAgQSBtYW51YWwgaXMgbGlrZSBhbiB1cHNpZGUgZG93biB0cmVlIEBkb3Rze30KKyogU3RydWN0dXJpbmcgQ29tbWFuZCBUeXBlczo6ICAgSG93IHRvIGRpdmlkZSBhIG1hbnVhbCBpbnRvIHBhcnRzLgorKiBtYWtlaW5mbyB0b3A6OiAgICAgICAgICAgICAgICBUaGUgQGNvZGV7QEB0b3B9IGNvbW1hbmQsIHBhcnQgb2YgdGhlIGBUb3AnIG5vZGUuCisqIGNoYXB0ZXI6OiAgICAgICAgICAgICAgICAgICAgIAorKiB1bm51bWJlcmVkICYgYXBwZW5kaXg6OiAgICAgICAKKyogbWFqb3JoZWFkaW5nICYgY2hhcGhlYWRpbmc6OiAgCisqIHNlY3Rpb246OiAgICAgICAgICAgICAgICAgICAgIAorKiB1bm51bWJlcmVkc2VjIGFwcGVuZGl4c2VjIGhlYWRpbmc6OiAgCisqIHN1YnNlY3Rpb246OiAgICAgICAgICAgICAgICAgIAorKiB1bm51bWJlcmVkc3Vic2VjIGFwcGVuZGl4c3Vic2VjIHN1YmhlYWRpbmc6OiAgCisqIHN1YnN1YnNlY3Rpb246OiAgICAgICAgICAgICAgIENvbW1hbmRzIGZvciB0aGUgbG93ZXN0IGxldmVsIHNlY3Rpb25zLgorKiBSYWlzZS9sb3dlciBzZWN0aW9uczo6ICAgICAgICBIb3cgdG8gY2hhbmdlIGNvbW1hbmRzJyBoaWVyYXJjaGljYWwgbGV2ZWwuCisKK05vZGVzCisKKyogVHdvIFBhdGhzOjogICAgICAgICAgICAgICAgICAgRGlmZmVyZW50IGNvbW1hbmRzIHRvIHN0cnVjdHVyZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvIG91dHB1dCBhbmQgcHJpbnRlZCBvdXRwdXQuCisqIE5vZGUgTWVudSBJbGx1c3RyYXRpb246OiAgICAgIEEgZGlhZ3JhbSwgYW5kIHNhbXBsZSBub2RlcyBhbmQgbWVudXMuCisqIG5vZGU6OiAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byB3cml0ZSBhIG5vZGUsIGluIGRldGFpbC4KKyogbWFrZWluZm8gUG9pbnRlciBDcmVhdGlvbjo6ICAgSG93IHRvIGNyZWF0ZSBub2RlIHBvaW50ZXJzIHdpdGggQGNvZGV7bWFrZWluZm99LgorCitUaGUgQGNvZGV7QEBub2RlfSBDb21tYW5kCisKKyogTm9kZSBOYW1lczo6ICAgICAgICAgICAgICAgICAgSG93IHRvIGNob29zZSBub2RlIGFuZCBwb2ludGVyIG5hbWVzLgorKiBXcml0aW5nIGEgTm9kZTo6ICAgICAgICAgICAgICBIb3cgdG8gd3JpdGUgYW4gQGNvZGV7QEBub2RlfSBsaW5lLgorKiBOb2RlIExpbmUgVGlwczo6ICAgICAgICAgICAgICBLZWVwIG5hbWVzIHNob3J0LgorKiBOb2RlIExpbmUgUmVxdWlyZW1lbnRzOjogICAgICBLZWVwIG5hbWVzIHVuaXF1ZSwgd2l0aG91dCBAQC1jb21tYW5kcy4KKyogRmlyc3QgTm9kZTo6ICAgICAgICAgICAgICAgICAgSG93IHRvIHdyaXRlIGEgYFRvcCcgbm9kZS4KKyogbWFrZWluZm8gdG9wIGNvbW1hbmQ6OiAgICAgICAgSG93IHRvIHVzZSB0aGUgQGNvZGV7QEB0b3B9IGNvbW1hbmQuIAorKiBUb3AgTm9kZSBTdW1tYXJ5OjogICAgICAgICAgICBXcml0ZSBhIGJyaWVmIGRlc2NyaXB0aW9uIGZvciByZWFkZXJzLgorCitNZW51cworCisqIE1lbnUgTG9jYXRpb246OiAgICAgICAgICAgICAgIFB1dCBhIG1lbnUgaW4gYSBzaG9ydCBub2RlLgorKiBXcml0aW5nIGEgTWVudTo6ICAgICAgICAgICAgICBXaGF0IGlzIGEgbWVudT8KKyogTWVudSBQYXJ0czo6ICAgICAgICAgICAgICAgICAgQSBtZW51IGVudHJ5IGhhcyB0aHJlZSBwYXJ0cy4KKyogTGVzcyBDbHV0dGVyZWQgTWVudSBFbnRyeTo6ICAgVHdvIHBhcnQgbWVudSBlbnRyeS4KKyogTWVudSBFeGFtcGxlOjogICAgICAgICAgICAgICAgVHdvIGFuZCB0aHJlZSBwYXJ0IG1lbnUgZW50cmllcy4KKyogT3RoZXIgSW5mbyBGaWxlczo6ICAgICAgICAgICAgSG93IHRvIHJlZmVyIHRvIGEgZGlmZmVyZW50IEluZm8gZmlsZS4KKworQ3Jvc3MgUmVmZXJlbmNlcworCisqIFJlZmVyZW5jZXM6OiAgICAgICAgICAgICAgICAgIFdoYXQgY3Jvc3MgcmVmZXJlbmNlcyBhcmUgZm9yLgorKiBDcm9zcyBSZWZlcmVuY2UgQ29tbWFuZHM6OiAgICBBIHN1bW1hcnkgb2YgdGhlIGRpZmZlcmVudCBjb21tYW5kcy4KKyogQ3Jvc3MgUmVmZXJlbmNlIFBhcnRzOjogICAgICAgQSBjcm9zcyByZWZlcmVuY2UgaGFzIHNldmVyYWwgcGFydHMuCisqIHhyZWY6OiAgICAgICAgICAgICAgICAgICAgICAgIEJlZ2luIGEgcmVmZXJlbmNlIHdpdGggYFNlZScgQGRvdHN7fQorKiBUb3AgTm9kZSBOYW1pbmc6OiAgICAgICAgICAgICBIb3cgdG8gcmVmZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBhbm90aGVyIGZpbGUuCisqIHJlZjo6ICAgICAgICAgICAgICAgICAgICAgICAgIEEgcmVmZXJlbmNlIGZvciB0aGUgbGFzdCBwYXJ0IG9mIGEgc2VudGVuY2UuCisqIHB4cmVmOjogICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byB3cml0ZSBhIHBhcmVudGhldGljYWwgY3Jvc3MgcmVmZXJlbmNlLgorKiBpbmZvcmVmOjogICAgICAgICAgICAgICAgICAgICBIb3cgdG8gcmVmZXIgdG8gYW4gSW5mby1vbmx5IGZpbGUuCisKK0Bjb2Rle0BAeHJlZn0KKworKiBSZWZlcmVuY2UgU3ludGF4OjogICAgICAgICAgICBXaGF0IGEgcmVmZXJlbmNlIGxvb2tzIGxpa2UgYW5kIHJlcXVpcmVzLgorKiBPbmUgQXJndW1lbnQ6OiAgICAgICAgICAgICAgICBAY29kZXtAQHhyZWZ9IHdpdGggb25lIGFyZ3VtZW50LgorKiBUd28gQXJndW1lbnRzOjogICAgICAgICAgICAgICBAY29kZXtAQHhyZWZ9IHdpdGggdHdvIGFyZ3VtZW50cy4KKyogVGhyZWUgQXJndW1lbnRzOjogICAgICAgICAgICAgQGNvZGV7QEB4cmVmfSB3aXRoIHRocmVlIGFyZ3VtZW50cy4KKyogRm91ciBhbmQgRml2ZSBBcmd1bWVudHM6OiAgICAgQGNvZGV7QEB4cmVmfSB3aXRoIGZvdXIgYW5kIGZpdmUgYXJndW1lbnRzLgorCitNYXJraW5nIFdvcmRzIGFuZCBQaHJhc2VzCisKKyogSW5kaWNhdGluZzo6ICAgICAgICAgICAgICAgICAgSG93IHRvIGluZGljYXRlIGRlZmluaXRpb25zLCBmaWxlcywgZXRjLgorKiBFbXBoYXNpczo6ICAgICAgICAgICAgICAgICAgICBIb3cgdG8gZW1waGFzaXplIHRleHQuCisKK0luZGljYXRpbmcgRGVmaW5pdGlvbnMsIENvbW1hbmRzLCBldGMuCisKKyogVXNlZnVsIEhpZ2hsaWdodGluZzo6ICAgICAgICAgSGlnaGxpZ2h0aW5nIHByb3ZpZGVzIHVzZWZ1bCBpbmZvcm1hdGlvbi4KKyogY29kZTo6ICAgICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGluZGljYXRlIGNvZGUuCisqIGtiZDo6ICAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byBzaG93IGtleWJvYXJkIGlucHV0LgorKiBrZXk6OiAgICAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gc3BlY2lmeSBrZXlzLgorKiBzYW1wOjogICAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gc2hvdyBhIGxpdGVyYWwgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycy4KKyogdmFyOjogICAgICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGluZGljYXRlIGEgbWV0YXN5bnRhY3RpYyB2YXJpYWJsZS4KKyogZmlsZTo6ICAgICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGluZGljYXRlIHRoZSBuYW1lIG9mIGEgZmlsZS4KKyogZGZuOjogICAgICAgICAgICAgICAgICAgICAgICAgSG93IHRvIHNwZWNpZnkgYSBkZWZpbml0aW9uLgorKiBjaXRlOjogICAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gcmVmZXIgdG8gYSBib29rIHRoYXQgaXMgbm90IGluIEluZm8uCisKK0VtcGhhc2l6aW5nIFRleHQKKworKiBlbXBoICYgc3Ryb25nOjogICAgICAgICAgICAgICBIb3cgdG8gZW1waGFzaXplIHRleHQgaW4gVGV4aW5mby4KKyogU21hbGxjYXBzOjogICAgICAgICAgICAgICAgICAgSG93IHRvIHVzZSB0aGUgc21hbGwgY2FwcyBmb250LgorKiBGb250czo6ICAgICAgICAgICAgICAgICAgICAgICBWYXJpb3VzIGZvbnQgY29tbWFuZHMgZm9yIHByaW50ZWQgb3V0cHV0LgorKiBDdXN0b21pemVkIEhpZ2hsaWdodGluZzo6ICAgICBIb3cgdG8gZGVmaW5lIGhpZ2hsaWdodGluZyBjb21tYW5kcy4KKworUXVvdGF0aW9ucyBhbmQgRXhhbXBsZXMKKworKiBCbG9jayBFbmNsb3NpbmcgQ29tbWFuZHM6OiAgICBVc2UgZGlmZmVyZW50IGNvbnN0cnVjdHMgZm9yIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBwdXJwb3Nlcy4KKyogcXVvdGF0aW9uOjogICAgICAgICAgICAgICAgICAgSG93IHRvIHdyaXRlIGEgcXVvdGF0aW9uLgorKiBleGFtcGxlOjogICAgICAgICAgICAgICAgICAgICBIb3cgdG8gd3JpdGUgYW4gZXhhbXBsZSBpbiBhIGZpeGVkLXdpZHRoIGZvbnQuCisqIG5vaW5kZW50OjogICAgICAgICAgICAgICAgICAgIEhvdyB0byBwcmV2ZW50IHBhcmFncmFwaCBpbmRlbnRhdGlvbi4KKyogTGlzcCBFeGFtcGxlOjogICAgICAgICAgICAgICAgSG93IHRvIGlsbHVzdHJhdGUgTGlzcCBjb2RlLgorKiBzbWFsbGV4YW1wbGUgJiBzbWFsbGxpc3A6OiAgICBGb3JtcyBmb3IgdGhlIEBjb2Rle0BAc21hbGxib29rfSBvcHRpb24uCisqIGRpc3BsYXk6OiAgICAgICAgICAgICAgICAgICAgIEhvdyB0byB3cml0ZSBhbiBleGFtcGxlIGluIHRoZSBjdXJyZW50IGZvbnQuCisqIGZvcm1hdDo6ICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byB3cml0ZSBhbiBleGFtcGxlIHRoYXQgZG9lcyBub3QgbmFycm93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcmdpbnMuCisqIGV4ZGVudDo6ICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byB1bmRvIHRoZSBpbmRlbnRhdGlvbiBvZiBhIGxpbmUuCisqIGZsdXNobGVmdCAmIGZsdXNocmlnaHQ6OiAgICAgIEhvdyB0byBwdXNoIHRleHQgZmx1c2hsZWZ0IG9yIGZsdXNocmlnaHQuCisqIGNhcnRvdWNoZTo6ICAgICAgICAgICAgICAgICAgIEhvdyB0byBkcmF3IGNhcnRvdWNoZXMgYXJvdW5kIGV4YW1wbGVzLgorCitNYWtpbmcgTGlzdHMgYW5kIFRhYmxlcworCisqIEludHJvZHVjaW5nIExpc3RzOjogICAgICAgICAgIFRleGluZm8gZm9ybWF0cyBsaXN0cyBmb3IgeW91LgorKiBpdGVtaXplOjogICAgICAgICAgICAgICAgICAgICBIb3cgdG8gY29uc3RydWN0IGEgc2ltcGxlIGxpc3QuCisqIGVudW1lcmF0ZTo6ICAgICAgICAgICAgICAgICAgIEhvdyB0byBjb25zdHJ1Y3QgYSBudW1iZXJlZCBsaXN0LgorKiBUd28tY29sdW1uIFRhYmxlczo6ICAgICAgICAgICBIb3cgdG8gY29uc3RydWN0IGEgdHdvLWNvbHVtbiB0YWJsZS4KKworTWFraW5nIGEgVHdvLWNvbHVtbiBUYWJsZQorCisqIHRhYmxlOjogICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byBjb25zdHJ1Y3QgYSB0d28tY29sdW1uIHRhYmxlLgorKiBmdGFibGUgdnRhYmxlOjogICAgICAgICAgICAgICBIb3cgdG8gY29uc3RydWN0IGEgdHdvLWNvbHVtbiB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYXV0b21hdGljIGluZGV4aW5nLgorKiBpdGVteDo6ICAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gcHV0IG1vcmUgZW50cmllcyBpbiB0aGUgZmlyc3QgY29sdW1uLgorCitDcmVhdGluZyBJbmRpY2VzCisKKyogSW5kZXggRW50cmllczo6ICAgICAgICAgICAgICAgQ2hvb3NlIGRpZmZlcmVudCB3b3JkcyBmb3IgaW5kZXggZW50cmllcy4KKyogUHJlZGVmaW5lZCBJbmRpY2VzOjogICAgICAgICAgVXNlIGRpZmZlcmVudCBpbmRpY2VzIGZvciBkaWZmZXJlbnQga2luZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBlbnRyeS4KKyogSW5kZXhpbmcgQ29tbWFuZHM6OiAgICAgICAgICAgSG93IHRvIG1ha2UgYW4gaW5kZXggZW50cnkuCisqIENvbWJpbmluZyBJbmRpY2VzOjogICAgICAgICAgIEhvdyB0byBjb21iaW5lIGluZGljZXMuCisqIE5ldyBJbmRpY2VzOjogICAgICAgICAgICAgICAgIEhvdyB0byBkZWZpbmUgeW91ciBvd24gaW5kaWNlcy4KKworQ29tYmluaW5nIEluZGljZXMKKworKiBzeW5jb2RlaW5kZXg6OiAgICAgICAgICAgICAgICBIb3cgdG8gbWVyZ2UgdHdvIGluZGljZXMsIHVzaW5nIEBjb2Rle0BAY29kZX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250IGZvciB0aGUgbWVyZ2VkLWZyb20gaW5kZXguCisqIHN5bmluZGV4OjogICAgICAgICAgICAgICAgICAgIEhvdyB0byBtZXJnZSB0d28gaW5kaWNlcywgdXNpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBmb250IG9mIHRoZSBtZXJnZWQtdG8gaW5kZXguCisKK1NwZWNpYWwgSW5zZXJ0aW9ucworCisqIEJyYWNlcyBBdHNpZ25zIFBlcmlvZHM6OiAgICAgIEhvdyB0byBpbnNlcnQgYnJhY2VzLCBAc2FtcHtAQH0gYW5kIHBlcmlvZHMuCisqIGRtbjo6ICAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byBmb3JtYXQgYSBkaW1lbnNpb24uCisqIERvdHMgQnVsbGV0czo6ICAgICAgICAgICAgICAgIEhvdyB0byBpbnNlcnQgZG90cyBhbmQgYnVsbGV0cy4KKyogVGVYIGFuZCBjb3B5cmlnaHQ6OiAgICAgICAgICAgSG93IHRvIGluc2VydCB0aGUgQFRlWHt9IGxvZ28gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBjb3B5cmlnaHQgc3ltYm9sLgorKiBtaW51czo6ICAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gaW5zZXJ0IGEgbWludXMgc2lnbi4KKyogbWF0aDo6ICAgICAgICAgICAgICAgICAgICAgICAgSG93IHRvIGZvcm1hdCBhIG1hdGhlbWF0aWNhbCBleHByZXNzaW9uLgorCitJbnNlcnRpbmcgQHNhbXB7QEB9LCBCcmFjZXMsIGFuZCBQZXJpb2RzCisKKyogSW5zZXJ0aW5nIEFuIEF0c2lnbjo6ICAgICAgICAgCisqIEluc2VydGluZyBCcmFjZXM6OiAgICAgICAgICAgIEhvdyB0byBpbnNlcnQgQHNhbXB7QHt9IGFuZCBAc2FtcHtAfX0KKyogQ29udHJvbGxpbmcgU3BhY2luZzo6ICAgICAgICAgSG93IHRvIGluc2VydCB0aGUgcmlnaHQgYW1vdW50IG9mIHNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgcHVuY3R1YXRpb24gd2l0aGluIGEgc2VudGVuY2UuCisKK0luc2VydGluZyBFbGxpcHNpcywgRG90cywgYW5kIEJ1bGxldHMKKworKiBkb3RzOjogICAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gaW5zZXJ0IGRvdHMgQGRvdHN7fQorKiBidWxsZXQ6OiAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gaW5zZXJ0IGEgYnVsbGV0LgorCitJbnNlcnRpbmcgQFRlWHt9IGFuZCB0aGUgQ29weXJpZ2h0IFN5bWJvbAorCisqIHRleDo6ICAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byBpbnNlcnQgdGhlIEBUZVh7fSBsb2dvLgorKiBjb3B5cmlnaHQgc3ltYm9sOjogICAgICAgICAgICBIb3cgdG8gdXNlIEBjb2Rle0BAY29weXJpZ2h0fUB7QH0uCisKK0dseXBocyBmb3IgRXhhbXBsZXMgCisKKyogR2x5cGhzIFN1bW1hcnk6OiAgICAgICAgICAgICAgCisqIHJlc3VsdDo6ICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byBzaG93IHRoZSByZXN1bHQgb2YgZXhwcmVzc2lvbi4KKyogZXhwYW5zaW9uOjogICAgICAgICAgICAgICAgICAgSG93IHRvIGluZGljYXRlIGFuIGV4cGFuc2lvbi4KKyogUHJpbnQgR2x5cGg6OiAgICAgICAgICAgICAgICAgSG93IHRvIGluZGljYXRlIHByaW50ZWQgb3V0cHV0LgorKiBFcnJvciBHbHlwaDo6ICAgICAgICAgICAgICAgICBIb3cgdG8gaW5kaWNhdGUgYW4gZXJyb3IgbWVzc2FnZS4KKyogRXF1aXZhbGVuY2U6OiAgICAgICAgICAgICAgICAgSG93IHRvIGluZGljYXRlIGVxdWl2YWxlbmNlLgorKiBQb2ludCBHbHlwaDo6ICAgICAgICAgICAgICAgICBIb3cgdG8gaW5kaWNhdGUgdGhlIGxvY2F0aW9uIG9mIHBvaW50LgorCitNYWtpbmcgYW5kIFByZXZlbnRpbmcgQnJlYWtzCisKKyogQnJlYWsgQ29tbWFuZHM6OiAgICAgICAgICAgICAgQ2F1c2UgYW5kIHByZXZlbnQgc3BsaXRzLgorKiBMaW5lIEJyZWFrczo6ICAgICAgICAgICAgICAgICBIb3cgdG8gZm9yY2UgYSBzaW5nbGUgbGluZSB0byB1c2UgdHdvIGxpbmVzLgorKiB3OjogICAgICAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gcHJldmVudCB1bndhbnRlZCBsaW5lIGJyZWFrcy4gCisqIHNwOjogICAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byBpbnNlcnQgYmxhbmsgbGluZXMuCisqIHBhZ2U6OiAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byBmb3JjZSB0aGUgc3RhcnQgb2YgYSBuZXcgcGFnZS4KKyogZ3JvdXA6OiAgICAgICAgICAgICAgICAgICAgICAgSG93IHRvIHByZXZlbnQgdW53YW50ZWQgcGFnZSBicmVha3MuCisqIG5lZWQ6OiAgICAgICAgICAgICAgICAgICAgICAgIEFub3RoZXIgd2F5IHRvIHByZXZlbnQgdW53YW50ZWQgcGFnZSBicmVha3MuCisKK0RlZmluaXRpb24gQ29tbWFuZHMKKworKiBEZWYgQ21kIFRlbXBsYXRlOjogICAgICAgICAgICBIb3cgdG8gc3RydWN0dXJlIGEgZGVzY3JpcHRpb24gdXNpbmcgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24gY29tbWFuZC4KKyogT3B0aW9uYWwgQXJndW1lbnRzOjogICAgICAgICAgSG93IHRvIGhhbmRsZSBvcHRpb25hbCBhbmQgcmVwZWF0ZWQgYXJndW1lbnRzLgorKiBkZWZmbng6OiAgICAgICAgICAgICAgICAgICAgICBIb3cgdG8gZ3JvdXAgdHdvIG9yIG1vcmUgYGZpcnN0JyBsaW5lcy4KKyogRGVmIENtZHMgaW4gRGV0YWlsOjogICAgICAgICAgQWxsIHRoZSBkZWZpbml0aW9uIGNvbW1hbmRzLgorKiBEZWYgQ21kIENvbnZlbnRpb25zOjogICAgICAgICBDb252ZW50aW9ucyBmb3Igd3JpdGluZyBkZWZpbml0aW9ucy4KKyogU2FtcGxlIEZ1bmN0aW9uIERlZmluaXRpb246OiAgCisKK1RoZSBEZWZpbml0aW9uIENvbW1hbmRzCisKKyogRnVuY3Rpb25zIENvbW1hbmRzOjogICAgICAgICAgQ29tbWFuZHMgZm9yIGZ1bmN0aW9ucyBhbmQgc2ltaWxhciBlbnRpdGllcy4KKyogVmFyaWFibGVzIENvbW1hbmRzOjogICAgICAgICAgQ29tbWFuZHMgZm9yIHZhcmlhYmxlcyBhbmQgc2ltaWxhciBlbnRpdGllcy4KKyogVHlwZWQgRnVuY3Rpb25zOjogICAgICAgICAgICAgQ29tbWFuZHMgZm9yIGZ1bmN0aW9ucyBpbiB0eXBlZCBsYW5ndWFnZXMuCisqIFR5cGVkIFZhcmlhYmxlczo6ICAgICAgICAgICAgIENvbW1hbmRzIGZvciB2YXJpYWJsZXMgaW4gdHlwZWQgbGFuZ3VhZ2VzLgorKiBBYnN0cmFjdCBPYmplY3RzOjogICAgICAgICAgICBDb21tYW5kcyBmb3Igb2JqZWN0LW9yaWVudGVkIHByb2dyYW1taW5nLgorKiBEYXRhIFR5cGVzOjogICAgICAgICAgICAgICAgICBUaGUgZGVmaW5pdGlvbiBjb21tYW5kIGZvciBkYXRhIHR5cGVzLgorCitGb290bm90ZXMKKworKiBGb290bm90ZSBDb21tYW5kczo6ICAgICAgICAgICBIb3cgdG8gd3JpdGUgYSBmb290bm90ZSBpbiBUZXhpbmZvLgorKiBGb290bm90ZSBTdHlsZXM6OiAgICAgICAgICAgICBDb250cm9sbGluZyBob3cgZm9vdG5vdGVzIGFwcGVhciBpbiBJbmZvLgorCitDb25kaXRpb25hbGx5IFZpc2libGUgVGV4dAorCisqIENvbmRpdGlvbmFsIENvbW1hbmRzOjogICAgICAgIEhvdyB0byBzcGVjaWZ5IHRleHQgZm9yIEluZm8gb3IgQFRlWHt9LgorKiBVc2luZyBPcmRpbmFyeSBUZVggQ29tbWFuZHM6OiAgWW91IGNhbiB1c2UgYW55IGFuZCBhbGwgQFRlWHt9IGNvbW1hbmRzLgorKiBzZXQgY2xlYXIgdmFsdWU6OiAgICAgICAgICAgICBIb3cgdG8gZGVzaWduYXRlIHdoaWNoIHRleHQgdG8gZm9ybWF0IChmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3RoIEluZm8gYW5kIEBUZVh7fSk7IGFuZCBob3cgdG8gc2V0IGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnIHRvIGEgc3RyaW5nIHRoYXQgeW91IGNhbiBpbnNlcnQuCisKK0Bjb2Rle0BAc2V0fSwgQGNvZGV7QEBjbGVhcn0sIGFuZCBAY29kZXtAQHZhbHVlfQorCisqIGlmc2V0IGlmY2xlYXI6OiAgICAgICAgICAgICAgIEZvcm1hdCBhIHJlZ2lvbiBpZiBhIGZsYWcgaXMgc2V0LgorKiB2YWx1ZTo6ICAgICAgICAgICAgICAgICAgICAgICBSZXBsYWNlIGEgZmxhZyB3aXRoIGEgc3RyaW5nLiAKKyogdmFsdWUgRXhhbXBsZTo6ICAgICAgICAgICAgICAgQW4gZWFzeSB3YXkgdG8gdXBkYXRlIGVkaXRpb24gaW5mb3JtYXRpb24uCisKK0Zvcm1hdCBhbmQgUHJpbnQgSGFyZGNvcHkKKworKiBVc2UgVGVYOjogICAgICAgICAgICAgICAgICAgICBVc2UgQFRlWHt9IHRvIGZvcm1hdCBmb3IgaGFyZGNvcHkuCisqIEZvcm1hdCB3aXRoIHRleC90ZXhpbmRleDo6ICAgIEhvdyB0byBmb3JtYXQgaW4gYSBzaGVsbC4KKyogRm9ybWF0IHdpdGggdGV4aTJkdmk6OiAgICAgICAgQSBzaW1wbGVyIHdheSB0byB1c2UgdGhlIHNoZWxsLgorKiBQcmludCB3aXRoIGxwcjo6ICAgICAgICAgICAgICBIb3cgdG8gcHJpbnQuCisqIFdpdGhpbiBFbWFjczo6ICAgICAgICAgICAgICAgIEhvdyB0byBmb3JtYXQgYW5kIHByaW50IGZyb20gYW4gRW1hY3Mgc2hlbGwuCisqIFRleGluZm8gTW9kZSBQcmludGluZzo6ICAgICAgIEhvdyB0byBmb3JtYXQgYW5kIHByaW50IGluIFRleGluZm8gbW9kZS4KKyogQ29tcGlsZS1Db21tYW5kOjogICAgICAgICAgICAgSG93IHRvIHByaW50IHVzaW5nIEVtYWNzJ3MgY29tcGlsZSBjb21tYW5kLgorKiBSZXF1aXJlbWVudHMgU3VtbWFyeTo6ICAgICAgICBAVGVYe30gZm9ybWF0dGluZyByZXF1aXJlbWVudHMgc3VtbWFyeS4KKyogUHJlcGFyaW5nIGZvciBUZVg6OiAgICAgICAgICAgV2hhdCB5b3UgbmVlZCB0byBkbyB0byB1c2UgQFRlWHt9LgorKiBPdmVyZnVsbCBoYm94ZXM6OiAgICAgICAgICAgICBXaGF0IGFyZSBhbmQgd2hhdCB0byBkbyB3aXRoIG92ZXJmdWxsIGhib3hlcy4KKyogc21hbGxib29rOjogICAgICAgICAgICAgICAgICAgSG93IHRvIHByaW50IHNtYWxsIGZvcm1hdCBib29rcyBhbmQgbWFudWFscy4KKyogQTQgUGFwZXI6OiAgICAgICAgICAgICAgICAgICAgSG93IHRvIHByaW50IG9uIEV1cm9wZWFuIEE0IHBhcGVyLgorKiBDcm9wbWFya3MgYW5kIE1hZ25pZmljYXRpb246OiAgSG93IHRvIHByaW50IG1hcmtzIHRvIGluZGljYXRlIHRoZSBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHBhZ2VzIGFuZCBob3cgdG8gcHJpbnQgc2NhbGVkIHVwIG91dHB1dC4KKworQ3JlYXRpbmcgYW4gSW5mbyBGaWxlCisKKyogbWFrZWluZm8gYWR2YW50YWdlczo6ICAgICAgICAgQGNvZGV7bWFrZWluZm99IHByb3ZpZGVzIGJldHRlciBlcnJvciBjaGVja2luZy4KKyogSW52b2tpbmcgbWFrZWluZm86OiAgICAgICAgICAgSG93IHRvIHJ1biBAY29kZXttYWtlaW5mb30gZnJvbSBhIHNoZWxsLgorKiBtYWtlaW5mbyBvcHRpb25zOjogICAgICAgICAgICBTcGVjaWZ5IGZpbGwtY29sdW1uIGFuZCBvdGhlciBvcHRpb25zLgorKiBQb2ludGVyIFZhbGlkYXRpb246OiAgICAgICAgICBIb3cgdG8gY2hlY2sgdGhhdCBwb2ludGVycyBwb2ludCBzb21ld2hlcmUuCisqIG1ha2VpbmZvIGluIEVtYWNzOjogICAgICAgICAgIEhvdyB0byBydW4gQGNvZGV7bWFrZWluZm99IGZyb20gRW1hY3MuCisqIHRleGluZm8tZm9ybWF0IGNvbW1hbmRzOjogICAgIFR3byBJbmZvIGZvcm1hdHRpbmcgY29tbWFuZHMgd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEVtYWNzIExpc3AgYXJlIGFuIGFsdGVybmF0aXZlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIEBjb2Rle21ha2VpbmZvfS4KKyogQmF0Y2ggRm9ybWF0dGluZzo6ICAgICAgICAgICAgSG93IHRvIGZvcm1hdCBmb3IgSW5mbyBpbiBFbWFjcyBCYXRjaCBtb2RlLgorKiBUYWcgYW5kIFNwbGl0IEZpbGVzOjogICAgICAgICBIb3cgdGFnZ2VkIGFuZCBzcGxpdCBmaWxlcyBoZWxwIEluZm8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcnVuIGJldHRlci4KKworSW5zdGFsbGluZyBhbiBJbmZvIEZpbGUKKworKiBEaXJlY3RvcnkgZmlsZTo6ICAgICAgICAgICAgICBUaGUgdG9wIGxldmVsIG1lbnUgZm9yIGFsbCBJbmZvIGZpbGVzLgorKiBOZXcgSW5mbyBGaWxlOjogICAgICAgICAgICAgICBMaXN0aW5nIGEgbmV3IGluZm8gZmlsZS4KKyogT3RoZXIgSW5mbyBEaXJlY3Rvcmllczo6ICAgICAgSG93IHRvIHNwZWNpZnkgSW5mbyBmaWxlcyB0aGF0IGFyZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGVkIGluIG90aGVyIGRpcmVjdG9yaWVzLgorCitTYW1wbGUgUGVybWlzc2lvbnMKKworKiBJbnNlcnRpbmcgUGVybWlzc2lvbnM6OiAgICAgICBIb3cgdG8gcHV0IHBlcm1pc3Npb25zIGluIHlvdXIgZG9jdW1lbnQuCisqIGlmaW5mbyBQZXJtaXNzaW9uczo6ICAgICAgICAgIFNhbXBsZSBAc2FtcHtpZmluZm99IGNvcHlpbmcgcGVybWlzc2lvbnMuCisqIFRpdGxlcGFnZSBQZXJtaXNzaW9uczo6ICAgICAgIFNhbXBsZSBUaXRsZXBhZ2UgY29weWluZyBwZXJtaXNzaW9ucy4KKworSW5jbHVkZSBGaWxlcworCisqIFVzaW5nIEluY2x1ZGUgRmlsZXM6OiAgICAgICAgIEhvdyB0byB1c2UgdGhlIEBjb2Rle0BAaW5jbHVkZX0gY29tbWFuZC4KKyogdGV4aW5mby1tdWx0aXBsZS1maWxlcy11cGRhdGU6OiAgSG93IHRvIGNyZWF0ZSBhbmQgdXBkYXRlIG5vZGVzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVzIHdoZW4gdXNpbmcgaW5jbHVkZWQgZmlsZXMuCisqIEluY2x1ZGUgRmlsZSBSZXF1aXJlbWVudHM6OiAgIFdoYXQgQGNvZGV7dGV4aW5mby1tdWx0aXBsZS1maWxlcy11cGRhdGV9IGV4cGVjdHMuCisqIFNhbXBsZSBJbmNsdWRlIEZpbGU6OiAgICAgICAgIEEgc2FtcGxlIG91dGVyIGZpbGUgd2l0aCBpbmNsdWRlZCBmaWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbiBpdDsgYW5kIGEgc2FtcGxlIGluY2x1ZGVkIGZpbGUuCisqIEluY2x1ZGUgRmlsZXMgRXZvbHV0aW9uOjogICAgIEhvdyB1c2Ugb2YgdGhlIEBjb2Rle0BAaW5jbHVkZX0gY29tbWFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBjaGFuZ2VkIG92ZXIgdGltZS4KKworUGFnZSBIZWFkaW5ncworCisqIEhlYWRpbmdzIEludHJvZHVjZWQ6OiAgICAgICAgIENvbnZlbnRpb25zIGZvciB1c2luZyBwYWdlIGhlYWRpbmdzLgorKiBIZWFkaW5nIEZvcm1hdDo6ICAgICAgICAgICAgICBTdGFuZGFyZCBwYWdlIGhlYWRpbmcgZm9ybWF0cy4KKyogSGVhZGluZyBDaG9pY2U6OiAgICAgICAgICAgICAgSG93IHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgcGFnZSBoZWFkaW5nLgorKiBDdXN0b20gSGVhZGluZ3M6OiAgICAgICAgICAgICBIb3cgdG8gY3JlYXRlIHlvdXIgb3duIGhlYWRpbmdzIGFuZCBmb290aW5ncy4KKworRm9ybWF0dGluZyBNaXN0YWtlcworCisqIG1ha2VpbmZvIHByZWZlcnJlZDo6ICAgICAgICAgIEBjb2Rle21ha2VpbmZvfSBmaW5kcyBlcnJvcnMuCisqIERlYnVnZ2luZyB3aXRoIEluZm86OiAgICAgICAgIEhvdyB0byBjYXRjaCBlcnJvcnMgd2l0aCBJbmZvIGZvcm1hdHRpbmcuCisqIERlYnVnZ2luZyB3aXRoIFRlWDo6ICAgICAgICAgIEhvdyB0byBjYXRjaCBlcnJvcnMgd2l0aCBAVGVYe30gZm9ybWF0dGluZy4KKyogVXNpbmcgdGV4aW5mby1zaG93LXN0cnVjdHVyZTo6ICBIb3cgdG8gdXNlIEBjb2Rle3RleGluZm8tc2hvdy1zdHJ1Y3R1cmV9LgorKiBVc2luZyBvY2N1cjo6ICAgICAgICAgICAgICAgICBIb3cgdG8gbGlzdCBhbGwgbGluZXMgY29udGFpbmluZyBhIHBhdHRlcm4uCisqIFJ1bm5pbmcgSW5mby1WYWxpZGF0ZTo6ICAgICAgIEhvdyB0byBmaW5kIGJhZGx5IHJlZmVyZW5jZWQgbm9kZXMuCisKK0ZpbmRpbmcgQmFkbHkgUmVmZXJlbmNlZCBOb2RlcworCisqIFVzaW5nIEluZm8tdmFsaWRhdGU6OiAgICAgICAgIEhvdyB0byBydW4gQGNvZGV7SW5mby12YWxpZGF0ZX0uCisqIFVuc3BsaXQ6OiAgICAgICAgICAgICAgICAgICAgIEhvdyB0byBjcmVhdGUgYW4gdW5zcGxpdCBmaWxlLgorKiBUYWdpZnlpbmc6OiAgICAgICAgICAgICAgICAgICBIb3cgdG8gdGFnaWZ5IGEgZmlsZS4KKyogU3BsaXR0aW5nOjogICAgICAgICAgICAgICAgICAgSG93IHRvIHNwbGl0IGEgZmlsZSBtYW51YWxseS4KKworU2Vjb25kIEVkaXRpb24gRmVhdHVyZXMKKworKiBOZXcgVGV4aW5mbyBNb2RlIENvbW1hbmRzOjogICBUaGUgdXBkYXRpbmcgY29tbWFuZHMgYXJlIGVzcGVjaWFsbHkgdXNlZnVsLgorKiBOZXcgQ29tbWFuZHM6OiAgICAgICAgICAgICAgICBNYW55IG5ld2x5IGRlc2NyaWJlZCBAQC1jb21tYW5kcy4KK0BlbmQgbWVudQorCitAbm9kZSBDb3B5aW5nLCBPdmVydmlldywgVG9wLCBUb3AKK0Bjb21tZW50ICBub2RlLW5hbWUsIG5leHQsIHByZXZpb3VzLCAgdXAKK0B1bm51bWJlcmVkIFRleGluZm8gQ29weWluZyBDb25kaXRpb25zCitAY2luZGV4IENvcHlpbmcgY29uZGl0aW9ucworQGNpbmRleCBDb25kaXRpb25zIGZvciBjb3B5aW5nIFRleGluZm8KKworVGhlIHByb2dyYW1zIGN1cnJlbnRseSBiZWluZyBkaXN0cmlidXRlZCB0aGF0IHJlbGF0ZSB0byBUZXhpbmZvIGluY2x1ZGUKK3BvcnRpb25zIG9mIEdOVSBFbWFjcywgcGx1cyBvdGhlciBzZXBhcmF0ZSBwcm9ncmFtcyAoaW5jbHVkaW5nCitAY29kZXttYWtlaW5mb30sIEBjb2Rle2luZm99LCBAY29kZXt0ZXhpbmRleH0sIGFuZCBAZmlsZXt0ZXhpbmZvLnRleH0pLgorVGhlc2UgcHJvZ3JhbXMgYXJlIEBkZm57ZnJlZX07IHRoaXMgbWVhbnMgdGhhdCBldmVyeW9uZSBpcyBmcmVlIHRvIHVzZQordGhlbSBhbmQgZnJlZSB0byByZWRpc3RyaWJ1dGUgdGhlbSBvbiBhIGZyZWUgYmFzaXMuICBUaGUgVGV4aW5mby1yZWxhdGVkCitwcm9ncmFtcyBhcmUgbm90IGluIHRoZSBwdWJsaWMgZG9tYWluOyB0aGV5IGFyZSBjb3B5cmlnaHRlZCBhbmQgdGhlcmUKK2FyZSByZXN0cmljdGlvbnMgb24gdGhlaXIgZGlzdHJpYnV0aW9uLCBidXQgdGhlc2UgcmVzdHJpY3Rpb25zIGFyZQorZGVzaWduZWQgdG8gcGVybWl0IGV2ZXJ5dGhpbmcgdGhhdCBhIGdvb2QgY29vcGVyYXRpbmcgY2l0aXplbiB3b3VsZCB3YW50Cit0byBkby4gIFdoYXQgaXMgbm90IGFsbG93ZWQgaXMgdG8gdHJ5IHRvIHByZXZlbnQgb3RoZXJzIGZyb20gZnVydGhlcgorc2hhcmluZyBhbnkgdmVyc2lvbiBvZiB0aGVzZSBwcm9ncmFtcyB0aGF0IHRoZXkgbWlnaHQgZ2V0IGZyb20KK3lvdS5AcmVmaWxsCisKKyAgU3BlY2lmaWNhbGx5LCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSByaWdodCB0byBnaXZlCithd2F5IGNvcGllcyBvZiB0aGUgcHJvZ3JhbXMgdGhhdCByZWxhdGUgdG8gVGV4aW5mbywgdGhhdCB5b3UgcmVjZWl2ZQorc291cmNlIGNvZGUgb3IgZWxzZSBjYW4gZ2V0IGl0IGlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZXNlCitwcm9ncmFtcyBvciB1c2UgcGllY2VzIG9mIHRoZW0gaW4gbmV3IGZyZWUgcHJvZ3JhbXMsIGFuZCB0aGF0IHlvdSBrbm93Cit5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy5AcmVmaWxsCisKKyAgVG8gbWFrZSBzdXJlIHRoYXQgZXZlcnlvbmUgaGFzIHN1Y2ggcmlnaHRzLCB3ZSBoYXZlIHRvIGZvcmJpZCB5b3UgdG8KK2RlcHJpdmUgYW55b25lIGVsc2Ugb2YgdGhlc2UgcmlnaHRzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlCitjb3BpZXMgb2YgdGhlIFRleGluZm8gcmVsYXRlZCBwcm9ncmFtcywgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwKK3RoZSByaWdodHMgdGhhdCB5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvcgorY2FuIGdldCB0aGUgc291cmNlIGNvZGUuICBBbmQgeW91IG11c3QgdGVsbCB0aGVtIHRoZWlyIHJpZ2h0cy5AcmVmaWxsCisKKyAgQWxzbywgZm9yIG91ciBvd24gcHJvdGVjdGlvbiwgd2UgbXVzdCBtYWtlIGNlcnRhaW4gdGhhdCBldmVyeW9uZSBmaW5kcworb3V0IHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSBwcm9ncmFtcyB0aGF0IHJlbGF0ZSB0byBUZXhpbmZvLgorSWYgdGhlc2UgcHJvZ3JhbXMgYXJlIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZSB3YW50Cit0aGVpciByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3Qgd2hhdCB3ZSBkaXN0cmlidXRlZCwKK3NvIHRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gb3VyCityZXB1dGF0aW9uLkByZWZpbGwKKworICBUaGUgcHJlY2lzZSBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlcyBmb3IgdGhlIHByb2dyYW1zIGN1cnJlbnRseQorYmVpbmcgZGlzdHJpYnV0ZWQgdGhhdCByZWxhdGUgdG8gVGV4aW5mbyBhcmUgZm91bmQgaW4gdGhlIEdlbmVyYWwgUHVibGljCitMaWNlbnNlcyB0aGF0IGFjY29tcGFueSB0aGVtLkByZWZpbGwKKworQG5vZGUgT3ZlcnZpZXcsIFRleGluZm8gTW9kZSwgQ29weWluZywgVG9wCitAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKK0BjaGFwdGVyIE92ZXJ2aWV3IG9mIFRleGluZm8KK0BjaW5kZXggT3ZlcnZpZXcgb2YgVGV4aW5mbworQGNpbmRleCBUZXhpbmZvIG92ZXJ2aWV3CisKK0BkZm57VGV4aW5mb31AZm9vdG5vdGV7Tm90ZSB0aGF0IHRoZSBmaXJzdCBzeWxsYWJsZSBvZiBgYFRleGluZm8nJyBpcworcHJvbm91bmNlZCBsaWtlIGBgc3BlY2snJywgbm90IGBgaGV4JycuICBUaGlzIG9kZCBwcm9udW5jaWF0aW9uIGlzCitkZXJpdmVkIGZyb20sIGJ1dCBpcyBub3QgdGhlIHNhbWUgYXMsIHRoZSBwcm9udW5jaWF0aW9uIG9mIEBUZVh7fS4gIEluCit0aGUgd29yZCBAVGVYe30sIHRoZSBAc2FtcHtYfSBpcyBhY3R1YWxseSB0aGUgR3JlZWsgbGV0dGVyIGBgY2hpJycKK3JhdGhlciB0aGFuIHRoZSBFbmdsaXNoIGxldHRlciBgYGV4JycuICBQcm9ub3VuY2UgQFRlWHt9IGFzIGlmIHRoZQorQHNhbXB7WH0gd2VyZSB0aGUgbGFzdCBzb3VuZCBpbiB0aGUgbmFtZSBgQmFjaCc7IGJ1dCBwcm9ub3VuY2UgVGV4aW5mbworYXMgaWYgdGhlIEBzYW1we3h9IHdlcmUgYSBgaycuICBTcGVsbCBgYFRleGluZm8nJyB3aXRoIGEgY2FwaXRhbCBgYFQnJworYW5kIHdyaXRlIHRoZSBvdGhlciBsZXR0ZXJzIGluIGxvd2VyIGNhc2UufSAKK2lzIGEgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gdGhhdCB1c2VzIGEgc2luZ2xlIHNvdXJjZSBmaWxlIHRvIHByb2R1Y2UgYm90aAorb24tbGluZSBpbmZvcm1hdGlvbiBhbmQgcHJpbnRlZCBvdXRwdXQuICBUaGlzIG1lYW5zIHRoYXQgaW5zdGVhZCBvZgord3JpdGluZyB0d28gZGlmZmVyZW50IGRvY3VtZW50cywgb25lIGZvciB0aGUgb24tbGluZSBoZWxwIG9yIG90aGVyIG9uLWxpbmUKK2luZm9ybWF0aW9uIGFuZCB0aGUgb3RoZXIgZm9yIGEgdHlwZXNldCBtYW51YWwgb3Igb3RoZXIgcHJpbnRlZCB3b3JrLCB5b3UKK25lZWQgd3JpdGUgb25seSBvbmUgZG9jdW1lbnQuICBXaGVuIHRoZSB3b3JrIGlzIHJldmlzZWQsIHlvdSBuZWVkIHJldmlzZQorb25seSBvbmUgZG9jdW1lbnQuICAoWW91IGNhbiByZWFkIHRoZSBvbi1saW5lIGluZm9ybWF0aW9uLCBrbm93biBhcyBhbgorQGRmbntJbmZvIGZpbGV9LCB3aXRoIGFuIEluZm8gZG9jdW1lbnRhdGlvbi1yZWFkaW5nIHByb2dyYW0uKUByZWZpbGwKKworQG1lbnUKKyogVXNpbmcgVGV4aW5mbzo6ICAgICAgICAgICAgICAgQ3JlYXRlIGEgY29udmVudGlvbmFsIHByaW50ZWQgYm9vayAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhbiBJbmZvIGZpbGUuCisqIEluZm8gRmlsZXM6OiAgICAgICAgICAgICAgICAgIFdoYXQgaXMgYW4gSW5mbyBmaWxlPworKiBQcmludGVkIEJvb2tzOjogICAgICAgICAgICAgICBDaGFyYWN0ZXJpc3RpY3Mgb2YgYSBwcmludGVkIGJvb2sgb3IgbWFudWFsLgorKiBGb3JtYXR0aW5nIENvbW1hbmRzOjogICAgICAgICBAQC1jb21tYW5kcyBhcmUgdXNlZCBmb3IgZm9ybWF0dGluZy4KKyogQ29udmVudGlvbnM6OiAgICAgICAgICAgICAgICAgR2VuZXJhbCBydWxlcyBmb3Igd3JpdGluZyBhIFRleGluZm8gZmlsZS4KKyogQ29tbWVudHM6OiAgICAgICAgICAgICAgICAgICAgSG93IHRvIHdyaXRlIGNvbW1lbnRzIGFuZCBtYXJrIHJlZ2lvbnMgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmb3JtYXR0aW5nIGNvbW1hbmRzIHdpbGwgaWdub3JlLgorKiBNaW5pbXVtOjogICAgICAgICAgICAgICAgICAgICBXaGF0IGEgVGV4aW5mbyBmaWxlIG11c3QgaGF2ZS4KKyogU2l4IFBhcnRzOjogICAgICAgICAgICAgICAgICAgVXN1YWxseSwgYSBUZXhpbmZvIGZpbGUgaGFzIHNpeCBwYXJ0cy4KKyogU2hvcnQgU2FtcGxlOjogICAgICAgICAgICAgICAgQSBzaG9ydCBzYW1wbGUgVGV4aW5mbyBmaWxlLgorKiBBY2tub3dsZWRnZW1lbnRzOjogICAgICAgICAgICAKK0BlbmQgbWVudQorCitAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCisKK1xpbnB1dCB0ZXhpbmZvICBAYyAtKi10ZXhpbmZvLSotCitAYyAlKipzdGFydCBvZiBoZWFkZXIKK0BzZXRmaWxlbmFtZSBwc2ltLmluZm8KK0BzZXR0aXRsZSBQU0lNCitAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCitAYyAlKiplbmQgb2YgaGVhZGVyCisKKworCitAaWZpbmZvCitUaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBwcm9ncmFtIFBTSU0uCisKK0NvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBBbmRyZXcgQ2FnbmV5LgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKK3RoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCithcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCisKK0BpZ25vcmUKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCityZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgorbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCisodGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCisKK0BlbmQgaWdub3JlCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHN1YmplY3QgdG8gdGhlIHRlcm1zCitvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIGluY2x1ZGVzIHRoZSBwcm92aXNpb24gdGhhdCB0aGUKK2VudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAoraW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCitAZW5kIGlmaW5mbworCisKK0B0aXRsZXBhZ2UKK0B0aXRsZSBQU0lNCitAc3VidGl0bGUgTW9kZWwgb2YgdGhlIFBvd2VyUEMgRW52aXJvbm1lbnRzCitAYXV0aG9yIEFuZHJldyBDYWduZXkKKworQHBhZ2UKK0B2c2tpcCBPcHQgcGx1cyBpZmlsbAorQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTk0LTE5OTYsIEFuZHJldyBDYWduZXkKKworVGhpcyBpcyB0aGUgZmlyc3QgZWRpdGlvbiBvZiB0aGUgUFNJTSBtYW51YWwgYW5kIGlzIGNvbnNpc3RlbnQgd2l0aCBQU0lNCit2ZXJzaW9uIDEuMC4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCit0aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQorYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgorCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCittYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHN1YmplY3QgdG8gdGhlIHRlcm1zCitvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIGluY2x1ZGVzIHRoZSBwcm92aXNpb24gdGhhdCB0aGUKK2VudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCitwZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAoraW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCitAZW5kIHRpdGxlcGFnZQorCisKKworQG1lbnUKKworKiBDb3B5aW5nOjogICAgICAgICAgICAgWW91ciByaWdodHMgYW5kIGZyZWVkb21zLgorKiBGaXJzdCBDaGFwcGV0ZXI6OiAgICAgR2V0dGluZyBzdGFydGVkIC4uLi4KKyogU2Vjb25kIENoYXB0ZXI6OiAgICAgIEdldHRpbmcgZmluaXNoZWQgLi4uLgorCisKK0BlbmQgbWVudQorCisKK1BTSU0gaXMgYSBwcm9ncmFtIHdyaXR0ZW4gaW4gZXh0ZW5kZWQgQU5TSS1DIHRoYXQgaW1wbGVtZW50cyBhbgoraW5zdHJ1Y3Rpb24gbGV2ZWwgc2ltdWxhdGlvbiBvZiB0aGUgUG93ZXJQQyBlbnZpcm9ubWVudC4gIEl0IGlzIGZyZWVseQorYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgKHZlcnNpb24gMiBvciBsYXRlcikuCisKK1RoZSBQb3dlclBDIEFyY2hpdGVjdHVyZSBpcyBkZXNjcmliZWQgYXMgaGF2aW5nIHRocmVlIGxldmVscyBvZgorY29tcGxpYW5jZToKKworCVVFQSAtIFVzZXIgRW52aXJvbm1lbnQgQXJjaGl0ZWN0dXJlCisJVkVBIC0gVmlydHVhbCBFbnZpcm9ubWVudCBBcmNoaXRlY3R1cmUKKwlPRUEgLSBPcGVyYXRpbmcgRW52aXJvbm1lbnQgQXJjaGl0ZWN0dXJlCisKK1BTSU0gYm90aCBpbXBsZW1lbnRzIGFsbCB0aHJlZSBsZXZlbHMgb2YgdGhlIFBvd2VyUEMgYW5kIGluY2x1ZGVzIChmb3IKK2VhY2ggbGV2ZWwpIGEgY29ycmVzcG9uZGluZyBzaW11bGF0ZWQgcnVuLXRpbWUgZW52aXJvbm1lbnQuCisKK0luIGFkZGl0aW9uLCBQU0lNLCB0byB0aGUgZXhlY3V0aW9uIHVuaXQgbGV2ZWwsIG1vZGVscyB0aGUgcGVyZm9ybWFuY2UKK29mIG1vc3Qgb2YgdGhlIGN1cnJlbnQgUG93ZXJQQyBpbXBsZW1lbnRhdGlvbnMgKGNvbnRyaWJ1dGVkIGJ5IE1pY2hhZWwKK01laXNzbmVyKS4gIFRoaXMgZGV0YWlsZWQgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyAodW5saWtlIG1hbnkgb3RoZXIKK3NpbXVsYXRvcnMpIHJlc3VsdGluZyBpbiBvbmx5IGEgcmVsYXRpdmVseSBtYXJnaW5hbCByZWR1Y3Rpb24gaW4gdGhlCitzaW11bGF0b3JzIHBlcmZvcm1hbmNlLgorCisKK0EgZGVzY3JpcHRpb24gb2YgaG93IHRvIGJ1aWxkIFBTSU0gaXMgY29udGFpbmVkIGluIHRoZSBmaWxlOgorCisJCWZ0cDovL2Z0cC5jaS5jb20uYXUvcHViL3BzaW0vSU5TVEFMTAorCW9yCWZ0cDovL2NhbWJyaWRnZS5jeWdudXMuY29tL3B1Yi9wc2ltL0lOU1RBTEwKKword2hpbGUgYW4gb3ZlcnZpZXcgb2YgaG93IHRvIHVzZSBQU0lNIGlzIGluOgorCisJZnRwOi8vZnRwLmNpLmNvbS5hdS9wdWIvcHNpbS9SVU4KK29yCWZ0cDovL2NhbWJyaWRnZS5jeWdudXMuY29tL3B1Yi9wc2ltL1JVTgorCitUaGlzIGZpbGUgaXMgZm91bmQgaW46CisKKwlmdHA6Ly9mdHAuY2kuY29tLmF1L3B1Yi9wc2ltL1JFQURNRQorb3IJZnRwOi8vY2FtYnJpZGdlLmN5Z251cy5jb20vcHViL3BzaW0vUkVBRE1FCisKKworVGhhbmtzIGdvZXMgZmlyc3RseSB0bzoKKworCUNvcmludGhpYW4gRW5naW5lZXJpbmcgUHR5IEx0ZAorCUN5Z251cyBTdXBwb3J0CisJSGlnaGxhbmQgTG9naWMgUHR5IEx0ZAorCit3aG8gcHJvdmlkZWQgdGhlIHJlc291cmNlcyBuZWVkZWQgZm9yIG1ha2luZyB0aGlzIHNvZnR3YXJlIGF2YWlsYWJsZQorb24gdGhlIEludGVybmV0LgorCitNb3JlIGltcG9ydGFudGx5IEknZCBsaWtlIHRvIHRoYW5rIHRoZSBmb2xsb3dpbmcgaW5kaXZpZHVhbHMgd2hvIGVhY2gKK2NvbnRyaWJ1dGVkIGluIHRoZWlyIG93biB1bmlxdWUgd2F5OgorCisJQWxsZW4gQnJpZ2dzLCBCZXR0IEtvY2gsIERhdmlkIEVkZWxzb2huLCBHb3Jkb24gSXJsYW0sCisJTWljaGFlbCBNZWlzc25lciwgQm9iIE1lcmNpZXIsIFJpY2hhcmQgUGVyaW5pLCBEYWxlIFJhaG4sCisJUmljaGFyZCBTdGFsbG1hbiwgTWl0Y2hlbGUgV2Fsa2VyCisKKworCQkJCUFuZHJldyBDYWduZXkKKwkJCQlGZWIsIDE5OTUKKworCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgICBXaGF0IGZlYXR1cmVzIGRvZXMgUFNJTSBpbmNsdWRlPworCisJTW9uaXRvcmluZyBhbmQgbW9kZWxpbmcKKworCQlQU0lNIGluY2x1ZGVzICh0aGFua3MgdG8gTWljaGFlbCBNZWlzc25lcikKKwkJYSBkZXRhaWxlZCBtb2RlbCBvZiBtb3N0IG9mIHRoZSBQb3dlclBDCisJCWltcGxlbWVudGF0aW9ucyB0byB0aGUgZnVuY3Rpb25hbCB1bml0IGxldmVsLgorCisKKwlTTVAKKwkJCisJCVRoZSBQb3dlclBDIElTQSBkZWZpbmVzIFNNUCBzeW5jaHJvbml6aW5nIGluc3RydWN0aW9ucy4KKwkJVGhpcyBzaW11bGF0b3IgaW1wbGVtZW50cyBhIGxpbWl0ZWQsIGJ1dCBmdW5jdGlvbmFsLAorCQlzdWJzZXQgb2YgdGhlIFBvd2VyUEMgc3luY2hyb25pemF0aW9uIGluc3RydWN0aW9ucworCQliZWhhdmlvdXIuICBQcm9ncmFtcyB0aGF0IHJlc3RyaWN0IHRoZWlyIHN5bmNocm9uaXphdGlvbgorCQlwcmltaXRpdmVzIHRvIHRob3NlIHRoYXQgd29yayB3aXRoIHRoaXMgZnVuY3Rpb25hbAorCQlzdWItc2V0IChlZyBQKCkgYW5kIFYoKSkgYXJlIGFibGUgdG8gcnVuIG9uIHRoZSBTTVAKKwkJdmVyc2lvbiBvZiBQU0lNLgorCisJCVBlb3BsZSBpbnRlbmRpbmcgdG8gdXNlIHRoaXMgc3lzdGVtIHNob3VsZCBzdHVkeQorCQl0aGUgY29kZSBpbXBsZW1lbnRpbmcgdGhlIGx3YXJ4IGluc3RydWN0aW9uLgorCQkKKwlFTkRJQU4gU1VQUE9SVAorCisJCVBTSU0gaW1wbGVtZW50cyB0aGUgUG93ZXJQQydzIGJpZyBhbmQgbGl0dGxlICh4b3IKKwkJZW5kaWFuKSBtb2RlcyBhbmQgY29ycmVjdGx5IHNpbXVsYXRlcyBjb2RlIHRoYXQKKwkJc3dpdGNoZXMgYmV0d2VlbiB0aGVzZSB0d28gbW9kZXMuCisKKwkJSW4gYWRkaXRpb24sIHBzaW0gY2FuIG1vZGVsIGEgdHJ1ZSBsaXR0bGUtZW5kaWFuCisJCW1hY2hpbmUuCisKKwlJU0EgKEluc3RydWN0aW9uIFNldCBBcmNoaXRlY3R1cmUpIG1vZGVscworCisJCVBTSU0gaW5jbHVkZXMgYSBtb2RlbCBvZiB0aGUgVUVBLCBWRUEgYW5kIE9FQS4gIFRoaXMKKwkJaW5jbHVkZXMgdGhlIHRpbWUgYmFzZSByZWdpc3RlcnMgKFZFQSkgYW5kIEhUQUIKKwkJYW5kIEJBVFMgKE9FQSkuCisKKwkJSW4gYWRkaXRpb24sIGEgcHJlbGltaW5hcnkgbW9kZWwgb2YgdGhlIDY0IGJpdAorCQlQb3dlclBDIGFyY2hpdGVjdHVyZSBpcyBpbXBsZW1lbnRlZC4KKworCUlPIEhhcmR3YXJlCisKKwkJUFNJTSdzIGludGVybmFscyBhcmUgYmFzZWQgYXJvdW5kIHRoZSBjb25jZXB0CisJCW9mIGEgRGV2aWNlIFRyZWUuICBUaGlzIHRyZWUgaW50ZW50aW9uYWxseQorCQlyZXNlbWJsZXMgdGhhdCBvZiB0aGUgRGV2aWNlIFRyZWUgZm91bmQgaW4KKwkJT3BlbkJvb3QgZmlybXdhcmUuICBQU0lNIGlzIGZsZXhpYmxlIGVub3VnaAorCQl0byBhbGxvdyB0aGUgdXNlciB0byBmdWxseSBjb25maWd1cmUgdGhpcyBkZXZpY2UKKwkJdHJlZSAoYW5kIGNvbnNlcXVlbnRseSB0aGUgaGFyZHdhcmUgbW9kZWwpIGF0CisJCXJ1biB0aW1lLgorCisJUnVuLXRpbWUgZW52aXJvbm1lbnRzOgorCisJCVBTSU0ncyBVRUEgbW9kZWwgaW5jbHVkZXMgZW11bGF0aW9uIGZvciBCU0QKKwkJYmFzZWQgVU5JWCBzeXN0ZW0gY2FsbHMuCisKKwkJUFNJTSdzIE9FQSBtb2RlbCBpbmNsdWRlcyBlbXVsYXRpb24gb2YgZWl0aGVyOgorCisJCQlvCU9wZW5Cb290IGNsaWVudCBpbnRlcmZhY2UKKworCQkJbwlNT1RPJ3MgQlVHIGludGVyZmFjZS4KKworCisJRmxvYXRpbmcgcG9pbnQKKworCQlQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBmbG9hdGluZyBwb2ludCBpcyBpbmNsdWRlZC4KKworCisgICAgV2hvIHdvdWxkIGJlIGludGVyZXN0ZWQgaW4gUFNJTT8KKworCW8JdGhlIGN1cmlvdXMKKworCQlVc2luZyBwc2ltLCBnZGIsIGdjYyBhbmQgYmludXRpbHMgdGhlIGN1cmlvdXMKKwkJdXNlciBjYW4gY29uc3RydWN0IGFuIGVudmlyb25tZW50IHRoYXQgYWxsb3dzCisJCXRoZW0gdG8gcGxheSB3aXRoIFBvd2VyUEMgRW52aXJvbm1lbnQgd2l0aG91dAorCQl0aGUgbmVlZCBmb3IgcmVhbCBoYXJkd2FyZS4KKworCisJbwl0aGUgYW5hbHlzdAorCisJCVBTSU0gaW5jbHVkZXMgbWFueSAoY29udHJpYnV0ZWQpIG1vbml0b3JpbmcKKwkJZmVhdHVyZXMgd2hpY2ggKHVubGlrZSBtYW55IG90aGVyIHNpbXVsYXRvcnMpCisJCWRvIG5vdCBjb21lIHdpdGggYSBncmVhdCBwZW5hbHR5IGluIHBlcmZvcm1hbmNlLgorCisJCVRodXMgdGhlIHBlcmZvcm1hbmNlIGFuYWx5c3QgaXMgYWJsZSB0byB1c2UKKwkJdGhpcyBzaW11bGF0b3IgdG8gYW5hbHlzZSB0aGUgcGVyZm9ybWFuY2Ugb2YKKwkJdGhlIHN5c3RlbSB1bmRlciB0ZXN0LgorCisJCUlmIFBTSU0gZG9lc24ndCBtb25pdG9yIGEgY29tcG9uZW50cyBvZiBpbnRlcmVzdCwKKwkJdGhlIHNvdXJjZSBjb2RlIGlzIGZyZWVseSBhdmFpbGFibGUsIGFuZCBoZW5jZQorCQl0aGVyZSBpcyBubyBoaW5kZXJhbmNlIHRvIGNoYW5naW5nIHRoaW5ncworCQl0byBtZWV0IGEgc3BlY2lmaWMgYW5hbHlzdHMgbmVlZHMuCisKKworCW8JdGhlIHNlcmlvdXMgU1cgZGV2ZWxvcGVyCisKKwkJUFNJTSBtb2RlbHMgYWxsIHRocmVlIGxldmVscyBvZiB0aGUgUG93ZXJQQworCQlBcmNoaXRlY3R1cmU6IFVFQSwgVkVBIGFuZCBPRUEuICBGdXJ0aGVyLAorCQl0aGUgaW50ZXJuYWwgZGVzaWduIGlzIHN1Y2ggdGhhdCBQU0lNIGNhbgorCQliZSBleHRlbmRlZCB0byBzdXBwb3J0IGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzLgorCisKKyAgICBXaGF0IHBlcmZvcm1hbmNlIGFuYWx5c2lzIG1lYXN1cmVtZW50cyBjYW4gUFNJTSBwZXJmb3JtPworCisJQmVsb3cgaXMgdGhlIG91dHB1dCBmcm9tIGEgcmVjZW50IGFuYWx5c2lzIHJ1bgorCShjb250cmlidXRlZCBieSBNaWNoYWVsIE1laXNzbmVyKToKKworCUZvciB0aGUgZm9sbG93aW5nIHByb2dyYW06CisKKwlsb25nCisJc2ltcGxlX3JhbmQgKCkKKwl7CisJICBzdGF0aWMgdW5zaWduZWQgbG9uZyBzZWVkID0gNDcxMTQ3MTE7CisJICB1bnNpZ25lZCBsb25nIHRoaXMgPSBzZWVkICogMTEwMzUxNTI0NSArIDEyMzQ1OworCSAgc2VlZCA9IHRoaXM7CisJLyogY3V0LWN1dC1jdXQgLSBzZWUgdGhlIGZpbGUgUlVOLnBzaW0gKi8KKwl9CisKKwlIZXJlIGlzIHRoZSBjdXJyZW50IG91dHB1dCBnZW5lcmF0ZWQgd2l0aCB0aGUgLUkgc3dpdGNoIG9uIGEgUDkwCisJKHRoZSBjb21waWxlciB1c2VkIGlzIHRoZSBkZXZlbG9wbWVudCB2ZXJzaW9uIG9mIEdDQyB3aXRoIGEgbmV3CisJc2NoZWR1bGVyIHJlcGxhY2luZyB0aGUgb2xkIG9uZSk6CisJCisJQ1BVICMxIGV4ZWN1dGVkICAgICA0MSw5OTQgQU5EIGluc3RydWN0aW9ucy4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgNTE5LDc4NSBBTkQgSW1tZWRpYXRlIGluc3RydWN0aW9ucy4KKwkuCisJLgorCS4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgICAgICAgMSBTeXN0ZW0gQ2FsbCBpbnN0cnVjdGlvbi4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgMjA3LDc0NiBYT1IgaW5zdHJ1Y3Rpb25zLgorCQorCUNQVSAjMSBleGVjdXRlZCAyMyw3NDAsODU2IGN5Y2xlcy4KKwlDUFUgIzEgZXhlY3V0ZWQgMTAsMjQyLDc4MCBzdGFsbHMgd2FpdGluZyBmb3IgZGF0YS4KKwlDUFUgIzEgZXhlY3V0ZWQgICAgICAgICAgMSBzdGFsbCB3YWl0aW5nIGZvciBhIGZ1bmN0aW9uIHVuaXQuCisJLgorCS4KKwkuCisJQ1BVICMxIGV4ZWN1dGVkICAzLDEzNiwyMjkgYnJhbmNoIGZ1bmN0aW9uYWwgdW5pdCBpbnN0cnVjdGlvbnMuCisJQ1BVICMxIGV4ZWN1dGVkIDE2LDk0OSwzOTYgaW5zdHJ1Y3Rpb25zIHRoYXQgd2VyZSBhY2NvdW50ZWQgZm9yIGluIHRpbWluZyBpbmZvLgorCUNQVSAjMSBleGVjdXRlZCAgICA4NzEsOTIwIGRhdGEgcmVhZHMuCisJQ1BVICMxIGV4ZWN1dGVkICAgIDk3MSw5MjYgZGF0YSB3cml0ZXMuCisJQ1BVICMxIGV4ZWN1dGVkICAgICAgICAyMjEgaWNhY2hlIG1pc3Nlcy4KKwlDUFUgIzEgZXhlY3V0ZWQgMTYsOTQ5LDM5NiBpbnN0cnVjdGlvbnMgaW4gdG90YWwuCisJCisJU2ltdWxhdG9yIHNwZWVkIHdhcyAyNTAsNzMxIGluc3RydWN0aW9ucy9zZWNvbmQKKworCisgICAgV2hhdCBtb3RpdmF0ZWQgUFNJTT8KKworCUFzIGFuIGlkZWEsIHBzaW0gd2FzIGZpcnN0IGRpc2N1c3NlZCBzZXJpb3VzbHkgZHVyaW5nIG1pZAorCTE5OTQuICBBdCB0aGF0IHRpbWUgaXRzIG1haW4gb2JqZWN0aXZlcyB3ZXJlOgorCisKKwkJbwlnb29kIHBlcmZvcm1hbmNlCisKKwkJCU1hbnkgc2ltdWxhdG9ycyBsb29zZSBvdXQgYnkgb25seSBwcm92aWRpbmcKKwkJCWEgYmluYXJ5IGludGVyZmFjZSB0byB0aGUgaW50ZXJuYWxzLiAgVGhpcworCQkJaW50ZXJmYWNlIGV2ZW50dWFsbHkgYmVjb21lcyBhIGJvdHRsZSBuZWNrCisJCQlpbiB0aGUgc2ltdWxhdG9ycyBwZXJmb3JtYW5jZS4KKworCQkJSXQgd2FzIGludGVuZGVkIHRoYXQgUFNJTSB3b3VsZCBhdm9pZCB0aGlzCisJCQlwcm9ibGVtIGJ5IGdpdmluZyB0aGUgdXNlciBhY2Nlc3MgdG8gdGhlCisJCQlmdWxsIHNvdXJjZSBjb2RlLgorCisJCQlGdXJ0aGVyLCBieSBleHBsb2l0aW5nIHRoZSBwb3dlciBvZiBtb2Rlcm4KKwkJCWNvbXBpbGVycyBpdCB3YXMgaG9wZWQgdGhhdCBQU0lNIHdvdWxkIGFjaGlldmUKKwkJCWdvb2QgcGVyZm9ybWFuY2Ugd2l0aCBvdXQgaGF2aW5nIHRvIGNvbXByb21pc2UKKwkJCWl0cyBpbnRlcm5hbCBkZXNpZ24uCisKKworCQlvCXByYWN0aWNhbCBwb3J0YWJpbGl0eQorCisJCQlSYXRoZXIgdGhhbiB0cnkgdG8gYmUgcG9ydGFibGUgdG8gZXZlcnkKKwkJCUMgY29tcGlsZXIgb24gZXZlcnkgcGxhdGZvcm0sIGl0IHdhcyBkZWNpZGVkCisJCQl0aGF0IFBTSU0gd291bGQgcmVzdHJpY3QgaXRzIHNlbGYgdG8gc3VwcG9ydGluZworCQkJQU5TSSBjb21waWxlcnMgdGhhdCBpbmNsdWRlZCB0aGUgZXh0ZW5zaW9uCisJCQlvZiBhIGxvbmcgbG9uZyB0eXBlLgorCisJCQlHQ0MgaXMgb25lIHN1Y2ggY29tcGlsZXIsIGNvbnNlcXVlbnRseSBQU0lNCisJCQlzaG91bGQgYmUgcG9ydGFibGUgdG8gYW55IG1hY2hpbmUgcnVubmluZyBHQ0MuCisKKworCQlvCWZsZXhpYmlsaXR5IGluIGl0cyBkZXNpZ24KKworCQkJUFNJTSBzaG91bGQgYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IHRoZQorCQkJZmVhdHVyZXMgcmVxdWlyZWQgYW5kIGN1c3RvbWlzZSB0aGUgYnVpbGQKKwkJCWFjY29yZGluZ2x5LiAgQnkgaGF2aW5nIHRoZSBzb3VyY2UgY29kZSwKKwkJCXRoZSBjb21waWxlciBpcyBhYmxlIHRvIGVsaW1pbmF0ZSBhbnkgdW4KKwkJCXVzZWQgZmVhdHVyZXMgb2YgdGhlIHNpbXVsYXRvci4KKworCQkJQWZ0ZXIgYWxsLCBsZXQgdGhlIGNvbXBpbGVyIGRvIHRoZSB3b3JrLgorCisKKwkJbwlTTVAKKworCQkJQSBtb2RlbCB0aGF0IGFsbG93ZWQgdGhlIHNpbXVsYXRpb24gb2YKKwkJCVNNUCBwbGF0Zm9ybXMgd2l0aCBvdXQgdGhlIGxhcmdlIG92ZXJoZWFkCisJCQlvZnRlbiBlbmNvdW50ZXJlZCB3aXRoIHN1Y2ggbW9kZWxzLgorCisKKwlQU0lNIGFjaGlldmVzIGVhY2ggb2YgdGhlc2Ugb2JqZWN0aXZlcy4KKworCisgICAgSXMgUFNJTSBQb3dlclBDIFBsYXRmb3JtIChQUENQKSAobmVlIENIUlApIENvbXBsaWFudD8KKworCU5vLgorCisJQW1vbmcgb3RoZXIgdGhpbmdzIGl0IGRvZXMgbm90IGhhdmUgYW4gQXBwbGUgUk9NIHNvY2tldC4KKworCisgICAgQ291bGQgUFNJTSBiZSBleHRlbmRlZCBzbyB0aGF0IGl0IG1vZGVscyBhIENIUlAgbWFjaGluZT8KKworCVllcy4KKworCVBTSU0gaGFzIGJlZW4gZGVzaWduZWQgd2l0aCB0aGUgQ0hSUCBzcGVjIGluIG1pbmQuIFRvIG1vZGVsCisJYSBDSFJQIGRlc2t0b3AgdGhlIGZvbGxvd2luZyB3b3VsZCBuZWVkIHRvIGJlIGFkZGVkOgorCisJCW8JQW4gYXBwbGUgUk9NIHNvY2tldCA6LSkKKworCQlvCU1vZGVsIG9mIGVhY2ggb2YgdGhlIGRlc2t0b3AgSU8gZGV2aWNlcworCisJCW8JQW4gT3BlblBJQyBkZXZpY2UuCisKKwkJbwlSVEFTIChSdW4gVGltZSBBYnN0cmFjdGlvbiBTZXJ2aWNlcykuCisKKwkJbwlBIGZ1bGx5IHBvcHVsYXRlZCBkZXZpY2UgdHJlZS4KKworCisgICAgSXMgdGhlIHNvdXJjZSBjb2RlIGF2YWlsYWJsZT8KKworCVllcy4KKworCVRoZSBzb3VyY2UgY29kZSB0byBQU0lNIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKwl0aGUgR05VIFB1YmxpYyBMaWNlbmNlLiAgVGhpcyBhbGxvd3MgeW91IHRvIGRpc3RyaWJ1dGUKKwl0aGUgc291cmNlIGNvZGUgZm9yIGZyZWUgYnV0IHdpdGggY2VydGFpbiBjb25kaXRpb25zLgorCisJU2VlIHRoZSBmaWxlOgorCisJCWZ0cDovL2FyY2hpZS5hdS9nbnUvQ09QWUlORworCisJRm9yIGRldGFpbHMgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zLgorCisKKyAgICBXaGVyZSBkbyBJIHNlbmQgYnVncyBvciByZXBvcnQgcHJvYmxlbXM/CisKKwlUaGVyZSBpcyBhIG1haWxpbmcgbGlzdCAoc3Vic2NyaWJlIHRocm91Z2ggbWFqb3Jkb21vQGNpLmNvbS5hdSkgYXQ6CisKKwlwb3dlcnBjLXBzaW1AY2kuY29tLmF1CisKKwlJZiBJIGdldCB0aGUgZnRwIGFyY2hpdmUgdXBkYXRlZCBJIHBvc3QgYSBub3RlIHRvIHRoYXQgbWFpbGluZyBsaXN0LgorCUluIGFkZGl0aW9uIHlvdXIgd2VsY29tZSB0byBzZW5kIGJ1Z3Mgb3IgcHJvYmxlbXMgZWl0aGVyIHRvIG1lIG9yIHRvCisJdGhhdCBlLW1haWwgbGlzdC4KKworCVRoaXMgbGlzdCBjdXJyZW50bHkgYXZlcmFnZXMgemVybyBhcnRpY2xlcyBhIGRheS4KKworCisgICAgIERvZXMgUFNJTSBoYXZlIGFueSBsaW1pdGF0aW9ucyBvciBwcm9ibGVtcz8KKworCVBTSU0gY2FuJ3QgcnVuIHJzNjAwMC9BSVggYmluYXJpZXMgLSBBdCBwcmVzZW50IFBTSU0gY2FuIG9ubHkKKwlzaW11bGF0ZSBzdGF0aWMgZXhlY3V0YWJsZXMuICBTaW5jZSBhbiBBSVggZXhlY3V0YWJsZSBpcworCW5ldmVyIHN0YXRpYywgUFNJTSBpcyB1bmFibGUgdG8gc2ltdWxhdGUgaXRzIGV4ZWN1dGlvbi4KKworCVBTSU0gaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgLSBjb25zZXF1ZW50bHkgdGhlcmUgYXJlIGdvaW5nCisJdG8gYmUgYnVncy4KKworCVNlZSB0aGUgZmlsZSBCVUdTIChpbmNsdWRlZCBpbiB0aGUgZGlzdHJpYnV0aW9uKSBmb3IgYW55CisJb3RoZXIgb3V0c3RhbmRpbmcgaXNzdWVzLgorCmRpZmYgLS1naXQgYS9zaW0vcHBjL3JlZ2lzdGVycy5jIGIvc2ltL3BwYy9yZWdpc3RlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTgxY2VkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9yZWdpc3RlcnMuYwpAQCAtMCwwICsxLDE2OSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfUkVHSVNURVJTX0NfCisjZGVmaW5lIF9SRUdJU1RFUlNfQ18KKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJiYXNpY3MuaCIKKyNpbmNsdWRlICJyZWdpc3RlcnMuaCIKKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKworSU5MSU5FX1JFR0lTVEVSU1wKKyh2b2lkKQorcmVnaXN0ZXJzX2R1bXAocmVnaXN0ZXJzICpyZWdpc3RlcnMpCit7CisgIGludCBpOworICBpbnQgajsKKyAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgIHByaW50Zl9maWx0ZXJlZCgiR1BSICUyZDoiLCBpKjQpOworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgIHByaW50Zl9maWx0ZXJlZCgiIDB4JTA4bHgiLCAobG9uZylyZWdpc3RlcnMtPmdwcltpKjQgKyBqXSk7CisgICAgfQorICAgIHByaW50Zl9maWx0ZXJlZCgiXG4iKTsKKyAgfQorfQorCitTVEFUSUNfSU5MSU5FX1JFR0lTVEVSU1wKKyhzcHJzKQorZmluZF9zcHIoY29uc3QgY2hhciBuYW1lW10pCit7CisgIHNwcnMgc3ByOworICBmb3IgKHNwciA9IDA7IHNwciA8IG5yX29mX3NwcnM7IHNwcisrKQorICAgIGlmIChzcHJfaXNfdmFsaWQoc3ByKQorCSYmICFzdHJjbXAobmFtZSwgc3ByX25hbWUoc3ByKSkKKwkmJiBzcHJfaW5kZXgoc3ByKSA9PSBzcHIpCisgICAgICByZXR1cm4gc3ByOworICByZXR1cm4gbnJfb2Zfc3ByczsKK30KKworU1RBVElDX0lOTElORV9SRUdJU1RFUlNcCisoaW50KQorYXJlX2RpZ2l0cyhjb25zdCBjaGFyICpkaWdpdHMpCit7CisgIHdoaWxlIChpc2RpZ2l0KCpkaWdpdHMpKQorICAgIGRpZ2l0cysrOworICByZXR1cm4gKmRpZ2l0cyA9PSAnXDAnOworfQorCisKK0lOTElORV9SRUdJU1RFUlNcCisocmVnaXN0ZXJfZGVzY3JpcHRpb25zKQorcmVnaXN0ZXJfZGVzY3JpcHRpb24oY29uc3QgY2hhciByZWdbXSkKK3sKKyAgcmVnaXN0ZXJfZGVzY3JpcHRpb25zIGRlc2NyaXB0aW9uOworCisgIC8qIHRyeSBmb3IgYSBnZW5lcmFsLXB1cnBvc2UgaW50ZWdlciBvciBmbG9hdGluZyBwb2ludCByZWdpc3RlciAqLworICBpZiAocmVnWzBdID09ICdyJyAmJiBhcmVfZGlnaXRzKHJlZyArIDEpKSB7CisgICAgZGVzY3JpcHRpb24udHlwZSA9IHJlZ19ncHI7CisgICAgZGVzY3JpcHRpb24uaW5kZXggPSBhdG9pKHJlZysxKTsKKyAgICBkZXNjcmlwdGlvbi5zaXplID0gc2l6ZW9mKGdwcmVnKTsKKyAgfQorICBlbHNlIGlmIChyZWdbMF0gPT0gJ2YnICYmIGFyZV9kaWdpdHMocmVnICsgMSkpIHsKKyAgICBkZXNjcmlwdGlvbi50eXBlID0gcmVnX2ZwcjsKKyAgICBkZXNjcmlwdGlvbi5pbmRleCA9IGF0b2kocmVnKzEpOworICAgIGRlc2NyaXB0aW9uLnNpemUgPSBzaXplb2YoZnByZWcpOworICB9CisgIGVsc2UgaWYgKCFzdHJjbXAocmVnLCAicGMiKSB8fCAhc3RyY21wKHJlZywgIm5pYSIpKSB7CisgICAgZGVzY3JpcHRpb24udHlwZSA9IHJlZ19wYzsKKyAgICBkZXNjcmlwdGlvbi5pbmRleCA9IDA7CisgICAgZGVzY3JpcHRpb24uc2l6ZSA9IHNpemVvZih1bnNpZ25lZF93b3JkKTsKKyAgfQorICBlbHNlIGlmICghc3RyY21wKHJlZywgInNwIikpIHsKKyAgICBkZXNjcmlwdGlvbi50eXBlID0gcmVnX2dwcjsKKyAgICBkZXNjcmlwdGlvbi5pbmRleCA9IDE7CisgICAgZGVzY3JpcHRpb24uc2l6ZSA9IHNpemVvZihncHJlZyk7CisgIH0KKyAgZWxzZSBpZiAoIXN0cmNtcChyZWcsICJ0b2MiKSkgeworICAgIGRlc2NyaXB0aW9uLnR5cGUgPSByZWdfZ3ByOworICAgIGRlc2NyaXB0aW9uLmluZGV4ID0gMjsKKyAgICBkZXNjcmlwdGlvbi5zaXplID0gc2l6ZW9mKGdwcmVnKTsKKyAgfQorICBlbHNlIGlmICghc3RyY21wKHJlZywgImNyIikgfHwgIXN0cmNtcChyZWcsICJjbmQiKSkgeworICAgIGRlc2NyaXB0aW9uLnR5cGUgPSByZWdfY3I7CisgICAgZGVzY3JpcHRpb24uaW5kZXggPSAwOworICAgIGRlc2NyaXB0aW9uLnNpemUgPSBzaXplb2YoY3JlZyk7IC8qIEZJWE1FICovCisgIH0KKyAgZWxzZSBpZiAoIXN0cmNtcChyZWcsICJtc3IiKSB8fCAhc3RyY21wKHJlZywgInBzIikpIHsKKyAgICBkZXNjcmlwdGlvbi50eXBlID0gcmVnX21zcjsKKyAgICBkZXNjcmlwdGlvbi5pbmRleCA9IDA7CisgICAgZGVzY3JpcHRpb24uc2l6ZSA9IHNpemVvZihtc3JlZyk7CisgIH0KKyAgZWxzZSBpZiAoIXN0cmNtcChyZWcsICJmcHNjciIpKSB7CisgICAgZGVzY3JpcHRpb24udHlwZSA9IHJlZ19mcHNjcjsKKyAgICBkZXNjcmlwdGlvbi5pbmRleCA9IDA7CisgICAgZGVzY3JpcHRpb24uc2l6ZSA9IHNpemVvZihmcHNjcmVnKTsKKyAgfQorICBlbHNlIGlmICghc3RybmNtcChyZWcsICJzciIsIDIpICYmIGFyZV9kaWdpdHMocmVnICsgMikpIHsKKyAgICBkZXNjcmlwdGlvbi50eXBlID0gcmVnX3NyOworICAgIGRlc2NyaXB0aW9uLmluZGV4ID0gYXRvaShyZWcrMik7CisgICAgZGVzY3JpcHRpb24uc2l6ZSA9IHNpemVvZihzcmVnKTsKKyAgfQorICBlbHNlIGlmICghc3RyY21wKHJlZywgImNudCIpKSB7CisgICAgZGVzY3JpcHRpb24udHlwZSA9IHJlZ19zcHI7CisgICAgZGVzY3JpcHRpb24uaW5kZXggPSBzcHJfY3RyOworICAgIGRlc2NyaXB0aW9uLnNpemUgPSBzaXplb2Yoc3ByZWcpOworICB9CisgIGVsc2UgaWYgKCFzdHJjbXAocmVnLCAiaW5zbnMiKSkgeworICAgIGRlc2NyaXB0aW9uLnR5cGUgPSByZWdfaW5zbnM7CisgICAgZGVzY3JpcHRpb24uaW5kZXggPSBzcHJfY3RyOworICAgIGRlc2NyaXB0aW9uLnNpemUgPSBzaXplb2YodW5zaWduZWRfd29yZCk7CisgIH0KKyAgZWxzZSBpZiAoIXN0cmNtcChyZWcsICJzdGFsbHMiKSkgeworICAgIGRlc2NyaXB0aW9uLnR5cGUgPSByZWdfc3RhbGxzOworICAgIGRlc2NyaXB0aW9uLmluZGV4ID0gc3ByX2N0cjsKKyAgICBkZXNjcmlwdGlvbi5zaXplID0gc2l6ZW9mKHVuc2lnbmVkX3dvcmQpOworICB9CisgIGVsc2UgaWYgKCFzdHJjbXAocmVnLCAiY3ljbGVzIikpIHsKKyAgICBkZXNjcmlwdGlvbi50eXBlID0gcmVnX2N5Y2xlczsKKyAgICBkZXNjcmlwdGlvbi5pbmRleCA9IHNwcl9jdHI7CisgICAgZGVzY3JpcHRpb24uc2l6ZSA9IHNpemVvZih1bnNpZ25lZF93b3JkKTsKKyAgfQorICBlbHNlIHsKKyAgICBzcHJzIHNwciA9IGZpbmRfc3ByKHJlZyk7CisgICAgaWYgKHNwciAhPSBucl9vZl9zcHJzKSB7CisgICAgICBkZXNjcmlwdGlvbi50eXBlID0gcmVnX3NwcjsKKyAgICAgIGRlc2NyaXB0aW9uLmluZGV4ID0gc3ByOworICAgICAgZGVzY3JpcHRpb24uc2l6ZSA9IHNpemVvZihzcHJlZyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZGVzY3JpcHRpb24udHlwZSA9IHJlZ19pbnZhbGlkOworICAgICAgZGVzY3JpcHRpb24uaW5kZXggPSAwOworICAgICAgZGVzY3JpcHRpb24uc2l6ZSA9IDA7CisgICAgfQorICB9CisgIHJldHVybiBkZXNjcmlwdGlvbjsKK30KKworI2VuZGlmIC8qIF9SRUdJU1RFUlNfQ18gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvcmVnaXN0ZXJzLmggYi9zaW0vcHBjL3JlZ2lzdGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYTZlYTQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL3JlZ2lzdGVycy5oCkBAIC0wLDAgKzEsMzI0IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIF9SRUdJU1RFUlNfSF8KKyNkZWZpbmUgX1JFR0lTVEVSU19IXworCisKKy8qCisgKiBUaGUgUG93ZXJQQyByZWdpc3RlcnMKKyAqCisgKi8KKworCisvKioKKyAqKiBHZW5lcmFsIFB1cnBvc2UgUmVnaXN0ZXJzCisgKiovCisKK3R5cGVkZWYgc2lnbmVkX3dvcmQgZ3ByZWc7CisKKworCisvKioKKyAqKiBGbG9hdGluZyBQb2ludCBSZWdpc3RlcnMKKyAqKi8KKwordHlwZWRlZiB1bnNpZ25lZDY0IGZwcmVnOworCisKKworLyoqCisgKiogVGhlIGNvbmRpdGlvbiByZWdpc3RlcgorICoqCisgKiovCisKK3R5cGVkZWYgdW5zaWduZWQzMiBjcmVnOworCisvKiBUaGUgZm9sbG93aW5nIHN1YiBiaXRzIGFyZSBkZWZpbmVkIGZvciB0aGUgY29uZGl0aW9uIHJlZ2lzdGVyICovCitlbnVtIHsKKyAgY3JfaV9uZWdhdGl2ZSA9IEJJVDQoMCksCisgIGNyX2lfcG9zaXRpdmUgPSBCSVQ0KDEpLAorICBjcl9pX3plcm8gPSBCSVQ0KDIpLAorICBjcl9pX3N1bW1hcnlfb3ZlcmZsb3cgPSBCSVQ0KDMpLAorI2lmIDAKKyAgLyogY3IwIC0gaW50ZWdlciBzdGF0dXMgKi8KKyAgY3IwX2lfc3VtbWFyeV9vdmVyZmxvd19iaXQgPSAzLAorICBjcjBfaV9uZWdhdGl2ZSA9IEJJVDMyKDApLAorICBjcjBfaV9wb3NpdGl2ZSA9IEJJVDMyKDEpLAorICBjcjBfaV96ZXJvID0gQklUMzIoMiksCisgIGNyMF9pX3N1bW1hcnlfb3ZlcmZsb3cgPSBCSVQzMigzKSwKKyAgY3IwX2lfbWFzayA9IE1BU0szMigwLDMpLAorI2VuZGlmCisgIC8qIGNyMSAtIGZsb2F0aW5nLXBvaW50IHN0YXR1cyAqLworICBjcjFfaV9mbG9hdGluZ19wb2ludF9leGNlcHRpb25fc3VtbWFyeV9iaXQgPSA0LAorICBjcjFfaV9mbG9hdGluZ19wb2ludF9lbmFibGVkX2V4Y2VwdGlvbl9zdW1tYXJ5X2JpdCA9IDUsCisgIGNyMV9pX2Zsb2F0aW5nX3BvaW50X2ludmFsaWRfb3BlcmF0aW9uX2V4Y2VwdGlvbl9zdW1tYXJ5X2JpdCA9IDYsCisgIGNyMV9pX2Zsb2F0aW5nX3BvaW50X292ZXJmbG93X2V4Y2VwdGlvbl9iaXQgPSA3LAorICBjcjFfaV9mbG9hdGluZ19wb2ludF9leGNlcHRpb25fc3VtbWFyeSA9IEJJVDMyKDQpLAorICBjcjFfaV9mbG9hdGluZ19wb2ludF9lbmFibGVkX2V4Y2VwdGlvbl9zdW1tYXJ5ID0gQklUMzIoNSksCisgIGNyMV9pX2Zsb2F0aW5nX3BvaW50X2ludmFsaWRfb3BlcmF0aW9uX2V4Y2VwdGlvbl9zdW1tYXJ5ID0gQklUMzIoNiksCisgIGNyMV9pX2Zsb2F0aW5nX3BvaW50X292ZXJmbG93X2V4Y2VwdGlvbiA9IEJJVDMyKDcpLAorICBjcjFfaV9tYXNrID0gTUFTSzMyKDQsNyksCit9OworCisKKy8qIENvbmRpdGlvbiByZWdpc3RlciAxIGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyAqLworZW51bSB7CisgIGNyX2ZwX2V4Y2VwdGlvbiA9IEJJVDQoMCksCisgIGNyX2ZwX2VuYWJsZWRfZXhjZXB0aW9uID0gQklUNCgxKSwKKyAgY3JfZnBfaW52YWxpZF9leGNlcHRpb24gPSBCSVQ0KDIpLAorICBjcl9mcF9vdmVyZmxvd19leGNlcHRpb24gPSBCSVQ0KDMpLAorfTsKKworCisKKy8qKgorICoqIEZsb2F0aW5nLVBvaW50IFN0YXR1cyBhbmQgQ29udHJvbCBSZWdpc3RlcgorICoqLworCit0eXBlZGVmIHVuc2lnbmVkMzIgZnBzY3JlZzsKK2VudW0geworICBmcHNjcl9meF9iaXQgPSAwLAorICBmcHNjcl9meCA9IEJJVDMyKDApLAorICBmcHNjcl9mZXhfYml0ID0gMSwKKyAgZnBzY3JfZmV4ID0gQklUMzIoMSksCisgIGZwc2NyX3Z4X2JpdCA9IDIsCisgIGZwc2NyX3Z4ID0gQklUMzIoMiksCisgIGZwc2NyX294X2JpdCA9IDMsCisgIGZwc2NyX294ID0gQklUMzIoMyksCisgIGZwc2NyX3V4ID0gQklUMzIoNCksCisgIGZwc2NyX3p4ID0gQklUMzIoNSksCisgIGZwc2NyX3h4ID0gQklUMzIoNiksCisgIGZwc2NyX3Z4c25hbiA9IEJJVDMyKDcpLCAvKiBTTkFOICovCisgIGZwc2NyX3Z4aXNpID0gQklUMzIoOCksIC8qIElORiAtIElORiAqLworICBmcHNjcl92eGlkaSA9IEJJVDMyKDkpLCAvKiBJTkYgLyBJTkYgKi8KKyAgZnBzY3Jfdnh6ZHogPSBCSVQzMigxMCksIC8qIDAgLyAwICovCisgIGZwc2NyX3Z4aW16ID0gQklUMzIoMTEpLCAvKiBJTkYgKiAwICovCisgIGZwc2NyX3Z4dmMgPSBCSVQzMigxMiksCisgIGZwc2NyX2ZyID0gQklUMzIoMTMpLAorICBmcHNjcl9maSA9IEJJVDMyKDE0KSwKKyAgZnBzY3JfZnByZiA9IE1BU0szMigxNSwgMTkpLAorICBmcHNjcl9jID0gQklUMzIoMTUpLAorICBmcHNjcl9mcGNjX2JpdCA9IDE2LCAvKiB3ZWxsIHNvcnQgb2YgKi8KKyAgZnBzY3JfZnBjYyA9IE1BU0szMigxNiwgMTkpLAorICBmcHNjcl9mbCA9IEJJVDMyKDE2KSwKKyAgZnBzY3JfZmcgPSBCSVQzMigxNyksCisgIGZwc2NyX2ZlID0gQklUMzIoMTgpLAorICBmcHNjcl9mdSA9IEJJVDMyKDE5KSwKKyAgZnBzY3JfcmZfcXVpZXRfbmFuID0gZnBzY3JfYyB8IGZwc2NyX2Z1LAorICBmcHNjcl9yZl9uZWdfaW5maW5pdHkgPSBmcHNjcl9mbCB8IGZwc2NyX2Z1LAorICBmcHNjcl9yZl9uZWdfbm9ybWFsX251bWJlciA9IGZwc2NyX2ZsLAorICBmcHNjcl9yZl9uZWdfZGVub3JtYWxpemVkX251bWJlciA9IGZwc2NyX2MgfCBmcHNjcl9mbCwKKyAgZnBzY3JfcmZfbmVnX3plcm8gPSBmcHNjcl9jIHwgZnBzY3JfZmUsCisgIGZwc2NyX3JmX3Bvc196ZXJvID0gZnBzY3JfZmUsCisgIGZwc2NyX3JmX3Bvc19kZW5vcm1hbGl6ZWRfbnVtYmVyID0gZnBzY3JfYyB8IGZwc2NyX2ZnLAorICBmcHNjcl9yZl9wb3Nfbm9ybWFsX251bWJlciA9IGZwc2NyX2ZnLAorICBmcHNjcl9yZl9wb3NfaW5maW5pdHkgPSBmcHNjcl9mZyB8IGZwc2NyX2Z1LAorICBmcHNjcl9yZXNlcnZlZF8yMCA9IEJJVDMyKDIwKSwKKyAgZnBzY3Jfdnhzb2Z0ID0gQklUMzIoMjEpLAorICBmcHNjcl92eHNxcnQgPSBCSVQzMigyMiksCisgIGZwc2NyX3Z4Y3ZpID0gQklUMzIoMjMpLAorICBmcHNjcl92ZSA9IEJJVDMyKDI0KSwKKyAgZnBzY3Jfb2UgPSBCSVQzMigyNSksCisgIGZwc2NyX3VlID0gQklUMzIoMjYpLAorICBmcHNjcl96ZSA9IEJJVDMyKDI3KSwKKyAgZnBzY3JfeGUgPSBCSVQzMigyOCksCisgIGZwc2NyX25pID0gQklUMzIoMjkpLAorICBmcHNjcl9ybiA9IE1BU0szMigzMCwgMzEpLAorICBmcHNjcl9ybl9yb3VuZF90b19uZWFyZXN0ID0gMCwKKyAgZnBzY3Jfcm5fcm91bmRfdG93YXJkc196ZXJvID0gTUFTSzMyKDMxLDMxKSwKKyAgZnBzY3Jfcm5fcm91bmRfdG93YXJkc19wb3NfaW5maW5pdHkgPSBNQVNLMzIoMzAsMzApLAorICBmcHNjcl9ybl9yb3VuZF90b3dhcmRzX25lZ19pbmZpbml0eSA9IE1BU0szMigzMCwzMSksCisgIGZwc2NyX3Z4X2JpdHMgPSAoZnBzY3JfdnhzbmFuIHwgZnBzY3Jfdnhpc2kgfCBmcHNjcl92eGlkaQorCQkgICB8IGZwc2NyX3Z4emR6IHwgZnBzY3JfdnhpbXogfCBmcHNjcl92eHZjCisJCSAgIHwgZnBzY3Jfdnhzb2Z0IHwgZnBzY3JfdnhzcXJ0IHwgZnBzY3JfdnhjdmkpLAorfTsKKworCisKKy8qKgorICoqIFhFUiBSZWdpc3RlcgorICoqLworCit0eXBlZGVmIHVuc2lnbmVkMzIgeGVyZWc7CisKK2VudW0geworICB4ZXJfc3VtbWFyeV9vdmVyZmxvdyA9IEJJVDMyKDApLCB4ZXJfc3VtbWFyeV9vdmVyZmxvd19iaXQgPSAwLAorICB4ZXJfY2FycnkgPSBCSVQzMigyKSwgeGVyX2NhcnJ5X2JpdCA9IDIsCisgIHhlcl9vdmVyZmxvdyA9IEJJVDMyKDEpLAorICB4ZXJfcmVzZXJ2ZWRfM18yNCA9IE1BU0szMigzLDI0KSwKKyAgeGVyX2J5dGVfY291bnRfbWFzayA9IE1BU0szMigyNSwzMSkKK307CisKKworLyoqCisgKiogU1BSJ3MKKyAqKi8KKworI2luY2x1ZGUgInNwcmVnLmgiCisKKworLyoqCisgKiogU2VnbWVudCBSZWdpc3RlcnMKKyAqKi8KKwordHlwZWRlZiB1bnNpZ25lZDMyIHNyZWc7CitlbnVtIHsKKyAgbnJfb2Zfc3JzID0gMTYKK307CisKKworLyoqCisgKiogTWFjaGluZSBzdGF0ZSByZWdpc3RlciAKKyAqKi8KK3R5cGVkZWYgdW5zaWduZWRfd29yZCBtc3JlZzsgLyogMzIgb3IgNjQgYml0cyAqLworCitlbnVtIHsKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQorICBtc3JfNjRiaXRfbW9kZSA9IEJJVCgwKSwKKyNlbmRpZgorI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCisgIG1zcl82NGJpdF9tb2RlID0gMCwKKyNlbmRpZgorICBtc3JfcG93ZXJfbWFuYWdlbWVudF9lbmFibGUgPSBCSVQoNDUpLAorICBtc3JfdGVtcG9hcnlfZ3ByX3JlbWFwcGluZyA9IEJJVCg0NiksIC8qIDYwMyBzcGVjaWZpYyAqLworICBtc3JfaW50ZXJydXB0X2xpdHRsZV9lbmRpYW5fbW9kZSA9IEJJVCg0NyksCisgIG1zcl9leHRlcm5hbF9pbnRlcnJ1cHRfZW5hYmxlID0gQklUKDQ4KSwKKyAgbXNyX3Byb2JsZW1fc3RhdGUgPSBCSVQoNDkpLAorICBtc3JfZmxvYXRpbmdfcG9pbnRfYXZhaWxhYmxlID0gQklUKDUwKSwKKyAgbXNyX21hY2hpbmVfY2hlY2tfZW5hYmxlID0gQklUKDUxKSwKKyAgbXNyX2Zsb2F0aW5nX3BvaW50X2V4Y2VwdGlvbl9tb2RlXzAgPSBCSVQoNTIpLAorICBtc3Jfc2luZ2xlX3N0ZXBfdHJhY2VfZW5hYmxlID0gQklUKDUzKSwKKyAgbXNyX2JyYW5jaF90cmFjZV9lbmFibGUgPSBCSVQoNTQpLAorICBtc3JfZmxvYXRpbmdfcG9pbnRfZXhjZXB0aW9uX21vZGVfMSA9IEJJVCg1NSksCisgIG1zcl9pbnRlcnJ1cHRfcHJlZml4ID0gQklUKDU3KSwKKyAgbXNyX2luc3RydWN0aW9uX3JlbG9jYXRlID0gQklUKDU4KSwKKyAgbXNyX2RhdGFfcmVsb2NhdGUgPSBCSVQoNTkpLAorICBtc3JfcmVjb3ZlcmFibGVfaW50ZXJydXB0ID0gQklUKDYyKSwKKyAgbXNyX2xpdHRsZV9lbmRpYW5fbW9kZSA9IEJJVCg2MykKK307CisKK2VudW0geworICBzcnIxX2hhc2hfdGFibGVfb3JfaWJhdF9taXNzID0gQklUKDMzKSwKKyAgc3JyMV9kaXJlY3Rfc3RvcmVfZXJyb3JfZXhjZXB0aW9uID0gQklUKDM1KSwKKyAgc3JyMV9wcm90ZWN0aW9uX3Zpb2xhdGlvbiA9IEJJVCgzNiksCisgIHNycjFfc2VnbWVudF90YWJsZV9taXNzID0gQklUKDQyKSwKKyAgc3JyMV9mbG9hdGluZ19wb2ludF9lbmFibGVkID0gQklUKDQzKSwKKyAgc3JyMV9pbGxlZ2FsX2luc3RydWN0aW9uID0gQklUKDQ0KSwKKyAgc3JyMV9wcml2aWxpZ2VkX2luc3RydWN0aW9uID0gQklUKDQ1KSwKKyAgc3JyMV90cmFwID0gQklUKDQ2KSwKKyAgc3JyMV9zdWJzZXF1ZW50X2luc3RydWN0aW9uID0gQklUKDQ3KQorfTsKKworCisvKioKKyAqKiBzdG9yYWdlIGludGVycnVwdCByZWdpc3RlcnMKKyAqKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgZHNpc3JfZGlyZWN0X3N0b3JlX2Vycm9yX2V4Y2VwdGlvbiA9IEJJVDMyKDApLAorICBkc2lzcl9oYXNoX3RhYmxlX29yX2RiYXRfbWlzcyA9IEJJVDMyKDEpLAorICBkc2lzcl9wcm90ZWN0aW9uX3Zpb2xhdGlvbiA9IEJJVDMyKDQpLAorICBkc2lzcl9lYXJ3YXhfdmlvbGF0aW9uID0gQklUMzIoNSksCisgIGRzaXNyX3N0b3JlX29wZXJhdGlvbiA9IEJJVDMyKDYpLAorICBkc2lzcl9zZWdtZW50X3RhYmxlX21pc3MgPSBCSVQzMigxMCksCisgIGRzaXNyX2VhcndheF9kaXNhYmxlZCA9IEJJVDMyKDExKQorfSBkc2lzcl9zdGF0dXM7CisKKworCisvKioKKyAqKiBBbmQgdGhlIHJlZ2lzdGVycyBwcm9wZXIKKyAqKi8KK3R5cGVkZWYgc3RydWN0IF9yZWdpc3RlcnMgeworCisgIGdwcmVnIGdwclszMl07CisgIGZwcmVnIGZwclszMl07CisgIGNyZWcgY3I7CisgIGZwc2NyZWcgZnBzY3I7CisKKyAgLyogTWFjaGluZSBzdGF0ZSByZWdpc3RlciAqLworICBtc3JlZyBtc3I7CisKKyAgLyogU3ByJ3MgKi8KKyAgc3ByZWcgc3ByW25yX29mX3NwcnNdOworCisgIC8qIFNlZ21lbnQgUmVnaXN0ZXJzICovCisgIHNyZWcgc3JbbnJfb2Zfc3JzXTsKKworfSByZWdpc3RlcnM7CisKKworLyogZHVtcCBvdXQgYWxsIHRoZSByZWdpc3RlcnMgKi8KKworSU5MSU5FX1JFR0lTVEVSU1wKKyh2b2lkKSByZWdpc3RlcnNfZHVtcAorKHJlZ2lzdGVycyAqcmVncyk7CisKKworLyogcmV0dXJuIGluZm9ybWF0aW9uIG9uIGEgcmVnaXN0ZXIgYmFzZWQgb24gbmFtZSAqLworCit0eXBlZGVmIGVudW0geworICByZWdfaW52YWxpZCwKKyAgcmVnX2dwciwgcmVnX2ZwciwgcmVnX3NwciwgcmVnX21zciwKKyAgcmVnX2NyLCByZWdfZnBzY3IsIHJlZ19wYywgcmVnX3NyLAorICByZWdfaW5zbnMsIHJlZ19zdGFsbHMsIHJlZ19jeWNsZXMsCisgIG5yX3JlZ2lzdGVyX3R5cGVzCit9IHJlZ2lzdGVyX3R5cGVzOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHJlZ2lzdGVyX3R5cGVzIHR5cGU7CisgIGludCBpbmRleDsKKyAgaW50IHNpemU7Cit9IHJlZ2lzdGVyX2Rlc2NyaXB0aW9uczsKKworSU5MSU5FX1JFR0lTVEVSU1wKKyhyZWdpc3Rlcl9kZXNjcmlwdGlvbnMpIHJlZ2lzdGVyX2Rlc2NyaXB0aW9uCisoY29uc3QgY2hhciByZWdbXSk7CisKKworLyogU3BlY2lhbCBwdXJwb3NlIHJlZ2lzdGVycyBieSB0aGVpciBtb3JlIGNvbW1vbiBuYW1lcyAqLworCisjZGVmaW5lIFNQUkVHKE4pCWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+c3ByW05dCisjZGVmaW5lIFhFUiAgICAgICAgICAgICBTUFJFRyhzcHJfeGVyKQorI2RlZmluZSBMUiAgICAgICAgICAgICAgU1BSRUcoc3ByX2xyKQorI2RlZmluZSBDVFIgICAgICAgICAgICAgU1BSRUcoc3ByX2N0cikKKyNkZWZpbmUgU1JSMAkJU1BSRUcoc3ByX3NycjApCisjZGVmaW5lIFNSUjEJCVNQUkVHKHNwcl9zcnIxKQorI2RlZmluZSBEQVIJCVNQUkVHKHNwcl9kYXIpCisjZGVmaW5lIERTSVNSCQlTUFJFRyhzcHJfZHNpc3IpCisKKy8qIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgLSBpbmRleGVkIGFjY2VzcyAqLworI2RlZmluZSBHUFIoTikgICAgICAgICAgY3B1X3JlZ2lzdGVycyhwcm9jZXNzb3IpLT5ncHJbTl0KKworLyogc2VnbWVudCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU0VHUkVHKE4pICAgICAgIGNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+c3JbTl0KKworLyogY29uZGl0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIENSICAgICAgICAgICAgICBjcHVfcmVnaXN0ZXJzKHByb2Nlc3NvciktPmNyCisKKy8qIG1hY2hpbmUgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIE1TUiAgICAgICAgCWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+bXNyCisKKy8qIGZsb2F0aW5nLXBvaW50IHN0YXR1cyBjb25kaXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRlBTQ1IJCWNwdV9yZWdpc3RlcnMocHJvY2Vzc29yKS0+ZnBzY3IKKworI2VuZGlmIC8qIF9SRUdJU1RFUlNfSF8gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvc2ltLWVuZGlhbi1uLmggYi9zaW0vcHBjL3NpbS1lbmRpYW4tbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMDQxMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL3NpbS1lbmRpYW4tbi5oCkBAIC0wLDAgKzEsMTM0IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk1LCBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgCisgICAgKi8KKworCisjaWZuZGVmIE4KKyNlcnJvciAiTiBtdXN0IGJlICNkZWZpbmVkIgorI2VuZGlmCisKKy8qIE5PVEU6IFNlZSBlbmQgb2YgZmlsZSBmb3IgI3VuZGVmICovCisjZGVmaW5lIHVuc2lnbmVkX04gWENPTkNBVDIodW5zaWduZWRfLE4pCisjZGVmaW5lIGVuZGlhbl90MmhfTiBYQ09OQ0FUMihlbmRpYW5fdDJoXyxOKQorI2RlZmluZSBlbmRpYW5faDJ0X04gWENPTkNBVDIoZW5kaWFuX2gydF8sTikKKyNkZWZpbmUgX1NXQVBfTiBYQ09OQ0FUMihfU1dBUF8sTikKKyNkZWZpbmUgc3dhcF9OIFhDT05DQVQyKHN3YXBfLE4pCisjZGVmaW5lIGVuZGlhbl9oMmJlX04gWENPTkNBVDIoZW5kaWFuX2gyYmVfLE4pCisjZGVmaW5lIGVuZGlhbl9iZTJoX04gWENPTkNBVDIoZW5kaWFuX2JlMmhfLE4pCisjZGVmaW5lIGVuZGlhbl9oMmxlX04gWENPTkNBVDIoZW5kaWFuX2gybGVfLE4pCisjZGVmaW5lIGVuZGlhbl9sZTJoX04gWENPTkNBVDIoZW5kaWFuX2xlMmhfLE4pCisKKworSU5MSU5FX1NJTV9FTkRJQU5cCisodW5zaWduZWRfTikKK2VuZGlhbl90MmhfTih1bnNpZ25lZF9OIHJhd19pbikKK3sKKyAgaWYgKENVUlJFTlRfVEFSR0VUX0JZVEVfT1JERVIgPT0gQ1VSUkVOVF9IT1NUX0JZVEVfT1JERVIpIHsKKyAgICByZXR1cm4gcmF3X2luOworICB9CisgIGVsc2UgeworICAgIF9TV0FQX04ocmV0dXJuLHJhd19pbik7CisgIH0KK30KKworCitJTkxJTkVfU0lNX0VORElBTlwKKyh1bnNpZ25lZF9OKQorZW5kaWFuX2gydF9OKHVuc2lnbmVkX04gcmF3X2luKQoreworICBpZiAoQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiA9PSBDVVJSRU5UX0hPU1RfQllURV9PUkRFUikgeworICAgIHJldHVybiByYXdfaW47CisgIH0KKyAgZWxzZSB7CisgICAgX1NXQVBfTihyZXR1cm4scmF3X2luKTsKKyAgfQorfQorCisKK0lOTElORV9TSU1fRU5ESUFOXAorKHVuc2lnbmVkX04pCitzd2FwX04odW5zaWduZWRfTiByYXdfaW4pCit7CisgIF9TV0FQX04ocmV0dXJuLHJhd19pbik7Cit9CisKKworCitJTkxJTkVfU0lNX0VORElBTlwKKyh1bnNpZ25lZF9OKQorZW5kaWFuX2gyYmVfTih1bnNpZ25lZF9OIHJhd19pbikKK3sKKyAgaWYgKENVUlJFTlRfSE9TVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pIHsKKyAgICByZXR1cm4gcmF3X2luOworICB9CisgIGVsc2UgeworICAgIF9TV0FQX04ocmV0dXJuLHJhd19pbik7CisgIH0KK30KKworCitJTkxJTkVfU0lNX0VORElBTlwKKyh1bnNpZ25lZF9OKQorZW5kaWFuX2JlMmhfTih1bnNpZ25lZF9OIHJhd19pbikKK3sKKyAgaWYgKENVUlJFTlRfSE9TVF9CWVRFX09SREVSID09IEJJR19FTkRJQU4pIHsKKyAgICByZXR1cm4gcmF3X2luOworICB9CisgIGVsc2UgeworICAgIF9TV0FQX04ocmV0dXJuLHJhd19pbik7CisgIH0KK30KKworCitJTkxJTkVfU0lNX0VORElBTlwKKyh1bnNpZ25lZF9OKQorZW5kaWFuX2gybGVfTih1bnNpZ25lZF9OIHJhd19pbikKK3sKKyAgaWYgKENVUlJFTlRfSE9TVF9CWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4pIHsKKyAgICByZXR1cm4gcmF3X2luOworICB9CisgIGVsc2UgeworICAgIF9TV0FQX04ocmV0dXJuLHJhd19pbik7CisgIH0KK30KKworCitJTkxJTkVfU0lNX0VORElBTlwKKyh1bnNpZ25lZF9OKQorZW5kaWFuX2xlMmhfTih1bnNpZ25lZF9OIHJhd19pbikKK3sKKyAgaWYgKENVUlJFTlRfSE9TVF9CWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4pIHsKKyAgICByZXR1cm4gcmF3X2luOworICB9CisgIGVsc2UgeworICAgIF9TV0FQX04ocmV0dXJuLHJhd19pbik7CisgIH0KK30KKworCisvKiBOT1RFOiBTZWUgc3RhcnQgb2YgZmlsZSBmb3IgI2RlZmluZSAqLworI3VuZGVmIHVuc2lnbmVkX04KKyN1bmRlZiBlbmRpYW5fdDJoX04KKyN1bmRlZiBlbmRpYW5faDJ0X04KKyN1bmRlZiBfU1dBUF9OCisjdW5kZWYgc3dhcF9OCisjdW5kZWYgZW5kaWFuX2gyYmVfTgorI3VuZGVmIGVuZGlhbl9iZTJoX04KKyN1bmRlZiBlbmRpYW5faDJsZV9OCisjdW5kZWYgZW5kaWFuX2xlMmhfTgpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9zaW0tZW5kaWFuLmMgYi9zaW0vcHBjL3NpbS1lbmRpYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmUzNjY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9zaW0tZW5kaWFuLmMKQEAgLTAsMCArMSw3NCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfU0lNX0VORElBTl9DXworI2RlZmluZSBfU0lNX0VORElBTl9DXworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiYmFzaWNzLmgiCisKKworI2lmICFkZWZpbmVkKF9TV0FQXzEpCisjZGVmaW5lIF9TV0FQXzEoU0VULFJBVykgU0VUIChSQVcpCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9TV0FQXzIpICYmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOKSAmJiBkZWZpbmVkKGh0b25zKQorI2RlZmluZSBfU1dBUF8yKFNFVCxSQVcpIFNFVCBodG9ucyAoUkFXKQorI2VuZGlmCisKKyNpZm5kZWYJX1NXQVBfMgorI2RlZmluZSBfU1dBUF8yKFNFVCxSQVcpIFNFVCAoKChSQVcpID4+IDgpIHwgKChSQVcpIDw8IDgpKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfU1dBUF80KSAmJiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgPT0gTElUVExFX0VORElBTikgJiYgZGVmaW5lZChodG9ubCkKKyNkZWZpbmUgX1NXQVBfNChTRVQsUkFXKSBTRVQgaHRvbmwgKFJBVykKKyNlbmRpZgorCisjaWZuZGVmIF9TV0FQXzQKKyNkZWZpbmUJX1NXQVBfNChTRVQsUkFXKSBTRVQgKCgoUkFXKSA8PCAyNCkgfCAoKChSQVcpICYgMHhmZjAwKSA8PCA4KSB8ICgoKFJBVykgJiAweGZmMDAwMCkgPj4gOCkgfCAoKFJBVykgPj4gMjQpKQorI2VuZGlmCisKKyNpZm5kZWYgX1NXQVBfOAorI2RlZmluZSBfU1dBUF84KFNFVCxSQVcpIFwKKyAgdW5pb24geyB1bnNpZ25lZF84IGR3b3JkOyB1bnNpZ25lZF80IHdvcmRzWzJdOyB9IGluLCBvdXQ7IFwKKyAgaW4uZHdvcmQgPSBSQVc7IFwKKyAgX1NXQVBfNCAob3V0LndvcmRzWzBdID0sIGluLndvcmRzWzFdKTsgXAorICBfU1dBUF80IChvdXQud29yZHNbMV0gPSwgaW4ud29yZHNbMF0pOyBcCisgIFNFVCBvdXQuZHdvcmQ7CisjZW5kaWYKKworI2RlZmluZSBOIDEKKyNpbmNsdWRlICJzaW0tZW5kaWFuLW4uaCIKKyN1bmRlZiBOCisKKyNkZWZpbmUgTiAyCisjaW5jbHVkZSAic2ltLWVuZGlhbi1uLmgiCisjdW5kZWYgTgorCisjZGVmaW5lIE4gNAorI2luY2x1ZGUgInNpbS1lbmRpYW4tbi5oIgorI3VuZGVmIE4KKworI2RlZmluZSBOIDgKKyNpbmNsdWRlICJzaW0tZW5kaWFuLW4uaCIKKyN1bmRlZiBOCisKKyNlbmRpZiAvKiBfU0lNX0VORElBTl9DXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9zaW0tZW5kaWFuLmggYi9zaW0vcHBjL3NpbS1lbmRpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWNhOTcwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9zaW0tZW5kaWFuLmgKQEAgLTAsMCArMSw0MDkgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgX1NJTV9FTkRJQU5fSF8KKyNkZWZpbmUgX1NJTV9FTkRJQU5fSF8KKworCisvKiBDIGJ5dGUgY29udmVyc2lvbiBmdW5jdGlvbnMgKi8KKworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMSkgZW5kaWFuX2gydF8xKHVuc2lnbmVkXzEgeCk7CitJTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8yKSBlbmRpYW5faDJ0XzIodW5zaWduZWRfMiB4KTsKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzQpIGVuZGlhbl9oMnRfNCh1bnNpZ25lZF80IHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfOCkgZW5kaWFuX2gydF84KHVuc2lnbmVkXzggeCk7CisKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzEpIGVuZGlhbl90MmhfMSh1bnNpZ25lZF8xIHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMikgZW5kaWFuX3QyaF8yKHVuc2lnbmVkXzIgeCk7CitJTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF80KSBlbmRpYW5fdDJoXzQodW5zaWduZWRfNCB4KTsKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzgpIGVuZGlhbl90MmhfOCh1bnNpZ25lZF84IHgpOworCitJTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8xKSBzd2FwXzEodW5zaWduZWRfMSB4KTsKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzIpIHN3YXBfMih1bnNpZ25lZF8yIHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfNCkgc3dhcF80KHVuc2lnbmVkXzQgeCk7CitJTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF84KSBzd2FwXzgodW5zaWduZWRfOCB4KTsKKworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMSkgZW5kaWFuX2gyYmVfMSh1bnNpZ25lZF8xIHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMikgZW5kaWFuX2gyYmVfMih1bnNpZ25lZF8yIHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfNCkgZW5kaWFuX2gyYmVfNCh1bnNpZ25lZF80IHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfOCkgZW5kaWFuX2gyYmVfOCh1bnNpZ25lZF84IHgpOworCitJTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8xKSBlbmRpYW5fYmUyaF8xKHVuc2lnbmVkXzEgeCk7CitJTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF8yKSBlbmRpYW5fYmUyaF8yKHVuc2lnbmVkXzIgeCk7CitJTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF80KSBlbmRpYW5fYmUyaF80KHVuc2lnbmVkXzQgeCk7CitJTkxJTkVfU0lNX0VORElBTih1bnNpZ25lZF84KSBlbmRpYW5fYmUyaF84KHVuc2lnbmVkXzggeCk7CisKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzEpIGVuZGlhbl9oMmxlXzEodW5zaWduZWRfMSB4KTsKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzIpIGVuZGlhbl9oMmxlXzIodW5zaWduZWRfMiB4KTsKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzQpIGVuZGlhbl9oMmxlXzQodW5zaWduZWRfNCB4KTsKK0lOTElORV9TSU1fRU5ESUFOKHVuc2lnbmVkXzgpIGVuZGlhbl9oMmxlXzgodW5zaWduZWRfOCB4KTsKKworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMSkgZW5kaWFuX2xlMmhfMSh1bnNpZ25lZF8xIHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfMikgZW5kaWFuX2xlMmhfMih1bnNpZ25lZF8yIHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfNCkgZW5kaWFuX2xlMmhfNCh1bnNpZ25lZF80IHgpOworSU5MSU5FX1NJTV9FTkRJQU4odW5zaWduZWRfOCkgZW5kaWFuX2xlMmhfOCh1bnNpZ25lZF84IHgpOworCisKKy8qIEhvc3QgZGVwZW5kYW50OgorCisgICBUaGUgQ1BQIGJlbG93IGRlZmluZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGF0aW9uIGhvc3QuICBJbgorICAgcGFydGljdWxhciBpdCBkZWZpbmVzIHRoZSBtYWNybydzOgorCisgICAJV0lUSF9IT1NUX0JZVEVfT1JERVIJVGhlIGJ5dGUgb3JkZXIgb2YgdGhlIGhvc3QuIENvdWxkCisJCQkJYmUgYW55IG9mIExJVFRMRV9FTkRJQU4sIEJJR19FTkRJQU4KKwkJCQlvciAwICh1bmtub3duKS4gIFRob3NlIG1hY3JvJ3MgYWxzbworCQkJCW5lZWQgdG8gYmUgZGVmaW5lZC4KKworICovCisKKworLyogTmV0QlNEOgorCisgICBOZXRCU0QgaXMgZWFzeSwgZXZlcnl0aGluZyB5b3UgY291bGQgZXZlciB3YW50IGlzIGluIGEgaGVhZGVyIGZpbGUKKyAgICh3ZWxsIGFsbW9zdCA6LSkgKi8KKworI2lmIGRlZmluZWQoX19OZXRCU0RfXykKKyMgaW5jbHVkZSA8bWFjaGluZS9lbmRpYW4uaD4KKyMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCisjICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgorIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIEJZVEVfT1JERVIKKyMgZW5kaWYKKyMgaWYgKEJZVEVfT1JERVIgIT0gV0lUSF9IT1NUX0JZVEVfT1JERVIpCisjICBlcnJvciAiaG9zdCBlbmRpYW4gaW5jb3JyZWN0bHkgY29uZmlndXJlZCwgY2hlY2sgY29uZmlnLmgiCisjIGVuZGlmCisjZW5kaWYKKworLyogTGludXggaXMgc2ltaWxhcmx5IGVhc3kuICAqLworCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisjIGluY2x1ZGUgPGVuZGlhbi5oPgorIyBpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjIGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKSAmJiAhZGVmaW5lZChMSVRUTEVfRU5ESUFOKQorIyAgZGVmaW5lIExJVFRMRV9FTkRJQU4gX19MSVRUTEVfRU5ESUFOCisjIGVuZGlmCisjIGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKSAmJiAhZGVmaW5lZChCSUdfRU5ESUFOKQorIyAgZGVmaW5lIEJJR19FTkRJQU4gX19CSUdfRU5ESUFOCisjIGVuZGlmCisjIGlmIGRlZmluZWQoX19CWVRFX09SREVSKSAmJiAhZGVmaW5lZChCWVRFX09SREVSKQorIyAgZGVmaW5lIEJZVEVfT1JERVIgX19CWVRFX09SREVSCisjIGVuZGlmCisjIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSAwKQorIyAgdW5kZWYgV0lUSF9IT1NUX0JZVEVfT1JERVIKKyMgIGRlZmluZSBXSVRIX0hPU1RfQllURV9PUkRFUiBCWVRFX09SREVSCisjIGVuZGlmCisjIGlmIChCWVRFX09SREVSICE9IFdJVEhfSE9TVF9CWVRFX09SREVSKQorIyAgZXJyb3IgImhvc3QgZW5kaWFuIGluY29ycmVjdGx5IGNvbmZpZ3VyZWQsIGNoZWNrIGNvbmZpZy5oIgorIyBlbmRpZgorI2VuZGlmCisKKy8qIElOU0VSVCBIRVJFIC0gaG9zdHMgdGhhdCBoYXZlIGF2YWlsYWJsZSBMSVRUTEVfRU5ESUFOIGFuZAorICAgQklHX0VORElBTiBtYWNybydzICovCisKKworLyogU29tZSBob3N0cyBkb24ndCBkZWZpbmUgTElUVExFX0VORElBTiBvciBCSUdfRU5ESUFOLCBoZWxwIHRoZW0gb3V0ICovCisKKyNpZm5kZWYgTElUVExFX0VORElBTgorI2RlZmluZSBMSVRUTEVfRU5ESUFOIDEyMzQKKyNlbmRpZgorI2lmbmRlZiBCSUdfRU5ESUFOCisjZGVmaW5lIEJJR19FTkRJQU4gNDMyMQorI2VuZGlmCisKKworLyogU3VuT1Mgb24gU1BBUkM6CisKKyAgIEJpZyBlbmRpYW4gbGFzdCB0aW1lIEkgbG9va2VkICovCisKKyNpZiBkZWZpbmVkKHNwYXJjKSB8fCBkZWZpbmVkKF9fc3BhcmNfXykKKyMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCisjICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgorIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIEJJR19FTkRJQU4KKyMgZW5kaWYKKyMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSICE9IEJJR19FTkRJQU4pCisjICBlcnJvciAic3VuIHdhcyBiaWcgZW5kaWFuIGxhc3QgdGltZSBJIGxvb2tlZCAuLi4iCisjIGVuZGlmCisjZW5kaWYKKworCisvKiBSYW5kb20geDg2CisKKyAgIExpdHRsZSBlbmRpYW4gbGFzdCB0aW1lIEkgbG9va2VkICovCisKKyNpZiBkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoaTQ4NikgfHwgZGVmaW5lZChpNTg2KSB8fCBkZWZpbmVkIChpNjg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9faTQ4Nl9fKSB8fCBkZWZpbmVkKF9faTU4Nl9fKSB8fCBkZWZpbmVkIChfX2k2ODZfXykKKyMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCisjICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgorIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyMgZW5kaWYKKyMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSICE9IExJVFRMRV9FTkRJQU4pCisjICBlcnJvciAieDg2IHdhcyBsaXR0bGUgZW5kaWFuIGxhc3QgdGltZSBJIGxvb2tlZCAuLi4iCisjIGVuZGlmCisjZW5kaWYKKworI2lmIChkZWZpbmVkIChfX2k0ODZfXykgfHwgZGVmaW5lZCAoX19pNTg2X18pIHx8IGRlZmluZWQgKF9faTY4Nl9fKSkgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgV0lUSF9CU1dBUAorI3VuZGVmICBodG9ubAorI3VuZGVmICBudG9obAorI2RlZmluZSBodG9ubChJTikgX19leHRlbnNpb25fXyAoeyBpbnQgX291dDsgX19hc21fXyAoImJzd2FwICUwIiA6ICI9ciIgKF9vdXQpIDogIjAiIChJTikpOyBfb3V0OyB9KQorI2RlZmluZSBudG9obChJTikgX19leHRlbnNpb25fXyAoeyBpbnQgX291dDsgX19hc21fXyAoImJzd2FwICUwIiA6ICI9ciIgKF9vdXQpIDogIjAiIChJTikpOyBfb3V0OyB9KQorI2VuZGlmCisKKy8qIFBvd2VyIG9yIFBvd2VyUEMgcnVubmluZyBBSVggICovCisjaWYgZGVmaW5lZChfUE9XRVIpICYmIGRlZmluZWQoX0FJWCkKKyMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCisjICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgorIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIEJJR19FTkRJQU4KKyMgZW5kaWYKKyMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSICE9IEJJR19FTkRJQU4pCisjICBlcnJvciAiUG93ZXIvUG93ZXJQQyBBSVggd2FzIGJpZyBlbmRpYW4gbGFzdCB0aW1lIEkgbG9va2VkIC4uLiIKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBTb2xhcmlzIHJ1bm5pbmcgUG93ZXJQQyAqLworI2lmIGRlZmluZWQoX19QUEMpICYmIGRlZmluZWQoX19zdW5fXykKKyMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCisjICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgorIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyMgZW5kaWYKKyMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSICE9IExJVFRMRV9FTkRJQU4pCisjICBlcnJvciAiU29sYXJpcyBvbiBQb3dlclBDcyB3YXMgbGl0dGxlIGVuZGlhbiBsYXN0IHRpbWUgSSBsb29rZWQgLi4uIgorIyBlbmRpZgorI2VuZGlmCisKKy8qIEhQL1BBICovCisjaWYgZGVmaW5lZChfX2hwcGFfXykKKyMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCisjICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgorIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIEJJR19FTkRJQU4KKyMgZW5kaWYKKyMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSICE9IEJJR19FTkRJQU4pCisjICBlcnJvciAiSFAvUEEgd2FzIGJpZyBlbmRpYW4gbGFzdCB0aW1lIEkgbG9va2VkIC4uLiIKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBCaWcgZW5kaWFuIE1JUFMgKi8KKyNpZiBkZWZpbmVkKF9fTUlQU0VCX18pCisjIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSAwKQorIyAgdW5kZWYgV0lUSF9IT1NUX0JZVEVfT1JERVIKKyMgIGRlZmluZSBXSVRIX0hPU1RfQllURV9PUkRFUiBCSUdfRU5ESUFOCisjIGVuZGlmCisjIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOKQorIyAgZXJyb3IgIk1JUFNFQiB3YXMgYmlnIGVuZGlhbiBsYXN0IHRpbWUgSSBsb29rZWQgLi4uIgorIyBlbmRpZgorI2VuZGlmCisKKy8qIExpdHRsZSBlbmRpYW4gTUlQUyAqLworI2lmIGRlZmluZWQoX19NSVBTRUxfXykKKyMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSID09IDApCisjICB1bmRlZiBXSVRIX0hPU1RfQllURV9PUkRFUgorIyAgZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyMgZW5kaWYKKyMgaWYgKFdJVEhfSE9TVF9CWVRFX09SREVSICE9IExJVFRMRV9FTkRJQU4pCisjICBlcnJvciAiTUlQU0VMIHdhcyBsaXR0bGUgZW5kaWFuIGxhc3QgdGltZSBJIGxvb2tlZCAuLi4iCisjIGVuZGlmCisjZW5kaWYKKworLyogV2luZG93cyBOVCAqLworI2lmIGRlZmluZWQoX19XSU4zMl9fKQorIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgPT0gMCkKKyMgIHVuZGVmIFdJVEhfSE9TVF9CWVRFX09SREVSCisjICBkZWZpbmUgV0lUSF9IT1NUX0JZVEVfT1JERVIgTElUVExFX0VORElBTgorIyBlbmRpZgorIyBpZiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgIT0gTElUVExFX0VORElBTikKKyMgIGVycm9yICJXaW5kb3dzIE5UIHdhcyBsaXR0bGUgZW5kaWFuIGxhc3QgdGltZSBJIGxvb2tlZCAuLi4iCisjIGVuZGlmCisjZW5kaWYKKworLyogQWxwaGEgcnVubmluZyBERUMgdW5peCAqLworI2lmIGRlZmluZWQoX19vc2ZfXykgJiYgZGVmaW5lZChfX2FscGhhX18pCisjIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiA9PSAwKQorIyAgdW5kZWYgV0lUSF9IT1NUX0JZVEVfT1JERVIKKyMgIGRlZmluZSBXSVRIX0hPU1RfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisjIGVuZGlmCisjIGlmIChXSVRIX0hPU1RfQllURV9PUkRFUiAhPSBMSVRUTEVfRU5ESUFOKQorIyAgZXJyb3IgIkFYUCBydW5uaW5nIERFQyB1bml4IHdhcyBsaXR0bGUgZW5kaWFuIGxhc3QgdGltZSBJIGxvb2tlZCAuLi4iCisjIGVuZGlmCisjZW5kaWYKKworCisvKiBJTlNFUlQgSEVSRSAtIGFkZGl0aW9uYWwgaG9zdHMgdGhhdCBkbyBub3QgaGF2ZSBMSVRUTEVfRU5ESUFOIGFuZAorICAgQklHX0VORElBTiBkZWZpbml0aW9ucyBhdmFpbGFibGUuICAqLworCisvKiBTV0FQICovCisKKyNkZWZpbmUgU1dBUF8xKFgpIHN3YXBfMShYKQorI2RlZmluZSBTV0FQXzIoWCkgc3dhcF8yKFgpCisjZGVmaW5lIFNXQVBfNChYKSBzd2FwXzQoWCkKKyNkZWZpbmUgU1dBUF84KFgpIHN3YXBfOChYKQorCisKKy8qIEhPU1QgdG8gQkUgKi8KKworI2RlZmluZSBIMkJFXzEoWCkgZW5kaWFuX2gyYmVfMShYKQorI2RlZmluZSBIMkJFXzIoWCkgZW5kaWFuX2gyYmVfMihYKQorI2RlZmluZSBIMkJFXzQoWCkgZW5kaWFuX2gyYmVfNChYKQorI2RlZmluZSBIMkJFXzgoWCkgZW5kaWFuX2gyYmVfOChYKQorI2RlZmluZSBCRTJIXzEoWCkgZW5kaWFuX2JlMmhfMShYKQorI2RlZmluZSBCRTJIXzIoWCkgZW5kaWFuX2JlMmhfMihYKQorI2RlZmluZSBCRTJIXzQoWCkgZW5kaWFuX2JlMmhfNChYKQorI2RlZmluZSBCRTJIXzgoWCkgZW5kaWFuX2JlMmhfOChYKQorCisKKy8qIEhPU1QgdG8gTEUgKi8KKworI2RlZmluZSBIMkxFXzEoWCkgZW5kaWFuX2gybGVfMShYKQorI2RlZmluZSBIMkxFXzIoWCkgZW5kaWFuX2gybGVfMihYKQorI2RlZmluZSBIMkxFXzQoWCkgZW5kaWFuX2gybGVfNChYKQorI2RlZmluZSBIMkxFXzgoWCkgZW5kaWFuX2gybGVfOChYKQorI2RlZmluZSBMRTJIXzEoWCkgZW5kaWFuX2xlMmhfMShYKQorI2RlZmluZSBMRTJIXzIoWCkgZW5kaWFuX2xlMmhfMihYKQorI2RlZmluZSBMRTJIXzQoWCkgZW5kaWFuX2xlMmhfNChYKQorI2RlZmluZSBMRTJIXzgoWCkgZW5kaWFuX2xlMmhfOChYKQorCisKKy8qIEhPU1QgdG8gVEFSR0VUICovCisKKyNkZWZpbmUgSDJUXzEoWCkgZW5kaWFuX2gydF8xKFgpCisjZGVmaW5lIEgyVF8yKFgpIGVuZGlhbl9oMnRfMihYKQorI2RlZmluZSBIMlRfNChYKSBlbmRpYW5faDJ0XzQoWCkKKyNkZWZpbmUgSDJUXzgoWCkgZW5kaWFuX2gydF84KFgpCisjZGVmaW5lIFQySF8xKFgpIGVuZGlhbl90MmhfMShYKQorI2RlZmluZSBUMkhfMihYKSBlbmRpYW5fdDJoXzIoWCkKKyNkZWZpbmUgVDJIXzQoWCkgZW5kaWFuX3QyaF80KFgpCisjZGVmaW5lIFQySF84KFgpIGVuZGlhbl90MmhfOChYKQorCisKKy8qIENPTlZFUlQgSU4gUExBQ0UKKworICAgVGhlc2UgbWFjcm9zLCBnaXZlbiBhbiBhcmd1bWVudCBvZiB1bmtub3duIHNpemUsIHN3YXAgaXRzIHZhbHVlIGluCisgICBwbGFjZSBpZiBhIGhvc3QvdGFyZ2V0IGNvbnZlcnNpb24gaXMgcmVxdWlyZWQuICovCisKKyNkZWZpbmUgSDJUKFZBUklBQkxFKSBcCitkbyB7IFwKKyAgc3dpdGNoIChzaXplb2YoVkFSSUFCTEUpKSB7IFwKKyAgY2FzZSAxOiBWQVJJQUJMRSA9IEgyVF8xKFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgY2FzZSAyOiBWQVJJQUJMRSA9IEgyVF8yKFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgY2FzZSA0OiBWQVJJQUJMRSA9IEgyVF80KFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgY2FzZSA4OiBWQVJJQUJMRSA9IEgyVF84KFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgfSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFQySChWQVJJQUJMRSkgXAorZG8geyBcCisgIHN3aXRjaCAoc2l6ZW9mKFZBUklBQkxFKSkgeyBcCisgIGNhc2UgMTogVkFSSUFCTEUgPSBUMkhfMShWQVJJQUJMRSk7IGJyZWFrOyBcCisgIGNhc2UgMjogVkFSSUFCTEUgPSBUMkhfMihWQVJJQUJMRSk7IGJyZWFrOyBcCisgIGNhc2UgNDogVkFSSUFCTEUgPSBUMkhfNChWQVJJQUJMRSk7IGJyZWFrOyBcCisgIGNhc2UgODogVkFSSUFCTEUgPSBUMkhfOChWQVJJQUJMRSk7IGJyZWFrOyBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTV0FQKFZBUklBQkxFKSBcCitkbyB7IFwKKyAgc3dpdGNoIChzaXplb2YoVkFSSUFCTEUpKSB7IFwKKyAgY2FzZSAxOiBWQVJJQUJMRSA9IFNXQVBfMShWQVJJQUJMRSk7IGJyZWFrOyBcCisgIGNhc2UgMjogVkFSSUFCTEUgPSBTV0FQXzIoVkFSSUFCTEUpOyBicmVhazsgXAorICBjYXNlIDQ6IFZBUklBQkxFID0gU1dBUF80KFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgY2FzZSA4OiBWQVJJQUJMRSA9IFNXQVBfOChWQVJJQUJMRSk7IGJyZWFrOyBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBIMkJFKFZBUklBQkxFKSBcCitkbyB7IFwKKyAgc3dpdGNoIChzaXplb2YoVkFSSUFCTEUpKSB7IFwKKyAgY2FzZSAxOiBWQVJJQUJMRSA9IEgyQkVfMShWQVJJQUJMRSk7IGJyZWFrOyBcCisgIGNhc2UgMjogVkFSSUFCTEUgPSBIMkJFXzIoVkFSSUFCTEUpOyBicmVhazsgXAorICBjYXNlIDQ6IFZBUklBQkxFID0gSDJCRV80KFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgY2FzZSA4OiBWQVJJQUJMRSA9IEgyQkVfOChWQVJJQUJMRSk7IGJyZWFrOyBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBCRTJIKFZBUklBQkxFKSBcCitkbyB7IFwKKyAgc3dpdGNoIChzaXplb2YoVkFSSUFCTEUpKSB7IFwKKyAgY2FzZSAxOiBWQVJJQUJMRSA9IEJFMkhfMShWQVJJQUJMRSk7IGJyZWFrOyBcCisgIGNhc2UgMjogVkFSSUFCTEUgPSBCRTJIXzIoVkFSSUFCTEUpOyBicmVhazsgXAorICBjYXNlIDQ6IFZBUklBQkxFID0gQkUySF80KFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgY2FzZSA4OiBWQVJJQUJMRSA9IEJFMkhfOChWQVJJQUJMRSk7IGJyZWFrOyBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBIMkxFKFZBUklBQkxFKSBcCitkbyB7IFwKKyAgc3dpdGNoIChzaXplb2YoVkFSSUFCTEUpKSB7IFwKKyAgY2FzZSAxOiBWQVJJQUJMRSA9IEgyTEVfMShWQVJJQUJMRSk7IGJyZWFrOyBcCisgIGNhc2UgMjogVkFSSUFCTEUgPSBIMkxFXzIoVkFSSUFCTEUpOyBicmVhazsgXAorICBjYXNlIDQ6IFZBUklBQkxFID0gSDJMRV80KFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgY2FzZSA4OiBWQVJJQUJMRSA9IEgyTEVfOChWQVJJQUJMRSk7IGJyZWFrOyBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBMRTJIKFZBUklBQkxFKSBcCitkbyB7IFwKKyAgc3dpdGNoIChzaXplb2YoVkFSSUFCTEUpKSB7IFwKKyAgY2FzZSAxOiBWQVJJQUJMRSA9IExFMkhfMShWQVJJQUJMRSk7IGJyZWFrOyBcCisgIGNhc2UgMjogVkFSSUFCTEUgPSBMRTJIXzIoVkFSSUFCTEUpOyBicmVhazsgXAorICBjYXNlIDQ6IFZBUklBQkxFID0gTEUySF80KFZBUklBQkxFKTsgYnJlYWs7IFwKKyAgY2FzZSA4OiBWQVJJQUJMRSA9IExFMkhfOChWQVJJQUJMRSk7IGJyZWFrOyBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworCisKKy8qIFRBUkdFVCBXT1JEOgorCisgICBCeXRlIHN3YXAgYSBxdWFudGl0eSB0aGUgc2l6ZSBvZiB0aGUgdGFyZ2V0cyB3b3JkICovCisKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQorI2RlZmluZSBIMlRfd29yZChYKSBIMlRfOChYKQorI2RlZmluZSBUMkhfd29yZChYKSBUMkhfOChYKQorI2RlZmluZSBIMkJFX3dvcmQoWCkgSDJCRV84KFgpCisjZGVmaW5lIEJFMkhfd29yZChYKSBCRTJIXzgoWCkKKyNkZWZpbmUgSDJMRV93b3JkKFgpIEgyTEVfOChYKQorI2RlZmluZSBMRTJIX3dvcmQoWCkgTEUySF84KFgpCisjZGVmaW5lIFNXQVBfd29yZChYKSBTV0FQXzgoWCkKKyNlbmRpZgorI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCisjZGVmaW5lIEgyVF93b3JkKFgpIEgyVF80KFgpCisjZGVmaW5lIFQySF93b3JkKFgpIFQySF80KFgpCisjZGVmaW5lIEgyQkVfd29yZChYKSBIMkJFXzQoWCkKKyNkZWZpbmUgQkUySF93b3JkKFgpIEJFMkhfNChYKQorI2RlZmluZSBIMkxFX3dvcmQoWCkgSDJMRV80KFgpCisjZGVmaW5lIExFMkhfd29yZChYKSBMRTJIXzQoWCkKKyNkZWZpbmUgU1dBUF93b3JkKFgpIFNXQVBfNChYKQorI2VuZGlmCisKKworLyogVEFSR0VUIENFTEw6CisKKyAgIEJ5dGUgc3dhcCBhIHF1YW50aXR5IHRoZSBzaXplIG9mIHRoZSB0YXJnZXRzIElFRUUgMTI3NSBtZW1vcnkgY2VsbCAqLworCisjZGVmaW5lIEgyVF9jZWxsKFgpIEgyVF80KFgpCisjZGVmaW5lIFQySF9jZWxsKFgpIFQySF80KFgpCisjZGVmaW5lIEgyQkVfY2VsbChYKSBIMkJFXzQoWCkKKyNkZWZpbmUgQkUySF9jZWxsKFgpIEJFMkhfNChYKQorI2RlZmluZSBIMkxFX2NlbGwoWCkgSDJMRV80KFgpCisjZGVmaW5lIExFMkhfY2VsbChYKSBMRTJIXzQoWCkKKyNkZWZpbmUgU1dBUF9jZWxsKFgpIFNXQVBfNChYKQorCisKKyNpZiAoU0lNX0VORElBTl9JTkxJTkUgJiBJTkNMVURFX01PRFVMRSkKKyMgaW5jbHVkZSAic2ltLWVuZGlhbi5jIgorI2VuZGlmCisKKyNlbmRpZiAvKiBfU0lNX0VORElBTl9IXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9zaW1fY2FsbGJhY2tzLmggYi9zaW0vcHBjL3NpbV9jYWxsYmFja3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjJhZjlkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9zaW1fY2FsbGJhY2tzLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsMTk5OCwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfU0lNX0NBTExCQUNLU19IXworI2RlZmluZSBfU0lNX0NBTExCQUNLU19IXworCisvKiBTaW11bGF0b3Igb3V0cHV0OgorCisgICBGdW5jdGlvbnMgdG8gcmVwb3J0IGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIuICovCisKKyNkZWZpbmUgcHJpbnRmX2ZpbHRlcmVkIHNpbV9pb19wcmludGZfZmlsdGVyZWQKK3ZvaWQgc2ltX2lvX3ByaW50Zl9maWx0ZXJlZAorKGNvbnN0IGNoYXIgKm1zZywgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CisKK3ZvaWQgTk9SRVRVUk4gZXJyb3IKKyhjb25zdCBjaGFyICptc2csIC4uLik7CisKKworLyogRXh0ZXJuYWwgZW52aXJvbm1lbnQ6CisKKyAgIFNvbWUgSE9TVCBPUydzIHJlcXVpcmUgcmVndWxhciBwb2xsaW5nIHNvIHRoYXQgZXh0ZXJuYWwgZXZlbnRzIHN1Y2gKKyAgIGFzIEdVSSBpbyBjYW4gYmUgaGFuZGxlZC4gKi8KKwordm9pZCBzaW1faW9fcG9sbF9xdWl0Cisodm9pZCk7CisKKworCisvKiBNb2RlbCBJL086CisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBwcm92aWRlIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgbW9kZWxlZCB0YXJnZXRzCisgICBzdGFuZGFyZCBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMgYW5kIHRoZSBob3N0cyBleHRlcm5hbAorICAgZW52aXJvbm1lbnQuCisKKyAgIFRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzIHJlc3BvbnNpYmxlIGZvciBjby1vcmRpbmF0aW5nIEkvTworICAgaW50ZXJhY3Rpb25zIHN1Y2ggYXM6CisKKyAgICAgICAgbWFpbigpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBjaGFyIG1lc3NbXSA9ICJIZWxsbyBXb3JsZFxyXG4iOworICAgICAgICAgIGludCBvdXQ7CisgICAgICAgICAgb3V0ID0gZHVwKDEpOworICAgICAgICAgIGNsb3NlKDEpOworICAgICAgICAgIHdyaXRlKG91dCwgbWVzcywgc2l6ZW9mKG1lc3MpKQorICAgICAgICB9CisKKyAgIFRoYXQgaXMgdG8gc2F5LCB0aGUgdW5kZXJseWluZyBtb2RlbCB3b3VsZCwgaW4gaW1wbGVtZW50aW5nIGR1cCgpCisgICByZWNvcmRlZCB0aGUgZmFjdCB0aGF0IGFueSBvdXRwdXQgZGlyZWN0ZWQgYXQgZmlkLU9VVCBzaG91bGQgYmUKKyAgIGRpc3BsYXllZCB1c2luZyBzaW1faW9fd3JpdGVfc3Rkb3V0KCkuICBXaGlsZSBmb3IgdGhlIGNvZGUgc3R1YjoKKworICAgICAgICBtYWluKCkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IGNoYXIgbWVzc1tdID0gIkhlbGxvIFdvcmxkXHJcbiI7CisgICAgICAgICAgaW50IG91dDsKKyAgICAgICAgICBjbG9zZSgxKTsKKyAgICAgICAgICBvdXQgPSBvcGVuKCJvdXRwdXQiLCAweDAwMDF8MHgwMjAwLCAwKTsgLy8gd3JpdGUrY3JlYXRlCisgICAgICAgICAgb3V0ID0gZHVwKDEpOworICAgICAgICAgIHdyaXRlKG91dCwgbWVzcywgc2l6ZW9mKG1lc3MpKQorICAgICAgICB9CisKKyAgIHdvdWxkIHJlc3VsdCBpbiBvdXRwdXQgdG8gZmlkLTEgYmVpbmcgZGlyZWN0ZWQgdG93YXJkcyB0aGUgZmlsZQorICAgIm91dHB1dCIuICovCisKKworaW50CitzaW1faW9fd3JpdGVfc3Rkb3V0CisoY29uc3QgY2hhciAqYnVmLAorIGludCBzaXplb2ZfYnVmKTsKKworaW50CitzaW1faW9fd3JpdGVfc3RkZXJyCisoY29uc3QgY2hhciAqYnVmLAorIGludCBzaXplb2ZfYnVmKTsKKworLyogcmVhZCByZXN1bHRzICovCitlbnVtIHsgc2ltX2lvX2VvZiA9IC0xLCBzaW1faW9fbm90X3JlYWR5ID0gLTIsIH07IC8qIFNlZTogSUVFRSAxMjc1ICovCisgIAoraW50CitzaW1faW9fcmVhZF9zdGRpbgorKGNoYXIgKmJ1ZiwKKyBpbnQgc2l6ZW9mX2J1Zik7CisKKyNkZWZpbmUgZmx1c2hfc3Rkb3V0cHV0IHNpbV9pb19mbHVzaF9zdGRvdXRwdXQKK3ZvaWQgc2ltX2lvX2ZsdXNoX3N0ZG91dHB1dAorKHZvaWQpOworCisKKy8qIE1lbW9yeSBtYW5hZ2VtZW50IHdpdGggYW4gYWxsb2NhdG9yIHRoYXQgY2xlYXJzIG1lbW9yeSBiZWZvcmUgdXNlLiAqLworCit2b2lkICp6YWxsb2MKKyhsb25nIHNpemUpOworCisjZGVmaW5lIFpBTExPQyhUWVBFKSAoVFlQRSopemFsbG9jKHNpemVvZiAoVFlQRSkpCisKK3ZvaWQgemZyZWUodm9pZCopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS9wcGMvc2ltX2NhbGxzLmMgYi9zaW0vcHBjL3NpbV9jYWxscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODQ1MzkKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL3NpbV9jYWxscy5jCkBAIC0wLDAgKzEsNDQ1IEBACisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHByb2dyYW0gcHNpbS4KKworICAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LDE5OTgsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpbmNsdWRlIDxzaWduYWwuaD4gLyogRklYTUUgLSBzaG91bGQgYmUgbWFjaGluZSBkZXBlbmRhbnQgdmVyc2lvbiAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJwc2ltLmgiCisjaW5jbHVkZSAib3B0aW9ucy5oIgorCisjdW5kZWYgcHJpbnRmX2ZpbHRlcmVkIC8qIGJsb3cgYXdheSB0aGUgbWFwcGluZyAqLworCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIKKworCisvKiBTdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlIHNpbXVsYXRvciwgZm9yIGdkYiBqdXN0IGhhdmUgc3RhdGljIHN0cnVjdHVyZXMgKi8KKworc3RhdGljIHBzaW0gKnNpbXVsYXRvcjsKK3N0YXRpYyBkZXZpY2UgKnJvb3RfZGV2aWNlOworc3RhdGljIGhvc3RfY2FsbGJhY2sgKmNhbGxiYWNrczsKKworLyogV2UgdXNlIEdEQidzIHJlZ19uYW1lcyBhcnJheSB0byBtYXAgR0RCIHJlZ2lzdGVyIG51bWJlcnMgb250bworICAgbmFtZXMsIHdoaWNoIHdlIGNhbiB0aGVuIGxvb2sgdXAgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlLgorCisgICBXZSB1c2VkIHRvIGp1c3QgdXNlIHRoZSBSRUdJU1RFUl9OQU1FUyBtYWNybywgZnJvbSBHREIncworICAgdGFyZ2V0LWRlcGVuZGVudCBoZWFkZXIgZmlsZXMuICBUaGF0IHdhcyBraW5kIG9mIG5pY2UsIGJlY2F1c2UgaXQKKyAgIG1lYW50IHRoYXQgbGlic2ltLmEgaGFkIG9ubHkgYSBjb21waWxlLXRpbWUgZGVwZW5kZW5jeSBvbiBHREI7CisgICB1c2luZyByZWdfbmFtZXMgZGlyZWN0bHkgbWVhbnMgdGhhdCB0aGVyZSBhcmUgbm93IGxpbmstdGltZSBhbmQKKyAgIHJ1bi10aW1lIGRlcGVuZGVuY2llcyB0b28uCisKKyAgIEhvd2V2ZXIsIHRoZSBHREIgUFBDIGJhY2stZW5kIG5vdyBtb2RpZmllcyB0aGUgcmVnX25hbWVzIGFycmF5IHdoZW4KKyAgIHRoZSB1c2VyIHJ1bnMgdGhlIGBzZXQgcHJvY2Vzc29yJyBjb21tYW5kLCB3aGljaCBhZmZlY3RzIHRoZQorICAgbWVhbmluZ3Mgb2YgdGhlIHJlZ2lzdGVyIG51bWJlcnMuICBTbyB0aGUgc2ltIG5lZWRzIHRvIHNlZSB0aGUKKyAgIHJlZ2lzdGVyIG5hbWVzIEdEQiBpcyBhY3R1YWxseSB1c2luZy4KKworICAgUGVyaGFwcyB0aGUgaG9zdF9jYWxsYmFjayBzdHJ1Y3R1cmUgY291bGQgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlCisgICByZWdpc3RlciBuYW1lIHRhYmxlOyB0aGF0IHdvdWxkIGJlIGNsZWFuZXIuICAqLworCitTSU1fREVTQworc2ltX29wZW4gKFNJTV9PUEVOX0tJTkQga2luZCwKKwkgIGhvc3RfY2FsbGJhY2sgKmNhbGxiYWNrLAorCSAgc3RydWN0IF9iZmQgKmFiZmQsCisJICBjaGFyICoqYXJndikKK3sKKyAgY2FsbGJhY2tzID0gY2FsbGJhY2s7CisKKyAgLyogTm90ZTogVGhlIHNpbXVsYXRpb24gaXMgbm90IGNyZWF0ZWQgYnkgc2ltX29wZW4oKSBiZWNhdXNlCisgICAgIGNvbXBsZXRlIGluZm9ybWF0aW9uIGlzIG5vdCB5ZXQgYXZhaWxhYmxlICovCisgIC8qIHRyYWNlIHRoZSBjYWxsICovCisgIFRSQUNFKHRyYWNlX2dkYiwgKCJzaW1fb3BlbiBjYWxsZWRcbiIpKTsKKworICBpZiAocm9vdF9kZXZpY2UgIT0gTlVMTCkKKyAgICBzaW1faW9fcHJpbnRmX2ZpbHRlcmVkKCJXYXJuaW5nIC0gcmUtb3BlbiBvZiBzaW11bGF0b3IgbGVha3MgbWVtb3J5XG4iKTsKKyAgcm9vdF9kZXZpY2UgPSBwc2ltX3RyZWUoKTsKKyAgc2ltdWxhdG9yID0gTlVMTDsKKworICBwc2ltX29wdGlvbnMocm9vdF9kZXZpY2UsIGFyZ3YgKyAxKTsKKworICBpZiAocHBjX3RyYWNlW3RyYWNlX29wdHNdKQorICAgIHByaW50X29wdGlvbnMgKCk7CisKKyAgLyogZnVkZ2Ugb3VyIGRlc2NyaXB0b3IgZm9yIG5vdyAqLworICByZXR1cm4gKFNJTV9ERVNDKSAxOworfQorCisKK3ZvaWQKK3NpbV9jbG9zZSAoU0lNX0RFU0Mgc2QsIGludCBxdWl0dGluZykKK3sKKyAgVFJBQ0UodHJhY2VfZ2RiLCAoInNpbV9jbG9zZShxdWl0dGluZz0lZCkgY2FsbGVkXG4iLCBxdWl0dGluZykpOworICBpZiAocHBjX3RyYWNlW3RyYWNlX3ByaW50X2luZm9dICYmIHNpbXVsYXRvciAhPSBOVUxMKQorICAgIHBzaW1fcHJpbnRfaW5mbyAoc2ltdWxhdG9yLCBwcGNfdHJhY2VbdHJhY2VfcHJpbnRfaW5mb10pOworfQorCisKK1NJTV9SQworc2ltX2xvYWQgKFNJTV9ERVNDIHNkLCBjaGFyICpwcm9nLCBiZmQgKmFiZmQsIGludCBmcm9tX3R0eSkKK3sKKyAgVFJBQ0UodHJhY2VfZ2RiLCAoInNpbV9sb2FkKHByb2c9JXMsIGZyb21fdHR5PSVkKSBjYWxsZWRcbiIsCisJCSAgICBwcm9nLCBmcm9tX3R0eSkpOworICBBU1NFUlQocHJvZyAhPSBOVUxMKTsKKworICAvKiBjcmVhdGUgdGhlIHNpbXVsYXRvciAqLworICBUUkFDRSh0cmFjZV9nZGIsICgic2ltX2xvYWQoKSAtIGZpcnN0IHRpbWUsIGNyZWF0ZSB0aGUgc2ltdWxhdG9yXG4iKSk7CisgIHNpbXVsYXRvciA9IHBzaW1fY3JlYXRlKHByb2csIHJvb3RfZGV2aWNlKTsKKworICAvKiBicmluZyBpbiBhbGwgdGhlIGRhdGEgc2VjdGlvbiAqLworICBwc2ltX2luaXQoc2ltdWxhdG9yKTsKKworICAvKiBnZXQgdGhlIHN0YXJ0IGFkZHJlc3MgKi8KKyAgaWYgKGFiZmQgPT0gTlVMTCkKKyAgICB7CisgICAgICBhYmZkID0gYmZkX29wZW5yIChwcm9nLCAwKTsKKyAgICAgIGlmIChhYmZkID09IE5VTEwpCisJZXJyb3IgKCJwc2ltOiBjYW4ndCBvcGVuIFwiJXNcIjogJXNcbiIsIAorCSAgICAgICBwcm9nLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7CisgICAgICBpZiAoIWJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKSAKKwl7CisJICBjb25zdCBjaGFyICplcnJtc2cgPSBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKTsKKwkgIGJmZF9jbG9zZSAoYWJmZCk7CisJICBlcnJvciAoInBzaW06IFwiJXNcIiBpcyBub3QgYW4gb2JqZWN0IGZpbGU6ICVzXG4iLAorCQkgcHJvZywgZXJybXNnKTsKKwl9CisgICAgICBiZmRfY2xvc2UgKGFiZmQpOworICAgIH0KKworICByZXR1cm4gU0lNX1JDX09LOworfQorCisKK2ludAorc2ltX3JlYWQgKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBtZW0sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkKK3sKKyAgaW50IHJlc3VsdCA9IHBzaW1fcmVhZF9tZW1vcnkoc2ltdWxhdG9yLCBNQVhfTlJfUFJPQ0VTU09SUywKKwkJCQlidWYsIG1lbSwgbGVuZ3RoKTsKKyAgVFJBQ0UodHJhY2VfZ2RiLCAoInNpbV9yZWFkKG1lbT0weCVseCwgYnVmPTB4JWx4LCBsZW5ndGg9JWQpID0gJWRcbiIsCisJCSAgICAobG9uZyltZW0sIChsb25nKWJ1ZiwgbGVuZ3RoLCByZXN1bHQpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitpbnQKK3NpbV93cml0ZSAoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIG1lbSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKQoreworICBpbnQgcmVzdWx0ID0gcHNpbV93cml0ZV9tZW1vcnkoc2ltdWxhdG9yLCBNQVhfTlJfUFJPQ0VTU09SUywKKwkJCQkgYnVmLCBtZW0sIGxlbmd0aCwKKwkJCQkgMS8qdmlvbGF0ZV9ybyovKTsKKyAgVFJBQ0UodHJhY2VfZ2RiLCAoInNpbV93cml0ZShtZW09MHglbHgsIGJ1Zj0weCVseCwgbGVuZ3RoPSVkKSA9ICVkXG4iLAorCQkgICAgKGxvbmcpbWVtLCAobG9uZylidWYsIGxlbmd0aCwgcmVzdWx0KSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworaW50CitzaW1fZmV0Y2hfcmVnaXN0ZXIgKFNJTV9ERVNDIHNkLCBpbnQgcmVnbm8sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkKK3sKKyAgY2hhciAqcmVnbmFtZTsKKworICBpZiAoc2ltdWxhdG9yID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qIEdEQiB3aWxsIHNvbWV0aW1lcyBhc2sgZm9yIHRoZSBjb250ZW50cyBvZiBhIHJlZ2lzdGVyIG5hbWVkICIiOworICAgICB3ZSBpZ25vcmUgc3VjaCByZXF1ZXN0cywgYW5kIGxlYXZlIGdhcmJhZ2UgaW4gKkJVRi4gIEluCisgICAgIFJFR19OQU1FUywgdGhlIGVtcHR5IHN0cmluZyBtZWFucyAidGhlIHJlZ2lzdGVyIHdpdGggdGhpcworICAgICBudW1iZXIgaXMgbm90IHByZXNlbnQgaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBhcmNoaXRlY3R1cmUKKyAgICAgdmFyaWFudC4iICBUaGF0J3MgZm9sbG93aW5nIHRoZSBrbHVkZ2Ugd2UncmUgdXNpbmcgZm9yIHRoZSBNSVBTCisgICAgIHByb2Nlc3NvcnMuICBCdXQgdGhlcmUgYXJlIGxvb3BzIHRoYXQganVzdCB3YWxrIHRocm91Z2ggdGhlCisgICAgIGVudGlyZSBsaXN0IG9mIG5hbWVzIGFuZCB0cnkgdG8gZ2V0IGV2ZXJ5dGhpbmcuICAqLworICByZWduYW1lID0gUkVHSVNURVJfTkFNRSAocmVnbm8pOworICBpZiAoISByZWduYW1lIHx8IHJlZ25hbWVbMF0gPT0gJ1wwJykKKyAgICByZXR1cm4gLTE7CisKKyAgVFJBQ0UodHJhY2VfZ2RiLCAoInNpbV9mZXRjaF9yZWdpc3RlcihyZWdubz0lZCglcyksIGJ1Zj0weCVseClcbiIsCisJCSAgICByZWdubywgcmVnbmFtZSwgKGxvbmcpYnVmKSk7CisgIHBzaW1fcmVhZF9yZWdpc3RlcihzaW11bGF0b3IsIE1BWF9OUl9QUk9DRVNTT1JTLAorCQkgICAgIGJ1ZiwgcmVnbmFtZSwgcmF3X3RyYW5zZmVyKTsKKyAgcmV0dXJuIC0xOworfQorCisKK2ludAorc2ltX3N0b3JlX3JlZ2lzdGVyIChTSU1fREVTQyBzZCwgaW50IHJlZ25vLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW5ndGgpCit7CisgIGNoYXIgKnJlZ25hbWU7CisKKyAgaWYgKHNpbXVsYXRvciA9PSBOVUxMKQorICAgIHJldHVybiAwOworCisgIC8qIFNlZSBjb21tZW50cyBpbiBzaW1fZmV0Y2hfcmVnaXN0ZXIsIGFib3ZlLiAgKi8KKyAgcmVnbmFtZSA9IFJFR0lTVEVSX05BTUUgKHJlZ25vKTsKKyAgaWYgKCEgcmVnbmFtZSB8fCByZWduYW1lWzBdID09ICdcMCcpCisgICAgcmV0dXJuIC0xOworCisgIFRSQUNFKHRyYWNlX2dkYiwgKCJzaW1fc3RvcmVfcmVnaXN0ZXIocmVnbm89JWQoJXMpLCBidWY9MHglbHgpXG4iLAorCQkgICAgcmVnbm8sIHJlZ25hbWUsIChsb25nKWJ1ZikpOworICBwc2ltX3dyaXRlX3JlZ2lzdGVyKHNpbXVsYXRvciwgTUFYX05SX1BST0NFU1NPUlMsCisJCSAgICAgIGJ1ZiwgcmVnbmFtZSwgcmF3X3RyYW5zZmVyKTsKKyAgcmV0dXJuIC0xOworfQorCisKK3ZvaWQKK3NpbV9pbmZvIChTSU1fREVTQyBzZCwgaW50IHZlcmJvc2UpCit7CisgIFRSQUNFKHRyYWNlX2dkYiwgKCJzaW1faW5mbyh2ZXJib3NlPSVkKSBjYWxsZWRcbiIsIHZlcmJvc2UpKTsKKyAgcHNpbV9wcmludF9pbmZvIChzaW11bGF0b3IsIHZlcmJvc2UpOworfQorCisKK1NJTV9SQworc2ltX2NyZWF0ZV9pbmZlcmlvciAoU0lNX0RFU0Mgc2QsCisJCSAgICAgc3RydWN0IF9iZmQgKmFiZmQsCisJCSAgICAgY2hhciAqKmFyZ3YsCisJCSAgICAgY2hhciAqKmVudnApCit7CisgIHVuc2lnbmVkX3dvcmQgZW50cnlfcG9pbnQ7CisgIFRSQUNFKHRyYWNlX2dkYiwgKCJzaW1fY3JlYXRlX2luZmVyaW9yKHN0YXJ0X2FkZHJlc3M9MHgleCwgLi4uKVxuIiwKKwkJICAgIGVudHJ5X3BvaW50KSk7CisKKyAgaWYgKHNpbXVsYXRvciA9PSBOVUxMKQorICAgIGVycm9yICgiTm8gcHJvZ3JhbSBsb2FkZWQiKTsKKworICBpZiAoYWJmZCAhPSBOVUxMKQorICAgIGVudHJ5X3BvaW50ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKKyAgZWxzZQorICAgIGVudHJ5X3BvaW50ID0gMHhmZmYwMDAwMDsgLyogPz8/ICovCisKKyAgcHNpbV9pbml0KHNpbXVsYXRvcik7CisgIHBzaW1fc3RhY2soc2ltdWxhdG9yLCBhcmd2LCBlbnZwKTsKKworICBwc2ltX3dyaXRlX3JlZ2lzdGVyKHNpbXVsYXRvciwgLTEgLyogYWxsIHN0YXJ0IGF0IHNhbWUgUEMgKi8sCisJCSAgICAgICZlbnRyeV9wb2ludCwgInBjIiwgY29va2VkX3RyYW5zZmVyKTsKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworCit2b2lkCitzaW1fc3RvcF9yZWFzb24gKFNJTV9ERVNDIHNkLCBlbnVtIHNpbV9zdG9wICpyZWFzb24sIGludCAqc2lncmMpCit7CisgIHBzaW1fc3RhdHVzIHN0YXR1cyA9IHBzaW1fZ2V0X3N0YXR1cyhzaW11bGF0b3IpOworCisgIHN3aXRjaCAoc3RhdHVzLnJlYXNvbikgeworICBjYXNlIHdhc19jb250aW51aW5nOgorICAgICpyZWFzb24gPSBzaW1fc3RvcHBlZDsKKyAgICBpZiAoc3RhdHVzLnNpZ25hbCA9PSAwKQorICAgICAgKnNpZ3JjID0gU0lHVFJBUDsKKyAgICBlbHNlCisgICAgICAqc2lncmMgPSBzdGF0dXMuc2lnbmFsOworICAgIGJyZWFrOworICBjYXNlIHdhc190cmFwOgorICAgICpyZWFzb24gPSBzaW1fc3RvcHBlZDsKKyAgICAqc2lncmMgPSBTSUdUUkFQOworICAgIGJyZWFrOworICBjYXNlIHdhc19leGl0ZWQ6CisgICAgKnJlYXNvbiA9IHNpbV9leGl0ZWQ7CisgICAgKnNpZ3JjID0gc3RhdHVzLnNpZ25hbDsKKyAgICBicmVhazsKKyAgY2FzZSB3YXNfc2lnbmFsbGVkOgorICAgICpyZWFzb24gPSBzaW1fc2lnbmFsbGVkOworICAgICpzaWdyYyA9IHN0YXR1cy5zaWduYWw7CisgICAgYnJlYWs7CisgIH0KKworICBUUkFDRSh0cmFjZV9nZGIsICgic2ltX3N0b3BfcmVhc29uKHJlYXNvbj0weCVseCglbGQpLCBzaWdyYz0weCVseCglbGQpKVxuIiwKKwkJICAgIChsb25nKXJlYXNvbiwgKGxvbmcpKnJlYXNvbiwgKGxvbmcpc2lncmMsIChsb25nKSpzaWdyYykpOworfQorCisKKworLyogUnVuIChvciByZXN1bWUpIHRoZSBwcm9ncmFtLiAgKi8KKworaW50CitzaW1fc3RvcCAoU0lNX0RFU0Mgc2QpCit7CisgIHBzaW1fc3RvcCAoc2ltdWxhdG9yKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQKK3NpbV9yZXN1bWUgKFNJTV9ERVNDIHNkLCBpbnQgc3RlcCwgaW50IHNpZ2duYWwpCit7CisgIFRSQUNFKHRyYWNlX2dkYiwgKCJzaW1fcmVzdW1lKHN0ZXA9JWQsIHNpZ2duYWw9JWQpXG4iLAorCQkgICAgc3RlcCwgc2lnZ25hbCkpOworCisgIGlmIChzdGVwKQorICAgIHsKKyAgICAgIHBzaW1fc3RlcCAoc2ltdWxhdG9yKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwc2ltX3J1biAoc2ltdWxhdG9yKTsKKyAgICB9Cit9CisKK3ZvaWQKK3NpbV9kb19jb21tYW5kIChTSU1fREVTQyBzZCwgY2hhciAqY21kKQoreworICBUUkFDRSh0cmFjZV9nZGIsICgic2ltX2RvX2NvbW1hbmRzKGNtZD0lcykgY2FsbGVkXG4iLAorCQkgICAgY21kID8gY21kIDogIihudWxsKSIpKTsKKyAgaWYgKGNtZCAhPSBOVUxMKSB7CisgICAgY2hhciAqKmFyZ3YgPSBidWlsZGFyZ3YoY21kKTsKKyAgICBwc2ltX2NvbW1hbmQocm9vdF9kZXZpY2UsIGFyZ3YpOworICAgIGZyZWVhcmd2KGFyZ3YpOworICB9Cit9CisKKworLyogUG9sbGluZywgaWYgcmVxdWlyZWQgKi8KKwordm9pZAorc2ltX2lvX3BvbGxfcXVpdCAodm9pZCkKK3sKKyAgaWYgKGNhbGxiYWNrcy0+cG9sbF9xdWl0ICE9IE5VTEwpCisgICAgeworICAgICAgaWYgKGNhbGxiYWNrcy0+cG9sbF9xdWl0IChjYWxsYmFja3MpKQorCXBzaW1fc3RvcCAoc2ltdWxhdG9yKTsKKyAgICB9Cit9CisKKworCisvKiBNYXAgc2ltdWxhdG9yIElPIG9wZXJhdGlvbnMgb250byB0aGUgY29ycmVzcG9uZGluZyBHREIgSS9PCisgICBmdW5jdGlvbnMuCisgICAKKyAgIE5COiBPbmx5IGEgbGltaXRlZCBzdWJzZXQgb2Ygb3BlcmF0aW9ucyBhcmUgbWFwcGVkIGFjcm9zcy4gIE1vcmUKKyAgIGFkdmFuY2VkIG9wZXJhdGlvbnMgKHN1Y2ggYXMgZHVwIG9yIHdyaXRlKSBtdXN0IGVpdGhlciBiZSBtYXBwZWQgdG8KKyAgIG9uZSBvZiB0aGUgYmVsb3cgY2FsbHMgb3IgaGFuZGxlZCBpbnRlcm5hbGx5ICovCisKK2ludAorc2ltX2lvX3JlYWRfc3RkaW4oY2hhciAqYnVmLAorCQkgIGludCBzaXplb2ZfYnVmKQoreworICBzd2l0Y2ggKENVUlJFTlRfU1RESU8pIHsKKyAgY2FzZSBET19VU0VfU1RESU86CisgICAgcmV0dXJuIGNhbGxiYWNrcy0+cmVhZF9zdGRpbihjYWxsYmFja3MsIGJ1Ziwgc2l6ZW9mX2J1Zik7CisgICAgYnJlYWs7CisgIGNhc2UgRE9OVF9VU0VfU1RESU86CisgICAgcmV0dXJuIGNhbGxiYWNrcy0+cmVhZChjYWxsYmFja3MsIDAsIGJ1Ziwgc2l6ZW9mX2J1Zik7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgZXJyb3IoInNpbV9pb19yZWFkX3N0ZGluOiB1bmFjY291bnRlZCBzd2l0Y2hcbiIpOworICAgIGJyZWFrOworICB9CisgIHJldHVybiAwOworfQorCitpbnQKK3NpbV9pb193cml0ZV9zdGRvdXQoY29uc3QgY2hhciAqYnVmLAorCQkgICAgaW50IHNpemVvZl9idWYpCit7CisgIHN3aXRjaCAoQ1VSUkVOVF9TVERJTykgeworICBjYXNlIERPX1VTRV9TVERJTzoKKyAgICByZXR1cm4gY2FsbGJhY2tzLT53cml0ZV9zdGRvdXQoY2FsbGJhY2tzLCBidWYsIHNpemVvZl9idWYpOworICAgIGJyZWFrOworICBjYXNlIERPTlRfVVNFX1NURElPOgorICAgIHJldHVybiBjYWxsYmFja3MtPndyaXRlKGNhbGxiYWNrcywgMSwgYnVmLCBzaXplb2ZfYnVmKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBlcnJvcigic2ltX2lvX3dyaXRlX3N0ZG91dDogdW5hY2NvdW50ZWQgc3dpdGNoXG4iKTsKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50CitzaW1faW9fd3JpdGVfc3RkZXJyKGNvbnN0IGNoYXIgKmJ1ZiwKKwkJICAgIGludCBzaXplb2ZfYnVmKQoreworICBzd2l0Y2ggKENVUlJFTlRfU1RESU8pIHsKKyAgY2FzZSBET19VU0VfU1RESU86CisgICAgLyogTkI6IEkgdGhpbmsgdGhlcmUgc2hvdWxkIGJlIGFuIGV4cGxpY2l0IHdyaXRlX3N0ZGVyciBjYWxsYmFjayAqLworICAgIHJldHVybiBjYWxsYmFja3MtPndyaXRlKGNhbGxiYWNrcywgMywgYnVmLCBzaXplb2ZfYnVmKTsKKyAgICBicmVhazsKKyAgY2FzZSBET05UX1VTRV9TVERJTzoKKyAgICByZXR1cm4gY2FsbGJhY2tzLT53cml0ZShjYWxsYmFja3MsIDMsIGJ1Ziwgc2l6ZW9mX2J1Zik7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgZXJyb3IoInNpbV9pb193cml0ZV9zdGRlcnI6IHVuYWNjb3VudGVkIHN3aXRjaFxuIik7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKwordm9pZAorc2ltX2lvX3ByaW50Zl9maWx0ZXJlZChjb25zdCBjaGFyICpmbXQsCisJCSAgICAgICAuLi4pCit7CisgIGNoYXIgbWVzc2FnZVsxMDI0XTsKKyAgdmFfbGlzdCBhcDsKKyAgLyogZm9ybWF0IHRoZSBtZXNzYWdlICovCisgIHZhX3N0YXJ0KGFwLCBmbXQpOworICB2c3ByaW50ZihtZXNzYWdlLCBmbXQsIGFwKTsKKyAgdmFfZW5kKGFwKTsKKyAgLyogc2FuaXR5IGNoZWNrICovCisgIGlmIChzdHJsZW4obWVzc2FnZSkgPj0gc2l6ZW9mKG1lc3NhZ2UpKQorICAgIGVycm9yKCJzaW1faW9fcHJpbnRmX2ZpbHRlcmVkOiBidWZmZXIgb3ZlcmZsb3dcbiIpOworICBjYWxsYmFja3MtPnByaW50Zl9maWx0ZXJlZChjYWxsYmFja3MsICIlcyIsIG1lc3NhZ2UpOworfQorCit2b2lkCitzaW1faW9fZmx1c2hfc3Rkb3V0cHV0KHZvaWQpCit7CisgIHN3aXRjaCAoQ1VSUkVOVF9TVERJTykgeworICBjYXNlIERPX1VTRV9TVERJTzoKKyAgICBjYWxsYmFja3MtPmZsdXNoX3N0ZG91dCAoY2FsbGJhY2tzKTsKKyAgICBicmVhazsKKyAgY2FzZSBET05UX1VTRV9TVERJTzoKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBlcnJvcigic2ltX2lvX3JlYWRfc3RkaW46IHVuYWNjb3VudGVkIHN3aXRjaFxuIik7CisgICAgYnJlYWs7CisgIH0KK30KKworLyoqKiovCisKK3ZvaWQgKgoremFsbG9jKGxvbmcgc2l6ZSkKK3sKKyAgdm9pZCAqbWVtb3J5ID0gKHZvaWQqKXhtYWxsb2Moc2l6ZSk7CisgIGlmIChtZW1vcnkgPT0gTlVMTCkKKyAgICBlcnJvcigieG1hbGxvYyBmYWlsZWRcbiIpOworICBtZW1zZXQobWVtb3J5LCAwLCBzaXplKTsKKyAgcmV0dXJuIG1lbW9yeTsKK30KKwordm9pZCB6ZnJlZSh2b2lkICpkYXRhKQoreworICBmcmVlKGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvc2ltL3BwYy9zdGQtY29uZmlnLmggYi9zaW0vcHBjL3N0ZC1jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWYzNTU4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy9zdGQtY29uZmlnLmgKQEAgLTAsMCArMSw2NzIgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKyNpZm5kZWYgX1BTSU1fQ09ORklHX0hfCisjZGVmaW5lIF9QU0lNX0NPTkZJR19IXworCisKKy8qIGVuZGlhbm5lc3Mgb2YgdGhlIGhvc3QvdGFyZ2V0OgorCisgICBJZiB0aGUgYnVpbGQgcHJvY2VzcyBpcyBhd2FyZSAoYXQgY29tcGlsZSB0aW1lKSBvZiB0aGUgZW5kaWFubmVzcworICAgb2YgdGhlIGhvc3QvdGFyZ2V0IGl0IGlzIGFibGUgdG8gZWxpbWluYXRlIHNsb3dlciBnZW5lcmljIGVuZGlhbgorICAgaGFuZGxpbmcgY29kZS4KKworICAgUG9zc2libGUgdmFsdWVzIGFyZSAwICh1bmtub3duKSwgTElUVExFX0VORElBTiwgQklHX0VORElBTiAqLworCisjaWZuZGVmIFdJVEhfSE9TVF9CWVRFX09SREVSCisjZGVmaW5lIFdJVEhfSE9TVF9CWVRFX09SREVSCQkwIC8qdW5rbm93biovCisjZW5kaWYKKworI2lmbmRlZiBXSVRIX1RBUkdFVF9CWVRFX09SREVSCisjZGVmaW5lIFdJVEhfVEFSR0VUX0JZVEVfT1JERVIJCTAgLyp1bmtub3duKi8KKyNlbmRpZgorCitleHRlcm4gaW50IGN1cnJlbnRfaG9zdF9ieXRlX29yZGVyOworI2RlZmluZSBDVVJSRU5UX0hPU1RfQllURV9PUkRFUiAoV0lUSF9IT1NUX0JZVEVfT1JERVIgXAorCQkJCSA/IFdJVEhfSE9TVF9CWVRFX09SREVSIFwKKwkJCQkgOiBjdXJyZW50X2hvc3RfYnl0ZV9vcmRlcikKK2V4dGVybiBpbnQgY3VycmVudF90YXJnZXRfYnl0ZV9vcmRlcjsKKyNkZWZpbmUgQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiAoV0lUSF9UQVJHRVRfQllURV9PUkRFUiBcCisJCQkJICAgPyBXSVRIX1RBUkdFVF9CWVRFX09SREVSIFwKKwkJCQkgICA6IGN1cnJlbnRfdGFyZ2V0X2J5dGVfb3JkZXIpCisKKworLyogUG93ZXJQQyBYT1IgZW5kaWFuLgorCisgICBJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUsIHRoZSBzaW11bGF0b3IgY2FuIHN1cHBvcnQgdGhlIFBvd2VyUEMncworICAgaG9ycmlibGUgWE9SIGVuZGlhbiBtb2RlLiAgVGhpcyBmZWF0dXJlIG1ha2VzIGl0IHBvc3NpYmxlIHRvCisgICBjb250cm9sIHRoZSBlbmRpYW4gbW9kZSBvZiBhIHByb2Nlc3NvciB1c2luZyB0aGUgTVNSLiAqLworCisjaWZuZGVmIFdJVEhfWE9SX0VORElBTgorI2RlZmluZSBXSVRIX1hPUl9FTkRJQU4JCTgKKyNlbmRpZgorCisKKy8qIEludGVsIGhvc3QgQlNXQVAgc3VwcG9ydDoKKworICAgV2hldGhlciB0byB1c2UgYnN3YXAgb24gdGhlIDQ4NiBhbmQgcGVudGl1bXMgcmF0aGVyIHRoYW4gdGhlIDM4NgorICAgc2VxdWVuY2UgdGhhdCB1c2VzIHhjaGdiL3JvcmwveGNoZ2IgKi8KKyNpZm5kZWYgV0lUSF9CU1dBUAorI2RlZmluZQlXSVRIX0JTV0FQIDAKKyNlbmRpZgorCisKKy8qIFNNUCBzdXBwb3J0OgorCisgICBTZXRzIGEgbGltaXQgb24gdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIHRoYXQgY2FuIGJlIHNpbXVsYXRlZC4gIElmCisgICBXSVRIX1NNUCBpcyBzZXQgdG8gemVybyAoMCksIHRoZSBzaW11bGF0b3IgaXMgcmVzdHJpY3RlZCB0bworICAgc3Vwb3J0aW5nIG9ubHkgb24gcHJvY2Vzc29yIChhbmQgYXMgYSBjb25zZXF1ZW5jZSBsZWF2ZXMgdGhlIFNNUAorICAgY29kZSBvdXQgb2YgdGhlIGJ1aWxkIHByb2Nlc3MpLgorCisgICBUaGUgYWN0dWFsIG51bWJlciBvZiBwcm9jZXNzb3JzIGlzIHRha2VuIGZyb20gdGhlIGRldmljZQorICAgL29wdGlvbnMvc21wQDxuci1jcHU+ICovCisKKyNpZm5kZWYgV0lUSF9TTVAKKyNkZWZpbmUgV0lUSF9TTVAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZW5kaWYKKyNpZiBXSVRIX1NNUAorI2RlZmluZSBNQVhfTlJfUFJPQ0VTU09SUwkJV0lUSF9TTVAKKyNlbHNlCisjZGVmaW5lIE1BWF9OUl9QUk9DRVNTT1JTCQkxCisjZW5kaWYKKworCisvKiBXb3JkIHNpemUgb2YgaG9zdC90YXJnZXQ6CisKKyAgIFNldCB0aGVzZSBhY2NvcmRpbmcgdG8geW91ciBob3N0IGFuZCB0YXJnZXQgcmVxdWlyZW1lbnRzLiAgQXQgdGhpcworICAgcG9pbnQgaW4gdGltZSwgSSd2ZSBvbmx5IGNvbXBpbGVkIChub3QgcnVuKSBmb3IgYSA2NGJpdCBhbmQgbmV2ZXIKKyAgIGJ1aWx0IGZvciBhIDY0Yml0IGhvc3QuICBUaGlzIHdpbGwgYWx3YXlzIHJlbWFpbiBhIGNvbXBpbGUgdGltZQorICAgb3B0aW9uICovCisKKyNpZm5kZWYgV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFCisjZGVmaW5lIFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSAgICAgICAgMzIgLyogY29tcGlsZWQgb25seSAqLworI2VuZGlmCisKKyNpZm5kZWYgV0lUSF9IT1NUX1dPUkRfQklUU0laRQorI2RlZmluZSBXSVRIX0hPU1RfV09SRF9CSVRTSVpFCQkzMiAvKiA2NGJpdCByZWFkeT8gKi8KKyNlbmRpZgorCisKKy8qIFByb2dyYW0gZW52aXJvbm1lbnQ6CisKKyAgIFRocmVlIGVudmlyb25tZW50cyBhcmUgYXZhaWxhYmxlIC0gVUVBICh1c2VyKSwgVkVBICh2aXJ0dWFsKSBhbmQKKyAgIE9FQSAocGVyYXRpbmcpLiAgVGhlIGZvcm1lciB0d28gYXJlIGVudmlyb25tZW50IHRoYXQgdXNlcnMgd291bGQKKyAgIGV4cGVjdCB0byBzZWUgKFZFQSBpbmNsdWRlcyB0aGluZ3MgbGlrZSBjb2hlcmVuY3kgYW5kIHRoZSB0aW1lCisgICBiYXNlKSB3aGlsZSBPRUEgaXMgd2hhdCBhbiBvcGVyYXRpbmcgc3lzdGVtIGV4cGVjdHMgdG8gc2VlLiAgQnkKKyAgIHNldHRpbmcgdGhlc2UgdG8gc3BlY2lmaWMgdmFsdWVzLCB0aGUgYnVpbGQgcHJvY2VzcyBpcyBhYmxlIHRvCisgICBlbGltaW5hdGUgbm9uIHJlbGV2ZW50IGVudmlyb25tZW50IGNvZGUKKworICAgQ1VSUkVOVF9FTlZJUk9OTUVOVCBzcGVjaWZpZXMgd2hpY2ggb2YgdmVhIG9yIG9lYSBpcyByZXF1aXJlZCBmb3IKKyAgIHRoZSBjdXJyZW50IHJ1bnRpbWUuICovCisKKyNkZWZpbmUgVVNFUl9FTlZJUk9OTUVOVAkJMQorI2RlZmluZSBWSVJUVUFMX0VOVklST05NRU5UCQkyCisjZGVmaW5lIE9QRVJBVElOR19FTlZJUk9OTUVOVAkJMworCisjaWZuZGVmIFdJVEhfRU5WSVJPTk1FTlQKKyNkZWZpbmUgV0lUSF9FTlZJUk9OTUVOVAkJMAorI2VuZGlmCisKK2V4dGVybiBpbnQgY3VycmVudF9lbnZpcm9ubWVudDsKKyNkZWZpbmUgQ1VSUkVOVF9FTlZJUk9OTUVOVCAoV0lUSF9FTlZJUk9OTUVOVCBcCisJCQkgICAgID8gV0lUSF9FTlZJUk9OTUVOVCBcCisJCQkgICAgIDogY3VycmVudF9lbnZpcm9ubWVudCkKKworCisvKiBPcHRpb25hbCBWRUEvT0VBIGNvZGU6IAorCisgICBUaGUgYmVsb3csIHJlcXVpcmVkIGZvciB0aGUgT0VBIG1vZGVsIG1heSBhbHNvIGJlIGluY2x1ZGVkIGluIHRoZQorICAgVkVBIG1vZGVsIGhvd2V2ZXIsIGFzIGZhciBhcyBJIGNhbiB0ZWxsIG9ubHkgbWFrZSB0aGluZ3MKKyAgIHNsb3dlci4uLiAqLworCisKKy8qIEV2ZW50cy4gIERldmljZXMgbW9kZWxpbmcgcmVhbCBIL1cgbmVlZCB0byBiZSBhYmxlIHRvIGVmZmljaWVudGx5CisgICBzY2hlZHVsZSB0aGluZ3MgdG8gZG8gYXQga25vd24gdGltZXMgaW4gdGhlIGZ1dHVyZS4gIFRoZSBldmVudAorICAgcXVldWUgaW1wbGVtZW50cyB0aGlzLiAgVW5mb3J0dW5hdGx5IHRoaXMgYWRkcyB0aGUgbmVlZCB0byBjaGVjaworICAgZm9yIGFueSBldmVudHMgb25jZSBlYWNoIGZ1bGwgaW5zdHJ1Y3Rpb24gY3ljbGUuICovCisKKyNkZWZpbmUgV0lUSF9FVkVOVFMgICAgICAgICAgICAgICAgICAgICAoV0lUSF9FTlZJUk9OTUVOVCAhPSBVU0VSX0VOVklST05NRU5UKQorCisKKy8qIFRpbWUgYmFzZToKKworICAgVGhlIFBvd2VyUEMgYXJjaGl0ZWN0dXJlIGluY2x1ZGVzIHRoZSBhZGRpdGlvbiBvZiBib3RoIGEgdGltZSBiYXNlCisgICByZWdpc3RlciBhbmQgYSBkZWNyZW1lbnQgdGltZXIuICBMaWtlIGV2ZW50cyBhZGRzIHRvIHRoZSBvdmVyaGVhZAorICAgb2Ygb2Ygc29tZSBpbnN0cnVjdGlvbiBjeWNsZXMuICovCisKKyNpZm5kZWYgV0lUSF9USU1FX0JBU0UKKyNkZWZpbmUgV0lUSF9USU1FX0JBU0UJCQkoV0lUSF9FTlZJUk9OTUVOVCAhPSBVU0VSX0VOVklST05NRU5UKQorI2VuZGlmCisKKworLyogQ2FsbGJhY2svRGVmYXVsdCBNZW1vcnkuCisKKyAgIENvcmUgaW5jbHVkZXMgYSBidWlsdGluIG1lbW9yeSB0eXBlIChyYXdfbWVtb3J5KSB0aGF0IGlzCisgICBpbXBsZW1lbnRlZCB1c2luZyBhbiBhcnJheS4gIHJhd19tZW1vcnkgZG9lcyBub3QgcmVxdWlyZSBhbnkKKyAgIGFkZGl0aW9uYWwgZnVuY3Rpb25zIGV0Yy4KKworICAgQ2FsbGJhY2sgbWVtb3J5IGlzIHdoZXJlIHRoZSBjb3JlIGNhbGxzIGEgY29yZSBkZXZpY2UgZm9yIHRoZSBkYXRhCisgICBpdCByZXF1aXJlcy4KKworICAgRGVmYXVsdCBtZW1vcnkgaXMgYW4gZXh0ZW5zdGlvbiBvZiB0aGlzIHdoZXJlIGZvciBhZGRyZXNzZXMgdGhhdCBkbworICAgbm90IG1hcCBpbnRvIGVpdGhlciBhIGNhbGxiYWNrIG9yIGNvcmUgbWVtb3J5IHJhbmdlIGEgZGVmYXVsdCBtYXAKKyAgIGNhbiBiZSB1c2VkLgorCisgICBUaGUgT0VBIG1vZGVsIHVzZXMgY2FsbGJhY2sgbWVtb3J5IGZvciBkZXZpY2VzIGFuZCBkZWZhdWx0IG1lbW9yeQorICAgZm9yIGJ1c2VzLgorCisgICBUaGUgVkVBIG1vZGVsIHVzZXMgY2FsbGJhY2sgbWVtb3J5IHRvIGNhcHR1cmUgYHBhZ2UgZmF1bHRzJy4KKworICAgV2hpbGUgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIGVsaW1pbmF0ZSBjYWxsYmFjay9kZWZhdWx0IG1lbW9yeSAoYW5kCisgICBoZW5jZSBhbHNvIGVsaW1pbmF0ZSBhbiBhZGRpdGlvbmFsIHRlc3QgcGVyIG1lbW9yeSBmZXRjaCkgaXQKKyAgIHByb2JhYmx5IGlzIG5vdCB3b3J0aCB0aGUgZWZmb3J0LgorCisgICBCVFcsIHdoaWxlIHJhd19tZW1vcnkgY291bGQgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGFzIGEgY2FsbGJhY2ssCisgICBwcm9maWxpbmcgaGFzIHNob3duIHRoYXQgdGhlcmUgaXMgYSBiaWdlciB3aW4gKGF0IGxlYXN0IGZvciB0aGUKKyAgIHg4NikgaW4gZWxpbWluYXRpbmcgYSBmdW5jdGlvbiBjYWxsIGZvciB0aGUgbW9zdCBjb21tb24KKyAgIChyYXdfbWVtb3J5KSBjYXNlLiAqLworCisjZGVmaW5lIFdJVEhfQ0FMTEJBQ0tfTUVNT1JZCQkxCisKKworLyogQWxpZ25tZW50OgorCisgICBUaGUgUG93ZXJQQyBtYXkgb3IgbWF5IG5vdCBoYW5kbGUgbWlzcyBhbGlnbmVkIHRyYW5zZmVycy4gIEFuCisgICBpbXBsZW1lbnRhdGlvbiBub3JtYWxseSBoYW5kbGVzIG1pc3MgYWxpZ25lZCB0cmFuc2ZlcnMgaW4gYmlnCisgICBlbmRpYW4gbW9kZSBidXQgZ2VuZXJhdGVzIGFuIGV4Y2VwdGlvbiBpbiBsaXR0bGUgZW5kaWFuIG1vZGUuCisKKyAgIFRoaXMgbW9kZWwuICBJbnN0ZWFkIGFsbG93cyBib3RoIGxpdHRsZSBhbmQgYmlnIGVuZGlhbiBtb2RlcyB0bworICAgZWl0aGVyIHRha2UgZXhjZXB0aW9ucyBvciBoYW5kbGUgbWlzcyBhbGlnbmVkIHRyYW5zZmVycy4KKworICAgSWYgMCBpcyBzcGVjaWZpZWQgdGhlbiBmb3IgYmlnLWVuZGlhbiBtb2RlIG1pc3MgYWxsaWduZWQgYWNjZXNzZXMKKyAgIGFyZSBwZXJtaXR0ZWQgKE5PTlNUUklDVF9BTElHTk1FTlQpIHdoaWxlIGluIGxpdHRsZS1lbmRpYW4gbW9kZSB0aGUKKyAgIHByb2Nlc3NvciB3aWxsIGZhdWx0IG9uIHRoZW0gKFNUUklDVF9BTElHTk1FTlQpLiAqLworCisjZGVmaW5lIE5PTlNUUklDVF9BTElHTk1FTlQgICAgCQkxCisjZGVmaW5lIFNUUklDVF9BTElHTk1FTlQJICAgICAgIAkyCisKKyNpZm5kZWYgV0lUSF9BTElHTk1FTlQKKyNkZWZpbmUgV0lUSF9BTElHTk1FTlQgICAgIAkJMAorI2VuZGlmCisKK2V4dGVybiBpbnQgY3VycmVudF9hbGlnbm1lbnQ7CisjZGVmaW5lIENVUlJFTlRfQUxJR05NRU5UIChXSVRIX0FMSUdOTUVOVCBcCisJCQkgICA/IFdJVEhfQUxJR05NRU5UIFwKKwkJCSAgIDogY3VycmVudF9hbGlnbm1lbnQpCisKKworLyogRmxvYXRpbmcgcG9pbnQgc3Vwb3J0OgorCisgICBTdGlsbCB1bmRlciBkZXZlbG9wbWVudC4gKi8KKworI2RlZmluZSBTT0ZUX0ZMT0FUSU5HX1BPSU5UCQkxCisjZGVmaW5lIEhBUkRfRkxPQVRJTkdfUE9JTlQJCTIKKworI2lmbmRlZiBXSVRIX0ZMT0FUSU5HX1BPSU5UCisjZGVmaW5lIFdJVEhfRkxPQVRJTkdfUE9JTlQJCUhBUkRfRkxPQVRJTkdfUE9JTlQKKyNlbmRpZgorZXh0ZXJuIGludCBjdXJyZW50X2Zsb2F0aW5nX3BvaW50OworI2RlZmluZSBDVVJSRU5UX0ZMT0FUSU5HX1BPSU5UIChXSVRIX0ZMT0FUSU5HX1BPSU5UIFwKKwkJCQk/IFdJVEhfRkxPQVRJTkdfUE9JTlQgXAorCQkJCTogY3VycmVudF9mbG9hdGluZ19wb2ludCkKKworCisvKiBEZWJ1Z2dpbmc6CisKKyAgIENvbnRyb2wgdGhlIGluY2x1c2lvbiBvZiBkZWJ1Z2dpbmcgY29kZS4gKi8KKworLyogSW5jbHVkZSB0aGUgdHJhY2luZyBjb2RlLiAgRGlzYWJsaW5nIHRoaXMgZWxpbWluYXRlcyBhbGwgdHJhY2luZworICAgY29kZSAqLworCisjaWZuZGVmIFdJVEhfVFJBQ0UKKyNkZWZpbmUgV0lUSF9UUkFDRSAgICAgICAgICAgICAgICAgICAgICAxCisjZW5kaWYKKworLyogaW5jbHVkZSBjb2RlIHRoYXQgY2hlY2tzIGFzc2VydGlvbnMgc2NhdHRlcmVkIHRocm91Z2ggb3V0IHRoZQorICAgcHJvZ3JhbSAqLworCisjaWZuZGVmIFdJVEhfQVNTRVJUCisjZGVmaW5lIFdJVEhfQVNTRVJUCQkJMQorI2VuZGlmCisKKy8qIFdoZXRoZXIgdG8gY2hlY2sgaW5zdHJ1Y3Rpb25zIGZvciByZXNlcnZlZCBiaXRzIGJlaW5nIHNldCAqLworCisjaWZuZGVmIFdJVEhfUkVTRVJWRURfQklUUworI2RlZmluZSBXSVRIX1JFU0VSVkVEX0JJVFMJCTEKKyNlbmRpZgorCisvKiBpbmNsdWRlIG1vbml0b3JpbmcgY29kZSAqLworCisjZGVmaW5lIE1PTklUT1JfSU5TVFJVQ1RJT05fSVNTVUUJMQorI2RlZmluZSBNT05JVE9SX0xPQURfU1RPUkVfVU5JVAkJMgorI2lmbmRlZiBXSVRIX01PTgorI2RlZmluZSBXSVRIX01PTgkJCShNT05JVE9SX0xPQURfU1RPUkVfVU5JVCBcCisJCQkJCSB8IE1PTklUT1JfSU5TVFJVQ1RJT05fSVNTVUUpCisjZW5kaWYKKworLyogQ3VycmVudCBDUFUgbW9kZWwgKG1vZGVscyBhcmUgaW4gdGhlIGdlbmVyYXRlZCBtb2RlbHMuaCBpbmNsdWRlIGZpbGUpICAqLworI2lmbmRlZiBXSVRIX01PREVMCisjZGVmaW5lIFdJVEhfTU9ERUwJCQkwCisjZW5kaWYKKworI2RlZmluZSBDVVJSRU5UX01PREVMIChXSVRIX01PREVMCVwKKwkJICAgICAgID8gV0lUSF9NT0RFTAlcCisJCSAgICAgICA6IGN1cnJlbnRfbW9kZWwpCisKKyNpZm5kZWYgV0lUSF9ERUZBVUxUX01PREVMCisjZGVmaW5lIFdJVEhfREVGQVVMVF9NT0RFTAkJREVGQVVMVF9NT0RFTAorI2VuZGlmCisKKyNkZWZpbmUgTU9ERUxfSVNTVUVfSUdOT1JFCQkoLTEpCisjZGVmaW5lIE1PREVMX0lTU1VFX1BST0NFU1MJCTEKKworI2lmbmRlZiBXSVRIX01PREVMX0lTU1VFCisjZGVmaW5lIFdJVEhfTU9ERUxfSVNTVUUJCTAKKyNlbmRpZgorCitleHRlcm4gaW50IGN1cnJlbnRfbW9kZWxfaXNzdWU7CisjZGVmaW5lIENVUlJFTlRfTU9ERUxfSVNTVUUgKFdJVEhfTU9ERUxfSVNTVUUJXAorCQkJICAgICA/IFdJVEhfTU9ERUxfSVNTVUUJXAorCQkJICAgICA6IGN1cnJlbnRfbW9kZWxfaXNzdWUpCisKKy8qIFdoZXRoZXIgb3Igbm90IGlucHV0L291dHB1dCBqdXN0IHVzZXMgc3RkaW8sIG9yIHVzZXMgcHJpbnRmX2ZpbHRlcmVkIGZvcgorICAgb3V0cHV0LCBhbmQgcG9sbGluZyBpbnB1dCBmb3IgaW5wdXQuICAqLworCisjZGVmaW5lIERPTlRfVVNFX1NURElPCQkJMgorI2RlZmluZSBET19VU0VfU1RESU8JCQkxCisKKyNpZm5kZWYgV0lUSF9TVERJTworI2RlZmluZSBXSVRIX1NURElPCQkJMAorI2VuZGlmCisKK2V4dGVybiBpbnQgY3VycmVudF9zdGRpbzsKKyNkZWZpbmUgQ1VSUkVOVF9TVERJTyAoV0lUSF9TVERJTwlcCisJCSAgICAgICA/IFdJVEhfU1RESU8gICAgIFwKKwkJICAgICAgIDogY3VycmVudF9zdGRpbykKKworCisKKy8qIElOTElORSBDT0RFIFNFTEVDVElPTjoKKworICAgR0NDIC1PMyBhdHRlbXB0cyB0byBpbmxpbmUgYW55IGZ1bmN0aW9uIG9yIHByb2NlZHVyZSBpbiBzY29wZS4gIFRoZQorICAgb3B0aW9ucyBiZWxvdyBmYWNpbGl0YXRlIGZpbmUgZ3JhaW5lZCBjb250cm9sIG92ZXIgd2hhdCBpcyBhbmQgd2hhdAorICAgaXNuJ3QgbWFkZSBpbmxpbmUuICBGb3IgaW5zdGFuY2UgaXQgY2FuIGNvbnRyb2wgdGhpbmdzIGRvd24gdG8gYQorICAgc3BlY2lmaWMgbW9kdWxlcyBzdGF0aWMgcm91dGluZXMuICBEb2luZyB0aGlzIGFsbG93cyB0aGUgY29tcGlsZXIKKyAgIHRvIGJvdGggZWxpbWluYXRlIHRoZSBvdmVyaGVhZCBvZiBmdW5jdGlvbiBjYWxscyBhbmQgKGFzIGEKKyAgIGNvbnNlcXVlbmNlKSBhbHNvIGVsaW1pbmF0ZSBmdXJ0aGVyIGRlYWQgY29kZS4KKworICAgT24gYSBDSVNDICh4ODYpIEkndmUgZm91bmQgdGhhdCBJIGNhbiBhY2hpZXZlIGFuIG9yZGVyIG9mIG1hZ2ludHVkZQorICAgc3BlZWQgaW1wcm92ZW1lbnQgKHgzLXg1KS4gIEluIHRoZSBjYXNlIG9mIFJJU0MgKHNwYXJjKSB3aGlsZSB0aGUKKyAgIHBlcmZvcm1hbmNlIGdhaW4gaXNuJ3QgYXMgZ3JlYXQgaXQgaXMgc3RpbGwgc2lnbmlmaWNhbnQuCisKKyAgIEVhY2ggbW9kdWxlIGlzIGNvbnRyb2xlZCBieSB0aGUgbWFjcm8gPG1vZHVsZT5fSU5MSU5FIHdoaWNoIGNhbgorICAgaGF2ZSB0aGUgdmFsdWVzIGRlc2NyaWJlZCBiZWxvdworCisgICAgICAgMCAgRG8gbm90IGlubGluZSBhbnkgdGhpbmcgZm9yIHRoZSBnaXZlbiBtb2R1bGUKKworICAgVGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHZhbHVlcyBhcmUgYGJpdCBmaWVsZHMnIGFuZCBjYW4gYmUKKyAgIGNvbWJpbmVkLgorCisgICAgICBSRVZFQUxfTU9EVUxFOgorCisgICAgICAgICBJbmNsdWRlIHRoZSBDIGZpbGUgZm9yIHRoZSBtb2R1bGUgaW50byB0aGUgZmlsZSBiZWluZyBjb21waWxlZAorICAgICAgICAgYnV0IGRvIG5vdCBtYWtlIHRoZSBmdW5jdGlvbnMgd2l0aGluIHRoZSBtb2R1bGUgaW5saW5lLgorCisJIFdoaWxlIG9mIG5vIGFwcGFyZW50IGJlbmVmaXQsIHRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIHRoZQorCSBpbmNsdWRlZCBtb2R1bGUsIHdoZW4gY29tcGlsZWQgdG8gaW5saW5lIGl0cyBjYWxscyB0byB3aGF0CisJIHdvdWxkIG90aGVyd2l6ZSBiZSBleHRlcm5hbCBmdW5jdGlvbnMuCisKKyAgICAgIElOTElORV9NT0RVTEU6CisKKyAgICAgICAgIE1ha2UgZXh0ZXJuYWwgZnVuY3Rpb25zIHdpdGhpbiB0aGUgbW9kdWxlIGBpbmxpbmUnLiAgVGh1cyBpZgorICAgICAgICAgdGhlIG1vZHVsZSBpcyBpbmNsdWRlZCBpbnRvIGEgZmlsZSBiZWluZyBjb21waWxlZCwgY2FsbHMgdG8KKwkgaXRzIGZ1bnRpb25zIGNhbiBiZSBlbGltaW5hdGVkLiAyIGltcGxpZXMgMS4KKworICAgICAgSU5MSU5FX0xPQ0FMUzoKKworICAgICAgICAgTWFrZSBpbnRlcm5hbCAoc3RhdGljKSBmdW5jdGlvbnMgd2l0aGluIHRoZSBtb2R1bGUgYGlubGluZScuCisKKyAgIFRoZSBmb2xsb3dpbmcgYWJyZXZpYXRpb25zIGFyZSBhdmFpbGFibGU6CisKKyAgICAgIElOQ0xVREVfTU9EVUxFID09IChSRVZFQUxfTU9EVUxFIHwgSU5MSU5FX01PRFVMRSkKKworICAgICAgQUxMX0lOTElORSA9PSAoUkVWRUFMX01PRFVMRSB8IElOTElORV9NT0RVTEUgfCBJTkxJTkVfTE9DQUxTKQorCisgICBJbiBhZGRpdGlvbiB0byB0aGlzLCBtb2R1bGVzIGhhdmUgYmVlbiBwdXQgaW50byB0d28gY2F0ZWdvcmllcy4KKworICAgICAgICAgU2ltcGxlIG1vZHVsZXMgLSBlZyBzaW0tZW5kaWFuLmggYml0cy5oCisKKwkgQmVjYXVzZSB0aGVzZSBtb2R1bGVzIGFyZSBzbWFsbCBhbmQgc2ltcGxlIGFuZCBkbyBub3QgaGF2ZQorCSBhbnkgY29tcGxleCBpbnRlcnBlbmRlbmNpZXMgdGhleSBhcmUgY29uZmlndXJlZCwgaWYKKwkgPG1vZHVsZT5fSU5MSU5FIGlzIHNvIGVuYWJsZWQsIHRvIGlubGluZSB0aGVtc2VsdmVzIGluIGFsbAorCSBtb2R1bGVzIHRoYXQgaW5jbHVkZSB0aG9zZSBmaWxlcy4KKworCSBGb3IgdGhlIGRlZmF1bHQgYnVpbGQsIHRoaXMgaXMgYSByZWFsIHdpbiBhcyBhbGwgYnl0ZQorCSBjb252ZXJzaW9uIGFuZCBiaXQgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyBhcmUgaW5saW5lZC4KKworCSBDb21wbGV4IG1vZHVsZXMgLSB0aGUgcmVzdAorCisJIFRoZXNlIGFyZSBhbGwgaGFuZGxlZCB1c2luZyB0aGUgZmlsZXMgaW5saW5lLmggYW5kIGlubGluZS5jLgorCSBwc2ltLmMgaW5jbHVkZXMgdGhlIGFib3ZlIHdoaWNoIGluIHR1cm4gaW5jbHVkZSBhbnkgcmVtYWluaW5nCisJIGNvZGUuCisKKyAgIElNUExFTUVOVEFUSU9OOgorCisgICBUaGUgaW5saW5lIGFiaWxpdHkgaXMgZW5hYmxlZCBieSBwcmVmaXhpbmcgZXZlcnkgZGF0YSAvIGZ1bmN0aW9uCisgICBkZWNsYXJhdGlvbiBhbmQgZGVmaW5pdGlvbiB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisKKyAgICAgICBJTkxJTkVfPG1vZHVsZT4KKworICAgICAgIFByZWZpeCB0byBhbnkgZ2xvYmFsIGZ1bmN0aW9uIHRoYXQgaXMgYSBjYW5kaWRhdGUgZm9yIGJlaW5nCisgICAgICAgaW5saW5lLgorCisgICAgICAgdmFsdWVzIC0gYCcsIGBzdGF0aWMnLCBgc3RhdGljIElOTElORScKKworCisgICAgICAgRVhURVJOXzxtb2R1bGU+CisgICAgICAKKyAgICAgICBQcmVmaXggdG8gYW55IGdsb2JhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSBtb2R1bGUuICBHbG9iYWwKKyAgICAgICBmdW5jdGlvbnMgdGhhdCBhcmUgbm90IHRvIGJlIGlubGluZWQgc2hhbGwgYWxzbyBiZSBwcmVmaXhlZAorICAgICAgIHdpdGggdGhpcy4KKworICAgICAgIHZhbHVlcyAtIGAnLCBgc3RhdGljJywgYHN0YXRpYycKKworCisgICAgICAgU1RBVElDX0lOTElORV88bW9kdWxlPgorCisgICAgICAgUHJlZml4IHRvIGFueSBsb2NhbCAoc3RhdGljKSBmdW5jdGlvbiB0aGF0IGlzIGEgY2FuZGlkYXRlIGZvcgorICAgICAgIGJlaW5nIG1hZGUgaW5saW5lLgorCisgICAgICAgdmFsdWVzIC0gYHN0YXRpYycsIGBzdGF0aWMgSU5MSU5FJworCisKKyAgICAgICBzdGF0aWMKKworICAgICAgIFByZWZpeCBhbGwgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzLiAgTG9jYWwgZnVuY3Rpb25zIHRoYXQgYXJlIG5vdAorICAgICAgIHRvIGJlIGlubGluZWQgc2hhbGwgYWxzbyBiZSBwcmVmaXhlZCB3aXRoIHRoaXMuCisKKyAgICAgICB2YWx1ZXMgLSBgc3RhdGljJywgYHN0YXRpYycKKworICAgICAgIG5iOiB3aWxsIG5vdCB3b3JrIGZvciBtb2R1bGVzIHRoYXQgYXJlIGJlaW5nIGlubGluZWQgZm9yIGV2ZXJ5CisgICAgICAgdXNlICh3aGl0ZSBsaWUpLgorCisKKyAgICAgICBleHRlcm4KKyAgICAgICAjaWZuZGVmIF9JTkxJTkVfQ18KKyAgICAgICAjZW5kaWYKKyAgICAgICAKKyAgICAgICBQcmVmaXggdG8gYW55IGRlY2xhcmF0aW9uIG9mIGEgZ2xvYmFsIG9iamVjdCAoZnVuY3Rpb24gb3IKKyAgICAgICB2YXJpYWJsZSkgdGhhdCBzaG91bGQgbm90IGJlIGlubGluZWQgYW5kIHNob3VsZCBoYXZlIG9ubHkgb25lCisgICAgICAgZGVmaW5pdGlvbi4gIFRoZSAjaWZuZGVmIHdyYXBwZXIgZ29lcyBhcm91bmQgdGhlIGRlZmluaXRpb24KKyAgICAgICBwcm9wcGVyIHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIGNvcHkgaXMgZ2VuZXJhdGVkLgorCisgICAgICAgbmI6IHRoaXMgd2lsbCBub3Qgd29yayB3aGVuIGEgbW9kdWxlIGlzIGJlaW5nIGlubGluZWQgZm9yIGV2ZXJ5CisgICAgICAgdXNlLgorCisKKyAgICAgICBTVEFUSUNfPG1vZHVsZT4KKworICAgICAgIFJlcGxhY2VkIGJ5IGVpdGhlciBgc3RhdGljJyBvciBgRVhURVJOX01PRFVMRScuCisKKworICAgUkVBTElUWSBDSEVDSzoKKworICAgVGhpcyBpcyBub3QgZm9yIHRoZSBmYWludCBoZWFydGVkLiAgSSd2ZSBzZWVuIEdDQyBnZXQgdXAgdG8gNTAwbWIKKyAgIHRyeWluZyB0byBjb21waWxlIHdoYXQgdGhpcyBjYW4gY3JlYXRlLgorCisgICBTb21lIG9mIHRoZSBtb2R1bGVzIGRvIG5vdCB5ZXQgaW1wbGVtZW50IHRoZSBXSVRIX0lOTElORV9TVEFUSUMKKyAgIG9wdGlvbi4gIEluc3RlYWQgdGhleSB1c2UgdGhlIG1hY3JvIFNUQVRJQ19JTkxJTkUgdG8gY29udHJvbCB0aGVpcgorICAgbG9jYWwgZnVuY3Rpb24uCisKKyAgIEJlY2F1c2Ugb2YgdGhlIHdheSB0aGF0IEdDQyBwYXJzZXMgX19hdHRyaWJ1dGVfXygpLCB0aGUgbWFjcm8ncworICAgbmVlZCB0byBiZSBhZGphY2VudCB0byB0aGUgZnVuY3Rpb2luIG5hbWUgcmF0aGVyIHRoZW4gYXQgdGhlIHN0YXJ0CisgICBvZiB0aGUgbGluZSB2aXM6CisKKyAgIAlpbnQgU1RBVElDX0lOTElORV9NT0RVTEUgZih2b2lkKTsKKwl2b2lkIElOTElORV9NT0RVTEUgKmcodm9pZCk7CisKKyAgICovCisKKyNkZWZpbmUgUkVWRUFMX01PRFVMRQkJCTEKKyNkZWZpbmUgSU5MSU5FX01PRFVMRQkJCTIKKyNkZWZpbmUgSU5DTFVERV9NT0RVTEUJCQkoSU5MSU5FX01PRFVMRSB8IFJFVkVBTF9NT0RVTEUpCisjZGVmaW5lIElOTElORV9MT0NBTFMJCQk0CisjZGVmaW5lIEFMTF9JTkxJTkUJCQk3CisKKy8qIFlvdXIgY29tcGlsZXJzIGlubGluZSByZXNlcnZlZCB3b3JkICovCisKKyNpZm5kZWYgSU5MSU5FCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX09QVElNSVpFX18pCisjZGVmaW5lIElOTElORSBfX2lubGluZV9fCisjZWxzZQorI2RlZmluZSBJTkxJTkUgLyppbmxpbmUqLworI2VuZGlmCisjZW5kaWYKKworCisvKiBZb3VyIGNvbXBpbGVycyBwYXNzIHBhcmFtZXRlcnMgaW4gcmVnaXN0ZXJzIHJlc2VydmVkIHdvcmQgKi8KKworI2lmbmRlZiBXSVRIX1JFR1BBUk0KKyNkZWZpbmUgV0lUSF9SRUdQQVJNICAgICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKiBZb3VyIGNvbXBpbGVycyB1c2UgYW4gYWx0ZXJuYXRpdmUgY2FsbGluZyBzZXF1ZW5jZSByZXNlcnZlZCB3b3JkICovCisKKyNpZm5kZWYgV0lUSF9TVERDQUxMCisjZGVmaW5lIFdJVEhfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworI2lmICFkZWZpbmVkIFJFR1BBUk0KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2k0ODZfXykgfHwgZGVmaW5lZChfX2k1ODZfXykgfHwgZGVmaW5lZChfX2k2ODZfXykpCisjaWYgKFdJVEhfUkVHUEFSTSAmJiBXSVRIX1NURENBTEwpCisjZGVmaW5lIFJFR1BBUk0gX19hdHRyaWJ1dGVfXygoX19yZWdwYXJtX18oV0lUSF9SRUdQQVJNKSxfX3N0ZGNhbGxfXykpCisjZWxzZQorI2lmIChXSVRIX1JFR1BBUk0gJiYgIVdJVEhfU1REQ0FMTCkKKyNkZWZpbmUgUkVHUEFSTSBfX2F0dHJpYnV0ZV9fKChfX3JlZ3Bhcm1fXyhXSVRIX1JFR1BBUk0pKSkKKyNlbHNlCisjaWYgKCFXSVRIX1JFR1BBUk0gJiYgV0lUSF9TVERDQUxMKQorI2RlZmluZSBSRUdQQVJNIF9fYXR0cmlidXRlX18oKF9fc3RkY2FsbF9fKSkKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCBSRUdQQVJNCisjZGVmaW5lIFJFR1BBUk0KKyNlbmRpZgorCisKKworLyogRGVmYXVsdCBwcmVmaXggZm9yIHN0YXRpYyBmdW5jdGlvbnMgKi8KKworI2lmbmRlZiBTVEFUSUNfSU5MSU5FCisjZGVmaW5lIFNUQVRJQ19JTkxJTkUgc3RhdGljIElOTElORQorI2VuZGlmCisKKy8qIERlZmF1bHQgbWFjcm8gdG8gc2ltcGxpZnkgY29udHJvbCBzZXZlcmFsIG9mIGtleSB0aGUgaW5saW5lcyAqLworCisjaWZuZGVmIERFRkFVTFRfSU5MSU5FCisjZGVmaW5lCURFRkFVTFRfSU5MSU5FCQkJSU5MSU5FX0xPQ0FMUworI2VuZGlmCisKKy8qIENvZGUgdGhhdCBjb252ZXJ0cyBiZXR3ZWVuIGhvc3RzIGFuZCB0YXJnZXQgYnl0ZSBvcmRlci4gIFVzZWQgb24KKyAgIGV2ZXJ5IG1lbW9yeSBhY2Nlc3MgKGluc3RydWN0aW9uIGFuZCBkYXRhKS4gIFNlZSBzaW0tZW5kaWFuLmggZm9yCisgICBhZGRpdGlvbmFsIGJ5dGUgc3dhcHBpbmcgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gIFRoaXMgbW9kdWxlCisgICBjYW4gaW5saW5lIGZvciBhbGwgY2FsbGVycyAqLworCisjaWZuZGVmIFNJTV9FTkRJQU5fSU5MSU5FCisjZGVmaW5lIFNJTV9FTkRJQU5fSU5MSU5FCQkoREVGQVVMVF9JTkxJTkUgPyBBTExfSU5MSU5FIDogMCkKKyNlbmRpZgorCisvKiBMb3cgbGV2ZWwgYml0IG1hbmlwdWxhdGlvbiByb3V0aW5lcy4gVGhpcyBtb2R1bGUgY2FuIGlubGluZSBmb3IgYWxsCisgICBjYWxsZXJzICovCisKKyNpZm5kZWYgQklUU19JTkxJTkUKKyNkZWZpbmUgQklUU19JTkxJTkUJCQkoREVGQVVMVF9JTkxJTkUgPyBBTExfSU5MSU5FIDogMCkKKyNlbmRpZgorCisvKiBDb2RlIHRoYXQgZ2l2ZXMgYWNjZXNzIHRvIHZhcmlvdXMgQ1BVIGludGVybmFscyBzdWNoIGFzIHJlZ2lzdGVycy4KKyAgIFVzZWQgZXZlcnkgdGltZSBhbiBpbnN0cnVjdGlvbiBpcyBleGVjdXRlZCAqLworCisjaWZuZGVmIENQVV9JTkxJTkUKKyNkZWZpbmUgQ1BVX0lOTElORQkJCShERUZBVUxUX0lOTElORSA/IEFMTF9JTkxJTkUgOiAwKQorI2VuZGlmCisKKy8qIENvZGUgdGhhdCB0cmFuc2xhdGVzIGJldHdlZW4gYW4gZWZmZWN0aXZlIGFuZCByZWFsIGFkZHJlc3MuICBVc2VkCisgICBieSBldmVyeSBsb2FkIG9yIHN0b3JlLiAqLworCisjaWZuZGVmIFZNX0lOTElORQorI2RlZmluZSBWTV9JTkxJTkUJCQlERUZBVUxUX0lOTElORQorI2VuZGlmCisKKy8qIENvZGUgdGhhdCBsb2Fkcy9zdG9yZXMgZGF0YSB0by9mcm9tIHRoZSBtZW1vcnkgZGF0YSBzdHJ1Y3R1cmUuCisgICBVc2VkIGJ5IGV2ZXJ5IGxvYWQgb3Igc3RvcmUgKi8KKworI2lmbmRlZiBDT1JFX0lOTElORQorI2RlZmluZSBDT1JFX0lOTElORQkJCURFRkFVTFRfSU5MSU5FCisjZW5kaWYKKworLyogQ29kZSB0byBjaGVjayBmb3IgYW5kIHByb2Nlc3MgYW55IGV2ZW50cyBzY2hlZHVsZWQgaW4gdGhlIGZ1dHVyZS4KKyAgIENhbGxlZCBvbmNlIHBlciBpbnN0cnVjdGlvbiBjeWNsZSAqLworCisjaWZuZGVmIEVWRU5UU19JTkxJTkUKKyNkZWZpbmUgRVZFTlRTX0lOTElORQkJCShERUZBVUxUX0lOTElORSA/IEFMTF9JTkxJTkUgOiAwKQorI2VuZGlmCisKKy8qIENvZGUgbW9ub3RvcmluZyB0aGUgcHJvY2Vzc29ycyBwZXJmb3JtYW5jZS4gIEl0IGNvdW50cyBldmVudHMgb24KKyAgIGV2ZXJ5IGluc3RydWN0aW9uIGN5Y2xlICovCisKKyNpZm5kZWYgTU9OX0lOTElORQorI2RlZmluZSBNT05fSU5MSU5FCQkJKERFRkFVTFRfSU5MSU5FID8gQUxMX0lOTElORSA6IDApCisjZW5kaWYKKworLyogQ29kZSBjYWxsZWQgb24gdGhlIHJhcmUgb2NjYXNpb25zIHRoYXQgYW4gaW50ZXJydXB0IG9jY3VyZXMuICovCisKKyNpZm5kZWYgSU5URVJSVVBUU19JTkxJTkUKKyNkZWZpbmUgSU5URVJSVVBUU19JTkxJTkUJCURFRkFVTFRfSU5MSU5FCisjZW5kaWYKKworLyogQ29kZSBjYWxsZWQgb24gdGhlIHJhcmUgb2NjYXNpb24gdGhhdCBlaXRoZXIgZ2RiIG9yIHRoZSBkZXZpY2UgdHJlZQorICAgbmVlZCB0byBtYW5pcHVsYXRlIGEgcmVnaXN0ZXIgd2l0aGluIGEgcHJvY2Vzc29yICovCisKKyNpZm5kZWYgUkVHSVNURVJTX0lOTElORQorI2RlZmluZSBSRUdJU1RFUlNfSU5MSU5FCQlERUZBVUxUX0lOTElORQorI2VuZGlmCisKKy8qIENvZGUgY2FsbGVkIG9uIHRoZSByYXJlIG9jY2FzaW9uIHRoYXQgYSBwcm9jZXNzb3IgaXMgbWFuaXB1bGF0aW5nCisgICByZWFsIGhhcmR3YXJlIGluc3RlYWQgb2YgUkFNLgorCisgICBBbHNvLCBtb3N0IG9mIHRoZSBmdW5jdGlvbnMgaW4gZGV2aWNlcy5jIGFyZSBhbHdheXMgY2FsbGVkIHRocm91Z2gKKyAgIGEganVtcCB0YWJsZS4gKi8KKworI2lmbmRlZiBERVZJQ0VfSU5MSU5FCisjZGVmaW5lIERFVklDRV9JTkxJTkUJCQkoREVGQVVMVF9JTkxJTkUgPyBJTkxJTkVfTE9DQUxTIDogMCkKKyNlbmRpZgorCisvKiBDb2RlIGNhbGxlZCB1c2VkIHdoaWxlIHRoZSBkZXZpY2UgdHJlZSBpcyBiZWluZyBidWlsdC4KKworICAgSW5saW5pbmcgdGhpcyBpcyBvZiBubyBiZW5lZml0ICovCisKKyNpZm5kZWYgVFJFRV9JTkxJTkUKKyNkZWZpbmUgVFJFRV9JTkxJTkUJCQkoREVGQVVMVF9JTkxJTkUgPyBJTkxJTkVfTE9DQUxTIDogMCkKKyNlbmRpZgorCisvKiBDb2RlIGNhbGxlZCB3aGVuZXZlciBpbmZvcm1hdGlvbiBvbiBhIFNwZWNpYWwgUHVycG9zZSBSZWdpc3RlciBpcworICAgcmVxdWlyZWQuICBDYWxsZWQgYnkgdGhlIG1mbHIvbXRsciBwc2V1ZG8gaW5zdHJ1Y3Rpb25zICovCisKKyNpZm5kZWYgU1BSRUdfSU5MSU5FCisjZGVmaW5lIFNQUkVHX0lOTElORQkJCURFRkFVTFRfSU5MSU5FCisjZW5kaWYKKworLyogRnVuY3Rpb25zIG1vZGVsaW5nIHRoZSBzZW1hbnRpY3Mgb2YgZWFjaCBpbnN0cnVjdGlvbi4gIFR3byBjYXNlcyB0bworICAgY29uc2lkZXIsIGZpcnN0bHkgb2YgaWRlY29kZSBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgc3dpdGNoIHRoZW4gdGhpcworICAgYWxsb3dzIHRoZSBpZGVjb2RlIGZ1bmN0aW9uIHRvIGlubGluZSBlYWNoIHNlbWFudGljIGZ1bmN0aW9uCisgICAoYXZvaWRpbmcgYSBjYWxsKS4gIFRoZSBzZWNvbmQgY2FzZSBpcyB3aGVuIGlkZWNvZGUgaXMgdXNpbmcgYQorICAgdGFibGUsIGV2ZW4gdGhlbiB3aGlsZSB0aGUgc2VtYW50aWMgZnVuY3Rpb25zIGNhbid0IGJlIGlubGluZWQsCisgICBzZXR0aW5nIGl0IHRvIG9uZSBzdGlsbCBlbmFibGVzIGVhY2ggc2VtYW50aWMgZnVuY3Rpb24gdG8gaW5saW5lCisgICBhbnl0aGluZyB0aGV5IGNhbGwgKGlmIHRoYXQgY29kZSBpcyBtYXJrZWQgZm9yIGJlaW5nIGlubGluZWQpLgorCisgICBXQVJOSU5HOiB5b3UgbmVlZCBsb3RzIChsaWtlIDIwMG1iIG9mIHN3YXApIG9mIHN3YXAuICBTZXR0aW5nIHRoaXMKKyAgIHRvIDEgaXMgdXNlZnVsIHdoZW4gdXNpbmcgYSB0YWJsZSBhcyBpdCBlbmFibGVzIHRoZSBzZW1hdGljIGNvZGUgdG8KKyAgIGlubGluZSBhbGwgb2YgdGhlaXIgY2FsbGVkIGZ1bmN0aW9ucyAqLworCisjaWZuZGVmIFNFTUFOVElDU19JTkxJTkUKKyNkZWZpbmUgU0VNQU5USUNTX0lOTElORQkJKERFRkFVTFRfSU5MSU5FICYgfklOTElORV9NT0RVTEUpCisjZW5kaWYKKworLyogV2hlbiB1c2luZyB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUsIGNvZGUgdG8gZGVjb2RlIGFuIGluc3RydWN0aW9uIGFuZAorICAgaW5zdGFsbCBpdCBpbnRvIHRoZSBjYWNoZS4gIE5vcm1hbGx5IGNhbGxlZCB3aGVuIGV2ZXIgdGhlcmUgaXMgYQorICAgbWlzcyBpbiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUuICovCisKKyNpZm5kZWYgSUNBQ0hFX0lOTElORQorI2RlZmluZSBJQ0FDSEVfSU5MSU5FCQkJKERFRkFVTFRfSU5MSU5FICYgfklOTElORV9NT0RVTEUpCisjZW5kaWYKKworLyogR2VuZXJhbCBmdW5jdGlvbnMgY2FsbGVkIGJ5IHNlbWFudGljcyBmdW5jdGlvbnMgYnV0IHBhcnQgb2YgdGhlCisgICBpbnN0cnVjdGlvbiB0YWJsZS4gIEFsdGhvdWdoIGNhbGxlZCBieSB0aGUgc2VtYW50aWMgZnVuY3Rpb25zIHRoZQorICAgZnJlcXVlbmN5IG9mIGNhbGxzIGlzIGxvdy4gIENvbnNlcXVlbnRseSB0aGUgbmVlZCB0byBpbmxpbmUgdGhpcworICAgY29kZSBpcyByZWR1Y2VkLiAqLworCisjaWZuZGVmIFNVUFBPUlRfSU5MSU5FCisjZGVmaW5lIFNVUFBPUlRfSU5MSU5FCQkJSU5MSU5FX0xPQ0FMUworI2VuZGlmCisKKy8qIE1vZGVsIHNwZWNpZmljIGNvZGUgdXNlZCBpbiBzaW11bGF0aW5nIGZ1bmN0aW9uYWwgdW5pdHMuICBOb3RlLCBpdCBhY3RhdWxseQorICAgcGF5cyBOT1QgdG8gaW5saW5lIHRoZSBQb3dlclBDIG1vZGVsIGZ1bmN0aW9ucyAoYXQgbGVhc3Qgb24gdGhlIHg4NikuICBUaGlzCisgICBpcyBiZWNhdXNlIGlmIGl0IGlzIGlubGluZWQsIGVhY2ggUG93ZXJQQyBpbnN0cnVjdGlvbiBnZXRzIGEgc2VwYXJhdGUgY29weQorICAgb2YgdGhlIGNvZGUsIHdoaWNoIGlzIG5vdCBmcmllbmRseSB0byB0aGUgY2FjaGUuICAqLworCisjaWZuZGVmIE1PREVMX0lOTElORQorI2RlZmluZQlNT0RFTF9JTkxJTkUJCQkoREVGQVVMVF9JTkxJTkUgJiB+SU5MSU5FX01PRFVMRSkKKyNlbmRpZgorCisvKiBDb2RlIHRvIHByaW50IG91dCB3aGF0IG9wdGlvbnMgd2Ugd2VyZSBjb21waWxlZCB3aXRoLiAgQmVjYXVzZSB0aGlzCisgICBpcyBjYWxsZWQgYXQgcHJvY2VzcyBzdGFydHVwLCBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgaW5saW5lZCwgYnV0CisgICBpZiBpdCBpc24ndCBicm91Z2h0IGluIGFuZCB0aGUgbW9kZWwgcm91dGluZXMgYXJlIGlubGluZSwgdGhlIG1vZGVsCisgICByb3V0aW5lcyB3aWxsIGJlIHB1bGxlZCBpbiB0d2ljZS4gICovCisKKyNpZm5kZWYgT1BUSU9OU19JTkxJTkUKKyNkZWZpbmUgT1BUSU9OU19JTkxJTkUJCQlNT0RFTF9JTkxJTkUKKyNlbmRpZgorCisvKiBpZGVjb2RlIGFjdHMgYXMgdGhlIGh1YiBvZiB0aGUgc3lzdGVtLCBldmVyeXRoaW5nIGVsc2UgaXMgaW1wb3J0ZWQKKyAgIGludG8gdGhpcyBmaWxlICovCisKKyNpZm5kZWYgSURFQ09DRV9JTkxJTkUKKyNkZWZpbmUgSURFQ09ERV9JTkxJTkUJCQlJTkxJTkVfTE9DQUxTCisjZW5kaWYKKworLyogcHNpbSwgaXNuJ3QgYWN0dWFsbHkgaW5saW5lZCAqLworCisjaWZuZGVmIFBTSU1fSU5MSU5FCisjZGVmaW5lIFBTSU1fSU5MSU5FCQkJSU5MSU5FX0xPQ0FMUworI2VuZGlmCisKKy8qIENvZGUgdG8gZW11bGF0ZSBvcyBvciByb20gY29tcGF0aWJpbGl0eS4gIFRoaXMgY29kZSBpcyBjYWxsZWQgdmlhIGEKKyAgIHRhYmxlIGFuZCBoZW5jZSB0aGVyZSBpcyBsaXR0bGUgYmVuZWZpdCBpbiBtYWtpbmcgaXQgaW5saW5lICovCisKKyNpZm5kZWYgT1NfRU1VTF9JTkxJTkUKKyNkZWZpbmUgT1NfRU1VTF9JTkxJTkUJCQkwCisjZW5kaWYKKworI2VuZGlmIC8qIF9QU0lNX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL3RhYmxlLmMgYi9zaW0vcHBjL3RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk5NGQwZAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvdGFibGUuYwpAQCAtMCwwICsxLDI3OSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NSwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAibGYuaCIKKyNpbmNsdWRlICJ0YWJsZS5oIgorCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworc3RydWN0IF90YWJsZSB7CisgIHNpemVfdCBzaXplOworICBjaGFyICpidWZmZXI7CisgIGNoYXIgKnBvczsKKyAgaW50IGxpbmVfbnI7CisgIGludCBucl9maWVsZHM7CisgIGludCBucl9tb2RlbF9maWVsZHM7CisgIGNoYXIgKmZpbGVfbmFtZTsKK307CisKK2V4dGVybiB0YWJsZSAqCit0YWJsZV9vcGVuKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwKKwkgICBpbnQgbnJfZmllbGRzLAorCSAgIGludCBucl9tb2RlbF9maWVsZHMpCit7CisgIGludCBmZDsKKyAgc3RydWN0IHN0YXQgc3RhdF9idWY7CisgIHRhYmxlICpmaWxlOworICBpbnQgbnI7CisKKyAgLyogY3JlYXRlIGEgZmlsZSBkZXNjcmlwdG9yICovCisgIGZpbGUgPSBaQUxMT0ModGFibGUpOworICBBU1NFUlQoZmlsZSAhPSBOVUxMKTsKKyAgZmlsZS0+bnJfZmllbGRzID0gbnJfZmllbGRzOworICBmaWxlLT5ucl9tb2RlbF9maWVsZHMgPSBucl9tb2RlbF9maWVsZHM7CisKKyAgLyogc2F2ZSB0aGUgZmlsZSBuYW1lICovCisgIGZpbGUtPmZpbGVfbmFtZSA9IChjaGFyKil6YWxsb2Moc3RybGVuKGZpbGVfbmFtZSkgKyAxKTsKKyAgQVNTRVJUKGZpbGUtPmZpbGVfbmFtZSAhPSBOVUxMKTsKKyAgc3RyY3B5KGZpbGUtPmZpbGVfbmFtZSwgZmlsZV9uYW1lKTsKKworICAvKiBvcGVuIHRoZSBmaWxlICovCisgIGZkID0gb3BlbihmaWxlLT5maWxlX25hbWUsIE9fUkRPTkxZLCAwKTsKKyAgQVNTRVJUKGZkID49IDApOworCisgIC8qIGRldGVybWluZSB0aGUgc2l6ZSAqLworICBpZiAoZnN0YXQoZmQsICZzdGF0X2J1ZikgPCAwKSB7CisgICAgcGVycm9yKCJ0YWJsZV9vcGVuLmZzdGF0Iik7CisgICAgZXhpdCgxKTsKKyAgfQorICBmaWxlLT5zaXplID0gc3RhdF9idWYuc3Rfc2l6ZTsKKworICAvKiBhbGxvY2F0ZSB0aGlzIG11Y2ggbWVtb3J5ICovCisgIGZpbGUtPmJ1ZmZlciA9IChjaGFyKil6YWxsb2MoZmlsZS0+c2l6ZSsxKTsKKyAgaWYoZmlsZS0+YnVmZmVyID09IE5VTEwpIHsKKyAgICBwZXJyb3IoInRhYmxlX29wZW4uY2FsbG9jLmZpbGUtPnNpemUrMSIpOworICAgIGV4aXQoMSk7CisgIH0KKyAgZmlsZS0+cG9zID0gZmlsZS0+YnVmZmVyOworCisgIC8qIHJlYWQgaXQgaW4gKi8KKyNpZmRlZiBfX0NZR1dJTjMyX18KKyAgaWYgKChmaWxlLT5zaXplKSAmJiAoKG5yID0gcmVhZChmZCwgZmlsZS0+YnVmZmVyLCBmaWxlLT5zaXplKSkgPD0gMCkpIHsKKyNlbHNlCisgIGlmICgobnIgPSByZWFkKGZkLCBmaWxlLT5idWZmZXIsIGZpbGUtPnNpemUpKSA8IGZpbGUtPnNpemUpIHsKKyNlbmRpZgorICAgIHBlcnJvcigidGFibGVfb3Blbi5yZWFkIik7CisgICAgZXhpdCgxKTsKKyAgfQorICBmaWxlLT5zaXplID0gbnI7CisgIGZpbGUtPmJ1ZmZlcltmaWxlLT5zaXplXSA9ICdcMCc7CisKKyAgLyogZG9uZSAqLworICBjbG9zZShmZCk7CisgIHJldHVybiBmaWxlOworfQorCisKK2V4dGVybiB0YWJsZV9lbnRyeSAqCit0YWJsZV9lbnRyeV9yZWFkKHRhYmxlICpmaWxlKQoreworICBpbnQgZmllbGQ7CisgIHRhYmxlX2VudHJ5ICplbnRyeTsKKworICAvKiBza2lwIGNvbW1lbnRzL2JsYW5rcyAqLworICB3aGlsZSgxKSB7CisgICAgLyogbGVhZGluZyB3aGl0ZSBzcGFjZSAqLworICAgIHdoaWxlICgqZmlsZS0+cG9zICE9ICdcMCcKKwkgICAmJiAqZmlsZS0+cG9zICE9ICdcbicKKwkgICAmJiBpc3NwYWNlKCpmaWxlLT5wb3MpKQorICAgICAgZmlsZS0+cG9zKys7CisgICAgLyogY29tbWVudCAqLworICAgIGlmICgqZmlsZS0+cG9zID09ICcjJykgeworICAgICAgZG8geworCWZpbGUtPnBvcysrOworICAgICAgfSB3aGlsZSAoKmZpbGUtPnBvcyAhPSAnXDAnICYmICpmaWxlLT5wb3MgIT0gJ1xuJyk7CisgICAgfQorICAgIC8qIGVuZCBvZiBsaW5lPyAqLworICAgIGlmICgqZmlsZS0+cG9zID09ICdcbicpIHsKKyAgICAgIGZpbGUtPnBvcysrOworICAgICAgZmlsZS0+bGluZV9ucisrOworICAgIH0KKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorICBpZiAoKmZpbGUtPnBvcyA9PSAnXDAnKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIGNyZWF0ZSB0aGlzIG5ldyBlbnRyeSAqLworICBlbnRyeSA9ICh0YWJsZV9lbnRyeSopemFsbG9jKHNpemVvZih0YWJsZV9lbnRyeSkKKwkJCSAgICAgICArIChmaWxlLT5ucl9maWVsZHMgKyAxKSAqIHNpemVvZihjaGFyKikpOworICBBU1NFUlQoZW50cnkgIT0gTlVMTCk7CisgIGVudHJ5LT5maWxlX25hbWUgPSBmaWxlLT5maWxlX25hbWU7CisgIGVudHJ5LT5ucl9maWVsZHMgPSBmaWxlLT5ucl9maWVsZHM7CisKKyAgLyogYnJlYWsgdGhlIGxpbmUgaW50byBpdHMgY29sb24gZGVsaW1pdGVyZWQgZmllbGRzICovCisgIGZvciAoZmllbGQgPSAwOyBmaWVsZCA8IGZpbGUtPm5yX2ZpZWxkcy0xOyBmaWVsZCsrKSB7CisgICAgZW50cnktPmZpZWxkc1tmaWVsZF0gPSBmaWxlLT5wb3M7CisgICAgd2hpbGUoKmZpbGUtPnBvcyAmJiAqZmlsZS0+cG9zICE9ICc6JyAmJiAqZmlsZS0+cG9zICE9ICdcbicpCisgICAgICBmaWxlLT5wb3MrKzsKKyAgICBpZiAoKmZpbGUtPnBvcyA9PSAnOicpIHsKKyAgICAgICpmaWxlLT5wb3MgPSAnXDAnOworICAgICAgZmlsZS0+cG9zKys7CisgICAgfQorICB9CisKKyAgLyogYW55IHRyYWlsaW5nIHN0dWZmIG5vdCB0aGUgbGFzdCBmaWVsZCAqLworICBBU1NFUlQoZmllbGQgPT0gZmlsZS0+bnJfZmllbGRzLTEpOworICBlbnRyeS0+ZmllbGRzW2ZpZWxkXSA9IGZpbGUtPnBvczsKKyAgd2hpbGUgKCpmaWxlLT5wb3MgJiYgKmZpbGUtPnBvcyAhPSAnXG4nKSB7CisgICAgZmlsZS0+cG9zKys7CisgIH0KKyAgaWYgKCpmaWxlLT5wb3MgPT0gJ1xuJykgeworICAgICpmaWxlLT5wb3MgPSAnXDAnOworICAgIGZpbGUtPnBvcysrOworICB9CisgIGZpbGUtPmxpbmVfbnIrKzsKKworICAvKiBpZiBmb2xsb3dpbmcgbGluZXMgYmVnaW4gd2l0aCBhIHN0YXIsIGFkZCB0aGVtIHRvIHRoZSBtb2RlbAorICAgICBzZWN0aW9uLiAgKi8KKyAgd2hpbGUgKChmaWxlLT5ucl9tb2RlbF9maWVsZHMgPiAwKSAmJiAoKmZpbGUtPnBvcyA9PSAnKicpKSB7CisgICAgdGFibGVfbW9kZWxfZW50cnkgKm1vZGVsID0gKHRhYmxlX21vZGVsX2VudHJ5Kil6YWxsb2Moc2l6ZW9mKHRhYmxlX21vZGVsX2VudHJ5KQorCQkJCQkJCSAgKyAoZmlsZS0+bnJfbW9kZWxfZmllbGRzICsgMSkgKiBzaXplb2YoY2hhciopKTsKKyAgICBpZiAoZW50cnktPm1vZGVsX2xhc3QpCisgICAgICBlbnRyeS0+bW9kZWxfbGFzdC0+bmV4dCA9IG1vZGVsOworICAgIGVsc2UKKyAgICAgIGVudHJ5LT5tb2RlbF9maXJzdCA9IG1vZGVsOworICAgIGVudHJ5LT5tb2RlbF9sYXN0ID0gbW9kZWw7CisKKyAgICAvKiBicmVhayB0aGUgbGluZSBpbnRvIGl0cyBjb2xvbiBkZWxpbWl0ZXJlZCBmaWVsZHMgKi8KKyAgICBmaWxlLT5wb3MrKzsKKyAgICBmb3IgKGZpZWxkID0gMDsgZmllbGQgPCBmaWxlLT5ucl9tb2RlbF9maWVsZHMtMTsgZmllbGQrKykgeworICAgICAgbW9kZWwtPmZpZWxkc1tmaWVsZF0gPSBmaWxlLT5wb3M7CisgICAgICB3aGlsZSgqZmlsZS0+cG9zICYmICpmaWxlLT5wb3MgIT0gJzonICYmICpmaWxlLT5wb3MgIT0gJ1xuJykKKwlmaWxlLT5wb3MrKzsKKyAgICAgIGlmICgqZmlsZS0+cG9zID09ICc6JykgeworCSpmaWxlLT5wb3MgPSAnXDAnOworCWZpbGUtPnBvcysrOworICAgICAgfQorICAgIH0KKworICAgIC8qIGFueSB0cmFpbGluZyBzdHVmZiBub3QgdGhlIGxhc3QgZmllbGQgKi8KKyAgICBBU1NFUlQoZmllbGQgPT0gZmlsZS0+bnJfbW9kZWxfZmllbGRzLTEpOworICAgIG1vZGVsLT5maWVsZHNbZmllbGRdID0gZmlsZS0+cG9zOworICAgIHdoaWxlICgqZmlsZS0+cG9zICYmICpmaWxlLT5wb3MgIT0gJ1xuJykgeworICAgICAgZmlsZS0+cG9zKys7CisgICAgfQorICAgIGlmICgqZmlsZS0+cG9zID09ICdcbicpIHsKKyAgICAgICpmaWxlLT5wb3MgPSAnXDAnOworICAgICAgZmlsZS0+cG9zKys7CisgICAgfQorCisgICAgZmlsZS0+bGluZV9ucisrOworICAgIG1vZGVsLT5saW5lX25yID0gZmlsZS0+bGluZV9ucjsKKyAgfQorCisgIGVudHJ5LT5saW5lX25yID0gZmlsZS0+bGluZV9ucjsKKworICAvKiBpZiBmb2xsb3dpbmcgbGluZXMgYXJlIHRhYiBpbmRlbnRlZCwgcHV0IGluIHRoZSBhbm5leCAqLworICBpZiAoKmZpbGUtPnBvcyA9PSAnXHQnKSB7CisgICAgZW50cnktPmFubmV4ID0gZmlsZS0+cG9zOworICAgIGRvIHsKKyAgICAgIGRvIHsKKwlmaWxlLT5wb3MrKzsKKyAgICAgIH0gd2hpbGUgKCpmaWxlLT5wb3MgIT0gJ1wwJyAmJiAqZmlsZS0+cG9zICE9ICdcbicpOworICAgICAgaWYgKCpmaWxlLT5wb3MgPT0gJ1xuJykgeworCWNoYXIgKnNhdmVfcG9zID0gKytmaWxlLT5wb3M7CisJaW50IGV4dHJhX2xpbmVzID0gMDsKKwlmaWxlLT5saW5lX25yKys7CisJLyogQWxsb3cgdGFiIGluZGVudGVkIHRvIGhhdmUgYmxhbmsgbGluZXMgKi8KKwl3aGlsZSAoKnNhdmVfcG9zID09ICdcbicpIHsKKwkgIHNhdmVfcG9zKys7CisJICBleHRyYV9saW5lcysrOworCX0KKwlpZiAoKnNhdmVfcG9zID09ICdcdCcpIHsKKwkgIGZpbGUtPnBvcyA9IHNhdmVfcG9zOworCSAgZmlsZS0+bGluZV9uciArPSBleHRyYV9saW5lczsKKwl9CisgICAgICB9CisgICAgfSB3aGlsZSAoKmZpbGUtPnBvcyAhPSAnXDAnICYmICpmaWxlLT5wb3MgPT0gJ1x0Jyk7CisgICAgaWYgKGZpbGUtPnBvc1stMV0gPT0gJ1xuJykKKyAgICAgIGZpbGUtPnBvc1stMV0gPSAnXDAnOworICB9CisgIGVsc2UKKyAgICBlbnRyeS0+YW5uZXggPSBOVUxMOworCisgIC8qIHJldHVybiBpdCAqLworICByZXR1cm4gZW50cnk7CisKK30KKworCitleHRlcm4gdm9pZAorZHVtcF90YWJsZV9lbnRyeSh0YWJsZV9lbnRyeSAqZW50cnksCisJCSBpbnQgaW5kZW50KQoreworICBwcmludGYoIih0YWJsZV9lbnRyeSopJXBcbiIsIGVudHJ5KTsKKworICBpZiAoZW50cnkgIT0gTlVMTCkgeworICAgIGludCBmaWVsZDsKKyAgICBjaGFyIHNlcDsKKworICAgIHNlcCA9ICcgJzsKKyAgICBkdW1wZihpbmRlbnQsICIoZmllbGRzIik7CisgICAgZm9yIChmaWVsZCA9IDA7IGZpZWxkIDwgZW50cnktPm5yX2ZpZWxkczsgZmllbGQrKykgeworICAgICAgcHJpbnRmKCIlYyVzIiwgc2VwLCBlbnRyeS0+ZmllbGRzW2ZpZWxkXSk7CisgICAgICBzZXAgPSAnOic7CisgICAgfQorICAgIHByaW50ZigiKVxuIik7CisKKyAgICBkdW1wZihpbmRlbnQsICIobGluZV9uciAlZClcbiIsIGVudHJ5LT5saW5lX25yKTsKKworICAgIGR1bXBmKGluZGVudCwgIihmaWxlX25hbWUgJXMpXG4iLCBlbnRyeS0+ZmlsZV9uYW1lKTsKKworICAgIGR1bXBmKGluZGVudCwgIihhbm5leFxuJXNcbiIsIGVudHJ5LT5hbm5leCk7CisgICAgZHVtcGYoaW5kZW50LCAiIClcbiIpOworCisgIH0KK30KKworCitleHRlcm4gdm9pZAordGFibGVfZW50cnlfcHJpbnRfY3BwX2xpbmVfbnIobGYgKmZpbGUsCisJCQkgICAgICB0YWJsZV9lbnRyeSAqZW50cnkpCit7CisgIGxmX3ByaW50X19leHRlcm5hbF9yZWZlcmVuY2UoZmlsZSwgZW50cnktPmxpbmVfbnIsIGVudHJ5LT5maWxlX25hbWUpOworfQorCisKZGlmZiAtLWdpdCBhL3NpbS9wcGMvdGFibGUuaCBiL3NpbS9wcGMvdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDlmYjIyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy90YWJsZS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgcHJvZ3JhbSBwc2ltLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAKKyAgICAqLworCisKKy8qIGxvYWQgYSB0YWJsZSBpbnRvIG1lbW9yeSAqLworCit0eXBlZGVmIHN0cnVjdCBfdGFibGUgdGFibGU7CisKK3R5cGVkZWYgc3RydWN0IF90YWJsZV9tb2RlbF9lbnRyeSB0YWJsZV9tb2RlbF9lbnRyeTsKK3N0cnVjdCBfdGFibGVfbW9kZWxfZW50cnkgeworICB0YWJsZV9tb2RlbF9lbnRyeSAqbmV4dDsKKyAgaW50IGxpbmVfbnI7CisgIGludCBucl9maWVsZHM7CisgIGNoYXIgKmZpZWxkc1swXTsJLyogVXNlciBkZWZpbmVkICovCit9OworCit0eXBlZGVmIHN0cnVjdCBfdGFibGVfZW50cnkgdGFibGVfZW50cnk7CitzdHJ1Y3QgX3RhYmxlX2VudHJ5IHsKKyAgaW50IGxpbmVfbnI7CisgIGludCBucl9maWVsZHM7CisgIGNoYXIgKmZpbGVfbmFtZTsKKyAgdGFibGVfbW9kZWxfZW50cnkgKm1vZGVsX2ZpcnN0OworICB0YWJsZV9tb2RlbF9lbnRyeSAqbW9kZWxfbGFzdDsKKyAgY2hhciAqYW5uZXg7CisgIGNoYXIgKmZpZWxkc1swXTsJIC8qIFVzZXIgZGVmaW5lZCAqLworfTsKKworCitleHRlcm4gdGFibGUgKnRhYmxlX29wZW4KKyhjb25zdCBjaGFyICpmaWxlX25hbWUsCisgaW50IG1heF9ucl9maWVsZHMsCisgaW50IG1heF9ucl9tb2RlbF9maWVsZHMpOworCitleHRlcm4gdGFibGVfZW50cnkgKnRhYmxlX2VudHJ5X3JlYWQKKyh0YWJsZSAqZmlsZSk7CisKK2V4dGVybiB2b2lkIGR1bXBfdGFibGVfZW50cnkKKyh0YWJsZV9lbnRyeSAqZW50cnksCisgaW50IGluZGVudCk7CisKK2V4dGVybiB2b2lkIHRhYmxlX2VudHJ5X3ByaW50X2NwcF9saW5lX25yCisobGYgKmZpbGUsCisgdGFibGVfZW50cnkgKmVudHJ5KTsKZGlmZiAtLWdpdCBhL3NpbS9wcGMvdHJlZS5jIGIvc2ltL3BwYy90cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwMDU5MwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvdHJlZS5jCkBAIC0wLDAgKzEsMTI1NiBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfUEFSU0VfQ18KKyNkZWZpbmUgX1BBUlNFX0NfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAiYmFzaWNzLmgiCisKKyNpbmNsdWRlICJkZXZpY2UuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisKKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisKKy8qIG1hbmlwdWxhdGUvbG9va3VwIGRldmljZSBuYW1lcyAqLworCit0eXBlZGVmIHN0cnVjdCBfbmFtZV9zcGVjaWZpZXIgeworICAvKiBjb21wb25lbnRzIGluIHRoZSBmdWxsIGxlbmd0aCBuYW1lICovCisgIGNoYXIgKnBhdGg7CisgIGNoYXIgKnByb3BlcnR5OworICBjaGFyICp2YWx1ZTsKKyAgLyogY3VycmVudCBkZXZpY2UgKi8KKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqYmFzZTsKKyAgY2hhciAqdW5pdDsKKyAgY2hhciAqYXJnczsKKyAgLyogcHJldmlvdXMgZGV2aWNlICovCisgIGNoYXIgKmxhc3RfbmFtZTsKKyAgY2hhciAqbGFzdF9iYXNlOworICBjaGFyICpsYXN0X3VuaXQ7CisgIGNoYXIgKmxhc3RfYXJnczsKKyAgLyogd29yayBhcmVhICovCisgIGNoYXIgYnVmWzEwMjRdOworfSBuYW1lX3NwZWNpZmllcjsKKworCisKKy8qIEdpdmVuIGEgZGV2aWNlIHNwZWNpZmllciwgYnJlYWsgaXQgdXAgaW50byBpdHMgbWFpbiBjb21wb25lbnRzOgorICAgcGF0aCAoYW5kIGlmIHByZXNlbnQpIHByb3BlcnR5IG5hbWUgYW5kIHByb3BlcnR5IHZhbHVlLiAqLworCitTVEFUSUNfSU5MSU5FX1RSRUVcCisoaW50KQorc3BsaXRfZGV2aWNlX3NwZWNpZmllcihkZXZpY2UgKmN1cnJlbnQsCisJCSAgICAgICBjb25zdCBjaGFyICpkZXZpY2Vfc3BlY2lmaWVyLAorCQkgICAgICAgbmFtZV9zcGVjaWZpZXIgKnNwZWMpCit7CisgIGNoYXIgKmNocCA9IE5VTEw7CisKKyAgLyogZXhwYW5kIGFueSBsZWFkaW5nIGFsaWFzIGlmIHByZXNlbnQgKi8KKyAgaWYgKGN1cnJlbnQgIT0gTlVMTAorICAgICAgJiYgKmRldmljZV9zcGVjaWZpZXIgIT0gJ1wwJworICAgICAgJiYgKmRldmljZV9zcGVjaWZpZXIgIT0gJy4nCisgICAgICAmJiAqZGV2aWNlX3NwZWNpZmllciAhPSAnLycpIHsKKyAgICBkZXZpY2UgKmFsaWFzZXMgPSB0cmVlX2ZpbmRfZGV2aWNlKGN1cnJlbnQsICIvYWxpYXNlcyIpOworICAgIGNoYXIgYWxpYXNbMzJdOworICAgIGludCBsZW4gPSAwOworICAgIHdoaWxlIChkZXZpY2Vfc3BlY2lmaWVyW2xlbl0gIT0gJ1wwJworCSAgICYmIGRldmljZV9zcGVjaWZpZXJbbGVuXSAhPSAnLycKKwkgICAmJiBkZXZpY2Vfc3BlY2lmaWVyW2xlbl0gIT0gJzonCisJICAgJiYgIWlzc3BhY2UoZGV2aWNlX3NwZWNpZmllcltsZW5dKSkgeworICAgICAgYWxpYXNbbGVuXSA9IGRldmljZV9zcGVjaWZpZXJbbGVuXTsKKyAgICAgIGxlbisrOworICAgICAgaWYgKGxlbiA+PSBzaXplb2YoYWxpYXMpKQorCWVycm9yKCJzcGxpdF9kZXZpY2Vfc3BlY2lmaWVyOiBidWZmZXIgb3ZlcmZsb3ciKTsKKyAgICB9CisgICAgYWxpYXNbbGVuXSA9ICdcMCc7CisgICAgaWYgKGFsaWFzZXMgIT0gTlVMTAorCSYmIGRldmljZV9maW5kX3Byb3BlcnR5KGFsaWFzZXMsIGFsaWFzKSkgeworICAgICAgc3RyY3B5KHNwZWMtPmJ1ZiwgZGV2aWNlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5KGFsaWFzZXMsIGFsaWFzKSk7CisgICAgICBzdHJjYXQoc3BlYy0+YnVmLCBkZXZpY2Vfc3BlY2lmaWVyICsgbGVuKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzdHJjcHkoc3BlYy0+YnVmLCBkZXZpY2Vfc3BlY2lmaWVyKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgc3RyY3B5KHNwZWMtPmJ1ZiwgZGV2aWNlX3NwZWNpZmllcik7CisgIH0KKworICAvKiBjaGVjayBubyBvdmVyZmxvdyAqLworICBpZiAoc3RybGVuKHNwZWMtPmJ1ZikgPj0gc2l6ZW9mKHNwZWMtPmJ1ZikpCisgICAgZXJyb3IoInNwbGl0X2RldmljZV9zcGVjaWZpZXI6IGJ1ZmZlciBvdmVyZmxvd1xuIik7CisKKyAgLyogc3RyaXAgbGVhZGluZyBzcGFjZXMgKi8KKyAgY2hwID0gc3BlYy0+YnVmOworICB3aGlsZSAoKmNocCAhPSAnXDAnICYmIGlzc3BhY2UoKmNocCkpCisgICAgY2hwKys7CisgIGlmICgqY2hwID09ICdcMCcpCisgICAgcmV0dXJuIDA7CisKKyAgLyogZmluZCB0aGUgcGF0aCBhbmQgdGVybWluYXRlIGl0IHdpdGggbnVsbCAqLworICBzcGVjLT5wYXRoID0gY2hwOworICB3aGlsZSAoKmNocCAhPSAnXDAnICYmICFpc3NwYWNlKCpjaHApKQorICAgIGNocCsrOworICBpZiAoKmNocCAhPSAnXDAnKSB7CisgICAgKmNocCA9ICdcMCc7CisgICAgY2hwKys7CisgIH0KKworICAvKiBhbmQgYW55IHZhbHVlICovCisgIHdoaWxlICgqY2hwICE9ICdcMCcgJiYgaXNzcGFjZSgqY2hwKSkKKyAgICBjaHArKzsKKyAgc3BlYy0+dmFsdWUgPSBjaHA7CisKKyAgLyogbm93IGdvIGJhY2sgYW5kIGNob3AgdGhlIHByb3BlcnR5IG9mZiBvZiB0aGUgcGF0aCAqLworICBpZiAoc3BlYy0+dmFsdWVbMF0gPT0gJ1wwJykgeworICAgIHNwZWMtPnByb3BlcnR5ID0gTlVMTDsgLypub3QgYSBwcm9wZXJ0eSovCisgICAgc3BlYy0+dmFsdWUgPSBOVUxMOworICB9CisgIGVsc2UgaWYgKHNwZWMtPnZhbHVlWzBdID09ICc+JworCSAgIHx8IHNwZWMtPnZhbHVlWzBdID09ICc8JykgeworICAgIC8qIGFuIGludGVycnVwdCBzcGVjICovCisgICAgc3BlYy0+cHJvcGVydHkgPSBOVUxMOworICB9CisgIGVsc2UgeworICAgIGNocCA9IHN0cnJjaHIoc3BlYy0+cGF0aCwgJy8nKTsKKyAgICBpZiAoY2hwID09IE5VTEwpIHsKKyAgICAgIHNwZWMtPnByb3BlcnR5ID0gc3BlYy0+cGF0aDsKKyAgICAgIHNwZWMtPnBhdGggPSBzdHJjaHIoc3BlYy0+cHJvcGVydHksICdcMCcpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICpjaHAgPSAnXDAnOworICAgICAgc3BlYy0+cHJvcGVydHkgPSBjaHArMTsKKyAgICB9CisgIH0KKworICAvKiBhbmQgbWFyayB0aGUgcmVzdCBhcyBpbnZhbGlkICovCisgIHNwZWMtPm5hbWUgPSBOVUxMOworICBzcGVjLT5iYXNlID0gTlVMTDsKKyAgc3BlYy0+dW5pdCA9IE5VTEw7CisgIHNwZWMtPmFyZ3MgPSBOVUxMOworICBzcGVjLT5sYXN0X25hbWUgPSBOVUxMOworICBzcGVjLT5sYXN0X2Jhc2UgPSBOVUxMOworICBzcGVjLT5sYXN0X3VuaXQgPSBOVUxMOworICBzcGVjLT5sYXN0X2FyZ3MgPSBOVUxMOworCisgIHJldHVybiAxOworfQorCisKKy8qIGdpdmVuIGEgZGV2aWNlIHNwZWNpZmllciBicmVhayBpdCB1cCBpbnRvIGl0cyBtYWluIGNvbXBvbmVudHMgLQorICAgcGF0aCBhbmQgcHJvcGVydHkgbmFtZSAtIGFzc3VtaW5nIHRoYXQgdGhlIGxhc3QgYGRldmljZScgaXMgYQorICAgcHJvcGVydHkgbmFtZS4gKi8KKworU1RBVElDX0lOTElORV9ERVZJQ0VcCisoaW50KQorc3BsaXRfcHJvcGVydHlfc3BlY2lmaWVyKGRldmljZSAqY3VycmVudCwKKwkJCSBjb25zdCBjaGFyICpwcm9wZXJ0eV9zcGVjaWZpZXIsCisJCQkgbmFtZV9zcGVjaWZpZXIgKnNwZWMpCit7CisgIGlmIChzcGxpdF9kZXZpY2Vfc3BlY2lmaWVyKGN1cnJlbnQsIHByb3BlcnR5X3NwZWNpZmllciwgc3BlYykpIHsKKyAgICBpZiAoc3BlYy0+cHJvcGVydHkgPT0gTlVMTCkgeworICAgICAgLyogZm9yY2UgdGhlIGxhc3QgbmFtZSB0byBiZSBhIHByb3BlcnR5IG5hbWUgKi8KKyAgICAgIGNoYXIgKmNocCA9IHN0cnJjaHIoc3BlYy0+cGF0aCwgJy8nKTsKKyAgICAgIGlmIChjaHAgPT0gTlVMTCkgeworCXNwZWMtPnByb3BlcnR5ID0gc3BlYy0+cGF0aDsKKwlzcGVjLT5wYXRoID0gc3RycmNocihzcGVjLT5wcm9wZXJ0eSwgJ1wwJyk7OworICAgICAgfQorICAgICAgZWxzZSB7CisJKmNocCA9ICdcMCc7CisJc3BlYy0+cHJvcGVydHkgPSBjaHArMTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisKKy8qIGRldmljZSB0aGUgbmV4dCBkZXZpY2UgbmFtZSBhbmQgc3BsaXQgaXQgdXAsIHJldHVybiAwIHdoZW4gbm8gbW9yZQorICAgbmFtZXMgdG8gZGV2aWNlICovCisKK1NUQVRJQ19JTkxJTkVfVFJFRVwKKyhpbnQpCitzcGxpdF9kZXZpY2VfbmFtZShuYW1lX3NwZWNpZmllciAqc3BlYykKK3sKKyAgY2hhciAqY2hwOworICAvKiByZW1lbWJlciB3aGF0IGNhbWUgYmVmb3JlICovCisgIHNwZWMtPmxhc3RfbmFtZSA9IHNwZWMtPm5hbWU7CisgIHNwZWMtPmxhc3RfYmFzZSA9IHNwZWMtPmJhc2U7CisgIHNwZWMtPmxhc3RfdW5pdCA9IHNwZWMtPnVuaXQ7CisgIHNwZWMtPmxhc3RfYXJncyA9IHNwZWMtPmFyZ3M7CisgIC8qIGZpbmlzaGVkPyAqLworICBpZiAoc3BlYy0+cGF0aFswXSA9PSAnXDAnKSB7CisgICAgc3BlYy0+bmFtZSA9IE5VTEw7CisgICAgc3BlYy0+YmFzZSA9IE5VTEw7CisgICAgc3BlYy0+dW5pdCA9IE5VTEw7CisgICAgc3BlYy0+YXJncyA9IE5VTEw7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgLyogYnJlYWsgdGhlIGN1cnJlbnQgZGV2aWNlIHNwZWMgZnJvbSB0aGUgcGF0aCAqLworICBzcGVjLT5uYW1lID0gc3BlYy0+cGF0aDsKKyAgY2hwID0gc3RyY2hyKHNwZWMtPm5hbWUsICcvJyk7CisgIGlmIChjaHAgPT0gTlVMTCkKKyAgICBzcGVjLT5wYXRoID0gc3RyY2hyKHNwZWMtPm5hbWUsICdcMCcpOworICBlbHNlIHsKKyAgICBzcGVjLT5wYXRoID0gY2hwKzE7CisgICAgKmNocCA9ICdcMCc7CisgIH0KKyAgLyogYnJlYWsgb3V0IHRoZSBiYXNlICovCisgIGlmIChzcGVjLT5uYW1lWzBdID09ICcoJykgeworICAgIGNocCA9IHN0cmNocihzcGVjLT5uYW1lLCAnKScpOworICAgIGlmIChjaHAgPT0gTlVMTCkgeworICAgICAgc3BlYy0+YmFzZSA9IHNwZWMtPm5hbWU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgKmNocCA9ICdcMCc7CisgICAgICBzcGVjLT5iYXNlID0gc3BlYy0+bmFtZSArIDE7CisgICAgICBzcGVjLT5uYW1lID0gY2hwICsgMTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgc3BlYy0+YmFzZSA9IHNwZWMtPm5hbWU7CisgIH0KKyAgLyogbm93IGJyZWFrIG91dCB0aGUgdW5pdCAqLworICBjaHAgPSBzdHJjaHIoc3BlYy0+bmFtZSwgJ0AnKTsKKyAgaWYgKGNocCA9PSBOVUxMKSB7CisgICAgc3BlYy0+dW5pdCA9IE5VTEw7CisgICAgY2hwID0gc3BlYy0+bmFtZTsKKyAgfQorICBlbHNlIHsKKyAgICAqY2hwID0gJ1wwJzsKKyAgICBjaHAgKz0gMTsKKyAgICBzcGVjLT51bml0ID0gY2hwOworICB9CisgIC8qIGZpbmFsbHkgYW55IGFyZ3MgKi8KKyAgY2hwID0gc3RyY2hyKGNocCwgJzonKTsKKyAgaWYgKGNocCA9PSBOVUxMKQorICAgIHNwZWMtPmFyZ3MgPSBOVUxMOworICBlbHNlIHsKKyAgICAqY2hwID0gJ1wwJzsKKyAgICBzcGVjLT5hcmdzID0gY2hwKzE7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworLyogZGV2aWNlIHRoZSB2YWx1ZSwgcmV0dXJuaW5nIHRoZSBuZXh0IG5vbi1zcGFjZSB0b2tlbiAqLworCitTVEFUSUNfSU5MSU5FX1RSRUVcCisoY2hhciAqKQorc3BsaXRfdmFsdWUobmFtZV9zcGVjaWZpZXIgKnNwZWMpCit7CisgIGNoYXIgKnRva2VuOworICBpZiAoc3BlYy0+dmFsdWUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKyAgLyogc2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlICovCisgIHdoaWxlIChpc3NwYWNlKHNwZWMtPnZhbHVlWzBdKSkKKyAgICBzcGVjLT52YWx1ZSsrOworICBpZiAoc3BlYy0+dmFsdWVbMF0gPT0gJ1wwJykgeworICAgIHNwZWMtPnZhbHVlID0gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB0b2tlbiA9IHNwZWMtPnZhbHVlOworICAvKiBmaW5kIHRyYWlsaW5nIHNwYWNlICovCisgIHdoaWxlIChzcGVjLT52YWx1ZVswXSAhPSAnXDAnICYmICFpc3NwYWNlKHNwZWMtPnZhbHVlWzBdKSkKKyAgICBzcGVjLT52YWx1ZSsrOworICAvKiBjaG9wIHRoaXMgdmFsdWUgb3V0ICovCisgIGlmIChzcGVjLT52YWx1ZVswXSAhPSAnXDAnKSB7CisgICAgc3BlYy0+dmFsdWVbMF0gPSAnXDAnOworICAgIHNwZWMtPnZhbHVlKys7CisgIH0KKyAgcmV0dXJuIHRva2VuOworfQorCisKKworLyogdHJhdmVyc2UgdGhlIHBhdGggc3BlY2lmaWVkIGJ5IHNwZWMgc3RhcnRpbmcgYXQgY3VycmVudCAqLworCitTVEFUSUNfSU5MSU5FX1RSRUVcCisoZGV2aWNlICopCitzcGxpdF9maW5kX2RldmljZShkZXZpY2UgKmN1cnJlbnQsCisJCSAgbmFtZV9zcGVjaWZpZXIgKnNwZWMpCit7CisgIC8qIHN0cmlwIG9mZiAoYW5kIHByb2Nlc3MpIGFueSBsZWFkaW5nIC4sIC4uLCAuLyBhbmQgLyAqLworICB3aGlsZSAoMSkgeworICAgIGlmIChzdHJuY21wKHNwZWMtPnBhdGgsICIvIiwgc3RybGVuKCIvIikpID09IDApIHsKKyAgICAgIC8qIGNkIC8uLi4gKi8KKyAgICAgIHdoaWxlIChjdXJyZW50ICE9IE5VTEwgJiYgZGV2aWNlX3BhcmVudChjdXJyZW50KSAhPSBOVUxMKQorCWN1cnJlbnQgPSBkZXZpY2VfcGFyZW50KGN1cnJlbnQpOworICAgICAgc3BlYy0+cGF0aCArPSBzdHJsZW4oIi8iKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RybmNtcChzcGVjLT5wYXRoLCAiLi8iLCBzdHJsZW4oIi4vIikpID09IDApIHsKKyAgICAgIC8qIGNkIC4vLi4uICovCisgICAgICBjdXJyZW50ID0gY3VycmVudDsKKyAgICAgIHNwZWMtPnBhdGggKz0gc3RybGVuKCIuLyIpOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wKHNwZWMtPnBhdGgsICIuLi8iLCBzdHJsZW4oIi4uLyIpKSA9PSAwKSB7CisgICAgICAvKiBjZCAuLi8uLi4gKi8KKyAgICAgIGlmIChjdXJyZW50ICE9IE5VTEwgJiYgZGV2aWNlX3BhcmVudChjdXJyZW50KSAhPSBOVUxMKQorCWN1cnJlbnQgPSBkZXZpY2VfcGFyZW50KGN1cnJlbnQpOworICAgICAgc3BlYy0+cGF0aCArPSBzdHJsZW4oIi4uLyIpOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoc3BlYy0+cGF0aCwgIi4iKSA9PSAwKSB7CisgICAgICAvKiBjZCAuICovCisgICAgICBjdXJyZW50ID0gY3VycmVudDsKKyAgICAgIHNwZWMtPnBhdGggKz0gc3RybGVuKCIuIik7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcChzcGVjLT5wYXRoLCAiLi4iKSA9PSAwKSB7CisgICAgICAvKiBjZCAuICovCisgICAgICBpZiAoY3VycmVudCAhPSBOVUxMICYmIGRldmljZV9wYXJlbnQoY3VycmVudCkgIT0gTlVMTCkKKwljdXJyZW50ID0gZGV2aWNlX3BhcmVudChjdXJyZW50KTsKKyAgICAgIHNwZWMtPnBhdGggKz0gc3RybGVuKCIuLiIpOworICAgIH0KKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQorCisgIC8qIG5vdyBnbyB0aHJvdWdoIHRoZSBwYXRoIHByb3BlciAqLworCisgIGlmIChjdXJyZW50ID09IE5VTEwpIHsKKyAgICBzcGxpdF9kZXZpY2VfbmFtZShzcGVjKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHdoaWxlIChzcGxpdF9kZXZpY2VfbmFtZShzcGVjKSkgeworICAgIGRldmljZSAqY2hpbGQ7CisgICAgZm9yIChjaGlsZCA9IGRldmljZV9jaGlsZChjdXJyZW50KTsKKwkgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBkZXZpY2Vfc2libGluZyhjaGlsZCkpIHsKKyAgICAgIGlmIChzdHJjbXAoc3BlYy0+bmFtZSwgZGV2aWNlX25hbWUoY2hpbGQpKSA9PSAwKSB7CisJaWYgKHNwZWMtPnVuaXQgPT0gTlVMTCkKKwkgIGJyZWFrOworCWVsc2UgeworCSAgZGV2aWNlX3VuaXQgcGh5czsKKwkgIGRldmljZV9kZWNvZGVfdW5pdChjdXJyZW50LCBzcGVjLT51bml0LCAmcGh5cyk7CisJICBpZiAobWVtY21wKCZwaHlzLCBkZXZpY2VfdW5pdF9hZGRyZXNzKGNoaWxkKSwKKwkJICAgICBzaXplb2YoZGV2aWNlX3VuaXQpKSA9PSAwKQorCSAgICBicmVhazsKKwl9CisgICAgICB9CisgICAgfQorICAgIGlmIChjaGlsZCA9PSBOVUxMKQorICAgICAgcmV0dXJuIGN1cnJlbnQ7IC8qIHNlYXJjaCBmYWlsZWQgKi8KKyAgICBjdXJyZW50ID0gY2hpbGQ7CisgIH0KKworICByZXR1cm4gY3VycmVudDsKK30KKworCitTVEFUSUNfSU5MSU5FX1RSRUVcCisoZGV2aWNlICopCitzcGxpdF9maWxsX3BhdGgoZGV2aWNlICpjdXJyZW50LAorCQljb25zdCBjaGFyICpkZXZpY2Vfc3BlY2lmaWVyLAorCQluYW1lX3NwZWNpZmllciAqc3BlYykKK3sKKyAgLyogYnJlYWsgaXQgdXAgKi8KKyAgaWYgKCFzcGxpdF9kZXZpY2Vfc3BlY2lmaWVyKGN1cnJlbnQsIGRldmljZV9zcGVjaWZpZXIsIHNwZWMpKQorICAgIGRldmljZV9lcnJvcihjdXJyZW50LCAiZXJyb3IgcGFyc2luZyAlc1xuIiwgZGV2aWNlX3NwZWNpZmllcik7CisKKyAgLyogZmlsbCBvdXIgdHJlZSB3aXRoIGl0cyBjb250ZW50cyAqLworICBjdXJyZW50ID0gc3BsaXRfZmluZF9kZXZpY2UoY3VycmVudCwgc3BlYyk7CisKKyAgLyogYWRkIGFueSBhZGRpdGlvbmFsIGRldmljZXMgYXMgbmVlZGVkICovCisgIGlmIChzcGVjLT5uYW1lICE9IE5VTEwpIHsKKyAgICBkbyB7CisgICAgICBjdXJyZW50ID0gZGV2aWNlX2NyZWF0ZShjdXJyZW50LCBzcGVjLT5iYXNlLCBzcGVjLT5uYW1lLAorCQkJICAgICAgc3BlYy0+dW5pdCwgc3BlYy0+YXJncyk7CisgICAgfSB3aGlsZSAoc3BsaXRfZGV2aWNlX25hbWUoc3BlYykpOworICB9CisKKyAgcmV0dXJuIGN1cnJlbnQ7Cit9CisKKworSU5MSU5FX1RSRUVcCisodm9pZCkKK3RyZWVfaW5pdChkZXZpY2UgKnJvb3QsCisJICBwc2ltICpzeXN0ZW0pCit7CisgIFRSQUNFKHRyYWNlX2RldmljZV90cmVlLCAoInRyZWVfaW5pdChyb290PTB4JWx4LCBzeXN0ZW09MHglbHgpXG4iLAorCQkJICAgIChsb25nKXJvb3QsCisJCQkgICAgKGxvbmcpc3lzdGVtKSk7CisgIC8qIHJlbW92ZSB0aGUgb2xkLCByZWJ1aWxkIHRoZSBuZXcgKi8KKyAgdHJlZV90cmF2ZXJzZShyb290LCBkZXZpY2VfY2xlYW4sIE5VTEwsIHN5c3RlbSk7CisgIHRyZWVfdHJhdmVyc2Uocm9vdCwgZGV2aWNlX2luaXRfc3RhdGljX3Byb3BlcnRpZXMsIE5VTEwsIHN5c3RlbSk7CisgIHRyZWVfdHJhdmVyc2Uocm9vdCwgZGV2aWNlX2luaXRfYWRkcmVzcywgTlVMTCwgc3lzdGVtKTsKKyAgdHJlZV90cmF2ZXJzZShyb290LCBkZXZpY2VfaW5pdF9ydW50aW1lX3Byb3BlcnRpZXMsIE5VTEwsIHN5c3RlbSk7CisgIHRyZWVfdHJhdmVyc2Uocm9vdCwgZGV2aWNlX2luaXRfZGF0YSwgTlVMTCwgc3lzdGVtKTsKK30KKworCisMCisvKiA8bm9uLXdoaXRlLXNwYWNlPiAqLworCitTVEFUSUNfSU5MSU5FX1RSRUVcCisoY29uc3QgY2hhciAqKQorc2tpcF90b2tlbihjb25zdCBjaGFyICpjaHApCit7CisgIHdoaWxlICghaXNzcGFjZSgqY2hwKSAmJiAqY2hwICE9ICdcMCcpCisgICAgY2hwKys7CisgIHdoaWxlIChpc3NwYWNlKCpjaHApICYmICpjaHAgIT0gJ1wwJykKKyAgICBjaHArKzsKKyAgcmV0dXJuIGNocDsKK30KKworCisvKiBjb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgKi8KKworU1RBVElDX0lOTElORV9UUkVFXAorKGludCkKK2NvdW50X2VudHJpZXMoZGV2aWNlICpjdXJyZW50LAorCSAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5X25hbWUsCisJICAgICAgY29uc3QgY2hhciAqcHJvcGVydHlfdmFsdWUsCisJICAgICAgaW50IG1vZHVsbykKK3sKKyAgY29uc3QgY2hhciAqY2hwID0gcHJvcGVydHlfdmFsdWU7CisgIGludCBucl9lbnRyaWVzID0gMDsKKyAgd2hpbGUgKCpjaHAgIT0gJ1wwJykgeworICAgIG5yX2VudHJpZXMgKz0gMTsKKyAgICBjaHAgPSBza2lwX3Rva2VuKGNocCk7CisgIH0KKyAgaWYgKChucl9lbnRyaWVzICUgbW9kdWxvKSAhPSAwKSB7CisgICAgZGV2aWNlX2Vycm9yKGN1cnJlbnQsICJpbmNvcnJlY3QgbnVtYmVyIG9mIGVudHJpZXMgZm9yICVzIHByb3BlcnR5ICVzLCBzaG91bGQgYmUgbXVsdGlwbGUgb2YgJWQiLAorCQkgcHJvcGVydHlfbmFtZSwgcHJvcGVydHlfdmFsdWUsIG1vZHVsbyk7CisgIH0KKyAgcmV0dXJuIG5yX2VudHJpZXMgLyBtb2R1bG87Cit9CisKKworCisvKiBwYXJzZTogPGFkZHJlc3M+IDo6PSA8dG9rZW4+IDsgZGV2aWNlIGRlcGVuZGFudCAqLworCitTVEFUSUNfSU5MSU5FX1RSRUVcCisoY29uc3QgY2hhciAqKQorcGFyc2VfYWRkcmVzcyhkZXZpY2UgKmN1cnJlbnQsCisJICAgICAgZGV2aWNlICpidXMsCisJICAgICAgY29uc3QgY2hhciAqY2hwLAorCSAgICAgIGRldmljZV91bml0ICphZGRyZXNzKQoreworICBpZiAoZGV2aWNlX2RlY29kZV91bml0KGJ1cywgY2hwLCBhZGRyZXNzKSA8IDApCisgICAgZGV2aWNlX2Vycm9yKGN1cnJlbnQsICJpbnZhbGlkIHVuaXQgYWRkcmVzcyBpbiAlcyIsIGNocCk7CisgIHJldHVybiBza2lwX3Rva2VuKGNocCk7Cit9CisKKworLyogcGFyc2U6IDxzaXplPiA6Oj0gPG51bWJlcj4geyAiLCIgPG51bWJlcj4gfSA7ICovCisKK1NUQVRJQ19JTkxJTkVfVFJFRVwKKyhjb25zdCBjaGFyICopCitwYXJzZV9zaXplKGRldmljZSAqY3VycmVudCwKKwkgICBkZXZpY2UgKmJ1cywKKwkgICBjb25zdCBjaGFyICpjaHAsCisJICAgZGV2aWNlX3VuaXQgKnNpemUpCit7CisgIGludCBpOworICBpbnQgbnI7CisgIGNvbnN0IGNoYXIgKmN1cnIgPSBjaHA7CisgIG1lbXNldChzaXplLCAwLCBzaXplb2YoKnNpemUpKTsKKyAgLyogcGFyc2UgdGhlIG51bWVyaWMgbGlzdCAqLworICBzaXplLT5ucl9jZWxscyA9IGRldmljZV9ucl9zaXplX2NlbGxzKGJ1cyk7CisgIG5yID0gMDsKKyAgd2hpbGUgKDEpIHsKKyAgICBjaGFyICpuZXh0OworICAgIHNpemUtPmNlbGxzW25yXSA9IHN0cnRvdWwoY3VyciwgJm5leHQsIDApOworICAgIGlmIChjdXJyID09IG5leHQpCisgICAgICBkZXZpY2VfZXJyb3IoY3VycmVudCwgIlByb2JsZW0gcGFyc2luZyA8c2l6ZT4gJXMiLCBjaHApOworICAgIG5yICs9IDE7CisgICAgaWYgKG5leHRbMF0gIT0gJywnKQorICAgICAgYnJlYWs7CisgICAgaWYgKG5yID09IHNpemUtPm5yX2NlbGxzKQorICAgICAgZGV2aWNlX2Vycm9yKGN1cnJlbnQsICJUb28gbWFueSB2YWx1ZXMgaW4gPHNpemU+ICVzIiwgY2hwKTsKKyAgICBjdXJyID0gbmV4dCArIDE7CisgIH0KKyAgQVNTRVJUKG5yID4gMCAmJiBuciA8PSBzaXplLT5ucl9jZWxscyk7CisgIC8qIHJpZ2h0IGFsaWduIHRoZSBudW1iZXJzICovCisgIGZvciAoaSA9IDE7IGkgPD0gc2l6ZS0+bnJfY2VsbHM7IGkrKykgeworICAgIGlmIChpIDw9IG5yKQorICAgICAgc2l6ZS0+Y2VsbHNbc2l6ZS0+bnJfY2VsbHMgLSBpXSA9IHNpemUtPmNlbGxzW25yIC0gaV07CisgICAgZWxzZQorICAgICAgc2l6ZS0+Y2VsbHNbc2l6ZS0+bnJfY2VsbHMgLSBpXSA9IDA7CisgIH0KKyAgcmV0dXJuIHNraXBfdG9rZW4oY2hwKTsKK30KKworCisvKiBwYXJzZTogPHJlZz4gOjo9IHsgPGFkZHJlc3M+IDxzaXplPiB9IDsgKi8KKworU1RBVElDX0lOTElORV9UUkVFXAorKHZvaWQpCitwYXJzZV9yZWdfcHJvcGVydHkoZGV2aWNlICpjdXJyZW50LAorCQkgICBjb25zdCBjaGFyICpwcm9wZXJ0eV9uYW1lLAorCQkgICBjb25zdCBjaGFyICpwcm9wZXJ0eV92YWx1ZSkKK3sKKyAgaW50IG5yX3JlZ3M7CisgIGludCByZWdfbnI7CisgIHJlZ19wcm9wZXJ0eV9zcGVjICpyZWdzOworICBjb25zdCBjaGFyICpjaHA7CisKKyAgLyogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcmVnIGVudHJpZXMgYnkgY291bnRpbmcgdG9rZW5zICovCisgIG5yX3JlZ3MgPSBjb3VudF9lbnRyaWVzKGN1cnJlbnQsIHByb3BlcnR5X25hbWUsIHByb3BlcnR5X3ZhbHVlLCAyKTsKKworICAvKiBjcmVhdGUgd29ya2luZyBzcGFjZSAqLworICByZWdzID0gemFsbG9jKG5yX3JlZ3MgKiBzaXplb2YoKnJlZ3MpKTsKKworICAvKiBmaWxsIGl0IGluICovCisgIGNocCA9IHByb3BlcnR5X3ZhbHVlOworICBmb3IgKHJlZ19uciA9IDA7IHJlZ19uciA8IG5yX3JlZ3M7IHJlZ19ucisrKSB7CisgICAgY2hwID0gcGFyc2VfYWRkcmVzcyhjdXJyZW50LCBkZXZpY2VfcGFyZW50KGN1cnJlbnQpLAorCQkJY2hwLCAmcmVnc1tyZWdfbnJdLmFkZHJlc3MpOworICAgIGNocCA9IHBhcnNlX3NpemUoY3VycmVudCwgZGV2aWNlX3BhcmVudChjdXJyZW50KSwKKwkJICAgICBjaHAsICZyZWdzW3JlZ19ucl0uc2l6ZSk7CisgIH0KKworICAvKiBjcmVhdGUgaXQgKi8KKyAgZGV2aWNlX2FkZF9yZWdfYXJyYXlfcHJvcGVydHkoY3VycmVudCwgcHJvcGVydHlfbmFtZSwKKwkJCQlyZWdzLCBucl9yZWdzKTsKKworICB6ZnJlZShyZWdzKTsKK30KKworCisvKiB7IDxjaGlsZC1hZGRyZXNzPiA8cGFyZW50LWFkZHJlc3M+IDxjaGlsZC1zaXplPiB9KiAqLworCitTVEFUSUNfSU5MSU5FX1RSRUVcCisodm9pZCkKK3BhcnNlX3Jhbmdlc19wcm9wZXJ0eShkZXZpY2UgKmN1cnJlbnQsCisJCSAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5X25hbWUsCisJCSAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5X3ZhbHVlKQoreworICBpbnQgbnJfcmFuZ2VzOworICBpbnQgcmFuZ2VfbnI7CisgIHJhbmdlX3Byb3BlcnR5X3NwZWMgKnJhbmdlczsKKyAgY29uc3QgY2hhciAqY2hwOworICAKKyAgLyogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcmFuZ2VzIHNwZWNpZmllZCAqLworICBucl9yYW5nZXMgPSBjb3VudF9lbnRyaWVzKGN1cnJlbnQsIHByb3BlcnR5X25hbWUsIHByb3BlcnR5X3ZhbHVlLCAzKTsKKworICAvKiBjcmVhdGUgYSBwcm9wZXJ0eSBvZiB0aGF0IHNpemUgKi8KKyAgcmFuZ2VzID0gemFsbG9jKG5yX3JhbmdlcyAqIHNpemVvZigqcmFuZ2VzKSk7CisKKyAgLyogZmlsbCBpdCBpbiAqLworICBjaHAgPSBwcm9wZXJ0eV92YWx1ZTsKKyAgZm9yIChyYW5nZV9uciA9IDA7IHJhbmdlX25yIDwgbnJfcmFuZ2VzOyByYW5nZV9ucisrKSB7CisgICAgY2hwID0gcGFyc2VfYWRkcmVzcyhjdXJyZW50LCBjdXJyZW50LAorCQkJY2hwLCAmcmFuZ2VzW3JhbmdlX25yXS5jaGlsZF9hZGRyZXNzKTsKKyAgICBjaHAgPSBwYXJzZV9hZGRyZXNzKGN1cnJlbnQsIGRldmljZV9wYXJlbnQoY3VycmVudCksCisJCQljaHAsICZyYW5nZXNbcmFuZ2VfbnJdLnBhcmVudF9hZGRyZXNzKTsKKyAgICBjaHAgPSBwYXJzZV9zaXplKGN1cnJlbnQsIGN1cnJlbnQsCisJCSAgICAgY2hwLCAmcmFuZ2VzW3JhbmdlX25yXS5zaXplKTsKKyAgfQorCisgIC8qIGNyZWF0ZSBpdCAqLworICBkZXZpY2VfYWRkX3JhbmdlX2FycmF5X3Byb3BlcnR5KGN1cnJlbnQsIHByb3BlcnR5X25hbWUsIHJhbmdlcywgbnJfcmFuZ2VzKTsKKworICB6ZnJlZShyYW5nZXMpOworfQorCisKKy8qIDxpbnRlZ2VyPiAuLi4gKi8KKworU1RBVElDX0lOTElORV9UUkVFXAorKHZvaWQpCitwYXJzZV9pbnRlZ2VyX3Byb3BlcnR5KGRldmljZSAqY3VycmVudCwKKwkJICAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5X25hbWUsCisJCSAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eV92YWx1ZSkKK3sKKyAgaW50IG5yX2VudHJpZXM7CisgIHVuc2lnbmVkX2NlbGwgd29yZHNbMTAyNF07CisgIC8qIGludGVnZXIgb3IgaW50ZWdlciBhcnJheT8gKi8KKyAgbnJfZW50cmllcyA9IDA7CisgIHdoaWxlICgxKSB7CisgICAgY2hhciAqZW5kOworICAgIHdvcmRzW25yX2VudHJpZXNdID0gc3RydG91bChwcm9wZXJ0eV92YWx1ZSwgJmVuZCwgMCk7CisgICAgaWYgKHByb3BlcnR5X3ZhbHVlID09IGVuZCkKKyAgICAgIGJyZWFrOworICAgIG5yX2VudHJpZXMgKz0gMTsKKyAgICBpZiAobnJfZW50cmllcyAqIHNpemVvZih3b3Jkc1swXSkgPj0gc2l6ZW9mKHdvcmRzKSkKKyAgICAgIGRldmljZV9lcnJvcihjdXJyZW50LCAiYnVmZmVyIG92ZXJmbG93Iik7CisgICAgcHJvcGVydHlfdmFsdWUgPSBlbmQ7CisgIH0KKyAgaWYgKG5yX2VudHJpZXMgPT0gMCkKKyAgICBkZXZpY2VfZXJyb3IoY3VycmVudCwgImVycm9yIHBhcnNpbmcgaW50ZWdlciBwcm9wZXJ0eSAlcyAoJXMpIiwKKyAgICAgICAgICAgICAgICAgcHJvcGVydHlfbmFtZSwgcHJvcGVydHlfdmFsdWUpOworICBlbHNlIGlmIChucl9lbnRyaWVzID09IDEpCisgICAgZGV2aWNlX2FkZF9pbnRlZ2VyX3Byb3BlcnR5KGN1cnJlbnQsIHByb3BlcnR5X25hbWUsIHdvcmRzWzBdKTsKKyAgZWxzZSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG5yX2VudHJpZXM7IGkrKykgeworICAgICAgSDJCRSh3b3Jkc1tpXSk7CisgICAgfQorICAgIC8qIHBlcmhhcGhzIGludGVnZXIgYXJyYXkgcHJvcGVydHkgaXMgYmV0dGVyICovCisgICAgZGV2aWNlX2FkZF9hcnJheV9wcm9wZXJ0eShjdXJyZW50LCBwcm9wZXJ0eV9uYW1lLCB3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih3b3Jkc1swXSkgKiBucl9lbnRyaWVzKTsKKyAgfQorfQorCisKKy8qIDxzdHJpbmc+IC4uLiAqLworCitTVEFUSUNfSU5MSU5FX1RSRUVcCisodm9pZCkKK3BhcnNlX3N0cmluZ19wcm9wZXJ0eShkZXZpY2UgKmN1cnJlbnQsCisJCSAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5X25hbWUsCisJCSAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5X3ZhbHVlKQoreworICBjaGFyICoqc3RyaW5nczsKKyAgY29uc3QgY2hhciAqY2hwOworICBpbnQgbnJfc3RyaW5nczsKKyAgaW50IGFwcHJveF9ucl9zdHJpbmdzOworCisgIC8qIGdldCBhbiBlc3RpbWF0ZSBhcyB0byB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgYnkgY291bnRpbmcgZG91YmxlCisgICAgIHF1b3RlcyAqLworICBhcHByb3hfbnJfc3RyaW5ncyA9IDI7CisgIGZvciAoY2hwID0gcHJvcGVydHlfdmFsdWU7ICpjaHA7IGNocCsrKSB7CisgICAgaWYgKCpjaHAgPT0gJyInKQorICAgICAgYXBwcm94X25yX3N0cmluZ3MrKzsKKyAgfQorICBhcHByb3hfbnJfc3RyaW5ncyA9IChhcHByb3hfbnJfc3RyaW5ncykgLyAyOworCisgIC8qIGNyZWF0ZSBhIHN0cmluZyBidWZmZXIgZm9yIHRoYXQgbWFueSAocGx1cyBhIG51bGwpICovCisgIHN0cmluZ3MgPSAoY2hhcioqKXphbGxvYygoYXBwcm94X25yX3N0cmluZ3MgKyAxKSAqIHNpemVvZihjaGFyKikpOworCisgIC8qIG5vdyBmaW5kIGFsbCB0aGUgc3RyaW5ncyAqLworICBjaHAgPSBwcm9wZXJ0eV92YWx1ZTsKKyAgbnJfc3RyaW5ncyA9IDA7CisgIHdoaWxlICgxKSB7CisKKyAgICAvKiBza2lwIGxlYWRpbmcgc3BhY2UgKi8KKyAgICB3aGlsZSAoKmNocCAhPSAnXDAnICYmIGlzc3BhY2UoKmNocCkpCisgICAgICBjaHAgKz0gMTsKKyAgICBpZiAoKmNocCA9PSAnXDAnKQorICAgICAgYnJlYWs7CisKKyAgICAvKiBjb3B5IGl0IGluICovCisgICAgaWYgKCpjaHAgPT0gJyInKSB7CisgICAgICAvKiBhIHF1b3RlZCBzdHJpbmcgLSB3YXRjaCBmb3IgJ1wnIGV0LmFsLiAqLworICAgICAgLyogZXN0aW1hdGUgdGhlIHNpemUgYW5kIGFsbG9jYXRlIHNwYWNlIGZvciBpdCAqLworICAgICAgaW50IHBvczsKKyAgICAgIGNocCsrOworICAgICAgcG9zID0gMDsKKyAgICAgIHdoaWxlIChjaHBbcG9zXSAhPSAnXDAnICYmIGNocFtwb3NdICE9ICciJykgeworCWlmIChjaHBbcG9zXSA9PSAnXFwnICYmIGNocFtwb3MrMV0gIT0gJ1wwJykKKwkgIHBvcyArPSAyOworCWVsc2UKKwkgIHBvcyArPSAxOworICAgICAgfQorICAgICAgc3RyaW5nc1tucl9zdHJpbmdzXSA9IHphbGxvYyhwb3MgKyAxKTsKKyAgICAgIC8qIGNvcHkgdGhlIHN0cmluZyBvdmVyICovCisgICAgICBwb3MgPSAwOworICAgICAgd2hpbGUgKCpjaHAgIT0gJ1wwJyAmJiAqY2hwICE9ICciJykgeworCWlmICgqY2hwID09ICdcXCcgJiYgKihjaHArMSkgIT0gJ1wwJykgeworCSAgc3RyaW5nc1tucl9zdHJpbmdzXVtwb3NdID0gKihjaHArMSk7CisJICBjaHAgKz0gMjsKKwkgIHBvcysrOworCX0KKwllbHNlIHsKKwkgIHN0cmluZ3NbbnJfc3RyaW5nc11bcG9zXSA9ICpjaHA7CisJICBjaHAgKz0gMTsKKwkgIHBvcysrOworCX0KKyAgICAgIH0KKyAgICAgIGlmICgqY2hwICE9ICdcMCcpCisJY2hwKys7CisgICAgICBzdHJpbmdzW25yX3N0cmluZ3NdW3Bvc10gPSAnXDAnOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIGNvcHkgb3ZlciBhIHNpbmdsZSB1bnF1b3RlZCB0b2tlbiAqLworICAgICAgaW50IGxlbiA9IDA7CisgICAgICB3aGlsZSAoY2hwW2xlbl0gIT0gJ1wwJyAmJiAhaXNzcGFjZShjaHBbbGVuXSkpCisJbGVuKys7CisgICAgICBzdHJpbmdzW25yX3N0cmluZ3NdID0gemFsbG9jKGxlbiArIDEpOworICAgICAgc3RybmNweShzdHJpbmdzW25yX3N0cmluZ3NdLCBjaHAsIGxlbik7CisgICAgICBzdHJpbmdzW25yX3N0cmluZ3NdW2xlbl0gPSAnXDAnOworICAgICAgY2hwICs9IGxlbjsKKyAgICB9CisgICAgbnJfc3RyaW5ncysrOworICAgIGlmIChucl9zdHJpbmdzID4gYXBwcm94X25yX3N0cmluZ3MpCisgICAgICBkZXZpY2VfZXJyb3IoY3VycmVudCwgIlN0cmluZyBwcm9wZXJ0eSAlcyBiYWRseSBmb3JtYXR0ZWQiLAorCQkgICBwcm9wZXJ0eV9uYW1lKTsKKyAgfQorICBBU1NFUlQoc3RyaW5nc1tucl9zdHJpbmdzXSA9PSBOVUxMKTsgLyogZnJvbSB6YWxsb2MgKi8KKworICAvKiBpbnN0YWxsIGl0ICovCisgIGlmIChucl9zdHJpbmdzID09IDApCisgICAgZGV2aWNlX2FkZF9zdHJpbmdfcHJvcGVydHkoY3VycmVudCwgcHJvcGVydHlfbmFtZSwgIiIpOworICBlbHNlIGlmIChucl9zdHJpbmdzID09IDEpCisgICAgZGV2aWNlX2FkZF9zdHJpbmdfcHJvcGVydHkoY3VycmVudCwgcHJvcGVydHlfbmFtZSwgc3RyaW5nc1swXSk7CisgIGVsc2UgeworICAgIGNvbnN0IGNoYXIgKipzcGVjcyA9IChjb25zdCBjaGFyKiopc3RyaW5nczsgLyogc3RvcCBhIGJvZ3VzIGVycm9yICovCisgICAgZGV2aWNlX2FkZF9zdHJpbmdfYXJyYXlfcHJvcGVydHkoY3VycmVudCwgcHJvcGVydHlfbmFtZSwKKwkJCQkgICAgIHNwZWNzLCBucl9zdHJpbmdzKTsKKyAgfQorCisgIC8qIGZsdXNoIHRoZSBjcmVhdGVkIHN0cmluZyAqLworICB3aGlsZSAobnJfc3RyaW5ncyA+IDApIHsKKyAgICBucl9zdHJpbmdzLS07CisgICAgemZyZWUoc3RyaW5nc1tucl9zdHJpbmdzXSk7CisgIH0KKyAgemZyZWUoc3RyaW5ncyk7Cit9CisKKworLyogPHBhdGgtdG8taWhhbmRsZS1kZXZpY2U+ICovCisKK1NUQVRJQ19JTkxJTkVfVFJFRVwKKyh2b2lkKQorcGFyc2VfaWhhbmRsZV9wcm9wZXJ0eShkZXZpY2UgKmN1cnJlbnQsCisJCSAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKwkJICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICBpaGFuZGxlX3J1bnRpbWVfcHJvcGVydHlfc3BlYyBpaGFuZGxlOworCisgIC8qIHBhc3MgdGhlIGZ1bGwgcGF0aCAqLworICBpaGFuZGxlLmZ1bGxfcGF0aCA9IHZhbHVlOworCisgIC8qIHNhdmUgdGhpcyByZWFkeSBmb3IgdGhlIGloYW5kbGUgY3JlYXRlICovCisgIGRldmljZV9hZGRfaWhhbmRsZV9ydW50aW1lX3Byb3BlcnR5KGN1cnJlbnQsIHByb3BlcnR5LAorCQkJCSAgICAgICZpaGFuZGxlKTsKK30KKworCisKK0VYVEVSTl9UUkVFXAorKGRldmljZSAqKQordHJlZV9wYXJzZShkZXZpY2UgKmN1cnJlbnQsCisJICAgY29uc3QgY2hhciAqZm10LAorCSAgIC4uLikKK3sKKyAgY2hhciBkZXZpY2Vfc3BlY2lmaWVyWzEwMjRdOworICBuYW1lX3NwZWNpZmllciBzcGVjOworCisgIC8qIGZvcm1hdCB0aGUgcGF0aCAqLworICB7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICB2c3ByaW50ZihkZXZpY2Vfc3BlY2lmaWVyLCBmbXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOworICAgIGlmIChzdHJsZW4oZGV2aWNlX3NwZWNpZmllcikgPj0gc2l6ZW9mKGRldmljZV9zcGVjaWZpZXIpKQorICAgICAgZXJyb3IoImRldmljZV90cmVlX2FkZF9kZXZpY2VkOiBidWZmZXIgb3ZlcmZsb3dcbiIpOworICB9CisKKyAgLyogY29uc3RydWN0IHRoZSB0cmVlIGRvd24gdG8gdGhlIGZpbmFsIGRldmljZSAqLworICBjdXJyZW50ID0gc3BsaXRfZmlsbF9wYXRoKGN1cnJlbnQsIGRldmljZV9zcGVjaWZpZXIsICZzcGVjKTsKKworICAvKiBpcyB0aGVyZSBhbiBpbnRlcnJ1cHQgc3BlYyAqLworICBpZiAoc3BlYy5wcm9wZXJ0eSA9PSBOVUxMCisgICAgICAmJiBzcGVjLnZhbHVlICE9IE5VTEwpIHsKKyAgICBjaGFyICpvcCA9IHNwbGl0X3ZhbHVlKCZzcGVjKTsKKyAgICBzd2l0Y2ggKG9wWzBdKSB7CisgICAgY2FzZSAnPic6CisgICAgICB7CisJY2hhciAqbXlfcG9ydF9uYW1lID0gc3BsaXRfdmFsdWUoJnNwZWMpOworCWludCBteV9wb3J0OworCWNoYXIgKmRlc3RfcG9ydF9uYW1lID0gc3BsaXRfdmFsdWUoJnNwZWMpOworCWludCBkZXN0X3BvcnQ7CisJbmFtZV9zcGVjaWZpZXIgZGVzdF9zcGVjOworCWNoYXIgKmRlc3RfZGV2aWNlX25hbWUgPSBzcGxpdF92YWx1ZSgmc3BlYyk7CisJZGV2aWNlICpkZXN0OworCS8qIGZpbmQgbXkgbmFtZSAqLworCW15X3BvcnQgPSBkZXZpY2VfaW50ZXJydXB0X2RlY29kZShjdXJyZW50LCBteV9wb3J0X25hbWUsCisJCQkJCSAgb3V0cHV0X3BvcnQpOworCS8qIGZpbmQgdGhlIGRlc3QgZGV2aWNlIGFuZCBwb3J0ICovCisJZGVzdCA9IHNwbGl0X2ZpbGxfcGF0aChjdXJyZW50LCBkZXN0X2RldmljZV9uYW1lLCAmZGVzdF9zcGVjKTsKKwlkZXN0X3BvcnQgPSBkZXZpY2VfaW50ZXJydXB0X2RlY29kZShkZXN0LCBkZXN0X3BvcnRfbmFtZSwKKwkJCQkJICAgIGlucHV0X3BvcnQpOworCS8qIGNvbm5lY3QgdGhlIHR3byAqLworCWRldmljZV9pbnRlcnJ1cHRfYXR0YWNoKGN1cnJlbnQsCisJCQkJbXlfcG9ydCwKKwkJCQlkZXN0LAorCQkJCWRlc3RfcG9ydCwKKwkJCQlwZXJtZW5hbnRfb2JqZWN0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBkZXZpY2VfZXJyb3IoY3VycmVudCwgInVucmVjb25pc2VkIGludGVycnVwdCBzcGVjICVzXG4iLCBzcGVjLnZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qIGlzIHRoZXJlIGEgcHJvcGVydHkgKi8KKyAgaWYgKHNwZWMucHJvcGVydHkgIT0gTlVMTCkgeworICAgIGlmIChzdHJjbXAoc3BlYy52YWx1ZSwgInRydWUiKSA9PSAwKQorICAgICAgZGV2aWNlX2FkZF9ib29sZWFuX3Byb3BlcnR5KGN1cnJlbnQsIHNwZWMucHJvcGVydHksIDEpOworICAgIGVsc2UgaWYgKHN0cmNtcChzcGVjLnZhbHVlLCAiZmFsc2UiKSA9PSAwKQorICAgICAgZGV2aWNlX2FkZF9ib29sZWFuX3Byb3BlcnR5KGN1cnJlbnQsIHNwZWMucHJvcGVydHksIDApOworICAgIGVsc2UgeworICAgICAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpwcm9wZXJ0eTsKKyAgICAgIHN3aXRjaCAoc3BlYy52YWx1ZVswXSkgeworICAgICAgY2FzZSAnKic6CisJcGFyc2VfaWhhbmRsZV9wcm9wZXJ0eShjdXJyZW50LCBzcGVjLnByb3BlcnR5LCBzcGVjLnZhbHVlICsgMSk7CisJYnJlYWs7CisgICAgICBjYXNlICdbJzoKKwl7CisJICB1bnNpZ25lZDggd29yZHNbMTAyNF07CisJICBjaGFyICpjdXJyID0gc3BlYy52YWx1ZSArIDE7CisJICBpbnQgbnJfd29yZHMgPSAwOworCSAgd2hpbGUgKDEpIHsKKwkgICAgY2hhciAqbmV4dDsKKwkgICAgd29yZHNbbnJfd29yZHNdID0gSDJCRV8xKHN0cnRvdWwoY3VyciwgJm5leHQsIDApKTsKKwkgICAgaWYgKGN1cnIgPT0gbmV4dCkKKwkgICAgICBicmVhazsKKwkgICAgY3VyciA9IG5leHQ7CisJICAgIG5yX3dvcmRzICs9IDE7CisJICB9CisJICBkZXZpY2VfYWRkX2FycmF5X3Byb3BlcnR5KGN1cnJlbnQsIHNwZWMucHJvcGVydHksCisJCQkJICAgIHdvcmRzLCBzaXplb2Yod29yZHNbMF0pICogbnJfd29yZHMpOworCX0KKwlicmVhazsKKyAgICAgIGNhc2UgJyInOgorCXBhcnNlX3N0cmluZ19wcm9wZXJ0eShjdXJyZW50LCBzcGVjLnByb3BlcnR5LCBzcGVjLnZhbHVlKTsKKwlicmVhazsKKyAgICAgIGNhc2UgJyEnOgorCXNwZWMudmFsdWUrKzsKKwlwcm9wZXJ0eSA9IHRyZWVfZmluZF9wcm9wZXJ0eShjdXJyZW50LCBzcGVjLnZhbHVlKTsKKwlpZiAocHJvcGVydHkgPT0gTlVMTCkKKwkgIGRldmljZV9lcnJvcihjdXJyZW50LCAicHJvcGVydHkgJXMgbm90IGZvdW5kXG4iLCBzcGVjLnZhbHVlKTsKKwlkZXZpY2VfYWRkX2R1cGxpY2F0ZV9wcm9wZXJ0eShjdXJyZW50LAorCQkJCSAgICAgIHNwZWMucHJvcGVydHksCisJCQkJICAgICAgcHJvcGVydHkpOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlpZiAoc3RyY21wKHNwZWMucHJvcGVydHksICJyZWciKSA9PSAwCisJICAgIHx8IHN0cmNtcChzcGVjLnByb3BlcnR5LCAiYXNzaWduZWQtYWRkcmVzc2VzIikgPT0gMAorCSAgICB8fCBzdHJjbXAoc3BlYy5wcm9wZXJ0eSwgImFsdGVybmF0ZS1yZWciKSA9PSAwKXsKKwkgIHBhcnNlX3JlZ19wcm9wZXJ0eShjdXJyZW50LCBzcGVjLnByb3BlcnR5LCBzcGVjLnZhbHVlKTsKKwl9CisJZWxzZSBpZiAoc3RyY21wKHNwZWMucHJvcGVydHksICJyYW5nZXMiKSA9PSAwKSB7CisJICBwYXJzZV9yYW5nZXNfcHJvcGVydHkoY3VycmVudCwgc3BlYy5wcm9wZXJ0eSwgc3BlYy52YWx1ZSk7CisJfQorCWVsc2UgaWYgKGlzZGlnaXQoc3BlYy52YWx1ZVswXSkKKwkJIHx8IChzcGVjLnZhbHVlWzBdID09ICctJyAmJiBpc2RpZ2l0KHNwZWMudmFsdWVbMV0pKQorCQkgfHwgKHNwZWMudmFsdWVbMF0gPT0gJysnICYmIGlzZGlnaXQoc3BlYy52YWx1ZVsxXSkpKSB7CisJICBwYXJzZV9pbnRlZ2VyX3Byb3BlcnR5KGN1cnJlbnQsIHNwZWMucHJvcGVydHksIHNwZWMudmFsdWUpOworCX0KKwllbHNlCisJICBwYXJzZV9zdHJpbmdfcHJvcGVydHkoY3VycmVudCwgc3BlYy5wcm9wZXJ0eSwgc3BlYy52YWx1ZSk7CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBjdXJyZW50OworfQorCisKK0lOTElORV9UUkVFXAorKHZvaWQpCit0cmVlX3RyYXZlcnNlKGRldmljZSAqcm9vdCwKKwkgICAgICB0cmVlX3RyYXZlcnNlX2Z1bmN0aW9uICpwcmVmaXgsCisJICAgICAgdHJlZV90cmF2ZXJzZV9mdW5jdGlvbiAqcG9zdGZpeCwKKwkgICAgICB2b2lkICpkYXRhKQoreworICBkZXZpY2UgKmNoaWxkOworICBpZiAocHJlZml4ICE9IE5VTEwpCisgICAgcHJlZml4KHJvb3QsIGRhdGEpOworICBmb3IgKGNoaWxkID0gZGV2aWNlX2NoaWxkKHJvb3QpOworICAgICAgIGNoaWxkICE9IE5VTEw7CisgICAgICAgY2hpbGQgPSBkZXZpY2Vfc2libGluZyhjaGlsZCkpIHsKKyAgICB0cmVlX3RyYXZlcnNlKGNoaWxkLCBwcmVmaXgsIHBvc3RmaXgsIGRhdGEpOworICB9CisgIGlmIChwb3N0Zml4ICE9IE5VTEwpCisgICAgcG9zdGZpeChyb290LCBkYXRhKTsKK30KKworCitTVEFUSUNfSU5MSU5FX1RSRUVcCisodm9pZCkKK3ByaW50X2FkZHJlc3MoZGV2aWNlICpidXMsCisJICAgICAgY29uc3QgZGV2aWNlX3VuaXQgKnBoeXMpCit7CisgIGNoYXIgdW5pdFszMl07CisgIGRldmljZV9lbmNvZGVfdW5pdChidXMsIHBoeXMsIHVuaXQsIHNpemVvZih1bml0KSk7CisgIHByaW50Zl9maWx0ZXJlZCgiICVzIiwgdW5pdCk7Cit9CisKK1NUQVRJQ19JTkxJTkVfVFJFRVwKKyh2b2lkKQorcHJpbnRfc2l6ZShkZXZpY2UgKmJ1cywKKwkgICBjb25zdCBkZXZpY2VfdW5pdCAqc2l6ZSkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplLT5ucl9jZWxsczsgaSsrKQorICAgIGlmIChzaXplLT5jZWxsc1tpXSAhPSAwKQorICAgICAgYnJlYWs7CisgIGlmIChpIDwgc2l6ZS0+bnJfY2VsbHMpIHsKKyAgICBwcmludGZfZmlsdGVyZWQoIiAweCVseCIsICh1bnNpZ25lZCBsb25nKXNpemUtPmNlbGxzW2ldKTsKKyAgICBpKys7CisgICAgZm9yICg7IGkgPCBzaXplLT5ucl9jZWxsczsgaSsrKQorICAgICAgcHJpbnRmX2ZpbHRlcmVkKCIsMHglbHgiLCAodW5zaWduZWQgbG9uZylzaXplLT5jZWxsc1tpXSk7CisgIH0KKyAgZWxzZQorICAgIHByaW50Zl9maWx0ZXJlZCgiIDAiKTsKK30KKworU1RBVElDX0lOTElORV9UUkVFXAorKHZvaWQpCitwcmludF9yZWdfcHJvcGVydHkoZGV2aWNlICptZSwKKwkJICAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpwcm9wZXJ0eSkKK3sKKyAgaW50IHJlZ19ucjsKKyAgcmVnX3Byb3BlcnR5X3NwZWMgcmVnOworICBmb3IgKHJlZ19uciA9IDA7CisgICAgICAgZGV2aWNlX2ZpbmRfcmVnX2FycmF5X3Byb3BlcnR5KG1lLCBwcm9wZXJ0eS0+bmFtZSwgcmVnX25yLCAmcmVnKTsKKyAgICAgICByZWdfbnIrKykgeworICAgIHByaW50X2FkZHJlc3MoZGV2aWNlX3BhcmVudChtZSksICZyZWcuYWRkcmVzcyk7CisgICAgcHJpbnRfc2l6ZShtZSwgJnJlZy5zaXplKTsKKyAgfQorfQorCitTVEFUSUNfSU5MSU5FX1RSRUVcCisodm9pZCkKK3ByaW50X3Jhbmdlc19wcm9wZXJ0eShkZXZpY2UgKm1lLAorCQkgICAgICBjb25zdCBkZXZpY2VfcHJvcGVydHkgKnByb3BlcnR5KQoreworICBpbnQgcmFuZ2VfbnI7CisgIHJhbmdlX3Byb3BlcnR5X3NwZWMgcmFuZ2U7CisgIGZvciAocmFuZ2VfbnIgPSAwOworICAgICAgIGRldmljZV9maW5kX3JhbmdlX2FycmF5X3Byb3BlcnR5KG1lLCBwcm9wZXJ0eS0+bmFtZSwgcmFuZ2VfbnIsICZyYW5nZSk7CisgICAgICAgcmFuZ2VfbnIrKykgeworICAgIHByaW50X2FkZHJlc3MobWUsICZyYW5nZS5jaGlsZF9hZGRyZXNzKTsKKyAgICBwcmludF9hZGRyZXNzKGRldmljZV9wYXJlbnQobWUpLCAmcmFuZ2UucGFyZW50X2FkZHJlc3MpOworICAgIHByaW50X3NpemUobWUsICZyYW5nZS5zaXplKTsKKyAgfQorfQorCitTVEFUSUNfSU5MSU5FX1RSRUVcCisodm9pZCkKK3ByaW50X3N0cmluZyhjb25zdCBjaGFyICpzdHJpbmcpCit7CisgIHByaW50Zl9maWx0ZXJlZCgiIFwiIik7CisgIHdoaWxlICgqc3RyaW5nICE9ICdcMCcpIHsKKyAgICBzd2l0Y2ggKCpzdHJpbmcpIHsKKyAgICBjYXNlICciJzoKKyAgICAgIHByaW50Zl9maWx0ZXJlZCgiXFxcIiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXFwnOgorICAgICAgcHJpbnRmX2ZpbHRlcmVkKCJcXFxcIik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcHJpbnRmX2ZpbHRlcmVkKCIlYyIsICpzdHJpbmcpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHN0cmluZysrOworICB9CisgIHByaW50Zl9maWx0ZXJlZCgiXCIiKTsKK30KKworU1RBVElDX0lOTElORV9UUkVFXAorKHZvaWQpCitwcmludF9zdHJpbmdfYXJyYXlfcHJvcGVydHkoZGV2aWNlICptZSwKKwkJCSAgICBjb25zdCBkZXZpY2VfcHJvcGVydHkgKnByb3BlcnR5KQoreworICBpbnQgbnI7CisgIHN0cmluZ19wcm9wZXJ0eV9zcGVjIHN0cmluZzsKKyAgZm9yIChuciA9IDA7CisgICAgICAgZGV2aWNlX2ZpbmRfc3RyaW5nX2FycmF5X3Byb3BlcnR5KG1lLCBwcm9wZXJ0eS0+bmFtZSwgbnIsICZzdHJpbmcpOworICAgICAgIG5yKyspIHsKKyAgICBwcmludF9zdHJpbmcoc3RyaW5nKTsKKyAgfQorfQorCitTVEFUSUNfSU5MSU5FX1RSRUVcCisodm9pZCkKK3ByaW50X3Byb3BlcnRpZXMoZGV2aWNlICptZSkKK3sKKyAgY29uc3QgZGV2aWNlX3Byb3BlcnR5ICpwcm9wZXJ0eTsKKyAgZm9yIChwcm9wZXJ0eSA9IGRldmljZV9maW5kX3Byb3BlcnR5KG1lLCBOVUxMKTsKKyAgICAgICBwcm9wZXJ0eSAhPSBOVUxMOworICAgICAgIHByb3BlcnR5ID0gZGV2aWNlX25leHRfcHJvcGVydHkocHJvcGVydHkpKSB7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCIlcy8lcyIsIGRldmljZV9wYXRoKG1lKSwgcHJvcGVydHktPm5hbWUpOworICAgIGlmIChwcm9wZXJ0eS0+b3JpZ2luYWwgIT0gTlVMTCkgeworICAgICAgcHJpbnRmX2ZpbHRlcmVkKCIgISIpOworICAgICAgcHJpbnRmX2ZpbHRlcmVkKCIlcy8lcyIsIAorCQkgICAgICBkZXZpY2VfcGF0aChwcm9wZXJ0eS0+b3JpZ2luYWwtPm93bmVyKSwKKwkJICAgICAgcHJvcGVydHktPm9yaWdpbmFsLT5uYW1lKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzd2l0Y2ggKHByb3BlcnR5LT50eXBlKSB7CisgICAgICBjYXNlIGFycmF5X3Byb3BlcnR5OgorCWlmICgocHJvcGVydHktPnNpemVvZl9hcnJheSAlIHNpemVvZihzaWduZWRfY2VsbCkpID09IDApIHsKKwkgIHVuc2lnbmVkX2NlbGwgKncgPSAodW5zaWduZWRfY2VsbCopcHJvcGVydHktPmFycmF5OworCSAgaW50IGNlbGxfbnI7CisJICBmb3IgKGNlbGxfbnIgPSAwOworCSAgICAgICBjZWxsX25yIDwgKHByb3BlcnR5LT5zaXplb2ZfYXJyYXkgLyBzaXplb2YodW5zaWduZWRfY2VsbCkpOworCSAgICAgICBjZWxsX25yKyspIHsKKwkgICAgcHJpbnRmX2ZpbHRlcmVkKCIgMHglbHgiLCAodW5zaWduZWQgbG9uZylCRTJIX2NlbGwod1tjZWxsX25yXSkpOworCSAgfQorCX0KKwllbHNlIHsKKwkgIHVuc2lnbmVkOCAqdyA9ICh1bnNpZ25lZDgqKXByb3BlcnR5LT5hcnJheTsKKwkgIHByaW50Zl9maWx0ZXJlZCgiIFsiKTsKKwkgIHdoaWxlICgoY2hhciopdyAtIChjaGFyKilwcm9wZXJ0eS0+YXJyYXkgPCBwcm9wZXJ0eS0+c2l6ZW9mX2FycmF5KSB7CisJICAgIHByaW50Zl9maWx0ZXJlZCgiIDB4JTJ4IiwgQkUySF8xKCp3KSk7CisJICAgIHcrKzsKKwkgIH0KKwl9CisJYnJlYWs7CisgICAgICBjYXNlIGJvb2xlYW5fcHJvcGVydHk6CisJeworCSAgaW50IGIgPSBkZXZpY2VfZmluZF9ib29sZWFuX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eS0+bmFtZSk7CisJICBwcmludGZfZmlsdGVyZWQoIiAlcyIsIGIgPyAidHJ1ZSIgIDogImZhbHNlIik7CisJfQorCWJyZWFrOworICAgICAgY2FzZSBpaGFuZGxlX3Byb3BlcnR5OgorCXsKKwkgIGlmIChwcm9wZXJ0eS0+YXJyYXkgIT0gTlVMTCkgeworCSAgICBkZXZpY2VfaW5zdGFuY2UgKmluc3RhbmNlID0gZGV2aWNlX2ZpbmRfaWhhbmRsZV9wcm9wZXJ0eShtZSwgcHJvcGVydHktPm5hbWUpOworCSAgICBwcmludGZfZmlsdGVyZWQoIiAqJXMiLCBkZXZpY2VfaW5zdGFuY2VfcGF0aChpbnN0YW5jZSkpOworCSAgfQorCSAgZWxzZSB7CisJICAgIC8qIG5vdCB5ZXQgaW5pdGlhbGl6ZWQsIGFzayB0aGUgZGV2aWNlIGZvciB0aGUgcGF0aCAqLworCSAgICBpaGFuZGxlX3J1bnRpbWVfcHJvcGVydHlfc3BlYyBzcGVjOworCSAgICBkZXZpY2VfZmluZF9paGFuZGxlX3J1bnRpbWVfcHJvcGVydHkobWUsIHByb3BlcnR5LT5uYW1lLCAmc3BlYyk7CisJICAgIHByaW50Zl9maWx0ZXJlZCgiIColcyIsIHNwZWMuZnVsbF9wYXRoKTsKKwkgIH0KKwl9CisJYnJlYWs7CisgICAgICBjYXNlIGludGVnZXJfcHJvcGVydHk6CisJeworCSAgdW5zaWduZWRfd29yZCB3ID0gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShtZSwgcHJvcGVydHktPm5hbWUpOworCSAgcHJpbnRmX2ZpbHRlcmVkKCIgMHglbHgiLCAodW5zaWduZWQgbG9uZyl3KTsKKwl9CisJYnJlYWs7CisgICAgICBjYXNlIHJhbmdlX2FycmF5X3Byb3BlcnR5OgorCXByaW50X3Jhbmdlc19wcm9wZXJ0eShtZSwgcHJvcGVydHkpOworCWJyZWFrOworICAgICAgY2FzZSByZWdfYXJyYXlfcHJvcGVydHk6CisJcHJpbnRfcmVnX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eSk7CisJYnJlYWs7CisgICAgICBjYXNlIHN0cmluZ19wcm9wZXJ0eToKKwl7CisJICBjb25zdCBjaGFyICpzID0gZGV2aWNlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5KG1lLCBwcm9wZXJ0eS0+bmFtZSk7CisJICBwcmludF9zdHJpbmcocyk7CisJfQorCWJyZWFrOworICAgICAgY2FzZSBzdHJpbmdfYXJyYXlfcHJvcGVydHk6CisJcHJpbnRfc3RyaW5nX2FycmF5X3Byb3BlcnR5KG1lLCBwcm9wZXJ0eSk7CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHByaW50Zl9maWx0ZXJlZCgiXG4iKTsKKyAgfQorfQorCitTVEFUSUNfSU5MSU5FX1RSRUVcCisodm9pZCkKK3ByaW50X2ludGVycnVwdHMoZGV2aWNlICptZSwKKwkJIGludCBteV9wb3J0LAorCQkgZGV2aWNlICpkZXN0LAorCQkgaW50IGRlc3RfcG9ydCwKKwkJIHZvaWQgKmlnbm9yZV9vcl9udWxsKQoreworICBjaGFyIHNyY1szMl07CisgIGNoYXIgZHN0WzMyXTsKKyAgZGV2aWNlX2ludGVycnVwdF9lbmNvZGUobWUsIG15X3BvcnQsIHNyYywgc2l6ZW9mKHNyYyksIG91dHB1dF9wb3J0KTsKKyAgZGV2aWNlX2ludGVycnVwdF9lbmNvZGUoZGVzdCwgZGVzdF9wb3J0LCBkc3QsIHNpemVvZihkc3QpLCBpbnB1dF9wb3J0KTsKKyAgcHJpbnRmX2ZpbHRlcmVkKCIlcyA+ICVzICVzICVzXG4iLAorCQkgIGRldmljZV9wYXRoKG1lKSwKKwkJICBzcmMsIGRzdCwKKwkJICBkZXZpY2VfcGF0aChkZXN0KSk7Cit9CisKK1NUQVRJQ19JTkxJTkVfVFJFRVwKKyh2b2lkKQorcHJpbnRfZGV2aWNlKGRldmljZSAqbWUsCisJICAgICB2b2lkICppZ25vcmVfb3JfbnVsbCkKK3sKKyAgcHJpbnRmX2ZpbHRlcmVkKCIlc1xuIiwgZGV2aWNlX3BhdGgobWUpKTsKKyAgcHJpbnRfcHJvcGVydGllcyhtZSk7CisgIGRldmljZV9pbnRlcnJ1cHRfdHJhdmVyc2UobWUsIHByaW50X2ludGVycnVwdHMsIE5VTEwpOworfQorCitJTkxJTkVfVFJFRVwKKyh2b2lkKQordHJlZV9wcmludChkZXZpY2UgKnJvb3QpCit7CisgIHRyZWVfdHJhdmVyc2Uocm9vdCwKKwkJcHJpbnRfZGV2aWNlLCBOVUxMLAorCQlOVUxMKTsKK30KKworCitJTkxJTkVfVFJFRVwKKyh2b2lkKQordHJlZV91c2FnZShpbnQgdmVyYm9zZSkKK3sKKyAgaWYgKHZlcmJvc2UgPT0gMSkgeworICAgIHByaW50Zl9maWx0ZXJlZCgiXG4iKTsKKyAgICBwcmludGZfZmlsdGVyZWQoIkEgZGV2aWNlL3Byb3BlcnR5IHNwZWNpZmllciBoYXMgdGhlIGZvcm06XG4iKTsKKyAgICBwcmludGZfZmlsdGVyZWQoIlxuIik7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCIgIC9wYXRoL3RvL2EvZGV2aWNlIFsgcHJvcGVydHktdmFsdWUgXVxuIik7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOworICAgIHByaW50Zl9maWx0ZXJlZCgiYW5kIGEgcG9zc2libGUgZGV2aWNlIGlzXG4iKTsKKyAgICBwcmludGZfZmlsdGVyZWQoIlxuIik7CisgIH0KKyAgaWYgKHZlcmJvc2UgPiAxKSB7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOworICAgIHByaW50Zl9maWx0ZXJlZCgiQSBkZXZpY2UvcHJvcGVydHkgc3BlY2lmaWVyICg8c3BlYz4pIGhhcyB0aGUgZm9ybWF0OlxuIik7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOworICAgIHByaW50Zl9maWx0ZXJlZCgiICA8c3BlYz4gOjo9IDxwYXRoPiBbIDx2YWx1ZT4gXSA7XG4iKTsKKyAgICBwcmludGZfZmlsdGVyZWQoIiAgPHBhdGg+IDo6PSB7IDxwcmVmaXg+IH0geyA8bm9kZT4gXCIvXCIgfSA8bm9kZT4gO1xuIik7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCIgIDxwcmVmaXg+IDo6PSAoIHwgXCIvXCIgfCBcIi4uL1wiIHwgXCIuL1wiICkgO1xuIik7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCIgIDxub2RlPiA6Oj0gPG5hbWU+IFsgXCJAXCIgPHVuaXQ+IF0gWyBcIjpcIiA8YXJncz4gXSA7XG4iKTsKKyAgICBwcmludGZfZmlsdGVyZWQoIiAgPHVuaXQ+IDo6PSA8bnVtYmVyPiB7IFwiLFwiIDxudW1iZXI+IH0gO1xuIik7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOworICAgIHByaW50Zl9maWx0ZXJlZCgiV2hlcmU6XG4iKTsKKyAgICBwcmludGZfZmlsdGVyZWQoIlxuIik7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCIgIDxuYW1lPiAgaXMgdGhlIG5hbWUgb2YgYSBkZXZpY2UgKGxpc3QgYmVsb3cpXG4iKTsKKyAgICBwcmludGZfZmlsdGVyZWQoIiAgPHVuaXQ+ICBpcyB0aGUgdW5pdC1hZGRyZXNzIHJlbGF0aXZlIHRvIHRoZSBwYXJlbnQgYnVzXG4iKTsKKyAgICBwcmludGZfZmlsdGVyZWQoIiAgPGFyZ3M+ICBhZGRpdGlvbmFsIGFyZ3VtZW50cyB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIGRldmljZVxuIik7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCIgIDx2YWx1ZT4gOjo9ICggPG51bWJlcj4gIyBpbnRlZ2VyIHByb3BlcnR5XG4iKTsKKyAgICBwcmludGZfZmlsdGVyZWQoIiAgICAgICAgICAgICAgfCBcIltcIiB7IDxudW1iZXI+IH0gIyBhcnJheSBwcm9wZXJ0eSAoYnl0ZSlcbiIpOworICAgIHByaW50Zl9maWx0ZXJlZCgiICAgICAgICAgICAgICB8IFwie1wiIHsgPG51bWJlcj4gfSAjIGFycmF5IHByb3BlcnR5IChjZWxsKVxuIik7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCIgICAgICAgICAgICAgIHwgWyBcInRydWVcIiB8IFwiZmFsc2VcIiBdICMgYm9vbGVhbiBwcm9wZXJ0eVxuIik7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCIgICAgICAgICAgICAgIHwgXCIqXCIgPHBhdGg+ICMgaWhhbmRsZSBwcm9wZXJ0eVxuIik7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCIgICAgICAgICAgICAgIHwgXCIhXCIgPHBhdGg+ICMgY29weSBwcm9wZXJ0eVxuIik7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCIgICAgICAgICAgICAgIHwgXCI+XCIgWyA8bnVtYmVyPiBdIDxwYXRoPiAjIGF0dGFjaCBpbnRlcnJ1cHRcbiIpOworICAgIHByaW50Zl9maWx0ZXJlZCgiICAgICAgICAgICAgICB8IFwiPFwiIDxwYXRoPiAjIGF0dGFjaCBjaGlsZCBpbnRlcnJ1cHRcbiIpOworICAgIHByaW50Zl9maWx0ZXJlZCgiICAgICAgICAgICAgICB8IFwiXFxcIlwiIDx0ZXh0PiAjIHN0cmluZyBwcm9wZXJ0eVxuIik7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCIgICAgICAgICAgICAgIHwgPHRleHQ+ICMgc3RyaW5nIHByb3BlcnR5XG4iKTsKKyAgICBwcmludGZfZmlsdGVyZWQoIiAgICAgICAgICAgICAgKSA7XG4iKTsKKyAgICBwcmludGZfZmlsdGVyZWQoIlxuIik7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCJBbmQgdGhlIGZvbGxvd2luZyBhcmUgdmFsaWQgZGV2aWNlIG5hbWVzOlxuIik7CisgICAgcHJpbnRmX2ZpbHRlcmVkKCJcbiIpOworICB9Cit9CisKKworCitJTkxJTkVfVFJFRVwKKyhkZXZpY2VfaW5zdGFuY2UgKikKK3RyZWVfaW5zdGFuY2UoZGV2aWNlICpyb290LAorCSAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9zcGVjaWZpZXIpCit7CisgIC8qIGZpbmQgdGhlIGRldmljZSBub2RlICovCisgIGRldmljZSAqbWU7CisgIG5hbWVfc3BlY2lmaWVyIHNwZWM7CisgIGlmICghc3BsaXRfZGV2aWNlX3NwZWNpZmllcihyb290LCBkZXZpY2Vfc3BlY2lmaWVyLCAmc3BlYykpCisgICAgcmV0dXJuIE5VTEw7CisgIG1lID0gc3BsaXRfZmluZF9kZXZpY2Uocm9vdCwgJnNwZWMpOworICBpZiAoc3BlYy5uYW1lICE9IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIC8qIGNyZWF0ZSB0aGUgaW5zdGFuY2UgKi8KKyAgcmV0dXJuIGRldmljZV9jcmVhdGVfaW5zdGFuY2UobWUsIGRldmljZV9zcGVjaWZpZXIsIHNwZWMubGFzdF9hcmdzKTsKK30KKworCitJTkxJTkVfVFJFRVwKKyhkZXZpY2UgKikKK3RyZWVfZmluZF9kZXZpY2UoZGV2aWNlICpyb290LAorCQkgY29uc3QgY2hhciAqcGF0aF90b19kZXZpY2UpCit7CisgIGRldmljZSAqbm9kZTsKKyAgbmFtZV9zcGVjaWZpZXIgc3BlYzsKKworICAvKiBwYXJzZSB0aGUgcGF0aCAqLworICBzcGxpdF9kZXZpY2Vfc3BlY2lmaWVyKHJvb3QsIHBhdGhfdG9fZGV2aWNlLCAmc3BlYyk7CisgIGlmIChzcGVjLnZhbHVlICE9IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7IC8qIHNvbWV0aGluZyB3aWVyZCAqLworCisgIC8qIG5vdyBmaW5kIGl0ICovCisgIG5vZGUgPSBzcGxpdF9maW5kX2RldmljZShyb290LCAmc3BlYyk7CisgIGlmIChzcGVjLm5hbWUgIT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsgLyogbm90IGEgbGVhZiAqLworCisgIHJldHVybiBub2RlOworfQorCisKK0lOTElORV9UUkVFXAorKGNvbnN0IGRldmljZV9wcm9wZXJ0eSAqKQordHJlZV9maW5kX3Byb3BlcnR5KGRldmljZSAqcm9vdCwKKwkJICAgY29uc3QgY2hhciAqcGF0aF90b19wcm9wZXJ0eSkKK3sKKyAgbmFtZV9zcGVjaWZpZXIgc3BlYzsKKyAgaWYgKCFzcGxpdF9wcm9wZXJ0eV9zcGVjaWZpZXIocm9vdCwgcGF0aF90b19wcm9wZXJ0eSwgJnNwZWMpKQorICAgIGRldmljZV9lcnJvcihyb290LCAiSW52YWxpZCBwcm9wZXJ0eSBwYXRoICVzIiwgcGF0aF90b19wcm9wZXJ0eSk7CisgIHJvb3QgPSBzcGxpdF9maW5kX2RldmljZShyb290LCAmc3BlYyk7CisgIHJldHVybiBkZXZpY2VfZmluZF9wcm9wZXJ0eShyb290LCBzcGVjLnByb3BlcnR5KTsKK30KKworSU5MSU5FX1RSRUVcCisoaW50KQordHJlZV9maW5kX2Jvb2xlYW5fcHJvcGVydHkoZGV2aWNlICpyb290LAorCQkJICAgY29uc3QgY2hhciAqcGF0aF90b19wcm9wZXJ0eSkKK3sKKyAgbmFtZV9zcGVjaWZpZXIgc3BlYzsKKyAgaWYgKCFzcGxpdF9wcm9wZXJ0eV9zcGVjaWZpZXIocm9vdCwgcGF0aF90b19wcm9wZXJ0eSwgJnNwZWMpKQorICAgIGRldmljZV9lcnJvcihyb290LCAiSW52YWxpZCBwcm9wZXJ0eSBwYXRoICVzIiwgcGF0aF90b19wcm9wZXJ0eSk7CisgIHJvb3QgPSBzcGxpdF9maW5kX2RldmljZShyb290LCAmc3BlYyk7CisgIHJldHVybiBkZXZpY2VfZmluZF9ib29sZWFuX3Byb3BlcnR5KHJvb3QsIHNwZWMucHJvcGVydHkpOworfQorCitJTkxJTkVfVFJFRVwKKyhzaWduZWRfY2VsbCkKK3RyZWVfZmluZF9pbnRlZ2VyX3Byb3BlcnR5KGRldmljZSAqcm9vdCwKKwkJCSAgIGNvbnN0IGNoYXIgKnBhdGhfdG9fcHJvcGVydHkpCit7CisgIG5hbWVfc3BlY2lmaWVyIHNwZWM7CisgIGlmICghc3BsaXRfcHJvcGVydHlfc3BlY2lmaWVyKHJvb3QsIHBhdGhfdG9fcHJvcGVydHksICZzcGVjKSkKKyAgICBkZXZpY2VfZXJyb3Iocm9vdCwgIkludmFsaWQgcHJvcGVydHkgcGF0aCAlcyIsIHBhdGhfdG9fcHJvcGVydHkpOworICByb290ID0gc3BsaXRfZmluZF9kZXZpY2Uocm9vdCwgJnNwZWMpOworICByZXR1cm4gZGV2aWNlX2ZpbmRfaW50ZWdlcl9wcm9wZXJ0eShyb290LCBzcGVjLnByb3BlcnR5KTsKK30KKworSU5MSU5FX1RSRUVcCisoZGV2aWNlX2luc3RhbmNlICopCit0cmVlX2ZpbmRfaWhhbmRsZV9wcm9wZXJ0eShkZXZpY2UgKnJvb3QsCisJCQkgICBjb25zdCBjaGFyICpwYXRoX3RvX3Byb3BlcnR5KQoreworICBuYW1lX3NwZWNpZmllciBzcGVjOworICBpZiAoIXNwbGl0X3Byb3BlcnR5X3NwZWNpZmllcihyb290LCBwYXRoX3RvX3Byb3BlcnR5LCAmc3BlYykpCisgICAgZGV2aWNlX2Vycm9yKHJvb3QsICJJbnZhbGlkIHByb3BlcnR5IHBhdGggJXMiLCBwYXRoX3RvX3Byb3BlcnR5KTsKKyAgcm9vdCA9IHNwbGl0X2ZpbmRfZGV2aWNlKHJvb3QsICZzcGVjKTsKKyAgcmV0dXJuIGRldmljZV9maW5kX2loYW5kbGVfcHJvcGVydHkocm9vdCwgc3BlYy5wcm9wZXJ0eSk7Cit9CisKK0lOTElORV9UUkVFXAorKGNvbnN0IGNoYXIgKikKK3RyZWVfZmluZF9zdHJpbmdfcHJvcGVydHkoZGV2aWNlICpyb290LAorCQkJICBjb25zdCBjaGFyICpwYXRoX3RvX3Byb3BlcnR5KQoreworICBuYW1lX3NwZWNpZmllciBzcGVjOworICBpZiAoIXNwbGl0X3Byb3BlcnR5X3NwZWNpZmllcihyb290LCBwYXRoX3RvX3Byb3BlcnR5LCAmc3BlYykpCisgICAgZGV2aWNlX2Vycm9yKHJvb3QsICJJbnZhbGlkIHByb3BlcnR5IHBhdGggJXMiLCBwYXRoX3RvX3Byb3BlcnR5KTsKKyAgcm9vdCA9IHNwbGl0X2ZpbmRfZGV2aWNlKHJvb3QsICZzcGVjKTsKKyAgcmV0dXJuIGRldmljZV9maW5kX3N0cmluZ19wcm9wZXJ0eShyb290LCBzcGVjLnByb3BlcnR5KTsKK30KKworCisjZW5kaWYgLyogX1BBUlNFX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL3RyZWUuaCBiL3NpbS9wcGMvdHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTkwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL3RyZWUuaApAQCAtMCwwICsxLDEzOSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfVFJFRV9IXworI2RlZmluZSBfVFJFRV9IXworCisjaWZuZGVmIElOTElORV9UUkVFCisjZGVmaW5lIElOTElORV9UUkVFCisjZW5kaWYKKworLyogQ29uc3RydWN0aW5nIHRoZSBkZXZpY2UgdHJlZToKKworICAgVGhlIGluaXRpYWwgZGV2aWNlIHRyZWUgcG9wdWxhdGVkIHdpdGggZGV2aWNlcyBhbmQgYmFzaWMgcHJvcGVydGllcworICAgaXMgY3JlYXRlZCB1c2luZyB0aGUgZnVuY3Rpb24gPDxkZXZpY2VfdHJlZV9hZGRfcGFyc2VkKCk+Pi4gIFRoaXMKKyAgIGZ1bmN0aW9uIHBhcnNlcyBhIFBTSU0gZGV2aWNlIHNwZWNpZmljYXRpb24gYW5kIHVzZXMgaXQgdG8gcG9wdWxhdGUKKyAgIHRoZSB0cmVlIGFjY29yZGluZ2x5LgorCisgICBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgYSBwcmludGYgc3R5bGUgZm9ybWF0dGVkIHN0cmluZyBhcyB0aGUKKyAgIGFyZ3VtZW50IHRoYXQgZGVzY3JpYmVzIHRoZSBlbnRyeS4gIEFueSBwcm9wZXJ0aWVzIG9yIGludGVycnVwdAorICAgY29ubmVjdGlvbnMgYWRkZWQgdG8gYSBkZXZpY2UgdHJlZSB1c2luZyB0aGlzIGZ1bmN0aW9uIGFyZSBtYXJrZWQKKyAgIGFzIGhhdmluZyBhIHBlcm1lbmFudCBkaXNwb3NpdGlvbi4gIFdoZW4gdGhlIHRyZWUgaXMgKHJlKQorICAgaW5pdGlhbGl6ZWQgdGhleSB3aWxsIGJlIHJlc3RvcmVkIHRvIHRoZWlyIGluaXRpYWwgdmFsdWUuCisKKyAgICovCisKK0VYVEVSTl9UUkVFXAorKGRldmljZSAqKSB0cmVlX3BhcnNlCisoZGV2aWNlICpyb290LAorIGNvbnN0IGNoYXIgKmZtdCwKKyAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKKworCitJTkxJTkVfVFJFRVwKKyh2b2lkKSB0cmVlX3VzYWdlCisoaW50IHZlcmJvc2UpOworCitJTkxJTkVfVFJFRVwKKyh2b2lkKSB0cmVlX3ByaW50CisoZGV2aWNlICpyb290KTsKKworSU5MSU5FX1RSRUVcCisoZGV2aWNlX2luc3RhbmNlKikgdHJlZV9pbnN0YW5jZQorKGRldmljZSAqcm9vdCwKKyBjb25zdCBjaGFyICpkZXZpY2Vfc3BlY2lmaWVyKTsKKworCisvKiBUcmVlIHRyYXZlcnNhbDo6CisKKyAgIFRoZSBlbnRpcmUgZGV2aWNlIHRyZWUgY2FuIGJlIHRyYXZlcnNlZCB1c2luZyB0aGUKKyAgIDw8ZGV2aWNlX3RyZWVfdHJhdmVyc2UoKT4+IGZ1bmN0aW9uLiAgVGhlIHRyYXZlcnNhbCBjYW4gYmUgaW4KKyAgIGVpdGhlciBwcmUtIG9yIHBvc3RmaXggb3JkZXIuCisKKyAgICovCisKK3R5cGVkZWYgdm9pZCAodHJlZV90cmF2ZXJzZV9mdW5jdGlvbikKKyAgICAgKGRldmljZSAqZGV2aWNlLAorICAgICAgdm9pZCAqZGF0YSk7CisKK0lOTElORV9ERVZJQ0VcCisodm9pZCkgdHJlZV90cmF2ZXJzZQorKGRldmljZSAqcm9vdCwKKyB0cmVlX3RyYXZlcnNlX2Z1bmN0aW9uICpwcmVmaXgsCisgdHJlZV90cmF2ZXJzZV9mdW5jdGlvbiAqcG9zdGZpeCwKKyB2b2lkICpkYXRhKTsKKworCisvKiBUcmVlIGxvb2t1cDo6CisKKyAgIFRoZSBmdW5jdGlvbiA8PHRyZWVfZmluZF9kZXZpY2UoKT4+IHdpbGwgYXR0ZW1wdCB0byBsb2NhdGUKKyAgIHRoZSBzcGVjaWZpZWQgZGV2aWNlIHdpdGhpbiB0aGUgdHJlZS4gIElmIHRoZSBkZXZpY2UgaXMgbm90IGZvdW5kIGEKKyAgIE5VTEwgZGV2aWNlIGlzIHJldHVybmVkLgorCisgICAqLworCitJTkxJTkVfVFJFRVwKKyhkZXZpY2UgKikgdHJlZV9maW5kX2RldmljZQorKGRldmljZSAqcm9vdCwKKyBjb25zdCBjaGFyICpwYXRoKTsKKworCitJTkxJTkVfVFJFRVwKKyhjb25zdCBkZXZpY2VfcHJvcGVydHkgKikgdHJlZV9maW5kX3Byb3BlcnR5CisoZGV2aWNlICpyb290LAorIGNvbnN0IGNoYXIgKnBhdGhfdG9fcHJvcGVydHkpOworCitJTkxJTkVfVFJFRVwKKyhpbnQpIHRyZWVfZmluZF9ib29sZWFuX3Byb3BlcnR5CisoZGV2aWNlICpyb290LAorIGNvbnN0IGNoYXIgKnBhdGhfdG9fcHJvcGVydHkpOworCitJTkxJTkVfVFJFRVwKKyhzaWduZWRfY2VsbCkgdHJlZV9maW5kX2ludGVnZXJfcHJvcGVydHkKKyhkZXZpY2UgKnJvb3QsCisgY29uc3QgY2hhciAqcGF0aF90b19wcm9wZXJ0eSk7CisKK0lOTElORV9UUkVFXAorKGRldmljZV9pbnN0YW5jZSAqKSB0cmVlX2ZpbmRfaWhhbmRsZV9wcm9wZXJ0eQorKGRldmljZSAqcm9vdCwKKyBjb25zdCBjaGFyICpwYXRoX3RvX3Byb3BlcnR5KTsKKworSU5MSU5FX1RSRUVcCisoY29uc3QgY2hhciAqKSB0cmVlX2ZpbmRfc3RyaW5nX3Byb3BlcnR5CisoZGV2aWNlICpyb290LAorIGNvbnN0IGNoYXIgKnBhdGhfdG9fcHJvcGVydHkpOworCisKKy8qIEluaXRpYWxpemluZyB0aGUgY3JlYXRlZCB0cmVlOgorCisgICBPbmNlIGEgZGV2aWNlIHRyZWUgaGFzIGJlZW4gY3JlYXRlZCB0aGUgPDxkZXZpY2VfdHJlZV9pbml0KCk+PgorICAgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIGl0LiAgVGhlIGV4YWN0IHNlcXVlbmNlIG9mIGV2ZW50cworICAgdGhhdCBvY2N1cmUgZHVyaW5nIGluaXRpYWxpemF0aW9uIGFyZSBkZXNjcmliZWQgc2VwYXJhdGx5LgorCisgICAqLworCitJTkxJTkVfVFJFRVwKKyh2b2lkKSB0cmVlX2luaXQKKyhkZXZpY2UgKnJvb3QsCisgcHNpbSAqc3lzdGVtKTsKKworCisjZW5kaWYgLyogX1RSRUVfSF8gKi8KZGlmZiAtLWdpdCBhL3NpbS9wcGMvdm0uYyBiL3NpbS9wcGMvdm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmY5NjJjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3BwYy92bS5jCkBAIC0wLDAgKzEsMTE5OCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfVk1fQ18KKyNkZWZpbmUgX1ZNX0NfCisKKyNpZiAwCisjaW5jbHVkZSAiYmFzaWNzLmgiCisjaW5jbHVkZSAicmVnaXN0ZXJzLmgiCisjaW5jbHVkZSAiZGV2aWNlLmgiCisjaW5jbHVkZSAiY29yZWZpbGUuaCIKKyNpbmNsdWRlICJ2bS5oIgorI2luY2x1ZGUgImludGVycnVwdHMuaCIKKyNpbmNsdWRlICJtb24uaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiY3B1LmgiCisKKy8qIE9FQSB2cyBWRUEKKworICAgRm9yIHRoZSBWRUEgbW9kZWwsIHRoZSBWTSBsYXllciBpcyBhbG1vc3QgdHJhbnNwYXJlbnQuICBJdCdzIG9ubHkKKyAgIHB1cnBvc2UgaXMgdG8gbWFpbnRhaW4gc2VwYXJhdGUgY29yZV9tYXAncyBmb3IgdGhlIGluc3RydWN0aW9uCisgICBhbmQgZGF0YSBhZGRyZXNzIHNwYWNlcy4gIFRoaXMgYmVpbmcgc28gdGhhdCB3cml0ZXMgdG8gaW5zdHJ1Y3Rpb24KKyAgIHNwYWNlIG9yIGV4ZWN1dGlvbiBvZiBhIGRhdGEgc3BhY2UgaXMgcHJldmVudGVkLgorCisgICBGb3IgdGhlIE9FQSBtb2RlbCB0aGluZ3MgYXJlIG1vcmUgY29tcGxleC4gIFRoZSByZWFzb24gZm9yIHNlcGFyYXRlCisgICBpbnN0cnVjdGlvbiBhbmQgZGF0YSBtb2RlbHMgYmVjb21lcyBjcnVjaWFsLiAgVGhlIE9FQSBtb2RlbCBpcworICAgYnVpbHQgb3V0IG9mIHRocmVlIHBhcnRzLiAgQW4gaW5zdHJ1Y3Rpb24gbWFwLCBhIGRhdGEgbWFwIGFuZCBhbgorICAgdW5kZXJseWluZyBzdHJ1Y3R1cmUgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFZNIGRhdGEga2VwdCBpbgorICAgbWFpbiBtZW1vcnkuICovCisKKworLyogT0VBIGRhdGEgc3RydWN0dXJlczoKKworICAgVGhlIE9FQSBtb2RlbCBtYWludGFpbnMgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgc2hhZG93IHRoZQorICAgc2VtYW50aWNzIG9mIHRoZSB2YXJpb3VzIE9FQSBWTSByZWdpc3RlcnMgKEJBVCwgU1IsIGV0YykuICBUaGlzCisgICBhbGxvd3MgYSBzaW1wbGUgZWZmaWNpZW50IG1vZGVsIG9mIHRoZSBWTSB0byBiZSBpbXBsZW1lbnRlZC4KKworICAgQ29uc2lzdGVuY3kgYmV0d2VlbiBPRUEgcmVnaXN0ZXJzIGFuZCB0aGlzIG1vZGVsJ3MgaW50ZXJuYWwgZGF0YQorICAgc3RydWN0dXJlcyBpcyBtYWludGFpbmVkIGJ5IHVwZGF0aW5nIHRoZSBzdHJ1Y3R1cmVzIGF0CisgICBgc3luY2hyb25pemF0aW9uJyBwb2ludHMuICBPZiBwYXJ0aWN1bGFyIG5vdGUgaXMgdGhhdCAoYXQgdGhlIHRpbWUKKyAgIG9mIHdyaXRpbmcpIHRoZSBtZW1vcnkgZGF0YSB0eXBlcyBmb3IgQkFUIHJlZ2lzdGVycyBhcmUgcmVidWlsdAorICAgd2hlbiBldmVyIHRoZSBwcm9jZXNzb3IgbW92ZXMgYmV0d2VlbiBwcm9ibGVtIGFuZCBzeXN0ZW0gc3RhdGVzLgorCisgICBVbnBhY2tlZCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgT0VBIHNvIHRoYXQgdGhleSBjb3JyZWN0bHkgYWxpZ24KKyAgIHRvIHdoZXJlIHRoZXkgd2lsbCBiZSBuZWVkZWQgYnkgdGhlIFBURSBhZGRyZXNzLiAqLworCisKKy8qIFByb3RlY3Rpb24gdGFibGU6CisKKyAgIE1hdHJpeCBvZiBwcm9jZXNzb3Igc3RhdGUsIHR5cGUgb2YgYWNjZXNzIGFuZCB2YWxpZGl0eSAqLworCit0eXBlZGVmIGVudW0geworICBvbV9zdXBlcnZpc29yX3N0YXRlLAorICBvbV9wcm9ibGVtX3N0YXRlLAorICBucl9vbV9tb2RlcworfSBvbV9wcm9jZXNzb3JfbW9kZXM7CisKK3R5cGVkZWYgZW51bSB7CisgIG9tX2RhdGFfcmVhZCwgb21fZGF0YV93cml0ZSwKKyAgb21faW5zdHJ1Y3Rpb25fcmVhZCwgb21fYWNjZXNzX2FueSwKKyAgbnJfb21fYWNjZXNzX3R5cGVzCit9IG9tX2FjY2Vzc190eXBlczsKKworc3RhdGljIGludCBvbV92YWxpZF9hY2Nlc3NbMl1bNF1bbnJfb21fYWNjZXNzX3R5cGVzXSA9IHsKKyAgLyogcmVhZCwgd3JpdGUsIGluc3RydWN0aW9uLCBhbnkgKi8KKyAgLyogSyBiaXQgPT0gMCAqLworICB7IC8qciAgdyAgaSAgYSAgICAgICBwcCAqLworICAgIHsgMSwgMSwgMSwgMSB9LCAvKiAwMCAqLworICAgIHsgMSwgMSwgMSwgMSB9LCAvKiAwMSAqLworICAgIHsgMSwgMSwgMSwgMSB9LCAvKiAxMCAqLworICAgIHsgMSwgMCwgMSwgMSB9LCAvKiAxMSAqLworICB9LAorICAvKiBLIGJpdCA9PSAxICBvciBQIGJpdCB2YWxpZCAqLworICB7IC8qciAgdyAgaSAgYSAgICAgICBwcCAqLworICAgIHsgMCwgMCwgMCwgMCB9LCAvKiAwMCAqLworICAgIHsgMSwgMCwgMSwgMSB9LCAvKiAwMSAqLworICAgIHsgMSwgMSwgMSwgMSB9LCAvKiAxMCAqLworICAgIHsgMSwgMCwgMSwgMSB9LCAvKiAxMSAqLworICB9Cit9OworCisKKy8qIEJhdCB0cmFuc2xhdGlvbjoKKworICAgVGhlIGJhdCBkYXRhIHN0cnVjdHVyZSBvbmx5IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHZhbGlkIEJBVAorICAgdHJhbnNsYXRpb25zIGZvciB0aGUgY3VycmVudCBwcm9jZXNzb3IgbW9kZSBhbmQgdHlwZSBvZiBhY2Nlc3MuICovCisKK3R5cGVkZWYgc3RydWN0IF9vbV9iYXQgeworICB1bnNpZ25lZF93b3JkIGJsb2NrX2VmZmVjdGl2ZV9wYWdlX2luZGV4OworICB1bnNpZ25lZF93b3JkIGJsb2NrX2VmZmVjdGl2ZV9wYWdlX2luZGV4X21hc2s7CisgIHVuc2lnbmVkX3dvcmQgYmxvY2tfbGVuZ3RoX21hc2s7CisgIHVuc2lnbmVkX3dvcmQgYmxvY2tfcmVhbF9wYWdlX251bWJlcjsKKyAgaW50IHByb3RlY3Rpb25fYml0czsKK30gb21fYmF0OworCitlbnVtIF9ucl9vbV9iYXRfcmVnaXN0ZXJzIHsKKyAgbnJfb21fYmF0X3JlZ2lzdGVycyA9IDQKK307CisKK3R5cGVkZWYgc3RydWN0IF9vbV9iYXRzIHsKKyAgaW50IG5yX3ZhbGlkX2JhdF9yZWdpc3RlcnM7CisgIG9tX2JhdCBiYXRbbnJfb21fYmF0X3JlZ2lzdGVyc107Cit9IG9tX2JhdHM7CisKKworLyogU2VnbWVudCBUTEI6CisKKyAgIEluIHRoaXMgbW9kZWwgdGhlIDMyIGFuZCA2NCBiaXQgc2VnbWVudCB0YWJsZXMgYXJlIHRyZWF0ZWQgaW4gdmVyeQorICAgc2ltaWxhciB3YXlzLiAgVGhlIDMyYml0IHNlZ21lbnQgcmVnaXN0ZXJzIGFyZSB0cmVhdGVkIGFzIGEKKyAgIHNpbXBsaWZpY2F0aW9uIG9mIHRoZSA2NGJpdCBzZWdtZW50IHRsYiAqLworCitlbnVtIF9vbV9zZWdtZW50X3RsYl9jb25zdGFudHMgeworI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCisgIHNpemVvZl9zZWdtZW50X3RhYmxlX2VudHJ5X2dyb3VwID0gMTI4LAorICBzaXplb2Zfc2VnbWVudF90YWJsZV9lbnRyeSA9IDE2LAorI2VuZGlmCisgIG9tX3NlZ21lbnRfdGxiX2luZGV4X3N0YXJ0X2JpdCA9IDMyLAorICBvbV9zZWdtZW50X3RsYl9pbmRleF9zdG9wX2JpdCA9IDM1LAorICBucl9vbV9zZWdtZW50X3RsYl9lbnRyaWVzID0gMTYsCisgIG5yX29tX3NlZ21lbnRfdGxiX2NvbnN0YW50cworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX29tX3NlZ21lbnRfdGxiX2VudHJ5IHsKKyAgaW50IGtleVtucl9vbV9tb2Rlc107CisgIG9tX2FjY2Vzc190eXBlcyBpbnZhbGlkX2FjY2VzczsgLyogc2V0IHRvIGluc3RydWN0aW9uIGlmIG5vX2V4ZWN1dGUgYml0ICovCisgIHVuc2lnbmVkX3dvcmQgbWFza2VkX3ZpcnR1YWxfc2VnbWVudF9pZDsgLyogYWxpZ25lZCByZWFkeSBmb3IgcHRlIGdyb3VwIGFkZHIgKi8KKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQorICBpbnQgaXNfdmFsaWQ7CisgIHVuc2lnbmVkX3dvcmQgbWFza2VkX2VmZmVjdGl2ZV9zZWdtZW50X2lkOworI2VuZGlmCit9IG9tX3NlZ21lbnRfdGxiX2VudHJ5OworCit0eXBlZGVmIHN0cnVjdCBfb21fc2VnbWVudF90bGIgeworICBvbV9zZWdtZW50X3RsYl9lbnRyeSBlbnRyeVtucl9vbV9zZWdtZW50X3RsYl9lbnRyaWVzXTsKK30gb21fc2VnbWVudF90bGI7CisKKworLyogUGFnZSBUTEI6CisKKyAgIFRoaXMgT0VBIG1vZGVsIGluY2x1ZGVzIGEgc21hbGwgZGlyZWN0IG1hcCBQYWdlIFRMQi4gIFRoZSB0bGIgaXMgdG8KKyAgIGN1dCBkb3duIG9uIHRoZSBuZWVkIGZvciB0aGUgT0VBIHRvIHBlcmZvcm0gd2Fsa3Mgb2YgdGhlIHBhZ2UgaGFzaAorICAgdGFibGUuICovCisKK2VudW0gX29tX3BhZ2VfdGxiX2NvbnN0YW50cyB7CisgIG9tX3BhZ2VfdGxiX2luZGV4X3N0YXJ0X2JpdCA9IDQ2LAorICBvbV9wYWdlX3RsYl9pbmRleF9zdG9wX2JpdCA9IDUxLAorICBucl9vbV9wYWdlX3RsYl9lbnRyaWVzID0gNjQsCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyAgc2l6ZW9mX3B0ZV9ncm91cCA9IDEyOCwKKyAgc2l6ZW9mX3B0ZSA9IDE2LAorI2VuZGlmCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKKyAgc2l6ZW9mX3B0ZV9ncm91cCA9IDY0LAorICBzaXplb2ZfcHRlID0gOCwKKyNlbmRpZgorICBucl9vbV9wYWdlX3RsYl9jb25zdGFudHMKK307CisKK3R5cGVkZWYgc3RydWN0IF9vbV9wYWdlX3RsYl9lbnRyeSB7CisgIGludCBwcm90ZWN0aW9uOworICBpbnQgY2hhbmdlZDsKKyAgdW5zaWduZWRfd29yZCByZWFsX2FkZHJlc3Nfb2ZfcHRlXzE7CisgIHVuc2lnbmVkX3dvcmQgbWFza2VkX3ZpcnR1YWxfc2VnbWVudF9pZDsKKyAgdW5zaWduZWRfd29yZCBtYXNrZWRfcGFnZTsKKyAgdW5zaWduZWRfd29yZCBtYXNrZWRfcmVhbF9wYWdlX251bWJlcjsKK30gb21fcGFnZV90bGJfZW50cnk7CisKK3R5cGVkZWYgc3RydWN0IF9vbV9wYWdlX3RsYiB7CisgIG9tX3BhZ2VfdGxiX2VudHJ5IGVudHJ5W25yX29tX3BhZ2VfdGxiX2VudHJpZXNdOworfSBvbV9wYWdlX3RsYjsKKworCisvKiBtZW1vcnkgdHJhbnNsYXRpb246CisKKyAgIE9FQSBtZW1vcnkgdHJhbnNsYXRpb24gcG9zc2libHkgaW52b2x2ZXMgQkFULCBTUiwgVExCIGFuZCBIVEFCCisgICBpbmZvcm1hdGlvbiovCisKK3R5cGVkZWYgc3RydWN0IF9vbV9tYXAgeworCisgIC8qIGxvY2FsIGNhY2hlIG9mIHJlZ2lzdGVyIHZhbHVlcyAqLworICBpbnQgaXNfcmVsb2NhdGU7CisgIGludCBpc19wcm9ibGVtX3N0YXRlOworCisgIC8qIGJsb2NrIGFkZHJlc3MgdHJhbnNsYXRpb24gKi8KKyAgb21fYmF0cyAqYmF0X3JlZ2lzdGVyczsKKworICAvKiBmYWlsaW5nIHRoYXQsIHRyYW5zbGF0ZSBlYSB0byB2YSB1c2luZyBzZWdtZW50IHRsYiAqLworI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCisgIHVuc2lnbmVkX3dvcmQgcmVhbF9hZGRyZXNzX29mX3NlZ21lbnRfdGFibGU7CisjZW5kaWYKKyAgb21fc2VnbWVudF90bGIgKnNlZ21lbnRfdGxiOworCisgIC8qIHRoZW4gdmEgdG8gcmEgdXNpbmcgaGFzaGVkIHBhZ2UgdGFibGUgYW5kIHRsYiAqLworICB1bnNpZ25lZF93b3JkIHJlYWxfYWRkcmVzc19vZl9wYWdlX3RhYmxlOworICB1bnNpZ25lZF93b3JkIHBhZ2VfdGFibGVfaGFzaF9tYXNrOworICBvbV9wYWdlX3RsYiAqcGFnZV90bGI7CisKKyAgLyogcGh5c2ljYWwgbWVtb3J5IGZvciBmZXRjaGluZyBwYWdlIHRhYmxlIGVudHJpZXMgKi8KKyAgY29yZV9tYXAgKnBoeXNpY2FsOworCisgIC8qIGFkZHJlc3MgeG9yIGZvciBQUEMgZW5kaWFuICovCisgIHVuc2lnbmVkIHhvcltXSVRIX1hPUl9FTkRJQU5dOworCit9IG9tX21hcDsKKworCisvKiBWTSBvYmplY3RzOgorCisgICBFeHRlcm5hbCBvYmplY3RzIGRlZmluZWQgYnkgdm0uaCAqLworCitzdHJ1Y3QgX3ZtX2luc3RydWN0aW9uX21hcCB7CisgIC8qIHJlYWwgbWVtb3J5IGZvciBsYXN0IHBhcnQgKi8KKyAgY29yZV9tYXAgKmNvZGU7CisgIC8qIHRyYW5zbGF0ZSBlZmZlY3RpdmUgdG8gcmVhbCAqLworICBvbV9tYXAgdHJhbnNsYXRpb247Cit9OworCitzdHJ1Y3QgX3ZtX2RhdGFfbWFwIHsKKyAgLyogdHJhbnNsYXRlIGVmZmVjdGl2ZSB0byByZWFsICovCisgIG9tX21hcCB0cmFuc2xhdGlvbjsKKyAgLyogcmVhbCBtZW1vcnkgZm9yIHRyYW5zbGF0ZWQgYWRkcmVzcyAqLworICBjb3JlX21hcCAqcmVhZDsKKyAgY29yZV9tYXAgKndyaXRlOworfTsKKworCisvKiBWTToKKworICAgVW5kZXJseWluZyBtZW1vcnkgb2JqZWN0LiAgRm9yIHRoZSBWRUEgdGhpcyBpcyBqdXN0IHRoZQorICAgY29yZV9tYXAuIEZvciBPRUEgaXQgaXMgdGhlIGluc3RydWN0aW9uIGFuZCBkYXRhIG1lbW9yeQorICAgdHJhbnNsYXRpb24ncyAqLworCitzdHJ1Y3QgX3ZtIHsKKworICAvKiBPRUE6IGJhc2UgYWRkcmVzcyByZWdpc3RlcnMgKi8KKyAgb21fYmF0cyBpYmF0czsKKyAgb21fYmF0cyBkYmF0czsKKworICAvKiBPRUE6IHNlZ21lbnQgcmVnaXN0ZXJzICovCisgIG9tX3NlZ21lbnRfdGxiIHNlZ21lbnRfdGxiOworCisgIC8qIE9FQTogdHJhbnNsYXRpb24gbG9va2FzaWRlIGJ1ZmZlcnMgKi8KKyAgb21fcGFnZV90bGIgaW5zdHJ1Y3Rpb25fdGxiOworICBvbV9wYWdlX3RsYiBkYXRhX3RsYjsKKworICAvKiByZWFsIG1lbW9yeSAqLworICBjb3JlICpwaHlzaWNhbDsKKworICAvKiBtZW1vcnkgbWFwcyAqLworICB2bV9pbnN0cnVjdGlvbl9tYXAgaW5zdHJ1Y3Rpb25fbWFwOworICB2bV9kYXRhX21hcCBkYXRhX21hcDsKKworfTsKKworCisvKiBPRUEgU3VwcG9ydCBwcm9jZWR1cmVzICovCisKKworU1RBVElDX0lOTElORV9WTVwKKyh1bnNpZ25lZF93b3JkKQorb21fc2VnbWVudF90bGJfaW5kZXgodW5zaWduZWRfd29yZCBlYSkKK3sKKyAgdW5zaWduZWRfd29yZCBpbmRleCA9IEVYVFJBQ1RFRChlYSwKKwkJCQkgIG9tX3NlZ21lbnRfdGxiX2luZGV4X3N0YXJ0X2JpdCwKKwkJCQkgIG9tX3NlZ21lbnRfdGxiX2luZGV4X3N0b3BfYml0KTsKKyAgcmV0dXJuIGluZGV4OworfQorCitTVEFUSUNfSU5MSU5FX1ZNXAorKHVuc2lnbmVkX3dvcmQpCitvbV9wYWdlX3RsYl9pbmRleCh1bnNpZ25lZF93b3JkIGVhKQoreworICB1bnNpZ25lZF93b3JkIGluZGV4ID0gRVhUUkFDVEVEKGVhLAorCQkJCSAgb21fcGFnZV90bGJfaW5kZXhfc3RhcnRfYml0LAorCQkJCSAgb21fcGFnZV90bGJfaW5kZXhfc3RvcF9iaXQpOworICByZXR1cm4gaW5kZXg7Cit9CisKK1NUQVRJQ19JTkxJTkVfVk1cCisodW5zaWduZWRfd29yZCkKK29tX2hhc2hfcGFnZSh1bnNpZ25lZF93b3JkIG1hc2tlZF92c2lkLAorCSAgICAgdW5zaWduZWRfd29yZCBlYSkKK3sKKyAgdW5zaWduZWRfd29yZCBleHRyYWN0ZWRfZWEgPSBFWFRSQUNURUQoZWEsIDM2LCA1MSk7CisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKKyAgdW5zaWduZWRfd29yZCBtYXNrZWRfZWEgPSBJTlNFUlRFRDMyKGV4dHJhY3RlZF9lYSwgNywgMzEtNik7CisgIHVuc2lnbmVkX3dvcmQgaGFzaCA9IG1hc2tlZF92c2lkIF4gbWFza2VkX2VhOworI2VuZGlmCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyAgdW5zaWduZWRfd29yZCBtYXNrZWRfZWEgPSBJTlNFUlRFRDY0KGV4dHJhY3RlZF9lYSwgMTgsIDYzLTcpOworICB1bnNpZ25lZF93b3JkIGhhc2ggPSBtYXNrZWRfdnNpZCBeIG1hc2tlZF9lYTsKKyNlbmRpZgorICBUUkFDRSh0cmFjZV92bSwgKCJlYT0weCVseCAtIG1hc2tlZC12c2lkPTB4JWx4IG1hc2tlZC1lYT0weCVseCBoYXNoPTB4JWx4XG4iLAorCQkgICAodW5zaWduZWQgbG9uZyllYSwKKwkJICAgKHVuc2lnbmVkIGxvbmcpbWFza2VkX3ZzaWQsCisJCSAgICh1bnNpZ25lZCBsb25nKW1hc2tlZF9lYSwKKwkJICAgKHVuc2lnbmVkIGxvbmcpaGFzaCkpOworICByZXR1cm4gaGFzaDsKK30KKworU1RBVElDX0lOTElORV9WTVwKKyh1bnNpZ25lZF93b3JkKQorb21fcHRlXzBfYXBpKHVuc2lnbmVkX3dvcmQgcHRlXzApCit7CisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKKyAgcmV0dXJuIEVYVFJBQ1RFRDMyKHB0ZV8wLCAyNiwgMzEpOworI2VuZGlmCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyAgcmV0dXJuIEVYVFJBQ1RFRDY0KHB0ZV8wLCA1MiwgNTYpOworI2VuZGlmCit9CisKK1NUQVRJQ19JTkxJTkVfVk1cCisodW5zaWduZWRfd29yZCkKK29tX3B0ZV8wX2hhc2godW5zaWduZWRfd29yZCBwdGVfMCkKK3sKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQorICByZXR1cm4gRVhUUkFDVEVEMzIocHRlXzAsIDI1LCAyNSk7CisjZW5kaWYKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDY0KQorICByZXR1cm4gRVhUUkFDVEVENjQocHRlXzAsIDYyLCA2Mik7CisjZW5kaWYKK30KKworU1RBVElDX0lOTElORV9WTVwKKyhpbnQpCitvbV9wdGVfMF92YWxpZCh1bnNpZ25lZF93b3JkIHB0ZV8wKQoreworI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCisgIHJldHVybiBNQVNLRUQzMihwdGVfMCwgMCwgMCkgIT0gMDsKKyNlbmRpZgorI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCisgIHJldHVybiBNQVNLRUQ2NChwdGVfMCwgNjMsIDYzKSAhPSAwOworI2VuZGlmCit9CisKK1NUQVRJQ19JTkxJTkVfVk1cCisodW5zaWduZWRfd29yZCkKK29tX2VhX21hc2tlZF9wYWdlKHVuc2lnbmVkX3dvcmQgZWEpCit7CisgIHJldHVybiBNQVNLRUQoZWEsIDM2LCA1MSk7Cit9CisKK1NUQVRJQ19JTkxJTkVfVk1cCisodW5zaWduZWRfd29yZCkKK29tX2VhX21hc2tlZF9ieXRlKHVuc2lnbmVkX3dvcmQgZWEpCit7CisgIHJldHVybiBNQVNLRUQoZWEsIDUyLCA2Myk7Cit9CisKKy8qIHJldHVybiB0aGUgVlNJRCBhbGlnbmVkIGZvciBwdGUgZ3JvdXAgYWRkciAqLworU1RBVElDX0lOTElORV9WTVwKKyh1bnNpZ25lZF93b3JkKQorb21fcHRlXzBfbWFza2VkX3ZzaWQodW5zaWduZWRfd29yZCBwdGVfMCkKK3sKKyNpZiAoV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFID09IDMyKQorICByZXR1cm4gSU5TRVJURUQzMihFWFRSQUNURUQzMihwdGVfMCwgMSwgMjQpLCAzMS02LTI0KzEsIDMxLTYpOworI2VuZGlmCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyAgcmV0dXJuIElOU0VSVEVENjQoRVhUUkFDVEVENjQocHRlXzAsIDAsIDUxKSwgNjMtNy01MisxLCA2My03KTsKKyNlbmRpZgorfQorCitTVEFUSUNfSU5MSU5FX1ZNXAorKHVuc2lnbmVkX3dvcmQpCitvbV9wdGVfMV9wcCh1bnNpZ25lZF93b3JkIHB0ZV8xKQoreworICByZXR1cm4gTUFTS0VEKHB0ZV8xLCA2MiwgNjMpOyAvKlBQKi8KK30KKworU1RBVElDX0lOTElORV9WTVwKKyhpbnQpCitvbV9wdGVfMV9yZWZlcmVuY2VkKHVuc2lnbmVkX3dvcmQgcHRlXzEpCit7CisgIHJldHVybiBFWFRSQUNURUQocHRlXzEsIDU1LCA1NSk7Cit9CisKK1NUQVRJQ19JTkxJTkVfVk1cCisoaW50KQorb21fcHRlXzFfY2hhbmdlZCh1bnNpZ25lZF93b3JkIHB0ZV8xKQoreworICByZXR1cm4gRVhUUkFDVEVEKHB0ZV8xLCA1NiwgNTYpOworfQorCitTVEFUSUNfSU5MSU5FX1ZNXAorKGludCkKK29tX3B0ZV8xX21hc2tlZF9ycG4odW5zaWduZWRfd29yZCBwdGVfMSkKK3sKKyAgcmV0dXJuIE1BU0tFRChwdGVfMSwgMCwgNTEpOyAvKlJQTiovCit9CisKK1NUQVRJQ19JTkxJTkVfVk1cCisodW5zaWduZWRfd29yZCkKK29tX2VhX2FwaSh1bnNpZ25lZF93b3JkIGVhKQoreworICByZXR1cm4gRVhUUkFDVEVEKGVhLCAzNiwgNDEpOworfQorCisKKy8qIFBhZ2UgYW5kIFNlZ21lbnQgdGFibGUgcmVhZC93cml0ZSBvcGVyYXRvcnMsIHRoZXNlIG5lZWQgdG8gc3RpbGwKKyAgIGFjY291bnQgZm9yIHRoZSBQUEMncyBYT1Igb3BlcmF0aW9uICovCisKK1NUQVRJQ19JTkxJTkVfVk1cCisodW5zaWduZWRfd29yZCkKK29tX3JlYWRfd29yZChvbV9tYXAgKm1hcCwKKwkgICAgIHVuc2lnbmVkX3dvcmQgcmEsCisJICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBpZiAoV0lUSF9YT1JfRU5ESUFOKQorICAgIHJhIF49IG1hcC0+eG9yW3NpemVvZihpbnN0cnVjdGlvbl93b3JkKSAtIDFdOworICByZXR1cm4gY29yZV9tYXBfcmVhZF93b3JkKG1hcC0+cGh5c2ljYWwsIHJhLCBwcm9jZXNzb3IsIGNpYSk7Cit9CisKK1NUQVRJQ19JTkxJTkVfVk1cCisodm9pZCkKK29tX3dyaXRlX3dvcmQob21fbWFwICptYXAsCisJICAgICAgdW5zaWduZWRfd29yZCByYSwKKwkgICAgICB1bnNpZ25lZF93b3JkIHZhbCwKKwkgICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgaWYgKFdJVEhfWE9SX0VORElBTikKKyAgICByYSBePSBtYXAtPnhvcltzaXplb2YoaW5zdHJ1Y3Rpb25fd29yZCkgLSAxXTsKKyAgY29yZV9tYXBfd3JpdGVfd29yZChtYXAtPnBoeXNpY2FsLCByYSwgdmFsLCBwcm9jZXNzb3IsIGNpYSk7Cit9CisKKworLyogQnJpbmcgdGhpbmdzIGludG8gZXhpc3RhbmNlICovCisKK0lOTElORV9WTVwKKyh2bSAqKQordm1fY3JlYXRlKGNvcmUgKnBoeXNpY2FsKQoreworICB2bSAqdmlydHVhbDsKKworICAvKiBpbnRlcm5hbCBjaGVja3MgKi8KKyAgaWYgKG5yX29tX3NlZ21lbnRfdGxiX2VudHJpZXMKKyAgICAgICE9ICgxIDw8IChvbV9zZWdtZW50X3RsYl9pbmRleF9zdG9wX2JpdAorCQktIG9tX3NlZ21lbnRfdGxiX2luZGV4X3N0YXJ0X2JpdCArIDEpKSkKKyAgICBlcnJvcigiaW50ZXJuYWwgZXJyb3IgLSB2bV9jcmVhdGUgLSBwcm9ibGVtIHdpdGggb21fc2VnbWVudCBjb25zdGFudHNcbiIpOworICBpZiAobnJfb21fcGFnZV90bGJfZW50cmllcworICAgICAgIT0gKDEgPDwgKG9tX3BhZ2VfdGxiX2luZGV4X3N0b3BfYml0CisJCS0gb21fcGFnZV90bGJfaW5kZXhfc3RhcnRfYml0ICsgMSkpKQorICAgIGVycm9yKCJpbnRlcm5hbCBlcnJvciAtIHZtX2NyZWF0ZSAtIHByb2JsZW0gd2l0aCBvbV9wYWdlIGNvbnN0YW50c1xuIik7CisKKyAgLyogY3JlYXRlIHRoZSBuZXcgdm0gcmVnaXN0ZXIgZmlsZSAqLworICB2aXJ0dWFsID0gWkFMTE9DKHZtKTsKKworICAvKiBzZXQgdXAgY29yZSAqLworICB2aXJ0dWFsLT5waHlzaWNhbCA9IHBoeXNpY2FsOworCisgIC8qIHNldCB1cCB0aGUgYWRkcmVzcyBkZWNvZGVycyAqLworICB2aXJ0dWFsLT5pbnN0cnVjdGlvbl9tYXAudHJhbnNsYXRpb24uYmF0X3JlZ2lzdGVycyA9ICZ2aXJ0dWFsLT5pYmF0czsKKyAgdmlydHVhbC0+aW5zdHJ1Y3Rpb25fbWFwLnRyYW5zbGF0aW9uLnNlZ21lbnRfdGxiID0gJnZpcnR1YWwtPnNlZ21lbnRfdGxiOworICB2aXJ0dWFsLT5pbnN0cnVjdGlvbl9tYXAudHJhbnNsYXRpb24ucGFnZV90bGIgPSAmdmlydHVhbC0+aW5zdHJ1Y3Rpb25fdGxiOworICB2aXJ0dWFsLT5pbnN0cnVjdGlvbl9tYXAudHJhbnNsYXRpb24uaXNfcmVsb2NhdGUgPSAwOworICB2aXJ0dWFsLT5pbnN0cnVjdGlvbl9tYXAudHJhbnNsYXRpb24uaXNfcHJvYmxlbV9zdGF0ZSA9IDA7CisgIHZpcnR1YWwtPmluc3RydWN0aW9uX21hcC50cmFuc2xhdGlvbi5waHlzaWNhbCA9IGNvcmVfcmVhZGFibGUocGh5c2ljYWwpOworICB2aXJ0dWFsLT5pbnN0cnVjdGlvbl9tYXAuY29kZSA9IGNvcmVfcmVhZGFibGUocGh5c2ljYWwpOworCisgIHZpcnR1YWwtPmRhdGFfbWFwLnRyYW5zbGF0aW9uLmJhdF9yZWdpc3RlcnMgPSAmdmlydHVhbC0+ZGJhdHM7CisgIHZpcnR1YWwtPmRhdGFfbWFwLnRyYW5zbGF0aW9uLnNlZ21lbnRfdGxiID0gJnZpcnR1YWwtPnNlZ21lbnRfdGxiOworICB2aXJ0dWFsLT5kYXRhX21hcC50cmFuc2xhdGlvbi5wYWdlX3RsYiA9ICZ2aXJ0dWFsLT5kYXRhX3RsYjsKKyAgdmlydHVhbC0+ZGF0YV9tYXAudHJhbnNsYXRpb24uaXNfcmVsb2NhdGUgPSAwOworICB2aXJ0dWFsLT5kYXRhX21hcC50cmFuc2xhdGlvbi5pc19wcm9ibGVtX3N0YXRlID0gMDsKKyAgdmlydHVhbC0+ZGF0YV9tYXAudHJhbnNsYXRpb24ucGh5c2ljYWwgPSBjb3JlX3JlYWRhYmxlKHBoeXNpY2FsKTsKKyAgdmlydHVhbC0+ZGF0YV9tYXAucmVhZCA9IGNvcmVfcmVhZGFibGUocGh5c2ljYWwpOworICB2aXJ0dWFsLT5kYXRhX21hcC53cml0ZSA9IGNvcmVfd3JpdGVhYmxlKHBoeXNpY2FsKTsKKworICByZXR1cm4gdmlydHVhbDsKK30KKworCitTVEFUSUNfSU5MSU5FX1ZNXAorKG9tX2JhdCAqKQorb21fZWZmZWN0aXZlX3RvX2JhdChvbV9tYXAgKm1hcCwKKwkJICAgIHVuc2lnbmVkX3dvcmQgZWEpCit7CisgIGludCBjdXJyX2JhdCA9IDA7CisgIG9tX2JhdHMgKmJhdHMgPSBtYXAtPmJhdF9yZWdpc3RlcnM7CisgIGludCBucl9iYXRzID0gYmF0cy0+bnJfdmFsaWRfYmF0X3JlZ2lzdGVyczsKKworICBmb3IgKGN1cnJfYmF0ID0gMDsgY3Vycl9iYXQgPCBucl9iYXRzOyBjdXJyX2JhdCsrKSB7CisgICAgb21fYmF0ICpiYXQgPSBiYXRzLT5iYXQgKyBjdXJyX2JhdDsKKyAgICBpZiAoKGVhICYgYmF0LT5ibG9ja19lZmZlY3RpdmVfcGFnZV9pbmRleF9tYXNrKQorCSE9IGJhdC0+YmxvY2tfZWZmZWN0aXZlX3BhZ2VfaW5kZXgpCisgICAgICBjb250aW51ZTsKKyAgICByZXR1cm4gYmF0OworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworU1RBVElDX0lOTElORV9WTVwKKyhvbV9zZWdtZW50X3RsYl9lbnRyeSAqKQorb21fZWZmZWN0aXZlX3RvX3ZpcnR1YWwob21fbWFwICptYXAsIAorCQkJdW5zaWduZWRfd29yZCBlYSwKKwkJCWNwdSAqcHJvY2Vzc29yLAorCQkJdW5zaWduZWRfd29yZCBjaWEpCit7CisgIC8qIGZpcnN0IHRyeSB0aGUgc2VnbWVudCB0bGIgKi8KKyAgb21fc2VnbWVudF90bGJfZW50cnkgKnNlZ21lbnRfdGxiX2VudHJ5ID0gKG1hcC0+c2VnbWVudF90bGItPmVudHJ5CisJCQkJCSAgICAgKyBvbV9zZWdtZW50X3RsYl9pbmRleChlYSkpOworCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSAzMikKKyAgVFJBQ0UodHJhY2Vfdm0sICgiZWE9MHglbHggLSBzclslbGRdIC0gbWFza2VkLXZzaWQ9MHglbHggdmE9MHglbHglMDdseFxuIiwKKwkJICAgKHVuc2lnbmVkIGxvbmcpZWEsCisJCSAgIChsb25nKW9tX3NlZ21lbnRfdGxiX2luZGV4KGVhKSwKKwkJICAgKHVuc2lnbmVkIGxvbmcpc2VnbWVudF90bGJfZW50cnktPm1hc2tlZF92aXJ0dWFsX3NlZ21lbnRfaWQsIAorCQkgICAodW5zaWduZWQgbG9uZylFWFRSQUNURUQzMihzZWdtZW50X3RsYl9lbnRyeS0+bWFza2VkX3ZpcnR1YWxfc2VnbWVudF9pZCwgMzEtNi0yNCsxLCAzMS02KSwKKwkJICAgKHVuc2lnbmVkIGxvbmcpRVhUUkFDVEVEMzIoZWEsIDQsIDMxKSkpOworICByZXR1cm4gc2VnbWVudF90bGJfZW50cnk7CisjZW5kaWYKKworI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCisgIGlmIChzZWdtZW50X3RsYl9lbnRyeS0+aXNfdmFsaWQKKyAgICAgICYmIChzZWdtZW50X3RsYl9lbnRyeS0+bWFza2VkX2VmZmVjdGl2ZV9zZWdtZW50X2lkID09IE1BU0tFRChlYSwgMCwgMzUpKSkgeworICAgIGVycm9yKCJmaXhtZSAtIGlzIHRoZXJlIGEgbmVlZCB0byB1cGRhdGUgYW55IGJpdHNcbiIpOworICAgIHJldHVybiBzZWdtZW50X3RsYl9lbnRyeTsKKyAgfQorCisgIC8qIGRyYXRzLCBzZWdtZW50IHRsYiBtaXNzZWQgKi8KKyAgeworICAgIHVuc2lnbmVkX3dvcmQgc2VnbWVudF9pZF9oYXNoID0gZWE7CisgICAgaW50IGN1cnJlbnRfaGFzaCA9IDA7CisgICAgZm9yIChjdXJyZW50X2hhc2ggPSAwOyBjdXJyZW50X2hhc2ggPCAyOyBjdXJyZW50X2hhc2ggKz0gMSkgeworICAgICAgdW5zaWduZWRfd29yZCBzZWdtZW50X3RhYmxlX2VudHJ5X2dyb3VwID0KKwkobWFwLT5yZWFsX2FkZHJlc3Nfb2Zfc2VnbWVudF90YWJsZQorCSB8IChNQVNLRUQ2NChzZWdtZW50X2lkX2hhc2gsIDMxLCAzNSkgPj4gKDU2LTM1KSkpOworICAgICAgdW5zaWduZWRfd29yZCBzZWdtZW50X3RhYmxlX2VudHJ5OworICAgICAgZm9yIChzZWdtZW50X3RhYmxlX2VudHJ5ID0gc2VnbWVudF90YWJsZV9lbnRyeV9ncm91cDsKKwkgICBzZWdtZW50X3RhYmxlX2VudHJ5IDwgKHNlZ21lbnRfdGFibGVfZW50cnlfZ3JvdXAKKwkJCQkgICsgc2l6ZW9mX3NlZ21lbnRfdGFibGVfZW50cnlfZ3JvdXApOworCSAgIHNlZ21lbnRfdGFibGVfZW50cnkgKz0gc2l6ZW9mX3NlZ21lbnRfdGFibGVfZW50cnkpIHsKKwkvKiBieXRlIG9yZGVyPyAqLworCXVuc2lnbmVkX3dvcmQgc2VnbWVudF90YWJsZV9lbnRyeV9kd29yZF8wID0KKwkgIG9tX3JlYWRfd29yZChtYXAtPnBoeXNpY2FsLCBzZWdtZW50X3RhYmxlX2VudHJ5LCBwcm9jZXNzb3IsIGNpYSk7CisJdW5zaWduZWRfd29yZCBzZWdtZW50X3RhYmxlX2VudHJ5X2R3b3JkXzEgPQorCSAgb21fcmVhZF93b3JkKG1hcC0+cGh5c2ljYWwsIHNlZ21lbnRfdGFibGVfZW50cnkgKyA4LAorCQkgICAgICAgcHJvY2Vzc29yLCBjaWEpOworCWludCBpc192YWxpZCA9IE1BU0tFRDY0KHNlZ21lbnRfdGFibGVfZW50cnlfZHdvcmRfMCwgNTYsIDU2KSAhPSAwOworCXVuc2lnbmVkX3dvcmQgbWFza2VkX2VmZmVjdGl2ZV9zZWdtZW50X2lkID0KKwkgIE1BU0tFRDY0KHNlZ21lbnRfdGFibGVfZW50cnlfZHdvcmRfMCwgMCwgMzUpOworCWlmIChpc192YWxpZCAmJiBtYXNrZWRfZWZmZWN0aXZlX3NlZ21lbnRfaWQgPT0gTUFTS0VENjQoZWEsIDAsIDM1KSkgeworCSAgLyogZG9uJ3QgcGVybWl0IHNvbWUgdGhpbmdzICovCisJICBpZiAoTUFTS0VENjQoc2VnbWVudF90YWJsZV9lbnRyeV9kd29yZF8wLCA1NywgNTcpKQorCSAgICBlcnJvcigib21fZWZmZWN0aXZlX3RvX3ZpcnR1YWwoKSAtIFQ9MSBpbiBTVEUgbm90IHN1cHBvcnRlZFxuIik7CisJICAvKiB1cGRhdGUgc2VnbWVudCB0bGIgKi8KKwkgIHNlZ21lbnRfdGxiX2VudHJ5LT5pc192YWxpZCA9IGlzX3ZhbGlkOworCSAgc2VnbWVudF90bGJfZW50cnktPm1hc2tlZF9lZmZlY3RpdmVfc2VnbWVudF9pZCA9CisJICAgIG1hc2tlZF9lZmZlY3RpdmVfc2VnbWVudF9pZDsKKwkgIHNlZ21lbnRfdGxiX2VudHJ5LT5rZXlbb21fc3VwZXJ2aXNvcl9zdGF0ZV0gPQorCSAgICBFWFRSQUNURUQ2NChzZWdtZW50X3RhYmxlX2VudHJ5X2R3b3JkXzAsIDU4LCA1OCk7CisJICBzZWdtZW50X3RsYl9lbnRyeS0+a2V5W29tX3Byb2JsZW1fc3RhdGVdID0KKwkgICAgRVhUUkFDVEVENjQoc2VnbWVudF90YWJsZV9lbnRyeV9kd29yZF8wLCA1OSwgNTkpOworCSAgc2VnbWVudF90bGJfZW50cnktPmludmFsaWRfYWNjZXNzID0KKwkgICAgKE1BU0tFRDY0KHNlZ21lbnRfdGFibGVfZW50cnlfZHdvcmRfMCwgNjAsIDYwKQorCSAgICAgPyBvbV9pbnN0cnVjdGlvbl9yZWFkCisJICAgICA6IG9tX2FjY2Vzc19hbnkpOworCSAgc2VnbWVudF90bGJfZW50cnktPm1hc2tlZF92aXJ0dWFsX3NlZ21lbnRfaWQgPQorCSAgICBJTlNFUlRFRDY0KEVYVFJBQ1RFRDY0KHNlZ21lbnRfdGFibGVfZW50cnlfZHdvcmRfMSwgMCwgNTEpLAorCQkgICAgICAgMTgtMTMsIDYzLTcpOyAvKiBhbGlnbmVkIHJlYWR5IGZvciBwdGUgZ3JvdXAgYWRkciAqLworCSAgcmV0dXJuIHNlZ21lbnRfdGxiX2VudHJ5OworCX0KKyAgICAgIH0KKyAgICAgIHNlZ21lbnRfaWRfaGFzaCA9IH5zZWdtZW50X2lkX2hhc2g7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworI2VuZGlmCit9CisKKworCitTVEFUSUNfSU5MSU5FX1ZNXAorKG9tX3BhZ2VfdGxiX2VudHJ5ICopCitvbV92aXJ0dWFsX3RvX3JlYWwob21fbWFwICptYXAsIAorCQkgICB1bnNpZ25lZF93b3JkIGVhLAorCQkgICBvbV9zZWdtZW50X3RsYl9lbnRyeSAqc2VnbWVudF90bGJfZW50cnksCisJCSAgIG9tX2FjY2Vzc190eXBlcyBhY2Nlc3MsCisJCSAgIGNwdSAqcHJvY2Vzc29yLAorCQkgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgb21fcGFnZV90bGJfZW50cnkgKnBhZ2VfdGxiX2VudHJ5ID0gKG1hcC0+cGFnZV90bGItPmVudHJ5CisJCQkJICAgICAgICsgb21fcGFnZV90bGJfaW5kZXgoZWEpKTsKKworICAvKiBpcyBpdCBhIHRsYiBoaXQ/ICovCisgIGlmICgocGFnZV90bGJfZW50cnktPm1hc2tlZF92aXJ0dWFsX3NlZ21lbnRfaWQKKyAgICAgICA9PSBzZWdtZW50X3RsYl9lbnRyeS0+bWFza2VkX3ZpcnR1YWxfc2VnbWVudF9pZCkKKyAgICAgICYmIChwYWdlX3RsYl9lbnRyeS0+bWFza2VkX3BhZ2UKKwkgID09IG9tX2VhX21hc2tlZF9wYWdlKGVhKSkpIHsKKyAgICBUUkFDRSh0cmFjZV92bSwgKCJlYT0weCVseCAtIHRsYiBoaXQgLSB0bGI9MHglbHhcbiIsCisJICAgICAgIChsb25nKWVhLCAobG9uZylwYWdlX3RsYl9lbnRyeSkpOworICAgIHJldHVybiBwYWdlX3RsYl9lbnRyeTsKKyAgfQorICAgICAgCisgIC8qIGRyYXRzLCBpdCBpcyBhIHRsYiBtaXNzICovCisgIHsKKyAgICB1bnNpZ25lZF93b3JkIHBhZ2VfaGFzaCA9CisgICAgICBvbV9oYXNoX3BhZ2Uoc2VnbWVudF90bGJfZW50cnktPm1hc2tlZF92aXJ0dWFsX3NlZ21lbnRfaWQsIGVhKTsKKyAgICBpbnQgY3VycmVudF9oYXNoOworICAgIGZvciAoY3VycmVudF9oYXNoID0gMDsgY3VycmVudF9oYXNoIDwgMjsgY3VycmVudF9oYXNoICs9IDEpIHsKKyAgICAgIHVuc2lnbmVkX3dvcmQgcmVhbF9hZGRyZXNzX29mX3B0ZV9ncm91cCA9CisJKG1hcC0+cmVhbF9hZGRyZXNzX29mX3BhZ2VfdGFibGUKKwkgfCAocGFnZV9oYXNoICYgbWFwLT5wYWdlX3RhYmxlX2hhc2hfbWFzaykpOworICAgICAgdW5zaWduZWRfd29yZCByZWFsX2FkZHJlc3Nfb2ZfcHRlXzA7CisgICAgICBUUkFDRSh0cmFjZV92bSwKKwkgICAgKCJlYT0weCVseCAtIGh0YWIgc2VhcmNoICVkIC0gaHRhYj0weCVseCBoYXNoPTB4JWx4IG1hc2s9MHglbHggcHRlZz0weCVseFxuIiwKKwkgICAgIChsb25nKWVhLCBjdXJyZW50X2hhc2gsCisJICAgICBtYXAtPnJlYWxfYWRkcmVzc19vZl9wYWdlX3RhYmxlLAorCSAgICAgcGFnZV9oYXNoLAorCSAgICAgbWFwLT5wYWdlX3RhYmxlX2hhc2hfbWFzaywKKwkgICAgIChsb25nKXJlYWxfYWRkcmVzc19vZl9wdGVfZ3JvdXApKTsKKyAgICAgIGZvciAocmVhbF9hZGRyZXNzX29mX3B0ZV8wID0gcmVhbF9hZGRyZXNzX29mX3B0ZV9ncm91cDsKKwkgICByZWFsX2FkZHJlc3Nfb2ZfcHRlXzAgPCAocmVhbF9hZGRyZXNzX29mX3B0ZV9ncm91cAorCQkJCSAgICArIHNpemVvZl9wdGVfZ3JvdXApOworCSAgIHJlYWxfYWRkcmVzc19vZl9wdGVfMCArPSBzaXplb2ZfcHRlKSB7CisJdW5zaWduZWRfd29yZCBwdGVfMCA9IG9tX3JlYWRfd29yZChtYXAsCisJCQkJCSAgIHJlYWxfYWRkcmVzc19vZl9wdGVfMCwKKwkJCQkJICAgcHJvY2Vzc29yLCBjaWEpOworCS8qIGRpZCB3ZSBoaXQ/ICovCisJaWYgKG9tX3B0ZV8wX3ZhbGlkKHB0ZV8wKQorCSAgICAmJiAoY3VycmVudF9oYXNoID09IG9tX3B0ZV8wX2hhc2gocHRlXzApKQorCSAgICAmJiAoc2VnbWVudF90bGJfZW50cnktPm1hc2tlZF92aXJ0dWFsX3NlZ21lbnRfaWQKKwkJPT0gb21fcHRlXzBfbWFza2VkX3ZzaWQocHRlXzApKQorCSAgICAmJiAob21fZWFfYXBpKGVhKSA9PSBvbV9wdGVfMF9hcGkocHRlXzApKSkgeworCSAgdW5zaWduZWRfd29yZCByZWFsX2FkZHJlc3Nfb2ZfcHRlXzEgPSAocmVhbF9hZGRyZXNzX29mX3B0ZV8wCisJCQkJCQkgKyBzaXplb2ZfcHRlIC8gMik7CisJICB1bnNpZ25lZF93b3JkIHB0ZV8xID0gb21fcmVhZF93b3JkKG1hcCwKKwkJCQkJICAgICByZWFsX2FkZHJlc3Nfb2ZfcHRlXzEsCisJCQkJCSAgICAgcHJvY2Vzc29yLCBjaWEpOworCSAgcGFnZV90bGJfZW50cnktPnByb3RlY3Rpb24gPSBvbV9wdGVfMV9wcChwdGVfMSk7CisJICBwYWdlX3RsYl9lbnRyeS0+Y2hhbmdlZCA9IG9tX3B0ZV8xX2NoYW5nZWQocHRlXzEpOworCSAgcGFnZV90bGJfZW50cnktPm1hc2tlZF92aXJ0dWFsX3NlZ21lbnRfaWQgPSBzZWdtZW50X3RsYl9lbnRyeS0+bWFza2VkX3ZpcnR1YWxfc2VnbWVudF9pZDsKKwkgIHBhZ2VfdGxiX2VudHJ5LT5tYXNrZWRfcGFnZSA9IG9tX2VhX21hc2tlZF9wYWdlKGVhKTsKKwkgIHBhZ2VfdGxiX2VudHJ5LT5tYXNrZWRfcmVhbF9wYWdlX251bWJlciA9IG9tX3B0ZV8xX21hc2tlZF9ycG4ocHRlXzEpOworCSAgcGFnZV90bGJfZW50cnktPnJlYWxfYWRkcmVzc19vZl9wdGVfMSA9IHJlYWxfYWRkcmVzc19vZl9wdGVfMTsKKwkgIGlmICghb21fcHRlXzFfcmVmZXJlbmNlZChwdGVfMSkpIHsKKwkgICAgb21fd3JpdGVfd29yZChtYXAsCisJCQkgIHJlYWxfYWRkcmVzc19vZl9wdGVfMSwKKwkJCSAgcHRlXzEgfCBCSVQoNTUpLAorCQkJICBwcm9jZXNzb3IsIGNpYSk7CisJICAgIFRSQUNFKHRyYWNlX3ZtLAorCQkgICgiZWE9MHglbHggLSBodGFiIGhpdCAtIHNldCByZWYgLSB0bGI9MHglbHggJnB0ZTE9MHglbHhcbiIsCisJCSAgIChsb25nKWVhLCAobG9uZylwYWdlX3RsYl9lbnRyeSwgKGxvbmcpcmVhbF9hZGRyZXNzX29mX3B0ZV8xKSk7CisJICB9CisJICBlbHNlIHsKKwkgICAgVFJBQ0UodHJhY2Vfdm0sCisJCSAgKCJlYT0weCVseCAtIGh0YWIgaGl0IC0gdGxiPTB4JWx4ICZwdGUxPTB4JWx4XG4iLAorCQkgICAobG9uZyllYSwgKGxvbmcpcGFnZV90bGJfZW50cnksIChsb25nKXJlYWxfYWRkcmVzc19vZl9wdGVfMSkpOworCSAgfQorCSAgcmV0dXJuIHBhZ2VfdGxiX2VudHJ5OworCX0KKyAgICAgIH0KKyAgICAgIHBhZ2VfaGFzaCA9IH5wYWdlX2hhc2g7IC8qPz8/Ki8KKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKworU1RBVElDX0lOTElORV9WTVwKKyh2b2lkKQorb21faW50ZXJydXB0KGNwdSAqcHJvY2Vzc29yLAorCSAgICAgdW5zaWduZWRfd29yZCBjaWEsCisJICAgICB1bnNpZ25lZF93b3JkIGVhLAorCSAgICAgb21fYWNjZXNzX3R5cGVzIGFjY2VzcywKKwkgICAgIHN0b3JhZ2VfaW50ZXJydXB0X3JlYXNvbnMgcmVhc29uKQoreworICBzd2l0Y2ggKGFjY2VzcykgeworICBjYXNlIG9tX2RhdGFfcmVhZDoKKyAgICBkYXRhX3N0b3JhZ2VfaW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBlYSwgcmVhc29uLCAwLyohaXNfc3RvcmUqLyk7CisgICAgYnJlYWs7CisgIGNhc2Ugb21fZGF0YV93cml0ZToKKyAgICBkYXRhX3N0b3JhZ2VfaW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBlYSwgcmVhc29uLCAxLyppc19zdG9yZSovKTsKKyAgICBicmVhazsKKyAgY2FzZSBvbV9pbnN0cnVjdGlvbl9yZWFkOgorICAgIGluc3RydWN0aW9uX3N0b3JhZ2VfaW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCByZWFzb24pOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGVycm9yKCJpbnRlcm5hbCBlcnJvciAtIG9tX2ludGVycnVwdCAtIHVuZXhwZWN0ZWQgYWNjZXNzIHR5cGUgJWQiLCBhY2Nlc3MpOworICB9Cit9CisKKworU1RBVElDX0lOTElORV9WTVwKKyh1bnNpZ25lZF93b3JkKQorb21fdHJhbnNsYXRlX2VmZmVjdGl2ZV90b19yZWFsKG9tX21hcCAqbWFwLAorCQkJICAgICAgIHVuc2lnbmVkX3dvcmQgZWEsCisJCQkgICAgICAgb21fYWNjZXNzX3R5cGVzIGFjY2VzcywKKwkJCSAgICAgICBjcHUgKnByb2Nlc3NvciwKKwkJCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSwKKwkJCSAgICAgICBpbnQgYWJvcnQpCit7CisgIG9tX2JhdCAqYmF0ID0gTlVMTDsKKyAgb21fc2VnbWVudF90bGJfZW50cnkgKnNlZ21lbnRfdGxiX2VudHJ5ID0gTlVMTDsKKyAgb21fcGFnZV90bGJfZW50cnkgKnBhZ2VfdGxiX2VudHJ5ID0gTlVMTDsKKyAgdW5zaWduZWRfd29yZCByYTsKKworICBpZiAoIW1hcC0+aXNfcmVsb2NhdGUpIHsKKyAgICByYSA9IGVhOworICAgIFRSQUNFKHRyYWNlX3ZtLCAoImVhPTB4JWx4IC0gZGlyZWN0IG1hcCAtIHJhPTB4JWx4XG4iLAorCQkgICAgIChsb25nKWVhLCAobG9uZylyYSkpOworICAgIHJldHVybiByYTsKKyAgfQorCisgIC8qIG1hdGNoIHdpdGggQkFUPyAqLworICBiYXQgPSBvbV9lZmZlY3RpdmVfdG9fYmF0KG1hcCwgZWEpOworICBpZiAoYmF0ICE9IE5VTEwpIHsKKyAgICBpZiAoIW9tX3ZhbGlkX2FjY2Vzc1sxXVtiYXQtPnByb3RlY3Rpb25fYml0c11bYWNjZXNzXSkgeworICAgICAgVFJBQ0UodHJhY2Vfdm0sICgiZWE9MHglbHggLSBiYXQgYWNjZXNzIHZpb2xhdGlvblxuIiwgKGxvbmcpZWEpKTsKKyAgICAgIGlmIChhYm9ydCkKKwlvbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIGVhLCBhY2Nlc3MsCisJCSAgICAgcHJvdGVjdGlvbl92aW9sYXRpb25fc3RvcmFnZV9pbnRlcnJ1cHQpOworICAgICAgZWxzZQorCXJldHVybiBNQVNLKDAsIDYzKTsKKyAgICB9CisKKyAgICByYSA9ICgoZWEgJiBiYXQtPmJsb2NrX2xlbmd0aF9tYXNrKSB8IGJhdC0+YmxvY2tfcmVhbF9wYWdlX251bWJlcik7CisgICAgVFJBQ0UodHJhY2Vfdm0sICgiZWE9MHglbHggLSBiYXQgdHJhbnNsYXRpb24gLSByYT0weCVseFxuIiwKKwkJICAgICAobG9uZyllYSwgKGxvbmcpcmEpKTsKKyAgICByZXR1cm4gcmE7CisgIH0KKworICAvKiB0cmFuc2xhdGUgZWEgdG8gdmEgdXNpbmcgc2VnbWVudCBtYXAgKi8KKyAgc2VnbWVudF90bGJfZW50cnkgPSBvbV9lZmZlY3RpdmVfdG9fdmlydHVhbChtYXAsIGVhLCBwcm9jZXNzb3IsIGNpYSk7CisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyAgaWYgKHNlZ21lbnRfdGxiX2VudHJ5ID09IE5VTEwpIHsKKyAgICBUUkFDRSh0cmFjZV92bSwgKCJlYT0weCVseCAtIHNlZ21lbnQgdGxiIG1pc3NcbiIsIChsb25nKWVhKSk7CisgICAgaWYgKGFib3J0KQorICAgICAgb21faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBlYSwgYWNjZXNzLAorCQkgICBzZWdtZW50X3RhYmxlX21pc3Nfc3RvcmFnZV9pbnRlcnJ1cHQpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBNQVNLKDAsIDYzKTsKKyAgfQorI2VuZGlmCisgIC8qIGNoZWNrIGZvciBpbnZhbGlkIHNlZ21lbnQgYWNjZXNzIHR5cGUgKi8KKyAgaWYgKHNlZ21lbnRfdGxiX2VudHJ5LT5pbnZhbGlkX2FjY2VzcyA9PSBhY2Nlc3MpIHsKKyAgICBUUkFDRSh0cmFjZV92bSwgKCJlYT0weCVseCAtIHNlZ21lbnQgYWNjZXNzIGludmFsaWRcbiIsIChsb25nKWVhKSk7CisgICAgaWYgKGFib3J0KQorICAgICAgb21faW50ZXJydXB0KHByb2Nlc3NvciwgY2lhLCBlYSwgYWNjZXNzLAorCQkgICBwcm90ZWN0aW9uX3Zpb2xhdGlvbl9zdG9yYWdlX2ludGVycnVwdCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIE1BU0soMCwgNjMpOworICB9CisKKyAgLyogbG9va3VwIGluIFBURSAqLworICBwYWdlX3RsYl9lbnRyeSA9IG9tX3ZpcnR1YWxfdG9fcmVhbChtYXAsIGVhLCBzZWdtZW50X3RsYl9lbnRyeSwKKwkJCQkgICAgICBhY2Nlc3MsCisJCQkJICAgICAgcHJvY2Vzc29yLCBjaWEpOworICBpZiAocGFnZV90bGJfZW50cnkgPT0gTlVMTCkgeworICAgIFRSQUNFKHRyYWNlX3ZtLCAoImVhPTB4JWx4IC0gcGFnZSB0bGIgbWlzc1xuIiwgKGxvbmcpZWEpKTsKKyAgICBpZiAoYWJvcnQpCisgICAgICBvbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIGVhLCBhY2Nlc3MsCisJCSAgIGhhc2hfdGFibGVfbWlzc19zdG9yYWdlX2ludGVycnVwdCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIE1BU0soMCwgNjMpOworICB9CisgIGlmICghKG9tX3ZhbGlkX2FjY2VzcworCVtzZWdtZW50X3RsYl9lbnRyeS0+a2V5W21hcC0+aXNfcHJvYmxlbV9zdGF0ZV1dCisJW3BhZ2VfdGxiX2VudHJ5LT5wcm90ZWN0aW9uXQorCVthY2Nlc3NdKSkgeworICAgIFRSQUNFKHRyYWNlX3ZtLCAoImVhPTB4JWx4IC0gcGFnZSB0bGIgYWNjZXNzIHZpb2xhdGlvblxuIiwgKGxvbmcpZWEpKTsKKyAgICBpZiAoYWJvcnQpCisgICAgICBvbV9pbnRlcnJ1cHQocHJvY2Vzc29yLCBjaWEsIGVhLCBhY2Nlc3MsCisJCSAgIHByb3RlY3Rpb25fdmlvbGF0aW9uX3N0b3JhZ2VfaW50ZXJydXB0KTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gTUFTSygwLCA2Myk7CisgIH0KKworICAvKiB1cGRhdGUgY2hhbmdlIGJpdCBhcyBuZWVkZWQgKi8KKyAgaWYgKGFjY2VzcyA9PSBvbV9kYXRhX3dyaXRlICYmIXBhZ2VfdGxiX2VudHJ5LT5jaGFuZ2VkKSB7CisgICAgdW5zaWduZWRfd29yZCBwdGVfMSA9IG9tX3JlYWRfd29yZChtYXAsCisJCQkJICAgICAgIHBhZ2VfdGxiX2VudHJ5LT5yZWFsX2FkZHJlc3Nfb2ZfcHRlXzEsCisJCQkJICAgICAgIHByb2Nlc3NvciwgY2lhKTsKKyAgICBvbV93cml0ZV93b3JkKG1hcCwKKwkJICBwYWdlX3RsYl9lbnRyeS0+cmVhbF9hZGRyZXNzX29mX3B0ZV8xLAorCQkgIHB0ZV8xIHwgQklUKDU2KSwKKwkJICBwcm9jZXNzb3IsIGNpYSk7CisgICAgVFJBQ0UodHJhY2Vfdm0sICgiZWE9MHglbHggLSBzZXQgY2hhbmdlIGJpdCAtIHRsYj0weCVseCAmcHRlMT0weCVseFxuIiwKKwkJICAgICAobG9uZyllYSwgKGxvbmcpcGFnZV90bGJfZW50cnksCisJCSAgICAgKGxvbmcpcGFnZV90bGJfZW50cnktPnJlYWxfYWRkcmVzc19vZl9wdGVfMSkpOworICB9CisKKyAgcmEgPSAocGFnZV90bGJfZW50cnktPm1hc2tlZF9yZWFsX3BhZ2VfbnVtYmVyIHwgb21fZWFfbWFza2VkX2J5dGUoZWEpKTsKKyAgVFJBQ0UodHJhY2Vfdm0sICgiZWE9MHglbHggLSBwYWdlIHRyYW5zbGF0aW9uIC0gcmE9MHglbHhcbiIsCisJCSAgIChsb25nKWVhLCAobG9uZylyYSkpOworICByZXR1cm4gcmE7Cit9CisKKworLyoKKyAqIERlZmluaXRpb24gb2Ygb3BlcmF0aW9ucyBmb3IgbWVtb3J5IG1hbmFnZW1lbnQKKyAqLworCisKKy8qIHJlYnVpbGQgYWxsIHRoZSByZWxldmFudCBiYXQgaW5mb3JtYXRpb24gKi8KK1NUQVRJQ19JTkxJTkVfVk1cCisodm9pZCkKK29tX3VucGFja19iYXQob21fYmF0ICpiYXQsCisJICAgICAgc3ByZWcgdWJhdCwKKwkgICAgICBzcHJlZyBsYmF0KQoreworICAvKiBmb3IgZXh0cmFjdGluZyBvdXQgdGhlIG9mZnNldCB3aXRoaW4gYSBwYWdlICovCisgIGJhdC0+YmxvY2tfbGVuZ3RoX21hc2sgPSAoKE1BU0tFRCh1YmF0LCA1MSwgNjEpIDw8ICgxNy0yKSkKKwkJCSAgICB8IE1BU0soNjMtMTcrMSwgNjMpKTsKKworICAvKiBmb3IgY2hlY2tpbmcgdGhlIGVmZmVjdGl2ZSBwYWdlIGluZGV4ICovCisgIGJhdC0+YmxvY2tfZWZmZWN0aXZlX3BhZ2VfaW5kZXggPSBNQVNLRUQodWJhdCwgMCwgNDYpOworICBiYXQtPmJsb2NrX2VmZmVjdGl2ZV9wYWdlX2luZGV4X21hc2sgPSB+YmF0LT5ibG9ja19sZW5ndGhfbWFzazsKKworICAvKiBwcm90ZWN0aW9uIGluZm9ybWF0aW9uICovCisgIGJhdC0+cHJvdGVjdGlvbl9iaXRzID0gRVhUUkFDVEVEKGxiYXQsIDYyLCA2Myk7CisgIGJhdC0+YmxvY2tfcmVhbF9wYWdlX251bWJlciA9IE1BU0tFRChsYmF0LCAwLCA0Nik7Cit9CisKKworLyogcmVidWlsZCB0aGUgZ2l2ZW4gYmF0IHRhYmxlICovCitTVEFUSUNfSU5MSU5FX1ZNXAorKHZvaWQpCitvbV91bnBhY2tfYmF0cyhvbV9iYXRzICpiYXRzLAorCSAgICAgICBzcHJlZyAqcmF3X2JhdHMsCisJICAgICAgIG1zcmVnIG1zcikKK3sKKyAgaW50IGk7CisgIGJhdHMtPm5yX3ZhbGlkX2JhdF9yZWdpc3RlcnMgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgbnJfb21fYmF0X3JlZ2lzdGVycyoyOyBpICs9IDIpIHsKKyAgICBzcHJlZyB1YmF0ID0gcmF3X2JhdHNbaV07CisgICAgc3ByZWcgbGJhdCA9IHJhd19iYXRzW2krMV07CisgICAgaWYgKChtc3IgJiBtc3JfcHJvYmxlbV9zdGF0ZSkKKwk/IEVYVFJBQ1RFRCh1YmF0LCA2MywgNjMpCisJOiBFWFRSQUNURUQodWJhdCwgNjIsIDYyKSkgeworICAgICAgb21fdW5wYWNrX2JhdCgmYmF0cy0+YmF0W2JhdHMtPm5yX3ZhbGlkX2JhdF9yZWdpc3RlcnNdLAorCQkgICAgdWJhdCwgbGJhdCk7CisgICAgICBiYXRzLT5ucl92YWxpZF9iYXRfcmVnaXN0ZXJzICs9IDE7CisgICAgfQorICB9Cit9CisKKworI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCitTVEFUSUNfSU5MSU5FX1ZNXAorKHZvaWQpCitvbV91bnBhY2tfc3Iodm0gKnZpcnR1YWwsCisJICAgICBzcmVnICpzcnMsCisJICAgICBpbnQgd2hpY2hfc3IsCisJICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBvbV9zZWdtZW50X3RsYl9lbnRyeSAqc2VnbWVudF90bGJfZW50cnkgPSAwOworICBzcmVnIG5ld19zcl92YWx1ZSA9IDA7CisKKyAgLyogY2hlY2sgcmVnaXN0ZXIgaW4gcmFuZ2UgKi8KKyAgQVNTRVJUKHdoaWNoX3NyID49IDAgJiYgd2hpY2hfc3IgPCBucl9vbV9zZWdtZW50X3RsYl9lbnRyaWVzKTsKKworICAvKiBnZXQgdGhlIHdvcmtpbmcgdmFsdWVzICovCisgIHNlZ21lbnRfdGxiX2VudHJ5ID0gJnZpcnR1YWwtPnNlZ21lbnRfdGxiLmVudHJ5W3doaWNoX3NyXTsgIAorICBuZXdfc3JfdmFsdWUgPSBzcnNbd2hpY2hfc3JdOworICAKKyAgLyogZG8gd2Ugc3VwcG9ydCB0aGlzICovCisgIGlmIChNQVNLRUQzMihuZXdfc3JfdmFsdWUsIDAsIDApKQorICAgIGNwdV9lcnJvcihwcm9jZXNzb3IsIGNpYSwgInVuc3VwcG9ydGVkIHZhbHVlIG9mIFQgaW4gc2VnbWVudCByZWdpc3RlciAlZCIsCisJICAgICAgd2hpY2hfc3IpOworCisgIC8qIHVwZGF0ZSBpbmZvICovCisgIHNlZ21lbnRfdGxiX2VudHJ5LT5rZXlbb21fc3VwZXJ2aXNvcl9zdGF0ZV0gPSBFWFRSQUNURUQzMihuZXdfc3JfdmFsdWUsIDEsIDEpOworICBzZWdtZW50X3RsYl9lbnRyeS0+a2V5W29tX3Byb2JsZW1fc3RhdGVdID0gRVhUUkFDVEVEMzIobmV3X3NyX3ZhbHVlLCAyLCAyKTsKKyAgc2VnbWVudF90bGJfZW50cnktPmludmFsaWRfYWNjZXNzID0gKE1BU0tFRDMyKG5ld19zcl92YWx1ZSwgMywgMykKKwkJCQkgICAgICAgPyBvbV9pbnN0cnVjdGlvbl9yZWFkCisJCQkJICAgICAgIDogb21fYWNjZXNzX2FueSk7CisgIHNlZ21lbnRfdGxiX2VudHJ5LT5tYXNrZWRfdmlydHVhbF9zZWdtZW50X2lkID0KKyAgICBJTlNFUlRFRDMyKEVYVFJBQ1RFRDMyKG5ld19zcl92YWx1ZSwgOCwgMzEpLAorCSAgICAgICAzMS02LTI0KzEsIDMxLTYpOyAvKiBhbGlnbmVkIHJlYWR5IGZvciBwdGUgZ3JvdXAgYWRkciAqLworfQorI2VuZGlmCisKKworI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCitTVEFUSUNfSU5MSU5FX1ZNXAorKHZvaWQpCitvbV91bnBhY2tfc3JzKHZtICp2aXJ0dWFsLAorCSAgICAgIHNyZWcgKnNycywKKwkgICAgICBjcHUgKnByb2Nlc3NvciwKKwkgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgaW50IHdoaWNoX3NyOworICBmb3IgKHdoaWNoX3NyID0gMDsgd2hpY2hfc3IgPCBucl9vbV9zZWdtZW50X3RsYl9lbnRyaWVzOyB3aGljaF9zcisrKSB7CisgICAgb21fdW5wYWNrX3NyKHZpcnR1YWwsIHNycywgd2hpY2hfc3IsCisJCSBwcm9jZXNzb3IsIGNpYSk7CisgIH0KK30KKyNlbmRpZgorCisKKy8qIFJlYnVpbGQgYWxsIHRoZSBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSBuZXcgY29udGV4dCBhcyBzcGVjaWZlZCBieQorICAgdGhlIHBhc3NlZCByZWdpc3RlcnMgKi8KK0lOTElORV9WTVwKKyh2b2lkKQordm1fc3luY2hyb25pemVfY29udGV4dCh2bSAqdmlydHVhbCwKKwkJICAgICAgIHNwcmVnICpzcHJzLAorCQkgICAgICAgc3JlZyAqc3JzLAorCQkgICAgICAgbXNyZWcgbXNyLAorCQkgICAgICAgLyoqLworCQkgICAgICAgY3B1ICpwcm9jZXNzb3IsCisJCSAgICAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKworICAvKiBlbmFibGUvZGlzYWJsZSB0cmFuc2xhdGlvbiAqLworICBpbnQgcHJvYmxlbV9zdGF0ZSA9IChtc3IgJiBtc3JfcHJvYmxlbV9zdGF0ZSkgIT0gMDsKKyAgaW50IGRhdGFfcmVsb2NhdGUgPSAobXNyICYgbXNyX2RhdGFfcmVsb2NhdGUpICE9IDA7CisgIGludCBpbnN0cnVjdGlvbl9yZWxvY2F0ZSA9IChtc3IgJiBtc3JfaW5zdHJ1Y3Rpb25fcmVsb2NhdGUpICE9IDA7CisgIGludCBsaXR0bGVfZW5kaWFuID0gKG1zciAmIG1zcl9saXR0bGVfZW5kaWFuX21vZGUpICE9IDA7CisKKyAgdW5zaWduZWRfd29yZCBwYWdlX3RhYmxlX2hhc2hfbWFzazsKKyAgdW5zaWduZWRfd29yZCByZWFsX2FkZHJlc3Nfb2ZfcGFnZV90YWJsZTsKKyAKKyAgLyogdXBkYXRlIGN1cnJlbnQgcHJvY2Vzc29yIG1vZGUgKi8KKyAgdmlydHVhbC0+aW5zdHJ1Y3Rpb25fbWFwLnRyYW5zbGF0aW9uLmlzX3JlbG9jYXRlID0gaW5zdHJ1Y3Rpb25fcmVsb2NhdGU7CisgIHZpcnR1YWwtPmluc3RydWN0aW9uX21hcC50cmFuc2xhdGlvbi5pc19wcm9ibGVtX3N0YXRlID0gcHJvYmxlbV9zdGF0ZTsKKyAgdmlydHVhbC0+ZGF0YV9tYXAudHJhbnNsYXRpb24uaXNfcmVsb2NhdGUgPSBkYXRhX3JlbG9jYXRlOworICB2aXJ0dWFsLT5kYXRhX21hcC50cmFuc2xhdGlvbi5pc19wcm9ibGVtX3N0YXRlID0gcHJvYmxlbV9zdGF0ZTsKKworICAvKiB1cGRhdGUgYmF0IHJlZ2lzdGVycyBmb3IgdGhlIG5ldyBjb250ZXh0ICovCisgIG9tX3VucGFja19iYXRzKCZ2aXJ0dWFsLT5pYmF0cywgJnNwcnNbc3ByX2liYXQwdV0sIG1zcik7CisgIG9tX3VucGFja19iYXRzKCZ2aXJ0dWFsLT5kYmF0cywgJnNwcnNbc3ByX2RiYXQwdV0sIG1zcik7CisKKyAgLyogdW5wYWNrIFNEUjEgLSB0aGUgc3RvcmFnZSBkZXNjcmlwdGlvbiByZWdpc3RlciAxICovCisjaWYgKFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRSA9PSA2NCkKKyAgcmVhbF9hZGRyZXNzX29mX3BhZ2VfdGFibGUgPSBNQVNLRUQ2NChzcHJzW3Nwcl9zZHIxXSwgMCwgNDUpOworICBwYWdlX3RhYmxlX2hhc2hfbWFzayA9IE1BU0s2NCgxOCsyOC1FWFRSQUNURUQ2NChzcHJzW3Nwcl9zZHIxXSwgNTksIDYzKSwKKwkJCQk2My03KTsKKyNlbmRpZgorI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCisgIHJlYWxfYWRkcmVzc19vZl9wYWdlX3RhYmxlID0gTUFTS0VEMzIoc3Byc1tzcHJfc2RyMV0sIDAsIDE1KTsKKyAgcGFnZV90YWJsZV9oYXNoX21hc2sgPSAoSU5TRVJURUQzMihFWFRSQUNURUQzMihzcHJzW3Nwcl9zZHIxXSwgMjMsIDMxKSwKKwkJCQkgICAgIDcsIDcrOS0xKQorCQkJICB8IE1BU0szMig3KzksIDMxLTYpKTsKKyNlbmRpZgorICB2aXJ0dWFsLT5pbnN0cnVjdGlvbl9tYXAudHJhbnNsYXRpb24ucmVhbF9hZGRyZXNzX29mX3BhZ2VfdGFibGUgPSByZWFsX2FkZHJlc3Nfb2ZfcGFnZV90YWJsZTsKKyAgdmlydHVhbC0+aW5zdHJ1Y3Rpb25fbWFwLnRyYW5zbGF0aW9uLnBhZ2VfdGFibGVfaGFzaF9tYXNrID0gcGFnZV90YWJsZV9oYXNoX21hc2s7CisgIHZpcnR1YWwtPmRhdGFfbWFwLnRyYW5zbGF0aW9uLnJlYWxfYWRkcmVzc19vZl9wYWdlX3RhYmxlID0gcmVhbF9hZGRyZXNzX29mX3BhZ2VfdGFibGU7CisgIHZpcnR1YWwtPmRhdGFfbWFwLnRyYW5zbGF0aW9uLnBhZ2VfdGFibGVfaGFzaF9tYXNrID0gcGFnZV90YWJsZV9oYXNoX21hc2s7CisKKworICAvKiB1bnBhY2sgdGhlIHNlZ21lbnQgdGxiIHJlZ2lzdGVycyAqLworI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gMzIpCisgIG9tX3VucGFja19zcnModmlydHVhbCwgc3JzLAorCQlwcm9jZXNzb3IsIGNpYSk7CisjZW5kaWYKKyAKKyAgLyogc2V0IHVwIHRoZSBYT1IgcmVnaXN0ZXJzIGlmIHRoZSBjdXJyZW50IGVuZGlhbiBtb2RlIGNvbmZsaWN0cworICAgICB3aXRoIHdoYXQgaXMgaW4gdGhlIE1TUiAqLworICBpZiAoV0lUSF9YT1JfRU5ESUFOKSB7CisgICAgaW50IGkgPSAxOworICAgIHVuc2lnbmVkIG1hc2s7CisgICAgaWYgKChsaXR0bGVfZW5kaWFuICYmIENVUlJFTlRfVEFSR0VUX0JZVEVfT1JERVIgPT0gTElUVExFX0VORElBTikKKwl8fCAoIWxpdHRsZV9lbmRpYW4gJiYgQ1VSUkVOVF9UQVJHRVRfQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKSkKKyAgICAgIG1hc2sgPSAwOworICAgIGVsc2UKKyAgICAgIG1hc2sgPSBXSVRIX1hPUl9FTkRJQU4gLSAxOworICAgIHdoaWxlIChpIC0gMSA8IFdJVEhfWE9SX0VORElBTikgeworICAgICAgdmlydHVhbC0+aW5zdHJ1Y3Rpb25fbWFwLnRyYW5zbGF0aW9uLnhvcltpLTFdID0gbWFzazsKKyAgICAgIHZpcnR1YWwtPmRhdGFfbWFwLnRyYW5zbGF0aW9uLnhvcltpLTFdID0gIG1hc2s7CisgICAgICBtYXNrID0gKG1hc2sgPDwgMSkgJiAoV0lUSF9YT1JfRU5ESUFOIC0gMSk7CisgICAgICBpID0gaSAqIDI7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIC8qIGRvbid0IGFsbG93IHRoZSBwcm9jZXNzb3IgdG8gY2hhbmdlIGVuZGlhbiBtb2RlcyAqLworICAgIGlmICgobGl0dGxlX2VuZGlhbiAmJiBDVVJSRU5UX1RBUkdFVF9CWVRFX09SREVSICE9IExJVFRMRV9FTkRJQU4pCisJfHwgKCFsaXR0bGVfZW5kaWFuICYmIENVUlJFTlRfVEFSR0VUX0JZVEVfT1JERVIgIT0gQklHX0VORElBTikpCisgICAgICBjcHVfZXJyb3IocHJvY2Vzc29yLCBjaWEsICJhdHRlbXB0IHRvIGNoYW5nZSBoYXJkd2lyZWQgYnl0ZSBvcmRlciIpOworICB9Cit9CisKKy8qIHVwZGF0ZSB2bSBkYXRhIHN0cnVjdHVyZXMgZHVlIHRvIGEgVExCIG9wZXJhdGlvbiAqLworCitJTkxJTkVfVk1cCisodm9pZCkKK3ZtX3BhZ2VfdGxiX2ludmFsaWRhdGVfZW50cnkodm0gKm1lbW9yeSwKKwkJCSAgICAgdW5zaWduZWRfd29yZCBlYSkKK3sKKyAgaW50IGkgPSBvbV9wYWdlX3RsYl9pbmRleChlYSk7CisgIG1lbW9yeS0+aW5zdHJ1Y3Rpb25fdGxiLmVudHJ5W2ldLm1hc2tlZF92aXJ0dWFsX3NlZ21lbnRfaWQgPSBNQVNLKDAsIDYzKTsKKyAgbWVtb3J5LT5kYXRhX3RsYi5lbnRyeVtpXS5tYXNrZWRfdmlydHVhbF9zZWdtZW50X2lkID0gTUFTSygwLCA2Myk7CisgIFRSQUNFKHRyYWNlX3ZtLCAoImVhPTB4JWx4IC0gdGxiIGludmFsaWRhdGUgZW50cnlcbiIsIChsb25nKWVhKSk7Cit9CisKK0lOTElORV9WTVwKKyh2b2lkKQordm1fcGFnZV90bGJfaW52YWxpZGF0ZV9hbGwodm0gKm1lbW9yeSkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBucl9vbV9wYWdlX3RsYl9lbnRyaWVzOyBpKyspIHsKKyAgICBtZW1vcnktPmluc3RydWN0aW9uX3RsYi5lbnRyeVtpXS5tYXNrZWRfdmlydHVhbF9zZWdtZW50X2lkID0gTUFTSygwLCA2Myk7CisgICAgbWVtb3J5LT5kYXRhX3RsYi5lbnRyeVtpXS5tYXNrZWRfdmlydHVhbF9zZWdtZW50X2lkID0gTUFTSygwLCA2Myk7CisgIH0KKyAgVFJBQ0UodHJhY2Vfdm0sICgidGxiIGludmFsaWRhdGUgYWxsXG4iKSk7Cit9CisKKworCitJTkxJTkVfVk1cCisodm1fZGF0YV9tYXAgKikKK3ZtX2NyZWF0ZV9kYXRhX21hcCh2bSAqbWVtb3J5KQoreworICByZXR1cm4gJm1lbW9yeS0+ZGF0YV9tYXA7Cit9CisKKworSU5MSU5FX1ZNXAorKHZtX2luc3RydWN0aW9uX21hcCAqKQordm1fY3JlYXRlX2luc3RydWN0aW9uX21hcCh2bSAqbWVtb3J5KQoreworICByZXR1cm4gJm1lbW9yeS0+aW5zdHJ1Y3Rpb25fbWFwOworfQorCisKK1NUQVRJQ19JTkxJTkVfVk1cCisodW5zaWduZWRfd29yZCkKK3ZtX3RyYW5zbGF0ZShvbV9tYXAgKm1hcCwKKwkgICAgIHVuc2lnbmVkX3dvcmQgZWEsCisJICAgICBvbV9hY2Nlc3NfdHlwZXMgYWNjZXNzLAorCSAgICAgY3B1ICpwcm9jZXNzb3IsCisJICAgICB1bnNpZ25lZF93b3JkIGNpYSwKKwkgICAgIGludCBhYm9ydCkKK3sKKyAgc3dpdGNoIChDVVJSRU5UX0VOVklST05NRU5UKSB7CisgIGNhc2UgVVNFUl9FTlZJUk9OTUVOVDoKKyAgY2FzZSBWSVJUVUFMX0VOVklST05NRU5UOgorICAgIHJldHVybiBlYTsKKyAgY2FzZSBPUEVSQVRJTkdfRU5WSVJPTk1FTlQ6CisgICAgcmV0dXJuIG9tX3RyYW5zbGF0ZV9lZmZlY3RpdmVfdG9fcmVhbChtYXAsIGVhLCBhY2Nlc3MsCisJCQkJCSAgcHJvY2Vzc29yLCBjaWEsCisJCQkJCSAgYWJvcnQpOworICBkZWZhdWx0OgorICAgIGVycm9yKCJpbnRlcm5hbCBlcnJvciAtIHZtX3RyYW5zbGF0ZSAtIGJhZCBzd2l0Y2giKTsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisKK0lOTElORV9WTVwKKyh1bnNpZ25lZF93b3JkKQordm1fcmVhbF9kYXRhX2FkZHIodm1fZGF0YV9tYXAgKm1hcCwKKwkJICB1bnNpZ25lZF93b3JkIGVhLAorCQkgIGludCBpc19yZWFkLAorCQkgIGNwdSAqcHJvY2Vzc29yLAorCQkgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICByZXR1cm4gdm1fdHJhbnNsYXRlKCZtYXAtPnRyYW5zbGF0aW9uLAorCQkgICAgICBlYSwKKwkJICAgICAgaXNfcmVhZCA/IG9tX2RhdGFfcmVhZCA6IG9tX2RhdGFfd3JpdGUsCisJCSAgICAgIHByb2Nlc3NvciwKKwkJICAgICAgY2lhLAorCQkgICAgICAxKTsgLyphYm9ydCovCit9CisKKworSU5MSU5FX1ZNXAorKHVuc2lnbmVkX3dvcmQpCit2bV9yZWFsX2luc3RydWN0aW9uX2FkZHIodm1faW5zdHJ1Y3Rpb25fbWFwICptYXAsCisJCQkgY3B1ICpwcm9jZXNzb3IsCisJCQkgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHJldHVybiB2bV90cmFuc2xhdGUoJm1hcC0+dHJhbnNsYXRpb24sCisJCSAgICAgIGNpYSwKKwkJICAgICAgb21faW5zdHJ1Y3Rpb25fcmVhZCwKKwkJICAgICAgcHJvY2Vzc29yLAorCQkgICAgICBjaWEsCisJCSAgICAgIDEpOyAvKmFib3J0Ki8KK30KKworSU5MSU5FX1ZNXAorKGluc3RydWN0aW9uX3dvcmQpCit2bV9pbnN0cnVjdGlvbl9tYXBfcmVhZCh2bV9pbnN0cnVjdGlvbl9tYXAgKm1hcCwKKwkJCWNwdSAqcHJvY2Vzc29yLAorCQkJdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHVuc2lnbmVkX3dvcmQgcmEgPSB2bV9yZWFsX2luc3RydWN0aW9uX2FkZHIobWFwLCBwcm9jZXNzb3IsIGNpYSk7CisgIEFTU0VSVCgoY2lhICYgMHgzKSA9PSAwKTsgLyogYWx3YXlzIGFsaWduZWQgKi8KKyAgaWYgKFdJVEhfWE9SX0VORElBTikKKyAgICByYSBePSBtYXAtPnRyYW5zbGF0aW9uLnhvcltzaXplb2YoaW5zdHJ1Y3Rpb25fd29yZCkgLSAxXTsKKyAgcmV0dXJuIGNvcmVfbWFwX3JlYWRfNChtYXAtPmNvZGUsIHJhLCBwcm9jZXNzb3IsIGNpYSk7Cit9CisKKworSU5MSU5FX1ZNXAorKGludCkKK3ZtX2RhdGFfbWFwX3JlYWRfYnVmZmVyKHZtX2RhdGFfbWFwICptYXAsCisJCQl2b2lkICp0YXJnZXQsCisJCQl1bnNpZ25lZF93b3JkIGFkZHIsCisJCQl1bnNpZ25lZCBucl9ieXRlcywKKwkJCWNwdSAqcHJvY2Vzc29yLAorCQkJdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHVuc2lnbmVkIGNvdW50OworICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBucl9ieXRlczsgY291bnQrKykgeworICAgIHVuc2lnbmVkXzEgYnl0ZTsKKyAgICB1bnNpZ25lZF93b3JkIGVhID0gYWRkciArIGNvdW50OworICAgIHVuc2lnbmVkX3dvcmQgcmEgPSB2bV90cmFuc2xhdGUoJm1hcC0+dHJhbnNsYXRpb24sCisJCQkJICAgIGVhLCBvbV9kYXRhX3JlYWQsCisJCQkJICAgIHByb2Nlc3NvciwgLypwcm9jZXNzb3IqLworCQkJCSAgICBjaWEsIC8qY2lhKi8KKwkJCQkgICAgcHJvY2Vzc29yICE9IE5VTEwpOyAvKmFib3J0PyovCisgICAgaWYgKHJhID09IE1BU0soMCwgNjMpKQorICAgICAgYnJlYWs7CisgICAgaWYgKFdJVEhfWE9SX0VORElBTikKKyAgICAgIHJhIF49IG1hcC0+dHJhbnNsYXRpb24ueG9yWzBdOworICAgIGlmIChjb3JlX21hcF9yZWFkX2J1ZmZlcihtYXAtPnJlYWQsICZieXRlLCByYSwgc2l6ZW9mKGJ5dGUpKQorCSE9IHNpemVvZihieXRlKSkKKyAgICAgIGJyZWFrOworICAgICgodW5zaWduZWRfMSopdGFyZ2V0KVtjb3VudF0gPSBUMkhfMShieXRlKTsKKyAgfQorICByZXR1cm4gY291bnQ7Cit9CisKKworSU5MSU5FX1ZNXAorKGludCkKK3ZtX2RhdGFfbWFwX3dyaXRlX2J1ZmZlcih2bV9kYXRhX21hcCAqbWFwLAorCQkJIGNvbnN0IHZvaWQgKnNvdXJjZSwKKwkJCSB1bnNpZ25lZF93b3JkIGFkZHIsCisJCQkgdW5zaWduZWQgbnJfYnl0ZXMsCisJCQkgaW50IHZpb2xhdGVfcmVhZF9vbmx5X3NlY3Rpb24sCisJCQkgY3B1ICpwcm9jZXNzb3IsCisJCQkgdW5zaWduZWRfd29yZCBjaWEpCit7CisgIHVuc2lnbmVkIGNvdW50OworICB1bnNpZ25lZF8xIGJ5dGU7CisgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IG5yX2J5dGVzOyBjb3VudCsrKSB7CisgICAgdW5zaWduZWRfd29yZCBlYSA9IGFkZHIgKyBjb3VudDsKKyAgICB1bnNpZ25lZF93b3JkIHJhID0gdm1fdHJhbnNsYXRlKCZtYXAtPnRyYW5zbGF0aW9uLAorCQkJCSAgICBlYSwgb21fZGF0YV93cml0ZSwKKwkJCQkgICAgcHJvY2Vzc29yLAorCQkJCSAgICBjaWEsCisJCQkJICAgIHByb2Nlc3NvciAhPSBOVUxMKTsgLyphYm9ydD8qLworICAgIGlmIChyYSA9PSBNQVNLKDAsIDYzKSkKKyAgICAgIGJyZWFrOworICAgIGlmIChXSVRIX1hPUl9FTkRJQU4pCisgICAgICByYSBePSBtYXAtPnRyYW5zbGF0aW9uLnhvclswXTsKKyAgICBieXRlID0gVDJIXzEoKCh1bnNpZ25lZF8xKilzb3VyY2UpW2NvdW50XSk7CisgICAgaWYgKGNvcmVfbWFwX3dyaXRlX2J1ZmZlcigodmlvbGF0ZV9yZWFkX29ubHlfc2VjdGlvbgorCQkJICAgICAgID8gbWFwLT5yZWFkCisJCQkgICAgICAgOiBtYXAtPndyaXRlKSwKKwkJCSAgICAgICZieXRlLCByYSwgc2l6ZW9mKGJ5dGUpKSAhPSBzaXplb2YoYnl0ZSkpCisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gY291bnQ7Cit9CisKKworLyogZGVmaW5lIHRoZSByZWFkL3dyaXRlIDEvMi80Lzgvd29yZCBmdW5jdGlvbnMgKi8KKworI2RlZmluZSBOIDEKKyNpbmNsdWRlICJ2bV9uLmgiCisjdW5kZWYgTgorCisjZGVmaW5lIE4gMgorI2luY2x1ZGUgInZtX24uaCIKKyN1bmRlZiBOCisKKyNkZWZpbmUgTiA0CisjaW5jbHVkZSAidm1fbi5oIgorI3VuZGVmIE4KKworI2RlZmluZSBOIDgKKyNpbmNsdWRlICJ2bV9uLmgiCisjdW5kZWYgTgorCisjZGVmaW5lIE4gd29yZAorI2luY2x1ZGUgInZtX24uaCIKKyN1bmRlZiBOCisKKworCisjZW5kaWYgLyogX1ZNX0NfICovCmRpZmYgLS1naXQgYS9zaW0vcHBjL3ZtLmggYi9zaW0vcHBjL3ZtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjNGM4YwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvdm0uaApAQCAtMCwwICsxLDE1NSBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBfVk1fSF8KKyNkZWZpbmUgX1ZNX0hfCisKK3R5cGVkZWYgc3RydWN0IF92bSB2bTsKK3R5cGVkZWYgc3RydWN0IF92bV9kYXRhX21hcCB2bV9kYXRhX21hcDsKK3R5cGVkZWYgc3RydWN0IF92bV9pbnN0cnVjdGlvbl9tYXAgdm1faW5zdHJ1Y3Rpb25fbWFwOworCisKKy8qIGVhY2ggUG93ZXJQQyByZXF1aXJlcyB0d28gdmlydHVhbCBtZW1vcnkgbWFwcyAqLworCitJTkxJTkVfVk1cCisodm0gKikgdm1fY3JlYXRlCisoY29yZSAqbWVtb3J5KTsKKworSU5MSU5FX1ZNXAorKHZtX2RhdGFfbWFwICopIHZtX2NyZWF0ZV9kYXRhX21hcAorKHZtICptZW1vcnkpOworCitJTkxJTkVfVk1cCisodm1faW5zdHJ1Y3Rpb25fbWFwICopIHZtX2NyZWF0ZV9pbnN0cnVjdGlvbl9tYXAKKyh2bSAqbWVtb3J5KTsKKworCisvKiBhZGRyZXNzIHRyYW5zbGF0aW9uLCBpZiB0aGUgdHJhbnNsYXRpb24gaXMgaW52YWxpZAorICAgdGhlc2Ugd2lsbCBub3QgcmV0dXJuICovCisKK0lOTElORV9WTVwKKyh1bnNpZ25lZF93b3JkKSB2bV9yZWFsX2RhdGFfYWRkcgorKHZtX2RhdGFfbWFwICpkYXRhX21hcCwKKyB1bnNpZ25lZF93b3JkIGVhLAorIGludCBpc19yZWFkLAorIGNwdSAqcHJvY2Vzc29yLAorIHVuc2lnbmVkX3dvcmQgY2lhKTsKKworSU5MSU5FX1ZNXAorKHVuc2lnbmVkX3dvcmQpIHZtX3JlYWxfaW5zdHJ1Y3Rpb25fYWRkcgorKHZtX2luc3RydWN0aW9uX21hcCAqaW5zdHJ1Y3Rpb25fbWFwLAorIGNwdSAqcHJvY2Vzc29yLAorIHVuc2lnbmVkX3dvcmQgY2lhKTsKKworCisvKiBnZW5lcmljIGJsb2NrIHRyYW5zZmVycy4gIERlcGVuZGFudCBvbiB0aGUgcHJlc2VuY2Ugb2YgdGhlCisgICBQUk9DRVNTT1IgYXJnLCBlaXRoZXIgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVyZWQgb3IgKGlmCisgICBQUk9DRVNTT1IgaXMgbm9uIE5VTEwpIGFib3J0cyB0aGUgc2ltdWxhdGlvbiAqLworCitJTkxJTkVfVk1cCisoaW50KSB2bV9kYXRhX21hcF9yZWFkX2J1ZmZlcgorKHZtX2RhdGFfbWFwICptYXAsCisgdm9pZCAqdGFyZ2V0LAorIHVuc2lnbmVkX3dvcmQgYWRkciwKKyB1bnNpZ25lZCBsZW4sCisgY3B1ICpwcm9jZXNzb3IsCisgdW5zaWduZWRfd29yZCBjaWEpOworCitJTkxJTkVfVk1cCisoaW50KSB2bV9kYXRhX21hcF93cml0ZV9idWZmZXIKKyh2bV9kYXRhX21hcCAqbWFwLAorIGNvbnN0IHZvaWQgKnNvdXJjZSwKKyB1bnNpZ25lZF93b3JkIGFkZHIsCisgdW5zaWduZWQgbGVuLAorIGludCB2aW9sYXRlX3JlYWRfb25seV9zZWN0aW9uLAorIGNwdSAqcHJvY2Vzc29yLAorIHVuc2lnbmVkX3dvcmQgY2lhKTsKKworCisvKiBmZXRjaCB0aGUgbmV4dCBpbnN0cnVjdGlvbiBmcm9tIG1lbW9yeSAqLworCitJTkxJTkVfVk1cCisoaW5zdHJ1Y3Rpb25fd29yZCkgdm1faW5zdHJ1Y3Rpb25fbWFwX3JlYWQKKyh2bV9pbnN0cnVjdGlvbl9tYXAgKmluc3RydWN0aW9uX21hcCwKKyBjcHUgKnByb2Nlc3NvciwKKyB1bnNpZ25lZF93b3JkIGNpYSk7CisKKworLyogcmVhZCBkYXRhIGZyb20gbWVtb3J5ICovCisKKyNkZWZpbmUgREVDTEFSRV9WTV9EQVRBX01BUF9SRUFEX04oTikgXAorSU5MSU5FX1ZNXAorKHVuc2lnbmVkXyMjTikgdm1fZGF0YV9tYXBfcmVhZF8jI04gXAorKHZtX2RhdGFfbWFwICptYXAsIFwKKyB1bnNpZ25lZF93b3JkIGVhLCBcCisgY3B1ICpwcm9jZXNzb3IsIFwKKyB1bnNpZ25lZF93b3JkIGNpYSk7CisKK0RFQ0xBUkVfVk1fREFUQV9NQVBfUkVBRF9OKDEpCitERUNMQVJFX1ZNX0RBVEFfTUFQX1JFQURfTigyKQorREVDTEFSRV9WTV9EQVRBX01BUF9SRUFEX04oNCkKK0RFQ0xBUkVfVk1fREFUQV9NQVBfUkVBRF9OKDgpCitERUNMQVJFX1ZNX0RBVEFfTUFQX1JFQURfTih3b3JkKQorCisKKy8qIHdyaXRlIGRhdGEgdG8gbWVtb3J5ICovCisKKyNkZWZpbmUgREVDTEFSRV9WTV9EQVRBX01BUF9XUklURV9OKE4pIFwKK0lOTElORV9WTVwKKyh2b2lkKSB2bV9kYXRhX21hcF93cml0ZV8jI04gXAorKHZtX2RhdGFfbWFwICptYXAsIFwKKyB1bnNpZ25lZF93b3JkIGFkZHIsIFwKKyB1bnNpZ25lZF8jI04gdmFsLCBcCisgY3B1ICpwcm9jZXNzb3IsIFwKKyB1bnNpZ25lZF93b3JkIGNpYSk7CisKK0RFQ0xBUkVfVk1fREFUQV9NQVBfV1JJVEVfTigxKQorREVDTEFSRV9WTV9EQVRBX01BUF9XUklURV9OKDIpCitERUNMQVJFX1ZNX0RBVEFfTUFQX1dSSVRFX04oNCkKK0RFQ0xBUkVfVk1fREFUQV9NQVBfV1JJVEVfTig4KQorREVDTEFSRV9WTV9EQVRBX01BUF9XUklURV9OKHdvcmQpCisKKworLyogdXBkYXRlIHZtIGRhdGEgc3RydWN0dXJlcyBkdWUgdG8gYSBzeW5jaHJvbml6YXRpb24gcG9pbnQgKi8KKworSU5MSU5FX1ZNXAorKHZvaWQpIHZtX3N5bmNocm9uaXplX2NvbnRleHQKKyh2bSAqbWVtb3J5LAorIHNwcmVnICpzcHJzLAorIHNyZWcgKnNycywKKyBtc3JlZyBtc3IsCisgLyoqLworIGNwdSAqcHJvY2Vzc29yLAorIHVuc2lnbmVkX3dvcmQgY2lhKTsKKworCisvKiB1cGRhdGUgdm0gZGF0YSBzdHJ1Y3R1cmVzIGR1ZSB0byBhIFRMQiBvcGVyYXRpb24gKi8KKworSU5MSU5FX1ZNXAorKHZvaWQpIHZtX3BhZ2VfdGxiX2ludmFsaWRhdGVfZW50cnkKKyh2bSAqbWVtb3J5LAorIHVuc2lnbmVkX3dvcmQgZWEpOworCitJTkxJTkVfVk1cCisodm9pZCkgdm1fcGFnZV90bGJfaW52YWxpZGF0ZV9hbGwKKyh2bSAqbWVtb3J5KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaW0vcHBjL3ZtX24uaCBiL3NpbS9wcGMvdm1fbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMjJmZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vcHBjL3ZtX24uaApAQCAtMCwwICsxLDEzNCBAQAorLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBwcm9ncmFtIHBzaW0uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIAorICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgICovCisKKworI2lmbmRlZiBOCisjZXJyb3IgIk4gbXVzdCBiZSAjZGVmaW5lZCIKKyNlbmRpZgorCisvKiBOT1RFOiBTZWUgZW5kIG9mIGZpbGUgZm9yICN1bmRlZiAqLworI2RlZmluZSB1bnNpZ25lZF9OIFhDT05DQVQyKHVuc2lnbmVkXyxOKQorI2RlZmluZSBUMkhfTiBYQ09OQ0FUMihUMkhfLE4pCisjZGVmaW5lIEgyVF9OIFhDT05DQVQyKEgyVF8sTikKKyNkZWZpbmUgdm1fZGF0YV9tYXBfcmVhZF9OIFhDT05DQVQyKHZtX2RhdGFfbWFwX3JlYWRfLE4pCisjZGVmaW5lIHZtX2RhdGFfbWFwX3dyaXRlX04gWENPTkNBVDIodm1fZGF0YV9tYXBfd3JpdGVfLE4pCisKKworSU5MSU5FX1ZNXAorKHVuc2lnbmVkX04pCit2bV9kYXRhX21hcF9yZWFkX04odm1fZGF0YV9tYXAgKm1hcCwKKwkJICAgdW5zaWduZWRfd29yZCBlYSwKKwkJICAgY3B1ICpwcm9jZXNzb3IsCisJCSAgIHVuc2lnbmVkX3dvcmQgY2lhKQoreworICBpZiAoKGVhICYgKHNpemVvZih1bnNpZ25lZF9OKS0xKSkgPT0gMCkgeworICAgIHVuc2lnbmVkIHJhID0gdm1fcmVhbF9kYXRhX2FkZHIobWFwLCBlYSwgMS8qaXMtcmVhZCovLCBwcm9jZXNzb3IsIGNpYSk7CisgICAgdW5zaWduZWRfTiB2YWw7CisgICAgaWYgKFdJVEhfWE9SX0VORElBTikKKyAgICAgIHJhIF49IG1hcC0+dHJhbnNsYXRpb24ueG9yW3NpemVvZih1bnNpZ25lZF9OKSAtIDFdOworICAgIHZhbCA9IFhDT05DQVQyKGNvcmVfbWFwX3JlYWRfLE4pKG1hcC0+cmVhZCwgcmEsIHByb2Nlc3NvciwgY2lhKTsKKyAgICBpZiAoV0lUSF9NT04gJiBNT05JVE9SX0xPQURfU1RPUkVfVU5JVCkKKyAgICAgIG1vbl9yZWFkKGVhLCByYSwgc2l6ZW9mKHVuc2lnbmVkX04pLCBwcm9jZXNzb3IsIGNpYSk7CisgICAgVFJBQ0UodHJhY2VfbG9hZF9zdG9yZSwgKCJsb2FkIGNpYT0weCVseCBlYT0weCVseCBOPSVsZCB2YWw9MHglbHhcbiIsCisJCQkgICAgIChsb25nKWNpYSwgKGxvbmcpZWEsIChsb25nKXNpemVvZih1bnNpZ25lZF9OKSwgKGxvbmcpdmFsKSk7CisgICAgcmV0dXJuIHZhbDsKKyAgfQorICBlbHNlIHsKKyAgICBzd2l0Y2ggKENVUlJFTlRfQUxJR05NRU5UKSB7CisgICAgY2FzZSBTVFJJQ1RfQUxJR05NRU5UOgorICAgICAgYWxpZ25tZW50X2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwgZWEpOworICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBOT05TVFJJQ1RfQUxJR05NRU5UOgorICAgICAgeworCXVuc2lnbmVkX04gdmFsOworCWlmICh2bV9kYXRhX21hcF9yZWFkX2J1ZmZlcihtYXAsICZ2YWwsIGVhLCBzaXplb2YodW5zaWduZWRfTiksIHByb2Nlc3NvciwgY2lhKQorCSAgICAhPSBzaXplb2YodW5zaWduZWRfTikpIHsKKwkgIGNwdV9lcnJvcihwcm9jZXNzb3IsIGNpYSwgIm1pc2FsaWduZWQgJWQgYnl0ZSByZWFkIHRvIDB4JWx4IGZhaWxlZCIsCisJCSAgICBzaXplb2YodW5zaWduZWRfTiksICh1bnNpZ25lZCBsb25nKWVhKTsKKwl9CisJdmFsID0gVDJIX04odmFsKTsKKwlpZiAoV0lUSF9NT04gJiBNT05JVE9SX0xPQURfU1RPUkVfVU5JVCkgeworCSAgLyogWVVDSyAqLworCSAgdW5zaWduZWQgcmEgPSB2bV9yZWFsX2RhdGFfYWRkcihtYXAsIGVhLCAxLCBwcm9jZXNzb3IsIGNpYSk7CisJICBtb25fcmVhZChlYSwgcmEsIHNpemVvZih1bnNpZ25lZF9OKSwgcHJvY2Vzc29yLCBjaWEpOworCX0KKwlUUkFDRSh0cmFjZV9sb2FkX3N0b3JlLCAoImxvYWQgY2lhPTB4JWx4IGVhPTB4JWx4IE49JWxkIGRhdGE9MHglbHhcbiIsCisJCQkJIChsb25nKWNpYSwgKGxvbmcpZWEsIChsb25nKXNpemVvZih1bnNpZ25lZF9OKSwgKGxvbmcpdmFsKSk7CisJcmV0dXJuIHZhbDsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgZXJyb3IoImludGVybmFsIGVycm9yIC0gdm1fZGF0YV9tYXBfcmVhZF9OIC0gYmFkIHN3aXRjaCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9Cit9CisKK0lOTElORV9WTVwKKyh2b2lkKQordm1fZGF0YV9tYXBfd3JpdGVfTih2bV9kYXRhX21hcCAqbWFwLAorCQkgICAgdW5zaWduZWRfd29yZCBlYSwKKwkJICAgIHVuc2lnbmVkX04gdmFsLAorCQkgICAgY3B1ICpwcm9jZXNzb3IsCisJCSAgICB1bnNpZ25lZF93b3JkIGNpYSkKK3sKKyAgaWYgKChlYSAmIChzaXplb2YodW5zaWduZWRfTiktMSkpID09IDApIHsKKyAgICB1bnNpZ25lZCByYSA9IHZtX3JlYWxfZGF0YV9hZGRyKG1hcCwgZWEsIDAvKmlzLXJlYWQ/Ki8sIHByb2Nlc3NvciwgY2lhKTsKKyAgICBpZiAoV0lUSF9YT1JfRU5ESUFOKQorICAgICAgcmEgXj0gbWFwLT50cmFuc2xhdGlvbi54b3Jbc2l6ZW9mKHVuc2lnbmVkX04pIC0gMV07CisgICAgWENPTkNBVDIoY29yZV9tYXBfd3JpdGVfLE4pKG1hcC0+d3JpdGUsIHJhLCB2YWwsIHByb2Nlc3NvciwgY2lhKTsKKyAgICBpZiAoV0lUSF9NT04gJiBNT05JVE9SX0xPQURfU1RPUkVfVU5JVCkKKyAgICAgIG1vbl93cml0ZShlYSwgcmEsIHNpemVvZih1bnNpZ25lZF9OKSwgcHJvY2Vzc29yLCBjaWEpOworICAgIFRSQUNFKHRyYWNlX2xvYWRfc3RvcmUsICgic3RvcmUgY2lhPTB4JWx4IGVhPTB4JWx4IE49JWxkIHZhbD0weCVseFxuIiwKKwkJCSAgICAgKGxvbmcpY2lhLCAobG9uZyllYSwgKGxvbmcpc2l6ZW9mKHVuc2lnbmVkX04pLCAobG9uZyl2YWwpKTsKKyAgfQorICBlbHNlIHsKKyAgICBzd2l0Y2ggKENVUlJFTlRfQUxJR05NRU5UKSB7CisgICAgY2FzZSBTVFJJQ1RfQUxJR05NRU5UOgorICAgICAgYWxpZ25tZW50X2ludGVycnVwdChwcm9jZXNzb3IsIGNpYSwgZWEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBOT05TVFJJQ1RfQUxJR05NRU5UOgorICAgICAgeworCXVuc2lnbmVkX04gZGF0YSA9IEgyVF9OKHZhbCk7CisJaWYgKHZtX2RhdGFfbWFwX3dyaXRlX2J1ZmZlcihtYXAsICZkYXRhLCBlYSwgc2l6ZW9mKHVuc2lnbmVkX04pLCAwLCBwcm9jZXNzb3IsIGNpYSkKKwkgICAgIT0gc2l6ZW9mKHVuc2lnbmVkX04pKSB7CisJICBjcHVfZXJyb3IocHJvY2Vzc29yLCBjaWEsICJtaXNhbGlnbmVkICVkIGJ5dGUgd3JpdGUgdG8gMHglbHggZmFpbGVkIiwKKwkJICAgIHNpemVvZih1bnNpZ25lZF9OKSwgKHVuc2lnbmVkIGxvbmcpZWEpOworCX0KKwlpZiAoV0lUSF9NT04gJiBNT05JVE9SX0xPQURfU1RPUkVfVU5JVCkgeworCSAgLyogWVVDSyAqLworCSAgdW5zaWduZWQgcmEgPSB2bV9yZWFsX2RhdGFfYWRkcihtYXAsIGVhLCAxLCBwcm9jZXNzb3IsIGNpYSk7CisJICBtb25fd3JpdGUoZWEsIHJhLCBzaXplb2YodW5zaWduZWRfTiksIHByb2Nlc3NvciwgY2lhKTsKKwl9CisJVFJBQ0UodHJhY2VfbG9hZF9zdG9yZSwgKCJzdG9yZSBjaWE9MHglbHggZWE9MHglbHggTj0lbGQgdmFsPTB4JWx4XG4iLAorCQkJCSAobG9uZyljaWEsIChsb25nKWVhLCAobG9uZylzaXplb2YodW5zaWduZWRfTiksIChsb25nKXZhbCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yKCJpbnRlcm5hbCBlcnJvciAtIHZtX2RhdGFfbWFwX3dyaXRlX04gLSBiYWQgc3dpdGNoIik7CisgICAgfQorICB9Cit9CisKKy8qIE5PVEU6IHNlZSBzdGFydCBvZiBmaWxlIGZvciAjZGVmaW5lICovCisjdW5kZWYgdW5zaWduZWRfTgorI3VuZGVmIFQySF9OCisjdW5kZWYgSDJUX04KKyN1bmRlZiB2bV9kYXRhX21hcF9yZWFkX04KKyN1bmRlZiB2bV9kYXRhX21hcF93cml0ZV9OCmRpZmYgLS1naXQgYS9zaW0vcHBjL3dvcmRzLmggYi9zaW0vcHBjL3dvcmRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMxOGRmNAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9wcGMvd29yZHMuaApAQCAtMCwwICsxLDExNiBAQAorLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHNpbSAobW9kZWwgb2YgdGhlIFBvd2VyUEModG0pIGFyY2hpdGVjdHVyZSkKKworICAgQ29weXJpZ2h0IChDKSAxOTk0LTE5OTUsIEFuZHJldyBDYWduZXkgPGNhZ25leUBoaWdobGFuZC5jb20uYXU+CisKKyAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIAorICAgLS0KKworICAgUG93ZXJQQyBpcyBhIHRyYWRlbWFyayBvZiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLiAqLworCisKKy8qIEJhc2ljIHR5cGUgc2l6ZXMgZm9yIHRoZSBQb3dlclBDICovCisKKyNpZm5kZWYgX1dPUkRTX0hfCisjZGVmaW5lIF9XT1JEU19IXworCisvKiBUWVBFUzoKKworICAgICBuYXR1cmFsKglzaWduIGRldGVybWluZWQgYnkgaG9zdAorICAgICBzaWduZWQqICAgIHNpZ25lZCB0eXBlIG9mIHRoZSBnaXZlbiBzaXplCisgICAgIHVuc2lnbmVkKiAgVGhlIGNvcnJlc3BvbmRpbmcgaW5zaWduZWQgdHlwZQorCisgICBTSVpFUworCisgICAgICpOTglTaXplIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgYml0cworICAgICAqX05OICAgICAgIFNpemUgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgICAgKl93b3JkICAgICBTaXplIGJhc2VkIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlJ3Mgd29yZAorICAgICAJCXdvcmQgc2l6ZSAoMzIvNjQgYml0cykKKyAgICAgKl9jZWxsICAgICBTaXplIGJhc2VkIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlJ3MKKyAgICAgCQlJRUVFIDEyNzUgY2VsbCBzaXplIChhbG1vc3QgYWx3YXlzIDMyIGJpdHMpCisKKyovCisKKworLyogYml0IGJhc2VkICovCit0eXBlZGVmIGNoYXIgbmF0dXJhbDg7Cit0eXBlZGVmIHNob3J0IG5hdHVyYWwxNjsKK3R5cGVkZWYgbG9uZyBuYXR1cmFsMzI7CisKK3R5cGVkZWYgc2lnbmVkIGNoYXIgc2lnbmVkODsKK3R5cGVkZWYgc2lnbmVkIHNob3J0IHNpZ25lZDE2OwordHlwZWRlZiBzaWduZWQgbG9uZyBzaWduZWQzMjsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVuc2lnbmVkODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdW5zaWduZWQxNjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1bnNpZ25lZDMyOworCisjaWZkZWYgX19HTlVDX18KK3R5cGVkZWYgbG9uZyBsb25nIG5hdHVyYWw2NDsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBzaWduZWQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVuc2lnbmVkNjQ7CisjZW5kaWYKKworI2lmZGVmIF9NU0NfVkVSCit0eXBlZGVmIF9faW50NjQgbmF0dXJhbDY0OwordHlwZWRlZiBzaWduZWQgX19pbnQ2NCBzaWduZWQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1bnNpZ25lZDY0OworI2VuZGlmIAorCisKKy8qIGJ5dGUgYmFzZWQgKi8KK3R5cGVkZWYgbmF0dXJhbDggbmF0dXJhbF8xOwordHlwZWRlZiBuYXR1cmFsMTYgbmF0dXJhbF8yOwordHlwZWRlZiBuYXR1cmFsMzIgbmF0dXJhbF80OwordHlwZWRlZiBuYXR1cmFsNjQgbmF0dXJhbF84OworCit0eXBlZGVmIHNpZ25lZDggc2lnbmVkXzE7Cit0eXBlZGVmIHNpZ25lZDE2IHNpZ25lZF8yOwordHlwZWRlZiBzaWduZWQzMiBzaWduZWRfNDsKK3R5cGVkZWYgc2lnbmVkNjQgc2lnbmVkXzg7CisKK3R5cGVkZWYgdW5zaWduZWQ4IHVuc2lnbmVkXzE7Cit0eXBlZGVmIHVuc2lnbmVkMTYgdW5zaWduZWRfMjsKK3R5cGVkZWYgdW5zaWduZWQzMiB1bnNpZ25lZF80OwordHlwZWRlZiB1bnNpZ25lZDY0IHVuc2lnbmVkXzg7CisKKworLyogZm9yIGdlbmVyYWwgd29yaywgdGhlIGZvbGxvd2luZyBhcmUgZGVmaW5lZCAqLworLyogdW5zaWduZWQ6ID49IDMyIGJpdHMgKi8KKy8qIHNpZ25lZDogICA+PSAzMiBiaXRzICovCisvKiBsb25nOiAgICAgPj0gMzIgYml0cywgc2lnbiB1bmRlZmluZWQgKi8KKy8qIGludDogICAgICBzbWFsbCBpbmRpY2F0b3IgKi8KKworLyogdGFyZ2V0IGFyY2hpdGVjdHVyZSBiYXNlZCAqLworI2lmIChXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgPT0gNjQpCit0eXBlZGVmIG5hdHVyYWw2NCBuYXR1cmFsX3dvcmQ7Cit0eXBlZGVmIHVuc2lnbmVkNjQgdW5zaWduZWRfd29yZDsKK3R5cGVkZWYgc2lnbmVkNjQgc2lnbmVkX3dvcmQ7CisjZWxzZQordHlwZWRlZiBuYXR1cmFsMzIgbmF0dXJhbF93b3JkOwordHlwZWRlZiB1bnNpZ25lZDMyIHVuc2lnbmVkX3dvcmQ7Cit0eXBlZGVmIHNpZ25lZDMyIHNpZ25lZF93b3JkOworI2VuZGlmCisKKworLyogT3RoZXIgaW5zdHJ1Y3Rpb25zICovCit0eXBlZGVmIHVuc2lnbmVkMzIgaW5zdHJ1Y3Rpb25fd29yZDsKKworLyogSUVFRSAxMjc1IGNlbGwgc2l6ZSAtIG9ubHkgc3VwcG9ydCAzMmJpdCBtb2RlIGF0IHByZXNlbnQgKi8KK3R5cGVkZWYgbmF0dXJhbDMyIG5hdHVyYWxfY2VsbDsKK3R5cGVkZWYgdW5zaWduZWQzMiB1bnNpZ25lZF9jZWxsOwordHlwZWRlZiBzaWduZWQzMiBzaWduZWRfY2VsbDsKKworI2VuZGlmIC8qIF9XT1JEU19IXyAqLwpkaWZmIC0tZ2l0IGEvc2ltL3NoL0NoYW5nZUxvZyBiL3NpbS9zaC9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkzOWQxOAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9zaC9DaGFuZ2VMb2cKQEAgLTAsMCArMSw3MzYgQEAKK1RodSBTZXAgMTAgMDI6MTY6MzkgMTk5NyAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgorCisJKiBpbnRlcnAuYyAoc2F2ZWRfc3RhdGUuYXNyZWdzKTogQWRkIG5ldyBtZW1iZXIgcGFkX2R1bW15LgorCShzaW1fc3RvcmVfcmVnaXN0ZXIsIHNpbV9mZXRjaF9yZWdzaXRlcik6IEFkZCAxIHRvIHJuIGZvciB1c2UKKwlhcyBpbmRleCBpbnRvIHNhdmVkX3N0YXRlLmFzaW50cy4KKworTW9uIEp1biAyOSAxOTozNToyNCAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogc2V0IGVuZGlhbm5lc3MgYmFzZWQgb24gdGhlIEFCRkQgaWYgYSAtRQorCW9wdGlvbiBpcyBub3QgcHJlc2VudCBhbmQgd2UgaGF2ZSBhbiBBQkZELgorCitUdWUgQXByIDI4IDE4OjMzOjMxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1N1biBBcHIgMjYgMTU6MzE6NTUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1N1biBBcHIgMjYgMTU6MTk6NDggMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZ3VyZS5pbjogUmV2ZXJ0ZWQgY2hhbmdlIG9mIEFwciAyNDsgdXNlIHNpbmNsdWRlIGFnYWluLgorCitGcmkgQXByIDI0IDE0OjE2OjQwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitGcmkgQXByIDI0IDExOjE4OjM1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEb24ndCBjYWxsIHNpbmNsdWRlLgorCitTYXQgQXByICA0IDIwOjM2OjI1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitGcmkgTWFyIDI3IDE2OjE1OjUyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgTWFyIDI1IDEyOjM1OjI5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgTWFyIDE4IDEyOjM4OjEyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgRmViIDE3IDEyOjQ5OjQ0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9mZXRjaF9yZWdpc3Rlciwgc2ltX3N0b3JlX3JlZ2lzdGVyKTogUGFzcyBpbgorIAlsZW5ndGggcGFyYW1ldGVyLiAgUmV0dXJuIC0xLgorCitTdW4gRmViICAxIDE2OjQ3OjUxIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitTYXQgSmFuIDMxIDE4OjE1OjQxIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gSmFuIDE5IDIyOjI2OjI5IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gRGVjIDE1IDIzOjE3OjExIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworVGh1IERlYyAgNCAwOToyMTowNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBPY3QgMjIgMTQ6NDM6MDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX2xvYWQpOiBQYXNzIGxtYV9wIGFuZCBzaW1fd3JpdGUgYXJncyB0bworIAlzaW1fbG9hZF9maWxlLgorCitGcmkgT2N0ICAzIDA5OjI4OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgU2VwIDI0IDE3OjM4OjU3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgU2VwIDIzIDExOjA0OjM4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gU2VwIDIyIDExOjQ2OjIwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitGcmkgU2VwIDE5IDE3OjQ1OjI1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gU2VwIDE1IDE3OjM2OjE1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgU2VwICA5IDIwOjUyOjIxIDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9yZXN1bWUpOiBwb2xsX3F1aXQoKSBhdCBsZWFzdCBvbmNlIHBlciBjYWxsOworIAlvdGhlcndpc2UgZ2RiIGNhbiBsb29wIHNpbV9yZXN1bWUoKSB1bmludGVycnVwdGFibHkuCisKK1RodSBTZXAgIDQgMTc6MjE6MjMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1R1ZSBTZXAgIDIgMTM6MTU6MjcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBnZW5jb2RlLmMgKHRhYik6IE9yZGVyIGluc3RydWN0aW9ucyBhY2NvcmRpbmcgdG8gU0gzIGRvY3VtZW50LgorCitXZWQgQXVnIDI3IDE4OjEzOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworVHVlIEF1ZyAyNiAxMDo0MTo1NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fa2lsbCk6IERlbGV0ZS4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEFkZCBBQkZEIGFyZ3VtZW50LgorCShzaW1fbG9hZCk6IE1vdmUgc2V0dGluZyBvZiBQQyBmcm9tIGhlcmUuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBUbyBoZXJlLgorCitNb24gQXVnIDI1IDE3OjUwOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworTW9uIEF1ZyAyNSAxNjoxNzo1MSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IEFkZCBBQkZEIGFyZ3VtZW50LgorCitNb24gSnVuIDIzIDE1OjQ5OjE0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKGdldF9kcik6IEF2b2lkIFNJR0ZQRSBieSBtb3ZpbmcgaW50ZWdlcnMgaW5zdGVhZCBvZgorIAlGUCdzIGFyb3VuZC4KKwkoc2V0X2RyKTogRGl0dG8uCisJCitTdW4gSnVuIDIyIDE5OjMzOjMzIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNldF9mcHNjcjEpOiBGcm9tIEoib3JuIFJlbm5lY2tlCisgCTxhbXlsYWFyQGN5Z251cy5jby51az4sIEZpeCB0eXBvLiBEaXR0byBmb3IgY29tbWVudC4KKwkKK1RodSBKdW4gMTkgMDA6Mjg6MDggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IENsZWFyIHJlZ2lzdGVycyBlYWNoIHRpbWUgYW4KKyAJaW5mZXJpb3IgaXMgc3RhcnRlZC4KKworU3VuIEp1biAxNSAxNToyMjo1MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGdlbmNvZGUuYyAobWFpbik6IFBlcmZvcm0gYmFzaWMgY2hlY2tzIG9uIHRhYiBlbnRyaWVzLgorCisJKiBNYWtlZmlsZS5pbiAoZ2VuY29kZSk6IEFsd2F5cyBjb21waWxlIHdpdGggLWcuCisKK1NhdCBKdW4gMTQgMTM6NDU6MDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBnZW5jb2RlLmMgKGdlbnNpbSk6IE1vdmUgcmVmIGNoZWNraW5nIGNvZGUgdG8gYmVmb3JlIGBzdHVmZicuCisgIAlGb3IgYnJhbmNoZXMgd2l0aCBkZWxheSBzbG90cyByZWZzIHdlcmUgbm90IGJlaW5nIGNoZWNrZWQuCisKKwkqIGludGVycC5jIChzaW1fcmVzdW1lKTogVXNlIG5pYSB0byBzcGVjaWZ5IHRoZSBuZXh0IGluc3RydWN0aW9uCisgCWFkZHJlc3MgaW5zdGVhZCBvZiBvdmVybG9hZGluZyBwYy4KKwkoQyk6IERlbGV0ZSBkZWZpbml0b24gLSByZWZlciB0byBjeWNsZXMgZGlyZWN0bHkuCisJKFNFWFQxMik6IE5ldyBtYWNybyAtIHNpZ24gZXh0ZW5kIGEgMTIgYml0IHF1YW50aXR5LgorCShEZWxheV9TbG90KTogUmVuYW1lIGZyb20gU0wuCisKKwkqIGdlbmNvZGUuYyAodGFiKTogVXBkYXRlL3NpbXBsaWZ5LgorCQorCSogZ2VuY29kZS5jIChnZW5zaW0pOiBCZXR0ZXIgZm9ybWF0dGluZyBvZiBvdXRwdXQgY29kZS4KKwkoZ2Vuc2ltKTogUmVwbGFjZSAxMCB3aXRoIGNvbnN0YW50IE1BWF9OUl9TVFVGRi0gZGVmaW5lIGFzIDE1LgorCSh0YWIpOiBTb3J0IGFscGhhYmV0aWNhbGx5LiAgQnJlYWsgYHN0dWZmJyBpbnRvIG11bHRpcGxlIGxpbmVzLgorCitGcmkgSnVuIDEzIDIyOjEwOjEzIDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KKworCSogZ2VuY29kZS5jIChicmFmLCBic3JmKTogRml4IGJyYW5jaCBkZXN0aW5hdGlvbiBjYWxjdWxhdGlvbiB0bworCWJlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgZG9jdW1lbnRhdGlvbi4KKworRnJpIEp1biAxMyAxNTozMzo1MyAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+CisKKwkqIGludGVycC5jIChpbml0X3BvaW50ZXJzKTogRml4IGxpdHRsZSBlbmRpYW4gdGVzdC4KKworV2VkIE1heSAyOCAyMzo0MjozNSAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+CisKKyAgICAgICAgKiBnZW5jb2RlLmMgKHN3YXAuYik6IEZpeCB0cmVhdG1lbnQgb2YgaGlnaCB3b3JkLgorCitUdWUgTWF5IDIwIDEwOjIzOjI4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogQWRkIGNhbGxiYWNrIGFyZ3VtZW50LgorCShzaW1fc2V0X2NhbGxiYWNrcyk6IERlbGV0ZSBTSU1fREVTQyBhcmd1bWVudC4KKworV2VkIEFwciAzMCAxMTozODowOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoU0lNX0VYVFJBX0NMRUFOKTogRGVmaW5lLgorCShjbGVhbiB0YXJnZXRzKTogRGVsZXRlLgorCShzaC1jbGVhbik6IE5ldyB0YXJnZXQuCisKK1RodSBBcHIgMjQgMDA6Mzk6NTEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgQXByIDIzIDE3OjU1OjIyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHRjb25maWcuaW46IE5ldyBmaWxlLgorCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogSGFuZGxlIG1pc3NpbmcgYXJnIHRvIC1FLgorCitUdWUgQXByIDIyIDA4OjU1OjM1IDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgQWRkIGNsZWFuIHRhcmdldHMuCisKK0ZyaSBBcHIgMTggMTg6NTc6MDQgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogaW50ZXJwLmM6ICBJbmNsdWRlIGZsb2F0LmggYW5kIGRlZmluZSBTSUdUUkFQIGlmIF9XSU4zMi4KKwlXSU4zMiAtPiBfV0lOMzIuCisJKiAodHJhcCk6ICBEbyBkbyBTWVNfY2hvd24gZm9yIF9XSU4zMi4KKworRnJpIEFwciAxOCAxMzozMzowOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX3Jlc3VtZSk6IEZpeCBhcmd1bWVudCB0byBwb2xsX3F1aXQuCisKK0ZyaSBBcHIgMTggMTQ6MTQ6NDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX3N0b3ApOiBOZXcgZnVuY3Rpb24uCisJKHNpbV9yZXN1bWUpOiBVc2UgcG9sbF9xdWl0IGZvciBwb2xsaW5nLgorCitUaHUgQXByIDE3IDAzOjMyOjA0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbG9hZC5vLgorCSogaW50ZXJwLmMgKHRhcmdldF9ieXRlX29yZGVyKTogRGVsZXRlLgorCShzaW1fa2luZCwgbXluYW1lLCBsaXR0bGVfZW5kaWFuX3ApOiBOZXcgc3RhdGljIGxvY2Fscy4KKwkoaW5pdF9wb2ludGVycyk6IFVzZSBsaXR0bGVfZW5kaWFuX3AgaW5zdGVhZCBvZiB0YXJnZXRfYnl0ZV9vcmRlci4KKwkoc2ltX3Jlc3VtZSk6IExpa2V3aXNlLgorCShzaW1fb3Blbik6IFNldCBzaW1fa2luZCwgbXluYW1lLiAgU2V0IGxpdHRsZV9lbmRpYW5fcCBmcm9tIC1FIGFyZy4KKwkoc2ltX2xvYWQpOiBSZXR1cm4gU0lNX1JDLiAgTmV3IGFyZyBhYmZkLiAgQ2FsbCBzaW1fbG9hZF9maWxlIHRvCisJbG9hZCBmaWxlIGludG8gc2ltdWxhdG9yLiAgU2V0IHN0YXJ0IGFkZHJlc3MgZnJvbSBiZmQuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBSZXR1cm4gU0lNX1JDLiAgRGVsZXRlIGFyZyBzdGFydF9hZGRyZXNzLgorCitNb24gQXByICA3IDE1OjQ1OjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitXZWQgQXByICAyIDE1OjA2OjI4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IE5ldyBhcmcgYGtpbmQnLgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBBcHIgIDIgMTQ6MzQ6MTkgMTk5NyBBbmRyZXcgQ2FnbmV5IDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBNYXIgMTkgMDk6MzQ6MzYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fZG9fY29tbWFuZCk6IENoZWNrIGZvciBOVUxMIGNvbW1hbmQgb3IgZW1wdHkKKwlzdHJpbmcgYW5kIGhhbmRsZSBpdCB0aGUgc2FtZSBhcyBhICJoZWxwIiBjb21tYW5kLiAgVXNlIGNhbGxiYWNrCisgCXRvIHByaW50IGVycm9yIG1lc3NhZ2UgZm9yIHVucmVjb2duaXplZCBjb21tYW5kcy4gIFJlcGxhY2UKKwloYXJkY29kZWQgdGFiIGluIGxpdGVyYWwgc3RyaW5nIHdpdGggYSBcdC4gIE90aGVyIG1pbm9yIGNvZGUKKyAJY2xlYW51cC4KKworV2VkIE1hciAxOSAwMToxNDowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gTWFyIDE3IDE1OjEwOjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgorCitGcmkgTWFyIDE0IDEwOjM0OjExIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVGh1IE1hciAxMyAxMzowMDowMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBOZXcgU0lNX0RFU0MgcmVzdWx0LiAgQXJndW1lbnQgaXMgbm93CisJaW4gYXJndiBmb3JtLgorCShvdGhlciBzaW1fKik6IE5ldyBTSU1fREVTQyBhcmd1bWVudC4KKworVHVlIEZlYiAgNCAxMzozMzozMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQENPTU1PTl9NQUtFRklMRV9GUkFHKTogVXNlCisJQ09NTU9OX3tQUkUsUE9TVH1fQ09ORklHX0ZSQUcgaW5zdGVhZC4KKwkqIGNvbmZpZ3VyZS5pbjogc2luY2x1ZGUgLi4vY29tbW9uL2FjbG9jYWwubTQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCitUaHUgSmFuIDIzIDExOjQ2OjIzIDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZSBjb25maWd1cmUuaW4gTWFrZWZpbGUuaW46ICBVcGRhdGUgdG8gbmV3IGNvbmZpZ3VyZQorCXNjaGVtZSB3aGljaCBpcyBtb3JlIGNvbXBhdGlibGUgd2l0aCBXaW5HREIgYnVpbGRzLgorCSogY29uZmlndXJlLmluOiAgSW1wcm92ZSBjb21tZW50IG9uIGhvdyB0byBydW4gYXV0b2NvbmYuCisJKiBjb25maWd1cmU6ICBSZS1ydW4gYXV0b2NvbmYgdG8gZ2V0IG5ldyAuLi9jb21tb24vYWNsb2NhbC5tNC4KKwkqIE1ha2VmaWxlLmluOiAgVXNlIGF1dG9jb25mIHN1YnN0aXR1dGlvbiB0byBpbnN0YWxsIGNvbW1vbgorCW1ha2VmaWxlIGZyYWdtZW50LgorCitXZWQgTm92IDIwIDAyOjA0OjMyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBEZWxldGUgc3R1ZmYgbW92ZWQgdG8gLi4vY29tbW9uL01ha2UtY29tbW9uLmluLgorCShTSU1fT0JKUyxTSU1fRVhUUkFfTElCUyk6IERlZmluZS4KKwkqIGNvbmZpZ3VyZS5pbjogU2ltcGxpZnkgdXNpbmcgbWFjcm9zIGluIC4uL2NvbW1vbi9hY2xvY2FsLm00LgorCUNhbGwgQUNfQ0hFQ0tfSEVBREVSUyh1bmlzdGQuaCkuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogY29uZmlnLmluOiBOZXcgZmlsZS4KKwkqIGludGVycC5jOiAjaW5jbHVkZSAiY29uZmlnLmgiLiAgI2luY2x1ZGUgPHVuaXN0ZC5oPiBpZiBwcmVzZW50LgorCSh0cmFwKTogRmV0Y2ggZXJybm8gdmFsdWUgd2l0aCBjYWxsYmFjay0+Z2V0X2Vycm5vLgorCitUdWUgTm92IDEyIDEzOjM0OjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4gICAKKworCSogaW50ZXJwLmM6IERvbid0IGluY2x1ZGUgd2luZG93cyBwb2xsaW5nIGNvZGUgaWYgaW5zaWRlIHNpbWx1YXRvci4KKworRnJpIFNlcCAyMCAxNDo1Nzo1MCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jOiBNaW5vciBmb3JtYXR0aW5nIGltcHJvdmVtZW50cy4KKwkoc2F2ZWRfc3RhdGVfdHlwZSk6IEFkZCBiYW5rIHJlZ2lzdGVycy4KKwkoYnBfaG9sZGVyKTogTmV3IGZ1bmN0aW9uLCB1c2UgdG8gYnJlYWsgb24gd2hlbiBkZWJ1Z2dpbmcgQlVTRVJST1IuCisJKEJVU0VSUk9SKTogQ2FsbCBpdCBpZiBidXMgZXJyb3Igb2NjdXJzLgorCitXZWQgSnVuIDI2IDEyOjI5OjIyIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKyAgICAgICAgKiBNYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgaW5jbHVkZWRpciwKKyAgICAgICAgSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYtc2V0IHZhbHVlcy4KKyAgICAgICAgKGRvY2Rpcik6IFJlbW92ZWQuCisgICAgICAgICogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBhdXRvY29uZiAyLjUgb3IgaGlnaGVyLgorICAgICAgICAoQUNfUFJPR19JTlNUQUxMKTogQWRkZWQuCisgICAgICAgICogY29uZmlndXJlOiBSZWJ1aWx0LgorCitUaHUgTWF5IDE2IDE1OjQ0OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNhdmVkX3N0YXRlX3R5cGUpOiBBZGQgbWVtc3RhbGxzIGZpZWxkLgorCShNQSkgRGVmaW5lIG1hY3JvLgorCShzaW1fcmVzdW1lKTogTmV3IGxvY2FsIHZhcmlhYmxlIG1lbXN0YWxscy4gIEFkZCBpdCBiYWNrIGluIHRvCisJc2F2ZWRfc3RhdGUgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCisJKHNpbV9pbmZvKTogUmVwb3J0IG1lbXN0YWxscy4KKwkqIGdlbmNvZGUuYyAodGFiKTogQWRkIE1BKCkgdG8gdGhlIGV4ZWN1dGlvbiBzdHJpbmcgb2YgYWxsCisJaW5zdHJ1Y3Rpb25zIHdoaWNoIGFjY2VzcyBtZW1vcnkuCisKK1dlZCBGZWIgMjEgMTI6MTY6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjcuCisKK1R1ZSBEZWMgIDUgMTY6Mzg6NTUgMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogZ2VuY29kZS5jIChtYWMubCk6ICBEb24ndCBhYm9ydCBHREIgaWYgZXhlY3V0aW5nIG1hYy5sCisJaW5zdHJ1Y3Rpb24gKHdoaWNoIGlzIHVuaW1wbGVtZW50ZWQpLiAgR2VuZXJhdGUgYSBTSUdUUkFQIChpbiB0aGUKKwlzaW11bGF0ZWQgdGFyZ2V0KSBpbnN0ZWFkLgorCitNb24gRGVjICA0IDEyOjIyOjI0IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogZ2VuY29kZS5jICh0YWIpOiBBZGRlZCBzZXZlcmFsIHNoMyBvcGNvZGVzLgorCSh0aGluayk6IEFkZGVkIHByaW50b25tYXRjaCBmb3IgQV9TU1IgYW5kIEFfU1BDLgorCSogaW50ZXJwLmMgKFNTUiwgU1BDKTogQWRkZWQgZGVmaW5pdGlvbnMuCisJKHNhdmVkX3N0YXRlX3R5cGUpOiBBZGRlZCBzc3IgYW5kIHNwYyByZWdpc3RlcnMuCisKK1dlZCBOb3YgMjkgMTI6Mzk6MjcgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBnZW5jb2RlLmMgKHRhYik6IEluIHNoYWQvc2hsZCBkZWZpbml0aW9ucywgbmVnYXRlIFJbbV0gYmVmb3JlCisJdGhlIGFuZCBvcGVyYXRpb24gaW5zdGVhZCBvZiBhZnRlci4gIEZvciBzaGFkIGRlbGV0ZSBjYXN0LiAgRm9yIHNobGQKKwl1c2UgVVIgaW5zdGVhZCBvZiBSIGFuZCBkZWxldGUgY2FzdC4KKworRnJpIE5vdiAxNyAxMjo0ODo1NSAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+CisKKwkqIGdlbmNvZGUuYyAodGFiKTogQWRkIGV4cGxpY2l0IE5hTiBzdXBwb3J0IGZvciBmdHJjIGluc3RydWN0aW9uLgorCitXZWQgTm92IDE1IDExOjI1OjI3IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGludGVycC5jOiAgTWFrZSB0YXJnZXRfYnl0ZV9vcmRlciBiZSBleHRlcm4gdG8gcHJldmVudCBTR0kgY2MgZnJvbQorCWlzc3Vpbmcgd2FybmluZ3MgYWJvdXQgdGhlIHVzZSBvZiBjb21tb24gc3ltYm9scy4KKworVHVlIE5vdiAxNCAxNToxOTo0MyAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQorCisJKiBnZW5jb2RlLmM6ICBqc3IsIGJzciBhbmQgYnNyZiBhY3R1YWxseSBzYXZlIHBjKzQgaW4gcHIsIGFuZCBydHMKKwlhY3R1YWxseSB1c2VzIHByKzAuCisKK1NhdCBPY3QgMjEgMTM6MDE6MTggMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBzaC9pbnRlcnAuYyAoc2ltX3N0b3BfcmVhc29uKTogQ2F0Y2ggU0lHUVVJVCBhbmQgaW5kaWNhdGUKKwlwcm9ncmFtIGV4aXRlZC4KKwkoc2ltX2dldF9xdWl0X2NvZGUpOiBEZWxldGUuCisJCisJKiBnZW5jb2RlLmMgKGdlbnNpbSk6IEluZGljYXRlIFNJR0lMTCBpbnN0ZWFkIG9mIGNhbGxpbmcgYWJvcnQgZm9yCisJZGVmYXVsdCBjYXNlLgorCitNb24gT2N0IDE2IDE4OjI0OjAzIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNhdmVkX3N0YXRlX3R5cGUpOiBNb3ZlIEZQIHJlZ2lzdGVycyB0byBpbW1lZGlhdGVseQorCWFmdGVyIFNSLgorCitUdWUgT2N0IDEwIDExOjEyOjE1IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQklTT04pOiBSZW1vdmUgbWFjcm8uCisKK0ZyaSBPY3QgIDYgMTI6MDg6MTggMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAodHJhcCwgY2FzZSBTWVNfdXRpbWUpOiBDYXN0IHNlY29uZCBhcmcgb2YgdXRpbWUgdG8KKwl2b2lkICogdG8gYXZvaWQgY29tcGlsZXIgZXJyb3IuCisJCisJKiBpbnRlcnAuYyAoY2FsbGJhY2spOiBSZW1vdmUgbGFzdCBjaGFuZ2UuICBJdCBpcyBpbml0aWFsaXplZCBieQorCWEgc2ltX3NldF9jYWxsYmFja3MgY2FsbC4KKwkKK1RodSBPY3QgIDUgMTQ6MTM6MjkgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKGNhbGxiYWNrKTogSW5pdGlhbGl6ZSB0byBkZWZhdWx0IGNhbGxiYWNrLgorCitUaHUgU2VwIDI4IDE1OjI2OjU5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIHJ1bi5jOiBNb3ZlZCB0byAuLi9jb21tb24uCisJKiBpbnRlcnAuYyAodHJhcCk6IFVzZSBnZGIncyBjYWxsYmFjayBpbnRlcmZhY2UuCisJKiBNYWtlZmlsZS5pbjogVXBkYXRlZC4KKworV2VkIFNlcCAyMCAxMzozNToxMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIHJlYWxjbGVhbi4KKworV2VkIFNlcCAyMCAwOTo1MTo1MCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBydW4uYyAoc2ltX2NhbGxiYWNrX3dyaXRlX3N0ZG91dCk6ICBOZXcuCisJKiBpbnRlcnAuYyAodHJhcCk6IENhbGwgc2ltX2NhbGxiYWNrX3dyaXRlX3N0ZG91dCB3aGVuIG5lZWRlZC4KKworTW9uIFNlcCAxOCAxODo0MjoyNyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAodHJhcCk6IFJlbW92ZSB1c2VsZXNzIGNvZGUuCisKK0ZyaSBTZXAgMTUgMTk6MzA6MDUgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogc3lzY2FsbC5oOiBDb3B5IGZyb20gbmV3bGliLgorCitUaHUgU2VwIDE0IDE5OjMyOjU5IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCisKKwkqIGdlbmNvZGUuYzogIEJhY2sgdXAgUEMgYnkgMiBmb3IgYnJlYWtwb2ludHMuCisJKiBpbnRlcnAuYzogIE1vdmUgZnAgcmVncyBiZXlvbmQgcGMvcHIvZXRjIHRvIGF2b2lkIGNvbmZ1c2luZyBHREIsCisJd2hpY2ggZXhwZWN0IHBjIHRvIGltbWVkaWF0bHkgZm9sbG93IHJlZ3NbXS4KKworRnJpIFNlcCAgOCAxNDoxODoxMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIENDX0ZPUl9CVUlMRC4gIERvbid0IGNhbGwgQUNfUFJPR19JTlNUQUxMLgorCSogY29uZmlndXJlOiBSZWJ1aWxkLgorCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBSZXZlcnQgdG8gdXNpbmcgaW5zdGFsbC5zaC4KKwkoSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBTZXQgdG8gJChJTlNUQUxMKS4KKwkoSU5TVEFMTF9YRk9STSwgSU5TVEFMTF9YRk9STTEpOiBSZXN0b3JlLgorCShDQ19GT1JfQlVJTEQpOiBSZXN0b3JlLgorCShnZW5jb2RlKTogQnVpbGQgdXNpbmcgJChDQ19GT1JfQlVJTEQpLgorCShpbnN0YWxsKTogRG9uJ3QgaW5zdGFsbCBpbiAkKHRvb2xkaXIpLgorCitUaHUgU2VwICA3IDE1OjAyOjMxIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCShUcnkgdG8pIFVwZGF0ZSB0byBuZXcgYmZkIGF1dG9jb25mIHNjaGVtZS4KKwkqIHJ1bi5jOiBEb24ndCBpbmNsdWRlIHN5c2RlcC5oLgorCSogTWFrZWZpbGUuaW4gKElOU1RBTEx7LF9QUk9HUkFNLF9EQVRBfSk6IFVzZSBhdXRvY29uZiBjb21wdXRlZCB2YWx1ZS4KKwkoQ0MsIENGTEFHUywgQVIsIFJBTkxJQik6IExpa2V3aXNlLgorCShIREVGSU5FUywgVERFRklORVMpOiBEZWZpbmUuCisJKENDX0ZPUl9CVUlMRCk6IERlbGV0ZS4KKwkoaG9zdF9tYWtlZmlsZV9mcmFnKTogRGVsZXRlLgorCShNYWtlZmlsZSk6IERvbid0IGRlcGVuZCBvbiBmcmFncy4KKwkqIGNvbmZpZ3VyZS5pbiAoc3lzZGVwLmgpOiBEb24ndCBjcmVhdGUgc3ltbGluay4KKwkoaG9zdF9tYWtlZmlsZV9mcmFnLCBmcmFncyk6IERlbGV0ZWQuCisJKENDLCBDRkxBR1MsIEFSLCBSQU5MSUIsIElOU1RBTEwpOiBDb21wdXRlIHZhbHVlcy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK1RodSBBdWcgMzEgMTI6Mzk6MDcgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYzogSW5jbHVkZSA8bWF0aC5oPi4KKworV2VkIEF1ZyAzMCAyMjowNToxNyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKKworCSogTWFrZWZpbGUuaW4gKHJ1bik6IExpbmsgaW4gbWF0aCBsaWJyYXJ5IHRvby4KKwkqIGdlbmNvZGUuYyAoZ2Vuc2ltKTogYWJvcnQgaWYgYW4gdW5rbm93biBvcGNvZGUgaXMgZW5jb3VudGVyZWQuCisJKiBpbnRlcnAuYyAoRlBTQ1IsIEZQVUwpOiBEZWZpbmUuCisJKHN0cnVjdCBzYXZlX3N0YXRlKTogQWRkIGZpZWxkcyBmb3IgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLAorCUZQU0NSIGFuZCBGUFVMLgorCShzaW1fcmVzdW1lKTogQWRkICdGJyBmb3IgYWNjZXNzaW5nIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycworCWluIHRoZSBzYXZlIHN0YXRlIHN0cnVjdHVyZS4KKwkqIGdlbmNvZGUuYzogQWRkIHNoM2Ugb3Bjb2Rlcy4KKwkoZ2Vuc3ltKTogRGVmaW5lIGEgYnVmZmVyIGZvciBpbnQ8LT5mcCBjb252ZXJzaW9ucy4KKworVHVlIEF1ZyAyMiAxNDoxNjo0NiAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jICh0cmFwKTogVXNlIHRyYXAgdmVjdG9yIDM0IGZvciBob3N0IHN5c3RlbSBpbnRlcmZhY2UuCisJKiBnZW5jb2RlLmM6IEFkZCAzNCB0byBjb25kaXRpb25hbCB3aGljaCBkZXRlcm1pbmVzIHdoaWNoIHRyYXBzCisJd2lsbCBiZSBoYW5kbGVkIGJ5IHNpbXVsYXRvci4KKworRnJpIEF1ZyAxMSAxNzo1OToxNSAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+CisKKwkqIHJ1bi5jOiBJbmNsdWRlIDxzaWduYWwuaD4uICBEZWZpbmUgU0lHUVVJVCBpZiBub3QgZGVmaW5lZC4KKwkobWFpbik6IE5ldyB2YXJpYWJsZXMgcmVhc29uIGFuZCBzaWdyYy4gIEFmdGVyIHNpbXVsYXRvciBleGl0cywKKwljaGVjayB0byBzZWUgaWYgaXQgZXhpdGVkIGJlY2F1c2Ugb2YgYSBzaWduYWwsIGFuZCBpZiBzbywgdGhlbgorCXVzZSB0aGUgc2lnbmFsIG51bWJlciBhcyB0aGUgcmV0dXJuIHZhbHVlLgorCitUaHUgQXVnICAzIDEwOjQ1OjM3IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBVcGRhdGUgYWxsIEZTRiBhZGRyZXNzZXMgZXhjZXB0IHRob3NlIGluIENPUFlJTkcqIGZpbGVzLgorCitUdWUgSnVsIDE4IDIzOjMzOjEwIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBmaXNoYm93bD4KKworCSogaW50ZXJwLmMgKHRyYXApOiBPbmx5IHVzZSBTWVNfZXhlY3YgaWYgZGVmaW5lZC4gIE1pZ2h0IGJlCisJaW1wbGVtZW50ZWQgYXMgZXhlY3ZlKGFyZzEsYXJnMiwwKSwgYXMgd2l0aCBVbml4d2FyZSAyLjAuCisJKHNpbV9yZXN1bWUpOiBJbiBzYml0IGluaXRpYWxpemVyLCBjYXN0IHNoaWZ0ZWQgYXJnIHRvIHVuc2lnbmVkCisJdG8gYXZvaWQgc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cuCisKK1dlZCBKdWwgIDUgMTQ6MzI6NTQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiBSZW1vdmUgcnVuLCBsaWJzaW0uYS4KKwkgIChkaXN0Y2xlYW4sIG1vc3RseWNsZWFuLCByZWFsY2xlYW4pOiBSZW1vdmUgTWFrZWZpbGUgYW5kIAorCSAgYXV0b2NvbmYgZmlsZXMuCisKKwkqIHNoLm10OiBSZW1vdmVkLgorCisJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBjb252ZXJ0ZWQgdG8gYXV0b2NvbmYuCisJKiBjb25maWd1cmU6IE5ldyBmaWxlLCBnZW5lcmF0ZWQgd2l0aCBhdXRjb25mIDIuNC4KKworRnJpIEp1biAzMCAxNjo1MTozOCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IElmIGFyZ3VtZW50IHN1cHBsaWVkLCBpbnRlcnByZXQgYXMKKwlkZXNpcmVkIG1lbW9yeSBzaXplLgorCShwYXJzZV9hbmRfc2V0X21lbW9yeV9zaXplKTogTmV3IGZ1bmN0aW9uLgorCShzaW1fZG9fY29tbWFuZCk6IE5ldyBmdW5jdGlvbi4KKworVGh1IEp1biAyOSAxMDowMjoyOCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAZGVuZWIuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgIChTWVNfd2FpdCk6IERlZmluZSBhcyBTWVNfd2FpdDQgaWYgYXZhaWxhYmxlIGFuZAorCVNZU193YWl0IGlzIG5vdCBhbHJlYWR5IGRlZmluZWQgKFN1bk9TIDQuMS4zIGZvciBleGFtcGxlKS4KKwkoU1lTX3V0aW1lKTogRGVmaW5lIGFzIFNZU191dGltZXMgaWYgYXZhaWxhYmxlIGFuZAorCVNZU191dGltZSBpcyBub3QgYWxyZWFkeSBkZWZpbmVkLgorCitUaHUgSnVuIDIyIDE3OjI1OjU3IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jOiBEb24ndCBpbmNsdWRlIHN5cy90aW1lcy5oIG9yIHN5cy9wYXJhbS5oCisKK1dlZCBKdW4gMjEgMTU6MDM6NDkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKFNJR0JVUywgU0lHVEVSTSk6IERlZmluZSBpZiBub3QuCisJKHNpbV9tZW1vcnlfc2l6ZSk6IGRlZmF1bHQgdG8gMl4xOSBvbiBQQ3MuCisJKHNpbV9yZXN1bWUpOiBQb2xsIGZvciBxdWl0cyBvbiB3aW4zMi4KKworV2VkIE1heSAyNCAxNjoyMjo0OCAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+CisKKwkqIGdlbmNvZGUuYyAob3BfdGFiKTogQWRkIFNIMyBzdXBwb3J0LgorCitXZWQgTWF5IDI0IDE0OjA3OjExIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+CisKKwkqIGdlbmNvZGUuYyAodGFiKTogQWRkIGJzcmYgYW5kIGJyYWYuCisKK01vbiBBcHIgMjQgMTU6MDk6NDkgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGN5Z251cy5jb20pCisKKwkqIGNvbmZpZ3VyZS5pbjogdXNlIC4uLy4uL2JmZC9ob3N0cy9zdGQtaG9zdC5oLCBub3QgCisJLi4vYmZkL2hvc3RzL3N0ZC1ob3N0LmggKHdoaWNoIGRvZXNuJ3QgZXhpc3QpLgorCitNb24gTWFyIDI3IDEwOjMyOjM0IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogcnVuLmM6IHBhcnNlIGFyZ3VtZW50cyB3aXRoIGdldG9wdCgpLgorCitTdW4gRmViIDI2IDE1OjI3OjI0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogVXNlIC4uLy4uL2JmZC9ob3N0cy9zdGQtaG9zdC5oIGlmIHNwZWNpZmljCisJaG9zdCB1bmF2YWlsYWJsZS4KKworTW9uIEphbiAyMyAxNjoxMDo1OCAxOTk1ICBUb3Jiam9ybiBHcmFubHVuZCAgPHRlZ2VAcnRsLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChtYWN3KTogU2lnbiBleHRlbmQgTUFDSCBhdCBiaXQgMTAgZm9yIG5vbi1zYXR1cmF0aW5nIGNhc2UuCisKK1N1biBKYW4gMjIgMTM6NTU6MzYgMTk5NSAgVG9yYmpvcm4gR3Jhbmx1bmQgIDx0ZWdlQHJ0bC5jeWdudXMuY29tPgorCisJKiBnZW5jb2RlLmMgKG9wX3RhYik6IE1ha2UgTUFDLlcgY2FsbCBtYWN3LCBub3QgYWJvcnQuCisJKiBpbnRlcnAuYyAobWFjdyk6IE5ldyBmdW5jdGlvbi4KKwkoUyk6IE5ldyAjZGVmaW5lLgorCitTYXQgSmFuIDIxIDE1OjUyOjMwIDE5OTUgIFRvcmJqb3JuIEdyYW5sdW5kICA8dGVnZUBydGwuY3lnbnVzLmNvbT4KKworCSogZ2VuY29kZS5jIChvcF90YWIpOiBOZXcgY29kZSBmb3IgQUREViBhbmQgU1VCVi4KKwlNYWtlIE1BQy5MIGFib3J0IHNpY25lIGl0IGlzIG5vdCBpbXBsZW1lbnRlZC4KKworCSogaW50ZXJwLmMgKGRtdWwpOiBIYW5kbGUgdGhlIHNpZ25lZCBjYXNlIGJ5IGFkanVzdGluZyBhZnRlciB1bnNpZ25lZCBtdWx0aXBseS4KKwlHZXQgcmlkIG9mIF9fR05VQ19fIGNvbmRpdGlvbmFsLgorCithVGh1IEphbiAxOSAwNTo1MDo1MCAxOTk1ICBUb3Jiam9ybiBHcmFubHVuZCAgPHRlZ2VAcnRsLmN5Z251cy5jb20+CisKKwkqIGdlbmNvZGUuYyAob3BfdGFiKTogQWxzbyByZXBsYWNlIE5FR0MsIGFuZCB0cnkgYWdhaW4gd2l0aCBTVUJDLgorCUNoYW5nZSBBRERDIGZvciBzeW1tZXRyeS4KKworCSogZ2VuY29kZS5jIChvcF90YWIpOiBSZXBsYWNlIGNvZGUgZm9yIEFEREMgYW5kIFNVQkMuCisKK01vbiBKYW4gIDkgMTU6NDM6NTMgMTk5NSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKKworCSogaW50ZXJwLmM6ICBSZW1vdmUgZGVmIG9mIElOTElORS4gIFRoaXMgY29tZXMgZnJvbSBiZmQuaC4gIEFsc28sCisJZGVjbGFyZSBJT01FTSBiZWZvcmUgdXNpbmcgaXQuCisKK1dlZCBEZWMgMjggMjE6MjU6MzEgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogaW50ZXJwLmMgKEJVU0VSUk9SKTogTmV3IG1hY3JvLgorCShbcnx3XVtid2xdYXRbbGl0dGxlfGJpZ10pIE5ldyBmdW5jdGlvbnMuCisJKHNpbV9yZXN1bWUpOiBJZiBHTzMyIGNoZWNrIGZvciBpbnRlcnJ1cHQgZXZlcnkgbm93CisJYW5kIGFnYWluLiAgRGVjcmVtZW50IFBDIGlmIFNJR0JVUyBzZWVuLgorCSogcnVuLmMgKG1haW4pOiAgUmV0dXJuIHJlc3VsdCBvZiBzaW11bGF0ZWQgX2V4aXQuCisKK01vbiBEZWMgIDUgMjE6NTk6NTEgMTk5NCAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGdlbmNvZGUpOiBBbGxvdyBidWlsZCBpbiBkaWZmZXJlbnQgZGlyZWN0b3J5LgorCitXZWQgTm92IDMwIDE3OjQ3OjEzIDE5OTQgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKGdlbmNvZGUpOiBDaGFuZ2UgJDwgdG8gZ2VuY29kZS5jIGZvciBwb3J0YWJpbGl0eS4KKworV2VkIE5vdiAyMyAyMTozMTo1NSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiBpbnRlcnAuYyAoW3dyXVtid2xdYXQpOiBOZXcgZnVuY3Rpb25zLgorCSh0cmFwKTogQ29wZSB3aXRoIGJvdGggYnl0ZSBtb2Rlcy4KKworVGh1IFNlcCAgOCAxNzozNTowNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiBnZW5jb2RlLmMgKHRhYik6IFNpbXVsYXRlIFQgYml0IGFmdGVyIGEgbmVnYyBpbnNuIHJpZ2h0LgorCSogaW50ZXJwLmMgKFJTQkFUKTogU2lnbiBleHRlbmQgdGhlIGFyZy4KKwkoQUNFX0ZBU1QpOiBOZXcgbWFjcm8uCisJKHNpbV9yZXN1bWUpOiBSZW1vdmUgb2Jzb2xldGUgdGVzdCBvZiBzaW1fdGltZW91dC4KKwkKK0ZyaSBBdWcgIDUgMTQ6MTI6MzEgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKKworCSogaW50ZXJwLmMgKElPTUVNKTogTmV3IGZ1bmN0aW9uLCBzaW11bGF0ZXMgdmVyeSBiYXNpYyBJL08gYXJlYSBvZgorCXRoZSBTSC4KKwkoV0JBVCwgUkJBVCkgOiBDYWxsIEkvTyBmdW5jdGlvbnMuCisJKiBnZW5jb2RlLmMgKHRhYik6IFNwZWNpYWwgY2FzZSB0cmFwYSAjMy4KKworTW9uIEp1biAyNyAxODowNDo1NCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjaXJkYW4uY3lnbnVzLmNvbSkKKworCSogcnVuLmMgKG1haW4pOiBTcGVjaWZ5IHRoZSBmaWxlIHR5cGUgYWdhaW4uCisKK1RodSBNYXkgMjYgMTk6MDQ6MzcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGludGVycC5jICh0cmFwKTogRml4IGlyaXggaW5jb21wYXRpYmlsaXR5LgorCSogcnVuLmMgKG1haW4pOiBvcGVuIHdpdGhvdXQgc3BlY2lmeWluZyBmaWxlIHR5cGUuCisKK1dlZCBNYXkgMTggMTQ6MTg6NTMgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogaW50ZXJwLmMgKHNpbV8qKTogTWFrZSByZXN1bHQgdm9pZCB3aGVyZSB0aGVyZSBpc24ndCBvbmUuCisJKHNpbV9zZXRfcGMpOiBEZWxldGUuCisJKHNpbV9pbmZvKTogRGVsZXRlIHByaW50Zl9mbiBhcmcsIGFsbCBjYWxsZXJzIGNoYW5nZWQuCisJQ2FsbCBwcmludGZfZmlsdGVyZWQgaW5zdGVhZC4KKwkoc2ltX2Nsb3NlKTogTmV3IGZ1bmN0aW9uLgorCShzaW1fbG9hZCk6IE5ldyBmdW5jdGlvbi4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFJlbmFtZWQgZnJvbSBzaW1fc2V0X2FyZ3MsIGFsbCBjYWxsZXJzIGNoYW5nZWQuCisJKiBydW4uYzogI2luY2x1ZGUgPHZhcmFyZ3MuaD4sICJyZW1vdGUtc2ltLmgiLgorCShwcmludGZfZmlsdGVyZWQpOiBOZXcgZnVuY3Rpb24uCisKK1dlZCBBcHIgMjcgMTI6MDM6NDggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKKworCSogZ2VuY29kZS5jICh0YWJsZSk6IEdldCBkaXJlY3Rpb24gb2Ygc29tZSBvcGNvZGVzIHJpZ2h0LgorICAgICAgICAodHJhcGEsIHJ0ZSk6IEltcGxlbWVudCBmdWxseS4KKwkqIGludGVycC5jICh0cmFwKTogTWFrZSBzdGF0IGNhbGwgbW9yZSBwb3J0YWJsZS4KKworRnJpIEZlYiAxMSAyMTo1OTozOCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BzcGhhZ251bS5jeWdudXMuY29tKQorCisJKiBnZW5jb2RlLmMgKG1haW4sIGdlbmRlZmluZXMpOiBOZXcgLWQgb3B0aW9uIHByaW50cyB0YWJsZSBvZiBkZWZpbmVzLgorCSogaW50ZXJwLmMgKHRyYXApOiBBZGQgYSBsb2FkIG9mIHN5c3RlbSBjYWxscy4gCisJKHNpbV9tZW1vcnlfc2l6ZSk6IE5vdyBkZWZhdWx0IHRvIDhNYnl0ZS4KKyAgICAgICAgKFBBUkFOT0lEKTogS2VlcCB2ZWN0b3Igb2YgcmVnaXN0ZXJzIHdpdGggdW5kZWZpbmVkIGNvbnRlbnRzLgorCitNb24gTm92IDE1IDE0OjM3OjE4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwkqIGdlbmNvZGUuYzogbW92YSB1c2VzIGFsaWduZWQgYWRkcmVzc2VzCisJKiBpbnRlcnAuYyAodHJhcCk6IFJldHVybiByZXN1bHRzIGluIHIwLgorCitUdWUgT2N0IDI2IDEwOjM4OjU1IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluIChDU0VBUkNIKTogQWRkIC1JJChzcmNkaXIpLy4uLy4uL2dkYgorCSogaW50ZXJwLmM6ICNpbmNsdWRlICJyZW1vdGUtc2ltLmgiLgorCShzaW1fcmVzdW1lKTogaW50IHJlc3VsdCwgbmV3IGFyZyBgc2lnZ25hbCcuCisJKHNpbV93cml0ZSk6IFVzZSBTSU1fQUREUiBmb3IgdHlwZSBvZiBhcmcgYGFkZHInLgorCShzaW1fcmVhZCk6IFVzZSBTSU1fQUREUiBmb3IgdHlwZSBvZiBhcmcgYGFkZHInLgorCVVzZSB1bnNpZ25lZCBjaGFyICogZm9yIGBidWZmZXInLgorCShzaW1fc3RvcmVfcmVnaXN0ZXIpOiBpbnQgcmVzdWx0LgorCShzaW1fZmV0Y2hfcmVnaXN0ZXIpOiBEaXR0by4KKwkoc2ltX3N0b3BfcmVhc29uKTogUmVuYW1lZCBmcm9tIHNpbV9zdG9wX3NpZ25hbC4gIE5ldyBhcmcgYHJlYXNvbicuCisJKHNpbV9zZXRfcGMpOiBpbnQgcmVzdWx0LCB1c2UgU0lNX0FERFIgZm9yIHR5cGUgb2YgYXJnIGB4Jy4KKwkoc2ltX2luZm8pOiBpbnQgcmVzdWx0LCBuZXcgYXJncyBgdmVyYm9zZScsIGBwcmludGZfZm4nLgorCShzaW1fa2lsbCk6IGludCByZXN1bHQuCisJKHNpbV9vcGVuKTogaW50IHJlc3VsdCwgbmV3IGFyZyBgbmFtZScuCisJKiBydW4uYzogI2luY2x1ZGUgPHN0ZGlvLmg+CisJKG1haW4pOiBVcGRhdGUgY2FsbCB0byBzaW1faW5mby4KKworU2F0IE9jdCAyMyAxNTowOToyOSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBpbnRlcnAuYyAoc2ltX3N0b3Bfc2lnbmFsKTogUmVzdWx0IGlzIG5vdyBlbnVtIHNpbV9zdG9wLgorCitGcmkgT2N0ICA4IDEwOjQ3OjA5IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIGdlbmNvZGUuYyAodGFibGUpOiBCZWNvbWVzIHVuc2lnbmVkLgorCSogaW50ZXJwLmMgKHRyYXApOiBHZXQgcmlnaHQgYnJlYWtwb2ludCBTSUdudW0uIChzaW1fd3JpdGUsCisJc2ltX3JlYWQpOiBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4gIChzaW1fc3RvcmVfcmVnaXN0ZXIpOgorCVZhbHVlIHBhc3NlZCBieSByZWZlcmVuY2UuIChzaW1fa2lsbCwgc2ltX29wZW4sIHNpbV9zZXRfYXJncyk6IE5ldyBmdW5jdGlvbnMuCisKK1R1ZSBTZXAgIDcgMTY6MjQ6MTMgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQorCisJKiBpbnRlcnAuYyAoc2ltX2luZm8pOiBGaXggc21hbGwgdHlwbyBpbiBwcmludGYgc3RyaW5nLgorCitUaHUgQXVnICA1IDExOjM3OjQ4IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKKworCSogaW50ZXJwLmMgKHNpbV9yZXN1bWUpOiBTZXQgbWVtb3J5IGFmdGVyIHBvaW50ZXJzIGluaXRlZC4KKworTW9uIEF1ZyAgMiAxNDoxMzoyMiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBpbnRlcnAuYyAoZ2V0X25vdyk6IFVzZSB0aW1lIHN5c3RlbSBjYWxsLgorCSogTWFrZWZpbGUuaW46IGluc3RhbGwgY29ycmVjdGx5LgorCitUdWUgSnVsICA2IDEwOjMwOjQ2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCisKKwkqIHJ1bi5jIChtYWluKSwgaW50ZXJwLmMgKHNpbV9zZXRfdGltZW91dCk6IFJlbW92ZSB0aW1lb3V0CisJZnVuY3Rpb25hbGl0eS4KKworVGh1IEp1biAyNCAxMzoyOTo1NyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiBkb24ndCBydW4gaW5kZW50IGV2ZXJ5dGltZTsgYWxzbyBhZGQgYSBzcGFjZSBpbiB0aGUKKwlpbmNsdWRlcyAKKworVGh1IEp1biAxNyAxODozMDo0MiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBnZW5jb2RlLmM6IEZpeCBzb21lIG9wY29kZXMuCisJKiBpbnRlcnAuYzogU3VwcG9ydCBmb3IgcHJvZmlsaW5nIGFuZCBwb3J0YWJpbGl0eSBmaXhlcy4KKwkqIHJ1bi5jIChtYWluKTogR2V0IHByb2ZpbGluZyBhcmdzLgorCitXZWQgTWF5ICA1IDEzOjE3OjIyIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCisKKwkqIGdlbmNvZGUuYyAodGFiKTogTGludCBmb3Igc2dpIGNvbXBpbGVyCisJKiBpbnRlcnAuYzogTGludCBmb3Igc2dpIGNvbXBpbGVyLgorCitNb24gTWF5ICAzIDE1OjI1OjMzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBydW4uYyAobWFpbik6IFN1cHBvcnQgZm9yIHJlc2l6aW5nIHNpbXVsYXRlZCBSQU0uCQorCSogTWFrZWZpbGUuaW46IFN1cHBvcnQgZm9yIGJyb2tlbiBtYWtlcy4KKwkqIGludGVycC5jLCBnZW5jb2RlLmM6IExpbnQuCisKK01vbiBBcHIgMjYgMTg6MDE6MTAgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIGNyZWF0ZWQKKwpkaWZmIC0tZ2l0IGEvc2ltL3NoL01ha2VmaWxlLmluIGIvc2ltL3NoL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZTRiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vc2gvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw0MSBAQAorIyAgICBNYWtlZmlsZSB0ZW1wbGF0ZSBmb3IgQ29uZmlndXJlIGZvciB0aGUgU0ggc2ltIGxpYnJhcnkuCisjICAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMjIENPTU1PTl9QUkVfQ09ORklHX0ZSQUcKKworU0lNX09CSlMgPSBpbnRlcnAubyB0YWJsZS5vIHNpbS1sb2FkLm8KK1NJTV9FWFRSQV9MSUJTID0gLWxtCitTSU1fRVhUUkFfQ0xFQU4gPSBzaC1jbGVhbgorCisjIyBDT01NT05fUE9TVF9DT05GSUdfRlJBRworCitpbnRlcnAubzogaW50ZXJwLmMgY29kZS5jIHRhYmxlLmMKKworY29kZS5jOiBnZW5jb2RlCisJLi9nZW5jb2RlIC14ID5jb2RlLmMKKyMJaW5kZW50IGNvZGUuYworCit0YWJsZS5jOiBnZW5jb2RlCisJLi9nZW5jb2RlIC1zID50YWJsZS5jCisjCWluZGVudCB0YWJsZS5jCisKK2dlbmNvZGU6IGdlbmNvZGUuYworCSQoQ0NfRk9SX0JVSUxEKSAtbyBnZW5jb2RlICQoc3JjZGlyKS9nZW5jb2RlLmMKKworc2gtY2xlYW46CisJcm0gLWYgZ2VuY29kZSBjb2RlLmMgdGFibGUuYwpkaWZmIC0tZ2l0IGEvc2ltL3NoL2FjY29uZmlnLmggYi9zaW0vc2gvYWNjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWI4N2ExCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3NoL2FjY29uZmlnLmgKQEAgLTAsMCArMSwxNSBAQAorCisvKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KKyN1bmRlZiBFTkFCTEVfTkxTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0NBVEdFVFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCmRpZmYgLS1naXQgYS9zaW0vc2gvY29uZmlnLmluIGIvc2ltL3NoL2NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjg3YTJiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3NoL2NvbmZpZy5pbgpAQCAtMCwwICsxLDE1OCBAQAorLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCisjdW5kZWYgQ19BTExPQ0EKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCisjdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCisjdW5kZWYgSEFWRV9BTExPQ0EKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCisjdW5kZWYgaW5saW5lCisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgb2ZmX3QKKworLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCisjdW5kZWYgX1BPU0lYX1NPVVJDRQorCisvKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoaW50IG9yIHZvaWQpLiAgKi8KKyN1bmRlZiBSRVRTSUdUWVBFCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIHNpemVfdAorCisvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKKyAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgorIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgorICovCisjdW5kZWYgU1RBQ0tfRElSRUNUSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19zZXRmcHVjdyBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX1NFVEZQVUNXCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0RDR0VUVEVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRDV0QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRQQUdFU0laRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHJ1c2FnZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRSVVNBR0UKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfTVVOTUFQCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1BVVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VUTE9DQUxFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2lnYWN0aW9uIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NJR0FDVElPTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSQ0hSCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGltZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9USU1FCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfQVJHWl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZnB1X2NvbnRyb2wuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfRlBVX0NPTlRST0xfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9NQUxMT0NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9OTF9UWVBFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVkFMVUVTX0gKZGlmZiAtLWdpdCBhL3NpbS9zaC9jb25maWd1cmUgYi9zaW0vc2gvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU2NDZmYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vc2gvY29uZmlndXJlCkBAIC0wLDAgKzEsMzg5MiBAQAorIyEgL2Jpbi9zaAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCisjIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCisKKyMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDMKKworCisKKworCisjIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCisKKworIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCisKKworIyBDaGVjayB0byBzZWUgaWYgd2UncmUgcnVubmluZyB1bmRlciBDeWd3aW4zMiwgd2l0aG91dCB1c2luZworIyBBQ19DQU5PTklDQUxfKi4gIElmIHNvLCBzZXQgb3V0cHV0IHZhcmlhYmxlIENZR1dJTjMyIHRvICJ5ZXMiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICJubyIuCisKKworCisjIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIFdpbjMyLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgRVhFRVhUIHRvICIuZXhlIi4KKyMgT3RoZXJ3aXNlIHNldCBpdCB0byAiIi4KKworCisKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCithY19oZWxwPSIkYWNfaGVscAorICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQkJRW5hYmxlIGRldmVsb3BlciBmdW5jdGlvbmFsaXR5LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1ic3dhcAkJCVVzZSBIb3N0IHNwZWNpZmljIEJTV0FQIGluc3RydWN0aW9uLiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1jZmxhZ3M9b3B0cwkJRXh0cmEgQ0ZMQUdTIGZvciB1c2UgaW4gYnVpbGRpbmcgc2ltdWxhdG9yIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWRlYnVnPW9wdHMJCUVuYWJsZSBkZWJ1Z2dpbmcgZmxhZ3MiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tc3RkaW8JCQlTcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIHN0ZGlvIGZvciBjb25zb2xlIGlucHV0L291dHB1dC4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tdHJhY2U9b3B0cwkJRW5hYmxlIHRyYWNpbmcgZmxhZ3MiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tcHJvZmlsZT1vcHRzCQlFbmFibGUgcHJvZmlsaW5nIGZsYWdzIgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorYWNfbWF4X2hlcmVfbGluZXM9MTIKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19wcm9nPSQwCisgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCisKKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgLiAkY2FjaGVfZmlsZQorZWxzZQorICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgPiAkY2FjaGVfZmlsZQorZmkKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworYWNfZXhlZXh0PQorYWNfb2JqZXh0PW8KK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCitlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Njc3OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0CisgICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCisgIENQUD0iJHtDQy1jY30gLUUiCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDY5MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Njk4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3MDkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjcxNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzI2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MzI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9L2xpYi9jcHAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzU3OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKK3NldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCithbGw6CisJQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKK0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCitldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKK2lmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCitlbHNlCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCitmaQorcm0gLWYgY29uZnRlc3RtYWtlCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBTRVRfTUFLRT0KK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3ODQ6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKK2lmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgorICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQorRU9GCisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDQz0iJENDIC1wb3NpeCIKKyAgZWxzZQorICAgIENDPSIkQ0MgLVhwIgorICBmaQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgSVNDPQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjgwNTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODEwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MTg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODM1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDg1MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4NzQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKK2ludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKK2lmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7CitleGl0ICgwKTsgfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODg1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNURENfSEVBREVSUyAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkwOTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5MTQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKworLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3R5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKKy8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCitjaGFyIGNvbnN0ICpjb25zdCAqY2NwOworY2hhciAqKnA7CisvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Oworc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07CisvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KKyAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCitjb25zdCBjaGFyICpnID0gInN0cmluZyI7CitjY3AgPSAmZyArIChnID8gZy1nIDogMCk7CisvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLworKytjY3A7CitwID0gKGNoYXIqKikgY2NwOworY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Cit7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLworICBjaGFyICp0OworICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOworCisgICp0KysgPSAwOworfQoreyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KKyAgaW50IHhbXSA9IHsyNSwgMTd9OworICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOworICArK2ZvbzsKK30KK3sgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLworICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKKyAgaXB0ciBwID0gMDsKKyAgKytwOworfQoreyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCisgICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KKyAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKKyAgc3RydWN0IHMgKmI7IGItPmogPSA1OworfQoreyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KKyAgY29uc3QgaW50IGZvbyA9IDEwOworfQorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTYzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGNvbnN0IAorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjk4NDogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19jdl9jX2lubGluZT1ubworZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbworICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5OTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK30gJGFjX2t3IGZvbygpIHsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5OTg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZG9uZQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2CitjYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCisgIGlubGluZSB8IHllcykgOzsKKyAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBpbmxpbmUgCitFT0YKKyA7OworICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQorRU9GCisgOzsKK2VzYWMKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDI0OiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDI5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIG9mZl90IGxvbmcKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDU3OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwNjIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgInNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2l6ZV90PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2l6ZV90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBzaXplX3QgdW5zaWduZWQKK0VPRgorCitmaQorCisjIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcworIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDkyOiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA5NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YWxsb2NhLmg+CitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTEyNTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTMwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorI2Vsc2UKKyMgaWZkZWYgX01TQ19WRVIKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjIGVsc2UKKyMgIGlmIEhBVkVfQUxMT0NBX0gKKyMgICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgIGVsc2UKKyMgICBpZmRlZiBfQUlYCisgI3ByYWdtYSBhbGxvY2EKKyMgICBlbHNlCisjICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCitjaGFyICphbGxvY2EgKCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworaW50IG1haW4oKSB7CitjaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBIDEKK0VPRgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCisgICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCisgICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgorICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKKyAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCisgIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBDX0FMTE9DQSAxCitFT0YKKworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTkwOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTE5NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCit3ZWJlY3JheQorI2Vsc2UKK3dlbm90YmVjcmF5CisjZW5kaWYKKworRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9vc19jcmF5PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgoraWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgorZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbworICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyMjA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyMjUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYworRU9GCisKKyAgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitkb25lCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjc1OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTI4MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCitmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKQoreworICBzdGF0aWMgY2hhciAqYWRkciA9IDA7CisgIGF1dG8gY2hhciBkdW1teTsKKyAgaWYgKGFkZHIgPT0gMCkKKyAgICB7CisgICAgICBhZGRyID0gJmR1bW15OworICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Cit9CittYWluICgpCit7CisgIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKK30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCitFT0YKKworZmkKKworZm9yIGFjX2hkciBpbiB1bmlzdGQuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzMjc6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMzMyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzM3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzNjY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzNzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM5NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTQxOTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTQyNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKy8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgorICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6CisJbW1hcCBwcml2YXRlIG5vdCBmaXhlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKyAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCisgICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50CisgICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKKyAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKKyAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQorICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKKyAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0CisgICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KKworICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgorICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKKyAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQorICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLworI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCisjIGlmZGVmIEhBVkVfVU5JU1REX0gKKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBlbmRpZgorCisvKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLworIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQorIyBlbmRpZgorCisjIGlmZGVmIF9TQ19QQUdFU0laRQorIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCisjIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCisjICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICAgaWZkZWYgRVhFQ19QQUdFU0laRQorIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCisjICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICAgIGlmZGVmIE5CUEcKKyMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKKyMgICAgIGlmbmRlZiBDTFNJWkUKKyMgICAgICBkZWZpbmUgQ0xTSVpFIDEKKyMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLworIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KKyMgICAgIGlmZGVmIE5CUEMKKyMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCisjICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KKyMgICAgICBpZmRlZiBQQUdFU0laRQorIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQorIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCisjICAgICBlbmRpZiAvKiBubyBOQlBDICovCisjICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KKyMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLworIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKworI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQorI2Vsc2UKK2NoYXIgKm1hbGxvYygpOworI2VuZGlmCisKK2ludAorbWFpbigpCit7CisJY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7CisJaW50IGksIHBhZ2VzaXplOworCWludCBmZDsKKworCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKKworCS8qCisJICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgorCSAqLworCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJKihkYXRhICsgaSkgPSByYW5kKCk7CisJdW1hc2soMCk7CisJZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgxKTsKKwlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKwkJZXhpdCgxKTsKKwljbG9zZShmZCk7CisKKwkvKgorCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAorCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKKwkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgorCSAqLworCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7CisJaWYgKCFkYXRhMikKKwkJZXhpdCgxKTsKKwlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7CisJaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKKwkJCWV4aXQoMSk7CisKKwkvKgorCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCisJICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgorCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOworCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEzKQorCQlleGl0KDEpOworCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQorCQkJZXhpdCgxKTsKKwljbG9zZShmZCk7CisJdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKKwlleGl0KDApOworfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU2NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX01NQVAgMQorRU9GCisKK2ZpCisKKworIyBhdXRvY29uZi5pbmZvIHNheXMgdGhpcyBzaG91bGQgYmUgY2FsbGVkIHJpZ2h0IGFmdGVyIEFDX0lOSVQuCisKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworCisjIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KKyMgVGhlIGlucHV0cyBhcmU6CisjICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKKyMKKyMgVGhlIHJ1bGVzIGFyZToKKyMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCisjICAgIHNhbWUgdGltZS4KKyMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCisjIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKKyMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCisjIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCisjIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgorCisjIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCisjIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCitjYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KK05PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKKyopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KK2lmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKK2Vsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjQwOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKKworaG9zdF9hbGlhcz0kaG9zdAorY2FzZSAiJGhvc3RfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkKKyAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6CisgICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkgOzsKKyAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCitob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkaG9zdCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2NjE6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1CisKK3RhcmdldF9hbGlhcz0kdGFyZ2V0CitjYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK3RhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKK3RhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCit0YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAordGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2Nzk6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKworYnVpbGRfYWxpYXM9JGJ1aWxkCitjYXNlICIkYnVpbGRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2J1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCitidWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2J1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAorYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKKwordGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgorICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCisgICAgTk9ORU5PTkVzLHgseCwgJiYKKyAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQorCitpZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KK2Vsc2UKKyAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgorICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCitzLFxcLFxcXFwsZzsgcyxcJCwkJCxnCitFT0ZfU0VECisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCisgIHJtIC1mIGNvbmZ0ZXN0c2VkCitmaQordGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCit0ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisKKyMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KK3Rlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzIzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzUyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisgICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisJY29udGludWUKKyAgICAgIGZpCisgICAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2lmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgc2hpZnQKKyAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJEAiCisgIGZpCitmaQorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgorICAgICp3aW4zMiogfCAqV0lOMzIqKQorICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTgwMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJjbCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKyA7OworICAgIGVzYWMKKyAgZmkKKyAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTgzMzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTg0MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCittYWluKCl7cmV0dXJuKDApO30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODQ3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKyAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisgIGVsc2UKKyAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcworICBmaQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KK2ZpCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTg2NzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Citjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4NzI6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKKyNpZmRlZiBfX0dOVUNfXworICB5ZXM7CisjZW5kaWYKK0VPRgoraWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4ODE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhY19jdl9wcm9nX2djYz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19nY2M9bm8KK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2CisKK2lmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCisgIEdDQz15ZXMKK2Vsc2UKKyAgR0NDPQorZmkKKworYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCithY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKK0NGTEFHUz0KK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTkwMDogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKK2lmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfY2NfZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTQzOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KKyAgICBjYXNlICIkYWNfZGlyLyIgaW4KKyAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKKyAgICAqKQorICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKyAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICAgIyBieSBkZWZhdWx0LgorICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbworICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisgICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJICAgIDoKKwkgIGVsc2UKKwkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgorCSAgICBicmVhayAyCisJICBmaQorCWZpCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX0lGUyIKKworZmkKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQorICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KKyAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKKyAgZmkKK2ZpCitlY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworCisjIFB1dCBhIHBsYXVzaWJsZSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgaW4gTWFrZWZpbGUuCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJworZWxzZQorICBDQ19GT1JfQlVJTEQ9Z2NjCitmaQorCisKKworCitBUj0ke0FSLWFyfQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwMDk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCitmaQorZmkKK1JBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgoraWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKK0FMTF9MSU5HVUFTPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKK3VuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjA0MzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIwNDggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNTM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKK19fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDgzOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMDg4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgorICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIxNDA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIxNDUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworICAgZmkKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCisgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX1NUUENQWSAxCitFT0YKKworICAgZmkKKworICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjAyOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIyMDcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxvY2FsZS5oPgoraW50IG1haW4oKSB7CityZXR1cm4gTENfTUVTU0FHRVMKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjE0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKKyAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKK0VPRgorCisgICAgZmkKKyAgZmkKKyAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjIzNTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgorICBVU0VfTkxTPSRlbmFibGV2YWwKK2Vsc2UKKyAgVVNFX05MUz15ZXMKK2ZpCisKKyAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKKyAgICAKKworICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCisKKyAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBFTkFCTEVfTkxTIDEKK0VPRgorCisgICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjU1OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKKyAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgorICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCitlbHNlCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KK2ZpCisKKyAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgorCisgICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9CisJbmxzX2N2X2hlYWRlcl9saWJndD0KKwlDQVRPQkpFWFQ9Tk9ORQorCisJYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyNzQ6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIyNzkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpYmludGwuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjI4NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMDE6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjMwNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgoraW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMxMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2CisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCisJICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzI5OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbGludGwgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjMzNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGJpbmR0ZXh0ZG9tYWluKCk7CisKK2ludCBtYWluKCkgeworYmluZHRleHRkb21haW4oKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzNjQ6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjM2OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNzY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkgICBmaQorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKKwkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KKwkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9HRVRURVhUIDEKK0VPRgorCisJICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNDA0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgorICA7OworZXNhYworZmkKK01TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgoraWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KKwkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNDM4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNDQzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0OTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI1Mjg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjU2MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ0FUT0JKRVhUPS5nbW8KKwkJICAgREFUQURJUk5BTUU9c2hhcmUKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ0FUT0JKRVhUPS5tbworCQkgICBEQVRBRElSTkFNRT1saWIKK2ZpCitybSAtZiBjb25mdGVzdCoKKwkJSU5TVE9CSkVYVD0ubW8KKwkgICAgICBmaQorCSAgICBmaQorCQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworCSAgICAgICAgCisgICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCisJICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcworICAgICAgICBmaQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KKyAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgorICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2MDA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgorICA7OworZXNhYworZmkKK01TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgoraWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNjM0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRHTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgID86LyopCQkJIAorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgorICA7OworZXNhYworZmkKK0dNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCitpZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNjY5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkWEdFVFRFWFQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKKyAgOzsKK2VzYWMKK2ZpCitYR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCitpZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgIAorCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgICAgICBDQVRPQkpFWFQ9LmdtbworICAgICAgICBJTlNUT0JKRVhUPS5tbworICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQorCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCisJSU5UTExJQlM9JElOVExERVBTCisJTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCisgICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKKyAgICAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCisJCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCisJICA6IDsKKwllbHNlCisJICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2CisJICBYR0VUVEVYVD0iOiIKKwlmaQorICAgICAgZmkKKworICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCisgICAgICBQT1NVQj1wbworICAgIGVsc2UKKyAgICAgIERBVEFESVJOQU1FPXNoYXJlCisgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCisgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgIGZpCisKKyAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCisgICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KKyAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCisgICAgICBVU0VfTkxTPXllcworICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgZmkKKworICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KKyAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgorICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCisgICAgZG9uZQorCisgICAgICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAKKworICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgorICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgorICAgICAgIExJTkdVQVM9CisgICAgIGVsc2UKKyAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNzU5OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKKyAgICAgICBORVdfTElOR1VBUz0KKyAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KKyAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KKyAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OworICAgICAgICAgZXNhYworICAgICAgIGRvbmUKKyAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUworICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgorICAgICBmaQorCisgICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCisgICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQorICAgICBmaQorICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCisgICBlbHNlCisgICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKKy8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKKyAgIGZpCisgICAKKworICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCisJIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNzg3OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNzkyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI3OTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBtc2dmb3JtYXQ9bGludXgKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Cittc2dmb3JtYXQ9eG9wZW4KK2ZpCisKKworCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAorICAgICAgZmkKKyAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAorCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KKyAgICAgR1RfTk89IiNOTyMiCisgICAgIEdUX1lFUz0KKyAgIGVsc2UKKyAgICAgR1RfTk89CisgICAgIEdUX1lFUz0iI1lFUyMiCisgICBmaQorICAgCisgICAKKworICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgorICAgCisKKyAgICAgIGw9CisgICAKKworICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCisgICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCisgICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgorCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgorCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCisJIGVsc2UKKwkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgorCSBmaQorICAgICAgZWxzZQorCSBwb3NyY3ByZWZpeD0iLi4vIgorICAgICAgZmkKKyAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCisgICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKKwkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKKyAgIGZpCisgIAorCisjIENoZWNrIGZvciBjb21tb24gaGVhZGVycy4KKyMgRklYTUU6IFNlZW1zIHRvIG1lIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIGZvciBpMzg2LXdpbmRvd3MgaG9zdHMuCisjIEF0IG9uZSBwb2ludCB0aGVyZSB3ZXJlIGhhcmRjb2RlZCBBQ19ERUZJTkUncyBpZiAke2hvc3R9ID0gaTM4Ni0qLXdpbmRvd3MqLgorZm9yIGFjX2hkciBpbiBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdW5pc3RkLmggdGltZS5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjg2NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI4NzEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI4NzY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfaGRyIGluIHN5cy90aW1lLmggc3lzL3Jlc291cmNlLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTA2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjkxMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjkxNjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19oZHIgaW4gZmNudGwuaCBmcHVfY29udHJvbC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjk0NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI5NTEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjI5NTY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXRydXNhZ2UgdGltZSBzaWdhY3Rpb24gX19zZXRmcHVjdworZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjk4NTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjk5MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDEzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisKKyMgQ2hlY2sgZm9yIHNvY2tldCBsaWJyYXJpZXMKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMDQwOiBjaGVja2luZyBmb3IgYmluZCBpbiAtbHNvY2tldCIgPiY1CithY19saWJfdmFyPWBlY2hvIHNvY2tldCdfJ2JpbmQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1sc29ja2V0ICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMwNDggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBiaW5kKCk7CisKK2ludCBtYWluKCkgeworYmluZCgpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA1OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBzb2NrZXQgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKKyAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfbGliIDEKK0VPRgorCisgIExJQlM9Ii1sc29ja2V0ICRMSUJTIgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMwODc6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gbnNsJ18nZ2V0aG9zdGJ5bmFtZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxuc2wgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzA5NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGdldGhvc3RieW5hbWUoKTsKKworaW50IG1haW4oKSB7CitnZXRob3N0YnluYW1lKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIG5zbCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9saWIgMQorRU9GCisKKyAgTElCUz0iLWxuc2wgJExJQlMiCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKy4gJHtzcmNkaXJ9Ly4uLy4uL2JmZC9jb25maWd1cmUuaG9zdAorCisKKworVVNFX01BSU5UQUlORVJfTU9ERT1ubworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJTUFJTlQ9IiIgVVNFX01BSU5UQUlORVJfTU9ERT15ZXMgOzsKKyAgbm8pCU1BSU5UPSIjIiA7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBNQUlOVD0iIyIgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRNQUlOVCIgPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBtYWludGFpbmVyIG1vZGUiIDY+JjEKK2ZpCitlbHNlCisgIE1BSU5UPSIjIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYnN3YXAgb3IgLS1kaXNhYmxlLXNpbS1ic3dhcCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fYnN3YXArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9ic3dhcCIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9ic3dhcD0iLURXSVRIX0JTV0FQPTEgLURVU0VfQlNXQVA9MSI7OworICBubykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MCI7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYnN3YXAgZG9lcyBub3QgdGFrZSBhIHZhbHVlIiIgMT4mMjsgZXhpdCAxOyB9OyBzaW1fYnN3YXA9IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9ic3dhcCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgYnN3YXAgZmxhZ3MgPSAkc2ltX2Jzd2FwIiA2PiYxCitmaQorZWxzZQorICBzaW1fYnN3YXA9IiIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWNmbGFncyBvciAtLWRpc2FibGUtc2ltLWNmbGFncyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fY2ZsYWdzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fY2ZsYWdzIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJIHNpbV9jZmxhZ3M9Ii1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciI7OworICB0cmFjZSkgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiUGxlYXNlIHVzZSAtLWVuYWJsZS1zaW0tZGVidWcgaW5zdGVhZC4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9jZmxhZ3M9IiI7OworICBubykJIHNpbV9jZmxhZ3M9IiI7OworICAqKQkgc2ltX2NmbGFncz1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fY2ZsYWdzIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gY2ZsYWdzID0gJHNpbV9jZmxhZ3MiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9jZmxhZ3M9IiIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWRlYnVnIG9yIC0tZGlzYWJsZS1zaW0tZGVidWcgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fZGVidWciCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKSBzaW1fZGVidWc9Ii1EREVCVUc9NyAtRFdJVEhfREVCVUc9NyI7OworICBubykgIHNpbV9kZWJ1Zz0iLURERUJVRz0wIC1EV0lUSF9ERUJVRz0wIjs7CisgICopICAgc2ltX2RlYnVnPSItRERFQlVHPScoJHtlbmFibGV2YWx9KScgLURXSVRIX0RFQlVHPScoJHtlbmFibGV2YWx9KSciOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fZGVidWciICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBkZWJ1ZyA9ICRzaW1fZGVidWciIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9kZWJ1Zz0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tc3RkaW8gb3IgLS1kaXNhYmxlLXNpbS1zdGRpbyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fc3RkaW8rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9zdGRpbyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9zdGRpbz0iLURXSVRIX1NURElPPURPX1VTRV9TVERJTyI7OworICBubykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9OVF9VU0VfU1RESU8iOzsKKyAgKikJeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiVW5rbm93biB2YWx1ZSAkZW5hYmxldmFsIHBhc3NlZCB0byAtLWVuYWJsZS1zaW0tc3RkaW8iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9zdGRpbz0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3N0ZGlvIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzdGRpbyBmbGFncyA9ICRzaW1fc3RkaW8iIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9zdGRpbz0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tdHJhY2Ugb3IgLS1kaXNhYmxlLXNpbS10cmFjZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fdHJhY2Urc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV90cmFjZSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV90cmFjZT0iLURUUkFDRT0xIC1EV0lUSF9UUkFDRT0tMSI7OworICBubykJc2ltX3RyYWNlPSItRFRSQUNFPTAgLURXSVRIX1RSQUNFPTAiOzsKKyAgWy0wLTldKikKKwlzaW1fdHJhY2U9Ii1EVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfVFJBQ0U9Jygke2VuYWJsZXZhbH0pJyI7OworICBbYS16XSopCisJc2ltX3RyYWNlPSIiCisJZm9yIHggaW4gYGVjaG8gIiRlbmFibGV2YWwiIHwgc2VkIC1lICJzLywvIC9nImA7IGRvCisJICBpZiB0ZXN0IHgiJHNpbV90cmFjZSIgPSB4OyB0aGVuCisJICAgIHNpbV90cmFjZT0iLURXSVRIX1RSQUNFPScoVFJBQ0VfJHgiCisJICBlbHNlCisJICAgIHNpbV90cmFjZT0iJHtzaW1fdHJhY2V9fFRSQUNFXyR4IgorCSAgZmkKKwlkb25lCisJc2ltX3RyYWNlPSIkc2ltX3RyYWNlKSciIDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX3RyYWNlIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gdHJhY2UgPSAkc2ltX3RyYWNlIiA2PiYxCitmaQorZWxzZQorICBzaW1fdHJhY2U9IiIKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXByb2ZpbGUgb3IgLS1kaXNhYmxlLXNpbS1wcm9maWxlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9wcm9maWxlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fcHJvZmlsZSIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9MSAtRFdJVEhfUFJPRklMRT0tMSI7OworICBubykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0wIC1EV0lUSF9QUk9GSUxFPTAiOzsKKyAgWy0wLTldKikKKwlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPScoJHtlbmFibGV2YWx9KScgLURXSVRIX1BST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyI7OworICBbYS16XSopCisJc2ltX3Byb2ZpbGU9IiIKKwlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKwkgIGlmIHRlc3QgeCIkc2ltX3Byb2ZpbGUiID0geDsgdGhlbgorCSAgICBzaW1fcHJvZmlsZT0iLURXSVRIX1BST0ZJTEU9JyhQUk9GSUxFXyR4IgorCSAgZWxzZQorCSAgICBzaW1fcHJvZmlsZT0iJHtzaW1fcHJvZmlsZX18UFJPRklMRV8keCIKKwkgIGZpCisJZG9uZQorCXNpbV9wcm9maWxlPSIkc2ltX3Byb2ZpbGUpJyIgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIHByb2ZpbGUgPSAkc2ltX3Byb2ZpbGUiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9wcm9maWxlPSIiCitmaQorCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozMjgyOiBjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2lnbmFsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzI4NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaWZkZWYgc2lnbmFsCisjdW5kZWYgc2lnbmFsCisjZW5kaWYKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB2b2lkICgqc2lnbmFsIChpbnQsIHZvaWQgKCopKGludCkpKShpbnQpOworI2Vsc2UKK3ZvaWQgKCpzaWduYWwgKCkpICgpOworI2VuZGlmCisKK2ludCBtYWluKCkgeworaW50IGk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzMwNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2lnbmFsPXZvaWQKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9aW50CitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2lnbmFsIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBSRVRTSUdUWVBFICRhY19jdl90eXBlX3NpZ25hbAorRU9GCisKKworCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMzMjQ6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJENZR1dJTjMyIiA9IHllczsgdGhlbgorYW1fY3ZfZXhlZXh0PS5leGUKK2Vsc2UKK2NhdCA+IGFtX2NfdGVzdC5jIDw8ICdFT0YnCitpbnQgbWFpbigpIHsKKy8qIE5vdGhpbmcgbmVlZGVkIGhlcmUgKi8KK30KK0VPRgorJHtDQy1jY30gLW8gYW1fY190ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGFtX2NfdGVzdC5jICRMSUJTIDE+JjUKK2FtX2N2X2V4ZWV4dD1gbHMgYW1fY190ZXN0LiogfCBncmVwIC12IGFtX2NfdGVzdC5jIHwgc2VkIC1lIHMvYW1fY190ZXN0Ly9gCitybSAtZiBhbV9jX3Rlc3QqCitmaQorCit0ZXN0IHgiJHthbV9jdl9leGVleHR9IiA9IHggJiYgYW1fY3ZfZXhlZXh0PW5vCitmaQorRVhFRVhUPSIiCit0ZXN0IHgiJHthbV9jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YW1fY3ZfZXhlZXh0fQorZWNobyAiJGFjX3QiIiR7YW1fY3ZfZXhlZXh0fSIgMT4mNgorCisKK3NpbV9saW5rX2ZpbGVzPQorc2ltX2xpbmtfbGlua3M9CisKK3NpbV9saW5rX2xpbmtzPXRjb25maWcuaAoraWYgdGVzdCAtZiAke3NyY2Rpcn0vdGNvbmZpZy5pbgordGhlbgorICBzaW1fbGlua19maWxlcz10Y29uZmlnLmluCitlbHNlCisgIHNpbV9saW5rX2ZpbGVzPS4uL2NvbW1vbi90Y29uZmlnLmluCitmaQorCisjIHRhcmctdmFscy5kZWYgcG9pbnRzIHRvIHRoZSBsaWJjIG1hY3JvIGRlc2NyaXB0aW9uIGZpbGUuCitjYXNlICIke3RhcmdldH0iIGluCisqLSotKikgVEFSR19WQUxTX0RFRj0uLi9jb21tb24vbmx0dmFscy5kZWYgOzsKK2VzYWMKK3NpbV9saW5rX2ZpbGVzPSIke3NpbV9saW5rX2ZpbGVzfSAke1RBUkdfVkFMU19ERUZ9Igorc2ltX2xpbmtfbGlua3M9IiR7c2ltX2xpbmtfbGlua3N9IHRhcmctdmFscy5kZWYiCisKKworCitmb3IgYWNfaGRyIGluIHVuaXN0ZC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzM3MjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDMzNzcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjMzODI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisKKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCithY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAc2ltX2Vudmlyb25tZW50QCUkc2ltX2Vudmlyb25tZW50JWcKK3MlQHNpbV9hbGlnbm1lbnRAJSRzaW1fYWxpZ25tZW50JWcKK3MlQHNpbV9hc3NlcnRAJSRzaW1fYXNzZXJ0JWcKK3MlQHNpbV9iaXRzaXplQCUkc2ltX2JpdHNpemUlZworcyVAc2ltX2VuZGlhbkAlJHNpbV9lbmRpYW4lZworcyVAc2ltX2hvc3RlbmRpYW5AJSRzaW1faG9zdGVuZGlhbiVnCitzJUBzaW1fZmxvYXRAJSRzaW1fZmxvYXQlZworcyVAc2ltX3NjYWNoZUAlJHNpbV9zY2FjaGUlZworcyVAc2ltX2RlZmF1bHRfbW9kZWxAJSRzaW1fZGVmYXVsdF9tb2RlbCVnCitzJUBzaW1faHdfY2ZsYWdzQCUkc2ltX2h3X2NmbGFncyVnCitzJUBzaW1faHdfb2Jqc0AlJHNpbV9od19vYmpzJWcKK3MlQHNpbV9od0AlJHNpbV9odyVnCitzJUBzaW1faW5saW5lQCUkc2ltX2lubGluZSVnCitzJUBzaW1fcGFja2FnZXNAJSRzaW1fcGFja2FnZXMlZworcyVAc2ltX3JlZ3Bhcm1AJSRzaW1fcmVncGFybSVnCitzJUBzaW1fcmVzZXJ2ZWRfYml0c0AlJHNpbV9yZXNlcnZlZF9iaXRzJWcKK3MlQHNpbV9zbXBAJSRzaW1fc21wJWcKK3MlQHNpbV9zdGRjYWxsQCUkc2ltX3N0ZGNhbGwlZworcyVAc2ltX3hvcl9lbmRpYW5AJSRzaW1feG9yX2VuZGlhbiVnCitzJUBidWlsZF93YXJuaW5nc0AlJGJ1aWxkX3dhcm5pbmdzJWcKK3MlQFNIRUxMQCUkU0hFTEwlZworcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBERUZTQCUkREVGUyVnCitzJUBMREZMQUdTQCUkTERGTEFHUyVnCitzJUBMSUJTQCUkTElCUyVnCitzJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKK3MlQHByZWZpeEAlJHByZWZpeCVnCitzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCitzJUBiaW5kaXJAJSRiaW5kaXIlZworcyVAc2JpbmRpckAlJHNiaW5kaXIlZworcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworcyVAZGF0YWRpckAlJGRhdGFkaXIlZworcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZworcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCitzJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCitzJUBsaWJkaXJAJSRsaWJkaXIlZworcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworcyVAaW5mb2RpckAlJGluZm9kaXIlZworcyVAbWFuZGlyQCUkbWFuZGlyJWcKK3MlQGhvc3RAJSRob3N0JWcKK3MlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKK3MlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCitzJUBob3N0X29zQCUkaG9zdF9vcyVnCitzJUB0YXJnZXRAJSR0YXJnZXQlZworcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKK3MlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKK3MlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKK3MlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCitzJUBidWlsZEAlJGJ1aWxkJWcKK3MlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZworcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKK3MlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCitzJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKK3MlQENDQCUkQ0MlZworcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKK3MlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCitzJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZworcyVASERFRklORVNAJSRIREVGSU5FUyVnCitzJUBBUkAlJEFSJWcKK3MlQFJBTkxJQkAlJFJBTkxJQiVnCitzJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKK3MlQENQUEAlJENQUCVnCitzJUBBTExPQ0FAJSRBTExPQ0ElZworcyVAVVNFX05MU0AlJFVTRV9OTFMlZworcyVATVNHRk1UQCUkTVNHRk1UJWcKK3MlQEdNU0dGTVRAJSRHTVNHRk1UJWcKK3MlQFhHRVRURVhUQCUkWEdFVFRFWFQlZworcyVAVVNFX0lOQ0xVREVEX0xJQklOVExAJSRVU0VfSU5DTFVERURfTElCSU5UTCVnCitzJUBDQVRBTE9HU0AlJENBVEFMT0dTJWcKK3MlQENBVE9CSkVYVEAlJENBVE9CSkVYVCVnCitzJUBEQVRBRElSTkFNRUAlJERBVEFESVJOQU1FJWcKK3MlQEdNT0ZJTEVTQCUkR01PRklMRVMlZworcyVASU5TVE9CSkVYVEAlJElOU1RPQkpFWFQlZworcyVASU5UTERFUFNAJSRJTlRMREVQUyVnCitzJUBJTlRMTElCU0AlJElOVExMSUJTJWcKK3MlQElOVExPQkpTQCUkSU5UTE9CSlMlZworcyVAUE9GSUxFU0AlJFBPRklMRVMlZworcyVAUE9TVUJAJSRQT1NVQiVnCitzJUBJTkNMVURFX0xPQ0FMRV9IQCUkSU5DTFVERV9MT0NBTEVfSCVnCitzJUBHVF9OT0AlJEdUX05PJWcKK3MlQEdUX1lFU0AlJEdUX1lFUyVnCitzJUBNS0lOU1RBTExESVJTQCUkTUtJTlNUQUxMRElSUyVnCitzJUBsQCUkbCVnCitzJUBNQUlOVEAlJE1BSU5UJWcKK3MlQHNpbV9ic3dhcEAlJHNpbV9ic3dhcCVnCitzJUBzaW1fY2ZsYWdzQCUkc2ltX2NmbGFncyVnCitzJUBzaW1fZGVidWdAJSRzaW1fZGVidWclZworcyVAc2ltX3N0ZGlvQCUkc2ltX3N0ZGlvJWcKK3MlQHNpbV90cmFjZUAlJHNpbV90cmFjZSVnCitzJUBzaW1fcHJvZmlsZUAlJHNpbV9wcm9maWxlJWcKK3MlQEVYRUVYVEAlJEVYRUVYVCVnCisKK0NFT0YKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KK2FjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCithY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19tb3JlX2xpbmVzPToKK2FjX3NlZF9jbWRzPSIiCit3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBmaQorICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCisgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZWxzZQorICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZmkKKyAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKyAgICBhY19iZWc9JGFjX2VuZAorICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgYWNfc2VkX2NtZHM9Y2F0CitmaQorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitDT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZS5zaW06TWFrZWZpbGUuaW4gTWFrZS1jb21tb24uc2ltOi4uL2NvbW1vbi9NYWtlLWNvbW1vbi5pbiAuZ2RiaW5pdDouLi9jb21tb24vZ2RiaW5pdC5pbiJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKyAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCisgIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCitzJUBJTlNUQUxMQCUkSU5TVEFMTCVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKKyMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyMKKyMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KK2FjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJworYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCithY19kQz0nXDMnCithY19kRD0nJWcnCisjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKK2FjX3VDPScgJworYWNfdUQ9J1w0JWcnCisjIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY19lQj0nJCVcMSNcMmRlZmluZVwzJworYWNfZUM9JyAnCithY19lRD0nJWcnCisKK2lmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmaQorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQorCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0CisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgorCitFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKKyMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKK2NhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKK3MvW1xcJiVdL1xcJi9nCitzJVtcXCRgXSVcXCYlZworcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKK3MlYWNfZCVhY191JWdwCitzJWFjX3UlYWNfZSVncAorRU9GCitzZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCitybSAtZiBjb25mdGVzdC5oZHIKKworIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgorIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCitjYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKK3MlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCitFT0YKKworIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCisjIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgorCitybSAtZiBjb25mdGVzdC50YWlsCit3aGlsZSA6CitkbworICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCisgICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KKyAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQorICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KKyAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCisgIGVjaG8gJ0NFT0YKKyAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCisnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAorICBybSAtZiBjb25mdGVzdC52YWxzCisgIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscworZG9uZQorcm0gLWYgY29uZnRlc3QudmFscworCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAorICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKKyAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKKyAgcm0gLWYgY29uZnRlc3QuaW4KKyAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KKyAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCisgICAgcm0gLWYgY29uZnRlc3QuaAorICBlbHNlCisgICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBmaQorICAgIHJtIC1mICRhY19maWxlCisgICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQorICBmaQorZmk7IGRvbmUKKworRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorYWNfc291cmNlcz0iJHNpbV9saW5rX2ZpbGVzIgorYWNfZGVzdHM9IiRzaW1fbGlua19saW5rcyIKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitzcmNkaXI9JGFjX2dpdmVuX3NyY2Rpcgord2hpbGUgdGVzdCAtbiAiJGFjX3NvdXJjZXMiOyBkbworICBzZXQgJGFjX2Rlc3RzOyBhY19kZXN0PSQxOyBzaGlmdDsgYWNfZGVzdHM9JCoKKyAgc2V0ICRhY19zb3VyY2VzOyBhY19zb3VyY2U9JDE7IHNoaWZ0OyBhY19zb3VyY2VzPSQqCisKKyAgZWNobyAibGlua2luZyAkc3JjZGlyLyRhY19zb3VyY2UgdG8gJGFjX2Rlc3QiCisKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3NvdXJjZTsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJHNyY2Rpci8kYWNfc291cmNlOiBGaWxlIG5vdCBmb3VuZCIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCisgIHJtIC1mICRhY19kZXN0CisKKyAgIyBNYWtlIHJlbGF0aXZlIHN5bWxpbmtzLgorICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGVzdF9kaXI9YGVjaG8gJGFjX2Rlc3R8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9ICIkYWNfZGVzdCIgJiYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZGVzdCBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2Rlc3RfZGlyIiAmJiBta2RpciAiJGFjX2Rlc3RfZGlyIgorICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kZXN0X2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGVzdF9kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rlc3RfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rlc3RfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkc3JjZGlyIiBpbgorICBbLyRdKikgYWNfcmVsX3NvdXJjZT0iJHNyY2Rpci8kYWNfc291cmNlIiA7OworICAqKSBhY19yZWxfc291cmNlPSIkYWNfZG90cyRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKKyAgZXNhYworCisgICMgTWFrZSBhIHN5bWxpbmsgaWYgcG9zc2libGU7IG90aGVyd2lzZSB0cnkgYSBoYXJkIGxpbmsuCisgIGlmIGxuIC1zICRhY19yZWxfc291cmNlICRhY19kZXN0IDI+L2Rldi9udWxsIHx8CisgICAgbG4gJHNyY2Rpci8kYWNfc291cmNlICRhY19kZXN0OyB0aGVuIDoKKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBsaW5rICRhY19kZXN0IHRvICRzcmNkaXIvJGFjX3NvdXJjZSIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitkb25lCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2Nhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgorIHhNYWtlZmlsZSopCisgICBlY2hvICJNZXJnaW5nIE1ha2VmaWxlLnNpbStNYWtlLWNvbW1vbi5zaW0gaW50byBNYWtlZmlsZSAuLi4iCisgICBybSAtZiBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wIE1ha2VmaWxlCisgICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BSRV8vLC9eIyMgRW5kIENPTU1PTl9QUkVfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMS50bXAKKyAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUE9TVF8vLC9eIyMgRW5kIENPTU1PTl9QT1NUXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTIudG1wCisgICBzZWQgLWUgJy9eIyMgQ09NTU9OX1BSRV8vIHIgTWFrZXNpbTEudG1wJyBcCisJLWUgJy9eIyMgQ09NTU9OX1BPU1RfLyByIE1ha2VzaW0yLnRtcCcgXAorCTxNYWtlZmlsZS5zaW0gPk1ha2VmaWxlCisgICBybSAtZiBNYWtlZmlsZS5zaW0gTWFrZS1jb21tb24uc2ltIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAKKyAgIDs7CisgZXNhYworIGNhc2UgIngkQ09ORklHX0hFQURFUlMiIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWMKKworZXhpdCAwCitFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCitybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwordGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisKKwpkaWZmIC0tZ2l0IGEvc2ltL3NoL2NvbmZpZ3VyZS5pbiBiL3NpbS9zaC9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMzYjBiYwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS9zaC9jb25maWd1cmUuaW4KQEAgLTAsMCArMSwxMCBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitzaW5jbHVkZSguLi9jb21tb24vYWNsb2NhbC5tNCkKK0FDX1BSRVJFUSgyLjUpZG5sCitBQ19JTklUKE1ha2VmaWxlLmluKQorCitTSU1fQUNfQ09NTU9OCisKK0FDX0NIRUNLX0hFQURFUlModW5pc3RkLmgpCisKK1NJTV9BQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3NpbS9zaC9nZW5jb2RlLmMgYi9zaW0vc2gvZ2VuY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOGI5MzQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vc2gvZ2VuY29kZS5jCkBAIC0wLDAgKzEsMTc1NSBAQAorLyogU2ltdWxhdG9yL09wY29kZSBnZW5lcmF0b3IgZm9yIHRoZSBIaXRhY2hpIFN1cGVyLUggYXJjaGl0ZWN0dXJlLgorCisgICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgorICAgc2FjQGN5Z251cy5jb20KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgU0ggc2ltCisKKworCQlUSElTIFNPRlRXQVJFIElTIE5PVCBDT1BZUklHSFRFRAorCisgICBDeWdudXMgb2ZmZXJzIHRoZSBmb2xsb3dpbmcgZm9yIHVzZSBpbiB0aGUgcHVibGljIGRvbWFpbi4gIEN5Z251cworICAgbWFrZXMgbm8gd2FycmFudHkgd2l0aCByZWdhcmQgdG8gdGhlIHNvZnR3YXJlIG9yIGl0J3MgcGVyZm9ybWFuY2UKKyAgIGFuZCB0aGUgdXNlciBhY2NlcHRzIHRoZSBzb2Z0d2FyZSAiQVMgSVMiIHdpdGggYWxsIGZhdWx0cy4KKworICAgQ1lHTlVTIERJU0NMQUlNUyBBTlkgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBXSVRIIFJFR0FSRCBUTworICAgVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorCisqLworCisvKiBUaGlzIHByb2dyYW0gZ2VuZXJhdGVzIHRoZSBvcGNvZGUgdGFibGUgZm9yIHRoZSBhc3NlbWJsZXIgYW5kCisgICB0aGUgc2ltdWxhdG9yIGNvZGUKKworICAgLXQJCXByaW50cyBhIHByZXR0eSB0YWJsZSBmb3IgdGhlIGFzc2VtYmxlciBtYW51YWwKKyAgIC1zCQlnZW5lcmF0ZXMgdGhlIHNpbXVsYXRvciBjb2RlIGp1bXAgdGFibGUKKyAgIC1kCQlnZW5lcmF0ZXMgYSBkZWZpbmUgdGFibGUKKyAgIC14CQlnZW5lcmF0ZXMgdGhlIHNpbXVsYXRvciBjb2RlIHN3aXRjaCBzdGF0ZW1lbnQKKyAgIGRlZmF1bHQgCWdlbmVyYXRlcyB0aGUgb3Bjb2RlIHRhYmxlcworCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBNQVhfTlJfU1RVRkYgMjAKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY2hhciAqZGVmczsKKyAgY2hhciAqcmVmczsKKyAgY2hhciAqbmFtZTsKKyAgY2hhciAqY29kZTsKKyAgY2hhciAqc3R1ZmZbTUFYX05SX1NUVUZGXTsKKyAgaW50IGluZGV4OworfQorCitvcDsKKworCitvcCB0YWJbXSA9Cit7CisKKyAgeyAibiIsICIiLCAiYWRkICM8aW1tPiw8UkVHX04+IiwgIjAxMTFubm5uaTgqMS4uLi4iLAorICAgICJSW25dICs9IFNFWFQoaSk7IiwKKyAgICAiaWYgKGkgPT0gMCkgeyIsCisgICAgIiAgVU5ERUYobik7IC8qIHNlZSAjaWZkZWYgUEFSQU5PSUQgKi8iLAorICAgICIgIGJyZWFrOyIsCisgICAgIn0iLAorICB9LAorICB7ICJuIiwgIm1uIiwgImFkZCA8UkVHX00+LDxSRUdfTj4iLCAiMDAxMW5ubm5tbW1tMTEwMCIsCisgICAgIlJbbl0gKz0gUlttXTsiLAorICB9LAorCisgIHsgIm4iLCAibW4iLCAiYWRkYyA8UkVHX00+LDxSRUdfTj4iLCAiMDAxMW5ubm5tbW1tMTExMCIsCisgICAgInVsdCA9IFJbbl0gKyBUOyIsCisgICAgIlNFVF9TUl9UICh1bHQgPCBSW25dKTsiLAorICAgICJSW25dID0gdWx0ICsgUlttXTsiLAorICAgICJTRVRfU1JfVCAoVCB8fCAoUltuXSA8IHVsdCkpOyIsCisgIH0sCisKKyAgeyAibiIsICJtbiIsICJhZGR2IDxSRUdfTT4sPFJFR19OPiIsICIwMDExbm5ubm1tbW0xMTExIiwKKyAgICAidWx0ID0gUltuXSArIFJbbV07IiwKKyAgICAiU0VUX1NSX1QgKCh+KFJbbl0gXiBSW21dKSAmICh1bHQgXiBSW25dKSkgPj4gMzEpOyIsCisgICAgIlJbbl0gPSB1bHQ7IiwKKyAgfSwKKworICB7ICIwIiwgIiIsICJhbmQgIzxpbW0+LFIwIiwgIjExMDAxMDAxaTgqMS4uLi4iLAorICAgICJSMCAmPSBpOyIsCisgIH0sCisgIHsgIm4iLCAibm0iLCAiYW5kIDxSRUdfTT4sPFJFR19OPiIsICIwMDEwbm5ubm1tbW0xMDAxIiwKKyAgICAiUltuXSAmPSBSW21dOyIsCisgIH0sCisgIHsgIiIsICIwIiwgImFuZC5iICM8aW1tPixAKFIwLEdCUikiLCAiMTEwMDExMDFpOCoxLi4uLiIsCisgICAgIk1BICgxKTsiLAorICAgICJXQkFUIChHQlIgKyBSMCwgUkJBVCAoR0JSICsgUjApICYgaSk7IiwKKyAgfSwKKworICB7ICIiLCAiIiwgImJmIDxiZGlzcDg+IiwgIjEwMDAxMDExaThwMS4uLi4iLAorICAgICJpZiAoIVQpIHsiLAorICAgICIgIG5pYSA9IFBDICsgNCArIChTRVhUKGkpICogMik7IiwKKyAgICAiICBjeWNsZXMgKz0gMjsiLAorICAgICJ9IiwKKyAgfSwKKworICB7ICIiLCAiIiwgImJmLnMgPGJkaXNwOD4iLCAiMTAwMDExMTFpOHAxLi4uLiIsCisgICAgImlmICghVCkgeyIsCisgICAgIiAgbmlhID0gUEMgKyA0ICsgKFNFWFQgKGkpICogMik7IiwKKyAgICAiICBjeWNsZXMgKz0gMjsiLAorICAgICIgIERlbGF5X1Nsb3QgKFBDICsgMik7IiwKKyAgICAifSIsCisgIH0sCisKKyAgeyAiIiwgIiIsICJicmEgPGJkaXNwMTI+IiwgIjEwMTBpMTIuLi4uLi4uLi4iLAorICAgICJuaWEgPSBQQyArIDQgKyAoU0VYVDEyIChpKSAqIDIpOyIsCisgICAgIkRlbGF5X1Nsb3QgKFBDICsgMik7IiwKKyAgfSwKKworICB7ICIiLCAibiIsICJicmFmIDxSRUdfTj4iLCAiMDAwMG5ubm4wMDEwMDAxMSIsCisgICAgIm5pYSA9IFBDICsgNCArIFJbbl07IiwKKyAgICAiRGVsYXlfU2xvdCAoUEMgKyAyKTsiLAorICB9LAorCisgIHsgIiIsICIiLCAiYnNyIDxiZGlzcDEyPiIsICIxMDExaTEyLi4uLi4uLi4uIiwKKyAgICAiUFIgPSBQQyArIDQ7IiwKKyAgICAibmlhID0gUEMgKyA0ICsgKFNFWFQxMiAoaSkgKiAyKTsiLAorICAgICJEZWxheV9TbG90IChQQyArIDIpOyIsCisgIH0sCisKKyAgeyAiIiwgIm4iLCAiYnNyZiA8UkVHX04+IiwgIjAwMDBubm5uMDAwMDAwMTEiLAorICAgICJQUiA9IFBDICsgNDsiLAorICAgICJuaWEgPSBQQyArIDQgKyBSW25dOyIsCisgICAgIkRlbGF5X1Nsb3QgKFBDICsgMik7IiwKKyAgfSwKKworICB7ICIiLCAiIiwgImJ0IDxiZGlzcDg+IiwgIjEwMDAxMDAxaThwMS4uLi4iLAorICAgICJpZiAoVCkgeyIsCisgICAgIiAgbmlhID0gUEMgKyA0ICsgKFNFWFQgKGkpICogMik7IiwKKyAgICAiICBjeWNsZXMgKz0gMjsiLAorICAgICJ9IiwKKyAgfSwKKworICB7ICIiLCAiIiwgImJ0LnMgPGJkaXNwOD4iLCAiMTAwMDExMDFpOHAxLi4uLiIsCisgICAgImlmIChUKSB7IiwKKyAgICAiICBuaWEgPSBQQyArIDQgKyAoU0VYVCAoaSkgKiAyKTsiLAorICAgICIgIGN5Y2xlcyArPSAyOyIsCisgICAgIiAgRGVsYXlfU2xvdCAoUEMgKyAyKTsiLAorICAgICJ9IiwKKyAgfSwKKworICB7ICIiLCAiIiwgImNscm1hYyIsICIwMDAwMDAwMDAwMTAxMDAwIiwKKyAgICAiTUFDSCA9IDA7IiwKKyAgICAiTUFDTCA9IDA7IiwKKyAgfSwKKworICB7ICIiLCAiIiwgImNscnMiLCAiMDAwMDAwMDAwMTAwMTAwMCIsCisgICAgIlNFVF9TUl9TICgwKTsiLAorICB9LAorCisgIHsgIiIsICIiLCAiY2xydCIsICIwMDAwMDAwMDAwMDAxMDAwIiwKKyAgICAiU0VUX1NSX1QgKDApOyIsCisgIH0sCisKKyAgeyAiIiwgIjAiLCAiY21wL2VxICM8aW1tPixSMCIsICIxMDAwMTAwMGk4KjEuLi4uIiwKKyAgICAiU0VUX1NSX1QgKFIwID09IFNFWFQgKGkpKTsiLAorICB9LAorICB7ICIiLCAibW4iLCAiY21wL2VxIDxSRUdfTT4sPFJFR19OPiIsICIwMDExbm5ubm1tbW0wMDAwIiwKKyAgICAiU0VUX1NSX1QgKFJbbl0gPT0gUlttXSk7IiwKKyAgfSwKKyAgeyAiIiwgIm1uIiwgImNtcC9nZSA8UkVHX00+LDxSRUdfTj4iLCAiMDAxMW5ubm5tbW1tMDAxMSIsCisgICAgIlNFVF9TUl9UIChSW25dID49IFJbbV0pOyIsCisgIH0sCisgIHsgIiIsICJtbiIsICJjbXAvZ3QgPFJFR19NPiw8UkVHX04+IiwgIjAwMTFubm5ubW1tbTAxMTEiLAorICAgICJTRVRfU1JfVCAoUltuXSA+IFJbbV0pOyIsCisgIH0sCisgIHsgIiIsICJtbiIsICJjbXAvaGkgPFJFR19NPiw8UkVHX04+IiwgIjAwMTFubm5ubW1tbTAxMTAiLAorICAgICJTRVRfU1JfVCAoVVJbbl0gPiBVUlttXSk7IiwKKyAgfSwKKyAgeyAiIiwgIm1uIiwgImNtcC9ocyA8UkVHX00+LDxSRUdfTj4iLCAiMDAxMW5ubm5tbW1tMDAxMCIsCisgICAgIlNFVF9TUl9UIChVUltuXSA+PSBVUlttXSk7IiwKKyAgfSwKKyAgeyAiIiwgIm4iLCAiY21wL3BsIDxSRUdfTj4iLCAiMDEwMG5ubm4wMDAxMDEwMSIsCisgICAgIlNFVF9TUl9UIChSW25dID4gMCk7IiwKKyAgfSwKKyAgeyAiIiwgIm4iLCAiY21wL3B6IDxSRUdfTj4iLCAiMDEwMG5ubm4wMDAxMDAwMSIsCisgICAgIlNFVF9TUl9UIChSW25dID49IDApOyIsCisgIH0sCisgIHsgIiIsICJtbiIsICJjbXAvc3RyIDxSRUdfTT4sPFJFR19OPiIsICIwMDEwbm5ubm1tbW0xMTAwIiwKKyAgICAidWx0ID0gUltuXSBeIFJbbV07IiwKKyAgICAiU0VUX1NSX1QgKCgodWx0ICYgMHhmZjAwMDAwMCkgPT0gMCkiLAorICAgICIgICAgICAgICAgfCAoKHVsdCAmIDB4ZmYwMDAwKSA9PSAwKSIsCisgICAgIiAgICAgICAgICB8ICgodWx0ICYgMHhmZjAwKSA9PSAwKSIsCisgICAgIiAgICAgICAgICB8ICgodWx0ICYgMHhmZikgPT0gMCkpOyIsCisgIH0sCisKKyAgeyAiIiwgIm1uIiwgImRpdjBzIDxSRUdfTT4sPFJFR19OPiIsICIwMDEwbm5ubm1tbW0wMTExIiwKKyAgICAiU0VUX1NSX1EgKChSW25dICYgc2JpdCkgIT0gMCk7IiwKKyAgICAiU0VUX1NSX00gKChSW21dICYgc2JpdCkgIT0gMCk7IiwKKyAgICAiU0VUX1NSX1QgKE0gIT0gUSk7IiwKKyAgfSwKKworICB7ICIiLCAiIiwgImRpdjB1IiwgIjAwMDAwMDAwMDAwMTEwMDEiLAorICAgICJTRVRfU1JfTSAoMCk7IiwKKyAgICAiU0VUX1NSX1EgKDApOyIsCisgICAgIlNFVF9TUl9UICgwKTsiLAorICB9LAorCisgIHsgIiIsICIiLCAiZGl2MSA8UkVHX00+LDxSRUdfTj4iLCAiMDAxMW5ubm5tbW1tMDEwMCIsCisgICAgImRpdjEgKFIsIG0sIG4vKiwgVCovKTsiLAorICB9LAorCisgIHsgIiIsICJubSIsICJkbXVscy5sIDxSRUdfTT4sPFJFR19OPiIsICIwMDExbm5ubm1tbW0xMTAxIiwKKyAgICAiZG11bCAoMS8qc2lnbmVkKi8sIFJbbl0sIFJbbV0pOyIsCisgIH0sCisKKyAgeyAiIiwgIm5tIiwgImRtdWx1LmwgPFJFR19NPiw8UkVHX04+IiwgIjAwMTFubm5ubW1tbTAxMDEiLAorICAgICJkbXVsICgwLyp1bnNpZ25lZCovLCBSW25dLCBSW21dKTsiLAorICB9LAorCisgIHsgIm4iLCAibiIsICJkdCA8UkVHX04+IiwgIjAxMDBubm5uMDAwMTAwMDAiLAorICAgICJSW25dLS07IiwKKyAgICAiU0VUX1NSX1QgKFJbbl0gPT0gMCk7IiwKKyAgfSwKKworICB7ICJuIiwgIm0iLCAiZXh0cy5iIDxSRUdfTT4sPFJFR19OPiIsICIwMTEwbm5ubm1tbW0xMTEwIiwKKyAgICAiUltuXSA9IFNFWFQgKFJbbV0pOyIsCisgIH0sCisgIHsgIm4iLCAibSIsICJleHRzLncgPFJFR19NPiw8UkVHX04+IiwgIjAxMTBubm5ubW1tbTExMTEiLAorICAgICJSW25dID0gU0VYVFcgKFJbbV0pOyIsCisgIH0sCisKKyAgeyAibiIsICJtIiwgImV4dHUuYiA8UkVHX00+LDxSRUdfTj4iLCAiMDExMG5ubm5tbW1tMTEwMCIsCisgICAgIlJbbl0gPSAoUlttXSAmIDB4ZmYpOyIsCisgIH0sCisgIHsgIm4iLCAibSIsICJleHR1LncgPFJFR19NPiw8UkVHX04+IiwgIjAxMTBubm5ubW1tbTExMDEiLAorICAgICJSW25dID0gKFJbbV0gJiAweGZmZmYpOyIsCisgIH0sCisKKyAgLyogc2gzZSAqLworICB7ICIiLCAiIiwgImZhYnMgPEZSRUdfTj4iLCAiMTExMW5ubm4wMTAxMTEwMSIsCisgICAgIkZQX1VOQVJZIChuLCBmYWJzKTsiLAorICAgICIvKiBGSVhNRTogRlIobikgJj0gMHg3ZmZmZmZmZjsgKi8iLAorICB9LAorCisgIC8qIHNoM2UgKi8KKyAgeyAiIiwgIiIsICJmYWRkIDxGUkVHX00+LDxGUkVHX04+IiwgIjExMTFubm5ubW1tbTAwMDAiLAorICAgICJGUF9PUCAobiwgKywgbSk7IiwKKyAgfSwKKworICAvKiBzaDNlICovCisgIHsgIiIsICIiLCAiZmNtcC9lcSA8RlJFR19NPiw8RlJFR19OPiIsICIxMTExbm5ubm1tbW0wMTAwIiwKKyAgICAiRlBfQ01QIChuLCA9PSwgbSk7IiwKKyAgfSwKKyAgLyogc2gzZSAqLworICB7ICIiLCAiIiwgImZjbXAvZ3QgPEZSRUdfTT4sPEZSRUdfTj4iLCAiMTExMW5ubm5tbW1tMDEwMSIsCisgICAgIkZQX0NNUCAobiwgPiwgbSk7IiwKKyAgfSwKKworICAvKiBzaDNlICovCisgIHsgIiIsICIiLCAiZmRpdiA8RlJFR19NPiw8RlJFR19OPiIsICIxMTExbm5ubm1tbW0wMDExIiwKKyAgICAiRlBfT1AgKG4sIC8sIG0pOyIsCisgICAgIi8qIEZJWE1FOiBjaGVjayBmb3IgRFAgYW5kIChuICYgMSkgPT0gMD8gKi8iLAorICB9LAorCisgIC8qIHNoM2UgKi8KKyAgeyAiIiwgIiIsICJmbGRpMCA8RlJFR19OPiIsICIxMTExbm5ubjEwMDAxMTAxIiwKKyAgICAiU0VUX0ZSIChuLCAoZmxvYXQpMC4wKTsiLAorICAgICIvKiBGSVhNRTogY2hlY2sgZm9yIERQIGFuZCAobiAmIDEpID09IDA/ICovIiwKKyAgfSwKKworICAvKiBzaDNlICovCisgIHsgIiIsICIiLCAiZmxkaTEgPEZSRUdfTj4iLCAiMTExMW5ubm4xMDAxMTEwMSIsCisgICAgIlNFVF9GUiAobiwgKGZsb2F0KTEuMCk7IiwKKyAgICAiLyogRklYTUU6IGNoZWNrIGZvciBEUCBhbmQgKG4gJiAxKSA9PSAwPyAqLyIsCisgIH0sCisKKyAgLyogc2gzZSAqLworICB7ICIiLCAiIiwgImZsZHMgPEZSRUdfTj4sRlBVTCIsICIxMTExbm5ubjAwMDExMTAxIiwKKyAgICAiY2hhciBidWZbNF07IiwKKyAgICAiKihmbG9hdCAqKWJ1ZiA9IEZSKG4pOyIsCisgICAgIkZQVUwgPSAqKGludCAqKWJ1ZjsiLAorICB9LAorCisgIC8qIHNoM2UgKi8KKyAgeyAiIiwgIiIsICJmbG9hdCBGUFVMLDxGUkVHX04+IiwgIjExMTFubm5uMDAxMDExMDEiLAorICAgICJ7IiwKKyAgICAiICBTRVRfRlIgKG4sIChmbG9hdClGUFVMKTsiLAorICAgICJ9IiwKKyAgfSwKKworICAvKiBzaDNlICovCisgIHsgIiIsICIiLCAiZm1hYyA8RlJFR18wPiw8RlJFR19NPiw8RlJFR19OPiIsICIxMTExbm5ubm1tbW0xMTEwIiwKKyAgICAiU0VUX0ZSIChuLCBGUihtKSAqIEZSKDApICsgRlIobikpOyIsCisgICAgIi8qIEZJWE1FOiBjaGVjayBmb3IgRFAgYW5kIChuICYgMSkgPT0gMD8gKi8iLAorICB9LAorCisgIC8qIHNoM2UgKi8KKyAgeyAiIiwgIiIsICJmbW92IDxGUkVHX00+LDxGUkVHX04+IiwgIjExMTFubm5ubW1tbTExMDAiLAorICAgICJ7IiwKKyAgICAiICBTRVRfRlIgKG4sIEZSIChtKSk7IiwKKyAgICAifSIsCisgIH0sCisgIC8qIHNoM2UgKi8KKyAgeyAiIiwgIiIsICJmbW92LnMgPEZSRUdfTT4sQDxSRUdfTj4iLCAiMTExMW5ubm5tbW1tMTAxMCIsCisgICAgInsiLAorICAgICIgIE1BICgxKTsiLAorICAgICIgIFdMQVQgKFJbbl0sIEZJKG0pKTsiLAorICAgICJ9IiwKKyAgfSwKKyAgLyogc2gzZSAqLworICB7ICIiLCAiIiwgImZtb3YucyBAPFJFR19NPiw8RlJFR19OPiIsICIxMTExbm5ubm1tbW0xMDAwIiwKKyAgICAieyIsCisgICAgIiAgTUEgKDEpOyIsCisgICAgIiAgU0VUX0ZJKG4sIFJMQVQoUlttXSkpOyIsCisgICAgIn0iLAorICB9LAorICAvKiBzaDNlICovCisgIHsgIiIsICIiLCAiZm1vdi5zIEA8UkVHX00+Kyw8RlJFR19OPiIsICIxMTExbm5ubm1tbW0xMDAxIiwKKyAgICAieyIsCisgICAgIiAgTUEgKDEpOyIsCisgICAgIiAgU0VUX0ZJIChuLCBSTEFUIChSW21dKSk7IiwKKyAgICAiICBSW21dICs9IDQ7IiwKKyAgICAifSIsCisgIH0sCisgIC8qIHNoM2UgKi8KKyAgeyAiIiwgIiIsICJmbW92LnMgPEZSRUdfTT4sQC08UkVHX04+IiwgIjExMTFubm5ubW1tbTEwMTEiLAorICAgICJ7IiwKKyAgICAiICBNQSAoMSk7IiwKKyAgICAiICBSW25dIC09IDQ7IiwKKyAgICAiICBXTEFUIChSW25dLCBGSShtKSk7IiwKKyAgICAifSIsCisgIH0sCisgIC8qIHNoM2UgKi8KKyAgeyAiIiwgIiIsICJmbW92LnMgQChSMCw8UkVHX00+KSw8RlJFR19OPiIsICIxMTExbm5ubm1tbW0wMTEwIiwKKyAgICAieyIsCisgICAgIiAgTUEgKDEpOyIsCisgICAgIiAgU0VUX0ZJKG4sIFJMQVQoUlswXSArIFJbbV0pKTsiLAorICAgICJ9IiwKKyAgfSwKKyAgLyogc2gzZSAqLworICB7ICIiLCAiIiwgImZtb3YucyA8RlJFR19NPixAKFIwLDxSRUdfTj4pIiwgIjExMTFubm5ubW1tbTAxMTEiLAorICAgICJ7IiwKKyAgICAiICBNQSAoMSk7IiwKKyAgICAiICBXTEFUKChSWzBdK1Jbbl0pLCBGSShtKSk7IiwKKyAgICAifSIsCisgIH0sCisKKyAgLyogc2gzZSAqLworICB7ICIiLCAiIiwgImZtdWwgPEZSRUdfTT4sPEZSRUdfTj4iLCAiMTExMW5ubm5tbW1tMDAxMCIsCisgICAgIkZQX09QKG4sICosIG0pOyIsCisgIH0sCisKKyAgLyogc2gzZSAqLworICB7ICIiLCAiIiwgImZuZWcgPEZSRUdfTj4iLCAiMTExMW5ubm4wMTAwMTEwMSIsCisgICAgIkZQX1VOQVJZKG4sIC0pOyIsCisgIH0sCisKKyAgLyogc2gzZSAqLworICB7ICIiLCAiIiwgImZzcXJ0IDxGUkVHX04+IiwgIjExMTFubm5uMDExMDExMDEiLAorICAgICJGUF9VTkFSWShuLCBzcXJ0KTsiLAorICB9LAorCisgIC8qIHNoM2UgKi8KKyAgeyAiIiwgIiIsICJmc3ViIDxGUkVHX00+LDxGUkVHX04+IiwgIjExMTFubm5ubW1tbTAwMDEiLAorICAgICJGUF9PUChuLCAtLCBtKTsiLAorICB9LAorCisgIC8qIHNoM2UgKi8KKyAgeyAiIiwgIiIsICJmdHJjIDxGUkVHX04+LCBGUFVMIiwgIjExMTFubm5uMDAxMTExMDEiLAorICAgICJpZiAoRlIobikgIT0gRlIobikpIC8qIE5hTiAqLyIsCisgICAgIiAgRlBVTCA9IDB4ODAwMDAwMDA7IiwKKyAgICAiZWxzZSIsCisgICAgIiAgRlBVTCA9IChpbnQpRlIobik7IiwKKyAgfSwKKworICAvKiBzaDNlICovCisgIHsgIiIsICIiLCAiZnRzdC9uYW4gPEZSRUdfTj4iLCAiMTExMW5ubm4wMTExMTEwMSIsCisgICAgIlNFVF9TUl9UIChpc25hbiAoRlIobikpKTsiLAorICB9LAorICAvKiBzaDNlICovCisgIHsgIiIsICIiLCAiZnN0cyBGUFVMLDxGUkVHX04+IiwgIjExMTFubm5uMDAwMDExMDEiLAorICAgICJjaGFyIGJ1Zls0XTsiLAorICAgICIqKGludCAqKWJ1ZiA9IEZQVUw7IiwKKyAgICAiU0VUX0ZSIChuLCAqKGZsb2F0ICopYnVmKTsiLAorICB9LAorCisgIHsgIiIsICJuIiwgImptcCBAPFJFR19OPiIsICIwMTAwbm5ubjAwMTAxMDExIiwKKyAgICAibmlhID0gUltuXTsiLAorICAgICJEZWxheV9TbG90IChQQyArIDIpOyIsCisgIH0sCisKKyAgeyAiIiwgIm4iLCAianNyIEA8UkVHX04+IiwgIjAxMDBubm5uMDAwMDEwMTEiLAorICAgICJQUiA9IFBDICsgNDsiLAorICAgICJuaWEgPSBSW25dOyIsCisgICAgImlmICh+ZG9wcm9maWxlKSIsCisgICAgIiAgZ290Y2FsbCAoUFIsIG5pYSk7IiwKKyAgICAiRGVsYXlfU2xvdCAoUEMgKyAyKTsiLAorICB9LAorCisgIHsgIiIsICJuIiwgImxkYyA8UkVHX04+LEdCUiIsICIwMTAwbm5ubjAwMDExMTEwIiwKKyAgICAiR0JSID0gUltuXTsiLAorICAgICIvKiBGSVhNRTogdXNlciBtb2RlICovIiwKKyAgfSwKKyAgeyAiIiwgIm4iLCAibGRjIDxSRUdfTj4sU1IiLCAiMDEwMG5ubm4wMDAwMTExMCIsCisgICAgIlNFVF9TUiAoUltuXSk7IiwKKyAgICAiLyogRklYTUU6IHVzZXIgbW9kZSAqLyIsCisgIH0sCisgIHsgIiIsICJuIiwgImxkYyA8UkVHX04+LFZCUiIsICIwMTAwbm5ubjAwMTAxMTEwIiwKKyAgICAiVkJSID0gUltuXTsiLAorICAgICIvKiBGSVhNRTogdXNlciBtb2RlICovIiwKKyAgfSwKKyAgeyAiIiwgIm4iLCAibGRjIDxSRUdfTj4sU1NSIiwgIjAxMDBubm5uMDAxMTExMTAiLAorICAgICJTU1IgPSBSW25dOyIsCisgICAgIi8qIEZJWE1FOiB1c2VyIG1vZGUgKi8iLAorICB9LAorICB7ICIiLCAibiIsICJsZGMgPFJFR19OPixTUEMiLCAiMDEwMG5ubm4wMTAwMTExMCIsCisgICAgIlNQQyA9IFJbbl07IiwKKyAgICAiLyogRklYTUU6IHVzZXIgbW9kZSAqLyIsCisgIH0sCisgIHsgIiIsICJuIiwgImxkYyA8UkVHX04+LFIwX0JBTksiLCAiMDEwMG5ubm4xMDAwMTExMCIsCisgICAgIlNFVF9Sbl9CQU5LICgwLCBSW25dKTsiLAorICAgICIvKiBGSVhNRTogdXNlciBtb2RlICovIiwKKyAgfSwKKyAgeyAiIiwgIm4iLCAibGRjIDxSRUdfTj4sUjFfQkFOSyIsICIwMTAwbm5ubjEwMDExMTEwIiwKKyAgICAiU0VUX1JuX0JBTksgKDEsIFJbbl0pOyIsCisgICAgIi8qIEZJWE1FOiB1c2VyIG1vZGUgKi8iLAorICB9LAorICB7ICIiLCAibiIsICJsZGMgPFJFR19OPixSMl9CQU5LIiwgIjAxMDBubm5uMTAxMDExMTAiLAorICAgICJTRVRfUm5fQkFOSyAoMiwgUltuXSk7IiwKKyAgICAiLyogRklYTUU6IHVzZXIgbW9kZSAqLyIsCisgIH0sCisgIHsgIiIsICJuIiwgImxkYyA8UkVHX04+LFIzX0JBTksiLCAiMDEwMG5ubm4xMDExMTExMCIsCisgICAgIlNFVF9Sbl9CQU5LICgzLCBSW25dKTsiLAorICAgICIvKiBGSVhNRTogdXNlciBtb2RlICovIiwKKyAgfSwKKyAgeyAiIiwgIm4iLCAibGRjIDxSRUdfTj4sUjRfQkFOSyIsICIwMTAwbm5ubjExMDAxMTEwIiwKKyAgICAiU0VUX1JuX0JBTksgKDQsIFJbbl0pOyIsCisgICAgIi8qIEZJWE1FOiB1c2VyIG1vZGUgKi8iLAorICB9LAorICB7ICIiLCAibiIsICJsZGMgPFJFR19OPixSNV9CQU5LIiwgIjAxMDBubm5uMTEwMTExMTAiLAorICAgICJTRVRfUm5fQkFOSyAoNSwgUltuXSk7IiwKKyAgICAiLyogRklYTUU6IHVzZXIgbW9kZSAqLyIsCisgIH0sCisgIHsgIiIsICJuIiwgImxkYyA8UkVHX04+LFI2X0JBTksiLCAiMDEwMG5ubm4xMTEwMTExMCIsCisgICAgIlNFVF9Sbl9CQU5LICg2LCBSW25dKTsiLAorICAgICIvKiBGSVhNRTogdXNlciBtb2RlICovIiwKKyAgfSwKKyAgeyAiIiwgIm4iLCAibGRjIDxSRUdfTj4sUjdfQkFOSyIsICIwMTAwbm5ubjExMTExMTEwIiwKKyAgICAiU0VUX1JuX0JBTksgKDcsIFJbbl0pOyIsCisgICAgIi8qIEZJWE1FOiB1c2VyIG1vZGUgKi8iLAorICB9LAorICB7ICIiLCAibiIsICJsZGMubCBAPFJFR19OPissR0JSIiwgIjAxMDBubm5uMDAwMTAxMTEiLAorICAgICJNQSAoMSk7IiwKKyAgICAiR0JSID0gUkxBVCAoUltuXSk7IiwKKyAgICAiUltuXSArPSA0OyIsCisgICAgIi8qIEZJWE1FOiB1c2VyIG1vZGUgKi8iLAorICB9LAorICB7ICIiLCAibiIsICJsZGMubCBAPFJFR19OPissU1IiLCAiMDEwMG5ubm4wMDAwMDExMSIsCisgICAgIk1BICgxKTsiLAorICAgICJTRVRfU1IgKFJMQVQgKFJbbl0pKTsiLAorICAgICJSW25dICs9IDQ7IiwKKyAgICAiLyogRklYTUU6IHVzZXIgbW9kZSAqLyIsCisgIH0sCisgIHsgIiIsICJuIiwgImxkYy5sIEA8UkVHX04+KyxWQlIiLCAiMDEwMG5ubm4wMDEwMDExMSIsCisgICAgIk1BICgxKTsiLAorICAgICJWQlIgPSBSTEFUIChSW25dKTsiLAorICAgICJSW25dICs9IDQ7IiwKKyAgICAiLyogRklYTUU6IHVzZXIgbW9kZSAqLyIsCisgIH0sCisgIHsgIiIsICJuIiwgImxkYy5sIEA8UkVHX04+KyxTU1IiLCAiMDEwMG5ubm4wMDExMDExMSIsCisgICAgIk1BICgxKTsiLAorICAgICJTU1IgPSBSTEFUIChSW25dKTsiLAorICAgICJSW25dICs9IDQ7IiwKKyAgICAiLyogRklYTUU6IHVzZXIgbW9kZSAqLyIsCisgIH0sCisgIHsgIiIsICJuIiwgImxkYy5sIEA8UkVHX04+KyxTUEMiLCAiMDEwMG5ubm4wMTAwMDExMSIsCisgICAgIk1BICgxKTsiLAorICAgICJTUEMgPSBSTEFUIChSW25dKTsiLAorICAgICJSW25dICs9IDQ7IiwKKyAgICAiLyogRklYTUU6IHVzZXIgbW9kZSAqLyIsCisgIH0sCisgIHsgIiIsICJuIiwgImxkYy5sIEA8UkVHX04+KyxSMF9CQU5LIiwgIjAxMDBubm5uMTAwMDAxMTEiLAorICAgICJNQSAoMSk7IiwKKyAgICAiU0VUX1JuX0JBTksgKDAsIFJMQVQgKFJbbl0pKTsiLAorICAgICJSW25dICs9IDQ7IiwKKyAgICAiLyogRklYTUU6IHVzZXIgbW9kZSAqLyIsCisgIH0sCisgIHsgIiIsICJuIiwgImxkYy5sIEA8UkVHX04+KyxSMV9CQU5LIiwgIjAxMDBubm5uMTAwMTAxMTEiLAorICAgICJNQSAoMSk7IiwKKyAgICAiU0VUX1JuX0JBTksgKDEsIFJMQVQgKFJbbl0pKTsiLAorICAgICJSW25dICs9IDQ7IiwKKyAgICAiLyogRklYTUU6IHVzZXIgbW9kZSAqLyIsCisgIH0sCisgIHsgIiIsICJuIiwgImxkYy5sIEA8UkVHX04+KyxSMl9CQU5LIiwgIjAxMDBubm5uMTAxMDAxMTEiLAorICAgICJNQSAoMSk7IiwKKyAgICAiU0VUX1JuX0JBTksgKDIsIFJMQVQgKFJbbl0pKTsiLAorICAgICJSW25dICs9IDQ7IiwKKyAgICAiLyogRklYTUU6IHVzZXIgbW9kZSAqLyIsCisgIH0sCisgIHsgIiIsICJuIiwgImxkYy5sIEA8UkVHX04+KyxSM19CQU5LIiwgIjAxMDBubm5uMTAxMTAxMTEiLAorICAgICJNQSAoMSk7IiwKKyAgICAiU0VUX1JuX0JBTksgKDMsIFJMQVQgKFJbbl0pKTsiLAorICAgICJSW25dICs9IDQ7IiwKKyAgICAiLyogRklYTUU6IHVzZXIgbW9kZSAqLyIsCisgIH0sCisgIHsgIiIsICJuIiwgImxkYy5sIEA8UkVHX04+KyxSNF9CQU5LIiwgIjAxMDBubm5uMTEwMDAxMTEiLAorICAgICJNQSAoMSk7IiwKKyAgICAiU0VUX1JuX0JBTksgKDQsIFJMQVQgKFJbbl0pKTsiLAorICAgICJSW25dICs9IDQ7IiwKKyAgICAiLyogRklYTUU6IHVzZXIgbW9kZSAqLyIsCisgIH0sCisgIHsgIiIsICJuIiwgImxkYy5sIEA8UkVHX04+KyxSNV9CQU5LIiwgIjAxMDBubm5uMTEwMTAxMTEiLAorICAgICJNQSAoMSk7IiwKKyAgICAiU0VUX1JuX0JBTksgKDUsIFJMQVQgKFJbbl0pKTsiLAorICAgICJSW25dICs9IDQ7IiwKKyAgICAiLyogRklYTUU6IHVzZXIgbW9kZSAqLyIsCisgIH0sCisgIHsgIiIsICJuIiwgImxkYy5sIEA8UkVHX04+KyxSNl9CQU5LIiwgIjAxMDBubm5uMTExMDAxMTEiLAorICAgICJNQSAoMSk7IiwKKyAgICAiU0VUX1JuX0JBTksgKDYsIFJMQVQgKFJbbl0pKTsiLAorICAgICJSW25dICs9IDQ7IiwKKyAgICAiLyogRklYTUU6IHVzZXIgbW9kZSAqLyIsCisgIH0sCisgIHsgIiIsICJuIiwgImxkYy5sIEA8UkVHX04+KyxSN19CQU5LIiwgIjAxMDBubm5uMTExMTAxMTEiLAorICAgICJNQSAoMSk7IiwKKyAgICAiU0VUX1JuX0JBTksgKDcsIFJMQVQgKFJbbl0pKTsiLAorICAgICJSW25dICs9IDQ7IiwKKyAgICAiLyogRklYTUU6IHVzZXIgbW9kZSAqLyIsCisgIH0sCisKKyAgLyogc2gzZSAqLworICB7ICIiLCAiIiwgImxkcyA8UkVHX04+LEZQVUwiLCAiMDEwMG5ubm4wMTAxMTAxMCIsCisgICAgIkZQVUwgPSBSW25dOyIsCisgIH0sCisgIC8qIHNoM2UgKi8KKyAgeyAiIiwgIiIsICJsZHMubCBAPFJFR19OPissRlBVTCIsICIwMTAwbm5ubjAxMDEwMTEwIiwKKyAgICAiTUEgKDEpOyIsCisgICAgIkZQVUwgPSBSTEFUKFJbbl0pOyIsCisgICAgIlJbbl0gKz0gNDsiLAorICB9LAorICAvKiBzaDNlICovCisgIHsgIiIsICIiLCAibGRzIDxSRUdfTj4sRlBTQ1IiLCAiMDEwMG5ubm4wMTEwMTAxMCIsCisgICAgIlNFVF9GUFNDUihSW25dKTsiLAorICB9LAorICAvKiBzaDNlICovCisgIHsgIiIsICIiLCAibGRzLmwgQDxSRUdfTj4rLEZQU0NSIiwgIjAxMDBubm5uMDExMDAxMTAiLAorICAgICJNQSAoMSk7IiwKKyAgICAiU0VUX0ZQU0NSIChSTEFUKFJbbl0pKTsiLAorICAgICJSW25dICs9IDQ7IiwKKyAgfSwKKworICB7ICIiLCAibiIsICJsZHMgPFJFR19OPixNQUNIIiwgIjAxMDBubm5uMDAwMDEwMTAiLAorICAgICJNQUNIID0gUltuXTsiLAorICB9LAorICB7ICIiLCAibiIsICJsZHMgPFJFR19OPixNQUNMIiwgIjAxMDBubm5uMDAwMTEwMTAiLAorICAgICJNQUNMPSBSW25dOyIsCisgIH0sCisgIHsgIiIsICJuIiwgImxkcyA8UkVHX04+LFBSIiwgIjAxMDBubm5uMDAxMDEwMTAiLAorICAgICJQUiA9IFJbbl07IiwKKyAgfSwKKyAgeyAiIiwgIm4iLCAibGRzLmwgQDxSRUdfTj4rLE1BQ0giLCAiMDEwMG5ubm4wMDAwMDExMCIsCisgICAgIk1BICgxKTsiLAorICAgICJNQUNIID0gU0VYVChSTEFUKFJbbl0pKTsiLAorICAgICJSW25dKz00OyIsCisgIH0sCisgIHsgIiIsICJuIiwgImxkcy5sIEA8UkVHX04+KyxNQUNMIiwgIjAxMDBubm5uMDAwMTAxMTAiLAorICAgICJNQSAoMSk7IiwKKyAgICAiTUFDTCA9IFJMQVQoUltuXSk7IiwKKyAgICAiUltuXSs9NDsiLAorICB9LAorICB7ICIiLCAibiIsICJsZHMubCBAPFJFR19OPissUFIiLCAiMDEwMG5ubm4wMDEwMDExMCIsCisgICAgIk1BICgxKTsiLAorICAgICJQUiA9IFJMQVQoUltuXSk7IiwKKyAgICAiUltuXSs9NDs7IiwKKyAgfSwKKworICB7ICIiLCAiIiwgImxkdGxiIiwgIjAwMDAwMDAwMDAxMTEwMDAiLAorICAgICIvKiBGSVhNRTogWFhYKi8gYWJvcnQoKTsiLAorICB9LAorCisgIHsgIiIsICJubSIsICJtYWMubCBAPFJFR19NPissQDxSRUdfTj4rIiwgIjAwMDBubm5ubW1tbTExMTEiLAorICAgICJ0cmFwICgyNTUsUjAsbWVtb3J5LG1hc2tsLG1hc2t3LGxpdHRsZV9lbmRpYW4pOyIsCisgICAgIi8qIEZJWE1FOiBtYWMubCBzdXBwb3J0ICovIiwKKyAgfSwKKworICB7ICIiLCAibm0iLCAibWFjLncgQDxSRUdfTT4rLEA8UkVHX04+KyIsICIwMTAwbm5ubm1tbW0xMTExIiwKKyAgICAibWFjdyhSMCxtZW1vcnksbixtKTsiLAorICB9LAorCisgIHsgIm4iLCAiIiwgIm1vdiAjPGltbT4sPFJFR19OPiIsICIxMTEwbm5ubmk4KjEuLi4uIiwKKyAgICAiUltuXSA9IFNFWFQoaSk7IiwKKyAgfSwKKyAgeyAibiIsICJtIiwgIm1vdiA8UkVHX00+LDxSRUdfTj4iLCAiMDExMG5ubm5tbW1tMDAxMSIsCisgICAgIlJbbl0gPSBSW21dOyIsCisgIH0sCisKKyAgeyAiMCIsICIiLCAibW92LmIgQCg8ZGlzcD4sR0JSKSxSMCIsICIxMTAwMDEwMGk4KjEuLi4uIiwKKyAgICAiTUEgKDEpOyIsCisgICAgIlIwID0gUlNCQVQgKGkgKyBHQlIpOyIsCisgICAgIkwgKDApOyIsCisgIH0sCisgIHsgIjAiLCAibSIsICJtb3YuYiBAKDxkaXNwPiw8UkVHX00+KSxSMCIsICIxMDAwMDEwMG1tbW1pNCoxIiwKKyAgICAiTUEgKDEpOyIsCisgICAgIlIwID0gUlNCQVQgKGkgKyBSW21dKTsiLAorICAgICJMICgwKTsiLAorICB9LAorICB7ICJuIiwgIjBtIiwgIm1vdi5iIEAoUjAsPFJFR19NPiksPFJFR19OPiIsICIwMDAwbm5ubm1tbW0xMTAwIiwKKyAgICAiTUEgKDEpOyIsCisgICAgIlJbbl0gPSBSU0JBVCAoUjAgKyBSW21dKTsiLAorICAgICJMIChuKTsiLAorICB9LAorICB7ICJuIiwgIm0iLCAibW92LmIgQDxSRUdfTT4rLDxSRUdfTj4iLCAiMDExMG5ubm5tbW1tMDEwMCIsCisgICAgIk1BICgxKTsiLAorICAgICJSW25dID0gUlNCQVQgKFJbbV0pOyIsCisgICAgIlJbbV0gKz0gMTsiLAorICAgICJMIChuKTsiLAorICB9LAorICB7ICIiLCAibW4iLCAibW92LmIgPFJFR19NPixAPFJFR19OPiIsICIwMDEwbm5ubm1tbW0wMDAwIiwKKyAgICAiTUEgKDEpOyIsCisgICAgIldCQVQgKFJbbl0sIFJbbV0pOyIsCisgIH0sCisgIHsgIiIsICIwIiwgIm1vdi5iIFIwLEAoPGRpc3A+LEdCUikiLCAiMTEwMDAwMDBpOCoxLi4uLiIsCisgICAgIk1BICgxKTsiLAorICAgICJXQkFUIChpICsgR0JSLCBSMCk7IiwKKyAgfSwKKyAgeyAiIiwgIm0wIiwgIm1vdi5iIFIwLEAoPGRpc3A+LDxSRUdfTT4pIiwgIjEwMDAwMDAwbW1tbWk0KjEiLAorICAgICJNQSAoMSk7IiwKKyAgICAiV0JBVCAoaSArIFJbbV0sIFIwKTsiLAorICB9LAorICB7ICIiLCAibW4wIiwgIm1vdi5iIDxSRUdfTT4sQChSMCw8UkVHX04+KSIsICIwMDAwbm5ubm1tbW0wMTAwIiwKKyAgICAiTUEgKDEpOyIsCisgICAgIldCQVQgKFJbbl0gKyBSMCwgUlttXSk7IiwKKyAgfSwKKyAgeyAiIiwgIm5tIiwgIm1vdi5iIDxSRUdfTT4sQC08UkVHX04+IiwgIjAwMTBubm5ubW1tbTAxMDAiLAorICAgICJNQSAoMSk7IiwKKyAgICAiUltuXSAtPSAxOyIsCisgICAgIldCQVQgKFJbbl0sIFJbbV0pOyIsCisgIH0sCisgIHsgIm4iLCAibSIsICJtb3YuYiBAPFJFR19NPiw8UkVHX04+IiwgIjAxMTBubm5ubW1tbTAwMDAiLAorICAgICJNQSAoMSk7IiwKKyAgICAiUltuXSA9IFJTQkFUIChSW21dKTsiLAorICAgICJMIChuKTsiLAorICB9LAorCisgIHsgIjAiLCAiIiwgIm1vdi5sIEAoPGRpc3A+LEdCUiksUjAiLCAiMTEwMDAxMTBpOCo0Li4uLiIsCisgICAgIk1BICgxKTsiLAorICAgICJSMCA9IFJMQVQgKGkgKyBHQlIpOyIsCisgICAgIkwgKDApOyIsCisgIH0sCisgIHsgIm4iLCAiIiwgIm1vdi5sIEAoPGRpc3A+LFBDKSw8UkVHX04+IiwgIjExMDFubm5uaThwNC4uLi4iLAorICAgICJNQSAoMSk7IiwKKyAgICAiUltuXSA9IFJMQVQoKFBDICYgfjMpICsgNCArIGkpOyIsCisgICAgIkwgKG4pOyIsCisgIH0sCisgIHsgIm4iLCAibSIsICJtb3YubCBAKDxkaXNwPiw8UkVHX00+KSw8UkVHX04+IiwgIjAxMDFubm5ubW1tbWk0KjQiLAorICAgICJNQSAoMSk7IiwKKyAgICAiUltuXSA9IFJMQVQgKGkgKyBSW21dKTsiLAorICAgICJMIChuKTsiLAorICB9LAorICB7ICJuIiwgIm0wIiwgIm1vdi5sIEAoUjAsPFJFR19NPiksPFJFR19OPiIsICIwMDAwbm5ubm1tbW0xMTEwIiwKKyAgICAiTUEgKDEpOyIsCisgICAgIlJbbl0gPSBSTEFUIChSMCArIFJbbV0pOyIsCisgICAgIkwgKG4pOyIsCisgIH0sCisgIHsgIm5tIiwgIm0iLCAibW92LmwgQDxSRUdfTT4rLDxSRUdfTj4iLCAiMDExMG5ubm5tbW1tMDExMCIsCisgICAgIk1BICgxKTsiLAorICAgICJSW25dID0gUkxBVCAoUlttXSk7IiwKKyAgICAiUlttXSArPSA0OyIsCisgICAgIkwgKG4pOyIsCisgIH0sCisgIHsgIm4iLCAibSIsICJtb3YubCBAPFJFR19NPiw8UkVHX04+IiwgIjAxMTBubm5ubW1tbTAwMTAiLAorICAgICJNQSAoMSk7IiwKKyAgICAiUltuXSA9IFJMQVQgKFJbbV0pOyIsCisgICAgIkwgKG4pOyIsCisgIH0sCisgIHsgIiIsICIwIiwgIm1vdi5sIFIwLEAoPGRpc3A+LEdCUikiLCAiMTEwMDAwMTBpOCo0Li4uLiIsCisgICAgIk1BICgxKTsiLAorICAgICJXTEFUIChpICsgR0JSLCBSMCk7IiwKKyAgfSwKKyAgeyAiIiwgIm5tIiwgIm1vdi5sIDxSRUdfTT4sQCg8ZGlzcD4sPFJFR19OPikiLCAiMDAwMW5ubm5tbW1taTQqNCIsCisgICAgIk1BICgxKTsiLAorICAgICJXTEFUIChpICsgUltuXSwgUlttXSk7IiwKKyAgfSwKKyAgeyAiIiwgIm5tMCIsICJtb3YubCA8UkVHX00+LEAoUjAsPFJFR19OPikiLCAiMDAwMG5ubm5tbW1tMDExMCIsCisgICAgIk1BICgxKTsiLAorICAgICJXTEFUIChSMCArIFJbbl0sIFJbbV0pOyIsCisgIH0sCisgIHsgIiIsICJubSIsICJtb3YubCA8UkVHX00+LEAtPFJFR19OPiIsICIwMDEwbm5ubm1tbW0wMTEwIiwKKyAgICAiTUEgKDEpIDsiLAorICAgICJSW25dIC09IDQ7IiwKKyAgICAiV0xBVCAoUltuXSwgUlttXSk7IiwKKyAgfSwKKyAgeyAiIiwgIm5tIiwgIm1vdi5sIDxSRUdfTT4sQDxSRUdfTj4iLCAiMDAxMG5ubm5tbW1tMDAxMCIsCisgICAgIk1BICgxKTsiLAorICAgICJXTEFUIChSW25dLCBSW21dKTsiLAorICB9LAorCisgIHsgIjAiLCAiIiwgIm1vdi53IEAoPGRpc3A+LEdCUiksUjAiLCAiMTEwMDAxMDFpOCoyLi4uLiIsCisgICAgIk1BICgxKSIsCisgICAgIjtSMCA9IFJTV0FUIChpICsgR0JSKTsiLAorICAgICJMICgwKTsiLAorICB9LAorICB7ICJuIiwgIiIsICJtb3YudyBAKDxkaXNwPixQQyksPFJFR19OPiIsICIxMDAxbm5ubmk4cDIuLi4uIiwKKyAgICAiTUEgKDEpOyIsCisgICAgIlJbbl0gPSBSU1dBVCAoUEMgKyA0ICsgaSk7IiwKKyAgICAiTCAobik7IiwKKyAgfSwKKyAgeyAiMCIsICJtIiwgIm1vdi53IEAoPGRpc3A+LDxSRUdfTT4pLFIwIiwgIjEwMDAwMTAxbW1tbWk0KjIiLAorICAgICJNQSAoMSk7IiwKKyAgICAiUjAgPSBSU1dBVCAoaSArIFJbbV0pOyIsCisgICAgIkwgKDApOyIsCisgIH0sCisgIHsgIm4iLCAibTAiLCAibW92LncgQChSMCw8UkVHX00+KSw8UkVHX04+IiwgIjAwMDBubm5ubW1tbTExMDEiLAorICAgICJNQSAoMSk7IiwKKyAgICAiUltuXSA9IFJTV0FUIChSMCArIFJbbV0pOyIsCisgICAgIkwgKG4pOyIsCisgIH0sCisgIHsgIm5tIiwgIm4iLCAibW92LncgQDxSRUdfTT4rLDxSRUdfTj4iLCAiMDExMG5ubm5tbW1tMDEwMSIsCisgICAgIk1BICgxKTsiLAorICAgICJSW25dID0gUlNXQVQgKFJbbV0pOyIsCisgICAgIlJbbV0gKz0gMjsiLAorICAgICJMIChuKTsiLAorICB9LAorICB7ICJuIiwgIm0iLCAibW92LncgQDxSRUdfTT4sPFJFR19OPiIsICIwMTEwbm5ubm1tbW0wMDAxIiwKKyAgICAiTUEgKDEpOyIsCisgICAgIlJbbl0gPSBSU1dBVCAoUlttXSk7IiwKKyAgICAiTCAobik7IiwKKyAgfSwKKyAgeyAiIiwgIjAiLCAibW92LncgUjAsQCg8ZGlzcD4sR0JSKSIsICIxMTAwMDAwMWk4KjIuLi4uIiwKKyAgICAiTUEgKDEpOyIsCisgICAgIldXQVQgKGkgKyBHQlIsIFIwKTsiLAorICB9LAorICB7ICIiLCAiMG0iLCAibW92LncgUjAsQCg8ZGlzcD4sPFJFR19NPikiLCAiMTAwMDAwMDFtbW1taTQqMiIsCisgICAgIk1BICgxKTsiLAorICAgICJXV0FUIChpICsgUlttXSwgUjApOyIsCisgIH0sCisgIHsgIiIsICJtMG4iLCAibW92LncgPFJFR19NPixAKFIwLDxSRUdfTj4pIiwgIjAwMDBubm5ubW1tbTAxMDEiLAorICAgICJNQSAoMSk7IiwKKyAgICAiV1dBVCAoUjAgKyBSW25dLCBSW21dKTsiLAorICB9LAorICB7ICJuIiwgIm1uIiwgIm1vdi53IDxSRUdfTT4sQC08UkVHX04+IiwgIjAwMTBubm5ubW1tbTAxMDEiLAorICAgICJNQSAoMSk7IiwKKyAgICAiUltuXSAtPSAyOyIsCisgICAgIldXQVQgKFJbbl0sIFJbbV0pOyIsCisgIH0sCisgIHsgIiIsICJubSIsICJtb3YudyA8UkVHX00+LEA8UkVHX04+IiwgIjAwMTBubm5ubW1tbTAwMDEiLAorICAgICJNQSAoMSk7IiwKKyAgICAiV1dBVCAoUltuXSwgUlttXSk7IiwKKyAgfSwKKworICB7ICIwIiwgIiIsICJtb3ZhIEAoPGRpc3A+LFBDKSxSMCIsICIxMTAwMDExMWk4cDQuLi4uIiwKKyAgICAiUjAgPSAoKGkgKyA0ICsgUEMpICYgfjB4Myk7IiwKKyAgfSwKKworICB7ICJuIiwgIiIsICJtb3Z0IDxSRUdfTj4iLCAiMDAwMG5ubm4wMDEwMTAwMSIsCisgICAgIlJbbl0gPSBUOyIsCisgIH0sCisKKyAgeyAiIiwgIm1uIiwgIm11bC5sIDxSRUdfTT4sPFJFR19OPiIsICIwMDAwbm5ubm1tbW0wMTExIiwKKyAgICAiTUFDTCA9ICgoaW50KVJbbl0pICogKChpbnQpUlttXSk7IiwKKyAgfSwKKyNpZiAwCisgIHsgIiIsICJubSIsICJtdWwubCA8UkVHX00+LDxSRUdfTj4iLCAiMDAwMG5ubm5tbW1tMDExMSIsCisgICAgIk1BQ0wgPSBSW25dICogUlttXTsiLAorICB9LAorI2VuZGlmCisKKyAgLyogbXVscy53IC0gc2VlIG11bHMgKi8KKyAgeyAiIiwgIm1uIiwgIm11bHMgPFJFR19NPiw8UkVHX04+IiwgIjAwMTBubm5ubW1tbTExMTEiLAorICAgICJNQUNMID0gKChpbnQpKHNob3J0KVJbbl0pICogKChpbnQpKHNob3J0KVJbbV0pOyIsCisgIH0sCisKKyAgLyogbXVsdS53IC0gc2VlIG11bHUgKi8KKyAgeyAiIiwgIm1uIiwgIm11bHUgPFJFR19NPiw8UkVHX04+IiwgIjAwMTBubm5ubW1tbTExMTAiLAorICAgICJNQUNMID0gKCgodW5zaWduZWQgaW50KSh1bnNpZ25lZCBzaG9ydClSW25dKSIsCisgICAgIiAgICAgICAgKiAoKHVuc2lnbmVkIGludCkodW5zaWduZWQgc2hvcnQpUlttXSkpOyIsCisgIH0sCisKKyAgeyAibiIsICJtIiwgIm5lZyA8UkVHX00+LDxSRUdfTj4iLCAiMDExMG5ubm5tbW1tMTAxMSIsCisgICAgIlJbbl0gPSAtIFJbbV07IiwKKyAgfSwKKworICB7ICJuIiwgIm0iLCAibmVnYyA8UkVHX00+LDxSRUdfTj4iLCAiMDExMG5ubm5tbW1tMTAxMCIsCisgICAgInVsdCA9IC1UOyIsCisgICAgIlNFVF9TUl9UICh1bHQgPiAwKTsiLAorICAgICJSW25dID0gdWx0IC0gUlttXTsiLAorICAgICJTRVRfU1JfVCAoVCB8fCAoUltuXSA+IHVsdCkpOyIsCisgIH0sCisKKyAgeyAiIiwgIiIsICJub3AiLCAiMDAwMDAwMDAwMDAwMTAwMSIsCisgICAgIi8qIG5vcCAqLyIsCisgIH0sCisKKyAgeyAibiIsICJtIiwgIm5vdCA8UkVHX00+LDxSRUdfTj4iLCAiMDExMG5ubm5tbW1tMDExMSIsCisgICAgIlJbbl0gPSB+UlttXTsiLAorICB9LAorCisgIHsgIjAiLCAiIiwgIm9yICM8aW1tPixSMCIsICIxMTAwMTAxMWk4KjEuLi4uIiwKKyAgICAiUjAgfD0gaTsiLAorICB9LAorICB7ICJuIiwgIm0iLCAib3IgPFJFR19NPiw8UkVHX04+IiwgIjAwMTBubm5ubW1tbTEwMTEiLAorICAgICJSW25dIHw9IFJbbV07IiwKKyAgfSwKKyAgeyAiIiwgIjAiLCAib3IuYiAjPGltbT4sQChSMCxHQlIpIiwgIjExMDAxMTExaTgqMS4uLi4iLAorICAgICJNQSAoMSk7IiwKKyAgICAiV0JBVCAoUjAgKyBHQlIsIChSQkFUIChSMCArIEdCUikgfCBpKSk7IiwKKyAgfSwKKworICB7ICIiLCAibiIsICJwcmVmIEA8UkVHX04+IiwgIjAwMDBubm5uMTAwMDAwMTEiLAorICAgICIvKiBFeGNlcHQgZm9yIHRoZSBlZmZlY3Qgb24gdGhlIGNhY2hlIC0gd2hpY2ggaXMgbm90IHNpbXVsYXRlZCAtIiwKKyAgICAiICAgdGhpcyBpcyBsaWtlIGEgbm9wLiAgKi8iLAorICB9LAorCisgIHsgIm4iLCAibiIsICJyb3RjbCA8UkVHX04+IiwgIjAxMDBubm5uMDAxMDAxMDAiLAorICAgICJ1bHQgPSBSW25dIDwgMDsiLAorICAgICJSW25dID0gKFJbbl0gPDwgMSkgfCBUOyIsCisgICAgIlNFVF9TUl9UICh1bHQpOyIsCisgIH0sCisKKyAgeyAibiIsICJuIiwgInJvdGNyIDxSRUdfTj4iLCAiMDEwMG5ubm4wMDEwMDEwMSIsCisgICAgInVsdCA9IFJbbl0gJiAxOyIsCisgICAgIlJbbl0gPSAoVVJbbl0gPj4gMSkgfCAoVCA8PCAzMSk7IiwKKyAgICAiU0VUX1NSX1QgKHVsdCk7IiwKKyAgfSwKKworICB7ICJuIiwgIm4iLCAicm90bCA8UkVHX04+IiwgIjAxMDBubm5uMDAwMDAxMDAiLAorICAgICJTRVRfU1JfVCAoUltuXSA8IDApOyIsCisgICAgIlJbbl0gPDw9IDE7IiwKKyAgICAiUltuXSB8PSBUOyIsCisgIH0sCisKKyAgeyAibiIsICJuIiwgInJvdHIgPFJFR19OPiIsICIwMTAwbm5ubjAwMDAwMTAxIiwKKyAgICAiU0VUX1NSX1QgKFJbbl0gJiAxKTsiLAorICAgICJSW25dID0gVVJbbl0gPj4gMTsiLAorICAgICJSW25dIHw9IChUIDw8IDMxKTsiLAorICB9LAorCisgIHsgIiIsICIiLCAicnRlIiwgIjAwMDAwMDAwMDAxMDEwMTEiLCAKKyNpZiAwCisgICAgLyogU0gtWzEyXSAqLworICAgICJpbnQgdG1wID0gUEM7IiwKKyAgICAibmlhID0gUkxBVCAoUlsxNV0pICsgMjsiLAorICAgICJSWzE1XSArPSA0OyIsCisgICAgIlNFVF9TUiAoUkxBVCAoUlsxNV0pICYgMHgzZjMpOyIsCisgICAgIlJbMTVdICs9IDQ7IiwKKyAgICAiRGVsYXlfU2xvdCAoUEMgKyAyKTsiLAorI2Vsc2UKKyAgICAibmlhID0gU1BDOyIsCisgICAgIlNFVF9TUiAoU1NSKTsiLAorICAgICJEZWxheV9TbG90IChQQyArIDIpOyIsCisjZW5kaWYKKyAgfSwKKworICB7ICIiLCAiIiwgInJ0cyIsICIwMDAwMDAwMDAwMDAxMDExIiwKKyAgICAibmlhID0gUFI7IiwKKyAgICAiRGVsYXlfU2xvdCAoUEMgKyAyKTsiLAorICB9LAorCisgIHsgIiIsICIiLCAic2V0cyIsICIwMDAwMDAwMDAxMDExMDAwIiwKKyAgICAiU0VUX1NSX1MgKDEpOyIsCisgIH0sCisKKyAgeyAiIiwgIiIsICJzZXR0IiwgIjAwMDAwMDAwMDAwMTEwMDAiLAorICAgICJTRVRfU1JfVCAoMSk7IiwKKyAgfSwKKworICB7ICJuIiwgIm1uIiwgInNoYWQgPFJFR19NPiw8UkVHX04+IiwgIjAxMDBubm5ubW1tbTExMDAiLAorICAgICJSW25dID0gKFJbbV0gPCAwKSA/IChSW25dID4+ICgoLVJbbV0pJjB4MWYpKSA6IChSW25dIDw8IChSW21dICYgMHgxZikpOyIsCisgIH0sCisKKyAgeyAibiIsICJuIiwgInNoYWwgPFJFR19OPiIsICIwMTAwbm5ubjAwMTAwMDAwIiwKKyAgICAiU0VUX1NSX1QgKFJbbl0gPCAwKTsiLAorICAgICJSW25dIDw8PSAxOyIsCisgIH0sCisKKyAgeyAibiIsICJuIiwgInNoYXIgPFJFR19OPiIsICIwMTAwbm5ubjAwMTAwMDAxIiwKKyAgICAiU0VUX1NSX1QgKFJbbl0gJiAxKTsiLAorICAgICJSW25dID0gUltuXSA+PiAxOyIsCisgIH0sCisKKyAgeyAibiIsICJtbiIsICJzaGxkIDxSRUdfTT4sPFJFR19OPiIsICIwMTAwbm5ubm1tbW0xMTAxIiwKKyAgICAiUltuXSA9IChSW21dIDwgMCkgPyAoVVJbbl0gPj4gKCgtUlttXSkmMHgxZikpOiAoUltuXSA8PCAoUlttXSAmIDB4MWYpKTsiLAorICB9LAorCisgIHsgIm4iLCAibiIsICJzaGxsIDxSRUdfTj4iLCAiMDEwMG5ubm4wMDAwMDAwMCIsCisgICAgIlNFVF9TUl9UIChSW25dIDwgMCk7IiwKKyAgICAiUltuXSA8PD0gMTsiLAorICB9LAorCisgIHsgIm4iLCAibiIsICJzaGxsMiA8UkVHX04+IiwgIjAxMDBubm5uMDAwMDEwMDAiLAorICAgICJSW25dIDw8PSAyOyIsCisgIH0sCisgIHsgIm4iLCAibiIsICJzaGxsOCA8UkVHX04+IiwgIjAxMDBubm5uMDAwMTEwMDAiLAorICAgICJSW25dIDw8PSA4OyIsCisgIH0sCisgIHsgIm4iLCAibiIsICJzaGxsMTYgPFJFR19OPiIsICIwMTAwbm5ubjAwMTAxMDAwIiwKKyAgICAiUltuXSA8PD0gMTY7IiwKKyAgfSwKKworICB7ICJuIiwgIm4iLCAic2hsciA8UkVHX04+IiwgIjAxMDBubm5uMDAwMDAwMDEiLAorICAgICJTRVRfU1JfVCAoUltuXSAmIDEpOyIsCisgICAgIlJbbl0gPSBVUltuXSA+PiAxOyIsCisgIH0sCisKKyAgeyAibiIsICJuIiwgInNobHIyIDxSRUdfTj4iLCAiMDEwMG5ubm4wMDAwMTAwMSIsCisgICAgIlJbbl0gPSBVUltuXSA+PiAyOyIsCisgIH0sCisgIHsgIm4iLCAibiIsICJzaGxyOCA8UkVHX04+IiwgIjAxMDBubm5uMDAwMTEwMDEiLAorICAgICJSW25dID0gVVJbbl0gPj4gODsiLAorICB9LAorICB7ICJuIiwgIm4iLCAic2hscjE2IDxSRUdfTj4iLCAiMDEwMG5ubm4wMDEwMTAwMSIsCisgICAgIlJbbl0gPSBVUltuXSA+PiAxNjsiLAorICB9LAorCisgIHsgIiIsICIiLCAic2xlZXAiLCAiMDAwMDAwMDAwMDAxMTAxMSIsCisgICAgInRyYXAgKDB4YzMsIFIwLCBtZW1vcnksIG1hc2tsLCBtYXNrdywgbGl0dGxlX2VuZGlhbik7IiwKKyAgICAibmlhID0gUEM7IiwKKyAgfSwKKworICB7ICJuIiwgIiIsICJzdGMgR0JSLDxSRUdfTj4iLCAiMDAwMG5ubm4wMDAxMDAxMCIsCisgICAgIlJbbl0gPSBHQlI7IiwKKyAgfSwKKyAgeyAibiIsICIiLCAic3RjIFNSLDxSRUdfTj4iLCAgIjAwMDBubm5uMDAwMDAwMTAiLAorICAgICJSW25dID0gR0VUX1NSICgpOyIsCisgIH0sCisgIHsgIm4iLCAiIiwgInN0YyBWQlIsPFJFR19OPiIsICIwMDAwbm5ubjAwMTAwMDEwIiwKKyAgICAiUltuXSA9IFZCUjsiLAorICB9LAorICB7ICJuIiwgIiIsICJzdGMgU1NSLDxSRUdfTj4iLCAiMDAwMG5ubm4wMDExMDAxMCIsCisgICAgIlJbbl0gPSBTU1I7IiwKKyAgfSwKKyAgeyAibiIsICIiLCAic3RjIFNQQyw8UkVHX04+IiwgIjAwMDBubm5uMDEwMDAwMTAiLAorICAgICJSW25dID0gU1BDOyIsCisgIH0sCisgIHsgIm4iLCAiIiwgInN0YyBSMF9CQU5LLDxSRUdfTj4iLCAiMDAwMG5ubm4xMDAwMDAxMCIsCisgICAgIlJbbl0gPSBSbl9CQU5LICgwKTsiLAorICB9LAorICB7ICJuIiwgIiIsICJzdGMgUjFfQkFOSyw8UkVHX04+IiwgIjAwMDBubm5uMTAwMTAwMTAiLAorICAgICJSW25dID0gUm5fQkFOSyAoMSk7IiwKKyAgfSwKKyAgeyAibiIsICIiLCAic3RjIFIyX0JBTkssPFJFR19OPiIsICIwMDAwbm5ubjEwMTAwMDEwIiwKKyAgICAiUltuXSA9IFJuX0JBTksgKDIpOyIsCisgIH0sCisgIHsgIm4iLCAiIiwgInN0YyBSM19CQU5LLDxSRUdfTj4iLCAiMDAwMG5ubm4xMDExMDAxMCIsCisgICAgIlJbbl0gPSBSbl9CQU5LICgzKTsiLAorICB9LAorICB7ICJuIiwgIiIsICJzdGMgUjRfQkFOSyw8UkVHX04+IiwgIjAwMDBubm5uMTEwMDAwMTAiLAorICAgICJSW25dID0gUm5fQkFOSyAoNCk7IiwKKyAgfSwKKyAgeyAibiIsICIiLCAic3RjIFI1X0JBTkssPFJFR19OPiIsICIwMDAwbm5ubjExMDEwMDEwIiwKKyAgICAiUltuXSA9IFJuX0JBTksgKDUpOyIsCisgIH0sCisgIHsgIm4iLCAiIiwgInN0YyBSNl9CQU5LLDxSRUdfTj4iLCAiMDAwMG5ubm4xMTEwMDAxMCIsCisgICAgIlJbbl0gPSBSbl9CQU5LICg2KTsiLAorICB9LAorICB7ICJuIiwgIiIsICJzdGMgUjdfQkFOSyw8UkVHX04+IiwgIjAwMDBubm5uMTExMTAwMTAiLAorICAgICJSW25dID0gUm5fQkFOSyAoNyk7IiwKKyAgfSwKKyAgeyAibiIsICJuIiwgInN0Yy5sIEdCUixALTxSRUdfTj4iLCAiMDEwMG5ubm4wMDAxMDAxMSIsCisgICAgIk1BICgxKTsiLAorICAgICJSW25dIC09IDQ7IiwKKyAgICAiV0xBVCAoUltuXSwgR0JSKTs7IiwKKyAgfSwKKyAgeyAibiIsICJuIiwgInN0Yy5sIFNSLEAtPFJFR19OPiIsICAiMDEwMG5ubm4wMDAwMDAxMSIsCisgICAgIk1BICgxKTsiLAorICAgICJSW25dIC09IDQ7IiwKKyAgICAiV0xBVCAoUltuXSwgR0VUX1NSKCkpOyIsCisgIH0sCisgIHsgIm4iLCAibiIsICJzdGMubCBWQlIsQC08UkVHX04+IiwgIjAxMDBubm5uMDAxMDAwMTEiLAorICAgICJNQSAoMSk7IiwKKyAgICAiUltuXSAtPSA0OyIsCisgICAgIldMQVQgKFJbbl0sIFZCUik7IiwKKyAgfSwKKyAgeyAibiIsICJuIiwgInN0Yy5sIFNTUixALTxSRUdfTj4iLCAiMDEwMG5ubm4wMDExMDAxMSIsCisgICAgIk1BICgxKTsiLAorICAgICJSW25dIC09IDQ7IiwKKyAgICAiV0xBVCAoUltuXSwgU1NSKTsiLAorICB9LAorICB7ICJuIiwgIm4iLCAic3RjLmwgU1BDLEAtPFJFR19OPiIsICIwMTAwbm5ubjAxMDAwMDExIiwKKyAgICAiTUEgKDEpOyIsCisgICAgIlJbbl0gLT0gNDsiLAorICAgICJXTEFUIChSW25dLCBTUEMpOyIsCisgIH0sCisgIHsgIm4iLCAiIiwgInN0YyBSMF9CQU5LLEAtPFJFR19OPiIsICIwMTAwbm5ubjEwMDAwMDEwIiwKKyAgICAiTUEgKDEpOyIsCisgICAgIlJbbl0gLT0gNDsiLAorICAgICJXTEFUIChSW25dLCBSbl9CQU5LICgwKSk7IiwKKyAgfSwKKyAgeyAibiIsICIiLCAic3RjIFIxX0JBTkssQC08UkVHX04+IiwgIjAxMDBubm5uMTAwMTAwMTAiLAorICAgICJNQSAoMSk7IiwKKyAgICAiUltuXSAtPSA0OyIsCisgICAgIldMQVQgKFJbbl0sIFJuX0JBTksgKDEpKTsiLAorICB9LAorICB7ICJuIiwgIiIsICJzdGMgUjJfQkFOSyxALTxSRUdfTj4iLCAiMDEwMG5ubm4xMDEwMDAxMCIsCisgICAgIk1BICgxKTsiLAorICAgICJSW25dIC09IDQ7IiwKKyAgICAiV0xBVCAoUltuXSwgUm5fQkFOSyAoMikpOyIsCisgIH0sCisgIHsgIm4iLCAiIiwgInN0YyBSM19CQU5LLEAtPFJFR19OPiIsICIwMTAwbm5ubjEwMTEwMDEwIiwKKyAgICAiTUEgKDEpOyIsCisgICAgIlJbbl0gLT0gNDsiLAorICAgICJXTEFUIChSW25dLCBSbl9CQU5LICgzKSk7IiwKKyAgfSwKKyAgeyAibiIsICIiLCAic3RjIFI0X0JBTkssQC08UkVHX04+IiwgIjAxMDBubm5uMTEwMDAwMTAiLAorICAgICJNQSAoMSk7IiwKKyAgICAiUltuXSAtPSA0OyIsCisgICAgIldMQVQgKFJbbl0sIFJuX0JBTksgKDQpKTsiLAorICB9LAorICB7ICJuIiwgIiIsICJzdGMgUjVfQkFOSyxALTxSRUdfTj4iLCAiMDEwMG5ubm4xMTAxMDAxMCIsCisgICAgIk1BICgxKTsiLAorICAgICJSW25dIC09IDQ7IiwKKyAgICAiV0xBVCAoUltuXSwgUm5fQkFOSyAoNSkpOyIsCisgIH0sCisgIHsgIm4iLCAiIiwgInN0YyBSNl9CQU5LLEAtPFJFR19OPiIsICIwMTAwbm5ubjExMTAwMDEwIiwKKyAgICAiTUEgKDEpOyIsCisgICAgIlJbbl0gLT0gNDsiLAorICAgICJXTEFUIChSW25dLCBSbl9CQU5LICg2KSk7IiwKKyAgfSwKKyAgeyAibiIsICIiLCAic3RjIFI3X0JBTkssQC08UkVHX04+IiwgIjAxMDBubm5uMTExMTAwMTAiLAorICAgICJNQSAoMSk7IiwKKyAgICAiUltuXSAtPSA0OyIsCisgICAgIldMQVQgKFJbbl0sIFJuX0JBTksgKDcpKTsiLAorICB9LAorCisgIC8qIHNoM2UgKi8KKyAgeyAiIiwgIiIsICJzdHMgRlBVTCw8UkVHX04+IiwgIjAwMDBubm5uMDEwMTEwMTAiLAorICAgICJSW25dID0gRlBVTDsiLAorICB9LAorICAvKiBzaDNlICovCisgIHsgIiIsICIiLCAic3RzLmwgRlBVTCxALTxSRUdfTj4iLCAiMDEwMG5ubm4wMTAxMDAxMCIsCisgICAgIk1BICgxKTsiLAorICAgICJSW25dIC09IDQ7IiwKKyAgICAiV0xBVCAoUltuXSwgRlBVTCk7IiwKKyAgfSwKKyAgLyogc2gzZSAqLworICB7ICIiLCAiIiwgInN0cyBGUFNDUiw8UkVHX04+IiwgIjAwMDBubm5uMDExMDEwMTAiLAorICAgICJSW25dID0gR0VUX0ZQU0NSICgpOyIsCisgIH0sCisgIC8qIHNoM2UgKi8KKyAgeyAiIiwgIiIsICJzdHMubCBGUFNDUixALTxSRUdfTj4iLCAiMDEwMG5ubm4wMTEwMDAxMCIsCisgICAgIk1BICgxKTsiLAorICAgICJSW25dIC09IDQ7IiwKKyAgICAiV0xBVCAoUltuXSwgR0VUX0ZQU0NSICgpKTsiLAorICB9LAorCisgIHsgIm4iLCAiIiwgInN0cyBNQUNILDxSRUdfTj4iLCAiMDAwMG5ubm4wMDAwMTAxMCIsCisgICAgIlJbbl0gPSBNQUNIOyIsCisgIH0sCisgIHsgIm4iLCAiIiwgInN0cyBNQUNMLDxSRUdfTj4iLCAiMDAwMG5ubm4wMDAxMTAxMCIsCisgICAgIlJbbl0gPSBNQUNMOyIsCisgIH0sCisgIHsgIm4iLCAiIiwgInN0cyBQUiw8UkVHX04+IiwgIjAwMDBubm5uMDAxMDEwMTAiLAorICAgICJSW25dID0gUFI7IiwKKyAgfSwKKyAgeyAibiIsICJuIiwgInN0cy5sIE1BQ0gsQC08UkVHX04+IiwgIjAxMDBubm5uMDAwMDAwMTAiLAorICAgICJNQSAoMSk7IiwKKyAgICAiUltuXSAtPSA0OyIsCisgICAgIldMQVQgKFJbbl0sIE1BQ0gpOyIsCisgIH0sCisgIHsgIm4iLCAibiIsICJzdHMubCBNQUNMLEAtPFJFR19OPiIsICIwMTAwbm5ubjAwMDEwMDEwIiwKKyAgICAiTUEgKDEpOyIsCisgICAgIlJbbl0gLT0gNDsiLAorICAgICJXTEFUIChSW25dLCBNQUNMKTsiLAorICB9LAorICB7ICJuIiwgIm4iLCAic3RzLmwgUFIsQC08UkVHX04+IiwgIjAxMDBubm5uMDAxMDAwMTAiLAorICAgICJNQSAoMSk7IiwKKyAgICAiUltuXSAtPSA0OyIsCisgICAgIldMQVQgKFJbbl0sIFBSKTsiLAorICB9LAorCisgIHsgIm4iLCAibm0iLCAic3ViIDxSRUdfTT4sPFJFR19OPiIsICIwMDExbm5ubm1tbW0xMDAwIiwKKyAgICAiUltuXSAtPSBSW21dOyIsCisgIH0sCisKKyAgeyAibiIsICJubSIsICJzdWJjIDxSRUdfTT4sPFJFR19OPiIsICIwMDExbm5ubm1tbW0xMDEwIiwKKyAgICAidWx0ID0gUltuXSAtIFQ7IiwKKyAgICAiU0VUX1NSX1QgKHVsdCA+IFJbbl0pOyIsCisgICAgIlJbbl0gPSB1bHQgLSBSW21dOyIsCisgICAgIlNFVF9TUl9UIChUIHx8IChSW25dID4gdWx0KSk7IiwKKyAgfSwKKworICB7ICJuIiwgIm5tIiwgInN1YnYgPFJFR19NPiw8UkVHX04+IiwgIjAwMTFubm5ubW1tbTEwMTEiLAorICAgICJ1bHQgPSBSW25dIC0gUlttXTsiLAorICAgICJTRVRfU1JfVCAoKChSW25dIF4gUlttXSkgJiAodWx0IF4gUltuXSkpID4+IDMxKTsiLAorICAgICJSW25dID0gdWx0OyIsCisgIH0sCisKKyAgeyAibiIsICJubSIsICJzd2FwLmIgPFJFR19NPiw8UkVHX04+IiwgIjAxMTBubm5ubW1tbTEwMDAiLAorICAgICJSW25dID0gKChSW21dICYgMHhmZmZmMDAwMCkiLAorICAgICIgICAgICAgIHwgKChSW21dIDw8IDgpICYgMHhmZjAwKSIsCisgICAgIiAgICAgICAgfCAoKFJbbV0gPj4gOCkgJiAweDAwZmYpKTsiLAorICB9LAorICB7ICJuIiwgIm5tIiwgInN3YXAudyA8UkVHX00+LDxSRUdfTj4iLCAiMDExMG5ubm5tbW1tMTAwMSIsCisgICAgIlJbbl0gPSAoKChSW21dIDw8IDE2KSAmIDB4ZmZmZjAwMDApIiwKKyAgICAiICAgICAgICB8ICgoUlttXSA+PiAxNikgJiAweDAwZmZmZikpOyIsCisgIH0sCisKKyAgeyAiIiwgIm4iLCAidGFzLmIgQDxSRUdfTj4iLCAiMDEwMG5ubm4wMDAxMTAxMSIsCisgICAgIk1BICgxKTsiLAorICAgICJ1bHQgPSBSQkFUKFJbbl0pOyIsCisgICAgIlNFVF9TUl9UICh1bHQgPT0gMCk7IiwKKyAgICAiV0JBVChSW25dLHVsdHwweDgwKTsiLAorICB9LAorCisgIHsgIjAiLCAiIiwgInRyYXBhICM8aW1tPiIsICIxMTAwMDAxMWk4KjEuLi4uIiwgCisjaWYgMAorICAgIC8qIFNILVsxMl0gKi8KKyAgICAibG9uZyBpbW0gPSAweGZmICYgaTsiLAorICAgICJpZiAoaT09MHhjMykiLAorICAgICIgIFBDLT0yOyIsCisgICAgImlmIChpPDIwfHxpPT0zNHx8aT09MHhjMykiLAorICAgICIgIHRyYXAoaSxSLG1lbW9yeSxtYXNrbCxtYXNrdyxsaXR0bGVfZW5kaWFuKTsiLAorICAgICJlbHNlIHsiLAorICAgICIgIFJbMTVdLT00OyIsCisgICAgIiAgV0xBVChSWzE1XSxHRVRfU1IoKSk7IiwKKyAgICAiICBSWzE1XS09NDsiLAorICAgICIgIFdMQVQoUlsxNV0sUEMrMik7IiwKKyAgICAiICBQQz1STEFUKFZCUisoaW1tPDwyKSktMjsiLAorICAgICJ9IiwKKyNlbHNlCisgICAgImlmIChpID09IDB4YzMpIiwKKyAgICAiICB7IiwKKyAgICAiICAgIG5pYSA9IFBDOyIsCisgICAgIiAgICB0cmFwIChpLCBSLCBtZW1vcnksIG1hc2tsLCBtYXNrdywgbGl0dGxlX2VuZGlhbik7IiwKKyAgICAiICB9IiwKKyAgICAiZWxzZSBpZiAoaSA8IDIwIHx8IGk9PTM0IHx8IGk9PTB4YzMpIiwKKyAgICAiICB0cmFwIChpLCBSLCBtZW1vcnksIG1hc2tsLCBtYXNrdywgbGl0dGxlX2VuZGlhbik7IiwKKyAgICAiZWxzZSBpZiAoIVNSX0JMKSB7IiwKKyAgICAiICAvKiBGSVhNRTogVFJBID0gKGltbSA8PCAyKTsgKi8iLAorICAgICIgIFNTUiA9IEdFVF9TUigpOyIsCisgICAgIiAgU1BDID0gUEMgKyAyOyIsCisgICAgIiAgU0VUX1NSIChHRVRfU1IoKSB8IFNSX01BU0tfTUQgfCBTUl9NQVNLX0JMIHwgU1JfTUFTS19SQik7IiwKKyAgICAiICAvKiBGSVhNRTogRVhQRVZUID0gMHgwMDAwMDE2MDsgKi8iLAorICAgICIgIG5pYSA9IFZCUiArIDB4MDAwMDAxMDA7IiwKKyAgICAifSIsCisjZW5kaWYKKyAgfSwKKworICB7ICIiLCAibW4iLCAidHN0IDxSRUdfTT4sPFJFR19OPiIsICIwMDEwbm5ubm1tbW0xMDAwIiwKKyAgICAiU0VUX1NSX1QgKChSW25dICYgUlttXSkgPT0gMCk7IiwKKyAgfSwKKyAgeyAiIiwgIjAiLCAidHN0ICM8aW1tPixSMCIsICIxMTAwMTAwMGk4KjEuLi4uIiwKKyAgICAiU0VUX1NSX1QgKChSMCAmIGkpID09IDApOyIsCisgIH0sCisgIHsgIiIsICIwIiwgInRzdC5iICM8aW1tPixAKFIwLEdCUikiLCAiMTEwMDExMDBpOCoxLi4uLiIsCisgICAgIk1BICgxKTsiLAorICAgICJTRVRfU1JfVCAoKFJCQVQgKEdCUitSMCkgJiBpKSA9PSAwKTsiLAorICB9LAorCisgIHsgIiIsICIwIiwgInhvciAjPGltbT4sUjAiLCAiMTEwMDEwMTBpOCoxLi4uLiIsCisgICAgIlIwIF49IGk7IiwKKyAgfSwKKyAgeyAibiIsICJtbiIsICJ4b3IgPFJFR19NPiw8UkVHX04+IiwgIjAwMTBubm5ubW1tbTEwMTAiLAorICAgICJSW25dIF49IFJbbV07IiwKKyAgfSwKKyAgeyAiIiwgIjAiLCAieG9yLmIgIzxpbW0+LEAoUjAsR0JSKSIsICIxMTAwMTExMGk4KjEuLi4uIiwKKyAgICAiTUEgKDEpOyIsCisgICAgInVsdCA9IFJCQVQgKEdCUitSMCk7IiwKKyAgICAidWx0IF49IGk7IiwKKyAgICAiV0JBVCAoR0JSICsgUjAsIHVsdCk7IiwKKyAgfSwKKworICB7ICJuIiwgIm5tIiwgInh0cmN0IDxSRUdfTT4sPFJFR19OPiIsICIwMDEwbm5ubm1tbW0xMTAxIiwKKyAgICAiUltuXSA9ICgoKFJbbl0gPj4gMTYpICYgMHhmZmZmKSIsCisgICAgIiAgICAgICAgfCAoKFJbbV0gPDwgMTYpICYgMHhmZmZmMDAwMCkpOyIsCisgIH0sCisKKyAgezAsIDB9fTsKKworLyogVGFibGVzIG9mIHRoaW5ncyB0byBwdXQgaW50byBlbnVtcyBmb3Igc2gtb3BjLmggKi8KK3N0YXRpYyBjaGFyICpuaWJibGVfdHlwZV9saXN0W10gPQoreworICAiSEVYXzAiLAorICAiSEVYXzEiLAorICAiSEVYXzIiLAorICAiSEVYXzMiLAorICAiSEVYXzQiLAorICAiSEVYXzUiLAorICAiSEVYXzYiLAorICAiSEVYXzciLAorICAiSEVYXzgiLAorICAiSEVYXzkiLAorICAiSEVYX0EiLAorICAiSEVYX0IiLAorICAiSEVYX0MiLAorICAiSEVYX0QiLAorICAiSEVYX0UiLAorICAiSEVYX0YiLAorICAiUkVHX04iLAorICAiUkVHX00iLAorICAiQlJBTkNIXzEyIiwKKyAgIkJSQU5DSF84IiwKKyAgIkRJU1BfOCIsCisgICJESVNQXzQiLAorICAiSU1NXzQiLAorICAiSU1NXzRCWTIiLAorICAiSU1NXzRCWTQiLAorICAiUENSRUxJTU1fOEJZMiIsCisgICJQQ1JFTElNTV84Qlk0IiwKKyAgIklNTV84IiwKKyAgIklNTV84QlkyIiwKKyAgIklNTV84Qlk0IiwKKyAgMAorfTsKK3N0YXRpYworY2hhciAqYXJnX3R5cGVfbGlzdFtdID0KK3sKKyAgIkFfRU5EIiwKKyAgIkFfQkRJU1AxMiIsCisgICJBX0JESVNQOCIsCisgICJBX0RFQ19NIiwKKyAgIkFfREVDX04iLAorICAiQV9ESVNQX0dCUiIsCisgICJBX0RJU1BfUEMiLAorICAiQV9ESVNQX1JFR19NIiwKKyAgIkFfRElTUF9SRUdfTiIsCisgICJBX0dCUiIsCisgICJBX0lNTSIsCisgICJBX0lOQ19NIiwKKyAgIkFfSU5DX04iLAorICAiQV9JTkRfTSIsCisgICJBX0lORF9OIiwKKyAgIkFfSU5EX1IwX1JFR19NIiwKKyAgIkFfSU5EX1IwX1JFR19OIiwKKyAgIkFfTUFDSCIsCisgICJBX01BQ0wiLAorICAiQV9QUiIsCisgICJBX1IwIiwKKyAgIkFfUjBfR0JSIiwKKyAgIkFfUkVHX00iLAorICAiQV9SRUdfTiIsCisgICJBX1NSIiwKKyAgIkFfVkJSIiwKKyAgIkFfU1NSIiwKKyAgIkFfU1BDIiwKKyAgMCwKK307CisKK3N0YXRpYyB2b2lkCittYWtlX2VudW1fbGlzdCAobmFtZSwgcykKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgY2hhciAqKnM7Cit7CisgIGludCBpID0gMTsKKyAgcHJpbnRmICgidHlwZWRlZiBlbnVtIHtcbiIpOworICB3aGlsZSAoKnMpCisgICAgeworICAgICAgcHJpbnRmICgiXHQlcyxcbiIsICpzKTsKKyAgICAgIHMrKzsKKyAgICAgIGkrKzsKKyAgICB9CisgIHByaW50ZiAoIn0gJXM7XG4iLCBuYW1lKTsKK30KKworc3RhdGljIGludAorcWZ1bmMgKGEsIGIpCisgICAgIG9wICphOworICAgICBvcCAqYjsKK3sKKyAgY2hhciBidWZhWzldOworICBjaGFyIGJ1ZmJbOV07CisgIG1lbWNweSAoYnVmYSwgYS0+Y29kZSwgNCk7CisgIG1lbWNweSAoYnVmYSArIDQsIGEtPmNvZGUgKyAxMiwgNCk7CisgIGJ1ZmFbOF0gPSAwOworCisgIG1lbWNweSAoYnVmYiwgYi0+Y29kZSwgNCk7CisgIG1lbWNweSAoYnVmYiArIDQsIGItPmNvZGUgKyAxMiwgNCk7CisgIGJ1ZmJbOF0gPSAwOworICByZXR1cm4gKHN0cmNtcCAoYnVmYSwgYnVmYikpOworfQorCitzdGF0aWMgdm9pZAorc29ydHRhYiAoKQoreworICBvcCAqcCA9IHRhYjsKKyAgaW50IGxlbiA9IDA7CisKKyAgd2hpbGUgKHAtPm5hbWUpCisgICAgeworICAgICAgcCsrOworICAgICAgbGVuKys7CisgICAgfQorICBxc29ydCAodGFiLCBsZW4sIHNpemVvZiAoKnApLCBxZnVuYyk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludG9ubWF0Y2ggKHB0ciwgYSwgcmVwKQorICAgICBjaGFyICoqcHRyOworICAgICBjaGFyICphOworICAgICBjaGFyICpyZXA7Cit7CisgIGludCBsID0gc3RybGVuIChhKTsKKyAgaWYgKHN0cm5jbXAgKCpwdHIsIGEsIGwpID09IDApCisgICAgeworICAgICAgcHJpbnRmICgiJXMiLCByZXApOworICAgICAgKnB0ciArPSBsOworICAgICAgaWYgKCoqcHRyKQorCXByaW50ZiAoIiwiKTsKKyAgICB9Cit9CisKKworc3RhdGljIAordm9pZAordGhpbmsgKG8pCisgICAgIG9wICpvOworeworICBjaGFyICpuOworICBjaGFyICpwOworCisgIHByaW50ZiAoIntcIiIpOworICBuID0gby0+bmFtZTsKKyAgd2hpbGUgKCpuICYmICpuICE9ICcgJykKKyAgICB7CisgICAgICBwcmludGYgKCIlYyIsICpuKTsKKyAgICAgIG4rKzsKKyAgICB9CisgIHByaW50ZiAoIlwiLHsiKTsKKworICBwID0gbjsKKworICBpZiAoISpwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIjAiKTsKKyAgICB9CisgIHdoaWxlICgqcCkKKyAgICB7CisgICAgICB3aGlsZSAoKnAgPT0gJywnIHx8ICpwID09ICcgJykKKwlwKys7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiIzxpbW0+IiwgIkFfSU1NIik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiUjAiLCAiQV9SMCIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIjxSRUdfTj4iLCAiQV9SRUdfTiIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIkA8UkVHX04+KyIsICJBX0lOQ19OIik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiQDxSRUdfTj4iLCAiQV9JTkRfTiIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIkAtPFJFR19OPiIsICJBX0RFQ19OIik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiPFJFR19NPiIsICIgQV9SRUdfTSIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIkA8UkVHX00+KyIsICJBX0lOQ19NIik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiQDxSRUdfTT4iLCAiQV9JTkRfTSIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIkAtPFJFR19NPiIsICJBX0RFQ19NIik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiQCg8ZGlzcD4sUEMpIiwgIkFfRElTUF9QQyIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIkAoPGRpc3A+LDxSRUdfTT4pIiwgIkFfRElTUF9SRUdfTSIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIkAoPGRpc3A+LDxSRUdfTj4pIiwgIkFfRElTUF9SRUdfTiIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIkAoUjAsPFJFR19OPikiLCAiQV9JTkRfUjBfUkVHX04iKTsKKyAgICAgIHByaW50b25tYXRjaCAoJnAsICJAKFIwLDxSRUdfTT4pIiwgIkFfSU5EX1IwX1JFR19NIik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiQCg8ZGlzcD4sR0JSKSIsICJBX0RJU1BfR0JSIik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiQChSMCxHQlIpIiwgIkFfUjBfR0JSIik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiPGJkaXNwOD4iLCAiQV9CRElTUDgiKTsKKyAgICAgIHByaW50b25tYXRjaCAoJnAsICI8YmRpc3AxMj4iLCAiQV9CRElTUDEyIik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiU1IiLCAiQV9TUiIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIkdCUiIsICJBX0dCUiIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIlZCUiIsICJBX1ZCUiIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIlNTUiIsICJBX1NTUiIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIlNQQyIsICJBX1NQQyIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIk1BQ0giLCAiQV9NQUNIIik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiTUFDTCIsICJBX01BQ0wiKTsKKyAgICAgIHByaW50b25tYXRjaCAoJnAsICJQUiIsICJBX1BSIik7CisKKyAgICB9CisgIHByaW50ZiAoIn0seyIpOworCisgIHAgPSBvLT5jb2RlOworICB3aGlsZSAoKnApCisgICAgeworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIjAwMDAiLCAiSEVYXzAiKTsKKyAgICAgIHByaW50b25tYXRjaCAoJnAsICIwMDAxIiwgIkhFWF8xIik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiMDAxMCIsICJIRVhfMiIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIjAwMTEiLCAiSEVYXzMiKTsKKyAgICAgIHByaW50b25tYXRjaCAoJnAsICIwMTAwIiwgIkhFWF80Iik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiMDEwMSIsICJIRVhfNSIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIjAxMTAiLCAiSEVYXzYiKTsKKyAgICAgIHByaW50b25tYXRjaCAoJnAsICIwMTExIiwgIkhFWF83Iik7CisKKyAgICAgIHByaW50b25tYXRjaCAoJnAsICIxMDAwIiwgIkhFWF84Iik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiMTAwMSIsICJIRVhfOSIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIjEwMTAiLCAiSEVYX0EiKTsKKyAgICAgIHByaW50b25tYXRjaCAoJnAsICIxMDExIiwgIkhFWF9CIik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiMTEwMCIsICJIRVhfQyIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIjExMDEiLCAiSEVYX0QiKTsKKyAgICAgIHByaW50b25tYXRjaCAoJnAsICIxMTEwIiwgIkhFWF9FIik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiMTExMSIsICJIRVhfRiIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgImk4KjEuLi4uIiwgIklNTV84Iik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiaTQqMSIsICJJTU1fNCIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgImk4cDQuLi4uIiwgIlBDUkVMSU1NXzhCWTQiKTsKKyAgICAgIHByaW50b25tYXRjaCAoJnAsICJpOHAyLi4uLiIsICJQQ1JFTElNTV84QlkyIik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiaTgqMi4uLi4iLCAiSU1NXzhCWTIiKTsKKyAgICAgIHByaW50b25tYXRjaCAoJnAsICJpNCoyIiwgIklNTV80QlkyIik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiaTgqNC4uLi4iLCAiSU1NXzhCWTQiKTsKKyAgICAgIHByaW50b25tYXRjaCAoJnAsICJpNCo0IiwgIklNTV80Qlk0Iik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAiaTEyLi4uLi4uLi4uIiwgIkJSQU5DSF8xMiIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgImk4cDEuLi4uIiwgIkJSQU5DSF84Iik7CisgICAgICBwcmludG9ubWF0Y2ggKCZwLCAibm5ubiIsICJSRUdfTiIpOworICAgICAgcHJpbnRvbm1hdGNoICgmcCwgIm1tbW0iLCAiUkVHX00iKTsKKworICAgIH0KKyAgcHJpbnRmICgifX0sXG4iKTsKK30KKworc3RhdGljIHZvaWQKK2dlbmdhc3RhYiAoKQoreworICBvcCAqcDsKKyAgc29ydHRhYiAoKTsKKyAgZm9yIChwID0gdGFiOyBwLT5uYW1lOyBwKyspCisgICAgeworICAgICAgcHJpbnRmICgiJXMgJS0zMHNcbiIsIHAtPmNvZGUsIHAtPm5hbWUpOworICAgIH0KKworCit9CisKKworc3RhdGljIHZvaWQKK2dlbm9wYyAoKQoreworICBvcCAqcDsKKyAgbWFrZV9lbnVtX2xpc3QgKCJzaF9uaWJibGVfdHlwZSIsIG5pYmJsZV90eXBlX2xpc3QpOworICBtYWtlX2VudW1fbGlzdCAoInNoX2FyZ190eXBlIiwgYXJnX3R5cGVfbGlzdCk7CisKKyAgcHJpbnRmICgidHlwZWRlZiBzdHJ1Y3Qge1xuIik7CisgIHByaW50ZiAoImNoYXIgKm5hbWU7XG4iKTsKKyAgcHJpbnRmICgic2hfYXJnX3R5cGUgYXJnWzNdO1xuIik7CisgIHByaW50ZiAoInNoX25pYmJsZV90eXBlIG5pYmJsZXNbNF07XG4iKTsKKyAgcHJpbnRmICgifSBzaF9vcGNvZGVfaW5mbztcbiIpOworICBwcmludGYgKCIjaWZkZWYgREVGSU5FX1RBQkxFXG4iKTsKKyAgcHJpbnRmICgic2hfb3Bjb2RlX2luZm8gc2hfdGFibGVbXT17XG4iKTsKKyAgZm9yIChwID0gdGFiOyBwLT5uYW1lOyBwKyspCisgICAgeworICAgICAgcHJpbnRmICgiXG4vKiAlcyAlLTIwcyovIiwgcC0+Y29kZSwgcC0+bmFtZSk7CisgICAgICB0aGluayAocCk7CisgICAgfQorICBwcmludGYgKCIwfTtcbiIpOworICBwcmludGYgKCIjZW5kaWZcbiIpOworfQorCisKKworCisKKworLyogQ29udmVydCBhIHN0cmluZyBvZiA0IGJpbmFyeSBkaWdpdHMgaW50byBhbiBpbnQgKi8KKworc3RhdGljCitpbnQKK2J0b24gKHMpCisgICAgIGNoYXIgKnM7CisKK3sKKyAgaW50IG4gPSAwOworICBpbnQgdiA9IDg7CisgIHdoaWxlICh2KQorICAgIHsKKyAgICAgIGlmICgqcyA9PSAnMScpCisJbiB8PSB2OworICAgICAgdiA+Pj0gMTsKKyAgICAgIHMrKzsKKyAgICB9CisgIHJldHVybiBuOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciB0YWJsZVsxIDw8IDE2XTsKKworLyogVGFrZSBhbiBvcGNvZGUgZXhwYW5kIGFsbCB2YXJ5aW5nIGZpZWxkcyBpbiBpdCBvdXQgYW5kIGZpbGwgYWxsIHRoZQorICByaWdodCBlbnRyaWVzIGluICd0YWJsZScgd2l0aCB0aGUgb3Bjb2RlIGluZGV4Ki8KKworc3RhdGljIHZvaWQKK2V4cGFuZF9vcGNvZGUgKHNoaWZ0LCB2YWwsIGksIHMpCisgICAgIGludCBzaGlmdDsKKyAgICAgaW50IHZhbDsKKyAgICAgaW50IGk7CisgICAgIGNoYXIgKnM7Cit7CisgIGludCBqOworCisgIGlmICgqcyA9PSAwKQorICAgIHsKKyAgICAgIHRhYmxlW3ZhbF0gPSBpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN3aXRjaCAoc1swXSkKKwl7CisKKwljYXNlICcwJzoKKwljYXNlICcxJzoKKwkgIHsKKworCSAgICBpbnQgbiA9IGJ0b24gKHMpOworCSAgICBpZiAobiA+PSAwKQorCSAgICAgIHsKKwkJZXhwYW5kX29wY29kZSAoc2hpZnQgLSA0LCB2YWwgfCAobiA8PCBzaGlmdCksIGksIHMgKyA0KTsKKwkgICAgICB9CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgJ24nOgorCWNhc2UgJ20nOgorCSAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisJICAgIHsKKwkgICAgICBleHBhbmRfb3Bjb2RlIChzaGlmdCAtIDQsIHZhbCB8IChqIDw8IHNoaWZ0KSwgaSwgcyArIDQpOworCisJICAgIH0KKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIGZvciAoaiA9IDA7IGogPCAoMSA8PCAoc2hpZnQgKyA0KSk7IGorKykKKwkgICAgeworCSAgICAgIHRhYmxlW3ZhbCB8IGpdID0gaTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qIFByaW50IHRoZSBqdW1wIHRhYmxlIHVzZWQgdG8gaW5kZXggYW4gb3Bjb2RlIGludG8gYSBzd2l0Y2gKKyAgIHN0YXRlbWVudCBlbnRyeS4gKi8KKworc3RhdGljIHZvaWQKK2R1bXB0YWJsZSAoKQoreworICBpbnQgbHVtcCA9IDI1NjsKKyAgaW50IG9ubGluZSA9IDE2OworCisgIGludCBpID0gMDsKKworICB3aGlsZSAoaSA8IDEgPDwgMTYpCisgICAgeworICAgICAgaW50IGogPSAwOworCisgICAgICBwcmludGYgKCJ1bnNpZ25lZCBjaGFyIHNoX2p1bXBfdGFibGUleFslZF09e1xuIiwgaSwgbHVtcCk7CisKKyAgICAgIHdoaWxlIChqIDwgbHVtcCkKKwl7CisJICBpbnQgayA9IDA7CisJICB3aGlsZSAoayA8IG9ubGluZSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIiUyZCIsIHRhYmxlW2kgKyBqICsga10pOworCSAgICAgIGlmIChqICsgayA8IGx1bXApCisJCXByaW50ZiAoIiwiKTsKKworCSAgICAgIGsrKzsKKwkgICAgfQorCSAgaiArPSBrOworCSAgcHJpbnRmICgiXG4iKTsKKwl9CisgICAgICBpICs9IGo7CisgICAgICBwcmludGYgKCJ9O1xuIik7CisgICAgfQorCit9CisKKworc3RhdGljIHZvaWQKK2ZpbGx0YWJsZSAoKQoreworICBvcCAqcDsKKyAgaW50IGluZGV4ID0gMTsKKworICBzb3J0dGFiICgpOworICBmb3IgKHAgPSB0YWI7IHAtPm5hbWU7IHArKykKKyAgICB7CisgICAgICBwLT5pbmRleCA9IGluZGV4Kys7CisgICAgICBleHBhbmRfb3Bjb2RlICgxMiwgMCwgcC0+aW5kZXgsIHAtPmNvZGUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2dlbnNpbSAoKQoreworICBvcCAqcDsKKyAgaW50IGo7CisKKyAgcHJpbnRmICgie1xuIik7CisgIHByaW50ZiAoIiAgc3dpdGNoIChqdW1wX3RhYmxlW2l3b3JkXSkge1xuIik7CisKKyAgZm9yIChwID0gdGFiOyBwLT5uYW1lOyBwKyspCisgICAgeworICAgICAgaW50IHNleHRiaXQgPSAtMTsKKyAgICAgIGludCBuZWVkbSA9IDA7CisgICAgICBpbnQgbmVlZG4gPSAwOworICAgICAgCisgICAgICBjaGFyICpzID0gcC0+Y29kZTsKKworICAgICAgcHJpbnRmICgiICAvKiAlcyAlcyAqL1xuIiwgcC0+bmFtZSwgcC0+Y29kZSk7CisgICAgICBwcmludGYgKCIgIGNhc2UgJWQ6ICAgICAgXG4iLCBwLT5pbmRleCk7CisKKyAgICAgIHByaW50ZiAoIiAgICB7XG4iKTsKKyAgICAgIHdoaWxlICgqcykKKwl7CisJICBzd2l0Y2ggKCpzKQorCSAgICB7CisJICAgIGNhc2UgJzAnOgorCSAgICBjYXNlICcxJzoKKwkgICAgY2FzZSAnLic6CisJICAgICAgcyArPSA0OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlICduJzoKKwkgICAgICBwcmludGYgKCIgICAgICBpbnQgbiA9IChpd29yZCA+PjgpICYgMHhmO1xuIik7CisJICAgICAgbmVlZG4gPSAxOworCSAgICAgIHMgKz0gNDsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAnbSc6CisJICAgICAgcHJpbnRmICgiICAgICAgaW50IG0gPSAoaXdvcmQgPj40KSAmIDB4ZjtcbiIpOworCSAgICAgIG5lZWRtID0gMTsKKwkgICAgICBzICs9IDQ7CisKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdpJzoKKwkgICAgICBwcmludGYgKCIgICAgICBpbnQgaSA9IChpd29yZCAmIDB4Iik7CisKKwkgICAgICBzd2l0Y2ggKHNbMV0pCisJCXsKKwkJY2FzZSAnNCc6CisJCSAgcHJpbnRmICgiZiIpOworCQkgIGJyZWFrOworCQljYXNlICc4JzoKKwkJICBwcmludGYgKCJmZiIpOworCQkgIGJyZWFrOworCQljYXNlICcxJzoKKwkJICBzZXh0Yml0ID0gMTI7CisKKwkJICBwcmludGYgKCJmZmYiKTsKKwkJICBicmVhazsKKwkJfQorCSAgICAgIHByaW50ZiAoIikiKTsKKworCSAgICAgIHN3aXRjaCAoc1szXSkKKwkJeworCQljYXNlICcxJzoKKwkJICBicmVhazsKKwkJY2FzZSAnMic6CisJCSAgcHJpbnRmICgiPDwxIik7CisJCSAgYnJlYWs7CisJCWNhc2UgJzQnOgorCQkgIHByaW50ZiAoIjw8MiIpOworCQkgIGJyZWFrOworCQl9CisJICAgICAgcHJpbnRmICgiO1xuIik7CisJICAgICAgcyArPSA0OworCSAgICB9CisJfQorICAgICAgaWYgKHNleHRiaXQgPiAwKQorCXsKKwkgIHByaW50ZiAoIiAgICAgIGkgPSAoaSBeICgxPDwlZCkpLSgxPDwlZCk7XG4iLAorCQkgIHNleHRiaXQgLSAxLCBzZXh0Yml0IC0gMSk7CisJfQorCisgICAgICBpZiAobmVlZG0gJiYgbmVlZG4pCisJcHJpbnRmICgiICAgICAgVEIobSxuKTtcbiIpOyAgCisgICAgICBlbHNlIGlmIChuZWVkbSkKKwlwcmludGYgKCIgICAgICBUTChtKTtcbiIpOworICAgICAgZWxzZSBpZiAobmVlZG4pCisJcHJpbnRmICgiICAgICAgVEwobik7XG4iKTsKKworICAgICAgeworCS8qIERvIHRoZSByZWZzICovCisJY2hhciAqcjsKKwlmb3IgKHIgPSBwLT5yZWZzOyAqcjsgcisrKQorCSAgeworCSAgICBpZiAoKnIgPT0gJzAnKSBwcmludGYoIiAgICAgIENSRUYoMCk7XG4iKTsgCisJICAgIGlmICgqciA9PSAnbicpIHByaW50ZigiICAgICAgQ1JFRihuKTtcbiIpOyAKKwkgICAgaWYgKCpyID09ICdtJykgcHJpbnRmKCIgICAgICBDUkVGKG0pO1xuIik7IAorCSAgfQorICAgICAgfQorCisgICAgICBwcmludGYgKCIgICAgICB7XG4iKTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBNQVhfTlJfU1RVRkY7IGorKykKKwl7CisJICBpZiAocC0+c3R1ZmZbal0pCisJICAgIHsKKwkgICAgICBwcmludGYgKCIgICAgICAgICVzXG4iLCBwLT5zdHVmZltqXSk7CisJICAgIH0KKwl9CisgICAgICBwcmludGYgKCIgICAgICB9XG4iKTsKKworICAgICAgeworCS8qIERvIHRoZSBkZWZzICovCisJY2hhciAqcjsKKwlmb3IgKHIgPSBwLT5kZWZzOyAqcjsgcisrKSAKKwkgIHsKKwkgICAgaWYgKCpyID09ICcwJykgcHJpbnRmKCIgICAgICBDREVGKDApO1xuIik7IAorCSAgICBpZiAoKnIgPT0gJ24nKSBwcmludGYoIiAgICAgIENERUYobik7XG4iKTsgCisJICAgIGlmICgqciA9PSAnbScpIHByaW50ZigiICAgICAgQ0RFRihtKTtcbiIpOyAKKwkgIH0KKyAgICAgIH0KKworICAgICAgcHJpbnRmICgiICAgICAgYnJlYWs7XG4iKTsKKyAgICAgIHByaW50ZiAoIiAgICB9XG4iKTsKKyAgICB9CisgIHByaW50ZiAoIiAgZGVmYXVsdDpcbiIpOworICBwcmludGYgKCIgICAge1xuIik7CisgIHByaW50ZiAoIiAgICAgIHNhdmVkX3N0YXRlLmFzcmVncy5leGNlcHRpb24gPSBTSUdJTEw7XG4iKTsKKyAgcHJpbnRmICgiICAgIH1cbiIpOworICBwcmludGYgKCIgIH1cbiIpOworICBwcmludGYgKCJ9XG4iKTsKK30KKworCitzdGF0aWMgdm9pZAorZ2VuZGVmaW5lcyAoKQoreworICBvcCAqcDsKKyAgZmlsbHRhYmxlKCk7CisgIGZvciAocCA9IHRhYjsgcC0+bmFtZTsgcCsrKQorICAgIHsKKyAgICAgIGNoYXIgKnMgPSBwLT5uYW1lOworICAgICAgcHJpbnRmICgiI2RlZmluZSBPUENfIik7CisgICAgICB3aGlsZSAoKnMpIHsKKwlpZiAoaXN1cHBlcigqcykpIAorCSAgKnMgPSB0b2xvd2VyKCpzKTsKKwlpZiAoaXNhbHBoYSgqcykpIHByaW50ZigiJWMiLCAqcyk7CisJaWYgKCpzID09ICcgJykgcHJpbnRmKCJfIik7CisJaWYgKCpzID09ICdAJykgcHJpbnRmKCJpbmRfIik7CisJaWYgKCpzID09ICcsJykgcHJpbnRmKCJfIik7CisJcysrOworICAgICAgfQorICAgICAgcHJpbnRmKCIgJWRcbiIscC0+aW5kZXgpOworICAgIH0KK30KKworaW50CittYWluIChhYywgYXYpCisgICAgIGludCBhYzsKKyAgICAgY2hhciAqKmF2OworeworICAvKiB2ZXJpZnkgdGhlIHRhYmxlIGJlZm9yZSBhbnl0aGluZyBlbHNlICovCisgIHsKKyAgICBvcCAqcDsKKyAgICBmb3IgKHAgPSB0YWI7IHAtPm5hbWU7IHArKykKKyAgICAgIHsKKwkvKiBjaGVjayB0aGF0IHRoZSBjb2RlIGZpZWxkIGNvbnRhaW5zIDE2IGJpdHMgKi8KKwlpZiAoc3RybGVuIChwLT5jb2RlKSAhPSAxNikKKwkgIHsKKwkgICAgZnByaW50ZiAoc3RkZXJyLCAiQ29kZSBgJXMnIGxlbmd0aCB3cm9uZyAoJWQpIGZvciBgJXMnXG4iLAorCQkgICAgIHAtPmNvZGUsIHN0cmxlbiAocC0+Y29kZSksIHAtPm5hbWUpOworCSAgICBhYm9ydCAoKTsKKwkgIH0KKyAgICAgIH0KKyAgfQorCisgIC8qIG5vdyBnZW5lcmF0ZSB0aGUgcmVxdWVzdGVkIGRhdGEgKi8KKyAgaWYgKGFjID4gMSkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChhdlsxXSwgIi10IikgPT0gMCkKKwl7CisJICBnZW5nYXN0YWIgKCk7CisJfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhdlsxXSwgIi1kIikgPT0gMCkKKwl7CisJICBnZW5kZWZpbmVzICgpOworCX0KKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXZbMV0sICItcyIpID09IDApCisJeworCSAgZmlsbHRhYmxlICgpOworCSAgZHVtcHRhYmxlICgpOworCisJfQorICAgICAgZWxzZSBpZiAoc3RyY21wIChhdlsxXSwgIi14IikgPT0gMCkKKwl7CisJICBmaWxsdGFibGUgKCk7CisJICBnZW5zaW0gKCk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGdlbm9wYyAoKTsKKyAgICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2ltL3NoL2ludGVycC5jIGIvc2ltL3NoL2ludGVycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMjY5NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vc2gvaW50ZXJwLmMKQEAgLTAsMCArMSwxNDE0IEBACisvKiBTaW11bGF0b3IgZm9yIHRoZSBIaXRhY2hpIFNIIGFyY2hpdGVjdHVyZS4KKworICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KKyAgIHNhY0BjeWdudXMuY29tCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFNIIHNpbQorCisKKwkJVEhJUyBTT0ZUV0FSRSBJUyBOT1QgQ09QWVJJR0hURUQKKworICAgQ3lnbnVzIG9mZmVycyB0aGUgZm9sbG93aW5nIGZvciB1c2UgaW4gdGhlIHB1YmxpYyBkb21haW4uICBDeWdudXMKKyAgIG1ha2VzIG5vIHdhcnJhbnR5IHdpdGggcmVnYXJkIHRvIHRoZSBzb2Z0d2FyZSBvciBpdCdzIHBlcmZvcm1hbmNlCisgICBhbmQgdGhlIHVzZXIgYWNjZXB0cyB0aGUgc29mdHdhcmUgIkFTIElTIiB3aXRoIGFsbCBmYXVsdHMuCisKKyAgIENZR05VUyBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgV0lUSCBSRUdBUkQgVE8KKyAgIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzeXNkZXAuaCIKKyNpbmNsdWRlICJiZmQuaCIKKyNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIKKworLyogVGhpcyBmaWxlIGlzIGxvY2FsIC0gaWYgbmV3bGliIGNoYW5nZXMsIHRoZW4gc28gc2hvdWxkIHRoaXMuICAqLworI2luY2x1ZGUgInN5c2NhbGwuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPGZsb2F0Lmg+CQkvKiBOZWVkZWQgZm9yIF9pc25hbigpICovCisjZGVmaW5lIGlzbmFuIF9pc25hbgorI2VuZGlmCisKKyNpZm5kZWYgU0lHQlVTCisjZGVmaW5lIFNJR0JVUyBTSUdTRUdWCisjZW5kaWYKKworI2lmbmRlZiBTSUdRVUlUCisjZGVmaW5lIFNJR1FVSVQgU0lHVEVSTQorI2VuZGlmCisKKyNpZm5kZWYgU0lHVFJBUAorI2RlZmluZSBTSUdUUkFQIDUKKyNlbmRpZgorCisjZGVmaW5lIE9fUkVDT01QSUxFIDg1CisjZGVmaW5lIERFRklORV9UQUJMRQorI2RlZmluZSBESVNBU1NFTUJMRVJfVEFCTEUKKwordHlwZWRlZiB1bmlvbgoreworCisgIHN0cnVjdAorICB7CisgICAgaW50IHBhZF9kdW1teTsKKyAgICBpbnQgcmVnc1sxNl07CisgICAgaW50IHBjOworICAgIGludCBwcjsKKworICAgIGludCBnYnI7CisgICAgaW50IHZicjsKKyAgICBpbnQgbWFjaDsKKyAgICBpbnQgbWFjbDsKKworICAgIGludCBzcjsKKworICAgIGludCBmcHVsOworCisgICAgaW50IGZwc2NyOworCisgICAgLyogc2gzZSAqLworICAgIHVuaW9uIGZyZWdzX3UKKyAgICAgIHsKKwlmbG9hdCBmWzE2XTsKKwlkb3VibGUgZFs4XTsKKwlpbnQgaVsxNl07CisgICAgICB9CisgICAgZnJlZ3M7CisKKyAgICBpbnQgc3NyOworICAgIGludCBzcGM7CisgICAgLyogc2gzICovCisgICAgaW50IGJhbmtbMl1bOF07CisKKyAgICBpbnQgdGlja3M7CisgICAgaW50IHN0YWxsczsKKyAgICBpbnQgbWVtc3RhbGxzOworICAgIGludCBjeWNsZXM7CisgICAgaW50IGluc3RzOworCisgICAgaW50IHByZXZsb2NrOworICAgIGludCB0aGlzbG9jazsKKyAgICBpbnQgZXhjZXB0aW9uOworCisgICAgaW50IGVuZF9vZl9yZWdpc3RlcnM7CisKKyAgICBpbnQgbXNpemU7CisjZGVmaW5lIFBST0ZJTEVfRlJFUSAxCisjZGVmaW5lIFBST0ZJTEVfU0hJRlQgMgorICAgIGludCBwcm9maWxlOworICAgIHVuc2lnbmVkIHNob3J0ICpwcm9maWxlX2hpc3Q7CisgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OworICB9CisgIGFzcmVnczsKKyAgaW50IGFzaW50c1s0MF07Cit9IHNhdmVkX3N0YXRlX3R5cGU7CisKK3NhdmVkX3N0YXRlX3R5cGUgc2F2ZWRfc3RhdGU7CisKKworLyogVGhlc2UgdmFyaWFibGVzIGFyZSBhdCBmaWxlIHNjb3BlIHNvIHRoYXQgZnVuY3Rpb25zIG90aGVyIHRoYW4KKyAgIHNpbV9yZXN1bWUgY2FuIHVzZSB0aGUgZmV0Y2gvc3RvcmUgbWFjcm9zICovCisKK3N0YXRpYyBpbnQgdGFyZ2V0X2xpdHRsZV9lbmRpYW47CitzdGF0aWMgaW50IGhvc3RfbGl0dGxlX2VuZGlhbjsKKworI2lmIDEKK3N0YXRpYyBpbnQgbWFza2wgPSB+MDsKK3N0YXRpYyBpbnQgbWFza3cgPSB+MDsKKyNlbmRpZgorCitzdGF0aWMgU0lNX09QRU5fS0lORCBzaW1fa2luZDsKK3N0YXRpYyBjaGFyICpteW5hbWU7CisKKworLyogU2hvcnQgaGFuZCBkZWZpbml0aW9ucyBvZiB0aGUgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgU0JJVCh4KSAoKHgpJnNiaXQpCisjZGVmaW5lIFIwIAlzYXZlZF9zdGF0ZS5hc3JlZ3MucmVnc1swXQorI2RlZmluZSBSbiAJc2F2ZWRfc3RhdGUuYXNyZWdzLnJlZ3Nbbl0KKyNkZWZpbmUgUm0gCXNhdmVkX3N0YXRlLmFzcmVncy5yZWdzW21dCisjZGVmaW5lIFVSMCAJKHVuc2lnbmVkIGludCkoc2F2ZWRfc3RhdGUuYXNyZWdzLnJlZ3NbMF0pCisjZGVmaW5lIFVSIAkodW5zaWduZWQgaW50KVIKKyNkZWZpbmUgVVIgCSh1bnNpZ25lZCBpbnQpUgorI2RlZmluZSBTUjAgCXNhdmVkX3N0YXRlLmFzcmVncy5yZWdzWzBdCisjZGVmaW5lIEdCUiAJc2F2ZWRfc3RhdGUuYXNyZWdzLmdicgorI2RlZmluZSBWQlIgCXNhdmVkX3N0YXRlLmFzcmVncy52YnIKKyNkZWZpbmUgU1NSCXNhdmVkX3N0YXRlLmFzcmVncy5zc3IKKyNkZWZpbmUgU1BDCXNhdmVkX3N0YXRlLmFzcmVncy5zcGMKKyNkZWZpbmUgTUFDSCAJc2F2ZWRfc3RhdGUuYXNyZWdzLm1hY2gKKyNkZWZpbmUgTUFDTCAJc2F2ZWRfc3RhdGUuYXNyZWdzLm1hY2wKKyNkZWZpbmUgRlBVTAlzYXZlZF9zdGF0ZS5hc3JlZ3MuZnB1bAorCisjZGVmaW5lIFBDIHBjCisKKworCisvKiBBbHRlcm5hdGUgYmFuayBvZiByZWdpc3RlcnMgcjAtcjYgKi8KKworLyogTm90ZTogY29kZSBjb250cm9saW5nIFNSIGhhbmRsZXMgZmxpcHMgYmV0d2VlbiBCQU5LMCBhbmQgQkFOSzEgKi8KKyNkZWZpbmUgUm5fQkFOSyhuKSAoc2F2ZWRfc3RhdGUuYXNyZWdzLmJhbmtbIVNSX1JCXVsobildKQorI2RlZmluZSBTRVRfUm5fQkFOSyhuLCBFWFApIGRvIHsgc2F2ZWRfc3RhdGUuYXNyZWdzLmJhbmtbIVNSX1JCXVsobildID0gKEVYUCk7IH0gd2hpbGUgKDApCisKKworLyogTWFuaXB1bGF0ZSBTUiAqLworCisjZGVmaW5lIFNSX01BU0tfTSAoMSA8PCA5KQorI2RlZmluZSBTUl9NQVNLX1EgKDEgPDwgOCkKKyNkZWZpbmUgU1JfTUFTS19JICgweGYgPDwgNCkKKyNkZWZpbmUgU1JfTUFTS19TICgxIDw8IDEpCisjZGVmaW5lIFNSX01BU0tfVCAoMSA8PCAwKQorCisjZGVmaW5lIFNSX01BU0tfQkwgKDEgPDwgMjgpCisjZGVmaW5lIFNSX01BU0tfUkIgKDEgPDwgMjkpCisjZGVmaW5lIFNSX01BU0tfTUQgKDEgPDwgMzApCisKKyNkZWZpbmUgTSAJKChzYXZlZF9zdGF0ZS5hc3JlZ3Muc3IgJiBTUl9NQVNLX00pICE9IDApCisjZGVmaW5lIFEgCSgoc2F2ZWRfc3RhdGUuYXNyZWdzLnNyICYgU1JfTUFTS19RKSAhPSAwKQorI2RlZmluZSBTIAkoKHNhdmVkX3N0YXRlLmFzcmVncy5zciAmIFNSX01BU0tfUykgIT0gMCkKKyNkZWZpbmUgVCAJKChzYXZlZF9zdGF0ZS5hc3JlZ3Muc3IgJiBTUl9NQVNLX1QpICE9IDApCisKKyNkZWZpbmUgU1JfQkwgKChzYXZlZF9zdGF0ZS5hc3JlZ3Muc3IgJiBTUl9NQVNLX0JMKSAhPSAwKQorI2RlZmluZSBTUl9SQiAoKHNhdmVkX3N0YXRlLmFzcmVncy5zciAmIFNSX01BU0tfUkIpICE9IDApCisjZGVmaW5lIFNSX01EICgoc2F2ZWRfc3RhdGUuYXNyZWdzLnNyICYgU1JfTUFTS19NRCkgIT0gMCkKKworLyogTm90ZTogZG9uJ3QgdXNlIHRoaXMgZm9yIHByaXZpbGVnZWQgYml0cyAqLworI2RlZmluZSBTRVRfU1JfQklUKEVYUCwgQklUKSBcCitkbyB7IFwKKyAgaWYgKChFWFApICYgMSkgXAorICAgIHNhdmVkX3N0YXRlLmFzcmVncy5zciB8PSAoQklUKTsgXAorICBlbHNlIFwKKyAgICBzYXZlZF9zdGF0ZS5hc3JlZ3Muc3IgJj0gfihCSVQpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNFVF9TUl9NKEVYUCkgU0VUX1NSX0JJVCAoKEVYUCksIFNSX01BU0tfTSkKKyNkZWZpbmUgU0VUX1NSX1EoRVhQKSBTRVRfU1JfQklUICgoRVhQKSwgU1JfTUFTS19RKQorI2RlZmluZSBTRVRfU1JfUyhFWFApIFNFVF9TUl9CSVQgKChFWFApLCBTUl9NQVNLX1MpCisjZGVmaW5lIFNFVF9TUl9UKEVYUCkgU0VUX1NSX0JJVCAoKEVYUCksIFNSX01BU0tfVCkKKworI2RlZmluZSBHRVRfU1IoKSAoc2F2ZWRfc3RhdGUuYXNyZWdzLnNyIC0gMCkKKyNkZWZpbmUgU0VUX1NSKHgpIHNldF9zciAoeCkKK3N0YXRpYyB2b2lkCitzZXRfc3IgKG5ld19zcikKKyAgICAgaW50IG5ld19zcjsKK3sKKyAgLyogZG8gd2UgbmVlZCB0byBzd2FwIGJhbmtzICovCisgIGludCBvbGRfZ3ByID0gKFNSX01EID8gIVNSX1JCIDogMCk7CisgIGludCBuZXdfZ3ByID0gKChuZXdfc3IgJiBTUl9NQVNLX01EKQorCQkgPyAobmV3X3NyICYgU1JfTUFTS19SQikgPT0gMAorCQkgOiAwKTsKKyAgaWYgKG9sZF9ncHIgIT0gbmV3X2dwcikKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJeworCSAgc2F2ZWRfc3RhdGUuYXNyZWdzLmJhbmtbb2xkX2dwcl1baV0gPSBzYXZlZF9zdGF0ZS5hc3JlZ3MucmVnc1tpXTsKKwkgIHNhdmVkX3N0YXRlLmFzcmVncy5yZWdzW2ldID0gc2F2ZWRfc3RhdGUuYXNyZWdzLmJhbmtbbmV3X2dwcl1baV07CisJfQorICAgIH0KK30KKworCisvKiBNYW5pcHVsYXRlIEZQU0NSICovCisKKyNkZWZpbmUgc2V0X2Zwc2NyMSh4KQorI2RlZmluZSBTRVRfRlBTQ1IoeCkgKHNhdmVkX3N0YXRlLmFzcmVncy5mcHNjciA9ICh4KSkKKyNkZWZpbmUgR0VUX0ZQU0NSKCkgIChzYXZlZF9zdGF0ZS5hc3JlZ3MuZnBzY3IpCisKKworaW50IAorZmFpbCAoKQoreworICBhYm9ydCAoKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBleGlzdHMgc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBzZXR0aW5nIGEgYnJlYWtwb2ludCB0bworICAgY2F0Y2ggc2ltdWxhdGVkIGJ1cyBlcnJvcnMgd2hlbiBydW5uaW5nIHRoZSBzaW11bGF0b3IgdW5kZXIgR0RCLiAgKi8KKwordm9pZAorYnBfaG9sZGVyICgpCit7Cit9CisKKy8qIEZJWE1FOiBzaW1fcmVzdW1lIHNob3VsZCBiZSByZW5hbWVkIHRvIHNpbV9lbmdpbmVfcnVuLiAgc2ltX3Jlc3VtZQorICAgYmVpbmcgaW1wbGVtZW50ZWQgYnkgLi4vY29tbW9uL3NpbV9yZXN1bWUuYyBhbmQgdGhlIGJlbG93IHNob3VsZAorICAgbWFrZSBhIGNhbGwgdG8gc2ltX2VuZ2luZV9oYWx0ICovCisKKyNkZWZpbmUgQlVTRVJST1IoYWRkciwgbWFzaykgXAorICBpZiAoYWRkciAmIH5tYXNrKSB7IHNhdmVkX3N0YXRlLmFzcmVncy5leGNlcHRpb24gPSBTSUdCVVM7ICBicF9ob2xkZXIgKCk7IH0KKworLyogRGVmaW5lIHRoaXMgdG8gZW5hYmxlIHJlZ2lzdGVyIGxpZmV0aW1lIGNoZWNraW5nLgorICAgVGhlIGNvbXBpbGVyIGdlbmVyYXRlcyAiYWRkICMwLHJuIiBpbnNucyB0byBtYXJrIHJlZ2lzdGVycyBhcyBpbnZhbGlkLAorICAgdGhlIHNpbXVsYXRvciB1c2VzIHRoaXMgaW5mbyB0byBjYWxsIGZhaWwgaWYgaXQgZmluZHMgYSByZWYgdG8gYW4gaW52YWxpZAorICAgcmVnaXN0ZXIgYmVmb3JlIGEgZGVmCisKKyAgICNkZWZpbmUgUEFSQU5PSUQKKyovCisKKyNpZmRlZiBQQVJBTk9JRAoraW50IHZhbGlkWzE2XTsKKyNkZWZpbmUgQ1JFRih4KSAgaWYoIXZhbGlkW3hdKSBmYWlsKCk7CisjZGVmaW5lIENERUYoeCkgIHZhbGlkW3hdID0gMTsKKyNkZWZpbmUgVU5ERUYoeCkgdmFsaWRbeF0gPSAwOworI2Vsc2UKKyNkZWZpbmUgQ1JFRih4KQorI2RlZmluZSBDREVGKHgpCisjZGVmaW5lIFVOREVGKHgpCisjZW5kaWYKKworc3RhdGljIHZvaWQgcGFyc2VfYW5kX3NldF9tZW1vcnlfc2l6ZSBQQVJBTVMgKChjaGFyICpzdHIpKTsKKworc3RhdGljIGludCBJT01FTSBQQVJBTVMgKChpbnQgYWRkciwgaW50IHdyaXRlLCBpbnQgdmFsdWUpKTsKKworc3RhdGljIGhvc3RfY2FsbGJhY2sgKmNhbGxiYWNrOworCisKKworLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgRkkobikgKHNhdmVkX3N0YXRlLmFzcmVncy5mcmVncy5pWyhuKV0pCisjZGVmaW5lIEZSKG4pIChzYXZlZF9zdGF0ZS5hc3JlZ3MuZnJlZ3MuZlsobildKQorCisjZGVmaW5lIFNFVF9GSShuLEVYUCkgKHNhdmVkX3N0YXRlLmFzcmVncy5mcmVncy5pWyhuKV0gPSAoRVhQKSkKKyNkZWZpbmUgU0VUX0ZSKG4sRVhQKSAoc2F2ZWRfc3RhdGUuYXNyZWdzLmZyZWdzLmZbKG4pXSA9IChFWFApKQorCisjZGVmaW5lIEZQX09QKG4sIE9QLCBtKSAoU0VUX0ZSKG4sIChGUihuKSBPUCBGUihtKSkpKQorI2RlZmluZSBGUF9VTkFSWShuLCBPUCkgKFNFVF9GUihuLCAoT1AgKEZSKG4pKSkpKQorI2RlZmluZSBGUF9DTVAobiwgT1AsIG0pIFNFVF9TUl9UKEZSKG4pIE9QIEZSKG0pKQorCisKKworc3RhdGljIHZvaWQgSU5MSU5FIAord2xhdF9saXR0bGUgKG1lbW9yeSwgeCwgdmFsdWUsIG1hc2tsKQorICAgICB1bnNpZ25lZCBjaGFyICptZW1vcnk7Cit7CisgIGludCB2ID0gdmFsdWU7CisgIHVuc2lnbmVkIGNoYXIgKnAgPSBtZW1vcnkgKyAoKHgpICYgbWFza2wpOworICBCVVNFUlJPUih4LCBtYXNrbCk7CisgIHBbM10gPSB2ID4+IDI0OworICBwWzJdID0gdiA+PiAxNjsKKyAgcFsxXSA9IHYgPj4gODsKKyAgcFswXSA9IHY7Cit9CisKK3N0YXRpYyB2b2lkIElOTElORSAKK3d3YXRfbGl0dGxlIChtZW1vcnksIHgsIHZhbHVlLCBtYXNrdykKKyAgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OworeworICBpbnQgdiA9IHZhbHVlOworICB1bnNpZ25lZCBjaGFyICpwID0gbWVtb3J5ICsgKCh4KSAmIG1hc2t3KTsKKyAgQlVTRVJST1IoeCwgbWFza3cpOworCisgIHBbMV0gPSB2ID4+IDg7CisgIHBbMF0gPSB2OworfQorCitzdGF0aWMgdm9pZCBJTkxJTkUgCit3YmF0X2FueSAobWVtb3J5LCB4LCB2YWx1ZSwgbWFza2IpCisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKK3sKKyAgdW5zaWduZWQgY2hhciAqcCA9IG1lbW9yeSArICh4ICYgbWFza2IpOworICBpZiAoeCA+IDB4NTAwMDAwMCkKKyAgICBJT01FTSAoeCwgMSwgdmFsdWUpOworICBCVVNFUlJPUih4LCBtYXNrYik7CisKKyAgcFswXSA9IHZhbHVlOworfQorCitzdGF0aWMgdm9pZCBJTkxJTkUgCit3bGF0X2JpZyAobWVtb3J5LCB4LCB2YWx1ZSwgbWFza2wpCisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKK3sKKyAgaW50IHYgPSB2YWx1ZTsKKyAgdW5zaWduZWQgY2hhciAqcCA9IG1lbW9yeSArICgoeCkgJiBtYXNrbCk7CisgIEJVU0VSUk9SKHgsIG1hc2tsKTsKKworICBwWzBdID0gdiA+PiAyNDsKKyAgcFsxXSA9IHYgPj4gMTY7CisgIHBbMl0gPSB2ID4+IDg7CisgIHBbM10gPSB2OworfQorCitzdGF0aWMgdm9pZCBJTkxJTkUgCit3d2F0X2JpZyAobWVtb3J5LCB4LCB2YWx1ZSwgbWFza3cpCisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKK3sKKyAgaW50IHYgPSB2YWx1ZTsKKyAgdW5zaWduZWQgY2hhciAqcCA9IG1lbW9yeSArICgoeCkgJiBtYXNrdyk7CisgIEJVU0VSUk9SKHgsIG1hc2t3KTsKKworICBwWzBdID0gdiA+PiA4OworICBwWzFdID0gdjsKK30KKworc3RhdGljIHZvaWQgSU5MSU5FIAord2JhdF9iaWcgKG1lbW9yeSwgeCwgdmFsdWUsIG1hc2tiKQorICAgICB1bnNpZ25lZCBjaGFyICptZW1vcnk7Cit7CisgIHVuc2lnbmVkIGNoYXIgKnAgPSBtZW1vcnkgKyAoeCAmIG1hc2tiKTsKKyAgQlVTRVJST1IoeCwgbWFza2IpOworCisgIGlmICh4ID4gMHg1MDAwMDAwKQorICAgIElPTUVNICh4LCAxLCB2YWx1ZSk7CisgIHBbMF0gPSB2YWx1ZTsKK30KKworLyogUmVhZCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBJTkxJTkUgCitybGF0X2xpdHRsZSAobWVtb3J5LCB4LCBtYXNrbCkKKyAgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OworeworICB1bnNpZ25lZCBjaGFyICpwID0gbWVtb3J5ICsgKCh4KSAmIG1hc2tsKTsKKyAgQlVTRVJST1IoeCwgbWFza2wpOworCisgIHJldHVybiAocFszXSA8PCAyNCkgfCAocFsyXSA8PCAxNikgfCAocFsxXSA8PCA4KSB8IHBbMF07Cit9CisKK3N0YXRpYyBpbnQgSU5MSU5FIAorcndhdF9saXR0bGUgKG1lbW9yeSwgeCwgbWFza3cpCisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKK3sKKyAgdW5zaWduZWQgY2hhciAqcCA9IG1lbW9yeSArICgoeCkgJiBtYXNrdyk7CisgIEJVU0VSUk9SKHgsIG1hc2t3KTsKKworICByZXR1cm4gKHBbMV0gPDwgOCkgfCBwWzBdOworfQorCitzdGF0aWMgaW50IElOTElORSAKK3JiYXRfYW55IChtZW1vcnksIHgsIG1hc2tiKQorICAgICB1bnNpZ25lZCBjaGFyICptZW1vcnk7Cit7CisgIHVuc2lnbmVkIGNoYXIgKnAgPSBtZW1vcnkgKyAoKHgpICYgbWFza2IpOworICBCVVNFUlJPUih4LCBtYXNrYik7CisKKyAgcmV0dXJuIHBbMF07Cit9CisKK3N0YXRpYyBpbnQgSU5MSU5FIAorcmxhdF9iaWcgKG1lbW9yeSwgeCwgbWFza2wpCisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKK3sKKyAgdW5zaWduZWQgY2hhciAqcCA9IG1lbW9yeSArICgoeCkgJiBtYXNrbCk7CisgIEJVU0VSUk9SKHgsIG1hc2tsKTsKKworICByZXR1cm4gKHBbMF0gPDwgMjQpIHwgKHBbMV0gPDwgMTYpIHwgKHBbMl0gPDwgOCkgfCBwWzNdOworfQorCitzdGF0aWMgaW50IElOTElORSAKK3J3YXRfYmlnIChtZW1vcnksIHgsIG1hc2t3KQorICAgICB1bnNpZ25lZCBjaGFyICptZW1vcnk7Cit7CisgIHVuc2lnbmVkIGNoYXIgKnAgPSBtZW1vcnkgKyAoKHgpICYgbWFza3cpOworICBCVVNFUlJPUih4LCBtYXNrdyk7CisKKyAgcmV0dXJuIChwWzBdIDw8IDgpIHwgcFsxXTsKK30KKworI2RlZmluZSBSV0FUKHgpIAkobGl0dGxlX2VuZGlhbiA/IHJ3YXRfbGl0dGxlKG1lbW9yeSwgeCwgbWFza3cpOiByd2F0X2JpZyhtZW1vcnksIHgsIG1hc2t3KSkKKyNkZWZpbmUgUkxBVCh4KSAJKGxpdHRsZV9lbmRpYW4gPyBybGF0X2xpdHRsZShtZW1vcnksIHgsIG1hc2tsKTogcmxhdF9iaWcobWVtb3J5LCB4LCBtYXNrbCkpCisjZGVmaW5lIFJCQVQoeCkgICAgICAgICAocmJhdF9hbnkgKG1lbW9yeSwgeCwgbWFza2IpKQorI2RlZmluZSBXV0FUKHgsdikgCShsaXR0bGVfZW5kaWFuID8gd3dhdF9saXR0bGUobWVtb3J5LCB4LCB2LCBtYXNrdyk6IHd3YXRfYmlnKG1lbW9yeSwgeCwgdiwgbWFza3cpKQorI2RlZmluZSBXTEFUKHgsdikgCShsaXR0bGVfZW5kaWFuID8gd2xhdF9saXR0bGUobWVtb3J5LCB4LCB2LCBtYXNrbCk6IHdsYXRfYmlnKG1lbW9yeSwgeCwgdiwgbWFza2wpKQorI2RlZmluZSBXQkFUKHgsdikgICAgICAgKHdiYXRfYW55IChtZW1vcnksIHgsIHYsIG1hc2tiKSkKKworI2RlZmluZSBSVVdBVCh4KSAgKFJXQVQoeCkgJiAweGZmZmYpCisjZGVmaW5lIFJTV0FUKHgpICAoKHNob3J0KShSV0FUKHgpKSkKKyNkZWZpbmUgUlNCQVQoeCkgIChTRVhUKFJCQVQoeCkpKQorCisKKworCisjZGVmaW5lIE1BKG4pIGRvIHsgbWVtc3RhbGxzICs9ICgoKHBjICYgMykgIT0gMCkgPyAobikgOiAoKG4pIC0gMSkpOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIFNFWFQoeCkgICAgIAkoKCh4ICYgIDB4ZmYpIF4gKH4weDdmKSkrMHg4MCkKKyNkZWZpbmUgU0VYVDEyKHgpCSgoKHggJiAweGZmZikgXiAweDgwMCkgLSAweDgwMCkKKyNkZWZpbmUgU0VYVFcoeSkgICAgCSgoaW50KSgoc2hvcnQpeSkpCisKKyNkZWZpbmUgRGVsYXlfU2xvdChURU1QUEMpICAJaXdvcmQgPSBSVVdBVChURU1QUEMpOyBnb3RvIHRvcDsKKworaW50IGVtcHR5WzE2XTsKKworI2RlZmluZSBMKHgpICAgdGhpc2xvY2sgPSB4OworI2RlZmluZSBUTCh4KSAgaWYgKCh4KSA9PSBwcmV2bG9jaykgc3RhbGxzKys7CisjZGVmaW5lIFRCKHgseSkgIGlmICgoeCkgPT0gcHJldmxvY2sgfHwgKHkpPT1wcmV2bG9jaykgc3RhbGxzKys7CisKKyNpZiBkZWZpbmVkKF9fR08zMl9fKSB8fCBkZWZpbmVkKF9XSU4zMikKK2ludCBzaW1fbWVtb3J5X3NpemUgPSAxOTsKKyNlbHNlCitpbnQgc2ltX21lbW9yeV9zaXplID0gMjQ7CisjZW5kaWYKKworc3RhdGljIGludCBzaW1fcHJvZmlsZV9zaXplID0gMTc7CitzdGF0aWMgaW50IG5zYW1wbGVzOworCisjdW5kZWYgVEIKKyNkZWZpbmUgVEIoeCx5KQorCisjZGVmaW5lIFNNUjEgKDB4MDVGRkZFQzgpCS8qIENoYW5uZWwgMSAgc2VyaWFsIG1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQlJSMSAoMHgwNUZGRkVDOSkJLyogQ2hhbm5lbCAxICBiaXQgcmF0ZSByZWdpc3RlciAqLworI2RlZmluZSBTQ1IxICgweDA1RkZGRUNBKQkvKiBDaGFubmVsIDEgIHNlcmlhbCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFREUjEgKDB4MDVGRkZFQ0IpCS8qIENoYW5uZWwgMSAgdHJhbnNtaXQgZGF0YSByZWdpc3RlciAqLworI2RlZmluZSBTU1IxICgweDA1RkZGRUNDKQkvKiBDaGFubmVsIDEgIHNlcmlhbCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkRSMSAoMHgwNUZGRkVDRCkJLyogQ2hhbm5lbCAxICByZWNlaXZlIGRhdGEgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBTQ0lfUkRSRiAgCSAweDQwCS8qIFJlY2lldmUgZGF0YSByZWdpc3RlciBmdWxsICovCisjZGVmaW5lIFNDSV9URFJFCTB4ODAJLyogVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSAqLworCitzdGF0aWMgaW50CitJT01FTSAoYWRkciwgd3JpdGUsIHZhbHVlKQorICAgICBpbnQgYWRkcjsKKyAgICAgaW50IHdyaXRlOworICAgICBpbnQgdmFsdWU7Cit7CisgIGlmICh3cml0ZSkKKyAgICB7CisgICAgICBzd2l0Y2ggKGFkZHIpCisJeworCWNhc2UgVERSMToKKwkgIGlmICh2YWx1ZSAhPSAnXHInKQorCSAgICB7CisJICAgICAgcHV0Y2hhciAodmFsdWUpOworCSAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKwkgICAgfQorCSAgYnJlYWs7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHN3aXRjaCAoYWRkcikKKwl7CisJY2FzZSBSRFIxOgorCSAgcmV0dXJuIGdldGNoYXIgKCk7CisJfQorICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9ub3cgKCkKK3sKKyAgcmV0dXJuIHRpbWUgKChsb25nICopIDApOworfQorCitzdGF0aWMgaW50Citub3dfcGVyc2VjICgpCit7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgRklMRSAqcHJvZmlsZV9maWxlOworCitzdGF0aWMgdm9pZAorc3dhcCAobWVtb3J5LCBuKQorICAgICB1bnNpZ25lZCBjaGFyICptZW1vcnk7CisgICAgIGludCBuOworeworICBpbnQgbGl0dGxlX2VuZGlhbiA9IHRhcmdldF9saXR0bGVfZW5kaWFuOworICBXTEFUICgwLCBuKTsKK30KKworc3RhdGljIHZvaWQKK3N3YXAxNiAobWVtb3J5LCBuKQorICAgICB1bnNpZ25lZCBjaGFyICptZW1vcnk7CisgICAgIGludCBuOworeworICBpbnQgbGl0dGxlX2VuZGlhbiA9IHRhcmdldF9saXR0bGVfZW5kaWFuOworICBXV0FUICgwLCBuKTsKK30KKworc3RhdGljIHZvaWQKK3N3YXBvdXQgKG4pCisgICAgIGludCBuOworeworICBpZiAocHJvZmlsZV9maWxlKQorICAgIHsKKyAgICAgIGNoYXIgYls0XTsKKyAgICAgIHN3YXAgKGIsIG4pOworICAgICAgZndyaXRlIChiLCA0LCAxLCBwcm9maWxlX2ZpbGUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3N3YXBvdXQxNiAobikKKyAgICAgaW50IG47Cit7CisgIGNoYXIgYls0XTsKKyAgc3dhcDE2IChiLCBuKTsKKyAgZndyaXRlIChiLCAyLCAxLCBwcm9maWxlX2ZpbGUpOworfQorCisvKiBUdXJuIGEgcG9pbnRlciBpbiBhIHJlZ2lzdGVyIGludG8gYSBwb2ludGVyIGludG8gcmVhbCBtZW1vcnkuICovCisKK3N0YXRpYyBjaGFyICoKK3B0ciAoeCkKKyAgICAgaW50IHg7Cit7CisgIHJldHVybiAoY2hhciAqKSAoeCArIHNhdmVkX3N0YXRlLmFzcmVncy5tZW1vcnkpOworfQorCisvKiBTaW11bGF0ZSBhIG1vbml0b3IgdHJhcCwgcHV0IHRoZSByZXN1bHQgaW50byByMCBhbmQgZXJybm8gaW50byByMSAqLworCitzdGF0aWMgdm9pZAordHJhcCAoaSwgcmVncywgbWVtb3J5LCBtYXNrbCwgbWFza3csIGxpdHRsZV9lbmRpYW4pCisgICAgIGludCBpOworICAgICBpbnQgKnJlZ3M7CisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKK3sKKyAgc3dpdGNoIChpKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBwcmludGYgKCIlYyIsIHJlZ3NbMF0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgc2F2ZWRfc3RhdGUuYXNyZWdzLmV4Y2VwdGlvbiA9IFNJR1FVSVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CQkJLyogRklYTUU6IGZvciBiYWNrd2FyZHMgY29tcGF0LCBzaG91bGQgYmUgcmVtb3ZlZCAqLworICAgIGNhc2UgMzQ6CisgICAgICB7CisJZXh0ZXJuIGludCBlcnJubzsKKwlpbnQgcGVycm5vID0gZXJybm87CisJZXJybm8gPSAwOworCisJc3dpdGNoIChyZWdzWzRdKQorCSAgeworCisjaWYgIWRlZmluZWQoX19HTzMyX18pICYmICFkZWZpbmVkKF9XSU4zMikKKwkgIGNhc2UgU1lTX2Zvcms6CisJICAgIHJlZ3NbMF0gPSBmb3JrICgpOworCSAgICBicmVhazsKKwkgIGNhc2UgU1lTX2V4ZWN2ZToKKwkgICAgcmVnc1swXSA9IGV4ZWN2ZSAocHRyIChyZWdzWzVdKSwgKGNoYXIgKiopcHRyIChyZWdzWzZdKSwgKGNoYXIgKiopcHRyIChyZWdzWzddKSk7CisJICAgIGJyZWFrOworCSAgY2FzZSBTWVNfZXhlY3Y6CisJICAgIHJlZ3NbMF0gPSBleGVjdmUgKHB0ciAocmVnc1s1XSksKGNoYXIgKiopIHB0ciAocmVnc1s2XSksIDApOworCSAgICBicmVhazsKKwkgIGNhc2UgU1lTX3BpcGU6CisJICAgIHsKKwkgICAgICBjaGFyICpidWY7CisJICAgICAgaW50IGhvc3RfZmRbMl07CisKKwkgICAgICBidWYgPSBwdHIgKHJlZ3NbNV0pOworCisJICAgICAgcmVnc1swXSA9IHBpcGUgKGhvc3RfZmQpOworCisJICAgICAgV0xBVCAoYnVmLCBob3N0X2ZkWzBdKTsKKwkgICAgICBidWYgKz0gNDsKKwkgICAgICBXTEFUIChidWYsIGhvc3RfZmRbMV0pOworCSAgICB9CisJICAgIGJyZWFrOworCisJICBjYXNlIFNZU193YWl0OgorCSAgICByZWdzWzBdID0gd2FpdCAocHRyIChyZWdzWzVdKSk7CisJICAgIGJyZWFrOworI2VuZGlmCisKKwkgIGNhc2UgU1lTX3JlYWQ6CisJICAgIHJlZ3NbMF0gPSBjYWxsYmFjay0+cmVhZCAoY2FsbGJhY2ssIHJlZ3NbNV0sIHB0ciAocmVnc1s2XSksIHJlZ3NbN10pOworCSAgICBicmVhazsKKwkgIGNhc2UgU1lTX3dyaXRlOgorCSAgICBpZiAocmVnc1s1XSA9PSAxKQorCSAgICAgIHJlZ3NbMF0gPSAoaW50KWNhbGxiYWNrLT53cml0ZV9zdGRvdXQgKGNhbGxiYWNrLCBwdHIocmVnc1s2XSksIHJlZ3NbN10pOworCSAgICBlbHNlCisJICAgICAgcmVnc1swXSA9IChpbnQpY2FsbGJhY2stPndyaXRlIChjYWxsYmFjaywgcmVnc1s1XSwgcHRyIChyZWdzWzZdKSwgcmVnc1s3XSk7CisJICAgIGJyZWFrOworCSAgY2FzZSBTWVNfbHNlZWs6CisJICAgIHJlZ3NbMF0gPSBjYWxsYmFjay0+bHNlZWsgKGNhbGxiYWNrLHJlZ3NbNV0sIHJlZ3NbNl0sIHJlZ3NbN10pOworCSAgICBicmVhazsKKwkgIGNhc2UgU1lTX2Nsb3NlOgorCSAgICByZWdzWzBdID0gY2FsbGJhY2stPmNsb3NlIChjYWxsYmFjayxyZWdzWzVdKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIFNZU19vcGVuOgorCSAgICByZWdzWzBdID0gY2FsbGJhY2stPm9wZW4gKGNhbGxiYWNrLHB0ciAocmVnc1s1XSksIHJlZ3NbNl0pOworCSAgICBicmVhazsKKwkgIGNhc2UgU1lTX2V4aXQ6CisJICAgIC8qIEVYSVQgLSBjYWxsZXIgY2FuIGxvb2sgaW4gcjUgdG8gd29yayBvdXQgdGhlIHJlYXNvbiAqLworCSAgICBzYXZlZF9zdGF0ZS5hc3JlZ3MuZXhjZXB0aW9uID0gU0lHUVVJVDsKKwkgICAgcmVnc1swXSA9IHJlZ3NbNV07CisJICAgIGJyZWFrOworCisJICBjYXNlIFNZU19zdGF0OgkvKiBhZGRlZCBhdCBobXNpICovCisJICAgIC8qIHN0YXQgc3lzdGVtIGNhbGwgKi8KKwkgICAgeworCSAgICAgIHN0cnVjdCBzdGF0IGhvc3Rfc3RhdDsKKwkgICAgICBjaGFyICpidWY7CisKKwkgICAgICByZWdzWzBdID0gc3RhdCAocHRyIChyZWdzWzVdKSwgJmhvc3Rfc3RhdCk7CisKKwkgICAgICBidWYgPSBwdHIgKHJlZ3NbNl0pOworCisJICAgICAgV1dBVCAoYnVmLCBob3N0X3N0YXQuc3RfZGV2KTsKKwkgICAgICBidWYgKz0gMjsKKwkgICAgICBXV0FUIChidWYsIGhvc3Rfc3RhdC5zdF9pbm8pOworCSAgICAgIGJ1ZiArPSAyOworCSAgICAgIFdMQVQgKGJ1ZiwgaG9zdF9zdGF0LnN0X21vZGUpOworCSAgICAgIGJ1ZiArPSA0OworCSAgICAgIFdXQVQgKGJ1ZiwgaG9zdF9zdGF0LnN0X25saW5rKTsKKwkgICAgICBidWYgKz0gMjsKKwkgICAgICBXV0FUIChidWYsIGhvc3Rfc3RhdC5zdF91aWQpOworCSAgICAgIGJ1ZiArPSAyOworCSAgICAgIFdXQVQgKGJ1ZiwgaG9zdF9zdGF0LnN0X2dpZCk7CisJICAgICAgYnVmICs9IDI7CisJICAgICAgV1dBVCAoYnVmLCBob3N0X3N0YXQuc3RfcmRldik7CisJICAgICAgYnVmICs9IDI7CisJICAgICAgV0xBVCAoYnVmLCBob3N0X3N0YXQuc3Rfc2l6ZSk7CisJICAgICAgYnVmICs9IDQ7CisJICAgICAgV0xBVCAoYnVmLCBob3N0X3N0YXQuc3RfYXRpbWUpOworCSAgICAgIGJ1ZiArPSA0OworCSAgICAgIFdMQVQgKGJ1ZiwgMCk7CisJICAgICAgYnVmICs9IDQ7CisJICAgICAgV0xBVCAoYnVmLCBob3N0X3N0YXQuc3RfbXRpbWUpOworCSAgICAgIGJ1ZiArPSA0OworCSAgICAgIFdMQVQgKGJ1ZiwgMCk7CisJICAgICAgYnVmICs9IDQ7CisJICAgICAgV0xBVCAoYnVmLCBob3N0X3N0YXQuc3RfY3RpbWUpOworCSAgICAgIGJ1ZiArPSA0OworCSAgICAgIFdMQVQgKGJ1ZiwgMCk7CisJICAgICAgYnVmICs9IDQ7CisJICAgICAgV0xBVCAoYnVmLCAwKTsKKwkgICAgICBidWYgKz0gNDsKKwkgICAgICBXTEFUIChidWYsIDApOworCSAgICAgIGJ1ZiArPSA0OworCSAgICB9CisJICAgIGJyZWFrOworCisjaWZuZGVmIF9XSU4zMgorCSAgY2FzZSBTWVNfY2hvd246CisJICAgIHJlZ3NbMF0gPSBjaG93biAocHRyIChyZWdzWzVdKSwgcmVnc1s2XSwgcmVnc1s3XSk7CisJICAgIGJyZWFrOworI2VuZGlmIC8qIF9XSU4zMiAqLworCSAgY2FzZSBTWVNfY2htb2Q6CisJICAgIHJlZ3NbMF0gPSBjaG1vZCAocHRyIChyZWdzWzVdKSwgcmVnc1s2XSk7CisJICAgIGJyZWFrOworCSAgY2FzZSBTWVNfdXRpbWU6CisJICAgIC8qIENhc3QgdGhlIHNlY29uZCBhcmd1bWVudCB0byB2b2lkICosIHRvIGF2b2lkIHR5cGUgbWlzbWF0Y2gKKwkgICAgICAgaWYgYSBwcm90b3R5cGUgaXMgcHJlc2VudC4gICovCisJICAgIHJlZ3NbMF0gPSB1dGltZSAocHRyIChyZWdzWzVdKSwgKHZvaWQgKikgcHRyIChyZWdzWzZdKSk7CisJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkgICAgYWJvcnQgKCk7CisJICB9CisJcmVnc1sxXSA9IGNhbGxiYWNrLT5nZXRfZXJybm8gKGNhbGxiYWNrKTsKKwllcnJubyA9IHBlcnJubzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAweGMzOgorICAgIGNhc2UgMjU1OgorICAgICAgc2F2ZWRfc3RhdGUuYXNyZWdzLmV4Y2VwdGlvbiA9IFNJR1RSQVA7CisgICAgICBicmVhazsKKyAgICB9CisKK30KKwordm9pZAorY29udHJvbF9jIChzaWcsIGNvZGUsIHNjcCwgYWRkcikKKyAgICAgaW50IHNpZzsKKyAgICAgaW50IGNvZGU7CisgICAgIGNoYXIgKnNjcDsKKyAgICAgY2hhciAqYWRkcjsKK3sKKyAgc2F2ZWRfc3RhdGUuYXNyZWdzLmV4Y2VwdGlvbiA9IFNJR0lOVDsKK30KKworc3RhdGljIGludAorZGl2MSAoUiwgaVJuMiwgaVJuMS8qLCBUKi8pCisgICAgIGludCAqUjsKKyAgICAgaW50IGlSbjE7CisgICAgIGludCBpUm4yOworICAgICAvKiBpbnQgVDsqLworeworICB1bnNpZ25lZCBsb25nIHRtcDA7CisgIHVuc2lnbmVkIGNoYXIgb2xkX3EsIHRtcDE7CisKKyAgb2xkX3EgPSBROworICBTRVRfU1JfUSAoKHVuc2lnbmVkIGNoYXIpICgoMHg4MDAwMDAwMCAmIFJbaVJuMV0pICE9IDApKTsKKyAgUltpUm4xXSA8PD0gMTsKKyAgUltpUm4xXSB8PSAodW5zaWduZWQgbG9uZykgVDsKKworICBzd2l0Y2ggKG9sZF9xKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBzd2l0Y2ggKE0pCisJeworCWNhc2UgMDoKKwkgIHRtcDAgPSBSW2lSbjFdOworCSAgUltpUm4xXSAtPSBSW2lSbjJdOworCSAgdG1wMSA9IChSW2lSbjFdID4gdG1wMCk7CisJICBzd2l0Y2ggKFEpCisJICAgIHsKKwkgICAgY2FzZSAwOgorCSAgICAgIFNFVF9TUl9RICh0bXAxKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAxOgorCSAgICAgIFNFVF9TUl9RICgodW5zaWduZWQgY2hhcikgKHRtcDEgPT0gMCkpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBicmVhazsKKwljYXNlIDE6CisJICB0bXAwID0gUltpUm4xXTsKKwkgIFJbaVJuMV0gKz0gUltpUm4yXTsKKwkgIHRtcDEgPSAoUltpUm4xXSA8IHRtcDApOworCSAgc3dpdGNoIChRKQorCSAgICB7CisJICAgIGNhc2UgMDoKKwkgICAgICBTRVRfU1JfUSAoKHVuc2lnbmVkIGNoYXIpICh0bXAxID09IDApKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAxOgorCSAgICAgIFNFVF9TUl9RICh0bXAxKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgc3dpdGNoIChNKQorCXsKKwljYXNlIDA6CisJICB0bXAwID0gUltpUm4xXTsKKwkgIFJbaVJuMV0gKz0gUltpUm4yXTsKKwkgIHRtcDEgPSAoUltpUm4xXSA8IHRtcDApOworCSAgc3dpdGNoIChRKQorCSAgICB7CisJICAgIGNhc2UgMDoKKwkgICAgICBTRVRfU1JfUSAodG1wMSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgMToKKwkgICAgICBTRVRfU1JfUSAoKHVuc2lnbmVkIGNoYXIpICh0bXAxID09IDApKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSAxOgorCSAgdG1wMCA9IFJbaVJuMV07CisJICBSW2lSbjFdIC09IFJbaVJuMl07CisJICB0bXAxID0gKFJbaVJuMV0gPiB0bXAwKTsKKwkgIHN3aXRjaCAoUSkKKwkgICAgeworCSAgICBjYXNlIDA6CisJICAgICAgU0VUX1NSX1EgKCh1bnNpZ25lZCBjaGFyKSAodG1wMSA9PSAwKSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgMToKKwkgICAgICBTRVRfU1JfUSAodG1wMSk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgLypUID0gKFEgPT0gTSk7Ki8KKyAgU0VUX1NSX1QgKFEgPT0gTSk7CisgIC8qcmV0dXJuIFQ7Ki8KK30KKworc3RhdGljIHZvaWQKK2RtdWwgKHNpZ24sIHJtLCBybikKKyAgICAgaW50IHNpZ247CisgICAgIHVuc2lnbmVkIGludCBybTsKKyAgICAgdW5zaWduZWQgaW50IHJuOworeworICB1bnNpZ25lZCBsb25nIFJuTCwgUm5IOworICB1bnNpZ25lZCBsb25nIFJtTCwgUm1IOworICB1bnNpZ25lZCBsb25nIHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworICB1bnNpZ25lZCBsb25nIFJlczIsIFJlczEsIFJlczA7CisKKyAgUm5MID0gcm4gJiAweGZmZmY7CisgIFJuSCA9IChybiA+PiAxNikgJiAweGZmZmY7CisgIFJtTCA9IHJtICYgMHhmZmZmOworICBSbUggPSAocm0gPj4gMTYpICYgMHhmZmZmOworICB0ZW1wMCA9IFJtTCAqIFJuTDsKKyAgdGVtcDEgPSBSbUggKiBSbkw7CisgIHRlbXAyID0gUm1MICogUm5IOworICB0ZW1wMyA9IFJtSCAqIFJuSDsKKyAgUmVzMiA9IDA7CisgIFJlczEgPSB0ZW1wMSArIHRlbXAyOworICBpZiAoUmVzMSA8IHRlbXAxKQorICAgIFJlczIgKz0gMHgwMDAxMDAwMDsKKyAgdGVtcDEgPSAoUmVzMSA8PCAxNikgJiAweGZmZmYwMDAwOworICBSZXMwID0gdGVtcDAgKyB0ZW1wMTsKKyAgaWYgKFJlczAgPCB0ZW1wMCkKKyAgICBSZXMyICs9IDE7CisgIFJlczIgKz0gKChSZXMxID4+IDE2KSAmIDB4ZmZmZikgKyB0ZW1wMzsKKyAgCisgIGlmIChzaWduKQorICAgIHsKKyAgICAgIGlmIChybiAmIDB4ODAwMDAwMDApCisJUmVzMiAtPSBybTsKKyAgICAgIGlmIChybSAmIDB4ODAwMDAwMDApCisJUmVzMiAtPSBybjsKKyAgICB9CisKKyAgTUFDSCA9IFJlczI7CisgIE1BQ0wgPSBSZXMwOworfQorCitzdGF0aWMgdm9pZAorbWFjdyAocmVncywgbWVtb3J5LCBuLCBtKQorICAgICBpbnQgKnJlZ3M7CisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKKyAgICAgaW50IG0sIG47Cit7CisgIGludCBsaXR0bGVfZW5kaWFuID0gdGFyZ2V0X2xpdHRsZV9lbmRpYW47CisgIGxvbmcgdGVtcG0sIHRlbXBuOworICBsb25nIHByb2QsIG1hY2wsIHN1bTsKKworICB0ZW1wbT1SU1dBVChyZWdzW21dKTsgcmVnc1ttXSs9MjsKKyAgdGVtcG49UlNXQVQocmVnc1tuXSk7IHJlZ3Nbbl0rPTI7CisKKyAgbWFjbCA9IE1BQ0w7CisgIHByb2QgPSAobG9uZykoc2hvcnQpIHRlbXBtICogKGxvbmcpKHNob3J0KSB0ZW1wbjsKKyAgc3VtID0gcHJvZCArIG1hY2w7CisgIGlmIChTKQorICAgIHsKKyAgICAgIGlmICgofihwcm9kIF4gbWFjbCkgJiAoc3VtIF4gcHJvZCkpIDwgMCkKKwl7CisJICAvKiBNQUNIJ3MgbHNiIGlzIGEgc3RpY2t5IG92ZXJmbG93IGJpdC4gICovCisJICBNQUNIIHw9IDE7CisJICAvKiBTdG9yZSB0aGUgc21hbGxlc3QgbmVnYXRpdmUgbnVtYmVyIGluIE1BQ0wgaWYgcHJvZCBpcworCSAgICAgbmVnYXRpdmUsIGFuZCB0aGUgbGFyZ2VzdCBwb3NpdGl2ZSBudW1iZXIgb3RoZXJ3aXNlLiAgKi8KKwkgIHN1bSA9IDB4N2ZmZmZmZmYgKyAocHJvZCA8IDApOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsb25nIG1hY2g7CisgICAgICAvKiBBZGQgdG8gTUFDSCB0aGUgc2lnbiBleHRlbmRlZCBwcm9kdWN0LCBhbmQgY2FycnkgZnJvbSBsb3cgc3VtLiAgKi8KKyAgICAgIG1hY2ggPSBNQUNIICsgKC0ocHJvZCA8IDApKSArICgodW5zaWduZWQgbG9uZykgc3VtIDwgcHJvZCk7CisgICAgICAvKiBTaWduIGV4dGVuZCBhdCAxMDp0aCBiaXQgaW4gTUFDSC4gICovCisgICAgICBNQUNIID0gKG1hY2ggJiAweDFmZikgfCAtKG1hY2ggJiAweDIwMCk7CisgICAgfQorICBNQUNMID0gc3VtOworfQorCisvKiBTZXQgdGhlIG1lbW9yeSBzaXplIHRvIHRoZSBwb3dlciBvZiB0d28gcHJvdmlkZWQuICovCisKK3ZvaWQKK3NpbV9zaXplIChwb3dlcikKKyAgICAgaW50IHBvd2VyOworCit7CisgIHNhdmVkX3N0YXRlLmFzcmVncy5tc2l6ZSA9IDEgPDwgcG93ZXI7CisKKyAgc2ltX21lbW9yeV9zaXplID0gcG93ZXI7CisKKyAgaWYgKHNhdmVkX3N0YXRlLmFzcmVncy5tZW1vcnkpCisgICAgeworICAgICAgZnJlZSAoc2F2ZWRfc3RhdGUuYXNyZWdzLm1lbW9yeSk7CisgICAgfQorCisgIHNhdmVkX3N0YXRlLmFzcmVncy5tZW1vcnkgPQorICAgICh1bnNpZ25lZCBjaGFyICopIGNhbGxvYyAoNjQsIHNhdmVkX3N0YXRlLmFzcmVncy5tc2l6ZSAvIDY0KTsKKworICBpZiAoIXNhdmVkX3N0YXRlLmFzcmVncy5tZW1vcnkpCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLAorCSAgICAgICAiTm90IGVub3VnaCBWTSBmb3Igc2ltdWxhdGlvbiBvZiAlZCBieXRlcyBvZiBSQU1cbiIsCisJICAgICAgIHNhdmVkX3N0YXRlLmFzcmVncy5tc2l6ZSk7CisKKyAgICAgIHNhdmVkX3N0YXRlLmFzcmVncy5tc2l6ZSA9IDE7CisgICAgICBzYXZlZF9zdGF0ZS5hc3JlZ3MubWVtb3J5ID0gKHVuc2lnbmVkIGNoYXIgKikgY2FsbG9jICgxLCAxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitpbml0X3BvaW50ZXJzICgpCit7CisgIGhvc3RfbGl0dGxlX2VuZGlhbiA9IDA7CisgICooY2hhciopJmhvc3RfbGl0dGxlX2VuZGlhbiA9IDE7CisgIGhvc3RfbGl0dGxlX2VuZGlhbiAmPSAxOworCisgIGlmIChzYXZlZF9zdGF0ZS5hc3JlZ3MubXNpemUgIT0gMSA8PCBzaW1fbWVtb3J5X3NpemUpCisgICAgeworICAgICAgc2ltX3NpemUgKHNpbV9tZW1vcnlfc2l6ZSk7CisgICAgfQorCisgIGlmIChzYXZlZF9zdGF0ZS5hc3JlZ3MucHJvZmlsZSAmJiAhcHJvZmlsZV9maWxlKQorICAgIHsKKyAgICAgIHByb2ZpbGVfZmlsZSA9IGZvcGVuICgiZ21vbi5vdXQiLCAid2IiKTsKKyAgICAgIC8qIFNlZWsgdG8gd2hlcmUgdG8gcHV0IHRoZSBjYWxsIGFyYyBkYXRhICovCisgICAgICBuc2FtcGxlcyA9ICgxIDw8IHNpbV9wcm9maWxlX3NpemUpOworCisgICAgICBmc2VlayAocHJvZmlsZV9maWxlLCBuc2FtcGxlcyAqIDIgKyAxMiwgMCk7CisKKyAgICAgIGlmICghcHJvZmlsZV9maWxlKQorCXsKKwkgIGZwcmludGYgKHN0ZGVyciwgIkNhbid0IG9wZW4gZ21vbi5vdXRcbiIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzYXZlZF9zdGF0ZS5hc3JlZ3MucHJvZmlsZV9oaXN0ID0KKwkgICAgKHVuc2lnbmVkIHNob3J0ICopIGNhbGxvYyAoNjQsIChuc2FtcGxlcyAqIHNpemVvZiAoc2hvcnQpIC8gNjQpKTsKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZHVtcF9wcm9maWxlICgpCit7CisgIHVuc2lnbmVkIGludCBtaW5wYzsKKyAgdW5zaWduZWQgaW50IG1heHBjOworICB1bnNpZ25lZCBzaG9ydCAqcDsKKyAgaW50IGk7CisKKyAgcCA9IHNhdmVkX3N0YXRlLmFzcmVncy5wcm9maWxlX2hpc3Q7CisgIG1pbnBjID0gMDsKKyAgbWF4cGMgPSAoMSA8PCBzaW1fcHJvZmlsZV9zaXplKTsKKworICBmc2VlayAocHJvZmlsZV9maWxlLCAwTCwgMCk7CisgIHN3YXBvdXQgKG1pbnBjIDw8IFBST0ZJTEVfU0hJRlQpOworICBzd2Fwb3V0IChtYXhwYyA8PCBQUk9GSUxFX1NISUZUKTsKKyAgc3dhcG91dCAobnNhbXBsZXMgKiAyICsgMTIpOworICBmb3IgKGkgPSAwOyBpIDwgbnNhbXBsZXM7IGkrKykKKyAgICBzd2Fwb3V0MTYgKHNhdmVkX3N0YXRlLmFzcmVncy5wcm9maWxlX2hpc3RbaV0pOworCit9CisKK3N0YXRpYyB2b2lkCitnb3RjYWxsIChmcm9tLCB0bykKKyAgICAgaW50IGZyb207CisgICAgIGludCB0bzsKK3sKKyAgc3dhcG91dCAoZnJvbSk7CisgIHN3YXBvdXQgKHRvKTsKKyAgc3dhcG91dCAoMSk7Cit9CisKKyNkZWZpbmUgTU1BU0tCICgoc2F2ZWRfc3RhdGUuYXNyZWdzLm1zaXplIC0xKSAmIH4wKQorCitpbnQKK3NpbV9zdG9wIChzZCkKKyAgICAgU0lNX0RFU0Mgc2Q7Cit7CisgIHNhdmVkX3N0YXRlLmFzcmVncy5leGNlcHRpb24gPSBTSUdJTlQ7CisgIHJldHVybiAxOworfQorCit2b2lkCitzaW1fcmVzdW1lIChzZCwgc3RlcCwgc2lnZ25hbCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCBzdGVwLCBzaWdnbmFsOworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgcGM7CisgIHJlZ2lzdGVyIGludCBjeWNsZXMgPSAwOworICByZWdpc3RlciBpbnQgc3RhbGxzID0gMDsKKyAgcmVnaXN0ZXIgaW50IG1lbXN0YWxscyA9IDA7CisgIHJlZ2lzdGVyIGludCBpbnN0cyA9IDA7CisgIHJlZ2lzdGVyIGludCBwcmV2bG9jazsKKyAgcmVnaXN0ZXIgaW50IHRoaXNsb2NrOworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgZG9wcm9maWxlOworICByZWdpc3RlciBpbnQgcG9sbGNvdW50ID0gMDsKKyAgcmVnaXN0ZXIgaW50IGxpdHRsZV9lbmRpYW4gPSB0YXJnZXRfbGl0dGxlX2VuZGlhbjsKKworICBpbnQgdGlja19zdGFydCA9IGdldF9ub3cgKCk7CisgIHZvaWQgKCpwcmV2KSAoKTsKKyAgdm9pZCAoKnByZXZfZnBlKSAoKTsKKyAgZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc2hfanVtcF90YWJsZTBbXTsKKworICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpqdW1wX3RhYmxlID0gc2hfanVtcF90YWJsZTA7CisKKyAgcmVnaXN0ZXIgaW50ICpSID0gJihzYXZlZF9zdGF0ZS5hc3JlZ3MucmVnc1swXSk7CisgIC8qcmVnaXN0ZXIgaW50IFQ7Ki8KKyAgcmVnaXN0ZXIgaW50IFBSOworCisgIHJlZ2lzdGVyIGludCBtYXNrYiA9ICgoc2F2ZWRfc3RhdGUuYXNyZWdzLm1zaXplIC0gMSkgJiB+MCk7CisgIHJlZ2lzdGVyIGludCBtYXNrdyA9ICgoc2F2ZWRfc3RhdGUuYXNyZWdzLm1zaXplIC0gMSkgJiB+MSk7CisgIHJlZ2lzdGVyIGludCBtYXNrbCA9ICgoc2F2ZWRfc3RhdGUuYXNyZWdzLm1zaXplIC0gMSkgJiB+Myk7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHNiaXQgPSAoKHVuc2lnbmVkIGludCkgMSA8PCAzMSk7CisKKyAgcHJldiA9IHNpZ25hbCAoU0lHSU5ULCBjb250cm9sX2MpOworICBwcmV2X2ZwZSA9IHNpZ25hbCAoU0lHRlBFLCBTSUdfSUdOKTsKKworICBpbml0X3BvaW50ZXJzICgpOworCisgIG1lbW9yeSA9IHNhdmVkX3N0YXRlLmFzcmVncy5tZW1vcnk7CisKKyAgaWYgKHN0ZXApCisgICAgeworICAgICAgc2F2ZWRfc3RhdGUuYXNyZWdzLmV4Y2VwdGlvbiA9IFNJR1RSQVA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2F2ZWRfc3RhdGUuYXNyZWdzLmV4Y2VwdGlvbiA9IDA7CisgICAgfQorCisgIHBjID0gc2F2ZWRfc3RhdGUuYXNyZWdzLnBjOworICBQUiA9IHNhdmVkX3N0YXRlLmFzcmVncy5wcjsKKyAgLypUID0gR0VUX1NSICgpICYgU1JfTUFTS19UOyovCisgIHByZXZsb2NrID0gc2F2ZWRfc3RhdGUuYXNyZWdzLnByZXZsb2NrOworICB0aGlzbG9jayA9IHNhdmVkX3N0YXRlLmFzcmVncy50aGlzbG9jazsKKyAgZG9wcm9maWxlID0gc2F2ZWRfc3RhdGUuYXNyZWdzLnByb2ZpbGU7CisKKyAgLyogSWYgcHJvZmlsaW5nIG5vdCBlbmFibGVkLCBkaXNhYmxlIGl0IGJ5IGFza2luZyBmb3IKKyAgICAgcHJvZmlsZXMgaW5mcmVxdWVudGx5LiAqLworICBpZiAoZG9wcm9maWxlID09IDApCisgICAgZG9wcm9maWxlID0gfjA7CisKKyAgZG8KKyAgICB7CisgICAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaXdvcmQgPSBSVVdBVCAocGMpOworICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHVsdDsKKyAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBuaWEgPSBwYyArIDI7CisjaWZuZGVmIEFDRV9GQVNUCisgICAgICBpbnN0cysrOworI2VuZGlmCisgICAgdG9wOgorCisjaW5jbHVkZSAiY29kZS5jIgorCisKKyAgICAgIHBjID0gbmlhOworCisgICAgICBpZiAoLS1wb2xsY291bnQgPCAwKQorCXsKKwkgIHBvbGxjb3VudCA9IDEwMDA7CisJICBpZiAoKCpjYWxsYmFjay0+cG9sbF9xdWl0KSAhPSBOVUxMCisJICAgICAgJiYgKCpjYWxsYmFjay0+cG9sbF9xdWl0KSAoY2FsbGJhY2spKQorCSAgICB7CisJICAgICAgc2ltX3N0b3AgKHNkKTsKKwkgICAgfQkgICAgCisJfQorCisjaWZuZGVmIEFDRV9GQVNUCisgICAgICBwcmV2bG9jayA9IHRoaXNsb2NrOworICAgICAgdGhpc2xvY2sgPSAzMDsKKyAgICAgIGN5Y2xlcysrOworCisgICAgICBpZiAoY3ljbGVzID49IGRvcHJvZmlsZSkKKwl7CisKKwkgIHNhdmVkX3N0YXRlLmFzcmVncy5jeWNsZXMgKz0gZG9wcm9maWxlOworCSAgY3ljbGVzIC09IGRvcHJvZmlsZTsKKwkgIGlmIChzYXZlZF9zdGF0ZS5hc3JlZ3MucHJvZmlsZV9oaXN0KQorCSAgICB7CisJICAgICAgaW50IG4gPSBwYyA+PiBQUk9GSUxFX1NISUZUOworCSAgICAgIGlmIChuIDwgbnNhbXBsZXMpCisJCXsKKwkJICBpbnQgaSA9IHNhdmVkX3N0YXRlLmFzcmVncy5wcm9maWxlX2hpc3Rbbl07CisJCSAgaWYgKGkgPCA2NTAwMCkKKwkJICAgIHNhdmVkX3N0YXRlLmFzcmVncy5wcm9maWxlX2hpc3Rbbl0gPSBpICsgMTsKKwkJfQorCisJICAgIH0KKwl9CisjZW5kaWYKKyAgICB9CisgIHdoaWxlICghc2F2ZWRfc3RhdGUuYXNyZWdzLmV4Y2VwdGlvbik7CisKKyAgaWYgKHNhdmVkX3N0YXRlLmFzcmVncy5leGNlcHRpb24gPT0gU0lHSUxMCisgICAgICB8fCBzYXZlZF9zdGF0ZS5hc3JlZ3MuZXhjZXB0aW9uID09IFNJR0JVUykKKyAgICB7CisgICAgICBwYyAtPSAyOworICAgIH0KKworICBzYXZlZF9zdGF0ZS5hc3JlZ3MudGlja3MgKz0gZ2V0X25vdyAoKSAtIHRpY2tfc3RhcnQ7CisgIHNhdmVkX3N0YXRlLmFzcmVncy5jeWNsZXMgKz0gY3ljbGVzOworICBzYXZlZF9zdGF0ZS5hc3JlZ3Muc3RhbGxzICs9IHN0YWxsczsKKyAgc2F2ZWRfc3RhdGUuYXNyZWdzLm1lbXN0YWxscyArPSBtZW1zdGFsbHM7CisgIHNhdmVkX3N0YXRlLmFzcmVncy5pbnN0cyArPSBpbnN0czsKKyAgc2F2ZWRfc3RhdGUuYXNyZWdzLnBjID0gcGM7CisgIC8qIHJlc3RvcmUgdGhlIFQgYW5kIG90aGVyIGNhY2hlZCBTUiBiaXRzICovCisgIFNFVF9TUiAoR0VUX1NSKCkpOworICBzYXZlZF9zdGF0ZS5hc3JlZ3MucHIgPSBQUjsKKworICBzYXZlZF9zdGF0ZS5hc3JlZ3MucHJldmxvY2sgPSBwcmV2bG9jazsKKyAgc2F2ZWRfc3RhdGUuYXNyZWdzLnRoaXNsb2NrID0gdGhpc2xvY2s7CisKKyAgaWYgKHByb2ZpbGVfZmlsZSkKKyAgICB7CisgICAgICBkdW1wX3Byb2ZpbGUgKCk7CisgICAgfQorCisgIHNpZ25hbCAoU0lHRlBFLCBwcmV2X2ZwZSk7CisgIHNpZ25hbCAoU0lHSU5ULCBwcmV2KTsKK30KKworaW50CitzaW1fd3JpdGUgKHNkLCBhZGRyLCBidWZmZXIsIHNpemUpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBTSU1fQUREUiBhZGRyOworICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgICAgIGludCBzaXplOworeworICBpbnQgaTsKKworICBpbml0X3BvaW50ZXJzICgpOworCisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgeworICAgICAgc2F2ZWRfc3RhdGUuYXNyZWdzLm1lbW9yeVtNTUFTS0IgJiAoYWRkciArIGkpXSA9IGJ1ZmZlcltpXTsKKyAgICB9CisgIHJldHVybiBzaXplOworfQorCitpbnQKK3NpbV9yZWFkIChzZCwgYWRkciwgYnVmZmVyLCBzaXplKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgU0lNX0FERFIgYWRkcjsKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICAgICBpbnQgc2l6ZTsKK3sKKyAgaW50IGk7CisKKyAgaW5pdF9wb2ludGVycyAoKTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHsKKyAgICAgIGJ1ZmZlcltpXSA9IHNhdmVkX3N0YXRlLmFzcmVncy5tZW1vcnlbTU1BU0tCICYgKGFkZHIgKyBpKV07CisgICAgfQorICByZXR1cm4gc2l6ZTsKK30KKworLyogV2UgaGF2ZSB0byBhZGQgb25lIHRvIFJOIGFzIGFuIGluZGV4IGludG8gYXNpbnRzIGJlY2F1c2Ugb2YgdGhlIHBhZGRpbmcKKyAgIGFkZGVkIGF0IHRoZSBzdGFydCBvZiBhc3JlZ3MuICAqLworaW50CitzaW1fc3RvcmVfcmVnaXN0ZXIgKHNkLCBybiwgbWVtb3J5LCBsZW5ndGgpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgcm47CisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgaW50IGxpdHRsZV9lbmRpYW47CisgIGluaXRfcG9pbnRlcnMgKCk7CisgIGxpdHRsZV9lbmRpYW4gPSB0YXJnZXRfbGl0dGxlX2VuZGlhbjsKKyAgaWYgKCZzYXZlZF9zdGF0ZS5hc2ludHNbcm4rMV0KKyAgICAgID09ICZzYXZlZF9zdGF0ZS5hc3JlZ3MuZnBzY3IpCisgICAgc2V0X2Zwc2NyMSAoUkxBVCgwKSk7CisgIGVsc2UKKyAgICBzYXZlZF9zdGF0ZS5hc2ludHNbcm4rMV0gPSBSTEFUKDApOworICByZXR1cm4gLTE7Cit9CisKK2ludAorc2ltX2ZldGNoX3JlZ2lzdGVyIChzZCwgcm4sIG1lbW9yeSwgbGVuZ3RoKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgaW50IHJuOworICAgICB1bnNpZ25lZCBjaGFyICptZW1vcnk7CisgICAgIGludCBsZW5ndGg7Cit7CisgIGludCBsaXR0bGVfZW5kaWFuOworICBpbml0X3BvaW50ZXJzICgpOworICBsaXR0bGVfZW5kaWFuID0gdGFyZ2V0X2xpdHRsZV9lbmRpYW47CisgIFdMQVQgKDAsIHNhdmVkX3N0YXRlLmFzaW50c1tybisxXSk7CisgIHJldHVybiAtMTsKK30KKworaW50CitzaW1fdHJhY2UgKHNkKQorICAgICBTSU1fREVTQyBzZDsKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3NpbV9zdG9wX3JlYXNvbiAoc2QsIHJlYXNvbiwgc2lncmMpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBlbnVtIHNpbV9zdG9wICpyZWFzb247CisgICAgIGludCAqc2lncmM7Cit7CisgIC8qIFRoZSBTSCBzaW11bGF0b3IgdXNlcyBTSUdRVUlUIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb2dyYW0gaGFzCisgICAgIGV4aXRlZCwgc28gd2UgbXVzdCBjaGVjayBmb3IgaXQgaGVyZSBhbmQgdHJhbnNsYXRlIGl0IHRvIGV4aXQuICAqLworICBpZiAoc2F2ZWRfc3RhdGUuYXNyZWdzLmV4Y2VwdGlvbiA9PSBTSUdRVUlUKQorICAgIHsKKyAgICAgICpyZWFzb24gPSBzaW1fZXhpdGVkOworICAgICAgKnNpZ3JjID0gc2F2ZWRfc3RhdGUuYXNyZWdzLnJlZ3NbNV07CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgKnJlYXNvbiA9IHNpbV9zdG9wcGVkOworICAgICAgKnNpZ3JjID0gc2F2ZWRfc3RhdGUuYXNyZWdzLmV4Y2VwdGlvbjsKKyAgICB9Cit9CisKK3ZvaWQKK3NpbV9pbmZvIChzZCwgdmVyYm9zZSkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCB2ZXJib3NlOworeworICBkb3VibGUgdGltZXRha2VuID0gKGRvdWJsZSkgc2F2ZWRfc3RhdGUuYXNyZWdzLnRpY2tzIC8gKGRvdWJsZSkgbm93X3BlcnNlYyAoKTsKKyAgZG91YmxlIHZpcnR0aW1lID0gc2F2ZWRfc3RhdGUuYXNyZWdzLmN5Y2xlcyAvIDM2LjBlNjsKKworICBjYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkIChjYWxsYmFjaywgIlxuXG4jIGluc3RydWN0aW9ucyBleGVjdXRlZCAgJTEwZFxuIiwgCisJCQkgICAgIHNhdmVkX3N0YXRlLmFzcmVncy5pbnN0cyk7CisgIGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQgKGNhbGxiYWNrLCAiIyBjeWNsZXMgICAgICAgICAgICAgICAgICUxMGRcbiIsCisJCQkgICAgIHNhdmVkX3N0YXRlLmFzcmVncy5jeWNsZXMpOworICBjYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkIChjYWxsYmFjaywgIiMgcGlwZWxpbmUgc3RhbGxzICAgICAgICAlMTBkXG4iLAorCQkJICAgICBzYXZlZF9zdGF0ZS5hc3JlZ3Muc3RhbGxzKTsKKyAgY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCAoY2FsbGJhY2ssICIjIG1pc2FsaWduZWQgbG9hZC9zdG9yZSAgJTEwZFxuIiwKKwkJCSAgICAgc2F2ZWRfc3RhdGUuYXNyZWdzLm1lbXN0YWxscyk7CisgIGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQgKGNhbGxiYWNrLCAiIyByZWFsIHRpbWUgdGFrZW4gICAgICAgICUxMC40ZlxuIiwKKwkJCSAgICAgdGltZXRha2VuKTsKKyAgY2FsbGJhY2stPnByaW50Zl9maWx0ZXJlZCAoY2FsbGJhY2ssICIjIHZpcnR1YWwgdGltZSB0YWtlbiAgICAgJTEwLjRmXG4iLAorCQkJICAgICB2aXJ0dGltZSk7CisgIGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQgKGNhbGxiYWNrLCAiIyBwcm9maWxpbmcgc2l6ZSAgICAgICAgICUxMGRcbiIsCisJCQkgICAgIHNpbV9wcm9maWxlX3NpemUpOworICBjYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkIChjYWxsYmFjaywgIiMgcHJvZmlsaW5nIGZyZXF1ZW5jeSAgICAlMTBkXG4iLAorCQkJICAgICBzYXZlZF9zdGF0ZS5hc3JlZ3MucHJvZmlsZSk7CisgIGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQgKGNhbGxiYWNrLCAiIyBwcm9maWxlIG1heHBjICAgICAgICAgICUxMHhcbiIsCisJCQkgICAgICgxIDw8IHNpbV9wcm9maWxlX3NpemUpIDw8IFBST0ZJTEVfU0hJRlQpOworCisgIGlmICh0aW1ldGFrZW4gIT0gMCkKKyAgICB7CisgICAgICBjYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkIChjYWxsYmFjaywgIiMgY3ljbGVzL3NlY29uZCAgICAgICAgICAlMTBkXG4iLCAKKwkJCQkgKGludCkgKHNhdmVkX3N0YXRlLmFzcmVncy5jeWNsZXMgLyB0aW1ldGFrZW4pKTsKKyAgICAgIGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQgKGNhbGxiYWNrLCAiIyBzaW11bGF0aW9uIHJhdGlvICAgICAgICUxMC40ZlxuIiwgCisJCQkJIHZpcnR0aW1lIC8gdGltZXRha2VuKTsKKyAgICB9Cit9CisKK3ZvaWQKK3NpbV9zZXRfcHJvZmlsZSAobikKKyAgICAgaW50IG47Cit7CisgIHNhdmVkX3N0YXRlLmFzcmVncy5wcm9maWxlID0gbjsKK30KKwordm9pZAorc2ltX3NldF9wcm9maWxlX3NpemUgKG4pCisgICAgIGludCBuOworeworICBzaW1fcHJvZmlsZV9zaXplID0gbjsKK30KKworU0lNX0RFU0MKK3NpbV9vcGVuIChraW5kLCBjYiwgYWJmZCwgYXJndikKKyAgICAgU0lNX09QRU5fS0lORCBraW5kOworICAgICBob3N0X2NhbGxiYWNrICpjYjsKKyAgICAgc3RydWN0IF9iZmQgKmFiZmQ7CisgICAgIGNoYXIgKiphcmd2OworeworICBjaGFyICoqcDsKKyAgaW50IGVuZGlhbl9zZXQgPSAwOworCisgIHNpbV9raW5kID0ga2luZDsKKyAgbXluYW1lID0gYXJndlswXTsKKyAgY2FsbGJhY2sgPSBjYjsKKworICBmb3IgKHAgPSBhcmd2ICsgMTsgKnAgIT0gTlVMTDsgKytwKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKCpwLCAiLUUiKSA9PSAwKQorCXsKKwkgICsrcDsKKwkgIGlmICgqcCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgLyogRklYTUU6IFRoaXMgZG9lc24ndCB1c2Ugc3RkZXJyLCBidXQgdGhlbiB0aGUgcmVzdCBvZiB0aGUKKwkJIGZpbGUgZG9lc24ndCBlaXRoZXIuICAqLworCSAgICAgIGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQgKGNhbGxiYWNrLCAiTWlzc2luZyBhcmd1bWVudCB0byBgLUUnLlxuIik7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKwkgIHRhcmdldF9saXR0bGVfZW5kaWFuID0gc3RyY21wICgqcCwgImJpZyIpICE9IDA7CisgICAgICAgICAgZW5kaWFuX3NldCA9IDE7CisJfQorICAgICAgZWxzZSBpZiAoaXNkaWdpdCAoKipwKSkKKwlwYXJzZV9hbmRfc2V0X21lbW9yeV9zaXplICgqcCk7CisgICAgfQorCisgIGlmIChhYmZkICE9IE5VTEwgJiYgISBlbmRpYW5fc2V0KQorICAgICAgdGFyZ2V0X2xpdHRsZV9lbmRpYW4gPSAhIGJmZF9iaWdfZW5kaWFuIChhYmZkKTsKKworICAvKiBmdWRnZSBvdXIgZGVzY3JpcHRvciBmb3Igbm93ICovCisgIHJldHVybiAoU0lNX0RFU0MpIDE7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9hbmRfc2V0X21lbW9yeV9zaXplIChzdHIpCisgICAgIGNoYXIgKnN0cjsKK3sKKyAgaW50IG47CisKKyAgbiA9IHN0cnRvbCAoc3RyLCBOVUxMLCAxMCk7CisgIGlmIChuID4gMCAmJiBuIDw9IDI0KQorICAgIHNpbV9tZW1vcnlfc2l6ZSA9IG47CisgIGVsc2UKKyAgICBjYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkIChjYWxsYmFjaywgIkJhZCBtZW1vcnkgc2l6ZSAlZDsgbXVzdCBiZSAxIHRvIDI0LCBpbmNsdXNpdmVcbiIsIG4pOworfQorCit2b2lkCitzaW1fY2xvc2UgKHNkLCBxdWl0dGluZykKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCBxdWl0dGluZzsKK3sKKyAgLyogbm90aGluZyB0byBkbyAqLworfQorCitTSU1fUkMKK3NpbV9sb2FkIChzZCwgcHJvZywgYWJmZCwgZnJvbV90dHkpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBjaGFyICpwcm9nOworICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZXh0ZXJuIGJmZCAqc2ltX2xvYWRfZmlsZSAoKTsgLyogPz8/IERvbid0IGtub3cgd2hlcmUgdGhpcyBzaG91bGQgbGl2ZS4gICovCisgIGJmZCAqcHJvZ19iZmQ7CisKKyAgcHJvZ19iZmQgPSBzaW1fbG9hZF9maWxlIChzZCwgbXluYW1lLCBjYWxsYmFjaywgcHJvZywgYWJmZCwKKwkJCSAgICBzaW1fa2luZCA9PSBTSU1fT1BFTl9ERUJVRywKKwkJCSAgICAwLCBzaW1fd3JpdGUpOworICBpZiAocHJvZ19iZmQgPT0gTlVMTCkKKyAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisgIGlmIChhYmZkID09IE5VTEwpCisgICAgYmZkX2Nsb3NlIChwcm9nX2JmZCk7CisgIHJldHVybiBTSU1fUkNfT0s7Cit9CisKK1NJTV9SQworc2ltX2NyZWF0ZV9pbmZlcmlvciAoc2QsIHByb2dfYmZkLCBhcmd2LCBlbnYpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBzdHJ1Y3QgX2JmZCAqcHJvZ19iZmQ7CisgICAgIGNoYXIgKiphcmd2OworICAgICBjaGFyICoqZW52OworeworICAvKiBjbGVhciB0aGUgcmVnaXN0ZXJzICovCisgIG1lbXNldCAoJnNhdmVkX3N0YXRlLCAwLAorCSAgKGNoYXIqKSZzYXZlZF9zdGF0ZS5hc3JlZ3MuZW5kX29mX3JlZ2lzdGVycyAtIChjaGFyKikmc2F2ZWRfc3RhdGUpOworICAvKiBzZXQgdGhlIFBDICovCisgIGlmIChwcm9nX2JmZCAhPSBOVUxMKQorICAgIHNhdmVkX3N0YXRlLmFzcmVncy5wYyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAocHJvZ19iZmQpOworICByZXR1cm4gU0lNX1JDX09LOworfQorCit2b2lkCitzaW1fZG9fY29tbWFuZCAoc2QsIGNtZCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGNoYXIgKmNtZDsKK3sKKyAgY2hhciAqc21zX2NtZCA9ICJzZXQtbWVtb3J5LXNpemUiOworICBpbnQgY21kc2l6ZTsKKworICBpZiAoY21kID09IE5VTEwgfHwgKmNtZCA9PSAnXDAnKQorICAgIHsKKyAgICAgIGNtZCA9ICJoZWxwIjsKKyAgICB9CisKKyAgY21kc2l6ZSA9IHN0cmxlbiAoc21zX2NtZCk7CisgIGlmIChzdHJuY21wIChjbWQsIHNtc19jbWQsIGNtZHNpemUpID09IDAgJiYgc3RyY2hyICgiIFx0IiwgY21kW2NtZHNpemVdKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHBhcnNlX2FuZF9zZXRfbWVtb3J5X3NpemUgKGNtZCArIGNtZHNpemUgKyAxKTsKKyAgICB9CisgIGVsc2UgaWYgKHN0cmNtcCAoY21kLCAiaGVscCIpID09IDApCisgICAgeworICAgICAgKGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChjYWxsYmFjaywgIkxpc3Qgb2YgU0ggc2ltdWxhdG9yIGNvbW1hbmRzOlxuXG4iKTsKKyAgICAgIChjYWxsYmFjay0+cHJpbnRmX2ZpbHRlcmVkKSAoY2FsbGJhY2ssICJzZXQtbWVtb3J5LXNpemUgPG4+IC0tIFNldCB0aGUgbnVtYmVyIG9mIGFkZHJlc3MgYml0cyB0byB1c2VcbiIpOworICAgICAgKGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChjYWxsYmFjaywgIlxuIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgKGNhbGxiYWNrLT5wcmludGZfZmlsdGVyZWQpIChjYWxsYmFjaywgIkVycm9yOiBcIiVzXCIgaXMgbm90IGEgdmFsaWQgU0ggc2ltdWxhdG9yIGNvbW1hbmQuXG4iLCBjbWQpOworICAgIH0KK30KKwordm9pZAorc2ltX3NldF9jYWxsYmFja3MgKHApCisgICAgIGhvc3RfY2FsbGJhY2sgKnA7Cit7CisgIGNhbGxiYWNrID0gcDsKK30KZGlmZiAtLWdpdCBhL3NpbS9zaC9zeXNjYWxsLmggYi9zaW0vc2gvc3lzY2FsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMTU0NDcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vc2gvc3lzY2FsbC5oCkBAIC0wLDAgKzEsMzMgQEAKKworLyogISEhIERBTkdFUiAhISEKKyAgIFRoaXMgd2FzIGNvcGllZCBmcm9tIG5ld2xpYi4gKi8KKworCisjZGVmaW5lCVNZU19leGl0CTEKKyNkZWZpbmUJU1lTX2ZvcmsJMgorI2RlZmluZQlTWVNfcmVhZAkzCisjZGVmaW5lCVNZU193cml0ZQk0CisjZGVmaW5lCVNZU19vcGVuCTUKKyNkZWZpbmUJU1lTX2Nsb3NlCTYKKyNkZWZpbmUJU1lTX3dhaXQ0CTcKKyNkZWZpbmUJU1lTX2NyZWF0CTgKKyNkZWZpbmUJU1lTX2xpbmsJOQorI2RlZmluZQlTWVNfdW5saW5rCTEwCisjZGVmaW5lCVNZU19leGVjdgkxMQorI2RlZmluZQlTWVNfY2hkaXIJMTIKKyNkZWZpbmUJU1lTX21rbm9kCTE0CisjZGVmaW5lCVNZU19jaG1vZAkxNQorI2RlZmluZQlTWVNfY2hvd24JMTYKKyNkZWZpbmUJU1lTX2xzZWVrCTE5CisjZGVmaW5lCVNZU19nZXRwaWQJMjAKKyNkZWZpbmUgU1lTX2lzYXR0eSAgICAgIDIxCisjZGVmaW5lIFNZU19mc3RhdCAgICAgICAyMgorI2RlZmluZSBTWVNfdGltZSAJMjMKKyNkZWZpbmUgU1lTX0FSRwkJMjQKKyNkZWZpbmUJU1lTX3N0YXQJMzgKKyNkZWZpbmUJU1lTX3BpcGUJNDIKKyNkZWZpbmUJU1lTX2V4ZWN2ZQk1OQorI2RlZmluZSBTWVNfdXRpbWUgICAgICAgMjAxIC8qIG5vdCByZWFsbHkgYSBzeXN0ZW0gY2FsbCAqLworI2RlZmluZSBTWVNfd2FpdCAgICAgICAgMjAyIC8qIG5vciBpcyB0aGlzICovCisKKwpkaWZmIC0tZ2l0IGEvc2ltL3NoL3Rjb25maWcuaW4gYi9zaW0vc2gvdGNvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWVjNGZhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3NoL3Rjb25maWcuaW4KQEAgLTAsMCArMSwxNyBAQAorLyogc2ggdGFyZ2V0IGNvbmZpZyBmaWxlICovCisKKy8qIERlZmluZSB0aGlzIGlmIHRoZSBzaW11bGF0b3Igc3VwcG9ydHMgcHJvZmlsaW5nLgorICAgU2VlIHRoZSBtaXBzIHNpbXVsYXRvciBmb3IgYW4gZXhhbXBsZS4KKyAgIFRoaXMgZW5hYmxlcyB0aGUgYC1wIGZvbycgYW5kIGAtcyBiYXInIG9wdGlvbnMuCisgICBUaGUgdGFyZ2V0IGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgc2ltX3NldF9wcm9maWxleyxfc2l6ZX0uICAqLworLyogI2RlZmluZSBTSU1fSEFWRV9QUk9GSUxFICovCisKKy8qIERlZmluZSB0aGlzIGlmIHRoZSBzaW11bGF0b3IgdXNlcyBhbiBpbnN0cnVjdGlvbiBjYWNoZS4KKyAgIFNlZSB0aGUgaDgvMzAwIHNpbXVsYXRvciBmb3IgYW4gZXhhbXBsZS4KKyAgIFRoaXMgZW5hYmxlcyB0aGUgYC1jIHNpemUnIG9wdGlvbiB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGNhY2hlLgorICAgVGhlIHRhcmdldCBpcyByZXF1aXJlZCB0byBwcm92aWRlIHNpbV9zZXRfc2ltY2FjaGVfc2l6ZS4gICovCisvKiAjZGVmaW5lIFNJTV9IQVZFX1NJTUNBQ0hFICovCisKKy8qIERlZmluZSB0aGlzIGlmIHRoZSB0YXJnZXQgY3B1IGlzIGJpLWVuZGlhbgorICAgYW5kIHRoZSBzaW11bGF0b3Igc3VwcG9ydHMgaXQuICAqLworI2RlZmluZSBTSU1fSEFWRV9CSUVORElBTgpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cgYi9zaW0vdGVzdHN1aXRlL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODYzNDgyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cKQEAgLTAsMCArMSwzMjEgQEAKK0ZyaSBGZWIgIDUgMTI6NDE6MTEgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbGliL3NpbS1kZWZzLmV4cCAoc2ltX3J1bik6IFByaW50IHNpbXVsYXRvciBhcmd1bWVudHMgbG9nIG1lc3NhZ2UuCisKKzE5OTktMDEtMDUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogbGliL3NpbS1kZWZzLmV4cCAocnVuX3NpbV90ZXN0KTogTmV3IGFyZyBhbGxfbWFjaHMuCisJKiBzaW0vZnIzMC9hbGxpbnNuLmV4cDogVXBkYXRlLgorCSogc2ltL2ZyMzAvbWlzYy5leHA6IFVwZGF0ZS4KKwkqIHNpbS9tMzJyL2FsbGluc24uZXhwOiBVcGRhdGUuCisJKiBzaW0vbTMyci9taXNjLmV4cDogVXBkYXRlLgorCitGcmkgRGVjIDE4IDE3OjE5OjM0IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogc2ltL2ZyMzAvbGRyZXMuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9jb3BsZC5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL2NvcHN0LmNnczogTmV3IHRlc3RjYXNlLgorCSogc2ltL2ZyMzAvY29wc3YuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9ub3AuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9hbmRjY3IuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9vcmNjci5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL2FkZHNwLmNnczogTmV3IHRlc3RjYXNlLgorCSogc2ltL2ZyMzAvc3RpbG0uY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9leHRzYi5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL2V4dHViLmNnczogTmV3IHRlc3RjYXNlLgorCSogc2ltL2ZyMzAvZXh0c2guY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9leHR1aC5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL2VudGVyLmNnczogTmV3IHRlc3RjYXNlLgorCSogc2ltL2ZyMzAvbGVhdmUuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC94Y2hiLmNnczogTmV3IHRlc3RjYXNlLgorCSogc2ltL2ZyMzAvZG1vdmIuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9kbW92LmNnczogTmV3IHRlc3RjYXNlLgorCSogc2ltL2ZyMzAvZG1vdmguY2dzOiBOZXcgdGVzdGNhc2UuCisKK1RodSBEZWMgMTcgMTc6MTg6NDMgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBzaW0vZnIzMC90ZXN0dXRpbHMuaW5jICh0YWtlX2JyYW5jaHtfZH0sbm9fYnJhbmNoe19kfSk6IE5ldyBtYWNyb3MuCisJKiBzaW0vZnIzMC9yZXQuY2dzOiBBZGQgdGVzdHMgZmlyIHJldDpkLgorCSogc2ltL2ZyMzAvaW50ZS5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL3JldGkuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9icmEuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9ibm8uY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9iZXEuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9ibmUuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9iYy5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL2JuYy5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL2JuLmNnczogTmV3IHRlc3RjYXNlLgorCSogc2ltL2ZyMzAvYnAuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9idi5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL2Judi5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL2JsdC5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL2JnZS5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL2JsZS5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL2JndC5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL2Jscy5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL2JoaS5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKworVHVlIERlYyAxNSAxNzo0NzoxMyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIHNpbS9mcjMwL2Rpdi5jZ3MgKGludCk6IEFkZCBzaWduZWQgZGl2aXNpb24gc2NlbmFyaW8uCisJKiBzaW0vZnIzMC9pbnQuY2dzIChpbnQpOiBDb21wbGV0ZSB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL3Rlc3R1dGlscy5pbmMgKF9zdGFydCk6IEluaXRpYWxpemUgdGJyLgorCSh0ZXN0X3NfdXNlcix0ZXN0X3Nfc3lzdGVtLHNldF9pLHRlc3RfaSk6IE5ldyBtYWNyb3MuCisKKzE5OTgtMTItMTQgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KKworCSogbGliL3NpbS1kZWZzLmV4cCAocnVuX3NpbV90ZXN0KTogTmV3IG9wdGlvbiB4ZXJyb3IsIGZvciBleHBlY3RlZAorCWVycm9ycy4gIFRyYW5zbGF0ZSBcbiBzZXF1ZW5jZXMgaW4gZXhwZWN0ZWQgb3V0cHV0IHRvIG5ld2xpbmUgY2hhci4KKwkoc2x1cnBfb3B0aW9ucyk6IE1ha2UgcGFyZW50aGVzZXMgb3B0aW9uYWwuCisJKHNpbV9ydW4pOiBMb29rIGZvciBib2FyZF9pbmZvIHNpbSxvcHRpb25zLgorCSogc2ltL2ZyMzAvaGVsbG8ubXM6IEFkZCB0cmFpbGluZyBcbiB0byBleHBlY3RlZCBvdXRwdXQuCisJKiBzaW0vbTMyci9oZWxsby5tczogRGl0dG8uCisJKiBzaW0vbTMyci9ody10cmFwLm1zOiBEaXR0by4KKworCSogc2ltL20zMnIvdHJhcC5jZ3M6IFByb3Blcmx5IGFsaWduIHRyYXAyX2hhbmRsZXIuCisKKwkqIHNpbS9tMzJyL3VyZWFkMTYubXM6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9tMzJyL3VyZWFkMzIubXM6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9tMzJyL3V3cml0ZTE2Lm1zOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vbTMyci91d3JpdGUzMi5tczogTmV3IHRlc3RjYXNlLgorCisxOTk4LTEyLTE0ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+CisKKwkqIHNpbS9mcjMwL2NhbGwuY2dzOiBUZXN0IHJldCBoZXJlIGFzIHdlbGwuCisJKiBzaW0vZnIzMC9sZC5jZ3M6IFJlbW92ZSBib2d1cyBjb21tZW50LgorCSogc2ltL2ZyMzAvdGVzdHV0aWxzLmluYyAoc2F2ZV9ycCxyZXN0b3JlX3JwKTogTmV3IG1hY3Jvcy4KKwkqIHNpbS9mcjMwL2Rpdi5tczogTmV3IHRlc3RjYXNlLgorCSogc2ltL2ZyMzAvc3QuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9zdGguY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9zdGIuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9tb3YuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9qbXAuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9yZXQuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9pbnQuY2dzOiBOZXcgdGVzdGNhc2UuCisKK1RodSBEZWMgMTAgMTg6NDY6MjUgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBzaW0vZnIzMC9kaXYwcy5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL2RpdjB1LmNnczogTmV3IHRlc3RjYXNlLgorCSogc2ltL2ZyMzAvZGl2MS5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL2RpdjIuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9kaXYzLmNnczogTmV3IHRlc3RjYXNlLgorCSogc2ltL2ZyMzAvZGl2NHMuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC90ZXN0dXRpbHMuaW5jIChtdmlfaF9kcixzZXRfZGJpdHMsdGVzdF9kYml0cyk6IE5ldyBNYWNyb3MuCisKK1R1ZSBEZWMgIDggMTM6MTY6NTMgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBzaW0vZnIzMC90ZXN0dXRpbHMuaW5jIChzZXRfc191c2VyKTogQ29ycmVjdCBNYXNrLgorCShzZXRfc19zeXN0ZW0pOiBDb3JyZWN0IE1hc2suCisJKiBzaW0vZnIzMC9sZC5jZ3MgKGxkKTogTW92ZSBwcmV2aW91c2x5IGZhaWxpbmcgdGVzdCBiYWNrCisJaW50byBwbGFjZS4KKwkqIHNpbS9mcjMwL2xkbTAuY2dzOiBOZXcgdGVzdGNhc2UuCisJKiBzaW0vZnIzMC9sZG0xLmNnczogTmV3IHRlc3RjYXNlLgorCSogc2ltL2ZyMzAvc3RtMC5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL3N0bTEuY2dzOiBOZXcgdGVzdGNhc2UuCisKK1RodSBEZWMgIDMgMTQ6MjA6MDMgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBzaW0vZnIzMC9sZC5jZ3M6IEltcGxlbWVudCBtb3JlIGxvYWRzLgorCSogc2ltL2ZyMzAvY2FsbC5jZ3M6IE5ldyB0ZXN0Y2FzZS4KKwkqIHNpbS9mcjMwL3Rlc3R1dGlscy5pbmMgKHRlc3RyX2hfZHIpOiBOZXcgbWFjcm8uCisJKHNldF9zX3VzZXIsc2V0X3Nfc3lzdGVtKTogTmV3IG1hY3Jvcy4KKworCSogc2ltL2ZyMzA6IE5ldyBEaXJlY3RvcnkuCisKK1dlZCBOb3YgMTggMTA6NTA6MTkgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb21tb24vYml0cy1nZW4uYyAobWFpbik6IEFkZCBCWVRFX09SREVSIHNvIHRoYXQgaXQgbWF0Y2hlcworIAlyZWNlbnQgc2ltL2NvbW1vbi9zaW0tYmFzaWNzLmggY2hhbmdlcy4KKwkqIGNvbW1vbi9NYWtlZmlsZS5pbjogVXBkYXRlLgorCQorRnJpIE9jdCAzMCAwMDozNzozMSAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+CisKKwkqIGxpYi9zaW0tZGVmcy5leHAgKHNpbV9ydW4pOiBkb3dubG9hZCB0YXJnZXQgcHJvZ3JhbSB0byByZW1vdGUKKyAJaG9zdCwgaWYgbmVjZXNzYXJ5LiAgZm9yIHVuaXgtZHJpdmVuIHdpbjMyIHRlc3RpbmcuCisKK1R1ZSBTZXAgMTUgMTQ6NTY6MjIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc2ltL20zMnIvdGVzdHV0aWxzLmluYyAodGVzdF9oX2dyKTogVXNlIG12YWRkcl9oX2dyLgorCSogc2ltL20zMnIvcnRlLmNnczogVGVzdCBiYnBjLGJicHN3LgorCSogc2ltL20zMnIvdHJhcC5jZ3M6IFRlc3QgYmJwYyxiYnBzdy4KKworRnJpIEp1bCAyNCAwOTo0MDozNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoY2xlYW4sbW9zdGx5Y2xlYW4pOiBDaGFuZ2UgbGVhZGluZyBzcGFjZXMgdG8gYSB0YWIuCisKK1dlZCBKdWwgIDEgMTU6NTc6NTQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+CisKKwkqIHNpbS9tMzJyL2h3LXRyYXAubXM6IE5ldyB0ZXN0Y2FzZS4KKworV2VkIEp1biAxMCAxMDo1MzoyMCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogc2ltL20zMnIvYWRkeC5jZ3M6IEFkZCBhbm90aGVyIHRlc3QuCisJKiBzaW0vbTMyci9qbXAuY2dzOiBBZGQgYW5vdGhlciB0ZXN0LgorCitNb24gSnVuICA4IDE2OjA4OjI3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIHNpbS9tMzJyL3RyYXAuY2dzOiBUZXN0IHRyYXAgMi4KKworTW9uIEp1biAgMSAxODo1NDoyMiAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBsaWIvc2ltLWRlZnMuZXhwIChzaW1fcnVuKTogQWRkIHBvc3NpYmxlIGVudmlyb25tZW50IHZhcmlhYmxlCisgCWxpc3QgdG8gc2ltdWxhdG9yIHJ1bi4KKworVGh1IE1heSAyOCAxNDo1OTo0NiAxOTk4IEppbGxpYW4gWWUgPGppbGxpYW5AY3lnbnVzLmNvbT4KKworICAgICAgICAqIE1ha2VmaWxlLmluOiBUYWtlIFJVTlRFU1Qgb3V0IG9mIEZMQUdfVE9fUEFTUworICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IG1ha2UgY2hlY2sgY2FuIGJlIGludm9rZWQgcmVjdXJzaXZlbHkuCisKK1RodSBNYXkgMTQgMTE6NDg6MzUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2RlZmF1bHQuZXhwIChDQyxTSU0pOiBEZWxldGUuCisKKwkqIGxpYi9zaW0tZGVmcy5leHAgKHNpbV9ydW4pOiBGaXggaGFuZGxpbmcgb2Ygb3V0cHV0IHJlZGlyZWN0aW9uLgorCU5ldyBhcmcgcHJvZ19vcHRzLiAgQWxsIGNhbGxlcnMgdXBkYXRlZC4KKworRnJpIE1heSAgOCAxODoxMDoyOCAxOTk4ICBKaWxsaWFuIFllIDxqaWxsaWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiBNYWRlICJjaGVjayIgdGhlIHRhcmdldCBvZiB0d28KKyAgICAgICAgICBkZXBlbmRlbmNpZXMgKHRlc3QxLCB0ZXN0Mikgc28gdGhhdCB0ZXN0MiBnZXQgYSBjaGFuY2UgdG8gCisgICAgICAgICAgcnVuIGV2ZW4gd2hlbiB0ZXN0MSBmYWlsZWQgaWYgIm1ha2UgLWsgY2hlY2siIGlzIHVzZWQuCisKK0ZyaSBNYXkgIDggMTQ6NDE6MjggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogbGliL3NpbS1kZWZzLmV4cCAoc2ltX3ZlcnNpb24pOiBTaW1wbGlmeS4KKwkoc2ltX3J1bik6IEltcGxlbWVudC4KKwkocnVuX3NpbV90ZXN0KTogVXNlIHNpbV9ydW4uCisJKHNpbV9jb21waWxlKTogTmV3IHByb2MuCisKK01vbiBNYXkgIDQgMTc6NTk6MTEgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2RlZmF1bHQuZXhwOiBBZGRlZCBDIGNvbXBpbGVyIHNldHRpbmdzLgorCitXZWQgQXByIDIyIDEyOjI2OjI4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChUQVJHRVRfRkxBR1NfVE9fUEFTUyk6IERlbGV0ZSBMSUJTLCBMREZMQUdTLgorCitUdWUgQXByIDIxIDEwOjQ5OjAzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGxpYi9zaW0tZGVmcy5leHAgKHJ1bl9zaW1fdGVzdCk6IERvbid0IGV4aXQgZWFybHkgaWYgb25lIG1hY2ggZmFpbHMsCisJdHJ5IGFsbCBtYWNocy4KKworCSogc2ltL20zMnIvYWRkeC5jZ3M6IFRlc3QgKC0xKSsoLTEpKzEuCisKK0ZyaSBBcHIgMTcgMTY6MDA6NTIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogc2ltL20zMnIvbXZbZnRdYWNoaS5jZ3M6IEZpeCBleHBlY3RlZCByZXN1bHQKKwkoc2lnbiBleHRlbnNpb24gb2YgdG9wIDggYml0cykuCisKK1dlZCBGZWIgMjUgMTE6MDE6MTcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFJVTlRFU1QpOiBGaXggcGF0aCB0byBydW50ZXN0LgorCisJCitGcmkgRmViIDIwIDExOjAwOjAyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHNpbS9tMzJyL3VubG9jay5jZ3M6IEZpeGVkIHRlc3QuCisJKiBzaW0vbTMyci9tdmZjLmNnczogRml4ZWQgdGVzdC4KKwkqIHNpbS9tMzJyL3JlbXUuY2dzOiBGaXhlZCB0ZXN0LgorCisJKiBzaW0vbTMyci9ibmMyNC5jZ3M6IFRlc3QgbG9uZyBCTkMgaW5zdHJ1Y3Rpb24uCisJKiBzaW0vbTMyci9ibmM4LmNnczogVGVzdCBzaG9ydCBCTkMgaW5zdHJ1Y3Rpb24uCisJKiBzaW0vbTMyci9sZC1wbHVzLmNnczogVGVzdCBMRCBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL21hY3doaS5jZ3M6IFRlc3QgTUFDV0hJIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIvbWFjd2xvLmNnczogVGVzdCBNQUNXTE8gaW5zdHJ1Y3Rpb24uCisJKiBzaW0vbTMyci9tdWx3aGkuY2dzOiBUZXN0IE1VTFdISSBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL211bHdsby5jZ3M6IFRlc3QgTVVMV0xPIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIvbXZmYWNoaS5jZ3M6IFRlc3QgTVZGQUNISSBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL212ZmFjbG8uY2dzOiBUZXN0IE1WRkFDTE8gaW5zdHJ1Y3Rpb24uCisJKiBzaW0vbTMyci9tdnRhY2xvLmNnczogVGVzdCBNVlRBQ0xPIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIvYWRkdi5jZ3M6IFRlc3QgQUREViBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL2FkZHYzLmNnczogVGVzdCBBRERWMyBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL2FkZHguY2dzOiBUZXN0IEFERFggaW5zdHJ1Y3Rpb24uCisJKiBzaW0vbTMyci9sb2NrLmNnczogVGVzdCBMT0NLIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIvbmVnLmNnczogVGVzdCBORUcgaW5zdHJ1Y3Rpb24uCisJKiBzaW0vbTMyci9ub3QuY2dzOiBUZXN0IE5PVCBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL3VubG9jay5jZ3M6IFRlc3QgVU5MT0NLIGluc3RydWN0aW9uLgorVGh1IEZlYiAxOSAxMToxNTo0NSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBzaW0vbTMyci90ZXN0dXRpbHMuaW5jIChtdmFkZHJfaF9ncik6IG5ldyBtYWNybyB0byBsb2FkIGFuCisJYWRkcmVzcyBpbnRvIGEgZ2VuZXJhbCByZWdpc3Rlci4KKworCSogc2ltL20zMnIvb3IzLmNnczogVGVzdCBPUjMgaW5zdHJ1Y3Rpb24uCisJKiBzaW0vbTMyci9yYWNoLmNnczogVGVzdCBSQUNIIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIvcmVtLmNnczogVGVzdCBSRU0gaW5zdHJ1Y3Rpb24uCisJKiBzaW0vbTMyci9zdWIuY2dzOiBUZXN0IFNVQiBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL212LmNnczogVGVzdCBNViBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL211bC5jZ3M6IFRlc3QgTVVMIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIvYmwyNC5jZ3M6IFRlc3QgbG9uZyBCTCBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL2JsOC5jZ3M6IFRlc3Qgc2hvcnQgQkwgaW5zdHJ1Y3Rpb24uCisJKiBzaW0vbTMyci9ibGV6LmNnczogVGVzdCBCTEVaIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIvYmx0ei5jZ3M6IFRlc3QgQkxUWiBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL2JuZS5jZ3M6IFRlc3QgQk5FIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIvYm5lei5jZ3M6IFRlc3QgQk5FWiBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL2JyYTI0LmNnczogVGVzdCBsb25nIEJSQSBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL2JyYTguY2dzOiBUZXN0IHNob3J0IEJSQSBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL2psLmNnczogVGVzdCBKTCBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL29yLmNnczogVGVzdCBPUiBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL2ptcC5jZ3M6IFRlc3QgSk1QIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIvYW5kLmNnczogVGVzdCBBTkQgaW5zdHJ1Y3Rpb24uCisJKiBzaW0vbTMyci9hbmQzLmNnczogVGVzdCBBTkQzIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIvYmVxLmNnczogVGVzdCBCRVEgaW5zdHJ1Y3Rpb24uCisJKiBzaW0vbTMyci9iZXF6LmNnczogVGVzdCBCRVFaIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIvYmdlei5jZ3M6IFRlc3QgQkdFWiBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL2JndHouY2dzOiBUZXN0IEJHVFogaW5zdHJ1Y3Rpb24uCisJKiBzaW0vbTMyci9jbXAuY2dzOiBUZXN0IENNUCBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL2NtcGkuY2dzOiBUZXN0IENNUEkgaW5zdHJ1Y3Rpb24uCisJKiBzaW0vbTMyci9jbXB1LmNnczogVGVzdCBDTVBVIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIvY21wdWkuY2dzOiBUZXN0IENNUFVJIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIvZGl2LmNnczogVGVzdCBESVYgaW5zdHJ1Y3Rpb24uCisJKiBzaW0vbTMyci9kaXZ1LmNnczogVGVzdCBESVZVIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIvY21wZXEuY2dzOiBUZXN0IENNUEVRIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIvc2xsLmNnczogVGVzdCBTTEwgaW5zdHJ1Y3Rpb24uCisJKiBzaW0vbTMyci9zbGwzLmNnczogVGVzdCBTTEwzIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIvc2xsaS5jZ3M6IFRlc3QgU0xMSSBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL3NyYS5jZ3M6IFRlc3QgU1JBIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIvc3JhMy5jZ3M6IFRlc3QgU1JBMyBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL3NyYWkuY2dzOiBUZXN0IFNSQUkgaW5zdHJ1Y3Rpb24uCisJKiBzaW0vbTMyci9zcmwuY2dzOiBUZXN0IFNSTCBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL3NybDMuY2dzOiBUZXN0IFNSTDMgaW5zdHJ1Y3Rpb24uCisJKiBzaW0vbTMyci9zcmxpLmNnczogVGVzdCBTUkxJIGluc3RydWN0aW9uLgorCSogc2ltL20zMnIveG9yMy5jZ3M6IFRlc3QgWE9SMyBpbnN0cnVjdGlvbi4KKwkqIHNpbS9tMzJyL3hvci5jZ3M6IFRlc3QgWE9SIGluc3RydWN0aW9uLgorVHVlIEZlYiAxNyAxMjo0NjowNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KKworCSogY29uZmlnL2RlZmF1bHQuZXhwOiBOZXcgZmlsZS4KKwkqIGxpYi9zaW0tZGVmcy5leHA6IE5ldyBmaWxlLgorCSogc2ltL20zMnIvKjogbTMyciBkZWphZ251IHNpbXVsYXRvciB0ZXN0c3VpdGUuCisKKwkqIE1ha2VmaWxlLmluIChidWlsZF9hbGlhcyk6IERlZmluZS4KKwkoYXJjaCk6IERlZmluZS4KKwkoUlVOVEVTVF9GT1JfVEFSR0VUKTogRGVsZXRlLgorCShSVU5URVNUKTogRml4LgorCShjaGVjayk6IERlcGVuZCBvbiBzaXRlLmV4cC4gIFJ1biBkZWphZ251LgorCShzaXRlLmV4cCk6IE5ldyB0YXJnZXQuCisJKiBjb25maWd1cmUuaW4gKGFyY2gpOiBEZWZpbmUgZnJvbSB0YXJnZXRfY3B1LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCitXZWQgU2VwIDE3IDEwOjIxOjI2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29tbW9uL2JpdHMtZ2VuLmMgKGdlbl9iaXQpOiBQYXNzIGluIHRoZSBmdWxsIG5hbWUgb2YgdGhlIG1hY3JvLgorCShnZW5fbWFzayk6IERpdHRvLgorCisJKiBjb21tb24vYml0cy10c3QuYyAobWFpbik6IEFkZCB0ZXN0cyBmb3IgTFNTRVhULCBNU1NFWFQuCisJKGNhbGMpOiBBZGQgc3VwcG9ydCBmb3IgOCBiaXQgdmVyc2lvbiBvZiBtYWNyb3MuCisJKG1haW4pOiBBZGQgdGVzdHMgZm9yIDggYml0IHZlcnNpb25zIG9mIG1hY3Jvcy4KKwkoY2hlY2tfc2V4dCk6IENoZWNrIFNFWFQgb2YgemVybyBjbGVhcnMgYml0cy4KKworCSogY29tbW9uL2JpdHMtZ2VuLmMgKG1haW4pOiBHZW5lcmF0ZSB0ZXN0cyBmb3IgOCBiaXQgdmVyc2lvbnMgb2YKKyAJbWFjcm9zLgorCitUaHUgU2VwIDExIDEzOjA0OjQwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29tbW9uL01ha2UtY29tbW9uLmluOiBOZXcgZmlsZSwgcHJvdmlkZSBnZW5lcmljIHJ1bGVzIGZvcgorIAlydW5uaW5nIGNoZWNrcy4KKworTW9uIFNlcCAgMSAxNjo0Mzo1NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbiAoY29uZmlnZGlycyk6IFRlc3QgZm9yIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGluc3RlYWQKKyAJb2YgbWF0Y2hpbmcgb24gYSB0YXJnZXQuCisKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvTWFrZWZpbGUuaW4gYi9zaW0vdGVzdHN1aXRlL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzN2E4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTgyIEBACisjIE1ha2VmaWxlIGZvciByZWdyZXNzaW9uIHRlc3RpbmcgdGhlIEdOVSBkZWJ1Z2dlci4KKyMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworIyBHREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIEdEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworVlBBVEggPSBAc3JjZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKKworYnVpbGRfY2Fub25pY2FsID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitob3N0X2Nhbm9uaWNhbCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAordGFyZ2V0X2Nhbm9uaWNhbCA9IEB0YXJnZXRACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorCithcmNoID0gQGFyY2hACisKK1NIRUxMID0gL2Jpbi9zaAorU1VCRElSUyA9IEBzdWJkaXJzQAorUlBBVEhfRU5WVkFSID0gQFJQQVRIX0VOVlZBUkAKKworRVhQRUNUID0gYGlmIFsgLWYgJCR7cm9vdG1lfS8uLi8uLi9leHBlY3QvZXhwZWN0IF0gOyB0aGVuIFwKKyAgICAgICAgICBlY2hvICQke3Jvb3RtZX0vLi4vLi4vZXhwZWN0L2V4cGVjdCA7IFwKKyAgICAgICAgICBlbHNlIGVjaG8gZXhwZWN0IDsgZmlgCisKK1JVTlRFU1QgPSBgaWYgWyAtZiAkJHtzcmNkaXJ9Ly4uLy4uL2RlamFnbnUvcnVudGVzdCBdIDsgdGhlbiBcCisJCWVjaG8gJCR7c3JjZGlyfS8uLi8uLi9kZWphZ251L3J1bnRlc3QgOyBlbHNlIGVjaG8gcnVudGVzdDsgXAorCSAgIGZpYAorCitSVU5URVNURkxBR1MgPQorCisjIyMjIGhvc3QsIHRhcmdldCwgYW5kIHNpdGUgc3BlY2lmaWMgTWFrZWZpbGUgZnJhZ3MgY29tZSBpbiBoZXJlLgorCisjIFRoZSB1c2Ugb2YgJCQoeF9GT1JfVEFSR0VUKSByZWR1Y2VzIHRoZSBjb21tYW5kIGxpbmUgbGVuZ3RoIGJ5IG5vdAorIyBkdXBsaWNhdGluZyB0aGUgbGVuZ3RoeSBkZWZpbml0aW9uLgorCitUQVJHRVRfRkxBR1NfVE9fUEFTUyA9IFwKKyAgICAgICAgInByZWZpeD0kKHByZWZpeCkiIFwKKyAgICAgICAgImV4ZWNfcHJlZml4PSQoZXhlY19wcmVmaXgpIiBcCisgICAgICAgICJhZ2FpbnN0PSQoYWdhaW5zdCkiIFwKKyAgICAgICAgJ0NDPSQkKENDX0ZPUl9UQVJHRVQpJyBcCisgICAgICAgICJDQ19GT1JfVEFSR0VUPSQoQ0NfRk9SX1RBUkdFVCkiIFwKKyAgICAgICAgIkNGTEFHUz0kKFRFU1RTVUlURV9DRkxBR1MpIiBcCisgICAgICAgICJDSElMTEZMQUdTPSQoQ0hJTExGTEFHUykiIFwKKyAgICAgICAgJ0NISUxMPSQkKENISUxMX0ZPUl9UQVJHRVQpJyBcCisgICAgICAgICJDSElMTF9GT1JfVEFSR0VUPSQoQ0hJTExfRk9SX1RBUkdFVCkiIFwKKyAgICAgICAgIkNISUxMX0xJQj0kKENISUxMX0xJQikiIFwKKyAgICAgICAgJ0NYWD0kJChDWFhfRk9SX1RBUkdFVCknIFwKKyAgICAgICAgIkNYWF9GT1JfVEFSR0VUPSQoQ1hYX0ZPUl9UQVJHRVQpIiBcCisgICAgICAgICJDWFhGTEFHUz0kKENYWEZMQUdTKSIgXAorICAgICAgICAiTUFLRUlORk89JChNQUtFSU5GTykiIFwKKyAgICAgICAgIklOU1RBTEw9JChJTlNUQUxMKSIgXAorICAgICAgICAiSU5TVEFMTF9QUk9HUkFNPSQoSU5TVEFMTF9QUk9HUkFNKSIgXAorICAgICAgICAiSU5TVEFMTF9EQVRBPSQoSU5TVEFMTF9EQVRBKSIgXAorICAgICAgICAiUlVOVEVTVEZMQUdTPSQoUlVOVEVTVEZMQUdTKSIKKworIyAgICAgICAgIlJVTlRFU1Q9JChSVU5URVNUKSIgXAorCithbGw6CisJQGVjaG8gIk5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYWxsLi4uIgorCisuTk9FWFBPUlQ6CitpbmZvOgoraW5zdGFsbC1pbmZvOgorZHZpOgorCitpbnN0YWxsOgorCit1bmluc3RhbGw6IGZvcmNlCisKK2luc3RhbGxjaGVjazoKKworY2hlY2s6ICBjaGVjay1ERUpBR05VIGNoZWNrLXJlY3Vyc2l2ZQorCisjdGVzdDE6CitjaGVjay1yZWN1cnNpdmU6IAorCUBmb3IgaSBpbiAuICR7U1VCRElSU307IGRvIFwKKwkJaWYgWyAkJGkgPSAuIF0gOyB0aGVuIGNvbnRpbnVlIDsgZmkgOyBcCisJCWlmIFsgLWQgLi8kJGkgXSA7IHRoZW4gXAorCQkJaWYgKHJvb3RtZT1gcHdkYC8gOyBleHBvcnQgcm9vdG1lIDsgXAorCQkJICAgIHJvb3RzcmM9YGNkICQoc3JjZGlyKTsgcHdkYC8gOyBleHBvcnQgcm9vdHNyYyA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiY2hlY2sgcmVjdXJzaXZlbHkgaW50byAkJGkgZGlyZWN0b3J5Li4uIjsgXAorCQkJCWNkIC4vJCRpOyBcCisJCQkJJChNQUtFKSAkKFRBUkdFVF9GTEFHU19UT19QQVNTKSBjaGVjaykgOyB0aGVuIHRydWUgOyBcCisJCQllbHNlIGV4aXQgMSA7IGZpIDsgXAorCQllbHNlIHRydWUgOyBmaSA7IFwKKwlkb25lCisKKyN0ZXN0MjoJCitjaGVjay1ERUpBR05VOiBzaXRlLmV4cAorCWVjaG8gIkRlamFnbnUtY2hlY2tpbmcgaW4gYHB3ZGAgZGlyZWN0b3J5IC4uLiIKKwlyb290bWU9YHB3ZGA7IGV4cG9ydCByb290bWU7IGVjaG8gcm9vdG1lID0gJCRyb290bWU7IFwKKwlzcmNkaXI9YGNkICR7c3JjZGlyfTsgcHdkYDsgZXhwb3J0IHNyY2RpciA7IGVjaG8gc3JjZGlyID0gJCRzcmNkaXI7IFwKKwlFWFBFQ1Q9JHtFWFBFQ1R9IDsgZXhwb3J0IEVYUEVDVCA7IGVjaG8gRVhQRUNUID0gJCRFWFBFQ1Q7IFwKKwlpZiBbIC1mICQkcm9vdG1lLy4uLy4uL2V4cGVjdC9leHBlY3QgXTsgdGhlbiBcCisJICBUQ0xfTElCUkFSWT1gY2QgJCRzcmNkaXIvLi4vLi4vdGNsL2xpYnJhcnkgJiYgcHdkYDsgXAorCSAgZXhwb3J0IFRDTF9MSUJSQVJZOyBcCisJZmk7IFwKKyAgICAgICAgZWNobyBUQ0xfTElCUkFSWSA9ICQkVENMX0xJQlJBUlk7IFwKKwlydW50ZXN0PSQoUlVOVEVTVCk7IGVjaG8gcnVudGVzdCA9ICQkcnVudGVzdDsgXAorCWlmICQoU0hFTEwpIC1jICIkJHJ1bnRlc3QgLS12ZXJzaW9uIiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgICQkcnVudGVzdCAkKFJVTlRFU1RGTEFHUyk7IFwKKwllbHNlIGVjaG8gIldBUk5JTkc6IGNvdWxkIG5vdCBmaW5kIFxgcnVudGVzdCciIDE+JjI7IDo7XAorCWZpCisKKworc2l0ZS5leHA6IE1ha2VmaWxlCisJQGVjaG8gJ01ha2luZyBhIG5ldyBzaXRlLmV4cCBmaWxlLi4uJworCS1Acm0gLWYgc2l0ZS5iYWsKKwlAZWNobyAnIyMgdGhlc2UgdmFyaWFibGVzIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBtYWtlICMjJyA+ICRALXQKKwlAZWNobyAnIyBEbyBub3QgZWRpdCBoZXJlLiAgSWYgeW91IHdpc2ggdG8gb3ZlcnJpZGUgdGhlc2UgdmFsdWVzJyA+PiAkQC10CisJQGVjaG8gJyMgZWRpdCB0aGUgbGFzdCBzZWN0aW9uJyA+PiAkQC10CisJQGVjaG8gJ3NldCB0b29sIHNpbScgPj4gJEAtdAorCUBlY2hvICdzZXQgc3JjZGlyICQoc3JjZGlyKScgPj4gJEAtdAorCUBlY2hvICdzZXQgb2JqZGlyJyBgcHdkYCA+PiAkQC10CisJQGVjaG8gJ3NldCBhcmNoICQoYXJjaCknID4+ICRALXQKKwlAZWNobyAnc2V0IGJ1aWxkX2FsaWFzICQoYnVpbGRfYWxpYXMpJyA+PiAkQC10CisJQGVjaG8gJ3NldCBidWlsZF90cmlwbGV0ICQoYnVpbGRfY2Fub25pY2FsKScgPj4gJEAtdAorCUBlY2hvICdzZXQgaG9zdF9hbGlhcyAkKGhvc3RfYWxpYXMpJyA+PiAkQC10CisJQGVjaG8gJ3NldCBob3N0X3RyaXBsZXQgJChob3N0X2Nhbm9uaWNhbCknID4+ICRALXQKKwlAZWNobyAnc2V0IHRhcmdldF9hbGlhcyAkKHRhcmdldF9hbGlhcyknID4+ICRALXQKKwlAZWNobyAnc2V0IHRhcmdldF90cmlwbGV0ICQodGFyZ2V0X2Nhbm9uaWNhbCknID4+ICRALXQKKwlAZWNobyAnIyMgQWxsIHZhcmlhYmxlcyBhYm92ZSBhcmUgZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gRG8gTm90IEVkaXQgIyMnID4+ICRALXQKKwktQHNlZCAnMSwvXiMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlLiojIy8gZCcgc2l0ZS5leHAgPj4gJEAtdAorCS1AbXYgc2l0ZS5leHAgc2l0ZS5iYWsKKwlAbXYgJEAtdCBzaXRlLmV4cAorCitmb3JjZTo7CisKK2NsZWFuIG1vc3RseWNsZWFuOgorCS1ybSAtZiAqfiBjb3JlICoubyBhLm91dCB4Z2RiICoueCAqLmdydAorCS1ybSAtZiAqLnJ1bSAqLmMgKi5kaWYgKi4qb3V0CisJaWYgWyB4IiR7U1VCRElSU30iICE9IHggXSA7IHRoZW4gXAorCSAgICBmb3IgZGlyIGluICR7U1VCRElSU307IFwKKwkgICAgZG8gXAorCQkgICAgZWNobyAiJCRkaXI6IjsgXAorCQkgICAgaWYgWyAtZCAkJGRpciBdOyB0aGVuIFwKKwkJCSAgICAoY2QgJCRkaXI7ICQoTUFLRSkgY2xlYW4pOyBcCisJCSAgICBmaTsgXAorCSAgICBkb25lIDsgXAorCWVsc2UgdHJ1ZTsgZmkKKworZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuOiBjbGVhbgorCS1ybSAtZiAqfiBjb3JlCisJLXJtIC1mIE1ha2VmaWxlIGNvbmZpZy5zdGF0dXMgKi1pbml0LmV4cAorCS1ybSAtZnIgKi5sb2cgc3VtbWFyeSBkZXRhaWwgKi5wbG9nICouc3VtICoucHN1bSBzaXRlLioKKwlpZiBbIHgiJHtTVUJESVJTfSIgIT0geCBdIDsgdGhlbiBcCisJICAgIGZvciBkaXIgaW4gJHtTVUJESVJTfTsgXAorCSAgICBkbyBcCisJCSAgICBlY2hvICIkJGRpcjoiOyBcCisJCSAgICBpZiBbIC1kICQkZGlyIF07IHRoZW4gXAorCQkJICAgIChjZCAkJGRpcjsgJChNQUtFKSBkaXN0Y2xlYW4pOyBcCisJCSAgICBmaTsgXAorCSAgICBkb25lIDsgXAorCWVsc2UgdHJ1ZTsgZmkKKworTWFrZWZpbGUgOiBNYWtlZmlsZS5pbiBjb25maWcuc3RhdHVzCisJJChTSEVMTCkgY29uZmlnLnN0YXR1cworCitjb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjaworIyBGSVhNRTogUmVxdWlyZXMgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlLCB3aGljaCBvbmUgY291bGQgYWRkLCBidXQKKyMgaXQncyBwcm92aWRlZCBieSBhdXRvbWFrZS4gIE1heWJlIHN3aXRjaCB0byBhdXRvbWFrZSBzb21lZGF5LgorIyQoc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEAgJChzcmNkaXIpL2NvbmZpZ3VyZS5pbgorIwljZCAkKHNyY2RpcikgJiYgYXV0b2NvbmYKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvY29tbW9uL01ha2UtY29tbW9uLmluIGIvc2ltL3Rlc3RzdWl0ZS9jb21tb24vTWFrZS1jb21tb24uaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmZWY0YQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvY29tbW9uL01ha2UtY29tbW9uLmluCkBAIC0wLDAgKzEsOTAgQEAKK0FTX0ZPUl9UQVJHRVQgPSBgXAorICBpZiBbIC14IC4uLy4uLy4uL2dhcy9hcy1uZXcgXTsgdGhlbiBcCisgICAgZWNobyAuLi8uLi8uLi9nYXMvYXMtbmV3IDsgXAorICBlbHNlIFwKKyAgICBlY2hvICQodGFyZ2V0X2FsaWFzKS1hcyA7IFwKKyAgZmlgCisKK0xEX0ZPUl9UQVJHRVQgPSBgXAorICBpZiBbIC14IC4uLy4uLy4uL2xkL2xkLW5ldyBdOyB0aGVuIFwKKyAgICBlY2hvIC4uLy4uLy4uL2xkL2xkLW5ldyA7IFwKKyAgZWxzZSBcCisgICAgZWNobyAkKHRhcmdldF9hbGlhcyktbGQgOyBcCisgIGZpYAorCitSVU5fRk9SX1RBUkdFVCA9IGBcCisgIGlmIFsgLXggLi4vLi4vLi4vc2ltL3Y4NTAvcnVuIF07IHRoZW4gXAorICAgIGVjaG8gLi4vLi4vLi4vc2ltL3Y4NTAvcnVuIDsgXAorICBlbHNlIFwKKyAgICBlY2hvICQodGFyZ2V0X2FsaWFzKS1ydW4gOyBcCisgIGZpYAorCisKK2NoZWNrOiBzYW5pdHkgJChURVNUUykKK3Nhbml0eToKKwlAZXZhbCBlY2hvIEFTX0ZPUl9UQVJHRVQ9JChBU19GT1JfVEFSR0VUKQorCUBldmFsIGVjaG8gTERfRk9SX1RBUkdFVD0kKExEX0ZPUl9UQVJHRVQpCisJQGV2YWwgZWNobyBSVU5fRk9SX1RBUkdFVD0kKFJVTl9GT1JfVEFSR0VUKQorCitjbGVhbjoKKwlybSAtZiAkKFRFU1RTKQorCXJtIC1mICoucnVuICoubworCXJtIC1mIGNvcmUgKi5jb3JlCisKKyMgUnVsZXMgZm9yIHJ1bm5pbmcgdGhlIHRlc3RzCisKKy5TVUZGSVhFUzogLm9rIC5ydW4gLmhpIC5rbyAudGkKKy5ydW4ub2s6CisJcm0gLWYgdG1wLSQqICQqLmhpCisJdWxpbWl0IC10IDUgOyBcCisJJChSVU5fRk9SX1RBUkdFVCkgJChSVU5GTEFHU19GT1JfVEFSR0VUKSAkKi5ydW4gPiB0bXAtJCoKKwltdiB0bXAtJCogJCoub2sKKy5ydW4uaGk6CisJcm0gLWYgdG1wLSQqICQqLmhpIGRpZmYtJCoKKwl1bGltaXQgLXQgNSA7IFwKKwkkKFJVTl9GT1JfVEFSR0VUKSAkKFJVTkZMQUdTX0ZPUl9UQVJHRVQpICQqLnJ1biA+IHRtcC0kKgorCWVjaG8gJ0hlbGxvIFdvcmxkIScgfCBkaWZmIC0gdG1wLSQqID4gZGlmZi0kKgorCWNhdCB0bXAtJCogZGlmZi0kKiA+ICQqLmhpCisucnVuLmtvOgorCXJtIC1mIHRtcC0kKiAkKi5rbworCXNldCArZSA7IFwKKwl1bGltaXQgLXQgNSA7IFwKKwkkKFJVTl9GT1JfVEFSR0VUKSAkKFJVTkZMQUdTX0ZPUl9UQVJHRVQpICQqLnJ1biA+IHRtcC0kKiA7IFwKKwlpZiBbICQkPyAtZXEgNDcgXSA7IHRoZW4gXAorCSAgZXhpdCAwIDsgXAorCWVsc2UgXAorCSAgZXhpdCAxIDsgXAorCWZpCisJbXYgdG1wLSQqICQqLmtvCisucnVuLnRpOgorCXJtIC1mIHRtcC0kKiAkKi50aQorCXNldCArZSA7IFwKKwl1bGltaXQgLXQgNSA7IFwKKwkkKFJVTl9GT1JfVEFSR0VUKSAkKFJVTkZMQUdTX0ZPUl9UQVJHRVQpICQoSU5URkxBR1NfRk9SX1RBUkdFVCkgJCoucnVuID4gdG1wLSQqCisJdGVzdCBgY2F0IHRtcC0kKiB8IHdjIC1sYCAtZXEgMTAgPCAvZGV2L251bGwKKwl0ZXN0IGBncmVwIFRpY2sgdG1wLSQqIHwgd2MgLWxgIC1lcSAxMCA8IC9kZXYvbnVsbAorCW12IHRtcC0kKiAkKi50aQorCisKKyMgUnVsZXMgZm9yIGJ1aWxkaW5nIHRoZSB0ZXN0CisjIFByZWZlcmVuY2UgaXMgZm9yIG9idGFpbmluZyB0aGUgZXhlY3V0YWJsZSAoLnJ1bikgZnJvbSBhIHByZWJ1aWx0IGltYWdlCisKKy5TVUZGSVhFUzogLnV1ZSAucyAuUyAucnVuCisudXVlLnJ1bjoKKwloZWFkICQqIHwgZ3JlcCAkKi5ydW4gPiAvZGV2L251bGwKKwl1dWRlY29kZSAkKi51dWUKKy5ydW4udToKKwl1dWVuY29kZSA8ICQqLnJ1biAkKi5ydW4gPiAkKi51Cisuby5ydW46CisJJChMRF9GT1JfVEFSR0VUKSAkKExERkxBR1NfRk9SX1RBUkdFVCkgLW8gJCoucnVuICQqLm8KKy5zLm86CisJJChBU19GT1JfVEFSR0VUKSAkKEFTRkxBR1NfRk9SX1RBUkdFVCkgLUkkKHNyY2RpcikgJChzcmNkaXIpLyQqLnMgLW8gJCoubworLlMubzoKKwkkKEFTX0ZPUl9UQVJHRVQpICQoQVNGTEFHU19GT1JfVEFSR0VUKSAtSSQoc3JjZGlyKSAkKHNyY2RpcikvJCouUyAtbyAkKi5vCisKKworTWFrZWZpbGU6IE1ha2VmaWxlLmluIGNvbmZpZy5zdGF0dXMKKwkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworY29uZmlnLnN0YXR1czogY29uZmlndXJlCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9jb21tb24vTWFrZWZpbGUuaW4gYi9zaW0vdGVzdHN1aXRlL2NvbW1vbi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDg4NTAxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9jb21tb24vTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw1MyBAQAorQ0M9Z2NjCitDRkxBR1MgPSAtV2FsbCAtV2Vycm9yIC1JLi4vLi4vY29tbW9uIC1JLi4vLi4vLi4vaW5jbHVkZSAtZworZGVmYXVsdDogY2hlY2sKKworCisjIFZlcmlmeSBTSU0tQklUUworCitjaGVjazogYml0czMybTAub2sgYml0czMybTMxLm9rIGJpdHM2NG0wLm9rIGJpdHM2NG02My5vaworYWxsOiBiaXRzMzJtMCBiaXRzMzJtMzEgYml0czY0bTAgYml0czY0bTYzCisKK2JpdHMzMm0wLmM6IGJpdHMtZ2VuIGJpdHMtdHN0LmMKKwkuL2JpdHMtZ2VuIDMyIDAgYmlnID4gdG1wLWJpdHMzMm0wLmMKKwljYXQgYml0cy10c3QuYyA+PiB0bXAtYml0czMybTAuYworCW12IHRtcC1iaXRzMzJtMC5jIGJpdHMzMm0wLmMKK2JpdHMzMm0zMS5jOiBiaXRzLWdlbiBiaXRzLXRzdC5jCisJLi9iaXRzLWdlbiAzMiAzMSBsaXR0bGUgPiB0bXAtYml0czMybTMxLmMKKwljYXQgYml0cy10c3QuYyA+PiB0bXAtYml0czMybTMxLmMKKwltdiB0bXAtYml0czMybTMxLmMgYml0czMybTMxLmMKK2JpdHM2NG0wLmM6IGJpdHMtZ2VuIGJpdHMtdHN0LmMKKwkuL2JpdHMtZ2VuIDY0IDAgYmlnID4gdG1wLWJpdHM2NG0wLmMKKwljYXQgYml0cy10c3QuYyA+PiB0bXAtYml0czY0bTAuYworCW12IHRtcC1iaXRzNjRtMC5jIGJpdHM2NG0wLmMKK2JpdHM2NG02My5jOiBiaXRzLWdlbiBiaXRzLXRzdC5jCisJLi9iaXRzLWdlbiA2NCA2MyBsaXR0bGUgPiB0bXAtYml0czY0bTYzLmMKKwljYXQgYml0cy10c3QuYyA+PiB0bXAtYml0czY0bTYzLmMKKwltdiB0bXAtYml0czY0bTYzLmMgYml0czY0bTYzLmMKKworCisKKyMgVmVyaWZ5IFNJTS1GUFUKKyMKKyNjaGVjazogZnB1LXRzdC5vaworI2FsbDogZnB1LXRzdAorCisKKworIyBWZXJpZnkgU0lNLUFMVQorCitjaGVjazogYWx1LXRzdC5vaworYWxsOiBhbHUtdHN0CithbHUtdHN0Lm86IGFsdS10c3QuYyBhbHUtbi10c3QuaAorCitjbGVhbjoKKwlybSAtZiAqLm8KKwlybSAtZiAqLm9rCisJcm0gLWYgYml0czMybTAgYml0czMybTMxIGJpdHM2NG0wIGJpdHM2NG02MyBiaXRzLWdlbgorCXJtIC1mIHRtcC0qCisJcm0gLWYgYWx1LXRzdAorCisuU1VGSVhFUzogLm9rCislLm9rOiAlCisJLi8kPAorCXRvdWNoICQ8Lm9rCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2NvbW1vbi9hbHUtbi10c3QuaCBiL3NpbS90ZXN0c3VpdGUvY29tbW9uL2FsdS1uLXRzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMjE4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2NvbW1vbi9hbHUtbi10c3QuaApAQCAtMCwwICsxLDI2MCBAQAorI2lmbmRlZiBOCisjZXJyb3IgIk4gbXVzdCBiZSAjZGVmaW5lZCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3ltY2F0LmgiCisKKy8qIE5PVEU6IHNlZSBlbmQgb2YgZmlsZSBmb3IgI3VuZGVmIG9mIHRoZXNlIG1hY3JvcyAqLworI2RlZmluZSB1bnNpZ25lZE4gICAgWENPTkNBVDIodW5zaWduZWQsTikKKyNkZWZpbmUgTUFYX0lOVCAgICAgIFhDT05DQVQyKE1BWF9JTlQsTikKKyNkZWZpbmUgTUlOX0lOVCAgICAgIFhDT05DQVQyKE1JTl9JTlQsTikKKyNkZWZpbmUgYWx1X05fdGVzdHMgICAgIFhDT05DQVQzKGFsdV8sTixfdGVzdHMpCisjZGVmaW5lIGRvX2FsdV9OX3Rlc3RzICBYQ09OQ0FUMyhkb19hbHVfLE4sX3Rlc3RzKQorI2RlZmluZSBPUF9CRUdJTiAgICAgWENPTkNBVDMoQUxVLE4sX0JFR0lOKQorI2RlZmluZSBPUF9BRERDICAgICAgWENPTkNBVDMoQUxVLE4sX0FEREMpCisjZGVmaW5lIE9QX0FERENfQyAgICBYQ09OQ0FUMyhBTFUsTixfQUREQ19DKQorI2RlZmluZSBPUF9TVUJDICAgICAgWENPTkNBVDMoQUxVLE4sX1NVQkMpCisjZGVmaW5lIE9QX1NVQkIgICAgICBYQ09OQ0FUMyhBTFUsTixfU1VCQikKKyNkZWZpbmUgT1BfU1VCQl9CICAgIFhDT05DQVQzKEFMVSxOLF9TVUJCX0IpCisjZGVmaW5lIE9QX1NVQkNfWCAgICBYQ09OQ0FUMyhBTFUsTixfU1VCQ19YKQorI2RlZmluZSBPUF9ORUdDICAgICAgWENPTkNBVDMoQUxVLE4sX05FR0MpCisjZGVmaW5lIE9QX05FR0IgICAgICBYQ09OQ0FUMyhBTFUsTixfTkVHQikKKyNkZWZpbmUgSEFEX0NBUlJZX0JPUlJPVyAgICAoWENPTkNBVDMoQUxVLE4sX0hBRF9DQVJSWV9CT1JST1cpICE9IDApCisjZGVmaW5lIEhBRF9PVkVSRkxPVyAoWENPTkNBVDMoQUxVLE4sX0hBRF9PVkVSRkxPVykgIT0gMCkKKyNkZWZpbmUgUkVTVUxUICAgICAgICAgIFhDT05DQVQzKEFMVSxOLF9SRVNVTFQpCisjZGVmaW5lIENBUlJZX0JPUlJPV19SRVNVTFQgICAgWENPTkNBVDMoQUxVLE4sX0NBUlJZX0JPUlJPV19SRVNVTFQpCisjZGVmaW5lIE9WRVJGTE9XX1JFU1VMVCBYQ09OQ0FUMyhBTFUsTixfT1ZFUkZMT1dfUkVTVUxUKQorI2RlZmluZSBkb19vcF9OICAgICAgWENPTkNBVDIoZG9fb3BfLE4pCisKKwordm9pZAorZG9fb3BfTiAoY29uc3QgYWx1X3Rlc3QgKnRzdCkKK3sKKyAgY29uc3QgYWx1X29wICpvcDsKKyAgaW50IGJvcnJvd19wID0gMDsKKyAgT1BfQkVHSU4gKHRzdC0+YmVnaW4pOworICBwcmludF9oZXggKHRzdC0+YmVnaW4sIE4pOworICBmb3IgKG9wID0gdHN0LT5vcHM7IG9wLT5vcCAhPSBOVUxMOyBvcCsrKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiAlcyAiLCBvcC0+b3ApOworICAgICAgcHJpbnRfaGV4IChvcC0+YXJnLCBOKTsKKyAgICAgIGlmIChzdHJjbXAgKG9wLT5vcCwgIkFEREMiKSA9PSAwKQorCU9QX0FEREMgKG9wLT5hcmcpOworICAgICAgZWxzZSBpZiAoc3RyY21wIChvcC0+b3AsICJBRERDX0MwIikgPT0gMCkKKwlPUF9BRERDX0MgKG9wLT5hcmcsIDApOworICAgICAgZWxzZSBpZiAoc3RyY21wIChvcC0+b3AsICJBRERDX0MxIikgPT0gMCkKKwlPUF9BRERDX0MgKG9wLT5hcmcsIDEpOworICAgICAgZWxzZSBpZiAoc3RyY21wIChvcC0+b3AsICJTVUJDIikgPT0gMCkKKwlPUF9TVUJDIChvcC0+YXJnKTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAob3AtPm9wLCAiU1VCQ19YMCIpID09IDApCisJT1BfU1VCQ19YIChvcC0+YXJnLCAwKTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAob3AtPm9wLCAiU1VCQ19YMSIpID09IDApCisJT1BfU1VCQ19YIChvcC0+YXJnLCAxKTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCAob3AtPm9wLCAiU1VCQiIpID09IDApCisJeworCSAgT1BfU1VCQiAob3AtPmFyZyk7CisJICBib3Jyb3dfcCArKzsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG9wLT5vcCwgIlNVQkJfQjAiKSA9PSAwKQorCXsKKwkgIE9QX1NVQkJfQiAob3AtPmFyZywgMCk7CisJICBib3Jyb3dfcCArKzsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG9wLT5vcCwgIlNVQkJfQjEiKSA9PSAwKQorCXsKKwkgIE9QX1NVQkJfQiAob3AtPmFyZywgMSk7CisJICBib3Jyb3dfcCArKzsKKwl9CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG9wLT5vcCwgIk5FR0MiKSA9PSAwKQorCU9QX05FR0MgKCk7CisgICAgICBlbHNlIGlmIChzdHJjbXAgKG9wLT5vcCwgIk5FR0IiKSA9PSAwKQorCXsKKwkgIE9QX05FR0IgKCk7CisJICBib3Jyb3dfcCArKzsKKwl9CisgICAgICBlbHNlCisJeworCSAgcHJpbnRmICgiIC0tIG9wZXJhdG9yIHVua25vd25cbiIpOworCSAgYWJvcnQgKCk7CisJfQorICAgIH0KKyAgcHJpbnRmICgiID0gIik7CisgIHByaW50X2hleCAodHN0LT5yZXN1bHQsIE4pOworICBpZiAoYm9ycm93X3ApCisgICAgcHJpbnRmICgiIEI6JWQiLCB0c3QtPmNhcnJ5X2JvcnJvdyk7CisgIGVsc2UKKyAgICBwcmludGYgKCIgQzolZCIsIHRzdC0+Y2FycnlfYm9ycm93KTsKKyAgcHJpbnRmICgiIFY6JWQiLCB0c3QtPm92ZXJmbG93KTsKKyAgaWYgKHRzdC0+Y2FycnlfYm9ycm93ICE9IEhBRF9DQVJSWV9CT1JST1cpCisgICAgeworICAgICAgaWYgKGJvcnJvd19wKQorCXByaW50ZiAoIiAtLSBib3Jyb3cgKCVkKSB3cm9uZyIsIEhBRF9DQVJSWV9CT1JST1cpOworICAgICAgZWxzZQorCXByaW50ZiAoIiAtLSBjYXJyeSAoJWQpIHdyb25nIiwgSEFEX0NBUlJZX0JPUlJPVyk7CisgICAgICBlcnJvcnMgKys7CisgICAgfQorICBpZiAodHN0LT5vdmVyZmxvdyAhPSBIQURfT1ZFUkZMT1cpCisgICAgeworICAgICAgcHJpbnRmICgiIC0tIG92ZXJmbG93ICglZCkgd3JvbmciLCBIQURfT1ZFUkZMT1cpOworICAgICAgZXJyb3JzICsrOworICAgIH0KKyAgaWYgKCh1bnNpZ25lZE4pIENBUlJZX0JPUlJPV19SRVNVTFQgIT0gKHVuc2lnbmVkTikgdHN0LT5yZXN1bHQpCisgICAgeworICAgICAgcHJpbnRmICgiIC0tIHJlc3VsdCBmb3IgY2FycnkvYm9ycm93IHdyb25nICIpOworICAgICAgcHJpbnRfaGV4IChDQVJSWV9CT1JST1dfUkVTVUxULCBOKTsKKyAgICAgIGVycm9ycyArKzsKKyAgICB9CisgIGlmICgodW5zaWduZWROKSBPVkVSRkxPV19SRVNVTFQgIT0gKHVuc2lnbmVkTikgdHN0LT5yZXN1bHQpCisgICAgeworICAgICAgcHJpbnRmICgiIC0tIHJlc3VsdCBmb3Igb3ZlcmZsb3cgd3JvbmcgIik7CisgICAgICBwcmludF9oZXggKE9WRVJGTE9XX1JFU1VMVCwgTik7CisgICAgICBlcnJvcnMgKys7CisgICAgfQorICBpZiAoKHVuc2lnbmVkTikgUkVTVUxUICE9ICh1bnNpZ25lZE4pIHRzdC0+cmVzdWx0KQorICAgIHsKKyAgICAgIHByaW50ZiAoIiAtLSByZXN1bHQgd3JvbmcgIik7CisgICAgICBwcmludF9oZXggKFJFU1VMVCwgTik7CisgICAgICBlcnJvcnMgKys7CisgICAgfQorICBwcmludGYgKCJcbiIpOworfQorCisKK2NvbnN0IGFsdV90ZXN0IGFsdV9OX3Rlc3RzW10gPSB7CisKKyAgLyogMCArIDA7IDAgKyAxOyAxICsgMDsgMSArIDEgKi8KKyAgeyAwLCB7IHsgIkFEREMiLCAwIH0sIH0sIDAsIDAsIDAsIH0sCisgIHsgMCwgeyB7ICJBRERDIiwgMSB9LCB9LCAxLCAwLCAwLCB9LAorICB7IDEsIHsgeyAiQUREQyIsIDAgfSwgfSwgMSwgMCwgMCwgfSwKKyAgeyAxLCB7IHsgIkFEREMiLCAxIH0sIH0sIDIsIDAsIDAsIH0sCisKKyAgLyogMCArIDAgKyAwOyAwICsgMCArIDE7IDAgKyAxICsgMDsgMCArIDEgKyAxICovCisgIC8qIDEgKyAwICsgMDsgMSArIDAgKyAxOyAxICsgMSArIDA7IDEgKyAxICsgMSAqLworICB7IDAsIHsgeyAiQUREQ19DMCIsIDAgfSwgfSwgMCwgMCwgMCwgfSwKKyAgeyAwLCB7IHsgIkFERENfQzAiLCAxIH0sIH0sIDEsIDAsIDAsIH0sCisgIHsgMCwgeyB7ICJBRERDX0MxIiwgMCB9LCB9LCAxLCAwLCAwLCB9LAorICB7IDAsIHsgeyAiQUREQ19DMSIsIDEgfSwgfSwgMiwgMCwgMCwgfSwKKyAgeyAxLCB7IHsgIkFERENfQzAiLCAwIH0sIH0sIDEsIDAsIDAsIH0sCisgIHsgMSwgeyB7ICJBRERDX0MwIiwgMSB9LCB9LCAyLCAwLCAwLCB9LAorICB7IDEsIHsgeyAiQUREQ19DMSIsIDAgfSwgfSwgMiwgMCwgMCwgfSwKKyAgeyAxLCB7IHsgIkFERENfQzEiLCAxIH0sIH0sIDMsIDAsIDAsIH0sCisKKyAgLyogKi8KKyAgeyBNQVhfSU5ULCB7IHsgIkFEREMiLCAxIH0sIH0sIE1JTl9JTlQsIDAsIDEsIH0sCisgIHsgTUlOX0lOVCwgeyB7ICJBRERDIiwgLTEgfSwgfSwgTUFYX0lOVCwgMSwgMSwgfSwKKyAgeyBNQVhfSU5ULCB7IHsgIkFEREMiLCBNSU5fSU5UIH0sIH0sIC0xLCAwLCAwLCB9LAorICB7IE1JTl9JTlQsIHsgeyAiQUREQyIsIE1BWF9JTlQgfSwgfSwgLTEsIDAsIDAsIH0sCisgIHsgTUFYX0lOVCwgeyB7ICJBRERDIiwgTUFYX0lOVCB9LCB9LCBNQVhfSU5UIDw8IDEsIDAsIDEsIH0sCisgIHsgTUlOX0lOVCwgeyB7ICJBRERDIiwgTUlOX0lOVCB9LCB9LCAwLCAxLCAxLCB9LAorICAvKiAqLworICB7IDAsIHsgeyAiQUREQ19DMSIsIC0xIH0sIH0sIDAsIDEsIDAsIH0sCisgIHsgMCwgeyB7ICJBRERDX0MxIiwgLTIgfSwgfSwgLTEsIDAsIDAsIH0sCisgIHsgLTEsIHsgeyAiQUREQ19DMSIsIDAgfSwgfSwgMCwgMSwgMCwgfSwKKyAgeyAwLCB7IHsgIkFERENfQzAiLCAwIH0sIH0sIDAsIDAsIDAsIH0sCisgIHsgLTEsIHsgeyAiQUREQ19DMSIsIC0xIH0sIH0sIC0xLCAxLCAwLCB9LAorICB7IC0xLCB7IHsgIkFERENfQzEiLCAxIH0sIH0sIDEsIDEsIDAsIH0sCisgIHsgMCwgeyB7ICJBRERDX0MxIiwgTUFYX0lOVCB9LCB9LCBNSU5fSU5ULCAwLCAxLCB9LAorICB7IE1BWF9JTlQsIHsgeyAiQUREQ19DMSIsIDEgfSwgfSwgTUlOX0lOVCArIDEsIDAsIDEsIH0sCisgIHsgTUFYX0lOVCwgeyB7ICJBRERDX0MxIiwgTUlOX0lOVCB9LCB9LCAwLCAxLCAwLCB9LAorICB7IE1BWF9JTlQsIHsgeyAiQUREQ19DMSIsIE1BWF9JTlQgfSwgfSwgKE1BWF9JTlQgPDwgMSkgKyAxLCAwLCAxLCB9LAorICB7IE1BWF9JTlQsIHsgeyAiQUREQ19DMCIsIE1BWF9JTlQgfSwgfSwgTUFYX0lOVCA8PCAxLCAwLCAxLCB9LAorCisgIC8qIDAgLSAwICovCisgIHsgMCwgeyB7ICJTVUJDIiwgICAgMCB9LCB9LCAgMCwgMSwgMCwgfSwKKyAgeyAwLCB7IHsgIlNVQkIiLCAgICAwIH0sIH0sICAwLCAwLCAwLCB9LAorCisgIC8qIDAgLSAxICovCisgIHsgMCwgeyB7ICJTVUJDIiwgICAgMSB9LCB9LCAtMSwgMCwgMCwgfSwKKyAgeyAwLCB7IHsgIlNVQkIiLCAgICAxIH0sIH0sIC0xLCAxLCAwLCB9LAorCisgIC8qIDEgLSAwICovCisgIHsgMSwgeyB7ICJTVUJDIiwgICAgMCB9LCB9LCAgMSwgMSwgMCwgfSwKKyAgeyAxLCB7IHsgIlNVQkIiLCAgICAwIH0sIH0sICAxLCAwLCAwLCB9LAorCisgIC8qIDEgLSAxICovCisgIHsgMSwgeyB7ICJTVUJDIiwgICAgMSB9LCB9LCAgMCwgMSwgMCwgfSwKKyAgeyAxLCB7IHsgIlNVQkIiLCAgICAxIH0sIH0sICAwLCAwLCAwLCB9LAorCisgIC8qIDAgLSAwIC0gMCAqLworICB7IDAsIHsgeyAiU1VCQ19YMCIsIDAgfSwgfSwgLTEsIDAsIDAsIH0sCisgIHsgMCwgeyB7ICJTVUJCX0IwIiwgMCB9LCB9LCAgMCwgMCwgMCwgfSwKKworICAvKiAwIC0gMCAtIDEgKi8KKyAgeyAwLCB7IHsgIlNVQkNfWDAiLCAxIH0sIH0sIC0yLCAwLCAwLCB9LAorICB7IDAsIHsgeyAiU1VCQl9CMCIsIDEgfSwgfSwgLTEsIDEsIDAsIH0sCisKKyAgLyogMCAtIDEgLSAwICovCisgIHsgMCwgeyB7ICJTVUJDX1gxIiwgMCB9LCB9LCAgMCwgMSwgMCwgfSwKKyAgeyAwLCB7IHsgIlNVQkJfQjEiLCAwIH0sIH0sIC0xLCAxLCAwLCB9LAorCisgIC8qIDAgLSAxIC0gMSAqLworICB7IDAsIHsgeyAiU1VCQ19YMSIsIDEgfSwgfSwgLTEsIDAsIDAsIH0sCisgIHsgMCwgeyB7ICJTVUJCX0IxIiwgMSB9LCB9LCAtMiwgMSwgMCwgfSwKKworICAvKiAxIC0gMCAtIDAgKi8KKyAgeyAxLCB7IHsgIlNVQkNfWDAiLCAwIH0sIH0sICAwLCAxLCAwLCB9LAorICB7IDEsIHsgeyAiU1VCQl9CMCIsIDAgfSwgfSwgIDEsIDAsIDAsIH0sCisKKyAgLyogMSAtIDAgLSAxICovCisgIHsgMSwgeyB7ICJTVUJDX1gwIiwgMSB9LCB9LCAtMSwgMCwgMCwgfSwKKyAgeyAxLCB7IHsgIlNVQkJfQjAiLCAxIH0sIH0sICAwLCAwLCAwLCB9LAorCisgIC8qIDEgLSAxIC0gMCAqLworICB7IDEsIHsgeyAiU1VCQ19YMSIsIDAgfSwgfSwgIDEsIDEsIDAsIH0sCisgIHsgMSwgeyB7ICJTVUJCX0IxIiwgMCB9LCB9LCAgMCwgMCwgMCwgfSwKKworICAvKiAxIC0gMSAtIDEgKi8KKyAgeyAxLCB7IHsgIlNVQkNfWDEiLCAxIH0sIH0sICAwLCAxLCAwLCB9LAorICB7IDEsIHsgeyAiU1VCQl9CMSIsIDEgfSwgfSwgLTEsIDEsIDAsIH0sCisKKyAgLyogKi8KKyAgeyAwLCAgICAgICB7IHsgIlNVQkMiLCBNSU5fSU5UIH0sIH0sIE1JTl9JTlQsIDAsIDEsIH0sCisgIHsgTUlOX0lOVCwgeyB7ICJTVUJDIiwgMSB9LCB9LCBNQVhfSU5ULCAxLCAxLCB9LAorICB7IE1BWF9JTlQsIHsgeyAiU1VCQyIsIE1BWF9JTlQgfSwgfSwgMCwgMSwgMCwgfSwKKworICAvKiAqLworICB7IDAsICAgICAgIHsgeyAiU1VCQ19YMCIsIE1JTl9JTlQgfSwgfSwgTUFYX0lOVCwgMCwgMCwgfSwKKyAgeyBNSU5fSU5ULCB7IHsgIlNVQkNfWDEiLCAgICAgICAwIH0sIH0sIE1JTl9JTlQsIDEsIDAsIH0sCisgIHsgTUFYX0lOVCwgeyB7ICJTVUJDX1gwIiwgTUFYX0lOVCB9LCB9LCAgICAgIC0xLCAwLCAwLCB9LAorCisgIC8qICovCisgIHsgTUFYX0lOVCwgeyB7ICJORUdDIiwgMCB9LCB9LCBNSU5fSU5UICsgMSwgMCwgMCwgfSwKKyAgeyBNQVhfSU5ULCB7IHsgIk5FR0MiLCAwIH0sIH0sIE1JTl9JTlQgKyAxLCAwLCAwLCB9LAorICB7IE1JTl9JTlQsIHsgeyAiTkVHQyIsIDAgfSwgfSwgTUlOX0lOVCwgMCwgMSwgfSwKKyAgeyAwLCB7IHsgIk5FR0MiLCAwIH0sIH0sIDAsIDEsIDAsIH0sCisgIHsgLTEsIHsgeyAiTkVHQyIsIDAgfSwgfSwgMSwgMCwgMCwgfSwKKyAgeyAxLCB7IHsgIk5FR0MiLCAwIH0sIH0sIC0xLCAwLCAwLCB9LAorfTsKKworCitzdGF0aWMgdm9pZAorZG9fYWx1X05fdGVzdHMgKHZvaWQpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChhbHVfTl90ZXN0cykgLyBzaXplb2YgKCphbHVfTl90ZXN0cyk7IGkrKykKKyAgICB7CisgICAgICBjb25zdCBhbHVfdGVzdCAqdHN0ID0gJmFsdV9OX3Rlc3RzW2ldOworICAgICAgZG9fb3BfTiAodHN0KTsKKyAgICB9Cit9CisKKworI3VuZGVmIE9QX0JFR0lOCisjdW5kZWYgT1BfQUREQworI3VuZGVmIE9QX0FERENfQworI3VuZGVmIE9QX1NVQkIKKyN1bmRlZiBPUF9TVUJDCisjdW5kZWYgT1BfU1VCQ19YCisjdW5kZWYgT1BfU1VCQl9CCisjdW5kZWYgSEFEX09WRVJGTE9XCisjdW5kZWYgSEFEX0NBUlJZX0JPUlJPVworI3VuZGVmIE9WRVJGTE9XX1JFU1VMVAorI3VuZGVmIENBUlJZX0JPUlJPV19SRVNVTFQKKyN1bmRlZiBSRVNVTFQKKyN1bmRlZiBkb19vcF9OCisjdW5kZWYgdW5zaWduZWROCisjdW5kZWYgTUFYX0lOVAorI3VuZGVmIE1JTl9JTlQKKyN1bmRlZiBhbHVfTl90ZXN0cworI3VuZGVmIGRvX2FsdV9OX3Rlc3RzCisKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvY29tbW9uL2FsdS10c3QuYyBiL3NpbS90ZXN0c3VpdGUvY29tbW9uL2FsdS10c3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2ZmZmU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9jb21tb24vYWx1LXRzdC5jCkBAIC0wLDAgKzEsMTA0IEBACisjZGVmaW5lIFdJVEhfVEFSR0VUX1dPUkRfTVNCIDAKKyNkZWZpbmUgV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFIDY0CisjZGVmaW5lIFdJVEhfSE9TVF9XT1JEX0JJVFNJWkUgKHNpemVvZiAoaW50KSAqIDgpCisjZGVmaW5lIFdJVEhfVEFSR0VUX0JZVEVfT1JERVIgQklHX0VORElBTiAvKiBkb2VzIG5vdCBtYXR0ZXIgKi8KKworI2RlZmluZSBBU1NFUlQoRVhQUkVTU0lPTikgXAoreyBcCisgIGlmICghKEVYUFJFU1NJT04pKSB7IFwKKyAgICBmcHJpbnRmIChzdGRlcnIsICIlczolZDogYXNzZXJ0aW9uIGZhaWxlZCAtICVzXG4iLCBcCisgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAjRVhQUkVTU0lPTik7IFwKKyAgICBhYm9ydCAoKTsgXAorICB9IFwKK30KKworI2RlZmluZSBTSU1fQklUU19JTkxJTkUgKElOQ0xVREVfTU9EVUxFIHwgSU5DTFVERURfQllfTU9EVUxFKQorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJzaW0tYmFzaWNzLmgiCisKKyNpbmNsdWRlICJzaW0tYWx1LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisgIGNoYXIgKm9wOworICB1bnNpZ25lZDY0IGFyZzsKK30gYWx1X29wOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkNjQgYmVnaW47CisgIGFsdV9vcCBvcHNbNF07CisgIHVuc2lnbmVkNjQgcmVzdWx0OworICBpbnQgY2FycnlfYm9ycm93OworICBpbnQgb3ZlcmZsb3c7Cit9IGFsdV90ZXN0OworCisjZGVmaW5lIE1BWF9JTlQ4IFVOU0lHTkVENjQgKDEyNykKKyNkZWZpbmUgTUlOX0lOVDggVU5TSUdORUQ2NCAoMTI4KQorCisjZGVmaW5lIE1BWF9JTlQxNiBVTlNJR05FRDY0ICgzMjc2NykKKyNkZWZpbmUgTUlOX0lOVDE2IFVOU0lHTkVENjQgKDMyNzY4KQorCisjZGVmaW5lIE1BWF9JTlQzMiBVTlNJR05FRDY0ICgweDdmZmZmZmZmKQorI2RlZmluZSBNSU5fSU5UMzIgVU5TSUdORUQ2NCAoMHg4MDAwMDAwMCkKKworI2RlZmluZSBNQVhfSU5UNjQgVU5TSUdORUQ2NCAoMHg3ZmZmZmZmZmZmZmZmZmZmKQorI2RlZmluZSBNSU5fSU5UNjQgVU5TSUdORUQ2NCAoMHg4MDAwMDAwMDAwMDAwMDAwKQorCitzdGF0aWMgdm9pZAorcHJpbnRfaGV4ICh1bnNpZ25lZDY0IHZhbCwgaW50IG5yX2JpdHMpCit7CisgIHN3aXRjaCAobnJfYml0cykKKyAgICB7CisgICAgY2FzZSA4OgorICAgICAgcHJpbnRmICgiMHglMDJseCIsIChsb25nKSAodW5zaWduZWQ4KSAodmFsKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgICAgcHJpbnRmICgiMHglMDRseCIsIChsb25nKSAodW5zaWduZWQxNikgKHZhbCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjoKKyAgICAgIHByaW50ZiAoIjB4JTA4bHgiLCAobG9uZykgKHVuc2lnbmVkMzIpICh2YWwpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjQ6CisgICAgICBwcmludGYgKCIweCUwOGx4JTA4bHgiLAorCSAgICAgIChsb25nKSAodW5zaWduZWQzMikgKHZhbCA+PiAzMiksCisJICAgICAgKGxvbmcpICh1bnNpZ25lZDMyKSAodmFsKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCisKK2ludCBlcnJvcnMgPSAwOworCisKKyNkZWZpbmUgTiA4CisjaW5jbHVkZSAiYWx1LW4tdHN0LmgiCisjdW5kZWYgTgorCisjZGVmaW5lIE4gMTYKKyNpbmNsdWRlICJhbHUtbi10c3QuaCIKKyN1bmRlZiBOCisKKyNkZWZpbmUgTiAzMgorI2luY2x1ZGUgImFsdS1uLXRzdC5oIgorI3VuZGVmIE4KKworI2RlZmluZSBOIDY0CisjaW5jbHVkZSAiYWx1LW4tdHN0LmgiCisjdW5kZWYgTgorCisKKworaW50CittYWluICgpCit7CisgIGRvX2FsdV84X3Rlc3RzICgpOworICBkb19hbHVfMTZfdGVzdHMgKCk7CisgIGRvX2FsdV8zMl90ZXN0cyAoKTsKKyAgZG9fYWx1XzY0X3Rlc3RzICgpOworICByZXR1cm4gKGVycm9ycyAhPSAwKTsKK30KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvY29tbW9uL2JpdHMtZ2VuLmMgYi9zaW0vdGVzdHN1aXRlL2NvbW1vbi9iaXRzLWdlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZGRlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2NvbW1vbi9iaXRzLWdlbi5jCkBAIC0wLDAgKzEsMzE5IEBACisvKiBNaXNjZWxsYW5lb3VzIHNpbXVsYXRvciB1dGlsaXRpZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZword2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisKK3ZvaWQKK2dlbl9zdHJ1Y3QgKHZvaWQpCit7CisgIHByaW50ZiAoIlxuIik7CisgIHByaW50ZiAoInR5cGVkZWYgc3RydWN0IF90ZXN0X3R1cGxlcyB7XG4iKTsKKyAgcHJpbnRmICgiICBpbnQgbGluZTtcbiIpOworICBwcmludGYgKCIgIGludCByb3c7XG4iKTsKKyAgcHJpbnRmICgiICBpbnQgY29sO1xuIik7CisgIHByaW50ZiAoIiAgbG9uZyBsb25nIHZhbDtcbiIpOworICBwcmludGYgKCIgIGxvbmcgbG9uZyBjaGVjaztcbiIpOworICBwcmludGYgKCJ9IHRlc3RfdHVwbGVzO1xuIik7CisgIHByaW50ZiAoIlxuIik7CisgIHByaW50ZiAoInR5cGVkZWYgc3RydWN0IF90ZXN0X3NwZWMge1xuIik7CisgIHByaW50ZiAoIiAgY29uc3QgY2hhciAqZmlsZTtcbiIpOworICBwcmludGYgKCIgIGNvbnN0IGNoYXIgKm1hY3JvO1xuIik7CisgIHByaW50ZiAoIiAgaW50IG5yX3Jvd3M7XG4iKTsKKyAgcHJpbnRmICgiICBpbnQgbnJfY29scztcbiIpOworICBwcmludGYgKCIgIHRlc3RfdHVwbGVzICp0dXBsZXM7XG4iKTsKKyAgcHJpbnRmICgifSB0ZXN0X3NwZWM7XG4iKTsKK30KKworCit2b2lkCitnZW5fYml0IChpbnQgYml0c2l6ZSwKKwkgaW50IG1zYiwKKwkgY29uc3QgY2hhciAqbWFjcm8sCisJIGludCBucl9iaXRzKQoreworICBpbnQgaTsKKworICBwcmludGYgKCJcbi8qIFRlc3QgdGhlICVzIG1hY3JvICovXG4iLCBtYWNybyk7CisgIHByaW50ZiAoInRlc3RfdHVwbGVzICVzX3R1cGxlc1slZF0gPSB7XG4iLCBtYWNybywgbnJfYml0cyk7CisgIGZvciAoaSA9IDA7IGkgPCBucl9iaXRzOyBpKyspCisgICAgeworICAgICAgLyogY29tcHV0ZSB3aGF0IHdlIHRoaW5rIHRoZSB2YWx1ZSBpcyAqLworICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGJpdCA9IDE7CisgICAgICBpZiAobXNiID09IDApCisJYml0IDw8PSBucl9iaXRzIC0gaSAtIDE7CisgICAgICBlbHNlCisJYml0IDw8PSBpOworICAgICAgaWYgKGJpdHNpemUgPT0gMzIpCisJYml0ID0gKHVuc2lnbmVkKSBiaXQ7IC8qIHRydW5jYXRlIGl0ISAqLworICAgICAgLyogd3JpdGUgaXQgb3V0ICovCisgICAgICBwcmludGYgKCIgIHsgX19MSU5FX18sICIpOworICAgICAgcHJpbnRmICgiJWQsICUyZCwgIiwgLTEsIGkpOworICAgICAgcHJpbnRmICgiJXMgKCUyZCksICIsIG1hY3JvLCBpKTsKKyAgICAgIHByaW50ZiAoIlVOU0lHTkVENjQgKDB4JTA4bHglMDhseCksICIsCisJICAgICAgKGxvbmcpIChiaXQgPj4gMzIpLCAobG9uZykgYml0KTsKKyAgICAgIHByaW50ZiAoIn0sXG4iKTsKKyAgICB9CisgIHByaW50ZiAoIn07XG4iKTsKKyAgcHJpbnRmICgiXG4iKTsKKyAgcHJpbnRmICgidGVzdF9zcGVjICVzX3Rlc3QgPSB7IF9fRklMRV9fLCBcIiVzXCIsIDEsICVkLCAlc190dXBsZXMsIH07XG4iLAorCSAgbWFjcm8sIG1hY3JvLCBucl9iaXRzLCBtYWNybyk7CisgIHByaW50ZiAoIlxuIik7Cit9CisKKwordm9pZAorZ2VuX2VudW0gKGNvbnN0IGNoYXIgKm1hY3JvLAorCSAgaW50IG5yX2JpdHMpCit7CisgIGludCBpOworCisgIHByaW50ZiAoIlxuLyogVGVzdCB0aGUgJXMgbWFjcm8gaW4gYW4gZW51bSAqL1xuIiwgbWFjcm8pOworICBwcmludGYgKCJlbnVtIGVudW1fJXMge1xuIiwgbWFjcm8pOworICBmb3IgKGkgPSAwOyBpIDwgbnJfYml0czsgaSsrKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiAgZWxlbV8lc18lZCA9ICVzICglZCksXG4iLCBtYWNybywgaSwgbWFjcm8sIGkpOworICAgIH0KKyAgcHJpbnRmICgifTtcbiIpOworICBwcmludGYgKCJcbiIpOworfQorCisKK3ZvaWQKK2dlbl9tYXNrIChpbnQgYml0c2l6ZSwKKwkgIGNvbnN0IGNoYXIgKm1zYiwKKwkgIGNvbnN0IGNoYXIgKm1hY3JvLAorCSAgaW50IG5yX2JpdHMpCit7CisgIGludCBsOworICBpbnQgaDsKKyAgcHJpbnRmICgiXG4vKiBUZXN0IHRoZSAlcyVzIG1hY3JvICovXG4iLCBtc2IsIG1hY3JvKTsKKyAgcHJpbnRmICgidGVzdF90dXBsZXMgJXNfdHVwbGVzWyVkXVslZF0gPSB7XG4iLCBtYWNybywgbnJfYml0cywgbnJfYml0cyk7CisgIGZvciAobCA9IDA7IGwgPCBucl9iaXRzOyBsKyspCisgICAgeworICAgICAgcHJpbnRmICgiICB7XG4iKTsKKyAgICAgIGZvciAoaCA9IDA7IGggPCBucl9iaXRzOyBoKyspCisJeworCSAgcHJpbnRmICgiICAgIHsgX19MSU5FX18sICIpOworCSAgaWYgKChzdHJjbXAgKG1zYiwgIk1TIikgPT0gMCAmJiBsIDw9IGgpCisJICAgICAgfHwgKHN0cmNtcCAobXNiLCAiTVMiKSAhPSAwICYmIGwgPj0gaCkKKwkgICAgICB8fCAoc3RyY21wIChtYWNybywgIiIpID09IDApKQorCSAgICB7CisJICAgICAgLyogY29tcHV0ZSB0aGUgbWFzayAqLworCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtYXNrID0gMDsKKwkgICAgICBpbnQgYjsKKwkgICAgICBmb3IgKGIgPSAwOyBiIDwgbnJfYml0czsgYisrKQorCQl7CisJCSAgdW5zaWduZWQgbG9uZyBsb25nIGJpdCA9IDE7CisJCSAgaWYgKHN0cmNtcCAobXNiLCAiTVMiKSA9PSAwKQorCQkgICAgeworCQkgICAgICBpZiAoKGwgPD0gYiAmJiBiIDw9IGgpCisJCQkgIHx8IChoIDwgbCAmJiAoYiA8PSBoIHx8IGIgPj0gbCkpKQorCQkJYml0IDw8PSAobnJfYml0cyAtIGIgLSAxKTsKKwkJICAgICAgZWxzZQorCQkJYml0ID0gMDsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGlmICgobCA+PSBiICYmIGIgPj0gaCkKKwkJCSAgfHwgKGggPiBsICYmIChiID49IGggfHwgYiA8PSBsKSkpCisJCQliaXQgPDw9IGI7CisJCSAgICAgIGVsc2UKKwkJCWJpdCA9IDA7CisJCSAgICB9CisJCSAgbWFzayB8PSBiaXQ7CisJCX0KKwkgICAgICBpZiAoYml0c2l6ZSA9PSAzMikKKwkJbWFzayA9ICh1bnNpZ25lZCBsb25nKSBtYXNrOworCSAgICAgIHByaW50ZiAoIiVkLCAlZCwgIiwgbCwgaCk7CisJICAgICAgcHJpbnRmICgiJXMlcyAoJTJkLCAlMmQpLCAiLCBtc2IsIG1hY3JvLCBsLCBoKTsKKwkgICAgICBwcmludGYgKCJVTlNJR05FRDY0ICgweCUwOGx4JTA4bHgpLCAiLAorCQkgICAgICAobG9uZykgKG1hc2sgPj4gMzIpLCAobG9uZykgbWFzayk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgcHJpbnRmICgiLTEsIC0xLCAiKTsKKwkgIHByaW50ZiAoIn0sXG4iKTsKKwl9CisgICAgICBwcmludGYgKCIgIH0sXG4iKTsKKyAgICB9CisgIHByaW50ZiAoIn07XG4iKTsKKyAgcHJpbnRmICgiXG4iKTsKKyAgcHJpbnRmICgidGVzdF9zcGVjICVzX3Rlc3QgPSB7IF9fRklMRV9fLCBcIiVzJXNcIiwgJWQsICVkLCAmJXNfdHVwbGVzWzBdWzBdLCB9O1xuIiwKKwkgIG1hY3JvLCBtc2IsIG1hY3JvLCBucl9iaXRzLCBucl9iaXRzLCBtYWNybyk7CisgIHByaW50ZiAoIlxuIik7Cit9CisKKwordm9pZAordXNhZ2UgKGludCByZWFzb24pCit7CisgIGZwcmludGYgKHN0ZGVyciwgIlVzYWdlOlxuIik7CisgIGZwcmludGYgKHN0ZGVyciwgIiAgYml0cy1nZW4gPG5yLWJpdHM+IDxtc2I+IDxieXRlLW9yZGVyPlxuIik7CisgIGZwcmludGYgKHN0ZGVyciwgIkdlbmVyYXRlIGEgdGVzdCBjYXNlIGZvciB0aGUgc2ltdWxhdG9yIGJpdCBtYW5pcHVsYXRpb24gY29kZVxuIik7CisgIGZwcmludGYgKHN0ZGVyciwgIiAgPG5yLWJpdHM+ID0geyAzMiB8IDY0IH1cbiIpOworICBmcHJpbnRmIChzdGRlcnIsICIgIDxtc2I+ID0geyAwIHwgeyAzMSB8IDYzIH0gfVxuIik7CisgIGZwcmludGYgKHN0ZGVyciwgIiAgPGJ5dGUtb3JkZXI+ID0geyBiaWcgfCBsaXR0bGUgfVxuIik7CisKKyAgc3dpdGNoIChyZWFzb24pCisgICAgeworICAgIGNhc2UgMTogZnByaW50ZiAoc3RkZXJyLCAiV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50c1xuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJJbnZhbGlkIDxuci1iaXRzPiBhcmd1bWVudFxuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJJbnZhbGlkIDxtc2I+IGFyZ3VtZW50XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIkludmFsaWQgPGJ5dGUtb3JkZXI+IGFyZ3VtZW50XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgfQorCisgIGV4aXQgKDEpOworfQorCisKKworaW50CittYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqKmFyZ3Y7Cit7CisgIGludCBiaXRzaXplOworICBpbnQgbXNiOworICBjaGFyICptczsKKyAgaW50IGJpZ19lbmRpYW47CisKKyAgaWYgKGFyZ2MgIT0gNCkKKyAgICB1c2FnZSAoMSk7CisKKyAgaWYgKHN0cmNtcCAoYXJndiBbMV0sICIzMiIpID09IDApCisgICAgYml0c2l6ZSA9IDMyOworICBlbHNlIGlmIChzdHJjbXAgKGFyZ3YgWzFdLCAiNjQiKSA9PSAwKQorICAgIGJpdHNpemUgPSA2NDsKKyAgZWxzZQorICAgIHVzYWdlICgyKTsKKworICBpZiAoc3RyY21wIChhcmd2IFsyXSwgIjAiKSA9PSAwKQorICAgIG1zYiA9IDA7CisgIGVsc2UgaWYgKHN0cmNtcCAoYXJndiBbMl0sICIzMSIpID09IDAgJiYgYml0c2l6ZSA9PSAzMikKKyAgICBtc2IgPSAzMTsKKyAgZWxzZSBpZiAoc3RyY21wIChhcmd2IFsyXSwgIjYzIikgPT0gMCAmJiBiaXRzaXplID09IDY0KQorICAgIG1zYiA9IDYzOworICBlbHNlCisgICAgdXNhZ2UgKDMpOworICBpZiAobXNiID09IDApCisgICAgbXMgPSAiTVMiOworICBlbHNlCisgICAgbXMgPSAiTFMiOworICAKKyAgaWYgKHN0cmNtcCAoYXJndiBbM10sICJiaWciKSA9PSAwKQorICAgIGJpZ19lbmRpYW4gPSAxOworICBlbHNlIGlmIChzdHJjbXAgKGFyZ3YgWzNdLCAibGl0dGxlIikgPT0gMCkKKyAgICBiaWdfZW5kaWFuID0gMDsKKyAgZWxzZQorICAgIHVzYWdlICg0KTsKKyAgICAKKyAgcHJpbnRmICgiI2RlZmluZSBXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkUgJWRcbiIsIGJpdHNpemUpOworICBwcmludGYgKCIjZGVmaW5lIFdJVEhfVEFSR0VUX1dPUkRfTVNCICVkXG4iLCBtc2IpOworICBwcmludGYgKCIjZGVmaW5lIFdJVEhfSE9TVF9XT1JEX0JJVFNJWkUgJWRcbiIsIHNpemVvZiAoaW50KSAqIDgpOworICBwcmludGYgKCIjZGVmaW5lIFdJVEhfVEFSR0VUX0JZVEVfT1JERVIgJXNcbiIsIGJpZ19lbmRpYW4gPyAiQklHX0VORElBTiIgOiAiTElUVExFX0VORElBTiIpOworICBwcmludGYgKCJcbiIpOworICBwcmludGYgKCIjZGVmaW5lIFNJTV9CSVRTX0lOTElORSAoQUxMX0hfSU5MSU5FKVxuIik7CisgIHByaW50ZiAoIlxuIik7CisgIHByaW50ZiAoIiNkZWZpbmUgQVNTRVJUKFgpIGRvIHsgaWYgKCEoWCkpIGFib3J0KCk7IH0gd2hpbGUgKDApXG4iKTsKKyAgcHJpbnRmICgiXG4iKTsKKyAgcHJpbnRmICgiI2luY2x1ZGUgXCJzaW0tYmFzaWNzLmhcIlxuIik7CisKKyAgZ2VuX3N0cnVjdCAoKTsKKworCisKKyAgcHJpbnRmICgiI2RlZmluZSBET19CSVRfVEVTVFNcbiIpOworICBnZW5fYml0ICggNCwgbXNiLCAiQklUNCIsICA0KTsKKyAgZ2VuX2JpdCAoIDUsIG1zYiwgIkJJVDUiLCAgNSk7CisgIGdlbl9iaXQgKCA4LCBtc2IsICJCSVQ4IiwgIDgpOworICBnZW5fYml0ICgxMCwgbXNiLCAiQklUMTAiLCAxMCk7CisgIGdlbl9iaXQgKDE2LCBtc2IsICJCSVQxNiIsIDE2KTsKKyAgZ2VuX2JpdCAoMzIsIG1zYiwgIkJJVDMyIiwgMzIpOworICBnZW5fYml0ICg2NCwgbXNiLCAiQklUNjQiLCA2NCk7CisgIGdlbl9iaXQgKGJpdHNpemUsIG1zYiwgIkJJVCIsIDY0KTsKKworICBnZW5fYml0ICggOCwgIDggLSAxLCAiTFNCSVQ4IiwgICA4KTsKKyAgZ2VuX2JpdCAoMTYsIDE2IC0gMSwgIkxTQklUMTYiLCAxNik7CisgIGdlbl9iaXQgKDMyLCAzMiAtIDEsICJMU0JJVDMyIiwgMzIpOworICBnZW5fYml0ICg2NCwgNjQgLSAxLCAiTFNCSVQ2NCIsIDY0KTsKKyAgZ2VuX2JpdCAoYml0c2l6ZSwgYml0c2l6ZSAtIDEsICJMU0JJVCIsICAgNjQpOworCisgIGdlbl9iaXQgKCA4LCAgMCwgIk1TQklUOCIsICAgOCk7CisgIGdlbl9iaXQgKDE2LCAgMCwgIk1TQklUMTYiLCAxNik7CisgIGdlbl9iaXQgKDMyLCAgMCwgIk1TQklUMzIiLCAzMik7CisgIGdlbl9iaXQgKDY0LCAgMCwgIk1TQklUNjQiLCA2NCk7CisgIGdlbl9iaXQgKGJpdHNpemUsICAwLCAiTVNCSVQiLCAgIDY0KTsKKworICBwcmludGYgKCJ0ZXN0X3NwZWMgKihiaXRfdGVzdHNbXSkgPSB7XG4iKTsKKyAgcHJpbnRmICgiICAmQklUNF90ZXN0LFxuIik7CisgIHByaW50ZiAoIiAgJkJJVDVfdGVzdCxcbiIpOworICBwcmludGYgKCIgICZCSVQ4X3Rlc3QsXG4iKTsKKyAgcHJpbnRmICgiICAmQklUMTBfdGVzdCxcbiIpOworICBwcmludGYgKCIgICZCSVQxNl90ZXN0LFxuIik7CisgIHByaW50ZiAoIiAgJkJJVDMyX3Rlc3QsXG4iKTsKKyAgcHJpbnRmICgiICAmQklUNjRfdGVzdCxcbiIpOworICBwcmludGYgKCIgICZCSVRfdGVzdCxcbiIpOworICBwcmludGYgKCIgICZMU0JJVDhfdGVzdCxcbiIpOworICBwcmludGYgKCIgICZMU0JJVDE2X3Rlc3QsXG4iKTsKKyAgcHJpbnRmICgiICAmTFNCSVQzMl90ZXN0LFxuIik7CisgIHByaW50ZiAoIiAgJkxTQklUNjRfdGVzdCxcbiIpOworICBwcmludGYgKCIgICZMU0JJVF90ZXN0LFxuIik7CisgIHByaW50ZiAoIiAgJk1TQklUOF90ZXN0LFxuIik7CisgIHByaW50ZiAoIiAgJk1TQklUMTZfdGVzdCxcbiIpOworICBwcmludGYgKCIgICZNU0JJVDMyX3Rlc3QsXG4iKTsKKyAgcHJpbnRmICgiICAmTVNCSVQ2NF90ZXN0LFxuIik7CisgIHByaW50ZiAoIiAgJk1TQklUX3Rlc3QsXG4iKTsKKyAgcHJpbnRmICgiICAwLFxuIik7CisgIHByaW50ZiAoIn07XG5cbiIpOworCisgIGdlbl9lbnVtICgiQklUIiwgICA2NCk7CisgIGdlbl9lbnVtICgiTFNCSVQiLCA2NCk7CisgIGdlbl9lbnVtICgiTVNCSVQiLCA2NCk7CisgIGdlbl9lbnVtICgiQklUMzIiLCAgIDMyKTsKKyAgZ2VuX2VudW0gKCJMU0JJVDMyIiwgMzIpOworICBnZW5fZW51bSAoIk1TQklUMzIiLCAzMik7CisKKyAgcHJpbnRmICgiI2RlZmluZSBET19NQVNLX1RFU1RTXG4iKTsKKyAgZ2VuX21hc2sgKCA4LCBtcywgIk1BU0s4IiwgIDgpOworICBnZW5fbWFzayAoMTYsIG1zLCAiTUFTSzE2IiwgMTYpOworICBnZW5fbWFzayAoMzIsIG1zLCAiTUFTSzMyIiwgMzIpOworICBnZW5fbWFzayAoNjQsIG1zLCAiTUFTSzY0IiwgNjQpOworICBnZW5fbWFzayAoYml0c2l6ZSwgbXMsICJNQVNLIiwgNjQpOworCisgIHByaW50ZiAoInRlc3Rfc3BlYyAqKG1hc2tfdGVzdHNbXSkgPSB7XG4iKTsKKyAgcHJpbnRmICgiICAmTUFTSzhfdGVzdCxcbiIpOworICBwcmludGYgKCIgICZNQVNLMTZfdGVzdCxcbiIpOworICBwcmludGYgKCIgICZNQVNLMzJfdGVzdCxcbiIpOworICBwcmludGYgKCIgICZNQVNLNjRfdGVzdCxcbiIpOworICBwcmludGYgKCIgICZNQVNLX3Rlc3QsXG4iKTsKKyAgcHJpbnRmICgiICAwLFxuIik7CisgIHByaW50ZiAoIn07XG5cbiIpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9jb21tb24vYml0cy10c3QuYyBiL3NpbS90ZXN0c3VpdGUvY29tbW9uL2JpdHMtdHN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE0MjEwYQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvY29tbW9uL2JpdHMtdHN0LmMKQEAgLTAsMCArMSw0MDggQEAKKyMgMiAiYml0cy10c3QuYyIKKworLyogRHJpdmUgdGhlIGJpdCB0ZXN0IHJvdXRpbmVzICovCisKKworbG9uZyBsb25nCitjYWxjIChjb25zdCBjaGFyICpjYWxsLAorICAgICAgbG9uZyBsb25nIHZhbCwKKyAgICAgIGludCByb3csCisgICAgICBpbnQgY29sKQoreworICBpZiAoc3RyY21wIChjYWxsLCAiTUFTSyIpID09IDApCisgICAgcmV0dXJuIE1BU0tFRCAodmFsLCByb3csIGNvbCk7CisgIGlmIChzdHJjbXAgKGNhbGwsICJNQVNLOCIpID09IDApCisgICAgcmV0dXJuIE1BU0tFRDggKHZhbCwgcm93LCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiTUFTSzE2IikgPT0gMCkKKyAgICByZXR1cm4gTUFTS0VEMTYgKHZhbCwgcm93LCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiTUFTSzMyIikgPT0gMCkKKyAgICByZXR1cm4gTUFTS0VEMzIgKHZhbCwgcm93LCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiTUFTSzY0IikgPT0gMCkKKyAgICByZXR1cm4gTUFTS0VENjQgKHZhbCwgcm93LCBjb2wpOworCisgIGlmIChzdHJjbXAgKGNhbGwsICJFWFRSQUNUIikgPT0gMCkKKyAgICByZXR1cm4gRVhUUkFDVEVEICh2YWwsIHJvdywgY29sKTsKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIkVYVFJBQ1Q4IikgPT0gMCkKKyAgICByZXR1cm4gRVhUUkFDVEVEOCAodmFsLCByb3csIGNvbCk7CisgIGlmIChzdHJjbXAgKGNhbGwsICJFWFRSQUNUMTYiKSA9PSAwKQorICAgIHJldHVybiBFWFRSQUNURUQxNiAodmFsLCByb3csIGNvbCk7CisgIGlmIChzdHJjbXAgKGNhbGwsICJFWFRSQUNUMzIiKSA9PSAwKQorICAgIHJldHVybiBFWFRSQUNURUQzMiAodmFsLCByb3csIGNvbCk7CisgIGlmIChzdHJjbXAgKGNhbGwsICJFWFRSQUNUNjQiKSA9PSAwKQorICAgIHJldHVybiBFWFRSQUNURUQ2NCAodmFsLCByb3csIGNvbCk7CisKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIkxTRVhUUkFDVCIpID09IDApCisgICAgcmV0dXJuIExTRVhUUkFDVEVEICh2YWwsIHJvdywgY29sKTsKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIkxTRVhUUkFDVDgiKSA9PSAwKQorICAgIHJldHVybiBMU0VYVFJBQ1RFRDggKHZhbCwgcm93LCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiTFNFWFRSQUNUMTYiKSA9PSAwKQorICAgIHJldHVybiBMU0VYVFJBQ1RFRDE2ICh2YWwsIHJvdywgY29sKTsKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIkxTRVhUUkFDVDMyIikgPT0gMCkKKyAgICByZXR1cm4gTFNFWFRSQUNURUQzMiAodmFsLCByb3csIGNvbCk7CisgIGlmIChzdHJjbXAgKGNhbGwsICJMU0VYVFJBQ1Q2NCIpID09IDApCisgICAgcmV0dXJuIExTRVhUUkFDVEVENjQgKHZhbCwgcm93LCBjb2wpOworCisgIGlmIChzdHJjbXAgKGNhbGwsICJNU0VYVFJBQ1QiKSA9PSAwKQorICAgIHJldHVybiBNU0VYVFJBQ1RFRCAodmFsLCByb3csIGNvbCk7CisgIGlmIChzdHJjbXAgKGNhbGwsICJNU0VYVFJBQ1Q4IikgPT0gMCkKKyAgICByZXR1cm4gTVNFWFRSQUNURUQ4ICh2YWwsIHJvdywgY29sKTsKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIk1TRVhUUkFDVDE2IikgPT0gMCkKKyAgICByZXR1cm4gTVNFWFRSQUNURUQxNiAodmFsLCByb3csIGNvbCk7CisgIGlmIChzdHJjbXAgKGNhbGwsICJNU0VYVFJBQ1QzMiIpID09IDApCisgICAgcmV0dXJuIE1TRVhUUkFDVEVEMzIgKHZhbCwgcm93LCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiTVNFWFRSQUNUNjQiKSA9PSAwKQorICAgIHJldHVybiBNU0VYVFJBQ1RFRDY0ICh2YWwsIHJvdywgY29sKTsKKworICBpZiAoc3RyY21wIChjYWxsLCAiSU5TRVJUIikgPT0gMCkKKyAgICByZXR1cm4gSU5TRVJURUQgKHZhbCwgcm93LCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiSU5TRVJUOCIpID09IDApCisgICAgcmV0dXJuIElOU0VSVEVEOCAodmFsLCByb3csIGNvbCk7CisgIGlmIChzdHJjbXAgKGNhbGwsICJJTlNFUlQxNiIpID09IDApCisgICAgcmV0dXJuIElOU0VSVEVEMTYgKHZhbCwgcm93LCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiSU5TRVJUMzIiKSA9PSAwKQorICAgIHJldHVybiBJTlNFUlRFRDMyICh2YWwsIHJvdywgY29sKTsKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIklOU0VSVDY0IikgPT0gMCkKKyAgICByZXR1cm4gSU5TRVJURUQ2NCAodmFsLCByb3csIGNvbCk7CisKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIkxTSU5TRVJUIikgPT0gMCkKKyAgICByZXR1cm4gTFNJTlNFUlRFRCAodmFsLCByb3csIGNvbCk7CisgIGlmIChzdHJjbXAgKGNhbGwsICJMU0lOU0VSVDgiKSA9PSAwKQorICAgIHJldHVybiBMU0lOU0VSVEVEOCAodmFsLCByb3csIGNvbCk7CisgIGlmIChzdHJjbXAgKGNhbGwsICJMU0lOU0VSVDE2IikgPT0gMCkKKyAgICByZXR1cm4gTFNJTlNFUlRFRDE2ICh2YWwsIHJvdywgY29sKTsKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIkxTSU5TRVJUMzIiKSA9PSAwKQorICAgIHJldHVybiBMU0lOU0VSVEVEMzIgKHZhbCwgcm93LCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiTFNJTlNFUlQ2NCIpID09IDApCisgICAgcmV0dXJuIExTSU5TRVJURUQ2NCAodmFsLCByb3csIGNvbCk7CisKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIk1TSU5TRVJUIikgPT0gMCkKKyAgICByZXR1cm4gTVNJTlNFUlRFRCAodmFsLCByb3csIGNvbCk7CisgIGlmIChzdHJjbXAgKGNhbGwsICJNU0lOU0VSVDgiKSA9PSAwKQorICAgIHJldHVybiBNU0lOU0VSVEVEOCAodmFsLCByb3csIGNvbCk7CisgIGlmIChzdHJjbXAgKGNhbGwsICJNU0lOU0VSVDE2IikgPT0gMCkKKyAgICByZXR1cm4gTVNJTlNFUlRFRDE2ICh2YWwsIHJvdywgY29sKTsKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIk1TSU5TRVJUMzIiKSA9PSAwKQorICAgIHJldHVybiBNU0lOU0VSVEVEMzIgKHZhbCwgcm93LCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiTVNJTlNFUlQ2NCIpID09IDApCisgICAgcmV0dXJuIE1TSU5TRVJURUQ2NCAodmFsLCByb3csIGNvbCk7CisKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIk1TTUFTSyIpID09IDApCisgICAgcmV0dXJuIE1TTUFTS0VEICh2YWwsIHJvdywgY29sKTsKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIk1TTUFTSzgiKSA9PSAwKQorICAgIHJldHVybiBNU01BU0tFRDggKHZhbCwgcm93LCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiTVNNQVNLMTYiKSA9PSAwKQorICAgIHJldHVybiBNU01BU0tFRDE2ICh2YWwsIHJvdywgY29sKTsKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIk1TTUFTSzMyIikgPT0gMCkKKyAgICByZXR1cm4gTVNNQVNLRUQzMiAodmFsLCByb3csIGNvbCk7CisgIGlmIChzdHJjbXAgKGNhbGwsICJNU01BU0s2NCIpID09IDApCisgICAgcmV0dXJuIE1TTUFTS0VENjQgKHZhbCwgcm93LCBjb2wpOworCisgIGlmIChzdHJjbXAgKGNhbGwsICJMU01BU0siKSA9PSAwKQorICAgIHJldHVybiBMU01BU0tFRCAodmFsLCByb3csIGNvbCk7CisgIGlmIChzdHJjbXAgKGNhbGwsICJMU01BU0s4IikgPT0gMCkKKyAgICByZXR1cm4gTFNNQVNLRUQ4ICh2YWwsIHJvdywgY29sKTsKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIkxTTUFTSzE2IikgPT0gMCkKKyAgICByZXR1cm4gTFNNQVNLRUQxNiAodmFsLCByb3csIGNvbCk7CisgIGlmIChzdHJjbXAgKGNhbGwsICJMU01BU0szMiIpID09IDApCisgICAgcmV0dXJuIExTTUFTS0VEMzIgKHZhbCwgcm93LCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiTFNNQVNLNjQiKSA9PSAwKQorICAgIHJldHVybiBMU01BU0tFRDY0ICh2YWwsIHJvdywgY29sKTsKKworICBpZiAoc3RyY21wIChjYWxsLCAiUk9UNjQiKSA9PSAwKQorICAgIHJldHVybiBST1Q2NCAodmFsLCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiUk9UOCIpID09IDApCisgICAgcmV0dXJuIFJPVDggKHZhbCwgY29sKTsKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIlJPVDE2IikgPT0gMCkKKyAgICByZXR1cm4gUk9UMTYgKHZhbCwgY29sKTsKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIlJPVDMyIikgPT0gMCkKKyAgICByZXR1cm4gUk9UMzIgKHZhbCwgY29sKTsKKworICBpZiAoc3RyY21wIChjYWxsLCAiU0VYVCIpID09IDApCisgICAgcmV0dXJuIFNFWFQgKHZhbCwgY29sKTsKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIlNFWFQ4IikgPT0gMCkKKyAgICByZXR1cm4gU0VYVDggKHZhbCwgY29sKTsKKyAgaWYgKHN0cmNtcCAoY2FsbCwgIlNFWFQxNiIpID09IDApCisgICAgcmV0dXJuIFNFWFQxNiAodmFsLCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiU0VYVDMyIikgPT0gMCkKKyAgICByZXR1cm4gU0VYVDMyICh2YWwsIGNvbCk7CisgIGlmIChzdHJjbXAgKGNhbGwsICJTRVhUNjQiKSA9PSAwKQorICAgIHJldHVybiBTRVhUNjQgKHZhbCwgY29sKTsKKworICBpZiAoc3RyY21wIChjYWxsLCAiTFNTRVhUIikgPT0gMCkKKyAgICByZXR1cm4gTFNTRVhUICh2YWwsIGNvbCk7CisgIGlmIChzdHJjbXAgKGNhbGwsICJMU1NFWFQ4IikgPT0gMCkKKyAgICByZXR1cm4gTFNTRVhUOCAodmFsLCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiTFNTRVhUMTYiKSA9PSAwKQorICAgIHJldHVybiBMU1NFWFQxNiAodmFsLCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiTFNTRVhUMzIiKSA9PSAwKQorICAgIHJldHVybiBMU1NFWFQzMiAodmFsLCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiTFNTRVhUNjQiKSA9PSAwKQorICAgIHJldHVybiBMU1NFWFQ2NCAodmFsLCBjb2wpOworCisgIGlmIChzdHJjbXAgKGNhbGwsICJNU1NFWFQ4IikgPT0gMCkKKyAgICByZXR1cm4gTVNTRVhUOCAodmFsLCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiTVNTRVhUMTYiKSA9PSAwKQorICAgIHJldHVybiBNU1NFWFQxNiAodmFsLCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiTVNTRVhUMzIiKSA9PSAwKQorICAgIHJldHVybiBNU1NFWFQzMiAodmFsLCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiTVNTRVhUNjQiKSA9PSAwKQorICAgIHJldHVybiBNU1NFWFQ2NCAodmFsLCBjb2wpOworICBpZiAoc3RyY21wIChjYWxsLCAiTVNTRVhUIikgPT0gMCkKKyAgICByZXR1cm4gTVNTRVhUICh2YWwsIGNvbCk7CisKKyAgZWxzZQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwKKwkgICAgICAgIlVua25vd24gY2FsbCBwYXNzZWQgdG8gY2FsYyAoJXMsIDB4JTA4bHglMDhseCwgJWQsICVkKVxuIiwKKwkgICAgICAgY2FsbCwgKGxvbmcpKHZhbCA+PiAzMiksIChsb25nKXZhbCwgcm93LCBjb2wpOworICAgICAgYWJvcnQgKCk7CisgICAgICByZXR1cm4gdmFsOworICAgIH0KK30KKworCitpbnQKK2NoZWNrX3NleHQgKGludCBucl9iaXRzLAorCSAgICBpbnQgbXNiX25yLAorCSAgICBjb25zdCBjaGFyICpzZXh0ZWQsCisJICAgIGNvbnN0IGNoYXIgKm1hc2tlZCwKKwkgICAgY29uc3QgY2hhciAqbXNtYXNrZWQpCit7CisgIGludCBlcnJvcnMgPSAwOworICBpbnQgY29sOworICBmb3IgKGNvbCA9IDA7IGNvbCA8IG5yX2JpdHM7IGNvbCArKykKKyAgICB7CisgICAgICBsb25nIGxvbmcgbWFzayA9IGNhbGMgKG1hc2tlZCwgLTEsIGNvbCwgY29sKTsKKyAgICAgIGxvbmcgbG9uZyBtc21hc2sgPSBjYWxjIChtc21hc2tlZCwgLTEsCisJCQkgICAgICAgMCwgKG1zYl9uciA/IG5yX2JpdHMgLSBjb2wgLSAxIDogY29sKSk7CisgICAgICBsb25nIGxvbmcgc2V4dCA9IGNhbGMgKHNleHRlZCwgbWFzaywgLTEsIGNvbCk7CisgICAgICBsb25nIGxvbmcgbWFza18xID0gbWFzayA+PiAxOworICAgICAgbG9uZyBsb25nIHNleHRfMSA9IGNhbGMgKHNleHRlZCwgbWFza18xLCAtMSwgY29sKTsKKyAgICAgIGxvbmcgbG9uZyBtYXNrXzAgPSAobWFzayA8PCAxKSB8IG1hc2tfMTsKKyAgICAgIGxvbmcgbG9uZyBzZXh0XzAgPSBjYWxjIChzZXh0ZWQsIG1hc2tfMCwgLTEsIGNvbCk7CisgICAgICBpZiAoc2V4dF8wICE9IG1hc2tfMSkKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsCisJCSAgICIlczolZDogIiwgX19GSUxFX18sIF9fTElORV9fKTsKKwkgIGZwcmludGYgKHN0ZGVyciwKKwkJICAgIiAlcygweCUwOGx4JTA4bHgsJWQpID09IDB4JTA4bHglMDhseCB3cm9uZywgIT0gMHglMDhseCUwOGx4XG4iLAorCQkgICBzZXh0ZWQsIChsb25nKShtYXNrXzAgPj4gMzIpLCAobG9uZyltYXNrXzAsIGNvbCwKKwkJICAgKGxvbmcpKHNleHRfMCA+PiAzMiksIChsb25nKXNleHRfMCwKKwkJICAgKGxvbmcpKG1hc2tfMSA+PiAzMiksIChsb25nKW1hc2tfMSk7CisJICBlcnJvcnMgKys7CisJfQorICAgICAgaWYgKHNleHRfMSAhPSBtYXNrXzEpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLAorCQkgICAiJXM6JWQ6ICIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJICBmcHJpbnRmIChzdGRlcnIsCisJCSAgICIgJXMoMHglMDhseCUwOGx4LCVkKSA9PSAweCUwOGx4JTA4bHggd3JvbmcsICE9IDB4JTA4bHglMDhseFxuIiwKKwkJICAgc2V4dGVkLCAobG9uZykobWFza18xID4+IDMyKSwgKGxvbmcpbWFza18xLCBjb2wsCisJCSAgIChsb25nKShzZXh0XzEgPj4gMzIpLCAobG9uZylzZXh0XzEsCisJCSAgIChsb25nKShtYXNrXzEgPj4gMzIpLCAobG9uZyltYXNrXzEpOworCSAgZXJyb3JzICsrOworCX0KKyAgICAgIGlmIChzZXh0ICE9IG1zbWFzaykKKwl7CisJICBmcHJpbnRmIChzdGRlcnIsCisJCSAgICIlczolZDogIiwgX19GSUxFX18sIF9fTElORV9fKTsKKwkgIGZwcmludGYgKHN0ZGVyciwKKwkJICAgIiAlcygweCUwOGx4JTA4bHgsJWQpID09IDB4JTA4bHglMDhseCB3cm9uZywgIT0gMHglMDhseCUwOGx4ICglcyglZCwlZCkpXG4iLAorCQkgICBzZXh0ZWQsIChsb25nKShtYXNrID4+IDMyKSwgKGxvbmcpbWFzaywgY29sLAorCQkgICAobG9uZykoc2V4dCA+PiAzMiksIChsb25nKXNleHQsCisJCSAgIChsb25nKShtc21hc2sgPj4gMzIpLCAobG9uZyltc21hc2ssCisJCSAgIG1zbWFza2VkLCAwLCAobXNiX25yID8gbnJfYml0cyAtIGNvbCAtIDEgOiBjb2wpKTsKKwkgIGVycm9ycyArKzsKKwl9CisKKyAgICB9CisgIHJldHVybiBlcnJvcnM7Cit9CisKKworaW50CitjaGVja19yb3QgKGludCBucl9iaXRzLAorCSAgIGNvbnN0IGNoYXIgKnJvdGVkLAorCSAgIGNvbnN0IGNoYXIgKm1hc2tlZCkKK3sKKyAgaW50IGVycm9ycyA9IDA7CisgIGludCByb3c7CisgIGludCBjb2w7CisgIGZvciAocm93ID0gMDsgcm93IDwgbnJfYml0czsgcm93KyspCisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBucl9iaXRzOyBjb2wrKykKKyAgICAgIGlmICgoV0lUSF9UQVJHRVRfV09SRF9NU0IgPT0gMCAmJiByb3cgPD0gY29sKQorCSAgfHwgKFdJVEhfVEFSR0VUX1dPUkRfTVNCICE9IDAgJiYgcm93ID49IGNvbCkpCisJeworCSAgbG9uZyBsb25nIG1hc2sgPSBjYWxjIChtYXNrZWQsIC0xLCByb3csIGNvbCk7CisJICBpbnQgc2hpZnQ7CisJICBmb3IgKHNoaWZ0ID0gLW5yX2JpdHMgKyAxOyBzaGlmdCA8IG5yX2JpdHM7IHNoaWZ0ICsrKQorCSAgICB7CisJICAgICAgbG9uZyBsb25nIHJvdCA9IGNhbGMgKHJvdGVkLCBtYXNrLCAtMSwgc2hpZnQpOworCSAgICAgIGxvbmcgbG9uZyB1cm90ID0gY2FsYyAocm90ZWQsIHJvdCwgLTEsIC1zaGlmdCk7CisJICAgICAgaWYgKG1hc2sgIT0gdXJvdAorCQkgIHx8IChzaGlmdCA9PSAwICYmIHJvdCAhPSBtYXNrKQorCQkgIHx8IChzaGlmdCAhPSAwICYmIHJvdCA9PSBtYXNrICYmIGFicyhyb3cgLSBjb2wpICE9IChucl9iaXRzIC0gMSkpKQorCQl7CisJCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JWQ6ICIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJCSAgZnByaW50ZiAoc3RkZXJyLCAiICVzKCVzKDB4JTA4bHglMDhseCwlZCkgPT0gMHglMDhseCUwOGx4LCAlZCkgZmFpbGVkXG4iLAorCQkJICAgcm90ZWQsIHJvdGVkLAorCQkJICAgKGxvbmcpKG1hc2sgPj4gMzIpLCAobG9uZyltYXNrLCBzaGlmdCwKKwkJCSAgIChsb25nKSh1cm90ID4+IDMyKSwgKGxvbmcpdXJvdCwgLXNoaWZ0KTsKKwkJICBlcnJvcnMgKys7CisJCX0KKwkgICAgfQorCX0KKyAgcmV0dXJuIGVycm9yczsKK30KKworCitpbnQKK2NoZWNrX2V4dHJhY3QgKGludCBucl9iaXRzLAorCSAgICAgICBjb25zdCBjaGFyICpleHRyYWN0ZWQsCisJICAgICAgIGNvbnN0IGNoYXIgKmluc2VydGVkLAorCSAgICAgICBjb25zdCBjaGFyICptYXNrZWQpCit7CisgIGludCBlcnJvcnMgPSAwOworICBpbnQgcm93OworICBpbnQgY29sOworICBmb3IgKHJvdyA9IDA7IHJvdyA8IG5yX2JpdHM7IHJvdysrKQorICAgIGZvciAoY29sID0gMDsgY29sIDwgbnJfYml0czsgY29sICsrKQorICAgICAgaWYgKChXSVRIX1RBUkdFVF9XT1JEX01TQiA9PSAwICYmIHJvdyA8PSBjb2wpCisJICB8fCAoV0lUSF9UQVJHRVRfV09SRF9NU0IgIT0gMCAmJiByb3cgPj0gY29sKSkKKwl7CisJICBsb25nIGxvbmcgbWFzayA9IGNhbGMgKG1hc2tlZCwgLTEsIHJvdywgY29sKTsKKwkgIGxvbmcgbG9uZyBleHRyID0gY2FsYyAoZXh0cmFjdGVkLCBtYXNrLCByb3csIGNvbCk7CisJICBsb25nIGxvbmcgaW5zdCA9IGNhbGMgKGluc2VydGVkLCBleHRyLCByb3csIGNvbCk7CisJICBpZiAobWFzayAhPSBpbnN0KQorCSAgICB7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JWQ6ICIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICVzKCVkLCVkKT0weCUwOGx4JTA4bHggLT4gJXM9MHglMDhseCUwOGx4IC0+ICVzPTB4JTA4bHglMDhseCBmYWlsZWRcbiIsCisJCSAgICAgICBtYXNrZWQsIHJvdywgY29sLCAobG9uZykobWFzayA+PiAzMiksIChsb25nKW1hc2ssCisJCSAgICAgICBleHRyYWN0ZWQsIChsb25nKShleHRyID4+IDMyKSwgKGxvbmcpZXh0ciwKKwkJICAgICAgIGluc2VydGVkLCAobG9uZykoaW5zdCA+PiAzMiksIChsb25nKWluc3QpOworCSAgICAgIGVycm9ycyArKzsKKwkgICAgfQorCX0KKyAgcmV0dXJuIGVycm9yczsKK30KKworCitpbnQKK2NoZWNrX2JpdHMgKGludCBjYWxsLAorCSAgICB0ZXN0X3NwZWMgKip0ZXN0cykKK3sKKyAgaW50IHI7CisgIGludCBjOworICBpbnQgZXJyb3JzID0gMDsKKyAgd2hpbGUgKCp0ZXN0cyAhPSBOVUxMKQorICAgIHsKKyAgICAgIGludCBucl9yb3dzID0gKCp0ZXN0cyktPm5yX3Jvd3M7CisgICAgICBpbnQgbnJfY29scyA9ICgqdGVzdHMpLT5ucl9jb2xzOworICAgICAgdGVzdF90dXBsZXMgKnR1cGxlcyA9ICgqdGVzdHMpLT50dXBsZXM7CisgICAgICBmb3IgKHIgPSAwOyByIDwgbnJfcm93czsgcisrKQorCWZvciAoYyA9IDA7IGMgPCBucl9jb2xzOyBjKyspCisJICB7CisJICAgIGludCBpID0gciAqIG5yX3Jvd3MgKyBjOworCSAgICB0ZXN0X3R1cGxlcyAqdHVwbGUgPSAmdHVwbGVzW2ldOworCSAgICBpZiAodHVwbGUtPmNvbCA+PSAwKQorCSAgICAgIHsKKwkJbG9uZyBsb25nIHZhbCA9ICghY2FsbCA/IHR1cGxlLT52YWwgOiBjYWxjICgoKnRlc3RzKS0+bWFjcm8sIC0xLAorCQkJCQkJCSAgICB0dXBsZS0+cm93LCB0dXBsZS0+Y29sKSk7CisJCWxvbmcgbG9uZyBjaGVjayA9IHR1cGxlLT5jaGVjazsKKwkJaWYgKHZhbCAhPSBjaGVjaykKKwkJICB7CisJCSAgICBmcHJpbnRmIChzdGRlcnIsICIlczolZDoiLCAoKnRlc3RzKS0+ZmlsZSwgdHVwbGUtPmxpbmUpOworCQkgICAgZnByaW50ZiAoc3RkZXJyLCAiICVzIiwgKCp0ZXN0cyktPm1hY3JvKTsKKwkJICAgIGlmICh0dXBsZS0+cm93ID49IDApCisJCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAoJWQsICVkKSIsIHR1cGxlLT5yb3csIHR1cGxlLT5jb2wpOworCQkgICAgZWxzZQorCQkgICAgICBmcHJpbnRmIChzdGRlcnIsICIgKCVkKSIsIHR1cGxlLT5jb2wpOworCQkgICAgZnByaW50ZiAoc3RkZXJyLCAiID09IDB4JTA4bHglMDhseCB3cm9uZywgIT0gMHglMDhseCUwOGx4XG4iLAorCQkJICAgICAobG9uZykgKHZhbCA+PiAzMiksIChsb25nKSB2YWwsCisJCQkgICAgIChsb25nKSAoY2hlY2sgPj4gMzIpLCAobG9uZykgY2hlY2spOworCQkgICAgZXJyb3JzICsrOworCQkgIH0KKwkgICAgICB9CisJICB9CisgICAgICB0ZXN0cyArKzsKKyAgICB9CisgIHJldHVybiBlcnJvcnM7Cit9ICAgICAKKworCitpbnQKK21haW4gKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICoqYXJndjsKK3sKKyAgaW50IGVycm9ycyA9IDA7CisKKworI2lmIGRlZmluZWQgKERPX0JJVF9URVNUUykKKyAgcHJpbnRmICgiQ2hlY2tpbmcgQklUKlxuIik7CisgIGVycm9ycyArPSBjaGVja19iaXRzICgwLCBiaXRfdGVzdHMpOworI2VuZGlmCisKKworI2lmIGRlZmluZWQgKERPX01BU0tfVEVTVFMpCisgIHByaW50ZiAoIkNoZWNraW5nIE1BU0sqXG4iKTsKKyAgZXJyb3JzICs9IGNoZWNrX2JpdHMgKDAsIG1hc2tfdGVzdHMpOworCisgIHByaW50ZiAoIkNoZWNraW5nIE1BU0tFRCpcbiIpOworICBlcnJvcnMgKz0gY2hlY2tfYml0cyAoMSwgbWFza190ZXN0cyk7CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCAoRE9fTFNNQVNLX1RFU1RTKQorICBwcmludGYgKCJDaGVja2luZyBMU01BU0sqXG4iKTsKKyAgZXJyb3JzICs9IGNoZWNrX2JpdHMgKDAsIGxzbWFza190ZXN0cyk7CisKKyAgcHJpbnRmICgiQ2hlY2tpbmcgTFNNQVNLRUQqXG4iKTsKKyAgZXJyb3JzICs9IGNoZWNrX2JpdHMgKDEsIGxzbWFza190ZXN0cyk7CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCAoRE9fTVNNQVNLX1RFU1RTKQorICBwcmludGYgKCJDaGVja2luZyBNU01BU0sqXG4iKTsKKyAgZXJyb3JzICs9IGNoZWNrX2JpdHMgKDAsIG1zbWFza190ZXN0cyk7CisKKyAgcHJpbnRmICgiQ2hlY2tpbmcgTVNNQVNLRUQqXG4iKTsKKyAgZXJyb3JzICs9IGNoZWNrX2JpdHMgKDEsIG1zbWFza190ZXN0cyk7CisjZW5kaWYKKworCisgIHByaW50ZiAoIkNoZWNraW5nIEVYVFJBQ1RFRCpcbiIpOworICBlcnJvcnMgKz0gY2hlY2tfZXh0cmFjdCAoIDgsICJFWFRSQUNUOCIsICAiSU5TRVJUOCIsICAiTUFTSzgiKTsKKyAgZXJyb3JzICs9IGNoZWNrX2V4dHJhY3QgKDE2LCAiRVhUUkFDVDE2IiwgIklOU0VSVDE2IiwgIk1BU0sxNiIpOworICBlcnJvcnMgKz0gY2hlY2tfZXh0cmFjdCAoMzIsICJFWFRSQUNUMzIiLCAiSU5TRVJUMzIiLCAiTUFTSzMyIik7CisgIGVycm9ycyArPSBjaGVja19leHRyYWN0ICg2NCwgIkVYVFJBQ1Q2NCIsICJJTlNFUlQ2NCIsICJNQVNLNjQiKTsKKyAgZXJyb3JzICs9IGNoZWNrX2V4dHJhY3QgKDY0LCAiRVhUUkFDVCIsICAgIklOU0VSVCIsICAgIk1BU0siKTsKKworICBwcmludGYgKCJDaGVja2luZyBTRVhUKlxuIik7CisgIGVycm9ycyArPSBjaGVja19zZXh0ICggOCwgV0lUSF9UQVJHRVRfV09SRF9NU0IsICJTRVhUOCIsICAiTUFTSzgiLCAgIk1TTUFTSzgiKTsKKyAgZXJyb3JzICs9IGNoZWNrX3NleHQgKDE2LCBXSVRIX1RBUkdFVF9XT1JEX01TQiwgIlNFWFQxNiIsICJNQVNLMTYiLCAiTVNNQVNLMTYiKTsKKyAgZXJyb3JzICs9IGNoZWNrX3NleHQgKDMyLCBXSVRIX1RBUkdFVF9XT1JEX01TQiwgIlNFWFQzMiIsICJNQVNLMzIiLCAiTVNNQVNLMzIiKTsKKyAgZXJyb3JzICs9IGNoZWNrX3NleHQgKDY0LCBXSVRIX1RBUkdFVF9XT1JEX01TQiwgIlNFWFQ2NCIsICJNQVNLNjQiLCAiTVNNQVNLNjQiKTsKKyAgZXJyb3JzICs9IGNoZWNrX3NleHQgKDY0LCBXSVRIX1RBUkdFVF9XT1JEX01TQiwgIlNFWFQiLCAgICJNQVNLIiwgICAiTVNNQVNLIik7CisgIAorICBwcmludGYgKCJDaGVja2luZyBMU1NFWFQqXG4iKTsKKyAgZXJyb3JzICs9IGNoZWNrX3NleHQgKCA4LCAgOCAtIDEsICJMU1NFWFQ4IiwgICJMU01BU0s4IiwgICJNU01BU0s4Iik7CisgIGVycm9ycyArPSBjaGVja19zZXh0ICgxNiwgMTYgLSAxLCAiTFNTRVhUMTYiLCAiTFNNQVNLMTYiLCAiTVNNQVNLMTYiKTsKKyAgZXJyb3JzICs9IGNoZWNrX3NleHQgKDMyLCAzMiAtIDEsICJMU1NFWFQzMiIsICJMU01BU0szMiIsICJNU01BU0szMiIpOworICBlcnJvcnMgKz0gY2hlY2tfc2V4dCAoNjQsIDY0IC0gMSwgIkxTU0VYVDY0IiwgIkxTTUFTSzY0IiwgIk1TTUFTSzY0Iik7CisgIGVycm9ycyArPSBjaGVja19zZXh0ICg2NCwgV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFIC0gMSwgIkxTU0VYVCIsICAgIkxTTUFTSyIsICAgIk1TTUFTSyIpOworICAKKyAgcHJpbnRmICgiQ2hlY2tpbmcgTVNTRVhUKlxuIik7CisgIGVycm9ycyArPSBjaGVja19zZXh0ICg4LCAgIDAsICJNU1NFWFQ4IiwgICJNU01BU0s4IiwgICJNU01BU0s4Iik7CisgIGVycm9ycyArPSBjaGVja19zZXh0ICgxNiwgIDAsICJNU1NFWFQxNiIsICJNU01BU0sxNiIsICJNU01BU0sxNiIpOworICBlcnJvcnMgKz0gY2hlY2tfc2V4dCAoMzIsICAwLCAiTVNTRVhUMzIiLCAiTVNNQVNLMzIiLCAiTVNNQVNLMzIiKTsKKyAgZXJyb3JzICs9IGNoZWNrX3NleHQgKDY0LCAgMCwgIk1TU0VYVDY0IiwgIk1TTUFTSzY0IiwgIk1TTUFTSzY0Iik7CisgIGVycm9ycyArPSBjaGVja19zZXh0ICg2NCwgIDAsICJNU1NFWFQiLCAgICJNU01BU0siLCAgICJNU01BU0siKTsKKyAgCisgIHByaW50ZiAoIkNoZWNraW5nIFJPVCpcbiIpOworICBlcnJvcnMgKz0gY2hlY2tfcm90ICgxNiwgIlJPVDE2IiwgIk1BU0sxNiIpOworICBlcnJvcnMgKz0gY2hlY2tfcm90ICgzMiwgIlJPVDMyIiwgIk1BU0szMiIpOworICBlcnJvcnMgKz0gY2hlY2tfcm90ICg2NCwgIlJPVDY0IiwgIk1BU0s2NCIpOworCisgIHJldHVybiBlcnJvcnMgIT0gMDsKK30KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvY29tbW9uL2ZwdS10c3QuYyBiL3NpbS90ZXN0c3VpdGUvY29tbW9uL2ZwdS10c3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzQ3ZTEyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9jb21tb24vZnB1LXRzdC5jCkBAIC0wLDAgKzEsNTM4IEBACisjZGVmaW5lIEFTU0VSVChFWFBSRVNTSU9OKSBcCitkbyB7IFwKKyAgaWYgKCEoRVhQUkVTU0lPTikpIHsgXAorICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkOiBhc3NlcnRpb24gZmFpbGVkIC0gJXNcbiIsIFwKKyAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sICNFWFBSRVNTSU9OKTsgXAorICAgIGFib3J0ICgpOyBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTSU1fQklUU19JTkxJTkUgKElOQ0xVREVfTU9EVUxFIHwgSU5DTFVERURfQllfTU9EVUxFKQorCisjaW5jbHVkZSAibWlsaWV1LmgiCisjaW5jbHVkZSAic29mdGZsb2F0LmgiCisjaW5jbHVkZSAic3lzdGZsb2F0LmgiCisjaW5jbHVkZSAic3lzdG1vZGVzLmgiCisKKy8qICNkZWZpbmUgU0lNX0ZQVV9JTkxJTkUgKElOQ0xVREVfTU9EVUxFIHwgSU5DTFVERURfQllfTU9EVUxFKSAqLworCisKKyNpbmNsdWRlICJzaW0tYml0cy5oIgorI2luY2x1ZGUgInNpbS1mcHUuaCIKKyNpbmNsdWRlICJzaW0tZnB1LmMiCisKKworCitzdGF0aWMgaW50IGZsYWdzOworCitpbnQ4CitzeXN0X2Zsb2F0X2ZsYWdzX2NsZWFyICgpCit7CisgIGludCBvbGRfZmxhZ3MgPSAwOworICBpbnQgaSA9IDE7CisgIHdoaWxlIChmbGFncyA+PSBpKQorICAgIHsKKyAgICAgIHN3aXRjaCAoKHNpbV9mcHVfc3RhdHVzKSAoZmxhZ3MgJiBpKSkKKwl7CisJY2FzZSBzaW1fZnB1X3N0YXR1c19kZW5vcm06CisJICBicmVhazsKKwljYXNlIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc25hbjoKKwljYXNlIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfcW5hbjoKKwljYXNlIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfaXNpOgorCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9pZGk6CisJY2FzZSBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX3pkejoKKwljYXNlIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfaW16OgorCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9jdmk6CisJY2FzZSBzaW1fZnB1X3N0YXR1c19pbnZhbGlkX2NtcDoKKwljYXNlIHNpbV9mcHVfc3RhdHVzX2ludmFsaWRfc3FydDoKKwkgIG9sZF9mbGFncyB8PSBmbG9hdF9mbGFnX2ludmFsaWQ7IC8qIHYgKi8KKwkgIGJyZWFrOworCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfaW5leGFjdDoKKwkgIG9sZF9mbGFncyB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7IC8qIHggKi8KKwkgIGJyZWFrOworCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfb3ZlcmZsb3c6CisJICBvbGRfZmxhZ3MgfD0gZmxvYXRfZmxhZ19vdmVyZmxvdzsgLyogbyAqLworCSAgYnJlYWs7CisJY2FzZSBzaW1fZnB1X3N0YXR1c191bmRlcmZsb3c6CisJICBvbGRfZmxhZ3MgfD0gZmxvYXRfZmxhZ191bmRlcmZsb3c7IC8qIHUgKi8KKwkgIGJyZWFrOworCWNhc2Ugc2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9kaXYwOgorCSAgb2xkX2ZsYWdzIHw9IGZsb2F0X2ZsYWdfZGl2Ynl6ZXJvOyAvKiB6ICovCisJICBicmVhazsKKwljYXNlIHNpbV9mcHVfc3RhdHVzX3JvdW5kZWQ6CisJICBicmVhazsKKwl9CisgICAgICBpIDw8PSAxOworICAgIH0KKyAgZmxhZ3MgPSAwOworICByZXR1cm4gb2xkX2ZsYWdzOworfQorCisKK3NpbV9mcHVfcm91bmQgcm91bmRpbmdfbW9kZTsKKwordm9pZAorc3lzdF9mbG9hdF9zZXRfcm91bmRpbmdfbW9kZShpbnQ4IG1vZGUpCit7CisgIHN3aXRjaCAobW9kZSkKKyAgICB7CisgICAgY2FzZSBmbG9hdF9yb3VuZF9uZWFyZXN0X2V2ZW46CisgICAgICByb3VuZGluZ19tb2RlID0gc2ltX2ZwdV9yb3VuZF9uZWFyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBmbG9hdF9yb3VuZF9kb3duOgorICAgICAgcm91bmRpbmdfbW9kZSA9IHNpbV9mcHVfcm91bmRfZG93bjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgZmxvYXRfcm91bmRfdXA6CisgICAgICByb3VuZGluZ19tb2RlID0gc2ltX2ZwdV9yb3VuZF91cDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgZmxvYXRfcm91bmRfdG9femVybzoKKyAgICAgIHJvdW5kaW5nX21vZGUgPSBzaW1fZnB1X3JvdW5kX3plcm87CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKworZmxvYXQzMgorc3lzdF9pbnQzMl90b19mbG9hdDMyKGludDMyIGEpCit7CisgIGZsb2F0MzIgejsKKyAgc2ltX2ZwdSBzOworICBmbGFncyB8PSBzaW1fZnB1X2kzMnRvICgmcywgYSwgcm91bmRpbmdfbW9kZSk7CisgIGZsYWdzIHw9IHNpbV9mcHVfcm91bmRfMzIgKCZzLCByb3VuZGluZ19tb2RlLCAwKTsKKyAgc2ltX2ZwdV90bzMyICgmeiwgJnMpOworICByZXR1cm4gejsKK30KKworZmxvYXQ2NAorc3lzdF9pbnQzMl90b19mbG9hdDY0KCBpbnQzMiBhICkKK3sKKyAgZmxvYXQ2NCB6OworICBzaW1fZnB1IHM7CisgIGZsYWdzIHw9IHNpbV9mcHVfaTMydG8gKCZzLCBhLCByb3VuZGluZ19tb2RlKTsKKyAgc2ltX2ZwdV90bzY0ICgmeiwgJnMpOworICByZXR1cm4gejsKK30KKworaW50MzIKK3N5c3RfZmxvYXQzMl90b19pbnQzMl9yb3VuZF90b196ZXJvKCBmbG9hdDMyIGEgKQoreworICBpbnQzMiB6OworICBzaW1fZnB1IHM7CisgIHNpbV9mcHVfMzJ0byAoJnMsIGEpOworICBmbGFncyB8PSBzaW1fZnB1X3RvMzJpICgmeiwgJnMsIHNpbV9mcHVfcm91bmRfemVybyk7CisgIHJldHVybiB6OworfQorCitmbG9hdDY0CitzeXN0X2Zsb2F0MzJfdG9fZmxvYXQ2NCAoZmxvYXQzMiBhKQoreworICBmbG9hdDY0IHo7CisgIHNpbV9mcHUgczsKKyAgc2ltX2ZwdV8zMnRvICgmcywgYSk7CisgIGZsYWdzIHw9IHNpbV9mcHVfcm91bmRfNjQgKCZzLCByb3VuZGluZ19tb2RlLCAwKTsKKyAgc2ltX2ZwdV90bzY0ICgmeiwgJnMpOworICByZXR1cm4gejsKK30KKworZmxvYXQzMiBzeXN0X2Zsb2F0MzJfYWRkKCBmbG9hdDMyIGEsIGZsb2F0MzIgYiApCit7CisgIGZsb2F0MzIgejsKKyAgc2ltX2ZwdSBBOworICBzaW1fZnB1IEI7CisgIHNpbV9mcHUgYW5zOworICBzaW1fZnB1XzMydG8gKCZBLCBhKTsKKyAgc2ltX2ZwdV8zMnRvICgmQiwgYik7CisjaWYgMAorICBmcHJpbnRmIChzdGRvdXQsICJcbiAgIik7CisgIHNpbV9mcHVfcHJpbnRfZnB1ICgmQSwgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7CisgIGZwcmludGYgKHN0ZG91dCwgIlxuKyAiKTsKKyAgc2ltX2ZwdV9wcmludF9mcHUgKCZCLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKKyAgZnByaW50ZiAoc3Rkb3V0LCAiXG49ICIpOworI2VuZGlmCisgIGZsYWdzIHw9IHNpbV9mcHVfYWRkICgmYW5zLCAmQSwgJkIpOworICBmbGFncyB8PSBzaW1fZnB1X3JvdW5kXzMyICgmYW5zLCByb3VuZGluZ19tb2RlLCAwKTsKKyNpZiAwCisgIHNpbV9mcHVfcHJpbnRfZnB1ICgmYW5zLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKKyAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKKyNlbmRpZgorICBzaW1fZnB1X3RvMzIgKCZ6LCAmYW5zKTsKKyAgcmV0dXJuIHo7Cit9CisKK2Zsb2F0MzIgc3lzdF9mbG9hdDMyX3N1YiggZmxvYXQzMiBhLCBmbG9hdDMyIGIgKQoreworICBmbG9hdDMyIHo7CisgIHNpbV9mcHUgQTsKKyAgc2ltX2ZwdSBCOworICBzaW1fZnB1IGFuczsKKyAgc2ltX2ZwdV8zMnRvICgmQSwgYSk7CisgIHNpbV9mcHVfMzJ0byAoJkIsIGIpOworI2lmIDAKKyAgc2ltX2ZwdV9wcmludF9mcHUgKCZBLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKKyAgZnByaW50ZiAoc3Rkb3V0LCAiICsgIik7CisgIHNpbV9mcHVfcHJpbnRfZnB1ICgmQiwgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7CisgIGZwcmludGYgKHN0ZG91dCwgIiA9ICIpOworI2VuZGlmCisgIGZsYWdzIHw9IHNpbV9mcHVfc3ViICgmYW5zLCAmQSwgJkIpOworICBmbGFncyB8PSBzaW1fZnB1X3JvdW5kXzMyICgmYW5zLCByb3VuZGluZ19tb2RlLCAwKTsKKyNpZiAwCisgIHNpbV9mcHVfcHJpbnRfZnB1ICgmYW5zLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKKyAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKKyNlbmRpZgorICBzaW1fZnB1X3RvMzIgKCZ6LCAmYW5zKTsKKyAgcmV0dXJuIHo7Cit9CisKK2Zsb2F0MzIgc3lzdF9mbG9hdDMyX211bCggZmxvYXQzMiBhLCBmbG9hdDMyIGIgKQoreworICBmbG9hdDMyIHo7CisgIHNpbV9mcHUgQTsKKyAgc2ltX2ZwdSBCOworICBzaW1fZnB1IGFuczsKKyAgc2ltX2ZwdV8zMnRvICgmQSwgYSk7CisgIHNpbV9mcHVfMzJ0byAoJkIsIGIpOworI2lmIDAKKyAgc2ltX2ZwdV9wcmludF9mcHUgKCZBLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKKyAgZnByaW50ZiAoc3Rkb3V0LCAiICsgIik7CisgIHNpbV9mcHVfcHJpbnRfZnB1ICgmQiwgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7CisgIGZwcmludGYgKHN0ZG91dCwgIiA9ICIpOworI2VuZGlmCisgIGZsYWdzIHw9IHNpbV9mcHVfbXVsICgmYW5zLCAmQSwgJkIpOworI2lmIDAKKyAgc2ltX2ZwdV9wcmludF9mcHUgKCZhbnMsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOworI2VuZGlmCisgIGZsYWdzIHw9IHNpbV9mcHVfcm91bmRfMzIgKCZhbnMsIHJvdW5kaW5nX21vZGUsIDApOworI2lmIDAKKyAgc2ltX2ZwdV9wcmludF9zdGF0dXMgKGZsYWdzLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKKyAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKKyNlbmRpZgorICBzaW1fZnB1X3RvMzIgKCZ6LCAmYW5zKTsKKyAgcmV0dXJuIHo7Cit9CisKK2Zsb2F0MzIgc3lzdF9mbG9hdDMyX2RpdiggZmxvYXQzMiBhLCBmbG9hdDMyIGIgKQoreworICBmbG9hdDMyIHo7CisgIHNpbV9mcHUgQTsKKyAgc2ltX2ZwdSBCOworICBzaW1fZnB1IGFuczsKKyAgc2ltX2ZwdV8zMnRvICgmQSwgYSk7CisgIHNpbV9mcHVfMzJ0byAoJkIsIGIpOworICBmbGFncyB8PSBzaW1fZnB1X2RpdiAoJmFucywgJkEsICZCKTsKKyAgZmxhZ3MgfD0gc2ltX2ZwdV9yb3VuZF8zMiAoJmFucywgcm91bmRpbmdfbW9kZSwgMCk7CisgIHNpbV9mcHVfdG8zMiAoJnosICZhbnMpOworICByZXR1cm4gejsKK30KKworZmxvYXQzMiBzeXN0X2Zsb2F0MzJfc3FydCggZmxvYXQzMiBhICkKK3sKKyAgZmxvYXQzMiB6OworICBzaW1fZnB1IEE7CisgIHNpbV9mcHUgYW5zOworICBzaW1fZnB1XzMydG8gKCZBLCBhKTsKKyNpZiAwCisgIHNpbV9mcHVfcHJpbnRfZnB1ICgmQSwgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7CisgIGZwcmludGYgKHN0ZG91dCwgIiBzcXJ0PiAiKTsKKyNlbmRpZgorICBmbGFncyB8PSBzaW1fZnB1X3NxcnQgKCZhbnMsICZBKTsKKyNpZiAwCisgIHNpbV9mcHVfcHJpbnRfZnB1ICgmYW5zLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKKyNlbmRpZgorICBmbGFncyB8PSBzaW1fZnB1X3JvdW5kXzMyICgmYW5zLCByb3VuZGluZ19tb2RlLCAwKTsKKyNpZiAwCisgIGZwcmludGYgKHN0ZG91dCwgIiAoJXgpXG4iLCBmbGFncyk7CisjZW5kaWYKKyAgc2ltX2ZwdV90bzMyICgmeiwgJmFucyk7CisgIHJldHVybiB6OworfQorCitmbGFnIHN5c3RfZmxvYXQzMl9lcSggZmxvYXQzMiBhLCBmbG9hdDMyIGIgKQoreworICBzaW1fZnB1IEE7CisgIHNpbV9mcHUgQjsKKyAgaW50IGlzOworICBzaW1fZnB1XzMydG8gKCZBLCBhKTsKKyAgc2ltX2ZwdV8zMnRvICgmQiwgYik7CisgIGZsYWdzIHw9IChzaW1fZnB1X2VxICgmaXMsICZBLCAmQikgJiB+c2ltX2ZwdV9zdGF0dXNfaW52YWxpZF9xbmFuKTsKKyAgcmV0dXJuIGlzOworfQorCitmbGFnIHN5c3RfZmxvYXQzMl9lcV9zaWduYWxpbmcoIGZsb2F0MzIgYSwgZmxvYXQzMiBiICkKK3sKKyAgc2ltX2ZwdSBBOworICBzaW1fZnB1IEI7CisgIGludCBpczsKKyAgc2ltX2ZwdV8zMnRvICgmQSwgYSk7CisgIHNpbV9mcHVfMzJ0byAoJkIsIGIpOworICBmbGFncyB8PSBzaW1fZnB1X2VxICgmaXMsICZBLCAmQik7CisgIHJldHVybiBpczsKK30KKworZmxhZyBzeXN0X2Zsb2F0MzJfbGUoIGZsb2F0MzIgYSwgZmxvYXQzMiBiICkKK3sKKyAgc2ltX2ZwdSBBOworICBzaW1fZnB1IEI7CisgIGludCBpczsKKyAgc2ltX2ZwdV8zMnRvICgmQSwgYSk7CisgIHNpbV9mcHVfMzJ0byAoJkIsIGIpOworICBmbGFncyB8PSBzaW1fZnB1X2xlICgmaXMsICZBLCAmQik7CisgIHJldHVybiBpczsKK30KKworZmxhZyBzeXN0X2Zsb2F0MzJfbGVfcXVpZXQoIGZsb2F0MzIgYSwgZmxvYXQzMiBiICkKK3sKKyAgc2ltX2ZwdSBBOworICBzaW1fZnB1IEI7CisgIGludCBpczsKKyAgc2ltX2ZwdV8zMnRvICgmQSwgYSk7CisgIHNpbV9mcHVfMzJ0byAoJkIsIGIpOworICBmbGFncyB8PSAoc2ltX2ZwdV9sZSAoJmlzLCAmQSwgJkIpICYgfnNpbV9mcHVfc3RhdHVzX2ludmFsaWRfcW5hbik7CisgIHJldHVybiBpczsKK30KKworZmxhZyBzeXN0X2Zsb2F0MzJfbHQoIGZsb2F0MzIgYSwgZmxvYXQzMiBiICkKK3sKKyAgc2ltX2ZwdSBBOworICBzaW1fZnB1IEI7CisgIGludCBpczsKKyAgc2ltX2ZwdV8zMnRvICgmQSwgYSk7CisgIHNpbV9mcHVfMzJ0byAoJkIsIGIpOworICBmbGFncyB8PSBzaW1fZnB1X2x0ICgmaXMsICZBLCAmQik7CisgIHJldHVybiBpczsKK30KKworZmxhZyBzeXN0X2Zsb2F0MzJfbHRfcXVpZXQoIGZsb2F0MzIgYSwgZmxvYXQzMiBiICkKK3sKKyAgc2ltX2ZwdSBBOworICBzaW1fZnB1IEI7CisgIGludCBpczsKKyAgc2ltX2ZwdV8zMnRvICgmQSwgYSk7CisgIHNpbV9mcHVfMzJ0byAoJkIsIGIpOworICBmbGFncyB8PSAoc2ltX2ZwdV9sdCAoJmlzLCAmQSwgJkIpICYgfnNpbV9mcHVfc3RhdHVzX2ludmFsaWRfcW5hbik7CisgIHJldHVybiBpczsKK30KKworaW50MzIgc3lzdF9mbG9hdDY0X3RvX2ludDMyX3JvdW5kX3RvX3plcm8oIGZsb2F0NjQgYSApCit7CisgIGludDMyIHo7CisgIHNpbV9mcHUgczsKKyAgc2ltX2ZwdV82NHRvICgmcywgYSk7CisgIGZsYWdzIHw9IHNpbV9mcHVfdG8zMmkgKCZ6LCAmcywgc2ltX2ZwdV9yb3VuZF96ZXJvKTsKKyAgcmV0dXJuIHo7Cit9CisKK2Zsb2F0MzIgc3lzdF9mbG9hdDY0X3RvX2Zsb2F0MzIoIGZsb2F0NjQgYSApCit7CisgIGZsb2F0MzIgejsKKyAgc2ltX2ZwdSBzOworICBzaW1fZnB1XzY0dG8gKCZzLCBhKTsKKyNpZiAwCisgIHNpbV9mcHVfcHJpbnRfZnB1ICgmcywgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7CisgIGZwcmludGYgKHN0ZG91dCwgIiAtPiAiKTsKKyNlbmRpZgorICBmbGFncyB8PSBzaW1fZnB1X3JvdW5kXzMyICgmcywgcm91bmRpbmdfbW9kZSwgMCk7CisjaWYgMAorICBzaW1fZnB1X3ByaW50X2ZwdSAoJnMsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOworICBzaW1fZnB1X3ByaW50X3N0YXR1cyAoZmxhZ3MsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOworICBwcmludGYgKCJcbiIpOworI2VuZGlmCisgIHNpbV9mcHVfdG8zMiAoJnosICZzKTsKKyAgcmV0dXJuIHo7Cit9CisKK2Zsb2F0NjQgc3lzdF9mbG9hdDY0X2FkZCggZmxvYXQ2NCBhLCBmbG9hdDY0IGIgKQoreworICBmbG9hdDY0IHo7CisgIHNpbV9mcHUgQTsKKyAgc2ltX2ZwdSBCOworICBzaW1fZnB1IGFuczsKKyAgc2ltX2ZwdV82NHRvICgmQSwgYSk7CisgIHNpbV9mcHVfNjR0byAoJkIsIGIpOworI2lmIDAKKyAgc2ltX2ZwdV9wcmludF9mcHUgKCZBLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKKyAgZnByaW50ZiAoc3Rkb3V0LCAiICsgIik7CisgIHNpbV9mcHVfcHJpbnRfZnB1ICgmQiwgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7CisgIGZwcmludGYgKHN0ZG91dCwgIiA9ICIpOworI2VuZGlmCisgIGZsYWdzIHw9IHNpbV9mcHVfYWRkICgmYW5zLCAmQSwgJkIpOworI2lmIDAKKyAgc2ltX2ZwdV9wcmludF9mcHUgKCZhbnMsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOworI2VuZGlmCisgIGZsYWdzIHw9IHNpbV9mcHVfcm91bmRfNjQgKCZhbnMsIHJvdW5kaW5nX21vZGUsIDApOworI2lmIDAKKyAgZnByaW50ZiAoc3Rkb3V0LCAiICgleClcbiIsIGZsYWdzKTsKKyNlbmRpZgorICBzaW1fZnB1X3RvNjQgKCZ6LCAmYW5zKTsKKyAgcmV0dXJuIHo7Cit9CisKK2Zsb2F0NjQgc3lzdF9mbG9hdDY0X3N1YiggZmxvYXQ2NCBhLCBmbG9hdDY0IGIgKQoreworICBmbG9hdDY0IHo7CisgIHNpbV9mcHUgQTsKKyAgc2ltX2ZwdSBCOworICBzaW1fZnB1IGFuczsKKyAgc2ltX2ZwdV82NHRvICgmQSwgYSk7CisgIHNpbV9mcHVfNjR0byAoJkIsIGIpOworI2lmIDAKKyAgc2ltX2ZwdV9wcmludF9mcHUgKCZBLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKKyAgZnByaW50ZiAoc3Rkb3V0LCAiICsgIik7CisgIHNpbV9mcHVfcHJpbnRfZnB1ICgmQiwgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7CisgIGZwcmludGYgKHN0ZG91dCwgIiA9ICIpOworI2VuZGlmCisgIGZsYWdzIHw9IHNpbV9mcHVfc3ViICgmYW5zLCAmQSwgJkIpOworI2lmIDAKKyAgc2ltX2ZwdV9wcmludF9mcHUgKCZhbnMsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOworI2VuZGlmCisgIGZsYWdzIHw9IHNpbV9mcHVfcm91bmRfNjQgKCZhbnMsIHJvdW5kaW5nX21vZGUsIDApOworI2lmIDAKKyAgZnByaW50ZiAoc3Rkb3V0LCAiICgleClcbiIsIGZsYWdzKTsKKyNlbmRpZgorICBzaW1fZnB1X3RvNjQgKCZ6LCAmYW5zKTsKKyAgcmV0dXJuIHo7Cit9CisKK2Zsb2F0NjQgc3lzdF9mbG9hdDY0X211bCggZmxvYXQ2NCBhLCBmbG9hdDY0IGIgKQoreworICBmbG9hdDY0IHo7CisgIHNpbV9mcHUgQTsKKyAgc2ltX2ZwdSBCOworICBzaW1fZnB1IGFuczsKKyAgc2ltX2ZwdV82NHRvICgmQSwgYSk7CisgIHNpbV9mcHVfNjR0byAoJkIsIGIpOworI2lmIDAKKyAgc2ltX2ZwdV9wcmludF9mcHUgKCZBLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKKyAgZnByaW50ZiAoc3Rkb3V0LCAiICogIik7CisgIHNpbV9mcHVfcHJpbnRfZnB1ICgmQiwgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7CisgIGZwcmludGYgKHN0ZG91dCwgIiA9ICIpOworI2VuZGlmCisgIGZsYWdzIHw9IHNpbV9mcHVfbXVsICgmYW5zLCAmQSwgJkIpOworI2lmIDAKKyAgc2ltX2ZwdV9wcmludF9mcHUgKCZhbnMsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOworI2VuZGlmCisgIGZsYWdzIHw9IHNpbV9mcHVfcm91bmRfNjQgKCZhbnMsIHJvdW5kaW5nX21vZGUsIDApOworI2lmIDAKKyAgc2ltX2ZwdV9wcmludF9zdGF0dXMgKGZsYWdzLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKKyAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKKyNlbmRpZgorICBzaW1fZnB1X3RvNjQgKCZ6LCAmYW5zKTsKKyAgcmV0dXJuIHo7Cit9CisKK2Zsb2F0NjQgc3lzdF9mbG9hdDY0X2RpdiggZmxvYXQ2NCBhLCBmbG9hdDY0IGIgKQoreworICBmbG9hdDY0IHo7CisgIHNpbV9mcHUgQTsKKyAgc2ltX2ZwdSBCOworICBzaW1fZnB1IGFuczsKKyAgc2ltX2ZwdV82NHRvICgmQSwgYSk7CisgIHNpbV9mcHVfNjR0byAoJkIsIGIpOworI2lmIDAKKyAgc2ltX2ZwdV9wcmludF9mcHUgKCZBLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKKyAgZnByaW50ZiAoc3Rkb3V0LCAiICsgIik7CisgIHNpbV9mcHVfcHJpbnRfZnB1ICgmQiwgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7CisgIGZwcmludGYgKHN0ZG91dCwgIiA9ICIpOworI2VuZGlmCisgIGZsYWdzIHw9IHNpbV9mcHVfZGl2ICgmYW5zLCAmQSwgJkIpOworI2lmIDAKKyAgc2ltX2ZwdV9wcmludF9mcHUgKCZhbnMsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOworI2VuZGlmCisgIGZsYWdzIHw9IHNpbV9mcHVfcm91bmRfNjQgKCZhbnMsIHJvdW5kaW5nX21vZGUsIDApOworI2lmIDAKKyAgc2ltX2ZwdV9wcmludF9zdGF0dXMgKGZsYWdzLCAoc2ltX2ZwdV9wcmludF9mdW5jKikgZnByaW50Ziwgc3Rkb3V0KTsKKyAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKKyNlbmRpZgorICBzaW1fZnB1X3RvNjQgKCZ6LCAmYW5zKTsKKyAgcmV0dXJuIHo7Cit9CisKK2Zsb2F0NjQgc3lzdF9mbG9hdDY0X3NxcnQoIGZsb2F0NjQgYSApCit7CisgIGZsb2F0NjQgejsKKyAgc2ltX2ZwdSBBOworICBzaW1fZnB1IGFuczsKKyAgc2ltX2ZwdV82NHRvICgmQSwgYSk7CisjaWYgMAorICBzaW1fZnB1X3ByaW50X2ZwdSAoJkEsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOworICBwcmludGYgKCIgc3FydD4gIik7CisgIHByaW50ZiAoIlxuIik7CisjZW5kaWYKKyAgZmxhZ3MgfD0gc2ltX2ZwdV9zcXJ0ICgmYW5zLCAmQSk7CisjaWYgMAorICBzaW1fZnB1X3ByaW50X2ZwdSAoJmFucywgKHNpbV9mcHVfcHJpbnRfZnVuYyopIGZwcmludGYsIHN0ZG91dCk7CisjZW5kaWYKKyAgZmxhZ3MgfD0gc2ltX2ZwdV9yb3VuZF82NCAoJmFucywgcm91bmRpbmdfbW9kZSwgMCk7CisjaWYgMAorICBzaW1fZnB1X3ByaW50X3N0YXR1cyAoZmxhZ3MsIChzaW1fZnB1X3ByaW50X2Z1bmMqKSBmcHJpbnRmLCBzdGRvdXQpOworICBmcHJpbnRmIChzdGRvdXQsICJcbiIpOworI2VuZGlmCisgIHNpbV9mcHVfdG82NCAoJnosICZhbnMpOworICByZXR1cm4gejsKK30KKworZmxhZyBzeXN0X2Zsb2F0NjRfZXEoIGZsb2F0NjQgYSwgZmxvYXQ2NCBiICkKK3sKKyAgc2ltX2ZwdSBBOworICBzaW1fZnB1IEI7CisgIGludCBpczsKKyAgc2ltX2ZwdV82NHRvICgmQSwgYSk7CisgIHNpbV9mcHVfNjR0byAoJkIsIGIpOworICBmbGFncyB8PSAoc2ltX2ZwdV9lcSAoJmlzLCAmQSwgJkIpICYgfnNpbV9mcHVfc3RhdHVzX2ludmFsaWRfcW5hbik7CisgIHJldHVybiBpczsKK30KKworZmxhZyBzeXN0X2Zsb2F0NjRfZXFfc2lnbmFsaW5nKCBmbG9hdDY0IGEsIGZsb2F0NjQgYiApCit7CisgIHNpbV9mcHUgQTsKKyAgc2ltX2ZwdSBCOworICBpbnQgaXM7CisgIHNpbV9mcHVfNjR0byAoJkEsIGEpOworICBzaW1fZnB1XzY0dG8gKCZCLCBiKTsKKyAgZmxhZ3MgfD0gc2ltX2ZwdV9lcSAoJmlzLCAmQSwgJkIpOworICByZXR1cm4gaXM7Cit9CisKK2ZsYWcgc3lzdF9mbG9hdDY0X2xlKCBmbG9hdDY0IGEsIGZsb2F0NjQgYiApCit7CisgIHNpbV9mcHUgQTsKKyAgc2ltX2ZwdSBCOworICBpbnQgaXM7CisgIHNpbV9mcHVfNjR0byAoJkEsIGEpOworICBzaW1fZnB1XzY0dG8gKCZCLCBiKTsKKyAgZmxhZ3MgfD0gc2ltX2ZwdV9sZSAoJmlzLCAmQSwgJkIpOworICByZXR1cm4gaXM7Cit9CisKK2ZsYWcgc3lzdF9mbG9hdDY0X2xlX3F1aWV0KCBmbG9hdDY0IGEsIGZsb2F0NjQgYiApCit7CisgIHNpbV9mcHUgQTsKKyAgc2ltX2ZwdSBCOworICBpbnQgaXM7CisgIHNpbV9mcHVfNjR0byAoJkEsIGEpOworICBzaW1fZnB1XzY0dG8gKCZCLCBiKTsKKyAgZmxhZ3MgfD0gKHNpbV9mcHVfbGUgKCZpcywgJkEsICZCKSAmIH5zaW1fZnB1X3N0YXR1c19pbnZhbGlkX3FuYW4pOworICByZXR1cm4gaXM7Cit9CisKK2ZsYWcgc3lzdF9mbG9hdDY0X2x0KCBmbG9hdDY0IGEsIGZsb2F0NjQgYiApCit7CisgIHNpbV9mcHUgQTsKKyAgc2ltX2ZwdSBCOworICBpbnQgaXM7CisgIHNpbV9mcHVfNjR0byAoJkEsIGEpOworICBzaW1fZnB1XzY0dG8gKCZCLCBiKTsKKyAgZmxhZ3MgfD0gc2ltX2ZwdV9sdCAoJmlzLCAmQSwgJkIpOworICByZXR1cm4gaXM7Cit9CisKK2ZsYWcgc3lzdF9mbG9hdDY0X2x0X3F1aWV0KCBmbG9hdDY0IGEsIGZsb2F0NjQgYiApCit7CisgIHNpbV9mcHUgQTsKKyAgc2ltX2ZwdSBCOworICBpbnQgaXM7CisgIHNpbV9mcHVfNjR0byAoJkEsIGEpOworICBzaW1fZnB1XzY0dG8gKCZCLCBiKTsKKyAgZmxhZ3MgfD0gKHNpbV9mcHVfbHQgKCZpcywgJkEsICZCKSAmIH5zaW1fZnB1X3N0YXR1c19pbnZhbGlkX3FuYW4pOworICByZXR1cm4gaXM7Cit9CisKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwIGIvc2ltL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyNTVhMwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCkBAIC0wLDAgKzEsNDIgQEAKKyMgU2ltdWxhdG9yIGRlZmF1bHQgZGVqYWdudSBjb25maWd1cmF0aW9uIGZpbGUuCisKK2xvYWRfbGliIHNpbS1kZWZzLmV4cAorCitnbG9iYWwgQVMKK2lmICFbaW5mbyBleGlzdHMgQVNdIHsKKyAgICBzZXQgQVMgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi8uLi9nYXMvYXMtbmV3ICRiYXNlX2Rpci8uLi8uLi9nYXMvYXMtbmV3IFwKKwkJICAgICBbdHJhbnNmb3JtIGFzXV0KK30KKworZ2xvYmFsIEFTRkxBR1MKK2lmICFbaW5mbyBleGlzdHMgQVNGTEFHU10geworICAgIHNldCBBU0ZMQUdTICIiCit9CisKKyMgQ29tcGlsYXRpb24gaXMgYWNoaWV2ZWQgd2l0aCBzaW1fY29tcGlsZSAuLi4gc28gd2UgZG9uJ3QgY2hlY2sgJENDIGhlcmUuCisKK2dsb2JhbCBDRkxBR1MKK2lmICFbaW5mbyBleGlzdHMgQ0ZMQUdTXSB7CisgICAgc2V0IENGTEFHUyAiIgorfQorCitnbG9iYWwgTEQKK2lmICFbaW5mbyBleGlzdHMgTERdIHsKKyAgICBzZXQgTEQgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi8uLi9sZC9sZC1uZXcgJGJhc2VfZGlyLy4uLy4uL2xkL2xkLW5ldyBcCisJCSAgICAgW3RyYW5zZm9ybSBsZF1dCit9CisKK2dsb2JhbCBMREZMQUdTCitpZiAhW2luZm8gZXhpc3RzIExERkxBR1NdIHsKKyAgICBzZXQgTERGTEFHUyAiIgorfQorCisjIFRoZSBwYXRoIHRvIHRoZSBzaW11bGF0b3IgaXMgb2J0YWluZWQgd2l0aCBbYm9hcmRfaW5mbyBob3N0IHNpbV0sCisjIHNvIHdlIGRvbid0IGNoZWNrICRTSU0gaGVyZS4KKworZ2xvYmFsIFNJTUZMQUdTCitpZiAhW2luZm8gZXhpc3RzIFNJTUZMQUdTXSB7CisgICAgc2V0IFNJTUZMQUdTICIiCit9CisKK3NpbV9pbml0CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2NvbmZpZ3VyZSBiL3NpbS90ZXN0c3VpdGUvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdjM2VlZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDEwMjIgQEAKKyMhIC9iaW4vc2gKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2J1aWxkPU5PTkUKK2NhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2V4ZWNfcHJlZml4PU5PTkUKK2hvc3Q9Tk9ORQorbm9fY3JlYXRlPQorbm9ub3B0PU5PTkUKK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3RhcmdldD1OT05FCit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorc3ViZGlycz0KK01GTEFHUz0gTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT1jb21tb24vYml0cy10c3QuYworCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2FjX2V4ZWV4dD0KK2FjX29iamV4dD1vCitpZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KKyAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKyAgICBhY19uPSBhY19jPScKKycgYWNfdD0nCScKKyAgZWxzZQorICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKyAgZmkKK2Vsc2UKKyAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CitmaQorCisKKworQ0M9JHtDQy1jY30KKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworCisjIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KKyMgVGhlIGlucHV0cyBhcmU6CisjICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKKyMKKyMgVGhlIHJ1bGVzIGFyZToKKyMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCisjICAgIHNhbWUgdGltZS4KKyMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCisjIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKKyMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCisjIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCisjIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgorCisjIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCisjIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCitjYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KK05PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKKyopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KK2lmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKK2Vsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1NzU6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorCitob3N0X2FsaWFzPSRob3N0CitjYXNlICIkaG9zdF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKQorICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKKyAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaSA7OworICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKK2hvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTk2OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorCit0YXJnZXRfYWxpYXM9JHRhcmdldAorY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCit0YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCit0YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2MTQ6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKworYnVpbGRfYWxpYXM9JGJ1aWxkCitjYXNlICIkYnVpbGRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2J1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCitidWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2J1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAorYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKKwordGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgorICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCisgICAgTk9ORU5PTkVzLHgseCwgJiYKKyAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQorCisKKyMgRGlyZWN0b3JpZXMgdG8gdXNlIGluIGFsbCBjb25maWd1cmF0aW9ucy4KK2NvbmZpZ2RpcnM9IiIKKworIyBhZGQgdGVzdCBzdWItZGlyZWN0b3J5IGZvciBhcHByb3ByaWF0ZSB0YXJnZXRzCit0ZXN0ZGlyPWBlY2hvICR7dGFyZ2V0fSB8IHNlZCAtZSAncy8tLiotLy0vJ2AKK2lmIHRlc3QgLXIgJHtzcmNkaXJ9LyR7dGVzdGRpcn0vY29uZmlndXJlIDsgdGhlbgorICBjb25maWdkaXJzPSIke2NvbmZpZ2RpcnN9ICR0ZXN0ZGlyIgorZmkKKworIyBhZGQgYW55IGV4dHJhIHN1YmRpcmVjdG9yaWVzCitjYXNlICR0YXJnZXQgaW4KKyAgKikgOzsKK2VzYWMKKworIyBDb21wdXRlIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgorIyBGSVhNRTogV2lsbCBuZWVkIHRvIGNhbm9uaWNhbGl6ZSBzb21lIHZhbHVlcy4KKyMgRklYTUU6IFNob3VsZCBiZSBpbiBnZW5lcmFsbHkgYWNjZXNzYWJsZSBwbGFjZS4KK2Nhc2UgJHRhcmdldCBpbgorICAqKSBhcmNoPSR7dGFyZ2V0X2NwdX0gOzsKK2VzYWMKKworCisjIGNvbmZpZ3VyZSB0aGUgc3ViZGlyZWN0b3JpZXMgdG9vCitzdWJkaXJzPSIkY29uZmlnZGlycyIKKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgorIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCisjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorKHNldCkgMj4mMSB8CisgIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCisgICphY19zcGFjZT1cICopCisgICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKyAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgorICAgIHNlZCAtbiBcCisgICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgorICAgIDs7CisgICopCisgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKyAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCisgICAgOzsKKyAgZXNhYyA+PiBjb25mY2FjaGUKK2lmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKyAgOgorZWxzZQorICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCisgICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCisgIGVsc2UKKyAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKKyMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCisjIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKK2ZpCisKK3RyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIERFRlMuCisjIFByb3RlY3QgYWdhaW5zdCBzaGVsbCBleHBhbnNpb24gd2hpbGUgZXhlY3V0aW5nIE1ha2VmaWxlIHJ1bGVzLgorIyBQcm90ZWN0IGFnYWluc3QgTWFrZWZpbGUgbWFjcm8gZXhwYW5zaW9uLgorY2F0ID4gY29uZnRlc3QuZGVmcyA8PFxFT0YKK3MlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJS1EXDE9XDIlZworcyVbIAlgfiMkXiYqKCl7fVxcfDsnIjw+P10lXFwmJWcKK3MlXFslXFwmJWcKK3MlXF0lXFwmJWcKK3MlXCQlJCQlZworRU9GCitERUZTPWBzZWQgLWYgY29uZnRlc3QuZGVmcyBjb25mZGVmcy5oIHwgdHIgJ1wwMTInICcgJ2AKK3JtIC1mIGNvbmZ0ZXN0LmRlZnMKKworCisjIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKworZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUworcm0gLWYgJENPTkZJR19TVEFUVVMKK2NhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisjISAvYmluL3NoCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAorIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMKKyMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCisjCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKK2ZvciBhY19vcHRpb24KK2RvCisgIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCisgICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQorICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiIKKyAgICBleGl0IDAgOzsKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCisgICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7CisgIGVzYWMKK2RvbmUKKworYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KK3NlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Cisgcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKKyRhY192cHN1YgorJGV4dHJhc3ViCitzJUBTSEVMTEAlJFNIRUxMJWcKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBDQ0AlJENDJWcKK3MlQGhvc3RAJSRob3N0JWcKK3MlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKK3MlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCitzJUBob3N0X29zQCUkaG9zdF9vcyVnCitzJUB0YXJnZXRAJSR0YXJnZXQlZworcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKK3MlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKK3MlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKK3MlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCitzJUBidWlsZEAlJGJ1aWxkJWcKK3MlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZworcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKK3MlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCitzJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKK3MlQGFyY2hAJSRhcmNoJWcKK3MlQHN1YmRpcnNAJSRzdWJkaXJzJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCitpZiB0ZXN0ICIkbm9fcmVjdXJzaW9uIiAhPSB5ZXM7IHRoZW4KKworICAjIFJlbW92ZSAtLWNhY2hlLWZpbGUgYW5kIC0tc3JjZGlyIGFyZ3VtZW50cyBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorICBhY19zdWJfY29uZmlndXJlX2FyZ3M9CisgIGFjX3ByZXY9CisgIGZvciBhY19hcmcgaW4gJGFjX2NvbmZpZ3VyZV9hcmdzOyBkbworICAgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgICAgYWNfcHJldj0KKyAgICAgIGNvbnRpbnVlCisgICAgZmkKKyAgICBjYXNlICIkYWNfYXJnIiBpbgorICAgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICAgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgICA7OworICAgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgICBhY19wcmV2PXNyY2RpciA7OworICAgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgICA7OworICAgICopIGFjX3N1Yl9jb25maWd1cmVfYXJncz0iJGFjX3N1Yl9jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIGZvciBhY19jb25maWdfZGlyIGluICRjb25maWdkaXJzOyBkbworCisgICAgIyBEbyBub3QgY29tcGxhaW4sIHNvIGEgY29uZmlndXJlIHNjcmlwdCBjYW4gY29uZmlndXJlIHdoaWNoZXZlcgorICAgICMgcGFydHMgb2YgYSBsYXJnZSBzb3VyY2UgdHJlZSBhcmUgcHJlc2VudC4KKyAgICBpZiB0ZXN0ICEgLWQgJHNyY2Rpci8kYWNfY29uZmlnX2RpcjsgdGhlbgorICAgICAgY29udGludWUKKyAgICBmaQorCisgICAgZWNobyBjb25maWd1cmluZyBpbiAkYWNfY29uZmlnX2RpcgorCisgICAgY2FzZSAiJHNyY2RpciIgaW4KKyAgICAuKSA7OworICAgICopCisgICAgICBpZiB0ZXN0IC1kIC4vJGFjX2NvbmZpZ19kaXIgfHwgbWtkaXIgLi8kYWNfY29uZmlnX2RpcjsgdGhlbiA6OworICAgICAgZWxzZQorICAgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgY3JlYXRlIGBwd2RgLyRhY19jb25maWdfZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKworICAgIGFjX3BvcGRpcj1gcHdkYAorICAgIGNkICRhY19jb25maWdfZGlyCisKKyAgICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gLyRhY19jb25maWdfZGlyLgorICAgICAgYWNfZG90cz1gZWNobyAkYWNfY29uZmlnX2RpcnxzZWQgLWUgJ3MlXlwuLyUlJyAtZSAncyVbXi9dJCUmLyUnIC1lICdzJVteL10qLyUuLi8lZydgCisKKyAgICBjYXNlICIkc3JjZGlyIiBpbgorICAgIC4pICMgTm8gLS1zcmNkaXIgb3B0aW9uLiAgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgICAgYWNfc3ViX3NyY2Rpcj0kc3JjZGlyIDs7CisgICAgLyopICMgQWJzb2x1dGUgcGF0aC4KKyAgICAgIGFjX3N1Yl9zcmNkaXI9JHNyY2Rpci8kYWNfY29uZmlnX2RpciA7OworICAgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICAgIGFjX3N1Yl9zcmNkaXI9JGFjX2RvdHMkc3JjZGlyLyRhY19jb25maWdfZGlyIDs7CisgICAgZXNhYworCisgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmU7IG90aGVyd2lzZSBnZXQgQ3lnbnVzIHN0eWxlIGNvbmZpZ3VyZS4KKyAgICBpZiB0ZXN0IC1mICRhY19zdWJfc3JjZGlyL2NvbmZpZ3VyZTsgdGhlbgorICAgICAgYWNfc3ViX2NvbmZpZ3VyZT0kYWNfc3ViX3NyY2Rpci9jb25maWd1cmUKKyAgICBlbGlmIHRlc3QgLWYgJGFjX3N1Yl9zcmNkaXIvY29uZmlndXJlLmluOyB0aGVuCisgICAgICBhY19zdWJfY29uZmlndXJlPSRhY19jb25maWd1cmUKKyAgICBlbHNlCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6IG5vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2NvbmZpZ19kaXIiIDE+JjIKKyAgICAgIGFjX3N1Yl9jb25maWd1cmU9CisgICAgZmkKKworICAgICMgVGhlIHJlY3Vyc2lvbiBpcyBoZXJlLgorICAgIGlmIHRlc3QgLW4gIiRhY19zdWJfY29uZmlndXJlIjsgdGhlbgorCisgICAgICAjIE1ha2UgdGhlIGNhY2hlIGZpbGUgbmFtZSBjb3JyZWN0IHJlbGF0aXZlIHRvIHRoZSBzdWJkaXJlY3RvcnkuCisgICAgICBjYXNlICIkY2FjaGVfZmlsZSIgaW4KKyAgICAgIC8qKSBhY19zdWJfY2FjaGVfZmlsZT0kY2FjaGVfZmlsZSA7OworICAgICAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgICAgICBhY19zdWJfY2FjaGVfZmlsZT0iJGFjX2RvdHMkY2FjaGVfZmlsZSIgOzsKKyAgICAgIGVzYWMKKworICAgICAgZWNobyAicnVubmluZyAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfc3ViX2NvbmZpZ3VyZSAkYWNfc3ViX2NvbmZpZ3VyZV9hcmdzIC0tY2FjaGUtZmlsZT0kYWNfc3ViX2NhY2hlX2ZpbGUgLS1zcmNkaXI9JGFjX3N1Yl9zcmNkaXIiCisgICAgICAjIFRoZSBldmFsIG1ha2VzIHF1b3RpbmcgYXJndW1lbnRzIHdvcmsuCisgICAgICBpZiBldmFsICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19zdWJfY29uZmlndXJlICRhY19zdWJfY29uZmlndXJlX2FyZ3MgLS1jYWNoZS1maWxlPSRhY19zdWJfY2FjaGVfZmlsZSAtLXNyY2Rpcj0kYWNfc3ViX3NyY2RpcgorICAgICAgdGhlbiA6CisgICAgICBlbHNlCisgICAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3N1Yl9jb25maWd1cmUgZmFpbGVkIGZvciAkYWNfY29uZmlnX2RpciIgMT4mMjsgZXhpdCAxOyB9CisgICAgICBmaQorICAgIGZpCisKKyAgICBjZCAkYWNfcG9wZGlyCisgIGRvbmUKK2ZpCisKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvY29uZmlndXJlLmluIGIvc2ltL3Rlc3RzdWl0ZS9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlYmI3YQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsNDAgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitkbmwgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IGZyYWdtZW50IHRoYXQgc3VwcGxpZXMgdGhlIGluZm9ybWF0aW9uCitkbmwgbmVjZXNzYXJ5IHRvIHRhaWxvciBhIHRlbXBsYXRlIGNvbmZpZ3VyZSBzY3JpcHQgaW50byB0aGUgY29uZmlndXJlCitkbmwgc2NyaXB0IGFwcHJvcHJpYXRlIGZvciB0aGlzIGRpcmVjdG9yeS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBjaGVjaworZG5sIGFueSBleGlzdGluZyBjb25maWd1cmUgc2NyaXB0LgorCitBQ19QUkVSRVEoMi41KQorQUNfSU5JVChjb21tb24vYml0cy10c3QuYykKKworQ0M9JHtDQy1jY30KK0FDX1NVQlNUKENDKQorQUNfQ09ORklHX0FVWF9ESVIoYGNkICRzcmNkaXI7cHdkYC8uLi8uLikKK0FDX0NBTk9OSUNBTF9TWVNURU0KKworIyBEaXJlY3RvcmllcyB0byB1c2UgaW4gYWxsIGNvbmZpZ3VyYXRpb25zLgorY29uZmlnZGlycz0iIgorCisjIGFkZCB0ZXN0IHN1Yi1kaXJlY3RvcnkgZm9yIGFwcHJvcHJpYXRlIHRhcmdldHMKK3Rlc3RkaXI9YGVjaG8gJHt0YXJnZXR9IHwgc2VkIC1lICdzLy0uKi0vLS8nYAoraWYgdGVzdCAtciAke3NyY2Rpcn0vJHt0ZXN0ZGlyfS9jb25maWd1cmUgOyB0aGVuCisgIGNvbmZpZ2RpcnM9IiR7Y29uZmlnZGlyc30gJHRlc3RkaXIiCitmaQorCisjIGFkZCBhbnkgZXh0cmEgc3ViZGlyZWN0b3JpZXMKK2Nhc2UgJHRhcmdldCBpbgorICAqKSA7OworZXNhYworCisjIENvbXB1dGUgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCisjIEZJWE1FOiBXaWxsIG5lZWQgdG8gY2Fub25pY2FsaXplIHNvbWUgdmFsdWVzLgorIyBGSVhNRTogU2hvdWxkIGJlIGluIGdlbmVyYWxseSBhY2Nlc3NhYmxlIHBsYWNlLgorY2FzZSAkdGFyZ2V0IGluCisgICopIGFyY2g9JHt0YXJnZXRfY3B1fSA7OworZXNhYworQUNfU1VCU1QoYXJjaCkKKworIyBjb25maWd1cmUgdGhlIHN1YmRpcmVjdG9yaWVzIHRvbworQUNfQ09ORklHX1NVQkRJUlMoJGNvbmZpZ2RpcnMpCisKK0FDX09VVFBVVChNYWtlZmlsZSkKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvQ2hhbmdlTG9nIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiN2Y4YwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsODQgQEAKKzE5OTktMDEtMTMgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKKworCSogdC1zYWRkLnM6IE5ldyBmaWxlLgorCSogTWFrZWZpbGUuaW4gKFRFU1RTKTogQWRkIHQtc2FkZC4KKworTW9uIEZlYiAxNiAwOToyMDo1NyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHQtbWFjcm9zLmkgKFZFQ18qKTogRGVmaW5lLgorCShETUFQX1JFRywgRE1BUF9CQVNFLCBETUFQX01BU0spOiBEZWZpbmUuCisJKElNQVBbMDFdX1JFRyk6IERlZmluZS4KKworCSogdC1yZHQucyAodGVzdF90ZHQpOiBOZXcgZmlsZS4KKworCSogdC1kYnQucyAodGVzdF9kYnQpOiBOZXcgZmlsZS4KKworCSogTWFrZWZpbGUuaW4gKFRFU1RTKTogQWRkIHQtcmR0IGFuZCB0LWRidC4KKwkKKworRnJpIEZlYiAxMyAxNjoyMToxMyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHQtc3AuczogTmV3IHRlc3QuCisJKiBNYWtlZmlsZS5pbiAoVEVTVFMpOiBVcGRhdGUuCisKK1dlZCBGZWIgMTEgMTc6NTg6NTAgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiB0LW1hY3Jvcy5pOiBVcGRhdGUgdHJhcCBjYWxscywgZnVuYyBpbiByNCwgYXJncyBpbgorIAlyMC4uLgorCShzdGFydCk6IEZvcmNlIHIwIHRvIHplcm8uCisKKwkqIHQtc3ViMncuczogRGl0dG8uCisKK1R1ZSBEZWMgIDkgMTA6NDE6NDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiB0LXJ0ZS5zIChzdWNjZXNzKTogTmV3IGZpbGUuCisJKiBNYWtlZmlsZS5pbjogVXBkYXRlLgorCisJKiB0LXJlcC5zOiBDaGVjayByZXAgcmVwZWF0cyBjb3JyZWN0IG51bWJlciBvZiB0aW1lcy4KKworRnJpIERlYyAgNSAxMDoxMToxOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHQtbXZ0Yy5zOiBDaGVjayBmb3Igc3R1Y2stemVybyBpbiBNT0RfRSwgTU9EX1MuCisKKwkqIHQtdHJhcC5zOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmluIChURVNUUyk6IFVwZGF0ZS4KKworVGh1IERlYyAgNCAxNjo1Njo1NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHQtbWFjcm9zLmk6IEFkZCBkZWZpbml0aW9ucyBmb3IgUFNXIGJpdHMuCisKKwkqIHQtbXZ0Yy5zOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmluIChURVNUUyk6IFVwZGF0ZS4KKworV2VkIERlYyAgMyAxNjozNToyNCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHQtcmFjLnM6IE5ldyBmaWxlcy4KKwkKKwkqIHQtbWFjcm9zLmk6IEFkZCBtYWNyb3MgZm9yIGNoZWNraW5nIHBzdyBhbmQgMncgcXVhbnRpdGllcy4KKworCSogTWFrZWZpbGUuaW4gKFRFU1RTKTogVXBkYXRlLgorCitUdWUgRGVjICAyIDExOjAxOjM2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogdC1zdWIydy5zLCB0LW11bHh1LnMsIHQtbWFjLnMsIHQtbXZ0YWMucywgdC1tc2J1LnMsIHQtc3ViLnM6IE5ldworIAlmaWxlcy4KKyAgCQorCSogTWFrZWZpbGUuaW46IFVwZGF0ZS4KKworTW9uIE5vdiAxNyAyMDoxNDo0OCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHQtc3ViaS5zICh0ZXN0X3N1YmkpOiBOZXcgZmlsZS4KKwkqIE1ha2VmaWxlLmluOiBVcGRhdGUuCisKK0ZyaSBOb3YgMTQgMTQ6MDY6MDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiB0LXJlcC5zOiBOZXcgZmlsZS4gVGVzdCBjYXNlIG9mIGJyYW5jaCB0byBSUFRfRSBhZGRyZXNzLgorCitNb24gTm92IDEwIDE5OjIxOjI2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogdC1tYWNyb3MuaSAoX3N0YXJ0KTogTmV3IGZpbGUuCisJKiB0LXJhY2hpLnM6IE5ldyBmaWxlLgorCisJKiBNYWtlZmlsZS5pbiAoUlVOX0ZPUl9UQVJHRVQpOiBMb29rIGZvciBzaW11bGF0b3IgaW4gZDEwdgorIAlkaXJlY3RvcnkuCisKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvTWFrZWZpbGUuaW4gYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZDU5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMTUwIEBACisjIE1ha2VmaWxlIGZvciByZWdyZXNzaW9uIHRlc3RpbmcgdGhlIEdOVSBkZWJ1Z2dlci4KKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworIyBHREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIEdEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworVlBBVEggPSBAc3JjZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3NyY3Jvb3QgPSAkKHNyY2RpcikvLi4KKworcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorCitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorYnVpbGRfY2Fub25pY2FsID0gQGJ1aWxkQAoraG9zdF9jYW5vbmljYWwgPSBAaG9zdEAKK3RhcmdldF9jYW5vbmljYWwgPSBAdGFyZ2V0QAordGFyZ2V0X2NwdSA9IEB0YXJnZXRfY3B1QAorCisKK1NIRUxMID0gL2Jpbi9zaAorU1VCRElSUyA9IEBzdWJkaXJzQAorUlBBVEhfRU5WVkFSID0gQFJQQVRIX0VOVlZBUkAKKworVEVTVFMgPSBcCisJZXhpdDQ3LmtvIFwKKwloZWxsby5oaSBcCisJdC1kYnQub2sgXAorCXQtbWFjLm9rIFwKKwl0LW12dGFjLm9rIFwKKwl0LW12dGMub2sgXAorCXQtbXNidS5vayBcCisJdC1tdWx4dS5vayBcCisJdC1yYWMub2sgXAorCXQtcmFjaGkub2sgXAorCXQtcmR0Lm9rIFwKKwl0LXJlcC5vayBcCisJdC1ydGUub2sgXAorCXQtc2FkZC5vayBcCisJdC1zcC5vayBcCisJdC1zdWIydy5vayBcCisJdC1zdWIub2sgXAorCXQtc3ViaS5vayBcCisjCisKK0FTX0ZPUl9UQVJHRVQgPSBgXAorICBpZiBbIC14IC4uLy4uLy4uL2dhcy9hcy1uZXcgXTsgdGhlbiBcCisgICAgZWNobyAuLi8uLi8uLi9nYXMvYXMtbmV3IDsgXAorICBlbHNlIFwKKyAgICBlY2hvICQodGFyZ2V0X2FsaWFzKS1hcyA7IFwKKyAgZmlgCisKK0xEX0ZPUl9UQVJHRVQgPSBgXAorICBpZiBbIC14IC4uLy4uLy4uL2xkL2xkLW5ldyBdOyB0aGVuIFwKKyAgICBlY2hvIC4uLy4uLy4uL2xkL2xkLW5ldyA7IFwKKyAgZWxzZSBcCisgICAgZWNobyAkKHRhcmdldF9hbGlhcyktbGQgOyBcCisgIGZpYAorCitSVU5fRk9SX1RBUkdFVCA9IGBcCisgIGlmIFsgLXggLi4vLi4vLi4vc2ltL2QxMHYvcnVuIF07IHRoZW4gXAorICAgIGVjaG8gLi4vLi4vLi4vc2ltL2QxMHYvcnVuIDsgXAorICBlbHNlIFwKKyAgICBlY2hvICQodGFyZ2V0X2FsaWFzKS1ydW4gOyBcCisgIGZpYAorCisKK2NoZWNrOiBzYW5pdHkgJChURVNUUykKK3Nhbml0eToKKwlAZXZhbCBlY2hvIEFTX0ZPUl9UQVJHRVQ9JChBU19GT1JfVEFSR0VUKQorCUBldmFsIGVjaG8gTERfRk9SX1RBUkdFVD0kKExEX0ZPUl9UQVJHRVQpCisJQGV2YWwgZWNobyBSVU5fRk9SX1RBUkdFVD0kKFJVTl9GT1JfVEFSR0VUKQorCitjbGVhbjoKKwlybSAtZiAkKFRFU1RTKQorCXJtIC1mICoucnVuICoubworCXJtIC1mIGNvcmUgKi5jb3JlCisKKyMgUnVsZXMgZm9yIHJ1bm5pbmcgdGhlIHRlc3RzCisKKy5TVUZGSVhFUzogLm9rIC5ydW4gLmhpIC5rbyAudGkKKy5ydW4ub2s6CisJcm0gLWYgdG1wLSQqICQqLmhpCisJdWxpbWl0IC10IDUgOyBcCisJJChSVU5fRk9SX1RBUkdFVCkgJChSVU5GTEFHU19GT1JfVEFSR0VUKSAkKi5ydW4gPiB0bXAtJCoKKwltdiB0bXAtJCogJCoub2sKKy5ydW4uaGk6CisJcm0gLWYgdG1wLSQqICQqLmhpIGRpZmYtJCoKKwl1bGltaXQgLXQgNSA7IFwKKwkkKFJVTl9GT1JfVEFSR0VUKSAkKFJVTkZMQUdTX0ZPUl9UQVJHRVQpICQqLnJ1biA+IHRtcC0kKgorCWVjaG8gJ0hlbGxvIFdvcmxkIScgfCBkaWZmIC0gdG1wLSQqID4gZGlmZi0kKgorCWNhdCB0bXAtJCogZGlmZi0kKiA+ICQqLmhpCisucnVuLmtvOgorCXJtIC1mIHRtcC0kKiAkKi5rbworCXNldCArZSA7IFwKKwl1bGltaXQgLXQgNSA7IFwKKwkkKFJVTl9GT1JfVEFSR0VUKSAkKFJVTkZMQUdTX0ZPUl9UQVJHRVQpICQqLnJ1biA+IHRtcC0kKiA7IFwKKwlpZiBbICQkPyAtZXEgNDcgXSA7IHRoZW4gXAorCSAgZXhpdCAwIDsgXAorCWVsc2UgXAorCSAgZXhpdCAxIDsgXAorCWZpCisJbXYgdG1wLSQqICQqLmtvCisucnVuLnRpOgorCXJtIC1mIHRtcC0kKiAkKi50aQorCXNldCArZSA7IFwKKwl1bGltaXQgLXQgNSA7IFwKKwkkKFJVTl9GT1JfVEFSR0VUKSAkKFJVTkZMQUdTX0ZPUl9UQVJHRVQpICQoSU5URkxBR1NfRk9SX1RBUkdFVCkgJCoucnVuID4gdG1wLSQqCisJdGVzdCBgY2F0IHRtcC0kKiB8IHdjIC1sYCAtZXEgMTAgPCAvZGV2L251bGwKKwl0ZXN0IGBncmVwIFRpY2sgdG1wLSQqIHwgd2MgLWxgIC1lcSAxMCA8IC9kZXYvbnVsbAorCW12IHRtcC0kKiAkKi50aQorCisKKyMgUnVsZXMgZm9yIGJ1aWxkaW5nIHRoZSB0ZXN0CisjIFByZWZlcmVuY2UgaXMgZm9yIG9idGFpbmluZyB0aGUgZXhlY3V0YWJsZSAoLnJ1bikgZnJvbSBhIHByZWJ1aWx0IGltYWdlCisKKy5TVUZGSVhFUzogLnV1ZSAucyAuUyAucnVuCisudXVlLnJ1bjoKKwloZWFkICQqIHwgZ3JlcCAkKi5ydW4gPiAvZGV2L251bGwKKwl1dWRlY29kZSAkKi51dWUKKy5ydW4udToKKwl1dWVuY29kZSA8ICQqLnJ1biAkKi5ydW4gPiAkKi51Cisuby5ydW46CisJJChMRF9GT1JfVEFSR0VUKSAkKExERkxBR1NfRk9SX1RBUkdFVCkgLW8gJCoucnVuICQqLm8KKy5zLm86CisJJChBU19GT1JfVEFSR0VUKSAkKEFTRkxBR1NfRk9SX1RBUkdFVCkgLUkkKHNyY2RpcikgJChzcmNkaXIpLyQqLnMgLW8gJCoubworLlMubzoKKwkkKEFTX0ZPUl9UQVJHRVQpICQoQVNGTEFHU19GT1JfVEFSR0VUKSAtSSQoc3JjZGlyKSAkKHNyY2RpcikvJCouUyAtbyAkKi5vCisKKworTWFrZWZpbGU6IE1ha2VmaWxlLmluIGNvbmZpZy5zdGF0dXMKKwkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworY29uZmlnLnN0YXR1czogY29uZmlndXJlCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi9jb25maWd1cmUgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iOTM0OGJiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi9jb25maWd1cmUKQEAgLTAsMCArMSw5MDAgQEAKKyMhIC9iaW4vc2gKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIgCisjIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworIyBEZWZhdWx0czoKK2FjX2hlbHA9CithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCisjIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46CisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIiCisgICAgZXhpdCAwIDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Li9jb25maWcubG9nCisKK2VjaG8gIlwKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorIiAxPiY1CisKKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCithY19jb25maWd1cmVfYXJncz0KK2ZvciBhY19hcmcKK2RvCisgIGNhc2UgIiRhY19hcmciIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBlc2FjCitkb25lCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKyMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCisjIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCitpZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID4gY29uZmRlZnMuaAorCisjIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0CisjIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitpZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KKyAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKyAgICBhY19uPSBhY19jPScKKycgYWNfdD0nCScKKyAgZWxzZQorICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKyAgZmkKK2Vsc2UKKyAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CitmaQorCisKKworQ0M9JHtDQy1jY30KKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworCisjIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KKyMgVGhlIGlucHV0cyBhcmU6CisjICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKKyMKKyMgVGhlIHJ1bGVzIGFyZToKKyMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCisjICAgIHNhbWUgdGltZS4KKyMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCisjIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKKyMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCisjIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCisjIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgorCisjIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCisjIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCitjYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KK05PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKKyopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KK2lmICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKK2Vsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1NzI6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorCitob3N0X2FsaWFzPSRob3N0CitjYXNlICIkaG9zdF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKQorICAgIGlmIGhvc3RfYWxpYXM9YCRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKKyAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaSA7OworICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitob3N0PWAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKK2hvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTkzOiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorCit0YXJnZXRfYWxpYXM9JHRhcmdldAorY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCit0YXJnZXQ9YCRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCit0YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2MTE6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKworYnVpbGRfYWxpYXM9JGJ1aWxkCitjYXNlICIkYnVpbGRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2J1aWxkPWAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCitidWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2J1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAorYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKKwordGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgorICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCisgICAgTk9ORU5PTkVzLHgseCwgJiYKKyAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQorCisKKworCisKK3RyYXAgJycgMSAyIDE1CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxYCBpbgorICAqYWNfc3BhY2U9XCAqKQorICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCisgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICBzZWQgLW4gXAorICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKKyAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKyAgICA7OworICAqKQorICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJworICAgIDs7CisgIGVzYWMgPj4gY29uZmNhY2hlCitpZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKyMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCitmaQorCit0cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBERUZTLgorIyBQcm90ZWN0IGFnYWluc3Qgc2hlbGwgZXhwYW5zaW9uIHdoaWxlIGV4ZWN1dGluZyBNYWtlZmlsZSBydWxlcy4KKyMgUHJvdGVjdCBhZ2FpbnN0IE1ha2VmaWxlIG1hY3JvIGV4cGFuc2lvbi4KK2NhdCA+IGNvbmZ0ZXN0LmRlZnMgPDxcRU9GCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUtRFwxPVwyJWcKK3MlWyAJYH4jJF4mKigpe31cXHw7JyI8Pj9dJVxcJiVnCitzJVxbJVxcJiVnCitzJVxdJVxcJiVnCitzJVwkJSQkJWcKK0VPRgorREVGUz1gc2VkIC1mIGNvbmZ0ZXN0LmRlZnMgY29uZmRlZnMuaCB8IHRyICdcMDEyJyAnICdgCitybSAtZiBjb25mdGVzdC5kZWZzCisKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorCit0cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBDQ0AlJENDJWcKK3MlQGhvc3RAJSRob3N0JWcKK3MlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKK3MlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCitzJUBob3N0X29zQCUkaG9zdF9vcyVnCitzJUB0YXJnZXRAJSR0YXJnZXQlZworcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKK3MlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKK3MlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKK3MlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCitzJUBidWlsZEAlJGJ1aWxkJWcKK3MlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZworcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKK3MlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCitzJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL2NvbmZpZ3VyZS5pbiBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDM4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDE5IEBACitkbmwgUHJvY2VzcyB0aGlzIGZpbGUgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorZG5sIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCBmcmFnbWVudCB0aGF0IHN1cHBsaWVzIHRoZSBpbmZvcm1hdGlvbgorZG5sIG5lY2Vzc2FyeSB0byB0YWlsb3IgYSB0ZW1wbGF0ZSBjb25maWd1cmUgc2NyaXB0IGludG8gdGhlIGNvbmZpZ3VyZQorZG5sIHNjcmlwdCBhcHByb3ByaWF0ZSBmb3IgdGhpcyBkaXJlY3RvcnkuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sKK2RubCBhbnkgZXhpc3RpbmcgY29uZmlndXJlIHNjcmlwdC4KKworQUNfUFJFUkVRKDIuNSkKK2RubCBGSVhNRSAtIHRoaW5rIG9mIGEgdHJ1bHkgdW5pcSBmaWxlIHRvIHRoaXMgZGlyZWN0b3J5CitBQ19JTklUKE1ha2VmaWxlLmluKQorCitDQz0ke0NDLWNjfQorQUNfU1VCU1QoQ0MpCitBQ19DT05GSUdfQVVYX0RJUihgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uKQorQUNfQ0FOT05JQ0FMX1NZU1RFTQorCitBQ19TVUJTVCh0YXJnZXRfY3B1KQorCisKK0FDX09VVFBVVChNYWtlZmlsZSkKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvZXhpdDQ3LnMgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL2V4aXQ0Ny5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZTQ2NjQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL2V4aXQ0Ny5zCkBAIC0wLDAgKzEsNCBAQAorLmluY2x1ZGUgInQtbWFjcm9zLmkiCisKKwlzdGFydAorCWV4aXQ0NwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi9oZWxsby5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi9oZWxsby5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNjBjODkKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL2hlbGxvLnMKQEAgLTAsMCArMSw1IEBACisJLmluY2x1ZGUgInQtbWFjcm9zLmkiCisKKwlzdGFydAorCWhlbGxvCisJZXhpdDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvbG9vcC5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi9sb29wLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzNzFlNAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvbG9vcC5zCkBAIC0wLDAgKzEsNiBAQAorCS50ZXh0CisJLmdsb2JsIF9zdGFydAorCitfc3RhcnQ6CisJYnJhIF9zdGFydAorCW5vcApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWRidC5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LWRidC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNTE4NDcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtZGJ0LnMKQEAgLTAsMCArMSwzMyBAQAorLmluY2x1ZGUgInQtbWFjcm9zLmkiCisKKwlzdGFydAorCisJUFNXX0JJVFMgPSBQU1dfRE0KKwkKKzs7OyBCbGF0IG91ciBETUFQIHJlZ2lzdGVycyBzbyB0aGF0IHRoZXkgcG9pbnQgYXQgb24tY2hpcCBpbWVtCisKKwlsZGkgcjIsIE1BUF9JTlNOIHwgMHhmCisJc3QgcjIsIEAoRE1BUF9SRUcscjApCisJbGRpIHIyLCBNQVBfSU5TTgorCXN0IHIyLCBAKElNQVAxX1JFRyxyMCkKKworOzs7IFBhdGNoIHRoZSBpbnRlcnJ1cHQgdmVjdG9yJ3MgZGJ0IGVudHJ5IHdpdGggYSBqbXAgdG8gc3VjY2VzcworCisJbGRpIHI0LCAjdHJhcAorCWxkaSByNSwgKFZFQ19EQlQgJiBETUFQX01BU0spICsgRE1BUF9CQVNFCisJbGQydyByMiwgQCgwLHI0KQorCXN0MncgcjIsIEAoMCxyNSkKKwlsZDJ3IHIyLCBAKDQscjQpCisJc3QydyByMiwgQCg0LHI1KQorCit0ZXN0X2RidDoKKwlkYnQgLT4gbm9wCisJZXhpdDQ3CisKK3N1Y2Nlc3M6CisJY2hlY2twc3cyIDEgUFNXX0JJVFMKKwlleGl0MAorCisJLmRhdGEKK3RyYXA6CWxkaSByMSwgc3VjY2Vzc0B3b3JkCisJam1wIHIxCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtbWFjLnMgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtbWFjLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0ZjYxNQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1tYWMucwpAQCAtMCwwICsxLDcxIEBACisuaW5jbHVkZSAidC1tYWNyb3MuaSIKKworCXN0YXJ0CisKKwk7OyBjbGVhciBGWAorCWxvYWRwc3cyIDB4ODAwNQorCWxvYWRhY2MyIGExIDB4N2YgMHhmZmZmIDB4ZmZmZgorCWxvYWQgcjggMHhmZmZmCisJbG9hZCByOSAweDgwMDEKK3Rlc3RfbWFjdTE6CisJTUFDVSBhMSwgcjksIHI4CisJY2hlY2thY2MyIDEgYTEgMHg4MCAweDgwMDAgMHg3RkZFCisKKwk7OyBzZXQgRlgKKwlsb2FkcHN3MiAweDgwODUKKwlsb2FkYWNjMiBhMSAweDdmIDB4ZmZmZiAweGZmZmYKKwlsb2FkIHI4IDB4ZmZmZgorCWxvYWQgcjkgMHg4MDAxCit0ZXN0X21hY3UyOgorCU1BQ1UgYTEsIHI5LCByOAorCWNoZWNrYWNjMiAyIGExIDB4ODEgMHgwMDAwIDB4ZmZmZAorCisKKworCQorCTs7IGNsZWFyIEZYCisJbGRpIHIyLCAjMHg4MDA1CisJbXZ0YyByMiwgY3IwCisKKwlsb2FkYWNjMiBhMSAweDdmIDB4ZmZmZiAweGZmZmYKKwlsZGkgcjgsICMweGZmZmYKKwlsZGkgcjksICMweDdGRkYKK3Rlc3RfbWFjc3UxOgorCU1BQ1NVIGExLCByOSwgcjgKKwljaGVja2FjYzIgMyBhMSAweDgwIDB4N0ZGRSAweDgwMDAKKworCTs7IHNldCBGWAorCWxkaSByMiwgIzB4ODA4NQorCW12dGMgcjIsIGNyMAorCisJbG9hZGFjYzIgYTEgMHg3ZiAweGZmZmYgMHhmZmZmCisJbGRpIHI4LCAjMHhmZmZmCisJbGRpIHI5LCAjMHg3RkZGCit0ZXN0X21hY3N1MjoKKwlNQUNTVSBhMSwgcjksIHI4CisJY2hlY2thY2MyIDQgYTEgMHg4MCAweGZmZmQgMHgwMDAxCisKKwk7OyBjbGVhciBGWAorCWxkaSByMiwgIzB4ODAwNQorCW12dGMgcjIsIGNyMAorCisJbG9hZGFjYzIgYTEgMHg3ZiAweGZmZmYgMHhmZmZmCisJbGRpIHI4LCAweGZmZmYKKwlsZGkgcjksIDB4ODAwMQordGVzdF9tYWNzdTM6CisJTUFDU1UgYTEsIHI5LCByOAorCWNoZWNrYWNjMiA1IGExIDB4N0YgMHg4MDAxIDB4N0ZGRQorCisJOzsgc2V0IEZYCisJbGRpIHIyLCAjMHg4MDg1CisJbXZ0YyByMiwgY3IwCisKKwlsb2FkYWNjMiBhMSAweDdmIDB4ZmZmZiAweGZmZmYKKwlsZGkgcjgsICMweGZmZmYKKwlsZGkgcjksICMweDgwMDEKK3Rlc3RfbWFjc3U0OgorCU1BQ1NVIGExLCByOSwgcjgKKwljaGVja2FjYzIgNiBhMSAweDdmIDB4MDAwMiAweEZGRkQKKworCWV4aXQwCisKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1tYWNyb3MuaSBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1tYWNyb3MuaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjU0ZDFjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LW1hY3Jvcy5pCkBAIC0wLDAgKzEsMTcwIEBACisJLm1hY3JvIHN0YXJ0CisJLnRleHQKKwkuYWxpZ24gMgorCS5nbG9ibCBfc3RhcnQKK19zdGFydDoKKwlsZGkgcjAsIDAKKwkuZW5kbQorCisKKwkubWFjcm8gZXhpdDQ3CisJbGRpIHI0LCAxCisJbGRpIHIwLCA0NworCXRyYXAgMTUKKwkuZW5kbQorCisKKwkubWFjcm8gZXhpdDAKKwlsZGkgcjQsIDEKKwlsZGkgcjAsIDAKKwl0cmFwIDE1CisJLmVuZG0KKworCisJLm1hY3JvIGxvYWQgcmVnIHZhbAorCWxkaSBccmVnLCAjXHZhbAorCS5lbmRtCisKKworCS5tYWNybyBsb2FkMncgcmVnIGhpIGxvCisJbGQydyBccmVnLCBAKDFmLHIwKQorCS5kYXRhCisJLmFsaWduIDIKKzE6CS5zaG9ydCBcaGkKKwkuc2hvcnQgXGxvCisJLnRleHQKKwkuZW5kbQorCisKKwkubWFjcm8gY2hlY2sgZXhpdCByZWcgdmFsCisJY21wZXFpCVxyZWcsICNcdmFsCisJYnJmMHQgMWYKKzA6CWxkaSByNCwgMQorCWxkaSByMCwgXGV4aXQKKwl0cmFwIDE1CisxOgorCS5lbmRtCisKKworCS5tYWNybyBjaGVjazJ3MiBleGl0IHJlZyBoaSBsbworCXN0MncJXHJlZywgQCgxZixyMCkKKwlsZAlyMiwgQCgxZiwgcjApCisJY21wZXFpCXIyLCAjXGhpCisJYnJmMGYJMGYKKwlsZAlyMiwgQCgxZiArIDIsIHIwKQorCWNtcGVxaQlyMiwgI1xsbworCWJyZjBmCTBmCisJYnJhCTJmCiswOglsZGkgcjQsIDEKKwlsZGkgcjAsIFxleGl0CisJdHJhcCAxNQorCS5kYXRhCisJLmFsaWduIDIKKzE6CS5sb25nIDAKKwkudGV4dAorMjoKKwkuZW5kbQorCisKKwkubWFjcm8gbG9hZGFjYzIgYWNjIGd1YXJkIGhpIGxvCisJbGRpCXIyLCAjXGxvCisJbXZ0YWNsbwlyMiwgXGFjYworCWxkaQlyMiwgI1xoaQorCW12dGFjaGkJcjIsIFxhY2MKKwlsZGkJcjIsICNcZ3VhcmQKKwltdnRhY2cJcjIsIFxhY2MKKwkuZW5kbQorCisKKwkubWFjcm8gY2hlY2thY2MyIGV4aXQgYWNjIGd1YXJkIGhpIGxvCisJbGRpCXIyLCAjXGd1YXJkCisJbXZmYWNnCXIzLCBcYWNjCisJY21wZXEJcjIsIHIzCisJYnJmMGYJMGYKKwlsZGkJcjIsICNcaGkKKwltdmZhY2hpCXIzLCBcYWNjCisJY21wZXEJcjIsIHIzCisJYnJmMGYJMGYKKwlsZGkJcjIsICNcbG8KKwltdmZhY2xvCXIzLCBcYWNjCisJY21wZXEJcjIsIHIzCisJYnJmMGYJMGYKKwlicmEJNGYKKzA6CWxkaSByNCwgMQorCWxkaSByMCwgXGV4aXQKKwl0cmFwIDE1Cis0OgorCS5lbmRtCisKKworCS5tYWNybyBsb2FkcHN3MiB2YWwKKwlsZGkgcjIsICNcdmFsCisJbXZ0YwlyMiwgY3IwCisJLmVuZG0KKworCisJLm1hY3JvIGNoZWNrcHN3MiBleGl0IHZhbAorCW12ZmMJcjIsIGNyMAorCWNtcGVxaQlyMiwgI1x2YWwKKwlicmYwdAkxZgorCWxkaSByNCwgMQorCWxkaSByMCwgXGV4aXQKKwl0cmFwIDE1CisxOgorCS5lbmRtCisKKworCS5tYWNybyBoZWxsbworCTs7IDQ6d3JpdGUgKDEsIHN0cmluZywgc3RybGVuIChzdHJpbmcpKQorCWxkaSByNCwgNAorCWxkaSByMCwgMQorCWxkaSByMSwgMWYKKwlsZGkgcjIsIDJmLTFmLTEKKwl0cmFwIDE1CisJLnNlY3Rpb24JLnJvZGF0YQorMToJLnN0cmluZyAiSGVsbG8gV29ybGQhXG4iCisyOgkuYWxpZ24gMgorCS50ZXh0CisJLmVuZG0KKworCisJUFNXX1NNID0gMHg4MDAwCisJUFNXXzAxID0gMHg0MDAwCisJUFNXX0VBID0gMHgyMDAwCisJUFNXX0RCID0gMHgxMDAwCisJUFNXX0RNID0gMHgwODAwCisJUFNXX0lFID0gMHgwNDAwCisJUFNXX1JQID0gMHgwMjAwCisJUFNXX01EID0gMHgwMTAwCisJUFNXX0ZYID0gMHgwMDgwCisJUFNXX1NUID0gMHgwMDQwCisJUFNXXzEwID0gMHgwMDIwCisJUFNXXzExID0gMHgwMDEwCisJUFNXX0YwID0gMHgwMDA4CisJUFNXX0YxID0gMHgwMDA0CisJUFNXXzE0ID0gMHgwMDAyCisJUFNXX0MgID0gMHgwMDAxCisKKworOzs7CisKKwlETUFQX01BU0sgPSAweDNmZmYKKwlETUFQX0JBU0UgPSAweDgwMDAKKwlETUFQX1JFRyA9IDB4ZmYwNAorCisJSU1BUDBfUkVHID0gMHhmZjAwCisJSU1BUDFfUkVHID0gMHhmZjAyCisKKwlNQVBfSU5TTiA9IDB4MTAwMAorCis7OzsKKworCVZFQ19SSSAgID0gMHgzZmMwMAorCVZFQ19CQUUgID0gMHgzZmMwNAorCVZFQ19SSUUgID0gMHgzZmMwOAorCVZFQ19BRSAgID0gMHgzZmMwYworCVZFQ19UUkFQID0gMHgzZmMxMAorCVZFQ19EQlQgID0gMHgzZmY1MAorCVZFQ19TREJUID0gMHgzZmZmNAorCVZFQ19EQkkgID0gMHgzZmY1OAorCVZFQ19FSSAgID0gMHgzZmY1YwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LW1zYnUucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1tc2J1LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyNzZjYwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1tc2J1LnMKQEAgLTAsMCArMSwyOCBAQAorLmluY2x1ZGUgInQtbWFjcm9zLmkiCisKKwlzdGFydAorCisJOzsgY2xlYXIgRlgKKwlsZGkgcjIsICMweDgwMDUKKwltdnRjIHIyLCBjcjAKKworCWxvYWRhY2MyIGExIDB4N2YgMHhmZmZmIDB4ZmZmZgorCWxkaSByOCwgMHhmZmZmCisJbGRpIHI5LCAweDgwMDEKK3Rlc3RfbXNidTE6CisJTVNCVSBhMSwgcjksIHI4CisJY2hlY2thY2MyIDEgYTEgMFg3RiAweDdGRkYgMHg4MDAwCisKKwkKKwk7OyBzZXQgRlgKKwlsZGkgcjIsICMweDgwODUKKwltdnRjIHIyLCBjcjAKKworCWxvYWRhY2MyIGExIDB4N2YgMHhmZmZmIDB4ZmZmZgorCWxkaSByOCwgMHhmZmZmCisJbGRpIHI5LCAweDgwMDEKK3Rlc3RfbXNidTI6CisJTVNCVSBhMSwgcjksIHI4CisJY2hlY2thY2MyIDIgYTEgMFg3RSAweEZGRkYgMHgwMDAxCisKKwlleGl0MApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LW11bHh1LnMgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtbXVseHUucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGU2ZmZjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LW11bHh1LnMKQEAgLTAsMCArMSwyOCBAQAorLmluY2x1ZGUgInQtbWFjcm9zLmkiCisKKwlzdGFydAorCisJOzsgY2xlYXIgRlgKKwlsZGkgcjIsICMweDgwMDUKKwltdnRjIHIyLCBjcjAKKworCWxvYWRhY2MyIGExIDB4N2YgMHhmZmZmIDB4ZmZmZgorCWxkaSByOCwgMHhmZmZmCisJbGRpIHI5LCAweDgwMDEKK3Rlc3RfbXVseHUxOgorCU1VTFhVIGExLCByOSwgcjgKKwljaGVja2FjYzIgMSBhMSAweDAwIDB4ODAwMCAweDdGRkYKKworCQorCTs7IHNldCBGWAorCWxkaSByMiwgIzB4ODA4NQorCW12dGMgcjIsIGNyMAorCisJbG9hZGFjYzIgYTEgMHg3ZiAweGZmZmYgMHhmZmZmCisJbGRpIHI4LCAweGZmZmYKKwlsZGkgcjksIDB4ODAwMQordGVzdF9tdWx4dTI6CisJTVVMWFUgYTEsIHI5LCByOAorCWNoZWNrYWNjMiAyIGExIDB4MDEgMHgwMDAwIDB4RkZGRQorCisJZXhpdDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1tdnRhYy5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LW12dGFjLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0NTJkYwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1tdnRhYy5zCkBAIC0wLDAgKzEsMTkgQEAKKy5pbmNsdWRlICJ0LW1hY3Jvcy5pIgorCisJc3RhcnQKKworCWxkaSByOCwgMHhiZWVmCisJbXZ0YWNsbyByOCwgYTAKKwljaGVja2FjYzIgMSBhMCAweGZmIDB4ZmZmZiAweGJlZWYKKworCW12dGFjZwlyMCwgYTAKKwljaGVja2FjYzIgMiBhMCAweDAwIDB4ZmZmZiAweGJlZWYKKwkKKwlsZGkgcjgsIDB4ZGVhZAorCW12dGFjaGkJcjgsIGEwCisJY2hlY2thY2MyIDMgYTAgMHhmZiAweGRlYWQgMHhiZWVmCisKKwlsb2FkYWNjMiBhMSAweGZlIDB4YmVlZiAweGRlYWQKKwljaGVja2FjYzIgNCBhMSAweGZlIDB4YmVlZiAweGRlYWQKKworCWV4aXQwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtbXZ0Yy5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LW12dGMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmY5MzA4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LW12dGMucwpAQCAtMCwwICsxLDgxIEBACisuaW5jbHVkZSAidC1tYWNyb3MuaSIKKworCXN0YXJ0CisKKzs7OyBUcnkgb3V0IGVhY2ggYml0IGluIHRoZSBQU1cKKworCWxvYWRwc3cyIFBTV19TTQorCWNoZWNrcHN3MiAxIFBTV19TTQorCisJbG9hZHBzdzIgUFNXXzAxCisJY2hlY2twc3cyIDIgMCA7OyBQU1dfMDEKKworCWxvYWRwc3cyIFBTV19FQQorCWNoZWNrcHN3MiAzIFBTV19FQQorCisJbG9hZHBzdzIgUFNXX0RCCisJY2hlY2twc3cyIDQgUFNXX0RCCisKKwlsb2FkcHN3MiBQU1dfRE0KKwljaGVja3BzdzIgNSBQU1dfRE0KKworCWxvYWRwc3cyIFBTV19JRQorCWNoZWNrcHN3MiA2IFBTV19JRQorCisJbG9hZHBzdzIgUFNXX1JQCisJY2hlY2twc3cyIDcgUFNXX1JQCisKKwlsb2FkcHN3MiBQU1dfTUQKKwljaGVja3BzdzIgOCBQU1dfTUQKKworCWxvYWRwc3cyIFBTV19GWHxQU1dfU1QKKwljaGVja3BzdzIgOSBQU1dfRlh8UFNXX1NUCisKKwk7OyBsb2FkcHN3MiBQU1dfU1QKKwk7OyBjaGVja3BzdzIgMTAgCisKKwlsb2FkcHN3MiBQU1dfMTAKKwljaGVja3BzdzIgMTEgMCA7OyBQU1dfMTAKKworCWxvYWRwc3cyIFBTV18xMQorCWNoZWNrcHN3MiAxMiAwIDs7IFBTV18xMQorCisJbG9hZHBzdzIgUFNXX0YwCisJY2hlY2twc3cyIDEzIFBTV19GMAorCisJbG9hZHBzdzIgUFNXX0YxCisJY2hlY2twc3cyIDE0IFBTV19GMQorCisJbG9hZHBzdzIgUFNXXzE0CisJY2hlY2twc3cyIDE1IDAgOzsgUFNXXzE0CisKKwlsb2FkcHN3MiBQU1dfQworCWNoZWNrcHN3MiAxNiBQU1dfQworCisKKzs7OyBDaGVjayB0aGF0IGJpdCAwIChMU0IpIG9mIHRoZSBNT0RfRSAmIE1PRF9TIHJlZ2lzdGVycyBhcmUgc3R1Y2sgYXQgWkVSTy4KKworCWxkaQlyNiwgIzB4ZGVhZAorCW12dGMJcjYsIGNyMTAKKwlsZGkJcjYsICMweGJlZWYKKwltdnRjCXI2LCBjcjExCisJCisJbXZmYwlyNywgY3IxMAorCWNoZWNrIDE3IHI3IDB4ZGVhYworCW12ZmMJcjcsIGNyMTEKKwljaGVjayAxOCByNyAweGJlZWUKKworOzs7IENoZWNrIHRoYXQgY2VydGFpbiBiaXRzIG9mIHRoZSBEUFNXIGFuZCBCUFNXIGFyZSBoYXJkd2lyZWQgdG8gemVybworCisJbGRpCXI2LCAweGZmZmYKKwltdnRjCXI2LCBicHN3CisJbXZmYwlyNywgYnBzdworCWNoZWNrIDE4IHI3IDB4YmZjZAorCisJbGRpCXI2LCAweGZmZmYKKwltdnRjCXI2LCBkcHN3CisJbXZmYwlyNywgZHBzdworCWNoZWNrIDE4IHI3IDB4YmZjZAorCisKKwlleGl0MApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXJhYy5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXJhYy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTIzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtcmFjLnMKQEAgLTAsMCArMSwxNiBAQAorLmluY2x1ZGUgInQtbWFjcm9zLmkiCisKKwlzdGFydAorCisJOzsgY2xlYXIgRlgKKwlsb2FkcHN3MiAweDgwMDQKKwlsb2FkYWNjMiBhMCAweDgwIDB4MDAwMCAweDAwMDAKKwlsb2FkYWNjMiBhMSAweDAwIDB4MDAwMCAweDUwMDAKKwlsb2FkIHIxMCAweDAxMjMKKwlsb2FkIHIxMSAweDQ1NjcKK3Rlc3RfcmFjMToKKwlSQUMJcjEwLCBhMCwgIy0yCisJY2hlY2twc3cyIDEgMHg4MDA4CisJY2hlY2sydzIgMiByMTAgMHg4MDAwIDB4MDAwMAorCisJZXhpdDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1yYWNoaS5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXJhY2hpLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5MDE5NQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1yYWNoaS5zCkBAIC0wLDAgKzEsMjggQEAKKy5pbmNsdWRlICJ0LW1hY3Jvcy5pIgorCisJc3RhcnQKKworCWxvYWRhY2MyIGEwIDB4MDAgMHg3RkZGIDB4ODAwMAordGVzdF9yYWNoaV8xOgorCXJhY2hpIHI0LCBhMCwgMAorCWNoZWNrIDEgcjQgMHg3RkZGCisKKworCWxvYWRhY2MyIGEwIDB4RkYgMHg4MDAwIDB4MTAwMAordGVzdF9yYWNoaV8yOgorCXJhY2hpIHI0LCBhMCwgMAorCWNoZWNrIDIgcjQgMHg4MDAwCisKKworCWxvYWRhY2MyIGEwIDB4MDAgMHgxMDAwIDB4QTAwMAordGVzdF9yYWNoaV8zOgorCXJhY2hpIHI0LCBhMCwgMAorCWNoZWNrIDMgcjQgMHgxMDAxCisKKworCWxvYWRhY2MyIGEwIDB4RkYgMHhBMDAwIDB4N0ZGRgordGVzdF9yYWNoaV80OgorCXJhY2hpIHI0LCBhMCwgMAorCWNoZWNrIDQgcjQgMHhhMDAwCisKKwlleGl0MApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXJkdC5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXJkdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MWI1ODMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtcmR0LnMKQEAgLTAsMCArMSwxOCBAQAorLmluY2x1ZGUgInQtbWFjcm9zLmkiCisKKwlzdGFydAorCisJUFNXX0JJVFMgPSBQU1dfQ3xQU1dfRjB8UFNXX0YxCisJCisJbGRpCXI2LCAjc3VjY2Vzc0B3b3JkCisJbXZ0YwlyNiwgZHBjCisJbGRpCXI2LCAjUFNXX0JJVFMKKwltdnRjCXI2LCBkcHN3CisKK3Rlc3RfcmR0OgorCVJURAorCWV4aXQ0NworCitzdWNjZXNzOgorCWNoZWNrcHN3MiAxIFBTV19CSVRTCisJZXhpdDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1yZXAucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1yZXAucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWEzZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXJlcC5zCkBAIC0wLDAgKzEsNDUgQEAKKy5pbmNsdWRlICJ0LW1hY3Jvcy5pIgorCisJc3RhcnQKKworCisJCisJOzsgQ2hlY2sgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gQFJFUF9FIGlzIGV4ZWN1dGVkIHdoZW4gaXQKKwk7OyBpcyByZWFjaGVkIHVzaW5nIGEgYnJhbmNoIGluc3RydWN0aW9uCisJCisJbGRpIHIyLCAxCit0ZXN0X3JlcF8xOgorCXJlcAlyMiwgZW5kX3JlcF8xCisJbm9wIHx8IG5vcAorCW5vcCB8fCBub3AKKwlub3AgfHwgbm9wCisJbm9wIHx8IG5vcAorCWxkaQlyMywgNDYKKwlicmEJZW5kX3JlcF8xCisJbGRpCXIzLCA0MgorZW5kX3JlcF8xOgorCWFkZGkJcjMsIDEKKworCWNoZWNrIDEgcjMgNDcKKworCisJOzsgQ2hlY2sgdGhhdCB0aGUgbG9vcCBpcyBleGVjdXRlZCB0aGUgY29ycmVjdCBudW1iZXIgb2YgdGltZXMKKworCWxkaQlyMiwgMTAKKwlsZGkJcjMsIDAKKwlsZGkJcjQsIDAKK3Rlc3RfcmVwXzI6CisJcmVwCXIyLCBlbmRfcmVwXzIKKwlub3AgfHwgbm9wCisJbm9wIHx8IG5vcAorCW5vcCB8fCBub3AKKwlub3AgfHwgbm9wCisJbm9wIHx8IG5vcAorCWFkZGkJcjMsIDEKK2VuZF9yZXBfMjoKKwlhZGRpCXI0LCAxCisKKwljaGVjayAyIHIzIDEwCisJY2hlY2sgMyByNCAxMAorCisJZXhpdDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1ydGUucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1ydGUucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2UzMWRkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXJ0ZS5zCkBAIC0wLDAgKzEsMTggQEAKKy5pbmNsdWRlICJ0LW1hY3Jvcy5pIgorCisJc3RhcnQKKworCVBTV19CSVRTID0gUFNXX0N8UFNXX0YwfFBTV19GMQorCQorCWxkaQlyNiwgI3N1Y2Nlc3NAd29yZAorCW12dGMJcjYsIGJwYworCWxkaQlyNiwgI1BTV19CSVRTCisJbXZ0YwlyNiwgYnBzdworCit0ZXN0X3J0ZToKKwlSVEUKKwlleGl0NDcKKworc3VjY2VzczoKKwljaGVja3BzdzIgMSBQU1dfQklUUworCWV4aXQwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3Qtc2FkZC5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXNhZGQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2U0ZWJlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXNhZGQucwpAQCAtMCwwICsxLDM4IEBACisuaW5jbHVkZSAidC1tYWNyb3MuaSIKKworCXN0YXJ0CisKKwlQU1dfQklUUyA9IFBTV19GWHxQU1dfU1R8UFNXX1NNCisgICAgICAgIGxvYWRwc3cyIFBTV19CSVRTCisKKyA7OyBUZXN0IG5vcm1hbCBzYWRkCisKKyAgICAgICAgbG9hZGFjYzIgYTAgMHgwMCAweDdmZmYgMHhmZmZmCisgICAgICAgIGxvYWRhY2MyIGExIDB4ZmYgMHg4MDAwIDB4MDAwMAorICAgICAgICBzYWRkIGExLCBhMAorICAgICAgICBjaGVja2FjYzIgMSBhMCAweDAwIDB4N2ZmZiAweGZmZmYKKyAgICAgICAgY2hlY2thY2MyIDIgYTEgMHhmZiAweDgwMDAgMHg3ZmZmCisKKyA7OyBUZXN0IG92ZXJmbG93IAorCisgICAgICAgIGxvYWRhY2MyIGEwIDB4MDAgMHgwMDAwIDB4MDAwMAorICAgICAgICBsb2FkYWNjMiBhMSAweDAxIDB4ODAwMCAweDAwMDAKKyAgICAgICAgc2FkZCBhMSwgYTAKKyAgICAgICAgY2hlY2thY2MyIDMgYTAgMHgwMCAweDAwMDAgMHgwMDAwCisgICAgICAgIGNoZWNrYWNjMiA0IGExIDB4MDAgMHg3ZmZmIDB4ZmZmZgorCisgICAgICAgIGxvYWRhY2MyIGEwIDB4MDAgMHhmZmZmIDB4ZmZmZgorICAgICAgICBsb2FkYWNjMiBhMSAweDAwIDB4ZmZmZiAweGZmZmYKKyAgICAgICAgc2FkZCBhMSwgYTAKKyAgICAgICAgY2hlY2thY2MyIDUgYTEgMHgwMCAweDdmZmYgMHhmZmZmCisgICAgICAgIGNoZWNrYWNjMiA2IGEwIDB4MDAgMHhmZmZmIDB4ZmZmZgorCisgOzsgVGVzdCB1bmRlcmZsb3cKKworICAgICAgICBsb2FkYWNjMiBhMCAweDAwIDB4MDAwMCAweDAwMDAKKyAgICAgICAgbG9hZGFjYzIgYTEgMHg4MCAweDgwMDAgMHgwMDAwCisgICAgICAgIHNhZGQgYTEsIGEwCisgICAgICAgIGNoZWNrYWNjMiA3IGEwIDB4MDAgMHgwMDAwIDB4MDAwMAorICAgICAgICBjaGVja2FjYzIgOCBhMSAweGZmIDB4ODAwMCAweDAwMDAKKworCWV4aXQwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3Qtc3AucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1zcC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZjlhZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3Qtc3AucwpAQCAtMCwwICsxLDE3IEBACisuaW5jbHVkZSAidC1tYWNyb3MuaSIKKworCXN0YXJ0CisKKzs7OyBSZWFkL1dyaXRlIHZhbHVlcyB0byBTUFUvU1BJCisKKwlsb2FkcHN3MiAwCisJbGRpIHNwLCAweGRlYWQKKwlsb2FkcHN3MiBQU1dfU00KKwlsZGkgc3AsIDB4YmVlZgorCQorCWxvYWRwc3cyIDAKKwljaGVjayAxIHNwIDB4ZGVhZAorCWxvYWRwc3cyIFBTV19TTQorCWNoZWNrIDIgc3AgMHhiZWVmCisKKwlleGl0MApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXN1Yi5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXN1Yi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZDBhM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3Qtc3ViLnMKQEAgLTAsMCArMSw0MiBAQAorLmluY2x1ZGUgInQtbWFjcm9zLmkiCisKKwlzdGFydAorCis7OyAgVGhlIGQxMHYgaW1wbGVtZW50cyBuZWdhdGVkIGFkZGl0aW9uIGZvciBzdWJ0cmFjdGlvbgorCisJLm1hY3JvIGNoZWNrX3N1YiBzIHggeSByIGMKKwk7OyBjbGVhciBjYXJyeQorCWxkaQlyNiwjMHg4MDA0CisJbXZ0YwlyNixjcjAKKwk7OyBzdWJ0cmFjdAorCWxkaQlyMTAsI1x4CisJbGRpCXIxMSwjXHkKKwlzdWIJcjEwLCByMTEKKwk7OyB2ZXJpZnkgcmVzdWx0CisJbGRpCXIxMiwgI1xyCisJY21wZXEJcjEwLCByMTIKKwlicmYwdAkxZgorCWxkaQlyNiwgMQorCWxkaQlyMiwgI1xzCisJdHJhcAkxNQorMToKKwk7OyB2ZXJpZnkgY2FycnkKKwltdmZjCXI2LCBjcjAKKwlhbmQzCXI2LCByNiwgIzEKKwljbXBlcWkJcjYsICNcYworCWJyZjB0CTFmCisJbGRpCXI2LCAxCisJbGRpCXIyLCAjXHMKKwl0cmFwCTE1CisxOgorCS5lbmRtCisKK2NoZWNrX3N1YiAxIDB4MDAwMCAweDAwMDAgIDB4MDAwMCAgMQorY2hlY2tfc3ViIDIgMHgwMDAwIDB4MDAwMSAgMHhmZmZmICAwCitjaGVja19zdWIgMyAweDAwMDEgMHgwMDAwICAweDAwMDEgIDEKK2NoZWNrX3N1YiA0IDB4MDAwMSAweDAwMDEgIDB4MDAwMCAgMQorY2hlY2tfc3ViIDUgMHgwMDAwIDB4ODAwMCAgMHg4MDAwICAwCitjaGVja19zdWIgNiAweDgwMDAgMHgwMDAxICAweDdmZmYgIDEKK2NoZWNrX3N1YiA3IDB4N2ZmZiAweDdmZmYgIDB4MDAwMCAgMQorCisJZXhpdDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1zdWIydy5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXN1YjJ3LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYxYmJiNwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1zdWIydy5zCkBAIC0wLDAgKzEsNTcgQEAKKy5pbmNsdWRlICJ0LW1hY3Jvcy5pIgorCisJc3RhcnQKKworOzsgIFRoZSBkMTB2IGltcGxlbWVudHMgbmVnYXRlZCBhZGRpdGlvbiBmb3Igc3VidHJhY3Rpb24KKworCS5tYWNybyBjaGVja19zdWIydyBzIHggeSByIGMgdgorCQorCTs7IGNsZWFyIGNhcnJ5CisJbGRpCXI2LCMweDgwMDQKKwltdnRjCXI2LGNyMAorCQorCTs7IGxvYWQgb3BuZHMKKwlsZDJ3CXI2LCBAKDFmLHIwKQorCWxkMncJcjgsIEAoMmYscjApCisJLmRhdGEKKzE6CS5sb25nCVx4CisyOgkubG9uZwlceQorCS50ZXh0CisJCisJOzsgc3VidHJhY3QKKwlTVUIyVwlyNiwgcjgKKwkKKwk7OyB2ZXJpZnkgcmVzdWx0CisJbGQydwlyMTAsIEAoMWYscjApCisJLmRhdGEKKzE6CS5sb25nCVxyCisJLnRleHQKKwljbXBlcQlyNiwgcjEwCisJYnJmMGYJMmYKKwljbXBlcQlyNywgcjExCisJYnJmMHQJM2YKKzI6CWxkaQlyNCwgMQorCWxkaQlyMCwgXHMKKwl0cmFwCTE1CiszOgorCQorCTs7IHZlcmlmeSBjYXJyeQorCW12ZmMJcjYsIGNyMAorCWFuZDMJcjYsIHI2LCAjMQorCWNtcGVxaQlyNiwgI1xjCisJYnJmMHQJMWYKKwlsZGkJcjQsIDEKKwlsZGkJcjAsIFxzCisJdHJhcAkxNQorMToKKwkuZW5kbQorCQorY2hlY2tfc3ViMncgMSAweDAwMDAwMDAwIDB4MDAwMDAwMDAgIDB4MDAwMDAwMDAgMSAwCitjaGVja19zdWIydyAyIDB4MDAwMDAwMDAgMHgwMDAwMDAwMSAgMHhmZmZmZmZmZiAwIDAKK2NoZWNrX3N1YjJ3IDMgMHgwMDAwMDAwMSAweDAwMDAwMDAwICAweDAwMDAwMDAxIDEgMAorY2hlY2tfc3ViMncgMyAweDAwMDAwMDAxIDB4MDAwMDAwMDEgIDB4MDAwMDAwMDAgMSAwCitjaGVja19zdWIydyA1IDB4MDAwMDAwMDAgMHg4MDAwMDAwMCAgMHg4MDAwMDAwMCAwIDEKK2NoZWNrX3N1YjJ3IDYgMHg4MDAwMDAwMCAweDAwMDAwMDAxICAweDdmZmZmZmZmIDEgMQorY2hlY2tfc3ViMncgNyAweDdmZmZmZmZmIDB4N2ZmZmZmZmYgIDB4MDAwMDAwMDAgMSAwCisKKwlleGl0MApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXN1YmkucyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1zdWJpLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmYWFkNQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDEwdi1lbGYvdC1zdWJpLnMKQEAgLTAsMCArMSwzOSBAQAorLmluY2x1ZGUgInQtbWFjcm9zLmkiCisKKwlzdGFydAorCis7OyAgVGhlIGQxMHYgaW1wbGVtZW50cyBuZWdhdGVkIGFkZGl0aW9uIGZvciBzdWJ0cmFjdGlvbgorCisJLm1hY3JvIGNoZWNrX3N1YmkgcyB4IHkgciBjIHYKKwk7OyBjbGVhciBjYXJyeQorCWxkaQlyNiwjMHg4MDA0CisJbXZ0YwlyNixjcjAKKwk7OyBzdWJ0cmFjdAorCWxkaQlyMTAsI1x4CisJU1VCSQlyMTAsI1x5CisJOzsgdmVyaWZ5IHJlc3VsdAorCWxkaQlyMTEsICNccgorCWNtcGVxCXIxMCwgcjExCisJYnJmMHQJMWYKKwlsZGkJcjYsIDEKKwlsZGkJcjIsIFxzCisJdHJhcAkxNQorMToKKwk7OyB2ZXJpZnkgY2FycnkKKwltdmZjCXI2LCBjcjAKKwlhbmQzCXI2LCByNiwgIzEKKwljbXBlcWkJcjYsICNcYworCWJyZjB0CTFmCisJbGRpCXI2LCAxCisJbGRpCXIyLCBccworCXRyYXAJMTUKKzE6CisJLmVuZG0KKworCWNoZWNrX3N1YmkgMSAwMDAwICAweDAwMDAgIDB4ZmZmMCAwMCA7OyAgMCAtIDB4MTAKKwljaGVja19zdWJpIDIgMHgwMDAwICAweDAwMDEgIDB4ZmZmZiAwIDAKKwljaGVja19zdWJpIDMgMHgwMDAxICAweDAwMDAgIDB4ZmZmMSAwIDAKKwljaGVja19zdWJpIDQgMHgwMDAxICAweDAwMDEgIDB4MDAwMCAxIDAKKwljaGVja19zdWJpIDUgMHg4MDAwICAweDAwMDEgIDB4N2ZmZiAxIDEKKworCWV4aXQwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QxMHYtZWxmL3QtdHJhcC5zIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXRyYXAucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWM0YWUwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMTB2LWVsZi90LXRyYXAucwpAQCAtMCwwICsxLDUgQEAKKy5pbmNsdWRlICJ0LW1hY3Jvcy5pIgorCisJc3RhcnQKKworCWV4aXQ0NwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9DaGFuZ2VMb2cgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDgzNjlmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9DaGFuZ2VMb2cKQEAgLTAsMCArMSw2MCBAQAorMTk5OS0wMS0xMiAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZG8tZmxhZ3MuUzogQWRkZWQgb25lIG9sZCwgb25lIG5ldyByZWdyZXNzaW9uIHRlc3QuCisKKzE5OTktMDEtMTEgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGRvLWZsYWdzLlM6IE5ldyB0ZXN0IGZvciBwYXJhbGxlbCBQU1cgdXBkYXRlIGNvbmZsaWN0cy4KKwkqIE1ha2VmaWxlLmluIChURVNUUyk6IFJ1biBpdC4KKworMTk5OS0wMS0wNyAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZG8tMndvcmRvcHMuUzogTmV3IHRlc3QgZm9yIHNpZ24tZXh0ZW5zaW9uIGJ5IGxkMmguCisKKzE5OTgtMTItMDggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGRvLTJ3b3Jkb3BzLlM6IE5ldyB0ZXN0IGZvciBkb3VibGUtd29yZCBsb2FkLWxpa2Ugb3BlcmF0aW9ucy4KKworMTk5OC0xMi0wNCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZG8tc2hpZnRzLlM6IFVwZGF0ZSBhbiBvbGRlciB0ZXN0IGNhc2UuCisKKzE5OTgtMTItMDMgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGRvLXNoaWZ0cy5TOiBOZXcgdGVzdCBmb3IgbW9yZSBTUkMgc2hpZnQgY291bnRzLiAKKworMTk5OC0xMS0yMiAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogZG8tc2hpZnRzLlM6IE5ldyB0ZXN0IGZvciBsYXJnZSBTUkMgc2hpZnQgY291bnRzLgorCisxOTk4LTExLTEyICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgorCisJKiBici1kanNyLlM6IE5ldyB0ZXN0IGZvciBuZXcgUjYyLXVwZGF0ZSB0aW1pbmcuCisKKzE5OTgtMTEtMDYgIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIGRvLXNoaWZ0cy5TOiBBZGQgdGVzdCBmb3IgbGFyZ2UgbXZmYWNjIHNoaWZ0cy4KKworVHVlIE9jdCAxMyAxMDo1NDo1MSBFRFQgMTk5OCBGcmFuayBDaC4gRWlnbGVyIDxmY2hlQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChURVNUUyk6IEFkZGVkIGRvLXNoaWZ0cyB0ZXN0IGNhc2UuCisJKiBkby1zaGlmdHMuUzogTmV3IGZpbGUuCisKK1dlZCBBcHIgMjkgMTI6NDk6MDAgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KKworCSogbHMtbW9kYWRkci5TOiBOZXcgdGVzdCBmb3IgbW9kdWxhciBhZGRyZXNzaW5nLgorCSogTWFrZWZpbGUuaW46IFJ1biBpdC4KKworV2VkIFNlcCAgMyAxNDozMzozNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluICguUy5ydW4pOiBSZXBsYWNlIC5kMzB2IHdpdGggLnJ1bi4KKworV2VkIEFwciAgMiAxNDoxMDo0MyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKC5kMzB2LmtvKTogTGltaXQgdGhlIGNwdSB0aW1lIHRvIDUgc2Vjb25kcy4KKworV2VkIE1hciAyNiAxMToxMzo0MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKC5kMzB2LmtvKTogRGlzYWJsZSB0aGUgc2hlbGwncyBleGl0LW9uLWVycm9yIHdoaWNoCisgCWlzIGVuYWJsZWQgYnkgQlNEIHN0eWxlIG1ha2UuCisKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvTWFrZWZpbGUuaW4gYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMTdmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsMjE3IEBACisjIE1ha2VmaWxlIGZvciByZWdyZXNzaW9uIHRlc3RpbmcgdGhlIEdOVSBkZWJ1Z2dlci4KKyMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworIyBHREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIEdEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworVlBBVEggPSBAc3JjZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3NyY3Jvb3QgPSAkKHNyY2RpcikvLi4KKworcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorCitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorYnVpbGRfY2Fub25pY2FsID0gQGJ1aWxkQAoraG9zdF9jYW5vbmljYWwgPSBAaG9zdEAKK3RhcmdldF9jYW5vbmljYWwgPSBAdGFyZ2V0QAordGFyZ2V0X2NwdSA9IEB0YXJnZXRfY3B1QAorCisKK1NIRUxMID0gL2Jpbi9zaAorU1VCRElSUyA9IEBzdWJkaXJzQAorUlBBVEhfRU5WVkFSID0gQFJQQVRIX0VOVlZBUkAKKworRVhQRUNUID0gYGlmIFsgLWYgJCR7cm9vdG1lfS8uLi8uLi9leHBlY3QvZXhwZWN0IF0gOyB0aGVuIFwKKyAgICAgICAgICBlY2hvICQke3Jvb3RtZX0vLi4vLi4vZXhwZWN0L2V4cGVjdCA7IFwKKyAgICAgICAgICBlbHNlIGVjaG8gZXhwZWN0IDsgZmlgCisKK1JVTlRFU1QgPSAkKFJVTlRFU1RfRk9SX1RBUkdFVCkKKworUlVOVEVTVEZMQUdTID0KKworUlVOVEVTVF9GT1JfVEFSR0VUID0gYFwKKyAgaWYgWyAtZiAkJHtzcmNkaXJ9Ly4uLy4uLy4uL2RlamFnbnUvcnVudGVzdCBdOyB0aGVuIFwKKyAgICBlY2hvICQke3NyY2Rpcn0vLi4vLi4vLi4vZGVqYWdudS9ydW50ZXN0OyBcCisgIGVsc2UgXAorICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdOyB0aGVuIFwKKyAgICAgIGVjaG8gcnVudGVzdDsgXAorICAgIGVsc2UgXAorICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gcnVudGVzdCB8IHNlZCAtZSAnJyAkJHQ7IFwKKyAgICBmaTsgXAorICBmaWAKKworCitBU19GT1JfVEFSR0VUID0gYFwKKyAgaWYgWyAteCAuLi8uLi8uLi9nYXMvYXMtbmV3IF07IHRoZW4gXAorICAgIGVjaG8gLi4vLi4vLi4vZ2FzL2FzLW5ldyA7IFwKKyAgZWxzZSBcCisgICAgZWNobyAkKHRhcmdldF9hbGlhcyktYXMgOyBcCisgIGZpYAorCitMRF9GT1JfVEFSR0VUID0gYFwKKyAgaWYgWyAteCAuLi8uLi8uLi9sZC9sZC1uZXcgXTsgdGhlbiBcCisgICAgZWNobyAuLi8uLi8uLi9sZC9sZC1uZXcgOyBcCisgIGVsc2UgXAorICAgIGVjaG8gJCh0YXJnZXRfYWxpYXMpLWxkIDsgXAorICBmaWAKKworUlVOX0ZPUl9UQVJHRVQgPSBgXAorICBpZiBbIC14IC4uLy4uLy4uL3NpbS8ke3RhcmdldF9jcHV9L3J1biBdOyB0aGVuIFwKKyAgICBlY2hvIC4uLy4uLy4uL3NpbS8ke3RhcmdldF9jcHV9L3J1biA7IFwKKyAgZWxzZSBcCisgICAgZWNobyAkKHRhcmdldF9hbGlhcyktcnVuIDsgXAorICBmaWAKKworVEVTVFMgPSBcCisJZW0tZTAub2sgXAorCWVtLWU0Ny5rbyBcCisJZW0tcHN0ci5oaSBcCisJZW0tcGNoci5oaSBcCisJXAorCWxzLWxkMmgua28gXAorCWxzLWxkMncua28gXAorCWxzLWxkNGJoLmtvIFwKKwlscy1sZDRiaHUua28gXAorCWxzLWxkYi5rbyBcCisJbHMtbGRidS5rbyBcCisJbHMtbGRoLmtvIFwKKwlscy1sZGhoLmtvIFwKKwlscy1sZGh1LmtvIFwKKwlscy1sZHcua28gXAorCWxzLW1vZGRlYy5rbyBcCisJbHMtbW9kaW5jLmtvIFwKKwlscy1tb2RhZGRyLm9rIFwKKwlscy1zdDJoLmhpIFwKKwlscy1zdDJ3LmhpIFwKKwlscy1zdDRoYi5oaSBcCisJbHMtc3RiLmhpIFwKKwlscy1zdGguaGkgXAorCWxzLXN0aGguaGkgXAorCWxzLXN0dy5oaSBcCisJXAorCWJyLWJyYS5vayBcCisJYnItYnJhdG56Lm9rIFwKKwlici1icmF0enIub2sgXAorCWJyLWJzci5vayBcCisJYnItZGJyYS5rbyBcCisJYnItZGptcC5rbyBcCisJYnItZGpzci5vayBcCisJXAorCW9zLWRidC5vayBcCisJZG8tZmxhZ3Mub2sgXAorCWRvLXNoaWZ0cy5vayBcCisJZG8tMndvcmRvcHMub2sgXAorCVwKKwl0cmFwLm9rCisKK2NoZWNrOiBzYW5pdHkgJChURVNUUykKK3Nhbml0eToKKwlAZXZhbCBlY2hvIEFTX0ZPUl9UQVJHRVQgPSAkKEFTX0ZPUl9UQVJHRVQpCisJQGV2YWwgZWNobyBMRF9GT1JfVEFSR0VUID0gJChMRF9GT1JfVEFSR0VUKQorCUBldmFsIGVjaG8gUlVOX0ZPUl9UQVJHRVQgPSAkKFJVTl9GT1JfVEFSR0VUKQorCisKKworIyBSdWxlcyBmb3IgcnVubmluZyBhbGwgdGhlIHRlc3RzLCBwdXQgaW50byB0aHJlZSB0eXBlcworIyBleGl0IHN1Y2Nlc3MsIGV4aXQgZmFpbCwgcHJpbnQgIkhlbGxvIFdvcmxkIgorCisudS5sb2c6CisJdXVkZWNvZGUgJCoudQorCSQoUlVOX0ZPUl9UQVJHRVQpICQqID4gJCoubG9nCisKKworIyBSdWxlcyBmb3IgcnVubmluZyB0aGUgdGVzdHMKKworLlNVRkZJWEVTOiAudSAub2sgLnJ1biAuaGkgLmtvCisucnVuLm9rOgorCXJtIC1mIHRtcC0kKiAkKi5oaQorCXVsaW1pdCAtdCA1IDsgJChSVU5fRk9SX1RBUkdFVCkgJCoucnVuID4gdG1wLSQqCisJbXYgdG1wLSQqICQqLm9rCisucnVuLmhpOgorCXJtIC1mIHRtcC0kKiAkKi5oaSBkaWZmLSQqCisJdWxpbWl0IC10IDUgOyAkKFJVTl9GT1JfVEFSR0VUKSAkKi5ydW4gPiB0bXAtJCoKKwllY2hvICJIZWxsbyBXb3JsZCIgfCBkaWZmIC0gdG1wLSQqID4gZGlmZi0kKgorCWNhdCB0bXAtJCogZGlmZi0kKiA+ICQqLmhpCisucnVuLmtvOgorCXJtIC1mIHRtcC0kKiAkKi5rbworCXNldCArZSA7IFwKKwl1bGltaXQgLXQgNSA7ICQoUlVOX0ZPUl9UQVJHRVQpICQqLnJ1biA+IHRtcC0kKiA7IFwKKwlpZiBbICQkPyAtZXEgNDcgXSA7IHRoZW4gXAorCSAgZXhpdCAwIDsgXAorCWVsc2UgXAorCSAgZXhpdCAxIDsgXAorCWZpCisJbXYgdG1wLSQqICQqLmtvCisKKworIyBSdWxlcyBmb3IgYnVpbGRpbmcgYWxsIHRoZSB0ZXN0cyBhbmQgcGFja2luZyB0aGVtIGludG8KKyMgdXVlbmNvZGVkIGZpbGVzLgorCit1dWVuY29kZTogZW0tcHN0ci51IGVtLWUwLnUgZW0tZTQ3LnUgZW0tcGNoci51CisKKy5TVUZGSVhFUzogLnUgLlMgLnJ1bgorLlMudToKKwlybSAtZiAkKi5vICQqLnJ1bgorCSQoQVNfRk9SX1RBUkdFVCkgJChzcmNkaXIpLyQqLlMgLW8gJCoubworCSQoTERfRk9SX1RBUkdFVCkgLW8gJCogJCoubworCXV1ZW5jb2RlIDwgJCogJCogPiAkKi51CisJcm0gLWYgJCoubyAkKgorLlMucnVuOgorCXJtIC1mICQqLm8gJCoucnVuCisJJChBU19GT1JfVEFSR0VUKSAkKHNyY2RpcikvJCouUyAtbyAkKi5vCisJJChMRF9GT1JfVEFSR0VUKSAtbyAkKi5ydW4gJCoubworCXJtIC1mICQqLm8gJCoKKworCisKKyMKKyMgU3RhbmRhcmQKKyMKK2NsZWFuIG1vc3RseWNsZWFuOgorCS1ybSAtZiAqfiBjb3JlICoubyBhLm91dCAqLnggKi5ncnQKKwlybSAtZiAkKFRFU1RTKQorIwlpZiBbIHgiJHtTVUJESVJTfSIgIT0geCBdIDsgdGhlbiBcCisjCSAgICBmb3IgZGlyIGluICR7U1VCRElSU307IFwKKyMJICAgIGRvIFwKKyMJCSAgICBlY2hvICIkJGRpcjoiOyBcCisjCQkgICAgaWYgWyAtZCAkJGRpciBdOyB0aGVuIFwKKyMJCQkgICAgKGNkICQkZGlyOyAkKE1BS0UpIGNsZWFuKTsgXAorIwkJICAgIGZpOyBcCisjCSAgICBkb25lIDsgXAorIwllbHNlIHRydWU7IGZpCisKK2Rpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogY2xlYW4KKwktcm0gLWYgKn4gY29yZQorCS1ybSAtZiBNYWtlZmlsZSBjb25maWcuc3RhdHVzICotaW5pdC5leHAKKwktcm0gLWZyICoubG9nIHN1bW1hcnkgZGV0YWlsICoucGxvZyAqLnN1bSAqLnBzdW0gc2l0ZS4qCisjCWlmIFsgeCIke1NVQkRJUlN9IiAhPSB4IF0gOyB0aGVuIFwKKyMJICAgIGZvciBkaXIgaW4gJHtTVUJESVJTfTsgXAorIwkgICAgZG8gXAorIwkJICAgIGVjaG8gIiQkZGlyOiI7IFwKKyMJCSAgICBpZiBbIC1kICQkZGlyIF07IHRoZW4gXAorIwkJCSAgICAoY2QgJCRkaXI7ICQoTUFLRSkgZGlzdGNsZWFuKTsgXAorIwkJICAgIGZpOyBcCisjCSAgICBkb25lIDsgXAorIwllbHNlIHRydWU7IGZpCisKK01ha2VmaWxlIDogTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cworCSQoU0hFTEwpIGNvbmZpZy5zdGF0dXMKKworY29uZmlnLnN0YXR1czogY29uZmlndXJlCisJJChTSEVMTCkgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvYnItYnJhLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWJyYS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NThiODIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWJyYS5TCkBAIC0wLDAgKzEsMTIgQEAKKwlhZGQgcjMsIHIwLCBkZXN0MQorCXN1YiByMywgcjMsIG9mZjEKK29mZjE6CisJYnJhIHIzCisKKwkuYWxpZ24gNAorZGVzdDE6CQorCWJyYSBkZXN0MgorCisJLmFsaWduIDUKK2Rlc3QyOgkKKwkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWJyYXRuei5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9ici1icmF0bnouUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWEwNDhhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9ici1icmF0bnouUwpAQCAtMCwwICsxLDEyIEBACisJYWRkIHIzLCByMCwgZGVzdDEKKwlzdWIgcjMsIHIzLCBvZmYxCitvZmYxOgorCWJyYXRueiByMywgcjMKKworCS5hbGlnbiA0CitkZXN0MToJCisJYnJhdG56IHIwLCBkZXN0MgorCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKKworCS5hbGlnbiA1CitkZXN0MjoJCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWJyYXR6ci5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9ici1icmF0enIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODMzMzZlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9ici1icmF0enIuUwpAQCAtMCwwICsxLDEyIEBACisJYWRkIHIzLCByMCwgZGVzdDEKKwlzdWIgcjMsIHIzLCBvZmYxCitvZmYxOgorCWJyYXR6ciByMiwgcjMKKworCS5hbGlnbiA0CitkZXN0MToJCisJYnJhdHpyIHIzLCBkZXN0MgorCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKKworCS5hbGlnbiA1CitkZXN0MjoJCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWJzci5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9ici1ic3IuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjI5Zjk3Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9ici1ic3IuUwpAQCAtMCwwICsxLDEyIEBACisJIyB2ZXJpZnkgdGhhdCB0aGUgcmV0dXJuIGFkZHJlc3MgaXMgc2V0IGNvcnJlY3RseQorCWFkZCByMiwgcjAsIDEKKwlhZGQgcjMsIHIwLCBkZXN0MQorCXN1YiByMywgcjMsIG9mZjEKK29mZjE6CisJYnNyIHIzIHx8IG5vcAorcmV0MToKKworCS5hbGlnbiA1CitkZXN0MToJCisJc3ViIHIyLCByNjIsIHJldDEKKwkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWRicmEuUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvYnItZGJyYS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4N2M1OWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWRicmEuUwpAQCAtMCwwICsxLDgzIEBACisjIHBlcmZvcm0gYSBkZWxheWVkIGJyYW5jaCA0NyBpbnN0cnVjdGlvbnMgbGF0ZXIKKwlhZGQgcjMsIHIwLCA0NworCXNybCByMywgcjMsIC0zCisJZGJyYSByMywgZGVzdAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCisuYWxpZ24gNAorZGVzdDoJCisJLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9ici1kam1wLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWRqbXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWFmOTk2Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9ici1kam1wLlMKQEAgLTAsMCArMSw4MyBAQAorIyBwZXJmb3JtIGEgZGVsYXllZCBqdW1wIDQ3IGluc3RydWN0aW9ucyBsYXRlcgorCWFkZCByMywgcjAsIGluc240NworCWRqbXAgcjMsIGRlc3QKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKK2luc240NzogIyBhY3R1YWxseSA0NQorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCisuYWxpZ24gNAorZGVzdDoJCisJLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9ici1kanNyLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2JyLWRqc3IuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2Q0N2QyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9ici1kanNyLlMKQEAgLTAsMCArMSw3OSBAQAorICAgICAgICAjIFRlc3QgbWFjcm8KKworICAgICAgICAubWFjcm8gYXNzZXJ0IHJlZyx2YWx1ZQorICAgICAgICBjbXBlcSBmMCxccmVnLFx2YWx1ZQorICAgICAgICBicmEvZnggZmFpbAorICAgICAgICAuZW5kbQorCisJCisJIyBQUiAxODIzMAorCQorCWFkZCAgcjYyLHIwLDB4ZmZmZmZmZmYgfHwgbm9wCisJYWRkICByMSxyMCwyNCB8fCBub3AKKwlkanNyIHIxLHRlc3RfZW5kCisJYWRkICByMixyMCxyNjIKK3Rlc3RfZW5kOglub3AKKwkKKwlhc3NlcnQgcjIsIDB4MDAwMDAwMzAKKwlhc3NlcnQgcjYyLCAweDAwMDAwMDMwCisKKwkJCQorIyBjaGVjayByZXR1cm4gYWRkcmVzcyBjb3JyZWN0bHkgc2V0IGJ5IGEgZGpzciBpbnNuCisKKwlhZGQgcjMsIHIwLCBsYXN0CisJc3ViIHIzLCByMywgc3RhcnQKK3N0YXJ0OgkKKwlkanNyIHIzLCBkZXN0CisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorbGFzdDoKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorbmV4dGk6CQorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisJYWRkIHIyLCByMiwgMSB8fCBub3AKKwlhZGQgcjIsIHIyLCAxIHx8IG5vcAorCWFkZCByMiwgcjIsIDEgfHwgbm9wCisKKy5hbGlnbiA0CitkZXN0OgorCisJYXNzZXJ0IHI2MixuZXh0aQorCisKKworCSMgYWxsIG9rYXkKKwlicmEgb2sKKwkJCitvazoKKyAgICAgICAgYWRkIHIyLCByMCwgMAorICAgICAgICAubG9uZyAweDBlMDAwMDA0CisgICAgICAgIG5vcAorCitmYWlsOgorICAgICAgICBhZGQgcjIsIHIwLCA0NworICAgICAgICAubG9uZyAweDBlMDAwMDA0CisgICAgICAgIG5vcApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9jb25maWd1cmUgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NDUxOGEwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9jb25maWd1cmUKQEAgLTAsMCArMSw4MzMgQEAKKyMhIC9iaW4vc2gKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTAgCisjIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworIyBEZWZhdWx0czoKK2FjX2hlbHA9CithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCisjIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46CisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMCIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KKyMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCisjIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT1NYWtlZmlsZS5pbgorCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworCitpZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KKyAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKyAgICBhY19uPSBhY19jPScKKycgYWNfdD0nCScKKyAgZWxzZQorICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKyAgZmkKK2Vsc2UKKyAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CitmaQorCisKKworQ0M9JHtDQy1jY30KKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworCisjIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KKyMgVGhlIGlucHV0cyBhcmU6CisjICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKKyMKKyMgVGhlIHJ1bGVzIGFyZToKKyMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCisjICAgIHNhbWUgdGltZS4KKyMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCisjIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKKyMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCisjIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCisjIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgorCisjIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCisjIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCitjYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KK05PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKKyopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KK2lmICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKK2Vsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKKworaG9zdF9hbGlhcz0kaG9zdAorY2FzZSAiJGhvc3RfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkKKyAgICBpZiBob3N0X2FsaWFzPWAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6CisgICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkgOzsKKyAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworaG9zdD1gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCitob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXCguKlwpLVwoLipcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXCguKlwpLVwoLipcKS1cKC4qXCkkL1wyLydgCitob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKC4qXCktXCguKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkaG9zdCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorCit0YXJnZXRfYWxpYXM9JHRhcmdldAorY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCit0YXJnZXQ9YCRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCit0YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoLipcKS1cKC4qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKC4qXCktXCguKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKC4qXCktXCguKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKKworYnVpbGRfYWxpYXM9JGJ1aWxkCitjYXNlICIkYnVpbGRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2J1aWxkPWAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCitidWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKC4qXCktXCguKlwpLVwoLipcKSQvXDEvJ2AKK2J1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoLipcKS1cKC4qXCktXCguKlwpJC9cMi8nYAorYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKC4qXCktXCguKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKKwordGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgorICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCisgICAgTk9ORU5PTkVzLHgseCwgJiYKKyAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQorCisKKworCit0cmFwICcnIDEgMiAxNQorY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCisjIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKKyMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCisjIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKyMKKyMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCisjIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCisjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKyMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCisjIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KKyMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKyMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCitFT0YKKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKyhzZXQpIDI+JjEgfAorICBzZWQgLW4gInMvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPVwke1wxPSdcMid9L3AiIFwKKyAgPj4gY29uZmNhY2hlCitpZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKyMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCitmaQorCit0cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBERUZTLgorIyBQcm90ZWN0IGFnYWluc3Qgc2hlbGwgZXhwYW5zaW9uIHdoaWxlIGV4ZWN1dGluZyBNYWtlZmlsZSBydWxlcy4KKyMgUHJvdGVjdCBhZ2FpbnN0IE1ha2VmaWxlIG1hY3JvIGV4cGFuc2lvbi4KK2NhdCA+IGNvbmZ0ZXN0LmRlZnMgPDxcRU9GCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUtRFwxPVwyJWcKK3MlWyAJYH4jJF4mKigpe31cXHw7JyI8Pj9dJVxcJiVnCitzJVxbJVxcJiVnCitzJVxdJVxcJiVnCitzJVwkJSQkJWcKK0VPRgorREVGUz1gc2VkIC1mIGNvbmZ0ZXN0LmRlZnMgY29uZmRlZnMuaCB8IHRyICdcMDEyJyAnICdgCitybSAtZiBjb25mdGVzdC5kZWZzCisKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEwIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorCit0cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBDQ0AlJENDJWcKK3MlQGhvc3RAJSRob3N0JWcKK3MlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKK3MlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCitzJUBob3N0X29zQCUkaG9zdF9vcyVnCitzJUB0YXJnZXRAJSR0YXJnZXQlZworcyVAdGFyZ2V0X2FsaWFzQCUkdGFyZ2V0X2FsaWFzJWcKK3MlQHRhcmdldF9jcHVAJSR0YXJnZXRfY3B1JWcKK3MlQHRhcmdldF92ZW5kb3JAJSR0YXJnZXRfdmVuZG9yJWcKK3MlQHRhcmdldF9vc0AlJHRhcmdldF9vcyVnCitzJUBidWlsZEAlJGJ1aWxkJWcKK3MlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZworcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKK3MlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCitzJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKKworQ0VPRgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUifQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlLio6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgIyBBZGp1c3QgcmVsYXRpdmUgc3JjZGlyLCBldGMuIGZvciBzdWJkaXJlY3Rvcmllcy4KKworICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgIC4pICBzcmNkaXI9LgorICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgorICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7CisgIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgorICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworICBzZWQgLWUgIiRhY19jb21zdWIKK3MlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCitzJUBzcmNkaXJAJSRzcmNkaXIlZworcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworIiAtZiBjb25mdGVzdC5zdWJzICRhY19naXZlbl9zcmNkaXIvJGFjX2ZpbGVfaW4gPiAkYWNfZmlsZQorZmk7IGRvbmUKK3JtIC1mIGNvbmZ0ZXN0LnN1YnMKKworCisKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2NvbmZpZ3VyZS5pbiBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDM4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDE5IEBACitkbmwgUHJvY2VzcyB0aGlzIGZpbGUgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgorZG5sIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCBmcmFnbWVudCB0aGF0IHN1cHBsaWVzIHRoZSBpbmZvcm1hdGlvbgorZG5sIG5lY2Vzc2FyeSB0byB0YWlsb3IgYSB0ZW1wbGF0ZSBjb25maWd1cmUgc2NyaXB0IGludG8gdGhlIGNvbmZpZ3VyZQorZG5sIHNjcmlwdCBhcHByb3ByaWF0ZSBmb3IgdGhpcyBkaXJlY3RvcnkuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sKK2RubCBhbnkgZXhpc3RpbmcgY29uZmlndXJlIHNjcmlwdC4KKworQUNfUFJFUkVRKDIuNSkKK2RubCBGSVhNRSAtIHRoaW5rIG9mIGEgdHJ1bHkgdW5pcSBmaWxlIHRvIHRoaXMgZGlyZWN0b3J5CitBQ19JTklUKE1ha2VmaWxlLmluKQorCitDQz0ke0NDLWNjfQorQUNfU1VCU1QoQ0MpCitBQ19DT05GSUdfQVVYX0RJUihgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uKQorQUNfQ0FOT05JQ0FMX1NZU1RFTQorCitBQ19TVUJTVCh0YXJnZXRfY3B1KQorCisKK0FDX09VVFBVVChNYWtlZmlsZSkKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZG8tMndvcmRvcHMuUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZG8tMndvcmRvcHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmE5MmU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9kby0yd29yZG9wcy5TCkBAIC0wLDAgKzEsODAgQEAKKwkjIFRlc3QgbWFjcm8KKworCS5tYWNybyBhc3NlcnQgcmVnLHZhbHVlCisJY21wZXEgZjAsXHJlZyxcdmFsdWUKKwlicmEvZnggZmFpbAorCS5lbmRtCisKKwkubWFjcm8gbmFzc2VydCByZWcsdmFsdWUKKwljbXBuZSBmMCxccmVnLFx2YWx1ZQorCWJyYS9meCBmYWlsCisJLmVuZG0KKworCQorCSMgUFIgMTg0NTIgLSBhLnMKKworCWFkZCByMSwgcjAsIDAKKwlhZGQgcjIscjAsMHgxMTIyMzM0NAorCWFkZCByMyxyMCwweDg4OTlhYWJiCisJbm9wICAgfHxtdWx4MmggcjAscjIscjMKKworCWFzc2VydCByMCwgMHgwCisJYXNzZXJ0IHIxLCAweDAKKworCSMgdGVzdCBvdGhlciBkb3VibGUtd29yZCBsb2FkcworCisJYWRkCXIyLHIwLGRhdGEKKwlsZDJ3CXIwLEAocjIsMCkKKwlhc3NlcnQJcjAsIDB4MAorCWFzc2VydAlyMSwgMHgwCisKKwlhZGQJcjIscjAsZGF0YQorCWxkMmgJcjAsQChyMiwwKQorCWFzc2VydAlyMCwgMHgwCisJYXNzZXJ0CXIxLCAweDAKKworCWFkZAlyMixyMCxkYXRhCisJbGQ0YmgJcjAsQChyMiwwKQorCWFzc2VydAlyMCwgMHgwCisJYXNzZXJ0CXIxLCAweDAKKworCWFkZAlyMixyMCxkYXRhCisJbGQ0Ymh1CXIwLEAocjIsMCkKKwlhc3NlcnQJcjAsIDB4MAorCWFzc2VydAlyMSwgMHgwCisKKwkKKwkjIFBSIDE4Njc5IC0gYS5zCisKKwlsZDJoCXIyLCBAKHIwLCBiKQorCWxkMmgJcjQsIEAocjAsIGQpCisJYXNzZXJ0CXIyLCAweDAwMDAxMTExCisJYXNzZXJ0CXIzLCAweGZmZmY4ODk5CisJYXNzZXJ0CXI0LCAweDAwMDAxMTExCisJYXNzZXJ0CXI1LCAweDAwMDAyMjIyCisJCisJCQkJCQorCSMgYWxsIG9rYXkKKworCWJyYQlvaworCitvazoKKwlhZGQgcjIsIHIwLCAwCisJLmxvbmcgMHgwZTAwMDAwNAorCW5vcAorCitmYWlsOgorCWFkZCByMiwgcjAsIDQ3CisJLmxvbmcgMHgwZTAwMDAwNAorCW5vcAorCisJIyBzb21lIG5vbi16ZXJvIGRhdGEKK2RhdGE6CisJLmxvbmcgMHgxMjM0NTY3OAorCS5sb25nIDB4OWFiY2RlZjAKKwkubG9uZyAweGRlYWRiZWVmCisKK2I6CisJLndvcmQgMHgxMTExODg5OSwgMHgwCitkOgorCS53b3JkIDB4MTExMTIyMjIsIDB4MApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9kby1mbGFncy5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9kby1mbGFncy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1Nzk3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2RvLWZsYWdzLlMKQEAgLTAsMCArMSwyNDEgQEAKKwkjIFRlc3QgbWFjcm8KKworCS5tYWNybyBhc3NlcnQgcmVnLHZhbHVlCisJY21wZXEgZjAsXHJlZyxcdmFsdWUKKwlicmEvZnggZmFpbAorCS5lbmRtCisKKworCSMgUFIgMTU5NjQgLSBhLnMKKworCWFkZCAgcjgscjAsMHg3ZmZmN2ZmZiAgICAgICAgIDsKKwlhZGQgIHI5LHIwLDB4NTU1NTU1NTUgICAgICAgICA7CisJYWRkICByMTIscjAsMHgxMTExMTExMSAgICAgICAgIDsKKwlhZGQgIHIxLHIwLDB4ODAwMDAwMTEgICA7IGZvciBwc3cKKwltdnRzeXMgcHN3LHIxIHx8bm9wCisJYWRkaGhoaCByMTIscjgscjkgfHxhZGRobGxsIHIxMyxyMTIscjEyCisJbXZmc3lzIHIyMCxwc3cgICAgICAgICAgICAgIHx8bm9wCisJbXZ0c3lzIHBzdyxyMSB8fCBhZGQgcjIscjgsIHI5CisJbXZmc3lzIHIyMSxwc3cgICAgICAgICAgICAgIHx8bm9wCisKKwlhc3NlcnQgcjIwLCAweDgwMDAwMDAwCisJYXNzZXJ0IHIyMSwgMHg4MDAwMDAxNAorCisJCisJIyBQUiAxNTk2NCAtIGIucworCQorCWFkZCAgcjQwLHIwLDB4N2ZmZmZmZmYKKwlhZGQgIHI0MSxyMCwweDdmZmZmZmZmCisJYWRkICByMSxyMCwweDgwMDAwMDAwICAgICAgIDsgZm9yIHBzdworCW12dHN5cyBwc3cscjEsfHxub3AKKwljbXBlcSBmMSxyNDAscjQxLHx8Y21wZXEgZjAscjQwLHI0MSw7CisJbXZmc3lzIHI0Mixwc3cKKwkKKwlhc3NlcnQgcjQyLCAweDgwMDA1MDAwCisKKwkJCisJIyBQUiAxNjk5MyAtIGEucworCisJYWRkICByOCxyMCwweDgwMDA1NTU1ICA7IGZvciBwc3cKKwlhZGQgIHI5LHIwLDB4ODAwMDAwMDAgIDsgZm9yIHBzdworCWFkZCAgcjQwLHIwLDB4MTExMTExMTEgIDsKKwlhZGQgIHI0MSxyMCwweDIyMjIyMjIyICA7CisJYWRkICByNDIscjAsMHgwMDAwMDAwMCAgOworCW12dHN5cyBwc3cscjggfHxub3AKKwltdnRzeXMgcHN3LHI5IHx8YWRkIHI0MixyNDAscjQxLDsKKworCW12ZnN5cyByMTAscHN3CisJYXNzZXJ0IHIxMCwgMHg4MDAwMDAwMAorCQorCisJIyBQUiAxNjk5NSAtIGIucworCisJYWRkICByOCxyMCwweDgwMDAwMDAwICA7IGZvciBwc3cKKwlhZGQgIHI5LHIwLDB4ODAwMDU1NTUgIDsgZm9yIHBzdworCWFkZCAgcjEwLHIwLDB4MDAwMDAwMDAgIDsKKwlhZGQgIHI0MCxyMCwweDExMTExMTExICA7CisJYWRkICByNDEscjAsMHgyMjIyMjIyMiAgOworCWFkZCAgcjQyLHIwLDB4MDAwMDAwMDAgIDsKKwltdnRzeXMgcHN3LHI4IHx8bm9wCisJbXZ0c3lzIHBzdyxyOSB8fGFkZCByNDIscjQwLHI0MSw7CisKKwltdmZzeXMgcjEwLHBzdworCWFzc2VydCByMTAsIDB4ODAwMDU1NDQKKwkKKworCSMgUFIgMTcwMDYgLSBjLnMKKworCWFkZCAgcjgscjAsMHg4MDAwNTU1NSAgOyBmb3IgcHN3CisJYWRkICByOSxyMCwweDgwMDAwMDAwICA7IGZvciBwc3cKKwlhZGQgIHIxMCxyMCwweDAwMDAwMDAwICA7CisJYWRkICByNDAscjAsMHgwMDAwMDAxMSAgOworCWFkZCAgcjQxLHIwLDB4MDAwMDAwMTEgIDsKKwltdnRzeXMgcHN3LHI4IHx8bm9wCisJbXZ0c3lzIHBzdyxyOSB8fGNtcGVxIGY1LHI0MCxyNDEsOworCQkKKwltdmZzeXMgcjEwLHBzdworCWFzc2VydCByMTAsIDB4ODAwMDAwMTAKKworCisJIyBQUiAxNzAwNiAtIGQucworCisJYWRkICByOSxyMCwweDgwMDAwMDAwICA7IGZvciBwc3cKKwlhZGQgIHI0MCxyMCwweDAwMDAwMDExICA7CisJYWRkICByNDEscjAsMHgwMDAwMDAxMSAgOworCW5vcCAgfHxub3AKKwltdnRzeXMgcHN3LCByOSB8fCBub3AKKwlub3AgIHx8bm9wCisJbm9wIHx8Y21wZXEgZjUscjQwLHI0MSw7CisKKwltdmZzeXMgcjEwLHBzdworCWFzc2VydCByMTAsIDB4ODAwMDAwMTAKKworCQorCSMgUFIgMTcxMDYgLSBhLnMKKworCTsgdGVzdCAwMDAgICAgIDsgIG12dHN5cyhzPTApIHx8IHNhdGhsKHM9MCkgcHJhbGxlbCBleGVjdXRpb24gdGVzdAorCWFkZCAgcjgscjAsMHg4MDAwNTU1NSAgOyBmb3IgcHN3CisJYWRkICByOSxyMCwweDgwMDAwMDAwICA7IGZvciBwc3cKKwlhZGQgIHI0MCxyMCwweDAwMDAwMDQ0ICA7CisJYWRkICByNDEscjAsMHgwMDAwMDAwOCAgOworCW12dHN5cyBwc3cscjggfHxub3AKKwltdnRzeXMgcHN3LHI5IHx8c2F0aGwgcjMwLHI0MCxyNDEsOworCW12ZnN5cyByMjAsIHBzdyB8fG5vcAorCTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJOyB0ZXN0IDAwMSAgICAgOyAgbXZ0c3lzKHM9MCkgfHwgc2F0aGwocz0xKSBwcmFsbGVsIGV4ZWN1dGlvbiB0ZXN0CisJX3Rlc3RfMDAxOgorCWFkZCAgcjQwLHIwLDB4MDAwMDQ0NDQgIDsKKwlhZGQgIHI0MSxyMCwweDAwMDAwMDA4ICA7CisJbXZ0c3lzIHBzdyxyOCB8fG5vcAorCW12dHN5cyBwc3cscjkgfHxzYXRobCByMzEscjQwLHI0MSw7CisJbXZmc3lzIHIyMSxwc3cgfHxub3AKKwk7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCTsgdGVzdCAwMDIgICAgIDsgIG12dHN5cyhzPTEpIHx8IHNhdGhsKHM9MCkgcHJhbGxlbCBleGVjdXRpb24gdGVzdAorCWFkZCAgcjgscjAsMHg4MDAwMDAwMCAgOyBmb3IgcHN3CisJYWRkICByOSxyMCwweDgwMDA1NTU1ICA7IGZvciBwc3cKKwlhZGQgIHI0MCxyMCwweDAwMDAwMDQ0ICA7CisJYWRkICByNDEscjAsMHgwMDAwMDAwOCAgOworCW12dHN5cyBwc3cscjggfHxub3AKKwltdnRzeXMgcHN3LHI5IHx8c2F0aGwgcjMyLHI0MCxyNDEsOworCW12ZnN5cyByMjIscHN3ICAgICAgICAgICAgIHx8bm9wCisJOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwk7IHRlc3QgMDAzICAgICA7ICBtdnRzeXMocz0xKSB8fCBzYXRobChzPTEpIHByYWxsZWwgZXhlY3V0aW9uIHRlc3QKKwk7ICAgaW5pdC1yZWcKKwlhZGQgIHI0MCxyMCwweDAwMDA0NDQ0ICA7CisJYWRkICByNDEscjAsMHgwMDAwMDAwOCAgOworCW12dHN5cyBwc3cscjggfHxub3AKKwltdnRzeXMgcHN3LHI5IHx8c2F0aGwgcjMzLHI0MCxyNDEsOworCW12ZnN5cyByMjMscHN3ICAgICAgICAgICAgIHx8bm9wCisKKwlhc3NlcnQgcjIwLCAweDgwMDAwMDAwCisJYXNzZXJ0IHIyMSwgMHg4MDAwMDA0MAorCWFzc2VydCByMjIsIDB4ODAwMDU1NTUKKwlhc3NlcnQgcjIzLCAweDgwMDA1NTE1CisKKwkKKwkjIFBSIDE4Mjg4IC0gYS5zCisKKwk7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJOyBtdnRzeXMgKEMgPTEsIFY9IFZBID0gMCkgfHwgIGFkZGMgKEM9IFY9IFZBID0wKQorCTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwl0ZXN0XzAwMGI6CisJYWRkIHIxLHIwLDEgICB8fG5vcCAgOyBzZXQgQyBiaXQKKwltdnRzeXMgcHN3IHIwIHx8bm9wCisJbXZ0c3lzIHBzdyByMSB8fGFkZGMgcjIwLHIwLDEgCisJbXZmc3lzIHIxMCxwc3cgfHxub3AKKwk7IEMgY2hhbmdlZCBpbiBNVSBpcyBub3QgdXNlZCBpbiBJVS4KKwk7IElVIHByZXZhaWwgZm9yIHJlc3VsdGluZyBDLiAKKwk7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJOyBtdnRzeXMgKFYgPTEsIEMgPSBWQSA9IDApIHx8ICBhZGQgKEM9IFY9IFZBID0wKQorCTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwl0ZXN0XzAwMWI6CisJYWRkIHIxLHIwLDB4MTAgfHxub3AgIDsgc2V0IFYgYml0CisJbXZ0c3lzIHBzdyByMCB8fG5vcAorCW12dHN5cyBwc3cgcjEgfHxhZGQgcjAscjAscjAKKwltdmZzeXMgcjExLHBzdyB8fG5vcAorCTsgSVUgcHJldmFpbCBmb3IgcmVzdWx0aW5nIFYuCisJOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCTsgbXZ0c3lzIChWID0gQz0gVkEgPSAwKSB8fCAgYWRkIChDPTAsVj0gVkEgPTEpCisJOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCXRlc3RfMDAyYjoKKwlhZGQgcjEscjAsMHg3MDAwMDAwMAorCWFkZCByMixyMCwweDMwMDAwMDAwCisJbXZ0c3lzIHBzdyByMCB8fG5vcAorCW12dHN5cyBwc3cgcjAgfHxhZGQgcjAscjEscjIKKwltdmZzeXMgcjEyLHBzdyB8fG5vcAorCTsgSVUgcHJldmFpbCBmb3IgcmVzdWx0aW5nIFYuIAorCTsgVkEgaXMgc2V0KE9SJ2VkKQorCTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwk7IG12dHN5cyAoQz0gMCBWID0gVkEgPSAxKSB8fCAgYWRkIChDPSBWPSBWQSA9MCkKKwk7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJdGVzdF8wMDNiOgorCWFkZCByMSxyMCwweDE0IHx8bm9wICA7IHNldCBWIGFuZCBWQSBiaXQKKwltdnRzeXMgcHN3IHIwIHx8bm9wCisJbXZ0c3lzIHBzdyByMSB8fGFkZCByMCxyMCxyMAorCW12ZnN5cyByMTMscHN3IHx8bm9wCisJOyBJVSBwcmV2YWlsIGZvciByZXN1bGdpbmcgVgorCTsgVkEgaXMgc2V0KE9SJ2VkKQorCTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwk7IG12dHN5cyAoZjMgPTEpIHx8ICBvcmZnIChmMykgOiBHUk9VUF9CCisJOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCXRlc3RfMDA0YjoKKwlhZGQgcjEscjAsMHgxMDAgOyBzZXQgZjMKKwltdnRzeXMgcHN3IHIwIHx8bm9wCisJbXZ0c3lzIHBzdyxyMSB8fG9yZmcgZjMsZjMsMAorCW12ZnN5cyByMTQscHN3IHx8bm9wCisJOyByZXN1bHRzIG9mIElVIHByZXZhaWwuIAorCTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwk7IG12dHN5cyAoZjQgPTEpIHx8ICBzYXRocCAKKwk7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJdGVzdF8wMDViOgorCWFkZCByMSxyMCwweDQwIDsgc2V0IGY0CisJbXZ0c3lzIHBzdyByMCB8fG5vcAorCW12dHN5cyBwc3cgcjEgfHxzYXRobCByMixyMSwzCisJbXZmc3lzIHIxNSxwc3cgfHxub3AKKwk7IHJlc3VsdHMgb2YgTVUgaXMgdXNlZCBpbiBJVQorCisJYXNzZXJ0IHIyMCwgMHgxCisJYXNzZXJ0IHIxMCwgMHgwCisJYXNzZXJ0IHIxMSwgMHgwCisJYXNzZXJ0IHIxMiwgMHgxNAorCWFzc2VydCByMTMsIDB4NAorCWFzc2VydCByMTQsIDB4MAorCWFzc2VydCByMTUsIDB4MAorCisJCisJIyBQUiAxODI4OCAtIGIucworCWFkZCByNyxyMCwweDgwMDAwMDAwCisJbXZ0c3lzIHBzdyxyNyB8fCBub3AKKwkJCisJYWRkIHI4LHIwLDB4N2ZmZjdmZmYgICAgICAgICA7CisJYWRkIHI5LHIwLDB4NTU1NTU1NTUgICAgICAgICA7CisJYWRkIHIxMixyMCwweDExMTExMTExICAgICAgICAgOworCWFkZCByMTMscjAsMHgwMDAwMDAwMCAgICAgICAgIDsKKwlhZGRoaGhoIHIxMixyOCxyOSB8fGFkZGhsbGwgcjEzLHIxMixyMTIKKwltdmZzeXMgcjYwLHBzdyAgICAgICAgICAgICAgfHxub3AKKwk7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJYWRkIHIyMCxyMCwweDY2NjY2NjY2ICA7CisJYWRkIHIyMSxyMCwweDc3Nzc3Nzc3ICA7CisJYWRkIHI0MCxyMCwweDIyMjIyMjIyICA7CisJYWRkIHI0MSxyMCwweDU1NTU1NTU1ICA7CisJYWRkIHIyMixyMjAscjIxIHx8YWRkIHI0MixyNDAscjQxLDsKKwltdmZzeXMgcjYxLHBzdyAgICAgICAgICAgICAgfHxub3AKKworCWFzc2VydCByNjAsIDB4ODAwMDAwMDAKKwlhc3NlcnQgcjYxLCAweDgwMDAwMDAwCisJCisJCQkKKwkJCQkJCQkKKwkjIGFsbCBva2F5CisKKwlicmEJb2sKKworb2s6CisJYWRkIHIyLCByMCwgMAorCS5sb25nIDB4MGUwMDAwMDQKKwlub3AKKworZmFpbDoKKwlhZGQgcjIsIHIwLCA0NworCS5sb25nIDB4MGUwMDAwMDQKKwlub3AKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZG8tc2hpZnRzLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2RvLXNoaWZ0cy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMDEyOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2RvLXNoaWZ0cy5TCkBAIC0wLDAgKzEsMTgyIEBACisJIyBUZXN0IG1hY3JvCisKKwkubWFjcm8gYXNzZXJ0IHJlZyx2YWx1ZQorCWNtcGVxIGYwLFxyZWcsXHZhbHVlCisJYnJhL2Z4IGZhaWwKKwkuZW5kbQorCisKKwkjIFBSIDE0NTgwIC0gYS5zCisKKwlhZGQgIHI4LHIwLDB4MTExMTIyMjIKKwlhZGQgIHI5LHIwLC0zMgorCXNyYSByMSxyOCxyOSAgICAgICAgICAgIHx8bm9wCisJc3JhIHIyLHI4LC0zMiAgICAgICAgICAgfHxub3AKKwlzcmwgcjMscjgscjkgICAgICAgICAgICB8fG5vcAorCXNybCByNCxyOCwtMzIgICAgICAgICAgIHx8bm9wCisKKwlhc3NlcnQgcjEsIDAKKwlhc3NlcnQgcjIsIDAKKwlhc3NlcnQgcjMsIDAKKwlhc3NlcnQgcjQsIDAKKworCisJIyBQUiAxNzI2NiAtIGEucworCisJYWRkIHIyMCwgcjAsIDB4ZmZmZmZmZmYKKwlhZGQgcjIxLCByMCwgMHhmZmZmZmZmZgorCWFkZCByMjIsIHIwLCAweGZmZmZmZmZmCisJYWRkIHIyMywgcjAsIDB4ZmZmZmZmZmYKKwlhZGQgcjEsIHIwLCAweDEyMzQ1Njc4IAorCWFkZCByMiwgcjAsIC0zMworCXNyYWhoIHIyMCwgcjEsIHIyCisJc3JhaGwgcjIxLCByMSwgcjIKKwlzcmxoaCByMjIsIHIxLCByMgorCXNybGhsIHIyMywgcjEsIHIyCisJc3JhIHIyNCwgcjEsIHIyCisJc3JsIHIyNSwgcjEsIHIyCisJcm90IHIyNiwgcjEsIHIyCisKKwlhc3NlcnQgcjIwLCAweGFjZjBmZmZmCisJYXNzZXJ0IHIyMSwgMHhmZmZmYWNmMAorCWFzc2VydCByMjIsIDB4YWNmMGZmZmYKKwlhc3NlcnQgcjIzLCAweGZmZmZhY2YwCisJYXNzZXJ0IHIyNCwgMHgyNDY4YWNmMAorCWFzc2VydCByMjUsIDB4MjQ2OGFjZjAKKwlhc3NlcnQgcjI2LCAweDI0NjhhY2YwCisKKwkKKwkjIFBSIDE3MjY2IC0gYTIucworCisJYWRkIHIyMCwgcjAsIDB4ZmZmZmZmZmYKKwlhZGQgcjIxLCByMCwgMHhmZmZmZmZmZgorCWFkZCByMjIsIHIwLCAweGZmZmZmZmZmCisJYWRkIHIyMywgcjAsIDB4ZmZmZmZmZmYKKwlhZGQgcjEsIHIwLCAweDEyMzQ1Njc4IAorCWFkZCByMiwgcjAsIC0xNworCXNyYTJoIHIyMCwgcjEsIHIyCisJc3JsMmggcjIxLCByMSwgcjIKKwlyb3QyaCByMjIsIHIxLCByMgorCisJYXNzZXJ0IHIyMCwgMHgyNDY4YWNmMAorCWFzc2VydCByMjEsIDB4MjQ2OGFjZjAKKwlhc3NlcnQgcjIyLCAweDI0NjhhY2YwCisKKworCSMgUFIgMTc2ODUgLSBhLnMKKworCWFkZCByMjAscjAscjAKKwlhZGQgcjIxLHIwLHIwCisJYWRkIHIyMixyMCxyMAorCWFkZCByMjMscjAscjAKKwlhZGQgcjI0LHIwLHIwCisJYWRkIHIyNSxyMCxyMAorCWFkZCByMzAscjAscjAKKwlhZGQgcjMxLHIwLHIwCisKKwlhZGQgIHI4LHIwLDB4NTU1NTU1NTUKKwlhZGQgIHI5LHIwLDB4MWYKKwlzcmEgcjIwLHI4LHI5IHx8bm9wCisJc3JsIHIyMSxyOCxyOSB8fG5vcAorCXNyYWhoIHIyMixyOCxyOSB8fG5vcAorCXNyYWhsIHIyMyxyOCxyOSB8fG5vcAorCXNybGhoIHIyNCxyOCxyOSB8fG5vcAorCXNybGhsIHIyNSxyOCxyOSB8fG5vcAorCisJYWRkICByOCxyMCwweDU1NTVhYWFhCisJYWRkICByOSxyMCwweDAwMGZmZmYxCisJc3JhMmggcjMwLHI4LHI5IHx8bm9wCisJc3JsMmggcjMxLHI4LHI5IHx8bm9wCisKKwlhc3NlcnQJcjIwLCAwCisJYXNzZXJ0CXIyMSwgMAorCWFzc2VydAlyMjIsIDAKKwlhc3NlcnQJcjIzLCAwCisJYXNzZXJ0CXIyNCwgMAorCWFzc2VydAlyMjUsIDAKKwlhc3NlcnQJcjMwLCAwCisJYXNzZXJ0CXIzMSwgMAorCisJCisJIyBQUiAxODE5NiAtIGEucworCisJYWRkIHIxLHIwLDB4ZmVkY2JhOTgKKwlhZGQgcjIscjAsMHg3NjU0MzIxMAorCWFkZCByMyxyMCwweDQxICAgICAgICAgICAKKwlhZGQgcjQscjAsMSAgICAgICAgICAgCisJbm9wICAgICAgICAgICAgICAgICAgICAgIHx8IG12dGFjYyBhMCByMSxyMgorCW5vcCAgICAgICAgICAgICAgICAgICAgICB8fCBtdmZhY2MgcjEwLGEwIHIzICAgICAgCisJbm9wICAgICAgICAgICAgICAgICAgICAgIHx8IG12ZmFjYyByMTEsYTAgcjQgICAgICAKKworCWFzc2VydCByMTAsIDB4M2IyYTE5MDgKKwlhc3NlcnQgcjExLCAweDNiMmExOTA4CisKKwkKKwkjIFBSIDE4MzI5IC0gYS5zCisKKwlhZGQgcjEwLHIwLDAgIHx8IGFkZCByMixyMCwtMQorCWFkZCByMTEscjAsMCAgfHwgYWRkIHIxMixyMCwwCisJYWRkIHIxMyxyMCwwICB8fCBhZGQgcjE0LHIwLDAKKwlhZGQgcjE1LHIwLDAgIHx8IGFkZCByMTYscjAsMAorCWFkZCByMTcscjAsMCAgfHwgYWRkIHIxOCxyMCwwCisJCisJYWRkIHIzLHIwLDB4MDAwMDAwMjAgICAgOyAzMgorCXNyYyByMTAscjIscjMKKwlhZGQgcjMscjAsMHgwMDAwMDAyMSAgICA7IDMzCisJc3JjIHIxMSxyMixyMworCWFkZCByMyxyMCwweDAwMDAwMDNmICAgIDsgNjMKKwlzcmMgcjEyLHIyLHIzCisJYWRkIHIzLHIwLDB4MDAwMDAwNDAgICAgOzY0CisJc3JjIHIxMyxyMixyMworCWFkZCByMyxyMCwweDAwMDAwMDQxICAgIDs2NQorCXNyYyByMTQscjIscjMKKwkKKwlhZGQgcjMscjAsMHhmZmZmZmZkZiAgICA7LTMzCisJc3JjIHIxNSxyMixyMworCWFkZCByMyxyMCwweGZmZmZmZmMxICAgIDstNjMKKwlzcmMgcjE2LHIyLHIzCisJYWRkIHIzLHIwLDB4ZmZmZmZmYzAgICAgOy02NAorCXNyYyByMTcscjIscjMKKwlhZGQgcjMscjAsMHhmZmZmZmZiZiAgICA7LTY1CisJc3JjIHIxOCxyMixyMworCQorCWFzc2VydCByMTAsIDB4MDAwMDAwMDAKKwlhc3NlcnQgcjExLCAweDgwMDAwMDAwCisJYXNzZXJ0IHIxMiwgMHhmZmZmZmZmZQorCWFzc2VydCByMTMsIDB4MDAwMDAwMDAKKwlhc3NlcnQgcjE0LCAweDgwMDAwMDAwCisJYXNzZXJ0IHIxNSwgMHgwMDAwMDAwMQorCWFzc2VydCByMTYsIDB4N2ZmZmZmZmYKKwlhc3NlcnQgcjE3LCAweGZmZmZmZmZmCisJYXNzZXJ0IHIxOCwgMHgwMDAwMDAwMQorCisKKwkjIFBSIDE4MzY0IC0gYi5zCisKKwlhZGQgcjEscjAsMHgxMjM0NTY3OAorCWFkZCByMixyMCwweDlhYmNkZWYwCisJYWRkIHIzLHIwLDB4ZmZmZmZmZTAgOyAtMzIKKwlhZGQgcjQscjAsMHhmZmZmZmZjMCA7IC02NAorCXNyYyByMSxyMixyMyB8fG5vcAorCWFkZCByMTAscjEscjAgfHxub3AKKwlhZGQgcjEscjAsMHgxMjM0NTY3OAorCXNyYyByMSxyMixyNCB8fG5vcAorCWFkZCByMTEscjEscjAgfHxub3AKKworCWFzc2VydCByMTAsIDB4OWFiY2RlZjAKKwlhc3NlcnQgcjExLCAweDlhYmNkZWYwCisKKwkJCQkKKwkjIGFsbCBva2F5CisKKwlicmEJb2sKKworb2s6CisJYWRkIHIyLCByMCwgMAorCS5sb25nIDB4MGUwMDAwMDQKKwlub3AKKworZmFpbDoKKwlhZGQgcjIsIHIwLCA0NworCS5sb25nIDB4MGUwMDAwMDQKKwlub3AKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZW0tZTAuUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZW0tZTAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmU5MzM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9lbS1lMC5TCkBAIC0wLDAgKzEsNCBAQAorIyBWZXJpZnkgdGhhdCB0aGUgZXhpdCBjYWxsIHdvcmtzCisJYWRkIHIyLCByMCwgMCB8fCBub3AKKwkubG9uZyAweDBlMDAwMDA0CisJbm9wCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2VtLWU0Ny5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9lbS1lNDcuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODMwZmZiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9lbS1lNDcuUwpAQCAtMCwwICsxLDQgQEAKKyMgVmVyaWZ5IHIyID0gNDc7IGV4aXQocjQ3KSB3b3JrcworCWFkZCByMiwgcjAsIDQ3CisJLmxvbmcgMHgwZTAwMDAwNAorCW5vcApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9lbS1wY2hyLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2VtLXBjaHIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjM4YjBiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9lbS1wY2hyLlMKQEAgLTAsMCArMSwyOCBAQAorCisJYWRkIHIyLCByMCwgJ0gnIAorCS5sb25nIDB4MGUwMDAwMDMsIDB4MDBmMDAwMDAKKwlhZGQgcjIsIHIwLCAnZScKKwkubG9uZyAweDBlMDAwMDAzLCAweDAwZjAwMDAwCisJYWRkIHIyLCByMCwgJ2wnCisJLmxvbmcgMHgwZTAwMDAwMywgMHgwMGYwMDAwMAorCWFkZCByMiwgcjAsICdsJworCS5sb25nIDB4MGUwMDAwMDMsIDB4MDBmMDAwMDAKKwlhZGQgcjIsIHIwLCAnbycKKwkubG9uZyAweDBlMDAwMDAzLCAweDAwZjAwMDAwCisJYWRkIHIyLCByMCwgJyAnCisJLmxvbmcgMHgwZTAwMDAwMywgMHgwMGYwMDAwMAorCWFkZCByMiwgcjAsICdXJworCS5sb25nIDB4MGUwMDAwMDMsIDB4MDBmMDAwMDAKKwlhZGQgcjIsIHIwLCAnbycKKwkubG9uZyAweDBlMDAwMDAzLCAweDAwZjAwMDAwCisJYWRkIHIyLCByMCwgJ3InCisJLmxvbmcgMHgwZTAwMDAwMywgMHgwMGYwMDAwMAorCWFkZCByMiwgcjAsICdsJworCS5sb25nIDB4MGUwMDAwMDMsIDB4MDBmMDAwMDAKKwlhZGQgcjIsIHIwLCAnZCcKKwkubG9uZyAweDBlMDAwMDAzLCAweDAwZjAwMDAwCisJYWRkIHIyLCByMCwgJ1xuJyB8fCBub3AKKwkubG9uZyAweDBlMDAwMDAzLCAweDAwZjAwMDAwCisJIyBmaW5pc2hlZAorCWFkZCByMiwgcjAsIHIwIHx8IG5vcAorCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZW0tcHN0ci5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9lbS1wc3RyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYxMmMzNQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZW0tcHN0ci5TCkBAIC0wLDAgKzEsOCBAQAorCWFkZCByMiwgcjAsIGhlbGxvCisJIyBwdXRzdHIKKwkubG9uZyAweDBlMDAwMDAxLCAweDAwZjAwMDAwCisJIyBmaW5pc2hlZAorCWFkZCByMiwgcjAsIHIwIHx8IG5vcAorCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKKworaGVsbG86CS5hc2NpaSAiSGVsbG8gV29ybGRcbiIKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvZXhpdDQ3LnMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2V4aXQ0Ny5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MzBmZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2V4aXQ0Ny5zCkBAIC0wLDAgKzEsNCBAQAorIyBWZXJpZnkgcjIgPSA0NzsgZXhpdChyNDcpIHdvcmtzCisJYWRkIHIyLCByMCwgNDcKKwkubG9uZyAweDBlMDAwMDA0CisJbm9wCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2hlbGxvLnMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2hlbGxvLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxNjI5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvaGVsbG8ucwpAQCAtMCwwICsxLDkgQEAKKwkKKwlhZGQgcjIsIHIwLCBoZWxsbworCSMgcHV0c3RyCisJLmxvbmcgMHgwZTAwMDAwMSwgMHgwMGYwMDAwMAorCSMgZmluaXNoZWQKKwlhZGQgcjIsIHIwLCByMCB8fCBub3AKKwkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCisKK2hlbGxvOgkuYXNjaWkgIkhlbGxvIFdvcmxkXHJcbiIKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbG9vcC5zIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9sb29wLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmMjY5MgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbG9vcC5zCkBAIC0wLDAgKzEgQEAKK2xvb3A6CWJyYSBsb29wCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLWxkMmguUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGQyaC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZGUxNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLWxkMmguUwpAQCAtMCwwICsxLDExIEBACisJIyBjb21wdXRlIDE3KG1lbSkgKyAzMChtZW0rMikgPSA0NworCWFkZCByMywgcjAsIDQgfHwgbm9wCisJbGQyaCByMiwgQChyMyw2MCkKKwlhZGQgcjIsIHIyLCByMyB8fCBub3AKKwkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCisJLmxvbmcgMCwgMAorCS5sb25nIDAsIDAKKwkubG9uZyAwLCAwCisJLmxvbmcgLTEsIC0xCisjIGFkZHJlc3MgNjQgLSByZW1lbWJlciB0YXJnZXQgaXMgQkUKKwkuYnl0ZSAwLCAxNywgMCwgMzAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGQydy5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZDJ3LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1NjRjYwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGQydy5TCkBAIC0wLDAgKzEsMTIgQEAKKwkjIGNvbXB1dGUgMTcobWVtKSArIDMwKG1lbSs0KSA9IDQ3CisJYWRkIHIzLCByMCwgNCB8fCBub3AKKwlsZDJ3IHIyLCBAKHIzLDYwKQorCWFkZCByMiwgcjIsIHIzIHx8IG5vcAorCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKKwkubG9uZyAwLCAwCisJLmxvbmcgMCwgMAorCS5sb25nIDAsIDAKKwkubG9uZyAtMSwgLTEKKyMgYWRkcmVzcyA2NCAtIHJlbWVtYmVyIHRhcmdldCBpcyBCRQorCS5ieXRlIDAsIDAsIDAsIDE3CisJLmJ5dGUgMCwgMCwgMCwgMzAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGQ0YmguUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGQ0YmguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjIyY2ViCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZDRiaC5TCkBAIC0wLDAgKzEsMTIgQEAKKwkjIGNvbXB1dGUgbG8gOiAxNyhtZW0rMSkgKyAzMChtZW0rMykgPSA0NworCSMgY29tcHV0ZSBoaSA6IC0xKG1lbSkgKyAxKG1lbSsyKSA9IDAJCisJYWRkIHIzLCByMCwgNCB8fCBub3AKKwlsZDRiaCByMiwgQChyMyw2MCkKKwlhZGQgcjIsIHIyLCByMyB8fCBub3AKKwkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCisJLmxvbmcgMCwgMAorCS5sb25nIDAsIDAKKwkubG9uZyAwLCAwCisJLmxvbmcgLTEsIC0xCisjIGFkZHJlc3MgNjQgLSByZW1lbWJlciB0YXJnZXQgaXMgQkUKKwkuYnl0ZSAtMSwgMTcsIDEsIDMwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLWxkNGJodS5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZDRiaHUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDBhOWEzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZDRiaHUuUwpAQCAtMCwwICsxLDExIEBACisJIyBjb21wdXRlIGxvIDogNDgobWVtKzEpICsgMjU1KG1lbSszKSAtIDI1NiA9IDQ3CisJYWRkIHIzLCByMCwgNCB8fCBub3AKKwlsZDRiaHUgcjIsIEAocjMsNjApCisJYWRkIHIyLCByMiwgcjMgfHwgbm9wCisJc3ViIHIyLCByMiwgMHgxMDAKKwkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCisJLmxvbmcgMCwgMAorCS5sb25nIDAsIDAKKwkubG9uZyAtMSwgLTEKKyMgYWRkcmVzcyA2NCAtIHJlbWVtYmVyIHRhcmdldCBpcyBCRQorCS5ieXRlIDAsIDQ4LCAwLCAyNTUKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGRiLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLWxkYi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MTY0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLWxkYi5TCkBAIC0wLDAgKzEsMTEgQEAKKwkjIGNvbXB1dGUgLTIoZnJvbSBtZW0pICsgNDkgPSA0NworCWFkZCByMywgcjAsIDQgfHwgbm9wCisJbGRiIHIyLCBAKHIzLDYwKQorCWFkZCByMiwgcjIsIDQ5CisJLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMAorCS5sb25nIDAsIDAKKwkubG9uZyAwLCAwCisJLmxvbmcgMCwgMAorCS5sb25nIC0xLCAtMQorIyBhZGRyZXNzIDY0IC0gcmVtZW1iZXIgdGFyZ2V0IGlzIEJFCisJLmJ5dGUgLTIsIDB4ZmYsIDB4ZmYsIDB4ZmYKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGRidS5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZGJ1LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzZDZhNAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGRidS5TCkBAIC0wLDAgKzEsMTEgQEAKKwkjIGNvbXB1dGUgMjU0KG1lbSkgLSAyMDcgPSA0NworCWFkZCByMywgcjAsIDQgfHwgbm9wCisJbGRidSByMiwgQChyMyw2MCkKKwlzdWIgcjIsIHIyLCAyMDcKKwkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCisJLmxvbmcgMCwgMAorCS5sb25nIDAsIDAKKwkubG9uZyAwLCAwCisJLmxvbmcgLTEsIC0xCisjIGFkZHJlc3MgNjQgLSByZW1lbWJlciB0YXJnZXQgaXMgQkUKKwkuYnl0ZSAtMiwgMHhmZiwgMHhmZiwgMHhmZgpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZGguUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGRoLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1MGJjMAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGRoLlMKQEAgLTAsMCArMSwxMSBAQAorCSMgbG9hZCB0aGUgNDdAYWRkcj02MCBiZWxvdyBpbnRvIHIyCisJYWRkIHIzLCByMCwgNCB8fCBub3AKKwlsZGggcjIsIEAocjMsNjApCisJLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMAorCS5sb25nIDAsIDAKKwkubG9uZyAwLCAwCisJLmxvbmcgMCwgMAorCS5sb25nIDAsIDAKKwkubG9uZyAtMSwgLTEKKyMgYWRkcmVzcyA2NCAtIHJlbWVtYmVyIHRhcmdldCBpcyBCRQorCS5ieXRlIDAsIDQ3LCAweGZmLCAweGZmCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLWxkaGguUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbGRoaC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NmRhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLWxkaGguUwpAQCAtMCwwICsxLDExIEBACisJIyBjb21wdXRlICg0NyB8fCAwfDE2KSA+PiAxNgorCWFkZCByMywgcjAsIDQgfHwgbm9wCisJbGRoaCByMiwgQChyMyw2MCkKKwlzcmwgcjIsIHIyLCAxNiB8fCBub3AKKwkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCisJLmxvbmcgMCwgMAorCS5sb25nIDAsIDAKKwkubG9uZyAwLCAwCisJLmxvbmcgLTEsIC0xCisjIGFkZHJlc3MgNjQgLSByZW1lbWJlciB0YXJnZXQgaXMgQkUKKwkuYnl0ZSAwLCA0NywgMHhmZiwgMHhmZgpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZGh1LlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLWxkaHUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGY1MGUyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZGh1LlMKQEAgLTAsMCArMSwxMSBAQAorCSMgY29tcHV0ZSAyNTQobWVtKSAtIDIwNyA9IDQ3CisJYWRkIHIzLCByMCwgNCB8fCBub3AKKwlsZGh1IHIyLCBAKHIzLDYwKQorCXN1YiByMiwgcjIsIDIwNworCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKKwkubG9uZyAwLCAwCisJLmxvbmcgMCwgMAorCS5sb25nIDAsIDAKKwkubG9uZyAtMSwgLTEKKyMgYWRkcmVzcyA2NCAtIHJlbWVtYmVyIHRhcmdldCBpcyBCRQorCS5ieXRlIDB4ZmYsIC0yLCAweGZmLCAweGZmCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLWxkdy5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZHcuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGQyZWJmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1sZHcuUwpAQCAtMCwwICsxLDExIEBACisJIyBsb2FkIHRoZSA0N0BhZGRyPTYwIGJlbG93IGludG8gcjIKKwlhZGQgcjMsIHIwLCA0IHx8IG5vcAorCWxkdyByMiwgQChyMyw2MCkKKwkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCisJLmxvbmcgMCwgMAorCS5sb25nIDAsIDAKKwkubG9uZyAwLCAwCisJLmxvbmcgMCwgMAorCS5sb25nIDAsIDAKKyMgYWRkcmVzcyA2NCAtIHJlbWVtYmVyIHRhcmdldCBpcyBCRQorCS5ieXRlIDAsIDAsIDAsIDQ3CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLW1vZGFkZHIuUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbW9kYWRkci5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZDI4YWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLW1vZGFkZHIuUwpAQCAtMCwwICsxLDU2IEBACisJOyBNb2R1bGFyIGFkZHJlc3MgcG9zdGluY3JlbWVudC9wb3N0ZGVjcmVtZW50IHRlc3QKKwkKK3N0YXJ0OgkKKwk7ICBwcm9ncmFtIFBTVyBmb3IgbW9kdWxhciBhZGRyZXNzIG1vZGUKKwlhZGQgIHIxLHIwLDB4ODEwMDAwMDAKKwlub3AgfHwgbm9wCisJbXZ0c3lzIHBzdyxyMSB8fCBub3AKKwlub3AgfHwgbm9wCisJCit0ZXN0MToJCisJOyBzZXQgbW9kdWxhciBhZGRyZXNzIGxpbWl0czogMHgxOCBieXRlcworCWFkZCAgcjEscjAsMHgyMDAwMDA3MCAgICA7IFtzdGFydCwgLi4uCisJbm9wIHx8IG5vcAorCW12dHN5cyBtb2RfcyxyMSB8fCBub3AKKwlub3AgfHwgbm9wCisJYWRkICByMSxyMCwweDIwMDAwMDg4ICAgIDsgLi4uLCBlbmQpCisJbm9wIHx8IG5vcAorCW12dHN5cyBtb2RfZSxyMSB8fCBub3AKKworCTsgbW9kdWxhciBhdXRvaW5jcmVtZW50IHRlc3QKKwlhZGQJcjMwLHIwLDB4MjAwMDAwNzAgOyBiYXNlIGFkZHJlc3MgPSBtb2RfcworCWxkMncJcjQwLEAocjMwKyxyMCkgfHwgbm9wIDsgYWZ0ZXI6ICAgICByMzAgPSAuLi4wNzgKKwlsZDJ3CXI0MCxAKHIzMCsscjApIHx8IG5vcCA7IGFmdGVyOglyMzAgPSAuLi4wODAKKwlsZDJ3CXI0MCxAKHIzMCsscjApIHx8IG5vcCA7IGFmdGVyOglyMzAgPSAuLi4wNzAKKwkKKwlhZGQJcjI5LHIwLDB4MjAwMDAwNzAgOyBleHBlY3RlZCBlbmQgYWRkcmVzczsgd3JhcHBpbmcgYXJvdW5kCisJY21wZXEJZjEscjMwLHIyOQorCWJyYS94ZglmYWlsCisKK3Rlc3QyOgkKKwk7IHNldCBtb2R1bGFyIGFkZHJlc3MgbGltaXRzOiAweDE4IGJ5dGVzCisJYWRkICByMSxyMCwweDIwMDAwMDg4ICAgIDsgW3N0YXJ0LCAuLi4KKwlub3AgfHwgbm9wCisJbXZ0c3lzIG1vZF9zLHIxIHx8IG5vcAorCW5vcCB8fCBub3AKKwlhZGQgIHIxLHIwLDB4MjAwMDAwNzAgICAgOyAuLi4sIGVuZCkKKwlub3AgfHwgbm9wCisJbXZ0c3lzIG1vZF9lLHIxIHx8IG5vcAorCisJOyBtb2R1bGFyIGF1dG9kZWNyZW1lbnQgdGVzdAorCWFkZAlyMzAscjAsMHgyMDAwMDA4OCA7IGJhc2UgYWRkcmVzcyA9IG1vZF9zCisJbGQydwlyNDAsQChyMzAtLHIwKSB8fCBub3AgOyBhZnRlcjogIHIzMCA9IC4uLjA4MAorCWxkMncJcjQwLEAocjMwLSxyMCkgfHwgbm9wIDsgYWZ0ZXI6CXIzMCA9IC4uLjA3OAorCWxkMncJcjQwLEAocjMwLSxyMCkgfHwgbm9wIDsgYWZ0ZXI6CXIzMCA9IC4uLjA4OAorCQorCWFkZAlyMjkscjAsMHgyMDAwMDA4OCA7IGV4cGVjdGVkIGVuZCBhZGRyZXNzOyB3cmFwcGluZyBhcm91bmQKKwljbXBlcQlmMSxyMzAscjI5CisJYnJhL3hmCWZhaWwKKwkKK29rOgkKKwlhZGQJcjIscjAsMAkKKwkubG9uZwkweDBlMDAwMDA0LCAweDAwZjAwMDAwCisJCQorZmFpbDoJCisJYWRkCXIyLHIwLDQ3CQorCS5sb25nCTB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbW9kZGVjLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLW1vZGRlYy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYjkxNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLW1vZGRlYy5TCkBAIC0wLDAgKzEsMyBAQAorCWFkZCByMiwgcjAsIDUwCisJbW9kZGVjIHIyLCAzIHx8IG5vcAorCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtbW9kaW5jLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLW1vZGluYy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMGMzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLW1vZGluYy5TCkBAIC0wLDAgKzEsMyBAQAorCWFkZCByMiwgcjAsIDQwCisJbW9kaW5jIHIyLCA3IHx8IG5vcAorCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtc3QyaC5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1zdDJoLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhjNGIxOQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtc3QyaC5TCkBAIC0wLDAgKzEsMTMgQEAKKwlhZGQgcjIsIHIwLCBoZWxsbworCWFkZCByNCwgcjAsICgnSCcgPDwgOCkgKyAnZScKKwlhZGQgcjUsIHIwLCAoJ2wnIDw8IDgpICsgJ2wnCisJc3QyaCByNCwgQChyMiwwKSB8fCBub3AKKwkjIHB1dHN0cgorCS5sb25nIDB4MGUwMDAwMDEsIDB4MDBmMDAwMDAKKwkjIGZpbmlzaGVkCisJYWRkIHIyLCByMCwgcjAgfHwgbm9wCisJLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMAorCisJLmFsaWduIDMKK2hlbGxvOiAgCisJLmFzY2lpICI/Pz8/byBXb3JsZFxuIgpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1zdDJ3LlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLXN0MncuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2Q4YjY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1zdDJ3LlMKQEAgLTAsMCArMSwxMyBAQAorCWFkZCByMiwgcjAsIGhlbGxvCisJYWRkIHI0LCByMCwgKCdIJyA8PCAyNCkgKyAoJ2UnIDw8IDE2KSArICgnbCcgPDwgOCkgKyAoJ2wnIDw8IDApCisJYWRkIHI1LCByMCwgKCdvJyA8PCAyNCkgKyAoJyAnIDw8IDE2KSArICgnVycgPDwgOCkgKyAoJ28nIDw8IDApCisJc3QydyByNCwgQChyMiwwKSB8fCBub3AKKwkjIHB1dHN0cgorCS5sb25nIDB4MGUwMDAwMDEsIDB4MDBmMDAwMDAKKwkjIGZpbmlzaGVkCisJYWRkIHIyLCByMCwgcjAgfHwgbm9wCisJLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMAorCisJLmFsaWduIDMKK2hlbGxvOiAgCisJLmFzY2lpICI/Pz8/Li4uLnJsZFxuIgpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1zdDRoYi5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1zdDRoYi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmODAyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLXN0NGhiLlMKQEAgLTAsMCArMSwxMyBAQAorCWFkZCByMiwgcjAsIGhlbGxvCisJYWRkIHI0LCByMCwgKCdIJyA8PCAxNikgKyAoJ2UnIDw8IDApCisJYWRkIHI1LCByMCwgKCdsJyA8PCAxNikgKyAoJ2wnIDw8IDApCisJc3Q0aGIgcjQsIEAocjIsMCkgfHwgbm9wCisJIyBwdXRzdHIKKwkubG9uZyAweDBlMDAwMDAxLCAweDAwZjAwMDAwCisJIyBmaW5pc2hlZAorCWFkZCByMiwgcjAsIHIwIHx8IG5vcAorCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKKworCS5hbGlnbiAzCitoZWxsbzogIAorCS5hc2NpaSAiPz8/P28gV29ybGRcbiIKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtc3RiLlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLXN0Yi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMGE4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLXN0Yi5TCkBAIC0wLDAgKzEsMTIgQEAKKwlhZGQgcjIsIHIwLCBoZWxsbworCWFkZCByNCwgcjAsICdIJworCXN0YiByNCwgQChyMiwwKSB8fCBub3AKKwkjIHB1dHN0cgorCS5sb25nIDB4MGUwMDAwMDEsIDB4MDBmMDAwMDAKKwkjIGZpbmlzaGVkCisJYWRkIHIyLCByMCwgcjAgfHwgbm9wCisJLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMAorCisJLmFsaWduIDMKK2hlbGxvOiAgCisJLmFzY2lpICI/ZWxsbyBXb3JsZFxuIgpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1zdGguUyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtc3RoLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyMzY0MAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtc3RoLlMKQEAgLTAsMCArMSwxMiBAQAorCWFkZCByMiwgcjAsIGhlbGxvCisJYWRkIHI0LCByMCwgKCdIJyA8PCA4KSArICgnZScgPDwgMCkKKwlzdGggcjQsIEAocjIsMCkgfHwgbm9wCisJIyBwdXRzdHIKKwkubG9uZyAweDBlMDAwMDAxLCAweDAwZjAwMDAwCisJIyBmaW5pc2hlZAorCWFkZCByMiwgcjAsIHIwIHx8IG5vcAorCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKKworCS5hbGlnbiAzCitoZWxsbzogIAorCS5hc2NpaSAiPz9sbG8gV29ybGRcbiIKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtc3RoaC5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1zdGhoLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcxZjMwOQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvbHMtc3RoaC5TCkBAIC0wLDAgKzEsMTIgQEAKKwlhZGQgcjIsIHIwLCBoZWxsbworCWFkZCByNCwgcjAsICgnSCcgPDwgMjQpICsgKCdlJyA8PCAxNikKKwlzdGhoIHI0LCBAKHIyLDApIHx8IG5vcAorCSMgcHV0c3RyCisJLmxvbmcgMHgwZTAwMDAwMSwgMHgwMGYwMDAwMAorCSMgZmluaXNoZWQKKwlhZGQgcjIsIHIwLCByMCB8fCBub3AKKwkubG9uZyAweDBlMDAwMDA0LCAweDAwZjAwMDAwCisKKwkuYWxpZ24gMworaGVsbG86ICAKKwkuYXNjaWkgIj8/bGxvIFdvcmxkXG4iCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL2xzLXN0dy5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1zdHcuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzE3ZjJhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi9scy1zdHcuUwpAQCAtMCwwICsxLDEyIEBACisJYWRkIHIyLCByMCwgaGVsbG8KKwlhZGQgcjQsIHIwLCAoJ0gnIDw8IDI0KSArICgnZScgPDwgMTYpICsgKCdsJyA8PCA4KSArICgnbCcgPDwgMCkKKwlzdHcgcjQsIEAocjIsMCkgfHwgbm9wCisJIyBwdXRzdHIKKwkubG9uZyAweDBlMDAwMDAxLCAweDAwZjAwMDAwCisJIyBmaW5pc2hlZAorCWFkZCByMiwgcjAsIHIwIHx8IG5vcAorCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKKworCS5hbGlnbiAzCitoZWxsbzogIAorCS5hc2NpaSAiPz8/P28gV29ybGRcbiIKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvb3MtZGJ0LlMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL29zLWRidC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Njg4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL29zLWRidC5TCkBAIC0wLDAgKzEsMzggQEAKKwkuZ2xvYmwgX3N0YXJ0CisJIworCSMgTk9URToJUmVnaXN0ZXJzIHIxMC1yMTEgYXJlIHJlc2VydmVkIGZvciB0aGUgaW50ZXJydXB0IGhhbmRsZXIKKwkjCXdoaWxlIHRoZSBvdGhlcnMgY2FuIGJlIHVzZWQgYnkgdGhlIG1haW4gbG9vcC9zdGFydCBjb2RlLgorCitfc3RhcnQ6CQkKKwkjIHBhdGNoIHRoZSBEQlQgaGFuZGxlcgorCWFkZCByMSwgcjAsIGhhbmRsZXIKKwlsZHcgcjIsIEAocjEsIDApCisJbGR3IHIzLCBAKHIxLCA0KQorCSMgREJUIHZlY3RvciBhZGRyZXNzCisJYWRkIHIxLCByMCwgMHhmZmZmZjEyMAorCXN0dyByMiwgQChyMSwgMCkKKwlzdHcgcjMsIEAocjEsIDQpCisKKwkjIHRyeSBvdXQgdGhlIGJyZWFrcG9pbnQvcmV0dXJuCisJYWRkIHIyLCByMCwgNDcKKwkjZGJ0CisJbm9wCisJLmxvbmcgMHgwMGIwMDAwMAorCW5vcAorCisJIyBleGl0IHdpdGggd2hhdCBldmVyIHRoZSBicmVha3BvaW50IGhhbmRlciBzZXQgcjIgdG8uCisJbm9wCisJLmxvbmcgMHgwZTAwMDAwNAorCW5vcAorCitoYW5kbGVyOgorCWptcCByZWFsX2hhbmRsZXIKKwkKKwkjIFRoZSBCcmVha3BvaW50IGhhbmRsZXIgc2V0cyByMiB0byAwIGlmIFBTVyB3YXMgc2V0IGNvcnJlY3RseS4KK3JlYWxfaGFuZGxlcjoKKwltdmZzeXMgcjIsIGNyMAorCXN1YiByMiwgcjAsIDB4MDgwMDAwMDAKKwkjcnRkCisJbm9wCisJLmxvbmcgMHgwMGEwMDAwMAorCW5vcApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi90aWNrLnMgYi9zaW0vdGVzdHN1aXRlL2QzMHYtZWxmL3RpY2sucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODM0Y2E3Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi90aWNrLnMKQEAgLTAsMCArMSw1MSBAQAorCS5nbG9ibCBfc3RhcnQKKwkjCisJIyBOT1RFOglSZWdpc3RlcnMgcjEwLXIxMSBhcmUgcmVzZXJ2ZWQgZm9yIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgorCSMJd2hpbGUgdGhlIG90aGVycyBjYW4gYmUgdXNlZCBieSB0aGUgbWFpbiBsb29wL3N0YXJ0IGNvZGUuCisKK19zdGFydDoJCQorCSMgcGF0Y2ggdGhlIGV4dGVybmFsIGludGVycnVwdCBoYW5kbGVycyBlbnRyeQorCWFkZCByMSwgcjAsIGhhbmRsZXIKKwlsZHcgcjIsIEAocjEsIDApCisJbGR3IHIzLCBAKHIxLCA0KQorCWFkZCByMSwgcjAsIDB4ZmZmZmYxMzgKKwlzdHcgcjIsIEAocjEsIDApCisJc3R3IHIzLCBAKHIxLCA0KQorCQorCSMgZW5hYmxlIGV4dGVybmFsIGludGVycnVwdHMgLSBjcjAgPT0gUFNXCisJbXZmc3lzIHIyLCBjcjAKKwlvciByMiwgcjAsIDB4MDQwMDAwMDAKKwltdnRzeXMgY3IwLCByMgorCisKKwkjIHdhaXQgZm9yIGZsYWcgdG8gYmUgc2V0Citsb29wOgkKKwlhZGQgcjIsIHIwLCBmbGFnCisJbGR3IHIzLCBAKHIyLCAwKQorCWJyYXR6ciByMywgbG9vcAorCisJIyBjbGVhciB0aGUgZmxhZworCXN0dyByMCwgQChyMiwgMCkKKworCWFkZCByMiwgcjAsIHRpY2sKKwkjIHB1dHN0cgorCS5sb25nIDB4MGUwMDAwMDEsIDB4MDBmMDAwMDAKKworCWJyYSBsb29wCisKKwkjIGZpbmlzaGVkCisJYWRkIHIyLCByMCwgcjAgfHwgbm9wCisJLmxvbmcgMHgwZTAwMDAwNCwgMHgwMGYwMDAwMAorCisJCitoYW5kbGVyOgorCWptcCByZWFsX2hhbmRsZXIKK3JlYWxfaGFuZGxlcjoKKwlhZGQgcjEwLCByMCwgMQorCWFkZCByMTEsIHIwLCBmbGFnCisJc3RiIHIxMCwgQChyMTEsMCkKKwlyZWl0CisKKworZmxhZzoJLmxvbmcgMAordGljazoJLmFzY2lpICJUaWNrXHJcbiIKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvdHJhcC5TIGIvc2ltL3Rlc3RzdWl0ZS9kMzB2LWVsZi90cmFwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzOTlmOQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZDMwdi1lbGYvdHJhcC5TCkBAIC0wLDAgKzEsMzUgQEAKKyMgdmVyaWZ5IHRoYXQgdHJhcCB8fCBjbXAgd29ya3MKKwlhZGQgIHI4LHIwLDB4MTEyMjMzNDQgICAgICAgICA7CisJYWRkICByOSxyMCwweDExMjIzMzQ0ICAgICAgICAgOworCisJbXZ0c3lzIGJwc3cscjAgfHwgbm9wCisJbXZ0c3lzIGJwYyxyMCAgfHwgbm9wCisKKwlhZGQgIHIxLHIwLDB4OTcwMDA1NTUgICAgICAgOyBmb3IgcHN3CisJbXZ0c3lzIHBzdyxyMSB8fCBub3AKKwl0cmFwIDAgIHx8IGNtcGVxIGYwLHI4LHI5LDsKKworCS5sb25nIDB4MGUwMDAwMDQsIDB4MDBmMDAwMDAKKworCS5zZWN0aW9uIC5laXRfdiwgImEiCisJbm9wICAgICB8fCBub3AKKwlub3AgICAgIHx8IG5vcAorCW5vcCAgICAgfHwgbm9wCisJbm9wICAgICB8fCBub3AKKworIyBzYXZlIHRoZSBvbGQgYnBzdywgcHN3CisJbXZmc3lzIHI0LGJwc3cgfHwgbm9wCisJbXZmc3lzIHI1LHBzdyB8fCBub3AKKworIyBsb2FkIHVwIHdoYXQgdGhleSBzaG91bGQgYmUKKwlhZGQgcjYscjAsMHg5NzAwNDU1NQorCWFkZCByNyxyMCwweDkwMDAwMDAwCisKKyMgdmVyaWZ5IHRoYXQgdGhleSBoYXZlIHRoZSByaWdodCB2YWx1ZXMKKyMgcmV0dXJuIGV4aXQgdmFsdWUgaW4gcjIgLS0gMCBzdWNjZXNzLCA0NyBmYWlsdXJlCisJYWRkIHIyLHIwLDQ3CisJY21wZXEgZjAscjQscjYgfHwgbm9wCisJY21wZXEgZjEscjUscjcgfHwgbm9wCisJYWRkL3R0IHIyLHIwLHIwIHx8IG5vcAorCisJcmVpdApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9mcjMwLWVsZi9DaGFuZ2VMb2cgYi9zaW0vdGVzdHN1aXRlL2ZyMzAtZWxmL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjJkMGU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9mcjMwLWVsZi9DaGFuZ2VMb2cKQEAgLTAsMCArMSw4IEBACitUaHUgTm92IDI2IDExOjM0OjQ2IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KKworCSogbG9vcC5zIChfc3RhcnQpOiBSZW1vdmVkIGRpcmVjdCBhZGRyZXNzIGhhY2suCisKK01vbiBOb3YgMjMgMTc6MDI6NDcgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgorCisJKiBEaXJlY3RvcnkgY3JlYXRlZC4KKwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9mcjMwLWVsZi9NYWtlZmlsZS5pbiBiL3NpbS90ZXN0c3VpdGUvZnIzMC1lbGYvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzYzNlZgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZnIzMC1lbGYvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxNTcgQEAKKyMgTWFrZWZpbGUgZm9yIHJlZ3Jlc3Npb24gdGVzdGluZyB0aGUgZnIzMCBzaW11bGF0b3IuCisjIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCisKKyMgR0RCIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBHREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKK1ZQQVRIID0gQHNyY2RpckAKK3NyY2RpciA9IEBzcmNkaXJACitzcmNyb290ID0gJChzcmNkaXIpLy4uLy4uLy4uCisKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKKworaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK2J1aWxkX2Nhbm9uaWNhbCA9IEBidWlsZEAKK2hvc3RfY2Fub25pY2FsID0gQGhvc3RACit0YXJnZXRfY2Fub25pY2FsID0gQHRhcmdldEAKK3RhcmdldF9jcHUgPSBAdGFyZ2V0X2NwdUAKKworCitTSEVMTCA9IEBTSEVMTEAKK1NVQkRJUlMgPSBAc3ViZGlyc0AKK1JQQVRIX0VOVlZBUiA9IEBSUEFUSF9FTlZWQVJACisKK0VYUEVDVCA9IGBpZiBbIC1mIC4uLy4uLy4uL2V4cGVjdC9leHBlY3QgXSA7IHRoZW4gXAorICAgICAgICAgIGVjaG8gLi4vLi4vLi4vZXhwZWN0L2V4cGVjdCA7IFwKKyAgICAgICAgICBlbHNlIGVjaG8gZXhwZWN0IDsgZmlgCisKK1JVTlRFU1QgPSAkKFJVTlRFU1RfRk9SX1RBUkdFVCkKKworUlVOVEVTVEZMQUdTID0KKworUlVOVEVTVF9GT1JfVEFSR0VUID0gYFwKKyAgaWYgWyAtZiAkJHtzcmNyb290fS9kZWphZ251L3J1bnRlc3QgXTsgdGhlbiBcCisgICAgZWNobyAkJHtzcmNyb290fS9kZWphZ251L3J1bnRlc3Q7IFwKKyAgZWxzZSBcCisgICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF07IHRoZW4gXAorICAgICAgZWNobyBydW50ZXN0OyBcCisgICAgZWxzZSBcCisgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBydW50ZXN0IHwgc2VkIC1lICcnICQkdDsgXAorICAgIGZpOyBcCisgIGZpYAorCisKK0FTX0ZPUl9UQVJHRVQgPSBgXAorICBpZiBbIC14IC4uLy4uLy4uL2dhcy9hcy1uZXcgXTsgdGhlbiBcCisgICAgZWNobyAuLi8uLi8uLi9nYXMvYXMtbmV3IDsgXAorICBlbHNlIFwKKyAgICBlY2hvICQodGFyZ2V0X2FsaWFzKS1hcyA7IFwKKyAgZmlgCisKK0xEX0ZPUl9UQVJHRVQgPSBgXAorICBpZiBbIC14IC4uLy4uLy4uL2xkL2xkLW5ldyBdOyB0aGVuIFwKKyAgICBlY2hvIC4uLy4uLy4uL2xkL2xkLW5ldyA7IFwKKyAgZWxzZSBcCisgICAgZWNobyAkKHRhcmdldF9hbGlhcyktbGQgOyBcCisgIGZpYAorCitSVU5fRk9SX1RBUkdFVCA9IGBcCisgIGlmIFsgLXggLi4vLi4vLi4vc2ltLyR7dGFyZ2V0X2NwdX0vcnVuIF07IHRoZW4gXAorICAgIGVjaG8gLi4vLi4vLi4vc2ltLyR7dGFyZ2V0X2NwdX0vcnVuIDsgXAorICBlbHNlIFwKKyAgICBlY2hvICQodGFyZ2V0X2FsaWFzKS1ydW4gOyBcCisgIGZpYAorCitURVNUUyA9IFwKKwloZWxsby5vayBcCisJZXhpdDQ3LmtvCisKK2NoZWNrOiBzYW5pdHkgJChURVNUUykKK3Nhbml0eToKKwlAZXZhbCBlY2hvIEFTX0ZPUl9UQVJHRVQgPSAkKEFTX0ZPUl9UQVJHRVQpCisJQGV2YWwgZWNobyBMRF9GT1JfVEFSR0VUID0gJChMRF9GT1JfVEFSR0VUKQorCUBldmFsIGVjaG8gUlVOX0ZPUl9UQVJHRVQgPSAkKFJVTl9GT1JfVEFSR0VUKQorCisKKworIyBSdWxlcyBmb3IgcnVubmluZyBhbGwgdGhlIHRlc3RzLCBwdXQgaW50byB0aHJlZSB0eXBlcworIyBleGl0IHN1Y2Nlc3MsIGV4aXQgZmFpbCwgcHJpbnQgIkhlbGxvIFdvcmxkIgorCisudS5sb2c6CisJdXVkZWNvZGUgJCoudQorCSQoUlVOX0ZPUl9UQVJHRVQpICQqID4gJCoubG9nCisKKworIyBSdWxlcyBmb3IgcnVubmluZyB0aGUgdGVzdHMKKworLlNVRkZJWEVTOiAudSAub2sgLnJ1biAuaGkgLmtvCisucnVuLm9rOgorCXJtIC1mIHRtcC0kKiAkKi5oaQorCXVsaW1pdCAtdCA1IDsgJChSVU5fRk9SX1RBUkdFVCkgJCoucnVuID4gdG1wLSQqCisJbXYgdG1wLSQqICQqLm9rCisucnVuLmhpOgorCXJtIC1mIHRtcC0kKiAkKi5oaSBkaWZmLSQqCisJdWxpbWl0IC10IDUgOyAkKFJVTl9GT1JfVEFSR0VUKSAkKi5ydW4gPiB0bXAtJCoKKwllY2hvICJIZWxsbyBXb3JsZCIgfCBkaWZmIC0gdG1wLSQqID4gZGlmZi0kKgorCWNhdCB0bXAtJCogZGlmZi0kKiA+ICQqLmhpCisucnVuLmtvOgorCXJtIC1mIHRtcC0kKiAkKi5rbworCXNldCArZSA7IFwKKwl1bGltaXQgLXQgNSA7ICQoUlVOX0ZPUl9UQVJHRVQpICQqLnJ1biA+IHRtcC0kKiA7IFwKKwlpZiBbICQkPyAtZXEgNDcgXSA7IHRoZW4gXAorCSAgZXhpdCAwIDsgXAorCWVsc2UgXAorCSAgZXhpdCAxIDsgXAorCWZpCisJbXYgdG1wLSQqICQqLmtvCisKKworIyBSdWxlcyBmb3IgYnVpbGRpbmcgYWxsIHRoZSB0ZXN0cyBhbmQgcGFja2luZyB0aGVtIGludG8KKyMgdXVlbmNvZGVkIGZpbGVzLgorCit1dWVuY29kZTogZW0tcHN0ci51IGVtLWUwLnUgZW0tZTQ3LnUgZW0tcGNoci51CisKKy5TVUZGSVhFUzogLnUgLnMgLnJ1bgorLnMudToKKwlybSAtZiAkKi5vICQqLnJ1bgorCSQoQVNfRk9SX1RBUkdFVCkgJChzcmNkaXIpLyQqLnMgLW8gJCoubworCSQoTERfRk9SX1RBUkdFVCkgLW8gJCogJCoubworCXV1ZW5jb2RlIDwgJCogJCogPiAkKi51CisJcm0gLWYgJCoubyAkKgorLnMucnVuOgorCXJtIC1mICQqLm8gJCoucnVuCisJJChBU19GT1JfVEFSR0VUKSAkKHNyY2RpcikvJCoucyAtbyAkKi5vCisJJChMRF9GT1JfVEFSR0VUKSAtbyAkKi5ydW4gJCoubworCXJtIC1mICQqLm8gJCoKKworCitjbGVhbiBtb3N0bHljbGVhbjoKKwlybSAtZiAqfiBjb3JlICoubyBhLm91dAorCXJtIC1mICQoVEVTVFMpCisKK2Rpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbjogY2xlYW4KKwlybSAtZiAqfiBjb3JlCisJcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cyAqLWluaXQuZXhwCisJcm0gLWZyICoubG9nIHN1bW1hcnkgZGV0YWlsICoucGxvZyAqLnN1bSAqLnBzdW0gc2l0ZS4qCisKK01ha2VmaWxlIDogTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cworCSQoU0hFTEwpIGNvbmZpZy5zdGF0dXMKKworY29uZmlnLnN0YXR1czogY29uZmlndXJlCisJJChTSEVMTCkgY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZnIzMC1lbGYvY29uZmlndXJlIGIvc2ltL3Rlc3RzdWl0ZS9mcjMwLWVsZi9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmE2NTZjYgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZnIzMC1lbGYvY29uZmlndXJlCkBAIC0wLDAgKzEsOTAyIEBACisjISAvYmluL3NoCisKKyMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEgCisjIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KKworIyBEZWZhdWx0czoKK2FjX2hlbHA9CithY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCisjIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46CisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCisgICAgZXhpdCAwIDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Li9jb25maWcubG9nCisKK2VjaG8gIlwKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorIiAxPiY1CisKKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCithY19jb25maWd1cmVfYXJncz0KK2ZvciBhY19hcmcKK2RvCisgIGNhc2UgIiRhY19hcmciIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBlc2FjCitkb25lCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKyMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCisjIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCitpZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID4gY29uZmRlZnMuaAorCisjIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0CisjIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitpZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KKyAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKyAgICBhY19uPSBhY19jPScKKycgYWNfdD0nCScKKyAgZWxzZQorICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKyAgZmkKK2Vsc2UKKyAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CitmaQorCisKKworQ0M9JHtDQy1jY30KKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworCisjIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KKyMgVGhlIGlucHV0cyBhcmU6CisjICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKKyMKKyMgVGhlIHJ1bGVzIGFyZToKKyMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCisjICAgIHNhbWUgdGltZS4KKyMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCisjIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKKyMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCisjIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCisjIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgorCisjIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCisjIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCitjYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KK05PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKKyopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KK2lmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKK2Vsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1NzM6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorCitob3N0X2FsaWFzPSRob3N0CitjYXNlICIkaG9zdF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKQorICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKKyAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaSA7OworICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKK2hvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTk0OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQorCit0YXJnZXRfYWxpYXM9JHRhcmdldAorY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCit0YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCit0YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAordGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK3RhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2MTI6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKKworYnVpbGRfYWxpYXM9JGJ1aWxkCitjYXNlICIkYnVpbGRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKKyAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2J1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCitidWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2J1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAorYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKKwordGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgorICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCisgICAgTk9ORU5PTkVzLHgseCwgJiYKKyAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQorCisKKworCisKK3RyYXAgJycgMSAyIDE1CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxIHwgZ3JlcCBhY19zcGFjZWAgaW4KKyAgKmFjX3NwYWNlPVwgKikKKyAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgc2VkIC1uIFwKKyAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCisgICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCisgICAgOzsKKyAgKikKKyAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKyAgICA7OworICBlc2FjID4+IGNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCisjIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KKyMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJworZmkKKwordHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gREVGUy4KKyMgUHJvdGVjdCBhZ2FpbnN0IHNoZWxsIGV4cGFuc2lvbiB3aGlsZSBleGVjdXRpbmcgTWFrZWZpbGUgcnVsZXMuCisjIFByb3RlY3QgYWdhaW5zdCBNYWtlZmlsZSBtYWNybyBleHBhbnNpb24uCitjYXQgPiBjb25mdGVzdC5kZWZzIDw8XEVPRgorcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklLURcMT1cMiVnCitzJVsgCWB+IyReJiooKXt9XFx8OyciPD4/XSVcXCYlZworcyVcWyVcXCYlZworcyVcXSVcXCYlZworcyVcJCUkJCVnCitFT0YKK0RFRlM9YHNlZCAtZiBjb25mdGVzdC5kZWZzIGNvbmZkZWZzLmggfCB0ciAnXDAxMicgJyAnYAorcm0gLWYgY29uZnRlc3QuZGVmcworCisKKyMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgorOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorCitlY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCitybSAtZiAkQ09ORklHX1NUQVRVUworY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyMhIC9iaW4vc2gKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCisjIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIworIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKKyMKKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCithY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgorZm9yIGFjX29wdGlvbgorZG8KKyAgY2FzZSAiXCRhY19vcHRpb24iIGluCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKKyAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCisgICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4xIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorCit0cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQFNIRUxMQCUkU0hFTEwlZworcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKK3MlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZworcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCitzJUBERUZTQCUkREVGUyVnCitzJUBMREZMQUdTQCUkTERGTEFHUyVnCitzJUBMSUJTQCUkTElCUyVnCitzJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKK3MlQHByZWZpeEAlJHByZWZpeCVnCitzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCitzJUBiaW5kaXJAJSRiaW5kaXIlZworcyVAc2JpbmRpckAlJHNiaW5kaXIlZworcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworcyVAZGF0YWRpckAlJGRhdGFkaXIlZworcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZworcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCitzJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCitzJUBsaWJkaXJAJSRsaWJkaXIlZworcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworcyVAaW5mb2RpckAlJGluZm9kaXIlZworcyVAbWFuZGlyQCUkbWFuZGlyJWcKK3MlQENDQCUkQ0MlZworcyVAaG9zdEAlJGhvc3QlZworcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZworcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCitzJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKK3MlQGhvc3Rfb3NAJSRob3N0X29zJWcKK3MlQHRhcmdldEAlJHRhcmdldCVnCitzJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZworcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZworcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZworcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKK3MlQGJ1aWxkQCUkYnVpbGQlZworcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCitzJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZworcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKK3MlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZworCitDRU9GCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCithY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KK2FjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfbW9yZV9saW5lcz06CithY19zZWRfY21kcz0iIgord2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZmkKKyAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGVsc2UKKyAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGZpCisgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCisgICAgYWNfYmVnPSRhY19lbmQKKyAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgIGFjX3NlZF9jbWRzPWNhdAorZmkKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUifQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KKworICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgIC4pICBzcmNkaXI9LgorICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgorICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7CisgIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgorICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgZXNhYworCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworZXhpdCAwCitFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCitybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwordGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvZnIzMC1lbGYvY29uZmlndXJlLmluIGIvc2ltL3Rlc3RzdWl0ZS9mcjMwLWVsZi9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0Mzg5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZnIzMC1lbGYvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsMTkgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitkbmwgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IGZyYWdtZW50IHRoYXQgc3VwcGxpZXMgdGhlIGluZm9ybWF0aW9uCitkbmwgbmVjZXNzYXJ5IHRvIHRhaWxvciBhIHRlbXBsYXRlIGNvbmZpZ3VyZSBzY3JpcHQgaW50byB0aGUgY29uZmlndXJlCitkbmwgc2NyaXB0IGFwcHJvcHJpYXRlIGZvciB0aGlzIGRpcmVjdG9yeS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBjaGVjaworZG5sIGFueSBleGlzdGluZyBjb25maWd1cmUgc2NyaXB0LgorCitBQ19QUkVSRVEoMi41KQorZG5sIEZJWE1FIC0gdGhpbmsgb2YgYSB0cnVseSB1bmlxIGZpbGUgdG8gdGhpcyBkaXJlY3RvcnkKK0FDX0lOSVQoTWFrZWZpbGUuaW4pCisKK0NDPSR7Q0MtY2N9CitBQ19TVUJTVChDQykKK0FDX0NPTkZJR19BVVhfRElSKGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4pCitBQ19DQU5PTklDQUxfU1lTVEVNCisKK0FDX1NVQlNUKHRhcmdldF9jcHUpCisKKworQUNfT1VUUFVUKE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9mcjMwLWVsZi9leGl0NDcucyBiL3NpbS90ZXN0c3VpdGUvZnIzMC1lbGYvZXhpdDQ3LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjN2M5OQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvZnIzMC1lbGYvZXhpdDQ3LnMKQEAgLTAsMCArMSw3IEBACisJOzsgUmV0dXJuIHdpdGggZXhpdCBjb2RlIDQ3LgorCisJLmdsb2JhbCBfc3RhcnQKK19zdGFydDoKKwlsZGkzMiAjNDcscjQKKwlsZGkzMiAjMSxyMAorCWludCAgICMxMApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9mcjMwLWVsZi9oZWxsby5zIGIvc2ltL3Rlc3RzdWl0ZS9mcjMwLWVsZi9oZWxsby5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MjU5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2ZyMzAtZWxmL2hlbGxvLnMKQEAgLTAsMCArMSwxNSBAQAorCS5nbG9iYWwgX3N0YXJ0Citfc3RhcnQ6CisKKzsgd3JpdGUgKGhlbGxvIHdvcmxkKQorCWxkaTMyICMxNCxyNgorCWxkaTMyICNoZWxsbyxyNQorCWxkaTMyICMxLHI0CisJbGRpMzIgIzUscjAKKwlpbnQgICAjMTAKKzsgZXhpdCAoMCkKKwlsZGkzMiAjMCxyNAorCWxkaTMyICMxLHIwCisJaW50ICAgIzEwCisKK2hlbGxvOgkuYXNjaWkgIkhlbGxvIFdvcmxkIVxyXG4iCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2ZyMzAtZWxmL2xvb3AucyBiL3NpbS90ZXN0c3VpdGUvZnIzMC1lbGYvbG9vcC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwOWI3OGYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL2ZyMzAtZWxmL2xvb3AucwpAQCAtMCwwICsxLDIgQEAKKwkuZ2xvYmFsIF9zdGFydAorX3N0YXJ0OglicmEgX3N0YXJ0CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL2xpYi9zaW0tZGVmcy5leHAgYi9zaW0vdGVzdHN1aXRlL2xpYi9zaW0tZGVmcy5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZhNzQyZgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvbGliL3NpbS1kZWZzLmV4cApAQCAtMCwwICsxLDMxOCBAQAorIyBTaW11bGF0b3IgZGVqYWdudSB1dGlsaXRpZXMuCisKKyMgQ29tbXVuaWNhdGUgc2ltdWxhdG9yIHBhdGggZnJvbSBzaW1faW5pdCB0byBzaW1fdmVyc2lvbi4KKyMgRm9yIHNvbWUgcmVhc29uIFtib2FyZF9pbmZvIHRhcmdldCBzaW1dIGRvZXNuJ3Qgd29yayBpbiBzaW1fdmVyc2lvbi4KKyMgW1ByZXN1bXVibHkgYmVjYXVzZSB0aGUgdGFyZ2V0IGhhcyBiZWVuICJwb3BwZWQiIGJ5IHRoZW4uICBPZGQgdGhvdWdoLl0KK3NldCBzaW1fcGF0aCAidW5rbm93bi1ydW4iCisKKyMgSW5pdGlhbGl6ZSB0aGUgdGVzdHJ1bi4KKyMgUmVxdWlyZWQgYnkgZGVqYWdudS4KKworcHJvYyBzaW1faW5pdCB7IGFyZ3MgfSB7CisgICAgZ2xvYmFsIHNpbV9wYXRoCisgICAgc2V0IHNpbV9wYXRoIFtib2FyZF9pbmZvIHRhcmdldCBzaW1dCisgICAgIyBOZWVkIHRvIHJldHVybiBhbiBlbXB0eSBzdHJpbmcgKGNvcGllZCBmcm9tIEdBUykuCisgICAgcmV0dXJuICIiCit9CisKKyMgUHJpbnQgdGhlIHZlcnNpb24gb2YgdGhlIHNpbXVsYXRvciBiZWluZyB0ZXN0ZWQuCisjIFJlcXVpcmVkIGJ5IGRlamFnbnUuCisKK3Byb2Mgc2ltX3ZlcnNpb24ge30geworICAgIGdsb2JhbCBzaW1fcGF0aAorICAgIHNldCB2ZXJzaW9uIDAuNQorICAgIGNsb25lX291dHB1dCAiJHNpbV9wYXRoICR2ZXJzaW9uXG4iCit9CisKKyMgQ292ZXIgZnVuY3Rpb24gdG8gdGFyZ2V0X2NvbXBpbGUuCisjIENvcGllZCBmcm9tIGdkYl9jb21waWxlLgorCitwcm9jIHNpbV9jb21waWxlIHsgc291cmNlIGRlc3QgdHlwZSBvcHRpb25zIH0geworICAgIHNldCByZXN1bHQgW3RhcmdldF9jb21waWxlICRzb3VyY2UgJGRlc3QgJHR5cGUgJG9wdGlvbnNdCisgICAgcmVnc3ViICJcW1xyXG5cXSokIiAiJHJlc3VsdCIgIiIgcmVzdWx0CisgICAgcmVnc3ViICJeXFtcclxuXF0qIiAiJHJlc3VsdCIgIiIgcmVzdWx0CisgICAgaWYgeyAkcmVzdWx0ICE9ICIiIH0geworCWNsb25lX291dHB1dCAic2ltIGNvbXBpbGUgb3V0cHV0OiAkcmVzdWx0IgorICAgIH0KKyAgICByZXR1cm4gJHJlc3VsdAorfQorCisjIFJ1biBhIHByb2dyYW0gb24gdGhlIHNpbXVsYXRvci4KKyMgUmVxdWlyZWQgYnkgZGVqYWdudSAoYXQgbGVhc3QgJHt0b29sfV9ydW4gdXNlZCB0byBiZSkuCisjCisjIFNJTV9PUFRTIGFyZSBvcHRpb25zIGZvciB0aGUgc2ltdWxhdG9yLgorIyBQUk9HX09QVFMgYXJlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbS4KKyMgQXQgcHJlc2VudCBSRURJUiBtdXN0IGJlICIiIG9yICI+IGZvbyIuCisjIE9QVElPTlMgaXMgYSBsaXN0IG9mIG9wdGlvbnMgaW50ZXJuYWwgdG8gdGhpcyByb3V0aW5lLgorIyBUaGlzIGlzIG1vZGVsbGVkIGFmdGVyIHRhcmdldF9jb21waWxlLiAgV2Ugd2FudCB0byBiZSBhYmxlIHRvIGFkZCBuZXcKKyMgb3B0aW9ucyB3aXRob3V0IGhhdmluZyB0byB1cGRhdGUgYWxsIG91ciB1c2Vycy4KKyMgQ3VycmVudGx5OgorIwllbnYoZm9vKT12YWwJLSBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9vIHRvIHZhbCBmb3IgdGhpcyBydW4KKyMJdGltZW91dD12YWwJLSBzZXQgdGhlIHRpbWVvdXQgdG8gdmFsIGZvciB0aGlzIHJ1bgorIworIyBUaGUgcmVzdWx0IGlzIGEgbGlzdCBvZiB0d28gZWxlbWVudHMuCisjIFRoZSBmaXJzdCBpcyBvbmUgb2YgcGFzcy9mYWlsL2V0Yy4KKyMgVGhlIHNlY29uZCBpcyB0aGUgcHJvZ3JhbSdzIG91dHB1dC4KKyMKKyMgVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgc2ltX2xvYWQgcm91dGluZSBwcm92aWRlZCBieQorIyBkZWphZ251L2NvbmZpZy9zaW0uZXhwLiAgSXQncyBub3QgY2xlYXIgaG93IHRvIHBhc3MgYXJndW1lbnRzIHRvIHRoZQorIyBzaW11bGF0b3IgKG5vdCB0aGUgc2ltdWxhdGVkIHByb2dyYW0sIHRoZSBzaW11bGF0b3IpIHdpdGggc2ltX2xvYWQuCisKK3Byb2Mgc2ltX3J1biB7IHByb2cgc2ltX29wdHMgcHJvZ19vcHRzIHJlZGlyIG9wdGlvbnMgfSB7CisgICAgZ2xvYmFsIFNJTUZMQUdTCisKKyAgICAjIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgdGltZW91dC4KKyAgICAjIEZJWE1FOiBUaGUgdGltZW91dCB2YWx1ZSB3ZSBhY3R1YWxseSB3YW50IGlzIGEgZnVuY3Rpb24gb2YKKyAgICAjIGhvc3QsIHRhcmdldCwgYW5kIHRlc3RjYXNlLgorICAgIHNldCB0ZXN0Y2FzZV90aW1lb3V0IFtib2FyZF9pbmZvIHRhcmdldCBzaW1fdGltZV9saW1pdF0KKyAgICBpZiB7ICIkdGVzdGNhc2VfdGltZW91dCIgPT0gIiIgfSB7CisJc2V0IHRlc3RjYXNlX3RpbWVvdXQgW2JvYXJkX2luZm8gaG9zdCB0ZXN0Y2FzZV90aW1lb3V0XQorICAgIH0KKyAgICBpZiB7ICIkdGVzdGNhc2VfdGltZW91dCIgPT0gIiIgfSB7CisJc2V0IHRlc3RjYXNlX3RpbWVvdXQgMjQwIDsjIDI0MCBzYW1lIGFzIGluIGRlamFnbnUvY29uZmlnL3NpbS5leHAuCisgICAgfQorCisgICAgIyBJbml0aWFsIHRoZSBlbnZpcm9ubWVudCB3ZSBwYXNzIHRvIHRoZSB0ZXN0Y2FzZS4KKyAgICBzZXQgdGVzdGNhc2VfZW52ICIiCisKKyAgICAjIFByb2Nlc3MgT1BUSU9OUyAuLi4KKyAgICBmb3JlYWNoIG8gJG9wdGlvbnMgeworCWlmIFtyZWdleHAge15lbnZcKCguKilcKT0oLiopfSAkbyBmdWxsIHZhciB2YWxdIHsKKwkgICAgc2V0IHRlc3RjYXNlX2VudiAiJHRlc3RjYXNlX2VudiAkdmFyPSR2YWwiCisJfSBlbHNlaWYgW3JlZ2V4cCB7XnRpbWVvdXQ9KC4qKX0gJG8gZnVsbCB2YWxdIHsKKwkgICAgc2V0IHRlc3RjYXNlX3RpbWVvdXQgJHZhbAorCX0KKwkKKyAgICB9CisJCisgICAgdmVyYm9zZSAidGVzdGNhc2UgdGltZW91dCBpcyBzZXQgdG8gJHRlc3RjYXNlX3RpbWVvdXQiIDEKKworICAgIHNldCBzaW0gW2JvYXJkX2luZm8gdGFyZ2V0IHNpbV0KKworICAgIGlmIFtpc19yZW1vdGUgaG9zdF0geworCXNldCBwcm9nIFtyZW1vdGVfZG93bmxvYWQgaG9zdCAkcHJvZ10KKwlpZiB7ICRwcm9nID09ICIiIH0geworCSAgICBlcnJvciAiZG93bmxvYWQgZmFpbGVkIgorCSAgICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICAgIHNldCBib2FyZCBbdGFyZ2V0X2luZm8gbmFtZV0KKyAgICBpZiBbYm9hcmRfaW5mbyAkYm9hcmQgZXhpc3RzIHNpbSxvcHRpb25zXSB7CisJc2V0IGFsd2F5c19vcHRzIFtib2FyZF9pbmZvICRib2FyZCBzaW0sb3B0aW9uc10KKyAgICB9IGVsc2UgeworCXNldCBhbHdheXNfb3B0cyAiIgorICAgIH0KKworICAgICMgRklYTUU6IHRoaXMgd29ya3MgZm9yIFVOSVggb25seQorICAgIGlmIHsgIiR0ZXN0Y2FzZV9lbnYiICE9ICIiIH0geworCXNldCBzaW0gImVudiAkdGVzdGNhc2VfZW52ICRzaW0iCisgICAgfQorCisgICAgc2VuZF9sb2cgIiRzaW0gJGFsd2F5c19vcHRzICRTSU1GTEFHUyAkc2ltX29wdHMgJHByb2cgJHByb2dfb3B0c1xuIgorCisgICAgaWYgeyAiJHJlZGlyIiA9PSAiIiB9IHsKKwlyZW1vdGVfc3Bhd24gaG9zdCAiJHNpbSAkYWx3YXlzX29wdHMgJFNJTUZMQUdTICRzaW1fb3B0cyAkcHJvZyAkcHJvZ19vcHRzIgorICAgIH0gZWxzZSB7CisJcmVtb3RlX3NwYXduIGhvc3QgIiRzaW0gJGFsd2F5c19vcHRzICRTSU1GTEFHUyAkc2ltX29wdHMgJHByb2cgJHByb2dfb3B0cyAkcmVkaXIiIHdyaXRlb25seQorICAgIH0KKyAgICBzZXQgcmVzdWx0IFtyZW1vdGVfd2FpdCBob3N0ICR0ZXN0Y2FzZV90aW1lb3V0XQorCisgICAgc2V0IHJldHVybl9jb2RlIFtsaW5kZXggJHJlc3VsdCAwXQorICAgIHNldCBvdXRwdXQgW2xpbmRleCAkcmVzdWx0IDFdCisgICAgIyBSZW1vdmUgdGhlIFxyIHBhcnQgb2YgIlxyXG4iIHNvIHdlIGRvbid0IGJyZWFrIGFsbCB0aGUgcGF0dGVybnMKKyAgICAjIHdlIHdhbnQgdG8gbWF0Y2guCisgICAgcmVnc3ViIC1hbGwgLS0gIlxyIiAkb3V0cHV0ICIiIG91dHB1dAorCisgICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7CisJIyBjbGVhbiB1cCBhZnRlciBvdXJzZWx2ZXMuCisJcmVtb3RlX2ZpbGUgaG9zdCBkZWxldGUgJHByb2cKKyAgICB9CisKKyAgICAjID8/PyBOb3Qgc3VyZSB0aGUgdGVzdCBmb3IgcGFzcy9mYWlsIGlzIHJpZ2h0LgorICAgICMgV2UganVzdCBjYXJlIHRoYXQgdGhlIHNpbXVsYXRvciByYW4gY29ycmVjdGx5LCBub3Qgd2hldGhlciB0aGUgc2ltdWxhdGVkCisgICAgIyBwcm9ncmFtIHJldHVybiAwIG9yIG5vbi16ZXJvIGZyb20gYG1haW4nLgorICAgIHNldCBzdGF0dXMgZmFpbAorICAgIGlmIHsgJHJldHVybl9jb2RlID09IDAgfSB7CisJc2V0IHN0YXR1cyBwYXNzCisgICAgfQorCisgICAgcmV0dXJuIFtsaXN0ICRzdGF0dXMgJG91dHB1dF0KK30KKworIyBSdW4gdGVzdGNhc2UgTkFNRS4KKyMgTkFNRSBpcyBlaXRoZXIgYSBmdWxseSBzcGVjaWZpZWQgZmlsZSBuYW1lLCBvciBqdXN0IHRoZSBmaWxlIG5hbWUgaW4gd2hpY2gKKyMgY2FzZSAkc3JjZGlyLyRzdWJkaXIgd2lsbCBiZSBwcmVwZW5kZWQuCisjIEFMTF9NQUNIUyBpcyBhIGxpc3Qgb2YgbWFjaHMgdG8gdXNlIGlmICJtYWNoOiBhbGwiIGlzIHNwZWNpZmllZCBpbiB0aGUgZmlsZS4KKyMgVGhlIGZpbGUgY2FuIGNvbnRhaW4gb3B0aW9ucyBpbiB0aGUgZm9ybSAiIyBvcHRpb24obWFjaCBsaXN0KTogdmFsdWUiCisjIFBvc3NpYmlsaXRpZXM6CisjIG1hY2g6IFthbGwgfCBtYWNoaW5lIG5hbWVzXQorIyBhc1sobWFjaC1saXN0KV06IDxhc3NlbWJsZXIgb3B0aW9ucz4KKyMgbGRbKG1hY2gtbGlzdCldOiA8bGlua2VyIG9wdGlvbnM+CisjIHNpbVsobWFjaC1saXN0KV06IDxzaW11bGF0b3Igb3B0aW9ucz4KKyMgb3V0cHV0WyhtYWNoLWxpc3QpXTogcHJvZ3JhbSBvdXRwdXQgcGF0dGVybiB0byBtYXRjaCB3aXRoIHN0cmluZy1tYXRjaAorIyB4ZXJyb3JbKG1hY2gtbGlzdCldOiBwcm9ncmFtIGlzIGV4cGVjdGVkIHRvIHJldHVybiB3aXRoIGEgImZhaWx1cmUiIGV4aXQgY29kZQorIyBJZiBgb3V0cHV0JyBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcHJvZ3JhbSBtdXN0IG91dHB1dCAicGFzcyIgaWYgIXhlcnJvciBvcgorIyAiZmFpbCIgaWYgeGVycm9yLgorIyBUaGUgcGFyZW5zIGluICJvcHRuYW1lKCkiIGFyZSBvcHRpb25hbCBpZiB0aGUgc3BlY2lmaWNhdGlvbiBpcyBmb3IgYWxsIG1hY2hzLgorCitwcm9jIHJ1bl9zaW1fdGVzdCB7IG5hbWUgYWxsX21hY2hzIH0geworICAgIGdsb2JhbCBzdWJkaXIgc3JjZGlyCisgICAgZ2xvYmFsIEFTIEFTRkxBR1MgTEQgTERGTEFHUyBTSU1GTEFHUworICAgIGdsb2JhbCBvcHRzCisKKyAgICBpZiBbc3RyaW5nIG1hdGNoICIqLyoiICRuYW1lXSB7CisJc2V0IGZpbGUgJG5hbWUKKwlzZXQgbmFtZSBbZmlsZSB0YWlsICRuYW1lXQorICAgIH0gZWxzZSB7CisJc2V0IGZpbGUgIiRzcmNkaXIvJHN1YmRpci8kbmFtZSIKKyAgICB9CisKKyAgICBzZXQgb3B0X2FycmF5IFtzbHVycF9vcHRpb25zICIke2ZpbGV9Il0KKyAgICBpZiB7ICRvcHRfYXJyYXkgPT0gLTEgfSB7CisJdW5yZXNvbHZlZCAkc3ViZGlyLyRuYW1lCisJcmV0dXJuCisgICAgfQorICAgIHNldCBvcHRzKGFzKSB7fQorICAgIHNldCBvcHRzKGxkKSB7fQorICAgIHNldCBvcHRzKHNpbSkge30KKyAgICBzZXQgb3B0cyhvdXRwdXQpIHt9CisgICAgc2V0IG9wdHMobWFjaCkge30KKyAgICBzZXQgb3B0cyh0aW1lb3V0KSB7fQorICAgIHNldCBvcHRzKHhlcnJvcikgIm5vIgorCisgICAgZm9yZWFjaCBpICRvcHRfYXJyYXkgeworCXNldCBvcHRfbmFtZSBbbGluZGV4ICRpIDBdCisJc2V0IG9wdF9tYWNocyBbbGluZGV4ICRpIDFdCisJc2V0IG9wdF92YWwgW2xpbmRleCAkaSAyXQorCWlmICFbaW5mbyBleGlzdHMgb3B0cygkb3B0X25hbWUpXSB7CisJICAgIHBlcnJvciAidW5rbm93biBvcHRpb24gJG9wdF9uYW1lIGluIGZpbGUgJGZpbGUiCisJICAgIHVucmVzb2x2ZWQgJHN1YmRpci8kbmFtZQorCSAgICByZXR1cm4KKwl9CisJZm9yZWFjaCBtICRvcHRfbWFjaHMgeworCSAgICBzZXQgb3B0cygkb3B0X25hbWUsJG0pICRvcHRfdmFsCisJfQorCWlmIHsgIiRvcHRfbWFjaHMiID09ICIiIH0geworCSAgICBzZXQgb3B0cygkb3B0X25hbWUpICRvcHRfdmFsCisJfQorICAgIH0KKworICAgIHNldCB0ZXN0bmFtZSAkbmFtZQorICAgIHNldCBzb3VyY2VmaWxlICRmaWxlCisgICAgaWYgeyAkb3B0cyhvdXRwdXQpID09ICIiIH0geworCWlmIHsgIiRvcHRzKHhlcnJvcikiID09ICJubyIgfSB7CisJICAgIHNldCBvcHRzKG91dHB1dCkgInBhc3NcbiIKKwl9IGVsc2UgeworCSAgICBzZXQgb3B0cyhvdXRwdXQpICJmYWlsXG4iCisJfQorICAgIH0KKyAgICAjIENoYW5nZSBcbiBzZXF1ZW5jZXMgdG8gbmV3bGluZSBjaGFycy4KKyAgICByZWdzdWIgLWFsbCAiXFxcXG4iICRvcHRzKG91dHB1dCkgIlxuIiBvcHRzKG91dHB1dCkKKworICAgIGZvcmVhY2ggbWFjaCAkb3B0cyhtYWNoKSB7CisJdmVyYm9zZSAiVGVzdGluZyAkbmFtZSBvbiAkbWFjaC4iCisKKwlpZiAhW2luZm8gZXhpc3RzIG9wdHMoYXMsJG1hY2gpXSB7CisJICAgIHNldCBvcHRzKGFzLCRtYWNoKSAkb3B0cyhhcykKKwl9CisJc2VuZF9sb2cgIiRBUyAkQVNGTEFHUyAkb3B0cyhhcywkbWFjaCkgLUkkc3JjZGlyLyRzdWJkaXIgLW8gJHtuYW1lfS5vICRzb3VyY2VmaWxlXG4iCisJY2F0Y2ggImV4ZWMgJEFTICRBU0ZMQUdTICRvcHRzKGFzLCRtYWNoKSAtSSRzcmNkaXIvJHN1YmRpciAtbyAke25hbWV9Lm8gJHNvdXJjZWZpbGUiIGNvbXBfb3V0cHV0CisKKwlpZiAhW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHsKKwkgICAgdmVyYm9zZSAtbG9nICIkY29tcF9vdXRwdXQiIDMKKwkgICAgZmFpbCAiJG1hY2ggJHRlc3RuYW1lIgorCSAgICBjb250aW51ZQorCX0KKworCWlmICFbaW5mbyBleGlzdHMgb3B0cyhsZCwkbWFjaCldIHsKKwkgICAgc2V0IG9wdHMobGQsJG1hY2gpICRvcHRzKGxkKQorCX0KKwlzZW5kX2xvZyAiJExEICRMREZMQUdTICRvcHRzKGxkLCRtYWNoKSAtbyAke25hbWV9LnggJHtuYW1lfS5vXG4iCisJY2F0Y2ggImV4ZWMgJExEICRMREZMQUdTICRvcHRzKGxkLCRtYWNoKSAtbyAke25hbWV9LnggJHtuYW1lfS5vIiBjb21wX291dHB1dAorCisJaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB7CisJICAgIHZlcmJvc2UgLWxvZyAiJGNvbXBfb3V0cHV0IiAzCisJICAgIGZhaWwgIiRtYWNoICR0ZXN0bmFtZSIKKwkgICAgY29udGludWUKKwl9CisKKwkjIElmIG5vIG1hY2hpbmUgc3BlY2lmaWMgb3B0aW9ucywgZGVmYXVsdCB0byB0aGUgZ2VuZXJhbCB2ZXJzaW9uLgorCWlmICFbaW5mbyBleGlzdHMgb3B0cyhzaW0sJG1hY2gpXSB7CisJICAgIHNldCBvcHRzKHNpbSwkbWFjaCkgJG9wdHMoc2ltKQorCX0KKworCSMgQnVpbGQgdGhlIG9wdGlvbnMgYXJndW1lbnQuCisJc2V0IG9wdGlvbnMgIiIKKwlpZiB7ICIkb3B0cyh0aW1lb3V0KSIgIT0gIiIgfSB7CisJICAgIHNldCBvcHRpb25zICIkb3B0aW9ucyB0aW1lb3V0PSRvcHRzKHRpbWVvdXQpIgorCX0KKworCXNldCByZXN1bHQgW3NpbV9ydW4gJHtuYW1lfS54ICIkb3B0cyhzaW0sJG1hY2gpIiAiIiAiIiAiJG9wdGlvbnMiXQorCXNldCBzdGF0dXMgW2xpbmRleCAkcmVzdWx0IDBdCisJc2V0IG91dHB1dCBbbGluZGV4ICRyZXN1bHQgMV0KKworCWlmIHsgIiRzdGF0dXMiID09ICJwYXNzIiB9IHsKKwkgICAgaWYgeyAiJG9wdHMoeGVycm9yKSIgPT0gIm5vIiB9IHsKKwkJaWYgW3N0cmluZyBtYXRjaCAkb3B0cyhvdXRwdXQpICRvdXRwdXRdIHsKKwkJICAgIHBhc3MgIiRtYWNoICR0ZXN0bmFtZSIKKwkJfSBlbHNlIHsKKwkJICAgIHZlcmJvc2UgLWxvZyAib3V0cHV0OiAgJG91dHB1dCIgMworCQkgICAgdmVyYm9zZSAtbG9nICJwYXR0ZXJuOiAkb3B0cyhvdXRwdXQpIiAzCisJCSAgICBmYWlsICIkbWFjaCAkdGVzdG5hbWUiCisJCX0KKwkgICAgfSBlbHNlIHsKKwkJdmVyYm9zZSAtbG9nICJgcGFzcycgcmV0dXJuIGNvZGUgd2hlbiBleHBlY3RpbmcgZmFpbHVyZSIgMworCQlmYWlsICIkbWFjaCAkdGVzdG5hbWUiCisJICAgIH0KKwl9IGVsc2VpZiB7ICIkc3RhdHVzIiA9PSAiZmFpbCIgfSB7CisJICAgIGlmIHsgIiRvcHRzKHhlcnJvcikiID09ICJubyIgfSB7CisJCWZhaWwgIiRtYWNoICR0ZXN0bmFtZSIKKwkgICAgfSBlbHNlIHsKKwkJaWYgW3N0cmluZyBtYXRjaCAkb3B0cyhvdXRwdXQpICRvdXRwdXRdIHsKKwkJICAgIHBhc3MgIiRtYWNoICR0ZXN0bmFtZSIKKwkJfSBlbHNlIHsKKwkJICAgIHZlcmJvc2UgLWxvZyAib3V0cHV0OiAgJG91dHB1dCIgMworCQkgICAgdmVyYm9zZSAtbG9nICJwYXR0ZXJuOiAkb3B0cyhvdXRwdXQpIiAzCisJCSAgICBmYWlsICIkbWFjaCAkdGVzdG5hbWUiCisJCX0KKwkgICAgfQorCX0gZWxzZSB7CisJICAgICRzdGF0dXMgIiRtYWNoICR0ZXN0bmFtZSIKKwl9CisgICAgfQorfQorCisjIFN1YnJvdXRpbmUgb2YgcnVuX3NpbV90ZXN0IHRvIHByb2Nlc3Mgb3B0aW9ucyBpbiBGSUxFLgorCitwcm9jIHNsdXJwX29wdGlvbnMgeyBmaWxlIH0geworICAgIGlmIFtjYXRjaCB7IHNldCBmIFtvcGVuICRmaWxlIHJdIH0geF0geworCSNwZXJyb3IgImNvdWxkbid0IG9wZW4gYCRmaWxlJzogJHgiCisJcGVycm9yICIkeCIKKwlyZXR1cm4gLTEKKyAgICB9CisgICAgc2V0IG9wdF9hcnJheSB7fQorICAgICMgd2hpdGVzcGFjZSBleHByZXNzaW9uCisgICAgc2V0IHdzICB7WyAJXSp9CisgICAgc2V0IG53cyB7W14gCV0qfQorICAgICMgd2hpdGVzcGFjZSBpcyBpZ25vcmVkIGFueXdoZXJlIGV4Y2VwdCB3aXRoaW4gdGhlIG9wdGlvbnMgbGlzdDsKKyAgICAjIG9wdGlvbiBuYW1lcyBhcmUgYWxwaGFiZXRpYyBvbmx5CisgICAgc2V0IHBhdCAiXiMke3dzfShcW2EtekEtWlxdKilcXCg/KFxbXik6XF0qKVxcKT8kd3M6JHt3c30oLiopJHdzXCQiCisgICAgIyBBbGxvdyBjb21tZW50IGFzIGZpcnN0IGxpbmUgb2YgZmlsZS4KKyAgICBzZXQgZmlyc3RsaW5lIDEKKyAgICB3aGlsZSB7IFtnZXRzICRmIGxpbmVdICE9IC0xIH0geworCXNldCBsaW5lIFtzdHJpbmcgdHJpbSAkbGluZV0KKwkjIFdoaXRlc3BhY2UgaGVyZSBpcyBzcGFjZS10YWIuCisJaWYgW3JlZ2V4cCAkcGF0ICRsaW5lIHh4eCBvcHRfbmFtZSBvcHRfbWFjaHMgb3B0X3ZhbF0geworCSAgICAjIG1hdGNoIQorCSAgICBsYXBwZW5kIG9wdF9hcnJheSBbbGlzdCAkb3B0X25hbWUgJG9wdF9tYWNocyAkb3B0X3ZhbF0KKwl9IGVsc2UgeworCSAgICBpZiB7ICEgJGZpcnN0bGluZSB9IHsKKwkJYnJlYWsKKwkgICAgfQorCX0KKwlzZXQgZmlyc3RsaW5lIDAKKyAgICB9CisgICAgY2xvc2UgJGYKKyAgICByZXR1cm4gJG9wdF9hcnJheQorfQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9DaGFuZ2VMb2cgYi9zaW0vdGVzdHN1aXRlL20zMnItZWxmL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzFhODM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9DaGFuZ2VMb2cKQEAgLTAsMCArMSw0IEBACitUaHUgRmViIDEyIDE5OjA5OjM4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIERpcmVjdG9yeSBjcmVhdGVkLgorCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL20zMnItZWxmL01ha2VmaWxlLmluIGIvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmZiNmE1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDE1NyBAQAorIyBNYWtlZmlsZSBmb3IgcmVncmVzc2lvbiB0ZXN0aW5nIHRoZSBtMzJyIHNpbXVsYXRvci4KKyMgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KKworIyBHREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIEdEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworVlBBVEggPSBAc3JjZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3NyY3Jvb3QgPSAkKHNyY2RpcikvLi4vLi4vLi4KKworcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorCitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorYnVpbGRfY2Fub25pY2FsID0gQGJ1aWxkQAoraG9zdF9jYW5vbmljYWwgPSBAaG9zdEAKK3RhcmdldF9jYW5vbmljYWwgPSBAdGFyZ2V0QAordGFyZ2V0X2NwdSA9IEB0YXJnZXRfY3B1QAorCisKK1NIRUxMID0gQFNIRUxMQAorU1VCRElSUyA9IEBzdWJkaXJzQAorUlBBVEhfRU5WVkFSID0gQFJQQVRIX0VOVlZBUkAKKworRVhQRUNUID0gYGlmIFsgLWYgLi4vLi4vLi4vZXhwZWN0L2V4cGVjdCBdIDsgdGhlbiBcCisgICAgICAgICAgZWNobyAuLi8uLi8uLi9leHBlY3QvZXhwZWN0IDsgXAorICAgICAgICAgIGVsc2UgZWNobyBleHBlY3QgOyBmaWAKKworUlVOVEVTVCA9ICQoUlVOVEVTVF9GT1JfVEFSR0VUKQorCitSVU5URVNURkxBR1MgPQorCitSVU5URVNUX0ZPUl9UQVJHRVQgPSBgXAorICBpZiBbIC1mICQke3NyY3Jvb3R9L2RlamFnbnUvcnVudGVzdCBdOyB0aGVuIFwKKyAgICBlY2hvICQke3NyY3Jvb3R9L2RlamFnbnUvcnVudGVzdDsgXAorICBlbHNlIFwKKyAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXTsgdGhlbiBcCisgICAgICBlY2hvIHJ1bnRlc3Q7IFwKKyAgICBlbHNlIFwKKyAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIHJ1bnRlc3QgfCBzZWQgLWUgJycgJCR0OyBcCisgICAgZmk7IFwKKyAgZmlgCisKKworQVNfRk9SX1RBUkdFVCA9IGBcCisgIGlmIFsgLXggLi4vLi4vLi4vZ2FzL2FzLW5ldyBdOyB0aGVuIFwKKyAgICBlY2hvIC4uLy4uLy4uL2dhcy9hcy1uZXcgOyBcCisgIGVsc2UgXAorICAgIGVjaG8gJCh0YXJnZXRfYWxpYXMpLWFzIDsgXAorICBmaWAKKworTERfRk9SX1RBUkdFVCA9IGBcCisgIGlmIFsgLXggLi4vLi4vLi4vbGQvbGQtbmV3IF07IHRoZW4gXAorICAgIGVjaG8gLi4vLi4vLi4vbGQvbGQtbmV3IDsgXAorICBlbHNlIFwKKyAgICBlY2hvICQodGFyZ2V0X2FsaWFzKS1sZCA7IFwKKyAgZmlgCisKK1JVTl9GT1JfVEFSR0VUID0gYFwKKyAgaWYgWyAteCAuLi8uLi8uLi9zaW0vJHt0YXJnZXRfY3B1fS9ydW4gXTsgdGhlbiBcCisgICAgZWNobyAuLi8uLi8uLi9zaW0vJHt0YXJnZXRfY3B1fS9ydW4gOyBcCisgIGVsc2UgXAorICAgIGVjaG8gJCh0YXJnZXRfYWxpYXMpLXJ1biA7IFwKKyAgZmlgCisKK1RFU1RTID0gXAorCWhlbGxvLm9rIFwKKwlleGl0NDcua28KKworY2hlY2s6IHNhbml0eSAkKFRFU1RTKQorc2FuaXR5OgorCUBldmFsIGVjaG8gQVNfRk9SX1RBUkdFVCA9ICQoQVNfRk9SX1RBUkdFVCkKKwlAZXZhbCBlY2hvIExEX0ZPUl9UQVJHRVQgPSAkKExEX0ZPUl9UQVJHRVQpCisJQGV2YWwgZWNobyBSVU5fRk9SX1RBUkdFVCA9ICQoUlVOX0ZPUl9UQVJHRVQpCisKKworCisjIFJ1bGVzIGZvciBydW5uaW5nIGFsbCB0aGUgdGVzdHMsIHB1dCBpbnRvIHRocmVlIHR5cGVzCisjIGV4aXQgc3VjY2VzcywgZXhpdCBmYWlsLCBwcmludCAiSGVsbG8gV29ybGQiCisKKy51LmxvZzoKKwl1dWRlY29kZSAkKi51CisJJChSVU5fRk9SX1RBUkdFVCkgJCogPiAkKi5sb2cKKworCisjIFJ1bGVzIGZvciBydW5uaW5nIHRoZSB0ZXN0cworCisuU1VGRklYRVM6IC51IC5vayAucnVuIC5oaSAua28KKy5ydW4ub2s6CisJcm0gLWYgdG1wLSQqICQqLmhpCisJdWxpbWl0IC10IDUgOyAkKFJVTl9GT1JfVEFSR0VUKSAkKi5ydW4gPiB0bXAtJCoKKwltdiB0bXAtJCogJCoub2sKKy5ydW4uaGk6CisJcm0gLWYgdG1wLSQqICQqLmhpIGRpZmYtJCoKKwl1bGltaXQgLXQgNSA7ICQoUlVOX0ZPUl9UQVJHRVQpICQqLnJ1biA+IHRtcC0kKgorCWVjaG8gIkhlbGxvIFdvcmxkIiB8IGRpZmYgLSB0bXAtJCogPiBkaWZmLSQqCisJY2F0IHRtcC0kKiBkaWZmLSQqID4gJCouaGkKKy5ydW4ua286CisJcm0gLWYgdG1wLSQqICQqLmtvCisJc2V0ICtlIDsgXAorCXVsaW1pdCAtdCA1IDsgJChSVU5fRk9SX1RBUkdFVCkgJCoucnVuID4gdG1wLSQqIDsgXAorCWlmIFsgJCQ/IC1lcSA0NyBdIDsgdGhlbiBcCisJICBleGl0IDAgOyBcCisJZWxzZSBcCisJICBleGl0IDEgOyBcCisJZmkKKwltdiB0bXAtJCogJCoua28KKworCisjIFJ1bGVzIGZvciBidWlsZGluZyBhbGwgdGhlIHRlc3RzIGFuZCBwYWNraW5nIHRoZW0gaW50bworIyB1dWVuY29kZWQgZmlsZXMuCisKK3V1ZW5jb2RlOiBlbS1wc3RyLnUgZW0tZTAudSBlbS1lNDcudSBlbS1wY2hyLnUKKworLlNVRkZJWEVTOiAudSAucyAucnVuCisucy51OgorCXJtIC1mICQqLm8gJCoucnVuCisJJChBU19GT1JfVEFSR0VUKSAkKHNyY2RpcikvJCoucyAtbyAkKi5vCisJJChMRF9GT1JfVEFSR0VUKSAtbyAkKiAkKi5vCisJdXVlbmNvZGUgPCAkKiAkKiA+ICQqLnUKKwlybSAtZiAkKi5vICQqCisucy5ydW46CisJcm0gLWYgJCoubyAkKi5ydW4KKwkkKEFTX0ZPUl9UQVJHRVQpICQoc3JjZGlyKS8kKi5zIC1vICQqLm8KKwkkKExEX0ZPUl9UQVJHRVQpIC1vICQqLnJ1biAkKi5vCisJcm0gLWYgJCoubyAkKgorCisKK2NsZWFuIG1vc3RseWNsZWFuOgorCXJtIC1mICp+IGNvcmUgKi5vIGEub3V0CisJcm0gLWYgJChURVNUUykKKworZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuOiBjbGVhbgorCXJtIC1mICp+IGNvcmUKKwlybSAtZiBNYWtlZmlsZSBjb25maWcuc3RhdHVzICotaW5pdC5leHAKKwlybSAtZnIgKi5sb2cgc3VtbWFyeSBkZXRhaWwgKi5wbG9nICouc3VtICoucHN1bSBzaXRlLioKKworTWFrZWZpbGUgOiBNYWtlZmlsZS5pbiBjb25maWcuc3RhdHVzCisJJChTSEVMTCkgY29uZmlnLnN0YXR1cworCitjb25maWcuc3RhdHVzOiBjb25maWd1cmUKKwkkKFNIRUxMKSBjb25maWcuc3RhdHVzIC0tcmVjaGVjawpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9jb25maWd1cmUgYi9zaW0vdGVzdHN1aXRlL20zMnItZWxmL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYTY1NmNiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9jb25maWd1cmUKQEAgLTAsMCArMSw5MDIgQEAKKyMhIC9iaW4vc2gKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2J1aWxkPU5PTkUKK2NhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2V4ZWNfcHJlZml4PU5PTkUKK2hvc3Q9Tk9ORQorbm9fY3JlYXRlPQorbm9ub3B0PU5PTkUKK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3RhcmdldD1OT05FCit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorc3ViZGlycz0KK01GTEFHUz0gTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT1NYWtlZmlsZS5pbgorCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCitDQz0ke0NDLWNjfQorCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCithY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKK2FjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisKKyMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgorIyBUaGUgaW5wdXRzIGFyZToKKyMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAorIworIyBUaGUgcnVsZXMgYXJlOgorIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKKyMgICAgc2FtZSB0aW1lLgorIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KKyMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAorIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KKyMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KKyMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCisKKyMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KKyMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KK2Nhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgorTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OworKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCisKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgoraWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU3MzogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisKK2hvc3RfYWxpYXM9JGhvc3QKK2Nhc2UgIiRob3N0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpCisgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpIDs7CisgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2hvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAoraG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1OTQ6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1CisKK3RhcmdldF9hbGlhcz0kdGFyZ2V0CitjYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK3RhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKK3RhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCit0YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAordGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjYxMjogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorCitidWlsZF9hbGlhcz0kYnVpbGQKK2Nhc2UgIiRidWlsZF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKK2J1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitidWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgorCit0ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCisgIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKKyAgICBOT05FTk9ORXMseCx4LCAmJgorICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCisKKworCisKKwordHJhcCAnJyAxIDIgMTUKK2NhdCA+IGNvbmZjYWNoZSA8PFxFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgorIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAorIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCisjIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgorIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCisjIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgorIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCisjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworRU9GCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKyhzZXQpIDI+JjEgfAorICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjEgfCBncmVwIGFjX3NwYWNlYCBpbgorICAqYWNfc3BhY2U9XCAqKQorICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCisgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICBzZWQgLW4gXAorICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKKyAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKyAgICA7OworICAqKQorICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJworICAgIDs7CisgIGVzYWMgPj4gY29uZmNhY2hlCitpZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKyMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCitmaQorCit0cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBERUZTLgorIyBQcm90ZWN0IGFnYWluc3Qgc2hlbGwgZXhwYW5zaW9uIHdoaWxlIGV4ZWN1dGluZyBNYWtlZmlsZSBydWxlcy4KKyMgUHJvdGVjdCBhZ2FpbnN0IE1ha2VmaWxlIG1hY3JvIGV4cGFuc2lvbi4KK2NhdCA+IGNvbmZ0ZXN0LmRlZnMgPDxcRU9GCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUtRFwxPVwyJWcKK3MlWyAJYH4jJF4mKigpe31cXHw7JyI8Pj9dJVxcJiVnCitzJVxbJVxcJiVnCitzJVxdJVxcJiVnCitzJVwkJSQkJWcKK0VPRgorREVGUz1gc2VkIC1mIGNvbmZ0ZXN0LmRlZnMgY29uZmRlZnMuaCB8IHRyICdcMDEyJyAnICdgCitybSAtZiBjb25mdGVzdC5kZWZzCisKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUiIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAU0hFTExAJSRTSEVMTCVnCitzJUBDRkxBR1NAJSRDRkxBR1MlZworcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCitzJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKK3MlQERFRlNAJSRERUZTJWcKK3MlQExERkxBR1NAJSRMREZMQUdTJWcKK3MlQExJQlNAJSRMSUJTJWcKK3MlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworcyVAcHJlZml4QCUkcHJlZml4JWcKK3MlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKK3MlQGJpbmRpckAlJGJpbmRpciVnCitzJUBzYmluZGlyQCUkc2JpbmRpciVnCitzJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCitzJUBkYXRhZGlyQCUkZGF0YWRpciVnCitzJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCitzJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKK3MlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKK3MlQGxpYmRpckAlJGxpYmRpciVnCitzJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCitzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCitzJUBpbmZvZGlyQCUkaW5mb2RpciVnCitzJUBtYW5kaXJAJSRtYW5kaXIlZworcyVAQ0NAJSRDQyVnCitzJUBob3N0QCUkaG9zdCVnCitzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCitzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKK3MlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZworcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKK3MlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCitzJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCitzJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCitzJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZworcyVAYnVpbGRAJSRidWlsZCVnCitzJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKK3MlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCitzJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZworcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCisKK0NFT0YKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KK2FjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCithY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19tb3JlX2xpbmVzPToKK2FjX3NlZF9jbWRzPSIiCit3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBmaQorICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCisgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZWxzZQorICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZmkKKyAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKyAgICBhY19iZWc9JGFjX2VuZAorICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgYWNfc2VkX2NtZHM9Y2F0CitmaQorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitDT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKworICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKKyAgcm0gLWYgIiRhY19maWxlIgorICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorIyAkY29uZmlndXJlX2lucHV0IiA7OworICAqKSBhY19jb21zdWI9IDs7CisgIGVzYWMKKworICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBzZWQgLWUgIiRhY19jb21zdWIKK3MlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCitzJUBzcmNkaXJAJSRzcmNkaXIlZworcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQorZmk7IGRvbmUKK3JtIC1mIGNvbmZ0ZXN0LnMqCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9jb25maWd1cmUuaW4gYi9zaW0vdGVzdHN1aXRlL20zMnItZWxmL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzQzODllCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9jb25maWd1cmUuaW4KQEAgLTAsMCArMSwxOSBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK2RubCBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgZnJhZ21lbnQgdGhhdCBzdXBwbGllcyB0aGUgaW5mb3JtYXRpb24KK2RubCBuZWNlc3NhcnkgdG8gdGFpbG9yIGEgdGVtcGxhdGUgY29uZmlndXJlIHNjcmlwdCBpbnRvIHRoZSBjb25maWd1cmUKK2RubCBzY3JpcHQgYXBwcm9wcmlhdGUgZm9yIHRoaXMgZGlyZWN0b3J5LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIGNoZWNrCitkbmwgYW55IGV4aXN0aW5nIGNvbmZpZ3VyZSBzY3JpcHQuCisKK0FDX1BSRVJFUSgyLjUpCitkbmwgRklYTUUgLSB0aGluayBvZiBhIHRydWx5IHVuaXEgZmlsZSB0byB0aGlzIGRpcmVjdG9yeQorQUNfSU5JVChNYWtlZmlsZS5pbikKKworQ0M9JHtDQy1jY30KK0FDX1NVQlNUKENDKQorQUNfQ09ORklHX0FVWF9ESVIoYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLikKK0FDX0NBTk9OSUNBTF9TWVNURU0KKworQUNfU1VCU1QodGFyZ2V0X2NwdSkKKworCitBQ19PVVRQVVQoTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL20zMnItZWxmL2V4aXQ0Ny5zIGIvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9leGl0NDcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjgxNGUzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9leGl0NDcucwpAQCAtMCwwICsxLDcgQEAKKwk7OyBSZXR1cm4gd2l0aCBleGl0IGNvZGUgNDcuCisKKwkuZ2xvYmwgX3N0YXJ0Citfc3RhcnQ6CisJbGRpOCByMSwjNDcKKwlsZGk4IHIwLCMxCisJdHJhcCAjMApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9oZWxsby5zIGIvc2ltL3Rlc3RzdWl0ZS9tMzJyLWVsZi9oZWxsby5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MTY5MzQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL20zMnItZWxmL2hlbGxvLnMKQEAgLTAsMCArMSwxNyBAQAorCisJLmdsb2JsIF9zdGFydAorX3N0YXJ0OgorCis7IHdyaXRlIChoZWxsbyB3b3JsZCkKKwlsZGk4IHIzLCMxNAorCWxkMjQgcjIsI2hlbGxvCisJbGRpOCByMSwjMQorCWxkaTggcjAsIzUKKwl0cmFwICMwCis7IGV4aXQgKDApCisJbGRpOCByMSwjMAorCWxkaTggcjAsIzEKKwl0cmFwICMwCisKK2xlbmd0aDoJLmxvbmcgMTQKK2hlbGxvOgkuYXNjaWkgIkhlbGxvIFdvcmxkIVxyXG4iCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL20zMnItZWxmL2xvb3AucyBiL3NpbS90ZXN0c3VpdGUvbTMyci1lbGYvbG9vcC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNGNmYjQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL20zMnItZWxmL2xvb3AucwpAQCAtMCwwICsxLDIgQEAKKwkuZ2xvYmwgX3N0YXJ0Citfc3RhcnQ6CWJyYSBfc3RhcnQKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvbWlwczY0ZWwtZWxmL0NoYW5nZUxvZyBiL3NpbS90ZXN0c3VpdGUvbWlwczY0ZWwtZWxmL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDFhZDIyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9taXBzNjRlbC1lbGYvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNSBAQAorVGh1IEF1ZyAxMyAyMjozNzoyOSBFRFQgMTk5OCAgSmltIExlbWtlICA8amxlbWtlQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjoKKwlDcmVhdGUgYSBtaW5pbWFsIHRlc3RzdWl0ZS4KKwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9taXBzNjRlbC1lbGYvTWFrZWZpbGUuaW4gYi9zaW0vdGVzdHN1aXRlL21pcHM2NGVsLWVsZi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODE5MWFlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9taXBzNjRlbC1lbGYvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxNzEgQEAKKyMgTWFrZWZpbGUgZm9yIHJlZ3Jlc3Npb24gdGVzdGluZyB0aGUgR05VIGRlYnVnZ2VyLgorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisjIEdEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCitWUEFUSCA9IEBzcmNkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3Jjcm9vdCA9ICQoc3JjZGlyKS8uLgorCitwcmVmaXggPSBAcHJlZml4QAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACisKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitidWlsZF9jYW5vbmljYWwgPSBAYnVpbGRACitob3N0X2Nhbm9uaWNhbCA9IEBob3N0QAordGFyZ2V0X2Nhbm9uaWNhbCA9IEB0YXJnZXRACit0YXJnZXRfY3B1ID0gQHRhcmdldF9jcHVACisKKworU0hFTEwgPSAvYmluL3NoCitTVUJESVJTID0gQHN1YmRpcnNACitSUEFUSF9FTlZWQVIgPSBAUlBBVEhfRU5WVkFSQAorCitFWFBFQ1QgPSBgaWYgWyAtZiAkJHtyb290bWV9Ly4uLy4uL2V4cGVjdC9leHBlY3QgXSA7IHRoZW4gXAorICAgICAgICAgIGVjaG8gJCR7cm9vdG1lfS8uLi8uLi9leHBlY3QvZXhwZWN0IDsgXAorICAgICAgICAgIGVsc2UgZWNobyBleHBlY3QgOyBmaWAKKworUlVOVEVTVCA9ICQoUlVOVEVTVF9GT1JfVEFSR0VUKQorCitSVU5URVNURkxBR1MgPQorCitSVU5URVNUX0ZPUl9UQVJHRVQgPSBgXAorICBpZiBbIC1mICQke3NyY2Rpcn0vLi4vLi4vLi4vZGVqYWdudS9ydW50ZXN0IF07IHRoZW4gXAorICAgIGVjaG8gJCR7c3JjZGlyfS8uLi8uLi8uLi9kZWphZ251L3J1bnRlc3Q7IFwKKyAgZWxzZSBcCisgICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF07IHRoZW4gXAorICAgICAgZWNobyBydW50ZXN0OyBcCisgICAgZWxzZSBcCisgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBydW50ZXN0IHwgc2VkIC1lICcnICQkdDsgXAorICAgIGZpOyBcCisgIGZpYAorCisKK0FTX0ZPUl9UQVJHRVQgPSBgXAorICBpZiBbIC14IC4uLy4uLy4uL2dhcy9hcy1uZXcgXTsgdGhlbiBcCisgICAgZWNobyAuLi8uLi8uLi9nYXMvYXMtbmV3IDsgXAorICBlbHNlIFwKKyAgICBlY2hvICQodGFyZ2V0X2FsaWFzKS1hcyA7IFwKKyAgZmlgCisKK0xEX0ZPUl9UQVJHRVQgPSBgXAorICBpZiBbIC14IC4uLy4uLy4uL2xkL2xkLW5ldyBdOyB0aGVuIFwKKyAgICBlY2hvIC4uLy4uLy4uL2xkL2xkLW5ldyA7IFwKKyAgZWxzZSBcCisgICAgZWNobyAkKHRhcmdldF9hbGlhcyktbGQgOyBcCisgIGZpYAorCitSVU5fRk9SX1RBUkdFVCA9IGBcCisgIGlmIFsgLXggLi4vLi4vLi4vc2ltL21pcHMvcnVuIF07IHRoZW4gXAorICAgIGVjaG8gLi4vLi4vLi4vc2ltL21pcHMvcnVuIDsgXAorICBlbHNlIFwKKyAgICBlY2hvICQodGFyZ2V0X2FsaWFzKS1ydW4gOyBcCisgIGZpYAorCitURVNUUyA9IAorCitjaGVjazogc2FuaXR5ICQoVEVTVFMpCitzYW5pdHk6CisJQGV2YWwgZWNobyBBU19GT1JfVEFSR0VUID0gJChBU19GT1JfVEFSR0VUKQorCUBldmFsIGVjaG8gTERfRk9SX1RBUkdFVCA9ICQoTERfRk9SX1RBUkdFVCkKKwlAZXZhbCBlY2hvIFJVTl9GT1JfVEFSR0VUID0gJChSVU5fRk9SX1RBUkdFVCkKKworCisKKyMgUnVsZXMgZm9yIHJ1bm5pbmcgYWxsIHRoZSB0ZXN0cywgcHV0IGludG8gdGhyZWUgdHlwZXMKKyMgZXhpdCBzdWNjZXNzLCBleGl0IGZhaWwsIHByaW50ICJIZWxsbyBXb3JsZCIKKworLnUubG9nOgorCXV1ZGVjb2RlICQqLnUKKwkkKFJVTl9GT1JfVEFSR0VUKSAkKiA+ICQqLmxvZworCisKKyMgUnVsZXMgZm9yIHJ1bm5pbmcgdGhlIHRlc3RzCisKKy5TVUZGSVhFUzogLnUgLnV1ZSAub2sgLm9rIC5ydW4gLmhpIC5rbyAua28KKy5ydW4ub2s6CisJcm0gLWYgdG1wLSQqICQqLm9rCisJdWxpbWl0IC10IDUgOyAkKFJVTl9GT1JfVEFSR0VUKSAkKi5ydW4gPiB0bXAtJCoKKwltdiB0bXAtJCogJCoub2sKKy5ydW4uaGk6CisJcm0gLWYgdG1wLSQqICQqLmhpIGRpZmYtJCoKKwl1bGltaXQgLXQgNSA7ICQoUlVOX0ZPUl9UQVJHRVQpICQqLnJ1biA+IHRtcC0kKgorCWVjaG8gJ0hlbGxvIFdvcmxkIScgfCBkaWZmIC0gdG1wLSQqID4gZGlmZi0kKgorCWNhdCB0bXAtJCogZGlmZi0kKiA+ICQqLmhpCisucnVuLmtvOgorCXJtIC1mIHRtcC0kKiAkKi5rbworCXNldCArZSA7IFwKKwl1bGltaXQgLXQgNSA7ICQoUlVOX0ZPUl9UQVJHRVQpICQqLnJ1biA+IHRtcC0kKiA7IFwKKwlpZiBbICQkPyAtZXEgNDcgXSA7IHRoZW4gXAorCSAgZXhpdCAwIDsgXAorCWVsc2UgXAorCSAgZXhpdCAxIDsgXAorCWZpCisJbXYgdG1wLSQqICQqLmtvCisKKworIyBSdWxlcyBmb3IgYnVpbGRpbmcgYWxsIHRoZSB0ZXN0cyBhbmQgcGFja2luZyB0aGVtIGludG8KKyMgdXVlbmNvZGVkIGZpbGVzLgorCisucnVuLnU6CisJdXVlbmNvZGUgPCAkKi5ydW4gJCoucnVuID4gJCoudQorCUBlY2hvICJNb3ZlICQqLnUgJCoudXVlIgorLnV1ZS5ydW46CisJdXVkZWNvZGUgJChzcmNkaXIpLyQqLnV1ZQorLm8ucnVuOgorCSQoTERfRk9SX1RBUkdFVCkgLVR0ZXh0IDB4YTAwMjAwMDAgLW8gJCoucnVuICQqLm8KKy5zLm86CisJJChBU19GT1JfVEFSR0VUKSAtSSAkKHNyY2RpcikgJChzcmNkaXIpLyQqLnMgLW8gJCoubworCisKKyMKKyMgU3RhbmRhcmQKKyMKK2NsZWFuIG1vc3RseWNsZWFuOgorCS1ybSAtZiAqfiBjb3JlICoubyBhLm91dCAqLnggKi5ncnQgKi5ydW4gdG1wLSogZGlmZi0qCisJcm0gLWYgJChURVNUUykKKyMJaWYgWyB4IiR7U1VCRElSU30iICE9IHggXSA7IHRoZW4gXAorIwkgICAgZm9yIGRpciBpbiAke1NVQkRJUlN9OyBcCisjCSAgICBkbyBcCisjCQkgICAgZWNobyAiJCRkaXI6IjsgXAorIwkJICAgIGlmIFsgLWQgJCRkaXIgXTsgdGhlbiBcCisjCQkJICAgIChjZCAkJGRpcjsgJChNQUtFKSBjbGVhbik7IFwKKyMJCSAgICBmaTsgXAorIwkgICAgZG9uZSA7IFwKKyMJZWxzZSB0cnVlOyBmaQorCitkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW46IGNsZWFuCisJLXJtIC1mICp+IGNvcmUKKwktcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cyAqLWluaXQuZXhwCisJLXJtIC1mciAqLmxvZyBzdW1tYXJ5IGRldGFpbCAqLnBsb2cgKi5zdW0gKi5wc3VtIHNpdGUuKgorIwlpZiBbIHgiJHtTVUJESVJTfSIgIT0geCBdIDsgdGhlbiBcCisjCSAgICBmb3IgZGlyIGluICR7U1VCRElSU307IFwKKyMJICAgIGRvIFwKKyMJCSAgICBlY2hvICIkJGRpcjoiOyBcCisjCQkgICAgaWYgWyAtZCAkJGRpciBdOyB0aGVuIFwKKyMJCQkgICAgKGNkICQkZGlyOyAkKE1BS0UpIGRpc3RjbGVhbik7IFwKKyMJCSAgICBmaTsgXAorIwkgICAgZG9uZSA7IFwKKyMJZWxzZSB0cnVlOyBmaQorCitNYWtlZmlsZSA6IE1ha2VmaWxlLmluIGNvbmZpZy5zdGF0dXMKKwkkKFNIRUxMKSBjb25maWcuc3RhdHVzCisKK2NvbmZpZy5zdGF0dXM6IGNvbmZpZ3VyZQorCSQoU0hFTEwpIGNvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL21pcHM2NGVsLWVsZi9jb25maWd1cmUgYi9zaW0vdGVzdHN1aXRlL21pcHM2NGVsLWVsZi9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODZmMDgzNgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvbWlwczY0ZWwtZWxmL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDkwNCBAQAorIyEgL2Jpbi9zaAorCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorYWNfbWF4X2hlcmVfbGluZXM9MTIKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19wcm9nPSQwCisgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCisKKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgLiAkY2FjaGVfZmlsZQorZWxzZQorICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgPiAkY2FjaGVfZmlsZQorZmkKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworYWNfZXhlZXh0PQorYWNfb2JqZXh0PW8KK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCitDQz0ke0NDLWNjfQorCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCithY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKK2FjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisKKyMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgorIyBUaGUgaW5wdXRzIGFyZToKKyMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAorIworIyBUaGUgcnVsZXMgYXJlOgorIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKKyMgICAgc2FtZSB0aW1lLgorIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KKyMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAorIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KKyMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KKyMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCisKKyMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KKyMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KK2Nhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgorTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OworKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCisKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgoraWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjU3NTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisKK2hvc3RfYWxpYXM9JGhvc3QKK2Nhc2UgIiRob3N0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpCisgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpIDs7CisgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK2hvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAoraG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo1OTY6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1CisKK3RhcmdldF9hbGlhcz0kdGFyZ2V0CitjYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OworICBlc2FjIDs7Citlc2FjCisKK3RhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKK3RhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCit0YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAordGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjYxNDogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorCitidWlsZF9hbGlhcz0kYnVpbGQKK2Nhc2UgIiRidWlsZF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKK2J1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitidWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgorCit0ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCisgIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKKyAgICBOT05FTk9ORXMseCx4LCAmJgorICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCisKKworCisKKwordHJhcCAnJyAxIDIgMTUKK2NhdCA+IGNvbmZjYWNoZSA8PFxFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgorIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAorIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCisjIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgorIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCisjIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgorIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCisjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworRU9GCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKyhzZXQpIDI+JjEgfAorICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjEgfCBncmVwIGFjX3NwYWNlYCBpbgorICAqYWNfc3BhY2U9XCAqKQorICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCisgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICBzZWQgLW4gXAorICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKKyAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKyAgICA7OworICAqKQorICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJworICAgIDs7CisgIGVzYWMgPj4gY29uZmNhY2hlCitpZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKyMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCitmaQorCit0cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBERUZTLgorIyBQcm90ZWN0IGFnYWluc3Qgc2hlbGwgZXhwYW5zaW9uIHdoaWxlIGV4ZWN1dGluZyBNYWtlZmlsZSBydWxlcy4KKyMgUHJvdGVjdCBhZ2FpbnN0IE1ha2VmaWxlIG1hY3JvIGV4cGFuc2lvbi4KK2NhdCA+IGNvbmZ0ZXN0LmRlZnMgPDxcRU9GCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUtRFwxPVwyJWcKK3MlWyAJYH4jJF4mKigpe31cXHw7JyI8Pj9dJVxcJiVnCitzJVxbJVxcJiVnCitzJVxdJVxcJiVnCitzJVwkJSQkJWcKK0VPRgorREVGUz1gc2VkIC1mIGNvbmZ0ZXN0LmRlZnMgY29uZmRlZnMuaCB8IHRyICdcMDEyJyAnICdgCitybSAtZiBjb25mdGVzdC5kZWZzCisKKworIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis6ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9CisKK2VjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKK3JtIC1mICRDT05GSUdfU1RBVFVTCitjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorIyEgL2Jpbi9zaAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKKyMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6CisjCisjICQwICRhY19jb25maWd1cmVfYXJncworIworIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCisKK2FjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCitmb3IgYWNfb3B0aW9uCitkbworICBjYXNlICJcJGFjX29wdGlvbiIgaW4KKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKyAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUiIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCitzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCiskYWNfdnBzdWIKKyRleHRyYXN1YgorcyVAU0hFTExAJSRTSEVMTCVnCitzJUBDRkxBR1NAJSRDRkxBR1MlZworcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCitzJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKK3MlQERFRlNAJSRERUZTJWcKK3MlQExERkxBR1NAJSRMREZMQUdTJWcKK3MlQExJQlNAJSRMSUJTJWcKK3MlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworcyVAcHJlZml4QCUkcHJlZml4JWcKK3MlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKK3MlQGJpbmRpckAlJGJpbmRpciVnCitzJUBzYmluZGlyQCUkc2JpbmRpciVnCitzJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCitzJUBkYXRhZGlyQCUkZGF0YWRpciVnCitzJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCitzJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKK3MlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKK3MlQGxpYmRpckAlJGxpYmRpciVnCitzJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCitzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCitzJUBpbmZvZGlyQCUkaW5mb2RpciVnCitzJUBtYW5kaXJAJSRtYW5kaXIlZworcyVAQ0NAJSRDQyVnCitzJUBob3N0QCUkaG9zdCVnCitzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCitzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKK3MlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZworcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKK3MlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCitzJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCitzJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCitzJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZworcyVAYnVpbGRAJSRidWlsZCVnCitzJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKK3MlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCitzJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZworcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCisKK0NFT0YKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCisKKyMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCisjIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KK2FjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCithY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCithY19tb3JlX2xpbmVzPToKK2FjX3NlZF9jbWRzPSIiCit3aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KKyAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCisgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBmaQorICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCisgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZWxzZQorICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCisgICAgZmkKKyAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKyAgICBhY19iZWc9JGFjX2VuZAorICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgYWNfc2VkX2NtZHM9Y2F0CitmaQorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitDT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKworICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKKyAgcm0gLWYgIiRhY19maWxlIgorICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorIyAkY29uZmlndXJlX2lucHV0IiA7OworICAqKSBhY19jb21zdWI9IDs7CisgIGVzYWMKKworICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBzZWQgLWUgIiRhY19jb21zdWIKK3MlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCitzJUBzcmNkaXJAJSRzcmNkaXIlZworcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQorZmk7IGRvbmUKK3JtIC1mIGNvbmZ0ZXN0LnMqCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9taXBzNjRlbC1lbGYvY29uZmlndXJlLmluIGIvc2ltL3Rlc3RzdWl0ZS9taXBzNjRlbC1lbGYvY29uZmlndXJlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDM4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL21pcHM2NGVsLWVsZi9jb25maWd1cmUuaW4KQEAgLTAsMCArMSwxOSBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK2RubCBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgZnJhZ21lbnQgdGhhdCBzdXBwbGllcyB0aGUgaW5mb3JtYXRpb24KK2RubCBuZWNlc3NhcnkgdG8gdGFpbG9yIGEgdGVtcGxhdGUgY29uZmlndXJlIHNjcmlwdCBpbnRvIHRoZSBjb25maWd1cmUKK2RubCBzY3JpcHQgYXBwcm9wcmlhdGUgZm9yIHRoaXMgZGlyZWN0b3J5LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIGNoZWNrCitkbmwgYW55IGV4aXN0aW5nIGNvbmZpZ3VyZSBzY3JpcHQuCisKK0FDX1BSRVJFUSgyLjUpCitkbmwgRklYTUUgLSB0aGluayBvZiBhIHRydWx5IHVuaXEgZmlsZSB0byB0aGlzIGRpcmVjdG9yeQorQUNfSU5JVChNYWtlZmlsZS5pbikKKworQ0M9JHtDQy1jY30KK0FDX1NVQlNUKENDKQorQUNfQ09ORklHX0FVWF9ESVIoYGNkICRzcmNkaXI7cHdkYC8uLi8uLi8uLikKK0FDX0NBTk9OSUNBTF9TWVNURU0KKworQUNfU1VCU1QodGFyZ2V0X2NwdSkKKworCitBQ19PVVRQVVQoTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FkZC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FkZC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwOWRmMQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYWRkLmNncwpAQCAtMCwwICsxLDU1IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGFkZCAkUmosJFJpLCBhZGQgJHU0LCRSagorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBhZGQKK2FkZDoKKwk7IFRlc3QgYWRkICRSaiwkUmkKKwltdmlfaF9nciAgIAkxLHI3CisJbXZpX2hfZ3IgICAJMixyOAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJYWRkICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAwIDAgMAorCXRlc3RfaF9nciAgCTMscjgKKworCW12aV9oX2dyICAgCTB4N2ZmZmZmZmYscjcKKwltdmlfaF9nciAgIAkxLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlhZGQJCXI3LHI4CisJdGVzdF9jYwkJMSAwIDEgMAorCXRlc3RfaF9nciAgCTB4ODAwMDAwMDAscjgKKworCXNldF9jYyAgICAgICAgICAweDA4CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJYWRkCQlyOCxyOAorCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkwLHI4CisKKwk7IFRlc3QgYWRkICR1NFJpCisJbXZpX2hfZ3IgICAJNCxyOAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJYWRkCQkwLHI4CisJdGVzdF9jYwkJMCAwIDAgMAorCXRlc3RfaF9nciAgCTQscjgKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWFkZAkJMSxyOAorCXRlc3RfY2MJCTAgMCAwIDAKKwl0ZXN0X2hfZ3IgIAk1LHI4CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlhZGQJCTE1LHI4CisJdGVzdF9jYwkJMCAwIDAgMAorCXRlc3RfaF9nciAgCTIwLHI4CisJbXZpX2hfZ3IgICAJMHg3ZmZmZmZmZixyOAk7IHRlc3QgbmVnIGFuZCBvdmVyZmxvdyBiaXRzCisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlhZGQJCTEscjgKKwl0ZXN0X2NjCQkxIDAgMSAwCisJdGVzdF9oX2dyICAJMHg4MDAwMDAwMCxyOAorCXNldF9jYyAgICAgICAgICAweDA4CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJYWRkCQlyOCxyOAkJOyB0ZXN0IHplcm8sIGNhcnJ5IGFuZCBvdmVyZmxvdyBiaXRzCisJdGVzdF9jYwkJMCAxIDEgMTsKKwl0ZXN0X2hfZ3IgIAkwLHI4CisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FkZC5tcyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYWRkLm1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYTY4NjgKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FkZC5tcwpAQCAtMCwwICsxLDEzIEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGFkZCAkUmosJFJpCisjIGNwdSB7fQorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGFkZAorYWRkOgorCWFkZCBhYyxhYworCWZhaWwKKwlFWElUIDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYWRkMi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FkZDIuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NmFjZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FkZDIuY2dzCkBAIC0wLDAgKzEsNDMgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgYWRkMiAkbTQsJFJpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGFkZAorYWRkOgorCW12aV9oX2dyICAgCTMwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGUJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWFkZDIgICAgICAgCS0xNixyOAk7IE1heCB2YWx1ZSBvZiBpbW1lZGlhdGUgZmllbGQKKwl0ZXN0X2NjCQkwIDAgMCAxCisJdGVzdF9oX2dyICAJMTQscjgKKworCXNldF9jYyAgICAgICAgICAweDBlCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlhZGQyICAgICAgIAktMyxyOAk7IE1pZCB2YWx1ZSBvZiBpbW1lZGlhdGUgZmllbGQKKwl0ZXN0X2NjCQkwIDAgMCAxCisJdGVzdF9oX2dyICAJMTEscjgKKworCXNldF9jYyAgICAgICAgICAweDBlCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlhZGQyICAgICAgIAktMSxyOAk7IE1pbiB2YWx1ZSBvZiBpbW1lZGlhdGUgZmllbGQKKwl0ZXN0X2NjCQkwIDAgMCAxCisJdGVzdF9oX2dyICAJMTAscjgKKworCXNldF9jYyAgICAgICAgICAweDBhCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlhZGQyICAgICAgIAktMTAscjgJOyBUZXN0IHplcm8gYW5kIGNhcnJ5IGJpdHMKKwl0ZXN0X2NjCQkwIDEgMCAxCisJdGVzdF9oX2dyICAJMCxyOAorCisJc2V0X2NjICAgICAgICAgIDB4MDcJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWFkZDIgICAgICAgCS0xNixyOAk7IFRlc3QgbmVnYXRpdmUgYml0CisJdGVzdF9jYwkJMSAwIDAgMAorCXRlc3RfaF9nciAgCS0xNixyOAorCisJbXZpX2hfZ3IJMHg4MDAwMDAwMCxyOAorCXNldF9jYyAgICAgICAgICAweDBjCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlhZGQyICAgICAgIAktMSxyOAk7IFRlc3Qgb3ZlcmZsb3cgYml0CisJdGVzdF9jYwkJMCAwIDEgMQorCXRlc3RfaF9nciAgCTB4N2ZmZmZmZmYscjgKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYWRkYy5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FkZGMuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzU0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FkZGMuY2dzCkBAIC0wLDAgKzEsNTAgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgYWRkYyAkUmosJFJpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGFkZAorYWRkOgorCW12aV9oX2dyICAgCTEscjcKKwltdmlfaF9nciAgIAkyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgTWFrZSBzdXJlIGNhcnJ5IGJpdCBpcyBvZmYKKwlhZGRjICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAwIDAgMAorCXRlc3RfaF9nciAgCTMscjgKKworCW12aV9oX2dyICAgCTB4N2ZmZmZmZmYscjcKKwltdmlfaF9nciAgIAkxLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDQJCTsgTWFrZSBzdXJlIGNhcnJ5IGJpdCBpcyBvZmYKKwlhZGRjCQlyNyxyOAorCXRlc3RfY2MJCTEgMCAxIDAKKwl0ZXN0X2hfZ3IgIAkweDgwMDAwMDAwLHI4CisKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBNYWtlIHN1cmUgY2FycnkgYml0IGlzIG9mZgorCWFkZGMJCXI4LHI4CisJdGVzdF9jYwkJMCAxIDEgMQorCXRlc3RfaF9nciAgCTAscjgKKworCW12aV9oX2dyICAgCTEscjcKKwltdmlfaF9nciAgIAkyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgTWFrZSBzdXJlIGNhcnJ5IGJpdCBpcyBvbgorCWFkZGMgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDAgMCAwCisJdGVzdF9oX2dyICAJNCxyOAorCisJbXZpX2hfZ3IgICAJMHg3ZmZmZmZmZixyNworCW12aV9oX2dyICAgCTAscjgKKwlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBNYWtlIHN1cmUgY2FycnkgYml0IGlzIG9uCisJYWRkYwkJcjcscjgKKwl0ZXN0X2NjCQkxIDAgMSAwCisJdGVzdF9oX2dyICAJMHg4MDAwMDAwMCxyOAorCisJbXZpX2hfZ3IgICAJMHg3ZmZmZmZmZixyNworCXNldF9jYyAgICAgICAgICAweDBiCQk7IE1ha2Ugc3VyZSBjYXJyeSBiaXQgaXMgb24KKwlhZGRjCQlyNyxyOAorCXRlc3RfY2MJCTAgMSAwIDE7CisJdGVzdF9oX2dyICAJMCxyOAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hZGRuLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYWRkbi5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2MzhkNgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYWRkbi5jZ3MKQEAgLTAsMCArMSw1NSBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBhZGRuICRSaiwkUmksIGFkZG4gJHU0LCRSagorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBhZGRuCithZGRuOgorCTsgVGVzdCBhZGRuICRSaiwkUmkKKwltdmlfaF9nciAgIAkxLHI3CisJbXZpX2hfZ3IgICAJMixyOAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIG5vcm1hbCByZXN1bHQKKwlhZGRuICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAgCTMscjgKKworCW12aV9oX2dyICAgCTB4N2ZmZmZmZmYscjcKKwltdmlfaF9nciAgIAkxLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2Ygbm9ybWFsIHJlc3VsdAorCWFkZG4JCXI3LHI4CisJdGVzdF9jYwkJMCAxIDAgMQorCXRlc3RfaF9nciAgCTB4ODAwMDAwMDAscjgKKworCXNldF9jYyAgICAgICAgICAweDA4CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIG5vcm1hbCByZXN1bHQKKwlhZGRuCQlyOCxyOAorCXRlc3RfY2MJCTEgMCAwIDAKKwl0ZXN0X2hfZ3IgIAkwLHI4CisKKwk7IFRlc3QgYWRkbiAkdTRSaQorCW12aV9oX2dyICAgCTQscjgKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBub3JtYWwgcmVzdWx0CisJYWRkbgkJMCxyOAorCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0X2hfZ3IgIAk0LHI4CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2Ygbm9ybWFsIHJlc3VsdAorCWFkZG4JCTEscjgKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX2dyICAJNSxyOAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIG5vcm1hbCByZXN1bHQKKwlhZGRuCQkxNSxyOAorCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkyMCxyOAorCW12aV9oX2dyICAgCTB4N2ZmZmZmZmYscjgJOyB0ZXN0IG5lZyBhbmQgb3ZlcmZsb3cgYml0cworCXNldF9jYyAgICAgICAgICAweDA1CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIG5vcm1hbCByZXN1bHQKKwlhZGRuCQkxLHI4CisJdGVzdF9jYwkJMCAxIDAgMQorCXRlc3RfaF9nciAgCTB4ODAwMDAwMDAscjgKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBub3JtYWwgcmVzdWx0CisJYWRkbgkJcjgscjgJCTsgdGVzdCB6ZXJvLCBjYXJyeSBhbmQgb3ZlcmZsb3cgYml0cworCXRlc3RfY2MJCTEgMCAwIDA7CisJdGVzdF9oX2dyICAJMCxyOAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hZGRuMi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FkZG4yLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTI1YmFmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hZGRuMi5jZ3MKQEAgLTAsMCArMSw0MyBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBhZGRuMiAkbTQsJFJpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGFkZAorYWRkOgorCW12aV9oX2dyICAgCTMwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGUJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBub3JtYWwgcmVzdWx0CisJYWRkbjIgICAgICAgCS0xNixyOAk7IE1heCB2YWx1ZSBvZiBpbW1lZGlhdGUgZmllbGQKKwl0ZXN0X2NjCQkxIDEgMSAwCisJdGVzdF9oX2dyICAJMTQscjgKKworCXNldF9jYyAgICAgICAgICAweDBlCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2Ygbm9ybWFsIHJlc3VsdAorCWFkZG4yICAgICAgIAktMyxyOAk7IE1pZCB2YWx1ZSBvZiBpbW1lZGlhdGUgZmllbGQKKwl0ZXN0X2NjCQkxIDEgMSAwCisJdGVzdF9oX2dyICAJMTEscjgKKworCXNldF9jYyAgICAgICAgICAweDBlCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2Ygbm9ybWFsIHJlc3VsdAorCWFkZG4yICAgICAgIAktMSxyOAk7IE1pbiB2YWx1ZSBvZiBpbW1lZGlhdGUgZmllbGQKKwl0ZXN0X2NjCQkxIDEgMSAwCisJdGVzdF9oX2dyICAJMTAscjgKKworCXNldF9jYyAgICAgICAgICAweDBhCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2Ygbm9ybWFsIHJlc3VsdAorCWFkZG4yICAgICAgIAktMTAscjgJOyBUZXN0IHplcm8gYW5kIGNhcnJ5IGJpdHMKKwl0ZXN0X2NjCQkxIDAgMSAwCisJdGVzdF9oX2dyICAJMCxyOAorCisJc2V0X2NjICAgICAgICAgIDB4MDcJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBub3JtYWwgcmVzdWx0CisJYWRkbjIgICAgICAgCS0xNixyOAk7IFRlc3QgbmVnYXRpdmUgYml0CisJdGVzdF9jYwkJMCAxIDEgMQorCXRlc3RfaF9nciAgCS0xNixyOAorCisJbXZpX2hfZ3IJMHg4MDAwMDAwMCxyOAorCXNldF9jYyAgICAgICAgICAweDBjCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2Ygbm9ybWFsIHJlc3VsdAorCWFkZG4yICAgICAgIAktMSxyOAk7IFRlc3Qgb3ZlcmZsb3cgYml0CisJdGVzdF9jYwkJMSAxIDAgMAorCXRlc3RfaF9nciAgCTB4N2ZmZmZmZmYscjgKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYWRkc3AuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hZGRzcC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1YmMzNgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYWRkc3AuY2dzCkBAIC0wLDAgKzEsMzEgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgYWRkc3AgJHMxMAorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBhZGRzcAorYWRkc3A6CisJOyBUZXN0IGFkZHNwICRzMTAKKwltdnJfaF9nciAgIAlzcCxyNwkJCTsgc2F2ZSBzdGFjayBwb2ludGVyIHBlcm1hbmVudGx5CisJbXZyX2hfZ3IJc3AscjgJCQk7IFNoYWRvdyB1cGRhdGVkIHNwCisJc2V0X2NjCTB4MGYJCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCWFkZHNwICAgICAgCTUwOAorCXRlc3RfY2MJCTEgMSAxIDEKKwlpbmNpX2hfZ3IJNTA4LHI4CisJdGVzdHJfaF9ncglyOCxzcAorCisJc2V0X2NjCTB4MGUJCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCWFkZHNwICAgICAgCTAKKwl0ZXN0X2NjCQkxIDEgMSAwCisJdGVzdHJfaF9ncglyOCxzcAorCisJc2V0X2NjCTB4MGQJCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCWFkZHNwICAgICAgCS01MTIKKwl0ZXN0X2NjCQkxIDEgMCAxCisJaW5jaV9oX2dyCS01MTIscjgKKwl0ZXN0cl9oX2dyCXI4LHNwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FsbGluc24uZXhwIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hbGxpbnNuLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzNkNTEyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hbGxpbnNuLmV4cApAQCAtMCwwICsxLDE5IEBACisjIEZSMzAgc2ltdWxhdG9yIHRlc3RzdWl0ZS4KKworaWYgW2lzdGFyZ2V0IGZyMzAqLSotKl0geworICAgICMgbG9hZCBzdXBwb3J0IHByb2NzCisgICAgIyBsb2FkX2xpYiBjZ2VuLmV4cAorCisgICAgIyBhbGwgbWFjaGluZXMKKyAgICBzZXQgYWxsX21hY2hzICJmcjMwIgorCisgICAgZm9yZWFjaCBzcmMgW2xzb3J0IFtnbG9iIC1ub2NvbXBsYWluICRzcmNkaXIvJHN1YmRpci8qLmNnc11dIHsKKwkjIElmIHdlJ3JlIG9ubHkgdGVzdGluZyBzcGVjaWZpYyBmaWxlcyBhbmQgdGhpcyBpc24ndCBvbmUgb2YgdGhlbSwKKwkjIHNraXAgaXQuCisJaWYgIVtydW50ZXN0X2ZpbGVfcCAkcnVudGVzdHMgJHNyY10geworCSAgICBjb250aW51ZQorCX0KKworCXJ1bl9zaW1fdGVzdCAkc3JjICRhbGxfbWFjaHMKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FuZC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FuZC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkYjZmZAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYW5kLmNncwpAQCAtMCwwICsxLDUxIEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGFuZCAkUmosJFJpLCBhbmQgJFJqLEAkUmkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgYW5kCithbmQ6CisJOyBUZXN0IGFuZCAkUmosJFJpCisJbXZpX2hfZ3IgICAJMHhhYWFhYWFhYSxyNworCW12aV9oX2dyICAgCTB4NTU1NTU1NTUscjgKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWFuZCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkwLHI4CisKKwltdmlfaF9nciAgIAkweGZmZmYwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlhbmQJCXI3LHI4CisJdGVzdF9jYwkJMSAwIDAgMAorCXRlc3RfaF9nciAgCTB4YWFhYTAwMDAscjgKKworCW12aV9oX2dyICAgCTB4ZmZmZixyOAorCXNldF9jYyAgICAgICAgICAweDBkCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJYW5kCQlyNyxyOAorCXRlc3RfY2MJCTAgMCAwIDEKKwl0ZXN0X2hfZ3IgIAkweGFhYWEscjgKKworCTsgVGVzdCBhbmQgJFJqLEAkUmkKKwltdmlfaF9nciAgIAkweGFhYWFhYWFhLHI3CisJbXZpX2hfbWVtICAJMHg1NTU1NTU1NSxzcAorCXNldF9jYyAgICAgICAgICAweDBiCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJYW5kICAgICAgCXI3LEBzcAorCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfbWVtIAkwLHNwCisKKwltdmlfaF9tZW0gIAkweGZmZmYwMDAwLHNwCisJc2V0X2NjICAgICAgICAgIDB4MDQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlhbmQJCXI3LEBzcAorCXRlc3RfY2MJCTEgMCAwIDAKKwl0ZXN0X2hfbWVtIAkweGFhYWEwMDAwLHNwCisKKwltdmlfaF9tZW0gIAkweGZmZmYsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWFuZAkJcjcsQHNwCisJdGVzdF9jYwkJMCAwIDAgMQorCXRlc3RfaF9tZW0gCTB4YWFhYSxzcAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hbmRiLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYW5kYi5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAxZDQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYW5kYi5jZ3MKQEAgLTAsMCArMSwzMSBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBhbmRiICRSaixAJFJpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGFuZGIKK2FuZGI6CisJOyBUZXN0IGFuZGIgJFJqLEAkUmkKKwltdmlfaF9nciAgIAkweGFhYWFhYWFhLHI3CisJbXZpX2hfbWVtICAJMHg1NTU1NTU1NSxzcAorCXNldF9jYyAgICAgICAgICAweDBiCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJYW5kYiAgICAgIAlyNyxAc3AKKwl0ZXN0X2NjCQkwIDEgMSAxCisJdGVzdF9oX21lbSAJMHgwMDU1NTU1NSxzcAorCisJbXZpX2hfbWVtICAJMHhmZmZmZmZmZixzcAorCXNldF9jYyAgICAgICAgICAweDA0CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJYW5kYgkJcjcsQHNwCisJdGVzdF9jYwkJMSAwIDAgMAorCXRlc3RfaF9tZW0gCTB4YWFmZmZmZmYsc3AKKworCW12aV9oX21lbSAgCTB4MGZmZmZmZmYsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWFuZGIJCXI3LEBzcAorCXRlc3RfY2MJCTAgMCAwIDEKKwl0ZXN0X2hfbWVtIAkweDBhZmZmZmZmLHNwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FuZGNjci5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FuZGNjci5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4Zjk5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYW5kY2NyLmNncwpAQCAtMCwwICsxLDUxIEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGFuZGNjciAkdTgKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgYW5kY2NyCithbmRjY3I6CisJc2V0X2NjCQkweDAwCisJc2V0X2kJCQkwCisJc2V0X3Nfc3lzdGVtCisJYW5kY2NyICAgICAgCTB4ZmYKKwl0ZXN0X2NjCQkwIDAgMCAwCisJdGVzdF9pCQkwCisJdGVzdF9zX3N5c3RlbQorCisJc2V0X2NjCQkweDBmCisJc2V0X2kJCQkxCisJc2V0X3NfdXNlcgorCWFuZGNjciAgICAgIAkweGZmCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaQkJMQorCXRlc3Rfc191c2VyCisKKwlzZXRfY2MJCTB4MGYKKwlzZXRfaQkJCTEKKwlzZXRfc191c2VyCisJYW5kY2NyICAgICAgCTB4YWEKKwl0ZXN0X2NjCQkxIDAgMSAwCisJdGVzdF9pCQkwCisJdGVzdF9zX3VzZXIKKworCXNldF9jYwkJMHgwZgorCXNldF9pCQkJMQorCXNldF9zX3VzZXIKKwlhbmRjY3IgICAgICAJMHhjMAorCXRlc3RfY2MJCTAgMCAwIDAKKwl0ZXN0X2kJCTAKKwl0ZXN0X3Nfc3lzdGVtCisKKwlzZXRfY2MJCTB4MGYKKwlzZXRfaQkJCTEKKwlzZXRfc191c2VyCisJYW5kY2NyICAgICAgCTB4M2YJCTsgbm8gZWZmZWN0CisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaQkJMQorCXRlc3Rfc191c2VyCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FuZGguY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hbmRoLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTcyZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hbmRoLmNncwpAQCAtMCwwICsxLDMxIEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGFuZGggJFJqLEAkUmkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgYW5kaAorYW5kaDoKKwk7IFRlc3QgYW5kaCAkUmosQCRSaQorCW12aV9oX2dyICAgCTB4YWFhYWFhYWEscjcKKwltdmlfaF9tZW0gIAkweDU1NTU1NTU1LHNwCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlhbmRoICAgICAgCXI3LEBzcAorCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfbWVtIAkweDAwMDA1NTU1LHNwCisKKwltdmlfaF9tZW0gIAkweGZmZmZmZmZmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MDQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlhbmRoCQlyNyxAc3AKKwl0ZXN0X2NjCQkxIDAgMCAwCisJdGVzdF9oX21lbSAJMHhhYWFhZmZmZixzcAorCisJbXZpX2hfbWVtICAJMHgwMGZmZmZmZixzcAorCXNldF9jYyAgICAgICAgICAweDBkCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJYW5kaAkJcjcsQHNwCisJdGVzdF9jYwkJMCAwIDAgMQorCXRlc3RfaF9tZW0gCTB4MDBhYWZmZmYsc3AKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYXNyLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYXNyLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzgzZDQxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9hc3IuY2dzCkBAIC0wLDAgKzEsNjUgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgYXNyICRSaiwkUmksIGFzciAkdTQsJFJqCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGFzcgorYXNyOgorCTsgVGVzdCBhc3IgJFJqLCRSaQorCW12aV9oX2dyICAgCTB4ZGVhZGJlZTAscjcJOyBTaGlmdCBieSAwCisJbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyOAorCXNldF9jYyAgICAgICAgICAweDA1CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJYXNyICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMSAwIDAgMAorCXRlc3RfaF9nciAgCTB4ODAwMDAwMDAscjgKKworCW12aV9oX2dyICAgCTB4ZGVhZGJlZTEscjcJOyBTaGlmdCBieSAxCisJbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyOAorCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJYXNyICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMSAwIDEgMAorCXRlc3RfaF9nciAgCTB4YzAwMDAwMDAscjgKKworCW12aV9oX2dyICAgCTB4ZGVhZGJlZmYscjcJOyBTaGlmdCBieSAzMQorCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWFzciAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTEgMCAxIDAKKwl0ZXN0X2hfZ3IgIAktMSxyOAorCisJbXZpX2hfZ3IgICAJMHhkZWFkYmVmZixyNwk7IGNsZWFyIHJlZ2lzdGVyCisJbXZpX2hfZ3IgICAJMHg0MDAwMDAwMCxyOAorCXNldF9jYyAgICAgICAgICAweDBhCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJYXNyICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAxIDEgMQorCXRlc3RfaF9nciAgCTB4MDAwMDAwMDAscjgKKworCTsgVGVzdCBhc3IgJHU0UmkKKwltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlhc3IgICAgICAJMCxyOAorCXRlc3RfY2MJCTEgMCAwIDAKKwl0ZXN0X2hfZ3IgIAkweDgwMDAwMDAwLHI4CisKKwltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlhc3IgICAgICAJMSxyOAorCXRlc3RfY2MJCTEgMCAxIDAKKwl0ZXN0X2hfZ3IgIAkweGMwMDAwMDAwLHI4CisKKwltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlhc3IgICAgICAJMTUscjgKKwl0ZXN0X2NjCQkxIDAgMSAwCisJdGVzdF9oX2dyICAJMHhmZmZmMDAwMCxyOAorCisJbXZpX2hfZ3IgICAJMHgwMDAwNDAwMCxyOAorCXNldF9jYyAgICAgICAgICAweDBhCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJYXNyICAgICAgCTE1LHI4CisJdGVzdF9jYwkJMCAxIDEgMQorCXRlc3RfaF9nciAgCTB4MDAwMDAwMDAscjgKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYXNyMi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FzcjIuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NGU0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2FzcjIuY2dzCkBAIC0wLDAgKzEsMzYgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgYXNyMiAkdTQsJFJqCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGFzcjIKK2FzcjI6CisJOyBUZXN0IGFzcjIgJHU0UmkKKwltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlhc3IyICAgICAgCTAscjgKKwl0ZXN0X2NjCQkxIDAgMCAwCisJdGVzdF9oX2dyICAJMHhmZmZmODAwMCxyOAorCisJbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyOAorCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJYXNyMiAgICAgIAkxLHI4CisJdGVzdF9jYwkJMSAwIDEgMAorCXRlc3RfaF9nciAgCTB4ZmZmZmMwMDAscjgKKworCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWFzcjIgICAgICAJMTUscjgKKwl0ZXN0X2NjCQkxIDAgMSAwCisJdGVzdF9oX2dyICAJLTEscjgKKworCW12aV9oX2dyICAgCTB4NDAwMDAwMDAscjgKKwlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWFzcjIgICAgICAJMTUscjgKKwl0ZXN0X2NjCQkwIDEgMSAxCisJdGVzdF9oX2dyICAJMHgwMDAwMDAwMCxyOAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9iYW5kaC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JhbmRoLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWFiNWU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9iYW5kaC5jZ3MKQEAgLTAsMCArMSwzMCBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBiYW5kaCAkUmosQCRSaQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBiYW5kaAorYmFuZGg6CisJOyBUZXN0IGJhbmRoICRSaixAJFJpCisJbXZpX2hfbWVtICAJMHg1NTU1NTU1NSxzcAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWJhbmRoICAgICAgCTB4MGEsQHNwCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9tZW0gCTB4MDU1NTU1NTUsc3AKKworCW12aV9oX21lbSAgCTB4ZmZmZmZmZmYsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwliYW5kaAkJMHgwYSxAc3AKKwl0ZXN0X2NjCQkwIDEgMCAwCisJdGVzdF9oX21lbSAJMHhhZmZmZmZmZixzcAorCisJbXZpX2hfbWVtICAJMHhlNWZmZmZmZixzcAorCXNldF9jYyAgICAgICAgICAweDBhCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWJhbmRoCQkweDA3LEBzcAorCXRlc3RfY2MJCTEgMCAxIDAKKwl0ZXN0X2hfbWVtIAkweDY1ZmZmZmZmLHNwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JhbmRsLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmFuZGwuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDQ4MjUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JhbmRsLmNncwpAQCAtMCwwICsxLDMwIEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGJhbmRsICRSaixAJFJpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGJhbmRsCitiYW5kbDoKKwk7IFRlc3QgYmFuZGwgJFJqLEAkUmkKKwltdmlfaF9tZW0gIAkweDU1NTU1NTU1LHNwCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJYmFuZGwgICAgICAJMHgwYSxAc3AKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX21lbSAJMHg1MDU1NTU1NSxzcAorCisJbXZpX2hfbWVtICAJMHhmZmZmZmZmZixzcAorCXNldF9jYyAgICAgICAgICAweDA0CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWJhbmRsCQkweDBhLEBzcAorCXRlc3RfY2MJCTAgMSAwIDAKKwl0ZXN0X2hfbWVtIAkweGZhZmZmZmZmLHNwCisKKwltdmlfaF9tZW0gIAkweDVlZmZmZmZmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MGEJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJYmFuZGwJCTB4MDcsQHNwCisJdGVzdF9jYwkJMSAwIDEgMAorCXRlc3RfaF9tZW0gCTB4NTZmZmZmZmYsc3AKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmMuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9iYy5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUwMjYyNQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmMuY2dzCkBAIC0wLDAgKzEsMTA5IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGJjICRsYWJlbDkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgYmMKK2JjOgorCTsgVGVzdCBiYyAkbGFiZWw5CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJjCisKKwlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJjCisKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYmMKKworCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmMKKworCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAliYworCisJc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAliYworCisJc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJjCisKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJjCisKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYmMKKworCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmMKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAliYworCisJc2V0X2NjICAgICAgICAgIDB4MDQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAliYworCisJc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJjCisKKwlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJjCisKKwlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYmMKKworCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmMKKworCTsgVGVzdCBiYzpkIGxhYmVsOQorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJjOmQgMHhmCisKKwlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYmM6ZCAweGUKKworCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJjOmQgMHhkCisKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYmM6ZCAweGMKKworCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJjOmQgMHhiCisKKwlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYmM6ZCAweGEKKworCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJjOmQgMHg5CisKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYmM6ZCAweDgKKworCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJjOmQgMHg3CisKKwlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYmM6ZCAweDYKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJjOmQgMHg1CisKKwlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYmM6ZCAweDQKKworCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJjOmQgMHgzCisKKwlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYmM6ZCAweDIKKworCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJjOmQgMHgxCisKKwlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYmM6ZCAweDAKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmVvcmguY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9iZW9yaC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQwN2YxYQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmVvcmguY2dzCkBAIC0wLDAgKzEsMzYgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgYmVvcmggJFJqLEAkUmkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgYmVvcmgKK2Jlb3JoOgorCTsgVGVzdCBiZW9yaCAkUmosQCRSaQorCW12aV9oX21lbSAgCTB4NTU1NTU1NTUsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwliZW9yaCAgICAgIAkweDBhLEBzcAorCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0X2hfbWVtIAkweGY1NTU1NTU1LHNwCisKKwltdmlfaF9tZW0gIAkweDBmZmZmZmZmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MDQJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJYmVvcmgJCTB4MDAsQHNwCisJdGVzdF9jYwkJMCAxIDAgMAorCXRlc3RfaF9tZW0gCTB4MGZmZmZmZmYsc3AKKworCW12aV9oX21lbSAgCTB4ZmZmZmZmZmYsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwliZW9yaAkJMHgwZixAc3AKKwl0ZXN0X2NjCQkxIDAgMSAwCisJdGVzdF9oX21lbSAJMHgwZmZmZmZmZixzcAorCisJbXZpX2hfbWVtICAJMHg5ZWFkYmVlZixzcAorCXNldF9jYyAgICAgICAgICAweDA5CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWJlb3JoCQkweDA0LEBzcAorCXRlc3RfY2MJCTEgMCAwIDEKKwl0ZXN0X2hfbWVtIAkweGRlYWRiZWVmLHNwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Jlb3JsLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmVvcmwuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZWEwNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Jlb3JsLmNncwpAQCAtMCwwICsxLDM2IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGJlb3JsICRSaixAJFJpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGJlb3JsCitiZW9ybDoKKwk7IFRlc3QgYmVvcmwgJFJqLEAkUmkKKwltdmlfaF9tZW0gIAkweDU1NTU1NTU1LHNwCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJYmVvcmwgICAgICAJMHgwYSxAc3AKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX21lbSAJMHg1ZjU1NTU1NSxzcAorCisJbXZpX2hfbWVtICAJMHhmMGZmZmZmZixzcAorCXNldF9jYyAgICAgICAgICAweDA0CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWJlb3JsCQkweDAwLEBzcAorCXRlc3RfY2MJCTAgMSAwIDAKKwl0ZXN0X2hfbWVtIAkweGYwZmZmZmZmLHNwCisKKwltdmlfaF9tZW0gIAkweGZmZmZmZmZmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MGEJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJYmVvcmwJCTB4MGYsQHNwCisJdGVzdF9jYwkJMSAwIDEgMAorCXRlc3RfaF9tZW0gCTB4ZjBmZmZmZmYsc3AKKworCW12aV9oX21lbSAgCTB4ZGRhZGJlZWYsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwliZW9ybAkJMHgwMyxAc3AKKwl0ZXN0X2NjCQkxIDAgMCAxCisJdGVzdF9oX21lbSAJMHhkZWFkYmVlZixzcAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9iZXEuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9iZXEuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZDc5N2UKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JlcS5jZ3MKQEAgLTAsMCArMSwxMDkgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgYmVxICRsYWJlbDkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgYmVxCitiZXE6CisJOyBUZXN0IGJlcSAkbGFiZWw5CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJlcQorCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJlcQorCisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJlcQorCisJc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJlcQorCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAliZXEKKworCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmVxCisKKwlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJlcQorCisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAliZXEKKworCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAliZXEKKworCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAliZXEKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAliZXEKKworCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAliZXEKKworCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmVxCisKKwlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJlcQorCisJc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAliZXEKKworCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmVxCisKKwk7IFRlc3QgYmVxOmQgbGFiZWw5CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmVxOmQgMHhmCisKKwlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAliZXE6ZCAweGUKKworCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJlcTpkIDB4ZAorCisJc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmVxOmQgMHhjCisKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYmVxOmQgMHhiCisKKwlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYmVxOmQgMHhhCisKKwlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYmVxOmQgMHg5CisKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYmVxOmQgMHg4CisKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAliZXE6ZCAweDcKKworCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJlcTpkIDB4NgorCisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmVxOmQgMHg1CisKKwlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAliZXE6ZCAweDQKKworCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliZXE6ZCAweDMKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliZXE6ZCAweDIKKworCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliZXE6ZCAweDEKKworCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliZXE6ZCAweDAKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmdlLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmdlLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDc3OTZjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9iZ2UuY2dzCkBAIC0wLDAgKzEsMTA5IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGJnZSAkbGFiZWw5CisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGJnZQorYmdlOgorCTsgVGVzdCBiZ2UgJGxhYmVsOQorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAliZ2UKKworCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAliZ2UKKworCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmdlCisKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJnZQorCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJnZQorCisJc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJnZQorCisJc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAliZ2UKKworCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmdlCisKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJnZQorCisJc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAliZ2UKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAliZ2UKKworCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAliZ2UKKworCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmdlCisKKwlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJnZQorCisJc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJnZQorCisJc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJnZQorCisJOyBUZXN0IGJnZTpkIGxhYmVsOQorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJnZTpkIDB4ZgorCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmdlOmQgMHhlCisKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYmdlOmQgMHhkCisKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYmdlOmQgMHhjCisKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAliZ2U6ZCAweGIKKworCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJnZTpkIDB4YQorCisJc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJnZTpkIDB4OQorCisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJnZTpkIDB4OAorCisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJnZTpkIDB4NworCisJc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJnZTpkIDB4NgorCisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmdlOmQgMHg1CisKKwlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAliZ2U6ZCAweDQKKworCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliZ2U6ZCAweDMKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliZ2U6ZCAweDIKKworCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJnZTpkIDB4MQorCisJc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmdlOmQgMHgwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JndC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JndC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI1YWMyZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmd0LmNncwpAQCAtMCwwICsxLDEwOSBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBiZ3QgJGxhYmVsOQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBiZ3QKK2JndDoKKwk7IFRlc3QgYmd0ICRsYWJlbDkKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJndAorCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAliZ3QKKworCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmd0CisKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJndAorCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJndAorCisJc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJndAorCisJc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAliZ3QKKworCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmd0CisKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJndAorCisJc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAliZ3QKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmd0CisKKwlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJndAorCisJc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAliZ3QKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmd0CisKKwlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYmd0CisKKwlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYmd0CisKKwk7IFRlc3QgYmd0OmQgbGFiZWw5CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJndDpkIDB4ZgorCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJndDpkIDB4ZQorCisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJndDpkIDB4ZAorCisJc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJndDpkIDB4YworCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmd0OmQgMHhiCisKKwlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAliZ3Q6ZCAweGEKKworCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliZ3Q6ZCAweDkKKworCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliZ3Q6ZCAweDgKKworCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliZ3Q6ZCAweDcKKworCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliZ3Q6ZCAweDYKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliZ3Q6ZCAweDUKKworCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliZ3Q6ZCAweDQKKworCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliZ3Q6ZCAweDMKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliZ3Q6ZCAweDIKKworCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJndDpkIDB4MQorCisJc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmd0OmQgMHgwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JoaS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JoaS5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhMTU0OQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmhpLmNncwpAQCAtMCwwICsxLDEwOSBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBiaGkgJGxhYmVsOQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBiaGkKK2JoaToKKwk7IFRlc3QgYmhpICRsYWJlbDkKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJoaQorCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAliaGkKKworCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmhpCisKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJoaQorCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAliaGkKKworCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAliaGkKKworCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmhpCisKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYmhpCisKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJoaQorCisJc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAliaGkKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmhpCisKKwlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJoaQorCisJc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAliaGkKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAliaGkKKworCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmhpCisKKwlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYmhpCisKKwk7IFRlc3QgYmhpOmQgbGFiZWw5CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJoaTpkIDB4ZgorCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJoaTpkIDB4ZQorCisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJoaTpkIDB4ZAorCisJc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJoaTpkIDB4YworCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJoaTpkIDB4YgorCisJc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmhpOmQgMHhhCisKKwlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYmhpOmQgMHg5CisKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAliaGk6ZCAweDgKKworCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliaGk6ZCAweDcKKworCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliaGk6ZCAweDYKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliaGk6ZCAweDUKKworCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliaGk6ZCAweDQKKworCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAliaGk6ZCAweDMKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJoaTpkIDB4MgorCisJc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJoaTpkIDB4MQorCisJc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmhpOmQgMHgwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JsZS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JsZS5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzM2Y3OAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmxlLmNncwpAQCAtMCwwICsxLDEwOSBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBibGUgJGxhYmVsOQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBibGUKK2JsZToKKwk7IFRlc3QgYmxlICRsYWJlbDkKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYmxlCisKKwlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYmxlCisKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYmxlCisKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYmxlCisKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJsZQorCisJc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlibGUKKworCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibGUKKworCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibGUKKworCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibGUKKworCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibGUKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibGUKKworCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibGUKKworCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibGUKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibGUKKworCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmxlCisKKwlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJsZQorCisJOyBUZXN0IGJsZTpkIGxhYmVsOQorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJsZTpkIDB4ZgorCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmxlOmQgMHhlCisKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibGU6ZCAweGQKKworCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJsZTpkIDB4YworCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJsZTpkIDB4YgorCisJc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJsZTpkIDB4YQorCisJc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmxlOmQgMHg5CisKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibGU6ZCAweDgKKworCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJsZTpkIDB4NworCisJc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmxlOmQgMHg2CisKKwlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibGU6ZCAweDUKKworCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJsZTpkIDB4NAorCisJc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmxlOmQgMHgzCisKKwlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibGU6ZCAweDIKKworCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibGU6ZCAweDEKKworCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibGU6ZCAweDAKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmxzLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYmxzLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDE0OGI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ibHMuY2dzCkBAIC0wLDAgKzEsMTA5IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGJscyAkbGFiZWw5CisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGJscworYmxzOgorCTsgVGVzdCBibHMgJGxhYmVsOQorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibHMKKworCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibHMKKworCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibHMKKworCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibHMKKworCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibHMKKworCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmxzCisKKwlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYmxzCisKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJscworCisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJscworCisJc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJscworCisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJscworCisJc2V0X2NjICAgICAgICAgIDB4MDQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJscworCisJc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJscworCisJc2V0X2NjICAgICAgICAgIDB4MDIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlibHMKKworCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibHMKKworCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmxzCisKKwk7IFRlc3QgYmxzOmQgbGFiZWw5CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmxzOmQgMHhmCisKKwlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibHM6ZCAweGUKKworCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJsczpkIDB4ZAorCisJc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmxzOmQgMHhjCisKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibHM6ZCAweGIKKworCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibHM6ZCAweGEKKworCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJsczpkIDB4OQorCisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJsczpkIDB4OAorCisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmxzOmQgMHg3CisKKwlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibHM6ZCAweDYKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJsczpkIDB4NQorCisJc2V0X2NjICAgICAgICAgIDB4MDQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmxzOmQgMHg0CisKKwlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibHM6ZCAweDMKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibHM6ZCAweDIKKworCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJsczpkIDB4MQorCisJc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJsczpkIDB4MAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ibHQuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ibHQuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YjZmZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JsdC5jZ3MKQEAgLTAsMCArMSwxMDkgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgYmx0ICRsYWJlbDkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgYmx0CitibHQ6CisJOyBUZXN0IGJsdCAkbGFiZWw5CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlibHQKKworCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmx0CisKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYmx0CisKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYmx0CisKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJsdAorCisJc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlibHQKKworCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibHQKKworCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibHQKKworCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibHQKKworCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibHQKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmx0CisKKwlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJsdAorCisJc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJsdAorCisJc2V0X2NjICAgICAgICAgIDB4MDIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJsdAorCisJc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlibHQKKworCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYmx0CisKKwk7IFRlc3QgYmx0OmQgbGFiZWw5CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJsdDpkIDB4ZgorCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJsdDpkIDB4ZQorCisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmx0OmQgMHhkCisKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibHQ6ZCAweGMKKworCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibHQ6ZCAweGIKKworCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibHQ6ZCAweGEKKworCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJsdDpkIDB4OQorCisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmx0OmQgMHg4CisKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibHQ6ZCAweDcKKworCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJsdDpkIDB4NgorCisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJsdDpkIDB4NQorCisJc2V0X2NjICAgICAgICAgIDB4MDQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJsdDpkIDB4NAorCisJc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYmx0OmQgMHgzCisKKwlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibHQ6ZCAweDIKKworCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibHQ6ZCAweDEKKworCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibHQ6ZCAweDAKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm4uY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ibi5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4NThmYwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm4uY2dzCkBAIC0wLDAgKzEsMTA5IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGJuICRsYWJlbDkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgYm4KK2JuOgorCTsgVGVzdCBibiAkbGFiZWw5CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJuCisKKwlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYm4KKworCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibgorCisJc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJuCisKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYm4KKworCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibgorCisJc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJuCisKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYm4KKworCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm4KKworCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm4KKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm4KKworCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm4KKworCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm4KKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm4KKworCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm4KKworCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm4KKworCTsgVGVzdCBibjpkIGxhYmVsOQorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJuOmQgMHhmCisKKwlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibjpkIDB4ZQorCisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYm46ZCAweGQKKworCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJuOmQgMHhjCisKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibjpkIDB4YgorCisJc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYm46ZCAweGEKKworCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJuOmQgMHg5CisKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibjpkIDB4OAorCisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJuOmQgMHg3CisKKwlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYm46ZCAweDYKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibjpkIDB4NQorCisJc2V0X2NjICAgICAgICAgIDB4MDQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJuOmQgMHg0CisKKwlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYm46ZCAweDMKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibjpkIDB4MgorCisJc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJuOmQgMHgxCisKKwlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYm46ZCAweDAKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm5jLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm5jLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTY4YzQzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ibmMuY2dzCkBAIC0wLDAgKzEsMTA5IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGJuYyAkbGFiZWw5CisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGJuYworYmM6CisJOyBUZXN0IGJuYyAkbGFiZWw5CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlibmMKKworCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibmMKKworCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm5jCisKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYm5jCisKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJuYworCisJc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJuYworCisJc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlibmMKKworCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibmMKKworCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm5jCisKKwlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYm5jCisKKwlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJuYworCisJc2V0X2NjICAgICAgICAgIDB4MDQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJuYworCisJc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlibmMKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibmMKKworCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm5jCisKKwlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYm5jCisKKwk7IFRlc3QgYm5jOmQgbGFiZWw5CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJuYzpkIDB4ZgorCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYm5jOmQgMHhlCisKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYm5jOmQgMHhkCisKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibmM6ZCAweGMKKworCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibmM6ZCAweGIKKworCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJuYzpkIDB4YQorCisJc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJuYzpkIDB4OQorCisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYm5jOmQgMHg4CisKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYm5jOmQgMHg3CisKKwlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibmM6ZCAweDYKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibmM6ZCAweDUKKworCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJuYzpkIDB4NAorCisJc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJuYzpkIDB4MworCisJc2V0X2NjICAgICAgICAgIDB4MDIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYm5jOmQgMHgyCisKKwlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYm5jOmQgMHgxCisKKwlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibmM6ZCAweDAKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm5lLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm5lLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODk3MWRlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ibmUuY2dzCkBAIC0wLDAgKzEsMTA5IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGJuZSAkbGFiZWw5CisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGJuZQorYm5lOgorCTsgVGVzdCBibmUgJGxhYmVsOQorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm5lCisKKwlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJuZQorCisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlibmUKKworCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm5lCisKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYm5lCisKKwlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYm5lCisKKwlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYm5lCisKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYm5lCisKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJuZQorCisJc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlibmUKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm5lCisKKwlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJuZQorCisJc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJuZQorCisJc2V0X2NjICAgICAgICAgIDB4MDIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJuZQorCisJc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJuZQorCisJc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJuZQorCisJOyBUZXN0IGJuZTpkIGxhYmVsOQorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibmU6ZCAweGYKKworCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibmU6ZCAweGUKKworCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibmU6ZCAweGQKKworCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibmU6ZCAweGMKKworCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJuZTpkIDB4YgorCisJc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYm5lOmQgMHhhCisKKwlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibmU6ZCAweDkKKworCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJuZTpkIDB4OAorCisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJuZTpkIDB4NworCisJc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJuZTpkIDB4NgorCisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJuZTpkIDB4NQorCisJc2V0X2NjICAgICAgICAgIDB4MDQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJuZTpkIDB4NAorCisJc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYm5lOmQgMHgzCisKKwlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibmU6ZCAweDIKKworCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJuZTpkIDB4MQorCisJc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYm5lOmQgMHgwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Juby5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Juby5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlZjliYQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm5vLmNncwpAQCAtMCwwICsxLDEwOSBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBibm8gJGxhYmVsOQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBibm8KK2JubzoKKwk7IFRlc3QgYm5vICRsYWJlbDkKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJubworCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlibm8KKworCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm5vCisKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJubworCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlibm8KKworCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm5vCisKKwlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJubworCisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlibm8KKworCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm5vCisKKwlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJubworCisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlibm8KKworCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm5vCisKKwlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJubworCisJc2V0X2NjICAgICAgICAgIDB4MDIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlibm8KKworCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm5vCisKKwlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJubworCisJOyBUZXN0IGJubzpkIGxhYmVsOQorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibm86ZCAweGYKKworCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibm86ZCAweGUKKworCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibm86ZCAweGQKKworCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibm86ZCAweGMKKworCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibm86ZCAweGIKKworCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibm86ZCAweGEKKworCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibm86ZCAweDkKKworCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibm86ZCAweDgKKworCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibm86ZCAweDcKKworCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibm86ZCAweDYKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibm86ZCAweDUKKworCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibm86ZCAweDQKKworCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibm86ZCAweDMKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibm86ZCAweDIKKworCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibm86ZCAweDEKKworCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibm86ZCAweDAKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm52LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm52LmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjE1YWJkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ibnYuY2dzCkBAIC0wLDAgKzEsMTA5IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGJudiAkbGFiZWw5CisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGJudgorYm52OgorCTsgVGVzdCBibnYgJGxhYmVsOQorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm52CisKKwlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJudgorCisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJudgorCisJc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJudgorCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlibnYKKworCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm52CisKKwlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYm52CisKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYm52CisKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJudgorCisJc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlibnYKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibnYKKworCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlibnYKKworCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYm52CisKKwlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJudgorCisJc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJudgorCisJc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJudgorCisJOyBUZXN0IGJudjpkIGxhYmVsOQorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibnY6ZCAweGYKKworCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibnY6ZCAweGUKKworCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJudjpkIDB4ZAorCisJc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYm52OmQgMHhjCisKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYm52OmQgMHhiCisKKwlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYm52OmQgMHhhCisKKwlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibnY6ZCAweDkKKworCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJudjpkIDB4OAorCisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJudjpkIDB4NworCisJc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJudjpkIDB4NgorCisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYm52OmQgMHg1CisKKwlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlibnY6ZCAweDQKKworCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibnY6ZCAweDMKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlibnY6ZCAweDIKKworCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJudjpkIDB4MQorCisJc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYm52OmQgMHgwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2JvcmguY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ib3JoLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzlmMThhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ib3JoLmNncwpAQCAtMCwwICsxLDMwIEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGJvcmggJFJqLEAkUmkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgYm9yaAorYm9yaDoKKwk7IFRlc3QgYm9yaCAkUmosQCRSaQorCW12aV9oX21lbSAgCTB4NTU1NTU1NTUsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlib3JoICAgICAgCTB4MGEsQHNwCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9tZW0gCTB4ZjU1NTU1NTUsc3AKKworCW12aV9oX21lbSAgCTB4MGZmZmZmZmYsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlib3JoCQkweDAwLEBzcAorCXRlc3RfY2MJCTAgMSAwIDAKKwl0ZXN0X2hfbWVtIAkweDBmZmZmZmZmLHNwCisKKwltdmlfaF9tZW0gIAkweGNlYWRiZWVmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MDkJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJYm9yaAkJMHgwMSxAc3AKKwl0ZXN0X2NjCQkxIDAgMCAxCisJdGVzdF9oX21lbSAJMHhkZWFkYmVlZixzcAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ib3JsLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm9ybC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViMmJiYgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYm9ybC5jZ3MKQEAgLTAsMCArMSwzMCBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBib3JsICRSaixAJFJpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGJvcmwKK2Jvcmw6CisJOyBUZXN0IGJvcmwgJFJqLEAkUmkKKwltdmlfaF9tZW0gIAkweDU1NTU1NTU1LHNwCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJYm9ybCAgICAgIAkweDBhLEBzcAorCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0X2hfbWVtIAkweDVmNTU1NTU1LHNwCisKKwltdmlfaF9tZW0gIAkweGYwZmZmZmZmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MDQJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJYm9ybAkJMHgwMCxAc3AKKwl0ZXN0X2NjCQkwIDEgMCAwCisJdGVzdF9oX21lbSAJMHhmMGZmZmZmZixzcAorCisJbXZpX2hfbWVtICAJMHhkY2FkYmVlZixzcAorCXNldF9jYyAgICAgICAgICAweDA5CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWJvcmwJCTB4MDIsQHNwCisJdGVzdF9jYwkJMSAwIDAgMQorCXRlc3RfaF9tZW0gCTB4ZGVhZGJlZWYsc3AKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYnAuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9icC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1MzI4MwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYnAuY2dzCkBAIC0wLDAgKzEsMTA5IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGJwICRsYWJlbDkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgYnAKK2JwOgorCTsgVGVzdCBicCAkbGFiZWw5CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlicAorCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlicAorCisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlicAorCisJc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlicAorCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlicAorCisJc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlicAorCisJc2V0X2NjICAgICAgICAgIDB4MDkJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlicAorCisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlicAorCisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJwCisKKwlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYnAKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicAorCisJc2V0X2NjICAgICAgICAgIDB4MDQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJwCisKKwlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYnAKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicAorCisJc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJwCisKKwlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYnAKKworCTsgVGVzdCBicDpkIGxhYmVsOQorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlicDpkIDB4ZgorCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJwOmQgMHhlCisKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYnA6ZCAweGQKKworCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlicDpkIDB4YworCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJwOmQgMHhiCisKKwlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYnA6ZCAweGEKKworCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlicDpkIDB4OQorCisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoX2QgCWJwOmQgMHg4CisKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlicDpkIDB4NworCisJc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYnA6ZCAweDYKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJwOmQgMHg1CisKKwlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlicDpkIDB4NAorCisJc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYnA6ZCAweDMKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJwOmQgMHgyCisKKwlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlicDpkIDB4MQorCisJc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYnA6ZCAweDAKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYnJhLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYnJhLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzMyZjc0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9icmEuY2dzCkBAIC0wLDAgKzEsMTA5IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGJyYSAkbGFiZWw5CisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGJyYQorYnJhOgorCTsgVGVzdCBicmEgJGxhYmVsOQorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicmEKKworCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicmEKKworCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicmEKKworCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicmEKKworCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicmEKKworCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicmEKKworCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicmEKKworCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicmEKKworCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicmEKKworCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicmEKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicmEKKworCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicmEKKworCXNldF9jYyAgICAgICAgICAweDAzCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicmEKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicmEKKworCXNldF9jYyAgICAgICAgICAweDAxCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicmEKKworCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlicmEKKworCTsgVGVzdCBicmE6ZCBsYWJlbDkKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlicmE6ZCAweGYKKworCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJyYTpkIDB4ZQorCisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYnJhOmQgMHhkCisKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlicmE6ZCAweGMKKworCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJyYTpkIDB4YgorCisJc2V0X2NjICAgICAgICAgIDB4MGEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYnJhOmQgMHhhCisKKwlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlicmE6ZCAweDkKKworCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJyYTpkIDB4OAorCisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYnJhOmQgMHg3CisKKwlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlicmE6ZCAweDYKKworCXNldF9jYyAgICAgICAgICAweDA1CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJyYTpkIDB4NQorCisJc2V0X2NjICAgICAgICAgIDB4MDQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYnJhOmQgMHg0CisKKwlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlicmE6ZCAweDMKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJyYTpkIDB4MgorCisJc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYnJhOmQgMHgxCisKKwlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaF9kIAlicmE6ZCAweDAKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYnRzdGguY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9idHN0aC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg5N2MzNAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYnRzdGguY2dzCkBAIC0wLDAgKzEsMzAgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgYnRzdGggJFJqLEAkUmkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgYnRzdGgKK2J0c3RoOgorCTsgVGVzdCBidHN0aCAkUmosQCRSaQorCW12aV9oX21lbSAgCTB4NTU1NTU1NTUsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWJ0c3RoICAgICAgCTB4MGEsQHNwCisJdGVzdF9jYwkJMCAxIDEgMQorCXRlc3RfaF9tZW0gCTB4NTU1NTU1NTUsc3AKKworCW12aV9oX21lbSAgCTB4ZmZmZmZmZmYsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWJ0c3RoCQkweDBhLEBzcAorCXRlc3RfY2MJCTEgMCAwIDAKKwl0ZXN0X2hfbWVtIAkweGZmZmZmZmZmLHNwCisKKwltdmlfaF9tZW0gIAkweGU1ZmZmZmZmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlidHN0aAkJMHgwNyxAc3AKKwl0ZXN0X2NjCQkwIDAgMSAwCisJdGVzdF9oX21lbSAJMHhlNWZmZmZmZixzcAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9idHN0bC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2J0c3RsLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWY1YTkyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9idHN0bC5jZ3MKQEAgLTAsMCArMSwzMCBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBidHN0bCAkUmosQCRSaQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBidHN0bAorYnRzdGw6CisJOyBUZXN0IGJ0c3RsICRSaixAJFJpCisJbXZpX2hfbWVtICAJMHg1NTU1NTU1NSxzcAorCXNldF9jYyAgICAgICAgICAweDBiCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJYnRzdGwgICAgICAJMHgwYSxAc3AKKwl0ZXN0X2NjCQkwIDEgMSAxCisJdGVzdF9oX21lbSAJMHg1NTU1NTU1NSxzcAorCisJbXZpX2hfbWVtICAJMHhmZmZmZmZmZixzcAorCXNldF9jYyAgICAgICAgICAweDBjCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJYnRzdGwJCTB4MGEsQHNwCisJdGVzdF9jYwkJMCAwIDAgMAorCXRlc3RfaF9tZW0gCTB4ZmZmZmZmZmYsc3AKKworCW12aV9oX21lbSAgCTB4NWVmZmZmZmYsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWJ0c3RsCQkweDA3LEBzcAorCXRlc3RfY2MJCTAgMCAxIDAKKwl0ZXN0X2hfbWVtIAkweDVlZmZmZmZmLHNwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2J2LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvYnYuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Y2I5YWNmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9idi5jZ3MKQEAgLTAsMCArMSwxMDkgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgYnYgJGxhYmVsOQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBidgorYnY6CisJOyBUZXN0IGJ2ICRsYWJlbDkKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYnYKKworCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlidgorCisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlidgorCisJc2V0X2NjICAgICAgICAgIDB4MGMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlidgorCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJ2CisKKwlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYnYKKworCXNldF9jYyAgICAgICAgICAweDA5CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYnYKKworCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaCAJYnYKKworCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlidgorCisJc2V0X2NjICAgICAgICAgIDB4MDYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2ggCWJ2CisKKwlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJ2CisKKwlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2ggCWJ2CisKKwlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl0YWtlX2JyYW5jaCAJYnYKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoIAlidgorCisJc2V0X2NjICAgICAgICAgIDB4MDEJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlidgorCisJc2V0X2NjICAgICAgICAgIDB4MDAJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJbm9fYnJhbmNoIAlidgorCisJOyBUZXN0IGJ2OmQgbGFiZWw5CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYnY6ZCAweGYKKworCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJ2OmQgMHhlCisKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYnY6ZCAweGQKKworCXNldF9jYyAgICAgICAgICAweDBjCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlidjpkIDB4YworCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYnY6ZCAweGIKKworCXNldF9jYyAgICAgICAgICAweDBhCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJ2OmQgMHhhCisKKwlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYnY6ZCAweDkKKworCXNldF9jYyAgICAgICAgICAweDA4CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlidjpkIDB4OAorCisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYnY6ZCAweDcKKworCXNldF9jYyAgICAgICAgICAweDA2CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJ2OmQgMHg2CisKKwlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYnY6ZCAweDUKKworCXNldF9jYyAgICAgICAgICAweDA0CQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlidjpkIDB4NAorCisJc2V0X2NjICAgICAgICAgIDB4MDMJCTsgY29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJdGFrZV9icmFuY2hfZCAJYnY6ZCAweDMKKworCXNldF9jYyAgICAgICAgICAweDAyCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCXRha2VfYnJhbmNoX2QgCWJ2OmQgMHgyCisKKwlzZXRfY2MgICAgICAgICAgMHgwMQkJOyBjb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlub19icmFuY2hfZCAJYnY6ZCAweDEKKworCXNldF9jYyAgICAgICAgICAweDAwCQk7IGNvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vX2JyYW5jaF9kIAlidjpkIDB4MAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jYWxsLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvY2FsbC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzODQwZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvY2FsbC5jZ3MKQEAgLTAsMCArMSw2OSBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBjYWxsIEAkUmkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgY2FsbAorCisJOyBUZXN0IGNhbGwgJFJpCisJbXZpX2hfZ3IJMHhkZWFkYmVlZixyOQorCW12aV9oX2dyICAgCSNmdW5jMSxyMAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCitjYWxsMToKKwljYWxsCQlAcjAKKwl0ZXN0X2hfZ3IJMHhiZWVmZGVhZCxyOQorCXBhc3MKKworZnVuYzE6CisJdGVzdF9jYwkJMSAxIDEgMQorCW12aV9oX2dyCSNjYWxsMSxyNworCWluY2lfaF9ncgkyLHI3CisJdGVzdHJfaF9kcglyNyxycAorCXNhdmVfcnAKKworCW12aV9oX2dyICAgCSNmdW5jMixyMAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCitjYWxsMjoKKwljYWxsOmQJCUByMAorCWxkaTo4CQkxLHIwCQk7IE11c3QgYXNzdW1lIHRoaXMgd29ya3MKKwlyZXN0b3JlX3JwCisJcmV0CitmdW5jMjoKKwl0ZXN0X2NjCQkxIDEgMSAxCisJbXZpX2hfZ3IJI2NhbGwyLHI3CisJaW5jaV9oX2dyCTQscjcKKwl0ZXN0cl9oX2RyCXI3LHJwCisJdGVzdHJfaF9ncgkxLHIwCisJc2F2ZV9ycAorCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZG4ndCBjaGFuZ2UKK2NhbGwzOgorCWNhbGwJCWZ1bmMzCisJcmVzdG9yZV9ycAorCXJldAorZnVuYzM6CisJdGVzdF9jYwkJMSAxIDEgMQorCW12aV9oX2dyCSNjYWxsMyxyNworCWluY2lfaF9ncgkyLHI3CisJdGVzdHJfaF9kcglyNyxycAorCXNhdmVfcnAKKworCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCitjYWxsNDoKKwljYWxsOmQJCWZ1bmM0CisJbGRpOjgJCTEscjAJCTsgTXVzdCBhc3N1bWUgdGhpcyB3b3JrcworCXJlc3RvcmVfcnAKKwlyZXQKK2Z1bmM0OgorCXRlc3RfY2MJCTEgMSAxIDEKKwltdmlfaF9ncgkjY2FsbDQscjcKKwlpbmNpX2hfZ3IJNCxyNworCXRlc3RyX2hfZHIJcjcscnAKKwl0ZXN0cl9oX2dyCTEscjAKKwltdmlfaF9ncgkweGJlZWZkZWFkLHI5CisJcmV0CisKKwlmYWlsCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2NtcC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2NtcC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JmYmJmOAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvY21wLmNncwpAQCAtMCwwICsxLDUzIEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGNtcCAkUmosJFJpLCBjbXAgJHU0LCRSaQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBjbXAKK2NtcDoKKwk7IFRlc3QgY21wICRSaiwkUmkKKwltdmlfaF9nciAgIAkxLHI3CisJbXZpX2hfZ3IgICAJMixyOAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJY21wICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAwIDAgMAorCisJbXZpX2hfZ3IgICAJMSxyNworCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWNtcAkJcjcscjgKKwl0ZXN0X2NjCQkwIDAgMSAwCisKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWNtcAkJcjgscjgKKwl0ZXN0X2NjCQkwIDEgMCAwCisKKwltdmlfaF9nciAgIAkwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwljbXAJCXI3LHI4CisJdGVzdF9jYwkJMSAwIDAgMQorCisJOyBUZXN0IGNtcCAkdTQsJFJpCisJbXZpX2hfZ3IgICAJMixyOAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJY21wICAgICAgCTEscjgKKwl0ZXN0X2NjCQkwIDAgMCAwCisKKwltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwljbXAJCTEscjgKKwl0ZXN0X2NjCQkwIDAgMSAwCisKKwltdmlfaF9nciAgIAkwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwljbXAJCTAscjgKKwl0ZXN0X2NjCQkwIDEgMCAwCisKKwlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWNtcAkJMTUscjgKKwl0ZXN0X2NjCQkxIDAgMCAxCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2NtcDIuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jbXAyLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmE2MjAxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jbXAyLmNncwpAQCAtMCwwICsxLDI3IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGNtcDIgJHU0LCRSaQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBjbXAyCitjbXAyOgorCTsgVGVzdCBjbXAyICR1NCwkUmkKKwltdmlfaF9nciAgIAkyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwljbXAyICAgICAgCS0xLHI4CisJdGVzdF9jYwkJMCAwIDAgMQorCisJbXZpX2hfZ3IgICAJMHg3ZmZmZmZmZSxyOAorCXNldF9jYyAgICAgICAgICAweDA0CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJY21wMgkJLTIscjgKKwl0ZXN0X2NjCQkxIDAgMSAxCisKKwltdmlfaF9nciAgIAktMTYscjgKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWNtcDIJCS0xNixyOAorCXRlc3RfY2MJCTAgMSAwIDAKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvY29wbGQuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jb3BsZC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBhYmFiYgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvY29wbGQuY2dzCkBAIC0wLDAgKzEsMjEgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgY29wbGQgJHU0LCRjYywkUmosQ1JpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGNvcGxkCitjb3BsZDoKKwk7IFRlc3QgY29wbGQgY29wbGQgJHU0LCRjYywkUmosQ1JpCisJOyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vb3AKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwljb3BsZCAgICAgIAkwLDAscjAsY3IxNQorCXRlc3RfY2MJCTEgMSAxIDEKKworCXNldF9jYyAgICAgICAgICAweDBlCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCWNvcGxkICAgICAgCTE1LDI1NSxyMTUsY3IwCisJdGVzdF9jYwkJMSAxIDEgMAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jb3BvcC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2NvcG9wLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGFmZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jb3BvcC5jZ3MKQEAgLTAsMCArMSwyMSBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBjb3BvcCAkdTQsJGNjLCRDUmosQ1JpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGNvcG9wCitjb3BvcDoKKwk7IFRlc3QgY29wb3AgY29wb3AgJHU0LCRjYywkQ1JqLENSaQorCTsgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgYSBub29wCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJY29wb3AgICAgICAJMCwwLGNyMCxjcjE1CisJdGVzdF9jYwkJMSAxIDEgMQorCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJY29wb3AgICAgICAJMTUsMjU1LGNyMCxjcjE1CisJdGVzdF9jYwkJMSAxIDEgMAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jb3BzdC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2NvcHN0LmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDEyMGIyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9jb3BzdC5jZ3MKQEAgLTAsMCArMSwyMSBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBjb3BzdCAkdTQsJGNjLCRDUmosUmkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgY29wc3QKK2NvcHN0OgorCTsgVGVzdCBjb3BzdCBjb3BzdCAkdTQsJGNjLCRDUmosUmkKKwk7IFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIGEgbm9vcAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCWNvcHN0ICAgICAgCTAsMCxjcjAscjE1CisJdGVzdF9jYwkJMSAxIDEgMQorCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJY29wc3QgICAgICAJMTUsMjU1LGNyMTUscjAKKwl0ZXN0X2NjCQkxIDEgMSAwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2NvcHN2LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvY29wc3YuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMGE0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2NvcHN2LmNncwpAQCAtMCwwICsxLDIxIEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGNvcHN2ICR1NCwkY2MsJENSaixSaQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBjb3BzdgorY29wc3Y6CisJOyBUZXN0IGNvcHN2IGNvcHN2ICR1NCwkY2MsJENSaixSaQorCTsgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgYSBub29wCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJY29wc3YgICAgICAJMCwwLGNyMCxyMTUKKwl0ZXN0X2NjCQkxIDEgMSAxCisKKwlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwljb3BzdiAgICAgIAkxNSwyNTUsY3IxNSxyMAorCXRlc3RfY2MJCTEgMSAxIDAKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2Lm1zIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kaXYubXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzYWFmMgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2Lm1zCkBAIC0wLDAgKzEsMTc2IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGRpdmlzaW9uCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGRpdgorZGl2OgorCTsgc2ltcGxlIGRpdmlzaW9uIDEyIC8gMworCW12aV9oX2dyICAgCTB4MDAwMDAwMDMscjIKKwltdmlfaF9kciAgIAkweGRlYWRiZWVmLG1kaAorCW12aV9oX2RyICAgCTB4MDAwMDAwMGMsbWRsCisJZGl2MHMgICAgICAJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MiAgICAgICAgICAgIHIyCisJZGl2MworCWRpdjRzCisJdGVzdF9oX2dyICAJMHgwMDAwMDAwMyxyMgorCXRlc3RfaF9kciAgCTB4MDAwMDAwMDAsbWRoCisJdGVzdF9oX2RyICAJMHgwMDAwMDAwNCxtZGwKKwl0ZXN0X2RiaXRzCTB4MAorCisJOyBleGFtcGxlIDEgZnJvbSBkaXYwcyB0aGUgbWFudWFsCisJbXZpX2hfZ3IgICAJMHgwMTIzNDU2NyxyMgorCW12aV9oX2RyICAgCTB4ZGVhZGJlZWYsbWRoCisJbXZpX2hfZHIgICAJMHhmZWRjYmE5OCxtZGwKKwlkaXYwcyAgICAgIAlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYyICAgICAgICAgICAgcjIKKwlkaXYzCisJZGl2NHMKKwl0ZXN0X2hfZ3IgIAkweDAxMjM0NTY3LHIyCisJdGVzdF9oX2RyICAJMHhmZmZmZmZmZixtZGgKKwl0ZXN0X2hfZHIgIAkweGZmZmZmZmZmLG1kbAorCXRlc3RfZGJpdHMJMHgzCisKKwk7IGV4YW1wbGUgMiBmcm9tIGRpdjBzIHRoZSBtYW51YWwKKwltdmlfaF9kciAgIAkweGRlYWRiZWVmLG1kaAorCW12aV9oX2RyICAgCTB4ZmVkY2JhOTgsbWRsCisJbXZpX2hfZ3IgICAJMHgxMjM0NTY3LHIyCisJbXZpX2hfZ3IgICAJMSxyMAorCW12aV9oX2dyICAgCTMyLHIxCisJZGl2MHMgICAgICAJcjIKK2xvb3AxOglzdWIJCXIwLHIxCisJYm5lOmQJCWxvb3AxCisJZGl2MQkJcjIKKwlkaXYyCQlyMgorCWRpdjMKKwlkaXY0cworCXRlc3RfaF9nciAgCTB4MDEyMzQ1NjcscjIKKwl0ZXN0X2hfZHIgIAkweGZmZmZmZmZmLG1kaAorCXRlc3RfaF9kciAgCTB4ZmZmZmZmZmYsbWRsCisJdGVzdF9kYml0cwkweDMKKworCTsgZXhhbXBsZSAxIGZyb20gZGl2MHUgaW4gdGhlIG1hbnVhbAorCW12aV9oX2dyICAgCTB4MDEyMzQ1NjcscjIKKwltdmlfaF9kciAgIAkweGRlYWRiZWVmLG1kaAorCW12aV9oX2RyICAgCTB4ZmVkY2JhOTgsbWRsCisJZGl2MHUgICAgICAJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJZGl2MQkJcjIKKwlkaXYxCQlyMgorCWRpdjEJCXIyCisJdGVzdF9oX2dyICAJMHgwMTIzNDU2NyxyMgorCXRlc3RfaF9kciAgCTB4MDAwMDAwNzgsbWRoCisJdGVzdF9oX2RyICAJMHgwMDAwMDBlMCxtZGwKKwl0ZXN0X2RiaXRzCTB4MAorCisJOyBleGFtcGxlIDIgZnJvbSBkaXYwdSBpbiB0aGUgbWFudWFsCisJbXZpX2hfZHIgICAJMHhkZWFkYmVlZixtZGgKKwltdmlfaF9kciAgIAkweGZlZGNiYTk4LG1kbAorCW12aV9oX2dyICAgCTB4MTIzNDU2NyxyMgorCW12aV9oX2dyICAgCTEscjAKKwltdmlfaF9nciAgIAkzMixyMQorCWRpdjB1ICAgICAgCXIyCitsb29wMjoJc3ViCQlyMCxyMQorCWJuZTpkCQlsb29wMgorCWRpdjEJCXIyCisJdGVzdF9oX2dyICAJMHgwMTIzNDU2NyxyMgorCXRlc3RfaF9kciAgCTB4MDAwMDAwNzgsbWRoCisJdGVzdF9oX2RyICAJMHgwMDAwMDBlMCxtZGwKKwl0ZXN0X2RiaXRzCTB4MAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kaXYwcy5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2RpdjBzLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQ3NmM0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kaXYwcy5jZ3MKQEAgLTAsMCArMSw2NCBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBkaXYwcyAkUmkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgZGl2MHMKK2RpdjBzOgorCTsgVGVzdCBkaXYwcyAkUmosJFJpCisJOyBleGFtcGxlIGZyb20gdGhlIG1hbnVhbCAtIG5lZ2F0aXZlIGRpdmlkZW5kCisJbXZpX2hfZ3IgICAJMHgwZmZmZmZmZixyMgorCW12aV9oX2RyICAgCTB4MDAwMDAwMDAsbWRoCisJbXZpX2hfZHIgICAJMHhmZmZmZmZmMCxtZGwKKwlzZXRfZGJpdHMJMHgwCQk7IFNldCBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWRpdjBzICAgICAgCXIyCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAgCTB4MGZmZmZmZmYscjIKKwl0ZXN0X2hfZHIgIAkweGZmZmZmZmZmLG1kaAorCXRlc3RfaF9kciAgCTB4ZmZmZmZmZjAsbWRsCisJdGVzdF9kYml0cwkweDMKKworCTsgbmVnYXRpdmUgZGl2aXNvcgorCW12aV9oX2dyICAgCTB4ZmZmZmZmZmYscjIKKwltdmlfaF9kciAgIAkweGZmZmZmZmZmLG1kaAorCW12aV9oX2RyICAgCTB4N2ZmZmZmZmYsbWRsCisJc2V0X2RiaXRzCTB4MQkJOyBTZXQgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlkaXYwcyAgICAgIAlyMgorCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkweGZmZmZmZmZmLHIyCisJdGVzdF9oX2RyICAJMHgwMDAwMDAwMCxtZGgKKwl0ZXN0X2hfZHIgIAkweDdmZmZmZmZmLG1kbAorCXRlc3RfZGJpdHMJMHgyCisKKwk7IEJvdGggc2lnbiBiaXRzIDAKKwltdmlfaF9nciAgIAkweDBmZmZmZmZmLHIyCisJbXZpX2hfZHIgICAJMHhmZmZmZmZmZixtZGgKKwltdmlfaF9kciAgIAkweDdmZmZmZmYwLG1kbAorCXNldF9kYml0cwkweDMJCTsgU2V0IG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJZGl2MHMgICAgICAJcjIKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX2dyICAJMHgwZmZmZmZmZixyMgorCXRlc3RfaF9kciAgCTB4MDAwMDAwMDAsbWRoCisJdGVzdF9oX2RyICAJMHg3ZmZmZmZmMCxtZGwKKwl0ZXN0X2RiaXRzCTB4MAorCisJOyBCb3RoIHNpZ24gYml0cyAxCisJbXZpX2hfZ3IgICAJMHhmZmZmZmZmZixyMgorCW12aV9oX2RyICAgCTB4MDAwMDAwMDAsbWRoCisJbXZpX2hfZHIgICAJMHhmZmZmZmZmZixtZGwKKwlzZXRfZGJpdHMJMHgyCQk7IFNldCBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWRpdjBzICAgICAgCXIyCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAgCTB4ZmZmZmZmZmYscjIKKwl0ZXN0X2hfZHIgIAkweGZmZmZmZmZmLG1kaAorCXRlc3RfaF9kciAgCTB4ZmZmZmZmZmYsbWRsCisJdGVzdF9kYml0cwkweDEKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2MHUuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kaXYwdS5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZkODRhNgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2MHUuY2dzCkBAIC0wLDAgKzEsMjUgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgZGl2MHUgJFJpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGRpdjB1CitkaXYwdToKKwk7IFRlc3QgZGl2MHUgJFJqLCRSaQorCTsgb3BlcmFuZCByZWdpc3RlciBoYXMgbm8gZWZmZWN0CisJbXZpX2hfZ3IgICAJMHhkZWFkYmVlZixyMgorCW12aV9oX2RyICAgCTB4ZGVhZGJlZWYsbWRoCisJbXZpX2hfZHIgICAJMHgwZmZmZmZmMCxtZGwKKwlzZXRfZGJpdHMJMHgzCQk7IFNldCBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWRpdjB1ICAgICAgCXIyCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAgCTB4ZGVhZGJlZWYscjIKKwl0ZXN0X2hfZHIgIAkweDAwMDAwMDAwLG1kaAorCXRlc3RfaF9kciAgCTB4MGZmZmZmZjAsbWRsCisJdGVzdF9kYml0cwkweDAKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2MS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2RpdjEuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYzM1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2RpdjEuY2dzCkBAIC0wLDAgKzEsMTEzIEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGRpdjEgJFJpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGRpdjEKK2RpdjE6CisJOyBUZXN0IGRpdjEgJFJpCisJOyBleGFtcGxlIGZyb20gdGhlIG1hbnVhbCAtLSBhbGwgc3RhdHVzIGJpdHMgMAorCW12aV9oX2dyICAgCTB4MDBmZmZmZmYscjIKKwltdmlfaF9kciAgIAkweDAwZmZmZmZmLG1kaAorCW12aV9oX2RyICAgCTB4MDAwMDAwMDAsbWRsCisJc2V0X2RiaXRzCTB4MAorCXNldF9jYyAgICAgICAgICAweDAwCisJZGl2MSAgICAgIAlyMgorCXRlc3RfY2MJCTAgMCAwIDAKKwl0ZXN0X2RiaXRzCTB4MAorCXRlc3RfaF9nciAgCTB4MDBmZmZmZmYscjIKKwl0ZXN0X2hfZHIgIAkweDAwZmZmZmZmLG1kaAk7IG1pc3ByaW50ZWQgaW4gbWFudWFsPworCXRlc3RfaF9kciAgCTB4MDAwMDAwMDEsbWRsCisKKwk7IEQwID09IDEKKwlzZXRfZGJpdHMJMHgxCisJc2V0X2NjICAgICAgICAgIDB4MDAKKwlkaXYxICAgICAgCXIyCisJdGVzdF9jYwkJMCAwIDAgMAorCXRlc3RfZGJpdHMJMHgxCisJdGVzdF9oX2dyICAJMHgwMGZmZmZmZixyMgorCXRlc3RfaF9kciAgCTB4MDFmZmZmZmUsbWRoCisJdGVzdF9oX2RyICAJMHgwMDAwMDAwMixtZGwKKworCTsgRDEgPT0gMQorCXNldF9kYml0cwkweDIKKwlzZXRfY2MgICAgICAgICAgMHgwMAorCWRpdjEgICAgICAJcjIKKwl0ZXN0X2NjCQkwIDAgMCAwCisJdGVzdF9kYml0cwkweDIKKwl0ZXN0X2hfZ3IgIAkweDAwZmZmZmZmLHIyCisJdGVzdF9oX2RyICAJMHgwM2ZmZmZmYyxtZGgKKwl0ZXN0X2hfZHIgIAkweDAwMDAwMDA0LG1kbAorCisJOyBEMCA9PSAxLCBEMSA9PSAxCisJc2V0X2RiaXRzCTB4MworCXNldF9jYyAgICAgICAgICAweDAwCisJZGl2MSAgICAgIAlyMgorCXRlc3RfY2MJCTAgMCAwIDAKKwl0ZXN0X2RiaXRzCTB4MworCXRlc3RfaF9nciAgCTB4MDBmZmZmZmYscjIKKwl0ZXN0X2hfZHIgIAkweDA4ZmZmZmY3LG1kaAorCXRlc3RfaF9kciAgCTB4MDAwMDAwMDksbWRsCisKKwk7IEMgPT0gMQorCW12aV9oX2dyICAJMHgxMWZmZmZlZixyMgorCXNldF9kYml0cwkweDAKKwlzZXRfY2MgICAgICAgICAgMHgwMAorCWRpdjEgICAgICAJcjIKKwl0ZXN0X2NjCQkwIDAgMCAxCisJdGVzdF9kYml0cwkweDAKKwl0ZXN0X2hfZ3IgIAkweDExZmZmZmVmLHIyCisJdGVzdF9oX2RyICAJMHgxMWZmZmZlZSxtZGgKKwl0ZXN0X2hfZHIgIAkweDAwMDAwMDEyLG1kbAorCisJOyBEMCA9PSAxLCBDID09IDEKKwltdmlfaF9nciAgCTB4MjNmZmZmZGQscjIKKwlzZXRfZGJpdHMJMHgxCisJc2V0X2NjICAgICAgICAgIDB4MDAKKwlkaXYxICAgICAgCXIyCisJdGVzdF9jYwkJMCAwIDAgMQorCXRlc3RfZGJpdHMJMHgxCisJdGVzdF9oX2dyICAJMHgyM2ZmZmZkZCxyMgorCXRlc3RfaF9kciAgCTB4ZmZmZmZmZmYsbWRoCisJdGVzdF9oX2RyICAJMHgwMDAwMDAyNSxtZGwKKworCTsgRDEgPT0gMSwgQyA9PSAxCisJbXZpX2hfZ3IgIAkweDAwMDAwMDAzLHIyCisJc2V0X2RiaXRzCTB4MgorCXNldF9jYyAgICAgICAgICAweDAwCisJZGl2MSAgICAgIAlyMgorCXRlc3RfY2MJCTAgMCAwIDEKKwl0ZXN0X2RiaXRzCTB4MgorCXRlc3RfaF9nciAgCTB4MDAwMDAwMDMscjIKKwl0ZXN0X2hfZHIgIAkweDAwMDAwMDAxLG1kaAorCXRlc3RfaF9kciAgCTB4MDAwMDAwNGIsbWRsCisKKwk7IEQwID09IDEsIEQxID09IDEsIEMgPT0gMQorCW12aV9oX2dyICAJMHhmZmZmZmZmZSxyMgorCXNldF9kYml0cwkweDMKKwlzZXRfY2MgICAgICAgICAgMHgwMAorCWRpdjEgICAgICAJcjIKKwl0ZXN0X2NjCQkwIDAgMCAxCisJdGVzdF9kYml0cwkweDMKKwl0ZXN0X2hfZ3IgIAkweGZmZmZmZmZlLHIyCisJdGVzdF9oX2RyICAJMHgwMDAwMDAwMixtZGgKKwl0ZXN0X2hfZHIgIAkweDAwMDAwMDk2LG1kbAorCisJOyByZW1haW5kZXIgaXMgemVybworCW12aV9oX2dyICAJMHgwMDAwMDAwNCxyMgorCXNldF9kYml0cwkweDAKKwlzZXRfY2MgICAgICAgICAgMHgwMAorCWRpdjEgICAgICAJcjIKKwl0ZXN0X2NjCQkwIDEgMCAwCisJdGVzdF9kYml0cwkweDAKKwl0ZXN0X2hfZ3IgIAkweDAwMDAwMDA0LHIyCisJdGVzdF9oX2RyICAJMHgwMDAwMDAwMCxtZGgKKwl0ZXN0X2hfZHIgIAkweDAwMDAwMTJkLG1kbAorCisJcGFzcworCisKKwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kaXYyLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2Mi5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwMDBhMgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2Mi5jZ3MKQEAgLTAsMCArMSwxMjAgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgZGl2MiAkUmkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgZGl2MgorZGl2MjoKKwk7IFRlc3QgZGl2MiAkUmkKKwk7IGV4YW1wbGUgZnJvbSB0aGUgbWFudWFsIC0tIGFsbCBzdGF0dXMgYml0cyAwCisJbXZpX2hfZ3IgICAJMHgwMGZmZmZmZixyMgorCW12aV9oX2RyICAgCTB4MDBmZmZmZmYsbWRoCisJbXZpX2hfZHIgICAJMHgwMDAwMDAwZixtZGwKKwlzZXRfZGJpdHMJMHgwCisJc2V0X2NjICAgICAgICAgIDB4MDAKKwlkaXYyICAgICAgCXIyCisJdGVzdF9jYwkJMCAxIDAgMAorCXRlc3RfZGJpdHMJMHgwCisJdGVzdF9oX2dyICAJMHgwMGZmZmZmZixyMgorCXRlc3RfaF9kciAgCTB4MDAwMDAwMDAsbWRoCisJdGVzdF9oX2RyICAJMHgwMDAwMDAwZixtZGwKKworCTsgRDAgPT0gMQorCW12aV9oX2RyICAgCTB4MDBmZmZmZmYsbWRoCisJc2V0X2RiaXRzCTB4MQorCXNldF9jYyAgICAgICAgICAweDAwCisJZGl2MiAgICAgIAlyMgorCXRlc3RfY2MJCTAgMSAwIDAKKwl0ZXN0X2RiaXRzCTB4MQorCXRlc3RfaF9nciAgCTB4MDBmZmZmZmYscjIKKwl0ZXN0X2hfZHIgIAkweDAwMDAwMDAwLG1kaAorCXRlc3RfaF9kciAgCTB4MDAwMDAwMGYsbWRsCisKKwk7IEQxID09IDEKKwltdmlfaF9kciAgIAkweDAwZmZmZmZmLG1kaAorCXNldF9kYml0cwkweDIKKwlzZXRfY2MgICAgICAgICAgMHgwMAorCWRpdjIgICAgICAJcjIKKwl0ZXN0X2NjCQkwIDAgMCAwCisJdGVzdF9kYml0cwkweDIKKwl0ZXN0X2hfZ3IgIAkweDAwZmZmZmZmLHIyCisJdGVzdF9oX2RyICAJMHgwMGZmZmZmZixtZGgKKwl0ZXN0X2hfZHIgIAkweDAwMDAwMDBmLG1kbAorCisJOyBEMCA9PSAxLCBEMSA9PSAxCisJc2V0X2RiaXRzCTB4MworCXNldF9jYyAgICAgICAgICAweDAwCisJZGl2MiAgICAgIAlyMgorCXRlc3RfY2MJCTAgMCAwIDAKKwl0ZXN0X2RiaXRzCTB4MworCXRlc3RfaF9nciAgCTB4MDBmZmZmZmYscjIKKwl0ZXN0X2hfZHIgIAkweDAwZmZmZmZmLG1kaAorCXRlc3RfaF9kciAgCTB4MDAwMDAwMGYsbWRsCisKKwk7IEMgPT0gMQorCW12aV9oX2RyICAgCTB4MTFmZmZmZWUsbWRoCisJbXZpX2hfZ3IgIAkweDExZmZmZmVmLHIyCisJc2V0X2RiaXRzCTB4MAorCXNldF9jYyAgICAgICAgICAweDAwCisJZGl2MiAgICAgIAlyMgorCXRlc3RfY2MJCTAgMCAwIDEKKwl0ZXN0X2RiaXRzCTB4MAorCXRlc3RfaF9nciAgCTB4MTFmZmZmZWYscjIKKwl0ZXN0X2hfZHIgIAkweDExZmZmZmVlLG1kaAorCXRlc3RfaF9kciAgCTB4MDAwMDAwMGYsbWRsCisKKwk7IEQwID09IDEsIEMgPT0gMQorCW12aV9oX2RyICAgCTB4MjNmZmZmZGMsbWRoCisJbXZpX2hfZ3IgIAkweDIzZmZmZmRkLHIyCisJc2V0X2RiaXRzCTB4MQorCXNldF9jYyAgICAgICAgICAweDAwCisJZGl2MiAgICAgIAlyMgorCXRlc3RfY2MJCTAgMCAwIDEKKwl0ZXN0X2RiaXRzCTB4MQorCXRlc3RfaF9nciAgCTB4MjNmZmZmZGQscjIKKwl0ZXN0X2hfZHIgIAkweDIzZmZmZmRjLG1kaAorCXRlc3RfaF9kciAgCTB4MDAwMDAwMGYsbWRsCisKKwk7IEQxID09IDEsIEMgPT0gMQorCW12aV9oX2RyICAgCTB4ZmZmZmZmZmQsbWRoCisJbXZpX2hfZ3IgIAkweDAwMDAwMDA0LHIyCisJc2V0X2RiaXRzCTB4MgorCXNldF9jYyAgICAgICAgICAweDAwCisJZGl2MiAgICAgIAlyMgorCXRlc3RfY2MJCTAgMCAwIDEKKwl0ZXN0X2RiaXRzCTB4MgorCXRlc3RfaF9nciAgCTB4MDAwMDAwMDQscjIKKwl0ZXN0X2hfZHIgIAkweGZmZmZmZmZkLG1kaAorCXRlc3RfaF9kciAgCTB4MDAwMDAwMGYsbWRsCisKKwk7IEQwID09IDEsIEQxID09IDEsIEMgPT0gMQorCW12aV9oX2RyICAgCTB4MDAwMDAwMDIsbWRoCisJbXZpX2hfZ3IgIAkweGZmZmZmZmZmLHIyCisJc2V0X2RiaXRzCTB4MworCXNldF9jYyAgICAgICAgICAweDAwCisJZGl2MiAgICAgIAlyMgorCXRlc3RfY2MJCTAgMCAwIDEKKwl0ZXN0X2RiaXRzCTB4MworCXRlc3RfaF9nciAgCTB4ZmZmZmZmZmYscjIKKwl0ZXN0X2hfZHIgIAkweDAwMDAwMDAyLG1kaAorCXRlc3RfaF9kciAgCTB4MDAwMDAwMGYsbWRsCisKKwk7IHJlbWFpbmRlciBpcyB6ZXJvCisJbXZpX2hfZHIgICAJMHgwMDAwMDAwNCxtZGgKKwltdmlfaF9nciAgCTB4MDAwMDAwMDQscjIKKwlzZXRfZGJpdHMJMHgwCisJc2V0X2NjICAgICAgICAgIDB4MDAKKwlkaXYyICAgICAgCXIyCisJdGVzdF9jYwkJMCAxIDAgMAorCXRlc3RfZGJpdHMJMHgwCisJdGVzdF9oX2dyICAJMHgwMDAwMDAwNCxyMgorCXRlc3RfaF9kciAgCTB4MDAwMDAwMDAsbWRoCisJdGVzdF9oX2RyICAJMHgwMDAwMDAwZixtZGwKKworCXBhc3MKKworCisKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2My5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2RpdjMuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlN2RhMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2RpdjMuY2dzCkBAIC0wLDAgKzEsMzQgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgZGl2MworIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBkaXYzCitkaXYzOgorCTsgVGVzdCBkaXYzCisJOyBleGFtcGxlIGZyb20gdGhlIG1hbnVhbAorCW12aV9oX2dyICAgCTB4MDBmZmZmZmYscjIKKwltdmlfaF9kciAgIAkweDAwMDAwMDAwLG1kaAorCW12aV9oX2RyICAgCTB4MDAwMDAwMGYsbWRsCisJc2V0X2RiaXRzCTB4MAorCXNldF9jYyAgICAgICAgICAweDA0CisJZGl2MworCXRlc3RfY2MJCTAgMSAwIDAKKwl0ZXN0X2RiaXRzCTB4MAorCXRlc3RfaF9nciAgCTB4MDBmZmZmZmYscjIKKwl0ZXN0X2hfZHIgIAkweDAwMDAwMDAwLG1kaAorCXRlc3RfaF9kciAgCTB4MDAwMDAwMTAsbWRsCisKKwlzZXRfZGJpdHMJMHgwCisJc2V0X2NjICAgICAgICAgIDB4MDAKKwlkaXYzCisJdGVzdF9jYwkJMCAwIDAgMAorCXRlc3RfZGJpdHMJMHgwCisJdGVzdF9oX2dyICAJMHgwMGZmZmZmZixyMgorCXRlc3RfaF9kciAgCTB4MDAwMDAwMDAsbWRoCisJdGVzdF9oX2RyICAJMHgwMDAwMDAxMCxtZGwKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2NHMuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9kaXY0cy5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I5OGVjYQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZGl2NHMuY2dzCkBAIC0wLDAgKzEsMzQgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgZGl2NHMKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgZGl2NHMKK2RpdjRzOgorCTsgVGVzdCBkaXY0cworCTsgZXhhbXBsZSBmcm9tIHRoZSBtYW51YWwKKwltdmlfaF9nciAgIAkweDAwZmZmZmZmLHIyCisJbXZpX2hfZHIgICAJMHgwMDAwMDAwMCxtZGgKKwltdmlfaF9kciAgIAkweDAwMDAwMDBmLG1kbAorCXNldF9kYml0cwkweDMKKwlzZXRfY2MgICAgICAgICAgMHgwZgorCWRpdjRzCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfZGJpdHMJMHgzCisJdGVzdF9oX2dyICAJMHgwMGZmZmZmZixyMgorCXRlc3RfaF9kciAgCTB4MDAwMDAwMDAsbWRoCisJdGVzdF9oX2RyICAJMHhmZmZmZmZmMSxtZGwKKworCXNldF9kYml0cwkweDAKKwlzZXRfY2MgICAgICAgICAgMHgwMAorCWRpdjRzCisJdGVzdF9jYwkJMCAwIDAgMAorCXRlc3RfZGJpdHMJMHgwCisJdGVzdF9oX2dyICAJMHgwMGZmZmZmZixyMgorCXRlc3RfaF9kciAgCTB4MDAwMDAwMDAsbWRoCisJdGVzdF9oX2RyICAJMHhmZmZmZmZmMSxtZGwKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZG1vdi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Rtb3YuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMmU1Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Rtb3YuY2dzCkBAIC0wLDAgKzEsNzMgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgZG1vdgorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgZG1vdgorZG1vdjoKKwk7IFRlc3QgZG1vdiBAJGRpcjEwLCRSMTMKKwltdmlfaF9ncgkweGRlYWRiZWVmLHIxCisJbXZpX2hfZ3IJMHgyMDAscjIKKwltdnJfaF9tZW0JcjEscjIKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkbid0IGNoYW5nZQorCWRtb3YJCUAweDIwMCxyMTMKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX2dyCTB4ZGVhZGJlZWYscjEzCisKKwk7IFRlc3QgZG1vdiAkUjEzLEAkZGlyMTAKKwltdmlfaF9ncgkweGJlZWZkZWFkLHIxMworCXNldF9jYyAgICAgICAgICAweDBlCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCisJZG1vdgkJcjEzLEAweDIwMAorCXRlc3RfY2MJCTEgMSAxIDAKKwl0ZXN0X2hfbWVtCTB4YmVlZmRlYWQscjIKKworCTsgVGVzdCBkbW92IEAkZGlyMTAsQFIxMysKKwltdmlfaF9ncgkweDFmYyxyMTMKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkbid0IGNoYW5nZQorCWRtb3YJCUAweDIwMCxAcjEzKworCXRlc3RfY2MJCTEgMSAwIDEKKwltdmlfaF9ncgkweDFmYyxyMgorCXRlc3RfaF9tZW0JMHhiZWVmZGVhZCxyMgorCWluY2lfaF9ncgk0LHIyCisJdGVzdF9oX21lbQkweGJlZWZkZWFkLHIyCisJdGVzdF9oX2dyCTB4MjAwLHIxMworCisJOyBUZXN0IGRtb3YgQCRSMTMrLEAkZGlyMTAKKwltdmlfaF9ncgkweDFmYyxyMTMKKwltdmlfaF9tZW0JMHhkZWFkYmVlZixyMTMKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkbid0IGNoYW5nZQorCWRtb3YJCUByMTMrLEAweDIwMAorCXRlc3RfY2MJCTEgMSAwIDAKKwltdmlfaF9ncgkweDFmYyxyMgorCXRlc3RfaF9tZW0JMHhkZWFkYmVlZixyMgorCWluY2lfaF9ncgk0LHIyCisJdGVzdF9oX21lbQkweGRlYWRiZWVmLHIyCisJdGVzdF9oX2dyCTB4MjAwLHIxMworCisJOyBUZXN0IGRtb3YgQCRkaXIxMCxALVIxNQorCW12aV9oX2dyCTB4MjAwLHIxNQorCW12aV9oX21lbQkweGRlYWRiZWVmLHIxNQorCXNldF9jYyAgICAgICAgICAweDBiCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCisJZG1vdgkJQDB4MjAwLEAtcjE1CisJdGVzdF9jYwkJMSAwIDEgMQorCW12aV9oX2dyCTB4MWZjLHIyCisJdGVzdF9oX21lbQkweGRlYWRiZWVmLHIyCisJaW5jaV9oX2dyCTQscjIKKwl0ZXN0X2hfbWVtCTB4ZGVhZGJlZWYscjIKKwl0ZXN0X2hfZ3IJMHgxZmMscjE1CisKKwk7IFRlc3QgZG1vdiBAJFIxNSssQCRkaXIxMAorCW12aV9oX2dyCTB4MWZjLHIxNQorCW12aV9oX21lbQkweGJlZWZkZWFkLHIxNQorCXNldF9jYyAgICAgICAgICAweDBhCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCisJZG1vdgkJQHIxNSssQDB4MjAwCisJdGVzdF9jYwkJMSAwIDEgMAorCW12aV9oX2dyCTB4MWZjLHIyCisJdGVzdF9oX21lbQkweGJlZWZkZWFkLHIyCisJaW5jaV9oX2dyCTQscjIKKwl0ZXN0X2hfbWVtCTB4YmVlZmRlYWQscjIKKwl0ZXN0X2hfZ3IJMHgyMDAscjE1CisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Rtb3ZiLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZG1vdmIuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2Y2ZiOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Rtb3ZiLmNncwpAQCAtMCwwICsxLDQ2IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGRtb3ZiCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBkbW92YgorZG1vdmI6CisJOyBUZXN0IGRtb3ZiIEAkZGlyOCwkUjEzCisJbXZpX2hfZ3IJMHhkZWFkYmVlZixyMQorCW12aV9oX2dyCTB4ODAscjIKKwltdnJfaF9tZW0JcjEscjIKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkbid0IGNoYW5nZQorCWRtb3ZiCQlAMHg4MCxyMTMKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX2dyCTB4ZmZmZmZmZGUscjEzCisKKwk7IFRlc3QgZG1vdmIgJFIxMyxAJGRpcjgKKwltdmlfaF9ncgkweGJlZWZkZWFkLHIxMworCXNldF9jYyAgICAgICAgICAweDBlCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCisJZG1vdmIJCXIxMyxAMHg4MAorCXRlc3RfY2MJCTEgMSAxIDAKKwl0ZXN0X2hfbWVtCTB4YWRhZGJlZWYscjIKKworCTsgVGVzdCBkbW92YiBAJGRpcjgsQFIxMysKKwltdmlfaF9ncgkweDdjLHIxMworCW12aV9oX21lbQkweGRlYWRiZWVmLHIxMworCXNldF9jYyAgICAgICAgICAweDBkCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCisJZG1vdmIJCUAweDdmLEByMTMrCisJdGVzdF9jYwkJMSAxIDAgMQorCW12aV9oX2dyCTB4N2MscjIKKwl0ZXN0X2hfbWVtCTB4ZWZhZGJlZWYscjIKKwl0ZXN0X2hfZ3IJMHg3ZCxyMTMKKworCTsgVGVzdCBkbW92YiBAJFIxMyssQCRkaXI4CisJbXZpX2hfZ3IJMHg3YyxyMTMKKwltdmlfaF9tZW0JMHhiZWVmZGVhZCxyMTMKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkbid0IGNoYW5nZQorCWRtb3ZiCQlAcjEzKyxAMHg3ZgorCXRlc3RfY2MJCTEgMSAwIDAKKwltdmlfaF9ncgkweDdjLHIyCisJdGVzdF9oX21lbQkweGJlZWZkZWJlLHIyCisJdGVzdF9oX2dyCTB4N2QscjEzCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Rtb3ZoLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZG1vdmguY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YWZiNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2Rtb3ZoLmNncwpAQCAtMCwwICsxLDQ2IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGRtb3ZoCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBkbW92aAorZG1vdmg6CisJOyBUZXN0IGRtb3ZoIEAkZGlyOSwkUjEzCisJbXZpX2hfZ3IJMHhkZWFkYmVlZixyMQorCW12aV9oX2dyCTB4MTAwLHIyCisJbXZyX2hfbWVtCXIxLHIyCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZG4ndCBjaGFuZ2UKKwlkbW92aAkJQDB4MTAwLHIxMworCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0X2hfZ3IJMHhmZmZmZGVhZCxyMTMKKworCTsgVGVzdCBkbW92aCAkUjEzLEAkZGlyOQorCW12aV9oX2dyCTB4ZGVhZGJlZWYscjEzCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZG4ndCBjaGFuZ2UKKwlkbW92aAkJcjEzLEAweDEwMAorCXRlc3RfY2MJCTEgMSAxIDAKKwl0ZXN0X2hfbWVtCTB4YmVlZmJlZWYscjIKKworCTsgVGVzdCBkbW92aCBAJGRpcjksQFIxMysKKwltdmlfaF9ncgkweDFmYyxyMTMKKwltdmlfaF9tZW0JMHhkZWFkYmVlZixyMTMKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkbid0IGNoYW5nZQorCWRtb3ZoCQlAMHgxZmUsQHIxMysKKwl0ZXN0X2NjCQkxIDEgMCAxCisJbXZpX2hfZ3IJMHgxZmMscjIKKwl0ZXN0X2hfbWVtCTB4YmVlZmJlZWYscjIKKwl0ZXN0X2hfZ3IJMHgxZmUscjEzCisKKwk7IFRlc3QgZG1vdmggQCRSMTMrLEAkZGlyOQorCW12aV9oX2dyCTB4MWZjLHIxMworCW12aV9oX21lbQkweGJlZWZkZWFkLHIxMworCXNldF9jYyAgICAgICAgICAweDBjCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGRuJ3QgY2hhbmdlCisJZG1vdmgJCUByMTMrLEAweDFmZQorCXRlc3RfY2MJCTEgMSAwIDAKKwltdmlfaF9ncgkweDFmYyxyMgorCXRlc3RfaF9tZW0JMHhiZWVmYmVlZixyMgorCXRlc3RfaF9ncgkweDFmZSxyMTMKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZW50ZXIuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9lbnRlci5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3NWUxNgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZW50ZXIuY2dzCkBAIC0wLDAgKzEsMzQgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgZW50ZXIgJHUxMAorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBlbnRlcgorZW50ZXI6CisJOyBUZXN0IGVudGVyICR1MTAKKwltdnJfaF9nciAgIAlzcCxyNwkJCTsgc2F2ZSBzdGFjayBwb2ludGVyCisJbXZyX2hfZ3IJc3AscjgJCQk7IHNoYWRvdyBzdGFjayBwb2ludGVyCisJbXZyX2hfZ3IJc3AscjE0CQk7IEluaXRpYWxpemUKKwlzZXRfY2MJMHgwZgkJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJZW50ZXIgICAgICAJMAorCXRlc3RfY2MJMSAxIDEgMQorCXRlc3RyX2hfZ3IgCXI4LHNwCisJaW5jaV9oX2dyCS00LHI4CisJdGVzdHJfaF9ncglyMTQscjgKKwl0ZXN0cl9oX21lbQlyNyxyMTQKKworCW12cl9oX2dyCXNwLHI4CQkJOyBzaGFkb3cgc3RhY2sgcG9pbnRlcgorCW12cl9oX2dyCXIxNCxyOQkJOyBzYXZlCisJc2V0X2NjCTB4MGUJCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCWVudGVyICAgICAgCTB4M2ZjCisJdGVzdF9jYwkxIDEgMSAwCisJaW5jaV9oX2dyCS00LHI4CisJdGVzdHJfaF9ncglyMTQscjgKKwl0ZXN0cl9oX21lbQlyOSxyMTQKKwlpbmNpX2hfZ3IJLTB4M2Y4LHI4CisJdGVzdHJfaF9nciAJcjgsc3AKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZW9yLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZW9yLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODcwNzYxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9lb3IuY2dzCkBAIC0wLDAgKzEsNjkgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgZW9yICRSaiwkUmksIGVvciAkUmosQCRSaQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBlb3IKK2VvcjoKKwk7IFRlc3QgZW9yICRSaiwkUmkKKwltdmlfaF9nciAgIAkweGFhYWFhYWFhLHI3CisJbXZpX2hfZ3IgICAJMHg1NTU1NTU1NSxyOAorCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJZW9yICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMSAwIDEgMQorCXRlc3RfaF9nciAgCTB4ZmZmZmZmZmYscjgKKworCW12aV9oX2dyICAgCTB4MDAwMDAwMDAscjcKKwltdmlfaF9nciAgIAkweDAwMDAwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwllb3IJCXI3LHI4CisJdGVzdF9jYwkJMCAxIDAgMAorCXRlc3RfaF9nciAgCTB4MDAwMDAwMDAscjgKKworCW12aV9oX2dyICAgCTB4YWFhYWFhYWEscjcKKwltdmlfaF9nciAgIAkweGFhYWFhYWFhLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwllb3IgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDEgMSAxCisJdGVzdF9oX2dyICAJMHgwMDAwMDAwMCxyOAorCisJbXZpX2hfZ3IgICAJMHhkZWFkMDAwMCxyNworCW12aV9oX2dyICAgCTB4MDAwMGJlZWYscjgKKwlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWVvcgkJcjcscjgKKwl0ZXN0X2NjCQkxIDAgMCAxCisJdGVzdF9oX2dyICAJMHhkZWFkYmVlZixyOAorCisJOyBUZXN0IGVvciAkUmosQCRSaQorCW12aV9oX2dyICAgCTB4YWFhYWFhYWEscjcKKwltdmlfaF9tZW0gIAkweDU1NTU1NTU1LHNwCisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwllb3IgICAgICAJcjcsQHNwCisJdGVzdF9jYwkJMSAwIDEgMQorCXRlc3RfaF9tZW0gCTB4ZmZmZmZmZmYsc3AKKworCW12aV9oX2dyICAgCTB4MDAwMDAwMDAscjcKKwltdmlfaF9tZW0gIAkweDAwMDAwMDAwLHNwCisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwllb3IJCXI3LEBzcAorCXRlc3RfY2MJCTAgMSAwIDAKKwl0ZXN0X2hfbWVtIAkweDAwMDAwMDAwLHNwCisKKwltdmlfaF9nciAgIAkweGFhYWFhYWFhLHI3CisJbXZpX2hfbWVtICAJMHhhYWFhYWFhYSxzcAorCXNldF9jYyAgICAgICAgICAweDBiCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJZW9yICAgICAgCXI3LEBzcAorCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfbWVtIAkweDAwMDAwMDAwLHNwCisKKwltdmlfaF9nciAgIAkweGRlYWQwMDAwLHI3CisJbXZpX2hfbWVtICAJMHgwMDAwYmVlZixzcAorCXNldF9jYyAgICAgICAgICAweDA1CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJZW9yCQlyNyxAc3AKKwl0ZXN0X2NjCQkxIDAgMCAxCisJdGVzdF9oX21lbSAJMHhkZWFkYmVlZixzcAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9lb3JiLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZW9yYi5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQwZjNmNwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZW9yYi5jZ3MKQEAgLTAsMCArMSw0MCBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBlb3JiICRSaiwkUmksIGVvcmIgJFJqLEAkUmkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgZW9yYgorZW9yYjoKKwk7IFRlc3QgZW9yYiAkUmosQCRSaQorCW12aV9oX2dyICAgCTB4YWFhYWFhYWEscjcKKwltdmlfaF9tZW0gIAkweDU1NTU1NTU1LHNwCisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwllb3JiICAgICAgCXI3LEBzcAorCXRlc3RfY2MJCTEgMCAxIDEKKwl0ZXN0X2hfbWVtIAkweGZmNTU1NTU1LHNwCisKKwltdmlfaF9nciAgIAkweGFhYWFhYTAwLHI3CisJbXZpX2hfbWVtICAJMHgwMDU1NTU1NSxzcAorCXNldF9jYyAgICAgICAgICAweDA4CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJZW9yYgkJcjcsQHNwCisJdGVzdF9jYwkJMCAxIDAgMAorCXRlc3RfaF9tZW0gCTB4MDA1NTU1NTUsc3AKKworCW12aV9oX2dyICAgCTB4YWFhYWFhNTUscjcKKwltdmlfaF9tZW0gIAkweDU1YWFhYWFhLHNwCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwllb3JiICAgICAgCXI3LEBzcAorCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfbWVtIAkweDAwYWFhYWFhLHNwCisKKwltdmlfaF9nciAgIAkweDAwMDAwMGQwLHI3CisJbXZpX2hfbWVtICAJMHgwZWFkYmVlZixzcAorCXNldF9jYyAgICAgICAgICAweDA1CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJZW9yYgkJcjcsQHNwCisJdGVzdF9jYwkJMSAwIDAgMQorCXRlc3RfaF9tZW0gCTB4ZGVhZGJlZWYsc3AKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZW9yaC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2VvcmguY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZjg0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2VvcmguY2dzCkBAIC0wLDAgKzEsNDAgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgZW9yaCAkUmosJFJpLCBlb3JoICRSaixAJFJpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGVvcmgKK2Vvcmg6CisJOyBUZXN0IGVvcmggJFJqLEAkUmkKKwltdmlfaF9nciAgIAkweGFhYWFhYWFhLHI3CisJbXZpX2hfbWVtICAJMHg1NTU1NTU1NSxzcAorCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJZW9yaCAgICAgIAlyNyxAc3AKKwl0ZXN0X2NjCQkxIDAgMSAxCisJdGVzdF9oX21lbSAJMHhmZmZmNTU1NSxzcAorCisJbXZpX2hfZ3IgICAJMHhhYWFhMDAwMCxyNworCW12aV9oX21lbSAgCTB4MDAwMDU1NTUsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWVvcmgJCXI3LEBzcAorCXRlc3RfY2MJCTAgMSAwIDAKKwl0ZXN0X2hfbWVtIAkweDAwMDA1NTU1LHNwCisKKwltdmlfaF9nciAgIAkweGFhYWE1NTU1LHI3CisJbXZpX2hfbWVtICAJMHg1NTU1YWFhYSxzcAorCXNldF9jYyAgICAgICAgICAweDBiCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJZW9yaCAgICAgIAlyNyxAc3AKKwl0ZXN0X2NjCQkwIDEgMSAxCisJdGVzdF9oX21lbSAJMHgwMDAwYWFhYSxzcAorCisJbXZpX2hfZ3IgICAJMHgwMDAwZGUwMCxyNworCW12aV9oX21lbSAgCTB4MDBhZGJlZWYsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWVvcmgJCXI3LEBzcAorCXRlc3RfY2MJCTEgMCAwIDEKKwl0ZXN0X2hfbWVtIAkweGRlYWRiZWVmLHNwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2V4dHNiLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZXh0c2IuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMThkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2V4dHNiLmNncwpAQCAtMCwwICsxLDM2IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGV4dHNiICRSaQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBleHRzYgorZXh0c2I6CisJOyBUZXN0IGV4dHNiICRSaQorCW12aV9oX2dyICAgCTAscjcKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlleHRzYiAgICAgIAlyNworCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkwLHI3CisKKwltdmlfaF9nciAgIAkweDdmLHI3CisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJZXh0c2IgICAgICAJcjcKKwl0ZXN0X2NjCQkxIDEgMSAwCisJdGVzdF9oX2dyICAJMHg3ZixyNworCisgCW12aV9oX2dyICAgCTB4ODAscjcKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlleHRzYiAgICAgIAlyNworCXRlc3RfY2MJCTEgMSAwIDEKKwl0ZXN0X2hfZ3IgIAkweGZmZmZmZjgwLHI3CisKKwltdmlfaF9nciAgIAkweGZmZmZmZjdmLHI3CisJc2V0X2NjICAgICAgICAgIDB4MGMJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJZXh0c2IgICAgICAJcjcKKwl0ZXN0X2NjCQkxIDEgMCAwCisJdGVzdF9oX2dyICAJMHg3ZixyNworCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9leHRzaC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2V4dHNoLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjEyZmQwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9leHRzaC5jZ3MKQEAgLTAsMCArMSw0OCBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBleHRzaCAkUmkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgZXh0c2gKK2V4dHNoOgorCTsgVGVzdCBleHRzaCAkUmkKKwltdmlfaF9nciAgIAkwLHI3CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJZXh0c2ggICAgICAJcjcKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX2dyICAJMCxyNworCisJbXZpX2hfZ3IgICAJMHg3ZixyNworCXNldF9jYyAgICAgICAgICAweDBlCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCWV4dHNoICAgICAgCXI3CisJdGVzdF9jYwkJMSAxIDEgMAorCXRlc3RfaF9nciAgCTB4N2YscjcKKworIAltdmlfaF9nciAgIAkweDgwLHI3CisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJZXh0c2ggICAgICAJcjcKKwl0ZXN0X2NjCQkxIDEgMCAxCisJdGVzdF9oX2dyICAJMHg4MCxyNworCisgCW12aV9oX2dyICAgCTB4N2ZmZixyNworCXNldF9jYyAgICAgICAgICAweDBjCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCWV4dHNoICAgICAgCXI3CisJdGVzdF9jYwkJMSAxIDAgMAorCXRlc3RfaF9nciAgCTB4N2ZmZixyNworCisgCW12aV9oX2dyICAgCTB4ODAwMCxyNworCXNldF9jYyAgICAgICAgICAweDBiCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCWV4dHNoICAgICAgCXI3CisJdGVzdF9jYwkJMSAwIDEgMQorCXRlc3RfaF9nciAgCTB4ZmZmZjgwMDAscjcKKworCW12aV9oX2dyICAgCTB4ZmZmZjdmZmYscjcKKwlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlleHRzaCAgICAgIAlyNworCXRlc3RfY2MJCTEgMCAxIDAKKwl0ZXN0X2hfZ3IgIAkweDdmZmYscjcKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZXh0dWIuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9leHR1Yi5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjYzY4MwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvZXh0dWIuY2dzCkBAIC0wLDAgKzEsNDIgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgZXh0dWIgJFJpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGV4dHViCitleHR1YjoKKwk7IFRlc3QgZXh0dWIgJFJpCisJbXZpX2hfZ3IgICAJMCxyNworCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCWV4dHViICAgICAgCXI3CisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAgCTAscjcKKworCW12aV9oX2dyICAgCTB4N2YscjcKKwlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlleHR1YiAgICAgIAlyNworCXRlc3RfY2MJCTEgMSAxIDAKKwl0ZXN0X2hfZ3IgIAkweDdmLHI3CisKKyAJbXZpX2hfZ3IgICAJMHg4MCxyNworCXNldF9jYyAgICAgICAgICAweDBkCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCWV4dHViICAgICAgCXI3CisJdGVzdF9jYwkJMSAxIDAgMQorCXRlc3RfaF9nciAgCTB4ODAscjcKKworCW12aV9oX2dyICAgCTB4ZmZmZmZmN2YscjcKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwlleHR1YiAgICAgIAlyNworCXRlc3RfY2MJCTEgMSAwIDAKKwl0ZXN0X2hfZ3IgIAkweDdmLHI3CisKKwltdmlfaF9nciAgIAkweGZmZmZmZjgwLHI3CisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJZXh0dWIgICAgICAJcjcKKwl0ZXN0X2NjCQkxIDAgMSAxCisJdGVzdF9oX2dyICAJMHg4MCxyNworCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9leHR1aC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2V4dHVoLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTI1NzllCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9leHR1aC5jZ3MKQEAgLTAsMCArMSw1NCBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBleHR1aCAkUmkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgZXh0dWgKK2V4dHVoOgorCTsgVGVzdCBleHR1aCAkUmkKKwltdmlfaF9nciAgIAkwLHI3CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJZXh0dWggICAgICAJcjcKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX2dyICAJMCxyNworCisJbXZpX2hfZ3IgICAJMHg3ZixyNworCXNldF9jYyAgICAgICAgICAweDBlCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCWV4dHVoICAgICAgCXI3CisJdGVzdF9jYwkJMSAxIDEgMAorCXRlc3RfaF9nciAgCTB4N2YscjcKKworIAltdmlfaF9nciAgIAkweDgwLHI3CisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJZXh0dWggICAgICAJcjcKKwl0ZXN0X2NjCQkxIDEgMCAxCisJdGVzdF9oX2dyICAJMHg4MCxyNworCisJbXZpX2hfZ3IgICAJMHg3ZmZmLHI3CisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJZXh0dWggICAgICAJcjcKKwl0ZXN0X2NjCQkxIDEgMSAwCisJdGVzdF9oX2dyICAJMHg3ZmZmLHI3CisKKyAJbXZpX2hfZ3IgICAJMHg4MDAwLHI3CisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJZXh0dWggICAgICAJcjcKKwl0ZXN0X2NjCQkxIDEgMCAxCisJdGVzdF9oX2dyICAJMHg4MDAwLHI3CisKKwltdmlfaF9nciAgIAkweGZmZmY3ZmZmLHI3CisJc2V0X2NjICAgICAgICAgIDB4MGMJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJZXh0dWggICAgICAJcjcKKwl0ZXN0X2NjCQkxIDEgMCAwCisJdGVzdF9oX2dyICAJMHg3ZmZmLHI3CisKKwltdmlfaF9nciAgIAkweGZmZmY4MDAwLHI3CisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJZXh0dWggICAgICAJcjcKKwl0ZXN0X2NjCQkxIDAgMSAxCisJdGVzdF9oX2dyICAJMHg4MDAwLHI3CisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2hlbGxvLm1zIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9oZWxsby5tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjIwOGRmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9oZWxsby5tcwpAQCAtMCwwICsxLDE5IEBACisjIG1hY2g6IGZyMzAKKyMgb3V0cHV0OiBIZWxsbyB3b3JsZCFcbgorCisJLmdsb2JhbCBfc3RhcnQKK19zdGFydDoKKworOyB3cml0ZSAoaGVsbG8gd29ybGQpCisJbGRpMzIgIzE0LHI2CisJbGRpMzIgI2hlbGxvLHI1CisJbGRpMzIgIzEscjQKKwlsZGkzMiAjNSxyMAorCWludCAgICMxMAorOyBleGl0ICgwKQorCWxkaTMyICMwLHI0CisJbGRpMzIgIzEscjAKKwlpbnQgICAjMTAKKworbGVuZ3RoOgkubG9uZyAxNAoraGVsbG86CS5hc2NpaSAiSGVsbG8gd29ybGQhXHJcbiIKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvaW50LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvaW50LmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2RjYTdiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9pbnQuY2dzCkBAIC0wLDAgKzEsMzUgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgaW50ICR1OAorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBpbnQKK2ludDoKKwk7IFRlc3QgaW50ICR1OCAtIHNldHVwIGFuZCB0ZXN0IGFuIGludGVycnVwdCAjMHhmZCAocmFuZG9tbHkgY2hvc2VuKQorCW12cl9oX2dyICAgCXRicixyNworCWluY2lfaF9ncgk4LHI3CisJbXZpX2hfbWVtCXBhc3MscjcKKwltdmlfaF9ncglkb2ludCxyOQorCWluY2lfaF9ncgkyLHI5CisJbXZyX2hfZ3IJc3NwLHIxMAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCXNldF9zX3VzZXIJCQk7IFNldCBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCXNldF9pCQkxCQk7IFNldCBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW12cl9oX2dyCXBzLHI4Citkb2ludDoJaW50CQkweGZkCisJZmFpbAorCitwYXNzOgorCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0X3Nfc3lzdGVtCisJdGVzdF9pCQkwCisJaW5jaV9oX2dyCS00LHIxMAorCXRlc3RyX2hfbWVtCXI4LHIxMAorCWluY2lfaF9ncgktNCxyMTAKKwl0ZXN0cl9oX21lbQlyOSxyMTAKKwl0ZXN0cl9oX2RyCXIxMCxzc3AKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvaW50ZS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2ludGUuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNWJmZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2ludGUuY2dzCkBAIC0wLDAgKzEsMzYgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgaW50ZQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBpbnRlCitpbnRlOgorCTsgVGVzdCBpbnRlIHdoaWNoIGlzIGVzc2VudGlhbGx5IGludCAjOQorCW12cl9oX2dyICAgCXRicixyNworCWluY2lfaF9ncgkweDNkOCxyNworCW12aV9oX21lbQlwYXNzLHI3CisJbXZpX2hfZ3IJZG9pbnQscjkKKwlpbmNpX2hfZ3IJMixyOQorCW12cl9oX2dyCXNzcCxyMTAKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlzZXRfc191c2VyCQkJOyBTZXQgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlzZXRfaQkJMQkJOyBTaG91bGQgbm90IGNoYW5nZQorCW12cl9oX2dyCXBzLHI4Citkb2ludDoJaW50ZQorCWZhaWwKKworcGFzczoKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9pbG0JNAorCXRlc3Rfc19zeXN0ZW0KKwl0ZXN0X2kJCTEKKwlpbmNpX2hfZ3IJLTQscjEwCisJdGVzdHJfaF9tZW0JcjgscjEwCisJaW5jaV9oX2dyCS00LHIxMAorCXRlc3RyX2hfbWVtCXI5LHIxMAorCXRlc3RyX2hfZHIJcjEwLHNzcAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9qbXAuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9qbXAuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNGFmMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2ptcC5jZ3MKQEAgLTAsMCArMSwyOSBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBqbXAgQCRSaQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBqbXAKKworCTsgVGVzdCBqbXAgJFJpCisJbXZpX2hfZ3IgICAJI2Z1bmMxLHIwCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZG4ndCBjaGFuZ2UKK2ptcDE6CisJam1wCQlAcjAKKwlmYWlsCitmdW5jMToKKwl0ZXN0X2NjCQkxIDEgMSAxCisJbXZpX2hfZ3IgICAJI2Z1bmMyLHIwCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZG4ndCBjaGFuZ2UKK2ptcDI6CisJam1wOmQJCUByMAorCWxkaTo4CQkxLHIwCQk7IE11c3QgYXNzdW1lIHRoaXMgd29ya3MKKwlmYWlsCitmdW5jMjoKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdHJfaF9ncgkxLHIwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbGQuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMmQzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkLmNncwpAQCAtMCwwICsxLDIxOSBAQAorIyBmcjMwIHRlc3RjYXNlIGZvcgorIyBtYWNoKCk6IGZyMzAKKyMgbGQgJFJqLCRSaQorIyBsZCBAKCRSMTMsJFJqKSwkUmkKKyMgbGQgQCgkUjE0LCRkaXNwMTApLCRSaQorIyBsZCBAKCRSMTUsJHVkaXNwNiksJFJpCisjIGxkIEAkUjE1KywkUmkKKyMgbGQgQCRSMTUrLCRScworCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGxkCitsZDoKKwk7IFRlc3QgbGQgJFJqLCRSaQorCW12aV9oX21lbQkjMHgwMDAwMDAwMCxzcAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkCQlAc3AscjcKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX2dyICAJMCxyNworCisJbXZpX2hfbWVtCSMweDAwMDAwMDAxLHNwCisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGQgICAgCQlAc3AscjcKKwl0ZXN0X2NjCQkwIDEgMSAxCisJdGVzdF9oX2dyICAJMSxyNworCisJbXZpX2hfbWVtCSMweDdmZmZmZmZmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGQJCUBzcCxyNworCXRlc3RfY2MJCTEgMCAxIDEKKwl0ZXN0X2hfZ3IgIAkweDdmZmZmZmZmLHI3CisKKwltdmlfaF9tZW0JIzB4ODAwMDAwMDAsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZCAgICAgIAlAc3AscjcKKwl0ZXN0X2NjCQkxIDEgMCAxCisJdGVzdF9oX2dyICAJMHg4MDAwMDAwMCxyNworCisJbXZpX2hfbWVtCSMweGZmZmZmZmZmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGQJCUBzcCxyNworCXRlc3RfY2MJCTEgMSAxIDAKKwl0ZXN0X2hfZ3IgIAktMSxyNworCisJOyBUZXN0IGxkIEAoJFIxMywkUmopLCRSaQorCW12cl9oX2dyCXNwLHIxMworCWluY2lfaF9ncgktOCxyMTMKKwltdmlfaF9ncgk4LHI4CisKKwltdmlfaF9tZW0JIzB4MDAwMDAwMDAsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZAkJQChyMTMscjgpLHI3CisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAgCTAscjcKKworCW12aV9oX21lbQkjMHgwMDAwMDAwMSxzcAorCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkICAgIAkJQChyMTMscjgpLHI3CisJdGVzdF9jYwkJMCAxIDEgMQorCXRlc3RfaF9nciAgCTEscjcKKworCW12aV9oX21lbQkjMHg3ZmZmZmZmZixzcAorCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkCQlAKHIxMyxyOCkscjcKKwl0ZXN0X2NjCQkxIDAgMSAxCisJdGVzdF9oX2dyICAJMHg3ZmZmZmZmZixyNworCisJbXZpX2hfbWVtCSMweDgwMDAwMDAwLHNwCisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGQgICAgICAJQChyMTMscjgpLHI3CisJdGVzdF9jYwkJMSAxIDAgMQorCXRlc3RfaF9nciAgCTB4ODAwMDAwMDAscjcKKworCW12aV9oX21lbQkjMHhmZmZmZmZmZixzcAorCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkCQlAKHIxMyxyOCkscjcKKwl0ZXN0X2NjCQkxIDEgMSAwCisJdGVzdF9oX2dyICAJLTEscjcKKworCTsgVGVzdCBsZCBAKCRSMTQsJGRpc3AxMCksJFJpCisJbXZpX2hfbWVtCSMweGRlYWRiZWVmLHNwCisJbXZyX2hfZ3IJc3AscjE0CisJbXZpX2hfZ3IJLTB4MWZjLHI4CisJYWRkX2hfZ3IJcjgscjE0CisKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZAkJQChyMTQsMHgxZmMpLHI3CisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAgCTB4ZGVhZGJlZWYscjcKKworCWluY2lfaF9ncgkweGZjLHIxNAorCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkICAgIAkJQChyMTQsMHgxMDApLHI3CisJdGVzdF9jYwkJMCAxIDEgMQorCXRlc3RfaF9nciAgCTB4ZGVhZGJlZWYscjcKKworCWluY2lfaF9ncgkweDEwMCxyMTQKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZAkJQChyMTQsMHgwKSxyNworCXRlc3RfY2MJCTEgMCAxIDEKKwl0ZXN0X2hfZ3IgIAkweGRlYWRiZWVmLHI3CisKKwlpbmNpX2hfZ3IJMHgxMDAscjE0CisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGQgICAgICAJQChyMTQsLTB4MTAwKSxyNworCXRlc3RfY2MJCTEgMSAwIDEKKwl0ZXN0X2hfZ3IgIAkweGRlYWRiZWVmLHI3CisKKwlpbmNpX2hfZ3IJMHgxMDAscjE0CisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGQJCUAocjE0LC0weDIwMCkscjcKKwl0ZXN0X2NjCQkxIDEgMSAwCisJdGVzdF9oX2dyICAJMHhkZWFkYmVlZixyNworCisJOyBUZXN0IGxkIEAoJFIxNSwkdWRpc3A2KSwkUmkKKwltdmlfaF9tZW0JIzB4ZGVhZGJlZWYsc3AKKwltdnJfaF9ncglzcCxyMTQKKwltdmlfaF9ncgktMHgzYyxyOAorCWFkZF9oX2dyCXI4LHIxNAorCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGQJCUAocjE0LDB4M2MpLHI3CisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAgCTB4ZGVhZGJlZWYscjcKKworCWluY2lfaF9ncgkweDFjLHIxNAorCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkICAgIAkJQChyMTQsMHgyMCkscjcKKwl0ZXN0X2NjCQkwIDEgMSAxCisJdGVzdF9oX2dyICAJMHhkZWFkYmVlZixyNworCisJaW5jaV9oX2dyCTB4MjAscjE0CisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGQJCUAocjE0LDB4MCkscjcKKwl0ZXN0X2NjCQkxIDAgMSAxCisJdGVzdF9oX2dyICAJMHhkZWFkYmVlZixyNworCisJOyBUZXN0IGxkIEAkUjE1KywkUmkKKwltdnJfaF9ncglzcCxyOAkJOyBzYXZlIG9yaWdpbmFsIHN0YWNrIHBvaW50ZXIKKwltdnJfaF9ncglyOCxyOQorCWluY2lfaF9ncgk0LHI5CQk7IG9yaWdpbmFsIHN0YWNrIHBvaW50ZXIgKyA0CisJbXZpX2hfbWVtCSMweGRlYWRiZWVmLHNwCTsgcHJpbWUgbWVtb3J5CisKKwltdnJfaF9ncglyOCxzcAkJOyByZXN0b3JlIG9yaWdpbmFsIHN0YWNrIHBvaW50ZXIKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZAkJQHIxNSsscjcKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX2dyICAJMHhkZWFkYmVlZixyNworCXRlc3RyX2hfZ3IJc3AscjkJCTsgc2hvdWxkIGhhdmUgYmVlbiBpbmNyZW1lbnRlZAorCisJbXZyX2hfZ3IJcjgsc3AJCTsgcmVzdG9yZSBvcmlnaW5hbCBzdGFjayBwb2ludGVyCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGQJCUByMTUrLHNwCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAgCTB4ZGVhZGJlZWYsc3AJOyBzaG91bGQgbm90IGhhdmUgYmVlbiBpbmNyZW1lbnRlZAorCisJOyBUZXN0IGxkIEAkUjE1KywkUnMKKwltdnJfaF9ncglyOCxzcAkJOyByZXN0b3JlIG9yaWdpbmFsIHN0YWNrIHBvaW50ZXIKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZAkJQHIxNSssdGJyCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9kciAgCTB4ZGVhZGJlZWYsdGJyCisJdGVzdHJfaF9ncglzcCxyOQkJOyBzaG91bGQgaGF2ZSBiZWVuIGluY3JlbWVudGVkCisKKwltdnJfaF9ncglyOCxzcAkJOyByZXN0b3JlIG9yaWdpbmFsIHN0YWNrIHBvaW50ZXIKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZAkJQHIxNSsscnAKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX2RyICAJMHhkZWFkYmVlZixycAorCXRlc3RyX2hfZ3IJc3AscjkJCTsgc2hvdWxkIGhhdmUgYmVlbiBpbmNyZW1lbnRlZAorCisJbXZyX2hfZ3IJcjgsc3AJCTsgcmVzdG9yZSBvcmlnaW5hbCBzdGFjayBwb2ludGVyCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGQJCUByMTUrLG1kaAorCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0X2hfZHIgIAkweGRlYWRiZWVmLG1kaAorCXRlc3RyX2hfZ3IJc3AscjkJCTsgc2hvdWxkIGhhdmUgYmVlbiBpbmNyZW1lbnRlZAorCisJbXZyX2hfZ3IJcjgsc3AJCTsgcmVzdG9yZSBvcmlnaW5hbCBzdGFjayBwb2ludGVyCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGQJCUByMTUrLG1kbAorCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0X2hfZHIgIAkweGRlYWRiZWVmLG1kbAorCXRlc3RyX2hfZ3IJc3AscjkJCTsgc2hvdWxkIGhhdmUgYmVlbiBpbmNyZW1lbnRlZAorCisJc2V0X3NfdXNlcgorCW12cl9oX2dyCXI4LHNwCQk7IHJlc3RvcmUgb3JpZ2luYWwgc3RhY2sgcG9pbnRlcgorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkCQlAcjE1Kyxzc3AKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX2RyICAJMHhkZWFkYmVlZixzc3AKKwl0ZXN0cl9oX2dyCXNwLHI5CQk7IHNob3VsZCBoYXZlIGJlZW4gaW5jcmVtZW50ZWQKKworCW12cl9oX2dyCXI4LHNwCQk7IHJlc3RvcmUgb3JpZ2luYWwgc3RhY2sgcG9pbnRlcgorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkCQlAcjE1Kyx1c3AKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX2RyICAJMHhkZWFkYmVlZix1c3AKKwl0ZXN0X2hfZ3IJMHhkZWFkYmVlZixzcAk7IHNob3VsZCBub3QgaGF2ZSBiZWVuIGluY3JlbWVudGVkCisKKwlzZXRfc19zeXN0ZW0KKwltdnJfaF9ncglyOCxzcAkJOyByZXN0b3JlIG9yaWdpbmFsIHN0YWNrIHBvaW50ZXIKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZAkJQHIxNSssdXNwCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9kciAgCTB4ZGVhZGJlZWYsdXNwCisJdGVzdHJfaF9ncglzcCxyOQkJOyBzaG91bGQgaGF2ZSBiZWVuIGluY3JlbWVudGVkCisKKwltdnJfaF9ncglyOCxzcAkJOyByZXN0b3JlIG9yaWdpbmFsIHN0YWNrIHBvaW50ZXIKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZAkJQHIxNSssc3NwCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9kciAgCTB4ZGVhZGJlZWYsc3NwCisJdGVzdF9oX2dyCTB4ZGVhZGJlZWYsc3AJOyBzaG91bGQgbm90IGhhdmUgYmVlbiBpbmNyZW1lbnRlZAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZGkyMC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkaTIwLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E0ZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZGkyMC5jZ3MKQEAgLTAsMCArMSwzNyBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBsZGkyMCAkaTIwLCRSaQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBsZGkyMAorbGRpMjA6CisJOyBUZXN0IGxkaTIwICRpMjAsJFJpCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGRpMjAJCSMweDAwMDAwMDAwLHI3CisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAgCTAscjcKKworCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkaToyMAkJMSxyNworCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkxLHI3CisKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZGkyMAkJMHg3ZmZmZixyNworCXRlc3RfY2MJCTEgMCAxIDEKKwl0ZXN0X2hfZ3IgIAkweDAwMDdmZmZmLHI3CisKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZGk6MjAJCTB4ODAwMDAscjcKKwl0ZXN0X2NjCQkxIDEgMCAxCisJdGVzdF9oX2dyICAJMHgwMDA4MDAwMCxyNworCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGRpMjAJCTB4ZmZmZmYscjcKKwl0ZXN0X2NjCQkxIDEgMSAwCisJdGVzdF9oX2dyICAJMHgwMDBmZmZmZixyNworCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZGkzMi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkaTMyLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTU2ZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZGkzMi5jZ3MKQEAgLTAsMCArMSwzNyBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBsZGkzMiAkaTMyLCRSaQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBsZGkzMgorbGRpMzI6CisJOyBUZXN0IGxkaTMyICRpMzIsJFJpCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGRpMzIJCSMweDAwMDAwMDAwLHI3CisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAgCTAscjcKKworCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkaTozMgkJMSxyNworCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkxLHI3CisKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZGkzMgkJMHg3ZmZmZmZmZixyNworCXRlc3RfY2MJCTEgMCAxIDEKKwl0ZXN0X2hfZ3IgIAkweDdmZmZmZmZmLHI3CisKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZGk6MzIJCTB4ODAwMDAwMDAscjcKKwl0ZXN0X2NjCQkxIDEgMCAxCisJdGVzdF9oX2dyICAJMHg4MDAwMDAwMCxyNworCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGRpMzIJCTB4ZmZmZmZmZmYscjcKKwl0ZXN0X2NjCQkxIDEgMSAwCisJdGVzdF9oX2dyICAJLTEscjcKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbGRpOC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkaTguY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMTVlZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkaTguY2dzCkBAIC0wLDAgKzEsMzcgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgbGRpOCAkaTgsJFJpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGxkaTgKK2xkaTg6CisJOyBUZXN0IGxkaTggJGk4LCRSaQorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkaTgJCSMweDAwMDAwMDAwLHI3CisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAgCTAscjcKKworCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkaToyMAkJMSxyNworCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkxLHI3CisKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZGk4CQkweDdmLHI3CisJdGVzdF9jYwkJMSAwIDEgMQorCXRlc3RfaF9nciAgCTB4MDAwMDAwN2YscjcKKworCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkaToyMAkJMHg4MCxyNworCXRlc3RfY2MJCTEgMSAwIDEKKwl0ZXN0X2hfZ3IgIAkweDAwMDAwMDgwLHI3CisKKwlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZGk4CQkweGZmLHI3CisJdGVzdF9jYwkJMSAxIDEgMAorCXRlc3RfaF9nciAgCTB4MDAwMDAwZmYscjcKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbGRtMC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkbTAuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZWI1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkbTAuY2dzCkBAIC0wLDAgKzEsNjAgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgbGRtMCAoJHJlZ2xpc3RfbG93KQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBsZG0wCitsZG0wOgorCTsgVGVzdCBsZG0wICgkcmVnbGlzdF9sb3cpCisJbXZyX2hfZ3IJc3AscjkJCTsgc2F2ZSBzdGFjayBwb2ludGVyIHBlcm1hbmVudGx5CisJaW5jaV9oX2dyCS00LHNwCisJbXZpX2hfbWVtICAJMyxzcAorCWluY2lfaF9ncgktNCxzcAorCW12aV9oX21lbSAgCTIsc3AKKwlpbmNpX2hfZ3IJLTQsc3AKKwltdmlfaF9tZW0gIAkxLHNwCisJaW5jaV9oX2dyCS00LHNwCisJbXZpX2hfbWVtICAJMCxzcAorCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGRtMCAgICAgIAkocjAscjIscjQscjYpCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RyX2hfZ3IJc3AscjkKKwl0ZXN0X2hfZ3IgCTAscjAKKwl0ZXN0X2hfZ3IgCTEscjIKKwl0ZXN0X2hfZ3IgCTIscjQKKwl0ZXN0X2hfZ3IgICAJMyxyNgorCisJaW5jaV9oX2dyCS0xNixzcAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkbTAgICAgICAJKHIxLHIzLHI1LHI3KQorCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0cl9oX2dyCXNwLHI5CisJdGVzdF9oX2dyIAkwLHIxCisJdGVzdF9oX2dyIAkxLHIzCisJdGVzdF9oX2dyIAkyLHI1CisJdGVzdF9oX2dyICAgCTMscjcKKworCWluY2lfaF9ncgktMTYsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZG0wICAgICAgCShyMSxyNSxyNyxyMykJOyBPcmRlciBzcGVmaWNpZWQgc2hvdWxkIG5vdCBtYXR0ZXIKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdHJfaF9ncglzcCxyOQorCXRlc3RfaF9nciAJMCxyMQorCXRlc3RfaF9nciAJMSxyMworCXRlc3RfaF9nciAJMixyNQorCXRlc3RfaF9nciAgIAkzLHI3CisKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZG0wICAgICAgCSgpCQk7IE5vdGhpbmcgc2hvdWxkIGhhcHBlbgorCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0cl9oX2dyCXNwLHI5CisJdGVzdF9oX2dyIAkwLHIxCisJdGVzdF9oX2dyIAkxLHIzCisJdGVzdF9oX2dyIAkyLHI1CisJdGVzdF9oX2dyICAgCTMscjcKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbGRtMS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkbTEuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzY2ZjZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkbTEuY2dzCkBAIC0wLDAgKzEsNTkgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgbGRtMSAoJHJlZ2xpc3RfbG93KQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBsZG0xCitsZG0xOgorCTsgVGVzdCBsZG0xICgkcmVnbGlzdF9sb3cpCisJbXZyX2hfZ3IJc3AscjEJCTsgc2F2ZSBzdGFjayBwb2ludGVyIHBlcm1hbmVudGx5CisJaW5jaV9oX2dyCS00LHNwCisJbXZpX2hfbWVtICAJMyxzcAorCWluY2lfaF9ncgktNCxzcAorCW12aV9oX21lbSAgCTIsc3AKKwlpbmNpX2hfZ3IJLTQsc3AKKwltdmlfaF9tZW0gIAkxLHNwCisJaW5jaV9oX2dyCS00LHNwCisJbXZpX2hfbWVtICAJMCxzcAorCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGRtMSAgICAgIAkocjgscjEwLHIxMixyMTQpCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RyX2hfZ3IJc3AscjEKKwl0ZXN0X2hfZ3IgCTAscjgKKwl0ZXN0X2hfZ3IgCTEscjEwCisJdGVzdF9oX2dyIAkyLHIxMgorCXRlc3RfaF9nciAgIAkzLHIxNAorCisJaW5jaV9oX2dyCS0xNixzcAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkbTEgICAgICAJKHI5LHIxMSxyMTMscjE1KQorCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0X2hfZ3IgCTAscjkKKwl0ZXN0X2hfZ3IgCTEscjExCisJdGVzdF9oX2dyIAkyLHIxMworCXRlc3RfaF9nciAgIAkzLHIxNQorCisJbXZyX2hfZ3IJcjEsc3AJCTsgcmVzdG9yZSBzdGFjayBwb2ludGVyCisJaW5jaV9oX2dyCS0xNixzcAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkbTEgICAgICAJKHI5LHIxMyxyMTUscjExKTsgT3JkZXIgc3BlZmljaWVkIHNob3VsZCBub3QgbWF0dGVyCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAJMCxyOQorCXRlc3RfaF9nciAJMSxyMTEKKwl0ZXN0X2hfZ3IgCTIscjEzCisJdGVzdF9oX2dyICAgCTMscjE1CisKKwltdnJfaF9ncglyMSxzcAkJOyByZXN0b3JlIHN0YWNrIHBvaW50ZXIKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZG0xICAgICAgCSgpCQk7IE5vdGhpbmcgc2hvdWxkIGhhcHBlbgorCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0cl9oX2dyCXNwLHIxCisJdGVzdF9oX2dyIAkwLHI5CisJdGVzdF9oX2dyIAkxLHIxMQorCXRlc3RfaF9nciAJMixyMTMKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbGRyZXMuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZHJlcy5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4MzQ4OQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbGRyZXMuY2dzCkBAIC0wLDAgKzEsMjUgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgbGRyZXMgJEBSaSssJHU0CisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGxkcmVzCitsZHJlczoKKwk7IFRlc3QgbGRyZXMgJEBSaSssJHU0CisJOyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgaW5jcmVtZW50cyBSaQorCW12aV9oX2dyICAgCTB4MTAwMCxyNworCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCWxkcmVzICAgICAgCUByNyssMAorCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkweDEwMDQscjcKKworCW12aV9oX2dyICAgCTB4MTAwMCxyNworCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCWxkcmVzICAgICAgCUByNyssMHhmCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAgCTB4MTAwNCxyNworCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZHViLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbGR1Yi5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlMDBkOQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbGR1Yi5jZ3MKQEAgLTAsMCArMSwxMTUgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IKKyMgbWFjaCgpOiBmcjMwCisjICBsZHViICRSaiwkUmkKKyMgIGxkdWIgQCgkUjEzLCRSaiksJFJpCisjICBsZHViIEAoJFIxNCwkZGlzcDgpLCRSaQorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGxkdWIKK2xkdWI6CisJOyBUZXN0IGxkdWIgJFJqLCRSaQorCW12aV9oX21lbQkjMHgwMGFkYmVlZixzcAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkdWIJCUBzcCxyNworCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkwLHI3CisKKwltdmlfaF9tZW0JIzB4MDFhZGJlZWYsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZHViICAgIAlAc3AscjcKKwl0ZXN0X2NjCQkwIDEgMSAxCisJdGVzdF9oX2dyICAJMSxyNworCisJbXZpX2hfbWVtCSMweDdmYWRiZWVmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGR1YgkJQHNwLHI3CisJdGVzdF9jYwkJMSAwIDEgMQorCXRlc3RfaF9nciAgCTB4N2YscjcKKworCW12aV9oX21lbQkjMHg4MGFkYmVlZixzcAorCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkdWIgICAgICAJQHNwLHI3CisJdGVzdF9jYwkJMSAxIDAgMQorCXRlc3RfaF9nciAgCTB4ODAscjcKKworCW12aV9oX21lbQkjMHhmZmFkYmVlZixzcAorCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkdWIJCUBzcCxyNworCXRlc3RfY2MJCTEgMSAxIDAKKwl0ZXN0X2hfZ3IgIAkweGZmLHI3CisKKwk7IFRlc3QgbGR1YiBAKCRSMTMsJFJqKSwkUmkKKwltdnJfaF9ncglzcCxyMTMKKwlpbmNpX2hfZ3IJLTgscjEzCisJbXZpX2hfZ3IJOCxyOAorCisJbXZpX2hfbWVtCSMweDAwYWRiZWVmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGR1YgkJQChyMTMscjgpLHI3CisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAgCTAscjcKKworCW12aV9oX21lbQkjMHgwMWFkYmVlZixzcAorCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkdWIgICAgCUAocjEzLHI4KSxyNworCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkxLHI3CisKKwltdmlfaF9tZW0JIzB4N2ZhZGJlZWYsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZHViCQlAKHIxMyxyOCkscjcKKwl0ZXN0X2NjCQkxIDAgMSAxCisJdGVzdF9oX2dyICAJMHg3ZixyNworCisJbXZpX2hfbWVtCSMweDgwYWRiZWVmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGR1YiAgICAgIAlAKHIxMyxyOCkscjcKKwl0ZXN0X2NjCQkxIDEgMCAxCisJdGVzdF9oX2dyICAJMHg4MCxyNworCisJbXZpX2hfbWVtCSMweGZmYWRiZWVmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGR1YgkJQChyMTMscjgpLHI3CisJdGVzdF9jYwkJMSAxIDEgMAorCXRlc3RfaF9nciAgCTB4ZmYscjcKKworCTsgVGVzdCBsZHViIEAoJFIxNCwkZGlzcDgpLCRSaQorCW12aV9oX21lbQkjMHhkZWFkYmVlZixzcAorCW12cl9oX2dyCXNwLHIxNAorCW12aV9oX2dyCS0weDdmLHI4CisJYWRkX2hfZ3IJcjgscjE0CisKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZHVoCQlAKHIxNCwweDdmKSxyNworCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkweGRlLHI3CisKKwlpbmNpX2hfZ3IJMHgzZSxyMTQKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZHVoICAgIAlAKHIxNCwweDQwKSxyNworCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkweGRlLHI3CisKKwlpbmNpX2hfZ3IJMHg0MCxyMTQKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZHVoCQlAKHIxNCwweDApLHI3CisJdGVzdF9jYwkJMSAwIDEgMQorCXRlc3RfaF9nciAgCTB4ZGUscjcKKworCWluY2lfaF9ncgkweDQwLHIxNAorCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkdWggICAgICAJQChyMTQsLTB4NDApLHI3CisJdGVzdF9jYwkJMSAxIDAgMQorCXRlc3RfaF9nciAgCTB4ZGUscjcKKworCWluY2lfaF9ncgkweDQwLHIxNAorCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkdWgJCUAocjE0LC0weDgwKSxyNworCXRlc3RfY2MJCTEgMSAxIDAKKwl0ZXN0X2hfZ3IgIAkweGRlLHI3CisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xkdWguY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZHVoLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDM2Yjc1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZHVoLmNncwpAQCAtMCwwICsxLDExNSBAQAorIyBmcjMwIHRlc3RjYXNlIGZvcgorIyBtYWNoKCk6IGZyMzAKKyMgbGR1aCAkUmosJFJpCisjIGxkdWggQCgkUjEzLCRSaiksJFJpCisjIGxkdWggQCgkUjE0LCRkaXNwOSksJFJpCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgbGR1aAorbGR1aDoKKwk7IFRlc3QgbGR1aCAkUmosJFJpCisJbXZpX2hfbWVtCSMweDAwMDBiZWVmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGR1aAkJQHNwLHI3CisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAgCTAscjcKKworCW12aV9oX21lbQkjMHgwMDAxYmVlZixzcAorCXNldF9jYyAgICAgICAgICAweDA3CQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkdWggICAgCUBzcCxyNworCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkxLHI3CisKKwltdmlfaF9tZW0JIzB4N2ZmZmJlZWYsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZHVoCQlAc3AscjcKKwl0ZXN0X2NjCQkxIDAgMSAxCisJdGVzdF9oX2dyICAJMHg3ZmZmLHI3CisKKwltdmlfaF9tZW0JIzB4ODAwMGJlZWYsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZHVoICAgICAgCUBzcCxyNworCXRlc3RfY2MJCTEgMSAwIDEKKwl0ZXN0X2hfZ3IgIAkweDgwMDAscjcKKworCW12aV9oX21lbQkjMHhmZmZmYmVlZixzcAorCXNldF9jYyAgICAgICAgICAweDBlCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkdWgJCUBzcCxyNworCXRlc3RfY2MJCTEgMSAxIDAKKwl0ZXN0X2hfZ3IgIAkweGZmZmYscjcKKworCTsgVGVzdCBsZHVoIEAoJFIxMywkUmopLCRSaQorCW12cl9oX2dyCXNwLHIxMworCWluY2lfaF9ncgktOCxyMTMKKwltdmlfaF9ncgk4LHI4CisKKwltdmlfaF9tZW0JIzB4MDAwMGJlZWYsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZHVoCQlAKHIxMyxyOCkscjcKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX2dyICAJMCxyNworCisJbXZpX2hfbWVtCSMweDAwMDFiZWVmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGR1aCAgICAJQChyMTMscjgpLHI3CisJdGVzdF9jYwkJMCAxIDEgMQorCXRlc3RfaF9nciAgCTEscjcKKworCW12aV9oX21lbQkjMHg3ZmZmYmVlZixzcAorCXNldF9jYyAgICAgICAgICAweDBiCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkdWgJCUAocjEzLHI4KSxyNworCXRlc3RfY2MJCTEgMCAxIDEKKwl0ZXN0X2hfZ3IgIAkweDdmZmYscjcKKworCW12aV9oX21lbQkjMHg4MDAwYmVlZixzcAorCXNldF9jYyAgICAgICAgICAweDBkCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkdWggICAgICAJQChyMTMscjgpLHI3CisJdGVzdF9jYwkJMSAxIDAgMQorCXRlc3RfaF9nciAgCTB4ODAwMCxyNworCisJbXZpX2hfbWVtCSMweGZmZmZiZWVmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGR1aAkJQChyMTMscjgpLHI3CisJdGVzdF9jYwkJMSAxIDEgMAorCXRlc3RfaF9nciAgCTB4ZmZmZixyNworCisJOyBUZXN0IGxkdWggQCgkUjE0LCRkaXNwOSksJFJpCisJbXZpX2hfbWVtCSMweGRlYWRiZWVmLHNwCisJbXZyX2hfZ3IJc3AscjE0CisJbXZpX2hfZ3IJLTB4ZmUscjgKKwlhZGRfaF9ncglyOCxyMTQKKworCXNldF9jYyAgICAgICAgICAweDBmCQk7IGNvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCWxkdWgJCUAocjE0LDB4ZmUpLHI3CisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAgCTB4ZGVhZCxyNworCisJaW5jaV9oX2dyCTB4N2UscjE0CisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGR1aCAgICAJQChyMTQsMHg4MCkscjcKKwl0ZXN0X2NjCQkwIDEgMSAxCisJdGVzdF9oX2dyICAJMHhkZWFkLHI3CisKKwlpbmNpX2hfZ3IJMHg4MCxyMTQKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZHVoCQlAKHIxNCwweDApLHI3CisJdGVzdF9jYwkJMSAwIDEgMQorCXRlc3RfaF9nciAgCTB4ZGVhZCxyNworCisJaW5jaV9oX2dyCTB4ODAscjE0CisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbGR1aCAgICAgIAlAKHIxNCwtMHg4MCkscjcKKwl0ZXN0X2NjCQkxIDEgMCAxCisJdGVzdF9oX2dyICAJMHhkZWFkLHI3CisKKwlpbmNpX2hfZ3IJMHg4MCxyMTQKKwlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlsZHVoCQlAKHIxNCwtMHgxMDApLHI3CisJdGVzdF9jYwkJMSAxIDEgMAorCXRlc3RfaF9nciAgCTB4ZGVhZCxyNworCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZWF2ZS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xlYXZlLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDNkZDcwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sZWF2ZS5jZ3MKQEAgLTAsMCArMSwyMyBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBsZWF2ZQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBsZWF2ZQorbGVhdmU6CisJOyBUZXN0IGxlYXZlICR1MTAKKwltdnJfaF9ncglzcCxyNwkJCTsgc2F2ZSBTdGFjayBwb2ludGVyCisJbXZyX2hfZ3IJc3AscjE0CisJaW5jaV9oX2dyCS00LHIxNAorCW12aV9oX21lbQkweGRlYWRiZWVmLHIxNAorCW12aV9oX2dyCTB4YmVlZmRlYWQscjE1CisJc2V0X2NjCTB4MGYJCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCWxlYXZlCisJdGVzdF9jYwkxIDEgMSAxCisJdGVzdHJfaF9ncglzcCxyNworCXRlc3RfaF9ncgkweGRlYWRiZWVmLHIxNAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sc2wuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sc2wuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZDc0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xzbC5jZ3MKQEAgLTAsMCArMSw2NSBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBsc2wgJFJqLCRSaSwgbHNsICR1NCwkUmoKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgbHNsCitsc2w6CisJOyBUZXN0IGxzbCAkUmosJFJpCisJbXZpX2hfZ3IgICAJMHhkZWFkYmVlMCxyNwk7IFNoaWZ0IGJ5IDAKKwltdmlfaF9nciAgIAkyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlsc2wgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDAgMCAwCisJdGVzdF9oX2dyICAJMixyOAorCisJbXZpX2hfZ3IgICAJMHhkZWFkYmVlMSxyNwk7IFNoaWZ0IGJ5IDEKKwltdmlfaF9nciAgIAkyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlsc2wgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDAgMSAwCisJdGVzdF9oX2dyICAJNCxyOAorCisJbXZpX2hfZ3IgICAJMHhkZWFkYmVmZixyNwk7IFNoaWZ0IGJ5IDMxCisJbXZpX2hfZ3IgICAJMSxyOAorCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbHNsICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMSAwIDEgMAorCXRlc3RfaF9nciAgCTB4ODAwMDAwMDAscjgKKworCW12aV9oX2dyICAgCTB4ZGVhZGJlZmYscjcJOyBjbGVhciByZWdpc3RlcgorCW12aV9oX2dyICAgCTIscjgKKwlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWxzbCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkweDAwMDAwMDAwLHI4CisKKwk7IFRlc3QgbHNsICR1NFJpCisJbXZpX2hfZ3IgICAJMixyOAorCXNldF9jYyAgICAgICAgICAweDBkCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbHNsICAgICAgCTAscjgKKwl0ZXN0X2NjCQkwIDAgMCAwCisJdGVzdF9oX2dyICAJMixyOAorCisJbXZpX2hfZ3IgICAJMixyOAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbHNsICAgICAgCTEscjgKKwl0ZXN0X2NjCQkwIDAgMSAwCisJdGVzdF9oX2dyICAJNCxyOAorCisJbXZpX2hfZ3IgICAJMSxyOAorCXNldF9jYyAgICAgICAgICAweDBlCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbHNsICAgICAgCTE1LHI4CisJdGVzdF9jYwkJMCAwIDEgMAorCXRlc3RfaF9nciAgCTB4MDAwMDgwMDAscjgKKworCW12aV9oX2dyICAgCTB4MDAwMjAwMDAscjgKKwlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWxzbCAgICAgIAkxNSxyOAorCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkweDAwMDAwMDAwLHI4CisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xzbDIuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sc2wyLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGFjZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9sc2wyLmNncwpAQCAtMCwwICsxLDM2IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGxzbDIgJFJqLCRSaSwgbHNsMiAkdTQsJFJqCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGxzbDIKK2xzbDI6CisJOyBUZXN0IGxzbDIgJHU0UmkKKwltdmlfaF9nciAgIAkyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlsc2wyICAgICAgCTAscjgKKwl0ZXN0X2NjCQkwIDAgMCAwCisJdGVzdF9oX2dyICAJMHgyMDAwMCxyOAorCisJbXZpX2hfZ3IgICAJMixyOAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbHNsMiAgICAgIAkxLHI4CisJdGVzdF9jYwkJMCAwIDEgMAorCXRlc3RfaF9nciAgCTB4NDAwMDAscjgKKworCW12aV9oX2dyICAgCTEscjgKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWxzbDIgICAgICAJMTUscjgKKwl0ZXN0X2NjCQkxIDAgMSAwCisJdGVzdF9oX2dyICAJMHg4MDAwMDAwMCxyOAorCisJbXZpX2hfZ3IgICAJMixyOAorCXNldF9jYyAgICAgICAgICAweDBhCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbHNsMiAgICAgIAkxNSxyOAorCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkweDAwMDAwMDAwLHI4CisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xzci5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xzci5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5NTg3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbHNyLmNncwpAQCAtMCwwICsxLDY1IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIGxzciAkUmosJFJpLCBsc3IgJHU0LCRSagorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBsc3IKK2xzcjoKKwk7IFRlc3QgbHNyICRSaiwkUmkKKwltdmlfaF9nciAgIAkweGRlYWRiZWUwLHI3CTsgU2hpZnQgYnkgMAorCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKKwlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWxzciAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTEgMCAwIDAKKwl0ZXN0X2hfZ3IgIAkweDgwMDAwMDAwLHI4CisKKwltdmlfaF9nciAgIAkweGRlYWRiZWUxLHI3CTsgU2hpZnQgYnkgMQorCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWxzciAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMCAxIDAKKwl0ZXN0X2hfZ3IgIAkweDQwMDAwMDAwLHI4CisKKwltdmlfaF9nciAgIAkweGRlYWRiZWZmLHI3CTsgU2hpZnQgYnkgMzEKKwltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlsc3IgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDAgMSAwCisJdGVzdF9oX2dyICAJMSxyOAorCisJbXZpX2hfZ3IgICAJMHhkZWFkYmVmZixyNwk7IGNsZWFyIHJlZ2lzdGVyCisJbXZpX2hfZ3IgICAJMHg0MDAwMDAwMCxyOAorCXNldF9jYyAgICAgICAgICAweDBhCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbHNyICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAxIDEgMQorCXRlc3RfaF9nciAgCTB4MDAwMDAwMDAscjgKKworCTsgVGVzdCBsc3IgJHU0UmkKKwltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlsc3IgICAgICAJMCxyOAorCXRlc3RfY2MJCTEgMCAwIDAKKwl0ZXN0X2hfZ3IgIAkweDgwMDAwMDAwLHI4CisKKwltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlsc3IgICAgICAJMSxyOAorCXRlc3RfY2MJCTAgMCAxIDAKKwl0ZXN0X2hfZ3IgIAkweDQwMDAwMDAwLHI4CisKKwltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlsc3IgICAgICAJMTUscjgKKwl0ZXN0X2NjCQkwIDAgMSAwCisJdGVzdF9oX2dyICAJMHgwMDAxMDAwMCxyOAorCisJbXZpX2hfZ3IgICAJMHgwMDAwNDAwMCxyOAorCXNldF9jYyAgICAgICAgICAweDBhCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbHNyICAgICAgCTE1LHI4CisJdGVzdF9jYwkJMCAxIDEgMQorCXRlc3RfaF9nciAgCTB4MDAwMDAwMDAscjgKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbHNyMi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xzcjIuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNmNlYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL2xzcjIuY2dzCkBAIC0wLDAgKzEsMzYgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgbHNyMiAkdTQsJFJqCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIGxzcjIKK2xzcjI6CisJOyBUZXN0IGxzcjIgJHU0UmkKKwltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlsc3IyICAgICAgCTAscjgKKwl0ZXN0X2NjCQkwIDAgMCAwCisJdGVzdF9oX2dyICAJMHgwMDAwODAwMCxyOAorCisJbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyOAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbHNyMiAgICAgIAkxLHI4CisJdGVzdF9jYwkJMCAwIDEgMAorCXRlc3RfaF9nciAgCTB4MDAwMDQwMDAscjgKKworCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKKwlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCWxzcjIgICAgICAJMTUscjgKKwl0ZXN0X2NjCQkwIDAgMSAwCisJdGVzdF9oX2dyICAJMSxyOAorCisJbXZpX2hfZ3IgICAJMHg0MDAwMDAwMCxyOAorCXNldF9jYyAgICAgICAgICAweDBhCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbHNyMiAgICAgIAkxNSxyOAorCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkweDAwMDAwMDAwLHI4CisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL21pc2MuZXhwIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9taXNjLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTE0OTBkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9taXNjLmV4cApAQCAtMCwwICsxLDIwIEBACisjIE1pc2NlbGxhbmVvdXMgRlIzMCBzaW11bGF0b3IgdGVzdGNhc2VzCisKK2lmIFtpc3RhcmdldCBmcjMwKi0qLSpdIHsKKyAgICAjIGxvYWQgc3VwcG9ydCBwcm9jcworICAgICMgbG9hZF9saWIgY2dlbi5leHAKKworICAgICMgYWxsIG1hY2hpbmVzCisgICAgc2V0IGFsbF9tYWNocyAiZnIzMCIKKworICAgICMgVGhlIC5tcyBzdWZmaXggaXMgZm9yICJtaXNjZWxsYW5lb3VzIC5zIi4KKyAgICBmb3JlYWNoIHNyYyBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3ViZGlyLyoubXNdXSB7CisJIyBJZiB3ZSdyZSBvbmx5IHRlc3Rpbmcgc3BlY2lmaWMgZmlsZXMgYW5kIHRoaXMgaXNuJ3Qgb25lIG9mIHRoZW0sCisJIyBza2lwIGl0LgorCWlmICFbcnVudGVzdF9maWxlX3AgJHJ1bnRlc3RzICRzcmNdIHsKKwkgICAgY29udGludWUKKwl9CisKKwlydW5fc2ltX3Rlc3QgJHNyYyAkYWxsX21hY2hzCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9tb3YuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9tb3YuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmOTkyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL21vdi5jZ3MKQEAgLTAsMCArMSwxMDggQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgbW92ICRSaiwkUmkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgbW92Cittb3Y6CisJOyBUZXN0IG1vdiAkUmosJFJpCisJbXZpX2hfZ3IgICAJMSxyNworCW12aV9oX2RyICAgCTB4YSx0YnIKKwltdmlfaF9kciAgIAkweGIscnAKKwltdmlfaF9kciAgIAkweGMsbWRoCisJbXZpX2hfZHIgICAJMHhkLG1kbAorCW12cl9oX2dyICAgICAgICBzcCxzc3AKKwltdnJfaF9ncglzcCx1c3AKKworCW1vdgkJcjcscjcKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX2dyICAJMSxyNworCisJbW92CQlyNyxyOAorCXNldF9jYyAgICAgICAgICAweDBlCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCXRlc3RfY2MJCTEgMSAxIDAKKwl0ZXN0X2hfZ3IgIAkxLHI3CisJdGVzdF9oX2dyICAJMSxyOAorCisJOyBUZXN0IG1vdiAkUnMsJFJpCisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbW92CQl0YnIscjcKKwl0ZXN0X2NjCQkxIDEgMCAxCisJdGVzdF9oX2dyICAJMHhhLHI3CisKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwltb3YJCXJwLHI3CisJdGVzdF9jYwkJMSAxIDAgMAorCXRlc3RfaF9nciAgCTB4YixyNworCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbW92CQltZGgscjcKKwl0ZXN0X2NjCQkxIDAgMSAxCisJdGVzdF9oX2dyICAJMHhjLHI3CisKKwlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwltb3YJCW1kbCxyNworCXRlc3RfY2MJCTEgMCAxIDAKKwl0ZXN0X2hfZ3IgIAkweGQscjcKKworCXNldF9jYyAgICAgICAgICAweDA5CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCW1vdgkJdXNwLHI3CisJdGVzdF9jYwkJMSAwIDAgMQorCXRlc3RyX2hfZ3IgIAlzcCxyNworCisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbW92CQlzc3AscjcKKwl0ZXN0X2NjCQkxIDAgMCAwCisJdGVzdHJfaF9nciAgCXNwLHI3CisKKwk7IFRlc3QgbW92ICRSaSwkUnMKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwltb3YJCXI4LHRicgorCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZHIgIAkweDEsdGJyCisKKwlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwltb3YJCXI4LHJwCisJdGVzdF9jYwkJMCAxIDEgMAorCXRlc3RfaF9kciAgCTB4MSxycAorCisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbW92CQlyOCxtZGgKKwl0ZXN0X2NjCQkwIDEgMCAxCisJdGVzdF9oX2RyICAJMHgxLG1kaAorCisJc2V0X2NjICAgICAgICAgIDB4MDQJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbW92CQlyOCxtZGwKKwl0ZXN0X2NjCQkwIDEgMCAwCisJdGVzdF9oX2RyICAJMHgxLG1kbAorCisJc2V0X2NjICAgICAgICAgIDB4MDMJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbW92CQlyOCxzc3AKKwl0ZXN0X2NjCQkwIDAgMSAxCisJdGVzdF9oX2RyICAJMHgxLHNzcAorCisJc2V0X2NjICAgICAgICAgIDB4MDIJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJbW92CQlyOCx1c3AKKwl0ZXN0X2NjCQkwIDAgMSAwCisJdGVzdF9oX2RyICAJMHgxLHVzcAorCisJOyBUZXN0IG1vdiAkUFMsJFJpCisJc2V0X2NjICAgICAgICAgIDB4MDEJCTsgQ29uZGl0aW9uIGNvZGVzIGFmZmVjdCByZXN1bHQKKwlzZXRfZGJpdHMJMHgzCisJbW92CQlwcyxyNworCXRlc3RfY2MJCTAgMCAwIDEKKwl0ZXN0X2hfZ3IgIAkweDAwMDAwNjAxLHI3CisKKwk7IFRlc3QgbW92ICRSaSxQUworCXNldF9jYyAgICAgICAgICAweDAxCQk7IFNldCBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCXNldF9kYml0cwkweDEJCTsgU2V0IG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXZpX2hfZ3IJMHgwMDAwMDQwZSxyNworCW1vdgkJcjcsUFMKKwl0ZXN0X2NjCQkxIDEgMSAwCisJdGVzdF9kYml0cwkweDIKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbXVsLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbXVsLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2NiZjU4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9tdWwuY2dzCkBAIC0wLDAgKzEsMjQwIEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIG11bCAkUmosJFJpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIG11bAorbXVsOgorCTsgVGVzdCBtdWwgJFJqLCRSaQorCTsgUG9zaXRpdmUgb3BlcmFuZHMKKwltdmlfaF9nciAgIAkzLHI3CQk7IG11bHRpcGx5IHNtYWxsIG51bWJlcnMKKwltdmlfaF9nciAgIAkyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWwgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDAgMCAxCisJdGVzdF9oX2RyICAJMCxtZGgKKwl0ZXN0X2hfZHIgIAk2LG1kbAorCisJbXZpX2hfZ3IgICAJMSxyNwkJOyBtdWx0aXBseSBieSAxCisJbXZpX2hfZ3IgICAJMixyOAorCXNldF9jYyAgICAgICAgICAweDBlCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAwIDAgMAorCXRlc3RfaF9kciAgCTAsbWRoCisJdGVzdF9oX2RyICAJMixtZGwKKworCW12aV9oX2dyICAgCTIscjcJCTsgbXVsdGlwbHkgYnkgMQorCW12aV9oX2dyICAgCTEscjgKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW11bCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMCAwIDEKKwl0ZXN0X2hfZHIgIAkwLG1kaAorCXRlc3RfaF9kciAgCTIsbWRsCisKKwltdmlfaF9nciAgIAkwLHI3CQk7IG11bHRpcGx5IGJ5IDAKKwltdmlfaF9nciAgIAkyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWwgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDEgMCAxCisJdGVzdF9oX2RyICAJMCxtZGgKKwl0ZXN0X2hfZHIgIAkwLG1kbAorCisJbXZpX2hfZ3IgICAJMixyNwkJOyBtdWx0aXBseSBieSAwCisJbXZpX2hfZ3IgICAJMCxyOAorCXNldF9jYyAgICAgICAgICAweDBhCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAxIDAgMAorCXRlc3RfaF9kciAgCTAsbWRoCisJdGVzdF9oX2RyICAJMCxtZGwKKworCW12aV9oX2dyICAgCTB4M2ZmZmZmZmYscjcJOyAzMSBiaXQgcmVzdWx0CisJbXZpX2hfZ3IgICAJMixyOAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAwIDAgMQorCXRlc3RfaF9kciAgCTAsbWRoCisJdGVzdF9oX2RyICAJMHg3ZmZmZmZmZSxtZGwKKworCW12aV9oX2dyICAgCTB4NDAwMDAwMDAscjcJOyAzMiBiaXQgcmVzdWx0CisJbXZpX2hfZ3IgICAJMixyOAorCXNldF9jYyAgICAgICAgICAweDA0CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMSAwIDEgMAorCXRlc3RfaF9kciAgCTAsbWRoCisJdGVzdF9oX2RyICAJMHg4MDAwMDAwMCxtZGwKKworCW12aV9oX2dyICAgCTB4NDAwMDAwMDAscjcJOyAzMyBiaXQgcmVzdWx0CisJbXZpX2hfZ3IgICAJNCxyOAorCXNldF9jYyAgICAgICAgICAweDBkCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAwIDEgMQorCXRlc3RfaF9kciAgCTEsbWRoCisJdGVzdF9oX2RyICAJMHgwMDAwMDAwMCxtZGwKKworCW12aV9oX2dyICAgCTB4N2ZmZmZmZmYscjcJOyBtYXggcG9zaXRpdmUgcmVzdWx0CisJbXZpX2hfZ3IgICAJMHg3ZmZmZmZmZixyOAorCXNldF9jYyAgICAgICAgICAweDBkCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAwIDEgMQorCXRlc3RfaF9kciAgCTB4M2ZmZmZmZmYsbWRoCisJdGVzdF9oX2RyICAJMHgwMDAwMDAwMSxtZGwKKworCTsgTWl4ZWQgb3BlcmFuZHMKKwltdmlfaF9nciAgIAktMyxyNwkJOyBtdWx0aXBseSBzbWFsbCBudW1iZXJzCisJbXZpX2hfZ3IgICAJMixyOAorCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMSAwIDAgMQorCXRlc3RfaF9kciAgCS0xLG1kaAorCXRlc3RfaF9kciAgCS02LG1kbAorCisJbXZpX2hfZ3IgICAJMyxyNwkJOyBtdWx0aXBseSBzbWFsbCBudW1iZXJzCisJbXZpX2hfZ3IgICAJLTIscjgKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW11bCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTEgMCAwIDEKKwl0ZXN0X2hfZHIgIAktMSxtZGgKKwl0ZXN0X2hfZHIgIAktNixtZGwKKworCW12aV9oX2dyICAgCTEscjcJCTsgbXVsdGlwbHkgYnkgMQorCW12aV9oX2dyICAgCS0yLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWwgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkxIDAgMCAwCisJdGVzdF9oX2RyICAJLTEsbWRoCisJdGVzdF9oX2RyICAJLTIsbWRsCisKKwltdmlfaF9nciAgIAktMixyNwkJOyBtdWx0aXBseSBieSAxCisJbXZpX2hfZ3IgICAJMSxyOAorCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMSAwIDAgMQorCXRlc3RfaF9kciAgCS0xLG1kaAorCXRlc3RfaF9kciAgCS0yLG1kbAorCisJbXZpX2hfZ3IgICAJMCxyNwkJOyBtdWx0aXBseSBieSAwCisJbXZpX2hfZ3IgICAJLTIscjgKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW11bCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAwIDEKKwl0ZXN0X2hfZHIgIAkwLG1kaAorCXRlc3RfaF9kciAgCTAsbWRsCisKKwltdmlfaF9nciAgIAktMixyNwkJOyBtdWx0aXBseSBieSAwCisJbXZpX2hfZ3IgICAJMCxyOAorCXNldF9jYyAgICAgICAgICAweDBhCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAxIDAgMAorCXRlc3RfaF9kciAgCTAsbWRoCisJdGVzdF9oX2RyICAJMCxtZGwKKworCW12aV9oX2dyICAgCTB4MjAwMDAwMDEscjcJOyAzMSBiaXQgcmVzdWx0CisJbXZpX2hfZ3IgICAJLTIscjgKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW11bCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTEgMCAwIDEKKwl0ZXN0X2hfZHIgIAkweGZmZmZmZmZmLG1kaAorCXRlc3RfaF9kciAgCTB4YmZmZmZmZmUsbWRsCisKKwltdmlfaF9nciAgIAkweDQwMDAwMDAwLHI3CTsgMzIgYml0IHJlc3VsdAorCW12aV9oX2dyICAgCS0yLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWwgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkxIDAgMCAwCisJdGVzdF9oX2RyICAJMHhmZmZmZmZmZixtZGgKKwl0ZXN0X2hfZHIgIAkweDgwMDAwMDAwLG1kbAorCisJbXZpX2hfZ3IgICAJMHg0MDAwMDAwMSxyNwk7IDMyIGJpdCByZXN1bHQKKwltdmlfaF9nciAgIAktMixyOAorCXNldF9jYyAgICAgICAgICAweDBjCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAwIDEgMAorCXRlc3RfaF9kciAgCTB4ZmZmZmZmZmYsbWRoCisJdGVzdF9oX2RyICAJMHg3ZmZmZmZmZSxtZGwKKworCW12aV9oX2dyICAgCTB4NDAwMDAwMDAscjcJOyAzMyBiaXQgcmVzdWx0CisJbXZpX2hfZ3IgICAJLTQscjgKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW11bCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMCAxIDEKKwl0ZXN0X2hfZHIgIAkweGZmZmZmZmZmLG1kaAorCXRlc3RfaF9kciAgCTB4MDAwMDAwMDAsbWRsCisKKwltdmlfaF9nciAgIAkweDdmZmZmZmZmLHI3CTsgbWF4IG5lZ2F0aXZlIHJlc3VsdAorCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKKwlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW11bCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTEgMCAxIDEKKwl0ZXN0X2hfZHIgIAkweGMwMDAwMDAwLG1kaAorCXRlc3RfaF9kciAgCTB4ODAwMDAwMDAsbWRsCisKKwk7IE5lZ2F0aXZlIG9wZXJhbmRzCisJbXZpX2hfZ3IgICAJLTMscjcJCTsgbXVsdGlwbHkgc21hbGwgbnVtYmVycworCW12aV9oX2dyICAgCS0yLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWwgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDAgMCAxCisJdGVzdF9oX2RyICAJMCxtZGgKKwl0ZXN0X2hfZHIgIAk2LG1kbAorCisJbXZpX2hfZ3IgICAJLTEscjcJCTsgbXVsdGlwbHkgYnkgMQorCW12aV9oX2dyICAgCS0yLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWwgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDAgMCAwCisJdGVzdF9oX2RyICAJMCxtZGgKKwl0ZXN0X2hfZHIgIAkyLG1kbAorCisJbXZpX2hfZ3IgICAJLTIscjcJCTsgbXVsdGlwbHkgYnkgMQorCW12aV9oX2dyICAgCS0xLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWwgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDAgMCAxCisJdGVzdF9oX2RyICAJMCxtZGgKKwl0ZXN0X2hfZHIgIAkyLG1kbAorCisJbXZpX2hfZ3IgICAJMHhjMDAwMDAwMSxyNwk7IDMxIGJpdCByZXN1bHQKKwltdmlfaF9nciAgIAktMixyOAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAwIDAgMQorCXRlc3RfaF9kciAgCTAsbWRoCisJdGVzdF9oX2RyICAJMHg3ZmZmZmZmZSxtZGwKKworCW12aV9oX2dyICAgCTB4YzAwMDAwMDAscjcJOyAzMiBiaXQgcmVzdWx0CisJbXZpX2hfZ3IgICAJLTIscjgKKwlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW11bCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTEgMCAxIDAKKwl0ZXN0X2hfZHIgIAkwLG1kaAorCXRlc3RfaF9kciAgCTB4ODAwMDAwMDAsbWRsCisKKwltdmlfaF9nciAgIAkweGMwMDAwMDAwLHI3CTsgMzMgYml0IHJlc3VsdAorCW12aV9oX2dyICAgCS00LHI4CisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWwgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDAgMSAxCisJdGVzdF9oX2RyICAJMSxtZGgKKwl0ZXN0X2hfZHIgIAkweDAwMDAwMDAwLG1kbAorCisJbXZpX2hfZ3IgICAJMHg4MDAwMDAwMSxyNwk7IGFsbW9zdCBtYXggcG9zaXRpdmUgcmVzdWx0CisJbXZpX2hfZ3IgICAJMHg4MDAwMDAwMSxyOAorCXNldF9jYyAgICAgICAgICAweDBkCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAwIDEgMQorCXRlc3RfaF9kciAgCTB4M2ZmZmZmZmYsbWRoCisJdGVzdF9oX2RyICAJMHgwMDAwMDAwMSxtZGwKKworCisJbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyNwk7IG1heCBwb3NpdGl2ZSByZXN1bHQKKwltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWwgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDAgMSAxCisJdGVzdF9oX2RyICAJMHg0MDAwMDAwMCxtZGgKKwl0ZXN0X2hfZHIgIAkweDAwMDAwMDAwLG1kbAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9tdWxoLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbXVsaC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQyMWYwNwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbXVsaC5jZ3MKQEAgLTAsMCArMSwyMTEgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgbXVsaCAkUmosJFJpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIG11bGgKK211bGg6CisJOyBUZXN0IG11bGggJFJqLCRSaQorCTsgUG9zaXRpdmUgb3BlcmFuZHMKKwltdmlfaF9nciAgIAkweGRlYWQwMDAzLHI3CQk7IG11bHRpcGx5IHNtYWxsIG51bWJlcnMKKwltdmlfaF9nciAgIAkweGJlZWYwMDAyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDkJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWxoICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAxIDAgMQorCXRlc3RfaF9kciAgCTYsbWRsCisKKwltdmlfaF9nciAgIAkweGRlYWQwMDAxLHI3CQk7IG11bHRpcGx5IGJ5IDEKKwltdmlfaF9nciAgIAkweGJlZWYwMDAyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWxoICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAxIDAgMAorCXRlc3RfaF9kciAgCTIsbWRsCisKKwltdmlfaF9nciAgIAkweGRlYWQwMDAyLHI3CQk7IG11bHRpcGx5IGJ5IDEKKwltdmlfaF9nciAgIAkweGJlZWYwMDAxLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDkJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWxoICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAxIDAgMQorCXRlc3RfaF9kciAgCTIsbWRsCisKKwltdmlfaF9nciAgIAkweGRlYWQwMDAwLHI3CQk7IG11bHRpcGx5IGJ5IDAKKwltdmlfaF9nciAgIAkweGJlZWYwMDAyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDkJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWxoICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAxIDAgMQorCXRlc3RfaF9kciAgCTAsbWRsCisKKwltdmlfaF9nciAgIAkweGRlYWQwMDAyLHI3CQk7IG11bHRpcGx5IGJ5IDAKKwltdmlfaF9nciAgIAkweGJlZWYwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWxoICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAxIDAgMAorCXRlc3RfaF9kciAgCTAsbWRsCisKKwltdmlfaF9nciAgIAkweGRlYWQzZmZmLHI3CTsgMTUgYml0IHJlc3VsdAorCW12aV9oX2dyICAgCTB4YmVlZjAwMDIscjgKKwlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW11bGggICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDEgMCAxCisJdGVzdF9oX2RyICAJMHgwMDAwN2ZmZSxtZGwKKworCW12aV9oX2dyICAgCTB4ZGVhZDQwMDAscjcJOyAxNiBiaXQgcmVzdWx0CisJbXZpX2hfZ3IgICAJMHhiZWVmMDAwMixyOAorCXNldF9jYyAgICAgICAgICAweDBhCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsaCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAxIDAKKwl0ZXN0X2hfZHIgIAkweDAwMDA4MDAwLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkNDAwMCxyNwk7IDE3IGJpdCByZXN1bHQKKwltdmlfaF9nciAgIAkweGJlZWYwMDA0LHI4CisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWxoICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAxIDEgMQorCXRlc3RfaF9kciAgCTB4MDAwMTAwMDAsbWRsCisKKwltdmlfaF9nciAgIAkweGRlYWQ3ZmZmLHI3CTsgbWF4IHBvc2l0aXZlIHJlc3VsdAorCW12aV9oX2dyICAgCTB4YmVlZjdmZmYscjgKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW11bGggICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDEgMSAxCisJdGVzdF9oX2RyICAJMHgzZmZmMDAwMSxtZGwKKworCTsgTWl4ZWQgb3BlcmFuZHMKKwltdmlfaF9nciAgIAktMyxyNwkJOyBtdWx0aXBseSBzbWFsbCBudW1iZXJzCisJbXZpX2hfZ3IgICAJMixyOAorCXNldF9jYyAgICAgICAgICAweDA1CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsaCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTEgMCAwIDEKKwl0ZXN0X2hfZHIgIAktNixtZGwKKworCW12aV9oX2dyICAgCTMscjcJCTsgbXVsdGlwbHkgc21hbGwgbnVtYmVycworCW12aV9oX2dyICAgCS0yLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWxoICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMSAwIDAgMQorCXRlc3RfaF9kciAgCS02LG1kbAorCisJbXZpX2hfZ3IgICAJMSxyNwkJOyBtdWx0aXBseSBieSAxCisJbXZpX2hfZ3IgICAJLTIscjgKKwlzZXRfY2MgICAgICAgICAgMHgwNAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW11bGggICAgICAJcjcscjgKKwl0ZXN0X2NjCQkxIDAgMCAwCisJdGVzdF9oX2RyICAJLTIsbWRsCisKKwltdmlfaF9nciAgIAktMixyNwkJOyBtdWx0aXBseSBieSAxCisJbXZpX2hfZ3IgICAJMSxyOAorCXNldF9jYyAgICAgICAgICAweDA1CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsaCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTEgMCAwIDEKKwl0ZXN0X2hfZHIgIAktMixtZGwKKworCW12aV9oX2dyICAgCTAscjcJCTsgbXVsdGlwbHkgYnkgMAorCW12aV9oX2dyICAgCS0yLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDkJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWxoICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAxIDAgMQorCXRlc3RfaF9kciAgCTAsbWRsCisKKwltdmlfaF9nciAgIAktMixyNwkJOyBtdWx0aXBseSBieSAwCisJbXZpX2hfZ3IgICAJMCxyOAorCXNldF9jYyAgICAgICAgICAweDA4CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsaCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAwIDAKKwl0ZXN0X2hfZHIgIAkwLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkMjAwMSxyNwk7IDE1IGJpdCByZXN1bHQKKwltdmlfaF9nciAgIAktMixyOAorCXNldF9jYyAgICAgICAgICAweDA1CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsaCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTEgMCAwIDEKKwl0ZXN0X2hfZHIgIAkweGZmZmZiZmZlLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkNDAwMCxyNwk7IDE2IGJpdCByZXN1bHQKKwltdmlfaF9nciAgIAktMixyOAorCXNldF9jYyAgICAgICAgICAweDA0CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsaCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTEgMCAwIDAKKwl0ZXN0X2hfZHIgIAkweGZmZmY4MDAwLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkNDAwMSxyNwk7IDE2IGJpdCByZXN1bHQKKwltdmlfaF9nciAgIAktMixyOAorCXNldF9jYyAgICAgICAgICAweDA2CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsaCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTEgMCAxIDAKKwl0ZXN0X2hfZHIgIAkweGZmZmY3ZmZlLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkNDAwMCxyNwk7IDE3IGJpdCByZXN1bHQKKwltdmlfaF9nciAgIAktNCxyOAorCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsaCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTEgMCAxIDEKKwl0ZXN0X2hfZHIgIAkweGZmZmYwMDAwLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkN2ZmZixyNwk7IG1heCBuZWdhdGl2ZSByZXN1bHQKKwltdmlfaF9nciAgIAkweGJlZWY4MDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWxoICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMSAwIDEgMQorCXRlc3RfaF9kciAgCTB4YzAwMDgwMDAsbWRsCisKKwk7IE5lZ2F0aXZlIG9wZXJhbmRzCisJbXZpX2hfZ3IgICAJLTMscjcJCTsgbXVsdGlwbHkgc21hbGwgbnVtYmVycworCW12aV9oX2dyICAgCS0yLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDkJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWxoICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAxIDAgMQorCXRlc3RfaF9kciAgCTYsbWRsCisKKwltdmlfaF9nciAgIAktMSxyNwkJOyBtdWx0aXBseSBieSAxCisJbXZpX2hfZ3IgICAJLTIscjgKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW11bGggICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDEgMCAwCisJdGVzdF9oX2RyICAJMixtZGwKKworCW12aV9oX2dyICAgCS0yLHI3CQk7IG11bHRpcGx5IGJ5IDEKKwltdmlfaF9nciAgIAktMSxyOAorCXNldF9jYyAgICAgICAgICAweDA5CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsaCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAwIDEKKwl0ZXN0X2hfZHIgIAkyLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkYzAwMSxyNwk7IDE1IGJpdCByZXN1bHQKKwltdmlfaF9nciAgIAktMixyOAorCXNldF9jYyAgICAgICAgICAweDA5CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsaCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAwIDEKKwl0ZXN0X2hfZHIgIAkweDAwMDA3ZmZlLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkYzAwMCxyNwk7IDE2IGJpdCByZXN1bHQKKwltdmlfaF9nciAgIAktMixyOAorCXNldF9jYyAgICAgICAgICAweDBhCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsaCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAxIDAKKwl0ZXN0X2hfZHIgIAkweDAwMDA4MDAwLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkYzAwMCxyNwk7IDE3IGJpdCByZXN1bHQKKwltdmlfaF9nciAgIAktNCxyOAorCXNldF9jYyAgICAgICAgICAweDBiCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsaCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZHIgIAkweDAwMDEwMDAwLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkODAwMSxyNwk7IGFsbW9zdCBtYXggcG9zaXRpdmUgcmVzdWx0CisJbXZpX2hfZ3IgICAJMHhiZWVmODAwMSxyOAorCXNldF9jYyAgICAgICAgICAweDBiCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsaCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZHIgIAkweDNmZmYwMDAxLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkODAwMCxyNwk7IG1heCBwb3NpdGl2ZSByZXN1bHQKKwltdmlfaF9nciAgIAkweGJlZWY4MDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWxoICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAxIDEgMQorCXRlc3RfaF9kciAgCTB4NDAwMDAwMDAsbWRsCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL211bHUuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9tdWx1LmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Nzc1ODNiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9tdWx1LmNncwpAQCAtMCwwICsxLDEwMSBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBtdWx1ICRSaiwkUmkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgbXVsdQorbXVsdToKKwk7IFRlc3QgbXVsdSAkUmosJFJpCisJOyBQb3NpdGl2ZSBvcGVyYW5kcworCW12aV9oX2dyICAgCTMscjcJCTsgbXVsdGlwbHkgc21hbGwgbnVtYmVycworCW12aV9oX2dyICAgCTIscjgKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW11bHUgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDAgMCAxCisJdGVzdF9oX2RyICAJMCxtZGgKKwl0ZXN0X2hfZHIgIAk2LG1kbAorCisJbXZpX2hfZ3IgICAJMSxyNwkJOyBtdWx0aXBseSBieSAxCisJbXZpX2hfZ3IgICAJMixyOAorCXNldF9jYyAgICAgICAgICAweDBlCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsdSAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMCAwIDAKKwl0ZXN0X2hfZHIgIAkwLG1kaAorCXRlc3RfaF9kciAgCTIsbWRsCisKKwltdmlfaF9nciAgIAkyLHI3CQk7IG11bHRpcGx5IGJ5IDEKKwltdmlfaF9nciAgIAkxLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWx1ICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAwIDAgMQorCXRlc3RfaF9kciAgCTAsbWRoCisJdGVzdF9oX2RyICAJMixtZGwKKworCW12aV9oX2dyICAgCTAscjcJCTsgbXVsdGlwbHkgYnkgMAorCW12aV9oX2dyICAgCTIscjgKKwlzZXRfY2MgICAgICAgICAgMHgwYgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW11bHUgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDEgMCAxCisJdGVzdF9oX2RyICAJMCxtZGgKKwl0ZXN0X2hfZHIgIAkwLG1kbAorCisJbXZpX2hfZ3IgICAJMixyNwkJOyBtdWx0aXBseSBieSAwCisJbXZpX2hfZ3IgICAJMCxyOAorCXNldF9jYyAgICAgICAgICAweDBhCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsdSAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAwIDAKKwl0ZXN0X2hfZHIgIAkwLG1kaAorCXRlc3RfaF9kciAgCTAsbWRsCisKKwltdmlfaF9nciAgIAkweDNmZmZmZmZmLHI3CTsgMzEgYml0IHJlc3VsdAorCW12aV9oX2dyICAgCTIscjgKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW11bHUgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDAgMCAxCisJdGVzdF9oX2RyICAJMCxtZGgKKwl0ZXN0X2hfZHIgIAkweDdmZmZmZmZlLG1kbAorCisJbXZpX2hfZ3IgICAJMHg0MDAwMDAwMCxyNwk7IDMyIGJpdCByZXN1bHQKKwltdmlfaF9nciAgIAkyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWx1ICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAwIDAgMAorCXRlc3RfaF9kciAgCTAsbWRoCisJdGVzdF9oX2RyICAJMHg4MDAwMDAwMCxtZGwKKworCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjcJOyAzMyBiaXQgcmVzdWx0CisJbXZpX2hfZ3IgICAJMixyOAorCXNldF9jYyAgICAgICAgICAweDA5CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsdSAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZHIgIAkxLG1kaAorCXRlc3RfaF9kciAgCTB4MDAwMDAwMDAsbWRsCisKKwltdmlfaF9nciAgIAkweDdmZmZmZmZmLHI3CTsgbWF4IHBvc2l0aXZlIHJlc3VsdAorCW12aV9oX2dyICAgCTB4N2ZmZmZmZmYscjgKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW11bHUgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDAgMSAxCisJdGVzdF9oX2RyICAJMHgzZmZmZmZmZixtZGgKKwl0ZXN0X2hfZHIgIAkweDAwMDAwMDAxLG1kbAorCisJbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyNwk7IG1heCBwb3NpdGl2ZSByZXN1bHQKKwltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDkJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWx1ICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAxIDEgMQorCXRlc3RfaF9kciAgCTB4NDAwMDAwMDAsbWRoCisJdGVzdF9oX2RyICAJMHgwMDAwMDAwMCxtZGwKKworCW12aV9oX2dyICAgCTB4ZmZmZmZmZmYscjcJOyBtYXggcG9zaXRpdmUgcmVzdWx0CisJbXZpX2hfZ3IgICAJMHhmZmZmZmZmZixyOAorCXNldF9jYyAgICAgICAgICAweDA1CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsdSAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTEgMCAxIDEKKwl0ZXN0X2hfZHIgIAkweGZmZmZmZmZlLG1kaAorCXRlc3RfaF9kciAgCTB4MDAwMDAwMDEsbWRsCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL211bHVoLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvbXVsdWguY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYzg0N2UKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL211bHVoLmNncwpAQCAtMCwwICsxLDkwIEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIG11bHVoICRSaiwkUmkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgbXVsdWgKK211bHVoOgorCTsgVGVzdCBtdWx1aCAkUmosJFJpCisJOyBQb3NpdGl2ZSBvcGVyYW5kcworCW12aV9oX2dyICAgCTB4ZGVhZDAwMDMscjcJCTsgbXVsdGlwbHkgc21hbGwgbnVtYmVycworCW12aV9oX2dyICAgCTB4YmVlZjAwMDIscjgKKwlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW11bHVoICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAxIDAgMQorCXRlc3RfaF9kciAgCTYsbWRsCisKKwltdmlfaF9nciAgIAkweGRlYWQwMDAxLHI3CQk7IG11bHRpcGx5IGJ5IDEKKwltdmlfaF9nciAgIAkweGJlZWYwMDAyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWx1aCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAwIDAKKwl0ZXN0X2hfZHIgIAkyLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkMDAwMixyNwkJOyBtdWx0aXBseSBieSAxCisJbXZpX2hfZ3IgICAJMHhiZWVmMDAwMSxyOAorCXNldF9jYyAgICAgICAgICAweDA5CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJbXVsdWggICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDEgMCAxCisJdGVzdF9oX2RyICAJMixtZGwKKworCW12aV9oX2dyICAgCTB4ZGVhZDAwMDAscjcJCTsgbXVsdGlwbHkgYnkgMAorCW12aV9oX2dyICAgCTB4YmVlZjAwMDIscjgKKwlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW11bHVoICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAxIDAgMQorCXRlc3RfaF9kciAgCTAsbWRsCisKKwltdmlfaF9nciAgIAkweGRlYWQwMDAyLHI3CQk7IG11bHRpcGx5IGJ5IDAKKwltdmlfaF9nciAgIAkweGJlZWYwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWx1aCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAwIDAKKwl0ZXN0X2hfZHIgIAkwLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkM2ZmZixyNwk7IDE1IGJpdCByZXN1bHQKKwltdmlfaF9nciAgIAkweGJlZWYwMDAyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDkJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWx1aCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAwIDEKKwl0ZXN0X2hfZHIgIAkweDAwMDA3ZmZlLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkNDAwMCxyNwk7IDE2IGJpdCByZXN1bHQKKwltdmlfaF9nciAgIAkweGJlZWYwMDAyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWx1aCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAwIDAKKwl0ZXN0X2hfZHIgIAkweDAwMDA4MDAwLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkODAwMCxyNwk7IDE3IGJpdCByZXN1bHQKKwltdmlfaF9nciAgIAkweGJlZWYwMDAyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWx1aCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZHIgIAkweDAwMDEwMDAwLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkN2ZmZixyNwk7IG1heCBwb3NpdGl2ZSByZXN1bHQKKwltdmlfaF9nciAgIAkweGJlZWY3ZmZmLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWx1aCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZHIgIAkweDNmZmYwMDAxLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkODAwMCxyNwk7IG1heCBwb3NpdGl2ZSByZXN1bHQKKwltdmlfaF9nciAgIAkweGJlZWY4MDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWx1aCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTAgMSAxIDEKKwl0ZXN0X2hfZHIgIAkweDQwMDAwMDAwLG1kbAorCisJbXZpX2hfZ3IgICAJMHhkZWFkZmZmZixyNwk7IG1heCBwb3NpdGl2ZSByZXN1bHQKKwltdmlfaF9nciAgIAkweGJlZWZmZmZmLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDcJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwltdWx1aCAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTEgMCAxIDEKKwl0ZXN0X2hfZHIgIAkweGZmZmUwMDAxLG1kbAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ub3AuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9ub3AuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NWM1NWMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL25vcC5jZ3MKQEAgLTAsMCArMSwxNiBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBub3AKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgbm9wCitub3A6CisJOyBUZXN0IG5vcAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBhcmUgaXJyZWxldmVudAorCW5vcAorCXRlc3RfY2MJCTEgMSAxIDEKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvb3IuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9vci5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjYjk3MAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvb3IuY2dzCkBAIC0wLDAgKzEsNTUgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3Igb3IgJFJqLCRSaSwgb3IgJFJqLEAkUmkKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgb3IKK29yOgorCTsgVGVzdCBvciAkUmosJFJpCisJbXZpX2hfZ3IgICAJMHhhYWFhYWFhYSxyNworCW12aV9oX2dyICAgCTB4NTU1NTU1NTUscjgKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW9yICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMSAwIDEgMQorCXRlc3RfaF9nciAgCTB4ZmZmZmZmZmYscjgKKworCW12aV9oX2dyICAgCTB4MDAwMDAwMDAscjcKKwltdmlfaF9nciAgIAkweDAwMDAwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlvcgkJcjcscjgKKwl0ZXN0X2NjCQkwIDEgMCAwCisJdGVzdF9oX2dyICAJMHgwMDAwMDAwMCxyOAorCisJbXZpX2hfZ3IgICAJMHhkZWFkMDAwMCxyNworCW12aV9oX2dyICAgCTB4MDAwMGJlZWYscjgKKwlzZXRfY2MgICAgICAgICAgMHgwNQkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW9yCQlyNyxyOAorCXRlc3RfY2MJCTEgMCAwIDEKKwl0ZXN0X2hfZ3IgIAkweGRlYWRiZWVmLHI4CisKKwk7IFRlc3Qgb3IgJFJqLEAkUmkKKwltdmlfaF9nciAgIAkweGFhYWFhYWFhLHI3CisJbXZpX2hfbWVtICAJMHg1NTU1NTU1NSxzcAorCXNldF9jYyAgICAgICAgICAweDA3CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJb3IgICAgICAJcjcsQHNwCisJdGVzdF9jYwkJMSAwIDEgMQorCXRlc3RfaF9tZW0gCTB4ZmZmZmZmZmYsc3AKKworCW12aV9oX2dyICAgCTB4MDAwMDAwMDAscjcKKwltdmlfaF9tZW0gIAkweDAwMDAwMDAwLHNwCisJc2V0X2NjICAgICAgICAgIDB4MDgJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlvcgkJcjcsQHNwCisJdGVzdF9jYwkJMCAxIDAgMAorCXRlc3RfaF9tZW0gCTB4MDAwMDAwMDAsc3AKKworCW12aV9oX2dyICAgCTB4ZGVhZDAwMDAscjcKKwltdmlfaF9tZW0gIAkweDAwMDBiZWVmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlvcgkJcjcsQHNwCisJdGVzdF9jYwkJMSAwIDAgMQorCXRlc3RfaF9tZW0gCTB4ZGVhZGJlZWYsc3AKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvb3JiLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvb3JiLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2IzNmJmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9vcmIuY2dzCkBAIC0wLDAgKzEsMzMgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3Igb3JiICRSaiwkUmksIG9yYiAkUmosQCRSaQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBvcmIKK29yYjoKKwk7IFRlc3Qgb3JiICRSaixAJFJpCisJbXZpX2hfZ3IgICAJMHhhYWFhYWFhYSxyNworCW12aV9oX21lbSAgCTB4NTU1NTU1NTUsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW9yYiAgICAgIAlyNyxAc3AKKwl0ZXN0X2NjCQkxIDAgMSAxCisJdGVzdF9oX21lbSAJMHhmZjU1NTU1NSxzcAorCisJbXZpX2hfZ3IgICAJMHhmZmZmZmYwMCxyNworCW12aV9oX21lbSAgCTB4MDBmZmZmZmYsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW9yYgkJcjcsQHNwCisJdGVzdF9jYwkJMCAxIDAgMAorCXRlc3RfaF9tZW0gCTB4MDBmZmZmZmYsc3AKKworCW12aV9oX2dyICAgCTB4MDAwMDAwZDAscjcKKwltdmlfaF9tZW0gIAkweDBlYWRiZWVmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlvcmIJCXI3LEBzcAorCXRlc3RfY2MJCTEgMCAwIDEKKwl0ZXN0X2hfbWVtIAkweGRlYWRiZWVmLHNwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL29yY2NyLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvb3JjY3IuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYzU1YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL29yY2NyLmNncwpAQCAtMCwwICsxLDM4IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIG9yY2NyICR1OAorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBvcmNjcgorb3JjY3I6CisJb3JjY3IgICAgICAJMHhmZgorCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0X2kJCTEKKwl0ZXN0X3NfdXNlcgorCisJc2V0X2NjCTB4MGYKKwlvcmNjciAgICAgIAkweDAwCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaQkJMQorCXRlc3Rfc191c2VyCisKKwlzZXRfY2MJCTB4MDAKKwlzZXRfaQkJCTAKKwlzZXRfc19zeXN0ZW0KKwlvcmNjciAgICAgIAkweGFhCisJdGVzdF9jYwkJMSAwIDEgMAorCXRlc3RfaQkJMAorCXRlc3Rfc191c2VyCisKKwlzZXRfY2MJCTB4MDAKKwlzZXRfaQkJCTAKKwlzZXRfc19zeXN0ZW0KKwlvcmNjciAgICAgIAkweGMwCisJdGVzdF9jYwkJMCAwIDAgMAorCXRlc3RfaQkJMAorCXRlc3Rfc19zeXN0ZW0KKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvb3JoLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvb3JoLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzBiNDAyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9vcmguY2dzCkBAIC0wLDAgKzEsMzMgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3Igb3JoICRSaiwkUmksIG9yaCAkUmosQCRSaQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBvcmgKK29yaDoKKwk7IFRlc3Qgb3JoICRSaixAJFJpCisJbXZpX2hfZ3IgICAJMHhhYWFhYWFhYSxyNworCW12aV9oX21lbSAgCTB4NTU1NTU1NTUsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwNwkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW9yaCAgICAgIAlyNyxAc3AKKwl0ZXN0X2NjCQkxIDAgMSAxCisJdGVzdF9oX21lbSAJMHhmZmZmNTU1NSxzcAorCisJbXZpX2hfZ3IgICAJMHhmZmZmMDAwMCxyNworCW12aV9oX21lbSAgCTB4MDAwMGZmZmYsc3AKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCW9yaAkJcjcsQHNwCisJdGVzdF9jYwkJMCAxIDAgMAorCXRlc3RfaF9tZW0gCTB4MDAwMGZmZmYsc3AKKworCW12aV9oX2dyICAgCTB4MDAwMGRlMDAscjcKKwltdmlfaF9tZW0gIAkweDAwYWRiZWVmLHNwCisJc2V0X2NjICAgICAgICAgIDB4MDUJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlvcmgJCXI3LEBzcAorCXRlc3RfY2MJCTEgMCAwIDEKKwl0ZXN0X2hfbWVtIAkweGRlYWRiZWVmLHNwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3JldC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3JldC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JmYTBiMgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvcmV0LmNncwpAQCAtMCwwICsxLDc1IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIHJldAorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCByZXQKKworCTsgVGVzdCByZXQKKwltdmlfaF9ncgkweGRlYWRiZWVmLHI5CisJbXZpX2hfZ3IgICAJI2Z1bmMxLHIwCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZG4ndCBjaGFuZ2UKK2NhbGwxOgorCWNhbGwJCUByMAorCXRlc3RyX2hfZ3IJMixyMAorCXRlc3RfaF9ncgkweGJlZWZkZWFkLHI5CisJcGFzcworCitmdW5jMToKKwl0ZXN0X2NjCQkxIDEgMSAxCisJbXZpX2hfZ3IJI2NhbGwxLHI3CisJaW5jaV9oX2dyCTIscjcKKwl0ZXN0cl9oX2RyCXI3LHJwCisJc2F2ZV9ycAorCisJbXZpX2hfZ3IgICAJI2Z1bmMyLHIwCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZG4ndCBjaGFuZ2UKK2NhbGwyOgorCWNhbGw6ZAkJQHIwCisJbGRpOjgJCTEscjAJCTsgTXVzdCBhc3N1bWUgdGhpcyB3b3JrcworCXRlc3RyX2hfZ3IJMixyMAorCXJlc3RvcmVfcnAKKwlyZXQKK2Z1bmMyOgorCXRlc3RfY2MJCTEgMSAxIDEKKwltdmlfaF9ncgkjY2FsbDIscjcKKwlpbmNpX2hfZ3IJNCxyNworCXRlc3RyX2hfZHIJcjcscnAKKwl0ZXN0cl9oX2dyCTEscjAKKwlzYXZlX3JwCisKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBjb25kaXRpb24gY29kZXMgc2hvdWxkbid0IGNoYW5nZQorY2FsbDM6CisJY2FsbAkJZnVuYzMKKwl0ZXN0cl9oX2dyCTIscjAKKwlyZXN0b3JlX3JwCisJcmV0CitmdW5jMzoKKwl0ZXN0X2NjCQkxIDEgMSAxCisJbXZpX2hfZ3IJI2NhbGwzLHI3CisJaW5jaV9oX2dyCTIscjcKKwl0ZXN0cl9oX2RyCXI3LHJwCisJc2F2ZV9ycAorCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgY29uZGl0aW9uIGNvZGVzIHNob3VsZG4ndCBjaGFuZ2UKK2NhbGw0OgorCWNhbGw6ZAkJZnVuYzQKKwlsZGk6OAkJMSxyMAkJOyBNdXN0IGFzc3VtZSB0aGlzIHdvcmtzCisJdGVzdHJfaF9ncgkzLHIwCisJcmVzdG9yZV9ycAorCXJldDpkCisJbGRpOjgJCTIscjAJCTsgTXVzdCBhc3N1bWUgdGhpcyB3b3JrcworZnVuYzQ6CisJdGVzdF9jYwkJMSAxIDEgMQorCW12aV9oX2dyCSNjYWxsNCxyNworCWluY2lfaF9ncgk0LHI3CisJdGVzdHJfaF9kcglyNyxycAorCXRlc3RyX2hfZ3IJMSxyMAorCW12aV9oX2dyCTB4YmVlZmRlYWQscjkKKwlyZXQ6ZAorCWxkaTo4CQkzLHIwCQk7IE11c3QgYXNzdW1lIHRoaXMgd29ya3MKKworCWZhaWwKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvcmV0aS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3JldGkuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YTFhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3JldGkuY2dzCkBAIC0wLDAgKzEsNTcgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgcmV0aQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCByZXRpCityZXRpOgorCTsgVGVzdCByZXRpIHdpdGggbG93IHJlc2V0IG9mIGlsbSBhbGxvd2VkCisJbXZyX2hfZ3IJc3AscjgJCTsgU2F2ZSBzdGFjayBwb2ludGVyCisJc2V0X3Nfc3lzdGVtCisJc2V0X2kJCTEKKwlzZXRfaWxtCQkxNQkJOyBhdHRlbXB0IHJlc2V0IG9mIGxvdyByYW5nZQkgCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJc2F2ZV9wcworCWluY2lfaF9ncgktNCxzcAorCW12aV9oX21lbQlyZXQxLHNwCisJc2V0X2kJCTAJCTsgU2V0IG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJc2V0X2lsbQkJMCAJCTsgYXR0ZW1wdCByZXNldCBvZiBsb3cgcmFuZ2UJIAorCXNldF9jYyAgICAgICAgICAweDAwCQk7IFNldCBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCisJcmV0aQorCWZhaWwKKworcmV0MToKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9zX3N5c3RlbQorCXRlc3RfaQkJMQorCXRlc3RfaWxtCTE1CisJdGVzdHJfaF9ncglyOCxzcAorCisJOyBUZXN0IHJldGkgd2l0aCBsb3cgcmVzZXQgb2YgaWxtIG5vdCBhbGxvd2VkCisJbXZyX2hfZ3IJc3AscjgJCTsgU2F2ZSBzdGFjayBwb2ludGVyCisJc2V0X3Nfc3lzdGVtCisJc2V0X2kJCTAKKwlzZXRfaWxtCQkxNQkJOyBhdHRlbXB0IHJlc2V0IG9mIGxvdyByYW5nZQkgCisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJc2F2ZV9wcworCWluY2lfaF9ncgktNCxzcAorCW12aV9oX21lbQlyZXQyLHNwCisJc2V0X2kJCTAJCTsgU2V0IG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJc2V0X2lsbQkJMTYgCQk7IGRpc2FsbG93IHJlc2V0IG9mIGxvdyByYW5nZQorCXNldF9jYyAgICAgICAgICAweDAwCQk7IFNldCBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCisJcmV0aQorCWZhaWwKKworcmV0MjoKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9zX3N5c3RlbQorCXRlc3RfaQkJMAorCXRlc3RfaWxtCTMxCisJdGVzdHJfaF9ncglyOCxzcAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N0LmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDU4ZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdC5jZ3MKQEAgLTAsMCArMSwxOTQgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IKKyMgbWFjaCgpOiBmcjMwCisjICBzdCAkUmksQCRSagorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIHN0CitzdDoKKwltdnJfaF9ncglzcCxyOQkJOyBTYXZlIHN0YWNrIHBvaW50ZXIKKwk7IFRlc3Qgc3QgJFJpLEBSagorCW12aV9oX2dyCTB4ZGVhZGJlZWYscjgKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlzdCAgICAgIAlyOCxAc3AKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX21lbQkweGRlYWRiZWVmLHNwCisJdGVzdF9oX2dyCTB4ZGVhZGJlZWYscjgKKworCTsgVGVzdCBzdCAkUmksQChSMTMsUmopCisJbXZpX2hfZ3IJMHhiZWVmZGVhZCxyOAorCW12cl9oX2dyCXNwLHIxCisJaW5jaV9oX2dyCS04LHNwCisJbXZyX2hfZ3IJc3AscjIKKwlpbmNpX2hfZ3IJNCxzcAorCisJbXZpX2hfZ3IJNCxyMTMKKwlzZXRfY2MgICAgICAgICAgMHgwZQkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlzdCAgICAgIAlyOCxAKHIxMyxzcCkKKwl0ZXN0X2NjCQkxIDEgMSAwCisJdGVzdF9oX21lbQkweGJlZWZkZWFkLHIxCisJdGVzdF9oX2dyCTB4YmVlZmRlYWQscjgKKworCW12aV9oX2dyCTAscjEzCisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJc3QgICAgICAJcjgsQChyMTMsc3ApCisJdGVzdF9jYwkJMSAxIDAgMQorCXRlc3RfaF9tZW0JMHhiZWVmZGVhZCxzcAorCXRlc3RfaF9ncgkweGJlZWZkZWFkLHI4CisKKwltdmlfaF9ncgktNCxyMTMKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlzdCAgICAgIAlyOCxAKHIxMyxzcCkKKwl0ZXN0X2NjCQkxIDEgMCAwCisJdGVzdF9oX21lbQkweGJlZWZkZWFkLHIyCisJdGVzdF9oX2dyCTB4YmVlZmRlYWQscjgKKworCTsgVGVzdCBzdCAkUmksQChSMTQsJGRpc3AxMCkKKwltdmlfaF9ncgkweGRlYWRiZWVmLHI4CisJbXZyX2hfZ3IJcjksc3AJCTsgUmVzdG9yZSBzdGFjayBwb2ludGVyCisJbXZyX2hfZ3IJc3AscjE0CisJaW5jaV9oX2dyCS01MDgscjE0CisJbXZyX2hfZ3IJcjE0LHIyCisJaW5jaV9oX2dyCS01MTIscjE0CisJbXZyX2hfZ3IJcjE0LHIzCisJaW5jaV9oX2dyCTUxMixyMTQKKworCXNldF9jYyAgICAgICAgICAweDBiCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCXN0ICAgICAgCXI4LEAocjE0LDUwOCkKKwl0ZXN0X2NjCQkxIDAgMSAxCisJdGVzdF9oX21lbQkweGRlYWRiZWVmLHIxCisJdGVzdF9oX2dyCTB4ZGVhZGJlZWYscjgKKworCXNldF9jYyAgICAgICAgICAweDBhCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCXN0ICAgICAgCXI4LEAocjE0LDApCisJdGVzdF9jYwkJMSAwIDEgMAorCXRlc3RfaF9tZW0JMHhkZWFkYmVlZixyMgorCXRlc3RfaF9ncgkweGRlYWRiZWVmLHI4CisKKwlzZXRfY2MgICAgICAgICAgMHgwOQkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlzdCAgICAgIAlyOCxAKHIxNCwtNTEyKQorCXRlc3RfY2MJCTEgMCAwIDEKKwl0ZXN0X2hfbWVtCTB4ZGVhZGJlZWYscjMKKwl0ZXN0X2hfZ3IJMHhkZWFkYmVlZixyOAorCisJOyBUZXN0IHN0ICRSaSxAKFIxNSwkdWRpc3A2KQorCW12aV9oX2dyCTB4YmVlZmRlYWQscjgKKwltdnJfaF9ncglyOSxzcAkJOyBSZXN0b3JlIHN0YWNrIHBvaW50ZXIKKwlpbmNpX2hfZ3IJLTYwLHNwCisKKwlzZXRfY2MgICAgICAgICAgMHgwOAkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlzdCAgICAgIAlyOCxAKHIxNSw2MCkKKwl0ZXN0X2NjCQkxIDAgMCAwCisJdGVzdF9oX21lbQkweGJlZWZkZWFkLHI5CisJdGVzdF9oX2dyCTB4YmVlZmRlYWQscjgKKworCXNldF9jYyAgICAgICAgICAweDA3CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCXN0ICAgICAgCXI4LEAocjE1LDApCisJdGVzdF9jYwkJMCAxIDEgMQorCXRlc3RfaF9tZW0JMHhiZWVmZGVhZCxyOQorCXRlc3RfaF9ncgkweGJlZWZkZWFkLHI4CisKKwk7IFRlc3Qgc3QgJFJpLEAtUjE1CisJbXZyX2hfZ3IJcjksc3AJCTsgUmVzdG9yZSBzdGFjayBwb2ludGVyCisJbXZyX2hfZ3IJcjkscjEwCisKKwlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlzdCAgICAgIAlyMTUsQC1yMTUKKwl0ZXN0X2NjCQkwIDEgMSAwCisJdGVzdHJfaF9tZW0Jcjksc3AJCTsgb3JpZ2luYWwgdmFsdWUgc3RvcmVkCisJaW5jaV9oX2dyCS00LHIxMAorCXRlc3RyX2hfZ3IJcjEwLHNwCQk7IHdhcyBkZWNyZW1lbnRlZAorCisJbXZpX2hfZ3IJMHhkZWFkYmVlZixyOAorCXNldF9jYyAgICAgICAgICAweDA1CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCXN0ICAgICAgCXI4LEAtcjE1CisJdGVzdF9jYwkJMCAxIDAgMQorCXRlc3RfaF9tZW0JMHhkZWFkYmVlZixzcAorCXRlc3RfaF9ncgkweGRlYWRiZWVmLHI4CisJaW5jaV9oX2dyCS00LHIxMAorCXRlc3RyX2hfZ3IJcjEwLHNwCQk7IHdhcyBkZWNyZW1lbnRlZAorCisJOyBUZXN0IHN0ICRScyxALVIxNQorCW12cl9oX2dyCXI5LHNwCQk7IFJlc3RvcmUgc3RhY2sgcG9pbnRlcgorCW12cl9oX2dyCXI5LHIxMAorCW12aV9oX2RyCTB4YmVlZmRlYWQsdGJyCisJbXZpX2hfZHIJMHhkZWFkYmVlZixycAorCW12aV9oX2RyCTB4MDAwMGRlYWQsbWRoCisJbXZpX2hfZHIJMHhiZWVmMDAwMCxtZGwKKworCXNldF9jYyAgICAgICAgICAweDA0CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCXN0ICAgICAgCXRicixALXIxNQorCXRlc3RfY2MJCTAgMSAwIDAKKwl0ZXN0X2hfbWVtCTB4YmVlZmRlYWQsc3AKKwlpbmNpX2hfZ3IJLTQscjEwCisJdGVzdHJfaF9ncglyMTAsc3AJCTsgd2FzIGRlY3JlbWVudGVkCisKKwlzZXRfY2MgICAgICAgICAgMHgwMwkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlzdCAgICAgIAlycCxALXIxNQorCXRlc3RfY2MJCTAgMCAxIDEKKwl0ZXN0X2hfbWVtCTB4ZGVhZGJlZWYsc3AKKwlpbmNpX2hfZ3IJLTQscjEwCisJdGVzdHJfaF9ncglyMTAsc3AJCTsgd2FzIGRlY3JlbWVudGVkCisKKwlzZXRfY2MgICAgICAgICAgMHgwMgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlzdCAgICAgIAltZGgsQC1yMTUKKwl0ZXN0X2NjCQkwIDAgMSAwCisJdGVzdF9oX21lbQkweDAwMDBkZWFkLHNwCisJaW5jaV9oX2dyCS00LHIxMAorCXRlc3RyX2hfZ3IJcjEwLHNwCQk7IHdhcyBkZWNyZW1lbnRlZAorCisJc2V0X2NjICAgICAgICAgIDB4MDEJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJc3QgICAgICAJbWRsLEAtcjE1CisJdGVzdF9jYwkJMCAwIDAgMQorCXRlc3RfaF9tZW0JMHhiZWVmMDAwMCxzcAorCWluY2lfaF9ncgktNCxyMTAKKwl0ZXN0cl9oX2dyCXIxMCxzcAkJOyB3YXMgZGVjcmVtZW50ZWQKKworCW12cl9oX2dyCXNwLHVzcAorCXNldF9zX3VzZXIKKwlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlzdCAgICAgIAlzc3AsQC1yMTUKKwl0ZXN0X2NjCQkwIDAgMCAwCisJdGVzdHJfaF9tZW0JcjEwLHNwCisJaW5jaV9oX2dyCS00LHIxMAorCXRlc3RyX2hfZ3IJcjEwLHNwCQk7IHdhcyBkZWNyZW1lbnRlZAorCisJc2V0X2NjICAgICAgICAgIDB4MDAJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJc3QgICAgICAJdXNwLEAtcjE1CisJdGVzdF9jYwkJMCAwIDAgMAorCXRlc3RyX2hfbWVtCXIxMCxzcAkJOyBvcmlnaW5hbCB2YWx1ZSBzdG9yZWQKKwlpbmNpX2hfZ3IJLTQscjEwCisJdGVzdHJfaF9ncglyMTAsc3AJCTsgd2FzIGRlY3JlbWVudGVkCisKKwltdnJfaF9ncglzcCxzc3AKKwlzZXRfc19zeXN0ZW0KKwlzZXRfY2MgICAgICAgICAgMHgwMAkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlzdCAgICAgIAl1c3AsQC1yMTUKKwl0ZXN0X2NjCQkwIDAgMCAwCisJdGVzdHJfaF9tZW0JcjEwLHNwCisJaW5jaV9oX2dyCS00LHIxMAorCXRlc3RyX2hfZ3IJcjEwLHNwCQk7IHdhcyBkZWNyZW1lbnRlZAorCisJc2V0X2NjICAgICAgICAgIDB4MDAJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJc3QgICAgICAJc3NwLEAtcjE1CisJdGVzdF9jYwkJMCAwIDAgMAorCXRlc3RyX2hfbWVtCXIxMCxzcAkJOyBvcmlnaW5hbCB2YWx1ZSBzdG9yZWQKKwlpbmNpX2hfZ3IJLTQscjEwCisJdGVzdHJfaF9ncglyMTAsc3AJCTsgd2FzIGRlY3JlbWVudGVkCisKKwk7IFRlc3Qgc3QgJFBTLEAtUjE1CisJbXZyX2hfZ3IJcjksc3AJCTsgUmVzdG9yZSBzdGFjayBwb2ludGVyCisJbXZyX2hfZ3IJcjkscjEwCisKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgYWZmZWN0IHJlc3VsdAorCXNldF9kYml0cwkzCQk7IERpdmlzaW9uIGJpdHMgYWZmZWN0IHJlc3VsdAorCXN0ICAgICAgCXBzLEAtcjE1CisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9tZW0JMHgwMDAwMDYwZixzcAorCWluY2lfaF9ncgktNCxyMTAKKwl0ZXN0cl9oX2dyCXIxMCxzcAkJOyB3YXMgZGVjcmVtZW50ZWQKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvc3RiLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvc3RiLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWQ0ZmQwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdGIuY2dzCkBAIC0wLDAgKzEsODQgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IKKyMgbWFjaCgpOiBmcjMwCisjICBzdGIgJFJpLEAkUmoKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBzdGIKK3N0YjoKKwltdnJfaF9ncglzcCxyOQkJOyBTYXZlIHN0YWNrIHBvaW50ZXIKKwk7IFRlc3Qgc3RiICRSaSxAUmoKKwltdmlfaF9tZW0JMHhkZWFkYmVlZixzcAorCW12aV9oX2dyCTB4YWFhYWFhZmUscjgKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlzdGIgICAgICAJcjgsQHNwCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9tZW0JMHhmZWFkYmVlZixzcAorCXRlc3RfaF9ncgkweGFhYWFhYWZlLHI4CisKKwk7IFRlc3Qgc3RiICRSaSxAKFIxMyxSaikKKwltdmlfaF9tZW0JMHhiZWVmZGVhZCxzcAorCW12aV9oX2dyCTB4YWFhYWFhZGUscjgKKwltdnJfaF9ncglzcCxyMQorCWluY2lfaF9ncgktOCxzcAorCW12cl9oX2dyCXNwLHIyCisJbXZpX2hfbWVtCTB4YmVlZmRlYWQsc3AKKwlpbmNpX2hfZ3IJNCxzcAorCW12aV9oX21lbQkweGJlZWZkZWFkLHNwCisKKwltdmlfaF9ncgk0LHIxMworCXNldF9jYyAgICAgICAgICAweDBlCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCXN0YiAgICAgIAlyOCxAKHIxMyxzcCkKKwl0ZXN0X2NjCQkxIDEgMSAwCisJdGVzdF9oX21lbQkweGRlZWZkZWFkLHIxCisJdGVzdF9oX2dyCTB4YWFhYWFhZGUscjgKKworCW12aV9oX2dyCTAscjEzCisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJc3RiICAgICAgCXI4LEAocjEzLHNwKQorCXRlc3RfY2MJCTEgMSAwIDEKKwl0ZXN0X2hfbWVtCTB4ZGVlZmRlYWQsc3AKKwl0ZXN0X2hfZ3IJMHhhYWFhYWFkZSxyOAorCisJbXZpX2hfZ3IJLTQscjEzCisJc2V0X2NjICAgICAgICAgIDB4MGMJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJc3RiICAgICAgCXI4LEAocjEzLHNwKQorCXRlc3RfY2MJCTEgMSAwIDAKKwl0ZXN0X2hfbWVtCTB4ZGVlZmRlYWQscjIKKwl0ZXN0X2hfZ3IJMHhhYWFhYWFkZSxyOAorCisJOyBUZXN0IHN0YiAkUmksQChSMTQsJGRpc3A4CisJbXZyX2hfZ3IJcjksc3AJCTsgUmVzdG9yZSBzdGFjayBwb2ludGVyCisJbXZpX2hfZ3IJMHhhYWFhYWFmZSxyOAorCW12aV9oX21lbQkweGRlYWRiZWVmLHNwCisJbXZyX2hfZ3IJc3AscjE0CisJaW5jaV9oX2dyCS0xMjcscjE0CisJbXZyX2hfZ3IJcjE0LHIyCisJbXZpX2hfbWVtCTB4ZGVhZGJlZWYscjE0CisJaW5jaV9oX2dyCS0xMjgscjE0CisJbXZyX2hfZ3IJcjE0LHIzCisJbXZpX2hfbWVtCTB4ZGVhZGJlZWYscjE0CisJaW5jaV9oX2dyCTEyOCxyMTQKKworCXNldF9jYyAgICAgICAgICAweDBiCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCXN0YiAgICAgIAlyOCxAKHIxNCwxMjcpCisJdGVzdF9jYwkJMSAwIDEgMQorCXRlc3RfaF9tZW0JMHhmZWFkYmVlZixyMQorCXRlc3RfaF9ncgkweGFhYWFhYWZlLHI4CisKKwlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlzdGIgICAgICAJcjgsQChyMTQsMCkKKwl0ZXN0X2NjCQkxIDAgMSAwCisJdGVzdF9oX21lbQkweGZlYWRiZWVmLHIyCisJdGVzdF9oX2dyCTB4YWFhYWFhZmUscjgKKworCXNldF9jYyAgICAgICAgICAweDA5CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCXN0YiAgICAgIAlyOCxAKHIxNCwtMTI4KQorCXRlc3RfY2MJCTEgMCAwIDEKKwl0ZXN0X2hfbWVtCTB4ZmVhZGJlZWYscjMKKwl0ZXN0X2hfZ3IJMHhhYWFhYWFmZSxyOAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdGguY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdGguY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YzgzZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N0aC5jZ3MKQEAgLTAsMCArMSw4NCBAQAorIyBmcjMwIHRlc3RjYXNlIGZvcgorIyBtYWNoKCk6IGZyMzAKKyMgIHN0aCAkUmksQCRSagorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIHN0aAorc3RoOgorCW12cl9oX2dyCXNwLHI5CQk7IFNhdmUgc3RhY2sgcG9pbnRlcgorCTsgVGVzdCBzdGggJFJpLEBSagorCW12aV9oX21lbQkweGRlYWRiZWVmLHNwCisJbXZpX2hfZ3IJMHhhYWFhYmVlZixyOAorCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCXN0aCAgICAgIAlyOCxAc3AKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX21lbQkweGJlZWZiZWVmLHNwCisJdGVzdF9oX2dyCTB4YWFhYWJlZWYscjgKKworCTsgVGVzdCBzdGggJFJpLEAoUjEzLFJqKQorCW12aV9oX21lbQkweGJlZWZkZWFkLHNwCisJbXZpX2hfZ3IJMHhhYWFhZGVhZCxyOAorCW12cl9oX2dyCXNwLHIxCisJaW5jaV9oX2dyCS04LHNwCisJbXZyX2hfZ3IJc3AscjIKKwltdmlfaF9tZW0JMHhiZWVmZGVhZCxzcAorCWluY2lfaF9ncgk0LHNwCisJbXZpX2hfbWVtCTB4YmVlZmRlYWQsc3AKKworCW12aV9oX2dyCTQscjEzCisJc2V0X2NjICAgICAgICAgIDB4MGUJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJc3RoICAgICAgCXI4LEAocjEzLHNwKQorCXRlc3RfY2MJCTEgMSAxIDAKKwl0ZXN0X2hfbWVtCTB4ZGVhZGRlYWQscjEKKwl0ZXN0X2hfZ3IJMHhhYWFhZGVhZCxyOAorCisJbXZpX2hfZ3IJMCxyMTMKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlzdGggICAgICAJcjgsQChyMTMsc3ApCisJdGVzdF9jYwkJMSAxIDAgMQorCXRlc3RfaF9tZW0JMHhkZWFkZGVhZCxzcAorCXRlc3RfaF9ncgkweGFhYWFkZWFkLHI4CisKKwltdmlfaF9ncgktNCxyMTMKKwlzZXRfY2MgICAgICAgICAgMHgwYwkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlzdGggICAgICAJcjgsQChyMTMsc3ApCisJdGVzdF9jYwkJMSAxIDAgMAorCXRlc3RfaF9tZW0JMHhkZWFkZGVhZCxyMgorCXRlc3RfaF9ncgkweGFhYWFkZWFkLHI4CisKKwk7IFRlc3Qgc3RoICRSaSxAKFIxNCwkZGlzcDkpCisJbXZyX2hfZ3IJcjksc3AJCTsgUmVzdG9yZSBzdGFjayBwb2ludGVyCisJbXZpX2hfZ3IJMHhhYWFhYmVlZixyOAorCW12aV9oX21lbQkweGRlYWRiZWVmLHNwCisJbXZyX2hfZ3IJc3AscjE0CisJaW5jaV9oX2dyCS0yNTQscjE0CisJbXZyX2hfZ3IJcjE0LHIyCisJbXZpX2hfbWVtCTB4ZGVhZGJlZWYscjE0CisJaW5jaV9oX2dyCS0yNTYscjE0CisJbXZyX2hfZ3IJcjE0LHIzCisJbXZpX2hfbWVtCTB4ZGVhZGJlZWYscjE0CisJaW5jaV9oX2dyCTI1NixyMTQKKworCXNldF9jYyAgICAgICAgICAweDBiCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCXN0aCAgICAgIAlyOCxAKHIxNCwyNTQpCisJdGVzdF9jYwkJMSAwIDEgMQorCXRlc3RfaF9tZW0JMHhiZWVmYmVlZixyMQorCXRlc3RfaF9ncgkweGFhYWFiZWVmLHI4CisKKwlzZXRfY2MgICAgICAgICAgMHgwYQkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlzdGggICAgICAJcjgsQChyMTQsMCkKKwl0ZXN0X2NjCQkxIDAgMSAwCisJdGVzdF9oX21lbQkweGJlZWZiZWVmLHIyCisJdGVzdF9oX2dyCTB4YWFhYWJlZWYscjgKKworCXNldF9jYyAgICAgICAgICAweDA5CQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCXN0aCAgICAgIAlyOCxAKHIxNCwtMjU2KQorCXRlc3RfY2MJCTEgMCAwIDEKKwl0ZXN0X2hfbWVtCTB4YmVlZmJlZWYscjMKKwl0ZXN0X2hfZ3IJMHhhYWFhYmVlZixyOAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdGlsbS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N0aWxtLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTc5NDBiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdGlsbS5jZ3MKQEAgLTAsMCArMSw0MSBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBzdGlsbSAkaTgKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgc3RpbG0KK3N0aWxtOgorCXN0aWxtICAgICAgCTAKKwl0ZXN0X2lsbQkwCisKKwlzdGlsbQkJMHhlMAorCXRlc3RfaWxtCTAKKworCXN0aWxtCQkxCisJdGVzdF9pbG0JMQorCisJc3RpbG0JCTE1CisJdGVzdF9pbG0JMTUKKworCXN0aWxtCQkxNgorCXRlc3RfaWxtCTE2CisKKwlzdGlsbQkJMAorCXRlc3RfaWxtCTE2CisKKwlzdGlsbQkJMQorCXRlc3RfaWxtCTE3CisKKwlzdGlsbQkJMTgKKwl0ZXN0X2lsbQkxOAorCisJc3RpbG0JCTMxCisJdGVzdF9pbG0JMzEKKworCXN0aWxtCQkweGZmCisJdGVzdF9pbG0JMzEKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvc3RtMC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N0bTAuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYzE2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N0bTAuY2dzCkBAIC0wLDAgKzEsMTAxIEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIHN0bTAgKCRyZWdsaXN0X2xvdykKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgc3RtMAorc3RtMDoKKwk7IFRlc3Qgc3RtMCAoJHJlZ2xpc3RfbG93KQorCW12cl9oX2dyCXNwLHI4CQk7IHNhdmUgc3RhY2sgcG9pbnRlciB0ZW1wb3JhcmlseQorCW12cl9oX2dyCXNwLHI5CQk7IHNhdmUgc3RhY2sgcG9pbnRlciBwZXJtYW5lbnRseQorCW12aV9oX2dyICAgCTAscjAKKwltdmlfaF9nciAgIAkxLHIxCisJbXZpX2hfZ3IgICAJMixyMgorCW12aV9oX2dyICAgCTMscjMKKwltdmlfaF9nciAgIAk0LHI0CisJbXZpX2hfZ3IgICAJNSxyNQorCW12aV9oX2dyICAgCTYscjYKKwltdmlfaF9nciAgIAk3LHI3CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJc3RtMCAgICAgIAkocjAscjIscjQscjYpCisJdGVzdF9jYwkJMSAxIDEgMQorCWluY2lfaF9ncgktNCxyOAorCXRlc3RfaF9tZW0JNixyOAorCWluY2lfaF9ncgktNCxyOAorCXRlc3RfaF9tZW0JNCxyOAorCWluY2lfaF9ncgktNCxyOAorCXRlc3RfaF9tZW0JMixyOAorCWluY2lfaF9ncgktNCxyOAorCXRlc3RfaF9tZW0JMCxyOAorCisJbXZyX2hfZ3IJcjksc3AJCTsgcmVzdG9yZSBzdGFjayBwb2ludGVyCisJbXZyX2hfZ3IJcjkscjgJCTsgc2F2ZSBzdGFjayBwb2ludGVyIHRlbXBvcmFyaWx5CisJbXZpX2hfZ3IgICAJMCxyMAorCW12aV9oX2dyICAgCTEscjEKKwltdmlfaF9nciAgIAkyLHIyCisJbXZpX2hfZ3IgICAJMyxyMworCW12aV9oX2dyICAgCTQscjQKKwltdmlfaF9nciAgIAk1LHI1CisJbXZpX2hfZ3IgICAJNixyNgorCW12aV9oX2dyICAgCTcscjcKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBDb25kaXRpb24gY29kZXMgc2hvdWxkIG5vdCBjaGFuZ2UKKwlzdG0wICAgICAgCShyMSxyMyxyNSxyNykKKwl0ZXN0X2NjCQkxIDEgMSAxCisJaW5jaV9oX2dyCS00LHI4CisJdGVzdF9oX21lbQk3LHI4CisJaW5jaV9oX2dyCS00LHI4CisJdGVzdF9oX21lbQk1LHI4CisJaW5jaV9oX2dyCS00LHI4CisJdGVzdF9oX21lbQkzLHI4CisJaW5jaV9oX2dyCS00LHI4CisJdGVzdF9oX21lbQkxLHI4CisKKwltdnJfaF9ncglyOSxzcAkJOyByZXN0b3JlIHN0YWNrIHBvaW50ZXIKKwltdnJfaF9ncglyOSxyOAkJOyBzYXZlIHN0YWNrIHBvaW50ZXIgdGVtcG9yYXJpbHkKKwltdmlfaF9nciAgIAkwLHIwCisJbXZpX2hfZ3IgICAJMSxyMQorCW12aV9oX2dyICAgCTIscjIKKwltdmlfaF9nciAgIAkzLHIzCisJbXZpX2hfZ3IgICAJNCxyNAorCW12aV9oX2dyICAgCTUscjUKKwltdmlfaF9nciAgIAk2LHI2CisJbXZpX2hfZ3IgICAJNyxyNworCXNldF9jYyAgICAgICAgICAweDBmCQk7IENvbmRpdGlvbiBjb2RlcyBzaG91bGQgbm90IGNoYW5nZQorCXN0bTAgICAgICAJKHIxLHI1LHI3LHIzKQk7IE9yZGVyIHNwZWNpZmllZCBzaG91bGQgbm90IG1hdHRlcgorCXRlc3RfY2MJCTEgMSAxIDEKKwlpbmNpX2hfZ3IJLTQscjgKKwl0ZXN0X2hfbWVtCTcscjgKKwlpbmNpX2hfZ3IJLTQscjgKKwl0ZXN0X2hfbWVtCTUscjgKKwlpbmNpX2hfZ3IJLTQscjgKKwl0ZXN0X2hfbWVtCTMscjgKKwlpbmNpX2hfZ3IJLTQscjgKKwl0ZXN0X2hfbWVtCTEscjgKKworCW12cl9oX2dyCXI5LHNwCQk7IHJlc3RvcmUgc3RhY2sgcG9pbnRlcgorCW12cl9oX2dyCXI5LHI4CQk7IHNhdmUgc3RhY2sgcG9pbnRlciB0ZW1wb3JhcmlseQorCW12aV9oX2dyICAgCTkscjAKKwltdmlfaF9nciAgIAk5LHIxCisJbXZpX2hfZ3IgICAJOSxyMgorCW12aV9oX2dyICAgCTkscjMKKwltdmlfaF9nciAgIAk5LHI0CisJbXZpX2hfZ3IgICAJOSxyNQorCW12aV9oX2dyICAgCTkscjYKKwltdmlfaF9nciAgIAk5LHI3CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJc3RtMCAgICAgIAkoKQkJOyBzaG91bGQgZG8gbm90aGluZworCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0cl9oX2dyCXI5LHNwCisJaW5jaV9oX2dyCS00LHI4CisJdGVzdF9oX21lbQk3LHI4CisJaW5jaV9oX2dyCS00LHI4CisJdGVzdF9oX21lbQk1LHI4CisJaW5jaV9oX2dyCS00LHI4CisJdGVzdF9oX21lbQkzLHI4CisJaW5jaV9oX2dyCS00LHI4CisJdGVzdF9oX21lbQkxLHI4CisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N0bTEuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdG0xLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWMzNzNkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdG0xLmNncwpAQCAtMCwwICsxLDk3IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIHN0bTEgKCRyZWdsaXN0X2xvdykKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgc3RtMQorc3RtMToKKwk7IFRlc3Qgc3RtMSAoJHJlZ2xpc3RfbG93KQorCW12cl9oX2dyCXNwLHIxCQk7IHNhdmUgc3RhY2sgcG9pbnRlciB0ZW1wb3JhcmlseQorCW12cl9oX2dyCXNwLHIyCQk7IHNhdmUgc3RhY2sgcG9pbnRlciBwZXJtYW5lbnRseQorCW12aV9oX2dyICAgCTgscjgKKwltdmlfaF9nciAgIAk5LHI5CisJbXZpX2hfZ3IgICAJMTAscjEwCisJbXZpX2hfZ3IgICAJMTEscjExCisJbXZpX2hfZ3IgICAJMTIscjEyCisJbXZpX2hfZ3IgICAJMTMscjEzCisJbXZpX2hfZ3IgICAJMTQscjE0CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJc3RtMSAgICAgIAkocjgscjEwLHIxMixyMTQpCisJdGVzdF9jYwkJMSAxIDEgMQorCWluY2lfaF9ncgktNCxyMQorCXRlc3RfaF9tZW0JMTQscjEKKwlpbmNpX2hfZ3IJLTQscjEKKwl0ZXN0X2hfbWVtCTEyLHIxCisJaW5jaV9oX2dyCS00LHIxCisJdGVzdF9oX21lbQkxMCxyMQorCWluY2lfaF9ncgktNCxyMQorCXRlc3RyX2hfbWVtCTgscjEKKworCW12cl9oX2dyCXIyLHNwCQk7IHJlc3RvcmUgc3RhY2sgcG9pbnRlcgorCW12cl9oX2dyCXIyLHIxCQk7IHNhdmUgc3RhY2sgcG9pbnRlciB0ZW1wb3JhcmlseQorCW12aV9oX2dyICAgCTgscjgKKwltdmlfaF9nciAgIAk5LHI5CisJbXZpX2hfZ3IgICAJMTAscjEwCisJbXZpX2hfZ3IgICAJMTEscjExCisJbXZpX2hfZ3IgICAJMTIscjEyCisJbXZpX2hfZ3IgICAJMTMscjEzCisJbXZpX2hfZ3IgICAJMTQscjE0CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJc3RtMSAgICAgIAkocjkscjExLHIxMyxyMTUpCisJdGVzdF9jYwkJMSAxIDEgMQorCWluY2lfaF9ncgktNCxyMQorCXRlc3RyX2hfbWVtCXIyLHIxCisJaW5jaV9oX2dyCS00LHIxCisJdGVzdF9oX21lbQkxMyxyMQorCWluY2lfaF9ncgktNCxyMQorCXRlc3RfaF9tZW0JMTEscjEKKwlpbmNpX2hfZ3IJLTQscjEKKwl0ZXN0X2hfbWVtCTkscjEJCTsgc2F2ZWQgcjE1IGlzIGZyb20gYmVmb3JlIHN0bTEKKworCW12cl9oX2dyCXIyLHNwCQk7IHJlc3RvcmUgc3RhY2sgcG9pbnRlcgorCW12cl9oX2dyCXIyLHIxCQk7IHNhdmUgc3RhY2sgcG9pbnRlciB0ZW1wb3JhcmlseQorCW12aV9oX2dyICAgCTgscjgKKwltdmlfaF9nciAgIAk5LHI5CisJbXZpX2hfZ3IgICAJMTAscjEwCisJbXZpX2hfZ3IgICAJMTEscjExCisJbXZpX2hfZ3IgICAJMTIscjEyCisJbXZpX2hfZ3IgICAJMTMscjEzCisJbXZpX2hfZ3IgICAJMTQscjE0CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJc3RtMSAgICAgIAkocjkscjEzLHIxNSxyMTEpOyBPcmRlciBzcGVjaWZpZWQgc2hvdWxkIG5vdCBtYXR0ZXIKKwl0ZXN0X2NjCQkxIDEgMSAxCisJaW5jaV9oX2dyCS00LHIxCisJdGVzdHJfaF9tZW0JcjIscjEKKwlpbmNpX2hfZ3IJLTQscjEKKwl0ZXN0X2hfbWVtCTEzLHIxCisJaW5jaV9oX2dyCS00LHIxCisJdGVzdF9oX21lbQkxMSxyMQorCWluY2lfaF9ncgktNCxyMQorCXRlc3RfaF9tZW0JOSxyMQkJOyBzYXZlZCByMTUgaXMgZnJvbSBiZWZvcmUgc3RtMQorCisJbXZyX2hfZ3IJcjIsc3AJCTsgcmVzdG9yZSBzdGFjayBwb2ludGVyCisJbXZyX2hfZ3IJcjIscjEJCTsgc2F2ZSBzdGFjayBwb2ludGVyIHRlbXBvcmFyaWx5CisJbXZpX2hfZ3IgICAJOSxyOAorCW12aV9oX2dyICAgCTkscjkKKwltdmlfaF9nciAgIAk5LHIxMAorCW12aV9oX2dyICAgCTkscjExCisJbXZpX2hfZ3IgICAJOSxyMTIKKwltdmlfaF9nciAgIAk5LHIxMworCW12aV9oX2dyICAgCTkscjE0CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIHNob3VsZCBub3QgY2hhbmdlCisJc3RtMSAgICAgIAkoKQkJOyBzaG91bGQgZG8gbm90aGluZworCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0cl9oX2dyCXIyLHNwCisJaW5jaV9oX2dyCS00LHIxCisJdGVzdHJfaF9tZW0JcjIscjEKKwlpbmNpX2hfZ3IJLTQscjEKKwl0ZXN0X2hfbWVtCTEzLHIxCisJaW5jaV9oX2dyCS00LHIxCisJdGVzdF9oX21lbQkxMSxyMQorCWluY2lfaF9ncgktNCxyMQorCXRlc3RfaF9tZW0JOSxyMQorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdHJlcy5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N0cmVzLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODVmZGYzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdHJlcy5jZ3MKQEAgLTAsMCArMSwyNSBAQAorIyBmcjMwIHRlc3RjYXNlIGZvciBzdHJlcyAkQFJpKywkdTQKKyMgbWFjaCgpOiBmcjMwCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCVNUQVJUCisKKwkudGV4dAorCS5nbG9iYWwgc3RyZXMKK3N0cmVzOgorCTsgVGVzdCBzdHJlcyAkQFJpKywkdTQKKwk7IFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHNpbXBseSBpbmNyZW1lbnRzIFJpCisJbXZpX2hfZ3IgICAJMHgxMDAwLHI3CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJc3RyZXMgICAgICAJMCxAcjcrCisJdGVzdF9jYwkJMSAxIDEgMQorCXRlc3RfaF9nciAgCTB4MTAwNCxyNworCisJbXZpX2hfZ3IgICAJMHgxMDAwLHI3CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgQ29uZGl0aW9uIGNvZGVzIGFyZSBpcnJlbGV2ZW50CisJc3RyZXMgICAgICAJMHhmLEByNysKKwl0ZXN0X2NjCQkxIDEgMSAxCisJdGVzdF9oX2dyICAJMHgxMDA0LHI3CisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N1Yi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N1Yi5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlYWE3OQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvc3ViLmNncwpAQCAtMCwwICsxLDM2IEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIHN1YiAkUmosJFJpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIHN1Ygorc3ViOgorCTsgVGVzdCBzdWIgJFJqLCRSaQorCW12aV9oX2dyICAgCTEscjcKKwltdmlfaF9nciAgIAkyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlzdWIgICAgICAJcjcscjgKKwl0ZXN0X2NjCQkwIDAgMCAwCisJdGVzdF9oX2dyICAJMSxyOAorCisJbXZpX2hfZ3IgICAJMSxyNworCW12aV9oX2dyICAgCTB4ODAwMDAwMDAscjgKKwlzZXRfY2MgICAgICAgICAgMHgwZAkJOyBTZXQgbWFzayBvcHBvc2l0ZSBvZiBleHBlY3RlZAorCXN1YgkJcjcscjgKKwl0ZXN0X2NjCQkwIDAgMSAwCisJdGVzdF9oX2dyICAJMHg3ZmZmZmZmZixyOAorCisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgZXhwZWN0ZWQKKwlzdWIJCXI4LHI4CisJdGVzdF9jYwkJMCAxIDAgMAorCXRlc3RfaF9nciAgCTAscjgKKworCXNldF9jYyAgICAgICAgICAweDA2CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIGV4cGVjdGVkCisJc3ViCQlyNyxyOAorCXRlc3RfY2MJCTEgMCAwIDEKKwl0ZXN0X2hfZ3IgIAkweGZmZmZmZmZmLHI4CisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N1YmMuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdWJjLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTc4ZTQwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC9zdWJjLmNncwpAQCAtMCwwICsxLDYyIEBACisjIGZyMzAgdGVzdGNhc2UgZm9yIHN1YmMgJFJqLCRSaQorIyBtYWNoKCk6IGZyMzAKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJU1RBUlQKKworCS50ZXh0CisJLmdsb2JhbCBzdWJjCitzdWJjOgorCTsgVGVzdCBzdWJjICRSaiwkUmkKKwltdmlfaF9nciAgIAkxLHI3CisJbXZpX2hfZ3IgICAJMixyOAorCXNldF9jYyAgICAgICAgICAweDBlCQk7IE1ha2Ugc3VyZSBjYXJyeSBpcyBvZmYKKwlzdWJjICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAwIDAgMAorCXRlc3RfaF9nciAgCTEscjgKKworCW12aV9oX2dyICAgCTEscjcKKwltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGMJCTsgTWFrZSBzdXJlIGNhcnJ5IGlzIG9mZgorCXN1YmMJCXI3LHI4CisJdGVzdF9jYwkJMCAwIDEgMAorCXRlc3RfaF9nciAgCTB4N2ZmZmZmZmYscjgKKworCXNldF9jYyAgICAgICAgICAweDBhCQk7IE1ha2Ugc3VyZSBjYXJyeSBpcyBvZmYKKwlzdWJjCQlyOCxyOAorCXRlc3RfY2MJCTAgMSAwIDAKKwl0ZXN0X2hfZ3IgIAkwLHI4CisKKwlzZXRfY2MgICAgICAgICAgMHgwNgkJOyBNYWtlIHN1cmUgY2FycnkgaXMgb2ZmCisJc3ViYwkJcjcscjgKKwl0ZXN0X2NjCQkxIDAgMCAxCisJdGVzdF9oX2dyICAJMHhmZmZmZmZmZixyOAorCisJbXZpX2hfZ3IgICAJMSxyNworCW12aV9oX2dyICAgCTMscjgKKwlzZXRfY2MgICAgICAgICAgMHgwZgkJOyBNYWtlIHN1cmUgY2FycnkgaXMgb24KKwlzdWJjICAgICAgCXI3LHI4CisJdGVzdF9jYwkJMCAwIDAgMAorCXRlc3RfaF9nciAgCTEscjgKKworCW12aV9oX2dyICAgCTAscjcKKwltdmlfaF9nciAgIAkweDgwMDAwMDAwLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGQJCTsgTWFrZSBzdXJlIGNhcnJ5IGlzIG9uCisJc3ViYwkJcjcscjgKKwl0ZXN0X2NjCQkwIDAgMSAwCisJdGVzdF9oX2dyICAJMHg3ZmZmZmZmZixyOAorCisJbXZpX2hfZ3IgIAkweDdmZmZmZmZlLHI3CisJc2V0X2NjICAgICAgICAgIDB4MGIJCTsgTWFrZSBzdXJlIGNhcnJ5IGlzIG9uCisJc3ViYwkJcjcscjgKKwl0ZXN0X2NjCQkwIDEgMCAwCisJdGVzdF9oX2dyICAJMCxyOAorCisJbXZpX2hfZ3IgICAJMCxyNworCXNldF9jYyAgICAgICAgICAweDA3CQk7IE1ha2Ugc3VyZSBjYXJyeSBpcyBvbgorCXN1YmMJCXI3LHI4CisJdGVzdF9jYwkJMSAwIDAgMQorCXRlc3RfaF9nciAgCTB4ZmZmZmZmZmYscjgKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvc3Vibi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N1Ym4uY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ODMwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3N1Ym4uY2dzCkBAIC0wLDAgKzEsMzYgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3Igc3VibiAkUmosJFJpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIHN1Ym4KK3N1Ym46CisJOyBUZXN0IHN1Ym4gJFJqLCRSaQorCW12aV9oX2dyICAgCTEscjcKKwltdmlfaF9nciAgIAkyLHI4CisJc2V0X2NjICAgICAgICAgIDB4MGYJCTsgU2V0IG1hc2sgb3Bwb3NpdGUgb2YgdXN1YWwgcmVzdWx0CisJc3VibiAgICAgIAlyNyxyOAorCXRlc3RfY2MJCTEgMSAxIDEKKwl0ZXN0X2hfZ3IgIAkxLHI4CisKKwltdmlfaF9nciAgIAkxLHI3CisJbXZpX2hfZ3IgICAJMHg4MDAwMDAwMCxyOAorCXNldF9jYyAgICAgICAgICAweDBkCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIHVzdWFsIHJlc3VsdAorCXN1Ym4JCXI3LHI4CisJdGVzdF9jYwkJMSAxIDAgMQorCXRlc3RfaF9nciAgCTB4N2ZmZmZmZmYscjgKKworCXNldF9jYyAgICAgICAgICAweDBiCQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIHVzdWFsIHJlc3VsdAorCXN1Ym4JCXI4LHI4CisJdGVzdF9jYwkJMSAwIDEgMQorCXRlc3RfaF9nciAgCTAscjgKKworCXNldF9jYyAgICAgICAgICAweDA2CQk7IFNldCBtYXNrIG9wcG9zaXRlIG9mIHVzdWFsIHJlc3VsdAorCXN1Ym4JCXI3LHI4CisJdGVzdF9jYwkJMCAxIDEgMAorCXRlc3RfaF9nciAgCTB4ZmZmZmZmZmYscjgKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvdGVzdHV0aWxzLmluYyBiL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAvdGVzdHV0aWxzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTIzZDZmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vZnIzMC90ZXN0dXRpbHMuaW5jCkBAIC0wLDAgKzEsMzA2IEBACisjIHIwLCByNC1yNiBhcmUgdXNlZCBhcyB0bXBzLCBjb25zaWRlciB0aGVtIGNhbGwgY2xvYmJlcmVkIGJ5IHRoZXNlIG1hY3Jvcy4KKworCS5tYWNybyBzdGFydAorCS5kYXRhCitmYWlsbXNnOgorCS5hc2NpaSAiZmFpbFxuIgorcGFzc21zZzoKKwkuYXNjaWkgInBhc3NcbiIKKwkudGV4dAorCS5nbG9iYWwgX3N0YXJ0Citfc3RhcnQ6CisJbGRpMzIgMHg3ZmZmYyxzcAk7IFRPRE8gLS0gd2hhdCdzIGEgZ29vZCB2YWx1ZSBmb3IgdGhpcz8KKwlsZGkzMiAweGZmYzAwLHIwCisJbW92ICAgcjAsdGJyCQk7IGRlZmluZWQgaW4gbWFudWFsCisJbW92ICAgc3AsdXNwCisJbW92ICAgc3Asc3NwCisJLmVuZG0KKworOyBFeGl0IHdpdGggcmV0dXJuIGNvZGUKKwkubWFjcm8gZXhpdCByYworCWxkaTMyIFxyYyxyNAorCWxkaTMyICMxLHIwCisJaW50ICAgIzEwCisJLmVuZG0KKworOyBQYXNzIHRoZSB0ZXN0IGNhc2UKKwkubWFjcm8gcGFzcworCWxkaTMyICM1LHI2CisJbGRpMzIgI3Bhc3Ntc2cscjUKKwlsZGkzMiAjMSxyNAorCWxkaTMyICM1LHIwCisJaW50ICAgIzEwCisJZXhpdCAgIzAKKwkuZW5kbQorCis7IEZhaWwgdGhlIHRlc3RjYXNlCisJLm1hY3JvIGZhaWwKKwlsZGkzMiAjNSxyNgorCWxkaTMyICNmYWlsbXNnLHI1CisJbGRpMzIgIzEscjQKKwlsZGkzMiAjNSxyMAorCWludCAgICMxMAorCWV4aXQgICMxCisJLmVuZG0KKworOyBMb2FkIGFuIGltbWVkaWF0ZSB2YWx1ZSBpbnRvIGEgZ2VuZXJhbCByZWdpc3RlcgorOyBUT0RPOiB1c2UgbWluaW1hbCBzaXplZCBpbnNuCisJLm1hY3JvIG12aV9oX2dyIHZhbCByZWcKKwlsZGkzMiBcdmFsLFxyZWcKKwkuZW5kbQorCis7IExvYWQgYW4gaW1tZWRpYXRlIHZhbHVlIGludG8gYSBkZWRpY2F0ZWQgcmVnaXN0ZXIKKwkubWFjcm8gbXZpX2hfZHIgdmFsIHJlZworCWxkaTMyIFx2YWwscjAKKwltb3YgcjAsXHJlZworCS5lbmRtCisKKzsgTG9hZCBhIGdlbmVyYWwgcmVnaXN0ZXIgaW50byBhbm90aGVyIGdlbmVyYWwgcmVnaXN0ZXIKKwkubWFjcm8gbXZyX2hfZ3Igc3JjIHRhcmcKKwltb3YgXHNyYyxcdGFyZworCS5lbmRtCisKKzsgU3RvcmUgYW4gaW1tZWRpYXRlIGludG8gYSB3b3JkIGluIG1lbW9yeQorCS5tYWNybyBtdmlfaF9tZW0gdmFsIGFkZHIKKwltdmlfaF9nciAgXHZhbCByNAorCW12cl9oX21lbSByNCxcYWRkcgorCS5lbmRtCisKKzsgU3RvcmUgYSByZWdpc3RlciBpbnRvIGEgd29yZCBpbiBtZW1vcnkKKwkubWFjcm8gbXZyX2hfbWVtIHJlZyBhZGRyCisJc3QgXHJlZyxAXGFkZHIKKwkuZW5kbQorCis7IFN0b3JlIHRoZSBjdXJyZW50IHBzIG9uIHRoZSBzdGFjaworCS5tYWNybyBzYXZlX3BzCisJc3QgcHMsQC1yMTUKKwkuZW5kbQorCis7IExvYWQgYSB3b3JkIHZhbHVlIGZyb20gbWVtb3J5CisJLm1hY3JvIGxkbWVtX2hfZ3IgYWRkciByZWcKKwlsZCBAXGFkZHIsXHJlZworCS5lbmRtCisKKzsgQWRkIDIgZ2VuZXJhbCByZWdpc3RlcnMKKwkubWFjcm8gYWRkX2hfZ3IgcmVnMSByZWcyCisJYWRkIFxyZWcxLFxyZWcyCisJLmVuZG0KKworOyBJbmNyZW1lbnQgYSByZWdpc3RlciBieSBhbmQgaW1tZWRpYXRlCisJLm1hY3JvIGluY2lfaF9nciBpbmMgcmVnCisJbXZpX2hfZ3IgXGluYyxyNAorCWFkZCByNCxccmVnCisJLmVuZG0KKworOyBUZXN0IHRoZSB2YWx1ZSBvZiBhbiBpbW1lZGlhdGUgYWdhaW5zdCBhIGdlbmVyYWwgcmVnaXN0ZXIKKwkubWFjcm8gdGVzdF9oX2dyIHZhbCByZWcKKwkuaWYgKFx2YWwgPj0gMCkgJiYgKFx2YWwgPD0gMTUpCisJY21wIFx2YWwsXHJlZworCS5lbHNlCisJLmlmIChcdmFsIDwgMCkgJiYgKFx2YWwgPj0gLTE2KQorCWNtcDIgXHZhbCxccmVnCisJLmVsc2UKKwlsZGkzMiBcdmFsLHI0CisJY21wIHI0LFxyZWcKKwkuZW5kaWYKKwkuZW5kaWYKKwliZXEgdGVzdF9nclxACisJZmFpbAordGVzdF9nclxAOgorCS5lbmRtCisKKzsgY29tcGFyZSB0d28gZ2VuZXJhbCByZWdpc3RlcnMKKwkubWFjcm8gdGVzdHJfaF9nciByZWcxIHJlZzIKKwljbXAgXHJlZzEsXHJlZzIKKwliZXEgdGVzdHJfZ3JcQAorCWZhaWwKK3Rlc3RyX2dyXEA6CisJLmVuZG0KKworOyBUZXN0IHRoZSB2YWx1ZSBvZiBhbiBpbW1lZGlhdGUgYWdhaW5zdCBhIGRlZGljYXRlZCByZWdpc3RlcgorCS5tYWNybyB0ZXN0X2hfZHIgdmFsIHJlZworCW1vdiBccmVnLHI1CisJdGVzdF9oX2dyIFx2YWwgcjUKKwkuZW5kbQorCis7IFRlc3QgdGhlIHZhbHVlIG9mIGFuIGdlbmVyYWwgcmVnaXN0ZXIgYWdhaW5zdCBhIGRlZGljYXRlZCByZWdpc3RlcgorCS5tYWNybyB0ZXN0cl9oX2RyIGdyIGRyCisJbW92IFxkcixyNQorCXRlc3RyX2hfZ3IgXGdyIHI1CisJLmVuZG0KKworOyBDb21wYXJlIGFuIGltbWVkaWF0ZSB3aXRoIHdvcmQgaW4gbWVtb3J5CisJLm1hY3JvIHRlc3RfaF9tZW0gdmFsIGFkZHIKKwlsZG1lbV9oX2dyIFxhZGRyIHI1CisJdGVzdF9oX2dyIFx2YWwgcjUKKwkuZW5kbQorCis7IENvbXBhcmUgYSBnZW5lcmFsIHJlZ2lzdGVyIHdpdGggd29yZCBpbiBtZW1vcnkKKwkubWFjcm8gdGVzdHJfaF9tZW0gcmVnIGFkZHIKKwlsZG1lbV9oX2dyIFxhZGRyIHI1CisJdGVzdHJfaF9nciBccmVnIHI1CisJLmVuZG0KKworOyBTZXQgdGhlIGNvbmRpdGlvbiBjb2RlcworCS5tYWNybyBzZXRfY2MgbWFzaworCWFuZGNjcgkweGYwCisJb3JjY3IJXG1hc2sKKwkuZW5kbQorCis7IFNldCB0aGUgc3RhY2sgbW9kZQorCS5tYWNybyBzZXRfc191c2VyCisJb3JjY3IJMHgyMAorCS5lbmRtCisKKwkubWFjcm8gc2V0X3Nfc3lzdGVtCisJYW5kY2NyCTB4MWYKKwkuZW5kbQorCis7IFRlc3QgdGhlIHN0YWNrIG1vZGUKKwkubWFjcm8gdGVzdF9zX3VzZXIKKwltdnJfaF9nciBwcyxyMAorCW12aV9oX2dyIDB4MjAscjQKKwlhbmQgICAgICByNCxyMAorCXRlc3RfaF9nciAweDIwLHIwCisJLmVuZG0KKworCS5tYWNybyB0ZXN0X3Nfc3lzdGVtCisJbXZyX2hfZ3IgcHMscjAKKwltdmlfaF9nciAweDIwLHI0CisJYW5kICAgICAgcjQscjAKKwl0ZXN0X2hfZ3IgMHgwLHIwCisJLmVuZG0KKworOyBTZXQgdGhlIGludGVycnVwdCBiaXQKKwkubWFjcm8gc2V0X2kgdmFsCisJLmlmIChcdmFsID09IDEpCisJb3JjY3IJMHgxMAorCS5lbHNlCisJYW5kY2NyCTB4MmYKKwkuZW5kaWYKKwkuZW5kbQorCis7IFRlc3QgdGhlIHN0YWNrIG1vZGUKKwkubWFjcm8gdGVzdF9pIHZhbAorCW12cl9oX2dyICBwcyxyMAorCW12aV9oX2dyICAweDEwLHI0CisJYW5kICAgICAgIHI0LHIwCisJLmlmIChcdmFsID09IDEpCisJdGVzdF9oX2dyIDB4MTAscjAKKwkuZWxzZQorCXRlc3RfaF9nciAweDAscjAKKwkuZW5kaWYKKwkuZW5kbQorCis7IFNldCB0aGUgaWxtCisJLm1hY3JvIHNldF9pbG0gdmFsCisJc3RpbG0gXHZhbAorCS5lbmRtCisKKzsgVGVzdCB0aGUgaWxtCisJLm1hY3JvIHRlc3RfaWxtIHZhbAorCW12cl9oX2dyICAgcHMscjAKKwltdmlfaF9nciAgIDB4MWYwMDAwLHI0CisJYW5kICAgICAgICByNCxyMAorCW12aV9oX2dyICAgXHZhbCxyNQorCW12aV9oX2dyICAgMHgxZixyNAorCWFuZAkgICByNCxyNQorCWxzbCAgICAgICAgMTUscjUKKwlsc2wgICAgICAgIDEscjUKKwl0ZXN0cl9oX2dyIHIwLHI1CisJLmVuZG0KKworOyBUZXN0IHRoZSBjb25kaXRpb24gY29kZXMKKwkubWFjcm8gdGVzdF9jYyBOIFogViBDCisJLmlmIChcTiA9PSAxKQorCWJwIGZhaWxcQAorCS5lbHNlCisJYm4gZmFpbFxACisJLmVuZGlmCisJLmlmIChcWiA9PSAxKQorCWJuZSBmYWlsXEAKKwkuZWxzZQorCWJlcSBmYWlsXEAKKwkuZW5kaWYKKwkuaWYgKFxWID09IDEpCisJYm52IGZhaWxcQAorCS5lbHNlCisJYnYgZmFpbFxACisJLmVuZGlmCisJLmlmIChcQyA9PSAxKQorCWJuYyBmYWlsXEAKKwkuZWxzZQorCWJjIGZhaWxcQAorCS5lbmRpZgorCWJyYSB0ZXN0X2NjXEAKK2ZhaWxcQDoKKwlmYWlsCit0ZXN0X2NjXEA6CisJLmVuZG0KKworOyBTZXQgdGhlIGRpdmlzaW9uIGJpdHMKKwkubWFjcm8gc2V0X2RiaXRzIHZhbAorCW12cl9oX2dyIHBzLHI1CisJbXZpX2hfZ3IgMHhmZmZmZjhmZixyNAorCWFuZCByNCxyNQorCW12aV9oX2dyIFx2YWwscjAKKwltdmlfaF9nciAzLHI0CisJYW5kIHI0LHIwCisJbHNsIDkscjAKKwlvciByMCxyNQorCW12cl9oX2dyIHI1LHBzCisJLmVuZG0KKworOyBUZXN0IHRoZSBkaXZpc2lvbiBiaXRzCisJLm1hY3JvIHRlc3RfZGJpdHMgdmFsCisJbXZyX2hfZ3IgcHMscjAKKwlsc3IgOSxyMAorCW12aV9oX2dyIDMscjQKKwlhbmQgcjQscjAKKwl0ZXN0X2hfZ3IgXHZhbCxyMAorCS5lbmRtCisKKzsgU2F2ZSB0aGUgcmV0dXJuIHBvaW50ZXIKKwkubWFjcm8gc2F2ZV9ycAorCXN0IHJwLEAtUjE1CisJLkVORE0KKworOyByZXN0b3JlIHRoZSByZXR1cm4gcG9pbnRlcgorCS5tYWNybyByZXN0b3JlX3JwCisJbGQgQFIxNSsscnAKKwkuZW5kbQorCis7IEVuc3VyZSBicmFuY2ggdGFrZW4KKwkubWFjcm8gdGFrZV9icmFuY2ggb3Bjb2RlCisJXG9wY29kZSB0YWtlX2JyXEAKKwlmYWlsCit0YWtlX2JyXEA6CisJLmVuZG0KKworCS5tYWNybyB0YWtlX2JyYW5jaF9kIG9wY29kZSB2YWwKKwlcb3Bjb2RlIHRha2VfYnJkXEAKKwlsZGk6OCBcdmFsLHIwCisJZmFpbAordGFrZV9icmRcQDoKKwl0ZXN0X2hfZ3IgXHZhbCxyMAorCS5lbmRtCisKKzsgRW5zdXJlIGJyYW5jaCBub3QgdGFrZW4KKwkubWFjcm8gbm9fYnJhbmNoIG9wY29kZQorCVxvcGNvZGUgbm9fYnJmXEAKKwlicmEJbm9fYnJzXEAKK25vX2JyZlxAOgorCWZhaWwKK25vX2Jyc1xAOgorCS5lbmRtCisKKwkubWFjcm8gbm9fYnJhbmNoX2Qgb3Bjb2RlIHZhbAorCVxvcGNvZGUgbm9fYnJkZlxACisJbGRpOjggICBcdmFsLHIwCisJYnJhCW5vX2JyZHNcQAorbm9fYnJkZlxAOgorCWZhaWwKK25vX2JyZHNcQDoKKwl0ZXN0X2hfZ3IgXHZhbCxyMAorCS5lbmRtCisKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL2ZyMzAveGNoYi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3hjaGIuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NTBhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9mcjMwL3hjaGIuY2dzCkBAIC0wLDAgKzEsMjAgQEAKKyMgZnIzMCB0ZXN0Y2FzZSBmb3IgeGNoYiBAJFJqLFJpCisjIG1hY2goKTogZnIzMAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlTVEFSVAorCisJLnRleHQKKwkuZ2xvYmFsIHhjaGIKK3hjaGI6CisJOyBUZXN0IHhjaGIgQCRSaixSaQorCW12aV9oX21lbQkweGRlYWRiZWVmLHNwCisJbXZpX2hfZ3IJMHhiZWVmZGVhZCxyMAorCXNldF9jYwkweDBmCQkJOyBDb25kaXRpb24gY29kZXMgYXJlIGlycmVsZXZlbnQKKwl4Y2hiCQlAc3AscjAKKwl0ZXN0X2NjCTEgMSAxIDEKKwl0ZXN0X2hfZ3IJMHhkZSxyMAorCXRlc3RfaF9tZW0JMHhhZGFkYmVlZixzcAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9hZGQuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9hZGQuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZDJiM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2FkZC5jZ3MKQEAgLTAsMCArMSwxNiBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBhZGQgJGRyLCRzcgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgYWRkCithZGQ6CisKKwltdmlfaF9nciByNCwgMQorCW12aV9oX2dyIHI1LCAyCisJYWRkIHI0LCByNQorCXRlc3RfaF9nciByNCwgMworCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9hZGQzLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYWRkMy5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjYzg0OAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYWRkMy5jZ3MKQEAgLTAsMCArMSwxNSBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBhZGQzICRkciwkc3IsIyRzbG8xNgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgYWRkMworYWRkMzoKKworCW12aV9oX2dyIHI1LCAxCisJYWRkMyByNCwgcjUsIDIKKwl0ZXN0X2hfZ3IgcjQsIDMKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYWRkaS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2FkZGkuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NDhkMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2FkZGkuY2dzCkBAIC0wLDAgKzEsMTYgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgYWRkaSAkZHIsIyRzaW1tOAorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgYWRkaQorYWRkaToKKworCW12aV9oX2dyIHI1LCAxCisJYWRkaSByNSwgMgorCXRlc3RfaF9nciByNSwgMworCisJcGFzcworCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2FkZHYuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9hZGR2LmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDRiZTgzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9hZGR2LmNncwpAQCAtMCwwICsxLDIxIEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIGFkZHYgJGRyLCRzcgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgYWRkdgorYWRkdjoKKwltdmlfaF9jb25kYml0IDAKKwltdmlfaF9nciByNCwgMHg4MDAwMDAwMAorCW12aV9oX2dyIHI1LCAweDgwMDAwMDAwCisKKwlhZGR2IHI0LCByNQorCisJYm5jIG5vdF9vaworCXRlc3RfaF9nciByNCwgMAorCQorCXBhc3MKK25vdF9vazoKKwlmYWlsCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2FkZHYzLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYWRkdjMuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YzBhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2FkZHYzLmNncwpAQCAtMCwwICsxLDI4IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIGFkZHYzICRkciwkc3IsIyRzaW1tMTYKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIGFkZHYzCithZGR2MzoKKwltdmlfaF9jb25kYml0IDAKKwltdmlfaF9nciByNCwgMQorCW12aV9oX2dyIHI1LCAxCisKKwlhZGR2MyByNCwgcjUsICMyCisKKwliYyBub3Rfb2sKKworCXRlc3RfaF9nciByNCwgMworCisJbXZpX2hfZ3IgcjUsIDB4N2ZmZjgwMDEKKworCWFkZHYzIHI0LCByNSwgIzB4N2ZmZgorCisJYm5jIG5vdF9vaworCisJcGFzcworbm90X29rOgorCWZhaWwKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYWRkeC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2FkZHguY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMGUzZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2FkZHguY2dzCkBAIC0wLDAgKzEsNDIgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgYWRkeCAkZHIsJHNyCisjIG1hY2goKTogbTMyciBtMzJyeAorIyB0aW1lb3V0KCk6IDQyCisKKyMgdGltZW91dCBpcyBzZXQgdG8gdGVzdCBpdAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBhZGR4CithZGR4OgorCW12aV9oX2NvbmRiaXQgMQorCW12aV9oX2dyIHI0LCAxCisJbXZpX2hfZ3IgcjUsIDIKKwlhZGR4IHI0LCByNQorCWJjIG5vdF9vaworCXRlc3RfaF9nciByNCwgNAorCisJbXZpX2hfZ3IgcjQsIDB4ZmZmZmZmZmUKKwlhZGR4IHI0LCByNQorCWJuYyBub3Rfb2sKKwl0ZXN0X2hfZ3IgcjQsIDAKKworCW12aV9oX2dyIHI0LCAtMQorCW12aV9oX2dyIHI1LCAtMQorCW12aV9oX2NvbmRiaXQgMQorCWFkZHggcjQscjUKKwlibmMgbm90X29rCisJdGVzdF9oX2dyIHI0LCAtMQorCisJbXZpX2hfZ3IgcjQsLTEKKwltdmlfaF9nciByNSwweDdmZmZmZmZmCisJbXZpX2hfY29uZGJpdCAxCisJYWRkeCByNSxyNAorCWJuYyBub3Rfb2sKKwl0ZXN0X2hfZ3IgcjUsMHg3ZmZmZmZmZgorCisJcGFzcworCitub3Rfb2s6CisJZmFpbApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9hbGxpbnNuLmV4cCBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYWxsaW5zbi5leHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVlZDgwZgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYWxsaW5zbi5leHAKQEAgLTAsMCArMSwyMSBAQAorIyBNMzJSIHNpbXVsYXRvciB0ZXN0c3VpdGUuCisKK2lmIFtpc3RhcmdldCBtMzJyKi0qLSpdIHsKKyAgICAjIGxvYWQgc3VwcG9ydCBwcm9jcworICAgICMgbG9hZF9saWIgY2dlbi5leHAKKworICAgICMgYWxsIG1hY2hpbmVzCisgICAgc2V0IGFsbF9tYWNocyAibTMyciIKKworCisgICAgIyBUaGUgLmNncyBzdWZmaXggaXMgZm9yICJjZ2VuIC5zIi4KKyAgICBmb3JlYWNoIHNyYyBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3ViZGlyLyouY2dzXV0geworCSMgSWYgd2UncmUgb25seSB0ZXN0aW5nIHNwZWNpZmljIGZpbGVzIGFuZCB0aGlzIGlzbid0IG9uZSBvZiB0aGVtLAorCSMgc2tpcCBpdC4KKwlpZiAhW3J1bnRlc3RfZmlsZV9wICRydW50ZXN0cyAkc3JjXSB7CisJICAgIGNvbnRpbnVlCisJfQorCisJcnVuX3NpbV90ZXN0ICRzcmMgJGFsbF9tYWNocworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYW5kLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYW5kLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzI2ODg1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9hbmQuY2dzCkBAIC0wLDAgKzEsMTcgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgYW5kICRkciwkc3IKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIGFuZAorYW5kOgorCW12aV9oX2dyIHI0LCAzCisJbXZpX2hfZ3IgcjUsIDYKKworCWFuZCByNCwgcjUKKworCXRlc3RfaF9nciByNCwgMgorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9hbmQzLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYW5kMy5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1ZGUzMAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYW5kMy5jZ3MKQEAgLTAsMCArMSwxNyBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBhbmQzICRkciwkc3IsIyR1aW1tMTYKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIGFuZDMKK2FuZDM6CisJbXZpX2hfZ3IgcjQsIDAKKwltdmlfaF9nciByNSwgNgorCisJYW5kMyByNCwgcjUsICMzCisKKwl0ZXN0X2hfZ3IgcjQsIDIKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmMyNC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JjMjQuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYjQzMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JjMjQuY2dzCkBAIC0wLDAgKzEsMjQgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgYmMgJGRpc3AyNAorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgYmMyNAorYmMyNDoKKworCW12aV9oX2NvbmRiaXQgMAorCWJjLmwgdGVzdDBmYWlsCisJYnJhIHRlc3QwcGFzcwordGVzdDBmYWlsOgorCWZhaWwKK3Rlc3QwcGFzczoKKworCW12aV9oX2NvbmRiaXQgMQorCWJjLmwgdGVzdDFwYXNzCisJZmFpbAordGVzdDFwYXNzOgorCisJcGFzcworCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JjOC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JjOC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ViNjIyYwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmM4LmNncwpAQCAtMCwwICsxLDIzIEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIGJjICRkaXNwOAorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgYmM4CitiYzg6CisKKwltdmlfaF9jb25kYml0IDAKKwliYy5zIHRlc3QwZmFpbAorCWJyYSB0ZXN0MHBhc3MKK3Rlc3QwZmFpbDoKKwlmYWlsCit0ZXN0MHBhc3M6CisKKwltdmlfaF9jb25kYml0IDEKKwliYy5zIHRlc3QxcGFzcworCWZhaWwKK3Rlc3QxcGFzczoKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmVxLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmVxLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGQ2ZDhiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9iZXEuY2dzCkBAIC0wLDAgKzEsMjAgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgYmVxICRzcmMxLCRzcmMyLCRkaXNwMTYKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIGJlcQorYmVxOgorCW12aV9oX2NvbmRiaXQgMAorCW12aV9oX2dyIHI0LCAxMgorCW12aV9oX2dyIHI1LCAxMgorCWJlcSByNCwgcjUsIG9rCitub3Rfb2s6CisJZmFpbAorb2s6CisJbXZpX2hfZ3IgcjUsIDExCisJYmVxIHI0LCByNSwgbm90X29rCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JlcXouY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9iZXF6LmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTQ3MzdkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9iZXF6LmNncwpAQCAtMCwwICsxLDE4IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIGJlcXogJHNyYzIsJGRpc3AxNgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgYmVxegorYmVxejoKKwltdmlfaF9nciByNCwgMAorCWJlcXogcjQsIG9rCitub3Rfb2s6CisJZmFpbAorb2s6CisJbXZpX2hfZ3IgcjQsIDEKKwliZXF6IHI0LCBub3Rfb2sKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmdlei5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JnZXouY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MDMxZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JnZXouY2dzCkBAIC0wLDAgKzEsMTggQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgYmdleiAkc3JjMiwkZGlzcDE2CisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBiZ2V6CitiZ2V6OgorCW12aV9oX2dyIHI0LCAxCisJYmdleiByNCwgb2sKK25vdF9vazoKKwlmYWlsCitvazoKKwltdmlfaF9nciByNCwgLTEKKwliZ2V6IHI0LCBub3Rfb2sKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmd0ei5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JndHouY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYjg5ODkKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JndHouY2dzCkBAIC0wLDAgKzEsMTggQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgYmd0eiAkc3JjMiwkZGlzcDE2CisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBiZ3R6CitiZ3R6OgorCW12aV9oX2dyIHI0LCAxCisJYmd0eiByNCwgb2sKK25vdF9vazoKKwlmYWlsCitvazoKKwltdmlfaF9nciByNCwgMAorCWJndHogcjQsIG5vdF9vaworCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ibDI0LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmwyNC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2ZjBkZAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmwyNC5jZ3MKQEAgLTAsMCArMSwxOCBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBibCAkZGlzcDI0CisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBibDI0CitibDI0OgorCWJsLmwgdGVzdDBwYXNzCit0ZXN0MWZhaWw6CisJZmFpbAorCit0ZXN0MHBhc3M6CisJbXZhZGRyX2hfZ3IgcjQsIHRlc3QxZmFpbAorCWJuZSAgcjQsIHIxNCwgdGVzdDFmYWlsCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JsOC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JsOC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2MzY5OAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmw4LmNncwpAQCAtMCwwICsxLDE4IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIGJsICRkaXNwOAorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgYmw4CitibDg6CisJYmwucyB0ZXN0MHBhc3MKK3Rlc3QxZmFpbDoKKwlmYWlsCisKK3Rlc3QwcGFzczoKKwltdmFkZHJfaF9nciByNCwgdGVzdDFmYWlsCisJYm5lICByNCwgcjE0LCB0ZXN0MWZhaWwKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmxlei5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JsZXouY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZDE5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JsZXouY2dzCkBAIC0wLDAgKzEsMTkgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgYmxleiAkc3JjMiwkZGlzcDE2CisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBibGV6CitibGV6OgorCW12aV9oX2dyIHI0LCAwCisJYmxleiByNCwgdGVzdDBwYXNzCit0ZXN0MWZhaWw6CisJZmFpbAorCit0ZXN0MHBhc3M6CisJbXZpX2hfZ3IgcjQsIDEKKwlibGV6IHI0LCB0ZXN0MWZhaWwKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYmx0ei5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JsdHouY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5Mzc3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JsdHouY2dzCkBAIC0wLDAgKzEsMTkgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgYmx0eiAkc3JjMiwkZGlzcDE2CisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBibHR6CitibHR6OgorCW12aV9oX2dyIHI0LCAtMQorCWJsdHogcjQsIHRlc3QwcGFzcwordGVzdDFmYWlsOgorCWZhaWwKKwordGVzdDBwYXNzOgorCW12aV9oX2dyIHI0LCAwCisJYmx0eiByNCwgdGVzdDFmYWlsCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JuYzI0LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYm5jMjQuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MmQyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JuYzI0LmNncwpAQCAtMCwwICsxLDIwIEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIGJuYyAkZGlzcDI0CisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBibmMyNAorYm5jMjQ6CisJbXZpX2hfY29uZGJpdCAwCisJYm5jLmwgdGVzdDBwYXNzCisKK3Rlc3QxZmFpbDoKKwlmYWlsCit0ZXN0MHBhc3M6CisKKwltdmlfaF9jb25kYml0IDEKKwlibmMubCB0ZXN0MWZhaWwKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYm5jOC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JuYzguY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZTI2MTMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JuYzguY2dzCkBAIC0wLDAgKzEsMjAgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgYm5jICRkaXNwOAorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgYm5jOAorYm5jODoKKwltdmlfaF9jb25kYml0IDAKKwlibmMucyB0ZXN0MHBhc3MKKwordGVzdDFmYWlsOgorCWZhaWwKKwordGVzdDBwYXNzOgorCW12aV9oX2NvbmRiaXQgMQorCWJuYy5zIHRlc3QxZmFpbAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ibmUuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ibmUuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMWQ3YTYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JuZS5jZ3MKQEAgLTAsMCArMSwyMCBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBibmUgJHNyYzEsJHNyYzIsJGRpc3AxNgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgYm5lCitibmU6CisJbXZpX2hfZ3IgcjQsIDEKKwltdmlfaF9nciByNSwgMgorCWJuZSByNCwgcjUsIHRlc3QwcGFzcwordGVzdDFmYWlsOgorCWZhaWwKKwordGVzdDBwYXNzOgorCW12aV9oX2dyIHI0LCAyCisJYm5lIHI0LCByNSwgdGVzdDFmYWlsCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JuZXouY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ibmV6LmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjEwMjg5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ibmV6LmNncwpAQCAtMCwwICsxLDE5IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIGJuZXogJHNyYzIsJGRpc3AxNgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgYm5legorYm5lejoKKwltdmlfaF9nciByNCwgMQorCWJuZXogcjQsIHRlc3QwcGFzcwordGVzdDFmYWlsOgorCWZhaWwKKwordGVzdDBwYXNzOgorCW12aV9oX2dyIHI0LCAwCisJYm5leiByNCwgdGVzdDFmYWlsCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JyYTI0LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYnJhMjQuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MmQyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2JyYTI0LmNncwpAQCAtMCwwICsxLDE1IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIGJyYSAkZGlzcDI0CisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBicmEyNAorYnJhMjQ6CisJYnJhLmwgb2sKKworCWZhaWwKKworb2s6CisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9icmE4LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYnJhOC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmNTBhZAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvYnJhOC5jZ3MKQEAgLTAsMCArMSwxNCBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBicmEgJGRpc3A4CisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBicmE4CiticmE4OgorCWJyYS5zIG9rCisKKwlmYWlsCitvazoKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2NtcC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2NtcC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhNjcyMAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvY21wLmNncwpAQCAtMCwwICsxLDIzIEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIGNtcCAkc3JjMSwkc3JjMgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgY21wCitjbXA6CisJbXZpX2hfY29uZGJpdCAwCisJbXZpX2hfZ3IgcjQsIDEKKwltdmlfaF9nciByNSwgMgorCWNtcCByNCwgcjUKKwliYyBvaworbm90X29rOgorCWZhaWwKK29rOgorCW12aV9oX2NvbmRiaXQgMQorCW12aV9oX2dyIHI0LCAyCisJY21wIHI0LCByNQorCWJjIG5vdF9vaworCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9jbXBpLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvY21waS5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxMTI4MwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvY21waS5jZ3MKQEAgLTAsMCArMSwyNCBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBjbXBpICRzcmMyLCMkc2ltbTE2CisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBjbXBpCitjbXBpOgorCW12aV9oX2NvbmRiaXQgMAorCW12aV9oX2dyIHI0LCAxCisKKwljbXBpIHI0LCAjMgorCWJjIG9rCitub3Rfb2s6CisJZmFpbAorb2s6CisJbXZpX2hfY29uZGJpdCAxCisJbXZpX2hfZ3IgcjQsIDIKKwljbXBpIHI0LCAjMgorCWJjIG5vdF9vaworCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2NtcHUuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9jbXB1LmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGI0ZWYxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9jbXB1LmNncwpAQCAtMCwwICsxLDIzIEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIGNtcHUgJHNyYzEsJHNyYzIKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIGNtcHUKK2NtcHU6CisJbXZpX2hfY29uZGJpdCAwCisJbXZpX2hfZ3IgcjQsIDEKKwltdmlfaF9nciByNSwgLTIKKwljbXB1IHI0LCByNQorCWJjIG9rCitub3Rfb2s6CisJZmFpbAorb2s6CisJbXZpX2hfY29uZGJpdCAxCisJbXZpX2hfZ3IgcjQsIC0xCisJY21wdSByNCwgcjUKKwliYyBub3Rfb2sKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvY21wdWkuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9jbXB1aS5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzMDIwNwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvY21wdWkuY2dzCkBAIC0wLDAgKzEsMjIgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgY21wdWkgJHNyYzIsIyRzaW1tMTYKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIGNtcHVpCitjbXB1aToKKwltdmlfaF9jb25kYml0IDAKKwltdmlfaF9nciByNCwgMQorCWNtcHVpIHI0LCAjMgorCWJjIG9rCitub3Rfb2s6CisJZmFpbAorb2s6CisJbXZpX2hfY29uZGJpdCAxCisJbXZpX2hfZ3IgcjQsIC0xCisJY21wdWkgcjQsICMyCisJYmMgbm90X29rCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2Rpdi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2Rpdi5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzZjM2MgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvZGl2LmNncwpAQCAtMCwwICsxLDE3IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIGRpdiAkZHIsJHNyCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBkaXYKK2RpdjoKKwltdmlfaF9nciByNCwgMHgxODAwMAorCW12aV9oX2dyIHI1LCA4CisKKwlkaXYgcjQsIHI1CisKKwl0ZXN0X2hfZ3IgcjQsIDB4MzAwMAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9kaXZ1LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvZGl2dS5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzNDJkNQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvZGl2dS5jZ3MKQEAgLTAsMCArMSwxNyBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBkaXZ1ICRkciwkc3IKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIGRpdnUKK2RpdnU6CisJbXZpX2hfZ3IgcjQsIDB4MTgwMDAKKwltdmlfaF9nciByNSwgOAorCisJZGl2dSByNCwgcjUKKworCXRlc3RfaF9nciByNCwgMHgzMDAwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2hlbGxvLm1zIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9oZWxsby5tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWUyMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9oZWxsby5tcwpAQCAtMCwwICsxLDE5IEBACisjIG91dHB1dCgpOiBIZWxsbyB3b3JsZCFcbgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5nbG9ibCBfc3RhcnQKK19zdGFydDoKKworOyB3cml0ZSAoaGVsbG8gd29ybGQpCisJbGRpOCByMywjMTQKKwlsZDI0IHIyLCNoZWxsbworCWxkaTggcjEsIzEKKwlsZGk4IHIwLCM1CisJdHJhcCAjMAorOyBleGl0ICgwKQorCWxkaTggcjEsIzAKKwlsZGk4IHIwLCMxCisJdHJhcCAjMAorCitsZW5ndGg6CS5sb25nIDE0CitoZWxsbzoJLmFzY2lpICJIZWxsbyB3b3JsZCFcclxuIgpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ody10cmFwLm1zIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ody10cmFwLm1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTIwMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2h3LXRyYXAubXMKQEAgLTAsMCArMSwzMSBAQAorIyBtYWNoKCk6IG0zMnIgbTMycngKKyMgb3V0cHV0KCk6IHBhc3NcbgorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCis7IGNvbnN0cnVjdCBicmEgdHJhcDJfaGFuZGxlciBpbiB0cmFwIDIgc2xvdAorCWxkMjQgcjAsI2JyYV9pbnNuCisJbGQgcjAsQHIwCisJbGQyNCByMSwjdHJhcDJfaGFuZGxlcgorCWFkZGkgcjEsIy0weDQ4IDsgcGMgcmVsYXRpdmUgYWRkcmVzcyBmcm9tIHRyYXAgMiBzbG90IHRvIGhhbmRsZXIKKwlzcmFpIHIxLCMyCisJb3IgcjAscjEKKwlsZDI0IHIyLCMweDQ4IDsgYWRkcmVzcyBvZiB0cmFwIDIgc2xvdAorCXN0IHIwLEByMgorCis7IHBlcmZvcm0gdHJhcAorCWxkaSByNCwjMAorCXRyYXAgIzIKKwl0ZXN0X2hfZ3IgcjQsNDIKKworCXBhc3MKKworOyB0cmFwIDIgaGFuZGxlcgordHJhcDJfaGFuZGxlcjoKKwlsZGkgcjQsIzQyCisJcnRlCisKK2JyYV9pbnNuOgorCWJyYS5sIDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvamwuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9qbC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5YzI2YQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvamwuY2dzCkBAIC0wLDAgKzEsMTggQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgamwgJHNyCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBqbAoramw6CisJbXZhZGRyX2hfZ3IgcjQsIG9rCisJamwgICByNAorbm90X29rOgorCWZhaWwKK29rOgorCW12YWRkcl9oX2dyIHI0LCBub3Rfb2sKKwlibmUgIHI0LCByMTQsIG5vdF9vaworCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9qbXAuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9qbXAuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMDg2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2ptcC5jZ3MKQEAgLTAsMCArMSwxOSBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBqbXAgJHNyCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBqbXAKK2ptcDoKKwltdmFkZHJfaF9nciByNCwgb2sxCisJam1wICByNAorCWZhaWwKK29rMToKKwltdmFkZHJfaF9nciByNCwgb2syCisJYWRkaSByNCwjMQorCWptcCByNAorCWZhaWwKK29rMjoKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkLWQuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZC1kLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTE3NDM2Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZC1kLmNncwpAQCAtMCwwICsxLDIyIEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIGxkICRkcixAKCRzbG8xNiwkc3IpCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBsZF9kCitsZF9kOgorCW12YWRkcl9oX2dyIHI0LCBkYXRhX2xvYworCW12aV9oX2dyICAgIHI1LCAwCisKKwlsZCByNSwgQCgjNCwgcjQpCisKKwl0ZXN0X2hfZ3IgcjUsIDB4MTIzNDU2NzggCisKKwlwYXNzCisKK2RhdGFfbG9jOgorCS53b3JkIDB4MTEyMjMzNDQKKwkud29yZCAweDEyMzQ1Njc4CisKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGQtcGx1cy5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkLXBsdXMuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZWFmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkLXBsdXMuY2dzCkBAIC0wLDAgKzEsMjggQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgbGQgJGRyLEAkc3IrCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBsZF9wbHVzCitsZF9wbHVzOgorCW12YWRkcl9oX2dyIHI0LCBkYXRhX2xvYworCW12aV9oX2dyICAgIHI1LCAwCisKKwlsZCByNSwgQHI0KworCisJdGVzdF9oX2dyIHI1LCAweDEyMzQ1Njc4CisKKwltdmFkZHJfaF9nciByNSwgZGF0YV9sb2MyCisJYm5lIHI0LCByNSwgbm90X29rCisKKwlwYXNzCitub3Rfb2s6CisJZmFpbAorCitkYXRhX2xvYzoKKwkud29yZCAweDEyMzQ1Njc4CitkYXRhX2xvYzI6CisJLndvcmQgMHgxMTIyMzM0NAorCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGQuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMGI4NmYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkLmNncwpAQCAtMCwwICsxLDIxIEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIGxkICRkcixAJHNyCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBsZAorbGQ6CisJbXZhZGRyX2hfZ3IgcjQsIGRhdGFfbG9jCisJbXZpX2hfZ3IgICAgcjUsIDAKKworCWxkIHI1LCBAcjQKKworCXRlc3RfaF9nciByNSwgMHgxMjM0NTY3OAorCisJcGFzcworCitkYXRhX2xvYzoKKwkud29yZCAweDEyMzQ1Njc4CisKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGQyNC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkMjQuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YjE1NTUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkMjQuY2dzCkBAIC0wLDAgKzEsMTQgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgbGQyNCAkZHIsIyR1aW1tMjQKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIGxkMjQKK2xkMjQ6CisJbGQyNCByNCwgIzB4MTIzNDU2CisKKwl0ZXN0X2hfZ3IgcjQsIDB4MTIzNDU2CisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkYi1kLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGRiLWQuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMWNlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkYi1kLmNncwpAQCAtMCwwICsxLDIwIEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIGxkYiAkZHIsQCgkc2xvMTYsJHNyKQorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgbGRiX2QKK2xkYl9kOgorCW12YWRkcl9oX2dyIHI0LCBkYXRhX2xvYworCW12aV9oX2dyICAgIHI1LCAwCisKKwlsZGIgcjUsIEAoIzIsIHI0KQorCisJdGVzdF9oX2dyIHI1LCAweDU2IDsgYmlnIGVuZGlhbiBwcm9jZXNzb3IKKworCXBhc3MKKworZGF0YV9sb2M6CisJLndvcmQgMHgxMjM0NTY3OApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZGIuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZGIuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODk1NDUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkYi5jZ3MKQEAgLTAsMCArMSwyMSBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBsZGIgJGRyLEAkc3IKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIGxkYgorbGRiOgorCW12YWRkcl9oX2dyIHI0LCBkYXRhX2xvYworCW12aV9oX2dyICAgIHI1LCAwCisKKwlsZGIgcjUsIEByNAorCisJdGVzdF9oX2dyIHI1LCAweDEyIDsgYmlnIGVuZGlhbiBwcm9jZXNzb3IKKworCXBhc3MKKworZGF0YV9sb2M6CisJLndvcmQgMHgxMjM0NTY3OAorCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkaC1kLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGRoLWQuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZTAzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkaC1kLmNncwpAQCAtMCwwICsxLDIxIEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIGxkaCAkZHIsQCgkc2xvMTYsJHNyKQorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgbGRoX2QKK2xkaF9kOgorCW12YWRkcl9oX2dyIHI0LCBkYXRhX2xvYworCW12aV9oX2dyICAgIHI1LCAwCisKKwlsZGggcjUsIEAoIzIsIHI0KQorCisJdGVzdF9oX2dyIHI1LCAweDU2NzggOyBiaWcgZW5kaWFuIHByb2Nlc3NvcgorCisJcGFzcworCitkYXRhX2xvYzoKKwkud29yZCAweDEyMzQ1Njc4CisKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGRoLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGRoLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDhkYjk1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZGguY2dzCkBAIC0wLDAgKzEsMjIgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgbGRoICRkcixAJHNyCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBsZGgKK2xkaDoKKwltdmFkZHJfaF9nciByNCwgZGF0YV9sb2MKKwltdmlfaF9nciAgICByNSwgMAorCisJbGRoIHI1LCBAcjQKKworCXRlc3RfaF9nciByNSwgMHgxMjM0IDsgYmlnIGVuZGlhbiBwcm9jZXNzb3IKKworCXBhc3MKKworZGF0YV9sb2M6CisJLndvcmQgMHgxMjM0NTY3OAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZGkxNi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkaTE2LmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzhkZjFjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZGkxNi5jZ3MKQEAgLTAsMCArMSwxNCBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBsZGkgJGRyLCRzbG8xNgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgbGRpMTYKK2xkaTE2OgorCWxkaSByNCwgIzB4MTIzNAorCisJdGVzdF9oX2dyIHI0LCAweDEyMzQKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGRpOC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkaTguY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MWU3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkaTguY2dzCkBAIC0wLDAgKzEsMTQgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgbGRpICRkciwjJHNpbW04CisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBsZGk4CitsZGk4OgorCWxkaSByNCwgIzB4NzgKKworCXRlc3RfaF9nciByNCwgMHg3OAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZHViLWQuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZHViLWQuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NjEwNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkdWItZC5jZ3MKQEAgLTAsMCArMSwyMSBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBsZHViICRkcixAKCRzbG8xNiwkc3IpCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBsZHViX2QKK2xkdWJfZDoKKwltdmFkZHJfaF9nciByNCwgZGF0YV9sb2MKKwltdmlfaF9nciAgICByNSwgMAorCisJbGR1YiByNSwgQCgjMiwgcjQpCisKKwl0ZXN0X2hfZ3IgcjUsIDB4YTAgOyBiaWcgZW5kaWFuIHByb2Nlc3NvcgorCisJcGFzcworCitkYXRhX2xvYzoKKwkud29yZCAweDgwOTBhMGIwCisKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGR1Yi5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkdWIuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OTEzYjUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkdWIuY2dzCkBAIC0wLDAgKzEsMjEgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgbGR1YiAkZHIsQCRzcgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgbGR1YgorbGR1YjoKKwltdmFkZHJfaF9nciByNCwgZGF0YV9sb2MKKwltdmlfaF9nciAgICByNSwgMAorCisJbGR1YiByNSwgQHI0CisKKwl0ZXN0X2hfZ3IgcjUsIDB4ODAgOyBiaWcgZW5kaWFuIHByb2Nlc3NvcgorCisJcGFzcworCitkYXRhX2xvYzoKKwkud29yZCAweDgwMDAwMGYwCisKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGR1aC1kLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbGR1aC1kLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmUyOTRmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZHVoLWQuY2dzCkBAIC0wLDAgKzEsMjAgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgbGR1aCAkZHIsQCgkc2xvMTYsJHNyKQorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgbGR1aF9kCitsZHVoX2Q6CisJbXZhZGRyX2hfZ3IgcjQsIGRhdGFfbG9jCisJbXZpX2hfZ3IgICAgcjUsIDAKKworCWxkdWggcjUsIEAoIzIsIHI0KQorCisJdGVzdF9oX2dyIHI1LCAweGYwMDAgOyBiaWcgZW5kaWFuIHByb2Nlc3NvcgorCisJcGFzcworCitkYXRhX2xvYzoKKwkud29yZCAweDgwMDBmMDAwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xkdWguY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZHVoLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDNiYmVlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sZHVoLmNncwpAQCAtMCwwICsxLDIyIEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIGxkdWggJGRyLEAkc3IKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIGxkdWgKK2xkdWg6CisJbXZhZGRyX2hfZ3IgcjQsIGRhdGFfbG9jCisJbXZpX2hfZ3IgICAgcjUsIDAKKworCWxkdWggcjUsIEByNAorCisJdGVzdF9oX2dyIHI1LCAweDgwMTAgOyBiaWcgZW5kaWFuIHByb2Nlc3NvcgorCisJcGFzcworCitkYXRhX2xvYzoKKwkud29yZCAweDgwMTBmMDIwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL2xvY2suY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sb2NrLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzE1MjVlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9sb2NrLmNncwpAQCAtMCwwICsxLDI1IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIGxvY2sgJGRyLEAkc3IKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIGxvY2sKK2xvY2s6CisJbXZhZGRyX2hfZ3IgcjQsIGRhdGFfbG9jCisJbXZpX2hfZ3IgICAgcjUsIDAKKworCWxvY2sgcjUsIEByNAorCisJdGVzdF9oX2dyIHI1LCAweDEyMzQ1Njc4CisKKwk7IFRoZXJlIGlzIG5vIHdheSB0byB0ZXN0IHRoZSBsb2NrIGJpdAorCisJdW5sb2NrIHI1LCBAcjQgCTsgVW5sb2NrIHRoZSBwcm9jZXNzb3IKKworCXBhc3MKKworZGF0YV9sb2M6CisJLndvcmQgMHgxMjM0NTY3OAorCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL21hY2hpLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbWFjaGkuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMmVmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL21hY2hpLmNncwpAQCAtMCwwICsxLDE3IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIG1hY2hpICRzcmMxLCRzcmMyCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBtYWNoaQorbWFjaGk6CisKKwltdmlfaF9hY2N1bTAgMCwgMQorCW12aV9oX2dyIHI0LCAweDEwMTIzCisJbXZpX2hfZ3IgcjUsIDB4MjA0NTYKKwltYWNoaSByNCwgcjUKKwl0ZXN0X2hfYWNjdW0wIDAsIDB4MjAwMDEKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbWFjbG8uY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tYWNsby5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQwMzUzOQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbWFjbG8uY2dzCkBAIC0wLDAgKzEsMTcgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgbWFjbG8gJHNyYzEsJHNyYzIKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIG1hY2xvCittYWNsbzoKKworCW12aV9oX2FjY3VtMCAwLCAxCisJbXZpX2hfZ3IgcjQsIDB4MTIzMDAwMQorCW12aV9oX2dyIHI1LCAweDQ1NjAwMDIKKwltYWNsbyByNCwgcjUKKwl0ZXN0X2hfYWNjdW0wIDAsIDB4MjAwMDEKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbWFjd2hpLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbWFjd2hpLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU3YTViCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tYWN3aGkuY2dzCkBAIC0wLDAgKzEsMTggQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgbWFjd2hpICRzcmMxLCRzcmMyCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBtYWN3aGkKK21hY3doaToKKwltdmlfaF9hY2N1bTAgMCwgMQorCW12aV9oX2dyIHI0LCAweDEwMTIzCisJbXZpX2hfZ3IgcjUsIDB4MjA0NTYKKworCW1hY3doaSByNCwgcjUKKworCXRlc3RfaF9hY2N1bTAgMCwgMHgyMDI0NworCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tYWN3bG8uY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tYWN3bG8uY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Y2U0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL21hY3dsby5jZ3MKQEAgLTAsMCArMSwxOCBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBtYWN3bG8gJHNyYzEsJHNyYzIKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIG1hY3dsbworbWFjd2xvOgorCW12aV9oX2FjY3VtMCAwLCAxCisJbXZpX2hfZ3IgcjQsIDB4MTAxMjMKKwltdmlfaF9nciByNSwgMHg0MDAwMgorCisJbWFjd2xvIHI0LCByNQorCisJdGVzdF9oX2FjY3VtMCAwLCAweDIwMjQ3CisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL21pc2MuZXhwIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9taXNjLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQ1NjM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9taXNjLmV4cApAQCAtMCwwICsxLDIxIEBACisjIE1pc2NlbGxhbmVvdXMgTTMyUiBzaW11bGF0b3IgdGVzdGNhc2VzCisKK2lmIFtpc3RhcmdldCBtMzJyKi0qLSpdIHsKKyAgICAjIGxvYWQgc3VwcG9ydCBwcm9jcworICAgICMgbG9hZF9saWIgY2dlbi5leHAKKworICAgICMgYWxsIG1hY2hpbmVzCisgICAgc2V0IGFsbF9tYWNocyAibTMyciIKKworCisgICAgIyBUaGUgLm1zIHN1ZmZpeCBpcyBmb3IgIm1pc2NlbGxhbmVvdXMgLnMiLgorICAgIGZvcmVhY2ggc3JjIFtsc29ydCBbZ2xvYiAtbm9jb21wbGFpbiAkc3JjZGlyLyRzdWJkaXIvKi5tc11dIHsKKwkjIElmIHdlJ3JlIG9ubHkgdGVzdGluZyBzcGVjaWZpYyBmaWxlcyBhbmQgdGhpcyBpc24ndCBvbmUgb2YgdGhlbSwKKwkjIHNraXAgaXQuCisJaWYgIVtydW50ZXN0X2ZpbGVfcCAkcnVudGVzdHMgJHNyY10geworCSAgICBjb250aW51ZQorCX0KKworCXJ1bl9zaW1fdGVzdCAkc3JjICRhbGxfbWFjaHMKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL211bC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL211bC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc4ZjI0YgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXVsLmNncwpAQCAtMCwwICsxLDE3IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIG11bCAkZHIsJHNyCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBtdWwKK211bDoKKwltdmlfaF9nciByNCwgMworCW12aV9oX2dyIHI1LCA3CisKKwltdWwgcjUsIHI0CisKKwl0ZXN0X2hfZ3IgcjUsIDIxCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL211bGhpLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXVsaGkuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YzEwM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL211bGhpLmNncwpAQCAtMCwwICsxLDE2IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIG11bGhpICRzcmMxLCRzcmMyCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBtdWxoaQorbXVsaGk6CisKKwltdmlfaF9nciByNCwgMHg0MDAwMAorCW12aV9oX2dyIHI1LCAweDUwMDAwCisJbXVsaGkgcjQsIHI1CisJdGVzdF9oX2FjY3VtMCAwLCAweDE0MDAwMAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdWxsby5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL211bGxvLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWFhZGZmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdWxsby5jZ3MKQEAgLTAsMCArMSwxNiBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBtdWxsbyAkc3JjMSwkc3JjMgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgbXVsbG8KK211bGxvOgorCisJbXZpX2hfZ3IgcjQsIDQKKwltdmlfaF9nciByNSwgNQorCW11bGxvIHI0LCByNQorCXRlc3RfaF9hY2N1bTAgMCwgMHgxNDAwMDAKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXVsd2hpLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXVsd2hpLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjE4NTYyCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdWx3aGkuY2dzCkBAIC0wLDAgKzEsMTggQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgbXVsd2hpICRzcmMxLCRzcmMyCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBtdWx3aGkKK211bHdoaToKKwltdmlfaF9hY2N1bTAgMCwgMQorCW12aV9oX2dyIHI0LCAweDEwMTIzCisJbXZpX2hfZ3IgcjUsIDB4MjA0NTYKKworCW11bHdoaSByNCwgcjUKKworCXRlc3RfaF9hY2N1bTAgMCwgMHgyMDI0NgorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdWx3bG8uY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdWx3bG8uY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMmMyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL211bHdsby5jZ3MKQEAgLTAsMCArMSwxOCBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBtdWx3bG8gJHNyYzEsJHNyYzIKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIG11bHdsbworbXVsd2xvOgorCW12aV9oX2FjY3VtMCAwLCAxCisJbXZpX2hfZ3IgcjQsIDB4MTAxMjMKKwltdmlfaF9nciByNSwgMHg0MDAwMgorCisJbXVsd2xvIHI0LCByNQorCisJdGVzdF9oX2FjY3VtMCAwLCAweDIwMjQ2CisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXYuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NDU2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212LmNncwpAQCAtMCwwICsxLDE3IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIG12ICRkciwkc3IKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIG12CittdjoKKwltdmlfaF9nciByNCwgMQorCW12aV9oX2dyIHI1LCAwCisKKwltdiByNSwgcjQKKworCXRlc3RfaF9nciByNSwgMQorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdmZhY2hpLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXZmYWNoaS5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyMmUxYgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXZmYWNoaS5jZ3MKQEAgLTAsMCArMSwyMiBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBtdmZhY2hpICRkcgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgbXZmYWNoaQorbXZmYWNoaToKKwltdmlfaF9hY2N1bTAgMHgxMTIyMzM0NCwgMHg1NTY2Nzc4OAorCW12aV9oX2dyIHI0LCAwCisKKwltdmZhY2hpIHI0CisJdGVzdF9oX2dyIHI0LCAweDIyMzM0NAorCisJbXZpX2hfYWNjdW0wIDB4OTlhYWJiY2MsIDB4NTU2Njc3ODgKKwltdmlfaF9nciByNCwgMAorCisJbXZmYWNoaSByNAorCXRlc3RfaF9nciByNCwgMHhmZmFhYmJjYworCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdmZhY2xvLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXZmYWNsby5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4OGQ4NAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXZmYWNsby5jZ3MKQEAgLTAsMCArMSwxNyBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBtdmZhY2xvICRkcgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgbXZmYWNsbworbXZmYWNsbzoKKwltdmlfaF9hY2N1bTAgMHgxMTIyMzM0NCwgMHg1NTY2Nzc4OAorCW12aV9oX2dyIHI0LCAwCisKKwltdmZhY2xvIHI0CisKKwl0ZXN0X2hfZ3IgcjQsIDB4NTU2Njc3ODgKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXZmYWNtaS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212ZmFjbWkuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MGJjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212ZmFjbWkuY2dzCkBAIC0wLDAgKzEsMTUgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgbXZmYWNtaSAkZHIKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIG12ZmFjbWkKK212ZmFjbWk6CisKKwltdmlfaF9hY2N1bTAgMHgxMjM0NTY3OCwgMHg4NzY1NDMyMQorCW12ZmFjbWkgcjQKKwl0ZXN0X2hfZ3IgcjQsIDB4NTY3ODg3NjUKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXZmYy5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212ZmMuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjQ3MGUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212ZmMuY2dzCkBAIC0wLDAgKzEsMjMgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgbXZmYyAkZHIsJHNjcgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgbXZmYworbXZmYzoKKwltdmlfaF9jb25kYml0IDAKKwltdmlfaF9nciByNCwgMQorCisJbXZmYyByNCwgY3IxCisKKwl0ZXN0X2hfZ3IgcjQsIDAKKworCW12aV9oX2NvbmRiaXQgMQorCisJbXZmYyByNCwgY3IxCisKKwl0ZXN0X2hfZ3IgcjQsIDEKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXZ0YWNoaS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212dGFjaGkuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNTk2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL212dGFjaGkuY2dzCkBAIC0wLDAgKzEsMjAgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgbXZ0YWNoaSAkc3JjMQorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgbXZ0YWNoaQorbXZ0YWNoaToKKwltdmlfaF9hY2N1bTAgMCwgMAorCisJbXZpX2hfZ3IgcjQsIDB4MTEyMjMzNDQKKwltdnRhY2hpIHI0CisJdGVzdF9oX2FjY3VtMCAweDIyMzM0NCwgMHgwCisKKwltdmlfaF9nciByNCwgMHg5OWFhYmJjYworCW12dGFjaGkgcjQKKwl0ZXN0X2hfYWNjdW0wIDB4ZmZhYWJiY2MsIDB4MAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdnRhY2xvLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXZ0YWNsby5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhZmQ4MwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXZ0YWNsby5jZ3MKQEAgLTAsMCArMSwxNyBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBtdnRhY2xvICRzcmMxCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBtdnRhY2xvCittdnRhY2xvOgorCW12aV9oX2FjY3VtMCAwLCAwCisJbXZpX2hfZ3IgcjQsIDB4MTEyMjMzNDQKKworCW12dGFjbG8gcjQKKworCXRlc3RfaF9hY2N1bTAgMCwgMHgxMTIyMzM0NAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9tdnRjLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXZ0Yy5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ3ODBkZgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbXZ0Yy5jZ3MKQEAgLTAsMCArMSwxOCBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBtdnRjICRzciwkZGNyCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBtdnRjCittdnRjOgorCW12aV9oX2NvbmRiaXQgMAorCW12aV9oX2dyIHI0LCAxCisKKwltdnRjIHI0LCBjcjEKKwliYyBvaworCisJZmFpbAorb2s6CisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9uZWcuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9uZWcuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL25lZy5jZ3MKQEAgLTAsMCArMSwxNyBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBuZWcgJGRyLCRzcgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgbmVnCituZWc6CisJbXZpX2hfZ3IgcjQsIDEKKwltdmlfaF9nciByNSwgMgorCisJbmVnIHI0LCByNQorCisJdGVzdF9oX2dyIHI0LCAtMgorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ub3AuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ub3AuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YjQ0YmMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL25vcC5jZ3MKQEAgLTAsMCArMSwxMCBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBub3AKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIG5vcAorbm9wOgorCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbm90LmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvbm90LmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmNlYjY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ub3QuY2dzCkBAIC0wLDAgKzEsMTcgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3Igbm90ICRkciwkc3IKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIG5vdAorbm90OgorCW12aV9oX2dyIHI0LCAxCisJbXZpX2hfZ3IgcjUsIDIKKworCW5vdCByNCwgcjUKKworCXRlc3RfaF9nciByNCwgMHhmZmZmZmZmZAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9vci5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL29yLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjA4YmQwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9vci5jZ3MKQEAgLTAsMCArMSwxNyBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBvciAkZHIsJHNyCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBvcgorb3I6CisJbXZpX2hfZ3IgcjQsIDMKKwltdmlfaF9nciByNSwgNgorCisJb3IgcjQsIHI1CisKKwl0ZXN0X2hfZ3IgcjQsIDcKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvb3IzLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvb3IzLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzc2YWRhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9vcjMuY2dzCkBAIC0wLDAgKzEsMTcgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3Igb3IzICRkciwkc3IsIyR1bG8xNgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgb3IzCitvcjM6CisJbXZpX2hfZ3IgcjQsIDAKKwltdmlfaF9nciByNSwgNgorCisJb3IzIHI0LCByNSwgIzMKKworCXRlc3RfaF9nciByNCwgNworCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9yYWMuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9yYWMuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YjlhZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3JhYy5jZ3MKQEAgLTAsMCArMSwyMyBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciByYWMKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIHJhYworcmFjOgorCisJbXZpX2hfYWNjdW0wIDEsIDB4NDAwMQorCXJhYworCXRlc3RfaF9hY2N1bTAgMiwgMHgxMDAwMAorCisJbXZpX2hfYWNjdW0wIDB4M2ZmZiwgMHhmZmZmNDAwMAorCXJhYworCXRlc3RfaF9hY2N1bTAgMHg3ZmZmLCAweGZmZmYwMDAwCisKKwltdmlfaF9hY2N1bTAgMHhmZmZmODAwMCwgMAorCXJhYworCXRlc3RfaF9hY2N1bTAgMHhmZmZmODAwMCwgMAorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9yYWNoLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvcmFjaC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyNDY5OAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvcmFjaC5jZ3MKQEAgLTAsMCArMSwyMiBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciByYWNoCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCByYWNoCityYWNoOgorCW12aV9oX2FjY3VtMCAxLCAweDQwMDA0MDAxCisJcmFjaAorCXRlc3RfaF9hY2N1bTAgMywgMAorCisJbXZpX2hfYWNjdW0wIDB4M2ZmZiwgMHhjMDAwMDAwMAorCXJhY2gKKwl0ZXN0X2hfYWNjdW0wIDB4N2ZmZiwgMAorCisJbXZpX2hfYWNjdW0wIDB4ZmZmZjgwMDAsIDAKKwlyYWNoCisJdGVzdF9oX2FjY3VtMCAweGZmZmY4MDAwLCAwCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3JlbS5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3JlbS5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjMTFjYgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvcmVtLmNncwpAQCAtMCwwICsxLDE3IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIHJlbSAkZHIsJHNyCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCByZW0KK3JlbToKKwltdmlfaF9nciByNCwgMTIzNDU2NzgKKwltdmlfaF9nciByNSwgNworCisJcmVtIHI0LCByNQorCisJdGVzdF9oX2dyIHI0LCAyCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3JlbXUuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9yZW11LmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjMzNjMwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9yZW11LmNncwpAQCAtMCwwICsxLDIzIEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIHJlbXUgJGRyLCRzcgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgcmVtdQorcmVtdToKKwltdmlfaF9nciByNCwgMTcKKwltdmlfaF9nciByNSwgNworCisJcmVtdSByNCwgcjUKKworCXRlc3RfaF9nciByNCwgMworCisJbXZpX2hfZ3IgcjQsIC0xNworCisJcmVtdSByNCwgcjUKKworCXRlc3RfaF9nciByNCwgMQorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ydGUuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9ydGUuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzODlmZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3J0ZS5jZ3MKQEAgLTAsMCArMSw4NyBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBydGUKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIHJ0ZQorcnRlOgorCis7IFRlc3QgMTogYmJwc3cgPSAwLCBicHN3ID0gMSwgcHN3ID0gMAorCisJOyBiYnNtID0gMCwgYmllID0gMCwgYmJjb25kID0gMAorCW12aV9oX2dyIHI0LCAwCisJbXZ0YyByNCwgY3I4CisKKwk7IGJzbSA9IDEsIGJpZSA9IDEsIGJjb25kID0gMSwgc20gPSAwLCBpZSA9IDAsIGNvbmQgPSAwCisJbXZpX2hfZ3IgcjQsIDB4YzEwMAorCW12dGMgcjQsIGNyMAorCisJOyBiYnBjID0gMAorCW12YWRkcl9oX2dyIHI0LCAwCisJbXZ0YyByNCwgYmJwYworCisJOyBicGMgPSByZXQxCisJbXZhZGRyX2hfZ3IgcjQsIHJldDEKKwltdnRjIHI0LCBicGMKKworCXJ0ZQorCWZhaWwKKworcmV0MToKKwk7IHRlc3QgYmJzbSA9IDAsIGJiaWUgPSAwLCBiYmNvbmQgPSAwCisJbXZmYyByNCwgY3I4CisJdGVzdF9oX2dyIHI0LCAwCisKKwk7IHRlc3QgYnNtID0gMCwgYmllID0gMCwgYmNvbmQgPSAwLCBzbSA9IDEsIGllID0gMSwgY29uZCA9IDEKKwltdmZjIHI0LCBjcjAKKwl0ZXN0X2hfZ3IgcjQsIDB4YzEKKworCTsgdGVzdCBiYnBjID0gMAorCW12ZmMgcjQsIGJicGMKKwl0ZXN0X2hfZ3IgcjQsIDAKKworCTsgdGVzdCBicGMgPSAwCisJbXZmYyByNCwgYnBjCisJdGVzdF9oX2dyIHI0LCAwCisKKzsgVGVzdCAyOiBiYnBzdyA9IDEsIGJwc3cgPSAwLCBwc3cgPSAxCisKKwk7IGJic20gPSAxLCBiaWUgPSAxLCBiYmNvbmQgPSAxCisJbXZpX2hfZ3IgcjQsIDB4YzEKKwltdnRjIHI0LCBjcjgKKworCTsgYnNtID0gMCwgYmllID0gMCwgYmNvbmQgPSAwLCBzbSA9IDEsIGllID0gMSwgY29uZCA9IDEKKwltdmlfaF9nciByNCwgMHhjMQorCW12dGMgcjQsIGNyMAorCisJOyBiYnBjID0gNDIKKwltdmFkZHJfaF9nciByNCwgNDIKKwltdnRjIHI0LCBiYnBjCisKKwk7IGJwYyA9IHJldDIgKyAyCisJbXZhZGRyX2hfZ3IgcjQsIHJldDIgKyAyCisJbXZ0YyByNCwgYnBjCisKKwlydGUKKwlmYWlsCisKK3JldDI6CisJOyB0ZXN0IGJic20gPSAxLCBiYmllID0gMSwgYmJjb25kID0gMQorCW12ZmMgcjQsIGNyOAorCXRlc3RfaF9nciByNCwgMHhjMQorCisJOyB0ZXN0IGJzbSA9IDEsIGJpZSA9IDEsIGJjb25kID0gMSwgc20gPSAwLCBpZSA9IDAsIGNvbmQgPSAwCisJbXZmYyByNCwgY3IwCisJdGVzdF9oX2dyIHI0LCAweGMxMDAKKworCTsgdGVzdCBiYnBjID0gNDIKKwltdmZjIHI0LCBiYnBjCisJdGVzdF9oX2dyIHI0LCA0MgorCisJOyB0ZXN0IGJwYyA9IDQyCisJbXZmYyByNCwgYnBjCisJdGVzdF9oX2dyIHI0LCA0MgorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zZXRoLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc2V0aC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVjMzIzMAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc2V0aC5jZ3MKQEAgLTAsMCArMSwyMCBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBzZXRoICRkciwjJGhpMTYKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIHNldGgKK3NldGg6CisJc2V0aCAgICAgIHI0LCAjMHgxMjM0CisKKwk7IGRvIG5vdCB1c2UgdGVzdF9oX2dyIG1hY3JvIHNpbmNlIHRoaXMgdXNlcyBzZXRoCisKKwlzcmxpICAgICAgcjQsICMxNgorCWxkMjQJICByNSwgIzB4MTIzNAorCWJlcSAgICAgICByNCwgcjUsIG9rCisKKwlmYWlsCitvazoKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3NsbC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3NsbC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzY2ZlZAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc2xsLmNncwpAQCAtMCwwICsxLDE1IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIHNsbCAkZHIsJHNyCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBzbGwKK3NsbDoKKwltdmlfaF9nciAgcjQsIDYKKwltdmlfaF9nciAgcjUsIDEKKwlzbGwgICAgICAgcjQsIHI1CisJdGVzdF9oX2dyIHI0LCAxMgorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zbGwzLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc2xsMy5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRkMzYwYwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc2xsMy5jZ3MKQEAgLTAsMCArMSwxNSBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBzbGwzICRkciwkc3IsIyRzaW1tMTYKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIHNsbDMKK3NsbDM6CisJbXZpX2hfZ3IgIHI0LCAxCisJbXZpX2hfZ3IgIHI1LCA2CisJc2xsMyAgICAgIHI0LCByNSwgIzEKKwl0ZXN0X2hfZ3IgcjQsIDEyCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3NsbGkuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zbGxpLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWI3N2RhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zbGxpLmNncwpAQCAtMCwwICsxLDE0IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIHNsbGkgJGRyLCMkdWltbTUKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIHNsbGkKK3NsbGk6CisJbXZpX2hfZ3IgIHI0LCA2CisJc2xsaSAgICAgIHI0LCAjMQorCXRlc3RfaF9nciByNCwgMTIKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3JhLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3JhLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTY3MWVkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zcmEuY2dzCkBAIC0wLDAgKzEsMTYgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3Igc3JhICRkciwkc3IKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIHNyYQorc3JhOgorCisJbXZpX2hfZ3IgIHI0LCAweGYwZjBmMGZmCisJbXZpX2hfZ3IgIHI1LCA0CisJc3JhICAgICAgIHI0LCByNQorCXRlc3RfaF9nciByNCwgMHhmZjBmMGYwZgorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zcmEzLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3JhMy5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkMzg3YQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3JhMy5jZ3MKQEAgLTAsMCArMSwxNiBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBzcmEzICRkciwkc3IsIyRzaW1tMTYKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIHNyYTMKK3NyYTM6CisKKwltdmlfaF9nciAgcjQsIDAKKwltdmlfaF9nciAgcjUsIDB4ZjBmMGYwZmYKKwlzcmEzICAgICAgcjQsIHI1LCAjNAorCXRlc3RfaF9nciByNCwgMHhmZjBmMGYwZgorCisJcGFzcwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zcmFpLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3JhaS5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExNTY5NAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3JhaS5jZ3MKQEAgLTAsMCArMSwxNCBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBzcmFpICRkciwjJHVpbW01CisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBzcmFpCitzcmFpOgorCW12aV9oX2dyICByNSwgMHhmMGYwZjBmZgorCXNyYWkgICAgICByNSwgIzQKKwl0ZXN0X2hfZ3IgcjUsIDB4ZmYwZjBmMGYKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3JsLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3JsLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODM4YzJmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zcmwuY2dzCkBAIC0wLDAgKzEsMTUgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3Igc3JsICRkciwkc3IKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIHNybAorc3JsOgorCW12aV9oX2dyICByNCwgNgorCW12aV9oX2dyICByNSwgMQorCXNybCAgICAgICByNCwgcjUKKwl0ZXN0X2hfZ3IgcjQsIDMKKworCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3JsMy5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3NybDMuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZGM0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3NybDMuY2dzCkBAIC0wLDAgKzEsMTUgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3Igc3JsMyAkZHIsJHNyLCMkc2ltbTE2CisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBzcmwzCitzcmwzOgorCW12aV9oX2dyICByNCwgMAorCW12aV9oX2dyICByNSwgNgorCXNybDMgICAgICByNCwgcjUsICMxCisJdGVzdF9oX2dyIHI0LCAzCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3NybGkuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zcmxpLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzU4YTc2Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zcmxpLmNncwpAQCAtMCwwICsxLDE1IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIHNybGkgJGRyLCMkdWltbTUKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIHNybGkKK3NybGk6CisJbXZpX2hfZ3IgIHI1LCA2CisJc3JsaSAgICAgIHI1LCAjMQorCXRlc3RfaF9nciByNSwgMworCisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N0LWQuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdC1kLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjY2OGEwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdC1kLmNncwpAQCAtMCwwICsxLDI2IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIHN0ICRzcmMxLEAoJHNsbzE2LCRzcmMyKQorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgc3RfZAorc3RfZDoKKwltdmFkZHJfaF9nciByNCwgZGF0YV9sb2MKKwltdmlfaF9nciAgICByNSwgMQorCisJc3QgcjUsIEAoIzgscjQpCisKKwltdmFkZHJfaF9nciByNCwgZGF0YV9sb2MyCisJbGQgcjQsIEByNAorCXRlc3RfaF9nciByNCwgMQorCisJcGFzcworCitkYXRhX2xvYzoKKwkud29yZCAwCisJLndvcmQgMAorZGF0YV9sb2MyOgorCS53b3JkIDAKKwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdC1taW51cy5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N0LW1pbnVzLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzkwMzUxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdC1taW51cy5jZ3MKQEAgLTAsMCArMSwyOSBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBzdCAkc3JjMSxALSRzcmMyCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBzdF9taW51cworc3RfbWludXM6CisJbXZhZGRyX2hfZ3IgcjQsIGRhdGFfbG9jMgorCW12aV9oX2dyICAgIHI1LCAxCisKKwlzdCByNSwgQC1yNAorCisJbXZhZGRyX2hfZ3IgcjUsIGRhdGFfbG9jCisKKwlibmUgcjQsIHI1LCBub3Rfb2sKKwlsZCByNCwgQHI0CisJdGVzdF9oX2dyIHI0LCAxCisKKwlwYXNzCitub3Rfb2s6CisJZmFpbAorCitkYXRhX2xvYzoKKwkud29yZCAwCitkYXRhX2xvYzI6CisJLndvcmQgMAorCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N0LXBsdXMuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdC1wbHVzLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmI0ZGQxCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdC1wbHVzLmNncwpAQCAtMCwwICsxLDI4IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIHN0ICRzcmMxLEArJHNyYzIKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIHN0X3BsdXMKK3N0X3BsdXM6CisJbXZhZGRyX2hfZ3IgcjQsIGRhdGFfbG9jCisJbXZpX2hfZ3IgICAgcjUsIDEKKworCXN0IHI1LCBAK3I0CisKKwltdmFkZHJfaF9nciByNSwgZGF0YV9sb2MyCisKKwlibmUgcjQsIHI1LCBub3Rfb2sKKwlsZCByNCwgQHI0CisJdGVzdF9oX2dyIHI0LCAxCisKKwlwYXNzCitub3Rfb2s6CisJZmFpbAorCitkYXRhX2xvYzoKKwkud29yZCAwCitkYXRhX2xvYzI6CisJLndvcmQgMApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N0LmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTg4YjhjCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdC5jZ3MKQEAgLTAsMCArMSwyMSBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBzdCAkc3JjMSxAJHNyYzIKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIHN0CitzdDoKKwltdmFkZHJfaF9nciByNCwgZGF0YV9sb2MKKwltdmlfaF9nciAgICByNSwgMQorCisJc3QgcjUsIEByNAorCisJbGQgcjQsIEByNAorCXRlc3RfaF9nciByNCwgMQorCisJcGFzcworCitkYXRhX2xvYzoKKwkud29yZCAwCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N0Yi1kLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3RiLWQuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YzJkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N0Yi1kLmNncwpAQCAtMCwwICsxLDI1IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIHN0YiAkc3JjMSxAKCRzbG8xNiwkc3JjMikKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIHN0Yl9kCitzdGJfZDoKKwltdmFkZHJfaF9nciByNCwgZGF0YV9sb2MKKwltdmlfaF9nciAgICByNSwgMHgxMjM0CisKKwlzdGIgcjUsIEAoIzgscjQpCisKKwltdmFkZHJfaF9nciByNCwgZGF0YV9sb2MyCisJbGQgcjQsIEByNAorCXRlc3RfaF9nciByNCwgMHgzNDAwMDAwMCA7IGJpZyBlbmRpYW4gcHJvY2Vzc29yCisKKwlwYXNzCisKK2RhdGFfbG9jOgorCS53b3JkIDAKKwkud29yZCAwCitkYXRhX2xvYzI6CisJLndvcmQgMApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdGIuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdGIuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjgzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N0Yi5jZ3MKQEAgLTAsMCArMSwyMSBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciBzdGIgJHNyYzEsQCRzcmMyCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBzdGIKK3N0YjoKKwltdmFkZHJfaF9nciByNCwgZGF0YV9sb2MKKwltdmlfaF9nciAgICByNSwgMHgxMjM0CisKKwlzdGIgcjUsIEByNAorCisJbGQgcjQsIEByNAorCXRlc3RfaF9nciByNCwgMHgzNDAwMDAwMCA7IGJpZyBlbmRpYW4gcHJvY2Vzc29yCisKKwlwYXNzCisKK2RhdGFfbG9jOgorCS53b3JkIDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3RoLWQuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdGgtZC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFhYWE2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3RoLWQuY2dzCkBAIC0wLDAgKzEsMjUgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3Igc3RoICRzcmMxLEAoJHNsbzE2LCRzcmMyKQorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgc3RoX2QKK3N0aF9kOgorCW12YWRkcl9oX2dyIHI0LCBkYXRhX2xvYworCW12aV9oX2dyICAgIHI1LCAweDEyMzQ1NgorCisJc3RoIHI1LCBAKCM4LHI0KQorCisJbXZhZGRyX2hfZ3IgcjQsIGRhdGFfbG9jMgorCWxkIHI0LCBAcjQKKwl0ZXN0X2hfZ3IgcjQsIDB4MzQ1NjAwMDAgOyBiaWcgZW5kaWFuIHByb2Nlc3NvcgorCisJcGFzcworCitkYXRhX2xvYzoKKwkud29yZCAwCisJLndvcmQgMAorZGF0YV9sb2MyOgorCS53b3JkIDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3RoLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3RoLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTEwZmRlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdGguY2dzCkBAIC0wLDAgKzEsMjEgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3Igc3RoICRzcmMxLEAkc3JjMgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgc3RoCitzdGg6CisJbXZhZGRyX2hfZ3IgcjQsIGRhdGFfbG9jCisJbXZpX2hfZ3IgICAgcjUsIDB4MTIzNDU2CisKKwlzdGggcjUsIEByNAorCisJbGQgcjQsIEByNAorCXRlc3RfaF9nciByNCwgMHgzNDU2MDAwMCA7IGJpZyBlbmRpYW4gcHJvY2Vzc29yCisKKwlwYXNzCisKK2RhdGFfbG9jOgorCS53b3JkIDAKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3ViLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3ViLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDY3NmU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdWIuY2dzCkBAIC0wLDAgKzEsMTggQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3Igc3ViICRkciwkc3IKKyMgbWFjaCgpOiBtMzJyIG0zMnJ4CisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKwkuZ2xvYmFsIHN1Ygorc3ViOgorCisJbXZpX2hfZ3IgcjQsIDcKKwltdmlfaF9nciByNSwgMworCisJc3ViIHI0LCByNQorCisJdGVzdF9oX2dyIHI0LCA0CisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N1YnYuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdWJ2LmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDc0NzY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci9zdWJ2LmNncwpAQCAtMCwwICsxLDIwIEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIHN1YnYgJGRyLCRzcgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgc3Vidgorc3VidjoKKwltdmlfaF9jb25kYml0IDAKKwltdmlfaF9nciByNCwgMHg4MDAwMDAwMAorCW12aV9oX2dyIHI1LCAzCisKKwlzdWJ2IHI0LCByNQorCisJYmMgb2sKKworCWZhaWwKK29rOgorCXBhc3MKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvc3VieC5jZ3MgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N1YnguY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OTBmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3N1YnguY2dzCkBAIC0wLDAgKzEsMjYgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3Igc3VieCAkZHIsJHNyCisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCBzdWJ4CitzdWJ4OgorCW12aV9oX2NvbmRiaXQgMQorCW12aV9oX2dyIHI0LCA2CisJbXZpX2hfZ3IgcjUsIDQKKwlzdWJ4IHI0LCByNQorCWJjIG5vdF9vaworCXRlc3RfaF9nciByNCwgMQorCisJbXZpX2hfY29uZGJpdCAxCisJbXZpX2hfZ3IgcjQsIDQKKwltdmlfaF9nciByNSwgNAorCXN1YnggcjQsIHI1CisJYm5jIG5vdF9vaworCXRlc3RfaF9nciByNCwgMHhmZmZmZmZmZgorCisJcGFzcworbm90X29rOgorCWZhaWwKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvdGVzdHV0aWxzLmluYyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvdGVzdHV0aWxzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDg4MjJhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci90ZXN0dXRpbHMuaW5jCkBAIC0wLDAgKzEsOTUgQEAKKyMgcjAtcjMgYXJlIHVzZWQgYXMgdG1wcywgY29uc2lkZXIgdGhlbSBjYWxsIGNsb2JiZXJlZCBieSB0aGVzZSBtYWNyb3MuCisKKwkubWFjcm8gc3RhcnQKKwkuZGF0YQorZmFpbG1zZzoKKwkuYXNjaWkgImZhaWxcbiIKK3Bhc3Ntc2c6CisJLmFzY2lpICJwYXNzXG4iCisJLnRleHQKKwkuZ2xvYmFsIF9zdGFydAorX3N0YXJ0OgorCS5lbmRtCisKKwkubWFjcm8gZXhpdCByYworCWxkaTggcjEsIFxyYworCWxkaTggcjAsICMxCisJdHJhcCAjMAorCS5lbmRtCisKKwkubWFjcm8gcGFzcworCWxkaTggcjMsIDUKKwlsZDI0IHIyLCBwYXNzbXNnCisJbGRpOCByMSwgMQorCWxkaTggcjAsIDUKKwl0cmFwICMwCisJZXhpdCAwCisJLmVuZG0KKworCS5tYWNybyBmYWlsCisJbGRpOCByMywgNQorCWxkMjQgcjIsIGZhaWxtc2cKKwlsZGk4IHIxLCAxCisJbGRpOCByMCwgNQorCXRyYXAgIzAKKwlleGl0IDEKKwkuZW5kbQorCisJLm1hY3JvIG12aV9oX2dyIHJlZywgdmFsCisJLmlmIChcdmFsID49IC0xMjgpICYmIChcdmFsIDw9IDEyNykKKwlsZGk4IFxyZWcsIFx2YWwKKwkuZWxzZQorCXNldGggXHJlZywgaGlnaChcdmFsKQorCW9yMyBccmVnLCBccmVnLCBsb3coXHZhbCkKKwkuZW5kaWYKKwkuZW5kbQorCisJLm1hY3JvIG12YWRkcl9oX2dyIHJlZywgYWRkcgorCXNldGggXHJlZywgaGlnaChcYWRkcikKKwlvcjMgXHJlZywgXHJlZywgbG93KFxhZGRyKQorCS5lbmRtCisKKyMgT3RoZXIgbWFjcm9zIGtub3cgdGhpcyBvbmx5IGNsb2JiZXJzIHIwLgorCS5tYWNybyB0ZXN0X2hfZ3IgcmVnLCB2YWwKKwltdmFkZHJfaF9nciByMCwgXHZhbAorCWJlcSBccmVnLCByMCwgdGVzdF9nclxACisJZmFpbAordGVzdF9nclxAOgorCS5lbmRtCisKKwkubWFjcm8gbXZpX2hfY29uZGJpdCB2YWwKKwlsZGk4IHIwLCAwCisJbGRpOCByMSwgMQorCS5pZiBcdmFsCisJY21wIHIwLCByMQorCS5lbHNlCisJY21wIHIxLCByMAorCS5lbmRpZgorCS5lbmRtCisKKwkubWFjcm8gdGVzdF9oX2NvbmRiaXQgdmFsCisJLmlmIFx2YWwKKwliYyB0ZXN0X2MxXEAKKwlmYWlsCit0ZXN0X2MxXEA6CisJLmVsc2UKKwlibmMgdGVzdF9jMFxACisJZmFpbAordGVzdF9jMFxAOgorCS5lbmRpZgorCS5lbmRtCisKKwkubWFjcm8gbXZpX2hfYWNjdW0wIGhpLCBsbworCW12aV9oX2dyIHIwLCBcaGkKKwltdnRhY2hpIHIwCisJbXZpX2hfZ3IgcjAsIFxsbworCW12dGFjbG8gcjAKKwkuZW5kbQorCisJLm1hY3JvIHRlc3RfaF9hY2N1bTAgaGksIGxvCisJbXZmYWNoaSByMQorCXRlc3RfaF9nciByMSwgXGhpCisJbXZmYWNsbyByMQorCXRlc3RfaF9nciByMSwgXGxvCisJLmVuZG0KKwpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci90cmFwLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvdHJhcC5jZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllMTM2YQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvdHJhcC5jZ3MKQEAgLTAsMCArMSwxMDkgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgdHJhcCAjJHVpbW00CisjIG1hY2goKTogbTMyciBtMzJyeAorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCisJLmdsb2JhbCB0cmFwCit0cmFwOgorCis7IFRlc3QgMTogYmJwc3cgPSAwLCBicHN3ID0gMSwgcHN3ID0gMAorCisJOyBiYnNtID0gMCwgYmllID0gMCwgYmJjb25kID0gMAorCW12aV9oX2dyIHI0LCAwCisJbXZ0YyByNCwgY3I4CisKKwk7IGJzbSA9IDEsIGJpZSA9IDEsIGJjb25kID0gMSwgc20gPSAwLCBpZSA9IDAsIGNvbmQgPSAwCisJbXZpX2hfZ3IgcjQsIDB4YzEwMAorCW12dGMgcjQsIGNyMAorCisJOyBiYnBjID0gMAorCW12YWRkcl9oX2dyIHI0LCAwCisJbXZ0YyByNCwgYmJwYworCisJOyBicGMgPSA0MgorCW12YWRkcl9oX2dyIHI0LCA0MgorCW12dGMgcjQsIGJwYworCisJOyBDb3B5IHRyYXAyX2hhbmRsZXIgdG8gdHJhcCBhcmVhIG9mIG1lbW9yeS4KKwlsZDI0IHIwLCMweDQ4IDsgYWRkcmVzcyBvZiB0cmFwIDIgaGFuZGxlcgorCWxkMjQgcjEsI3RyYXAyX2hhbmRsZXIKKwlsZCByMixAcjEKKwlzdCByMixAcjAKKwk7IFNldCB1cCByZXR1cm4gYWRkcmVzcy4KKwlsZDI0IHI1LCN0cmFwMl9yZXQxCisKK3RyYXBfaW5zbjE6CisJdHJhcCAjMgorCWZhaWwKKwordHJhcDJfcmV0MToKKwk7IHRlc3QgYmJzbSA9IDEsIGJiaWUgPSAxLCBiYmNvbmQgPSAxCisJbXZmYyByNCwgY3I4CisJdGVzdF9oX2dyIHI0LCAweGMxCisKKwk7IHRlc3QgYnNtID0gMCwgYmllID0gMCwgYmNvbmQgPSAwLCBzbSA9IDAsIGllID0gMCwgY29uZCA9IDAKKwltdmZjIHI0LCBjcjAKKwl0ZXN0X2hfZ3IgcjQsIDAKKworCTsgdGVzdCBiYnBjID0gNDIKKwltdmZjIHI0LCBiYnBjCisJdGVzdF9oX2dyIHI0LCA0MgorCisJOyB0ZXN0IGJwYyA9IHByb3BlciByZXR1cm4gYWRkcmVzcworCW12ZmMgcjQsIGJwYworCXRlc3RfaF9nciByNCwgdHJhcF9pbnNuMSArIDQKKworOyBUZXN0IDI6IGJicHN3ID0gMSwgYnBzdyA9IDAsIHBzdyA9IDEKKworCTsgYmJzbSA9IDEsIGJpZSA9IDEsIGJiY29uZCA9IDEKKwltdmlfaF9nciByNCwgMHhjMQorCW12dGMgcjQsIGNyOAorCisJOyBic20gPSAwLCBiaWUgPSAwLCBiY29uZCA9IDAsIHNtID0gMSwgaWUgPSAxLCBjb25kID0gMQorCW12aV9oX2dyIHI0LCAweGMxCisJbXZ0YyByNCwgY3IwCisKKwk7IGJicGMgPSA0MgorCW12YWRkcl9oX2dyIHI0LCA0MgorCW12dGMgcjQsIGJicGMKKworCTsgYnBjID0gMAorCW12YWRkcl9oX2dyIHI0LCAwCisJbXZ0YyByNCwgYnBjCisKKwk7IFNldCB1cCByZXR1cm4gYWRkcmVzcy4KKwlsZDI0IHI1LCN0cmFwMl9yZXQyCisKK3RyYXBfaW5zbjI6CisJdHJhcCAjMgorCWZhaWwKKwordHJhcDJfcmV0MjoKKwk7IHRlc3QgYmJzbSA9IDAsIGJiaWUgPSAwLCBiYmNvbmQgPSAwCisJbXZmYyByNCwgY3I4CisJdGVzdF9oX2dyIHI0LCAwCisKKwk7IHRlc3QgYnNtID0gMSwgYmllID0gMSwgYmNvbmQgPSAxLCBzbSA9IDEsIGllID0gMCwgY29uZCA9IDAKKwltdmZjIHI0LCBjcjAKKwl0ZXN0X2hfZ3IgcjQsIDB4YzE4MAorCisJOyB0ZXN0IGJicGMgPSAwCisJbXZmYyByNCwgYmJwYworCXRlc3RfaF9nciByNCwgMAorCisJOyB0ZXN0IGJwYyA9IHByb3BlciByZXR1cm4gYWRkcmVzcworCW12ZmMgcjQsIGJwYworCXRlc3RfaF9nciByNCwgdHJhcF9pbnNuMiArIDQKKworCXBhc3MKKworCS5kYXRhCisKKzsgRG9uJ3QgdXNlIHJ0ZSBhcyBpdCB3aWxsIHVuZG8gdGhlIGVmZmVjdHMgb2YgdHJhcCB3ZSdyZSB0ZXN0aW5nLgorCisJLnAyYWxpZ24gMgordHJhcDJfaGFuZGxlcjoKKwlqbXAgcjUKKwlub3AKZGlmZiAtLWdpdCBhL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvdW5sb2NrLmNncyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvdW5sb2NrLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTUxYjdhCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci91bmxvY2suY2dzCkBAIC0wLDAgKzEsMzAgQEAKKyMgbTMyciB0ZXN0Y2FzZSBmb3IgdW5sb2NrICRzcmMxLEAkc3JjMgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgdW5sb2NrCit1bmxvY2s6CisJbXZhZGRyX2hfZ3IgcjQsIGRhdGFfbG9jCisJbXZpX2hfZ3IgICAgcjUsIDEKKworCWxvY2sgcjUsIEByNAorCisJbXZpX2hfZ3IgcjUsIDIKKwl1bmxvY2sgcjUsIEByNAorCisJbGQgcjYsIEByNAorCXRlc3RfaF9nciByNiwgMgorCisJbXZpX2hfZ3IgcjUsIDAKKwl1bmxvY2sgcjUsIEByNAk7IFRoaXMgc2hvdWxkIGJlIGEgbm9wIHNpbmNlIHRoZSBwcm9jZXNzb3Igc2hvdWxkIGJlIHVubG9ja2VkLgorCisJbGQgcjYsIEByNAorCXRlc3RfaF9nciByNiwgMgorCQorCXBhc3MKKworZGF0YV9sb2M6CisJLndvcmQgMApkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci91cmVhZDE2Lm1zIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci91cmVhZDE2Lm1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MGU5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3VyZWFkMTYubXMKQEAgLTAsMCArMSwxOCBAQAorIyBtYWNoOiBtMzJyIG0zMnJ4CisjIHhlcnJvcjoKKyMgb3V0cHV0OiAqbWlzYWxpZ25lZCByZWFkKgorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCis7IGNvbnN0cnVjdCBicmEgdHJhcDJfaGFuZGxlciBpbiB0cmFwIDIgc2xvdAorCWxkMjQgcjAsI2ZvbysxCisJbGRoIHIwLEByMAorCWZhaWwKKwlleGl0IDAKKworLmRhdGEKKwkucDJhbGlnbiAyCitmb286CisJLnNob3J0IDQyCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3VyZWFkMzIubXMgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3VyZWFkMzIubXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1YzcxNgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS90ZXN0c3VpdGUvc2ltL20zMnIvdXJlYWQzMi5tcwpAQCAtMCwwICsxLDE4IEBACisjIG1hY2g6IG0zMnIgbTMycngKKyMgeGVycm9yOgorIyBvdXRwdXQ6ICptaXNhbGlnbmVkIHJlYWQqCisKKwkuaW5jbHVkZSAidGVzdHV0aWxzLmluYyIKKworCXN0YXJ0CisKKzsgY29uc3RydWN0IGJyYSB0cmFwMl9oYW5kbGVyIGluIHRyYXAgMiBzbG90CisJbGQyNCByMCwjZm9vKzEKKwlsZCByMCxAcjAKKwlmYWlsCisJZXhpdCAwCisKKy5kYXRhCisJLnAyYWxpZ24gMgorZm9vOgorCS53b3JkIDQyCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3V3cml0ZTE2Lm1zIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci91d3JpdGUxNi5tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWJmZDZlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci91d3JpdGUxNi5tcwpAQCAtMCwwICsxLDE4IEBACisjIG1hY2g6IG0zMnIgbTMycngKKyMgeGVycm9yOgorIyBvdXRwdXQ6ICptaXNhbGlnbmVkIHdyaXRlKgorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCis7IGNvbnN0cnVjdCBicmEgdHJhcDJfaGFuZGxlciBpbiB0cmFwIDIgc2xvdAorCWxkMjQgcjAsI2ZvbysxCisJc3RoIHIwLEByMAorCWZhaWwKKwlleGl0IDAKKworLmRhdGEKKwkucDJhbGlnbiAyCitmb286CisJLnNob3J0IDQyCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3V3cml0ZTMyLm1zIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci91d3JpdGUzMi5tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTVhMTIzCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci91d3JpdGUzMi5tcwpAQCAtMCwwICsxLDE4IEBACisjIG1hY2g6IG0zMnIgbTMycngKKyMgeGVycm9yOgorIyBvdXRwdXQ6ICptaXNhbGlnbmVkIHdyaXRlKgorCisJLmluY2x1ZGUgInRlc3R1dGlscy5pbmMiCisKKwlzdGFydAorCis7IGNvbnN0cnVjdCBicmEgdHJhcDJfaGFuZGxlciBpbiB0cmFwIDIgc2xvdAorCWxkMjQgcjAsI2ZvbysxCisJc3QgcjAsQHIwCisJZmFpbAorCWV4aXQgMAorCisuZGF0YQorCS5wMmFsaWduIDIKK2ZvbzoKKwkud29yZCA0MgpkaWZmIC0tZ2l0IGEvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci94b3IuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci94b3IuY2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NGRhNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3hvci5jZ3MKQEAgLTAsMCArMSwxNiBAQAorIyBtMzJyIHRlc3RjYXNlIGZvciB4b3IgJGRyLCRzcgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgeG9yCit4b3I6CisKKwltdmlfaF9nciAgcjQsIDMKKwltdmlfaF9nciAgcjUsIDYKKwl4b3IgICAgICAgcjQsIHI1CisJdGVzdF9oX2dyIHI0LCA1CisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdGVzdHN1aXRlL3NpbS9tMzJyL3hvcjMuY2dzIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci94b3IzLmNncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWU3MjY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Rlc3RzdWl0ZS9zaW0vbTMyci94b3IzLmNncwpAQCAtMCwwICsxLDE2IEBACisjIG0zMnIgdGVzdGNhc2UgZm9yIHhvcjMgJGRyLCRzciwjJHVpbW0xNgorIyBtYWNoKCk6IG0zMnIgbTMycngKKworCS5pbmNsdWRlICJ0ZXN0dXRpbHMuaW5jIgorCisJc3RhcnQKKworCS5nbG9iYWwgeG9yMworeG9yMzoKKworCW12aV9oX2dyICByNSwgMAorCW12aV9oX2dyICByNCwgMworCXhvcjMgICAgICByNSwgcjQsICM2CisJdGVzdF9oX2dyIHI1LCA1CisKKwlwYXNzCmRpZmYgLS1naXQgYS9zaW0vdjg1MC9DaGFuZ2VMb2cgYi9zaW0vdjg1MC9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUwZGY0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS92ODUwL0NoYW5nZUxvZwpAQCAtMCwwICsxLDEwNTUgQEAKK1R1ZSBEZWMgIDEgMTc6MjU6MTYgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoTkxfVEFSR0VUKTogRGVmaW5lIGFzIC1ETkxfVEFSR0VUX3Y4NTAuCisKK1dlZCBOb3YgMjUgMTc6NTI6NTggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoc2ltb3BzLm8pOiBEZXBlbmRzIG9uIHRhcmctdmFscy5oCisJKiBzaW1vcHMuYzogSW5jbHVkZSB0YXJnLXZhbHMuaCBpbnN0ZWFkIG9mCisgCWxpYmdsb3NzLy4uLi9zeXNjYWxsLmguIFJlcGxhY2UgU1lTXyogd2l0aCBUQVJHRVRfU1lTXyouCisJKGRpdm4sIGRpdnVuLCBPUF8xQzAwN0UwLCBPUF8xODIwN0UwLCBPUF8xQzIwN0UwLE9QXzE4MDA3RTApOgorIAlSZXBsYWNlIHNpZ25lZCBsb25nIGludCB3aXRoIHNpZ25lZDMyLgorCitGcmkgT2N0ICA5IDE4OjAyOjI1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jOiAjaW5jbHVkZSAiaXRhYmxlLmgiLgorCShnZXRfaW5zbl9uYW1lKTogTmV3IGZ1bmN0aW9uLgorCShzaW1fb3Blbik6IEluaXRpYWxpemUgQ1BVX0lOU05fTkFNRSxDUFVfTUFYX0lOU05TLgorCSogc2ltLW1haW4uaCAoTUFYX0lOU05TLElOU05fTkFNRSk6IERlbGV0ZS4KKworV2VkIE1heSAgNiAxOTo0MzoyNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBzaW0tbWFpbi5oIChJTlNOX05BTUUpOiBOZXcgYXJnIGBjcHUnLgorCitUdWUgQXByIDI4IDE4OjMzOjMxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+CisKKyAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1N1biBBcHIgMjYgMTU6MzE6NTUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1N1biBBcHIgMjYgMTU6MTk6MTQgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZ3VyZS5pbjogUmV2ZXJ0ZWQgY2hhbmdlIG9mIEFwciAyNDsgdXNlIHNpbmNsdWRlIGFnYWluLgorCitGcmkgQXByIDI0IDE0OjE2OjQwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitGcmkgQXByIDI0IDExOjE4OjA4IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBEb24ndCBjYWxsIHNpbmNsdWRlLgorCitTYXQgQXByICA0IDIwOjM2OjI1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogc2ltLW1haW4uaCAoU0lNX01BSU5fSCk6IFdyYXAgaGVhZGVyLgorCitGcmkgTWFyIDI3IDE2OjE1OjUyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgTWFyIDI1IDEyOjM1OjI5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgTWFyIDEwIDE1OjU0OjUwIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9zdG9wKTogRGVsZXRlLCBzZWNvbmQgYXR0ZW1wdC4KKworVGh1IEZlYiAyNiAxOTowOTo0NyAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1faW5mbyk6IERlbGV0ZS4KKworV2VkIEZlYiAxOCAxMDo0NzozMiAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1tYWluLmggKFRSQUNFX0FMVV9JTlBVVCopOiBEZWxldGUuICBNb3ZlZCB0byBzaW0tdHJhY2UuW2hjXS4KKworCSogc2ltb3BzLmMgKHRyYWNlX3Jlc3VsdCk6IENhbGwgdHJhY2VfZ2VuZXJpYyBpbnN0ZWFkIG9mCisgCXRyYWNlX29uZV9pbnNuLgorCSh0cmFjZV9tb2R1bGUpOiBDaGFuZ2UgdmFyaWFibGUgdHlwZSB0byBpbnRlZ2VyLgorCSh0cmFjZV9pbnB1dCk6IEluaXRpYWxpemUgdHJhY2VfbW9kdWxlIHdpdGggVFJBQ0VfQUxVX0lEWC4KKworCSogc2ltLW1haW4uaCAodHJhY2VfbW9kdWxlKTogQ2hhbmdlIHZhcmlhYmxlIGRlY2wgdG8gaW50ZWdlciB0eXBlLgorCShUUkFDRV9CUkFOQ0gqLCBUUkFDRV9MRCwgVFJBQ0VfU1QpOiBVcGRhdGUuCisJCitUdWUgRmViIDE3IDEyOjUxOjE4IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9zdG9yZV9yZWdpc3Rlciwgc2ltX2ZldGNoX3JlZ2lzdGVyKTogUGFzcyBpbgorIAlsZW5ndGggcGFyYW1ldGVyLiAgUmV0dXJuIC0xLgorCitUdWUgRmViICAzIDE2OjI0OjQyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLW1haW4uaCAoSU1FTTE2LCBJTUVNMTZfSU1NRUQpOiBSZW5hbWUgSU1FTSBhbmQKKyAJSU1FTV9JTU1FRC4gVG8gbWF0Y2ggcmVjZW50IGlnZW4gY2hhbmdlLgorCitTdW4gRmViICAxIDE2OjQ3OjUxIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitTYXQgSmFuIDMxIDE4OjE1OjQxIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitGcmkgSmFuIDMwIDA5OjUxOjI3IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLW1haW4uaCAoQ1BVX0NJQSk6IERlbGV0ZSwgcmVwbGFjZWQgYnkuCisJKENJQV9TRVQsIENJQV9TRVQpOiBEZWZpbmUuCisKK01vbiBKYW4gMTkgMjI6MjY6MjkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK01vbiBEZWMgMTUgMjM6MTc6MTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitGcmkgRGVjICA1IDA5OjI2OjA4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHY4NTAuaWdlbjogUmV2ZXJ0IGJyZWFrIHZhbHVlIGJhY2sgdG8gaXRzIG9sZCB2YWx1ZS4KKworVGh1IERlYyAgNCAwOToyMTowNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1dlZCBEZWMgIDMgMTc6Mjc6MTkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KKworCSogdjg1MC5pZ2VuOiBNYWtlIGJyZWFrIGhhdmUgYSB6ZXJvIGZpcnN0IGZpZWxkLCBzaW5jZSBvdGhlcndpc2UKKwlpdCBjbGFzaGVzIHdpdGggdGhlIERJVkggaW5zdHJ1Y3Rpb24uCisKK1NhdCBOb3YgMjIgMjE6MzI6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAoT1BfMTAwMDdFMCk6IFJlbmFtZSBTSUdBQlJUIC0+IFNJTV9TSUdBQlJULiBHaXZlCisgCXNpbV9zdG9wcGVkIGluc3RlYWQgb2Ygc2ltX3NpZ25hbGxlZC4KKworCSogdjg1MC5pZ2VuIChCUkVBSyksIHNpbW9wcy5jIChPUF8xMjAwN0UwKTogUmVuYW1lIFNJR1RSQVAgdG8KKyAJU0lNX1NJR1RSQVAuCisJKGlsbGVnYWwpOiBSZW5hbWUgU0lHSUxMIHRvIFNJTV9TSUdJTEwuCisJCisJKiBzaW0tbWFpbi5oLCBzaW1vcHMuYywgaW50ZXJwLmM6IERvIG5vdCBpbmNsdWRlIHNpZ25hbC5oLgorCisJKiBzaW0tbWFpbi5oOiBJbmNsdWRlIHNpbS1zaWduYWwuaCBpbnN0ZWFkIG9mIHNpZ25hbC5oLgorCShTSUdUUkFQLCBTSUdRVUlUKTogRGVsZXRlIGRlZmluaXRpb24uCisJKFNJR19WODUwX0VYSVQpOiBEZWxldGUgZGVmaW5pdGlvbi4KKworVHVlIE5vdiAxOCAxNTozMzo0OCAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBVc2UgJChTSU1fTkVXX0NPTU1PTl9PQkpTKS4KKworRnJpIE9jdCAzMSAxMDozMzo0MCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IENoZWNrIHN0YXRlIG1hZ2ljIG51bWJlci4KKwkoc2ltLWFzc2VydC5oKTogSW5jbHVkZS4KKworVHVlIE9jdCAyOCAxMTowNjo0NyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHY4NTAuaWdlbjogQWRkIG1vZGVsIGZpbHRlciBmaWVsZCB0byByZWNvcmRzLgorCitGcmkgT2N0ICAzIDA5OjI4OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitGcmkgU2VwIDI2IDExOjU2OjAyIDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KKworCSogc2ltLW1haW4uaDogZGVsZXRlIG51bGwgb3ZlcnJpZGUgb2YgU0lNX0VOR0lORV9IQUxUX0hPT0sgYW5kCisgCVNJTV9FTkdJTkVfUkVTVEFSVF9IT09LLgorCQorV2VkIFNlcCAyNCAxNzozODo1NyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIFNlcCAyNCAxNzoyODoyNiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbS1tYWluLmggKFdJVEhfVEFSR0VUX1dPUkRfTVNCKTogRGVsZXRlLgorCisJKiBjb25maWd1cmUuaW4gKFNJTV9BQ19PUFRJT05fQklUU0laRSk6IFNwZWNpZnkgMzIgYml0CisgCWFyY2hpdGVjdHVyZSB3aXRoIE1TQiA9PSAzMS4KKworV2VkIFNlcCAyNCAxNDowNDoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHY4NTAuaWdlbjogTWFrZSBkaXZoIGluc24gd2l0aCBSUlJSUj09MCBicmVha3BvaW50LgorCitUdWUgU2VwIDIzIDExOjA0OjM4IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgU2VwIDIzIDEwOjE5OjUxIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW4gKFNJTV9XQVJOSU5HUywgU0lNX0FMSUdOTUVOVCwgU0lNX0VORElBTiwKKyAJU0lNX0hPU1RFTkRJQU4sIFNJTV9SRVNFUlZFRF9CSVRTKTogRGVsZXRlLCBtb3ZlZCB0byBjb21tb24uCisJKFNJTV9FWFRSQV9DRkxBR1MpOiBVcGRhdGUuCisJCitNb24gU2VwIDIyIDExOjQ2OjIwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlndXJlLmluOiBSZWFsbHkgc3BlY2lmeSBOT05TVFJJQ1RfQUxJR05NRU5UIGFzIHRoZSBkZWZhdWx0LgorCitGcmkgU2VwIDE5IDE3OjQ1OjI1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBTcGVjaWZ5IE5PTlNUUklDVF9BTElHTk1FTlQgYXMgdGhlIGRlZmF1bHQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK0ZyaSBTZXAgMTkgMTA6Mzc6MjAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiB2ODUwLmlnZW4gKGRpc3AxNik6IFVzZSBFWFRFTkQxNiB0byBzaWduIGV4dGVuZCBkaXNwLgorCShkaXNwMjIpOiBPbmx5IHNoaWZ0IGxlZnQgYnkgMSwgbm90IDIuCisJKCJqbXAiKTogRW5zdXJlIFBDIGlzIDIgYnl0ZSBhbGlnbmVkLgorCisJKiBzaW1vcHMuYywgdjg1MC5pZ2VuOiBNb3ZlICJCY29uZCIsICJqciIsICJqYXJsIiBjb2RlIHRvCisgCXY4NTAuaWdlbi4gRml4IHRyYWNpbmcuCisKKwkqIHNpbW9wcy5jIChPUF8zMDAsIE9QXzQwMCwgT1BfNTAwKTogTW92ZSAic2RsLmIiLCAic2xkLmgiLAorIAkic2xkLnciIGluc25zIHRvIHY4NTAuaWdlbi4gIEZpeCB0cmFjaW5nLgorCShPUF83MCk6IERpdHRvIGZvciAic2xkLmh1Ii4KKworCSogdjg1MC5pZ2VuOiBDbGFyaWZ5IHRyYWNpbmcgb2YgInNsZC5iIiwgInNsZC5oIiBldC5hbC4KKworCSogc2ltb3BzLmMgKGNvbmRpdGlvbl9tZXQpOiBNYWtlIGdsb2JhbC4KKworCSogc2ltLW1haW4uaCAoVFJBQ0VfQUxVX0lOUFVUMywgVFJBQ0VfQlJBTkNIMCwgVFJBQ0VfTEQsCisgCVRSQUNFX1NUKTogRGVmaW5lLgorCShUUkFDRV9MRF9OQU1FKTogRGVmaW5lLgorCisJKiBzaW1vcHMuYzogTW92ZSAiY21vdiIsICJjbW92IGltbSIgdG8gdjg1MC5pZ2VuLCBmaXguCisKK1dlZCBTZXAgMTcgMTY6MjE6MDggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW1vcHMuYzogTW92ZSAibW92IiwgInJldGkiLCB0byB2ODUwLmlnZW4sIGZpeCB0cmFjaW5nLgorCQorCSogaW50ZXJwLmMgKGhhc2gpOiBEZWxldGUuCisKKwkqIHY4NTAuaWdlbiAobm9wKTogUmVhbGx5IGRvIG5vdGhpbmcuCisKKwkqIGludGVycC5jIChkb19pbnRlcnJ1cHQpOiBNYXNrIGludGVycnVwdHMgYWZ0ZXIgUFNXIGlzIHNhdmVkLCBub3QKKyAJYmVmb3JlLgorCSogdjg1MC5pZ2VuIChyZXRpKTogUmV0dXJuIHRvIGN1cnJlbnQgUEMgbm90IHByZXZpb3VzLgorCitXZWQgU2VwIDE3IDE0OjAyOjEwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltb3BzLmM6IE1vdmUgImN0cmV0IiwgImJzdyIsICJoc3ciIHRvIHY4NTAuaWdlbiwgZml4IHRyYWNpbmcuCisJKHRyYWNlX21vZHVsZSk6IEdsb2JhbCwgc2F2ZSBjb21wb25lbnQvbW9kdWxlIG5hbWUgYWNyb3NzIGluc24uCisKKwkqIHNpbW9wcy5jOiBNb3ZlICJic2giIHRvIHY4NTAuaWdlbiwgZml4LgorCQorCSogdjg1MC5pZ2VuIChjYWxsdCk6IExvYWQgY29ycmVjdCBudW1iZXIgb2YgYnl0ZXMuIEZpeCB0cmFjaW5nLgorCShzdHNyLCBsZHNyKTogQ29ycmVjdCBzcmMsIGRlc3QgZmllbGRzLiBGaXggdHJhY2luZy4KKwkoY3RyZXQpOiBGb3JjZSBhbGlnbm1lbnQuICBGaXggdHJhY2luZy4KKwkKK1R1ZSBTZXAgMTYgMjI6MTQ6MDEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAodHJhY2Vfb3V0cHV0KTogQWRkIHJlc3VsdCBhcmd1bWVudC4KKwkodHJhY2VfcmVzdWx0KTogTmV3IGZ1bmN0aW9uLiAgU2ltcGxlciB2ZXJzaW9uIG9mIHRyYWNlX291dHB1dCwKKyAJYXNzdW1lcyB0cmFjZSBuZWVkZWQuCisJKHRyYWNlX291dHB1dCk6IENhbGwgdHJhY2VfcmVzdWx0LgorCSh0cmFjZV9vdXRwdXQpOiBGb3IgSU1NX1JFR19SRUcsIHRyYWNlIGNvcnJlY3QgcmVnaXN0ZXIuCisJKHRyYWNlX2lucHV0KTogQWRkIGNhc2UgZm9yIDE2Yml0IGltbWVkaWF0ZXMuCisJKE9QXzYwMCwgT1BfNjQwLCBPUF82ODAsIE9QXzZDMCwgT1BfNkEwKTogVXNlLgorCisJKiBzaW0tbWFpbi5oIChUUkFDRV9BTFVfSU5QVVQsIFRSQUNFX0FMVV9SRVNVTFQpOiBEZWZpbmUuCisJKHRyYWNlX3ZhbHVlcywgdHJhY2VfbmFtZSwgdHJhY2VfcGMsIHRyYWNlX251bV92YWx1ZXMpOiBNYWtlCisgCWdsb2JhbC4KKwkoR1IsIFNSKTogRGVmaW5lLgorCQorCXY4NTAuaW5zbiAobW92ZWEsIHN0c3IpOiBVc2UuCisJKHN4Yiwgc3hoLCB6eGIsIHp4aCk6IERpdHRvLgorCQorVHVlIFNlcCAxNiAyMToxNDowMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jOiBNb3ZlICJtb3ZlYSIgZnJvbSBoZXJlLgorCSogdjg1MC5pZ2VuOiBUbyBoZXJlLgorCisJKiB2ODUwLmlnZW4gKHNpbW0xNik6IERlZmluZSwgc2lnbiBleHRlbmQgaW1tMTYuCisJKHVpbW0xNik6IERlZmluZSwgbm8gc2lnbiBleHRlbnNpb24uCisJKGFkZGksIGFuZGksIG1vdmVhLCBtb3ZoaSwgbXVsaGksIG9yaSwgc2F0c3ViaSwgeG9yaSk6IFVzZS4KKwkKKwkqIHNpbW9wcy5jOiBNb3ZlICJzeGgiLCAic3dpdGNoIiwgInN4YiIsICJjYWxsdCIsICJkaXNwb3NlIiwKKyAJIm1vdjMyIiBmcm9tIGhlcmUuCisJKiB2ODUwLmlnZW46IFRvIGhlcmUuCisJKHN3aXRjaCk6IEZpeCBvZmYgYnkgdHdvIGVycm9yIGluIE5JQSBjYWxjLgorCQorVHVlIFNlcCAxNiAxNToxNDowMSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jICh0cmFjZV9wYywgdHJhY2VfbmFtZSwgdHJhY2VfdmFsdWVzLCB0cmFjZV9udW1fdmFsdWVzKToKKyAJTmV3IHN0YXRpYyBnbG9iYWxzLgorCSh0cmFjZV9pbnB1dCk6IEp1c3Qgc2F2ZSBwYywgbmFtZSBhbmQgdmFsdWVzIGZvciB0cmFjZV9vdXRwdXQuCisJKHRyYWNlX291dHB1dCk6IFdyaXRlIHRyYWNlIHZhbHVlcyB0byBhIGJ1ZmZlci4gIFVzZQorIAl0cmFjZV9vbmVfaW5zbiB0byBwcmludCB0cmFjZSBpbmZvIGFuZCBidWZmZXIuCisJKFNJWkVfT1BFUkFORFMsIFNJWkVfTE9DQVRJT04pOiBEZWxldGUuCisJCitUdWUgU2VwIDE2IDA5OjAyOjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLW1haW4uaCAoc3RydWN0IF9zaW1fY3B1KTogQWRkIHBzd19tYXNrIHNvIHRoYXQgcmVzZXJ2ZWQgYml0cworIAljYW4gYmUgbWFza2VkIG91dC4KKworCSogc2ltb3BzLmMgKE9QXzIwMDdFMCwgT1BfNDAwN0UwKTogTW92ZSAibGRzciIsICJzdHNyIgorIAlpbnN0cnVjdGlvbnMgZnJvbSBoZXJlLgorCSogdjg1MC5pZ2VuIChsZHNyLCBzdHNyKTogVG8gaGVyZS4gIE1hc2sgb3V0IHJlc2VydmVkIGJpdHMgd2hlbgorIAlzZXR0aW5nIFBTVy4KKwkKKwkqIGludGVycC5jIChzaW1fb3Blbik6IFNldCBwc3dfbWFzayBpZiBtYWNoaW5lIGtub3duLgorCitUdWUgU2VwIDE2IDEwOjIwOjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogdjg1MC1kYzogQWRkIHJ1bGUgdG8gZGlmZXJlbnRpYXRlIGJldHdlZW4gYnJlYWtwb2ludCBhbmQgZGl2aC4KKwkqIHY4NTAuaWdlbiAoYnJlYWspOiBOZXcgaW5zdHJ1Y3Rpb24sIGJyZWFrcG9pbnQgc2ltdWxhdG9yLgorCSogdjg1MC5pZ2VuIChicmVha3BvaW50KTogRW5hYmxlLiAgQ2hhbmdlIHRvIGEgMzJiaXQgaW5zdHJ1Y3Rpb24uCisKK01vbiBTZXAgMTUgMTg6NDQ6MDUgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAoTXVsdGlwbHk2NCk6IERvbid0IHN0b3JlIGludG8gcmVnaXN0ZXIgemVyby4KKworVHVlIFNlcCAxNiAwOTowMjowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChzZW1hbnRpY3Mubyk6IEFkZCBkZXBlbmRlbmN5LgorCisJKiBzaW0tbWFpbi5oIChTQVZFXzEsIFNBVkVfMik6IFBlcmZvcm0gYmFja3dhcmQgY29tcGF0aWJsZSBzYXZlLAorIAlkbyBub3QgYWRqdXN0IENJQS9OSUEuCisKK01vbiBTZXAgMTUgMTc6MzY6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAoT1BfMzAwLCBPUF80MDAsIE9QXzcwKTogTWFrZSBiZWhhdm91ciBkZXBlbmQgb24gUFNXW1VTXS4KKwkKKwkqIHNpbW9wcy5jOiBNb3ZlICJkaXZ1biIsICJzbGQuYnUiLCAiZGl2aG4iLCAiZGl2aHVuIiwgImRpdm4iLAorIAkiZGl2dW4iLCAicHVzaG1sIiBjb2RlIGZyb20gaGVyZSB0byB2ODUwLmlnZW4uCisJKGRpdnVuKTogTWFrZSBnbG9iYWwuCisJKHR5cGUzX3JlZ3MpOiBNYWtlIGdsb2JhbAorCQorCSogdjg1MC5pZ2VuOiBNb3ZlIHNpbW9wcy5jIGNvZGUgdG8gaGVyZS4KKworCSogaW50ZXJwLmMgKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBGb3Igdjg1MGVxIHNldCBVUyBiaXQgYnkKKyAJZGVmYXVsdC4KKworCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogRG9uJ3Qgc2V0IGFyY2gsIG5vdyBzZXQgYnkKKyAJc2ltX2FuYWx5emVfcHJvZ3JhbS4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gU2VwIDE1IDE0OjM5OjM0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltb3BzLmMgKG9wX3R5cGVzKTogTW92ZSBmcm9tIGhlcmUuCisJc2ltLW1haW4uaDogVG8gaGVyZS4KKworCSogc2ltLW1haW4uaCAodHJhY2VfaW5wdXQsIHRyYWNlX291dHB1dCksIHNpbW9wcy5jOiBNYWtlIGdsb2JhbC4KKworCSogc2ltb3BzLmMgKE9QXzYwKTogTW92ZSAiam1wIiBjb2RlIGZyb20gaGVyZS4KKwkqIHY4NTAuaWdlbiAoam1wKTogVG8gaGVyZS4KKworCSogc2ltb3BzLmMgKE9QXzYwKTogTW92ZSAic2xkLmJ1IiBjb2RlIGZyb20gaGVyZS4KKwkqIHY4NTAuaWdlbiAoc2xkLmJ1KTogVG8gaGVyZS4KKworRnJpIFNlcCAxMiAxNToxMTowMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHY4NTAuaWdlbiAocHJlcGFyZSwgLi4uKTogQWRkIHRvIHY4NTBlcSBhcmNoaXRlY3R1cmUuCisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IERlZmF1bHQgdG8gdjg1MGVxLgorCQorCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogRGVmYXVsdCB0byB2ODUwZS4KKwkqIHNpbS1tYWluLmggKHNpZ25hbC5oKTogSW5jbHVkZS4KKworCSogdjg1MC5pZ2VuIChpbGxlZ2FsKTogUmVwb3J0L2hhbHQgaWxsZWdhbCBpbnN0cnVjdGlvbnMuCisKKwkqIE1ha2VmaWxlLmluIChTSU1fRVhUUkFfQ0ZMQUdTKTogQWRkIFNJTV9SRVNFUlZFRF9CSVRTLgorCisJKiBjb25maWd1cmUuaW46IEFkZCByZXNlcnZlZCBiaXRzIG9wdGlvbi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworVGh1IFNlcCAxMSAwODo0MDowMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IFVzZSBzaW1fZG9fY29tbWFuZGYgaW5zdGVhZCBvZiBhc3ByaW50Zi4KKworCSogc2ltLW1haW4uaCAoSU5TTl9OQU1FKTogCisKKwkqIE1ha2VmaWxlLmluIChJTkNMVURFKTogQWRkIFNJTV9FWFRSQV9ERVBTLgorCShTSU1fRVhUUkFfREVQUyk6IEFkZCBpdGFibGUuaAorCSh0bXAtZ2VuY29kZSk6IERvZXMgbm90IGRlcGVuZCBvbiBzaW1vcHMuaAorCisJKiBzaW0tbWFpbi5oIChpdGFibGUuaCk6IEluY2x1ZGUuCisJKE1BWF9JTlNOUywgSU5TTl9OQU1FKTogRGVmaW5lLgorCisJKiBpbnRlcnAuYzogQ29tcHV0ZSBpbnR0eXBlIGZyb20gdGhlIGludGVycnVwdF9uYW1lcyBpbmRleCB0aGF0CisgCXdhcyBwYXNzZWQgaW4uCisKK1dlZCBTZXAgMTAgMTA6MjU6NDAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAodHJhY2VfaW5wdXQpOiBVc2UgdHJhY2VfcHJpbnRmIGluc3RlYWQgb2YKKyAJc2ltX2lvX3ByaW50Zi4KKwkodHJhY2Vfb3V0cHV0KTogRGl0dG8uCisJKHRyYWNlX2lucHV0KTogT25seSB0cmFjZSB3aGVuIFRSQUNFX0FMVV9QLiAgRGVsZXRlIGNvZGUKKyAJZGlzYXNlbWJsaW5nIGluc3RydWN0aW9uLgorCSh0cmFjZV9vdXRwdXQpOiBPbmx5IHRyYWNlIHdoZW4gVFJBQ0VfQUxVX1AuCisKK1R1ZSBTZXAgIDkgMDE6Mjk6NTAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAodHJhY2VfaW5wdXQsIHRyYWNlX291dHB1dCk6IFVzZSBzaW1faW9fcHJpbnRmLgorCShPUF82MjApOiBQYXNzIGNvcnJlY3QgYXJndW1lbnQgdG8gdHJhY2UuCisJKE9QX0U2MDdFMCk6IERpdHRvLgorCSh0cmFjZV9pbnB1dCk6IE9idGFpbiBwcm9nX2JmZCwgdGV4dF9zdGFydCBldC5hbCBmcm9tIHNpbXVsYXRvcgorIAlzdHJ1Y3QuCisKK01vbiBTZXAgIDggMjE6MDM6NTIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiB2ODUwLmlnZW46IE5ldyBmaWxlLgorCSogdjg1MC1kYzogTmV3IGZpbGUuCisKK01vbiBTZXAgIDggMTg6MzM6MDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisKKwkqIHNpbS1tYWluLmggKFNFWFQxNik6IERlbGV0ZSwgdXNlIEVYVEVORDE2LgorCShTRVhUOCk6IERlbGV0ZSwgdXNlIEVYVEVORDguCisJKFNFWFQzMik6IERlbGV0ZSwgdXNlZD8KKwkoU0VYVDQwLCBTRVhUNDQsIFNFWFQ2NCk6IFVzZSBVTlNJR05FRDY0IGZvciBjb25zdGFudHMsIG5vdCAuLi5MTC4KKwkoV0lUSF9UQVJHRVRfV09SRF9NU0IpOiBEZWZpbmUgYXMgMzEuIHY4NTAgbGl0dGxlIGJpdCBlbmRpYW4uCisJCisJKiBzaW1vcHMuYzogVXNlIEVYVEVORDE1IGZyb20gc2ltLWJpdHMgaW5zdGVhZCBvZiBTRVhUMTYuCisKKwkqIHNpbS1tYWluLmggKERFQlVHX1RSQUNFLCBERUJVR19WQUxVRVMsIHY4NTBfZGVidWcpOiBEZWxldGUsCisgCXJlcGxhY2Ugd2l0aCBUUkFDRV9JTlNOX1AgYW5kIFRSQUNFX0FMVV9QLgorCisJKiBzaW1vcHMuYyAodHJhY2VfaW5wdXQsIHRyYWNlX291dHB1dCk6IFVwZGF0ZS4KKworCSogaW50ZXJwLmMgKHNpbV9lbmdpbmVfcnVuKTogRGVsZXRlLgorCShsb29rdXBfaGFzaCk6IERlbGV0ZS4KKwkoc2ltX29wZW4pOiBEbyBub3QgZmlsbCBoYXNoIHRhYmxlLgorCShzaW1fdHJhY2UpOiBEZWxldGUuCisKK0ZyaSBTZXAgIDUgMTc6MDQ6NDggMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAoT1BfRkZGRik6IFVzZSBzaW1fZW5naW5lX2hhbHQuCisJKE9QXzEyMDA3RTApOiBEaXR0by4KKwkoT1BfMTAwMDdFMCk6IERpdHRvLgorCisJKiBzaW0tbWFpbi5oIChzdHJ1Y3Qgc2ltX2NwdSk6IERlbGV0ZSBtZW1iZXIgZXhjZXB0aW9uLiBVc2luZworIAlzaW0tZW5naW5lIGV0LmFsLgorCisJKiBpbnRlcnAuYyAoc2ltX2luZm8pOiBEbyBub3QgZG8gYW55dGhpbmcgaW4gc2ltLWluZm8uCisJKHNpbV9zdG9wKTogRGVsZXRlLCByZXBsYWNlIHdpdGggc2ltLXN0b3AuCisJKHNpbV9zdG9wX3JlYXNvbik6IERlbGV0ZSwgcmVwbGFjZSB3aXRoIHNpbS1yZWFzb24uCisKKwkqIHNpbS1tYWluLmggKFdJVEhfV0FUQ0hQT0lOVFMpOiBEZWZpbmUuCisJKFdJVEhfTU9EVUxPX01FTU9SWSk6IERlZmluZQorCQorCSogTWFrZWZpbGUuaW4gKFNJTV9PQkpTKTogQWRkIHNpbS1yZXN1bWUsIHNpbS13YXRjaCwgc2ltLXN0b3AsCisgCXNpbS1yZWFzb24uCisKKwkqIGludGVycC5jIChlbnVtIGludGVycnVwdF9jb25kX3R5cGUpOiBEZWxldGUuCisJKHN0cnVjdCBpbnRlcnJ1cHRfZ2VuZXJhdG9yKTogRGVsZXRlLgorCShlbnVtIGludGVycnVwdF90eXBlKTogRHJvcCBpbnRfbm9uZS4KKwkoc2ltX29wZW4pOiBJbml0aWFsaXplIFdBVENIUE9JTlQgbW9kdWxlLgorCShzaW1fcmVzdW1lLCBzaW1fcnVuKTogUmVuYW1lIHNpbV9yZXN1bWUgdG8gc2ltX3J1bi4KKwkoc2ltX2VuZ2luZV9ydW4pOiBSZXBsYWNlIGludGVycnVwdCBjb2RlIHdpdGggY2FsbCB0byBzaW0tZXZlbnRzLgorCShzaW1fc2V0X2ludGVycnVwdCk6IERlbGV0ZS4KKwkoc2ltX3BhcnNlX251bWJlcik6IERlbGV0ZS4KKworVGh1IFNlcCAgNCAxNzoyMToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmE+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVGh1IFNlcCAgNCAxODoxMTozNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChmZXRjaF9hcmd2KTogTmV3IGZ1bmN0aW9uLCBmZXRjaCBhIGFyZyB2ZWN0b3IgZnJvbQorIAlzaW11bGF0b3IgbWVtb3J5LgorCisJKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBmb3JrLCBleGVjdmUsIGV4ZWN2LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCisJKiBpbnRlcnAuYyAoc2ltX3N0b3JlX3JlZ2lzdGVyLCBzaW1fZmV0Y2hfcmVnaXN0ZXIpOiBVc2UgSDJUXzQgYW5kCisgCVQySF80IGZvciBieXRlIHN3YXBwaW5nLgorCisJKiBzaW0tbWFpbi5oLCBpbnRlcnAuYyAoZ2V0X3dvcmQsIGdldF9oYWxmLCBnZXRfYnl0ZSwgcHV0X3dvcmQsCisgCXB1dF9oYWxmLCBwdXRfYnl0ZSk6IERlbGV0ZS4KKworCSogTWFrZWZpbGUuaW4gKFNJTV9PQkpTKTogQWRkIHNpbS1tZW1vcHQubyBtb2R1bGUuCisKKwkqIHNpbS1tYWluLmggKGxvYWRfbWVtLCBzdG9yZV9tZW0pOiBSZWRlZmluZSBhcyBtYWNyb3MuCisJKElNRU0sIElNRU1fSU1NRUQpOiBOZXcgbWFjcm9zIC0gZmV0Y2ggaW5zdHJ1Y3Rpb25zLgorCisJKiBzaW1vcHMuYyAoT1BfMTAwMDdFMCk6IEZvciBTWVNfcmVhZCwgU1lTX3dyaXRlLCBTWVNfb3BlbgorIAl0cmFuc2ZlciBkYXRhIHZpYSBhIGJ1ZmZlci4KKwkoZmV0Y2hfc3RyKTogTmV3IGZ1bmN0aW9uLCBmZXRjaCBzdHJpbmcgZnJvbSBtZW1vcnkuCisKKwkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0taHJ3Lm8gbW9kdWxlLgorCisJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBFc3RhYmxpc2ggbWVtb3J5IG1hcHMgdXNpbmcgc2ltLW1lbW9wdC5jCisgCXZpYSBzaW1fZG9fY29tbWFuZC4KKwkoc2ltX2RvX2NvbW1hbmQpOiBQcmludCBlcnJvciBpZiBtZW1vcnktbWFwIGNvbW1hbmQgaXMgdXNlZC4gQ2FsbAorIAlzaW1fYXJnc19jb21tYW5kLgorCShtYXApOiBEZWxldGUsIHJlcGxhY2VkIGJ5IHNpbS1jb3JlLgorCShzaW1fbWVtb3J5X2luaXQpOiBEZWxldGUsIHJlcGxhY2VkIGJ5IHNpbS1jb3JlLgorCShzaW1fc2V0X21lbW9yeV9tYXApOiBEZWxldGUsIHJlcGxhY2VkIGJ5IHNpbS1tZW1vcHQuCisJKGxvYWRfbWVtKTogRGVsZXRlLCByZXBsYWNlZCBieSBzaW0tY29yZS4KKwkoc3RvcmVfbWVtKTogRGVsZXRlLCByZXBsYWNlZCBieSBzaW0tY29yZS4KKwkoc2ltX3dyaXRlKTogRGVsZXRlLCByZXBsYWNlZCBieSBzaW0taHJ3LgorCShzaW1fcmVhZCk6IERlbGV0ZSwgcmVwbGFjZWQgYnkgc2ltLWhydy4KKworCSogc2ltLW1haW4uaCAoc3RydWN0IHNpbV9zdGF0ZSk6IFJlbW92ZSBtZW1vcnkgbWVtYmVycywgdXNpbmcKKyAJc2ltLWNvcmUuYworCitXZWQgU2VwICAzIDEwOjE4OjU1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogc2ltLW1haW4uaDogUmVwbGFjZSBTSU1fSEFWRV9GTEFUTUVNIHdpdGggbWVtIHB0ci4KKwkqIGludGVycC5jIChtYXApOiBEbyBub3QgYWRkIHRvIGEgdm9pZCBwb2ludGVyLgorCQorCSogTWFrZWZpbGUuaW4gKElOQ0xVREUpOiBBZGQgc2ltLW1haW4uaAorCisJKiBjb25maWd1cmUuaW46IENoZWNrIGZvciB0aW1lLmgKKwkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCisKKwkqIGludGVycC5jIChzdHJ1Y3QgaW50ZXJydXB0X2dlbmVyYXRvcik6IE1ha2UgdGltZSB1bnNpZ25lZCBsb25nLAorIAlhZGRyZXNzIFNJTV9BRERSLgorCShzaW1fcmVzdW1lKTogTWFrZSBvbGRwYyBTSU1fQUREUi4KKwkoc3RydWN0IGhhc2hfZW50cnkpOiBNYWtlIG1hc2svb3Bjb2RlIHVuc2lnbmVkLgorCisJKiB2ODUwX3NpbS5oIChzdHJ1Y3Qgc2ltb3BzICk6IE1ha2Ugb3Bjb2RlIGFuZCBtYXNrIHVuc2lnbmVkLgorCisJKiBzaW1vcHMuYyAodXRpbWUuaCk6IEluY2x1ZGUgaWYgYXZhaWxhYmxlLgorCShPUF8xMDAwN0UwKTogQ2hlY2sgZm9yIFVUSU1FIGZ1bmN0aW9uLgorCShkaXZ1bik6IFB1dCBwYXJlbnRoZXNlcyBhcm91bmQgc2hpZnQgYXJndW1lbnQuCisJKE9QXzY0MCk6IFB1dCBwYXJlbnRoZXNlcyBhcm91bmQgc2hpZnQgYXJndW1lbnQsIHdhcyB3cm9uZy4KKwkoT1BfMTA3RjApOiBSZXR1cm4gc29tZXRoaW5nLgorCisJKiBpbnRlcnAuYyAoc2ltX3BhcnNlX251bWJlcik6IFVzZSBzdHJ0b3VsIG5vdCBzdHJ0b2wuCisJKHNpbV9yZXN1bWUpOiBVc2Ugc2ltX2VsYXBzZWRfdGltZV9nZXQgdG8ga2VlcCB0cmFjayBvZiB0aGUgdGltZS4KKworCSogY29uZmlndXJlLmluIChTSU1fQUNfT1BUSU9OX1dBUk5JTkdTKTogQWRkLgorIAkoU0lNX0FDX09QVElPTl9FTkRJQU4pOiBTZXQgdG8gaGFyZHdpcmVkIGJpZy4KKwkoU0lNX0FDX09QVElPTl9IT1NUX0VORElBTik6IEFkZC4KKwkoQUNfQ0hFQ0tfRlVOQ1MpOiBBZGQgdXRpbWUuCisJKEFDX0NIRUNLX0hFQURFUlMpOiBBZGQgc3RkbGliLmgsIHN0cmluZy5oLCBzdHJpbmdzLmgsIHV0aW1lLmgKKwljb25maWd1cmU6IFJlZ2VuZXJhdGUuCisJCisKKwkqIE1ha2VmaWxlLmluIChTSU1fUlVOX09CSlMpOiBVc2UgbnJ1bi5vLgorCShTSU1fT0JKUyk6IEFkZCBzaW0taW8ubywgc2ltLWhsb2FkLm8sIHNpbS11dGlscy5vLCBzaW0tb3B0aW9ucy5vLAorIAlzaW0tY29uZmlnLm8sIHNpbS1tb2R1bGUubywgc2ltLWV2ZW50cy5vLCBzaW0tY29yZS5vLAorIAlzaW0tZW5kaWFuLm8sIHNpbS1lbmdpbmUubywgc2ltLXRyYWNlLm8sIHNpbS1wcm9maWxlLm8KKwkoU0lNX0VORElBTiwgU0lNX1dBUk5HSU5TKTogRGVmaW5lLgorCisJKiBzaW1vcHMuYyAoT1BfMTAwMDdFMCk6IFVzZSBzaW1faW9fKiBmb3IgdHJhbnNmZXJzLgorCisJKiBpbnRlcnAuYyAoc2ltX3Jlc3VtZSk6IFBhc3Mgc2QgYXJvdW5kLgorCisJKiBzaW1vcHMuYyAoc2ltLW1haW4uaCk6IEluY2x1ZGUuCisKKwkqIGdlbmNvZGUuYyAod3JpdGVfdGVtcGxhdGUpOiBHZW5lcmF0ZSAjaW5jbHVkZSBzaW0tbWFpbi5oLgorCSh3cml0ZV9vcGNvZGVzKTogRGl0dG8uCisJCisJKiBpbnRlcnAuYyAocHJvZ19iZmQsIHByb2dfYmZkX3dhc19vcGVuZWRfcCk6IERlbGV0ZS4KKwkodjg1MF9jYWxsYmFjayk6IERpdHRvLgorCShzaW1fa2luZCwgbXluYW1lKTogRGl0dG8uCisJKGxvb2t1cF9oYXNoKTogUGFzcyBTRC4gVXNlIHNpbV9pb19lcnJvci4KKwkoc2ltX3NldF9tZW1vcnlfbWFwKTogUGFzcyBpbiBTRCwgdXNlLgorCShpbml0X3N5c3RlbSk6IFBhc3MgaW4gU0QsIHVzZS4KKwkoc2ltX29wZW4pOiBVcGRhdGUuCisJKHNpbV9zZXRfcHJvZmlsZSk6IERlbGV0ZS4KKwkoc2ltX3NldF9wcm9maWxlX3NpemUpOiBEZWxldGUuCisJKGRvX2ludGVycnVwdCk6IFBhc3MgaW4gU0QsIHVzZS4KKwkoc2ltX2luZm8pOiBVc2Ugc2ltX2lvX3ByaW50Zi4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFJlc2V0IHJlZ2lzdGVycy4gIFNldCBQQyBmcm9tIHByb2dfYmZkCisgCWFyZ3VtZW50LgorCShzaW1fbG9hZCk6IERlbGV0ZSwgdXNlIGNvbW1vbi9zaW0taGxvYWQuYworCShzaW1fc2l6ZSk6IFJlbmFtZSB0byBzaW1fbWVtb3J5X2luaXQuCisJKHNpbV93cml0ZSk6IFJlbW92ZSBjYWxsIHRvIGluaXRfc3lzdGVtLgorCShpbml0X3N5c3RlbSk6IERlbGV0ZS4KKwkoc2ltX3NldF9jYWxsYmFja3MpOiBEZWxldGUuCisJKHNpbV9zZXRfaW50ZXJydXB0KTogUGFzcyBpbiBTRCwgdXNlLgorCShzdGFydF90aW1lKTogRGVsZXRlLgorCQorCSogdjg1MF9zaW0uaDogUmVtb3ZlIGV2ZXJ5dGhpbmcgZXhjZXB0IGBzdHJ1Y3Qgc2ltb3BzJyBmcm9tIGhlcmUuCisgCSogc2ltLW1haW4uaDogTW92ZSBtb3N0IHRvIGhlcmUuCisJKiBnZW5jb2RlLmM6IE1vdmUgI2luY2x1ZGVzIHRvIGhlcmUuCisKKwkqIHNpbS1tYWluLmgoc3RydWN0IF9zaW1fY3B1KTogUmVuYW1lIHN0cnVjdCBfc3RhdGUuCisJKCNkZWZpbmUgUEMsIGV0LmFsLik6IFVwZGF0ZQorCSh2ODUwX2NhbGxiYWNrKTogRGVsZXRlLiAgUmVwbGFjZWQgd2l0aCBTSU1fREVTQyBhcmcuCisJKGludDgsIHVpbnQ4LCBpbnQxNiwgdWludDE2LCBpbnQzMiwgdWludDMyKTogRGVmaW5lIHR5cGVzIHVzaW5nCisgCXVuc2lnbmVkOCBldC5hbCBmcm9tIGNvbW1vbi9zaW0tdHlwZXMuaC4KKwkqIHNpbS1tYWluLmggKFN0YXRlKTogRGVmaW5lIGFzIFNUQVRFX0NQVS4KKworTW9uIFNlcCAgMSAxMjowNzo1NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIHRpbWUsIGNobW9kLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgorCSogc2ltb3BzLmMgKFNZU190aW1lLCBTWVNfY2htb2QpOiBVc2UgSEFWRV9USU1FLCBIQVZFX0NITU9ELgorCQorCSogc2ltb3BzLmMgKC4uLy4uL2xpYmdsb3NzL3Y4NTAvc3lzL3N5c2NhbGwuaCk6IEluY2x1ZGUgaW5zdGVhZCBvZgorIAlzeXMvc3lzY2FsbC5oLgorCShPUF8xMDAwN0UwKTogQ2hlY2sgdGhlIGV4aXN0YW5jZSBlYWNoIFNZU18qIG1hY3JvIGluZGVwZW5kYW50bHkuCisKKwkqIHY4NTBfc2ltLmggKFNJR1FVSVQsIFNJR1RSQVApOiBPbmx5IGRlZmluZSBpZiBtaXNzaW5nLgorCitXZWQgQXVnIDI3IDE4OjEzOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworVHVlIEF1ZyAyNiAxMDo0MjozOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fa2lsbCk6IERlbGV0ZS4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEFkZCBBQkZEIGFyZ3VtZW50LgorCShzaW1fbG9hZCk6IE1vdmUgc2V0dGluZyBvZiBQQyBmcm9tIGhlcmUuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBUbyBoZXJlLgorCitNb24gQXVnIDI1IDE3OjUwOjIyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworTW9uIEF1ZyAyNSAxMTozMToyMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IEFkZCBBQkZEIGFyZ3VtZW50LgorCitGcmkgQXVnIDIyIDEwOjM5OjI4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChic2gpOiBPbmx5IHNldCBDWSBmbGFnIGlmIGVpdGhlciBvZiB0aGUgYm90dG9tCisJYnl0ZXMgaXMgemVyby4KKwkKKwkqIHNpbW9wcy5jIChwcmVwYXJlLCBkaXNwb3NlKTogTG93ZXIgbnVtYmVyZWQKKwlyZWdpc3RlcnMgZ28gdG8gaGlnaGVyIG51bWJlcmVkIGFkZHJlc3MuCisKKwkqIHNpbW9wcy5jICh1bnNpZ25lZCBkaXZpZGUgaW5zdHJ1Y3Rpb25zKTogUyBiaXQgc2V0IGlmIHJlc3VsdCBoYXMKKwl0b3AgYml0IHNldC4KKwkKKwkqIHNpbW9wcy5jIChwdXNobWwsIHB1c2htaCwgcG9wbWwsIHBvcG1oKTogTG93ZXIgbnVtYmVyZWQKKwlyZWdpc3RlcnMgZ28gdG8gaGlnaGVyIG51bWJlcmVkIGFkZHJlc3MuCisJCitXZWQgQXVnIDIwIDEzOjU2OjM1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF8xMDdFMCwgT1BfMTA3RjAsIE9QXzMwN0UwLCBPUF8zMDdGMCk6IFVzZSBjb3JyZWN0CisJaW50ZXJwcmV0YXRpb24gb2YgU1IgYml0IGluIGxpc3QxOCBzdHJ1Y3R1cmUuCisJKGRpdm4sIGRpdnVuKTogTmV3IGZ1bmN0aW9ucyB0byBwZXJmb3JtIE4gc3RlcCBkaXZpZGUgZnVuY3Rpb25zLgorCitNb24gQXVnIDE4IDEwOjU5OjAyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChPUF8zMDAsIE9QXzQwMCwgT1BfNjAsIE9QXzcwKTogU3VwcG9ydCB2YXJpYW50IG9wY29kZXMKKwl3aXRoIFVTIGJpdCBzZXQgaW4gdGhlIFBTVy4KKworV2VkIEF1ZyAxMyAxOTowNjo1NSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX3Jlc3VtZSk6IE9wY29kZSBmdW5jdGlvbnMgcmV0dXJuIGFtb3VudCB0byBiZQorCWFkZGVkIHRvIFBDIGFuZCBhbGwgb3Bjb2RlcyB0YWtlIGEgc3RhbmRhcmQgZm9ybWF0IGluIHRoZSBPUFtdCisJYXJyYXkuCisJCisJKGRvX2Zvcm1hdF8qKTogRnVuY3Rpb25zIHJlbW92ZWQuCisKKwkqIHY4NTBfc2ltLmggKFNQLCBFUCk6IE5ldyByZWdpc3RlciBtbmVtb25pY3MuCisJCisJKiBnZW5jb2RlLmMgKHdyaXRlX2hlYWRlcik6IEZ1bmN0aW9ucyBwcm90b3R5cGVzIHJldHVybiBhbgorCWludGVnZXIuCisKKwkqIHNpbW9wcy5jOiBPcGNvZGUgZnVuY3Rpb25zIHJldHVybiBhbW91bnQgdG8gYmUgYWRkZWQgdG8gUEMuCisJCisJKiB2ODUwX3NpbS5oIChDVFBDLCBDVFBTVywgQ1RCUCk6IE5ldyByZWdpc3RlciBtbmVtb25pY3MuCisJCisJKiBzaW1vcHMuYzogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIGluc3RydWN0aW9ucy4KKwkKKwkqIHNpbW9wcy5jOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVxIGluc3RydWN0aW9ucy4KKwkKK1R1ZSBNYXkgMjAgMTA6MjQ6MTQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBBZGQgY2FsbGJhY2sgYXJndW1lbnQuCisJKHNpbV9zZXRfY2FsbGJhY2tzKTogRGVsZXRlIFNJTV9ERVNDIGFyZ3VtZW50LgorCitUaHUgQXByIDI0IDAwOjM5OjUxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIEFwciAyMyAxNzoyMDoxNiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAocHJvZ19iZmRfd2FzX29wZW5lZF9wKTogTmV3IHN0YXRpYyBsb2NhbC4KKwkocHJvZ19iZmQpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgorCShzaW1fb3Blbik6IFVuZG8gcGF0Y2ggdG8gYWRkIC1FIHN1cHBvcnQuCisJKHNpbV9jbG9zZSk6IENsb3NlIHByb2dfYmZkIGlmIHNpbV9sb2FkIG9wZW5lZCBpdC4KKwkoc2ltX2xvYWQpOiBSZWNvcmQgYmZkIG9mIGxvYWRlZCBmaWxlIGluIHByb2dfYmZkLgorCSogc2ltb3BzLmMgKHByb2dfYmZkKTogUmVuYW1lZCBmcm9tIGV4ZWNfYmZkLgorCitGcmkgQXByIDE4IDE0OjE3OjEyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9zdG9wKTogU3R1YiBmdW5jdGlvbi4KKworVGh1IEFwciAxNyAwMzo1MzoxOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoU0lNX09CSlMpOiBBZGQgc2ltLWxvYWQuby4KKwkqIGludGVycC5jIChzaW1fa2luZCwgbXluYW1lKTogTmV3IHN0YXRpYyBsb2NhbHMuCisJKHNpbV9vcGVuKTogU2V0IHNpbV9raW5kLCBteW5hbWUuICBJZ25vcmUgLUUgYXJnLgorCShzaW1fbG9hZCk6IFJldHVybiBTSU1fUkMuICBOZXcgYXJnIGFiZmQuICBDYWxsIHNpbV9sb2FkX2ZpbGUgdG8KKwlsb2FkIGZpbGUgaW50byBzaW11bGF0b3IuICBTZXQgc3RhcnQgYWRkcmVzcyBmcm9tIGJmZC4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IFJldHVybiBTSU1fUkMuICBEZWxldGUgYXJnIHN0YXJ0X2FkZHJlc3MuCisKK1dlZCBBcHIgMTYgMTk6NTM6NTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAoT1BfMTAwMDdFMCk6IE9ubHkgcHJvdmlkZSBzeXN0ZW0gY2FsbHMgU1lTX2V4ZWN2LAorIAlTWVNfd2FpdCwgU1lTX3dhaXQsIFNZU191dGltZSwgU1lTX3RpbWUgaWYgZGVmaW5lZCBieSB0aGUgaG9zdC4KKworTW9uIEFwciAgNyAxNTo0NTowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworV2VkIEFwciAgMiAxNTowNjoyOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBOZXcgYXJnIGBraW5kJy4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgQXByICAyIDE0OjM0OjE5IDE5OTcgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgTWFyIDE5IDAxOjE0OjAwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK01vbiBNYXIgMTcgMTU6MTA6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmUtZ2VuZXJhdGUuCisKK0ZyaSBNYXIgMTQgMTA6MzQ6MTEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUaHUgTWFyIDEzIDEzOjAwOjU0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IE5ldyBTSU1fREVTQyByZXN1bHQuICBBcmd1bWVudCBpcyBub3cKKwlpbiBhcmd2IGZvcm0uCisJKG90aGVyIHNpbV8qKTogTmV3IFNJTV9ERVNDIGFyZ3VtZW50LgorCitUdWUgRmViICA0IDEzOjMzOjMwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChAQ09NTU9OX01BS0VGSUxFX0ZSQUcpOiBVc2UKKwlDT01NT05fe1BSRSxQT1NUfV9DT05GSUdfRlJBRyBpbnN0ZWFkLgorCSogY29uZmlndXJlLmluOiBzaW5jbHVkZSAuLi9jb21tb24vYWNsb2NhbC5tNC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK1RodSBKYW4gMjMgMTE6NDY6MjMgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBNYWtlZmlsZS5pbjogIFVwZGF0ZSB0byBuZXcgY29uZmlndXJlCisJc2NoZW1lIHdoaWNoIGlzIG1vcmUgY29tcGF0aWJsZSB3aXRoIFdpbkdEQiBidWlsZHMuCisJKiBjb25maWd1cmUuaW46ICBJbXByb3ZlIGNvbW1lbnQgb24gaG93IHRvIHJ1biBhdXRvY29uZi4KKwkqIGNvbmZpZ3VyZTogIFJlLXJ1biBhdXRvY29uZiB0byBnZXQgbmV3IC4uL2NvbW1vbi9hY2xvY2FsLm00LgorCSogTWFrZWZpbGUuaW46ICBVc2UgYXV0b2NvbmYgc3Vic3RpdHV0aW9uIHRvIGluc3RhbGwgY29tbW9uCisJbWFrZWZpbGUgZnJhZ21lbnQuCisKK01vbiBKYW4gMjAgMTY6MDU6MzQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAoT1Bfe0UwLDJFMCw2RTB9KTogVGhlIG11bHRpcGx5IG9wZXJhdGlvbnMgc2lnbiBleHRlbmQsCisJbm90IHplcm8gZXh0ZW5kLgorCitUdWUgSmFuIDE0IDE3OjA2OjAzIDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIHNpbW9wcy5jOiAgUHV0IGlmZGVmcyBhcm91bmQgdGhpbmdzIHRvIG1ha2UgTVNWQyBoYXBweS4gIEdldCByaWQKKwlvZiB1bmlzdGQuaC4gIERpc2FibGUgU1lTX3N0YXQsIFNZU19jaG93biwgU1lTX3RpbWUsIFNZU190aW1lcywKKwlTWVNfZ2V0dGltZW9mZGF5IGFuZCBTWVNfdXRpbWUgZnJvbSBNU1ZDLgorCitUdWUgRGVjIDMxIDE4OjExOjEzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KKworCSogc2ltb3BzLmMgKE9QXzEwMDA3RTApOiBLbm93IHRoYXQga2lsbCBlbmNvZGVzIHRoZSBzaWduYWwgbnVtYmVyCisJdmlhOiAweGRlYWQwMDAwIHwgc2lnbmFsIGFuZCB0dXJuIGl0IGJhY2sgaW50byBhIHNpZ25hbC4KKworRnJpIERlYyAyNyAxNDo0NDowNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHY4NTBfc2ltLmggKFNJR19WODUwX0VYSVQpOiBEZWZpbmUgYXMgLTEuCisKKwkqIGludGVycC5jIChzaW1fb3Blbik6IENhc3QgY2FsbG9jIGZ1bmN0aW9uLgorCShzaW1fc3RvcF9yZWFzb24pOiBJZiBzaWduYWwgaXMgU0lHX1Y4NTBfRVhJVCwgaW5mb3JtIGdkYiB0aGUKKwlwcm9ncmFtIGV4aXRlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBleGl0IGNvZGUuCisJKHNpbV9zZXRfaW50ZXJydXB0KTogRGVjbGFyZSBidWlsZGFyZ3YuCisKKwkqIHNpbW9wcy5jIChPUF8xMDAwN0UwKTogTWFrZSBleGl0IHNpZ25hbCBub3JtYWwgZXhpdC4gIE1ha2UgdGltZQorCXR5cGUgY29ycmVjdCBhbmQgd29yayBvbiBiaWcgZW5kaWFuIHN5c3RlbXMuCisKK1dlZCBOb3YgMjAgMDI6MTg6NDQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IERlbGV0ZSBzdHVmZiBtb3ZlZCB0byAuLi9jb21tb24vTWFrZS1jb21tb24uaW4uCisJKFNJTV9PQkpTLFNJTV9FWFRSQV9DRkxBR1MsU0lNX0VYVFJBX0NMRUFOKTogRGVmaW5lLgorCSogY29uZmlndXJlLmluOiBTaW1wbGlmeSB1c2luZyBtYWNyb3MgaW4gLi4vY29tbW9uL2FjbG9jYWwubTQuCisJQ2FsbCBBQ19DSEVDS19IRUFERVJTKHVuaXN0ZC5oKS4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBjb25maWcuaW46IE5ldyBmaWxlLgorCSogc2ltb3BzLmM6ICNpbmNsdWRlICJjb25maWcuaCIuICAjaW5jbHVkZSA8dW5pc3RkLmg+IGlmIHByZXNlbnQuCisKK1N1biBOb3YgIDMgMjM6MDI6NTQgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgorCisJKiB2ODUwX3NpbS5oIChTdGF0ZSk6IE5ldyBzbG90cyBkdW1teV9tZW0sIHBlbmRpbmdfbm1pLgorCShFSVBDLCBldGMpOiBOZXcgbWFjcm9zIGZvciBzeXN0ZW0gcmVnaXN0ZXJzLgorCSogc2ltb3BzLmMsIGludGVycC5jOiBVc2UgZXZlcnl3aGVyZS4KKworCSogaW50ZXJwLmM6IEFkZCBzdXBwb3J0IGZvciBpbnRlcnJ1cHRzIGlzc3VlZCBieSBpbnRlcnJ1cHQKKwlnZW5lcmF0b3JzLCBlaXRoZXIgUEMtIG9yIHRpbWUtYmFzZWQuICBDb250cm9sbGVkIGJ5IHNpbXVsYXRvcgorCWNvbW1hbmQgInNpbSBpbnRlcnJ1cHQiLgorCisJKiBpbnRlcnAuYzogQWRkIHN1cHBvcnQgZm9yIHZhcmlhYmxlLXNpemUgYWxsb2NhdGlvbiBvZiBtZW1vcnksCisJdmlhIHNpbXVsYXRvciBjb21tYW5kICJzaW0gbWVtb3J5LW1hcCIuCisJKG1hcCk6IElzc3VlIFNJR1NFR1YgZm9yIHJlZmVyZW5jZXMgdG8gaW52YWxpZCBtZW1vcnkgcmVnaW9ucy4KKwkKK1RodSBPY3QgMzEgMTQ6NDQ6MTAgMTk5NiAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+CisgICAgICAgIAorICAgICAgICAqIHNpbW9wcy5jOiBJbmNsdWRlIDxzeXMvdGltZS5oPiBmb3Igc3RydWN0IHRpbWV2YWwgYW5kIAorICAgICAgICBzdHJ1Y3QgdGltZXpvbmUuCisgICAgICAgIAorV2VkIE9jdCAzMCAwODo0OToxMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIHNpbW9wcy5jIChPUF8xMDAwN0UwKTogSGFuZGxlIFNZU190aW1lcyBhbmQgU1lTX2dldHRpbWVvZmRheS4KKworCSogc2ltb3BzLmMgKE9QXzEwMDA3RTApOiBIYW5kbGUgU1lTX3RpbWUuCisKK1R1ZSBPY3QgMjkgMTQ6MjI6NTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYzogSW5jbHVkZSA8c3lzL3N0YXQuaD4uCisJKE9QXzEwMDA3RTApOiBIYW5kbGUgU1lTX3N0YXQuCisKK1RodSBPY3QgMjQgMTI6MjY6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYyAoT1BfMTAwMDdFMCk6IERvbid0IGRlY2xhcmUgZXJybm8uCisKKwkqIHNpbW9wcy5jIChPUF81MDApOiBNYXNrIG9mZiBsb3cgYml0IGluIGRpc3BsYWNlbWVudAorCWZvciBzbGQudy4KKwkoT1BfNTAxKTogU2ltaWxhcmx5LgorCisJKiBzaW1vcHMuYyAoT1BfNTAwKTogRml4IGRpc3BsYWNlbWVudCBoYW5kbGluZyBmb3Igc2xkLncuCisJKE9QXzUwMSk6IFNpbWlsYXJseSBmb3Igc3N0LncuCisKKwkqIHNpbW9wcy5jICh0cmFjZV9pbnB1dCk6IFJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byBTRVhUNy4KKwkoT1BfMzAwLCBPUF80MDAsIE9QXzUwMCwgT1BfMzgwLCBPUF80ODAsIE9QXzUwMSk6IERpc3BsYWNlbWVudAorCWlzIHplcm8gZXh0ZW5kZWQgZm9yIHNzdC9zbGQgaW5zdHJ1Y3Rpb25zLgorCSogdjg1MF9zaW0uaCAoU0VYNyk6IERlbGV0ZS4gIEl0J3Mgbm8gbG9uZ2VyIG5lZWRlZCAoYW5kIGl0CisJd2FzIGluY29ycmVjdCBhbnl3YXkpLgorCitUaHUgT2N0IDI0IDEwOjMzOjMzIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIE1ha2VmaWxlLmluOiAgR2V0IHJpZCBvZiBzcmNyb290LiAgU2V0IGFsbCBJTlNUQUxMIG1hY3JvcyB2aWEKKwlhdXRvY29uZi4KKwkqIGdlbmNvZGUuYyAod3JpdGVfb3Bjb2Rlcyk6ICBQYWQgb3BlcmFuZHMgZmllbGQgdG8gYWNjb3VudCBmb3IKKwlNU1ZDIGJyYWluZGFtYWdlLgorCSogc2ltb3BzLmM6ICBJbmNsdWRlIGVycm5vLmguICBFeGNsdWRlIFNZU19jaG93biwgc2luY2UgTVNWQworCWRvZXNuJ3Qgc3VwcG9ydCBpdC4gIChXaHkgaXMgdGhpcyBoZXJlIGluIHRoZSBmaXJzdCBwbGFjZT8hPykKKwkqIHY4NTBfc2ltLmg6ICBHZXQgcmlkIG9mIDY0IGJpdCBkZWZzLiAgQWxzbywgZ2V0IHJpZCBvZiAjZWxpZidzLgorCUNoYW5nZSBudW1iZXIgb2Ygb3BlcmFuZHMgaW4gc3RydWN0IHNpbW9wcyBmcm9tIDkgdG8gNi4gIERlZmluZQorCVNJR1RSQVAgYW5kIFNJR1FVSVQgZm9yIE1TVkMuCisKK1R1ZSBPY3QgMTUgMTY6MTk6NTEgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogaW50ZXJwLmMgKE1FTV9TSVpFKTogIEl0J3Mgbm93IGJ5dGVzLCBub3QgYSBwb3dlciBvZiAyLgorCSogKG1hcCk6ICBBZGQgc3VwcG9ydCBmb3IgZXh0ZXJuYWwgbWVtIGluIHRoZSAxLT4yIG1lZyByYW5nZS4KKwlBbHNvLCBhYm9ydCgpIHdoZW4gbWVtb3J5IGFjY2VzcyBpcyB3YXkgb3V0IG9mIGJvdW5kcy4gIChCZXR0ZXIgdG8KKwlkaWUgdGhhbiB0byBnaXZlIHdyb25nIHJlc3VsdC4gIChUaGlzIHdpbGwgYmUgZml4ZWQgbGF0ZXIuKSkKKwkqIChzaW1fc2l6ZSk6ICBNRU1fU0laRSBpcyBub3cgYnl0ZXMsIG5vdCBzaGlmdCBmYWN0b3IuCisKK1R1ZSBPY3QgIDEgMTU6NTM6MjQgMTk5NiAgR2F2aW4gS29jaCA8Z2F2aW5AY3lnbnVzLmNvbT4KKyAgICAgICAgCisgICAgICAgICogc2ltb3BzLmMgKHRyYWNlX2lucHV0KTogU3dhcHBlZCBvcmRlciBvZiBvcGVyYW5kcyBmb3Igb3V0cHV0CisgICAgICAgIG91dHB1dCBvZiBPUF9JTU1fUkVHLiAgQ2hhbmdlZCB0aGUgZmV0Y2hpbmcgb2YgdGhlIG9wZXJhbmRzIGZvcgorICAgICAgICBPUF9MT0FEMzIsIGFuZCBPUF9TVE9SRTMyIHRvIHdvcmsgbGlrZSBvcC1mdW5jdGlvbi4KKyAgICAgICAgCitNb24gU2VwIDMwIDE1OjQ2OjMzIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCisKKwkqIGludGVycC5jOiAgTW92ZSBpbmNsdWRlcyBvZiByZW1vdGUtc2ltLmggYW5kIGNhbGxiYWNrLmggdG8KKwl2ODUwLXNpbS5oLgorCSogKGxvb2t1cF9oYXNoKTogQWRkIFBDIHRvIHJlcG9ydCBvZiBoYXNoIGZhaWx1cmUuCisJKiAobWFwIGxvYWRfbWVtIHN0b3JlX21lbSk6ICBOZXcgbWVtb3J5IHN1YnN5c3RlbS4gIE1vZGVscyBWODUxCisJbWVtb3J5IHN5c3RlbS4KKwkqIChzaW1fd3JpdGUgc2ltX3JlYWQpOiAgVXNlIG5ldyBtZW1vcnkgc3Vic3lzdGVtLgorCSogKHNpbV9yZXN1bWUpOiAgRG9uJ3QgbG9hZCBhbmQgc2F2ZSBQQyBpbnRvIEVJUEMgYW55bW9yZS4gIE5lZWRlZAorCXRvIG1ha2UgdXNlci1kZWZpbmVkIHRyYXBzIHdvcmsgcmlnaHQuCisJKiBzaW1vcHMuYyAoT1BfKik6ICBVc2UgbmV3IG1lbW9yeSBzdWJzeXN0ZW0uCisJKiAoT1BfMTQwMDdFMCAocmV0aSkpOiAgSW1wbGVtZW50IHJldGkuCisJKiAoT1BfMTQ5OTZFMCAodHJhcCkpOiAgSW1wbGVtZW50IHVzZXItZGVmaW5lZCB0cmFwcy4gIE1vdmUgSS9PIHRvCisJdHJhcCAzMS4gIFVzZSBuZXcgbWVtb3J5IHN1YnN5c3RlbS4KKwkqIHY4NTBfc2ltLmg6ICBQcm90b3R5cGVzIGZvciBsb2FkX21lbSwgc3RvcmVfbWVtIGFuZCBtYXAuICBVc2UKKwlsb2FkX21lbSBpbiBSTFcgbWFjcm8uCisKK0ZyaSBTZXAgMjcgMTg6MzQ6MDkgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogZ2VuY29kZS5jICh3cml0ZV9vcGNvZGVzKTogIE91dHB1dCBoZXggdmFsdWVzIGZvciBvcGNvZGUgbWFzaworCWFuZCBwYXR0ZXJucy4KKwkqIGludGVycC5jIChzaW1fcmVzdW1lKTogIFNhdmUgYW5kIHJlc3RvcmUgUEMgZnJvbSB0aGUgYXBwcm9wcmlhdGUKKwlyZWdpc3Rlci4KKwkqIChzaW1fZmV0Y2hfcmVnaXN0ZXIgc2ltX3N0b3JlX3JlZ2lzdGVyKTogIEZpeCBieXRlLW9yZGVyIHByb2JsZW0KKwl3aXRoIHJlYWRpbmcgYW5kIHdyaXRpbmcgcmVnaXN0ZXJzLgorCSogc2ltb3BzLmMgKE9QX0ZGRkYpOiAgSW1wbGVtZW50IHBzZXVkby1icmVha3BvaW50IGluc24uCisKK0ZyaSBTZXAgMjcgMTc6NDI6MzcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBzaW1vcHMuYyAodHJhY2VfaW5wdXQpOiBGaXggdGhpbmtvLiAKKworV2VkIFNlcCAxOCAwOTo1NDoxMiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+CisKKwkqIHNpbW9wcy5jIChleGVjX2JmZCk6IFJlbmFtZSBmcm9tIHNpbV9iZmQuCisJKHRyYWNlX2lucHV0KTogRGl0dG8uCisKK1RodSBTZXAgMTIgMTI6MDM6MDUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBzaW1vcHMuYyAodHJhY2VfaW5wdXQpOiBVc2UgZmluZF9uZWFyZXN0X2xpbmUgdG8gcHJpbnQgbGluZQorCW51bWJlciwgZnVuY3Rpb24gbmFtZSBvciBmaWxlIG5hbWUgb2YgUEMuCisKK1dlZCBTZXAgMTEgMTY6NDQ6MzcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgorCisJKiBzaW1vcHMuYzogQWRkIHRyYWNpbmcgc3VwcG9ydC4gIFVzZSBTRVhUeHggbWFjcm9zIGluc3RlYWQgb2YKKwlkb2luZyBoYXJkd2lyZWQgc2hpZnRzLgorCisJKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLXNpbS1jZmxhZ3MpOiBBZGQgc3dpdGNoIHRvIGFkZCBhZGRpdGlvbmFsCisJZmxhZ3MgdG8gc2ltdWxhdG9yIGJ1bGQuICBJZiAtLWVuYWJsZS1zaW0tY2ZsYWdzPXRyYWNlLCB0dXJuIG9uCisJdHJhY2luZy4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KKworCSogTWFrZWZpbGUuaW46IERvbid0IHJlcXVpcmUgYSBWUEFUSCBjYXBhYmxlIG1ha2UgaWYgY29uZmlndXJpbmcKKwlpbiB0aGUgc2FtZSBkaXJlY3RvcnkuICBEb24ndCB1c2UgQ0ZMQUdTIGZvciBjb25maWd1cmF0aW9uIGZsYWdzLgorCUFkZCBmbGFncyBmcm9tIC0tZW5hYmxlLXNpbS1jZmxhZ3MuICBTdXBwb3J0IGNhbmFkaWFuIGNyb3NzCisJYnVpbGRzLiAgUmVidWlsZCB3aG9sZSBzaW11bGF0b3IgaWYgaW5jbHVkZSBmaWxlcyBjaGFuZ2UuCisKKwkqIGludGVycC5jICh2ODUwX2RlYnVnKTogTmV3IGdsb2JhbCBmb3IgZGVidWdnaW5nLgorCShsb29rdXBfaGFzaCxzaW1fc2l6ZSxzaW1fc2V0X3Byb2ZpbGUpOiBVc2UKKwlwcmludGZfZmlsdGVyZWQgY2FsbGJhY2ssIGluc3RlYWQgb2YgY2FsbGluZyBwcmludGYgZGlyZWN0bHkuCisJKHNpbV97b3Blbix0cmFjZX0pOiBFbmFibGUgdHJhY2luZyBpZiAtdCBhbmQgY29tcGlsZWQgZm9yIHRyYWNpbmcuCisKKwkqIHY4NTBfc2ltLmg6IFVzZSBsaW1pdHMuaCB0byBzZXQgdGhlIHZhcmlvdXMgc2l6ZWQgdHlwZXMuCisJKFNFWFR7NSw3LDE2LDIyfSk6IE5ldyBtYWNyb3MuCisKK01vbiBTZXAgIDkgMjA6NTA6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBpbnRlcnAuYyAoaGFzaCk6IE1ha2UgdGhpcyBhbiBpbmxpbmUgZnVuY3Rpb24KKwl3aGVuIGNvbXBpbGluZyB3aXRoIEdDQy4gIFNpbXBsaWZ5LgorCSogc2ltcG9zLmM6IEV4cGxpY2l0bHkgaW5jbHVkZSAic3lzL3N5c2NhbGwuaCIuICBSZW1vdmUKKwlzb21lICNpZiAwJ2QgY29kZS4gIEVuYWJsZSBtb3JlIGVtdWxhdGVkIHN5c2NhbGxzLgorCitXZWQgU2VwICA0IDAxOjQ4OjU1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogaW50ZXJwLmM6IEZpeCBzaWduIGJpdCBoYW5kbGluZyBmb3IgYWRkIGFuZCBzdWIgaW5zdHJ1Y3Rpb25zLgorCitUdWUgU2VwICAzIDEwOjIwOjMwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogZ2VuY29kZS5jOiBGaXggdmFyaW91cyBpbmRlbnRpb24gJiBzdHlsZSBwcm9ibGVtcy4KKwlSZW1vdmUgdGVzdCBjb2RlLiAgUmVtb3ZlICNpZiAwIGNvZGUuCisJKiBpbnRlcnAuYzogUHJvdmlkZSBwcm90b3R5cGVzIGZvciBhbGwgc3RhdGljIGZ1bmN0aW9ucy4KKwlGaXggbWlub3IgaW5kZW50aW9uIHByb2JsZW1zLgorCShzaW1fb3Blbiwgc2ltX3Jlc3VtZSk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgorCShzaW1fcmVhZCk6IFJldHVybiB0eXBlIGlzICJpbnQiLgorCSogc2ltb3BzLmM6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgorCShkaXZoKTogTWFrZSByZXN1bHQgb2YgZGl2aWRlLWJ5LXplcm8gemVyby4KKwkoc2V0Zik6IEluaXRpYWxpemUgcmVzdWx0IHRvIGtlZXAgY29tcGlsZXIgcXVpZXQuCisJKHNhciBpbnN0cnVjdGlvbnMpOiBUaGVzZSBqdXN0IGNsZWFyIHRoZSBvdmVyZmxvdyBiaXQuCisJKiB2ODUwX3NpbS5oOiBQcm92aWRlIHByb3RvdHlwZXMgZm9yIHB1dF9ieXRlLCBwdXRfaGFsZgorCWFuZCBwdXRfd29yZC4KKworCSogaW50ZXJwLmM6IE9QIHNob3VsZCBiZSBhbiBhcnJheSBvZiAzMmJpdCBvcGVyYW5kcyEKKwkodjg1MF9jYWxsYmFjayk6IERlY2xhcmUuCisJKGRvX2Zvcm1hdF81KTogRml4IGV4dHJhY3Rpb24gb2YgT1BbMF0uCisJKHNpbV9zaXplKTogUmVtb3ZlIGRlYnVnZ2luZyBwcmludGYuCisJKHNpbV9zZXRfY2FsbGJhY2tzKTogRG8gc29tZXRoaW5nIHVzZWZ1bC4KKwkoc2ltX3N0b3BfcmVhc29uKTogR3Jvc3MgaGFja3MgdG8gZ2V0IGMtdG9ydHVyZSBydW5uaW5nLgorCSogc2ltb3BzLmM6IFNpbXBsaWZ5IGNvZGUgZm9yIGNvbXB1dGluZyB0YXJnZXRzIG9mIGJDQworCWluc25zLiAgIEludmVydCAncycgYml0IGlmICdvdicgYml0IGlzIHNldCBmb3Igc29tZQorCWluc3RydWN0aW9ucy4gIEZpeCAnY3knIGJpdCBoYW5kbGluZyBmb3IgbnVtZXJvdXMKKwlpbnN0cnVjdGlvbnMuICBNYWtlIHRoZSBzaW11bGF0b3Igc3RvcCB3aGVuIGEgaGFsdAorCWluc3RydWN0aW9uIGlzIGVuY291bnRlcmVkLiAgVmVyeSBjcnVkZSBzdXBwb3J0IGZvcgorCWVtdWxhdGVkIHN5c2NhbGxzICh0cmFwIDApLgorCSogdjg1MF9zaW0uaDogSW5jbHVkZSAiY2FsbGJhY2suaCIgYW5kIGRlY2xhcmUKKwl2ODUwX2NhbGxiYWNrLiAgSXRlbXMgaW4gdGhlIG9wZXJhbmQgYXJyYXkgYXJlIDMyYml0cy4KKworU3VuIFNlcCAgMSAyMjozNTozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIGludGVycC5jIChzaW1fcmVzdW1lKTogRml4IGNvZGUgdG8gY2hlY2sgZm9yIGEgZm9ybWF0IDMKKwlvcGNvZGUuCisJKiBzaW1vcHMuYzogYkNDIGluc25zIG9ubHkgYXJndW1lbnQgaXMgYSBjb25zdGFudCwgbm90IGEKKwlyZWdpc3RlciB2YWx1ZSAoZHVoLi4uKQorCitGcmkgQXVnIDMwIDEwOjMzOjQ5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKKworCSogc2ltb3BzLmM6IEZpeCAibm90MSIgYW5kICJzZXQxIi4KKworCSogc2ltb3BzLmM6IERvbid0IGZvcmdldCB0byBpbml0aWFsaXplIHRlbXAgZm9yCisJImxkLmgiIGFuZCAibGQudyIKKworCSogaW50ZXJwLmM6IFJlbW92ZSB2YXJpb3VzIGRlYnVnZ2luZyBwcmludGZzLgorCisJKiBzaW1vcHMuYzogRml4IHNhdGFkZCwgc2F0c3ViIGJvdW5kYXJ5IGNhc2UgaGFuZGxpbmcuCisKKwkqIGludGVycC5jIChoYXNoKTogRml4LgorCSogaW50ZXJwLmMgKGRvX2Zvcm1hdF84KTogR2V0IG9wZXJhbmRzIGNvcnJlY3RseSBhbmQKKwljYWxsIHRoZSB0YXJnZXQgZnVuY3Rpb24uCisJKiBzaW1vcHMuYzogUm91Z2ggY3V0IGF0ICJjbHIxIiwgIm5vdDEiLCAic2V0MSIsIGFuZCAidHN0MSIuCisKK1RodSBBdWcgMjkgMTM6NTM6MjkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQorCisJKiBpbnRlcnAuYyAoZG9fZm9ybWF0XzQpOiBHZXQgb3BlcmFuZHMgY29ycmVjdGx5IGFuZAorCWNhbGwgdGhlIHRhcmdldCBmdW5jdGlvbi4KKwkqIHNpbW9wcy5jOiBSb3VnaCBjdXQgYXQgInNsZC5iIiwgInNsZC5oIiwgInNsZC53IiwgInNzdC5iIiwKKwkic3N0LmgiLCBhbmQgInNzdC53Ii4KKworCSogdjg1MF9zaW0uaDogVGhlIFY4NTAgZG9lc24ndCBoYXZlIHNwbGl0IEkmRCBzcGFjZXMuICBDaGFuZ2UKKwlhY2NvcmRpbmdseS4gIFJlbW92ZSBtYW55IHVudXNlZCBkZWZpbml0aW9ucy4KKwkqIGludGVycC5jOiBUaGUgVjg1MCBkb2Vzbid0IGhhdmUgc3BsaXQgSSZEIHNwYWNlcy4gIENoYW5nZQorCWFjY29yZGluZ2x5LgorCShnZXRfbG9uZ2xvbmcsIGdldF9sb25nd29yZCwgZ2V0X3dvcmQpOiBEZWxldGVkLgorCSh3cml0ZV9sb25nbG9uZywgd3JpdGVfbG9uZ3dvcmQsIHdyaXRlX3dvcmQpOiBEZWxldGVkLgorCShnZXRfb3BlcmFuZHMpOiBEZWxldGVkLgorCShnZXRfYnl0ZSwgZ2V0X2hhbGYsIGdldF93b3JkKTogTmV3IGZ1bmN0aW9ucy4KKwkocHV0X2J5dGUsIHB1dF9oYWxmLCBwdXRfd29yZCk6IE5ldyBmdW5jdGlvbnMuCisJKiBzaW1vcHMuYzogUmVtb3ZlIHVudXNlZCBmdW5jdGlvbnMuICBSb3VnaCBjdXQgYXQKKwkibGQuYiIsICJsZC5oIiwgImxkLnciLCAic3QuYiIsICJzdC5oIiwgInN0LnciIGluc25zLgorCisJKiB2ODUwX3NpbS5oIChzdHJ1Y3QgX3N0YXRlKTogUmVtb3ZlICJwc3ciIGZpZWxkLiAgQWRkCisJInNyZWdzIiBmaWVsZC4KKwkoUFNXKTogUmVtb3ZlIGJvZ3VzIGRlZmluaXRpb24uCisJKiBzaW1vcHMuYzogQ2hhbmdlIGNvbmRpdGlvbiBjb2RlIGhhbmRsaW5nIHRvIHVzZSB0aGUgcHN3CisJcmVnaXN0ZXIgd2l0aGluIHRoZSBzcmVncyBhcnJheS4gIEhhbmRsZSAibGRzciIgYW5kICJzdHNyIi4KKworCSogc2ltb3BzLmM6IEhhbmRsZSAic2F0YWRkIiwgInNhdHN1YiIsICJzYXRzdWJpIiwgInNhdHN1YnIiLgorCisJKiBpbnRlcnAuYyAoZG9fZm9ybWF0XzUpOiBHZXQgb3BlcmFuZHMgY29ycmVjdGx5IGFuZAorCWNhbGwgdGhlIHRhcmdldCBmdW5jdGlvbi4KKwkoc2ltX3Jlc3VtZSk6IERvbid0IGRvIGEgUEMgdXBkYXRlIGZvciBmb3JtYXQgNSBpbnN0cnVjdGlvbnMuCisJKiBzaW1vcHMuYzogSGFuZGxlICJqYXJsIiBhbmQgImptcCIgaW5zdHJ1Y3Rpb25zLgorCisJKiBzaW1vcHMuYzogRml4IG1pbm9yIHR5cG9zLiAgSGFuZGxlICJjbXAiLCAic2V0ZiIsICJ0c3QiCisJImRpIiwgYW5kICJlaSIgaW5zdHJ1Y3Rpb25zIGNvcnJlY3RseS4KKworCSogaW50ZXJwLmMgKGRvX2Zvcm1hdF8zKTogR2V0IG9wZXJhbmRzIGNvcnJlY3RseSBhbmQgY2FsbAorCXRoZSB0YXJnZXQgZnVuY3Rpb24uCisJKiBzaW1vcHMuYzogSGFuZGxlIGJDQyBpbnN0cnVjdGlvbnMuCisKKwkqIHNpbW9wcy5jOiBBZGQgY29uZGl0aW9uIGNvZGUgaGFuZGxpbmcgdG8gc2hpZnQgaW5zbnMuCisJRml4IG1pbm9yIHR5cG9zIGluIGNvbmRpdGlvbiBjb2RlIGhhbmRsaW5nIGZvciBvdGhlciBpbnNucy4KKworCSogTWFrZWZpbGUuaW46IEZpeCB0eXBvLgorCSogc2ltb3BzLmM6IEFkZCBjb25kaXRpb24gY29kZSBoYW5kbGluZyB0byAic3ViIiAic3ViciIgYW5kCisJImRpdmgiIGluc3RydWN0aW9ucy4KKworCSogaW50ZXJwLmMgKGhhc2gpOiBVcGRhdGUgdG8gYmUgbW9yZSBhY2N1cmF0ZS4KKwkobG9va3VwX2hhc2gpOiBDYWxsIGhhc2ggcmF0aGVyIHRoYW4gY29tcHV0aW5nIHRoZSBoYXNoCisJY29kZSBoZXJlLgorCShkb19mb3JtYXRfMV8yKTogSGFuZGxlIGZvcm1hdCAxIGFuZCBmb3JtYXQgMiBpbnN0cnVjdGlvbnMuCisJR2V0IG9wZXJhbmRzIGNvcnJlY3RseSBhbmQgY2FsbCB0aGUgdGFyZ2V0IGZ1bmN0aW9uLgorCShkb19mb3JtYXRfNik6IEdldCBvcGVyYW5kcyBjb3JyZWN0bHkgYW5kIGNhbGwgdGhlIHRhcmdldAorCWZ1bmN0aW9uLgorCShkb19mb3JtYXRzXzlfMTApOiBSb3VnaCBjdXQgc28gc2hpZnQgb3BzIHdpbGwgd29yay4KKwkoc2ltX3Jlc3VtZSk6IFR3ZWFrIHRvIGRlYWwgd2l0aCBmb3JtYXQgMSBhbmQgZm9ybWF0IDIKKwloYW5kbGluZyBpbiBhIHNpbmdsZSBmdW50aW9uLiAgRG9uJ3QgdXBkYXRlIHRoZSBQQworCWZvciBmb3JtYXQgMyBpbnNucy4gIEZpeCB0eXBvcy4KKwkqIHNpbW9wcy5jOiBTbGlnaHRseSByZW9yZ2FuaXplLiAgQWRkIGNvbmRpdGlvbiBjb2RlIGhhbmRsaW5nCisJdG8gImFkZCIsICJhZGRpIiwgImFuZCIsICJhbmRpIiwgIm9yIiwgIm9yaSIsICJ4b3IiLCAieG9yaSIKKwlhbmQgIm5vdCIgaW5zdHJ1Y3Rpb25zLgorCSogdjg1MF9zaW0uaCAocmVnX3QpOiBSZWdpc3RlcnMgYXJlIDMyYml0cy4KKwkoX3N0YXRlKTogVGhlIFY4NTAgaGFzIDMyIGdlbmVyYWwgcmVnaXN0ZXJzLiAgQWRkIGEgMzJiaXQKKwlwc3cgYW5kIHBjIHJlZ2lzdGVyIHRvby4gIEFkZCBhY2Nlc3NvciBtYWNyb3MKKworCSogTWFrZWZpbGUuaW4sIGludGVycC5jLCB2ODUwX3NpbS5oOiBCcmluZyBvdmVyIGVuZGlhbm5lc3MKKwljaGFuZ2VzIGZyb20gdGhlIGQxMHYgc2ltdWxhdG9yLgorCisJKiBzaW1vcHMuYzogQWRkIHNoaWZ0IHN1cHBvcnQuCisKKwkqIHNpbW9wcy5jOiBBZGQgbXVsdGlwbHkgJiBkaXZpZGUgc3VwcG9ydC4gIEFib3J0IGZvciBzeXN0ZW0KKwlpbnN0cnVjdGlvbnMuCisKKwkqIHNpbW9wcy5jOiBBZGQgbG9naWNhbHMsIG1vdiwgbW92aGksIG1vdmVhLCBhZGQsIGFkZGksIHN1YgorCWFuZCBzdWJyLiAgTm8gY29uZGl0aW9uIGNvZGVzIHlldC4KKworV2VkIEF1ZyAyOCAxMzo1MzoyMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCisKKwkqIENoYW5nZUxvZywgTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluLCB2ODUwX3NpbS5oLCAKKwlnZW5jb2RlLmMsIGludGVycC5jLCBzaW1vcHMuYzogQ3JlYXRlZC4KKwpkaWZmIC0tZ2l0IGEvc2ltL3Y4NTAvTWFrZWZpbGUuaW4gYi9zaW0vdjg1MC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjY1MjMwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Y4NTAvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxNDIgQEAKKyMgICAgTWFrZWZpbGUgdGVtcGxhdGUgZm9yIENvbmZpZ3VyZSBmb3IgdGhlIFY4NTAgc2ltIGxpYnJhcnkuCisjICAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KKyMgCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworIyMgQ09NTU9OX1BSRV9DT05GSUdfRlJBRworCitTSU1fT0JKUyA9IFwKKwkkKFNJTV9ORVdfQ09NTU9OX09CSlMpIFwKKwlzaW1vcHMubyBpbnRlcnAubyBcCisJaXRhYmxlLm8gc2VtYW50aWNzLm8gaWRlY29kZS5vIGljYWNoZS5vIGVuZ2luZS5vIGlydW4ubyBzdXBwb3J0Lm8gXAorCXNpbS1lbmdpbmUubyBcCisJc2ltLWhsb2FkLm8gXAorCXNpbS1ocncubyBcCisJc2ltLXJlc3VtZS5vIFwKKwlzaW0tcmVhc29uLm8gXAorCXNpbS1zdG9wLm8KKworU0lNX1JVTl9PQkpTID0gbnJ1bi5vCisKKyMgTGlzdCBvZiBleHRyYSBkZXBlbmRlbmNpZXMuCisjIEdlbmVyYWxseSB0aGlzIGNvbnNpc3RzIG9mIHNpbXVsYXRvciBzcGVjaWZpYyBmaWxlcyBpbmNsdWRlZCBieSBzaW0tbWFpbi5oLgorU0lNX0VYVFJBX0RFUFMgPSB2ODUwX3NpbS5oIHNpbS1tYWluLmggc2ltb3BzLmggaXRhYmxlLmgKKworIyBMaXN0IG9mIGZsYWdzIHRvIGFsd2F5cyBwYXNzIHRvICQoQ0MpCitTSU1fRVhUUkFfQ0ZMQUdTID0gXAorCS1EREVCVUcgXAorCS1JJChzcmNkaXIpLy4uLy4uL25ld2xpYi9saWJjL3N5cy9zeXNuZWN2ODUwCitTSU1fRVhUUkFfQ0xFQU4gPSBjbGVhbi1leHRyYQorCitJTkNMVURFID0gJChzaW1fbWFpbl9oZWFkZXJzKSAkKFNJTV9FWFRSQV9ERVBTKSAKKworTkxfVEFSR0VUID0gLUROTF9UQVJHRVRfdjg1MAorCisjIyBDT01NT05fUE9TVF9DT05GSUdfRlJBRworCitzaW1vcHMuaCB0YWJsZS5jOiB0bXAtZ2VuY29kZQordG1wLWdlbmNvZGU6IGdlbmNvZGUKKwkuL2dlbmNvZGUgPnRtcC10YWJsZS5jCisJbXYgdG1wLXRhYmxlLmMgdGFibGUuYworCS4vZ2VuY29kZSAtaCA+dG1wLXNpbW9wcy5oCisJbXYgdG1wLXNpbW9wcy5oIHNpbW9wcy5oCisJdG91Y2ggdG1wLWdlbmNvZGUKK2dlbmNvZGUubzogZ2VuY29kZS5jCisJJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtYyAkKHNyY2RpcikvZ2VuY29kZS5jCit2ODUwLW9wYy5vOiAkKHNyY2RpcikvLi4vLi4vb3Bjb2Rlcy92ODUwLW9wYy5jCisJJChDQ19GT1JfQlVJTEQpICQoQlVJTERfQ0ZMQUdTKSAtYyAkPAorZ2VuY29kZTogZ2VuY29kZS5vIHY4NTAtb3BjLm8KKwkkKENDX0ZPUl9CVUlMRCkgJChCVUlMRF9DRkxBR1MpIC1vIGdlbmNvZGUgZ2VuY29kZS5vIHY4NTAtb3BjLm8KKworCisKK0JVSUxUX1NSQ19GUk9NX0lHRU4gPSBcCisJaWNhY2hlLmggXAorCWljYWNoZS5jIFwKKwlpZGVjb2RlLmggXAorCWlkZWNvZGUuYyBcCisJc2VtYW50aWNzLmggXAorCXNlbWFudGljcy5jIFwKKwltb2RlbC5oIFwKKwltb2RlbC5jIFwKKwlzdXBwb3J0LmggXAorCXN1cHBvcnQuYyBcCisJaXRhYmxlLmggXAorCWl0YWJsZS5jIFwKKwllbmdpbmUuaCBcCisJZW5naW5lLmMgXAorCWlydW4uYworJChCVUlMVF9TUkNfRlJPTV9JR0VOKTogdG1wLWlnZW4gc2ltb3BzLmgKKyMKKworLlBIT05ZOiBjbGVhbi1pZ2VuCitjbGVhbi1pZ2VuOgorCXJtIC1mICQoQlVJTFRfU1JDX0ZST01fSUdFTikKKwlybSAtZiB0bXAtaWdlbiB0bXAtaW5zbnMKKworLi4vaWdlbi9pZ2VuOgorCWNkIC4uL2lnZW4gJiYgJChNQUtFKQorCitJR0VOX1RSQUNFPSAjIC1HIG9taXQtbGluZS1udW1iZXJzICMgLUcgdHJhY2UtcnVsZS1zZWxlY3Rpb24gLUcgdHJhY2UtcnVsZS1yZWplY3Rpb24gLUcgdHJhY2UtZW50cmllcworSUdFTl9JTlNOPSQoc3JjZGlyKS92ODUwLmlnZW4KK0lHRU5fREM9JChzcmNkaXIpL3Y4NTAtZGMKK3RtcC1pZ2VuOiAkKElHRU5fSU5TTikgJChJR0VOX0RDKSAuLi9pZ2VuL2lnZW4KKwljZCAuLi9pZ2VuICYmICQoTUFLRSkKKwkuLi9pZ2VuL2lnZW4gXAorCQkkKElHRU5fVFJBQ0UpIFwKKwkJLUcgZ2VuLWRpcmVjdC1hY2Nlc3MgXAorCQktaSAkKElHRU5fSU5TTikgXAorCQktbyAkKElHRU5fREMpIFwKKwkJLXggXAorCQktbiBpY2FjaGUuaCAgICAtaGMgdG1wLWljYWNoZS5oIFwKKwkJLW4gaWNhY2hlLmMgICAgLWMgIHRtcC1pY2FjaGUuYyBcCisJCS1uIHNlbWFudGljcy5oIC1ocyB0bXAtc2VtYW50aWNzLmggXAorCQktbiBzZW1hbnRpY3MuYyAtcyAgdG1wLXNlbWFudGljcy5jIFwKKwkJLW4gaWRlY29kZS5oICAgLWhkIHRtcC1pZGVjb2RlLmggXAorCQktbiBpZGVjb2RlLmMgICAtZCAgdG1wLWlkZWNvZGUuYyBcCisJCS1uIG1vZGVsLmggICAgIC1obSB0bXAtbW9kZWwuaCBcCisJCS1uIG1vZGVsLmMgICAgIC1tICB0bXAtbW9kZWwuYyBcCisJCS1uIHN1cHBvcnQuaCAgIC1oZiB0bXAtc3VwcG9ydC5oIFwKKwkJLW4gc3VwcG9ydC5jICAgLWYgIHRtcC1zdXBwb3J0LmMgXAorCQktbiBpdGFibGUuaCAgICAtaHQgdG1wLWl0YWJsZS5oIFwKKwkJLW4gaXRhYmxlLmMgICAgLXQgIHRtcC1pdGFibGUuYyBcCisJCS1uIGVuZ2luZS5oICAgIC1oZSB0bXAtZW5naW5lLmggXAorCQktbiBlbmdpbmUuYyAgICAtZSAgdG1wLWVuZ2luZS5jIFwKKwkJLW4gaXJ1bi5jICAgICAgLXIgIHRtcC1pcnVuLmMKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWljYWNoZS5oIGljYWNoZS5oCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1pY2FjaGUuYyBpY2FjaGUuYworCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWRlY29kZS5oIGlkZWNvZGUuaAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaWRlY29kZS5jIGlkZWNvZGUuYworCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc2VtYW50aWNzLmggc2VtYW50aWNzLmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLXNlbWFudGljcy5jIHNlbWFudGljcy5jCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1tb2RlbC5oIG1vZGVsLmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLW1vZGVsLmMgbW9kZWwuYworCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc3VwcG9ydC5oIHN1cHBvcnQuaAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtc3VwcG9ydC5jIHN1cHBvcnQuYworCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtaXRhYmxlLmggaXRhYmxlLmgKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWl0YWJsZS5jIGl0YWJsZS5jCisJJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1lbmdpbmUuaCBlbmdpbmUuaAorCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtZW5naW5lLmMgZW5naW5lLmMKKwkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLWlydW4uYyBpcnVuLmMKKwl0b3VjaCB0bXAtaWdlbgorCitjbGVhbi1leHRyYTogY2xlYW4taWdlbgorCXJtIC1mIHRhYmxlLmMgc2ltb3BzLmggZ2VuY29kZQorCisjaW50ZXJwLm86IGludGVycC5jIHRhYmxlLmMgJChJTkNMVURFKQorc2ltb3BzLm86IHNpbW9wcy5jICQoSU5DTFVERSkgdGFyZy12YWxzLmgKKyN0YWJsZS5vOiB0YWJsZS5jCitzZW1hbnRpY3MubzogJChJTkNMVURFKQpkaWZmIC0tZ2l0IGEvc2ltL3Y4NTAvYWNjb25maWcuaCBiL3NpbS92ODUwL2FjY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliODdhMQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS92ODUwL2FjY29uZmlnLmgKQEAgLTAsMCArMSwxNSBAQAorCisvKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KKyN1bmRlZiBFTkFCTEVfTkxTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0NBVEdFVFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCmRpZmYgLS1naXQgYS9zaW0vdjg1MC9jb25maWcuaW4gYi9zaW0vdjg1MC9jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5Y2E5YwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS92ODUwL2NvbmZpZy5pbgpAQCAtMCwwICsxLDE4MyBAQAorLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCisKKy8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCisjdW5kZWYgQ19BTExPQ0EKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLworI3VuZGVmIGNvbnN0CisKKy8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCisjdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCisjdW5kZWYgSEFWRV9BTExPQ0EKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCisjdW5kZWYgSEFWRV9BTExPQ0FfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCisjdW5kZWYgSEFWRV9NTUFQCisKKy8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCisjdW5kZWYgaW5saW5lCisKKy8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCisjdW5kZWYgb2ZmX3QKKworLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCisjdW5kZWYgX1BPU0lYX1NPVVJDRQorCisvKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoaW50IG9yIHZvaWQpLiAgKi8KKyN1bmRlZiBSRVRTSUdUWVBFCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIHNpemVfdAorCisvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKKyAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgorIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgorICovCisjdW5kZWYgU1RBQ0tfRElSRUNUSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIERlZmluZSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAorICAgYnl0ZSBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCBhbmQgVkFYKS4gICovCisjdW5kZWYgV09SRFNfQklHRU5ESUFOCisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19zZXRmcHVjdyBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX1NFVEZQVUNXCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgY2htb2QgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfQ0hNT0QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBjaG93biBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9DSE9XTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9EQ0dFVFRFWFQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBleGVjdiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9FWEVDVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGV4ZWN2ZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9FWEVDVkUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmb3JrIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0ZPUksKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUQ1dECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUlVTQUdFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX01VTk1BUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9QVVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VURU5WCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NFVExPQ0FMRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ2FjdGlvbiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TSUdBQ1RJT04KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDQVNFQ01QCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUkNIUgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRpbWUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfVElNRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHV0aW1lIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1VUSU1FCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfQVJHWl9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZnB1X2NvbnRyb2wuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfRlBVX0NPTlRST0xfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9NQUxMT0NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9OTF9UWVBFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1dGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9VVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9WQUxVRVNfSApkaWZmIC0tZ2l0IGEvc2ltL3Y4NTAvY29uZmlndXJlIGIvc2ltL3Y4NTAvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA2ZWZkYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdjg1MC9jb25maWd1cmUKQEAgLTAsMCArMSw0MjY3IEBACisjISAvYmluL3NoCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3NpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisjIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKKyMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KKworIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMworCisKKworCisKKyMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKKworCisjIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKKworCisjIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIEN5Z3dpbjMyLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgQ1lHV0lOMzIgdG8gInllcyIuCisjIE90aGVyd2lzZSBzZXQgaXQgdG8gIm5vIi4KKworCisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgV2luMzIsIHdpdGhvdXQgdXNpbmcKKyMgQUNfQ0FOT05JQ0FMXyouICBJZiBzbywgc2V0IG91dHB1dCB2YXJpYWJsZSBFWEVFWFQgdG8gIi5leGUiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICIiLgorCisKKworCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZW5kaWFuPWVuZGlhbgkJU3BlY2lmeSB0YXJnZXQgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWFsaWdubWVudD1hbGlnbgkJU3BlY2lmeSBzdHJpY3QsICBub25zdHJpY3Qgb3IgZm9yY2VkIGFsaWdubWVudCBvZiBtZW1vcnkgYWNjZXNzZXMuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW49ZW5kCQlTcGVjaWZ5IGhvc3QgYnl0ZSBlbmRpYW4gb3JpZW50YXRpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtYnVpbGQtd2FybmluZ3NbPUxJU1RdCQlFbmFibGUgYnVpbGQtdGltZSBjb21waWxlciB3YXJuaW5ncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1yZXNlcnZlZC1iaXRzCQlTcGVjaWZ5IHdoZXRoZXIgdG8gY2hlY2sgcmVzZXJ2ZWQgYml0cyBpbiBpbnN0cnVjdGlvbi4iCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tYml0c2l6ZT1OCQlTcGVjaWZ5IHRhcmdldCBiaXRzaXplICgzMiBvciA2NCkuIgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgorYWNfbWF4X2hlcmVfbGluZXM9MTIKKworYWNfcHJldj0KK2ZvciBhY19vcHRpb24KK2RvCisKKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorICAgIGFjX3ByZXY9CisgICAgY29udGludWUKKyAgZmkKKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKKyAgKikgYWNfb3B0YXJnPSA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICIkYWNfb3B0aW9uIiBpbgorCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworCisgIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKKyAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCisgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAorICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQorICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAorICB8IC0tZGE9KikKKyAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKKworICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKyAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisgICAgY2F0IDw8IEVPRgorVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCitPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorQ29uZmlndXJhdGlvbjoKKyAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCitEaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCisgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCisgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCisgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKyAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCisgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCitFT0YKKyAgICBjYXQgPDwgRU9GCitIb3N0IHR5cGU6CisgIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCisgIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KKyAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKyAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKK0VPRgorICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCisgICAgZmkKKyAgICBleGl0IDAgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3QgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKKyAgICBhY19wcmV2PWluZm9kaXIgOzsKKyAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKyAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAorICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCisgICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCisgIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCisgIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKKyAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKKyAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCisgIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCisgIHwgLS1zaGEgfCAtLXNoKQorICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKKyAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCisgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAorICB8IC0tc2hhPSogfCAtLXNoPSopCisgICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKKyAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKKyAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQorICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldCA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKKyAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorICAgIGZpCisgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKyAgICA7OworCisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorZmkKKwordHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKworIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6CisjIDAgc3RhbmRhcmQgaW5wdXQKKyMgMSBmaWxlIGNyZWF0aW9uCisjIDIgZXJyb3JzIGFuZCB3YXJuaW5ncworIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cworIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKK2lmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCisgIGV4ZWMgNj4vZGV2L251bGwKK2Vsc2UKKyAgZXhlYyA2PiYxCitmaQorZXhlYyA1Pi4vY29uZmlnLmxvZworCitlY2hvICJcCitUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKyIgMT4mNQorCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorYWNfY29uZmlndXJlX2FyZ3M9Citmb3IgYWNfYXJnCitkbworICBjYXNlICIkYWNfYXJnIiBpbgorICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7CisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKyAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKKyAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7CisgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIE5MUyBudWlzYW5jZXMuCisjIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5CisjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKyMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQorIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgoraWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCitpZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKK2lmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQoraWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKyMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgorZWNobyA+IGNvbmZkZWZzLmgKKworIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAorIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KK2FjX3VuaXF1ZV9maWxlPU1ha2VmaWxlLmluCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19wcm9nPSQwCisgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCisKKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgLiAkY2FjaGVfZmlsZQorZWxzZQorICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgPiAkY2FjaGVfZmlsZQorZmkKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworYWNfZXhlZXh0PQorYWNfb2JqZXh0PW8KK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCitlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Njg5OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0CisgICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCisgIENQUD0iJHtDQy1jY30gLUUiCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDcwNCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NzEwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3MjEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjcyNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzM4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NDQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9L2xpYi9jcHAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzY5OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKK3NldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCithbGw6CisJQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKK0VPRgorIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCitldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKK2lmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCitlbHNlCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCitmaQorcm0gLWYgY29uZnRlc3RtYWtlCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBTRVRfTUFLRT0KK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3OTY6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKK2lmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgorICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCit0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQorRU9GCisKKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDQz0iJENDIC1wb3NpeCIKKyAgZWxzZQorICAgIENDPSIkQ0MgLVhwIgorICBmaQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgSVNDPQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjgxNzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODIyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MzA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODQ3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDg2NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4ODYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKK2ludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKK2lmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7CitleGl0ICgwKTsgfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODk3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNURENfSEVBREVSUyAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkyMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5MjYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKworLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3R5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKKy8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCitjaGFyIGNvbnN0ICpjb25zdCAqY2NwOworY2hhciAqKnA7CisvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLworc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Oworc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07CisvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCisgICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KKyAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCitjb25zdCBjaGFyICpnID0gInN0cmluZyI7CitjY3AgPSAmZyArIChnID8gZy1nIDogMCk7CisvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLworKytjY3A7CitwID0gKGNoYXIqKikgY2NwOworY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Cit7IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLworICBjaGFyICp0OworICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOworCisgICp0KysgPSAwOworfQoreyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KKyAgaW50IHhbXSA9IHsyNSwgMTd9OworICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOworICArK2ZvbzsKK30KK3sgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLworICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKKyAgaXB0ciBwID0gMDsKKyAgKytwOworfQoreyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCisgICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KKyAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKKyAgc3RydWN0IHMgKmI7IGItPmogPSA1OworfQoreyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KKyAgY29uc3QgaW50IGZvbyA9IDEwOworfQorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTc1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGNvbnN0IAorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjk5NjogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19jdl9jX2lubGluZT1ubworZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbworICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDAzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7Cit9ICRhY19rdyBmb28oKSB7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAxMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitmaQorcm0gLWYgY29uZnRlc3QqCitkb25lCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKK2Nhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KKyAgaW5saW5lIHwgeWVzKSA7OworICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGlubGluZSAKK0VPRgorIDs7CisgICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCitFT0YKKyA7OworZXNhYworCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwMzY6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwNDEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgb2ZmX3QgbG9uZworRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwNjk6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA3NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAic2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZAorRU9GCisKK2ZpCisKKyMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCisjIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExMDQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTA5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhbGxvY2EuaD4KK2ludCBtYWluKCkgeworY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTM3OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExNDIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZWxzZQorIyBpZmRlZiBfTVNDX1ZFUgorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgZWxzZQorIyAgaWYgSEFWRV9BTExPQ0FfSAorIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KK2NoYXIgKmFsbG9jYSAoKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE3MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0EgMQorRU9GCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KKyAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKKyAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCisgICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAorICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KKyAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIENfQUxMT0NBIDEKK0VPRgorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyMDI6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjA3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKK3dlYmVjcmF5CisjZWxzZQord2Vub3RiZWNyYXkKKyNlbmRpZgorCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9vc19jcmF5PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCitmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIzMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTIzNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjYwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCitFT0YKKworICBicmVhaworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2RvbmUKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyODc6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjk1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK2ZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCit7CisgIHN0YXRpYyBjaGFyICphZGRyID0gMDsKKyAgYXV0byBjaGFyIGR1bW15OworICBpZiAoYWRkciA9PSAwKQorICAgIHsKKyAgICAgIGFkZHIgPSAmZHVtbXk7CisgICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKK30KK21haW4gKCkKK3sKKyAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQorZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KK0VPRgorCitmaQorCitmb3IgYWNfaGRyIGluIHVuaXN0ZC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTMzOTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzNDQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjEzNDk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTM3ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM4MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDMxOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNDM5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCisgICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKKwltbWFwIHByaXZhdGUgbm90IGZpeGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisJbW1hcCBzaGFyZWQgbm90IGZpeGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKKyAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKKyAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQorICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQorICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCisgICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQorICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKKyAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgorCisgICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCisgICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgorICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCisgICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisvKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCisjaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKyMgaWZkZWYgSEFWRV9VTklTVERfSAorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGVuZGlmCisKKy8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCisjIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisjIGVuZGlmCisKKyMgaWZkZWYgX1NDX1BBR0VTSVpFCisjICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKKyMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKyMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCisjICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKKyMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgICAgaWZkZWYgTkJQRworIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQorIyAgICAgaWZuZGVmIENMU0laRQorIyAgICAgIGRlZmluZSBDTFNJWkUgMQorIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCisjICAgIGVsc2UgLyogbm8gTkJQRyAqLworIyAgICAgaWZkZWYgTkJQQworIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKKyMgICAgIGVsc2UgLyogbm8gTkJQQyAqLworIyAgICAgIGlmZGVmIFBBR0VTSVpFCisjICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCisjICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KKyMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KKyMgICAgZW5kaWYgLyogbm8gTkJQRyAqLworIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCisjICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLworCisjZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9CisjZWxzZQorY2hhciAqbWFsbG9jKCk7CisjZW5kaWYKKworaW50CittYWluKCkKK3sKKwljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKKwlpbnQgaSwgcGFnZXNpemU7CisJaW50IGZkOworCisJcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOworCisJLyoKKwkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCisJICovCisJZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKKwl1bWFzaygwKTsKKwlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKworCS8qCisJICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCisJICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAorCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCisJICovCisJZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEyKQorCQlleGl0KDEpOworCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKKwlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQorCQkJZXhpdCgxKTsKKworCS8qCisJICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKKwkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCisJICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCisJICovCisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7CisJZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YTMpCisJCWV4aXQoMSk7CisJaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCisJCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOworCWV4aXQoMCk7Cit9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTc5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTU1BUCAxCitFT0YKKworZmkKKworCisjIGF1dG9jb25mLmluZm8gc2F5cyB0aGlzIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgQUNfSU5JVC4KKworCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCithY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKK2FjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisKKyMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgorIyBUaGUgaW5wdXRzIGFyZToKKyMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAorIworIyBUaGUgcnVsZXMgYXJlOgorIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKKyMgICAgc2FtZSB0aW1lLgorIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KKyMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAorIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KKyMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KKyMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCisKKyMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KKyMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KK2Nhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgorTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OworKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCisKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgoraWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2NTI6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorCitob3N0X2FsaWFzPSRob3N0CitjYXNlICIkaG9zdF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKQorICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKKyAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaSA7OworICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKK2hvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY3MzogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKwordGFyZ2V0X2FsaWFzPSR0YXJnZXQKK2Nhc2UgIiR0YXJnZXRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKwordGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAordGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK3RhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCit0YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY5MTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorCitidWlsZF9hbGlhcz0kYnVpbGQKK2Nhc2UgIiRidWlsZF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKK2J1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitidWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgorCit0ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCisgIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKKyAgICBOT05FTk9ORXMseCx4LCAmJgorICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCisKK2lmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQorZWxzZQorICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCisgIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKK3MsXFwsXFxcXCxnOyBzLFwkLCQkLGcKK0VPRl9TRUQKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKKyAgcm0gLWYgY29uZnRlc3RzZWQKK2ZpCit0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KK3Rlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKworIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgordGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3MzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3NjQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODE0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorIDs7CisgICAgZXNhYworICBmaQorICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODQ1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxODU1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK21haW4oKXtyZXR1cm4oMCk7fQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4NTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcworICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCisgIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KKyAgZWxzZQorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCisgIGZpCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODc5OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1CitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTg4NDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg5MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2N2X3Byb2dfZ2NjPXllcworZWxzZQorICBhY19jdl9wcm9nX2djYz1ubworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKKworaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorCithY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKK2FjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTEyOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYworaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19nPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQorCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5NTU6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisKKyMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KK2lmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisgIENDX0ZPUl9CVUlMRD0nJChDQyknCitlbHNlCisgIENDX0ZPUl9CVUlMRD1nY2MKK2ZpCisKKworCisKK0FSPSR7QVItYXJ9CisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjAyMTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKK2ZpCitmaQorUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworQUxMX0xJTkdVQVM9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAordW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDU1OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjA2MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjA2NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAorX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwOTU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIxMDAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEyMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCisgICAgIGZvciBhY19mdW5jIGluIHN0cGNweQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjE1MjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjE1NyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTgwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmaQorICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KKyAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1RQQ1BZIDEKK0VPRgorCisgICBmaQorCisgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyMTQ6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjIxOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bG9jYWxlLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiBMQ19NRVNTQUdFUworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgorICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQorRU9GCisKKyAgICBmaQorICBmaQorICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjQ3OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCisgIFVTRV9OTFM9JGVuYWJsZXZhbAorZWxzZQorICBVU0VfTkxTPXllcworZmkKKworICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgorICAgIAorCisgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KKworICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEVOQUJMRV9OTFMgMQorRU9GCisKKyAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyNjc6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKK2Vsc2UKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubworZmkKKworICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2CisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KKwlubHNfY3ZfaGVhZGVyX2xpYmd0PQorCUNBVE9CSkVYVD1OT05FCisKKwlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjI4NjogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjI5MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjk2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjMxMzogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzE4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzI1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKwkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzNDE6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQorYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1saW50bCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzQ5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgYmluZHRleHRkb21haW4oKTsKKworaW50IG1haW4oKSB7CitiaW5kdGV4dGRvbWFpbigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM2MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjM3NjogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzgxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM4ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0dFVFRFWFQgMQorRU9GCisKKwkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0MTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisJICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgorCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0NTA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI0NTUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ3ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjUwNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjU0MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNTcyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CitleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CisJCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTgwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9LmdtbworCQkgICBEQVRBRElSTkFNRT1zaGFyZQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9Lm1vCisJCSAgIERBVEFESVJOQU1FPWxpYgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCQlJTlNUT0JKRVhUPS5tbworCSAgICAgIGZpCisJICAgIGZpCisJCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisJICAgICAgICAKKyAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KKwkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCisgICAgICAgIGZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjYxMjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KKwlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2NDY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2ODE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KKwkgIDogOworCWVsc2UKKwkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCisgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKKyAgICBkb25lCisKKyAgICAgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgIAorCisgICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCisgICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCisgICAgICAgTElOR1VBUz0KKyAgICAgZWxzZQorICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3NzE6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQorICAgICAgIE5FV19MSU5HVUFTPQorICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbworICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgorICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7CisgICAgICAgICBlc2FjCisgICAgICAgZG9uZQorICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCisgICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2CisgICAgIGZpCisKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCisgICAgIGZpCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKKyAgIGVsc2UKKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAorLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgorICAgZmkKKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgorICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KKwkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3OTk6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI4MDQgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjgwOTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIG1zZ2Zvcm1hdD1saW51eAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK21zZ2Zvcm1hdD14b3BlbgorZmkKKworCisJICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCisgICAgICBmaQorICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCisJICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICAKKyAgIAorCisgICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCisgICAKKworICAgICAgbD0KKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgCisKKyMgQ2hlY2sgZm9yIGNvbW1vbiBoZWFkZXJzLgorIyBGSVhNRTogU2VlbXMgdG8gbWUgdGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgZm9yIGkzODYtd2luZG93cyBob3N0cy4KKyMgQXQgb25lIHBvaW50IHRoZXJlIHdlcmUgaGFyZGNvZGVkIEFDX0RFRklORSdzIGlmICR7aG9zdH0gPSBpMzg2LSotd2luZG93cyouCitmb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB1bmlzdGQuaCB0aW1lLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyODc4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjg4MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg4ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19oZHIgaW4gc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5MTg6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTIzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTI4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2hkciBpbiBmY250bC5oIGZwdV9jb250cm9sLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTU4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjk2MyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk2ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHJ1c2FnZSB0aW1lIHNpZ2FjdGlvbiBfX3NldGZwdWN3CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTk3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDAyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworIyBDaGVjayBmb3Igc29ja2V0IGxpYnJhcmllcworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMwNTI6IGNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nYmluZCB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxzb2NrZXQgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzA2MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGJpbmQoKTsKKworaW50IG1haW4oKSB7CitiaW5kKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDcxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHNvY2tldCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9saWIgMQorRU9GCisKKyAgTElCUz0iLWxzb2NrZXQgJExJQlMiCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzA5OTogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQorYWNfbGliX3Zhcj1gZWNobyBuc2wnXydnZXRob3N0YnluYW1lIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbG5zbCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMTA3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZ2V0aG9zdGJ5bmFtZSgpOworCitpbnQgbWFpbigpIHsKK2dldGhvc3RieW5hbWUoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbnNsIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2xpYiAxCitFT0YKKworICBMSUJTPSItbG5zbCAkTElCUyIKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0CisKKworCitVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlNQUlOVD0iIiBVU0VfTUFJTlRBSU5FUl9NT0RFPXllcyA7OworICBubykJTUFJTlQ9IiMiIDs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLW1haW50YWluZXItbW9kZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IE1BSU5UPSIjIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQorZmkKK2Vsc2UKKyAgTUFJTlQ9IiMiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSAtRFVTRV9CU1dBUD0xIjs7CisgIG5vKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0wIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1ic3dhcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ic3dhcD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9ic3dhcD0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY2ZsYWdzIG9yIC0tZGlzYWJsZS1zaW0tY2ZsYWdzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jZmxhZ3MiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQkgc2ltX2NmbGFncz0iLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIjs7CisgIHRyYWNlKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJQbGVhc2UgdXNlIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpbnN0ZWFkLiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2NmbGFncz0iIjs7CisgIG5vKQkgc2ltX2NmbGFncz0iIjs7CisgICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2NmbGFncz0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVidWcgb3IgLS1kaXNhYmxlLXNpbS1kZWJ1ZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWJ1ZyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpIHNpbV9kZWJ1Zz0iLURERUJVRz03IC1EV0lUSF9ERUJVRz03Ijs7CisgIG5vKSAgc2ltX2RlYnVnPSItRERFQlVHPTAgLURXSVRIX0RFQlVHPTAiOzsKKyAgKikgICBzaW1fZGVidWc9Ii1EREVCVUc9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfREVCVUc9Jygke2VuYWJsZXZhbH0pJyI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWJ1ZyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIGRlYnVnID0gJHNpbV9kZWJ1ZyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2RlYnVnPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zdGRpbyBvciAtLWRpc2FibGUtc2ltLXN0ZGlvIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zdGRpbytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N0ZGlvIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7CisgIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zdGRpbyIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGlvPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkaW8iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHN0ZGlvIGZsYWdzID0gJHNpbV9zdGRpbyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3N0ZGlvPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS10cmFjZSBvciAtLWRpc2FibGUtc2ltLXRyYWNlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV90cmFjZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3RyYWNlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3RyYWNlPSItRFRSQUNFPTEgLURXSVRIX1RSQUNFPS0xIjs7CisgIG5vKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MCAtRFdJVEhfVFJBQ0U9MCI7OworICBbLTAtOV0qKQorCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fdHJhY2U9IiIKKwlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKwkgIGlmIHRlc3QgeCIkc2ltX3RyYWNlIiA9IHg7IHRoZW4KKwkgICAgc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9JyhUUkFDRV8keCIKKwkgIGVsc2UKKwkgICAgc2ltX3RyYWNlPSIke3NpbV90cmFjZX18VFJBQ0VfJHgiCisJICBmaQorCWRvbmUKKwlzaW1fdHJhY2U9IiRzaW1fdHJhY2UpJyIgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSB0cmFjZSA9ICRzaW1fdHJhY2UiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV90cmFjZT0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcHJvZmlsZSBvciAtLWRpc2FibGUtc2ltLXByb2ZpbGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3Byb2ZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9wcm9maWxlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7CisgIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OworICBbLTAtOV0qKQorCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fcHJvZmlsZT0iIgorCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbworCSAgaWYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgPSB4OyB0aGVuCisJICAgIHNpbV9wcm9maWxlPSItRFdJVEhfUFJPRklMRT0nKFBST0ZJTEVfJHgiCisJICBlbHNlCisJICAgIHNpbV9wcm9maWxlPSIke3NpbV9wcm9maWxlfXxQUk9GSUxFXyR4IgorCSAgZmkKKwlkb25lCisJc2ltX3Byb2ZpbGU9IiRzaW1fcHJvZmlsZSknIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9wcm9maWxlIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gcHJvZmlsZSA9ICRzaW1fcHJvZmlsZSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3Byb2ZpbGU9IiIKK2ZpCisKKworCitlY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMyOTQ6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMjk5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBzaWduYWwKKyN1bmRlZiBzaWduYWwKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7CisjZWxzZQordm9pZCAoKnNpZ25hbCAoKSkgKCk7CisjZW5kaWYKKworaW50IG1haW4oKSB7CitpbnQgaTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzE2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpZ25hbD1pbnQKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCitFT0YKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzMzNjogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkQ1lHV0lOMzIiID0geWVzOyB0aGVuCithbV9jdl9leGVleHQ9LmV4ZQorZWxzZQorY2F0ID4gYW1fY190ZXN0LmMgPDwgJ0VPRicKK2ludCBtYWluKCkgeworLyogTm90aGluZyBuZWVkZWQgaGVyZSAqLworfQorRU9GCiske0NDLWNjfSAtbyBhbV9jX3Rlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgYW1fY190ZXN0LmMgJExJQlMgMT4mNQorYW1fY3ZfZXhlZXh0PWBscyBhbV9jX3Rlc3QuKiB8IGdyZXAgLXYgYW1fY190ZXN0LmMgfCBzZWQgLWUgcy9hbV9jX3Rlc3QvL2AKK3JtIC1mIGFtX2NfdGVzdCoKK2ZpCisKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iID0geCAmJiBhbV9jdl9leGVleHQ9bm8KK2ZpCitFWEVFWFQ9IiIKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthbV9jdl9leGVleHR9CitlY2hvICIkYWNfdCIiJHthbV9jdl9leGVleHR9IiAxPiY2CisKKworc2ltX2xpbmtfZmlsZXM9CitzaW1fbGlua19saW5rcz0KKworc2ltX2xpbmtfbGlua3M9dGNvbmZpZy5oCitpZiB0ZXN0IC1mICR7c3JjZGlyfS90Y29uZmlnLmluCit0aGVuCisgIHNpbV9saW5rX2ZpbGVzPXRjb25maWcuaW4KK2Vsc2UKKyAgc2ltX2xpbmtfZmlsZXM9Li4vY29tbW9uL3Rjb25maWcuaW4KK2ZpCisKKyMgdGFyZy12YWxzLmRlZiBwb2ludHMgdG8gdGhlIGxpYmMgbWFjcm8gZGVzY3JpcHRpb24gZmlsZS4KK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyotKi0qKSBUQVJHX1ZBTFNfREVGPS4uL2NvbW1vbi9ubHR2YWxzLmRlZiA7OworZXNhYworc2ltX2xpbmtfZmlsZXM9IiR7c2ltX2xpbmtfZmlsZXN9ICR7VEFSR19WQUxTX0RFRn0iCitzaW1fbGlua19saW5rcz0iJHtzaW1fbGlua19saW5rc30gdGFyZy12YWxzLmRlZiIKKworCisKKword2lyZV9lbmRpYW49IkxJVFRMRV9FTkRJQU4iCitkZWZhdWx0X2VuZGlhbj0iIgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1lbmRpYW4gb3IgLS1kaXNhYmxlLXNpbS1lbmRpYW4gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2VuZGlhbitzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2VuZGlhbiIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICBiKnxCKikgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPUJJR19FTkRJQU4iOzsKKyAgbCp8TCopIHNpbV9lbmRpYW49Ii1EV0lUSF9UQVJHRVRfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIjs7CisgIHllcykJIGlmIHRlc3QgeCIkd2lyZV9lbmRpYW4iICE9IHg7IHRoZW4KKwkgICBzaW1fZW5kaWFuPSItRFdJVEhfVEFSR0VUX0JZVEVfT1JERVI9JHt3aXJlX2VuZGlhbn0iCisJIGVsc2UKKyAgICAgICAgICAgaWYgdGVzdCB4IiRkZWZhdWx0X2VuZGlhbiIgIT0geDsgdGhlbgorCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPSR7ZGVmYXVsdF9lbmRpYW59IgorCSAgIGVsc2UKKwkgICAgIGVjaG8gIk5vIGhhcmQtd2lyZWQgZW5kaWFuIGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgorCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPTAiCisJICAgZmkKKwkgZmk7OworICBubykJIGlmIHRlc3QgeCIkZGVmYXVsdF9lbmRpYW4iICE9IHg7IHRoZW4KKwkgICBzaW1fZW5kaWFuPSItRFdJVEhfREVGQVVMVF9UQVJHRVRfQllURV9PUkRFUj0ke2RlZmF1bHRfZW5kaWFufSIKKwkgZWxzZQorCSAgIGlmIHRlc3QgeCIkd2lyZV9lbmRpYW4iICE9IHg7IHRoZW4KKwkgICAgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPSR7d2lyZV9lbmRpYW59IgorCSAgIGVsc2UKKwkgICAgIGVjaG8gIk5vIGRlZmF1bHQgZW5kaWFuIGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgorCSAgICAgc2ltX2VuZGlhbj0iLURXSVRIX0RFRkFVTFRfVEFSR0VUX0JZVEVfT1JERVI9MCIKKwkgICBmaQorCSBmaTs7CisgICopCSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgZm9yIC0tZW5hYmxlLXNpbS1lbmRpYW4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9lbmRpYW49IiI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9lbmRpYW4iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIGVuZGlhbiBmbGFncyA9ICRzaW1fZW5kaWFuIiA2PiYxCitmaQorZWxzZQorICBpZiB0ZXN0IHgiJGRlZmF1bHRfZW5kaWFuIiAhPSB4OyB0aGVuCisgIHNpbV9lbmRpYW49Ii1EV0lUSF9ERUZBVUxUX1RBUkdFVF9CWVRFX09SREVSPSR7ZGVmYXVsdF9lbmRpYW59IgorZWxzZQorICBpZiB0ZXN0IHgiJHdpcmVfZW5kaWFuIiAhPSB4OyB0aGVuCisgICAgc2ltX2VuZGlhbj0iLURXSVRIX1RBUkdFVF9CWVRFX09SREVSPSR7d2lyZV9lbmRpYW59IgorICBlbHNlCisgICAgc2ltX2VuZGlhbj0KKyAgZmkKK2ZpCitmaQorCit3aXJlX2FsaWdubWVudD0iIgorZGVmYXVsdF9hbGlnbm1lbnQ9Ik5PTlNUUklDVF9BTElHTk1FTlQiCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYWxpZ25tZW50IG9yIC0tZGlzYWJsZS1zaW0tYWxpZ25tZW50IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9hbGlnbm1lbnQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9hbGlnbm1lbnQiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgc3RyaWN0IHwgU1RSSUNUKSAgICAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPVNUUklDVF9BTElHTk1FTlQiOzsKKyAgbm9uc3RyaWN0IHwgTk9OU1RSSUNUKSBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPU5PTlNUUklDVF9BTElHTk1FTlQiOzsKKyAgZm9yY2VkIHwgRk9SQ0VEKSAgICAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPUZPUkNFRF9BTElHTk1FTlQiOzsKKyAgeWVzKSBpZiB0ZXN0IHgiJHdpcmVfYWxpZ25tZW50IiAhPSB4OyB0aGVuCisJIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9JHt3aXJlX2FsaWdubWVudH0iCisgICAgICAgZWxzZQorICAgICAgICAgaWYgdGVzdCB4IiRkZWZhdWx0X2FsaWdubWVudCIgIT0geDsgdGhlbgorICAgICAgICAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfQUxJR05NRU5UPSR7ZGVmYXVsdF9hbGlnbm1lbnR9IgorICAgICAgICAgZWxzZQorCSAgIGVjaG8gIk5vIGhhcmQtd2lyZWQgYWxpZ25tZW50IGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgorCSAgIHNpbV9hbGlnbm1lbnQ9Ii1EV0lUSF9BTElHTk1FTlQ9MCIKKyAgICAgICAgIGZpCisgICAgICAgZmk7OworICBubykgIGlmIHRlc3QgeCIkZGVmYXVsdF9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKwkgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPSR7ZGVmYXVsdF9hbGlnbm1lbnR9IgorICAgICAgIGVsc2UKKyAgICAgICAgIGlmIHRlc3QgeCIkd2lyZV9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKwkgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9JHt3aXJlX2FsaWdubWVudH0iCisgICAgICAgICBlbHNlCisgICAgICAgICAgIGVjaG8gIk5vIGRlZmF1bHQgYWxpZ25tZW50IGZvciB0YXJnZXQgJHRhcmdldCIgMT4mNgorICAgICAgICAgICBzaW1fYWxpZ25tZW50PSItRFdJVEhfREVGQVVMVF9BTElHTk1FTlQ9MCIKKyAgICAgICAgIGZpCisgICAgICAgZmk7OworICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBwYXNzZWQgdG8gLS1lbmFibGUtc2ltLWFsaWdubWVudCIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2FsaWdubWVudD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2FsaWdubWVudCIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgYWxpZ25tZW50IGZsYWdzID0gJHNpbV9hbGlnbm1lbnQiIDY+JjEKK2ZpCitlbHNlCisgIGlmIHRlc3QgeCIkZGVmYXVsdF9hbGlnbm1lbnQiICE9IHg7IHRoZW4KKyAgc2ltX2FsaWdubWVudD0iLURXSVRIX0RFRkFVTFRfQUxJR05NRU5UPSR7ZGVmYXVsdF9hbGlnbm1lbnR9IgorZWxzZQorICBpZiB0ZXN0IHgiJHdpcmVfYWxpZ25tZW50IiAhPSB4OyB0aGVuCisgICAgc2ltX2FsaWdubWVudD0iLURXSVRIX0FMSUdOTUVOVD0ke3dpcmVfYWxpZ25tZW50fSIKKyAgZWxzZQorICAgIHNpbV9hbGlnbm1lbnQ9CisgIGZpCitmaQorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW4gb3IgLS1kaXNhYmxlLXNpbS1ob3N0ZW5kaWFuIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ob3N0ZW5kaWFuK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1faG9zdGVuZGlhbiIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICBubykJIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPTAiOzsKKyAgYip8QiopIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUJJR19FTkRJQU4iOzsKKyAgbCp8TCopIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUxJVFRMRV9FTkRJQU4iOzsKKyAgKikJIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIlVua25vd24gdmFsdWUgJGVuYWJsZXZhbCBmb3IgLS1lbmFibGUtc2ltLWhvc3RlbmRpYW4iIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ob3N0ZW5kaWFuPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1faG9zdGVuZGlhbiIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgaG9zdGVuZGlhbiBmbGFncyA9ICRzaW1faG9zdGVuZGlhbiIgNj4mMQorZmkKK2Vsc2UKKyAgCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNDkwOiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2JpZ2VuZGlhbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KKyMgU2VlIGlmIHN5cy9wYXJhbS5oIGRlZmluZXMgdGhlIEJZVEVfT1JERVIgbWFjcm8uCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNDk3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KK2ludCBtYWluKCkgeworCisjaWYgIUJZVEVfT1JERVIgfHwgIUJJR19FTkRJQU4gfHwgIUxJVFRMRV9FTkRJQU4KKyBib2d1cyBlbmRpYW4gbWFjcm9zCisjZW5kaWYKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTA4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBCSUdfRU5ESUFOIG9yIG5vdC4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM1MTIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgoraW50IG1haW4oKSB7CisKKyNpZiBCWVRFX09SREVSICE9IEJJR19FTkRJQU4KKyBub3QgYmlnIGVuZGlhbgorI2VuZGlmCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzUyMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2lmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmciIDE+JjI7IGV4aXQgMTsgfQorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzNTQzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK21haW4gKCkgeworICAvKiBBcmUgd2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4/ICBGcm9tIEhhcmJpc29uJlN0ZWVsZS4gICovCisgIHVuaW9uCisgIHsKKyAgICBsb25nIGw7CisgICAgY2hhciBjW3NpemVvZiAobG9uZyldOworICB9IHU7CisgIHUubCA9IDE7CisgIGV4aXQgKHUuY1tzaXplb2YgKGxvbmcpIC0gMV0gPT0gMSk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU1NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9jX2JpZ2VuZGlhbj1ubworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2JpZ2VuZGlhbiIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCitFT0YKKworZmkKKworICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHllczsgdGhlbgorICAgIHNpbV9ob3N0ZW5kaWFuPSItRFdJVEhfSE9TVF9CWVRFX09SREVSPUJJR19FTkRJQU4iCisgIGVsc2UKKyAgICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj1MSVRUTEVfRU5ESUFOIgorICBmaQorZWxzZQorICBzaW1faG9zdGVuZGlhbj0iLURXSVRIX0hPU1RfQllURV9PUkRFUj0wIgorZmkKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWJ1aWxkLXdhcm5pbmdzIG9yIC0tZGlzYWJsZS1idWlsZC13YXJuaW5ncyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9idWlsZF93YXJuaW5ncytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfYnVpbGRfd2FybmluZ3MiCisgIGJ1aWxkX3dhcm5pbmdzPSItV2FsbCAtV3BvaW50ZXItYXJpdGggLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAtV21pc3NpbmctZGVjbGFyYXRpb25zIgorY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCTs7CisgIG5vKQlidWlsZF93YXJuaW5ncz0iLXciOzsKKyAgLCopICAgdD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgCisJYnVpbGRfd2FybmluZ3M9IiR7YnVpbGRfd2FybmluZ3N9ICR7dH0iOzsKKyAgKiwpICAgdD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy8sLyAvZyJgCisJYnVpbGRfd2FybmluZ3M9IiR7dH0gJHtidWlsZF93YXJuaW5nc30iOzsKKyAgKikJYnVpbGRfd2FybmluZ3M9YGVjaG8gIiR7ZW5hYmxldmFsfSIgfCBzZWQgLWUgInMvLC8gL2ciYDs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkYnVpbGRfd2FybmluZ3MiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHdhcm5pbmcgZmxhZ3MgPSAkYnVpbGRfd2FybmluZ3MiIDY+JjEKK2ZpCitlbHNlCisgIGJ1aWxkX3dhcm5pbmdzPSIiCitmaQorCisKK2RlZmF1bHRfc2ltX3Jlc2VydmVkX2JpdHM9IjEiCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2ltLXJlc2VydmVkLWJpdHMgb3IgLS1kaXNhYmxlLXNpbS1yZXNlcnZlZC1iaXRzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9yZXNlcnZlZF9iaXRzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaW1fcmVzZXJ2ZWRfYml0cyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpCXNpbV9yZXNlcnZlZF9iaXRzPSItRFdJVEhfUkVTRVJWRURfQklUUz0xIjs7CisgIG5vKQlzaW1fcmVzZXJ2ZWRfYml0cz0iLURXSVRIX1JFU0VSVkVEX0JJVFM9MCI7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tcmVzZXJ2ZWQtYml0cyBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9yZXNlcnZlZF9iaXRzPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fcmVzZXJ2ZWRfYml0cyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgcmVzZXJ2ZWQgZmxhZ3MgPSAkc2ltX3Jlc2VydmVkX2JpdHMiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9yZXNlcnZlZF9iaXRzPSItRFdJVEhfUkVTRVJWRURfQklUUz0ke2RlZmF1bHRfc2ltX3Jlc2VydmVkX2JpdHN9IgorZmkKKword2lyZV93b3JkX2JpdHNpemU9IjMyIgord2lyZV93b3JkX21zYj0iMzEiCit3aXJlX2FkZHJlc3NfYml0c2l6ZT0iIgord2lyZV9jZWxsX2JpdHNpemU9IiIKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tYml0c2l6ZSBvciAtLWRpc2FibGUtc2ltLWJpdHNpemUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX2JpdHNpemUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9iaXRzaXplIgorICBzaW1fYml0c2l6ZT0KK2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgNjQsNjMgfCA2NCw2MywqICkgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTY0IC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9NjMiOzsKKyAgMzIsMzEgfCAzMiwzMSwqICkgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTMyIC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MzEiOzsKKyAgNjQsMCB8IDY0LDAsKiApIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT0zMiAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTAiOzsKKyAgMzIsMCB8IDY0LDAsKiApIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT0zMiAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTAiOzsKKyAgMzIpIGlmIHRlc3QgeCIkd2lyZV93b3JkX21zYiIgIT0geCAtYSB4IiR3aXJlX3dvcmRfbXNiIiAhPSB4MDsgdGhlbgorICAgICAgICBzaW1fYml0c2l6ZT0iLURXSVRIX1RBUkdFVF9XT1JEX0JJVFNJWkU9MzIgLURXSVRIX1RBUkdFVF9XT1JEX01TQj0zMSIKKyAgICAgIGVsc2UKKyAgICAgICAgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTMyIC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9MCIKKyAgICAgIGZpIDs7CisgIDY0KSBpZiB0ZXN0IHgiJHdpcmVfd29yZF9tc2IiICE9IHggLWEgeCIkd2lyZV93b3JkX21zYiIgIT0geDA7IHRoZW4KKyAgICAgICAgc2ltX2JpdHNpemU9Ii1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPTY0IC1EV0lUSF9UQVJHRVRfV09SRF9NU0I9NjMiCisgICAgICBlbHNlCisgICAgICAgIHNpbV9iaXRzaXplPSItRFdJVEhfVEFSR0VUX1dPUkRfQklUU0laRT02NCAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPTAiCisgICAgICBmaSA7OworICAqKSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAiLS1lbmFibGUtc2ltLWJpdHNpemUgd2FzIGdpdmVuICRlbmFibGV2YWwuICBFeHBlY3RlZCAzMiBvciA2NCIiIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworIyBhZGRyZXNzIGJpdHNpemUKK3RtcD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy9eWzAtOV0qLCpbMC05XSosKi8vImAKK2Nhc2UgeCIke3RtcH0iIGluCisgIHggKSA7OworICB4MzIgfCB4MzIsKiApIHNpbV9iaXRzaXplPSIke3NpbV9iaXRzaXplfSAtRFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRT0zMiIgOzsKKyAgeDY0IHwgeDY0LCogKSBzaW1fYml0c2l6ZT0iJHtzaW1fYml0c2l6ZX0gLURXSVRIX1RBUkdFVF9BRERSRVNTX0JJVFNJWkU9NjQiIDs7CisgICogKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYml0c2l6ZSB3YXMgZ2l2ZW4gYWRkcmVzcyBzaXplICRlbmFibGV2YWwuICBFeHBlY3RlZCAzMiBvciA2NCIiIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworIyBjZWxsIGJpdHNpemUKK3RtcD1gZWNobyAiJHtlbmFibGV2YWx9IiB8IHNlZCAtZSAicy9eWzAtOV0qLCpbMC05Kl0qLCpbMC05XSosKi8vImAKK2Nhc2UgeCIke3RtcH0iIGluCisgIHggKSA7OworICB4MzIgfCB4MzIsKiApIHNpbV9iaXRzaXplPSIke3NpbV9iaXRzaXplfSAtRFdJVEhfVEFSR0VUX0NFTExfQklUU0laRT0zMiIgOzsKKyAgeDY0IHwgeDY0LCogKSBzaW1fYml0c2l6ZT0iJHtzaW1fYml0c2l6ZX0gLURXSVRIX1RBUkdFVF9DRUxMX0JJVFNJWkU9NjQiIDs7CisgICogKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICItLWVuYWJsZS1zaW0tYml0c2l6ZSB3YXMgZ2l2ZW4gY2VsbCBzaXplICRlbmFibGV2YWwuICBFeHBlY3RlZCAzMiBvciA2NCIiIDE+JjI7IGV4aXQgMTsgfSA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9iaXRzaXplIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBiaXRzaXplIGZsYWdzID0gJHNpbV9iaXRzaXplIiA2PiYxCitmaQorZWxzZQorICBzaW1fYml0c2l6ZT0iIgoraWYgdGVzdCB4IiR3aXJlX3dvcmRfYml0c2l6ZSIgIT0geDsgdGhlbgorICBzaW1fYml0c2l6ZT0iJHNpbV9iaXRzaXplIC1EV0lUSF9UQVJHRVRfV09SRF9CSVRTSVpFPSR3aXJlX3dvcmRfYml0c2l6ZSIKK2ZpCitpZiB0ZXN0IHgiJHdpcmVfd29yZF9tc2IiICE9IHg7IHRoZW4KKyAgc2ltX2JpdHNpemU9IiRzaW1fYml0c2l6ZSAtRFdJVEhfVEFSR0VUX1dPUkRfTVNCPSR3aXJlX3dvcmRfbXNiIgorZmkKK2lmIHRlc3QgeCIkd2lyZV9hZGRyZXNzX2JpdHNpemUiICE9IHg7IHRoZW4KKyAgc2ltX2JpdHNpemU9IiRzaW1fYml0c2l6ZSAtRFdJVEhfVEFSR0VUX0FERFJFU1NfQklUU0laRT0kd2lyZV9hZGRyZXNzX2JpdHNpemUiCitmaQoraWYgdGVzdCB4IiR3aXJlX2NlbGxfYml0c2l6ZSIgIT0geDsgdGhlbgorICBzaW1fYml0c2l6ZT0iJHNpbV9iaXRzaXplIC1EV0lUSF9UQVJHRVRfQ0VMTF9CSVRTSVpFPSR3aXJlX2NlbGxfYml0c2l6ZSIKK2ZpCitmaQorCisKK2ZvciBhY19mdW5jIGluIHRpbWUgY2htb2QgdXRpbWUgZm9yayBleGVjdmUgZXhlY3YgY2hvd24KK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjM2OTE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDM2OTYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzcxOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2hkciBpbiB1bmlzdGQuaCBzdGRsaWIuaCBzdHJpbmcuaCBzdHJpbmdzLmggdXRpbWUuaCB0aW1lLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTozNzQ3OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzc1MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc1NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworCisKK3RyYXAgJycgMSAyIDE1CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxIHwgZ3JlcCBhY19zcGFjZWAgaW4KKyAgKmFjX3NwYWNlPVwgKikKKyAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgc2VkIC1uIFwKKyAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCisgICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCisgICAgOzsKKyAgKikKKyAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKyAgICA7OworICBlc2FjID4+IGNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCisjIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KKyMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJworZmkKKwordHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorCitERUZTPS1ESEFWRV9DT05GSUdfSAorCisjIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKworZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUworcm0gLWYgJENPTkZJR19TVEFUVVMKK2NhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisjISAvYmluL3NoCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAorIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMKKyMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCisjCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKK2ZvciBhY19vcHRpb24KK2RvCisgIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCisgICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQorICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiIKKyAgICBleGl0IDAgOzsKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCisgICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7CisgIGVzYWMKK2RvbmUKKworYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKK2FjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgorCit0cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlLnNpbTpNYWtlZmlsZS5pbiBNYWtlLWNvbW1vbi5zaW06Li4vY29tbW9uL01ha2UtY29tbW9uLmluIC5nZGJpbml0Oi4uL2NvbW1vbi9nZGJpbml0LmluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KK3NlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Cisgcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKKyRhY192cHN1YgorJGV4dHJhc3ViCitzJUBzaW1fZW52aXJvbm1lbnRAJSRzaW1fZW52aXJvbm1lbnQlZworcyVAc2ltX2FsaWdubWVudEAlJHNpbV9hbGlnbm1lbnQlZworcyVAc2ltX2Fzc2VydEAlJHNpbV9hc3NlcnQlZworcyVAc2ltX2JpdHNpemVAJSRzaW1fYml0c2l6ZSVnCitzJUBzaW1fZW5kaWFuQCUkc2ltX2VuZGlhbiVnCitzJUBzaW1faG9zdGVuZGlhbkAlJHNpbV9ob3N0ZW5kaWFuJWcKK3MlQHNpbV9mbG9hdEAlJHNpbV9mbG9hdCVnCitzJUBzaW1fc2NhY2hlQCUkc2ltX3NjYWNoZSVnCitzJUBzaW1fZGVmYXVsdF9tb2RlbEAlJHNpbV9kZWZhdWx0X21vZGVsJWcKK3MlQHNpbV9od19jZmxhZ3NAJSRzaW1faHdfY2ZsYWdzJWcKK3MlQHNpbV9od19vYmpzQCUkc2ltX2h3X29ianMlZworcyVAc2ltX2h3QCUkc2ltX2h3JWcKK3MlQHNpbV9pbmxpbmVAJSRzaW1faW5saW5lJWcKK3MlQHNpbV9wYWNrYWdlc0AlJHNpbV9wYWNrYWdlcyVnCitzJUBzaW1fcmVncGFybUAlJHNpbV9yZWdwYXJtJWcKK3MlQHNpbV9yZXNlcnZlZF9iaXRzQCUkc2ltX3Jlc2VydmVkX2JpdHMlZworcyVAc2ltX3NtcEAlJHNpbV9zbXAlZworcyVAc2ltX3N0ZGNhbGxAJSRzaW1fc3RkY2FsbCVnCitzJUBzaW1feG9yX2VuZGlhbkAlJHNpbV94b3JfZW5kaWFuJWcKK3MlQGJ1aWxkX3dhcm5pbmdzQCUkYnVpbGRfd2FybmluZ3MlZworcyVAU0hFTExAJSRTSEVMTCVnCitzJUBDRkxBR1NAJSRDRkxBR1MlZworcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCitzJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKK3MlQERFRlNAJSRERUZTJWcKK3MlQExERkxBR1NAJSRMREZMQUdTJWcKK3MlQExJQlNAJSRMSUJTJWcKK3MlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworcyVAcHJlZml4QCUkcHJlZml4JWcKK3MlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKK3MlQGJpbmRpckAlJGJpbmRpciVnCitzJUBzYmluZGlyQCUkc2JpbmRpciVnCitzJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCitzJUBkYXRhZGlyQCUkZGF0YWRpciVnCitzJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCitzJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKK3MlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKK3MlQGxpYmRpckAlJGxpYmRpciVnCitzJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCitzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCitzJUBpbmZvZGlyQCUkaW5mb2RpciVnCitzJUBtYW5kaXJAJSRtYW5kaXIlZworcyVAaG9zdEAlJGhvc3QlZworcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZworcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCitzJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKK3MlQGhvc3Rfb3NAJSRob3N0X29zJWcKK3MlQHRhcmdldEAlJHRhcmdldCVnCitzJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZworcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZworcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZworcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKK3MlQGJ1aWxkQCUkYnVpbGQlZworcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCitzJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZworcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKK3MlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZworcyVAQ0NAJSRDQyVnCitzJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZworcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKK3MlQENDX0ZPUl9CVUlMREAlJENDX0ZPUl9CVUlMRCVnCitzJUBIREVGSU5FU0AlJEhERUZJTkVTJWcKK3MlQEFSQCUkQVIlZworcyVAUkFOTElCQCUkUkFOTElCJWcKK3MlQFNFVF9NQUtFQCUkU0VUX01BS0UlZworcyVAQ1BQQCUkQ1BQJWcKK3MlQEFMTE9DQUAlJEFMTE9DQSVnCitzJUBVU0VfTkxTQCUkVVNFX05MUyVnCitzJUBNU0dGTVRAJSRNU0dGTVQlZworcyVAR01TR0ZNVEAlJEdNU0dGTVQlZworcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCitzJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKK3MlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZworcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKK3MlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZworcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCitzJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCitzJUBJTlRMREVQU0AlJElOVExERVBTJWcKK3MlQElOVExMSUJTQCUkSU5UTExJQlMlZworcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCitzJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCitzJUBQT1NVQkAlJFBPU1VCJWcKK3MlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKK3MlQEdUX05PQCUkR1RfTk8lZworcyVAR1RfWUVTQCUkR1RfWUVTJWcKK3MlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKK3MlQGxAJSRsJWcKK3MlQE1BSU5UQCUkTUFJTlQlZworcyVAc2ltX2Jzd2FwQCUkc2ltX2Jzd2FwJWcKK3MlQHNpbV9jZmxhZ3NAJSRzaW1fY2ZsYWdzJWcKK3MlQHNpbV9kZWJ1Z0AlJHNpbV9kZWJ1ZyVnCitzJUBzaW1fc3RkaW9AJSRzaW1fc3RkaW8lZworcyVAc2ltX3RyYWNlQCUkc2ltX3RyYWNlJWcKK3MlQHNpbV9wcm9maWxlQCUkc2ltX3Byb2ZpbGUlZworcyVARVhFRVhUQCUkRVhFRVhUJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlLnNpbTpNYWtlZmlsZS5pbiBNYWtlLWNvbW1vbi5zaW06Li4vY29tbW9uL01ha2UtY29tbW9uLmluIC5nZGJpbml0Oi4uL2NvbW1vbi9nZGJpbml0LmluIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KKyAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OworICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKK3MlQElOU1RBTExAJSRJTlNUQUxMJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCisjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgorIworIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCithY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKK2FjX2RDPSdcMycKK2FjX2REPSclZycKKyMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJworYWNfdUM9JyAnCithY191RD0nXDQlZycKKyMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX2VCPSckJVwxI1wyZGVmaW5lXDMnCithY19lQz0nICcKK2FjX2VEPSclZycKKworaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisgIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZpCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICRhY19maWxlCisKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCisKK0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcworIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6CisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgorcm0gLWYgY29uZnRlc3QudmFscworY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgorcy9bXFwmJV0vXFwmL2cKK3MlW1xcJGBdJVxcJiVnCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAorcyVhY19kJWFjX3UlZ3AKK3MlYWNfdSVhY19lJWdwCitFT0YKK3NlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKK3JtIC1mIGNvbmZ0ZXN0LmhkcgorCisjIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCisjIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCisjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KK2NhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgorcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKK0VPRgorCisjIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KKyMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCisKK3JtIC1mIGNvbmZ0ZXN0LnRhaWwKK3doaWxlIDoKK2RvCisgIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKKyAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgorICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCisgICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgorICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKKyAgZWNobyAnQ0VPRgorICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAorICBybSAtZiBjb25mdGVzdC5pbgorICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KKycgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKKyAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCitkb25lCitybSAtZiBjb25mdGVzdC52YWxzCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCisgIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAorICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAorICBybSAtZiBjb25mdGVzdC5pbgorICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKKyAgICBybSAtZiBjb25mdGVzdC5oCisgIGVsc2UKKyAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGZpCisgICAgcm0gLWYgJGFjX2ZpbGUKKyAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCisgIGZpCitmaTsgZG9uZQorCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCithY19zb3VyY2VzPSIkc2ltX2xpbmtfZmlsZXMiCithY19kZXN0cz0iJHNpbV9saW5rX2xpbmtzIgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK3NyY2Rpcj0kYWNfZ2l2ZW5fc3JjZGlyCit3aGlsZSB0ZXN0IC1uICIkYWNfc291cmNlcyI7IGRvCisgIHNldCAkYWNfZGVzdHM7IGFjX2Rlc3Q9JDE7IHNoaWZ0OyBhY19kZXN0cz0kKgorICBzZXQgJGFjX3NvdXJjZXM7IGFjX3NvdXJjZT0kMTsgc2hpZnQ7IGFjX3NvdXJjZXM9JCoKKworICBlY2hvICJsaW5raW5nICRzcmNkaXIvJGFjX3NvdXJjZSB0byAkYWNfZGVzdCIKKworICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfc291cmNlOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkc3JjZGlyLyRhY19zb3VyY2U6IEZpbGUgbm90IGZvdW5kIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKKyAgcm0gLWYgJGFjX2Rlc3QKKworICAjIE1ha2UgcmVsYXRpdmUgc3ltbGlua3MuCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kZXN0X2Rpcj1gZWNobyAkYWNfZGVzdHxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gIiRhY19kZXN0IiAmJiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBkZXN0IGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGVzdF9kaXIiICYmIG1rZGlyICIkYWNfZGVzdF9kaXIiCisgICAgYWNfZGVzdF9kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2Rlc3RfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kZXN0X2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGVzdF9kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGVzdF9kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRzcmNkaXIiIGluCisgIFsvJF0qKSBhY19yZWxfc291cmNlPSIkc3JjZGlyLyRhY19zb3VyY2UiIDs7CisgICopIGFjX3JlbF9zb3VyY2U9IiRhY19kb3RzJHNyY2Rpci8kYWNfc291cmNlIiA7OworICBlc2FjCisKKyAgIyBNYWtlIGEgc3ltbGluayBpZiBwb3NzaWJsZTsgb3RoZXJ3aXNlIHRyeSBhIGhhcmQgbGluay4KKyAgaWYgbG4gLXMgJGFjX3JlbF9zb3VyY2UgJGFjX2Rlc3QgMj4vZGV2L251bGwgfHwKKyAgICBsbiAkc3JjZGlyLyRhY19zb3VyY2UgJGFjX2Rlc3Q7IHRoZW4gOgorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGxpbmsgJGFjX2Rlc3QgdG8gJHNyY2Rpci8kYWNfc291cmNlIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2RvbmUKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorY2FzZSAieCRDT05GSUdfRklMRVMiIGluCisgeE1ha2VmaWxlKikKKyAgIGVjaG8gIk1lcmdpbmcgTWFrZWZpbGUuc2ltK01ha2UtY29tbW9uLnNpbSBpbnRvIE1ha2VmaWxlIC4uLiIKKyAgIHJtIC1mIE1ha2VzaW0xLnRtcCBNYWtlc2ltMi50bXAgTWFrZWZpbGUKKyAgIHNlZCAtbiAtZSAnL14jIyBDT01NT05fUFJFXy8sL14jIyBFbmQgQ09NTU9OX1BSRV8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0xLnRtcAorICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QT1NUXy8sL14jIyBFbmQgQ09NTU9OX1BPU1RfLyBwJyA8TWFrZS1jb21tb24uc2ltID5NYWtlc2ltMi50bXAKKyAgIHNlZCAtZSAnL14jIyBDT01NT05fUFJFXy8gciBNYWtlc2ltMS50bXAnIFwKKwktZSAnL14jIyBDT01NT05fUE9TVF8vIHIgTWFrZXNpbTIudG1wJyBcCisJPE1ha2VmaWxlLnNpbSA+TWFrZWZpbGUKKyAgIHJtIC1mIE1ha2VmaWxlLnNpbSBNYWtlLWNvbW1vbi5zaW0gTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcAorICAgOzsKKyBlc2FjCisgY2FzZSAieCRDT05GSUdfSEVBREVSUyIgaW4geGNvbmZpZy5oOmNvbmZpZy5pbikgZWNobyA+IHN0YW1wLWggOzsgZXNhYworCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKworCmRpZmYgLS1naXQgYS9zaW0vdjg1MC9jb25maWd1cmUuaW4gYi9zaW0vdjg1MC9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlODkyZAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS92ODUwL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDE4IEBACitkbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK3NpbmNsdWRlKC4uL2NvbW1vbi9hY2xvY2FsLm00KQorQUNfUFJFUkVRKDIuNSlkbmwKK0FDX0lOSVQoTWFrZWZpbGUuaW4pCisKK1NJTV9BQ19DT01NT04KKworU0lNX0FDX09QVElPTl9FTkRJQU4oTElUVExFX0VORElBTikKK1NJTV9BQ19PUFRJT05fQUxJR05NRU5UKCxOT05TVFJJQ1RfQUxJR05NRU5UKQorU0lNX0FDX09QVElPTl9IT1NURU5ESUFOCitTSU1fQUNfT1BUSU9OX1dBUk5JTkdTCitTSU1fQUNfT1BUSU9OX1JFU0VSVkVEX0JJVFMKK1NJTV9BQ19PUFRJT05fQklUU0laRSgzMiwzMSkKKworQUNfQ0hFQ0tfRlVOQ1ModGltZSBjaG1vZCB1dGltZSBmb3JrIGV4ZWN2ZSBleGVjdiBjaG93bikKK0FDX0NIRUNLX0hFQURFUlModW5pc3RkLmggc3RkbGliLmggc3RyaW5nLmggc3RyaW5ncy5oIHV0aW1lLmggdGltZS5oKQorCitTSU1fQUNfT1VUUFVUCmRpZmYgLS1naXQgYS9zaW0vdjg1MC9nZW5jb2RlLmMgYi9zaW0vdjg1MC9nZW5jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjZTg2NgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS92ODUwL2dlbmNvZGUuYwpAQCAtMCwwICsxLDE0OSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJhbnNpZGVjbC5oIgorI2luY2x1ZGUgIm9wY29kZS92ODUwLmgiCisjaW5jbHVkZSA8bGltaXRzLmg+CisKK3N0YXRpYyB2b2lkIHdyaXRlX2hlYWRlciBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgdm9pZCB3cml0ZV9vcGNvZGVzIFBBUkFNUyAoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIHdyaXRlX3RlbXBsYXRlIFBBUkFNUyAoKHZvaWQpKTsKKworbG9uZyBPcGNvZGVzWzUxMl07CitzdGF0aWMgaW50IGN1cm9wPTA7CisKK2ludAorbWFpbiAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKmFyZ3ZbXTsKK3sKKyAgaWYgKChhcmdjID4gMSkgJiYgKHN0cmNtcCAoYXJndlsxXSwgIi1oIikgPT0gMCkpCisgICAgd3JpdGVfaGVhZGVyKCk7CisgIGVsc2UgaWYgKChhcmdjID4gMSkgJiYgKHN0cmNtcCAoYXJndlsxXSwgIi10IikgPT0gMCkpCisgICAgd3JpdGVfdGVtcGxhdGUgKCk7CisgIGVsc2UKKyAgICB3cml0ZV9vcGNvZGVzKCk7CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkCit3cml0ZV9oZWFkZXIgKCkKK3sKKyAgc3RydWN0IHY4NTBfb3Bjb2RlICpvcGNvZGU7CisKKyAgZm9yIChvcGNvZGUgPSAoc3RydWN0IHY4NTBfb3Bjb2RlICopdjg1MF9vcGNvZGVzOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQorICAgIHByaW50ZigiaW50IE9QXyVYIFBBUkFNUyAoKHZvaWQpKTtcdFx0LyogJXMgKi9cbiIsCisJICAgb3Bjb2RlLT5vcGNvZGUsIG9wY29kZS0+bmFtZSk7Cit9CisKKworLyogd3JpdGVfdGVtcGxhdGUgY3JlYXRlcyBhIGZpbGUgYWxsIHJlcXVpcmVkIGZ1bmN0aW9ucywgcmVhZHkgKi8KKy8qIHRvIGJlIGZpbGxlZCBvdXQgKi8KKworc3RhdGljIHZvaWQKK3dyaXRlX3RlbXBsYXRlICgpCit7CisgIHN0cnVjdCB2ODUwX29wY29kZSAqb3Bjb2RlOworICBpbnQgaSxqOworCisgIHByaW50ZiAoIiNpbmNsdWRlIFwic2ltLW1haW4uaFwiXG4iKTsKKyAgcHJpbnRmICgiI2luY2x1ZGUgXCJ2ODUwX3NpbS5oXCJcbiIpOworICBwcmludGYgKCIjaW5jbHVkZSBcInNpbW9wcy5oXCJcbiIpOworCisgIGZvciAob3Bjb2RlID0gKHN0cnVjdCB2ODUwX29wY29kZSAqKXY4NTBfb3Bjb2Rlczsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKKyAgICB7CisgICAgICBwcmludGYoIi8qICVzICovXG52b2lkXG5PUF8lWCAodm9pZClcbntcbiIsIG9wY29kZS0+bmFtZSwgb3Bjb2RlLT5vcGNvZGUpOworCSAgCisgICAgICAvKiBjb3VudCBvcGVyYW5kcyAqLworICAgICAgaiA9IDA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXsKKwkgIGludCBmbGFncyA9IHY4NTBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3M7CisKKwkgIGlmIChmbGFncyAmIChWODUwX09QRVJBTkRfUkVHIHwgVjg1MF9PUEVSQU5EX1NSRyB8IFY4NTBfT1BFUkFORF9DQykpCisJICAgIGorKzsKKwl9CisgICAgICBzd2l0Y2ggKGopCisJeworCWNhc2UgMDoKKwkgIHByaW50ZiAoInByaW50ZihcIiAgICVzXFxuXCIpO1xuIiwgb3Bjb2RlLT5uYW1lKTsKKwkgIGJyZWFrOworCWNhc2UgMToKKwkgIHByaW50ZiAoInByaW50ZihcIiAgICVzXFx0JSV4XFxuXCIsIE9QWzBdKTtcbiIsIG9wY29kZS0+bmFtZSk7CisJICBicmVhazsKKwljYXNlIDI6CisJICBwcmludGYgKCJwcmludGYoXCIgICAlc1xcdCUleCwlJXhcXG5cIixPUFswXSxPUFsxXSk7XG4iLAorCQkgIG9wY29kZS0+bmFtZSk7CisJICBicmVhazsKKwljYXNlIDM6CisJICBwcmludGYgKCJwcmludGYoXCIgICAlc1xcdCUleCwlJXgsJSV4XFxuXCIsT1BbMF0sT1BbMV0sT1BbMl0pO1xuIiwKKwkJICBvcGNvZGUtPm5hbWUpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGZwcmludGYgKHN0ZGVyciwiVG9vIG1hbnkgb3BlcmFuZHM6ICVkXG4iLCBqKTsKKwl9CisgICAgICBwcmludGYgKCJ9XG5cbiIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3dyaXRlX29wY29kZXMgKCkKK3sKKyAgc3RydWN0IHY4NTBfb3Bjb2RlICpvcGNvZGU7CisgIGludCBpLCBqOworICBpbnQgbnVtb3BzOworICAKKyAgLyogd3JpdGUgb3V0IG9wY29kZSB0YWJsZSAqLworICBwcmludGYgKCIjaW5jbHVkZSBcInNpbS1tYWluLmhcIlxuIik7CisgIHByaW50ZiAoIiNpbmNsdWRlIFwidjg1MF9zaW0uaFwiXG4iKTsKKyAgcHJpbnRmICgiI2luY2x1ZGUgXCJzaW1vcHMuaFwiXG5cbiIpOworICBwcmludGYgKCJzdHJ1Y3Qgc2ltb3BzIFNpbW9wc1tdID0ge1xuIik7CisgIAorICBmb3IgKG9wY29kZSA9IChzdHJ1Y3Qgdjg1MF9vcGNvZGUgKil2ODUwX29wY29kZXM7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCisgICAgeworICAgICAgcHJpbnRmICgiICB7IDB4JXgsMHgleCxPUF8lWCwiLAorCSAgICAgIG9wY29kZS0+b3Bjb2RlLCBvcGNvZGUtPm1hc2ssIG9wY29kZS0+b3Bjb2RlKTsKKyAgICAgIAorICAgICAgT3Bjb2Rlc1tjdXJvcCsrXSA9IG9wY29kZS0+b3Bjb2RlOworCisgICAgICAvKiBjb3VudCBvcGVyYW5kcyAqLworICAgICAgaiA9IDA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXsKKwkgIGludCBmbGFncyA9IHY4NTBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3M7CisKKwkgIGlmIChmbGFncyAmIChWODUwX09QRVJBTkRfUkVHIHwgVjg1MF9PUEVSQU5EX1NSRyB8IFY4NTBfT1BFUkFORF9DQykpCisJICAgIGorKzsKKwl9CisgICAgICBwcmludGYgKCIlZCx7IixqKTsKKwkgIAorICAgICAgaiA9IDA7CisgICAgICBudW1vcHMgPSAwOworICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwl7CisJICBpbnQgZmxhZ3MgPSB2ODUwX29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzOworCSAgaW50IHNoaWZ0ID0gdjg1MF9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5zaGlmdDsKKworCSAgaWYgKGZsYWdzICYgKFY4NTBfT1BFUkFORF9SRUcgfCBWODUwX09QRVJBTkRfU1JHIHwgVjg1MF9PUEVSQU5EX0NDKSkKKwkgICAgeworCSAgICAgIGlmIChqKQorCQlwcmludGYgKCIsICIpOworCSAgICAgIHByaW50ZiAoIiVkLCVkLCVkIiwgc2hpZnQsCisJCSAgICAgIHY4NTBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uYml0cyxmbGFncyk7CisJICAgICAgaiA9IDE7CisJICAgICAgbnVtb3BzKys7CisJICAgIH0KKwl9CisKKyAgICAgIHN3aXRjaCAobnVtb3BzKQorCXsKKwljYXNlIDA6CisJICBwcmludGYgKCIwLDAsMCIpOworCWNhc2UgMToKKwkgIHByaW50ZiAoIiwwLDAsMCIpOworCX0KKworICAgICAgcHJpbnRmICgifX0sXG4iKTsKKyAgICB9CisgIHByaW50ZiAoInsgMCwwLE5VTEwsMCx7MCwwLDAsMCwwLDB9fSxcbn07XG4iKTsKK30KZGlmZiAtLWdpdCBhL3NpbS92ODUwL2ludGVycC5jIGIvc2ltL3Y4NTAvaW50ZXJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlNWUzYQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS92ODUwL2ludGVycC5jCkBAIC0wLDAgKzEsMzYwIEBACisjaW5jbHVkZSAic2ltLW1haW4uaCIKKyNpbmNsdWRlICJzaW0tb3B0aW9ucy5oIgorI2luY2x1ZGUgInY4NTBfc2ltLmgiCisjaW5jbHVkZSAic2ltLWFzc2VydC5oIgorI2luY2x1ZGUgIml0YWJsZS5oIgorCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgImJmZC5oIgorCisjaWZuZGVmIElOTElORQorI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIElOTElORSBpbmxpbmUKKyNlbHNlCisjZGVmaW5lIElOTElORQorI2VuZGlmCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgKiBnZXRfaW5zbl9uYW1lIChzaW1fY3B1ICosIGludCk7CisKKy8qIEZvciBjb21wYXRpYmlsaXR5ICovCitTSU1fREVTQyBzaW11bGF0b3I7CisKKworCisvKiB2ODUwIGludGVycnVwdCBtb2RlbCAqLworCitlbnVtIGludGVycnVwdF90eXBlCit7CisgIGludF9yZXNldCwKKyAgaW50X25taSwKKyAgaW50X2ludG92MSwKKyAgaW50X2ludHAxMCwKKyAgaW50X2ludHAxMSwKKyAgaW50X2ludHAxMiwKKyAgaW50X2ludHAxMywKKyAgaW50X2ludGNtNCwKKyAgbnVtX2ludF90eXBlcworfTsKKworY2hhciAqaW50ZXJydXB0X25hbWVzW10gPSB7CisgICJyZXNldCIsCisgICJubWkiLAorICAiaW50b3YxIiwKKyAgImludHAxMCIsCisgICJpbnRwMTEiLAorICAiaW50cDEyIiwKKyAgImludHAxMyIsCisgICJpbnRjbTQiLAorICBOVUxMCit9OworCitzdGF0aWMgdm9pZAorZG9faW50ZXJydXB0IChzZCwgZGF0YSkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIHZvaWQgKmRhdGE7Cit7CisgIGNoYXIgKippbnRlcnJ1cHRfbmFtZSA9IChjaGFyKiopZGF0YTsKKyAgZW51bSBpbnRlcnJ1cHRfdHlwZSBpbnR0eXBlOworICBpbnR0eXBlID0gKGludGVycnVwdF9uYW1lIC0gU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKS0+aW50ZXJydXB0X25hbWVzKTsKKworICAvKiBGb3IgYSBoYXJkd2FyZSByZXNldCwgZHJvcCBldmVyeXRoaW5nIGFuZCBqdW1wIHRvIHRoZSBzdGFydAorICAgICBhZGRyZXNzICovCisgIGlmIChpbnR0eXBlID09IGludF9yZXNldCkKKyAgICB7CisgICAgICBQQyA9IDA7CisgICAgICBQU1cgPSAweDIwOworICAgICAgRUNSID0gMDsKKyAgICAgIHNpbV9lbmdpbmVfcmVzdGFydCAoc2QsIE5VTEwsIE5VTEwsIE5VTExfQ0lBKTsKKyAgICB9CisKKyAgLyogRGVsaXZlciBhbiBOTUkgd2hlbiBhbGxvd2VkICovCisgIGlmIChpbnR0eXBlID09IGludF9ubWkpCisgICAgeworICAgICAgaWYgKFBTVyAmIFBTV19OUCkKKwl7CisJICAvKiBXZSdyZSBhbHJlYWR5IHdvcmtpbmcgb24gYW4gTk1JLCBzbyB0aGlzIG9uZSBtdXN0IHdhaXQKKwkgICAgIGFyb3VuZCB1bnRpbCB0aGUgcHJldmlvdXMgb25lIGlzIGRvbmUuICBUaGUgcHJvY2Vzc29yCisJICAgICBpZ25vcmVzIHN1YnNlcXVlbnQgTk1Jcywgc28gd2UgZG9uJ3QgbmVlZCB0byBjb3VudCB0aGVtLgorCSAgICAgSnVzdCBrZWVwIHJlLXNjaGVkdWxpbmcgYSBzaW5nbGUgTk1JIHVudGlsIGl0IG1hbmFnZXMgdG8KKwkgICAgIGJlIGRlbGl2ZXJlZCAqLworCSAgaWYgKFNUQVRFX0NQVSAoc2QsIDApLT5wZW5kaW5nX25taSAhPSBOVUxMKQorCSAgICBzaW1fZXZlbnRzX2Rlc2NoZWR1bGUgKHNkLCBTVEFURV9DUFUgKHNkLCAwKS0+cGVuZGluZ19ubWkpOworCSAgU1RBVEVfQ1BVIChzZCwgMCktPnBlbmRpbmdfbm1pID0KKwkgICAgc2ltX2V2ZW50c19zY2hlZHVsZSAoc2QsIDEsIGRvX2ludGVycnVwdCwgZGF0YSk7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIE5NSSBjYW4gYmUgZGVsaXZlcmVkLiAgRG8gbm90IGRlc2NoZWR1bGUgcGVuZGluZ19ubWkgYXMKKyAgICAgICAgICAgICB0aGF0LCBpZiBzdGlsbCBpbiB0aGUgZXZlbnQgcXVldWUsIGlzIGEgc2Vjb25kIE5NSSB0aGF0CisgICAgICAgICAgICAgbmVlZHMgdG8gYmUgZGVsaXZlcmVkIGxhdGVyLiAqLworCSAgRkVQQyA9IFBDOworCSAgRkVQU1cgPSBQU1c7CisJICAvKiBTZXQgdGhlIEZFQ0MgcGFydCBvZiB0aGUgRUNSLiAqLworCSAgRUNSICY9IDB4MDAwMGZmZmY7CisJICBFQ1IgfD0gMHgxMDsKKwkgIFBTVyB8PSBQU1dfTlA7CisJICBQU1cgJj0gflBTV19FUDsKKwkgIFBTVyB8PSBQU1dfSUQ7CisJICBQQyA9IDB4MTA7CisJICBzaW1fZW5naW5lX3Jlc3RhcnQgKHNkLCBOVUxMLCBOVUxMLCBOVUxMX0NJQSk7CisJfQorICAgIH0KKworICAvKiBkZWxpdmVyIG1hc2thYmxlIGludGVycnVwdCB3aGVuIGFsbG93ZWQgKi8KKyAgaWYgKGludHR5cGUgPiBpbnRfbm1pICYmIGludHR5cGUgPCBudW1faW50X3R5cGVzKQorICAgIHsKKyAgICAgIGlmICgoUFNXICYgUFNXX05QKSB8fCAoUFNXICYgUFNXX0lEKSkKKwl7CisJICAvKiBDYW4ndCBkZWxpdmVyIHRoaXMgaW50ZXJydXB0LCByZXNjaGVkdWxlIGl0IGZvciBsYXRlciAqLworCSAgc2ltX2V2ZW50c19zY2hlZHVsZSAoc2QsIDEsIGRvX2ludGVycnVwdCwgZGF0YSk7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIHNhdmUgY29udGV4dCAqLworCSAgRUlQQyA9IFBDOworCSAgRUlQU1cgPSBQU1c7CisJICAvKiBEaXNhYmxlIGZ1cnRoZXIgaW50ZXJydXB0cy4gICovCisJICBQU1cgfD0gUFNXX0lEOworCSAgLyogSW5kaWNhdGUgdGhhdCB3ZSdyZSBkb2luZyBpbnRlcnJ1cHQgbm90IGV4Y2VwdGlvbiBwcm9jZXNzaW5nLiAgKi8KKwkgIFBTVyAmPSB+UFNXX0VQOworCSAgLyogQ2xlYXIgdGhlIEVJQ0MgcGFydCBvZiB0aGUgRUNSLCB3aWxsIHNldCBiZWxvdy4gKi8KKwkgIEVDUiAmPSAweGZmZmYwMDAwOworCSAgc3dpdGNoIChpbnR0eXBlKQorCSAgICB7CisJICAgIGNhc2UgaW50X2ludG92MToKKwkgICAgICBQQyA9IDB4ODA7CisJICAgICAgRUNSIHw9IDB4ODA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgaW50X2ludHAxMDoKKwkgICAgICBQQyA9IDB4OTA7CisJICAgICAgRUNSIHw9IDB4OTA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgaW50X2ludHAxMToKKwkgICAgICBQQyA9IDB4YTA7CisJICAgICAgRUNSIHw9IDB4YTA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgaW50X2ludHAxMjoKKwkgICAgICBQQyA9IDB4YjA7CisJICAgICAgRUNSIHw9IDB4YjA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgaW50X2ludHAxMzoKKwkgICAgICBQQyA9IDB4YzA7CisJICAgICAgRUNSIHw9IDB4YzA7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgaW50X2ludGNtNDoKKwkgICAgICBQQyA9IDB4ZDA7CisJICAgICAgRUNSIHw9IDB4ZDA7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgLyogU2hvdWxkIG5ldmVyIGJlIHBvc3NpYmxlLiAgKi8KKwkgICAgICBzaW1fZW5naW5lX2Fib3J0IChzZCwgTlVMTCwgTlVMTF9DSUEsCisJCQkJImRvX2ludGVycnVwdCAtIGludGVybmFsIGVycm9yIC0gYmFkIHN3aXRjaCIpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgc2ltX2VuZ2luZV9yZXN0YXJ0IChzZCwgTlVMTCwgTlVMTCwgTlVMTF9DSUEpOworICAgIH0KKyAgCisgIC8qIHNvbWUgb3RoZXIgaW50ZXJydXB0PyAqLworICBzaW1fZW5naW5lX2Fib3J0IChzZCwgTlVMTCwgTlVMTF9DSUEsCisJCSAgICAiZG9faW50ZXJydXB0IC0gaW50ZXJuYWwgZXJyb3IgLSBpbnRlcnJ1cHQgJWQgdW5rbm93biIsCisJCSAgICBpbnR0eXBlKTsKK30KKworLyogUmV0dXJuIG5hbWUgb2YgYW4gaW5zbiwgdXNlZCBieSBpbnNuIHByb2ZpbGluZy4gICovCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2dldF9pbnNuX25hbWUgKHNpbV9jcHUgKmNwdSwgaW50IGkpCit7CisgIHJldHVybiBpdGFibGVbaV0ubmFtZTsKK30KKworLyogVGhlc2UgZGVmYXVsdCB2YWx1ZXMgY29ycmVzcG9uZCB0byBleHBlY3RlZCB1c2FnZSBmb3IgdGhlIGNoaXAuICAqLworCit1aW50MzIgT1BbNF07CisKKworU0lNX0RFU0MKK3NpbV9vcGVuIChraW5kLCBjYiwgYWJmZCwgYXJndikKKyAgICAgU0lNX09QRU5fS0lORCBraW5kOworICAgICBob3N0X2NhbGxiYWNrICpjYjsKKyAgICAgc3RydWN0IF9iZmQgKmFiZmQ7CisgICAgIGNoYXIgKiphcmd2OworeworICBTSU1fREVTQyBzZCA9IHNpbV9zdGF0ZV9hbGxvYyAoa2luZCwgY2IpOworICBpbnQgbWFjaDsKKworICBTSU1fQVNTRVJUIChTVEFURV9NQUdJQyAoc2QpID09IFNJTV9NQUdJQ19OVU1CRVIpOworCisgIC8qIGZvciBjb21wYXRpYmlsaXR5ICovCisgIHNpbXVsYXRvciA9IHNkOworCisgIC8qIEZJWE1FOiBzaG91bGQgYmUgYmV0dGVyIHdheSBvZiBzZXR0aW5nIHVwIGludGVycnVwdHMgKi8KKyAgU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKS0+cGMgPSAmKFBDKTsKKyAgU1RBVEVfV0FUQ0hQT0lOVFMgKHNkKS0+c2l6ZW9mX3BjID0gc2l6ZW9mIChQQyk7CisgIFNUQVRFX1dBVENIUE9JTlRTIChzZCktPmludGVycnVwdF9oYW5kbGVyID0gZG9faW50ZXJydXB0OworICBTVEFURV9XQVRDSFBPSU5UUyAoc2QpLT5pbnRlcnJ1cHRfbmFtZXMgPSBpbnRlcnJ1cHRfbmFtZXM7CisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgbWVjaGFuaXNtIGZvciBkb2luZyBpbnNuIHByb2ZpbGluZy4gICovCisgIENQVV9JTlNOX05BTUUgKFNUQVRFX0NQVSAoc2QsIDApKSA9IGdldF9pbnNuX25hbWU7CisgIENQVV9NQVhfSU5TTlMgKFNUQVRFX0NQVSAoc2QsIDApKSA9IG5yX2l0YWJsZV9lbnRyaWVzOworCisgIGlmIChzaW1fcHJlX2FyZ3ZfaW5pdCAoc2QsIGFyZ3ZbMF0pICE9IFNJTV9SQ19PSykKKyAgICByZXR1cm4gMDsKKworICAvKiBBbGxvY2F0ZSBjb3JlIG1hbmFnZWQgbWVtb3J5ICovCisKKyAgLyogIk1pcnJvciIgdGhlIFJPTSBhZGRyZXNzZXMgYmVsb3cgMU1CLiAqLworICBzaW1fZG9fY29tbWFuZGYgKHNkLCAibWVtb3J5IHJlZ2lvbiAwLDB4MTAwMDAwLDB4JWx4IiwgVjg1MF9ST01fU0laRSk7CisgIC8qIENodW5rIG9mIHJhbSBhZGphY2VudCB0byByb20gKi8KKyAgc2ltX2RvX2NvbW1hbmRmIChzZCwgIm1lbW9yeSByZWdpb24gMHgxMDAwMDAsMHglbHgiLCBWODUwX0xPV19FTkQtMHgxMDAwMDApOworICAvKiBwZXJpcGhlcmFsIEkvTyByZWdpb24gLSBtaXJyb3IgMUsgYWNyb3NzIDRrICgweDEwMDApICovCisgIHNpbV9kb19jb21tYW5kIChzZCwgIm1lbW9yeSByZWdpb24gMHhmZmYwMDAsMHgxMDAwLDEwMjQiKTsKKyAgLyogc2ltaWxhcmx5IGlmIGluIHRoZSBpbnRlcm5hbCBSQU0gcmVnaW9uICovCisgIHNpbV9kb19jb21tYW5kIChzZCwgIm1lbW9yeSByZWdpb24gMHhmZmUwMDAsMHgxMDAwLDEwMjQiKTsKKworICAvKiBnZXRvcHQgd2lsbCBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSBzbyB3ZSBqdXN0IGhhdmUgdG8gZXhpdCBpZiB0aGlzIGZhaWxzLgorICAgICBGSVhNRTogSG1tbS4uLiAgaW4gdGhlIGNhc2Ugb2YgZ2RiIHdlIG5lZWQgZ2V0b3B0IHRvIGNhbGwKKyAgICAgcHJpbnRfZmlsdGVyZWQuICAqLworICBpZiAoc2ltX3BhcnNlX2FyZ3MgKHNkLCBhcmd2KSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgLyogVW5pbnN0YWxsIHRoZSBtb2R1bGVzIHRvIGF2b2lkIG1lbW9yeSBsZWFrcywKKwkgZmlsZSBkZXNjcmlwdG9yIGxlYWtzLCBldGMuICAqLworICAgICAgc2ltX21vZHVsZV91bmluc3RhbGwgKHNkKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiBjaGVjayBmb3IvZXN0YWJsaXNoIHRoZSBhIHJlZmVyZW5jZSBwcm9ncmFtIGltYWdlICovCisgIGlmIChzaW1fYW5hbHl6ZV9wcm9ncmFtIChzZCwKKwkJCSAgIChTVEFURV9QUk9HX0FSR1YgKHNkKSAhPSBOVUxMCisJCQkgICAgPyAqU1RBVEVfUFJPR19BUkdWIChzZCkKKwkJCSAgICA6IE5VTEwpLAorCQkJICAgYWJmZCkgIT0gU0lNX1JDX09LKQorICAgIHsKKyAgICAgIHNpbV9tb2R1bGVfdW5pbnN0YWxsIChzZCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgLyogZXN0YWJsaXNoIGFueSByZW1haW5pbmcgY29uZmlndXJhdGlvbiBvcHRpb25zICovCisgIGlmIChzaW1fY29uZmlnIChzZCkgIT0gU0lNX1JDX09LKQorICAgIHsKKyAgICAgIHNpbV9tb2R1bGVfdW5pbnN0YWxsIChzZCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgaWYgKHNpbV9wb3N0X2FyZ3ZfaW5pdCAoc2QpICE9IFNJTV9SQ19PSykKKyAgICB7CisgICAgICAvKiBVbmluc3RhbGwgdGhlIG1vZHVsZXMgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLAorCSBmaWxlIGRlc2NyaXB0b3IgbGVha3MsIGV0Yy4gICovCisgICAgICBzaW1fbW9kdWxlX3VuaW5zdGFsbCAoc2QpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisKKyAgLyogZGV0ZXJtaW5lIHRoZSBtYWNoaW5lIHR5cGUgKi8KKyAgaWYgKFNUQVRFX0FSQ0hJVEVDVFVSRSAoc2QpICE9IE5VTEwKKyAgICAgICYmIFNUQVRFX0FSQ0hJVEVDVFVSRSAoc2QpLT5hcmNoID09IGJmZF9hcmNoX3Y4NTApCisgICAgbWFjaCA9IFNUQVRFX0FSQ0hJVEVDVFVSRSAoc2QpLT5tYWNoOworICBlbHNlCisgICAgbWFjaCA9IGJmZF9tYWNoX3Y4NTA7IC8qIGRlZmF1bHQgKi8KKworICAvKiBzZXQgbWFjaGluZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uICovCisgIHN3aXRjaCAobWFjaCkKKyAgICB7CisgICAgY2FzZSBiZmRfbWFjaF92ODUwOgorICAgIGNhc2UgYmZkX21hY2hfdjg1MGU6CisgICAgICBTVEFURV9DUFUgKHNkLCAwKS0+cHN3X21hc2sgPSAoUFNXX05QIHwgUFNXX0VQIHwgUFNXX0lEIHwgUFNXX1NBVAorCQkJCSAgICAgfCBQU1dfQ1kgfCBQU1dfT1YgfCBQU1dfUyB8IFBTV19aKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYmZkX21hY2hfdjg1MGVhOgorICAgICAgUFNXIHw9IFBTV19VUzsKKyAgICAgIFNUQVRFX0NQVSAoc2QsIDApLT5wc3dfbWFzayA9IChQU1dfVVMKKwkJCQkgICAgIHwgUFNXX05QIHwgUFNXX0VQIHwgUFNXX0lEIHwgUFNXX1NBVAorCQkJCSAgICAgfCBQU1dfQ1kgfCBQU1dfT1YgfCBQU1dfUyB8IFBTV19aKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gc2Q7Cit9CisKKwordm9pZAorc2ltX2Nsb3NlIChzZCwgcXVpdHRpbmcpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgcXVpdHRpbmc7Cit7CisgIHNpbV9tb2R1bGVfdW5pbnN0YWxsIChzZCk7Cit9CisKK1NJTV9SQworc2ltX2NyZWF0ZV9pbmZlcmlvciAoc2QsIHByb2dfYmZkLCBhcmd2LCBlbnYpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBzdHJ1Y3QgX2JmZCAqcHJvZ19iZmQ7CisgICAgIGNoYXIgKiphcmd2OworICAgICBjaGFyICoqZW52OworeworICBtZW1zZXQgKCZTdGF0ZSwgMCwgc2l6ZW9mIChTdGF0ZSkpOworICBpZiAocHJvZ19iZmQgIT0gTlVMTCkKKyAgICBQQyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAocHJvZ19iZmQpOworICAvKiBGb3Igdjg1MGVhLCBzZXQgUFNXW1VTXSBieSBkZWZhdWx0ICovCisgIGlmIChTVEFURV9BUkNISVRFQ1RVUkUgKHNkKSAhPSBOVUxMCisgICAgICAmJiBTVEFURV9BUkNISVRFQ1RVUkUgKHNkKS0+YXJjaCA9PSBiZmRfYXJjaF92ODUwCisgICAgICAmJiBTVEFURV9BUkNISVRFQ1RVUkUgKHNkKS0+bWFjaCA9PSBiZmRfbWFjaF92ODUwZWEpCisgICAgUFNXIHw9IFBTV19VUzsKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKworaW50CitzaW1fZmV0Y2hfcmVnaXN0ZXIgKHNkLCBybiwgbWVtb3J5LCBsZW5ndGgpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgcm47CisgICAgIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgKih1bnNpZ25lZDMyKiltZW1vcnkgPSBIMlRfNCAoU3RhdGUucmVnc1tybl0pOworICByZXR1cm4gLTE7Cit9CisgCitpbnQKK3NpbV9zdG9yZV9yZWdpc3RlciAoc2QsIHJuLCBtZW1vcnksIGxlbmd0aCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCBybjsKKyAgICAgdW5zaWduZWQgY2hhciAqbWVtb3J5OworICAgICBpbnQgbGVuZ3RoOworeworICBTdGF0ZS5yZWdzW3JuXSA9IFQySF80ICgqKHVuc2lnbmVkMzIqKW1lbW9yeSk7CisgIHJldHVybiAtMTsKK30KKwordm9pZAorc2ltX2RvX2NvbW1hbmQgKHNkLCBjbWQpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBjaGFyICpjbWQ7Cit7CisgIGNoYXIgKm1tX2NtZCA9ICJtZW1vcnktbWFwIjsKKyAgY2hhciAqaW50X2NtZCA9ICJpbnRlcnJ1cHQiOworCisgIGlmIChzaW1fYXJnc19jb21tYW5kIChzZCwgY21kKSAhPSBTSU1fUkNfT0spCisgICAgeworICAgICAgaWYgKHN0cm5jbXAgKGNtZCwgbW1fY21kLCBzdHJsZW4gKG1tX2NtZCkgPT0gMCkpCisJc2ltX2lvX2VwcmludGYgKHNkLCAiYG1lbW9yeS1tYXAnIGNvbW1hbmQgcmVwbGFjZWQgYnkgYHNpbSBtZW1vcnknXG4iKTsKKyAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKGNtZCwgaW50X2NtZCwgc3RybGVuIChpbnRfY21kKSkgPT0gMCkKKwlzaW1faW9fZXByaW50ZiAoc2QsICJgaW50ZXJydXB0JyBjb21tYW5kIHJlcGxhY2VkIGJ5IGBzaW0gd2F0Y2gnXG4iKTsKKyAgICAgIGVsc2UKKwlzaW1faW9fZXByaW50ZiAoc2QsICJVbmtub3duIGNvbW1hbmQgYCVzJ1xuIiwgY21kKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zaW0vdjg1MC9zaW0tbWFpbi5oIGIvc2ltL3Y4NTAvc2ltLW1haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2VhMzFmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Y4NTAvc2ltLW1haW4uaApAQCAtMCwwICsxLDM4OCBAQAorI2lmbmRlZiBTSU1fTUFJTl9ICisjZGVmaW5lIFNJTV9NQUlOX0gKKworLyogR2VuZXJhbCBjb25maWcgb3B0aW9ucyAqLworCisjZGVmaW5lIFdJVEhfQ09SRQorI2RlZmluZSBXSVRIX01PRFVMT19NRU1PUlkgMQorI2RlZmluZSBXSVRIX1dBVENIUE9JTlRTIDEKKworCisvKiBUaGUgdjg1MCBoYXMgMzJiaXQgd29yZHMsIG51bWJlcmVkIDMxIChNU0IpIHRvIDAgKExTQikgKi8KKworI2RlZmluZSBXSVRIX1RBUkdFVF9XT1JEX01TQiAzMQorCisKKyNpbmNsdWRlICJzaW0tYmFzaWNzLmgiCisjaW5jbHVkZSAic2ltLXNpZ25hbC5oIgorCit0eXBlZGVmIGFkZHJlc3Nfd29yZCBzaW1fY2lhOworCisjaW5jbHVkZSAic2ltLWJhc2UuaCIKKworI2luY2x1ZGUgInNpbW9wcy5oIgorI2luY2x1ZGUgImJmZC5oIgorCisKK3R5cGVkZWYgc2lnbmVkOCBpbnQ4OwordHlwZWRlZiB1bnNpZ25lZDggdWludDg7Cit0eXBlZGVmIHNpZ25lZDE2IGludDE2OwordHlwZWRlZiB1bnNpZ25lZDE2IHVpbnQxNjsKK3R5cGVkZWYgc2lnbmVkMzIgaW50MzI7Cit0eXBlZGVmIHVuc2lnbmVkMzIgdWludDMyOwordHlwZWRlZiB1bnNpZ25lZDMyIHJlZ190OworCisKKy8qIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwcm9jZXNzb3I7IHJlZ2lzdGVycywgbWVtb3J5LCBldGMuICAqLworCit0eXBlZGVmIHN0cnVjdCBfdjg1MF9yZWdzIHsKKyAgcmVnX3QgcmVnc1szMl07CQkvKiBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzICovCisgIHJlZ190IHNyZWdzWzMyXTsJCS8qIHN5c3RlbSByZWdpc3RlcnMsIGluY2x1ZGluZyBwc3cgKi8KKyAgcmVnX3QgcGM7CisgIGludCBkdW1teV9tZW07CQkvKiB3aGVyZSBpbnZhbGlkIGFjY2Vzc2VzIGdvICovCit9IHY4NTBfcmVnczsKKworc3RydWN0IF9zaW1fY3B1Cit7CisgIC8qIC4uLiBzaW11bGF0b3Igc3BlY2lmaWMgbWVtYmVycyAuLi4gKi8KKyAgdjg1MF9yZWdzIHJlZzsKKyAgcmVnX3QgcHN3X21hc2s7ICAgICAgICAgICAgICAgLyogb25seSBhbGxvdyBub24tcmVzZXJ2ZWQgYml0cyB0byBiZSBzZXQgKi8KKyAgc2ltX2V2ZW50ICpwZW5kaW5nX25taTsKKyAgLyogLi4uIGJhc2UgdHlwZSAuLi4gKi8KKyAgc2ltX2NwdV9iYXNlIGJhc2U7Cit9OworCisjZGVmaW5lIENJQV9HRVQoQ1BVKSAoKENQVSktPnJlZy5wYyArIDApCisjZGVmaW5lIENJQV9TRVQoQ1BVLFZBTCkgKChDUFUpLT5yZWcucGMgPSAoVkFMKSkKKworc3RydWN0IHNpbV9zdGF0ZSB7CisgIHNpbV9jcHUgY3B1W01BWF9OUl9QUk9DRVNTT1JTXTsKKyNpZiAoV0lUSF9TTVApCisjZGVmaW5lIFNUQVRFX0NQVShzZCxuKSAoJihzZCktPmNwdVtuXSkKKyNlbHNlCisjZGVmaW5lIFNUQVRFX0NQVShzZCxuKSAoJihzZCktPmNwdVswXSkKKyNlbmRpZgorI2lmIDAKKyAgU0lNX0FERFIgcm9tX3NpemU7CisgIFNJTV9BRERSIGxvd19lbmQ7CisgIFNJTV9BRERSIGhpZ2hfc3RhcnQ7CisgIFNJTV9BRERSIGhpZ2hfYmFzZTsKKyAgdm9pZCAqbWVtOworI2VuZGlmCisgIHNpbV9zdGF0ZV9iYXNlIGJhc2U7Cit9OworCisvKiBGb3IgY29tcGF0aWJpbGl0eSwgdW50aWwgYWxsIGZ1bmN0aW9ucyBjb252ZXJ0ZWQgdG8gcGFzc2luZworICAgU0lNX0RFU0MgYXMgYW4gYXJndW1lbnQgKi8KK2V4dGVybiBTSU1fREVTQyBzaW11bGF0b3I7CisKKworI2RlZmluZSBWODUwX1JPTV9TSVpFIDB4ODAwMAorI2RlZmluZSBWODUwX0xPV19FTkQgMHgyMDAwMDAKKyNkZWZpbmUgVjg1MF9ISUdIX1NUQVJUIDB4ZmZlMDAwCisKKworLyogQmVjYXVzZSB3ZSBhcmUgc3RpbGwgdXNpbmcgdGhlIG9sZCBzZW1hbnRpYyB0YWJsZSwgcHJvdmlkZSBjb21wYXQKKyAgIG1hY3JvJ3MgdGhhdCBzdG9yZSB0aGUgaW5zdHJ1Y3Rpb24gd2hlcmUgdGhlIG9sZCBzaW1vcHMgZXhwZWN0cworICAgaXQuICovCisKK2V4dGVybiB1aW50MzIgT1BbNF07CisjaWYgMAorT1BbMF0gPSBpbnN0ICYgMHgxZjsgICAgICAgICAgIC8qIFJSUlJSIC0+IHJlZzEgKi8KK09QWzFdID0gKGluc3QgPj4gMTEpICYgMHgxZjsgICAvKiBycnJyciAtPiByZWcyICovCitPUFsyXSA9IChpbnN0ID4+IDE2KSAmIDB4ZmZmZjsgLyogd3d3d3cgLT4gcmVnMyBPUiBpbW0xNiAqLworT1BbM10gPSBpbnN0OworI2VuZGlmCisKKyNkZWZpbmUgU0FWRV8xIFwKK1BDID0gY2lhOyBcCitPUFswXSA9IGluc3RydWN0aW9uXzAgJiAweDFmOyBcCitPUFsxXSA9IChpbnN0cnVjdGlvbl8wID4+IDExKSAmIDB4MWY7IFwKK09QWzJdID0gMDsgXAorT1BbM10gPSBpbnN0cnVjdGlvbl8wCisKKyNkZWZpbmUgQ09NUEFUXzEoQ0FMTCkgXAorU0FWRV8xOyBcCitQQyArPSAoQ0FMTCk7IFwKK25pYSA9IFBDCisKKyNkZWZpbmUgU0FWRV8yIFwKK1BDID0gY2lhOyBcCitPUFswXSA9IGluc3RydWN0aW9uXzAgJiAweDFmOyBcCitPUFsxXSA9IChpbnN0cnVjdGlvbl8wID4+IDExKSAmIDB4MWY7IFwKK09QWzJdID0gaW5zdHJ1Y3Rpb25fMTsgXAorT1BbM10gPSAoaW5zdHJ1Y3Rpb25fMSA8PCAxNikgfCBpbnN0cnVjdGlvbl8wCisKKyNkZWZpbmUgQ09NUEFUXzIoQ0FMTCkgXAorU0FWRV8yOyBcCitQQyArPSAoQ0FMTCk7IFwKK25pYSA9IFBDCisKKworLyogbmV3ICovCisjZGVmaW5lIEdSICAoKENQVSktPnJlZy5yZWdzKQorI2RlZmluZSBTUiAgKChDUFUpLT5yZWcuc3JlZ3MpCisKKy8qIG9sZCAqLworI2RlZmluZSBTdGF0ZSAgICAoU1RBVEVfQ1BVIChzaW11bGF0b3IsIDApLT5yZWcpCisjZGVmaW5lIFBDCShTdGF0ZS5wYykKKyNkZWZpbmUgU1AJKFN0YXRlLnJlZ3NbM10pCisjZGVmaW5lIEVQCShTdGF0ZS5yZWdzWzMwXSkKKworI2RlZmluZSBFSVBDICAoU3RhdGUuc3JlZ3NbMF0pCisjZGVmaW5lIEVJUFNXIChTdGF0ZS5zcmVnc1sxXSkKKyNkZWZpbmUgRkVQQyAgKFN0YXRlLnNyZWdzWzJdKQorI2RlZmluZSBGRVBTVyAoU3RhdGUuc3JlZ3NbM10pCisjZGVmaW5lIEVDUiAgIChTdGF0ZS5zcmVnc1s0XSkKKyNkZWZpbmUgUFNXICAgKFN0YXRlLnNyZWdzWzVdKQorI2RlZmluZSBDVFBDICAoU1JbMTZdKQorI2RlZmluZSBDVFBTVyAoU1JbMTddKQorI2RlZmluZSBEQlBDICAoU3RhdGUuc3JlZ3NbMThdKQorI2RlZmluZSBEQlBTVyAoU3RhdGUuc3JlZ3NbMTldKQorI2RlZmluZSBDVEJQICAoU3RhdGUuc3JlZ3NbMjBdKQorCisjZGVmaW5lIFBTV19VUyBCSVQzMiAoOCkKKyNkZWZpbmUgUFNXX05QIDB4ODAKKyNkZWZpbmUgUFNXX0VQIDB4NDAKKyNkZWZpbmUgUFNXX0lEIDB4MjAKKyNkZWZpbmUgUFNXX1NBVCAweDEwCisjZGVmaW5lIFBTV19DWSAweDgKKyNkZWZpbmUgUFNXX09WIDB4NAorI2RlZmluZSBQU1dfUyAweDIKKyNkZWZpbmUgUFNXX1ogMHgxCisKKyNkZWZpbmUgU0VYVDMoeCkJKCgoKHgpJjB4NyleKH4weDMpKSsweDQpCQorCisvKiBzaWduLWV4dGVuZCBhIDQtYml0IG51bWJlciAqLworI2RlZmluZSBTRVhUNCh4KQkoKCgoeCkmMHhmKV4ofjB4NykpKzB4OCkJCisKKy8qIHNpZ24tZXh0ZW5kIGEgNS1iaXQgbnVtYmVyICovCisjZGVmaW5lIFNFWFQ1KHgpCSgoKCh4KSYweDFmKV4ofjB4ZikpKzB4MTApCQorCisvKiBzaWduLWV4dGVuZCBhIDktYml0IG51bWJlciAqLworI2RlZmluZSBTRVhUOSh4KQkoKCgoeCkmMHgxZmYpXih+MHhmZikpKzB4MTAwKQorCisvKiBzaWduLWV4dGVuZCBhIDIyLWJpdCBudW1iZXIgKi8KKyNkZWZpbmUgU0VYVDIyKHgpCSgoKCh4KSYweDNmZmZmZileKH4weDFmZmZmZikpKzB4MjAwMDAwKQorCisvKiBzaWduIGV4dGVuZCBhIDQwIGJpdCBudW1iZXIgKi8KKyNkZWZpbmUgU0VYVDQwKHgpCSgoKCh4KSAmIFVOU0lHTkVENjQgKDB4ZmZmZmZmZmZmZikpIFwKKwkJCSAgXiAoflVOU0lHTkVENjQgKDB4N2ZmZmZmZmZmZikpKSBcCisJCQkgKyBVTlNJR05FRDY0ICgweDgwMDAwMDAwMDApKQorCisvKiBzaWduIGV4dGVuZCBhIDQ0IGJpdCBudW1iZXIgKi8KKyNkZWZpbmUgU0VYVDQ0KHgpCSgoKCh4KSAmIFVOU0lHTkVENjQgKDB4ZmZmZmZmZmZmZmYpKSBcCisJCQkgIF4gKH4gVU5TSUdORUQ2NCAoMHg3ZmZmZmZmZmZmZikpKSBcCisJCQkgKyBVTlNJR05FRDY0ICgweDgwMDAwMDAwMDAwKSkKKworLyogc2lnbiBleHRlbmQgYSA2MCBiaXQgbnVtYmVyICovCisjZGVmaW5lIFNFWFQ2MCh4KQkoKCgoeCkgJiBVTlNJR05FRDY0ICgweGZmZmZmZmZmZmZmZmZmZikpIFwKKwkJCSAgXiAofiBVTlNJR05FRDY0ICgweDdmZmZmZmZmZmZmZmZmZikpKSBcCisJCQkgKyBVTlNJR05FRDY0ICgweDgwMDAwMDAwMDAwMDAwMCkpCisKKy8qIE5vIHNpZ24gZXh0ZW5zaW9uICovCisjZGVmaW5lIE5PUCh4KQkJKHgpCisKKyNkZWZpbmUgSU5DX0FERFIoeCxpKQl4ID0gKChTdGF0ZS5NRCAmJiB4ID09IE1PRF9FKSA/IE1PRF9TIDogKHgpKyhpKSkKKworI2RlZmluZSBSTFcoeCkgbG9hZF9tZW0gKHgsIDQpCisKKy8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4gICovCisKKyNkZWZpbmUgSU1FTTE2KEVBKSBcCitzaW1fY29yZV9yZWFkX2FsaWduZWRfMiAoQ1BVLCBQQywgZXhlY19tYXAsIChFQSkpCisKKyNkZWZpbmUgSU1FTTE2X0lNTUVEKEVBLE4pIFwKK3NpbV9jb3JlX3JlYWRfYWxpZ25lZF8yIChTVEFURV9DUFUgKHNkLCAwKSwgXAorCQkJIFBDLCBleGVjX21hcCwgKEVBKSArIChOKSAqIDIpCisKKyNkZWZpbmUgbG9hZF9tZW0oQUREUixMRU4pIFwKK3NpbV9jb3JlX3JlYWRfdW5hbGlnbmVkXyMjTEVOIChTVEFURV9DUFUgKHNpbXVsYXRvciwgMCksIFwKKwkJCSAgICAgICBQQywgcmVhZF9tYXAsIChBRERSKSkKKworI2RlZmluZSBzdG9yZV9tZW0oQUREUixMRU4sREFUQSkgXAorc2ltX2NvcmVfd3JpdGVfdW5hbGlnbmVkXyMjTEVOIChTVEFURV9DUFUgKHNpbXVsYXRvciwgMCksIFwKKwkJCQlQQywgd3JpdGVfbWFwLCAoQUREUiksIChEQVRBKSkKKworCisvKiBjb21wYXJlIGNjY2MgZmllbGQgYWdhaW5zdCBQU1cgKi8KK2ludCBjb25kaXRpb25fbWV0ICh1bnNpZ25lZCBjb2RlKTsKKworCisvKiBEZWJ1Zy90cmFjaW5nIGNhbGxzICovCisKK2VudW0gb3BfdHlwZXMKK3sKKyAgT1BfVU5LTk9XTiwKKyAgT1BfTk9ORSwKKyAgT1BfVFJBUCwKKyAgT1BfUkVHLAorICBPUF9SRUdfUkVHLAorICBPUF9SRUdfUkVHX0NNUCwKKyAgT1BfUkVHX1JFR19NT1ZFLAorICBPUF9JTU1fUkVHLAorICBPUF9JTU1fUkVHX0NNUCwKKyAgT1BfSU1NX1JFR19NT1ZFLAorICBPUF9DT05EX0JSLAorICBPUF9MT0FEMTYsCisgIE9QX1NUT1JFMTYsCisgIE9QX0xPQUQzMiwKKyAgT1BfU1RPUkUzMiwKKyAgT1BfSlVNUCwKKyAgT1BfSU1NX1JFR19SRUcsCisgIE9QX1VJTU1fUkVHX1JFRywKKyAgT1BfSU1NMTZfUkVHX1JFRywKKyAgT1BfVUlNTTE2X1JFR19SRUcsCisgIE9QX0JJVCwKKyAgT1BfRVgxLAorICBPUF9FWDIsCisgIE9QX0xEU1IsCisgIE9QX1NUU1IsCisgIE9QX0JJVF9DSEFOR0UsCisgIE9QX1JFR19SRUdfUkVHLAorICBPUF9SRUdfUkVHMywKKyAgT1BfSU1NX1JFR19SRUdfUkVHLAorICBPUF9QVVNIUE9QMSwKKyAgT1BfUFVTSFBPUDIsCisgIE9QX1BVU0hQT1AzLAorfTsKKworI2lmZGVmIERFQlVHCit2b2lkIHRyYWNlX2lucHV0IFBBUkFNUyAoKGNoYXIgKm5hbWUsIGVudW0gb3BfdHlwZXMgdHlwZSwgaW50IHNpemUpKTsKK3ZvaWQgdHJhY2Vfb3V0cHV0IFBBUkFNUyAoKGVudW0gb3BfdHlwZXMgcmVzdWx0KSk7Cit2b2lkIHRyYWNlX3Jlc3VsdCBQQVJBTVMgKChpbnQgaGFzX3Jlc3VsdCwgdW5zaWduZWQzMiByZXN1bHQpKTsKKworZXh0ZXJuIGludCB0cmFjZV9udW1fdmFsdWVzOworZXh0ZXJuIHVuc2lnbmVkMzIgdHJhY2VfdmFsdWVzW107CitleHRlcm4gdW5zaWduZWQzMiB0cmFjZV9wYzsKK2V4dGVybiBjb25zdCBjaGFyICp0cmFjZV9uYW1lOworZXh0ZXJuIGludCB0cmFjZV9tb2R1bGU7CisKKyNkZWZpbmUgVFJBQ0VfQlJBTkNIMCgpIFwKK2RvIHsgXAorICBpZiAoVFJBQ0VfQlJBTkNIX1AgKENQVSkpIHsgXAorICAgIHRyYWNlX21vZHVsZSA9IFRSQUNFX0JSQU5DSF9JRFg7IFwKKyAgICB0cmFjZV9wYyA9IGNpYTsgXAorICAgIHRyYWNlX25hbWUgPSBpdGFibGVbTVlfSU5ERVhdLm5hbWU7IFwKKyAgICB0cmFjZV9udW1fdmFsdWVzID0gMDsgXAorICAgIHRyYWNlX3Jlc3VsdCAoMSwgKG5pYSkpOyBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUUkFDRV9CUkFOQ0gxKElOMSkgXAorZG8geyBcCisgIGlmIChUUkFDRV9CUkFOQ0hfUCAoQ1BVKSkgeyBcCisgICAgdHJhY2VfbW9kdWxlID0gVFJBQ0VfQlJBTkNIX0lEWDsgXAorICAgIHRyYWNlX3BjID0gY2lhOyBcCisgICAgdHJhY2VfbmFtZSA9IGl0YWJsZVtNWV9JTkRFWF0ubmFtZTsgXAorICAgIHRyYWNlX3ZhbHVlc1swXSA9IChJTjEpOyBcCisgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDE7IFwKKyAgICB0cmFjZV9yZXN1bHQgKDEsIChuaWEpKTsgXAorICB9IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVFJBQ0VfQlJBTkNIMihJTjEsIElOMikgXAorZG8geyBcCisgIGlmIChUUkFDRV9CUkFOQ0hfUCAoQ1BVKSkgeyBcCisgICAgdHJhY2VfbW9kdWxlID0gVFJBQ0VfQlJBTkNIX0lEWDsgXAorICAgIHRyYWNlX3BjID0gY2lhOyBcCisgICAgdHJhY2VfbmFtZSA9IGl0YWJsZVtNWV9JTkRFWF0ubmFtZTsgXAorICAgIHRyYWNlX3ZhbHVlc1swXSA9IChJTjEpOyBcCisgICAgdHJhY2VfdmFsdWVzWzFdID0gKElOMik7IFwKKyAgICB0cmFjZV9udW1fdmFsdWVzID0gMjsgXAorICAgIHRyYWNlX3Jlc3VsdCAoMSwgKG5pYSkpOyBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUUkFDRV9CUkFOQ0gzKElOMSwgSU4yLCBJTjMpIFwKK2RvIHsgXAorICBpZiAoVFJBQ0VfQlJBTkNIX1AgKENQVSkpIHsgXAorICAgIHRyYWNlX21vZHVsZSA9IFRSQUNFX0JSQU5DSF9JRFg7IFwKKyAgICB0cmFjZV9wYyA9IGNpYTsgXAorICAgIHRyYWNlX25hbWUgPSBpdGFibGVbTVlfSU5ERVhdLm5hbWU7IFwKKyAgICB0cmFjZV92YWx1ZXNbMF0gPSAoSU4xKTsgXAorICAgIHRyYWNlX3ZhbHVlc1sxXSA9IChJTjIpOyBcCisgICAgdHJhY2VfdmFsdWVzWzJdID0gKElOMyk7IFwKKyAgICB0cmFjZV9udW1fdmFsdWVzID0gMzsgXAorICAgIHRyYWNlX3Jlc3VsdCAoMSwgKG5pYSkpOyBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUUkFDRV9MRChBRERSLFJFU1VMVCkgXAorZG8geyBcCisgIGlmIChUUkFDRV9NRU1PUllfUCAoQ1BVKSkgeyBcCisgICAgdHJhY2VfbW9kdWxlID0gVFJBQ0VfTUVNT1JZX0lEWDsgXAorICAgIHRyYWNlX3BjID0gY2lhOyBcCisgICAgdHJhY2VfbmFtZSA9IGl0YWJsZVtNWV9JTkRFWF0ubmFtZTsgXAorICAgIHRyYWNlX3ZhbHVlc1swXSA9IChBRERSKTsgXAorICAgIHRyYWNlX251bV92YWx1ZXMgPSAxOyBcCisgICAgdHJhY2VfcmVzdWx0ICgxLCAoUkVTVUxUKSk7IFwKKyAgfSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFRSQUNFX0xEX05BTUUoTkFNRSwgQUREUixSRVNVTFQpIFwKK2RvIHsgXAorICBpZiAoVFJBQ0VfTUVNT1JZX1AgKENQVSkpIHsgXAorICAgIHRyYWNlX21vZHVsZSA9IFRSQUNFX01FTU9SWV9JRFg7IFwKKyAgICB0cmFjZV9wYyA9IGNpYTsgXAorICAgIHRyYWNlX25hbWUgPSAoTkFNRSk7IFwKKyAgICB0cmFjZV92YWx1ZXNbMF0gPSAoQUREUik7IFwKKyAgICB0cmFjZV9udW1fdmFsdWVzID0gMTsgXAorICAgIHRyYWNlX3Jlc3VsdCAoMSwgKFJFU1VMVCkpOyBcCisgIH0gXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUUkFDRV9TVChBRERSLFJFU1VMVCkgXAorZG8geyBcCisgIGlmIChUUkFDRV9NRU1PUllfUCAoQ1BVKSkgeyBcCisgICAgdHJhY2VfbW9kdWxlID0gVFJBQ0VfTUVNT1JZX0lEWDsgXAorICAgIHRyYWNlX3BjID0gY2lhOyBcCisgICAgdHJhY2VfbmFtZSA9IGl0YWJsZVtNWV9JTkRFWF0ubmFtZTsgXAorICAgIHRyYWNlX3ZhbHVlc1swXSA9IChBRERSKTsgXAorICAgIHRyYWNlX251bV92YWx1ZXMgPSAxOyBcCisgICAgdHJhY2VfcmVzdWx0ICgxLCAoUkVTVUxUKSk7IFwKKyAgfSBcCit9IHdoaWxlICgwKQorCisjZWxzZQorI2RlZmluZSB0cmFjZV9pbnB1dChOQU1FLCBJTjEsIElOMikKKyNkZWZpbmUgdHJhY2Vfb3V0cHV0KFJFU1VMVCkKKyNkZWZpbmUgdHJhY2VfcmVzdWx0KEhBU19SRVNVTFQsIFJFU1VMVCkKKworI2RlZmluZSBUUkFDRV9BTFVfSU5QVVQwKCkKKyNkZWZpbmUgVFJBQ0VfQUxVX0lOUFVUMShJTjApCisjZGVmaW5lIFRSQUNFX0FMVV9JTlBVVDIoSU4wLCBJTjEpCisjZGVmaW5lIFRSQUNFX0FMVV9JTlBVVDIoSU4wLCBJTjEpCisjZGVmaW5lIFRSQUNFX0FMVV9JTlBVVDIoSU4wLCBJTjEgSU5TMikKKyNkZWZpbmUgVFJBQ0VfQUxVX1JFU1VMVChSRVNVTFQpCisKKyNkZWZpbmUgVFJBQ0VfQlJBTkNIMCgpCisjZGVmaW5lIFRSQUNFX0JSQU5DSDEoSU4xKQorI2RlZmluZSBUUkFDRV9CUkFOQ0gyKElOMSwgSU4yKQorI2RlZmluZSBUUkFDRV9CUkFOQ0gyKElOMSwgSU4yLCBJTjMpCisKKyNkZWZpbmUgVFJBQ0VfTEQoQUREUixSRVNVTFQpCisjZGVmaW5lIFRSQUNFX1NUKEFERFIsUkVTVUxUKQorCisjZW5kaWYKKworCitleHRlcm4gdm9pZCBkaXZ1biAoIHVuc2lnbmVkIGludCAgICAgICBOLAorCQkgICAgdW5zaWduZWQgbG9uZyBpbnQgIGFscywKKwkJICAgIHVuc2lnbmVkIGxvbmcgaW50ICBzZmksCisJCSAgICB1bnNpZ25lZDMyIC8qdW5zaWduZWQgbG9uZyBpbnQqLyAqICBxdW90aWVudF9wdHIsCisJCSAgICB1bnNpZ25lZDMyIC8qdW5zaWduZWQgbG9uZyBpbnQqLyAqICByZW1haW5kZXJfcHRyLAorCQkgICAgYm9vbGVhbiAqICAgICAgICAgIG92ZXJmbG93X3B0cgorCQkgICAgKTsKK2V4dGVybiB2b2lkIGRpdm4gKCB1bnNpZ25lZCBpbnQgICAgICAgTiwKKwkJICAgdW5zaWduZWQgbG9uZyBpbnQgIGFscywKKwkJICAgdW5zaWduZWQgbG9uZyBpbnQgIHNmaSwKKwkJICAgc2lnbmVkMzIgLypzaWduZWQgbG9uZyBpbnQqLyAqICBxdW90aWVudF9wdHIsCisJCSAgIHNpZ25lZDMyIC8qc2lnbmVkIGxvbmcgaW50Ki8gKiAgcmVtYWluZGVyX3B0ciwKKwkJICAgYm9vbGVhbiAqICAgICAgICAgIG92ZXJmbG93X3B0cgorCQkgICApOworZXh0ZXJuIGludCB0eXBlMV9yZWdzW107CitleHRlcm4gaW50IHR5cGUyX3JlZ3NbXTsKK2V4dGVybiBpbnQgdHlwZTNfcmVnc1tdOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbS92ODUwL3NpbW9wcy5jIGIvc2ltL3Y4NTAvc2ltb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmNDNlZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS92ODUwL3NpbW9wcy5jCkBAIC0wLDAgKzEsMjczMyBAQAorI2luY2x1ZGUgInNpbS1tYWluLmgiCisjaW5jbHVkZSAidjg1MF9zaW0uaCIKKyNpbmNsdWRlICJzaW1vcHMuaCIKKworI2lmZGVmIEhBVkVfVVRJTUVfSAorI2luY2x1ZGUgPHV0aW1lLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVElNRV9ICisjaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAidGFyZy12YWxzLmgiCisKKyNpbmNsdWRlICJsaWJpYmVydHkuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaWYgIWRlZmluZWQoX19HTzMyX18pICYmICFkZWZpbmVkKF9XSU4zMikKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworLyogVGhpcyBpcyBhbiBhcnJheSBvZiB0aGUgYml0IHBvc2l0aW9ucyBvZiByZWdpc3RlcnMgcjIwIC4uIHIzMSBpbgorICAgdGhhdCBvcmRlciBpbiBhIHByZXBhcmUvZGlzcG9zZSBpbnN0cnVjdGlvbi4gICovCitpbnQgdHlwZTFfcmVnc1sxMl0gPSB7IDI3LCAyNiwgMjUsIDI0LCAzMSwgMzAsIDI5LCAyOCwgMjMsIDIyLCAwLCAyMSB9OworLyogVGhpcyBpcyBhbiBhcnJheSBvZiB0aGUgYml0IHBvc2l0aW9ucyBvZiByZWdpc3RlcnMgcjE2IC4uIHIzMSBpbgorICAgdGhhdCBvcmRlciBpbiBhIHB1c2gvcG9wIGluc3RydWN0aW9uLiAgKi8KK2ludCB0eXBlMl9yZWdzWzE2XSA9IHsgMywgMiwgMSwgMCwgMjcsIDI2LCAyNSwgMjQsIDMxLCAzMCwgMjksIDI4LCAyMywgMjIsIDIwLCAyMX07CisvKiBUaGlzIGlzIGFuIGFycmF5IG9mIHRoZSBiaXQgcG9zaXRpb25zIG9mIHJlZ2lzdGVycyByMSAuLiByMTUgaW4KKyAgIHRoYXQgb3JkZXIgaW4gYSBwdXNoL3BvcCBpbnN0cnVjdGlvbi4gICovCitpbnQgdHlwZTNfcmVnc1sxNV0gPSB7IDIsIDEsIDAsIDI3LCAyNiwgMjUsIDI0LCAzMSwgMzAsIDI5LCAyOCwgMjMsIDIyLCAyMCwgMjF9OworCisjaWZkZWYgREVCVUcKKyNpZm5kZWYgU0laRV9JTlNUUlVDVElPTgorI2RlZmluZSBTSVpFX0lOU1RSVUNUSU9OIDE4CisjZW5kaWYKKworI2lmbmRlZiBTSVpFX1ZBTFVFUworI2RlZmluZSBTSVpFX1ZBTFVFUyAxMQorI2VuZGlmCisKKwordW5zaWduZWQzMiB0cmFjZV92YWx1ZXNbM107CitpbnQgdHJhY2VfbnVtX3ZhbHVlczsKK3Vuc2lnbmVkMzIgdHJhY2VfcGM7Citjb25zdCBjaGFyICp0cmFjZV9uYW1lOworaW50IHRyYWNlX21vZHVsZTsKKworCit2b2lkCit0cmFjZV9pbnB1dCAobmFtZSwgdHlwZSwgc2l6ZSkKKyAgICAgY2hhciAqbmFtZTsKKyAgICAgZW51bSBvcF90eXBlcyB0eXBlOworICAgICBpbnQgc2l6ZTsKK3sKKworICBpZiAoIVRSQUNFX0FMVV9QIChTVEFURV9DUFUgKHNpbXVsYXRvciwgMCkpKQorICAgIHJldHVybjsKKworICB0cmFjZV9wYyA9IFBDOworICB0cmFjZV9uYW1lID0gbmFtZTsKKyAgdHJhY2VfbW9kdWxlID0gVFJBQ0VfQUxVX0lEWDsKKworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBPUF9VTktOT1dOOgorICAgIGNhc2UgT1BfTk9ORToKKyAgICBjYXNlIE9QX1RSQVA6CisgICAgICB0cmFjZV9udW1fdmFsdWVzID0gMDsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBPUF9SRUc6CisgICAgY2FzZSBPUF9SRUdfUkVHX01PVkU6CisgICAgICB0cmFjZV92YWx1ZXNbMF0gPSBTdGF0ZS5yZWdzW09QWzBdXTsKKyAgICAgIHRyYWNlX251bV92YWx1ZXMgPSAxOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE9QX0JJVF9DSEFOR0U6CisgICAgY2FzZSBPUF9SRUdfUkVHOgorICAgIGNhc2UgT1BfUkVHX1JFR19DTVA6CisgICAgICB0cmFjZV92YWx1ZXNbMF0gPSBTdGF0ZS5yZWdzW09QWzFdXTsKKyAgICAgIHRyYWNlX3ZhbHVlc1sxXSA9IFN0YXRlLnJlZ3NbT1BbMF1dOworICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgT1BfSU1NX1JFRzoKKyAgICBjYXNlIE9QX0lNTV9SRUdfQ01QOgorICAgICAgdHJhY2VfdmFsdWVzWzBdID0gU0VYVDUgKE9QWzBdKTsKKyAgICAgIHRyYWNlX3ZhbHVlc1sxXSA9IE9QWzFdOworICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgT1BfSU1NX1JFR19NT1ZFOgorICAgICAgdHJhY2VfdmFsdWVzWzBdID0gU0VYVDUgKE9QWzBdKTsKKyAgICAgIHRyYWNlX251bV92YWx1ZXMgPSAxOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE9QX0NPTkRfQlI6CisgICAgICB0cmFjZV92YWx1ZXNbMF0gPSBTdGF0ZS5wYzsKKyAgICAgIHRyYWNlX3ZhbHVlc1sxXSA9IFNFWFQ5IChPUFswXSk7CisgICAgICB0cmFjZV92YWx1ZXNbMl0gPSBQU1c7CisgICAgICB0cmFjZV9udW1fdmFsdWVzID0gMzsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBPUF9MT0FEMTY6CisgICAgICB0cmFjZV92YWx1ZXNbMF0gPSBPUFsxXSAqIHNpemU7CisgICAgICB0cmFjZV92YWx1ZXNbMV0gPSBTdGF0ZS5yZWdzWzMwXTsKKyAgICAgIHRyYWNlX251bV92YWx1ZXMgPSAyOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE9QX1NUT1JFMTY6CisgICAgICB0cmFjZV92YWx1ZXNbMF0gPSBTdGF0ZS5yZWdzW09QWzBdXTsKKyAgICAgIHRyYWNlX3ZhbHVlc1sxXSA9IE9QWzFdICogc2l6ZTsKKyAgICAgIHRyYWNlX3ZhbHVlc1syXSA9IFN0YXRlLnJlZ3NbMzBdOworICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDM7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgT1BfTE9BRDMyOgorICAgICAgdHJhY2VfdmFsdWVzWzBdID0gRVhURU5EMTYgKE9QWzJdKTsKKyAgICAgIHRyYWNlX3ZhbHVlc1sxXSA9IFN0YXRlLnJlZ3NbT1BbMF1dOworICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgT1BfU1RPUkUzMjoKKyAgICAgIHRyYWNlX3ZhbHVlc1swXSA9IFN0YXRlLnJlZ3NbT1BbMV1dOworICAgICAgdHJhY2VfdmFsdWVzWzFdID0gRVhURU5EMTYgKE9QWzJdKTsKKyAgICAgIHRyYWNlX3ZhbHVlc1syXSA9IFN0YXRlLnJlZ3NbT1BbMF1dOworICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDM7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgT1BfSlVNUDoKKyAgICAgIHRyYWNlX3ZhbHVlc1swXSA9IFNFWFQyMiAoT1BbMF0pOworICAgICAgdHJhY2VfdmFsdWVzWzFdID0gU3RhdGUucGM7CisgICAgICB0cmFjZV9udW1fdmFsdWVzID0gMjsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBPUF9JTU1fUkVHX1JFRzoKKyAgICAgIHRyYWNlX3ZhbHVlc1swXSA9IEVYVEVORDE2IChPUFswXSkgPDwgc2l6ZTsKKyAgICAgIHRyYWNlX3ZhbHVlc1sxXSA9IFN0YXRlLnJlZ3NbT1BbMV1dOworICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgT1BfSU1NMTZfUkVHX1JFRzoKKyAgICAgIHRyYWNlX3ZhbHVlc1swXSA9IEVYVEVORDE2IChPUFsyXSkgPDwgc2l6ZTsKKyAgICAgIHRyYWNlX3ZhbHVlc1sxXSA9IFN0YXRlLnJlZ3NbT1BbMV1dOworICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgT1BfVUlNTV9SRUdfUkVHOgorICAgICAgdHJhY2VfdmFsdWVzWzBdID0gKE9QWzBdICYgMHhmZmZmKSA8PCBzaXplOworICAgICAgdHJhY2VfdmFsdWVzWzFdID0gU3RhdGUucmVnc1tPUFsxXV07CisgICAgICB0cmFjZV9udW1fdmFsdWVzID0gMjsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBPUF9VSU1NMTZfUkVHX1JFRzoKKyAgICAgIHRyYWNlX3ZhbHVlc1swXSA9IChPUFsyXSkgPDwgc2l6ZTsKKyAgICAgIHRyYWNlX3ZhbHVlc1sxXSA9IFN0YXRlLnJlZ3NbT1BbMV1dOworICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgT1BfQklUOgorICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDA7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgT1BfRVgxOgorICAgICAgdHJhY2VfdmFsdWVzWzBdID0gUFNXOworICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgT1BfRVgyOgorICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDA7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgT1BfTERTUjoKKyAgICAgIHRyYWNlX3ZhbHVlc1swXSA9IFN0YXRlLnJlZ3NbT1BbMF1dOworICAgICAgdHJhY2VfbnVtX3ZhbHVlcyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgT1BfU1RTUjoKKyAgICAgIHRyYWNlX3ZhbHVlc1swXSA9IFN0YXRlLnNyZWdzW09QWzFdXTsKKyAgICAgIHRyYWNlX251bV92YWx1ZXMgPSAxOworICAgIH0KKyAgCit9CisKK3ZvaWQKK3RyYWNlX3Jlc3VsdCAoaW50IGhhc19yZXN1bHQsIHVuc2lnbmVkMzIgcmVzdWx0KQoreworICBjaGFyIGJ1ZlsxMDAwXTsKKyAgY2hhciAqY2hwOworCisgIGJ1ZlswXSA9ICdcMCc7CisgIGNocCA9IGJ1ZjsKKworICAvKiB3cml0ZSBvdXQgdGhlIHZhbHVlcyBzYXZlZCBkdXJpbmcgdGhlIHRyYWNlX2lucHV0IGNhbGwgKi8KKyAgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB0cmFjZV9udW1fdmFsdWVzOyBpKyspCisgICAgICB7CisJc3ByaW50ZiAoY2hwLCAiJSpzMHglLjhseCIsIFNJWkVfVkFMVUVTIC0gMTAsICIiLCB0cmFjZV92YWx1ZXNbaV0pOworCWNocCA9IHN0cmNociAoY2hwLCAnXDAnKTsKKyAgICAgIH0KKyAgICB3aGlsZSAoaSsrIDwgMykKKyAgICAgIHsKKwlzcHJpbnRmIChjaHAsICIlKnMiLCBTSVpFX1ZBTFVFUywgIiIpOworCWNocCA9IHN0cmNociAoY2hwLCAnXDAnKTsKKyAgICAgIH0KKyAgfQorCisgIC8qIGFwcGVuZCBhbnkgcmVzdWx0IHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLworICBpZiAoaGFzX3Jlc3VsdCkKKyAgICBzcHJpbnRmIChjaHAsICIgOjogMHglLjhseCIsICh1bnNpZ25lZCBsb25nKXJlc3VsdCk7CisgIAorICB0cmFjZV9nZW5lcmljIChzaW11bGF0b3IsIFNUQVRFX0NQVSAoc2ltdWxhdG9yLCAwKSwgdHJhY2VfbW9kdWxlLCBidWYpOworfQorCit2b2lkCit0cmFjZV9vdXRwdXQgKHJlc3VsdCkKKyAgICAgZW51bSBvcF90eXBlcyByZXN1bHQ7Cit7CisgIGlmICghVFJBQ0VfQUxVX1AgKFNUQVRFX0NQVSAoc2ltdWxhdG9yLCAwKSkpCisgICAgcmV0dXJuOworCisgIHN3aXRjaCAocmVzdWx0KQorICAgIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgT1BfVU5LTk9XTjoKKyAgICBjYXNlIE9QX05PTkU6CisgICAgY2FzZSBPUF9UUkFQOgorICAgIGNhc2UgT1BfUkVHOgorICAgIGNhc2UgT1BfUkVHX1JFR19DTVA6CisgICAgY2FzZSBPUF9JTU1fUkVHX0NNUDoKKyAgICBjYXNlIE9QX0NPTkRfQlI6CisgICAgY2FzZSBPUF9TVE9SRTE2OgorICAgIGNhc2UgT1BfU1RPUkUzMjoKKyAgICBjYXNlIE9QX0JJVDoKKyAgICBjYXNlIE9QX0VYMjoKKyAgICAgIHRyYWNlX3Jlc3VsdCAoMCwgMCk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgT1BfTE9BRDE2OgorICAgIGNhc2UgT1BfU1RTUjoKKyAgICAgIHRyYWNlX3Jlc3VsdCAoMSwgU3RhdGUucmVnc1tPUFswXV0pOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE9QX1JFR19SRUc6CisgICAgY2FzZSBPUF9SRUdfUkVHX01PVkU6CisgICAgY2FzZSBPUF9JTU1fUkVHOgorICAgIGNhc2UgT1BfSU1NX1JFR19NT1ZFOgorICAgIGNhc2UgT1BfTE9BRDMyOgorICAgIGNhc2UgT1BfRVgxOgorICAgICAgdHJhY2VfcmVzdWx0ICgxLCBTdGF0ZS5yZWdzW09QWzFdXSk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgIGNhc2UgT1BfSU1NX1JFR19SRUc6CisgICAgY2FzZSBPUF9VSU1NX1JFR19SRUc6CisgICAgY2FzZSBPUF9JTU0xNl9SRUdfUkVHOgorICAgIGNhc2UgT1BfVUlNTTE2X1JFR19SRUc6CisgICAgICB0cmFjZV9yZXN1bHQgKDEsIFN0YXRlLnJlZ3NbT1BbMV1dKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBPUF9KVU1QOgorICAgICAgaWYgKE9QWzFdICE9IDApCisJdHJhY2VfcmVzdWx0ICgxLCBTdGF0ZS5yZWdzW09QWzFdXSk7CisgICAgICBlbHNlCisJdHJhY2VfcmVzdWx0ICgwLCAwKTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBPUF9MRFNSOgorICAgICAgdHJhY2VfcmVzdWx0ICgxLCBTdGF0ZS5zcmVnc1tPUFsxXV0pOworICAgICAgYnJlYWs7CisgICAgfQorfQorI2VuZGlmCisKKwwKKy8qIFJldHVybnMgMSBpZiB0aGUgc3BlY2lmaWMgY29uZGl0aW9uIGlzIG1ldCwgcmV0dXJucyAwIG90aGVyd2lzZS4gICovCitpbnQKK2NvbmRpdGlvbl9tZXQgKHVuc2lnbmVkIGNvZGUpCit7CisgIHVuc2lnbmVkIGludCBwc3cgPSBQU1c7CisKKyAgc3dpdGNoIChjb2RlICYgMHhmKQorICAgIHsKKyAgICAgIGNhc2UgMHgwOiByZXR1cm4gKChwc3cgJiBQU1dfT1YpICE9IDApOyAKKyAgICAgIGNhc2UgMHgxOglyZXR1cm4gKChwc3cgJiBQU1dfQ1kpICE9IDApOworICAgICAgY2FzZSAweDI6CXJldHVybiAoKHBzdyAmIFBTV19aKSAhPSAwKTsKKyAgICAgIGNhc2UgMHgzOglyZXR1cm4gKCgoKHBzdyAmIFBTV19DWSkgIT0gMCkgfCAoKHBzdyAmIFBTV19aKSAhPSAwKSkgIT0gMCk7CisgICAgICBjYXNlIDB4NDoJcmV0dXJuICgocHN3ICYgUFNXX1MpICE9IDApOworICAgIC8qY2FzZSAweDU6CXJldHVybiAxOyovCisgICAgICBjYXNlIDB4NjogcmV0dXJuICgoKChwc3cgJiBQU1dfUykgIT0gMCkgXiAoKHBzdyAmIFBTV19PVikgIT0gMCkpICE9IDApOworICAgICAgY2FzZSAweDc6CXJldHVybiAoKCgoKHBzdyAmIFBTV19TKSAhPSAwKSBeICgocHN3ICYgUFNXX09WKSAhPSAwKSkgfHwgKChwc3cgJiBQU1dfWikgIT0gMCkpICE9IDApOworICAgICAgY2FzZSAweDg6CXJldHVybiAoKHBzdyAmIFBTV19PVikgPT0gMCk7CisgICAgICBjYXNlIDB4OToJcmV0dXJuICgocHN3ICYgUFNXX0NZKSA9PSAwKTsKKyAgICAgIGNhc2UgMHhhOglyZXR1cm4gKChwc3cgJiBQU1dfWikgPT0gMCk7CisgICAgICBjYXNlIDB4YjoJcmV0dXJuICgoKChwc3cgJiBQU1dfQ1kpICE9IDApIHwgKChwc3cgJiBQU1dfWikgIT0gMCkpID09IDApOworICAgICAgY2FzZSAweGM6CXJldHVybiAoKHBzdyAmIFBTV19TKSA9PSAwKTsKKyAgICAgIGNhc2UgMHhkOglyZXR1cm4gKChwc3cgJiBQU1dfU0FUKSAhPSAwKTsKKyAgICAgIGNhc2UgMHhlOglyZXR1cm4gKCgoKHBzdyAmIFBTV19TKSAhPSAwKSBeICgocHN3ICYgUFNXX09WKSAhPSAwKSkgPT0gMCk7CisgICAgICBjYXNlIDB4ZjoJcmV0dXJuICgoKCgocHN3ICYgUFNXX1MpICE9IDApIF4gKChwc3cgJiBQU1dfT1YpICE9IDApKSB8fCAoKHBzdyAmIFBTV19aKSAhPSAwKSkgPT0gMCk7CisgICAgfQorICAKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitBZGQzMiAodW5zaWduZWQgbG9uZyBhMSwgdW5zaWduZWQgbG9uZyBhMiwgaW50ICogY2FycnkpCit7CisgIHVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gKGExICsgYTIpOworCisgICogY2FycnkgPSAocmVzdWx0IDwgYTEpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitNdWx0aXBseTY0IChib29sZWFuIHNpZ24sIHVuc2lnbmVkIGxvbmcgb3AwKQoreworICB1bnNpZ25lZCBsb25nIG9wMTsKKyAgdW5zaWduZWQgbG9uZyBsbzsKKyAgdW5zaWduZWQgbG9uZyBtaWQxOworICB1bnNpZ25lZCBsb25nIG1pZDI7CisgIHVuc2lnbmVkIGxvbmcgaGk7CisgIHVuc2lnbmVkIGxvbmcgUmRMbzsKKyAgdW5zaWduZWQgbG9uZyBSZEhpOworICBpbnQgICAgICAgICAgIGNhcnJ5OworICAKKyAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKKworICBpZiAoc2lnbikKKyAgICB7CisgICAgICAvKiBDb21wdXRlIHNpZ24gb2YgcmVzdWx0IGFuZCBhZGp1c3Qgb3BlcmFuZHMgaWYgbmVjZXNzYXJ5LiAgKi8KKwkgIAorICAgICAgc2lnbiA9IChvcDAgXiBvcDEpICYgMHg4MDAwMDAwMDsKKwkgIAorICAgICAgaWYgKCgoc2lnbmVkIGxvbmcpIG9wMCkgPCAwKQorCW9wMCA9IC0gb3AwOworCSAgCisgICAgICBpZiAoKChzaWduZWQgbG9uZykgb3AxKSA8IDApCisJb3AxID0gLSBvcDE7CisgICAgfQorICAgICAgCisgIC8qIFdlIGNhbiBzcGxpdCB0aGUgMzJ4MzIgaW50byBmb3VyIDE2eDE2IG9wZXJhdGlvbnMuIFRoaXMgZW5zdXJlcworICAgICB0aGF0IHdlIGRvIG5vdCBsb3NlIHByZWNpc2lvbiBvbiAzMmJpdCBvbmx5IGhvc3RzOiAqLworICBsbyAgID0gKCAob3AwICAgICAgICAmIDB4RkZGRikgKiAgKG9wMSAgICAgICAgJiAweEZGRkYpKTsKKyAgbWlkMSA9ICggKG9wMCAgICAgICAgJiAweEZGRkYpICogKChvcDEgPj4gMTYpICYgMHhGRkZGKSk7CisgIG1pZDIgPSAoKChvcDAgPj4gMTYpICYgMHhGRkZGKSAqICAob3AxICAgICAgICAmIDB4RkZGRikpOworICBoaSAgID0gKCgob3AwID4+IDE2KSAmIDB4RkZGRikgKiAoKG9wMSA+PiAxNikgJiAweEZGRkYpKTsKKyAgCisgIC8qIFdlIG5vdyBuZWVkIHRvIGFkZCBhbGwgb2YgdGhlc2UgcmVzdWx0cyB0b2dldGhlciwgdGFraW5nIGNhcmUKKyAgICAgdG8gcHJvcG9nYXRlIHRoZSBjYXJyaWVzIGZyb20gdGhlIGFkZGl0aW9uczogKi8KKyAgUmRMbyA9IEFkZDMyIChsbywgKG1pZDEgPDwgMTYpLCAmIGNhcnJ5KTsKKyAgUmRIaSA9IGNhcnJ5OworICBSZExvID0gQWRkMzIgKFJkTG8sIChtaWQyIDw8IDE2KSwgJiBjYXJyeSk7CisgIFJkSGkgKz0gKGNhcnJ5ICsgKChtaWQxID4+IDE2KSAmIDB4RkZGRikgKyAoKG1pZDIgPj4gMTYpICYgMHhGRkZGKSArIGhpKTsKKworICBpZiAoc2lnbikKKyAgICB7CisgICAgICAvKiBOZWdhdGUgcmVzdWx0IGlmIG5lY2Vzc2FyeS4gICovCisgICAgICAKKyAgICAgIFJkTG8gPSB+IFJkTG87CisgICAgICBSZEhpID0gfiBSZEhpOworICAgICAgaWYgKFJkTG8gPT0gMHhGRkZGRkZGRikKKwl7CisJICBSZExvID0gMDsKKwkgIFJkSGkgKz0gMTsKKwl9CisgICAgICBlbHNlCisJUmRMbyArPSAxOworICAgIH0KKyAgCisgIC8qIERvbid0IHN0b3JlIGludG8gcmVnaXN0ZXIgMC4gICovCisgIGlmIChPUFsxXSkKKyAgICBTdGF0ZS5yZWdzWyBPUFsxXSAgICAgICBdID0gUmRMbzsKKyAgaWYgKE9QWzJdID4+IDExKQorICAgIFN0YXRlLnJlZ3NbIE9QWzJdID4+IDExIF0gPSBSZEhpOworCisgIHJldHVybjsKK30KKworDAorLyogUmVhZCBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgZnJvbSBtZW1vcnksIHJldHVybiBpbiBhIGJ1ZmZlciAqLworc3RhdGljIGNoYXIgKgorZmV0Y2hfc3RyIChzZCwgYWRkcikKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGFkZHJlc3Nfd29yZCBhZGRyOworeworICBjaGFyICpidWY7CisgIGludCBuciA9IDA7CisgIHdoaWxlIChzaW1fY29yZV9yZWFkXzEgKFNUQVRFX0NQVSAoc2QsIDApLAorCQkJICBQQywgcmVhZF9tYXAsIGFkZHIgKyBucikgIT0gMCkKKyAgICBucisrOworICBidWYgPSBOWkFMTE9DIChjaGFyLCBuciArIDEpOworICBzaW1fcmVhZCAoc2ltdWxhdG9yLCBhZGRyLCBidWYsIG5yKTsKKyAgcmV0dXJuIGJ1ZjsKK30KKworLyogUmVhZCBhIG51bGwgdGVybWluYXRlZCBhcmd1bWVudCB2ZWN0b3IgZnJvbSBtZW1vcnksIHJldHVybiBpbiBhCisgICBidWZmZXIgKi8KK3N0YXRpYyBjaGFyICoqCitmZXRjaF9hcmd2IChzZCwgYWRkcikKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGFkZHJlc3Nfd29yZCBhZGRyOworeworICBpbnQgbWF4X25yID0gNjQ7CisgIGludCBuciA9IDA7CisgIGNoYXIgKipidWYgPSB4bWFsbG9jIChtYXhfbnIgKiBzaXplb2YgKGNoYXIqKSk7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIHVuc2lnbmVkMzIgYSA9IHNpbV9jb3JlX3JlYWRfNCAoU1RBVEVfQ1BVIChzZCwgMCksCisJCQkJICAgICAgUEMsIHJlYWRfbWFwLCBhZGRyICsgbnIgKiA0KTsKKyAgICAgIGlmIChhID09IDApIGJyZWFrOworICAgICAgYnVmW25yXSA9IGZldGNoX3N0ciAoc2QsIGEpOworICAgICAgbnIgKys7CisgICAgICBpZiAobnIgPT0gbWF4X25yIC0gMSkKKwl7CisJICBtYXhfbnIgKz0gNTA7CisJICBidWYgPSB4cmVhbGxvYyAoYnVmLCBtYXhfbnIgKiBzaXplb2YgKGNoYXIqKSk7CisJfQorICAgIH0KKyAgYnVmW25yXSA9IDA7CisgIHJldHVybiBidWY7Cit9CisKKwwKKy8qIHNzdC5iICovCitpbnQKK09QXzM4MCAoKQoreworICB0cmFjZV9pbnB1dCAoInNzdC5iIiwgT1BfU1RPUkUxNiwgMSk7CisKKyAgc3RvcmVfbWVtIChTdGF0ZS5yZWdzWzMwXSArIChPUFszXSAmIDB4N2YpLCAxLCBTdGF0ZS5yZWdzWyBPUFsxXSBdKTsKKyAgCisgIHRyYWNlX291dHB1dCAoT1BfU1RPUkUxNik7CisKKyAgcmV0dXJuIDI7Cit9CisKKy8qIHNzdC5oICovCitpbnQKK09QXzQ4MCAoKQoreworICB0cmFjZV9pbnB1dCAoInNzdC5oIiwgT1BfU1RPUkUxNiwgMik7CisKKyAgc3RvcmVfbWVtIChTdGF0ZS5yZWdzWzMwXSArICgoT1BbM10gJiAweDdmKSA8PCAxKSwgMiwgU3RhdGUucmVnc1sgT1BbMV0gXSk7CisgIAorICB0cmFjZV9vdXRwdXQgKE9QX1NUT1JFMTYpOworCisgIHJldHVybiAyOworfQorCisvKiBzc3QudyAqLworaW50CitPUF81MDEgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJzc3QudyIsIE9QX1NUT1JFMTYsIDQpOworCisgIHN0b3JlX21lbSAoU3RhdGUucmVnc1szMF0gKyAoKE9QWzNdICYgMHg3ZSkgPDwgMSksIDQsIFN0YXRlLnJlZ3NbIE9QWzFdIF0pOworICAKKyAgdHJhY2Vfb3V0cHV0IChPUF9TVE9SRTE2KTsKKworICByZXR1cm4gMjsKK30KKworLyogbGQuYiAqLworaW50CitPUF83MDAgKCkKK3sKKyAgaW50IGFkcjsKKworICB0cmFjZV9pbnB1dCAoImxkLmIiLCBPUF9MT0FEMzIsIDEpOworCisgIGFkciA9IFN0YXRlLnJlZ3NbIE9QWzBdIF0gKyBFWFRFTkQxNiAoT1BbMl0pOworCisgIFN0YXRlLnJlZ3NbIE9QWzFdIF0gPSBFWFRFTkQ4IChsb2FkX21lbSAoYWRyLCAxKSk7CisgIAorICB0cmFjZV9vdXRwdXQgKE9QX0xPQUQzMik7CisKKyAgcmV0dXJuIDQ7Cit9CisKKy8qIGxkLmggKi8KK2ludAorT1BfNzIwICgpCit7CisgIGludCBhZHI7CisKKyAgdHJhY2VfaW5wdXQgKCJsZC5oIiwgT1BfTE9BRDMyLCAyKTsKKworICBhZHIgPSBTdGF0ZS5yZWdzWyBPUFswXSBdICsgRVhURU5EMTYgKE9QWzJdKTsKKyAgYWRyICY9IH4weDE7CisgIAorICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gRVhURU5EMTYgKGxvYWRfbWVtIChhZHIsIDIpKTsKKyAgCisgIHRyYWNlX291dHB1dCAoT1BfTE9BRDMyKTsKKworICByZXR1cm4gNDsKK30KKworLyogbGQudyAqLworaW50CitPUF8xMDcyMCAoKQoreworICBpbnQgYWRyOworCisgIHRyYWNlX2lucHV0ICgibGQudyIsIE9QX0xPQUQzMiwgNCk7CisKKyAgYWRyID0gU3RhdGUucmVnc1sgT1BbMF0gXSArIEVYVEVORDE2IChPUFsyXSAmIH4xKTsKKyAgYWRyICY9IH4weDM7CisgIAorICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gbG9hZF9tZW0gKGFkciwgNCk7CisgIAorICB0cmFjZV9vdXRwdXQgKE9QX0xPQUQzMik7CisKKyAgcmV0dXJuIDQ7Cit9CisKKy8qIHN0LmIgKi8KK2ludAorT1BfNzQwICgpCit7CisgIHRyYWNlX2lucHV0ICgic3QuYiIsIE9QX1NUT1JFMzIsIDEpOworCisgIHN0b3JlX21lbSAoU3RhdGUucmVnc1sgT1BbMF0gXSArIEVYVEVORDE2IChPUFsyXSksIDEsIFN0YXRlLnJlZ3NbIE9QWzFdIF0pOworICAKKyAgdHJhY2Vfb3V0cHV0IChPUF9TVE9SRTMyKTsKKworICByZXR1cm4gNDsKK30KKworLyogc3QuaCAqLworaW50CitPUF83NjAgKCkKK3sKKyAgaW50IGFkcjsKKyAgCisgIHRyYWNlX2lucHV0ICgic3QuaCIsIE9QX1NUT1JFMzIsIDIpOworCisgIGFkciA9IFN0YXRlLnJlZ3NbIE9QWzBdIF0gKyBFWFRFTkQxNiAoT1BbMl0pOworICBhZHIgJj0gfjE7CisgIAorICBzdG9yZV9tZW0gKGFkciwgMiwgU3RhdGUucmVnc1sgT1BbMV0gXSk7CisgIAorICB0cmFjZV9vdXRwdXQgKE9QX1NUT1JFMzIpOworCisgIHJldHVybiA0OworfQorCisvKiBzdC53ICovCitpbnQKK09QXzEwNzYwICgpCit7CisgIGludCBhZHI7CisgIAorICB0cmFjZV9pbnB1dCAoInN0LnciLCBPUF9TVE9SRTMyLCA0KTsKKworICBhZHIgPSBTdGF0ZS5yZWdzWyBPUFswXSBdICsgRVhURU5EMTYgKE9QWzJdICYgfjEpOworICBhZHIgJj0gfjM7CisgIAorICBzdG9yZV9tZW0gKGFkciwgNCwgU3RhdGUucmVnc1sgT1BbMV0gXSk7CisgIAorICB0cmFjZV9vdXRwdXQgKE9QX1NUT1JFMzIpOworCisgIHJldHVybiA0OworfQorCisvKiBhZGQgcmVnLCByZWcgKi8KK2ludAorT1BfMUMwICgpCit7CisgIHVuc2lnbmVkIGludCBvcDAsIG9wMSwgcmVzdWx0LCB6LCBzLCBjeSwgb3Y7CisKKyAgdHJhY2VfaW5wdXQgKCJhZGQiLCBPUF9SRUdfUkVHLCAwKTsKKyAgCisgIC8qIENvbXB1dGUgdGhlIHJlc3VsdC4gICovCisgIAorICBvcDAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOworICBvcDEgPSBTdGF0ZS5yZWdzWyBPUFsxXSBdOworICAKKyAgcmVzdWx0ID0gb3AwICsgb3AxOworCisgIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIHogPSAocmVzdWx0ID09IDApOworICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOworICBjeSA9IChyZXN1bHQgPCBvcDAgfHwgcmVzdWx0IDwgb3AxKTsKKyAgb3YgPSAoKG9wMCAmIDB4ODAwMDAwMDApID09IChvcDEgJiAweDgwMDAwMDAwKQorCSYmIChvcDAgJiAweDgwMDAwMDAwKSAhPSAocmVzdWx0ICYgMHg4MDAwMDAwMCkpOworCisgIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OworICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX0NZIHwgUFNXX09WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkKKwkJICAgICB8IChjeSA/IFBTV19DWSA6IDApIHwgKG92ID8gUFNXX09WIDogMCkpOworICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUcpOworCisgIHJldHVybiAyOworfQorCisvKiBhZGQgc2lnbl9leHRlbmQoaW1tNSksIHJlZyAqLworaW50CitPUF8yNDAgKCkKK3sKKyAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHMsIGN5LCBvdjsKKyAgaW50IHRlbXA7CisKKyAgdHJhY2VfaW5wdXQgKCJhZGQiLCBPUF9JTU1fUkVHLCAwKTsKKworICAvKiBDb21wdXRlIHRoZSByZXN1bHQuICAqLworICB0ZW1wID0gU0VYVDUgKE9QWzBdKTsKKyAgb3AwID0gdGVtcDsKKyAgb3AxID0gU3RhdGUucmVnc1tPUFsxXV07CisgIHJlc3VsdCA9IG9wMCArIG9wMTsKKyAgCisgIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIHogPSAocmVzdWx0ID09IDApOworICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOworICBjeSA9IChyZXN1bHQgPCBvcDAgfHwgcmVzdWx0IDwgb3AxKTsKKyAgb3YgPSAoKG9wMCAmIDB4ODAwMDAwMDApID09IChvcDEgJiAweDgwMDAwMDAwKQorCSYmIChvcDAgJiAweDgwMDAwMDAwKSAhPSAocmVzdWx0ICYgMHg4MDAwMDAwMCkpOworCisgIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OworICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX0NZIHwgUFNXX09WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkKKwkJfCAoY3kgPyBQU1dfQ1kgOiAwKSB8IChvdiA/IFBTV19PViA6IDApKTsKKyAgdHJhY2Vfb3V0cHV0IChPUF9JTU1fUkVHKTsKKworICByZXR1cm4gMjsKK30KKworLyogYWRkaSBzaWduX2V4dGVuZChpbW0xNiksIHJlZywgcmVnICovCitpbnQKK09QXzYwMCAoKQoreworICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgcywgY3ksIG92OworCisgIHRyYWNlX2lucHV0ICgiYWRkaSIsIE9QX0lNTTE2X1JFR19SRUcsIDApOworCisgIC8qIENvbXB1dGUgdGhlIHJlc3VsdC4gICovCisKKyAgb3AwID0gRVhURU5EMTYgKE9QWzJdKTsKKyAgb3AxID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKKyAgcmVzdWx0ID0gb3AwICsgb3AxOworICAKKyAgLyogQ29tcHV0ZSB0aGUgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgeiA9IChyZXN1bHQgPT0gMCk7CisgIHMgPSAocmVzdWx0ICYgMHg4MDAwMDAwMCk7CisgIGN5ID0gKHJlc3VsdCA8IG9wMCB8fCByZXN1bHQgPCBvcDEpOworICBvdiA9ICgob3AwICYgMHg4MDAwMDAwMCkgPT0gKG9wMSAmIDB4ODAwMDAwMDApCisJJiYgKG9wMCAmIDB4ODAwMDAwMDApICE9IChyZXN1bHQgJiAweDgwMDAwMDAwKSk7CisKKyAgLyogU3RvcmUgdGhlIHJlc3VsdCBhbmQgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgU3RhdGUucmVnc1tPUFsxXV0gPSByZXN1bHQ7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfQ1kgfCBQU1dfT1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChzID8gUFNXX1MgOiAwKQorCQl8IChjeSA/IFBTV19DWSA6IDApIHwgKG92ID8gUFNXX09WIDogMCkpOworICB0cmFjZV9vdXRwdXQgKE9QX0lNTTE2X1JFR19SRUcpOworCisgIHJldHVybiA0OworfQorCisvKiBzdWIgcmVnMSwgcmVnMiAqLworaW50CitPUF8xQTAgKCkKK3sKKyAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHMsIGN5LCBvdjsKKworICB0cmFjZV9pbnB1dCAoInN1YiIsIE9QX1JFR19SRUcsIDApOworICAvKiBDb21wdXRlIHRoZSByZXN1bHQuICAqLworICBvcDAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOworICBvcDEgPSBTdGF0ZS5yZWdzWyBPUFsxXSBdOworICByZXN1bHQgPSBvcDEgLSBvcDA7CisKKyAgLyogQ29tcHV0ZSB0aGUgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgeiA9IChyZXN1bHQgPT0gMCk7CisgIHMgPSAocmVzdWx0ICYgMHg4MDAwMDAwMCk7CisgIGN5ID0gKG9wMSA8IG9wMCk7CisgIG92ID0gKChvcDEgJiAweDgwMDAwMDAwKSAhPSAob3AwICYgMHg4MDAwMDAwMCkKKwkmJiAob3AxICYgMHg4MDAwMDAwMCkgIT0gKHJlc3VsdCAmIDB4ODAwMDAwMDApKTsKKworICAvKiBTdG9yZSB0aGUgcmVzdWx0IGFuZCBjb25kaXRpb24gY29kZXMuICAqLworICBTdGF0ZS5yZWdzW09QWzFdXSA9IHJlc3VsdDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19DWSB8IFBTV19PVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKHMgPyBQU1dfUyA6IDApCisJCXwgKGN5ID8gUFNXX0NZIDogMCkgfCAob3YgPyBQU1dfT1YgOiAwKSk7CisgIHRyYWNlX291dHB1dCAoT1BfUkVHX1JFRyk7CisKKyAgcmV0dXJuIDI7Cit9CisKKy8qIHN1YnIgcmVnMSwgcmVnMiAqLworaW50CitPUF8xODAgKCkKK3sKKyAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHMsIGN5LCBvdjsKKworICB0cmFjZV9pbnB1dCAoInN1YnIiLCBPUF9SRUdfUkVHLCAwKTsKKyAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KKyAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKKyAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKKyAgcmVzdWx0ID0gb3AwIC0gb3AxOworCisgIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIHogPSAocmVzdWx0ID09IDApOworICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOworICBjeSA9IChvcDAgPCBvcDEpOworICBvdiA9ICgob3AwICYgMHg4MDAwMDAwMCkgIT0gKG9wMSAmIDB4ODAwMDAwMDApCisJJiYgKG9wMCAmIDB4ODAwMDAwMDApICE9IChyZXN1bHQgJiAweDgwMDAwMDAwKSk7CisKKyAgLyogU3RvcmUgdGhlIHJlc3VsdCBhbmQgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgU3RhdGUucmVnc1tPUFsxXV0gPSByZXN1bHQ7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfQ1kgfCBQU1dfT1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChzID8gUFNXX1MgOiAwKQorCQl8IChjeSA/IFBTV19DWSA6IDApIHwgKG92ID8gUFNXX09WIDogMCkpOworICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUcpOworCisgIHJldHVybiAyOworfQorCisvKiBzeGggcmVnMSAqLworaW50CitPUF9FMCAoKQoreworICB0cmFjZV9pbnB1dCAoIm11bGgiLCBPUF9SRUdfUkVHLCAwKTsKKyAgICAgIAorICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gKEVYVEVORDE2IChTdGF0ZS5yZWdzWyBPUFsxXSBdKSAqIEVYVEVORDE2IChTdGF0ZS5yZWdzWyBPUFswXSBdKSk7CisgICAgICAKKyAgdHJhY2Vfb3V0cHV0IChPUF9SRUdfUkVHKTsKKworICByZXR1cm4gMjsKK30KKworLyogbXVsaCBzaWduX2V4dGVuZChpbW01KSwgcmVnMiAqLworaW50CitPUF8yRTAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJtdWxoIiwgT1BfSU1NX1JFRywgMCk7CisgIAorICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gRVhURU5EMTYgKFN0YXRlLnJlZ3NbIE9QWzFdIF0pICogU0VYVDUgKE9QWzBdKTsKKyAgCisgIHRyYWNlX291dHB1dCAoT1BfSU1NX1JFRyk7CisKKyAgcmV0dXJuIDI7Cit9CisKKy8qIG11bGhpIGltbTE2LCByZWcxLCByZWcyICovCitpbnQKK09QXzZFMCAoKQoreworICB0cmFjZV9pbnB1dCAoIm11bGhpIiwgT1BfSU1NMTZfUkVHX1JFRywgMCk7CisgIAorICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gRVhURU5EMTYgKFN0YXRlLnJlZ3NbIE9QWzBdIF0pICogRVhURU5EMTYgKE9QWzJdKTsKKyAgICAgIAorICB0cmFjZV9vdXRwdXQgKE9QX0lNTTE2X1JFR19SRUcpOworICAKKyAgcmV0dXJuIDQ7Cit9CisKKy8qIGRpdmggcmVnMSwgcmVnMiAqLworaW50CitPUF80MCAoKQoreworICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgb3YsIHMsIHo7CisgIGludCB0ZW1wOworCisgIHRyYWNlX2lucHV0ICgiZGl2aCIsIE9QX1JFR19SRUcsIDApOworCisgIC8qIENvbXB1dGUgdGhlIHJlc3VsdC4gICovCisgIHRlbXAgPSBFWFRFTkQxNiAoU3RhdGUucmVnc1sgT1BbMF0gXSk7CisgIG9wMCA9IHRlbXA7CisgIG9wMSA9IFN0YXRlLnJlZ3NbT1BbMV1dOworICAKKyAgaWYgKG9wMCA9PSAweGZmZmZmZmZmICYmIG9wMSA9PSAweDgwMDAwMDAwKQorICAgIHsKKyAgICAgIHJlc3VsdCA9IDB4ODAwMDAwMDA7CisgICAgICBvdiA9IDE7CisgICAgfQorICBlbHNlIGlmIChvcDAgIT0gMCkKKyAgICB7CisgICAgICByZXN1bHQgPSBvcDEgLyBvcDA7CisgICAgICBvdiA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVzdWx0ID0gMHgwOworICAgICAgb3YgPSAxOworICAgIH0KKyAgCisgIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIHogPSAocmVzdWx0ID09IDApOworICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOworICAKKyAgLyogU3RvcmUgdGhlIHJlc3VsdCBhbmQgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgU3RhdGUucmVnc1tPUFsxXV0gPSByZXN1bHQ7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfT1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChzID8gUFNXX1MgOiAwKQorCSAgfCAob3YgPyBQU1dfT1YgOiAwKSk7CisgIHRyYWNlX291dHB1dCAoT1BfUkVHX1JFRyk7CisKKyAgcmV0dXJuIDI7Cit9CisKKy8qIGNtcCByZWcsIHJlZyAqLworaW50CitPUF8xRTAgKCkKK3sKKyAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHMsIGN5LCBvdjsKKworICB0cmFjZV9pbnB1dCAoImNtcCIsIE9QX1JFR19SRUdfQ01QLCAwKTsKKyAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KKyAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKKyAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKKyAgcmVzdWx0ID0gb3AxIC0gb3AwOworCisgIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIHogPSAocmVzdWx0ID09IDApOworICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOworICBjeSA9IChvcDEgPCBvcDApOworICBvdiA9ICgob3AxICYgMHg4MDAwMDAwMCkgIT0gKG9wMCAmIDB4ODAwMDAwMDApCisJJiYgKG9wMSAmIDB4ODAwMDAwMDApICE9IChyZXN1bHQgJiAweDgwMDAwMDAwKSk7CisKKyAgLyogU2V0IGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfQ1kgfCBQU1dfT1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChzID8gUFNXX1MgOiAwKQorCQl8IChjeSA/IFBTV19DWSA6IDApIHwgKG92ID8gUFNXX09WIDogMCkpOworICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUdfQ01QKTsKKworICByZXR1cm4gMjsKK30KKworLyogY21wIHNpZ25fZXh0ZW5kKGltbTUpLCByZWcgKi8KK2ludAorT1BfMjYwICgpCit7CisgIHVuc2lnbmVkIGludCBvcDAsIG9wMSwgcmVzdWx0LCB6LCBzLCBjeSwgb3Y7CisgIGludCB0ZW1wOworCisgIC8qIENvbXB1dGUgdGhlIHJlc3VsdC4gICovCisgIHRyYWNlX2lucHV0ICgiY21wIiwgT1BfSU1NX1JFR19DTVAsIDApOworICB0ZW1wID0gU0VYVDUgKE9QWzBdKTsKKyAgb3AwID0gdGVtcDsKKyAgb3AxID0gU3RhdGUucmVnc1tPUFsxXV07CisgIHJlc3VsdCA9IG9wMSAtIG9wMDsKKworICAvKiBDb21wdXRlIHRoZSBjb25kaXRpb24gY29kZXMuICAqLworICB6ID0gKHJlc3VsdCA9PSAwKTsKKyAgcyA9IChyZXN1bHQgJiAweDgwMDAwMDAwKTsKKyAgY3kgPSAob3AxIDwgb3AwKTsKKyAgb3YgPSAoKG9wMSAmIDB4ODAwMDAwMDApICE9IChvcDAgJiAweDgwMDAwMDAwKQorCSYmIChvcDEgJiAweDgwMDAwMDAwKSAhPSAocmVzdWx0ICYgMHg4MDAwMDAwMCkpOworCisgIC8qIFNldCBjb25kaXRpb24gY29kZXMuICAqLworICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX0NZIHwgUFNXX09WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkKKwkJfCAoY3kgPyBQU1dfQ1kgOiAwKSB8IChvdiA/IFBTV19PViA6IDApKTsKKyAgdHJhY2Vfb3V0cHV0IChPUF9JTU1fUkVHX0NNUCk7CisKKyAgcmV0dXJuIDI7Cit9CisKKy8qIHNldGYgY2NjYyxyZWcyICovCitpbnQKK09QXzdFMCAoKQoreworICB0cmFjZV9pbnB1dCAoInNldGYiLCBPUF9FWDEsIDApOworCisgIFN0YXRlLnJlZ3NbIE9QWzFdIF0gPSBjb25kaXRpb25fbWV0IChPUFswXSk7CisgIAorICB0cmFjZV9vdXRwdXQgKE9QX0VYMSk7CisKKyAgcmV0dXJuIDQ7Cit9CisKKy8qIHNhdGFkZCByZWcscmVnICovCitpbnQKK09QX0MwICgpCit7CisgIHVuc2lnbmVkIGludCBvcDAsIG9wMSwgcmVzdWx0LCB6LCBzLCBjeSwgb3YsIHNhdDsKKyAgCisgIHRyYWNlX2lucHV0ICgic2F0YWRkIiwgT1BfUkVHX1JFRywgMCk7CisgIC8qIENvbXB1dGUgdGhlIHJlc3VsdC4gICovCisgIG9wMCA9IFN0YXRlLnJlZ3NbIE9QWzBdIF07CisgIG9wMSA9IFN0YXRlLnJlZ3NbIE9QWzFdIF07CisgIHJlc3VsdCA9IG9wMCArIG9wMTsKKyAgCisgIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIHogPSAocmVzdWx0ID09IDApOworICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOworICBjeSA9IChyZXN1bHQgPCBvcDAgfHwgcmVzdWx0IDwgb3AxKTsKKyAgb3YgPSAoKG9wMCAmIDB4ODAwMDAwMDApID09IChvcDEgJiAweDgwMDAwMDAwKQorCSYmIChvcDAgJiAweDgwMDAwMDAwKSAhPSAocmVzdWx0ICYgMHg4MDAwMDAwMCkpOworICBzYXQgPSBvdjsKKyAgCisgIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OworICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX0NZIHwgUFNXX09WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkKKwkgIHwgKGN5ID8gUFNXX0NZIDogMCkgfCAob3YgPyBQU1dfT1YgOiAwKQorCSAgfCAoc2F0ID8gUFNXX1NBVCA6IDApKTsKKyAgCisgIC8qIEhhbmRsZSBzYXR1cmF0ZWQgcmVzdWx0cy4gICovCisgIGlmIChzYXQgJiYgcykKKyAgICBTdGF0ZS5yZWdzW09QWzFdXSA9IDB4ODAwMDAwMDA7CisgIGVsc2UgaWYgKHNhdCkKKyAgICBTdGF0ZS5yZWdzW09QWzFdXSA9IDB4N2ZmZmZmZmY7CisgIHRyYWNlX291dHB1dCAoT1BfUkVHX1JFRyk7CisKKyAgcmV0dXJuIDI7Cit9CisKKy8qIHNhdGFkZCBzaWduX2V4dGVuZChpbW01KSwgcmVnICovCitpbnQKK09QXzIyMCAoKQoreworICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgcywgY3ksIG92LCBzYXQ7CisKKyAgaW50IHRlbXA7CisKKyAgdHJhY2VfaW5wdXQgKCJzYXRhZGQiLCBPUF9JTU1fUkVHLCAwKTsKKworICAvKiBDb21wdXRlIHRoZSByZXN1bHQuICAqLworICB0ZW1wID0gU0VYVDUgKE9QWzBdKTsKKyAgb3AwID0gdGVtcDsKKyAgb3AxID0gU3RhdGUucmVnc1tPUFsxXV07CisgIHJlc3VsdCA9IG9wMCArIG9wMTsKKworICAvKiBDb21wdXRlIHRoZSBjb25kaXRpb24gY29kZXMuICAqLworICB6ID0gKHJlc3VsdCA9PSAwKTsKKyAgcyA9IChyZXN1bHQgJiAweDgwMDAwMDAwKTsKKyAgY3kgPSAocmVzdWx0IDwgb3AwIHx8IHJlc3VsdCA8IG9wMSk7CisgIG92ID0gKChvcDAgJiAweDgwMDAwMDAwKSA9PSAob3AxICYgMHg4MDAwMDAwMCkKKwkmJiAob3AwICYgMHg4MDAwMDAwMCkgIT0gKHJlc3VsdCAmIDB4ODAwMDAwMDApKTsKKyAgc2F0ID0gb3Y7CisKKyAgLyogU3RvcmUgdGhlIHJlc3VsdCBhbmQgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgU3RhdGUucmVnc1tPUFsxXV0gPSByZXN1bHQ7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfQ1kgfCBQU1dfT1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChzID8gUFNXX1MgOiAwKQorCQl8IChjeSA/IFBTV19DWSA6IDApIHwgKG92ID8gUFNXX09WIDogMCkKKwkJfCAoc2F0ID8gUFNXX1NBVCA6IDApKTsKKworICAvKiBIYW5kbGUgc2F0dXJhdGVkIHJlc3VsdHMuICAqLworICBpZiAoc2F0ICYmIHMpCisgICAgU3RhdGUucmVnc1tPUFsxXV0gPSAweDgwMDAwMDAwOworICBlbHNlIGlmIChzYXQpCisgICAgU3RhdGUucmVnc1tPUFsxXV0gPSAweDdmZmZmZmZmOworICB0cmFjZV9vdXRwdXQgKE9QX0lNTV9SRUcpOworCisgIHJldHVybiAyOworfQorCisvKiBzYXRzdWIgcmVnMSwgcmVnMiAqLworaW50CitPUF9BMCAoKQoreworICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgcywgY3ksIG92LCBzYXQ7CisgIAorICB0cmFjZV9pbnB1dCAoInNhdHN1YiIsIE9QX1JFR19SRUcsIDApOworICAKKyAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KKyAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKKyAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKKyAgcmVzdWx0ID0gb3AxIC0gb3AwOworICAKKyAgLyogQ29tcHV0ZSB0aGUgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgeiA9IChyZXN1bHQgPT0gMCk7CisgIHMgPSAocmVzdWx0ICYgMHg4MDAwMDAwMCk7CisgIGN5ID0gKG9wMSA8IG9wMCk7CisgIG92ID0gKChvcDEgJiAweDgwMDAwMDAwKSAhPSAob3AwICYgMHg4MDAwMDAwMCkKKwkmJiAob3AxICYgMHg4MDAwMDAwMCkgIT0gKHJlc3VsdCAmIDB4ODAwMDAwMDApKTsKKyAgc2F0ID0gb3Y7CisgIAorICAvKiBTdG9yZSB0aGUgcmVzdWx0IGFuZCBjb25kaXRpb24gY29kZXMuICAqLworICBTdGF0ZS5yZWdzW09QWzFdXSA9IHJlc3VsdDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19DWSB8IFBTV19PVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKHMgPyBQU1dfUyA6IDApCisJICB8IChjeSA/IFBTV19DWSA6IDApIHwgKG92ID8gUFNXX09WIDogMCkKKwkgIHwgKHNhdCA/IFBTV19TQVQgOiAwKSk7CisgIAorICAvKiBIYW5kbGUgc2F0dXJhdGVkIHJlc3VsdHMuICAqLworICBpZiAoc2F0ICYmIHMpCisgICAgU3RhdGUucmVnc1tPUFsxXV0gPSAweDgwMDAwMDAwOworICBlbHNlIGlmIChzYXQpCisgICAgU3RhdGUucmVnc1tPUFsxXV0gPSAweDdmZmZmZmZmOworICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUcpOworICByZXR1cm4gMjsKK30KKworLyogc2F0c3ViaSBzaWduX2V4dGVuZChpbW0xNiksIHJlZyAqLworaW50CitPUF82NjAgKCkKK3sKKyAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHMsIGN5LCBvdiwgc2F0OworICBpbnQgdGVtcDsKKworICB0cmFjZV9pbnB1dCAoInNhdHN1YmkiLCBPUF9JTU1fUkVHLCAwKTsKKworICAvKiBDb21wdXRlIHRoZSByZXN1bHQuICAqLworICB0ZW1wID0gRVhURU5EMTYgKE9QWzJdKTsKKyAgb3AwID0gdGVtcDsKKyAgb3AxID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKKyAgcmVzdWx0ID0gb3AxIC0gb3AwOworCisgIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIHogPSAocmVzdWx0ID09IDApOworICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOworICBjeSA9IChvcDEgPCBvcDApOworICBvdiA9ICgob3AxICYgMHg4MDAwMDAwMCkgIT0gKG9wMCAmIDB4ODAwMDAwMDApCisJJiYgKG9wMSAmIDB4ODAwMDAwMDApICE9IChyZXN1bHQgJiAweDgwMDAwMDAwKSk7CisgIHNhdCA9IG92OworCisgIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OworICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX0NZIHwgUFNXX09WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkKKwkJfCAoY3kgPyBQU1dfQ1kgOiAwKSB8IChvdiA/IFBTV19PViA6IDApCisJCXwgKHNhdCA/IFBTV19TQVQgOiAwKSk7CisKKyAgLyogSGFuZGxlIHNhdHVyYXRlZCByZXN1bHRzLiAgKi8KKyAgaWYgKHNhdCAmJiBzKQorICAgIFN0YXRlLnJlZ3NbT1BbMV1dID0gMHg4MDAwMDAwMDsKKyAgZWxzZSBpZiAoc2F0KQorICAgIFN0YXRlLnJlZ3NbT1BbMV1dID0gMHg3ZmZmZmZmZjsKKyAgdHJhY2Vfb3V0cHV0IChPUF9JTU1fUkVHKTsKKworICByZXR1cm4gNDsKK30KKworLyogc2F0c3ViciByZWcscmVnICovCitpbnQKK09QXzgwICgpCit7CisgIHVuc2lnbmVkIGludCBvcDAsIG9wMSwgcmVzdWx0LCB6LCBzLCBjeSwgb3YsIHNhdDsKKyAgCisgIHRyYWNlX2lucHV0ICgic2F0c3ViciIsIE9QX1JFR19SRUcsIDApOworICAKKyAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KKyAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKKyAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKKyAgcmVzdWx0ID0gb3AwIC0gb3AxOworICAKKyAgLyogQ29tcHV0ZSB0aGUgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgeiA9IChyZXN1bHQgPT0gMCk7CisgIHMgPSAocmVzdWx0ICYgMHg4MDAwMDAwMCk7CisgIGN5ID0gKHJlc3VsdCA8IG9wMCk7CisgIG92ID0gKChvcDEgJiAweDgwMDAwMDAwKSAhPSAob3AwICYgMHg4MDAwMDAwMCkKKwkmJiAob3AxICYgMHg4MDAwMDAwMCkgIT0gKHJlc3VsdCAmIDB4ODAwMDAwMDApKTsKKyAgc2F0ID0gb3Y7CisgIAorICAvKiBTdG9yZSB0aGUgcmVzdWx0IGFuZCBjb25kaXRpb24gY29kZXMuICAqLworICBTdGF0ZS5yZWdzW09QWzFdXSA9IHJlc3VsdDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19DWSB8IFBTV19PVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKHMgPyBQU1dfUyA6IDApCisJICB8IChjeSA/IFBTV19DWSA6IDApIHwgKG92ID8gUFNXX09WIDogMCkKKwkgIHwgKHNhdCA/IFBTV19TQVQgOiAwKSk7CisgIAorICAvKiBIYW5kbGUgc2F0dXJhdGVkIHJlc3VsdHMuICAqLworICBpZiAoc2F0ICYmIHMpCisgICAgU3RhdGUucmVnc1tPUFsxXV0gPSAweDgwMDAwMDAwOworICBlbHNlIGlmIChzYXQpCisgICAgU3RhdGUucmVnc1tPUFsxXV0gPSAweDdmZmZmZmZmOworICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUcpOworCisgIHJldHVybiAyOworfQorCisvKiB0c3QgcmVnLHJlZyAqLworaW50CitPUF8xNjAgKCkKK3sKKyAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHM7CisKKyAgdHJhY2VfaW5wdXQgKCJ0c3QiLCBPUF9SRUdfUkVHX0NNUCwgMCk7CisKKyAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KKyAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKKyAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKKyAgcmVzdWx0ID0gb3AwICYgb3AxOworCisgIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIHogPSAocmVzdWx0ID09IDApOworICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOworCisgIC8qIFN0b3JlIHRoZSBjb25kaXRpb24gY29kZXMuICAqLworICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkpOworICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUdfQ01QKTsKKworICByZXR1cm4gMjsKK30KKworLyogbW92IHNpZ25fZXh0ZW5kKGltbTUpLCByZWcgKi8KK2ludAorT1BfMjAwICgpCit7CisgIGludCB2YWx1ZSA9IFNFWFQ1IChPUFswXSk7CisgIAorICB0cmFjZV9pbnB1dCAoIm1vdiIsIE9QX0lNTV9SRUdfTU9WRSwgMCk7CisgIAorICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gdmFsdWU7CisgIAorICB0cmFjZV9vdXRwdXQgKE9QX0lNTV9SRUdfTU9WRSk7CisgIAorICByZXR1cm4gMjsKK30KKworLyogbW92aGkgaW1tMTYsIHJlZywgcmVnICovCitpbnQKK09QXzY0MCAoKQoreworICB0cmFjZV9pbnB1dCAoIm1vdmhpIiwgT1BfVUlNTTE2X1JFR19SRUcsIDE2KTsKKyAgICAgIAorICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gU3RhdGUucmVnc1sgT1BbMF0gXSArIChPUFsyXSA8PCAxNik7CisgICAgICAKKyAgdHJhY2Vfb3V0cHV0IChPUF9VSU1NMTZfUkVHX1JFRyk7CisKKyAgcmV0dXJuIDQ7Cit9CisKKy8qIHNhciB6ZXJvX2V4dGVuZChpbW01KSxyZWcxICovCitpbnQKK09QXzJBMCAoKQoreworICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgcywgY3k7CisKKyAgdHJhY2VfaW5wdXQgKCJzYXIiLCBPUF9JTU1fUkVHLCAwKTsKKyAgb3AwID0gT1BbMF07CisgIG9wMSA9IFN0YXRlLnJlZ3NbIE9QWzFdIF07CisgIHJlc3VsdCA9IChzaWduZWQpb3AxID4+IG9wMDsKKworICAvKiBDb21wdXRlIHRoZSBjb25kaXRpb24gY29kZXMuICAqLworICB6ID0gKHJlc3VsdCA9PSAwKTsKKyAgcyA9IChyZXN1bHQgJiAweDgwMDAwMDAwKTsKKyAgY3kgPSAob3AxICYgKDEgPDwgKG9wMCAtIDEpKSk7CisKKyAgLyogU3RvcmUgdGhlIHJlc3VsdCBhbmQgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgU3RhdGUucmVnc1sgT1BbMV0gXSA9IHJlc3VsdDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PViB8IFBTV19DWSk7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKHMgPyBQU1dfUyA6IDApCisJCXwgKGN5ID8gUFNXX0NZIDogMCkpOworICB0cmFjZV9vdXRwdXQgKE9QX0lNTV9SRUcpOworCisgIHJldHVybiAyOworfQorCisvKiBzYXIgcmVnMSwgcmVnMiAqLworaW50CitPUF9BMDA3RTAgKCkKK3sKKyAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHMsIGN5OworCisgIHRyYWNlX2lucHV0ICgic2FyIiwgT1BfUkVHX1JFRywgMCk7CisgIAorICBvcDAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdICYgMHgxZjsKKyAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKKyAgcmVzdWx0ID0gKHNpZ25lZClvcDEgPj4gb3AwOworCisgIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIHogPSAocmVzdWx0ID09IDApOworICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOworICBjeSA9IChvcDEgJiAoMSA8PCAob3AwIC0gMSkpKTsKKworICAvKiBTdG9yZSB0aGUgcmVzdWx0IGFuZCBjb25kaXRpb24gY29kZXMuICAqLworICBTdGF0ZS5yZWdzW09QWzFdXSA9IHJlc3VsdDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PViB8IFBTV19DWSk7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKHMgPyBQU1dfUyA6IDApCisJCXwgKGN5ID8gUFNXX0NZIDogMCkpOworICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUcpOworCisgIHJldHVybiA0OworfQorCisvKiBzaGwgemVyb19leHRlbmQoaW1tNSkscmVnMSAqLworaW50CitPUF8yQzAgKCkKK3sKKyAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHMsIGN5OworCisgIHRyYWNlX2lucHV0ICgic2hsIiwgT1BfSU1NX1JFRywgMCk7CisgIG9wMCA9IE9QWzBdOworICBvcDEgPSBTdGF0ZS5yZWdzWyBPUFsxXSBdOworICByZXN1bHQgPSBvcDEgPDwgb3AwOworCisgIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIHogPSAocmVzdWx0ID09IDApOworICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOworICBjeSA9IChvcDEgJiAoMSA8PCAoMzIgLSBvcDApKSk7CisKKyAgLyogU3RvcmUgdGhlIHJlc3VsdCBhbmQgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgU3RhdGUucmVnc1tPUFsxXV0gPSByZXN1bHQ7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfT1YgfCBQU1dfQ1kpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChzID8gUFNXX1MgOiAwKQorCQl8IChjeSA/IFBTV19DWSA6IDApKTsKKyAgdHJhY2Vfb3V0cHV0IChPUF9JTU1fUkVHKTsKKworICByZXR1cm4gMjsKK30KKworLyogc2hsIHJlZzEsIHJlZzIgKi8KK2ludAorT1BfQzAwN0UwICgpCit7CisgIHVuc2lnbmVkIGludCBvcDAsIG9wMSwgcmVzdWx0LCB6LCBzLCBjeTsKKworICB0cmFjZV9pbnB1dCAoInNobCIsIE9QX1JFR19SRUcsIDApOworICBvcDAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdICYgMHgxZjsKKyAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKKyAgcmVzdWx0ID0gb3AxIDw8IG9wMDsKKworICAvKiBDb21wdXRlIHRoZSBjb25kaXRpb24gY29kZXMuICAqLworICB6ID0gKHJlc3VsdCA9PSAwKTsKKyAgcyA9IChyZXN1bHQgJiAweDgwMDAwMDAwKTsKKyAgY3kgPSAob3AxICYgKDEgPDwgKDMyIC0gb3AwKSkpOworCisgIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OworICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WIHwgUFNXX0NZKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkKKwkJfCAoY3kgPyBQU1dfQ1kgOiAwKSk7CisgIHRyYWNlX291dHB1dCAoT1BfUkVHX1JFRyk7CisKKyAgcmV0dXJuIDQ7Cit9CisKKy8qIHNociB6ZXJvX2V4dGVuZChpbW01KSxyZWcxICovCitpbnQKK09QXzI4MCAoKQoreworICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgcywgY3k7CisKKyAgdHJhY2VfaW5wdXQgKCJzaHIiLCBPUF9JTU1fUkVHLCAwKTsKKyAgb3AwID0gT1BbMF07CisgIG9wMSA9IFN0YXRlLnJlZ3NbIE9QWzFdIF07CisgIHJlc3VsdCA9IG9wMSA+PiBvcDA7CisKKyAgLyogQ29tcHV0ZSB0aGUgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgeiA9IChyZXN1bHQgPT0gMCk7CisgIHMgPSAocmVzdWx0ICYgMHg4MDAwMDAwMCk7CisgIGN5ID0gKG9wMSAmICgxIDw8IChvcDAgLSAxKSkpOworCisgIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OworICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WIHwgUFNXX0NZKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkKKwkJfCAoY3kgPyBQU1dfQ1kgOiAwKSk7CisgIHRyYWNlX291dHB1dCAoT1BfSU1NX1JFRyk7CisKKyAgcmV0dXJuIDI7Cit9CisKKy8qIHNociByZWcxLCByZWcyICovCitpbnQKK09QXzgwMDdFMCAoKQoreworICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgcywgY3k7CisKKyAgdHJhY2VfaW5wdXQgKCJzaHIiLCBPUF9SRUdfUkVHLCAwKTsKKyAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXSAmIDB4MWY7CisgIG9wMSA9IFN0YXRlLnJlZ3NbIE9QWzFdIF07CisgIHJlc3VsdCA9IG9wMSA+PiBvcDA7CisKKyAgLyogQ29tcHV0ZSB0aGUgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgeiA9IChyZXN1bHQgPT0gMCk7CisgIHMgPSAocmVzdWx0ICYgMHg4MDAwMDAwMCk7CisgIGN5ID0gKG9wMSAmICgxIDw8IChvcDAgLSAxKSkpOworCisgIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OworICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WIHwgUFNXX0NZKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkKKwkJfCAoY3kgPyBQU1dfQ1kgOiAwKSk7CisgIHRyYWNlX291dHB1dCAoT1BfUkVHX1JFRyk7CisKKyAgcmV0dXJuIDQ7Cit9CisKKy8qIG9yIHJlZywgcmVnICovCitpbnQKK09QXzEwMCAoKQoreworICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgczsKKworICB0cmFjZV9pbnB1dCAoIm9yIiwgT1BfUkVHX1JFRywgMCk7CisKKyAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KKyAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKKyAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKKyAgcmVzdWx0ID0gb3AwIHwgb3AxOworCisgIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIHogPSAocmVzdWx0ID09IDApOworICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOworCisgIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OworICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkpOworICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUcpOworCisgIHJldHVybiAyOworfQorCisvKiBvcmkgemVyb19leHRlbmQoaW1tMTYpLCByZWcsIHJlZyAqLworaW50CitPUF82ODAgKCkKK3sKKyAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCByZXN1bHQsIHosIHM7CisKKyAgdHJhY2VfaW5wdXQgKCJvcmkiLCBPUF9VSU1NMTZfUkVHX1JFRywgMCk7CisgIG9wMCA9IE9QWzJdOworICBvcDEgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOworICByZXN1bHQgPSBvcDAgfCBvcDE7CisKKyAgLyogQ29tcHV0ZSB0aGUgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgeiA9IChyZXN1bHQgPT0gMCk7CisgIHMgPSAocmVzdWx0ICYgMHg4MDAwMDAwMCk7CisKKyAgLyogU3RvcmUgdGhlIHJlc3VsdCBhbmQgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgU3RhdGUucmVnc1tPUFsxXV0gPSByZXN1bHQ7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfT1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChzID8gUFNXX1MgOiAwKSk7CisgIHRyYWNlX291dHB1dCAoT1BfVUlNTTE2X1JFR19SRUcpOworCisgIHJldHVybiA0OworfQorCisvKiBhbmQgcmVnLCByZWcgKi8KK2ludAorT1BfMTQwICgpCit7CisgIHVuc2lnbmVkIGludCBvcDAsIG9wMSwgcmVzdWx0LCB6LCBzOworCisgIHRyYWNlX2lucHV0ICgiYW5kIiwgT1BfUkVHX1JFRywgMCk7CisKKyAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KKyAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKKyAgb3AxID0gU3RhdGUucmVnc1sgT1BbMV0gXTsKKyAgcmVzdWx0ID0gb3AwICYgb3AxOworCisgIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIHogPSAocmVzdWx0ID09IDApOworICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOworCisgIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OworICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkpOworICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUcpOworCisgIHJldHVybiAyOworfQorCisvKiBhbmRpIHplcm9fZXh0ZW5kKGltbTE2KSwgcmVnLCByZWcgKi8KK2ludAorT1BfNkMwICgpCit7CisgIHVuc2lnbmVkIGludCByZXN1bHQsIHo7CisKKyAgdHJhY2VfaW5wdXQgKCJhbmRpIiwgT1BfVUlNTTE2X1JFR19SRUcsIDApOworCisgIHJlc3VsdCA9IE9QWzJdICYgU3RhdGUucmVnc1sgT1BbMF0gXTsKKworICAvKiBDb21wdXRlIHRoZSBjb25kaXRpb24gY29kZXMuICAqLworICB6ID0gKHJlc3VsdCA9PSAwKTsKKworICAvKiBTdG9yZSB0aGUgcmVzdWx0IGFuZCBjb25kaXRpb24gY29kZXMuICAqLworICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gcmVzdWx0OworICAKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PVik7CisgIFBTVyB8PSAoeiA/IFBTV19aIDogMCk7CisgIAorICB0cmFjZV9vdXRwdXQgKE9QX1VJTU0xNl9SRUdfUkVHKTsKKworICByZXR1cm4gNDsKK30KKworLyogeG9yIHJlZywgcmVnICovCitpbnQKK09QXzEyMCAoKQoreworICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgczsKKworICB0cmFjZV9pbnB1dCAoInhvciIsIE9QX1JFR19SRUcsIDApOworCisgIC8qIENvbXB1dGUgdGhlIHJlc3VsdC4gICovCisgIG9wMCA9IFN0YXRlLnJlZ3NbIE9QWzBdIF07CisgIG9wMSA9IFN0YXRlLnJlZ3NbIE9QWzFdIF07CisgIHJlc3VsdCA9IG9wMCBeIG9wMTsKKworICAvKiBDb21wdXRlIHRoZSBjb25kaXRpb24gY29kZXMuICAqLworICB6ID0gKHJlc3VsdCA9PSAwKTsKKyAgcyA9IChyZXN1bHQgJiAweDgwMDAwMDAwKTsKKworICAvKiBTdG9yZSB0aGUgcmVzdWx0IGFuZCBjb25kaXRpb24gY29kZXMuICAqLworICBTdGF0ZS5yZWdzW09QWzFdXSA9IHJlc3VsdDsKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PVik7CisgIFBTVyB8PSAoKHogPyBQU1dfWiA6IDApIHwgKHMgPyBQU1dfUyA6IDApKTsKKyAgdHJhY2Vfb3V0cHV0IChPUF9SRUdfUkVHKTsKKworICByZXR1cm4gMjsKK30KKworLyogeG9yaSB6ZXJvX2V4dGVuZChpbW0xNiksIHJlZywgcmVnICovCitpbnQKK09QXzZBMCAoKQoreworICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIHJlc3VsdCwgeiwgczsKKworICB0cmFjZV9pbnB1dCAoInhvcmkiLCBPUF9VSU1NMTZfUkVHX1JFRywgMCk7CisgIG9wMCA9IE9QWzJdOworICBvcDEgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOworICByZXN1bHQgPSBvcDAgXiBvcDE7CisKKyAgLyogQ29tcHV0ZSB0aGUgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgeiA9IChyZXN1bHQgPT0gMCk7CisgIHMgPSAocmVzdWx0ICYgMHg4MDAwMDAwMCk7CisKKyAgLyogU3RvcmUgdGhlIHJlc3VsdCBhbmQgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgU3RhdGUucmVnc1tPUFsxXV0gPSByZXN1bHQ7CisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfT1YpOworICBQU1cgfD0gKCh6ID8gUFNXX1ogOiAwKSB8IChzID8gUFNXX1MgOiAwKSk7CisgIHRyYWNlX291dHB1dCAoT1BfVUlNTTE2X1JFR19SRUcpOworCisgIHJldHVybiA0OworfQorCisvKiBub3QgcmVnMSwgcmVnMiAqLworaW50CitPUF8yMCAoKQoreworICB1bnNpZ25lZCBpbnQgb3AwLCByZXN1bHQsIHosIHM7CisKKyAgdHJhY2VfaW5wdXQgKCJub3QiLCBPUF9SRUdfUkVHX01PVkUsIDApOworICAvKiBDb21wdXRlIHRoZSByZXN1bHQuICAqLworICBvcDAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOworICByZXN1bHQgPSB+b3AwOworCisgIC8qIENvbXB1dGUgdGhlIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIHogPSAocmVzdWx0ID09IDApOworICBzID0gKHJlc3VsdCAmIDB4ODAwMDAwMDApOworCisgIC8qIFN0b3JlIHRoZSByZXN1bHQgYW5kIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIFN0YXRlLnJlZ3NbT1BbMV1dID0gcmVzdWx0OworICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WKTsKKyAgUFNXIHw9ICgoeiA/IFBTV19aIDogMCkgfCAocyA/IFBTV19TIDogMCkpOworICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUdfTU9WRSk7CisKKyAgcmV0dXJuIDI7Cit9CisKKy8qIHNldDEgKi8KK2ludAorT1BfN0MwICgpCit7CisgIHVuc2lnbmVkIGludCBvcDAsIG9wMSwgb3AyOworICBpbnQgdGVtcDsKKworICB0cmFjZV9pbnB1dCAoInNldDEiLCBPUF9CSVQsIDApOworICBvcDAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOworICBvcDEgPSBPUFsxXSAmIDB4NzsKKyAgdGVtcCA9IEVYVEVORDE2IChPUFsyXSk7CisgIG9wMiA9IHRlbXA7CisgIHRlbXAgPSBsb2FkX21lbSAob3AwICsgb3AyLCAxKTsKKyAgUFNXICY9IH5QU1dfWjsKKyAgaWYgKCh0ZW1wICYgKDEgPDwgb3AxKSkgPT0gMCkKKyAgICBQU1cgfD0gUFNXX1o7CisgIHRlbXAgfD0gKDEgPDwgb3AxKTsKKyAgc3RvcmVfbWVtIChvcDAgKyBvcDIsIDEsIHRlbXApOworICB0cmFjZV9vdXRwdXQgKE9QX0JJVCk7CisKKyAgcmV0dXJuIDQ7Cit9CisKKy8qIG5vdDEgKi8KK2ludAorT1BfNDdDMCAoKQoreworICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIG9wMjsKKyAgaW50IHRlbXA7CisKKyAgdHJhY2VfaW5wdXQgKCJub3QxIiwgT1BfQklULCAwKTsKKyAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKKyAgb3AxID0gT1BbMV0gJiAweDc7CisgIHRlbXAgPSBFWFRFTkQxNiAoT1BbMl0pOworICBvcDIgPSB0ZW1wOworICB0ZW1wID0gbG9hZF9tZW0gKG9wMCArIG9wMiwgMSk7CisgIFBTVyAmPSB+UFNXX1o7CisgIGlmICgodGVtcCAmICgxIDw8IG9wMSkpID09IDApCisgICAgUFNXIHw9IFBTV19aOworICB0ZW1wIF49ICgxIDw8IG9wMSk7CisgIHN0b3JlX21lbSAob3AwICsgb3AyLCAxLCB0ZW1wKTsKKyAgdHJhY2Vfb3V0cHV0IChPUF9CSVQpOworCisgIHJldHVybiA0OworfQorCisvKiBjbHIxICovCitpbnQKK09QXzg3QzAgKCkKK3sKKyAgdW5zaWduZWQgaW50IG9wMCwgb3AxLCBvcDI7CisgIGludCB0ZW1wOworCisgIHRyYWNlX2lucHV0ICgiY2xyMSIsIE9QX0JJVCwgMCk7CisgIG9wMCA9IFN0YXRlLnJlZ3NbIE9QWzBdIF07CisgIG9wMSA9IE9QWzFdICYgMHg3OworICB0ZW1wID0gRVhURU5EMTYgKE9QWzJdKTsKKyAgb3AyID0gdGVtcDsKKyAgdGVtcCA9IGxvYWRfbWVtIChvcDAgKyBvcDIsIDEpOworICBQU1cgJj0gflBTV19aOworICBpZiAoKHRlbXAgJiAoMSA8PCBvcDEpKSA9PSAwKQorICAgIFBTVyB8PSBQU1dfWjsKKyAgdGVtcCAmPSB+KDEgPDwgb3AxKTsKKyAgc3RvcmVfbWVtIChvcDAgKyBvcDIsIDEsIHRlbXApOworICB0cmFjZV9vdXRwdXQgKE9QX0JJVCk7CisKKyAgcmV0dXJuIDQ7Cit9CisKKy8qIHRzdDEgKi8KK2ludAorT1BfQzdDMCAoKQoreworICB1bnNpZ25lZCBpbnQgb3AwLCBvcDEsIG9wMjsKKyAgaW50IHRlbXA7CisKKyAgdHJhY2VfaW5wdXQgKCJ0c3QxIiwgT1BfQklULCAwKTsKKyAgb3AwID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKKyAgb3AxID0gT1BbMV0gJiAweDc7CisgIHRlbXAgPSBFWFRFTkQxNiAoT1BbMl0pOworICBvcDIgPSB0ZW1wOworICB0ZW1wID0gbG9hZF9tZW0gKG9wMCArIG9wMiwgMSk7CisgIFBTVyAmPSB+UFNXX1o7CisgIGlmICgodGVtcCAmICgxIDw8IG9wMSkpID09IDApCisgICAgUFNXIHw9IFBTV19aOworICB0cmFjZV9vdXRwdXQgKE9QX0JJVCk7CisKKyAgcmV0dXJuIDQ7Cit9CisKKy8qIGRpICovCitpbnQKK09QXzE2MDA3RTAgKCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJkaSIsIE9QX05PTkUsIDApOworICBQU1cgfD0gUFNXX0lEOworICB0cmFjZV9vdXRwdXQgKE9QX05PTkUpOworCisgIHJldHVybiA0OworfQorCisvKiBlaSAqLworaW50CitPUF8xNjA4N0UwICgpCit7CisgIHRyYWNlX2lucHV0ICgiZWkiLCBPUF9OT05FLCAwKTsKKyAgUFNXICY9IH5QU1dfSUQ7CisgIHRyYWNlX291dHB1dCAoT1BfTk9ORSk7CisKKyAgcmV0dXJuIDQ7Cit9CisKKy8qIGhhbHQgKi8KK2ludAorT1BfMTIwMDdFMCAoKQoreworICB0cmFjZV9pbnB1dCAoImhhbHQiLCBPUF9OT05FLCAwKTsKKyAgLyogRklYTUUgdGhpcyBzaG91bGQgcHV0IHByb2Nlc3NvciBpbnRvIGEgbW9kZSB3aGVyZSBOTUkgc3RpbGwgaGFuZGxlZCAqLworICB0cmFjZV9vdXRwdXQgKE9QX05PTkUpOworICBzaW1fZW5naW5lX2hhbHQgKHNpbXVsYXRvciwgU1RBVEVfQ1BVIChzaW11bGF0b3IsIDApLCBOVUxMLCBQQywKKwkJICAgc2ltX3N0b3BwZWQsIFNJTV9TSUdUUkFQKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIHRyYXAgKi8KK2ludAorT1BfMTAwMDdFMCAoKQoreworICB0cmFjZV9pbnB1dCAoInRyYXAiLCBPUF9UUkFQLCAwKTsKKyAgdHJhY2Vfb3V0cHV0IChPUF9UUkFQKTsKKworICAvKiBUcmFwIDMxIGlzIHVzZWQgZm9yIHNpbXVsYXRpbmcgT1MgSS9PIGZ1bmN0aW9ucyAqLworCisgIGlmIChPUFswXSA9PSAzMSkKKyAgICB7CisgICAgICBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwkKKyAgICAgIGVycm5vID0gMDsKKworLyogUmVnaXN0ZXJzIHBhc3NlZCB0byB0cmFwIDAgKi8KKworI2RlZmluZSBGVU5DICAgU3RhdGUucmVnc1s2XQkvKiBmdW5jdGlvbiBudW1iZXIsIHJldHVybiB2YWx1ZSAqLworI2RlZmluZSBQQVJNMSAgU3RhdGUucmVnc1s3XQkvKiBvcHRpb25hbCBwYXJtIDEgKi8KKyNkZWZpbmUgUEFSTTIgIFN0YXRlLnJlZ3NbOF0JLyogb3B0aW9uYWwgcGFybSAyICovCisjZGVmaW5lIFBBUk0zICBTdGF0ZS5yZWdzWzldCS8qIG9wdGlvbmFsIHBhcm0gMyAqLworCisvKiBSZWdpc3RlcnMgc2V0IGJ5IHRyYXAgMCAqLworCisjZGVmaW5lIFJFVFZBTCBTdGF0ZS5yZWdzWzEwXQkvKiByZXR1cm4gdmFsdWUgKi8KKyNkZWZpbmUgUkVURVJSIFN0YXRlLnJlZ3NbMTFdCS8qIHJldHVybiBlcnJvciBjb2RlICovCisKKy8qIFR1cm4gYSBwb2ludGVyIGluIGEgcmVnaXN0ZXIgaW50byBhIHBvaW50ZXIgaW50byByZWFsIG1lbW9yeS4gKi8KKworI2RlZmluZSBNRU1QVFIoeCkgKG1hcCAoeCkpCisKKyAgICAgIHN3aXRjaCAoRlVOQykKKwl7CisKKyNpZmRlZiBIQVZFX0ZPUksKKyNpZmRlZiBUQVJHRVRfU1lTX2ZvcmsKKwljYXNlIFRBUkdFVF9TWVNfZm9yazoKKwkgIFJFVFZBTCA9IGZvcmsgKCk7CisJICBicmVhazsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0VYRUNWRQorI2lmZGVmIFRBUkdFVF9TWVNfZXhlY3YKKwljYXNlIFRBUkdFVF9TWVNfZXhlY3ZlOgorCSAgeworCSAgICBjaGFyICpwYXRoID0gZmV0Y2hfc3RyIChzaW11bGF0b3IsIFBBUk0xKTsKKwkgICAgY2hhciAqKmFyZ3YgPSBmZXRjaF9hcmd2IChzaW11bGF0b3IsIFBBUk0yKTsKKwkgICAgY2hhciAqKmVudnAgPSBmZXRjaF9hcmd2IChzaW11bGF0b3IsIFBBUk0zKTsKKwkgICAgUkVUVkFMID0gZXhlY3ZlIChwYXRoLCBhcmd2LCBlbnZwKTsKKwkgICAgemZyZWUgKHBhdGgpOworCSAgICBmcmVlYXJndiAoYXJndik7CisJICAgIGZyZWVhcmd2IChlbnZwKTsKKwkgICAgYnJlYWs7CisJICB9CisjZW5kaWYKKyNlbmRpZgorCisjaWYgSEFWRV9FWEVDVgorI2lmZGVmIFRBUkdFVF9TWVNfZXhlY3YKKwljYXNlIFRBUkdFVF9TWVNfZXhlY3Y6CisJICB7CisJICAgIGNoYXIgKnBhdGggPSBmZXRjaF9zdHIgKHNpbXVsYXRvciwgUEFSTTEpOworCSAgICBjaGFyICoqYXJndiA9IGZldGNoX2FyZ3YgKHNpbXVsYXRvciwgUEFSTTIpOworCSAgICBSRVRWQUwgPSBleGVjdiAocGF0aCwgYXJndik7CisJICAgIHpmcmVlIChwYXRoKTsKKwkgICAgZnJlZWFyZ3YgKGFyZ3YpOworCSAgICBicmVhazsKKwkgIH0KKyNlbmRpZgorI2VuZGlmCisKKyNpZiAwCisjaWZkZWYgVEFSR0VUX1NZU19waXBlCisJY2FzZSBUQVJHRVRfU1lTX3BpcGU6CisJICB7CisJICAgIHJlZ190IGJ1ZjsKKwkgICAgaW50IGhvc3RfZmRbMl07CisKKwkgICAgYnVmID0gUEFSTTE7CisJICAgIFJFVFZBTCA9IHBpcGUgKGhvc3RfZmQpOworCSAgICBTVyAoYnVmLCBob3N0X2ZkWzBdKTsKKwkgICAgYnVmICs9IHNpemVvZih1aW50MTYpOworCSAgICBTVyAoYnVmLCBob3N0X2ZkWzFdKTsKKwkgIH0KKwkgIGJyZWFrOworI2VuZGlmCisjZW5kaWYKKworI2lmIDAKKyNpZmRlZiBUQVJHRVRfU1lTX3dhaXQKKwljYXNlIFRBUkdFVF9TWVNfd2FpdDoKKwkgIHsKKwkgICAgaW50IHN0YXR1czsKKworCSAgICBSRVRWQUwgPSB3YWl0ICgmc3RhdHVzKTsKKwkgICAgU1cgKFBBUk0xLCBzdGF0dXMpOworCSAgfQorCSAgYnJlYWs7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgVEFSR0VUX1NZU19yZWFkCisJY2FzZSBUQVJHRVRfU1lTX3JlYWQ6CisJICB7CisJICAgIGNoYXIgKmJ1ZiA9IHphbGxvYyAoUEFSTTMpOworCSAgICBSRVRWQUwgPSBzaW1faW9fcmVhZCAoc2ltdWxhdG9yLCBQQVJNMSwgYnVmLCBQQVJNMyk7CisJICAgIHNpbV93cml0ZSAoc2ltdWxhdG9yLCBQQVJNMiwgYnVmLCBQQVJNMyk7CisJICAgIHpmcmVlIChidWYpOworCSAgICBicmVhazsKKwkgIH0KKyNlbmRpZgorCisjaWZkZWYgVEFSR0VUX1NZU193cml0ZQorCWNhc2UgVEFSR0VUX1NZU193cml0ZToKKwkgIHsKKwkgICAgY2hhciAqYnVmID0gemFsbG9jIChQQVJNMyk7CisJICAgIHNpbV9yZWFkIChzaW11bGF0b3IsIFBBUk0yLCBidWYsIFBBUk0zKTsKKwkgICAgaWYgKFBBUk0xID09IDEpCisJICAgICAgUkVUVkFMID0gc2ltX2lvX3dyaXRlX3N0ZG91dCAoc2ltdWxhdG9yLCBidWYsIFBBUk0zKTsKKwkgICAgZWxzZQorCSAgICAgIFJFVFZBTCA9IHNpbV9pb193cml0ZSAoc2ltdWxhdG9yLCBQQVJNMSwgYnVmLCBQQVJNMyk7CisJICAgIHpmcmVlIChidWYpOworCSAgICBicmVhazsKKwkgIH0KKyNlbmRpZgorCisjaWZkZWYgVEFSR0VUX1NZU19sc2VlaworCWNhc2UgVEFSR0VUX1NZU19sc2VlazoKKwkgIFJFVFZBTCA9IHNpbV9pb19sc2VlayAoc2ltdWxhdG9yLCBQQVJNMSwgUEFSTTIsIFBBUk0zKTsKKwkgIGJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBUQVJHRVRfU1lTX2Nsb3NlCisJY2FzZSBUQVJHRVRfU1lTX2Nsb3NlOgorCSAgUkVUVkFMID0gc2ltX2lvX2Nsb3NlIChzaW11bGF0b3IsIFBBUk0xKTsKKwkgIGJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBUQVJHRVRfU1lTX29wZW4KKwljYXNlIFRBUkdFVF9TWVNfb3BlbjoKKwkgIHsKKwkgICAgY2hhciAqYnVmID0gZmV0Y2hfc3RyIChzaW11bGF0b3IsIFBBUk0xKTsKKwkgICAgUkVUVkFMID0gc2ltX2lvX29wZW4gKHNpbXVsYXRvciwgYnVmLCBQQVJNMik7CisJICAgIHpmcmVlIChidWYpOworCSAgICBicmVhazsKKwkgIH0KKyNlbmRpZgorCisjaWZkZWYgVEFSR0VUX1NZU19leGl0CisJY2FzZSBUQVJHRVRfU1lTX2V4aXQ6CisJICBpZiAoKFBBUk0xICYgMHhmZmZmMDAwMCkgPT0gMHhkZWFkMDAwMCAmJiAoUEFSTTEgJiAweGZmZmYpICE9IDApCisJICAgIC8qIGdldCBzaWduYWwgZW5jb2RlZCBieSBraWxsICovCisJICAgIHNpbV9lbmdpbmVfaGFsdCAoc2ltdWxhdG9yLCBTVEFURV9DUFUgKHNpbXVsYXRvciwgMCksIE5VTEwsIFBDLAorCQkJICAgICBzaW1fc2lnbmFsbGVkLCBQQVJNMSAmIDB4ZmZmZik7CisJICBlbHNlIGlmIChQQVJNMSA9PSAweGRlYWQpCisJICAgIC8qIG9sZCBsaWJyYXJpZXMgKi8KKwkgICAgc2ltX2VuZ2luZV9oYWx0IChzaW11bGF0b3IsIFNUQVRFX0NQVSAoc2ltdWxhdG9yLCAwKSwgTlVMTCwgUEMsCisJCQkgICAgIHNpbV9zdG9wcGVkLCBTSU1fU0lHQUJSVCk7CisJICBlbHNlCisJICAgIC8qIFBBUk0xIGhhcyBleGl0IHN0YXR1cyAqLworCSAgICBzaW1fZW5naW5lX2hhbHQgKHNpbXVsYXRvciwgU1RBVEVfQ1BVIChzaW11bGF0b3IsIDApLCBOVUxMLCBQQywKKwkJCSAgICAgc2ltX2V4aXRlZCwgUEFSTTEpOworCSAgYnJlYWs7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fR08zMl9fKSAmJiAhZGVmaW5lZChfV0lOMzIpCisjaWZkZWYgVEFSR0VUX1NZU19zdGF0CisJY2FzZSBUQVJHRVRfU1lTX3N0YXQ6CS8qIGFkZGVkIGF0IGhtc2kgKi8KKwkgIC8qIHN0YXQgc3lzdGVtIGNhbGwgKi8KKwkgIHsKKwkgICAgc3RydWN0IHN0YXQgaG9zdF9zdGF0OworCSAgICByZWdfdCBidWY7CisJICAgIGNoYXIgKnBhdGggPSBmZXRjaF9zdHIgKHNpbXVsYXRvciwgUEFSTTEpOworCisJICAgIFJFVFZBTCA9IHN0YXQgKHBhdGgsICZob3N0X3N0YXQpOworCisJICAgIHpmcmVlIChwYXRoKTsKKwkgICAgYnVmID0gUEFSTTI7CisKKwkgICAgLyogSnVzdCB3aWxkLWFzc2VkIGd1ZXNzZXMuICAqLworCSAgICBzdG9yZV9tZW0gKGJ1ZiwgMiwgaG9zdF9zdGF0LnN0X2Rldik7CisJICAgIHN0b3JlX21lbSAoYnVmICsgMiwgMiwgaG9zdF9zdGF0LnN0X2lubyk7CisJICAgIHN0b3JlX21lbSAoYnVmICsgNCwgNCwgaG9zdF9zdGF0LnN0X21vZGUpOworCSAgICBzdG9yZV9tZW0gKGJ1ZiArIDgsIDIsIGhvc3Rfc3RhdC5zdF9ubGluayk7CisJICAgIHN0b3JlX21lbSAoYnVmICsgMTAsIDIsIGhvc3Rfc3RhdC5zdF91aWQpOworCSAgICBzdG9yZV9tZW0gKGJ1ZiArIDEyLCAyLCBob3N0X3N0YXQuc3RfZ2lkKTsKKwkgICAgc3RvcmVfbWVtIChidWYgKyAxNCwgMiwgaG9zdF9zdGF0LnN0X3JkZXYpOworCSAgICBzdG9yZV9tZW0gKGJ1ZiArIDE2LCA0LCBob3N0X3N0YXQuc3Rfc2l6ZSk7CisJICAgIHN0b3JlX21lbSAoYnVmICsgMjAsIDQsIGhvc3Rfc3RhdC5zdF9hdGltZSk7CisJICAgIHN0b3JlX21lbSAoYnVmICsgMjgsIDQsIGhvc3Rfc3RhdC5zdF9tdGltZSk7CisJICAgIHN0b3JlX21lbSAoYnVmICsgMzYsIDQsIGhvc3Rfc3RhdC5zdF9jdGltZSk7CisJICB9CisJICBicmVhazsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NIT1dOCisjaWZkZWYgVEFSR0VUX1NZU19jaG93bgorCWNhc2UgVEFSR0VUX1NZU19jaG93bjoKKwkgIHsKKwkgICAgY2hhciAqcGF0aCA9IGZldGNoX3N0ciAoc2ltdWxhdG9yLCBQQVJNMSk7CisJICAgIFJFVFZBTCA9IGNob3duIChwYXRoLCBQQVJNMiwgUEFSTTMpOworCSAgICB6ZnJlZSAocGF0aCk7CisJICB9CisJICBicmVhazsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBIQVZFX0NITU9ECisjaWZkZWYgVEFSR0VUX1NZU19jaG1vZAorCWNhc2UgVEFSR0VUX1NZU19jaG1vZDoKKwkgIHsKKwkgICAgY2hhciAqcGF0aCA9IGZldGNoX3N0ciAoc2ltdWxhdG9yLCBQQVJNMSk7CisJICAgIFJFVFZBTCA9IGNobW9kIChwYXRoLCBQQVJNMik7CisJICAgIHpmcmVlIChwYXRoKTsKKwkgIH0KKwkgIGJyZWFrOworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFRBUkdFVF9TWVNfdGltZQorI2lmIEhBVkVfVElNRQorCWNhc2UgVEFSR0VUX1NZU190aW1lOgorCSAgeworCSAgICB0aW1lX3Qgbm93OworCSAgICBSRVRWQUwgPSB0aW1lICgmbm93KTsKKwkgICAgc3RvcmVfbWVtIChQQVJNMSwgNCwgbm93KTsKKwkgIH0KKwkgIGJyZWFrOworI2VuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fR08zMl9fKSAmJiAhZGVmaW5lZChfV0lOMzIpCisjaWZkZWYgVEFSR0VUX1NZU190aW1lcworCWNhc2UgVEFSR0VUX1NZU190aW1lczoKKwkgIHsKKwkgICAgc3RydWN0IHRtcyB0bXM7CisJICAgIFJFVFZBTCA9IHRpbWVzICgmdG1zKTsKKwkgICAgc3RvcmVfbWVtIChQQVJNMSwgNCwgdG1zLnRtc191dGltZSk7CisJICAgIHN0b3JlX21lbSAoUEFSTTEgKyA0LCA0LCB0bXMudG1zX3N0aW1lKTsKKwkgICAgc3RvcmVfbWVtIChQQVJNMSArIDgsIDQsIHRtcy50bXNfY3V0aW1lKTsKKwkgICAgc3RvcmVfbWVtIChQQVJNMSArIDEyLCA0LCB0bXMudG1zX2NzdGltZSk7CisJICAgIGJyZWFrOworCSAgfQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFRBUkdFVF9TWVNfZ2V0dGltZW9mZGF5CisjaWYgIWRlZmluZWQoX19HTzMyX18pICYmICFkZWZpbmVkKF9XSU4zMikKKwljYXNlIFRBUkdFVF9TWVNfZ2V0dGltZW9mZGF5OgorCSAgeworCSAgICBzdHJ1Y3QgdGltZXZhbCB0OworCSAgICBzdHJ1Y3QgdGltZXpvbmUgdHo7CisJICAgIFJFVFZBTCA9IGdldHRpbWVvZmRheSAoJnQsICZ0eik7CisJICAgIHN0b3JlX21lbSAoUEFSTTEsIDQsIHQudHZfc2VjKTsKKwkgICAgc3RvcmVfbWVtIChQQVJNMSArIDQsIDQsIHQudHZfdXNlYyk7CisJICAgIHN0b3JlX21lbSAoUEFSTTIsIDQsIHR6LnR6X21pbnV0ZXN3ZXN0KTsKKwkgICAgc3RvcmVfbWVtIChQQVJNMiArIDQsIDQsIHR6LnR6X2RzdHRpbWUpOworCSAgICBicmVhazsKKwkgIH0KKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBUQVJHRVRfU1lTX3V0aW1lCisjaWYgSEFWRV9VVElNRQorCWNhc2UgVEFSR0VUX1NZU191dGltZToKKwkgIHsKKwkgICAgLyogQ2FzdCB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHZvaWQgKiwgdG8gYXZvaWQgdHlwZSBtaXNtYXRjaAorCSAgICAgICBpZiBhIHByb3RvdHlwZSBpcyBwcmVzZW50LiAgKi8KKwkgICAgc2ltX2lvX2Vycm9yIChzaW11bGF0b3IsICJVdGltZSBub3Qgc3VwcG9ydGVkIik7CisJICAgIC8qIFJFVFZBTCA9IHV0aW1lIChwYXRoLCAodm9pZCAqKSBNRU1QVFIgKFBBUk0yKSk7ICovCisJICB9CisJICBicmVhazsKKyNlbmRpZgorI2VuZGlmCisKKwlkZWZhdWx0OgorCSAgYWJvcnQgKCk7CisJfQorICAgICAgUkVURVJSID0gZXJybm87CisgICAgICBlcnJubyA9IHNhdmVfZXJybm87CisKKyAgICAgIHJldHVybiA0OworICAgIH0KKyAgZWxzZQorICAgIHsJCQkJLyogVHJhcCAwIC0+IDMwICovCisgICAgICBFSVBDID0gUEMgKyA0OworICAgICAgRUlQU1cgPSBQU1c7CisgICAgICAvKiBNYXNrIG91dCBFSUNDICovCisgICAgICBFQ1IgJj0gMHhmZmZmMDAwMDsKKyAgICAgIEVDUiB8PSAweDQwICsgT1BbMF07CisgICAgICAvKiBGbGFnIHRoYXQgd2UgYXJlIG5vdyBkb2luZyBleGNlcHRpb24gcHJvY2Vzc2luZy4gICovCisgICAgICBQU1cgfD0gUFNXX0VQIHwgUFNXX0lEOworICAgICAgUEMgPSAoKE9QWzBdIDwgMHgxMCkgPyAweDQwIDogMHg1MCkgLSA0OworCisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qIHRzdDEgcmVnMiwgW3JlZzFdICovCitpbnQKK09QX0U2MDdFMCAodm9pZCkKK3sKKyAgaW50IHRlbXA7CisKKyAgdHJhY2VfaW5wdXQgKCJ0c3QxIiwgT1BfQklULCAxKTsKKworICB0ZW1wID0gbG9hZF9tZW0gKFN0YXRlLnJlZ3NbIE9QWzBdIF0sIDEpOworICAKKyAgUFNXICY9IH5QU1dfWjsKKyAgaWYgKCh0ZW1wICYgKDEgPDwgU3RhdGUucmVnc1sgT1BbMV0gJiAweDcgXSkpID09IDApCisgICAgUFNXIHw9IFBTV19aOworICAKKyAgdHJhY2Vfb3V0cHV0IChPUF9CSVQpOworCisgIHJldHVybiA0OworfQorCisvKiBtdWx1IHJlZzEsIHJlZzIsIHJlZzMgKi8KK2ludAorT1BfMjIyMDdFMCAodm9pZCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJtdWx1IiwgT1BfUkVHX1JFR19SRUcsIDApOworCisgIE11bHRpcGx5NjQgKGZhbHNlLCBTdGF0ZS5yZWdzWyBPUFswXSBdKTsKKworICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUdfUkVHKTsKKworICByZXR1cm4gNDsKK30KKworI2RlZmluZSBCSVRfQ0hBTkdFX09QKCBuYW1lLCBiaW5vcCApCQlcCisgIHVuc2lnbmVkIGludCBiaXQ7CQkJCVwKKyAgdW5zaWduZWQgaW50IHRlbXA7CQkJCVwKKyAgCQkJCQkJXAorICB0cmFjZV9pbnB1dCAobmFtZSwgT1BfQklUX0NIQU5HRSwgMCk7CQlcCisgIAkJCQkJCVwKKyAgYml0ICA9IDEgPDwgU3RhdGUucmVnc1sgT1BbMV0gJiAweDcgXTsJXAorICB0ZW1wID0gbG9hZF9tZW0gKFN0YXRlLnJlZ3NbIE9QWzBdIF0sIDEpOwlcCisJCQkJCQlcCisgIFBTVyAmPSB+UFNXX1o7CQkJCVwKKyAgaWYgKCh0ZW1wICYgYml0KSA9PSAwKQkJCVwKKyAgICBQU1cgfD0gUFNXX1o7CQkJCVwKKyAgdGVtcCBiaW5vcCBiaXQ7CQkJCVwKKyAgCQkJCQkJXAorICBzdG9yZV9tZW0gKFN0YXRlLnJlZ3NbIE9QWzBdIF0sIDEsIHRlbXApOwlcCisJICAgICAJCQkJCVwKKyAgdHJhY2Vfb3V0cHV0IChPUF9CSVRfQ0hBTkdFKTsJCQlcCisJICAgICAJCQkJCVwKKyAgcmV0dXJuIDQ7CisKKy8qIGNscjEgcmVnMiwgW3JlZzFdICovCitpbnQKK09QX0U0MDdFMCAodm9pZCkKK3sKKyAgQklUX0NIQU5HRV9PUCAoImNscjEiLCAmPSB+ICk7Cit9CisKKy8qIG5vdDEgcmVnMiwgW3JlZzFdICovCitpbnQKK09QX0UyMDdFMCAodm9pZCkKK3sKKyAgQklUX0NIQU5HRV9PUCAoIm5vdDEiLCBePSApOworfQorCisvKiBzZXQxICovCitpbnQKK09QX0UwMDdFMCAodm9pZCkKK3sKKyAgQklUX0NIQU5HRV9PUCAoInNldDEiLCB8PSApOworfQorCisvKiBzYXNmICovCitpbnQKK09QXzIwMDA3RTAgKHZvaWQpCit7CisgIHRyYWNlX2lucHV0ICgic2FzZiIsIE9QX0VYMSwgMCk7CisgIAorICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gKFN0YXRlLnJlZ3NbIE9QWzFdIF0gPDwgMSkgfCBjb25kaXRpb25fbWV0IChPUFswXSk7CisgIAorICB0cmFjZV9vdXRwdXQgKE9QX0VYMSk7CisKKyAgcmV0dXJuIDQ7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY291cnRlc3kgb2YgU3VnaW1vdG8gYXQgTkVDLCB2aWEgU2VvdyBUYW4KKyAgIChTb2V3X1RhbkBlbC5uZWMuY29tKSAqLwordm9pZAorZGl2dW4KKygKKyAgdW5zaWduZWQgaW50ICAgICAgIE4sCisgIHVuc2lnbmVkIGxvbmcgaW50ICBhbHMsCisgIHVuc2lnbmVkIGxvbmcgaW50ICBzZmksCisgIHVuc2lnbmVkMzIgLyp1bnNpZ25lZCBsb25nIGludCovICogIHF1b3RpZW50X3B0ciwKKyAgdW5zaWduZWQzMiAvKnVuc2lnbmVkIGxvbmcgaW50Ki8gKiAgcmVtYWluZGVyX3B0ciwKKyAgYm9vbGVhbiAqICAgICAgICAgIG92ZXJmbG93X3B0cgorKQoreworICB1bnNpZ25lZCBsb25nICAgYWxkID0gc2ZpID4+IChOIC0gMSk7CisgIHVuc2lnbmVkIGxvbmcgICBhbG8gPSBhbHM7CisgIHVuc2lnbmVkIGludCAgICBRICAgPSAxOworICB1bnNpZ25lZCBpbnQgICAgQzsKKyAgdW5zaWduZWQgaW50ICAgIFMgICA9IDA7CisgIHVuc2lnbmVkIGludCAgICBpOworICB1bnNpZ25lZCBpbnQgICAgUjEgID0gMTsKKyAgdW5zaWduZWQgaW50ICAgIERCWiA9IChhbHMgPT0gMCkgPyAxIDogMDsKKyAgdW5zaWduZWQgbG9uZyAgIGFsdCA9IFEgPyB+YWxzIDogYWxzOworCisgIC8qIDFzdCBMb29wICovCisgIGFsbyA9IGFsZCArIGFsdCArIFE7CisgIEMgICA9ICgoKGFsdCA+PiAzMSkgJiAoYWxkID4+IDMxKSkKKwkgfCAoKChhbHQgPj4gMzEpIF4gKGFsZCA+PiAzMSkpICYgKH5hbG8gPj4gMzEpKSk7CisgIEMgICA9IEMgXiBROworICBRICAgPSB+KEMgXiBTKSAmIDE7CisgIFIxICA9IChhbG8gPT0gMCkgPyAwIDogKFIxICYgUSk7CisgIGlmICgoUyBeIChhbG8+PjMxKSkgJiYgIUMpCisgICAgeworICAgICAgREJaID0gMTsKKyAgICB9CisgIFMgICA9IGFsbyA+PiAzMTsKKyAgc2ZpID0gKHNmaSA8PCAoMzItTisxKSkgfCBROworICBhbGQgPSAoYWxvIDw8IDEpIHwgKHNmaSA+PiAzMSk7CisKKyAgLyogMm5kIC0gTi0xdGggTG9vcCAqLworICBmb3IgKGkgPSAyOyBpIDwgTjsgaSsrKQorICAgIHsKKyAgICAgIGFsdCA9IFEgPyB+YWxzIDogYWxzOworICAgICAgYWxvID0gYWxkICsgYWx0ICsgUTsKKyAgICAgIEMgICA9ICgoKGFsdCA+PiAzMSkgJiAoYWxkID4+IDMxKSkKKwkgICAgIHwgKCgoYWx0ID4+IDMxKSBeIChhbGQgPj4gMzEpKSAmICh+YWxvID4+IDMxKSkpOworICAgICAgQyAgID0gQyBeIFE7CisgICAgICBRICAgPSB+KEMgXiBTKSAmIDE7CisgICAgICBSMSAgPSAoYWxvID09IDApID8gMCA6IChSMSAmIFEpOworICAgICAgaWYgKChTIF4gKGFsbz4+MzEpKSAmJiAhQyAmJiAhREJaKQorCXsKKwkgIERCWiA9IDE7CisJfQorICAgICAgUyAgID0gYWxvID4+IDMxOworICAgICAgc2ZpID0gKHNmaSA8PCAxKSB8IFE7CisgICAgICBhbGQgPSAoYWxvIDw8IDEpIHwgKHNmaSA+PiAzMSk7CisgICAgfQorICAKKyAgLyogTnRoIExvb3AgKi8KKyAgYWx0ID0gUSA/IH5hbHMgOiBhbHM7CisgIGFsbyA9IGFsZCArIGFsdCArIFE7CisgIEMgICA9ICgoKGFsdCA+PiAzMSkgJiAoYWxkID4+IDMxKSkKKwkgfCAoKChhbHQgPj4gMzEpIF4gKGFsZCA+PiAzMSkpICYgKH5hbG8gPj4gMzEpKSk7CisgIEMgICA9IEMgXiBROworICBRICAgPSB+KEMgXiBTKSAmIDE7CisgIFIxICA9IChhbG8gPT0gMCkgPyAwIDogKFIxICYgUSk7CisgIGlmICgoUyBeIChhbG8+PjMxKSkgJiYgIUMpCisgICAgeworICAgICAgREJaID0gMTsKKyAgICB9CisgIAorICAqIHF1b3RpZW50X3B0ciAgPSAoc2ZpIDw8IDEpIHwgUTsKKyAgKiByZW1haW5kZXJfcHRyID0gUSA/IGFsbyA6IChhbG8gKyBhbHMpOworICAqIG92ZXJmbG93X3B0ciAgPSBEQlogfCBSMTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjb3VydGVzeSBvZiBTdWdpbW90byBhdCBORUMsIHZpYSBTZW93IFRhbiAoU29ld19UYW5AZWwubmVjLmNvbSkgKi8KK3ZvaWQKK2Rpdm4KKygKKyAgdW5zaWduZWQgaW50ICAgICAgIE4sCisgIHVuc2lnbmVkIGxvbmcgaW50ICBhbHMsCisgIHVuc2lnbmVkIGxvbmcgaW50ICBzZmksCisgIHNpZ25lZDMyIC8qc2lnbmVkIGxvbmcgaW50Ki8gKiAgcXVvdGllbnRfcHRyLAorICBzaWduZWQzMiAvKnNpZ25lZCBsb25nIGludCovICogIHJlbWFpbmRlcl9wdHIsCisgIGJvb2xlYW4gKiAgICAgICAgICBvdmVyZmxvd19wdHIKKykKK3sKKyAgdW5zaWduZWQgbG9uZwkgIGFsZCA9IChzaWduZWQgbG9uZykgc2ZpID4+IChOIC0gMSk7CisgIHVuc2lnbmVkIGxvbmcgICBhbG8gPSBhbHM7CisgIHVuc2lnbmVkIGludCAgICBTUyAgPSBhbHMgPj4gMzE7CisgIHVuc2lnbmVkIGludAkgIFNEICA9IHNmaSA+PiAzMTsKKyAgdW5zaWduZWQgaW50ICAgIFIxICA9IDE7CisgIHVuc2lnbmVkIGludCAgICBPVjsKKyAgdW5zaWduZWQgaW50ICAgIERCWiA9IGFscyA9PSAwID8gMSA6IDA7CisgIHVuc2lnbmVkIGludCAgICBRICAgPSB+KFNTIF4gU0QpICYgMTsKKyAgdW5zaWduZWQgaW50ICAgIEM7CisgIHVuc2lnbmVkIGludCAgICBTOworICB1bnNpZ25lZCBpbnQgICAgaTsKKyAgdW5zaWduZWQgbG9uZyAgIGFsdCA9IFEgPyB+YWxzIDogYWxzOworCisKKyAgLyogMXN0IExvb3AgKi8KKyAgCisgIGFsbyA9IGFsZCArIGFsdCArIFE7CisgIEMgICA9ICgoKGFsdCA+PiAzMSkgJiAoYWxkID4+IDMxKSkKKwkgfCAoKChhbHQgPj4gMzEpIF4gKGFsZCA+PiAzMSkpICYgKH5hbG8gPj4gMzEpKSk7CisgIFEgICA9IEMgXiBTUzsKKyAgUjEgID0gKGFsbyA9PSAwKSA/IDAgOiAoUjEgJiAoUSBeIChTUyBeIFNEKSkpOworICBTICAgPSBhbG8gPj4gMzE7CisgIHNmaSA9IChzZmkgPDwgKDMyLU4rMSkpIHwgUTsKKyAgYWxkID0gKGFsbyA8PCAxKSB8IChzZmkgPj4gMzEpOworICBpZiAoKGFsbyA+PiAzMSkgXiAoYWxkID4+IDMxKSkKKyAgICB7CisgICAgICBEQlogPSAxOworICAgIH0KKworICAvKiAybmQgLSBOLTF0aCBMb29wICovCisgIAorICBmb3IgKGkgPSAyOyBpIDwgTjsgaSsrKQorICAgIHsKKyAgICAgIGFsdCA9IFEgPyB+YWxzIDogYWxzOworICAgICAgYWxvID0gYWxkICsgYWx0ICsgUTsKKyAgICAgIEMgICA9ICgoKGFsdCA+PiAzMSkgJiAoYWxkID4+IDMxKSkKKwkgICAgIHwgKCgoYWx0ID4+IDMxKSBeIChhbGQgPj4gMzEpKSAmICh+YWxvID4+IDMxKSkpOworICAgICAgUSAgID0gQyBeIFNTOworICAgICAgUjEgID0gKGFsbyA9PSAwKSA/IDAgOiAoUjEgJiAoUSBeIChTUyBeIFNEKSkpOworICAgICAgUyAgID0gYWxvID4+IDMxOworICAgICAgc2ZpID0gKHNmaSA8PCAxKSB8IFE7CisgICAgICBhbGQgPSAoYWxvIDw8IDEpIHwgKHNmaSA+PiAzMSk7CisgICAgICBpZiAoKGFsbyA+PiAzMSkgXiAoYWxkID4+IDMxKSkKKwl7CisJICBEQlogPSAxOworCX0KKyAgICB9CisKKyAgLyogTnRoIExvb3AgKi8KKyAgYWx0ID0gUSA/IH5hbHMgOiBhbHM7CisgIGFsbyA9IGFsZCArIGFsdCArIFE7CisgIEMgICA9ICgoKGFsdCA+PiAzMSkgJiAoYWxkID4+IDMxKSkKKwkgfCAoKChhbHQgPj4gMzEpIF4gKGFsZCA+PiAzMSkpICYgKH5hbG8gPj4gMzEpKSk7CisgIFEgICA9IEMgXiBTUzsKKyAgUjEgID0gKGFsbyA9PSAwKSA/IDAgOiAoUjEgJiAoUSBeIChTUyBeIFNEKSkpOworICBzZmkgPSAoc2ZpIDw8ICgzMi1OKzEpKTsKKyAgYWxkID0gYWxvOworCisgIC8qIEVuZCAqLworICBpZiAoYWxvICE9IDApCisgICAgeworICAgICAgYWx0ID0gUSA/IH5hbHMgOiBhbHM7CisgICAgICBhbG8gPSBhbGQgKyBhbHQgKyBROworICAgIH0KKyAgUjEgID0gUjEgJiAoKH5hbG8gPj4gMzEpIF4gU0QpOworICBpZiAoKGFsbyAhPSAwKSAmJiAoKFEgXiAoU1MgXiBTRCkpIF4gUjEpKSBhbG8gPSBhbGQ7CisgIGlmIChOICE9IDMyKQorICAgIGFsZCA9IHNmaSA9IChsb25nKSAoKHNmaSA+PiAxKSB8IChTUyBeIFNEKSA8PCAzMSkgPj4gKDMyLU4tMSkgfCBROworICBlbHNlCisgICAgYWxkID0gc2ZpID0gc2ZpIHwgUTsKKyAgCisgIE9WID0gREJaIHwgKChhbG8gPT0gMCkgPyAwIDogUjEpOworICAKKyAgKiByZW1haW5kZXJfcHRyID0gYWxvOworCisgIC8qIEFkaiAqLworICBpZiAoKChhbG8gIT0gMCkgJiYgKChTUyBeIFNEKSBeIFIxKSkKKyAgICAgIHx8ICgoYWxvID09IDApICYmIChTUyBeIFIxKSkpCisgICAgYWxvID0gYWxkICsgMTsKKyAgZWxzZQorICAgIGFsbyA9IGFsZDsKKyAgCisgIE9WICA9IChEQlogfCBSMSkgPyBPViA6ICgoYWxvID4+IDMxKSAmICh+YWxkID4+IDMxKSk7CisKKyAgKiBxdW90aWVudF9wdHIgID0gYWxvOworICAqIG92ZXJmbG93X3B0ciAgPSBPVjsKK30KKworLyogc2RpdnVuIGltbTUsIHJlZzEsIHJlZzIsIHJlZzMgKi8KK2ludAorT1BfMUMyMDdFMCAodm9pZCkKK3sKKyAgdW5zaWduZWQzMiAvKnVuc2lnbmVkIGxvbmcgaW50Ki8gIHF1b3RpZW50OworICB1bnNpZ25lZDMyIC8qdW5zaWduZWQgbG9uZyBpbnQqLyAgcmVtYWluZGVyOworICB1bnNpZ25lZCBsb25nIGludCAgZGl2aWRlX2J5OworICB1bnNpZ25lZCBsb25nIGludCAgZGl2aWRlX3RoaXM7CisgIGJvb2xlYW4gICAgICAgICAgICBvdmVyZmxvdyA9IGZhbHNlOworICB1bnNpZ25lZCBpbnQgICAgICAgaW1tNTsKKyAgICAgIAorICB0cmFjZV9pbnB1dCAoInNkaXZ1biIsIE9QX0lNTV9SRUdfUkVHX1JFRywgMCk7CisKKyAgaW1tNSA9IDMyIC0gKChPUFszXSAmIDB4M2MwMDAwKSA+PiAxNyk7CisKKyAgZGl2aWRlX2J5ICAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOworICBkaXZpZGVfdGhpcyA9IFN0YXRlLnJlZ3NbIE9QWzFdIF0gPDwgaW1tNTsKKworICBkaXZ1biAoaW1tNSwgZGl2aWRlX2J5LCBkaXZpZGVfdGhpcywgJiBxdW90aWVudCwgJiByZW1haW5kZXIsICYgb3ZlcmZsb3cpOworICAKKyAgU3RhdGUucmVnc1sgT1BbMV0gICAgICAgXSA9IHF1b3RpZW50OworICBTdGF0ZS5yZWdzWyBPUFsyXSA+PiAxMSBdID0gcmVtYWluZGVyOworICAKKyAgLyogU2V0IGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfT1YpOworICAKKyAgaWYgKG92ZXJmbG93KSAgICAgIFBTVyB8PSBQU1dfT1Y7CisgIGlmIChxdW90aWVudCA9PSAwKSBQU1cgfD0gUFNXX1o7CisgIGlmIChxdW90aWVudCAmIDB4ODAwMDAwMDApIFBTVyB8PSBQU1dfUzsKKyAgCisgIHRyYWNlX291dHB1dCAoT1BfSU1NX1JFR19SRUdfUkVHKTsKKworICByZXR1cm4gNDsKK30KKworLyogc2Rpdm4gaW1tNSwgcmVnMSwgcmVnMiwgcmVnMyAqLworaW50CitPUF8xQzAwN0UwICh2b2lkKQoreworICBzaWduZWQzMiAvKnNpZ25lZCBsb25nIGludCovICBxdW90aWVudDsKKyAgc2lnbmVkMzIgLypzaWduZWQgbG9uZyBpbnQqLyAgcmVtYWluZGVyOworICBzaWduZWQgbG9uZyBpbnQgIGRpdmlkZV9ieTsKKyAgc2lnbmVkIGxvbmcgaW50ICBkaXZpZGVfdGhpczsKKyAgYm9vbGVhbiAgICAgICAgICBvdmVyZmxvdyA9IGZhbHNlOworICB1bnNpZ25lZCBpbnQgICAgIGltbTU7CisgICAgICAKKyAgdHJhY2VfaW5wdXQgKCJzZGl2biIsIE9QX0lNTV9SRUdfUkVHX1JFRywgMCk7CisKKyAgaW1tNSA9IDMyIC0gKChPUFszXSAmIDB4M2MwMDAwKSA+PiAxNyk7CisKKyAgZGl2aWRlX2J5ICAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOworICBkaXZpZGVfdGhpcyA9IFN0YXRlLnJlZ3NbIE9QWzFdIF0gPDwgaW1tNTsKKworICBkaXZuIChpbW01LCBkaXZpZGVfYnksIGRpdmlkZV90aGlzLCAmIHF1b3RpZW50LCAmIHJlbWFpbmRlciwgJiBvdmVyZmxvdyk7CisgIAorICBTdGF0ZS5yZWdzWyBPUFsxXSAgICAgICBdID0gcXVvdGllbnQ7CisgIFN0YXRlLnJlZ3NbIE9QWzJdID4+IDExIF0gPSByZW1haW5kZXI7CisgIAorICAvKiBTZXQgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PVik7CisgIAorICBpZiAob3ZlcmZsb3cpICAgICAgUFNXIHw9IFBTV19PVjsKKyAgaWYgKHF1b3RpZW50ID09IDApIFBTVyB8PSBQU1dfWjsKKyAgaWYgKHF1b3RpZW50IDwgIDApIFBTVyB8PSBQU1dfUzsKKyAgCisgIHRyYWNlX291dHB1dCAoT1BfSU1NX1JFR19SRUdfUkVHKTsKKworICByZXR1cm4gNDsKK30KKworLyogc2Rpdmh1biBpbW01LCByZWcxLCByZWcyLCByZWczICovCitpbnQKK09QXzE4MjA3RTAgKHZvaWQpCit7CisgIHVuc2lnbmVkMzIgLyp1bnNpZ25lZCBsb25nIGludCovICBxdW90aWVudDsKKyAgdW5zaWduZWQzMiAvKnVuc2lnbmVkIGxvbmcgaW50Ki8gIHJlbWFpbmRlcjsKKyAgdW5zaWduZWQgbG9uZyBpbnQgIGRpdmlkZV9ieTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgIGRpdmlkZV90aGlzOworICBib29sZWFuICAgICAgICAgICAgb3ZlcmZsb3cgPSBmYWxzZTsKKyAgdW5zaWduZWQgaW50ICAgICAgIGltbTU7CisgICAgICAKKyAgdHJhY2VfaW5wdXQgKCJzZGl2aHVuIiwgT1BfSU1NX1JFR19SRUdfUkVHLCAwKTsKKworICBpbW01ID0gMzIgLSAoKE9QWzNdICYgMHgzYzAwMDApID4+IDE3KTsKKworICBkaXZpZGVfYnkgICA9IFN0YXRlLnJlZ3NbIE9QWzBdIF0gJiAweGZmZmY7CisgIGRpdmlkZV90aGlzID0gU3RhdGUucmVnc1sgT1BbMV0gXSA8PCBpbW01OworCisgIGRpdnVuIChpbW01LCBkaXZpZGVfYnksIGRpdmlkZV90aGlzLCAmIHF1b3RpZW50LCAmIHJlbWFpbmRlciwgJiBvdmVyZmxvdyk7CisgIAorICBTdGF0ZS5yZWdzWyBPUFsxXSAgICAgICBdID0gcXVvdGllbnQ7CisgIFN0YXRlLnJlZ3NbIE9QWzJdID4+IDExIF0gPSByZW1haW5kZXI7CisgIAorICAvKiBTZXQgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PVik7CisgIAorICBpZiAob3ZlcmZsb3cpICAgICAgUFNXIHw9IFBTV19PVjsKKyAgaWYgKHF1b3RpZW50ID09IDApIFBTVyB8PSBQU1dfWjsKKyAgaWYgKHF1b3RpZW50ICYgMHg4MDAwMDAwMCkgUFNXIHw9IFBTV19TOworICAKKyAgdHJhY2Vfb3V0cHV0IChPUF9JTU1fUkVHX1JFR19SRUcpOworCisgIHJldHVybiA0OworfQorCisvKiBzZGl2aG4gaW1tNSwgcmVnMSwgcmVnMiwgcmVnMyAqLworaW50CitPUF8xODAwN0UwICh2b2lkKQoreworICBzaWduZWQzMiAvKnNpZ25lZCBsb25nIGludCovICBxdW90aWVudDsKKyAgc2lnbmVkMzIgLypzaWduZWQgbG9uZyBpbnQqLyAgcmVtYWluZGVyOworICBzaWduZWQgbG9uZyBpbnQgIGRpdmlkZV9ieTsKKyAgc2lnbmVkIGxvbmcgaW50ICBkaXZpZGVfdGhpczsKKyAgYm9vbGVhbiAgICAgICAgICBvdmVyZmxvdyA9IGZhbHNlOworICB1bnNpZ25lZCBpbnQgICAgIGltbTU7CisgICAgICAKKyAgdHJhY2VfaW5wdXQgKCJzZGl2aG4iLCBPUF9JTU1fUkVHX1JFR19SRUcsIDApOworCisgIGltbTUgPSAzMiAtICgoT1BbM10gJiAweDNjMDAwMCkgPj4gMTcpOworCisgIGRpdmlkZV9ieSAgID0gRVhURU5EMTYgKFN0YXRlLnJlZ3NbIE9QWzBdIF0pOworICBkaXZpZGVfdGhpcyA9IFN0YXRlLnJlZ3NbIE9QWzFdIF0gPDwgaW1tNTsKKworICBkaXZuIChpbW01LCBkaXZpZGVfYnksIGRpdmlkZV90aGlzLCAmIHF1b3RpZW50LCAmIHJlbWFpbmRlciwgJiBvdmVyZmxvdyk7CisgIAorICBTdGF0ZS5yZWdzWyBPUFsxXSAgICAgICBdID0gcXVvdGllbnQ7CisgIFN0YXRlLnJlZ3NbIE9QWzJdID4+IDExIF0gPSByZW1haW5kZXI7CisgIAorICAvKiBTZXQgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PVik7CisgIAorICBpZiAob3ZlcmZsb3cpICAgICAgUFNXIHw9IFBTV19PVjsKKyAgaWYgKHF1b3RpZW50ID09IDApIFBTVyB8PSBQU1dfWjsKKyAgaWYgKHF1b3RpZW50IDwgIDApIFBTVyB8PSBQU1dfUzsKKyAgCisgIHRyYWNlX291dHB1dCAoT1BfSU1NX1JFR19SRUdfUkVHKTsKKworICByZXR1cm4gNDsKK30KKworLyogZGl2dSAgcmVnMSwgcmVnMiwgcmVnMyAqLworaW50CitPUF8yQzIwN0UwICh2b2lkKQoreworICB1bnNpZ25lZCBsb25nIGludCBxdW90aWVudDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgcmVtYWluZGVyOworICB1bnNpZ25lZCBsb25nIGludCBkaXZpZGVfYnk7CisgIHVuc2lnbmVkIGxvbmcgaW50IGRpdmlkZV90aGlzOworICBib29sZWFuICAgICAgICAgICBvdmVyZmxvdyA9IGZhbHNlOworICAKKyAgdHJhY2VfaW5wdXQgKCJkaXZ1IiwgT1BfUkVHX1JFR19SRUcsIDApOworICAKKyAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KKyAgCisgIGRpdmlkZV9ieSAgID0gU3RhdGUucmVnc1sgT1BbMF0gXTsKKyAgZGl2aWRlX3RoaXMgPSBTdGF0ZS5yZWdzWyBPUFsxXSBdOworICAKKyAgaWYgKGRpdmlkZV9ieSA9PSAwKQorICAgIHsKKyAgICAgIG92ZXJmbG93ID0gdHJ1ZTsKKyAgICAgIGRpdmlkZV9ieSAgPSAxOworICAgIH0KKyAgCisgIFN0YXRlLnJlZ3NbIE9QWzFdICAgICAgIF0gPSBxdW90aWVudCAgPSBkaXZpZGVfdGhpcyAvIGRpdmlkZV9ieTsKKyAgU3RhdGUucmVnc1sgT1BbMl0gPj4gMTEgXSA9IHJlbWFpbmRlciA9IGRpdmlkZV90aGlzICUgZGl2aWRlX2J5OworICAKKyAgLyogU2V0IGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfT1YpOworICAKKyAgaWYgKG92ZXJmbG93KSAgICAgIFBTVyB8PSBQU1dfT1Y7CisgIGlmIChxdW90aWVudCA9PSAwKSBQU1cgfD0gUFNXX1o7CisgIGlmIChxdW90aWVudCAmIDB4ODAwMDAwMDApIFBTVyB8PSBQU1dfUzsKKyAgCisgIHRyYWNlX291dHB1dCAoT1BfUkVHX1JFR19SRUcpOworCisgIHJldHVybiA0OworfQorCisvKiBkaXYgIHJlZzEsIHJlZzIsIHJlZzMgKi8KK2ludAorT1BfMkMwMDdFMCAodm9pZCkKK3sKKyAgc2lnbmVkIGxvbmcgaW50IHF1b3RpZW50OworICBzaWduZWQgbG9uZyBpbnQgcmVtYWluZGVyOworICBzaWduZWQgbG9uZyBpbnQgZGl2aWRlX2J5OworICBzaWduZWQgbG9uZyBpbnQgZGl2aWRlX3RoaXM7CisgIGJvb2xlYW4gICAgICAgICBvdmVyZmxvdyA9IGZhbHNlOworICAKKyAgdHJhY2VfaW5wdXQgKCJkaXYiLCBPUF9SRUdfUkVHX1JFRywgMCk7CisgIAorICAvKiBDb21wdXRlIHRoZSByZXN1bHQuICAqLworICAKKyAgZGl2aWRlX2J5ICAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOworICBkaXZpZGVfdGhpcyA9IFN0YXRlLnJlZ3NbIE9QWzFdIF07CisgIAorICBpZiAoZGl2aWRlX2J5ID09IDAgfHwgKGRpdmlkZV9ieSA9PSAtMSAmJiBkaXZpZGVfdGhpcyA9PSAoMSA8PCAzMSkpKQorICAgIHsKKyAgICAgIG92ZXJmbG93ICA9IHRydWU7CisgICAgICBkaXZpZGVfYnkgPSAxOworICAgIH0KKyAgCisgIFN0YXRlLnJlZ3NbIE9QWzFdICAgICAgIF0gPSBxdW90aWVudCAgPSBkaXZpZGVfdGhpcyAvIGRpdmlkZV9ieTsKKyAgU3RhdGUucmVnc1sgT1BbMl0gPj4gMTEgXSA9IHJlbWFpbmRlciA9IGRpdmlkZV90aGlzICUgZGl2aWRlX2J5OworICAKKyAgLyogU2V0IGNvbmRpdGlvbiBjb2Rlcy4gICovCisgIFBTVyAmPSB+KFBTV19aIHwgUFNXX1MgfCBQU1dfT1YpOworICAKKyAgaWYgKG92ZXJmbG93KSAgICAgIFBTVyB8PSBQU1dfT1Y7CisgIGlmIChxdW90aWVudCA9PSAwKSBQU1cgfD0gUFNXX1o7CisgIGlmIChxdW90aWVudCA8ICAwKSBQU1cgfD0gUFNXX1M7CisgIAorICB0cmFjZV9vdXRwdXQgKE9QX1JFR19SRUdfUkVHKTsKKworICByZXR1cm4gNDsKK30KKworLyogZGl2aHUgIHJlZzEsIHJlZzIsIHJlZzMgKi8KK2ludAorT1BfMjgyMDdFMCAodm9pZCkKK3sKKyAgdW5zaWduZWQgbG9uZyBpbnQgcXVvdGllbnQ7CisgIHVuc2lnbmVkIGxvbmcgaW50IHJlbWFpbmRlcjsKKyAgdW5zaWduZWQgbG9uZyBpbnQgZGl2aWRlX2J5OworICB1bnNpZ25lZCBsb25nIGludCBkaXZpZGVfdGhpczsKKyAgYm9vbGVhbiAgICAgICAgICAgb3ZlcmZsb3cgPSBmYWxzZTsKKyAgCisgIHRyYWNlX2lucHV0ICgiZGl2aHUiLCBPUF9SRUdfUkVHX1JFRywgMCk7CisgIAorICAvKiBDb21wdXRlIHRoZSByZXN1bHQuICAqLworICAKKyAgZGl2aWRlX2J5ICAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdICYgMHhmZmZmOworICBkaXZpZGVfdGhpcyA9IFN0YXRlLnJlZ3NbIE9QWzFdIF07CisgIAorICBpZiAoZGl2aWRlX2J5ID09IDApCisgICAgeworICAgICAgb3ZlcmZsb3cgPSB0cnVlOworICAgICAgZGl2aWRlX2J5ICA9IDE7CisgICAgfQorICAKKyAgU3RhdGUucmVnc1sgT1BbMV0gICAgICAgXSA9IHF1b3RpZW50ICA9IGRpdmlkZV90aGlzIC8gZGl2aWRlX2J5OworICBTdGF0ZS5yZWdzWyBPUFsyXSA+PiAxMSBdID0gcmVtYWluZGVyID0gZGl2aWRlX3RoaXMgJSBkaXZpZGVfYnk7CisgIAorICAvKiBTZXQgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PVik7CisgIAorICBpZiAob3ZlcmZsb3cpICAgICAgUFNXIHw9IFBTV19PVjsKKyAgaWYgKHF1b3RpZW50ID09IDApIFBTVyB8PSBQU1dfWjsKKyAgaWYgKHF1b3RpZW50ICYgMHg4MDAwMDAwMCkgUFNXIHw9IFBTV19TOworICAKKyAgdHJhY2Vfb3V0cHV0IChPUF9SRUdfUkVHX1JFRyk7CisKKyAgcmV0dXJuIDQ7Cit9CisKKy8qIGRpdmggIHJlZzEsIHJlZzIsIHJlZzMgKi8KK2ludAorT1BfMjgwMDdFMCAodm9pZCkKK3sKKyAgc2lnbmVkIGxvbmcgaW50IHF1b3RpZW50OworICBzaWduZWQgbG9uZyBpbnQgcmVtYWluZGVyOworICBzaWduZWQgbG9uZyBpbnQgZGl2aWRlX2J5OworICBzaWduZWQgbG9uZyBpbnQgZGl2aWRlX3RoaXM7CisgIGJvb2xlYW4gICAgICAgICBvdmVyZmxvdyA9IGZhbHNlOworICAKKyAgdHJhY2VfaW5wdXQgKCJkaXZoIiwgT1BfUkVHX1JFR19SRUcsIDApOworICAKKyAgLyogQ29tcHV0ZSB0aGUgcmVzdWx0LiAgKi8KKyAgCisgIGRpdmlkZV9ieSAgPSBTdGF0ZS5yZWdzWyBPUFswXSBdOworICBkaXZpZGVfdGhpcyA9IEVYVEVORDE2IChTdGF0ZS5yZWdzWyBPUFsxXSBdKTsKKyAgCisgIGlmIChkaXZpZGVfYnkgPT0gMCB8fCAoZGl2aWRlX2J5ID09IC0xICYmIGRpdmlkZV90aGlzID09ICgxIDw8IDMxKSkpCisgICAgeworICAgICAgb3ZlcmZsb3cgPSB0cnVlOworICAgICAgZGl2aWRlX2J5ICA9IDE7CisgICAgfQorICAKKyAgU3RhdGUucmVnc1sgT1BbMV0gICAgICAgXSA9IHF1b3RpZW50ICA9IGRpdmlkZV90aGlzIC8gZGl2aWRlX2J5OworICBTdGF0ZS5yZWdzWyBPUFsyXSA+PiAxMSBdID0gcmVtYWluZGVyID0gZGl2aWRlX3RoaXMgJSBkaXZpZGVfYnk7CisgIAorICAvKiBTZXQgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PVik7CisgIAorICBpZiAob3ZlcmZsb3cpICAgICAgUFNXIHw9IFBTV19PVjsKKyAgaWYgKHF1b3RpZW50ID09IDApIFBTVyB8PSBQU1dfWjsKKyAgaWYgKHF1b3RpZW50IDwgIDApIFBTVyB8PSBQU1dfUzsKKyAgCisgIHRyYWNlX291dHB1dCAoT1BfUkVHX1JFR19SRUcpOworCisgIHJldHVybiA0OworfQorCisvKiBtdWx1IGltbTksIHJlZzIsIHJlZzMgKi8KK2ludAorT1BfMjQyMDdFMCAodm9pZCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJtdWx1IiwgT1BfSU1NX1JFR19SRUcsIDApOworCisgIE11bHRpcGx5NjQgKGZhbHNlLCAoT1BbM10gJiAweDFmKSB8ICgoT1BbM10gPj4gMTMpICYgMHgxZTApKTsKKworICB0cmFjZV9vdXRwdXQgKE9QX0lNTV9SRUdfUkVHKTsKKworICByZXR1cm4gNDsKK30KKworLyogbXVsIGltbTksIHJlZzIsIHJlZzMgKi8KK2ludAorT1BfMjQwMDdFMCAodm9pZCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJtdWwiLCBPUF9JTU1fUkVHX1JFRywgMCk7CisKKyAgTXVsdGlwbHk2NCAodHJ1ZSwgKE9QWzNdICYgMHgxZikgfCAoKE9QWzNdID4+IDEzKSAmIDB4MWUwKSk7CisKKyAgdHJhY2Vfb3V0cHV0IChPUF9JTU1fUkVHX1JFRyk7CisKKyAgcmV0dXJuIDQ7Cit9CisKKy8qIGxkLmh1ICovCitpbnQKK09QXzEwN0UwICh2b2lkKQoreworICBpbnQgYWRyOworCisgIHRyYWNlX2lucHV0ICgibGQuaHUiLCBPUF9MT0FEMzIsIDIpOworCisgIGFkciA9IFN0YXRlLnJlZ3NbIE9QWzBdIF0gKyBFWFRFTkQxNiAoT1BbMl0gJiB+MSk7CisgIGFkciAmPSB+MHgxOworICAgICAgCisgIFN0YXRlLnJlZ3NbIE9QWzFdIF0gPSBsb2FkX21lbSAoYWRyLCAyKTsKKyAgICAgIAorICB0cmFjZV9vdXRwdXQgKE9QX0xPQUQzMik7CisgIAorICByZXR1cm4gNDsKK30KKworCisvKiBsZC5idSAqLworaW50CitPUF8xMDc4MCAodm9pZCkKK3sKKyAgaW50IGFkcjsKKworICB0cmFjZV9pbnB1dCAoImxkLmJ1IiwgT1BfTE9BRDMyLCAxKTsKKworICBhZHIgPSAoU3RhdGUucmVnc1sgT1BbMF0gXQorCSArIChFWFRFTkQxNiAoT1BbMl0gJiB+MSkgfCAoKE9QWzNdID4+IDUpICYgMSkpKTsKKyAgICAgIAorICBTdGF0ZS5yZWdzWyBPUFsxXSBdID0gbG9hZF9tZW0gKGFkciwgMSk7CisgIAorICB0cmFjZV9vdXRwdXQgKE9QX0xPQUQzMik7CisgIAorICByZXR1cm4gNDsKK30KKworLyogcHJlcGFyZSBsaXN0MTIsIGltbTUsIGltbTMyICovCitpbnQKK09QXzFCMDc4MCAodm9pZCkKK3sKKyAgaW50ICBpOworICAKKyAgdHJhY2VfaW5wdXQgKCJwcmVwYXJlIiwgT1BfUFVTSFBPUDEsIDApOworICAKKyAgLyogU3RvcmUgdGhlIHJlZ2lzdGVycyB3aXRoIGxvd2VyIG51bWJlciByZWdpc3RlcnMgYmVpbmcgcGxhY2VkIGF0IGhpZ2hlciBhZGRyZXNzZXMuICAqLworICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKKyAgICBpZiAoKE9QWzNdICYgKDEgPDwgdHlwZTFfcmVnc1sgaSBdKSkpCisgICAgICB7CisJU1AgLT0gNDsKKwlzdG9yZV9tZW0gKFNQLCA0LCBTdGF0ZS5yZWdzWyAyMCArIGkgXSk7CisgICAgICB9CisgIAorICBTUCAtPSAoT1BbM10gJiAweDNlKSA8PCAxOworCisgIEVQID0gbG9hZF9tZW0gKFBDICsgNCwgNCk7CisgIAorICB0cmFjZV9vdXRwdXQgKE9QX1BVU0hQT1AxKTsKKworICByZXR1cm4gODsKK30KKworLyogcHJlcGFyZSBsaXN0MTIsIGltbTUsIGltbTE2LTMyICovCitpbnQKK09QXzEzMDc4MCAodm9pZCkKK3sKKyAgaW50ICBpOworICAKKyAgdHJhY2VfaW5wdXQgKCJwcmVwYXJlIiwgT1BfUFVTSFBPUDEsIDApOworICAKKyAgLyogU3RvcmUgdGhlIHJlZ2lzdGVycyB3aXRoIGxvd2VyIG51bWJlciByZWdpc3RlcnMgYmVpbmcgcGxhY2VkIGF0IGhpZ2hlciBhZGRyZXNzZXMuICAqLworICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKKyAgICBpZiAoKE9QWzNdICYgKDEgPDwgdHlwZTFfcmVnc1sgaSBdKSkpCisgICAgICB7CisJU1AgLT0gNDsKKwlzdG9yZV9tZW0gKFNQLCA0LCBTdGF0ZS5yZWdzWyAyMCArIGkgXSk7CisgICAgICB9CisgIAorICBTUCAtPSAoT1BbM10gJiAweDNlKSA8PCAxOworCisgIEVQID0gbG9hZF9tZW0gKFBDICsgNCwgMikgPDwgMTY7CisgIAorICB0cmFjZV9vdXRwdXQgKE9QX1BVU0hQT1AxKTsKKworICByZXR1cm4gNjsKK30KKworLyogcHJlcGFyZSBsaXN0MTIsIGltbTUsIGltbTE2ICovCitpbnQKK09QX0IwNzgwICh2b2lkKQoreworICBpbnQgIGk7CisgIAorICB0cmFjZV9pbnB1dCAoInByZXBhcmUiLCBPUF9QVVNIUE9QMSwgMCk7CisgIAorICAvKiBTdG9yZSB0aGUgcmVnaXN0ZXJzIHdpdGggbG93ZXIgbnVtYmVyIHJlZ2lzdGVycyBiZWluZyBwbGFjZWQgYXQgaGlnaGVyIGFkZHJlc3Nlcy4gICovCisgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKQorICAgIGlmICgoT1BbM10gJiAoMSA8PCB0eXBlMV9yZWdzWyBpIF0pKSkKKyAgICAgIHsKKwlTUCAtPSA0OworCXN0b3JlX21lbSAoU1AsIDQsIFN0YXRlLnJlZ3NbIDIwICsgaSBdKTsKKyAgICAgIH0KKyAgCisgIFNQIC09IChPUFszXSAmIDB4M2UpIDw8IDE7CisKKyAgRVAgPSBFWFRFTkQxNiAobG9hZF9tZW0gKFBDICsgNCwgMikpOworICAKKyAgdHJhY2Vfb3V0cHV0IChPUF9QVVNIUE9QMSk7CisKKyAgcmV0dXJuIDY7Cit9CisKKy8qIHByZXBhcmUgbGlzdDEyLCBpbW01LCBzcCAqLworaW50CitPUF8zMDc4MCAodm9pZCkKK3sKKyAgaW50ICBpOworICAKKyAgdHJhY2VfaW5wdXQgKCJwcmVwYXJlIiwgT1BfUFVTSFBPUDEsIDApOworICAKKyAgLyogU3RvcmUgdGhlIHJlZ2lzdGVycyB3aXRoIGxvd2VyIG51bWJlciByZWdpc3RlcnMgYmVpbmcgcGxhY2VkIGF0IGhpZ2hlciBhZGRyZXNzZXMuICAqLworICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKKyAgICBpZiAoKE9QWzNdICYgKDEgPDwgdHlwZTFfcmVnc1sgaSBdKSkpCisgICAgICB7CisJU1AgLT0gNDsKKwlzdG9yZV9tZW0gKFNQLCA0LCBTdGF0ZS5yZWdzWyAyMCArIGkgXSk7CisgICAgICB9CisgIAorICBTUCAtPSAoT1BbM10gJiAweDNlKSA8PCAxOworCisgIEVQID0gU1A7CisgIAorICB0cmFjZV9vdXRwdXQgKE9QX1BVU0hQT1AxKTsKKworICByZXR1cm4gNDsKK30KKworLyogbXVsIHJlZzEsIHJlZzIsIHJlZzMgKi8KK2ludAorT1BfMjIwMDdFMCAodm9pZCkKK3sKKyAgdHJhY2VfaW5wdXQgKCJtdWwiLCBPUF9SRUdfUkVHX1JFRywgMCk7CisKKyAgTXVsdGlwbHk2NCAodHJ1ZSwgU3RhdGUucmVnc1sgT1BbMF0gXSk7CisKKyAgdHJhY2Vfb3V0cHV0IChPUF9SRUdfUkVHX1JFRyk7CisKKyAgcmV0dXJuIDQ7Cit9CisKKy8qIHBvcG1oIGxpc3QxOCAqLworaW50CitPUF8zMDdGMCAodm9pZCkKK3sKKyAgaW50IGk7CisgIAorICB0cmFjZV9pbnB1dCAoInBvcG1oIiwgT1BfUFVTSFBPUDIsIDApOworICAKKyAgaWYgKE9QWzNdICYgKDEgPDwgMTkpKQorICAgIHsKKyAgICAgIGlmICgoUFNXICYgUFNXX05QKSAmJiAoKFBTVyAmIFBTV19FUCkgPT0gMCkpCisJeworCSAgRkVQU1cgPSBsb2FkX21lbSAoIFNQICAgICAgJiB+IDMsIDQpOworCSAgRkVQQyAgPSBsb2FkX21lbSAoKFNQICsgNCkgJiB+IDMsIDQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBFSVBTVyA9IGxvYWRfbWVtICggU1AgICAgICAmIH4gMywgNCk7CisJICBFSVBDICA9IGxvYWRfbWVtICgoU1AgKyA0KSAmIH4gMywgNCk7CisJfQorICAgICAgCisgICAgICBTUCArPSA4OworICAgIH0KKyAgCisgIC8qIExvYWQgdGhlIHJlZ2lzdGVycyB3aXRoIGxvd2VyIG51bWJlciByZWdpc3RlcnMgYmVpbmcgcmV0cmlldmVkIGZyb20gaGlnaGVyIGFkZHJlc3Nlcy4gICovCisgIGZvciAoaSA9IDE2OyBpLS07KQorICAgIGlmICgoT1BbM10gJiAoMSA8PCB0eXBlMl9yZWdzWyBpIF0pKSkKKyAgICAgIHsKKwlTdGF0ZS5yZWdzWyBpICsgMTYgXSA9IGxvYWRfbWVtIChTUCAmIH4gMywgNCk7CisJU1AgKz0gNDsKKyAgICAgIH0KKyAgCisgIHRyYWNlX291dHB1dCAoT1BfUFVTSFBPUDIpOworCisgIHJldHVybiA0OworfQorCisvKiBwb3BtbCBsc2l0MTggKi8KK2ludAorT1BfMTA3RjAgKHZvaWQpCit7CisgIGludCBpOworCisgIHRyYWNlX2lucHV0ICgicG9wbWwiLCBPUF9QVVNIUE9QMywgMCk7CisKKyAgaWYgKE9QWzNdICYgKDEgPDwgMTkpKQorICAgIHsKKyAgICAgIGlmICgoUFNXICYgUFNXX05QKSAmJiAoKFBTVyAmIFBTV19FUCkgPT0gMCkpCisJeworCSAgRkVQU1cgPSBsb2FkX21lbSAoIFNQICAgICAgJiB+IDMsIDQpOworCSAgRkVQQyA9ICBsb2FkX21lbSAoKFNQICsgNCkgJiB+IDMsIDQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBFSVBTVyA9IGxvYWRfbWVtICggU1AgICAgICAmIH4gMywgNCk7CisJICBFSVBDICA9IGxvYWRfbWVtICgoU1AgKyA0KSAmIH4gMywgNCk7CisJfQorICAgICAgCisgICAgICBTUCArPSA4OworICAgIH0KKyAgCisgIGlmIChPUFszXSAmICgxIDw8IDMpKQorICAgIHsKKyAgICAgIFBTVyA9IGxvYWRfbWVtIChTUCAmIH4gMywgNCk7CisgICAgICBTUCArPSA0OworICAgIH0KKyAgCisgIC8qIExvYWQgdGhlIHJlZ2lzdGVycyB3aXRoIGxvd2VyIG51bWJlciByZWdpc3RlcnMgYmVpbmcgcmV0cmlldmVkIGZyb20gaGlnaGVyIGFkZHJlc3Nlcy4gICovCisgIGZvciAoaSA9IDE1OyBpLS07KQorICAgIGlmICgoT1BbM10gJiAoMSA8PCB0eXBlM19yZWdzWyBpIF0pKSkKKyAgICAgIHsKKwlTdGF0ZS5yZWdzWyBpICsgMSBdID0gbG9hZF9tZW0gKFNQICYgfiAzLCA0KTsKKwlTUCArPSA0OworICAgICAgfQorICAKKyAgdHJhY2Vfb3V0cHV0IChPUF9QVVNIUE9QMik7CisKKyAgcmV0dXJuIDQ7Cit9CisKKy8qIHB1c2htaCBsaXN0MTggKi8KK2ludAorT1BfMzA3RTAgKHZvaWQpCit7CisgIGludCBpOworCisgIHRyYWNlX2lucHV0ICgicHVzaG1oIiwgT1BfUFVTSFBPUDIsIDApOworICAKKyAgLyogU3RvcmUgdGhlIHJlZ2lzdGVycyB3aXRoIGxvd2VyIG51bWJlciByZWdpc3RlcnMgYmVpbmcgcGxhY2VkIGF0IGhpZ2hlciBhZGRyZXNzZXMuICAqLworICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICBpZiAoKE9QWzNdICYgKDEgPDwgdHlwZTJfcmVnc1sgaSBdKSkpCisgICAgICB7CisJU1AgLT0gNDsKKwlzdG9yZV9tZW0gKFNQICYgfiAzLCA0LCBTdGF0ZS5yZWdzWyBpICsgMTYgXSk7CisgICAgICB9CisgIAorICBpZiAoT1BbM10gJiAoMSA8PCAxOSkpCisgICAgeworICAgICAgU1AgLT0gODsKKyAgICAgIAorICAgICAgaWYgKChQU1cgJiBQU1dfTlApICYmICgoUFNXICYgUFNXX0VQKSA9PSAwKSkKKwl7CisJICBzdG9yZV9tZW0gKChTUCArIDQpICYgfiAzLCA0LCBGRVBDKTsKKwkgIHN0b3JlX21lbSAoIFNQICAgICAgJiB+IDMsIDQsIEZFUFNXKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3RvcmVfbWVtICgoU1AgKyA0KSAmIH4gMywgNCwgRUlQQyk7CisJICBzdG9yZV9tZW0gKCBTUCAgICAgICYgfiAzLCA0LCBFSVBTVyk7CisJfQorICAgIH0KKyAgCisgIHRyYWNlX291dHB1dCAoT1BfUFVTSFBPUDIpOworCisgIHJldHVybiA0OworfQorCmRpZmYgLS1naXQgYS9zaW0vdjg1MC92ODUwLWRjIGIvc2ltL3Y4NTAvdjg1MC1kYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTdhMzc1Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3Y4NTAvdjg1MC1kYwpAQCAtMCwwICsxLDMwIEBACisjIG1vc3QgaW5zdHJ1Y3Rpb25zCisjIC0tLS0tLSBvcHRpb25zIC0tLS0tLSA6IEZzdCA6IExzdCA6IGZmIDogZmwgOiBmZSA6IHdvcmQgOiAtLS0gZm10IC0tLSA6IG1vZGVsIC4uLgorIyB7IDogbWFzayA6IHZhbHVlIDogd29yZCB9CisKKyMgVG9wIGxldmVsIC0gY3JlYXRlIGEgdmVyeSBiaWcgc3dpdGNoIHN0YXRlbWVudC4KKworICBwYWRkZWQtc3dpdGNoLGNvbWJpbmUgOiAgMTUgOiAgIDUgOiAgICA6ICAgIDogICAgOiAgICAwIDogICAgICAgICAgICAgOgorCisKKyMgZm9yIG9wY29kZSA2MCwxMjQKKworICBzd2l0Y2gsY29tYmluZSAgICAgICAgOiAgIDQgOiAgIDAgOiAgICA6ICAgIDogICAgOiAgICAxIDogVixWSUkgICAgICAgOgorICBzd2l0Y2gsY29tYmluZSAgICAgICAgOiAgIDQgOiAgIDAgOiAgICA6ICAgIDogICAgOiAgICAxIDogVixYSUlJICAgICAgOiB2ODUwZQorICBzd2l0Y2gsY29tYmluZSAgICAgICAgOiAgIDQgOiAgIDAgOiAgICA6ICAgIDogICAgOiAgICAxIDogVixYSUlJICAgICAgOiB2ODUwZWEKKworCisjIGZvciBvcGNvZGUgNjMsIDEyNywgMTA4NyBldC5hbC4KKworICBzd2l0Y2gsY29tYmluZSAgICAgICAgOiAgIDkgOiAgIDUgOiAgICA6ICAgIDogICAgOiAgICAxIDogICAgICAgICAgICAgOgorICBzd2l0Y2gsY29tYmluZSAgICAgICAgOiAgIDQgOiAgIDAgOiAgICA6ICAgIDogICAgOiAgICAxIDogICAgICAgICAgICAgOgorCisKKyMgZm9yIG9wY29kZSA0MCBldC5hbC4KKworICBzd2l0Y2gsY29tYmluZSAgICAgICAgOiAgIDQgOiAgIDAgOiAgICA6ICAgIDogICAgOiAgICAwIDogSUlJLElWICAgICAgOgorICBzd2l0Y2gsY29tYmluZSAgICAgICAgOiAgIDQgOiAgIDAgOiAgICA6ICAgIDogICAgOiAgICAwIDogSUlJLElWLFhJViAgOiB2ODUwZWEKKworIyBmb3Igb3Bjb2RlIDY2IC0gZGl2aC9icmVhaworCisgIHN3aXRjaCxjb21iaW5lICAgICAgICA6ICAgNCA6ICAgMCA6ICAgIDogICAgOiAgICA6ICAgIDAgOiBJICAgICAgICAgICA6CmRpZmYgLS1naXQgYS9zaW0vdjg1MC92ODUwLmlnZW4gYi9zaW0vdjg1MC92ODUwLmlnZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0YjBiZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS92ODUwL3Y4NTAuaWdlbgpAQCAtMCwwICsxLDE0MDcgQEAKKzpvcHRpb246OjppbnNuLWJpdC1zaXplOjE2Cis6b3B0aW9uOjo6aGktYml0LW5yOjE1CisKKworOm9wdGlvbjo6OmZvcm1hdC1uYW1lczpJLElJLElJSSxJVixWLFZJLFZJSSxWSUlJLElYLFgKKzpvcHRpb246Ojpmb3JtYXQtbmFtZXM6WEksWElJLFhJSUkKKzpvcHRpb246Ojpmb3JtYXQtbmFtZXM6WElWLFhWCis6b3B0aW9uOjo6Zm9ybWF0LW5hbWVzOloKKworCis6bW9kZWw6Ojp2ODUwOnY4NTA6CisKKzpvcHRpb246OjptdWx0aS1zaW06dHJ1ZQorOm1vZGVsOjo6djg1MGU6djg1MGU6CisKKzpvcHRpb246OjptdWx0aS1zaW06dHJ1ZQorOm1vZGVsOjo6djg1MGVhOnY4NTBlYToKKworCisKKy8vIENhY2hlIG1hY3JvcworCis6Y2FjaGU6Ojp1bnNpZ25lZDpyZWcxOlJSUlJSOihSUlJSUikKKzpjYWNoZTo6OnVuc2lnbmVkOnJlZzI6cnJycnI6KHJycnJyKQorOmNhY2hlOjo6dW5zaWduZWQ6cmVnMzp3d3d3dzood3d3d3cpCisKKzpjYWNoZTo6OnVuc2lnbmVkOmRpc3A0OmRkZGQ6KGRkZGQpCis6Y2FjaGU6Ojp1bnNpZ25lZDpkaXNwNTpkZGRkOihkZGRkIDw8IDEpCis6Y2FjaGU6Ojp1bnNpZ25lZDpkaXNwNzpkZGRkZGRkOmRkZGRkZGQKKzpjYWNoZTo6OnVuc2lnbmVkOmRpc3A4OmRkZGRkZGQ6KGRkZGRkZGQgPDwgMSkKKzpjYWNoZTo6OnVuc2lnbmVkOmRpc3A4OmRkZGRkZDooZGRkZGRkIDw8IDIpCis6Y2FjaGU6Ojp1bnNpZ25lZDpkaXNwOTpkZGRkZCxkZGQ6U0VYVDMyICgoZGRkZGQgPDwgNCkgKyAoZGRkIDw8IDEpLCA5IC0gMSkKKzpjYWNoZTo6OnVuc2lnbmVkOmRpc3AxNjpkZGRkZGRkZGRkZGRkZGRkOkVYVEVORDE2IChkZGRkZGRkZGRkZGRkZGRkKQorOmNhY2hlOjo6dW5zaWduZWQ6ZGlzcDE2OmRkZGRkZGRkZGRkZGRkZDogRVhURU5EMTYgKGRkZGRkZGRkZGRkZGRkZCA8PCAxKQorOmNhY2hlOjo6dW5zaWduZWQ6ZGlzcDIyOmRkZGRkZCxkZGRkZGRkZGRkZGRkZGQ6IFNFWFQzMiAoKGRkZGRkZCA8PCAxNikgKyAoZGRkZGRkZGRkZGRkZGRkIDw8IDEpLCAyMiAtIDEpCisKKzpjYWNoZTo6OnVuc2lnbmVkOmltbTU6aWlpaWk6U0VYVDMyIChpaWlpaSwgNCkKKzpjYWNoZTo6OnVuc2lnbmVkOmltbTY6aWlpaWlpOmlpaWlpaQorOmNhY2hlOjo6dW5zaWduZWQ6aW1tOTppaWlpaSxJSUlJOlNFWFQgKChJSUlJIDw8IDUpICsgaWlpaWksIDkgLSAxKQorOmNhY2hlOjo6dW5zaWduZWQ6aW1tNTppaWlpOigzMiAtIChpaWlpIDw8IDEpKQorOmNhY2hlOjo6dW5zaWduZWQ6c2ltbTE2OmlpaWlpaWlpaWlpaWlpaWk6RVhURU5EMTYgKGlpaWlpaWlpaWlpaWlpaWkpCis6Y2FjaGU6Ojp1bnNpZ25lZDp1aW1tMTY6aWlpaWlpaWlpaWlpaWlpaTppaWlpaWlpaWlpaWlpaWlpCis6Y2FjaGU6Ojp1bnNpZ25lZDppbW0zMjppaWlpaWlpaWlpaWlpaWlpLElJSUlJSUlJSUlJSUlJSUk6KGlpaWlpaWlpaWlpaWlpaWkgPCAxNiArIElJSUlJSUlJSUlJSUlJSUkpCis6Y2FjaGU6Ojp1bnNpZ25lZDp1aW1tMzI6aWlpaWlpaWlpaWlpaWlpaSxkZGRkZGRkZGRkZGRkZGRkOigoaWlpaWlpaWlpaWlpaWlpaSA8PCAxNikgKyBkZGRkZGRkZGRkZGRkZGRkKQorCis6Y2FjaGU6Ojp1bnNpZ25lZDp2ZWN0b3I6aWlpaWk6aWlpaWkKKworOmNhY2hlOjo6dW5zaWduZWQ6bGlzdDEyOkwsTExMTExMTExMTEw6KChMIDw8IDExKSArIExMTExMTExMTExMKQorOmNhY2hlOjo6dW5zaWduZWQ6bGlzdDE4OkxMTEwsTExMTExMTExMTExMOigoTExMTCA8PCAxMikgKyBMTExMTExMTExMTEwpCisKKzpjYWNoZTo6OnVuc2lnbmVkOmJpdDM6YmJiOmJiYgorCisKKy8vIFdoYXQgZG8gd2UgZG8gd2l0aCBhbiBpbGxlZ2FsIGluc3RydWN0aW9uPworOmludGVybmFsOjo6OmlsbGVnYWw6Cit7CisgIHNpbV9pb19lcHJpbnRmIChTRCwgIklsbGVnYWwgaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyAweCVseFxuIiwKKwkJICAodW5zaWduZWQgbG9uZykgY2lhKTsKKyAgc2ltX2VuZ2luZV9oYWx0IChTRCwgQ1BVLCBOVUxMLCBjaWEsIHNpbV9zaWduYWxsZWQsIFNJTV9TSUdJTEwpOworfQorCisKKworLy8gQWRkCisKK3JycnJyLDAwMTExMCxSUlJSUjpJOjo6YWRkCisiYWRkIHI8cmVnMT4sIHI8cmVnMj4iCit7CisgIENPTVBBVF8xIChPUF8xQzAgKCkpOworfQorCitycnJyciwwMTAwMTAsaWlpaWk6SUk6OjphZGQKKyJhZGQgPGltbTU+LHI8cmVnMj4iCit7CisgIENPTVBBVF8xIChPUF8yNDAgKCkpOworfQorCisKKworLy8gQURESQorcnJycnIsMTEwMDAwLFJSUlJSICsgaWlpaWlpaWlpaWlpaWlpaTpWSTo6OmFkZGkKKyJhZGRpIDxzaW1tMTY+LCByPHJlZzE+LCByPHJlZzI+IgoreworICBDT01QQVRfMiAoT1BfNjAwICgpKTsKK30KKworCisKKy8vIEFORAorcnJycnIsMDAxMDEwLFJSUlJSOkk6OjphbmQKKyJhbmQgcjxyZWcxPiwgcjxyZWcyPiIKK3sKKyAgQ09NUEFUXzEgKE9QXzE0MCAoKSk7Cit9CisKKworCisvLyBBTkRJCitycnJyciwxMTAxMTAsUlJSUlIgKyBpaWlpaWlpaWlpaWlpaWlpOlZJOjo6YW5kaQorImFuZGkgPHVpbW0xNj4sIHI8cmVnMT4sIHI8cmVnMj4iCit7CisgIENPTVBBVF8yIChPUF82QzAgKCkpOworfQorCisKKworLy8gTWFwIGNvbmRpdGlvbiBjb2RlIHRvIGEgc3RyaW5nCis6JXM6Ojo6Y2NjYzppbnQgY2NjYworeworICBzd2l0Y2ggKGNjY2MpCisgICAgeworICAgIGNhc2UgMHhmOiByZXR1cm4gImd0IjsKKyAgICBjYXNlIDB4ZTogcmV0dXJuICJnZSI7CisgICAgY2FzZSAweDY6IHJldHVybiAibHQiOworCisgICAgY2FzZSAweDc6IHJldHVybiAibGUiOworCisgICAgY2FzZSAweGI6IHJldHVybiAiaCI7CisgICAgY2FzZSAweDk6IHJldHVybiAibmwiOworICAgIGNhc2UgMHgxOiByZXR1cm4gImwiOworCisgICAgY2FzZSAweDM6IHJldHVybiAibmgiOworCisgICAgY2FzZSAweDI6IHJldHVybiAiZSI7CisKKyAgICBjYXNlIDB4YTogcmV0dXJuICJuZSI7CisKKyAgICBjYXNlIDB4MDogcmV0dXJuICJ2IjsKKyAgICBjYXNlIDB4ODogcmV0dXJuICJudiI7CisgICAgY2FzZSAweDQ6IHJldHVybiAibiI7CisgICAgY2FzZSAweGM6IHJldHVybiAicCI7CisgICAgICAvKiBjYXNlIDB4MTogcmV0dXJuICJjIjsgKi8KKyAgICAgIC8qIGNhc2UgMHg5OiByZXR1cm4gIm5jIjsgKi8KKyAgICAgIC8qIGNhc2UgMHgyOiByZXR1cm4gInoiOyAqLworICAgICAgLyogY2FzZSAweGE6IHJldHVybiAibnoiOyAqLworICAgIGNhc2UgMHg1OiByZXR1cm4gInIiOyAvKiBhbHdheXMgKi8KKyAgICBjYXNlIDB4ZDogcmV0dXJuICJzYSI7CisgICAgfQorICByZXR1cm4gIihudWxsKSI7Cit9CisKKworLy8gQmNvbmQKK2RkZGRkLDEwMTEsZGRkLGNjY2M6SUlJOjo6QmNvbmQKKyJiJXM8Y2NjYz4gPGRpc3A5PiIKK3sKKyAgaW50IGNvbmQgPSBjb25kaXRpb25fbWV0IChjY2NjKTsKKyAgaWYgKGNvbmQpCisgICAgbmlhID0gY2lhICsgZGlzcDk7CisgIFRSQUNFX0JSQU5DSDEgKGNvbmQpOworfQorCisKKworLy8gQlNICitycnJyciwxMTExMTEwMDAwMCArIHd3d3d3LDAxMTAxMDAwMDEwOlhJSTo6OmJzaAorKnY4NTBlCisqdjg1MGVhCisiYnNoIHI8cmVnMj4sIHI8cmVnMz4iCit7CisgIHVuc2lnbmVkMzIgdmFsdWU7CisgIFRSQUNFX0FMVV9JTlBVVDEgKEdSW3JlZzJdKTsKKworICB2YWx1ZSA9IChNT1ZFRDMyIChHUltyZWcyXSwgMjMsIDE2LCAzMSwgMjQpCisJICAgfCBNT1ZFRDMyIChHUltyZWcyXSwgMzEsIDI0LCAyMywgMTYpCisJICAgfCBNT1ZFRDMyIChHUltyZWcyXSwgNywgMCwgMTUsIDgpCisJICAgfCBNT1ZFRDMyIChHUltyZWcyXSwgMTUsIDgsIDcsIDApKTsKKworICBHUltyZWczXSA9IHZhbHVlOworICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX0NZIHwgUFNXX09WKTsKKyAgaWYgKHZhbHVlID09IDApIFBTVyB8PSBQU1dfWjsKKyAgaWYgKHZhbHVlICYgMHg4MDAwMDAwMCkgUFNXIHw9IFBTV19TOworICBpZiAoKCh2YWx1ZSAmIDB4ZmYpID09IDApIHx8ICh2YWx1ZSAmIDB4MDBmZikgPT0gMCkgUFNXIHw9IFBTV19DWTsKKworICBUUkFDRV9BTFVfUkVTVUxUIChHUltyZWczXSk7Cit9CisKKy8vIEJTVworcnJycnIsMTExMTExMDAwMDAgKyB3d3d3dywwMTEwMTAwMDAwMDpYSUk6Ojpic3cKKyp2ODUwZQorKnY4NTBlYQorImJzdyByPHJlZzI+LCByPHJlZzM+IgoreworI2RlZmluZSBXT1JESEFTTlVMTEJZVEUoeCkgKCgoeCkgLSAweDAxMDEwMTAxKSAmIH4oeCkmMHg4MDgwODA4MCkKKyAgdW5zaWduZWQzMiB2YWx1ZTsKKyAgVFJBQ0VfQUxVX0lOUFVUMSAoR1JbcmVnMl0pOworCisgIHZhbHVlID0gR1JbcmVnMl07CisgIHZhbHVlID4+PSAyNDsKKyAgdmFsdWUgfD0gKEdSW3JlZzJdIDw8IDI0KTsKKyAgdmFsdWUgfD0gKChHUltyZWcyXSA8PCA4KSAmIDB4MDBmZjAwMDApOworICB2YWx1ZSB8PSAoKEdSW3JlZzJdID4+IDgpICYgMHgwMDAwZmYwMCk7CisgIEdSW3JlZzNdID0gdmFsdWU7CisKKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19DWSB8IFBTV19PVik7CisKKyAgaWYgKHZhbHVlID09IDApIFBTVyB8PSBQU1dfWjsKKyAgaWYgKHZhbHVlICYgMHg4MDAwMDAwMCkgUFNXIHw9IFBTV19TOworICBpZiAoV09SREhBU05VTExCWVRFICh2YWx1ZSkpIFBTVyB8PSBQU1dfQ1k7CisKKyAgVFJBQ0VfQUxVX1JFU1VMVCAoR1JbcmVnM10pOworfQorCisvLyBDQUxMVAorMDAwMDAwMTAwMCxpaWlpaWk6SUk6OjpjYWxsdAorKnY4NTBlCisqdjg1MGVhCisiY2FsbHQgPGltbTY+IgoreworICB1bnNpZ25lZDMyIGFkcjsKKyAgdW5zaWduZWQzMiBvZmY7CisgIENUUEMgID0gY2lhICsgMjsKKyAgQ1RQU1cgPSBQU1c7CisgIGFkciA9IChDVEJQICYgfjEpICsgKGltbTYgPDwgMSk7CisgIG9mZiA9IGxvYWRfbWVtIChhZHIsIDIpICYgfjE7IC8qIEZvcmNlIGFsaWdubWVudCAqLworICBuaWEgPSAoQ1RCUCAmIH4xKSArIG9mZjsKKyAgVFJBQ0VfQlJBTkNIMyAoYWRyLCBDVEJQLCBvZmYpOworfQorCisKKy8vIENMUjEKKzEwLGJiYiwxMTExMTAsUlJSUlIgKyBkZGRkZGRkZGRkZGRkZGRkOlZJSUk6OjpjbHIxCisiY2xyMSA8Yml0Mz4sIDxkaXNwMTY+W3I8cmVnMT5dIgoreworICBDT01QQVRfMiAoT1BfODdDMCAoKSk7Cit9CisKK3JycnJyLDExMTExMSxSUlJSUiArIDAwMDAwMDAwMTExMDAxMDA6SVg6OjpjbHIxCisqdjg1MGUKKyp2ODUwZWEKKyJjbHIxIHI8cmVnMj4sIFtyPHJlZzE+XSIKK3sKKyAgQ09NUEFUXzIgKE9QX0U0MDdFMCAoKSk7Cit9CisKKworLy8gQ1RSRVQKKzAwMDAwMTExMTExMDAwMDAgKyAwMDAwMDAwMTAxMDAwMTAwOlg6OjpjdHJldAorKnY4NTBlCisqdjg1MGVhCisiY3RyZXQiCit7CisgIG5pYSAgPSAoQ1RQQyAmIH4xKTsKKyAgUFNXID0gKENUUFNXICYgKENQVSktPnBzd19tYXNrKTsKKyAgVFJBQ0VfQlJBTkNIMSAoUFNXKTsKK30KKworLy8gQ01PVgorcnJycnIsMTExMTExLFJSUlJSICsgd3d3d3csMDExMDAxLGNjY2MsMDpYSTo6OmNtb3YKKyp2ODUwZQorKnY4NTBlYQorImNtb3YgJXM8Y2NjYz4sIHI8cmVnMT4sIHI8cmVnMj4sIHI8cmVnMz4iCit7CisgIGludCBjb25kID0gY29uZGl0aW9uX21ldCAoY2NjYyk7CisgIFRSQUNFX0FMVV9JTlBVVDMgKGNvbmQsIEdSW3JlZzFdLCBHUltyZWcyXSk7CisgIEdSW3JlZzNdID0gY29uZCA/IEdSW3JlZzFdIDogR1JbcmVnMl07CisgIFRSQUNFX0FMVV9SRVNVTFQgKEdSW3JlZzNdKTsKK30KKworcnJycnIsMTExMTExLGlpaWlpICsgd3d3d3csMDExMDAwLGNjY2MsMDpYSUk6OjpjbW92Cisqdjg1MGUKKyp2ODUwZWEKKyJjbW92ICVzPGNjY2M+LCA8aW1tNT4sIHI8cmVnMj4sIHI8cmVnMz4iCit7CisgIGludCBjb25kID0gY29uZGl0aW9uX21ldCAoY2NjYyk7CisgIFRSQUNFX0FMVV9JTlBVVDMgKGNvbmQsIGltbTUsIEdSW3JlZzJdKTsKKyAgR1JbcmVnM10gPSBjb25kID8gaW1tNSA6IEdSW3JlZzJdOworICBUUkFDRV9BTFVfUkVTVUxUIChHUltyZWczXSk7Cit9CisKKy8vIENNUAorcnJycnIsMDAxMTExLFJSUlJSOkk6OjpjbXAKKyJjbXAgcjxyZWcxPiwgcjxyZWcyPiIKK3sKKyAgQ09NUEFUXzEgKE9QXzFFMCAoKSk7Cit9CisKK3JycnJyLDAxMDAxMSxpaWlpaTpJSTo6OmNtcAorImNtcCA8aW1tNT4sIHI8cmVnMj4iCit7CisgIENPTVBBVF8xIChPUF8yNjAgKCkpOworfQorCisKKworLy8gREkKKzAwMDAwMTExMTExMDAwMDAgKyAwMDAwMDAwMTAxMTAwMDAwOlg6OjpkaQorImRpIgoreworICBDT01QQVRfMiAoT1BfMTYwMDdFMCAoKSk7Cit9CisKKworCisvLyBESVNQT1NFCisvLyAwMDAwMDExMDAxLGlpaWlpLEwgKyBMTExMTExMTExMTCwwMDAwMDpYSUlJOjo6ZGlzcG9zZQorLy8gImRpc3Bvc2UgPGltbTU+LCA8bGlzdDEyPiIKKzAwMDAwMTEwMDEsaWlpaWksTCArIExMTExMTExMTExMLFJSUlJSOlhJSUk6OjpkaXNwb3NlCisqdjg1MGUKKyp2ODUwZWEKKyJkaXNwb3NlIDxpbW01PiwgPGxpc3QxMj4iOlJSUlJSID09IDAKKyJkaXNwb3NlIDxpbW01PiwgPGxpc3QxMj4sIFtyZWcxXSIKK3sKKyAgaW50IGk7CisgIFNBVkVfMjsKKyAgICAgIAorICB0cmFjZV9pbnB1dCAoImRpc3Bvc2UiLCBPUF9QVVNIUE9QMSwgMCk7CisKKyAgU1AgKz0gKE9QWzNdICYgMHgzZSkgPDwgMTsKKworICAvKiBMb2FkIHRoZSByZWdpc3RlcnMgd2l0aCBsb3dlciBudW1iZXIgcmVnaXN0ZXJzIGJlaW5nIHJldHJpZXZlZAorICAgICBmcm9tIGhpZ2hlciBhZGRyZXNzZXMuICAqLworICBmb3IgKGkgPSAxMjsgaS0tOykKKyAgICBpZiAoKE9QWzNdICYgKDEgPDwgdHlwZTFfcmVnc1sgaSBdKSkpCisgICAgICB7CisJU3RhdGUucmVnc1sgMjAgKyBpIF0gPSBsb2FkX21lbSAoU1AsIDQpOworCVNQICs9IDQ7CisgICAgICB9CisgIAorICBpZiAoKE9QWzNdICYgMHgxZjAwMDApICE9IDApCisgICAgeworICAgICAgbmlhID0gU3RhdGUucmVnc1sgKE9QWzNdID4+IDE2KSAmIDB4MWZdOworICAgIH0KKyAgCisgIHRyYWNlX291dHB1dCAoT1BfUFVTSFBPUDEpOworfQorCisKKy8vIERJVgorcnJycnIsMTExMTExLFJSUlJSICsgd3d3d3csMDEwMTEwMDAwMDA6WEk6OjpkaXYKKyp2ODUwZQorImRpdiByPHJlZzE+LCByPHJlZzI+LCByPHJlZzM+IgoreworICBDT01QQVRfMiAoT1BfMkMwMDdFMCAoKSk7Cit9CisKKworLy8gRElWSAorcnJycnIhMCwwMDAwMTAsUlJSUlIhMDpJOjo6ZGl2aAorImRpdmggcjxyZWcxPiwgcjxyZWcyPiIKK3sKKyAgQ09NUEFUXzEgKE9QXzQwICgpKTsKK30KKworcnJycnIsMTExMTExLFJSUlJSICsgd3d3d3csMDEwMTAwMDAwMDA6WEk6OjpkaXZoCisqdjg1MGUKKyJkaXZoIHI8cmVnMT4sIHI8cmVnMj4sIHI8cmVnMz4iCit7CisgIENPTVBBVF8yIChPUF8yODAwN0UwICgpKTsKK30KKworCisvLyBESVZIVQorcnJycnIsMTExMTExLFJSUlJSICsgd3d3d3csMDEwMTAwMDAwMTA6WEk6OjpkaXZodQorKnY4NTBlCisiZGl2aHUgcjxyZWcxPiwgcjxyZWcyPiwgcjxyZWczPiIKK3sKKyAgQ09NUEFUXzIgKE9QXzI4MjA3RTAgKCkpOworfQorCisKKy8vIERJVlUKK3JycnJyLDExMTExMSxSUlJSUiArIHd3d3d3LDAxMDExMDAwMDEwOlhJOjo6ZGl2dQorKnY4NTBlCisiZGl2dSByPHJlZzE+LCByPHJlZzI+LCByPHJlZzM+IgoreworICBDT01QQVRfMiAoT1BfMkMyMDdFMCAoKSk7Cit9CisKKworLy8gRUkKKzEwMDAwMTExMTExMDAwMDAgKyAwMDAwMDAwMTAxMTAwMDAwOlg6OjplaQorImVpIgoreworICBDT01QQVRfMiAoT1BfMTYwODdFMCAoKSk7Cit9CisKKworCisvLyBIQUxUCiswMDAwMDExMTExMTAwMDAwICsgMDAwMDAwMDEwMDEwMDAwMDpYOjo6aGFsdAorImhhbHQiCit7CisgIENPTVBBVF8yIChPUF8xMjAwN0UwICgpKTsKK30KKworCisKKy8vIEhTVworcnJycnIsMTExMTExMDAwMDAgKyB3d3d3dywwMTEwMTAwMDEwMDpYSUk6Ojpoc3cKKyp2ODUwZQorKnY4NTBlYQorImhzdyByPHJlZzI+LCByPHJlZzM+IgoreworICB1bnNpZ25lZDMyIHZhbHVlOworICBUUkFDRV9BTFVfSU5QVVQxIChHUltyZWcyXSk7CisKKyAgdmFsdWUgPSBHUltyZWcyXTsKKyAgdmFsdWUgPj49IDE2OworICB2YWx1ZSB8PSAoR1JbcmVnMl0gPDwgMTYpOworICAKKyAgR1JbcmVnM10gPSB2YWx1ZTsKKworICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX0NZIHwgUFNXX09WKTsKKworICBpZiAodmFsdWUgPT0gMCkgUFNXIHw9IFBTV19aOworICBpZiAodmFsdWUgJiAweDgwMDAwMDAwKSBQU1cgfD0gUFNXX1M7CisgIGlmICgoKHZhbHVlICYgMHhmZmZmKSA9PSAwKSB8fCAodmFsdWUgJiAweGZmZmYwMDAwKSA9PSAwKSBQU1cgfD0gUFNXX0NZOworCisgIFRSQUNFX0FMVV9SRVNVTFQgKEdSW3JlZzNdKTsKK30KKworCisKKy8vIEpBUkwKK3JycnJyITAsMTExMTAsZGRkZGRkICsgZGRkZGRkZGRkZGRkZGRkLDA6Vjo6OmphcmwKKyJqYXJsIDxkaXNwMjI+LCByPHJlZzI+IgoreworICBHUltyZWcyXSA9IG5pYTsKKyAgbmlhID0gY2lhICsgZGlzcDIyOworICBUUkFDRV9CUkFOQ0gxIChHUltyZWcyXSk7Cit9CisKKworCisvLyBKTVAKKzAwMDAwMDAwMDExLFJSUlJSOkk6OjpqbXAKKyJqbXAgW3I8cmVnMT5dIgoreworICBuaWEgPSBHUltyZWcxXSAmIH4xOworICBUUkFDRV9CUkFOQ0gwICgpOworfQorCisKKworLy8gSlIKKzAwMDAwMTExMTAsZGRkZGRkICsgZGRkZGRkZGRkZGRkZGRkLDA6Vjo6OmpyCisianIgPGRpc3AyMj4iCit7CisgIG5pYSA9IGNpYSArIGRpc3AyMjsKKyAgVFJBQ0VfQlJBTkNIMCAoKTsKK30KKworCisKKy8vIExECitycnJyciwxMTEwMDAsUlJSUlIgKyBkZGRkZGRkZGRkZGRkZGRkOlZJSTo6OmxkLmIKKyJsZC5iIDxkaXNwMTY+W3I8cmVnMT5dLCByPHJlZzI+IgoreworICBDT01QQVRfMiAoT1BfNzAwICgpKTsKK30KKworcnJycnIsMTExMDAxLFJSUlJSICsgZGRkZGRkZGRkZGRkZGRkLDA6VklJOjo6bGQuaAorImxkLmggPGRpc3AxNj5bcjxyZWcxPl0sIHI8cmVnMj4iCit7CisgIENPTVBBVF8yIChPUF83MjAgKCkpOworfQorCitycnJyciwxMTEwMDEsUlJSUlIgKyBkZGRkZGRkZGRkZGRkZGQsMTpWSUk6OjpsZC53CisibGQudyA8ZGlzcDE2PltyPHJlZzE+XSwgcjxyZWcyPiIKK3sKKyAgQ09NUEFUXzIgKE9QXzEwNzIwICgpKTsKK30KKworcnJycnIhMCwxMTExMCxiLFJSUlJSICsgZGRkZGRkZGRkZGRkZGRkLDE6VklJOjo6bGQuYnUKKyp2ODUwZQorKnY4NTBlYQorImxkLmJ1IDxkaXNwMTY+W3I8cmVnMT5dLCByPHJlZzI+IgoreworICBDT01QQVRfMiAoT1BfMTA3ODAgKCkpOworfQorCitycnJyciEwLDExMTExMSxSUlJSUiArIGRkZGRkZGRkZGRkZGRkZCwxOlZJSTo6OmxkLmh1Cisqdjg1MGUKKyp2ODUwZWEKKyJsZC5odSA8ZGlzcDE2PltyPHJlZzE+XSwgcjxyZWcyPiIKK3sKKyAgQ09NUEFUXzIgKE9QXzEwN0UwICgpKTsKK30KKworCisvLyBMRFNSCityZWdJRCwxMTExMTEsUlJSUlIgKyAwMDAwMDAwMDAwMTAwMDAwOklYOjo6bGRzcgorImxkc3IgcjxyZWcxPiwgczxyZWdJRD4iCit7CisgIFRSQUNFX0FMVV9JTlBVVDEgKEdSW3JlZzFdKTsKKyAgCisgIGlmICgmUFNXID09ICZTUltyZWdJRF0pCisgICAgUFNXID0gKEdSW3JlZzFdICYgKENQVSktPnBzd19tYXNrKTsKKyAgZWxzZQorICAgIFNSW3JlZ0lEXSA9IEdSW3JlZzFdOworICAKKyAgVFJBQ0VfQUxVX1JFU1VMVCAoU1JbcmVnSURdKTsKK30KKworCisKKy8vIE1PVgorcnJycnIhMCwwMDAwMDAsUlJSUlI6STo6Om1vdgorIm1vdiByPHJlZzE+LCByPHJlZzI+IgoreworICBUUkFDRV9BTFVfSU5QVVQwICgpOworICBHUltyZWcyXSA9IEdSW3JlZzFdOworICBUUkFDRV9BTFVfUkVTVUxUIChHUltyZWcyXSk7Cit9CisKKworcnJycnIhMCwwMTAwMDAsaWlpaWk6SUk6Ojptb3YKKyJtb3YgPGltbTU+LCByPHJlZzI+IgoreworICBDT01QQVRfMSAoT1BfMjAwICgpKTsKK30KKworMDAwMDAxMTAwMDEsUlJSUlIgKyBpaWlpaWlpaWlpaWlpaWlpICsgSUlJSUlJSUlJSUlJSUlJSTpWSTo6Om1vdgorKnY4NTBlCisqdjg1MGVhCisibW92IDxpbW0zMj4sIHI8cmVnMT4iCit7CisgIFNBVkVfMjsKKyAgdHJhY2VfaW5wdXQgKCJtb3YiLCBPUF9JTU1fUkVHLCA0KTsKKyAgU3RhdGUucmVnc1sgT1BbMF0gXSA9IGxvYWRfbWVtIChQQyArIDIsIDQpOworICB0cmFjZV9vdXRwdXQgKE9QX0lNTV9SRUcpOworfQorCisKKworLy8gTU9WRUEKK3JycnJyITAsMTEwMDAxLFJSUlJSICsgaWlpaWlpaWlpaWlpaWlpaTpWSTo6Om1vdmVhCisibW92ZWEgPHNpbW0xNj4sIHI8cmVnMT4sIHI8cmVnMj4iCit7CisgIFRSQUNFX0FMVV9JTlBVVDIgKEdSW3JlZzFdLCBzaW1tMTYpOworICBHUltyZWcyXSA9IEdSW3JlZzFdICsgc2ltbTE2OworICBUUkFDRV9BTFVfUkVTVUxUIChHUltyZWcyXSk7Cit9CisKKworCisvLyBNT1ZISQorcnJycnIhMCwxMTAwMTAsUlJSUlIgKyBpaWlpaWlpaWlpaWlpaWlpOlZJOjo6bW92aGkKKyJtb3ZoaSA8dWltbTE2PiwgcjxyZWcxPiwgcjxyZWcyPiIKK3sKKyAgQ09NUEFUXzIgKE9QXzY0MCAoKSk7Cit9CisKKworCisvLyBNVUwKK3JycnJyLDExMTExMSxSUlJSUiArIHd3d3d3LDAxMDAwMTAwMDAwOlhJOjo6bXVsCisqdjg1MGUKKyp2ODUwZWEKKyJtdWwgcjxyZWcxPiwgcjxyZWcyPiwgcjxyZWczPiIKK3sKKyAgQ09NUEFUXzIgKE9QXzIyMDA3RTAgKCkpOworfQorCitycnJyciwxMTExMTEsaWlpaWkgKyB3d3d3dywwMTAwMSxJSUlJLDAwOlhJSTo6Om11bAorKnY4NTBlCisqdjg1MGVhCisibXVsIDxpbW05PiwgcjxyZWcyPiwgcjxyZWczPiIKK3sKKyAgQ09NUEFUXzIgKE9QXzI0MDA3RTAgKCkpOworfQorCisKKy8vIE1VTEgKK3JycnJyITAsMDAwMTExLFJSUlJSOkk6OjptdWxoCisibXVsaCByPHJlZzE+LCByPHJlZzI+IgoreworICBDT01QQVRfMSAoT1BfRTAgKCkpOworfQorCitycnJyciEwLDAxMDExMSxpaWlpaTpJSTo6Om11bGgKKyJtdWxoIDxpbW01PiwgcjxyZWcyPiIKK3sKKyAgQ09NUEFUXzEgKE9QXzJFMCAoKSk7Cit9CisKKworCisvLyBNVUxISQorcnJycnIhMCwxMTAxMTEsUlJSUlIgKyBpaWlpaWlpaWlpaWlpaWlpOlZJOjo6bXVsaGkKKyJtdWxoaSA8dWltbTE2PiwgcjxyZWcxPiwgcjxyZWcyPiIKK3sKKyAgQ09NUEFUXzIgKE9QXzZFMCAoKSk7Cit9CisKKworCisvLyBNVUxVCitycnJyciwxMTExMTEsUlJSUlIgKyB3d3d3dywwMTAwMDEwMDAxMDpYSTo6Om11bHUKKyp2ODUwZQorKnY4NTBlYQorIm11bHUgcjxyZWcxPiwgcjxyZWcyPiwgcjxyZWczPiIKK3sKKyAgQ09NUEFUXzIgKE9QXzIyMjA3RTAgKCkpOworfQorCitycnJyciwxMTExMTEsaWlpaWkgKyB3d3d3dywwMTAwMSxJSUlJLDEwOlhJSTo6Om11bHUKKyp2ODUwZQorKnY4NTBlYQorIm11bHUgPGltbTk+LCByPHJlZzI+LCByPHJlZzM+IgoreworICBDT01QQVRfMiAoT1BfMjQyMDdFMCAoKSk7Cit9CisKKworCisvLyBOT1AKKzAwMDAwMDAwMDAwMDAwMDA6STo6Om5vcAorIm5vcCIKK3sKKyAgLyogZG8gbm90aGluZywgdHJhY2Ugbm90aGluZyAqLworfQorCisKKworLy8gTk9UCitycnJyciwwMDAwMDEsUlJSUlI6STo6Om5vdAorIm5vdCByPHJlZzE+LCByPHJlZzI+IgoreworICBDT01QQVRfMSAoT1BfMjAgKCkpOworfQorCisKKworLy8gTk9UMQorMDEsYmJiLDExMTExMCxSUlJSUiArIGRkZGRkZGRkZGRkZGRkZGQ6VklJSTo6Om5vdDEKKyJub3QxIDxiaXQzPiwgPGRpc3AxNj5bcjxyZWcxPl0iCit7CisgIENPTVBBVF8yIChPUF80N0MwICgpKTsKK30KKworcnJycnIsMTExMTExLFJSUlJSICsgMDAwMDAwMDAxMTEwMDAxMDpJWDo6Om5vdDEKKyp2ODUwZQorKnY4NTBlYQorIm5vdDEgcjxyZWcyPiwgcjxyZWcxPiIKK3sKKyAgQ09NUEFUXzIgKE9QX0UyMDdFMCAoKSk7Cit9CisKKworCisvLyBPUgorcnJycnIsMDAxMDAwLFJSUlJSOkk6OjpvcgorIm9yIHI8cmVnMT4sIHI8cmVnMj4iCit7CisgIENPTVBBVF8xIChPUF8xMDAgKCkpOworfQorCisKKworLy8gT1JJIAorcnJycnIsMTEwMTAwLFJSUlJSICsgaWlpaWlpaWlpaWlpaWlpaTpWSTo6Om9yaQorIm9yaSA8dWltbTE2PiwgcjxyZWcxPiwgcjxyZWcyPiIKK3sKKyAgQ09NUEFUXzIgKE9QXzY4MCAoKSk7Cit9CisKKworCisvLyBQUkVQQVJFCiswMDAwMDExMTEwLGlpaWlpLEwgKyBMTExMTExMTExMTCwwMDAwMTpYSUlJOjo6cHJlcGFyZQorKnY4NTBlCisqdjg1MGVhCisicHJlcGFyZSA8bGlzdDEyPiwgPGltbTU+IgoreworICBpbnQgIGk7CisgIFNBVkVfMjsKKyAgCisgIHRyYWNlX2lucHV0ICgicHJlcGFyZSIsIE9QX1BVU0hQT1AxLCAwKTsKKyAgCisgIC8qIFN0b3JlIHRoZSByZWdpc3RlcnMgd2l0aCBsb3dlciBudW1iZXIgcmVnaXN0ZXJzIGJlaW5nIHBsYWNlZCBhdAorICAgICBoaWdoZXIgYWRkcmVzc2VzLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCisgICAgaWYgKChPUFszXSAmICgxIDw8IHR5cGUxX3JlZ3NbIGkgXSkpKQorICAgICAgeworCVNQIC09IDQ7CisJc3RvcmVfbWVtIChTUCwgNCwgU3RhdGUucmVnc1sgMjAgKyBpIF0pOworICAgICAgfQorICAKKyAgU1AgLT0gKE9QWzNdICYgMHgzZSkgPDwgMTsKKyAgCisgIHRyYWNlX291dHB1dCAoT1BfUFVTSFBPUDEpOworfQorCisKKzAwMDAwMTExMTAsaWlpaWksTCArIExMTExMTExMTExMLDAwMDExOlhJSUk6OjpwcmVwYXJlMDAKKyp2ODUwZQorKnY4NTBlYQorInByZXBhcmUgPGxpc3QxMj4sIDxpbW01Piwgc3AiCit7CisgIENPTVBBVF8yIChPUF8zMDc4MCAoKSk7Cit9CisKKzAwMDAwMTExMTAsaWlpaWksTCArIExMTExMTExMTExMLDAxMDExICsgaWlpaWlpaWlpaWlpaWlpaTpYSUlJOjo6cHJlcGFyZTAxCisqdjg1MGUKKyp2ODUwZWEKKyJwcmVwYXJlIDxsaXN0MTI+LCA8aW1tNT4sIDx1aW1tMTY+IgoreworICBDT01QQVRfMiAoT1BfQjA3ODAgKCkpOworfQorCiswMDAwMDExMTEwLGlpaWlpLEwgKyBMTExMTExMTExMTCwxMDAxMSArIGlpaWlpaWlpaWlpaWlpaWk6WElJSTo6OnByZXBhcmUxMAorKnY4NTBlCisqdjg1MGVhCisicHJlcGFyZSA8bGlzdDEyPiwgPGltbTU+LCA8dWltbTE2PiIKK3sKKyAgQ09NUEFUXzIgKE9QXzEzMDc4MCAoKSk7Cit9CisKKzAwMDAwMTExMTAsaWlpaWksTCArIExMTExMTExMTExMLDExMDExICsgaWlpaWlpaWlpaWlpaWlpaSArIGRkZGRkZGRkZGRkZGRkZGQ6WElJSTo6OnByZXBhcmUxMQorKnY4NTBlCisqdjg1MGVhCisicHJlcGFyZSA8bGlzdDEyPiwgPGltbTU+LCA8dWltbTMyPiIKK3sKKyAgQ09NUEFUXzIgKE9QXzFCMDc4MCAoKSk7Cit9CisKKworCisvLyBSRVRJCiswMDAwMDExMTExMTAwMDAwICsgMDAwMDAwMDEwMTAwMDAwMDpYOjo6cmV0aQorInJldGkiCit7CisgIGlmICgoUFNXICYgUFNXX0VQKSkKKyAgICB7CisgICAgICBuaWEgPSAoRUlQQyAmIH4xKTsKKyAgICAgIFBTVyA9IEVJUFNXOworICAgIH0KKyAgZWxzZSBpZiAoKFBTVyAmIFBTV19OUCkpCisgICAgeworICAgICAgbmlhID0gKEZFUEMgJiB+MSk7CisgICAgICBQU1cgPSBGRVBTVzsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBuaWEgPSAoRUlQQyAmIH4xKTsKKyAgICAgIFBTVyA9IEVJUFNXOworICAgIH0KKyAgVFJBQ0VfQlJBTkNIMSAoUFNXKTsKK30KKworCisKKy8vIFNBUgorcnJycnIsMTExMTExLFJSUlJSICsgMDAwMDAwMDAxMDEwMDAwMDpJWDo6OnNhcgorInNhciByPHJlZzE+LCByPHJlZzI+IgoreworICBDT01QQVRfMiAoT1BfQTAwN0UwICgpKTsKK30KKworcnJycnIsMDEwMTAxLGlpaWlpOklJOjo6c2FyCisic2FyIDxpbW01PiwgcjxyZWcyPiIKK3sKKyAgQ09NUEFUXzEgKE9QXzJBMCAoKSk7Cit9CisKKworCisvLyBTQVNGCitycnJyciwxMTExMTEwLGNjY2MgKyAwMDAwMDAxMDAwMDAwMDAwOklYOjo6c2FzZgorKnY4NTBlCisqdjg1MGVhCisic2FzZiAlczxjY2NjPiwgcjxyZWcyPiIKK3sKKyAgQ09NUEFUXzIgKE9QXzIwMDA3RTAgKCkpOworfQorCisKKworCisvLyBTQVRBREQKK3JycnJyITAsMDAwMTEwLFJSUlJSOkk6OjpzYXRhZGQKKyJzYXRhZGQgcjxyZWcxPiwgcjxyZWcyPiIKK3sKKyAgQ09NUEFUXzEgKE9QX0MwICgpKTsKK30KKworcnJycnIhMCwwMTAwMDEsaWlpaWk6SUk6OjpzYXRhZGQKKyJzYXRhZGQgPGltbTU+LCByPHJlZzI+IgoreworICBDT01QQVRfMSAoT1BfMjIwICgpKTsKK30KKworCisKKy8vIFNBVFNVQgorcnJycnIhMCwwMDAxMDEsUlJSUlI6STo6OnNhdHN1YgorInNhdHN1YiByPHJlZzE+LCByPHJlZzI+IgoreworICBDT01QQVRfMSAoT1BfQTAgKCkpOworfQorCisKKworLy8gU0FUU1VCSQorcnJycnIhMCwxMTAwMTEsUlJSUlIgKyBpaWlpaWlpaWlpaWlpaWlpOlZJOjo6c2F0c3ViaQorInNhdHN1YmkgPHNpbW0xNj4sIHI8cmVnMT4sIHI8cmVnMj4iCit7CisgIENPTVBBVF8yIChPUF82NjAgKCkpOworfQorCisKKworLy8gU0FUU1VCUgorcnJycnIhMCwwMDAxMDAsUlJSUlI6STo6OnNhdHN1YnIKKyJzYXRzdWJyIHI8cmVnMT4sIHI8cmVnMj4iCit7CisgIENPTVBBVF8xIChPUF84MCAoKSk7Cit9CisKKworCisvLyBTRVRGCitycnJyciwxMTExMTEwLGNjY2MgKyAwMDAwMDAwMDAwMDAwMDAwOklYOjo6c2V0ZgorInNldGYgJXM8Y2NjYz4sIHI8cmVnMj4iCit7CisgIENPTVBBVF8yIChPUF83RTAgKCkpOworfQorCisKKworLy8gU0VUMQorMDAsYmJiLDExMTExMCxSUlJSUiArIGRkZGRkZGRkZGRkZGRkZGQ6VklJSTo6OnNldDEKKyJzZXQxIDxiaXQzPiwgPGRpc3AxNj5bcjxyZWcxPl0iCit7CisgIENPTVBBVF8yIChPUF83QzAgKCkpOworfQorCitycnJyciwxMTExMTEsUlJSUlIgKyAwMDAwMDAwMDExMTAwMDAwOklYOjo6c2V0MQorKnY4NTBlCisqdjg1MGVhCisic2V0MSByPHJlZzI+LCBbcjxyZWcxPl0iCit7CisgIENPTVBBVF8yIChPUF9FMDA3RTAgKCkpOworfQorCisKKworLy8gU0hMCitycnJyciwxMTExMTEsUlJSUlIgKyAwMDAwMDAwMDExMDAwMDAwOklYOjo6c2hsCisic2hsIHI8cmVnMT4sIHI8cmVnMj4iCit7CisgIENPTVBBVF8yIChPUF9DMDA3RTAgKCkpOworfQorCitycnJyciwwMTAxMTAsaWlpaWk6SUk6OjpzaGwKKyJzaGwgPGltbTU+LCByPHJlZzI+IgoreworICBDT01QQVRfMSAoT1BfMkMwICgpKTsKK30KKworCisKKy8vIFNIUgorcnJycnIsMTExMTExLFJSUlJSICsgMDAwMDAwMDAxMDAwMDAwMDpJWDo6OnNocgorInNociByPHJlZzE+LCByPHJlZzI+IgoreworICBDT01QQVRfMiAoT1BfODAwN0UwICgpKTsKK30KKworcnJycnIsMDEwMTAwLGlpaWlpOklJOjo6c2hyCisic2hyIDxpbW01PiwgcjxyZWcyPiIKK3sKKyAgQ09NUEFUXzEgKE9QXzI4MCAoKSk7Cit9CisKKworCisvLyBTTEQKK3JycnJyLDAxMTAsZGRkZGRkZDpJVjo6OnNsZC5iCisic2xkLmJ1IDxkaXNwNz5bZXBdLCByPHJlZzI+IjooUFNXICYgUFNXX1VTKQorInNsZC5iIDxkaXNwNz5bZXBdLCByPHJlZzI+IgoreworICB1bnNpZ25lZDMyIGFkZHIgPSBFUCArIGRpc3A3OworICB1bnNpZ25lZDMyIHJlc3VsdCA9IGxvYWRfbWVtIChhZGRyLCAxKTsKKyAgaWYgKFBTVyAmIFBTV19VUykKKyAgICB7CisgICAgICBHUltyZWcyXSA9IHJlc3VsdDsKKyAgICAgIFRSQUNFX0xEX05BTUUgKCJzbGQuYnUiLCBhZGRyLCByZXN1bHQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHJlc3VsdCA9IEVYVEVORDggKHJlc3VsdCk7CisgICAgICBHUltyZWcyXSA9IHJlc3VsdDsKKyAgICAgIFRSQUNFX0xEIChhZGRyLCByZXN1bHQpOworICAgIH0KK30KKworcnJycnIsMTAwMCxkZGRkZGRkOklWOjo6c2xkLmgKKyJzbGQuaHUgPGRpc3A4PltlcF0sIHI8cmVnMj4iOihQU1cgJiBQU1dfVVMpCisic2xkLmggPGRpc3A4PltlcF0sIHI8cmVnMj4iCit7CisgIHVuc2lnbmVkMzIgYWRkciA9IEVQICsgZGlzcDg7CisgIHVuc2lnbmVkMzIgcmVzdWx0ID0gbG9hZF9tZW0gKGFkZHIsIDIpOworICBpZiAoUFNXICYgUFNXX1VTKQorICAgIHsKKyAgICAgIEdSW3JlZzJdID0gcmVzdWx0OworICAgICAgVFJBQ0VfTERfTkFNRSAoInNsZC5odSIsIGFkZHIsIHJlc3VsdCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVzdWx0ID0gRVhURU5EMTYgKHJlc3VsdCk7CisgICAgICBHUltyZWcyXSA9IHJlc3VsdDsKKyAgICAgIFRSQUNFX0xEIChhZGRyLCByZXN1bHQpOworICAgIH0KK30KKworcnJycnIsMTAxMCxkZGRkZGQsMDpJVjo6OnNsZC53Cisic2xkLncgPGRpc3A4PltlcF0sIHI8cmVnMj4iCit7CisgIHVuc2lnbmVkMzIgYWRkciA9IEVQICsgZGlzcDg7CisgIHVuc2lnbmVkMzIgcmVzdWx0ID0gbG9hZF9tZW0gKGFkZHIsIDQpOworICBHUltyZWcyXSA9IHJlc3VsdDsKKyAgVFJBQ0VfTEQgKGFkZHIsIHJlc3VsdCk7Cit9CisKK3JycnJyITAsMDAwMDExMCxkZGRkOklWOjo6c2xkLmJ1Cisqdjg1MGUKKyp2ODUwZWEKKyJzbGQuYiA8ZGlzcDQ+W2VwXSwgcjxyZWcyPiI6KFBTVyAmIFBTV19VUykKKyJzbGQuYnUgPGRpc3A0PltlcF0sIHI8cmVnMj4iCit7CisgIHVuc2lnbmVkMzIgYWRkciA9IEVQICsgZGlzcDQ7CisgIHVuc2lnbmVkMzIgcmVzdWx0ID0gbG9hZF9tZW0gKGFkZHIsIDEpOworICBpZiAoUFNXICYgUFNXX1VTKQorICAgIHsKKyAgICAgIHJlc3VsdCA9IEVYVEVORDggKHJlc3VsdCk7CisgICAgICBHUltyZWcyXSA9IHJlc3VsdDsKKyAgICAgIFRSQUNFX0xEX05BTUUgKCJzbGQuYiIsIGFkZHIsIHJlc3VsdCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgR1JbcmVnMl0gPSByZXN1bHQ7CisgICAgICBUUkFDRV9MRCAoYWRkciwgcmVzdWx0KTsKKyAgICB9Cit9CisKK3JycnJyITAsMDAwMDExMSxkZGRkOklWOjo6c2xkLmh1Cisqdjg1MGUKKyp2ODUwZWEKKyJzbGQuaCA8ZGlzcDU+W2VwXSwgcjxyZWcyPiI6KFBTVyAmIFBTV19VUykKKyJzbGQuaHUgPGRpc3A1PltlcF0sIHI8cmVnMj4iCit7CisgIHVuc2lnbmVkMzIgYWRkciA9IEVQICsgZGlzcDU7CisgIHVuc2lnbmVkMzIgcmVzdWx0ID0gbG9hZF9tZW0gKGFkZHIsIDIpOworICBpZiAoUFNXICYgUFNXX1VTKQorICAgIHsKKyAgICAgIHJlc3VsdCA9IEVYVEVORDE2IChyZXN1bHQpOworICAgICAgR1JbcmVnMl0gPSByZXN1bHQ7CisgICAgICBUUkFDRV9MRF9OQU1FICgic2xkLmgiLCBhZGRyLCByZXN1bHQpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIEdSW3JlZzJdID0gcmVzdWx0OworICAgICAgVFJBQ0VfTEQgKGFkZHIsIHJlc3VsdCk7CisgICAgfQorfQorCisKKy8vIFNTVAorcnJycnIsMDExMSxkZGRkZGRkOklWOjo6c3N0LmIKKyJzc3QuYiByPHJlZzI+LCA8ZGlzcDc+W2VwXSIKK3sKKyAgQ09NUEFUXzEgKE9QXzM4MCAoKSk7Cit9CisKK3JycnJyLDEwMDEsZGRkZGRkZDpJVjo6OnNzdC5oCisic3N0LmggcjxyZWcyPiwgPGRpc3A4PltlcF0iCit7CisgIENPTVBBVF8xIChPUF80ODAgKCkpOworfQorCitycnJyciwxMDEwLGRkZGRkZCwxOklWOjo6c3N0LncKKyJzc3QudyByPHJlZzI+LCA8ZGlzcDg+W2VwXSIKK3sKKyAgQ09NUEFUXzEgKE9QXzUwMSAoKSk7Cit9CisKKworCisvLyBTVAorcnJycnIsMTExMDEwLFJSUlJSICsgZGRkZGRkZGRkZGRkZGRkZDpWSUk6OjpzdC5iCisic3QuYiByPHJlZzI+LCA8ZGlzcDE2PltyPHJlZzE+XSIKK3sKKyAgQ09NUEFUXzIgKE9QXzc0MCAoKSk7Cit9CisKK3JycnJyLDExMTAxMSxSUlJSUiArIGRkZGRkZGRkZGRkZGRkZCwwOlZJSTo6OnN0LmgKKyJzdC5oIHI8cmVnMj4sIDxkaXNwMTY+W3I8cmVnMT5dIgoreworICBDT01QQVRfMiAoT1BfNzYwICgpKTsKK30KKworcnJycnIsMTExMDExLFJSUlJSICsgZGRkZGRkZGRkZGRkZGRkLDE6VklJOjo6c3QudworInN0LncgcjxyZWcyPiwgPGRpc3AxNj5bcjxyZWcxPl0iCit7CisgIENPTVBBVF8yIChPUF8xMDc2MCAoKSk7Cit9CisKKworCisvLyBTVFNSCitycnJyciwxMTExMTEscmVnSUQgKyAwMDAwMDAwMDAxMDAwMDAwOklYOjo6c3RzcgorInN0c3IgczxyZWdJRD4sIHI8cmVnMj4iCit7CisgIFRSQUNFX0FMVV9JTlBVVDEgKFNSW3JlZ0lEXSk7CisgIEdSW3JlZzJdID0gU1JbcmVnSURdOworICBUUkFDRV9BTFVfUkVTVUxUIChHUltyZWcyXSk7Cit9CisKKworCisvLyBTVUIKK3JycnJyLDAwMTEwMSxSUlJSUjpJOjo6c3ViCisic3ViIHI8cmVnMT4sIHI8cmVnMj4iCit7CisgIENPTVBBVF8xIChPUF8xQTAgKCkpOworfQorCisKKworLy8gU1VCUgorcnJycnIsMDAxMTAwLFJSUlJSOkk6OjpzdWJyCisic3ViciByPHJlZzE+LCByPHJlZzI+IgoreworICBDT01QQVRfMSAoT1BfMTgwICgpKTsKK30KKworCisKKy8vIFNXSVRDSAorMDAwMDAwMDAwMTAsUlJSUlI6STo6OnN3aXRjaAorKnY4NTBlCisqdjg1MGVhCisic3dpdGNoIHI8cmVnMT4iCit7CisgIHVuc2lnbmVkIGxvbmcgYWRyOworICBTQVZFXzE7CisgIHRyYWNlX2lucHV0ICgic3dpdGNoIiwgT1BfUkVHLCAwKTsKKyAgYWRyID0gKGNpYSArIDIpICsgKFN0YXRlLnJlZ3NbIHJlZzEgXSA8PCAxKTsKKyAgbmlhID0gKGNpYSArIDIpICsgKEVYVEVORDE2IChsb2FkX21lbSAoYWRyLCAyKSkgPDwgMSk7CisgIHRyYWNlX291dHB1dCAoT1BfUkVHKTsKK30KKworCisvLyBTWEIKKzAwMDAwMDAwMTAxLFJSUlJSOkk6OjpzeGIKKyp2ODUwZQorKnY4NTBlYQorInN4YiByPHJlZzE+IgoreworICBUUkFDRV9BTFVfSU5QVVQxIChHUltyZWcxXSk7CisgIEdSW3JlZzFdID0gRVhURU5EOCAoR1JbcmVnMV0pOworICBUUkFDRV9BTFVfUkVTVUxUIChHUltyZWcxXSk7Cit9CisKKy8vIFNYSAorMDAwMDAwMDAxMTEsUlJSUlI6STo6OnN4aAorKnY4NTBlCisqdjg1MGVhCisic3hoIHI8cmVnMT4iCit7CisgIFRSQUNFX0FMVV9JTlBVVDEgKEdSW3JlZzFdKTsKKyAgR1JbcmVnMV0gPSBFWFRFTkQxNiAoR1JbcmVnMV0pOworICBUUkFDRV9BTFVfUkVTVUxUIChHUltyZWcxXSk7Cit9CisKKworCisvLyBUUkFQCiswMDAwMDExMTExMSxpaWlpaSArIDAwMDAwMDAxMDAwMDAwMDA6WDo6OnRyYXAKKyJ0cmFwIDx2ZWN0b3I+IgoreworICBDT01QQVRfMiAoT1BfMTAwMDdFMCAoKSk7Cit9CisKKworCisvLyBUU1QKK3JycnJyLDAwMTAxMSxSUlJSUjpJOjo6dHN0CisidHN0IHI8cmVnMT4sIHI8cmVnMj4iCit7CisgIENPTVBBVF8xIChPUF8xNjAgKCkpOworfQorCisKKworLy8gVFNUMQorMTEsYmJiLDExMTExMCxSUlJSUiArIGRkZGRkZGRkZGRkZGRkZGQ6VklJSTo6OnRzdDEKKyJ0c3QxIDxiaXQzPiwgPGRpc3AxNj5bcjxyZWcxPl0iCit7CisgIENPTVBBVF8yIChPUF9DN0MwICgpKTsKK30KKworcnJycnIsMTExMTExLFJSUlJSICsgMDAwMDAwMDAxMTEwMDExMDpJWDo6OnRzdDEKKyp2ODUwZQorKnY4NTBlYQorInRzdDEgcjxyZWcyPiwgW3I8cmVnMT5dIgoreworICBDT01QQVRfMiAoT1BfRTYwN0UwICgpKTsKK30KKworCisKKy8vIFhPUgorcnJycnIsMDAxMDAxLFJSUlJSOkk6Ojp4b3IKKyJ4b3IgcjxyZWcxPiwgcjxyZWcyPiIKK3sKKyAgQ09NUEFUXzEgKE9QXzEyMCAoKSk7Cit9CisKKworCisvLyBYT1JJCitycnJyciwxMTAxMDEsUlJSUlIgKyBpaWlpaWlpaWlpaWlpaWlpOlZJOjo6eG9yaQorInhvcmkgPHVpbW0xNj4sIHI8cmVnMT4sIHI8cmVnMj4iCit7CisgIENPTVBBVF8yIChPUF82QTAgKCkpOworfQorCisKKworLy8gWlhCCiswMDAwMDAwMDEwMCxSUlJSUjpJOjo6enhiCisqdjg1MGUKKyp2ODUwZWEKKyJ6eGIgcjxyZWcxPiIKK3sKKyAgVFJBQ0VfQUxVX0lOUFVUMSAoR1JbcmVnMV0pOworICBHUltyZWcxXSA9IEdSW3JlZzFdICYgMHhmZjsKKyAgVFJBQ0VfQUxVX1JFU1VMVCAoR1JbcmVnMV0pOworfQorCisvLyBaWEgKKzAwMDAwMDAwMTEwLFJSUlJSOkk6Ojp6eGgKKyp2ODUwZQorKnY4NTBlYQorInp4aCByPHJlZzE+IgoreworICBUUkFDRV9BTFVfSU5QVVQxIChHUltyZWcxXSk7CisgIEdSW3JlZzFdID0gR1JbcmVnMV0gJiAweGZmZmY7CisgIFRSQUNFX0FMVV9SRVNVTFQgKEdSW3JlZzFdKTsKK30KKworCisvLyBSaWdodCBmaWVsZCBtdXN0IGJlIHplcm8gc28gdGhhdCBpdCBkb2Vzbid0IGNsYXNoIHdpdGggRElWSAorLy8gTGVmdCBmaWVsZCBtdXN0IGJlIG5vbi16ZXJvIHNvIHRoYXQgaXQgZG9lc24ndCBjbGFzaCB3aXRoIFNXSVRDSAorMTExMTEsMDAwMDEwLDAwMDAwOkk6OjpicmVhaworeworICBzaW1fZW5naW5lX2hhbHQgKFNELCBDUFUsIE5VTEwsIGNpYSwgc2ltX3N0b3BwZWQsIFNJTV9TSUdUUkFQKTsKK30KKworCisKKy8vIERJVkhOCitycnJyciwxMTExMTEsUlJSUlIgKyB3d3d3dywwMTAxMCxpaWlpLDAwOlhJOjo6ZGl2aG4KKyp2ODUwZWEKKyJkaXZobiA8aW1tNT4sIHI8cmVnMT4sIHI8cmVnMj4sIHI8cmVnMz4iCit7CisgIHNpZ25lZDMyIHF1b3RpZW50OworICBzaWduZWQzMiByZW1haW5kZXI7CisgIHNpZ25lZDMyIGRpdmlkZV9ieTsKKyAgc2lnbmVkMzIgZGl2aWRlX3RoaXM7CisgIGJvb2xlYW4gb3ZlcmZsb3cgPSBmYWxzZTsKKyAgU0FWRV8yOworICAgICAgCisgIHRyYWNlX2lucHV0ICgiZGl2aG4iLCBPUF9JTU1fUkVHX1JFR19SRUcsIDApOworCisgIGRpdmlkZV9ieSAgID0gRVhURU5EMTYgKFN0YXRlLnJlZ3NbIHJlZzEgXSk7CisgIGRpdmlkZV90aGlzID0gU3RhdGUucmVnc1sgcmVnMiBdOworICAKKyAgZGl2biAoaW1tNSwgZGl2aWRlX2J5LCBkaXZpZGVfdGhpcywgJiBxdW90aWVudCwgJiByZW1haW5kZXIsICYgb3ZlcmZsb3cpOworICAKKyAgU3RhdGUucmVnc1sgcmVnMiBdID0gcXVvdGllbnQ7CisgIFN0YXRlLnJlZ3NbIHJlZzMgXSA9IHJlbWFpbmRlcjsKKyAgCisgIC8qIFNldCBjb25kaXRpb24gY29kZXMuICAqLworICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WKTsKKyAgCisgIGlmIChvdmVyZmxvdykgICAgICBQU1cgfD0gUFNXX09WOworICBpZiAocXVvdGllbnQgPT0gMCkgUFNXIHw9IFBTV19aOworICBpZiAocXVvdGllbnQgPCAgMCkgUFNXIHw9IFBTV19TOworICAKKyAgdHJhY2Vfb3V0cHV0IChPUF9JTU1fUkVHX1JFR19SRUcpOworfQorCisKKworLy8gRElWSFVOCitycnJyciwxMTExMTEsUlJSUlIgKyB3d3d3dywwMTAxMCxpaWlpLDEwOlhJOjo6ZGl2aHVuCisqdjg1MGVhCisiZGl2aHVuIDxpbW01PiwgcjxyZWcxPiwgcjxyZWcyPiwgcjxyZWczPiIKK3sKKyAgc2lnbmVkMzIgcXVvdGllbnQ7CisgIHNpZ25lZDMyIHJlbWFpbmRlcjsKKyAgc2lnbmVkMzIgZGl2aWRlX2J5OworICBzaWduZWQzMiBkaXZpZGVfdGhpczsKKyAgYm9vbGVhbiBvdmVyZmxvdyA9IGZhbHNlOworICBTQVZFXzI7CisgICAgICAKKyAgdHJhY2VfaW5wdXQgKCJkaXZodW4iLCBPUF9JTU1fUkVHX1JFR19SRUcsIDApOworICAKKyAgZGl2aWRlX2J5ICAgPSBTdGF0ZS5yZWdzWyByZWcxIF0gJiAweGZmZmY7CisgIGRpdmlkZV90aGlzID0gU3RhdGUucmVnc1sgcmVnMiBdOworICAKKyAgZGl2dW4gKGltbTUsIGRpdmlkZV9ieSwgZGl2aWRlX3RoaXMsICYgcXVvdGllbnQsICYgcmVtYWluZGVyLCAmIG92ZXJmbG93KTsKKyAgCisgIFN0YXRlLnJlZ3NbIHJlZzIgXSA9IHF1b3RpZW50OworICBTdGF0ZS5yZWdzWyByZWczIF0gPSByZW1haW5kZXI7CisgIAorICAvKiBTZXQgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PVik7CisgIAorICBpZiAob3ZlcmZsb3cpICAgICAgUFNXIHw9IFBTV19PVjsKKyAgaWYgKHF1b3RpZW50ID09IDApIFBTVyB8PSBQU1dfWjsKKyAgaWYgKHF1b3RpZW50ICYgMHg4MDAwMDAwMCkgUFNXIHw9IFBTV19TOworCisgIHRyYWNlX291dHB1dCAoT1BfSU1NX1JFR19SRUdfUkVHKTsKK30KKworCisKKy8vIERJVk4KK3JycnJyLDExMTExMSxSUlJSUiArIHd3d3d3LDAxMDExLGlpaWksMDA6WEk6OjpkaXZuCisqdjg1MGVhCisiZGl2biA8aW1tNT4sIHI8cmVnMT4sIHI8cmVnMj4sIHI8cmVnMz4iCit7CisgIHNpZ25lZDMyIHF1b3RpZW50OworICBzaWduZWQzMiByZW1haW5kZXI7CisgIHNpZ25lZDMyIGRpdmlkZV9ieTsKKyAgc2lnbmVkMzIgZGl2aWRlX3RoaXM7CisgIGJvb2xlYW4gb3ZlcmZsb3cgPSBmYWxzZTsKKyAgU0FWRV8yOworICAgICAgCisgIHRyYWNlX2lucHV0ICgiZGl2biIsIE9QX0lNTV9SRUdfUkVHX1JFRywgMCk7CisKKyAgZGl2aWRlX2J5ICAgPSBTdGF0ZS5yZWdzWyByZWcxIF07CisgIGRpdmlkZV90aGlzID0gU3RhdGUucmVnc1sgcmVnMiBdOworCisgIGRpdm4gKGltbTUsIGRpdmlkZV9ieSwgZGl2aWRlX3RoaXMsICYgcXVvdGllbnQsICYgcmVtYWluZGVyLCAmIG92ZXJmbG93KTsKKyAgICAgIAorICBTdGF0ZS5yZWdzWyByZWcyIF0gPSBxdW90aWVudDsKKyAgU3RhdGUucmVnc1sgcmVnMyBdID0gcmVtYWluZGVyOworICAgICAgCisgIC8qIFNldCBjb25kaXRpb24gY29kZXMuICAqLworICBQU1cgJj0gfihQU1dfWiB8IFBTV19TIHwgUFNXX09WKTsKKyAgCisgIGlmIChvdmVyZmxvdykgICAgICBQU1cgfD0gUFNXX09WOworICBpZiAocXVvdGllbnQgPT0gMCkgUFNXIHw9IFBTV19aOworICBpZiAocXVvdGllbnQgPCAgMCkgUFNXIHw9IFBTV19TOworICAKKyAgdHJhY2Vfb3V0cHV0IChPUF9JTU1fUkVHX1JFR19SRUcpOworfQorCisKKworLy8gRElWVU4KK3JycnJyLDExMTExMSxSUlJSUiArIHd3d3d3LDAxMDExLGlpaWksMTA6WEk6OjpkaXZ1bgorKnY4NTBlYQorImRpdnVuIDxpbW01PiwgcjxyZWcxPiwgcjxyZWcyPiwgcjxyZWczPiIKK3sKKyAgc2lnbmVkMzIgcXVvdGllbnQ7CisgIHNpZ25lZDMyIHJlbWFpbmRlcjsKKyAgc2lnbmVkMzIgZGl2aWRlX2J5OworICBzaWduZWQzMiBkaXZpZGVfdGhpczsKKyAgYm9vbGVhbiBvdmVyZmxvdyA9IGZhbHNlOworICBTQVZFXzI7CisKKyAgdHJhY2VfaW5wdXQgKCJkaXZ1biIsIE9QX0lNTV9SRUdfUkVHX1JFRywgMCk7CisKKyAgZGl2aWRlX2J5ICAgPSBTdGF0ZS5yZWdzWyByZWcxIF07CisgIGRpdmlkZV90aGlzID0gU3RhdGUucmVnc1sgcmVnMiBdOworCisgIGRpdnVuIChpbW01LCBkaXZpZGVfYnksIGRpdmlkZV90aGlzLCAmIHF1b3RpZW50LCAmIHJlbWFpbmRlciwgJiBvdmVyZmxvdyk7CisgICAgICAKKyAgU3RhdGUucmVnc1sgcmVnMiBdID0gcXVvdGllbnQ7CisgIFN0YXRlLnJlZ3NbIHJlZzMgXSA9IHJlbWFpbmRlcjsKKyAgICAgIAorICAvKiBTZXQgY29uZGl0aW9uIGNvZGVzLiAgKi8KKyAgUFNXICY9IH4oUFNXX1ogfCBQU1dfUyB8IFBTV19PVik7CisgICAgICAKKyAgaWYgKG92ZXJmbG93KSAgICAgIFBTVyB8PSBQU1dfT1Y7CisgIGlmIChxdW90aWVudCA9PSAwKSBQU1cgfD0gUFNXX1o7CisgIGlmIChxdW90aWVudCAmIDB4ODAwMDAwMDApIFBTVyB8PSBQU1dfUzsKKworICB0cmFjZV9vdXRwdXQgKE9QX0lNTV9SRUdfUkVHX1JFRyk7Cit9CisKKworCisvLyBTRElWSE4KK3JycnJyLDExMTExMSxSUlJSUiArIHd3d3d3LDAwMTEwLGlpaWksMDA6WEk6OjpzZGl2aG4KKyp2ODUwZWEKKyJzZGl2aG4gPGltbTU+LCByPHJlZzE+LCByPHJlZzI+LCByPHJlZzM+IgoreworICBDT01QQVRfMiAoT1BfMTgwMDdFMCAoKSk7Cit9CisKKworCisvLyBTRElWSFVOCitycnJyciwxMTExMTEsUlJSUlIgKyB3d3d3dywwMDExMCxpaWlpLDEwOlhJOjo6c2Rpdmh1bgorKnY4NTBlYQorInNkaXZodW4gPGltbTU+LCByPHJlZzE+LCByPHJlZzI+LCByPHJlZzM+IgoreworICBDT01QQVRfMiAoT1BfMTgyMDdFMCAoKSk7Cit9CisKKworCisvLyBTRElWTgorcnJycnIsMTExMTExLFJSUlJSICsgd3d3d3csMDAxMTEsaWlpaSwwMDpYSTo6OnNkaXZuCisqdjg1MGVhCisic2Rpdm4gPGltbTU+LCByPHJlZzE+LCByPHJlZzI+LCByPHJlZzM+IgoreworICBDT01QQVRfMiAoT1BfMUMwMDdFMCAoKSk7Cit9CisKKworCisvLyBTRElWVU4KK3JycnJyLDExMTExMSxSUlJSUiArIHd3d3d3LDAwMTExLGlpaWksMTA6WEk6OjpzZGl2dW4KKyp2ODUwZWEKKyJzZGl2dW4gPGltbTU+LCByPHJlZzE+LCByPHJlZzI+LCByPHJlZzM+IgoreworICBDT01QQVRfMiAoT1BfMUMyMDdFMCAoKSk7Cit9CisKKworCisvLyBQVVNITUwKKzAwMDAwMTExMTExMCxMTExMICsgTExMTExMTExMTExMLFMsMDAxOlhJVjo6OnB1c2htbAorKnY4NTBlYQorInB1c2htbCA8bGlzdDE4PiIKK3sKKyAgaW50IGk7CisgIFNBVkVfMjsKKyAgCisgIHRyYWNlX2lucHV0ICgicHVzaG1sIiwgT1BfUFVTSFBPUDMsIDApOworICAKKyAgLyogU3RvcmUgdGhlIHJlZ2lzdGVycyB3aXRoIGxvd2VyIG51bWJlciByZWdpc3RlcnMgYmVpbmcgcGxhY2VkIGF0CisgICAgIGhpZ2hlciBhZGRyZXNzZXMuICAqLworCisgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQorICAgIGlmICgoT1BbM10gJiAoMSA8PCB0eXBlM19yZWdzWyBpIF0pKSkKKyAgICAgIHsKKwlTUCAtPSA0OworCXN0b3JlX21lbSAoU1AgJiB+IDMsIDQsIFN0YXRlLnJlZ3NbIGkgKyAxIF0pOworICAgICAgfQorICAKKyAgaWYgKE9QWzNdICYgKDEgPDwgMykpCisgICAgeworICAgICAgU1AgLT0gNDsKKyAgICAgIAorICAgICAgc3RvcmVfbWVtIChTUCAmIH4gMywgNCwgUFNXKTsKKyAgICB9CisgIAorICBpZiAoT1BbM10gJiAoMSA8PCAxOSkpCisgICAgeworICAgICAgU1AgLT0gODsKKyAgICAgIAorICAgICAgaWYgKChQU1cgJiBQU1dfTlApICYmICgoUFNXICYgUFNXX0VQKSA9PSAwKSkKKwl7CisJICBzdG9yZV9tZW0gKChTUCArIDQpICYgfiAzLCA0LCBGRVBDKTsKKwkgIHN0b3JlX21lbSAoIFNQICAgICAgJiB+IDMsIDQsIEZFUFNXKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3RvcmVfbWVtICgoU1AgKyA0KSAmIH4gMywgNCwgRUlQQyk7CisJICBzdG9yZV9tZW0gKCBTUCAgICAgICYgfiAzLCA0LCBFSVBTVyk7CisJfQorICAgIH0KKyAgCisgIHRyYWNlX291dHB1dCAoT1BfUFVTSFBPUDIpOworfQorCisKKworLy8gUFVTSEhNTAorMDAwMDAxMTExMTEwLExMTEwgKyBMTExMTExMTExMTEwsUywwMTE6WElWOjo6cHVzaG1oCisqdjg1MGVhCisicHVzaGhtbCA8bGlzdDE4PiIKK3sKKyAgQ09NUEFUXzIgKE9QXzMwN0UwICgpKTsKK30KKworCisKKy8vIFBPUE1MCiswMDAwMDExMTExMTEsTExMTCArIExMTExMTExMTExMTCxTLDAwMTpYSVY6Ojpwb3BtbAorKnY4NTBlYQorInBvcG1sIDxsaXN0MTg+IgoreworICBDT01QQVRfMiAoT1BfMTA3RjAgKCkpOworfQorCisKKworLy8gUE9QTUgKKzAwMDAwMTExMTExMSxMTExMICsgTExMTExMTExMTExMLFMsMDExOlhJVjo6OnBvcG1oCisqdjg1MGVhCisicG9wbWggPGxpc3QxOD4iCit7CisgIENPTVBBVF8yIChPUF8zMDdGMCAoKSk7Cit9CisKZGlmZiAtLWdpdCBhL3NpbS92ODUwL3Y4NTBfc2ltLmggYi9zaW0vdjg1MC92ODUwX3NpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNTk3MjcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdjg1MC92ODUwX3NpbS5oCkBAIC0wLDAgKzEsOCBAQAorc3RydWN0IHNpbW9wcyAKK3sKKyAgdW5zaWduZWQgbG9uZyAgIG9wY29kZTsKKyAgdW5zaWduZWQgbG9uZyAgIG1hc2s7CisgIGludCAoKiBmdW5jKSBQQVJBTVMgKCh2b2lkKSk7CisgIGludCAgICBudW1vcHM7CisgIGludCAgICBvcGVyYW5kc1sxMl07Cit9OwpkaWZmIC0tZ2l0IGEvc2ltL3c2NS9DaGFuZ2VMb2cgYi9zaW0vdzY1L0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzJkZjFiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3c2NS9DaGFuZ2VMb2cKQEAgLTAsMCArMSwxMzYgQEAKK1N1biBBcHIgMjYgMTU6MzE6NTUgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGU+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1N1biBBcHIgMjYgMTU6MTk6MDggMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgorCisJKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KKwkqIGNvbmZpZ3VyZS5pbjogUmV2ZXJ0ZWQgY2hhbmdlIG9mIEFwciAyNDsgdXNlIHNpbmNsdWRlIGFnYWluLgorCURvbid0IGNhbGwgQUNfQ19DUk9TUy4KKworRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworRnJpIEFwciAyNCAxMToxNzo0NiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGFjY29uZmlnLmg6IFJlbW92ZWQuCisJKiBjb25maWd1cmUuaW46IENhbGwgQ1lfR05VX0dFVFRFWFQuCisJKiBNYWtlZmlsZS5pbiAoSU5UTExJQlMpOiBOZXcgbWFjcm8uCisJKElOVExERVBTKTogTGlrZXdpc2UuCisJKCQoUlVOX1BST0cpKTogRGVwZW5kIG9uIElOVExERVBTOyBsaW5rIGFnYWluc3QgSU5UTExJQlMuCisJKHRvcF9idWlsZGRpcik6IE5ldyBtYWNyby4KKworV2VkIEFwciAyMiAxNDoyOTo1MCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi4xMi4xLgorCitUdWUgRmViIDE3IDEyOjUyOjI0IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogcnVuLmMgKG1haW4pOiBQYXNzIGxlbmd0aCBpbnRvIHNpbV9mZXRjaF9yZWdpc3Rlci4KKworCSogaW50ZXJwLmMgKHNpbV9zdG9yZV9yZWdpc3Rlciwgc2ltX2ZldGNoX3JlZ2lzdGVyKTogUGFzcyBpbgorIAlsZW5ndGggcGFyYW1ldGVyLiBSZXR1cm4gLTEuCisKK1R1ZSBBdWcgMjYgMTA6NDM6MTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX2tpbGwpOiBEZWxldGUuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBBZGQgQUJGRCBhcmd1bWVudC4gIFNldCBQQyBmcm9tIHNhbWUuCisKK01vbiBBdWcgMjUgMTY6MzQ6MzMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBBZGQgQUJGRCBhcmd1bWVudC4gQ2hhbmdlIEFSR1YgdG8gUEFSR1YuCisKK1R1ZSBNYXkgMjAgMTA6MjQ6NTQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpbnRlcnAuYyAoc2ltX29wZW4pOiBBZGQgY2FsbGJhY2sgYXJndW1lbnQuCisKK1R1ZSBBcHIgMTUgMTQ6NTU6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCisJKElOU1RBTExfWEZPUk0sIElOU1RBTExfWEZPUk0xKTogUmVtb3ZlLgorCShpbnN0YWxsKTogRGVwZW5kIHVwb24gaW5zdGFsbGRpcnMuICBVc2UgJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorCWRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZyAkKElOU1RBTExfWEZPUk0pIGFuZAorCSQoSU5TVEFMTF9YRk9STTEpLgorCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCisKK01vbiBBcHIgMTQgMTY6MzA6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IENoYW5nZSBpbnN0YWxsLnNoIHRvIGluc3RhbGwtc2guCisKK1dlZCBBcHIgIDIgMTU6NDA6MzAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogaW50ZXJwLmMgKHNpbV9vcGVuKTogTmV3IGFyZyBga2luZCcuICBgbmFtZSBpcyBub3cgYGFyZ3YnLgorCitUaHUgT2N0ICAzIDE2OjE3OjU5IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKwkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IE1vdmUgY29uZmlnLmxvZyB0byBkaXN0Y2xlYW4uCisKK1dlZCBKdW4gMjYgMTI6MzA6NDUgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKKworICAgICAgICAqIE1ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyLAorICAgICAgICBJTlNUQUxMX1BST0dSQU0sIElOU1RBTExfREFUQSk6IFVzZSBhdXRvY29uZi1zZXQgdmFsdWVzLgorICAgICAgICAoZG9jZGlyKTogUmVtb3ZlZC4KKyAgICAgICAgKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IGF1dG9jb25mIDIuNSBvciBoaWdoZXIuCisgICAgICAgIChBQ19QUk9HX0lOU1RBTEwpOiBBZGRlZC4KKyAgICAgICAgKiBjb25maWd1cmU6IFJlYnVpbHQuCisKK1dlZCBGZWIgMjEgMTI6MTc6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjcuCisKK1RodSBPY3QgMTkgMjE6NDQ6MTQgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlIHRhYnMgZnJvbSBvdGhlcndpc2UgZW1wdHkgbGluZS4KKwlDb25mdXNlcyBtYW55IG9sZGVyIG5vbi1HTlUgdmVyc2lvbnMgb2YgIm1ha2UiLgorCitUdWUgT2N0IDEwIDExOjEzOjAxIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgorCisJKiBNYWtlZmlsZS5pbiAoQklTT05GTEFHUyk6IFJlbW92ZSBtYWNyby4KKworV2VkIFNlcCAyMCAxMzozNTo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIHJlYWxjbGVhbi4KKworRnJpIFNlcCAgOCAxNDowMzozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ29udmVydCB0byB1c2UgYXV0b2NvbmYuCisJKiBjb25maWd1cmU6IE5ldyBmaWxlLCBidWlsdCBieSBhdXRvY29uZi4KKwkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgorCSogY29uZmlnLmluOiBOZXcgZmlsZSwgYnVpbHQgYnkgYXV0b2hlYWRlci4KKwkqIE1ha2VmaWxlLmluOiBWYXJpb3VzIGNoYW5nZXMgZm9yIG5ldyBjb25maWd1cmUgc2NyaXB0LiAgQWxzbzoKKwkoSU5TVEFMTCk6IEdvIHVwIHR3byBsZXZlbHMsIG5vdCBvbmUuCisJKEFMTE9DQSwgTUFMTE9DLCBPUENPREVTKTogUmVtb3ZlLgorCShnZW5jb2RlKTogVXNlICQoQ0NfRk9SX0JVSUxEKS4KKwkoY2FzZS5vKTogUmVtb3ZlLgorCShydW4ubywgaW50ZXJwLm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaC4KKwkqIGludGVycC5jOiBJbmNsdWRlICJjb25maWcuaCIuICBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuCisJSW5jbHVkZSA8c3RkbGliLmg+LCA8dGltZS5oPiwgYW5kIDx1bmlzdGQuaD4gaWYgdGhleSBleGlzdC4KKwkqIHJ1bi5jOiBJbmNsdWRlICJjb25maWcuaCIuICBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBJbmNsdWRlCisJPHN0ZGxpYi5oPiBpZiBpdCBleGlzdHMuICBJbmNsdWRlICJnZXRvcHQuaCIuICBEZWNsYXJlIHByaW50ZiBpZgorCW5lY2Vzc2FyeS4KKworVGh1IEF1ZyAgMyAxMDo0NTozNyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KKworCSogVXBkYXRlIGFsbCBGU0YgYWRkcmVzc2VzIGV4Y2VwdCB0aG9zZSBpbiBDT1BZSU5HKiBmaWxlcy4KKworV2VkIEp1bCAgNSAxNjoxMjo1MyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+CisKKwkqIHc2NS5tdDogUmVtb3ZlZC4KKworV2VkIE1heSAyNCAxNjozMTozOCAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRml4IHR5cG8gaW4gbGFzdCBjaGFuZ2UuCisKK01vbiBNYXIgMjcgMTA6MzI6MzQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgorCisJKiBydW4uYzogcGFyc2UgYXJndW1lbnRzIHdpdGggZ2V0b3B0KCkuCisKK1R1ZSBGZWIgMjggMTc6MzE6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IFVzZSAuLi8uLi9iZmQvaG9zdHMvc3RkLWhvc3QuaCBpZiBzcGVjaWZpYworCWhvc3QgdW5hdmFpbGFibGUuCisKKwkqIFN0YXJ0ZWQgQ2hhbmdlTG9nLgpkaWZmIC0tZ2l0IGEvc2ltL3c2NS9NYWtlZmlsZS5pbiBiL3NpbS93NjUvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk0M2JkNQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS93NjUvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwyNDcgQEAKKyMgTWFrZWZpbGUgZm9yIEdOVSBiaW5hcnktZmlsZSB1dGlsaXRpZXMKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIGJpbnV0aWxzLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKworVlBBVEggPSBAc3JjZGlyQAorc3JjZGlyID0gQHNyY2RpckAKKworcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorCitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorYmluZGlyID0gQGJpbmRpckAKK2xpYmRpciA9IEBsaWJkaXJACit0b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpCisKK2RhdGFkaXIgPSBAZGF0YWRpckAKK21hbmRpciA9IEBtYW5kaXJACittYW4xZGlyID0gJChtYW5kaXIpL21hbjEKK21hbjJkaXIgPSAkKG1hbmRpcikvbWFuMgorbWFuM2RpciA9ICQobWFuZGlyKS9tYW4zCittYW40ZGlyID0gJChtYW5kaXIpL21hbjQKK21hbjVkaXIgPSAkKG1hbmRpcikvbWFuNQorbWFuNmRpciA9ICQobWFuZGlyKS9tYW42CittYW43ZGlyID0gJChtYW5kaXIpL21hbjcKK21hbjhkaXIgPSAkKG1hbmRpcikvbWFuOAorbWFuOWRpciA9ICQobWFuZGlyKS9tYW45CitpbmZvZGlyID0gQGluZm9kaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACisKKyMgVGhpcyBjYW4gYmUgcmVmZXJlbmNlZCBieSB0aGUgZ2V0dGV4dCBjb25maWd1cmF0aW9uIGNvZGUuCit0b3BfYnVpbGRkaXIgPSAuLgorCitTSEVMTCA9IC9iaW4vc2gKKworSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACisKK0FSID0gQEFSQAorQVJfRkxBR1MgPSBxdgorQ0MgPSBAQ0NACitDRkxBR1MgPSBAQ0ZMQUdTQAorTUFLRUlORk8gPSBtYWtlaW5mbworVEVYSTJEVkkgPSB0ZXhpMmR2aQorUkFOTElCID0gQFJBTkxJQkAKK1RFWEkyUk9GRj10ZXhpMnJvZmYKK01BS0VPVkVSUklERVM9CitDQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAorCitIREVGSU5FUyA9IEBIREVGSU5FU0AKK1RERUZJTkVTID0KKworIyBDb21tZW50IHRoZXNlIG91dCBpZiB1c2luZyBsZXguCisjIERpc3RyaWJ1dGlvbiB2ZXJzaW9uCisKKyMgRGlzdHJpYnV0aW9uIG5hbWUKKworIyBXaGVyZSB0byBmaW5kIHRleGluZm8udGV4IHRvIGZvcm1hdCBkb2NuIHdpdGggVGVYCitURVhJRElSID0gJChzcmNkaXIpLy4uL3RleGluZm8KKworIyBUaGVzZSBzaG91bGQgYWxsIGJlIHRoZSBzYW1lIHByb2dyYW0gdG9vLgorUlVOX1BST0c9cnVuCitTSU1fTElCPWxpYnNpbS5hCitBRERMX0xJQlM9CisKK1BST0dTID0gJChSVU5fUFJPRykKK0xJQlM9ICQoU0lNX0xJQikKKworRElTVFNUVUZGID0gJChQUk9HUykgJChMSUJTKQorCitCQVNFRElSID0gJChzcmNkaXIpLy4uLy4uCitCRkRESVIgPSAkKEJBU0VESVIpL2JmZAorSU5DRElSCT0gJChCQVNFRElSKS9pbmNsdWRlCitHREJESVIgPSAkKEJBU0VESVIpL2dkYgorSU5DTFVERVMgPSAtSS4gLUkkKHNyY2RpcikgLUkuLi8uLi9iZmQgLUkkKEJGRERJUikgLUkkKElOQ0RJUikgLUkkKEdEQkRJUikKKworIyMjIyBob3N0IGFuZCB0YXJnZXQgZGVwZW5kYW50IE1ha2VmaWxlIGZyYWdtZW50cyBjb21lIGluIGhlcmUuCisjIyMKKworQUxMX0NGTEFHUyA9ICQoSU5DTFVERVMpICQoSERFRklORVMpICQoVERFRklORVMpICQoQ0ZMQUdTKQorCisuYy5vOgorCSQoQ0MpIC1jICQoQUxMX0NGTEFHUykgJDwKKworTElCSUJFUlRZID0gLi4vLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCisKK0JGRCA9IC4uLy4uL2JmZC9saWJiZmQuYQorCitJTlRMTElCUyA9IEBJTlRMTElCU0AKK0lOVExERVBTID0gQElOVExERVBTQAorCitSVU5URVNUID0gcnVudGVzdAorUlVOVEVTVEZMQUdTID0gCitGTEFHU19UT19QQVNTID0gXAorCSJDQz0kKENDKSIgXAorCSJDRkxBR1M9JChDRkxBR1MpIiBcCisJIlJVTlRFU1Q9JChSVU5URVNUKSIgXAorCSJSVU5URVNURkxBR1M9JChSVU5URVNURkxBR1MpIgorCisjDAorIyMgVGhlIHJ1bGVzCisKK2FsbDogJChMSUJTKSAkKFBST0dTKQorCisKKyQoUlVOX1BST0cpOiAkKExJQlMpIHJ1bi5vICQoQkZEKSAkKElOVExERVBTKQorCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICQoUlVOX1BST0cpIHJ1bi5vICQoU0lNX0xJQikgJChCRkQpICQoSU5UTExJQlMpICQoTElCSUJFUlRZKQorCiskKFNJTV9MSUIpOiBjYXNlLm8gaW50ZXJwLm8KKwlybSAtZiAkKFNJTV9MSUIpCisJJChBUikgJChBUl9GTEFHUykgJChTSU1fTElCKSBjYXNlLm8gaW50ZXJwLm8KKwkkKFJBTkxJQikgJChTSU1fTElCKQorCitjYXNlLmM6IGdlbmNvZGUKKwkuL2dlbmNvZGUgLWMgPmNhc2UuYyAgICAgICAgICAgICAgICAgICAgIDsgXAorCWlmIFsgLXggL3Vzci9sYXRlc3QvYmluL2luZGVudCBdIDsgdGhlbiAgICBcCisJCS91c3IvbGF0ZXN0L2Jpbi9pbmRlbnQgY2FzZS5jICAgIDsgXAorCWZpCisKK29wdGFibGU6Z2VuY29kZQorCS4vZ2VuY29kZSA+b3B0YWJsZQorCS4vZ2VuY29kZSAtYSA+JChzcmNkaXIpLy4uLy4uL29wY29kZXMvdzY1LW9wYy5oCisKK2dlbmNvZGU6Z2VuY29kZS5jCisJJChDQ19GT1JfQlVJTEQpIC1vIGdlbmNvZGUgJDwKKworcnVuLm86cnVuLmMgY29uZmlnLmgKK2ludGVycC5vOmludGVycC5jIGNvbmZpZy5oCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCittb3N0bHljbGVhbjoKKwktcm0gLWYgKi5vICp+IFwjKiBjb3JlIGJpbnV0aWxzLj8/IGJpbnV0aWxzLj8/PyBjYXNlLmMKKworY2xlYW46IG1vc3RseWNsZWFuCisJLXJtIC1mICQoUFJPR1MpICoubyAqLmEKKworZGlzdGNsZWFuOgorCS1ybSAtZiBNYWtlZmlsZSBjb25maWcuc3RhdHVzIHN5c2RlcC5oICoubyAqfiBcIyogY29yZSB5LiogXAorCQliaW51dGlscy4/PyBiaW51dGlscy4/P3MgYmludXRpbHMuYXV4IGJpbnV0aWxzLmxvZyBcCisJCWJpbnV0aWxzLnRvYyBnZW5jb2RlIHJ1biBjb25maWcubG9nCisJLXJtIC1mICQoUFJPR1MpIGNvbmZpZy5oIHN0YW1wLWgKKworbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW46IGNsZWFuIGRpc3RjbGVhbgorCS1ybSAtZiAkKERJU1RTVFVGRikgVEFHUworCitldGFncyB0YWdzOiBUQUdTCisKK1RBR1M6IGZvcmNlCisJZXRhZ3MgJChJTkNESVIpLyouaCAkKHNyY2RpcikvKi5baGNdIAorCitpbnN0YWxsOiBhbGwgaW5zdGFsbGRpcnMKKwlmb3IgaSBpbiAkKFBST0dTKSA7IGRvIFwKKwkgIG49YGVjaG8gJCRpIHwgc2VkIC1lICdzLy5uZXcvLycgfCBzZWQgJyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknYDsgXAorCSAgJChJTlNUQUxMX1BST0dSQU0pICQkaSAkKGJpbmRpcikvJCRuOyBcCisJZG9uZQorCitpbnN0YWxsZGlyczoKKwkkKFNIRUxMKSAkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyAkKGJpbmRpcikKKworaW5zdGFsbC1pbmZvOgorCitjbGVhbi1pbmZvOgorCS1ybSAtcmYgKi5pbmZvKgorCisjIE1ha2luZyBhIGRpc3Q6CisjIGN2cyBydGFnIGJpbnV0aWxzLXgteXkgbGQrdXRpbHMKKyMgY3ZzIGNvIC1yIGJpbnV0aWxzLXgteXkgbGQrdXRpbHMKKyMgY2Qge0hFUkV9OyBtYWtlIGRpc3QgWy1mIE1ha2VmaWxlLmluXQorCitkaXN0OiAkKERJU1RfTkFNRSkudGFyLnoKKworZGlzdHN0dWZmOiAkKERJU1RTVFVGRikKKworJChESVNUX05BTUUpLnRhci56OgorCWNkIC4uLy4uOyBybSAtZiAkKERJU1RfTkFNRSk7IGxuIC1zIGRldm8gJChESVNUX05BTUUpCisJbWFrZSBkaXN0c3R1ZmYgLWYgTWFrZWZpbGUuaW4KKwljZCAuLi9sZDsgbWFrZSBkaXN0c3R1ZmYgLWYgTWFrZWZpbGUuaW4KKwljZCAuLi9ncHJvZjsgbWFrZSBkaXN0c3R1ZmYgLWYgTWFrZWZpbGUuaW4KKwljZCAuLi90ZXhpbmZvOyBtdiB0ZXhpbmZvLnRleCAuLjsgcm0gLXJmICo7IG12IC4uL3RleGluZm8udGV4IC4KKwkjIFRha2Ugb3V0IHRleGluZm8gZnJvbSBjb25maWd1cmFibGUgZGlycworCW12IC4uL2NvbmZpZ3VyZS5pbiB0bXA7IFwKKwkgIHNlZCAtZSAnL15ob3N0X3Rvb2xzPS9zL3RleGluZm8gLy8nIDx0bXAgPi4uL2NvbmZpZ3VyZS5pbjsgcm0gdG1wCisJY2QgLi47IGNobW9kIG9nPXUgYGZpbmQgLiAtcHJpbnRgCisJY2QgLi4vLi47IHRhciBjaGYgLSAkKERJU1RfTkFNRSkgfCBnemlwID4kKERJU1RfTkFNRSkudGFyLnoKKwlybSAtcmYgLi4vLi4vJChESVNUX05BTUUpCisKKworIyBEdW1teSB0YXJnZXQgdG8gZm9yY2UgZXhlY3V0aW9uIG9mIGRlcGVuZGVudCB0YXJnZXRzLgorIworZm9yY2U6CisKKyMgVGFyZ2V0IHRvIHVuY29tbWVudCBob3N0LXNwZWNpZmljIGxpbmVzIGluIHRoaXMgbWFrZWZpbGUuICBTdWNoIGxpbmVzIG11c3QKKyMgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cmluZyBiZWdpbm5pbmcgaW4gY29sdW1uIDE6ICNfXzxob3N0bmFtZT5fXyMKKyMgT3JpZ2luYWwgTWFrZWZpbGUgaXMgYmFja2VkIHVwIGFzICdNYWtlZmlsZS5vbGQnLgorIworIyBJbnZva2Ugd2l0aDogIG1ha2UgbWFrZSBIT1NUPXh4eAorIworbWFrZToKKwktQGlmIHRlc3QgJChIT1NUKXggPSB4IDsgdGhlbiBcCisJCWVjaG8gJwdTcGVjaWZ5ICJtYWtlIG1ha2UgSE9TVD0/Pz8iJzsgXAorCQlleGl0IDE7IFwKKwlmaSA7IFwKKwlncmVwIC1zICJeI1RoZSBuZXh0IGxpbmUgd2FzIGdlbmVyYXRlZCBieSAnbWFrZSBtYWtlJyIgTWFrZWZpbGU7IFwKKwlpZiB0ZXN0ICQkPyA9IDAgOyB0aGVuCVwKKwkJZWNobyAiB01ha2VmaWxlIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIHdpdGggJ21ha2UgbWFrZSciO1wKKwkJZXhpdCAxOyBcCisJZmkgOyBcCisJbXYgLWYgTWFrZWZpbGUgTWFrZWZpbGUub2xkOyBcCisJZWNobyAiI1RoZSBuZXh0IGxpbmUgd2FzIGdlbmVyYXRlZCBieSAnbWFrZSBtYWtlJyIJID5NYWtlZmlsZSA7IFwKKwllY2hvICJIT1NUPSQoSE9TVCkiCQkJCQk+Pk1ha2VmaWxlIDsgXAorCWVjaG8JCQkJCQkJPj5NYWtlZmlsZSA7IFwKKwlzZWQgInMvXiNfXyQoSE9TVClfXyMvLyIgPCBNYWtlZmlsZS5vbGQJCQk+Pk1ha2VmaWxlCisKK01ha2VmaWxlOiBNYWtlZmlsZS5pbiBjb25maWcuc3RhdHVzCisJQ09ORklHX0ZJTEVTPU1ha2VmaWxlIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworY29uZmlnLmg6IHN0YW1wLWggOyBAdHJ1ZQorc3RhbXAtaDogY29uZmlnLmluIGNvbmZpZy5zdGF0dXMKKwlDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworY29uZmlnLnN0YXR1czogY29uZmlndXJlCisJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjaworCisjIyMgTG9jYWwgVmFyaWFibGVzOiAqKioKKyMjIyBtb2RlOmZ1bmRhbWVudGFsICoqKgorIyMjIHBhZ2UtZGVsaW1pdGVyOiAiXiMMIiAqKioKKyMjIyBFbmQ6ICoqKgorIyMjIGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zaW0vdzY1L2FjY29uZmlnLmggYi9zaW0vdzY1L2FjY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYxMTQwYwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS93NjUvYWNjb25maWcuaApAQCAtMCwwICsxLDE4IEBACisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgY2F0Z2V0cyBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfQ0FUR0VUUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCisjdW5kZWYgSEFWRV9HRVRURVhUCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLworI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKKworLyogV2hldGhlciBwcmludGYgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRpby5oPiBpcyBpbmNsdWRlZC4gICovCisjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9QUklOVEYKZGlmZiAtLWdpdCBhL3NpbS93NjUvY29uZmlnLmluIGIvc2ltL3c2NS9jb25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkMmJmNwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS93NjUvY29uZmlnLmluCkBAIC0wLDAgKzEsMTMxIEBACisvKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KKyN1bmRlZiBDX0FMTE9DQQorCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCisjdW5kZWYgY29uc3QKKworLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgorICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KKyN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KKyN1bmRlZiBIQVZFX0FMTE9DQQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KKyN1bmRlZiBIQVZFX0FMTE9DQV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KKyN1bmRlZiBIQVZFX01NQVAKKworLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KKyN1bmRlZiBpbmxpbmUKKworLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBvZmZfdAorCisvKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KKyN1bmRlZiBfUE9TSVhfU09VUkNFCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIHNpemVfdAorCisvKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKKyAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgorIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKKyBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgorICovCisjdW5kZWYgU1RBQ0tfRElSRUNUSU9OCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfR0VUVEVYVAorCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUENQWQorCisvKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KKyN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCisKKy8qIFdoZXRoZXIgcHJpbnRmIG11c3QgYmUgZGVjbGFyZWQgZXZlbiBpZiA8c3RkaW8uaD4gaXMgaW5jbHVkZWQuICAqLworI3VuZGVmIE5FRURfREVDTEFSQVRJT05fUFJJTlRGCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0RDR0VUVEVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRDV0QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9HRVRQQUdFU0laRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9NVU5NQVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfUFVURU5WCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NFVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TRVRMT0NBTEUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDQVNFQ01QCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUkNIUgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0FSR1pfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xPQ0FMRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9NQUxMT0NfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9OTF9UWVBFU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHRpbWUuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YWx1ZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfVkFMVUVTX0gKZGlmZiAtLWdpdCBhL3NpbS93NjUvY29uZmlndXJlIGIvc2ltL3c2NS9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGRkZDAxZAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS93NjUvY29uZmlndXJlCkBAIC0wLDAgKzEsMzMzMyBAQAorIyEgL2Jpbi9zaAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitzaW1faW5saW5lPSItRERFRkFVTFRfSU5MSU5FPTAiCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworIyBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGBnZXR0ZXh0Lm00Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlCisjIGluY2x1ZGVkIG1hY3JvcyBhc3N1bWUgQ3lnbnVzLXN0eWxlIHNvdXJjZSBhbmQgYnVpbGQgdHJlZXMuCisKKyMgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KKyMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisjCisjIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KKyMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCisjIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCisKKyMgc2VyaWFsIDMKKworCisKKworCisjIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCisKKworIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMQorCisKKworIyBDaGVjayB0byBzZWUgaWYgd2UncmUgcnVubmluZyB1bmRlciBDeWd3aW4zMiwgd2l0aG91dCB1c2luZworIyBBQ19DQU5PTklDQUxfKi4gIElmIHNvLCBzZXQgb3V0cHV0IHZhcmlhYmxlIENZR1dJTjMyIHRvICJ5ZXMiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICJubyIuCisKKworCisjIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIFdpbjMyLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgRVhFRVhUIHRvICIuZXhlIi4KKyMgT3RoZXJ3aXNlIHNldCBpdCB0byAiIi4KKworCisKKworIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCithY19oZWxwPSIkYWNfaGVscAorICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KK2J1aWxkPU5PTkUKK2NhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKK2V4ZWNfcHJlZml4PU5PTkUKK2hvc3Q9Tk9ORQorbm9fY3JlYXRlPQorbm9ub3B0PU5PTkUKK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3RhcmdldD1OT05FCit2ZXJib3NlPQoreF9pbmNsdWRlcz1OT05FCit4X2xpYnJhcmllcz1OT05FCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCitvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCitpbmZvZGlyPScke3ByZWZpeH0vaW5mbycKK21hbmRpcj0nJHtwcmVmaXh9L21hbicKKworIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorc3ViZGlycz0KK01GTEFHUz0gTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KK2FjX21heF9oZXJlX2xpbmVzPTEyCisKK2FjX3ByZXY9Citmb3IgYWNfb3B0aW9uCitkbworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIGFjX29wdGFyZz0gOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKworICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQorICAgIGFjX3ByZXY9YmluZGlyIDs7CisgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCisgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZCA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKKyAgfCAtLWRhPSopCisgICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisKKyAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCisgIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQorICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKKyAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCisgIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQorICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCisgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisgICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICAgIGNhdCA8PCBFT0YKK1VzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KK0NvbmZpZ3VyYXRpb246CisgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCisgIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQorICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKyAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQorRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KKyAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQorICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KKyAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCisgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCisgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworRU9GCisgICAgY2F0IDw8IEVPRgorSG9zdCB0eXBlOgorICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQorICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCisgIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KK0ZlYXR1cmVzIGFuZCBwYWNrYWdlczoKKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCisgIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQorICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCisgIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCisgIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCitFT0YKKyAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KKyAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgorICAgIGZpCisgICAgZXhpdCAwIDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0IDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgIGFjX3ByZXY9bGliZGlyIDs7CisgIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKKyAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKyAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKKyAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICBhY19wcmV2PW1hbmRpciA7OworICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCisgICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKQorICAgIG5vX2NyZWF0ZT15ZXMgOzsKKworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCisgICAgbm9fcmVjdXJzaW9uPXllcyA7OworCisgIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKKyAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCisgIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKKyAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKKyAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCisgIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKKyAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKyAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCisgICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OworICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQorICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgYWNfcHJldj1zaXRlIDs7CisgIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCisgICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCisgICAgYWNfcHJldj10YXJnZXQgOzsKKyAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCisgICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiIKKyAgICBleGl0IDAgOzsKKworICAtd2l0aC0qIHwgLS13aXRoLSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGNhc2UgIiRhY19vcHRpb24iIGluCisgICAgICAqPSopIDs7CisgICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisgICAgZXNhYworICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7CisKKyAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworCisgIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCisgIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQorICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAorICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKKyAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKworICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT1NYWtlZmlsZS5pbgorCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KKyAgYWNfcHJvZz0kMAorICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZmkKK3NyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAorCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZWxzZQorICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKyAgZmkKK2ZpCitmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKyAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCisgICAgLiAiJGFjX3NpdGVfZmlsZSIKKyAgZmkKK2RvbmUKKworaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCisgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIC4gJGNhY2hlX2ZpbGUKK2Vsc2UKKyAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCisgID4gJGNhY2hlX2ZpbGUKK2ZpCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2FjX2V4ZWV4dD0KK2FjX29iamV4dD1vCitpZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KKyAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKyAgICBhY19uPSBhY19jPScKKycgYWNfdD0nCScKKyAgZWxzZQorICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKyAgZmkKK2Vsc2UKKyAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CitmaQorCisKKworCisKK2FjX2F1eF9kaXI9Citmb3IgYWNfZGlyIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uOyBkbworICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKK2lmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gYGNkICRzcmNkaXI7cHdkYC8uLi8uLiAkc3JjZGlyL2BjZCAkc3JjZGlyO3B3ZGAvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2FjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKK2FjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgorYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCisKKworIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCisjIFRoZSBpbnB1dHMgYXJlOgorIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCisjCisjIFRoZSBydWxlcyBhcmU6CisjIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQorIyAgICBzYW1lIHRpbWUuCisjIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgorIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCisjICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgorIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgorIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgorY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCitOT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7CisqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKK2VzYWMKKworCisjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCitpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CitlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzExOiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKKworaG9zdF9hbGlhcz0kaG9zdAorY2FzZSAiJGhvc3RfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkKKyAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6CisgICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkgOzsKKyAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCitob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKK2VjaG8gIiRhY190IiIkaG9zdCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjczMjogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKwordGFyZ2V0X2FsaWFzPSR0YXJnZXQKK2Nhc2UgIiR0YXJnZXRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKwordGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAordGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK3RhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCit0YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NzUwOiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisKK2J1aWxkX2FsaWFzPSRidWlsZAorY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgorTk9ORSkKKyAgY2FzZSAkbm9ub3B0IGluCisgIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitidWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAorYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitidWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2J1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2CisKK3Rlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9CitlbHNlCisgICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KKyAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAorcyxcXCxcXFxcLGc7IHMsXCQsJCQsZworRU9GX1NFRAorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgorICBybSAtZiBjb25mdGVzdHNlZAorZmkKK3Rlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKyMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgordGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCisgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgorCisjIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCit0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Nzk0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2ZpCitmaQorQ0M9IiRhY19jdl9wcm9nX0NDIgoraWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJENDIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjYzsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4MjM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4NzM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisgOzsKKyAgICBlc2FjCisgIGZpCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkwNDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgOTE0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK21haW4oKXtyZXR1cm4oMCk7fQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjkxODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCisgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKyAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubworICBlbHNlCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKKyAgZmkKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkzODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Citjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjk0MzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTUyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCitlbHNlCisgIEdDQz0KK2ZpCisKK2FjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitDRkxBR1M9CitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjk3MTogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKK2lmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgorICBhY19jdl9wcm9nX2NjX2c9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfY2NfZz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgoraWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKK2VsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItZyAtTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9Ii1nIgorICBmaQorZWxzZQorICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENGTEFHUz0iLU8yIgorICBlbHNlCisgICAgQ0ZMQUdTPQorICBmaQorZmkKKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMDE0OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2lmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KKyAgICBjYXNlICIkYWNfZGlyLyIgaW4KKyAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKKyAgICAqKQorICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKyAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorICAgICAgIyBieSBkZWZhdWx0LgorICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbworICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisgICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisJICAgIDoKKwkgIGVsc2UKKwkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgorCSAgICBicmVhayAyCisJICBmaQorCWZpCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX0lGUyIKKworZmkKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQorICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KKyAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKKyAgZmkKK2ZpCitlY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworCisuICR7c3JjZGlyfS8uLi8uLi9iZmQvY29uZmlndXJlLmhvc3QKKworCisKK0FSPSR7QVItYXJ9CisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA3NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKK2ZpCitmaQorUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgoraWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KKyAgQ0NfRk9SX0JVSUxEPSckKENDKScKK2Vsc2UKKyAgQ0NfRk9SX0JVSUxEPWdjYworZmkKKworCitBTExfTElOR1VBUz0KK2VjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTExOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0CisgICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCisgIENQUD0iJHtDQy1jY30gLUUiCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExMjYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjExMzI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExNDMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjExNDk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExNjAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjExNjY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9L2xpYi9jcHAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTE5MTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1CitzZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3RtYWtlIDw8XEVPRgorYWxsOgorCUBlY2hvICdhY19tYWtldGVtcD0iJHtNQUtFfSInCitFT0YKKyMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcuLi4iLCB3aGljaCB3b3VsZCBjb25mdXNlIHVzLgorZXZhbCBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0bWFrZSAyPi9kZXYvbnVsbCB8IGdyZXAgdGVtcD1gCitpZiB0ZXN0IC1uICIkYWNfbWFrZXRlbXAiOyB0aGVuCisgIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PXllcworZWxzZQorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0bWFrZQorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X3Byb2dfbWFrZV8nJHthY19tYWtlfV9zZXRgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgU0VUX01BS0U9CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBTRVRfTUFLRT0iTUFLRT0ke01BS0UtbWFrZX0iCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIxODogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQoraWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCisgIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKK3RoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCitFT0YKKworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENDPSIkQ0MgLXBvc2l4IgorICBlbHNlCisgICAgQ0M9IiRDQyAtWHAiCisgIGZpCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBJU0M9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIzOTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTI0NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTI1MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjY5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyODcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTMwOCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQoraWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKK2V4aXQgKDApOyB9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzE5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNURENfSEVBREVSUyAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEzNDM6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwordHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OworLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK2NoYXIgY29uc3QgKmNvbnN0ICpjY3A7CitjaGFyICoqcDsKKy8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCitzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CitzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKKy8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KKyAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQorICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KK2NvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKK2NjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKy8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCisrK2NjcDsKK3AgPSAoY2hhcioqKSBjY3A7CitjY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKK3sgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgKnQ7CisgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7CisKKyAgKnQrKyA9IDA7Cit9Cit7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLworICBpbnQgeFtdID0gezI1LCAxN307CisgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICsrZm9vOworfQoreyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOworICBpcHRyIHAgPSAwOworICArK3A7Cit9Cit7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKKyAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OworICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Cit9Cit7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLworICBjb25zdCBpbnQgZm9vID0gMTA7Cit9CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzk3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfY19jb25zdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGNvbnN0IAorRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0MTg6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfY3ZfY19pbmxpbmU9bm8KK2ZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTQyNSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworfSAkYWNfa3cgZm9vKCkgeworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MzI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZG9uZQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2CitjYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCisgIGlubGluZSB8IHllcykgOzsKKyAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBpbmxpbmUgCitFT0YKKyA7OworICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQorRU9GCisgOzsKK2VzYWMKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDU4OiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNDYzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIG9mZl90IGxvbmcKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDkxOiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE0OTYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgInNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2l6ZV90PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3R5cGVfc2l6ZV90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2CitpZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBzaXplX3QgdW5zaWduZWQKK0VPRgorCitmaQorCisjIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcworIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNTI2OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTUzMSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YWxsb2NhLmg+CitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTM4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTU1OTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNTY0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorI2Vsc2UKKyMgaWZkZWYgX01TQ19WRVIKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjIGVsc2UKKyMgIGlmIEhBVkVfQUxMT0NBX0gKKyMgICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgIGVsc2UKKyMgICBpZmRlZiBfQUlYCisgI3ByYWdtYSBhbGxvY2EKKyMgICBlbHNlCisjICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCitjaGFyICphbGxvY2EgKCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworaW50IG1haW4oKSB7CitjaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1OTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfQUxMT0NBIDEKK0VPRgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCisgICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCisgICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgorICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKKyAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCisgIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBDX0FMTE9DQSAxCitFT0YKKworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjI0OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTYyOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCit3ZWJlY3JheQorI2Vsc2UKK3dlbm90YmVjcmF5CisjZW5kaWYKKworRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3Zfb3NfY3JheT15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9vc19jcmF5PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgoraWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgorZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbworICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2NTQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE2NTkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY4MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYworRU9GCisKKyAgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitkb25lCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzA5OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTcxNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCitmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKQoreworICBzdGF0aWMgY2hhciAqYWRkciA9IDA7CisgIGF1dG8gY2hhciBkdW1teTsKKyAgaWYgKGFkZHIgPT0gMCkKKyAgICB7CisgICAgICBhZGRyID0gJmR1bW15OworICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Cit9CittYWluICgpCit7CisgIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKK30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzM2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCitFT0YKKworZmkKKworZm9yIGFjX2hkciBpbiB1bmlzdGQuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3NjE6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNzY2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzcxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE4MDA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE4MDUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTgyODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTg1MzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTg2MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKy8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgorICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6CisJbW1hcCBwcml2YXRlIG5vdCBmaXhlZAorCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKKyAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCisgICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50CisgICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKKyAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKKyAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQorICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKKyAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0CisgICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KKworICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgorICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKKyAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQorICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLworI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCisjIGlmZGVmIEhBVkVfVU5JU1REX0gKKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBlbmRpZgorCisvKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLworIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAorIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQorIyBlbmRpZgorCisjIGlmZGVmIF9TQ19QQUdFU0laRQorIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCisjIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCisjICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICAgaWZkZWYgRVhFQ19QQUdFU0laRQorIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCisjICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICAgIGlmZGVmIE5CUEcKKyMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKKyMgICAgIGlmbmRlZiBDTFNJWkUKKyMgICAgICBkZWZpbmUgQ0xTSVpFIDEKKyMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLworIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KKyMgICAgIGlmZGVmIE5CUEMKKyMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCisjICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KKyMgICAgICBpZmRlZiBQQUdFU0laRQorIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQorIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCisjICAgICBlbmRpZiAvKiBubyBOQlBDICovCisjICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KKyMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCisjICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KKyMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLworIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKworI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQorI2Vsc2UKK2NoYXIgKm1hbGxvYygpOworI2VuZGlmCisKK2ludAorbWFpbigpCit7CisJY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7CisJaW50IGksIHBhZ2VzaXplOworCWludCBmZDsKKworCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKKworCS8qCisJICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgorCSAqLworCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJKihkYXRhICsgaSkgPSByYW5kKCk7CisJdW1hc2soMCk7CisJZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgxKTsKKwlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKKwkJZXhpdCgxKTsKKwljbG9zZShmZCk7CisKKwkvKgorCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAorCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKKwkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgorCSAqLworCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7CisJaWYgKCFkYXRhMikKKwkJZXhpdCgxKTsKKwlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7CisJaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKKwkJZXhpdCgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKKwkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKKwkJCWV4aXQoMSk7CisKKwkvKgorCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCisJICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgorCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOworCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEzKQorCQlleGl0KDEpOworCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQorCQkJZXhpdCgxKTsKKwljbG9zZShmZCk7CisJdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKKwlleGl0KDApOworfQorCitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAwMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX01NQVAgMQorRU9GCisKK2ZpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCit1bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwMjk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMDM0ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDM5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCitfX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjA2OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjA3NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDk3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisKKyAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KKyAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMTI2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMTMxICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxNTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgIGZpCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgorICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TVFBDUFkgMQorRU9GCisKKyAgIGZpCisKKyAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjE4ODogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMTkzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsb2NhbGUuaD4KK2ludCBtYWluKCkgeworcmV0dXJuIExDX01FU1NBR0VTCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIwMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2CisgICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCisgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCitFT0YKKworICAgIGZpCisgIGZpCisgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyMjE6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1CisgICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKKyAgVVNFX05MUz0kZW5hYmxldmFsCitlbHNlCisgIFVTRV9OTFM9eWVzCitmaQorCisgICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2CisgICAgCisKKyAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubworCisgICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgRU5BQkxFX05MUyAxCitFT0YKKworICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjI0MTogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1CisgICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAorZWxzZQorICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCitmaQorCisgICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKKworICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQorCW5sc19jdl9oZWFkZXJfbGliZ3Q9CisJQ0FUT0JKRVhUPU5PTkUKKworCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjYwOiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMjY1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNzA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjg3OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIyOTIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpYmludGwuaD4KK2ludCBtYWluKCkgeworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyOTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgorCisJICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgorCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjMxNTogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1CithY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxpbnRsICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzMjMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBiaW5kdGV4dGRvbWFpbigpOworCitpbnQgbWFpbigpIHsKK2JpbmR0ZXh0ZG9tYWluKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMzUwOiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIzNTUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzYyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJICAgZmkKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCisJICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCisJICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfR0VUVEVYVCAxCitFT0YKKworCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjM5MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KKwlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKKyAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKwkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCisJCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQyNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjQyOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDUyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisJCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNDc5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRHTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgID86LyopCQkJIAorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgorICA7OworZXNhYworZmkKK0dNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCitpZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTE0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkWEdFVFRFWFQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKKyAgOzsKK2VzYWMKK2ZpCitYR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCitpZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisJCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI1NDYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKK2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKKwkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1NTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0uZ21vCisJCSAgIERBVEFESVJOQU1FPXNoYXJlCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENBVE9CSkVYVD0ubW8KKwkJICAgREFUQURJUk5BTUU9bGliCitmaQorcm0gLWYgY29uZnRlc3QqCisJCUlOU1RPQkpFWFQ9Lm1vCisJICAgICAgZmkKKwkgICAgZmkKKwkKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisKKwkgICAgICAgIAorICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgorCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNTg2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJE1TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgorCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKKyAgOzsKK2VzYWMKK2ZpCitNU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjYyMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjY1NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgICAgICAKKwlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICAgICAgQ0FUT0JKRVhUPS5nbW8KKyAgICAgICAgSU5TVE9CSkVYVD0ubW8KKyAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKKwlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJworCUlOVExMSUJTPSRJTlRMREVQUworCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAorICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCisgICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgorCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgorCSAgOiA7CisJZWxzZQorCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgorCSAgWEdFVFRFWFQ9IjoiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgorICAgICAgUE9TVUI9cG8KKyAgICBlbHNlCisgICAgICBEQVRBRElSTkFNRT1zaGFyZQorICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKKyAgICBmaQorCisgICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJworICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCisgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgorICAgICAgVVNFX05MUz15ZXMKKyAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgIGZpCisKKyAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKKyAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgorICAgIGRvbmUKKworICAgICAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgCisKKyAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KKyAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KKyAgICAgICBMSU5HVUFTPQorICAgICBlbHNlCisgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjc0NTogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1CisgICAgICAgTkVXX0xJTkdVQVM9CisgICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCisgICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCisgICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKKyAgICAgICAgIGVzYWMKKyAgICAgICBkb25lCisgICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKKyAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKKyAgICAgZmkKKworICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgorICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKKyAgICAgZmkKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgorICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgorICAgZWxzZQorICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCisvKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCisgICBmaQorICAgCisKKyAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgorCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjc3MzogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjc3OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzgzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgbXNnZm9ybWF0PWxpbnV4CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorbXNnZm9ybWF0PXhvcGVuCitmaQorCisKKwkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKKyAgICAgIGZpCisgICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKKwkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAorICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCisgICAgIEdUX05PPSIjTk8jIgorICAgICBHVF9ZRVM9CisgICBlbHNlCisgICAgIEdUX05PPQorICAgICBHVF9ZRVM9IiNZRVMjIgorICAgZmkKKyAgIAorICAgCisKKyAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKKyAgIAorCisgICAgICBsPQorICAgCisKKyAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgorICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbworICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KKwkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KKwkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgorCSBlbHNlCisJICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKKwkgZmkKKyAgICAgIGVsc2UKKwkgcG9zcmNwcmVmaXg9Ii4uLyIKKyAgICAgIGZpCisgICAgICBybSAtZiBwby9QT1RGSUxFUworICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCisJIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCisgICBmaQorICAKKworZm9yIGFjX2hkciBpbiBzdGRsaWIuaCB0aW1lLmggdW5pc3RkLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyODQ5OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjg1NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg1OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBwcmludGYgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjg4NzogY2hlY2tpbmcgd2hldGhlciBwcmludGYgbXVzdCBiZSBkZWNsYXJlZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snc2ltX2N2X2RlY2xfbmVlZGVkX3ByaW50Zicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI4OTIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQgbWFpbigpIHsKK2ludCAoKnBmbikgPSAoaW50ICgqKSkgcHJpbnRmCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg5OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIHNpbV9jdl9kZWNsX25lZWRlZF9wcmludGY9bm8KK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgc2ltX2N2X2RlY2xfbmVlZGVkX3ByaW50Zj15ZXMKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkc2ltX2N2X2RlY2xfbmVlZGVkX3ByaW50ZiIgMT4mNgoraWYgdGVzdCAkc2ltX2N2X2RlY2xfbmVlZGVkX3ByaW50ZiA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9QUklOVEYgMQorRU9GCisKK2ZpCisKK3RyYXAgJycgMSAyIDE1CitjYXQgPiBjb25mY2FjaGUgPDxcRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKyMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKyMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKKyMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKyMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgorIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KKyMKK0VPRgorIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCisjIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoc2V0KSAyPiYxIHwKKyAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxIHwgZ3JlcCBhY19zcGFjZWAgaW4KKyAgKmFjX3NwYWNlPVwgKikKKyAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisgICAgc2VkIC1uIFwKKyAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCisgICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCisgICAgOzsKKyAgKikKKyAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKyAgICA7OworICBlc2FjID4+IGNvbmZjYWNoZQoraWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorICA6CitlbHNlCisgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKyAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKKyAgZWxzZQorICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCisjIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KKyMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJworZmkKKwordHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorCitERUZTPS1ESEFWRV9DT05GSUdfSAorCisjIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKworZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUworcm0gLWYgJENPTkZJR19TVEFUVVMKK2NhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisjISAvYmluL3NoCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAorIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMKKyMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCisjCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKK2ZvciBhY19vcHRpb24KK2RvCisgIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCisgICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQorICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMiIKKyAgICBleGl0IDAgOzsKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCisgICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OworICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7CisgIGVzYWMKK2RvbmUKKworYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKK2FjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgorCit0cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KK3NlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Cisgcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKKyRhY192cHN1YgorJGV4dHJhc3ViCitzJUBzaW1fZW52aXJvbm1lbnRAJSRzaW1fZW52aXJvbm1lbnQlZworcyVAc2ltX2FsaWdubWVudEAlJHNpbV9hbGlnbm1lbnQlZworcyVAc2ltX2Fzc2VydEAlJHNpbV9hc3NlcnQlZworcyVAc2ltX2JpdHNpemVAJSRzaW1fYml0c2l6ZSVnCitzJUBzaW1fZW5kaWFuQCUkc2ltX2VuZGlhbiVnCitzJUBzaW1faG9zdGVuZGlhbkAlJHNpbV9ob3N0ZW5kaWFuJWcKK3MlQHNpbV9mbG9hdEAlJHNpbV9mbG9hdCVnCitzJUBzaW1fc2NhY2hlQCUkc2ltX3NjYWNoZSVnCitzJUBzaW1fZGVmYXVsdF9tb2RlbEAlJHNpbV9kZWZhdWx0X21vZGVsJWcKK3MlQHNpbV9od19jZmxhZ3NAJSRzaW1faHdfY2ZsYWdzJWcKK3MlQHNpbV9od19vYmpzQCUkc2ltX2h3X29ianMlZworcyVAc2ltX2h3QCUkc2ltX2h3JWcKK3MlQHNpbV9pbmxpbmVAJSRzaW1faW5saW5lJWcKK3MlQHNpbV9wYWNrYWdlc0AlJHNpbV9wYWNrYWdlcyVnCitzJUBzaW1fcmVncGFybUAlJHNpbV9yZWdwYXJtJWcKK3MlQHNpbV9yZXNlcnZlZF9iaXRzQCUkc2ltX3Jlc2VydmVkX2JpdHMlZworcyVAc2ltX3NtcEAlJHNpbV9zbXAlZworcyVAc2ltX3N0ZGNhbGxAJSRzaW1fc3RkY2FsbCVnCitzJUBzaW1feG9yX2VuZGlhbkAlJHNpbV94b3JfZW5kaWFuJWcKK3MlQGJ1aWxkX3dhcm5pbmdzQCUkYnVpbGRfd2FybmluZ3MlZworcyVAU0hFTExAJSRTSEVMTCVnCitzJUBDRkxBR1NAJSRDRkxBR1MlZworcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCitzJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKK3MlQERFRlNAJSRERUZTJWcKK3MlQExERkxBR1NAJSRMREZMQUdTJWcKK3MlQExJQlNAJSRMSUJTJWcKK3MlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworcyVAcHJlZml4QCUkcHJlZml4JWcKK3MlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKK3MlQGJpbmRpckAlJGJpbmRpciVnCitzJUBzYmluZGlyQCUkc2JpbmRpciVnCitzJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCitzJUBkYXRhZGlyQCUkZGF0YWRpciVnCitzJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCitzJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKK3MlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKK3MlQGxpYmRpckAlJGxpYmRpciVnCitzJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCitzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCitzJUBpbmZvZGlyQCUkaW5mb2RpciVnCitzJUBtYW5kaXJAJSRtYW5kaXIlZworcyVAaG9zdEAlJGhvc3QlZworcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZworcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCitzJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKK3MlQGhvc3Rfb3NAJSRob3N0X29zJWcKK3MlQHRhcmdldEAlJHRhcmdldCVnCitzJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZworcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZworcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZworcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKK3MlQGJ1aWxkQCUkYnVpbGQlZworcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCitzJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZworcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKK3MlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZworcyVAQ0NAJSRDQyVnCitzJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZworcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKK3MlQEhERUZJTkVTQCUkSERFRklORVMlZworcyVAQVJAJSRBUiVnCitzJUBSQU5MSUJAJSRSQU5MSUIlZworcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKK3MlQFNFVF9NQUtFQCUkU0VUX01BS0UlZworcyVAQ1BQQCUkQ1BQJWcKK3MlQEFMTE9DQUAlJEFMTE9DQSVnCitzJUBVU0VfTkxTQCUkVVNFX05MUyVnCitzJUBNU0dGTVRAJSRNU0dGTVQlZworcyVAR01TR0ZNVEAlJEdNU0dGTVQlZworcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCitzJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKK3MlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZworcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKK3MlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZworcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCitzJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCitzJUBJTlRMREVQU0AlJElOVExERVBTJWcKK3MlQElOVExMSUJTQCUkSU5UTExJQlMlZworcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCitzJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCitzJUBQT1NVQkAlJFBPU1VCJWcKK3MlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKK3MlQEdUX05PQCUkR1RfTk8lZworcyVAR1RfWUVTQCUkR1RfWUVTJWcKK3MlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKK3MlQGxAJSRsJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCisKKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKyAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCisgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorICBlbHNlCisgICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KKyAgZmkKKworICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAuKSAgc3JjZGlyPS4KKyAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KKyAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAqKSAjIFJlbGF0aXZlIHBhdGguCisgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKyAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CisgIGVzYWMKKworICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KKyAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OworICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCisgIHJtIC1mICIkYWNfZmlsZSIKKyAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKKyMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKyAgKikgYWNfY29tc3ViPSA7OworICBlc2FjCisKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgc2VkIC1lICIkYWNfY29tc3ViCitzJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworcyVAc3JjZGlyQCUkc3JjZGlyJWcKK3MlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKK3MlQElOU1RBTExAJSRJTlNUQUxMJWcKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKK2ZpOyBkb25lCitybSAtZiBjb25mdGVzdC5zKgorCisjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgorIworIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCithY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKK2FjX2RDPSdcMycKK2FjX2REPSclZycKKyMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJworYWNfdUM9JyAnCithY191RD0nXDQlZycKKyMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCithY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKK2FjX2VCPSckJVwxI1wyZGVmaW5lXDMnCithY19lQz0nICcKK2FjX2VEPSclZycKKworaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisgIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZpCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICRhY19maWxlCisKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKKyAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKyAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCisKK0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcworIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6CisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgorcm0gLWYgY29uZnRlc3QudmFscworY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgorcy9bXFwmJV0vXFwmL2cKK3MlW1xcJGBdJVxcJiVnCitzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAorcyVhY19kJWFjX3UlZ3AKK3MlYWNfdSVhY19lJWdwCitFT0YKK3NlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKK3JtIC1mIGNvbmZ0ZXN0LmhkcgorCisjIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCisjIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCisjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KK2NhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgorcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKK0VPRgorCisjIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KKyMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCisKK3JtIC1mIGNvbmZ0ZXN0LnRhaWwKK3doaWxlIDoKK2RvCisgIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKKyAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgorICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCisgICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgorICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKKyAgZWNobyAnQ0VPRgorICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAorICBybSAtZiBjb25mdGVzdC5pbgorICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KKycgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKKyAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCitkb25lCitybSAtZiBjb25mdGVzdC52YWxzCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCisgIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAorICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAorICBybSAtZiBjb25mdGVzdC5pbgorICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKKyAgICBybSAtZiBjb25mdGVzdC5oCisgIGVsc2UKKyAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGZpCisgICAgcm0gLWYgJGFjX2ZpbGUKKyAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCisgIGZpCitmaTsgZG9uZQorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2Nhc2UgeCRDT05GSUdfSEVBREVSUyBpbiB4Y29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjCitleGl0IDAKK0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK3JtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCit0ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKKwpkaWZmIC0tZ2l0IGEvc2ltL3c2NS9jb25maWd1cmUuaW4gYi9zaW0vdzY1L2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmRhN2RiCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3c2NS9jb25maWd1cmUuaW4KQEAgLTAsMCArMSw0OCBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitzaW5jbHVkZSguLi9jb21tb24vYWNsb2NhbC5tNCkKK0FDX1BSRVJFUSgyLjUpZG5sCitBQ19JTklUKE1ha2VmaWxlLmluKQorCitBQ19DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKKworQUNfQ09ORklHX0FVWF9ESVIoYGNkICRzcmNkaXI7cHdkYC8uLi8uLikKK0FDX0NBTk9OSUNBTF9TWVNURU0KK0FDX0FSR19QUk9HUkFNCitBQ19QUk9HX0NDCitBQ19QUk9HX0lOU1RBTEwKKworLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0CisKK0FDX1NVQlNUKENGTEFHUykKK0FDX1NVQlNUKEhERUZJTkVTKQorQVI9JHtBUi1hcn0KK0FDX1NVQlNUKEFSKQorQUNfUFJPR19SQU5MSUIKKworIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgoraWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KKyAgQ0NfRk9SX0JVSUxEPSckKENDKScKK2Vsc2UKKyAgQ0NfRk9SX0JVSUxEPWdjYworZmkKK0FDX1NVQlNUKENDX0ZPUl9CVUlMRCkKKworZG5sIFdlIGRvbid0IHVzZSBnZXR0ZXh0LCBidXQgYmZkIGRvZXMuICBTbyB3ZSBkbyB0aGUgYXBwcm9wcmlhdGUgY2hlY2tzCitkbmwgdG8gc2VlIGlmIHRoZXJlIGFyZSBpbnRsIGxpYnJhcmllcyB3ZSBzaG91bGQgbGluayBhZ2FpbnN0LgorQUxMX0xJTkdVQVM9CitDWV9HTlVfR0VUVEVYVAorCitBQ19DSEVDS19IRUFERVJTKHN0ZGxpYi5oIHRpbWUuaCB1bmlzdGQuaCkKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHByaW50ZiBtdXN0IGJlIGRlY2xhcmVkXSkKK0FDX0NBQ0hFX1ZBTChzaW1fY3ZfZGVjbF9uZWVkZWRfcHJpbnRmLAorW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3RkaW8uaD5dLAorW2ludCAoKnBmbikgPSAoaW50ICgqKSkgcHJpbnRmXSwKK3NpbV9jdl9kZWNsX25lZWRlZF9wcmludGY9bm8sIHNpbV9jdl9kZWNsX25lZWRlZF9wcmludGY9eWVzKV0pCitBQ19NU0dfUkVTVUxUKCRzaW1fY3ZfZGVjbF9uZWVkZWRfcHJpbnRmKQoraWYgdGVzdCAkc2ltX2N2X2RlY2xfbmVlZGVkX3ByaW50ZiA9IHllczsgdGhlbgorICBBQ19ERUZJTkUoTkVFRF9ERUNMQVJBVElPTl9QUklOVEYpCitmaQorCitBQ19PVVRQVVQoTWFrZWZpbGUsCitbY2FzZSB4JENPTkZJR19IRUFERVJTIGluIHhjb25maWcuaDpjb25maWcuaW4pIGVjaG8gPiBzdGFtcC1oIDs7IGVzYWNdKQpkaWZmIC0tZ2l0IGEvc2ltL3c2NS9nZW5jb2RlLmMgYi9zaW0vdzY1L2dlbmNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmJlYjViCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3c2NS9nZW5jb2RlLmMKQEAgLTAsMCArMSw5OTEgQEAKKy8qIFByb2dyYW0gdG8gd3JpdGUgb3V0IG9wY29kZSB0YWJsZXMgZm9yIHRoZSBXNjU4MTYgYW5kIGZyaWVuZHMKKyAgIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc2FjQGN5Z251cy5jb20KKworCitHREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisKK3N0cnVjdCBvcGluZm8KKyAgeworICAgIGludCBjb2RlOworICAgIGNoYXIgKm9wY29kZTsKKyAgICBjaGFyICptb2RlOworICAgIGludCBjbG9ja3M7CisgICAgaW50IGNwdTsKKyAgICBzdHJ1Y3QgYWluZm8gKmFpOworICAgIHN0cnVjdCBvaW5mbyAqb2k7CisgIH07CisKKyNkZWZpbmUgVzE2X09OTFkgMQorI2RlZmluZSBDMDJfT05MWSAyCisKK3N0cnVjdCBhaW5mbworICB7CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyICplbnVtbmFtZTsKKyAgICBjaGFyICpkaXNhc21zdHJpbmc7CisgICAgY2hhciAqc2l6ZXI7CisgICAgY2hhciAqcmVsb2MwOworICAgIGNoYXIgKmhvd2x2YWw7CisKKyAgICAvKiBJZiBhZGRyIHZhbCBjb3VsZCBiZSByZWcgYWRkciAgLSB1c2VkIGZvciBkaXNhc3NzbWJseSBvZiAKKyAgICAgICBhcmdzIGludG8gcmVnIG5hbWVzIC0geW91IHdhbnQgbGRhIDwweDEwIHRvIHR1cm4gaW50byBsZGEgPHIwCisgICAgICAgYnV0IHlvdSBkb24ndCB3YW50IGxkYSAjMHgxMCB0byBkbyB0aGUgc2FtZS4gKi8KKyAgICBjaGFyIHJlZ2ZsYWc7IAorICB9OworCisjZGVmaW5lIEdFVF9NIAkxCisjZGVmaW5lIFNQRUNJQUxfQ0FTRSAJMgorI2RlZmluZSBDT1BfR0VUIAkzCisjZGVmaW5lIEcyX0dFVCAJCTQKKyNkZWZpbmUgQlJBTkNICQk1CisjZGVmaW5lIEdFVF9YIDYKKyNkZWZpbmUgU1RBTkRBUkRfUENfR0VUIAk3CisjZGVmaW5lIFBVU0hfMTYgOAorI2RlZmluZSBQVVNIXzggOQorI2RlZmluZSBQVVNIX1ggMTAKKyNkZWZpbmUgUFVTSF9NIDExCisjZGVmaW5lIFBPUF8xNiAxMgorI2RlZmluZSBQT1BfOCAxMworI2RlZmluZSBQT1BfWCAxNAorI2RlZmluZSBQT1BfTSAxNQorI2RlZmluZSBTVE9SRV9NICAxNgorI2RlZmluZSBTVE9SRV9YICAxNworc3RydWN0IG9pbmZvCisgIHsKKyAgICBjaGFyICpuYW1lOworICAgIGludCBob3dzcmM7CisgICAgY2hhciAqaG93dG87CisgIH07CitzdHJ1Y3Qgb2luZm8gb2xpc3RbXSA9Cit7CisgIHsiYWRjIiwgR0VUX00sICJ7IGludCBvbGRfYWNjID0gR0VUX0E7IGludCBvbGRfc3JjID1zcmM7IHNyYyA9IG9sZF9zcmMgKyBvbGRfYWNjICsgR0VUX0NCSVQ7IFNFVF9OQklUX00oc3JjKTsgU0VUX1ZCSVRfTShvbGRfc3JjLCBvbGRfYWNjLCBzcmMpOyBTRVRfQ0JJVF9NKHNyYyk7IFNFVF9aQklUX00oc3JjKTsgU0VUX0Eoc3JjKTt9In0sCisgIHsiYW5kIiwgR0VUX00sICJzcmMgPSBHRVRfQSAmIHNyYzsgU0VUX05CSVRfTShzcmMpOyBTRVRfWkJJVF9NKHNyYyk7U0VUX0Eoc3JjKTsifSwKKyAgeyJhc2wiLCBHMl9HRVQsICIgc3JjIDw8PTE7IFNFVF9DQklUX00oc3JjKTsgU0VUX1pCSVRfTShzcmMpO1NFVF9OQklUX00oc3JjKTsifSwKKyAgeyJiY2MiLCBCUkFOQ0gsICJHRVRfQ0JJVD09MCJ9LAorICB7ImJjcyIsIEJSQU5DSCwgIkdFVF9DQklUPT0xIn0sCisgIHsiYmVxIiwgQlJBTkNILCAiR0VUX1pCSVQ9PTEifSwKKyAgeyJiaXQiLCBHRVRfTSwgIlNFVF9OQklUX00oc3JjKTsgU0VUX1ZCSVQoKHNyYyA+PiAoR0VUX01CSVQgPyA2OjE0ICkgJjEpKTsgU0VUX1pCSVRfTSAoR0VUX0EgJiBzcmMpOyJ9LAorICB7ImJtaSIsIEJSQU5DSCwgIkdFVF9OQklUPT0xIn0sCisgIHsiYm5lIiwgQlJBTkNILCAiR0VUX1pCSVQ9PTAifSwKKyAgeyJicGwiLCBCUkFOQ0gsICJHRVRfTkJJVD09MCJ9LAorICB7ImJyYSIsIEJSQU5DSCwgIjEifSwKKyAgeyJicmsiLCBTUEVDSUFMX0NBU0UsCisgICAiXAore1wKKyAgIGlmIChHRVRfRSA9PSAxKSBcCisgICAgIHsgUFVTSDE2KEdFVF9QQyArIDEpOyBQVVNIOCAoR0VUX1AgfCBCRkxBRyk7IFNFVF9QIChHRVRfUCB8IElGTEFHKTsgU0VUX09OTFlfUEMoZmV0Y2gxNiAoMHhmZmZlKSk7fVwKKyAgIGVsc2UgXAorICAgICB7IFBVU0g4IChHRVRfUEJSX0xPVyk7IFBVU0gxNiAoR0VUX1BDKTsgUFVTSDgoR0VUX1ApOyBTRVRfUChHRVRfUCB8SUZMQUcpOyBTRVRfUEJSUEMoZmV0Y2gxNiAoMHhmZmU2KSk7fTtcCisgICAgIH0ifSwKKyAgeyJicmwiLCBCUkFOQ0gsICIxIn0sCisgIHsiYnZjIiwgQlJBTkNILCAiR0VUX1ZCSVQ9PTAifSwKKyAgeyJidnMiLCBCUkFOQ0gsICJHRVRfVkJJVD09MSJ9LAorICB7ImNsYyIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9DQklUKDApOyJ9LAorICB7ImNsZCIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9EQklUKDApOyJ9LAorICB7ImNsaSIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9JQklUKDApOyJ9LAorICB7ImNsdiIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9WQklUKDApOyJ9LAorICB7ImNtcCIsIEdFVF9NLCAic3JjID0gR0VUX0EgLSBzcmM7IFNFVF9aQklUX00oc3JjKTsgU0VUX0NCSVRfTSh+c3JjKTsgU0VUX05CSVRfTShzcmMpOyJ9LAorICB7ImNvcCIsIENPUF9HRVQsCisgICAiXAore1wKKyAgIGlmIChHRVRfRSA9PSAxKSBcCisgICAgIHsgUFVTSDE2KEdFVF9QQyArIDEpOyBQVVNIOCAoR0VUX1AgfCBCRkxBRyk7IFNFVF9QICgoR0VUX1AgfCBJRkxBRykgJiB+REZMQUcpOyBTRVRfT05MWV9QQyhmZXRjaDE2ICgweGZmZjQpKTt9XAorICAgZWxzZSBcCisgICAgIHsgUFVTSDggKEdFVF9QQlJfTE9XKTsgUFVTSDE2IChHRVRfUEMpOyBQVVNIOChHRVRfUCk7IFNFVF9QKChHRVRfUCB8SUZMQUcpICYgfkRGTEFHKTsgU0VUX1BCUlBDKGZldGNoMTYgKDB4ZmZlNCkpO307XAorICAgICB9In0sCisgIHsiY3B4IiwgR0VUX1gsICJzcmMgPSBHRVRfWCAtIHNyYzsgU0VUX05CSVRfWChzcmMpOyBTRVRfWkJJVF9YKHNyYyk7IFNFVF9DQklUX1gofnNyYyk7In0sCisgIHsiY3B5IiwgR0VUX1gsICJzcmMgPSBHRVRfWSAtIHNyYzsgU0VUX05CSVRfWChzcmMpOyBTRVRfWkJJVF9YKHNyYyk7IFNFVF9DQklUX1gofnNyYyk7In0sCisgIHsiZGVjIiwgRzJfR0VULCAic3JjIC0tOyBTRVRfTkJJVF9NKHNyYyk7IFNFVF9aQklUX00oc3JjKTsgIn0sCisgIHsiZGV4IiwgU1BFQ0lBTF9DQVNFLCAiU0VUX1goR0VUX1ggLTEpOyBTRVRfTkJJVF9YKEdFVF9YKTsgU0VUX1pCSVRfWChHRVRfWCk7In0sCisgIHsiZGV5IiwgU1BFQ0lBTF9DQVNFLCAiU0VUX1koR0VUX1kgLTEpOyBTRVRfTkJJVF9YKEdFVF9ZKTsgU0VUX1pCSVRfWChHRVRfWSk7In0sCisgIHsiZW9yIiwgR0VUX00sICJzcmMgPSBHRVRfQSBeIHNyYzsgIFNFVF9OQklUX00oc3JjKTsgU0VUX1pCSVRfTShzcmMpO1NFVF9BKHNyYyk7ICJ9LAorICB7ImluYyIsIEcyX0dFVCwgInNyYyArKzsgU0VUX05CSVRfTShzcmMpOyBTRVRfWkJJVF9NKHNyYyk7ICJ9LAorICB7ImlueCIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9YKEdFVF9YICsxKTsgU0VUX05CSVRfWChHRVRfWCk7IFNFVF9aQklUX1goR0VUX1gpOyJ9LAorICB7ImlueSIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9ZKEdFVF9ZICsxKTsgU0VUX05CSVRfWChHRVRfWSk7IFNFVF9aQklUX1goR0VUX1kpOyJ9LAorICB7ImptcCIsIFNUQU5EQVJEX1BDX0dFVCwgIlNFVF9PTkxZX1BDKGx2YWwpOyJ9LAorICB7ImpzciIsIFNUQU5EQVJEX1BDX0dFVCwgImlmIChsKSB7IFBVU0g4KEdFVF9QQlJfTE9XKTt9IFBVU0gxNihHRVRfUEMpOyBTRVRfT05MWV9QQyhsdmFsKTtcbiJ9LAorICB7ImxkYSIsIEdFVF9NLCAiU0VUX0Eoc3JjKTsgU0VUX05CSVRfTShHRVRfQSk7IFNFVF9aQklUX00oR0VUX0EpOyJ9LAorICB7ImxkeCIsIEdFVF9YLCAiU0VUX1goc3JjKTtTRVRfTkJJVF9YKEdFVF9YKTsgU0VUX1pCSVRfWChHRVRfWCk7In0sCisgIHsibGR5IiwgR0VUX1gsICJTRVRfWShzcmMpO1NFVF9OQklUX1goR0VUX1kpOyBTRVRfWkJJVF9YKEdFVF9ZKTsifSwKKyAgeyJsc3IiLCBHMl9HRVQsIAorICAgICAgICJTRVRfQ0JJVChzcmMgJiAxKTsgXAorICAgICAgICBTRVRfTkJJVCgwKTsgICAgICAgXAorICAgICAgICAgc3JjID0gc3JjID4+IDE7ICAgXAorICAgICAgICAgU0VUX1pCSVRfTShzcmMpOyJ9LAorICB7Im12biIsIFNQRUNJQUxfQ0FTRSwKKyAgICJ7IGludCBkc3RfYmFuazsgaW50IHNyY19iYW5rOyBkc3RfYmFuayA9IGZldGNoOCAoIEdFVF9QQyk8PDE2OyBJTkNfUEMoMSk7IHNyY19iYW5rID0gZmV0Y2g4IChHRVRfUEMpPDwxNjsgSU5DX1BDKDEpO1wKKyAgICAgICBkbyB7ICBzdG9yZTggKCBkc3RfYmFuayArIEdFVF9YLCBmZXRjaDggKHNyY19iYW5rICsgIEdFVF9ZKSk7IFNFVF9YKEdFVF9YKzEpOyBTRVRfWShHRVRfWSsxKTsgU0VUX0EoKEdFVF9BLTEpICYgMHhmZmZmKTsgfSB3aGlsZSAoR0VUX0EgIT0gMHhmZmZmKTt9In0sCisgIHsibXZwIiwgU1BFQ0lBTF9DQVNFLAorICAgInsgaW50IGRzdF9iYW5rOyBpbnQgc3JjX2Jhbms7IGRzdF9iYW5rID0gZmV0Y2g4ICggR0VUX1BCUlBDKTw8MTY7IElOQ19QQygxKTsgc3JjX2JhbmsgPSBmZXRjaDggKEdFVF9QQlJQQyk8PDE2OyBJTkNfUEMoMSk7XAorICAgICAgIGRvIHsgIHN0b3JlOCAoIGRzdF9iYW5rICsgR0VUX1gsIGZldGNoOCAoc3JjX2JhbmsgKyBHRVRfWSkpOyBTRVRfWChHRVRfWC0xKTsgU0VUX1koR0VUX1ktMSk7IFNFVF9BKChHRVRfQS0xKSAmIDB4ZmZmZik7IH0gd2hpbGUgKEdFVF9BICE9IDB4ZmZmZik7fSJ9LAorCisgIHsibm9wIiwgU1BFQ0lBTF9DQVNFLCAiIn0sCit7Im9yYSIsIEdFVF9NLCAiU0VUX0EoR0VUX0EgfCBzcmMpOyBTRVRfTkJJVF9NKEdFVF9BKTsgU0VUX1pCSVRfTShHRVRfQSk7In0sCisgIHsicGVhIiwgUFVTSF8xNiwgInNyYyA9IGZldGNoMTYoR0VUX1BCUlBDKTsgSU5DX1BDKDIpOyJ9LAorICB7InBlaSIsIFBVU0hfMTYsICJzcmMgPSBmZXRjaDE2KGZldGNoOChHRVRfUEJSUEMpICsgR0VUX0QpOyBJTkNfUEMoMSk7In0sCisgIHsicGVyIiwgUFVTSF8xNiwgInNyYyA9IGZldGNoMTYoR0VUX1BCUlBDKSArIEdFVF9QQysyOyBJTkNfUEMoMik7In0sCisgIHsicGhhIiwgUFVTSF9NLCAic3JjID0gR0VUX0E7In0sCisgIHsicGhiIiwgUFVTSF84LCAic3JjID0gR0VUX0RCUl9MT1c7In0sCisgIHsicGhkIiwgUFVTSF8xNiwgInNyYyA9IEdFVF9EUFI7In0sCisgIHsicGhrIiwgUFVTSF84LCAic3JjID0gR0VUX1BCUl9MT1c7In0sCisgIHsicGhwIiwgUFVTSF84LCAic3JjID0gR0VUX1A7In0sCisgIHsicGh4IiwgUFVTSF9YLCAic3JjID0gR0VUX1g7In0sCisgIHsicGh5IiwgUFVTSF9YLCAic3JjID0gR0VUX1k7In0sCisgIHsicGxhIiwgUE9QX00sICJTRVRfQSggc3JjKTsgU0VUX05CSVRfTShHRVRfQSk7U0VUX1pCSVRfTShHRVRfQSk7In0sCisgIHsicGxiIiwgUE9QXzgsICJTRVRfREJSX0xPVyhzcmMpO1NFVF9OQklUXzgoc3JjKTsgU0VUX1pCSVRfOChzcmMpOyJ9LAorICB7InBsZCIsIFBPUF8xNiwgIlNFVF9EUFIoc3JjKTtTRVRfTkJJVF8xNihzcmMpOyBTRVRfWkJJVF8xNihzcmMpOyJ9LAorICB7InBscCIsIFBPUF84LCAiU0VUX1Aoc3JjKTsgUkVUSElOSzsifSwKKyAgeyJwbHgiLCBQT1BfWCwgIlNFVF9YKHNyYyk7U0VUX05CSVRfWChzcmMpO1NFVF9aQklUX1goc3JjKTsifSwKKyAgeyJwbHkiLCBQT1BfWCwgIlNFVF9ZKHNyYyk7U0VUX05CSVRfWChzcmMpO1NFVF9aQklUX1goc3JjKTsifSwKKyAgeyJyZXAiLCBDT1BfR0VULCAiU0VUX1AoR0VUX1AgJiB+c3JjKTsgUkVUSElOSzsifSwKKyAgeyJyb2wiLCBHMl9HRVQsICJzcmMgPSAoc3JjIDw8IDEpIHwgR0VUX0NCSVQ7IFNFVF9DQklUKChzcmMgPj4gKEdFVF9NQklUID8gNyA6IDE1KSkgJjEpOyBTRVRfWkJJVF9NKHNyYyk7In0sCisgIHsicm9yIiwgRzJfR0VULCAieyBpbnQgdCA9IHNyYzsgc3JjICA9IChzcmM+PjEpIHwgKEdFVF9DQklUPDwoKEdFVF9NQklUID8gODoxNiktMSkpO1NFVF9OQklUX00oc3JjKTtTRVRfWkJJVF9NKHNyYyk7IFNFVF9DQklUKHQmMSk7fSJ9LAorICB7InJ0aSIsIFNQRUNJQUxfQ0FTRSwgInsgaW50IHQ7IFBPUDE2KHQpOyBTRVRfT05MWV9QQyh0KTsgaWYgKEdFVF9FPT0wKSB7IFBPUDgodCk7IFNFVF9QQlIodCk7fSAgUE9QOCh0KTtTRVRfUCh0KTt9In0sCisgIHsicnRsIiwgU1BFQ0lBTF9DQVNFLCAieyBpbnQgdDsgUE9QMjQodCk7IFNFVF9QQlJQQyh0KTt9In0sCisgIHsicnRzIiwgU1BFQ0lBTF9DQVNFLCAieyBpbnQgdDsgUE9QMTYodCk7IFNFVF9PTkxZX1BDKHQpO30ifSwKKyAgeyJzYmMiLCBHRVRfTSwKKyAgICJ7IGludCBvbGRfYWNjID0gR0VUX0EgJiBBTUFTSzsgaW50IG9sZF9zcmMgPSBzcmMgJiBBTUFTSzsgIHNyYyA9IG9sZF9hY2MgLSBvbGRfc3JjIC0gIUdFVF9DQklUOyBTRVRfQShzcmMpO1wKKyAgICBTRVRfQ0JJVCghKHNyYz4+KEdFVF9NQklUPzg6MTYpICYxKSk7IFNFVF9WQklUX00ob2xkX3NyYyxvbGRfYWNjLCBzcmMpOyBTRVRfWkJJVF9NKHNyYyk7IFNFVF9OQklUX00oc3JjKTt9In0sCisgIHsic2VjIiwgU1BFQ0lBTF9DQVNFLCAiU0VUX0NCSVQoMSk7In0sCisgIHsic2VkIiwgU1BFQ0lBTF9DQVNFLCAiU0VUX0RCSVQoMSk7In0sCisgIHsic2VpIiwgU1BFQ0lBTF9DQVNFLCAiU0VUX0lCSVQoMSk7In0sCisgIHsic2VwIiwgQ09QX0dFVCwgIlNFVF9QKEdFVF9QIHwgc3JjKTtSRVRISU5LOyJ9LAorICB7InN0YSIsIFNUT1JFX00sICJzcmMgPSBHRVRfQTsifSwKKyAgeyJzdHAiLCBTUEVDSUFMX0NBU0UsICJhYm9ydCgpOyJ9LAorICB7InN0eCIsIFNUT1JFX1gsICJzcmMgPSBHRVRfWDsifSwKKyAgeyJzdHkiLCBTVE9SRV9YLCAic3JjID0gR0VUX1k7In0sCisgIHsic3R6IiwgU1RPUkVfTSwgInNyYyA9IDA7In0sCit7InRheCIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9YKEdFVF9BKTsgU0VUX05CSVRfWChHRVRfQSk7U0VUX1pCSVRfWChHRVRfQSk7In0sCit7InRheSIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9ZKEdFVF9BKTsgU0VUX05CSVRfWChHRVRfQSk7U0VUX1pCSVRfWChHRVRfQSk7In0sCisgIHsidGNkIiwgU1BFQ0lBTF9DQVNFLCAiU0VUX0RQUihHRVRfQSk7IFNFVF9OQklUX1goR0VUX0EpOyBTRVRfWkJJVF9YKEdFVF9BKTsifSwKKyAgeyJ0Y3MiLCBTUEVDSUFMX0NBU0UsICJTRVRfUyhHRVRfQSk7In0sCisgIHsidGRjIiwgU1BFQ0lBTF9DQVNFLCAiU0VUX0EoR0VUX0RQUik7IFNFVF9OQklUX00oR0VUX0EpOyBTRVRfWkJJVF9NKEdFVF9BKTsifSwKKyAgeyJ0cmIiLCBHMl9HRVQsICJTRVRfWkJJVF9NKHNyYyAmIEdFVF9BKTsgc3JjID0gc3JjICYgfkdFVF9BOyAifSwKKyAgeyJ0c2IiLCBHMl9HRVQsICJTRVRfWkJJVF9NKHNyYyAmIEdFVF9BKTsgc3JjID0gc3JjIHwgR0VUX0E7In0sCit7InRzYyIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9BKEdFVF9TKTsgU0VUX05CSVRfMTYoR0VUX0EpOyBTRVRfWkJJVF8xNihHRVRfQSk7In0sCit7InRzeCIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9YKEdFVF9TKTsgU0VUX05CSVRfWChHRVRfWCk7IFNFVF9aQklUX1goR0VUX1gpOyJ9LAoreyJ0eGEiLCBTUEVDSUFMX0NBU0UsICJTRVRfQShHRVRfWCk7IFNFVF9OQklUX00oR0VUX0EpOyBTRVRfWkJJVF9NKEdFVF9BKTsifSwKKyAgeyJ0eHMiLCBTUEVDSUFMX0NBU0UsICJTRVRfUyhHRVRfWCk7In0sCit7InR4eSIsIFNQRUNJQUxfQ0FTRSwgIlNFVF9ZKEdFVF9YKTsgU0VUX05CSVRfWChHRVRfWSk7IFNFVF9aQklUX1goR0VUX1kpOyJ9LAoreyJ0eWEiLCBTUEVDSUFMX0NBU0UsICJTRVRfQShHRVRfWSk7IFNFVF9OQklUX00oR0VUX0EpOyBTRVRfWkJJVF9NKEdFVF9BKTsifSwKK3sidHl4IiwgU1BFQ0lBTF9DQVNFLCAiU0VUX1goR0VUX1kpOyBTRVRfTkJJVF9YKEdFVF9YKTsgU0VUX1pCSVRfWChHRVRfWCk7In0sCisgIHsid2FpIiwgU1BFQ0lBTF9DQVNFLCAid2FpKCk7SU5DX1BDKC0xKTsifSwKKyAgeyJ3ZG0iLCBTUEVDSUFMX0NBU0UsICJTRVRfQSh3ZG0oR0VUX0EsIEdFVF9YKSk7In0sCisgIHsieGJhIiwgU1BFQ0lBTF9DQVNFLAorICAgImlmIChHRVRfWEJJVD09MCkgeyBTRVRfQSgoKEdFVF9BID4+IDgpICYgMHhmZikgfCAoKEdFVF9BICYgMHhmZik8PDgpKTt9IGVsc2UgeyBpbnQgdCA9IEdFVF9BOyBTRVRfQShHRVRfQik7IFNFVF9CKHQpO307IFNFVF9OQklUXzgoR0VUX0EpOyBTRVRfWkJJVF84KEdFVF9BKTsifSwKKyAgeyJ4Y2UiLCBTUEVDSUFMX0NBU0UsICJ7IGludCB0ID0gR0VUX0U7IFNFVF9FKEdFVF9DQklUKTsgU0VUX0NCSVQoR0VUX0UpO2lmIChHRVRfRSkgeyBTRVRfTUJJVCgxKTsgU0VUX1hCSVQoMSk7fX07IGdvdG8gdG9wOyJ9LAorICAwfTsKKworc3RydWN0IGFpbmZvIGFsaXN0W10gPQoreworICB7IiNhIiwgIklNTVRPQSIsICIjJDAiLCAiTT09MCA/IDI6MSIsICJNPT0wID8gJXNSX1c2NV9BQlMxNiA6ICVzUl9XNjVfQUJTOCIsICAgImx2YWwgPSBHRVRfUEJSUEM7IElOQ19QQyhHRVRfTUJJVCA/IDE6Mik7ICIsIDB9LAorICB7IiNjIiwgIklNTUNPUCIsICIjJDAiLCAiMSIsICIlc1JfVzY1X0FCUzgiLCAgICJsdmFsID0gR0VUX1BCUlBDOyBJTkNfUEMoMSk7ICIsIDB9LAorICB7IiNpIiwgIklNTVRPSSIsICIjJDAiLCAiWD09MCA/IDI6MSIsICJYPT0wID8gJXNSX1c2NV9BQlMxNiA6ICVzUl9XNjVfQUJTOCIsICAgImx2YWwgPSBHRVRfUEJSUEM7IElOQ19QQyhHRVRfWEJJVCA/IDE6Mik7IiwgMH0sCisgIHsiQSIsICJBQ0MiLCAiYSIsICIwIiwgMCwgIipGQUlMKioiLCAwfSwKKyAgeyJyIiwgIlBDX1JFTCIsICIkMCIsICIxIiwgIiVzUl9XNjVfUENSOCIsICAgImx2YWwgPSBHRVRfUEJSX0hJR0ggKyAoMHhmZmZmICYoZmV0Y2g4c2V4dChHRVRfUEJSUEMpICsgR0VUX1BDICsgMSkpOyBJTkNfUEMoMSk7IiwgMH0sCisgIHsicmwiLCAiUENfUkVMX0xPTkciLCAiJDAiLCAiMiIsICIlc1JfVzY1X1BDUjE2IiwgICAibHZhbCA9IEdFVF9QQlJfSElHSCArICgweGZmZmYgJiAoZmV0Y2gxNiAoR0VUX1BCUlBDKSArIEdFVF9QQyArIDIpKTsgSU5DX1BDKDIpOyIsIDB9LAorICB7ImkiLCAiSU1QTElFRCIsICIiLCAiMCIsICIiLCAwfSwKKyAgeyJzIiwgIlNUQUNLIiwgIiIsICIwIiwgIiIsIDB9LAorICB7ImQiLCAiRElSIiwgIjwkMCIsICIxIiwgIiVzUl9XNjVfQUJTOCIsICAgImx2YWwgPSBmZXRjaDgoR0VUX1BCUlBDKSArIEdFVF9EOyBJTkNfUEMoMSk7IiwgMX0sCisgIHsiZCx4IiwgIkRJUl9JRFhfWCIsICI8JDAseCIsICIxIiwgIiVzUl9XNjVfQUJTOCIsICAgImx2YWwgPSBmZXRjaDgoR0VUX1BCUlBDKSArIEdFVF9YKyBHRVRfRDsgSU5DX1BDKDEpOyIsIDF9LAorICB7ImQseSIsICJESVJfSURYX1kiLCAiPCQwLHkiLCAiMSIsICIlc1JfVzY1X0FCUzgiLCAgICJsdmFsID0gZmV0Y2g4KEdFVF9QQlJQQykgKyBHRVRfWSArIEdFVF9EOyBJTkNfUEMoMSk7IiwgMX0sCisgIHsiKGQpIiwgIkRJUl9JTkQiLCAiKDwkMCkiLCAiMSIsICIlc1JfVzY1X0FCUzgiLCAgICJsdmFsID0gR0VUX0RCUl9ISUdIICsgKDB4ZmZmZiAmIGZldGNoMTYoZmV0Y2g4KEdFVF9QQlJQQykgKyBHRVRfRCkpO0lOQ19QQygxKTsiLDF9LAorICB7IihkLHgpIiwgIkRJUl9JRFhfSU5EX1giLCAiKDwkMCx4KSIsICIxIiwgIiVzUl9XNjVfQUJTOCIsICAgImx2YWwgPSBHRVRfREJSX0hJR0ggKyAoMHhmZmZmICYgKGZldGNoOCAoR0VUX1BCUlBDKSArIEdFVF9EICsgR0VUX1gpKSA7IElOQ19QQygxKTsiLDF9LAorICB7IihkKSx5IiwgIkRJUl9JTkRfSURYX1kiLCAiKDwkMCkseSIsICIxIiwgIiVzUl9XNjVfQUJTOCIsICAgImx2YWwgPSBmZXRjaDE2KGZldGNoOChHRVRfUEJSUEMpICsgR0VUX0QpICsgR0VUX1kgICsgR0VUX0RCUl9ISUdIO0lOQ19QQygxKTsiLDF9LAorICB7IltkXSIsICJESVJfSU5EX0xPTkciLCAiWyQwXSIsICIxIiwgIiVzUl9XNjVfQUJTOCIsICAgImx2YWwgPSBmZXRjaDI0KEdFVF9EICsgZmV0Y2g4KEdFVF9QQlJQQykpO0lOQ19QQygxKTsiLDF9LAorCisgIHsiW2RdLHkiLCAiRElSX0lORF9JRFhfWV9MT05HIiwgIlskMF0seSIsICIxIiwgIiVzUl9XNjVfQUJTOCIsICAgImx2YWwgPSBmZXRjaDI0KGZldGNoOChHRVRfUEJSUEMpICsgR0VUX0QpICsgR0VUX1k7SU5DX1BDKDEpOyIsMX0sCisKKyAgeyJhIiwgIkFCUyIsICIhJDAiLCAiMiIsICIlc1JfVzY1X0FCUzE2IiwgICAibHZhbCA9IGZldGNoMTYoR0VUX1BCUlBDKSArIEdFVF9EQlJfSElHSDsgSU5DX1BDKDIpIDsgIiwxfSwKKyAgeyJhLHgiLCAiQUJTX0lEWF9YIiwgIiEkMCx4IiwgIjIiLCAiJXNSX1c2NV9BQlMxNiIsICAgImx2YWwgPSBmZXRjaDE2KEdFVF9QQlJQQykgKyBHRVRfREJSX0hJR0ggKyBHRVRfWDsgSU5DX1BDKDIpOyAiLDF9LAorICB7ImEseSIsICJBQlNfSURYX1kiLCAiISQwLHkiLCAiMiIsICIlc1JfVzY1X0FCUzE2IiwgICAibHZhbCA9IGZldGNoMTYoR0VUX1BCUlBDKSArIEdFVF9EQlJfSElHSCArIEdFVF9ZOyBJTkNfUEMoMik7ICIsIDF9LAorICB7ImFsIiwgIkFCU19MT05HIiwgIj4kMCIsICIzIiwgIiVzUl9XNjVfQUJTMjQiLCAgICJsdmFsID0gZmV0Y2gyNChHRVRfUEJSUEMpOyBJTkNfUEMoMyk7XG5sPTE7XG4iLCAxfSwKKyAgeyJbYV0iLCAiQUJTX0lORF9MT05HIiwgIls+JDBdIiwgIjIiLCAiJXNSX1c2NV9BQlMxNiIsICAgImx2YWwgPSBmZXRjaDI0KGZldGNoMTYoR0VUX1BCUlBDKSk7IElOQ19QQygyKTsiLCAxfSwKKyAgeyJhbCx4IiwgIkFCU19MT05HX0lEWF9YIiwgIj4kMCx4IiwgIjMiLCAiJXNSX1c2NV9BQlMyNCIsICAgImx2YWwgPSBmZXRjaDI0KEdFVF9QQlJQQykgKyBHRVRfWDsgSU5DX1BDKDMpOyIsIDF9LAorICB7ImQscyIsICJTVEFDS19SRUwiLCAiJDAscyIsICIxIiwgIiVzUl9XNjVfQUJTOCIsICAgImx2YWwgPSBmZXRjaDgoR0VUX1BCUlBDKSArIEdFVF9TOyBJTkNfUEMoMSk7IiwgMH0sCisgIHsiKGQscykseSIsICJTVEFDS19SRUxfSU5EWF9JRFgiLCAiKCQwLHMpLHkiLCAiMSIsICIlc1JfVzY1X0FCUzgiLCAgICJsdmFsID0gZmV0Y2gxNihmZXRjaDgoR0VUX1BCUlBDKSArIEdFVF9TKSArIEdFVF9EQlJfSElHSCArIEdFVF9ZO0lOQ19QQygxKTsiLDB9LAorICB7IihhKSIsICJBQlNfSU5EIiwgIigkMCkiLCAiMiIsICIlc1JfVzY1X0FCUzE2IiwgICAibHZhbCA9IGZldGNoMTYoR0VUX1BCUlBDKSArIEdFVF9EQlJfSElHSDsgSU5DX1BDKDIpOyIsIDF9LAorICB7IihhLHgpIiwgIkFCU19JTkRfSURYIiwgIigkMCx4KSIsICIyIiwgIiVzUl9XNjVfQUJTMTYiLAorICAgICAibHZhbCA9IGZldGNoMTYoKDB4ZmZmZiAmIChmZXRjaDE2KEdFVF9QQlJQQykgKyBHRVRfWCApKSArIEdFVF9QQlJfSElHSCkgKyBHRVRfUEJSX0hJR0g7SU5DX1BDKDIpOyIsMX0sCisgIHsieHl6IiwgIkJMT0NLX01PVkUiLCAiIiwgIjIiLCAiIiwgMH0sCQorICAwfTsKKworCitzdHJ1Y3Qgb3BpbmZvIG9wdGFibGVbMjU3XSA9Cit7CisgIHsweDAwLCAiYnJrIiwgInMifSwKKyAgezB4MDEsICJvcmEiLCAiKGQseCkifSwKKyAgezB4MDIsICJjb3AiLCAiI2MifSwKKyAgezB4MDMsICJvcmEiLCAiZCxzIn0sCisgIHsweDA0LCAidHNiIiwgImQifSwKKyAgezB4MDUsICJvcmEiLCAiZCJ9LAorICB7MHgwNiwgImFzbCIsICJkIn0sCisgIHsweDA3LCAib3JhIiwgIltkXSJ9LAorICB7MHgwOCwgInBocCIsICJzIn0sCisgIHsweDA5LCAib3JhIiwgIiNhIn0sCisgIHsweDBhLCAiYXNsIiwgIkEifSwKKyAgezB4MGIsICJwaGQiLCAicyJ9LAorICB7MHgwYywgInRzYiIsICJhIn0sCisgIHsweDBkLCAib3JhIiwgImEifSwKKyAgezB4MGUsICJhc2wiLCAiYSJ9LAorICB7MHgwZiwgIm9yYSIsICJhbCJ9LAorICB7MHgxMCwgImJwbCIsICJyIn0sCisgIHsweDExLCAib3JhIiwgIihkKSx5In0sCisgIHsweDEyLCAib3JhIiwgIihkKSJ9LAorICB7MHgxMywgIm9yYSIsICIoZCxzKSx5In0sCisgIHsweDE0LCAidHJiIiwgImQifSwKKyAgezB4MTUsICJvcmEiLCAiZCx4In0sCisgIHsweDE2LCAiYXNsIiwgImQseCJ9LAorICB7MHgxNywgIm9yYSIsICJbZF0seSJ9LAorICB7MHgxOCwgImNsYyIsICJpIn0sCisgIHsweDE5LCAib3JhIiwgImEseSJ9LAorICB7MHgxYSwgImluYyIsICJBIn0sCisgIHsweDFiLCAidGNzIiwgImkifSwKKyAgezB4MWMsICJ0cmIiLCAiYSJ9LAorICB7MHgxZCwgIm9yYSIsICJhLHgifSwKKyAgezB4MWUsICJhc2wiLCAiYSx4In0sCisgIHsweDFmLCAib3JhIiwgImFsLHgifSwKKyAgezB4MjAsICJqc3IiLCAiYSJ9LAorICB7MHgyMSwgImFuZCIsICIoZCx4KSJ9LAorICB7MHgyMiwgImpzciIsICJhbCJ9LAorICB7MHgyMywgImFuZCIsICJkLHMifSwKKyAgezB4MjQsICJiaXQiLCAiKGQpIn0sCisgIHsweDI1LCAiYW5kIiwgImQifSwKKyAgezB4MjYsICJyb2wiLCAiZCJ9LAorICB7MHgyNywgImFuZCIsICJbZF0ifSwKKyAgezB4MjgsICJwbHAiLCAicyJ9LAorICB7MHgyOSwgImFuZCIsICIjYSJ9LAorICB7MHgyYSwgInJvbCIsICJBIn0sCisgIHsweDJiLCAicGxkIiwgInMifSwKKyAgezB4MmMsICJiaXQiLCAiYSJ9LAorICB7MHgyZCwgImFuZCIsICJhIn0sCisgIHsweDJlLCAicm9sIiwgImEifSwKKyAgezB4MmYsICJhbmQiLCAiYWwifSwKKyAgezB4MzAsICJibWkiLCAiciJ9LAorICB7MHgzMSwgImFuZCIsICIoZCkseSJ9LAorICB7MHgzMiwgImFuZCIsICIoZCkifSwKKyAgezB4MzMsICJhbmQiLCAiKGQscykseSJ9LAorICB7MHgzNCwgImJpdCIsICIoZCx4KSJ9LAorICB7MHgzNSwgImFuZCIsICJkLHgifSwKKyAgezB4MzYsICJyb2wiLCAiZCx4In0sCisgIHsweDM3LCAiYW5kIiwgIltkXSx5In0sCisgIHsweDM4LCAic2VjIiwgImkifSwKKyAgezB4MzksICJhbmQiLCAiYSx5In0sCisgIHsweDNhLCAiZGVjIiwgIkEifSwKKyAgezB4M2IsICJ0c2MiLCAiaSJ9LAorICB7MHgzYywgImJpdCIsICJhLHgifSwKKyAgezB4M2QsICJhbmQiLCAiYSx4In0sCisgIHsweDNlLCAicm9sIiwgImEseCJ9LAorICB7MHgzZiwgImFuZCIsICJhbCx4In0sCisgIHsweDQwLCAicnRpIiwgInMifSwKKyAgezB4NDEsICJlb3IiLCAiKGQseCkifSwKKyAgezB4NDIsICJ3ZG0iLCAiaSJ9LAorICB7MHg0MywgImVvciIsICJkLHMifSwKKyAgezB4NDQsICJtdnAiLCAieHl6In0sCisgIHsweDQ1LCAiZW9yIiwgImQifSwKKyAgezB4NDYsICJsc3IiLCAiZCJ9LAorICB7MHg0NywgImVvciIsICJbZF0ifSwKKyAgezB4NDgsICJwaGEiLCAicyJ9LAorICB7MHg0OSwgImVvciIsICIjYSJ9LAorICB7MHg0YSwgImxzciIsICJBIn0sCisgIHsweDRiLCAicGhrIiwgInMifSwKKyAgezB4NGMsICJqbXAiLCAiYSJ9LAorICB7MHg0ZCwgImVvciIsICJhIn0sCisgIHsweDRlLCAibHNyIiwgImEifSwKKyAgezB4NGYsICJlb3IiLCAiYWwifSwKKyAgezB4NTAsICJidmMiLCAiciJ9LAorICB7MHg1MSwgImVvciIsICIoZCkseSJ9LAorICB7MHg1MiwgImVvciIsICIoZCkifSwKKyAgezB4NTMsICJlb3IiLCAiKGQscykseSJ9LAorICB7MHg1NCwgIm12biIsICJ4eXoifSwKKyAgezB4NTUsICJlb3IiLCAiZCx4In0sCisgIHsweDU2LCAibHNyIiwgImQseCJ9LAorICB7MHg1NywgImVvciIsICJbZF0seSJ9LAorICB7MHg1OCwgImNsaSIsICJpIn0sCisgIHsweDU5LCAiZW9yIiwgImEseSJ9LAorICB7MHg1YSwgInBoeSIsICJzIn0sCisgIHsweDViLCAidGNkIiwgImkifSwKKyAgezB4NWMsICJqbXAiLCAiYWwifSwKKyAgezB4NWQsICJlb3IiLCAiYSx4In0sCisgIHsweDVlLCAibHNyIiwgImEseCJ9LAorICB7MHg1ZiwgImVvciIsICJhbCx4In0sCisgIHsweDYwLCAicnRzIiwgInMifSwKKyAgezB4NjEsICJhZGMiLCAiKGQseCkifSwKKyAgezB4NjIsICJwZXIiLCAicmwifSwKKyAgezB4NjMsICJhZGMiLCAiZCxzIn0sCisgIHsweDY0LCAic3R6IiwgImQifSwKKyAgezB4NjUsICJhZGMiLCAiZCJ9LAorICB7MHg2NiwgInJvciIsICJkIn0sCisgIHsweDY3LCAiYWRjIiwgIltkXSJ9LAorICB7MHg2OCwgInBsYSIsICJzIn0sCisgIHsweDY5LCAiYWRjIiwgIiNhIn0sCisgIHsweDZhLCAicm9yIiwgIkEifSwKKyAgezB4NmIsICJydGwiLCAicyJ9LAorICB7MHg2YywgImptcCIsICIoYSkifSwKKyAgezB4NmQsICJhZGMiLCAiYSJ9LAorICB7MHg2ZSwgInJvciIsICJhIn0sCisgIHsweDZmLCAiYWRjIiwgImFsIn0sCisgIHsweDcwLCAiYnZzIiwgInIifSwKKyAgezB4NzEsICJhZGMiLCAiKGQpLHkifSwKKyAgezB4NzIsICJhZGMiLCAiKGQpIn0sCisgIHsweDczLCAiYWRjIiwgIihkLHMpLHkifSwKKyAgezB4NzQsICJzdHoiLCAiZCx4In0sCisgIHsweDc1LCAiYWRjIiwgImQseCJ9LAorICB7MHg3NiwgInJvciIsICJkLHgifSwKKyAgezB4NzcsICJhZGMiLCAiW2RdLHkifSwKKyAgezB4NzgsICJzZWkiLCAiaSJ9LAorICB7MHg3OSwgImFkYyIsICJhLHkifSwKKyAgezB4N2EsICJwbHkiLCAicyJ9LAorICB7MHg3YiwgInRkYyIsICJpIn0sCisgIHsweDdjLCAiam1wIiwgIihhLHgpIn0sCisgIHsweDdkLCAiYWRjIiwgImEseCJ9LAorICB7MHg3ZSwgInJvciIsICJhLHgifSwKKyAgezB4N2YsICJhZGMiLCAiYWwseCJ9LAorICB7MHg4MCwgImJyYSIsICJyIn0sCisgIHsweDgxLCAic3RhIiwgIihkLHgpIn0sCisgIHsweDgyLCAiYnJsIiwgInJsIn0sCisgIHsweDgzLCAic3RhIiwgImQscyJ9LAorICB7MHg4NCwgInN0eSIsICJkIn0sCisgIHsweDg1LCAic3RhIiwgImQifSwKKyAgezB4ODYsICJzdHgiLCAiZCJ9LAorICB7MHg4NywgInN0YSIsICJbZF0ifSwKKyAgezB4ODgsICJkZXkiLCAiaSJ9LAorICB7MHg4OSwgImJpdCIsICIjYSJ9LAorICB7MHg4YSwgInR4YSIsICJpIn0sCisgIHsweDhiLCAicGhiIiwgInMifSwKKyAgezB4OGMsICJzdHkiLCAiYSJ9LAorICB7MHg4ZCwgInN0YSIsICJhIn0sCisgIHsweDhlLCAic3R4IiwgImEifSwKKyAgezB4OGYsICJzdGEiLCAiYWwifSwKKyAgezB4OTAsICJiY2MiLCAiciJ9LAorICB7MHg5MSwgInN0YSIsICIoZCkseSJ9LAorICB7MHg5MiwgInN0YSIsICIoZCkifSwKKyAgezB4OTMsICJzdGEiLCAiKGQscykseSJ9LAorICB7MHg5NCwgInN0eSIsICJkLHgifSwKKyAgezB4OTUsICJzdGEiLCAiZCx4In0sCisgIHsweDk2LCAic3R4IiwgImQseCJ9LAorICB7MHg5NywgInN0YSIsICJbZF0seSJ9LAorICB7MHg5OCwgInR5YSIsICJpIn0sCisgIHsweDk5LCAic3RhIiwgImEseSJ9LAorICB7MHg5YSwgInR4cyIsICJpIn0sCisgIHsweDliLCAidHh5IiwgImkifSwKKyAgezB4OWMsICJzdHoiLCAiYSJ9LAorICB7MHg5ZCwgInN0YSIsICJhLHgifSwKKyAgezB4OWUsICJzdHoiLCAiYSx4In0sCisgIHsweDlmLCAic3RhIiwgImFsLHgifSwKKyAgezB4YTAsICJsZHkiLCAiI2kifSwKKyAgezB4YTEsICJsZGEiLCAiKGQseCkifSwKKyAgezB4YTIsICJsZHgiLCAiI2kifSwKKyAgezB4YTMsICJsZGEiLCAiZCxzIn0sCisgIHsweGE0LCAibGR5IiwgImQifSwKKyAgezB4YTUsICJsZGEiLCAiZCJ9LAorICB7MHhhNiwgImxkeCIsICJkIn0sCisgIHsweGE3LCAibGRhIiwgIltkXSJ9LAorICB7MHhhOCwgInRheSIsICJpIn0sCisgIHsweGE5LCAibGRhIiwgIiNhIn0sCisgIHsweGFhLCAidGF4IiwgImkifSwKKyAgezB4YWIsICJwbGIiLCAicyJ9LAorICB7MHhhYywgImxkeSIsICJhIn0sCisgIHsweGFkLCAibGRhIiwgImEifSwKKyAgezB4YWUsICJsZHgiLCAiYSJ9LAorICB7MHhhZiwgImxkYSIsICJhbCJ9LAorICB7MHhiMCwgImJjcyIsICJyIn0sCisgIHsweGIxLCAibGRhIiwgIihkKSx5In0sCisgIHsweGIyLCAibGRhIiwgIihkKSJ9LAorICB7MHhiMywgImxkYSIsICIoZCxzKSx5In0sCisgIHsweGI0LCAibGR5IiwgImQseCJ9LAorICB7MHhiNSwgImxkYSIsICJkLHgifSwKKyAgezB4YjYsICJsZHgiLCAiZCx5In0sCisgIHsweGI3LCAibGRhIiwgIltkXSx5In0sCisgIHsweGI4LCAiY2x2IiwgImkifSwKKyAgezB4YjksICJsZGEiLCAiYSx5In0sCisgIHsweGJhLCAidHN4IiwgImkifSwKKyAgezB4YmIsICJ0eXgiLCAiaSJ9LAorICB7MHhiYywgImxkeSIsICJhLHgifSwKKyAgezB4YmQsICJsZGEiLCAiYSx4In0sCisgIHsweGJlLCAibGR4IiwgImEseSJ9LAorICB7MHhiZiwgImxkYSIsICJhbCx4In0sCisgIHsweGMwLCAiY3B5IiwgIiNpIn0sCisgIHsweGMxLCAiY21wIiwgIihkLHgpIn0sCisgIHsweGMyLCAicmVwIiwgIiNjIn0sCisgIHsweGMzLCAiY21wIiwgImQscyJ9LAorICB7MHhjNCwgImNweSIsICJkIn0sCisgIHsweGM1LCAiY21wIiwgImQifSwKKyAgezB4YzYsICJkZWMiLCAiZCJ9LAorICB7MHhjNywgImNtcCIsICJbZF0ifSwKKyAgezB4YzgsICJpbnkiLCAiaSJ9LAorICB7MHhjOSwgImNtcCIsICIjYSJ9LAorICB7MHhjYSwgImRleCIsICJpIn0sCisgIHsweGNiLCAid2FpIiwgImkifSwKKyAgezB4Y2MsICJjcHkiLCAiYSJ9LAorICB7MHhjZCwgImNtcCIsICJhIn0sCisgIHsweGNlLCAiZGVjIiwgImEifSwKKyAgezB4Y2YsICJjbXAiLCAiYWwifSwKKyAgezB4ZDAsICJibmUiLCAiciJ9LAorICB7MHhkMSwgImNtcCIsICIoZCkseSJ9LAorICB7MHhkMiwgImNtcCIsICIoZCkifSwKKyAgezB4ZDMsICJjbXAiLCAiKGQscykseSJ9LAorICB7MHhkNCwgInBlaSIsICJkIn0sCisgIHsweGQ1LCAiY21wIiwgImQseCJ9LAorICB7MHhkNiwgImRlYyIsICJkLHgifSwKKyAgezB4ZDcsICJjbXAiLCAiW2RdLHkifSwKKyAgezB4ZDgsICJjbGQiLCAiaSJ9LAorICB7MHhkOSwgImNtcCIsICJhLHkifSwKKyAgezB4ZGEsICJwaHgiLCAicyJ9LAorICB7MHhkYiwgInN0cCIsICJpIn0sCisgIHsweGRjLCAiam1wIiwgIlthXSJ9LAorICB7MHhkZCwgImNtcCIsICJhLHgifSwKKyAgezB4ZGUsICJkZWMiLCAiYSx4In0sCisgIHsweGRmLCAiY21wIiwgImFsLHgifSwKKyAgezB4ZTAsICJjcHgiLCAiI2kifSwKKyAgezB4ZTEsICJzYmMiLCAiKGQseCkifSwKKyAgezB4ZTIsICJzZXAiLCAiI2MifSwKKyAgezB4ZTMsICJzYmMiLCAiZCxzIn0sCisgIHsweGU0LCAiY3B4IiwgImQifSwKKyAgezB4ZTUsICJzYmMiLCAiZCJ9LAorICB7MHhlNiwgImluYyIsICJkIn0sCisgIHsweGU3LCAic2JjIiwgIltkXSJ9LAorICB7MHhlOCwgImlueCIsICJpIn0sCisgIHsweGU5LCAic2JjIiwgIiNhIn0sCisgIHsweGVhLCAibm9wIiwgImkifSwKKyAgezB4ZWIsICJ4YmEiLCAiaSJ9LAorICB7MHhlYywgImNweCIsICJhIn0sCisgIHsweGVkLCAic2JjIiwgImEifSwKKyAgezB4ZWUsICJpbmMiLCAiYSJ9LAorICB7MHhlZiwgInNiYyIsICJhbCJ9LAorICB7MHhmMCwgImJlcSIsICJyIn0sCisgIHsweGYxLCAic2JjIiwgIihkKSx5In0sCisgIHsweGYyLCAic2JjIiwgIihkKSJ9LAorICB7MHhmMywgInNiYyIsICIoZCxzKSx5In0sCisgIHsweGY0LCAicGVhIiwgImEifSwKKyAgezB4ZjUsICJzYmMiLCAiZCx4In0sCisgIHsweGY2LCAiaW5jIiwgImQseCJ9LAorICB7MHhmNywgInNiYyIsICJbZF0seSJ9LAorICB7MHhmOCwgInNlZCIsICJpIn0sCisgIHsweGY5LCAic2JjIiwgImEseSJ9LAorICB7MHhmYSwgInBseCIsICJzIn0sCisgIHsweGZiLCAieGNlIiwgImkifSwKKyAgezB4ZmMsICJqc3IiLCAiKGEseCkifSwKKyAgezB4ZmQsICJzYmMiLCAiYSx4In0sCisgIHsweGZlLCAiaW5jIiwgImEseCJ9LAorICB7MHhmZiwgInNiYyIsICJhbCx4In0sCisgIDB9OworCisKK2ludCBwZnVuYyhhLGIpCitzdHJ1Y3Qgb3BpbmZvICphOworc3RydWN0IG9waW5mbyAqYjsKK3sKK3JldHVybiBzdHJjbXAoYS0+bW9kZSwgYi0+bW9kZSk7CisKK30KK3N0YXRpYyB2b2lkCitkdW1wX3RhYmxlICgpCit7CisgIGludCB4OworICBpbnQgeTsKKyAgcHJpbnRmICgiICB8Iik7CisgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiAgICV4ICAgfCIsIHgpOworICAgIH0KKyAgcHJpbnRmICgiXG4iKTsKKyAgcHJpbnRmICgiICB8Iik7CisgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQorICAgIHsKKyAgICAgIHByaW50ZiAoIi0tLS0tLS18Iik7CisgICAgfQorICBwcmludGYgKCJcbiIpOworCisgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiV4IHwiLCB5KTsKKyAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQorCXsKKwkgIHN0cnVjdCBvcGluZm8gKnAgPSAmb3B0YWJsZVt5ICogMTYgKyB4XTsKKwkgIGlmIChwLT5vcGNvZGUpCisJICAgIHsKKwkgICAgICBwcmludGYgKCIlLTdzIiwgcC0+b3Bjb2RlKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcHJpbnRmICgiKioqKioqKiIpOworCSAgICB9CisJICBwcmludGYgKCJ8Iik7CisJfQorICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgfCIpOworCisgICAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykKKwl7CisJICBzdHJ1Y3Qgb3BpbmZvICpwID0gJm9wdGFibGVbeSAqIDE2ICsgeF07CisJICBpZiAocC0+bW9kZSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIiUtN3MiLCBwLT5tb2RlKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcHJpbnRmICgiKioqKioqKiIpOworCSAgICB9CisJICBwcmludGYgKCJ8Iik7CisJfQorICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICAgIHByaW50ZiAoIiAgfCIpOworICAgICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyspCisJeworCSAgcHJpbnRmICgiLS0tLS0tLXwiKTsKKwl9CisKKworICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICB9Cit9CisKK2R0ICgpCit7CisjaWYgMAorICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgIHsKKyAgICAgIHN0cnVjdCBvcGluZm8gKnAgPSAmb3B0YWJsZVtpXTsKKyAgICAgIHByaW50ZiAoIi8qICUwMnggKi8gIiwgaSk7CisgICAgICBpZiAocC0+b3Bjb2RlKQorCXByaW50ZiAoIntcIiVzXCIsXCIlc1wiLCVkLCVkfSwiLCBwLT5vcGNvZGUtPm5hbWUsIHAtPmFkZHItPm5hbWUpOworCisgICAgICBwcmludGYgKCJcbiIpOworICAgIH0KKyNlbmRpZgorCit9CitzdGF0aWMKK3ZvaWQKK2luaXRfdGFibGUgKCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICB7CisgICAgICBzdHJ1Y3Qgb3BpbmZvICpwID0gb3B0YWJsZSArIGk7CisgICAgICBzdHJ1Y3QgYWluZm8gKmE7CisgICAgICBzdHJ1Y3Qgb2luZm8gKm87CisgICAgICBmb3IgKGEgPSBhbGlzdDsgYS0+bmFtZTsgYSsrKQorCXsKKwkgIGlmIChzdHJjbXAgKGEtPm5hbWUsIHAtPm1vZGUpID09IDApCisJICAgIHsKKwkgICAgICBwLT5haSA9IGE7CisJICAgICAgZ290byBkb25lOworCSAgICB9CisJfQorICAgICAgcHJpbnRmICgiYmFkICV4XG4iLCBpKTsKKyAgICBkb25lOjsKKyAgICAgIGZvciAobyA9IG9saXN0OyBvLT5uYW1lOyBvKyspCisJeworCSAgaWYgKHN0cmNtcCAoby0+bmFtZSwgcC0+b3Bjb2RlKSA9PSAwKQorCSAgICB7CisJICAgICAgcC0+b2kgPSBvOworCSAgICAgIGdvdG8gZG9uZW87CisJICAgIH0KKwl9CisgICAgICBwcmludGYgKCJiYWQgJXhcbiIsIGkpOworICAgIGRvbmVvOjsKKworICAgIH0KK30KKworLyogRHVtcCB0aGUgb3Bjb2RlcyBzb3J0ZWQgYnkgbmFtZSAqLworc3RhdGljCit2b2lkCithc3NlbWJsZXJfdGFibGUgKGFzKQoreworICBpbnQgaTsKKyAgc3RydWN0IG9pbmZvICpvOworICBzdHJ1Y3QgYWluZm8gKmE7CisgIGludCBuID0gMDsKKyAgLyogU3RlcCB0aHJvdWdoIHRoZSBzb3J0ZWQgbGlzdCBvZiBvcG5hbWVzICovCisgIHByaW50ZiAoIgkJCS8qIFdEQyA2NTgxNiBBc3NlbWJsZXIgb3Bjb2RlIHRhYmxlICovXG4iKTsKKyAgcHJpbnRmICgiCQkJLyogICAoZ2VuZXJhdGVkIGJ5IHRoZSBwcm9ncmFtIHNpbS93NjUvZ2VuY29kZSAtYSkgKi9cbiIpOworCisgIGZvciAoYSA9IGFsaXN0OyBhLT5uYW1lOyBhKyspCisgICAgeworICAgICAgcHJpbnRmICgiI2RlZmluZSBBRERSXyUtMjBzJWRcdCAvKiAlLTdzICovXG4iLCBhLT5lbnVtbmFtZSwgKytuLCBhLT5uYW1lKTsKKyAgICB9CisKKyAgcHJpbnRmICgic3RydWN0IG9waW5mbyB7XG5cdGludCB2YWw7XG5cdGludCBjb2RlO1xuXHRjaGFyICpuYW1lO1xuXHRpbnQgYW1vZGU7XG59O1xuIik7CisKKyAgcHJpbnRmICgic3RydWN0IG9waW5mbyBvcHRhYmxlWzI1N109e1xuIik7CisgIGlmIChhcykKKyAgICB7CisgICAgICBpID0gMTsKKyAgICAgIGZvciAobyA9IG9saXN0OyBvLT5uYW1lOyBvKyspCisJeworCSAgcHJpbnRmICgiI2RlZmluZSBPXyVzICVkXG4iLCBvLT5uYW1lLCBpKyspOworCX0KKyAgICAgIAorICAgICAgcXNvcnQgKG9wdGFibGUsIDI1Niwgc2l6ZW9mIChzdHJ1Y3Qgb3BpbmZvKSwgcGZ1bmMpOworCisgICAgICBwcmludGYgKCIjaWZkZWYgREVGSU5FX1RBQkxFXG4iKTsKKyAgICAgIGZvciAobyA9IG9saXN0OyBvLT5uYW1lOyBvKyspCisJeworCisJICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJICAgIHsKKwkgICAgICBzdHJ1Y3Qgb3BpbmZvICpwID0gb3B0YWJsZSArIGk7CisKKwkgICAgICBpZiAocC0+b2kgPT0gbykKKwkJeworCQkgIC8qIFRoaXMgb3Bjb2RlIGlzIG9mIHRoZSByaWdodCBuYW1lICovCisJCSAgcHJpbnRmICgiXHR7MHglMDJYLFx0T18lcyxcdFwiJXNcIixcdEFERFJfJXN9LFxuIiwgcC0+Y29kZSwgcC0+b2ktPm5hbWUsIHAtPm9pLT5uYW1lLCBwLT5haS0+ZW51bW5hbWUpOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCXsKKwkgIHN0cnVjdCBvcGluZm8gKnAgPSBvcHRhYmxlICsgaTsKKwkgIHByaW50ZiAoIlx0ezB4JTAyWCxcdFwiJXNcIixcdEFERFJfJXN9LFxuIiwgaSwgcC0+b2ktPm5hbWUsIHAtPmFpLT5lbnVtbmFtZSk7CisJfQorICAgIH0KKworICBwcmludGYgKCIwfTtcbiIpOworICBwcmludGYgKCIjZW5kaWZcbiIpOworCisKKyAgLyogR2VuZXJhdGUgdGhlIG9wZXJhbmQgZGlzYXNzZW1ibHkgY2FzZSBsaXN0ICovCisKKyAgcHJpbnRmICgiI2RlZmluZSBESVNBU00oKVxcXG4iKTsKKyAgeworICAgIHN0cnVjdCBhaW5mbyAqYTsKKyAgICBmb3IgKGEgPSBhbGlzdDsgYS0+bmFtZTsgYSsrKQorICAgICAgeworCXByaW50ZiAoIiAgY2FzZSBBRERSXyVzOlxcXG5cdCIsIGEtPmVudW1uYW1lKTsKKwlpZiAoc3RyY21wIChhLT5lbnVtbmFtZSwgIkJMT0NLX01PVkUiKSA9PSAwKQorCSAgeworCSAgICBwcmludGYgKCJhcmdzWzBdID0gKGFzUl9XNjVfQUJTMTYgPj44KSAmMHhmZjtcXFxuIik7CisJICAgIHByaW50ZiAoIlx0YXJnc1sxXSA9ICggYXNSX1c2NV9BQlMxNiAmIDB4ZmYpO1xcXG4iKTsKKwkgICAgcHJpbnRmICgiXHRwcmludF9vcGVyYW5kICgwLFwiXHQkMCwkMVwiLGFyZ3MpO1xcXG4iKTsKKwkgIH0KKwllbHNlIGlmIChhLT5yZWxvYzAgPT0gMCkgCisJICB7CisJICAgIHByaW50ZiAoInByaW50X29wZXJhbmQgKDAsIFwiXHQlc1wiLCAwKTtcXFxuIiwgYS0+ZGlzYXNtc3RyaW5nICk7CisJICB9CisJZWxzZSBpZiAoc3RybGVuIChhLT5yZWxvYzApKQorCSAgeworCSAgICBwcmludGYgKCJhcmdzWzBdID0gIik7CisJICAgIHByaW50ZiAoYS0+cmVsb2MwLCAiYXMiLCJhcyIpOworCSAgICBwcmludGYgKCI7XFxcbiIpOworCSAgICBwcmludGYgKCJcdHByaW50X29wZXJhbmQgKCVkLCBcIlx0JXNcIiwgYXJncyk7XFxcbiIsCisJCSAgICBhLT5yZWdmbGFnLAorCQkgICAgYS0+ZGlzYXNtc3RyaW5nKTsKKwkgIH0KKwkKKwlwcmludGYgKCJcdHNpemUgKz0gJXM7XFxcblx0YnJlYWs7XFxcbiIsIGEtPnNpemVyKTsKKyAgICAgIH0KKyAgfQorCisgIHByaW50ZiAoIlxuIik7CisKKyAgLyogR2VuZXJhdGUgdGhlIG9wZXJhbmQgc2l6ZSBhbmQgdHlwZSBjYXNlIGxpc3QgKi8KKworICBwcmludGYgKCIjZGVmaW5lIEdFVElORk8oc2l6ZSx0eXBlLHBjcmVsKVxcXG4iKTsKKyAgeworICAgIHN0cnVjdCBhaW5mbyAqYTsKKyAgICBmb3IgKGEgPSBhbGlzdDsgYS0+bmFtZTsgYSsrKQorICAgICAgeworCXByaW50ZiAoIlx0Y2FzZSBBRERSXyVzOiAiLCBhLT5lbnVtbmFtZSk7CisJcHJpbnRmICgic2l6ZSA9ICVzO3R5cGU9IiwgYS0+c2l6ZXIpOworCWlmIChhLT5yZWxvYzAgJiYgc3RybGVuIChhLT5yZWxvYzApKQorCSAgeworCSAgICBwcmludGYgKGEtPnJlbG9jMCwgIiIsICIiKTsKKwkgIH0KKwllbHNlCisJICBwcmludGYgKCItMSIpOworCXByaW50ZiAoIjtwY3JlbD0lZDsiLCBhLT5uYW1lWzBdID09ICdQJyk7CisJcHJpbnRmICgiYnJlYWs7XFxcbiIpOworICAgICAgfQorICB9CisgIHByaW50ZiAoIlxuIik7Cit9CisKKworLyogV3JpdGUgb3V0IGV4YW1wbGVzIG9mIGVhY2ggb3Bjb2RlICovCitzdGF0aWMKK3ZvaWQKK3Rlc3RfdGFibGUgKCkKK3sKKyAgc3RydWN0IG9waW5mbyAqbzsKKyAgZm9yIChvID0gb3B0YWJsZTsgby0+b3Bjb2RlOyBvKyspCisgICAgeworICAgICAgcHJpbnRmICgiXHQlc1x0Iiwgby0+b3Bjb2RlKTsKKyAgICAgIHByaW50ZiAoby0+YWktPmRpc2FzbXN0cmluZywgMHg2NTQzMjEwLCAweDY1NDMyMTApOworICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICB9CisKK30KKworc3RhdGljIHZvaWQKK29wX3RhYmxlICgpCit7CisgIHN0cnVjdCBvcGluZm8gKm87CisgIGludCBpID0gMDsKKyAgLyogV3JpdGUgZm91ciBvcHRhYmxlcywgTT0wLDEgWD0wLDEgKi8KKworICBmb3IgKG8gPSBvcHRhYmxlOyBvLT5vcGNvZGU7IG8rKykKKyAgICB7CisgICAgICBwcmludGYgKCJ7MHglMDJ4LCBcIiVzXCIsIFwiJXNcIlx0fSxcbiIsCisJICAgICAgaSsrLAorCSAgICAgIG8tPm9wY29kZSwKKwkgICAgICBvLT5tb2RlKTsKKyAgICB9Cit9CisKK2ludCB3b3JrZWRfb3V0X2x2YWw7CitzdGF0aWMgdm9pZAorZ2VuZmV0Y2ggKGFtb2RlLCBzaXplKQorICAgICBzdHJ1Y3QgYWluZm8gKmFtb2RlOworICAgICBpbnQgc2l6ZTsKK3sKKyAgaWYgKGFtb2RlLT5ob3dsdmFsKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKGFtb2RlLT5uYW1lLCAiQSIpID09IDApCisJeworCSAgLyogQ2FuJ3QgZ2V0IHRoZSBsdmFsIGZvciB0aGUgYWNjdW11bGF0b3IgKi8KKwkgIHByaW50ZiAoInNyYyA9IEdFVF9BO1xuIik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHByaW50ZiAoIiVzXG4iLCBhbW9kZS0+aG93bHZhbCk7Cit3b3JrZWRfb3V0X2x2YWwgPSAxOworCSAgaWYgKHNpemUgPT0gMCkKKwkgICAgeworCSAgICAgIHByaW50ZiAoInNyYyA9IGZldGNoMTYgKGx2YWwpO1xuIik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHByaW50ZiAoInNyYyA9IGZldGNoOCAobHZhbCk7XG4iKTsKKwkgICAgfQorCX0KKyAgICB9CisKK30KKworc3RhdGljIHZvaWQKK2dlbnN0b3JlIChhbW9kZSwgc2l6ZSkKKyAgICAgc3RydWN0IGFpbmZvICphbW9kZTsKKyAgICAgaW50IHNpemU7Cit7CisgIGlmIChhbW9kZS0+aG93bHZhbCkKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChhbW9kZS0+bmFtZSwgIkEiKSA9PSAwKQorCXsKKwkgIC8qIENhbid0IGdldCB0aGUgbHZhbCBmb3IgdGhlIGFjY3VtdWxhdG9yICovCisJICBwcmludGYgKCJTRVRfQSAoc3JjKTtcbiIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoIXdvcmtlZF9vdXRfbHZhbCkKKwkgICAgcHJpbnRmICgiJXNcbiIsIGFtb2RlLT5ob3dsdmFsKTsKKwkgIGlmIChzaXplID09IDApCisJICAgIHsKKwkgICAgICBwcmludGYgKCJzdG9yZTE2KGx2YWwsIHNyYyk7XG4iKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcHJpbnRmICgic3RvcmU4KGx2YWwsIHNyYyk7XG4iKTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisvKiBHZW5lcmF0ZSB0aGUgY29kZSB0byBzaW11bGF0ZSB0aGUgaW5zdHJ1Y3Rpb25zICovCitzdGF0aWMgdm9pZAorY29kZV90YWJsZSAoKQoreworICBzdHJ1Y3Qgb3BpbmZvICpvOworICBpbnQgeCwgbTsKKyAgcHJpbnRmKCIjaW5jbHVkZSBcImludGVycC5oXCJcbiIpOworCisgIGZvciAoeCA9IDA7IHggPCAyOyB4KyspIHsKKyAgICBmb3IgKG0gPSAwOyBtIDwgMjsgbSsrKSB7CisgICAgICBwcmludGYoImlmdW5jX1glZF9NJWQoKSB7XG4iLHgsbSk7CisgICAgICBwcmludGYoIiN1bmRlZiBHRVRfTUJJVFxuIik7CisgICAgICBwcmludGYoIiN1bmRlZiBHRVRfWEJJVFxuIik7CisgICAgICBwcmludGYoIiNkZWZpbmUgR0VUX1hCSVQgJWRcbiIsIHgpOworICAgICAgcHJpbnRmKCIjZGVmaW5lIEdFVF9NQklUICVkXG4iLCBtKTsKKyAgICAgIHByaW50ZigiU1RBUlRGVU5DKCk7XG4iKTsKKyAgICAgIHByaW50ZigiZG8geyByZWdpc3RlciBvcGNvZGUgPSBmZXRjaDgoR0VUX1BCUlBDKTsgaW5zdHMrKzsgSU5DX1BDKDEpO1xuIik7CisgICAgICBwcmludGYgKCJzd2l0Y2ggKG9wY29kZSkge1xuIik7CisgICAgICBmb3IgKG8gPSBvcHRhYmxlOyBvLT5vcGNvZGU7IG8rKykKKwl7CisJICBwcmludGYgKCIJCS8qICVzICVzICovXG4iLCBvLT5vcGNvZGUsIG8tPmFpLT5uYW1lKTsKKwkgIHByaW50ZiAoImNhc2UgMHglMDJ4OlxuIiwgby0+Y29kZSk7CisJICBwcmludGYgKCJ7XG4iKTsKKwkgIHByaW50ZiAoImludCBsIDtcbiIpOworCSAgcHJpbnRmICgicmVnaXN0ZXIgaW50IHNyYztcbiIpOworCSAgcHJpbnRmICgicmVnaXN0ZXIgaW50IGx2YWw7XG4iKTsKK3dvcmtlZF9vdXRfbHZhbCA9IDA7CisJICBzd2l0Y2ggKG8tPm9pLT5ob3dzcmMpCisJICAgIHsKKwkgICAgY2FzZSBQT1BfTToKKwkgICAgICBpZiAobSA9PSAwKQorCQlwcmludGYgKCJQT1AxNiAoc3JjKTsiKTsKKwkgICAgICBlbHNlCisJCXByaW50ZiAoIlBPUDgoc3JjKTsiKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBQT1BfWDoKKwkgICAgICBpZiAoeCA9PSAwKQorCQlwcmludGYgKCJQT1AxNiAoc3JjKTsiKTsKKwkgICAgICBlbHNlCisJCXByaW50ZiAoIlBPUDggKHNyYyk7Iik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUE9QXzg6CisJICAgICAgcHJpbnRmICgiUE9QOCAoc3JjKTsiKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBQT1BfMTY6CisJICAgICAgcHJpbnRmICgiUE9QMTYgKHNyYyk7Iik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBTVEFOREFSRF9QQ19HRVQ6CisJICAgICAgcHJpbnRmICgiJXNcbiIsIG8tPmFpLT5ob3dsdmFsKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIEdFVF9NOgorCSAgICAgIGdlbmZldGNoIChvLT5haSwgbSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRzJfR0VUOgorCSAgICAgIGdlbmZldGNoIChvLT5haSwgbSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgR0VUX1g6CisJICAgICAgZ2VuZmV0Y2ggKG8tPmFpLCB4KTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBCUkFOQ0g6CisJICAgICAgcHJpbnRmICgiJXMiLCBvLT5haS0+aG93bHZhbCk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQ09QX0dFVDoKKwkgICAgICBnZW5mZXRjaChvLT5haSwxKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBTVE9SRV9YOgorCSAgICBjYXNlIFNUT1JFX006CisJICAgICAgOworCSAgICB9CisKKwkgIHN3aXRjaCAoby0+b2ktPmhvd3NyYykKKwkgICAgeworCSAgICBjYXNlIEJSQU5DSDoKKwkgICAgICBwcmludGYgKCJpZiAoJXMpIHsgU0VUX09OTFlfUEMobHZhbCk7fSAiLCBvLT5vaS0+aG93dG8pOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFNQRUNJQUxfQ0FTRToKKwkgICAgY2FzZSBHRVRfTToKKwkgICAgY2FzZSBHRVRfWDoKKwkgICAgY2FzZSBTVE9SRV9YOgorCSAgICBjYXNlIFNUQU5EQVJEX1BDX0dFVDoKKwkgICAgY2FzZSBHMl9HRVQ6CisJICAgIGNhc2UgUFVTSF8xNjoKKwkgICAgY2FzZSBQVVNIXzg6CisJICAgIGNhc2UgUFVTSF9NOgorCSAgICBjYXNlIFBVU0hfWDoKKwkgICAgY2FzZSBQT1BfMTY6CisJICAgIGNhc2UgUE9QXzg6CisJICAgIGNhc2UgUE9QX006CisJICAgIGNhc2UgUE9QX1g6CisJICAgIGNhc2UgQ09QX0dFVDoKKwkgICAgY2FzZSBTVE9SRV9NOgorCSAgICAgIHByaW50ZiAoIiVzIiwgby0+b2ktPmhvd3RvKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICBzd2l0Y2ggKG8tPm9pLT5ob3dzcmMpCisJICAgIHsKKwkgICAgY2FzZSBTVE9SRV9NOgorCSAgICAgIGdlbnN0b3JlIChvLT5haSwgbSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgU1RPUkVfWDoKKwkgICAgICBnZW5zdG9yZSAoby0+YWksIHgpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFBVU0hfTToKKwkgICAgICBpZiAobSA9PSAwKQorCQlwcmludGYgKCJQVVNIMTYgKHNyYyk7Iik7CisJICAgICAgZWxzZQorCQlwcmludGYgKCJQVVNIOChzcmMpOyIpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIFBVU0hfWDoKKwkgICAgICBpZiAoeCA9PSAwKQorCQlwcmludGYgKCJQVVNIMTYgKHNyYyk7Iik7CisJICAgICAgZWxzZQorCQlwcmludGYgKCJQVVNIOCAoc3JjKTsiKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBQVVNIXzg6CisJICAgICAgcHJpbnRmICgiUFVTSDggKHNyYyk7Iik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUFVTSF8xNjoKKwkgICAgICBwcmludGYgKCJQVVNIMTYgKHNyYyk7Iik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRzJfR0VUOgorCSAgICAgIGdlbnN0b3JlIChvLT5haSwgeCwgbSk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIHByaW50ZiAoIn1cbiIpOworCisJICBwcmludGYgKCJicmVhaztcbiIpOworCX0KKyAgICAgIHByaW50ZiAoIn1cbn1cbiIpOworICAgICAgcHJpbnRmKCJ3aGlsZSAoIXNhdmVkX3N0YXRlLmV4Y2VwdGlvbik7XG4iKTsKKyAgICAgIHByaW50ZigiI3VuZGVmIEdFVF9NQklUXG4iKTsKKyAgICAgIHByaW50ZigiI3VuZGVmIEdFVF9YQklUXG4iKTsKKyAgICAgIHByaW50ZigiI2RlZmluZSBHRVRfTUJJVCAodGhlX21iaXQpXG4iKTsKKyAgICAgIHByaW50ZigiI2RlZmluZSBHRVRfWEJJVCAodGhlX3hiaXQpXG4iKTsKKyAgICAgIAorICAgICAgcHJpbnRmKCJFTkRGVU5DKCk7XG4iKTsKKyAgICAgIHByaW50ZigifSIpOworICAgIH0KKyAgfQorfQorCitpbnQKK21haW4gKGFjLCBhdikKKyAgICAgY2hhciAqKmF2OworeworICBpbml0X3RhYmxlICgpOworCisgIGlmIChhYyA+IDEpCisgICAgeworICAgICAgaWYgKGF2WzFdWzFdID09ICdhJykKKwl7CisJICBhc3NlbWJsZXJfdGFibGUgKDEpOworCX0KKyAgICAgIGlmIChhdlsxXVsxXSA9PSAndCcpCisJeworCSAgdGVzdF90YWJsZSAoKTsKKwl9CisgICAgICBpZiAoYXZbMV1bMV0gPT0gJ28nKQorCXsKKwkgIG9wX3RhYmxlICgpOworCX0KKyAgICAgIGlmIChhdlsxXVsxXSA9PSAnYycpCisJeworCSAgY29kZV90YWJsZSAoKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgZHVtcF90YWJsZSAoKTsKKworICBkdCAoKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NpbS93NjUvaW50ZXJwLmMgYi9zaW0vdzY1L2ludGVycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YzRlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vdzY1L2ludGVycC5jCkBAIC0wLDAgKzEsMzg4IEBACisvKiBTaW11bGF0b3IgZm9yIHRoZSBXREMgNjU4MTYgYXJjaGl0ZWN0dXJlLgorCisgICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgorICAgc2FjQGN5Z251cy5jb20KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgVzY1IHNpbQorCisKKwkJVEhJUyBTT0ZUV0FSRSBJUyBOT1QgQ09QWVJJR0hURUQKKworICAgQ3lnbnVzIG9mZmVycyB0aGUgZm9sbG93aW5nIGZvciB1c2UgaW4gdGhlIHB1YmxpYyBkb21haW4uICBDeWdudXMKKyAgIG1ha2VzIG5vIHdhcnJhbnR5IHdpdGggcmVnYXJkIHRvIHRoZSBzb2Z0d2FyZSBvciBpdCdzIHBlcmZvcm1hbmNlCisgICBhbmQgdGhlIHVzZXIgYWNjZXB0cyB0aGUgc29mdHdhcmUgIkFTIElTIiB3aXRoIGFsbCBmYXVsdHMuCisKKyAgIENZR05VUyBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgV0lUSCBSRUdBUkQgVE8KKyAgIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1RJTUVfSAorI2luY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAicmVtb3RlLXNpbS5oIgorI2luY2x1ZGUgIi4uLy4uL25ld2xpYi9saWJjL3N5cy93NjUvc3lzL3N5c2NhbGwuaCIKKworI2luY2x1ZGUgImludGVycC5oIgorCitzYXZlZF9zdGF0ZV90eXBlIHNhdmVkX3N0YXRlOworCitpbnQKK2dldF9ub3cgKCkKK3sKKyAgcmV0dXJuIHRpbWUgKChsb25nICopIDApOworfQordm9pZAorY29udHJvbF9jIChzaWcsIGNvZGUsIHNjcCwgYWRkcikKKyAgICAgaW50IHNpZzsKKyAgICAgaW50IGNvZGU7CisgICAgIGNoYXIgKnNjcDsKKyAgICAgY2hhciAqYWRkcjsKK3sKKyAgc2F2ZWRfc3RhdGUuZXhjZXB0aW9uID0gU0lHSU5UOworfQorCit3YWkgKCkKK3sKKyAgc2F2ZWRfc3RhdGUuZXhjZXB0aW9uID0gU0lHVFJBUDsKK30KKworCisKK3dkbSAoYWNjLCB4KQorICAgICBpbnQgYWNjOworICAgICBpbnQgeDsKKworeworaW50IGN5Y2xlczsKKyAgLyogVGhlIHggcG9pbnRzIHRvIHdoZXJlIHRoZSByZWdpc3RlcnMgbGl2ZSwgYWNjIGhhcyBjb2RlICovCisKKyNkZWZpbmUgUihhcmcpICAoeCArICBhcmcgKiAyKQordW5zaWduZWQgIFIwID0gUigwKTsKK3Vuc2lnbmVkICBSNCA9IFIoNCk7Cit1bnNpZ25lZCAgUjUgPSBSKDUpOwordW5zaWduZWQgIFI2ID0gUig2KTsKK3Vuc2lnbmVkICBSNyA9IFIoNyk7Cit1bnNpZ25lZCAgUjggPSBSKDgpOwordW5zaWduZWQgY2hhciAqbWVtb3J5ID0gc2F2ZWRfc3RhdGUubWVtb3J5OworICBpbnQgYTEgPSBmZXRjaDE2IChSICg0KSk7CisgIHN3aXRjaCAoYTEpCisgICAgeworICAgIGNhc2UgU1lTX3dyaXRlOgorICAgICAgeworCWludCBmaWxlID0gZmV0Y2gxNiAoUjUpOworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IGZldGNoMjQgKFI2KSArIG1lbW9yeTsKKwlpbnQgbGVuID0gZmV0Y2gxNiAoUjgpOworCWludCByZXMgPSB3cml0ZSAoZmlsZSwgYnVmLCBsZW4pOworCXN0b3JlMTYgKFIwLCByZXMpOworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgMDoKKyAgICAgIHByaW50ZiAoIiVjIiwgYWNjKTsKKyAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIHNhdmVkX3N0YXRlLmV4Y2VwdGlvbiA9IFNJR1RSQVA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgc2F2ZWRfc3RhdGUuZXhjZXB0aW9uID0gU0lHSUxMOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisKK3ZvaWQKK3NpbV9yZXN1bWUgKHN0ZXAsIGluc2lnbmFsKQorICAgICBpbnQgc3RlcDsKKyAgICAgaW50IGluc2lnbmFsOworeworICB2b2lkICgqcHJldikgKCk7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTsKKyAgaWYgKHN0ZXApCisgICAgeworICAgICAgc2F2ZWRfc3RhdGUuZXhjZXB0aW9uID0gU0lHVFJBUDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzYXZlZF9zdGF0ZS5leGNlcHRpb24gPSAwOworICAgIH0KKworCisgIHByZXYgPSBzaWduYWwgKFNJR0lOVCwgY29udHJvbF9jKTsKKyAgZG8KKyAgICB7CisgICAgICBpbnQgeCA9IChzYXZlZF9zdGF0ZS5wID4+IDQpICYgMTsKKyAgICAgIGludCBtID0gKHNhdmVkX3N0YXRlLnAgPj4gNSkgJiAxOworICAgICAgaWYgKHggPT0gMCAmJiBtID09IDApCisJeworCSAgaWZ1bmNfWDBfTTAgKCk7CisJfQorICAgICAgZWxzZSBpZiAoeCA9PSAwICYmIG0gPT0gMSkKKwl7CisJICBpZnVuY19YMF9NMSAoKTsKKwl9CisgICAgICBlbHNlIGlmICh4ID09IDEgJiYgbSA9PSAwKQorCXsKKwkgIGlmdW5jX1gxX00wICgpOworCX0KKyAgICAgIGVsc2UgaWYgKHggPT0gMSAmJiBtID09IDEpCisJeworCSAgaWZ1bmNfWDFfTTEgKCk7CisJfQorICAgIH0KKyAgd2hpbGUgKHNhdmVkX3N0YXRlLmV4Y2VwdGlvbiA9PSAwKTsKKworICBzaWduYWwgKFNJR0lOVCwgcHJldik7Cit9CisKKworCisKK2luaXRfcG9pbnRlcnMgKCkKK3sKKyAgaWYgKCFzYXZlZF9zdGF0ZS5tZW1vcnkpCisgICAgeworICAgICAgc2F2ZWRfc3RhdGUubWVtb3J5ID0gY2FsbG9jICg2NCAqIDEwMjQsIE5VTVNFR1MpOworICAgIH0KK30KKworaW50CitzaW1fd3JpdGUgKGFkZHIsIGJ1ZmZlciwgc2l6ZSkKKyAgICAgU0lNX0FERFIgYWRkcjsKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICAgICBpbnQgc2l6ZTsKK3sKKyAgaW50IGk7CisgIGluaXRfcG9pbnRlcnMgKCk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICB7CisgICAgICBzYXZlZF9zdGF0ZS5tZW1vcnlbKGFkZHIgKyBpKSAmIE1NQVNLXSA9IGJ1ZmZlcltpXTsKKyAgICB9CisgIHJldHVybiBzaXplOworfQorCitpbnQKK3NpbV9yZWFkIChhZGRyLCBidWZmZXIsIHNpemUpCisgICAgIFNJTV9BRERSIGFkZHI7CisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKyAgICAgaW50IHNpemU7Cit7CisgIGludCBpOworCisgIGluaXRfcG9pbnRlcnMgKCk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICB7CisgICAgICBidWZmZXJbaV0gPSBzYXZlZF9zdGF0ZS5tZW1vcnlbKGFkZHIgKyBpKSAmIE1NQVNLXTsKKyAgICB9CisgIHJldHVybiBzaXplOworfQorCisKKworc3RydWN0Cit7CisgIHVuc2lnbmVkIGludCAqcHRyOworICBpbnQgc2l6ZTsKK30KK3JpbmZvW10gPQorCit7CisgICZzYXZlZF9zdGF0ZS5yWzBdLCAyLAorICAmc2F2ZWRfc3RhdGUuclsxXSwgMiwKKyAgJnNhdmVkX3N0YXRlLnJbMl0sIDIsCisgICZzYXZlZF9zdGF0ZS5yWzNdLCAyLAorICAmc2F2ZWRfc3RhdGUucls0XSwgMiwKKyAgJnNhdmVkX3N0YXRlLnJbNV0sIDIsCisgICZzYXZlZF9zdGF0ZS5yWzZdLCAyLAorICAmc2F2ZWRfc3RhdGUucls3XSwgMiwKKyAgJnNhdmVkX3N0YXRlLnJbOF0sIDIsCisgICZzYXZlZF9zdGF0ZS5yWzldLCAyLAorICAmc2F2ZWRfc3RhdGUuclsxMF0sIDIsCisgICZzYXZlZF9zdGF0ZS5yWzExXSwgMiwKKyAgJnNhdmVkX3N0YXRlLnJbMTJdLCAyLAorICAmc2F2ZWRfc3RhdGUuclsxM10sIDIsCisgICZzYXZlZF9zdGF0ZS5yWzE0XSwgMiwKKyAgJnNhdmVkX3N0YXRlLnJbMTVdLCA0LAorICAmc2F2ZWRfc3RhdGUucGMsIDQsCisgICZzYXZlZF9zdGF0ZS5hLCA0LAorICAmc2F2ZWRfc3RhdGUueCwgNCwKKyAgJnNhdmVkX3N0YXRlLnksIDQsCisgICZzYXZlZF9zdGF0ZS5kYnIsIDQsCisgICZzYXZlZF9zdGF0ZS5kLCA0LAorICAmc2F2ZWRfc3RhdGUucywgNCwKKyAgJnNhdmVkX3N0YXRlLnAsIDQsCisgICZzYXZlZF9zdGF0ZS50aWNrcywgNCwKKyAgJnNhdmVkX3N0YXRlLmN5Y2xlcywgNCwKKyAgJnNhdmVkX3N0YXRlLmluc3RzLCA0LAorICAwCit9OworCitpbnQKK3NpbV9zdG9yZV9yZWdpc3RlciAocm4sIHZhbHVlLCBsZW5ndGgpCisgICAgIGludCBybjsKKyAgICAgdW5zaWduZWQgY2hhciAqdmFsdWU7CisgICAgIGludCBsZW5ndGg7Cit7CisgIHVuc2lnbmVkIGludCB2YWw7CisgIGludCBpOworICB2YWwgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgcmluZm9bcm5dLnNpemU7IGkrKykKKyAgICB7CisgICAgICB2YWwgfD0gKCp2YWx1ZSsrKSA8PCAoaSAqIDgpOworICAgIH0KKworICAqKHJpbmZvW3JuXS5wdHIpID0gdmFsOworICByZXR1cm4gLTE7Cit9CisKK2ludAorc2ltX2ZldGNoX3JlZ2lzdGVyIChybiwgYnVmLCBsZW5ndGgpCisgICAgIGludCBybjsKKyAgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgICBpbnQgbGVuZ3RoOworeworICB1bnNpZ25lZCBpbnQgdmFsID0gKihyaW5mb1tybl0ucHRyKTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHJpbmZvW3JuXS5zaXplOyBpKyspCisgICAgeworICAgICAgKmJ1ZisrID0gdmFsOworICAgICAgdmFsID0gdmFsID4+IDg7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKKworc2ltX3JlZ19zaXplIChuKQoreworICByZXR1cm4gcmluZm9bbl0uc2l6ZTsKK30KK2ludAorc2ltX3RyYWNlICgpCit7CisgIHJldHVybiAwOworfQorCit2b2lkCitzaW1fc3RvcF9yZWFzb24gKHJlYXNvbiwgc2lncmMpCisgICAgIGVudW0gc2ltX3N0b3AgKnJlYXNvbjsKKyAgICAgaW50ICpzaWdyYzsKK3sKKyAgKnJlYXNvbiA9IHNpbV9zdG9wcGVkOworICAqc2lncmMgPSBzYXZlZF9zdGF0ZS5leGNlcHRpb247Cit9CisKK2ludAorc2ltX3NldF9wYyAoeCkKKyAgICAgU0lNX0FERFIgeDsKK3sKKyAgc2F2ZWRfc3RhdGUucGMgPSB4OworICByZXR1cm4gMDsKK30KKworCit2b2lkCitzaW1faW5mbyAodmVyYm9zZSkKKyAgICAgaW50IHZlcmJvc2U7Cit7CisgIGRvdWJsZSB0aW1ldGFrZW4gPSAoZG91YmxlKSBzYXZlZF9zdGF0ZS50aWNrczsKKyAgZG91YmxlIHZpcnR0aW1lID0gc2F2ZWRfc3RhdGUuY3ljbGVzIC8gMi4wZTY7CisKKyAgcHJpbnRmICgiXG5cbiMgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkICAlMTBkXG4iLCBzYXZlZF9zdGF0ZS5pbnN0cyk7CisgIHByaW50ZiAoIiMgY3ljbGVzICAgICAgICAgICAgICAgICAlMTBkXG4iLCBzYXZlZF9zdGF0ZS5jeWNsZXMpOworICBwcmludGYgKCIjIHJlYWwgdGltZSB0YWtlbiAgICAgICAgJTEwLjRmXG4iLCB0aW1ldGFrZW4pOworICBwcmludGYgKCIjIHZpcnR1YWwgdGltZSB0YWtlbiAgICAgJTEwLjRmXG4iLCB2aXJ0dGltZSk7CisKKyAgaWYgKHRpbWV0YWtlbiAhPSAwKQorICAgIHsKKyAgICAgIHByaW50ZiAoIiMgY3ljbGVzL3NlY29uZCAgICAgICAgICAlMTBkXG4iLCAoaW50KSAoc2F2ZWRfc3RhdGUuY3ljbGVzIC8gdGltZXRha2VuKSk7CisgICAgICBwcmludGYgKCIjIHNpbXVsYXRpb24gcmF0aW8gICAgICAgJTEwLjRmXG4iLCB2aXJ0dGltZSAvIHRpbWV0YWtlbik7CisgICAgfQorCit9CisKKworCit2b2lkCitzaW1fb3BlbiAoa2luZCwgY2IsIGFiZmQsIGFyZ3YpCisgICAgIFNJTV9PUEVOX0tJTkQga2luZDsKKyAgICAgaG9zdF9jYWxsYmFjayAqY2I7CisgICAgIHN0cnVjdCBfYmZkICphYmZkOworICAgICBjaGFyICoqYXJndjsKK3sKK30KKworCisKKyN1bmRlZiBmZXRjaDgKK2ZldGNoOGZ1bmMgKHgpCit7CisgIGlmICh4ICYgfk1NQVNLKQorICAgIHsKKyAgICAgIHNhdmVkX3N0YXRlLmV4Y2VwdGlvbiA9IFNJR0JVUzsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgcmV0dXJuIHNhdmVkX3N0YXRlLm1lbW9yeVt4XTsKK30KKworZmV0Y2g4ICh4KQoreworcmV0dXJuIGZldGNoOGZ1bmMoeCk7Cit9CisKK3ZvaWQKK3NpbV9jbG9zZSAocXVpdHRpbmcpCisgICAgIGludCBxdWl0dGluZzsKK3sKKyAgLyogbm90aGluZyB0byBkbyAqLworfQorCitpbnQKK3NpbV9sb2FkIChwcm9nLCBmcm9tX3R0eSkKKyAgICAgY2hhciAqcHJvZzsKKyAgICAgaW50IGZyb21fdHR5OworeworICAvKiBSZXR1cm4gbm9uemVybyBzbyBnZGIgd2lsbCBoYW5kbGUgaXQuICAqLworICByZXR1cm4gMTsKK30KKworCit2b2lkCitzaW1fY3JlYXRlX2luZmVyaW9yIChhYmZkLCBhcmd2LCBlbnYpCisgICAgIHN0cnVjdCBfYmZkICphYmZkOworICAgICBjaGFyICoqYXJndjsKKyAgICAgY2hhciAqKmVudjsKK3sKKyAgU0lNX0FERFIgc3RhcnRfYWRkcmVzczsKKyAgaW50IHBjOworICBpZiAoYWJmZCAhPSBOVUxMKQorICAgIHN0YXJ0X2FkZHJlc3MgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOworICBlbHNlCisgICAgc3RhcnRfYWRkcmVzcyA9IDA7IC8qPz8qLworICAvKiA/Pz8gV2UgYXNzdW1lIHRoaXMgaXMgYSA0IGJ5dGUgcXVhbnRpdHkuICAqLworICBwYyA9IHN0YXJ0X2FkZHJlc3M7CisgIHNpbV9zdG9yZV9yZWdpc3RlciAoMTYsICh1bnNpZ25lZCBjaGFyICopICZwYyk7Cit9CisKK3ZvaWQKK3NpbV9zZXRfY2FsbGJhY2tzIChwdHIpCitzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1Y3QgKnB0cjsKK3sKKworfQpkaWZmIC0tZ2l0IGEvc2ltL3c2NS9pbnRlcnAuaCBiL3NpbS93NjUvaW50ZXJwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkNWQyMgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS93NjUvaW50ZXJwLmgKQEAgLTAsMCArMSwxOTQgQEAKKyNkZWZpbmUgZmV0Y2g4KHgpIGZldGNoOGZ1bmMoKGN5Y2xlcysrLCh4KSkpCisjZGVmaW5lIE5GQUtFUyAxNgordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIHVuc2lnbmVkICBhOworICAgIHVuc2lnbmVkICB4OworICAgIHVuc2lnbmVkICB5OworICAgIHVuc2lnbmVkICBwYzsJCS8qIEtlZXAgcGJyIGluIHRoZXJlIHRvbyAqLworICAgIHVuc2lnbmVkICBkYnI7CisgICAgdW5zaWduZWQgIGQ7CisgICAgdW5zaWduZWQgIHM7CisgICAgdW5zaWduZWQgIHA7CisgICAgdW5zaWduZWQgIGU7CisgICAgdW5zaWduZWQgIGNoYXIgKm1lbW9yeTsKKyAgICB1bnNpZ25lZCAgaW50IGV4Y2VwdGlvbjsKKyAgICB1bnNpZ25lZCAgaW50IHRpY2tzOworICAgIHVuc2lnbmVkICBpbnQgY3ljbGVzOworICAgIHVuc2lnbmVkICBpbnQgaW5zdHM7CisgICAgdW5zaWduZWQgIGludCByW05GQUtFU107CisgIH0KK3NhdmVkX3N0YXRlX3R5cGU7CisKKworCisjZGVmaW5lIEdFVF9QICAgICAgXAorICAoKEdFVF9OQklUIDw8IDcpIFwKKyB8IChHRVRfVkJJVCA8PCA2KSBcCisgfCAoR0VUX01CSVQgPDwgNSkgXAorIHwgKEdFVF9YQklUIDw8IDQpIFwKKyB8IChHRVRfREJJVCA8PCAzKSBcCisgfCAoR0VUX0lCSVQgPDwgMikgXAorIHwgKEdFVF9aQklUIDw8IDEpIFwKKyB8IChHRVRfQ0JJVCA8PCAwKSkKKworI2RlZmluZSBTRVRfUChfYml0cykgICBcCit7IGludCBiaXRzID0gX2JpdHM7ICAgIFwKK1NFVF9OQklUKChiaXRzPj43KSYxKTsgXAorU0VUX1ZCSVQoKGJpdHM+PjYpJjEpOyBcCitTRVRfTUJJVCgoYml0cz4+NSkmMSk7IFwKK1NFVF9YQklUKChiaXRzPj40KSYxKTsgXAorU0VUX0RCSVQoKGJpdHM+PjMpJjEpOyBcCitTRVRfSUJJVCgoYml0cz4+MikmMSk7IFwKK1NFVF9aQklUKChiaXRzPj4xKSYxKTsgXAorU0VUX0NCSVQoKGJpdHM+PjApJjEpOyAgfQorCisjZGVmaW5lIEJGTEFHCQkoMTw8NCkKKyNkZWZpbmUgREZMQUcgCQkoMTw8MykKKworI2RlZmluZSBHRVRfQSAJCSh0aGVfYSkKKyNkZWZpbmUgR0VUX0UJCSh0aGVfZSkKKyNkZWZpbmUgR0VUX0IgCQkodGhlX2IpCisjZGVmaW5lIEdFVF9DQklUIAkodGhlX2NiaXQpCisjZGVmaW5lIEdFVF9ECQkodGhlX2QpCisjZGVmaW5lIEdFVF9EQklUIAkodGhlX2RiaXQpCisjZGVmaW5lIEdFVF9EQlJfSElHSCAJKHRoZV9kYnIpCisjZGVmaW5lIEdFVF9EQlJfTE9XIAkodGhlX2RiciA+PiAxNikKKyNkZWZpbmUgR0VUX0RQUiAJKHRoZV9kcHIpCisjZGVmaW5lIEdFVF9JQklUCSh0aGVfaWJpdCkKKyNkZWZpbmUgR0VUX01CSVQJKHRoZV9tYml0KQorI2RlZmluZSBTRVRfWEJJVCh4KSAgICAgeyB0aGVfeGJpdCA9IHg7IH0gICAgICAgCisjZGVmaW5lIEdFVF9OQklUIAkodGhlX25iaXQpCisjZGVmaW5lIEdFVF9QQlJQQyAJKHRoZV9wYykKKyNkZWZpbmUgR0VUX1BCUl9ISUdIIAkodGhlX3BjICYgMHhmZjAwMDApCisjZGVmaW5lIEdFVF9QQlJfTE9XIAkodGhlX3BjID4+IDE2KQorI2RlZmluZSBHRVRfUEMgCQkodGhlX3BjICYgMHhmZmZmKQorI2RlZmluZSBHRVRfUyAJCSh0aGVfcykKKyNkZWZpbmUgR0VUX1ZCSVQgCSh0aGVfdmJpdCkKKyNkZWZpbmUgR0VUX1ggCQkodGhlX3gpCisjZGVmaW5lIEdFVF9YQklUIAkodGhlX3hiaXQpCisjZGVmaW5lIEdFVF9ZIAkJKHRoZV95KQorI2RlZmluZSBHRVRfWkJJVCAJKHRoZV96Yml0KQorI2RlZmluZSBJRkxBRyAJCSgxPDwyKQorI2RlZmluZSBJTkNfUEMoeCkgCXt0aGVfcGMgKz0geDt9CisjZGVmaW5lIFBPUDE2KHgpICAgICAgICB7IGludCBfeHg7IFBPUDgoeCk7IFBPUDgoX3h4KTsgeCs9IF94eDw8ODt9CisjZGVmaW5lIFBPUDI0KHgpICAJeyBpbnQgX3h4OyBQT1A4KHgpOyBQT1A4KF94eCk7IHggKz0gX3h4IDw8IDg7IFBPUDgoX3h4KTsgeCArPSBfeHggPDwgMTY7IH0KKyNkZWZpbmUgUE9QOCh4KSAgIAl7IFNFVF9TKEdFVF9TICsxKTsgeCA9ICBmZXRjaDgoR0VUX1MpO30KKyNkZWZpbmUgUFVTSDE2KHgpIAl7IGludCBfeHggPSB4O1BVU0g4KF94eCA+PiA4KTsgUFVTSDgoX3h4KTt9CisjZGVmaW5lIFBVU0g4KHgpICAJeyBzdG9yZTgoR0VUX1MsIHgpOyBTRVRfUyhHRVRfUy0xKTt9CisjZGVmaW5lIFNFVF9BKHgpICAJeyB0aGVfYSA9IHggJiBBTUFTSzsgfQorI2RlZmluZSBTRVRfQih4KSAgCXsgdGhlX2IgPSB4O30KKyNkZWZpbmUgU0VUX0NCSVQoeCkgIAl7IHRoZV9jYml0ID0geDt9CisjZGVmaW5lIFNFVF9DQklUX00oeCkgCXsgdGhlX2NiaXQgPSAoeCAmIChHRVRfTUJJVCA/IDB4MTAwOiAweDEwMDAwKSkgIT0gMDt9CisjZGVmaW5lIFNFVF9DQklUX1goeCkgCXsgdGhlX2NiaXQgPSAoeCAmIChHRVRfWEJJVCA/IDB4MTAwOiAweDEwMDAwKSkgIT0gMDt9CisjZGVmaW5lIFNFVF9EKHgpCXt0aGVfZCA9IHg7fQorI2RlZmluZSBTRVRfREJJVCh4KSAJeyB0aGVfZGJpdD0geDt9CisjZGVmaW5lIFNFVF9EQlJfTE9XKHgpIAl7dGhlX2RiciA9ICh4PDwxNik7fQorI2RlZmluZSBTRVRfRFBSKHgpIAl7IHRoZV9kcHIgPSB4O30KKyNkZWZpbmUgU0VUX0UoeCkgCXsgdGhlX2UgPSB4O30KKyNkZWZpbmUgU0VUX0lCSVQoeCkgCXsgdGhlX2liaXQgPSB4O30KKyNkZWZpbmUgU0VUX01CSVQoeCkgCXsgdGhlX21iaXQgPSB4OyB9CisjZGVmaW5lIFNFVF9OQklUKHgpICAgICB7IHRoZV9uYml0ID0geDt9CisjZGVmaW5lIFNFVF9OQklUXzE2KHgpICB7IHRoZV9uYml0PSAoICgoeCkgJiAoMHg4MDAwKSkgIT0gMCk7fQorI2RlZmluZSBTRVRfTkJJVF84KHgpICB7IHRoZV9uYml0PSAoICgoeCkgJiAoMHg4MCkpICE9IDApO30KKyNkZWZpbmUgU0VUX05CSVRfTSh4KSAgIHsgaWYgKEdFVF9NQklUKSB7IFNFVF9OQklUXzgoeCk7IH0gZWxzZSB7IFNFVF9OQklUXzE2KHgpO319CisjZGVmaW5lIFNFVF9OQklUX1goeCkgICB7IGlmIChHRVRfWEJJVCkgeyBTRVRfTkJJVF84KHgpOyB9IGVsc2UgeyBTRVRfTkJJVF8xNih4KTt9fQorI2RlZmluZSBTRVRfUEJSKHgpICAgICAgeyB0aGVfcGMgPSAodGhlX3BjICYgMHhmZmZmKSArICgoeCk8PDE2KTt9CisjZGVmaW5lIFNFVF9QQlJQQyh4KSAgICB7IHRoZV9wYyA9IHg7fQorI2RlZmluZSBTRVRfT05MWV9QQyh4KSAgeyB0aGVfcGMgPSAodGhlX3BjICYgMHhmZjAwMDApICsgKCh4ICkgJiAweGZmZmYpO30KKyNkZWZpbmUgU0VUX1MoeCkJe3RoZV9zID0geDsgfQorI2RlZmluZSBTRVRfVkJJVF8xNih4KSAge3RoZV92Yml0ID0gKCgoKGludCl4KSA8IC0weDgwMDApIHx8ICgoKGludCl4KSA+IDB4N2ZmZikpO30KKyNkZWZpbmUgU0VUX1ZCSVRfOCh4KSAgIHt0aGVfdmJpdCA9ICgoKChpbnQpeCkgPCAtMHg4MCkgfHwgKCgoaW50KXgpID4gMHg3ZikpO30KKy8qI2RlZmluZSBTRVRfVkJJVF9NKHgpICAgeyBpZihHRVRfTUJJVCkge1NFVF9WQklUXzgoeCk7fWVsc2Uge1NFVF9WQklUXzE2KHgpO319Ki8KKyNkZWZpbmUgU0VUX1pCSVRfMTYoeCkgIHsgdGhlX3piaXQgPSAoKHggJiAweGZmZmYpID09IDApO30KKyNkZWZpbmUgU0VUX1pCSVRfOCh4KSAgIHsgdGhlX3piaXQgPSAoKHggJiAweGZmKSA9PSAwKTt9CisjZGVmaW5lIFNFVF9aQklUX00oeCkgICB7IGlmKEdFVF9NQklUKSB7U0VUX1pCSVRfOCh4KTt9ZWxzZSB7U0VUX1pCSVRfMTYoeCk7fX0KKyNkZWZpbmUgU0VUX1pCSVRfWCh4KSAgIHsgaWYoR0VUX1hCSVQpIHtTRVRfWkJJVF84KHgpO31lbHNlIHtTRVRfWkJJVF8xNih4KTt9fQorI2RlZmluZSBTRVRfVkJJVCh4KSAgICAgeyB0aGVfdmJpdCA9IHg7IH0KKyNkZWZpbmUgU0VUX1pCSVQoeCkgICAgIHsgdGhlX3piaXQgPSB4OyB9CisjZGVmaW5lIFNFVF9YKHgpICAgICAgICB7IHRoZV94ID0gKHgpICYgKEdFVF9YQklUID8gMHhmZiA6IDB4ZmZmZik7fQorI2RlZmluZSBTRVRfWSh4KSAgICAgICAgeyB0aGVfeSA9ICh4KSAmIChHRVRfWEJJVCA/IDB4ZmYgOiAweGZmZmYpO30KKworI2RlZmluZSBBTUFTSyAgICAgICAgICAgICggR0VUX01CSVQgPyAweGZmIDogMHhmZmZmKQorI2RlZmluZSBTTUFTSyAgICAgICAgICAgICAoIEdFVF9NQklUID8gMHg4MCA6IDB4ODAwMCkKKyNkZWZpbmUgU0VUX1ZCSVRfTShzMSxhY2MsZCkgKCB0aGVfdmJpdCA9ICgoczEgXiBhY2MpICYgKGFjYyBeIGQpICYgU01BU0sgKSE9MCkKKworLyojZGVmaW5lIGZldGNoOCh4KSAobWVtb3J5W3gmTU1BU0tdKSovCisjZGVmaW5lIGZldGNoMTYoeCkgKGZldGNoOCh4KSArIChmZXRjaDgoKHgpKzEpPDw4KSkKKyNkZWZpbmUgZmV0Y2gyNCh4KSAoZmV0Y2g4KHgpICsgKGZldGNoOCgoeCkrMSk8PDgpICsgKGZldGNoOCgoeCkrMik8PDE2KSkKKyNkZWZpbmUgZmV0Y2g4c2V4dCh4KSAoKGNoYXIpZmV0Y2g4KHgpKQorI2RlZmluZSBmZXRjaDE2c2V4dCh4KSAoKHNob3J0KWZldGNoMTYoeCkpCisjZGVmaW5lIHN0b3JlOCh4LHkpIHttZW1vcnlbeCZNTUFTS109eTt9CisjZGVmaW5lIHN0b3JlMTYoeCx5KSB7IHN0b3JlOCh4LHkpOyBzdG9yZTgoeCsxLHk+PjgpO30KKyNkZWZpbmUgU0VYVE0oeCkgIChHRVRfTUJJVCA/ICgoY2hhcil4KTogKChzaG9ydCl4KSkKKworCisjZGVmaW5lIFNUQVJURlVOQygpIAlcCisgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKm1lbW9yeTtcCisgIGludCB0aGVfczsJCVwKKyAgaW50IHRoZV9iOwkJXAorICBpbnQgdGhlX3g7CQlcCisgIGludCB0aGVfZDsJCVwKKyAgaW50IHRoZV95OwkJXAorICBpbnQgdGhlX2RicjsJCVwKKyAgaW50IHRoZV9wYzsJCVwKKyAgaW50IHRoZV9uYml0OwkJXAorICBpbnQgdGhlX3ZiaXQ7CQlcCisgIGludCB0aGVfejsJCVwKKyAgaW50IHRoZV9tYml0OwkJXAorICBpbnQgdGhlX2liaXQ7CQlcCisgIGludCB0aGVfeGJpdDsJCVwKKyAgaW50IHRoZV96Yml0OwkJXAorICBpbnQgdGhlX2NiaXQ7CQlcCisgIGludCB0aGVfZGJpdDsJCVwKKyAgaW50IHRoZV9kcHI7CQlcCisgIGludCB0aGVfZTsgICAgICAgICAgICBcCisgIGludCB0aGVfYTsJCVwKKyAgaW50IHRpY2tfc3RhcnQgPSBnZXRfbm93ICgpO1wKKyAgaW50IGN5Y2xlcyA9IDA7CSAgICAgIFwKKyAgaW50IGluc3RzID0gMDsJICAgICAgXAorCQkJCSAgICBcCisgIFNFVF9FIChzYXZlZF9zdGF0ZS5lKTsJICAgIFwKKyAgU0VUX1AgKHNhdmVkX3N0YXRlLnApOwkgICAgXAorICBTRVRfQSAoc2F2ZWRfc3RhdGUuYSk7CSAgICBcCisgIFNFVF9YIChzYXZlZF9zdGF0ZS54KTsJICAgIFwKKyAgU0VUX1kgKHNhdmVkX3N0YXRlLnkpOwkgICAgXAorICBTRVRfT05MWV9QQyAoc2F2ZWRfc3RhdGUucGMpOwkgICAgXAorICBTRVRfUEJSIChzYXZlZF9zdGF0ZS5wYyA+PiAxNik7ICAgXAorICBTRVRfREJSX0xPVyAoc2F2ZWRfc3RhdGUuZGJyKTsgICAgXAorICBTRVRfRCAoc2F2ZWRfc3RhdGUuZCk7CSAgICBcCisgIFNFVF9TIChzYXZlZF9zdGF0ZS5zKTsJICAgIFwKKyAgbWVtb3J5ID0gc2F2ZWRfc3RhdGUubWVtb3J5IDsgICAgIFwKK3sgaW50IGs7IGZvciAoayA9IDA7IGsgPCBORkFLRVM7IGsrKykgCSAgIFwKKyBzdG9yZTE2KDB4MTAgKyBrICogMiwgc2F2ZWRfc3RhdGUucltrXSk7IH1cCisJCQkJICAgIFwKKyAgICB0b3A6CQkJICAgICAgXAorCisKKworI2RlZmluZSBFTkRGVU5DKCkgXAorIHJldGhpbms6ICAgICAgICAgIFwKKyAgc2F2ZWRfc3RhdGUudGlja3MgKz0gZ2V0X25vdyAoKSAtIHRpY2tfc3RhcnQ7XAorICBzYXZlZF9zdGF0ZS5jeWNsZXMgKz0gY3ljbGVzOyAgIFwKKyAgc2F2ZWRfc3RhdGUuaW5zdHMgKz0gaW5zdHM7ICAJICBcCit7IGludCBrOyBmb3IgKGsgPSAwOyBrIDwgTkZBS0VTOyBrKyspIAkgICBcCitzYXZlZF9zdGF0ZS5yW2tdID0gZmV0Y2gxNigweDEwICsgayAqIDIpOyB9XAorCQkJICAgICAgIAkgIFwKKyAgc2F2ZWRfc3RhdGUuZSA9IEdFVF9FOwkgIFwKKyAgc2F2ZWRfc3RhdGUucCA9IEdFVF9QOwkgIFwKKyAgc2F2ZWRfc3RhdGUuYSA9IEdFVF9BOwkgIFwKKyAgc2F2ZWRfc3RhdGUueCA9IEdFVF9YOwkgIFwKKyAgc2F2ZWRfc3RhdGUueSA9IEdFVF9ZOwkgIFwKKyAgc2F2ZWRfc3RhdGUucGMgPSBHRVRfUEJSUEM7CSAgXAorICBzYXZlZF9zdGF0ZS5kYnIgPSBHRVRfREJSX0xPVzsgIFwKKyAgc2F2ZWRfc3RhdGUuZCA9IEdFVF9EOwkgIFwKKyAgc2F2ZWRfc3RhdGUucyA9IEdFVF9TOwkgIFwKKwkJCQkgIFwKKyAgcmV0dXJuIDA7CQkJICBcCisKKworZXh0ZXJuIHNhdmVkX3N0YXRlX3R5cGUgc2F2ZWRfc3RhdGU7CisKKyNkZWZpbmUgTU1BU0sgMHhmZmZmZgorI2RlZmluZSBOVU1TRUdTIDE2CisjZGVmaW5lIFJFVEhJTksgZ290byByZXRoaW5rOwpkaWZmIC0tZ2l0IGEvc2ltL3c2NS9ydW4uYyBiL3NpbS93NjUvcnVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5NjZlZQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS93NjUvcnVuLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qIHJ1biBmcm9udCBlbmQgc3VwcG9ydCBmb3IgVzY1CisgICBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIFc2NSBTSU0KKworR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisvKiBTdGV2ZSBDaGFtYmVybGFpbgorICAgc2FjQGN5Z251cy5jb20gKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlICJnZXRvcHQuaCIKKyNpbmNsdWRlICJiZmQuaCIKKworI2lmZGVmIE5FRURfREVDTEFSQVRJT05fUFJJTlRGCitleHRlcm4gaW50IHByaW50ZiAoKTsKKyNlbmRpZgorCit2b2lkIHVzYWdlKCk7CitleHRlcm4gaW50IG9wdGluZDsKKworaW50CittYWluIChhYywgYXYpCisgICAgIGludCBhYzsKKyAgICAgY2hhciAqKmF2OworeworICBiZmQgKmFiZmQ7CisgIGJmZF92bWEgc3RhcnRfYWRkcmVzczsKKyAgYXNlY3Rpb24gKnM7CisgIGludCBpOworICBpbnQgdmVyYm9zZSA9IDA7CisgIGludCB0cmFjZSA9IDA7CisgIGNoYXIgKm5hbWUgPSAiIjsKKworICB3aGlsZSAoKGkgPSBnZXRvcHQgKGFjLCBhdiwgInR2IikpICE9IEVPRikKKyAgICBzd2l0Y2ggKGkpCisgICAgICB7CisgICAgICBjYXNlICd0JzoKKwl0cmFjZSA9IDE7CisJYnJlYWs7CisgICAgICBjYXNlICd2JzoKKwl2ZXJib3NlID0gMTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJdXNhZ2UoKTsKKyAgICAgIH0KKyAgYWMgLT0gb3B0aW5kOworICBhdiArPSBvcHRpbmQ7CisKKyAgaWYgKGFjICE9IDEpIAorICAgIHVzYWdlKCk7CisKKyAgbmFtZSA9ICphdjsKKworICBpZiAodmVyYm9zZSkKKyAgICB7CisgICAgICBwcmludGYgKCJydW4gJXNcbiIsIG5hbWUpOworICAgIH0KKyAgYWJmZCA9IGJmZF9vcGVuciAobmFtZSwgImNvZmYtdzY1Iik7CisgIGlmIChhYmZkKQorICAgIHsKKworICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQorCXsKKworCSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHM7IHMgPSBzLT5uZXh0KQorCSAgICB7CisJICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyID0gbWFsbG9jIChiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzKSk7CisJICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLAorCQkJCQlzLAorCQkJCQlidWZmZXIsCisJCQkJCTAsCisJCQkJCWJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHMpKTsKKwkgICAgICBzaW1fd3JpdGUgKHMtPnZtYSwgYnVmZmVyLCBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzKSk7CisJICAgICAgZnJlZSAoYnVmZmVyKTsKKwkgICAgfQorCisJICBzdGFydF9hZGRyZXNzID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKKwkgIHNpbV9zZXRfcGMgKHN0YXJ0X2FkZHJlc3MpOworCSAgaWYgKHRyYWNlKQorCSAgICB7CisJICAgICAgaW50IGRvbmUgPSAwOworCSAgICAgIHdoaWxlICghZG9uZSkKKwkJeworCQkgIGRvbmUgPSBzaW1fdHJhY2UgKCk7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgc2ltX3Jlc3VtZSAoMCwgMCk7CisJICAgIH0KKwkgIGlmICh2ZXJib3NlKQorCSAgICBzaW1faW5mbyAocHJpbnRmLCAwKTsKKworCSAgLyogRmluZCBvdXQgd2hhdCB3YXMgaW4gcjAgYW5kIHJldHVybiB0aGF0ICovCisJICB7CisJICAgIHVuc2lnbmVkIGNoYXIgYls0XTsKKwkgICAgc2ltX2ZldGNoX3JlZ2lzdGVyKDAsIGIsIDQpOworCSAgICByZXR1cm4gYlszXTsKKwkgIH0KKwkgIAorCX0KKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQKK3VzYWdlKCkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAidXNhZ2U6IHJ1biBbLXR2XSBwcm9ncmFtXG4iKTsKKyAgZXhpdCAoMSk7Cit9CmRpZmYgLS1naXQgYS9zaW0vejhrL0NoYW5nZUxvZyBiL3NpbS96OGsvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDI0ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vejhrL0NoYW5nZUxvZwpAQCAtMCwwICsxLDQ3MCBAQAorV2VkIE5vdiAyNSAxODoyMjoxMCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIHN1cHBvcnQuYzogSW5jbHVkZSA8ZXJybm8uaD4KKworVHVlIEFwciAyOCAxODozMzozMSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgorCisgICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitTdW4gQXByIDI2IDE1OjMxOjU1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitTdW4gQXByIDI2IDE1OjE4OjQ1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KKworCSogYWNjb25maWcuaDogTmV3IGZpbGUuCisJKiBjb25maWd1cmUuaW46IFJldmVydGVkIGNoYW5nZSBvZiBBcHIgMjQ7IHVzZSBzaW5jbHVkZSBhZ2Fpbi4KKworRnJpIEFwciAyNCAxNDoxNjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCSogY29uZmlnLmluOiBEaXR0by4KKworRnJpIEFwciAyNCAxMToxNzoyOCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdXNlIHNpbmNsdWRlLgorCitTYXQgQXByICA0IDIwOjM2OjI1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitGcmkgTWFyIDI3IDE2OjE1OjUyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgTWFyIDI1IDEyOjM1OjI5IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitXZWQgTWFyIDE4IDEyOjM4OjEyIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitUdWUgRmViIDE3IDEyOjU0OjA1IDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KKworCSogaWZhY2UuYyAoc2ltX3N0b3JlX3JlZ2lzdGVyLCBzaW1fZmV0Y2hfcmVnaXN0ZXIpOiBQYXNzIGluIGxlbmd0aAorIAlwYXJhbWV0ZXIuICBSZXR1cm4gLTEuCisKK1N1biBGZWIgIDEgMTY6NDc6NTEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK1NhdCBKYW4gMzEgMTg6MTU6NDEgMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK01vbiBKYW4gMTkgMjI6MjY6MjkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK01vbiBEZWMgMTUgMjM6MTc6MTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitUaHUgRGVjICA0IDA5OjIxOjA1IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIE9jdCAyMiAxNDo0MzowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGlmYWNlLmMgKHNpbV9sb2FkKTogUGFzcyBsbWFfcCBhbmQgc2ltX3dyaXRlIGFyZ3MgdG8KKyAJc2ltX2xvYWRfZmlsZS4KKworRnJpIE9jdCAgMyAwOToyODowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIFNlcCAyNCAxNzozODo1NyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVHVlIFNlcCAyMyAxMTowNDozOCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworTW9uIFNlcCAyMiAxMTo0NjoyMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworRnJpIFNlcCAxOSAxNzo0NToyNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIFNlcCAxNyAxMzoyMzo0NSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChDT05GSUdfSCk6IFVzZSBjb25maWcuaCBmcm9tIGxvY2FsIGRpcmVjdG9yeS4KKworTW9uIFNlcCAxNSAxNzozNjoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVGh1IFNlcCAgNCAxNzoyMToyMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmE+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIEF1ZyAyNyAxODoxMzoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK1R1ZSBBdWcgMjYgMTA6NDM6MzMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpZmFjZS5jIChzaW1fa2lsbCk6IERlbGV0ZS4KKwkoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEFkZCBBQkZEIGFyZ3VtZW50LgorCShzaW1fbG9hZCk6IE1vdmUgc2V0dGluZyBvZiBQQyBmcm9tIGhlcmUuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBUbyBoZXJlLgorCShzaW1fb3Blbiwgc2ltX2xvYWQpOiBBZGQgRklYTUUgYWJvdXQgbmVlZCB0byBtb3ZlIGFyY2ggdGVzdCB0bworIAlzaW1fb3Blbi4KKworTW9uIEF1ZyAyNSAxNzo1MDoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKwkqIGNvbmZpZy5pbjogRGl0dG8uCisKK01vbiBBdWcgMjUgMTY6MzY6MTAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBpZmFjZS5jIChzaW1fb3Blbik6IEFkZCBBQkZEIGFyZ3VtZW50LiBDaGFuZ2UgQVJHViB0byBQQVJHVi4KKworVHVlIE1heSAyMCAxMDoyODowNyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+CisKKwkqIGlmYWNlLmMgKHNpbV9zZXRfY2FsbGJhY3MpOiBEZWxldGUgU0lNX0RFU0MgYXJndW1lbnQuCisJKHNpbV9vcGVuKTogQWRkIGNhbGxiYWNrIGFyZ3VtZW50LgorCitXZWQgQXByIDMwIDEwOjI4OjM0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGlmYWNlLmMgKHNpbV9sb2FkKTogU2V0IHNpbV96ODAwMV9tb2RlIGlmIGJmZF9tYWNoX3o4MDAxLgorCSogdGNvbmZpZy5pbiAoU0lNX1BSRV9MT0FEKTogRGVsZXRlLCBubyBsb25nZXIgdXNlZC4KKworVGh1IEFwciAyNCAwMDozOTo1MSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisKK0ZyaSBBcHIgMTggMTQ6MTg6MDYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiBtZW0uaCAoWjhrX1BBR0VfU0laRSk6IFJlbmFtZSBmcm9tIFBBR0VfU0laRS4gIElzIGl0IHVzZWQ/CisKKwkqIGlmYWNlLmMgKHNpbV9zdG9wKTogTmV3IGZ1bmN0aW9uLgorCShOVUxMKTogRGVmaW5lIGlmIG5vdCBhbHJlYWR5LgorCitUaHUgQXByIDE3IDAzOjU0OjIzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChTSU1fT0JKUyk6IEFkZCBzaW0tbG9hZC5vLgorCSogaWZhY2UuYzogI2luY2x1ZGUgYmZkLmguCisJKHo4a19jYWxsYmFjayk6IE5ldyBnbG9iYWwuCisJKHNpbV9raW5kLCBteW5hbWUpOiBOZXcgc3RhdGljIGxvY2Fscy4KKwkoc2ltX29wZW4pOiBTZXQgc2ltX2tpbmQsIG15bmFtZS4KKwkoc2ltX2xvYWQpOiBSZXR1cm4gU0lNX1JDLiAgTmV3IGFyZyBhYmZkLiAgQ2FsbCBzaW1fbG9hZF9maWxlIHRvCisJbG9hZCBmaWxlIGludG8gc2ltdWxhdG9yLiAgU2V0IHN0YXJ0IGFkZHJlc3MgZnJvbSBiZmQuCisJKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBSZXR1cm4gU0lNX1JDLiAgRGVsZXRlIGFyZyBzdGFydF9hZGRyZXNzLgorCShzaW1fc2V0X2NhbGxiYWNrcyk6IFNldCB6OGtfY2FsbGJhY2suCisKK1RodSBBcHIgMTcgMTE6MzY6MDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgorCisJKiB0bS5oIChzaW1fdHJhY2UpIDogUmVtb3ZlIHByb3RvdHlwZSAtIG5vdyBpbiByZW1vdGUtc2ltLmgKKwkqIHN1cHBvcnQuYyAoc2ltX3RyYWNlKTogVXBkYXRlLgorCitNb24gQXByICA3IDE1OjQ1OjAyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHRvIHRyYWNrIC4uL2NvbW1vbi9hY2xvY2FsLm00IGNoYW5nZXMuCisJKiBjb25maWcuaW46IERpdHRvLgorCitXZWQgQXByICAyIDE1OjA2OjI4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIGlmYWNlLmMgKHNpbV9vcGVuKTogTmV3IGFyZyBga2luZCcuCisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIEFwciAgMiAxNDozNDoxOSAxOTk3IEFuZHJldyBDYWduZXkgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+CisKKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworV2VkIE1hciAxOSAwMToxNDowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB0byB0cmFjayAuLi9jb21tb24vYWNsb2NhbC5tNCBjaGFuZ2VzLgorCitNb24gTWFyIDE3IDE1OjEwOjA3IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgorCitGcmkgTWFyIDE0IDEwOjM0OjExIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgorCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgdG8gdHJhY2sgLi4vY29tbW9uL2FjbG9jYWwubTQgY2hhbmdlcy4KKworVGh1IE1hciAxMyAxMzowMjowOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgorCisJKiBpZmFjZS5jIChzaW1fb3Blbik6IE5ldyBTSU1fREVTQyByZXN1bHQuICBBcmd1bWVudCBpcyBub3cKKwlpbiBhcmd2IGZvcm0uCisJKG90aGVyIHNpbV8qKTogTmV3IFNJTV9ERVNDIGFyZ3VtZW50LgorCitUdWUgRmViICA0IDEzOjMzOjMwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChAQ09NTU9OX01BS0VGSUxFX0ZSQUcpOiBVc2UKKwlDT01NT05fe1BSRSxQT1NUfV9DT05GSUdfRlJBRyBpbnN0ZWFkLgorCSogY29uZmlndXJlLmluOiBzaW5jbHVkZSAuLi9jb21tb24vYWNsb2NhbC5tNC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK1RodSBKYW4gMjMgMTE6NDY6MjMgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKKworCSogY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBNYWtlZmlsZS5pbjogIFVwZGF0ZSB0byBuZXcgY29uZmlndXJlCisJc2NoZW1lIHdoaWNoIGlzIG1vcmUgY29tcGF0aWJsZSB3aXRoIFdpbkdEQiBidWlsZHMuCisJKiBjb25maWd1cmUuaW46ICBJbXByb3ZlIGNvbW1lbnQgb24gaG93IHRvIHJ1biBhdXRvY29uZi4KKwkqIGNvbmZpZ3VyZTogIFJlLXJ1biBhdXRvY29uZiB0byBnZXQgbmV3IC4uL2NvbW1vbi9hY2xvY2FsLm00LgorCSogTWFrZWZpbGUuaW46ICBVc2UgYXV0b2NvbmYgc3Vic3RpdHV0aW9uIHRvIGluc3RhbGwgY29tbW9uCisJbWFrZWZpbGUgZnJhZ21lbnQuCisKK1dlZCBOb3YgMjAgMDI6Mjg6MjEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KKworCSogTWFrZWZpbGUuaW46IERlbGV0ZSBzdHVmZiBtb3ZlZCB0byAuLi9jb21tb24vTWFrZS1jb21tb24uaW4uCisJKFNJTV9PQkpTLFNJTV9FWFRSQV9DRkxBR1MsU0lNX0VYVFJBX0NMRUFOKTogRGVmaW5lLgorCSogY29uZmlndXJlLmluOiBTaW1wbGlmeSB1c2luZyBtYWNyb3MgaW4gLi4vY29tbW9uL2FjbG9jYWwubTQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogaWZhY2UuYyAoc2ltX3NpemUpOiBOZXcgZnVuY3Rpb24uCisJKHNpbV9zdG9wX3JlYXNvbik6IFByb3Blcmx5IHNldCBzaW1fZXhpdGVkIHJldHVybiBjb2RlLgorCSogc3VwcG9ydC5jOiAjaW5jbHVkZSAiY2FsbGJhY2suaCIuCisJKiBydW4uYzogRGVsZXRlZCwgdXNpbmcgb25lIGluIC4uL2NvbW1vbiBub3cuCisJKiB0Y29uZmlnLmluOiBOZXcgZmlsZS4KKworVGh1IE9jdCAgMyAxNjoxOTowNyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQorCisJKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4pOiBEb24ndCByZW1vdmUgY29uZmlnLmxvZyBoZXJlLgorCitXZWQgSnVuIDI2IDEyOjMyOjI5IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCisKKyAgICAgICAgKiBNYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgaW5jbHVkZWRpciwKKyAgICAgICAgSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYtc2V0IHZhbHVlcy4KKyAgICAgICAgKGRvY2Rpcik6IFJlbW92ZWQuCisgICAgICAgICogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBhdXRvY29uZiAyLjUgb3IgaGlnaGVyLgorICAgICAgICAoQUNfUFJPR19JTlNUQUxMKTogQWRkZWQuCisgICAgICAgICogY29uZmlndXJlOiBSZWJ1aWx0LgorCitXZWQgRmViIDIxIDEyOjE3OjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi43LgorCitUaHUgSmFuIDExIDE2OjU5OjA3IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KKworCSogd3JpdGVjb2RlLmMgKGluZm9fYXJncywgY2FzZSBDTEFTU19ESVNQOCk6IFNpZ24gZXh0ZW5kIHVzaW5nCisJc2hpZnRzIGluc3RlYWQgb2YgY2hhciBjYXN0LgorCShzaGlmdCk6IExpa2V3aXNlLgorCitGcmkgSmFuICA1IDE1OjM2OjI2IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KKworCSogbWVtLmMgKGdldF9wYWdlX2FuZF9vZmZzZXQpOiBBbGxvY2F0ZSAxNk1CIG5vdCA4TUIuCisKK0ZyaSBPY3QgMTMgMTU6MDI6NDUgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogaWZhY2UuYyAoc2ltX3NldF9jYWxsYmFja3MpOiBOZXcuCisKK1R1ZSBPY3QgMTAgMTE6MTM6NTUgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChCSVNPTik6IFJlbW92ZSBtYWNyby4KKworV2VkIFNlcCAyMCAxMzozNTozNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHN5bm9ueW0gZm9yIHJlYWxjbGVhbi4KKworRnJpIFNlcCAgOCAxMzoxNjoxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+CisKKwkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgaW5zdGFsbCBpbiAkKHRvb2xkaXIpLgorCisJKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUi4gIERvbid0IHRyeSB0byB1c2UKKwliZmQvaG9zdHMvKi5oIGZpbGUgb3IgYmZkL2NvbmZpZy8qLm1oIGZpbGUuICBDYWxsIEFDX1BST0dfQ0MgYW5kCisJQUNfUFJPR19SQU5MSUIuICBTdWJzdGl0dXRlIGluIHZhbHVlcyBmb3IgQ0ZMQUdTLCBIREVGSU5FUywgQVIsCisJYW5kIENDX0ZPUl9CVUlMRC4gIENhbGwgQUNfQ0hFQ0tfSEVBREVSUyBmb3IgdmFyaW91cyBoZWFkZXIgZmlsZXMuCisJVG91Y2ggc3RhbXAuaCBpZiBjcmVhdGluZyBjb25maWcuaC4KKwkqIGNvbmZpZ3VyZTogUmVidWlsZC4KKwkqIGNvbmZpZy5pbjogTmV3IGZpbGUsIGNyZWF0ZWQgYnkgYXV0b2hlYWRlci4KKwkqIE1ha2VmaWxlLmluIChBUik6IERlZmluZSBhcyBAQVJALgorCShDQyk6IE5ldyB2YXJpYWJsZSwgZGVmaW5lZCBhcyBAQ0NALgorCShDRkxBR1MpOiBEZWZpbmUgYXMgQENGTEFHU0AuCisJKENDX0ZPUl9CVUlMRCk6IE5ldyB2YXJpYWJsZSwgZGVmaW5lZCBhcyBAQ0NfRk9SX0JVSUxEQC4KKwkoUkFOTElCKTogRGVmaW5lIGFzIEBSQU5MSUJALgorCShIREVGSU5FUywgVERFRklORVMpOiBOZXcgdmFyaWFibGVzLgorCShAaG9zdF9tYWtlZmlsZV9mcmFnQCk6IFJlbW92ZS4KKwkoc3VwcG9ydC5vLCBjb21wZWQxLm8sIGNvbXBlZDMubyk6IERlcGVuZCB1cG9uIGNvbmZpZy5oLgorCShjb21wZWRiMy5vLCBjb21wZWQyLm8pOiBMaWtld2lzZS4KKwkobWVtLm8pOiBOZXcgdGFyZ2V0LgorCSh0Yy1nZW4yLmgpOiBEZXBlbmQgdXBvbiB3cml0ZWNvZGUsIG5vdCBxdWljay5jLgorCSh3cml0ZWNvZGUpOiBCdWlsZCB1c2luZyAkKENDX0ZPUl9CVUlMRCkuCisJKHdyaXRlY29kZS5vLCBsaXN0Lm8sIHF1aWNrLm8pOiBOZXcgdGFyZ2V0cy4KKwkobW9zdGx5Y2xlYW4pOiBNYWtlIHRoZSBzYW1lIGFzIGNsZWFuLCBub3QgZGlzdGNsZWFuLgorCShjbGVhbik6IFJlbW92ZSBjb25maWcubG9nLgorCShkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmggYW5kIHN0YW1wLWguCisJKE1ha2VmaWxlKTogRG9uJ3QgZGVwZW5kIHVwb24gQGZyYWdzQC4gIEp1c3QgcmVidWlsZCBNYWtlZmlsZSB3aGVuCisJaW52b2tpbmcgY29uZmlnLnN0YXR1cy4KKwkoY29uZmlnLmgsIHN0YW1wLWgpOiBOZXcgdGFyZ2V0cy4KKwkqIGNvbXBlZDEuYzogRG9uJ3QgaW5jbHVkZSAic3lzZGVwLmgiLgorCShJTkxJTkUpOiBEZWZpbmUgYXMgaW5saW5lLCBub3Qgc3RhdGljIGlubGluZS4KKwkqIGNvbXBlZDMuYywgY29tcGVkYjMuYywgcnVuLmM6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4KKwkqIG1lbS5jOiBJbmNsdWRlICJjb25maWcuaCIuICBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBJbmNsdWRlCisJPHN0ZGxpYi5oPiBpZiBpdCBleGlzdHMuCisJKiBzdXBwb3J0LmM6IEluY2x1ZGUgImNvbmZpZy5oIi4gIERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4KKwlJbmNsdWRlIDxzdGRpby5oPi4gIEluY2x1ZGUgPHRpbWUuaD4gYW5kIDxzeXMvdGltZXMuaD4gaWYgdGhleQorCWV4aXN0cy4gIEluY2x1ZGUgPHN5cy90eXBlcy5oPiBhbmQgPHN5cy9zdGF0Lmg+LgorCShnZXRfbm93KTogT25seSB1c2UgdGltZXMgaWYgPHN5cy90aW1lcy5oPiBleGlzdHM7IG90aGVyd2lzZSB1c2UKKwl0aW1lLgorCSogd3JpdGVjb2RlLmM6IEluY2x1ZGUgImNvbmZpZy5oIi4gIEluY2x1ZGUgPHN0ZGlvLmg+LiAgSW5jbHVkZQorCTxzdGRsaWIuaD4gYW5kIDxzdHJpbmcuaD4gaWYgdGhleSBleGlzdC4gIEluY2x1ZGUgPHN0cmluZ3MuaD4gaWYKKwlpdCBleGlzdHMgYW5kIDxzdHJpbmcuaD4gZG9lcyBub3QuCisKK1RodSBBdWcgIDMgMTA6NDU6MzcgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+CisKKwkqIFVwZGF0ZSBhbGwgRlNGIGFkZHJlc3NlcyBleGNlcHQgdGhvc2UgaW4gQ09QWUlORyogZmlsZXMuCisKK01vbiBKdWwgMzEgMTA6MTg6MDYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KKworCSogc3VwcG9ydC5jIChub3JtYWxfZmxhZ3NfMTYpOiBDYWxjdWxhdGUgY2FycnkgY29ycmVjdGx5LgorCShzdXBwb3J0X2NhbGwpOiBSZXR1cm4gdmFsdWVzIGluIHN0ZCByZWdzIHRvby4KKworRnJpIEp1bCAyOCAxMjoxMDowNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgorCisJKiBpbmxpbmVzLmggKHB1dF9ieXRlX21lbV9kYSk6IE1vdmVkLgorCSogcnVuLmMgKG1haW4pOiBSZXR1cm4gcHJvZ3JhbSByZXN1bHQuCisJKiBzdXBwb3J0LmMgKHN1cHBvcnRfY2FsbCk6IFJldHVybiBleGl0IGFyZ3VtZW50LgorCSogd3JpdGVjb2RlLmMgKHJvdGF0ZSk6IEZpeCBhIGxvYWQgb2YgYnVncy4KKwkoaW5mb19kZWNvZGUpOiBJbnNlcnQgbWlzc2luZyBicmVhayBhZnRlciBPUENfcnJjLgorCitXZWQgSnVsICA1IDE2OjEzOjQzIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworICAJKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBjb252ZXJ0ZWQgdG8gYXV0b2NvbmYuCisJKiBjb25maWd1cmU6IE5ldyBmaWxlLCBnZW5lcmF0ZWQgd2l0aCBhdXRjb25mIDIuNC4KKworCSogejhrLm10OiBSZW1vdmVkLgorCitGcmkgSnVuIDMwIDE2OjUzOjA5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KKworCSogaWZhY2UuYyAoc2ltX2RvX2NvbW1hbmQpOiBOZXcgZnVuY3Rpb24uCisKK1dlZCBNYXkgMjQgMTY6MzE6MzggMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgorCisJKiBjb25maWd1cmUuaW46IEZpeCB0eXBvIGluIGxhc3QgY2hhbmdlLgorCitNb24gTWFyIDI3IDEwOjMyOjM0IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KKworCSogcnVuLmM6IHBhcnNlIGFyZ3VtZW50cyB3aXRoIGdldG9wdCgpLgorCitUdWUgRmViIDI4IDE3OjMxOjAwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KKworCSogY29uZmlndXJlLmluOiBVc2UgLi4vLi4vYmZkL2hvc3RzL3N0ZC1ob3N0LmggaWYgc3BlY2lmaWMKKwlob3N0IHVuYXZhaWxhYmxlLgorCitTdW4gRmViIDEyIDE2OjAzOjI5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgorCisJKiBpZmFjZS5jIChzaW1fc3RvcF9yZWFzb24pOiAoTWFrZSBhIGJhZCBzeXNjYWxsIGdpdmUgYSBTSUdJTEwuCisJKiB3cml0ZWNvZGUuYyAoYWRpdik6ICBEaXZpZGVzIGFyZSBhbHdheXMgc2lnbmVkLgorCitXZWQgRGVjIDI4IDIxOjMwOjA5IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCisKKwkqIGlubGluZXMuaDogTWFrZSBJTkxJTkVTIHN0YXRpYy4KKwkqIG1lbS5jIChzaXRvcHRyKTogTmV3IGluc3RhbmNlLgorCSogc3VwcG9ydC5jIChub3JtYWxfZmxhZ3NfWzMyfDE2fDhdKTogTmV3IGZ1bmN0aW9ucy4KKwkob3B0aW1pemVfbm9ybWFsX2ZsYWdzKTogVXNlIG5ldyBmdW5jdGlvbnMuCisJKiB3cml0ZWNvZGUuYyAoaW5mb19zcGVjaWFsKTogSGFuZGxlIHNiYy4gKG9wdGltaXplX25vcm1hbF9mbGFncyk6CisJQWx3YXlzIHJlY2FsYyBmbGFncy4KKworV2VkIE1heSAxOCAxNDozODo0OSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQorCisJKiBzdXBwb3J0LmMgKHNpbV9vcGVuKTogRGVsZXRlIGZyb20gaGVyZS4KKwkoc2ltX3NldF9hcmdzKTogRGVsZXRlIGZyb20gaGVyZS4KKwkoc2ltX2tpbGwpOiBEZWxldGUgZnJvbSBoZXJlLgorCSogaWZhY2UuYyAoc2ltXyopOiBNYWtlIHJlc3VsdCB2b2lkIHdoZXJlIHRoZXJlIGlzbid0IG9uZS4KKwkoc2ltX2NsZWFyX2JyZWFrcG9pbnRzKTogRGVsZXRlLgorCShzaW1fc2V0X3BjKTogRGVsZXRlLgorCShzaW1faW5mbyk6IERlbGV0ZSBwcmludGZfZm4gYXJnLCBhbGwgY2FsbGVycyBjaGFuZ2VkLgorCShzaW1fb3Blbik6IERlZmluZSBoZXJlLgorCShzaW1fY2xvc2UpOiBOZXcgZnVuY3Rpb24uCisJKHNpbV9sb2FkKTogTmV3IGZ1bmN0aW9uLgorCShzaW1fY3JlYXRlX2luZmVyaW9yKTogUmVuYW1lZCBmcm9tIHNpbV9zZXRfYXJncy4KKwkoc2ltX2tpbGwpOiBEZWZpbmUgaGVyZS4KKwkqIHJ1bi5jIChwcmludGYpOiBEZWxldGUgZGVjbGFyYXRpb24uCisJKG1haW4pOiBDYWxsIHNpbV9jcmVhdGVfaW5mZXJpb3IgaW5zdGVhZCBvZiBzaW1fc2V0X3BjLgorCSogc2ltLmggKHNpbV9jbGVhcl9icmVha3BvaW50cyk6IERlbGV0ZS4KKworV2VkIE1heSAxOCAxMzoyMjowMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQorCisJKiB3cml0ZWNvZGUuYyAobWFpbik6IERpc2FibGUgdGhlIGNob3BwaW5nIG9mIGxhcmdlIGluaXRpYWxpemVycy4KKwlHQ0MgY2FuIG5vdyBjb3BlLgorCitTYXQgTWF5ICA3IDE3OjI0OjQ2IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCisKKwkqIHdyaXRlY29kZS5jIChpbmZvX2FyZ3MpOiBBZGQgcmVzZmxnIGFuZCBzZXRmbGcuCisJKiBsaXN0LmMgOiBSZWdlbmVyYXRlZC4KKwkqIE1ha2VmaWxlLmluOiBGaXJzdCBydWxlIGlzIG5vdyBjYWxsZWQgJ2FsbCcKKworU2F0IERlYyAxMSAxNjozOTozMCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKKworCSogaWZhY2UuYyAoc2ltX3N0b3JlX3JlZ2lzdGVyKTogR2V0IHJlZ3ZhbCB0aGUgcmlnaHQgd2F5IHVwLgorCSogd3JpdGVjb2RlLmMgKGluZm9fYXJncyk6IEFkZCBsZGEuCisKK1R1ZSBPY3QgMjYgMTM6MDE6NDYgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKKworCSogTWFrZWZpbGUuaW4gKElOQ0RJUik6IEZpeCBkZWZpbml0aW9uLgorCShDU0VBUkNIKTogQWRkIC1JJChzcmNkaXIpLy4uLy4uL2dkYgorCShjb21wZWQxLm8sIGNvbXBlZDMubywgY29tcGVkYjMubywgY29tcGVkMi5vKTogVXNlIENTRUFSQ0gsIG5vdCBJTkNESVIuCisJKiBpZmFjZS5jOiBSZXBsYWNlICNpbmNsdWRlICIuLi9pbmNsdWRlL3dhaXQuaCIgd2l0aCAicmVtb3RlLXNpbS5oIi4KKwkoc2ltX3NldF9wYyk6IGludCByZXN1bHQsIHVzZSBTSU1fQUREUiBmb3IgdHlwZSBvZiBhcmcgYGFkZHInLgorCShzaW1fc3RvcmVfcmVnaXN0ZXIpOiBpbnQgcmVzdWx0LCBwYXNzIHZhbHVlIGJ5IHJlZmVyZW5jZS4KKwkoc2ltX2ZldGNoX3JlZ2lzdGVyKTogVXNlIHVuc2lnbmVkIGNoYXIgKiBmb3IgYXJnIGBidWYnLgorCShzaW1fd3JpdGUpOiBpbnQgcmVzdWx0LCB1c2UgU0lNX0FERFIgZm9yIGB3aGVyZScgYXJnLAorCXVzZSB1bnNpZ25lZCBjaGFyICogZm9yIGB3aGF0JyBhcmcuCisJKHNpbV9yZWFkKTogRGl0dG8uCisJKHNpbV9yZXN1bWUpOiBpbnQgcmVzdWx0LgorCShzaW1fc3RvcF9yZWFzb24pOiBSZW5hbWVkIGZyb20gc2ltX3N0b3Bfc2lnbmFsLCBpbnQgcmVzdWx0LAorCW5ldyBhcmcgYHJlYXNvbicuCisJKHNpbV9pbmZvKTogaW50IHJlc3VsdCwgbWVyZ2Ugc2ltX2luZm9fcHJpbnQgaW50byBoZXJlLgorCShzaW1faW5mb19wcmludCk6IERlbGV0ZWQuCisJKiBydW4uYzogI2luY2x1ZGUgPHN0ZGlvLmg+CisJKG1haW4pOiBVcGRhdGUgY2FsbCB0byBzaW1faW5mby4KKwkqIHNpbS5oOiBSZW1vdmUgdmFyaW91cyBwcm90b3R5cGVzIGRlZmluZWQgaW4gcmVtb3RlLXNpbS5oLgorCitTYXQgT2N0IDIzIDE1OjE2OjQ1IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCisKKwkqIGlmYWNlLmMgKHNpbV9zdG9wX3NpZ25hbCk6IFJlc3VsdCBpcyBub3cgZW51bSBzaW1fc3RvcC4KKworVGh1IE9jdCAgNyAxOTowMTowNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiB3cml0ZWNvZGUuYyAoZG9zZXQsIGluZm9fZG9jb2RlKTogVW5kZXJzdGFuZCBzZXQgYW5kIHJlcyBpbnNucy4KKworVGh1IFNlcCAzMCAxMTozMDo0MiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQorCisJKiBzdXBwb3J0LmMgKHRtX2luZm9fcHJpbnQpOiAgSWYgbm8gdGltZXRha2VuLCBkb24ndCBkaXZpZGUgYnkgemVyby4KKworRnJpIEp1bCAzMCAxNTo1MTo1NCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCisKKwkqIHdyaXRlY29kZS5jIChkaXYpOiByZW5hbWUgdG8gZGl2aWRlLCB0byByZXNvbHZlIGNvbmZsaWN0IHdpdGgKKwlBTlNJIGZ1bmN0aW9uIGRpdiBmcm9tIDxzdGRsaWIuaD4KKworTW9uIE1hciAxNSAxNTo0ODo1MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCisKKwkqIHo4ay5tdCAoRE9fSU5TVEFMTCk6IFJlbmFtZWQgZnJvbSBJTlNUQUxMLgorCitUdWUgTWFyICA5IDEyOjMyOjI5IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiB3cml0ZWNvZGUuYyAobWFpbik6IE1ha2UgdGhlIHZlY3RvciAnYmlnJyBzdGF0aWMsIHNvIHRoYXQgaXQKKwl3aWxsIGNvbXBpbGUgb24gdGhlIGFwb2xsby4KKwkqIHN1cHBvcnQuYzogVXNlIHRoZSBBTlNJIGNvbXBpbGFudCBfX2lubGluZV9fLgorCitGcmkgTWFyICA1IDA3OjU0OjE4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiB3cml0ZWNvZGUuYyAobWFpbik6IFdoZW4gdXNpbmcgZ2NjLCBzcGxpdCB0aGUgdGFibGVzIGludG8KKwlzZWN0aW9ucyBzbyB0aGF0IGl0IHdpbGwgY29tcGlsZS4KKwkqIE1ha2VmaWxlLmluOiBHZXQgYXIgYXJncyByaWdodC4KKwkqIHRtLmg6IEZpeCBnY2MgcHJvdG90eXBlcy4KKworV2VkIE1hciAgMyAxNTowNDo0OCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bwb3NlaWRvbi5jeWdudXMuY29tKQorCisJKiBzdXBwb3J0LmMgKGZhaWwpOiBHZXQgdGhlIGFyZ3VtZW50IGNvdW50IHJpZ2h0LgorCSogdG0uaDogTGludC4KKwkqIHdyaXRlY29kZS5jIChtYWluKTogUGFzcyBhbGwgdGhlIGFyZ3VtZW50cyBlbWl0IG5lZWRzLgorCitUdWUgRmViICAyIDA3OjQ5OjQyIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQorCisJKiBsaW50LCBwcm90b3R5cGVzCisKK0ZyaSBKYW4gMTUgMTI6NDM6MDggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCisKKwkqIE5ldworCisKZGlmZiAtLWdpdCBhL3NpbS96OGsvTWFrZWZpbGUuaW4gYi9zaW0vejhrL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NDMyZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vejhrL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNjYgQEAKKyMgICAgTWFrZWZpbGUgdGVtcGxhdGUgZm9yIENvbmZpZ3VyZSBmb3IgdGhlIHo4ayBzaW0gbGlicmFyeS4KKyMgICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyMjIENPTU1PTl9QUkVfQ09ORklHX0ZSQUcKKworU0lNX09CSlMgPSBpZmFjZS5vIG1lbS5vIHN1cHBvcnQubyBxdWljay5vIFwKKwljb21wZWQxLm8gY29tcGVkMi5vIGNvbXBlZDMubyBjb21wZWRiMy5vIHNpbS1sb2FkLm8KKyMgRklYTUU6IGhhY2sgdG8gZmluZCBzeXNjYWxsLmguICBCZXR0ZXIgc3VwcG9ydCBmb3Igc3lzY2FsbC5oIGlzCisjIGluIHByb2dyZXNzLgorU0lNX0VYVFJBX0NGTEFHUyA9IC1JJChzcmNkaXIpLy4uLy4uL25ld2xpYi9saWJjL3N5cy96OGsKK1NJTV9FWFRSQV9DTEVBTiA9IGNsZWFuLWV4dHJhCisKK0NPTkZJR19IID0gY29uZmlnLmgKKworIyMgQ09NTU9OX1BPU1RfQ09ORklHX0ZSQUcKKworc3VwcG9ydC5vOnN1cHBvcnQuYyBpbmxpbmVzLmggJChDT05GSUdfSCkKK21lbS5vOiBtZW0uYyB0bS5oIG1lbS5oIHNpbS5oICQoQ09ORklHX0gpCisKK2NvbXBlZDEubzpjb21wZWQxLmMgdGMtZ2VuMS5oICQoQ09ORklHX0gpCitjb21wZWQzLm86Y29tcGVkMy5jIHRjLWdlbjMuaCAkKENPTkZJR19IKQorY29tcGVkYjMubzpjb21wZWRiMy5jIHRjLWdlbmIzLmggJChDT05GSUdfSCkKK2NvbXBlZDIubzpjb21wZWQyLmMgdGMtZ2VuMi5oICQoQ09ORklHX0gpCisKK3RjLWdlbjEuaDp3cml0ZWNvZGUKKwkuL3dyaXRlY29kZSAgLTEgPnRjLWdlbjEuaAorCit0Yy1nZW4yLmg6d3JpdGVjb2RlCisJLi93cml0ZWNvZGUgIC0yID50Yy1nZW4yLmgKKwordGMtZ2VuMy5oOndyaXRlY29kZQorCS4vd3JpdGVjb2RlICAtMyA+dGMtZ2VuMy5oCisKK3RjLWdlbmIzLmg6d3JpdGVjb2RlCisJLi93cml0ZWNvZGUgIC1iMyA+dGMtZ2VuYjMuaAorCit3cml0ZWNvZGU6IHdyaXRlY29kZS5vIGxpc3QubyBicXVpY2subworCSQoQ0NfRk9SX0JVSUxEKSAtbyB3cml0ZWNvZGUgd3JpdGVjb2RlLm8gbGlzdC5vIGJxdWljay5vCisKK3dyaXRlY29kZS5vOiB3cml0ZWNvZGUuYyAkKENPTkZJR19IKQorCSQoQ0NfRk9SX0JVSUxEKSAtYyAkKENGTEFHUykgJChIREVGSU5FUykgJChDU0VBUkNIKSAkKENTV0lUQ0hFUykgJChzcmNkaXIpL3dyaXRlY29kZS5jCisKK2xpc3QubzogbGlzdC5jCisJJChDQ19GT1JfQlVJTEQpIC1jICQoQ0ZMQUdTKSAkKEhERUZJTkVTKSAkKENTRUFSQ0gpICQoQ1NXSVRDSEVTKSAkKHNyY2RpcikvbGlzdC5jCisKKyMgVHdvIGNvcGllcyBvZiBxdWljay5vIGFyZSBjcmVhdGVkLiAgT25lIGZvciAkYnVpbGQgYW5kIG9uZSBmb3IgJGhvc3QuCiticXVpY2subzogcXVpY2suYworCSQoQ0NfRk9SX0JVSUxEKSAtYyAkKENGTEFHUykgJChIREVGSU5FUykgJChDU0VBUkNIKSAkKENTV0lUQ0hFUykgJChzcmNkaXIpL3F1aWNrLmMgLW8gYnF1aWNrLm8KKworY2xlYW4tZXh0cmE6CisJcm0gLWYgdGMtZ2VuMS5oIHRjLWdlbjIuaCB0Yy1nZW4zLmggdGMtZ2VuYjMuaCB3cml0ZWNvZGUgCmRpZmYgLS1naXQgYS9zaW0vejhrL2FjY29uZmlnLmggYi9zaW0vejhrL2FjY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliODdhMQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS96OGsvYWNjb25maWcuaApAQCAtMCwwICsxLDE1IEBACisKKy8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQuICAqLworI3VuZGVmIEVOQUJMRV9OTFMKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgY2F0Z2V0cyBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLworI3VuZGVmIEhBVkVfQ0FUR0VUUworCisvKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBnZXR0ZXh0IGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCisjdW5kZWYgSEFWRV9HRVRURVhUCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3VyIGxvY2FsZS5oIGZpbGUgY29udGFpbnMgTENfTUVTU0FHRVMuICAqLworI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKZGlmZiAtLWdpdCBhL3NpbS96OGsvY29tcGVkMS5jIGIvc2ltL3o4ay9jb21wZWQxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1NjUxMwotLS0gL2Rldi9udWxsCisrKyBiL3NpbS96OGsvY29tcGVkMS5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qIGluc3RydWN0aW9uIGludGVycHJldGVyIG1vZHVsZSAxCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIFo4S1NJTQorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitaOEtaSU0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBaOEtaSU07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKyNpbmNsdWRlICJ0bS5oIgorI2luY2x1ZGUgInNpbS5oIgorCisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBJTkxJTkUgaW5saW5lCisjaW5jbHVkZSAiaW5saW5lcy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ0Yy1nZW4xLmgiCisKZGlmZiAtLWdpdCBhL3NpbS96OGsvY29tcGVkMi5jIGIvc2ltL3o4ay9jb21wZWQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwMTJkMQotLS0gL2Rldi9udWxsCisrKyBiL3NpbS96OGsvY29tcGVkMi5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qIGluc3RydWN0aW9uIGludGVycHJldGVyIG1vZHVsZSAyCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIFo4S1NJTQorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBaOEtaSU07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKyNpbmNsdWRlICJ0bS5oIgorI2luY2x1ZGUgInNpbS5oIgorI2luY2x1ZGUgInRjLWdlbjIuaCIKKworCmRpZmYgLS1naXQgYS9zaW0vejhrL2NvbXBlZDMuYyBiL3NpbS96OGsvY29tcGVkMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MjY5NjkKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vejhrL2NvbXBlZDMuYwpAQCAtMCwwICsxLDI4IEBACisvKiBpbnN0cnVjdGlvbiBpbnRlcnByZXRlciBtb2R1bGUgMgorICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBaOEtTSU0KKworWjhLU0lNIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworWjhLU0lNIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggWjhLWklNOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKyNpbmNsdWRlICJ0bS5oIgorI2luY2x1ZGUgInNpbS5oIgorCisjaW5jbHVkZSAiaW5saW5lcy5oIgorI2luY2x1ZGUgInRjLWdlbjMuaCIKKworCmRpZmYgLS1naXQgYS9zaW0vejhrL2NvbXBlZGIzLmMgYi9zaW0vejhrL2NvbXBlZGIzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1NDFkYgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS96OGsvY29tcGVkYjMuYwpAQCAtMCwwICsxLDI5IEBACisvKiBpbnN0cnVjdGlvbiBpbnRlcnByZXRlciBtb2R1bGUgMworICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBaOEtTSU0KKworWjhLU0lNIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworWjhLU0lNIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggWjhLWklNOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSB1c2hvcnRfdHlwZSB1bnNpZ25lZCBzaG9ydAorCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKyNpbmNsdWRlICJ0bS5oIgorI2luY2x1ZGUgInNpbS5oIgorI2luY2x1ZGUgImlubGluZXMuaCIKKworI2luY2x1ZGUgInRjLWdlbmIzLmgiCisKKwpkaWZmIC0tZ2l0IGEvc2ltL3o4ay9jb25maWcuaW4gYi9zaW0vejhrL2NvbmZpZy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTQ3NzI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3o4ay9jb25maWcuaW4KQEAgLTAsMCArMSwxNjEgQEAKKy8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLworCisvKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLworI3VuZGVmIENfQUxMT0NBCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KKyN1bmRlZiBjb25zdAorCisvKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCisgICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLworI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLworI3VuZGVmIEhBVkVfQUxMT0NBCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLworI3VuZGVmIEhBVkVfQUxMT0NBX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLworI3VuZGVmIEhBVkVfTU1BUAorCisvKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLworI3VuZGVmIGlubGluZQorCisvKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLworI3VuZGVmIG9mZl90CisKKy8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLworI3VuZGVmIF9QT1NJWF9TT1VSQ0UKKworLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGludCBvciB2b2lkKS4gICovCisjdW5kZWYgUkVUU0lHVFlQRQorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KKyN1bmRlZiBzaXplX3QKKworLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCisgICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKKyAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KKyBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCisgU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCisgU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KKyAqLworI3VuZGVmIFNUQUNLX0RJUkVDVElPTgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLworI3VuZGVmIFNURENfSEVBREVSUworCisvKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KKyN1bmRlZiBFTkFCTEVfTkxTCisKKy8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KKyN1bmRlZiBIQVZFX0dFVFRFWFQKKworLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFBDUFkKKworLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCisjdW5kZWYgSEFWRV9MQ19NRVNTQUdFUworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fc2V0ZnB1Y3cgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfX19TRVRGUFVDVworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9EQ0dFVFRFWFQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUQ1dECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRydXNhZ2UgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUlVTQUdFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX01VTk1BUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9QVVRFTlYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU0VURU5WCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NFVExPQ0FMRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNpZ2FjdGlvbiBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TSUdBQ1RJT04KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RQQ1BZCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJDQVNFQ01QCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NUUkNIUgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHRpbWUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfVElNRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0FSR1pfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9GQ05UTF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZwdV9jb250cm9sLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0ZQVV9DT05UUk9MX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xJTUlUU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9MT0NBTEVfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtYWxsb2MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTUFMTE9DX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmxfdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTkxfVFlQRVNfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RETElCX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NUUklOR19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1RSSU5HU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1RJTUVTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dGltZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9USU1FX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9WQUxVRVNfSApkaWZmIC0tZ2l0IGEvc2ltL3o4ay9jb25maWd1cmUgYi9zaW0vejhrL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZDkxMGY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3o4ay9jb25maWd1cmUKQEAgLTAsMCArMSwzODkyIEBACisjISAvYmluL3NoCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3NpbV9pbmxpbmU9Ii1EREVGQVVMVF9JTkxJTkU9MCIKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisjIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKKyMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KKworIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgorIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KKyMKKyMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgorIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKKyMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KKworIyBzZXJpYWwgMworCisKKworCisKKyMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKKworCisjIENoZWNrIHdoZXRoZXIgTENfTUVTU0FHRVMgaXMgYXZhaWxhYmxlIGluIDxsb2NhbGUuaD4uCisjIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorIworIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCisjIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQorIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgorIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgorCisjIHNlcmlhbCAxCisKKworCisjIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIEN5Z3dpbjMyLCB3aXRob3V0IHVzaW5nCisjIEFDX0NBTk9OSUNBTF8qLiAgSWYgc28sIHNldCBvdXRwdXQgdmFyaWFibGUgQ1lHV0lOMzIgdG8gInllcyIuCisjIE90aGVyd2lzZSBzZXQgaXQgdG8gIm5vIi4KKworCisKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgV2luMzIsIHdpdGhvdXQgdXNpbmcKKyMgQUNfQ0FOT05JQ0FMXyouICBJZiBzbywgc2V0IG91dHB1dCB2YXJpYWJsZSBFWEVFWFQgdG8gIi5leGUiLgorIyBPdGhlcndpc2Ugc2V0IGl0IHRvICIiLgorCisKKworCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIAorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCisKKyMgRGVmYXVsdHM6CithY19oZWxwPQorYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlCQlFbmFibGUgZGV2ZWxvcGVyIGZ1bmN0aW9uYWxpdHkuIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWJzd2FwCQkJVXNlIEhvc3Qgc3BlY2lmaWMgQlNXQVAgaW5zdHJ1Y3Rpb24uIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc2ltLWNmbGFncz1vcHRzCQlFeHRyYSBDRkxBR1MgZm9yIHVzZSBpbiBidWlsZGluZyBzaW11bGF0b3IiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1zaW0tZGVidWc9b3B0cwkJRW5hYmxlIGRlYnVnZ2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1zdGRpbwkJCVNwZWNpZnkgd2hldGhlciB0byB1c2Ugc3RkaW8gZm9yIGNvbnNvbGUgaW5wdXQvb3V0cHV0LiIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS10cmFjZT1vcHRzCQlFbmFibGUgdHJhY2luZyBmbGFncyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNpbS1wcm9maWxlPW9wdHMJCUVuYWJsZSBwcm9maWxpbmcgZmxhZ3MiCisKKyMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitidWlsZD1OT05FCitjYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCitleGVjX3ByZWZpeD1OT05FCitob3N0PU5PTkUKK25vX2NyZWF0ZT0KK25vbm9wdD1OT05FCitub19yZWN1cnNpb249CitwcmVmaXg9Tk9ORQorcHJvZ3JhbV9wcmVmaXg9Tk9ORQorcHJvZ3JhbV9zdWZmaXg9Tk9ORQorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKK3NpbGVudD0KK3NpdGU9CitzcmNkaXI9Cit0YXJnZXQ9Tk9ORQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCittYW5kaXI9JyR7cHJlZml4fS9tYW4nCisKKyMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KK3N1YmRpcnM9CitNRkxBR1M9IE1BS0VGTEFHUz0KK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjIiCisgICAgZXhpdCAwIDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorICAgICAgKj0qKSA7OworICAgICAgKikgYWNfb3B0YXJnPXllcyA7OworICAgIGVzYWMKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKyAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgOzsKKworICAqKQorICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCisgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorICAgIGZpCisgICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCisjIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKKyMgMCBzdGFuZGFyZCBpbnB1dAorIyAxIGZpbGUgY3JlYXRpb24KKyMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCisjIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CisjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCisjIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorZWxzZQorICBleGVjIDY+JjEKK2ZpCitleGVjIDU+Li9jb25maWcubG9nCisKK2VjaG8gIlwKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorIiAxPiY1CisKKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCithY19jb25maWd1cmVfYXJncz0KK2ZvciBhY19hcmcKK2RvCisgIGNhc2UgIiRhY19hcmciIGluCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OworICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKyAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OworICBlc2FjCitkb25lCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKyMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgorIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCisjIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKK2lmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQoraWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCitpZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKKworIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KK3JtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCitlY2hvID4gY29uZmRlZnMuaAorCisjIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0CisjIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorYWNfdW5pcXVlX2ZpbGU9TWFrZWZpbGUuaW4KKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCisgIGFjX3Byb2c9JDAKKyAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICAgIHNyY2Rpcj0uLgorICBmaQorZWxzZQorICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCitmaQoraWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCisgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQorICBlbHNlCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKyAgZmkKK2ZpCitzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKworIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KK2lmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKyAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGVsc2UKKyAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCisgIGZpCitmaQorZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCisgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorICAgIC4gIiRhY19zaXRlX2ZpbGUiCisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAuICRjYWNoZV9maWxlCitlbHNlCisgIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICA+ICRjYWNoZV9maWxlCitmaQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCithY19leGVleHQ9CithY19vYmpleHQ9bworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo2Nzc6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBDUFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKKyAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KKyAgQ1BQPSIke0NDLWNjfSAtRSIKKyAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjkyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KK1N5bnRheCBFcnJvcgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo2OTg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDcwOSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NzE1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3MjYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorU3ludGF4IEVycm9yCitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjczMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIENQUD0vbGliL2NwcAorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCisgIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgorZWxzZQorICBhY19jdl9wcm9nX0NQUD0iJENQUCIKK2ZpCitlY2hvICIkYWNfdCIiJENQUCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3NTc6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQorc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKK2FsbDoKKwlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJworRU9GCisjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KK2V2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAoraWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgorICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKK2Vsc2UKKyAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KK2ZpCitybSAtZiBjb25mdGVzdG1ha2UKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIFNFVF9NQUtFPQorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc4NDogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQoraWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCisgIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKK3RoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCitFT0YKKworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIENDPSIkQ0MgLXBvc2l4IgorICBlbHNlCisgICAgQ0M9IiRDQyAtWHAiCisgIGZpCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorICBJU0M9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6ODA1OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4MTAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjgxODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA4MzUgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICA6CitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODUzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIDoKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICA6CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDg3NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQoraW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQoraWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKK2V4aXQgKDApOyB9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4ODU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgOgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTA5OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDkxNCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCisvKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwordHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OworLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK2NoYXIgY29uc3QgKmNvbnN0ICpjY3A7CitjaGFyICoqcDsKKy8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCitzdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307CitzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKKy8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KKyAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQorICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KK2NvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKK2NjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKKy8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCisrK2NjcDsKK3AgPSAoY2hhcioqKSBjY3A7CitjY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKK3sgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCisgIGNoYXIgKnQ7CisgIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7CisKKyAgKnQrKyA9IDA7Cit9Cit7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLworICBpbnQgeFtdID0gezI1LCAxN307CisgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CisgICsrZm9vOworfQoreyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCisgIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOworICBpcHRyIHAgPSAwOworICArK3A7Cit9Cit7IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKKyAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLworICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OworICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Cit9Cit7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLworICBjb25zdCBpbnQgZm9vID0gMTA7Cit9CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5NjM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgY29uc3QgCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTg0OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX2N2X2NfaW5saW5lPW5vCitmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDk5MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworfSAkYWNfa3cgZm9vKCkgeworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk5ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CitmaQorcm0gLWYgY29uZnRlc3QqCitkb25lCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKK2Nhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KKyAgaW5saW5lIHwgeWVzKSA7OworICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIGlubGluZSAKK0VPRgorIDs7CisgICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCitFT0YKKyA7OworZXNhYworCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwMjQ6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEwMjkgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmIFNURENfSEVBREVSUworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIm9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKK2Vsc2UKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX29mZl90PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCitlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgb2ZmX3QgbG9uZworRU9GCisKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwNTc6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA2MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWYgU1REQ19IRUFERVJTCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKK0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICBlZ3JlcCAic2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCitlbHNlCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZAorRU9GCisKK2ZpCisKKyMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCisjIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwOTI6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDk3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxhbGxvY2EuaD4KK2ludCBtYWluKCkgeworY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTI1OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDExMzAgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZWxzZQorIyBpZmRlZiBfTVNDX1ZFUgorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgZWxzZQorIyAgaWYgSEFWRV9BTExPQ0FfSAorIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KK2NoYXIgKmFsbG9jYSAoKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCitpbnQgbWFpbigpIHsKK2NoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Cis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2CitpZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9BTExPQ0EgMQorRU9GCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KKyAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKKyAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCisgICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAorICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KKyAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIENfQUxMT0NBIDEKK0VPRgorCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjExOTA6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTk1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKK3dlYmVjcmF5CisjZWxzZQord2Vub3RiZWNyYXkKKyNlbmRpZgorCitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9vc19jcmF5PXllcworZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X29zX2NyYXk9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2CitpZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCitmb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTIyMDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTIyNSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjQ4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCitFT0YKKworICBicmVhaworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2RvbmUKK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyNzU6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjgzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK2ZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCit7CisgIHN0YXRpYyBjaGFyICphZGRyID0gMDsKKyAgYXV0byBjaGFyIGR1bW15OworICBpZiAoYWRkciA9PSAwKQorICAgIHsKKyAgICAgIGFkZHIgPSAmZHVtbXk7CisgICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKK30KK21haW4gKCkKK3sKKyAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQorZmkKK3JtIC1mciBjb25mdGVzdCoKK2ZpCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KK0VPRgorCitmaQorCitmb3IgYWNfaGRyIGluIHVuaXN0ZC5oCitkbworYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTMyNzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzMzIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPCRhY19oZHI+CitFT0YKK2FjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCit7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitmb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTM2NjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM3MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzk0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDE5OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubworZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNDI3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCisgICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKKwltbWFwIHByaXZhdGUgbm90IGZpeGVkCisJbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKKwltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCisJbW1hcCBzaGFyZWQgbm90IGZpeGVkCisJbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAorCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAorICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKKyAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKKyAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQorICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQorICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCisgICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQorICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKKyAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgorCisgICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCisgICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgorICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCisgICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisvKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCisjaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKyMgaWZkZWYgSEFWRV9VTklTVERfSAorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjIGVuZGlmCisKKy8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCisjIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICisjICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisjIGVuZGlmCisKKyMgaWZkZWYgX1NDX1BBR0VTSVpFCisjICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKKyMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KKyMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCisjICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKKyMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgICAgaWZkZWYgTkJQRworIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQorIyAgICAgaWZuZGVmIENMU0laRQorIyAgICAgIGRlZmluZSBDTFNJWkUgMQorIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCisjICAgIGVsc2UgLyogbm8gTkJQRyAqLworIyAgICAgaWZkZWYgTkJQQworIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKKyMgICAgIGVsc2UgLyogbm8gTkJQQyAqLworIyAgICAgIGlmZGVmIFBBR0VTSVpFCisjICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCisjICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KKyMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KKyMgICAgZW5kaWYgLyogbm8gTkJQRyAqLworIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KKyMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLworIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCisjICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCisjIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLworCisjZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9CisjZWxzZQorY2hhciAqbWFsbG9jKCk7CisjZW5kaWYKKworaW50CittYWluKCkKK3sKKwljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKKwlpbnQgaSwgcGFnZXNpemU7CisJaW50IGZkOworCisJcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOworCisJLyoKKwkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCisJICovCisJZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7CisJaWYgKCFkYXRhKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKKwl1bWFzaygwKTsKKwlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKKwlpZiAoZmQgPCAwKQorCQlleGl0KDEpOworCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQorCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKworCS8qCisJICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCisJICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAorCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCisJICovCisJZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOworCWlmIChmZCA8IDApCisJCWV4aXQoMSk7CisJZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKKwlpZiAoIWRhdGEyKQorCQlleGl0KDEpOworCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKKwlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQorCQlleGl0KDEpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQorCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQorCQkJZXhpdCgxKTsKKworCS8qCisJICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKKwkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCisJICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCisJICovCisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7CisJZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOworCWlmICghZGF0YTMpCisJCWV4aXQoMSk7CisJaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCisJCWV4aXQoMSk7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCisJCQlleGl0KDEpOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOworCWV4aXQoMCk7Cit9CisKK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTY3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTU1BUCAxCitFT0YKKworZmkKKworCisjIGF1dG9jb25mLmluZm8gc2F5cyB0aGlzIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgQUNfSU5JVC4KKworCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiBgY2QgJHNyY2Rpcjtwd2RgLy4uLy4uICRzcmNkaXIvYGNkICRzcmNkaXI7cHdkYC8uLi8uLjsgZG8KKyAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIGBjZCAkc3JjZGlyO3B3ZGAvLi4vLi4gJHNyY2Rpci9gY2QgJHNyY2Rpcjtwd2RgLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KK2ZpCithY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCithY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKK2FjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorCisKKyMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgorIyBUaGUgaW5wdXRzIGFyZToKKyMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAorIworIyBUaGUgcnVsZXMgYXJlOgorIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKKyMgICAgc2FtZSB0aW1lLgorIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KKyMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAorIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KKyMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KKyMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCisKKyMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KKyMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KK2Nhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgorTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OworKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Citlc2FjCisKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgoraWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2NDA6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorCitob3N0X2FsaWFzPSRob3N0CitjYXNlICIkaG9zdF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKQorICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKKyAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaSA7OworICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKKyAgZXNhYyA7OworZXNhYworCitob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKK2hvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK2hvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY2MTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKwordGFyZ2V0X2FsaWFzPSR0YXJnZXQKK2Nhc2UgIiR0YXJnZXRfYWxpYXMiIGluCitOT05FKQorICBjYXNlICRub25vcHQgaW4KKyAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7CisgICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKwordGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAordGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKK3RhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCit0YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCitlY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgorCitlY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTY3OTogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorCitidWlsZF9hbGlhcz0kYnVpbGQKK2Nhc2UgIiRidWlsZF9hbGlhcyIgaW4KK05PTkUpCisgIGNhc2UgJG5vbm9wdCBpbgorICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OworICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7CisgIGVzYWMgOzsKK2VzYWMKKworYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKK2J1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAorYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCitidWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAorZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgorCit0ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCisgIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKKyAgICBOT05FTk9ORXMseCx4LCAmJgorICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCisKK2lmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQorZWxzZQorICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCisgIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKK3MsXFwsXFxcXCxnOyBzLFwkLCQkLGcKK0VPRl9TRUQKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKKyAgcm0gLWYgY29uZnRlc3RzZWQKK2ZpCit0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKKyAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCisjIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KK3Rlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgorICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKKworIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgordGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3MjM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE3NTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKwljb250aW51ZQorICAgICAgZmkKKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgoraWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgorICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgIHNoaWZ0CisgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCisgICAgKndpbjMyKiB8ICpXSU4zMiopCisgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjbDsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODAyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorIDs7CisgICAgZXNhYworICBmaQorICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODMzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxODQzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK21haW4oKXtyZXR1cm4oMCk7fQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4NDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcworICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCisgIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KKyAgZWxzZQorICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCisgIGZpCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorZmkKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODY3OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1CitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKK2Nyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTg3MjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg4MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2N2X3Byb2dfZ2NjPXllcworZWxzZQorICBhY19jdl9wcm9nX2djYz1ubworZmkKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKKworaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorCithY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKK2FjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTAwOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYworaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19nPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2CitpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCisgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQorCisjIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKKyMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgorIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CisjIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAorIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCisjIElSSVggL3NiaW4vaW5zdGFsbAorIyBBSVggL2Jpbi9pbnN0YWxsCisjIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZworIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5NDM6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgICAjIGJ5IGRlZmF1bHQuCisgICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgOgorCSAgZWxzZQorCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCisJICAgIGJyZWFrIDIKKwkgIGZpCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCisgIElGUz0iJGFjX3NhdmVfSUZTIgorCitmaQorICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCisgICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgorICBmaQorZmkKK2VjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisKKyMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KK2lmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisgIENDX0ZPUl9CVUlMRD0nJChDQyknCitlbHNlCisgIENDX0ZPUl9CVUlMRD1nY2MKK2ZpCisKKworCisKK0FSPSR7QVItYXJ9CisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjAwOTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKK2ZpCitmaQorUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworQUxMX0xJTkdVQVM9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAordW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDQzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjA0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjA1MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKyAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAorX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwODM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIwODggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjExMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisgICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCisgICAgIGZvciBhY19mdW5jIGluIHN0cGNweQorZG8KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjE0MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjE0NSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICRhY19mdW5jKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorY2hva2UgbWUKKyNlbHNlCiskYWNfZnVuYygpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfZnVuYyAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCisgICBmaQorICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KKyAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfU1RQQ1BZIDEKK0VPRgorCisgICBmaQorCisgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyMDI6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjIwNyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bG9jYWxlLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiBMQ19NRVNTQUdFUworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgorICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQorRU9GCisKKyAgICBmaQorICBmaQorICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjM1OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCisgIFVTRV9OTFM9JGVuYWJsZXZhbAorZWxzZQorICBVU0VfTkxTPXllcworZmkKKworICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgorICAgIAorCisgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KKworICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEVOQUJMRV9OTFMgMQorRU9GCisKKyAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyNTU6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQorICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCisgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKK2Vsc2UKKyAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubworZmkKKworICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2CisKKyAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgorICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KKwlubHNfY3ZfaGVhZGVyX2xpYmd0PQorCUNBVE9CSkVYVD1OT05FCisKKwlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjI3NDogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjI3OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8bGliaW50bC5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjg0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjMwMTogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzA2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitpbnQgbWFpbigpIHsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzEzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKKworCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKwkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMjk6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQorYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1saW50bCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzM3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgYmluZHRleHRkb21haW4oKTsKKworaW50IG1haW4oKSB7CitiaW5kdGV4dGRvbWFpbigpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM0ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorTElCUz0iJGFjX3NhdmVfTElCUyIKKworZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjM2NDogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMzY5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM3NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCSAgIGZpCisKKwkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAorCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX0dFVFRFWFQgMQorRU9GCisKKwkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0MDQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkTVNHRk1UIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCisJYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisJICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgorCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKK2RvCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI0Mzg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI0NDMgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkYWNfZnVuYygpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKK2Nob2tlIG1lCisjZWxzZQorJGFjX2Z1bmMoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ2NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2Z1bmMgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjQ5MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXNlICIkR01TR0ZNVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICA/Oi8qKQkJCSAKKyAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorICA7OworICAqKQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKKyAgOzsKK2VzYWMKK2ZpCitHTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgoraWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKwkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjUyODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJFhHRVRURVhUIiBpbgorICAvKikKKyAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgorCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCisJYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCisgIDs7Citlc2FjCitmaQorWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgoraWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNTYwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CitleHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7CisJCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9LmdtbworCQkgICBEQVRBRElSTkFNRT1zaGFyZQorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDQVRPQkpFWFQ9Lm1vCisJCSAgIERBVEFESVJOQU1FPWxpYgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCQlJTlNUT0JKRVhUPS5tbworCSAgICAgIGZpCisJICAgIGZpCisJCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisJICAgICAgICAKKyAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KKwkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCisgICAgICAgIGZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjYwMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KKwlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKKwlicmVhaworICAgICAgZmkKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCisgIDs7Citlc2FjCitmaQorTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCitpZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2MzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2FzZSAiJEdNU0dGTVQiIGluCisgIC8qKQorICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgPzovKikJCQkgCisgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KKyAgOzsKKyAgKikKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCisgIDs7Citlc2FjCitmaQorR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKK2lmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgorICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI2Njk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhc2UgIiRYR0VUVEVYVCIgaW4KKyAgLyopCisgIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KKwlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgorCWJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgorICA7OworZXNhYworZmkKK1hHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKK2lmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICAgICAgCisJVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICAgIElOU1RPQkpFWFQ9Lm1vCisgICAgICAgIERBVEFESVJOQU1FPXNoYXJlCisJSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKKwlJTlRMTElCUz0kSU5UTERFUFMKKwlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKKyAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAorICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAorICAgICAgZmkKKworICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKwkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KKwkgIDogOworCWVsc2UKKwkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKKwkgIFhHRVRURVhUPSI6IgorCWZpCisgICAgICBmaQorCisgICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KKyAgICAgIFBPU1VCPXBvCisgICAgZWxzZQorICAgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKKyAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCisgICAgZmkKKworICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKKyAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgorICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KKyAgICAgIFVTRV9OTFM9eWVzCisgICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCisgICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKKyAgICBkb25lCisKKyAgICAgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgIAorCisgICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCisgICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCisgICAgICAgTElOR1VBUz0KKyAgICAgZWxzZQorICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3NTk6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQorICAgICAgIE5FV19MSU5HVUFTPQorICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbworICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgorICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7CisgICAgICAgICBlc2FjCisgICAgICAgZG9uZQorICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCisgICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2CisgICAgIGZpCisKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCisgICAgIGZpCisgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKKyAgIGVsc2UKKyAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAorLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgorICAgZmkKKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgorICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KKwkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI3ODc6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI3OTIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc5NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIG1zZ2Zvcm1hdD1saW51eAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK21zZ2Zvcm1hdD14b3BlbgorZmkKKworCisJICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCisgICAgICBmaQorICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCisJICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKKyAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgorICAgICBHVF9OTz0iI05PIyIKKyAgICAgR1RfWUVTPQorICAgZWxzZQorICAgICBHVF9OTz0KKyAgICAgR1RfWUVTPSIjWUVTIyIKKyAgIGZpCisgICAKKyAgIAorCisgICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCisgICAKKworICAgICAgbD0KKyAgIAorCisgICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KKyAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KKyAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCisJIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCisJICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKKwkgZWxzZQorCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCisJIGZpCisgICAgICBlbHNlCisJIHBvc3JjcHJlZml4PSIuLi8iCisgICAgICBmaQorICAgICAgcm0gLWYgcG8vUE9URklMRVMKKyAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAorCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUworICAgZmkKKyAgCisKKyMgQ2hlY2sgZm9yIGNvbW1vbiBoZWFkZXJzLgorIyBGSVhNRTogU2VlbXMgdG8gbWUgdGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgZm9yIGkzODYtd2luZG93cyBob3N0cy4KKyMgQXQgb25lIHBvaW50IHRoZXJlIHdlcmUgaGFyZGNvZGVkIEFDX0RFRklORSdzIGlmICR7aG9zdH0gPSBpMzg2LSotd2luZG93cyouCitmb3IgYWNfaGRyIGluIHN0ZGxpYi5oIHN0cmluZy5oIHN0cmluZ3MuaCB1bmlzdGQuaCB0aW1lLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyODY2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjg3MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg3NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19oZHIgaW4gc3lzL3RpbWUuaCBzeXMvcmVzb3VyY2UuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjI5MDY6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTExICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTE2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworZm9yIGFjX2hkciBpbiBmY250bC5oIGZwdV9jb250cm9sLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTQ2OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjk1MSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAorICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSAkYWNfdHJfaGRyIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKK2ZvciBhY19mdW5jIGluIGdldHJ1c2FnZSB0aW1lIHNpZ2FjdGlvbiBfX3NldGZwdWN3CitkbworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyOTg1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyOTkwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgJGFjX2Z1bmMoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCitjaG9rZSBtZQorI2Vsc2UKKyRhY19mdW5jKCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKKworaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9mdW5jIDEKK0VPRgorIAorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitkb25lCisKKworIyBDaGVjayBmb3Igc29ja2V0IGxpYnJhcmllcworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmQgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMwNDA6IGNoZWNraW5nIGZvciBiaW5kIGluIC1sc29ja2V0IiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nYmluZCB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxzb2NrZXQgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMzA0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGJpbmQoKTsKKworaW50IG1haW4oKSB7CitiaW5kKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDU5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHNvY2tldCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9saWIgMQorRU9GCisKKyAgTElCUz0iLWxzb2NrZXQgJExJQlMiCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzA4NzogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQorYWNfbGliX3Zhcj1gZWNobyBuc2wnXydnZXRob3N0YnluYW1lIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbG5zbCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMDk1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZ2V0aG9zdGJ5bmFtZSgpOworCitpbnQgbWFpbigpIHsKK2dldGhvc3RieW5hbWUoKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxMDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gbnNsIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2xpYiAxCitFT0YKKworICBMSUJTPSItbG5zbCAkTElCUyIKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKworLiAke3NyY2Rpcn0vLi4vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0CisKKworCitVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQlNQUlOVD0iIiBVU0VfTUFJTlRBSU5FUl9NT0RFPXllcyA7OworICBubykJTUFJTlQ9IiMiIDs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLW1haW50YWluZXItbW9kZSBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IE1BSU5UPSIjIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJE1BSU5UIiA9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIG1haW50YWluZXIgbW9kZSIgNj4mMQorZmkKK2Vsc2UKKyAgTUFJTlQ9IiMiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1ic3dhcCBvciAtLWRpc2FibGUtc2ltLWJzd2FwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9ic3dhcCtzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX2Jzd2FwIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX2Jzd2FwPSItRFdJVEhfQlNXQVA9MSAtRFVTRV9CU1dBUD0xIjs7CisgIG5vKQlzaW1fYnN3YXA9Ii1EV0lUSF9CU1dBUD0wIjs7CisgICopCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogIi0tZW5hYmxlLXNpbS1ic3dhcCBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiIiAxPiYyOyBleGl0IDE7IH07IHNpbV9ic3dhcD0iIjs7Citlc2FjCitpZiB0ZXN0IHgiJHNpbGVudCIgIT0geCJ5ZXMiICYmIHRlc3QgeCIkc2ltX2Jzd2FwIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBic3dhcCBmbGFncyA9ICRzaW1fYnN3YXAiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV9ic3dhcD0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tY2ZsYWdzIG9yIC0tZGlzYWJsZS1zaW0tY2ZsYWdzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9jZmxhZ3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9jZmxhZ3MiCisgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAgeWVzKQkgc2ltX2NmbGFncz0iLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIjs7CisgIHRyYWNlKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJQbGVhc2UgdXNlIC0tZW5hYmxlLXNpbS1kZWJ1ZyBpbnN0ZWFkLiIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX2NmbGFncz0iIjs7CisgIG5vKQkgc2ltX2NmbGFncz0iIjs7CisgICopCSBzaW1fY2ZsYWdzPWBlY2hvICIke2VuYWJsZXZhbH0iIHwgc2VkIC1lICJzLywvIC9nImA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9jZmxhZ3MiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSBjZmxhZ3MgPSAkc2ltX2NmbGFncyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2NmbGFncz0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tZGVidWcgb3IgLS1kaXNhYmxlLXNpbS1kZWJ1ZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9zaW1fZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9kZWJ1ZyIKKyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorICB5ZXMpIHNpbV9kZWJ1Zz0iLURERUJVRz03IC1EV0lUSF9ERUJVRz03Ijs7CisgIG5vKSAgc2ltX2RlYnVnPSItRERFQlVHPTAgLURXSVRIX0RFQlVHPTAiOzsKKyAgKikgICBzaW1fZGVidWc9Ii1EREVCVUc9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfREVCVUc9Jygke2VuYWJsZXZhbH0pJyI7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9kZWJ1ZyIgIT0geCIiOyB0aGVuCisgIGVjaG8gIlNldHRpbmcgc2ltIGRlYnVnID0gJHNpbV9kZWJ1ZyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX2RlYnVnPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS1zdGRpbyBvciAtLWRpc2FibGUtc2ltLXN0ZGlvIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV9zdGRpbytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3N0ZGlvIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3N0ZGlvPSItRFdJVEhfU1RESU89RE9fVVNFX1NURElPIjs7CisgIG5vKQlzaW1fc3RkaW89Ii1EV0lUSF9TVERJTz1ET05UX1VTRV9TVERJTyI7OworICAqKQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICJVbmtub3duIHZhbHVlICRlbmFibGV2YWwgcGFzc2VkIHRvIC0tZW5hYmxlLXNpbS1zdGRpbyIiIDE+JjI7IGV4aXQgMTsgfTsgc2ltX3N0ZGlvPSIiOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fc3RkaW8iICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHN0ZGlvIGZsYWdzID0gJHNpbV9zdGRpbyIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3N0ZGlvPSIiCitmaQorCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNpbS10cmFjZSBvciAtLWRpc2FibGUtc2ltLXRyYWNlIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NpbV90cmFjZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc2ltX3RyYWNlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3RyYWNlPSItRFRSQUNFPTEgLURXSVRIX1RSQUNFPS0xIjs7CisgIG5vKQlzaW1fdHJhY2U9Ii1EVFJBQ0U9MCAtRFdJVEhfVFJBQ0U9MCI7OworICBbLTAtOV0qKQorCXNpbV90cmFjZT0iLURUUkFDRT0nKCR7ZW5hYmxldmFsfSknIC1EV0lUSF9UUkFDRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fdHJhY2U9IiIKKwlmb3IgeCBpbiBgZWNobyAiJGVuYWJsZXZhbCIgfCBzZWQgLWUgInMvLC8gL2ciYDsgZG8KKwkgIGlmIHRlc3QgeCIkc2ltX3RyYWNlIiA9IHg7IHRoZW4KKwkgICAgc2ltX3RyYWNlPSItRFdJVEhfVFJBQ0U9JyhUUkFDRV8keCIKKwkgIGVsc2UKKwkgICAgc2ltX3RyYWNlPSIke3NpbV90cmFjZX18VFJBQ0VfJHgiCisJICBmaQorCWRvbmUKKwlzaW1fdHJhY2U9IiRzaW1fdHJhY2UpJyIgOzsKK2VzYWMKK2lmIHRlc3QgeCIkc2lsZW50IiAhPSB4InllcyIgJiYgdGVzdCB4IiRzaW1fdHJhY2UiICE9IHgiIjsgdGhlbgorICBlY2hvICJTZXR0aW5nIHNpbSB0cmFjZSA9ICRzaW1fdHJhY2UiIDY+JjEKK2ZpCitlbHNlCisgIHNpbV90cmFjZT0iIgorZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaW0tcHJvZmlsZSBvciAtLWRpc2FibGUtc2ltLXByb2ZpbGUgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2ltX3Byb2ZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSIkZW5hYmxlX3NpbV9wcm9maWxlIgorICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgIHllcykJc2ltX3Byb2ZpbGU9Ii1EUFJPRklMRT0xIC1EV0lUSF9QUk9GSUxFPS0xIjs7CisgIG5vKQlzaW1fcHJvZmlsZT0iLURQUk9GSUxFPTAgLURXSVRIX1BST0ZJTEU9MCI7OworICBbLTAtOV0qKQorCXNpbV9wcm9maWxlPSItRFBST0ZJTEU9Jygke2VuYWJsZXZhbH0pJyAtRFdJVEhfUFJPRklMRT0nKCR7ZW5hYmxldmFsfSknIjs7CisgIFthLXpdKikKKwlzaW1fcHJvZmlsZT0iIgorCWZvciB4IGluIGBlY2hvICIkZW5hYmxldmFsIiB8IHNlZCAtZSAicy8sLyAvZyJgOyBkbworCSAgaWYgdGVzdCB4IiRzaW1fcHJvZmlsZSIgPSB4OyB0aGVuCisJICAgIHNpbV9wcm9maWxlPSItRFdJVEhfUFJPRklMRT0nKFBST0ZJTEVfJHgiCisJICBlbHNlCisJICAgIHNpbV9wcm9maWxlPSIke3NpbV9wcm9maWxlfXxQUk9GSUxFXyR4IgorCSAgZmkKKwlkb25lCisJc2ltX3Byb2ZpbGU9IiRzaW1fcHJvZmlsZSknIiA7OworZXNhYworaWYgdGVzdCB4IiRzaWxlbnQiICE9IHgieWVzIiAmJiB0ZXN0IHgiJHNpbV9wcm9maWxlIiAhPSB4IiI7IHRoZW4KKyAgZWNobyAiU2V0dGluZyBzaW0gcHJvZmlsZSA9ICRzaW1fcHJvZmlsZSIgNj4mMQorZmkKK2Vsc2UKKyAgc2ltX3Byb2ZpbGU9IiIKK2ZpCisKKworCitlY2hvICRhY19uICJjaGVja2luZyByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMyODI6IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaWduYWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMjg3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBzaWduYWwKKyN1bmRlZiBzaWduYWwKKyNlbmRpZgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHZvaWQgKCpzaWduYWwgKGludCwgdm9pZCAoKikoaW50KSkpKGludCk7CisjZWxzZQordm9pZCAoKnNpZ25hbCAoKSkgKCk7CisjZW5kaWYKKworaW50IG1haW4oKSB7CitpbnQgaTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzA0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl90eXBlX3NpZ25hbD1pbnQKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaWduYWwiIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIFJFVFNJR1RZUEUgJGFjX2N2X3R5cGVfc2lnbmFsCitFT0YKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MzMyNDogY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0ICIkQ1lHV0lOMzIiID0geWVzOyB0aGVuCithbV9jdl9leGVleHQ9LmV4ZQorZWxzZQorY2F0ID4gYW1fY190ZXN0LmMgPDwgJ0VPRicKK2ludCBtYWluKCkgeworLyogTm90aGluZyBuZWVkZWQgaGVyZSAqLworfQorRU9GCiske0NDLWNjfSAtbyBhbV9jX3Rlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgYW1fY190ZXN0LmMgJExJQlMgMT4mNQorYW1fY3ZfZXhlZXh0PWBscyBhbV9jX3Rlc3QuKiB8IGdyZXAgLXYgYW1fY190ZXN0LmMgfCBzZWQgLWUgcy9hbV9jX3Rlc3QvL2AKK3JtIC1mIGFtX2NfdGVzdCoKK2ZpCisKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iID0geCAmJiBhbV9jdl9leGVleHQ9bm8KK2ZpCitFWEVFWFQ9IiIKK3Rlc3QgeCIke2FtX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthbV9jdl9leGVleHR9CitlY2hvICIkYWNfdCIiJHthbV9jdl9leGVleHR9IiAxPiY2CisKKworc2ltX2xpbmtfZmlsZXM9CitzaW1fbGlua19saW5rcz0KKworc2ltX2xpbmtfbGlua3M9dGNvbmZpZy5oCitpZiB0ZXN0IC1mICR7c3JjZGlyfS90Y29uZmlnLmluCit0aGVuCisgIHNpbV9saW5rX2ZpbGVzPXRjb25maWcuaW4KK2Vsc2UKKyAgc2ltX2xpbmtfZmlsZXM9Li4vY29tbW9uL3Rjb25maWcuaW4KK2ZpCisKKyMgdGFyZy12YWxzLmRlZiBwb2ludHMgdG8gdGhlIGxpYmMgbWFjcm8gZGVzY3JpcHRpb24gZmlsZS4KK2Nhc2UgIiR7dGFyZ2V0fSIgaW4KKyotKi0qKSBUQVJHX1ZBTFNfREVGPS4uL2NvbW1vbi9ubHR2YWxzLmRlZiA7OworZXNhYworc2ltX2xpbmtfZmlsZXM9IiR7c2ltX2xpbmtfZmlsZXN9ICR7VEFSR19WQUxTX0RFRn0iCitzaW1fbGlua19saW5rcz0iJHtzaW1fbGlua19saW5rc30gdGFyZy12YWxzLmRlZiIKKworCisKK2ZvciBhY19oZHIgaW4gc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oIHRpbWUuaCBzeXMvdGltZXMuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjMzNzI6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAzMzc3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzgyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKworCisKKwordHJhcCAnJyAxIDIgMTUKK2NhdCA+IGNvbmZjYWNoZSA8PFxFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgorIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAorIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCisjIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgorIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCisjIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgorIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCisjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworRU9GCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKyhzZXQpIDI+JjEgfAorICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjEgfCBncmVwIGFjX3NwYWNlYCBpbgorICAqYWNfc3BhY2U9XCAqKQorICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCisgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICBzZWQgLW4gXAorICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKKyAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKyAgICA7OworICAqKQorICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJworICAgIDs7CisgIGVzYWMgPj4gY29uZmNhY2hlCitpZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCisgIDoKK2Vsc2UKKyAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgorICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgorICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorICBlbHNlCisgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgIGZpCitmaQorcm0gLWYgY29uZmNhY2hlCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKK3Rlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKKyMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgordGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworCisjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKyMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCitpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCitmaQorCit0cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKKyMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgorOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorCitlY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCitybSAtZiAkQ09ORklHX1NUQVRVUworY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyMhIC9iaW4vc2gKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCisjIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIworIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKKyMKKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCithY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgorZm9yIGFjX29wdGlvbgorZG8KKyAgY2FzZSAiXCRhY19vcHRpb24iIGluCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKKyAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCisgICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMi4yIgorICAgIGV4aXQgMCA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKyAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7CisgICopIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDEgOzsKKyAgZXNhYworZG9uZQorCithY19naXZlbl9zcmNkaXI9JHNyY2RpcgorYWNfZ2l2ZW5fSU5TVEFMTD0iJElOU1RBTEwiCisKK3RyYXAgJ3JtIC1mciBgZWNobyAiTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQHNpbV9lbnZpcm9ubWVudEAlJHNpbV9lbnZpcm9ubWVudCVnCitzJUBzaW1fYWxpZ25tZW50QCUkc2ltX2FsaWdubWVudCVnCitzJUBzaW1fYXNzZXJ0QCUkc2ltX2Fzc2VydCVnCitzJUBzaW1fYml0c2l6ZUAlJHNpbV9iaXRzaXplJWcKK3MlQHNpbV9lbmRpYW5AJSRzaW1fZW5kaWFuJWcKK3MlQHNpbV9ob3N0ZW5kaWFuQCUkc2ltX2hvc3RlbmRpYW4lZworcyVAc2ltX2Zsb2F0QCUkc2ltX2Zsb2F0JWcKK3MlQHNpbV9zY2FjaGVAJSRzaW1fc2NhY2hlJWcKK3MlQHNpbV9kZWZhdWx0X21vZGVsQCUkc2ltX2RlZmF1bHRfbW9kZWwlZworcyVAc2ltX2h3X2NmbGFnc0AlJHNpbV9od19jZmxhZ3MlZworcyVAc2ltX2h3X29ianNAJSRzaW1faHdfb2JqcyVnCitzJUBzaW1faHdAJSRzaW1faHclZworcyVAc2ltX2lubGluZUAlJHNpbV9pbmxpbmUlZworcyVAc2ltX3BhY2thZ2VzQCUkc2ltX3BhY2thZ2VzJWcKK3MlQHNpbV9yZWdwYXJtQCUkc2ltX3JlZ3Bhcm0lZworcyVAc2ltX3Jlc2VydmVkX2JpdHNAJSRzaW1fcmVzZXJ2ZWRfYml0cyVnCitzJUBzaW1fc21wQCUkc2ltX3NtcCVnCitzJUBzaW1fc3RkY2FsbEAlJHNpbV9zdGRjYWxsJWcKK3MlQHNpbV94b3JfZW5kaWFuQCUkc2ltX3hvcl9lbmRpYW4lZworcyVAYnVpbGRfd2FybmluZ3NAJSRidWlsZF93YXJuaW5ncyVnCitzJUBTSEVMTEAlJFNIRUxMJWcKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBob3N0QCUkaG9zdCVnCitzJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCitzJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKK3MlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZworcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKK3MlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCitzJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCitzJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCitzJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZworcyVAYnVpbGRAJSRidWlsZCVnCitzJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKK3MlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCitzJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZworcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCitzJUBDQ0AlJENDJWcKK3MlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCitzJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZworcyVAQ0NfRk9SX0JVSUxEQCUkQ0NfRk9SX0JVSUxEJWcKK3MlQEhERUZJTkVTQCUkSERFRklORVMlZworcyVAQVJAJSRBUiVnCitzJUBSQU5MSUJAJSRSQU5MSUIlZworcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCitzJUBDUFBAJSRDUFAlZworcyVAQUxMT0NBQCUkQUxMT0NBJWcKK3MlQFVTRV9OTFNAJSRVU0VfTkxTJWcKK3MlQE1TR0ZNVEAlJE1TR0ZNVCVnCitzJUBHTVNHRk1UQCUkR01TR0ZNVCVnCitzJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKK3MlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZworcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCitzJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZworcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCitzJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKK3MlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKK3MlQElOVExERVBTQCUkSU5UTERFUFMlZworcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCitzJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKK3MlQFBPRklMRVNAJSRQT0ZJTEVTJWcKK3MlQFBPU1VCQCUkUE9TVUIlZworcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZworcyVAR1RfTk9AJSRHVF9OTyVnCitzJUBHVF9ZRVNAJSRHVF9ZRVMlZworcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZworcyVAbEAlJGwlZworcyVATUFJTlRAJSRNQUlOVCVnCitzJUBzaW1fYnN3YXBAJSRzaW1fYnN3YXAlZworcyVAc2ltX2NmbGFnc0AlJHNpbV9jZmxhZ3MlZworcyVAc2ltX2RlYnVnQCUkc2ltX2RlYnVnJWcKK3MlQHNpbV9zdGRpb0AlJHNpbV9zdGRpbyVnCitzJUBzaW1fdHJhY2VAJSRzaW1fdHJhY2UlZworcyVAc2ltX3Byb2ZpbGVAJSRzaW1fcHJvZmlsZSVnCitzJUBFWEVFWFRAJSRFWEVFWFQlZworCitDRU9GCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCithY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KK2FjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfbW9yZV9saW5lcz06CithY19zZWRfY21kcz0iIgord2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZmkKKyAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGVsc2UKKyAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGZpCisgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCisgICAgYWNfYmVnPSRhY19lbmQKKyAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgIGFjX3NlZF9jbWRzPWNhdAorZmkKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUuc2ltOk1ha2VmaWxlLmluIE1ha2UtY29tbW9uLnNpbTouLi9jb21tb24vTWFrZS1jb21tb24uaW4gLmdkYmluaXQ6Li4vY29tbW9uL2dkYmluaXQuaW4ifQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KKworICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCisgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKKyAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorICBmaQorCisgIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCisgIC4pICBzcmNkaXI9LgorICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgorICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7CisgIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICopICMgUmVsYXRpdmUgcGF0aC4KKyAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgorICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgZXNhYworCisgIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgorICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7CisgIGVzYWMKKworICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKKyAgcm0gLWYgIiRhY19maWxlIgorICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorIyAkY29uZmlndXJlX2lucHV0IiA7OworICAqKSBhY19jb21zdWI9IDs7CisgIGVzYWMKKworICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBzZWQgLWUgIiRhY19jb21zdWIKK3MlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCitzJUBzcmNkaXJAJSRzcmNkaXIlZworcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworcyVASU5TVEFMTEAlJElOU1RBTEwlZworIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQorZmk7IGRvbmUKK3JtIC1mIGNvbmZ0ZXN0LnMqCisKKyMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCisjIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCisjCisjIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCithY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKK2FjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJworYWNfZEM9J1wzJworYWNfZEQ9JyVnJworIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCithY191Qz0nICcKK2FjX3VEPSdcNCVnJworIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KK2FjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKK2FjX2VDPScgJworYWNfZUQ9JyVnJworCitpZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKK0VPRgorY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorZmkKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKyAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKyAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKyAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKKworICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAorICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAorICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KKworRU9GCisKKyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCisjIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCitybSAtZiBjb25mdGVzdC52YWxzCitjYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCitzL1tcXCYlXS9cXCYvZworcyVbXFwkYF0lXFwmJWcKK3MlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCitzJWFjX2QlYWNfdSVncAorcyVhY191JWFjX2UlZ3AKK0VPRgorc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscworcm0gLWYgY29uZnRlc3QuaGRyCisKKyMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKKyMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKyMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCitzJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQorRU9GCisKKyMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgorIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KKworcm0gLWYgY29uZnRlc3QudGFpbAord2hpbGUgOgorZG8KKyAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAorICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCisgIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKKyAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCisgIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCisgIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUworICBlY2hvICdDRU9GCisgIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0CisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgorJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKKyAgcm0gLWYgY29uZnRlc3QudmFscworICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKKyAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCisgIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCisgIHJtIC1mIGNvbmZ0ZXN0LmluCisgIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCisgICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgorICAgIHJtIC1mIGNvbmZ0ZXN0LmgKKyAgZWxzZQorICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgZmkKKyAgICBybSAtZiAkYWNfZmlsZQorICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKKyAgZmkKK2ZpOyBkb25lCisKK0VPRgorCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKK2FjX3NvdXJjZXM9IiRzaW1fbGlua19maWxlcyIKK2FjX2Rlc3RzPSIkc2ltX2xpbmtfbGlua3MiCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorc3JjZGlyPSRhY19naXZlbl9zcmNkaXIKK3doaWxlIHRlc3QgLW4gIiRhY19zb3VyY2VzIjsgZG8KKyAgc2V0ICRhY19kZXN0czsgYWNfZGVzdD0kMTsgc2hpZnQ7IGFjX2Rlc3RzPSQqCisgIHNldCAkYWNfc291cmNlczsgYWNfc291cmNlPSQxOyBzaGlmdDsgYWNfc291cmNlcz0kKgorCisgIGVjaG8gImxpbmtpbmcgJHNyY2Rpci8kYWNfc291cmNlIHRvICRhY19kZXN0IgorCisgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY19zb3VyY2U7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRzcmNkaXIvJGFjX3NvdXJjZTogRmlsZSBub3QgZm91bmQiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorICBybSAtZiAkYWNfZGVzdAorCisgICMgTWFrZSByZWxhdGl2ZSBzeW1saW5rcy4KKyAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCisgIGFjX2Rlc3RfZGlyPWBlY2hvICRhY19kZXN0fHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgaWYgdGVzdCAiJGFjX2Rlc3RfZGlyIiAhPSAiJGFjX2Rlc3QiICYmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gLjsgdGhlbgorICAgICMgVGhlIGRlc3QgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICB0ZXN0ICEgLWQgIiRhY19kZXN0X2RpciIgJiYgbWtkaXIgIiRhY19kZXN0X2RpciIKKyAgICBhY19kZXN0X2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGVzdF9kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rlc3RfZGlyX3N1ZmZpeC4KKyAgICBhY19kb3RzPWBlY2hvICRhY19kZXN0X2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCisgIGVsc2UKKyAgICBhY19kZXN0X2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJHNyY2RpciIgaW4KKyAgWy8kXSopIGFjX3JlbF9zb3VyY2U9IiRzcmNkaXIvJGFjX3NvdXJjZSIgOzsKKyAgKikgYWNfcmVsX3NvdXJjZT0iJGFjX2RvdHMkc3JjZGlyLyRhY19zb3VyY2UiIDs7CisgIGVzYWMKKworICAjIE1ha2UgYSBzeW1saW5rIGlmIHBvc3NpYmxlOyBvdGhlcndpc2UgdHJ5IGEgaGFyZCBsaW5rLgorICBpZiBsbiAtcyAkYWNfcmVsX3NvdXJjZSAkYWNfZGVzdCAyPi9kZXYvbnVsbCB8fAorICAgIGxuICRzcmNkaXIvJGFjX3NvdXJjZSAkYWNfZGVzdDsgdGhlbiA6CisgIGVsc2UKKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgbGluayAkYWNfZGVzdCB0byAkc3JjZGlyLyRhY19zb3VyY2UiIDE+JjI7IGV4aXQgMTsgfQorICBmaQorZG9uZQorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKworRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitjYXNlICJ4JENPTkZJR19GSUxFUyIgaW4KKyB4TWFrZWZpbGUqKQorICAgZWNobyAiTWVyZ2luZyBNYWtlZmlsZS5zaW0rTWFrZS1jb21tb24uc2ltIGludG8gTWFrZWZpbGUgLi4uIgorICAgcm0gLWYgTWFrZXNpbTEudG1wIE1ha2VzaW0yLnRtcCBNYWtlZmlsZQorICAgc2VkIC1uIC1lICcvXiMjIENPTU1PTl9QUkVfLywvXiMjIEVuZCBDT01NT05fUFJFXy8gcCcgPE1ha2UtY29tbW9uLnNpbSA+TWFrZXNpbTEudG1wCisgICBzZWQgLW4gLWUgJy9eIyMgQ09NTU9OX1BPU1RfLywvXiMjIEVuZCBDT01NT05fUE9TVF8vIHAnIDxNYWtlLWNvbW1vbi5zaW0gPk1ha2VzaW0yLnRtcAorICAgc2VkIC1lICcvXiMjIENPTU1PTl9QUkVfLyByIE1ha2VzaW0xLnRtcCcgXAorCS1lICcvXiMjIENPTU1PTl9QT1NUXy8gciBNYWtlc2ltMi50bXAnIFwKKwk8TWFrZWZpbGUuc2ltID5NYWtlZmlsZQorICAgcm0gLWYgTWFrZWZpbGUuc2ltIE1ha2UtY29tbW9uLnNpbSBNYWtlc2ltMS50bXAgTWFrZXNpbTIudG1wCisgICA7OworIGVzYWMKKyBjYXNlICJ4JENPTkZJR19IRUFERVJTIiBpbiB4Y29uZmlnLmg6Y29uZmlnLmluKSBlY2hvID4gc3RhbXAtaCA7OyBlc2FjCisKK2V4aXQgMAorRU9GCitjaG1vZCAreCAkQ09ORklHX1NUQVRVUworcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKK3Rlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQorCisKZGlmZiAtLWdpdCBhL3NpbS96OGsvY29uZmlndXJlLmluIGIvc2ltL3o4ay9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2ZmM3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS96OGsvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsMTAgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Lgorc2luY2x1ZGUoLi4vY29tbW9uL2FjbG9jYWwubTQpCitBQ19QUkVSRVEoMi41KWRubAorQUNfSU5JVChNYWtlZmlsZS5pbikKKworU0lNX0FDX0NPTU1PTgorCitBQ19DSEVDS19IRUFERVJTKHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaCB0aW1lLmggc3lzL3RpbWVzLmgpCisKK1NJTV9BQ19PVVRQVVQKZGlmZiAtLWdpdCBhL3NpbS96OGsvaWZhY2UuYyBiL3NpbS96OGsvaWZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjM4ODNlCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3o4ay9pZmFjZS5jCkBAIC0wLDAgKzEsMjYzIEBACisvKiBnZGItPnNpbXVsYXRvciBpbnRlcmZhY2UuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIFo4S1NJTQorCitaOEtTSU0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitaOEtTSU0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBaOEtaSU07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiYW5zaWRlY2wuaCIKKyNpbmNsdWRlICJzaW0uaCIKKyNpbmNsdWRlICJ0bS5oIgorI2luY2x1ZGUgInNpZ25hbC5oIgorI2luY2x1ZGUgImJmZC5oIgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAicmVtb3RlLXNpbS5oIgorCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAwCisjZW5kaWYKKworaG9zdF9jYWxsYmFjayAqejhrX2NhbGxiYWNrOworCitzdGF0aWMgU0lNX09QRU5fS0lORCBzaW1fa2luZDsKK3N0YXRpYyBjaGFyICpteW5hbWU7CisKK3ZvaWQKK3NpbV9zaXplIChuKQorICAgICBpbnQgbjsKK3sKKyAgLyogU2l6ZSBpcyBmaXhlZC4gICovCit9CisKK2ludAorc2ltX3N0b3JlX3JlZ2lzdGVyIChzZCwgcmVnbm8sIHZhbHVlLCBsZW5ndGgpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgcmVnbm87CisgICAgIHVuc2lnbmVkIGNoYXIgKnZhbHVlOworICAgICBpbnQgbGVuZ3RoOworeworICAvKiBGSVhNRTogUmV2aWV3IHRoZSBjb21wdXRhdGlvbiBvZiByZWd2YWwuICAqLworICBpbnQgcmVndmFsID0gKHZhbHVlWzBdIDw8IDI0KSB8ICh2YWx1ZVsxXSA8PCAxNikgfCAodmFsdWVbMl0gPDwgOCkgfCB2YWx1ZVszXTsKKworICB0bV9zdG9yZV9yZWdpc3RlciAocmVnbm8sIHJlZ3ZhbCk7CisgIHJldHVybiAtMTsKK30KKworaW50CitzaW1fZmV0Y2hfcmVnaXN0ZXIgKHNkLCByZWdubywgYnVmLCBsZW5ndGgpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBpbnQgcmVnbm87CisgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICAgaW50IGxlbmd0aDsKK3sKKyAgdG1fZmV0Y2hfcmVnaXN0ZXIgKHJlZ25vLCBidWYpOworICByZXR1cm4gLTE7Cit9CisKK2ludAorc2ltX3dyaXRlIChzZCwgd2hlcmUsIHdoYXQsIGhvd211Y2gpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBTSU1fQUREUiB3aGVyZTsKKyAgICAgdW5zaWduZWQgY2hhciAqd2hhdDsKKyAgICAgaW50IGhvd211Y2g7Cit7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBob3dtdWNoOyBpKyspCisgICAgdG1fd3JpdGVfYnl0ZSAod2hlcmUgKyBpLCB3aGF0W2ldKTsKKyAgcmV0dXJuIGhvd211Y2g7Cit9CisKK2ludAorc2ltX3JlYWQgKHNkLCB3aGVyZSwgd2hhdCwgaG93bXVjaCkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIFNJTV9BRERSIHdoZXJlOworICAgICB1bnNpZ25lZCBjaGFyICp3aGF0OworICAgICBpbnQgaG93bXVjaDsKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGhvd211Y2g7IGkrKykKKyAgICB3aGF0W2ldID0gdG1fcmVhZF9ieXRlICh3aGVyZSArIGkpOworICByZXR1cm4gaG93bXVjaDsKK30KKworc3RhdGljIHZvaWQgCitjb250cm9sX2MgKHNpZywgY29kZSwgc2NwLCBhZGRyKQorICAgICBpbnQgc2lnOworICAgICBpbnQgY29kZTsKKyAgICAgY2hhciAqc2NwOworICAgICBjaGFyICphZGRyOworeworICB0bV9leGNlcHRpb24gKFNJTV9JTlRFUlJVUFQpOworfQorCitpbnQKK3NpbV9zdG9wIChzZCkKKyAgICAgU0lNX0RFU0Mgc2Q7Cit7CisgIHRtX2V4Y2VwdGlvbiAoU0lNX0lOVEVSUlVQVCk7CisgIHJldHVybiAxOworfQorCit2b2lkCitzaW1fcmVzdW1lIChzZCwgc3RlcCwgc2lnKQorICAgICBTSU1fREVTQyBzZDsKKyAgICAgaW50IHN0ZXA7CisgICAgIGludCBzaWc7Cit7CisgIHZvaWQgKCpwcmV2KSAoKTsKKworICBwcmV2ID0gc2lnbmFsIChTSUdJTlQsIGNvbnRyb2xfYyk7CisgIHRtX3Jlc3VtZSAoc3RlcCk7CisgIHNpZ25hbCAoU0lHSU5ULCBwcmV2KTsKK30KKwordm9pZAorc2ltX3N0b3BfcmVhc29uIChzZCwgcmVhc29uLCBzaWdyYykKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGVudW0gc2ltX3N0b3AgKnJlYXNvbjsKKyAgICAgaW50ICpzaWdyYzsKK3sKKyAgc3dpdGNoICh0bV9zaWduYWwgKCkpCisgICAgeworICAgIGNhc2UgU0lNX0RJVl9aRVJPOgorICAgICAgKnNpZ3JjID0gU0lHRlBFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTSU1fSU5URVJSVVBUOgorICAgICAgKnNpZ3JjID0gU0lHSU5UOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTSU1fQkFEX0lOU1Q6CisgICAgICAqc2lncmMgPSBTSUdJTEw7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNJTV9CUkVBS1BPSU5UOgorICAgICAgKnNpZ3JjID0gU0lHVFJBUDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0lNX1NJTkdMRV9TVEVQOgorICAgICAgKnNpZ3JjID0gU0lHVFJBUDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0lNX0JBRF9TWVNDQUxMOgorICAgICAgKnNpZ3JjID0gU0lHSUxMOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTSU1fQkFEX0FMSUdOOgorICAgICAgKnNpZ3JjID0gU0lHU0VHVjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0lNX0RPTkU6CisgICAgICB7CisJc2ltX3N0YXRlX3R5cGUgeDsKKwl0bV9zdGF0ZSAoJngpOworCSpzaWdyYyA9IHgucmVnc1syXS53b3JkICYgMjU1OworCSpyZWFzb24gPSBzaW1fZXhpdGVkOworCXJldHVybjsKKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorICAqcmVhc29uID0gc2ltX3N0b3BwZWQ7Cit9CisKK3ZvaWQKK3NpbV9pbmZvIChzZCwgdmVyYm9zZSkKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCB2ZXJib3NlOworeworICBzaW1fc3RhdGVfdHlwZSB4OworCisgIHRtX3N0YXRlICgmeCk7CisgIHRtX2luZm9fcHJpbnQgKCZ4KTsKK30KKworU0lNX0RFU0MKK3NpbV9vcGVuIChraW5kLCBjYiwgYWJmZCwgYXJndikKKyAgICAgU0lNX09QRU5fS0lORCBraW5kOworICAgICBob3N0X2NhbGxiYWNrICpjYjsKKyAgICAgc3RydWN0IF9iZmQgKmFiZmQ7CisgICAgIGNoYXIgKiphcmd2OworeworICAvKiBGSVhNRTogVGhlIGNvZGUgaW4gc2ltX2xvYWQgdGhhdCBkZXRlcm1pbmVzIHRoZSBleGFjdCB6OGsgYXJjaAorICAgICBzaG91bGQgYmUgbW92ZWQgdG8gaGVyZSAqLworCisgIHNpbV9raW5kID0ga2luZDsKKyAgbXluYW1lID0gYXJndlswXTsKKyAgejhrX2NhbGxiYWNrID0gY2I7CisKKyAgLyogZnVkZ2Ugb3VyIGRlc2NyaXB0b3IgZm9yIG5vdyAqLworICByZXR1cm4gKFNJTV9ERVNDKSAxOworfQorCit2b2lkCitzaW1fY2xvc2UgKHNkLCBxdWl0dGluZykKKyAgICAgU0lNX0RFU0Mgc2Q7CisgICAgIGludCBxdWl0dGluZzsKK3sKKyAgLyogbm90aGluZyB0byBkbyAqLworfQorCitTSU1fUkMKK3NpbV9sb2FkIChzZCwgcHJvZywgYWJmZCwgZnJvbV90dHkpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBjaGFyICpwcm9nOworICAgICBiZmQgKmFiZmQ7CisgICAgIGludCBmcm9tX3R0eTsKK3sKKyAgZXh0ZXJuIGJmZCAqc2ltX2xvYWRfZmlsZSAoKTsgLyogPz8/IERvbid0IGtub3cgd2hlcmUgdGhpcyBzaG91bGQgbGl2ZS4gICovCisgIGJmZCAqcHJvZ19iZmQ7CisKKyAgLyogRklYTUU6IFRoZSBjb2RlIGRldGVybWluaW5nIHRoZSB0eXBlIG9mIHo5ayBwcm9jZXNzb3Igc2hvdWxkIGJlCisgICAgIG1vdmVkIGZyb20gaGVyZSB0byBzaW1fb3Blbi4gKi8KKworICBwcm9nX2JmZCA9IHNpbV9sb2FkX2ZpbGUgKHNkLCBteW5hbWUsIHo4a19jYWxsYmFjaywgcHJvZywgYWJmZCwKKwkJCSAgICBzaW1fa2luZCA9PSBTSU1fT1BFTl9ERUJVRywKKwkJCSAgICAwLCBzaW1fd3JpdGUpOworICBpZiAocHJvZ19iZmQgPT0gTlVMTCkKKyAgICByZXR1cm4gU0lNX1JDX0ZBSUw7CisgIGlmIChiZmRfZ2V0X21hY2ggKHByb2dfYmZkKSA9PSBiZmRfbWFjaF96ODAwMSkKKyAgICB7CisgICAgICBleHRlcm4gaW50IHNpbV96ODAwMV9tb2RlOworICAgICAgc2ltX3o4MDAxX21vZGUgPSAxOworICAgIH0KKyAgLyogQ2xvc2UgdGhlIGJmZCBpZiB3ZSBvcGVuZWQgaXQuICAqLworICBpZiAoYWJmZCA9PSBOVUxMKQorICAgIGJmZF9jbG9zZSAocHJvZ19iZmQpOworICByZXR1cm4gU0lNX1JDX09LOworfQorCitTSU1fUkMKK3NpbV9jcmVhdGVfaW5mZXJpb3IgKHNkLCBhYmZkLCBhcmd2LCBlbnYpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBzdHJ1Y3QgX2JmZCAqYWJmZDsKKyAgICAgY2hhciAqKmFyZ3Y7CisgICAgIGNoYXIgKiplbnY7Cit7CisgIGlmIChhYmZkICE9IE5VTEwpCisgICAgdG1fc3RvcmVfcmVnaXN0ZXIgKFJFR19QQywgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSk7CisgIGVsc2UKKyAgICB0bV9zdG9yZV9yZWdpc3RlciAoUkVHX1BDLCAwKTsKKyAgcmV0dXJuIFNJTV9SQ19PSzsKK30KKwordm9pZAorc2ltX2RvX2NvbW1hbmQgKHNkLCBjbWQpCisgICAgIFNJTV9ERVNDIHNkOworICAgICBjaGFyICpjbWQ7Cit7Cit9CisKK3ZvaWQKK3NpbV9zZXRfY2FsbGJhY2tzIChwdHIpCisgICAgIGhvc3RfY2FsbGJhY2sgKnB0cjsKK3sKKyAgejhrX2NhbGxiYWNrID0gcHRyOworfQpkaWZmIC0tZ2l0IGEvc2ltL3o4ay9pbmxpbmVzLmggYi9zaW0vejhrL2lubGluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmYyMDllCi0tLSAvZGV2L251bGwKKysrIGIvc2ltL3o4ay9pbmxpbmVzLmgKQEAgLTAsMCArMSw0ODYgQEAKKy8qIGlubGluZSBmdW5jdGlvbnMgZm9yIFo4S1NJTQorICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBaOEtTSU0KKworR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggWjhLWklNOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBJTkxJTkUKKyNkZWZpbmUgSU5MSU5FCisjZW5kaWYKKyNkZWZpbmUgVUdUIDB4MGIKKyNkZWZpbmUgVUxFIDB4MDMKKyNkZWZpbmUgVUxUIDB4MDcKKyNkZWZpbmUgVUdFIDB4MGYKKyNkZWZpbmUgU0xPVyAwCisjZGVmaW5lIFQgMHg4CisjZGVmaW5lIEYgMHgwCisjZGVmaW5lIExUIDB4MQorI2RlZmluZSBHVCAweGEKKyNkZWZpbmUgTEUgMHgyCisjZGVmaW5lIEVRIDB4NgorI2RlZmluZSBORSAweGUKKyNkZWZpbmUgR0UgMHg5CisKKyBzdGF0aWMgaW50IGlzX2NvbmRfdHJ1ZSBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgYykpOyAKKyBzdGF0aWMgdm9pZCBtYWtlZmxhZ3MgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IG1hc2spKTsgCisKK3N0YXRpYyBJTkxJTkUKK2xvbmcKK3NpdG9wdHIgKHNpKQorbG9uZyBzaTsKK3sKKyAgcmV0dXJuICgoc2kgJiAweGZmMDAwMDAwKSA+PiA4KSB8IChzaSAmIDB4ZmZmZik7Cit9CitzdGF0aWMgSU5MSU5FIGxvbmcKK3B0cnRvc2kgKHB0cikKK2xvbmcgcHRyOworeworICByZXR1cm4gKChwdHIgJiAweGZmMDAwMCkgPDwgOCkgfCAocHRyICYgMHhmZmZmKTsKK30KKworc3RhdGljIElOTElORQordm9pZCAKK3B1dF9sb25nX3JlZyAoY29udGV4dCwgcmVnLCB2YWwpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBpbnQgcmVnOworICAgICBpbnQgdmFsOworeworICBjb250ZXh0LT5yZWdzW3JlZ10ud29yZCA9IHZhbCA+PiAxNjsKKyAgY29udGV4dC0+cmVnc1tyZWcgKyAxXS53b3JkID0gdmFsOworfQorCitzdGF0aWMgSU5MSU5FCit2b2lkIAorcHV0X3F1YWRfcmVnIChjb250ZXh0LCByZWcsIHZhbDEsIHZhbDIpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBpbnQgcmVnOworICAgICBpbnQgdmFsMTsKKyAgICAgaW50IHZhbDI7Cit7CisgIGNvbnRleHQtPnJlZ3NbcmVnXS53b3JkID0gdmFsMiA+PiAxNjsKKyAgY29udGV4dC0+cmVnc1tyZWcgKyAxXS53b3JkID0gdmFsMjsKKyAgY29udGV4dC0+cmVnc1tyZWcgKyAyXS53b3JkID0gdmFsMSA+PiAxNjsKKyAgY29udGV4dC0+cmVnc1tyZWcgKyAzXS53b3JkID0gdmFsMTsKK30KKworc3RhdGljIElOTElORQordm9pZCAKK3B1dF93b3JkX3JlZyAoY29udGV4dCwgcmVnLCB2YWwpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBpbnQgcmVnOworICAgICBpbnQgdmFsOworeworICBjb250ZXh0LT5yZWdzW3JlZ10ud29yZCA9IHZhbDsKK30KKworc3RhdGljIElOTElORQorU0l0eXBlIGdldF9sb25nX3JlZyAoY29udGV4dCwgcmVnKQorICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKKyAgICAgaW50IHJlZzsKK3sKKyAgVVNJdHlwZSBsc3cgPSBjb250ZXh0LT5yZWdzW3JlZyArIDFdLndvcmQ7CisgIFVTSXR5cGUgbXN3ID0gY29udGV4dC0+cmVnc1tyZWddLndvcmQ7CisKKyAgcmV0dXJuIChtc3cgPDwgMTYpIHwgbHN3OworfQorCisjaWZkZWYgX19HTlVDX18KK3N0YXRpYyBJTkxJTkUKK3N0cnVjdCBVRElzdHJ1Y3QKK2dldF9xdWFkX3JlZyAoY29udGV4dCwgcmVnKQorICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKKyAgICAgaW50IHJlZzsKK3sKKyAgVURJdHlwZSByZXM7CisgIFVTSXR5cGUgbHN3ID0gZ2V0X2xvbmdfcmVnIChjb250ZXh0LCByZWcgKyAyKTsKKyAgVVNJdHlwZSBtc3cgPSBnZXRfbG9uZ19yZWcgKGNvbnRleHQsIHJlZyk7CisKKyAgcmVzLmxvdyA9IGxzdzsKKyAgcmVzLmhpZ2ggPSBtc3c7CisgIHJldHVybiByZXM7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgSU5MSU5FIHZvaWQKK3B1dF9ieXRlX21lbV9kYSAoY29udGV4dCwgYWRkciwgdmFsdWUpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBpbnQgYWRkcjsKKyAgICAgaW50IHZhbHVlOworeworICAoKHVuc2lnbmVkIGNoYXIgKikgKGNvbnRleHQtPm1lbW9yeSkpW2FkZHJdID0gdmFsdWU7Cit9CisKK3N0YXRpYyBJTkxJTkUKK3ZvaWQgCitwdXRfYnl0ZV9yZWcgKGNvbnRleHQsIHJlZywgdmFsKQorICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKKyAgICAgaW50IHJlZzsKKyAgICAgaW50IHZhbDsKK3sKKyAgaW50IG9sZCA9IGNvbnRleHQtPnJlZ3NbcmVnICYgMHg3XS53b3JkOworICBpZiAocmVnICYgMHg4KQorICAgIHsKKyAgICAgIG9sZCA9IG9sZCAmIDB4ZmYwMCB8ICh2YWwgJiAweGZmKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBvbGQgPSBvbGQgJiAweDAwZmYgfCAodmFsIDw8IDgpOworICAgIH0KKyAgY29udGV4dC0+cmVnc1tyZWcgJiAweDddLndvcmQgPSBvbGQ7ICAgICAgCit9CisKK3N0YXRpYyBJTkxJTkUKK2ludCAKK2dldF9ieXRlX3JlZyAoY29udGV4dCwgcmVnKQorICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKKyAgICAgaW50IHJlZzsKK3sKKyAgaWYgKHJlZyAmIDB4OCkKKyAgICByZXR1cm4gIGNvbnRleHQtPnJlZ3NbcmVnICYgMHg3XS53b3JkICYgMHhmZjsKKyAgZWxzZQorICAgIHJldHVybiAgKGNvbnRleHQtPnJlZ3NbcmVnICYgMHg3XS53b3JkID4+IDgpICYgMHhmZjsKK30KKworc3RhdGljIElOTElORQordm9pZCAKK3B1dF93b3JkX21lbV9kYSAoY29udGV4dCwgYWRkciwgdmFsdWUpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBpbnQgYWRkcjsKKyAgICAgaW50IHZhbHVlOworeworICBpZiAoYWRkciAmIDEpCisgICAgeworICAgICAgY29udGV4dC0+ZXhjZXB0aW9uID0gU0lNX0JBRF9BTElHTjsKKyAgICAgIGFkZHIgJj0gfjE7CisgICAgfQorICBwdXRfYnl0ZV9tZW1fZGEoY29udGV4dCwgYWRkciwgdmFsdWU+PjgpOworICBwdXRfYnl0ZV9tZW1fZGEoY29udGV4dCwgYWRkcisxLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBJTkxJTkUgdW5zaWduZWQgY2hhcgorZ2V0X2J5dGVfbWVtX2RhIChjb250ZXh0LCBhZGRyKQorICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKKyAgICAgaW50IGFkZHI7Cit7CisgIHJldHVybiAoKHVuc2lnbmVkIGNoYXIgKikgKGNvbnRleHQtPm1lbW9yeSkpW2FkZHJdOworfQorCisKKyNpZiAwCisjZGVmaW5lIGdldF93b3JkX21lbV9kYShjb250ZXh0LGFkZHIpXAorICooKHVuc2lnbmVkIHNob3J0KikoKGNoYXIqKSgoY29udGV4dCktPm1lbW9yeSkrKGFkZHIpKSkKKworI2Vsc2UKKyNkZWZpbmUgZ2V0X3dvcmRfbWVtX2RhKGNvbnRleHQsYWRkcikgKGdldF9ieXRlX21lbV9kYShjb250ZXh0LCBhZGRyKSA8PCA4KSB8IChnZXRfYnl0ZV9tZW1fZGEoY29udGV4dCxhZGRyKzEpKQorI2VuZGlmCisKKyNkZWZpbmUgZ2V0X3dvcmRfcmVnKGNvbnRleHQscmVnKSAoY29udGV4dCktPnJlZ3NbcmVnXS53b3JkCisKK3N0YXRpYyBJTkxJTkUKK1NJdHlwZQorZ2V0X2xvbmdfbWVtX2RhIChjb250ZXh0LCBhZGRyKQorICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKKyAgICAgaW50IGFkZHI7Cit7CisgIFVTSXR5cGUgbHN3ID0gZ2V0X3dvcmRfbWVtX2RhKGNvbnRleHQsYWRkcisyKTsKKyAgVVNJdHlwZSBtc3cgPSAgZ2V0X3dvcmRfbWVtX2RhKGNvbnRleHQsIGFkZHIpOworCisgIHJldHVybiAobXN3IDw8IDE2KSArIGxzdzsKK30KKworc3RhdGljIElOTElORQordm9pZCAKK3B1dF9sb25nX21lbV9kYSAoY29udGV4dCwgYWRkciwgdmFsdWUpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBpbnQgYWRkcjsKKyAgICAgaW50IHZhbHVlOworeworICBwdXRfd29yZF9tZW1fZGEoY29udGV4dCxhZGRyLCB2YWx1ZT4+MTYpOworICBwdXRfd29yZF9tZW1fZGEoY29udGV4dCxhZGRyKzIsIHZhbHVlKTsKK30KKworc3RhdGljIElOTElORQoraW50IAorZ2V0X3dvcmRfbWVtX2lyIChjb250ZXh0LCByZWcpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBpbnQgcmVnOworeworICByZXR1cm4gZ2V0X3dvcmRfbWVtX2RhIChjb250ZXh0LCBnZXRfd29yZF9yZWcgKGNvbnRleHQsIHJlZykpOworfQorCitzdGF0aWMgSU5MSU5FCit2b2lkIAorcHV0X3dvcmRfbWVtX2lyIChjb250ZXh0LCByZWcsIHZhbHVlKQorICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKKyAgICAgaW50IHJlZzsKKyAgICAgaW50IHZhbHVlOworeworCisgIHB1dF93b3JkX21lbV9kYSAoY29udGV4dCwgZ2V0X3dvcmRfcmVnIChjb250ZXh0LCByZWcpLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBJTkxJTkUKK2ludCAKK2dldF9ieXRlX21lbV9pciAoY29udGV4dCwgcmVnKQorICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKKyAgICAgaW50IHJlZzsKK3sKKyAgcmV0dXJuIGdldF9ieXRlX21lbV9kYSAoY29udGV4dCwgZ2V0X3dvcmRfcmVnIChjb250ZXh0LCByZWcpKTsKK30KKworc3RhdGljIElOTElORQordm9pZCAKK3B1dF9ieXRlX21lbV9pciAoY29udGV4dCwgcmVnLCB2YWx1ZSkKKyAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7CisgICAgIGludCByZWc7CisgICAgIGludCB2YWx1ZTsKK3sKKyAgcHV0X2J5dGVfbWVtX2RhIChjb250ZXh0LCBnZXRfd29yZF9yZWcgKGNvbnRleHQsIHJlZyksIHZhbHVlKTsKK30KKworc3RhdGljIElOTElORQoraW50IAorZ2V0X2xvbmdfbWVtX2lyIChjb250ZXh0LCByZWcpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBpbnQgcmVnOworeworICByZXR1cm4gZ2V0X2xvbmdfbWVtX2RhIChjb250ZXh0LCBnZXRfd29yZF9yZWcgKGNvbnRleHQsIHJlZykpOworfQorCitzdGF0aWMgSU5MSU5FCit2b2lkIAorcHV0X2xvbmdfbWVtX2lyIChjb250ZXh0LCByZWcsIHZhbHVlKQorICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKKyAgICAgaW50IHJlZzsKKyAgICAgaW50IHZhbHVlOworeworCisgIHB1dF9sb25nX21lbV9kYSAoY29udGV4dCwgZ2V0X3dvcmRfcmVnIChjb250ZXh0LCByZWcpLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBJTkxJTkUKK3ZvaWQgCitwdXRfbG9uZ19tZW1feCAoY29udGV4dCwgYmFzZSwgcmVnLCB2YWx1ZSkKKyAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7CisgICAgIGludCBiYXNlOworICAgICBpbnQgcmVnOworICAgICBpbnQgdmFsdWU7Cit7CisgIHB1dF9sb25nX21lbV9kYSAoY29udGV4dCwgZ2V0X3dvcmRfcmVnIChjb250ZXh0LCByZWcpICsgYmFzZSwgdmFsdWUpOworfQorCitzdGF0aWMgSU5MSU5FCit2b2lkIAorcHV0X3dvcmRfbWVtX3ggKGNvbnRleHQsIGJhc2UsIHJlZywgdmFsdWUpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBpbnQgYmFzZTsKKyAgICAgaW50IHJlZzsKKyAgICAgaW50IHZhbHVlOworeworICBwdXRfd29yZF9tZW1fZGEgKGNvbnRleHQsIGdldF93b3JkX3JlZyAoY29udGV4dCwgcmVnKSArIGJhc2UsIHZhbHVlKTsKK30KKworc3RhdGljIElOTElORQordm9pZCAKK3B1dF9ieXRlX21lbV94IChjb250ZXh0LCBiYXNlLCByZWcsIHZhbHVlKQorICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKKyAgICAgaW50IGJhc2U7CisgICAgIGludCByZWc7CisgICAgIGludCB2YWx1ZTsKK3sKKyAgcHV0X2J5dGVfbWVtX2RhIChjb250ZXh0LCBnZXRfd29yZF9yZWcgKGNvbnRleHQsIHJlZykgKyBiYXNlLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBJTkxJTkUKK2ludCAKK2dldF93b3JkX21lbV94IChjb250ZXh0LCBiYXNlLCByZWcpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBpbnQgYmFzZTsKKyAgICAgaW50IHJlZzsKK3sKKyAgcmV0dXJuIGdldF93b3JkX21lbV9kYSAoY29udGV4dCwgYmFzZSArIGdldF93b3JkX3JlZyAoY29udGV4dCwgcmVnKSk7Cit9CisKK3N0YXRpYyBJTkxJTkUKK2ludCAKK2dldF9ieXRlX21lbV94IChjb250ZXh0LCBiYXNlLCByZWcpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBpbnQgYmFzZTsKKyAgICAgaW50IHJlZzsKK3sKKyAgcmV0dXJuIGdldF9ieXRlX21lbV9kYSAoY29udGV4dCwgYmFzZSArIGdldF93b3JkX3JlZyAoY29udGV4dCwgcmVnKSk7Cit9CisKK3N0YXRpYyBJTkxJTkUKK2ludCAKK2dldF9sb25nX21lbV94IChjb250ZXh0LCBiYXNlLCByZWcpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBpbnQgYmFzZTsKKyAgICAgaW50IHJlZzsKK3sKKyAgcmV0dXJuIGdldF9sb25nX21lbV9kYSAoY29udGV4dCwgYmFzZSArIGdldF93b3JkX3JlZyAoY29udGV4dCwgcmVnKSk7Cit9CisKKworc3RhdGljCit2b2lkCittYWtlZmxhZ3MgKGNvbnRleHQsIG1hc2spCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBpbnQgbWFzazsKK3sKKworICBQU1dfWkVSTyA9IChjb250ZXh0LT5kc3QgJiBtYXNrKSA9PSAwOworICBQU1dfU0lHTiA9IChjb250ZXh0LT5kc3QgPj4gKGNvbnRleHQtPnNpemUgLSAxKSk7CisKKyAgaWYgKGNvbnRleHQtPmJyb2tlbl9mbGFncyA9PSBUU1RfRkxBR1MpCisgICAgeworICAgICAgZXh0ZXJuIGNoYXIgdGhlX3Bhcml0eVtdOworCisgICAgICBpZiAoY29udGV4dC0+c2l6ZSA9PSA4KQorCXsKKwkgIFBTV19PVkVSRkxPVyA9IHRoZV9wYXJpdHlbY29udGV4dC0+ZHN0ICYgMHhmZl07CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIE92ZXJmbG93IGlzIHNldCBpZiBib3RoIG9wZXJhbmRzIGhhdmUgdGhlIHNhbWUgc2lnbiBhbmQgdGhlCisgICAgICAgICByZXN1bHQgaXMgb2YgZGlmZmVyZW50IHNpZ24uCisKKyAgICAgICAgIFYgPSAgQT09QiAmJiBSIT1CICBqdW1waW5nIGxvZ2ljCisgICAgICAgICAofihBXkIpKSYoUl5CKQorICAgICAgICAgViA9ICAoQV5CKV4oUl5CKSAgIGJvb2xlYW4KKyAgICAgICAgICovCisKKyAgICAgIFBTV19PVkVSRkxPVyA9CisJKCgKKwkgICAofihjb250ZXh0LT5zcmNhIF4gY29udGV4dC0+c3JjYikKKwkgICAgJiAoY29udGV4dC0+c3JjYSBeIGNvbnRleHQtPmRzdCkpCisJICkgPj4gKGNvbnRleHQtPnNpemUgLSAxKQorCSk7CisKKyAgICAgIGlmIChjb250ZXh0LT5zaXplIDwgMzIpCisJeworCSAgUFNXX0NBUlJZID0gKChjb250ZXh0LT5kc3QgPj4gY29udGV4dC0+c2l6ZSkpICYgMTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogY2FycnkgaXMgc2V0IHdoZW4gdGhlIHJlc3VsdCBpcyBzbWFsbGVyIHRoYW4gYSBzb3VyY2UgKi8KKworCisJICBQU1dfQ0FSUlkgPSAgKHVuc2lnbmVkKSBjb250ZXh0LT5kc3QgPiAodW5zaWduZWQpIGNvbnRleHQtPnNyY2EgOworCisJfQorICAgIH0KKyAgY29udGV4dC0+YnJva2VuX2ZsYWdzID0gMDsKK30KKworCisvKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gY2FsY3VsYXRlIHRoZSBmbGFncy4gIFdlIGNhbgorICAgZWl0aGVyIGFsd2F5cyBjYWxjdWxhdGUgdGhlbSBhbmQgc28gdGhlIGNjIHdpbGwgYWx3YXlzCisgICBiZSBjb3JyZWN0LCBvciB3ZSBjYW4gb25seSBrZWVwIHRoZSBhcmd1bWVudHMgYXJvdW5kIGFuZAorICAgY2FsYyB0aGUgZmxhZ3Mgd2hlbiB0aGV5J3JlIGFjdHVhbGx5IGdvaW5nIHRvIGJlIHVzZWQuICovCisKKy8qIFJpZ2h0IG5vdyB3ZSBhbHdheXMgY2FsYyB0aGUgZmxhZ3MgLSBJIHRoaW5rIGl0IG1heSBiZSBmYXN0ZXIqLworCisKKyNkZWZpbmUgTk9STUFMX0ZMQUdTKGMscyxkLHNhLHNiLHN1YikgCVwKKyAgICBpZiAocyA9PSA4KSAgICAgICAgICAgICAgICBcCisgICAgICBub3JtYWxfZmxhZ3NfOChjLGQsc2Esc2Isc3ViKTsgXAorICAgIGVsc2UgaWYgKHMgPT0gMTYpICAgICAgICAgICAgICAgIFwKKyAgICAgIG5vcm1hbF9mbGFnc18xNihjLGQsc2Esc2Isc3ViKTsgXAorICAgIGVsc2UgaWYgKHMgPT0gMzIpICAgICAgICAgICAgICAgIFwKKyAgICAgIG5vcm1hbF9mbGFnc18zMihjLGQsc2Esc2Isc3ViKTsgCisKK3N0YXRpYyBJTkxJTkUKK3ZvaWQgCitub3JtYWxfZmxhZ3MgKGNvbnRleHQsIHNpemUsIGRzdCwgc3JjYSwgc3JjYikKKyAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7CisgICAgIGludCBzaXplOworICAgICBpbnQgZHN0OworICAgICBpbnQgc3JjYTsKKyAgICAgaW50IHNyY2I7Cit7CisgIGNvbnRleHQtPnNyY2EgPSBzcmNhOworICBjb250ZXh0LT5zcmNiID0gc3JjYjsKKyAgY29udGV4dC0+ZHN0ID0gZHN0OworICBjb250ZXh0LT5zaXplID0gc2l6ZTsKKyAgY29udGV4dC0+YnJva2VuX2ZsYWdzID0gQ01QX0ZMQUdTOworfQorCitzdGF0aWMgSU5MSU5FCit2b2lkIAorVEVTVF9OT1JNQUxfRkxBR1MgKGNvbnRleHQsIHNpemUsIGRzdCkKKyAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7CisgICAgIGludCBzaXplOworICAgICBpbnQgZHN0OworeworICBjb250ZXh0LT5kc3QgPSBkc3Q7CisgIGNvbnRleHQtPnNpemUgPSBzaXplOworICBjb250ZXh0LT5icm9rZW5fZmxhZ3MgPSBUU1RfRkxBR1M7Cit9CisKK3N0YXRpYyBJTkxJTkUKK3ZvaWQgCitwdXRfcHRyX2xvbmdfcmVnIChjb250ZXh0LCByZWcsIHZhbCkKKyAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7CisgICAgIGludCByZWc7CisgICAgIGludCB2YWw7Cit7CisgIGNvbnRleHQtPnJlZ3NbcmVnXS53b3JkID0gKHZhbCA+PiA4KSAmIDB4N2YwMDsKKyAgY29udGV4dC0+cmVnc1tyZWcgKyAxXS53b3JkID0gdmFsOworfQorCitzdGF0aWMgSU5MSU5FCitsb25nIAorZ2V0X3B0cl9sb25nX3JlZyAoY29udGV4dCwgcmVnKQorICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKKyAgICAgaW50IHJlZzsKK3sKKyAgaW50IHZhbDsKKworICB2YWwgPSAoY29udGV4dC0+cmVnc1tyZWddLndvcmQgPDwgOCkgfCBjb250ZXh0LT5yZWdzW3JlZyArIDFdLndvcmQ7CisgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBJTkxJTkUKK2xvbmcgCitnZXRfcHRyX2xvbmdfbWVtX2lyIChjb250ZXh0LCByZWcpCitzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKK2ludCByZWc7Cit7CisgIHJldHVybiBzaXRvcHRyIChnZXRfbG9uZ19tZW1fZGEgKGNvbnRleHQsIGdldF9wdHJfbG9uZ19yZWcgKGNvbnRleHQsIHJlZykpKTsKK30KKworc3RhdGljIElOTElORQorbG9uZyAKK2dldF9wdHJfbG9uZ19tZW1fZGEgKGNvbnRleHQsIGFkZHIpCitzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKK2xvbmcgYWRkcjsgCit7CisgIHJldHVybiBzaXRvcHRyIChnZXRfbG9uZ19tZW1fZGEgKGNvbnRleHQsIGFkZHIpKTsKK30KKworc3RhdGljIElOTElORQordm9pZCAKK3B1dF9wdHJfbG9uZ19tZW1fZGEgKGNvbnRleHQsIGFkZHIsIHB0cikKK3NpbV9zdGF0ZV90eXBlICpjb250ZXh0OworbG9uZyBhZGRyOyAKK2xvbmcgcHRyOworeworICBwdXRfbG9uZ19tZW1fZGEgKGNvbnRleHQsIGFkZHIsIHB0cnRvc2kgKHB0cikpOworCit9CmRpZmYgLS1naXQgYS9zaW0vejhrL2xpc3QuYyBiL3NpbS96OGsvbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZGU3NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vejhrL2xpc3QuYwpAQCAtMCwwICsxLDExMjY2IEBACitzaG9ydCBpbnQgejhrX2ludl9saXN0W10gPSB7CisKKzEwCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMCwxMCwxMCwxMCwxMCwxMCwxMCwxMCwxMCwxMCwxMCwxMCwxMCwxMCwxMCwKKzcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCis3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAorNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKKzcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDY0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKKzcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCis3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAorNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKKzcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEyOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCis3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAorNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKKzcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCis3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxOTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAorNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKKzcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCis3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAorNQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjU2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSwKKzIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsCisyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLAorMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwKKzIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMyMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsCisyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLAorMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwKKzIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsCisyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLAorMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwKKzIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsCisyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLAorMgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDQ4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwKKzIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsCisyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLAorMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwKKzM3MAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTEyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNzAsMzcwLDM3MCwzNzAsMzcwLDM3MCwzNzAsMzcwLDM3MCwzNzAsMzcwLDM3MCwzNzAsMzcwLDM3MCwKKzM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywKKzM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywKKzM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywKKzM2NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTc2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywKKzM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywKKzM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywKKzM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywKKzM2NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjQwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywKKzM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywKKzM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywKKzM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywKKzM2NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NzA0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywKKzM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywKKzM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywKKzM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywzNjcsMzY3LDM2NywKKzM2NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NzY4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNjUsMzY1LDM2NSwzNjUsMzY1LDM2NSwzNjUsMzY1LDM2NSwzNjUsMzY1LDM2NSwzNjUsMzY1LDM2NSwKKzM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwKKzM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwKKzM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwKKzM2MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0ODMyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwKKzM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwKKzM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwKKzM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwKKzM2MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0ODk2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwKKzM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwKKzM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwKKzM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwKKzM2MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0OTYwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwKKzM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwKKzM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwKKzM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwzNjIsMzYyLDM2MiwKKzI2MAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTAyNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjYwLDI2MCwyNjAsMjYwLDI2MCwyNjAsMjYwLDI2MCwyNjAsMjYwLDI2MCwyNjAsMjYwLDI2MCwyNjAsCisyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsCisyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsCisyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsCisyNTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEwODhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LAorMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LAorMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LAorMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LAorMjU3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMTUyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywKKzI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywKKzI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywKKzI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywKKzI1NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTIxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsCisyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsCisyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsCisyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsMjU3LDI1NywyNTcsCisyNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEyODBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLAorMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLAorMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLAorMjUyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMzQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwKKzI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwKKzI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwKKzI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwKKzI1MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTQwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsCisyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsCisyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsCisyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsCisyNTIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE0NzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLAorMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLAorMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLAorMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLAorMjUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE1MzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI1LDI1LDI1LDI1LDI1LDI1LDI1LDI1LDI1LDI1LDI1LDI1LDI1LDI1LDI1LAorMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsCisyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwKKzIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLAorMjIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE2MDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLAorMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsCisyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwKKzIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLAorMjIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE2NjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLAorMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsCisyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwKKzIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLAorMjIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE3MjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLAorMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsMjIsCisyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwyMiwKKzIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLDIyLAorMjAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE3OTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLDIwLAorMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsCisxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywKKzE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LAorMTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE4NTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LAorMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsCisxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywKKzE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LAorMTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE5MjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LAorMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsCisxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywKKzE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LAorMTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE5ODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LAorMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsMTcsCisxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywxNywKKzE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LDE3LAorNDE1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMDQ4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MTUsNDE1LDQxNSw0MTUsNDE1LDQxNSw0MTUsNDE1LDQxNSw0MTUsNDE1LDQxNSw0MTUsNDE1LDQxNSwKKzQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiwKKzQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiwKKzQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiwKKzQxMgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjExMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsCis0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsCis0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsCis0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsCis0MTIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIxNzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLAorNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLAorNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLAorNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLAorNDEyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMjQwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiwKKzQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiwKKzQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiwKKzQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiw0MTIsNDEyLDQxMiwKKzQxMAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjMwNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEwLDQxMCw0MTAsNDEwLDQxMCw0MTAsNDEwLDQxMCw0MTAsNDEwLDQxMCw0MTAsNDEwLDQxMCw0MTAsCis0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsCis0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsCis0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsCis0MDcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIzNjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LAorNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LAorNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LAorNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LAorNDA3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNDMyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNywKKzQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNywKKzQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNywKKzQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNywKKzQwNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjQ5NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsCis0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsCis0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsCis0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsNDA3LDQwNyw0MDcsCis3MworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjU2MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNzMsNzMsNzMsNzMsNzMsNzMsNzMsNzMsNzMsNzMsNzMsNzMsNzMsNzMsNzMsCis3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCwKKzcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLAorNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsCis3MAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjYyNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsCis3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCwKKzcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLAorNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsCis3MAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjY4OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsCis3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCwKKzcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLAorNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsCis3MAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mjc1MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsCis3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCw3MCwKKzcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLDcwLAorNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsNzAsCis2NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjgxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNjUsNjUsNjUsNjUsNjUsNjUsNjUsNjUsNjUsNjUsNjUsNjUsNjUsNjUsNjUsCis2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2MiwKKzYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLAorNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsCis2MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mjg4MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsCis2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2MiwKKzYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLAorNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsCis2MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mjk0NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsCis2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2MiwKKzYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLAorNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsCis2MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzAwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsCis2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2Miw2MiwKKzYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLDYyLAorNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsNjIsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzA3MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1NCw2NywyNDcsLTEsMzgzLDE3Niw0MDMsLTEsNDYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1NCw2NywyNDcsLTEsMzgzLDE3Niw0MDMsLTEsNDYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1NCw2NywyNDcsLTEsMzgzLDE3Niw0MDMsLTEsNDYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1NAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzEzNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNjcsMjQ3LC0xLDM4MywxNzYsNDAzLC0xLDQ2LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTQsNjcsMjQ3LC0xLDM4MywxNzYsNDAzLC0xLDQ2LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTQsNjcsMjQ3LC0xLDM4MywxNzYsNDAzLC0xLDQ2LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTQsNjcsMjQ3LC0xLDM4MywxNzYsNDAzLC0xLDQ2LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMyMDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzY3LDI0NywtMSwzODMsMTc2LDQwMywtMSw0NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzU0LDY3LDI0NywtMSwzODMsMTc2LDQwMywtMSw0NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzU0LDY3LDI0NywtMSwzODMsMTc2LDQwMywtMSw0NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzU0LDY3LDI0NywtMSwzODMsMTc2LDQwMywtMSw0NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzU0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMjY0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis2NywyNDcsLTEsMzgzLDE3Niw0MDMsLTEsNDYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1NCw2NywyNDcsLTEsMzgzLDE3Niw0MDMsLTEsNDYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1NCw2NywyNDcsLTEsMzgzLDE3Niw0MDMsLTEsNDYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1NCw2NywyNDcsLTEsMzgzLDE3Niw0MDMsLTEsNDYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzMyOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1MCw1OSwyNDMsLTEsMzc5LDE1NiwzOTksLTEsNDIsMjgyLC0xLC0xLC0xLC0xLC0xLC0xLAorNTAsNTksMjQzLC0xLDM3OSwxNTYsMzk5LC0xLDQyLDI4MiwtMSwtMSwtMSwtMSwtMSwtMSwKKzUwLDU5LDI0MywtMSwzNzksMTU2LDM5OSwtMSw0MiwyODIsLTEsLTEsLTEsLTEsLTEsLTEsCis1MAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzM5MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNTksMjQzLC0xLDM3OSwxNTYsMzk5LC0xLDQyLDI4MiwtMSwtMSwtMSwtMSwtMSwtMSwKKzUwLDU5LDI0MywtMSwzNzksMTU2LDM5OSwtMSw0MiwyODIsLTEsLTEsLTEsLTEsLTEsLTEsCis1MCw1OSwyNDMsLTEsMzc5LDE1NiwzOTksLTEsNDIsMjgyLC0xLC0xLC0xLC0xLC0xLC0xLAorNTAsNTksMjQzLC0xLDM3OSwxNTYsMzk5LC0xLDQyLDI4MiwtMSwtMSwtMSwtMSwtMSwtMSwKKzUwCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNDU2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis1OSwyNDMsLTEsMzc5LDE1NiwzOTksLTEsNDIsMjgyLC0xLC0xLC0xLC0xLC0xLC0xLAorNTAsNTksMjQzLC0xLDM3OSwxNTYsMzk5LC0xLDQyLDI4MiwtMSwtMSwtMSwtMSwtMSwtMSwKKzUwLDU5LDI0MywtMSwzNzksMTU2LDM5OSwtMSw0MiwyODIsLTEsLTEsLTEsLTEsLTEsLTEsCis1MCw1OSwyNDMsLTEsMzc5LDE1NiwzOTksLTEsNDIsMjgyLC0xLC0xLC0xLC0xLC0xLC0xLAorNTAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM1MjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzU5LDI0MywtMSwzNzksMTU2LDM5OSwtMSw0MiwyODIsLTEsLTEsLTEsLTEsLTEsLTEsCis1MCw1OSwyNDMsLTEsMzc5LDE1NiwzOTksLTEsNDIsMjgyLC0xLC0xLC0xLC0xLC0xLC0xLAorNTAsNTksMjQzLC0xLDM3OSwxNTYsMzk5LC0xLDQyLDI4MiwtMSwtMSwtMSwtMSwtMSwtMSwKKzUwLDU5LDI0MywtMSwzNzksMTU2LDM5OSwtMSw0MiwyODIsLTEsLTEsLTEsLTEsLTEsLTEsCisxMjcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM1ODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LAorMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LAorMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LAorMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LAorMTI3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNjQ4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywKKzEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywKKzEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywKKzEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywKKzEyNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzcxMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsCisxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsCisxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsCisxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsCisxMjcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM3NzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LAorMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LAorMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LAorMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LDEyNywxMjcsMTI3LAorMTI4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzODQwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwKKzEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwKKzEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwKKzEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwKKzEyOAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzkwNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsCisxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsCisxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsCisxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsCisxMjgKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM5NjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LAorMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LAorMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LAorMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LAorMTI4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MDMyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwKKzEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwKKzEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwKKzEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwxMjgsMTI4LDEyOCwKKzg2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MDk2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis4Niw4Niw4Niw4Niw4Niw4Niw4Niw4Niw4Niw4Niw4Niw4Niw4Niw4Niw4NiwKKzgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLAorODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsCis4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4MywKKzgzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MTYwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4MywKKzgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLAorODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsCis4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4MywKKzgzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MjI0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4MywKKzgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLAorODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsCis4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4MywKKzgzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0Mjg4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4MywKKzgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLDgzLAorODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsODMsCis4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4Myw4MywKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MzUyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LAorLTEsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsCistMSwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NDE2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwKKy0xLDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LAorLTEsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsCistMSwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NDgwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwKKy0xLDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LAorLTEsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsCistMSwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NTQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwKKy0xLDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LAorLTEsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsCistMSwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwyODQsMjg0LDI4NCwKKzM3NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDYwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzc1LDM3NSwzNzUsMzc1LDM3NSwzNzUsMzc1LDM3NSwzNzUsMzc1LDM3NSwzNzUsMzc1LDM3NSwzNzUsCiszNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsCiszNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsCiszNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsCiszNzIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ2NzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLAorMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLAorMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLAorMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLAorMzcyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NzM2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwKKzM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwKKzM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwKKzM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwKKzM3MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDgwMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsCiszNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsCiszNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsCiszNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsMzcyLDM3MiwzNzIsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDg2NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwKKy0xLDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LAorLTEsMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDkyOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksCistMSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwKKy0xLDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LAorLTEsMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDk5MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksCistMSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwKKy0xLDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LAorLTEsMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTA1NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksCistMSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwKKy0xLDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LAorLTEsMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksMjc5LDI3OSwyNzksCisyMTAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUxMjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIxMCwyMTAsMjEwLDIxMCwyMTAsMjEwLDIxMCwyMTAsMjEwLDIxMCwyMTAsMjEwLDIxMCwyMTAsMjEwLAorMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LAorMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LAorMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LAorMjA3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MTg0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywKKzIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywKKzIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywKKzIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywKKzIwNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTI0OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsCisyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsCisyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsCisyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsCisyMDcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUzMTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LAorMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LAorMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LAorMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LDIwNywyMDcsMjA3LAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUzNzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsCistMSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwKKy0xLDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU0NDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LAorLTEsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsCistMSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwKKy0xLDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU1MDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LAorLTEsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsCistMSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwKKy0xLDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU1NjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LAorLTEsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsCistMSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwKKy0xLDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LDI3NSwyNzUsMjc1LAorMTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU2MzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1LAorMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsCisxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwKKzEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLAorMTIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU2OTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLAorMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsCisxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwKKzEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLAorMTIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU3NjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLAorMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsCisxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwKKzEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLAorMTIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU4MjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLAorMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsCisxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwxMiwKKzEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU4ODhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsCistMSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwKKy0xLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU5NTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLAorLTEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsCistMSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwKKy0xLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYwMTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLAorLTEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsCistMSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwKKy0xLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYwODBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLAorLTEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsCistMSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwKKy0xLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLDI3MSwyNzEsMjcxLAorMjQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MTQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNDEsMjQxLDI0MSwyNDEsMjQxLDI0MSwyNDEsMjQxLDI0MSwyNDEsMjQxLDI0MSwyNDEsMjQxLDI0MSwKKzIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwKKzIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwKKzIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwKKzIzOAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjIwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsCisyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsCisyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsCisyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsCisyMzgKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYyNzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LAorMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LAorMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LAorMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LAorMjM4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MzM2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwKKzIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwKKzIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwKKzIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwyMzgsMjM4LDIzOCwKKzIzNgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjQwMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjM2LDIzNiwyMzYsMjM2LDIzNiwyMzYsMjM2LDIzNiwyMzYsMjM2LDIzNiwyMzYsMjM2LDIzNiwyMzYsCisyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsCisyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsCisyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsCisyMzMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDY0NjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLAorMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLAorMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLAorMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLAorMjMzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2NTI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywKKzIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywKKzIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywKKzIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywKKzIzMworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjU5MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsCisyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsCisyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsCisyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsMjMzLDIzMywyMzMsCisxMTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDY2NTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNSwxMTUsMTE1LDExNSwxMTUsMTE1LDExNSwxMTUsMTE1LDExNSwxMTUsMTE1LDExNSwxMTUsMTE1LAorMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLAorMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLAorMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLAorMTEyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2NzIwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwKKzExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwKKzExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwKKzExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwKKzExMgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Njc4NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsCisxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsCisxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsCisxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsCisxMTIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDY4NDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLAorMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLAorMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLAorMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLDExMiwxMTIsMTEyLAorMTEwCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2OTEyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMTAsMTEwLDExMCwxMTAsMTEwLDExMCwxMTAsMTEwLDExMCwxMTAsMTEwLDExMCwxMTAsMTEwLDExMCwKKzEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywKKzEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywKKzEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywKKzEwNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Njk3NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsCisxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsCisxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsCisxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsCisxMDcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDcwNDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LAorMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LAorMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LAorMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LAorMTA3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q3MTA0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywKKzEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywKKzEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywKKzEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywxMDcsMTA3LDEwNywKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q3MTY4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLDIxNywtMSwtMSwtMSwtMSwtMSwtMSwzODcsMjE0LC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsMjE3LC0xLC0xLC0xLC0xLC0xLC0xLDM4NywyMTQsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwyMTcsLTEsLTEsLTEsLTEsLTEsLTEsMzg3LDIxNCwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q3MjMyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMTcsLTEsLTEsLTEsLTEsLTEsLTEsMzg3LDIxNCwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLDIxNywtMSwtMSwtMSwtMSwtMSwtMSwzODcsMjE0LC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsMjE3LC0xLC0xLC0xLC0xLC0xLC0xLDM4NywyMTQsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwyMTcsLTEsLTEsLTEsLTEsLTEsLTEsMzg3LDIxNCwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q3Mjk2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMTcsLTEsLTEsLTEsLTEsLTEsLTEsMzg3LDIxNCwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLDIxNywtMSwtMSwtMSwtMSwtMSwtMSwzODcsMjE0LC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsMjE3LC0xLC0xLC0xLC0xLC0xLC0xLDM4NywyMTQsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwyMTcsLTEsLTEsLTEsLTEsLTEsLTEsMzg3LDIxNCwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q3MzYwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMTcsLTEsLTEsLTEsLTEsLTEsLTEsMzg3LDIxNCwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLDIxNywtMSwtMSwtMSwtMSwtMSwtMSwzODcsMjE0LC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsMjE3LC0xLC0xLC0xLC0xLC0xLC0xLDM4NywyMTQsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwyMTcsLTEsLTEsLTEsLTEsLTEsLTEsMzg3LDIxNCwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q3NDI0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwKKzIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwKKzIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwKKzIwMgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NzQ4OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsCisyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsCisyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsCisyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsCisyMDIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDc1NTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLAorMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLAorMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLAorMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLAorMjAyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q3NjE2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwKKzIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwKKzIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwKKzIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwyMDIsMjAyLDIwMiwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q3NjgwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwKKzE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwKKzE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwKKzE1MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Nzc0NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsCisxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsCisxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsCisxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsCisxNTIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDc4MDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLAorMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLAorMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLAorMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLAorMTUyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q3ODcyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwKKzE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwKKzE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwKKzE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwxNTIsMTUyLDE1MiwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q3OTM2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzM4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMzgsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCiszOCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzM4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q4MDAwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzM4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMzgsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCiszOCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzM4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q4MDY0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzM4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMzgsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCiszOCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzM4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q4MTI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzM4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMzgsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCiszOCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q4MTkyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwKKzE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwKKzE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwKKzE4MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0ODI1NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsCisxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsCisxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsCisxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsCisxODIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDgzMjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLAorMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLAorMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLAorMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLAorMTgyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q4Mzg0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwKKzE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwKKzE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwKKzE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwxODIsMTgyLDE4MiwKKzE2NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0ODQ0OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTY3LDE2NywxNjcsMTY3LDE2NywxNjcsMTY3LDE2NywxNjcsMTY3LDE2NywxNjcsMTY3LDE2NywxNjcsCisxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsCisxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsCisxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsCisxNjQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDg1MTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LAorMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LAorMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LAorMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LAorMTY0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q4NTc2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwKKzE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwKKzE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwKKzE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwKKzE2NAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0ODY0MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsCisxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsCisxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsCisxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsMTY0LDE2NCwxNjQsCisyOTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDg3MDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI5NywyOTcsMjk3LDI5NywyOTcsMjk3LDI5NywyOTcsMjk3LDI5NywyOTcsMjk3LDI5NywyOTcsMjk3LAorMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLAorMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLAorMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLAorMjkzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q4NzY4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywKKzI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywKKzI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywKKzI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywKKzI5MworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0ODgzMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsCisyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsCisyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsCisyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsCisyOTMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDg4OTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLAorMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLAorMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLAorMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLDI5MywyOTMsMjkzLAorMjkyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q4OTYwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyOTIsMjkyLDI5MiwyOTIsMjkyLDI5MiwyOTIsMjkyLDI5MiwyOTIsMjkyLDI5MiwyOTIsMjkyLDI5MiwKKzI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwKKzI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwKKzI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwKKzI4OAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0OTAyNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsCisyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsCisyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsCisyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsCisyODgKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDkwODhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LAorMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LAorMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LAorMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LAorMjg4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q5MTUyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwKKzI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwKKzI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwKKzI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwyODgsMjg4LDI4OCwKKzMzNgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0OTIxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzM2LDMzNiwzMzYsMzM2LDMzNiwzMzYsMzM2LDMzNiwzMzYsMzM2LDMzNiwzMzYsMzM2LDMzNiwzMzYsCiszMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsCiszMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsCiszMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsCiszMzIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDkyODBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLAorMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLAorMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLAorMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLAorMzMyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q5MzQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwKKzMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwKKzMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwKKzMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwKKzMzMgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0OTQwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsCiszMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsCiszMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsCiszMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsMzMyLDMzMiwzMzIsCiszMzEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDk0NzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMzMSwzMzEsMzMxLDMzMSwzMzEsMzMxLDMzMSwzMzEsMzMxLDMzMSwzMzEsMzMxLDMzMSwzMzEsMzMxLAorMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LAorMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LAorMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LAorMzI3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q5NTM2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywKKzMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywKKzMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywKKzMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywKKzMyNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0OTYwMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsCiszMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsCiszMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsCiszMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsCiszMjcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDk2NjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LAorMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LAorMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LAorMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LDMyNywzMjcsMzI3LAorMzYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDk3MjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM2LDM2LDM2LDM2LDM2LDM2LDM2LDM2LDM2LDM2LDM2LDM2LDM2LDM2LDM2LAorMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCiszMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKzMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorMzIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDk3OTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCiszMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKzMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorMzIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDk4NTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCiszMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKzMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorMzIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDk5MjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCiszMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKzMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorMzEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDk5ODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMxLDMxLDMxLDMxLDMxLDMxLDMxLDMxLDMxLDMxLDMxLDMxLDMxLDMxLDMxLAorMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsCisyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywKKzI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LAorMjcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEwMDQ4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywKKzI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LAorMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsCisyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywKKzI3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMDExMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsCisyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywKKzI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LAorMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsCisyNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTAxNzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LAorMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsMjcsCisyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywyNywKKzI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LDI3LAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEwMjQwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywKKzE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywKKzE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywKKzE0MworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTAzMDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLAorMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLAorMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLAorMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLAorMTQzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMDM2OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsCisxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsCisxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsCisxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsCisxNDMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEwNDMyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywKKzE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywKKzE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywKKzE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywxNDMsMTQzLDE0MywKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMDQ5NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksCisxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksCisxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksCisxMzkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEwNTYwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwKKzEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwKKzEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwKKzEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwKKzEzOQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTA2MjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LAorMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LAorMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LAorMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LAorMTM5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMDY4OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksCisxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksCisxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksCisxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksMTM5LDEzOSwxMzksCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTA3NTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLAorMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLAorMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLAorMTAyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMDgxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsCisxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsCisxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsCisxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsCisxMDIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEwODgwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwKKzEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwKKzEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwKKzEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwKKzEwMgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTA5NDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLAorMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLAorMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLAorMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLDEwMiwxMDIsMTAyLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDExMDA4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LAorOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsCis5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCwKKzk4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMTA3MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsCis5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCwKKzk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LAorOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsCis5OAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTExMzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LAorOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsCis5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCwKKzk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LAorOTgKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDExMjAwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCwKKzk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LDk4LAorOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsOTgsCis5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCw5OCwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMTI2NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsCisxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsCisxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsCisxMjMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDExMzI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywKKzEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywKKzEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywKKzEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywKKzEyMworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTEzOTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLAorMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLAorMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLAorMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLAorMTIzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMTQ1NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsCisxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsCisxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsCisxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsMTIzLDEyMywxMjMsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTE1MjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LAorMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LAorMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LAorMTE5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMTU4NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksCisxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksCisxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksCisxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksCisxMTkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDExNjQ4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwKKzExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwKKzExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwKKzExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwKKzExOQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTE3MTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LAorMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LAorMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LAorMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LDExOSwxMTksMTE5LAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDExNzc2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywKKzE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywKKzE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywKKzE3NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTE4NDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LAorMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LAorMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LAorMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LAorMTc3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMTkwNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsCisxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsCisxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsCisxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsCisxNzcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDExOTY4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywKKzE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywKKzE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywKKzE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywxNzcsMTc3LDE3NywKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMjAzMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsCisxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsCisxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsCisxNTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEyMDk2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywKKzE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywKKzE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywKKzE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywKKzE1NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTIxNjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LAorMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LAorMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LAorMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LAorMTU3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMjIyNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsCisxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsCisxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsCisxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsMTU3LDE1NywxNTcsCisyMjYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEyMjg4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMjYsMjI2LDIyNiwyMjYsMjI2LDIyNiwyMjYsMjI2LDIyNiwyMjYsMjI2LDIyNiwyMjYsMjI2LDIyNiwKKzE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywKKzE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywKKzE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywKKzE4NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTIzNTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LAorMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LAorMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LAorMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LAorMTg3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMjQxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsCisxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsCisxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsCisxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsCisxODcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEyNDgwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywKKzE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywKKzE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywKKzE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywxODcsMTg3LDE4NywKKzIyNAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTI1NDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIyNCwyMjQsMjI0LDIyNCwyMjQsMjI0LDIyNCwyMjQsMjI0LDIyNCwyMjQsMjI0LDIyNCwyMjQsMjI0LAorMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LAorMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LAorMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LAorMTY5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMjYwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksCisxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksCisxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksCisxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksCisxNjkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEyNjcyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwKKzE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwKKzE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwKKzE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwKKzE2OQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTI3MzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LAorMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LAorMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LAorMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LDE2OSwxNjksMTY5LAorMjI1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMjgwMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjI1LDIyNSwyMjUsMjI1LDIyNSwyMjUsMjI1LDIyNSwyMjUsMjI1LDIyNSwyMjUsMjI1LDIyNSwyMjUsCisxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksCisxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksCisxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksCisxODkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEyODY0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwKKzE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwKKzE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwKKzE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwKKzE4OQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTI5MjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LAorMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LAorMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LAorMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LAorMTg5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMjk5MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksCisxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksCisxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksCisxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksMTg5LDE4OSwxODksCisyMjMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEzMDU2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMjMsMjIzLDIyMywyMjMsMjIzLDIyMywyMjMsMjIzLDIyMywyMjMsMjIzLDIyMywyMjMsMjIzLDIyMywKKzE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwKKzE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwKKzE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwKKzE2MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTMxMjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLAorMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLAorMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLAorMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLAorMTYyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMzE4NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsCisxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsCisxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsCisxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsCisxNjIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEzMjQ4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwKKzE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwKKzE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwKKzE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwxNjIsMTYyLDE2MiwKKzE3NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTMzMTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE3NSwxNzUsMTc1LDE3NSwxNzUsMTc1LDE3NSwxNzUsMTc1LDE3NSwxNzUsMTc1LDE3NSwxNzUsMTc1LAorMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLAorMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLAorMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLAorMTczCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMzM3NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsCisxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsCisxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsCisxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsCisxNzMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEzNDQwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywKKzE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywKKzE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywKKzE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywKKzE3MworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTM1MDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLAorMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLAorMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLAorMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLDE3MywxNzMsMTczLAorMjI4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMzU2OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjI4LDIyOCwyMjgsMjI4LDIyOCwyMjgsMjI4LDIyOCwyMjgsMjI4LDIyOCwyMjgsMjI4LDIyOCwyMjgsCisyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsCisyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsCisyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsCisyMTIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEzNjMyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwKKzIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwKKzIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwKKzIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwKKzIxMgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTM2OTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLAorMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLAorMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLAorMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLAorMjEyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMzc2MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsCisyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsCisyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsCisyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsMjEyLDIxMiwyMTIsCiszNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTM4MjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLAorMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLAorMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLAorMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLAorMzEwCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxMzg4OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsCiszMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsCiszMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsCiszMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsCiszMTAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDEzOTUyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwKKzMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwKKzMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwKKzMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwKKzMxMAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTQwMTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLAorMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLAorMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLAorMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLDMxMCwzMTAsMzEwLAorMjI3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxNDA4MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjI3LDIyNywyMjcsMjI3LDIyNywyMjcsMjI3LDIyNywyMjcsMjI3LDIyNywyMjcsMjI3LDIyNywyMjcsCisyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsCisyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsCisyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsCisyMDUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE0MTQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwKKzIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwKKzIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwKKzIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwKKzIwNQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTQyMDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LAorMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LAorMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LAorMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LAorMjA1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxNDI3MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsCisyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsCisyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsCisyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsMjA1LDIwNSwyMDUsCiszMTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE0MzM2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwKKzMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwKKzMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwKKzMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwKKzMxMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTQ0MDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLAorMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLAorMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLAorMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLAorMzExCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxNDQ2NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsCiszMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsCiszMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsCiszMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsCiszMTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE0NTI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwKKzMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwKKzMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwKKzMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwzMTEsMzExLDMxMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxNDU5MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisyMjAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisyMjAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisyMjAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisyMjAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE0NjU2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzIyMCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzIyMCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzIyMCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzIyMAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTQ3MjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMjIwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMjIwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMjIwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMjIwCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxNDc4NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisyMjAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisyMjAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisyMjAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTQ4NDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLDEzOCwzMzgsMjY1LDM1MSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzE0OSwzNDIsMjY5LDM1NCwxMzgsMzM4LDI2NSwzNTEsMTQ4LC0xLDI2NywzNTMsLTEsLTEsLTEsLTEsCisxNDksMzQyLDI2OSwzNTQsMTM4LDMzOCwyNjUsMzUxLDE0OCwtMSwyNjcsMzUzLC0xLC0xLC0xLC0xLAorMTQ5LDM0MiwyNjksMzU0LDEzOCwzMzgsMjY1LDM1MSwxNDgsLTEsMjY3LDM1MywtMSwtMSwtMSwtMSwKKzE0OQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTQ5MTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM0MiwyNjksMzU0LDEzOCwzMzgsMjY1LDM1MSwxNDgsLTEsMjY3LDM1MywtMSwtMSwtMSwtMSwKKzE0OSwzNDIsMjY5LDM1NCwxMzgsMzM4LDI2NSwzNTEsMTQ4LC0xLDI2NywzNTMsLTEsLTEsLTEsLTEsCisxNDksMzQyLDI2OSwzNTQsMTM4LDMzOCwyNjUsMzUxLDE0OCwtMSwyNjcsMzUzLC0xLC0xLC0xLC0xLAorMTQ5LDM0MiwyNjksMzU0LDEzOCwzMzgsMjY1LDM1MSwxNDgsLTEsMjY3LDM1MywtMSwtMSwtMSwtMSwKKzE0OQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTQ5NzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM0MiwyNjksMzU0LDEzOCwzMzgsMjY1LDM1MSwxNDgsLTEsMjY3LDM1MywtMSwtMSwtMSwtMSwKKzE0OSwzNDIsMjY5LDM1NCwxMzgsMzM4LDI2NSwzNTEsMTQ4LC0xLDI2NywzNTMsLTEsLTEsLTEsLTEsCisxNDksMzQyLDI2OSwzNTQsMTM4LDMzOCwyNjUsMzUxLDE0OCwtMSwyNjcsMzUzLC0xLC0xLC0xLC0xLAorMTQ5LDM0MiwyNjksMzU0LDEzOCwzMzgsMjY1LDM1MSwxNDgsLTEsMjY3LDM1MywtMSwtMSwtMSwtMSwKKzE0OQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTUwNDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM0MiwyNjksMzU0LDEzOCwzMzgsMjY1LDM1MSwxNDgsLTEsMjY3LDM1MywtMSwtMSwtMSwtMSwKKzE0OSwzNDIsMjY5LDM1NCwxMzgsMzM4LDI2NSwzNTEsMTQ4LC0xLDI2NywzNTMsLTEsLTEsLTEsLTEsCisxNDksMzQyLDI2OSwzNTQsMTM4LDMzOCwyNjUsMzUxLDE0OCwtMSwyNjcsMzUzLC0xLC0xLC0xLC0xLAorMTQ5LDM0MiwyNjksMzU0LDEzOCwzMzgsMjY1LDM1MSwxNDgsLTEsMjY3LDM1MywtMSwtMSwtMSwtMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxNTEwNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsMzM5LDI2MywzNTAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwyNjgsLTEsLTEsMzM5LDI2MywzNTAsMTQ3LC0xLDI2NiwzNTIsLTEsLTEsLTEsLTEsCistMSwtMSwyNjgsLTEsLTEsMzM5LDI2MywzNTAsMTQ3LC0xLDI2NiwzNTIsLTEsLTEsLTEsLTEsCistMSwtMSwyNjgsLTEsLTEsMzM5LDI2MywzNTAsMTQ3LC0xLDI2NiwzNTIsLTEsLTEsLTEsLTEsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTUxNjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLDI2OCwtMSwtMSwzMzksMjYzLDM1MCwxNDcsLTEsMjY2LDM1MiwtMSwtMSwtMSwtMSwKKy0xLC0xLDI2OCwtMSwtMSwzMzksMjYzLDM1MCwxNDcsLTEsMjY2LDM1MiwtMSwtMSwtMSwtMSwKKy0xLC0xLDI2OCwtMSwtMSwzMzksMjYzLDM1MCwxNDcsLTEsMjY2LDM1MiwtMSwtMSwtMSwtMSwKKy0xLC0xLDI2OCwtMSwtMSwzMzksMjYzLDM1MCwxNDcsLTEsMjY2LDM1MiwtMSwtMSwtMSwtMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxNTIzMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsMjY4LC0xLC0xLDMzOSwyNjMsMzUwLDE0NywtMSwyNjYsMzUyLC0xLC0xLC0xLC0xLAorLTEsLTEsMjY4LC0xLC0xLDMzOSwyNjMsMzUwLDE0NywtMSwyNjYsMzUyLC0xLC0xLC0xLC0xLAorLTEsLTEsMjY4LC0xLC0xLDMzOSwyNjMsMzUwLDE0NywtMSwyNjYsMzUyLC0xLC0xLC0xLC0xLAorLTEsLTEsMjY4LC0xLC0xLDMzOSwyNjMsMzUwLDE0NywtMSwyNjYsMzUyLC0xLC0xLC0xLC0xLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE1Mjk2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwyNjgsLTEsLTEsMzM5LDI2MywzNTAsMTQ3LC0xLDI2NiwzNTIsLTEsLTEsLTEsLTEsCistMSwtMSwyNjgsLTEsLTEsMzM5LDI2MywzNTAsMTQ3LC0xLDI2NiwzNTIsLTEsLTEsLTEsLTEsCistMSwtMSwyNjgsLTEsLTEsMzM5LDI2MywzNTAsMTQ3LC0xLDI2NiwzNTIsLTEsLTEsLTEsLTEsCistMSwtMSwyNjgsLTEsLTEsMzM5LDI2MywzNTAsMTQ3LC0xLDI2NiwzNTIsLTEsLTEsLTEsLTEsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTUzNjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LAorMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LAorMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LAorMTM3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxNTQyNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsCisxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsCisxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsCisxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsCisxMzcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE1NDg4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywKKzEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywKKzEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywKKzEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywKKzEzNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTU1NTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LAorMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LAorMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LAorMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LDEzNywxMzcsMTM3LAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE1NjE2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwxMzYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsCisxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsCisxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsCisxMzUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE1NjgwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwKKzEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwKKzEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwKKzEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwKKzEzNQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTU3NDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LAorMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LAorMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LAorMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LAorMTM1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxNTgwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsCisxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsCisxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsCisxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsMTM1LDEzNSwxMzUsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTU4NzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LAorMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LAorMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LAorMjY0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxNTkzNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsCisyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsCisyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsCisyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsCisyNjQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE2MDAwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwKKzI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwKKzI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwKKzI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwKKzI2NAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTYwNjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LAorMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LAorMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LAorMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LDI2NCwyNjQsMjY0LAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE2MTI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwKKzI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwKKzI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwKKzI2MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTYxOTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLAorMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLAorMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLAorMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLAorMjYyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxNjI1NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsCisyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsCisyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsCisyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsCisyNjIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE2MzIwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwKKzI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwKKzI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwKKzI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwyNjIsMjYyLDI2MiwKKzgKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE2Mzg0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwKKzksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksCis5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LAorOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSwKKzkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE2NDQ4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSwKKzksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksCis5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LAorOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSwKKzkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE2NTEyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSwKKzksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksCis5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LAorOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSwKKzkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE2NTc2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSwKKzksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksCis5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LAorOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSwKKzMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE2NjQwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywKKzQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsCis0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LAorNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCwKKzQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE2NzA0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCwKKzQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsCis0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LAorNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCwKKzQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE2NzY4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCwKKzQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsCis0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LAorNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCwKKzQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE2ODMyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCwKKzQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsCis0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LAorNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCwKKzM2OAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTY4OTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM2OCwzNjgsMzY4LDM2OCwzNjgsMzY4LDM2OCwzNjgsMzY4LDM2OCwzNjgsMzY4LDM2OCwzNjgsMzY4LAorMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LAorMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LAorMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LAorMzY5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxNjk2MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksCiszNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksCiszNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksCiszNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksCiszNjkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE3MDI0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwKKzM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwKKzM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwKKzM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwKKzM2OQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTcwODhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LAorMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LAorMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LAorMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LDM2OSwzNjksMzY5LAorMzYzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxNzE1MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzYzLDM2MywzNjMsMzYzLDM2MywzNjMsMzYzLDM2MywzNjMsMzYzLDM2MywzNjMsMzYzLDM2MywzNjMsCiszNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsCiszNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsCiszNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsCiszNjQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE3MjE2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwKKzM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwKKzM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwKKzM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwKKzM2NAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTcyODBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LAorMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LAorMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LAorMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LAorMzY0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxNzM0NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsCiszNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsCiszNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsCiszNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsMzY0LDM2NCwzNjQsCisyNTgKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE3NDA4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNTgsMjU4LDI1OCwyNTgsMjU4LDI1OCwyNTgsMjU4LDI1OCwyNTgsMjU4LDI1OCwyNTgsMjU4LDI1OCwKKzI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwKKzI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwKKzI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwKKzI1OQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTc0NzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LAorMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LAorMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LAorMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LAorMjU5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxNzUzNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksCisyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksCisyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksCisyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksCisyNTkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE3NjAwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwKKzI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwKKzI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwKKzI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwyNTksMjU5LDI1OSwKKzI1MworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTc2NjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLAorMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LAorMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LAorMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LAorMjU0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxNzcyOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsCisyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsCisyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsCisyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsCisyNTQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE3NzkyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwKKzI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwKKzI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwKKzI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwKKzI1NAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTc4NTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LAorMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LAorMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LAorMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LDI1NCwyNTQsMjU0LAorMjMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE3OTIwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMywyMywyMywyMywyMywyMywyMywyMywyMywyMywyMywyMywyMywyMywyMywKKzI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LAorMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsCisyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwKKzI0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxNzk4NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsCisyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwKKzI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LAorMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsCisyNAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTgwNDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LAorMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsCisyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwKKzI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LAorMjQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE4MTEyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwKKzI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LDI0LAorMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsMjQsCisyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwyNCwKKzE4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxODE3NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTgsMTgsMTgsMTgsMTgsMTgsMTgsMTgsMTgsMTgsMTgsMTgsMTgsMTgsMTgsCisxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwKKzE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LAorMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksCisxOQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTgyNDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LAorMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksCisxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwKKzE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LAorMTkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE4MzA0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwKKzE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LAorMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksCisxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwKKzE5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxODM2OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksCisxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwxOSwKKzE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LDE5LAorMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksMTksCis0MTMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE4NDMyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MTMsNDEzLDQxMyw0MTMsNDEzLDQxMyw0MTMsNDEzLDQxMyw0MTMsNDEzLDQxMyw0MTMsNDEzLDQxMywKKzQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCwKKzQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCwKKzQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCwKKzQxNAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTg0OTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LAorNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LAorNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LAorNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LAorNDE0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxODU2MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsCis0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsCis0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsCis0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsCis0MTQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE4NjI0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCwKKzQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCwKKzQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCwKKzQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCw0MTQsNDE0LDQxNCwKKzQwOAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTg2ODhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQwOCw0MDgsNDA4LDQwOCw0MDgsNDA4LDQwOCw0MDgsNDA4LDQwOCw0MDgsNDA4LDQwOCw0MDgsNDA4LAorNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LAorNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LAorNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LAorNDA5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxODc1MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksCis0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksCis0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksCis0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksCis0MDkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE4ODE2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSwKKzQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSwKKzQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSwKKzQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSwKKzQwOQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTg4ODBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LAorNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LAorNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LAorNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LDQwOSw0MDksNDA5LAorNzEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE4OTQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis3MSw3MSw3MSw3MSw3MSw3MSw3MSw3MSw3MSw3MSw3MSw3MSw3MSw3MSw3MSwKKzcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLAorNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsCis3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3MiwKKzcyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxOTAwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsCis3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3MiwKKzcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLAorNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsCis3MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTkwNzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLAorNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsCis3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3MiwKKzcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLAorNzIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE5MTM2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3MiwKKzcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLDcyLAorNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsNzIsCis3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3MiwKKzYzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxOTIwMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNjMsNjMsNjMsNjMsNjMsNjMsNjMsNjMsNjMsNjMsNjMsNjMsNjMsNjMsNjMsCis2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCwKKzY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LAorNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsCis2NAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTkyNjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LAorNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsCis2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCwKKzY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LAorNjQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE5MzI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCwKKzY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LAorNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsCis2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCwKKzY0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxOTM5MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsCis2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCw2NCwKKzY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LDY0LAorNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsNjQsCis1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTk0NTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzY5LDI0OCwtMSwzODQsMTgwLDQwNCwtMSw0NywtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzU2LDY4LDI0OSwtMSwzODUsMTc4LDQwNSwtMSw0OCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzU2LDY4LDI0OSwtMSwzODUsMTc4LDQwNSwtMSw0OCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzU2LDY4LDI0OSwtMSwzODUsMTc4LDQwNSwtMSw0OCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzU2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxOTUyMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNjgsMjQ5LC0xLDM4NSwxNzgsNDA1LC0xLDQ4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTYsNjgsMjQ5LC0xLDM4NSwxNzgsNDA1LC0xLDQ4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTYsNjgsMjQ5LC0xLDM4NSwxNzgsNDA1LC0xLDQ4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTYsNjgsMjQ5LC0xLDM4NSwxNzgsNDA1LC0xLDQ4LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE5NTg0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis2OCwyNDksLTEsMzg1LDE3OCw0MDUsLTEsNDgsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1Niw2OCwyNDksLTEsMzg1LDE3OCw0MDUsLTEsNDgsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1Niw2OCwyNDksLTEsMzg1LDE3OCw0MDUsLTEsNDgsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1Niw2OCwyNDksLTEsMzg1LDE3OCw0MDUsLTEsNDgsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1NgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTk2NDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzY4LDI0OSwtMSwzODUsMTc4LDQwNSwtMSw0OCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzU2LDY4LDI0OSwtMSwzODUsMTc4LDQwNSwtMSw0OCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzU2LDY4LDI0OSwtMSwzODUsMTc4LDQwNSwtMSw0OCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzU2LDY4LDI0OSwtMSwzODUsMTc4LDQwNSwtMSw0OCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzUxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxOTcxMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNjEsMjQ0LC0xLDM4MCwxNjAsNDAwLC0xLDQzLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTIsNjAsMjQ1LC0xLDM4MSwxNTgsNDAxLC0xLDQ0LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTIsNjAsMjQ1LC0xLDM4MSwxNTgsNDAxLC0xLDQ0LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTIsNjAsMjQ1LC0xLDM4MSwxNTgsNDAxLC0xLDQ0LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE5Nzc2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis2MCwyNDUsLTEsMzgxLDE1OCw0MDEsLTEsNDQsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1Miw2MCwyNDUsLTEsMzgxLDE1OCw0MDEsLTEsNDQsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1Miw2MCwyNDUsLTEsMzgxLDE1OCw0MDEsLTEsNDQsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1Miw2MCwyNDUsLTEsMzgxLDE1OCw0MDEsLTEsNDQsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MTk4NDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzYwLDI0NSwtMSwzODEsMTU4LDQwMSwtMSw0NCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzUyLDYwLDI0NSwtMSwzODEsMTU4LDQwMSwtMSw0NCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzUyLDYwLDI0NSwtMSwzODEsMTU4LDQwMSwtMSw0NCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzUyLDYwLDI0NSwtMSwzODEsMTU4LDQwMSwtMSw0NCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzUyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QxOTkwNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNjAsMjQ1LC0xLDM4MSwxNTgsNDAxLC0xLDQ0LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTIsNjAsMjQ1LC0xLDM4MSwxNTgsNDAxLC0xLDQ0LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTIsNjAsMjQ1LC0xLDM4MSwxNTgsNDAxLC0xLDQ0LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTIsNjAsMjQ1LC0xLDM4MSwxNTgsNDAxLC0xLDQ0LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDE5OTY4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMDAzMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjAwOTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIwMTYwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMDIyNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjAyODhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIwMzUyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMDQxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis4NAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjA0ODBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzg0LDg0LDg0LDg0LDg0LDg0LDg0LDg0LDg0LDg0LDg0LDg0LDg0LDg0LDg0LAorODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsCis4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSwKKzg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LAorODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIwNTQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSwKKzg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LAorODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsCis4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSwKKzg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMDYwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsCis4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSwKKzg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LAorODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsCis4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjA2NzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LAorODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsODUsCis4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSw4NSwKKzg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LDg1LAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIwNzM2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzI4NSwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwKKzI4NSwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwKKzI4NSwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwKKzI4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjA4MDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LAorMjg1LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LAorMjg1LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LAorMjg1LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LAorMjg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMDg2NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsCisyODUsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsCisyODUsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsCisyODUsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsCisyODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIwOTI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwKKzI4NSwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwKKzI4NSwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwKKzI4NSwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwyODYsMjg2LDI4NiwKKzM3MworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjA5OTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM3MywzNzMsMzczLDM3MywzNzMsMzczLDM3MywzNzMsMzczLDM3MywzNzMsMzczLDM3MywzNzMsMzczLAorMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LAorMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LAorMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LAorMzc0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMTA1NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsCiszNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsCiszNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsCiszNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsCiszNzQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIxMTIwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwKKzM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwKKzM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwKKzM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwKKzM3NAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjExODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LAorMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LAorMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LAorMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LDM3NCwzNzQsMzc0LAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIxMjQ4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzI4MCwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwKKzI4MCwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwKKzI4MCwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwKKzI4MAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjEzMTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLAorMjgwLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLAorMjgwLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLAorMjgwLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLAorMjgwCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMTM3NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsCisyODAsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsCisyODAsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsCisyODAsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsCisyODAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIxNDQwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwKKzI4MCwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwKKzI4MCwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwKKzI4MCwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwyODEsMjgxLDI4MSwKKzIwOAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjE1MDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIwOCwyMDgsMjA4LDIwOCwyMDgsMjA4LDIwOCwyMDgsMjA4LDIwOCwyMDgsMjA4LDIwOCwyMDgsMjA4LAorMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LAorMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LAorMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LAorMjA5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMTU2OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksCisyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksCisyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksCisyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksCisyMDkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIxNjMyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwKKzIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwKKzIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwKKzIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwKKzIwOQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjE2OTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LAorMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LAorMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LAorMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LDIwOSwyMDksMjA5LAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIxNzYwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzI3NywyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwKKzI3NywyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwKKzI3NywyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwKKzI3NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjE4MjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LAorMjc3LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LAorMjc3LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LAorMjc3LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LAorMjc3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMTg4OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsCisyNzcsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsCisyNzcsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsCisyNzcsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsCisyNzcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIxOTUyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwKKzI3NywyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwKKzI3NywyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwKKzI3NywyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwyNzYsMjc2LDI3NiwKKzEzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMjAxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsMTMsCisxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwKKzE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LAorMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsCisxNAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjIwODBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LAorMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsCisxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwKKzE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LAorMTQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIyMTQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwKKzE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LAorMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsCisxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwKKzE0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMjIwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsCisxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwxNCwKKzE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LDE0LAorMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsMTQsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjIyNzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMjczLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLAorMjczLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLAorMjczLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLAorMjczCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMjMzNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsCisyNzMsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsCisyNzMsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsCisyNzMsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsCisyNzMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIyNDAwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwKKzI3MywyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwKKzI3MywyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwKKzI3MywyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwKKzI3MworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjI0NjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLAorMjczLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLAorMjczLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLAorMjczLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLDI3MiwyNzIsMjcyLAorMjM5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMjUyOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjM5LDIzOSwyMzksMjM5LDIzOSwyMzksMjM5LDIzOSwyMzksMjM5LDIzOSwyMzksMjM5LDIzOSwyMzksCisyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsCisyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsCisyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsCisyNDAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIyNTkyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwKKzI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwKKzI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwKKzI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwKKzI0MAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjI2NTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLAorMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLAorMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLAorMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLAorMjQwCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMjcyMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsCisyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsCisyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsCisyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsMjQwLDI0MCwyNDAsCisyMzQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIyNzg0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMzQsMjM0LDIzNCwyMzQsMjM0LDIzNCwyMzQsMjM0LDIzNCwyMzQsMjM0LDIzNCwyMzQsMjM0LDIzNCwKKzIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwKKzIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwKKzIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwKKzIzNQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjI4NDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LAorMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LAorMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LAorMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LAorMjM1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMjkxMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsCisyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsCisyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsCisyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsCisyMzUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIyOTc2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwKKzIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwKKzIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwKKzIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwyMzUsMjM1LDIzNSwKKzExMworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjMwNDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExMywxMTMsMTEzLDExMywxMTMsMTEzLDExMywxMTMsMTEzLDExMywxMTMsMTEzLDExMywxMTMsMTEzLAorMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LAorMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LAorMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LAorMTE0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMzEwNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsCisxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsCisxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsCisxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsCisxMTQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIzMTY4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwKKzExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwKKzExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwKKzExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwKKzExNAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjMyMzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LAorMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LAorMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LAorMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LDExNCwxMTQsMTE0LAorMTA4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMzI5NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTA4LDEwOCwxMDgsMTA4LDEwOCwxMDgsMTA4LDEwOCwxMDgsMTA4LDEwOCwxMDgsMTA4LDEwOCwxMDgsCisxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksCisxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksCisxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksCisxMDkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIzMzYwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwKKzEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwKKzEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwKKzEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwKKzEwOQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjM0MjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LAorMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LAorMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LAorMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LAorMTA5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMzQ4OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksCisxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksCisxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksCisxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksMTA5LDEwOSwxMDksCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjM1NTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIxOSwtMSwtMSwtMSwtMSwtMSwtMSwzODgsMjE2LC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsMjE4LC0xLC0xLC0xLC0xLC0xLC0xLDM4OSwyMTUsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwyMTgsLTEsLTEsLTEsLTEsLTEsLTEsMzg5LDIxNSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLDIxOCwtMSwtMSwtMSwtMSwtMSwtMSwzODksMjE1LC0xLC0xLC0xLC0xLC0xLC0xLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIzNjE2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMTgsLTEsLTEsLTEsLTEsLTEsLTEsMzg5LDIxNSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLDIxOCwtMSwtMSwtMSwtMSwtMSwtMSwzODksMjE1LC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsMjE4LC0xLC0xLC0xLC0xLC0xLC0xLDM4OSwyMTUsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwyMTgsLTEsLTEsLTEsLTEsLTEsLTEsMzg5LDIxNSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMzY4MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjE4LC0xLC0xLC0xLC0xLC0xLC0xLDM4OSwyMTUsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwyMTgsLTEsLTEsLTEsLTEsLTEsLTEsMzg5LDIxNSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLDIxOCwtMSwtMSwtMSwtMSwtMSwtMSwzODksMjE1LC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsMjE4LC0xLC0xLC0xLC0xLC0xLC0xLDM4OSwyMTUsLTEsLTEsLTEsLTEsLTEsLTEsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjM3NDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIxOCwtMSwtMSwtMSwtMSwtMSwtMSwzODksMjE1LC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsMjE4LC0xLC0xLC0xLC0xLC0xLC0xLDM4OSwyMTUsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwyMTgsLTEsLTEsLTEsLTEsLTEsLTEsMzg5LDIxNSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLDIxOCwtMSwtMSwtMSwtMSwtMSwtMSwzODksMjE1LC0xLC0xLC0xLC0xLC0xLC0xLAorMjA0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyMzgwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjA0LDIwNCwyMDQsMjA0LDIwNCwyMDQsMjA0LDIwNCwyMDQsMjA0LDIwNCwyMDQsMjA0LDIwNCwyMDQsCisyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsCisyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsCisyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsCisyMDMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDIzODcyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywKKzIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywKKzIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywKKzIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywKKzIwMworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjM5MzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLAorMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLAorMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLAorMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLAorMjAzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNDAwMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsCisyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsCisyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsCisyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywyMDMsCisxNTMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI0MDY0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTMsMTUzLDE1MywxNTMsMTUzLDE1MywxNTMsMTUzLDE1MywxNTMsMTUzLDE1MywxNTMsMTUzLDE1MywKKzE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwKKzE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwKKzE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwKKzE1NAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjQxMjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LAorMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LAorMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LAorMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LAorMTU0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNDE5MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsCisxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsCisxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsCisxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsCisxNTQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI0MjU2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwKKzE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwKKzE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwKKzE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwxNTQsMTU0LDE1NCwKKzM5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNDMyMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis0MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzQwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNDAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis0MAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjQzODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNDAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis0MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzQwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNDAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI0NDQ4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzQwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNDAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis0MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzQwCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNDUxMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis0MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzQwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNDAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisxODMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI0NTc2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODMsMTgzLDE4MywxODMsMTgzLDE4MywxODMsMTgzLDE4MywxODMsMTgzLDE4MywxODMsMTgzLDE4MywKKzE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwKKzE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwKKzE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwKKzE4NAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjQ2NDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LAorMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LAorMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LAorMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LAorMTg0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNDcwNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsCisxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsCisxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsCisxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsCisxODQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI0NzY4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwKKzE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwKKzE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwKKzE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwxODQsMTg0LDE4NCwKKzE2NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjQ4MzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE2NSwxNjUsMTY1LDE2NSwxNjUsMTY1LDE2NSwxNjUsMTY1LDE2NSwxNjUsMTY1LDE2NSwxNjUsMTY1LAorMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LAorMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LAorMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LAorMTY2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNDg5NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsCisxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsCisxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsCisxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsCisxNjYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI0OTYwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwKKzE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwKKzE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwKKzE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwKKzE2NgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjUwMjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LAorMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LAorMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LAorMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LDE2NiwxNjYsMTY2LAorMjk1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNTA4OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjk1LDI5NSwyOTUsMjk1LDI5NSwyOTUsMjk1LDI5NSwyOTUsMjk1LDI5NSwyOTUsMjk1LDI5NSwyOTUsCisyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsCisyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsCisyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsCisyOTQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI1MTUyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwKKzI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwKKzI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwKKzI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwKKzI5NAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjUyMTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LAorMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LAorMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LAorMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LAorMjk0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNTI4MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsCisyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsCisyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsCisyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsMjk0LDI5NCwyOTQsCisyOTAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI1MzQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyOTAsMjkwLDI5MCwyOTAsMjkwLDI5MCwyOTAsMjkwLDI5MCwyOTAsMjkwLDI5MCwyOTAsMjkwLDI5MCwKKzI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwKKzI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwKKzI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwKKzI4OQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjU0MDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LAorMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LAorMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LAorMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LAorMjg5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNTQ3MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksCisyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksCisyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksCisyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksCisyODkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI1NTM2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwKKzI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwKKzI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwKKzI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwyODksMjg5LDI4OSwKKzMzNAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjU2MDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMzNCwzMzQsMzM0LDMzNCwzMzQsMzM0LDMzNCwzMzQsMzM0LDMzNCwzMzQsMzM0LDMzNCwzMzQsMzM0LAorMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLAorMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLAorMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLAorMzMzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNTY2NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsCiszMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsCiszMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsCiszMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsCiszMzMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI1NzI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywKKzMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywKKzMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywKKzMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywKKzMzMworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjU3OTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLAorMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLAorMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLAorMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLAorMzI5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNTg1NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzI5LDMyOSwzMjksMzI5LDMyOSwzMjksMzI5LDMyOSwzMjksMzI5LDMyOSwzMjksMzI5LDMyOSwzMjksCiszMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsCiszMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsCiszMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsCiszMjgKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI1OTIwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwKKzMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwKKzMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwKKzMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwKKzMyOAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjU5ODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LAorMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LAorMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LAorMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LAorMzI4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNjA0OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsCiszMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsCiszMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsCiszMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsMzI4LDMyOCwzMjgsCiszNAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjYxMTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM0LDM0LDM0LDM0LDM0LDM0LDM0LDM0LDM0LDM0LDM0LDM0LDM0LDM0LDM0LAorMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsCiszMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywKKzMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLAorMzMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI2MTc2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywKKzMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLAorMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsCiszMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywKKzMzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNjI0MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsCiszMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywKKzMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLAorMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsCiszMworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjYzMDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLAorMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsMzMsCiszMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywzMywKKzMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLDMzLAorMjkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI2MzY4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyOSwyOSwyOSwyOSwyOSwyOSwyOSwyOSwyOSwyOSwyOSwyOSwyOSwyOSwyOSwKKzI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LAorMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsCisyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwKKzI4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNjQzMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsCisyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwKKzI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LAorMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsCisyOAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjY0OTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LAorMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsCisyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwKKzI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LAorMjgKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI2NTYwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwKKzI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LDI4LAorMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsMjgsCisyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwyOCwKKzE0NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjY2MjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE0NSwxNDUsMTQ1LDE0NSwxNDUsMTQ1LDE0NSwxNDUsMTQ1LDE0NSwxNDUsMTQ1LDE0NSwxNDUsMTQ1LAorMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LAorMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LAorMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LAorMTQ0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNjY4OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsCisxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsCisxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsCisxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsCisxNDQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI2NzUyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwKKzE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwKKzE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwKKzE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwKKzE0NAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjY4MTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LAorMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LAorMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LAorMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LDE0NCwxNDQsMTQ0LAorMTQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNjg4MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTQxLDE0MSwxNDEsMTQxLDE0MSwxNDEsMTQxLDE0MSwxNDEsMTQxLDE0MSwxNDEsMTQxLDE0MSwxNDEsCisxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsCisxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsCisxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsCisxNDAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI2OTQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwKKzE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwKKzE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwKKzE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwKKzE0MAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjcwMDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLAorMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLAorMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLAorMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLAorMTQwCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNzA3MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsCisxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsCisxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsCisxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsMTQwLDE0MCwxNDAsCisxMDQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI3MTM2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMDQsMTA0LDEwNCwxMDQsMTA0LDEwNCwxMDQsMTA0LDEwNCwxMDQsMTA0LDEwNCwxMDQsMTA0LDEwNCwKKzEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywKKzEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywKKzEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywKKzEwMworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjcyMDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLAorMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLAorMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLAorMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLAorMTAzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNzI2NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsCisxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsCisxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsCisxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsCisxMDMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI3MzI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywKKzEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywKKzEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywKKzEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywxMDMsMTAzLDEwMywKKzEwMAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjczOTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLAorOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksCis5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSwKKzk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LAorOTkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI3NDU2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSwKKzk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LAorOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksCis5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSwKKzk5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNzUyMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksCis5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSwKKzk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LAorOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksCis5OQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mjc1ODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LAorOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksOTksCis5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSwKKzk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LDk5LAorMTI0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNzY0OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTI0LDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwxMjQsMTI0LDEyNCwxMjQsCisxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsCisxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsCisxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsCisxMjUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI3NzEyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwKKzEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwKKzEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwKKzEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwKKzEyNQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mjc3NzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LAorMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LAorMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LAorMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LAorMTI1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyNzg0MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsCisxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsCisxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsCisxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsMTI1LDEyNSwxMjUsCisxMjAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI3OTA0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMjAsMTIwLDEyMCwxMjAsMTIwLDEyMCwxMjAsMTIwLDEyMCwxMjAsMTIwLDEyMCwxMjAsMTIwLDEyMCwKKzEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwKKzEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwKKzEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwKKzEyMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mjc5NjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLAorMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLAorMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLAorMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLAorMTIxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyODAzMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsCisxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsCisxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsCisxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsCisxMjEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI4MDk2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwKKzEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwKKzEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwKKzEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwxMjEsMTIxLDEyMSwKKzE4MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjgxNjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4MSwxODEsMTgxLDE4MSwxODEsMTgxLDE4MSwxODEsMTgxLDE4MSwxODEsMTgxLDE4MSwxODEsMTgxLAorMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LAorMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LAorMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LAorMTc5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyODIyNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksCisxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksCisxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksCisxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksCisxNzkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI4Mjg4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwKKzE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwKKzE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwKKzE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwKKzE3OQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjgzNTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LAorMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LAorMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LAorMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LDE3OSwxNzksMTc5LAorMTYxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyODQxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTYxLDE2MSwxNjEsMTYxLDE2MSwxNjEsMTYxLDE2MSwxNjEsMTYxLDE2MSwxNjEsMTYxLDE2MSwxNjEsCisxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksCisxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksCisxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksCisxNTkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI4NDgwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwKKzE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwKKzE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwKKzE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwKKzE1OQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mjg1NDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LAorMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LAorMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LAorMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LAorMTU5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyODYwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksCisxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksCisxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksCisxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksMTU5LDE1OSwxNTksCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mjg2NzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LAorMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LAorMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LAorMTg4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyODczNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsCisxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsCisxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsCisxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsCisxODgKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI4ODAwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwKKzE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwKKzE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwKKzE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwKKzE4OAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mjg4NjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LAorMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LAorMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LAorMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LDE4OCwxODgsMTg4LAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI4OTI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwKKzE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwKKzE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwKKzE3MAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mjg5OTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLAorMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLAorMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLAorMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLAorMTcwCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyOTA1NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsCisxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsCisxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsCisxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsCisxNzAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI5MTIwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwKKzE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwKKzE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwKKzE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwxNzAsMTcwLDE3MCwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyOTE4NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsCisxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsCisxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsCisxOTAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI5MjQ4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwKKzE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwKKzE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwKKzE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwKKzE5MAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MjkzMTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLAorMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLAorMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLAorMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLAorMTkwCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyOTM3NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsCisxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsCisxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsCisxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsMTkwLDE5MCwxOTAsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mjk0NDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLAorMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLAorMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLAorMTYzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyOTUwNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsCisxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsCisxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsCisxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsCisxNjMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI5NTY4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywKKzE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywKKzE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywKKzE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywKKzE2MworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mjk2MzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLAorMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLAorMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLAorMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLDE2MywxNjMsMTYzLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI5Njk2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwKKzE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwKKzE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwKKzE3NAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mjk3NjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LAorMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LAorMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LAorMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LAorMTc0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyOTgyNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsCisxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsCisxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsCisxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsCisxNzQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDI5ODg4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwKKzE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwKKzE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwKKzE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwxNzQsMTc0LDE3NCwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QyOTk1MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsCisyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsCisyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsCisyMTMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMwMDE2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywKKzIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywKKzIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywKKzIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywKKzIxMworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzAwODBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLAorMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLAorMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLAorMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLAorMjEzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMDE0NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsCisyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsCisyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsCisyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsMjEzLDIxMywyMTMsCisxNzEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMwMjA4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNzEsMTcxLDE3MSwxNzEsMTcxLDE3MSwxNzEsMTcxLDE3MSwxNzEsMTcxLDE3MSwxNzEsMTcxLDE3MSwKKzE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwKKzE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwKKzE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwKKzE3MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzAyNzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLAorMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLAorMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLAorMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLAorMTcyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMDMzNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsCisxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsCisxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsCisxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsCisxNzIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMwNDAwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwKKzE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwKKzE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwKKzE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwxNzIsMTcyLDE3MiwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMDQ2NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsCisyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsCisyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsCisyMDYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMwNTI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwKKzIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwKKzIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwKKzIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwKKzIwNgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzA1OTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LAorMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LAorMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LAorMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LAorMjA2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMDY1NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsCisyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsCisyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsCisyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsMjA2LDIwNiwyMDYsCiszMTIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMwNzIwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwKKzMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwKKzMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwKKzMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwKKzMxMgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzA3ODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLAorMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLAorMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLAorMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLAorMzEyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMDg0OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsCiszMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsCiszMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsCiszMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsCiszMTIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMwOTEyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwKKzMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwKKzMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwKKzMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwzMTIsMzEyLDMxMiwKKzIyMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzA5NzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMjIyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMjIyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMjIyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMjIyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMTA0MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisyMjIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisyMjIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisyMjIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisyMjIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMxMTA0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzIyMiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzIyMiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzIyMiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzIyMgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzExNjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMjIyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMjIyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMjIyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMTM0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMTIzMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzEyOTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMxMzYwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMTQyNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisxNTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMxNDg4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwyMzIsMjMxLDIyOSwtMSwtMSwyMzAsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwyMzAsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwyMzAsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwyMzAsLTEsLTEsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzE1NTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDIzMCwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDIzMCwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDIzMCwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDIzMCwtMSwtMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMTYxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMjMwLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMjMwLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMjMwLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMjMwLC0xLC0xLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMxNjgwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwyMzAsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwyMzAsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwyMzAsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwyMzAsLTEsLTEsCisxMDYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMxNzQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMDYsMTA2LDEwNiwxMTgsMTE4LDExOCwxMTgsMTA2LDEwNiwxMDYsMTA2LDExOCwxMTgsMTE4LDExOCwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMTgwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzE4NzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMxOTM2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzE5MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzIwMDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLAorMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLAorMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLAorMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLAorMTkyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMjA2NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsCisxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsCisxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsCisxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsCisxOTIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMyMTI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwKKzE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwKKzE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwKKzE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwKKzE5MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzIxOTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLAorMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLAorMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLAorMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTIsMTkyLDE5MiwxOTEsMTkxLDE5MSwxOTEsMTkxLDE5MSwxOTEsMTkxLAorMzEzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMjI1NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsCiszMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsCiszMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsCiszMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsCiszMTMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMyMzIwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywKKzMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywKKzMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywKKzMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywKKzMxMworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzIzODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLAorMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLAorMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLAorMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLAorMzEzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMjQ0OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsCiszMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsCiszMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsCiszMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsMzEzLDMxMywzMTMsCiszMjAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMyNTEyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwKKzMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwKKzMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwKKzMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwKKzMyMAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzI1NzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLAorMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLAorMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLAorMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLAorMzIwCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMjY0MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsCiszMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsCiszMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsCiszMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsCiszMjAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMyNzA0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwKKzMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwKKzMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwKKzMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwzMjAsMzIwLDMyMCwKKzExCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMjc2OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsCisxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwKKzExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLAorMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsCisxMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzI4MzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLAorMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsCisxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwKKzExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLAorMTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMyODk2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwKKzExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLAorMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsCisxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwKKzExCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMjk2MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsCisxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwxMSwKKzExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLDExLAorMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsMTEsCis2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMzAyNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCis2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LAorNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKKzYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCis2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMzA4OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCis2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LAorNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKKzYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCis2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMzE1MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCis2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LAorNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKKzYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCis2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMzIxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCis2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LAorNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKKzYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCiszNzEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMzMjgwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwKKzM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwKKzM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwKKzM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwKKzM3MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzMzNDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLAorMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLAorMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLAorMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLAorMzcxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMzQwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsCiszNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsCiszNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsCiszNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsCiszNzEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMzNDcyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwKKzM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwKKzM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwKKzM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwzNzEsMzcxLDM3MSwKKzM2NgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzM1MzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LAorMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LAorMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LAorMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LAorMzY2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMzYwMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsCiszNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsCiszNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsCiszNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsCiszNjYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMzNjY0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwKKzM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwKKzM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwKKzM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwKKzM2NgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzM3MjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LAorMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LAorMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LAorMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LDM2NiwzNjYsMzY2LAorMjYxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMzc5MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsCisyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsCisyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsCisyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsCisyNjEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDMzODU2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwKKzI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwKKzI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwKKzI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwKKzI2MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzM5MjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLAorMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLAorMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLAorMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLAorMjYxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzMzk4NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsCisyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsCisyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsCisyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsMjYxLDI2MSwyNjEsCisyNTYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM0MDQ4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwKKzI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwKKzI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwKKzI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwKKzI1NgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzQxMTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LAorMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LAorMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LAorMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LAorMjU2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNDE3NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsCisyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsCisyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsCisyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsCisyNTYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM0MjQwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwKKzI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwKKzI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwKKzI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwyNTYsMjU2LDI1NiwKKzI2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNDMwNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsCisyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwKKzI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LAorMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsCisyNgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzQzNjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LAorMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsCisyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwKKzI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LAorMjYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM0NDMyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwKKzI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LAorMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsCisyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwKKzI2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNDQ5NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsCisyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwyNiwKKzI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LDI2LAorMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsMjYsCisyMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzQ1NjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLAorMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsCisyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwKKzIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLAorMjEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM0NjI0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwKKzIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLAorMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsCisyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwKKzIxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNDY4OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsCisyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwKKzIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLAorMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsCisyMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzQ3NTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLAorMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsMjEsCisyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwyMSwKKzIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLDIxLAorNDE2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNDgxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsCis0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsCis0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsCis0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsCis0MTYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM0ODgwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiwKKzQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiwKKzQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiwKKzQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiwKKzQxNgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzQ5NDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LAorNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LAorNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LAorNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LAorNDE2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNTAwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsCis0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsCis0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsCis0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsNDE2LDQxNiw0MTYsCis0MTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM1MDcyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSwKKzQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSwKKzQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSwKKzQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSwKKzQxMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzUxMzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLAorNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLAorNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLAorNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLAorNDExCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNTIwMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsCis0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsCis0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsCis0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsCis0MTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM1MjY0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSwKKzQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSwKKzQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSwKKzQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSw0MTEsNDExLDQxMSwKKzc0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNTMyOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsCis3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCwKKzc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LAorNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsCis3NAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzUzOTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LAorNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsCis3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCwKKzc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LAorNzQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM1NDU2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCwKKzc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LAorNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsCis3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCwKKzc0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNTUyMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsCis3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCw3NCwKKzc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LDc0LAorNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsNzQsCis2NgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzU1ODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LAorNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsCis2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2NiwKKzY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LAorNjYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM1NjQ4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2NiwKKzY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LAorNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsCis2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2NiwKKzY2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNTcxMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsCis2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2NiwKKzY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LAorNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsCis2NgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzU3NzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LAorNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsNjYsCis2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2Niw2NiwKKzY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LDY2LAorNTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM1ODQwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwyNTAsLTEsMzg2LC0xLDQwNiwtMSw0OSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzU3LC0xLDI1MCwtMSwzODYsLTEsNDA2LC0xLDQ5LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTcsLTEsMjUwLC0xLDM4NiwtMSw0MDYsLTEsNDksLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1NywtMSwyNTAsLTEsMzg2LC0xLDQwNiwtMSw0OSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzU3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNTkwNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsMjUwLC0xLDM4NiwtMSw0MDYsLTEsNDksLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1NywtMSwyNTAsLTEsMzg2LC0xLDQwNiwtMSw0OSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzU3LC0xLDI1MCwtMSwzODYsLTEsNDA2LC0xLDQ5LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTcsLTEsMjUwLC0xLDM4NiwtMSw0MDYsLTEsNDksLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzU5NjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLDI1MCwtMSwzODYsLTEsNDA2LC0xLDQ5LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTcsLTEsMjUwLC0xLDM4NiwtMSw0MDYsLTEsNDksLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1NywtMSwyNTAsLTEsMzg2LC0xLDQwNiwtMSw0OSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzU3LC0xLDI1MCwtMSwzODYsLTEsNDA2LC0xLDQ5LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM2MDMyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwyNTAsLTEsMzg2LC0xLDQwNiwtMSw0OSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzU3LC0xLDI1MCwtMSwzODYsLTEsNDA2LC0xLDQ5LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTcsLTEsMjUwLC0xLDM4NiwtMSw0MDYsLTEsNDksLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1NywtMSwyNTAsLTEsMzg2LC0xLDQwNiwtMSw0OSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzUzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNjA5NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzM3LDI0NiwyOTgsMzgyLDU4LDQwMiwyNTEsNDUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1MywzMzcsMjQ2LDI5OCwzODIsNTgsNDAyLC0xLDQ1LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTMsMzM3LDI0NiwyOTgsMzgyLDU4LDQwMiwtMSw0NSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzUzLDMzNywyNDYsMjk4LDM4Miw1OCw0MDIsLTEsNDUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1MworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzYxNjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMzNywyNDYsMjk4LDM4Miw1OCw0MDIsLTEsNDUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1MywzMzcsMjQ2LDI5OCwzODIsNTgsNDAyLC0xLDQ1LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTMsMzM3LDI0NiwyOTgsMzgyLDU4LDQwMiwtMSw0NSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzUzLDMzNywyNDYsMjk4LDM4Miw1OCw0MDIsLTEsNDUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1MworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzYyMjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMzNywyNDYsMjk4LDM4Miw1OCw0MDIsLTEsNDUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1MywzMzcsMjQ2LDI5OCwzODIsNTgsNDAyLC0xLDQ1LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTMsMzM3LDI0NiwyOTgsMzgyLDU4LDQwMiwtMSw0NSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzUzLDMzNywyNDYsMjk4LDM4Miw1OCw0MDIsLTEsNDUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1MworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzYyODhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMzNywyNDYsMjk4LDM4Miw1OCw0MDIsLTEsNDUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis1MywzMzcsMjQ2LDI5OCwzODIsNTgsNDAyLC0xLDQ1LC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorNTMsMzM3LDI0NiwyOTgsMzgyLDU4LDQwMiwtMSw0NSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzUzLDMzNywyNDYsMjk4LDM4Miw1OCw0MDIsLTEsNDUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisxMjkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM2MzUyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwKKzEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwKKzEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwKKzEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwKKzEyOQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzY0MTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LAorMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LAorMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LAorMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LAorMTI5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNjQ4MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksCisxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksCisxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksCisxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksCisxMjkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM2NTQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwKKzEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwKKzEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwKKzEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwxMjksMTI5LDEyOSwKKzEzMAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzY2MDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLAorMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLAorMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLAorMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLAorMTMwCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNjY3MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsCisxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsCisxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsCisxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsCisxMzAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM2NzM2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwKKzEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwKKzEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwKKzEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwKKzEzMAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzY4MDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLAorMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLAorMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLAorMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLDEzMCwxMzAsMTMwLAorODcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM2ODY0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4NywKKzg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LAorODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsCis4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4NywKKzg3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNjkyOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsCis4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4NywKKzg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LAorODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsCis4NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzY5OTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LAorODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsCis4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4NywKKzg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LAorODcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM3MDU2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4NywKKzg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LDg3LAorODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsODcsCis4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4Nyw4NywKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNzEyMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsCisyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsCisyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsCisyODcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM3MTg0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywKKzI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywKKzI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywKKzI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywKKzI4NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzcyNDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LAorMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LAorMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LAorMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LAorMjg3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNzMxMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsCisyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsCisyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsCisyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsMjg3LDI4NywyODcsCiszNzYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM3Mzc2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwKKzM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwKKzM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwKKzM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwKKzM3NgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mzc0NDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LAorMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LAorMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LAorMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LAorMzc2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNzUwNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsCiszNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsCiszNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsCiszNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsCiszNzYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM3NTY4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwKKzM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwKKzM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwKKzM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwzNzYsMzc2LDM3NiwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNzYzMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsCisyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsCisyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsCisyODMKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM3Njk2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywKKzI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywKKzI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywKKzI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywKKzI4MworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mzc3NjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLAorMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLAorMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLAorMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLAorMjgzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzNzgyNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsCisyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsCisyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsCisyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsMjgzLDI4MywyODMsCisyMTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM3ODg4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwKKzIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwKKzIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwKKzIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwKKzIxMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mzc5NTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLAorMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLAorMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLAorMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLAorMjExCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzODAxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsCisyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsCisyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsCisyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsCisyMTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM4MDgwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwKKzIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwKKzIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwKKzIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwyMTEsMjExLDIxMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzODE0NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsCisyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsCisyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsCisyNzgKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM4MjA4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwKKzI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwKKzI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwKKzI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwKKzI3OAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzgyNzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LAorMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LAorMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LAorMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LAorMjc4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzODMzNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsCisyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsCisyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsCisyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsCisxNgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mzg0MDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LAorMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsCisxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwKKzE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LAorMTYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM4NDY0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwKKzE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LAorMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsCisxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwKKzE2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzODUyOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsCisxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwKKzE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LAorMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsCisxNgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mzg1OTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LAorMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsCisxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwKKzE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM4NjU2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwKKzI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwKKzI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwKKzI3NAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mzg3MjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LAorMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LAorMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LAorMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LAorMjc0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzODc4NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsCisyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsCisyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsCisyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsCisyNzQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM4ODQ4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwKKzI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwKKzI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwKKzI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwyNzQsMjc0LDI3NCwKKzI0MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mzg5MTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLAorMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLAorMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLAorMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLAorMjQyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzODk3NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsCisyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsCisyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsCisyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsCisyNDIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM5MDQwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwKKzI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwKKzI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwKKzI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwKKzI0MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzkxMDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLAorMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLAorMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLAorMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLDI0MiwyNDIsMjQyLAorMjM3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzOTE2OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsCisyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsCisyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsCisyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsCisyMzcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM5MjMyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywKKzIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywKKzIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywKKzIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywKKzIzNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0MzkyOTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LAorMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LAorMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LAorMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LAorMjM3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzOTM2MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsCisyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsCisyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsCisyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsMjM3LDIzNywyMzcsCisxMTYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM5NDI0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwKKzExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwKKzExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwKKzExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwKKzExNgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mzk0ODhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LAorMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LAorMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LAorMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LAorMTE2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzOTU1MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsCisxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsCisxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsCisxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsCisxMTYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM5NjE2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwKKzExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwKKzExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwKKzExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwxMTYsMTE2LDExNiwKKzExMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mzk2ODBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLAorMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLAorMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLAorMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLAorMTExCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3QzOTc0NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsCisxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsCisxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsCisxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsCisxMTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM5ODA4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwKKzExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwKKzExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwKKzExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwKKzExMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0Mzk4NzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLAorMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLAorMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLAorMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLDExMSwxMTEsMTExLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDM5OTM2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwzOTAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwzOTAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwzOTAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwzOTAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDAwMDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLDM5MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDM5MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDM5MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDM5MCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MDA2NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsMzkwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMzkwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMzkwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMzkwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQwMTI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwzOTAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwzOTAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwzOTAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwzOTAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCiszMTQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQwMTkyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwKKzMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwKKzMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwKKzMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwKKzMxNAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDAyNTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LAorMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LAorMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LAorMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LAorMzE0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MDMyMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsCiszMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsCiszMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsCiszMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsCiszMTQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQwMzg0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwKKzMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwKKzMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwKKzMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwzMTQsMzE0LDMxNCwKKzI5OQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDA0NDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI5OSwyOTksMjk5LDI5OSwyOTksMjk5LDI5OSwyOTksMjk5LDI5OSwyOTksMjk5LDI5OSwyOTksMjk5LAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQwNTEyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MDU3NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDA2NDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMzE1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MDcwNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsCiszMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsCiszMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsCiszMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsCiszMTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQwNzY4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwKKzMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwKKzMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwKKzMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwKKzMxNQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDA4MzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LAorMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LAorMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LAorMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LAorMzE1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MDg5NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsCiszMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsCiszMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsCiszMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsMzE1LDMxNSwzMTUsCisxODYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQwOTYwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwKKzE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwKKzE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwKKzE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwKKzE4NgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDEwMjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LAorMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LAorMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LAorMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LAorMTg2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MTA4OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsCisxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsCisxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsCisxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsCisxODYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQxMTUyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwKKzE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwKKzE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwKKzE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwxODYsMTg2LDE4NiwKKzE2OAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDEyMTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LAorMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LAorMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LAorMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LAorMTY4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MTI4MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsCisxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsCisxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsCisxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsCisxNjgKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQxMzQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwKKzE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwKKzE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwKKzE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwKKzE2OAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDE0MDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LAorMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LAorMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LAorMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LDE2OCwxNjgsMTY4LAorMjk2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MTQ3MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsCisyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsCisyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsCisyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsCisyOTYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQxNTM2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwKKzI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwKKzI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwKKzI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwKKzI5NgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDE2MDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LAorMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LAorMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LAorMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LAorMjk2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MTY2NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsCisyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsCisyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsCisyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsMjk2LDI5NiwyOTYsCisyOTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQxNzI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwKKzI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwKKzI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwKKzI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwKKzI5MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDE3OTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLAorMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLAorMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLAorMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLAorMjkxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MTg1NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsCisyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsCisyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsCisyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsCisyOTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQxOTIwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwKKzI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwKKzI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwKKzI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwyOTEsMjkxLDI5MSwKKzMzNQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDE5ODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LAorMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LAorMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LAorMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LAorMzM1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MjA0OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsCiszMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsCiszMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsCiszMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsCiszMzUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQyMTEyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwKKzMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwKKzMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwKKzMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwKKzMzNQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDIxNzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LAorMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LAorMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LAorMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LDMzNSwzMzUsMzM1LAorMzMwCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MjI0MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsCiszMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsCiszMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsCiszMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsCiszMzAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQyMzA0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwKKzMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwKKzMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwKKzMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwKKzMzMAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDIzNjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLAorMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLAorMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLAorMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLAorMzMwCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MjQzMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsCiszMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsCiszMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsCiszMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsMzMwLDMzMCwzMzAsCiszNQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDI0OTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LAorMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsCiszNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwKKzM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LAorMzUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQyNTYwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwKKzM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LAorMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsCiszNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwKKzM1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MjYyNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsCiszNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwKKzM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LAorMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsCiszNQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDI2ODhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LAorMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsMzUsCiszNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwzNSwKKzM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LDM1LAorMzAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQyNzUyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwKKzMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLAorMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsCiszMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwKKzMwCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MjgxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsCiszMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwKKzMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLAorMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsCiszMAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDI4ODBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLAorMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsCiszMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwKKzMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLAorMzAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQyOTQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwKKzMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLDMwLAorMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsMzAsCiszMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwzMCwKKzE0NgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDMwMDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LAorMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LAorMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LAorMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LAorMTQ2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MzA3MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsCisxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsCisxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsCisxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsCisxNDYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQzMTM2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwKKzE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwKKzE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwKKzE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwKKzE0NgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDMyMDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LAorMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LAorMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LAorMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LDE0NiwxNDYsMTQ2LAorMTQyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MzI2NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsCisxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsCisxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsCisxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsCisxNDIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQzMzI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwKKzE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwKKzE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwKKzE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwKKzE0MgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDMzOTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLAorMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLAorMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLAorMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLAorMTQyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MzQ1NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsCisxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsCisxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsCisxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsMTQyLDE0MiwxNDIsCisxMDUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQzNTIwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwKKzEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwKKzEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwKKzEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwKKzEwNQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDM1ODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LAorMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LAorMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LAorMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LAorMTA1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0MzY0OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsCisxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsCisxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsCisxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsCisxMDUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQzNzEyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwKKzEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwKKzEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwKKzEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwxMDUsMTA1LDEwNSwKKzEwMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDM3NzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLAorMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLAorMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLAorMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLAorMTAxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0Mzg0MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsCisxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsCisxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsCisxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsCisxMDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQzOTA0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwKKzEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwKKzEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwKKzEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwKKzEwMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDM5NjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLAorMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLAorMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLAorMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLDEwMSwxMDEsMTAxLAorMTI2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NDAzMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsCisxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsCisxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsCisxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsCisxMjYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ0MDk2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwKKzEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwKKzEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwKKzEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwKKzEyNgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDQxNjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LAorMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LAorMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LAorMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LAorMTI2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NDIyNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsCisxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsCisxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsCisxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsMTI2LDEyNiwxMjYsCisxMjIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ0Mjg4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwKKzEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwKKzEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwKKzEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwKKzEyMgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDQzNTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLAorMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLAorMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLAorMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLAorMTIyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NDQxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsCisxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsCisxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsCisxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsCisxMjIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ0NDgwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwKKzEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwKKzEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwKKzEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwxMjIsMTIyLDEyMiwKKzM3OAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDQ1NDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LAorMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LAorMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LAorMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LAorMzc4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NDYwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsCiszNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsCiszNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsCiszNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsCiszNzgKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ0NjcyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwKKzM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwKKzM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwKKzM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwKKzM3OAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDQ3MzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LAorMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LAorMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LAorMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LDM3OCwzNzgsMzc4LAorMzc3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NDgwMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsCiszNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsCiszNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsCiszNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsCiszNzcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ0ODY0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywKKzM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywKKzM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywKKzM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywKKzM3NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDQ5MjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LAorMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LAorMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LAorMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LAorMzc3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NDk5MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsCiszNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsCiszNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsCiszNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsMzc3LDM3NywzNzcsCis5NgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDUwNTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorOTYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis5NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzk2LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorOTYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ1MTIwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzk2LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorOTYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis5NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzk2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NTE4NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis5NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzk2LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorOTYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis5NgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDUyNDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorOTYsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCis5NiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzk2LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMTMyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NTMxMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsMTMzLC0xLC0xLDEzMSwtMSwtMSwtMSwtMSwtMSwKKzEzMiwtMSwtMSwtMSwtMSwtMSwtMSwxMzMsLTEsLTEsMTMxLC0xLC0xLC0xLC0xLC0xLAorMTMyLC0xLC0xLC0xLC0xLC0xLC0xLDEzMywtMSwtMSwxMzEsLTEsLTEsLTEsLTEsLTEsCisxMzIsLTEsLTEsLTEsLTEsLTEsLTEsMTMzLC0xLC0xLDEzMSwtMSwtMSwtMSwtMSwtMSwKKzEzMgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDUzNzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLDEzMywtMSwtMSwxMzEsLTEsLTEsLTEsLTEsLTEsCisxMzIsLTEsLTEsLTEsLTEsLTEsLTEsMTMzLC0xLC0xLDEzMSwtMSwtMSwtMSwtMSwtMSwKKzEzMiwtMSwtMSwtMSwtMSwtMSwtMSwxMzMsLTEsLTEsMTMxLC0xLC0xLC0xLC0xLC0xLAorMTMyLC0xLC0xLC0xLC0xLC0xLC0xLDEzMywtMSwtMSwxMzEsLTEsLTEsLTEsLTEsLTEsCisxMzIKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ1NDQwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwxMzMsLTEsLTEsMTMxLC0xLC0xLC0xLC0xLC0xLAorMTMyLC0xLC0xLC0xLC0xLC0xLC0xLDEzMywtMSwtMSwxMzEsLTEsLTEsLTEsLTEsLTEsCisxMzIsLTEsLTEsLTEsLTEsLTEsLTEsMTMzLC0xLC0xLDEzMSwtMSwtMSwtMSwtMSwtMSwKKzEzMiwtMSwtMSwtMSwtMSwtMSwtMSwxMzMsLTEsLTEsMTMxLC0xLC0xLC0xLC0xLC0xLAorMTMyCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NTUwNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsLTEsLTEsLTEsLTEsLTEsMTMzLC0xLC0xLDEzMSwtMSwtMSwtMSwtMSwtMSwKKzEzMiwtMSwtMSwtMSwtMSwtMSwtMSwxMzMsLTEsLTEsMTMxLC0xLC0xLC0xLC0xLC0xLAorMTMyLC0xLC0xLC0xLC0xLC0xLC0xLDEzMywtMSwtMSwxMzEsLTEsLTEsLTEsLTEsLTEsCisxMzIsLTEsLTEsLTEsLTEsLTEsLTEsMTMzLC0xLC0xLDEzMSwtMSwtMSwtMSwtMSwtMSwKKzMwMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDU1NjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM0OCwzMDEsMzI1LDMwNiwtMSwzMDYsLTEsMzAzLDM0NSwzMDMsMzIyLDMwOCwtMSwzMDgsLTEsCiszMDEsMzQ4LDMwMSwzMjUsMzA2LC0xLDMwNiwtMSwzMDMsMzQ1LDMwMywzMjIsMzA4LC0xLDMwOCwtMSwKKzMwMSwzNDgsMzAxLDMyNSwzMDYsLTEsMzA2LC0xLDMwMywzNDUsMzAzLDMyMiwzMDgsLTEsMzA4LC0xLAorMzAxLDM0OCwzMDEsMzI1LDMwNiwtMSwzMDYsLTEsMzAzLDM0NSwzMDMsMzIyLDMwOCwtMSwzMDgsLTEsCiszMDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ1NjMyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNDgsMzAxLDMyNSwzMDYsLTEsMzA2LC0xLDMwMywzNDUsMzAzLDMyMiwzMDgsLTEsMzA4LC0xLAorMzAxLDM0OCwzMDEsMzI1LDMwNiwtMSwzMDYsLTEsMzAzLDM0NSwzMDMsMzIyLDMwOCwtMSwzMDgsLTEsCiszMDEsMzQ4LDMwMSwzMjUsMzA2LC0xLDMwNiwtMSwzMDMsMzQ1LDMwMywzMjIsMzA4LC0xLDMwOCwtMSwKKzMwMSwzNDgsMzAxLDMyNSwzMDYsLTEsMzA2LC0xLDMwMywzNDUsMzAzLDMyMiwzMDgsLTEsMzA4LC0xLAorMzAxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NTY5NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzQ4LDMwMSwzMjUsMzA2LC0xLDMwNiwtMSwzMDMsMzQ1LDMwMywzMjIsMzA4LC0xLDMwOCwtMSwKKzMwMSwzNDgsMzAxLDMyNSwzMDYsLTEsMzA2LC0xLDMwMywzNDUsMzAzLDMyMiwzMDgsLTEsMzA4LC0xLAorMzAxLDM0OCwzMDEsMzI1LDMwNiwtMSwzMDYsLTEsMzAzLDM0NSwzMDMsMzIyLDMwOCwtMSwzMDgsLTEsCiszMDEsMzQ4LDMwMSwzMjUsMzA2LC0xLDMwNiwtMSwzMDMsMzQ1LDMwMywzMjIsMzA4LC0xLDMwOCwtMSwKKzMwMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDU3NjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM0OCwzMDEsMzI1LDMwNiwtMSwzMDYsLTEsMzAzLDM0NSwzMDMsMzIyLDMwOCwtMSwzMDgsLTEsCiszMDEsMzQ4LDMwMSwzMjUsMzA2LC0xLDMwNiwtMSwzMDMsMzQ1LDMwMywzMjIsMzA4LC0xLDMwOCwtMSwKKzMwMSwzNDgsMzAxLDMyNSwzMDYsLTEsMzA2LC0xLDMwMywzNDUsMzAzLDMyMiwzMDgsLTEsMzA4LC0xLAorMzAxLDM0OCwzMDEsMzI1LDMwNiwtMSwzMDYsLTEsMzAzLDM0NSwzMDMsMzIyLDMwOCwtMSwzMDgsLTEsCiszMDAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ1ODI0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNDcsMzAwLDMyNCwzMDUsMzQ5LDMwNSwzMjYsMzAyLDM0NCwzMDIsMzIxLDMwNywzNDYsMzA3LDMyMywKKzMwMCwzNDcsMzAwLDMyNCwzMDUsMzQ5LDMwNSwzMjYsMzAyLDM0NCwzMDIsMzIxLDMwNywzNDYsMzA3LDMyMywKKzMwMCwzNDcsMzAwLDMyNCwzMDUsMzQ5LDMwNSwzMjYsMzAyLDM0NCwzMDIsMzIxLDMwNywzNDYsMzA3LDMyMywKKzMwMCwzNDcsMzAwLDMyNCwzMDUsMzQ5LDMwNSwzMjYsMzAyLDM0NCwzMDIsMzIxLDMwNywzNDYsMzA3LDMyMywKKzMwMAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDU4ODhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzM0NywzMDAsMzI0LDMwNSwzNDksMzA1LDMyNiwzMDIsMzQ0LDMwMiwzMjEsMzA3LDM0NiwzMDcsMzIzLAorMzAwLDM0NywzMDAsMzI0LDMwNSwzNDksMzA1LDMyNiwzMDIsMzQ0LDMwMiwzMjEsMzA3LDM0NiwzMDcsMzIzLAorMzAwLDM0NywzMDAsMzI0LDMwNSwzNDksMzA1LDMyNiwzMDIsMzQ0LDMwMiwzMjEsMzA3LDM0NiwzMDcsMzIzLAorMzAwLDM0NywzMDAsMzI0LDMwNSwzNDksMzA1LDMyNiwzMDIsMzQ0LDMwMiwzMjEsMzA3LDM0NiwzMDcsMzIzLAorMzAwCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NTk1MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzQ3LDMwMCwzMjQsMzA1LDM0OSwzMDUsMzI2LDMwMiwzNDQsMzAyLDMyMSwzMDcsMzQ2LDMwNywzMjMsCiszMDAsMzQ3LDMwMCwzMjQsMzA1LDM0OSwzMDUsMzI2LDMwMiwzNDQsMzAyLDMyMSwzMDcsMzQ2LDMwNywzMjMsCiszMDAsMzQ3LDMwMCwzMjQsMzA1LDM0OSwzMDUsMzI2LDMwMiwzNDQsMzAyLDMyMSwzMDcsMzQ2LDMwNywzMjMsCiszMDAsMzQ3LDMwMCwzMjQsMzA1LDM0OSwzMDUsMzI2LDMwMiwzNDQsMzAyLDMyMSwzMDcsMzQ2LDMwNywzMjMsCiszMDAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ2MDE2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszNDcsMzAwLDMyNCwzMDUsMzQ5LDMwNSwzMjYsMzAyLDM0NCwzMDIsMzIxLDMwNywzNDYsMzA3LDMyMywKKzMwMCwzNDcsMzAwLDMyNCwzMDUsMzQ5LDMwNSwzMjYsMzAyLDM0NCwzMDIsMzIxLDMwNywzNDYsMzA3LDMyMywKKzMwMCwzNDcsMzAwLDMyNCwzMDUsMzQ5LDMwNSwzMjYsMzAyLDM0NCwzMDIsMzIxLDMwNywzNDYsMzA3LDMyMywKKzMwMCwzNDcsMzAwLDMyNCwzMDUsMzQ5LDMwNSwzMjYsMzAyLDM0NCwzMDIsMzIxLDMwNywzNDYsMzA3LDMyMywKKzEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ2MDgwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKzEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKzEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ2MTQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKzEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKzEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ2MjA4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKzEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKzEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ2MjcyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKzEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsCisxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLAorMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwKKzAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ2MzM2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCiswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKzAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ2NDAwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCiswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKzAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ2NDY0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCiswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKzAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ2NTI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCiswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKzMxOQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDY1OTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LAorMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LAorMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LAorMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LAorMzE5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NjY1NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksCiszMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksCiszMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksCiszMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksCiszMTkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ2NzIwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwKKzMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwKKzMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwKKzMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwKKzMxOQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDY3ODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LAorMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LAorMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LAorMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LDMxOSwzMTksMzE5LAorMzE4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0Njg0OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsCiszMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsCiszMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsCiszMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsCiszMTgKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ2OTEyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwKKzMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwKKzMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwKKzMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwKKzMxOAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDY5NzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LAorMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LAorMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LAorMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LAorMzE4CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NzA0MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsCiszMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsCiszMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsCiszMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsMzE4LDMxOCwzMTgsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDcxMDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorMzkzLC0xLDM5NywtMSwzOTQsLTEsMzk4LC0xLDM5MSwtMSwzOTUsLTEsMzkyLC0xLDM5NiwtMSwKKzM5MywtMSwzOTcsLTEsMzk0LC0xLDM5OCwtMSwzOTEsLTEsMzk1LC0xLDM5MiwtMSwzOTYsLTEsCiszOTMsLTEsMzk3LC0xLDM5NCwtMSwzOTgsLTEsMzkxLC0xLDM5NSwtMSwzOTIsLTEsMzk2LC0xLAorMzkzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NzE2OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsMzk3LC0xLDM5NCwtMSwzOTgsLTEsMzkxLC0xLDM5NSwtMSwzOTIsLTEsMzk2LC0xLAorMzkzLC0xLDM5NywtMSwzOTQsLTEsMzk4LC0xLDM5MSwtMSwzOTUsLTEsMzkyLC0xLDM5NiwtMSwKKzM5MywtMSwzOTcsLTEsMzk0LC0xLDM5OCwtMSwzOTEsLTEsMzk1LC0xLDM5MiwtMSwzOTYsLTEsCiszOTMsLTEsMzk3LC0xLDM5NCwtMSwzOTgsLTEsMzkxLC0xLDM5NSwtMSwzOTIsLTEsMzk2LC0xLAorMzkzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NzIzMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsMzk3LC0xLDM5NCwtMSwzOTgsLTEsMzkxLC0xLDM5NSwtMSwzOTIsLTEsMzk2LC0xLAorMzkzLC0xLDM5NywtMSwzOTQsLTEsMzk4LC0xLDM5MSwtMSwzOTUsLTEsMzkyLC0xLDM5NiwtMSwKKzM5MywtMSwzOTcsLTEsMzk0LC0xLDM5OCwtMSwzOTEsLTEsMzk1LC0xLDM5MiwtMSwzOTYsLTEsCiszOTMsLTEsMzk3LC0xLDM5NCwtMSwzOTgsLTEsMzkxLC0xLDM5NSwtMSwzOTIsLTEsMzk2LC0xLAorMzkzCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NzI5NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorLTEsMzk3LC0xLDM5NCwtMSwzOTgsLTEsMzkxLC0xLDM5NSwtMSwzOTIsLTEsMzk2LC0xLAorMzkzLC0xLDM5NywtMSwzOTQsLTEsMzk4LC0xLDM5MSwtMSwzOTUsLTEsMzkyLC0xLDM5NiwtMSwKKzM5MywtMSwzOTcsLTEsMzk0LC0xLDM5OCwtMSwzOTEsLTEsMzk1LC0xLDM5MiwtMSwzOTYsLTEsCiszOTMsLTEsMzk3LC0xLDM5NCwtMSwzOTgsLTEsMzkxLC0xLDM5NSwtMSwzOTIsLTEsMzk2LC0xLAorMzE2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NzM2MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsCiszMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsCiszMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsCiszMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsCiszMTYKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ3NDI0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwKKzMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwKKzMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwKKzMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwKKzMxNgorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDc0ODhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LAorMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LAorMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LAorMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LAorMzE2CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NzU1MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsCiszMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsCiszMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsCiszMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsMzE2LDMxNiwzMTYsCistMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDc2MTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKy0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorODAsMTk4LDkzLC0xLDgyLC0xLDk1LC0xLDc2LDE5NCw4OSwtMSw3OCwtMSw5MSwtMSwKKzgwLDE5OCw5MywtMSw4MiwtMSw5NSwtMSw3NiwxOTQsODksLTEsNzgsLTEsOTEsLTEsCis4MCwxOTgsOTMsLTEsODIsLTEsOTUsLTEsNzYsMTk0LDg5LC0xLDc4LC0xLDkxLC0xLAorODAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ3NjgwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxOTgsOTMsLTEsODIsLTEsOTUsLTEsNzYsMTk0LDg5LC0xLDc4LC0xLDkxLC0xLAorODAsMTk4LDkzLC0xLDgyLC0xLDk1LC0xLDc2LDE5NCw4OSwtMSw3OCwtMSw5MSwtMSwKKzgwLDE5OCw5MywtMSw4MiwtMSw5NSwtMSw3NiwxOTQsODksLTEsNzgsLTEsOTEsLTEsCis4MCwxOTgsOTMsLTEsODIsLTEsOTUsLTEsNzYsMTk0LDg5LC0xLDc4LC0xLDkxLC0xLAorODAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ3NzQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxOTgsOTMsLTEsODIsLTEsOTUsLTEsNzYsMTk0LDg5LC0xLDc4LC0xLDkxLC0xLAorODAsMTk4LDkzLC0xLDgyLC0xLDk1LC0xLDc2LDE5NCw4OSwtMSw3OCwtMSw5MSwtMSwKKzgwLDE5OCw5MywtMSw4MiwtMSw5NSwtMSw3NiwxOTQsODksLTEsNzgsLTEsOTEsLTEsCis4MCwxOTgsOTMsLTEsODIsLTEsOTUsLTEsNzYsMTk0LDg5LC0xLDc4LC0xLDkxLC0xLAorODAKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ3ODA4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxOTgsOTMsLTEsODIsLTEsOTUsLTEsNzYsMTk0LDg5LC0xLDc4LC0xLDkxLC0xLAorODAsMTk4LDkzLC0xLDgyLC0xLDk1LC0xLDc2LDE5NCw4OSwtMSw3OCwtMSw5MSwtMSwKKzgwLDE5OCw5MywtMSw4MiwtMSw5NSwtMSw3NiwxOTQsODksLTEsNzgsLTEsOTEsLTEsCis4MCwxOTgsOTMsLTEsODIsLTEsOTUsLTEsNzYsMTk0LDg5LC0xLDc4LC0xLDkxLC0xLAorLTEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ3ODcyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCistMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKzc5LDE5Nyw5MiwtMSw4MSwtMSw5NCwtMSw3NSwxOTMsODgsLTEsNzcsLTEsOTAsLTEsCis3OSwxOTcsOTIsLTEsODEsLTEsOTQsLTEsNzUsMTkzLDg4LC0xLDc3LC0xLDkwLC0xLAorNzksMTk3LDkyLC0xLDgxLC0xLDk0LC0xLDc1LDE5Myw4OCwtMSw3NywtMSw5MCwtMSwKKzc5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0NzkzNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTk3LDkyLC0xLDgxLC0xLDk0LC0xLDc1LDE5Myw4OCwtMSw3NywtMSw5MCwtMSwKKzc5LDE5Nyw5MiwtMSw4MSwtMSw5NCwtMSw3NSwxOTMsODgsLTEsNzcsLTEsOTAsLTEsCis3OSwxOTcsOTIsLTEsODEsLTEsOTQsLTEsNzUsMTkzLDg4LC0xLDc3LC0xLDkwLC0xLAorNzksMTk3LDkyLC0xLDgxLC0xLDk0LC0xLDc1LDE5Myw4OCwtMSw3NywtMSw5MCwtMSwKKzc5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0ODAwMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTk3LDkyLC0xLDgxLC0xLDk0LC0xLDc1LDE5Myw4OCwtMSw3NywtMSw5MCwtMSwKKzc5LDE5Nyw5MiwtMSw4MSwtMSw5NCwtMSw3NSwxOTMsODgsLTEsNzcsLTEsOTAsLTEsCis3OSwxOTcsOTIsLTEsODEsLTEsOTQsLTEsNzUsMTkzLDg4LC0xLDc3LC0xLDkwLC0xLAorNzksMTk3LDkyLC0xLDgxLC0xLDk0LC0xLDc1LDE5Myw4OCwtMSw3NywtMSw5MCwtMSwKKzc5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0ODA2NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTk3LDkyLC0xLDgxLC0xLDk0LC0xLDc1LDE5Myw4OCwtMSw3NywtMSw5MCwtMSwKKzc5LDE5Nyw5MiwtMSw4MSwtMSw5NCwtMSw3NSwxOTMsODgsLTEsNzcsLTEsOTAsLTEsCis3OSwxOTcsOTIsLTEsODEsLTEsOTQsLTEsNzUsMTkzLDg4LC0xLDc3LC0xLDkwLC0xLAorNzksMTk3LDkyLC0xLDgxLC0xLDk0LC0xLDc1LDE5Myw4OCwtMSw3NywtMSw5MCwtMSwKKzMwOQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDgxMjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LAorMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LAorMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LAorMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LAorMzA5CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0ODE5MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksCiszMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksCiszMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksCiszMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksCiszMDkKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ4MjU2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwKKzMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwKKzMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwKKzMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwKKzMwOQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDgzMjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LAorMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LAorMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LAorMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LDMwOSwzMDksMzA5LAorMjAxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0ODM4NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsCisyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsCisyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsCisyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsCisyMDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ4NDQ4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwKKzIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwKKzIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwKKzIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwKKzIwMQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDg1MTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLAorMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLAorMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLAorMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLAorMjAxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0ODU3NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsCisyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsCisyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsCisyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsMjAxLDIwMSwyMDEsCiszMDQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ4NjQwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwKKzMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwKKzMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwKKzMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwKKzMwNAorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDg3MDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LAorMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LAorMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LAorMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LAorMzA0CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0ODc2OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsCiszMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsCiszMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsCiszMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsCiszMDQKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ4ODMyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwKKzMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwKKzMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwKKzMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwzMDQsMzA0LDMwNCwKKzMxNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDg4OTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LAorMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LAorMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LAorMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LAorMzE3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0ODk2MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsCiszMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsCiszMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsCiszMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsCiszMTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ5MDI0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCiszMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywKKzMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywKKzMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywKKzMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywKKzMxNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDkwODhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LAorMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LAorMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LAorMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LDMxNywzMTcsMzE3LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0OTE1MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ5MjE2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDkyODBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0OTM0NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ5NDA4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDk0NzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0OTUzNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ5NjAwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDk2NjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0OTcyOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ5NzkyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NDk4NTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q0OTkyMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDQ5OTg0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTAwNDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MDExMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUwMTc2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTAyNDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MDMwNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUwMzY4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTA0MzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MDQ5NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUwNTYwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTA2MjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MDY4OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUwNzUyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTA4MTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MDg4MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUwOTQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTEwMDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MTA3MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUxMTM2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTEyMDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MTI2NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUxMzI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTEzOTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MTQ1NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUxNTIwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTE1ODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MTY0OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUxNzEyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTE3NzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MTg0MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUxOTA0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTE5NjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MjAzMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUyMDk2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTIxNjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MjIyNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUyMjg4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTIzNTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MjQxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUyNDgwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTI1NDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MjYwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUyNjcyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTI3MzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MjgwMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUyODY0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTI5MjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1Mjk5MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUzMDU2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwKKzE4NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTMxMjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LAorMTg1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MzE4NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCisxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsMTg1LDE4NSwxODUsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTMyNDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUzMzEyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MzM3NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTM0NDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUzNTA0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1MzU2OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTM2MzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUzNjk2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1Mzc2MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTM4MjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDUzODg4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1Mzk1MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTQwMTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU0MDgwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NDE0NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTQyMDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU0MjcyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NDMzNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTQ0MDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU0NDY0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NDUyOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTQ1OTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU0NjU2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NDcyMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTQ3ODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU0ODQ4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NDkxMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTQ5NzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU1MDQwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NTEwNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTUxNjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU1MjMyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NTI5NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTUzNjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU1NDI0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NTQ4OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTU1NTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU1NjE2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NTY4MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTU3NDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU1ODA4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NTg3MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTU5MzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU2MDAwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NjA2NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTYxMjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU2MTkyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NjI1NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTYzMjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU2Mzg0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NjQ0OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTY1MTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU2NTc2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NjY0MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTY3MDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU2NzY4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NjgzMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTY4OTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU2OTYwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NzAyNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTcwODhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU3MTUyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxCisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NzIxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTcyODBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsCis0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSw0MSwKKzQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLDQxLAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NzM0NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU3NDA4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTc0NzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NzUzNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU3NjAwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTc2NjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NzcyOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU3NzkyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTc4NTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1NzkyMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU3OTg0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTgwNDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1ODExMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU4MTc2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTgyNDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1ODMwNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU4MzY4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTg0MzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1ODQ5NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU4NTYwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTg2MjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1ODY4OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU4NzUyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTg4MTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1ODg4MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU4OTQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTkwMDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1OTA3MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU5MTM2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTkyMDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1OTI2NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU5MzI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTkzOTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1OTQ1NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU5NTIwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTk1ODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1OTY0OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU5NzEyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTk3NzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q1OTg0MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDU5OTA0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NTk5NjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MDAzMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYwMDk2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjAxNjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MDIyNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYwMjg4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjAzNTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MDQxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYwNDgwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjA1NDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MDYwOFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYwNjcyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjA3MzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MDgwMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYwODY0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjA5MjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MDk5MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYxMDU2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjExMjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MTE4NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYxMjQ4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwKKzE1NQorI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjEzMTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LAorMTU1CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MTM3NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCisxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsMTU1LDE1NSwxNTUsCis5NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjE0NDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYxNTA0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzExNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjE1NjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MTYzMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCis5NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjE2OTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYxNzYwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzExNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjE4MjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MTg4OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCis5NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjE5NTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYyMDE2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzExNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjIwODBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MjE0NFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCis5NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjIyMDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYyMjcyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzExNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjIzMzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MjQwMFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCis5NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjI0NjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYyNTI4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzExNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjI1OTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MjY1NltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCis5NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjI3MjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYyNzg0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzExNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjI4NDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MjkxMltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCis5NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjI5NzZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYzMDQwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzExNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjMxMDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MzE2OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCis5NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjMyMzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYzMjk2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzExNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjMzNjBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MzQyNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCis5NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjM0ODhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYzNTUyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzExNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjM2MTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MzY4MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCis5NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjM3NDRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDYzODA4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzExNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjM4NzJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2MzkzNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCis5NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjQwMDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDY0MDY0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzExNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjQxMjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2NDE5MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCis5NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjQyNTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDY0MzIwW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzExNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjQzODRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2NDQ0OFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCis5NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjQ1MTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDY0NTc2W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzExNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjQ2NDBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2NDcwNFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCis5NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjQ3NjhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDY0ODMyW10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzExNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjQ4OTZbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2NDk2MFtdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCis5NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjUwMjRbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDY1MDg4W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzExNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjUxNTJbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2NTIxNltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCis5NworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjUyODBbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcKKyNpZmRlZiBfX0dOVUNfXworfTsKK3Nob3J0IGludCBpbnRfbGlzdDY1MzQ0W10gPSB7CisjZWxzZQorLAorI2VuZGlmCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LDk3LAorOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsOTcsCis5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5Nyw5NywKKzExNworI2lmZGVmIF9fR05VQ19fCit9Oworc2hvcnQgaW50IGludF9saXN0NjU0MDhbXSA9IHsKKyNlbHNlCissCisjZW5kaWYKKzExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LAorMTE3CisjaWZkZWYgX19HTlVDX18KK307CitzaG9ydCBpbnQgaW50X2xpc3Q2NTQ3MltdID0geworI2Vsc2UKKywKKyNlbmRpZgorMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsCisxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTcsMTE3LDExNywxMTd9OwpkaWZmIC0tZ2l0IGEvc2ltL3o4ay9tZW0uYyBiL3NpbS96OGsvbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0MmE2NgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS96OGsvbWVtLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qIG1lbW9yeSBzdXBwb3J0IGZvciBaOEtTSU0KKyAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgWjhLU0lNCisKK1o4S1NJTSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1o4S1NJTSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIFo4S1pJTTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPGFuc2lkZWNsLmg+CisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInRtLmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAic2ltLmgiCisKKyNkZWZpbmUgSU5MSU5FCitzdGF0aWMgCitsb25nCitzaXRvcHRyIChzaSkKK2xvbmcgc2k7Cit7CisgIHJldHVybiAoKHNpICYgMHhmZjAwMDAwMCkgPj4gOCkgfCAoc2kgJiAweGZmZmYpOworfQorCitzdGF0aWMKK3Vuc2lnbmVkIHNob3J0ICoKK2dldF9wYWdlX2FuZF9vZmZzZXQgKGNvbnRleHQsIHdoZXJlLCBvZmZzZXRfcHRyKQorICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKKyAgICAgc2ltX3BoeXNfYWRkcl90eXBlIHdoZXJlOworICAgICBpbnQgKm9mZnNldF9wdHI7Cit7CisgIC8qIElzIHRoZSBwYWdlIGFsbG9jYXRlZCA/ICovCisKKyAgaWYgKGNvbnRleHQtPm1lbW9yeSA9PSAwKQorICAgIHsKKyAgICAgIC8qIE11c3QgYWxsb2NhdGUgMTZNQiBpbiBvcmRlciB0byBydW4gWjgwMDEgcHJvZ3JhbXMuICAqLworICAgICAgY29udGV4dC0+bWVtb3J5ICA9ICh1bnNpZ25lZCBzaG9ydCAqKWNhbGxvYyg2NCoxMDI0KjY0LDQpOworICAgIH0KKworICAqb2Zmc2V0X3B0ciA9IHNpdG9wdHIod2hlcmUpOworICByZXR1cm4gY29udGV4dC0+bWVtb3J5OworfQorCit2b2lkCitzaW1fd3JpdGVfYnl0ZSAoY29udGV4dCwgd2hlcmUsIHdoYXQpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBzaW1fcGh5c19hZGRyX3R5cGUgd2hlcmU7CisgICAgIGludCB3aGF0OworeworICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworICBjaGFyICpwdHIgPSAoY2hhciAqKWdldF9wYWdlX2FuZF9vZmZzZXQgKGNvbnRleHQsIHdoZXJlLCAmb2Zmc2V0KTsKKworICBwdHJbb2Zmc2V0XSA9IHdoYXQ7Cit9CisKK3ZvaWQKK3NpbV93cml0ZV9zaG9ydCAoY29udGV4dCwgd2hlcmUsIHdoYXQpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBzaW1fcGh5c19hZGRyX3R5cGUgd2hlcmU7CisgICAgIGludCB3aGF0OworeworICBpbnQgb2Zmc2V0OworICBjaGFyICpwdHIgPSAoY2hhciAqKWdldF9wYWdlX2FuZF9vZmZzZXQgKGNvbnRleHQsIHdoZXJlLCAmb2Zmc2V0KTsKKworICBwdHJbb2Zmc2V0XSA9IHdoYXQgPj4gODsKKyAgcHRyW29mZnNldCArIDFdID0gd2hhdDsKK30KKwordm9pZAorc2ltX3dyaXRlX2xvbmcgKGNvbnRleHQsIHdoZXJlLCB3aGF0KQorICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKKyAgICAgc2ltX3BoeXNfYWRkcl90eXBlIHdoZXJlOworICAgICBpbnQgd2hhdDsKK3sKKyAgaW50IG9mZnNldDsKKyAgY2hhciAqcHRyID0gKGNoYXIgKilnZXRfcGFnZV9hbmRfb2Zmc2V0IChjb250ZXh0LCB3aGVyZSwgJm9mZnNldCk7CisKKyAgcHRyW29mZnNldF0gPSB3aGF0ID4+IDI0OworICBwdHJbb2Zmc2V0ICsgMV0gPSB3aGF0ID4+IDE2OworICBwdHJbb2Zmc2V0ICsgM10gPSB3aGF0ID4+IDg7CisgIHB0cltvZmZzZXQgKyA0XSA9IHdoYXQ7Cit9CisKK2ludAorc2ltX3JlYWRfYnl0ZSAoY29udGV4dCwgd2hlcmUpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBzaW1fcGh5c19hZGRyX3R5cGUgd2hlcmU7Cit7CisgIGludCBvZmZzZXQ7CisgIGNoYXIgKnB0ciA9IChjaGFyICopZ2V0X3BhZ2VfYW5kX29mZnNldCAoY29udGV4dCwgd2hlcmUsICZvZmZzZXQpOworCisgcmV0dXJuIHB0cltvZmZzZXRdOworfQorCit1bnNpZ25lZAorc2ltX3JlYWRfc2hvcnQgKGNvbnRleHQsIHdoZXJlKQorICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKKyAgICAgc2ltX3BoeXNfYWRkcl90eXBlIHdoZXJlOworeworICBpbnQgd2hhdDsKKyAgaW50IG9mZnNldDsKKworICBjaGFyICpwdHIgPSAoY2hhciAqKWdldF9wYWdlX2FuZF9vZmZzZXQgKGNvbnRleHQsIHdoZXJlLCAmb2Zmc2V0KTsKKworICB3aGF0ID0gKHB0cltvZmZzZXRdIDw8IDgpIHwgcHRyW29mZnNldCArIDFdOworICByZXR1cm4gd2hhdDsKK30KKworCisKZGlmZiAtLWdpdCBhL3NpbS96OGsvbWVtLmggYi9zaW0vejhrL21lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwODliZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vejhrL21lbS5oCkBAIC0wLDAgKzEsOCBAQAorI2RlZmluZSBaOGtfUEFHRV9TSVpFICgxPDxQQUdFX1BPV0VSKQorCitpbnQgc2ltX3JlYWRfYnl0ZSBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICosIHNpbV9waHlzX2FkZHJfdHlwZSkpOwordW5zaWduZWQgaW50IHNpbV9yZWFkX3Nob3J0IFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKiwgc2ltX3BoeXNfYWRkcl90eXBlKSk7Cit2b2lkIHNpbV93cml0ZV9sb25nIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKiwgc2ltX3BoeXNfYWRkcl90eXBlLAorCQkJICAgIGludCkpOwordm9pZCBzaW1fd3JpdGVfc2hvcnQgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqLCBzaW1fcGh5c19hZGRyX3R5cGUsIGludCkpOwordm9pZCBzaW1fd3JpdGVfYnl0ZSBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICosIHNpbV9waHlzX2FkZHJfdHlwZSwgaW50KSk7CmRpZmYgLS1naXQgYS9zaW0vejhrL3F1aWNrLmMgYi9zaW0vejhrL3F1aWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0N2M3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS96OGsvcXVpY2suYwpAQCAtMCwwICsxLDc4MyBAQAorLyogbGlzdCBvZiBvcGNvZGVzIHRvIGNvbXBpbGUgYWxsIHRoZSB3YXkgKi8KK2ludCBxdWlja1tdPQoreworI2lmIDAKKyAgLyogMTEwMDAwKi8gMHhjLAorICAvKiAgICAgMzUqLyAweDEwNCwKKyAgLyogICAgICA0Ki8gMHgxMDUsCisgIC8qICAgICAgMyovIDB4MTA3LAorICAvKiAgICAgMjAqLyAweDEwZCwKKyAgLyogICAgICAyKi8gMHgxZGMsCisgIC8qICAgICA2OSovIDB4MjBmLAorICAvKiAgICAgIDEqLyAweDQwZCwKKyAgLyogICAgIDQwKi8gMHg1MDEsCisgIC8qICAgICAgNyovIDB4NTA0LAorICAvKiAgICAgIDcqLyAweDUwNSwKKyAgLyogICAgICA2Ki8gMHg1MDgsCisgIC8qICAgICAgNiovIDB4NTA5LAorICAvKiAgICAgIDgqLyAweDYwOSwKKyAgLyogICAgMTE4Ki8gMHg2MGMsCisgIC8qICAgICAgMiovIDB4NzAyLAorICAvKiAgICAgODUqLyAweDcwNCwKKyAgLyogICAgIDg4Ki8gMHg3MDUsCisgIC8qICAgICAgMyovIDB4NzA3LAorICAvKiAgICAgIDUqLyAweDcwOCwKKyAgLyogICAgICA0Ki8gMHg3MDksCisgIC8qIDExMDAwMCovIDB4YTA4LAorICAvKiAxMDE1NzEqLyAweGEwOSwKKyAgLyogMTEwMDAwKi8gMHhhMGMsCisgIC8qIDEwMDAwMCovIDB4YTBmLAorICAvKiAzMDAwMDAqLyAweGE2ZCwKKyAgLyogMTAxNjgxKi8gMHhiMDIsCisgIC8qIDEwMDA3NyovIDB4YjA0LAorICAvKiAgICAgIDgqLyAweGIwNSwKKyAgLyogMTEwMDAwKi8gMHhiMDcsCisgIC8qICAxMDAwNSovIDB4YjA4LAorICAvKiAxNDAwMDAqLyAweGIwYSwKKyAgLyogMTAwMDM2Ki8gMHhiMGMsCisgIC8qIDEwMDA0MiovIDB4YjBkLAorICAvKiAgICAgIDMqLyAweGMyNSwKKyAgLyogMTA1MTU4Ki8gMHhjNTgsCisgIC8qIDMwMDIzNiovIDB4Yzc0LAorICAvKiAgICAgMjAqLyAweGQ0MSwKKyAgLyogMTAwMDA4Ki8gMHhkNDUsCisgIC8qICAgICAxMCovIDB4ZDUxLAorICAvKiAgICAgMTAqLyAweGQ1NCwKKyAgLyogMTEwMDAwKi8gMHhkYzUsCisgIC8qIDEwMDAwMCovIDB4ZGQ1LAorICAvKiAgICAgNzkqLyAweGRmOSwKKyAgLyogICAgICA2Ki8gMHgxMDA0LAorICAvKiAgICAgNTMqLyAweDEwMDgsCisgIC8qICAgICAgNSovIDB4MTNmNCwKKyAgLyogICAgICAxKi8gMHgxNDAyLAorICAvKiAgICAgIDIqLyAweDE0MDQsCisgIC8qICAgICAgMiovIDB4MTQwNiwKKyAgLyogICAgICA3Ki8gMHgxNDA4LAorICAvKiAgICAgIDQqLyAweDE2MDYsCisgIC8qICAgICA3MiovIDB4MWU0OCwKKyAgLyogICAgICA2Ki8gMHgxZjQwLAorICAvKiAxMDAwMDYqLyAweDIwNWUsCisgIC8qICAgICAgMiovIDB4MjA2OCwKKyAgLyogMTEwMDAwKi8gMHgyMDZjLAorICAvKiAxMTAwMDAqLyAweDIwN2MsCisgIC8qIDMwMDAwMCovIDB4MjA3ZCwKKyAgLyogMTAxNjQyKi8gMHgyMDg4LAorICAvKiAxMDE1MzkqLyAweDIwODksCisgIC8qIDEwMTY3OSovIDB4MjA4YywKKyAgLyogICAgIDQwKi8gMHgyMDljLAorICAvKiAgICAgIDgqLyAweDIxMDIsCisgIC8qIDEyMDAwOSovIDB4MjEwNCwKKyAgLyogMTEwMDAzKi8gMHgyMTA1LAorICAvKiAxMzAwMDAqLyAweDIxMDYsCisgIC8qIDExMDA2OCovIDB4MjEwNywKKyAgLyogICAgIDMyKi8gMHgyMTA4LAorICAvKiAgICAgIDEqLyAweDIxMDksCisgIC8qICAgIDEwNSovIDB4MjEwYywKKyAgLyogICAgICAxKi8gMHgyMTBkLAorICAvKiAgICAgIDMqLyAweDIxMjYsCisgIC8qICAgICAgMyovIDB4MjE0MiwKKyAgLyogMTIwMDAyKi8gMHgyMTQ0LAorICAvKiAxMDAwMTIqLyAweDIxNDUsCisgIC8qICAxMDAwMCovIDB4MjE0NywKKyAgLyogMTAwMDAwKi8gMHgyMTQ4LAorICAvKiAgICAgIDYqLyAweDIxNTYsCisgIC8qIDEwMDAwMCovIDB4MjE1NywKKyAgLyogMTAwMDAwKi8gMHgyMTU4LAorICAvKiAxMDE2NzcqLyAweDIxNjUsCisgIC8qIDEwMDAwMCovIDB4MjE2OCwKKyAgLyogMTEwMDAwKi8gMHgyMTc0LAorICAvKiAgICAgIDIqLyAweDIxOTAsCisgIC8qICAgICAgMiovIDB4MjE5OCwKKyAgLyogICAgICAyKi8gMHgyMWM0LAorICAvKiAgICAgIDIqLyAweDIxYzUsCisgIC8qIDExMDAwMCovIDB4MjFjOCwKKyAgLyogMTEwMDAwKi8gMHgyMWNhLAorICAvKiAgICAgIDIqLyAweDIxY2QsCisgIC8qIDEwMDAwMiovIDB4MjFkNywKKyAgLyogMTAwMDAwKi8gMHgyMWRjLAorICAvKiAxMDE2NzcqLyAweDI5NjAsCisgIC8qICAgICAgMiovIDB4MjljMCwKKyAgLyogICAgICA0Ki8gMHgyZTQ4LAorICAvKiAxMDE2NzcqLyAweDJlNWMsCisgIC8qIDEwMDAwMCovIDB4MmU3YywKKyAgLyogICAgIDMxKi8gMHgyZjI0LAorICAvKiAgICAgIDEqLyAweDJmMjgsCisgIC8qIDEwMDAwMCovIDB4MmY0NSwKKyAgLyogICAgICAzKi8gMHgyZjQ2LAorICAvKiAxMDAwMDAqLyAweDJmNDcsCisgIC8qIDEwMDAwMCovIDB4MmY0OCwKKyAgLyogMTAwMDAwKi8gMHgyZjU0LAorICAvKiAxMzAwMDAqLyAweDJmNTYsCisgIC8qIDEwMDAwMCovIDB4MmY1OCwKKyAgLyogIDEwMDAwKi8gMHgyZjY0LAorICAvKiAxMDAwMDAqLyAweDJmNjUsCisgIC8qIDEwMDAwMCovIDB4MmY3MiwKKyAgLyogMTEwMDAwKi8gMHgyZjc0LAorICAvKiAgMTAwMDAqLyAweDJmNzgsCisgIC8qIDExMDAwMCovIDB4MmZhNCwKKyAgLyogMTEwMDAwKi8gMHgyZmE4LAorICAvKiAgICAgIDEqLyAweDJmYzIsCisgIC8qIDEwMDAwMCovIDB4MmZjNCwKKyAgLyogMTAwMDAwKi8gMHgyZmM3LAorICAvKiAgICAgIDIqLyAweDJmYzgsCisgIC8qIDExMDAwMCovIDB4MmZjYSwKKyAgLyogMTAwMDAyKi8gMHgyZmRjLAorICAvKiAgICAgNzcqLyAweDMxNDQsCisgIC8qICAgICAgMyovIDB4MzE0NiwKKyAgLyogICAgICAyKi8gMHgzMzQyLAorICAvKiAgICAgIDMqLyAweDMzNDYsCisgIC8qIDEwMDAwMCovIDB4MzQ0NSwKKyAgLyogICAgICAyKi8gMHgzNDU0LAorICAvKiAxMDAwMDAqLyAweDM0NTYsCisgIC8qICAxMDAwMCovIDB4MzQ1OCwKKyAgLyogICAgICA2Ki8gMHgzNDU5LAorICAvKiAxMDAwMDAqLyAweDM0NjQsCisgIC8qIDEwMDAwMCovIDB4MzQ2OCwKKyAgLyogIDEwMDAwKi8gMHgzNDg1LAorICAvKiAxMDAwMDAqLyAweDM0ODYsCisgIC8qICAgICAgMSovIDB4MzRhMCwKKyAgLyogMTEwMDI2Ki8gMHgzNGE0LAorICAvKiAxMTAwNjkqLyAweDM0YTUsCisgIC8qIDExMDAxNCovIDB4MzRhNiwKKyAgLyogIDIwMDM4Ki8gMHgzNGE3LAorICAvKiAgICAgIDEqLyAweDM0YTksCisgIC8qICAgICAgMSovIDB4MzRhZCwKKyAgLyogMTAwMDAwKi8gMHgzNGM0LAorICAvKiAxMDAwMDAqLyAweDM0YzUsCisgIC8qICAgICAgMiovIDB4MzRkNCwKKyAgLyogMTAwMDAwKi8gMHgzNGY1LAorICAvKiAxMDAwMDAqLyAweDM0ZjcsCisgIC8qICAgICAgNCovIDB4NDEwMiwKKyAgLyogICAgICA0Ki8gMHg0MTA0LAorICAvKiAgICAgIDEqLyAweDQxNjksCisgIC8qIDExMDAwMCovIDB4NDFhNCwKKyAgLyogMTAwMDAwKi8gMHg0MWE1LAorICAvKiAxMDAwMDAqLyAweDQxYTYsCisgIC8qIDEwMDAwMCovIDB4NDFhOCwKKyAgLyogMTAwMDAwKi8gMHg0MWY0LAorICAvKiAxMDAwMDAqLyAweDQzMDIsCisgIC8qIDEwMDAwMCovIDB4NDMwNSwKKyAgLyogMTEwMDAwKi8gMHg0MzA4LAorICAvKiAgICAgIDEqLyAweDQzNjksCisgIC8qICAgICAgMSovIDB4NDNhNCwKKyAgLyogMTAwMDAwKi8gMHg0M2E1LAorICAvKiAxMDAwMDAqLyAweDQzYTgsCisgIC8qIDEwMDAwMCovIDB4NDNhOSwKKyAgLyogMTIwMDAwKi8gMHg0M2FjLAorICAvKiAgICAgIDIqLyAweDQzYzUsCisgIC8qIDEwMDAwMCovIDB4NDNmNSwKKyAgLyogMTAwMDAwKi8gMHg0M2ZhLAorICAvKiAxMTAwMDAqLyAweDQ1MDQsCisgIC8qICAgICAgNCovIDB4NDVhMSwKKyAgLyogICAgIDE4Ki8gMHg0NWE0LAorICAvKiAxMDAwMTgqLyAweDQ1YTUsCisgIC8qICAgICAgMSovIDB4NDk2OCwKKyAgLyogMTMwMDAwKi8gMHg0YTA4LAorICAvKiAxMDAwMDAqLyAweDRhMGIsCisgIC8qIDEwMDAwMCovIDB4NGFhYywKKyAgLyogICAgICAzKi8gMHg0YjY4LAorICAvKiAxMDAwMDAqLyAweDRiYTgsCisgIC8qIDEwMDAwMCovIDB4NGJhOSwKKyAgLyogICAgICA0Ki8gMHg0YmM1LAorICAvKiAxMTAwMDAqLyAweDRjMDEsCisgIC8qIDEyMDAwMCovIDB4NGMwNSwKKyAgLyogICAgIDMyKi8gMHg0Yzc4LAorICAvKiAxMDAwMDAqLyAweDRjYTEsCisgIC8qIDEwMDAwMCovIDB4NGNhNSwKKyAgLyogICAgICAxKi8gMHg0Y2M0LAorICAvKiAgICAgMjAqLyAweDRjZDQsCisgIC8qIDExMDAwNyovIDB4NGQwNCwKKyAgLyogMTEwMDA0Ki8gMHg0ZDA1LAorICAvKiAxMTAwMDAqLyAweDRkMDgsCisgIC8qICAgICAgMiovIDB4NGQyNSwKKyAgLyogICAgICAxKi8gMHg0ZDI4LAorICAvKiAgICAgIDgqLyAweDRkNDEsCisgIC8qIDEwMDAwMCovIDB4NGQ0NCwKKyAgLyogMTAwMDAwKi8gMHg0ZDQ1LAorICAvKiAxMDE2NzkqLyAweDRkNjQsCisgIC8qIDEwMDAzNCovIDB4NGRhMSwKKyAgLyogMTEwMDA1Ki8gMHg0ZGE0LAorICAvKiAxNDAwMTQqLyAweDRkYTUsCisgIC8qIDEwMDAwMSovIDB4NGRhOCwKKyAgLyogMTAwMDAzKi8gMHg0ZGM0LAorICAvKiAxMTAwMDAqLyAweDRkYzUsCisgIC8qICAgICAgMiovIDB4NGRkNCwKKyAgLyogMTAwMDAwKi8gMHg0ZGQ1LAorICAvKiAxMDAwMDAqLyAweDRkZjUsCisgIC8qICAgICAgMyovIDB4NGUyZCwKKyAgLyogIDMwMDAwKi8gMHg0ZWE4LAorICAvKiAgICAgNTIqLyAweDRlYTksCisgIC8qIDEwMDAwMCovIDB4NGVhYiwKKyAgLyogMTAwMDAwKi8gMHg0ZWFjLAorICAvKiAgICAgMzIqLyAweDRlYWQsCisgIC8qIDEwMDAwMCovIDB4NGVhZSwKKyAgLyogMTAwMDAwKi8gMHg0ZWFmLAorICAvKiAgICAgIDIqLyAweDRlYzgsCisgIC8qICAgICAgMiovIDB4NGVjZCwKKyAgLyogICAgICAzKi8gMHg1MGE2LAorICAvKiAgICAgMzIqLyAweDUwYTgsCisgIC8qICAgICAgMSovIDB4NTIwYywKKyAgLyogICAgIDE4Ki8gMHg1MmE4LAorICAvKiAgICAgIDIqLyAweDUzZjAsCisgIC8qICAgICAgNiovIDB4NTNmNCwKKyAgLyogICAgICAzKi8gMHg1M2ZhLAorICAvKiAgICAgIDEqLyAweDU0MDYsCisgIC8qICAgICAgOCovIDB4NTQ0OCwKKyAgLyogICAgICA0Ki8gMHg1NGEyLAorICAvKiAgICAgNDIqLyAweDU0YTQsCisgIC8qICAgICAxMCovIDB4NTRhNiwKKyAgLyogICAgMzIyKi8gMHg1NGE4LAorICAvKiAgICAgIDMqLyAweDU2YTQsCisgIC8qICAgICAgMyovIDB4NTZhNiwKKyAgLyogMTEwMDAwKi8gMHg1OWE0LAorICAvKiAxMDAwMDAqLyAweDU5ZjQsCisgIC8qICAgICAgNCovIDB4NWQwMiwKKyAgLyogICAgICAxKi8gMHg1ZDBjLAorICAvKiAgICAgIDIqLyAweDVkNDgsCisgIC8qICAgICAzMyovIDB4NWRhNCwKKyAgLyogICAgIDQ4Ki8gMHg1ZGE2LAorICAvKiAgICAyMTMqLyAweDVkYTgsCisgIC8qICAgICAzMiovIDB4NWUwMSwKKyAgLyogMTEwMDA1Ki8gMHg1ZTAyLAorICAvKiAxMDAwMDUqLyAweDVlMDMsCisgIC8qIDEwMTcyOCovIDB4NWUwNiwKKyAgLyogICAgIDMxKi8gMHg1ZTA3LAorICAvKiAxMDAyNjYqLyAweDVlMDgsCisgIC8qIDEwMDAwNiovIDB4NWUwOSwKKyAgLyogMTAwMDMzKi8gMHg1ZTBhLAorICAvKiAxMDAwODAqLyAweDVlMGIsCisgIC8qIDEwMDAzMCovIDB4NWUwZSwKKyAgLyogICAgICAxKi8gMHg1ZTBmLAorICAvKiAyNjIwMzIqLyAweDVmMDAsCisgIC8qIDExMDAwMCovIDB4NjAwOCwKKyAgLyogMTAwMDAwKi8gMHg2MDA5LAorICAvKiAgICAgIDIqLyAweDYwMGMsCisgIC8qIDExMDAwMCovIDB4NjA0YywKKyAgLyogICAgICA0Ki8gMHg2MDRkLAorICAvKiAgICAgIDYqLyAweDYwNmYsCisgIC8qICAgICAzNiovIDB4NjA4OSwKKyAgLyogMTQwMDY0Ki8gMHg2MGE4LAorICAvKiAgICAgNDgqLyAweDYwYTksCisgIC8qIDEwMDA5NiovIDB4NjBhYywKKyAgLyogMTAwMDAwKi8gMHg2MGFkLAorICAvKiAgICAgIDIqLyAweDYwYzgsCisgIC8qICAgICAxOSovIDB4NjBjYywKKyAgLyogICAgICAyKi8gMHg2MGNkLAorICAvKiAgICAgIDgqLyAweDYwZGMsCisgIC8qIDEyMDAwOSovIDB4NjEwNCwKKyAgLyogMTIwMDMyKi8gMHg2MTA1LAorICAvKiAxMTAwMDEqLyAweDYxMDYsCisgIC8qIDExMDAwMCovIDB4NjEwNywKKyAgLyogICAgICAyKi8gMHg2MTA4LAorICAvKiAgICAgIDEqLyAweDYxMDksCisgIC8qICAgICAgMSovIDB4NjEwZCwKKyAgLyogICAgICAxKi8gMHg2MTBmLAorICAvKiAgICAgIDQqLyAweDYxNDUsCisgIC8qIDEwMDAwMCovIDB4NjE0NywKKyAgLyogICAgICAyKi8gMHg2MTRjLAorICAvKiAgICAgIDIqLyAweDYxNGQsCisgIC8qIDEwMDAwMCovIDB4NjE1NywKKyAgLyogMTAwMDAyKi8gMHg2MTU4LAorICAvKiAgICAgIDMqLyAweDYxNTksCisgIC8qICAgICAgNiovIDB4NjE2NSwKKyAgLyogICAgIDEyKi8gMHg2MTY4LAorICAvKiAgICAgMzIqLyAweDYxODEsCisgIC8qICAgICAgNCovIDB4NjE5MSwKKyAgLyogICAgICAyKi8gMHg2MTk0LAorICAvKiAgICAgIDIqLyAweDYxOTgsCisgIC8qICAgICA2OCovIDB4NjFhMCwKKyAgLyogMTAxNjgyKi8gMHg2MWExLAorICAvKiAxMTAwNjYqLyAweDYxYTIsCisgIC8qIDEwMDA0MCovIDB4NjFhMywKKyAgLyogMTIwMjMyKi8gMHg2MWE0LAorICAvKiAxMTAxNzIqLyAweDYxYTUsCisgIC8qIDEwMTgwMCovIDB4NjFhNiwKKyAgLyogMTEwMTE5Ki8gMHg2MWE3LAorICAvKiAxNDM5MjMqLyAweDYxYTgsCisgIC8qIDExMDA5OCovIDB4NjFhOSwKKyAgLyogICAgIDQ0Ki8gMHg2MWFjLAorICAvKiAgICAgIDQqLyAweDYxYzAsCisgIC8qICAgICAgMiovIDB4NjFjNCwKKyAgLyogICAgICAxKi8gMHg2MWM1LAorICAvKiAxMTAwMDIqLyAweDYxYzcsCisgIC8qICAgICAgMyovIDB4NjFjOCwKKyAgLyogMTAwMDAwKi8gMHg2MWQ0LAorICAvKiAgICAgIDIqLyAweDYxZDgsCisgIC8qICAgICAgMiovIDB4NjFkYywKKyAgLyogMTAwMDAwKi8gMHg2MWYzLAorICAvKiAxMDAwMDAqLyAweDYxZjQsCisgIC8qIDEwMDAwMCovIDB4NjFmNSwKKyAgLyogMTAwMDAwKi8gMHg2MWY3LAorICAvKiAxMDAwMDAqLyAweDYxZmIsCisgIC8qIDEwMDAwMCovIDB4NjhhMCwKKyAgLyogMTEwMDAwKi8gMHg2OTQwLAorICAvKiAxMTAwMzIqLyAweDY5YTAsCisgIC8qIDEwMDAwMCovIDB4NjlmMCwKKyAgLyogICAgICAyKi8gMHg2YjQwLAorICAvKiAxMDE2NzkqLyAweDZiNjAsCisgIC8qIDEwMDA0NCovIDB4NmJhMCwKKyAgLyogICAgICAyKi8gMHg2YmMwLAorICAvKiAgICAgIDYqLyAweDZmMDIsCisgIC8qIDEyMDAwMCovIDB4NmYwNCwKKyAgLyogMTAwMDAyKi8gMHg2ZjA1LAorICAvKiAgICAgIDcqLyAweDZmNDUsCisgIC8qIDExMDAwMCovIDB4NmY0NywKKyAgLyogMTAwMDA3Ki8gMHg2ZjQ4LAorICAvKiAgICAgMTUqLyAweDZmNDksCisgIC8qIDEwMDAwMCovIDB4NmY0YiwKKyAgLyogMTAwMDAwKi8gMHg2ZjU0LAorICAvKiAxMDAwMDAqLyAweDZmNTgsCisgIC8qICAxMDAwMCovIDB4NmY2NCwKKyAgLyogIDEwMDAwKi8gMHg2ZjY4LAorICAvKiAgICAgIDIqLyAweDZmOTQsCisgIC8qICAgIDE0NSovIDB4NmZhMCwKKyAgLyogMTAxNzE0Ki8gMHg2ZmExLAorICAvKiAgICAgOTQqLyAweDZmYTIsCisgIC8qIDEyMDA2MCovIDB4NmZhNCwKKyAgLyogMTAwMTA5Ki8gMHg2ZmE1LAorICAvKiAxMDAxMjMqLyAweDZmYTYsCisgIC8qIDEwMDE1NyovIDB4NmZhNywKKyAgLyogMTExODQyKi8gMHg2ZmE4LAorICAvKiAxMDAwOTEqLyAweDZmYTksCisgIC8qICAgICAgNCovIDB4NmZjMCwKKyAgLyogICAgICAxKi8gMHg2ZmMyLAorICAvKiAgICAgIDEqLyAweDZmYzUsCisgIC8qICAgICAgMSovIDB4NmZjZCwKKyAgLyogICAgICAyKi8gMHg2ZmQ4LAorICAvKiAxMDAwMDAqLyAweDZmZjQsCisgIC8qICAgICA1NiovIDB4NzA1YywKKyAgLyogMTAwMDAwKi8gMHg3MDZkLAorICAvKiAxMDAwMDAqLyAweDcwNzgsCisgIC8qIDEwMDAwMCovIDB4NzA4ZCwKKyAgLyogMTAwMDAwKi8gMHg3MDhlLAorICAvKiAxMDAwMDAqLyAweDcwOWUsCisgIC8qIDExMDAwMCovIDB4NzBkZCwKKyAgLyogMTEwMDAwKi8gMHg3MTU3LAorICAvKiAxMDAwMDAqLyAweDcxNWIsCisgIC8qICAgICA1NiovIDB4NzI3YywKKyAgLyogMTIwMDAwKi8gMHg3MzQ4LAorICAvKiAgICAgMzEqLyAweDc0MjQsCisgIC8qIDEwMDAwMCovIDB4NzQ0NiwKKyAgLyogMTAwMDAwKi8gMHg3NDQ3LAorICAvKiAgMTAwMDAqLyAweDc0NDksCisgIC8qIDEyMDAwMCovIDB4NzQ1NCwKKyAgLyogICAgICAyKi8gMHg3NDY4LAorICAvKiAgICAgMzIqLyAweDc0NzIsCisgIC8qIDExMDAwMCovIDB4NzRhNCwKKyAgLyogMTAwMDAwKi8gMHg3NGI0LAorICAvKiAxMDAwMDAqLyAweDc0YjUsCisgIC8qICAgICAxMCovIDB4NzRjMiwKKyAgLyogMTAwMDAwKi8gMHg3NGM0LAorICAvKiAgICAgMzIqLyAweDc0ZDQsCisgIC8qICAgICAgMSovIDB4N2YwMSwKKyAgLyogICAgICAyKi8gMHg3ZjA0LAorICAvKiAgICAgIDIqLyAweDdmMTMsCisgIC8qICAgICAgMSovIDB4N2YxNiwKKyAgLyogICAgICAyKi8gMHg3ZjE3LAorICAvKiAgICAgIDIqLyAweDgxMjgsCisgIC8qIDE5MDA5MSovIDB4ODE0NCwKKyAgLyogMTAwMDAwKi8gMHg4MTQ1LAorICAvKiAxMDAwMDAqLyAweDgxNTQsCisgIC8qIDExMDAwMCovIDB4ODE1NSwKKyAgLyogMTAwMDAwKi8gMHg4MTU2LAorICAvKiAxMDAwMDAqLyAweDgxNjQsCisgIC8qIDEwMDAwMCovIDB4ODE2NSwKKyAgLyogMTEwMDAwKi8gMHg4MTY2LAorICAvKiAxMDAwMDAqLyAweDgxNjcsCisgIC8qIDE0MDAwMCovIDB4ODE3NiwKKyAgLyogMTAwMDAwKi8gMHg4MTc3LAorICAvKiAxMzAwMDAqLyAweDgxODQsCisgIC8qICAgICA0MCovIDB4ODE4YywKKyAgLyogMTAwMDAwKi8gMHg4MTk0LAorICAvKiAxMTAwMDAqLyAweDgxYjQsCisgIC8qIDEwMDAwMCovIDB4ODFiYiwKKyAgLyogICAgICAyKi8gMHg4MWM5LAorICAvKiAgICAgMzYqLyAweDgxZDAsCisgIC8qICAgICAgNCovIDB4ODFkMSwKKyAgLyogICAgIDQwKi8gMHg4MWRjLAorICAvKiAxMTE2NzcqLyAweDgyMjIsCisgIC8qIDExMDA3NiovIDB4ODI0NCwKKyAgLyogMTAwMDM4Ki8gMHg4MjU1LAorICAvKiAxMTAwMDYqLyAweDgyNjYsCisgIC8qIDEzMTY3OSovIDB4ODI3NywKKyAgLyogICAgMTA3Ki8gMHg4MzAwLAorICAvKiAgICAxMzEqLyAweDgzMTEsCisgIC8qIDE0MDAxNSovIDB4ODMyMiwKKyAgLyogICAgICAyKi8gMHg4MzJkLAorICAvKiAxMTAwNTYqLyAweDgzNDIsCisgIC8qIDEwMDAxOSovIDB4ODM0NCwKKyAgLyogMTAwMDAwKi8gMHg4MzUyLAorICAvKiAxMDAwMDAqLyAweDgzNTQsCisgIC8qIDExMDAwMyovIDB4ODM1NSwKKyAgLyogMTAwMDAxKi8gMHg4MzY2LAorICAvKiAgICAgIDYqLyAweDgzNzcsCisgIC8qICAgICA3MSovIDB4ODM4OCwKKyAgLyogICAgICAyKi8gMHg4MzhkLAorICAvKiAgICAgMzQqLyAweDgzOTksCisgIC8qIDEwMDAwMCovIDB4ODNhNCwKKyAgLyogMTIwMDAyKi8gMHg4M2M0LAorICAvKiAgICAgIDQqLyAweDgzYzgsCisgIC8qICAgIDExMyovIDB4ODNjYywKKyAgLyogICAgICAyKi8gMHg4M2Q0LAorICAvKiAgICAgIDQqLyAweDg0YzksCisgIC8qICAgICAgNCovIDB4ODRkOSwKKyAgLyogICAgICAzKi8gMHg4NTI0LAorICAvKiAgICAgIDQqLyAweDg1NTksCisgIC8qIDEwMDAwMCovIDB4OGFkYywKKyAgLyogIDEwMDAwKi8gMHg4YWU4LAorICAvKiAxMDAwMDAqLyAweDhhZTksCisgIC8qIDEzMDAwMCovIDB4OGFlZiwKKyAgLyogMTAwMDAwKi8gMHg4YWY4LAorICAvKiAgICAgIDIqLyAweDhiMjYsCisgIC8qICAyMDAwMCovIDB4OGIyOCwKKyAgLyogICAgICAxKi8gMHg4YjQ1LAorICAvKiAxMDAwMDAqLyAweDhiNDgsCisgIC8qICAgICAzMiovIDB4OGI0OSwKKyAgLyogIDIwMDAwKi8gMHg4YjU2LAorICAvKiAgMTAwMDAqLyAweDhiNTgsCisgIC8qIDEwMDAwMCovIDB4OGI1OSwKKyAgLyogMTA1MTU4Ki8gMHg4YjY1LAorICAvKiAxMDAwMDAqLyAweDhiNjgsCisgIC8qICAgICAgMiovIDB4OGI3NSwKKyAgLyogICAgICAyKi8gMHg4YjgyLAorICAvKiAgICAyNjAqLyAweDhiOGMsCisgIC8qIDEwMDAwMCovIDB4OGJhMywKKyAgLyogMTAwMDAwKi8gMHg4YmFiLAorICAvKiAxMDAwMDAqLyAweDhiYzIsCisgIC8qIDEwMDAwMCovIDB4OGJjMywKKyAgLyogIDEwMDAwKi8gMHg4YmM4LAorICAvKiAgMTAwMDIqLyAweDhiYzksCisgIC8qICAgICAgMiovIDB4OGJkNSwKKyAgLyogICAgICA0Ki8gMHg4YmQ5LAorICAvKiAgICAgMzIqLyAweDhiZGMsCisgIC8qIDEwMTY3NCovIDB4OGM4NCwKKyAgLyogMTAwMDYzKi8gMHg4Y2M0LAorICAvKiAgICAgIDEqLyAweDhjZTIsCisgIC8qIDEwMDAwMCovIDB4OGNlNCwKKyAgLyogICAgIDMyKi8gMHg4ZDA0LAorICAvKiAgICAxMDcqLyAweDhkMTQsCisgIC8qIDE0MDAxOSovIDB4OGQyNCwKKyAgLyogICAgIDIwKi8gMHg4ZDI4LAorICAvKiAxMDAwNDAqLyAweDhkNDQsCisgIC8qIDEyMDAwMyovIDB4OGQ0OCwKKyAgLyogMTEwMDEzKi8gMHg4ZDU0LAorICAvKiAgICAgIDIqLyAweDhkNTgsCisgIC8qICAgICAgMiovIDB4OGQ2MiwKKyAgLyogMTAwMDg4Ki8gMHg4ZDY0LAorICAvKiAgICAyMTgqLyAweDhkODQsCisgIC8qICAgICA5MSovIDB4OGRjNCwKKyAgLyogICAgIDg1Ki8gMHg4ZGQ0LAorICAvKiAxMTAxMjcqLyAweDkxZmMsCisgIC8qICAgICAgMSovIDB4OTNmMCwKKyAgLyogICAgIDM2Ki8gMHg5M2YxLAorICAvKiAgICAgIDMqLyAweDkzZjQsCisgIC8qICAgICAgMSovIDB4OTNmOCwKKyAgLyogICAgICA2Ki8gMHg5M2Y5LAorICAvKiAxNDIwMzcqLyAweDkzZmEsCisgIC8qIDEyMDAxNSovIDB4OTNmYywKKyAgLyogMTAwMDAwKi8gMHg5NDIwLAorICAvKiAgICAgIDQqLyAweDk0MjYsCisgIC8qICAgICAgMSovIDB4OTQyYywKKyAgLyogICAgIDQyKi8gMHg5NDQ2LAorICAvKiAgICAgIDEqLyAweDk0NjIsCisgIC8qICAgICAgMyovIDB4OTQ2NCwKKyAgLyogICAgICAxKi8gMHg5NGM0LAorICAvKiAgICAgIDEqLyAweDk0YzYsCisgIC8qIDExMDEyNiovIDB4OTVmYywKKyAgLyogICAgICAzKi8gMHg5NjQ2LAorICAvKiAgICAgMzIqLyAweDk2NjYsCisgIC8qICAgIDExMCovIDB4OTY4OCwKKyAgLyogMTQyMDMzKi8gMHg5N2ZhLAorICAvKiAxMjAwMTQqLyAweDk3ZmMsCisgIC8qICAgICAgMSovIDB4OWE0MCwKKyAgLyogMTEwMTEyKi8gMHg5YjIwLAorICAvKiAxMDAwMDAqLyAweDliNDAsCisgIC8qICAgICA2NCovIDB4OWM0OCwKKyAgLyogICAgIDM4Ki8gMHg5Yzg4LAorICAvKiAxMDAwMDAqLyAweDllMDYsCisgIC8qIDI2MjAzNSovIDB4OWUwOCwKKyAgLyogMTEwMDAwKi8gMHg5ZTBlLAorICAvKiAxMDAwMDIqLyAweGEwOGMsCisgIC8qICAgICAzMiovIDB4YTA4ZCwKKyAgLyogIDIwMDAwKi8gMHhhMDhmLAorICAvKiAgICAgIDgqLyAweGEwYWMsCisgIC8qIDExMTY4MSovIDB4YTBjYSwKKyAgLyogMTAwMDAwKi8gMHhhMGNkLAorICAvKiAxMTAwMDEqLyAweGEwY2UsCisgIC8qIDEwMTY4NCovIDB4YTBjZiwKKyAgLyogMTAwMDMyKi8gMHhhMGRjLAorICAvKiAxMTAwMDAqLyAweGEwZGYsCisgIC8qIDEwMDAwMCovIDB4YTBlYywKKyAgLyogMTAwMDA2Ki8gMHhhMGVkLAorICAvKiAxMDE2NzcqLyAweGEwZmMsCisgIC8qICAgICAgNiovIDB4YTBmZSwKKyAgLyogMTAwMDU2Ki8gMHhhMTA0LAorICAvKiAxMDAwMDAqLyAweGExMDUsCisgIC8qIDEwMDAwMCovIDB4YTEwOCwKKyAgLyogMTEwMDAwKi8gMHhhMTE0LAorICAvKiAxMDAwMDAqLyAweGExMTUsCisgIC8qICAgICA1NiovIDB4YTExNiwKKyAgLyogMTAwMDMyKi8gMHhhMTI0LAorICAvKiAgICAgNzYqLyAweGExMmQsCisgIC8qICAgICAgMSovIDB4YTEzNCwKKyAgLyogICAgIDQwKi8gMHhhMTNkLAorICAvKiAxMDAwMDAqLyAweGExNDEsCisgIC8qIDEwMDA0MSovIDB4YTE0MiwKKyAgLyogICAgICAxKi8gMHhhMTQzLAorICAvKiAgICAgIDEqLyAweGExNDQsCisgIC8qIDExMDAwOSovIDB4YTE0NSwKKyAgLyogMTAwMDA3Ki8gMHhhMTQ2LAorICAvKiAxMDAwMDgqLyAweGExNDcsCisgIC8qIDExMDAwMCovIDB4YTE0OCwKKyAgLyogMTAwMDAwKi8gMHhhMTQ5LAorICAvKiAxMDAwMDAqLyAweGExNGEsCisgIC8qIDEwMDAwMCovIDB4YTE0YiwKKyAgLyogMTEwMDAwKi8gMHhhMTRjLAorICAvKiAxMDAwMDIqLyAweGExNGQsCisgIC8qIDEwMDAwMCovIDB4YTE1MCwKKyAgLyogMTAwMDA0Ki8gMHhhMTU0LAorICAvKiAxMDAwMDAqLyAweGExNTYsCisgIC8qIDEwMDAwNiovIDB4YTE1NywKKyAgLyogMTAwMDAwKi8gMHhhMTU4LAorICAvKiAxMDAwMDAqLyAweGExNTksCisgIC8qIDEwMDAwMCovIDB4YTE1YSwKKyAgLyogMTEwMDAwKi8gMHhhMTVjLAorICAvKiAxMDAwMDIqLyAweGExNWQsCisgIC8qICAgIDExMiovIDB4YTE2MSwKKyAgLyogMTIwMDA2Ki8gMHhhMTY0LAorICAvKiAxMDAwMDYqLyAweGExNjUsCisgIC8qIDEwMDAwMCovIDB4YTE2NywKKyAgLyogICAgICA2Ki8gMHhhMTY4LAorICAvKiAgMTAwMDAqLyAweGExNmIsCisgIC8qIDEyMDAxMiovIDB4YTE2YywKKyAgLyogMTAwMDYyKi8gMHhhMTcyLAorICAvKiAgICAgNjAqLyAweGExNzQsCisgIC8qIDEwMDAwMCovIDB4YTE3NSwKKyAgLyogMTAwMDAwKi8gMHhhMTc2LAorICAvKiAgICAgIDYqLyAweGExNzksCisgIC8qIDExMDAwMCovIDB4YTE3YSwKKyAgLyogMTEwMDA4Ki8gMHhhMTdjLAorICAvKiAxMTAwMTQqLyAweGExN2QsCisgIC8qIDExMDAwMCovIDB4YTE4NCwKKyAgLyogMTEwMDAwKi8gMHhhMTg1LAorICAvKiAgMjAwMDAqLyAweGExODYsCisgIC8qIDEwMDAwNCovIDB4YTE4OSwKKyAgLyogMTAwMDAwKi8gMHhhMThiLAorICAvKiAgICAgIDQqLyAweGExOTEsCisgIC8qICAgICA1NiovIDB4YTE5MiwKKyAgLyogMTAwMDAwKi8gMHhhMWExLAorICAvKiAxMDAwMDAqLyAweGExYTUsCisgIC8qIDExMDAwMCovIDB4YTFhNiwKKyAgLyogMTEwMDAwKi8gMHhhMWE3LAorICAvKiAxMTIwMzMqLyAweGExYWYsCisgIC8qICAxMDAwMCovIDB4YTFjMSwKKyAgLyogMTAwMDYyKi8gMHhhMWMyLAorICAvKiAxMTAwMDkqLyAweGExYzQsCisgIC8qIDExMDAwNSovIDB4YTFjNSwKKyAgLyogMTIwMDAwKi8gMHhhMWM2LAorICAvKiAgICAgMTUqLyAweGExYzcsCisgIC8qICAgICAgNCovIDB4YTFkMCwKKyAgLyogICAgICAyKi8gMHhhMWQyLAorICAvKiAgICAgIDQqLyAweGExZDQsCisgIC8qIDEwMDAwNCovIDB4YTFkNSwKKyAgLyogMTIwMDM2Ki8gMHhhMWQ2LAorICAvKiAxMTAwMDQqLyAweGExZDcsCisgIC8qIDExMjAzOCovIDB4YTFmYSwKKyAgLyogIDIwMDAwKi8gMHhhODgwLAorICAvKiAxMDE0OTkqLyAweGE5MTAsCisgIC8qICAgICAgMyovIDB4YTkyMSwKKyAgLyogMTAwMDAyKi8gMHhhOTQwLAorICAvKiAxMDAwMDAqLyAweGE5NDEsCisgIC8qIDEwMDAwMCovIDB4YTk0MywKKyAgLyogMTAwMDAwKi8gMHhhOTQ1LAorICAvKiAxMTAwMDAqLyAweGE5NDksCisgIC8qIDEwNTE2MCovIDB4YTk1MCwKKyAgLyogMTIwMDAwKi8gMHhhOTU1LAorICAvKiAxMDAwMDAqLyAweGE5NTksCisgIC8qIDMxMDAwNSovIDB4YTk2MCwKKyAgLyogMTAwMDAwKi8gMHhhOTY1LAorICAvKiAgICAgIDEqLyAweGE5NjcsCisgIC8qIDI5MDE4MCovIDB4YTk3MCwKKyAgLyogMTMwMDAwKi8gMHhhOTcxLAorICAvKiAgICAgIDMqLyAweGE5NzQsCisgIC8qIDExMTc1MSovIDB4YTk4MCwKKyAgLyogMTAwMDM2Ki8gMHhhOTgxLAorICAvKiAxMDAwMDAqLyAweGE5ODQsCisgIC8qICAgICAgMSovIDB4YTk4NywKKyAgLyogMTAwMDQwKi8gMHhhOTkwLAorICAvKiAgICAgIDUqLyAweGE5OTEsCisgIC8qICAgICAgMiovIDB4YTk5MywKKyAgLyogICAgICAxKi8gMHhhOTk3LAorICAvKiAxMTAwMDAqLyAweGE5YTAsCisgIC8qIDEwMDE5NCovIDB4YTljMCwKKyAgLyogMTAwMDAwKi8gMHhhOWQwLAorICAvKiAgICAgNjMqLyAweGE5ZjEsCisgIC8qICAgICA0MCovIDB4YTlmMywKKyAgLyogMTEwMDAwKi8gMHhhYjQwLAorICAvKiAxMDAwMDQqLyAweGFiNTAsCisgIC8qICAgICA1NiovIDB4YWI4MCwKKyAgLyogICAgIDU1Ki8gMHhhYmMwLAorICAvKiAxMDAwNjkqLyAweGFiZjEsCisgIC8qIDEwMDAwMCovIDB4YWJmMywKKyAgLyogMTAwMDAxKi8gMHhhYmY1LAorICAvKiAxMDAwMDYqLyAweGFiZjcsCisgIC8qICAgICA1MCovIDB4YWJmOSwKKyAgLyogMTAwMDE0Ki8gMHhhYmZiLAorICAvKiAgICAgIDIqLyAweGFiZmQsCisgIC8qICAgICAgMiovIDB4YWJmZiwKKyAgLyogICAgIDIwKi8gMHhhZjI2LAorICAvKiAxMjAwMDAqLyAweGFmNDYsCisgIC8qICAgICAgMyovIDB4YWY0NywKKyAgLyogICAgICAxKi8gMHhhZjU2LAorICAvKiAgICAgIDEqLyAweGFmNWUsCisgIC8qICAgICAgMSovIDB4YjEwNywKKyAgLyogMTEwMTEyKi8gMHhiMTBhLAorICAvKiAgICAgIDQqLyAweGIxMjAsCisgIC8qIDEwMDAwMSovIDB4YjEyYSwKKyAgLyogICAgICAzKi8gMHhiMTRhLAorICAvKiAgICAgIDUqLyAweGIxNzAsCisgIC8qICAgICAgMSovIDB4YjE4YSwKKyAgLyogICAgICA0Ki8gMHhiMmQxLAorICAvKiAgICAgIDYqLyAweGIyZTEsCisgIC8qICAgICAgMiovIDB4YjM0NSwKKyAgLyogICAgICAxKi8gMHhiMzQ3LAorICAvKiAxMzAwMDAqLyAweGIzNDksCisgIC8qICAgICAgNCovIDB4YjM1OSwKKyAgLyogICAgICAyKi8gMHhiMzViLAorICAvKiAxMDAwMDYqLyAweGIzNjksCisgIC8qICAgICAgNiovIDB4YjM2ZCwKKyAgLyogMTAwMDE3Ki8gMHhiMzc5LAorICAvKiAgICAgIDIqLyAweGIzN2IsCisgIC8qICAgICA2NyovIDB4YjM4NSwKKyAgLyogICAgICAyKi8gMHhiM2NiLAorICAvKiAxMjAwMDIqLyAweGJhNTEsCisgIC8qIDExMDAwMCovIDB4YmQyMSwKKyAgLyogICAgICAyKi8gMHhiZDMyLAorICAvKiAxMDAwMDAqLyAweGJkNDEsCisgIC8qIDEwMDAwMCovIDB4YmQ0YSwKKyAgLyogICAgICAyKi8gMHhiZDUxLAorICAvKiAxMDAwMDAqLyAweGJkNWEsCisgIC8qICAgICAgMiovIDB4YmQ1YiwKKyAgLyogICAgICA0Ki8gMHhiZDYxLAorICAvKiAxMTAwMDAqLyAweGJkNmEsCisgIC8qICAgICAgMiovIDB4YmQ3MSwKKyAgLyogMTEwMDAwKi8gMHhiZDdhLAorICAvKiAgICAgIDEqLyAweGJkOTEsCisgIC8qICAgICAzMiovIDB4YmQ5YSwKKyAgLyogMTEwMDAwKi8gMHhiZGEyLAorICAvKiAxMDAwMDAqLyAweGJkYTMsCisgIC8qICAgICAzNCovIDB4YmRjMSwKKyAgLyogMTAwMDAwKi8gMHhiZGMyLAorICAvKiAxMTAwMDAqLyAweGJkYzMsCisgIC8qIDEyMDAwMCovIDB4Yzg0MSwKKyAgLyogMTAwMDAwKi8gMHhjYjQxLAorICAvKiAxMTAwMDAqLyAweGNjNDEsCisgIC8qIDExMDAwMCovIDB4Y2U0MSwKKyAgLyogMTAwMDAwKi8gMHhjZjQxLAorICAvKiAgICAgIDIqLyAweGUxMDYsCisgIC8qICAgICAgMyovIDB4ZTEwYSwKKyAgLyogMTEwMDAwKi8gMHhlMWVhLAorICAvKiAgICAyMjAqLyAweGUxZWMsCisgIC8qICAgICA0MCovIDB4ZTFmMiwKKyAgLyogICAgICAyKi8gMHhlMjAyLAorICAvKiAgICAgNDAqLyAweGUyMDMsCisgIC8qICAgICAzMiovIDB4ZTIwNCwKKyAgLyogICAgICAyKi8gMHhlMmVhLAorICAvKiAxMDAwMDAqLyAweGUyZWMsCisgIC8qIDExMDAwMCovIDB4ZTJlZSwKKyAgLyogMTIwMDAwKi8gMHhlMmY5LAorICAvKiAxMDAwMDAqLyAweGUyZmIsCisgIC8qICAzMDAwMCovIDB4ZTNkYiwKKyAgLyogICAgICA3Ki8gMHhlNjAyLAorICAvKiAzMDAxMjgqLyAweGU2MDMsCisgIC8qICAgICAxNSovIDB4ZTYwNCwKKyAgLyogMTEwMDAyKi8gMHhlNjA1LAorICAvKiAgICAgMzIqLyAweGU2MDYsCisgIC8qICAgICA3MiovIDB4ZTYwNywKKyAgLyogICAgICAzKi8gMHhlNjA4LAorICAvKiAxMDE2MjQqLyAweGU2MDksCisgIC8qICAgICAzNCovIDB4ZTYwYSwKKyAgLyogMTEwMDAyKi8gMHhlNjBiLAorICAvKiAxMDAwNDAqLyAweGU2MGMsCisgIC8qIDEyMDAwMCovIDB4ZTYwZCwKKyAgLyogICAgICAxKi8gMHhlNjBlLAorICAvKiAgICAgIDEqLyAweGU2MGYsCisgIC8qICAgICAgMyovIDB4ZTYxMCwKKyAgLyogICAgIDQwKi8gMHhlNjE0LAorICAvKiAgICAgIDIqLyAweGU2MTYsCisgIC8qICAgICAgMiovIDB4ZTYxOSwKKyAgLyogICAgIDMwKi8gMHhlNjIyLAorICAvKiAgICAgIDMqLyAweGU2MmMsCisgIC8qICAgIDE4MCovIDB4ZTYyZCwKKyAgLyogICAgICA0Ki8gMHhlNjMyLAorICAvKiAgICAgIDIqLyAweGU2MzksCisgIC8qICAgICA1NiovIDB4ZTYzYSwKKyAgLyogICAgIDQwKi8gMHhlNjQwLAorICAvKiAgICAgIDIqLyAweGU2ZjIsCisgIC8qIDMwMDAwMCovIDB4ZTZmOSwKKyAgLyogICAgICA0Ki8gMHhlNzA2LAorICAvKiAxMDUxNTgqLyAweGU3ZmMsCisgIC8qIDEwMDA0NSovIDB4ZTgwMSwKKyAgLyogMTIxNjc3Ki8gMHhlODAyLAorICAvKiAxMTAwMDAqLyAweGU4MDMsCisgIC8qIDExMDAwMiovIDB4ZTgwNCwKKyAgLyogMTEwMDAwKi8gMHhlODA2LAorICAvKiAgICAgNDIqLyAweGU4MDgsCisgIC8qICAgICA0MCovIDB4ZTgwYSwKKyAgLyogICAgICAyKi8gMHhlODBlLAorICAvKiAgICAgNDAqLyAweGU4MTAsCisgIC8qICAgIDEwMyovIDB4ZTgxNSwKKyAgLyogICAgICAxKi8gMHhlODFiLAorICAvKiAgICAgIDIqLyAweGU4MWMsCisgIC8qICAxMDAwMCovIDB4ZTgyMCwKKyAgLyogICAgICAyKi8gMHhlODMxLAorICAvKiAgICAgIDIqLyAweGU4M2IsCisgIC8qICAgICAzNCovIDB4ZTkwMSwKKyAgLyogICAgIDMyKi8gMHhlOTAzLAorICAvKiAgICAgIDEqLyAweGU5MDYsCisgIC8qIDEwMTY3OSovIDB4ZTkwOCwKKyAgLyogICAgIDMyKi8gMHhlOTBmLAorICAvKiAxMTAwMDAqLyAweGU5MTYsCisgIC8qICAgICAyNCovIDB4ZTllZSwKKyAgLyogICAgIDIyKi8gMHhlOWVmLAorICAvKiAxMTAwMDAqLyAweGVhMDIsCisgIC8qIDExMDAwMCovIDB4ZWEwMywKKyAgLyogMTAwMDAwKi8gMHhlYTExLAorICAvKiAxMTAwMDAqLyAweGVhMTMsCisgIC8qICAgICAgNCovIDB4ZWFlZSwKKyAgLyogICAgIDMzKi8gMHhlYWY5LAorICAvKiAxMTAwMDAqLyAweGViMDEsCisgIC8qIDEwMDAwMCovIDB4ZWIyNCwKKyAgLyogMTAwMDAwKi8gMHhlYjI2LAorICAvKiAgICAgNDAqLyAweGViYmYsCisgIC8qIDExMDAwMCovIDB4ZWUwMSwKKyAgLyogMTEwMDAyKi8gMHhlZTAyLAorICAvKiAgICAgIDgqLyAweGVlMDMsCisgIC8qIDEzMDA3NiovIDB4ZWUwNCwKKyAgLyogICAgICA2Ki8gMHhlZTA1LAorICAvKiAxMTAwMDIqLyAweGVlMDYsCisgIC8qICAgICAgMSovIDB4ZWUwYiwKKyAgLyogICAgICA0Ki8gMHhlZTBlLAorICAvKiAgICAgIDEqLyAweGVlMGYsCisgIC8qICAyMDAwMCovIDB4ZWUxMSwKKyAgLyogMTAwMDAwKi8gMHhlZTE0LAorICAvKiAxMTAwMDAqLyAweGVlMTUsCisgIC8qICAgICAgMSovIDB4ZWUxOCwKKyAgLyogICAgICAxKi8gMHhlZTI3LAorICAvKiAgICAgIDEqLyAweGVlMmQsCisgIC8qICAgIDEwMyovIDB4ZWUzMywKKyAgLyogICAgICAyKi8gMHhlZTNiLAorICAvKiAgICAgIDEqLyAweGVlNDIsCisgIC8qICAgICAgMyovIDB4ZWVlMSwKKyAgLyogMTAxNTM5Ki8gMHhlZWUyLAorICAvKiAxMTAwMDAqLyAweGVlZjQsCisgIC8qICAgICAgMiovIDB4ZWVmOSwKKyAgLyogMTAwMDAwKi8gMHhlZWZhLAorICAvKiAgICAgMTQqLyAweGVlZmMsCisgIC8qICAgIDE4MCovIDB4ZWVmZCwKKyAgLyogICAgICAyKi8gMHhlZjAyLAorICAvKiAgICAgIDEqLyAweGVmMDQsCisgIC8qICAgICAgMiovIDB4ZWYxMSwKKyAgLyogICAgICAyKi8gMHhlZjE1LAorI2VuZGlmCisgIDAsfTsKZGlmZiAtLWdpdCBhL3NpbS96OGsvc2ltLmggYi9zaW0vejhrL3NpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MzMyZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vejhrL3NpbS5oCkBAIC0wLDAgKzEsOSBAQAorI2RlZmluZSBTSU1fU0lOR0xFX1NURVAgMQorI2RlZmluZSBTSU1fRE9ORSAyCisjZGVmaW5lIFNJTV9CUkVBS1BPSU5UIDMKKyNkZWZpbmUgU0lNX0lOVEVSUlVQVCA0CisjZGVmaW5lIFNJTV9CQURfSU5TVCA1CisjZGVmaW5lIFNJTV9ESVZfWkVSTyA2CisjZGVmaW5lIFNJTV9CQURfU1lTQ0FMTCA3CisjZGVmaW5lIFNJTV9CQURfQUxJR04gOAorI2RlZmluZSBTSU1fQkFEX0FERFIgOQpkaWZmIC0tZ2l0IGEvc2ltL3o4ay9zdXBwb3J0LmMgYi9zaW0vejhrL3N1cHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzkyMzY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltL3o4ay9zdXBwb3J0LmMKQEAgLTAsMCArMSw3ODQgQEAKKy8qIHN1cHBvcnQgcm91dGluZXMgZm9yIGludGVycHJldGVkIGluc3RydWN0aW9ucworICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBaOEtTSU0KKworWjhLU0lNIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworWjhLU0lNIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggWjhLWklNOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8YW5zaWRlY2wuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAidG0uaCIKKyNpbmNsdWRlICJzaW0uaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfVElNRV9ICisjaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfVElNRVNfSAorI2luY2x1ZGUgPHN5cy90aW1lcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgInJlbW90ZS1zaW0uaCIKKyNpbmNsdWRlICJzeXNjYWxsLmgiCisKK3N0YXRpYyBpbnQgZ2V0X25vdyBQQVJBTVMgKCh2b2lkKSk7CitzdGF0aWMgaW50IG5vd19wZXJzZWMgUEFSQU1TICgodm9pZCkpOworc3RhdGljIGludCBwdXRfbG9uZyBQQVJBTVMgKChzaW1fc3RhdGVfdHlwZSAqIGNvbnRleHQsIGludCBwdHIsIGludCB2YWx1ZSkpOworc3RhdGljIGludCBwdXRfc2hvcnQgUEFSQU1TICgoc2ltX3N0YXRlX3R5cGUgKiBjb250ZXh0LCBpbnQgcHRyLCBpbnQgdmFsdWUpKTsKKworaW50IHNpbV96ODAwMV9tb2RlOworCitzdGF0aWMgaW50CitnZXRfbm93ICgpCit7CisjaWZkZWYgSEFWRV9TWVNfVElNRVNfSAorICBzdHJ1Y3QgdG1zIGI7CisKKyAgdGltZXMgKCZiKTsKKyAgcmV0dXJuIGIudG1zX3V0aW1lICsgYi50bXNfc3RpbWU7CisjZWxzZQorICByZXR1cm4gdGltZSAoMCk7CisjZW5kaWYKK30KKworc3RhdGljIGludAorbm93X3BlcnNlYyAoKQoreworICByZXR1cm4gNTA7Cit9CisKKworLyogI2RlZmluZSBMT0cgLyogZGVmaW5lIHRoaXMgdG8gcHJpbnQgaW5zdHJ1Y3Rpb24gdXNlIGNvdW50cyAqLworCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgSU5MSU5FIF9faW5saW5lX18KKyNpbmNsdWRlICJpbmxpbmVzLmgiCisjZWxzZQorI2luY2x1ZGUgImlubGluZXMuaCIKKyNlbmRpZgorCisvKiBUaGlzIGhvbGRzIHRoZSBlbnRpcmUgY3B1IGNvbnRleHQgKi8KK3N0YXRpYyBzaW1fc3RhdGVfdHlwZSB0aGVfc3RhdGU7CisKK2ludAorZmFpbCAoY29udGV4dCwgZHVtbXkpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBpbnQgZHVtbXk7Cit7CisgIGNvbnRleHQtPmV4Y2VwdGlvbiA9IFNJTV9CQURfSU5TVDsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQKK3Nmb3BfYmFkMSAoY29udGV4dCkKKyAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Cit7CisgIGNvbnRleHQtPmV4Y2VwdGlvbgorICAgID0gU0lNX0JBRF9JTlNUOworfQorCit2b2lkCitiZm9wX2JhZDEgKGNvbnRleHQpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworeworICBjb250ZXh0LT5leGNlcHRpb24KKyAgICA9IFNJTV9CQURfSU5TVDsKK30KKwordm9pZAorZm9wX2JhZCAoY29udGV4dCkKKyAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Cit7CisgIGNvbnRleHQtPmV4Y2VwdGlvbiA9CisgICAgU0lNX0JBRF9JTlNUOworfQorCisvKiBUYWJsZSBvZiBiaXQgY291bnRzIGZvciBhbGwgYnl0ZSB2YWx1ZXMgKi8KKworY2hhciB0aGVfcGFyaXR5WzI1Nl0gPQoreworICAwLCAxLCAxLCAyLCAxLCAyLCAyLCAzLCAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAxLCAyLCAyLCAzLCAyLCAzLCAzLAorICA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LAorICA0LCA1LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCAxLCAyLCAyLCAzLCAyLAorICAzLCAzLCA0LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LAorICA0LCA1LCA1LCA2LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCAzLCA0LCA0LAorICA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LCAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLAorICAzLCA0LCAzLCA0LCA0LCA1LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCAyLAorICAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LAorICA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LCAyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LCAzLCA0LCA0LCA1LCA0LCA1LCA1LAorICA2LCAzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LCAzLCA0LCA0LCA1LCA0LCA1LAorICA1LCA2LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LCA0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LCA1LCA2LCA2LCA3LCA2LAorICA3LCA3LCA4fTsKKworCitpbnQgcmVhZCAoKTsKK2ludCB3cml0ZSAoKTsKK2ludCBvcGVuICgpOworaW50IGNsb3NlICgpOworaW50IG9wZW4gKCk7CitpbnQgY2xvc2UgKCk7CisKK2ludCBsaW5rICgpOworaW50IGZzdGF0ICgpOworCitzdGF0aWMgaW50CitwdXRfc2hvcnQgKGNvbnRleHQsIHB0ciwgdmFsdWUpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBpbnQgcHRyOworICAgICBpbnQgdmFsdWU7Cit7CisgIHB1dF93b3JkX21lbV9kYSAoY29udGV4dCwgcHRyLCB2YWx1ZSk7CisgIHJldHVybiBwdHIgKyAyOworfQorCitzdGF0aWMgaW50CitwdXRfbG9uZyAoY29udGV4dCwgcHRyLCB2YWx1ZSkKKyAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7CisgICAgIGludAorICAgICAgIHB0cjsKKyAgICAgaW50IHZhbHVlOworeworICBwdXRfbG9uZ19tZW1fZGEgKGNvbnRleHQsIHB0ciwgdmFsdWUpOworICByZXR1cm4gcHRyICsgNDsKK30KKworI2RlZmluZSBhcHRyKHgpICgoc2l0b3B0cih4KSkgKyAoY2hhciAqKShjb250ZXh0LT5tZW1vcnkpKQorCitzdGF0aWMgaW50IGFyZ3NbM107CitzdGF0aWMgaW50IGFyZ19pbmRleDsJCS8qIFRyYW5zbGF0ZSBhIHo4ayBzeXN0ZW0gY2FsbCBpbnRvIGEgaG9zdCBzeXN0ZW0gY2FsbCAqLwordm9pZAorc3VwcG9ydF9jYWxsIChjb250ZXh0LCBzYykKKyAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7CisgICAgIGludCBzYzsKK3sKKyAgZXh0ZXJuIGludCBlcnJubzsKKyAgaW50IHJldDsKKyAgaW50IHJldG5leHQgPSAwOworICBpbnQgZmQ7CisKKyAgaW50IG9sZGVycm5vID0gZXJybm87CisgIGVycm5vID0gMDsKKyAgc3dpdGNoIChzYykKKyAgICB7CisgICAgY2FzZSBTWVNfQVJHOgorICAgICAgYXJnc1thcmdfaW5kZXgrK10gPSBjb250ZXh0LT5yZWdzWzBdLndvcmQgPDwgMTYgfCBjb250ZXh0LT5yZWdzWzFdLndvcmQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNZU19leGl0OgorICAgICAgY29udGV4dC0+ZXhjZXB0aW9uID0gU0lNX0RPTkU7CisgICAgICByZXQgPSBhcmdzWzBdOworICAgICAgYXJnX2luZGV4ID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1lTX2Nsb3NlOgorICAgICAgcmV0ID0gY2xvc2UgKChpbnQpIChhcmdzWzBdKSk7CisgICAgICBhcmdfaW5kZXggPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTWVNfY3JlYXQ6CisgICAgICByZXQgPSBjcmVhdCAoYXB0ciAoYXJnc1swXSksIGFyZ3NbMV0pOworICAgICAgYXJnX2luZGV4ID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1lTX2lzYXR0eToKKyAgICAgIHJldCA9IGlzYXR0eSAoYXJnc1swXSk7CisgICAgICBhcmdfaW5kZXggPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTWVNfb3BlbjoKKyAgICAgIHJldCA9IG9wZW4gKGFwdHIgKGFyZ3NbMF0pLCBhcmdzWzFdLCBhcmdzWzJdKTsKKyAgICAgIGFyZ19pbmRleCA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNZU19sc2VlazoKKyAgICAgIHJldCA9IGxzZWVrIChhcmdzWzBdLCAob2ZmX3QpIGFyZ3NbMV0sIGFyZ3NbMl0pOworICAgICAgYXJnX2luZGV4ID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1lTX3JlYWQ6CisgICAgICByZXQgPSByZWFkIChhcmdzWzBdLCBhcHRyIChhcmdzWzFdKSwgYXJnc1syXSk7CisgICAgICBhcmdfaW5kZXggPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTWVNfd3JpdGU6CisgICAgICByZXQgPSB3cml0ZSAoYXJnc1swXSxhcHRyIChhcmdzWzFdKSwgYXJnc1syXSk7CisgICAgICBhcmdfaW5kZXggPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTWVNfdGltZToKKyAgICAgIHsKKwlpbnQgZHN0ID0gYXJnc1swXTsKKworCXJldCA9IHRpbWUgKDApOworCWlmIChkc3QpCisJICB7CisJICAgIHB1dF9sb25nX21lbV9kYSAoY29udGV4dCwKKwkJCSAgICAgc2l0b3B0ciAoZHN0KSwgcmV0KTsKKwkgIH0KKwlyZXRuZXh0ID0gcmV0OworCXJldCA9IHJldG5leHQgPj4gMTY7CisJYXJnX2luZGV4ID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1lTX2ZzdGF0OgorICAgICAgeworCWludCBidWY7CisJc3RydWN0IHN0YXQgaG9zdF9zdGF0OworCWZkID0gYXJnc1swXTsKKwlidWYgPSBzaXRvcHRyIChhcmdzWzFdKTsKKwlyZXQgPSBmc3RhdCAoZmQsICZob3N0X3N0YXQpOworCWJ1ZiA9IHB1dF9zaG9ydCAoY29udGV4dCwgYnVmLCBob3N0X3N0YXQuc3RfZGV2KTsKKwlidWYgPSBwdXRfc2hvcnQgKGNvbnRleHQsIGJ1ZiwgaG9zdF9zdGF0LnN0X2lubyk7CisJLyogRklYTUU6IElzbid0IG1vZGVfdCA0IGJ5dGVzPyAgKi8KKwlidWYgPSBwdXRfc2hvcnQgKGNvbnRleHQsIGJ1ZiwgaG9zdF9zdGF0LnN0X21vZGUpOworCWJ1ZiA9IHB1dF9zaG9ydCAoY29udGV4dCwgYnVmLCBob3N0X3N0YXQuc3RfbmxpbmspOworCWJ1ZiA9IHB1dF9zaG9ydCAoY29udGV4dCwgYnVmLCBob3N0X3N0YXQuc3RfdWlkKTsKKwlidWYgPSBwdXRfc2hvcnQgKGNvbnRleHQsIGJ1ZiwgaG9zdF9zdGF0LnN0X3VpZCk7CisJYnVmID0gcHV0X3Nob3J0IChjb250ZXh0LCBidWYsIGhvc3Rfc3RhdC5zdF9yZGV2KTsKKwlidWYgPSBwdXRfbG9uZyAoY29udGV4dCwgYnVmLCBob3N0X3N0YXQuc3Rfc2l6ZSk7CisJYnVmID0gcHV0X2xvbmcgKGNvbnRleHQsIGJ1ZiwgaG9zdF9zdGF0LnN0X2F0aW1lKTsKKwlhcmdfaW5kZXggPSAwOworICAgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgU1lTX2xpbms6CisgICAgICBjb250ZXh0LT5leGNlcHRpb24gPSBTSU1fQkFEX1NZU0NBTEw7CisgICAgICBhcmdfaW5kZXggPSAwOworICAgICAgYnJlYWs7CisgICAgfQorICBjb250ZXh0LT5yZWdzWzJdLndvcmQgPSByZXQ7CisgIGNvbnRleHQtPnJlZ3NbM10ud29yZCA9IHJldG5leHQ7CisgIGNvbnRleHQtPnJlZ3NbNV0ud29yZCA9IGVycm5vOworCisKKyAgLyogc3VwcG9ydCBmb3IgdGhlIHN0ZGNhbGwgY2FsbGluZyBjb252ZW50aW9uICovCisgIGNvbnRleHQtPnJlZ3NbNl0ud29yZCA9IHJldG5leHQ7CisgIGNvbnRleHQtPnJlZ3NbN10ud29yZCA9IHJldDsKKworICBlcnJubyA9IG9sZGVycm5vOworfQorCisjdW5kZWYgZ2V0X3dvcmRfbWVtX2RhCisKK2ludAorZ2V0X3dvcmRfbWVtX2RhIChjb250ZXh0LCBhZGRyKQorICAgICBzaW1fc3RhdGVfdHlwZSAqY29udGV4dDsKKyAgICAgaW50IGFkZHI7Cit7CisgIHJldHVybiAoZ2V0X2J5dGVfbWVtX2RhIChjb250ZXh0LCBhZGRyKSA8PCA4KSB8IChnZXRfYnl0ZV9tZW1fZGEgKGNvbnRleHQsIGFkZHIgKyAxKSk7CisKK30KKworI3VuZGVmIGdldF93b3JkX3JlZworaW50IAorZ2V0X3dvcmRfcmVnIChjb250ZXh0LCByZWcpIHNpbV9zdGF0ZV90eXBlCisqIGNvbnRleHQ7CisgICAgIGludCByZWc7Cit7CisgIHJldHVybiBjb250ZXh0LT5yZWdzW3JlZ10ud29yZDsKK30KKworI2lmZGVmIExPRworaW50IGxvZ1s2NCAqIDEwMjRdOworCisjZW5kaWYKKwordm9pZAordG1fc3RvcmVfcmVnaXN0ZXIgKHJlZ25vLCB2YWx1ZSkKKyAgICAgaW50IHJlZ25vOworICAgICBpbnQgdmFsdWU7Cit7CisgIHN3aXRjaAorICAgIChyZWdubykKKyAgICB7CisgICAgY2FzZSBSRUdfUEM6CisgICAgICB0aGVfc3RhdGUuc29tZXRpbWVzX3BjID0gdmFsdWU7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBwdXRfd29yZF9yZWcgKCZ0aGVfc3RhdGUsIHJlZ25vLCB2YWx1ZSk7CisgICAgfQorfQorCit2b2lkCitzd2FwX2xvbmcgKGJ1ZiwgdmFsKQorICAgICBjaGFyICpidWY7CisgICAgIGludCB2YWw7Cit7CisgIGJ1ZlswXSA9IHZhbCA+PiAyNDsKKyAgYnVmWzFdID0gdmFsID4+IDE2OworICBidWZbMl0gPSB2YWwgPj4gODsKKyAgYnVmWzNdID0gdmFsID4+IDA7Cit9CisKK3ZvaWQKK3N3YXBfd29yZCAoYnVmLCB2YWwpCisgICAgIGNoYXIgKmJ1ZjsKKyAgICAgaW50IHZhbDsKK3sKKyAgYnVmWzBdID0gdmFsID4+IDg7CisgIGJ1ZlsxXSA9IHZhbCA+PiAwOworfQorCit2b2lkCit0bV9mZXRjaF9yZWdpc3RlciAocmVnbm8sIGJ1ZikKKyAgICAgaW50IHJlZ25vOworICAgICBjaGFyICpidWY7Cit7CisgIHN3aXRjaAorICAgIChyZWdubykKKyAgICB7CisgICAgY2FzZSBSRUdfQ1lDTEVTOgorICAgICAgc3dhcF9sb25nIChidWYsIHRoZV9zdGF0ZS5jeWNsZXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSRUdfSU5TVFM6CisgICAgICBzd2FwX2xvbmcgKGJ1ZiwgdGhlX3N0YXRlLmluc3RzKTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZQorICAgIFJFR19USU1FOgorICAgICAgc3dhcF9sb25nIChidWYsIHRoZV9zdGF0ZS50aWNrcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJFR19QQzoKKyAgICAgIHN3YXBfbG9uZyAoYnVmLCB0aGVfc3RhdGUuc29tZXRpbWVzX3BjKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUkVHX1NQOgorICAgICAgeworCWlmIChzaW1fejgwMDFfbW9kZSkKKwkgIHsKKwkgICAgc3dhcF9sb25nIChidWYsIGdldF9sb25nX3JlZyAoJnRoZV9zdGF0ZSwgMTQpKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIHN3YXBfbG9uZyAoYnVmLCBnZXRfd29yZF9yZWcgKCZ0aGVfc3RhdGUsIDE1KSk7CisJICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICAgIGNhc2UKKyAgICBSRUdfRlA6CisgICAgICB7CisJaWYgKHNpbV96ODAwMV9tb2RlKQorCSAgeworCSAgICBzd2FwX2xvbmcgKGJ1ZiwgZ2V0X2xvbmdfcmVnCisJCSAgICAgICAoJnRoZV9zdGF0ZSwgMTApKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIHN3YXBfbG9uZyAoYnVmLAorCQkgICAgICAgZ2V0X3dvcmRfcmVnICgmdGhlX3N0YXRlLCAxMCkpOworCSAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHsKKwlzd2FwX3dvcmQgKGJ1ZiwKKwkJICAgZ2V0X3dvcmRfcmVnICgmdGhlX3N0YXRlLCByZWdubykpOworICAgICAgfQorICAgIH0KK30KKwordm9pZAordG1fcmVzdW1lIChzdGVwKQorICAgICBpbnQgc3RlcDsKK3sKKyAgaW50IG5vdyA9IGdldF9ub3cgKCk7CisgIHN0cnVjdCBvcF9pbmZvCisgICAqcDsKKyAgaW50IHdvcmQ7CisgIGludCBwYzsKKyAgZXh0ZXJuIGludCAoKihzZm9wX3RhYmxlW10pKSAoKTsKKyAgZXh0ZXJuIGludCAoKihiZm9wX3RhYmxlW10pKSAoKTsKKyAgaW50ICgqKCgqdGFibGUpKSkgKCk7CisgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0ID0gJnRoZV9zdGF0ZTsKKworICBpZiAoc3RlcCkKKyAgICB7CisgICAgICBjb250ZXh0LT5leGNlcHRpb24gPSBTSU1fU0lOR0xFX1NURVA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgY29udGV4dC0+ZXhjZXB0aW9uID0gMDsKKyAgICB9CisKKyAgcGMgPSBjb250ZXh0LT5zb21ldGltZXNfcGM7CisgIGlmIChzaW1fejgwMDFfbW9kZSkKKyAgICB7CisgICAgICB0YWJsZSA9IGJmb3BfdGFibGU7CisgICAgICBwYyA9IE1BUF9QSFlTSUNBTF9UT19MT0dJQ0FMIChwYyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdGFibGUgPSBzZm9wX3RhYmxlOworICAgIH0KKworCisgIGRvCisgICAgeworICAgICAgd29yZCA9IGdldF93b3JkX21lbV9kYSAoY29udGV4dCwgcGMpOworICAgICAgcCA9IG9wX2luZm9fdGFibGUgKyB3b3JkOworCisjaWZkZWYgTE9HCisgICAgICBsb2dbd29yZF0rKzsKKyNlbmRpZgorICAgICAgcGMgPSB0YWJsZVtwLT5leGVjXSAoY29udGV4dCwgcGMsIHdvcmQpOworICAgICAgY29udGV4dC0+aW5zdHMrKzsKKworICAgIH0KKyAgd2hpbGUgKCFjb250ZXh0LT5leGNlcHRpb24pOworCisKKworICBjb250ZXh0LT5zb21ldGltZXNfcGMgPSBNQVBfTE9HSUNBTF9UT19QSFlTSUNBTCAocGMpOworICBjb250ZXh0LT50aWNrcyArPSBnZXRfbm93ICgpIC0gbm93OworfQorCitpbnQKK3RtX3NpZ25hbCAoKQoreworICByZXR1cm4gdGhlX3N0YXRlLmV4Y2VwdGlvbjsKK30KKwordm9pZAordG1faW5mb19wcmludCAoeCkKKyAgICAgc2ltX3N0YXRlX3R5cGUgKng7Cit7CisgIGRvdWJsZSB0aW1ldGFrZW4gPSAoZG91YmxlKSB4LT50aWNrcyAvIChkb3VibGUpIG5vd19wZXJzZWMgKCk7CisgIGRvdWJsZSB2aXJ0dGltZSA9IHgtPmN5Y2xlcyAvIDQuMGU2OworCisgIHByaW50ZiAoImluc3RydWN0aW9ucyBleGVjdXRlZCAgICAgICAgICAgIDogJTlkXG4iLCB4LT5pbnN0cyk7CisgIHByaW50ZiAoImN5Y2xlcyBjb3VudGVkICAgICAgICAgICAgICAgICAgIDogJTlkIFxuIiwgeC0+Y3ljbGVzKTsKKyAgcHJpbnRmICgiY3ljbGVzIC8gaW5zdCAgICAgICAgICAgICAgICAgICAgOiAlOS4xZiBcbiIsIChkb3VibGUpIHgtPmN5Y2xlcyAvIChkb3VibGUpIHgtPmluc3RzKTsKKyAgcHJpbnRmICgidmlydHVhbCB0aW1lIHRha2VkIChhdCA0IE1oeikgICAgOiAlOS4xZiBcbiIsIHZpcnR0aW1lKTsKKyAgcHJpbnRmICgicmVhbCB0aW1lIHRha2VuICAgICAgICAgICAgICAgICAgOiAlOS4xZiBcbiIsIHRpbWV0YWtlbik7CisKKyAgaWYgKHRpbWV0YWtlbikKKyAgICB7CisgICAgICBwcmludGYgKCJ2aXJ0dWFsIGluc3RydWN0aW9ucyBwZXIgc2Vjb25kICA6ICU5LjFmXG4iLCB4LT5pbnN0cyAvIHRpbWV0YWtlbik7CisgICAgICBwcmludGYgKCJlbXVsYXRpb24gc3BlZWQgICAgICAgICAgICAgICAgICA6ICU5LjFmJSVcbiIsIHZpcnR0aW1lIC8gdGltZXRha2VuICogMTAwLjApOworICAgIH0KKyNpZmRlZiBMT0cKKyAgeworICAgIGV4dGVybiBpbnQgcXVpY2tbXTsKKworICAgIGZvciAoaSA9IDA7IHF1aWNrW2ldOyBpKyspCisgICAgICB7CisJbG9nW3F1aWNrW2ldXSArPSAxMDAwMDA7CisgICAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgNjQgKiAxMDI0OyBpKyspCisgICAgeworICAgICAgaWYgKGxvZ1tpXSkKKwl7CisJICBwcmludGYgKCIJCQkvKiU3ZCovIDB4JXgsXG4iLCBsb2dbaV0sIGkpOworCX0KKyAgICB9CisjZW5kaWYKKworfQorCitpbnQKK3NpbV90cmFjZSAoc2QpCisgICAgIFNJTV9ERVNDIHNkOworeworICBpbnQgaTsKKyAgY2hhciBidWZmZXJbMTBdOworICBpbnQgcjsKKworICBwcmludGYgKCJcbiIpOworICBmb3IgKHIgPSAwOyByIDwgMTY7IHIrKykKKyAgICB7CisgICAgICBpbnQgbTsKKworICAgICAgcHJpbnRmICgiciUyZCIsIHIpOworICAgICAgcHJpbnRmICgiPSUwNHggIiwgZ2V0X3dvcmRfcmVnICgmdGhlX3N0YXRlLAorCQkJCSAgICAgIHIpKTsKKyAgICAgIGZvciAobSA9IC00OyBtIDwgODsgbSsrKQorCXsKKwkgIGlmIChtID09IDApCisJICAgIHByaW50ZiAoIj4iKTsKKwkgIHByaW50ZiAoIiUwNHggIiwKKwkJICBnZXRfd29yZF9tZW1fZGEgKCZ0aGVfc3RhdGUsICgweGZmZmUgJiBnZXRfd29yZF9yZWcgKCZ0aGVfc3RhdGUsIHIpKSArIG0gKiAyKSk7CisJfQorICAgICAgcHJpbnRmICgiXG4iKTsKKyAgICB9CisKKyAgcHJpbnRmICgiXG4iKTsKKyAgcHJpbnRmICgiJTlkICU5ZCAlMDh4ICIsIHRoZV9zdGF0ZS5jeWNsZXMsCisJICB0aGVfc3RhdGUuaW5zdHMsIHRoZV9zdGF0ZS5zb21ldGltZXNfcGMpOworCisgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgeworICAgICAgYnVmZmVyW2ldID0gZ2V0X2J5dGVfbWVtX2RhICgmdGhlX3N0YXRlLAorCQkJCSAgIHRoZV9zdGF0ZS5zb21ldGltZXNfcGMgKyBpKTsKKyAgICB9CisKKyAgcHJpbnRfaW5zbl96ODAwMSAodGhlX3N0YXRlLnNvbWV0aW1lc19wYywgYnVmZmVyLCBzdGRvdXQpOworICBwcmludGYKKyAgICAoIlxuIik7CisgIHRtX3Jlc3VtZSAoMSk7CisgIGlmICh0aGVfc3RhdGUuZXhjZXB0aW9uICE9IFNJTV9TSU5HTEVfU1RFUCkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3RtX3N0YXRlICh4KQorICAgICBzaW1fc3RhdGVfdHlwZSAqeDsKK3sKKyAgKnggPSB0aGVfc3RhdGU7Cit9CisKK3ZvaWQKK3RtX2V4Y2VwdGlvbiAoeCkKKyAgICAgaW50IHg7Cit7CisgIHRoZV9zdGF0ZS5leGNlcHRpb24gPSB4OworfQorCitpbnQKK3RtX3JlYWRfYnl0ZSAoeCkKKyAgICAgaW50IHg7Cit7CisgIHggJj0gMHgzZjAwZmZmZjsKKyAgcmV0dXJuIHNpbV9yZWFkX2J5dGUgKCZ0aGVfc3RhdGUsIHgpOworfQorCit2b2lkCit0bV93cml0ZV9ieXRlICh4LCB5KQorICAgICBpbnQgeCwgeTsKK3sKKyAgeCAmPSAweDNmMDBmZmZmOworICBzaW1fd3JpdGVfYnl0ZSAoJnRoZV9zdGF0ZSwgeCwgeSk7Cit9CisKKyNkZWZpbmUgU0lHTih4KSAoKHgpICYgTUFTSykKK25vcm1hbF9mbGFnc18zMihjb250ZXh0LGQsc2Esc2Isc3ViKQorc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Cit1bnNpZ25lZCBpbnQgZDsKK3Vuc2lnbmVkIGludCBzYTsKK3Vuc2lnbmVkIGludCBzYjsKK3Vuc2lnbmVkIGludCBzdWI7Cit7CisjdW5kZWYgTUFTSworI2RlZmluZSBNQVNLICgxPDwzMSkKKyAgY29udGV4dC0+YnJva2VuX2ZsYWdzID0gMDsJCisgIGlmIChzdWIpICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgUFNXX0NBUlJZID0gc2EgPCBzYjsgCQkKKyAgZWxzZSAJCQkJCisgICAgUFNXX0NBUlJZID0gZCA8IHNhOyAJCQorICBpZiAoc3ViKQorICAgIFBTV19PVkVSRkxPVyA9IChTSUdOKHNhKSAhPSBTSUdOKHNiKSkgJiYgKFNJR04oZCkgPT0gU0lHTihzYikpOworICBlbHNlCisgICAgUFNXX09WRVJGTE9XID0gKFNJR04oc2EpID09IFNJR04oc2IpKSAmJiAoU0lHTihkKSAhPSBTSUdOKHNiKSk7CisKKyAgUFNXX1NJR04gPSAoKGludClkKSA8MDsgCisgIFBTV19aRVJPID0gZCA9PSAwOworfQorCitub3JtYWxfZmxhZ3NfMTYoY29udGV4dCxkLHNhbCxzYmwsc3ViKQorc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7Cit1bnNpZ25lZCAgaW50IGQ7Cit1bnNpZ25lZCAgaW50IHNhbDsKK3Vuc2lnbmVkICBpbnQgc2JsOwordW5zaWduZWQgc2hvcnQgaW50IHN1YjsKK3sKKyAgdW5zaWduZWQgc2hvcnQgc2EgPSBzYWw7CisgIHVuc2lnbmVkIHNob3J0IHNiID0gc2JsOworI3VuZGVmIE1BU0sKKyNkZWZpbmUgTUFTSyAoMTw8MTUpCisgIGNvbnRleHQtPmJyb2tlbl9mbGFncyA9IDA7CQorICBpZiAoc3ViKSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIFBTV19DQVJSWSA9IHNhbCA8IHNibDsgCQkKKyAgZWxzZSAJCQkKKyAgICBQU1dfQ0FSUlkgPSAoZCAmIDB4MTAwMDApICE9IDA7CisKKyAgaWYgKHN1YikKKyAgICBQU1dfT1ZFUkZMT1cgPSAoU0lHTihzYSkgIT0gU0lHTihzYikpICYmIChTSUdOKGQpID09IFNJR04oc2IpKTsKKyAgZWxzZQorICAgIFBTV19PVkVSRkxPVyA9IChTSUdOKHNhKSA9PSBTSUdOKHNiKSkgJiYgKFNJR04oZCkgIT0gU0lHTihzYikpOworCisgIFBTV19TSUdOID0gKChzaG9ydCBpbnQpZCkgPDA7IAorICBQU1dfWkVSTyA9ICgoc2hvcnQpZCkgPT0gMDsKK30KKworbm9ybWFsX2ZsYWdzXzgoY29udGV4dCxkLHNhLHNiLHN1YikKK3NpbV9zdGF0ZV90eXBlICpjb250ZXh0OwordW5zaWduZWQgY2hhciBkOwordW5zaWduZWQgY2hhciBzYTsKK3Vuc2lnbmVkIGNoYXIgc2I7Cit1bnNpZ25lZCBjaGFyIHN1YjsKK3sKKyN1bmRlZiBNQVNLCisjZGVmaW5lIE1BU0sgKDE8PDcpCisgIGNvbnRleHQtPmJyb2tlbl9mbGFncyA9IDA7CQorICBpZiAoc3ViKSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIFBTV19DQVJSWSA9IHNhIDwgc2I7IAkJCisgIGVsc2UgCQkJCQorICAgIFBTV19DQVJSWSA9IGQgPCBzYTsgCQkKKyAgaWYgKHN1YikKKyAgICBQU1dfT1ZFUkZMT1cgPSAoU0lHTihzYSkgIT0gU0lHTihzYikpICYmIChTSUdOKGQpID09IFNJR04oc2IpKTsKKyAgZWxzZQorICAgIFBTV19PVkVSRkxPVyA9IChTSUdOKHNhKSA9PSBTSUdOKHNiKSkgJiYgKFNJR04oZCkgIT0gU0lHTihzYikpOworICBQU1dfU0lHTiA9ICgoY2hhcilkKSA8MDsgCisgIFBTV19aRVJPID0gZCA9PSAwOworfQorCisKK3N0YXRpYyBpbnQKK2lzX2NvbmRfdHJ1ZSAoY29udGV4dCwgYykKKyAgICAgc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQ7CisgICAgIGludCBjOworeworICBzd2l0Y2ggKGMpCisgICAgeworICAgIGNhc2UgVDoKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgRjoKKyAgICAgIHJldHVybiAwOwkJCS8qIEYgKi8KKyAgICBjYXNlIExFOgorICAgICAgcmV0dXJuIChQU1dfWkVSTyB8IChQU1dfU0lHTiBeIFBTV19PVkVSRkxPVykpICYgMTsJLypMRSAqLworICAgIGNhc2UgR1Q6CisgICAgICByZXR1cm4gKH4oUFNXX1pFUk8gfCAoUFNXX1NJR04gXiBQU1dfT1ZFUkZMT1cpKSkgJiAxOwkvKkdUICovCisgICAgY2FzZSAweDU6CisgICAgICByZXR1cm4gKFBTV19TSUdOICYgMSk7CS8qIHNpZ24gKi8KKyAgICBjYXNlIDB4ZDoKKyAgICAgIHJldHVybiAofihQU1dfU0lHTikpICYgMTsJLyogbm90IHNpZ24gKi8KKyAgICBjYXNlIDB4MzoKKyAgICAgIHJldHVybiAoKFBTV19DQVJSWSB8IFBTV19aRVJPKSAmIDEpOwkvKiB1bGUqLworICAgIGNhc2UgVUdUOgorICAgICAgcmV0dXJuICgofihQU1dfQ0FSUlkgfCBQU1dfWkVSTykpICYgMSk7CS8qIHVndCAqLworICAgIGNhc2UgMHg0OgorICAgICAgcmV0dXJuIChQU1dfT1ZFUkZMT1cgJiAxKTsvKiBvdmVyZmxvdyAqLworICAgIGNhc2UgMHhjOgorICAgICAgcmV0dXJuICh+KFBTV19PVkVSRkxPVykpICYgMTsJLyogbm90IG92ZXJmbG93ICovCisgICAgY2FzZSBMVDoKKyAgICAgIHJldHVybiAoUFNXX1NJR04gXiBQU1dfT1ZFUkZMT1cpICYgMTsJLyogTFQgKi8KKyAgICBjYXNlIEdFOgorICAgICAgcmV0dXJuICh+KFBTV19TSUdOIF4gUFNXX09WRVJGTE9XKSkgJiAxOwkvKiBHRSAqLworICAgIGNhc2UgRVE6CisgICAgICByZXR1cm4gKFBTV19aRVJPKSAmIDE7CS8qIHplcm8gKi8KKyAgICBjYXNlIE5FOgorICAgICAgcmV0dXJuICgoflBTV19aRVJPKSAmIDEpOwkvKiBub3QgemVybyAqLworICAgIGNhc2UgMHg3OgorICAgICAgcmV0dXJuIChQU1dfQ0FSUlkpICYgMTsJLyogY2FycnkgKi8KKyAgICBjYXNlIDB4ZjoKKyAgICAgIHJldHVybiAoflBTV19DQVJSWSkgJiAxOwkvKiBub3QgY2FycnkgKi8KKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgfQorfQorCitpbnQKK0NPTkQgKGNvbnRleHQsIGMpCisgICAgIHNpbV9zdGF0ZV90eXBlICpjb250ZXh0OworICAgICBpbnQgYzsKK3sKKyAgaWYgKGMgPT0gOCkKKyAgICByZXR1cm4gMTsKKworICAvKiBXZSBjYW4gY2FsY3VsYXRlIHdoYXQgdGhlIGZsYWdzIHdvdWxkIGhhdmUgYmVlbiBieQorICAgICBsb29raW5nIGF0IHRoZSBzcmMgYW5kIGRzdCBhbmQgc2l6ZSBvZiB0aGUgb3BlcmF0aW9uICovCisKKyAgaWYgKGNvbnRleHQtPmJyb2tlbl9mbGFncykKKyAgICB7CisgICAgICBpbnQgc2xvdyA9IDA7CisgICAgICBpbnQgc2l6ZTsKKyAgICAgIGludCBkc3Q7CisgICAgICBpbnQgc3JjYTsKKyAgICAgIGludCBzcmNiOworICAgICAgaW50IG1hc2s7CisgICAgICBpbnQgYW5zOworCisgICAgICAvKiBzZWUgaWYgd2UgY2FuIHNob3J0LWN1dCB0aGUgbmFzdHkgZmxhZyBjYWxjcyAqLworCisgICAgICBzd2l0Y2ggKHNpemUgPSBjb250ZXh0LT5zaXplKQorCXsKKwkgZGVmYXVsdDoKKwkgIGFib3J0KCk7CisJICByZXR1cm4gMDsKKwljYXNlIDg6CisJICBzcmNhID0gKGNoYXIpIChjb250ZXh0LT5zcmNhKTsKKwkgIHNyY2IgPSAoY2hhcikgKGNvbnRleHQtPnNyY2IpOworCSAgZHN0ID0gKGNoYXIpIChjb250ZXh0LT5kc3QpOworCSAgbWFzayA9IDB4ZmY7CisJICBicmVhazsKKwljYXNlIDE2OgorCSAgc3JjYSA9IChzaG9ydCkgKGNvbnRleHQtPnNyY2EpOworCSAgc3JjYiA9IChzaG9ydCkgKGNvbnRleHQtPnNyY2IpOworCSAgZHN0ID0gKHNob3J0KSAoY29udGV4dC0+ZHN0KTsKKwkgIG1hc2sgPSAweGZmZmY7CisJICBicmVhazsKKwljYXNlIDMyOgorCSAgc3JjYSA9IChsb25nKSAoY29udGV4dC0+c3JjYSk7CisJICBzcmNiID0gKGxvbmcpIChjb250ZXh0LT5zcmNiKTsKKwkgIGRzdCA9IChsb25nKSAoY29udGV4dC0+ZHN0KTsKKwkgIG1hc2sgPSAweGZmZmZmZmZmOworCSAgYnJlYWs7CisJfQorCisgICAgICBzd2l0Y2ggKGMpCisJeworCWNhc2UgVDoKKwkgIHJldHVybiAxOworCWNhc2UgRjoKKwkgIHJldHVybiAwOworCWNhc2UgRVE6CisJICByZXR1cm4gIWRzdDsKKwljYXNlIE5FOgorCSAgcmV0dXJuIGRzdDsKKwljYXNlIEdUOgorCSAgYW5zID0gKChkc3QpKSA+IDA7CisJICBpZiAoc2xvdykKKwkgICAgeworCSAgICAgIGlmIChpc19jb25kX3RydWUgKGNvbnRleHQsIGMpICE9IGFucykKKwkJYWJvcnQgKCk7CisJICAgIH0KKwkgIHJldHVybiBhbnM7CisJY2FzZSBMRToKKwkgIGFucyA9ICgoZHN0KSkgPD0gMDsKKwkgIGlmIChzbG93KQorCSAgICB7CisJICAgICAgaWYgKGlzX2NvbmRfdHJ1ZSAoY29udGV4dCwgYykgIT0gYW5zKQorCQlhYm9ydCAoKTsKKwkgICAgfQorCSAgcmV0dXJuIGFuczsKKwljYXNlIEdFOgorCSAgYW5zID0gKChkc3QpKSA+PSAwOworCSAgaWYgKHNsb3cpCisJICAgIHsKKwkgICAgICBpZiAoaXNfY29uZF90cnVlIChjb250ZXh0LCBjKSAhPSBhbnMpCisJCWFib3J0ICgpOworCSAgICB9CisJICByZXR1cm4gYW5zOworCWNhc2UgTFQ6CisJICBhbnMgPSAoKGRzdCkpIDwgMDsKKwkgIGlmIChzbG93KQorCSAgICB7CisJICAgICAgaWYgKGlzX2NvbmRfdHJ1ZSAoY29udGV4dCwgYykgIT0gYW5zKQorCQlhYm9ydCAoKTsKKwkgICAgfQorCSAgcmV0dXJuIGFuczsKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorCisgICAgICAvKiBDYW4ndCBmYWtlIGl0LCB3ZSdsbCBoYXZlIHRvIHdvcmsgb3V0IHRoZSBmbGFncyB0aGUKKyAgICAgICAgIGhhcmQgd2F5ICovCisKKyAgICAgIG1ha2VmbGFncyAoY29udGV4dCwgbWFzayk7CisgICAgfQorCisgIC8qIGRvbid0IGtub3cgaG93IHRvIGZha2UgYSB0ZXN0LCBpbnNwZWN0IHRoZSBmbGFncworICAgICB0aGUgaGFyZCB3YXkgKi8KKworICByZXR1cm4gaXNfY29uZF90cnVlIChjb250ZXh0LCBjKTsKK30KZGlmZiAtLWdpdCBhL3NpbS96OGsvc3lzY2FsbC5oIGIvc2ltL3o4ay9zeXNjYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5Y2Q1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NpbS96OGsvc3lzY2FsbC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIHN5c3RlbSBjYWxsIG51bWJlcnMKKyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgWjhLU0lNCisKK1o4S1NJTSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1o4S1NJTSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIFo4S1pJTTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworI2RlZmluZQlTWVNfZXhpdAkxCisjZGVmaW5lCVNZU19mb3JrCTIKKyNkZWZpbmUJU1lTX3JlYWQJMworI2RlZmluZQlTWVNfd3JpdGUJNAorI2RlZmluZQlTWVNfb3Blbgk1CisjZGVmaW5lCVNZU19jbG9zZQk2CisjZGVmaW5lCVNZU193YWl0NAk3CisjZGVmaW5lCVNZU19jcmVhdAk4CisjZGVmaW5lCVNZU19saW5rCTkKKyNkZWZpbmUJU1lTX3VubGluawkxMAorI2RlZmluZQlTWVNfZXhlY3YJMTEKKyNkZWZpbmUJU1lTX2NoZGlyCTEyCisjZGVmaW5lCVNZU19ta25vZAkxNAorI2RlZmluZQlTWVNfY2htb2QJMTUKKyNkZWZpbmUJU1lTX2Nob3duCTE2CisjZGVmaW5lCVNZU19sc2VlawkxOQorI2RlZmluZQlTWVNfZ2V0cGlkCTIwCisjZGVmaW5lIFNZU19pc2F0dHkgICAgICAyMQorI2RlZmluZSBTWVNfZnN0YXQgICAgICAgMjIKKyNkZWZpbmUgU1lTX3RpbWUgCTIzCisKKworI2RlZmluZSBTWVNfQVJHCQkyNApkaWZmIC0tZ2l0IGEvc2ltL3o4ay90Y29uZmlnLmluIGIvc2ltL3o4ay90Y29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYzBjMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vejhrL3Rjb25maWcuaW4KQEAgLTAsMCArMSwxMyBAQAorLyogejhrIHRhcmdldCBjb25maWd1cmF0aW9uIGZpbGUuICAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHN1cHBvcnRzIHByb2ZpbGluZy4KKyAgIFNlZSB0aGUgbWlwcyBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCisgICBUaGlzIGVuYWJsZXMgdGhlIGAtcCBmb28nIGFuZCBgLXMgYmFyJyBvcHRpb25zLgorICAgVGhlIHRhcmdldCBpcyByZXF1aXJlZCB0byBwcm92aWRlIHNpbV9zZXRfcHJvZmlsZXssX3NpemV9LiAgKi8KKy8qICNkZWZpbmUgU0lNX0hBVkVfUFJPRklMRSAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB0aGUgc2ltdWxhdG9yIHVzZXMgYW4gaW5zdHJ1Y3Rpb24gY2FjaGUuCisgICBTZWUgdGhlIGg4LzMwMCBzaW11bGF0b3IgZm9yIGFuIGV4YW1wbGUuCisgICBUaGlzIGVuYWJsZXMgdGhlIGAtYyBzaXplJyBvcHRpb24gdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBjYWNoZS4KKyAgIFRoZSB0YXJnZXQgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzaW1fc2V0X3NpbWNhY2hlX3NpemUuICAqLworLyogI2RlZmluZSBTSU1fSEFWRV9TSU1DQUNIRSAqLwpkaWZmIC0tZ2l0IGEvc2ltL3o4ay90bS5oIGIvc2ltL3o4ay90bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MjdmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zaW0vejhrL3RtLmgKQEAgLTAsMCArMSwxOTIgQEAKKy8qIHRtLmgKKyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgWjhLU0lNCisKK1o4S1NJTSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK1o4S1NJTSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIFo4S1pJTTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpZm5kZWYgX1RNX0gKKyNkZWZpbmUgX1RNX0gKKworI2lmZGVmIF9fRk9PQkVZR05VQ19fCit0eXBlZGVmIFNGdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZSAoU0YpKSk7Cit0eXBlZGVmIERGdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZSAoREYpKSk7CisKK3R5cGVkZWYgaW50IEhJdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZSAoSEkpKSk7Cit0eXBlZGVmIGludCBTSXR5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFNJKSkpOworCit0eXBlZGVmIHVuc2lnbmVkIGludCBVSEl0eXBlIF9fYXR0cmlidXRlX18gKChtb2RlIChISSkpKTsKK3R5cGVkZWYgdW5zaWduZWQgaW50IFVTSXR5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFNJKSkpOworI2Vsc2UKK3R5cGVkZWYgZmxvYXQgU0Z0eXBlOwordHlwZWRlZiBkb3VibGUgREZ0eXBlOwordHlwZWRlZiBzaG9ydCBpbnQgSEl0eXBlOwordHlwZWRlZiBsb25nIGludCBTSXR5cGU7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVISXR5cGUgOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVVNJdHlwZSA7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgVURJc3RydWN0Cit7CisgIFVTSXR5cGUgaGlnaDsKKyAgVVNJdHlwZSBsb3c7Cit9IFVESXR5cGU7CisKKyNkZWZpbmUgQklHX0VORElBTl9IT1NUCit0eXBlZGVmIHVuc2lnbmVkIGludCBzaW1fcGh5c19hZGRyX3R5cGU7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBzaW1fbG9naWNhbF9hZGRyX3R5cGU7CisKKyNkZWZpbmUgUEFHRV9QT1dFUiAyMwkJLyogIG9ubHkgb25lIHBhZ2VzICovCisKKyNkZWZpbmUgTUFQX1BIWVNJQ0FMX1RPX0xPR0lDQUwoeCkgICgoKHggPj4gOCkgJiAweDdmMDAwMCkgfCAoeCAmIDB4ZmZmZikpCisjZGVmaW5lIE1BUF9MT0dJQ0FMX1RPX1BIWVNJQ0FMKHgpICAoKCh4IDw8OCkgJiAweDdmMDAwMDAwKSB8ICh4ICYgMHhmZmZmKSkKKyNkZWZpbmUgUkVHX1BDICAgICAxNworI2RlZmluZSBSRUdfQ1lDTEVTIDE4CisjZGVmaW5lIFJFR19JTlNUUyAgMTkKKyNkZWZpbmUgUkVHX1RJTUUgICAyMAorI2RlZmluZSBSRUdfRlAgICAgIDIxCisjZGVmaW5lIFJFR19TUCAgICAgMjIKKyNkZWZpbmUgUkVHX0NDUiAgICAxNgorCisjZGVmaW5lIFNFVF9SRUcoeCx5KSAgc2V0X3JlZyh4LHkpCisjZGVmaW5lIFNJTkdMRV9TVEVQIDEKKworI2RlZmluZSBQU1dfQ0FSUlkgY29udGV4dC0+Y2FycnkKKyNkZWZpbmUgUFNXX09QICAgIGNvbnRleHQtPm9wCisjZGVmaW5lIFBTV19PVkVSRkxPVyBjb250ZXh0LT5vdmVyZmxvdworI2RlZmluZSBQU1dfU0lHTiBjb250ZXh0LT5zaWduCisjZGVmaW5lIFBTV19aRVJPIGNvbnRleHQtPnplcm8KKyNkZWZpbmUgR0VUX1BDKCkgIGNvbnRleHQtPnBjCisjZGVmaW5lIFNFVF9QQyh4KSBjb250ZXh0LT5wYyA9IHgKKworc3RydWN0IG9wX2luZm8KK3sKKyAgc2hvcnQgaW50IGV4ZWM7Cit9OworCitleHRlcm4gc3RydWN0IG9wX2luZm8gb3BfaW5mb190YWJsZVtdOworCit0eXBlZGVmIHVuaW9uCit7CisgIHVuc2lnbmVkIHNob3J0IGludCB3b3JkOworCit9CisKK2JvcndfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3Qgc3RhdGVfc3RydWN0Cit7CisgIHVuc2lnbmVkIHNob3J0ICptZW1vcnk7CisgIGludCBjYXJyeTsKKyAgaW50IHNpZ247CisgIGludCB6ZXJvOworICBpbnQgb3ZlcmZsb3c7CisgIGludCBvcDsKKyAgaW50IGN5Y2xlczsKKworICBib3J3X3R5cGUgcmVnc1sxNl07CisKKyAgc2ltX3BoeXNfYWRkcl90eXBlIHNvbWV0aW1lc19wYzsKKyNpZmRlZiBfX0dOVUNfXworICB2b2xhdGlsZQorI2VuZGlmCisgIGludCBleGNlcHRpb247CisKKyNkZWZpbmUgaXdvcmRzXzAgIGl3b3JkczAKKyNkZWZpbmUgaXdvcmRzXzEgIGl3b3JkczEKKyNkZWZpbmUgaXdvcmRzXzIgIGl3b3JkczIKKyNkZWZpbmUgaXdvcmRzXzMgIGl3b3JkczMKKworI2RlZmluZSBpYnl0ZXNfMCAgICAoaXdvcmRzXzA+PjgpCisjZGVmaW5lIGlieXRlc18xICAgIChpd29yZHNfMCYweGZmKQorI2RlZmluZSBpYnl0ZXNfMiAgICAoaXdvcmRzXzE+PjgpCisjZGVmaW5lIGlieXRlc18zICAgIChpd29yZHNfMSYgMHhmZikKKyNkZWZpbmUgaWJ5dGVzXzQgICAgKGl3b3Jkc18yPj44KQorCisgIGludCBpbnN0czsKKyAgaW50IHRpY2tzOworCisgIGludCBuZXh0X2luc3Q7CisgIGludCBicm9rZW5fZmxhZ3M7CisKKyAgaW50IHNyY2E7CisgIGludCBzcmNiOworICBpbnQgZHN0OworICBpbnQgc2l6ZTsKK30KKworc2ltX3N0YXRlX3R5cGU7CisKKyNkZWZpbmUgQ01QX0ZMQUdTIDEwMAorI2RlZmluZSBUU1RfRkxBR1MgMTAxCisjZW5kaWYKKworZXh0ZXJuIGludCBnZXRfd29yZF9tZW1fZGEgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IGFkZHIpKTsgCitleHRlcm4gaW50IGdldF93b3JkX3JlZyBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgcmVnKSk7IAorZXh0ZXJuIHZvaWQgc3VwcG9ydF9jYWxsIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCBzYykpOyAKK2V4dGVybiB2b2lkIHRtX2V4Y2VwdGlvbiBQQVJBTVMoKGludCB4KSk7IAorZXh0ZXJuIGludCB0bV9yZWFkX2J5dGUgUEFSQU1TKChpbnQgeCkpOyAKK2V4dGVybiBpbnQgdG1fc2lnbmFsIFBBUkFNUygodm9pZCkpOyAKK2V4dGVybiB2b2lkIHRtX3N0YXRlIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKngpKTsgCitleHRlcm4gdm9pZCB0bV93cml0ZV9ieXRlIFBBUkFNUygoaW50IHgsIGludCB5KSk7IAorZXh0ZXJuIHZvaWQgYmZvcF9iYWQxIFBBUkFNUygoKSk7IAorZXh0ZXJuIGludCBmYWlsIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCB2KSk7IAorZXh0ZXJuIHZvaWQgZm9wX2JhZCBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0KSk7IAorZXh0ZXJuIHZvaWQgc2ZvcF9iYWQxIFBBUkFNUygoKSk7IAorZXh0ZXJuIHZvaWQgc3dhcF9sb25nIFBBUkFNUygoY2hhciAqYnVmLCBpbnQgdmFsKSk7IAorZXh0ZXJuIHZvaWQgc3dhcF93b3JkIFBBUkFNUygoY2hhciAqYnVmLCBpbnQgdmFsKSk7IAorZXh0ZXJuIHZvaWQgdG1fZmV0Y2hfcmVnaXN0ZXIgUEFSQU1TKChpbnQgcmVnbm8sIGNoYXIgKmJ1ZikpOyAKK2V4dGVybiB2b2lkIHRtX2luZm9fcHJpbnQgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqeCkpOyAKK2V4dGVybiB2b2lkIHRtX3Jlc3VtZSBQQVJBTVMoKGludCBzdGVwKSk7IAorZXh0ZXJuIHZvaWQgdG1fc3RvcmVfcmVnaXN0ZXIgUEFSQU1TKChpbnQgcmVnbm8sIGludCB2YWx1ZSkpOyAKKworCisjaWZuZGVmIF9fR05VQ19fCisvKiBJZiB3ZXJlIHVzaW5nIGdudWMgdGhlbiB0aGVzZSB3aWxsIGJlIGlubGluZWQsIHNvIHRoZSBwcm90b3R5cGVzIAorIHdvbid0IGJlIHJpZ2h0ICovCitsb25nIGludCBzaXRvcHRyIFBBUkFNUygobG9uZyBpbnQgc2kpKTsgCitsb25nIGludCBwdHJ0b3NpIFBBUkFNUygobG9uZyBpbnQgcHRyKSk7IAordm9pZCBwdXRfbG9uZ19yZWcgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IHJlZywgaW50IHZhbCkpOyAKK3ZvaWQgcHV0X3F1YWRfcmVnIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCByZWcsIGludCB2YWwxLCBpbnQgdmFsMikpOyAKK3ZvaWQgcHV0X3dvcmRfcmVnIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCByZWcsIGludCB2YWwpKTsgCitTSXR5cGUgZ2V0X2xvbmdfcmVnIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCByZWcpKTsgCit2b2lkIHB1dF9ieXRlX3JlZyBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgcmVnLCBpbnQgdmFsKSk7IAoraW50IGdldF9ieXRlX3JlZyBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgcmVnKSk7IAordm9pZCBwdXRfd29yZF9tZW1fZGEgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IGFkZHIsIGludCB2YWx1ZSkpOyAKK3Vuc2lnbmVkIGNoYXIgZ2V0X2J5dGVfbWVtX2RhIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCBhZGRyKSk7IAordm9pZCBwdXRfYnl0ZV9tZW1fZGEgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IGFkZHIsIGludCB2YWx1ZSkpOyAKK1NJdHlwZSBnZXRfbG9uZ19tZW1fZGEgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IGFkZHIpKTsgCit2b2lkIHB1dF9sb25nX21lbV9kYSBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgYWRkciwgaW50IHZhbHVlKSk7IAoraW50IGdldF93b3JkX21lbV9pciBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgcmVnKSk7IAordm9pZCBwdXRfd29yZF9tZW1faXIgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IHJlZywgaW50IHZhbHVlKSk7IAoraW50IGdldF9ieXRlX21lbV9pciBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgcmVnKSk7IAordm9pZCBwdXRfYnl0ZV9tZW1faXIgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IHJlZywgaW50IHZhbHVlKSk7IAoraW50IGdldF9sb25nX21lbV9pciBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgcmVnKSk7IAordm9pZCBwdXRfbG9uZ19tZW1faXIgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IHJlZywgaW50IHZhbHVlKSk7IAordm9pZCBwdXRfbG9uZ19tZW1feCBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgYmFzZSwgaW50IHJlZywgaW50IHZhbHVlKSk7IAordm9pZCBwdXRfd29yZF9tZW1feCBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgYmFzZSwgaW50IHJlZywgaW50IHZhbHVlKSk7IAordm9pZCBwdXRfYnl0ZV9tZW1feCBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgYmFzZSwgaW50IHJlZywgaW50IHZhbHVlKSk7IAoraW50IGdldF93b3JkX21lbV94IFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCBiYXNlLCBpbnQgcmVnKSk7IAoraW50IGdldF9ieXRlX21lbV94IFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCBiYXNlLCBpbnQgcmVnKSk7IAoraW50IGdldF9sb25nX21lbV94IFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGludCBiYXNlLCBpbnQgcmVnKSk7IAoraW50IENPTkQgUEFSQU1TKChzaW1fc3RhdGVfdHlwZSAqY29udGV4dCwgaW50IGMpKTsgCit2b2lkIE5PUk1BTF9GTEFHUyBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgc2l6ZSwgaW50IGRzdCwgaW50IHNyY2EsIGludCBzcmNiKSk7IAordm9pZCBURVNUX05PUk1BTF9GTEFHUyBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgc2l6ZSwgaW50IGRzdCkpOyAKK3ZvaWQgcHV0X3B0cl9sb25nX3JlZyBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgcmVnLCBpbnQgdmFsKSk7IAorbG9uZyBpbnQgZ2V0X3B0cl9sb25nX3JlZyBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgcmVnKSk7IAorbG9uZyBpbnQgZ2V0X3B0cl9sb25nX21lbV9pciBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBpbnQgcmVnKSk7IAorbG9uZyBpbnQgZ2V0X3B0cl9sb25nX21lbV9kYSBQQVJBTVMoKHNpbV9zdGF0ZV90eXBlICpjb250ZXh0LCBsb25nIGludCBhZGRyKSk7IAordm9pZCBwdXRfcHRyX2xvbmdfbWVtX2RhIFBBUkFNUygoc2ltX3N0YXRlX3R5cGUgKmNvbnRleHQsIGxvbmcgaW50IGFkZHIsIGxvbmcgaW50IHB0cikpOyAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2ltL3o4ay93cml0ZWNvZGUuYyBiL3NpbS96OGsvd3JpdGVjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0Yzg2OAotLS0gL2Rldi9udWxsCisrKyBiL3NpbS96OGsvd3JpdGVjb2RlLmMKQEAgLTAsMCArMSwyMDExIEBACisKKy8qIGdlbmVyYXRlIGluc3RydWN0aW9ucyBmb3IgWjhLU0lNCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIFo4S1NJTQorCitaOEtTSU0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitaOEtTSU0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBaOEtaSU07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBUaGlzIHByb2dyYW0gZ2VuZXJhdGVzIHRoZSBjb2RlIHdoaWNoIGVtdWxhdGVzIGVhY2ggb2YgdGhlIHo4aworICAgaW5zdHJ1Y3Rpb25zCisKKyAgIGNvZGUgZ29lcyBpbnRvIHRocmVlIGZpbGVzLCB0Yy1nZW4xLmgsIHRjLWdlbjIuaCBhbmQgdGMtZ2VuMy5oLgorICAgd2hpY2ggZmlsZSBiZWluZyBtYWRlIGRlcGVuZHMgdXBvbiB0aGUgb3B0aW9ucworCisgICAtMSAgdGMtZ2VuMS5oIGNvbnRhaW5zIHRoZSBmdWxseSBleHBhbmRlZCBjb2RlIGZvciBzb21lIHNlbGVjdGVkCisgICAgICAgb3Bjb2RlcywgKHRob3NlIGluIHRoZSBxdWljay5jIGxpc3QpCisKKyAgIC0yICAgdGMtZ2VuMi5oIGNvbnRhaW5zIGEgbGlzdCBvZiBwb2ludGVycyB0byBmdW5jdGlvbnMsIG9uZSBmb3IgZWFjaAorICAgb3Bjb2RlLiAgSXQgcG9pbnRzIHRvIGZ1bmN0aW9ucyBpbiB0Yy1nZW4zLmggYW5kIHRjLWdlbjEuaAorICAgZGVwZW5kaW5nIHVwb24gcXVpY2suYworCisgICAtMyAgIHRjLWdlbjMuaCBjb250YWlucyBhbGwgdGhlIG9wY29kZXMgaW4gdW5leHBhbmRlZCBmb3JtLgorCisgICAtYjMgICB0Yy1nZW5iMy5oIHNhbWUgYXMgLTMgYnV0IGZvciBsb25nIHBvaW50ZXJzCisKKyAgIC1tICByZWdlbmVyYXRlcyBsaXN0LmMsIHdoaWNoIGlzIGFuIGludmVydGVkIGxpc3Qgb2Ygb3Bjb2RlcyB0bworICAgICAgIHBvaW50ZXJzIGludG8gdGhlIHo4ayBkaXNzYXNzZW1ibGUgb3Bjb2RlIHRhYmxlLCBpdCdzIGp1c3QgdGhlcmUKKyAgICAgICB0byBtYWtlcyB0aGluZ3MgZmFzdGVyLgorICAgKi8KKworLyogc3RldmUgY2hhbWJlcmxhaW4KKyAgIHNhY0BjeWdudXMuY29tICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPGFuc2lkZWNsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorI2lmZGVmIEhBVkVfU1RSSU5HU19ICisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBOSUNFTkFNRVMKKworI2RlZmluZSBERUZJTkVfVEFCTEUKKyNpbmNsdWRlICIuLi9vcGNvZGVzL3o4ay1vcGMuaCIKKworI2RlZmluZSBOT1BTIDUwMAorCisjZGVmaW5lIERJUlRZX0hBQ0sgMCAvKiBFbmFibGUgaWYgeW91ciBnY2MgY2FuJ3QgY29wZSB3aXRoIGh1Z2UgdGFibGVzICovCitleHRlcm4gc2hvcnQgejhrX2ludl9saXN0W107CitzdHJ1Y3Qgb3Bjb2RlX3ZhbHVlCit7CisgIGludCBuOworICBzdHJ1Y3Qgb3Bjb2RlX3ZhbHVlICpuZXh0OworfTsKKworI2RlZmluZSBOSUNFTkFNRVMKK2ludCBCSUc7CisKK3N0YXRpYyBjaGFyICpyZWdfbmFtZXNbXSA9Cit7ImJhZCIsICJzcmMiLCAiZHN0IiwgImF1eF9hIiwgImF1eF9iIiwgImF1eF9yIiwgImF1eF94In07CisKKyNkZWZpbmUgSVNfRFNUKHgpICgoeCAmIDB4ZikgPT0gMikKKyNkZWZpbmUgSVNfU1JDKHgpICgoeCAmIDB4Zik9PTEpCisjZGVmaW5lIFNJWkVfQUREUkVTUyAoQklHID8gOCA6IDQpCS8qIG51bWJlciBvZiBuaWJibGVzIGluIGEgcHRyKi8KKworc3RhdGljIGludCBmaWxlOworc3RhdGljIGludCBtYWtlbGlzdDsKKworc3RhdGljIGludCBuaWJzID0gMDsKKworc3RhdGljIGNoYXIgKmN1cnJlbnRfc2l6ZTsKK3N0YXRpYyBjaGFyICpjdXJyZW50X25hbWU7CitzdGF0aWMgY2hhciBjdXJyZW50X3dvcmQwWzQwXTsKK3N0YXRpYyBjaGFyIGN1cnJlbnRfYnl0ZTBbNDBdOworc3RhdGljIGNoYXIgY3VycmVudF9ieXRlMVs0MF07CitzdGF0aWMgaW50IGluZGVudDsKK3N0YXRpYyBjaGFyICpwOworc3RhdGljIGNoYXIgKmQ7CisKK3N0cnVjdCBvcGNvZGVfdmFsdWUgKmxpc3RbTk9QU107CisKK3N0YXRpYyBvcGNvZGVfZW50cnlfdHlwZSAqCitsb29rdXBfaW5zdCAod2hhdCkKKyAgICAgaW50IHdoYXQ7Cit7CisgIGlmIChtYWtlbGlzdCkKKyAgICB7CisKKyAgICAgIGludCBuaWJsX2luZGV4OworICAgICAgaW50IG5pYmxfbWF0Y2hlZDsKKyAgICAgIHVuc2lnbmVkIHNob3J0IGluc3RyX25pYmw7CisgICAgICB1bnNpZ25lZCBzaG9ydCB0YWJsX2RhdHVtLCBkYXR1bV9jbGFzcywgZGF0dW1fdmFsdWU7CisgICAgICBjaGFyIGluc3RyX25pYmJsZXNbOF07CisKKyAgICAgIG9wY29kZV9lbnRyeV90eXBlICpwdHIgPSB6OGtfdGFibGU7CisKKyAgICAgIG5pYmxfbWF0Y2hlZCA9IDA7CisKKyAgICAgIGluc3RyX25pYmJsZXNbM10gPSAod2hhdCA+PiAwKSAmIDB4ZjsKKyAgICAgIGluc3RyX25pYmJsZXNbMl0gPSAod2hhdCA+PiA0KSAmIDB4ZjsKKyAgICAgIGluc3RyX25pYmJsZXNbMV0gPSAod2hhdCA+PiA4KSAmIDB4ZjsKKyAgICAgIGluc3RyX25pYmJsZXNbMF0gPSAod2hhdCA+PiAxMikgJiAweGY7CisKKyAgICAgIHdoaWxlIChwdHItPm5hbWUpCisJeworCSAgbmlibF9tYXRjaGVkID0gMTsKKwkgIGZvciAobmlibF9pbmRleCA9IDA7IG5pYmxfaW5kZXggPCA0ICYmIG5pYmxfbWF0Y2hlZDsgbmlibF9pbmRleCsrKQorCSAgICB7CisJICAgICAgaW5zdHJfbmlibCA9IGluc3RyX25pYmJsZXNbbmlibF9pbmRleF07CisKKwkgICAgICB0YWJsX2RhdHVtID0gcHRyLT5ieXRlX2luZm9bbmlibF9pbmRleF07CisJICAgICAgZGF0dW1fY2xhc3MgPSB0YWJsX2RhdHVtICYgQ0xBU1NfTUFTSzsKKwkgICAgICBkYXR1bV92YWx1ZSA9IH5DTEFTU19NQVNLICYgdGFibF9kYXR1bTsKKworCSAgICAgIHN3aXRjaCAoZGF0dW1fY2xhc3MpCisJCXsKKwkJY2FzZSBDTEFTU19CSVRfMU9SMjoKKwkJICBpZiAoZGF0dW1fdmFsdWUgIT0gKGluc3RyX25pYmwgJiB+MHgyKSkKKwkJICAgIG5pYmxfbWF0Y2hlZCA9IDA7CisJCSAgYnJlYWs7CisKKwkJY2FzZSBDTEFTU19CSVQ6CisJCSAgaWYgKGRhdHVtX3ZhbHVlICE9IGluc3RyX25pYmwpCisJCSAgICBuaWJsX21hdGNoZWQgPSAwOworCQkgIGJyZWFrOworCQljYXNlIENMQVNTXzAwSUk6CisJCSAgaWYgKCEoKH5pbnN0cl9uaWJsKSAmIDB4NCkpCisJCSAgICBuaWJsX21hdGNoZWQgPSAwOworCQkgIGJyZWFrOworCQljYXNlIENMQVNTXzAxSUk6CisJCSAgaWYgKCEoaW5zdHJfbmlibCAmIDB4NCkpCisJCSAgICBuaWJsX21hdGNoZWQgPSAwOworCQkgIGJyZWFrOworCQljYXNlIENMQVNTXzBDQ0M6CisJCSAgaWYgKCEoKH5pbnN0cl9uaWJsKSAmIDB4OCkpCisJCSAgICBuaWJsX21hdGNoZWQgPSAwOworCQkgIGJyZWFrOworCQljYXNlIENMQVNTXzFDQ0M6CisJCSAgaWYgKCEoaW5zdHJfbmlibCAmIDB4OCkpCisJCSAgICBuaWJsX21hdGNoZWQgPSAwOworCQkgIGJyZWFrOworCQljYXNlIENMQVNTXzBESVNQNzoKKwkJICBpZiAoISgofmluc3RyX25pYmwpICYgMHg4KSkKKwkJICAgIG5pYmxfbWF0Y2hlZCA9IDA7CisJCSAgbmlibF9pbmRleCArPSAxOworCQkgIGJyZWFrOworCQljYXNlIENMQVNTXzFESVNQNzoKKwkJICBpZiAoIShpbnN0cl9uaWJsICYgMHg4KSkKKwkJICAgIG5pYmxfbWF0Y2hlZCA9IDA7CisJCSAgbmlibF9pbmRleCArPSAxOworCQkgIGJyZWFrOworCQljYXNlIENMQVNTX1JFR04wOgorCQkgIGlmIChpbnN0cl9uaWJsID09IDApCisJCSAgICBuaWJsX21hdGNoZWQgPSAwOworCQkgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwkgIGlmIChuaWJsX21hdGNoZWQpCisJICAgIHsKKwkgICAgICByZXR1cm4gcHRyOworCSAgICB9CisJICBwdHIrKzsKKwl9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisKKyAgICAgIGlmICh6OGtfaW52X2xpc3Rbd2hhdF0gPCAwKQorCXJldHVybiAwOworICAgICAgcmV0dXJuIHo4a190YWJsZSArIHo4a19pbnZfbGlzdFt3aGF0XTsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICoKK2luc25fNCAobikKKyAgICAgaW50IG47Cit7CisgIHN3aXRjaCAobikKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgcmV0dXJuICIoKGl3b3Jkc18wPj44KSAmIDB4ZikiOworICAgIGNhc2UgMjoKKyAgICAgIHJldHVybiAiKChpYnl0ZXNfMSA+PiA0KSAmIDB4ZikiOworICAgIGNhc2UgMzoKKyAgICAgIHJldHVybiAiKChpYnl0ZXNfMSkgJiAweGYpIjsKKyAgICBjYXNlIDQ6CisgICAgICByZXR1cm4gIigoaWJ5dGVzXzI+PjQpICYgMHhmKSI7CisgICAgY2FzZSA1OgorICAgICAgcmV0dXJuICIoKGlieXRlc18yKSAmIDB4ZikiOworICAgIGNhc2UgNjoKKyAgICAgIHJldHVybiAiKChpYnl0ZXNfMyA+PiA0KSAmIDB4ZikiOworICAgIGNhc2UgNzoKKyAgICAgIHJldHVybiAiKChpYnl0ZXNfMykgJiAweGYpIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICIqKioqIjsKKyAgICB9Cit9CisKK2NoYXIgKgorcHRyX21vZGUgKCkKK3sKKyAgaWYgKEJJRykKKyAgICB7CisgICAgICByZXR1cm4gInB0cl9sb25nIjsKKyAgICB9CisgIHJldHVybiAid29yZCI7Cit9CisKK3N0YXRpYworY2hhciAqCitwdHJfc2l6ZSAoKQoreworICBpZiAoQklHKQorICAgIHJldHVybiAiNCI7CisgIHJldHVybiAiMiI7Cit9CisKK3N0YXRpYyBjaGFyICoKK3JlZ19uICh4KQorICAgICB1bnNpZ25lZCBpbnQgeDsKK3sKKyAgcmV0dXJuIHJlZ19uYW1lc1t4ICYgMHhmXTsKK30KKworY2hhciAqCitzdGFja19wdHIgKCkKK3sKKyAgcmV0dXJuIEJJRyA/ICIxNCIgOiAiMTUiOworfQorCitjaGFyICoKK21lbSAoKQoreworI2lmIDAKKyAgcmV0dXJuIEJJRyA/ICJzZWdtZW0iIDogInVuc2VnbWVtIjsKKyNlbHNlCisgIHJldHVybiAibWVtIjsKKyNlbmRpZgorfQorCitpbnQKK21hdGNoIChhKQorICAgICBjaGFyICphOworeworICBpZiAoc3RybmNtcCAocCwgYSwgc3RybGVuIChhKSkgPT0gMCkKKyAgICB7CisgICAgICBwICs9IHN0cmxlbiAoYSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMKK3ZvaWQKK3N1YiAoeSkKKyAgICAgY2hhciAqeTsKK3sKKyAgc3ByaW50ZiAoZCwgIiVzIiwgeSk7CisgIGQgKz0gc3RybGVuIChkKTsKK30KKworc3RhdGljIGNoYXIgKgoraW5zbl8xNiAobikKKyAgICAgaW50IG47Cit7CisgIHN3aXRjaCAobikKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuICIoaXdvcmRzXzApIjsKKyAgICBjYXNlIDQ6CisgICAgICByZXR1cm4gIihpd29yZHNfMSkiOworICAgIGNhc2UgODoKKyAgICAgIHJldHVybiAiKGl3b3Jkc18yKSI7CisgICAgY2FzZSAxMjoKKyAgICAgIHJldHVybiAiKGl3b3Jkc18zKSI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiKioqKiI7CisgICAgfQorfQorCitzdGF0aWMKK2NoYXIgKgoraW5zbl8zMiAobikKKyAgICAgaW50IG47Cit7CisgIHN3aXRjaCAobikKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuICIoKGl3b3Jkc18wPDwxNikgfCAoaXdvcmRzXzEpKSI7CisgICAgY2FzZSA0OgorICAgICAgcmV0dXJuICIoKGl3b3Jkc18xPDwxNikgfCAoaXdvcmRzXzIpKSI7CisgICAgY2FzZSA4OgorICAgICAgcmV0dXJuICIoKGl3b3Jkc18yPDwxNikgfCAoaXdvcmRzXzMpKSI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiKioqKiI7CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqCitzaXplX25hbWUgKHgpCisgICAgIGludCB4OworeworICBzd2l0Y2ggKHgpCisgICAgeworICAgIGNhc2UgODoKKyAgICAgIHJldHVybiAiYnl0ZSI7CisgICAgY2FzZSAxNjoKKyAgICAgIHJldHVybiAid29yZCI7CisgICAgY2FzZSAzMjoKKyAgICAgIHJldHVybiAibG9uZyI7CisgICAgY2FzZSA2NDoKKyAgICAgIHJldHVybiAicXVhZCI7CisgICAgfQorICByZXR1cm4gIiEhIjsKK30KKworLypWQVJBUkdTKi8KK3ZvaWQKK2VtaXQgKHN0cmluZywgYTEsIGEyLCBhMywgYTQsIGE1KQorICAgICBjaGFyICpzdHJpbmc7CisgICAgIGNoYXIqIGExOworICAgICBjaGFyKiBhMjsKKyAgICAgY2hhciogYTM7CisgICAgIGNoYXIqIGE0OworICAgICBjaGFyKiBhNTsKK3sKKyAgaW50IGluZGVudF9pbmMgPSAwOworICBpbnQgaW5kZW50X2RlYyA9IDA7CisgIGludCBpOworICBjaGFyIGJ1ZmZlclsxMDAwXTsKKworICBkID0gYnVmZmVyOworICBwID0gc3RyaW5nOworCisgIHdoaWxlICgqcCkKKyAgICB7CisgICAgICBpZiAobWF0Y2ggKCI8Zm9wPiIpKQorCXsKKwkgIGlmIChCSUcpCisJICAgIHsKKwkgICAgICBzdWIgKCJiZm9wIik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN1YiAoInNmb3AiKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKG1hdGNoICgiPGlwdHI+IikpCisJeworCSAgaWYgKEJJRykKKwkgICAgeworCSAgICAgIHN3aXRjaCAobmlicykKKwkJeworCQljYXNlIDQ6CisJCSAgc3ViICgiKCgoaXdvcmRzXzEgPDwgOCkgfCAoaXdvcmRzXzIpKSAmIDB4N2ZmZmZmKSIpOworCQkgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgIHN1YiAoImZhaWwoY29udGV4dCwxMjQpIik7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgc3dpdGNoIChuaWJzKQorCQl7CisJCWNhc2UgNDoKKwkJICBzdWIgKCJpd29yZHNfMSIpOworCQkgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgIHN1YiAoImZhaWwoY29udGV4dCwxMjMpIik7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKG1hdGNoICgiPG5hbWU+IikpCisJeworCSAgc3ViIChjdXJyZW50X25hbWUpOworCX0KKyAgICAgIGVsc2UgaWYgKG1hdGNoICgiPHNpemU+IikpCisJeworCSAgc3ViIChjdXJyZW50X3NpemUpOworCX0KKyAgICAgIGVsc2UgaWYgKG1hdGNoICgiPGluc25fND4iKSkKKwl7CisJICBzdWIgKGluc25fNCAobmlicykpOworCX0KKyAgICAgIGVsc2UgaWYgKG1hdGNoICgiPGluc25fMTY+IikpCisJeworCSAgc3ViIChpbnNuXzE2IChuaWJzKSk7CisJfQorICAgICAgZWxzZSBpZiAobWF0Y2ggKCI8aW5zbl8zMj4iKSkKKwl7CisJICBzdWIgKGluc25fMzIgKG5pYnMpKTsKKwl9CisgICAgICBlbHNlIGlmIChtYXRjaCAoIml3b3Jkc18wIikpCisJeworCSAgc3ViIChjdXJyZW50X3dvcmQwKTsKKwl9CisgICAgICBlbHNlIGlmIChtYXRjaCAoImlieXRlc18wIikpCisJeworCSAgc3ViIChjdXJyZW50X2J5dGUwKTsKKwl9CisgICAgICBlbHNlIGlmIChtYXRjaCAoIjxpYnl0ZXNfMT4iKSkKKwl7CisJICBzdWIgKGN1cnJlbnRfYnl0ZTEpOworCX0KKyAgICAgIGVsc2UgaWYgKG1hdGNoICgiPG5leHRfc2l6ZT4iKSkKKwl7CisJICBpZiAoc3RyY21wIChjdXJyZW50X3NpemUsICJ3b3JkIikgPT0gMCkKKwkgICAgc3ViICgibG9uZyIpOworCSAgaWYgKHN0cmNtcCAoY3VycmVudF9zaXplLCAiYnl0ZSIpID09IDApCisJICAgIHN1YiAoIndvcmQiKTsKKwkgIGVsc2UgaWYgKHN0cmNtcCAoY3VycmVudF9zaXplLCAibG9uZyIpID09IDApCisJICAgIHN1YiAoInF1YWQiKTsKKwkgIGVsc2UKKwkgICAgYWJvcnQgKCk7CisJfQorICAgICAgZWxzZSBpZiAobWF0Y2ggKCI8YWRkcl90eXBlPiIpKQorCXsKKwkgIGlmIChCSUcpCisJICAgIHN1YiAoInVuc2lnbmVkIGxvbmciKTsKKwkgIGVsc2UKKwkgICAgc3ViICgidW5zaWduZWQgc2hvcnQiKTsKKwl9CisKKyAgICAgIGVsc2UgaWYgKG1hdGNoICgiPGNfc2l6ZT4iKSkKKwl7CisJICBpZiAoc3RyY21wIChjdXJyZW50X3NpemUsICJ3b3JkIikgPT0gMCkKKwkgICAgc3ViICgic2hvcnQiKTsKKwkgIGVsc2UgaWYgKHN0cmNtcCAoY3VycmVudF9zaXplLCAiYnl0ZSIpID09IDApCisJICAgIHN1YiAoImNoYXIiKTsKKwkgIGVsc2UgaWYgKHN0cmNtcCAoY3VycmVudF9zaXplLCAibG9uZyIpID09IDApCisJICAgIHN1YiAoImxvbmciKTsKKwkgIGVsc2UKKwkgICAgYWJvcnQgKCk7CisJfQorCisgICAgICBlbHNlIGlmIChtYXRjaCAoIjxwYz4iKSkKKwl7CisJICBzdWIgKCJwYyIpOworCX0KKyAgICAgIGVsc2UgaWYgKG1hdGNoICgiPG1lbT4iKSkKKwl7CisJICBzdWIgKG1lbSAoKSk7CisJfQorICAgICAgZWxzZSBpZiAobWF0Y2ggKCI8c3A+IikpCisJeworCSAgc3ViIChzdGFja19wdHIgKCkpOworCX0KKyAgICAgIGVsc2UgaWYgKG1hdGNoICgiPHB0cl9zaXplPiIpKQorCXsKKwkgIHN1YiAocHRyX3NpemUgKCkpOworCX0KKyAgICAgIGVsc2UgaWYgKG1hdGNoICgiPHB0cl9tb2RlPiIpKQorCXsKKwkgIHN1YiAocHRyX21vZGUgKCkpOworCX0KKyAgICAgIGVsc2UgaWYgKG1hdGNoICgiPGluc25fOD4iKSkKKwl7CisJICBzd2l0Y2ggKG5pYnMpCisJICAgIHsKKwkgICAgY2FzZSAyOgorCSAgICAgIHN1YiAoIihpd29yZHNfMCYweGZmKSIpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIDQ6CisJICAgICAgc3ViICgiKGl3b3Jkc18xPj44KSIpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIDY6CisJICAgICAgc3ViICgiKGl3b3Jkc18xJjB4ZmYpIik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgODoKKwkgICAgICBzdWIgKCIoaXdvcmRzXzI+PjgpIik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgMTI6CisJICAgICAgc3ViICgiKC8qIFdITyAqL2l3b3Jkc18zJjB4ZmYpIik7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKCpwID09ICd7JykKKwkgICAgaW5kZW50X2luYysrOworCSAgaWYgKCpwID09ICd9JykKKwkgICAgaW5kZW50X2RlYysrOworCSAgKmQrKyA9ICpwOworCSAgcCsrOworCX0KKyAgICB9CisgICpkKysgPSAwOworICBpbmRlbnQgLT0gaW5kZW50X2RlYzsKKyAgZm9yIChpID0gMDsgaSA8IGluZGVudDsgaSsrKQorICAgIHByaW50ZiAoIlx0Iik7CisgIGluZGVudCArPSBpbmRlbnRfaW5jOworICBwcmludGYgKGJ1ZmZlciwgYTEsIGEyLCBhMywgYTQsIGE1KTsKKworfQorCisvKiBmZXRjaCB0aGUgbHZhbHVlcyBvZiB0aGUgb3BlcmFuZHMgKi8KK3ZvaWQKK2luZm9fYXJncyAocCkKKyAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKnA7Cit7CisgIHVuc2lnbmVkIGludCAqczsKKworICBpbnQgZG9uZV9vbmVfaW1tOCA9IDA7CisKKyAgLyogaW50IGRvbmVfcmVhZCA9IDQ7Ki8KKyAgcyA9IHAtPmJ5dGVfaW5mbzsKKyAgbmlicyA9IDA7CisgIHdoaWxlICgqcykKKyAgICB7CisgICAgICBzd2l0Y2ggKCpzICYgQ0xBU1NfTUFTSykKKwl7CisJY2FzZSBDTEFTU19CSVRfMU9SMjoKKwkgIGVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbnQgaW1tX3NyYz0oPGluc25fND4mIDIpPzI6MTtcbiIpOworCSAgYnJlYWs7CisJY2FzZSBDTEFTU19CSVQ6CisJICAvKiBKdXN0IGlnbm9yZSB0aGVzZSwgd2UndmUgYWxyZWFkeSBkZWNvZGVkIHRoaXMgYml0ICovCisJICBuaWJzKys7CisJICBicmVhazsKKwljYXNlIENMQVNTX1JFR04wOgorCWNhc2UgQ0xBU1NfUkVHOgorCSAgLyogdGhpcyBuaWJibGUgdGVsbHMgdXMgd2hpY2ggcmVnaXN0ZXIgdG8gdXNlIGFzIGFuIGFyZywKKwkgICAgIGlmIHdlJ3ZlIGFscmVhZHkgZ29iYmxlZCB0aGUgbmliYmxlIHdlIGtub3cgd2hhdCB0byB1c2UgKi8KKwkgIHsKKwkgICAgaW50IHJlZ25hbWUgPSAqcyAmIDB4ZjsKKworCSAgICBlbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW50IHJlZ18lcz08aW5zbl80PjtcbiIsCisJCSAgcmVnX25hbWVzW3JlZ25hbWVdKTsKKworCSAgICBuaWJzKys7CisJICB9CisJICBicmVhazsKKwljYXNlIENMQVNTX0FERFJFU1M6CisJICBlbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgYmFzZV8lcz08aXB0cj47XG4iLCByZWdfbiAoKnMpKTsKKworCSAgbmlicyArPSBTSVpFX0FERFJFU1M7CisKKwkgIGJyZWFrOworCWNhc2UgQ0xBU1NfMDFJSToKKwljYXNlIENMQVNTXzAwSUk6CisJICBlbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW50IGltbV9zcmM9PGluc25fND4mMHgyO1xuIik7CisJICBuaWJzKys7CisJICBicmVhazsKKwljYXNlIENMQVNTX0ZMQUdTOgorCQllbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW50IGltbV9zcmM9PGluc25fND47XG4iKTsKKwkJbmlicysrOworYnJlYWs7CSAgCisJY2FzZSBDTEFTU19JTU06CisJICAvKiBXb3JrIG91dCB0aGUgc2l6ZSBvZiB0aGUgdGhpbmsgdG8gZmV0Y2ggKi8KKworCSAgeworCSAgICBzd2l0Y2ggKCpzICYgfkNMQVNTX01BU0spCisJICAgICAgeworCSAgICAgIGNhc2UgQVJHX0lNTTE2OgorCQllbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW1tX3NyYz08aW5zbl8xNj47XG4iKTsKKwkJbmlicyArPSA0OworCQlicmVhazsKKwkgICAgICBjYXNlIEFSR19JTU0zMjoKKwkJZW1pdCAoInJlZ2lzdGVyIHVuc2lnbmVkIGludCBpbW1fc3JjPSAlcztcbiIsIGluc25fMzIgKG5pYnMpKTsKKwkJbmlicyArPSA4OworCQlicmVhazsKKwkgICAgICBjYXNlIEFSR19JTU00OgorCQllbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW50IGltbV9zcmM9PGluc25fND47XG4iKTsKKwkJbmlicysrOworCQlicmVhazsKKwkgICAgICBjYXNlIEFSR19JTU0yOgorCQllbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW50IGltbV9zcmM9PGluc25fND4gJiAweDI7XG4iKTsKKwkJbmlicysrOworCQlicmVhazsKKworCSAgICAgIGNhc2UgQVJHX0lNTTRNMToKKwkJZW1pdCAoInJlZ2lzdGVyIHVuc2lnbmVkIGludCBpbW1fc3JjPSg8aW5zbl80PiArIDEpO1xuIik7CisJCW5pYnMrKzsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBBUkdfSU1NXzE6CisJCWVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbnQgaW1tX3NyYz0xO1xuIik7CisJCWJyZWFrOworCSAgICAgIGNhc2UgQVJHX0lNTV8yOgorCQllbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW50IGltbV9zcmM9MjtcbiIpOworCQlicmVhazsKKwkgICAgICBjYXNlIEFSR19OSU04OgorCQllbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW50IGltbV9zcmM9LTxpbnNuXzg+O1xuIik7CisJCW5pYnMgKz0gMjsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBBUkdfSU1NODoKKwkJaWYgKCFkb25lX29uZV9pbW04KQorCQkgIHsKKwkJICAgIGVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbnQgaW1tX3NyYz08aW5zbl84PjtcbiIpOworCQkgICAgbmlicyArPSAyOworCQkgICAgZG9uZV9vbmVfaW1tOCA9IDE7CisJCSAgfQorCQlicmVhazsKKwkgICAgICBkZWZhdWx0OgorCQllbWl0ICgicmVnaXN0ZXIgaW50IGZhaWwlZD1mYWlsKGNvbnRleHQsMSk7XG4iLCBuaWJzKTsKKwkJYnJlYWs7CisJICAgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgQ0xBU1NfRElTUDg6CisJICAgIC8qIFdlIGNhbid0IHVzZSBgKGNoYXIpJyBzaW5jZSBjaGFyIG1pZ2h0IGJlIHVuc2lnbmVkLgorCSAgICAgICBXZSBjYW4ndCB1c2UgYChzaWduZWQgY2hhciknIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG1pZ2h0IGJlIEsmUi4KKwkgICAgICAgVGhpcyBzZWVtcyBzYWZlLCBzaW5jZSBpdCBvbmx5IGFzc3VtZXMgdGhhdCBieXRlcyBhcmUgOAorCSAgICAgICBiaXRzLiAgKi8KKwkgICAgZW1pdCAoInJlZ2lzdGVyIHVuc2lnbmVkIGludCBvcGx2YWxfZHN0PSgoaWJ5dGVzXzEgPDwgKHNpemVvZiAoaW50KSAqIDggLSA4KSkgPj4gKHNpemVvZiAoaW50KSAqIDggLSA5KSkgKyBwYztcbiIpOworI2lmIDAKKwkgICAgLyogT3JpZ2luYWwgY29kZTogZmFpbHMgaWYgY2hhcmFjdGVycyBhcmUgdW5zaWduZWQuICAqLworCSAgICBlbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW50IG9wbHZhbF9kc3Q9KCgoY2hhcilpYnl0ZXNfMSk8PDEpICsgcGM7XG4iKTsKKyNlbmRpZgorCSAgICBuaWJzICs9IDI7CisJICAgIGJyZWFrOworCWNhc2UgQ0xBU1NfQ0M6CisJICAgIGVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbnQgb3BfY2M9PGluc25fND47XG4iKTsKKwkgICAgbmlicysrOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBlbWl0ICgicmVnaXN0ZXIgaW50IEZBSUwlZD1mYWlsKGNvbnRleHQsMik7XG4iLCBuaWJzKTsKKwkgICAgYnJlYWs7CisJICB9CisJICA7CisJICAvKiB3b3JrIG91dCBob3cgdG8gZmV0Y2ggdGhlIGltbWVkaWF0ZSB2YWx1ZSAqLworCX0KKworICAgICAgcysrOworICAgIH0KK30KKwordm9pZAoraW5mb19zcGVjaWFsIChwLCBnZXRkc3QsIG5vc3RvcmUsIGJlZm9yZSwgbm9zcmMpCisgICAgIG9wY29kZV9lbnRyeV90eXBlICpwOworICAgICBpbnQgKmdldGRzdDsKKyAgICAgaW50ICpub3N0b3JlOworICAgICBpbnQgKmJlZm9yZTsKKyAgICAgaW50ICpub3NyYzsKK3sKKyAgc3dpdGNoIChwLT5vcGNvZGUpCisgICAgeworICAgIGNhc2UgT1BDX2V4dHM6CisgICAgY2FzZSBPUENfZXh0c2I6CisgICAgY2FzZSBPUENfZXh0c2w6CisgICAgICAqbm9zdG9yZSA9IDE7CisgICAgICAqbm9zcmMgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfbGRtOgorICAgICAgKm5vc3RvcmUgPSAxOworICAgICAgKm5vc3JjID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX25lZ2I6CisgICAgY2FzZSBPUENfbmVnOgorICAgIGNhc2UgT1BDX3NsYToKKyAgICBjYXNlIE9QQ19zbGFiOgorICAgIGNhc2UgT1BDX3NsYWw6CisgICAgY2FzZSBPUENfc2RhOgorICAgIGNhc2UgT1BDX3NkYWI6CisgICAgY2FzZSBPUENfc2RhbDoKKyAgICBjYXNlIE9QQ19jb206CisgICAgY2FzZSBPUENfY29tYjoKKyAgICBjYXNlIE9QQ19hZGM6CisgICAgY2FzZSBPUENfc2JjOgorICAgIGNhc2UgT1BDX25vcDoKKyAgICBjYXNlIE9QQ19hZGNiOgorICAgIGNhc2UgT1BDX2FkZDoKKyAgICBjYXNlIE9QQ19hZGRiOgorICAgIGNhc2UgT1BDX2FkZGw6CisgICAgY2FzZSBPUENfaW5jOgorICAgIGNhc2UgT1BDX3N1YjoKKyAgICBjYXNlIE9QQ19zdWJiOgorICAgIGNhc2UgT1BDX3N1Ymw6CisgICAgY2FzZSBPUENfYW5kOgorICAgIGNhc2UgT1BDX2FuZGI6CisgICAgY2FzZSBPUENfeG9yYjoKKyAgICBjYXNlIE9QQ194b3I6CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BDX211bHQ6CisgICAgY2FzZSBPUENfbXVsdGw6CisgICAgY2FzZSBPUENfZGl2OgorICAgIGNhc2UgT1BDX2Rpdmw6CisKKyAgICAgICpub3N0b3JlID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUENfdGVzdGI6CisgICAgY2FzZSBPUENfdGVzdDoKKyAgICBjYXNlIE9QQ190ZXN0bDoKKyAgICBjYXNlIE9QQ19jcDoKKyAgICBjYXNlIE9QQ19jcGI6CisgICAgY2FzZSBPUENfY3BsOgorICAgIGNhc2UgT1BDX2JpdDoKKyAgICAgICpub3N0b3JlID0gMTsKKyAgICAgICpiZWZvcmUgPSAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QQ19icHQ6CisgICAgY2FzZSBPUENfanI6CisgICAgY2FzZSBPUENfanA6CisgICAgY2FzZSBPUENfcmV0OgorICAgIGNhc2UgT1BDX2NhbGw6CisgICAgY2FzZSBPUENfdGNjOgorICAgICAgKm5vc3JjID0gMTsKKyAgICAgICpub3N0b3JlID0gMTsKKyAgICAgICpiZWZvcmUgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfc2M6CisgICAgICAqbm9zdG9yZSA9IDE7CisgICAgICAqYmVmb3JlID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX2NscmI6CisgICAgY2FzZSBPUENfY2xyOgorICAgICAgKmJlZm9yZSA9IDE7CisgICAgICAqbm9zcmMgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfbGRpOgorICAgIGNhc2UgT1BDX2xkaWI6CisgICAgY2FzZSBPUENfbGRkYjoKKyAgICBjYXNlIE9QQ19sZGQ6CisKKyAgICAgICpiZWZvcmUgPSAxOworICAgICAgKm5vc3RvcmUgPSAxOworICAgICAgKm5vc3JjID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX2xkazoKKyAgICBjYXNlIE9QQ19sZDoKKyAgICBjYXNlIE9QQ19sZGI6CisgICAgY2FzZSBPUENfbGRsOgorICAgICAgKmJlZm9yZSA9IDE7CisgICAgICAqZ2V0ZHN0ID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX3B1c2g6CisgICAgY2FzZSBPUENfcHVzaGw6CisgICAgY2FzZSBPUENfcG9wOgorICAgIGNhc2UgT1BDX3BvcGw6CisgICAgICAqYmVmb3JlID0gMTsKKyAgICAgICpnZXRkc3QgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfbGRhOgorICAgICAgKm5vc3JjID0gMTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogY2FsY3VsYXRlIHRoZSBsdmFsdWVzIHJlcXVpcmVkIGZvciB0aGUgb3Bjb2RlICovCit2b2lkCitpbmZvX2x2YWxzIChwKQorICAgICBvcGNvZGVfZW50cnlfdHlwZSAqcDsKK3sKKyAgLyogZW1pdCBjb2RlIHRvIHdvcmsgb3V0IGx2YWx1ZXMsIGlmIGFueSAqLworICB1bnNpZ25lZCBpbnQgKmkgPSBwLT5hcmdfaW5mbzsKKworICB3aGlsZSAoKmkpCisgICAgeworICAgICAgY3VycmVudF9uYW1lID0gcmVnX24gKCppKTsKKyAgICAgIGN1cnJlbnRfc2l6ZSA9IHNpemVfbmFtZSAocC0+dHlwZSk7CisgICAgICBzd2l0Y2ggKCppICYgQ0xBU1NfTUFTSykKKwl7CisJY2FzZSBDTEFTU19YOgorCSAgLyogYWRkcmVzcyhyZWcpICovCisJICBlbWl0ICgicmVnaXN0ZXIgIDxhZGRyX3R5cGU+IG9wbHZhbF88bmFtZT49ICgoYmFzZV88bmFtZT4gKyAoc2hvcnQpZ2V0X3dvcmRfcmVnKGNvbnRleHQscmVnXzxuYW1lPikpICYgMHhmZmZmKSArIChiYXNlXzxuYW1lPiAmIH4weGZmZmYpO1xuIik7CisJICBicmVhazsKKwljYXNlIENMQVNTX0lSOgorCSAgLyogSW5kaXJlY3QgcmVnaXN0ZXIgKi8KKwkgIGVtaXQgKCJyZWdpc3RlciAgaW50IG9wbHZhbF88bmFtZT4gPSBnZXRfPHB0cl9tb2RlPl9yZWcoY29udGV4dCxyZWdfPG5hbWU+KTtcbiIpOworCSAgYnJlYWs7CisJY2FzZSBDTEFTU19EQToKKwkgIGVtaXQgKCJyZWdpc3RlciAgaW50IG9wbHZhbF88bmFtZT49YmFzZV88bmFtZT47XG4iKTsKKwkgIGJyZWFrOworCWNhc2UgQ0xBU1NfSU1NOgorCWNhc2UgQ0xBU1NfUkVHX1dPUkQ6CisJY2FzZSBDTEFTU19SRUdfTE9ORzoKKwljYXNlIENMQVNTX1JFR19CWVRFOgorCWNhc2UgQ0xBU1NfUFI6CisJICBicmVhazsKKwljYXNlIENMQVNTX0JBOgorCSAgZW1pdCAoInJlZ2lzdGVyICBpbnQgb3BsdmFsXzxuYW1lPiA9IGdldF88cHRyX21vZGU+X3JlZyhjb250ZXh0LHJlZ188bmFtZT4pICsgKHNob3J0KShpbW1fc3JjKTtcbiIpOworCSAgYnJlYWs7CisJY2FzZSBDTEFTU19CWDoKKwkgIGVtaXQgKCJyZWdpc3RlciAgaW50IG9wbHZhbF88bmFtZT4gPSBnZXRfPHB0cl9tb2RlPl9yZWcoY29udGV4dCxyZWdfPG5hbWU+KVxuIik7CisJICBlbWl0ICgiICArIGdldF93b3JkX3JlZyhjb250ZXh0LHJlZ19hdXhfeCk7XG4iKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIGkrKzsKKyAgICB9Cit9CisKKy8qIGVtaXQgY29kZSB0byBmZXRjaCB0aGUgYXJncyBmcm9tIGNhbGN1bGF0ZWQgbHZhbHVlcyAqLworaW50IGFsbHJlZ3M7Cit2b2lkCitpbmZvX2ZldGNoIChwLCBnZXRkc3QpCisgICAgIG9wY29kZV9lbnRyeV90eXBlICpwOworICAgICBpbnQgZ2V0ZHN0OworeworICB1bnNpZ25lZCBpbnQgKmkgPSBwLT5hcmdfaW5mbzsKKyAgaW50IGhhZF9zcmMgPSAwOworCisgIGFsbHJlZ3MgPSAxOworICB3aGlsZSAoKmkpCisgICAgeworCisgICAgICBjdXJyZW50X25hbWUgPSByZWdfbiAoKmkpOworICAgICAgY3VycmVudF9zaXplID0gc2l6ZV9uYW1lIChwLT50eXBlKTsKKyAgICAgIHN3aXRjaCAoKmkgJiBDTEFTU19NQVNLKQorCXsKKwljYXNlIENMQVNTX1g6CisJY2FzZSBDTEFTU19JUjoKKwljYXNlIENMQVNTX0JBOgorCWNhc2UgQ0xBU1NfQlg6CisJY2FzZSBDTEFTU19EQToKKwkgIGlmICghZ2V0ZHN0ICYmIElTX0RTVCAoKmkpKQorCSAgICBicmVhazsKKwkgIGVtaXQgKCJyZWdpc3RlciBpbnQgb3BfPG5hbWU+PSBnZXRfPHNpemU+XzxtZW0+X2RhKGNvbnRleHQsb3BsdmFsXzxuYW1lPik7XG4iKTsKKwkgIGFsbHJlZ3MgPSAwOworCSAgYnJlYWs7CisJY2FzZSBDTEFTU19JTU06CisJICBpZiAoIWhhZF9zcmMpCisJICAgIHsKKwkgICAgICBpZiAocC0+b3Bjb2RlID09IE9QQ19vdXQgfHwKKwkJICBwLT5vcGNvZGUgPT0gT1BDX291dGIgfHwKKwkJICBwLT5vcGNvZGUgPT0gT1BDX3NvdXQgfHwKKwkJICBwLT5vcGNvZGUgPT0gT1BDX3NvdXRiKQorCQl7CisJCSAgLyogVGhlIGltbSBpcyBhIGRlc3QgaGVyZSAqLworCQkgIGVtaXQgKCJyZWdpc3RlciBpbnQgb3BfZHN0ID0gaW1tX3NyYztcbiIpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgZW1pdCAoInJlZ2lzdGVyIGludCBvcF9zcmMgPSBpbW1fc3JjO1xuIik7CisJCX0KKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBDTEFTU19SRUdfUVVBRDoKKwkgIGlmICghZ2V0ZHN0ICYmIElTX0RTVCAoKmkpKQorCSAgICBicmVhazsKKwkgIGhhZF9zcmMgfD0gSVNfU1JDICgqaSk7CisJICBlbWl0ICgiVURJdHlwZSBvcF88bmFtZT4gO1xuIik7CisKKwkgIGJyZWFrOworCWNhc2UgQ0xBU1NfUkVHX1dPUkQ6CisJICBpZiAoIWdldGRzdCAmJiBJU19EU1QgKCppKSkKKwkgICAgYnJlYWs7CisJICBoYWRfc3JjIHw9IElTX1NSQyAoKmkpOworCSAgZW1pdCAoInJlZ2lzdGVyIGludCBvcF88bmFtZT4gPSBnZXRfd29yZF9yZWcoY29udGV4dCxyZWdfPG5hbWU+KTtcbiIpOworCSAgYnJlYWs7CisKKwljYXNlIENMQVNTX1JFR19MT05HOgorCSAgaWYgKCFnZXRkc3QgJiYgSVNfRFNUICgqaSkpCisJICAgIGJyZWFrOworCSAgaGFkX3NyYyB8PSBJU19TUkMgKCppKTsKKwkgIGVtaXQgKCJyZWdpc3RlciBpbnQgb3BfPG5hbWU+ID0gZ2V0X2xvbmdfcmVnKGNvbnRleHQscmVnXzxuYW1lPik7XG4iKTsKKwkgIGJyZWFrOworCWNhc2UgQ0xBU1NfUkVHX0JZVEU6CisJICBpZiAoIWdldGRzdCAmJiBJU19EU1QgKCppKSkKKwkgICAgYnJlYWs7CisJICBoYWRfc3JjIHw9IElTX1NSQyAoKmkpOworCSAgZW1pdCAoInJlZ2lzdGVyIGludCBvcF88bmFtZT4gPSBnZXRfYnl0ZV9yZWcoY29udGV4dCxyZWdfPG5hbWU+KTtcbiIpOworCSAgYnJlYWs7CisJfQorICAgICAgaSsrOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK25vcm1hbF9mbGFncyAocCwgcywgbmVnKQorICAgICBvcGNvZGVfZW50cnlfdHlwZSAqcDsKKyAgICAgY2hhciAqczsKK3sKKyAgZW1pdCAoIiAlcztcbiIsIHMpOworICBlbWl0ICgiTk9STUFMX0ZMQUdTKGNvbnRleHQsJWQsIHRtcCwgIG9wX2RzdCwgb3Bfc3JjLCVkKTsgXG4iLCBwLT50eXBlLG5lZyk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X25vcm1hbF9mbGFncyAocCwgcywgb3B0KQorICAgICBvcGNvZGVfZW50cnlfdHlwZSAqcDsKKyAgICAgY2hhciAqczsKKyAgICAgaW50IG9wdDsKK3sKKyAgZW1pdCAoIiAlcztcbiIsIHMpOworICBpZiAoMCAmJiBvcHQpCisgICAgeworICAgICAgZW1pdCAoImNvbnRleHQtPmJyb2tlbl9mbGFncyA9IFRTVF9GTEFHUztcbiIpOworICAgICAgZW1pdCAoImNvbnRleHQtPnNpemUgPSAlZDtcbiIsIHAtPnR5cGUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGVtaXQgKCJURVNUX05PUk1BTF9GTEFHUyhjb250ZXh0LCVkLCB0bXApOyBcbiIsIHAtPnR5cGUpOworICAgIH0KKworfQorCitzdGF0aWMgdm9pZAorb3B0aW1pemVfbm9ybWFsX2ZsYWdzIChwLCBzLG5lZykKKyAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKnA7CisgICAgIGNoYXIgKnM7Cit7CisgIGVtaXQgKCIgJXM7XG4iLCBzKTsKKyNpZiAwCisgIGVtaXQgKCJjb250ZXh0LT5icm9rZW5fZmxhZ3MgPSBDTVBfRkxBR1M7XG4iKTsKKyNlbHNlCisgIGVtaXQgKCJOT1JNQUxfRkxBR1MoY29udGV4dCwlZCwgdG1wLCAgb3BfZHN0LCBvcF9zcmMsJWQpOyBcbiIsIHAtPnR5cGUsIG5lZyk7CisjZW5kaWYKK30KKworc3RhdGljCit2b2lkCitqcCAocCkKKyAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKnA7Cit7CisKKyAgZW1pdCAoImlmKG9wX2NjID09IDggfHwgQ09ORChjb250ZXh0LG9wX2NjKSkgcGMgPSBvcGx2YWxfZHN0O1xuIik7Cit9CisKK3N0YXRpYyB2b2lkCitqciAocCkKKyAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKnA7Cit7CisgIGVtaXQgKCJpZihvcF9jYyA9PSA4IHx8IENPTkQoY29udGV4dCxvcF9jYykpIHBjID0gb3BsdmFsX2RzdDtcbiIpOworfQorCitzdGF0aWMgdm9pZAorcmV0IChwKQorICAgICBvcGNvZGVfZW50cnlfdHlwZSAqcDsKK3sKKyAgZW1pdCAoImlmKG9wX2NjID09IDggfHwgQ09ORChjb250ZXh0LG9wX2NjKSlcbntcbiIpOworICBlbWl0ICgicGMgPSBnZXRfPHB0cl9tb2RlPl88bWVtPl9pcihjb250ZXh0LDxzcD4pO1xuIik7CisgIGVtaXQgKCJwdXRfPHB0cl9tb2RlPl9yZWcoY29udGV4dCw8c3A+LCBnZXRfPHB0cl9tb2RlPl9yZWcoY29udGV4dCw8c3A+KSArIDxwdHJfc2l6ZT4pO1xuIik7CisgIGVtaXQgKCJ9O1xuIik7Cit9CisKK3N0YXRpYyB2b2lkCitjYWxsIChwKQorICAgICBvcGNvZGVfZW50cnlfdHlwZSAqcDsKK3sKKyAgZW1pdCAoInB1dF88cHRyX21vZGU+X3JlZyhjb250ZXh0LDxzcD4sdG1wID0gIGdldF88cHRyX21vZGU+X3JlZyhjb250ZXh0LDxzcD4pIC0gPHB0cl9zaXplPik7XG4iKTsKKyAgZW1pdCAoInB1dF88cHRyX21vZGU+XzxtZW0+X2RhKGNvbnRleHQsdG1wLCBwYyk7XG4iKTsKKyAgZW1pdCAoInBjID0gb3BsdmFsX2RzdDtcbiIpOworfQorCitzdGF0aWMgdm9pZAorcHVzaCAocCkKKyAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKnA7Cit7CisgIGVtaXQgKCJ0bXAgPSBvcF9zcmM7XG4iKTsKKyAgZW1pdCAoIm9wbHZhbF9kc3QgLT0gJWQ7XG4iLCBwLT50eXBlIC8gOCk7CisgIGVtaXQgKCJwdXRfPHB0cl9tb2RlPl9yZWcoY29udGV4dCxyZWdfZHN0LCBvcGx2YWxfZHN0KTtcbiIpOworfQorCitzdGF0aWMgdm9pZAorcG9wIChwKQorICAgICBvcGNvZGVfZW50cnlfdHlwZSAqcDsKK3sKKyAgZW1pdCAoInRtcCA9IG9wX3NyYztcbiIpOworICBlbWl0ICgicHV0XzxwdHJfbW9kZT5fcmVnKGNvbnRleHQscmVnX3NyYywgb3BsdmFsX3NyYyArICVkKTtcbiIsIHAtPnR5cGUgLyA4KTsKK30KKworc3RhdGljIHZvaWQKK2xkIChwKQorICAgICBvcGNvZGVfZW50cnlfdHlwZSAqcDsKK3sKKyAgZW1pdCAoInRtcCA9IG9wX3NyYztcbiIpOworfQorCitzdGF0aWMgdm9pZAorc2MgKCkKK3sKKyAgZW1pdCAoInN1cHBvcnRfY2FsbChjb250ZXh0LGltbV9zcmMpO1xuIik7Cit9CisKK3N0YXRpYyB2b2lkCiticHQgKCkKK3sKKyAgZW1pdCAoInBjIC09MjsgXG4iKTsKKyAgZW1pdCAoImNvbnRleHQtPmV4Y2VwdGlvbiA9IFNJTV9CUkVBS1BPSU5UO1xuIik7Cit9CisKK3N0YXRpYyB2b2lkCitsZGkgKHAsIHNpemUsIGluYykKKyAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKnA7CisgICAgIGludCBzaXplOworICAgICBpbnQgaW5jOworeworICBpbnQgZGluYyA9IChzaXplIC8gOCkgKiBpbmM7CisKKyAgY3VycmVudF9zaXplID0gc2l6ZV9uYW1lIChzaXplKTsKKyAgZW1pdCAoInsgXG4iKTsKKyAgZW1pdCAoImludCB0eXBlID0gJXM7XG4iLCBpbnNuXzQgKDcpKTsKKyAgZW1pdCAoImludCBycyA9IGdldF88cHRyX21vZGU+X3JlZyhjb250ZXh0LHJlZ19zcmMpO1xuIik7CisgIGVtaXQgKCJpbnQgcmQgPSBnZXRfPHB0cl9tb2RlPl9yZWcoY29udGV4dCxyZWdfZHN0KTtcbiIpOworICBlbWl0ICgiaW50IHJyID0gZ2V0X3dvcmRfcmVnKGNvbnRleHQscmVnX2F1eF9yKTtcbiIpOworICBlbWl0ICgiZG8ge1xuIik7CisgIGVtaXQgKCJwdXRfPHNpemU+XzxtZW0+X2RhKGNvbnRleHQscmQsIGdldF88c2l6ZT5fPG1lbT5fZGEoY29udGV4dCxycykpO1xuIik7CisgIGVtaXQgKCJyZCArPSAlZDtcbiIsIGRpbmMpOworICBlbWl0ICgicnMgKz0gJWQ7XG4iLCBkaW5jKTsKKyAgZW1pdCAoInJyIC0tO1xuIik7CisgIGVtaXQgKCJjb250ZXh0LT5jeWNsZXMgKz0gOTtcbiIpOworICBlbWl0ICgifSB3aGlsZSAoIXR5cGUgJiYgcnIgIT0gMCAmJiBjb250ZXh0LT5leGNlcHRpb24gPD0gMSk7XG4iKTsKKyAgZW1pdCAoImlmIChjb250ZXh0LT5leGNlcHRpb24+MSkgcGMgLT00O1xuIik7CisgIGVtaXQgKCJwdXRfPHB0cl9tb2RlPl9yZWcoY29udGV4dCxyZWdfc3JjLCBycyk7XG4iKTsKKyAgZW1pdCAoInB1dF88cHRyX21vZGU+X3JlZyhjb250ZXh0LHJlZ19kc3QsIHJkKTtcbiIpOworICBlbWl0ICgicHV0X3dvcmRfcmVnKGNvbnRleHQscmVnX2F1eF9yLCBycik7XG4iKTsKKyAgZW1pdCAoIn1cbiIpOworCit9CisKK3N0YXRpYyB2b2lkCitzaGlmdCAocCwgYXJpdGgpCisgICAgIG9wY29kZV9lbnRyeV90eXBlICpwOworICAgICBpbnQgYXJpdGg7Cit7CisKKyAgLyogV2UgY2FuJ3QgdXNlIGAoY2hhciknIHNpbmNlIGNoYXIgbWlnaHQgYmUgdW5zaWduZWQuCisgICAgIFdlIGNhbid0IHVzZSBgKHNpZ25lZCBjaGFyKScgYmVjYXVzZSB0aGUgY29tcGlsZXIgbWlnaHQgYmUgSyZSLgorICAgICBUaGlzIHNlZW1zIHNhZmUsIHNpbmNlIGl0IG9ubHkgYXNzdW1lcyB0aGF0IGJ5dGVzIGFyZSA4IGJpdHMuICAqLworICBlbWl0ICgib3Bfc3JjID0gKG9wX3NyYyA8PCAoc2l6ZW9mIChpbnQpICogOCAtIDgpKSA+PiAoc2l6ZW9mIChpbnQpICogOCAtIDgpO1xuIik7CisjaWYgMAorICAvKiBPcmlnaW5hbCBjb2RlOiBmYWlscyBpZiBjaGFyYWN0ZXJzIGFyZSB1bnNpZ25lZC4gICovCisgIGVtaXQgKCJvcF9zcmMgPSAoY2hhcilvcF9zcmM7XG4iKTsKKyNlbmRpZgorICBlbWl0ICgiaWYgKG9wX3NyYyA8IDApIFxuIik7CisgIGVtaXQgKCJ7XG4iKTsKKyAgZW1pdCAoIm9wX3NyYyA9IC1vcF9zcmM7XG4iKTsKKyAgZW1pdCAoIm9wX2RzdCA9ICglcyA8Y19zaXplPilvcF9kc3Q7XG4iLCBhcml0aCA/ICIiIDogInVuc2lnbmVkIik7CisgIGVtaXQgKCJ0bXAgPSAoJXMgb3BfZHN0KSA+PiBvcF9zcmM7XG4iLCBhcml0aCA/ICIiIDogIih1bnNpZ25lZCkiKTsKKyAgZW1pdCAoImNvbnRleHQtPmNhcnJ5ID0gb3BfZHN0ID4+IChvcF9zcmMtMSk7XG4iLCBwLT50eXBlKTsKKyAgZW1pdCAoIn1cbiIpOworICBlbWl0ICgiZWxzZVxuIik7CisgIGVtaXQgKCJ7XG4iKTsKKyAgZW1pdCAoInRtcCA9IG9wX2RzdCA8PCBvcF9zcmM7XG4iKTsKKyAgZW1pdCAoImNvbnRleHQtPmNhcnJ5ID0gb3BfZHN0ID4+ICglZCAtIG9wX3NyYyk7XG4iLCBwLT50eXBlKTsKKyAgZW1pdCAoIn1cbiIpOworICBlbWl0ICgiY29udGV4dC0+emVybyA9ICg8Y19zaXplPil0bXAgPT0gMDtcbiIpOworICBlbWl0ICgiY29udGV4dC0+c2lnbiA9IChpbnQpKCg8Y19zaXplPil0bXApIDwgMDtcbiIpOworICBlbWl0ICgiY29udGV4dC0+b3ZlcmZsb3cgPSAoKGludCl0bXAgPCAwKSAhPSAoKGludClvcF9kc3QgPCAwKTtcbiIpOworICBlbWl0ICgiY29udGV4dC0+Y3ljbGVzICs9IDMqb3Bfc3JjO1xuIik7CisgIGVtaXQgKCJjb250ZXh0LT5icm9rZW5fZmxhZ3MgPSAwO1xuIik7CisKK30KKworc3RhdGljIHZvaWQKK3JvdGF0ZSAocCwgdGhyb3VnaF9jYXJyeSwgc2l6ZSwgbGVmdCkKKyAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKnA7CisgICAgIGludCB0aHJvdWdoX2NhcnJ5OworICAgICBpbnQgc2l6ZTsKKyAgICAgaW50IGxlZnQ7Cit7CisKKyAgaWYgKCFsZWZ0KQorICAgIHsKKyAgICAgIGVtaXQgKCJ3aGlsZSAob3Bfc3JjLS0pIHtcbiIpOworICAgICAgZW1pdCAoImludCByb3RiaXQ7XG4iKTsKKyAgICAgIGVtaXQgKCJyb3RiaXQgPSBvcF9kc3QgJiAxO1xuIik7CisgICAgICBlbWl0ICgib3BfZHN0ID0gKCh1bnNpZ25lZClvcF9kc3QpID4+IDE7XG4iKTsKKworICAgICAgaWYgKHRocm91Z2hfY2FycnkpCisJeworCSAgZW1pdCAoIm9wX2RzdCB8PSBjb250ZXh0LT5jYXJyeSA8PCAlZDtcbiIsIHNpemUgLSAxKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZW1pdCAoIm9wX2RzdCB8PSByb3RiaXQgPDwgJWQ7XG4iLCBzaXplIC0gMSk7CisJfQorICAgICAgZW1pdCAoImNvbnRleHQtPmNhcnJ5ID0gcm90Yml0O1xuIik7CisgICAgICBlbWl0ICgifVxuIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZW1pdCAoIndoaWxlIChvcF9zcmMtLSkge1xuIik7CisgICAgICBlbWl0ICgiaW50IHJvdGJpdDtcbiIpOworCisgICAgICBlbWl0ICgicm90Yml0ID0gKG9wX2RzdCA+PiAoJWQpKSYxO1xuIiwgc2l6ZSAtIDEpOworICAgICAgZW1pdCAoIm9wX2RzdCA8PD0xO1xuIik7CisgICAgICBpZiAodGhyb3VnaF9jYXJyeSkKKwl7CisJICBlbWl0ICgiaWYgKGNvbnRleHQtPmNhcnJ5KSBvcF9kc3QgfD0xO1xuIik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGVtaXQgKCJpZiAocm90Yml0KSBvcF9kc3QgfD0gMTtcbiIpOworCX0KKyAgICAgIGVtaXQgKCJjb250ZXh0LT5jYXJyeSA9IHJvdGJpdDtcbiIpOworICAgICAgZW1pdCAoIn1cbiIpOworICAgIH0KKyAgZW1pdCAoInRtcCA9ICg8Y19zaXplPilvcF9kc3Q7XG4iKTsKKyAgZW1pdCAoImNvbnRleHQtPnplcm8gPSB0bXAgPT0gMDtcbiIpOworICBlbWl0ICgiY29udGV4dC0+c2lnbiA9IChpbnQpdG1wIDwgMDtcbiIpOworICBlbWl0ICgiY29udGV4dC0+b3ZlcmZsb3cgPSAoKGludCl0bXAgPCAwKSAhPSAoKGludClvcF9kc3QgPCAwKTtcbiIpOworICBlbWl0ICgiY29udGV4dC0+Y3ljbGVzICs9IDMqb3Bfc3JjO1xuIik7CisgIGVtaXQgKCJjb250ZXh0LT5icm9rZW5fZmxhZ3MgPSAwO1xuIik7CisKK30KKworc3RhdGljIHZvaWQKK2FkaXYgKHApCisgICAgIG9wY29kZV9lbnRyeV90eXBlICpwOworeworICBlbWl0ICgiaWYgKG9wX3NyYz09MClcbiIpOworICBlbWl0ICgie1xuIik7CisgIGVtaXQgKCJjb250ZXh0LT5leGNlcHRpb24gPSBTSU1fRElWX1pFUk87XG4iKTsKKyAgZW1pdCAoIn1cbiIpOworICBlbWl0ICgiZWxzZVxuIik7CisgIGVtaXQgKCJ7XG4iKTsKKworICBpZiAocC0+dHlwZSA9PSAzMikKKyAgICB7CisgICAgICBlbWl0ICgib3BfZHN0LmxvdyA9IChpbnQpZ2V0X2xvbmdfcmVnKGNvbnRleHQscmVnX2RzdCsyKTtcbiIpOworICAgICAgZW1pdCAoIm9wX2RzdC5oaWdoID0gKGludClnZXRfbG9uZ19yZWcoY29udGV4dCxyZWdfZHN0KzApO1xuIik7CisjaWZkZWYgX19HTlVDX18KKyAgICAgIGVtaXQgKCJ0bXAgPSAoKChsb25nIGxvbmcpb3BfZHN0LmhpZ2ggPDwgMzIpICsgKG9wX2RzdC5sb3cpKSAvIChpbnQpb3Bfc3JjO1xuIik7CisjZWxzZQorICAgICAgZW1pdCAoInRtcCA9IChsb25nKW9wX2RzdC5sb3cgLyAoaW50KW9wX3NyYztcbiIpOworI2VuZGlmCisgICAgICBlbWl0ICgicHV0X2xvbmdfcmVnKGNvbnRleHQscmVnX2RzdCsyLCB0bXApO1xuIik7CisjaWZkZWYgX19HTlVDX18KKyAgICAgIGVtaXQgKCJwdXRfbG9uZ19yZWcoY29udGV4dCxyZWdfZHN0LCAoKChsb25nIGxvbmcpb3BfZHN0LmhpZ2ggPDwgMzIpICsgKG9wX2RzdC5sb3cpKSAlJSAoaW50KW9wX3NyYyk7XG4iKTsKKyNlbHNlCisgICAgICBlbWl0ICgicHV0X2xvbmdfcmVnKGNvbnRleHQscmVnX2RzdCwgKGludClvcF9kc3QubG93ICUlIChpbnQpb3Bfc3JjKTtcbiIpOworI2VuZGlmCisKKyAgICAgIGVtaXQgKCJjb250ZXh0LT56ZXJvID0gb3Bfc3JjID09IDAgfHwgKG9wX2RzdC5sb3c9PTAgJiYgb3BfZHN0LmhpZ2g9PTApO1xuIik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZW1pdCAoInRtcCA9IChsb25nKW9wX2RzdCAvIChzaG9ydClvcF9zcmM7XG4iKTsKKyAgICAgIGVtaXQgKCJwdXRfd29yZF9yZWcoY29udGV4dCxyZWdfZHN0KzEsIHRtcCk7XG4iKTsKKyAgICAgIGVtaXQgKCJwdXRfd29yZF9yZWcoY29udGV4dCxyZWdfZHN0LCAobG9uZykgb3BfZHN0ICUlIChzaG9ydClvcF9zcmMpO1xuIik7CisgICAgICBlbWl0ICgiY29udGV4dC0+emVybyA9IG9wX3NyYyA9PSAwIHx8IG9wX2RzdD09MDtcbiIpOworICAgIH0KKworICBlbWl0ICgiY29udGV4dC0+c2lnbiA9IChpbnQpdG1wIDwgMDtcbiIpOworICBlbWl0ICgiY29udGV4dC0+b3ZlcmZsb3cgPSh0bXAgJiAweCV4KSAhPSAwO1xuIiwKKwl+KCgxIDw8IChwLT50eXBlKSkgLSAxKSk7CisgIGVtaXQgKCJjb250ZXh0LT5jYXJyeSA9ICh0bXAgJiAweCV4KSAhPSAwO1xuIiwKKwl+KDEgPDwgKHAtPnR5cGUpKSk7CisKKyAgZW1pdCAoIn1cbiIpOworfQorCitzdGF0aWMgdm9pZAorZG9iaXQgKHApCitvcGNvZGVfZW50cnlfdHlwZSAqcDsKK3sKKyAgZW1pdCgiY29udGV4dC0+emVybyA9IChvcF9kc3QgJiAoMTw8b3Bfc3JjKSk9PTA7XG4iKTsKKyAgZW1pdCgiY29udGV4dC0+YnJva2VuX2ZsYWdzID0gMDtcbiIpOworfQorc3RhdGljIHZvaWQKK2Rvc2V0IChwLCB2KQorb3Bjb2RlX2VudHJ5X3R5cGUqcDsKK2ludCB2OworeworICBpZiAodikgCisgICAgZW1pdCAoIiB0bXAgPSBvcF9kc3QgfCAoMTw8IG9wX3NyYyk7XG4iKTsKKyAgZWxzZQorICAgIGVtaXQgKCIgdG1wID0gb3BfZHN0ICYgfigxPDwgb3Bfc3JjKTtcbiIpOworfQorCitzdGF0aWMgdm9pZAorbXVsdCAocCkKKyAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKnA7Cit7CisKKyAgaWYgKHAtPnR5cGUgPT0gMzIpCisgICAgeworICAgICAgZW1pdCAoIm9wX2RzdC5sb3cgPSAgZ2V0X2xvbmdfcmVnKGNvbnRleHQscmVnX2RzdCsyKTtcbiIpOworICAgICAgZW1pdCAoInRtcCA9IG9wX2RzdC5sb3cgKiBvcF9zcmM7XG4iKTsKKyAgICAgIGVtaXQgKCJwdXRfbG9uZ19yZWcoY29udGV4dCxyZWdfZHN0KzIsIHRtcCk7XG4iKTsKKyAgICAgIGVtaXQgKCJwdXRfbG9uZ19yZWcoY29udGV4dCxyZWdfZHN0LCAwKTtcbiIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGVtaXQgKCJvcF9kc3QgPSAgZ2V0X3dvcmRfcmVnKGNvbnRleHQscmVnX2RzdCsxKTtcbiIpOworICAgICAgZW1pdCAoInRtcCA9IG9wX2RzdCAqIG9wX3NyYztcbiIpOworICAgICAgZW1pdCAoInB1dF9sb25nX3JlZyhjb250ZXh0LHJlZ19kc3QsIHRtcCk7XG4iKTsKKyAgICB9CisKKyAgZW1pdCAoImNvbnRleHQtPnNpZ24gPSAoaW50KXRtcCA8IDA7XG4iKTsKKyAgZW1pdCAoImNvbnRleHQtPm92ZXJmbG93ID0wO1xuIik7CisgIGVtaXQgKCJjb250ZXh0LT5jYXJyeSA9ICh0bXAgJiAweCV4KSAhPSAwO1xuIiwgfigoMSA8PCAocC0+dHlwZSkpIC0gMSkpOworICBlbWl0ICgiY29udGV4dC0+emVybyA9IHRtcCA9PSAwO1xuIik7CisKK30KKworc3RhdGljIHZvaWQKK2V4dHMgKHApCisgICAgIG9wY29kZV9lbnRyeV90eXBlICpwOworeworICAvKiBGZXRjaCB0aGUgbHMgcGFydCBvZiB0aGUgc3JjICovCisgIGN1cnJlbnRfc2l6ZSA9IHNpemVfbmFtZSAocC0+dHlwZSAqIDIpOworCisgIGlmIChwLT50eXBlID09IDMyKQorICAgIHsKKyAgICAgIGVtaXQgKCJ0bXA9IGdldF9sb25nX3JlZyhjb250ZXh0LHJlZ19kc3QrMik7XG4iKTsKKyAgICAgIGVtaXQgKCJpZiAodG1wICYgKDE8PCVkKSkge1xuIiwgcC0+dHlwZSAtIDEpOworICAgICAgZW1pdCAoInB1dF9sb25nX3JlZyhjb250ZXh0LHJlZ19kc3QsIDB4ZmZmZmZmZmYpO1xuIik7CisgICAgICBlbWl0ICgifVxuIik7CisgICAgICBlbWl0ICgiZWxzZVxuIik7CisgICAgICBlbWl0ICgie1xuIik7CisgICAgICBlbWl0ICgicHV0X2xvbmdfcmVnKGNvbnRleHQscmVnX2RzdCwgMCk7XG4iKTsKKyAgICAgIGVtaXQgKCJ9XG4iKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBlbWl0ICgidG1wPSBnZXRfPHNpemU+X3JlZyhjb250ZXh0LHJlZ19kc3QpO1xuIik7CisgICAgICBlbWl0ICgiaWYgKHRtcCAmICgxPDwlZCkpIHtcbiIsIHAtPnR5cGUgLSAxKTsKKyAgICAgIGVtaXQgKCJ0bXAgfD0gMHgleDtcbiIsIH4oKDEgPDwgcC0+dHlwZSkgLSAxKSk7CisgICAgICBlbWl0ICgifVxuIik7CisgICAgICBlbWl0ICgiZWxzZVxuIik7CisgICAgICBlbWl0ICgie1xuIik7CisKKyAgICAgIGVtaXQgKCJ0bXAgJj0gMHgleDtcbiIsICgoMSA8PCBwLT50eXBlKSAtIDEpKTsKKyAgICAgIGVtaXQgKCJ9XG4iKTsKKyAgICAgIGVtaXQgKCJwdXRfPHNpemU+X3JlZyhjb250ZXh0LHJlZ19kc3QsIHRtcCk7XG4iKTsKKyAgICB9Cit9Citkb2ZsYWcob24pCitpbnQgb247Cit7CisgIC8qIExvYWQgdXAgdGhlIGZsYWdzICovCisgIGVtaXQoIiBDT05EIChjb250ZXh0LCAweDBiKTtcbiIpOworCisgIGlmIChvbikKKyAgICBlbWl0ICgieyBpbnQgb24gPTE7XG4gIik7CisgIGVsc2UKKyAgICBlbWl0ICgieyBpbnQgb24gPTA7XG4gIik7CisKKyAgZW1pdCAoImlmIChpbW1fc3JjICYgMSlcbiIpOworICBlbWl0ICgiUFNXX09WRVJGTE9XID0gb247XG4iKTsKKworICBlbWl0ICgiaWYgKGltbV9zcmMgJiAyKVxuIik7CisgIGVtaXQgKCJQU1dfU0lHTiA9IG9uO1xuIik7CisKKyAgZW1pdCAoImlmIChpbW1fc3JjICYgNClcbiIpOworICBlbWl0ICgiUFNXX1pFUk8gPSBvbjtcbiIpOworCisgIGVtaXQgKCJpZiAoaW1tX3NyYyAmIDgpXG4iKTsKKyAgZW1pdCAoIlBTV19DQVJSWSA9IG9uO1xuIik7CisgIGVtaXQoIn1cbiIpOworCisKK30KKy8qIGVtaXQgY29kZSB0byBwZXJmb3JtIG9wZXJhdGlvbiAqLwordm9pZAoraW5mb19kb2NvZGUgKHApCisgICAgIG9wY29kZV9lbnRyeV90eXBlICpwOworeworICBzd2l0Y2ggKHAtPm9wY29kZSkKKyAgICB7CisgICAgY2FzZSBPUENfY2xyOgorICAgIGNhc2UgT1BDX2NscmI6CisgICAgICBlbWl0ICgidG1wID0gMDtcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfZXg6CisgICAgY2FzZSBPUENfZXhiOgorCisgICAgICBlbWl0ICgidG1wID0gb3Bfc3JjOyBcbiIpOworICAgICAgaWYgKGFsbHJlZ3MpCisJeworCSAgZW1pdCAoInB1dF88c2l6ZT5fcmVnKGNvbnRleHQscmVnX3NyYywgb3BfZHN0KTtcbiIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBlbWl0ICgicHV0XzxzaXplPl9tZW1fZGEoY29udGV4dCwgb3BsdmFsX3NyYywgb3BfZHN0KTtcbiIpOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX2FkYzoKKyAgICBjYXNlIE9QQ19hZGNiOgorICAgICAgbm9ybWFsX2ZsYWdzIChwLCAib3Bfc3JjICs9IENPTkQoY29udGV4dCw3KTt0bXAgPSBvcF9kc3QgKyBvcF9zcmMgOyIsMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19zYmM6CisgICAgICBub3JtYWxfZmxhZ3MgKHAsICJvcF9zcmMgKz0gIENPTkQoY29udGV4dCw3KTt0bXAgPSBvcF9kc3QgLSBvcF9zcmMgOyIsMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19ub3A6CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19jb206CisgICAgY2FzZSBPUENfY29tYjoKKyAgICAgIHRlc3Rfbm9ybWFsX2ZsYWdzIChwLCAidG1wID0gfiBvcF9kc3QiLCAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX2FuZDoKKyAgICBjYXNlIE9QQ19hbmRiOgorICAgICAgdGVzdF9ub3JtYWxfZmxhZ3MgKHAsICJ0bXAgPSBvcF9kc3QgJiBvcF9zcmMiLCAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX3hvcjoKKyAgICBjYXNlIE9QQ194b3JiOgorICAgICAgdGVzdF9ub3JtYWxfZmxhZ3MgKHAsICJ0bXAgPSBvcF9kc3QgXiBvcF9zcmMiLCAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX29yOgorICAgIGNhc2UgT1BDX29yYjoKKyAgICAgIHRlc3Rfbm9ybWFsX2ZsYWdzIChwLCAidG1wID0gb3BfZHN0IHwgb3Bfc3JjIiwgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19zbGE6CisgICAgY2FzZSBPUENfc2xhYjoKKyAgICBjYXNlIE9QQ19zbGFsOgorICAgIGNhc2UgT1BDX3NkYToKKyAgICBjYXNlIE9QQ19zZGFiOgorICAgIGNhc2UgT1BDX3NkYWw6CisgICAgICBzaGlmdCAocCwgMSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BDX3NsbDoKKyAgICBjYXNlIE9QQ19zbGxiOgorICAgIGNhc2UgT1BDX3NsbGw6CisgICAgY2FzZSBPUENfc2RsOgorICAgIGNhc2UgT1BDX3NkbGI6CisgICAgY2FzZSBPUENfc2RsbDoKKyAgICAgIHNoaWZ0IChwLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX3JsOgorICAgICAgcm90YXRlIChwLCAwLCAxNiwgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19ybGI6CisgICAgICByb3RhdGUgKHAsIDAsIDgsIDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfcnI6CisgICAgICByb3RhdGUgKHAsIDAsIDE2LCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX3JyYjoKKyAgICAgIHJvdGF0ZSAocCwgMCwgOCwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19ycmM6CisgICAgICByb3RhdGUgKHAsIDEsIDE2LCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX3JyY2I6CisgICAgICByb3RhdGUgKHAsIDEsIDgsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfcmxjOgorICAgICAgcm90YXRlIChwLCAxLCAxNiwgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19ybGNiOgorICAgICAgcm90YXRlIChwLCAxLCA4LCAxKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUENfZXh0c2I6CisgICAgY2FzZSBPUENfZXh0czoKKyAgICBjYXNlIE9QQ19leHRzbDoKKyAgICAgIGV4dHMgKHApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfYWRkOgorICAgIGNhc2UgT1BDX2FkZGI6CisgICAgY2FzZSBPUENfYWRkbDoKKyAgICBjYXNlIE9QQ19pbmM6CisgICAgY2FzZSBPUENfaW5jYjoKKyAgICAgIG9wdGltaXplX25vcm1hbF9mbGFncyAocCwgInRtcCA9IG9wX2RzdCArIG9wX3NyYyIsMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ190ZXN0YjoKKyAgICBjYXNlIE9QQ190ZXN0OgorICAgIGNhc2UgT1BDX3Rlc3RsOgorICAgICAgdGVzdF9ub3JtYWxfZmxhZ3MgKHAsICJ0bXAgPSBvcF9kc3QiLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX2NwOgorICAgIGNhc2UgT1BDX2NwYjoKKyAgICBjYXNlIE9QQ19jcGw6CisgICAgICBub3JtYWxfZmxhZ3MgKHAsICJ0bXAgPSBvcF9kc3QgLSBvcF9zcmMiLDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfbmVnYjoKKyAgICBjYXNlIE9QQ19uZWc6CisgICAgICBlbWl0ICgie1xuIik7CisgICAgICBlbWl0ICgiaW50IG9wX3NyYyA9IC1vcF9kc3Q7XG4iKTsKKyAgICAgIGVtaXQgKCJvcF9kc3QgPSAwO1xuIik7CisgICAgICBvcHRpbWl6ZV9ub3JtYWxfZmxhZ3MgKHAsICJ0bXAgPSBvcF9kc3QgKyBvcF9zcmM7XG4iLDEpOworICAgICAgZW1pdCAoIn0iKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUENfc3ViOgorICAgIGNhc2UgT1BDX3N1YmI6CisgICAgY2FzZSBPUENfc3VibDoKKyAgICBjYXNlIE9QQ19kZWM6CisgICAgY2FzZSBPUENfZGVjYjoKKyAgICAgIG9wdGltaXplX25vcm1hbF9mbGFncyAocCwgInRtcCA9IG9wX2RzdCAtIG9wX3NyYyIsMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19icHQ6CisgICAgICBicHQgKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19qcjoKKyAgICAgIGpyIChwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX3NjOgorICAgICAgc2MgKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19qcDoKKyAgICAgIGpwIChwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX3JldDoKKyAgICAgIHJldCAocCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19jYWxsOgorICAgICAgY2FsbCAocCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ190Y2M6CisgICAgY2FzZSBPUENfdGNjYjoKKyAgICAgIGVtaXQgKCJpZihvcF9jYyA9PSA4IHx8IENPTkQoY29udGV4dCxvcF9jYykpIHB1dF93b3JkX3JlZyhjb250ZXh0LHJlZ19kc3QsIDEpO1xuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19sZGE6CisgICAgICBlbWl0ICgidG1wID0gb3BsdmFsX3NyYzsgXG4iKTsKKyAgICAgIC8qKCgob3BsdmFsX3NyYykgJiAweGZmMDAwMCkgPDwgOCkgfCAob3BsdmFsX3NyYyAmIDB4ZmZmZik7IFxuIik7Ki8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX2xkazoKKyAgICBjYXNlIE9QQ19sZDoKKworICAgIGNhc2UgT1BDX2xkYjoKKyAgICBjYXNlIE9QQ19sZGw6CisgICAgICBsZCAocCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19sZGliOgorICAgICAgbGRpIChwLCA4LCAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX2xkaToKKyAgICAgIGxkaSAocCwgMTYsIDEpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9QQ19sZGRiOgorICAgICAgbGRpIChwLCA4LCAtMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19sZGQ6CisgICAgICBsZGkgKHAsIDE2LCAtMSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1BDX3B1c2g6CisgICAgY2FzZSBPUENfcHVzaGw6CisgICAgICBwdXNoIChwKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUENfZGl2OgorICAgIGNhc2UgT1BDX2Rpdmw6CisgICAgICBhZGl2IChwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX211bHQ6CisgICAgY2FzZSBPUENfbXVsdGw6CisgICAgICBtdWx0IChwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX3BvcDoKKyAgICBjYXNlIE9QQ19wb3BsOgorICAgICAgcG9wIChwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX3NldDoKKyAgICAgIGRvc2V0IChwLDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfcmVzOgorICAgICAgZG9zZXQgKHAsMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19iaXQ6CisgICAgICBkb2JpdChwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX3Jlc2ZsZzoKKyAgICAgIGRvZmxhZygwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX3NldGZsZzoKKyAgICAgIGRvZmxhZygxKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisKKyAgICAgIGVtaXQgKCJ0bXAgPSBmYWlsKGNvbnRleHQsJWQpO1xuIiwgcC0+b3Bjb2RlKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogZW1pdCBjb2RlIHRvIHN0b3JlIHJlc3VsdCBpbiBjYWxjdWxhdGVkIGx2YWx1ZSAqLworCit2b2lkCitpbmZvX3N0b3JlIChwKQorICAgICBvcGNvZGVfZW50cnlfdHlwZSAqcDsKK3sKKyAgdW5zaWduZWQgaW50ICppID0gcC0+YXJnX2luZm87CisKKyAgd2hpbGUgKCppKQorICAgIHsKKyAgICAgIGN1cnJlbnRfbmFtZSA9IHJlZ19uICgqaSk7CisgICAgICBjdXJyZW50X3NpemUgPSBzaXplX25hbWUgKHAtPnR5cGUpOworCisgICAgICBpZiAoSVNfRFNUICgqaSkpCisJeworCSAgc3dpdGNoICgqaSAmIENMQVNTX01BU0spCisJICAgIHsKKwkgICAgY2FzZSBDTEFTU19QUjoKKwkgICAgICBlbWl0ICgicHV0XzxwdHJfbW9kZT5fcmVnKGNvbnRleHQscmVnXzxuYW1lPiwgdG1wKTtcbiIpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIENMQVNTX1JFR19MT05HOgorCSAgICBjYXNlIENMQVNTX1JFR19XT1JEOgorCSAgICBjYXNlIENMQVNTX1JFR19CWVRFOgorCisJICAgICAgZW1pdCAoInB1dF88c2l6ZT5fcmVnKGNvbnRleHQscmVnXzxuYW1lPix0bXApO1xuIik7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQ0xBU1NfWDoKKwkgICAgY2FzZSBDTEFTU19JUjoKKwkgICAgY2FzZSBDTEFTU19EQToKKwkgICAgY2FzZSBDTEFTU19CWDoKKwkgICAgY2FzZSBDTEFTU19CQToKKworCSAgICAgIGVtaXQgKCJwdXRfPHNpemU+XzxtZW0+X2RhKGNvbnRleHQsb3BsdmFsXzxuYW1lPiwgdG1wKTtcbiIpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIENMQVNTX0lNTToKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBlbWl0ICgiYWJvcnQoKTsgIik7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCX0KKyAgICAgIGkrKzsKKyAgICB9Cit9CisKK3N0YXRpYwordm9pZAorbWFuZ2xlIChwLCBzaG9ydGN1dCwgdmFsdWUpCisgICAgIG9wY29kZV9lbnRyeV90eXBlICpwOworICAgICBpbnQgc2hvcnRjdXQ7CisgICAgIGludCB2YWx1ZTsKK3sKKyAgaW50IG5vc3RvcmUgPSAwOworICBpbnQgZXh0cmE7CisgIGludCBnZXRkc3QgPSAxOworICBpbnQgYmVmb3JlID0gMDsKKyAgaW50IG5vc3JjID0gMDsKKworICBlbWl0ICgiL1wwNTIgJXMgXDA1Mi9cbiIsIHAtPm5pY2VuYW1lKTsKKyAgaWYgKHNob3J0Y3V0KQorICAgIHsKKyAgICAgIGVtaXQgKCJpbnQgPGZvcD5fJTA0eChjb250ZXh0LHBjKVxuIiwgdmFsdWUpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGVtaXQgKCJpbnQgPGZvcD5fJWQoY29udGV4dCxwYyxpd29yZHMwKVxuIiwgcC0+aWR4KTsKKyAgICAgIGVtaXQgKCJpbnQgaXdvcmRzMDtcbiIpOworICAgIH0KKyAgZW1pdCAoInNpbV9zdGF0ZV90eXBlICpjb250ZXh0O1xuIik7CisgIGVtaXQgKCJpbnQgcGM7XG4iKTsKKyAgZW1pdCAoIntcbiIpOworICBlbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW50IHRtcDtcbiIpOworICBpZiAoc2hvcnRjdXQpCisgICAgeworICAgICAgZW1pdCAoInJlZ2lzdGVyIHVuc2lnbmVkIGludCBpd29yZHMwID0gMHgleDtcbiIsIHZhbHVlKTsKKyAgICB9CisKKyAgLyogd29yayBvdXQgaG93IG11Y2ggYmlnZ2VyIHRoaXMgb3Bjb2RlIGNvdWxkIGJlIGJlY2F1c2UgaXQncyBsYXJnZQorICAgICBtb2RlbCAqLworICBpZiAoQklHKQorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBleHRyYSA9IDA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCXsKKwkgIGlmICgocC0+YXJnX2luZm9baV0gJiBDTEFTU19NQVNLKSA9PSBDTEFTU19EQQorCSAgICAgIHx8IChwLT5hcmdfaW5mb1tpXSAmIENMQVNTX01BU0spID09IENMQVNTX1gpCisJICAgIGV4dHJhICs9IDI7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGV4dHJhID0gMDsKKyAgICB9CisgIHByaW50ZiAoIgkJCS8qIExlbmd0aCAlZCAqLyBcbiIsIHAtPmxlbmd0aCArIGV4dHJhKTsKKyAgc3dpdGNoIChwLT5sZW5ndGggKyBleHRyYSkKKyAgICB7CisgICAgY2FzZSAyOgorICAgICAgZW1pdCAoInBjICs9IDJcbjsiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIGVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbnQgaXdvcmRzMSA9IGdldF93b3JkX21lbV9kYShjb250ZXh0LHBjKzIpO1xuIik7CisgICAgICBlbWl0ICgicGMgKz0gNDtcbiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorCisgICAgICBlbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW50IGl3b3JkczEgPSBnZXRfd29yZF9tZW1fZGEoY29udGV4dCxwYysyKTtcbiIpOworICAgICAgZW1pdCAoInJlZ2lzdGVyIHVuc2lnbmVkIGludCBpd29yZHMyID0gZ2V0X3dvcmRfbWVtX2RhKGNvbnRleHQscGMrNCk7XG4iKTsKKyAgICAgIGVtaXQgKCJwYyArPSA2O1xuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICBlbWl0ICgicmVnaXN0ZXIgdW5zaWduZWQgaW50IGl3b3JkczEgPSBnZXRfd29yZF9tZW1fZGEoY29udGV4dCxwYysyKTtcbiIpOworICAgICAgZW1pdCAoInJlZ2lzdGVyIHVuc2lnbmVkIGludCBpd29yZHMyID0gZ2V0X3dvcmRfbWVtX2RhKGNvbnRleHQscGMrNCk7XG4iKTsKKyAgICAgIGVtaXQgKCJyZWdpc3RlciB1bnNpZ25lZCBpbnQgaXdvcmRzMyA9IGdldF93b3JkX21lbV9kYShjb250ZXh0LHBjKzYpO1xuIik7CisgICAgICBlbWl0ICgicGMgKz0gODtcbiIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworCisgICAgfQorICBlbWl0ICgiY29udGV4dC0+Y3ljbGVzICs9ICVkO1xuIiwgcC0+Y3ljbGVzKTsKKworICBlbWl0ICgie1xuIik7CisgIGluZm9fYXJncyAocCk7CisgIGluZm9fc3BlY2lhbCAocCwgJmdldGRzdCwgJm5vc3RvcmUsICZiZWZvcmUsICZub3NyYyk7CisKKyAgaW5mb19sdmFscyAocCk7CisgIGlmICghbm9zcmMpCisgICAgeworICAgICAgaW5mb19mZXRjaCAocCwgZ2V0ZHN0KTsKKyAgICB9CisKKyAgaWYgKGJlZm9yZSkKKyAgICB7CisgICAgICBpbmZvX2RvY29kZSAocCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW5mb19kb2NvZGUgKHApOworICAgIH0KKyAgaWYgKCFub3N0b3JlKQorICAgIGluZm9fc3RvcmUgKHApOworICBlbWl0ICgifVxuIik7CisgIGVtaXQgKCJyZXR1cm4gcGM7XG4iKTsKKyAgZW1pdCAoIn1cbiIpOworfQorCit2b2lkCitzdGF0aWMKK29uZV9pbnN0cnVjdGlvbiAoaSkKKyAgICAgaW50IGk7Cit7CisgIC8qIGZpbmQgdGhlIHRhYmxlIGVudHJ5ICovCisgIG9wY29kZV9lbnRyeV90eXBlICpwID0gejhrX3RhYmxlICsgaTsKKworICBpZiAoIXApCisgICAgcmV0dXJuOworICBtYW5nbGUgKHAsIDAsIDApOworfQorCit2b2lkCithZGRfdG9fbGlzdCAocHRyLCB2YWx1ZSkKKyAgICAgc3RydWN0IG9wY29kZV92YWx1ZSAqKnB0cjsKKyAgICAgaW50IHZhbHVlOworeworICBzdHJ1Y3Qgb3Bjb2RlX3ZhbHVlICpwcmV2OworCisgIHByZXYgPSAqcHRyOworICAqcHRyID0gKHN0cnVjdCBvcGNvZGVfdmFsdWUgKikgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBvcGNvZGVfdmFsdWUpKTsKKworICAoKnB0ciktPm4gPSB2YWx1ZTsKKyAgKCpwdHIpLT5uZXh0ID0gcHJldjsKK30KKwordm9pZAorYnVpbGRfbGlzdCAoaSkKKyAgICAgaW50IGk7Cit7CisgIG9wY29kZV9lbnRyeV90eXBlICpwID0gbG9va3VwX2luc3QgKGkpOworCisgIGlmICghcCkKKyAgICByZXR1cm47CisgIGFkZF90b19saXN0ICgmbGlzdFtwLT5pZHhdLCBpKTsKK30KKworaW50CittYWluIChhYywgYXYpCisgICAgIGludCBhYzsKKyAgICAgY2hhciAqKmF2OworeworICBpbnQgaTsKKyAgaW50IG5lZWRjb21tYSA9IDA7CisKKyAgbWFrZWxpc3QgPSAwOworCisgIGZvciAoaSA9IDE7IGkgPCBhYzsgaSsrKQorICAgIHsKKyAgICAgIGlmIChzdHJjbXAgKGF2W2ldLCAiLW0iKSA9PSAwKQorCW1ha2VsaXN0ID0gMTsKKyAgICAgIGlmIChzdHJjbXAgKGF2W2ldLCAiLTEiKSA9PSAwKQorCWZpbGUgPSAxOworICAgICAgaWYgKHN0cmNtcCAoYXZbaV0sICItMiIpID09IDApCisJZmlsZSA9IDI7CisgICAgICBpZiAoc3RyY21wIChhdltpXSwgIi0zIikgPT0gMCkKKwlmaWxlID0gMzsKKyAgICAgIGlmIChzdHJjbXAgKGF2W2ldLCAiLWIzIikgPT0gMCkKKwl7CisJICBmaWxlID0gMzsKKwkgIEJJRyA9IDE7CisJfQorCisgICAgfQorICBpZiAobWFrZWxpc3QpCisgICAgeworCisgICAgICBpbnQgaTsKKyAgICAgIG5lZWRjb21tYSA9IDA7CisgICAgICBwcmludGYgKCJzaG9ydCBpbnQgejhrX2ludl9saXN0W10gPSB7XG4iKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IDEgPDwgMTY7IGkrKykKKwl7CisJICBvcGNvZGVfZW50cnlfdHlwZSAqcCA9IGxvb2t1cF9pbnN0IChpKTsKKworCSAgaWYobmVlZGNvbW1hKQorCSAgICBwcmludGYoIiwiKTsKKwkgIGlmICgoaSAmIDB4ZikgPT0gMCkKKwkgICAgcHJpbnRmICgiXG4iKTsKKworI2lmIDAKKwkgIHByaW50ZiAoIlxuCQkvKiUwNHggJXMgKi8iLCBpLCBwID8gcC0+bmljZW5hbWUgOiAiIik7CisjZW5kaWYKKworCSAgaWYgKCFwKQorCSAgICB7CisJICAgICAgcHJpbnRmICgiLTEiKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcHJpbnRmICgiJWQiLCBwLT5pZHgpOworCSAgICB9CisKKwkgIGlmICgoaSAmIDB4M2YpID09IDAgJiYgRElSVFlfSEFDSykKKwkgICAgeworCSAgICAgIHByaW50ZiAoIlxuI2lmZGVmIF9fR05VQ19fXG4iKTsKKwkgICAgICBwcmludGYgKCJ9O1xuIik7CisJICAgICAgcHJpbnRmKCJzaG9ydCBpbnQgaW50X2xpc3QlZFtdID0ge1xuIiwgaSk7CisJICAgICAgcHJpbnRmICgiI2Vsc2VcbiIpOworCSAgICAgIHByaW50ZiAoIixcbiIpOworCSAgICAgIHByaW50ZiAoIiNlbmRpZlxuIik7CisJICAgICAgbmVlZGNvbW1hID0gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICBuZWVkY29tbWEgPSAxOworCisJfQorICAgICAgcHJpbnRmICgifTtcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIEZpcnN0IHdvcmsgb3V0IHdoaWNoIG9wY29kZXMgdXNlIHdoaWNoIGJpdCBwYXR0ZXJucywKKyAgICAgYnVpbGQgYSBsaXN0IG9mIGFsbCBtYXRjaGluZyBiaXQgcGF0dGVucyAqLworICBmb3IgKGkgPSAwOyBpIDwgMSA8PCAxNjsgaSsrKQorICAgIHsKKyAgICAgIGJ1aWxkX2xpc3QgKGkpOworICAgIH0KKyNpZiBEVU1QX0xJU1QKKyAgZm9yIChpID0gMDsgaSA8IE5PUFM7IGkrKykKKyAgICB7CisgICAgICBzdHJ1Y3Qgb3Bjb2RlX3ZhbHVlICpwOworCisgICAgICBwcmludGYgKCIlZCwiLCBpKTsKKyAgICAgIHAgPSBsaXN0W2ldOworICAgICAgd2hpbGUgKHApCisJeworCSAgcHJpbnRmICgiICUwNHgsIiwgcC0+bik7CisJICBwID0gcC0+bmV4dDsKKwl9CisgICAgICBwcmludGYgKCItMVxuIik7CisgICAgfQorCisjZW5kaWYKKworICBpZiAoZmlsZSA9PSAxKQorICAgIHsKKyAgICAgIGV4dGVybiBpbnQgcXVpY2tbXTsKKworICAgICAgLyogRG8gdGhlIHNob3J0Y3V0cyAqLworICAgICAgcHJpbnRmICgiCQkJLyogU0hPUlRDVVRTICovXG4iKTsKKyAgICAgIGZvciAoaSA9IDA7IHF1aWNrW2ldOyBpKyspCisJeworCSAgaW50IHQgPSBxdWlja1tpXTsKKworCSAgbWFuZ2xlICh6OGtfdGFibGUgKyB6OGtfaW52X2xpc3RbdF0sCisJCSAgMSwKKwkJICB0KTsKKwl9CisgICAgfQorICBpZiAoZmlsZSA9PSAzKQorICAgIHsKKyAgICAgIHByaW50ZiAoIgkJCS8qIE5PVCAtU0hPUlRDVVRTICovXG4iKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOT1BTOyBpKyspCisJeworCSAgaWYgKGxpc3RbaV0pCisJICAgIHsKKwkgICAgICBvbmVfaW5zdHJ1Y3Rpb24gKGkpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBlbWl0ICgiaW50IDxmb3A+XyVkKGNvbnRleHQscGMpXG4iLCBpKTsKKwkgICAgICBwcmludGYgKCJzaW1fc3RhdGVfdHlwZSAqY29udGV4dDtcbiIpOworCSAgICAgIHByaW50ZiAoImludCBwYztcbiIpOworCSAgICAgIGVtaXQgKCJ7IDxmb3A+X2JhZDEoKTtyZXR1cm4gcGM7IH1cbiIpOworCSAgICB9CisJfQorICAgICAgZW1pdCAoImludCA8Zm9wPl9iYWQoKSA7XG4iKTsKKworICAgICAgLyogV3JpdGUgdGhlIGp1bXAgdGFibGUgKi8KKyAgICAgIGVtaXQgKCJpbnQgKCooPGZvcD5fdGFibGVbXSkpKCkgPSB7Iik7CisgICAgICBuZWVkY29tbWEgPSAwOworICAgICAgZm9yIChpID0gMDsgaSA8IE5PUFM7IGkrKykKKwl7CisJICBpZiAobmVlZGNvbW1hKQorCSAgICBwcmludGYgKCIsIik7CisJICBlbWl0ICgiPGZvcD5fJWRcbiIsIGkpOworCSAgbmVlZGNvbW1hID0gMTsKKwkgIGlmICgoaSAmIDB4M2YpID09IDAgJiYgRElSVFlfSEFDSykKKwkgICAgeworCSAgICAgIHByaW50ZiAoIiNpZmRlZiBfX0dOVUNfX1xuIik7CisJICAgICAgcHJpbnRmICgifTtcbiIpOworCSAgICAgIGVtaXQgKCJpbnQgKCooPGZvcD5fdGFibGUlZFtdKSkoKSA9IHtcbiIsIGkpOworCSAgICAgIHByaW50ZiAoIiNlbHNlXG4iKTsKKwkgICAgICBwcmludGYgKCIsXG4iKTsKKwkgICAgICBwcmludGYgKCIjZW5kaWZcbiIpOworCSAgICAgIG5lZWRjb21tYSA9IDA7CisJICAgIH0KKwl9CisgICAgICBlbWl0ICgifTtcbiIpOworICAgIH0KKworICBpZiAoZmlsZSA9PSAyKQorICAgIHsKKyAgICAgIGV4dGVybiBpbnQgcXVpY2tbXTsKKyAgICAgIC8qIFN0YXRpYyAtIHNpbmNlIGl0J3MgdG9vIGJlIHRvIGJlIGF1dG9tYXRpYyBvbiB0aGUgYXBvbGxvICovCisgICAgICBzdGF0aWMgaW50IGJpZ1s2NCAqIDEwMjRdOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQgKiAxMDI0OyBpKyspCisJYmlnW2ldID0gMDsKKworICAgICAgZm9yIChpID0gMDsgcXVpY2tbaV07IGkrKykKKwl7CisjaWYgMAorCisJICBwcmludGYgKCJleHRlcm4gaW50IDxmb3A+XyUwNHgoKTtcbiIsIHF1aWNrW2ldKTsKKyNlbmRpZgorCisJICBiaWdbcXVpY2tbaV1dID0gMTsKKwl9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOT1BTOyBpKyspCisJeworI2lmIDAKKwkgIHByaW50ZiAoImV4dGVybiBpbnQgZm9wXyVkKCk7XG4iLCBpKTsKKyNlbmRpZgorCX0KKyNpZiAwCisgICAgICBwcmludGYgKCJleHRlcm4gaW50IGZvcF9iYWQoKTtcbiIpOworI2VuZGlmCisgICAgICBwcmludGYgKCJzdHJ1Y3Qgb3BfaW5mbyBvcF9pbmZvX3RhYmxlW10gPSB7XG4iKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAxIDw8IDE2OyBpKyspCisJeworCSAgaW50IGludiA9IHo4a19pbnZfbGlzdFtpXTsKKwkgIG9wY29kZV9lbnRyeV90eXBlICpwID0gejhrX3RhYmxlICsgaW52OworCisJICBpZiAobmVlZGNvbW1hKQorCSAgICBwcmludGYgKCIsIik7CisjaWYgMAorCSAgaWYgKGJpZ1tpXSkKKwkgICAgeworCSAgICAgIHByaW50ZiAoIjxmb3A+XyUwNHgiLCBpKTsKKwkgICAgfQorCSAgZWxzZQorI2VuZGlmCisJICBpZiAoaW52ID49IDApCisJICAgIHsKKwkgICAgICBwcmludGYgKCIlZCIsIGludik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgcHJpbnRmICgiNDAwIik7CisJICBpZiAoaW52ID49IDApCisJICAgIHsKKwkgICAgICBwcmludGYgKCIJCS8qICUwNHggJXMgKi9cbiIsIGksIHAtPm5pY2VuYW1lKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgcHJpbnRmICgiXG4iKTsKKwkgICAgfQorCSAgbmVlZGNvbW1hID0gMTsKKwkgIGlmICgoaSAmIDB4M2YpID09IDAgJiYgRElSVFlfSEFDSykKKwkgICAgeworCSAgICAgIHByaW50ZiAoIiNpZmRlZiBfX0dOVUNfX1xuIik7CisJICAgICAgcHJpbnRmICgifTsgXG4iKTsKKwkgICAgICBwcmludGYgKCJzdHJ1Y3Qgb3BfaW5mbyBvcF9pbmZvX3RhYmxlJWRbXSA9IHtcbiIsIGkpOworCSAgICAgIHByaW50ZiAoIiNlbHNlXG4iKTsKKwkgICAgICBwcmludGYgKCIsXG4iKTsKKworCSAgICAgIHByaW50ZiAoIiNlbmRpZlxuIik7CisJICAgICAgbmVlZGNvbW1hID0gMDsKKwkgICAgfQorCX0KKyAgICAgIHByaW50ZiAoIn07XG4iKTsKKworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2NoYXIgKgoraW5zbl9wdHIgKG4pCisgICAgIGludCBuOworeworICBpZiAoQklHKQorICAgIHsKKyAgICAgIGFib3J0ICgpOworICAgIH0KKworICBzd2l0Y2ggKG4pCisgICAgeworICAgIGNhc2UgNDoKKyAgICAgIHJldHVybiAiaXdvcmRzXzEiOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gImZhaWwoY29udGV4dCwxMjMpIjsKKyAgICB9Cit9CisKKy8qIHdvcmsgb3V0IGlmIHRoZSBvcGNvZGUgb25seSB3YW50cyBsdmFsdWVzICovCitpbnQKK2x2YWx1ZSAocCkKKyAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKnA7Cit7CisgIHN3aXRjaCAocC0+b3Bjb2RlKQorICAgIHsKKyAgICBjYXNlIE9QQ19sZGE6CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIE9QQ19jYWxsOgorICAgIGNhc2UgT1BDX2pwOgorICAgICAgcmV0dXJuIDE7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICAgIH0KK30KKworaW50CitpbmZvX2xlbl9pbl93b3JkcyAobykKKyAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKm87Cit7CisgIHVuc2lnbmVkICBpbnQgKnAgPSBvLT5ieXRlX2luZm87CisgIGludCBuaWJzID0gMDsKKworICB3aGlsZSAoKnApCisgICAgeworICAgICAgc3dpdGNoICgqcCAmIENMQVNTX01BU0spCisJeworCWNhc2UgQ0xBU1NfQklUOgorCWNhc2UgQ0xBU1NfUkVHTjA6CisJY2FzZSBDTEFTU19SRUc6CisJY2FzZSBDTEFTU18wMUlJOgorCWNhc2UgQ0xBU1NfMDBJSToKKwkgIG5pYnMrKzsKKwkgIGJyZWFrOworCWNhc2UgQ0xBU1NfQUREUkVTUzoKKwkgIG5pYnMgKz0gU0laRV9BRERSRVNTOworCSAgYnJlYWs7CisJY2FzZSBDTEFTU19JTU06CisJICBzd2l0Y2ggKCpwICYgfkNMQVNTX01BU0spCisJICAgIHsKKwkgICAgY2FzZSBBUkdfSU1NMTY6CisJICAgICAgbmlicyArPSA0OworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFSR19JTU0zMjoKKwkgICAgICBuaWJzICs9IDg7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQVJHX0lNTTI6CisJICAgIGNhc2UgQVJHX0lNTTQ6CisJICAgIGNhc2UgQVJHX0lNTTRNMToKKwkgICAgY2FzZSBBUkdfSU1NXzE6CisJICAgIGNhc2UgQVJHX0lNTV8yOgorCSAgICBjYXNlIEFSR19JTU1OTUlOVVMxOgorCSAgICAgIG5pYnMrKzsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBBUkdfTklNODoKKworCSAgICBjYXNlIEFSR19JTU04OgorCSAgICAgIG5pYnMgKz0gMjsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBDTEFTU19ESVNQOgorCSAgc3dpdGNoICgqcCAmIH5DTEFTU19NQVNLKQorCSAgICB7CisJICAgIGNhc2UgQVJHX0RJU1AxNjoKKwkgICAgICBuaWJzICs9IDQ7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQVJHX0RJU1AxMjoKKwkgICAgICBuaWJzICs9IDM7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQVJHX0RJU1A4OgorCSAgICAgIG5pYnMgKz0gMjsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBDTEFTU18wRElTUDc6CisJY2FzZSBDTEFTU18xRElTUDc6CisJY2FzZSBDTEFTU19ESVNQODoKKwkgIG5pYnMgKz0gMjsKKwkgIGJyZWFrOworCWNhc2UgQ0xBU1NfQklUXzFPUjI6CisJY2FzZSBDTEFTU18wQ0NDOgorCWNhc2UgQ0xBU1NfMUNDQzoKKwljYXNlIENMQVNTX0NDOgorCSAgbmlicysrOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGVtaXQgKCJkb24ndCBrbm93ICV4XG4iLCAqcCk7CisJfQorICAgICAgcCsrOworICAgIH0KKworICByZXR1cm4gbmlicyAvIDQ7CQkvKiByZXR1cm4gdW1iZXIgb2Ygd29yZHMgKi8KK30K